ZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oCmluZGV4IGU0Y2Y3NzcuLjk2MGU5NDMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaApAQCAtMTIzMCw4ICsxMjMwLDkgQEAKIAogICAgIEZYX0JPT0wJCQkJCUNsZWFyU2VsZWN0ZWRPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAorICAgIEZYX0JPT0wJCQkJCUNsZWFyT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQogCi0KKyAgICBpbnQJCQkJCQlJbnNlcnRPcHRpb24oQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCwgaW50IGluZGV4ID0gLTEsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCiAKICAgICBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpCiAgICAgewpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgKaW5kZXggZGE4YjMwOS4uYjBlZWNjMyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiZnhfY29kZWNfcHJvdmlkZXIuaCIKIGNsYXNzIENGWF9ESUJTb3VyY2U7CiBjbGFzcyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyOworY2xhc3MgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcjsNCiBjbGFzcyBJQ29kZWNfQmFzaWNNb2R1bGU7CiBjbGFzcyBJQ29kZWNfRmF4TW9kdWxlOwogY2xhc3MgSUNvZGVjX0pwZWdNb2R1bGU7CkBAIC0yMSw2ICsyMiwxMSBAQAogY2xhc3MgSUNvZGVjX0ljY01vZHVsZTsKIGNsYXNzIElDb2RlY19GbGF0ZU1vZHVsZTsKIGNsYXNzIElDb2RlY19KYmlnMkVuY29kZXI7CitjbGFzcyBJQ29kZWNfUG5nTW9kdWxlOw0KK2NsYXNzIElDb2RlY19HaWZNb2R1bGU7DQorY2xhc3MgSUNvZGVjX0JtcE1vZHVsZTsNCitjbGFzcyBJQ29kZWNfVGlmZk1vZHVsZTsNCitjbGFzcyBDRlhfRElCQXR0cmlidXRlOw0KIGNsYXNzIElDb2RlY19TY2FubGluZURlY29kZXI7CiBjbGFzcyBDQ29kZWNfTW9kdWxlTWdyIDogcHVibGljIENGWF9PYmplY3QKIHsKQEAgLTM3LDYgKzQzLDkgQEAKIAogICAgIHZvaWQJCQkJSW5pdEljY0RlY29kZXIoKTsKIAorDQorICAgIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqCUNyZWF0ZVByb2dyZXNzaXZlRGVjb2RlcigpOw0KKw0KICAgICBJQ29kZWNfSmJpZzJFbmNvZGVyKgkJQ3JlYXRlSmJpZzJFbmNvZGVyKCk7CiBwcm90ZWN0ZWQ6CiAgICAgQ0NvZGVjX01vZHVsZU1ncigpOwpAQCAtNzAsNiArNzksMjIgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX3BGbGF0ZU1vZHVsZTsKICAgICB9CisgICAgSUNvZGVjX1BuZ01vZHVsZSoJR2V0UG5nTW9kdWxlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFBuZ01vZHVsZTsNCisgICAgfQ0KKyAgICBJQ29kZWNfR2lmTW9kdWxlKglHZXRHaWZNb2R1bGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wR2lmTW9kdWxlOw0KKyAgICB9DQorICAgIElDb2RlY19CbXBNb2R1bGUqCUdldEJtcE1vZHVsZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BCbXBNb2R1bGU7DQorICAgIH0NCisgICAgSUNvZGVjX1RpZmZNb2R1bGUqCUdldFRpZmZNb2R1bGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wVGlmZk1vZHVsZTsNCisgICAgfQ0KIHByb3RlY3RlZDoKICAgICBJQ29kZWNfQmFzaWNNb2R1bGUqCW1fcEJhc2ljTW9kdWxlOwogICAgIElDb2RlY19GYXhNb2R1bGUqCW1fcEZheE1vZHVsZTsKQEAgLTc4LDYgKzEwMywxMCBAQAogICAgIElDb2RlY19KYmlnMk1vZHVsZSoJbV9wSmJpZzJNb2R1bGU7CiAgICAgSUNvZGVjX0ljY01vZHVsZSoJbV9wSWNjTW9kdWxlOwogICAgIElDb2RlY19GbGF0ZU1vZHVsZSoJbV9wRmxhdGVNb2R1bGU7CisgICAgSUNvZGVjX1BuZ01vZHVsZSoJbV9wUG5nTW9kdWxlOw0KKyAgICBJQ29kZWNfR2lmTW9kdWxlKgltX3BHaWZNb2R1bGU7DQorICAgIElDb2RlY19CbXBNb2R1bGUqCW1fcEJtcE1vZHVsZTsNCisgICAgSUNvZGVjX1RpZmZNb2R1bGUqCW1fcFRpZmZNb2R1bGU7DQogCiB9OwogY2xhc3MgSUNvZGVjX0Jhc2ljTW9kdWxlIDogcHVibGljIENGWF9PYmplY3QKQEAgLTE3MCw3ICsxOTksNyBAQAogCiAgICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpID0gMDsKKyAgICB2aXJ0dWFsIGludAkJCVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIG5Db21wcywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsNCiAKIAogICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpID0gMDsKQEAgLTE5Nyw2ICsyMjYsOTcgQEAKIAogICAgIHZpcnR1YWwgdm9pZAkJRGVzdHJveURlY29kZXIoRlhfTFBWT0lEIGN0eCkgPSAwOwogfTsKK2NsYXNzIElDb2RlY19QbmdNb2R1bGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorDQorICAgIHZpcnR1YWwgfklDb2RlY19QbmdNb2R1bGUoKSB7fQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCh2b2lkKiBwTW9kdWxlKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5wdXQodm9pZCogcENvbnRleHQsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7DQorDQorICAgIEZYX0JPT0wJCQkJKCpSZWFkSGVhZGVyQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwYywgaW50IHBhc3MsIGludCogY29sb3JfdHlwZSwgZG91YmxlKiBnYW1tYSk7DQorDQorICAgIEZYX0JPT0wJCQkJKCpBc2tTY2FubGluZUJ1ZkNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLCBpbnQgbGluZSwgRlhfTFBCWVRFJiBzcmNfYnVmKTsNCisNCisgICAgdm9pZAkJCQkoKkZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZENhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLCBpbnQgcGFzcywgaW50IGxpbmUpOw0KK307DQorY2xhc3MgSUNvZGVjX0dpZk1vZHVsZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisNCisgICAgdmlydHVhbCB+SUNvZGVjX0dpZk1vZHVsZSgpIHt9DQorDQorICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KHZvaWQqIHBNb2R1bGUpID0gMDsNCisNCisgICAgdmlydHVhbCB2b2lkCQlGaW5pc2godm9pZCogcENvbnRleHQpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUEJZVEUqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMglSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFsX251bSwgdm9pZCoqIHBhbF9wcCwgaW50KiBiZ19pbmRleCwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMglMb2FkRnJhbWVJbmZvKHZvaWQqIHBDb250ZXh0LCBpbnQqIGZyYW1lX251bSkgPSAwOw0KKw0KKyAgICB2b2lkCQkJCSgqUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEJiBjdXJfcG9zKTsNCisNCisgICAgRlhfTFBCWVRFCQkJKCpBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfSU5UMzIgZnJhbWVfbnVtLCBGWF9JTlQzMiBwYWxfc2l6ZSk7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJTG9hZEZyYW1lKHZvaWQqIHBDb250ZXh0LCBpbnQgZnJhbWVfbnVtLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCkgPSAwOw0KKw0KKyAgICBGWF9CT09MCQkJCSgqSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLCBGWF9EV09SRCByY2RfcG9zLCBjb25zdCBGWF9SRUNUJiBpbWdfcmMsDQorICAgICAgICAgICAgRlhfSU5UMzIgcGFsX251bSwgdm9pZCogcGFsX3B0ciwNCisgICAgICAgICAgICBGWF9JTlQzMiBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQorICAgICAgICAgICAgRlhfSU5UMzIgdHJhbnNfaW5kZXgsIEZYX0lOVDMyIGRpc3Bvc2FsX21ldGhvZCwgRlhfQk9PTCBpbnRlcmxhY2UpOw0KKw0KKyAgICB2b2lkCQkJCSgqUmVhZFNjYW5saW5lQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIEZYX0lOVDMyIHJvd19udW0sIEZYX0xQQllURSByb3dfYnVmKTsNCit9Ow0KK2NsYXNzIElDb2RlY19CbXBNb2R1bGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorDQorICAgIHZpcnR1YWwgfklDb2RlY19CbXBNb2R1bGUoKSB7fQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCh2b2lkKiBwTW9kdWxlKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgRlhfSU5UMzIqIHdpZHRoLCBGWF9JTlQzMiogaGVpZ2h0LCBGWF9CT09MKiB0Yl9mbGFnLCBGWF9JTlQzMiogY29tcG9uZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFsX251bSwgRlhfRFdPUkQqKiBwYWxfcHAsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJTG9hZEltYWdlKHZvaWQqIHBDb250ZXh0KSA9IDA7DQorDQorICAgIEZYX0JPT0wJCQkJKCpJbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQgcmNkX3Bvcyk7DQorDQorICAgIHZvaWQJCQkJKCpSZWFkU2NhbmxpbmVDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfSU5UMzIgcm93X251bSwgRlhfTFBCWVRFIHJvd19idWYpOw0KK307DQorY2xhc3MgSUNvZGVjX1RpZmZNb2R1bGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorDQorICAgIHZpcnR1YWwgfklDb2RlY19UaWZmTW9kdWxlKCkge30NCisNCisgICAgdmlydHVhbCBGWF9MUFZPSUQgCUNyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgPSAwOw0KKw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEZyYW1lcyhGWF9MUFZPSUQgY3R4LCBGWF9JTlQzMiYgZnJhbWVzKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJTG9hZEZyYW1lSW5mbyhGWF9MUFZPSUQgY3R4LCBGWF9JTlQzMiBmcmFtZSwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgY29tcHMsIEZYX0RXT1JEJiBicGMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7DQorDQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjb2RlKEZYX0xQVk9JRCBjdHgsIGNsYXNzIENGWF9ESUJpdG1hcCogcERJQml0bWFwKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJRGVzdHJveURlY29kZXIoRlhfTFBWT0lEIGN0eCkgPSAwOw0KK307DQogY2xhc3MgSUNvZGVjX0piaWcyTW9kdWxlIDogcHVibGljIENGWF9PYmplY3QKIHsKIHB1YmxpYzoKQEAgLTIxOCw2ICszMzgsMzQgQEAKICAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlDb250aW51ZURlY29kZSh2b2lkKiBwSmJpZzJDb250ZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZAkJCQlEZXN0cm95SmJpZzJDb250ZXh0KHZvaWQqIHBKYmlnMkNvbnRlbnQpID0gMDsKIH07CitjbGFzcyBJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKw0KKyAgICB2aXJ0dWFsIH5JQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCkge30NCisNCisgICAgdmlydHVhbCBGWENPREVDX1NUQVRVUwkJTG9hZEltYWdlSW5mbyhJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlID0gRlhDT0RFQ19JTUFHRV9VTktOT1dOLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYQ09ERUNfSU1BR0VfVFlQRQlHZXRUeXBlKCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0V2lkdGgoKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRIZWlnaHQoKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXROdW1Db21wb25lbnRzKCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0QlBDKCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Q2xpcEJveChGWF9SRUNUKiBjbGlwKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCUdldEZyYW1lcyhGWF9JTlQzMiYgZnJhbWVzLCBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisNCisgICAgdmlydHVhbCBGWENPREVDX1NUQVRVUwkJU3RhcnREZWNvZGUoY2xhc3MgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBzdGFydF94LCBGWF9JTlQzMiBzdGFydF95LCBGWF9JTlQzMiBzaXplX3gsIEZYX0lOVDMyIHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGZyYW1lcyA9IDAsIEZYX0JPT0wgYkludGVycG9sID0gVFJVRSkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlDb250aW51ZURlY29kZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCit9Ow0KIGNsYXNzIElDb2RlY19KYmlnMkVuY29kZXIgOiBwdWJsaWMgQ0ZYX09iamVjdAogewogcHVibGljOgpAQCAtMjg2LDQgKzQzNCwzOCBAQAogdm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKTsKIHZvaWQgQWRvYmVDTVlLX3RvX3NSR0IxKEZYX0JZVEUgYywgRlhfQllURSBtLCBGWF9CWVRFIHksIEZYX0JZVEUgaywgRlhfQllURSYgUiwgRlhfQllURSYgRywgRlhfQllURSYgQik7CiBGWF9CT09MIE1ENUNvbXB1dGVJRChGWF9MUENWT0lEIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCBGWF9CWVRFIElEWzE2XSk7CitjbGFzcyBDRlhfRElCQXR0cmlidXRlIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfRElCQXR0cmlidXRlKCk7DQorICAgIH5DRlhfRElCQXR0cmlidXRlKCk7DQorDQorICAgIEZYX0lOVDMyCQltX25YRFBJOw0KKw0KKyAgICBGWF9JTlQzMgkJbV9uWURQSTsNCisNCisgICAgRlhfRkxPQVQJCW1fZkFzcGVjdFJhdGlvOw0KKw0KKyAgICBGWF9XT1JECQkJbV93RFBJVW5pdDsNCisNCisgICAgQ0ZYX0J5dGVTdHJpbmcJbV9zdHJBdXRob3I7DQorDQorICAgIEZYX0JZVEUJCQltX3N0clRpbWVbMjBdOw0KKw0KKyAgICBGWF9JTlQzMgkJbV9uR2lmTGVmdDsNCisgICAgRlhfSU5UMzIJCW1fbkdpZlRvcDsNCisNCisgICAgRlhfRFdPUkQqCQltX3BHaWZMb2NhbFBhbGV0dGU7DQorDQorICAgIEZYX0RXT1JECQltX25HaWZMb2NhbFBhbE51bTsNCisNCisgICAgRlhfSU5UMzIJCW1fbkJtcENvbXByZXNzVHlwZTsNCisgICAgY2xhc3MgSUZYX0RJQkF0dHJpYnV0ZUV4aWYqIG1fcEV4aWY7DQorfTsNCitjbGFzcyBJRlhfRElCQXR0cmlidXRlRXhpZiA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB+SUZYX0RJQkF0dHJpYnV0ZUV4aWYoKSB7fTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRJbmZvKEZYX1dPUkQgdGFnLCBGWF9MUFZPSUQgdmFsKSA9IDA7DQorfTsNCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKaW5kZXggMGQwOGRhNi4uN2ExOGY1YiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKQEAgLTYsNiArNiwxNSBAQAogCiAjaWZuZGVmIF9GWF9DT0RFQ19ERUZfSF8KICNkZWZpbmUgX0ZYX0NPREVDX0RFRl9IXworZW51bSBGWENPREVDX0lNQUdFX1RZUEUgeworICAgIEZYQ09ERUNfSU1BR0VfVU5LTk9XTiA9IDAsCisgICAgRlhDT0RFQ19JTUFHRV9CTVAsCisgICAgRlhDT0RFQ19JTUFHRV9KUEcsCisgICAgRlhDT0RFQ19JTUFHRV9QTkcsCisgICAgRlhDT0RFQ19JTUFHRV9HSUYsCisgICAgRlhDT0RFQ19JTUFHRV9USUYsCisgICAgRlhDT0RFQ19JTUFHRV9NQVgKK307CiBlbnVtIEZYQ09ERUNfU1RBVFVTIHsKICAgICBGWENPREVDX1NUQVRVU19FUlJPUiA9IC0xLAogICAgIEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZLApAQCAtNTgsNiArNjcsMTIgQEAKICNkZWZpbmUgSWNjX1BBUkFNVFlQRV9OT05FCQkJCQkwCiAjZGVmaW5lIEljY19QQVJBTVRZUEVfQlVGRkVSCQkJCTEKICNkZWZpbmUgSWNjX1BBUkFNVFlQRV9QQVJBTQkJCQkJMgorZW51bSBGWENPREVDX1JFU1VOSVQgeworICAgIEZYQ09ERUNfUkVTVU5JVF9OT05FID0gMCwKKyAgICBGWENPREVDX1JFU1VOSVRfSU5DSCwKKyAgICBGWENPREVDX1JFU1VOSVRfQ0VOVElNRVRFUiwKKyAgICBGWENPREVDX1JFU1VOSVRfTUVURVIKK307CiAjZGVmaW5lIEVYSUZUQUdfVVNIT1JUX1JFU1VOSVQJCQkJMjk2CiAjZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWAkJCQkJMjgyCiAjZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWQkJCQkJMjgzCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaAppbmRleCBhM2VmMzk2Li5mMjYxOTRhIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgKQEAgLTYsNiArNiw3IEBACiAKICNpZm5kZWYgX0ZYX0NPREVDX1BST1ZJREVSX0hfCiAjZGVmaW5lIF9GWF9DT0RFQ19QUk9WSURFUl9IXworY2xhc3MgQ0ZYX0RJQkF0dHJpYnV0ZTsKIGNsYXNzIElGWF9KcGVnUHJvdmlkZXIKIHsKIHB1YmxpYzoKQEAgLTM5LDggKzQwLDcgQEAKIAogICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogbkNvbXBzKSA9IDA7Ci0KKyAgICB2aXJ0dWFsIGludAkJCVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIG5Db21wcywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsKIAogICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpID0gMDsKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oCmluZGV4IDQ5NTBmODEuLmVkMDM3MGYgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgKQEAgLTYsNiArNiw1NCBAQAogCiAjaWZuZGVmIF9GWF9BUkFCSUNfCiAjZGVmaW5lIF9GWF9BUkFCSUNfCitjbGFzcyBJRlhfQXJhYmljQ2hhcjsKK2NsYXNzIElGWF9CaWRpQ2hhcjsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBfRlhfQVJCRk9STVRBQkxFIHsKKyAgICBGWF9XQ0hBUgl3SXNvbGF0ZWQ7CisgICAgRlhfV0NIQVIJd0ZpbmFsOworICAgIEZYX1dDSEFSCXdJbml0aWFsOworICAgIEZYX1dDSEFSCXdNZWRpYWw7Cit9IEZYX0FSQkZPUk1UQUJMRSwgKiBGWF9MUEFSQkZPUk1UQUJMRTsKK3R5cGVkZWYgRlhfQVJCRk9STVRBQkxFIGNvbnN0ICogRlhfTFBDQVJCRk9STVRBQkxFOwordHlwZWRlZiBzdHJ1Y3QgX0ZYX0FSQUFMRUYgeworICAgIEZYX1dDSEFSCXdBbGVmOworICAgIEZYX1dDSEFSCXdJc29sYXRlZDsKK30gRlhfQVJBQUxFRiwgKiBGWF9MUEFSQUFMRUY7Cit0eXBlZGVmIEZYX0FSQUFMRUYgY29uc3QgKiBGWF9MUENBUkFBTEVGOwordHlwZWRlZiBzdHJ1Y3QgX0ZYX0FSQVNIQUREQSB7CisgICAgRlhfV0NIQVIJd1NoYWRkYTsKKyAgICBGWF9XQ0hBUgl3SXNvbGF0ZWQ7Cit9IEZYX0FSQVNIQUREQSwgKiBGWF9MUEFSQVNIQUREQTsKK3R5cGVkZWYgRlhfQVJBU0hBRERBIGNvbnN0ICogRlhfTFBDQVJBU0hBRERBOworRlhfTFBDQVJCRk9STVRBQkxFIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKTsKK0ZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUoRlhfV0NIQVIgYWxlZik7CitGWF9XQ0hBUiBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUoRlhfV0NIQVIgc2hhZGRhKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorZW51bSBGWF9BUkJQT1NJVElPTiB7CisgICAgRlhfQVJCUE9TSVRJT05fSXNvbGF0ZWQgPSAwLAorICAgIEZYX0FSQlBPU0lUSU9OX0ZpbmFsLAorICAgIEZYX0FSQlBPU0lUSU9OX0luaXRpYWwsCisgICAgRlhfQVJCUE9TSVRJT05fTWVkaWFsLAorfTsKK2NsYXNzIElGWF9BcmFiaWNDaGFyCit7CitwdWJsaWM6CisgICAgc3RhdGljIElGWF9BcmFiaWNDaGFyKgkJQ3JlYXRlKCk7CisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7CisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIEZYX1dDSEFSCQkJR2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLCBGWF9XQ0hBUiBwcmV2ID0gMCwgRlhfV0NIQVIgbmV4dCA9IDApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIEZYX1dDSEFSCQkJR2V0Rm9ybUNoYXIoY29uc3QgQ0ZYX0NoYXIgKmN1ciwgY29uc3QgQ0ZYX0NoYXIgKnByZXYsIGNvbnN0IENGWF9DaGFyICpuZXh0KSBjb25zdCA9IDA7Cit9Owordm9pZCBGWF9CaWRpTGluZShDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBpQmFzZUxldmVsID0gMCk7Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9UeHRDaGFyQXJyYXkgJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwgPSAwKTsKK3ZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1JURkNoYXJBcnJheSAmY2hhcnMsIEZYX0lOVDMyIGlDb3VudCwgRlhfSU5UMzIgaUJhc2VMZXZlbCA9IDApOwogY2xhc3MgSUZYX0JpZGlDaGFyCiB7CiBwdWJsaWM6CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCmluZGV4IDIyYmE2MTEuLjBjODRmNTQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCkBAIC0xNTc4LDYgKzE1NzgsMTMgQEAKIH0gRlhfUHJvZ3Jlc3NpdmVTdGF0dXM7CiAjZGVmaW5lIFByb2dyZXNzaXZlU3RhdHVzCUZYX1Byb2dyZXNzaXZlU3RhdHVzCiAjZGVmaW5lIEZYX05BTUVTUEFDRV9ERUNMQVJFKG5hbWVzcGFjZSwgdHlwZSkgICAgICAgbmFtZXNwYWNlOjp0eXBlCitjbGFzcyBJRlhfVW5rbm93bgoreworcHVibGljOgorICAgIHZpcnR1YWwgRlhfRFdPUkQJUmVsZWFzZSgpID0gMDsKKyAgICB2aXJ0dWFsIEZYX0RXT1JECUFkZFJlZigpID0gMDsKK307CisjZGVmaW5lIEZYX0lzT2RkKGEpCSgoYSkgJiAxKQogCiBjbGFzcyBDRlhfVmVjdG9yXzNieTEgOiBwdWJsaWMgQ0ZYX09iamVjdAogewpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oCmluZGV4IDAzZWM0ODguLmNlYmEwMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgKQEAgLTc2LDYgKzc2LDI0IEBACiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBGWF9HVUlEIHsKKyAgICBGWF9EV09SRAlkYXRhMTsKKyAgICBGWF9XT1JECQlkYXRhMjsKKyAgICBGWF9XT1JECQlkYXRhMzsKKyAgICBGWF9CWVRFCQlkYXRhNFs4XTsKK30gRlhfR1VJRCwgKiBGWF9MUEdVSUQ7Cit0eXBlZGVmIEZYX0dVSUQgY29uc3QgKiBGWF9MUENHVUlEOworCit2b2lkCUZYX0dVSURfQ3JlYXRlVjQoRlhfTFBHVUlEIHBHVUlEKTsKKwordm9pZAlGWF9HVUlEX1RvU3RyaW5nKEZYX0xQQ0dVSUQgcEdVSUQsIENGWF9CeXRlU3RyaW5nICZic1N0ciwgRlhfQk9PTCBiU2VwYXJhdG9yID0gVFJVRSk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgogdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+CiBjbGFzcyBDRlhfU1NvcnRUZW1wbGF0ZQogewpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oCmluZGV4IDhlMjk4ZjcuLjBhM2QxYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgKQEAgLTE2Miw2ICsxNjIsMTUgQEAKIH07CiBJRlhfRmlsZVN0cmVhbSoJCUZYX0NyZWF0ZUZpbGVTdHJlYW0oRlhfTFBDU1RSIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKTsKIElGWF9GaWxlU3RyZWFtKgkJRlhfQ3JlYXRlRmlsZVN0cmVhbShGWF9MUENXU1RSIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKTsKK2NsYXNzIElGWF9GaWxlQWNjZXNzCit7CitwdWJsaWM6CisJdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7CQorCXZpcnR1YWwgSUZYX0ZpbGVBY2Nlc3MqCQlSZXRhaW4oKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCUdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgPSAwOworCXZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qCQlDcmVhdGVGaWxlU3RyZWFtKEZYX0RXT1JEIGR3TW9kZXMpID0gMDsKK307CitJRlhfRmlsZUFjY2VzcyogRlhfQ3JlYXRlRGVmYXVsdEZpbGVBY2Nlc3MoRlhfV1NUUiB3c1BhdGgpOwogY2xhc3MgSUZYX01lbW9yeVN0cmVhbSA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQogewogcHVibGljOgpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oCmluZGV4IDllMTg2MmEuLmM4N2U0NTkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgKQEAgLTg4LDYgKzg4LDIwIEBACiAgICAgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybQkJCT0gKDExIDw8IEZYX0NIQVJUWVBFQklUUyksCiAgICAgRlhfQ0hBUlRZUEVfQXJhYmljCQkJCT0gKDEyIDw8IEZYX0NIQVJUWVBFQklUUyksCiB9OwordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NIQVJQUk9QRVJUSUVTIHsNCisgICAgdW5pb24gRlhfQ0hBUlBST1BFUlRJRVNfVU5JT057DQorICAgICAgICBzdHJ1Y3QgRlhfQ0hBUlBST1BFUlRJRVNfQklUew0KKyAgICAgICAgICAgIEZYX0RXT1JECWR3QnJlYWtUeXBlCQk6IDY7DQorICAgICAgICAgICAgRlhfRFdPUkQJZHdCaWRpQ2xhc3MJCTogNTsNCisgICAgICAgICAgICBGWF9EV09SRAlkd0NoYXJUeXBlCQk6IDQ7DQorICAgICAgICAgICAgRlhfRFdPUkQJZHdSb3RhdGlvbgkJOiAxOw0KKyAgICAgICAgICAgIEZYX0RXT1JECWR3Q0pLU3BlY2lhbAk6IDE7DQorICAgICAgICAgICAgRlhfRFdPUkQJZHdWZXJ0SW5kZXgJCTogNjsNCisgICAgICAgICAgICBGWF9EV09SRAlkd0JpZGlJbmRleAkJOiA5Ow0KKyAgICAgICAgfTsNCisgICAgICAgIEZYX0RXT1JECWR3Q2hhclByb3BzOw0KKyAgICB9Ow0KK30gRlhfQ0hBUlBST1BFUlRJRVM7DQogRlhfRFdPUkQgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMoRlhfV0NIQVIgd2NoKTsKIEZYX0JPT0wJRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCk7CiBGWF9CT09MCUZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKTsKQEAgLTk1LDQgKzEwOSw4OSBAQAogRlhfQk9PTAlGWF9Jc0JpZGlDaGFyKEZYX1dDSEFSIHdjaCk7CiBGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCk7CiBGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfRFdPUkQgZHdQcm9wcywgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCk7CitjbGFzcyBDRlhfQ2hhciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0NoYXIoKSA6IG1fd0NoYXJDb2RlKDApDQorICAgICAgICAsIG1fbkJyZWFrVHlwZSgwKQ0KKyAgICAgICAgLCBtX25Sb3RhdGlvbigwKQ0KKyAgICAgICAgLCBtX2R3Q2hhclByb3BzKDApDQorICAgICAgICAsIG1fZHdDaGFyU3R5bGVzKDApDQorICAgICAgICAsIG1faUNoYXJXaWR0aCgwKQ0KKyAgICAgICAgLCBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKQ0KKyAgICAgICAgLCBtX2lWZXJ0aWFsU2NhbGUoMTAwKQ0KKyAgICB7DQorICAgIH0NCisgICAgQ0ZYX0NoYXIoRlhfV09SRCB3Q2hhckNvZGUsIEZYX0RXT1JEIGR3Q2hhclByb3BzKQ0KKyAgICAgICAgOiBtX3dDaGFyQ29kZSh3Q2hhckNvZGUpDQorICAgICAgICAsIG1fbkJyZWFrVHlwZSgwKQ0KKyAgICAgICAgLCBtX25Sb3RhdGlvbigwKQ0KKyAgICAgICAgLCBtX2R3Q2hhclByb3BzKGR3Q2hhclByb3BzKQ0KKyAgICAgICAgLCBtX2R3Q2hhclN0eWxlcygwKQ0KKyAgICAgICAgLCBtX2lDaGFyV2lkdGgoMCkNCisgICAgICAgICwgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCkNCisgICAgICAgICwgbV9pVmVydGlhbFNjYWxlKDEwMCkNCisgICAgew0KKyAgICB9DQorICAgIEZYX0RXT1JECUdldENoYXJUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZHdDaGFyUHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLOw0KKyAgICB9DQorICAgIEZYX1dPUkQJCW1fd0NoYXJDb2RlOw0KKyAgICBGWF9CWVRFCQltX25CcmVha1R5cGU7DQorICAgIEZYX0lOVDgJCW1fblJvdGF0aW9uOw0KKyAgICBGWF9EV09SRAltX2R3Q2hhclByb3BzOw0KKyAgICBGWF9EV09SRAltX2R3Q2hhclN0eWxlczsNCisgICAgRlhfSU5UMzIJbV9pQ2hhcldpZHRoOw0KKyAgICBGWF9JTlQzMgltX2lIb3Jpem9udGFsU2NhbGU7DQorICAgIEZYX0lOVDMyCW1faVZlcnRpYWxTY2FsZTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0NoYXI+CUNGWF9DaGFyQXJyYXk7DQorY2xhc3MgQ0ZYX1R4dENoYXIgOiBwdWJsaWMgQ0ZYX0NoYXINCit7DQorcHVibGljOg0KKyAgICBDRlhfVHh0Q2hhcigpIDogQ0ZYX0NoYXIoKQ0KKyAgICAgICAgLCBtX2R3U3RhdHVzKDApDQorICAgICAgICAsIG1faUJpZGlDbGFzcygwKQ0KKyAgICAgICAgLCBtX2lCaWRpTGV2ZWwoMCkNCisgICAgICAgICwgbV9pQmlkaVBvcygwKQ0KKyAgICAgICAgLCBtX2lCaWRpT3JkZXIoMCkNCisgICAgICAgICwgbV9wVXNlckRhdGEoTlVMTCkNCisgICAgew0KKyAgICB9DQorICAgIEZYX0RXT1JECQkJbV9kd1N0YXR1czsNCisgICAgRlhfSU5UMTYJCQltX2lCaWRpQ2xhc3M7DQorICAgIEZYX0lOVDE2CQkJbV9pQmlkaUxldmVsOw0KKyAgICBGWF9JTlQxNgkJCW1faUJpZGlQb3M7DQorICAgIEZYX0lOVDE2CQkJbV9pQmlkaU9yZGVyOw0KKyAgICBGWF9MUFZPSUQJCQltX3BVc2VyRGF0YTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1R4dENoYXI+CUNGWF9UeHRDaGFyQXJyYXk7DQorY2xhc3MgQ0ZYX1JURkNoYXIgOiBwdWJsaWMgQ0ZYX0NoYXINCit7DQorcHVibGljOg0KKyAgICBDRlhfUlRGQ2hhcigpIDogQ0ZYX0NoYXIoKQ0KKyAgICAgICAgLCBtX2R3U3RhdHVzKDApDQorICAgICAgICAsIG1faUZvbnRTaXplKDApDQorICAgICAgICAsIG1faUZvbnRIZWlnaHQoMCkNCisgICAgICAgICwgbV9pQmlkaUNsYXNzKDApDQorICAgICAgICAsIG1faUJpZGlMZXZlbCgwKQ0KKyAgICAgICAgLCBtX2lCaWRpUG9zKDApDQorICAgICAgICAsIG1fZHdMYXlvdXRTdHlsZXMoMCkNCisgICAgICAgICwgbV9kd0lkZW50aXR5KDApDQorICAgICAgICAsIG1fcFVzZXJEYXRhKE5VTEwpDQorICAgIHsNCisgICAgfQ0KKyAgICBGWF9EV09SRAkJCW1fZHdTdGF0dXM7DQorICAgIEZYX0lOVDMyCQkJbV9pRm9udFNpemU7DQorICAgIEZYX0lOVDMyCQkJbV9pRm9udEhlaWdodDsNCisgICAgRlhfSU5UMTYJCQltX2lCaWRpQ2xhc3M7DQorICAgIEZYX0lOVDE2CQkJbV9pQmlkaUxldmVsOw0KKyAgICBGWF9JTlQxNgkJCW1faUJpZGlQb3M7DQorICAgIEZYX0lOVDE2CQkJbV9pQmlkaU9yZGVyOw0KKyAgICBGWF9EV09SRAkJCW1fZHdMYXlvdXRTdHlsZXM7DQorICAgIEZYX0RXT1JECQkJbV9kd0lkZW50aXR5Ow0KKyAgICBJRlhfVW5rbm93bgkJCSptX3BVc2VyRGF0YTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1JURkNoYXI+CUNGWF9SVEZDaGFyQXJyYXk7DQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKaW5kZXggNTJmOGYzMC4uODc0NDkxOSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBGWEZPTlRfSVRBTElDCQkJMHg0MAogI2RlZmluZSBGWEZPTlRfQk9MRAkJCQkweDQwMDAwCiAjZGVmaW5lIEZYRk9OVF9VU0VFWFRFUk5BVFRSCTB4ODAwMDAKKyNkZWZpbmUgRlhGT05UX0VYQUNUTUFUQ0gJCTB4ODAwMDAwMDANCiAjZGVmaW5lIEZYRk9OVF9DSURGT05UCQkJMHgxMDAwMDAKICNkZWZpbmUgRlhGT05UX0FOU0lfQ0hBUlNFVAkJMAogI2RlZmluZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUCTEKQEAgLTYxLDcgKzYyLDEwIEBACiAKICAgICBGWF9CT09MCQkJCQlMb2FkRW1iZWRkZWQoRlhfTFBDQllURSBkYXRhLCBGWF9EV09SRCBzaXplKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUpOworCUZYX0JPT0wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUsIGludCBuRmFjZUluZGV4ID0gMCwgaW50KiBwRmFjZUNvdW50ID0gTlVMTCk7DQorDQorICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIExvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpOw0KKw0KIAogICAgIEZYRlRfRmFjZQkJCQlHZXRGYWNlKCkgY29uc3QKICAgICB7CkBAIC0xNDEsNiArMTQ1LDcgQEAKIAogICAgIEZYX0JPT0wJCQkJCW1fYkVtYmVkZGVkOwogICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOworICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIG1fYkxvZ2ljOw0KICAgICB2b2lkKgkJCQkJbV9wT3duZWRTdHJlYW07CiB9OwogI2RlZmluZSBFTkNPRElOR19JTlRFUk5BTAkJMApAQCAtMTU3LDYgKzE2MiwzMiBAQAogICAgIHZpcnR1YWwgRlhfRFdPUkQJCUNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3QgPSAwOwogfTsKIElGWF9Gb250RW5jb2RpbmcqIEZYR0VfQ3JlYXRlVW5pY29kZUVuY29kaW5nKENGWF9Gb250KiBwRm9udCk7CisjZGVmaW5lIEZYRk1fRU5DX1RBRyhhLCBiLCBjLCBkKSAoKChGWF9EV09SRCkoYSkgPDwgMjQpIHwgKChGWF9EV09SRCkoYikgPDwgMTYpIHwgKChGWF9EV09SRCkoYykgPDwgOCkgfCAoRlhfRFdPUkQpKGQpKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19OT05FCQkJCUZYRk1fRU5DX1RBRygwLCAwLCAwLCAwKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19TWU1CT0wJCQlGWEZNX0VOQ19UQUcoJ3MnLCAneScsICdtJywgJ2InKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19VTklDT0RFCQkJRlhGTV9FTkNfVEFHKCd1JywgJ24nLCAnaScsICdjJykNCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfU0pJUwkJCUZYRk1fRU5DX1RBRygncycsICdqJywgJ2knLCAncycpDQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX0dCMjMxMgkJCUZYRk1fRU5DX1RBRygnZycsICdiJywgJyAnLCAnICcpDQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX0JJRzUJCQlGWEZNX0VOQ19UQUcoJ2InLCAnaScsICdnJywgJzUnKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19XQU5TVU5HCQlGWEZNX0VOQ19UQUcoJ3cnLCAnYScsICduJywgJ3MnKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19KT0hBQgkJCUZYRk1fRU5DX1RBRygnaicsICdvJywgJ2gnLCAnYScpDQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJECUZYRk1fRU5DX1RBRygnQScsICdEJywgJ08nLCAnQicpDQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX0FET0JFX0VYUEVSVAkJRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnQicsICdFJykNCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfQURPQkVfQ1VTVE9NCQlGWEZNX0VOQ19UQUcoJ0EnLCAnRCcsICdCJywgJ0MnKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xCQlGWEZNX0VOQ19UQUcoJ2wnLCAnYScsICd0JywgJzEnKQ0KKyNkZWZpbmUgRlhGTV9FTkNPRElOR19PTERfTEFUSU5fMgkJRlhGTV9FTkNfVEFHKCdsJywgJ2EnLCAndCcsICcyJykNCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfQVBQTEVfUk9NQU4JCUZYRk1fRU5DX1RBRygnYScsICdyJywgJ20nLCAnbicpDQorY2xhc3MgSUZYX0ZvbnRFbmNvZGluZ0V4IDogcHVibGljIElGWF9Gb250RW5jb2RpbmcNCit7DQorcHVibGljOg0KKw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlHbHlwaEluZGV4RnJvbU5hbWUoRlhfTFBDU1RSIHBTdHJOYW1lKSA9IDA7DQorDQorICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJTmFtZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlDaGFyQ29kZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkgPSAwOw0KK307DQorSUZYX0ZvbnRFbmNvZGluZ0V4KglGWF9DcmVhdGVGb250RW5jb2RpbmdFeChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIG5FbmNvZGluZ0lEID0gRlhGTV9FTkNPRElOR19OT05FKTsNCiAjZGVmaW5lIEZYRk9OVF9TVUJTVF9NTQkJCQkweDAxCiAjZGVmaW5lIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEgJCTB4MDQKICNkZWZpbmUgRlhGT05UX1NVQlNUX0NMRUFSVFlQRQkJMHgwOApAQCAtMjc3LDYgKzMwOCw3IEBACiAgICAgfQogICAgIHZpcnR1YWwgRlhGVF9GYWNlCUZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKKyAgICBGWEZUX0ZhY2UJRmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsIEZYX0RXT1JEIGZsYWdzLCBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlKTsNCiBwcml2YXRlOgogICAgIENGWF9CeXRlU3RyaW5nCQlHZXRQU05hbWVGcm9tVFQodm9pZCogaEZvbnQpOwogICAgIENGWF9CeXRlU3RyaW5nCQlNYXRjaEluc3RhbGxlZEZvbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpOwpAQCAtMjk4LDYgKzMzMCwxMCBAQAogICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKICAgICB2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgPSAwOwogICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgRlhfTFBDU1RSIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLCBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBwaXRjaF9mYW1pbHkpDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQogICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoRlhfTFBDU1RSIGZhY2UpID0gMDsKICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwgRlhfTFBCWVRFIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSkgPSAwOwogICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSA9IDA7CkBAIC0zMjEsNiArMzU3LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKICAgICB2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcik7CiAgICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9MUENTVFIgZmFjZSwgRlhfQk9PTCYgYkV4YWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250QnlVbmljb2RlKEZYX0RXT1JEIGR3VW5pY29kZSwgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgcGl0Y2hfZmFtaWx5KTsNCiAgICAgdmlydHVhbCB2b2lkKgkJR2V0Rm9udChGWF9MUENTVFIgZmFjZSk7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwogICAgIHZpcnR1YWwgdm9pZAkJRGVsZXRlRm9udCh2b2lkKiBoRm9udCk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcAppbmRleCBhMmYwZmJkLi42NGU5YzI4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1maWVsZC5jcHAKQEAgLTc5Nyw2ICs3OTcsNzcgQEAKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQoraW50IENQREZfRm9ybUZpZWxkOjpJbnNlcnRPcHRpb24oQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCwgaW50IGluZGV4LCBGWF9CT09MIGJOb3RpZnkpDQorew0KKyAgICBpZiAoY3NPcHRMYWJlbC5Jc0VtcHR5KCkpIHJldHVybiAtMTsNCisNCisgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKQ0KKyAgICB7DQorICAgICAgICBpbnQgaVJldCA9IDA7DQorICAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NPcHRMYWJlbCk7DQorICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NPcHRMYWJlbCk7DQorICAgICAgICBpZiAoaVJldCA8IDApIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBDRlhfQnl0ZVN0cmluZyBjc1N0ciA9IFBERl9FbmNvZGVUZXh0KGNzT3B0TGFiZWwsIGNzT3B0TGFiZWwuR2V0TGVuZ3RoKCkpOw0KKyAgICBDUERGX0FycmF5KiBwT3B0ID0gTlVMTDsNCisgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKTsNCisgICAgaWYgKHBWYWx1ZSA9PSBOVUxMIHx8IHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkNCisgICAgew0KKyAgICAgICAgcE9wdCA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOw0KKyAgICAgICAgaWYgKHBPcHQgPT0gTlVMTCkgcmV0dXJuIC0xOw0KKyAgICAgICAgbV9wRGljdC0+U2V0QXQoIk9wdCIsIHBPcHQpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICAgIHBPcHQgPSAoQ1BERl9BcnJheSopcFZhbHVlOw0KKyAgICBpbnQgaUNvdW50ID0gKGludClwT3B0LT5HZXRDb3VudCgpOw0KKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlDb3VudCkNCisgICAgew0KKyAgICAgICAgcE9wdC0+QWRkU3RyaW5nKGNzU3RyKTsNCisgICAgICAgIGluZGV4ID0gaUNvdW50Ow0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBDUERGX1N0cmluZzo6Q3JlYXRlKGNzU3RyKTsNCisgICAgICAgIGlmIChwU3RyaW5nID09IE5VTEwpIHJldHVybiAtMTsNCisgICAgICAgIHBPcHQtPkluc2VydEF0KGluZGV4LCBwU3RyaW5nKTsNCisgICAgfQ0KKw0KKyAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpDQorICAgIHsNCisgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7DQorICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOw0KKyAgICB9DQorICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOw0KKyAgICByZXR1cm4gaW5kZXg7DQorfQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSkNCit7DQorICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkNCisgICAgew0KKyAgICAgICAgaW50IGlSZXQgPSAwOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsNCisgICAgICAgIGludCBpSW5kZXggPSBHZXRTZWxlY3RlZEluZGV4KDApOw0KKyAgICAgICAgaWYgKGlJbmRleCA+PSAwKSBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsNCisgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsNCisgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsNCisgICAgICAgIGlmIChpUmV0IDwgMCkgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorDQorICAgIG1fcERpY3QtPlJlbW92ZUF0KCJPcHQiKTsNCisgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsNCisgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkRWIik7DQorICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7DQorICAgIG1fcERpY3QtPlJlbW92ZUF0KCJUSSIpOw0KKw0KKyAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpDQorICAgIHsNCisgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7DQorICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOw0KKyAgICB9DQorDQorICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOw0KKyAgICByZXR1cm4gVFJVRTsNCit9CiBGWF9CT09MIENQREZfRm9ybUZpZWxkOjpDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSkKIHsKICAgICBBU1NFUlQoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbik7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAppbmRleCA3ODY3MmU2Li4zY2JkY2U5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKQEAgLTE0MiwxMyArMTQyLDY3IEBACiAgICAgdmlydHVhbCB2b2lkKgkJU3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCk7CiAgICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7Ci0gICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpOworICAgIHZpcnR1YWwgaW50CQkJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogbkNvbXBzLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCk7DQogICAgIHZpcnR1YWwgRlhfQk9PTAkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpOwogICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBGWF9MUEJZVEUgZGVzdF9idWYpOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFKiBhdmFpbF9idWZfcHRyKTsKIHByb3RlY3RlZDoKICAgICBJRlhfSnBlZ1Byb3ZpZGVyKiBtX3BFeHRQcm92aWRlcjsKIH07CisjZGVmaW5lIFBOR19FUlJPUl9TSVpFIDI1Ng0KK2NsYXNzIENDb2RlY19QbmdNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX1BuZ01vZHVsZQ0KK3sNCitwdWJsaWM6DQorICAgIENDb2RlY19QbmdNb2R1bGUoKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19tZW1zZXQ4KG1fc3pMYXN0RXJyb3IsICdcMCcsIFBOR19FUlJPUl9TSVpFKTsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCh2b2lkKiBwTW9kdWxlKTsNCisgICAgdmlydHVhbCB2b2lkCQlGaW5pc2godm9pZCogcENvbnRleHQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0NIQVIJCQkJbV9zekxhc3RFcnJvcltQTkdfRVJST1JfU0laRV07DQorfTsNCitjbGFzcyBDQ29kZWNfR2lmTW9kdWxlIDogcHVibGljIElDb2RlY19HaWZNb2R1bGUNCit7DQorcHVibGljOg0KKyAgICBDQ29kZWNfR2lmTW9kdWxlKCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfbWVtc2V0OChtX3N6TGFzdEVycm9yLCAnXDAnLCAyNTYpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KHZvaWQqIHBNb2R1bGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFKiBhdmFpbF9idWZfcHRyKTsNCisgICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sIHZvaWQqKiBwYWxfcHAsIGludCogYmdfaW5kZXgsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUxvYWRGcmFtZUluZm8odm9pZCogcENvbnRleHQsIGludCogZnJhbWVfbnVtKTsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMglMb2FkRnJhbWUodm9pZCogcENvbnRleHQsIGludCBmcmFtZV9udW0sIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KKw0KK3Byb3RlY3RlZDoNCisgICAgRlhfQ0hBUgkJCQltX3N6TGFzdEVycm9yWzI1Nl07DQorfTsNCitjbGFzcyBDQ29kZWNfQm1wTW9kdWxlIDogcHVibGljIElDb2RlY19CbXBNb2R1bGUNCit7DQorcHVibGljOg0KKyAgICBDQ29kZWNfQm1wTW9kdWxlKCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfbWVtc2V0OChtX3N6TGFzdEVycm9yLCAnXDAnLCAyNTYpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KHZvaWQqIHBNb2R1bGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFKiBhdmFpbF9idWZfcHRyKTsNCisgICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgRlhfSU5UMzIqIHdpZHRoLCBGWF9JTlQzMiogaGVpZ2h0LCBGWF9CT09MKiB0Yl9mbGFnLCBGWF9JTlQzMiogY29tcG9uZW50cywgRlhfSU5UMzIqIHBhbF9udW0sIEZYX0RXT1JEKiogcGFsX3BwLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglMb2FkSW1hZ2Uodm9pZCogcENvbnRleHQpOw0KKw0KK3Byb3RlY3RlZDoNCisgICAgRlhfQ0hBUgkJCQltX3N6TGFzdEVycm9yWzI1Nl07DQorfTsNCiBjbGFzcyBDQ29kZWNfSWNjTW9kdWxlIDogcHVibGljIElDb2RlY19JY2NNb2R1bGUKIHsKIHB1YmxpYzoKQEAgLTE5Niw2ICsyNTAsMTUgQEAKICAgICBGWF9CT09MCQlEZWNvZGUodm9pZCogY3R4LCBGWF9MUEJZVEUgZGVzdF9kYXRhLCBpbnQgcGl0Y2gsIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCBGWF9MUEJZVEUgb2Zmc2V0cyk7CiAgICAgdm9pZAkJRGVzdHJveURlY29kZXIodm9pZCogY3R4KTsKIH07CitjbGFzcyBDQ29kZWNfVGlmZk1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfVGlmZk1vZHVsZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfTFBWT0lEIAlDcmVhdGVEZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEZyYW1lcyhGWF9MUFZPSUQgY3R4LCBGWF9JTlQzMiYgZnJhbWVzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlMb2FkRnJhbWVJbmZvKEZYX0xQVk9JRCBjdHgsIEZYX0lOVDMyIGZyYW1lLCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBjb21wcywgRlhfRFdPUkQmIGJwYywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZShGWF9MUFZPSUQgY3R4LCBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7DQorICAgIHZpcnR1YWwgdm9pZAkJRGVzdHJveURlY29kZXIoRlhfTFBWT0lEIGN0eCk7DQorfTsNCiAjaW5jbHVkZSAiLi4vamJpZzIvSkJpZzJfQ29udGV4dC5oIgogY2xhc3MgQ1BERl9KYmlnMkludGVyZmFjZSA6IHB1YmxpYyBDRlhfT2JqZWN0LCBwdWJsaWMgQ0pCaWcyX01vZHVsZQogewpAQCAtMjcwLDMgKzMzMywyNyBAQAogICAgIENQREZfSmJpZzJJbnRlcmZhY2UJbV9Nb2R1bGU7CiBwcml2YXRlOgogfTsKK2NsYXNzIENGWF9ESUJBdHRyaWJ1dGVFeGlmIDogcHVibGljIElGWF9ESUJBdHRyaWJ1dGVFeGlmDQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYoKTsNCisgICAgfkNGWF9ESUJBdHRyaWJ1dGVFeGlmKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0SW5mbyhGWF9XT1JEIHRhZywgRlhfTFBWT0lEIHZhbCk7DQorDQorICAgIEZYX0JPT0wgUGFyc2VFeGlmKENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgRlhfTFBCWVRFPiogcEhlYWQsIEZYX0xQQllURSBkYXRhLCBGWF9EV09SRCBsZW4sIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgRlhfTFBCWVRFPiogcFZhbCk7DQorDQorICAgIHR5cGVkZWYgRlhfV09SRCAoKl9SZWFkMkJ5dGVzKShGWF9MUEJZVEUgZGF0YSk7DQorICAgIHR5cGVkZWYgRlhfRFdPUkQgKCpfUmVhZDRCeXRlcykoRlhfTFBCWVRFIGRhdGEpOw0KKyAgICBGWF9MUEJZVEUgUGFyc2VFeGlmSUZIKEZYX0xQQllURSBkYXRhLCBGWF9EV09SRCBsZW4sIF9SZWFkMkJ5dGVzKiBwUmVhZFdvcmQsIF9SZWFkNEJ5dGVzKiBwUmVhZER3b3JkKTsNCisgICAgRlhfQk9PTCBQYXJzZUV4aWZJRkQoQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBGWF9MUEJZVEU+KiBwTWFwLCBGWF9MUEJZVEUgZGF0YSwgRlhfRFdPUkQgbGVuKTsNCisNCisgICAgRlhfTFBCWVRFCQkJbV9wRXhpZkRhdGE7DQorDQorICAgIEZYX0RXT1JECQkJbV9kd0V4aWZEYXRhTGVuOw0KKw0KKyAgICB2b2lkCQkJCWNsZWFyKCk7DQorICAgIF9SZWFkMkJ5dGVzIG1fcmVhZFdvcmQ7DQorICAgIF9SZWFkNEJ5dGVzIG1fcmVhZER3b3JkOw0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIEZYX0xQQllURT4gbV9UYWdIZWFkOw0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIEZYX0xQQllURT4gbV9UYWdWYWw7DQorfTsNCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwCmluZGV4IDQ1NmVjNDAuLmIyZjcwYzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICAgIG1fcEpweE1vZHVsZSA9IEZYX05FVyBDQ29kZWNfSnB4TW9kdWxlOwogICAgIG1fcEpiaWcyTW9kdWxlID0gRlhfTkVXIENDb2RlY19KYmlnMk1vZHVsZTsKICAgICBtX3BJY2NNb2R1bGUgPSBGWF9ORVcgQ0NvZGVjX0ljY01vZHVsZTsKKyAgICBtX3BQbmdNb2R1bGUgPSBGWF9ORVcgQ0NvZGVjX1BuZ01vZHVsZTsNCisgICAgbV9wR2lmTW9kdWxlID0gRlhfTkVXIENDb2RlY19HaWZNb2R1bGU7DQorICAgIG1fcEJtcE1vZHVsZSA9IEZYX05FVyBDQ29kZWNfQm1wTW9kdWxlOw0KKyAgICBtX3BUaWZmTW9kdWxlID0gRlhfTkVXIENDb2RlY19UaWZmTW9kdWxlOw0KICAgICBtX3BGbGF0ZU1vZHVsZSA9IEZYX05FVyBDQ29kZWNfRmxhdGVNb2R1bGU7CiB9CiBDQ29kZWNfTW9kdWxlTWdyOjp+Q0NvZGVjX01vZHVsZU1ncigpCkBAIC0yNDksNiArMjUzLDM0MyBAQAogewogICAgIGRlbGV0ZSB0aGlzOwogfQorQ0ZYX0RJQkF0dHJpYnV0ZTo6Q0ZYX0RJQkF0dHJpYnV0ZSgpDQorew0KKyAgICBGWFNZU19tZW1zZXQzMih0aGlzLCAwLCBzaXplb2YoQ0ZYX0RJQkF0dHJpYnV0ZSkpOw0KKyAgICBtX25YRFBJID0gLTE7DQorICAgIG1fbllEUEkgPSAtMTsNCisgICAgbV9mQXNwZWN0UmF0aW8gPSAtMS4wZjsNCisgICAgbV9wRXhpZiA9IEZYX05FVyBDRlhfRElCQXR0cmlidXRlRXhpZjsNCit9DQorQ0ZYX0RJQkF0dHJpYnV0ZTo6fkNGWF9ESUJBdHRyaWJ1dGUoKQ0KK3sNCisgICAgaWYgKG1fcEV4aWYpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BFeGlmOw0KKyAgICB9DQorfQ0KK0NGWF9ESUJBdHRyaWJ1dGVFeGlmOjpDRlhfRElCQXR0cmlidXRlRXhpZigpDQorew0KKyAgICBtX3BFeGlmRGF0YSA9IE5VTEw7DQorICAgIG1fZHdFeGlmRGF0YUxlbiA9IDA7DQorfQ0KK0NGWF9ESUJBdHRyaWJ1dGVFeGlmOjp+Q0ZYX0RJQkF0dHJpYnV0ZUV4aWYoKQ0KK3sNCisgICAgY2xlYXIoKTsNCit9DQordm9pZCBDRlhfRElCQXR0cmlidXRlRXhpZjo6Y2xlYXIoKQ0KK3sNCisgICAgaWYgKG1fcEV4aWZEYXRhKSB7DQorICAgICAgICBGWF9GcmVlKG1fcEV4aWZEYXRhKTsNCisgICAgfQ0KKyAgICBtX3BFeGlmRGF0YSA9IE5VTEw7DQorICAgIEZYX0RXT1JEIGtleSA9IDA7DQorICAgIEZYX0xQQllURSBidWYgPSBOVUxMOw0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBOVUxMOw0KKyAgICBwb3MgPSBtX1RhZ0hlYWQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBtX1RhZ0hlYWQuR2V0TmV4dEFzc29jKHBvcywga2V5LCBidWYpOw0KKyAgICAgICAgaWYgKGJ1Zikgew0KKyAgICAgICAgICAgIEZYX0ZyZWUoYnVmKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX1RhZ0hlYWQuUmVtb3ZlQWxsKCk7DQorICAgIHBvcyA9IG1fVGFnVmFsLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgbV9UYWdWYWwuR2V0TmV4dEFzc29jKHBvcywga2V5LCBidWYpOw0KKyAgICAgICAgaWYgKGJ1Zikgew0KKyAgICAgICAgICAgIEZYX0ZyZWUoYnVmKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX1RhZ1ZhbC5SZW1vdmVBbGwoKTsNCit9DQorc3RhdGljIEZYX1dPUkQgX1JlYWQyQnl0ZXNMKEZYX0xQQllURSBkYXRhKQ0KK3sNCisgICAgQVNTRVJUKGRhdGEpOw0KKyAgICByZXR1cm4gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpOw0KK30NCitzdGF0aWMgRlhfV09SRCBfUmVhZDJCeXRlc0IoRlhfTFBCWVRFIGRhdGEpDQorew0KKyAgICBBU1NFUlQoZGF0YSk7DQorICAgIHJldHVybiBkYXRhWzFdIHwgKGRhdGFbMF0gPDwgOCk7DQorfQ0KK3N0YXRpYyBGWF9EV09SRCBfUmVhZDRCeXRlc0woRlhfTFBCWVRFIGRhdGEpDQorew0KKyAgICByZXR1cm4gX1JlYWQyQnl0ZXNMKGRhdGEpIHwgKF9SZWFkMkJ5dGVzTChkYXRhICsgMikgPDwgMTYpOw0KK30NCitzdGF0aWMgRlhfRFdPUkQgX1JlYWQ0Qnl0ZXNCKEZYX0xQQllURSBkYXRhKQ0KK3sNCisgICAgcmV0dXJuIF9SZWFkMkJ5dGVzQihkYXRhICsgMikgfCAoX1JlYWQyQnl0ZXNCKGRhdGEpIDw8IDE2KTsNCit9DQordHlwZWRlZiBGWF9XT1JEICgqX1JlYWQyQnl0ZXMpIChGWF9MUEJZVEUgZGF0YSk7DQordHlwZWRlZiBGWF9EV09SRCAoKl9SZWFkNEJ5dGVzKSAoRlhfTFBCWVRFIGRhdGEpOw0KK3R5cGVkZWYgdm9pZCAoKl9Xcml0ZTJCeXRlcykgKEZYX0xQQllURSBkYXRhLCBGWF9XT1JEIHZhbCk7DQordHlwZWRlZiB2b2lkICgqX1dyaXRlNEJ5dGVzKSAoRlhfTFBCWVRFIGRhdGEsIEZYX0RXT1JEIHZhbCk7DQorRlhfTFBCWVRFIENGWF9ESUJBdHRyaWJ1dGVFeGlmOjpQYXJzZUV4aWZJRkgoRlhfTFBCWVRFIGRhdGEsIEZYX0RXT1JEIGxlbiwgX1JlYWQyQnl0ZXMqIHBSZWFkV29yZCwgX1JlYWQ0Qnl0ZXMqIHBSZWFkRHdvcmQpDQorew0KKyAgICBpZiAobGVuID4gOCkgew0KKyAgICAgICAgRlhfQk9PTCB0YWcgPSBGQUxTRTsNCisgICAgICAgIGlmIChGWFNZU19tZW1jbXAzMihkYXRhLCAiXHg0OVx4NDlceDJhXHgwMCIsIDQpID09IDApIHsNCisgICAgICAgICAgICBpZiAocFJlYWRXb3JkKSB7DQorICAgICAgICAgICAgICAgICpwUmVhZFdvcmQgPSBfUmVhZDJCeXRlc0w7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwUmVhZER3b3JkKSB7DQorICAgICAgICAgICAgICAgICpwUmVhZER3b3JkID0gX1JlYWQ0Qnl0ZXNMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0YWcgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmIChGWFNZU19tZW1jbXAzMihkYXRhLCAiXHg0ZFx4NGRceDAwXHgyYSIsIDQpID09IDApIHsNCisgICAgICAgICAgICBpZiAocFJlYWRXb3JkKSB7DQorICAgICAgICAgICAgICAgICpwUmVhZFdvcmQgPSBfUmVhZDJCeXRlc0I7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwUmVhZER3b3JkKSB7DQorICAgICAgICAgICAgICAgICpwUmVhZER3b3JkID0gX1JlYWQ0Qnl0ZXNCOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0YWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHRhZykgew0KKyAgICAgICAgICAgIGRhdGEgKz0gNDsNCisgICAgICAgICAgICBpZiAocFJlYWREd29yZCkgew0KKyAgICAgICAgICAgICAgICBkYXRhICs9ICgqcFJlYWREd29yZCkoZGF0YSkgLSA0Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRhdGEgKz0gNDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGRhdGE7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OlBhcnNlRXhpZklGRChDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIEZYX0xQQllURT4qIHBNYXAsIEZYX0xQQllURSBkYXRhLCBGWF9EV09SRCBsZW4pDQorew0KKyAgICBpZiAocE1hcCAmJiBkYXRhKSB7DQorICAgICAgICBpZiAobGVuID4gOCkgew0KKyAgICAgICAgICAgIEZYX1dPUkQgd1RhZ051bSA9IG1fcmVhZFdvcmQoZGF0YSk7DQorICAgICAgICAgICAgZGF0YSArPSAyOw0KKyAgICAgICAgICAgIEZYX0RXT1JEIHdUYWc7DQorICAgICAgICAgICAgRlhfTFBCWVRFIGJ1ZjsNCisgICAgICAgICAgICB3aGlsZSAod1RhZ051bS0tKSB7DQorICAgICAgICAgICAgICAgIHdUYWcgPSBtX3JlYWRXb3JkKGRhdGEpOw0KKyAgICAgICAgICAgICAgICBkYXRhICs9IDI7DQorICAgICAgICAgICAgICAgIGlmICghcE1hcC0+TG9va3VwKHdUYWcsIGJ1ZikpIHsNCisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIDEwKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGJ1ZiwgZGF0YSwgMTApOw0KKyAgICAgICAgICAgICAgICAgICAgcE1hcC0+U2V0QXQod1RhZywgYnVmKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkYXRhICs9IDEwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9EV09SRCBkd0lGRE9mZnNldDsNCisgICAgICAgICAgICBkd0lGRE9mZnNldCA9IG1fcmVhZER3b3JkKGRhdGEpOw0KKyAgICAgICAgICAgIHdoaWxlIChkd0lGRE9mZnNldCAmJiBkd0lGRE9mZnNldCA8IGxlbikgew0KKyAgICAgICAgICAgICAgICBkYXRhID0gbV9wRXhpZkRhdGEgKyBkd0lGRE9mZnNldDsNCisgICAgICAgICAgICAgICAgd1RhZ051bSA9IG1fcmVhZFdvcmQoZGF0YSk7DQorICAgICAgICAgICAgICAgIGRhdGEgKz0gMjsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHdUYWdOdW0tLSkgew0KKyAgICAgICAgICAgICAgICAgICAgd1RhZyA9IG1fcmVhZFdvcmQoZGF0YSk7DQorICAgICAgICAgICAgICAgICAgICBkYXRhICs9IDI7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBNYXAtPkxvb2t1cCh3VGFnLCBidWYpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gRlhfQWxsb2MoRlhfQllURSwgMTApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGJ1ZiwgZGF0YSwgMTApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYXAtPlNldEF0KHdUYWcsIGJ1Zik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBkYXRhICs9IDEwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGR3SUZET2Zmc2V0ID0gbV9yZWFkRHdvcmQoZGF0YSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorZW51bSBGWF9FeGlmRGF0YVR5cGUgew0KKyAgICBGWF9VbnNpZ25lZEJ5dGUgPSAxLA0KKyAgICBGWF9Bc2NTdHJpbmcsDQorICAgIEZYX1Vuc2lnbmVkU2hvcnQsDQorICAgIEZYX1Vuc2lnbmVkTG9uZywNCisgICAgRlhfVW5zaWduZWRSYXRpb24sDQorICAgIEZYX1NpZ25lZEJ5dGUsDQorICAgIEZYX1VuZGVmaW5lZCwNCisgICAgRlhfU2lnbmVkU2hvcnQsDQorICAgIEZYX1NpZ25lZExvbmcsDQorICAgIEZYX1NpZ25lZFJhdGlvbiwNCisgICAgRlhfU2lnbmVkRmxvYXQsDQorICAgIEZYX0RvdWJsZUZsb2F0DQorfTsNCitGWF9CT09MIENGWF9ESUJBdHRyaWJ1dGVFeGlmOjpQYXJzZUV4aWYoQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBGWF9MUEJZVEU+KiBwSGVhZCwgRlhfTFBCWVRFIGRhdGEsIEZYX0RXT1JEIGxlbiwgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBGWF9MUEJZVEU+KiBwVmFsKQ0KK3sNCisgICAgaWYgKHBIZWFkICYmIGRhdGEgJiYgcFZhbCkgew0KKyAgICAgICAgaWYgKGxlbiA+IDgpIHsNCisgICAgICAgICAgICBGWF9MUEJZVEUgb2xkX2RhdGEgPSBkYXRhOw0KKyAgICAgICAgICAgIGRhdGEgPSBQYXJzZUV4aWZJRkgoZGF0YSwgbGVuLCAmbV9yZWFkV29yZCwgJm1fcmVhZER3b3JkKTsNCisgICAgICAgICAgICBpZiAoZGF0YSA9PSBvbGRfZGF0YSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwSGVhZC0+R2V0Q291bnQoKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGlmICghUGFyc2VFeGlmSUZEKHBIZWFkLCBkYXRhLCBsZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdNb2R1bGVOdW07DQorICAgICAgICAgICAgRlhfV09SRCB0eXBlOw0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZTsNCisgICAgICAgICAgICBGWF9EV09SRCB0YWc7DQorICAgICAgICAgICAgRlhfTFBCWVRFIGhlYWQ7DQorICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcEhlYWQtPkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgICAgICAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICAgICAgICAgIHBIZWFkLT5HZXROZXh0QXNzb2MocG9zLCB0YWcsIGhlYWQpOw0KKyAgICAgICAgICAgICAgICBGWF9MUEJZVEUgdmFsID0gTlVMTCwgYnVmID0gTlVMTCwgdGVtcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIGludCBpOw0KKyAgICAgICAgICAgICAgICBpZiAoaGVhZCkgew0KKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IG1fcmVhZFdvcmQoaGVhZCk7DQorICAgICAgICAgICAgICAgICAgICBoZWFkICs9IDI7DQorICAgICAgICAgICAgICAgICAgICBkd01vZHVsZU51bSA9IG1fcmVhZER3b3JkKGhlYWQpOw0KKyAgICAgICAgICAgICAgICAgICAgaGVhZCArPSA0Ow0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9VbnNpZ25lZEJ5dGU6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9Bc2NTdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRCeXRlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfVW5kZWZpbmVkOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1NpemUgPSBkd01vZHVsZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gRlhfQWxsb2MoRlhfQllURSwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHZhbCwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHZhbCwgaGVhZCwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYX1Vuc2lnbmVkU2hvcnQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRTaG9ydDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTaXplID0gZHdNb2R1bGVOdW0gPDwgMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gRlhfQWxsb2MoRlhfQllURSwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHZhbCwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHZhbCwgaGVhZCwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSB2YWw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpZHdNb2R1bGVOdW07IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfV09SRCopYnVmID0gbV9yZWFkV29yZChidWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9VbnNpZ25lZExvbmc6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRMb25nOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfU2lnbmVkRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U2l6ZSA9IGR3TW9kdWxlTnVtIDw8IDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkd1NpemUgPiA0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMih2YWwsIG9sZF9kYXRhICsgbV9yZWFkRHdvcmQoaGVhZCksIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMih2YWwsIGhlYWQsIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gdmFsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KWR3TW9kdWxlTnVtOyBpICsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilidWYgPSBtX3JlYWREd29yZChidWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IDQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9VbnNpZ25lZFJhdGlvbjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYX1NpZ25lZFJhdGlvbjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTaXplID0gZHdNb2R1bGVOdW0gPDwgMzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdTaXplID4gNCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGJ1Ziwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoYnVmLCBoZWFkLCBkd1NpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGJ1ZjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U2l6ZSAvIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShidWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpZHdNb2R1bGVOdW07IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKil0ZW1wID0gbV9yZWFkRHdvcmQodGVtcCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopKHRlbXAgKyA0KSA9IG1fcmVhZER3b3JkKHRlbXAgKyA0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogbE51bWVyYXRvciA9IChGWF9EV09SRCopdGVtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogbE5lbm9taW5hdG9yID0gKEZYX0RXT1JEKikodGVtcCArIDQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRkxPQVQqKSh2YWwgKyBpICogNCkgPSAoRlhfRkxPQVQpKCpsTnVtZXJhdG9yKSAvIChGWF9GTE9BVCkoKmxOZW5vbWluYXRvcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCArPSA4Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShidWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfRG91YmxlRmxvYXQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U2l6ZSA9IGR3TW9kdWxlTnVtIDw8IDM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkd1NpemUgPiA0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMih2YWwsIG9sZF9kYXRhICsgbV9yZWFkRHdvcmQoaGVhZCksIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMih2YWwsIGhlYWQsIGR3U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gdmFsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KWR3TW9kdWxlTnVtOyBpICsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilidWYgPSBtX3JlYWREd29yZChidWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopKGJ1ZiArIDQpID0gbV9yZWFkRHdvcmQoYnVmICsgNCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gODsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFZhbC0+U2V0QXQodGFnLCB2YWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KKyNkZWZpbmUgRlhFWElGX0lORk9DT05WRVJUKFQpIHtUKiBzcmMgPSAoVCopcHRyOwlUKiBkc3QgPSAoVCopdmFsOwkqZHN0ID0gKnNyYzt9DQorRlhfQk9PTCBDRlhfRElCQXR0cmlidXRlRXhpZjo6R2V0SW5mbyggRlhfV09SRCB0YWcsIEZYX0xQVk9JRCB2YWwgKQ0KK3sNCisgICAgaWYgKG1fVGFnVmFsLkdldENvdW50KCkgPT0gMCkgew0KKyAgICAgICAgaWYgKCFQYXJzZUV4aWYoJm1fVGFnSGVhZCwgbV9wRXhpZkRhdGEsIG1fZHdFeGlmRGF0YUxlbiwgJm1fVGFnVmFsKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9MUEJZVEUgcHRyID0gTlVMTDsNCisgICAgaWYgKG1fVGFnVmFsLkxvb2t1cCh0YWcsIHB0cikpIHsNCisgICAgICAgIHN3aXRjaCAodGFnKSB7DQorICAgICAgICAgICAgY2FzZSBFWElGVEFHX1VTSE9SVF9SRVNVTklUOg0KKyAgICAgICAgICAgICAgICBGWEVYSUZfSU5GT0NPTlZFUlQoRlhfV09SRCk7DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqIHB0ciA9IChGWF9XT1JEKil2YWw7DQorICAgICAgICAgICAgICAgICAgICAqcHRyIC09IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBFWElGVEFHX0ZMT0FUX0RQSVg6DQorICAgICAgICAgICAgY2FzZSBFWElGVEFHX0ZMT0FUX0RQSVk6DQorICAgICAgICAgICAgICAgIEZYRVhJRl9JTkZPQ09OVkVSVChGWF9GTE9BVCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRVhJRlRBR19VU0hPUlRfT1JJRU5UQVRJT046DQorICAgICAgICAgICAgICAgIEZYRVhJRl9JTkZPQ09OVkVSVChGWF9XT1JEKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFKiBkc3QgPSAoRlhfTFBCWVRFKil2YWw7DQorICAgICAgICAgICAgICAgICAgICAqZHN0ID0gcHRyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KIGNsYXNzIENDb2RlY19STFNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCiB7CiBwdWJsaWM6CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2JtcC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2JtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYm1wLmNwcApAQCAtMCwwICsxLDEyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiY29kZWNfaW50LmgiDQorI2luY2x1ZGUgIi4uL2xibXAvZnhfYm1wLmgiDQorc3RydWN0IEZYQk1QX0NvbnRleHQgew0KKyAgICBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyOw0KKyAgICB2b2lkKgkJcGFyZW50X3B0cjsNCisgICAgdm9pZCoJCWNoaWxkX3B0cjsNCisNCisgICAgdm9pZCoJCSgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7DQorICAgIHZvaWQJCSgqbV9GcmVlRnVuYykodm9pZCopOw0KK307DQorZXh0ZXJuICJDIiB7DQorICAgIHN0YXRpYyB2b2lkKiBfYm1wX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCisgICAgfQ0KKyAgICBzdGF0aWMgdm9pZCAgX2JtcF9mcmVlX2Z1bmModm9pZCogcCkNCisgICAgew0KKyAgICAgICAgaWYocCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRlhfRnJlZShwKTsNCisgICAgICAgIH0NCisgICAgfQ0KK307DQorc3RhdGljIHZvaWQgX2JtcF9lcnJvcl9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0xQQ1NUUiBlcnJfbXNnKQ0KK3sNCisgICAgRlhTWVNfc3RybmNweSgoY2hhciopYm1wX3B0ci0+ZXJyX3B0ciwgZXJyX21zZywgQk1QX01BWF9FUlJPUl9TSVpFIC0gMSk7DQorICAgIGxvbmdqbXAoYm1wX3B0ci0+am1wYnVmLCAxKTsNCit9DQorc3RhdGljIHZvaWQgX2JtcF9yZWFkX3NjYW5saW5lKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0lOVDMyIHJvd19udW0sIEZYX0xQQllURSByb3dfYnVmKQ0KK3sNCisgICAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilibXBfcHRyLT5jb250ZXh0X3B0cjsNCisgICAgQ0NvZGVjX0JtcE1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfQm1wTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgICBwTW9kdWxlLT5SZWFkU2NhbmxpbmVDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJvd19udW0sIHJvd19idWYpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBfYm1wX2dldF9kYXRhX3Bvc2l0aW9uKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0RXT1JEIHJjZF9wb3MpDQorew0KKyAgICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKWJtcF9wdHItPmNvbnRleHRfcHRyOw0KKyAgICBDQ29kZWNfQm1wTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19CbXBNb2R1bGUqKXAtPnBhcmVudF9wdHI7DQorICAgIHJldHVybiBwTW9kdWxlLT5JbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJjZF9wb3MpOw0KK30NCit2b2lkKiBDQ29kZWNfQm1wTW9kdWxlOjpTdGFydCh2b2lkKiBwTW9kdWxlKQ0KK3sNCisgICAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoRlhCTVBfQ29udGV4dCkpOw0KKyAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihwLCAwLCBzaXplb2YoRlhCTVBfQ29udGV4dCkpOw0KKyAgICBpZihwID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHAtPm1fQWxsb2NGdW5jID0gX2JtcF9hbGxvY19mdW5jOw0KKyAgICBwLT5tX0ZyZWVGdW5jID0gX2JtcF9mcmVlX2Z1bmM7DQorICAgIHAtPmJtcF9wdHIgPSBOVUxMOw0KKyAgICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7DQorICAgIHAtPmNoaWxkX3B0ciA9IHBNb2R1bGU7DQorICAgIHAtPmJtcF9wdHIgPSBfYm1wX2NyZWF0ZV9kZWNvbXByZXNzKCk7DQorICAgIGlmIChwLT5ibXBfcHRyID09IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwLT5ibXBfcHRyLT5jb250ZXh0X3B0ciA9ICh2b2lkKilwOw0KKyAgICBwLT5ibXBfcHRyLT5lcnJfcHRyID0gbV9zekxhc3RFcnJvcjsNCisgICAgcC0+Ym1wX3B0ci0+X2JtcF9lcnJvcl9mbiA9IF9ibXBfZXJyb3JfZGF0YTsNCisgICAgcC0+Ym1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuID0gX2JtcF9yZWFkX3NjYW5saW5lOw0KKyAgICBwLT5ibXBfcHRyLT5fYm1wX2dldF9kYXRhX3Bvc2l0aW9uX2ZuID0gX2JtcF9nZXRfZGF0YV9wb3NpdGlvbjsNCisgICAgcmV0dXJuIHA7DQorfQ0KK3ZvaWQgQ0NvZGVjX0JtcE1vZHVsZTo6RmluaXNoKHZvaWQqIHBDb250ZXh0KQ0KK3sNCisgICAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilwQ29udGV4dDsNCisgICAgaWYocCAhPSBOVUxMKSB7DQorICAgICAgICBfYm1wX2Rlc3Ryb3lfZGVjb21wcmVzcygmcC0+Ym1wX3B0cik7DQorICAgICAgICBwLT5tX0ZyZWVGdW5jKHApOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENDb2RlY19CbXBNb2R1bGU6OlJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIEZYX0lOVDMyKiB3aWR0aCwgRlhfSU5UMzIqIGhlaWdodCwgRlhfQk9PTCogdGJfZmxhZywgRlhfSU5UMzIqIGNvbXBvbmVudHMsIEZYX0lOVDMyKiBwYWxfbnVtLCBGWF9EV09SRCoqIHBhbF9wcCwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkNCit7DQorICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICAgIGlmKHNldGptcChwLT5ibXBfcHRyLT5qbXBidWYpKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiByZXQgPSBfYm1wX3JlYWRfaGVhZGVyKHAtPmJtcF9wdHIpOw0KKyAgICBpZiAocmV0ICE9IDEpIHsNCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisgICAgKndpZHRoID0gcC0+Ym1wX3B0ci0+d2lkdGg7DQorICAgICpoZWlnaHQgPSBwLT5ibXBfcHRyLT5oZWlnaHQ7DQorICAgICp0Yl9mbGFnID0gcC0+Ym1wX3B0ci0+aW1nVEJfZmxhZzsNCisgICAgKmNvbXBvbmVudHMgPSBwLT5ibXBfcHRyLT5jb21wb25lbnRzOw0KKyAgICAqcGFsX251bSA9IHAtPmJtcF9wdHItPnBhbF9udW07DQorICAgICpwYWxfcHAgPSBwLT5ibXBfcHRyLT5wYWxfcHRyOw0KKyAgICBpZiAocEF0dHJpYnV0ZSkgew0KKyAgICAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCA9IEZYQ09ERUNfUkVTVU5JVF9NRVRFUjsNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fblhEUEkgPSBwLT5ibXBfcHRyLT5kcGlfeDsNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fbllEUEkgPSBwLT5ibXBfcHRyLT5kcGlfeTsNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fbkJtcENvbXByZXNzVHlwZSA9IHAtPmJtcF9wdHItPmNvbXByZXNzX2ZsYWc7DQorICAgIH0NCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZYX0lOVDMyIENDb2RlY19CbXBNb2R1bGU6OkxvYWRJbWFnZSh2b2lkKiBwQ29udGV4dCkNCit7DQorICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICAgIGlmKHNldGptcChwLT5ibXBfcHRyLT5qbXBidWYpKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gX2JtcF9kZWNvZGVfaW1hZ2UocC0+Ym1wX3B0cik7DQorfQ0KK0ZYX0RXT1JEIENDb2RlY19CbXBNb2R1bGU6OkdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIEZYX0xQQllURSogYXZpYWxfYnVmX3B0cikNCit7DQorICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICAgIHJldHVybiBfYm1wX2dldF9hdmFpbF9pbnB1dChwLT5ibXBfcHRyLCBhdmlhbF9idWZfcHRyKTsNCit9DQordm9pZCBDQ29kZWNfQm1wTW9kdWxlOjpJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkNCit7DQorICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICAgIF9ibXBfaW5wdXRfYnVmZmVyKHAtPmJtcF9wdHIsIChGWF9MUEJZVEUpc3JjX2J1Ziwgc3JjX3NpemUpOw0KK30NCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2dpZi5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2dpZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjNzA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZ2lmLmNwcApAQCAtMCwwICsxLDE3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiY29kZWNfaW50LmgiDQorI2luY2x1ZGUgIi4uL2xnaWYvZnhfZ2lmLmgiDQorc3RydWN0IEZYR0lGX0NvbnRleHQgew0KKyAgICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyOw0KKyAgICB2b2lkKgkJcGFyZW50X3B0cjsNCisgICAgdm9pZCoJCWNoaWxkX3B0cjsNCisNCisgICAgdm9pZCoJCSgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7DQorICAgIHZvaWQJCSgqbV9GcmVlRnVuYykodm9pZCopOw0KK307DQorZXh0ZXJuICJDIiB7DQorICAgIHN0YXRpYyB2b2lkKiBfZ2lmX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCisgICAgfQ0KKyAgICBzdGF0aWMgdm9pZCAgX2dpZl9mcmVlX2Z1bmModm9pZCogcCkNCisgICAgew0KKyAgICAgICAgaWYocCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRlhfRnJlZShwKTsNCisgICAgICAgIH0NCisgICAgfQ0KK307DQorc3RhdGljIHZvaWQgX2dpZl9lcnJvcl9kYXRhKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQ1NUUiBlcnJfbXNnKQ0KK3sNCisgICAgRlhTWVNfc3RybmNweSgoY2hhciopZ2lmX3B0ci0+ZXJyX3B0ciwgZXJyX21zZywgR0lGX01BWF9FUlJPUl9TSVpFIC0gMSk7DQorICAgIGxvbmdqbXAoZ2lmX3B0ci0+am1wYnVmLCAxKTsNCit9DQorc3RhdGljIEZYX0xQQllURSBfZ2lmX2Fza19idWZfZm9yX3BhbChnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9JTlQzMiBwYWxfc2l6ZSkNCit7DQorICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopZ2lmX3B0ci0+Y29udGV4dF9wdHI7DQorICAgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgICAgcmV0dXJuIHBNb2R1bGUtPkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKHAtPmNoaWxkX3B0ciwNCisgICAgICAgICAgICBfZ2lmX2dldF9mcmFtZV9udW0oZ2lmX3B0ciksDQorICAgICAgICAgICAgcGFsX3NpemUpOw0KK30NCitzdGF0aWMgdm9pZCBfZ2lmX3JlY29yZF9jdXJyZW50X3Bvc2l0aW9uKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0RXT1JEKiBjdXJfcG9zX3B0cikNCit7DQorICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopZ2lmX3B0ci0+Y29udGV4dF9wdHI7DQorICAgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgICAgcE1vZHVsZS0+UmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCAqY3VyX3Bvc19wdHIpOw0KK30NCitzdGF0aWMgdm9pZCBfZ2lmX3JlYWRfc2NhbmxpbmUoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfSU5UMzIgcm93X251bSwgRlhfTFBCWVRFIHJvd19idWYpDQorew0KKyAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOw0KKyAgICBDQ29kZWNfR2lmTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19HaWZNb2R1bGUqKXAtPnBhcmVudF9wdHI7DQorICAgIHBNb2R1bGUtPlJlYWRTY2FubGluZUNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcm93X251bSwgcm93X2J1Zik7DQorfQ0KK3N0YXRpYyBGWF9CT09MIF9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9EV09SRCBjdXJfcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBsZWZ0LCBGWF9JTlQzMiB0b3AsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHBhbF9udW0sIHZvaWQqIHBhbF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGRlbGF5X3RpbWUsIEZYX0JPT0wgdXNlcl9pbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgdHJhbnNfaW5kZXgsIEZYX0lOVDMyIGRpc3Bvc2FsX21ldGhvZCwgRlhfQk9PTCBpbnRlcmxhY2UpDQorew0KKyAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOw0KKyAgICBDQ29kZWNfR2lmTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19HaWZNb2R1bGUqKXAtPnBhcmVudF9wdHI7DQorICAgIHJldHVybiBwTW9kdWxlLT5JbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCBjdXJfcG9zLCBGWF9SRUNUKGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpLA0KKyAgICAgICAgICAgIHBhbF9udW0sIHBhbF9wdHIsIGRlbGF5X3RpbWUsIHVzZXJfaW5wdXQsIHRyYW5zX2luZGV4LCBkaXNwb3NhbF9tZXRob2QsIGludGVybGFjZSk7DQorfQ0KK3ZvaWQqIENDb2RlY19HaWZNb2R1bGU6OlN0YXJ0KHZvaWQqIHBNb2R1bGUpDQorew0KKyAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQorICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDMyKHAsIDAsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQorICAgIHAtPm1fQWxsb2NGdW5jID0gX2dpZl9hbGxvY19mdW5jOw0KKyAgICBwLT5tX0ZyZWVGdW5jID0gX2dpZl9mcmVlX2Z1bmM7DQorICAgIHAtPmdpZl9wdHIgPSBOVUxMOw0KKyAgICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7DQorICAgIHAtPmNoaWxkX3B0ciA9IHBNb2R1bGU7DQorICAgIHAtPmdpZl9wdHIgPSBfZ2lmX2NyZWF0ZV9kZWNvbXByZXNzKCk7DQorICAgIGlmIChwLT5naWZfcHRyID09IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwLT5naWZfcHRyLT5jb250ZXh0X3B0ciA9ICh2b2lkKilwOw0KKyAgICBwLT5naWZfcHRyLT5lcnJfcHRyID0gbV9zekxhc3RFcnJvcjsNCisgICAgcC0+Z2lmX3B0ci0+X2dpZl9lcnJvcl9mbiA9IF9naWZfZXJyb3JfZGF0YTsNCisgICAgcC0+Z2lmX3B0ci0+X2dpZl9hc2tfYnVmX2Zvcl9wYWxfZm4gPSBfZ2lmX2Fza19idWZfZm9yX3BhbDsNCisgICAgcC0+Z2lmX3B0ci0+X2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbiA9IF9naWZfcmVjb3JkX2N1cnJlbnRfcG9zaXRpb247DQorICAgIHAtPmdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbiA9IF9naWZfcmVhZF9zY2FubGluZTsNCisgICAgcC0+Z2lmX3B0ci0+X2dpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uX2ZuID0gX2dpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uOw0KKyAgICByZXR1cm4gcDsNCit9DQordm9pZCBDQ29kZWNfR2lmTW9kdWxlOjpGaW5pc2godm9pZCogcENvbnRleHQpDQorew0KKyAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgICBpZihwICE9IE5VTEwpIHsNCisgICAgICAgIF9naWZfZGVzdHJveV9kZWNvbXByZXNzKCZwLT5naWZfcHRyKTsNCisgICAgICAgIHAtPm1fRnJlZUZ1bmMocCk7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0NvZGVjX0dpZk1vZHVsZTo6UmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sIHZvaWQqKiBwYWxfcHAsIGludCogYmdfaW5kZXgsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQorew0KKyAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgICBpZihzZXRqbXAocC0+Z2lmX3B0ci0+am1wYnVmKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgcmV0ID0gX2dpZl9yZWFkX2hlYWRlcihwLT5naWZfcHRyKTsNCisgICAgaWYgKHJldCAhPSAxKSB7DQorICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICB9DQorICAgIGlmIChwQXR0cmlidXRlKSB7DQorICAgIH0NCisgICAgKndpZHRoID0gcC0+Z2lmX3B0ci0+d2lkdGg7DQorICAgICpoZWlnaHQgPSBwLT5naWZfcHRyLT5oZWlnaHQ7DQorICAgICpwYWxfbnVtID0gcC0+Z2lmX3B0ci0+Z2xvYmFsX3BhbF9udW07DQorICAgICpwYWxfcHAgPSBwLT5naWZfcHRyLT5nbG9iYWxfcGFsX3B0cjsNCisgICAgKmJnX2luZGV4ID0gcC0+Z2lmX3B0ci0+YmNfaW5kZXg7DQorICAgIHJldHVybiAxOw0KK30NCitGWF9JTlQzMiBDQ29kZWNfR2lmTW9kdWxlOjpMb2FkRnJhbWVJbmZvKHZvaWQqIHBDb250ZXh0LCBpbnQqIGZyYW1lX251bSkNCit7DQorICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopcENvbnRleHQ7DQorICAgIGlmKHNldGptcChwLT5naWZfcHRyLT5qbXBidWYpKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiByZXQgPSBfZ2lmX2dldF9mcmFtZShwLT5naWZfcHRyKTsNCisgICAgaWYgKHJldCAhPSAxKSB7DQorICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICB9DQorICAgICpmcmFtZV9udW0gPSBfZ2lmX2dldF9mcmFtZV9udW0ocC0+Z2lmX3B0cik7DQorICAgIHJldHVybiAxOw0KK30NCitGWF9JTlQzMiBDQ29kZWNfR2lmTW9kdWxlOjpMb2FkRnJhbWUodm9pZCogcENvbnRleHQsIGludCBmcmFtZV9udW0sIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQorew0KKyAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgICBpZihzZXRqbXAocC0+Z2lmX3B0ci0+am1wYnVmKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgcmV0ID0gX2dpZl9sb2FkX2ZyYW1lKHAtPmdpZl9wdHIsIGZyYW1lX251bSk7DQorICAgIGlmIChyZXQgPT0gMSkgew0KKyAgICAgICAgaWYgKHBBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgICBwQXR0cmlidXRlLT5tX25HaWZMZWZ0ID0gcC0+Z2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRBdChmcmFtZV9udW0pLT5pbWFnZV9pbmZvX3B0ci0+bGVmdDsNCisgICAgICAgICAgICBwQXR0cmlidXRlLT5tX25HaWZUb3AgPSBwLT5naWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldEF0KGZyYW1lX251bSktPmltYWdlX2luZm9fcHRyLT50b3A7DQorICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9mQXNwZWN0UmF0aW8gPSBwLT5naWZfcHRyLT5waXhlbF9hc3BlY3Q7DQorICAgICAgICAgICAgaWYgKHAtPmdpZl9wdHItPmNtdF9kYXRhX3B0cikgew0KKyAgICAgICAgICAgICAgICBGWF9MUENCWVRFIGJ1ZiA9IChGWF9MUENCWVRFKXAtPmdpZl9wdHItPmNtdF9kYXRhX3B0ci0+R2V0QnVmZmVyKDApOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4gPSBwLT5naWZfcHRyLT5jbXRfZGF0YV9wdHItPkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMjEpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgc2l6ZSA9ICpidWYrKzsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJBdXRob3IgPSBDRlhfQnl0ZVN0cmluZyhidWYsIHNpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0ckF1dGhvci5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IHNpemU7DQorICAgICAgICAgICAgICAgICAgICBzaXplID0gKmJ1ZisrOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMjApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwQXR0cmlidXRlLT5tX3N0clRpbWUsIGJ1Ziwgc2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHJldDsNCit9DQorRlhfRFdPUkQgQ0NvZGVjX0dpZk1vZHVsZTo6R2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFKiBhdmlhbF9idWZfcHRyKQ0KK3sNCisgICAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCisgICAgcmV0dXJuIF9naWZfZ2V0X2F2YWlsX2lucHV0KHAtPmdpZl9wdHIsIGF2aWFsX2J1Zl9wdHIpOw0KK30NCit2b2lkIENDb2RlY19HaWZNb2R1bGU6OklucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KK3sNCisgICAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCisgICAgX2dpZl9pbnB1dF9idWZmZXIocC0+Z2lmX3B0ciwgKEZYX0xQQllURSlzcmNfYnVmLCBzcmNfc2l6ZSk7DQorfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCmluZGV4IDQ4OWYwOTkuLjk1NzcwZWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtNzMsNiArNzMsNjggQEAKICNkZWZpbmUJSlBFR19NQVJLRVJfQVVUSE9SVElNRQkoSlBFR19BUFAwICsgMykKICNkZWZpbmUJSlBFR19NQVJLRVJfTUFYU0laRQkweEZGRkYKICNkZWZpbmUJSlBFR19PVkVSSEVBRF9MRU4JMTQKK3N0YXRpYyBGWF9CT09MIF9KcGVnSXNJY2NNYXJrZXIoanBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcikKK3sKKyAgICBpZiAobWFya2VyLT5tYXJrZXIgPT0gSlBFR19NQVJLRVJfSUNDICYmCisgICAgICAgICAgICBtYXJrZXItPmRhdGFfbGVuZ3RoID49IEpQRUdfT1ZFUkhFQURfTEVOICYmCisgICAgICAgICAgICAoRlhTWVNfbWVtY21wMzIobWFya2VyLT5kYXRhLCAiXHg0OVx4NDNceDQzXHg1Zlx4NTBceDUyXHg0Zlx4NDZceDQ5XHg0Y1x4NDVceDAwIiwgMTIpID09IDApKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CitzdGF0aWMJRlhfQk9PTCBfSnBlZ0xvYWRJY2NQcm9maWxlKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZYX0xQQllURSogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKQoreworICAgIGlmKGljY19idWZfcHRyID09IE5VTEwgfHwgaWNjX2xlbmd0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKmljY19idWZfcHRyID0gTlVMTDsKKyAgICAqaWNjX2xlbmd0aCA9IDA7CisgICAgRlhfTFBCWVRFIGljY19kYXRhX3B0ciA9IE5VTEw7CisgICAgRlhfRFdPUkQgaWNjX2RhdGFfbGVuID0gMDsKKyAgICBGWF9CWVRFIGNvdW50X2ljY19tYXJrZXIgPSAwOworICAgIEZYX0JZVEUgbnVtX2ljY19tYXJrZXIgPSAwOworICAgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXJfbGlzdFsyNTZdID0ge05VTEx9OworICAgIGZvciAoanBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXIgPSBjaW5mby0+bWFya2VyX2xpc3Q7CisgICAgICAgICAgICBjdXJfbWFya2VyICE9IE5VTEw7CisgICAgICAgICAgICBjdXJfbWFya2VyID0gY3VyX21hcmtlci0+bmV4dCkgeworICAgICAgICBpZihfSnBlZ0lzSWNjTWFya2VyKGN1cl9tYXJrZXIpKSB7CisgICAgICAgICAgICBpZihjb3VudF9pY2NfbWFya2VyID09IDApIHsKKyAgICAgICAgICAgICAgICBudW1faWNjX21hcmtlciA9IGN1cl9tYXJrZXItPmRhdGFbMTNdOworICAgICAgICAgICAgfSBlbHNlIGlmKG51bV9pY2NfbWFya2VyICE9IGN1cl9tYXJrZXItPmRhdGFbMTNdKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNuID0gY3VyX21hcmtlci0+ZGF0YVsxMl0gLSAxOworICAgICAgICAgICAgaWYoc24gPCAwIHx8IHNuID49IG51bV9pY2NfbWFya2VyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobWFya2VyX2xpc3Rbc25dID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtYXJrZXJfbGlzdFtzbl0gPSBjdXJfbWFya2VyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudF9pY2NfbWFya2VyICsrOworICAgICAgICAgICAgaWNjX2RhdGFfbGVuICs9CShjdXJfbWFya2VyLT5kYXRhX2xlbmd0aCAtIEpQRUdfT1ZFUkhFQURfTEVOKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihjb3VudF9pY2NfbWFya2VyICE9IG51bV9pY2NfbWFya2VyKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYobnVtX2ljY19tYXJrZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWNjX2RhdGFfcHRyID0gRlhfQWxsb2MoRlhfQllURSwgaWNjX2RhdGFfbGVuKTsKKyAgICBpZihpY2NfYnVmX3B0ciA9PSBOVUxMKQl7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKmljY19idWZfcHRyID0gaWNjX2RhdGFfcHRyOworICAgICppY2NfbGVuZ3RoID0gaWNjX2RhdGFfbGVuOworICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IG51bV9pY2NfbWFya2VyOyBpZHgrKykgeworICAgICAgICBpY2NfZGF0YV9sZW4gPSBtYXJrZXJfbGlzdFtpZHhdLT5kYXRhX2xlbmd0aCAtIEpQRUdfT1ZFUkhFQURfTEVOOworICAgICAgICBGWFNZU19tZW1jcHkzMihpY2NfZGF0YV9wdHIsIG1hcmtlcl9saXN0W2lkeF0tPmRhdGEgKyBKUEVHX09WRVJIRUFEX0xFTiwgaWNjX2RhdGFfbGVuKTsKKyAgICAgICAgaWNjX2RhdGFfcHRyICs9IGljY19kYXRhX2xlbjsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CiBzdGF0aWMJRlhfQk9PTCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywgRlhfTFBDQllURSBpY2NfYnVmX3B0ciwgRlhfRFdPUkQgaWNjX2xlbmd0aCkKIHsKICAgICBpZihpY2NfYnVmX3B0ciA9PSBOVUxMIHx8IGljY19sZW5ndGggPT0gMCkgewpAQCAtMjA3LDYgKzI2OSwxNyBAQAogICAgIH0KICAgICBkZXN0X3NpemUgPSBkZXN0X2J1Zl9sZW5ndGggLSAoRlhfU1RSU0laRSlkZXN0LmZyZWVfaW5fYnVmZmVyOwogfQorc3RhdGljIHZvaWQgX0pwZWdMb2FkQXR0cmlidXRlKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBwSW5mbywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkKK3sKKyAgICBpZiAocEluZm8gPT0gTlVMTCB8fCBwQXR0cmlidXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocEF0dHJpYnV0ZSkgeworICAgICAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gcEluZm8tPlhfZGVuc2l0eTsKKyAgICAgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IHBJbmZvLT5ZX2RlbnNpdHk7CisgICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBwSW5mby0+ZGVuc2l0eV91bml0OworICAgIH0KK30KIHN0YXRpYyBGWF9CT09MIF9KcGVnTG9hZEluZm8oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKQEAgLTYxMywxMCArNjg2LDEwIEBACiAgICAgcC0+bV9TcmNNZ3IubmV4dF9pbnB1dF9ieXRlID0gc3JjX2J1ZjsKICAgICBwLT5tX1NyY01nci5ieXRlc19pbl9idWZmZXIgPSBzcmNfc2l6ZTsKIH0KLWludCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogbkNvbXBzKQoraW50IENDb2RlY19KcGVnTW9kdWxlOjpSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpCiB7CiAgICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmVhZEhlYWRlcihwQ29udGV4dCwgd2lkdGgsIGhlaWdodCwgbkNvbXBzKTsKKyAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5SZWFkSGVhZGVyKHBDb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBuQ29tcHMsIHBBdHRyaWJ1dGUpOwogICAgIH0KICAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7CiAgICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewpAQCAtNjMyLDYgKzcwNSw3IEBACiAgICAgKndpZHRoID0gcC0+bV9JbmZvLmltYWdlX3dpZHRoOwogICAgICpoZWlnaHQgPSBwLT5tX0luZm8uaW1hZ2VfaGVpZ2h0OwogICAgICpuQ29tcHMgPSBwLT5tX0luZm8ubnVtX2NvbXBvbmVudHM7CisgICAgX0pwZWdMb2FkQXR0cmlidXRlKCZwLT5tX0luZm8sIHBBdHRyaWJ1dGUpOwogICAgIHJldHVybiAwOwogfQogRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6U3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3BuZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3BuZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkYWU3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcG5nLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiY29kZWNfaW50LmgiDQorZXh0ZXJuICJDIiB7DQorI3VuZGVmIEZBUg0KKyNpbmNsdWRlICIuLi9meF9scG5nL2luY2x1ZGUvZnhfcG5nLmgiDQorfQ0KK3N0YXRpYyB2b2lkIF9wbmdfZXJyb3JfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKQ0KK3sNCisgICAgaWYocG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cikpIHsNCisgICAgICAgIEZYU1lTX3N0cm5jcHkoKGNoYXIqKXBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpLCBlcnJvcl9tc2csIFBOR19FUlJPUl9TSVpFIC0gMSk7DQorICAgIH0NCisgICAgbG9uZ2ptcChwbmdfam1wYnVmKHBuZ19wdHIpLCAxKTsNCit9DQorc3RhdGljIHZvaWQgX3BuZ193YXJuaW5nX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZykNCit7DQorfQ0KK3N0YXRpYyB2b2lkIF9wbmdfbG9hZF9ibXBfYXR0cmlidXRlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChwQXR0cmlidXRlKSB7DQorI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQ0KKyAgICAgICAgcEF0dHJpYnV0ZS0+bV9uWERQSSA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsIGluZm9fcHRyKTsNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fbllEUEkgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cik7DQorICAgICAgICBwbmdfdWludF8zMiByZXNfeCwgcmVzX3k7DQorICAgICAgICBpbnQgdW5pdF90eXBlOw0KKyAgICAgICAgcG5nX2dldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwgJnVuaXRfdHlwZSk7DQorICAgICAgICBzd2l0Y2ggKHVuaXRfdHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgUE5HX1JFU09MVVRJT05fTUVURVI6DQorICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfTUVURVI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfTk9ORTsNCisgICAgICAgIH0NCisjZW5kaWYNCisjaWYgZGVmaW5lZChQTkdfaUNDUF9TVVBQT1JURUQpDQorICAgICAgICBwbmdfY2hhcnAgaWNjX25hbWU7DQorICAgICAgICBwbmdfYnl0ZXAgaWNjX3Byb2ZpbGU7DQorICAgICAgICBwbmdfdWludF8zMiBpY2NfcHJvZmxlbjsNCisgICAgICAgIGludCBjb21wcmVzc190eXBlOw0KKyAgICAgICAgcG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmaWNjX25hbWUsICZjb21wcmVzc190eXBlLCAmaWNjX3Byb2ZpbGUsICZpY2NfcHJvZmxlbik7DQorI2VuZGlmDQorICAgICAgICBpbnQgYlRpbWUgPSAwOw0KKyNpZiBkZWZpbmVkKFBOR190SU1FX1NVUFBPUlRFRCkNCisgICAgICAgIHBuZ190aW1lcCB0ID0gTlVMTDsNCisgICAgICAgIHBuZ19nZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgJnQpOw0KKyAgICAgICAgaWYgKHQpIHsNCisgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihwQXR0cmlidXRlLT5tX3N0clRpbWUsIDAsIDIwKTsNCisgICAgICAgICAgICBGWFNZU19zcHJpbnRmKChGWF9MUFNUUilwQXR0cmlidXRlLT5tX3N0clRpbWUsICIlNGQ6JTJkOiUyZCAlMmQ6JTJkOiUyZCIsIHQtPnllYXIsIHQtPm1vbnRoLCB0LT5kYXksIHQtPmhvdXIsIHQtPm1pbnV0ZSwgdC0+c2Vjb25kKTsNCisgICAgICAgICAgICBiVGltZSA9IDE7DQorICAgICAgICB9DQorI2VuZGlmDQorI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQ0KKyAgICAgICAgaW50IGk7DQorICAgICAgICBGWF9EV09SRCBsZW47DQorICAgICAgICBGWF9MUENTVFIgYnVmOw0KKyAgICAgICAgaW50IG51bV90ZXh0Ow0KKyAgICAgICAgcG5nX3RleHRwIHRleHQgPSBOVUxMOw0KKyAgICAgICAgcG5nX2dldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgJm51bV90ZXh0KTsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGV4dDsgaSsrKSB7DQorICAgICAgICAgICAgbGVuID0gKEZYX0RXT1JEKUZYU1lTX3N0cmxlbih0ZXh0W2ldLmtleSk7DQorICAgICAgICAgICAgYnVmID0gIlRpbWUiOw0KKyAgICAgICAgICAgIGlmICghRlhTWVNfbWVtY21wMzIoYnVmLCB0ZXh0W2ldLmtleSwgRlhfTUlOKGxlbiwgRlhTWVNfc3RybGVuKGJ1ZikpKSkgew0KKyAgICAgICAgICAgICAgICBpZiAoIWJUaW1lKSB7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihwQXR0cmlidXRlLT5tX3N0clRpbWUsIDAsIDIwKTsNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSwgdGV4dFtpXS50ZXh0LCB0ZXh0W2ldLnRleHRfbGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJ1ZiA9ICJBdXRob3IiOw0KKyAgICAgICAgICAgICAgICBpZiAoIUZYU1lTX21lbWNtcDMyKGJ1ZiwgdGV4dFtpXS5rZXksIEZYX01JTihsZW4sIEZYU1lTX3N0cmxlbihidWYpKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkVtcHR5KCk7DQorICAgICAgICAgICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0ckF1dGhvci5Mb2FkKChGWF9MUEJZVEUpdGV4dFtpXS50ZXh0LCAoRlhfU1RSU0laRSl0ZXh0W2ldLnRleHRfbGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgfQ0KK30NCitzdHJ1Y3QgRlhQTkdfQ29udGV4dCB7DQorICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7DQorICAgIHBuZ19pbmZvcAlpbmZvX3B0cjsNCisgICAgdm9pZCoJCXBhcmVudF9wdHI7DQorICAgIHZvaWQqCQljaGlsZF9wdHI7DQorDQorICAgIHZvaWQqCQkoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOw0KKyAgICB2b2lkCQkoKm1fRnJlZUZ1bmMpKHZvaWQqKTsNCit9Ow0KK2V4dGVybiAiQyIgew0KKyAgICBzdGF0aWMgdm9pZCogX3BuZ19hbGxvY19mdW5jKHVuc2lnbmVkIGludCBzaXplKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7DQorICAgIH0NCisgICAgc3RhdGljIHZvaWQgIF9wbmdfZnJlZV9mdW5jKHZvaWQqIHApDQorICAgIHsNCisgICAgICAgIGlmKHAgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0ZyZWUocCk7DQorICAgICAgICB9DQorICAgIH0NCit9Ow0KK3N0YXRpYyB2b2lkIF9wbmdfZ2V0X2hlYWRlcl9mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikNCit7DQorICAgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7DQorICAgIGlmKHAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX1BuZ01vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgICAgaWYocE1vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcG5nX3VpbnRfMzIgd2lkdGggPSAwLCBoZWlnaHQgPSAwOw0KKyAgICBpbnQgYnBjID0gMCwgY29sb3JfdHlwZSA9IDAgLCBjb2xvcl90eXBlMSA9IDAsIHBhc3MgPSAwOw0KKyAgICBkb3VibGUgZ2FtbWEgPSAxLjA7DQorICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYnBjLCAmY29sb3JfdHlwZSwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICAgIGNvbG9yX3R5cGUxID0gY29sb3JfdHlwZTsNCisgICAgaWYoYnBjID4gOCkgew0KKyAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsNCisgICAgfSBlbHNlIGlmKGJwYyA8IDgpIHsNCisgICAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsNCisgICAgfQ0KKyAgICBicGMgPSA4Ow0KKyAgICBpZihjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsNCisgICAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7DQorICAgIH0NCisgICAgcGFzcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOw0KKyAgICBpZighcE1vZHVsZS0+UmVhZEhlYWRlckNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgd2lkdGgsIGhlaWdodCwgYnBjLCBwYXNzLCAmY29sb3JfdHlwZSwgJmdhbW1hKSkgew0KKyAgICAgICAgcG5nX2Vycm9yKHAtPnBuZ19wdHIsICJSZWFkIEhlYWRlciBDYWxsYmFjayBFcnJvciIpOw0KKyAgICB9DQorICAgIGludCBpbnRlbnQ7DQorICAgIGlmIChwbmdfZ2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsICZpbnRlbnQpKSB7DQorICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGdhbW1hLCAwLjQ1NDU1KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGRvdWJsZSBpbWFnZV9nYW1tYTsNCisgICAgICAgIGlmKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2dhbW1hKSkgew0KKyAgICAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIGltYWdlX2dhbW1hKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBnYW1tYSwgMC40NTQ1NSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgc3dpdGNoKGNvbG9yX3R5cGUpIHsNCisgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToNCisgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTogew0KKyAgICAgICAgICAgICAgICBpZihjb2xvcl90eXBlMSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSB7DQorICAgICAgICAgICAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5KHBuZ19wdHIsIDEsIDAuMjk5LCAwLjU4Nyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6DQorICAgICAgICAgICAgaWYoY29sb3JfdHlwZTEgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgew0KKyAgICAgICAgICAgICAgICBwbmdfZXJyb3IocC0+cG5nX3B0ciwgIk5vdCBTdXBwb3J0IE91dHB1dCBQYWxldHRlIE5vdyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOg0KKyAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6DQorICAgICAgICAgICAgaWYoIShjb2xvcl90eXBlMSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkgew0KKyAgICAgICAgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZighKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpIHsNCisgICAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7DQorICAgIH0NCisgICAgaWYoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBICYmICEoY29sb3JfdHlwZTEgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpIHsNCisgICAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDB4ZmYsIFBOR19GSUxMRVJfQUZURVIpOw0KKyAgICB9DQorICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorc3RhdGljIHZvaWQgX3BuZ19nZXRfZW5kX2Z1bmMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSB7fQ0KK3N0YXRpYyB2b2lkIF9wbmdfZ2V0X3Jvd19mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LCBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcykNCit7DQorICAgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7DQorICAgIGlmKHAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX1BuZ01vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgICAgRlhfTFBCWVRFIHNyY19idWYgPSBOVUxMOw0KKyAgICBpZighcE1vZHVsZS0+QXNrU2NhbmxpbmVCdWZDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJvd19udW0sIHNyY19idWYpKSB7DQorICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkFzayBTY2FubGluZSBidWZmZXIgQ2FsbGJhY2sgRXJyb3IiKTsNCisgICAgfQ0KKyAgICBpZihzcmNfYnVmICE9IE5VTEwpIHsNCisgICAgICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBzcmNfYnVmLCBuZXdfcm93KTsNCisgICAgfQ0KKyAgICBwTW9kdWxlLT5GaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHBhc3MsIHJvd19udW0pOw0KK30NCit2b2lkKiBDQ29kZWNfUG5nTW9kdWxlOjpTdGFydCh2b2lkKiBwTW9kdWxlKQ0KK3sNCisgICAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoRlhQTkdfQ29udGV4dCkpOw0KKyAgICBpZihwID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHAtPm1fQWxsb2NGdW5jID0gX3BuZ19hbGxvY19mdW5jOw0KKyAgICBwLT5tX0ZyZWVGdW5jID0gX3BuZ19mcmVlX2Z1bmM7DQorICAgIHAtPnBuZ19wdHIgPSBOVUxMOw0KKyAgICBwLT5pbmZvX3B0ciA9IE5VTEw7DQorICAgIHAtPnBhcmVudF9wdHIgPSAodm9pZCopdGhpczsNCisgICAgcC0+Y2hpbGRfcHRyID0gcE1vZHVsZTsNCisgICAgcC0+cG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisgICAgaWYgKHAtPnBuZ19wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShwKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHAtPmluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwLT5wbmdfcHRyKTsNCisgICAgaWYgKHAtPmluZm9fcHRyID09IE5VTEwpIHsNCisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCYocC0+cG5nX3B0ciksIChwbmdfaW5mb3BwKU5VTEwsIChwbmdfaW5mb3BwKU5VTEwpOw0KKyAgICAgICAgRlhfRnJlZShwKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwLT5wbmdfcHRyKSkpIHsNCisgICAgICAgIGlmKHAgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCYocC0+cG5nX3B0ciksICYocC0+aW5mb19wdHIpLCAocG5nX2luZm9wcClOVUxMKTsNCisgICAgICAgICAgICBGWF9GcmVlKHApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHAtPnBuZ19wdHIsIHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcG5nX2dldF9oZWFkZXJfZnVuYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbmdfZ2V0X3Jvd19mdW5jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BuZ19nZXRfZW5kX2Z1bmMpOw0KKyAgICBwbmdfc2V0X2Vycm9yX2ZuKHAtPnBuZ19wdHIsIG1fc3pMYXN0RXJyb3IsIChwbmdfZXJyb3JfcHRyKV9wbmdfZXJyb3JfZGF0YSwgKHBuZ19lcnJvcl9wdHIpX3BuZ193YXJuaW5nX2RhdGEpOw0KKyAgICByZXR1cm4gcDsNCit9DQordm9pZCBDQ29kZWNfUG5nTW9kdWxlOjpGaW5pc2godm9pZCogcENvbnRleHQpDQorew0KKyAgICBGWFBOR19Db250ZXh0KiBwID0gKEZYUE5HX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgICBpZihwICE9IE5VTEwpIHsNCisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCYocC0+cG5nX3B0ciksICYocC0+aW5mb19wdHIpLCAocG5nX2luZm9wcClOVUxMKTsNCisgICAgICAgIHAtPm1fRnJlZUZ1bmMocCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDQ29kZWNfUG5nTW9kdWxlOjpJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkNCit7DQorICAgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcENvbnRleHQ7DQorICAgIGlmKHNldGptcChwbmdfam1wYnVmKHAtPnBuZ19wdHIpKSkgew0KKyAgICAgICAgaWYgKHBBdHRyaWJ1dGUgJiYgMCA9PSBGWFNZU19zdHJjbXAobV9zekxhc3RFcnJvciwgIlJlYWQgSGVhZGVyIENhbGxiYWNrIEVycm9yIikpIHsNCisgICAgICAgICAgICBfcG5nX2xvYWRfYm1wX2F0dHJpYnV0ZShwLT5wbmdfcHRyLCBwLT5pbmZvX3B0ciwgcEF0dHJpYnV0ZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcG5nX3Byb2Nlc3NfZGF0YShwLT5wbmdfcHRyLCBwLT5pbmZvX3B0ciwgKEZYX0xQQllURSlzcmNfYnVmLCBzcmNfc2l6ZSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcApAQCAtMCwwICsxLDIyNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgImZ4X2NvZGVjX3Byb2dyZXNzLmgiDQordm9pZCBDRlhDT0RFQ19XZWlnaHRUYWJsZTo6Q2FsYyhpbnQgZGVzdF9sZW4sIGludCBkZXN0X21pbiwgaW50IGRlc3RfbWF4LCBpbnQgc3JjX2xlbiwgaW50IHNyY19taW4sIGludCBzcmNfbWF4LCBGWF9CT09MIGJJbnRlcnBvbCkNCit7DQorICAgIGlmIChtX3BXZWlnaHRUYWJsZXMpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgICAgfQ0KKyAgICBkb3VibGUgc2NhbGUsIGJhc2U7DQorICAgIHNjYWxlID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoc3JjX2xlbiksIChGWF9GTE9BVCkoZGVzdF9sZW4pKTsNCisgICAgaWYgKGRlc3RfbGVuIDwgMCkgew0KKyAgICAgICAgYmFzZSA9IChGWF9GTE9BVCkoc3JjX2xlbik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBiYXNlID0gMC4wZjsNCisgICAgfQ0KKyAgICBtX0l0ZW1TaXplID0gKGludCkoc2l6ZW9mKGludCkgKiAyICsgc2l6ZW9mKGludCkgKiAoRlhTWVNfY2VpbChGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkpICsgMSkpOw0KKyAgICBtX0Rlc3RNaW4gPSBkZXN0X21pbjsNCisgICAgbV9wV2VpZ2h0VGFibGVzID0gRlhfQWxsb2MoRlhfQllURSwgKGRlc3RfbWF4IC0gZGVzdF9taW4pICogbV9JdGVtU2l6ZSArIDQpOw0KKyAgICBpZihtX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkgPCAxLjBmKSB7DQorICAgICAgICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgZGVzdF9waXhlbCArKykgew0KKyAgICAgICAgICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOw0KKyAgICAgICAgICAgIGRvdWJsZSBzcmNfcG9zID0gZGVzdF9waXhlbCAqIHNjYWxlICsgc2NhbGUgLyAyICsgYmFzZTsNCisgICAgICAgICAgICBpZiAoYkludGVycG9sKSB7DQorICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7DQorICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zICsgMS4wZiAvIDIpOw0KKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgc3JjX21pbikgew0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7DQorICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3JjX21heCAtIDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSB7DQorICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHNyY19wb3MgLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxLjBmIC8gMikgKiA2NTUzNik7DQorICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2IC0gcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3Bvcyk7DQorICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGZvciAoaW50IGRlc3RfcGl4ZWwgPSBkZXN0X21pbjsgZGVzdF9waXhlbCA8IGRlc3RfbWF4OyBkZXN0X3BpeGVsICsrKSB7DQorICAgICAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsNCisgICAgICAgIGRvdWJsZSBzcmNfc3RhcnQgPSBkZXN0X3BpeGVsICogc2NhbGUgKyBiYXNlOw0KKyAgICAgICAgZG91YmxlIHNyY19lbmQgPSBzcmNfc3RhcnQgKyBzY2FsZTsNCisgICAgICAgIGludCBzdGFydF9pLCBlbmRfaTsNCisgICAgICAgIGlmIChzcmNfc3RhcnQgPCBzcmNfZW5kKSB7DQorICAgICAgICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19zdGFydCk7DQorICAgICAgICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19lbmQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2VuZCk7DQorICAgICAgICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19zdGFydCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoc3RhcnRfaSA8IHNyY19taW4pIHsNCisgICAgICAgICAgICBzdGFydF9pID0gc3JjX21pbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlbmRfaSA+PSBzcmNfbWF4KSB7DQorICAgICAgICAgICAgZW5kX2kgPSBzcmNfbWF4IC0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChzdGFydF9pID4gZW5kX2kpIHsNCisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOw0KKyAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzdGFydF9pOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsNCisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmRfaTsNCisgICAgICAgIGZvciAoaW50IGogPSBzdGFydF9pOyBqIDw9IGVuZF9pOyBqICsrKSB7DQorICAgICAgICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqKSAtIGJhc2UsIHNjYWxlKTsNCisgICAgICAgICAgICBkb3VibGUgZGVzdF9lbmQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqICsgMSkgLSBiYXNlLCBzY2FsZSk7DQorICAgICAgICAgICAgaWYgKGRlc3Rfc3RhcnQgPiBkZXN0X2VuZCkgew0KKyAgICAgICAgICAgICAgICBkb3VibGUgdGVtcCA9IGRlc3Rfc3RhcnQ7DQorICAgICAgICAgICAgICAgIGRlc3Rfc3RhcnQgPSBkZXN0X2VuZDsNCisgICAgICAgICAgICAgICAgZGVzdF9lbmQgPSB0ZW1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkb3VibGUgYXJlYV9zdGFydCA9IGRlc3Rfc3RhcnQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpID8gZGVzdF9zdGFydCA6IChGWF9GTE9BVCkoZGVzdF9waXhlbCk7DQorICAgICAgICAgICAgZG91YmxlIGFyZWFfZW5kID0gZGVzdF9lbmQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKSA/IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpIDogZGVzdF9lbmQ7DQorICAgICAgICAgICAgZG91YmxlIHdlaWdodCA9IGFyZWFfc3RhcnQgPj0gYXJlYV9lbmQgPyAwLjBmIDogYXJlYV9lbmQgLSBhcmVhX3N0YXJ0Ow0KKyAgICAgICAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7DQorICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1tqIC0gc3RhcnRfaV0gPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHdlaWdodCAqIDY1NTM2KSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRlhDT0RFQ19Ib3J6VGFibGU6OkNhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbiwgRlhfQk9PTCBiSW50ZXJwb2wpDQorew0KKyAgICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQorICAgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQorICAgIH0NCisgICAgZG91YmxlIHNjYWxlID0gKGRvdWJsZSlkZXN0X2xlbiAvIChkb3VibGUpc3JjX2xlbjsNCisgICAgbV9JdGVtU2l6ZSA9IHNpemVvZihpbnQpICogNDsNCisgICAgaW50IHNpemUgPSBkZXN0X2xlbiAqIG1fSXRlbVNpemUgKyA0Ow0KKyAgICBtX3BXZWlnaHRUYWJsZXMgPSBGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsNCisgICAgaWYobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpCXsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihtX3BXZWlnaHRUYWJsZXMsIDAsIHNpemUpOw0KKyAgICBpZihzY2FsZSA+IDEpIHsNCisgICAgICAgIGludCBwcmVfZGVzX2NvbCA9IDA7DQorICAgICAgICBmb3IgKGludCBzcmNfY29sID0gMDsgc3JjX2NvbCA8IHNyY19sZW47IHNyY19jb2wrKykgew0KKyAgICAgICAgICAgIGRvdWJsZSBkZXNfY29sX2YgPSBzcmNfY29sICogc2NhbGU7DQorICAgICAgICAgICAgaW50IGRlc19jb2wgPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpZGVzX2NvbF9mKTsNCisgICAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2wgKiBtX0l0ZW1TaXplKTsNCisgICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KKyAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgICAgICAgICAgaWYoc3JjX2NvbCA9PSBzcmNfbGVuIC0gMSAmJiBkZXNfY29sIDwgZGVzdF9sZW4gLSAxKSB7DQorICAgICAgICAgICAgICAgIGZvciAoaW50IGRlc19jb2xfaW5kZXggPSBwcmVfZGVzX2NvbCArIDE7IGRlc19jb2xfaW5kZXggPCBkZXN0X2xlbjsgZGVzX2NvbF9pbmRleCsrKSB7DQorICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX2NvbF9pbmRleCAqIG1fSXRlbVNpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsNCisgICAgICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGludCBkZXNfY29sX2xlbiA9IGRlc19jb2wgLSBwcmVfZGVzX2NvbDsNCisgICAgICAgICAgICBmb3IgKGludCBkZXNfY29sX2luZGV4ID0gcHJlX2Rlc19jb2wgKyAxOyBkZXNfY29sX2luZGV4IDwgZGVzX2NvbDsgZGVzX2NvbF9pbmRleCsrKSB7DQorICAgICAgICAgICAgICAgIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBkZXNfY29sX2luZGV4ICogbV9JdGVtU2l6ZSk7DQorICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzcmNfY29sIC0gMTsNCisgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KKyAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSBiSW50ZXJwb2wgPyBGWFNZU19yb3VuZCgoRlhfRkxPQVQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlhfRkxPQVQpZGVzX2NvbCAtIChGWF9GTE9BVClkZXNfY29sX2luZGV4KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoRlhfRkxPQVQpZGVzX2NvbF9sZW4gKiA2NTUzNg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IDY1NTM2Ow0KKyAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSA2NTUzNiAtIHBXZWlnaHQtPm1fV2VpZ2h0c1swXTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcHJlX2Rlc19jb2wgPSBkZXNfY29sOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgZGVzdF9sZW47IGRlc19jb2wrKykgew0KKyAgICAgICAgZG91YmxlIHNyY19jb2xfZiA9IGRlc19jb2wgLyBzY2FsZTsNCisgICAgICAgIGludCBzcmNfY29sID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKXNyY19jb2xfZik7DQorICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2wgKiBtX0l0ZW1TaXplKTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBwV2VpZ2h0LT5tX1NyY0VuZCA9IHNyY19jb2w7DQorICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgIH0NCit9DQordm9pZCBDRlhDT0RFQ19WZXJ0VGFibGU6OkNhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbikNCit7DQorICAgIGlmIChtX3BXZWlnaHRUYWJsZXMpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgICAgfQ0KKyAgICBkb3VibGUgc2NhbGUgPSAoZG91YmxlKWRlc3RfbGVuIC8gKGRvdWJsZSlzcmNfbGVuOw0KKyAgICBtX0l0ZW1TaXplID0gc2l6ZW9mKGludCkgKiA0Ow0KKyAgICBpbnQgc2l6ZSA9IGRlc3RfbGVuICogbV9JdGVtU2l6ZSArIDQ7DQorICAgIG1fcFdlaWdodFRhYmxlcyA9IEZYX0FsbG9jKEZYX0JZVEUsIHNpemUpOw0KKyAgICBpZihtX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDMyKG1fcFdlaWdodFRhYmxlcywgMCwgc2l6ZSk7DQorICAgIGlmKHNjYWxlID4gMSkgew0KKyAgICAgICAgZG91YmxlIHN0ZXAgPSAwLjA7DQorICAgICAgICBpbnQgc3JjX3JvdyA9IDA7DQorICAgICAgICB3aGlsZSAoIHN0ZXAgPCAoZG91YmxlKWRlc3RfbGVuICkgew0KKyAgICAgICAgICAgIGludCBzdGFydF9zdGVwID0gKGludClzdGVwOw0KKyAgICAgICAgICAgIHN0ZXAgPSBzY2FsZSAqICgrK3NyY19yb3cpOw0KKyAgICAgICAgICAgIGludCBlbmRfc3RlcCA9IChpbnQpc3RlcDsNCisgICAgICAgICAgICBpZihlbmRfc3RlcCA+PSBkZXN0X2xlbikgew0KKyAgICAgICAgICAgICAgICBlbmRfc3RlcCA9IGRlc3RfbGVuOw0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBkZXNfcm93ID0gc3RhcnRfc3RlcDsgZGVzX3JvdyA8IGVuZF9zdGVwOyBkZXNfcm93KyspIHsNCisgICAgICAgICAgICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX3JvdyAqIG1fSXRlbVNpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY0VuZCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZW5kX3N0ZXAgLSBzdGFydF9zdGVwOw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBzdGFydF9zdGVwICogbV9JdGVtU2l6ZSk7DQorICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzdGFydF9zdGVwOw0KKyAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY0VuZCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IgKGludCBkZXNfcm93ID0gc3RhcnRfc3RlcCArIDE7IGRlc19yb3cgPCBlbmRfc3RlcDsgZGVzX3JvdysrKSB7DQorICAgICAgICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX3JvdyAqIG1fSXRlbVNpemUpOw0KKyAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gc3RhcnRfc3RlcDsNCisgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBlbmRfc3RlcDsNCisgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShlbmRfc3RlcCAtIGRlc19yb3cpIC8gKEZYX0ZMT0FUKWxlbmd0aCAqIDY1NTM2KTsNCisgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gNjU1MzYgLSBwV2VpZ2h0LT5tX1dlaWdodHNbMF07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZm9yIChpbnQgZGVzX3JvdyA9IDA7IGRlc19yb3cgPCBkZXN0X2xlbjsgZGVzX3JvdysrKSB7DQorICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBkZXNfcm93ICogbV9JdGVtU2l6ZSk7DQorICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IGRlc19yb3c7DQorICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBkZXNfcm93Ow0KKyAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgICAgICB9DQorICAgIH0NCit9DQorQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Q0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcihDQ29kZWNfTW9kdWxlTWdyKiBwQ29kZWNNZ3IpDQorew0KKyAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgbV9wSnBlZ0NvbnRleHQgPSBOVUxMOw0KKyAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgbV9wR2lmQ29udGV4dCA9IE5VTEw7DQorICAgIG1fcEJtcENvbnRleHQgPSBOVUxMOw0KKyAgICBtX3BUaWZmQ29udGV4dCA9IE5VTEw7DQorICAgIG1fcENvZGVjTWdyID0gTlVMTDsNCisgICAgbV9wU3JjQnVmID0gTlVMTDsNCisgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgbV9wU3JjUGFsZXR0ZSA9IE5VTEw7DQorICAgIG1fcENvZGVjTWdyID0gcENvZGVjTWdyOw0KKyAgICBtX29mZlNldCA9IDA7DQorICAgIG1fU3JjU2l6ZSA9IDA7DQorICAgIG1fU2NhbmxpbmVTaXplID0gMDsNCisgICAgbV9TcmNXaWR0aCA9IG1fU3JjSGVpZ2h0ID0gMDsNCisgICAgbV9TcmNDb21wb25lbnRzID0gMDsNCisgICAgbV9TcmNCUEMgPSAwOw0KKyAgICBtX1NyY1Bhc3NOdW1iZXIgPSAwOw0KKyAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KKyAgICBtX2ltYWdUeXBlID0gRlhDT0RFQ19JTUFHRV9VTktOT1dOOw0KKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgIG1fVHJhbnNNZXRob2QgPSAtMTsNCisgICAgbV9TcmNSb3cgPSAwOw0KKyAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfSW52YWxpZDsNCisgICAgbV9iSW50ZXJwb2wgPSBUUlVFOw0KKyAgICBtX0ZyYW1lTnVtYmVyID0gMDsNCisgICAgbV9GcmFtZUN1ciA9IDA7DQorICAgIG1fU3JjUGFsZXR0ZU51bWJlciA9IDA7DQorICAgIG1fR2lmUGx0TnVtYmVyID0gMDsNCisgICAgbV9HaWZCZ0luZGV4ID0gMDsNCisgICAgbV9wR2lmUGFsZXR0ZSA9IE5VTEw7DQorICAgIG1fR2lmVHJhbnNJbmRleCA9IC0xOw0KKyAgICBtX0dpZkZyYW1lUmVjdCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQorICAgIG1fQm1wSXNUb3BCb3R0b20gPSBGQUxTRTsNCit9DQorQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6fkNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoKQ0KK3sNCisgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgIGlmKG1fcEpwZWdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCktPkZpbmlzaChtX3BKcGVnQ29udGV4dCk7DQorICAgIH0NCisgICAgaWYobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCktPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCisgICAgfQ0KKyAgICBpZihtX3BHaWZDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOw0KKyAgICB9DQorICAgIGlmKG1fcEJtcENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpLT5GaW5pc2gobV9wQm1wQ29udGV4dCk7DQorICAgIH0NCisgICAgaWYobV9wVGlmZkNvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wQ29kZWNNZ3ItPkdldFRpZmZNb2R1bGUoKS0+RGVzdHJveURlY29kZXIobV9wVGlmZkNvbnRleHQpOw0KKyAgICB9DQorICAgIGlmKG1fcFNyY0J1ZiAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKG1fcFNyY0J1Zik7DQorICAgIH0NCisgICAgaWYobV9wRGVjb2RlQnVmICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsNCisgICAgfQ0KKyAgICBpZihtX3BTcmNQYWxldHRlICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpKcGVnUmVhZE1vcmVEYXRhKElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSwgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpDQorew0KKyAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KKyAgICBpZiAoZHdTaXplIDw9IG1fb2ZmU2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7DQorICAgIEZYX0RXT1JEIGR3QXZhaWwgPSBwSnBlZ01vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BKcGVnQ29udGV4dCwgTlVMTCk7DQorICAgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgew0KKyAgICAgICAgaWYgKGR3U2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSkgew0KKyAgICAgICAgICAgIGR3U2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgICAgICAgIH0NCisgICAgICAgIG1fU3JjU2l6ZSA9IChkd1NpemUgKyBkd0F2YWlsICsgRlhDT0RFQ19CTE9DS19TSVpFIC0gMSkgLyBGWENPREVDX0JMT0NLX1NJWkUgKiBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgICAgICBtX3BTcmNCdWYgPSBGWF9SZWFsbG9jKEZYX0JZVEUsIG1fcFNyY0J1ZiwgbV9TcmNTaXplKTsNCisgICAgICAgIGlmICghbV9wU3JjQnVmKSB7DQorICAgICAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRFdPUkQgZHdDb25zdW1lID0gbV9TcmNTaXplIC0gZHdBdmFpbDsNCisgICAgICAgIGlmIChkd0F2YWlsKSB7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KKyAgICAgICAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYgKyBkd0F2YWlsLCBtX29mZlNldCwgZHdTaXplKSkgew0KKyAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsNCisgICAgcEpwZWdNb2R1bGUtPklucHV0KG1fcEpwZWdDb250ZXh0LCBtX3BTcmNCdWYsIGR3U2l6ZSArIGR3QXZhaWwpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdSZWFkSGVhZGVyRnVuYyh2b2lkKiBwTW9kdWxlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicGMsIGludCBwYXNzLCBpbnQqIGNvbG9yX3R5cGUsIGRvdWJsZSogZ2FtbWEpDQorew0KKyAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgICAgaWYocENvZGVjLT5tX3BEZXZpY2VCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgcENvZGVjLT5tX1NyY1dpZHRoID0gd2lkdGg7DQorICAgICAgICBwQ29kZWMtPm1fU3JjSGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgICAgICAgcENvZGVjLT5tX1NyY0JQQyA9IGJwYzsNCisgICAgICAgIHBDb2RlYy0+bV9TcmNQYXNzTnVtYmVyID0gcGFzczsNCisgICAgICAgIHBDb2RlYy0+bV9TcmNDb21wb25lbnRzID0gKmNvbG9yX3R5cGUgPT0gMCA/IDEgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29sb3JfdHlwZSA9PSAyID8gMyA6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2xvcl90eXBlID09IDMgPyA0IDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbG9yX3R5cGUgPT0gNCA/IDIgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29sb3JfdHlwZSA9PSA2ID8gNCA6IDA7DQorICAgICAgICBwQ29kZWMtPm1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgd2lkdGgsIGhlaWdodCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKTsNCisgICAgc3dpdGNoKGZvcm1hdCkgew0KKyAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6DQorICAgICAgICAgICAgKmNvbG9yX3R5cGUgPSAwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgICAgKmNvbG9yX3R5cGUgPSAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoNCisgICAgICAgIGNhc2UgRlhESUJfQXJnYjoNCisgICAgICAgICAgICAqY29sb3JfdHlwZSA9IDY7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgICpnYW1tYSA9IEZYQ09ERUNfUE5HX0dBTU1BOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdBc2tTY2FubGluZUJ1ZkZ1bmModm9pZCogcE1vZHVsZSwgaW50IGxpbmUsIEZYX0xQQllURSYgc3JjX2J1ZikNCit7DQorICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KKyAgICBBU1NFUlQocERJQml0bWFwICE9IE5VTEwpOw0KKyAgICBpZihwRElCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmKGxpbmUgPj0gcENvZGVjLT5tX2NsaXBCb3gudG9wICYmIGxpbmUgPCBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b20pIHsNCisgICAgICAgIGRvdWJsZSBzY2FsZV95ID0gKGRvdWJsZSlwQ29kZWMtPm1fc2l6ZVkgLyAoZG91YmxlKXBDb2RlYy0+bV9jbGlwQm94LkhlaWdodCgpOw0KKyAgICAgICAgRlhfSU5UMzIgcm93ID0gKEZYX0lOVDMyKSgobGluZSAtIHBDb2RlYy0+bV9jbGlwQm94LnRvcCkgKiBzY2FsZV95KSArIHBDb2RlYy0+bV9zdGFydFk7DQorICAgICAgICBGWF9MUEJZVEUgc3JjX3NjYW4gPSAoRlhfTFBCWVRFKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCisgICAgICAgIEZYX0xQQllURSBkZXNfc2NhbiA9IHBDb2RlYy0+bV9wRGVjb2RlQnVmOw0KKyAgICAgICAgc3JjX2J1ZiA9IHBDb2RlYy0+bV9wRGVjb2RlQnVmOw0KKyAgICAgICAgRlhfSU5UMzIgc3JjX0JwcCA9IHBESUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsNCisgICAgICAgIEZYX0lOVDMyIGRlc19CcHAgPSAocENvZGVjLT5tX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQorICAgICAgICBGWF9JTlQzMiBzcmNfbGVmdCA9IHBDb2RlYy0+bV9zdGFydFg7DQorICAgICAgICBGWF9JTlQzMiBkZXNfbGVmdCA9IHBDb2RlYy0+bV9jbGlwQm94LmxlZnQ7DQorICAgICAgICBzcmNfc2NhbiArPSBzcmNfbGVmdCAqIHNyY19CcHA7DQorICAgICAgICBkZXNfc2NhbiArPSBkZXNfbGVmdCAqIGRlc19CcHA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIHNyY19jb2wgPSAwOyBzcmNfY29sIDwgcENvZGVjLT5tX3NpemVYOyBzcmNfY29sKyspIHsNCisgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IHBDb2RlYy0+bV9XZWlnaHRIb3J6T08uR2V0UGl4ZWxXZWlnaHQoc3JjX2NvbCk7DQorICAgICAgICAgICAgaWYocFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydCAhPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3dpdGNoKHBESUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYocERJQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19nID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiBzcmNfc2NhbltzcmNfY29sXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XSA9IChGWF9CWVRFKShkZXNfZyA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgcCA9IHNyY19zY2FuICsgc3JjX2NvbCAqIHNyY19CcHA7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBwRGVzID0gJmRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBkZXNfQnBwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcERlcysrID0gKEZYX0JZVEUpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpwRGVzKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXMJPSAoRlhfQllURSkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHAgPSBzcmNfc2NhbiArIHNyY19jb2wgKiBzcmNfQnBwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBwRGVzID0gJmRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBkZXNfQnBwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcERlcysrID0gKEZYX0JZVEUpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpwRGVzKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXMrKwk9IChGWF9CWVRFKSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcERlcwk9ICpwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIEZYX0lOVDMyIGRlc19saW5lLCBGWF9MUEJZVEUgc3JjX3NjYW4sIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpDQorew0KKyAgICBGWF9MUEJZVEUgZGVzX3NjYW4gPSAoRlhfTFBCWVRFKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19saW5lKTsNCisgICAgRlhfSU5UMzIgc3JjX0JwcCA9IChtX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQorICAgIEZYX0lOVDMyIGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgICBGWF9JTlQzMiBzcmNfbGVmdCA9IG1fY2xpcEJveC5sZWZ0Ow0KKyAgICBGWF9JTlQzMiBkZXNfbGVmdCA9IG1fc3RhcnRYOw0KKyAgICBzcmNfc2NhbiArPSBzcmNfbGVmdCAqIHNyY19CcHA7DQorICAgIGRlc19zY2FuICs9IGRlc19sZWZ0ICogZGVzX0JwcDsNCisgICAgZm9yIChGWF9JTlQzMiBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodEhvcnpPTy5HZXRQaXhlbFdlaWdodChkZXNfY29sKTsNCisgICAgICAgIHN3aXRjaChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KKyAgICAgICAgICAgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2cgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogc3JjX3NjYW5bcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQorICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiBzcmNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZF07DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKShkZXNfZyA+PiAxNik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgcCA9IHNyY19zY2FuOw0KKyAgICAgICAgICAgICAgICAgICAgcCA9IHNyY19zY2FuICsgcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydCAqIHNyY19CcHA7DQorICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnApOw0KKyAgICAgICAgICAgICAgICAgICAgcCA9IHNyY19zY2FuICsgcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQgKiBzcmNfQnBwOw0KKyAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKyspOw0KKyAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKyspOw0KKyAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKTsNCisgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHAgLSAzOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2EgPSAwLCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBwID0gc3JjX3NjYW47DQorICAgICAgICAgICAgICAgICAgICBwID0gc3JjX3NjYW4gKyBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0ICogc3JjX0JwcDsNCisgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCk7DQorICAgICAgICAgICAgICAgICAgICBwID0gc3JjX3NjYW4gKyBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZCAqIHNyY19CcHA7DQorICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICAgICAgICAgICAgICBkZXNfYSArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnApOw0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19hKSA+PiAxNik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkRnVuYyh2b2lkKiBwTW9kdWxlLCBpbnQgcGFzcywgaW50IGxpbmUpDQorew0KKyAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgICAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCisgICAgaW50IHNyY190b3AgPSBwQ29kZWMtPm1fY2xpcEJveC50b3A7DQorICAgIGludCBzcmNfYm90dG9tID0gcENvZGVjLT5tX2NsaXBCb3guYm90dG9tOw0KKyAgICBpbnQgZGVzX3RvcCA9IHBDb2RlYy0+bV9zdGFydFk7DQorICAgIGludCBzcmNfaGVpID0gcENvZGVjLT5tX2NsaXBCb3guSGVpZ2h0KCk7DQorICAgIGludCBkZXNfaGVpID0gcENvZGVjLT5tX3NpemVZOw0KKyAgICBpZihsaW5lID49IHNyY190b3AgJiYgbGluZSA8IHNyY19ib3R0b20pIHsNCisgICAgICAgIGRvdWJsZSBzY2FsZV95ID0gKGRvdWJsZSlkZXNfaGVpIC8gKGRvdWJsZSlzcmNfaGVpOw0KKyAgICAgICAgaW50IHNyY19yb3cgPSBsaW5lIC0gc3JjX3RvcDsNCisgICAgICAgIGludCBkZXNfcm93ID0gKGludCkoc3JjX3JvdyAqIHNjYWxlX3kpICArIGRlc190b3A7DQorICAgICAgICBpZihkZXNfcm93ID49IGRlc190b3AgKyBkZXNfaGVpKQl7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcENvZGVjLT5QbmdPbmVPbmVNYXBSZXNhbXBsZUhvcnoocERJQml0bWFwLCBkZXNfcm93LCBwQ29kZWMtPm1fcERlY29kZUJ1ZiwgcENvZGVjLT5tX1NyY0Zvcm1hdCk7DQorICAgICAgICBpZihwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9PSAxICYmIHNjYWxlX3kgPiAxLjApIHsNCisgICAgICAgICAgICBwQ29kZWMtPlJlc2FtcGxlVmVydChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHBhc3MgPT0gNiAmJiBzY2FsZV95ID4gMS4wKSB7DQorICAgICAgICAgICAgcENvZGVjLT5SZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZlJlYWRNb3JlRGF0YShJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlLCBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cykNCit7DQorICAgIEZYX0RXT1JEIGR3U2l6ZSA9IChGWF9EV09SRCltX3BGaWxlLT5HZXRTaXplKCk7DQorICAgIGlmIChkd1NpemUgPD0gbV9vZmZTZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBkd1NpemUgPSBkd1NpemUgLSBtX29mZlNldDsNCisgICAgRlhfRFdPUkQgZHdBdmFpbCA9IHBHaWZNb2R1bGUtPkdldEF2YWlsSW5wdXQobV9wR2lmQ29udGV4dCwgTlVMTCk7DQorICAgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgew0KKyAgICAgICAgaWYgKGR3U2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSkgew0KKyAgICAgICAgICAgIGR3U2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgICAgICAgIH0NCisgICAgICAgIG1fU3JjU2l6ZSA9IChkd1NpemUgKyBkd0F2YWlsICsgRlhDT0RFQ19CTE9DS19TSVpFIC0gMSkgLyBGWENPREVDX0JMT0NLX1NJWkUgKiBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgICAgICBtX3BTcmNCdWYgPSBGWF9SZWFsbG9jKEZYX0JZVEUsIG1fcFNyY0J1ZiwgbV9TcmNTaXplKTsNCisgICAgICAgIGlmICghbV9wU3JjQnVmKSB7DQorICAgICAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRFdPUkQgZHdDb25zdW1lID0gbV9TcmNTaXplIC0gZHdBdmFpbDsNCisgICAgICAgIGlmIChkd0F2YWlsKSB7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KKyAgICAgICAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYgKyBkd0F2YWlsLCBtX29mZlNldCwgZHdTaXplKSkgew0KKyAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsNCisgICAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQmIGN1cl9wb3MpDQorew0KKyAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgICAgRlhfRFdPUkQgcmVtYWluX3NpemUgPSBwQ29kZWMtPm1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+R2V0QXZhaWxJbnB1dChwQ29kZWMtPm1fcEdpZkNvbnRleHQpOw0KKyAgICBjdXJfcG9zID0gcENvZGVjLT5tX29mZlNldCAtIHJlbWFpbl9zaXplOw0KK30NCitGWF9MUEJZVEUgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmQXNrTG9jYWxQYWxldHRlQnVmQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgRlhfSU5UMzIgZnJhbWVfbnVtLCBGWF9JTlQzMiBwYWxfc2l6ZSkNCit7DQorICAgIHJldHVybiBGWF9BbGxvYyhGWF9CWVRFLCBwYWxfc2l6ZSk7DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MsIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywNCisgICAgICAgIEZYX0lOVDMyIHBhbF9udW0sIHZvaWQqIHBhbF9wdHIsDQorICAgICAgICBGWF9JTlQzMiBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQorICAgICAgICBGWF9JTlQzMiB0cmFuc19pbmRleCwgRlhfSU5UMzIgZGlzcG9zYWxfbWV0aG9kLCBGWF9CT09MIGludGVybGFjZSkNCit7DQorICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgICBwQ29kZWMtPm1fb2ZmU2V0ID0gcmNkX3BvczsNCisgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgIGlmKCFwQ29kZWMtPkdpZlJlYWRNb3JlRGF0YShwQ29kZWMtPm1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQQllURSBwUGFsZXR0ZSA9IE5VTEw7DQorICAgIGlmKHBhbF9udW0gIT0gMCAmJiBwYWxfcHRyKSB7DQorICAgICAgICBwUGFsZXR0ZSA9IChGWF9MUEJZVEUpcGFsX3B0cjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBhbF9udW0gPSBwQ29kZWMtPm1fR2lmUGx0TnVtYmVyOw0KKyAgICAgICAgcFBhbGV0dGUgPSBwQ29kZWMtPm1fcEdpZlBhbGV0dGU7DQorICAgIH0NCisgICAgaWYocENvZGVjLT5tX3BTcmNQYWxldHRlID09IE5VTEwpIHsNCisgICAgICAgIHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0FSR0IsIHBhbF9udW0pOw0KKyAgICB9IGVsc2UgaWYocGFsX251bSA+IHBDb2RlYy0+bV9TcmNQYWxldHRlTnVtYmVyKSB7DQorICAgICAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGUgPSBGWF9SZWFsbG9jKEZYX0FSR0IsIHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSwgcGFsX251bSk7DQorICAgIH0NCisgICAgaWYocENvZGVjLT5tX3BTcmNQYWxldHRlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBwQ29kZWMtPm1fU3JjUGFsZXR0ZU51bWJlciA9IHBhbF9udW07DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX251bTsgaSsrKSB7DQorICAgICAgICByZWdpc3RlciBGWF9EV09SRCBqID0gaSAqIDM7DQorICAgICAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGVbaV0gPQ0KKyAgICAgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgcFBhbGV0dGVbal0sIHBQYWxldHRlW2ogKyAxXSwgcFBhbGV0dGVbaiArIDJdKTsNCisgICAgfQ0KKyAgICBwQ29kZWMtPm1fR2lmVHJhbnNJbmRleCA9IHRyYW5zX2luZGV4Ow0KKyAgICBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0ID0gaW1nX3JjOw0KKyAgICBwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9IGludGVybGFjZSA/IDQgOiAxOw0KKyAgICBGWF9JTlQzMiBwYWxfaW5kZXggPSBwQ29kZWMtPm1fR2lmQmdJbmRleDsNCisgICAgQ0ZYX0RJQml0bWFwKiBwRGV2aWNlID0gcENvZGVjLT5tX3BEZXZpY2VCaXRtYXA7DQorICAgIGlmICh0cmFuc19pbmRleCA+PSBwYWxfbnVtKSB7DQorICAgICAgICB0cmFuc19pbmRleCA9IC0xOw0KKyAgICB9DQorICAgIGlmICh0cmFuc19pbmRleCAhPSAtMSkgew0KKyAgICAgICAgcENvZGVjLT5tX3BTcmNQYWxldHRlW3RyYW5zX2luZGV4XSAmPSAweDAwZmZmZmZmOw0KKyAgICAgICAgaWYgKHBEZXZpY2UtPkhhc0FscGhhKCkpIHsNCisgICAgICAgICAgICBwYWxfaW5kZXggPSB0cmFuc19pbmRleDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpbnQgc3RhcnRYID0gcENvZGVjLT5tX3N0YXJ0WDsNCisgICAgaW50IHN0YXJ0WSA9IHBDb2RlYy0+bV9zdGFydFk7DQorICAgIGludCBzaXplWCA9IHBDb2RlYy0+bV9zaXplWDsNCisgICAgaW50IHNpemVZID0gcENvZGVjLT5tX3NpemVZOw0KKyAgICBpbnQgQnBwID0gcERldmljZS0+R2V0QlBQKCkgLyA4Ow0KKyAgICBGWF9BUkdCIGFyZ2IgPSBwQ29kZWMtPm1fcFNyY1BhbGV0dGVbcGFsX2luZGV4XTsNCisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZVk7IHJvdyArKykgew0KKyAgICAgICAgRlhfTFBCWVRFIHBTY2FubGluZSA9IChGWF9MUEJZVEUpcERldmljZS0+R2V0U2NhbmxpbmUocm93ICsgc3RhcnRZKSArIHN0YXJ0WCAqIEJwcDsNCisgICAgICAgIHN3aXRjaChwQ29kZWMtPm1fVHJhbnNNZXRob2QpIHsNCisgICAgICAgICAgICBjYXNlIDM6CXsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgZ3JheSA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoYXJnYiksIEZYQVJHQl9HKGFyZ2IpLCBGWEFSR0JfQihhcmdiKSk7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQ4KHBTY2FubGluZSwgZ3JheSwgc2l6ZVgpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDg6CXsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHNpemVYOyBjb2wgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcFNjYW5saW5lKysgPSBGWEFSR0JfQihhcmdiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcFNjYW5saW5lKysgPSBGWEFSR0JfRyhhcmdiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcFNjYW5saW5lKysgPSBGWEFSR0JfUihhcmdiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhbmxpbmUgKz0gQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAxMjogew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc2l6ZVg7IGNvbCArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIocFNjYW5saW5lLCBhcmdiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhbmxpbmUgKz0gNDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVhZFNjYW5saW5lQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgRlhfSU5UMzIgcm93X251bSwgRlhfTFBCWVRFIHJvd19idWYpDQorew0KKyAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgICAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCisgICAgRlhfSU5UMzIgaW1nX3dpZHRoID0gcENvZGVjLT5tX0dpZkZyYW1lUmVjdC5XaWR0aCgpOw0KKyAgICBpZiAoIXBESUJpdG1hcC0+SGFzQWxwaGEoKSkgew0KKyAgICAgICAgRlhfTFBCWVRFIGJ5dGVfcHRyID0gcm93X2J1ZjsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1nX3dpZHRoOyBpKysgKSB7DQorICAgICAgICAgICAgaWYoKmJ5dGVfcHRyID09IHBDb2RlYy0+bV9HaWZUcmFuc0luZGV4KSB7DQorICAgICAgICAgICAgICAgICpieXRlX3B0ciA9IHBDb2RlYy0+bV9HaWZCZ0luZGV4Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBieXRlX3B0cisrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZCZ0luZGV4Ow0KKyAgICBpZiAocENvZGVjLT5tX0dpZlRyYW5zSW5kZXggIT0gLTEgJiYgcENvZGVjLT5tX3BEZXZpY2VCaXRtYXAtPkhhc0FscGhhKCkpIHsNCisgICAgICAgIHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZUcmFuc0luZGV4Ow0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDgocENvZGVjLT5tX3BEZWNvZGVCdWYsIHBhbF9pbmRleCwgcENvZGVjLT5tX1NyY1dpZHRoKTsNCisgICAgRlhfQk9PTCBiTGFzdFBhc3MgPSAoKHJvd19udW0gJSAyKSA9PSAxKSA/IFRSVUUgOiBGQUxTRTsNCisgICAgRlhfSU5UMzIgbGluZSA9IHJvd19udW0gKyBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0LnRvcDsNCisgICAgRlhfSU5UMzIgbGVmdCA9IHBDb2RlYy0+bV9HaWZGcmFtZVJlY3QubGVmdDsNCisgICAgRlhTWVNfbWVtY3B5MzIocENvZGVjLT5tX3BEZWNvZGVCdWYgKyBsZWZ0LCByb3dfYnVmLCBpbWdfd2lkdGgpOw0KKyAgICBpbnQgc3JjX3RvcCA9IHBDb2RlYy0+bV9jbGlwQm94LnRvcDsNCisgICAgaW50IHNyY19ib3R0b20gPSBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b207DQorICAgIGludCBkZXNfdG9wID0gcENvZGVjLT5tX3N0YXJ0WTsNCisgICAgaW50IHNyY19oZWkgPSBwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCisgICAgaW50IGRlc19oZWkgPSBwQ29kZWMtPm1fc2l6ZVk7DQorICAgIGlmKGxpbmUgPj0gc3JjX3RvcCAmJiBsaW5lIDwgc3JjX2JvdHRvbSkgew0KKyAgICAgICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7DQorICAgICAgICBpbnQgc3JjX3JvdyA9IGxpbmUgLSBzcmNfdG9wOw0KKyAgICAgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgICsgZGVzX3RvcDsNCisgICAgICAgIGlmKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpCXsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBwQ29kZWMtPlJlU2FtcGxlU2NhbmxpbmUocERJQml0bWFwLCBkZXNfcm93LCBwQ29kZWMtPm1fcERlY29kZUJ1ZiwgcENvZGVjLT5tX1NyY0Zvcm1hdCk7DQorICAgICAgICBpZihzY2FsZV95ID4gMS4wICYmICghcENvZGVjLT5tX2JJbnRlcnBvbCB8fCBwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9PSAxKSkgew0KKyAgICAgICAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoc2NhbGVfeSA+IDEuMCkgew0KKyAgICAgICAgICAgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIHBDb2RlYy0+bV9zaXplWTsNCisgICAgICAgICAgICBpbnQgZGVzX0JwcCA9IHBESUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsNCisgICAgICAgICAgICBGWF9EV09SRCBkZXNfU2Nhbk9mZmV0ID0gcENvZGVjLT5tX3N0YXJ0WCAqIGRlc19CcHA7DQorICAgICAgICAgICAgaWYoZGVzX3JvdyArIChpbnQpc2NhbGVfeSA+PSBkZXNfYm90dG9tIC0gMSkgew0KKyAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc2Nhbl9zcmMgPSAoRlhfTFBCWVRFKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgICAgICAgICBpbnQgY3VyX3JvdyA9IGRlc19yb3c7DQorICAgICAgICAgICAgICAgIHdoaWxlICgrK2N1cl9yb3cgPCBkZXNfYm90dG9tKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc2Nhbl9kZXMgPSAoRlhfTFBCWVRFKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUoY3VyX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IHBDb2RlYy0+bV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGJMYXN0UGFzcykgew0KKyAgICAgICAgICAgICAgICBwQ29kZWMtPkdpZkRvdWJsZUxpbmVSZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwgZG91YmxlIHNjYWxlX3ksIGludCBkZXNfcm93KQ0KK3sNCisgICAgaW50IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgICBGWF9EV09SRCBkZXNfU2Nhbk9mZmV0ID0gbV9zdGFydFggKiBkZXNfQnBwOw0KKyAgICBpbnQgZGVzX3RvcCA9IG1fc3RhcnRZOw0KKyAgICBpbnQgZGVzX3Jvd18xID0gZGVzX3JvdyAtIGludCgyICogc2NhbGVfeSk7DQorICAgIGlmKGRlc19yb3dfMSA8IGRlc190b3ApIHsNCisgICAgICAgIGRlc19yb3dfMSA9IGRlc190b3A7DQorICAgIH0NCisgICAgZm9yICg7IGRlc19yb3dfMSA8IGRlc19yb3c7IGRlc19yb3dfMSsrKSB7DQorICAgICAgICBGWF9MUEJZVEUgc2Nhbl9kZXMgPSAoRlhfTFBCWVRFKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3dfMSkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSBtX1dlaWdodFZlcnQuR2V0UGl4ZWxXZWlnaHQoZGVzX3Jvd18xIC0gZGVzX3RvcCk7DQorICAgICAgICBGWF9MUENCWVRFIHNjYW5fc3JjMSA9IHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjU3RhcnQgKyBkZXNfdG9wKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICBGWF9MUENCWVRFIHNjYW5fc3JjMiA9IHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjRW5kICsgZGVzX3RvcCkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgZm9yIChpbnQgZGVzX2NvbCA9IDA7IGRlc19jb2wgPCBtX3NpemVYOyBkZXNfY29sKyspIHsNCisgICAgICAgICAgICBzd2l0Y2gocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19nID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKShkZXNfZyA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fc3JjMSArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3NyYzIgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2EgPSAwLCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKChkZXNfYSkgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIG1fc2l6ZVkgLSAxOw0KKyAgICBpZihkZXNfcm93ICsgKGludCkoMiAqIHNjYWxlX3kpID49IGRlc19ib3R0b20gJiYgZGVzX3JvdyArIChpbnQpc2NhbGVfeSA8IGRlc19ib3R0b20pIHsNCisgICAgICAgIEdpZkRvdWJsZUxpbmVSZXNhbXBsZVZlcnQocERldmljZUJpdG1hcCwgc2NhbGVfeSwgZGVzX3JvdyArIChpbnQpc2NhbGVfeSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpCbXBSZWFkTW9yZURhdGEoSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSwgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpDQorew0KKyAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KKyAgICBpZiAoZHdTaXplIDw9IG1fb2ZmU2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7DQorICAgIEZYX0RXT1JEIGR3QXZhaWwgPSBwQm1wTW9kdWxlLT5HZXRBdmFpbElucHV0KG1fcEJtcENvbnRleHQsIE5VTEwpOw0KKyAgICBpZiAoZHdBdmFpbCA9PSBtX1NyY1NpemUpIHsNCisgICAgICAgIGlmIChkd1NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsNCisgICAgICAgICAgICBkd1NpemUgPSBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgICAgICB9DQorICAgICAgICBtX1NyY1NpemUgPSAoZHdTaXplICsgZHdBdmFpbCArIEZYQ09ERUNfQkxPQ0tfU0laRSAtIDEpIC8gRlhDT0RFQ19CTE9DS19TSVpFICogRlhDT0RFQ19CTE9DS19TSVpFOw0KKyAgICAgICAgbV9wU3JjQnVmID0gRlhfUmVhbGxvYyhGWF9CWVRFLCBtX3BTcmNCdWYsIG1fU3JjU2l6ZSk7DQorICAgICAgICBpZiAoIW1fcFNyY0J1Zikgew0KKyAgICAgICAgICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RXT1JEIGR3Q29uc3VtZSA9IG1fU3JjU2l6ZSAtIGR3QXZhaWw7DQorICAgICAgICBpZiAoZHdBdmFpbCkgew0KKyAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKG1fcFNyY0J1ZiwgbV9wU3JjQnVmICsgZHdDb25zdW1lLCBkd0F2YWlsKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd1NpemUgPiBkd0NvbnN1bWUpIHsNCisgICAgICAgICAgICBkd1NpemUgPSBkd0NvbnN1bWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmICsgZHdBdmFpbCwgbV9vZmZTZXQsIGR3U2l6ZSkpIHsNCisgICAgICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX29mZlNldCArPSBkd1NpemU7DQorICAgIHBCbXBNb2R1bGUtPklucHV0KG1fcEJtcENvbnRleHQsIG1fcFNyY0J1ZiwgZHdTaXplICsgZHdBdmFpbCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MpDQorew0KKyAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgICAgcENvZGVjLT5tX29mZlNldCA9IHJjZF9wb3M7DQorICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICBpZighcENvZGVjLT5CbXBSZWFkTW9yZURhdGEocENvZGVjLT5tX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCksIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpCbXBSZWFkU2NhbmxpbmVDYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBGWF9JTlQzMiByb3dfbnVtLCBGWF9MUEJZVEUgcm93X2J1ZikNCit7DQorICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KKyAgICBBU1NFUlQocERJQml0bWFwICE9IE5VTEwpOw0KKyAgICBGWFNZU19tZW1jcHkzMihwQ29kZWMtPm1fcERlY29kZUJ1Ziwgcm93X2J1ZiwgcENvZGVjLT5tX1NjYW5saW5lU2l6ZSk7DQorICAgIGludCBzcmNfdG9wID0gcENvZGVjLT5tX2NsaXBCb3gudG9wOw0KKyAgICBpbnQgc3JjX2JvdHRvbSA9IHBDb2RlYy0+bV9jbGlwQm94LmJvdHRvbTsNCisgICAgaW50IGRlc190b3AgPSBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgICBpbnQgc3JjX2hlaSA9IHBDb2RlYy0+bV9jbGlwQm94LkhlaWdodCgpOw0KKyAgICBpbnQgZGVzX2hlaSA9IHBDb2RlYy0+bV9zaXplWTsNCisgICAgaWYocm93X251bSA+PSBzcmNfdG9wICYmIHJvd19udW0gPCBzcmNfYm90dG9tKSB7DQorICAgICAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCisgICAgICAgIGludCBzcmNfcm93ID0gcm93X251bSAtIHNyY190b3A7DQorICAgICAgICBpbnQgZGVzX3JvdyA9IChpbnQpKHNyY19yb3cgKiBzY2FsZV95KSAgKyBkZXNfdG9wOw0KKyAgICAgICAgaWYoZGVzX3JvdyA+PSBkZXNfdG9wICsgZGVzX2hlaSkJew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBDb2RlYy0+UmVTYW1wbGVTY2FubGluZShwRElCaXRtYXAsIGRlc19yb3csIHBDb2RlYy0+bV9wRGVjb2RlQnVmLCBwQ29kZWMtPm1fU3JjRm9ybWF0KTsNCisgICAgICAgIGlmKHNjYWxlX3kgPiAxLjApIHsNCisgICAgICAgICAgICBpZihwQ29kZWMtPm1fQm1wSXNUb3BCb3R0b20gfHwgIXBDb2RlYy0+bV9iSW50ZXJwb2wpIHsNCisgICAgICAgICAgICAgICAgcENvZGVjLT5SZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0QlQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZVZlcnRCVChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3JvdykNCit7DQorICAgIGludCBkZXNfQnBwID0gcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsNCisgICAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCisgICAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsNCisgICAgaW50IGRlc19ib3R0b20gPSBtX3N0YXJ0WSArIG1fc2l6ZVk7DQorICAgIGludCBkZXNfcm93XzEgPSBkZXNfcm93ICsgaW50KHNjYWxlX3kpOw0KKyAgICBpZihkZXNfcm93XzEgPj0gZGVzX2JvdHRvbSAtIDEpIHsNCisgICAgICAgIEZYX0xQQllURSBzY2FuX3NyYyA9IChGWF9MUEJZVEUpcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgd2hpbGUgKCsrZGVzX3JvdyA8IGRlc19ib3R0b20pIHsNCisgICAgICAgICAgICBGWF9MUEJZVEUgc2Nhbl9kZXMgPSAoRlhfTFBCWVRFKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgICAgICBGWF9EV09SRCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBmb3IgKDsgZGVzX3Jvd18xID4gZGVzX3JvdzsgZGVzX3Jvd18xLS0pIHsNCisgICAgICAgIEZYX0xQQllURSBzY2FuX2RlcyA9IChGWF9MUEJZVEUpcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3Jvd18xKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsNCisgICAgICAgIEZYX0xQQ0JZVEUgc2Nhbl9zcmMxID0gcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNTdGFydCArIGRlc190b3ApICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgIEZYX0xQQ0JZVEUgc2Nhbl9zcmMyID0gcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNFbmQgKyBkZXNfdG9wKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICAgICAgICAgIHN3aXRjaChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZYRElCX0ludmFsaWQ6DQorICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYocERldmljZUJpdG1hcC0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX2cgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKGRlc19nID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjoNCisgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9zcmMxICs9IGRlc19CcHAgLSAzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fc3JjMiArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX2RlcyArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZYRElCX0FyZ2I6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYSA9IDAsIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19hKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpEZXRlY3RJbWFnZVR5cGUoRlhDT0RFQ19JTUFHRV9UWVBFIGltYWdlVHlwZSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkNCit7DQorICAgIG1fb2ZmU2V0ID0gMDsNCisgICAgRlhfRFdPUkQgc2l6ZSA9IChGWF9EV09SRCltX3BGaWxlLT5HZXRTaXplKCk7DQorICAgIGlmKHNpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsNCisgICAgICAgIHNpemUgPSBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgIH0NCisgICAgaWYobV9wU3JjQnVmICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsNCisgICAgICAgIG1fcFNyY0J1ZiA9IE5VTEw7DQorICAgIH0NCisgICAgbV9wU3JjQnVmID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7DQorICAgIGlmKG1fcFNyY0J1ZiA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgbV9TcmNTaXplID0gc2l6ZTsNCisgICAgc3dpdGNoKGltYWdlVHlwZSkgew0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICBpZihwQm1wTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwQm1wTW9kdWxlLT5JbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjayA9IEJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrOw0KKyAgICAgICAgICAgICAgICBwQm1wTW9kdWxlLT5SZWFkU2NhbmxpbmVDYWxsYmFjayA9IEJtcFJlYWRTY2FubGluZUNhbGxiYWNrOw0KKyAgICAgICAgICAgICAgICBtX3BCbXBDb250ZXh0ID0gcEJtcE1vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KKyAgICAgICAgICAgICAgICBpZihtX3BCbXBDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICAgICAgICAgICAgaWYoIWJSZXN1bHQpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9vZmZTZXQgKz0gc2l6ZTsNCisgICAgICAgICAgICAgICAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplKTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgcmVhZFJlc3VsdCA9IHBCbXBNb2R1bGUtPlJlYWRIZWFkZXIobV9wQm1wQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwgJm1fQm1wSXNUb3BCb3R0b20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9TcmNDb21wb25lbnRzLCAmbV9TcmNQYWxldHRlTnVtYmVyLCAmcFBhbGV0dGUsIHBBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgICAgICB3aGlsZShyZWFkUmVzdWx0ID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICAgICAgICAgICAgICBpZighQm1wUmVhZE1vcmVEYXRhKHBCbXBNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZWFkUmVzdWx0ID0gcEJtcE1vZHVsZS0+UmVhZEhlYWRlcihtX3BCbXBDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9CbXBJc1RvcEJvdHRvbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX1NyY0NvbXBvbmVudHMsICZtX1NyY1BhbGV0dGVOdW1iZXIsICZwUGFsZXR0ZSwgcEF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYocmVhZFJlc3VsdCA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICBtX1NyY0JQQyA9IDg7DQorICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgICAgIGlmKG1fcFNyY1BhbGV0dGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9TcmNQYWxldHRlTnVtYmVyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0FSR0IsIG1fU3JjUGFsZXR0ZU51bWJlcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9wU3JjUGFsZXR0ZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BTcmNQYWxldHRlLCBwUGFsZXR0ZSwgbV9TcmNQYWxldHRlTnVtYmVyICogc2l6ZW9mKEZYX0RXT1JEKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZihtX3BCbXBDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHBCbXBNb2R1bGUtPkZpbmlzaChtX3BCbXBDb250ZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIG1fcEJtcENvbnRleHQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6IHsNCisgICAgICAgICAgICAgICAgSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKTsNCisgICAgICAgICAgICAgICAgaWYocEpwZWdNb2R1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcEpwZWdDb250ZXh0ID0gcEpwZWdNb2R1bGUtPlN0YXJ0KCk7DQorICAgICAgICAgICAgICAgIGlmKG1fcEpwZWdDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICAgICAgICAgICAgaWYoIWJSZXN1bHQpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9vZmZTZXQgKz0gc2l6ZTsNCisgICAgICAgICAgICAgICAgcEpwZWdNb2R1bGUtPklucHV0KG1fcEpwZWdDb250ZXh0LCBtX3BTcmNCdWYsIHNpemUpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiByZWFkUmVzdWx0ID0gcEpwZWdNb2R1bGUtPlJlYWRIZWFkZXIobV9wSnBlZ0NvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX1NyY0NvbXBvbmVudHMsIHBBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgICAgICB3aGlsZShyZWFkUmVzdWx0ID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICAgICAgICAgICAgICBpZighSnBlZ1JlYWRNb3JlRGF0YShwSnBlZ01vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJlYWRSZXN1bHQgPSBwSnBlZ01vZHVsZS0+UmVhZEhlYWRlcihtX3BKcGVnQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwgJm1fU3JjQ29tcG9uZW50cywgcEF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoIXJlYWRSZXN1bHQpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fU3JjQlBDID0gODsNCisgICAgICAgICAgICAgICAgICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYobV9wSnBlZ0NvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEpwZWdNb2R1bGUtPkZpbmlzaChtX3BKcGVnQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICBtX3BKcGVnQ29udGV4dCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICBpZihwUG5nTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwUG5nTW9kdWxlLT5SZWFkSGVhZGVyQ2FsbGJhY2sgPSBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdSZWFkSGVhZGVyRnVuYzsNCisgICAgICAgICAgICAgICAgcFBuZ01vZHVsZS0+QXNrU2NhbmxpbmVCdWZDYWxsYmFjayA9IENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0Fza1NjYW5saW5lQnVmRnVuYzsNCisgICAgICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmlsbFNjYW5saW5lQnVmQ29tcGxldGVkQ2FsbGJhY2sgPSBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRGdW5jOw0KKyAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gcFBuZ01vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KKyAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICAgICAgICAgICAgaWYoIWJSZXN1bHQpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9vZmZTZXQgKz0gc2l6ZTsNCisgICAgICAgICAgICAgICAgYlJlc3VsdCA9IHBQbmdNb2R1bGUtPklucHV0KG1fcFBuZ0NvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSwgcEF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgICAgIHdoaWxlKGJSZXN1bHQpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbWFpbl9zaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKSAtIG1fb2ZmU2V0Ow0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaW5wdXRfc2l6ZSA9IHJlbWFpbl9zaXplID4gRlhDT0RFQ19CTE9DS19TSVpFID8gRlhDT0RFQ19CTE9DS19TSVpFIDogcmVtYWluX3NpemU7DQorICAgICAgICAgICAgICAgICAgICBpZihpbnB1dF9zaXplID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYobV9wU3JjQnVmICE9IE5VTEwgJiYgaW5wdXRfc2l6ZSA+IG1fU3JjU2l6ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBpbnB1dF9zaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihtX3BTcmNCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIobV9wU3JjQnVmLCAwLCBpbnB1dF9zaXplKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NyY1NpemUgPSBpbnB1dF9zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIG1fb2ZmU2V0LCBpbnB1dF9zaXplKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKCFiUmVzdWx0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBtX29mZlNldCArPSBpbnB1dF9zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgYlJlc3VsdCA9IHBQbmdNb2R1bGUtPklucHV0KG1fcFBuZ0NvbnRleHQsIG1fcFNyY0J1ZiwgaW5wdXRfc2l6ZSwgcEF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQVNTRVJUKCFiUmVzdWx0KTsNCisgICAgICAgICAgICAgICAgaWYobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwUG5nTW9kdWxlLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZihtX1NyY1Bhc3NOdW1iZXIgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICBpZihwR2lmTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwR2lmTW9kdWxlLT5SZWNvcmRDdXJyZW50UG9zaXRpb25DYWxsYmFjayA9IENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZlJlY29yZEN1cnJlbnRQb3NpdGlvbkNhbGxiYWNrOw0KKyAgICAgICAgICAgICAgICBwR2lmTW9kdWxlLT5Bc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjayA9IENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrOw0KKyAgICAgICAgICAgICAgICBwR2lmTW9kdWxlLT5JbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2sgPSBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZJbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2s7DQorICAgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPlJlYWRTY2FubGluZUNhbGxiYWNrID0gQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVhZFNjYW5saW5lQ2FsbGJhY2s7DQorICAgICAgICAgICAgICAgIG1fcEdpZkNvbnRleHQgPSBwR2lmTW9kdWxlLT5TdGFydCgodm9pZCopdGhpcyk7DQorICAgICAgICAgICAgICAgIGlmKG1fcEdpZkNvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIDAsIHNpemUpOw0KKyAgICAgICAgICAgICAgICBpZighYlJlc3VsdCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX29mZlNldCArPSBzaXplOw0KKyAgICAgICAgICAgICAgICBwR2lmTW9kdWxlLT5JbnB1dChtX3BHaWZDb250ZXh0LCBtX3BTcmNCdWYsIHNpemUpOw0KKyAgICAgICAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSAxOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiByZWFkUmVzdWx0ID0gcEdpZk1vZHVsZS0+UmVhZEhlYWRlcihtX3BHaWZDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fR2lmUGx0TnVtYmVyLCAodm9pZCoqKSZtX3BHaWZQYWxldHRlLCAmbV9HaWZCZ0luZGV4KTsNCisgICAgICAgICAgICAgICAgd2hpbGUocmVhZFJlc3VsdCA9PSAyKSB7DQorICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoIUdpZlJlYWRNb3JlRGF0YShwR2lmTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPlJlYWRIZWFkZXIobV9wR2lmQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX0dpZlBsdE51bWJlciwgKHZvaWQqKikmbV9wR2lmUGFsZXR0ZSwgJm1fR2lmQmdJbmRleCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYocmVhZFJlc3VsdCA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICBtX1NyY0JQQyA9IDg7DQorICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKG1fcEdpZkNvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEdpZk1vZHVsZS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wR2lmQ29udGV4dCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1RJRjogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfVGlmZk1vZHVsZSogcFRpZmZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0VGlmZk1vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICBpZihwVGlmZk1vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wVGlmZkNvbnRleHQgPSBwVGlmZk1vZHVsZS0+Q3JlYXRlRGVjb2RlcihtX3BGaWxlKTsNCisgICAgICAgICAgICAgICAgaWYobV9wVGlmZkNvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGZyYW1lcyA9IDA7DQorICAgICAgICAgICAgICAgIHBUaWZmTW9kdWxlLT5HZXRGcmFtZXMobV9wVGlmZkNvbnRleHQsIGZyYW1lcyk7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJwYzsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCByZXQgPSBwVGlmZk1vZHVsZS0+TG9hZEZyYW1lSW5mbyhtX3BUaWZmQ29udGV4dCwgMCwgKEZYX0RXT1JEJiltX1NyY1dpZHRoLCAoRlhfRFdPUkQmKW1fU3JjSGVpZ2h0LCAoRlhfRFdPUkQmKW1fU3JjQ29tcG9uZW50cywgYnBjLCBwQXR0cmlidXRlKTsNCisgICAgICAgICAgICAgICAgbV9TcmNDb21wb25lbnRzID0gNDsNCisgICAgICAgICAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQorICAgICAgICAgICAgICAgIGlmKCFyZXQpIHsNCisgICAgICAgICAgICAgICAgICAgIHBUaWZmTW9kdWxlLT5EZXN0cm95RGVjb2RlcihtX3BUaWZmQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICAobV9wVGlmZkNvbnRleHQgPSBOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgIChtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpMb2FkSW1hZ2VJbmZvKElGWF9GaWxlUmVhZCogcEZpbGUsIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQorew0KKyAgICBzd2l0Y2gobV9zdGF0dXMpIHsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk6DQorICAgICAgICBjYXNlIEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRToNCisgICAgICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOg0KKyAgICAgICAgY2FzZSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOg0KKyAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgOw0KKyAgICB9DQorICAgIGlmKHBGaWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzOw0KKyAgICB9DQorICAgIG1fcEZpbGUgPSBwRmlsZTsNCisgICAgbV9vZmZTZXQgPSAwOw0KKyAgICBtX1NyY1dpZHRoID0gbV9TcmNIZWlnaHQgPSAwOw0KKyAgICBtX1NyY0NvbXBvbmVudHMgPSBtX1NyY0JQQyA9IDA7DQorICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQorICAgIG1fc3RhcnRYID0gbV9zdGFydFkgPSAwOw0KKyAgICBtX3NpemVYID0gbV9zaXplWSA9IDA7DQorICAgIG1fU3JjUGFzc051bWJlciA9IDA7DQorICAgIGlmKGltYWdlVHlwZSAhPSBGWENPREVDX0lNQUdFX1VOS05PV04gJiYNCisgICAgICAgICAgICBEZXRlY3RJbWFnZVR5cGUoaW1hZ2VUeXBlLCBwQXR0cmlidXRlKSkgew0KKyAgICAgICAgbV9pbWFnVHlwZSA9IGltYWdlVHlwZTsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXM7DQorICAgIH0NCisgICAgZm9yIChpbnQgdHlwZSA9IEZYQ09ERUNfSU1BR0VfQk1QOyB0eXBlIDwgRlhDT0RFQ19JTUFHRV9NQVg7IHR5cGUrKykgew0KKyAgICAgICAgaWYoRGV0ZWN0SW1hZ2VUeXBlKChGWENPREVDX0lNQUdFX1RZUEUpdHlwZSwgcEF0dHJpYnV0ZSkpIHsNCisgICAgICAgICAgICBtX2ltYWdUeXBlID0gKEZYQ09ERUNfSU1BR0VfVFlQRSl0eXBlOw0KKyAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk7DQorICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgIHJldHVybiBtX3N0YXR1czsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApDQorew0KKyAgICBpZihtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKGNsaXAtPklzRW1wdHkoKSkgew0KKyAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZihjbGlwLT5sZWZ0IDwgMCkgew0KKyAgICAgICAgY2xpcC0+bGVmdCA9IDA7DQorICAgIH0NCisgICAgaWYoY2xpcC0+cmlnaHQgPiBtX1NyY1dpZHRoKSB7DQorICAgICAgICBjbGlwLT5yaWdodCA9IG1fU3JjV2lkdGg7DQorICAgIH0NCisgICAgaWYoY2xpcC0+dG9wIDwgMCkgew0KKyAgICAgICAgY2xpcC0+dG9wID0gMDsNCisgICAgfQ0KKyAgICBpZihjbGlwLT5ib3R0b20gPiBtX1NyY0hlaWdodCkgew0KKyAgICAgICAgY2xpcC0+Ym90dG9tID0gbV9TcmNIZWlnaHQ7DQorICAgIH0NCisgICAgaWYoY2xpcC0+SXNFbXB0eSgpKSB7DQorICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fY2xpcEJveCA9ICpjbGlwOw0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldERvd25TY2FsZShpbnQmIGRvd25fc2NhbGUpDQorew0KKyAgICBkb3duX3NjYWxlID0gMTsNCisgICAgaW50IHJhdGlvX3cgPSBtX2NsaXBCb3guV2lkdGgoKSAvIG1fc2l6ZVg7DQorICAgIGludCByYXRpb19oID0gbV9jbGlwQm94LkhlaWdodCgpIC8gbV9zaXplWTsNCisgICAgaW50IHJhdGlvID0gKHJhdGlvX3cgPiByYXRpb19oKSA/IHJhdGlvX2ggOiByYXRpb193Ow0KKyAgICBpZiAocmF0aW8gPj0gOCkgew0KKyAgICAgICAgZG93bl9zY2FsZSA9IDg7DQorICAgIH0gZWxzZSBpZiAocmF0aW8gPj0gNCkJew0KKyAgICAgICAgZG93bl9zY2FsZSA9IDQ7DQorICAgIH0gZWxzZSBpZiAocmF0aW8gPj0gMikJew0KKyAgICAgICAgZG93bl9zY2FsZSA9IDI7DQorICAgIH0NCisgICAgbV9jbGlwQm94LmxlZnQgLz0gZG93bl9zY2FsZTsNCisgICAgbV9jbGlwQm94LnJpZ2h0IC89IGRvd25fc2NhbGU7DQorICAgIG1fY2xpcEJveC50b3AgLz0gZG93bl9zY2FsZTsNCisgICAgbV9jbGlwQm94LmJvdHRvbSAvPSBkb3duX3NjYWxlOw0KKyAgICBpZihtX2NsaXBCb3gucmlnaHQgPT0gbV9jbGlwQm94LmxlZnQpIHsNCisgICAgICAgIG1fY2xpcEJveC5yaWdodCA9IG1fY2xpcEJveC5sZWZ0ICsgMTsNCisgICAgfQ0KKyAgICBpZihtX2NsaXBCb3guYm90dG9tID09IG1fY2xpcEJveC50b3ApIHsNCisgICAgICAgIG1fY2xpcEJveC5ib3R0b20gPSBtX2NsaXBCb3gudG9wICsgMTsNCisgICAgfQ0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KQ0KK3sNCisgICAgc3dpdGNoKGRlc19mb3JtYXQpIHsNCisgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsNCisgICAgICAgICAgICAgICAgc3dpdGNoKHNyY19mb3JtYXQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwR3JheToNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KKyAgICAgICAgICAgICAgICBzd2l0Y2goc3JjX2Zvcm1hdCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBHcmF5Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBSZ2I6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcFJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19SZ2I6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfUmdiMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfQXJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNDsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19DbXlrOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA1Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gLTE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYRElCX1JnYjogew0KKyAgICAgICAgICAgICAgICBzd2l0Y2goc3JjX2Zvcm1hdCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBHcmF5Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBSZ2I6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcFJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gODsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19SZ2I6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfUmdiMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfQXJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gOTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19DbXlrOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoNCisgICAgICAgIGNhc2UgRlhESUJfQXJnYjogew0KKyAgICAgICAgICAgICAgICBzd2l0Y2goc3JjX2Zvcm1hdCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBHcmF5Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBSZ2I6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcFJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihkZXNfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDEyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA4Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19SZ2I6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfUmdiMzI6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfQ215azoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTA7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfQXJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAtMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICB9DQorfQ0KK3ZvaWQgX1JHQjJCR1IoRlhfTFBCWVRFIGJ1ZmZlciwgaW50IHdpZHRoID0gMSkNCit7DQorICAgIGlmIChidWZmZXIgJiYgd2lkdGggPiAwKSB7DQorICAgICAgICBGWF9CWVRFIHRlbXA7DQorICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICBpbnQgaiA9IDA7DQorICAgICAgICBmb3IgKDsgaSA8IHdpZHRoOyBpKyssIGogKz0gMykgew0KKyAgICAgICAgICAgIHRlbXAgPSBidWZmZXJbal07DQorICAgICAgICAgICAgYnVmZmVyW2pdID0gYnVmZmVyW2ogKyAyXTsNCisgICAgICAgICAgICBidWZmZXJbaiArIDJdID0gdGVtcDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlU2FtcGxlU2NhbmxpbmUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBpbnQgZGVzX2xpbmUsIEZYX0xQQllURSBzcmNfc2NhbiwgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCkNCit7DQorICAgIGludCBzcmNfbGVmdCA9IG1fY2xpcEJveC5sZWZ0Ow0KKyAgICBpbnQgZGVzX2xlZnQgPSBtX3N0YXJ0WDsNCisgICAgRlhfTFBCWVRFIGRlc19zY2FuID0gcERldmljZUJpdG1hcC0+R2V0QnVmZmVyKCkgKyBkZXNfbGluZSAqIHBEZXZpY2VCaXRtYXAtPkdldFBpdGNoKCk7DQorICAgIGludCBzcmNfYnBwID0gc3JjX2Zvcm1hdCAmIDB4ZmY7DQorICAgIGludCBkZXNfYnBwID0gcERldmljZUJpdG1hcC0+R2V0QlBQKCk7DQorICAgIGludCBzcmNfQnBwID0gc3JjX2JwcCA+PiAzOw0KKyAgICBpbnQgZGVzX0JwcCA9IGRlc19icHAgPj4gMzsNCisgICAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KKyAgICBkZXNfc2NhbiArPSBkZXNfbGVmdCAqIGRlc19CcHA7DQorICAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQorICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0SG9yei5HZXRQaXhlbFdlaWdodChkZXNfY29sKTsNCisgICAgICAgIHN3aXRjaChtX1RyYW5zTWV0aG9kKSB7DQorICAgICAgICAgICAgY2FzZSAtMToNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgMjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2cgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoZGVzX2cgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMzogew0KKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYiA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYiA+PiA4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSlhcmdiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSlGWFJHQjJHUkFZKChkZXNfciA+PiAxNiksIChkZXNfZyA+PiAxNiksIChkZXNfYiA+PiAxNikpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgNDogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSlGWFJHQjJHUkFZKChkZXNfciA+PiAxNiksIChkZXNfZyA+PiAxNiksIChkZXNfYiA+PiAxNikpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgNTogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBzcmNfYiA9IDAsIHNyY19nID0gMCwgc3JjX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMSgyNTUgLSBzcmNfcGl4ZWxbMF0sIDI1NSAtIHNyY19waXhlbFsxXSwgMjU1IC0gc3JjX3BpeGVsWzJdLCAyNTUgLSBzcmNfcGl4ZWxbM10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yLCBzcmNfZywgc3JjX2IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqIHNyY19iOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqIHNyY19nOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqIHNyY19yOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSlGWFJHQjJHUkFZKChkZXNfciA+PiAxNiksIChkZXNfZyA+PiAxNiksIChkZXNfYiA+PiAxNikpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgNzogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2cgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChkZXNfc2NhbiwgKEZYX0JZVEUpKGRlc19nID4+IDE2KSwgMyk7DQorICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgODogew0KKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYiA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYiA+PiA4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSlhcmdiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgZGVzX3NjYW4gKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxMjogew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEJtcENvbnRleHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpKGFyZ2IgPj4gOCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKWFyZ2I7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gMHhGRjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19hID0gMCwgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiID4+IDI0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpKGFyZ2IgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYiA+PiA4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpYXJnYjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19hKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSA5OiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwOiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHNyY19iID0gMCwgc3JjX2cgPSAwLCBzcmNfciA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKDI1NSAtIHNyY19waXhlbFswXSwgMjU1IC0gc3JjX3BpeGVsWzFdLCAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3IsIHNyY19nLCBzcmNfYik7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2I7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2c7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3I7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDExOiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYWxwaGEgPSAwLCBkZXNfciA9IDAsIGRlc19nID0gMCwgZGVzX2IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3BpeGVsWzNdIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYWxwaGEgKz0gcGl4ZWxfd2VpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9IChGWF9CWVRFKSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKEZYX0JZVEUpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAoRlhfQllURSkoKGRlc19hbHBoYSAqIDI1NSkgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3JvdykNCit7DQorICAgIGludCBkZXNfQnBwID0gcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsNCisgICAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCisgICAgaWYobV9iSW50ZXJwb2wpIHsNCisgICAgICAgIGludCBkZXNfdG9wID0gbV9zdGFydFk7DQorICAgICAgICBpbnQgZGVzX3Jvd18xID0gZGVzX3JvdyAtIGludChzY2FsZV95KTsNCisgICAgICAgIGlmKGRlc19yb3dfMSA8IGRlc190b3ApIHsNCisgICAgICAgICAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZOw0KKyAgICAgICAgICAgIGlmKGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPj0gZGVzX2JvdHRvbSAtIDEpIHsNCisgICAgICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5fc3JjID0gKEZYX0xQQllURSlwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICAgICAgICAgIHdoaWxlICgrK2Rlc19yb3cgPCBkZXNfYm90dG9tKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc2Nhbl9kZXMgPSAoRlhfTFBCWVRFKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yICg7IGRlc19yb3dfMSA8IGRlc19yb3c7IGRlc19yb3dfMSsrKSB7DQorICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5fZGVzID0gKEZYX0xQQllURSlwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93XzEpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsNCisgICAgICAgICAgICBGWF9MUENCWVRFIHNjYW5fc3JjMSA9IHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjU3RhcnQgKyBkZXNfdG9wKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICAgICAgRlhfTFBDQllURSBzY2FuX3NyYzIgPSBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY0VuZCArIGRlc190b3ApICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgICAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICAgICAgICAgICAgICBzd2l0Y2gocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGV2aWNlQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfZyA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoZGVzX2cgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fc3JjMiArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAoRlhfQllURSkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKEZYX0JZVEUpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9IChGWF9CWVRFKSgoZGVzX2EpID4+IDE2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIG1fc2l6ZVk7DQorICAgICAgICBpZihkZXNfcm93ICsgKGludClzY2FsZV95ID49IGRlc19ib3R0b20gLSAxKSB7DQorICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5fc3JjID0gKEZYX0xQQllURSlwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICAgICAgd2hpbGUgKCsrZGVzX3JvdyA8IGRlc19ib3R0b20pIHsNCisgICAgICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5fZGVzID0gKEZYX0xQQllURSlwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsNCisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50IG11bHRpcGxlID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzY2FsZV95IC0gMSk7DQorICAgIGlmKG11bHRpcGxlID4gMCkgew0KKyAgICAgICAgRlhfTFBCWVRFIHNjYW5fc3JjID0gKEZYX0xQQllURSlwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtdWx0aXBsZTsgaSsrKSB7DQorICAgICAgICAgICAgaWYoZGVzX3JvdyArIGkgPj0gbV9zdGFydFkgKyBtX3NpemVZKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5fZGVzID0gKEZYX0xQQllURSlwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93ICsgaSkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsNCisgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UmVzYW1wbGUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBGWF9JTlQzMiBzcmNfbGluZSwgRlhfTFBCWVRFIHNyY19zY2FuLCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KQ0KK3sNCisgICAgaW50IHNyY190b3AgPSBtX2NsaXBCb3gudG9wOw0KKyAgICBpbnQgZGVzX3RvcCA9IG1fc3RhcnRZOw0KKyAgICBpbnQgc3JjX2hlaSA9IG1fY2xpcEJveC5IZWlnaHQoKTsNCisgICAgaW50IGRlc19oZWkgPSBtX3NpemVZOw0KKyAgICBpZihzcmNfbGluZSA+PSBzcmNfdG9wKSB7DQorICAgICAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCisgICAgICAgIGludCBzcmNfcm93ID0gc3JjX2xpbmUgLSBzcmNfdG9wOw0KKyAgICAgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgICsgZGVzX3RvcDsNCisgICAgICAgIGlmKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpCXsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBSZVNhbXBsZVNjYW5saW5lKHBEZXZpY2VCaXRtYXAsIGRlc19yb3csIG1fcERlY29kZUJ1Ziwgc3JjX2Zvcm1hdCk7DQorICAgICAgICBpZihzY2FsZV95ID4gMS4wKSB7DQorICAgICAgICAgICAgUmVzYW1wbGVWZXJ0KHBEZXZpY2VCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldEZyYW1lcyhGWF9JTlQzMiYgZnJhbWVzLCBJRlhfUGF1c2UqIHBQYXVzZSkNCit7DQorICAgIGlmKCEobV9zdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFkgfHwgbV9zdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFKSkgew0KKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICB9DQorICAgIHN3aXRjaChtX2ltYWdUeXBlKSB7DQorICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOg0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzoNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6DQorICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOg0KKyAgICAgICAgICAgIGZyYW1lcyA9IG1fRnJhbWVOdW1iZXIgPSAxOw0KKyAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9HSUY6IHsNCisgICAgICAgICAgICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5Mb2FkRnJhbWVJbmZvKG1fcEdpZkNvbnRleHQsICZtX0ZyYW1lTnVtYmVyKTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKHJlYWRSZXN1bHQgPT0gMikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFHaWZSZWFkTW9yZURhdGEocEdpZk1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZUluZm8obV9wR2lmQ29udGV4dCwgJm1fRnJhbWVOdW1iZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYocmVhZFJlc3VsdCA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzID0gbV9GcmFtZU51bWJlcjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihtX3BHaWZDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwR2lmTW9kdWxlLT5GaW5pc2gobV9wR2lmQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wR2lmQ29udGV4dCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgOw0KKyAgICB9DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCit9DQorRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6U3RhcnREZWNvZGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksDQorICAgICAgICBGWF9JTlQzMiBmcmFtZXMsIEZYX0JPT0wgYkludGVycG9sKQ0KK3sNCisgICAgaWYobV9zdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZKSB7DQorICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgIH0NCisgICAgaWYocERJQml0bWFwID09IE5VTEwgfHwgcERJQml0bWFwLT5HZXRCUFAoKSA8IDggfHwNCisgICAgICAgICAgICBmcmFtZXMgPCAwIHx8IGZyYW1lcyA+PSBtX0ZyYW1lTnVtYmVyKSB7DQorICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCisgICAgfQ0KKyAgICBtX3BEZXZpY2VCaXRtYXAgPSBwRElCaXRtYXA7DQorICAgIGlmKG1fY2xpcEJveC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgICB9DQorICAgIGlmKHNpemVfeCA8PSAwIHx8IHNpemVfeCA+IDY1NTM1IHx8IHNpemVfeSA8PSAwIHx8IHNpemVfeSA+IDY1NTM1KSB7DQorICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCisgICAgfQ0KKyAgICBGWF9SRUNUIGRldmljZV9yYyA9IEZYX1JFQ1Qoc3RhcnRfeCwgc3RhcnRfeSwgc3RhcnRfeCArIHNpemVfeCwgc3RhcnRfeSArIHNpemVfeSk7DQorICAgIEZYX0lOVDMyIG91dF9yYW5nZV94ID0gZGV2aWNlX3JjLnJpZ2h0IC0gcERJQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBvdXRfcmFuZ2VfeSA9IGRldmljZV9yYy5ib3R0b20gLSBwRElCaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgICBkZXZpY2VfcmMuSW50ZXJzZWN0KEZYX1JFQ1QoMCwgMCwgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpKSk7DQorICAgIGlmKGRldmljZV9yYy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgICB9DQorICAgIG1fc3RhcnRYID0gZGV2aWNlX3JjLmxlZnQ7DQorICAgIG1fc3RhcnRZID0gZGV2aWNlX3JjLnRvcDsNCisgICAgbV9zaXplWCAgPSBkZXZpY2VfcmMuV2lkdGgoKTsNCisgICAgbV9zaXplWSAgPSBkZXZpY2VfcmMuSGVpZ2h0KCk7DQorICAgIG1fYkludGVycG9sID0gYkludGVycG9sOw0KKyAgICBtX0ZyYW1lQ3VyID0gMDsNCisgICAgaWYoc3RhcnRfeCA8IDAgfHwgb3V0X3JhbmdlX3ggPiAwKSB7DQorICAgICAgICBGWF9GTE9BVCBzY2FsZVggPSAoRlhfRkxPQVQpbV9jbGlwQm94LldpZHRoKCkgLyAoRlhfRkxPQVQpc2l6ZV94Ow0KKyAgICAgICAgaWYoc3RhcnRfeCA8IDApCXsNCisgICAgICAgICAgICBtX2NsaXBCb3gubGVmdCAtPSAoRlhfSU5UMzIpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3RhcnRfeCAqIHNjYWxlWCk7DQorICAgICAgICB9DQorICAgICAgICBpZihvdXRfcmFuZ2VfeCA+IDApCXsNCisgICAgICAgICAgICBtX2NsaXBCb3gucmlnaHQgLT0gKEZYX0lOVDMyKUZYU1lTX2Zsb29yKChGWF9GTE9BVClvdXRfcmFuZ2VfeCAqIHNjYWxlWCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYoc3RhcnRfeSA8IDAgfHwgb3V0X3JhbmdlX3kgPiAwKSB7DQorICAgICAgICBGWF9GTE9BVCBzY2FsZVkgPSAoRlhfRkxPQVQpbV9jbGlwQm94LkhlaWdodCgpIC8gKEZYX0ZMT0FUKXNpemVfeTsNCisgICAgICAgIGlmKHN0YXJ0X3kgPCAwKSB7DQorICAgICAgICAgICAgbV9jbGlwQm94LnRvcCAgLT0gKEZYX0lOVDMyKUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXN0YXJ0X3kgKiBzY2FsZVkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYob3V0X3JhbmdlX3kgPiAwKSB7DQorICAgICAgICAgICAgbV9jbGlwQm94LmJvdHRvbSAgLT0gKEZYX0lOVDMyKUZYU1lTX2Zsb29yKChGWF9GTE9BVClvdXRfcmFuZ2VfeSAqIHNjYWxlWSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYobV9jbGlwQm94LklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICAgIH0NCisgICAgc3dpdGNoKG1faW1hZ1R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6IHsNCisgICAgICAgICAgICAgICAgSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKTsNCisgICAgICAgICAgICAgICAgaW50IGRvd25fc2NhbGUgPSAxOw0KKyAgICAgICAgICAgICAgICBHZXREb3duU2NhbGUoZG93bl9zY2FsZSk7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0ID0gcEpwZWdNb2R1bGUtPlN0YXJ0U2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIGRvd25fc2NhbGUpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSghYlN0YXJ0KSB7DQorICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICAgICAgICAgICAgICAgIGlmKCFKcGVnUmVhZE1vcmVEYXRhKHBKcGVnTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBiU3RhcnQgPSBwSnBlZ01vZHVsZS0+U3RhcnRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgZG93bl9zY2FsZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAoIG1fU3JjV2lkdGggKyBkb3duX3NjYWxlIC0gMSkgLyBkb3duX3NjYWxlOw0KKyAgICAgICAgICAgICAgICBzY2FubGluZV9zaXplID0gKHNjYW5saW5lX3NpemUgKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0Ow0KKyAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBzY2FubGluZV9zaXplKTsNCisgICAgICAgICAgICAgICAgaWYobV9wRGVjb2RlQnVmID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsNCisgICAgICAgICAgICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQorICAgICAgICAgICAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQorICAgICAgICAgICAgICAgIHN3aXRjaChtX1NyY0NvbXBvbmVudHMpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfOGJwcEdyYXk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfQ215azsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBHZXRUcmFuc01ldGhvZChwRElCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICBpZihwUG5nTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwUG5nTW9kdWxlLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gcFBuZ01vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KKyAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9vZmZTZXQgPSAwOw0KKyAgICAgICAgICAgICAgICBzd2l0Y2gobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwR3JheTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDM7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX0FyZ2I6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNDb21wb25lbnRzID0gNDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfQXJnYjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsNCisgICAgICAgICAgICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7DQorICAgICAgICAgICAgICAgIGlmKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQorICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihtX3BEZWNvZGVCdWYsIDAsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgICAgICAgICAgICBtX1dlaWdodEhvcnpPTy5DYWxjKG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQorICAgICAgICAgICAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICBpZihwR2lmTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBSZ2I7DQorICAgICAgICAgICAgICAgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsNCisgICAgICAgICAgICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCArIDMpIC8gNCAqIDQ7DQorICAgICAgICAgICAgICAgIGlmKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQorICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihtX3BEZWNvZGVCdWYsIDAsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgICAgICAgICAgICBtX1dlaWdodEhvcnouQ2FsYyhtX3NpemVYLCAwLCBtX3NpemVYLCBtX2NsaXBCb3guV2lkdGgoKSwgMCwgbV9jbGlwQm94LldpZHRoKCksIG1fYkludGVycG9sKTsNCisgICAgICAgICAgICAgICAgbV9XZWlnaHRWZXJ0LkNhbGMobV9zaXplWSwgbV9jbGlwQm94LkhlaWdodCgpKTsNCisgICAgICAgICAgICAgICAgbV9GcmFtZUN1ciA9IGZyYW1lczsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOiB7DQorICAgICAgICAgICAgICAgIElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCk7DQorICAgICAgICAgICAgICAgIGlmKHBCbXBNb2R1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzd2l0Y2gobV9TcmNDb21wb25lbnRzKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBSZ2I7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiMzI7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgR2V0VHJhbnNNZXRob2QobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOw0KKyAgICAgICAgICAgICAgICBtX1NjYW5saW5lU2l6ZSA9IChtX1NyY1dpZHRoICogbV9TcmNDb21wb25lbnRzICsgMykgLyA0ICogNDsNCisgICAgICAgICAgICAgICAgaWYobV9wRGVjb2RlQnVmICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsNCisgICAgICAgICAgICAgICAgICAgIG1fcERlY29kZUJ1ZiA9IE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2MoRlhfQllURSwgbV9TY2FubGluZVNpemUpOw0KKyAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihtX3BEZWNvZGVCdWYsIDAsIG1fU2NhbmxpbmVTaXplKTsNCisgICAgICAgICAgICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQorICAgICAgICAgICAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1RJRjoNCisgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorfQ0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkNvbnRpbnVlRGVjb2RlKElGWF9QYXVzZSogcFBhdXNlKQ0KK3sNCisgICAgaWYobV9zdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgew0KKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICB9DQorICAgIHN3aXRjaChtX2ltYWdUeXBlKSB7DQorICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOiB7DQorICAgICAgICAgICAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCk7DQorICAgICAgICAgICAgICAgIHdoaWxlKFRSVUUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVhZFJlcyA9IHBKcGVnTW9kdWxlLT5SZWFkU2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIG1fcERlY29kZUJ1Zik7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSghcmVhZFJlcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFJlcyA9IHBKcGVnTW9kdWxlLT5SZWFkU2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIG1fcERlY29kZUJ1Zik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihtX1NyY0Zvcm1hdCA9PSBGWENvZGVjX1JnYikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsNCisgICAgICAgICAgICAgICAgICAgICAgICBfUkdCMkJHUihtX3BEZWNvZGVCdWYgKyBtX2NsaXBCb3gubGVmdCAqIHNyY19CcHAsIG1fY2xpcEJveC5XaWR0aCgpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKG1fU3JjUm93ID49IG1fY2xpcEJveC5ib3R0b20pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBSZXNhbXBsZShtX3BEZXZpY2VCaXRtYXAsIG1fU3JjUm93LCBtX3BEZWNvZGVCdWYsIG1fU3JjRm9ybWF0KTsNCisgICAgICAgICAgICAgICAgICAgIG1fU3JjUm93Kys7DQorICAgICAgICAgICAgICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsNCisgICAgICAgICAgICAgICAgSUNvZGVjX1BuZ01vZHVsZSogcFBuZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRQbmdNb2R1bGUoKTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbWFpbl9zaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKSAtIG1fb2ZmU2V0Ow0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaW5wdXRfc2l6ZSA9IHJlbWFpbl9zaXplID4gRlhDT0RFQ19CTE9DS19TSVpFID8gRlhDT0RFQ19CTE9DS19TSVpFIDogcmVtYWluX3NpemU7DQorICAgICAgICAgICAgICAgICAgICBpZihpbnB1dF9zaXplID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihtX3BTcmNCdWYgIT0gTlVMTCAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BTcmNCdWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIGlucHV0X3NpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fcFNyY0J1ZiA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjU2l6ZSA9IGlucHV0X3NpemU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCBtX29mZlNldCwgaW5wdXRfc2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICBpZighYlJlc3VsdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBtX29mZlNldCArPSBpbnB1dF9zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgYlJlc3VsdCA9IHBQbmdNb2R1bGUtPklucHV0KG1fcFBuZ0NvbnRleHQsIG1fcFNyY0J1ZiwgaW5wdXRfc2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICBpZighYlJlc3VsdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9HSUY6IHsNCisgICAgICAgICAgICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsNCisgICAgICAgICAgICAgICAgd2hpbGUoVFJVRSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgcmVhZFJlcyA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZShtX3BHaWZDb250ZXh0LCBtX0ZyYW1lQ3VyKTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKHJlYWRSZXMgPT0gMikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUdpZlJlYWRNb3JlRGF0YShwR2lmTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFJlcyA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZShtX3BHaWZDb250ZXh0LCBtX0ZyYW1lQ3VyKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKHJlYWRSZXMgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDogew0KKyAgICAgICAgICAgICAgICBJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOw0KKyAgICAgICAgICAgICAgICB3aGlsZShUUlVFKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiByZWFkUmVzID0gcEJtcE1vZHVsZS0+TG9hZEltYWdlKG1fcEJtcENvbnRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUocmVhZFJlcyA9PSAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighQm1wUmVhZE1vcmVEYXRhKHBCbXBNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkUmVzID0gcEJtcE1vZHVsZS0+TG9hZEltYWdlKG1fcEJtcENvbnRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYocmVhZFJlcyA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOiB7DQorICAgICAgICAgICAgICAgIElDb2RlY19UaWZmTW9kdWxlKiBwVGlmZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRUaWZmTW9kdWxlKCk7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIGlmKG1fcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPT0gMzIgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAtPkdldFdpZHRoKCkgPT0gbV9TcmNXaWR0aCAmJiBtX1NyY1dpZHRoID09IG1fc2l6ZVggJiYNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAtPkdldEhlaWdodCgpID09IG1fU3JjSGVpZ2h0ICYmIG1fU3JjSGVpZ2h0ID09IG1fc2l6ZVkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0WCA9PSAwICYmIG1fc3RhcnRZID09IDAgJiYgbV9jbGlwQm94LmxlZnQgPT0gMCAmJiBtX2NsaXBCb3gudG9wID09IDANCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtX2NsaXBCb3gucmlnaHQgPT0gbV9TcmNXaWR0aCAmJiBtX2NsaXBCb3guYm90dG9tID09IG1fU3JjSGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LCBtX3BEZXZpY2VCaXRtYXApOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXJldCkJew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBESUJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLT5DcmVhdGUobV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYocERJQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LCBwRElCaXRtYXApOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcENsaXBCaXRtYXAgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtX2NsaXBCb3gubGVmdCAgPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3gudG9wID09IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LnJpZ2h0ID09IG1fU3JjV2lkdGggJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LmJvdHRvbSA9PSBtX1NyY0hlaWdodCkgPyBwRElCaXRtYXAgOiBwRElCaXRtYXAtPkNsb25lKCZtX2NsaXBCb3gpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYocERJQml0bWFwICE9IHBDbGlwQml0bWFwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKHBDbGlwQml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBGb3JtYXRCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwRm9ybWF0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCXzhicHBSZ2IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1hdEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1hdEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1hdEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IzMik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IHBDbGlwQml0bWFwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHJvdyA9IDA7IHJvdyA8IHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKTsgcm93KyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX2xpbmUgPSAoRlhfTFBCWVRFKXBDbGlwQml0bWFwLT5HZXRTY2FubGluZShyb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXNfbGluZSA9IChGWF9MUEJZVEUpcEZvcm1hdEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGNvbCA9IDA7IGNvbCA8IHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpOyBjb2wrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIF9hID0gMjU1IC0gc3JjX2xpbmVbM107DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgYiA9IChzcmNfbGluZVswXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBnID0gKHNyY19saW5lWzFdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHIgPSAoc3JjX2xpbmVbMl0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfbGluZSsrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xpbmUgKz0gNDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgZGVzQnBwID0gKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfUmdiKSA/IDMgOiA0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiByb3cgPSAwOyByb3cgPCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIHNyY19saW5lID0gKEZYX0xQQllURSlwQ2xpcEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzX2xpbmUgPSAoRlhfTFBCWVRFKXBGb3JtYXRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBjb2wgPSAwOyBjb2wgPCBwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKTsgY29sKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBfYSA9IDI1NSAtIHNyY19saW5lWzNdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGIgPSAoc3JjX2xpbmVbMF0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgZyA9IChzcmNfbGluZVsxXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByID0gKHNyY19saW5lWzJdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzX2xpbmUrKyA9IGI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfbGluZSsrID0gZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSByOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfbGluZSArPSBkZXNCcHAgLSAzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGluZSArPSA0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihwQ2xpcEJpdG1hcCAhPSBwRm9ybWF0Qml0bWFwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBDbGlwQml0bWFwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1hdEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZWNoQml0bWFwID0gcEZvcm1hdEJpdG1hcC0+U3RyZXRjaFRvKG1fc2l6ZVgsIG1fc2l6ZVksIG1fYkludGVycG9sID8gRlhESUJfSU5URVJQT0wgOiBGWERJQl9ET1dOU0FNUExFKTsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRm9ybWF0Qml0bWFwOw0KKyAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBpZihwU3RyZWNoQml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAtPlRyYW5zZmVyQml0bWFwKG1fc3RhcnRYLCBtX3N0YXJ0WSwgbV9zaXplWCwgbV9zaXplWSwgcFN0cmVjaEJpdG1hcCwgMCwgMCk7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFN0cmVjaEJpdG1hcDsNCisgICAgICAgICAgICAgICAgICAgIHBTdHJlY2hCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KK30NCitJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBDQ29kZWNfTW9kdWxlTWdyOjpDcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKHRoaXMpOw0KK30NCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmggYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2MThlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuaApAQCAtMCwwICsxLDIwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9DT0RFQ19QUk9HUkVTU19IXw0KKyNkZWZpbmUgX0ZYX0NPREVDX1BST0dSRVNTX0hfDQorI2RlZmluZSBGWENPREVDX0JMT0NLX1NJWkUgNDA5Ng0KKyNkZWZpbmUgRlhDT0RFQ19QTkdfR0FNTUEJMi4yDQorI2lmIF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfSU9TXw0KKyMJdW5kZWYgRlhDT0RFQ19QTkdfR0FNTUENCisjCWRlZmluZSBGWENPREVDX1BOR19HQU1NQQkxLjcNCisjZW5kaWYNCitzdHJ1Y3QgUGl4ZWxXZWlnaHQgew0KKyAgICBpbnQJCW1fU3JjU3RhcnQ7DQorICAgIGludAkJbV9TcmNFbmQ7DQorICAgIGludAkJbV9XZWlnaHRzWzFdOw0KK307DQorY2xhc3MgQ0ZYQ09ERUNfV2VpZ2h0VGFibGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWENPREVDX1dlaWdodFRhYmxlKCkNCisgICAgew0KKyAgICAgICAgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsNCisgICAgfQ0KKyAgICB+Q0ZYQ09ERUNfV2VpZ2h0VGFibGUoKQ0KKyAgICB7DQorICAgICAgICBpZihtX3BXZWlnaHRUYWJsZXMgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICB2b2lkCQkJQ2FsYyhpbnQgZGVzdF9sZW4sIGludCBkZXN0X21pbiwgaW50IGRlc3RfbWF4LCBpbnQgc3JjX2xlbiwgaW50IHNyY19taW4sIGludCBzcmNfbWF4LCBGWF9CT09MIGJJbnRlcnBvbCk7DQorICAgIFBpeGVsV2VpZ2h0KglHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpDQorICAgIHsNCisgICAgICAgIHJldHVybiAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyAocGl4ZWwgLSBtX0Rlc3RNaW4pICogbV9JdGVtU2l6ZSk7DQorICAgIH0NCisNCisgICAgaW50CQkJCW1fRGVzdE1pbiwgbV9JdGVtU2l6ZTsNCisgICAgRlhfTFBCWVRFCQltX3BXZWlnaHRUYWJsZXM7DQorfTsNCitjbGFzcyBDRlhDT0RFQ19Ib3J6VGFibGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWENPREVDX0hvcnpUYWJsZSgpDQorICAgIHsNCisgICAgICAgIG1fcFdlaWdodFRhYmxlcyA9IE5VTEw7DQorICAgIH0NCisgICAgfkNGWENPREVDX0hvcnpUYWJsZSgpDQorICAgIHsNCisgICAgICAgIGlmKG1fcFdlaWdodFRhYmxlcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRlhfRnJlZShtX3BXZWlnaHRUYWJsZXMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHZvaWQJCQlDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4sIEZYX0JPT0wgYkludGVycG9sKTsNCisgICAgUGl4ZWxXZWlnaHQqCUdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHBpeGVsICogbV9JdGVtU2l6ZSk7DQorICAgIH0NCisNCisgICAgaW50CQkJCW1fSXRlbVNpemU7DQorICAgIEZYX0xQQllURQkJbV9wV2VpZ2h0VGFibGVzOw0KK307DQorY2xhc3MgQ0ZYQ09ERUNfVmVydFRhYmxlIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhDT0RFQ19WZXJ0VGFibGUoKQ0KKyAgICB7DQorICAgICAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOw0KKyAgICB9DQorICAgIH5DRlhDT0RFQ19WZXJ0VGFibGUoKQ0KKyAgICB7DQorICAgICAgICBpZihtX3BXZWlnaHRUYWJsZXMgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB2b2lkCQkJQ2FsYyhpbnQgZGVzdF9sZW4sIGludCBzcmNfbGVuKTsNCisgICAgUGl4ZWxXZWlnaHQqCUdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHBpeGVsICogbV9JdGVtU2l6ZSk7DQorICAgIH0NCisgICAgaW50CQkJCW1fSXRlbVNpemU7DQorICAgIEZYX0xQQllURQkJbV9wV2VpZ2h0VGFibGVzOw0KK307DQorZW51bSBGWENvZGVjX0Zvcm1hdCB7DQorICAgIEZYQ29kZWNfSW52YWxpZCA9IDAsDQorICAgIEZYQ29kZWNfMWJwcEdyYXkgPSAweDEwMSwNCisgICAgRlhDb2RlY18xYnBwUmdiID0gMHgwMDEsDQorICAgIEZYQ29kZWNfOGJwcEdyYXkgPSAweDEwOCwNCisgICAgRlhDb2RlY184YnBwUmdiID0gMHgwMDgsDQorICAgIEZYQ29kZWNfUmdiID0gMHgwMTgsDQorICAgIEZYQ29kZWNfUmdiMzIgPSAweDAyMCwNCisgICAgRlhDb2RlY19BcmdiID0gMHgyMjAsDQorICAgIEZYQ29kZWNfQ215ayA9IDB4MTIwDQorfTsNCitjbGFzcyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyIDogcHVibGljIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXINCit7DQorcHVibGljOg0KKyAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01ncik7DQorICAgIHZpcnR1YWwgfkNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoKTsNCisNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCUxvYWRJbWFnZUluZm8oSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhDT0RFQ19JTUFHRV9UWVBFIGltYWdlVHlwZSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7DQorDQorICAgIHZpcnR1YWwgRlhDT0RFQ19JTUFHRV9UWVBFCUdldFR5cGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pbWFnVHlwZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0V2lkdGgoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9TcmNXaWR0aDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0SGVpZ2h0KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fU3JjSGVpZ2h0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXROdW1Db21wb25lbnRzKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fU3JjQ29tcG9uZW50czsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0QlBDKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fU3JjQlBDOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApOw0KKyAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlHZXRGcmFtZXMoRlhfSU5UMzImIGZyYW1lcywgSUZYX1BhdXNlKiBwUGF1c2UpOw0KKw0KKyAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlTdGFydERlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGZyYW1lcywgRlhfQk9PTCBiSW50ZXJwb2wpOw0KKw0KKyAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlDb250aW51ZURlY29kZShJRlhfUGF1c2UqIHBQYXVzZSk7DQorDQorcHJvdGVjdGVkOg0KKyAgICBGWF9CT09MCQkJCQkJRGV0ZWN0SW1hZ2VUeXBlKEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKTsNCisgICAgdm9pZAkJCQkJCUdldERvd25TY2FsZShpbnQmIGRvd25fc2NhbGUpOw0KKyAgICB2b2lkCQkJCQkJR2V0VHJhbnNNZXRob2QoRlhESUJfRm9ybWF0IGRlc19mb3JtYXQsIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOw0KKyAgICB2b2lkCQkJCQkJUmVTYW1wbGVTY2FubGluZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIEZYX0lOVDMyIGRlc19saW5lLCBGWF9MUEJZVEUgc3JjX3NjYW4sIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOw0KKyAgICB2b2lkCQkJCQkJUmVzYW1wbGUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBGWF9JTlQzMiBzcmNfbGluZSwgRlhfTFBCWVRFIHNyY19zY2FuLCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisgICAgdm9pZAkJCQkJCVJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3Jvdyk7DQorICAgIEZYX0JPT0wJCQkJCQlKcGVnUmVhZE1vcmVEYXRhKElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSwgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAkJCQlQbmdSZWFkSGVhZGVyRnVuYyh2b2lkKiBwTW9kdWxlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicGMsIGludCBwYXNzLCBpbnQqIGNvbG9yX3R5cGUsIGRvdWJsZSogZ2FtbWEpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAkJCQlQbmdBc2tTY2FubGluZUJ1ZkZ1bmModm9pZCogcE1vZHVsZSwgaW50IGxpbmUsIEZYX0xQQllURSYgc3JjX2J1Zik7DQorICAgIHN0YXRpYyB2b2lkCQkJCQlQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRGdW5jKHZvaWQqIHBNb2R1bGUsIGludCBwYXNzLCBpbnQgbGluZSk7DQorICAgIHZvaWQJCQkJCQlQbmdPbmVPbmVNYXBSZXNhbXBsZUhvcnooQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBGWF9JTlQzMiBkZXNfbGluZSwgRlhfTFBCWVRFIHNyY19zY2FuLCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisNCisgICAgRlhfQk9PTAkJCQkJCUdpZlJlYWRNb3JlRGF0YShJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlLCBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cyk7DQorICAgIHN0YXRpYyB2b2lkCQkJCQlHaWZSZWNvcmRDdXJyZW50UG9zaXRpb25DYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBGWF9EV09SRCYgY3VyX3Bvcyk7DQorICAgIHN0YXRpYyBGWF9MUEJZVEUJCQlHaWZBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBGWF9JTlQzMiBmcmFtZV9udW0sIEZYX0lOVDMyIHBhbF9zaXplKTsNCisgICAgc3RhdGljIEZYX0JPT0wJCQkJR2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MsIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywNCisgICAgICAgICAgICBGWF9JTlQzMiBwYWxfbnVtLCB2b2lkKiBwYWxfcHRyLA0KKyAgICAgICAgICAgIEZYX0lOVDMyIGRlbGF5X3RpbWUsIEZYX0JPT0wgdXNlcl9pbnB1dCwNCisgICAgICAgICAgICBGWF9JTlQzMiB0cmFuc19pbmRleCwgRlhfSU5UMzIgZGlzcG9zYWxfbWV0aG9kLCBGWF9CT09MIGludGVybGFjZSk7DQorICAgIHN0YXRpYyB2b2lkCQkJCQlHaWZSZWFkU2NhbmxpbmVDYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBGWF9JTlQzMiByb3dfbnVtLCBGWF9MUEJZVEUgcm93X2J1Zik7DQorICAgIHZvaWQJCQkJCQlHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwgZG91YmxlIHNjYWxlX3ksIGludCBkZXNfcm93KTsNCisgICAgRlhfQk9PTAkJCQkJCUJtcFJlYWRNb3JlRGF0YShJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlLCBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cyk7DQorICAgIHN0YXRpYyBGWF9CT09MCQkJCUJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MpOw0KKyAgICBzdGF0aWMgdm9pZAkJCQkJQm1wUmVhZFNjYW5saW5lQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgRlhfSU5UMzIgcm93X251bSwgRlhfTFBCWVRFIHJvd19idWYpOw0KKyAgICB2b2lkCQkJCQkJUmVzYW1wbGVWZXJ0QlQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBkb3VibGUgc2NhbGVfeSwgaW50IGRlc19yb3cpOw0KK3B1YmxpYzoNCisgICAgSUZYX0ZpbGVSZWFkKgkJCQltX3BGaWxlOw0KKyAgICBDQ29kZWNfTW9kdWxlTWdyKgkJCW1fcENvZGVjTWdyOw0KKyAgICBGWF9MUFZPSUQJCQkJCW1fcEpwZWdDb250ZXh0Ow0KKyAgICBGWF9MUFZPSUQJCQkJCW1fcFBuZ0NvbnRleHQ7DQorICAgIEZYX0xQVk9JRAkJCQkJbV9wR2lmQ29udGV4dDsNCisgICAgRlhfTFBWT0lECQkJCQltX3BCbXBDb250ZXh0Ow0KKyAgICBGWF9MUFZPSUQJCQkJCW1fcFRpZmZDb250ZXh0Ow0KKyAgICBGWENPREVDX0lNQUdFX1RZUEUJCQltX2ltYWdUeXBlOw0KKyAgICBGWF9EV09SRAkJCQkJbV9vZmZTZXQ7DQorICAgIEZYX0xQQllURQkJCQkJbV9wU3JjQnVmOw0KKyAgICBGWF9EV09SRAkJCQkJbV9TcmNTaXplOw0KKyAgICBGWF9MUEJZVEUJCQkJCW1fcERlY29kZUJ1ZjsNCisgICAgaW50CQkJCQkJCW1fU2NhbmxpbmVTaXplOw0KKyAgICBDRlhfRElCaXRtYXAqCQkJCW1fcERldmljZUJpdG1hcDsNCisgICAgRlhfQk9PTAkJCQkJCW1fYkludGVycG9sOw0KKyAgICBDRlhDT0RFQ19XZWlnaHRUYWJsZQkJbV9XZWlnaHRIb3J6Ow0KKyAgICBDRlhDT0RFQ19WZXJ0VGFibGUJCQltX1dlaWdodFZlcnQ7DQorICAgIENGWENPREVDX0hvcnpUYWJsZQkJCW1fV2VpZ2h0SG9yek9POw0KKyAgICBpbnQJCQltX1NyY1dpZHRoOw0KKyAgICBpbnQJCQltX1NyY0hlaWdodDsNCisgICAgaW50CQkJbV9TcmNDb21wb25lbnRzOw0KKyAgICBpbnQJCQltX1NyY0JQQzsNCisgICAgRlhfUkVDVAkJbV9jbGlwQm94Ow0KKyAgICBpbnQJCQltX3N0YXJ0WDsNCisgICAgaW50CQkJbV9zdGFydFk7DQorICAgIGludAkJCW1fc2l6ZVg7DQorICAgIGludAkJCW1fc2l6ZVk7DQorICAgIGludAkJCW1fVHJhbnNNZXRob2Q7DQorICAgIEZYX0FSR0IqCW1fcFNyY1BhbGV0dGU7DQorICAgIGludAkJCW1fU3JjUGFsZXR0ZU51bWJlcjsNCisgICAgaW50CQkJbV9TcmNSb3c7DQorICAgIEZYQ29kZWNfRm9ybWF0IG1fU3JjRm9ybWF0Ow0KKyAgICBpbnQJCQltX1NyY1Bhc3NOdW1iZXI7DQorICAgIGludAkJCW1fRnJhbWVOdW1iZXI7DQorICAgIGludAkJCW1fRnJhbWVDdXI7DQorICAgIGludAkJCQltX0dpZkJnSW5kZXg7DQorICAgIEZYX0xQQllURQkJbV9wR2lmUGFsZXR0ZTsNCisgICAgRlhfSU5UMzIJCW1fR2lmUGx0TnVtYmVyOw0KKyAgICBpbnQJCQkJbV9HaWZUcmFuc0luZGV4Ow0KKyAgICBGWF9SRUNUCQkJbV9HaWZGcmFtZVJlY3Q7DQorICAgIEZYX0JPT0wJCQltX0JtcElzVG9wQm90dG9tOw0KKyAgICBGWENPREVDX1NUQVRVUyBtX3N0YXR1czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfdGlmZi5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGRlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwCkBAIC0wLDAgKzEsNTMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2RpYi5oIg0KKyNpbmNsdWRlICJjb2RlY19pbnQuaCINCitleHRlcm4gIkMiIHsNCisjaW5jbHVkZSAiLi4vZnhfdGlmZi9pbmNsdWRlL2Z4X3RpZmZpb3AuaCINCit9DQorI2lmICFkZWZpbmVkKF9GUERGQVBJX01JTklfKQ0KK3ZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1bnNpZ25lZCBjaGFyKiBwUHJvZmlsZURhdGEsIHVuc2lnbmVkIGludCBkd1Byb2ZpbGVTaXplLCBpbnQgbkNvbXBvbmVudHMsIGludCBpbnRlbnQsIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxUKTsNCit2b2lkIEljY0xpYl9UcmFuc2xhdGVJbWFnZSh2b2lkKiBwVHJhbnNmb3JtLCB1bnNpZ25lZCBjaGFyKiBwRGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciogcFNyYywgaW50IHBpeGVscyk7DQordm9pZCBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKTsNCisjZW5kaWYNCitjbGFzcyBDQ29kZWNfVGlmZkNvbnRleHQgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENDb2RlY19UaWZmQ29udGV4dCgpOw0KKyAgICB+Q0NvZGVjX1RpZmZDb250ZXh0KCk7DQorDQorICAgIEZYX0JPT0wJSW5pdERlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cik7DQorICAgIHZvaWQJR2V0RnJhbWVzKEZYX0lOVDMyJiBmcmFtZXMpOw0KKyAgICBGWF9CT09MCUxvYWRGcmFtZUluZm8oRlhfSU5UMzIgZnJhbWUsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvbXBzLCBGWF9EV09SRCYgYnBjLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsNCisgICAgRlhfQk9PTAlEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOw0KKw0KKyAgICB1bmlvbiB7DQorICAgICAgICBJRlhfRmlsZVJlYWQqCWluOw0KKyAgICAgICAgSUZYX0ZpbGVTdHJlYW0qIG91dDsNCisgICAgfSBpbzsNCisNCisgICAgRlhfRFdPUkQJCW9mZnNldDsNCisNCisgICAgVElGRioJCQl0aWZfY3R4Ow0KKyAgICB2b2lkKgkJCWljY19jdHg7DQorICAgIEZYX0lOVDMyCQlmcmFtZV9udW07DQorICAgIEZYX0lOVDMyCQlmcmFtZV9jdXI7DQorICAgIEZYX0JPT0wJCQlpc0RlY29kZXI7DQorcHJpdmF0ZToNCisgICAgRlhfQk9PTAlpc1N1cHBvcnQoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOw0KKyAgICB2b2lkCVNldFBhbGV0dGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIEZYX1VJTlQxNiBicHMpOw0KKyAgICBGWF9CT09MCURlY29kZTFicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgd2lkdGgsIEZYX1VJTlQxNiBicHMsIEZYX1VJTlQxNiBzcHApOw0KKyAgICBGWF9CT09MCURlY29kZThicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgd2lkdGgsIEZYX1VJTlQxNiBicHMsIEZYX1VJTlQxNiBzcHApOw0KKyAgICBGWF9CT09MCURlY29kZTI0YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHdpZHRoLCBGWF9VSU5UMTYgYnBzLCBGWF9VSU5UMTYgc3BwKTsNCit9Ow0KK0NDb2RlY19UaWZmQ29udGV4dDo6Q0NvZGVjX1RpZmZDb250ZXh0KCkNCit7DQorICAgIG9mZnNldCA9IDA7DQorICAgIGZyYW1lX251bSA9IDA7DQorICAgIGZyYW1lX2N1ciA9IDA7DQorICAgIGlvLmluID0gTlVMTDsNCisgICAgdGlmX2N0eCA9IE5VTEw7DQorICAgIGljY19jdHggPSBOVUxMOw0KKyAgICBpc0RlY29kZXIgPSBUUlVFOw0KK30NCitDQ29kZWNfVGlmZkNvbnRleHQ6On5DQ29kZWNfVGlmZkNvbnRleHQoKQ0KK3sNCisjaWYgIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pDQorICAgIGlmKGljY19jdHgpIHsNCisgICAgICAgIEljY0xpYl9EZXN0cm95VHJhbnNmb3JtKGljY19jdHgpOw0KKyAgICAgICAgaWNjX2N0eCA9IE5VTEw7DQorICAgIH0NCisjZW5kaWYNCisgICAgaWYodGlmX2N0eCkJew0KKyAgICAgICAgVElGRkNsb3NlKHRpZl9jdHgpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB0c2l6ZV90IF90aWZmX3JlYWQodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QgYnVmLCB0c2l6ZV90IGxlbmd0aCkNCit7DQorICAgIENDb2RlY19UaWZmQ29udGV4dCogcFRpZmZDb250ZXh0ID0gKENDb2RlY19UaWZmQ29udGV4dCopY29udGV4dDsNCisgICAgRlhfQk9PTCByZXQgPSBGQUxTRTsNCisgICAgaWYocFRpZmZDb250ZXh0LT5pc0RlY29kZXIpIHsNCisgICAgICAgIHJldCA9IHBUaWZmQ29udGV4dC0+aW8uaW4tPlJlYWRCbG9jayhidWYsIHBUaWZmQ29udGV4dC0+b2Zmc2V0LCBsZW5ndGgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0ID0gcFRpZmZDb250ZXh0LT5pby5vdXQtPlJlYWRCbG9jayhidWYsIHBUaWZmQ29udGV4dC0+b2Zmc2V0LCBsZW5ndGgpOw0KKyAgICB9DQorICAgIGlmKCFyZXQpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ICs9IChGWF9EV09SRClsZW5ndGg7DQorICAgIHJldHVybiBsZW5ndGg7DQorfQ0KK3N0YXRpYyB0c2l6ZV90IF90aWZmX3dyaXRlKHRoYW5kbGVfdCBjb250ZXh0LCB0ZGF0YV90IGJ1ZiwgdHNpemVfdCBsZW5ndGgpDQorew0KKyAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQorICAgIEFTU0VSVCghcFRpZmZDb250ZXh0LT5pc0RlY29kZXIpOw0KKyAgICBpZighcFRpZmZDb250ZXh0LT5pby5vdXQtPldyaXRlQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgcFRpZmZDb250ZXh0LT5vZmZzZXQgKz0gKEZYX0RXT1JEKWxlbmd0aDsNCisgICAgcmV0dXJuIGxlbmd0aDsNCit9DQorc3RhdGljIHRvZmZfdCBfdGlmZl9zZWVrKHRoYW5kbGVfdCBjb250ZXh0LCB0b2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQ0KK3sNCisgICAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgICBzd2l0Y2god2hlbmNlKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgcFRpZmZDb250ZXh0LT5vZmZzZXQgPSAoRlhfRFdPUkQpb2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ICs9IChGWF9EV09SRClvZmZzZXQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgaWYocFRpZmZDb250ZXh0LT5pc0RlY29kZXIpIHsNCisgICAgICAgICAgICAgICAgaWYocFRpZmZDb250ZXh0LT5pby5pbi0+R2V0U2l6ZSgpIDwgKEZYX0ZJTEVTSVpFKW9mZnNldCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ID0gKEZYX0RXT1JEKShwVGlmZkNvbnRleHQtPmlvLmluLT5HZXRTaXplKCkgLSBvZmZzZXQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmKHBUaWZmQ29udGV4dC0+aW8ub3V0LT5HZXRTaXplKCkgPCAoRlhfRklMRVNJWkUpb2Zmc2V0KSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFRpZmZDb250ZXh0LT5vZmZzZXQgPSAoRlhfRFdPUkQpKHBUaWZmQ29udGV4dC0+aW8ub3V0LT5HZXRTaXplKCkgLSBvZmZzZXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIEFTU0VSVChwVGlmZkNvbnRleHQtPmlzRGVjb2RlciA/DQorICAgICAgICAgICAocFRpZmZDb250ZXh0LT5vZmZzZXQgPD0gKEZYX0RXT1JEKXBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKSkgOg0KKyAgICAgICAgICAgVFJVRSk7DQorICAgIHJldHVybiBwVGlmZkNvbnRleHQtPm9mZnNldDsNCit9DQorc3RhdGljIGludCBfdGlmZl9jbG9zZSh0aGFuZGxlX3QgY29udGV4dCkNCit7DQorICAgIHJldHVybiAwOw0KK30NCitzdGF0aWMgdG9mZl90IF90aWZmX2dldF9zaXplKHRoYW5kbGVfdCBjb250ZXh0KQ0KK3sNCisgICAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgICByZXR1cm4gcFRpZmZDb250ZXh0LT5pc0RlY29kZXIgPw0KKyAgICAgICAgICAgKHRvZmZfdClwVGlmZkNvbnRleHQtPmlvLmluLT5HZXRTaXplKCkgOg0KKyAgICAgICAgICAgKHRvZmZfdClwVGlmZkNvbnRleHQtPmlvLm91dC0+R2V0U2l6ZSgpOw0KK30NCitzdGF0aWMgaW50IF90aWZmX21hcCh0aGFuZGxlX3QgY29udGV4dCwgdGRhdGFfdCosIHRvZmZfdCopDQorew0KKyAgICByZXR1cm4gMDsNCit9DQorc3RhdGljIHZvaWQgX3RpZmZfdW5tYXAodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QsIHRvZmZfdCkge30NCitUSUZGKiBfdGlmZl9vcGVuKHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1vZGUpDQorew0KKyAgICBUSUZGKiB0aWYgPSBUSUZGQ2xpZW50T3BlbigiVGlmZiBJbWFnZSIsIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGFuZGxlX3QpY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpZmZfcmVhZCwgX3RpZmZfd3JpdGUsIF90aWZmX3NlZWssIF90aWZmX2Nsb3NlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGlmZl9nZXRfc2l6ZSwgX3RpZmZfbWFwLCBfdGlmZl91bm1hcCk7DQorICAgIGlmKHRpZikJew0KKyAgICAgICAgdGlmLT50aWZfZmQgPSAoaW50KShGWF9JTlRQVFIpY29udGV4dDsNCisgICAgfQ0KKyAgICByZXR1cm4gdGlmOw0KK30NCit2b2lkKiBfVElGRm1hbGxvYyh0bXNpemVfdCBzaXplKQ0KK3sNCisgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAwKTsNCit9DQordm9pZCBfVElGRmZyZWUodm9pZCogcHRyKQ0KK3sNCisgICAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsNCit9DQordm9pZCogX1RJRkZyZWFsbG9jKHZvaWQqIHB0ciwgdG1zaXplX3Qgc2l6ZSkNCit7DQorICAgIHJldHVybiBGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIHNpemUsIDApOw0KK30NCit2b2lkIF9USUZGbWVtc2V0KHZvaWQqIHB0ciwgaW50IHZhbCwgdG1zaXplX3Qgc2l6ZSkNCit7DQorICAgIEZYU1lTX21lbXNldDgocHRyLCB2YWwsIChzaXplX3Qpc2l6ZSk7DQorfQ0KK3ZvaWQgX1RJRkZtZW1jcHkodm9pZCogZGVzLCBjb25zdCB2b2lkKiBzcmMsIHRtc2l6ZV90IHNpemUpDQorew0KKyAgICBGWFNZU19tZW1jcHkzMihkZXMsIHNyYywgKHNpemVfdClzaXplKTsNCit9DQoraW50IF9USUZGbWVtY21wKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIsIHRtc2l6ZV90IHNpemUpDQorew0KKyAgICByZXR1cm4gRlhTWVNfbWVtY21wMzIocHRyMSwgcHRyMiwgKHNpemVfdClzaXplKTsNCit9DQorc3RhdGljIHZvaWQgX3RpZmZfd2FybmluZ19leHQodGhhbmRsZV90IGNvbnRleHQsIGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFwKQ0KK3sNCisgICAgaWYobW9kdWxlICE9IE5VTEwpIHsNCisgICAgfQ0KK30NCitUSUZGRXJyb3JIYW5kbGVyRXh0IF9USUZGd2FybmluZ0hhbmRsZXJFeHQgPSBfdGlmZl93YXJuaW5nX2V4dDsNCitzdGF0aWMgdm9pZCBfdGlmZl9lcnJvcl9leHQodGhhbmRsZV90IGNvbnRleHQsIGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFwKQ0KK3sNCisgICAgaWYobW9kdWxlICE9IE5VTEwpIHsNCisgICAgfQ0KK30NCitUSUZGRXJyb3JIYW5kbGVyRXh0IF9USUZGZXJyb3JIYW5kbGVyRXh0ID0gX3RpZmZfZXJyb3JfZXh0Ow0KK2ludCBUSUZGQ215azJSZ2IodGhhbmRsZV90IGNvbnRleHQsIHVpbnQ4IGMsIHVpbnQ4IG0sIHVpbnQ4IHksIHVpbnQ4IGssIHVpbnQ4KiByLCB1aW50OCogZywgdWludDgqIGIpDQorew0KKyAgICBpZihjb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIENDb2RlY19UaWZmQ29udGV4dCogcCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQorI2lmICFkZWZpbmVkKF9GUERGQVBJX01JTklfKQ0KKyAgICBpZihwLT5pY2NfY3R4KSB7DQorICAgICAgICB1bnNpZ25lZCBjaGFyIGNteWtbNF0sIGJnclszXTsNCisgICAgICAgIGNteWtbMF0gPSBjLCBjbXlrWzFdID0gbSwgY215a1syXSA9IHksIGNteWtbM10gPSBrOw0KKyAgICAgICAgSWNjTGliX1RyYW5zbGF0ZUltYWdlKHAtPmljY19jdHgsIGJnciwgY215aywgMSk7DQorICAgICAgICAqciA9IGJnclsyXSwgKmcgPSBiZ3JbMV0sICpiID0gYmdyWzBdOw0KKyAgICB9IGVsc2Ugew0KKyNlbmRpZg0KKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKGMsIG0sIHksIGssICpyLCAqZywgKmIpOw0KKyNpZiAhZGVmaW5lZChfRlBERkFQSV9NSU5JXykNCisgICAgfQ0KKyNlbmRpZg0KKyAgICByZXR1cm4gMTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkluaXREZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpDQorew0KKyAgICBpby5pbiA9IGZpbGVfcHRyOw0KKyAgICB0aWZfY3R4ID0gX3RpZmZfb3Blbih0aGlzLCAiciIpOw0KKyAgICBpZih0aWZfY3R4ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfVGlmZkNvbnRleHQ6OkdldEZyYW1lcyhGWF9JTlQzMiYgZnJhbWVzKQ0KK3sNCisgICAgZnJhbWVzID0gZnJhbWVfbnVtID0gVElGRk51bWJlck9mRGlyZWN0b3JpZXModGlmX2N0eCk7DQorfQ0KKyNkZWZpbmUgVElGRl9FWElGX0dFVElORk8oa2V5LCBULCB0YWcpIHtcDQorICAgICAgICBUIHZhbCA9IChUKTA7XA0KKyAgICAgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsdGFnLCZ2YWwpO1wNCisgICAgICAgIGlmICh2YWwpIHtcDQorICAgICAgICAgICAgKGtleSkgPSBGWF9BbGxvYyhGWF9CWVRFLHNpemVvZihUKSk7XA0KKyAgICAgICAgICAgIGlmICgoa2V5KSkge1wNCisgICAgICAgICAgICAgICAgVCogcHRyID0gKFQqKShrZXkpO1wNCisgICAgICAgICAgICAgICAgKnB0ciA9IHZhbDtcDQorICAgICAgICAgICAgICAgIHBFeGlmLT5tX1RhZ1ZhbC5TZXRBdCh0YWcsKGtleSkpO319fVwNCisgICAgKGtleSkgPSBOVUxMOw0KKyNkZWZpbmUgVElGRl9FWElGX0dFVFNUUklOR0lORk8oa2V5LCB0YWcpIHtcDQorICAgICAgICBGWF9EV09SRCBzaXplID0gMDtcDQorICAgICAgICBGWF9MUEJZVEUgYnVmID0gTlVMTDtcDQorICAgICAgICBUSUZGR2V0RmllbGQodGlmX2N0eCx0YWcsJnNpemUsICZidWYpO1wNCisgICAgICAgIGlmIChzaXplICYmIGJ1Zikge1wNCisgICAgICAgICAgICAoa2V5KSA9IEZYX0FsbG9jKEZYX0JZVEUsc2l6ZSk7XA0KKyAgICAgICAgICAgIGlmICgoa2V5KSkge1wNCisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoKGtleSksYnVmLHNpemUpO1wNCisgICAgICAgICAgICAgICAgcEV4aWYtPm1fVGFnVmFsLlNldEF0KHRhZywoa2V5KSk7fX19XA0KKyAgICAoa2V5KSA9IE5VTEw7DQordGVtcGxhdGUgPGNsYXNzIFQ+DQorc3RhdGljIEZYX0JPT0wgVGlmZl9FeGlmX0dldEluZm8oVElGRiogdGlmX2N0eCwgdHRhZ190IHRhZywgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYqIHBFeGlmKQ0KK3sNCisgICAgRlhfTFBCWVRFIGtleSA9IE5VTEw7DQorICAgIFQgdmFsID0gKFQpMDsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIHRhZywgJnZhbCk7DQorICAgIGlmICh2YWwpIHsNCisgICAgICAgIChrZXkpID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZW9mKFQpKTsNCisgICAgICAgIGlmICgoa2V5KSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgVCogcHRyID0gKFQqKShrZXkpOw0KKyAgICAgICAgKnB0ciA9IHZhbDsNCisgICAgICAgIHBFeGlmLT5tX1RhZ1ZhbC5TZXRBdCh0YWcsIChrZXkpKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorc3RhdGljIHZvaWQgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8oVElGRiogdGlmX2N0eCwgdHRhZ190IHRhZywgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYqIHBFeGlmKQ0KK3sNCisgICAgRlhfTFBTVFIgYnVmID0gTlVMTDsNCisgICAgRlhfTFBCWVRFIGtleSA9IE5VTEw7DQorICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCB0YWcsICZidWYpOw0KKyAgICBpZiAoYnVmKSB7DQorICAgICAgICBGWF9JTlQzMiBzaXplID0gKEZYX0lOVDMyKUZYU1lTX3N0cmxlbihidWYpOw0KKyAgICAgICAgKGtleSkgPSBGWF9BbGxvYyhGWF9CWVRFLCBzaXplICsgMSk7DQorICAgICAgICBpZiAoKGtleSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYU1lTX21lbWNweTMyKChrZXkpLCBidWYsIHNpemUpOw0KKyAgICAgICAga2V5W3NpemVdID0gMDsNCisgICAgICAgIHBFeGlmLT5tX1RhZ1ZhbC5TZXRBdCh0YWcsIChrZXkpKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6TG9hZEZyYW1lSW5mbyhGWF9JTlQzMiBmcmFtZSwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgY29tcHMsIEZYX0RXT1JEJiBicGMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoIVRJRkZTZXREaXJlY3RvcnkodGlmX2N0eCwgKHVpbnQxNilmcmFtZSkpCXsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9XT1JEIHRpZl9jczsNCisgICAgRlhfRFdPUkQgdGlmX2ljY19zaXplID0gMDsNCisgICAgRlhfTFBCWVRFIHRpZl9pY2NfYnVmID0gTlVMTDsNCisgICAgRlhfV09SRCB0aWZfYnBjID0gMDsNCisgICAgRlhfV09SRCB0aWZfY3BzOw0KKyAgICBGWF9EV09SRCB0aWZfcnBzOw0KKyAgICB3aWR0aCA9IGhlaWdodCA9IGNvbXBzID0gMDsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoKTsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZoZWlnaHQpOw0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsICZjb21wcyk7DQorICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZ0aWZfYnBjKTsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZ0aWZfY3MpOw0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19DT01QUkVTU0lPTiwgJnRpZl9jcHMpOw0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZ0aWZfcnBzKTsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSUNDUFJPRklMRSwgJnRpZl9pY2Nfc2l6ZSwgJnRpZl9pY2NfYnVmKTsNCisgICAgaWYgKHBBdHRyaWJ1dGUpIHsNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfSU5DSDsNCisgICAgICAgIGlmIChUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19SRVNPTFVUSU9OVU5JVCwgJnBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQpKSB7DQorICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCAtPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYqIHBFeGlmID0gKENGWF9ESUJBdHRyaWJ1dGVFeGlmKilwQXR0cmlidXRlLT5tX3BFeGlmOw0KKyAgICAgICAgcEV4aWYtPmNsZWFyKCk7DQorICAgICAgICBUaWZmX0V4aWZfR2V0SW5mbzxGWF9XT1JEPih0aWZfY3R4LCBUSUZGVEFHX09SSUVOVEFUSU9OLCBwRXhpZik7DQorICAgICAgICBpZiAoVGlmZl9FeGlmX0dldEluZm88RlhfRkxPQVQ+KHRpZl9jdHgsIFRJRkZUQUdfWFJFU09MVVRJT04sIHBFeGlmKSkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZEcGkgPSAwOw0KKyAgICAgICAgICAgIHBFeGlmLT5HZXRJbmZvKFRJRkZUQUdfWFJFU09MVVRJT04sICZmRHBpKTsNCisgICAgICAgICAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gKEZYX0lOVDMyKShmRHBpICsgMC41Zik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoVGlmZl9FeGlmX0dldEluZm88RlhfRkxPQVQ+KHRpZl9jdHgsIFRJRkZUQUdfWVJFU09MVVRJT04sIHBFeGlmKSkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZEcGkgPSAwOw0KKyAgICAgICAgICAgIHBFeGlmLT5HZXRJbmZvKFRJRkZUQUdfWVJFU09MVVRJT04sICZmRHBpKTsNCisgICAgICAgICAgICBwQXR0cmlidXRlLT5tX25ZRFBJID0gKEZYX0lOVDMyKShmRHBpICsgMC41Zik7DQorICAgICAgICB9DQorICAgICAgICBUaWZmX0V4aWZfR2V0U3RyaW5nSW5mbyh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFREVTQ1JJUFRJT04sIHBFeGlmKTsNCisgICAgICAgIFRpZmZfRXhpZl9HZXRTdHJpbmdJbmZvKHRpZl9jdHgsIFRJRkZUQUdfTUFLRSwgcEV4aWYpOw0KKyAgICAgICAgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8odGlmX2N0eCwgVElGRlRBR19NT0RFTCwgcEV4aWYpOw0KKyAgICB9DQorICAgIGJwYyA9IHRpZl9icGM7DQorICAgIGlmKHRpZl9ycHMgPiBoZWlnaHQpIHsNCisgICAgICAgIFRJRkZTZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgdGlmX3JwcyA9IGhlaWdodCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgX1RpZmZCR1JBMlJHQkEoRlhfTFBCWVRFIHBCdWYsIEZYX0lOVDMyIHBpeGVsLCBGWF9JTlQzMiBzcHApDQorew0KKyAgICByZWdpc3RlciBGWF9CWVRFIHRtcDsNCisgICAgZm9yIChGWF9JTlQzMiBuID0gMDsgbiA8IHBpeGVsOyBuKyspIHsNCisgICAgICAgIHRtcCA9IHBCdWZbMF07DQorICAgICAgICBwQnVmWzBdID0gcEJ1ZlsyXTsNCisgICAgICAgIHBCdWZbMl0gPSB0bXA7DQorICAgICAgICBwQnVmICs9IHNwcDsNCisgICAgfQ0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6aXNTdXBwb3J0KENGWF9ESUJpdG1hcCogcERJQml0bWFwKQ0KK3sNCisgICAgaWYgKFRJRkZJc1RpbGVkKHRpZl9jdHgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfVUlOVDE2IHBob3RvbWV0cmljOw0KKyAgICBpZiAoIVRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmcGhvdG9tZXRyaWMpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgc3dpdGNoIChwRElCaXRtYXAtPkdldEJQUCgpKSB7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgaWYgKHBob3RvbWV0cmljICE9IFBIT1RPTUVUUklDX1BBTEVUVEUpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjQ6DQorICAgICAgICAgICAgaWYgKHBob3RvbWV0cmljICE9IFBIT1RPTUVUUklDX1JHQikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfVUlOVDE2IHBsYW5hcmNvbmZpZzsNCisgICAgaWYgKCFUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmX2N0eCwgVElGRlRBR19QTEFOQVJDT05GSUcsICZwbGFuYXJjb25maWcpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfVGlmZkNvbnRleHQ6OlNldFBhbGV0dGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIEZYX1VJTlQxNiBicHMpDQorew0KKyAgICBGWF9VSU5UMTYgKnJlZF9vcmlnLCAqZ3JlZW5fb3JpZywgKmJsdWVfb3JpZzsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfQ09MT1JNQVAsICZyZWRfb3JpZywgJmdyZWVuX29yaWcsICZibHVlX29yaWcpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAoMUwgPDwgYnBzKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorI2RlZmluZQlDVlQoeCkJCSgoRlhfVUlOVDE2KSgoeCk+PjgpKQ0KKyAgICAgICAgcmVkX29yaWdbaV0gPSBDVlQocmVkX29yaWdbaV0pOw0KKyAgICAgICAgZ3JlZW5fb3JpZ1tpXSA9IENWVChncmVlbl9vcmlnW2ldKTsNCisgICAgICAgIGJsdWVfb3JpZ1tpXSA9IENWVChibHVlX29yaWdbaV0pOw0KKyN1bmRlZglDVlQNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBsZW4gPSAxIDw8IGJwczsNCisgICAgZm9yKEZYX0lOVDMyIGluZGV4ID0gMDsgaW5kZXggPCBsZW47IGluZGV4KyspIHsNCisgICAgICAgIEZYX0RXT1JEIHIgPSByZWRfb3JpZ1tpbmRleF0gJiAweEZGOw0KKyAgICAgICAgRlhfRFdPUkQgZyA9IGdyZWVuX29yaWdbaW5kZXhdICYgMHhGRjsNCisgICAgICAgIEZYX0RXT1JEIGIgPSBibHVlX29yaWdbaW5kZXhdICYgMHhGRjsNCisgICAgICAgIEZYX0RXT1JEIGNvbG9yID0gKEZYX1VJTlQzMiliIHwgKChGWF9VSU5UMzIpZyA8PCA4KSB8ICgoRlhfVUlOVDMyKXIgPDwgMTYpIHwgKCgodWludDMyKTB4ZmZMKSA8PCAyNCk7DQorICAgICAgICBwRElCaXRtYXAtPlNldFBhbGV0dGVFbnRyeShpbmRleCwgY29sb3IpOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpEZWNvZGUxYnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHdpZHRoLCBGWF9VSU5UMTYgYnBzLCBGWF9VSU5UMTYgc3BwKQ0KK3sNCisgICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gMSB8fCBzcHAgIT0gMSB8fCBicHMgIT0gMSB8fCAhaXNTdXBwb3J0KHBESUJpdG1hcCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBTZXRQYWxldHRlKHBESUJpdG1hcCwgYnBzKTsNCisgICAgRlhfSU5UMzIgc2l6ZSA9IChGWF9JTlQzMilUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KKyAgICBGWF9MUEJZVEUgYnVmID0gKEZYX0xQQllURSlfVElGRm1hbGxvYyhzaXplKTsNCisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBUSUZGRXJyb3IoVElGRkZpbGVOYW1lKHRpZl9jdHgpLCAiTm8gc3BhY2UgZm9yIHNjYW5saW5lIGJ1ZmZlciIpOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQQllURSBiaXRNYXBidWZmZXIgPSAoRlhfTFBCWVRFKXBESUJpdG1hcC0+R2V0QnVmZmVyKCk7DQorICAgIEZYX0RXT1JEIHBpdGNoID0gcERJQml0bWFwLT5HZXRQaXRjaCgpOw0KKyAgICBmb3IoRlhfSU5UMzIgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICAgICAgVElGRlJlYWRTY2FubGluZSh0aWZfY3R4LCBidWYsIHJvdywgMCk7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaiA9IDA7IGogPCBzaXplOyBqKyspIHsNCisgICAgICAgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqXSA9IGJ1ZltqXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBfVElGRmZyZWUoYnVmKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpEZWNvZGU4YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHdpZHRoLCBGWF9VSU5UMTYgYnBzLCBGWF9VSU5UMTYgc3BwKQ0KK3sNCisgICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gOCB8fCBzcHAgIT0gMSB8fCAoYnBzICE9IDQgJiYgYnBzICE9IDgpIHx8ICFpc1N1cHBvcnQocERJQml0bWFwKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFNldFBhbGV0dGUocERJQml0bWFwLCBicHMpOw0KKyAgICBGWF9JTlQzMiBzaXplID0gKEZYX0lOVDMyKVRJRkZTY2FubGluZVNpemUodGlmX2N0eCk7DQorICAgIEZYX0xQQllURSBidWYgPSAoRlhfTFBCWVRFKV9USUZGbWFsbG9jKHNpemUpOw0KKyAgICBpZiAoYnVmID09IE5VTEwpIHsNCisgICAgICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfTFBCWVRFIGJpdE1hcGJ1ZmZlciA9IChGWF9MUEJZVEUpcERJQml0bWFwLT5HZXRCdWZmZXIoKTsNCisgICAgRlhfRFdPUkQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7DQorICAgIGZvcihGWF9JTlQzMiByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQorICAgICAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCisgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IHNpemU7IGorKykgew0KKyAgICAgICAgICAgIHN3aXRjaChicHMpIHsNCisgICAgICAgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgMiAqIGogKyAwXSA9IChidWZbal0gJiAweEYwKSA+PiA0Ow0KKyAgICAgICAgICAgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgMiAqIGogKyAxXSA9IChidWZbal0gJiAweDBGKSA+PiAwOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgICAgICAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIGpdID0gYnVmW2pdOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIF9USUZGZnJlZShidWYpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZTI0YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHdpZHRoLCBGWF9VSU5UMTYgYnBzLCBGWF9VSU5UMTYgc3BwKQ0KK3sNCisgICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gMjQgfHwgIWlzU3VwcG9ydChwRElCaXRtYXApKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgc2l6ZSA9IChGWF9JTlQzMilUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KKyAgICBGWF9MUEJZVEUgYnVmID0gKEZYX0xQQllURSlfVElGRm1hbGxvYyhzaXplKTsNCisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBUSUZGRXJyb3IoVElGRkZpbGVOYW1lKHRpZl9jdHgpLCAiTm8gc3BhY2UgZm9yIHNjYW5saW5lIGJ1ZmZlciIpOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQQllURSBiaXRNYXBidWZmZXIgPSAoRlhfTFBCWVRFKXBESUJpdG1hcC0+R2V0QnVmZmVyKCk7DQorICAgIEZYX0RXT1JEIHBpdGNoID0gcERJQml0bWFwLT5HZXRQaXRjaCgpOw0KKyAgICBmb3IoRlhfSU5UMzIgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICAgICAgVElGRlJlYWRTY2FubGluZSh0aWZfY3R4LCBidWYsIHJvdywgMCk7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaiA9IDA7IGogPCBzaXplIC0gMjsgaiArPSAzKSB7DQorICAgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgaiArIDBdID0gYnVmW2ogKyAyXTsNCisgICAgICAgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqICsgMV0gPSBidWZbaiArIDFdOw0KKyAgICAgICAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIGogKyAyXSA9IGJ1ZltqICsgMF07DQorICAgICAgICB9DQorICAgIH0NCisgICAgX1RJRkZmcmVlKGJ1Zik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlKENGWF9ESUJpdG1hcCogcERJQml0bWFwKQ0KK3sNCisgICAgRlhfRFdPUkQgaW1nX3dpZCA9IHBESUJpdG1hcC0+R2V0V2lkdGgoKTsNCisgICAgRlhfRFdPUkQgaW1nX2hlaSA9IHBESUJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICAgIEZYX0RXT1JEIHdpZHRoID0gMDsNCisgICAgRlhfRFdPUkQgaGVpZ2h0ID0gMDsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoKTsNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZoZWlnaHQpOw0KKyAgICBpZiAoaW1nX3dpZCAhPSB3aWR0aCB8fCBpbWdfaGVpICE9IGhlaWdodCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwRElCaXRtYXAtPkdldEJQUCgpID09IDMyKSB7DQorICAgICAgICBGWF9XT1JEIHJvdGF0aW9uID0gT1JJRU5UQVRJT05fVE9QTEVGVDsNCisgICAgICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX09SSUVOVEFUSU9OLCAmcm90YXRpb24pOw0KKyAgICAgICAgaWYoVElGRlJlYWRSR0JBSW1hZ2VPcmllbnRlZCh0aWZfY3R4LCBpbWdfd2lkLCBpbWdfaGVpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyKilwRElCaXRtYXAtPkdldEJ1ZmZlcigpLCByb3RhdGlvbiwgMSkpIHsNCisgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIHJvdyA9IDA7IHJvdyA8IGltZ19oZWk7IHJvdysrKSB7DQorICAgICAgICAgICAgICAgIEZYX0xQQllURSByb3dfYnVmID0gKEZYX0xQQllURSlwRElCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICAgICAgICAgIF9UaWZmQkdSQTJSR0JBKHJvd19idWYsIGltZ193aWQsIDQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9VSU5UMTYgc3BwLCBicHM7DQorICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCwgJnNwcCk7DQorICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZicHMpOw0KKyAgICBGWF9EV09SRCBicHAgPSBicHMgKiBzcHA7DQorICAgIGlmIChicHAgPT0gMSkgew0KKyAgICAgICAgcmV0dXJuIERlY29kZTFicHBSR0IocERJQml0bWFwLCBoZWlnaHQsIHdpZHRoLCBicHMsIHNwcCk7DQorICAgIH0gZWxzZSBpZiAoYnBwIDw9IDgpIHsNCisgICAgICAgIHJldHVybiBEZWNvZGU4YnBwUkdCKHBESUJpdG1hcCwgaGVpZ2h0LCB3aWR0aCwgYnBzLCBzcHApOw0KKyAgICB9IGVsc2UgaWYgKGJwcCA8PSAyNCkgew0KKyAgICAgICAgcmV0dXJuIERlY29kZTI0YnBwUkdCKHBESUJpdG1hcCwgaGVpZ2h0LCB3aWR0aCwgYnBzLCBzcHApOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfTFBWT0lEIENDb2RlY19UaWZmTW9kdWxlOjpDcmVhdGVEZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpDQorew0KKyAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBEZWNvZGVyID0gRlhfTkVXIENDb2RlY19UaWZmQ29udGV4dDsNCisgICAgaWYgKHBEZWNvZGVyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmICghcERlY29kZXItPkluaXREZWNvZGVyKGZpbGVfcHRyKSkgew0KKyAgICAgICAgZGVsZXRlIHBEZWNvZGVyOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBEZWNvZGVyOw0KK30NCit2b2lkIENDb2RlY19UaWZmTW9kdWxlOjpHZXRGcmFtZXMoRlhfTFBWT0lEIGN0eCwgRlhfSU5UMzImIGZyYW1lcykNCit7DQorICAgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQorICAgIHBEZWNvZGVyLT5HZXRGcmFtZXMoZnJhbWVzKTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZk1vZHVsZTo6TG9hZEZyYW1lSW5mbyhGWF9MUFZPSUQgY3R4LCBGWF9JTlQzMiBmcmFtZSwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgY29tcHMsIEZYX0RXT1JEJiBicGMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQorew0KKyAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBEZWNvZGVyID0gKENDb2RlY19UaWZmQ29udGV4dCopY3R4Ow0KKyAgICByZXR1cm4gcERlY29kZXItPkxvYWRGcmFtZUluZm8oZnJhbWUsIHdpZHRoLCBoZWlnaHQsIGNvbXBzLCBicGMsIHBBdHRyaWJ1dGUpOw0KK30NCitGWF9CT09MIENDb2RlY19UaWZmTW9kdWxlOjpEZWNvZGUodm9pZCogY3R4LCBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkNCit7DQorICAgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQorICAgIHJldHVybiBwRGVjb2Rlci0+RGVjb2RlKHBESUJpdG1hcCk7DQorfQ0KK3ZvaWQgQ0NvZGVjX1RpZmZNb2R1bGU6OkRlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkNCit7DQorICAgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQorICAgIGRlbGV0ZSBwRGVjb2RlcjsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2luY2x1ZGUvZnhfcG5nLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvaW5jbHVkZS9meF9wbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY1M2QwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2luY2x1ZGUvZnhfcG5nLmgKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvcG5nLmgiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmcuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyOWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nLmMKQEAgLTAsMCArMSw0Mjk5IEBACisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9GWENPUkVfRkVBVFVSRV9BTExfKSB8fCBkZWZpbmVkKF9QTkdfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykNCisvKiBwbmcuYyAtIGxvY2F0aW9uIGZvciBnZW5lcmFsIHB1cnBvc2UgbGlicG5nIGZ1bmN0aW9ucw0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMiBbQXByaWwgMjUsIDIwMTNdDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKi8NCisNCisjaW5jbHVkZSAicG5ncHJpdi5oIg0KKw0KKy8qIEdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlcmUgaXMgYW4gb2xkIHBuZy5oIGluIHRoZSBzZWFyY2ggcGF0aC4gKi8NCit0eXBlZGVmIHBuZ19saWJwbmdfdmVyc2lvbl8xXzZfMyBZb3VyX3BuZ19oX2lzX25vdF92ZXJzaW9uXzFfNl8zOw0KKw0KKy8qIFRlbGxzIGxpYnBuZyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBmaXJzdCAibnVtX2J5dGVzIiBieXRlcw0KKyAqIG9mIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICBJZiB0aGUgUE5HIGRhdGEgaXMgZW1iZWRkZWQgaW50byBhbm90aGVyDQorICogc3RyZWFtIHdlIGNhbiBzZXQgbnVtX2J5dGVzID0gOCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBhdHRlbXB0IHRvIHJlYWQNCisgKiBvciB3cml0ZSBhbnkgb2YgdGhlIG1hZ2ljIGJ5dGVzIGJlZm9yZSBpdCBzdGFydHMgb24gdGhlIElIRFIuDQorICovDQorDQorI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9zaWdfYnl0ZXMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBudW1fYnl0ZXMpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zaWdfYnl0ZXMiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAobnVtX2J5dGVzID4gOCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IGJ5dGVzIGZvciBQTkcgc2lnbmF0dXJlIik7DQorDQorICAgcG5nX3B0ci0+c2lnX2J5dGVzID0gKHBuZ19ieXRlKShudW1fYnl0ZXMgPCAwID8gMCA6IG51bV9ieXRlcyk7DQorfQ0KKw0KKy8qIENoZWNrcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBieXRlcyBtYXRjaCB0aGUgUE5HIHNpZ25hdHVyZS4gIFdlIGFsbG93DQorICogY2hlY2tpbmcgbGVzcyB0aGFuIHRoZSBmdWxsIDgtYnl0ZSBzaWduYXR1cmUgc28gdGhhdCB0aG9zZSBhcHBzIHRoYXQNCisgKiBhbHJlYWR5IHJlYWQgdGhlIGZpcnN0IGZldyBieXRlcyBvZiBhIGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIHR5cGUNCisgKiBjYW4gc2ltcGx5IGNoZWNrIHRoZSByZW1haW5pbmcgYnl0ZXMgZm9yIGV4dHJhIGFzc3VyYW5jZS4gIFJldHVybnMNCisgKiBhbiBpbnRlZ2VyIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHNpZyBpcyBmb3VuZCwNCisgKiByZXNwZWN0aXZlbHksIHRvIGJlIGxlc3MgdGhhbiwgdG8gbWF0Y2gsIG9yIGJlIGdyZWF0ZXIgdGhhbiB0aGUgY29ycmVjdA0KKyAqIFBORyBzaWduYXR1cmUgKHRoaXMgaXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgc3RyY21wLCBtZW1jbXAsIGV0YykuDQorICovDQoraW50IFBOR0FQSQ0KK3BuZ19zaWdfY21wKHBuZ19jb25zdF9ieXRlcCBzaWcsIHBuZ19zaXplX3Qgc3RhcnQsIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKQ0KK3sNCisgICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9Ow0KKw0KKyAgIGlmIChudW1fdG9fY2hlY2sgPiA4KQ0KKyAgICAgIG51bV90b19jaGVjayA9IDg7DQorDQorICAgZWxzZSBpZiAobnVtX3RvX2NoZWNrIDwgMSkNCisgICAgICByZXR1cm4gKC0xKTsNCisNCisgICBpZiAoc3RhcnQgPiA3KQ0KKyAgICAgIHJldHVybiAoLTEpOw0KKw0KKyAgIGlmIChzdGFydCArIG51bV90b19jaGVjayA+IDgpDQorICAgICAgbnVtX3RvX2NoZWNrID0gOCAtIHN0YXJ0Ow0KKw0KKyAgIHJldHVybiAoKGludCkobWVtY21wKCZzaWdbc3RhcnRdLCAmcG5nX3NpZ25hdHVyZVtzdGFydF0sIG51bV90b19jaGVjaykpKTsNCit9DQorDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLw0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQ0KKy8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYiAqLw0KK1BOR19GVU5DVElPTih2b2lkcGYgLyogUFJJVkFURSAqLywNCitwbmdfemFsbG9jLCh2b2lkcGYgcG5nX3B0ciwgdUludCBpdGVtcywgdUludCBzaXplKSxQTkdfQUxMT0NBVEVEKQ0KK3sNCisgICBwbmdfYWxsb2Nfc2l6ZV90IG51bV9ieXRlcyA9IHNpemU7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm4gTlVMTDsNCisNCisgICBpZiAoaXRlbXMgPj0gKH4ocG5nX2FsbG9jX3NpemVfdCkwKS9zaXplKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyAocG5nX3ZvaWRjYXN0KHBuZ19zdHJ1Y3RycCwgcG5nX3B0ciksDQorICAgICAgICAgIlBvdGVudGlhbCBvdmVyZmxvdyBpbiBwbmdfemFsbG9jKCkiKTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICB9DQorDQorICAgbnVtX2J5dGVzICo9IGl0ZW1zOw0KKyAgIHJldHVybiBwbmdfbWFsbG9jX3dhcm4ocG5nX3ZvaWRjYXN0KHBuZ19zdHJ1Y3RycCwgcG5nX3B0ciksIG51bV9ieXRlcyk7DQorfQ0KKw0KKy8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3pmcmVlKHZvaWRwZiBwbmdfcHRyLCB2b2lkcGYgcHRyKQ0KK3sNCisgICBwbmdfZnJlZShwbmdfdm9pZGNhc3QocG5nX2NvbnN0X3N0cnVjdHJwLHBuZ19wdHIpLCBwdHIpOw0KK30NCisNCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlIHRvIDMyIGJpdHMgb2YgMSdzLiAgQ2FyZSBtdXN0IGJlIHRha2VuDQorICogaW4gY2FzZSBDUkMgaXMgPiAzMiBiaXRzIHRvIGxlYXZlIHRoZSB0b3AgYml0cyAwLg0KKyAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19yZXNldF9jcmMocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIFRoZSBjYXN0IGlzIHNhZmUgYmVjYXVzZSB0aGUgY3JjIGlzIGEgMzIgYml0IHZhbHVlLiAqLw0KKyAgIHBuZ19wdHItPmNyYyA9IChwbmdfdWludF8zMiljcmMzMigwLCBaX05VTEwsIDApOw0KK30NCisNCisvKiBDYWxjdWxhdGUgdGhlIENSQyBvdmVyIGEgc2VjdGlvbiBvZiBkYXRhLiAgV2UgY2FuIG9ubHkgcGFzcyBhcw0KKyAqIG11Y2ggZGF0YSB0byB0aGlzIHJvdXRpbmUgYXMgdGhlIGxhcmdlc3Qgc2luZ2xlIGJ1ZmZlciBzaXplLiAgV2UNCisgKiBhbHNvIGNoZWNrIHRoYXQgdGhpcyBkYXRhIHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBiZWZvcmUgZ29pbmcgdG8gdGhlDQorICogdHJvdWJsZSBvZiBjYWxjdWxhdGluZyBpdC4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY2FsY3VsYXRlX2NyYyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIHB0ciwgcG5nX3NpemVfdCBsZW5ndGgpDQorew0KKyAgIGludCBuZWVkX2NyYyA9IDE7DQorDQorICAgaWYgKFBOR19DSFVOS19BTkNJTExBUlkocG5nX3B0ci0+Y2h1bmtfbmFtZSkpDQorICAgew0KKyAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0spID09DQorICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkNCisgICAgICAgICBuZWVkX2NyYyA9IDA7DQorICAgfQ0KKw0KKyAgIGVsc2UgLyogY3JpdGljYWwgKi8NCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRSkNCisgICAgICAgICBuZWVkX2NyYyA9IDA7DQorICAgfQ0KKw0KKyAgIC8qICd1TG9uZycgaXMgZGVmaW5lZCBpbiB6bGliLmggYXMgdW5zaWduZWQgbG9uZzsgdGhpcyBtZWFucyB0aGF0IG9uIHNvbWUNCisgICAgKiBzeXN0ZW1zIGl0IGlzIGEgNjQgYml0IHZhbHVlLiAgY3JjMzIsIGhvd2V2ZXIsIHJldHVybnMgMzIgYml0cyBzbyB0aGUNCisgICAgKiBmb2xsb3dpbmcgY2FzdCBpcyBzYWZlLiAgJ3VJbnQnIG1heSBiZSBubyBtb3JlIHRoYW4gMTYgYml0cywgc28gaXQgaXMNCisgICAgKiBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhIGxvb3AgaGVyZS4NCisgICAgKi8NCisgICBpZiAobmVlZF9jcmMgJiYgbGVuZ3RoID4gMCkNCisgICB7DQorICAgICAgdUxvbmcgY3JjID0gcG5nX3B0ci0+Y3JjOyAvKiBTaG91bGQgbmV2ZXIgaXNzdWUgYSB3YXJuaW5nICovDQorDQorICAgICAgZG8NCisgICAgICB7DQorICAgICAgICAgdUludCBzYWZlX2xlbmd0aCA9ICh1SW50KWxlbmd0aDsNCisgICAgICAgICBpZiAoc2FmZV9sZW5ndGggPT0gMCkNCisgICAgICAgICAgICBzYWZlX2xlbmd0aCA9ICh1SW50KS0xOyAvKiBldmlsLCBidXQgc2FmZSAqLw0KKw0KKyAgICAgICAgIGNyYyA9IGNyYzMyKGNyYywgcHRyLCBzYWZlX2xlbmd0aCk7DQorDQorICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBzaG91bGQgbmV2ZXIgaXNzdWUgY29tcGlsZXIgd2FybmluZ3M7IGlmIHRoZXkgZG8gdGhlDQorICAgICAgICAgICogdGFyZ2V0IHN5c3RlbSBoYXMgY2hhcmFjdGVyaXN0aWNzIHRoYXQgd2lsbCBwcm9iYWJseSB2aW9sYXRlIG90aGVyDQorICAgICAgICAgICogYXNzdW1wdGlvbnMgd2l0aGluIHRoZSBsaWJwbmcgY29kZS4NCisgICAgICAgICAgKi8NCisgICAgICAgICBwdHIgKz0gc2FmZV9sZW5ndGg7DQorICAgICAgICAgbGVuZ3RoIC09IHNhZmVfbGVuZ3RoOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAobGVuZ3RoID4gMCk7DQorDQorICAgICAgLyogQW5kIHRoZSBmb2xsb3dpbmcgaXMgYWx3YXlzIHNhZmUgYmVjYXVzZSB0aGUgY3JjIGlzIG9ubHkgMzIgYml0cy4gKi8NCisgICAgICBwbmdfcHRyLT5jcmMgPSAocG5nX3VpbnRfMzIpY3JjOw0KKyAgIH0NCit9DQorDQorLyogQ2hlY2sgYSB1c2VyIHN1cHBsaWVkIHZlcnNpb24gbnVtYmVyLCBjYWxsZWQgZnJvbSBib3RoIHJlYWQgYW5kIHdyaXRlDQorICogZnVuY3Rpb25zIHRoYXQgY3JlYXRlIGEgcG5nX3N0cnVjdC4NCisgKi8NCitpbnQNCitwbmdfdXNlcl92ZXJzaW9uX2NoZWNrKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyKQ0KK3sNCisgICBpZiAodXNlcl9wbmdfdmVyKQ0KKyAgIHsNCisgICAgICBpbnQgaSA9IDA7DQorDQorICAgICAgZG8NCisgICAgICB7DQorICAgICAgICAgaWYgKHVzZXJfcG5nX3ZlcltpXSAhPSBwbmdfbGlicG5nX3ZlcltpXSkNCisgICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIOw0KKyAgICAgIH0gd2hpbGUgKHBuZ19saWJwbmdfdmVyW2krK10pOw0KKyAgIH0NCisNCisgICBlbHNlDQorICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSDsNCisNCisgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIKQ0KKyAgIHsNCisgICAgIC8qIExpYnBuZyAwLjkwIGFuZCBsYXRlciBhcmUgYmluYXJ5IGluY29tcGF0aWJsZSB3aXRoIGxpYnBuZyAwLjg5LCBzbw0KKyAgICAgICogd2UgbXVzdCByZWNvbXBpbGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBhbnkgb2xkZXIgbGlicmFyeSB2ZXJzaW9uLg0KKyAgICAgICogRm9yIHZlcnNpb25zIGFmdGVyIGxpYnBuZyAxLjAsIHdlIHdpbGwgYmUgY29tcGF0aWJsZSwgc28gd2UgbmVlZA0KKyAgICAgICogb25seSBjaGVjayB0aGUgZmlyc3QgYW5kIHRoaXJkIGRpZ2l0cyAobm90ZSB0aGF0IHdoZW4gd2UgcmVhY2ggdmVyc2lvbg0KKyAgICAgICogMS4xMCB3ZSB3aWxsIG5lZWQgdG8gY2hlY2sgdGhlIGZvdXJ0aCBzeW1ib2wsIG5hbWVseSB1c2VyX3BuZ192ZXJbM10pLg0KKyAgICAgICovDQorICAgICAgaWYgKHVzZXJfcG5nX3ZlciA9PSBOVUxMIHx8IHVzZXJfcG5nX3ZlclswXSAhPSBwbmdfbGlicG5nX3ZlclswXSB8fA0KKyAgICAgICAgICAodXNlcl9wbmdfdmVyWzBdID09ICcxJyAmJiAodXNlcl9wbmdfdmVyWzJdICE9IHBuZ19saWJwbmdfdmVyWzJdIHx8DQorICAgICAgICAgIHVzZXJfcG5nX3ZlclszXSAhPSBwbmdfbGlicG5nX3ZlclszXSkpIHx8DQorICAgICAgICAgICh1c2VyX3BuZ192ZXJbMF0gPT0gJzAnICYmIHVzZXJfcG5nX3ZlclsyXSA8ICc5JykpDQorICAgICAgew0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorICAgICAgICAgc2l6ZV90IHBvcyA9IDA7DQorICAgICAgICAgY2hhciBtWzEyOF07DQorDQorICAgICAgICAgcG9zID0gcG5nX3NhZmVjYXQobSwgKHNpemVvZiBtKSwgcG9zLA0KKyAgICAgICAgICAgICAiQXBwbGljYXRpb24gYnVpbHQgd2l0aCBsaWJwbmctIik7DQorICAgICAgICAgcG9zID0gcG5nX3NhZmVjYXQobSwgKHNpemVvZiBtKSwgcG9zLCB1c2VyX3BuZ192ZXIpOw0KKyAgICAgICAgIHBvcyA9IHBuZ19zYWZlY2F0KG0sIChzaXplb2YgbSksIHBvcywgIiBidXQgcnVubmluZyB3aXRoICIpOw0KKyAgICAgICAgIHBvcyA9IHBuZ19zYWZlY2F0KG0sIChzaXplb2YgbSksIHBvcywgcG5nX2xpYnBuZ192ZXIpOw0KKw0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG0pOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQNCisgICAgICAgICBwbmdfcHRyLT5mbGFncyA9IDA7DQorI2VuZGlmDQorDQorICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICAvKiBTdWNjZXNzIHJldHVybi4gKi8NCisgICByZXR1cm4gMTsNCit9DQorDQorLyogR2VuZXJpYyBmdW5jdGlvbiB0byBjcmVhdGUgYSBwbmdfc3RydWN0IGZvciBlaXRoZXIgcmVhZCBvciB3cml0ZSAtIHRoaXMNCisgKiBjb250YWlucyB0aGUgY29tbW9uIGluaXRpYWxpemF0aW9uLg0KKyAqLw0KK1BOR19GVU5DVElPTihwbmdfc3RydWN0cCAvKiBQUklWQVRFICovLA0KK3BuZ19jcmVhdGVfcG5nX3N0cnVjdCwocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwNCisgICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuLCBwbmdfdm9pZHAgbWVtX3B0ciwNCisgICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbiksUE5HX0FMTE9DQVRFRCkNCit7DQorICAgcG5nX3N0cnVjdCBjcmVhdGVfc3RydWN0Ow0KKyMgIGlmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorICAgICAgam1wX2J1ZiBjcmVhdGVfam1wX2J1ZjsNCisjICBlbmRpZg0KKw0KKyAgIC8qIFRoaXMgdGVtcG9yYXJ5IHN0YWNrLWFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwcm92aWRlIGEgcGxhY2UgdG8NCisgICAgKiBidWlsZCBlbm91Z2ggY29udGV4dCB0byBhbGxvdyB0aGUgdXNlciBwcm92aWRlZCBtZW1vcnkgYWxsb2NhdG9yIChpZiBhbnkpDQorICAgICogdG8gYmUgY2FsbGVkLg0KKyAgICAqLw0KKyAgIG1lbXNldCgmY3JlYXRlX3N0cnVjdCwgMCwgKHNpemVvZiBjcmVhdGVfc3RydWN0KSk7DQorDQorICAgLyogQWRkZWQgYXQgbGlicG5nLTEuMi42ICovDQorIyAgaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKyAgICAgIGNyZWF0ZV9zdHJ1Y3QudXNlcl93aWR0aF9tYXggPSBQTkdfVVNFUl9XSURUSF9NQVg7DQorICAgICAgY3JlYXRlX3N0cnVjdC51c2VyX2hlaWdodF9tYXggPSBQTkdfVVNFUl9IRUlHSFRfTUFYOw0KKw0KKyMgICAgIGlmZGVmIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWA0KKyAgICAgICAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDMgYW5kIDEuNC4wICovDQorICAgICAgICAgY3JlYXRlX3N0cnVjdC51c2VyX2NodW5rX2NhY2hlX21heCA9IFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWDsNCisjICAgICBlbmRpZg0KKw0KKyMgICAgIGlmZGVmIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVgNCisgICAgICAgICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQzIGFuZCAxLjQuMSwgcmVxdWlyZWQgb25seSBmb3IgcmVhZCBidXQgZXhpc3RzDQorICAgICAgICAgICogaW4gcG5nX3N0cnVjdCByZWdhcmRsZXNzLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGNyZWF0ZV9zdHJ1Y3QudXNlcl9jaHVua19tYWxsb2NfbWF4ID0gUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWDsNCisjICAgICBlbmRpZg0KKyMgIGVuZGlmDQorDQorICAgLyogVGhlIGZvbGxvd2luZyB0d28gQVBJIGNhbGxzIHNpbXBseSBzZXQgZmllbGRzIGluIHBuZ19zdHJ1Y3QsIHNvIGl0IGlzIHNhZmUNCisgICAgKiB0byBkbyB0aGVtIG5vdyBldmVuIHRob3VnaCBlcnJvciBoYW5kbGluZyBpcyBub3QgeWV0IHNldCB1cC4NCisgICAgKi8NCisjICBpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEDQorICAgICAgcG5nX3NldF9tZW1fZm4oJmNyZWF0ZV9zdHJ1Y3QsIG1lbV9wdHIsIG1hbGxvY19mbiwgZnJlZV9mbik7DQorIyAgZW5kaWYNCisNCisgICAvKiAoKmVycm9yX2ZuKSBjYW4gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGNhbGxlciBhZnRlciB0aGUgZXJyb3JfcHRyIGlzIHNldCwNCisgICAgKiB0aGlzIHdpbGwgcmVzdWx0IGluIGEgbWVtb3J5IGxlYWsgdW5sZXNzIHRoZSBlcnJvcl9mbiBkb2VzIHNvbWV0aGluZw0KKyAgICAqIGV4dHJlbWVseSBzb3BoaXN0aWNhdGVkLiAgVGhlIGRlc2lnbiBsYWNrcyBtZXJpdCBidXQgaXMgaW1wbGljaXQgaW4gdGhlDQorICAgICogQVBJLg0KKyAgICAqLw0KKyAgIHBuZ19zZXRfZXJyb3JfZm4oJmNyZWF0ZV9zdHJ1Y3QsIGVycm9yX3B0ciwgZXJyb3JfZm4sIHdhcm5fZm4pOw0KKw0KKyMgIGlmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorICAgICAgaWYgKCFzZXRqbXAoY3JlYXRlX2ptcF9idWYpKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBUZW1wb3JhcmlseSBmYWtlIG91dCB0aGUgbG9uZ2ptcCBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBoYXZlDQorICAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGlzIGZ1bmN0aW9uLiAgVGhpcyBvbmx5IHdvcmtzIGlmIHdlIGhhdmUNCisgICAgICAgICAgKiBzZXRqbXAoKSBzdXBwb3J0IGNvbXBpbGVkIGluLCBidXQgaXQgaXMgc2FmZSAtIHRoaXMgc3R1ZmYgc2hvdWxkDQorICAgICAgICAgICogbmV2ZXIgaGFwcGVuLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGNyZWF0ZV9zdHJ1Y3Quam1wX2J1Zl9wdHIgPSAmY3JlYXRlX2ptcF9idWY7DQorICAgICAgICAgY3JlYXRlX3N0cnVjdC5qbXBfYnVmX3NpemUgPSAwOyAvKnN0YWNrIGFsbG9jYXRpb24qLw0KKyAgICAgICAgIGNyZWF0ZV9zdHJ1Y3QubG9uZ2ptcF9mbiA9IGxvbmdqbXA7DQorIyAgZWxzZQ0KKyAgICAgIHsNCisjICBlbmRpZg0KKyAgICAgICAgIC8qIENhbGwgdGhlIGdlbmVyYWwgdmVyc2lvbiBjaGVja2VyIChzaGFyZWQgd2l0aCByZWFkIGFuZCB3cml0ZSBjb2RlKToNCisgICAgICAgICAgKi8NCisgICAgICAgICBpZiAocG5nX3VzZXJfdmVyc2lvbl9jaGVjaygmY3JlYXRlX3N0cnVjdCwgdXNlcl9wbmdfdmVyKSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBwbmdfdm9pZGNhc3QocG5nX3N0cnVjdHJwLA0KKyAgICAgICAgICAgICAgIHBuZ19tYWxsb2Nfd2FybigmY3JlYXRlX3N0cnVjdCwgKHNpemVvZiAqcG5nX3B0cikpKTsNCisNCisgICAgICAgICAgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAvKiBwbmdfcHRyLT56c3RyZWFtIGhvbGRzIGEgYmFjay1wb2ludGVyIHRvIHRoZSBwbmdfc3RydWN0LCBzbw0KKyAgICAgICAgICAgICAgICAqIHRoaXMgY2FuIG9ubHkgYmUgZG9uZSBub3c6DQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgY3JlYXRlX3N0cnVjdC56c3RyZWFtLnphbGxvYyA9IHBuZ196YWxsb2M7DQorICAgICAgICAgICAgICAgY3JlYXRlX3N0cnVjdC56c3RyZWFtLnpmcmVlID0gcG5nX3pmcmVlOw0KKyAgICAgICAgICAgICAgIGNyZWF0ZV9zdHJ1Y3QuenN0cmVhbS5vcGFxdWUgPSBwbmdfcHRyOw0KKw0KKyMgICAgICAgICAgICAgIGlmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorICAgICAgICAgICAgICAgICAgLyogRWxpbWluYXRlIHRoZSBsb2NhbCBlcnJvciBoYW5kbGluZzogKi8NCisgICAgICAgICAgICAgICAgICBjcmVhdGVfc3RydWN0LmptcF9idWZfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICBjcmVhdGVfc3RydWN0LmptcF9idWZfc2l6ZSA9IDA7DQorICAgICAgICAgICAgICAgICAgY3JlYXRlX3N0cnVjdC5sb25nam1wX2ZuID0gMDsNCisjICAgICAgICAgICAgICBlbmRpZg0KKw0KKyAgICAgICAgICAgICAgICpwbmdfcHRyID0gY3JlYXRlX3N0cnVjdDsNCisNCisgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBzdWNjZXNzZnVsIHJldHVybiBwb2ludCAqLw0KKyAgICAgICAgICAgICAgIHJldHVybiBwbmdfcHRyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgIC8qIEEgbG9uZ2ptcCBiZWNhdXNlIG9mIGEgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBzdG9yYWdlIGFsbG9jYXRvciBvciBhDQorICAgICogc2ltcGxlIGZhaWx1cmUgdG8gYWxsb2NhdGUgdGhlIHBuZ19zdHJ1Y3QuDQorICAgICovDQorICAgcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGFuIGluZm9fc3RydWN0IGZvciB0aGUgYXBwbGljYXRpb24uICovDQorUE5HX0ZVTkNUSU9OKHBuZ19pbmZvcCxQTkdBUEkNCitwbmdfY3JlYXRlX2luZm9fc3RydWN0LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciksUE5HX0FMTE9DQVRFRCkNCit7DQorICAgcG5nX2luZm9ycCBpbmZvX3B0cjsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKw0KKyAgIC8qIFVzZSB0aGUgaW50ZXJuYWwgQVBJIHRoYXQgZG9lcyBub3QgKG9yIGF0IGxlYXN0IHNob3VsZCBub3QpIGVycm9yIG91dCwgc28NCisgICAgKiB0aGF0IHRoaXMgY2FsbCBhbHdheXMgcmV0dXJucyBvay4gIFRoZSBhcHBsaWNhdGlvbiB0eXBpY2FsbHkgc2V0cyB1cCB0aGUNCisgICAgKiBlcnJvciBoYW5kbGluZyAqYWZ0ZXIqIGNyZWF0aW5nIHRoZSBpbmZvX3N0cnVjdCBiZWNhdXNlIHRoaXMgaXMgdGhlIHdheSBpdA0KKyAgICAqIGhhcyBhbHdheXMgYmVlbiBkb25lIGluICdleGFtcGxlLmMnLg0KKyAgICAqLw0KKyAgIGluZm9fcHRyID0gcG5nX3ZvaWRjYXN0KHBuZ19pbmZvcnAsIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLA0KKyAgICAgIChzaXplb2YgKmluZm9fcHRyKSkpOw0KKw0KKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIG1lbXNldChpbmZvX3B0ciwgMCwgKHNpemVvZiAqaW5mb19wdHIpKTsNCisNCisgICByZXR1cm4gaW5mb19wdHI7DQorfQ0KKw0KKy8qIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgaW5mbyBzdHJ1Y3QuDQorICogTm9ybWFsbHksIG9uZSB3b3VsZCB1c2UgZWl0aGVyIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgb3INCisgKiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSB0byBmcmVlIGFuIGluZm8gc3RydWN0LCBidXQgdGhpcyBtYXkgYmUNCisgKiB1c2VmdWwgZm9yIHNvbWUgYXBwbGljYXRpb25zLiAgRnJvbSBsaWJwbmcgMS42LjAgdGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQNCisgKiBpbnRlcm5hbGx5IHRvIGltcGxlbWVudCB0aGUgcG5nX2luZm8gcmVsZWFzZSBwYXJ0IG9mIHRoZSAnc3RydWN0JyBkZXN0cm95DQorICogQVBJcy4gIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBwb3NzaWJsZSBhcHByb2FjaGVzIGZyZWUgdGhlIHNhbWUgZGF0YSAoYWxsIG9mDQorICogaXQpLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyKQ0KK3sNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyID0gTlVMTDsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X2luZm9fc3RydWN0Iik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKGluZm9fcHRyX3B0ciAhPSBOVUxMKQ0KKyAgICAgIGluZm9fcHRyID0gKmluZm9fcHRyX3B0cjsNCisNCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgLyogRG8gdGhpcyBmaXJzdCBpbiBjYXNlIG9mIGFuIGVycm9yIGJlbG93OyBpZiB0aGUgYXBwIGltcGxlbWVudHMgaXRzIG93bg0KKyAgICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IHRoaXMgY2FuIGxlYWQgdG8gcG5nX2ZyZWUgY2FsbGluZyBwbmdfZXJyb3IsIHdoaWNoDQorICAgICAgICogd2lsbCBhYm9ydCB0aGlzIHJvdXRpbmUgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBhcHAgZXJyb3IgaGFuZGxlci4NCisgICAgICAgKiBBbiBpbmZpbml0ZSBsb29wIG1heSByZXN1bHQgaWYgaXQgdGhlbiB0cmllcyB0byBmcmVlIHRoZSBzYW1lIGluZm8NCisgICAgICAgKiBwdHIuDQorICAgICAgICovDQorICAgICAgKmluZm9fcHRyX3B0ciA9IE5VTEw7DQorDQorICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfQUxMLCAtMSk7DQorICAgICAgbWVtc2V0KGluZm9fcHRyLCAwLCAoc2l6ZW9mICppbmZvX3B0cikpOw0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyKTsNCisgICB9DQorfQ0KKw0KKy8qIEluaXRpYWxpemUgdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcyBub3cgYW4gaW50ZXJuYWwgZnVuY3Rpb24gKDAuODkpDQorICogYW5kIGFwcGxpY2F0aW9ucyB1c2luZyBpdCBhcmUgdXJnZWQgdG8gdXNlIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKQ0KKyAqIGluc3RlYWQuICBVc2UgZGVwcmVjYXRlZCBpbiAxLjYuMCwgaW50ZXJuYWwgdXNlIHJlbW92ZWQgKHVzZWQgaW50ZXJuYWxseSBpdA0KKyAqIGlzIGp1c3QgYSBtZW1zZXQpLg0KKyAqDQorICogTk9URTogaXQgaXMgYWxtb3N0IGluY29uY2VpdmFibGUgdGhhdCB0aGlzIEFQSSBpcyB1c2VkIGJlY2F1c2UgaXQgYnlwYXNzZXMNCisgKiB0aGUgdXNlci1tZW1vcnkgbWVjaGFuaXNtIGFuZCB0aGUgdXNlciBlcnJvciBoYW5kbGluZy93YXJuaW5nIG1lY2hhbmlzbXMgaW4NCisgKiB0aG9zZSBjYXNlcyB3aGVyZSBpdCBkb2VzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBtZW1zZXQuDQorICovDQorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJDQorcG5nX2luZm9faW5pdF8zLChwbmdfaW5mb3BwIHB0cl9wdHIsIHBuZ19zaXplX3QgcG5nX2luZm9fc3RydWN0X3NpemUpLA0KKyAgIFBOR19ERVBSRUNBVEVEKQ0KK3sNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyID0gKnB0cl9wdHI7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5mb19pbml0XzMiKTsNCisNCisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKChzaXplb2YgKHBuZ19pbmZvKSkgPiBwbmdfaW5mb19zdHJ1Y3Rfc2l6ZSkNCisgICB7DQorICAgICAgKnB0cl9wdHIgPSBOVUxMOw0KKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyB3aHkgdGhpcyBBUEkgc2hvdWxkIG5vdCBiZSB1c2VkOiAqLw0KKyAgICAgIGZyZWUoaW5mb19wdHIpOw0KKyAgICAgIGluZm9fcHRyID0gcG5nX3ZvaWRjYXN0KHBuZ19pbmZvcnAsIHBuZ19tYWxsb2NfYmFzZShOVUxMLA0KKyAgICAgICAgIChzaXplb2YgKmluZm9fcHRyKSkpOw0KKyAgICAgICpwdHJfcHRyID0gaW5mb19wdHI7DQorICAgfQ0KKw0KKyAgIC8qIFNldCBldmVyeXRoaW5nIHRvIDAgKi8NCisgICBtZW1zZXQoaW5mb19wdHIsIDAsIChzaXplb2YgKmluZm9fcHRyKSk7DQorfQ0KKw0KKy8qIFRoZSBmb2xsb3dpbmcgQVBJIGlzIG5vdCBjYWxsZWQgaW50ZXJuYWxseSAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX2RhdGFfZnJlZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgaW50IGZyZWVyLCBwbmdfdWludF8zMiBtYXNrKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kYXRhX2ZyZWVyIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAoZnJlZXIgPT0gUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEpDQorICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gbWFzazsNCisNCisgICBlbHNlIGlmIChmcmVlciA9PSBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSkNCisgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSAmPSB+bWFzazsNCisNCisgICBlbHNlDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmtub3duIGZyZWVyIHBhcmFtZXRlciBpbiBwbmdfZGF0YV9mcmVlciIpOw0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19mcmVlX2RhdGEocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIG1hc2ssDQorICAgaW50IG51bSkNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZnJlZV9kYXRhIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVEDQorICAgLyogRnJlZSB0ZXh0IGl0ZW0gbnVtIG9yIChpZiBudW0gPT0gLTEpIGFsbCB0ZXh0IGl0ZW1zICovDQorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfVEVYVCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkNCisgICB7DQorICAgICAgaWYgKG51bSAhPSAtMSkNCisgICAgICB7DQorICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0ICYmIGluZm9fcHRyLT50ZXh0W251bV0ua2V5KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dFtudW1dLmtleSk7DQorICAgICAgICAgICAgaW5mb19wdHItPnRleHRbbnVtXS5rZXkgPSBOVUxMOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgaTsNCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV90ZXh0OyBpKyspDQorICAgICAgICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1RFWFQsIGkpOw0KKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0KTsNCisgICAgICAgICBpbmZvX3B0ci0+dGV4dCA9IE5VTEw7DQorICAgICAgICAgaW5mb19wdHItPm51bV90ZXh0PTA7DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVEDQorICAgLyogRnJlZSBhbnkgdFJOUyBlbnRyeSAqLw0KKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1RSTlMpICYgaW5mb19wdHItPmZyZWVfbWUpDQorICAgew0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50cmFuc19hbHBoYSk7DQorICAgICAgaW5mb19wdHItPnRyYW5zX2FscGhhID0gTlVMTDsNCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3RSTlM7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQNCisgICAvKiBGcmVlIGFueSBzQ0FMIGVudHJ5ICovDQorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfU0NBTCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkNCisgICB7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc193aWR0aCk7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc19oZWlnaHQpOw0KKyAgICAgIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGggPSBOVUxMOw0KKyAgICAgIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID0gTlVMTDsNCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3NDQUw7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQNCisgICAvKiBGcmVlIGFueSBwQ0FMIGVudHJ5ICovDQorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfUENBTCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkNCisgICB7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcHVycG9zZSk7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfdW5pdHMpOw0KKyAgICAgIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UgPSBOVUxMOw0KKyAgICAgIGluZm9fcHRyLT5wY2FsX3VuaXRzID0gTlVMTDsNCisgICAgICBpZiAoaW5mb19wdHItPnBjYWxfcGFyYW1zICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+cGNhbF9ucGFyYW1zOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSk7DQorICAgICAgICAgICAgICAgaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcGFyYW1zKTsNCisgICAgICAgICAgICBpbmZvX3B0ci0+cGNhbF9wYXJhbXMgPSBOVUxMOw0KKyAgICAgICAgIH0NCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3BDQUw7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQNCisgICAvKiBGcmVlIGFueSBwcm9maWxlIGVudHJ5ICovDQorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfSUNDUCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkNCisgICB7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmljY3BfbmFtZSk7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmljY3BfcHJvZmlsZSk7DQorICAgICAgaW5mb19wdHItPmljY3BfbmFtZSA9IE5VTEw7DQorICAgICAgaW5mb19wdHItPmljY3BfcHJvZmlsZSA9IE5VTEw7DQorICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19pQ0NQOw0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVEDQorICAgLyogRnJlZSBhIGdpdmVuIHNQTFQgZW50cnksIG9yIChpZiBudW0gPT0gLTEpIGFsbCBzUExUIGVudHJpZXMgKi8NCisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9TUExUKSAmIGluZm9fcHRyLT5mcmVlX21lKQ0KKyAgIHsNCisgICAgICBpZiAobnVtICE9IC0xKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0ubmFtZSk7DQorICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5lbnRyaWVzKTsNCisgICAgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc1tudW1dLm5hbWUgPSBOVUxMOw0KKyAgICAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0uZW50cmllcyA9IE5VTEw7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIGlmIChpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0pDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBpOw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW07IGkrKykNCisgICAgICAgICAgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9TUExULCAoaW50KWkpOw0KKw0KKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKTsNCisgICAgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyA9IE5VTEw7DQorICAgICAgICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtID0gMDsNCisgICAgICAgICB9DQorICAgICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19zUExUOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9VTktOKSAmIGluZm9fcHRyLT5mcmVlX21lKQ0KKyAgIHsNCisgICAgICBpZiAobnVtICE9IC0xKQ0KKyAgICAgIHsNCisgICAgICAgICAgaWYgKGluZm9fcHRyLT51bmtub3duX2NodW5rcykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NbbnVtXS5kYXRhKTsNCisgICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzW251bV0uZGF0YSA9IE5VTEw7DQorICAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgaTsNCisNCisgICAgICAgICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW07IGkrKykNCisgICAgICAgICAgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9VTktOLCAoaW50KWkpOw0KKw0KKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7DQorICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzID0gTlVMTDsNCisgICAgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtID0gMDsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVEDQorICAgLyogRnJlZSBhbnkgaElTVCBlbnRyeSAqLw0KKyAgIGlmICgobWFzayAmIFBOR19GUkVFX0hJU1QpICAmIGluZm9fcHRyLT5mcmVlX21lKQ0KKyAgIHsNCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+aGlzdCk7DQorICAgICAgaW5mb19wdHItPmhpc3QgPSBOVUxMOw0KKyAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9faElTVDsNCisgICB9DQorI2VuZGlmDQorDQorICAgLyogRnJlZSBhbnkgUExURSBlbnRyeSB0aGF0IHdhcyBpbnRlcm5hbGx5IGFsbG9jYXRlZCAqLw0KKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1BMVEUpICYgaW5mb19wdHItPmZyZWVfbWUpDQorICAgew0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5wYWxldHRlKTsNCisgICAgICBpbmZvX3B0ci0+cGFsZXR0ZSA9IE5VTEw7DQorICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19QTFRFOw0KKyAgICAgIGluZm9fcHRyLT5udW1fcGFsZXR0ZSA9IDA7DQorICAgfQ0KKw0KKyNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQNCisgICAvKiBGcmVlIGFueSBpbWFnZSBiaXRzIGF0dGFjaGVkIHRvIHRoZSBpbmZvIHN0cnVjdHVyZSAqLw0KKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1JPV1MpICYgaW5mb19wdHItPmZyZWVfbWUpDQorICAgew0KKyAgICAgIGlmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfdWludF8zMiByb3c7DQorICAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBpbmZvX3B0ci0+aGVpZ2h0OyByb3crKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnJvd19wb2ludGVyc1tyb3ddKTsNCisgICAgICAgICAgICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzW3Jvd10gPSBOVUxMOw0KKyAgICAgICAgIH0NCisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsNCisgICAgICAgICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19JREFUOw0KKyAgIH0NCisjZW5kaWYNCisNCisgICBpZiAobnVtICE9IC0xKQ0KKyAgICAgIG1hc2sgJj0gflBOR19GUkVFX01VTDsNCisNCisgICBpbmZvX3B0ci0+ZnJlZV9tZSAmPSB+bWFzazsNCit9DQorI2VuZGlmIC8qIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICovDQorDQorLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW9fcHRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcg0KKyAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzDQorICogcG9pbnRlciBiZWZvcmUgcG5nX3dyaXRlX2Rlc3Ryb3koKSBvciBwbmdfcmVhZF9kZXN0cm95KCkgYXJlIGNhbGxlZC4NCisgKi8NCitwbmdfdm9pZHAgUE5HQVBJDQorcG5nX2dldF9pb19wdHIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIChOVUxMKTsNCisNCisgICByZXR1cm4gKHBuZ19wdHItPmlvX3B0cik7DQorfQ0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQ0KKyMgIGlmZGVmIFBOR19TVERJT19TVVBQT1JURUQNCisvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGlucHV0L291dHB1dCBmdW5jdGlvbnMgZm9yIHRoZSBQTkcgZmlsZS4gIElmIHlvdQ0KKyAqIHVzZSB5b3VyIG93biByZWFkIG9yIHdyaXRlIHJvdXRpbmVzLCB5b3UgY2FuIGNhbGwgZWl0aGVyIHBuZ19zZXRfcmVhZF9mbigpDQorICogb3IgcG5nX3NldF93cml0ZV9mbigpIGluc3RlYWQgb2YgcG5nX2luaXRfaW8oKS4gIElmIHlvdSBoYXZlIGRlZmluZWQNCisgKiBQTkdfTk9fU1RESU8gb3Igb3RoZXJ3aXNlIGRpc2FibGVkIFBOR19TVERJT19TVVBQT1JURUQsIHlvdSBtdXN0IHVzZSBhDQorICogZnVuY3Rpb24gb2YgeW91ciBvd24gYmVjYXVzZSAiRklMRSAqIiBpc24ndCBuZWNlc3NhcmlseSBhdmFpbGFibGUuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfaW5pdF9pbyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX0ZJTEVfcCBmcCkNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5pdF9pbyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPmlvX3B0ciA9IChwbmdfdm9pZHApZnA7DQorfQ0KKyMgIGVuZGlmDQorDQorI2lmZGVmIFBOR19TQVZFX0lOVF8zMl9TVVBQT1JURUQNCisvKiBUaGUgcG5nX3NhdmVfaW50XzMyIGZ1bmN0aW9uIGFzc3VtZXMgaW50ZWdlcnMgYXJlIHN0b3JlZCBpbiB0d28ncw0KKyAqIGNvbXBsZW1lbnQgZm9ybWF0LiAgSWYgdGhpcyBpc24ndCB0aGUgY2FzZSwgdGhlbiB0aGlzIHJvdXRpbmUgbmVlZHMgdG8NCisgKiBiZSBtb2RpZmllZCB0byB3cml0ZSBkYXRhIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0LiAgTm90ZSB0aGF0LA0KKyAqIHRoZSBmb2xsb3dpbmcgd29ya3MgY29ycmVjdGx5IGV2ZW4gaWYgcG5nX2ludF8zMiBoYXMgbW9yZSB0aGFuIDMyIGJpdHMNCisgKiAoY29tcGFyZSB0aGUgbW9yZSBjb21wbGV4IGNvZGUgcmVxdWlyZWQgb24gcmVhZCBmb3Igc2lnbiBleHRlbnNpb24uKQ0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NhdmVfaW50XzMyKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkNCit7DQorICAgYnVmWzBdID0gKHBuZ19ieXRlKSgoaSA+PiAyNCkgJiAweGZmKTsNCisgICBidWZbMV0gPSAocG5nX2J5dGUpKChpID4+IDE2KSAmIDB4ZmYpOw0KKyAgIGJ1ZlsyXSA9IChwbmdfYnl0ZSkoKGkgPj4gOCkgJiAweGZmKTsNCisgICBidWZbM10gPSAocG5nX2J5dGUpKGkgJiAweGZmKTsNCit9DQorI2VuZGlmDQorDQorIyAgaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQNCisvKiBDb252ZXJ0IHRoZSBzdXBwbGllZCB0aW1lIGludG8gYW4gUkZDIDExMjMgc3RyaW5nIHN1aXRhYmxlIGZvciB1c2UgaW4NCisgKiBhICJDcmVhdGlvbiBUaW1lIiBvciBvdGhlciB0ZXh0LWJhc2VkIHRpbWUgc3RyaW5nLg0KKyAqLw0KK2ludCBQTkdBUEkNCitwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcihjaGFyIG91dFsyOV0sIHBuZ19jb25zdF90aW1lcCBwdGltZSkNCit7DQorICAgc3RhdGljIFBOR19DT05TVCBjaGFyIHNob3J0X21vbnRoc1sxMl1bNF0gPQ0KKyAgICAgICAgeyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsDQorICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07DQorDQorICAgaWYgKG91dCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiAwOw0KKw0KKyAgIGlmIChwdGltZS0+eWVhciA+IDk5OTkgLyogUkZDMTEyMyBsaW1pdGF0aW9uICovIHx8DQorICAgICAgIHB0aW1lLT5tb250aCA9PSAwICAgIHx8ICBwdGltZS0+bW9udGggPiAxMiAgfHwNCisgICAgICAgcHRpbWUtPmRheSAgID09IDAgICAgfHwgIHB0aW1lLT5kYXkgICA+IDMxICB8fA0KKyAgICAgICBwdGltZS0+aG91ciAgPiAyMyAgICB8fCAgcHRpbWUtPm1pbnV0ZSA+IDU5IHx8DQorICAgICAgIHB0aW1lLT5zZWNvbmQgPiA2MCkNCisgICAgICByZXR1cm4gMDsNCisNCisgICB7DQorICAgICAgc2l6ZV90IHBvcyA9IDA7DQorICAgICAgY2hhciBudW1iZXJfYnVmWzVdOyAvKiBlbm91Z2ggZm9yIGEgZm91ci1kaWdpdCB5ZWFyICovDQorDQorIyAgICAgZGVmaW5lIEFQUEVORF9TVFJJTkcoc3RyaW5nKSBwb3MgPSBwbmdfc2FmZWNhdChvdXQsIDI5LCBwb3MsIChzdHJpbmcpKQ0KKyMgICAgIGRlZmluZSBBUFBFTkRfTlVNQkVSKGZvcm1hdCwgdmFsdWUpXA0KKyAgICAgICAgIEFQUEVORF9TVFJJTkcoUE5HX0ZPUk1BVF9OVU1CRVIobnVtYmVyX2J1ZiwgZm9ybWF0LCAodmFsdWUpKSkNCisjICAgICBkZWZpbmUgQVBQRU5EKGNoKSBpZiAocG9zIDwgMjgpIG91dFtwb3MrK10gPSAoY2gpDQorDQorICAgICAgQVBQRU5EX05VTUJFUihQTkdfTlVNQkVSX0ZPUk1BVF91LCAodW5zaWduZWQpcHRpbWUtPmRheSk7DQorICAgICAgQVBQRU5EKCcgJyk7DQorICAgICAgQVBQRU5EX1NUUklORyhzaG9ydF9tb250aHNbKHB0aW1lLT5tb250aCAtIDEpXSk7DQorICAgICAgQVBQRU5EKCcgJyk7DQorICAgICAgQVBQRU5EX05VTUJFUihQTkdfTlVNQkVSX0ZPUk1BVF91LCBwdGltZS0+eWVhcik7DQorICAgICAgQVBQRU5EKCcgJyk7DQorICAgICAgQVBQRU5EX05VTUJFUihQTkdfTlVNQkVSX0ZPUk1BVF8wMnUsICh1bnNpZ25lZClwdGltZS0+aG91cik7DQorICAgICAgQVBQRU5EKCc6Jyk7DQorICAgICAgQVBQRU5EX05VTUJFUihQTkdfTlVNQkVSX0ZPUk1BVF8wMnUsICh1bnNpZ25lZClwdGltZS0+bWludXRlKTsNCisgICAgICBBUFBFTkQoJzonKTsNCisgICAgICBBUFBFTkRfTlVNQkVSKFBOR19OVU1CRVJfRk9STUFUXzAydSwgKHVuc2lnbmVkKXB0aW1lLT5zZWNvbmQpOw0KKyAgICAgIEFQUEVORF9TVFJJTkcoIiArMDAwMCIpOyAvKiBUaGlzIHJlbGlhYmx5IHRlcm1pbmF0ZXMgdGhlIGJ1ZmZlciAqLw0KKw0KKyMgICAgIHVuZGVmIEFQUEVORA0KKyMgICAgIHVuZGVmIEFQUEVORF9OVU1CRVINCisjICAgICB1bmRlZiBBUFBFTkRfU1RSSU5HDQorICAgfQ0KKw0KKyAgIHJldHVybiAxOw0KK30NCisNCisjICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwDQorLyogVG8gZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGZyb20gbGlicG5nLTEuNyAqLw0KKy8qIE9yaWdpbmFsIEFQSSB0aGF0IHVzZXMgYSBwcml2YXRlIGJ1ZmZlciBpbiBwbmdfc3RydWN0Lg0KKyAqIERlcHJlY2F0ZWQgYmVjYXVzZSBpdCBjYXVzZXMgcG5nX3N0cnVjdCB0byBjYXJyeSBhIHNwdXJpb3VzIHRlbXBvcmFyeQ0KKyAqIGJ1ZmZlciAocG5nX3N0cnVjdDo6dGltZV9idWZmZXIpLCBiZXR0ZXIgdG8gaGF2ZSB0aGUgY2FsbGVyIHBhc3MgdGhpcyBpbi4NCisgKi8NCitwbmdfY29uc3RfY2hhcnAgUE5HQVBJDQorcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X3RpbWVwIHB0aW1lKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAvKiBUaGUgb25seSBmYWlsdXJlIGFib3ZlIGlmIHBuZ19wdHIgIT0gTlVMTCBpcyBmcm9tIGFuIGludmFsaWQgcHRpbWUgKi8NCisgICAgICBpZiAoIXBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKHBuZ19wdHItPnRpbWVfYnVmZmVyLCBwdGltZSkpDQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIklnbm9yaW5nIGludmFsaWQgdGltZSB2YWx1ZSIpOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICByZXR1cm4gcG5nX3B0ci0+dGltZV9idWZmZXI7DQorICAgfQ0KKw0KKyAgIHJldHVybiBOVUxMOw0KK30NCisjICAgICBlbmRpZg0KKyMgIGVuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovDQorDQorI2VuZGlmIC8qIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICovDQorDQorcG5nX2NvbnN0X2NoYXJwIFBOR0FQSQ0KK3BuZ19nZXRfY29weXJpZ2h0KHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8NCisjaWZkZWYgUE5HX1NUUklOR19DT1BZUklHSFQNCisgICByZXR1cm4gUE5HX1NUUklOR19DT1BZUklHSFQNCisjZWxzZQ0KKyMgIGlmZGVmIF9fU1REQ19fDQorICAgcmV0dXJuIFBOR19TVFJJTkdfTkVXTElORSBcDQorICAgICAibGlicG5nIHZlcnNpb24gMS42LjMgLSBKdWx5IDE4LCAyMDEzIiBQTkdfU1RSSU5HX05FV0xJTkUgXA0KKyAgICAgIkNvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbiIgUE5HX1NUUklOR19ORVdMSU5FIFwNCisgICAgICJDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NyBBbmRyZWFzIERpbGdlciIgUE5HX1NUUklOR19ORVdMSU5FIFwNCisgICAgICJDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4iIFwNCisgICAgIFBOR19TVFJJTkdfTkVXTElORTsNCisjICBlbHNlDQorICAgICAgcmV0dXJuICJsaWJwbmcgdmVyc2lvbiAxLjYuMyAtIEp1bHkgMTgsIDIwMTNcDQorICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uXA0KKyAgICAgIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyXA0KKyAgICAgIENvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLiI7DQorIyAgZW5kaWYNCisjZW5kaWYNCit9DQorDQorLyogVGhlIGZvbGxvd2luZyByZXR1cm4gdGhlIGxpYnJhcnkgdmVyc2lvbiBhcyBhIHNob3J0IHN0cmluZyBpbiB0aGUNCisgKiBmb3JtYXQgMS4wLjAgdGhyb3VnaCA5OS45OS45OXp6LiAgVG8gZ2V0IHRoZSB2ZXJzaW9uIG9mICouaCBmaWxlcw0KKyAqIHVzZWQgd2l0aCB5b3VyIGFwcGxpY2F0aW9uLCBwcmludCBvdXQgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCB3aGljaA0KKyAqIGlzIGRlZmluZWQgaW4gcG5nLmguDQorICogTm90ZTogbm93IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBwbmdfZ2V0X2xpYnBuZ192ZXIoKSBhbmQNCisgKiBwbmdfZ2V0X2hlYWRlcl92ZXIoKS4gIER1ZSB0byB0aGUgdmVyc2lvbl9ubl9ubl9ubiB0eXBlZGVmIGd1YXJkLA0KKyAqIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBwbmcuYyB1c2VzIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgcG5nLmguDQorICovDQorcG5nX2NvbnN0X2NoYXJwIFBOR0FQSQ0KK3BuZ19nZXRfbGlicG5nX3ZlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgLyogVmVyc2lvbiBvZiAqLmMgZmlsZXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGxpYnBuZyAqLw0KKyAgIHJldHVybiBwbmdfZ2V0X2hlYWRlcl92ZXIocG5nX3B0cik7DQorfQ0KKw0KK3BuZ19jb25zdF9jaGFycCBQTkdBUEkNCitwbmdfZ2V0X2hlYWRlcl92ZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIFZlcnNpb24gb2YgKi5oIGZpbGVzIHVzZWQgd2hlbiBidWlsZGluZyBsaWJwbmcgKi8NCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8NCisgICByZXR1cm4gUE5HX0xJQlBOR19WRVJfU1RSSU5HOw0KK30NCisNCitwbmdfY29uc3RfY2hhcnAgUE5HQVBJDQorcG5nX2dldF9oZWFkZXJfdmVyc2lvbihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgLyogUmV0dXJucyBsb25nZXIgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCB2ZXJzaW9uIGFuZCBkYXRlICovDQorICAgUE5HX1VOVVNFRChwbmdfcHRyKSAgLyogU2lsZW5jZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCBwbmdfcHRyICovDQorI2lmZGVmIF9fU1REQ19fDQorICAgcmV0dXJuIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcNCisjICBpZm5kZWYgUE5HX1JFQURfU1VQUE9SVEVEDQorICAgIiAgICAgKE5PIFJFQUQgU1VQUE9SVCkiDQorIyAgZW5kaWYNCisgICBQTkdfU1RSSU5HX05FV0xJTkU7DQorI2Vsc2UNCisgICByZXR1cm4gUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORzsNCisjZW5kaWYNCit9DQorDQorI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQoraW50IFBOR0FQSQ0KK3BuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIGNodW5rX25hbWUpDQorew0KKyAgIC8qIENoZWNrIGNodW5rX25hbWUgYW5kIHJldHVybiAia2VlcCIgdmFsdWUgaWYgaXQncyBvbiB0aGUgbGlzdCwgZWxzZSAwICovDQorICAgcG5nX2NvbnN0X2J5dGVwIHAsIHBfZW5kOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgY2h1bmtfbmFtZSA9PSBOVUxMIHx8IHBuZ19wdHItPm51bV9jaHVua19saXN0ID09IDApDQorICAgICAgcmV0dXJuIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDsNCisNCisgICBwX2VuZCA9IHBuZ19wdHItPmNodW5rX2xpc3Q7DQorICAgcCA9IHBfZW5kICsgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3QqNTsgLyogYmV5b25kIGVuZCAqLw0KKw0KKyAgIC8qIFRoZSBjb2RlIGlzIHRoZSBmaWZ0aCBieXRlIGFmdGVyIGVhY2ggZm91ciBieXRlIHN0cmluZy4gIEhpc3RvcmljYWxseSB0aGlzDQorICAgICogY29kZSB3YXMgYWx3YXlzIHNlYXJjaGVkIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhpcyBpcyBubyBsb25nZXINCisgICAgKiBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgJ3NldCcgcm91dGluZSBoYW5kbGVzIGR1cGxpY2F0ZSBlbnRyaWVzIGNvcnJlY3R5Lg0KKyAgICAqLw0KKyAgIGRvIC8qIG51bV9jaHVua19saXN0ID4gMCwgc28gYXQgbGVhc3Qgb25lICovDQorICAgew0KKyAgICAgIHAgLT0gNTsNCisNCisgICAgICBpZiAoIW1lbWNtcChjaHVua19uYW1lLCBwLCA0KSkNCisgICAgICAgICByZXR1cm4gcFs0XTsNCisgICB9DQorICAgd2hpbGUgKHAgPiBwX2VuZCk7DQorDQorICAgLyogVGhpcyBtZWFucyB0aGF0IGtub3duIGNodW5rcyBzaG91bGQgYmUgcHJvY2Vzc2VkIGFuZCB1bmtub3duIGNodW5rcyBzaG91bGQNCisgICAgKiBiZSBoYW5kbGVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgcG5nX3B0ci0+dW5rbm93bl9kZWZhdWx0OyB0aGlzIGNhbiBiZQ0KKyAgICAqIGNvbmZ1c2luZyBiZWNhdXNlLCBhcyBhIHJlc3VsdCwgdGhlcmUgYXJlIHR3byBsZXZlbHMgb2YgZGVmYXVsdGluZyBmb3INCisgICAgKiB1bmtub3duIGNodW5rcy4NCisgICAgKi8NCisgICByZXR1cm4gUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOw0KK30NCisNCisjaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSkNCit7DQorICAgcG5nX2J5dGUgY2h1bmtfc3RyaW5nWzVdOw0KKw0KKyAgIFBOR19DU1RSSU5HX0ZST01fQ0hVTksoY2h1bmtfc3RyaW5nLCBjaHVua19uYW1lKTsNCisgICByZXR1cm4gcG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIGNodW5rX3N0cmluZyk7DQorfQ0KKyNlbmRpZiAvKiBSRUFEX1VOS05PV05fQ0hVTktTICovDQorI2VuZGlmIC8qIFNFVF9VTktOT1dOX0NIVU5LUyAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCisvKiBUaGlzIGZ1bmN0aW9uLCBhZGRlZCB0byBsaWJwbmctMS4wLjZnLCBpcyB1bnRlc3RlZC4gKi8NCitpbnQgUE5HQVBJDQorcG5nX3Jlc2V0X3pzdHJlYW0ocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOw0KKw0KKyAgIC8qIFdBUk5JTkc6IHRoaXMgcmVzZXRzIHRoZSB3aW5kb3cgYml0cyB0byB0aGUgbWF4aW11bSEgKi8NCisgICByZXR1cm4gKGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSkpOw0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovDQorDQorLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nLTEuMC43ICovDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcih2b2lkKQ0KK3sNCisgICAvKiBWZXJzaW9uIG9mICouYyBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovDQorICAgcmV0dXJuKChwbmdfdWludF8zMilQTkdfTElCUE5HX1ZFUik7DQorfQ0KKw0KKw0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQ0KKy8qIEVuc3VyZSB0aGF0IHBuZ19wdHItPnpzdHJlYW0ubXNnIGhvbGRzIHNvbWUgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcuDQorICogSWYgaXQgZG9lc24ndCAncmV0JyBpcyB1c2VkIHRvIHNldCBpdCB0byBzb21ldGhpbmcgYXBwcm9wcmlhdGUsIGV2ZW4gaW4gY2FzZXMNCisgKiBsaWtlIFpfT0sgb3IgWl9TVFJFQU1fRU5EIHdoZXJlIHRoZSBlcnJvciBjb2RlIGlzIGFwcGFyZW50bHkgYSBzdWNjZXNzIGNvZGUuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3pzdHJlYW1fZXJyb3IocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCByZXQpDQorew0KKyAgIC8qIFRyYW5zbGF0ZSAncmV0JyBpbnRvIGFuIGFwcHJvcHJpYXRlIGVycm9yIHN0cmluZywgcHJpb3JpdHkgaXMgZ2l2ZW4gdG8gdGhlDQorICAgICogb25lIGluIHpzdHJlYW0gaWYgc2V0LiAgVGhpcyBhbHdheXMgcmV0dXJucyBhIHN0cmluZywgZXZlbiBpbiBjYXNlcyBsaWtlDQorICAgICogWl9PSyBvciBaX1NUUkVBTV9FTkQgd2hlcmUgdGhlIGVycm9yIGNvZGUgaXMgYSBzdWNjZXNzIGNvZGUuDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnID09IE5VTEwpIHN3aXRjaCAocmV0KQ0KKyAgIHsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgIGNhc2UgWl9PSzoNCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoInVuZXhwZWN0ZWQgemxpYiByZXR1cm4gY29kZSIpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgWl9TVFJFQU1fRU5EOg0KKyAgICAgICAgIC8qIE5vcm1hbCBleGl0ICovDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJ1bmV4cGVjdGVkIGVuZCBvZiBMWiBzdHJlYW0iKTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFpfTkVFRF9ESUNUOg0KKyAgICAgICAgIC8qIFRoaXMgbWVhbnMgdGhlIGRlZmxhdGUgc3RyZWFtIGRpZCBub3QgaGF2ZSBhIGRpY3Rpb25hcnk7IHRoaXMNCisgICAgICAgICAgKiBpbmRpY2F0ZXMgYSBib2d1cyBQTkcuDQorICAgICAgICAgICovDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJtaXNzaW5nIExaIGRpY3Rpb25hcnkiKTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFpfRVJSTk86DQorICAgICAgICAgLyogZ3ogQVBJcyBvbmx5OiBzaG91bGQgbm90IGhhcHBlbiAqLw0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgiemxpYiBJTyBlcnJvciIpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6DQorICAgICAgICAgLyogaW50ZXJuYWwgbGlicG5nIGVycm9yICovDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJiYWQgcGFyYW1ldGVycyB0byB6bGliIik7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBaX0RBVEFfRVJST1I6DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJkYW1hZ2VkIExaIHN0cmVhbSIpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgWl9NRU1fRVJST1I6DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJpbnN1ZmZpY2llbnQgbWVtb3J5Iik7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBaX0JVRl9FUlJPUjoNCisgICAgICAgICAvKiBFbmQgb2YgaW5wdXQgb3Igb3V0cHV0OyBub3QgYSBwcm9ibGVtIGlmIHRoZSBjYWxsZXIgaXMgZG9pbmcNCisgICAgICAgICAgKiBpbmNyZW1lbnRhbCByZWFkIG9yIHdyaXRlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgidHJ1bmNhdGVkIik7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJ1bnN1cHBvcnRlZCB6bGliIHZlcnNpb24iKTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOg0KKyAgICAgICAgIC8qIENvbXBpbGUgZXJyb3JzIGhlcmUgbWVhbiB0aGF0IHpsaWIgbm93IHVzZXMgdGhlIHZhbHVlIGNvLW9wdGVkIGluDQorICAgICAgICAgICogcG5ncHJpdi5oIGZvciBQTkdfVU5FWFBFQ1RFRF9aTElCX1JFVFVSTjsgdXBkYXRlIHRoZSBzd2l0Y2ggYWJvdmUNCisgICAgICAgICAgKiBhbmQgY2hhbmdlIHBuZ3ByaXYuaC4gIE5vdGUgdGhhdCB0aGlzIG1lc3NhZ2UgaXMgIi4uLiByZXR1cm4iLA0KKyAgICAgICAgICAqIHdoZXJlYXMgdGhlIGRlZmF1bHQvWl9PSyBvbmUgaXMgIi4uLiByZXR1cm4gY29kZSIuDQorICAgICAgICAgICovDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJ1bmV4cGVjdGVkIHpsaWIgcmV0dXJuIik7DQorICAgICAgICAgYnJlYWs7DQorICAgfQ0KK30NCisNCisvKiBwbmdfY29udmVydF9zaXplOiBhIFBOR0FQSSBidXQgbm8gbG9uZ2VyIGluIHBuZy5oLCBzbyBkZWxldGVkDQorICogYXQgbGlicG5nIDEuNS41IQ0KKyAqLw0KKw0KKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zNCBhbmQgMS40LjAgKG1vdmVkIGZyb20gcG5nc2V0LmMpICovDQorI2lmZGVmIFBOR19HQU1NQV9TVVBQT1JURUQgLyogYWx3YXlzIHNldCBpZiBDT0xPUlNQQUNFICovDQorc3RhdGljIGludA0KK3BuZ19jb2xvcnNwYWNlX2NoZWNrX2dhbW1hKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2ZpeGVkX3BvaW50IGdBTUEsIGludCBmcm9tKQ0KKyAgIC8qIFRoaXMgaXMgY2FsbGVkIHRvIGNoZWNrIGEgbmV3IGdhbW1hIHZhbHVlIGFnYWluc3QgYW4gZXhpc3Rpbmcgb25lLiAgVGhlDQorICAgICogcm91dGluZSByZXR1cm5zIGZhbHNlIGlmIHRoZSBuZXcgZ2FtbWEgdmFsdWUgc2hvdWxkIG5vdCBiZSB3cml0dGVuLg0KKyAgICAqDQorICAgICogJ2Zyb20nIHNheXMgd2hlcmUgdGhlIG5ldyBnYW1tYSB2YWx1ZSBjb21lcyBmcm9tOg0KKyAgICAqDQorICAgICogICAgMDogdGhlIG5ldyBnYW1tYSB2YWx1ZSBpcyB0aGUgbGlicG5nIGVzdGltYXRlIGZvciBhbiBJQ0MgcHJvZmlsZQ0KKyAgICAqICAgIDE6IHRoZSBuZXcgZ2FtbWEgdmFsdWUgY29tZXMgZnJvbSBhIGdBTUEgY2h1bmsNCisgICAgKiAgICAyOiB0aGUgbmV3IGdhbW1hIHZhbHVlIGNvbWVzIGZyb20gYW4gc1JHQiBjaHVuaw0KKyAgICAqLw0KK3sNCisgICBwbmdfZml4ZWRfcG9pbnQgZ3Rlc3Q7DQorDQorICAgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEpICE9IDAgJiYNCisgICAgICAoIXBuZ19tdWxkaXYoJmd0ZXN0LCBjb2xvcnNwYWNlLT5nYW1tYSwgUE5HX0ZQXzEsIGdBTUEpIHx8DQorICAgICAgcG5nX2dhbW1hX3NpZ25pZmljYW50KGd0ZXN0KSkpDQorICAgew0KKyAgICAgIC8qIEVpdGhlciB0aGlzIGlzIGFuIHNSR0IgaW1hZ2UsIGluIHdoaWNoIGNhc2UgdGhlIGNhbGN1bGF0ZWQgZ2FtbWENCisgICAgICAgKiBhcHByb3hpbWF0aW9uIHNob3VsZCBtYXRjaCwgb3IgdGhpcyBpcyBhbiBpbWFnZSB3aXRoIGEgcHJvZmlsZSBhbmQgdGhlDQorICAgICAgICogdmFsdWUgbGlicG5nIGNhbGN1bGF0ZXMgZm9yIHRoZSBnYW1tYSBvZiB0aGUgcHJvZmlsZSBkb2VzIG5vdCBtYXRjaCB0aGUNCisgICAgICAgKiB2YWx1ZSByZWNvcmRlZCBpbiB0aGUgZmlsZS4gIFRoZSBmb3JtZXIsIHNSR0IsIGNhc2UgaXMgYW4gZXJyb3IsIHRoZQ0KKyAgICAgICAqIGxhdHRlciBpcyBqdXN0IGEgd2FybmluZy4NCisgICAgICAgKi8NCisgICAgICBpZiAoKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfRlJPTV9zUkdCKSAhPSAwIHx8IGZyb20gPT0gMikNCisgICAgICB7DQorICAgICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAiZ2FtbWEgdmFsdWUgZG9lcyBub3QgbWF0Y2ggc1JHQiIsDQorICAgICAgICAgICAgUE5HX0NIVU5LX0VSUk9SKTsNCisgICAgICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGFuIHNSR0IgdmFsdWUgKi8NCisgICAgICAgICByZXR1cm4gZnJvbSA9PSAyOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIC8qIHNSR0IgdGFnIG5vdCBpbnZvbHZlZCAqLw0KKyAgICAgIHsNCisgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJnYW1tYSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCBsaWJwbmcgZXN0aW1hdGUiLA0KKyAgICAgICAgICAgIFBOR19DSFVOS19XQVJOSU5HKTsNCisgICAgICAgICByZXR1cm4gZnJvbSA9PSAxOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgcmV0dXJuIDE7DQorfQ0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19jb2xvcnNwYWNlX3NldF9nYW1tYShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIHBuZ19maXhlZF9wb2ludCBnQU1BKQ0KK3sNCisgICAvKiBDaGFuZ2VkIGluIGxpYnBuZy0xLjUuNCB0byBsaW1pdCB0aGUgdmFsdWVzIHRvIGVuc3VyZSBvdmVyZmxvdyBjYW4ndA0KKyAgICAqIG9jY3VyLiAgU2luY2UgdGhlIGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uIGlzIGFzc3ltZXRyaWNhbCBpdCBpcw0KKyAgICAqIHBvc3NpYmxlIGZvciAxL2dhbW1hIHRvIG92ZXJmbG93IHRoZSBsaW1pdCBvZiAyMTQ3NCBhbmQgdGhpcyBtZWFucyB0aGUNCisgICAgKiBnYW1tYSB2YWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDUvMTAwMDAwIGFuZCBoZW5jZSBhdCBtb3N0IDIwMDAwLjAuICBGb3INCisgICAgKiBzYWZldHkgdGhlIGxpbWl0cyBoZXJlIGFyZSBhIGxpdHRsZSBuYXJyb3dlci4gIFRoZSB2YWx1ZXMgYXJlIDAuMDAwMTYgdG8NCisgICAgKiA2MjUwLjAsIHdoaWNoIGFyZSB0cnVseSByaWRpY3Vsb3VzIGdhbW1hIHZhbHVlcyAoYW5kIHdpbGwgcHJvZHVjZQ0KKyAgICAqIGRpc3BsYXlzIHRoYXQgYXJlIGFsbCBibGFjayBvciBhbGwgd2hpdGUuKQ0KKyAgICAqDQorICAgICogSW4gMS42LjAgdGhpcyB0ZXN0IHJlcGxhY2VzIHRoZSBvbmVzIGluIHBuZ3J1dGlsLmMsIGluIHRoZSBnQU1BIGNodW5rDQorICAgICogaGFuZGxpbmcgY29kZSwgd2hpY2ggb25seSByZXF1aXJlZCB0aGUgdmFsdWUgdG8gYmUgPjAuDQorICAgICovDQorICAgcG5nX2NvbnN0X2NoYXJwIGVycm1zZzsNCisNCisgICBpZiAoZ0FNQSA8IDE2IHx8IGdBTUEgPiA2MjUwMDAwMDApDQorICAgICAgZXJybXNnID0gImdhbW1hIHZhbHVlIG91dCBvZiByYW5nZSI7DQorDQorIyAgaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQNCisgICAgICAvKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gc2V0IHRoZSBnYW1tYSB2YWx1ZSBtb3JlIHRoYW4gb25jZSAqLw0KKyAgICAgIGVsc2UgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKSAhPSAwICYmDQorICAgICAgICAgKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfRlJPTV9nQU1BKSAhPSAwKQ0KKyAgICAgICAgIGVycm1zZyA9ICJkdXBsaWNhdGUiOw0KKyMgIGVuZGlmDQorDQorICAgLyogRG8gbm90aGluZyBpZiB0aGUgY29sb3JzcGFjZSBpcyBhbHJlYWR5IGludmFsaWQgKi8NCisgICBlbHNlIGlmIChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgaWYgKHBuZ19jb2xvcnNwYWNlX2NoZWNrX2dhbW1hKHBuZ19wdHIsIGNvbG9yc3BhY2UsIGdBTUEsIDEvKmZyb20gZ0FNQSovKSkNCisgICAgICB7DQorICAgICAgICAgLyogU3RvcmUgdGhpcyBnYW1tYSB2YWx1ZS4gKi8NCisgICAgICAgICBjb2xvcnNwYWNlLT5nYW1tYSA9IGdBTUE7DQorICAgICAgICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0NCisgICAgICAgICAgICAoUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQSB8IFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQSk7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIEF0IHByZXNlbnQgaWYgdGhlIGNoZWNrX2dhbW1hIHRlc3QgZmFpbHMgdGhlIGdhbW1hIG9mIHRoZSBjb2xvcnNwYWNlIGlzDQorICAgICAgICogbm90IHVwZGF0ZWQgaG93ZXZlciB0aGUgY29sb3JzcGFjZSBpcyBub3QgaW52YWxpZGF0ZWQuICBUaGlzDQorICAgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIGNhc2Ugd2hlcmUgdGhlIGV4aXN0aW5nIGdhbW1hIGNvbWVzIGZyb20gYW4gc1JHQg0KKyAgICAgICAqIGNodW5rIG9yIHByb2ZpbGUuICBBbiBlcnJvciBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gb3V0cHV0Lg0KKyAgICAgICAqLw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogRXJyb3IgZXhpdCAtIGVycm1zZyBoYXMgYmVlbiBzZXQuICovDQorICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsNCisgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsIGVycm1zZywgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKQ0KKyAgIHsNCisgICAgICAvKiBFdmVyeXRoaW5nIGlzIGludmFsaWQgKi8NCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gfihQTkdfSU5GT19nQU1BfFBOR19JTkZPX2NIUk18UE5HX0lORk9fc1JHQnwNCisgICAgICAgICBQTkdfSU5GT19pQ0NQKTsNCisNCisjICAgICBpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCisgICAgICAgICAvKiBDbGVhbiB1cCB0aGUgaUNDUCBwcm9maWxlIG5vdyBpZiBpdCB3b24ndCBiZSB1c2VkLiAqLw0KKyAgICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0lDQ1AsIC0xLypub3QgdXNlZCovKTsNCisjICAgICBlbHNlDQorICAgICAgICAgUE5HX1VOVVNFRChwbmdfcHRyKQ0KKyMgICAgIGVuZGlmDQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICB7DQorIyAgICAgaWZkZWYgUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVEDQorICAgICAgICAgLyogTGVhdmUgdGhlIElORk9faUNDUCBmbGFnIHNldCBpZiB0aGUgcG5nc2V0LmMgY29kZSBoYXMgYWxyZWFkeSBzZXQNCisgICAgICAgICAgKiBpdDsgdGhpcyBhbGxvd3MgYSBQTkcgdG8gY29udGFpbiBhIHByb2ZpbGUgd2hpY2ggbWF0Y2hlcyBzUkdCIGFuZA0KKyAgICAgICAgICAqIHlldCBzdGlsbCBoYXZlIHRoYXQgcHJvZmlsZSByZXRyaWV2YWJsZSBieSB0aGUgYXBwbGljYXRpb24uDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfTUFUQ0hFU19zUkdCKQ0KKyAgICAgICAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19zUkdCOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3NSR0I7DQorDQorICAgICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMpDQorICAgICAgICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2NIUk07DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fY0hSTTsNCisjICAgICBlbmRpZg0KKw0KKyAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEpDQorICAgICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2dBTUE7DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fZ0FNQTsNCisgICB9DQorfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY29sb3JzcGFjZV9zeW5jKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkgLyogcmVkdWNlIGNvZGUgc2l6ZTsgY2hlY2sgaGVyZSBub3QgaW4gdGhlIGNhbGxlciAqLw0KKyAgICAgIHJldHVybjsNCisNCisgICBpbmZvX3B0ci0+Y29sb3JzcGFjZSA9IHBuZ19wdHItPmNvbG9yc3BhY2U7DQorICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRA0KKy8qIEFkZGVkIGF0IGxpYnBuZy0xLjUuNSB0byBzdXBwb3J0IHJlYWQgYW5kIHdyaXRlIG9mIHRydWUgQ0lFWFlaIHZhbHVlcyBmb3INCisgKiBjSFJNLCBhcyBvcHBvc2VkIHRvIHVzaW5nIGNocm9tYXRpY2l0aWVzLiAgVGhlc2UgaW50ZXJuYWwgQVBJcyByZXR1cm4NCisgKiBub24temVybyBvbiBhIHBhcmFtZXRlciBlcnJvci4gIFRoZSBYLCBZIGFuZCBaIHZhbHVlcyBhcmUgcmVxdWlyZWQgdG8gYmUNCisgKiBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIDEuMC4NCisgKi8NCitzdGF0aWMgaW50DQorcG5nX3h5X2Zyb21fWFlaKHBuZ194eSAqeHksIGNvbnN0IHBuZ19YWVogKlhZWikNCit7DQorICAgcG5nX2ludF8zMiBkLCBkd2hpdGUsIHdoaXRlWCwgd2hpdGVZOw0KKw0KKyAgIGQgPSBYWVotPnJlZF9YICsgWFlaLT5yZWRfWSArIFhZWi0+cmVkX1o7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZ4eS0+cmVkeCwgWFlaLT5yZWRfWCwgUE5HX0ZQXzEsIGQpKSByZXR1cm4gMTsNCisgICBpZiAoIXBuZ19tdWxkaXYoJnh5LT5yZWR5LCBYWVotPnJlZF9ZLCBQTkdfRlBfMSwgZCkpIHJldHVybiAxOw0KKyAgIGR3aGl0ZSA9IGQ7DQorICAgd2hpdGVYID0gWFlaLT5yZWRfWDsNCisgICB3aGl0ZVkgPSBYWVotPnJlZF9ZOw0KKw0KKyAgIGQgPSBYWVotPmdyZWVuX1ggKyBYWVotPmdyZWVuX1kgKyBYWVotPmdyZWVuX1o7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZ4eS0+Z3JlZW54LCBYWVotPmdyZWVuX1gsIFBOR19GUF8xLCBkKSkgcmV0dXJuIDE7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZ4eS0+Z3JlZW55LCBYWVotPmdyZWVuX1ksIFBOR19GUF8xLCBkKSkgcmV0dXJuIDE7DQorICAgZHdoaXRlICs9IGQ7DQorICAgd2hpdGVYICs9IFhZWi0+Z3JlZW5fWDsNCisgICB3aGl0ZVkgKz0gWFlaLT5ncmVlbl9ZOw0KKw0KKyAgIGQgPSBYWVotPmJsdWVfWCArIFhZWi0+Ymx1ZV9ZICsgWFlaLT5ibHVlX1o7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZ4eS0+Ymx1ZXgsIFhZWi0+Ymx1ZV9YLCBQTkdfRlBfMSwgZCkpIHJldHVybiAxOw0KKyAgIGlmICghcG5nX211bGRpdigmeHktPmJsdWV5LCBYWVotPmJsdWVfWSwgUE5HX0ZQXzEsIGQpKSByZXR1cm4gMTsNCisgICBkd2hpdGUgKz0gZDsNCisgICB3aGl0ZVggKz0gWFlaLT5ibHVlX1g7DQorICAgd2hpdGVZICs9IFhZWi0+Ymx1ZV9ZOw0KKw0KKyAgIC8qIFRoZSByZWZlcmVuY2Ugd2hpdGUgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIGVuZC1wb2ludCAoWCxZLFopIHZlY3RvcnMsDQorICAgICogdGh1czoNCisgICAgKi8NCisgICBpZiAoIXBuZ19tdWxkaXYoJnh5LT53aGl0ZXgsIHdoaXRlWCwgUE5HX0ZQXzEsIGR3aGl0ZSkpIHJldHVybiAxOw0KKyAgIGlmICghcG5nX211bGRpdigmeHktPndoaXRleSwgd2hpdGVZLCBQTkdfRlBfMSwgZHdoaXRlKSkgcmV0dXJuIDE7DQorDQorICAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQNCitwbmdfWFlaX2Zyb21feHkocG5nX1hZWiAqWFlaLCBjb25zdCBwbmdfeHkgKnh5KQ0KK3sNCisgICBwbmdfZml4ZWRfcG9pbnQgcmVkX2ludmVyc2UsIGdyZWVuX2ludmVyc2UsIGJsdWVfc2NhbGU7DQorICAgcG5nX2ZpeGVkX3BvaW50IGxlZnQsIHJpZ2h0LCBkZW5vbWluYXRvcjsNCisNCisgICAvKiBDaGVjayB4eSBhbmQsIGltcGxpY2l0bHksIHouICBOb3RlIHRoYXQgd2lkZSBnYW11dCBjb2xvciBzcGFjZXMgdHlwaWNhbGx5DQorICAgICogaGF2ZSBlbmQgcG9pbnRzIHdpdGggMCB0cmlzdGltdWx1cyB2YWx1ZXMgKHRoZXNlIGFyZSBpbXBvc3NpYmxlIGVuZA0KKyAgICAqIHBvaW50cywgYnV0IHRoZXkgYXJlIHVzZWQgdG8gY292ZXIgdGhlIHBvc3NpYmxlIGNvbG9ycy4pDQorICAgICovDQorICAgaWYgKHh5LT5yZWR4IDwgMCB8fCB4eS0+cmVkeCA+IFBOR19GUF8xKSByZXR1cm4gMTsNCisgICBpZiAoeHktPnJlZHkgPCAwIHx8IHh5LT5yZWR5ID4gUE5HX0ZQXzEteHktPnJlZHgpIHJldHVybiAxOw0KKyAgIGlmICh4eS0+Z3JlZW54IDwgMCB8fCB4eS0+Z3JlZW54ID4gUE5HX0ZQXzEpIHJldHVybiAxOw0KKyAgIGlmICh4eS0+Z3JlZW55IDwgMCB8fCB4eS0+Z3JlZW55ID4gUE5HX0ZQXzEteHktPmdyZWVueCkgcmV0dXJuIDE7DQorICAgaWYgKHh5LT5ibHVleCA8IDAgfHwgeHktPmJsdWV4ID4gUE5HX0ZQXzEpIHJldHVybiAxOw0KKyAgIGlmICh4eS0+Ymx1ZXkgPCAwIHx8IHh5LT5ibHVleSA+IFBOR19GUF8xLXh5LT5ibHVleCkgcmV0dXJuIDE7DQorICAgaWYgKHh5LT53aGl0ZXggPCAwIHx8IHh5LT53aGl0ZXggPiBQTkdfRlBfMSkgcmV0dXJuIDE7DQorICAgaWYgKHh5LT53aGl0ZXkgPCAwIHx8IHh5LT53aGl0ZXkgPiBQTkdfRlBfMS14eS0+d2hpdGV4KSByZXR1cm4gMTsNCisNCisgICAvKiBUaGUgcmV2ZXJzZSBjYWxjdWxhdGlvbiBpcyBtb3JlIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBvcmlnaW5hbCB0cmlzdGltdWx1cw0KKyAgICAqIHZhbHVlIGhhZCA5IGluZGVwZW5kZW50IHZhbHVlcyAocmVkLGdyZWVuLGJsdWUpeChYLFksWikgaG93ZXZlciBvbmx5IDgNCisgICAgKiBkZXJpdmVkIHZhbHVlcyB3ZXJlIHJlY29yZGVkIGluIHRoZSBjSFJNIGNodW5rOw0KKyAgICAqIChyZWQsZ3JlZW4sYmx1ZSx3aGl0ZSl4KHgseSkuICBUaGlzIGxvc2VzIG9uZSBkZWdyZWUgb2YgZnJlZWRvbSBhbmQNCisgICAgKiB0aGVyZWZvcmUgYW4gYXJiaXRyYXJ5IG5pbnRoIHZhbHVlIGhhcyB0byBiZSBpbnRyb2R1Y2VkIHRvIHVuZG8gdGhlDQorICAgICogb3JpZ2luYWwgdHJhbnNmb3JtYXRpb25zLg0KKyAgICAqDQorICAgICogVGhpbmsgb2YgdGhlIG9yaWdpbmFsIGVuZC1wb2ludHMgYXMgcG9pbnRzIGluIChYLFksWikgc3BhY2UuICBUaGUNCisgICAgKiBjaHJvbWF0aWNpdHkgdmFsdWVzIChjKSBoYXZlIHRoZSBwcm9wZXJ0eToNCisgICAgKg0KKyAgICAqICAgICAgICAgICBDDQorICAgICogICBjID0gLS0tLS0tLS0tDQorICAgICogICAgICAgWCArIFkgKyBaDQorICAgICoNCisgICAgKiBGb3IgZWFjaCBjICh4LHkseikgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBvcmlnaW5hbCBDIChYLFksWikuICBUaHVzIHRoZQ0KKyAgICAqIHRocmVlIGNocm9tYXRpY2l0eSB2YWx1ZXMgKHgseSx6KSBmb3IgZWFjaCBlbmQtcG9pbnQgb2JleSB0aGUNCisgICAgKiByZWxhdGlvbnNoaXA6DQorICAgICoNCisgICAgKiAgIHggKyB5ICsgeiA9IDENCisgICAgKg0KKyAgICAqIFRoaXMgZGVzY3JpYmVzIHRoZSBwbGFuZSBpbiAoWCxZLFopIHNwYWNlIHRoYXQgaW50ZXJzZWN0cyBlYWNoIGF4aXMgYXQgdGhlDQorICAgICogdmFsdWUgMS4wOyBjYWxsIHRoaXMgdGhlIGNocm9tYXRpY2l0eSBwbGFuZS4gIFRodXMgdGhlIGNocm9tYXRpY2l0eQ0KKyAgICAqIGNhbGN1bGF0aW9uIGhhcyBzY2FsZWQgZWFjaCBlbmQtcG9pbnQgc28gdGhhdCBpdCBpcyBvbiB0aGUgeCt5K3o9MSBwbGFuZQ0KKyAgICAqIGFuZCBjaHJvbWF0aWNpdHkgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdmVjdG9yIGZyb20gdGhlIG9yaWdpbiB0byB0aGUNCisgICAgKiAoWCxZLFopIHZhbHVlIHdpdGggdGhlIGNocm9tYXRpY2l0eSBwbGFuZS4NCisgICAgKg0KKyAgICAqIFRvIGZ1bGx5IGludmVydCB0aGUgY2hyb21hdGljaXR5IGNhbGN1bGF0aW9uIHdlIHdvdWxkIG5lZWQgdGhlIHRocmVlDQorICAgICogZW5kLXBvaW50IHNjYWxlIGZhY3RvcnMsIChyZWQtc2NhbGUsIGdyZWVuLXNjYWxlLCBibHVlLXNjYWxlKSwgYnV0IHRoZXNlDQorICAgICogd2VyZSBub3QgcmVjb3JkZWQuICBJbnN0ZWFkIHdlIGNhbGN1bGF0ZWQgdGhlIHJlZmVyZW5jZSB3aGl0ZSAoWCxZLFopIGFuZA0KKyAgICAqIHJlY29yZGVkIHRoZSBjaHJvbWF0aWNpdHkgb2YgdGhpcy4gIFRoZSByZWZlcmVuY2Ugd2hpdGUgKFgsWSxaKSB3b3VsZCBoYXZlDQorICAgICogZ2l2ZW4gYWxsIHRocmVlIG9mIHRoZSBzY2FsZSBmYWN0b3JzIHNpbmNlOg0KKyAgICAqDQorICAgICogICAgY29sb3ItQyA9IGNvbG9yLWMgKiBjb2xvci1zY2FsZQ0KKyAgICAqICAgIHdoaXRlLUMgPSByZWQtQyArIGdyZWVuLUMgKyBibHVlLUMNCisgICAgKiAgICAgICAgICAgID0gcmVkLWMqcmVkLXNjYWxlICsgZ3JlZW4tYypncmVlbi1zY2FsZSArIGJsdWUtYypibHVlLXNjYWxlDQorICAgICoNCisgICAgKiBCdXQgY0hSTSByZWNvcmRzIG9ubHkgd2hpdGUteCBhbmQgd2hpdGUteSwgc28gd2UgaGF2ZSBsb3N0IHRoZSB3aGl0ZSBzY2FsZQ0KKyAgICAqIGZhY3RvcjoNCisgICAgKg0KKyAgICAqICAgIHdoaXRlLUMgPSB3aGl0ZS1jKndoaXRlLXNjYWxlDQorICAgICoNCisgICAgKiBUbyBoYW5kbGUgdGhpcyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBtYWtlcyBhbiBhcmJpdHJhcnkgYXNzdW1wdGlvbg0KKyAgICAqIGFib3V0IHdoaXRlLXNjYWxlOg0KKyAgICAqDQorICAgICogICAgQXNzdW1lOiB3aGl0ZS1ZID0gMS4wDQorICAgICogICAgSGVuY2U6ICB3aGl0ZS1zY2FsZSA9IDEvd2hpdGUteQ0KKyAgICAqICAgIE9yOiAgICAgcmVkLVkgKyBncmVlbi1ZICsgYmx1ZS1ZID0gMS4wDQorICAgICoNCisgICAgKiBOb3RpY2UgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIHRoZSBhc3N1bXB0aW9uIGdpdmVzIGFuIGVxdWF0aW9uIGluIHRocmVlIG9mDQorICAgICogdGhlIG5pbmUgdmFsdWVzIHdlIHdhbnQgdG8gY2FsY3VsYXRlLiAgOCBtb3JlIGVxdWF0aW9ucyBjb21lIGZyb20gdGhlDQorICAgICogYWJvdmUgcm91dGluZSBhcyBzdW1tYXJpc2VkIGF0IHRoZSB0b3AgYWJvdmUgKHRoZSBjaHJvbWF0aWNpdHkNCisgICAgKiBjYWxjdWxhdGlvbik6DQorICAgICoNCisgICAgKiAgICBHaXZlbjogY29sb3IteCA9IGNvbG9yLVggLyAoY29sb3ItWCArIGNvbG9yLVkgKyBjb2xvci1aKQ0KKyAgICAqICAgIEhlbmNlOiAoY29sb3IteCAtIDEpKmNvbG9yLVggKyBjb2xvci54KmNvbG9yLVkgKyBjb2xvci54KmNvbG9yLVogPSAwDQorICAgICoNCisgICAgKiBUaGlzIGlzIDkgc2ltdWx0YW5lb3VzIGVxdWF0aW9ucyBpbiB0aGUgOSB2YXJpYWJsZXMgImNvbG9yLUMiIGFuZCBjYW4gYmUNCisgICAgKiBzb2x2ZWQgYnkgQ3JhbWVyJ3MgcnVsZS4gIENyYW1lcidzIHJ1bGUgcmVxdWlyZXMgY2FsY3VsYXRpbmcgMTAgOXg5IG1hdHJpeA0KKyAgICAqIGRldGVybWluYW50cywgaG93ZXZlciB0aGlzIGlzIG5vdCBhcyBiYWQgYXMgaXQgc2VlbXMgYmVjYXVzZSBvbmx5IDI4IG9mDQorICAgICogdGhlIHRvdGFsIG9mIDkwIHRlcm1zIGluIHRoZSB2YXJpb3VzIG1hdHJpY2VzIGFyZSBub24temVyby4gIE5ldmVydGhlbGVzcw0KKyAgICAqIENyYW1lcidzIHJ1bGUgaXMgbm90b3Jpb3VzbHkgbnVtZXJpY2FsbHkgdW5zdGFibGUgYmVjYXVzZSB0aGUgZGV0ZXJtaW5hbnQNCisgICAgKiBjYWxjdWxhdGlvbiBpbnZvbHZlcyB0aGUgZGlmZmVyZW5jZSBvZiBsYXJnZSwgYnV0IHNpbWlsYXIsIG51bWJlcnMuICBJdCBpcw0KKyAgICAqIGRpZmZpY3VsdCB0byBiZSBzdXJlIHRoYXQgdGhlIGNhbGN1bGF0aW9uIGlzIHN0YWJsZSBmb3IgcmVhbCB3b3JsZCB2YWx1ZXMNCisgICAgKiBhbmQgaXQgaXMgY2VydGFpbiB0aGF0IGl0IGJlY29tZXMgdW5zdGFibGUgd2hlcmUgdGhlIGVuZCBwb2ludHMgYXJlIGNsb3NlDQorICAgICogdG9nZXRoZXIuDQorICAgICoNCisgICAgKiBTbyB0aGlzIGNvZGUgdXNlcyB0aGUgcGVyaGFwcyBzbGlnaHRseSBsZXNzIG9wdGltYWwgYnV0IG1vcmUNCisgICAgKiB1bmRlcnN0YW5kYWJsZSBhbmQgdG90YWxseSBvYnZpb3VzIGFwcHJvYWNoIG9mIGNhbGN1bGF0aW5nIGNvbG9yLXNjYWxlLg0KKyAgICAqDQorICAgICogVGhpcyBhbGdvcml0aG0gZGVwZW5kcyBvbiB0aGUgcHJlY2lzaW9uIGluIHdoaXRlLXNjYWxlIGFuZCB0aGF0IGlzDQorICAgICogKDEvd2hpdGUteSksIHNvIHdlIGNhbiBpbW1lZGlhdGVseSBzZWUgdGhhdCBhcyB3aGl0ZS15IGFwcHJvYWNoZXMgMCB0aGUNCisgICAgKiBhY2N1cmFjeSBpbmhlcmVudCBpbiB0aGUgY0hSTSBjaHVuayBkcm9wcyBvZmYgc3Vic3RhbnRpYWxseS4NCisgICAgKg0KKyAgICAqIGxpYnBuZyBhcml0aG1ldGljOiBhIHNpbXBsZSBpbnZlcnRpb24gb2YgdGhlIGFib3ZlIGVxdWF0aW9ucw0KKyAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAqDQorICAgICogICAgd2hpdGVfc2NhbGUgPSAxL3doaXRlLXkNCisgICAgKiAgICB3aGl0ZS1YID0gd2hpdGUteCAqIHdoaXRlLXNjYWxlDQorICAgICogICAgd2hpdGUtWSA9IDEuMA0KKyAgICAqICAgIHdoaXRlLVogPSAoMSAtIHdoaXRlLXggLSB3aGl0ZS15KSAqIHdoaXRlX3NjYWxlDQorICAgICoNCisgICAgKiAgICB3aGl0ZS1DID0gcmVkLUMgKyBncmVlbi1DICsgYmx1ZS1DDQorICAgICogICAgICAgICAgICA9IHJlZC1jKnJlZC1zY2FsZSArIGdyZWVuLWMqZ3JlZW4tc2NhbGUgKyBibHVlLWMqYmx1ZS1zY2FsZQ0KKyAgICAqDQorICAgICogVGhpcyBnaXZlcyB1cyB0aHJlZSBlcXVhdGlvbnMgaW4gKHJlZC1zY2FsZSxncmVlbi1zY2FsZSxibHVlLXNjYWxlKSB3aGVyZQ0KKyAgICAqIGFsbCB0aGUgY29lZmZpY2llbnRzIGFyZSBub3cga25vd246DQorICAgICoNCisgICAgKiAgICByZWQteCpyZWQtc2NhbGUgKyBncmVlbi14KmdyZWVuLXNjYWxlICsgYmx1ZS14KmJsdWUtc2NhbGUNCisgICAgKiAgICAgICA9IHdoaXRlLXgvd2hpdGUteQ0KKyAgICAqICAgIHJlZC15KnJlZC1zY2FsZSArIGdyZWVuLXkqZ3JlZW4tc2NhbGUgKyBibHVlLXkqYmx1ZS1zY2FsZSA9IDENCisgICAgKiAgICByZWQteipyZWQtc2NhbGUgKyBncmVlbi16KmdyZWVuLXNjYWxlICsgYmx1ZS16KmJsdWUtc2NhbGUNCisgICAgKiAgICAgICA9ICgxIC0gd2hpdGUteCAtIHdoaXRlLXkpL3doaXRlLXkNCisgICAgKg0KKyAgICAqIEluIHRoZSBsYXN0IGVxdWF0aW9uIGNvbG9yLXogaXMgKDEgLSBjb2xvci14IC0gY29sb3IteSkgc28gd2UgY2FuIGFkZCBhbGwNCisgICAgKiB0aHJlZSBlcXVhdGlvbnMgdG9nZXRoZXIgdG8gZ2V0IGFuIGFsdGVybmF0aXZlIHRoaXJkOg0KKyAgICAqDQorICAgICogICAgcmVkLXNjYWxlICsgZ3JlZW4tc2NhbGUgKyBibHVlLXNjYWxlID0gMS93aGl0ZS15ID0gd2hpdGUtc2NhbGUNCisgICAgKg0KKyAgICAqIFNvIG5vdyB3ZSBoYXZlIGEgQ3JhbWVyJ3MgcnVsZSBzb2x1dGlvbiB3aGVyZSB0aGUgZGV0ZXJtaW5hbnRzIGFyZSBqdXN0DQorICAgICogM3gzIC0gZmFyIG1vcmUgdHJhY3RpYmxlLiAgVW5mb3J0dW5hdGVseSAzeDMgZGV0ZXJtaW5hbnRzIHN0aWxsIGludm9sdmUNCisgICAgKiBtdWx0aXBsaWNhdGlvbiBvZiB0aHJlZSBjb2VmZmljaWVudHMgc28gd2UgY2FuJ3QgZ3VhcmFudGVlIHRvIGF2b2lkDQorICAgICogb3ZlcmZsb3cgaW4gdGhlIGxpYnBuZyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbi4gIFVzaW5nIENyYW1lcidzIHJ1bGUgaW4NCisgICAgKiBmbG9hdGluZyBwb2ludCBpcyBwcm9iYWJseSBhIGdvb2QgY2hvaWNlIGhlcmUsIGJ1dCBpdCdzIG5vdCBhbiBvcHRpb24gZm9yDQorICAgICogZml4ZWQgcG9pbnQuICBJbnN0ZWFkIHByb2NlZWQgdG8gc2ltcGxpZnkgdGhlIGZpcnN0IHR3byBlcXVhdGlvbnMgYnkNCisgICAgKiBlbGltaW5hdGluZyB3aGF0IGlzIGxpa2VseSB0byBiZSB0aGUgbGFyZ2VzdCB2YWx1ZSwgYmx1ZS1zY2FsZToNCisgICAgKg0KKyAgICAqICAgIGJsdWUtc2NhbGUgPSB3aGl0ZS1zY2FsZSAtIHJlZC1zY2FsZSAtIGdyZWVuLXNjYWxlDQorICAgICoNCisgICAgKiBIZW5jZToNCisgICAgKg0KKyAgICAqICAgIChyZWQteCAtIGJsdWUteCkqcmVkLXNjYWxlICsgKGdyZWVuLXggLSBibHVlLXgpKmdyZWVuLXNjYWxlID0NCisgICAgKiAgICAgICAgICAgICAgICAod2hpdGUteCAtIGJsdWUteCkqd2hpdGUtc2NhbGUNCisgICAgKg0KKyAgICAqICAgIChyZWQteSAtIGJsdWUteSkqcmVkLXNjYWxlICsgKGdyZWVuLXkgLSBibHVlLXkpKmdyZWVuLXNjYWxlID0NCisgICAgKiAgICAgICAgICAgICAgICAxIC0gYmx1ZS15KndoaXRlLXNjYWxlDQorICAgICoNCisgICAgKiBBbmQgbm93IHdlIGNhbiB0cml2aWFsbHkgc29sdmUgZm9yIChyZWQtc2NhbGUsZ3JlZW4tc2NhbGUpOg0KKyAgICAqDQorICAgICogICAgZ3JlZW4tc2NhbGUgPQ0KKyAgICAqICAgICAgICAgICAgICAgICh3aGl0ZS14IC0gYmx1ZS14KSp3aGl0ZS1zY2FsZSAtIChyZWQteCAtIGJsdWUteCkqcmVkLXNjYWxlDQorICAgICogICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbi14IC0gYmx1ZS14DQorICAgICoNCisgICAgKiAgICByZWQtc2NhbGUgPQ0KKyAgICAqICAgICAgICAgICAgICAgIDEgLSBibHVlLXkqd2hpdGUtc2NhbGUgLSAoZ3JlZW4teSAtIGJsdWUteSkgKiBncmVlbi1zY2FsZQ0KKyAgICAqICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZC15IC0gYmx1ZS15DQorICAgICoNCisgICAgKiBIZW5jZToNCisgICAgKg0KKyAgICAqICAgIHJlZC1zY2FsZSA9DQorICAgICogICAgICAgICAgKCAoZ3JlZW4teCAtIGJsdWUteCkgKiAod2hpdGUteSAtIGJsdWUteSkgLQ0KKyAgICAqICAgICAgICAgICAgKGdyZWVuLXkgLSBibHVlLXkpICogKHdoaXRlLXggLSBibHVlLXgpICkgLyB3aGl0ZS15DQorICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAqICAoZ3JlZW4teCAtIGJsdWUteCkqKHJlZC15IC0gYmx1ZS15KS0oZ3JlZW4teSAtIGJsdWUteSkqKHJlZC14IC0gYmx1ZS14KQ0KKyAgICAqDQorICAgICogICAgZ3JlZW4tc2NhbGUgPQ0KKyAgICAqICAgICAgICAgICggKHJlZC15IC0gYmx1ZS15KSAqICh3aGl0ZS14IC0gYmx1ZS14KSAtDQorICAgICogICAgICAgICAgICAocmVkLXggLSBibHVlLXgpICogKHdoaXRlLXkgLSBibHVlLXkpICkgLyB3aGl0ZS15DQorICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAqICAoZ3JlZW4teCAtIGJsdWUteCkqKHJlZC15IC0gYmx1ZS15KS0oZ3JlZW4teSAtIGJsdWUteSkqKHJlZC14IC0gYmx1ZS14KQ0KKyAgICAqDQorICAgICogQWNjdXJhY3k6DQorICAgICogVGhlIGlucHV0IHZhbHVlcyBoYXZlIDUgZGVjaW1hbCBkaWdpdHMgb2YgYWNjdXJhY3kuICBUaGUgdmFsdWVzIGFyZSBhbGwgaW4NCisgICAgKiB0aGUgcmFuZ2UgMCA8IHZhbHVlIDwgMSwgc28gc2ltcGxlIHByb2R1Y3RzIGFyZSBpbiB0aGUgc2FtZSByYW5nZSBidXQgbWF5DQorICAgICogbmVlZCB1cCB0byAxMCBkZWNpbWFsIGRpZ2l0cyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcHJlY2lzaW9uIGFuZCBhdm9pZA0KKyAgICAqIHVuZGVyZmxvdy4gIEJlY2F1c2Ugd2UgYXJlIHVzaW5nIGEgMzItYml0IHNpZ25lZCByZXByZXNlbnRhdGlvbiB3ZSBjYW5ub3QNCisgICAgKiBtYXRjaCB0aGlzOyB0aGUgYmVzdCBpcyBhIGxpdHRsZSBvdmVyIDkgZGVjaW1hbCBkaWdpdHMsIGxlc3MgdGhhbiAxMC4NCisgICAgKg0KKyAgICAqIFRoZSBhcHByb2FjaCB1c2VkIGhlcmUgaXMgdG8gcHJlc2VydmUgdGhlIG1heGltdW0gcHJlY2lzaW9uIHdpdGhpbiB0aGUNCisgICAgKiBzaWduZWQgcmVwcmVzZW50YXRpb24uICBCZWNhdXNlIHRoZSByZWQtc2NhbGUgY2FsY3VsYXRpb24gYWJvdmUgdXNlcyB0aGUNCisgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHByb2R1Y3RzIG9mIHZhbHVlcyB0aGF0IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0xLi4rMQ0KKyAgICAqIGl0IGlzIHN1ZmZpY2llbnQgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IDc7IGNlaWwoMTAwLDAwMC8zMjc2NyoyKS4gIFRoZQ0KKyAgICAqIGZhY3RvciBpcyBpcnJlbGV2YW50IGluIHRoZSBjYWxjdWxhdGlvbiBiZWNhdXNlIGl0IGlzIGFwcGxpZWQgdG8gYm90aA0KKyAgICAqIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IuDQorICAgICoNCisgICAgKiBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgZGlmZmVyZW5jZXMgb2YgdGhlIHByb2R1Y3RzIG9mIHRoZQ0KKyAgICAqIGNocm9tYXRpY2l0aWVzIGluIHRoZSBhYm92ZSBlcXVhdGlvbnMgdGVuZCB0byBiZSBzbWFsbCwgZm9yIGV4YW1wbGUgZm9yDQorICAgICogdGhlIHNSR0IgY2hyb21hdGljaXRpZXMgdGhleSBhcmU6DQorICAgICoNCisgICAgKiByZWQgbnVtZXJhdG9yOiAgICAtMC4wNDc1MQ0KKyAgICAqIGdyZWVuIG51bWVyYXRvcjogIC0wLjA4Nzg4DQorICAgICogZGVub21pbmF0b3I6ICAgICAgLTAuMjI0MSAod2l0aG91dCB3aGl0ZS15IG11bHRpcGxpY2F0aW9uKQ0KKyAgICAqDQorICAgICogIFRoZSByZXN1bHRhbnQgWSBjb2VmZmljaWVudHMgZnJvbSB0aGUgY2hyb21hdGljaXRpZXMgb2Ygc29tZSB3aWRlbHkgdXNlZA0KKyAgICAqICBjb2xvciBzcGFjZSBkZWZpbml0aW9ucyBhcmUgKHRvIDE1IGRlY2ltYWwgcGxhY2VzKToNCisgICAgKg0KKyAgICAqICBzUkdCDQorICAgICogICAgMC4yMTI2MzkwMDU4NzE1MTAgMC43MTUxNjg2Nzg3Njc3NTYgMC4wNzIxOTIzMTUzNjA3MzQNCisgICAgKiAgS29kYWsgUHJvUGhvdG8NCisgICAgKiAgICAwLjI4ODA3MTEyODIyOTI5MyAwLjcxMTg0MzIxNzgxMDEwMiAwLjAwMDA4NTY1Mzk2MDYwNQ0KKyAgICAqICBBZG9iZSBSR0INCisgICAgKiAgICAwLjI5NzM0NDk3NTI1MDUzNiAwLjYyNzM2MzU2NjI1NTQ2NiAwLjA3NTI5MTQ1ODQ5Mzk5OA0KKyAgICAqICBBZG9iZSBXaWRlIEdhbXV0IFJHQg0KKyAgICAqICAgIDAuMjU4NzI4MjQzMDQwMTEzIDAuNzI0NjgyMzE0OTQ4NTY2IDAuMDE2NTg5NDQyMDExMzIxDQorICAgICovDQorICAgLyogQnkgdGhlIGFyZ3VtZW50LCBhYm92ZSBvdmVyZmxvdyBzaG91bGQgYmUgaW1wb3NzaWJsZSBoZXJlLiBUaGUgcmV0dXJuDQorICAgICogdmFsdWUgb2YgMiBpbmRpY2F0ZXMgYW4gaW50ZXJuYWwgZXJyb3IgdG8gdGhlIGNhbGxlci4NCisgICAgKi8NCisgICBpZiAoIXBuZ19tdWxkaXYoJmxlZnQsIHh5LT5ncmVlbngteHktPmJsdWV4LCB4eS0+cmVkeSAtIHh5LT5ibHVleSwgNykpDQorICAgICAgcmV0dXJuIDI7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZyaWdodCwgeHktPmdyZWVueS14eS0+Ymx1ZXksIHh5LT5yZWR4IC0geHktPmJsdWV4LCA3KSkNCisgICAgICByZXR1cm4gMjsNCisgICBkZW5vbWluYXRvciA9IGxlZnQgLSByaWdodDsNCisNCisgICAvKiBOb3cgZmluZCB0aGUgcmVkIG51bWVyYXRvci4gKi8NCisgICBpZiAoIXBuZ19tdWxkaXYoJmxlZnQsIHh5LT5ncmVlbngteHktPmJsdWV4LCB4eS0+d2hpdGV5LXh5LT5ibHVleSwgNykpDQorICAgICAgcmV0dXJuIDI7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZyaWdodCwgeHktPmdyZWVueS14eS0+Ymx1ZXksIHh5LT53aGl0ZXgteHktPmJsdWV4LCA3KSkNCisgICAgICByZXR1cm4gMjsNCisNCisgICAvKiBPdmVyZmxvdyBpcyBwb3NzaWJsZSBoZXJlIGFuZCBpdCBpbmRpY2F0ZXMgYW4gZXh0cmVtZSBzZXQgb2YgUE5HIGNIUk0NCisgICAgKiBjaHVuayB2YWx1ZXMuICBUaGlzIGNhbGN1bGF0aW9uIGFjdHVhbGx5IHJldHVybnMgdGhlIHJlY2lwcm9jYWwgb2YgdGhlDQorICAgICogc2NhbGUgdmFsdWUgYmVjYXVzZSB0aGlzIGFsbG93cyB1cyB0byBkZWxheSB0aGUgbXVsdGlwbGljYXRpb24gb2Ygd2hpdGUteQ0KKyAgICAqIGludG8gdGhlIGRlbm9taW5hdG9yLCB3aGljaCB0ZW5kcyB0byBwcm9kdWNlIGEgc21hbGwgbnVtYmVyLg0KKyAgICAqLw0KKyAgIGlmICghcG5nX211bGRpdigmcmVkX2ludmVyc2UsIHh5LT53aGl0ZXksIGRlbm9taW5hdG9yLCBsZWZ0LXJpZ2h0KSB8fA0KKyAgICAgICByZWRfaW52ZXJzZSA8PSB4eS0+d2hpdGV5IC8qIHIrZytiIHNjYWxlcyA9IHdoaXRlIHNjYWxlICovKQ0KKyAgICAgIHJldHVybiAxOw0KKw0KKyAgIC8qIFNpbWlsYXJseSBmb3IgZ3JlZW5faW52ZXJzZTogKi8NCisgICBpZiAoIXBuZ19tdWxkaXYoJmxlZnQsIHh5LT5yZWR5LXh5LT5ibHVleSwgeHktPndoaXRleC14eS0+Ymx1ZXgsIDcpKQ0KKyAgICAgIHJldHVybiAyOw0KKyAgIGlmICghcG5nX211bGRpdigmcmlnaHQsIHh5LT5yZWR4LXh5LT5ibHVleCwgeHktPndoaXRleS14eS0+Ymx1ZXksIDcpKQ0KKyAgICAgIHJldHVybiAyOw0KKyAgIGlmICghcG5nX211bGRpdigmZ3JlZW5faW52ZXJzZSwgeHktPndoaXRleSwgZGVub21pbmF0b3IsIGxlZnQtcmlnaHQpIHx8DQorICAgICAgIGdyZWVuX2ludmVyc2UgPD0geHktPndoaXRleSkNCisgICAgICByZXR1cm4gMTsNCisNCisgICAvKiBBbmQgdGhlIGJsdWUgc2NhbGUsIHRoZSBjaGVja3MgYWJvdmUgZ3VhcmFudGVlIHRoaXMgY2FuJ3Qgb3ZlcmZsb3cgYnV0IGl0DQorICAgICogY2FuIHN0aWxsIHByb2R1Y2UgMCBmb3IgZXh0cmVtZSBjSFJNIHZhbHVlcy4NCisgICAgKi8NCisgICBibHVlX3NjYWxlID0gcG5nX3JlY2lwcm9jYWwoeHktPndoaXRleSkgLSBwbmdfcmVjaXByb2NhbChyZWRfaW52ZXJzZSkgLQ0KKyAgICAgIHBuZ19yZWNpcHJvY2FsKGdyZWVuX2ludmVyc2UpOw0KKyAgIGlmIChibHVlX3NjYWxlIDw9IDApIHJldHVybiAxOw0KKw0KKw0KKyAgIC8qIEFuZCBmaWxsIGluIHRoZSBwbmdfWFlaOiAqLw0KKyAgIGlmICghcG5nX211bGRpdigmWFlaLT5yZWRfWCwgeHktPnJlZHgsIFBOR19GUF8xLCByZWRfaW52ZXJzZSkpIHJldHVybiAxOw0KKyAgIGlmICghcG5nX211bGRpdigmWFlaLT5yZWRfWSwgeHktPnJlZHksIFBOR19GUF8xLCByZWRfaW52ZXJzZSkpIHJldHVybiAxOw0KKyAgIGlmICghcG5nX211bGRpdigmWFlaLT5yZWRfWiwgUE5HX0ZQXzEgLSB4eS0+cmVkeCAtIHh5LT5yZWR5LCBQTkdfRlBfMSwNCisgICAgICByZWRfaW52ZXJzZSkpDQorICAgICAgcmV0dXJuIDE7DQorDQorICAgaWYgKCFwbmdfbXVsZGl2KCZYWVotPmdyZWVuX1gsIHh5LT5ncmVlbngsIFBOR19GUF8xLCBncmVlbl9pbnZlcnNlKSkNCisgICAgICByZXR1cm4gMTsNCisgICBpZiAoIXBuZ19tdWxkaXYoJlhZWi0+Z3JlZW5fWSwgeHktPmdyZWVueSwgUE5HX0ZQXzEsIGdyZWVuX2ludmVyc2UpKQ0KKyAgICAgIHJldHVybiAxOw0KKyAgIGlmICghcG5nX211bGRpdigmWFlaLT5ncmVlbl9aLCBQTkdfRlBfMSAtIHh5LT5ncmVlbnggLSB4eS0+Z3JlZW55LCBQTkdfRlBfMSwNCisgICAgICBncmVlbl9pbnZlcnNlKSkNCisgICAgICByZXR1cm4gMTsNCisNCisgICBpZiAoIXBuZ19tdWxkaXYoJlhZWi0+Ymx1ZV9YLCB4eS0+Ymx1ZXgsIGJsdWVfc2NhbGUsIFBOR19GUF8xKSkgcmV0dXJuIDE7DQorICAgaWYgKCFwbmdfbXVsZGl2KCZYWVotPmJsdWVfWSwgeHktPmJsdWV5LCBibHVlX3NjYWxlLCBQTkdfRlBfMSkpIHJldHVybiAxOw0KKyAgIGlmICghcG5nX211bGRpdigmWFlaLT5ibHVlX1osIFBOR19GUF8xIC0geHktPmJsdWV4IC0geHktPmJsdWV5LCBibHVlX3NjYWxlLA0KKyAgICAgIFBOR19GUF8xKSkNCisgICAgICByZXR1cm4gMTsNCisNCisgICByZXR1cm4gMDsgLypzdWNjZXNzKi8NCit9DQorDQorc3RhdGljIGludA0KK3BuZ19YWVpfbm9ybWFsaXplKHBuZ19YWVogKlhZWikNCit7DQorICAgcG5nX2ludF8zMiBZOw0KKw0KKyAgIGlmIChYWVotPnJlZF9ZIDwgMCB8fCBYWVotPmdyZWVuX1kgPCAwIHx8IFhZWi0+Ymx1ZV9ZIDwgMCB8fA0KKyAgICAgIFhZWi0+cmVkX1ggPCAwIHx8IFhZWi0+Z3JlZW5fWCA8IDAgfHwgWFlaLT5ibHVlX1ggPCAwIHx8DQorICAgICAgWFlaLT5yZWRfWiA8IDAgfHwgWFlaLT5ncmVlbl9aIDwgMCB8fCBYWVotPmJsdWVfWiA8IDApDQorICAgICAgcmV0dXJuIDE7DQorDQorICAgLyogTm9ybWFsaXplIGJ5IHNjYWxpbmcgc28gdGhlIHN1bSBvZiB0aGUgZW5kLXBvaW50IFkgdmFsdWVzIGlzIFBOR19GUF8xLg0KKyAgICAqIElNUExFTUVOVEFUSU9OIE5PVEU6IEFOU0kgcmVxdWlyZXMgc2lnbmVkIG92ZXJmbG93IG5vdCB0byBvY2N1ciwgdGhlcmVmb3JlDQorICAgICogcmVseWluZyBvbiBhZGRpdGlvbiBvZiB0d28gcG9zaXRpdmUgdmFsdWVzIHByb2R1Y2luZyBhIG5lZ2F0aXZlIG9uZSBpcyBub3QNCisgICAgKiBzYWZlLg0KKyAgICAqLw0KKyAgIFkgPSBYWVotPnJlZF9ZOw0KKyAgIGlmICgweDdmZmZmZmZmIC0gWSA8IFhZWi0+Z3JlZW5fWCkgcmV0dXJuIDE7DQorICAgWSArPSBYWVotPmdyZWVuX1k7DQorICAgaWYgKDB4N2ZmZmZmZmYgLSBZIDwgWFlaLT5ibHVlX1gpIHJldHVybiAxOw0KKyAgIFkgKz0gWFlaLT5ibHVlX1k7DQorDQorICAgaWYgKFkgIT0gUE5HX0ZQXzEpDQorICAgew0KKyAgICAgIGlmICghcG5nX211bGRpdigmWFlaLT5yZWRfWCwgWFlaLT5yZWRfWCwgUE5HX0ZQXzEsIFkpKSByZXR1cm4gMTsNCisgICAgICBpZiAoIXBuZ19tdWxkaXYoJlhZWi0+cmVkX1ksIFhZWi0+cmVkX1ksIFBOR19GUF8xLCBZKSkgcmV0dXJuIDE7DQorICAgICAgaWYgKCFwbmdfbXVsZGl2KCZYWVotPnJlZF9aLCBYWVotPnJlZF9aLCBQTkdfRlBfMSwgWSkpIHJldHVybiAxOw0KKw0KKyAgICAgIGlmICghcG5nX211bGRpdigmWFlaLT5ncmVlbl9YLCBYWVotPmdyZWVuX1gsIFBOR19GUF8xLCBZKSkgcmV0dXJuIDE7DQorICAgICAgaWYgKCFwbmdfbXVsZGl2KCZYWVotPmdyZWVuX1ksIFhZWi0+Z3JlZW5fWSwgUE5HX0ZQXzEsIFkpKSByZXR1cm4gMTsNCisgICAgICBpZiAoIXBuZ19tdWxkaXYoJlhZWi0+Z3JlZW5fWiwgWFlaLT5ncmVlbl9aLCBQTkdfRlBfMSwgWSkpIHJldHVybiAxOw0KKw0KKyAgICAgIGlmICghcG5nX211bGRpdigmWFlaLT5ibHVlX1gsIFhZWi0+Ymx1ZV9YLCBQTkdfRlBfMSwgWSkpIHJldHVybiAxOw0KKyAgICAgIGlmICghcG5nX211bGRpdigmWFlaLT5ibHVlX1ksIFhZWi0+Ymx1ZV9ZLCBQTkdfRlBfMSwgWSkpIHJldHVybiAxOw0KKyAgICAgIGlmICghcG5nX211bGRpdigmWFlaLT5ibHVlX1osIFhZWi0+Ymx1ZV9aLCBQTkdfRlBfMSwgWSkpIHJldHVybiAxOw0KKyAgIH0NCisNCisgICByZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludA0KK3BuZ19jb2xvcnNwYWNlX2VuZHBvaW50c19tYXRjaChjb25zdCBwbmdfeHkgKnh5MSwgY29uc3QgcG5nX3h5ICp4eTIsIGludCBkZWx0YSkNCit7DQorICAgLyogQWxsb3cgYW4gZXJyb3Igb2YgKy8tMC4wMSAoYWJzb2x1dGUgdmFsdWUpIG9uIGVhY2ggY2hyb21hdGljaXR5ICovDQorICAgcmV0dXJuICEoUE5HX09VVF9PRl9SQU5HRSh4eTEtPndoaXRleCwgeHkyLT53aGl0ZXgsZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPndoaXRleSwgeHkyLT53aGl0ZXksZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPnJlZHgsICAgeHkyLT5yZWR4LCAgZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPnJlZHksICAgeHkyLT5yZWR5LCAgZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmdyZWVueCwgeHkyLT5ncmVlbngsZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmdyZWVueSwgeHkyLT5ncmVlbnksZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmJsdWV4LCAgeHkyLT5ibHVleCwgZGVsdGEpIHx8DQorICAgICAgUE5HX09VVF9PRl9SQU5HRSh4eTEtPmJsdWV5LCAgeHkyLT5ibHVleSwgZGVsdGEpKTsNCit9DQorDQorLyogQWRkZWQgaW4gbGlicG5nLTEuNi4wLCBhIGRpZmZlcmVudCBjaGVjayBmb3IgdGhlIHZhbGlkaXR5IG9mIGEgc2V0IG9mIGNIUk0NCisgKiBjaHVuayBjaHJvbWF0aWNpdGllcy4gIEVhcmxpZXIgY2hlY2tzIHVzZWQgdG8gc2ltcGx5IGxvb2sgZm9yIHRoZSBvdmVyZmxvdw0KKyAqIGNvbmRpdGlvbiAod2hlcmUgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggdG8gc29sdmUgZm9yIFhZWiBlbmRzIHVwIHplcm8NCisgKiBiZWNhdXNlIHRoZSBjaHJvbWF0aWNpdHkgdmFsdWVzIGFyZSBub3QgYWxsIGRpc3RpbmN0LikgIERlc3BpdGUgdGhpcyBpdCBpcw0KKyAqIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gcHJvZHVjZSBjaHJvbWF0aWNpdGllcyB0aGF0IGFyZSBhcHBhcmVudGx5IHZhbGlkDQorICogYnV0IHRoYXQgcmFwaWRseSBkZWdyYWRlIHRvIGludmFsaWQsIHBvdGVudGlhbGx5IGNyYXNoaW5nLCBzZXRzIGJlY2F1c2Ugb2YNCisgKiBhcml0aG1ldGljIGluYWNjdXJhY2llcyB3aGVuIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIHRoZW0uICBUaGUgbmV3DQorICogY2hlY2sgaXMgdG8gcm91bmQtdHJpcCB4eSAtPiBYWVogLT4geHkgYW5kIHRoZW4gY2hlY2sgdGhhdCB0aGUgcmVzdWx0IGlzDQorICogd2l0aGluIGEgc21hbGwgcGVyY2VudGFnZSBvZiB0aGUgb3JpZ2luYWwuDQorICovDQorc3RhdGljIGludA0KK3BuZ19jb2xvcnNwYWNlX2NoZWNrX3h5KHBuZ19YWVogKlhZWiwgY29uc3QgcG5nX3h5ICp4eSkNCit7DQorICAgaW50IHJlc3VsdDsNCisgICBwbmdfeHkgeHlfdGVzdDsNCisNCisgICAvKiBBcyBhIHNpZGUtZWZmZWN0IHRoaXMgcm91dGluZSBhbHNvIHJldHVybnMgdGhlIFhZWiBlbmRwb2ludHMuICovDQorICAgcmVzdWx0ID0gcG5nX1hZWl9mcm9tX3h5KFhZWiwgeHkpOw0KKyAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7DQorDQorICAgcmVzdWx0ID0gcG5nX3h5X2Zyb21fWFlaKCZ4eV90ZXN0LCBYWVopOw0KKyAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7DQorDQorICAgaWYgKHBuZ19jb2xvcnNwYWNlX2VuZHBvaW50c19tYXRjaCh4eSwgJnh5X3Rlc3QsDQorICAgICAgNS8qYWN0dWFsbHksIHRoZSBtYXRoIGlzIHByZXR0eSBhY2N1cmF0ZSovKSkNCisgICAgICByZXR1cm4gMDsNCisNCisgICAvKiBUb28gbXVjaCBzbGlwICovDQorICAgcmV0dXJuIDE7DQorfQ0KKw0KKy8qIFRoaXMgaXMgdGhlIGNoZWNrIGdvaW5nIHRoZSBvdGhlciB3YXkuICBUaGUgWFlaIGlzIG1vZGlmaWVkIHRvIG5vcm1hbGl6ZSBpdA0KKyAqIChhbm90aGVyIHNpZGUtZWZmZWN0KSBhbmQgdGhlIHh5IGNocm9tYXRpY2l0aWVzIGFyZSByZXR1cm5lZC4NCisgKi8NCitzdGF0aWMgaW50DQorcG5nX2NvbG9yc3BhY2VfY2hlY2tfWFlaKHBuZ194eSAqeHksIHBuZ19YWVogKlhZWikNCit7DQorICAgaW50IHJlc3VsdDsNCisgICBwbmdfWFlaIFhZWnRlbXA7DQorDQorICAgcmVzdWx0ID0gcG5nX1hZWl9ub3JtYWxpemUoWFlaKTsNCisgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0Ow0KKw0KKyAgIHJlc3VsdCA9IHBuZ194eV9mcm9tX1hZWih4eSwgWFlaKTsNCisgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0Ow0KKw0KKyAgIFhZWnRlbXAgPSAqWFlaOw0KKyAgIHJldHVybiBwbmdfY29sb3JzcGFjZV9jaGVja194eSgmWFladGVtcCwgeHkpOw0KK30NCisNCisvKiBVc2VkIHRvIGNoZWNrIGZvciBhbiBlbmRwb2ludCBtYXRjaCBhZ2FpbnN0IHNSR0IgKi8NCitzdGF0aWMgY29uc3QgcG5nX3h5IHNSR0JfeHkgPSAvKiBGcm9tIElUVS1SIEJULjcwOS0zICovDQorew0KKyAgIC8qIGNvbG9yICAgICAgeCAgICAgICB5ICovDQorICAgLyogcmVkICAgKi8gNjQwMDAsIDMzMDAwLA0KKyAgIC8qIGdyZWVuICovIDMwMDAwLCA2MDAwMCwNCisgICAvKiBibHVlICAqLyAxNTAwMCwgIDYwMDAsDQorICAgLyogd2hpdGUgKi8gMzEyNzAsIDMyOTAwDQorfTsNCisNCitzdGF0aWMgaW50DQorcG5nX2NvbG9yc3BhY2Vfc2V0X3h5X2FuZF9YWVoocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfeHkgKnh5LCBjb25zdCBwbmdfWFlaICpYWVosDQorICAgaW50IHByZWZlcnJlZCkNCit7DQorICAgaWYgKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkNCisgICAgICByZXR1cm4gMDsNCisNCisgICAvKiBUaGUgY29uc2lzdGVuY3kgY2hlY2sgaXMgcGVyZm9ybWVkIG9uIHRoZSBjaHJvbWF0aWNpdGllczsgdGhpcyBmYWN0b3JzIG91dA0KKyAgICAqIHZhcmlhdGlvbnMgYmVjYXVzZSBvZiB0aGUgbm9ybWFsaXphdGlvbiAob3Igbm90KSBvZiB0aGUgZW5kIHBvaW50IFkNCisgICAgKiB2YWx1ZXMuDQorICAgICovDQorICAgaWYgKHByZWZlcnJlZCA8IDIgJiYgKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMpKQ0KKyAgIHsNCisgICAgICAvKiBUaGUgZW5kIHBvaW50cyBtdXN0IGJlIHJlYXNvbmFibHkgY2xvc2UgdG8gYW55IHdlIGFscmVhZHkgaGF2ZS4gIFRoZQ0KKyAgICAgICAqIGZvbGxvd2luZyBhbGxvd3MgYW4gZXJyb3Igb2YgdXAgdG8gKy8tLjAwMQ0KKyAgICAgICAqLw0KKyAgICAgIGlmICghcG5nX2NvbG9yc3BhY2VfZW5kcG9pbnRzX21hdGNoKHh5LCAmY29sb3JzcGFjZS0+ZW5kX3BvaW50c194eSwgMTAwKSkNCisgICAgICB7DQorICAgICAgICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsNCisgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbmNvbnNpc3RlbnQgY2hyb21hdGljaXRpZXMiKTsNCisgICAgICAgICByZXR1cm4gMDsgLyogZmFpbGVkICovDQorICAgICAgfQ0KKw0KKyAgICAgIC8qIE9ubHkgb3ZlcndyaXRlIHdpdGggcHJlZmVycmVkIHZhbHVlcyAqLw0KKyAgICAgIGlmICghcHJlZmVycmVkKQ0KKyAgICAgICAgIHJldHVybiAxOyAvKiBvaywgYnV0IG5vIGNoYW5nZSAqLw0KKyAgIH0NCisNCisgICBjb2xvcnNwYWNlLT5lbmRfcG9pbnRzX3h5ID0gKnh5Ow0KKyAgIGNvbG9yc3BhY2UtPmVuZF9wb2ludHNfWFlaID0gKlhZWjsNCisgICBjb2xvcnNwYWNlLT5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUzsNCisNCisgICAvKiBUaGUgZW5kIHBvaW50cyBhcmUgbm9ybWFsbHkgcXVvdGVkIHRvIHR3byBkZWNpbWFsIGRpZ2l0cywgc28gYWxsb3cgKy8tMC4wMQ0KKyAgICAqIG9uIHRoaXMgdGVzdC4NCisgICAgKi8NCisgICBpZiAocG5nX2NvbG9yc3BhY2VfZW5kcG9pbnRzX21hdGNoKHh5LCAmc1JHQl94eSwgMTAwMCkpDQorICAgICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfRU5EUE9JTlRTX01BVENIX3NSR0I7DQorDQorICAgZWxzZQ0KKyAgICAgIGNvbG9yc3BhY2UtPmZsYWdzICY9IFBOR19DT0xPUlNQQUNFX0NBTkNFTCgNCisgICAgICAgICBQTkdfQ09MT1JTUEFDRV9FTkRQT0lOVFNfTUFUQ0hfc1JHQik7DQorDQorICAgcmV0dXJuIDI7IC8qIG9rIGFuZCBjaGFuZ2VkICovDQorfQ0KKw0KK2ludCAvKiBQUklWQVRFICovDQorcG5nX2NvbG9yc3BhY2Vfc2V0X2Nocm9tYXRpY2l0aWVzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgY29uc3QgcG5nX3h5ICp4eSwgaW50IHByZWZlcnJlZCkNCit7DQorICAgLyogV2UgbXVzdCBjaGVjayB0aGUgZW5kIHBvaW50cyB0byBlbnN1cmUgdGhleSBhcmUgcmVhc29uYWJsZSAtIGluIHRoZSBwYXN0DQorICAgICogY29sb3IgbWFuYWdlbWVudCBzeXN0ZW1zIGhhdmUgY3Jhc2hlZCBhcyBhIHJlc3VsdCBvZiBnZXR0aW5nIGJvZ3VzDQorICAgICogY29sb3JhbnQgdmFsdWVzLCB3aGlsZSB0aGlzIGlzbid0IHRoZSBmYXVsdCBvZiBsaWJwbmcgaXQgaXMgdGhlDQorICAgICogcmVzcG9uc2liaWxpdHkgb2YgbGlicG5nIGJlY2F1c2UgUE5HIGNhcnJpZXMgdGhlIGJvbWIgYW5kIGxpYnBuZyBpcyBpbiBhDQorICAgICogcG9zaXRpb24gdG8gcHJvdGVjdCBhZ2FpbnN0IGl0Lg0KKyAgICAqLw0KKyAgIHBuZ19YWVogWFlaOw0KKw0KKyAgIHN3aXRjaCAocG5nX2NvbG9yc3BhY2VfY2hlY2tfeHkoJlhZWiwgeHkpKQ0KKyAgIHsNCisgICAgICBjYXNlIDA6IC8qIHN1Y2Nlc3MgKi8NCisgICAgICAgICByZXR1cm4gcG5nX2NvbG9yc3BhY2Vfc2V0X3h5X2FuZF9YWVoocG5nX3B0ciwgY29sb3JzcGFjZSwgeHksICZYWVosDQorICAgICAgICAgICAgcHJlZmVycmVkKTsNCisNCisgICAgICBjYXNlIDE6DQorICAgICAgICAgLyogV2UgY2FuJ3QgaW52ZXJ0IHRoZSBjaHJvbWF0aWNpdGllcyBzbyB3ZSBjYW4ndCBwcm9kdWNlIHZhbHVlIFhZWg0KKyAgICAgICAgICAqIHZhbHVlcy4gIExpa2VseSBhcyBub3QgYSBjb2xvciBtYW5hZ2VtZW50IHN5c3RlbSB3aWxsIGZhaWwgdG9vLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7DQorICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBjaHJvbWF0aWNpdGllcyIpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgLyogbGlicG5nIGlzIGJyb2tlbjsgdGhpcyBzaG91bGQgYmUgYSB3YXJuaW5nIGJ1dCBpZiBpdCBoYXBwZW5zIHdlDQorICAgICAgICAgICogd2FudCBlcnJvciByZXBvcnRzIHNvIGZvciB0aGUgbW9tZW50IGl0IGlzIGFuIGVycm9yLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCBlcnJvciBjaGVja2luZyBjaHJvbWF0aWNpdGllcyIpOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgIH0NCisNCisgICByZXR1cm4gMDsgLyogZmFpbGVkICovDQorfQ0KKw0KK2ludCAvKiBQUklWQVRFICovDQorcG5nX2NvbG9yc3BhY2Vfc2V0X2VuZHBvaW50cyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIGNvbnN0IHBuZ19YWVogKlhZWl9pbiwgaW50IHByZWZlcnJlZCkNCit7DQorICAgcG5nX1hZWiBYWVogPSAqWFlaX2luOw0KKyAgIHBuZ194eSB4eTsNCisNCisgICBzd2l0Y2ggKHBuZ19jb2xvcnNwYWNlX2NoZWNrX1hZWigmeHksICZYWVopKQ0KKyAgIHsNCisgICAgICBjYXNlIDA6DQorICAgICAgICAgcmV0dXJuIHBuZ19jb2xvcnNwYWNlX3NldF94eV9hbmRfWFlaKHBuZ19wdHIsIGNvbG9yc3BhY2UsICZ4eSwgJlhZWiwNCisgICAgICAgICAgICBwcmVmZXJyZWQpOw0KKw0KKyAgICAgIGNhc2UgMToNCisgICAgICAgICAvKiBFbmQgcG9pbnRzIGFyZSBpbnZhbGlkLiAqLw0KKyAgICAgICAgIGNvbG9yc3BhY2UtPmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7DQorICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBlbmQgcG9pbnRzIik7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBjb2xvcnNwYWNlLT5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9JTlZBTElEOw0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgZXJyb3IgY2hlY2tpbmcgY2hyb21hdGljaXRpZXMiKTsNCisgICAgICAgICBicmVhazsNCisgICB9DQorDQorICAgcmV0dXJuIDA7IC8qIGZhaWxlZCAqLw0KK30NCisNCisjaWYgZGVmaW5lZChQTkdfc1JHQl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX2lDQ1BfU1VQUE9SVEVEKQ0KKy8qIEVycm9yIG1lc3NhZ2UgZ2VuZXJhdGlvbiAqLw0KK3N0YXRpYyBjaGFyDQorcG5nX2ljY190YWdfY2hhcihwbmdfdWludF8zMiBieXRlKQ0KK3sNCisgICBieXRlICY9IDB4ZmY7DQorICAgaWYgKGJ5dGUgPj0gMzIgJiYgYnl0ZSA8PSAxMjYpDQorICAgICAgcmV0dXJuIChjaGFyKWJ5dGU7DQorICAgZWxzZQ0KKyAgICAgIHJldHVybiAnPyc7DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQorcG5nX2ljY190YWdfbmFtZShjaGFyICpuYW1lLCBwbmdfdWludF8zMiB0YWcpDQorew0KKyAgIG5hbWVbMF0gPSAnXCcnOw0KKyAgIG5hbWVbMV0gPSBwbmdfaWNjX3RhZ19jaGFyKHRhZyA+PiAyNCk7DQorICAgbmFtZVsyXSA9IHBuZ19pY2NfdGFnX2NoYXIodGFnID4+IDE2KTsNCisgICBuYW1lWzNdID0gcG5nX2ljY190YWdfY2hhcih0YWcgPj4gIDgpOw0KKyAgIG5hbWVbNF0gPSBwbmdfaWNjX3RhZ19jaGFyKHRhZyAgICAgICk7DQorICAgbmFtZVs1XSA9ICdcJyc7DQorfQ0KKw0KK3N0YXRpYyBpbnQNCitpc19JQ0Nfc2lnbmF0dXJlX2NoYXIocG5nX2FsbG9jX3NpemVfdCBpdCkNCit7DQorICAgcmV0dXJuIGl0ID09IDMyIHx8IChpdCA+PSA0OCAmJiBpdCA8PSA1NykgfHwgKGl0ID49IDY1ICYmIGl0IDw9IDkwKSB8fA0KKyAgICAgIChpdCA+PSA5NyAmJiBpdCA8PSAxMjIpOw0KK30NCisNCitzdGF0aWMgaW50IGlzX0lDQ19zaWduYXR1cmUocG5nX2FsbG9jX3NpemVfdCBpdCkNCit7DQorICAgcmV0dXJuIGlzX0lDQ19zaWduYXR1cmVfY2hhcihpdCA+PiAyNCkgLyogY2hlY2tzIGFsbCB0aGUgdG9wIGJpdHMgKi8gJiYNCisgICAgICBpc19JQ0Nfc2lnbmF0dXJlX2NoYXIoKGl0ID4+IDE2KSAmIDB4ZmYpICYmDQorICAgICAgaXNfSUNDX3NpZ25hdHVyZV9jaGFyKChpdCA+PiA4KSAmIDB4ZmYpICYmDQorICAgICAgaXNfSUNDX3NpZ25hdHVyZV9jaGFyKGl0ICYgMHhmZik7DQorfQ0KKw0KK3N0YXRpYyBpbnQNCitwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwNCisgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX2FsbG9jX3NpemVfdCB2YWx1ZSwgcG5nX2NvbnN0X2NoYXJwIHJlYXNvbikNCit7DQorICAgc2l6ZV90IHBvczsNCisgICBjaGFyIG1lc3NhZ2VbMTk2XTsgLyogc2VlIGJlbG93IGZvciBjYWxjdWxhdGlvbiAqLw0KKw0KKyAgIGlmIChjb2xvcnNwYWNlICE9IE5VTEwpDQorICAgICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsNCisNCisgICBwb3MgPSBwbmdfc2FmZWNhdChtZXNzYWdlLCAoc2l6ZW9mIG1lc3NhZ2UpLCAwLCAicHJvZmlsZSAnIik7IC8qIDkgY2hhcnMgKi8NCisgICBwb3MgPSBwbmdfc2FmZWNhdChtZXNzYWdlLCBwb3MrNzksIHBvcywgbmFtZSk7IC8qIFRydW5jYXRlIHRvIDc5IGNoYXJzICovDQorICAgcG9zID0gcG5nX3NhZmVjYXQobWVzc2FnZSwgKHNpemVvZiBtZXNzYWdlKSwgcG9zLCAiJzogIik7IC8qICsyID0gOTAgKi8NCisgICBpZiAoaXNfSUNDX3NpZ25hdHVyZSh2YWx1ZSkpDQorICAgew0KKyAgICAgIC8qIFNvICd2YWx1ZScgaXMgYXQgbW9zdCA0IGJ5dGVzIGFuZCB0aGUgZm9sbG93aW5nIGNhc3QgaXMgc2FmZSAqLw0KKyAgICAgIHBuZ19pY2NfdGFnX25hbWUobWVzc2FnZStwb3MsIChwbmdfdWludF8zMil2YWx1ZSk7DQorICAgICAgcG9zICs9IDY7IC8qIHRvdGFsICs4OyBsZXNzIHRoYW4gdGhlIGVsc2UgY2xhdXNlICovDQorICAgICAgbWVzc2FnZVtwb3MrK10gPSAnOic7DQorICAgICAgbWVzc2FnZVtwb3MrK10gPSAnICc7DQorICAgfQ0KKyMgIGlmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCisgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIGNoYXIgbnVtYmVyW1BOR19OVU1CRVJfQlVGRkVSX1NJWkVdOyAvKiArMjQgPSAxMTQqLw0KKw0KKyAgICAgICAgIHBvcyA9IHBuZ19zYWZlY2F0KG1lc3NhZ2UsIChzaXplb2YgbWVzc2FnZSksIHBvcywNCisgICAgICAgICAgICBwbmdfZm9ybWF0X251bWJlcihudW1iZXIsIG51bWJlcisoc2l6ZW9mIG51bWJlciksDQorICAgICAgICAgICAgICAgUE5HX05VTUJFUl9GT1JNQVRfeCwgdmFsdWUpKTsNCisgICAgICAgICBwb3MgPSBwbmdfc2FmZWNhdChtZXNzYWdlLCAoc2l6ZW9mIG1lc3NhZ2UpLCBwb3MsICJoOiAiKTsgLyorMiA9IDExNiovDQorICAgICAgfQ0KKyMgIGVuZGlmDQorICAgLyogVGhlICdyZWFzb24nIGlzIGFuIGFyYml0cmFyeSBtZXNzYWdlLCBhbGxvdyArNzkgbWF4aW11bSAxOTUgKi8NCisgICBwb3MgPSBwbmdfc2FmZWNhdChtZXNzYWdlLCAoc2l6ZW9mIG1lc3NhZ2UpLCBwb3MsIHJlYXNvbik7DQorDQorICAgLyogVGhpcyBpcyByZWNvdmVyYWJsZSwgYnV0IG1ha2UgaXQgdW5jb25kaXRpb25hbGx5IGFuIGFwcF9lcnJvciBvbiB3cml0ZSB0bw0KKyAgICAqIGF2b2lkIHdyaXRpbmcgaW52YWxpZCBJQ0MgcHJvZmlsZXMgaW50byBQTkcgZmlsZXMuICAoSS5lLiAgd2UgaGFuZGxlIHRoZW0NCisgICAgKiBvbiByZWFkLCB3aXRoIGEgd2FybmluZywgYnV0IG9uIHdyaXRlIHVubGVzcyB0aGUgYXBwIHR1cm5zIG9mZg0KKyAgICAqIGFwcGxpY2F0aW9uIGVycm9ycyB0aGUgUE5HIHdvbid0IGJlIHdyaXR0ZW4uKQ0KKyAgICAqLw0KKyAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgbWVzc2FnZSwNCisgICAgICAoY29sb3JzcGFjZSAhPSBOVUxMKSA/IFBOR19DSFVOS19FUlJPUiA6IFBOR19DSFVOS19XUklURV9FUlJPUik7DQorDQorICAgcmV0dXJuIDA7DQorfQ0KKyNlbmRpZiAvKiBzUkdCIHx8IGlDQ1AgKi8NCisNCisjaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVEDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfY29sb3JzcGFjZV9zZXRfc1JHQihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLA0KKyAgIGludCBpbnRlbnQpDQorew0KKyAgIC8qIHNSR0Igc2V0cyBrbm93biBnYW1tYSwgZW5kIHBvaW50cyBhbmQgKGZyb20gdGhlIGNodW5rKSBpbnRlbnQuICovDQorICAgLyogSU1QT1JUQU5UOiB0aGVzZSBhcmUgbm90IG5lY2Vzc2FyaWx5IHRoZSB2YWx1ZXMgZm91bmQgaW4gYW4gSUNDIHByb2ZpbGUNCisgICAgKiBiZWNhdXNlIElDQyBwcm9maWxlcyBzdG9yZSB2YWx1ZXMgYWRhcHRlZCB0byBhIEQ1MCBlbnZpcm9ubWVudDsgaXQgaXMNCisgICAgKiBleHBlY3RlZCB0aGF0IHRoZSBJQ0MgcHJvZmlsZSBtZWRpYVdoaXRlUG9pbnRUYWcgd2lsbCBiZSBENTAsIHNlZSB0aGUNCisgICAgKiBjaGVja3MgYW5kIGNvZGUgZWxzZXdoZXJlIHRvIHVuZGVyc3RhbmQgdGhpcyBiZXR0ZXIuDQorICAgICoNCisgICAgKiBUaGVzZSBYWVogdmFsdWVzLCB3aGljaCBhcmUgYWNjdXJhdGUgdG8gNWRwLCBwcm9kdWNlIHJnYiB0byBncmF5DQorICAgICogY29lZmZpY2llbnRzIG9mICg2OTY4LDIzNDM1LDIzNjYpLCB3aGljaCBhcmUgcmVkdWNlZCAoYmVjYXVzZSB0aGV5IGFkZCB1cA0KKyAgICAqIHRvIDMyNzY5IG5vdCAzMjc2OCkgdG8gKDY5NjgsMjM0MzQsMjM2NikuICBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0DQorICAgICogbGlicG5nIGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgKGFuZCBhcmUgdGhlIGJlc3QgdmFsdWVzIGdpdmVuIHRoZSAxNWJpdA0KKyAgICAqIGFsZ29yaXRobSB1c2VkIGJ5IHRoZSByZ2IgdG8gZ3JheSBjb2RlLikNCisgICAgKi8NCisgICBzdGF0aWMgY29uc3QgcG5nX1hZWiBzUkdCX1hZWiA9IC8qIEQ2NSBYWVogKCpub3QqIHRoZSBENTAgYWRhcHRlZCB2YWx1ZXMhKSAqLw0KKyAgIHsNCisgICAgICAvKiBjb2xvciAgICAgIFggICAgICBZICAgICAgWiAqLw0KKyAgICAgIC8qIHJlZCAgICovIDQxMjM5LCAyMTI2NCwgIDE5MzMsDQorICAgICAgLyogZ3JlZW4gKi8gMzU3NTgsIDcxNTE3LCAxMTkxOSwNCisgICAgICAvKiBibHVlICAqLyAxODA0OCwgIDcyMTksIDk1MDUzDQorICAgfTsNCisNCisgICAvKiBEbyBub3RoaW5nIGlmIHRoZSBjb2xvcnNwYWNlIGlzIGFscmVhZHkgaW52YWxpZGF0ZWQuICovDQorICAgaWYgKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkNCisgICAgICByZXR1cm4gMDsNCisNCisgICAvKiBDaGVjayB0aGUgaW50ZW50LCB0aGVuIGNoZWNrIGZvciBleGlzdGluZyBzZXR0aW5ncy4gIEl0IGlzIHZhbGlkIGZvciB0aGUNCisgICAgKiBQTkcgZmlsZSB0byBoYXZlIGNIUk0gb3IgZ0FNQSBjaHVua3MgYWxvbmcgd2l0aCBzUkdCLCBidXQgdGhlIHZhbHVlcyBtdXN0DQorICAgICogYmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlcy4gIElmLCBob3dldmVyLCB0aGlzIGZ1bmN0aW9uIGlzDQorICAgICogY2FsbGVkIGJlbG93IGJlY2F1c2UgYW4gaUNDUCBjaHVuayBtYXRjaGVzIHNSR0IgdGhlbiBpdCBpcyBxdWl0ZQ0KKyAgICAqIGNvbmNlaXZhYmxlIHRoYXQgYW4gb2xkZXIgYXBwIHJlY29yZGVkIGluY29ycmVjdCBnQU1BIGFuZCBjSFJNIGJlY2F1c2Ugb2YNCisgICAgKiBhbiBpbmNvcnJlY3QgY2FsY3VsYXRpb24gYmFzZWQgb24gdGhlIHZhbHVlcyBpbiB0aGUgcHJvZmlsZSAtIHRoaXMgZG9lcw0KKyAgICAqICpub3QqIGludmFsaWRhdGUgdGhlIHByb2ZpbGUgKHRob3VnaCBpdCBzdGlsbCBwcm9kdWNlcyBhbiBlcnJvciwgd2hpY2ggY2FuDQorICAgICogYmUgaWdub3JlZC4pDQorICAgICovDQorICAgaWYgKGludGVudCA8IDAgfHwgaW50ZW50ID49IFBOR19zUkdCX0lOVEVOVF9MQVNUKQ0KKyAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgInNSR0IiLA0KKyAgICAgICAgICh1bnNpZ25lZClpbnRlbnQsICJpbnZhbGlkIHNSR0IgcmVuZGVyaW5nIGludGVudCIpOw0KKw0KKyAgIGlmICgoY29sb3JzcGFjZS0+ZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0lOVEVOVCkgIT0gMCAmJg0KKyAgICAgIGNvbG9yc3BhY2UtPnJlbmRlcmluZ19pbnRlbnQgIT0gaW50ZW50KQ0KKyAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgInNSR0IiLA0KKyAgICAgICAgICh1bnNpZ25lZClpbnRlbnQsICJpbmNvbnNpc3RlbnQgcmVuZGVyaW5nIGludGVudHMiKTsNCisNCisgICBpZiAoKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfRlJPTV9zUkdCKSAhPSAwKQ0KKyAgIHsNCisgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJkdXBsaWNhdGUgc1JHQiBpbmZvcm1hdGlvbiBpZ25vcmVkIik7DQorICAgICAgcmV0dXJuIDA7DQorICAgfQ0KKw0KKyAgIC8qIElmIHRoZSBzdGFuZGFyZCBzUkdCIGNIUk0gY2h1bmsgZG9lcyBub3QgbWF0Y2ggdGhlIG9uZSBmcm9tIHRoZSBQTkcgZmlsZQ0KKyAgICAqIHdhcm4gYnV0IG92ZXJ3cml0ZSB0aGUgdmFsdWUgd2l0aCB0aGUgY29ycmVjdCBvbmUuDQorICAgICovDQorICAgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTKSAhPSAwICYmDQorICAgICAgIXBuZ19jb2xvcnNwYWNlX2VuZHBvaW50c19tYXRjaCgmc1JHQl94eSwgJmNvbG9yc3BhY2UtPmVuZF9wb2ludHNfeHksDQorICAgICAgICAgMTAwKSkNCisgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJjSFJNIGNodW5rIGRvZXMgbm90IG1hdGNoIHNSR0IiLA0KKyAgICAgICAgIFBOR19DSFVOS19FUlJPUik7DQorDQorICAgLyogVGhpcyBjaGVjayBpcyBqdXN0IGRvbmUgZm9yIHRoZSBlcnJvciByZXBvcnRpbmcgLSB0aGUgcm91dGluZSBhbHdheXMNCisgICAgKiByZXR1cm5zIHRydWUgd2hlbiB0aGUgJ2Zyb20nIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHNSR0IgKDIpLg0KKyAgICAqLw0KKyAgICh2b2lkKXBuZ19jb2xvcnNwYWNlX2NoZWNrX2dhbW1hKHBuZ19wdHIsIGNvbG9yc3BhY2UsIFBOR19HQU1NQV9zUkdCX0lOVkVSU0UsDQorICAgICAgMi8qZnJvbSBzUkdCKi8pOw0KKw0KKyAgIC8qIGludGVudDogYnVncyBpbiBHQ0MgZm9yY2UgJ2ludCcgdG8gYmUgdXNlZCBhcyB0aGUgcGFyYW1ldGVyIHR5cGUuICovDQorICAgY29sb3JzcGFjZS0+cmVuZGVyaW5nX2ludGVudCA9IChwbmdfdWludF8xNilpbnRlbnQ7DQorICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSEFWRV9JTlRFTlQ7DQorDQorICAgLyogZW5kcG9pbnRzICovDQorICAgY29sb3JzcGFjZS0+ZW5kX3BvaW50c194eSA9IHNSR0JfeHk7DQorICAgY29sb3JzcGFjZS0+ZW5kX3BvaW50c19YWVogPSBzUkdCX1hZWjsNCisgICBjb2xvcnNwYWNlLT5mbGFncyB8PQ0KKyAgICAgIChQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UU3xQTkdfQ09MT1JTUEFDRV9FTkRQT0lOVFNfTUFUQ0hfc1JHQik7DQorDQorICAgLyogZ2FtbWEgKi8NCisgICBjb2xvcnNwYWNlLT5nYW1tYSA9IFBOR19HQU1NQV9zUkdCX0lOVkVSU0U7DQorICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQTsNCisNCisgICAvKiBGaW5hbGx5IHJlY29yZCB0aGF0IHdlIGhhdmUgYW4gc1JHQiBwcm9maWxlICovDQorICAgY29sb3JzcGFjZS0+ZmxhZ3MgfD0NCisgICAgICAoUE5HX0NPTE9SU1BBQ0VfTUFUQ0hFU19zUkdCfFBOR19DT0xPUlNQQUNFX0ZST01fc1JHQik7DQorDQorICAgcmV0dXJuIDE7IC8qIHNldCAqLw0KK30NCisjZW5kaWYgLyogc1JHQiAqLw0KKw0KKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQNCisvKiBFbmNvZGVkIHZhbHVlIG9mIEQ1MCBhcyBhbiBJQ0MgWFlaTnVtYmVyLiAgRnJvbSB0aGUgSUNDIDIwMTAgc3BlYyB0aGUgdmFsdWUNCisgKiBpcyBYWVooMC45NjQyLDEuMCwwLjgyNDkpLCB3aGljaCBzY2FsZXMgdG86DQorICoNCisgKiAgICAoNjMxODkuODExMiwgNjU1MzYsIDU0MDYwLjY0NjQpDQorICovDQorc3RhdGljIGNvbnN0IHBuZ19ieXRlIEQ1MF9uQ0lFWFlaWzEyXSA9DQorICAgeyAweDAwLCAweDAwLCAweGY2LCAweGQ2LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQzLCAweDJkIH07DQorDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfaWNjX2NoZWNrX2xlbmd0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLA0KKyAgIHBuZ19jb25zdF9jaGFycCBuYW1lLCBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCkNCit7DQorICAgaWYgKHByb2ZpbGVfbGVuZ3RoIDwgMTMyKQ0KKyAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgsDQorICAgICAgICAgInRvbyBzaG9ydCIpOw0KKw0KKyAgIGlmIChwcm9maWxlX2xlbmd0aCAmIDMpDQorICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCwNCisgICAgICAgICAiaW52YWxpZCBsZW5ndGgiKTsNCisNCisgICByZXR1cm4gMTsNCit9DQorDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfaWNjX2NoZWNrX2hlYWRlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLA0KKyAgIHBuZ19jb25zdF9jaGFycCBuYW1lLCBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZS8qIGZpcnN0IDEzMiBieXRlcyBvbmx5ICovLCBpbnQgY29sb3JfdHlwZSkNCit7DQorICAgcG5nX3VpbnRfMzIgdGVtcDsNCisNCisgICAvKiBMZW5ndGggY2hlY2s7IHRoaXMgY2Fubm90IGJlIGlnbm9yZWQgaW4gdGhpcyBjb2RlIGJlY2F1c2UgcHJvZmlsZV9sZW5ndGgNCisgICAgKiBpcyB1c2VkIGxhdGVyIHRvIGNoZWNrIHRoZSB0YWcgdGFibGUsIHNvIGV2ZW4gaWYgdGhlIHByb2ZpbGUgc2VlbXMgb3Zlcg0KKyAgICAqIGxvbmcgcHJvZmlsZV9sZW5ndGggZnJvbSB0aGUgY2FsbGVyIG11c3QgYmUgY29ycmVjdC4gIFRoZSBjYWxsZXIgY2FuIGZpeA0KKyAgICAqIHRoaXMgdXAgb24gcmVhZCBvciB3cml0ZSBieSBqdXN0IHBhc3NpbmcgaW4gdGhlIHByb2ZpbGUgaGVhZGVyIGxlbmd0aC4NCisgICAgKi8NCisgICB0ZW1wID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUpOw0KKyAgIGlmICh0ZW1wICE9IHByb2ZpbGVfbGVuZ3RoKQ0KKyAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwNCisgICAgICAgICAibGVuZ3RoIGRvZXMgbm90IG1hdGNoIHByb2ZpbGUiKTsNCisNCisgICB0ZW1wID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUrMTI4KTsgLyogdGFnIGNvdW50OiAxMiBieXRlcy90YWcgKi8NCisgICBpZiAodGVtcCA+IDM1NzkxMzkzMCB8fCAvKiAoMl4zMi00LTEzMikvMTI6IG1heGltdW0gcG9zc2libGUgdGFnIGNvdW50ICovDQorICAgICAgcHJvZmlsZV9sZW5ndGggPCAxMzIrMTIqdGVtcCkgLyogdHJ1bmNhdGVkIHRhZyB0YWJsZSAqLw0KKyAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwNCisgICAgICAgICAidGFnIGNvdW50IHRvbyBsYXJnZSIpOw0KKw0KKyAgIC8qIFRoZSAnaW50ZW50JyBtdXN0IGJlIHZhbGlkIG9yIHdlIGNhbid0IHN0b3JlIGl0LCBJQ0MgbGltaXRzIHRoZSBpbnRlbnQgdG8NCisgICAgKiAxNiBiaXRzLg0KKyAgICAqLw0KKyAgIHRlbXAgPSBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSs2NCk7DQorICAgaWYgKHRlbXAgPj0gMHhmZmZmKSAvKiBUaGUgSUNDIGxpbWl0ICovDQorICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLA0KKyAgICAgICAgICJpbnZhbGlkIHJlbmRlcmluZyBpbnRlbnQiKTsNCisNCisgICAvKiBUaGlzIGlzIGp1c3QgYSB3YXJuaW5nIGJlY2F1c2UgdGhlIHByb2ZpbGUgbWF5IGJlIHZhbGlkIGluIGZ1dHVyZQ0KKyAgICAqIHZlcnNpb25zLg0KKyAgICAqLw0KKyAgIGlmICh0ZW1wID49IFBOR19zUkdCX0lOVEVOVF9MQVNUKQ0KKyAgICAgICh2b2lkKXBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBOVUxMLCBuYW1lLCB0ZW1wLA0KKyAgICAgICAgICJpbnRlbnQgb3V0c2lkZSBkZWZpbmVkIHJhbmdlIik7DQorDQorICAgLyogQXQgdGhpcyBwb2ludCB0aGUgdGFnIHRhYmxlIGNhbid0IGJlIGNoZWNrZWQgYmVjYXVzZSBpdCBoYXNuJ3QgbmVjZXNzYXJpbHkNCisgICAgKiBiZWVuIGxvYWRlZDsgaG93ZXZlciwgdmFyaW91cyBoZWFkZXIgZmllbGRzIGNhbiBiZSBjaGVja2VkLiAgVGhlc2UgY2hlY2tzDQorICAgICogYXJlIGZvciB2YWx1ZXMgcGVybWl0dGVkIGJ5IHRoZSBQTkcgc3BlYyBpbiBhbiBJQ0MgcHJvZmlsZTsgdGhlIFBORyBzcGVjDQorICAgICogcmVzdHJpY3RzIHRoZSBwcm9maWxlcyB0aGF0IGNhbiBiZSBwYXNzZWQgaW4gYW4gaUNDUCBjaHVuayAodGhleSBtdXN0IGJlDQorICAgICogYXBwcm9wcmlhdGUgdG8gcHJvY2Vzc2luZyBQTkcgZGF0YSEpDQorICAgICovDQorDQorICAgLyogRGF0YSBjaGVja3MgKGNvdWxkIGJlIHNraXBwZWQpLiAgVGhlc2UgY2hlY2tzIG11c3QgYmUgaW5kZXBlbmRlbnQgb2YgdGhlDQorICAgICogdmVyc2lvbiBudW1iZXI7IGhvd2V2ZXIsIHRoZSB2ZXJzaW9uIG51bWJlciBkb2Vzbid0IGFjY29tb2RhdGUgY2hhbmdlcyBpbg0KKyAgICAqIHRoZSBoZWFkZXIgZmllbGRzIChqdXN0IHRoZSBrbm93biB0YWdzIGFuZCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlDQorICAgICogZGF0YS4pDQorICAgICovDQorICAgdGVtcCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKzM2KTsgLyogc2lnbmF0dXJlICdhc2NwJyAqLw0KKyAgIGlmICh0ZW1wICE9IDB4NjE2MzczNzApDQorICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLA0KKyAgICAgICAgICJpbnZhbGlkIHNpZ25hdHVyZSIpOw0KKw0KKyAgIC8qIEN1cnJlbnRseSB0aGUgUENTIGlsbHVtaW5hbnQvYWRvcHRlZCB3aGl0ZSBwb2ludCAodGhlIGNvbXB1dGF0aW9uYWwNCisgICAgKiB3aGl0ZSBwb2ludCkgYXJlIHJlcXVpcmVkIHRvIGJlIEQ1MCwNCisgICAgKiBob3dldmVyIHRoZSBwcm9maWxlIGNvbnRhaW5zIGEgcmVjb3JkIG9mIHRoZSBpbGx1bWluYW50IHNvIHBlcmhhcHMgSUNDDQorICAgICogZXhwZWN0cyB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGlzIGluIHRoZSBmdXR1cmUgKGRlc3BpdGUgdGhlIHJhdGlvbmFsZSBpbg0KKyAgICAqIHRoZSBpbnRyb2R1Y3Rpb24gZm9yIHVzaW5nIGEgZml4ZWQgUENTIGFkb3B0ZWQgd2hpdGUuKSAgQ29uc2VxdWVudGx5IHRoZQ0KKyAgICAqIGZvbGxvd2luZyBpcyBqdXN0IGEgd2FybmluZy4NCisgICAgKi8NCisgICBpZiAobWVtY21wKHByb2ZpbGUrNjgsIEQ1MF9uQ0lFWFlaLCAxMikgIT0gMCkNCisgICAgICAodm9pZClwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgTlVMTCwgbmFtZSwgMC8qbm8gdGFnIHZhbHVlKi8sDQorICAgICAgICAgIlBDUyBpbGx1bWluYW50IGlzIG5vdCBENTAiKTsNCisNCisgICAvKiBUaGUgUE5HIHNwZWMgcmVxdWlyZXMgdGhpczoNCisgICAgKiAiSWYgdGhlIGlDQ1AgY2h1bmsgaXMgcHJlc2VudCwgdGhlIGltYWdlIHNhbXBsZXMgY29uZm9ybSB0byB0aGUgY29sb3VyDQorICAgICogc3BhY2UgcmVwcmVzZW50ZWQgYnkgdGhlIGVtYmVkZGVkIElDQyBwcm9maWxlIGFzIGRlZmluZWQgYnkgdGhlDQorICAgICogSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIFtJQ0NdLiBUaGUgY29sb3VyIHNwYWNlIG9mIHRoZSBJQ0MgcHJvZmlsZQ0KKyAgICAqIHNoYWxsIGJlIGFuIFJHQiBjb2xvdXIgc3BhY2UgZm9yIGNvbG91ciBpbWFnZXMgKFBORyBjb2xvdXIgdHlwZXMgMiwgMywgYW5kDQorICAgICogNiksIG9yIGEgZ3JleXNjYWxlIGNvbG91ciBzcGFjZSBmb3IgZ3JleXNjYWxlIGltYWdlcyAoUE5HIGNvbG91ciB0eXBlcyAwDQorICAgICogYW5kIDQpLiINCisgICAgKg0KKyAgICAqIFRoaXMgY2hlY2tpbmcgY29kZSBlbnN1cmVzIHRoZSBlbWJlZGRlZCBwcm9maWxlIChvbiBlaXRoZXIgcmVhZCBvciB3cml0ZSkNCisgICAgKiBjb25mb3JtcyB0byB0aGUgc3BlY2lmaWNhdGlvbiByZXF1aXJlbWVudHMuICBOb3RpY2UgdGhhdCBhbiBJQ0MgJ2dyYXknDQorICAgICogY29sb3Itc3BhY2UgcHJvZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gdG8gdHJhbnNmb3JtIHRoZSBtb25vY2hyb21lDQorICAgICogZGF0YSB0byBYWVogb3IgTCphKmIgKGFjY29yZGluZyB0byB3aGljaCBQQ1MgdGhlIHByb2ZpbGUgdXNlcykgYW5kIHRoaXMNCisgICAgKiBzaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBzdGFuZGFyZCBsaWJwbmcgSyBjaGFubmVsIHJlcGxpY2F0aW9uDQorICAgICogaW50byBSLCBHIGFuZCBCIGNoYW5uZWxzLg0KKyAgICAqDQorICAgICogUHJldmlvdXNseSBpdCB3YXMgc3VnZ2VzdGVkIHRoYXQgYW4gUkdCIHByb2ZpbGUgb24gZ3JheXNjYWxlIGRhdGEgY291bGQgYmUNCisgICAgKiBoYW5kbGVkLiAgSG93ZXZlciBpdCBpdCBpcyBjbGVhciB0aGF0IHVzaW5nIGFuIFJHQiBwcm9maWxlIGluIHRoaXMgY29udGV4dA0KKyAgICAqIG11c3QgYmUgYW4gZXJyb3IgLSB0aGVyZSBpcyBubyBzcGVjaWZpY2F0aW9uIG9mIHdoYXQgaXQgbWVhbnMuICBUaHVzIGl0IGlzDQorICAgICogYWxtb3N0IGNlcnRhaW5seSBtb3JlIGNvcnJlY3QgdG8gaWdub3JlIHRoZSBwcm9maWxlLg0KKyAgICAqLw0KKyAgIHRlbXAgPSBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSsxNik7IC8qIGRhdGEgY29sb3VyIHNwYWNlIGZpZWxkICovDQorICAgc3dpdGNoICh0ZW1wKQ0KKyAgIHsNCisgICAgICBjYXNlIDB4NTI0NzQyMjA6IC8qICdSR0IgJyAqLw0KKyAgICAgICAgIGlmICghKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpDQorICAgICAgICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLA0KKyAgICAgICAgICAgICAgICJSR0IgY29sb3Igc3BhY2Ugbm90IHBlcm1pdHRlZCBvbiBncmF5c2NhbGUgUE5HIik7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSAweDQ3NTI0MTU5OiAvKiAnR1JBWScgKi8NCisgICAgICAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQ0KKyAgICAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwNCisgICAgICAgICAgICAgICAiR3JheSBjb2xvciBzcGFjZSBub3QgcGVybWl0dGVkIG9uIFJHQiBQTkciKTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgdGVtcCwNCisgICAgICAgICAgICAiaW52YWxpZCBJQ0MgcHJvZmlsZSBjb2xvciBzcGFjZSIpOw0KKyAgIH0NCisNCisgICAvKiBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8gY2hlY2sgdGhhdCB0aGUgcHJvZmlsZSBjbGFzcyBtYXRjaGVzIHRoZQ0KKyAgICAqIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50czsgdGhlIHNwZWMgcHJvdmlkZXMgbm8gZ3VpZGFuY2UsIGJ1dCBpdCdzIHByZXR0eQ0KKyAgICAqIHdlaXJkIGlmIHRoZSBwcm9maWxlIGlzIG5vdCBzY2FubmVyICgnc2NucicpLCBtb25pdG9yICgnbW50cicpLCBwcmludGVyDQorICAgICogKCdwcnRyJykgb3IgJ3NwYWMnIChmb3IgZ2VuZXJpYyBjb2xvciBzcGFjZXMpLiAgSXNzdWUgYSB3YXJuaW5nIGluIHRoZXNlDQorICAgICogY2FzZXMuICBJc3N1ZSBhbiBlcnJvciBmb3IgZGV2aWNlIGxpbmsgb3IgYWJzdHJhY3QgcHJvZmlsZXMgLSB0aGVzZSBkb24ndA0KKyAgICAqIGNvbnRhaW4gdGhlIHJlY29yZHMgbmVjZXNzYXJ5IHRvIHRyYW5zZm9ybSB0aGUgY29sb3Itc3BhY2UgdG8gYW55dGhpbmcNCisgICAgKiBvdGhlciB0aGFuIHRoZSB0YXJnZXQgZGV2aWNlIChhbmQgbm90IGV2ZW4gdGhhdCBmb3IgYW4gYWJzdHJhY3QgcHJvZmlsZSkuDQorICAgICogUHJvZmlsZXMgb2YgdGhlc2UgY2xhc3NlcyBtYXkgbm90IGJlIGVtYmVkZGVkIGluIGltYWdlcy4NCisgICAgKi8NCisgICB0ZW1wID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUrMTIpOyAvKiBwcm9maWxlL2RldmljZSBjbGFzcyAqLw0KKyAgIHN3aXRjaCAodGVtcCkNCisgICB7DQorICAgICAgY2FzZSAweDczNjM2RTcyOiAvKiAnc2NucicgKi8NCisgICAgICBjYXNlIDB4NkQ2RTc0NzI6IC8qICdtbnRyJyAqLw0KKyAgICAgIGNhc2UgMHg3MDcyNzQ3MjogLyogJ3BydHInICovDQorICAgICAgY2FzZSAweDczNzA2MTYzOiAvKiAnc3BhYycgKi8NCisgICAgICAgICAvKiBBbGwgc3VwcG9ydGVkICovDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSAweDYxNjI3Mzc0OiAvKiAnYWJzdCcgKi8NCisgICAgICAgICAvKiBNYXkgbm90IGJlIGVtYmVkZGVkIGluIGFuIGltYWdlICovDQorICAgICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCB0ZW1wLA0KKyAgICAgICAgICAgICJpbnZhbGlkIGVtYmVkZGVkIEFic3RyYWN0IElDQyBwcm9maWxlIik7DQorDQorICAgICAgY2FzZSAweDZDNjk2RTZCOiAvKiAnbGluaycgKi8NCisgICAgICAgICAvKiBEZXZpY2VMaW5rIHByb2ZpbGVzIGNhbm5ub3QgYmUgaW50ZXJwcmV0ZWQgaW4gYSBub24tZGV2aWNlIHNwZWNpZmljDQorICAgICAgICAgICogZmFzaGlvbiwgaWYgYW4gYXBwIHVzZXMgdGhlIEFUb0IwVGFnIGluIHRoZSBwcm9maWxlIHRoZSByZXN1bHRzIGFyZQ0KKyAgICAgICAgICAqIHVuZGVmaW5lZCB1bmxlc3MgdGhlIHJlc3VsdCBpcyBzZW50IHRvIHRoZSBpbnRlbmRlZCBkZXZpY2UsDQorICAgICAgICAgICogdGhlcmVmb3JlIGEgRGV2aWNlTGluayBwcm9maWxlIHNob3VsZCBub3QgYmUgZm91bmQgZW1iZWRkZWQgaW4gYQ0KKyAgICAgICAgICAqIFBORy4NCisgICAgICAgICAgKi8NCisgICAgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHRlbXAsDQorICAgICAgICAgICAgInVuZXhwZWN0ZWQgRGV2aWNlTGluayBJQ0MgcHJvZmlsZSBjbGFzcyIpOw0KKw0KKyAgICAgIGNhc2UgMHg2RTZENjM2QzogLyogJ25tY2wnICovDQorICAgICAgICAgLyogQSBOYW1lZENvbG9yIHByb2ZpbGUgaXMgYWxzbyBkZXZpY2Ugc3BlY2lmaWMsIGhvd2V2ZXIgaXQgZG9lc24ndA0KKyAgICAgICAgICAqIGNvbnRhaW4gYW4gQVRvQjAgdGFnIHRoYXQgaXMgb3BlbiB0byBtaXNpbnRyZXByZXRhdGlvbi4gIEFsbW9zdA0KKyAgICAgICAgICAqIGNlcnRhaW5seSBpdCB3aWxsIGZhaWwgdGhlIHRlc3RzIGJlbG93Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgICh2b2lkKXBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBOVUxMLCBuYW1lLCB0ZW1wLA0KKyAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5hbWVkQ29sb3IgSUNDIHByb2ZpbGUgY2xhc3MiKTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIC8qIFRvIGFsbG93IGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzIHRvIHRoZSBwcm9maWxlIGFjY2VwdCB1bnJlY29nbml6ZWQNCisgICAgICAgICAgKiBwcm9maWxlIGNsYXNzZXMgd2l0aCBhIHdhcm5pbmcsIHRoZXNlIHRoZW4gaGl0IHRoZSB0ZXN0IGJlbG93IG9uIHRoZQ0KKyAgICAgICAgICAqIHRhZyBjb250ZW50IHRvIGVuc3VyZSB0aGV5IGFyZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggb25lIG9mIHRoZQ0KKyAgICAgICAgICAqIHVuZGVyc3Rvb2QgcHJvZmlsZXMuDQorICAgICAgICAgICovDQorICAgICAgICAgKHZvaWQpcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIE5VTEwsIG5hbWUsIHRlbXAsDQorICAgICAgICAgICAgInVucmVjb2duaXplZCBJQ0MgcHJvZmlsZSBjbGFzcyIpOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgIH0NCisNCisgICAvKiBGb3IgYW55IHByb2ZpbGUgb3RoZXIgdGhhbiBhIGRldmljZSBsaW5rIG9uZSB0aGUgUENTIG11c3QgYmUgZW5jb2RlZA0KKyAgICAqIGVpdGhlciBpbiBYWVogb3IgTGFiLg0KKyAgICAqLw0KKyAgIHRlbXAgPSBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSsyMCk7DQorICAgc3dpdGNoICh0ZW1wKQ0KKyAgIHsNCisgICAgICBjYXNlIDB4NTg1OTVBMjA6IC8qICdYWVogJyAqLw0KKyAgICAgIGNhc2UgMHg0QzYxNjIyMDogLyogJ0xhYiAnICovDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHRlbXAsDQorICAgICAgICAgICAgInVuZXhwZWN0ZWQgSUNDIFBDUyBlbmNvZGluZyIpOw0KKyAgIH0NCisNCisgICByZXR1cm4gMTsNCit9DQorDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfaWNjX2NoZWNrX3RhZ190YWJsZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLA0KKyAgIHBuZ19jb25zdF9jaGFycCBuYW1lLCBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSAvKiBoZWFkZXIgcGx1cyB3aG9sZSB0YWcgdGFibGUgKi8pDQorew0KKyAgIHBuZ191aW50XzMyIHRhZ19jb3VudCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKzEyOCk7DQorICAgcG5nX3VpbnRfMzIgaXRhZzsNCisgICBwbmdfY29uc3RfYnl0ZXAgdGFnID0gcHJvZmlsZSsxMzI7IC8qIFRoZSBmaXJzdCB0YWcgKi8NCisNCisgICAvKiBGaXJzdCBzY2FuIGFsbCB0aGUgdGFncyBpbiB0aGUgdGFibGUgYW5kIGFkZCBiaXRzIHRvIHRoZSBpY2NfaW5mbyB2YWx1ZQ0KKyAgICAqICh0ZW1wb3JhcmlseSBpbiAndGFncycpLg0KKyAgICAqLw0KKyAgIGZvciAoaXRhZz0wOyBpdGFnIDwgdGFnX2NvdW50OyArK2l0YWcsIHRhZyArPSAxMikNCisgICB7DQorICAgICAgcG5nX3VpbnRfMzIgdGFnX2lkID0gcG5nX2dldF91aW50XzMyKHRhZyswKTsNCisgICAgICBwbmdfdWludF8zMiB0YWdfc3RhcnQgPSBwbmdfZ2V0X3VpbnRfMzIodGFnKzQpOyAvKiBtdXN0IGJlIGFsaWduZWQgKi8NCisgICAgICBwbmdfdWludF8zMiB0YWdfbGVuZ3RoID0gcG5nX2dldF91aW50XzMyKHRhZys4KTsvKiBub3QgcGFkZGVkICovDQorDQorICAgICAgLyogVGhlIElDQyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGV4Y2x1ZGUgemVybyBsZW5ndGggdGFncywgdGhlcmVmb3JlIHRoZQ0KKyAgICAgICAqIHN0YXJ0IG1pZ2h0IGFjdHVhbGx5IGJlIGFueXdoZXJlIGlmIHRoZXJlIGlzIG5vIGRhdGEsIGJ1dCB0aGlzIHdvdWxkIGJlDQorICAgICAgICogYSBjbGVhciBhYnVzZSBvZiB0aGUgaW50ZW50IG9mIHRoZSBzdGFuZGFyZCBzbyB0aGUgc3RhcnQgaXMgY2hlY2tlZCBmb3INCisgICAgICAgKiBiZWluZyBpbiByYW5nZS4gIEFsbCBkZWZpbmVkIHRhZyB0eXBlcyBoYXZlIGFuIDggYnl0ZSBoZWFkZXIgLSBhIDQgYnl0ZQ0KKyAgICAgICAqIHR5cGUgc2lnbmF0dXJlIHRoZW4gMC4NCisgICAgICAgKi8NCisgICAgICBpZiAoKHRhZ19zdGFydCAmIDMpICE9IDApDQorICAgICAgew0KKyAgICAgICAgIC8qIENOSFA3MzBTLmljYyBzaGlwcGVkIHdpdGggTWljcm9zb2Z0IFdpbmRvd3MgNjQgdmlvbGF0ZXMgdGhpcywgaXQgaXMNCisgICAgICAgICAgKiBvbmx5IGEgd2FybmluZyBoZXJlIGJlY2F1c2UgbGlicG5nIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlDQorICAgICAgICAgICogYWxpZ25tZW50Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgICh2b2lkKXBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBOVUxMLCBuYW1lLCB0YWdfaWQsDQorICAgICAgICAgICAgIklDQyBwcm9maWxlIHRhZyBzdGFydCBub3QgYSBtdWx0aXBsZSBvZiA0Iik7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFRoaXMgaXMgYSBoYXJkIGVycm9yOyBwb3RlbnRpYWxseSBpdCBjYW4gY2F1c2UgcmVhZCBvdXRzaWRlIHRoZQ0KKyAgICAgICAqIHByb2ZpbGUuDQorICAgICAgICovDQorICAgICAgaWYgKHRhZ19zdGFydCA+IHByb2ZpbGVfbGVuZ3RoIHx8IHRhZ19sZW5ndGggPiBwcm9maWxlX2xlbmd0aCAtIHRhZ19zdGFydCkNCisgICAgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHRhZ19pZCwNCisgICAgICAgICAgICAiSUNDIHByb2ZpbGUgdGFnIG91dHNpZGUgcHJvZmlsZSIpOw0KKyAgIH0NCisNCisgICByZXR1cm4gMTsgLyogc3VjY2VzcywgbWF5YmUgd2l0aCB3YXJuaW5ncyAqLw0KK30NCisNCisjaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVEDQorLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGtub3duIElDQyBzUkdCIHByb2ZpbGVzICovDQorc3RhdGljIGNvbnN0IHN0cnVjdA0KK3sNCisgICBwbmdfdWludF8zMiBhZGxlciwgY3JjLCBsZW5ndGg7DQorICAgcG5nX3VpbnRfMzIgbWQ1WzRdOw0KKyAgIHBuZ19ieXRlICAgIGhhdmVfbWQ1Ow0KKyAgIHBuZ19ieXRlICAgIGlzX2Jyb2tlbjsNCisgICBwbmdfdWludF8xNiBpbnRlbnQ7DQorDQorIyAgZGVmaW5lIFBOR19NRDUoYSxiLGMsZCkgeyBhLCBiLCBjLCBkIH0sIChhIT0wKXx8KGIhPTApfHwoYyE9MCl8fChkIT0wKQ0KKyMgIGRlZmluZSBQTkdfSUNDX0NIRUNLU1VNKGFkbGVyLCBjcmMsIG1kNSwgaW50ZW50LCBicm9rZSwgZGF0ZSwgbGVuZ3RoLCBmbmFtZSlcDQorICAgICAgeyBhZGxlciwgY3JjLCBsZW5ndGgsIG1kNSwgYnJva2UsIGludGVudCB9LA0KKw0KK30gcG5nX3NSR0JfY2hlY2tzW10gPQ0KK3sNCisgICAvKiBUaGlzIGRhdGEgY29tZXMgZnJvbSBjb250cmliL3Rvb2xzL2NoZWNrc3VtLWljYyBydW4gb24gZG93bmxvYWRzIG9mDQorICAgICogYWxsIGZvdXIgSUNDIHNSR0IgcHJvZmlsZXMgZnJvbSB3d3cuY29sb3Iub3JnLg0KKyAgICAqLw0KKyAgIC8qIGFkbGVyMzIsIGNyYzMyLCBNRDVbNF0sIGludGVudCwgZGF0ZSwgbGVuZ3RoLCBmaWxlLW5hbWUgKi8NCisgICBQTkdfSUNDX0NIRUNLU1VNKDB4MGEzZmQ5ZjYsIDB4M2I4NzcyYjksDQorICAgICAgUE5HX01ENSgweDI5ZjgzZGRlLCAweGFmZjI1NWFlLCAweDc4NDJmYWU0LCAweGNhODMzOTBkKSwgMCwgMCwNCisgICAgICAiMjAwOS8wMy8yNyAyMTozNjozMSIsIDMwNDgsICJzUkdCX0lFQzYxOTY2LTItMV9ibGFja19zY2FsZWQuaWNjIikNCisNCisgICAvKiBJQ0Mgc1JHQiB2MiBwZXJjZXB0dWFsIG5vIGJsYWNrLWNvbXBlbnNhdGlvbjogKi8NCisgICBQTkdfSUNDX0NIRUNLU1VNKDB4NDkwOWU1ZTEsIDB4NDI3ZWJiMjEsDQorICAgICAgUE5HX01ENSgweGM5NWJkNjM3LCAweGU5NWQ4YTNiLCAweDBkZjM4Zjk5LCAweGMxMzIwMzg5KSwgMSwgMCwNCisgICAgICAiMjAwOS8wMy8yNyAyMTozNzo0NSIsIDMwNTIsICJzUkdCX0lFQzYxOTY2LTItMV9ub19ibGFja19zY2FsaW5nLmljYyIpDQorDQorICAgUE5HX0lDQ19DSEVDS1NVTSgweGZkMjE0NGExLCAweDMwNmZkOGFlLA0KKyAgICAgIFBOR19NRDUoMHhmYzY2MzM3OCwgMHgzN2UyODg2YiwgMHhmZDcyZTk4MywgMHg4MjI4ZjFiOCksIDAsIDAsDQorICAgICAgIjIwMDkvMDgvMTAgMTc6Mjg6MDEiLCA2MDk4OCwgInNSR0JfdjRfSUNDX3ByZWZlcmVuY2VfZGlzcGxheWNsYXNzLmljYyIpDQorDQorICAgLyogSUNDIHNSR0IgdjQgcGVyY2VwdHVhbCAqLw0KKyAgIFBOR19JQ0NfQ0hFQ0tTVU0oMHgyMDljMzVkMiwgMHhiYmVmNzgxMiwNCisgICAgICBQTkdfTUQ1KDB4MzQ1NjJhYmYsIDB4OTk0Y2NkMDYsIDB4NmQyYzU3MjEsIDB4ZDBkNjhjNWQpLCAwLCAwLA0KKyAgICAgICIyMDA3LzA3LzI1IDAwOjA1OjM3IiwgNjA5NjAsICJzUkdCX3Y0X0lDQ19wcmVmZXJlbmNlLmljYyIpDQorDQorICAgLyogVGhlIGZvbGxvd2luZyBwcm9maWxlcyBoYXZlIG5vIGtub3duIE1ENSBjaGVja3N1bS4gSWYgdGhlcmUgaXMgYSBtYXRjaA0KKyAgICAqIG9uIHRoZSAoZW1wdHkpIE1ENSB0aGUgb3RoZXIgZmllbGRzIGFyZSB1c2VkIHRvIGF0dGVtcHQgYSBtYXRjaCBhbmQNCisgICAgKiBhIHdhcm5pbmcgaXMgcHJvZHVjZWQuICBUaGUgZmlyc3QgdHdvIG9mIHRoZXNlIHByb2ZpbGVzIGhhdmUgYSAnY3BydCcgdGFnDQorICAgICogd2hpY2ggc3VnZ2VzdHMgdGhhdCB0aGV5IHdlcmUgYWxzbyBtYWRlIGJ5IEhld2xldHQgUGFja2FyZC4NCisgICAgKi8NCisgICBQTkdfSUNDX0NIRUNLU1VNKDB4YTA1NGQ3NjIsIDB4NWQ1MTI5Y2UsDQorICAgICAgUE5HX01ENSgweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSwgMSwgMCwNCisgICAgICAiMjAwNC8wNy8yMSAxODo1Nzo0MiIsIDMwMjQsICJzUkdCX0lFQzYxOTY2LTItMV9ub0JQQy5pY2MiKQ0KKw0KKyAgIC8qIFRoaXMgaXMgYSAnbW50cicgKGRpc3BsYXkpIHByb2ZpbGUgd2l0aCBhIG1lZGlhV2hpdGVQb2ludFRhZyB0aGF0IGRvZXMgbm90DQorICAgICogbWF0Y2ggdGhlIEQ1MCBQQ1MgaWxsdW1pbmFudCBpbiB0aGUgaGVhZGVyIChpdCBpcyBpbiBmYWN0IHRoZSBENjUgdmFsdWVzLA0KKyAgICAqIHNvIHRoZSB3aGl0ZSBwb2ludCBpcyByZWNvcmRlZCBhcyB0aGUgdW4tYWRhcHRlZCB2YWx1ZS4pICBUaGUgcHJvZmlsZXMNCisgICAgKiBiZWxvdyBvbmx5IGRpZmZlciBpbiBvbmUgYnl0ZSAtIHRoZSBpbnRlbnQgLSBhbmQgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcw0KKyAgICAqIHRoZSBwcmV2aW91cyBwcm9maWxlIGV4Y2VwdCBmb3IgdGhlIG1lZGlhV2hpdGVQb2ludFRhZyBlcnJvciBhbmQgYSBtaXNzaW5nDQorICAgICogY2hyb21hdGljQWRhcHRhdGlvblRhZy4NCisgICAgKi8NCisgICBQTkdfSUNDX0NIRUNLU1VNKDB4Zjc4NGYzZmIsIDB4MTgyZWE1NTIsDQorICAgICAgUE5HX01ENSgweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSwgMCwgMS8qYnJva2VuKi8sDQorICAgICAgIjE5OTgvMDIvMDkgMDY6NDk6MDAiLCAzMTQ0LCAiSFAtTWljcm9zb2Z0IHNSR0IgdjIgcGVyY2VwdHVhbCIpDQorDQorICAgUE5HX0lDQ19DSEVDS1NVTSgweDAzOThmM2ZjLCAweGYyOWU1MjZkLA0KKyAgICAgIFBOR19NRDUoMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCksIDEsIDEvKmJyb2tlbiovLA0KKyAgICAgICIxOTk4LzAyLzA5IDA2OjQ5OjAwIiwgMzE0NCwgIkhQLU1pY3Jvc29mdCBzUkdCIHYyIG1lZGlhLXJlbGF0aXZlIikNCit9Ow0KKw0KK3N0YXRpYyBpbnQNCitwbmdfY29tcGFyZV9JQ0NfcHJvZmlsZV93aXRoX3NSR0IocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHVMb25nIGFkbGVyKQ0KK3sNCisgICAvKiBUaGUgcXVpY2sgY2hlY2sgaXMgdG8gdmVyaWZ5IGp1c3QgdGhlIE1ENSBzaWduYXR1cmUgYW5kIHRydXN0IHRoZQ0KKyAgICAqIHJlc3Qgb2YgdGhlIGRhdGEuICBCZWNhdXNlIHRoZSBwcm9maWxlIGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQgZm9yDQorICAgICogY29ycmVjdG5lc3MgdGhpcyBpcyBzYWZlLiAgcG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0Igd2lsbCBjaGVjayB0aGUgJ2ludGVudCcNCisgICAgKiBmaWVsZCB0b28sIHNvIGlmIHRoZSBwcm9maWxlIGhhcyBiZWVuIGVkaXRlZCB3aXRoIGFuIGludGVudCBub3QgZGVmaW5lZA0KKyAgICAqIGJ5IHNSR0IgKGJ1dCBtYXliZSBkZWZpbmVkIGJ5IGEgbGF0ZXIgSUNDIHNwZWNpZmljYXRpb24pIHRoZSByZWFkIG9mDQorICAgICogdGhlIHByb2ZpbGUgd2lsbCBmYWlsIGF0IHRoYXQgcG9pbnQuDQorICAgICovDQorICAgcG5nX3VpbnRfMzIgbGVuZ3RoID0gMDsNCisgICBwbmdfdWludF8zMiBpbnRlbnQgPSAweDEwMDAwOyAvKiBpbnZhbGlkICovDQorI2lmIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTID4gMQ0KKyAgIHVMb25nIGNyYyA9IDA7IC8qIHRoZSB2YWx1ZSBmb3IgMCBsZW5ndGggZGF0YSAqLw0KKyNlbmRpZg0KKyAgIHVuc2lnbmVkIGludCBpOw0KKw0KKyAgIGZvciAoaT0wOyBpIDwgKHNpemVvZiBwbmdfc1JHQl9jaGVja3MpIC8gKHNpemVvZiBwbmdfc1JHQl9jaGVja3NbMF0pOyArK2kpDQorICAgew0KKyAgICAgIGlmIChwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSs4NCkgPT0gcG5nX3NSR0JfY2hlY2tzW2ldLm1kNVswXSAmJg0KKyAgICAgICAgIHBuZ19nZXRfdWludF8zMihwcm9maWxlKzg4KSA9PSBwbmdfc1JHQl9jaGVja3NbaV0ubWQ1WzFdICYmDQorICAgICAgICAgcG5nX2dldF91aW50XzMyKHByb2ZpbGUrOTIpID09IHBuZ19zUkdCX2NoZWNrc1tpXS5tZDVbMl0gJiYNCisgICAgICAgICBwbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSs5NikgPT0gcG5nX3NSR0JfY2hlY2tzW2ldLm1kNVszXSkNCisgICAgICB7DQorICAgICAgICAgLyogVGhpcyBtYXkgYmUgb25lIG9mIHRoZSBvbGQgSFAgcHJvZmlsZXMgd2l0aG91dCBhbiBNRDUsIGluIHRoYXQNCisgICAgICAgICAgKiBjYXNlIHdlIGNhbiBvbmx5IHVzZSB0aGUgbGVuZ3RoIGFuZCBBZGxlcjMyIChub3RlIHRoYXQgdGhlc2UNCisgICAgICAgICAgKiBhcmUgbm90IHVzZWQgYnkgZGVmYXVsdCBpZiB0aGVyZSBpcyBhbiBNRDUhKQ0KKyAgICAgICAgICAqLw0KKyMgICAgICAgIGlmIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTID09IDANCisgICAgICAgICAgICBpZiAocG5nX3NSR0JfY2hlY2tzW2ldLmhhdmVfbWQ1KQ0KKyAgICAgICAgICAgICAgIHJldHVybiAxK3BuZ19zUkdCX2NoZWNrc1tpXS5pc19icm9rZW47DQorIyAgICAgICAgZW5kaWYNCisNCisgICAgICAgICAvKiBQcm9maWxlIGlzIHVuc2lnbmVkIG9yIG1vcmUgY2hlY2tzIGhhdmUgYmVlbiBjb25maWd1cmVkIGluLiAqLw0KKyAgICAgICAgIGlmIChsZW5ndGggPT0gMCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgbGVuZ3RoID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUpOw0KKyAgICAgICAgICAgIGludGVudCA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKzY0KTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgLyogTGVuZ3RoICphbmQqIGludGVudCBtdXN0IG1hdGNoICovDQorICAgICAgICAgaWYgKGxlbmd0aCA9PSBwbmdfc1JHQl9jaGVja3NbaV0ubGVuZ3RoICYmDQorICAgICAgICAgICAgaW50ZW50ID09IHBuZ19zUkdCX2NoZWNrc1tpXS5pbnRlbnQpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIE5vdyBjYWxjdWxhdGUgdGhlIGFkbGVyMzIgaWYgbm90IGRvbmUgYWxyZWFkeS4gKi8NCisgICAgICAgICAgICBpZiAoYWRsZXIgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgYWRsZXIgPSBhZGxlcjMyKDAsIE5VTEwsIDApOw0KKyAgICAgICAgICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgcHJvZmlsZSwgbGVuZ3RoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKGFkbGVyID09IHBuZ19zUkdCX2NoZWNrc1tpXS5hZGxlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogVGhlc2UgYmFzaWMgY2hlY2tzIHN1Z2dlc3QgdGhhdCB0aGUgZGF0YSBoYXMgbm90IGJlZW4NCisgICAgICAgICAgICAgICAgKiBtb2RpZmllZCwgYnV0IGlmIHRoZSBjaGVjayBsZXZlbCBpcyBtb3JlIHRoYW4gMSBwZXJmb3JtDQorICAgICAgICAgICAgICAgICogb3VyIG93biBjcmMzMiBjaGVja3N1bSBvbiB0aGUgZGF0YS4NCisgICAgICAgICAgICAgICAgKi8NCisjICAgICAgICAgICAgICBpZiBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyA+IDENCisgICAgICAgICAgICAgICAgICBpZiAoY3JjID09IDApDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIGNyYyA9IGNyYzMyKDAsIE5VTEwsIDApOw0KKyAgICAgICAgICAgICAgICAgICAgIGNyYyA9IGNyYzMyKGNyYywgcHJvZmlsZSwgbGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgLyogU28gdGhpcyBjaGVjayBtdXN0IHBhc3MgZm9yIHRoZSAncmV0dXJuJyBiZWxvdyB0byBoYXBwZW4uDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgaWYgKGNyYyA9PSBwbmdfc1JHQl9jaGVja3NbaV0uY3JjKQ0KKyMgICAgICAgICAgICAgIGVuZGlmDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfc1JHQl9jaGVja3NbaV0uaXNfYnJva2VuKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBwcm9maWxlcyBhcmUga25vd24gdG8gaGF2ZSBiYWQgZGF0YSB0aGF0IG1heSBjYXVzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAqIHByb2JsZW1zIGlmIHRoZXkgYXJlIHVzZWQsIHRoZXJlZm9yZSBhdHRlbXB0IHRvDQorICAgICAgICAgICAgICAgICAgICAgICogZGlzY291cmFnZSB0aGVpciB1c2UsIHNraXAgdGhlICdoYXZlX21kNScgd2FybmluZyBiZWxvdywNCisgICAgICAgICAgICAgICAgICAgICAgKiB3aGljaCBpcyBtYWRlIGlycmVsZXZhbnQgYnkgdGhpcyBlcnJvci4NCisgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJrbm93biBpbmNvcnJlY3Qgc1JHQiBwcm9maWxlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQ0hVTktfRVJST1IpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAvKiBXYXJuIHRoYXQgdGhpcyBiZWluZyBkb25lOyB0aGlzIGlzbid0IGV2ZW4gYW4gZXJyb3Igc2luY2UNCisgICAgICAgICAgICAgICAgICAgKiB0aGUgcHJvZmlsZSBpcyBwZXJmZWN0bHkgdmFsaWQsIGJ1dCBpdCB3b3VsZCBiZSBuaWNlIGlmDQorICAgICAgICAgICAgICAgICAgICogcGVvcGxlIHVzZWQgdGhlIHVwLXRvLWRhdGUgb25lcy4NCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcG5nX3NSR0JfY2hlY2tzW2ldLmhhdmVfbWQ1KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIm91dC1vZi1kYXRlIHNSR0IgcHJvZmlsZSB3aXRoIG5vIHNpZ25hdHVyZSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NIVU5LX1dBUk5JTkcpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICByZXR1cm4gMStwbmdfc1JHQl9jaGVja3NbaV0uaXNfYnJva2VuOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyMgICAgICAgIGlmIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTID4gMA0KKyAgICAgICAgICAgIC8qIFRoZSBzaWduYXR1cmUgbWF0Y2hlZCwgYnV0IHRoZSBwcm9maWxlIGhhZCBiZWVuIGNoYW5nZWQgaW4gc29tZQ0KKyAgICAgICAgICAgICAqIHdheS4gIFRoaXMgaXMgYW4gYXBwYXJlbnQgdmlvbGF0aW9uIG9mIHRoZSBJQ0MgdGVybXMgb2YgdXNlIGFuZCwNCisgICAgICAgICAgICAgKiBhbnl3YXksIHByb2JhYmx5IGluZGljYXRlcyBhIGRhdGEgZXJyb3Igb3IgdW5pbmZvcm1lZCBoYWNraW5nLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChwbmdfc1JHQl9jaGVja3NbaV0uaGF2ZV9tZDUpDQorICAgICAgICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICJjb3B5cmlnaHQgdmlvbGF0aW9uOiBlZGl0ZWQgSUNDIHByb2ZpbGUgaWdub3JlZCIpOw0KKyMgICAgICAgIGVuZGlmDQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19pY2Nfc2V0X3NSR0IocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSwgdUxvbmcgYWRsZXIpDQorew0KKyAgIC8qIElzIHRoaXMgcHJvZmlsZSBvbmUgb2YgdGhlIGtub3duIElDQyBzUkdCIHByb2ZpbGVzPyAgSWYgaXQgaXMsIGp1c3Qgc2V0DQorICAgICogdGhlIHNSR0IgaW5mb3JtYXRpb24uDQorICAgICovDQorICAgaWYgKHBuZ19jb21wYXJlX0lDQ19wcm9maWxlX3dpdGhfc1JHQihwbmdfcHRyLCBwcm9maWxlLCBhZGxlcikpDQorICAgICAgKHZvaWQpcG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0IocG5nX3B0ciwgY29sb3JzcGFjZSwNCisgICAgICAgICAoaW50KS8qYWxyZWFkeSBjaGVja2VkKi9wbmdfZ2V0X3VpbnRfMzIocHJvZmlsZSs2NCkpOw0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfc1JHQl9TVVBQT1JURUQgKi8NCisNCitpbnQgLyogUFJJVkFURSAqLw0KK3BuZ19jb2xvcnNwYWNlX3NldF9JQ0MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwNCisgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlLA0KKyAgIGludCBjb2xvcl90eXBlKQ0KK3sNCisgICBpZiAoY29sb3JzcGFjZS0+ZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKQ0KKyAgICAgIHJldHVybiAwOw0KKw0KKyAgIGlmIChwbmdfaWNjX2NoZWNrX2xlbmd0aChwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCkgJiYNCisgICAgICBwbmdfaWNjX2NoZWNrX2hlYWRlcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCwgcHJvZmlsZSwNCisgICAgICAgICBjb2xvcl90eXBlKSAmJg0KKyAgICAgIHBuZ19pY2NfY2hlY2tfdGFnX3RhYmxlKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoLA0KKyAgICAgICAgIHByb2ZpbGUpKQ0KKyAgIHsNCisjICAgICBpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQNCisgICAgICAgICAvKiBJZiBubyBzUkdCIHN1cHBvcnQsIGRvbid0IHRyeSBzdG9yaW5nIHNSR0IgaW5mb3JtYXRpb24gKi8NCisgICAgICAgICBwbmdfaWNjX3NldF9zUkdCKHBuZ19wdHIsIGNvbG9yc3BhY2UsIHByb2ZpbGUsIDApOw0KKyMgICAgIGVuZGlmDQorICAgICAgcmV0dXJuIDE7DQorICAgfQ0KKw0KKyAgIC8qIEZhaWx1cmUgY2FzZSAqLw0KKyAgIHJldHVybiAwOw0KK30NCisjZW5kaWYgLyogaUNDUCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY29sb3JzcGFjZV9zZXRfcmdiX2NvZWZmaWNpZW50cyhwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgLyogU2V0IHRoZSByZ2JfdG9fZ3JheSBjb2VmZmljaWVudHMgZnJvbSB0aGUgY29sb3JzcGFjZS4gKi8NCisgICBpZiAoIXBuZ19wdHItPnJnYl90b19ncmF5X2NvZWZmaWNpZW50c19zZXQgJiYNCisgICAgICAocG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTKSAhPSAwKQ0KKyAgIHsNCisgICAgICAvKiBwbmdfc2V0X2JhY2tncm91bmQgaGFzIG5vdCBiZWVuIGNhbGxlZCwgZ2V0IHRoZSBjb2VmZmljaWVudHMgZnJvbSB0aGUgWQ0KKyAgICAgICAqIHZhbHVlcyBvZiB0aGUgY29sb3JzcGFjZSBjb2xvcmFudHMuDQorICAgICAgICovDQorICAgICAgcG5nX2ZpeGVkX3BvaW50IHIgPSBwbmdfcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLnJlZF9ZOw0KKyAgICAgIHBuZ19maXhlZF9wb2ludCBnID0gcG5nX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9ZOw0KKyAgICAgIHBuZ19maXhlZF9wb2ludCBiID0gcG5nX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ibHVlX1k7DQorICAgICAgcG5nX2ZpeGVkX3BvaW50IHRvdGFsID0gcitnK2I7DQorDQorICAgICAgaWYgKHRvdGFsID4gMCAmJg0KKyAgICAgICAgIHIgPj0gMCAmJiBwbmdfbXVsZGl2KCZyLCByLCAzMjc2OCwgdG90YWwpICYmIHIgPj0gMCAmJiByIDw9IDMyNzY4ICYmDQorICAgICAgICAgZyA+PSAwICYmIHBuZ19tdWxkaXYoJmcsIGcsIDMyNzY4LCB0b3RhbCkgJiYgZyA+PSAwICYmIGcgPD0gMzI3NjggJiYNCisgICAgICAgICBiID49IDAgJiYgcG5nX211bGRpdigmYiwgYiwgMzI3NjgsIHRvdGFsKSAmJiBiID49IDAgJiYgYiA8PSAzMjc2OCAmJg0KKyAgICAgICAgIHIrZytiIDw9IDMyNzY5KQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBXZSBhbGxvdyAwIGNvZWZmaWNpZW50cyBoZXJlLiAgcitnK2IgbWF5IGJlIDMyNzY5IGlmIHR3byBvcg0KKyAgICAgICAgICAqIGFsbCBvZiB0aGUgY29lZmZpY2llbnRzIHdlcmUgcm91bmRlZCB1cC4gIEhhbmRsZSB0aGlzIGJ5DQorICAgICAgICAgICogcmVkdWNpbmcgdGhlICpsYXJnZXN0KiBjb2VmZmljaWVudCBieSAxOyB0aGlzIG1hdGNoZXMgdGhlDQorICAgICAgICAgICogYXBwcm9hY2ggdXNlZCBmb3IgdGhlIGRlZmF1bHQgY29lZmZpY2llbnRzIGluIHBuZ3J0cmFuLmMNCisgICAgICAgICAgKi8NCisgICAgICAgICBpbnQgYWRkID0gMDsNCisNCisgICAgICAgICBpZiAocitnK2IgPiAzMjc2OCkNCisgICAgICAgICAgICBhZGQgPSAtMTsNCisgICAgICAgICBlbHNlIGlmIChyK2crYiA8IDMyNzY4KQ0KKyAgICAgICAgICAgIGFkZCA9IDE7DQorDQorICAgICAgICAgaWYgKGFkZCAhPSAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZyA+PSByICYmIGcgPj0gYikNCisgICAgICAgICAgICAgICBnICs9IGFkZDsNCisgICAgICAgICAgICBlbHNlIGlmIChyID49IGcgJiYgciA+PSBiKQ0KKyAgICAgICAgICAgICAgIHIgKz0gYWRkOw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICBiICs9IGFkZDsNCisgICAgICAgICB9DQorDQorICAgICAgICAgLyogQ2hlY2sgZm9yIGFuIGludGVybmFsIGVycm9yLiAqLw0KKyAgICAgICAgIGlmIChyK2crYiAhPSAzMjc2OCkNCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwNCisgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3IgaGFuZGxpbmcgY0hSTSBjb2VmZmljaWVudHMiKTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X3JlZF9jb2VmZiAgID0gKHBuZ191aW50XzE2KXI7DQorICAgICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfZ3JlZW5fY29lZmYgPSAocG5nX3VpbnRfMTYpZzsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFRoaXMgaXMgYSBwbmdfZXJyb3IgYXQgcHJlc2VudCBldmVuIHRob3VnaCBpdCBjb3VsZCBiZSBpZ25vcmVkIC0NCisgICAgICAgKiBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaXQgaXMgaW1wb3J0YW50IHRoYXQgaWYgaXQgZG9lcywgdGhlDQorICAgICAgICogYnVnIGlzIGZpeGVkLg0KKyAgICAgICAqLw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludGVybmFsIGVycm9yIGhhbmRsaW5nIGNIUk0tPlhZWiIpOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgKi8NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY2hlY2tfSUhEUihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLA0KKyAgIGludCBjb2xvcl90eXBlLCBpbnQgaW50ZXJsYWNlX3R5cGUsIGludCBjb21wcmVzc2lvbl90eXBlLA0KKyAgIGludCBmaWx0ZXJfdHlwZSkNCit7DQorICAgaW50IGVycm9yID0gMDsNCisNCisgICAvKiBDaGVjayBmb3Igd2lkdGggYW5kIGhlaWdodCB2YWxpZCB2YWx1ZXMgKi8NCisgICBpZiAod2lkdGggPT0gMCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGlzIHplcm8gaW4gSUhEUiIpOw0KKyAgICAgIGVycm9yID0gMTsNCisgICB9DQorDQorICAgaWYgKGhlaWdodCA9PSAwKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGlzIHplcm8gaW4gSUhEUiIpOw0KKyAgICAgIGVycm9yID0gMTsNCisgICB9DQorDQorIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQNCisgICBpZiAod2lkdGggPiBwbmdfcHRyLT51c2VyX3dpZHRoX21heCkNCisNCisjICBlbHNlDQorICAgaWYgKHdpZHRoID4gUE5HX1VTRVJfV0lEVEhfTUFYKQ0KKyMgIGVuZGlmDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbWFnZSB3aWR0aCBleGNlZWRzIHVzZXIgbGltaXQgaW4gSUhEUiIpOw0KKyAgICAgIGVycm9yID0gMTsNCisgICB9DQorDQorIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQNCisgICBpZiAoaGVpZ2h0ID4gcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4KQ0KKyMgIGVsc2UNCisgICBpZiAoaGVpZ2h0ID4gUE5HX1VTRVJfSEVJR0hUX01BWCkNCisjICBlbmRpZg0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdXNlciBsaW1pdCBpbiBJSERSIik7DQorICAgICAgZXJyb3IgPSAxOw0KKyAgIH0NCisNCisgICBpZiAod2lkdGggPiBQTkdfVUlOVF8zMV9NQVgpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIHdpZHRoIGluIElIRFIiKTsNCisgICAgICBlcnJvciA9IDE7DQorICAgfQ0KKw0KKyAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMV9NQVgpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIGhlaWdodCBpbiBJSERSIik7DQorICAgICAgZXJyb3IgPSAxOw0KKyAgIH0NCisNCisgICBpZiAod2lkdGggPiAoUE5HX1VJTlRfMzJfTUFYDQorICAgICAgICAgICAgICAgICA+PiAzKSAgICAgIC8qIDgtYnl0ZSBSR0JBIHBpeGVscyAqLw0KKyAgICAgICAgICAgICAgICAgLSA0OCAgICAgICAvKiBiaWdyb3didWYgaGFjayAqLw0KKyAgICAgICAgICAgICAgICAgLSAxICAgICAgICAvKiBmaWx0ZXIgYnl0ZSAqLw0KKyAgICAgICAgICAgICAgICAgLSA3KjggICAgICAvKiByb3VuZGluZyBvZiB3aWR0aCB0byBtdWx0aXBsZSBvZiA4IHBpeGVscyAqLw0KKyAgICAgICAgICAgICAgICAgLSA4KSAgICAgICAvKiBleHRyYSBtYXhfcGl4ZWxfZGVwdGggcGFkICovDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIldpZHRoIGlzIHRvbyBsYXJnZSBmb3IgbGlicG5nIHRvIHByb2Nlc3MgcGl4ZWxzIik7DQorDQorICAgLyogQ2hlY2sgb3RoZXIgdmFsdWVzICovDQorICAgaWYgKGJpdF9kZXB0aCAhPSAxICYmIGJpdF9kZXB0aCAhPSAyICYmIGJpdF9kZXB0aCAhPSA0ICYmDQorICAgICAgIGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGluIElIRFIiKTsNCisgICAgICBlcnJvciA9IDE7DQorICAgfQ0KKw0KKyAgIGlmIChjb2xvcl90eXBlIDwgMCB8fCBjb2xvcl90eXBlID09IDEgfHwNCisgICAgICAgY29sb3JfdHlwZSA9PSA1IHx8IGNvbG9yX3R5cGUgPiA2KQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjb2xvciB0eXBlIGluIElIRFIiKTsNCisgICAgICBlcnJvciA9IDE7DQorICAgfQ0KKw0KKyAgIGlmICgoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgJiYgYml0X2RlcHRoID4gOCkgfHwNCisgICAgICAgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fA0KKyAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSB8fA0KKyAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSAmJiBiaXRfZGVwdGggPCA4KSkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY29sb3IgdHlwZS9iaXQgZGVwdGggY29tYmluYXRpb24gaW4gSUhEUiIpOw0KKyAgICAgIGVycm9yID0gMTsNCisgICB9DQorDQorICAgaWYgKGludGVybGFjZV90eXBlID49IFBOR19JTlRFUkxBQ0VfTEFTVCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gaW50ZXJsYWNlIG1ldGhvZCBpbiBJSERSIik7DQorICAgICAgZXJyb3IgPSAxOw0KKyAgIH0NCisNCisgICBpZiAoY29tcHJlc3Npb25fdHlwZSAhPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gSUhEUiIpOw0KKyAgICAgIGVycm9yID0gMTsNCisgICB9DQorDQorIyAgaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQNCisgICAvKiBBY2NlcHQgZmlsdGVyX21ldGhvZCA2NCAoaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcpIG9ubHkgaWYNCisgICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kDQorICAgICogMi4gTGlicG5nIGRpZCBub3QgcmVhZCBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5DQorICAgICogICAgdXNlZCBpbiBQTkcgZGF0YXN0cmVhbXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zKSBhbmQNCisgICAgKiAzLiBUaGUgYXBwbGljYXRpb24gY2FsbGVkIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIHdpdGggYSBtYXNrIHRoYXQNCisgICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZA0KKyAgICAqIDQuIFRoZSBmaWx0ZXJfbWV0aG9kIGlzIDY0IGFuZA0KKyAgICAqIDUuIFRoZSBjb2xvcl90eXBlIGlzIFJHQiBvciBSR0JBDQorICAgICovDQorICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgJiYNCisgICAgICAgcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCkNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7DQorDQorICAgaWYgKGZpbHRlcl90eXBlICE9IFBOR19GSUxURVJfVFlQRV9CQVNFKQ0KKyAgIHsNCisgICAgICBpZiAoISgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICYmDQorICAgICAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpICYmDQorICAgICAgICAgICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BOR19TSUdOQVRVUkUpID09IDApICYmDQorICAgICAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fA0KKyAgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkpKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBmaWx0ZXIgbWV0aG9kIGluIElIRFIiKTsNCisgICAgICAgICBlcnJvciA9IDE7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7DQorICAgICAgICAgZXJyb3IgPSAxOw0KKyAgICAgIH0NCisgICB9DQorDQorIyAgZWxzZQ0KKyAgIGlmIChmaWx0ZXJfdHlwZSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7DQorICAgICAgZXJyb3IgPSAxOw0KKyAgIH0NCisjICBlbmRpZg0KKw0KKyAgIGlmIChlcnJvciA9PSAxKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBJSERSIGRhdGEiKTsNCit9DQorDQorI2lmIGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19wQ0FMX1NVUFBPUlRFRCkNCisvKiBBU0NJSSB0byBmcCBmdW5jdGlvbnMgKi8NCisvKiBDaGVjayBhbiBBU0NJSSBmb3JtYXRlZCBmbG9hdGluZyBwb2ludCB2YWx1ZSwgc2VlIHRoZSBtb3JlIGRldGFpbGVkDQorICogY29tbWVudHMgaW4gcG5ncHJpdi5oDQorICovDQorLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGludGVybmFsbHkgdG8gcHJlc2VydmUgdGhlIHN0aWNreSBmbGFncyAqLw0KKyNkZWZpbmUgcG5nX2ZwX2FkZChzdGF0ZSwgZmxhZ3MpICgoc3RhdGUpIHw9IChmbGFncykpDQorI2RlZmluZSBwbmdfZnBfc2V0KHN0YXRlLCB2YWx1ZSkgKChzdGF0ZSkgPSAodmFsdWUpIHwgKChzdGF0ZSkgJiBQTkdfRlBfU1RJQ0tZKSkNCisNCitpbnQgLyogUFJJVkFURSAqLw0KK3BuZ19jaGVja19mcF9udW1iZXIocG5nX2NvbnN0X2NoYXJwIHN0cmluZywgcG5nX3NpemVfdCBzaXplLCBpbnQgKnN0YXRlcCwNCisgICBwbmdfc2l6ZV90cCB3aGVyZWFtaSkNCit7DQorICAgaW50IHN0YXRlID0gKnN0YXRlcDsNCisgICBwbmdfc2l6ZV90IGkgPSAqd2hlcmVhbWk7DQorDQorICAgd2hpbGUgKGkgPCBzaXplKQ0KKyAgIHsNCisgICAgICBpbnQgdHlwZTsNCisgICAgICAvKiBGaXJzdCBmaW5kIHRoZSB0eXBlIG9mIHRoZSBuZXh0IGNoYXJhY3RlciAqLw0KKyAgICAgIHN3aXRjaCAoc3RyaW5nW2ldKQ0KKyAgICAgIHsNCisgICAgICBjYXNlIDQzOiAgdHlwZSA9IFBOR19GUF9TQVdfU0lHTjsgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA0NTogIHR5cGUgPSBQTkdfRlBfU0FXX1NJR04gKyBQTkdfRlBfTkVHQVRJVkU7IGJyZWFrOw0KKyAgICAgIGNhc2UgNDY6ICB0eXBlID0gUE5HX0ZQX1NBV19ET1Q7ICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDQ4OiAgdHlwZSA9IFBOR19GUF9TQVdfRElHSVQ7ICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA0OTogY2FzZSA1MDogY2FzZSA1MTogY2FzZSA1MjoNCisgICAgICBjYXNlIDUzOiBjYXNlIDU0OiBjYXNlIDU1OiBjYXNlIDU2Og0KKyAgICAgIGNhc2UgNTc6ICB0eXBlID0gUE5HX0ZQX1NBV19ESUdJVCArIFBOR19GUF9OT05aRVJPOyBicmVhazsNCisgICAgICBjYXNlIDY5Og0KKyAgICAgIGNhc2UgMTAxOiB0eXBlID0gUE5HX0ZQX1NBV19FOyAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0OiAgZ290byBQTkdfRlBfRW5kOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBOb3cgZGVhbCB3aXRoIHRoaXMgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQNCisgICAgICAgKiBzdGF0ZSwgdGhlIHR5cGUgaXMgYXJyYW5nZWQgdG8gbm90IG92ZXJsYXAgdGhlDQorICAgICAgICogYml0cyBvZiB0aGUgUE5HX0ZQX1NUQVRFLg0KKyAgICAgICAqLw0KKyAgICAgIHN3aXRjaCAoKHN0YXRlICYgUE5HX0ZQX1NUQVRFKSArICh0eXBlICYgUE5HX0ZQX1NBV19BTlkpKQ0KKyAgICAgIHsNCisgICAgICBjYXNlIFBOR19GUF9JTlRFR0VSICsgUE5HX0ZQX1NBV19TSUdOOg0KKyAgICAgICAgIGlmIChzdGF0ZSAmIFBOR19GUF9TQVdfQU5ZKQ0KKyAgICAgICAgICAgIGdvdG8gUE5HX0ZQX0VuZDsgLyogbm90IGEgcGFydCBvZiB0aGUgbnVtYmVyICovDQorDQorICAgICAgICAgcG5nX2ZwX2FkZChzdGF0ZSwgdHlwZSk7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfRlBfSU5URUdFUiArIFBOR19GUF9TQVdfRE9UOg0KKyAgICAgICAgIC8qIE9rIGFzIHRyYWlsZXIsIG9rIGFzIGxlYWQgb2YgZnJhY3Rpb24uICovDQorICAgICAgICAgaWYgKHN0YXRlICYgUE5HX0ZQX1NBV19ET1QpIC8qIHR3byBkb3RzICovDQorICAgICAgICAgICAgZ290byBQTkdfRlBfRW5kOw0KKw0KKyAgICAgICAgIGVsc2UgaWYgKHN0YXRlICYgUE5HX0ZQX1NBV19ESUdJVCkgLyogdHJhaWxpbmcgZG90PyAqLw0KKyAgICAgICAgICAgIHBuZ19mcF9hZGQoc3RhdGUsIHR5cGUpOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwbmdfZnBfc2V0KHN0YXRlLCBQTkdfRlBfRlJBQ1RJT04gfCB0eXBlKTsNCisNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19GUF9JTlRFR0VSICsgUE5HX0ZQX1NBV19ESUdJVDoNCisgICAgICAgICBpZiAoc3RhdGUgJiBQTkdfRlBfU0FXX0RPVCkgLyogZGVsYXllZCBmcmFjdGlvbiAqLw0KKyAgICAgICAgICAgIHBuZ19mcF9zZXQoc3RhdGUsIFBOR19GUF9GUkFDVElPTiB8IFBOR19GUF9TQVdfRE9UKTsNCisNCisgICAgICAgICBwbmdfZnBfYWRkKHN0YXRlLCB0eXBlIHwgUE5HX0ZQX1dBU19WQUxJRCk7DQorDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfRlBfSU5URUdFUiArIFBOR19GUF9TQVdfRToNCisgICAgICAgICBpZiAoKHN0YXRlICYgUE5HX0ZQX1NBV19ESUdJVCkgPT0gMCkNCisgICAgICAgICAgICBnb3RvIFBOR19GUF9FbmQ7DQorDQorICAgICAgICAgcG5nX2ZwX3NldChzdGF0ZSwgUE5HX0ZQX0VYUE9ORU5UKTsNCisNCisgICAgICAgICBicmVhazsNCisNCisgICAvKiBjYXNlIFBOR19GUF9GUkFDVElPTiArIFBOR19GUF9TQVdfU0lHTjoNCisgICAgICAgICBnb3RvIFBOR19GUF9FbmQ7ICoqIG5vIHNpZ24gaW4gZnJhY3Rpb24gKi8NCisNCisgICAvKiBjYXNlIFBOR19GUF9GUkFDVElPTiArIFBOR19GUF9TQVdfRE9UOg0KKyAgICAgICAgIGdvdG8gUE5HX0ZQX0VuZDsgKiogQmVjYXVzZSBTQVdfRE9UIGlzIGFsd2F5cyBzZXQgKi8NCisNCisgICAgICBjYXNlIFBOR19GUF9GUkFDVElPTiArIFBOR19GUF9TQVdfRElHSVQ6DQorICAgICAgICAgcG5nX2ZwX2FkZChzdGF0ZSwgdHlwZSB8IFBOR19GUF9XQVNfVkFMSUQpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0ZQX0ZSQUNUSU9OICsgUE5HX0ZQX1NBV19FOg0KKyAgICAgICAgIC8qIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIHRoZSB0cmFpbGluZyAnLicgb24gYW4NCisgICAgICAgICAgKiBpbnRlZ2VyIGlzIGhhbmRsZWQgYWJvdmUgLSBzbyB3ZSBjYW4gb25seSBnZXQgaGVyZQ0KKyAgICAgICAgICAqIHdpdGggdGhlIHNlcXVlbmNlICIuRSIgKHdpdGggbm8gcHJlY2VkaW5nIGRpZ2l0cykuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKChzdGF0ZSAmIFBOR19GUF9TQVdfRElHSVQpID09IDApDQorICAgICAgICAgICAgZ290byBQTkdfRlBfRW5kOw0KKw0KKyAgICAgICAgIHBuZ19mcF9zZXQoc3RhdGUsIFBOR19GUF9FWFBPTkVOVCk7DQorDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfRlBfRVhQT05FTlQgKyBQTkdfRlBfU0FXX1NJR046DQorICAgICAgICAgaWYgKHN0YXRlICYgUE5HX0ZQX1NBV19BTlkpDQorICAgICAgICAgICAgZ290byBQTkdfRlBfRW5kOyAvKiBub3QgYSBwYXJ0IG9mIHRoZSBudW1iZXIgKi8NCisNCisgICAgICAgICBwbmdfZnBfYWRkKHN0YXRlLCBQTkdfRlBfU0FXX1NJR04pOw0KKw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgIC8qIGNhc2UgUE5HX0ZQX0VYUE9ORU5UICsgUE5HX0ZQX1NBV19ET1Q6DQorICAgICAgICAgZ290byBQTkdfRlBfRW5kOyAqLw0KKw0KKyAgICAgIGNhc2UgUE5HX0ZQX0VYUE9ORU5UICsgUE5HX0ZQX1NBV19ESUdJVDoNCisgICAgICAgICBwbmdfZnBfYWRkKHN0YXRlLCBQTkdfRlBfU0FXX0RJR0lUIHwgUE5HX0ZQX1dBU19WQUxJRCk7DQorDQorICAgICAgICAgYnJlYWs7DQorDQorICAgLyogY2FzZSBQTkdfRlBfRVhQT05FWFQgKyBQTkdfRlBfU0FXX0U6DQorICAgICAgICAgZ290byBQTkdfRlBfRW5kOyAqLw0KKw0KKyAgICAgIGRlZmF1bHQ6IGdvdG8gUE5HX0ZQX0VuZDsgLyogSS5lLiBicmVhayAyICovDQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFRoZSBjaGFyYWN0ZXIgc2VlbXMgb2ssIGNvbnRpbnVlLiAqLw0KKyAgICAgICsraTsNCisgICB9DQorDQorUE5HX0ZQX0VuZDoNCisgICAvKiBIZXJlIGF0IHRoZSBlbmQsIHVwZGF0ZSB0aGUgc3RhdGUgYW5kIHJldHVybiB0aGUgY29ycmVjdA0KKyAgICAqIHJldHVybiBjb2RlLg0KKyAgICAqLw0KKyAgICpzdGF0ZXAgPSBzdGF0ZTsNCisgICAqd2hlcmVhbWkgPSBpOw0KKw0KKyAgIHJldHVybiAoc3RhdGUgJiBQTkdfRlBfU0FXX0RJR0lUKSAhPSAwOw0KK30NCisNCisNCisvKiBUaGUgc2FtZSBidXQgZm9yIGEgY29tcGxldGUgc3RyaW5nLiAqLw0KK2ludA0KK3BuZ19jaGVja19mcF9zdHJpbmcocG5nX2NvbnN0X2NoYXJwIHN0cmluZywgcG5nX3NpemVfdCBzaXplKQ0KK3sNCisgICBpbnQgICAgICAgIHN0YXRlPTA7DQorICAgcG5nX3NpemVfdCBjaGFyX2luZGV4PTA7DQorDQorICAgaWYgKHBuZ19jaGVja19mcF9udW1iZXIoc3RyaW5nLCBzaXplLCAmc3RhdGUsICZjaGFyX2luZGV4KSAmJg0KKyAgICAgIChjaGFyX2luZGV4ID09IHNpemUgfHwgc3RyaW5nW2NoYXJfaW5kZXhdID09IDApKQ0KKyAgICAgIHJldHVybiBzdGF0ZSAvKiBtdXN0IGJlIG5vbi16ZXJvIC0gc2VlIGFib3ZlICovOw0KKw0KKyAgIHJldHVybiAwOyAvKiBpLmUuIGZhaWwgKi8NCit9DQorI2VuZGlmIC8qIHBDQUwgb3Igc0NBTCAqLw0KKw0KKyNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQNCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQorLyogVXRpbGl0eSB1c2VkIGJlbG93IC0gYSBzaW1wbGUgYWNjdXJhdGUgcG93ZXIgb2YgdGVuIGZyb20gYW4gaW50ZWdyYWwNCisgKiBleHBvbmVudC4NCisgKi8NCitzdGF0aWMgZG91YmxlDQorcG5nX3BvdzEwKGludCBwb3dlcikNCit7DQorICAgaW50IHJlY2lwID0gMDsNCisgICBkb3VibGUgZCA9IDE7DQorDQorICAgLyogSGFuZGxlIG5lZ2F0aXZlIGV4cG9uZW50IHdpdGggYSByZWNpcHJvY2FsIGF0IHRoZSBlbmQgYmVjYXVzZQ0KKyAgICAqIDEwIGlzIGV4YWN0IHdoZXJlYXMgLjEgaXMgaW5leGFjdCBpbiBiYXNlIDINCisgICAgKi8NCisgICBpZiAocG93ZXIgPCAwKQ0KKyAgIHsNCisgICAgICBpZiAocG93ZXIgPCBEQkxfTUlOXzEwX0VYUCkgcmV0dXJuIDA7DQorICAgICAgcmVjaXAgPSAxLCBwb3dlciA9IC1wb3dlcjsNCisgICB9DQorDQorICAgaWYgKHBvd2VyID4gMCkNCisgICB7DQorICAgICAgLyogRGVjb21wb3NlIHBvd2VyIGJpdHdpc2UuICovDQorICAgICAgZG91YmxlIG11bHQgPSAxMDsNCisgICAgICBkbw0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG93ZXIgJiAxKSBkICo9IG11bHQ7DQorICAgICAgICAgbXVsdCAqPSBtdWx0Ow0KKyAgICAgICAgIHBvd2VyID4+PSAxOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocG93ZXIgPiAwKTsNCisNCisgICAgICBpZiAocmVjaXApIGQgPSAxL2Q7DQorICAgfQ0KKyAgIC8qIGVsc2UgcG93ZXIgaXMgMCBhbmQgZCBpcyAxICovDQorDQorICAgcmV0dXJuIGQ7DQorfQ0KKw0KKy8qIEZ1bmN0aW9uIHRvIGZvcm1hdCBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGluIEFTQ0lJIHdpdGggYSBnaXZlbg0KKyAqIHByZWNpc2lvbi4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfYXNjaWlfZnJvbV9mcChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NoYXJwIGFzY2lpLCBwbmdfc2l6ZV90IHNpemUsDQorICAgIGRvdWJsZSBmcCwgdW5zaWduZWQgaW50IHByZWNpc2lvbikNCit7DQorICAgLyogV2UgdXNlIHN0YW5kYXJkIGZ1bmN0aW9ucyBmcm9tIG1hdGguaCwgYnV0IG5vdCBwcmludGYgYmVjYXVzZQ0KKyAgICAqIHRoYXQgd291bGQgcmVxdWlyZSBzdGRpby4gIFRoZSBjYWxsZXIgbXVzdCBzdXBwbHkgYSBidWZmZXIgb2YNCisgICAgKiBzdWZmaWNpZW50IHNpemUgb3Igd2Ugd2lsbCBwbmdfZXJyb3IuICBUaGUgdGVzdHMgb24gc2l6ZSBhbmQNCisgICAgKiB0aGUgc3BhY2UgaW4gYXNjaWlbXSBjb25zdW1lZCBhcmUgaW5kaWNhdGVkIGJlbG93Lg0KKyAgICAqLw0KKyAgIGlmIChwcmVjaXNpb24gPCAxKQ0KKyAgICAgIHByZWNpc2lvbiA9IERCTF9ESUc7DQorDQorICAgLyogRW5mb3JjZSB0aGUgbGltaXQgb2YgdGhlIGltcGxlbWVudGF0aW9uIHByZWNpc2lvbiB0b28uICovDQorICAgaWYgKHByZWNpc2lvbiA+IERCTF9ESUcrMSkNCisgICAgICBwcmVjaXNpb24gPSBEQkxfRElHKzE7DQorDQorICAgLyogQmFzaWMgc2FuaXR5IGNoZWNrcyAqLw0KKyAgIGlmIChzaXplID49IHByZWNpc2lvbis1KSAvKiBTZWUgdGhlIHJlcXVpcmVtZW50cyBiZWxvdy4gKi8NCisgICB7DQorICAgICAgaWYgKGZwIDwgMCkNCisgICAgICB7DQorICAgICAgICAgZnAgPSAtZnA7DQorICAgICAgICAgKmFzY2lpKysgPSA0NTsgLyogJy0nICBQTFVTIDEgVE9UQUwgMSAqLw0KKyAgICAgICAgIC0tc2l6ZTsNCisgICAgICB9DQorDQorICAgICAgaWYgKGZwID49IERCTF9NSU4gJiYgZnAgPD0gREJMX01BWCkNCisgICAgICB7DQorICAgICAgICAgaW50IGV4cF9iMTA7ICAgICAgIC8qIEEgYmFzZSAxMCBleHBvbmVudCAqLw0KKyAgICAgICAgIGRvdWJsZSBiYXNlOyAgIC8qIDEwXmV4cF9iMTAgKi8NCisNCisgICAgICAgICAvKiBGaXJzdCBleHRyYWN0IGEgYmFzZSAxMCBleHBvbmVudCBvZiB0aGUgbnVtYmVyLA0KKyAgICAgICAgICAqIHRoZSBjYWxjdWxhdGlvbiBiZWxvdyByb3VuZHMgZG93biB3aGVuIGNvbnZlcnRpbmcNCisgICAgICAgICAgKiBmcm9tIGJhc2UgMiB0byBiYXNlIDEwIChtdWx0aXBseSBieSBsb2cxMCgyKSAtDQorICAgICAgICAgICogMC4zMDEwLCBidXQgNzcvMjU2IGlzIDAuMzAwOCwgc28gZXhwX2IxMCBuZWVkcyB0bw0KKyAgICAgICAgICAqIGJlIGluY3JlYXNlZC4gIE5vdGUgdGhhdCB0aGUgYXJpdGhtZXRpYyBzaGlmdA0KKyAgICAgICAgICAqIHBlcmZvcm1zIGEgZmxvb3IoKSB1bmxpa2UgQyBhcml0aG1ldGljIC0gdXNpbmcgYQ0KKyAgICAgICAgICAqIEMgbXVsdGlwbHkgd291bGQgYnJlYWsgdGhlIGZvbGxvd2luZyBmb3IgbmVnYXRpdmUNCisgICAgICAgICAgKiBleHBvbmVudHMuDQorICAgICAgICAgICovDQorICAgICAgICAgKHZvaWQpZnJleHAoZnAsICZleHBfYjEwKTsgLyogZXhwb25lbnQgdG8gYmFzZSAyICovDQorDQorICAgICAgICAgZXhwX2IxMCA9IChleHBfYjEwICogNzcpID4+IDg7IC8qIDw9IGV4cG9uZW50IHRvIGJhc2UgMTAgKi8NCisNCisgICAgICAgICAvKiBBdm9pZCB1bmRlcmZsb3cgaGVyZS4gKi8NCisgICAgICAgICBiYXNlID0gcG5nX3BvdzEwKGV4cF9iMTApOyAvKiBNYXkgdW5kZXJmbG93ICovDQorDQorICAgICAgICAgd2hpbGUgKGJhc2UgPCBEQkxfTUlOIHx8IGJhc2UgPCBmcCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogQW5kIHRoaXMgbWF5IG92ZXJmbG93LiAqLw0KKyAgICAgICAgICAgIGRvdWJsZSB0ZXN0ID0gcG5nX3BvdzEwKGV4cF9iMTArMSk7DQorDQorICAgICAgICAgICAgaWYgKHRlc3QgPD0gREJMX01BWCkNCisgICAgICAgICAgICAgICArK2V4cF9iMTAsIGJhc2UgPSB0ZXN0Ow0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgLyogTm9ybWFsaXplIGZwIGFuZCBjb3JyZWN0IGV4cF9iMTAsIGFmdGVyIHRoaXMgZnAgaXMgaW4gdGhlDQorICAgICAgICAgICogcmFuZ2UgWy4xLDEpIGFuZCBleHBfYjEwIGlzIGJvdGggdGhlIGV4cG9uZW50IGFuZCB0aGUgZGlnaXQNCisgICAgICAgICAgKiAqYmVmb3JlKiB3aGljaCB0aGUgZGVjaW1hbCBwb2ludCBzaG91bGQgYmUgaW5zZXJ0ZWQNCisgICAgICAgICAgKiAoc3RhcnRpbmcgd2l0aCAwIGZvciB0aGUgZmlyc3QgZGlnaXQpLiAgTm90ZSB0aGF0IHRoaXMNCisgICAgICAgICAgKiB3b3JrcyBldmVuIGlmIDEwXmV4cF9iMTAgaXMgb3V0IG9mIHJhbmdlIGJlY2F1c2Ugb2YgdGhlDQorICAgICAgICAgICogdGVzdCBvbiBEQkxfTUFYIGFib3ZlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGZwIC89IGJhc2U7DQorICAgICAgICAgd2hpbGUgKGZwID49IDEpIGZwIC89IDEwLCArK2V4cF9iMTA7DQorDQorICAgICAgICAgLyogQmVjYXVzZSBvZiB0aGUgY29kZSBhYm92ZSBmcCBtYXksIGF0IHRoaXMgcG9pbnQsIGJlDQorICAgICAgICAgICogbGVzcyB0aGFuIC4xLCB0aGlzIGlzIG9rIGJlY2F1c2UgdGhlIGNvZGUgYmVsb3cgY2FuDQorICAgICAgICAgICogaGFuZGxlIHRoZSBsZWFkaW5nIHplcm9zIHRoaXMgZ2VuZXJhdGVzLCBzbyBubyBhdHRlbXB0DQorICAgICAgICAgICogaXMgbWFkZSB0byBjb3JyZWN0IHRoYXQgaGVyZS4NCisgICAgICAgICAgKi8NCisNCisgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGN6ZXJvLCBjbGVhZCwgY2RpZ2l0czsNCisgICAgICAgICAgICBjaGFyIGV4cG9uZW50WzEwXTsNCisNCisgICAgICAgICAgICAvKiBBbGxvdyB1cCB0byB0d28gbGVhZGluZyB6ZXJvcyAtIHRoaXMgd2lsbCBub3QgbGVuZ3RoZW4NCisgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIGNvbXBhcmVkIHRvIHVzaW5nIEUtbi4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAoZXhwX2IxMCA8IDAgJiYgZXhwX2IxMCA+IC0zKSAvKiBQTFVTIDMgVE9UQUwgNCAqLw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBjemVybyA9IC1leHBfYjEwOyAvKiBQTFVTIDIgZGlnaXRzOiBUT1RBTCAzICovDQorICAgICAgICAgICAgICAgZXhwX2IxMCA9IDA7ICAgICAgLyogRG90IGFkZGVkIGJlbG93IGJlZm9yZSBmaXJzdCBvdXRwdXQuICovDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICBjemVybyA9IDA7ICAgIC8qIE5vIHplcm9zIHRvIGFkZCAqLw0KKw0KKyAgICAgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBkaWdpdCBsaXN0LCBzdHJpcHBpbmcgdHJhaWxpbmcgemVyb3MgYW5kDQorICAgICAgICAgICAgICogaW5zZXJ0aW5nIGEgJy4nIGJlZm9yZSBhIGRpZ2l0IGlmIHRoZSBleHBvbmVudCBpcyAwLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGNsZWFkID0gY3plcm87IC8qIENvdW50IG9mIGxlYWRpbmcgemVyb3MgKi8NCisgICAgICAgICAgICBjZGlnaXRzID0gMDsgICAvKiBDb3VudCBvZiBkaWdpdHMgaW4gbGlzdC4gKi8NCisNCisgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBkb3VibGUgZDsNCisNCisgICAgICAgICAgICAgICBmcCAqPSAxMDsNCisgICAgICAgICAgICAgICAvKiBVc2UgbW9kZiBoZXJlLCBub3QgZmxvb3IgYW5kIHN1YnRyYWN0LCBzbyB0aGF0DQorICAgICAgICAgICAgICAgICogdGhlIHNlcGFyYXRpb24gaXMgZG9uZSBpbiBvbmUgc3RlcC4gIEF0IHRoZSBlbmQNCisgICAgICAgICAgICAgICAgKiBvZiB0aGUgbG9vcCBkb24ndCBicmVhayB0aGUgbnVtYmVyIGludG8gcGFydHMgc28NCisgICAgICAgICAgICAgICAgKiB0aGF0IHRoZSBmaW5hbCBkaWdpdCBpcyByb3VuZGVkLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGlmIChjZGlnaXRzK2N6ZXJvLWNsZWFkKzEgPCAoaW50KXByZWNpc2lvbikNCisgICAgICAgICAgICAgICAgICBmcCA9IG1vZGYoZnAsICZkKTsNCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGQgPSBmbG9vcihmcCArIC41KTsNCisNCisgICAgICAgICAgICAgICAgICBpZiAoZCA+IDkpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kaW5nIHVwIHRvIDEwLCBoYW5kbGUgdGhhdCBoZXJlLiAqLw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChjemVybyA+IDApDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0tY3plcm8sIGQgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZGlnaXRzID09IDApIC0tY2xlYWQ7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNkaWdpdHMgPiAwICYmIGQgPiA5KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAqLS1hc2NpaTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwX2IxMCAhPSAoLTEpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZXhwX2IxMDsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSA0NikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAqLS1hc2NpaSwgKytzaXplOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgZXhwX2IxMCB0byAnMScsIHNvIHRoYXQgdGhlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGVjaW1hbCBwb2ludCBoYXBwZW5zIGFmdGVyIHRoZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByZXZpb3VzIGRpZ2l0Lg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cF9iMTAgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWNkaWdpdHM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGNoIC0gNDc7ICAvKiBJLmUuIDErKGNoLTQ4KSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWQgd2UgcmVhY2ggdGhlIGJlZ2lubmluZz8gSWYgc28gYWRqdXN0IHRoZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4cG9uZW50IGJ1dCB0YWtlIGludG8gYWNjb3VudCB0aGUgbGVhZGluZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlY2ltYWwgcG9pbnQuDQorICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPiA5KSAgLyogY2RpZ2l0cyA9PSAwICovDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBfYjEwID09ICgtMSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlYWRpbmcgZGVjaW1hbCBwb2ludCAocGx1cyB6ZXJvcz8pLCBpZg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIGxvc2UgdGhlIGRlY2ltYWwgcG9pbnQgaGVyZSBpdCBtdXN0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgcmVlbnRlcmVkIGJlbG93Lg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICotLWFzY2lpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSA0NikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3NpemUsIGV4cF9iMTAgPSAxOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsc2UgbG9zdCBhIGxlYWRpbmcgemVybywgc28gJ2V4cF9iMTAnIGlzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RpbGwgb2sgYXQgKC0xKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytleHBfYjEwOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGFsbCBjYXNlcyB3ZSBvdXRwdXQgYSAnMScgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBmcCA9IDA7IC8qIEd1YXJhbnRlZXMgdGVybWluYXRpb24gYmVsb3cuICovDQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGlmIChkID09IDApDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICsrY3plcm87DQorICAgICAgICAgICAgICAgICAgaWYgKGNkaWdpdHMgPT0gMCkgKytjbGVhZDsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRlZCBlbWJlZGRlZCB6ZXJvcyBpbiB0aGUgZGlnaXQgY291bnQuICovDQorICAgICAgICAgICAgICAgICAgY2RpZ2l0cyArPSBjemVybyAtIGNsZWFkOw0KKyAgICAgICAgICAgICAgICAgIGNsZWFkID0gMDsNCisNCisgICAgICAgICAgICAgICAgICB3aGlsZSAoY3plcm8gPiAwKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAvKiBleHBfYjEwID09ICgtMSkgbWVhbnMgd2UganVzdCBvdXRwdXQgdGhlIGRlY2ltYWwNCisgICAgICAgICAgICAgICAgICAgICAgKiBwbGFjZSAtIGFmdGVyIHRoZSBEUCBkb24ndCBhZGp1c3QgJ2V4cF9iMTAnIGFueQ0KKyAgICAgICAgICAgICAgICAgICAgICAqIG1vcmUhDQorICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cF9iMTAgIT0gKC0xKSkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cF9iMTAgPT0gMCkgKmFzY2lpKysgPSA0NiwgLS1zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBMVVMgMTogVE9UQUwgNCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZXhwX2IxMDsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgKmFzY2lpKysgPSA0OCwgLS1jemVybzsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgaWYgKGV4cF9iMTAgIT0gKC0xKSkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cF9iMTAgPT0gMCkgKmFzY2lpKysgPSA0NiwgLS1zaXplOyAvKiBjb3VudGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSAqLw0KKyAgICAgICAgICAgICAgICAgICAgIC0tZXhwX2IxMDsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgKmFzY2lpKysgPSAoY2hhcikoNDggKyAoaW50KWQpLCArK2NkaWdpdHM7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoY2RpZ2l0cytjemVyby1jbGVhZCA8IChpbnQpcHJlY2lzaW9uICYmIGZwID4gREJMX01JTik7DQorDQorICAgICAgICAgICAgLyogVGhlIHRvdGFsIG91dHB1dCBjb3VudCAobWF4KSBpcyBub3cgNCtwcmVjaXNpb24gKi8NCisNCisgICAgICAgICAgICAvKiBDaGVjayBmb3IgYW4gZXhwb25lbnQsIGlmIHdlIGRvbid0IG5lZWQgb25lIHdlIGFyZQ0KKyAgICAgICAgICAgICAqIGRvbmUgYW5kIGp1c3QgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHN0cmluZy4gIEF0DQorICAgICAgICAgICAgICogdGhpcyBwb2ludCBleHBfYjEwPT0oLTEpIGlzIGVmZmVjdGl2ZWx5IGlmIGZsYWcgLSBpdCBnb3QNCisgICAgICAgICAgICAgKiB0byAnLTEnIGJlY2F1c2Ugb2YgdGhlIGRlY3JlbWVudCBhZnRlciBvdXRwdXRpbmcNCisgICAgICAgICAgICAgKiB0aGUgZGVjaW1hbCBwb2ludCBhYm92ZSAodGhlIGV4cG9uZW50IHJlcXVpcmVkIGlzDQorICAgICAgICAgICAgICogKm5vdCogLTEhKQ0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChleHBfYjEwID49ICgtMSkgJiYgZXhwX2IxMCA8PSAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIG9ubHkgaGFwcGVucyBpZiB3ZSBkaWRuJ3Qgb3V0cHV0IHRoZQ0KKyAgICAgICAgICAgICAgICAqIGxlYWRpbmcgemVyb3MgYWJvdmUgZm9yIG5lZ2F0aXZlIGV4cG9uZW50LCBzbyB0aGlzDQorICAgICAgICAgICAgICAgICogZG9lc3QgYWRkIHRvIHRoZSBkaWdpdCByZXF1aXJlbWVudC4gIE5vdGUgdGhhdCB0aGUNCisgICAgICAgICAgICAgICAgKiB0d28gemVyb3MgaGVyZSBjYW4gb25seSBiZSBvdXRwdXQgaWYgdGhlIHR3byBsZWFkaW5nDQorICAgICAgICAgICAgICAgICogemVyb3Mgd2VyZSAqbm90KiBvdXRwdXQsIHNvIHRoaXMgZG9lc24ndCBpbmNyZWFzZQ0KKyAgICAgICAgICAgICAgICAqIHRoZSBvdXRwdXQgY291bnQuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgd2hpbGUgKC0tZXhwX2IxMCA+PSAwKSAqYXNjaWkrKyA9IDQ4Ow0KKw0KKyAgICAgICAgICAgICAgICphc2NpaSA9IDA7DQorDQorICAgICAgICAgICAgICAgLyogVG90YWwgYnVmZmVyIHJlcXVpcmVtZW50IChpbmNsdWRpbmcgdGhlICdcMCcpIGlzDQorICAgICAgICAgICAgICAgICogNStwcmVjaXNpb24gLSBzZWUgY2hlY2sgYXQgdGhlIHN0YXJ0Lg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLyogSGVyZSBpZiBhbiBleHBvbmVudCBpcyByZXF1aXJlZCwgYWRqdXN0IHNpemUgZm9yDQorICAgICAgICAgICAgICogdGhlIGRpZ2l0cyB3ZSBvdXRwdXQgYnV0IGRpZCBub3QgY291bnQuICBUaGUgdG90YWwNCisgICAgICAgICAgICAgKiBkaWdpdCBvdXRwdXQgaGVyZSBzbyBmYXIgaXMgYXQgbW9zdCAxK3ByZWNpc2lvbiAtIG5vDQorICAgICAgICAgICAgICogZGVjaW1hbCBwb2ludCBhbmQgbm8gbGVhZGluZyBvciB0cmFpbGluZyB6ZXJvcyBoYXZlDQorICAgICAgICAgICAgICogYmVlbiBvdXRwdXQuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgc2l6ZSAtPSBjZGlnaXRzOw0KKw0KKyAgICAgICAgICAgICphc2NpaSsrID0gNjksIC0tc2l6ZTsgICAgLyogJ0UnOiBQTFVTIDEgVE9UQUwgMitwcmVjaXNpb24gKi8NCisNCisgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIHVzZSBvZiBhbiB1bnNpZ25lZCB0ZW1wb3JhcnkgYXZvaWRzIGFtYmlndWl0aWVzIGluDQorICAgICAgICAgICAgICogdGhlIHNpZ25lZCBhcml0aG1ldGljIG9uIGV4cF9iMTAgYW5kIHBlcm1pdHMgR0NDIGF0IGxlYXN0IHRvIGRvDQorICAgICAgICAgICAgICogYmV0dGVyIG9wdGltaXphdGlvbi4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVleHBfYjEwOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChleHBfYjEwIDwgMCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgKmFzY2lpKysgPSA0NSwgLS1zaXplOyAvKiAnLSc6IFBMVVMgMSBUT1RBTCAzK3ByZWNpc2lvbiAqLw0KKyAgICAgICAgICAgICAgICAgIHVleHBfYjEwID0gLWV4cF9iMTA7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICB1ZXhwX2IxMCA9IGV4cF9iMTA7DQorDQorICAgICAgICAgICAgICAgY2RpZ2l0cyA9IDA7DQorDQorICAgICAgICAgICAgICAgd2hpbGUgKHVleHBfYjEwID4gMCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgZXhwb25lbnRbY2RpZ2l0cysrXSA9IChjaGFyKSg0OCArIHVleHBfYjEwICUgMTApOw0KKyAgICAgICAgICAgICAgICAgIHVleHBfYjEwIC89IDEwOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLyogTmVlZCBhbm90aGVyIHNpemUgY2hlY2sgaGVyZSBmb3IgdGhlIGV4cG9uZW50IGRpZ2l0cywgc28NCisgICAgICAgICAgICAgKiB0aGlzIG5lZWQgbm90IGJlIGNvbnNpZGVyZWQgYWJvdmUuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKChpbnQpc2l6ZSA+IGNkaWdpdHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHdoaWxlIChjZGlnaXRzID4gMCkgKmFzY2lpKysgPSBleHBvbmVudFstLWNkaWdpdHNdOw0KKw0KKyAgICAgICAgICAgICAgICphc2NpaSA9IDA7DQorDQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKCEoZnAgPj0gREJMX01JTikpDQorICAgICAgew0KKyAgICAgICAgICphc2NpaSsrID0gNDg7IC8qICcwJyAqLw0KKyAgICAgICAgICphc2NpaSA9IDA7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgICphc2NpaSsrID0gMTA1OyAvKiAnaScgKi8NCisgICAgICAgICAqYXNjaWkrKyA9IDExMDsgLyogJ24nICovDQorICAgICAgICAgKmFzY2lpKysgPSAxMDI7IC8qICdmJyAqLw0KKyAgICAgICAgICphc2NpaSA9IDA7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgLyogSGVyZSBvbiBidWZmZXIgdG9vIHNtYWxsLiAqLw0KKyAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQVNDSUkgY29udmVyc2lvbiBidWZmZXIgdG9vIHNtYWxsIik7DQorfQ0KKw0KKyMgIGVuZGlmIC8qIEZMT0FUSU5HX1BPSU5UICovDQorDQorIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KKy8qIEZ1bmN0aW9uIHRvIGZvcm1hdCBhIGZpeGVkIHBvaW50IHZhbHVlIGluIEFTQ0lJLg0KKyAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19hc2NpaV9mcm9tX2ZpeGVkKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY2hhcnAgYXNjaWksDQorICAgIHBuZ19zaXplX3Qgc2l6ZSwgcG5nX2ZpeGVkX3BvaW50IGZwKQ0KK3sNCisgICAvKiBSZXF1aXJlIHNwYWNlIGZvciAxMCBkZWNpbWFsIGRpZ2l0cywgYSBkZWNpbWFsIHBvaW50LCBhIG1pbnVzIHNpZ24gYW5kIGENCisgICAgKiB0cmFpbGluZyBcMCwgMTMgY2hhcmFjdGVyczoNCisgICAgKi8NCisgICBpZiAoc2l6ZSA+IDEyKQ0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiBudW07DQorDQorICAgICAgLyogQXZvaWQgb3ZlcmZsb3cgaGVyZSBvbiB0aGUgbWluaW11bSBpbnRlZ2VyLiAqLw0KKyAgICAgIGlmIChmcCA8IDApDQorICAgICAgICAgKmFzY2lpKysgPSA0NSwgLS1zaXplLCBudW0gPSAtZnA7DQorICAgICAgZWxzZQ0KKyAgICAgICAgIG51bSA9IGZwOw0KKw0KKyAgICAgIGlmIChudW0gPD0gMHg4MDAwMDAwMCkgLyogZWxzZSBvdmVyZmxvd2VkICovDQorICAgICAgew0KKyAgICAgICAgIHVuc2lnbmVkIGludCBuZGlnaXRzID0gMCwgZmlyc3QgPSAxNiAvKiBmbGFnIHZhbHVlICovOw0KKyAgICAgICAgIGNoYXIgZGlnaXRzWzEwXTsNCisNCisgICAgICAgICB3aGlsZSAobnVtKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBTcGxpdCB0aGUgbG93IGRpZ2l0IG9mZiBudW06ICovDQorICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IG51bS8xMDsNCisgICAgICAgICAgICBudW0gLT0gdG1wKjEwOw0KKyAgICAgICAgICAgIGRpZ2l0c1tuZGlnaXRzKytdID0gKGNoYXIpKDQ4ICsgbnVtKTsNCisgICAgICAgICAgICAvKiBSZWNvcmQgdGhlIGZpcnN0IG5vbi16ZXJvIGRpZ2l0LCBub3RlIHRoYXQgdGhpcyBpcyBhIG51bWJlcg0KKyAgICAgICAgICAgICAqIHN0YXJ0aW5nIGF0IDEsIGl0J3Mgbm90IGFjdHVhbGx5IHRoZSBhcnJheSBpbmRleC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gMTYgJiYgbnVtID4gMCkNCisgICAgICAgICAgICAgICBmaXJzdCA9IG5kaWdpdHM7DQorICAgICAgICAgICAgbnVtID0gdG1wOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAobmRpZ2l0cyA+IDApDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHdoaWxlIChuZGlnaXRzID4gNSkgKmFzY2lpKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsNCisgICAgICAgICAgICAvKiBUaGUgcmVtYWluaW5nIGRpZ2l0cyBhcmUgZnJhY3Rpb25hbCBkaWdpdHMsIG5kaWdpdHMgaXMgJzUnIG9yDQorICAgICAgICAgICAgICogc21hbGxlciBhdCB0aGlzIHBvaW50LiAgSXQgaXMgY2VydGFpbmx5IG5vdCB6ZXJvLiAgQ2hlY2sgZm9yIGENCisgICAgICAgICAgICAgKiBub24temVybyBmcmFjdGlvbmFsIGRpZ2l0Og0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChmaXJzdCA8PSA1KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsNCisgICAgICAgICAgICAgICAqYXNjaWkrKyA9IDQ2OyAvKiBkZWNpbWFsIHBvaW50ICovDQorICAgICAgICAgICAgICAgLyogbmRpZ2l0cyBtYXkgYmUgPDUgZm9yIHNtYWxsIG51bWJlcnMsIG91dHB1dCBsZWFkaW5nIHplcm9zDQorICAgICAgICAgICAgICAgICogdGhlbiBuZGlnaXRzIGRpZ2l0cyB0byBmaXJzdDoNCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBpID0gNTsNCisgICAgICAgICAgICAgICB3aGlsZSAobmRpZ2l0cyA8IGkpICphc2NpaSsrID0gNDgsIC0taTsNCisgICAgICAgICAgICAgICB3aGlsZSAobmRpZ2l0cyA+PSBmaXJzdCkgKmFzY2lpKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsNCisgICAgICAgICAgICAgICAvKiBEb24ndCBvdXRwdXQgdGhlIHRyYWlsaW5nIHplcm9zISAqLw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICphc2NpaSsrID0gNDg7DQorDQorICAgICAgICAgLyogQW5kIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmc6ICovDQorICAgICAgICAgKmFzY2lpID0gMDsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgIH0NCisNCisgICAvKiBIZXJlIG9uIGJ1ZmZlciB0b28gc21hbGwuICovDQorICAgcG5nX2Vycm9yKHBuZ19wdHIsICJBU0NJSSBjb252ZXJzaW9uIGJ1ZmZlciB0b28gc21hbGwiKTsNCit9DQorIyAgIGVuZGlmIC8qIEZJWEVEX1BPSU5UICovDQorI2VuZGlmIC8qIFJFQURfU0NBTCAqLw0KKw0KKyNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpICYmIFwNCisgICAhZGVmaW5lZChQTkdfRklYRURfUE9JTlRfTUFDUk9fU1VQUE9SVEVEKSAmJiBcDQorICAgKGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19jSFJNX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcDQorICAgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpKSB8fCBcDQorICAgKGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSAmJiBcDQorICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQpKQ0KK3BuZ19maXhlZF9wb2ludA0KK3BuZ19maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgZG91YmxlIGZwLCBwbmdfY29uc3RfY2hhcnAgdGV4dCkNCit7DQorICAgZG91YmxlIHIgPSBmbG9vcigxMDAwMDAgKiBmcCArIC41KTsNCisNCisgICBpZiAociA+IDIxNDc0ODM2NDcuIHx8IHIgPCAtMjE0NzQ4MzY0OC4pDQorICAgICAgcG5nX2ZpeGVkX2Vycm9yKHBuZ19wdHIsIHRleHQpOw0KKw0KKyAgIHJldHVybiAocG5nX2ZpeGVkX3BvaW50KXI7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgXA0KKyAgICBkZWZpbmVkKFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRCkNCisvKiBtdWxkaXYgZnVuY3Rpb25zICovDQorLyogVGhpcyBBUEkgdGFrZXMgc2lnbmVkIGFyZ3VtZW50cyBhbmQgcm91bmRzIHRoZSByZXN1bHQgdG8gdGhlIG5lYXJlc3QNCisgKiBpbnRlZ2VyIChvciwgZm9yIGEgZml4ZWQgcG9pbnQgbnVtYmVyIC0gdGhlIHN0YW5kYXJkIGFyZ3VtZW50IC0gdG8NCisgKiB0aGUgbmVhcmVzdCAuMDAwMDEpLiAgT3ZlcmZsb3cgYW5kIGRpdmlkZSBieSB6ZXJvIGFyZSBzaWduYWxsZWQgaW4NCisgKiB0aGUgcmVzdWx0LCBhIGJvb2xlYW4gLSB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIG92ZXJmbG93Lg0KKyAqLw0KK2ludA0KK3BuZ19tdWxkaXYocG5nX2ZpeGVkX3BvaW50X3AgcmVzLCBwbmdfZml4ZWRfcG9pbnQgYSwgcG5nX2ludF8zMiB0aW1lcywNCisgICAgcG5nX2ludF8zMiBkaXZpc29yKQ0KK3sNCisgICAvKiBSZXR1cm4gYSAqIHRpbWVzIC8gZGl2aXNvciwgcm91bmRlZC4gKi8NCisgICBpZiAoZGl2aXNvciAhPSAwKQ0KKyAgIHsNCisgICAgICBpZiAoYSA9PSAwIHx8IHRpbWVzID09IDApDQorICAgICAgew0KKyAgICAgICAgICpyZXMgPSAwOw0KKyAgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyNpZmRlZiBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQNCisgICAgICAgICBkb3VibGUgciA9IGE7DQorICAgICAgICAgciAqPSB0aW1lczsNCisgICAgICAgICByIC89IGRpdmlzb3I7DQorICAgICAgICAgciA9IGZsb29yKHIrLjUpOw0KKw0KKyAgICAgICAgIC8qIEEgcG5nX2ZpeGVkX3BvaW50IGlzIGEgMzItYml0IGludGVnZXIuICovDQorICAgICAgICAgaWYgKHIgPD0gMjE0NzQ4MzY0Ny4gJiYgciA+PSAtMjE0NzQ4MzY0OC4pDQorICAgICAgICAgew0KKyAgICAgICAgICAgICpyZXMgPSAocG5nX2ZpeGVkX3BvaW50KXI7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgfQ0KKyNlbHNlDQorICAgICAgICAgaW50IG5lZ2F0aXZlID0gMDsNCisgICAgICAgICBwbmdfdWludF8zMiBBLCBULCBEOw0KKyAgICAgICAgIHBuZ191aW50XzMyIHMxNiwgczMyLCBzMDA7DQorDQorICAgICAgICAgaWYgKGEgPCAwKQ0KKyAgICAgICAgICAgIG5lZ2F0aXZlID0gMSwgQSA9IC1hOw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBBID0gYTsNCisNCisgICAgICAgICBpZiAodGltZXMgPCAwKQ0KKyAgICAgICAgICAgIG5lZ2F0aXZlID0gIW5lZ2F0aXZlLCBUID0gLXRpbWVzOw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBUID0gdGltZXM7DQorDQorICAgICAgICAgaWYgKGRpdmlzb3IgPCAwKQ0KKyAgICAgICAgICAgIG5lZ2F0aXZlID0gIW5lZ2F0aXZlLCBEID0gLWRpdmlzb3I7DQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIEQgPSBkaXZpc29yOw0KKw0KKyAgICAgICAgIC8qIEZvbGxvd2luZyBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlIHRoZSBhcmd1bWVudHMgb25seQ0KKyAgICAgICAgICAqIGhhdmUgMzEgYml0cyBlYWNoLCBob3dldmVyIHRoZSByZXN1bHQgbWF5IGJlIDMyIGJpdHMuDQorICAgICAgICAgICovDQorICAgICAgICAgczE2ID0gKEEgPj4gMTYpICogKFQgJiAweGZmZmYpICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoQSAmIDB4ZmZmZikgKiAoVCA+PiAxNik7DQorICAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYSp0aW1lcyBiaXQgaXMgb25seSAzMA0KKyAgICAgICAgICAqIGJpdHMgYXQgbW9zdC4NCisgICAgICAgICAgKi8NCisgICAgICAgICBzMzIgPSAoQSA+PiAxNikgKiAoVCA+PiAxNikgKyAoczE2ID4+IDE2KTsNCisgICAgICAgICBzMDAgPSAoQSAmIDB4ZmZmZikgKiAoVCAmIDB4ZmZmZik7DQorDQorICAgICAgICAgczE2ID0gKHMxNiAmIDB4ZmZmZikgPDwgMTY7DQorICAgICAgICAgczAwICs9IHMxNjsNCisNCisgICAgICAgICBpZiAoczAwIDwgczE2KQ0KKyAgICAgICAgICAgICsrczMyOyAvKiBjYXJyeSAqLw0KKw0KKyAgICAgICAgIGlmIChzMzIgPCBEKSAvKiBlbHNlIG92ZXJmbG93ICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIHMzMi5zMDAgaXMgbm93IHRoZSA2NC1iaXQgcHJvZHVjdCwgZG8gYSBzdGFuZGFyZA0KKyAgICAgICAgICAgICAqIGRpdmlzaW9uLCB3ZSBrbm93IHRoYXQgczMyIDwgRCwgc28gdGhlIG1heGltdW0NCisgICAgICAgICAgICAgKiByZXF1aXJlZCBzaGlmdCBpcyAzMS4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpbnQgYml0c2hpZnQgPSAzMjsNCisgICAgICAgICAgICBwbmdfZml4ZWRfcG9pbnQgcmVzdWx0ID0gMDsgLyogTk9URTogc2lnbmVkICovDQorDQorICAgICAgICAgICAgd2hpbGUgKC0tYml0c2hpZnQgPj0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgZDMyLCBkMDA7DQorDQorICAgICAgICAgICAgICAgaWYgKGJpdHNoaWZ0ID4gMCkNCisgICAgICAgICAgICAgICAgICBkMzIgPSBEID4+ICgzMi1iaXRzaGlmdCksIGQwMCA9IEQgPDwgYml0c2hpZnQ7DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIGQzMiA9IDAsIGQwMCA9IEQ7DQorDQorICAgICAgICAgICAgICAgaWYgKHMzMiA+IGQzMikNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaWYgKHMwMCA8IGQwMCkgLS1zMzI7IC8qIGNhcnJ5ICovDQorICAgICAgICAgICAgICAgICAgczMyIC09IGQzMiwgczAwIC09IGQwMCwgcmVzdWx0ICs9IDE8PGJpdHNoaWZ0Ow0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgaWYgKHMzMiA9PSBkMzIgJiYgczAwID49IGQwMCkNCisgICAgICAgICAgICAgICAgICAgICBzMzIgPSAwLCBzMDAgLT0gZDAwLCByZXN1bHQgKz0gMTw8Yml0c2hpZnQ7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8qIEhhbmRsZSB0aGUgcm91bmRpbmcuICovDQorICAgICAgICAgICAgaWYgKHMwMCA+PSAoRCA+PiAxKSkNCisgICAgICAgICAgICAgICArK3Jlc3VsdDsNCisNCisgICAgICAgICAgICBpZiAobmVnYXRpdmUpDQorICAgICAgICAgICAgICAgcmVzdWx0ID0gLXJlc3VsdDsNCisNCisgICAgICAgICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovDQorICAgICAgICAgICAgaWYgKChuZWdhdGl2ZSAmJiByZXN1bHQgPD0gMCkgfHwgKCFuZWdhdGl2ZSAmJiByZXN1bHQgPj0gMCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICpyZXMgPSByZXN1bHQ7DQorICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIHJldHVybiAwOw0KK30NCisjZW5kaWYgLyogUkVBRF9HQU1NQSB8fCBJTkNIX0NPTlZFUlNJT05TICovDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCkNCisvKiBUaGUgZm9sbG93aW5nIGlzIGZvciB3aGVuIHRoZSBjYWxsZXIgZG9lc24ndCBtdWNoIGNhcmUgYWJvdXQgdGhlDQorICogcmVzdWx0Lg0KKyAqLw0KK3BuZ19maXhlZF9wb2ludA0KK3BuZ19tdWxkaXZfd2FybihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGEsIHBuZ19pbnRfMzIgdGltZXMsDQorICAgIHBuZ19pbnRfMzIgZGl2aXNvcikNCit7DQorICAgcG5nX2ZpeGVkX3BvaW50IHJlc3VsdDsNCisNCisgICBpZiAocG5nX211bGRpdigmcmVzdWx0LCBhLCB0aW1lcywgZGl2aXNvcikpDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisNCisgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiZml4ZWQgcG9pbnQgb3ZlcmZsb3cgaWdub3JlZCIpOw0KKyAgIHJldHVybiAwOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0dBTU1BX1NVUFBPUlRFRCAvKiBtb3JlIGZpeGVkIHBvaW50IGZ1bmN0aW9ucyBmb3IgZ2FtbWEgKi8NCisvKiBDYWxjdWxhdGUgYSByZWNpcHJvY2FsLCByZXR1cm4gMCBvbiBkaXYtYnktemVybyBvciBvdmVyZmxvdy4gKi8NCitwbmdfZml4ZWRfcG9pbnQNCitwbmdfcmVjaXByb2NhbChwbmdfZml4ZWRfcG9pbnQgYSkNCit7DQorI2lmZGVmIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRA0KKyAgIGRvdWJsZSByID0gZmxvb3IoMUUxMC9hKy41KTsNCisNCisgICBpZiAociA8PSAyMTQ3NDgzNjQ3LiAmJiByID49IC0yMTQ3NDgzNjQ4LikNCisgICAgICByZXR1cm4gKHBuZ19maXhlZF9wb2ludClyOw0KKyNlbHNlDQorICAgcG5nX2ZpeGVkX3BvaW50IHJlczsNCisNCisgICBpZiAocG5nX211bGRpdigmcmVzLCAxMDAwMDAsIDEwMDAwMCwgYSkpDQorICAgICAgcmV0dXJuIHJlczsNCisjZW5kaWYNCisNCisgICByZXR1cm4gMDsgLyogZXJyb3Ivb3ZlcmZsb3cgKi8NCit9DQorDQorLyogVGhpcyBpcyB0aGUgc2hhcmVkIHRlc3Qgb24gd2hldGhlciBhIGdhbW1hIHZhbHVlIGlzICdzaWduaWZpY2FudCcgLSB3aGV0aGVyDQorICogaXQgaXMgd29ydGggZG9pbmcgZ2FtbWEgY29ycmVjdGlvbi4NCisgKi8NCitpbnQgLyogUFJJVkFURSAqLw0KK3BuZ19nYW1tYV9zaWduaWZpY2FudChwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsKQ0KK3sNCisgICByZXR1cm4gZ2FtbWFfdmFsIDwgUE5HX0ZQXzEgLSBQTkdfR0FNTUFfVEhSRVNIT0xEX0ZJWEVEIHx8DQorICAgICAgIGdhbW1hX3ZhbCA+IFBOR19GUF8xICsgUE5HX0dBTU1BX1RIUkVTSE9MRF9GSVhFRDsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKy8qIEEgbG9jYWwgY29udmVuaWVuY2Ugcm91dGluZS4gKi8NCitzdGF0aWMgcG5nX2ZpeGVkX3BvaW50DQorcG5nX3Byb2R1Y3QyKHBuZ19maXhlZF9wb2ludCBhLCBwbmdfZml4ZWRfcG9pbnQgYikNCit7DQorICAgLyogVGhlIHJlcXVpcmVkIHJlc3VsdCBpcyAxL2EgKiAxL2I7IHRoZSBmb2xsb3dpbmcgcHJlc2VydmVzIGFjY3VyYWN5LiAqLw0KKyNpZmRlZiBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQNCisgICBkb3VibGUgciA9IGEgKiAxRS01Ow0KKyAgIHIgKj0gYjsNCisgICByID0gZmxvb3IocisuNSk7DQorDQorICAgaWYgKHIgPD0gMjE0NzQ4MzY0Ny4gJiYgciA+PSAtMjE0NzQ4MzY0OC4pDQorICAgICAgcmV0dXJuIChwbmdfZml4ZWRfcG9pbnQpcjsNCisjZWxzZQ0KKyAgIHBuZ19maXhlZF9wb2ludCByZXM7DQorDQorICAgaWYgKHBuZ19tdWxkaXYoJnJlcywgYSwgYiwgMTAwMDAwKSkNCisgICAgICByZXR1cm4gcmVzOw0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAwOyAvKiBvdmVyZmxvdyAqLw0KK30NCisNCisvKiBUaGUgaW52ZXJzZSBvZiB0aGUgYWJvdmUuICovDQorcG5nX2ZpeGVkX3BvaW50DQorcG5nX3JlY2lwcm9jYWwyKHBuZ19maXhlZF9wb2ludCBhLCBwbmdfZml4ZWRfcG9pbnQgYikNCit7DQorICAgLyogVGhlIHJlcXVpcmVkIHJlc3VsdCBpcyAxL2EgKiAxL2I7IHRoZSBmb2xsb3dpbmcgcHJlc2VydmVzIGFjY3VyYWN5LiAqLw0KKyNpZmRlZiBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQNCisgICBkb3VibGUgciA9IDFFMTUvYTsNCisgICByIC89IGI7DQorICAgciA9IGZsb29yKHIrLjUpOw0KKw0KKyAgIGlmIChyIDw9IDIxNDc0ODM2NDcuICYmIHIgPj0gLTIxNDc0ODM2NDguKQ0KKyAgICAgIHJldHVybiAocG5nX2ZpeGVkX3BvaW50KXI7DQorI2Vsc2UNCisgICAvKiBUaGlzIG1heSBvdmVyZmxvdyBiZWNhdXNlIHRoZSByYW5nZSBvZiBwbmdfZml4ZWRfcG9pbnQgaXNuJ3Qgc3ltbWV0cmljLA0KKyAgICAqIGJ1dCB0aGlzIEFQSSBpcyBvbmx5IHVzZWQgZm9yIHRoZSBwcm9kdWN0IG9mIGZpbGUgYW5kIHNjcmVlbiBnYW1tYSBzbyBpdA0KKyAgICAqIGRvZXNuJ3QgbWF0dGVyIHRoYXQgdGhlIHNtYWxsZXN0IG51bWJlciBpdCBjYW4gcHJvZHVjZSBpcyAxLzIxNDc0LCBub3QNCisgICAgKiAxLzEwMDAwMA0KKyAgICAqLw0KKyAgIHBuZ19maXhlZF9wb2ludCByZXMgPSBwbmdfcHJvZHVjdDIoYSwgYik7DQorDQorICAgaWYgKHJlcyAhPSAwKQ0KKyAgICAgIHJldHVybiBwbmdfcmVjaXByb2NhbChyZXMpOw0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAwOyAvKiBvdmVyZmxvdyAqLw0KK30NCisjZW5kaWYgLyogUkVBRF9HQU1NQSAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQgLyogZ2FtbWEgdGFibGUgY29kZSAqLw0KKyNpZm5kZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEDQorLyogRml4ZWQgcG9pbnQgZ2FtbWEuDQorICoNCisgKiBUaGUgY29kZSB0byBjYWxjdWxhdGUgdGhlIHRhYmxlcyB1c2VkIGJlbG93IGNhbiBiZSBmb3VuZCBpbiB0aGUgc2hlbGwgc2NyaXB0DQorICogY29udHJpYi90b29scy9pbnRnYW1tYS5zaA0KKyAqDQorICogVG8gY2FsY3VsYXRlIGdhbW1hIHRoaXMgY29kZSBpbXBsZW1lbnRzIGZhc3QgbG9nKCkgYW5kIGV4cCgpIGNhbGxzIHVzaW5nIG9ubHkNCisgKiBmaXhlZCBwb2ludCBhcml0aG1ldGljLiAgVGhpcyBjb2RlIGhhcyBzdWZmaWNpZW50IHByZWNpc2lvbiBmb3IgZWl0aGVyIDgtYml0DQorICogb3IgMTYtYml0IHNhbXBsZSB2YWx1ZXMuDQorICoNCisgKiBUaGUgdGFibGVzIHVzZWQgaGVyZSB3ZXJlIGNhbGN1bGF0ZWQgdXNpbmcgc2ltcGxlICdiYycgcHJvZ3JhbXMsIGJ1dCBDIGRvdWJsZQ0KKyAqIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIHdvdWxkIHdvcmsgZmluZS4NCisgKg0KKyAqIDgtYml0IGxvZyB0YWJsZQ0KKyAqICAgVGhpcyBpcyBhIHRhYmxlIG9mIC1sb2codmFsdWUvMjU1KS9sb2coMikgZm9yICd2YWx1ZScgaW4gdGhlIHJhbmdlIDEyOCB0bw0KKyAqICAgMjU1LCBzbyBpdCdzIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIGEgbm9ybWFsaXplZCA4LWJpdCBmbG9hdGluZyBwb2ludA0KKyAqICAgbWFudGlzc2EuICBUaGUgbnVtYmVycyBhcmUgMzItYml0IGZyYWN0aW9ucy4NCisgKi8NCitzdGF0aWMgY29uc3QgcG5nX3VpbnRfMzINCitwbmdfOGJpdF9sMlsxMjhdID0NCit7DQorICAgNDI3MDcxNTQ5MlUsIDQyMjI0OTQ3OTdVLCA0MTc0NjQ2NDY3VSwgNDEyNzE2NDc5M1UsIDQwODAwNDQyMDFVLCA0MDMzMjc5MjM5VSwNCisgICAzOTg2ODY0NTgwVSwgMzk0MDc5NTAxNVUsIDM4OTUwNjU0NDlVLCAzODQ5NjcwOTAyVSwgMzgwNDYwNjQ5OVUsIDM3NTk4Njc0NzRVLA0KKyAgIDM3MTU0NDkxNjJVLCAzNjcxMzQ2OTk3VSwgMzYyNzU1NjUxMVUsIDM1ODQwNzMzMjlVLCAzNTQwODkzMTY4VSwgMzQ5ODAxMTgzNFUsDQorICAgMzQ1NTQyNTIyMFUsIDM0MTMxMjkzMDFVLCAzMzcxMTIwMTM3VSwgMzMyOTM5Mzg2NFUsIDMyODc5NDY3MDBVLCAzMjQ2Nzc0OTMzVSwNCisgICAzMjA1ODc0OTMwVSwgMzE2NTI0MzEyNVUsIDMxMjQ4NzYwMjVVLCAzMDg0NzcwMjAyVSwgMzA0NDkyMjI5NlUsIDMwMDUzMjkwMTFVLA0KKyAgIDI5NjU5ODcxMTNVLCAyOTI2ODkzNDMyVSwgMjg4ODA0NDg1M1UsIDI4NDk0MzgzMjNVLCAyODExMDcwODQ0VSwgMjc3MjkzOTQ3NFUsDQorICAgMjczNTA0MTMyNlUsIDI2OTczNzM1NjJVLCAyNjU5OTMzNDAwVSwgMjYyMjcxODEwNFUsIDI1ODU3MjQ5OTFVLCAyNTQ4OTUxNDI0VSwNCisgICAyNTEyMzk0ODEwVSwgMjQ3NjA1MjYwNlUsIDI0Mzk5MjIzMTFVLCAyNDA0MDAxNDY4VSwgMjM2ODI4NzY2M1UsIDIzMzI3Nzg1MjNVLA0KKyAgIDIyOTc0NzE3MTVVLCAyMjYyMzY0OTQ3VSwgMjIyNzQ1NTk2NFUsIDIxOTI3NDI1NTFVLCAyMTU4MjIyNTI5VSwgMjEyMzg5Mzc1NFUsDQorICAgMjA4OTc1NDExOVUsIDIwNTU4MDE1NTJVLCAyMDIyMDM0MDEzVSwgMTk4ODQ0OTQ5N1UsIDE5NTUwNDYwMzFVLCAxOTIxODIxNjcyVSwNCisgICAxODg4Nzc0NTExVSwgMTg1NTkwMjY2OFUsIDE4MjMyMDQyOTFVLCAxNzkwNjc3NTYwVSwgMTc1ODMyMDY4MlUsIDE3MjYxMzE4OTNVLA0KKyAgIDE2OTQxMDk0NTRVLCAxNjYyMjUxNjU3VSwgMTYzMDU1NjgxNVUsIDE1OTkwMjMyNzFVLCAxNTY3NjQ5MzkxVSwgMTUzNjQzMzU2N1UsDQorICAgMTUwNTM3NDIxNFUsIDE0NzQ0Njk3NzBVLCAxNDQzNzE4NzAwVSwgMTQxMzExOTQ4N1UsIDEzODI2NzA2MzlVLCAxMzUyMzcwNjg2VSwNCisgICAxMzIyMjE4MTc5VSwgMTI5MjIxMTY4OVUsIDEyNjIzNDk4MTBVLCAxMjMyNjMxMTUzVSwgMTIwMzA1NDM1MlUsIDExNzM2MTgwNTlVLA0KKyAgIDExNDQzMjA5NDZVLCAxMTE1MTYxNzAxVSwgMTA4NjEzOTAzNFUsIDEwNTcyNTE2NzJVLCAxMDI4NDk4MzU4VSwgOTk5ODc3ODU0VSwNCisgICA5NzEzODg5NDBVLCA5NDMwMzA0MTBVLCA5MTQ4MDEwNzZVLCA4ODY2OTk3NjdVLCA4NTg3MjUzMjdVLCA4MzA4NzY2MTRVLA0KKyAgIDgwMzE1MjUwNVUsIDc3NTU1MTg5MFUsIDc0ODA3MzY3MlUsIDcyMDcxNjc3MVUsIDY5MzQ4MDEyMFUsIDY2NjM2MjY2N1UsDQorICAgNjM5MzYzMzc0VSwgNjEyNDgxMjE1VSwgNTg1NzE1MTc3VSwgNTU5MDY0MjYzVSwgNTMyNTI3NDg2VSwgNTA2MTAzODcyVSwNCisgICA0Nzk3OTI0NjFVLCA0NTM1OTIzMDNVLCA0Mjc1MDI0NjNVLCA0MDE1MjIwMTRVLCAzNzU2NTAwNDNVLCAzNDk4ODU2NDhVLA0KKyAgIDMyNDIyNzkzOFUsIDI5ODY3NjAzNFUsIDI3MzIyOTA2NlUsIDI0Nzg4NjE3NlUsIDIyMjY0NjUxNlUsIDE5NzUwOTI0OFUsDQorICAgMTcyNDczNTQ1VSwgMTQ3NTM4NTkwVSwgMTIyNzAzNTc0VSwgOTc5Njc3MDFVLCA3MzMzMDE4MlUsIDQ4NzkwMjM2VSwNCisgICAyNDM0NzA5NlUsIDBVDQorDQorI2lmIDANCisgICAvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsdWVzIGZvciAxNi1iaXQgdGFibGVzIC0gdGhlc2Ugd29yayBmaW5lIGZvciB0aGUNCisgICAgKiA4LWJpdCBjb252ZXJzaW9ucyBidXQgcHJvZHVjZSB2ZXJ5IHNsaWdodGx5IGxhcmdlciBlcnJvcnMgaW4gdGhlIDE2LWJpdA0KKyAgICAqIGxvZyAoYWJvdXQgMS4yIGFzIG9wcG9zZWQgdG8gMC43IGFic29sdXRlIGVycm9yIGluIHRoZSBmaW5hbCB2YWx1ZSkuICBUbw0KKyAgICAqIHVzZSB0aGVzZSBhbGwgdGhlIHNoaWZ0cyBiZWxvdyBtdXN0IGJlIGFkanVzdGVkIGFwcHJvcHJpYXRlbHkuDQorICAgICovDQorICAgNjUxNjYsIDY0NDMwLCA2MzcwMCwgNjI5NzYsIDYyMjU3LCA2MTU0MywgNjA4MzUsIDYwMTMyLCA1OTQzNCwgNTg3NDEsIDU4MDU0LA0KKyAgIDU3MzcxLCA1NjY5MywgNTYwMjAsIDU1MzUyLCA1NDY4OSwgNTQwMzAsIDUzMzc1LCA1MjcyNiwgNTIwODAsIDUxNDM5LCA1MDgwMywNCisgICA1MDE3MCwgNDk1NDIsIDQ4OTE4LCA0ODI5OCwgNDc2ODIsIDQ3MDcwLCA0NjQ2MiwgNDU4NTgsIDQ1MjU3LCA0NDY2MSwgNDQwNjgsDQorICAgNDM0NzksIDQyODk0LCA0MjMxMiwgNDE3MzMsIDQxMTU5LCA0MDU4NywgNDAwMjAsIDM5NDU1LCAzODg5NCwgMzgzMzYsIDM3NzgyLA0KKyAgIDM3MjMwLCAzNjY4MiwgMzYxMzcsIDM1NTk1LCAzNTA1NywgMzQ1MjEsIDMzOTg4LCAzMzQ1OSwgMzI5MzIsIDMyNDA4LCAzMTg4NywNCisgICAzMTM2OSwgMzA4NTQsIDMwMzQxLCAyOTgzMiwgMjkzMjUsIDI4ODIwLCAyODMxOSwgMjc4MjAsIDI3MzI0LCAyNjgzMCwgMjYzMzksDQorICAgMjU4NTAsIDI1MzY0LCAyNDg4MCwgMjQzOTksIDIzOTIwLCAyMzQ0NCwgMjI5NzAsIDIyNDk5LCAyMjAyOSwgMjE1NjIsIDIxMDk4LA0KKyAgIDIwNjM2LCAyMDE3NSwgMTk3MTgsIDE5MjYyLCAxODgwOCwgMTgzNTcsIDE3OTA4LCAxNzQ2MSwgMTcwMTYsIDE2NTczLCAxNjEzMiwNCisgICAxNTY5NCwgMTUyNTcsIDE0ODIyLCAxNDM5MCwgMTM5NTksIDEzNTMwLCAxMzEwMywgMTI2NzgsIDEyMjU1LCAxMTgzNCwgMTE0MTUsDQorICAgMTA5OTcsIDEwNTgyLCAxMDE2OCwgOTc1NiwgOTM0NiwgODkzNywgODUzMSwgODEyNiwgNzcyMywgNzMyMSwgNjkyMSwgNjUyMywNCisgICA2MTI3LCA1NzMyLCA1MzM5LCA0OTQ3LCA0NTU3LCA0MTY5LCAzNzgyLCAzMzk3LCAzMDE0LCAyNjMyLCAyMjUxLCAxODcyLCAxNDk1LA0KKyAgIDExMTksIDc0NCwgMzcyDQorI2VuZGlmDQorfTsNCisNCitzdGF0aWMgcG5nX2ludF8zMg0KK3BuZ19sb2c4Yml0KHVuc2lnbmVkIGludCB4KQ0KK3sNCisgICB1bnNpZ25lZCBpbnQgbGcyID0gMDsNCisgICAvKiBFYWNoIHRpbWUgJ3gnIGlzIG11bHRpcGxpZWQgYnkgMiwgMSBtdXN0IGJlIHN1YnRyYWN0ZWQgb2ZmIHRoZSBmaW5hbCBsb2csDQorICAgICogYmVjYXVzZSB0aGUgbG9nIGlzIGFjdHVhbGx5IG5lZ2F0ZSB0aGF0IG1lYW5zIGFkZGluZyAxLiAgVGhlIGZpbmFsDQorICAgICogcmV0dXJuZWQgdmFsdWUgdGh1cyBoYXMgdGhlIHJhbmdlIDAgKGZvciAyNTUgaW5wdXQpIHRvIDcuOTk0IChmb3IgMQ0KKyAgICAqIGlucHV0KSwgcmV0dXJuIC0xIGZvciB0aGUgb3ZlcmZsb3cgKGxvZyAwKSBjYXNlLCAtIHNvIHRoZSByZXN1bHQgaXMNCisgICAgKiBhbHdheXMgYXQgbW9zdCAxOSBiaXRzLg0KKyAgICAqLw0KKyAgIGlmICgoeCAmPSAweGZmKSA9PSAwKQ0KKyAgICAgIHJldHVybiAtMTsNCisNCisgICBpZiAoKHggJiAweGYwKSA9PSAwKQ0KKyAgICAgIGxnMiAgPSA0LCB4IDw8PSA0Ow0KKw0KKyAgIGlmICgoeCAmIDB4YzApID09IDApDQorICAgICAgbGcyICs9IDIsIHggPDw9IDI7DQorDQorICAgaWYgKCh4ICYgMHg4MCkgPT0gMCkNCisgICAgICBsZzIgKz0gMSwgeCA8PD0gMTsNCisNCisgICAvKiByZXN1bHQgaXMgYXQgbW9zdCAxOSBiaXRzLCBzbyB0aGlzIGNhc3QgaXMgc2FmZTogKi8NCisgICByZXR1cm4gKHBuZ19pbnRfMzIpKChsZzIgPDwgMTYpICsgKChwbmdfOGJpdF9sMlt4LTEyOF0rMzI3NjgpPj4xNikpOw0KK30NCisNCisvKiBUaGUgYWJvdmUgZ2l2ZXMgZXhhY3QgKHRvIDE2IGJpbmFyeSBwbGFjZXMpIGxvZzIgdmFsdWVzIGZvciA4LWJpdCBpbWFnZXMsDQorICogZm9yIDE2LWJpdCBpbWFnZXMgd2UgdXNlIHRoZSBtb3N0IHNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgMTYtYml0IHZhbHVlIHRvDQorICogZ2V0IGFuIGFwcHJveGltYXRpb24gdGhlbiBtdWx0aXBseSB0aGUgYXBwcm94aW1hdGlvbiBieSBhIGNvcnJlY3Rpb24gZmFjdG9yDQorICogZGV0ZXJtaW5lZCBieSB0aGUgcmVtYWluaW5nIHVwIHRvIDggYml0cy4gIFRoaXMgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBzdGVwDQorICogaW4gdGhlIDE2LWJpdCBjYXNlLg0KKyAqDQorICogV2Ugd2FudCBsb2cyKHZhbHVlLzY1NTM1KSwgd2UgaGF2ZSBsb2cyKHYnLzI1NSksIHdoZXJlOg0KKyAqDQorICogICAgdmFsdWUgPSB2JyAqIDI1NiArIHYnJw0KKyAqICAgICAgICAgID0gdicgKiBmDQorICoNCisgKiBTbyBmIGlzIHZhbHVlL3YnLCB3aGljaCBpcyBlcXVhbCB0byAoMjU2K3YnJy92Jykgc2luY2UgdicgaXMgaW4gdGhlIHJhbmdlIDEyOA0KKyAqIHRvIDI1NSBhbmQgdicnIGlzIGluIHRoZSByYW5nZSAwIHRvIDI1NSBmIHdpbGwgYmUgaW4gdGhlIHJhbmdlIDI1NiB0byBsZXNzDQorICogdGhhbiAyNTguICBUaGUgZmluYWwgZmFjdG9yIGFsc28gbmVlZHMgdG8gY29ycmVjdCBmb3IgdGhlIGZhY3QgdGhhdCBvdXIgOC1iaXQNCisgKiB2YWx1ZSBpcyBzY2FsZWQgYnkgMjU1LCB3aGVyZWFzIHRoZSAxNi1iaXQgdmFsdWVzIG11c3QgYmUgc2NhbGVkIGJ5IDY1NTM1Lg0KKyAqDQorICogVGhpcyBnaXZlcyBhIGZpbmFsIGZvcm11bGEgdXNpbmcgYSBjYWxjdWxhdGVkIHZhbHVlICd4JyB3aGljaCBpcyB2YWx1ZS92JyBhbmQNCisgKiBzY2FsaW5nIGJ5IDY1NTM2IHRvIG1hdGNoIHRoZSBhYm92ZSB0YWJsZToNCisgKg0KKyAqICAgbG9nMih4LzI1NykgKiA2NTUzNg0KKyAqDQorICogU2luY2UgdGhlc2UgbnVtYmVycyBhcmUgc28gY2xvc2UgdG8gJzEnIHdlIGNhbiB1c2Ugc2ltcGxlIGxpbmVhcg0KKyAqIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdHdvIGVuZCB2YWx1ZXMgMjU2LzI1NyAocmVzdWx0IC0zNjguNjEpIGFuZCAyNTgvMjU3DQorICogKHJlc3VsdCAzNjcuMTc5KS4gIFRoZSB2YWx1ZXMgdXNlZCBiZWxvdyBhcmUgc2NhbGVkIGJ5IGEgZnVydGhlciA2NCB0byBnaXZlDQorICogMTYtYml0IHByZWNpc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGlvbjoNCisgKg0KKyAqIFN0YXJ0ICgyNTYpOiAtMjM1OTENCisgKiBaZXJvICAoMjU3KTogICAgICAwDQorICogRW5kICAgKDI1OCk6ICAyMzQ5OQ0KKyAqLw0KK3N0YXRpYyBwbmdfaW50XzMyDQorcG5nX2xvZzE2Yml0KHBuZ191aW50XzMyIHgpDQorew0KKyAgIHVuc2lnbmVkIGludCBsZzIgPSAwOw0KKw0KKyAgIC8qIEFzIGFib3ZlLCBidXQgbm93IHRoZSBpbnB1dCBoYXMgMTYgYml0cy4gKi8NCisgICBpZiAoKHggJj0gMHhmZmZmKSA9PSAwKQ0KKyAgICAgIHJldHVybiAtMTsNCisNCisgICBpZiAoKHggJiAweGZmMDApID09IDApDQorICAgICAgbGcyICA9IDgsIHggPDw9IDg7DQorDQorICAgaWYgKCh4ICYgMHhmMDAwKSA9PSAwKQ0KKyAgICAgIGxnMiArPSA0LCB4IDw8PSA0Ow0KKw0KKyAgIGlmICgoeCAmIDB4YzAwMCkgPT0gMCkNCisgICAgICBsZzIgKz0gMiwgeCA8PD0gMjsNCisNCisgICBpZiAoKHggJiAweDgwMDApID09IDApDQorICAgICAgbGcyICs9IDEsIHggPDw9IDE7DQorDQorICAgLyogQ2FsY3VsYXRlIHRoZSBiYXNlIGxvZ2FyaXRobSBmcm9tIHRoZSB0b3AgOCBiaXRzIGFzIGEgMjgtYml0IGZyYWN0aW9uYWwNCisgICAgKiB2YWx1ZS4NCisgICAgKi8NCisgICBsZzIgPDw9IDI4Ow0KKyAgIGxnMiArPSAocG5nXzhiaXRfbDJbKHg+PjgpLTEyOF0rOCkgPj4gNDsNCisNCisgICAvKiBOb3cgd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSB0aGUgZmFjdG9yLCB0aGlzIHJlcXVpcmVzIGEgZGl2aXNpb24gYnkgdGhlIHRvcA0KKyAgICAqIDggYml0cy4gIERvIHRoaXMgd2l0aCBtYXhpbXVtIHByZWNpc2lvbi4NCisgICAgKi8NCisgICB4ID0gKCh4IDw8IDE2KSArICh4ID4+IDkpKSAvICh4ID4+IDgpOw0KKw0KKyAgIC8qIFNpbmNlIHdlIGRpdmlkZWQgYnkgdGhlIHRvcCA4IGJpdHMgb2YgJ3gnIHRoZXJlIHdpbGwgYmUgYSAnMScgYXQgMTw8MjQsDQorICAgICogdGhlIHZhbHVlIGF0IDE8PDE2IChpZ25vcmluZyB0aGlzKSB3aWxsIGJlIDAgb3IgMTsgdGhpcyBnaXZlcyB1cyBleGFjdGx5DQorICAgICogMTYgYml0cyB0byBpbnRlcnBvbGF0ZSB0byBnZXQgdGhlIGxvdyBiaXRzIG9mIHRoZSByZXN1bHQuICBSb3VuZCB0aGUNCisgICAgKiBhbnN3ZXIuICBOb3RlIHRoYXQgdGhlIGVuZCBwb2ludCB2YWx1ZXMgYXJlIHNjYWxlZCBieSA2NCB0byByZXRhaW4gb3ZlcmFsbA0KKyAgICAqIHByZWNpc2lvbiBhbmQgdGhhdCAnbGcyJyBpcyBjdXJyZW50IHNjYWxlZCBieSBhbiBleHRyYSAxMiBiaXRzLCBzbyBhZGp1c3QNCisgICAgKiB0aGUgb3ZlcmFsbCBzY2FsaW5nIGJ5IDYtMTIuICBSb3VuZCBhdCBldmVyeSBzdGVwLg0KKyAgICAqLw0KKyAgIHggLT0gMVUgPDwgMjQ7DQorDQorICAgaWYgKHggPD0gNjU1MzZVKSAvKiA8PSAnMjU3JyAqLw0KKyAgICAgIGxnMiArPSAoKDIzNTkxVSAqICg2NTUzNlUteCkpICsgKDFVIDw8ICgxNis2LTEyLTEpKSkgPj4gKDE2KzYtMTIpOw0KKw0KKyAgIGVsc2UNCisgICAgICBsZzIgLT0gKCgyMzQ5OVUgKiAoeC02NTUzNlUpKSArICgxVSA8PCAoMTYrNi0xMi0xKSkpID4+ICgxNis2LTEyKTsNCisNCisgICAvKiBTYWZlLCBiZWNhdXNlIHRoZSByZXN1bHQgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMjAgYml0czogKi8NCisgICByZXR1cm4gKHBuZ19pbnRfMzIpKChsZzIgKyAyMDQ4KSA+PiAxMik7DQorfQ0KKw0KKy8qIFRoZSAnZXhwKCknIGNhc2UgbXVzdCBpbnZlcnQgdGhlIGFib3ZlLCB0YWtpbmcgYSAyMC1iaXQgZml4ZWQgcG9pbnQNCisgKiBsb2dhcml0aG1pYyB2YWx1ZSBhbmQgcmV0dXJuaW5nIGEgMTYgb3IgOC1iaXQgbnVtYmVyIGFzIGFwcHJvcHJpYXRlLiAgSW4NCisgKiBlYWNoIGNhc2Ugb25seSB0aGUgbG93IDE2IGJpdHMgYXJlIHJlbGV2YW50IC0gdGhlIGZyYWN0aW9uIC0gc2luY2UgdGhlDQorICogaW50ZWdlciBiaXRzICh0aGUgdG9wIDQpIHNpbXBseSBkZXRlcm1pbmUgYSBzaGlmdC4NCisgKg0KKyAqIFRoZSB3b3JzdCBjYXNlIGlzIHRoZSAxNi1iaXQgZGlzdGluY3Rpb24gYmV0d2VlbiA2NTUzNSBhbmQgNjU1MzQsIHRoaXMNCisgKiByZXF1aXJlcyBwZXJoYXBzIHNwdXJpb3VzIGFjY3VyYWN0eSBpbiB0aGUgZGVjb2Rpbmcgb2YgdGhlIGxvZ2FyaXRobSB0bw0KKyAqIGRpc3Rpbmd1aXNoIGxvZzIoNjU1MzUvNjU1MzQuNSkgLSAxMF4tNSBvciAxNyBiaXRzLiAgVGhlcmUgaXMgbGl0dGxlIGNoYW5jZQ0KKyAqIG9mIGdldHRpbmcgdGhpcyBhY2N1cmFjeSBpbiBwcmFjdGljZS4NCisgKg0KKyAqIFRvIGRlYWwgd2l0aCB0aGlzIHRoZSBmb2xsb3dpbmcgZXhwKCkgZnVuY3Rpb24gd29ya3Mgb3V0IHRoZSBleHBvbmVudCBvZiB0aGUNCisgKiBmcmF0aW9uYWwgcGFydCBvZiB0aGUgbG9nYXJpdGhtIGJ5IHVzaW5nIGFuIGFjY3VyYXRlIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZQ0KKyAqIHRvcCBmb3VyIGZyYWN0aW9uYWwgYml0cyB0aGVuIG11bHRpcGx5aW5nIGluIHRoZSByZW1haW5pbmcgYml0cy4NCisgKi8NCitzdGF0aWMgY29uc3QgcG5nX3VpbnRfMzINCitwbmdfMzJiaXRfZXhwWzE2XSA9DQorew0KKyAgIC8qIE5PVEU6IHRoZSBmaXJzdCBlbnRyeSBpcyBkZWxpYmVyYXRlbHkgc2V0IHRvIHRoZSBtYXhpbXVtIDMyLWJpdCB2YWx1ZS4gKi8NCisgICA0Mjk0OTY3Mjk1VSwgNDExMjg3NDc3M1UsIDM5Mzg1MDIzNzZVLCAzNzcxNTIyNzk2VSwgMzYxMTYyMjYwM1UsIDM0NTg1MDE2NTNVLA0KKyAgIDMzMTE4NzI1MjlVLCAzMTcxNDU5OTk5VSwgMzAzNzAwMDUwMFUsIDI5MDgyNDE2NDJVLCAyNzg0OTQxNzM4VSwgMjY2Njg2OTM0NVUsDQorICAgMjU1MzgwMjgzNFUsIDI0NDU1Mjk5NzJVLCAyMzQxODQ3NTI0VSwgMjI0MjU2MDg3MlUNCit9Ow0KKw0KKy8qIEFkanVzdG1lbnQgdGFibGU7IHByb3ZpZGVkIHRvIGV4cGxhaW4gdGhlIG51bWJlcnMgaW4gdGhlIGNvZGUgYmVsb3cuICovDQorI2lmIDANCitmb3IgKGk9MTE7aT49MDstLWkpeyBwcmludCBpLCAiICIsICgxIC0gZSgtKDJeaSkvNjU1MzYqbCgyKSkpICogMl4oMzItaSksICJcbiJ9DQorICAgMTEgNDQ5MzcuNjQyODQ4NjU1NDg3NTEyMDg0NDgNCisgICAxMCA0NTE4MC45ODczNDg0NTU4NTEwMTE2MDQ0OA0KKyAgICA5IDQ1MzAzLjMxOTM2OTgwNjg3MzU5MzExODcyDQorICAgIDggNDUzNjQuNjUxMTA1OTUzMjMwMTg4NzA3ODQNCisgICAgNyA0NTM5NS4zNTg1MDM2MTc4OTYyNDYxNDkxMg0KKyAgICA2IDQ1NDEwLjcyMjU5NzE1MTAyMDM3NTA4MDk2DQorICAgIDUgNDU0MTguNDA3MjQ0MTMyMjA3MjIzMTExNjgNCisgICAgNCA0NTQyMi4yNTAyMTc4Njg5ODE3MzAwMTcyOA0KKyAgICAzIDQ1NDI0LjE3MTg2NzMyMjk4NDE5MDQ0MzUyDQorICAgIDIgNDU0MjUuMTMyNzMyNjk5NDA4MTE0NjQ3MDQNCisgICAgMSA0NTQyNS42MTMxNzU1NTAzNTU1ODY0MTY2NA0KKyAgICAwIDQ1NDI1Ljg1MzM5OTUxNjU0OTQzODUwNDk2DQorI2VuZGlmDQorDQorc3RhdGljIHBuZ191aW50XzMyDQorcG5nX2V4cChwbmdfZml4ZWRfcG9pbnQgeCkNCit7DQorICAgaWYgKHggPiAwICYmIHggPD0gMHhmZmZmZikgLyogRWxzZSBvdmVyZmxvdyBvciB6ZXJvICh1bmRlcmZsb3cpICovDQorICAgew0KKyAgICAgIC8qIE9idGFpbiBhIDQtYml0IGFwcHJveGltYXRpb24gKi8NCisgICAgICBwbmdfdWludF8zMiBlID0gcG5nXzMyYml0X2V4cFsoeCA+PiAxMikgJiAweGZdOw0KKw0KKyAgICAgIC8qIEluY29ycG9yYXRlIHRoZSBsb3cgMTIgYml0cyAtIHRoZXNlIGRlY3JlYXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBieQ0KKyAgICAgICAqIG11bHRpcGx5aW5nIGJ5IGEgbnVtYmVyIGxlc3MgdGhhbiAxIGlmIHRoZSBiaXQgaXMgc2V0LiAgVGhlIG11bHRpcGxpZXINCisgICAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhYm92ZSB0YWJsZSBhbmQgdGhlIHNoaWZ0LiBOb3RpY2UgdGhhdCB0aGUgdmFsdWVzDQorICAgICAgICogY29udmVyZ2Ugb24gNDU0MjYgYW5kIHRoaXMgaXMgdXNlZCB0byBhbGxvdyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiB0aGUNCisgICAgICAgKiBsb3cgYml0cy4NCisgICAgICAgKi8NCisgICAgICBpZiAoeCAmIDB4ODAwKQ0KKyAgICAgICAgIGUgLT0gKCgoZSA+PiAxNikgKiA0NDkzOFUpICsgIDE2VSkgPj4gNTsNCisNCisgICAgICBpZiAoeCAmIDB4NDAwKQ0KKyAgICAgICAgIGUgLT0gKCgoZSA+PiAxNikgKiA0NTE4MVUpICsgIDMyVSkgPj4gNjsNCisNCisgICAgICBpZiAoeCAmIDB4MjAwKQ0KKyAgICAgICAgIGUgLT0gKCgoZSA+PiAxNikgKiA0NTMwM1UpICsgIDY0VSkgPj4gNzsNCisNCisgICAgICBpZiAoeCAmIDB4MTAwKQ0KKyAgICAgICAgIGUgLT0gKCgoZSA+PiAxNikgKiA0NTM2NVUpICsgMTI4VSkgPj4gODsNCisNCisgICAgICBpZiAoeCAmIDB4MDgwKQ0KKyAgICAgICAgIGUgLT0gKCgoZSA+PiAxNikgKiA0NTM5NVUpICsgMjU2VSkgPj4gOTsNCisNCisgICAgICBpZiAoeCAmIDB4MDQwKQ0KKyAgICAgICAgIGUgLT0gKCgoZSA+PiAxNikgKiA0NTQxMFUpICsgNTEyVSkgPj4gMTA7DQorDQorICAgICAgLyogQW5kIGhhbmRsZSB0aGUgbG93IDYgYml0cyBpbiBhIHNpbmdsZSBibG9jay4gKi8NCisgICAgICBlIC09ICgoKGUgPj4gMTYpICogMzU1VSAqICh4ICYgMHgzZlUpKSArIDI1NlUpID4+IDk7DQorDQorICAgICAgLyogSGFuZGxlIHRoZSB1cHBlciBiaXRzIG9mIHguICovDQorICAgICAgZSA+Pj0geCA+PiAxNjsNCisgICAgICByZXR1cm4gZTsNCisgICB9DQorDQorICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovDQorICAgaWYgKHggPD0gMCkNCisgICAgICByZXR1cm4gcG5nXzMyYml0X2V4cFswXTsNCisNCisgICAvKiBFbHNlIHVuZGVyZmxvdyAqLw0KKyAgIHJldHVybiAwOw0KK30NCisNCitzdGF0aWMgcG5nX2J5dGUNCitwbmdfZXhwOGJpdChwbmdfZml4ZWRfcG9pbnQgbGcyKQ0KK3sNCisgICAvKiBHZXQgYSAzMi1iaXQgdmFsdWU6ICovDQorICAgcG5nX3VpbnRfMzIgeCA9IHBuZ19leHAobGcyKTsNCisNCisgICAvKiBDb252ZXJ0IHRoZSAzMi1iaXQgdmFsdWUgdG8gMC4uMjU1IGJ5IG11bHRpcGx5aW5nIGJ5IDI1Ni0xLCBub3RlIHRoYXQgdGhlDQorICAgICogc2Vjb25kLCByb3VuZGluZywgc3RlcCBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlIG9mIHRoZSBmaXJzdCwgc3VidHJhY3Rpb24sDQorICAgICogc3RlcC4NCisgICAgKi8NCisgICB4IC09IHggPj4gODsNCisgICByZXR1cm4gKHBuZ19ieXRlKSgoeCArIDB4N2ZmZmZmVSkgPj4gMjQpOw0KK30NCisNCitzdGF0aWMgcG5nX3VpbnRfMTYNCitwbmdfZXhwMTZiaXQocG5nX2ZpeGVkX3BvaW50IGxnMikNCit7DQorICAgLyogR2V0IGEgMzItYml0IHZhbHVlOiAqLw0KKyAgIHBuZ191aW50XzMyIHggPSBwbmdfZXhwKGxnMik7DQorDQorICAgLyogQ29udmVydCB0aGUgMzItYml0IHZhbHVlIHRvIDAuLjY1NTM1IGJ5IG11bHRpcGx5aW5nIGJ5IDY1NTM2LTE6ICovDQorICAgeCAtPSB4ID4+IDE2Ow0KKyAgIHJldHVybiAocG5nX3VpbnRfMTYpKCh4ICsgMzI3NjdVKSA+PiAxNik7DQorfQ0KKyNlbmRpZiAvKiBGTE9BVElOR19BUklUSE1FVElDICovDQorDQorcG5nX2J5dGUNCitwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KHVuc2lnbmVkIGludCB2YWx1ZSwgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbCkNCit7DQorICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8IDI1NSkNCisgICB7DQorIyAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEDQorICAgICAgICAgZG91YmxlIHIgPSBmbG9vcigyNTUqcG93KHZhbHVlLzI1NS4sZ2FtbWFfdmFsKi4wMDAwMSkrLjUpOw0KKyAgICAgICAgIHJldHVybiAocG5nX2J5dGUpcjsNCisjICAgICBlbHNlDQorICAgICAgICAgcG5nX2ludF8zMiBsZzIgPSBwbmdfbG9nOGJpdCh2YWx1ZSk7DQorICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlczsNCisNCisgICAgICAgICBpZiAocG5nX211bGRpdigmcmVzLCBnYW1tYV92YWwsIGxnMiwgUE5HX0ZQXzEpKQ0KKyAgICAgICAgICAgIHJldHVybiBwbmdfZXhwOGJpdChyZXMpOw0KKw0KKyAgICAgICAgIC8qIE92ZXJmbG93LiAqLw0KKyAgICAgICAgIHZhbHVlID0gMDsNCisjICAgICBlbmRpZg0KKyAgIH0NCisNCisgICByZXR1cm4gKHBuZ19ieXRlKXZhbHVlOw0KK30NCisNCitwbmdfdWludF8xNg0KK3BuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KHVuc2lnbmVkIGludCB2YWx1ZSwgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbCkNCit7DQorICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8IDY1NTM1KQ0KKyAgIHsNCisjICAgICBpZmRlZiBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQNCisgICAgICAgICBkb3VibGUgciA9IGZsb29yKDY1NTM1KnBvdyh2YWx1ZS82NTUzNS4sZ2FtbWFfdmFsKi4wMDAwMSkrLjUpOw0KKyAgICAgICAgIHJldHVybiAocG5nX3VpbnRfMTYpcjsNCisjICAgICBlbHNlDQorICAgICAgICAgcG5nX2ludF8zMiBsZzIgPSBwbmdfbG9nMTZiaXQodmFsdWUpOw0KKyAgICAgICAgIHBuZ19maXhlZF9wb2ludCByZXM7DQorDQorICAgICAgICAgaWYgKHBuZ19tdWxkaXYoJnJlcywgZ2FtbWFfdmFsLCBsZzIsIFBOR19GUF8xKSkNCisgICAgICAgICAgICByZXR1cm4gcG5nX2V4cDE2Yml0KHJlcyk7DQorDQorICAgICAgICAgLyogT3ZlcmZsb3cuICovDQorICAgICAgICAgdmFsdWUgPSAwOw0KKyMgICAgIGVuZGlmDQorICAgfQ0KKw0KKyAgIHJldHVybiAocG5nX3VpbnRfMTYpdmFsdWU7DQorfQ0KKw0KKy8qIFRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcgYmFzZWQgb24gdGhlIGJpdF9kZXB0aCBmaWVsZCBvZiB0aGUNCisgKiBwbmdfc3RydWN0LCBpbnRlcnByZXRpbmcgdmFsdWVzIGFzIDgtYml0IG9yIDE2LWJpdC4gIFdoaWxlIHRoZSByZXN1bHQNCisgKiBpcyBub21pbmFsbHkgYSAxNi1iaXQgdmFsdWUgaWYgYml0IGRlcHRoIGlzIDggdGhlbiB0aGUgcmVzdWx0IGlzDQorICogOC1iaXQgKGFzIGFyZSB0aGUgYXJndW1lbnRzLikNCisgKi8NCitwbmdfdWludF8xNiAvKiBQUklWQVRFICovDQorcG5nX2dhbW1hX2NvcnJlY3QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHVuc2lnbmVkIGludCB2YWx1ZSwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbCkNCit7DQorICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgIHJldHVybiBwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0KHZhbHVlLCBnYW1tYV92YWwpOw0KKw0KKyAgIGVsc2UNCisgICAgICByZXR1cm4gcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QodmFsdWUsIGdhbW1hX3ZhbCk7DQorfQ0KKw0KKy8qIEludGVybmFsIGZ1bmN0aW9uIHRvIGJ1aWxkIGEgc2luZ2xlIDE2LWJpdCB0YWJsZSAtIHRoZSB0YWJsZSBjb25zaXN0cyBvZg0KKyAqICdudW0nIDI1NiBlbnRyeSBzdWJ0YWJsZXMsIHdoZXJlICdudW0nIGlzIGRldGVybWluZWQgYnkgJ3NoaWZ0JyAtIHRoZSBhbW91bnQNCisgKiB0byBzaGlmdCB0aGUgaW5wdXQgdmFsdWVzIHJpZ2h0IChvciAxNi1udW1iZXJfb2Zfc2lnbmlmaWFudF9iaXRzKS4NCisgKg0KKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHRhYmxlIGdldHMgY2xlYW5lZCB1cCBvbg0KKyAqIHBuZ19lcnJvciAoaS5lLiBpZiBvbmUgb2YgdGhlIG1hbGxvY3MgYmVsb3cgZmFpbHMpIC0gaS5lLiB0aGUgKnRhYmxlIGFyZ3VtZW50DQorICogc2hvdWxkIGJlIHNvbWV3aGVyZSB0aGF0IHdpbGwgYmUgY2xlYW5lZC4NCisgKi8NCitzdGF0aWMgdm9pZA0KK3BuZ19idWlsZF8xNmJpdF90YWJsZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMTZwcCAqcHRhYmxlLA0KKyAgIFBOR19DT05TVCB1bnNpZ25lZCBpbnQgc2hpZnQsIFBOR19DT05TVCBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsKQ0KK3sNCisgICAvKiBWYXJpb3VzIHZhbHVlcyBkZXJpdmVkIGZyb20gJ3NoaWZ0JzogKi8NCisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG51bSA9IDFVIDw8ICg4VSAtIHNoaWZ0KTsNCisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG1heCA9ICgxVSA8PCAoMTZVIC0gc2hpZnQpKS0xVTsNCisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG1heF9ieV8yID0gMVUgPDwgKDE1VS1zaGlmdCk7DQorICAgdW5zaWduZWQgaW50IGk7DQorDQorICAgcG5nX3VpbnRfMTZwcCB0YWJsZSA9ICpwdGFibGUgPQ0KKyAgICAgICAocG5nX3VpbnRfMTZwcClwbmdfY2FsbG9jKHBuZ19wdHIsIG51bSAqIChzaXplb2YgKHBuZ191aW50XzE2cCkpKTsNCisNCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgew0KKyAgICAgIHBuZ191aW50XzE2cCBzdWJfdGFibGUgPSB0YWJsZVtpXSA9DQorICAgICAgICAgIChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLCAyNTYgKiAoc2l6ZW9mIChwbmdfdWludF8xNikpKTsNCisNCisgICAgICAvKiBUaGUgJ3RocmVzaG9sZCcgdGVzdCBpcyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgaXQgY2FuIGFyaXNlIGZvciBvbmUgb2YNCisgICAgICAgKiB0aGUgMTYtYml0IHRhYmxlcyBldmVuIGlmIHRoZSBvdGhlcnMgZG9uJ3QgaGl0IGl0Lg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChwbmdfZ2FtbWFfc2lnbmlmaWNhbnQoZ2FtbWFfdmFsKSkNCisgICAgICB7DQorICAgICAgICAgLyogVGhlIG9sZCBjb2RlIHdvdWxkIG92ZXJmbG93IGF0IHRoZSBlbmQgYW5kIHRoaXMgd291bGQgY2F1c2UgdGhlDQorICAgICAgICAgICogJ3BvdycgZnVuY3Rpb24gdG8gcmV0dXJuIGEgcmVzdWx0ID4xLCByZXN1bHRpbmcgaW4gYW4NCisgICAgICAgICAgKiBhcml0aG1ldGljIGVycm9yLiAgVGhpcyBjb2RlIGZvbGxvd3MgdGhlIHNwZWMgZXhhY3RseTsgaWcgaXMNCisgICAgICAgICAgKiB0aGUgcmVjb3ZlcmVkIGlucHV0IHNhbXBsZSwgaXQgYWx3YXlzIGhhcyA4LTE2IGJpdHMuDQorICAgICAgICAgICoNCisgICAgICAgICAgKiBXZSB3YW50IGlucHV0ICogNjU1MzUvbWF4LCByb3VuZGVkLCB0aGUgYXJpdGhtZXRpYyBmaXRzIGluIDMyDQorICAgICAgICAgICogYml0cyAodW5zaWduZWQpIHNvIGxvbmcgYXMgbWF4IDw9IDMyNzY3Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHVuc2lnbmVkIGludCBqOw0KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaWcgPSAoaiA8PCAoOC1zaGlmdCkpICsgaTsNCisjICAgICAgICAgICBpZmRlZiBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQNCisgICAgICAgICAgICAgICAvKiBJbmxpbmUgdGhlICdtYXgnIHNjYWxpbmcgb3BlcmF0aW9uOiAqLw0KKyAgICAgICAgICAgICAgIGRvdWJsZSBkID0gZmxvb3IoNjU1MzUqcG93KGlnLyhkb3VibGUpbWF4LCBnYW1tYV92YWwqLjAwMDAxKSsuNSk7DQorICAgICAgICAgICAgICAgc3ViX3RhYmxlW2pdID0gKHBuZ191aW50XzE2KWQ7DQorIyAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIGlmIChzaGlmdCkNCisgICAgICAgICAgICAgICAgICBpZyA9IChpZyAqIDY1NTM1VSArIG1heF9ieV8yKS9tYXg7DQorDQorICAgICAgICAgICAgICAgc3ViX3RhYmxlW2pdID0gcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QoaWcsIGdhbW1hX3ZhbCk7DQorIyAgICAgICAgICAgZW5kaWYNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgLyogV2UgbXVzdCBzdGlsbCBidWlsZCBhIHRhYmxlLCBidXQgZG8gaXQgdGhlIGZhc3Qgd2F5LiAqLw0KKyAgICAgICAgIHVuc2lnbmVkIGludCBqOw0KKw0KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaWcgPSAoaiA8PCAoOC1zaGlmdCkpICsgaTsNCisNCisgICAgICAgICAgICBpZiAoc2hpZnQpDQorICAgICAgICAgICAgICAgaWcgPSAoaWcgKiA2NTUzNVUgKyBtYXhfYnlfMikvbWF4Ow0KKw0KKyAgICAgICAgICAgIHN1Yl90YWJsZVtqXSA9IChwbmdfdWludF8xNilpZzsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCit9DQorDQorLyogTk9URTogdGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoZSAqaW52ZXJzZSogb2YgdGhlIG92ZXJhbGwgZ2FtbWEgdHJhbnNmb3JtYXRpb24NCisgKiByZXF1aXJlZC4NCisgKi8NCitzdGF0aWMgdm9pZA0KK3BuZ19idWlsZF8xNnRvOF90YWJsZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMTZwcCAqcHRhYmxlLA0KKyAgIFBOR19DT05TVCB1bnNpZ25lZCBpbnQgc2hpZnQsIFBOR19DT05TVCBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsKQ0KK3sNCisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG51bSA9IDFVIDw8ICg4VSAtIHNoaWZ0KTsNCisgICBQTkdfQ09OU1QgdW5zaWduZWQgaW50IG1heCA9ICgxVSA8PCAoMTZVIC0gc2hpZnQpKS0xVTsNCisgICB1bnNpZ25lZCBpbnQgaTsNCisgICBwbmdfdWludF8zMiBsYXN0Ow0KKw0KKyAgIHBuZ191aW50XzE2cHAgdGFibGUgPSAqcHRhYmxlID0NCisgICAgICAgKHBuZ191aW50XzE2cHApcG5nX2NhbGxvYyhwbmdfcHRyLCBudW0gKiAoc2l6ZW9mIChwbmdfdWludF8xNnApKSk7DQorDQorICAgLyogJ251bScgaXMgdGhlIG51bWJlciBvZiB0YWJsZXMgYW5kIGFsc28gdGhlIG51bWJlciBvZiBsb3cgYml0cyBvZiBsb3cNCisgICAgKiBiaXRzIG9mIHRoZSBpbnB1dCAxNi1iaXQgdmFsdWUgdXNlZCB0byBzZWxlY3QgYSB0YWJsZS4gIEVhY2ggdGFibGUgaXMNCisgICAgKiBpdHNlbGYgaW5kZXggYnkgdGhlIGhpZ2ggOCBiaXRzIG9mIHRoZSB2YWx1ZS4NCisgICAgKi8NCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgICAgdGFibGVbaV0gPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgMjU2ICogKHNpemVvZiAocG5nX3VpbnRfMTYpKSk7DQorDQorICAgLyogJ2dhbW1hX3ZhbCcgaXMgc2V0IHRvIHRoZSByZWNpcHJvY2FsIG9mIHRoZSB2YWx1ZSBjYWxjdWxhdGVkIGFib3ZlLCBzbw0KKyAgICAqIHBvdyhvdXQsZykgaXMgYW4gKmlucHV0KiB2YWx1ZS4gICdsYXN0JyBpcyB0aGUgbGFzdCBpbnB1dCB2YWx1ZSBzZXQuDQorICAgICoNCisgICAgKiBJbiB0aGUgbG9vcCAnaScgaXMgdXNlZCB0byBmaW5kIG91dHB1dCB2YWx1ZXMuICBTaW5jZSB0aGUgb3V0cHV0IGlzDQorICAgICogOC1iaXQgdGhlcmUgYXJlIG9ubHkgMjU2IHBvc3NpYmxlIHZhbHVlcy4gIFRoZSB0YWJsZXMgYXJlIHNldCB1cCB0bw0KKyAgICAqIHNlbGVjdCB0aGUgY2xvc2VzdCBwb3NzaWJsZSBvdXRwdXQgdmFsdWUgZm9yIGVhY2ggaW5wdXQgYnkgZmluZGluZw0KKyAgICAqIHRoZSBpbnB1dCB2YWx1ZSBhdCB0aGUgYm91bmRhcnkgYmV0d2VlbiBlYWNoIHBhaXIgb2Ygb3V0cHV0IHZhbHVlcw0KKyAgICAqIGFuZCBmaWxsaW5nIHRoZSB0YWJsZSB1cCB0byB0aGF0IGJvdW5kYXJ5IHdpdGggdGhlIGxvd2VyIG91dHB1dA0KKyAgICAqIHZhbHVlLg0KKyAgICAqDQorICAgICogVGhlIGJvdW5kYXJ5IHZhbHVlcyBhcmUgMC41LDEuNS4uMjUzLjUsMjU0LjUuICBTaW5jZSB0aGVzZSBhcmUgOS1iaXQNCisgICAgKiB2YWx1ZXMgdGhlIGNvZGUgYmVsb3cgdXNlcyBhIDE2LWJpdCB2YWx1ZSBpbiBpOyB0aGUgdmFsdWVzIHN0YXJ0IGF0DQorICAgICogMTI4LjUgKGZvciAwLjUpIGFuZCBzdGVwIGJ5IDI1NywgZm9yIGEgdG90YWwgb2YgMjU0IHZhbHVlcyAodGhlIGxhc3QNCisgICAgKiBlbnRyaWVzIGFyZSBmaWxsZWQgd2l0aCAyNTUpLiAgU3RhcnQgaSBhdCAxMjggYW5kIGZpbGwgYWxsICdsYXN0Jw0KKyAgICAqIHRhYmxlIGVudHJpZXMgPD0gJ21heCcNCisgICAgKi8NCisgICBsYXN0ID0gMDsNCisgICBmb3IgKGkgPSAwOyBpIDwgMjU1OyArK2kpIC8qIDgtYml0IG91dHB1dCB2YWx1ZSAqLw0KKyAgIHsNCisgICAgICAvKiBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIG1heGltdW0gaW5wdXQgdmFsdWUgKi8NCisgICAgICBwbmdfdWludF8xNiBvdXQgPSAocG5nX3VpbnRfMTYpKGkgKiAyNTdVKTsgLyogMTYtYml0IG91dHB1dCB2YWx1ZSAqLw0KKw0KKyAgICAgIC8qIEZpbmQgdGhlIGJvdW5kYXJ5IHZhbHVlIGluIDE2IGJpdHM6ICovDQorICAgICAgcG5nX3VpbnRfMzIgYm91bmQgPSBwbmdfZ2FtbWFfMTZiaXRfY29ycmVjdChvdXQrMTI4VSwgZ2FtbWFfdmFsKTsNCisNCisgICAgICAvKiBBZGp1c3QgKHJvdW5kKSB0byAoMTYtc2hpZnQpIGJpdHM6ICovDQorICAgICAgYm91bmQgPSAoYm91bmQgKiBtYXggKyAzMjc2OFUpLzY1NTM1VSArIDFVOw0KKw0KKyAgICAgIHdoaWxlIChsYXN0IDwgYm91bmQpDQorICAgICAgew0KKyAgICAgICAgIHRhYmxlW2xhc3QgJiAoMHhmZlUgPj4gc2hpZnQpXVtsYXN0ID4+ICg4VSAtIHNoaWZ0KV0gPSBvdXQ7DQorICAgICAgICAgbGFzdCsrOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgLyogQW5kIGZpbGwgaW4gdGhlIGZpbmFsIGVudHJpZXMuICovDQorICAgd2hpbGUgKGxhc3QgPCAobnVtIDw8IDgpKQ0KKyAgIHsNCisgICAgICB0YWJsZVtsYXN0ICYgKDB4ZmYgPj4gc2hpZnQpXVtsYXN0ID4+ICg4VSAtIHNoaWZ0KV0gPSA2NTUzNVU7DQorICAgICAgbGFzdCsrOw0KKyAgIH0NCit9DQorDQorLyogQnVpbGQgYSBzaW5nbGUgOC1iaXQgdGFibGU6IHNhbWUgYXMgdGhlIDE2LWJpdCBjYXNlIGJ1dCBtdWNoIHNpbXBsZXIgKGFuZA0KKyAqIHR5cGljYWxseSBtdWNoIGZhc3RlcikuICBOb3RlIHRoYXQgbGlicG5nIGN1cnJlbnRseSBkb2VzIG5vIHNCSVQgcHJvY2Vzc2luZw0KKyAqIChhcHBhcmVudGx5IGNvbnRyYXJ5IHRvIHRoZSBzcGVjKSBzbyBhIDI1NiBlbnRyeSB0YWJsZSBpcyBhbHdheXMgZ2VuZXJhdGVkLg0KKyAqLw0KK3N0YXRpYyB2b2lkDQorcG5nX2J1aWxkXzhiaXRfdGFibGUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgcHRhYmxlLA0KKyAgIFBOR19DT05TVCBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsKQ0KK3sNCisgICB1bnNpZ25lZCBpbnQgaTsNCisgICBwbmdfYnl0ZXAgdGFibGUgPSAqcHRhYmxlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIDI1Nik7DQorDQorICAgaWYgKHBuZ19nYW1tYV9zaWduaWZpY2FudChnYW1tYV92YWwpKSBmb3IgKGk9MDsgaTwyNTY7IGkrKykNCisgICAgICB0YWJsZVtpXSA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QoaSwgZ2FtbWFfdmFsKTsNCisNCisgICBlbHNlIGZvciAoaT0wOyBpPDI1NjsgKytpKQ0KKyAgICAgIHRhYmxlW2ldID0gKHBuZ19ieXRlKWk7DQorfQ0KKw0KKy8qIFVzZWQgZnJvbSBwbmdfcmVhZF9kZXN0cm95IGFuZCBiZWxvdyB0byByZWxlYXNlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgZ2FtbWENCisgKiB0YWJsZXMuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2Rlc3Ryb3lfZ2FtbWFfdGFibGUocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hX3RhYmxlKTsNCisgICBwbmdfcHRyLT5nYW1tYV90YWJsZSA9IE5VTEw7DQorDQorICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlICE9IE5VTEwpDQorICAgew0KKyAgICAgIGludCBpOw0KKyAgICAgIGludCBpc3RvcCA9ICgxIDw8ICg4IC0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQpKTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykNCisgICAgICB7DQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbaV0pOw0KKyAgICAgIH0NCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSk7DQorICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUgPSBOVUxMOw0KKyAgIH0NCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpIHx8IFwNCisgICBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV9mcm9tXzEpOw0KKyAgIHBuZ19wdHItPmdhbW1hX2Zyb21fMSA9IE5VTEw7DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfdG9fMSk7DQorICAgcG5nX3B0ci0+Z2FtbWFfdG9fMSA9IE5VTEw7DQorDQorICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBpbnQgaXN0b3AgPSAoMSA8PCAoOCAtIHBuZ19wdHItPmdhbW1hX3NoaWZ0KSk7DQorICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspDQorICAgICAgew0KKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMVtpXSk7DQorICAgICAgfQ0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSk7DQorICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xID0gTlVMTDsNCisgICB9DQorICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X3RvXzEgIT0gTlVMTCkNCisgICB7DQorICAgICAgaW50IGk7DQorICAgICAgaW50IGlzdG9wID0gKDEgPDwgKDggLSBwbmdfcHRyLT5nYW1tYV9zaGlmdCkpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90b18xW2ldKTsNCisgICAgICB9DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSk7DQorICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSA9IE5VTEw7DQorICAgfQ0KKyNlbmRpZiAvKiBSRUFEX0JBQ0tHUk9VTkQgfHwgUkVBRF9BTFBIQV9NT0RFIHx8IFJHQl9UT19HUkFZICovDQorfQ0KKw0KKy8qIFdlIGJ1aWxkIHRoZSA4LSBvciAxNi1iaXQgZ2FtbWEgdGFibGVzIGhlcmUuICBOb3RlIHRoYXQgZm9yIDE2LWJpdA0KKyAqIHRhYmxlcywgd2UgZG9uJ3QgbWFrZSBhIGZ1bGwgdGFibGUgaWYgd2UgYXJlIHJlZHVjaW5nIHRvIDgtYml0IGluDQorICogdGhlIGZ1dHVyZS4gIE5vdGUgYWxzbyBob3cgdGhlIGdhbW1hXzE2IHRhYmxlcyBhcmUgc2VnbWVudGVkIHNvIHRoYXQNCisgKiB3ZSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlID4gNjRLIGNodW5rcyBmb3IgYSBmdWxsIDE2LWJpdCB0YWJsZS4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfYnVpbGRfZ2FtbWFfdGFibGUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBiaXRfZGVwdGgpDQorew0KKyAgcG5nX2RlYnVnKDEsICJpbiBwbmdfYnVpbGRfZ2FtbWFfdGFibGUiKTsNCisNCisgIC8qIFJlbW92ZSBhbnkgZXhpc3RpbmcgdGFibGU7IHRoaXMgY29wZXMgd2l0aCBtdWx0aXBsZSBjYWxscyB0bw0KKyAgICogcG5nX3JlYWRfdXBkYXRlX2luZm8uICBUaGUgd2FybmluZyBpcyBiZWNhdXNlIGJ1aWxkaW5nIHRoZSBnYW1tYSB0YWJsZXMNCisgICAqIG11bHRpcGxlIHRpbWVzIGlzIGEgcGVyZm9ybWFuY2UgaGl0IC0gaXQncyBoYXJtbGVzcyBidXQgdGhlIGFiaWxpdHkgdG8gY2FsbA0KKyAgICogcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBtdWx0aXBsZSB0aW1lcyBpcyBuZXcgaW4gMS41LjYgc28gaXQgc2VlbXMgc2Vuc2libGUNCisgICAqIHRvIHdhcm4gaWYgdGhlIGFwcCBpbnRyb2R1Y2VzIHN1Y2ggYSBoaXQuDQorICAgKi8NCisgIGlmIChwbmdfcHRyLT5nYW1tYV90YWJsZSAhPSBOVUxMIHx8IHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlICE9IE5VTEwpDQorICB7DQorICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJnYW1tYSB0YWJsZSBiZWluZyByZWJ1aWx0Iik7DQorICAgIHBuZ19kZXN0cm95X2dhbW1hX3RhYmxlKHBuZ19wdHIpOw0KKyAgfQ0KKw0KKyAgaWYgKGJpdF9kZXB0aCA8PSA4KQ0KKyAgew0KKyAgICAgcG5nX2J1aWxkXzhiaXRfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hX3RhYmxlLA0KKyAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA+IDAgPyAgcG5nX3JlY2lwcm9jYWwyKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEsDQorICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKSA6IFBOR19GUF8xKTsNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpIHx8IFwNCisgICBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkNCisgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0NPTVBPU0UgfCBQTkdfUkdCX1RPX0dSQVkpKQ0KKyAgICAgew0KKyAgICAgICAgcG5nX2J1aWxkXzhiaXRfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hX3RvXzEsDQorICAgICAgICAgICAgcG5nX3JlY2lwcm9jYWwocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSkpOw0KKw0KKyAgICAgICAgcG5nX2J1aWxkXzhiaXRfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hX2Zyb21fMSwNCisgICAgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwID8gIHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPnNjcmVlbl9nYW1tYSkgOg0KKyAgICAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLyk7DQorICAgICB9DQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgfHwgUkdCX1RPX0dSQVkgKi8NCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgIHBuZ19ieXRlIHNoaWZ0LCBzaWdfYml0Ow0KKw0KKyAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikNCisgICAgIHsNCisgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LnJlZDsNCisNCisgICAgICAgIGlmIChwbmdfcHRyLT5zaWdfYml0LmdyZWVuID4gc2lnX2JpdCkNCisgICAgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LmdyZWVuOw0KKw0KKyAgICAgICAgaWYgKHBuZ19wdHItPnNpZ19iaXQuYmx1ZSA+IHNpZ19iaXQpDQorICAgICAgICAgICBzaWdfYml0ID0gcG5nX3B0ci0+c2lnX2JpdC5ibHVlOw0KKyAgICAgfQ0KKyAgICAgZWxzZQ0KKyAgICAgICAgc2lnX2JpdCA9IHBuZ19wdHItPnNpZ19iaXQuZ3JheTsNCisNCisgICAgIC8qIDE2LWJpdCBnYW1tYSBjb2RlIHVzZXMgdGhpcyBlcXVhdGlvbjoNCisgICAgICAqDQorICAgICAgKiAgIG92ID0gdGFibGVbKGl2ICYgMHhmZikgPj4gZ2FtbWFfc2hpZnRdW2l2ID4+IDhdDQorICAgICAgKg0KKyAgICAgICogV2hlcmUgJ2l2JyBpcyB0aGUgaW5wdXQgY29sb3IgdmFsdWUgYW5kICdvdicgaXMgdGhlIG91dHB1dCB2YWx1ZSAtDQorICAgICAgKiBwb3coaXYsIGdhbW1hKS4NCisgICAgICAqDQorICAgICAgKiBUaHVzIHRoZSBnYW1tYSB0YWJsZSBjb25zaXN0cyBvZiB1cCB0byAyNTYgMjU2IGVudHJ5IHRhYmxlcy4gIFRoZSB0YWJsZQ0KKyAgICAgICogaXMgc2VsZWN0ZWQgYnkgdGhlICg4LWdhbW1hX3NoaWZ0KSBtb3N0IHNpZ25pZmljYW50IG9mIHRoZSBsb3cgOCBiaXRzIG9mDQorICAgICAgKiB0aGUgY29sb3IgdmFsdWUgdGhlbiBpbmRleGVkIGJ5IHRoZSB1cHBlciA4IGJpdHM6DQorICAgICAgKg0KKyAgICAgICogICB0YWJsZVtsb3cgYml0c11baGlnaCA4IGJpdHNdDQorICAgICAgKg0KKyAgICAgICogU28gdGhlIHRhYmxlICduJyBjb3JyZXNwb25kcyB0byBhbGwgdGhvc2UgJ2l2JyBvZjoNCisgICAgICAqDQorICAgICAgKiAgIDxhbGwgaGlnaCA4LWJpdCB2YWx1ZXM+PG4gPDwgZ2FtbWFfc2hpZnQ+Li48KG4rMSA8PCBnYW1tYV9zaGlmdCktMT4NCisgICAgICAqDQorICAgICAgKi8NCisgICAgIGlmIChzaWdfYml0ID4gMCAmJiBzaWdfYml0IDwgMTZVKQ0KKyAgICAgICAgc2hpZnQgPSAocG5nX2J5dGUpKDE2VSAtIHNpZ19iaXQpOyAvKiBzaGlmdCA9PSBpbnNpZ25pZmljYW50IGJpdHMgKi8NCisNCisgICAgIGVsc2UNCisgICAgICAgIHNoaWZ0ID0gMDsgLyoga2VlcCBhbGwgMTYgYml0cyAqLw0KKw0KKyAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfMTZfVE9fOCB8IFBOR19TQ0FMRV8xNl9UT184KSkNCisgICAgIHsNCisgICAgICAgIC8qIFBOR19NQVhfR0FNTUFfOCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8ga2VlcCAtIGVmZmVjdGl2ZWx5DQorICAgICAgICAgKiB0aGUgc2lnbmlmaWNhbnQgYml0cyBpbiB0aGUgKmlucHV0KiB3aGVuIHRoZSBvdXRwdXQgd2lsbA0KKyAgICAgICAgICogZXZlbnR1YWxseSBiZSA4IGJpdHMuICBCeSBkZWZhdWx0IGl0IGlzIDExLg0KKyAgICAgICAgICovDQorICAgICAgICBpZiAoc2hpZnQgPCAoMTZVIC0gUE5HX01BWF9HQU1NQV84KSkNCisgICAgICAgICAgIHNoaWZ0ID0gKDE2VSAtIFBOR19NQVhfR0FNTUFfOCk7DQorICAgICB9DQorDQorICAgICBpZiAoc2hpZnQgPiA4VSkNCisgICAgICAgIHNoaWZ0ID0gOFU7IC8qIEd1YXJhbnRlZXMgYXQgbGVhc3Qgb25lIHRhYmxlISAqLw0KKw0KKyAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnQgPSBzaGlmdDsNCisNCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRA0KKyAgICAgLyogTk9URTogcHJpb3IgdG8gMS41LjQgdGhpcyB0ZXN0IHVzZWQgdG8gaW5jbHVkZSBQTkdfQkFDS0dST1VORCAobm93DQorICAgICAgKiBQTkdfQ09NUE9TRSkuICBUaGlzIGVmZmVjdGl2ZWx5IHNtYXNoZWQgdGhlIGJhY2tncm91bmQgY2FsY3VsYXRpb24gZm9yDQorICAgICAgKiAxNi1iaXQgb3V0cHV0IGJlY2F1c2UgdGhlIDgtYml0IHRhYmxlIGFzc3VtZXMgdGhlIHJlc3VsdCB3aWxsIGJlIHJlZHVjZWQNCisgICAgICAqIHRvIDggYml0cy4NCisgICAgICAqLw0KKyAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfMTZfVE9fOCB8IFBOR19TQ0FMRV8xNl9UT184KSkNCisjZW5kaWYNCisgICAgICAgICBwbmdfYnVpbGRfMTZ0bzhfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hXzE2X3RhYmxlLCBzaGlmdCwNCisgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwID8gcG5nX3Byb2R1Y3QyKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEsDQorICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKSA6IFBOR19GUF8xKTsNCisNCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRA0KKyAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19idWlsZF8xNmJpdF90YWJsZShwbmdfcHRyLCAmcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUsIHNoaWZ0LA0KKyAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA+IDAgPyBwbmdfcmVjaXByb2NhbDIocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSwNCisgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpIDogUE5HX0ZQXzEpOw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcDQorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQ0KKyAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfQ09NUE9TRSB8IFBOR19SR0JfVE9fR1JBWSkpDQorICAgICB7DQorICAgICAgICBwbmdfYnVpbGRfMTZiaXRfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hXzE2X3RvXzEsIHNoaWZ0LA0KKyAgICAgICAgICAgIHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpKTsNCisNCisgICAgICAgIC8qIE5vdGljZSB0aGF0IHRoZSAnMTYgZnJvbSAxJyB0YWJsZSBzaG91bGQgYmUgZnVsbCBwcmVjaXNpb24sIGhvd2V2ZXINCisgICAgICAgICAqIHRoZSBsb29rdXAgb24gdGhpcyB0YWJsZSBzdGlsbCB1c2VzIGdhbW1hX3NoaWZ0LCBzbyBpdCBjYW4ndCBiZS4NCisgICAgICAgICAqIFRPRE86IGZpeCB0aGlzLg0KKyAgICAgICAgICovDQorICAgICAgICBwbmdfYnVpbGRfMTZiaXRfdGFibGUocG5nX3B0ciwgJnBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSwgc2hpZnQsDQorICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID4gMCA/IHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPnNjcmVlbl9nYW1tYSkgOg0KKyAgICAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLyk7DQorICAgICB9DQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgfHwgUkdCX1RPX0dSQVkgKi8NCisgIH0NCit9DQorI2VuZGlmIC8qIFJFQURfR0FNTUEgKi8NCisNCisvKiBIQVJEV0FSRSBPUFRJT04gU1VQUE9SVCAqLw0KKyNpZmRlZiBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQNCitpbnQgUE5HQVBJDQorcG5nX3NldF9vcHRpb24ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBvcHRpb24sIGludCBvbm9mZikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBvcHRpb24gPj0gMCAmJiBvcHRpb24gPCBQTkdfT1BUSU9OX05FWFQgJiYNCisgICAgICAob3B0aW9uICYgMSkgPT0gMCkNCisgICB7DQorICAgICAgaW50IG1hc2sgPSAzIDw8IG9wdGlvbjsNCisgICAgICBpbnQgc2V0dGluZyA9ICgyICsgKG9ub2ZmICE9IDApKSA8PCBvcHRpb247DQorICAgICAgaW50IGN1cnJlbnQgPSBwbmdfcHRyLT5vcHRpb25zOw0KKw0KKyAgICAgIHBuZ19wdHItPm9wdGlvbnMgPSAocG5nX2J5dGUpKChjdXJyZW50ICYgfm1hc2spIHwgc2V0dGluZyk7DQorDQorICAgICAgcmV0dXJuIChjdXJyZW50ICYgbWFzaykgPj4gb3B0aW9uOw0KKyAgIH0NCisNCisgICByZXR1cm4gUE5HX09QVElPTl9JTlZBTElEOw0KK30NCisjZW5kaWYNCisNCisvKiBzUkdCIHN1cHBvcnQgKi8NCisjaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCkgfHxcDQorICAgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpDQorLyogc1JHQiBjb252ZXJzaW9uIHRhYmxlczsgdGhlc2UgYXJlIG1hY2hpbmUgZ2VuZXJhdGVkIHdpdGggdGhlIGNvZGUgaW4NCisgKiBjb250cmliL3Rvb2xzL21ha2VzUkdCLmMuICBUaGUgYWN0dWFsIHNSR0IgdHJhbnNmZXIgY3VydmUgZGVmaW5lZCBpbiB0aGUNCisgKiBzcGVjaWZpY2F0aW9uIChzZWUgdGhlIGFydGljbGUgYXQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUkdCKQ0KKyAqIGlzIHVzZWQsIG5vdCB0aGUgZ2FtbWE9MS8yLjIgYXBwcm94aW1hdGlvbiB1c2UgZWxzZXdoZXJlIGluIGxpYnBuZy4NCisgKiBUaGUgc1JHQiB0byBsaW5lYXIgdGFibGUgaXMgZXhhY3QgKHRvIHRoZSBuZWFyZXN0IDE2IGJpdCBsaW5lYXIgZnJhY3Rpb24pLg0KKyAqIFRoZSBpbnZlcnNlIChsaW5lYXIgdG8gc1JHQikgdGFibGUgaGFzIGFjY3VyYWNpZXMgYXMgZm9sbG93czoNCisgKg0KKyAqIEZvciBhbGwgcG9zc2libGUgKDI1NSo2NTUzNSsxKSBpbnB1dCB2YWx1ZXM6DQorICoNCisgKiAgICBlcnJvcjogLTAuNTE1NTY2IC0gMC42MjU5NzEsIDc5NDQxICgwLjQ3NTM2OSUpIG9mIHJlYWRpbmdzIGluZXhhY3QNCisgKg0KKyAqIEZvciB0aGUgaW5wdXQgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDY1NTM2IDE2LWJpdCB2YWx1ZXM6DQorICoNCisgKiAgICBlcnJvcjogLTAuNTEzNzI3IC0gMC42MDc3NTksIDMwOCAoMC40Njk5NzglKSBvZiByZWFkaW5ncyBpbmV4YWN0DQorICoNCisgKiBJbiBhbGwgY2FzZXMgdGhlIGluZXhhY3QgcmVhZGluZ3MgYXJlIG9mZiBieSBvbmUuDQorICovDQorDQorI2lmZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEDQorLyogVGhlIGNvbnZlcnQtdG8tc1JHQiB0YWJsZSBpcyBvbmx5IGN1cnJlbnRseSByZXF1aXJlZCBmb3IgcmVhZC4gKi8NCitjb25zdCBwbmdfdWludF8xNiBwbmdfc1JHQl90YWJsZVsyNTZdID0NCit7DQorICAgMCwyMCw0MCw2MCw4MCw5OSwxMTksMTM5LA0KKyAgIDE1OSwxNzksMTk5LDIxOSwyNDEsMjY0LDI4OCwzMTMsDQorICAgMzQwLDM2NywzOTYsNDI3LDQ1OCw0OTEsNTI2LDU2MiwNCisgICA1OTksNjM3LDY3Nyw3MTgsNzYxLDgwNSw4NTEsODk4LA0KKyAgIDk0Nyw5OTcsMTA0OCwxMTAxLDExNTYsMTIxMiwxMjcwLDEzMzAsDQorICAgMTM5MSwxNDUzLDE1MTcsMTU4MywxNjUxLDE3MjAsMTc5MCwxODYzLA0KKyAgIDE5MzcsMjAxMywyMDkwLDIxNzAsMjI1MCwyMzMzLDI0MTgsMjUwNCwNCisgICAyNTkyLDI2ODEsMjc3MywyODY2LDI5NjEsMzA1OCwzMTU3LDMyNTgsDQorICAgMzM2MCwzNDY0LDM1NzAsMzY3OCwzNzg4LDM5MDAsNDAxNCw0MTI5LA0KKyAgIDQyNDcsNDM2Niw0NDg4LDQ2MTEsNDczNiw0ODY0LDQ5OTMsNTEyNCwNCisgICA1MjU3LDUzOTIsNTUzMCw1NjY5LDU4MTAsNTk1Myw2MDk5LDYyNDYsDQorICAgNjM5NSw2NTQ3LDY3MDAsNjg1Niw3MDE0LDcxNzQsNzMzNSw3NTAwLA0KKyAgIDc2NjYsNzgzNCw4MDA0LDgxNzcsODM1Miw4NTI4LDg3MDgsODg4OSwNCisgICA5MDcyLDkyNTgsOTQ0NSw5NjM1LDk4MjgsMTAwMjIsMTAyMTksMTA0MTcsDQorICAgMTA2MTksMTA4MjIsMTEwMjgsMTEyMzUsMTE0NDYsMTE2NTgsMTE4NzMsMTIwOTAsDQorICAgMTIzMDksMTI1MzAsMTI3NTQsMTI5ODAsMTMyMDksMTM0NDAsMTM2NzMsMTM5MDksDQorICAgMTQxNDYsMTQzODcsMTQ2MjksMTQ4NzQsMTUxMjIsMTUzNzEsMTU2MjMsMTU4NzgsDQorICAgMTYxMzUsMTYzOTQsMTY2NTYsMTY5MjAsMTcxODcsMTc0NTYsMTc3MjcsMTgwMDEsDQorICAgMTgyNzcsMTg1NTYsMTg4MzcsMTkxMjEsMTk0MDcsMTk2OTYsMTk5ODcsMjAyODEsDQorICAgMjA1NzcsMjA4NzYsMjExNzcsMjE0ODEsMjE3ODcsMjIwOTYsMjI0MDcsMjI3MjEsDQorICAgMjMwMzgsMjMzNTcsMjM2NzgsMjQwMDIsMjQzMjksMjQ2NTgsMjQ5OTAsMjUzMjUsDQorICAgMjU2NjIsMjYwMDEsMjYzNDQsMjY2ODgsMjcwMzYsMjczODYsMjc3MzksMjgwOTQsDQorICAgMjg0NTIsMjg4MTMsMjkxNzYsMjk1NDIsMjk5MTEsMzAyODIsMzA2NTYsMzEwMzMsDQorICAgMzE0MTIsMzE3OTQsMzIxNzksMzI1NjcsMzI5NTcsMzMzNTAsMzM3NDUsMzQxNDMsDQorICAgMzQ1NDQsMzQ5NDgsMzUzNTUsMzU3NjQsMzYxNzYsMzY1OTEsMzcwMDgsMzc0MjksDQorICAgMzc4NTIsMzgyNzgsMzg3MDYsMzkxMzgsMzk1NzIsNDAwMDksNDA0NDksNDA4OTEsDQorICAgNDEzMzcsNDE3ODUsNDIyMzYsNDI2OTAsNDMxNDcsNDM2MDYsNDQwNjksNDQ1MzQsDQorICAgNDUwMDIsNDU0NzMsNDU5NDcsNDY0MjMsNDY5MDMsNDczODUsNDc4NzEsNDgzNTksDQorICAgNDg4NTAsNDkzNDQsNDk4NDEsNTAzNDEsNTA4NDQsNTEzNDksNTE4NTgsNTIzNjksDQorICAgNTI4ODQsNTM0MDEsNTM5MjEsNTQ0NDUsNTQ5NzEsNTU1MDAsNTYwMzIsNTY1NjcsDQorICAgNTcxMDUsNTc2NDYsNTgxOTAsNTg3MzcsNTkyODcsNTk4NDAsNjAzOTYsNjA5NTUsDQorICAgNjE1MTcsNjIwODIsNjI2NTAsNjMyMjEsNjM3OTUsNjQzNzIsNjQ5NTIsNjU1MzUNCit9Ow0KKw0KKyNlbmRpZiAvKiBzaW1wbGlmaWVkIHJlYWQgb25seSAqLw0KKw0KKy8qIFRoZSBiYXNlL2RlbHRhIHRhYmxlcyBhcmUgcmVxdWlyZWQgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUgKGJ1dCBjdXJyZW50bHkNCisgKiBvbmx5IHRoZSBzaW1wbGlmaWVkIHZlcnNpb25zLikNCisgKi8NCitjb25zdCBwbmdfdWludF8xNiBwbmdfc1JHQl9iYXNlWzUxMl0gPQ0KK3sNCisgICAxMjgsMTc4MiwzMzgzLDQ2NDQsNTY3NSw2NTY0LDczNTcsODA3NCwNCisgICA4NzMyLDkzNDYsOTkyMSwxMDQ2MywxMDk3NywxMTQ2NiwxMTkzNSwxMjM4NCwNCisgICAxMjgxNiwxMzIzMywxMzYzNCwxNDAyNCwxNDQwMiwxNDc2OSwxNTEyNSwxNTQ3MywNCisgICAxNTgxMiwxNjE0MiwxNjQ2NiwxNjc4MSwxNzA5MCwxNzM5MywxNzY5MCwxNzk4MSwNCisgICAxODI2NiwxODU0NiwxODgyMiwxOTA5MywxOTM1OSwxOTYyMSwxOTg3OSwyMDEzMywNCisgICAyMDM4MywyMDYzMCwyMDg3MywyMTExMywyMTM0OSwyMTU4MywyMTgxMywyMjA0MSwNCisgICAyMjI2NSwyMjQ4NywyMjcwNywyMjkyMywyMzEzOCwyMzM1MCwyMzU1OSwyMzc2NywNCisgICAyMzk3MiwyNDE3NSwyNDM3NiwyNDU3NSwyNDc3MiwyNDk2NywyNTE2MCwyNTM1MiwNCisgICAyNTU0MiwyNTczMCwyNTkxNiwyNjEwMSwyNjI4NCwyNjQ2NSwyNjY0NSwyNjgyMywNCisgICAyNzAwMCwyNzE3NiwyNzM1MCwyNzUyMywyNzY5NSwyNzg2NSwyODAzNCwyODIwMSwNCisgICAyODM2OCwyODUzMywyODY5NywyODg2MCwyOTAyMSwyOTE4MiwyOTM0MSwyOTUwMCwNCisgICAyOTY1NywyOTgxMywyOTk2OSwzMDEyMywzMDI3NiwzMDQyOSwzMDU4MCwzMDczMCwNCisgICAzMDg4MCwzMTAyOCwzMTE3NiwzMTMyMywzMTQ2OSwzMTYxNCwzMTc1OCwzMTkwMiwNCisgICAzMjA0NSwzMjE4NiwzMjMyNywzMjQ2OCwzMjYwNywzMjc0NiwzMjg4NCwzMzAyMSwNCisgICAzMzE1OCwzMzI5NCwzMzQyOSwzMzU2NCwzMzY5NywzMzgzMSwzMzk2MywzNDA5NSwNCisgICAzNDIyNiwzNDM1NywzNDQ4NiwzNDYxNiwzNDc0NCwzNDg3MywzNTAwMCwzNTEyNywNCisgICAzNTI1MywzNTM3OSwzNTUwNCwzNTYyOSwzNTc1MywzNTg3NiwzNTk5OSwzNjEyMiwNCisgICAzNjI0NCwzNjM2NSwzNjQ4NiwzNjYwNiwzNjcyNiwzNjg0NSwzNjk2NCwzNzA4MywNCisgICAzNzIwMSwzNzMxOCwzNzQzNSwzNzU1MSwzNzY2OCwzNzc4MywzNzg5OCwzODAxMywNCisgICAzODEyNywzODI0MSwzODM1NCwzODQ2NywzODU4MCwzODY5MiwzODgwMywzODkxNSwNCisgICAzOTAyNiwzOTEzNiwzOTI0NiwzOTM1NiwzOTQ2NSwzOTU3NCwzOTY4MiwzOTc5MCwNCisgICAzOTg5OCw0MDAwNSw0MDExMiw0MDIxOSw0MDMyNSw0MDQzMSw0MDUzNyw0MDY0MiwNCisgICA0MDc0Nyw0MDg1MSw0MDk1NSw0MTA1OSw0MTE2Myw0MTI2Niw0MTM2OSw0MTQ3MSwNCisgICA0MTU3Myw0MTY3NSw0MTc3Nyw0MTg3OCw0MTk3OSw0MjA3OSw0MjE3OSw0MjI3OSwNCisgICA0MjM3OSw0MjQ3OCw0MjU3Nyw0MjY3Niw0Mjc3NSw0Mjg3Myw0Mjk3MSw0MzA2OCwNCisgICA0MzE2NSw0MzI2Miw0MzM1OSw0MzQ1Niw0MzU1Miw0MzY0OCw0Mzc0Myw0MzgzOSwNCisgICA0MzkzNCw0NDAyOCw0NDEyMyw0NDIxNyw0NDMxMSw0NDQwNSw0NDQ5OSw0NDU5MiwNCisgICA0NDY4NSw0NDc3OCw0NDg3MCw0NDk2Miw0NTA1NCw0NTE0Niw0NTIzOCw0NTMyOSwNCisgICA0NTQyMCw0NTUxMSw0NTYwMSw0NTY5Miw0NTc4Miw0NTg3Miw0NTk2MSw0NjA1MSwNCisgICA0NjE0MCw0NjIyOSw0NjMxOCw0NjQwNiw0NjQ5NCw0NjU4Myw0NjY3MCw0Njc1OCwNCisgICA0Njg0Niw0NjkzMyw0NzAyMCw0NzEwNyw0NzE5Myw0NzI4MCw0NzM2Niw0NzQ1MiwNCisgICA0NzUzOCw0NzYyMyw0NzcwOSw0Nzc5NCw0Nzg3OSw0Nzk2NCw0ODA0OCw0ODEzMywNCisgICA0ODIxNyw0ODMwMSw0ODM4NSw0ODQ2OCw0ODU1Miw0ODYzNSw0ODcxOCw0ODgwMSwNCisgICA0ODg4NCw0ODk2Niw0OTA0OCw0OTEzMSw0OTIxMyw0OTI5NCw0OTM3Niw0OTQ1OCwNCisgICA0OTUzOSw0OTYyMCw0OTcwMSw0OTc4Miw0OTg2Miw0OTk0Myw1MDAyMyw1MDEwMywNCisgICA1MDE4Myw1MDI2Myw1MDM0Miw1MDQyMiw1MDUwMSw1MDU4MCw1MDY1OSw1MDczOCwNCisgICA1MDgxNiw1MDg5NSw1MDk3Myw1MTA1MSw1MTEyOSw1MTIwNyw1MTI4NSw1MTM2MiwNCisgICA1MTQzOSw1MTUxNyw1MTU5NCw1MTY3MSw1MTc0Nyw1MTgyNCw1MTkwMCw1MTk3NywNCisgICA1MjA1Myw1MjEyOSw1MjIwNSw1MjI4MCw1MjM1Niw1MjQzMiw1MjUwNyw1MjU4MiwNCisgICA1MjY1Nyw1MjczMiw1MjgwNyw1Mjg4MSw1Mjk1Niw1MzAzMCw1MzEwNCw1MzE3OCwNCisgICA1MzI1Miw1MzMyNiw1MzQwMCw1MzQ3Myw1MzU0Niw1MzYyMCw1MzY5Myw1Mzc2NiwNCisgICA1MzgzOSw1MzkxMSw1Mzk4NCw1NDA1Niw1NDEyOSw1NDIwMSw1NDI3Myw1NDM0NSwNCisgICA1NDQxNyw1NDQ4OSw1NDU2MCw1NDYzMiw1NDcwMyw1NDc3NCw1NDg0NSw1NDkxNiwNCisgICA1NDk4Nyw1NTA1OCw1NTEyOSw1NTE5OSw1NTI2OSw1NTM0MCw1NTQxMCw1NTQ4MCwNCisgICA1NTU1MCw1NTYyMCw1NTY4OSw1NTc1OSw1NTgyOCw1NTg5OCw1NTk2Nyw1NjAzNiwNCisgICA1NjEwNSw1NjE3NCw1NjI0Myw1NjMxMSw1NjM4MCw1NjQ0OCw1NjUxNyw1NjU4NSwNCisgICA1NjY1Myw1NjcyMSw1Njc4OSw1Njg1Nyw1NjkyNCw1Njk5Miw1NzA1OSw1NzEyNywNCisgICA1NzE5NCw1NzI2MSw1NzMyOCw1NzM5NSw1NzQ2Miw1NzUyOSw1NzU5NSw1NzY2MiwNCisgICA1NzcyOCw1Nzc5NSw1Nzg2MSw1NzkyNyw1Nzk5Myw1ODA1OSw1ODEyNSw1ODE5MSwNCisgICA1ODI1Niw1ODMyMiw1ODM4Nyw1ODQ1Myw1ODUxOCw1ODU4Myw1ODY0OCw1ODcxMywNCisgICA1ODc3OCw1ODg0Myw1ODkwOCw1ODk3Miw1OTAzNyw1OTEwMSw1OTE2NSw1OTIzMCwNCisgICA1OTI5NCw1OTM1OCw1OTQyMiw1OTQ4Niw1OTU0OSw1OTYxMyw1OTY3Nyw1OTc0MCwNCisgICA1OTgwNCw1OTg2Nyw1OTkzMCw1OTk5Myw2MDA1Niw2MDExOSw2MDE4Miw2MDI0NSwNCisgICA2MDMwOCw2MDM3MCw2MDQzMyw2MDQ5NSw2MDU1OCw2MDYyMCw2MDY4Miw2MDc0NCwNCisgICA2MDgwNiw2MDg2OCw2MDkzMCw2MDk5Miw2MTA1NCw2MTExNSw2MTE3Nyw2MTIzOCwNCisgICA2MTMwMCw2MTM2MSw2MTQyMiw2MTQ4Myw2MTU0NCw2MTYwNSw2MTY2Niw2MTcyNywNCisgICA2MTc4OCw2MTg0OCw2MTkwOSw2MTk2OSw2MjAzMCw2MjA5MCw2MjE1MCw2MjIxMSwNCisgICA2MjI3MSw2MjMzMSw2MjM5MSw2MjQ1MCw2MjUxMCw2MjU3MCw2MjYzMCw2MjY4OSwNCisgICA2Mjc0OSw2MjgwOCw2Mjg2Nyw2MjkyNyw2Mjk4Niw2MzA0NSw2MzEwNCw2MzE2MywNCisgICA2MzIyMiw2MzI4MSw2MzM0MCw2MzM5OCw2MzQ1Nyw2MzUxNSw2MzU3NCw2MzYzMiwNCisgICA2MzY5MSw2Mzc0OSw2MzgwNyw2Mzg2NSw2MzkyMyw2Mzk4MSw2NDAzOSw2NDA5NywNCisgICA2NDE1NSw2NDIxMiw2NDI3MCw2NDMyOCw2NDM4NSw2NDQ0Myw2NDUwMCw2NDU1NywNCisgICA2NDYxNCw2NDY3Miw2NDcyOSw2NDc4Niw2NDg0Myw2NDkwMCw2NDk1Niw2NTAxMywNCisgICA2NTA3MCw2NTEyNiw2NTE4Myw2NTIzOSw2NTI5Niw2NTM1Miw2NTQwOSw2NTQ2NQ0KK307DQorDQorY29uc3QgcG5nX2J5dGUgcG5nX3NSR0JfZGVsdGFbNTEyXSA9DQorew0KKyAgIDIwNywyMDEsMTU4LDEyOSwxMTMsMTAwLDkwLDgyLDc3LDcyLDY4LDY0LDYxLDU5LDU2LDU0LA0KKyAgIDUyLDUwLDQ5LDQ3LDQ2LDQ1LDQzLDQyLDQxLDQwLDM5LDM5LDM4LDM3LDM2LDM2LA0KKyAgIDM1LDM0LDM0LDMzLDMzLDMyLDMyLDMxLDMxLDMwLDMwLDMwLDI5LDI5LDI4LDI4LA0KKyAgIDI4LDI3LDI3LDI3LDI3LDI2LDI2LDI2LDI1LDI1LDI1LDI1LDI0LDI0LDI0LDI0LA0KKyAgIDIzLDIzLDIzLDIzLDIzLDIyLDIyLDIyLDIyLDIyLDIyLDIxLDIxLDIxLDIxLDIxLA0KKyAgIDIxLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDE5LDE5LDE5LDE5LDE5LDE5LDE5LA0KKyAgIDE5LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE3LDE3LDE3LDE3LDE3LA0KKyAgIDE3LDE3LDE3LDE3LDE3LDE3LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LA0KKyAgIDE2LDE2LDE2LDE2LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LA0KKyAgIDE1LDE1LDE1LDE1LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LA0KKyAgIDE0LDE0LDE0LDE0LDE0LDE0LDE0LDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLA0KKyAgIDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEzLDEyLDEyLA0KKyAgIDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLA0KKyAgIDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDExLDExLDExLDExLA0KKyAgIDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLA0KKyAgIDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLA0KKyAgIDExLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLA0KKyAgIDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLA0KKyAgIDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLDEwLA0KKyAgIDEwLDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LA0KKyAgIDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksDQorICAgOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwNCisgICA5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LA0KKyAgIDksOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsDQorICAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwNCisgICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LA0KKyAgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsDQorICAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwNCisgICA4LDgsOCw4LDgsOCw4LDgsOCw3LDcsNyw3LDcsNyw3LA0KKyAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsDQorICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywNCisgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3DQorfTsNCisjZW5kaWYgLyogU0lNUExJRklFRCBSRUFEL1dSSVRFIHNSR0Igc3VwcG9ydCAqLw0KKw0KKy8qIFNJTVBMSUZJRUQgUkVBRC9XUklURSBTVVBQT1JUICovDQorI2lmIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQpIHx8XA0KKyAgIGRlZmluZWQoUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKQ0KK3N0YXRpYyBpbnQNCitwbmdfaW1hZ2VfZnJlZV9mdW5jdGlvbihwbmdfdm9pZHAgYXJndW1lbnQpDQorew0KKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlcCwgYXJndW1lbnQpOw0KKyAgIHBuZ19jb250cm9scCBjcCA9IGltYWdlLT5vcGFxdWU7DQorICAgcG5nX2NvbnRyb2wgYzsNCisNCisgICAvKiBEb3VibGUgY2hlY2sgdGhhdCB3ZSBoYXZlIGEgcG5nX3B0ciAtIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIGdldCBoZXJlDQorICAgICogd2l0aG91dCBvbmUuDQorICAgICovDQorICAgaWYgKGNwLT5wbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIDA7DQorDQorICAgLyogRmlyc3QgZnJlZSBhbnkgZGF0YSBoZWxkIGluIHRoZSBjb250cm9sIHN0cnVjdHVyZS4gKi8NCisjICBpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVEDQorICAgICAgaWYgKGNwLT5vd25lZF9maWxlKQ0KKyAgICAgIHsNCisgICAgICAgICBGSUxFICpmcCA9IHBuZ192b2lkY2FzdChGSUxFKiwgY3AtPnBuZ19wdHItPmlvX3B0cik7DQorICAgICAgICAgY3AtPm93bmVkX2ZpbGUgPSAwOw0KKw0KKyAgICAgICAgIC8qIElnbm9yZSBlcnJvcnMgaGVyZS4gKi8NCisgICAgICAgICBpZiAoZnAgIT0gTlVMTCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgY3AtPnBuZ19wdHItPmlvX3B0ciA9IE5VTEw7DQorICAgICAgICAgICAgKHZvaWQpZmNsb3NlKGZwKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyMgIGVuZGlmDQorDQorICAgLyogQ29weSB0aGUgY29udHJvbCBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgb3JpZ2luYWwsIGFsbG9jYXRlZCwgdmVyc2lvbiBjYW4gYmUNCisgICAgKiBzYWZlbHkgZnJlZWQuICBOb3RpY2UgdGhhdCBhIHBuZ19lcnJvciBoZXJlIHN0b3BzIHRoZSByZW1haW5kZXIgb2YgdGhlDQorICAgICogY2xlYW51cCwgYnV0IHRoaXMgaXMgcHJvYmFibHkgZmluZSBiZWNhdXNlIHRoYXQgd291bGQgaW5kaWNhdGUgYmFkIG1lbW9yeQ0KKyAgICAqIHByb2JsZW1zIGFueXdheS4NCisgICAgKi8NCisgICBjID0gKmNwOw0KKyAgIGltYWdlLT5vcGFxdWUgPSAmYzsNCisgICBwbmdfZnJlZShjLnBuZ19wdHIsIGNwKTsNCisNCisgICAvKiBUaGVuIHRoZSBzdHJ1Y3R1cmVzLCBjYWxsaW5nIHRoZSBjb3JyZWN0IEFQSS4gKi8NCisgICBpZiAoYy5mb3Jfd3JpdGUpDQorICAgew0KKyMgICAgIGlmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRA0KKyAgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmYy5wbmdfcHRyLCAmYy5pbmZvX3B0cik7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19lcnJvcihjLnBuZ19wdHIsICJzaW1wbGlmaWVkIHdyaXRlIG5vdCBzdXBwb3J0ZWQiKTsNCisjICAgICBlbmRpZg0KKyAgIH0NCisgICBlbHNlDQorICAgew0KKyMgICAgIGlmZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEDQorICAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJmMucG5nX3B0ciwgJmMuaW5mb19wdHIsIE5VTEwpOw0KKyMgICAgIGVsc2UNCisgICAgICAgICBwbmdfZXJyb3IoYy5wbmdfcHRyLCAic2ltcGxpZmllZCByZWFkIG5vdCBzdXBwb3J0ZWQiKTsNCisjICAgICBlbmRpZg0KKyAgIH0NCisNCisgICAvKiBTdWNjZXNzLiAqLw0KKyAgIHJldHVybiAxOw0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19pbWFnZV9mcmVlKHBuZ19pbWFnZXAgaW1hZ2UpDQorew0KKyAgIC8qIFNhZmVseSBjYWxsIHRoZSByZWFsIGZ1bmN0aW9uLCBidXQgb25seSBpZiBkb2luZyBzbyBpcyBzYWZlIGF0IHRoaXMgcG9pbnQNCisgICAgKiAoaWYgbm90IGluc2lkZSBhbiBlcnJvciBoYW5kbGluZyBjb250ZXh0KS4gIE90aGVyd2lzZSBhc3N1bWUNCisgICAgKiBwbmdfc2FmZV9leGVjdXRlIHdpbGwgY2FsbCB0aGlzIEFQSSBhZnRlciB0aGUgcmV0dXJuLg0KKyAgICAqLw0KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT5vcGFxdWUgIT0gTlVMTCAmJg0KKyAgICAgIGltYWdlLT5vcGFxdWUtPmVycm9yX2J1ZiA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICAvKiBJZ25vcmUgZXJyb3JzIGhlcmU6ICovDQorICAgICAgKHZvaWQpcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX2ZyZWVfZnVuY3Rpb24sIGltYWdlKTsNCisgICAgICBpbWFnZS0+b3BhcXVlID0gTlVMTDsNCisgICB9DQorfQ0KKw0KK2ludCAvKiBQUklWQVRFICovDQorcG5nX2ltYWdlX2Vycm9yKHBuZ19pbWFnZXAgaW1hZ2UsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQ0KK3sNCisgICAvKiBVdGlsaXR5IHRvIGxvZyBhbiBlcnJvci4gKi8NCisgICBwbmdfc2FmZWNhdChpbWFnZS0+bWVzc2FnZSwgKHNpemVvZiBpbWFnZS0+bWVzc2FnZSksIDAsIGVycm9yX21lc3NhZ2UpOw0KKyAgIGltYWdlLT53YXJuaW5nX29yX2Vycm9yIHw9IFBOR19JTUFHRV9FUlJPUjsNCisgICBwbmdfaW1hZ2VfZnJlZShpbWFnZSk7DQorICAgcmV0dXJuIDA7DQorfQ0KKw0KKyNlbmRpZiAvKiBTSU1QTElGSUVEIFJFQUQvV1JJVEUgKi8NCisjZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgKi8NCisjZW5kaWYNCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ2Vycm9yLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzYzkzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nZXJyb3IuYwpAQCAtMCwwICsxLDkzMyBAQAorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorLyogcG5nZXJyb3IuYyAtIHN0dWIgZnVuY3Rpb25zIGZvciBpL28gYW5kIG1lbW9yeSBhbGxvY2F0aW9uDQorICoNCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xIFtNYXJjaCAyOCwgMjAxM10NCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24NCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikNCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pDQorICoNCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXINCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaA0KKyAqDQorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBlcnJvciBoYW5kbGluZy4gIFVzZXJzIHdobw0KKyAqIG5lZWQgc3BlY2lhbCBlcnJvciBoYW5kbGluZyBhcmUgZXhwZWN0ZWQgdG8gd3JpdGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zDQorICogYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkgdG8gdXNlIHRob3NlIGZ1bmN0aW9ucy4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zDQorICogYXQgZWFjaCBmdW5jdGlvbi4NCisgKi8NCisNCisjaW5jbHVkZSAicG5ncHJpdi5oIg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQ0KKw0KK3N0YXRpYyBQTkdfRlVOQ1RJT04odm9pZCwgcG5nX2RlZmF1bHRfZXJyb3IsUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpKSxQTkdfTk9SRVRVUk4pOw0KKw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kZWZhdWx0X3dhcm5pbmcgUE5HQVJHKChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7DQorI2VuZGlmIC8qIFBOR19XQVJOSU5HU19TVVBQT1JURUQgKi8NCisNCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIGZhdGFsIGVycm9yLiAgVGhpcyBmdW5jdGlvbg0KKyAqIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gIElmIHRoZXJlIGlzIGEgbmVlZCB0byBoYW5kbGUgZXJyb3JzIGRpZmZlcmVudGx5LA0KKyAqIHlvdSBzaG91bGQgc3VwcGx5IGEgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb24gYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkNCisgKiB0byByZXBsYWNlIHRoZSBlcnJvciBmdW5jdGlvbiBhdCBydW4tdGltZS4NCisgKi8NCisjaWZkZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEDQorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJDQorcG5nX2Vycm9yLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpLA0KKyAgIFBOR19OT1JFVFVSTikNCit7DQorI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRA0KKyAgIGNoYXIgbXNnWzE2XTsNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MmDQorICAgICAgICAgKFBOR19GTEFHX1NUUklQX0VSUk9SX05VTUJFUlN8UE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkpDQorICAgICAgew0KKyAgICAgICAgIGlmICgqZXJyb3JfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogU3RyaXAgIiNubm5uICIgZnJvbSBiZWdpbm5pbmcgb2YgZXJyb3IgbWVzc2FnZS4gKi8NCisgICAgICAgICAgICBpbnQgb2Zmc2V0Ow0KKyAgICAgICAgICAgIGZvciAob2Zmc2V0ID0gMTsgb2Zmc2V0PDE1OyBvZmZzZXQrKykNCisgICAgICAgICAgICAgICBpZiAoZXJyb3JfbWVzc2FnZVtvZmZzZXRdID09ICcgJykNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaW50IGk7DQorICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9mZnNldCAtIDE7IGkrKykNCisgICAgICAgICAgICAgICAgICBtc2dbaV0gPSBlcnJvcl9tZXNzYWdlW2kgKyAxXTsNCisgICAgICAgICAgICAgICBtc2dbaSAtIDFdID0gJ1wwJzsNCisgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gbXNnOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSArPSBvZmZzZXQ7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIG1zZ1swXSA9ICcwJzsNCisgICAgICAgICAgICBtc2dbMV0gPSAnXDAnOw0KKyAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBtc2c7DQorICAgICAgICAgfQ0KKyAgICAgICB9DQorICAgICB9DQorICAgfQ0KKyNlbmRpZg0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+ZXJyb3JfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5lcnJvcl9mbikpKHBuZ19jb25zdGNhc3QocG5nX3N0cnVjdHJwLHBuZ19wdHIpLA0KKyAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsNCisNCisgICAvKiBJZiB0aGUgY3VzdG9tIGhhbmRsZXIgZG9lc24ndCBleGlzdCwgb3IgaWYgaXQgcmV0dXJucywNCisgICAgICB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggd2lsbCBub3QgcmV0dXJuLiAqLw0KKyAgIHBuZ19kZWZhdWx0X2Vycm9yKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOw0KK30NCisjZWxzZQ0KK1BOR19GVU5DVElPTih2b2lkLFBOR0FQSQ0KK3BuZ19lcnIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfTk9SRVRVUk4pDQorew0KKyAgIC8qIFByaW9yIHRvIDEuNS4yIHRoZSBlcnJvcl9mbiByZWNlaXZlZCBhIE5VTEwgcG9pbnRlciwgZXhwcmVzc2VkDQorICAgICogZXJyb25lb3VzbHkgYXMgJ1wwJywgaW5zdGVhZCBvZiB0aGUgZW1wdHkgc3RyaW5nICIiLiAgVGhpcyB3YXMNCisgICAgKiBhcHBhcmVudGx5IGFuIGVycm9yLCBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMjAsIGFuZCBwbmdfZGVmYXVsdF9lcnJvcg0KKyAgICAqIHdpbGwgY3Jhc2ggaW4gdGhpcyBjYXNlLg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+ZXJyb3JfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5lcnJvcl9mbikpKHBuZ19jb25zdGNhc3QocG5nX3N0cnVjdHJwLHBuZ19wdHIpLCAiIik7DQorDQorICAgLyogSWYgdGhlIGN1c3RvbSBoYW5kbGVyIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIGl0IHJldHVybnMsDQorICAgICAgdXNlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHdoaWNoIHdpbGwgbm90IHJldHVybi4gKi8NCisgICBwbmdfZGVmYXVsdF9lcnJvcihwbmdfcHRyLCAiIik7DQorfQ0KKyNlbmRpZiAvKiBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQgKi8NCisNCisvKiBVdGlsaXR5IHRvIHNhZmVseSBhcHBlbmRzIHN0cmluZ3MgdG8gYSBidWZmZXIuICBUaGlzIG5ldmVyIGVycm9ycyBvdXQgc28NCisgKiBlcnJvciBjaGVja2luZyBpcyBub3QgcmVxdWlyZWQgaW4gdGhlIGNhbGxlci4NCisgKi8NCitzaXplX3QNCitwbmdfc2FmZWNhdChwbmdfY2hhcnAgYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywNCisgICBwbmdfY29uc3RfY2hhcnAgc3RyaW5nKQ0KK3sNCisgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgcG9zIDwgYnVmc2l6ZSkNCisgICB7DQorICAgICAgaWYgKHN0cmluZyAhPSBOVUxMKQ0KKyAgICAgICAgIHdoaWxlICgqc3RyaW5nICE9ICdcMCcgJiYgcG9zIDwgYnVmc2l6ZS0xKQ0KKyAgICAgICAgICAgYnVmZmVyW3BvcysrXSA9ICpzdHJpbmcrKzsNCisNCisgICAgICBidWZmZXJbcG9zXSA9ICdcMCc7DQorICAgfQ0KKw0KKyAgIHJldHVybiBwb3M7DQorfQ0KKw0KKyNpZiBkZWZpbmVkKFBOR19XQVJOSU5HU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQpDQorLyogVXRpbGl0eSB0byBkdW1wIGFuIHVuc2lnbmVkIHZhbHVlIGludG8gYSBidWZmZXIsIGdpdmVuIGEgc3RhcnQgcG9pbnRlciBhbmQNCisgKiBhbmQgZW5kIHBvaW50ZXIgKHdoaWNoIHNob3VsZCBwb2ludCBqdXN0ICpiZXlvbmQqIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciEpDQorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcuDQorICovDQorcG5nX2NoYXJwDQorcG5nX2Zvcm1hdF9udW1iZXIocG5nX2NvbnN0X2NoYXJwIHN0YXJ0LCBwbmdfY2hhcnAgZW5kLCBpbnQgZm9ybWF0LA0KKyAgIHBuZ19hbGxvY19zaXplX3QgbnVtYmVyKQ0KK3sNCisgICBpbnQgY291bnQgPSAwOyAgICAvKiBudW1iZXIgb2YgZGlnaXRzIG91dHB1dCAqLw0KKyAgIGludCBtaW5jb3VudCA9IDE7IC8qIG1pbmltdW0gbnVtYmVyIHJlcXVpcmVkICovDQorICAgaW50IG91dHB1dCA9IDA7ICAgLyogZGlnaXQgb3V0cHV0IChmb3IgdGhlIGZpeGVkIHBvaW50IGZvcm1hdCkgKi8NCisNCisgICAqLS1lbmQgPSAnXDAnOw0KKw0KKyAgIC8qIFRoaXMgaXMgd3JpdHRlbiBzbyB0aGF0IHRoZSBsb29wIGFsd2F5cyBydW5zIGF0IGxlYXN0IG9uY2UsIGV2ZW4gd2l0aA0KKyAgICAqIG51bWJlciB6ZXJvLg0KKyAgICAqLw0KKyAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiAobnVtYmVyICE9IDAgfHwgY291bnQgPCBtaW5jb3VudCkpDQorICAgew0KKw0KKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOw0KKw0KKyAgICAgIHN3aXRjaCAoZm9ybWF0KQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIFBOR19OVU1CRVJfRk9STUFUX2ZpeGVkOg0KKyAgICAgICAgICAgIC8qIE5lZWRzIGZpdmUgZGlnaXRzICh0aGUgZnJhY3Rpb24pICovDQorICAgICAgICAgICAgbWluY291bnQgPSA1Ow0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgfHwgbnVtYmVyICUgMTAgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgKi0tZW5kID0gZGlnaXRzW251bWJlciAlIDEwXTsNCisgICAgICAgICAgICAgICBvdXRwdXQgPSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBudW1iZXIgLz0gMTA7DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgY2FzZSBQTkdfTlVNQkVSX0ZPUk1BVF8wMnU6DQorICAgICAgICAgICAgLyogRXhwZWN0cyBhdCBsZWFzdCAyIGRpZ2l0cy4gKi8NCisgICAgICAgICAgICBtaW5jb3VudCA9IDI7DQorICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovDQorDQorICAgICAgICAgY2FzZSBQTkdfTlVNQkVSX0ZPUk1BVF91Og0KKyAgICAgICAgICAgICotLWVuZCA9IGRpZ2l0c1tudW1iZXIgJSAxMF07DQorICAgICAgICAgICAgbnVtYmVyIC89IDEwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgIGNhc2UgUE5HX05VTUJFUl9GT1JNQVRfMDJ4Og0KKyAgICAgICAgICAgIC8qIFRoaXMgZm9ybWF0IGV4cGVjdHMgYXQgbGVhc3QgdHdvIGRpZ2l0cyAqLw0KKyAgICAgICAgICAgIG1pbmNvdW50ID0gMjsNCisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8NCisNCisgICAgICAgICBjYXNlIFBOR19OVU1CRVJfRk9STUFUX3g6DQorICAgICAgICAgICAgKi0tZW5kID0gZGlnaXRzW251bWJlciAmIDB4Zl07DQorICAgICAgICAgICAgbnVtYmVyID4+PSA0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgIGRlZmF1bHQ6IC8qIGFuIGVycm9yICovDQorICAgICAgICAgICAgbnVtYmVyID0gMDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICB9DQorDQorICAgICAgLyogS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZGRlZCAqLw0KKyAgICAgICsrY291bnQ7DQorDQorICAgICAgLyogRmxvYXQgYSBmaXhlZCBudW1iZXIgaGVyZTogKi8NCisgICAgICBpZiAoZm9ybWF0ID09IFBOR19OVU1CRVJfRk9STUFUX2ZpeGVkKSBpZiAoY291bnQgPT0gNSkgaWYgKGVuZCA+IHN0YXJ0KQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBFbmQgb2YgdGhlIGZyYWN0aW9uLCBidXQgbWF5YmUgbm90aGluZyB3YXMgb3V0cHV0PyAgSW4gdGhhdCBjYXNlDQorICAgICAgICAgICogZHJvcCB0aGUgZGVjaW1hbCBwb2ludC4gIElmIHRoZSBudW1iZXIgaXMgYSB0cnVlIHplcm8gaGFuZGxlIHRoYXQNCisgICAgICAgICAgKiBoZXJlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChvdXRwdXQpDQorICAgICAgICAgICAgKi0tZW5kID0gJy4nOw0KKyAgICAgICAgIGVsc2UgaWYgKG51bWJlciA9PSAwKSAvKiBhbmQgIW91dHB1dCAqLw0KKyAgICAgICAgICAgICotLWVuZCA9ICcwJzsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIHJldHVybiBlbmQ7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBub24tZmF0YWwgZXJyb3IuICBUaGlzIGZ1bmN0aW9uDQorICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAgSWYgdGhlcmUgaXMgYSBuZWVkIHRvIGhhbmRsZSB3YXJuaW5ncyBkaWZmZXJlbnRseSwNCisgKiB5b3Ugc2hvdWxkIHN1cHBseSBhIHJlcGxhY2VtZW50IHdhcm5pbmcgZnVuY3Rpb24gYW5kIHVzZQ0KKyAqIHBuZ19zZXRfZXJyb3JfZm4oKSB0byByZXBsYWNlIHRoZSB3YXJuaW5nIGZ1bmN0aW9uIGF0IHJ1bi10aW1lLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3dhcm5pbmcocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpDQorew0KKyAgIGludCBvZmZzZXQgPSAwOw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpDQorICAgew0KKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+ZmxhZ3MmDQorICAgICAgIChQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTfFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKQ0KKyNlbmRpZg0KKyAgICAgIHsNCisgICAgICAgICBpZiAoKndhcm5pbmdfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQgPCAxNTsgb2Zmc2V0KyspDQorICAgICAgICAgICAgICAgaWYgKHdhcm5pbmdfbWVzc2FnZVtvZmZzZXRdID09ICcgJykNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIHBuZ19wdHItPndhcm5pbmdfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT53YXJuaW5nX2ZuKSkocG5nX2NvbnN0Y2FzdChwbmdfc3RydWN0cnAscG5nX3B0ciksDQorICAgICAgICAgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsNCisgICBlbHNlDQorICAgICAgcG5nX2RlZmF1bHRfd2FybmluZyhwbmdfcHRyLCB3YXJuaW5nX21lc3NhZ2UgKyBvZmZzZXQpOw0KK30NCisNCisvKiBUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCAnZm9ybWF0dGVkJyB3YXJuaW5nIG1lc3NhZ2VzIHdpdGggdXAgdG8NCisgKiBQTkdfV0FSTklOR19QQVJBTUVURVJfQ09VTlQgcGFyYW1ldGVycy4gIEluIHRoZSBmb3JtYXQgc3RyaW5nIHRoZSBwYXJhbWV0ZXINCisgKiBpcyBpbnRyb2R1Y2VkIGJ5IEA8bnVtYmVyPiwgd2hlcmUgJ251bWJlcicgc3RhcnRzIGF0IDEuICBUaGlzIGZvbGxvd3MgdGhlDQorICogc3RhbmRhcmQgZXN0YWJsaXNoZWQgYnkgWC9PcGVuIGZvciBpbnRlcm5hdGlvbmFsaXphYmxlIGVycm9yIG1lc3NhZ2VzLg0KKyAqLw0KK3ZvaWQNCitwbmdfd2FybmluZ19wYXJhbWV0ZXIocG5nX3dhcm5pbmdfcGFyYW1ldGVycyBwLCBpbnQgbnVtYmVyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBzdHJpbmcpDQorew0KKyAgIGlmIChudW1iZXIgPiAwICYmIG51bWJlciA8PSBQTkdfV0FSTklOR19QQVJBTUVURVJfQ09VTlQpDQorICAgICAgKHZvaWQpcG5nX3NhZmVjYXQocFtudW1iZXItMV0sIChzaXplb2YgcFtudW1iZXItMV0pLCAwLCBzdHJpbmcpOw0KK30NCisNCit2b2lkDQorcG5nX3dhcm5pbmdfcGFyYW1ldGVyX3Vuc2lnbmVkKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwNCisgICBwbmdfYWxsb2Nfc2l6ZV90IHZhbHVlKQ0KK3sNCisgICBjaGFyIGJ1ZmZlcltQTkdfTlVNQkVSX0JVRkZFUl9TSVpFXTsNCisgICBwbmdfd2FybmluZ19wYXJhbWV0ZXIocCwgbnVtYmVyLCBQTkdfRk9STUFUX05VTUJFUihidWZmZXIsIGZvcm1hdCwgdmFsdWUpKTsNCit9DQorDQordm9pZA0KK3BuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQocG5nX3dhcm5pbmdfcGFyYW1ldGVycyBwLCBpbnQgbnVtYmVyLCBpbnQgZm9ybWF0LA0KKyAgIHBuZ19pbnRfMzIgdmFsdWUpDQorew0KKyAgIHBuZ19hbGxvY19zaXplX3QgdTsNCisgICBwbmdfY2hhcnAgc3RyOw0KKyAgIGNoYXIgYnVmZmVyW1BOR19OVU1CRVJfQlVGRkVSX1NJWkVdOw0KKw0KKyAgIC8qIEF2b2lkIG92ZXJmbG93IGJ5IGRvaW5nIHRoZSBuZWdhdGUgaW4gYSBwbmdfYWxsb2Nfc2l6ZV90OiAqLw0KKyAgIHUgPSAocG5nX2FsbG9jX3NpemVfdCl2YWx1ZTsNCisgICBpZiAodmFsdWUgPCAwKQ0KKyAgICAgIHUgPSB+dSArIDE7DQorDQorICAgc3RyID0gUE5HX0ZPUk1BVF9OVU1CRVIoYnVmZmVyLCBmb3JtYXQsIHUpOw0KKw0KKyAgIGlmICh2YWx1ZSA8IDAgJiYgc3RyID4gYnVmZmVyKQ0KKyAgICAgICotLXN0ciA9ICctJzsNCisNCisgICBwbmdfd2FybmluZ19wYXJhbWV0ZXIocCwgbnVtYmVyLCBzdHIpOw0KK30NCisNCit2b2lkDQorcG5nX2Zvcm1hdHRlZF93YXJuaW5nKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsDQorICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpDQorew0KKyAgIC8qIFRoZSBpbnRlcm5hbCBidWZmZXIgaXMganVzdCAxOTIgYnl0ZXMgLSBlbm91Z2ggZm9yIGFsbCBvdXIgbWVzc2FnZXMsDQorICAgICogb3ZlcmZsb3cgZG9lc24ndCBoYXBwZW4gYmVjYXVzZSB0aGlzIGNvZGUgY2hlY2tzISAgSWYgc29tZW9uZSBmaWd1cmVzDQorICAgICogb3V0IGhvdyB0byBzZW5kIHVzIGEgbWVzc2FnZSBsb25nZXIgdGhhbiAxOTIgYnl0ZXMsIGFsbCB0aGF0IHdpbGwNCisgICAgKiBoYXBwZW4gaXMgdGhhdCB0aGUgbWVzc2FnZSB3aWxsIGJlIHRydW5jYXRlZCBhcHByb3ByaWF0ZWx5Lg0KKyAgICAqLw0KKyAgIHNpemVfdCBpID0gMDsgLyogSW5kZXggaW4gdGhlIG1zZ1tdIGJ1ZmZlcjogKi8NCisgICBjaGFyIG1zZ1sxOTJdOw0KKw0KKyAgIC8qIEVhY2ggaXRlcmF0aW9uIHRocm91Z2ggdGhlIGZvbGxvd2luZyBsb29wIHdyaXRlcyBhdCBtb3N0IG9uZSBjaGFyYWN0ZXINCisgICAgKiB0byBtc2dbaSsrXSB0aGVuIHJldHVybnMgaGVyZSB0byB2YWxpZGF0ZSB0aGF0IHRoZXJlIGlzIHN0aWxsIHNwYWNlIGZvcg0KKyAgICAqIHRoZSB0cmFpbGluZyAnXDAnLiAgSXQgbWF5IChpbiB0aGUgY2FzZSBvZiBhIHBhcmFtZXRlcikgcmVhZCBtb3JlIHRoYW4NCisgICAgKiBvbmUgY2hhcmFjdGVyIGZyb20gbWVzc2FnZVtdOyBpdCBtdXN0IGNoZWNrIGZvciAnXDAnIGFuZCBjb250aW51ZSB0byB0aGUNCisgICAgKiB0ZXN0IGlmIGl0IGZpbmRzIHRoZSBlbmQgb2Ygc3RyaW5nLg0KKyAgICAqLw0KKyAgIHdoaWxlIChpPChzaXplb2YgbXNnKS0xICYmICptZXNzYWdlICE9ICdcMCcpDQorICAgew0KKyAgICAgIC8qICdAJyBhdCBlbmQgb2Ygc3RyaW5nIGlzIG5vdyBqdXN0IHByaW50ZWQgKHByZXZpb3VzbHkgaXQgd2FzIHNraXBwZWQpOw0KKyAgICAgICAqIGl0IGlzIGFuIGVycm9yIGluIHRoZSBjYWxsaW5nIGNvZGUgdG8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCBALg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChwICE9IE5VTEwgJiYgKm1lc3NhZ2UgPT0gJ0AnICYmIG1lc3NhZ2VbMV0gIT0gJ1wwJykNCisgICAgICB7DQorICAgICAgICAgaW50IHBhcmFtZXRlcl9jaGFyID0gKisrbWVzc2FnZTsgLyogQ29uc3VtZSB0aGUgJ0AnICovDQorICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdmFsaWRfcGFyYW1ldGVyc1tdID0gIjEyMzQ1Njc4OSI7DQorICAgICAgICAgaW50IHBhcmFtZXRlciA9IDA7DQorDQorICAgICAgICAgLyogU2VhcmNoIGZvciB0aGUgcGFyYW1ldGVyIGRpZ2l0LCB0aGUgaW5kZXggaW4gdGhlIHN0cmluZyBpcyB0aGUNCisgICAgICAgICAgKiBwYXJhbWV0ZXIgdG8gdXNlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHdoaWxlICh2YWxpZF9wYXJhbWV0ZXJzW3BhcmFtZXRlcl0gIT0gcGFyYW1ldGVyX2NoYXIgJiYNCisgICAgICAgICAgICB2YWxpZF9wYXJhbWV0ZXJzW3BhcmFtZXRlcl0gIT0gJ1wwJykNCisgICAgICAgICAgICArK3BhcmFtZXRlcjsNCisNCisgICAgICAgICAvKiBJZiB0aGUgcGFyYW1ldGVyIGRpZ2l0IGlzIG91dCBvZiByYW5nZSBpdCB3aWxsIGp1c3QgZ2V0IHByaW50ZWQuICovDQorICAgICAgICAgaWYgKHBhcmFtZXRlciA8IFBOR19XQVJOSU5HX1BBUkFNRVRFUl9DT1VOVCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogQXBwZW5kIHRoaXMgcGFyYW1ldGVyICovDQorICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwIHBhcm0gPSBwW3BhcmFtZXRlcl07DQorICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwIHBlbmQgPSBwW3BhcmFtZXRlcl0gKyAoc2l6ZW9mIHBbcGFyYW1ldGVyXSk7DQorDQorICAgICAgICAgICAgLyogTm8gbmVlZCB0byBjb3B5IHRoZSB0cmFpbGluZyAnXDAnIGhlcmUsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUNCisgICAgICAgICAgICAgKiB0aGF0IHBhcm1bXSBoYXMgYmVlbiBpbml0aWFsaXplZCwgc28gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIGENCisgICAgICAgICAgICAgKiB0cmFpbGluZyAnXDAnOg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIHdoaWxlIChpPChzaXplb2YgbXNnKS0xICYmICpwYXJtICE9ICdcMCcgJiYgcGFybSA8IHBlbmQpDQorICAgICAgICAgICAgICAgbXNnW2krK10gPSAqcGFybSsrOw0KKw0KKyAgICAgICAgICAgIC8qIENvbnN1bWUgdGhlIHBhcmFtZXRlciBkaWdpdCB0b286ICovDQorICAgICAgICAgICAgKyttZXNzYWdlOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBlbHNlIG5vdCBhIHBhcmFtZXRlciBhbmQgdGhlcmUgaXMgYSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIEAgc2lnbjsganVzdA0KKyAgICAgICAgICAqIGNvcHkgdGhhdC4gIFRoaXMgaXMga25vd24gbm90IHRvIGJlICdcMCcgYmVjYXVzZSBvZiB0aGUgdGVzdCBhYm92ZS4NCisgICAgICAgICAgKi8NCisgICAgICB9DQorDQorICAgICAgLyogQXQgdGhpcyBwb2ludCAqbWVzc2FnZSBjYW4ndCBiZSAnXDAnLCBldmVuIGluIHRoZSBiYWQgcGFyYW1ldGVyIGNhc2UNCisgICAgICAgKiBhYm92ZSB3aGVyZSB0aGVyZSBpcyBhIGxvbmUgJ0AnIGF0IHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2Ugc3RyaW5nLg0KKyAgICAgICAqLw0KKyAgICAgIG1zZ1tpKytdID0gKm1lc3NhZ2UrKzsNCisgICB9DQorDQorICAgLyogaSBpcyBhbHdheXMgbGVzcyB0aGFuIChzaXplb2YgbXNnKSwgc286ICovDQorICAgbXNnW2ldID0gJ1wwJzsNCisNCisgICAvKiBBbmQgdGhpcyBpcyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuIEl0IG1heSBiZSBsYXJnZXIgdGhhbg0KKyAgICAqIFBOR19NQVhfRVJST1JfVEVYVCwgYnV0IHRoYXQgaXMgb25seSB1c2VkIGZvciAnY2h1bmsnIGVycm9ycyBhbmQgdGhlc2UNCisgICAgKiBhcmUgbm90IChjdXJyZW50bHkpIGZvcm1hdHRlZC4NCisgICAgKi8NCisgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOw0KK30NCisjZW5kaWYgLyogUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19iZW5pZ25fZXJyb3IocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQ0KK3sNCisgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4pDQorICAgew0KKyMgICAgIGlmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KKyAgICAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19JU19SRUFEX1NUUlVDVCkgIT0gMCAmJg0KKyAgICAgICAgICAgIHBuZ19wdHItPmNodW5rX25hbWUgIT0gMCkNCisgICAgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsNCisgICAgICAgICBlbHNlDQorIyAgICAgZW5kaWYNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgIHsNCisjICAgICBpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCisgICAgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDAgJiYNCisgICAgICAgICAgICBwbmdfcHRyLT5jaHVua19uYW1lICE9IDApDQorICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOw0KKyAgICAgICAgIGVsc2UNCisjICAgICBlbmRpZg0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsNCisgICB9DQorfQ0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19hcHBfd2FybmluZyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpDQorew0KKyAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk4pDQorICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsNCisgIGVsc2UNCisgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsNCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2FwcF9lcnJvcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpDQorew0KKyAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQVBQX0VSUk9SU19XQVJOKQ0KKyAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7DQorICBlbHNlDQorICAgICBwbmdfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7DQorfQ0KKyNlbmRpZiAvKiBCRU5JR05fRVJST1JTICovDQorDQorLyogVGhlc2UgdXRpbGl0aWVzIGFyZSB1c2VkIGludGVybmFsbHkgdG8gYnVpbGQgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHJlbGF0ZXMNCisgKiB0byB0aGUgY3VycmVudCBjaHVuay4gIFRoZSBjaHVuayBuYW1lIGNvbWVzIGZyb20gcG5nX3B0ci0+Y2h1bmtfbmFtZSwNCisgKiB0aGlzIGlzIHVzZWQgdG8gcHJlZml4IHRoZSBtZXNzYWdlLiAgVGhlIG1lc3NhZ2UgaXMgbGltaXRlZCBpbiBsZW5ndGgNCisgKiB0byA2MyBieXRlcywgdGhlIG5hbWUgY2hhcmFjdGVycyBhcmUgb3V0cHV0IGFzIGhleCBkaWdpdHMgd3JhcHBlZCBpbiBbXQ0KKyAqIGlmIHRoZSBjaGFyYWN0ZXIgaXMgaW52YWxpZC4NCisgKi8NCisjZGVmaW5lIGlzbm9uYWxwaGEoYykgKChjKSA8IDY1IHx8IChjKSA+IDEyMiB8fCAoKGMpID4gOTAgJiYgKGMpIDwgOTcpKQ0KK3N0YXRpYyBQTkdfQ09OU1QgY2hhciBwbmdfZGlnaXRbMTZdID0gew0KKyAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywNCisgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnDQorfTsNCisNCisjZGVmaW5lIFBOR19NQVhfRVJST1JfVEVYVCAxOTYgLyogQ3VycmVudGx5IGxpbWl0ZWQgYmUgcHJvZmlsZV9lcnJvciBpbiBwbmcuYyAqLw0KKyNpZiBkZWZpbmVkKFBOR19XQVJOSU5HU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEKQ0KK3N0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZm9ybWF0X2J1ZmZlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NoYXJwIGJ1ZmZlciwgcG5nX2NvbnN0X2NoYXJwDQorICAgIGVycm9yX21lc3NhZ2UpDQorew0KKyAgIHBuZ191aW50XzMyIGNodW5rX25hbWUgPSBwbmdfcHRyLT5jaHVua19uYW1lOw0KKyAgIGludCBpb3V0ID0gMCwgaXNoaWZ0ID0gMjQ7DQorDQorICAgd2hpbGUgKGlzaGlmdCA+PSAwKQ0KKyAgIHsNCisgICAgICBpbnQgYyA9IChpbnQpKGNodW5rX25hbWUgPj4gaXNoaWZ0KSAmIDB4ZmY7DQorDQorICAgICAgaXNoaWZ0IC09IDg7DQorICAgICAgaWYgKGlzbm9uYWxwaGEoYykpDQorICAgICAgew0KKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gUE5HX0xJVEVSQUxfTEVGVF9TUVVBUkVfQlJBQ0tFVDsNCisgICAgICAgICBidWZmZXJbaW91dCsrXSA9IHBuZ19kaWdpdFsoYyAmIDB4ZjApID4+IDRdOw0KKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gcG5nX2RpZ2l0W2MgJiAweDBmXTsNCisgICAgICAgICBidWZmZXJbaW91dCsrXSA9IFBOR19MSVRFUkFMX1JJR0hUX1NRVUFSRV9CUkFDS0VUOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gKGNoYXIpYzsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIGlmIChlcnJvcl9tZXNzYWdlID09IE5VTEwpDQorICAgICAgYnVmZmVyW2lvdXRdID0gJ1wwJzsNCisNCisgICBlbHNlDQorICAgew0KKyAgICAgIGludCBpaW4gPSAwOw0KKw0KKyAgICAgIGJ1ZmZlcltpb3V0KytdID0gJzonOw0KKyAgICAgIGJ1ZmZlcltpb3V0KytdID0gJyAnOw0KKw0KKyAgICAgIHdoaWxlIChpaW4gPCBQTkdfTUFYX0VSUk9SX1RFWFQtMSAmJiBlcnJvcl9tZXNzYWdlW2lpbl0gIT0gJ1wwJykNCisgICAgICAgICBidWZmZXJbaW91dCsrXSA9IGVycm9yX21lc3NhZ2VbaWluKytdOw0KKw0KKyAgICAgIC8qIGlpbiA8IFBOR19NQVhfRVJST1JfVEVYVCwgc28gdGhlIGZvbGxvd2luZyBpcyBzYWZlOiAqLw0KKyAgICAgIGJ1ZmZlcltpb3V0XSA9ICdcMCc7DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCB8fCBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQgKi8NCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEKQ0KK1BOR19GVU5DVElPTih2b2lkLFBOR0FQSQ0KK3BuZ19jaHVua19lcnJvciwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSwNCisgICBQTkdfTk9SRVRVUk4pDQorew0KKyAgIGNoYXIgbXNnWzE4K1BOR19NQVhfRVJST1JfVEVYVF07DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7DQorDQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBwbmdfZm9ybWF0X2J1ZmZlcihwbmdfcHRyLCBtc2csIGVycm9yX21lc3NhZ2UpOw0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOw0KKyAgIH0NCit9DQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAmJiBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX2NodW5rX3dhcm5pbmcocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpDQorew0KKyAgIGNoYXIgbXNnWzE4K1BOR19NQVhfRVJST1JfVEVYVF07DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCB3YXJuaW5nX21lc3NhZ2UpOw0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2Zvcm1hdF9idWZmZXIocG5nX3B0ciwgbXNnLCB3YXJuaW5nX21lc3NhZ2UpOw0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnANCisgICAgZXJyb3JfbWVzc2FnZSkNCit7DQorICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOKQ0KKyAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7DQorfQ0KKyNlbmRpZg0KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY2h1bmtfcmVwb3J0KHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSwgaW50IGVycm9yKQ0KK3sNCisgICAvKiBUaGlzIGlzIGFsd2F5cyBzdXBwb3J0ZWQsIGJ1dCBmb3IganVzdCByZWFkIG9yIGp1c3Qgd3JpdGUgaXQNCisgICAgKiB1bmNvbmRpdGlvbmFsbHkgZG9lcyB0aGUgcmlnaHQgdGhpbmcuDQorICAgICovDQorIyAgaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkNCisgICAgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19JU19SRUFEX1NUUlVDVCkNCisjICBlbmRpZg0KKw0KKyMgIGlmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KKyAgICAgIHsNCisgICAgICAgICBpZiAoZXJyb3IgPCBQTkdfQ0hVTktfRVJST1IpDQorICAgICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgbWVzc2FnZSk7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgbWVzc2FnZSk7DQorICAgICAgfQ0KKyMgIGVuZGlmDQorDQorIyAgaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkNCisgICAgICBlbHNlIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpKQ0KKyMgIGVuZGlmDQorDQorIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKyAgICAgIHsNCisgICAgICAgICBpZiAoZXJyb3IgPCBQTkdfQ0hVTktfV1JJVEVfRVJST1IpDQorICAgICAgICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsIG1lc3NhZ2UpOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsIG1lc3NhZ2UpOw0KKyAgICAgIH0NCisjICBlbmRpZg0KK30NCisNCisjaWZkZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCitQTkdfRlVOQ1RJT04odm9pZCwNCitwbmdfZml4ZWRfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbmFtZSksUE5HX05PUkVUVVJOKQ0KK3sNCisjICBkZWZpbmUgZml4ZWRfbWVzc2FnZSAiZml4ZWQgcG9pbnQgb3ZlcmZsb3cgaW4gIg0KKyMgIGRlZmluZSBmaXhlZF9tZXNzYWdlX2xuICgoc2l6ZW9mIGZpeGVkX21lc3NhZ2UpLTEpDQorICAgaW50ICBpaW47DQorICAgY2hhciBtc2dbZml4ZWRfbWVzc2FnZV9sbitQTkdfTUFYX0VSUk9SX1RFWFRdOw0KKyAgIG1lbWNweShtc2csIGZpeGVkX21lc3NhZ2UsIGZpeGVkX21lc3NhZ2VfbG4pOw0KKyAgIGlpbiA9IDA7DQorICAgaWYgKG5hbWUgIT0gTlVMTCkgd2hpbGUgKGlpbiA8IChQTkdfTUFYX0VSUk9SX1RFWFQtMSkgJiYgbmFtZVtpaW5dICE9IDApDQorICAgew0KKyAgICAgIG1zZ1tmaXhlZF9tZXNzYWdlX2xuICsgaWluXSA9IG5hbWVbaWluXTsNCisgICAgICArK2lpbjsNCisgICB9DQorICAgbXNnW2ZpeGVkX21lc3NhZ2VfbG4gKyBpaW5dID0gMDsNCisgICBwbmdfZXJyb3IocG5nX3B0ciwgbXNnKTsNCit9DQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorLyogVGhpcyBBUEkgb25seSBleGlzdHMgaWYgQU5TSS1DIHN0eWxlIGVycm9yIGhhbmRsaW5nIGlzIHVzZWQsDQorICogb3RoZXJ3aXNlIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcG5nX2RlZmF1bHRfZXJyb3IgdG8gYmUgb3ZlcnJpZGRlbi4NCisgKi8NCitqbXBfYnVmKiBQTkdBUEkNCitwbmdfc2V0X2xvbmdqbXBfZm4ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19sb25nam1wX3B0ciBsb25nam1wX2ZuLA0KKyAgICBzaXplX3Qgam1wX2J1Zl9zaXplKQ0KK3sNCisgICAvKiBGcm9tIGxpYnBuZyAxLjYuMCB0aGUgYXBwIGdldHMgb25lIGNoYW5jZSB0byBzZXQgYSAnam1wYnVmX3NpemUnIHZhbHVlDQorICAgICogYW5kIGl0IG11c3Qgbm90IGNoYW5nZSBhZnRlciB0aGF0LiAgTGlicG5nIGRvZXNuJ3QgY2FyZSBob3cgYmlnIHRoZQ0KKyAgICAqIGJ1ZmZlciBpcywganVzdCB0aGF0IGl0IGRvZXNuJ3QgY2hhbmdlLg0KKyAgICAqDQorICAgICogSWYgdGhlIGJ1ZmZlciBzaXplIGlzIG5vICpsYXJnZXIqIHRoYW4gdGhlIHNpemUgb2Ygam1wX2J1ZiB3aGVuIGxpYnBuZyBpcw0KKyAgICAqIGNvbXBpbGVkIGEgYnVpbHQgaW4gam1wX2J1ZiBpcyByZXR1cm5lZDsgdGhpcyBwcmVzZXJ2ZXMgdGhlIHByZS0xLjYuMA0KKyAgICAqIHNlbWFudGljcyB0aGF0IHRoaXMgY2FsbCB3aWxsIG5vdCBmYWlsLiAgSWYgdGhlIHNpemUgaXMgbGFyZ2VyLCBob3dldmVyLA0KKyAgICAqIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGFuZCB0aGlzIG1heSBmYWlsLCBjYXVzaW5nIHRoZSBmdW5jdGlvbiB0byByZXR1cm4NCisgICAgKiBOVUxMLg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIE5VTEw7DQorDQorICAgaWYgKHBuZ19wdHItPmptcF9idWZfcHRyID09IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19wdHItPmptcF9idWZfc2l6ZSA9IDA7IC8qIG5vdCBhbGxvY2F0ZWQgKi8NCisNCisgICAgICBpZiAoam1wX2J1Zl9zaXplIDw9IChzaXplb2YgcG5nX3B0ci0+am1wX2J1Zl9sb2NhbCkpDQorICAgICAgICAgcG5nX3B0ci0+am1wX2J1Zl9wdHIgPSAmcG5nX3B0ci0+am1wX2J1Zl9sb2NhbDsNCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPmptcF9idWZfcHRyID0gcG5nX3ZvaWRjYXN0KGptcF9idWYgKiwNCisgICAgICAgICAgICBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgam1wX2J1Zl9zaXplKSk7DQorDQorICAgICAgICAgaWYgKHBuZ19wdHItPmptcF9idWZfcHRyID09IE5VTEwpDQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIG5ldyBOVUxMIHJldHVybiBvbiBPT00gKi8NCisNCisgICAgICAgICBwbmdfcHRyLT5qbXBfYnVmX3NpemUgPSBqbXBfYnVmX3NpemU7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBlbHNlIC8qIEFscmVhZHkgYWxsb2NhdGVkOiBjaGVjayB0aGUgc2l6ZSAqLw0KKyAgIHsNCisgICAgICBzaXplX3Qgc2l6ZSA9IHBuZ19wdHItPmptcF9idWZfc2l6ZTsNCisNCisgICAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBzaXplID0gKHNpemVvZiBwbmdfcHRyLT5qbXBfYnVmX2xvY2FsKTsNCisgICAgICAgICBpZiAocG5nX3B0ci0+am1wX2J1Zl9wdHIgIT0gJnBuZ19wdHItPmptcF9idWZfbG9jYWwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgaW4gbGlicG5nOiBzb21laG93IHdlIGhhdmUgYmVlbiBsZWZ0DQorICAgICAgICAgICAgICogd2l0aCBhIHN0YWNrIGFsbG9jYXRlZCBqbXBfYnVmIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJlZ2FpbmVkDQorICAgICAgICAgICAgICogY29udHJvbC4gIEl0J3MgYWx3YXlzIHBvc3NpYmxlIHRvIGZpeCB0aGlzIHVwLCBidXQgZm9yIHRoZSBtb21lbnQNCisgICAgICAgICAgICAgKiB0aGlzIGlzIGEgcG5nX2Vycm9yIGJlY2F1c2UgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGRldGVjdC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkxpYnBuZyBqbXBfYnVmIHN0aWxsIGFsbG9jYXRlZCIpOw0KKyAgICAgICAgICAgIC8qIHBuZ19wdHItPmptcF9idWZfcHRyID0gJnBuZ19wdHItPmptcF9idWZfbG9jYWw7ICovDQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBpZiAoc2l6ZSAhPSBqbXBfYnVmX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJBcHBsaWNhdGlvbiBqbXBfYnVmIHNpemUgY2hhbmdlZCIpOw0KKyAgICAgICAgIHJldHVybiBOVUxMOyAvKiBjYWxsZXIgd2lsbCBwcm9iYWJseSBjcmFzaDogbm8gY2hvaWNlIGhlcmUgKi8NCisgICAgICB9DQorICAgfQ0KKw0KKyAgIC8qIEZpbmFsbHkgZmlsbCBpbiB0aGUgZnVuY3Rpb24sIG5vdyB3ZSBoYXZlIGEgc2F0aXNmYWN0b3J5IGJ1ZmZlci4gSXQgaXMNCisgICAgKiB2YWxpZCB0byBjaGFuZ2UgdGhlIGZ1bmN0aW9uIG9uIGV2ZXJ5IGNhbGwuDQorICAgICovDQorICAgcG5nX3B0ci0+bG9uZ2ptcF9mbiA9IGxvbmdqbXBfZm47DQorICAgcmV0dXJuIHBuZ19wdHItPmptcF9idWZfcHRyOw0KK30NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZnJlZV9qbXBidWYocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpDQorICAgew0KKyAgICAgIGptcF9idWYgKmpiID0gcG5nX3B0ci0+am1wX2J1Zl9wdHI7DQorDQorICAgICAgLyogQSBzaXplIG9mIDAgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGxvY2FsLCBzdGFjaywgYWxsb2NhdGlvbiBvZiB0aGUNCisgICAgICAgKiBwb2ludGVyOyB1c2VkIGhlcmUgYW5kIGluIHBuZy5jDQorICAgICAgICovDQorICAgICAgaWYgKGpiICE9IE5VTEwgJiYgcG5nX3B0ci0+am1wX2J1Zl9zaXplID4gMCkNCisgICAgICB7DQorDQorICAgICAgICAgLyogVGhpcyBzdHVmZiBpcyBzbyB0aGF0IGEgZmFpbHVyZSB0byBmcmVlIHRoZSBlcnJvciBjb250cm9sIHN0cnVjdHVyZQ0KKyAgICAgICAgICAqIGRvZXMgbm90IGxlYXZlIGxpYnBuZyBpbiBhIHN0YXRlIHdpdGggbm8gdmFsaWQgZXJyb3IgaGFuZGxpbmc6IHRoZQ0KKyAgICAgICAgICAqIGZyZWUgYWx3YXlzIHN1Y2NlZWRzLCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpdCBnZXRzIGlnbm9yZWQuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKGpiICE9ICZwbmdfcHRyLT5qbXBfYnVmX2xvY2FsKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBNYWtlIGFuIGludGVybmFsLCBsaWJwbmcsIGptcF9idWYgdG8gcmV0dXJuIGhlcmUgKi8NCisgICAgICAgICAgICBqbXBfYnVmIGZyZWVfam1wX2J1ZjsNCisNCisgICAgICAgICAgICBpZiAoIXNldGptcChmcmVlX2ptcF9idWYpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfcHRyLT5qbXBfYnVmX3B0ciA9ICZmcmVlX2ptcF9idWY7IC8qIGNvbWUgYmFjayBoZXJlICovDQorICAgICAgICAgICAgICAgcG5nX3B0ci0+am1wX2J1Zl9zaXplID0gMDsgLyogc3RhY2sgYWxsb2NhdGlvbiAqLw0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmxvbmdqbXBfZm4gPSBsb25nam1wOw0KKyAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGpiKTsgLyogUmV0dXJuIHRvIHNldGptcCBvbiBlcnJvciAqLw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIC8qICpBbHdheXMqIGNhbmNlbCBldmVyeXRoaW5nIG91dDogKi8NCisgICAgICBwbmdfcHRyLT5qbXBfYnVmX3NpemUgPSAwOw0KKyAgICAgIHBuZ19wdHItPmptcF9idWZfcHRyID0gTlVMTDsNCisgICAgICBwbmdfcHRyLT5sb25nam1wX2ZuID0gMDsNCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKy8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24uICBOb3RlIHRoYXQgcmVwbGFjZW1lbnRzIGZvcg0KKyAqIHRoaXMgZnVuY3Rpb24gTVVTVCBOT1QgUkVUVVJOLCBvciB0aGUgcHJvZ3JhbSB3aWxsIGxpa2VseSBjcmFzaC4gIFRoaXMNCisgKiBmdW5jdGlvbiBpcyB1c2VkIGJ5IGRlZmF1bHQsIG9yIGlmIHRoZSBwcm9ncmFtIHN1cHBsaWVzIE5VTEwgZm9yIHRoZQ0KKyAqIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXIgaW4gcG5nX3NldF9lcnJvcl9mbigpLg0KKyAqLw0KK3N0YXRpYyBQTkdfRlVOQ1RJT04odm9pZCAvKiBQUklWQVRFICovLA0KK3BuZ19kZWZhdWx0X2Vycm9yLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpLA0KKyAgIFBOR19OT1JFVFVSTikNCit7DQorI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRA0KKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQNCisgICAvKiBDaGVjayBvbiBOVUxMIG9ubHkgYWRkZWQgaW4gMS41LjQgKi8NCisgICBpZiAoZXJyb3JfbWVzc2FnZSAhPSBOVUxMICYmICplcnJvcl9tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQ0KKyAgIHsNCisgICAgICAvKiBTdHJpcCAiI25ubm4gIiBmcm9tIGJlZ2lubmluZyBvZiBlcnJvciBtZXNzYWdlLiAqLw0KKyAgICAgIGludCBvZmZzZXQ7DQorICAgICAgY2hhciBlcnJvcl9udW1iZXJbMTZdOw0KKyAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0PDE1OyBvZmZzZXQrKykNCisgICAgICB7DQorICAgICAgICAgZXJyb3JfbnVtYmVyW29mZnNldF0gPSBlcnJvcl9tZXNzYWdlW29mZnNldCArIDFdOw0KKyAgICAgICAgIGlmIChlcnJvcl9tZXNzYWdlW29mZnNldF0gPT0gJyAnKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoKG9mZnNldCA+IDEpICYmIChvZmZzZXQgPCAxNSkpDQorICAgICAgew0KKyAgICAgICAgIGVycm9yX251bWJlcltvZmZzZXQgLSAxXSA9ICdcMCc7DQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3Igbm8uICVzOiAlcyIsDQorICAgICAgICAgICAgIGVycm9yX251bWJlciwgZXJyb3JfbWVzc2FnZSArIG9mZnNldCArIDEpOw0KKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIGVycm9yOiAlcywgb2Zmc2V0PSVkIiwNCisgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSwgb2Zmc2V0KTsNCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsNCisgICAgICB9DQorICAgfQ0KKyAgIGVsc2UNCisjZW5kaWYNCisgICB7DQorICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3I6ICVzIiwgZXJyb3JfbWVzc2FnZSA/IGVycm9yX21lc3NhZ2UgOg0KKyAgICAgICAgICJ1bmRlZmluZWQiKTsNCisgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsNCisgICB9DQorI2Vsc2UNCisgICBQTkdfVU5VU0VEKGVycm9yX21lc3NhZ2UpIC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8NCisjZW5kaWYNCisgICBwbmdfbG9uZ2ptcChwbmdfcHRyLCAxKTsNCit9DQorDQorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJDQorcG5nX2xvbmdqbXAsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgdmFsKSxQTkdfTk9SRVRVUk4pDQorew0KKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyICYmIHBuZ19wdHItPmxvbmdqbXBfZm4gJiYgcG5nX3B0ci0+am1wX2J1Zl9wdHIpDQorICAgICAgcG5nX3B0ci0+bG9uZ2ptcF9mbigqcG5nX3B0ci0+am1wX2J1Zl9wdHIsIHZhbCk7DQorI2VuZGlmDQorDQorICAgLyogSGVyZSBpZiBub3Qgc2V0am1wIHN1cHBvcnQgb3IgaWYgcG5nX3B0ciBpcyBudWxsLiAqLw0KKyAgIFBOR19BQk9SVCgpOw0KK30NCisNCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRA0KKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSB3YXJuaW5nLCBidXQgdGhlIGxpYnJhcnkgdGhpbmtzDQorICogaXQgY2FuIGNvbnRpbnVlIGFueXdheS4gIFJlcGxhY2VtZW50IGZ1bmN0aW9ucyBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nDQorICogaGVyZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGVtIHRvLiAgSW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgcG5nX3B0ciBpcw0KKyAqIG5vdCB1c2VkLCBidXQgaXQgaXMgcGFzc2VkIGluIGNhc2UgaXQgbWF5IGJlIHVzZWZ1bC4NCisgKi8NCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RlZmF1bHRfd2FybmluZyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSkNCit7DQorI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRA0KKyMgIGlmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRA0KKyAgIGlmICgqd2FybmluZ19tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQ0KKyAgIHsNCisgICAgICBpbnQgb2Zmc2V0Ow0KKyAgICAgIGNoYXIgd2FybmluZ19udW1iZXJbMTZdOw0KKyAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTU7IG9mZnNldCsrKQ0KKyAgICAgIHsNCisgICAgICAgICB3YXJuaW5nX251bWJlcltvZmZzZXRdID0gd2FybmluZ19tZXNzYWdlW29mZnNldCArIDFdOw0KKyAgICAgICAgIGlmICh3YXJuaW5nX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmICgob2Zmc2V0ID4gMSkgJiYgKG9mZnNldCA8IDE1KSkNCisgICAgICB7DQorICAgICAgICAgd2FybmluZ19udW1iZXJbb2Zmc2V0ICsgMV0gPSAnXDAnOw0KKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIHdhcm5pbmcgbm8uICVzOiAlcyIsDQorICAgICAgICAgICAgIHdhcm5pbmdfbnVtYmVyLCB3YXJuaW5nX21lc3NhZ2UgKyBvZmZzZXQpOw0KKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIHdhcm5pbmc6ICVzIiwNCisgICAgICAgICAgICAgd2FybmluZ19tZXNzYWdlKTsNCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsNCisgICAgICB9DQorICAgfQ0KKyAgIGVsc2UNCisjICBlbmRpZg0KKw0KKyAgIHsNCisgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyB3YXJuaW5nOiAlcyIsIHdhcm5pbmdfbWVzc2FnZSk7DQorICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7DQorICAgfQ0KKyNlbHNlDQorICAgUE5HX1VOVVNFRCh3YXJuaW5nX21lc3NhZ2UpIC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8NCisjZW5kaWYNCisgICBQTkdfVU5VU0VEKHBuZ19wdHIpIC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8NCit9DQorI2VuZGlmIC8qIFBOR19XQVJOSU5HU19TVVBQT1JURUQgKi8NCisNCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UgYW5vdGhlciBtZXRob2QNCisgKiBvZiBoYW5kbGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzLiAgTm90ZSB0aGF0IHRoZSBlcnJvciBmdW5jdGlvbiBNVVNUIE5PVA0KKyAqIHJldHVybiB0byB0aGUgY2FsbGluZyByb3V0aW5lIG9yIHNlcmlvdXMgcHJvYmxlbXMgd2lsbCBvY2N1ci4gIFRoZSByZXR1cm4NCisgKiBtZXRob2QgdXNlZCBpbiB0aGUgZGVmYXVsdCByb3V0aW5lIGNhbGxzIGxvbmdqbXAocG5nX3B0ci0+am1wX2J1Zl9wdHIsIDEpDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLA0KKyAgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPmVycm9yX3B0ciA9IGVycm9yX3B0cjsNCisgICBwbmdfcHRyLT5lcnJvcl9mbiA9IGVycm9yX2ZuOw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorICAgcG5nX3B0ci0+d2FybmluZ19mbiA9IHdhcm5pbmdfZm47DQorI2Vsc2UNCisgICBQTkdfVU5VU0VEKHdhcm5pbmdfZm4pDQorI2VuZGlmDQorfQ0KKw0KKw0KKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXINCisgKiBmdW5jdGlvbnMuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcw0KKyAqIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95IGFuZCBwbmdfcmVhZF9kZXN0cm95IGFyZSBjYWxsZWQuDQorICovDQorcG5nX3ZvaWRwIFBOR0FQSQ0KK3BuZ19nZXRfZXJyb3JfcHRyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKw0KKyAgIHJldHVybiAoKHBuZ192b2lkcClwbmdfcHRyLT5lcnJvcl9wdHIpOw0KK30NCisNCisNCisjaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIHN0cmlwX21vZGUpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19wdHItPmZsYWdzICY9DQorICAgICAgICAgKCh+KFBOR19GTEFHX1NUUklQX0VSUk9SX05VTUJFUlMgfA0KKyAgICAgICAgIFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKSZzdHJpcF9tb2RlKTsNCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkNCisgICAvKiBDdXJyZW50bHkgdGhlIGFib3ZlIGJvdGggZGVwZW5kIG9uIFNFVEpNUF9TVVBQT1JURUQsIGhvd2V2ZXIgaXQgd291bGQgYmUNCisgICAgKiBwb3NzaWJsZSB0byBpbXBsZW1lbnQgd2l0aG91dCBzZXRqbXAgc3VwcG9ydCBqdXN0IHNvIGxvbmcgYXMgdGhlcmUgaXMgc29tZQ0KKyAgICAqIHdheSB0byBoYW5kbGUgdGhlIGVycm9yIHJldHVybiBoZXJlOg0KKyAgICAqLw0KK1BOR19GVU5DVElPTih2b2lkIC8qIFBSSVZBVEUgKi8sDQorcG5nX3NhZmVfZXJyb3IsKHBuZ19zdHJ1Y3RwIHBuZ19ub25jb25zdF9wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSwNCisgICBQTkdfTk9SRVRVUk4pDQorew0KKyAgIGNvbnN0IHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyID0gcG5nX25vbmNvbnN0X3B0cjsNCisgICBwbmdfaW1hZ2VwIGltYWdlID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZXAsIHBuZ19wdHItPmVycm9yX3B0cik7DQorDQorICAgLyogQW4gZXJyb3IgaXMgYWx3YXlzIGxvZ2dlZCBoZXJlLCBvdmVyd3JpdGluZyBhbnl0aGluZyAodHlwaWNhbGx5IGEgd2FybmluZykNCisgICAgKiB0aGF0IGlzIGFscmVhZHkgdGhlcmU6DQorICAgICovDQorICAgaWYgKGltYWdlICE9IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19zYWZlY2F0KGltYWdlLT5tZXNzYWdlLCAoc2l6ZW9mIGltYWdlLT5tZXNzYWdlKSwgMCwgZXJyb3JfbWVzc2FnZSk7DQorICAgICAgaW1hZ2UtPndhcm5pbmdfb3JfZXJyb3IgfD0gUE5HX0lNQUdFX0VSUk9SOw0KKw0KKyAgICAgIC8qIFJldHJpZXZlIHRoZSBqbXBfYnVmIGZyb20gd2l0aGluIHRoZSBwbmdfY29udHJvbCwgbWFraW5nIHRoaXMgd29yayBmb3INCisgICAgICAgKiBDKysgY29tcGlsYXRpb24gdG9vIGlzIHByZXR0eSB0cmlja3k6IEMrKyB3YW50cyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0DQorICAgICAgICogZWxlbWVudCBvZiBhIGptcF9idWYsIGJ1dCBDIGRvZXNuJ3QgdGVsbCB1cyB0aGUgdHlwZSBvZiB0aGF0Lg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChpbWFnZS0+b3BhcXVlICE9IE5VTEwgJiYgaW1hZ2UtPm9wYXF1ZS0+ZXJyb3JfYnVmICE9IE5VTEwpDQorICAgICAgICAgbG9uZ2ptcChwbmdfY29udHJvbF9qbXBfYnVmKGltYWdlLT5vcGFxdWUpLCAxKTsNCisNCisgICAgICAvKiBNaXNzaW5nIGxvbmdqbXAgYnVmZmVyLCB0aGUgZm9sbG93aW5nIGlzIHRvIGhlbHAgZGVidWdnaW5nOiAqLw0KKyAgICAgIHsNCisgICAgICAgICBzaXplX3QgcG9zID0gcG5nX3NhZmVjYXQoaW1hZ2UtPm1lc3NhZ2UsIChzaXplb2YgaW1hZ2UtPm1lc3NhZ2UpLCAwLA0KKyAgICAgICAgICAgICJiYWQgbG9uZ2ptcDogIik7DQorICAgICAgICAgcG5nX3NhZmVjYXQoaW1hZ2UtPm1lc3NhZ2UsIChzaXplb2YgaW1hZ2UtPm1lc3NhZ2UpLCBwb3MsDQorICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UpOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgLyogSGVyZSBvbiBhbiBpbnRlcm5hbCBwcm9ncmFtbWluZyBlcnJvci4gKi8NCisgICBhYm9ydCgpOw0KK30NCisNCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19zYWZlX3dhcm5pbmcocG5nX3N0cnVjdHAgcG5nX25vbmNvbnN0X3B0ciwgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSkNCit7DQorICAgY29uc3QgcG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIgPSBwbmdfbm9uY29uc3RfcHRyOw0KKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlcCwgcG5nX3B0ci0+ZXJyb3JfcHRyKTsNCisNCisgICAvKiBBIHdhcm5pbmcgaXMgb25seSBsb2dnZWQgaWYgdGhlcmUgaXMgbm8gcHJpb3Igd2FybmluZyBvciBlcnJvci4gKi8NCisgICBpZiAoaW1hZ2UtPndhcm5pbmdfb3JfZXJyb3IgPT0gMCkNCisgICB7DQorICAgICAgcG5nX3NhZmVjYXQoaW1hZ2UtPm1lc3NhZ2UsIChzaXplb2YgaW1hZ2UtPm1lc3NhZ2UpLCAwLCB3YXJuaW5nX21lc3NhZ2UpOw0KKyAgICAgIGltYWdlLT53YXJuaW5nX29yX2Vycm9yIHw9IFBOR19JTUFHRV9XQVJOSU5HOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfc2FmZV9leGVjdXRlKHBuZ19pbWFnZXAgaW1hZ2VfaW4sIGludCAoKmZ1bmN0aW9uKShwbmdfdm9pZHApLCBwbmdfdm9pZHAgYXJnKQ0KK3sNCisgICB2b2xhdGlsZSBwbmdfaW1hZ2VwIGltYWdlID0gaW1hZ2VfaW47DQorICAgdm9sYXRpbGUgaW50IHJlc3VsdDsNCisgICB2b2xhdGlsZSBwbmdfdm9pZHAgc2F2ZWRfZXJyb3JfYnVmOw0KKyAgIGptcF9idWYgc2FmZV9qbXBidWY7DQorDQorICAgLyogU2FmZWx5IGV4ZWN1dGUgZnVuY3Rpb24oYXJnKSB3aXRoIHBuZ19lcnJvciByZXR1cm5pbmcgdG8gdGhpcyBmdW5jdGlvbi4gKi8NCisgICBzYXZlZF9lcnJvcl9idWYgPSBpbWFnZS0+b3BhcXVlLT5lcnJvcl9idWY7DQorICAgcmVzdWx0ID0gc2V0am1wKHNhZmVfam1wYnVmKSA9PSAwOw0KKw0KKyAgIGlmIChyZXN1bHQpDQorICAgew0KKw0KKyAgICAgIGltYWdlLT5vcGFxdWUtPmVycm9yX2J1ZiA9IHNhZmVfam1wYnVmOw0KKyAgICAgIHJlc3VsdCA9IGZ1bmN0aW9uKGFyZyk7DQorICAgfQ0KKw0KKyAgIGltYWdlLT5vcGFxdWUtPmVycm9yX2J1ZiA9IHNhdmVkX2Vycm9yX2J1ZjsNCisNCisgICAvKiBBbmQgZG8gdGhlIGNsZWFudXAgcHJpb3IgdG8gYW55IGZhaWx1cmUgcmV0dXJuLiAqLw0KKyAgIGlmICghcmVzdWx0KQ0KKyAgICAgIHBuZ19pbWFnZV9mcmVlKGltYWdlKTsNCisNCisgICByZXR1cm4gcmVzdWx0Ow0KK30NCisjZW5kaWYgLyogU0lNUExJRklFRCBSRUFEL1dSSVRFICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdnZXQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiYTk3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nZ2V0LmMKQEAgLTAsMCArMSwxMTc4IEBACisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9GWENPUkVfRkVBVFVSRV9BTExfKSB8fCBkZWZpbmVkKF9QTkdfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykNCisvKiBwbmdnZXQuYyAtIHJldHJpZXZhbCBvZiB2YWx1ZXMgZnJvbSBpbmZvIHN0cnVjdA0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMSBbTWFyY2ggMjgsIDIwMTNdDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKg0KKyAqLw0KKw0KKyNpbmNsdWRlICJwbmdwcml2LmgiDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpDQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF92YWxpZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX3VpbnRfMzIgZmxhZykNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHJldHVybihpbmZvX3B0ci0+dmFsaWQgJiBmbGFnKTsNCisNCisgICByZXR1cm4oMCk7DQorfQ0KKw0KK3BuZ19zaXplX3QgUE5HQVBJDQorcG5nX2dldF9yb3dieXRlcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHJldHVybihpbmZvX3B0ci0+cm93Ynl0ZXMpOw0KKw0KKyAgIHJldHVybigwKTsNCit9DQorDQorI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRA0KK3BuZ19ieXRlcHAgUE5HQVBJDQorcG5nX2dldF9yb3dzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpDQorICAgICAgcmV0dXJuKGluZm9fcHRyLT5yb3dfcG9pbnRlcnMpOw0KKw0KKyAgIHJldHVybigwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQNCisvKiBFYXN5IGFjY2VzcyB0byBpbmZvLCBhZGRlZCBpbiBsaWJwbmctMC45OSAqLw0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkNCisgICAgICByZXR1cm4gaW5mb19wdHItPndpZHRoOw0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpDQorICAgICAgcmV0dXJuIGluZm9fcHRyLT5oZWlnaHQ7DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX2J5dGUgUE5HQVBJDQorcG5nX2dldF9iaXRfZGVwdGgocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkNCisgICAgICByZXR1cm4gaW5mb19wdHItPmJpdF9kZXB0aDsNCisNCisgICByZXR1cm4gKDApOw0KK30NCisNCitwbmdfYnl0ZSBQTkdBUEkNCitwbmdfZ2V0X2NvbG9yX3R5cGUocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkNCisgICAgICByZXR1cm4gaW5mb19wdHItPmNvbG9yX3R5cGU7DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX2J5dGUgUE5HQVBJDQorcG5nX2dldF9maWx0ZXJfdHlwZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHJldHVybiBpbmZvX3B0ci0+ZmlsdGVyX3R5cGU7DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX2J5dGUgUE5HQVBJDQorcG5nX2dldF9pbnRlcmxhY2VfdHlwZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHJldHVybiBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGU7DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX2J5dGUgUE5HQVBJDQorcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpDQorICAgICAgcmV0dXJuIGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlOw0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwDQorICAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLA0KKyAgICAgICAgICAgICAicG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIiKTsNCisNCisgICAgICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlID09IFBOR19SRVNPTFVUSU9OX01FVEVSKQ0KKyAgICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0KTsNCisgICAgICB9DQorI2VuZGlmDQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnANCisgICAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLA0KKyAgICAgICAgICAicG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIiKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlID09IFBOR19SRVNPTFVUSU9OX01FVEVSKQ0KKyAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0KTsNCisgICB9DQorI2VuZGlmDQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9waXhlbHNfcGVyX21ldGVyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSkNCisgICB7DQorICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciIpOw0KKw0KKyAgICAgIGlmIChpbmZvX3B0ci0+cGh5c191bml0X3R5cGUgPT0gUE5HX1JFU09MVVRJT05fTUVURVIgJiYNCisgICAgICAgICAgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0ID09IGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCkNCisgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCk7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQorZmxvYXQgUE5HQVBJDQorcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnANCisgICBpbmZvX3B0cikNCit7DQorI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSkNCisgICB7DQorICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfYXNwZWN0X3JhdGlvIik7DQorDQorICAgICAgaWYgKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCAhPSAwKQ0KKyAgICAgICAgIHJldHVybiAoKGZsb2F0KSgoZmxvYXQpaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0DQorICAgICAgICAgICAgIC8oZmxvYXQpaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0KSk7DQorICAgfQ0KKyNlbHNlDQorICAgUE5HX1VOVVNFRChwbmdfcHRyKQ0KKyAgIFBOR19VTlVTRUQoaW5mb19wdHIpDQorI2VuZGlmDQorDQorICAgcmV0dXJuICgoZmxvYXQpMC4wKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCitwbmdfZml4ZWRfcG9pbnQgUE5HQVBJDQorcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW9fZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykNCisgICAgICAgJiYgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0ID4gMCAmJiBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQgPiAwDQorICAgICAgICYmIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCA8PSBQTkdfVUlOVF8zMV9NQVgNCisgICAgICAgJiYgaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0IDw9IFBOR19VSU5UXzMxX01BWCkNCisgICB7DQorICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlczsNCisNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF9hc3BlY3RfcmF0aW9fZml4ZWQiKTsNCisNCisgICAgICAvKiBUaGUgZm9sbG93aW5nIGNhc3RzIHdvcmsgYmVjYXVzZSBhIFBORyA0IGJ5dGUgaW50ZWdlciBvbmx5IGhhcyBhIHZhbGlkDQorICAgICAgICogcmFuZ2Ugb2YgMC4uMl4zMS0xOyBvdGhlcndpc2UgdGhlIGNhc3QgbWlnaHQgb3ZlcmZsb3cuDQorICAgICAgICovDQorICAgICAgaWYgKHBuZ19tdWxkaXYoJnJlcywgKHBuZ19pbnRfMzIpaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0LCBQTkdfRlBfMSwNCisgICAgICAgICAgKHBuZ19pbnRfMzIpaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0KSkNCisgICAgICAgICByZXR1cm4gcmVzOw0KKyAgIH0NCisjZWxzZQ0KKyAgIFBOR19VTlVTRUQocG5nX3B0cikNCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQ0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAwOw0KK30NCisjZW5kaWYNCisNCitwbmdfaW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykpDQorICAgew0KKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMiKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgPT0gUE5HX09GRlNFVF9NSUNST01FVEVSKQ0KKyAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfb2Zmc2V0KTsNCisgICB9DQorI2VuZGlmDQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX2ludF8zMiBQTkdBUEkNCitwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X29mZnNldF9taWNyb25zIik7DQorDQorICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlID09IFBOR19PRkZTRVRfTUlDUk9NRVRFUikNCisgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT55X29mZnNldCk7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KK3BuZ19pbnRfMzIgUE5HQVBJDQorcG5nX2dldF94X29mZnNldF9waXhlbHMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF94X29mZnNldF9waXhlbHMiKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgPT0gUE5HX09GRlNFVF9QSVhFTCkNCisgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X29mZnNldCk7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KK3BuZ19pbnRfMzIgUE5HQVBJDQorcG5nX2dldF95X29mZnNldF9waXhlbHMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X29mZnNldF9waXhlbHMiKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgPT0gUE5HX09GRlNFVF9QSVhFTCkNCisgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT55X29mZnNldCk7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KKyNpZmRlZiBQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQNCitzdGF0aWMgcG5nX3VpbnRfMzINCitwcGlfZnJvbV9wcG0ocG5nX3VpbnRfMzIgcHBtKQ0KK3sNCisjaWYgMA0KKyAgIC8qIFRoZSBjb252ZXJzaW9uIGlzICooMi41NC8xMDApLCBpbiBiaW5hcnkgKDMyIGRpZ2l0cyk6DQorICAgICogLjAwMDAwMTEwMTAwMDAwMDAxMDAxMTEwMTAxMDAxMDAxDQorICAgICovDQorICAgcG5nX3VpbnRfMzIgdDEwMDEsIHQxMTAxOw0KKyAgIHBwbSA+Pj0gMTsgICAgICAgICAgICAgICAgICAvKiAuMSAqLw0KKyAgIHQxMDAxID0gcHBtICsgKHBwbSA+PiAzKTsgICAvKiAuMTAwMSAqLw0KKyAgIHQxMTAxID0gdDEwMDEgKyAocHBtID4+IDEpOyAvKiAuMTEwMSAqLw0KKyAgIHBwbSA+Pj0gMjA7ICAgICAgICAgICAgICAgICAvKiAuMDAwMDAwMDAwMDAwMDAwMDAwMDAxICovDQorICAgdDExMDEgKz0gdDExMDEgPj4gMTU7ICAgICAgIC8qIC4xMTAxMDAwMDAwMDAwMDAxMTAxICovDQorICAgdDEwMDEgPj49IDExOyAgICAgICAgICAgICAgIC8qIC4wMDAwMDAwMDAwMDEwMDEgKi8NCisgICB0MTAwMSArPSB0MTAwMSA+PiAxMjsgICAgICAgLyogLjAwMDAwMDAwMDAwMTAwMTAwMDAwMDAwMTAwMSAqLw0KKyAgIHBwbSArPSB0MTAwMTsgICAgICAgICAgICAgICAvKiAuMDAwMDAwMDAwMDAxMDAxMDAwMDAxMDAxMDAxICovDQorICAgcHBtICs9IHQxMTAxOyAgICAgICAgICAgICAgIC8qIC4xMTAxMDAwMDAwMDEwMDExMTAxMDEwMDEwMDEgKi8NCisgICByZXR1cm4gKHBwbSArIDE2KSA+PiA1Oy8qIC4wMDAwMDExMDEwMDAwMDAwMTAwMTExMDEwMTAwMTAwMSAqLw0KKyNlbHNlDQorICAgLyogVGhlIGFyZ3VtZW50IGlzIGEgUE5HIHVuc2lnbmVkIGludGVnZXIsIHNvIGl0IGlzIG5vdCBwZXJtaXR0ZWQNCisgICAgKiB0byBiZSBiaWdnZXIgdGhhbiAyXjMxLg0KKyAgICAqLw0KKyAgIHBuZ19maXhlZF9wb2ludCByZXN1bHQ7DQorICAgaWYgKHBwbSA8PSBQTkdfVUlOVF8zMV9NQVggJiYgcG5nX211bGRpdigmcmVzdWx0LCAocG5nX2ludF8zMilwcG0sIDEyNywNCisgICAgICAgNTAwMCkpDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisNCisgICAvKiBPdmVyZmxvdy4gKi8NCisgICByZXR1cm4gMDsNCisjZW5kaWYNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9waXhlbHNfcGVyX2luY2gocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHJldHVybiBwcGlfZnJvbV9wcG0ocG5nX2dldF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsIGluZm9fcHRyKSk7DQorfQ0KKw0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHJldHVybiBwcGlfZnJvbV9wcG0ocG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpKTsNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgcmV0dXJuIHBwaV9mcm9tX3BwbShwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikpOw0KK30NCisNCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KK3N0YXRpYyBwbmdfZml4ZWRfcG9pbnQNCitwbmdfZml4ZWRfaW5jaGVzX2Zyb21fbWljcm9ucyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ludF8zMiBtaWNyb25zKQ0KK3sNCisgICAvKiBDb252ZXJ0IGZyb20gbWV0cmVzICogMSwwMDAsMDAwIHRvIGluY2hlcyAqIDEwMCwwMDAsIG1ldGVycyB0bw0KKyAgICAqIGluY2hlcyBpcyBzaW1wbHkgKigxMDAvMi41NCksIHNvIHdlIHdhbnQgKigxMC8yLjU0KSA9PSA1MDAvMTI3Lg0KKyAgICAqIE5vdGljZSB0aGF0IHRoaXMgY2FuIG92ZXJmbG93IC0gYSB3YXJuaW5nIGlzIG91dHB1dCBhbmQgMCBpcw0KKyAgICAqIHJldHVybmVkLg0KKyAgICAqLw0KKyAgIHJldHVybiBwbmdfbXVsZGl2X3dhcm4ocG5nX3B0ciwgbWljcm9ucywgNTAwLCAxMjcpOw0KK30NCisNCitwbmdfZml4ZWRfcG9pbnQgUE5HQVBJDQorcG5nX2dldF94X29mZnNldF9pbmNoZXNfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHJldHVybiBwbmdfZml4ZWRfaW5jaGVzX2Zyb21fbWljcm9ucyhwbmdfcHRyLA0KKyAgICAgICBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCitwbmdfZml4ZWRfcG9pbnQgUE5HQVBJDQorcG5nX2dldF95X29mZnNldF9pbmNoZXNfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHJldHVybiBwbmdfZml4ZWRfaW5jaGVzX2Zyb21fbWljcm9ucyhwbmdfcHRyLA0KKyAgICAgICBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCitmbG9hdCBQTkdBUEkNCitwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgLyogVG8gYXZvaWQgdGhlIG92ZXJmbG93IGRvIHRoZSBjb252ZXJzaW9uIGRpcmVjdGx5IGluIGZsb2F0aW5nDQorICAgICogcG9pbnQuDQorICAgICovDQorICAgcmV0dXJuIChmbG9hdCkocG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKSAqIC4wMDAwMzkzNyk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQorZmxvYXQgUE5HQVBJDQorcG5nX2dldF95X29mZnNldF9pbmNoZXMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIC8qIFRvIGF2b2lkIHRoZSBvdmVyZmxvdyBkbyB0aGUgY29udmVyc2lvbiBkaXJlY3RseSBpbiBmbG9hdGluZw0KKyAgICAqIHBvaW50Lg0KKyAgICAqLw0KKyAgIHJldHVybiAoZmxvYXQpKHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cikgKiAuMDAwMDM5MzcpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9wSFlzX2RwaShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX3VpbnRfMzIgKnJlc194LCBwbmdfdWludF8zMiAqcmVzX3ksIGludCAqdW5pdF90eXBlKQ0KK3sNCisgICBwbmdfdWludF8zMiByZXR2YWwgPSAwOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykpDQorICAgew0KKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwSFlzIik7DQorDQorICAgICAgaWYgKHJlc194ICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgICpyZXNfeCA9IGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdDsNCisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsNCisgICAgICB9DQorDQorICAgICAgaWYgKHJlc195ICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgICpyZXNfeSA9IGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdDsNCisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsNCisgICAgICB9DQorDQorICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICAqdW5pdF90eXBlID0gKGludClpbmZvX3B0ci0+cGh5c191bml0X3R5cGU7DQorICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7DQorDQorICAgICAgICAgaWYgKCp1bml0X3R5cGUgPT0gMSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHJlc194ICE9IE5VTEwpICpyZXNfeCA9IChwbmdfdWludF8zMikoKnJlc194ICogLjAyNTQgKyAuNTApOw0KKyAgICAgICAgICAgIGlmIChyZXNfeSAhPSBOVUxMKSAqcmVzX3kgPSAocG5nX3VpbnRfMzIpKCpyZXNfeSAqIC4wMjU0ICsgLjUwKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gKHJldHZhbCk7DQorfQ0KKyNlbmRpZiAvKiBQTkdfcEhZc19TVVBQT1JURUQgKi8NCisjZW5kaWYgIC8qIFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCAqLw0KKw0KKy8qIHBuZ19nZXRfY2hhbm5lbHMgcmVhbGx5IGJlbG9uZ3MgaW4gaGVyZSwgdG9vLCBidXQgaXQncyBiZWVuIGFyb3VuZCBsb25nZXIgKi8NCisNCisjZW5kaWYgIC8qIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKi8NCisNCisNCitwbmdfYnl0ZSBQTkdBUEkNCitwbmdfZ2V0X2NoYW5uZWxzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpDQorICAgICAgcmV0dXJuKGluZm9fcHRyLT5jaGFubmVscyk7DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KK3BuZ19jb25zdF9ieXRlcCBQTkdBUEkNCitwbmdfZ2V0X3NpZ25hdHVyZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHJldHVybihpbmZvX3B0ci0+c2lnbmF0dXJlKTsNCisNCisgICByZXR1cm4gKE5VTEwpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9iS0dEKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgIHBuZ19jb2xvcl8xNnAgKmJhY2tncm91bmQpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fYktHRCkNCisgICAgICAgJiYgYmFja2dyb3VuZCAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiYktHRCIpOw0KKw0KKyAgICAgICpiYWNrZ3JvdW5kID0gJihpbmZvX3B0ci0+YmFja2dyb3VuZCk7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19iS0dEKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRA0KKy8qIFRoZSBYWVogQVBJcyB3ZXJlIGFkZGVkIGluIDEuNS41IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBjb2RlIGFkZGVkIGF0IHRoZQ0KKyAqIHNhbWUgdGltZSB0byBjb3JyZWN0IHRoZSByZ2IgZ3JheXNjYWxlIGNvZWZmaWNpZW50IGRlZmF1bHRzIG9idGFpbmVkIGZyb20gdGhlDQorICogY0hSTSBjaHVuayBpbiAxLjUuNA0KKyAqLw0KKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X2NIUk0ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgIGRvdWJsZSAqd2hpdGVfeCwgZG91YmxlICp3aGl0ZV95LCBkb3VibGUgKnJlZF94LCBkb3VibGUgKnJlZF95LA0KKyAgICBkb3VibGUgKmdyZWVuX3gsIGRvdWJsZSAqZ3JlZW5feSwgZG91YmxlICpibHVlX3gsIGRvdWJsZSAqYmx1ZV95KQ0KK3sNCisgICAvKiBRdWlldCBBUEkgY2hhbmdlOiB0aGlzIGNvZGUgdXNlZCB0byBvbmx5IHJldHVybiB0aGUgZW5kIHBvaW50cyBpZiBhIGNIUk0NCisgICAgKiBjaHVuayB3YXMgcHJlc2VudCwgYnV0IHRoZSBlbmQgcG9pbnRzIGNhbiBhbHNvIGNvbWUgZnJvbSBpQ0NQIG9yIHNSR0INCisgICAgKiBjaHVua3MsIHNvIGluIDEuNi4wIHRoZSBwbmdfZ2V0XyBBUElzIHJldHVybiB0aGUgZW5kIHBvaW50cyByZWdhcmRsZXNzIGFuZA0KKyAgICAqIHRoZSBwbmdfc2V0XyBBUElzIG1lcmVseSBjaGVjayB0aGF0IHNldCBlbmQgcG9pbnRzIGFyZSBtdXR1YWxseQ0KKyAgICAqIGNvbnNpc3RlbnQuDQorICAgICovDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmDQorICAgICAgKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMpKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiY0hSTSIpOw0KKw0KKyAgICAgIGlmICh3aGl0ZV94ICE9IE5VTEwpDQorICAgICAgICAgKndoaXRlX3ggPSBwbmdfZmxvYXQocG5nX3B0ciwNCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LndoaXRleCwgImNIUk0gd2hpdGUgWCIpOw0KKyAgICAgIGlmICh3aGl0ZV95ICE9IE5VTEwpDQorICAgICAgICAgKndoaXRlX3kgPSBwbmdfZmxvYXQocG5nX3B0ciwNCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LndoaXRleSwgImNIUk0gd2hpdGUgWSIpOw0KKyAgICAgIGlmIChyZWRfeCAhPSBOVUxMKQ0KKyAgICAgICAgICpyZWRfeCA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LnJlZHgsDQorICAgICAgICAgICAgImNIUk0gcmVkIFgiKTsNCisgICAgICBpZiAocmVkX3kgIT0gTlVMTCkNCisgICAgICAgICAqcmVkX3kgPSBwbmdfZmxvYXQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5yZWR5LA0KKyAgICAgICAgICAgICJjSFJNIHJlZCBZIik7DQorICAgICAgaWYgKGdyZWVuX3ggIT0gTlVMTCkNCisgICAgICAgICAqZ3JlZW5feCA9IHBuZ19mbG9hdChwbmdfcHRyLA0KKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkuZ3JlZW54LCAiY0hSTSBncmVlbiBYIik7DQorICAgICAgaWYgKGdyZWVuX3kgIT0gTlVMTCkNCisgICAgICAgICAqZ3JlZW5feSA9IHBuZ19mbG9hdChwbmdfcHRyLA0KKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkuZ3JlZW55LCAiY0hSTSBncmVlbiBZIik7DQorICAgICAgaWYgKGJsdWVfeCAhPSBOVUxMKQ0KKyAgICAgICAgICpibHVlX3ggPSBwbmdfZmxvYXQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ibHVleCwNCisgICAgICAgICAgICAiY0hSTSBibHVlIFgiKTsNCisgICAgICBpZiAoYmx1ZV95ICE9IE5VTEwpDQorICAgICAgICAgKmJsdWVfeSA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LmJsdWV5LA0KKyAgICAgICAgICAgICJjSFJNIGJsdWUgWSIpOw0KKyAgICAgIHJldHVybiAoUE5HX0lORk9fY0hSTSk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKw0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfY0hSTV9YWVoocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgZG91YmxlICpyZWRfWCwgZG91YmxlICpyZWRfWSwgZG91YmxlICpyZWRfWiwgZG91YmxlICpncmVlbl9YLA0KKyAgIGRvdWJsZSAqZ3JlZW5fWSwgZG91YmxlICpncmVlbl9aLCBkb3VibGUgKmJsdWVfWCwgZG91YmxlICpibHVlX1ksDQorICAgZG91YmxlICpibHVlX1opDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJg0KKyAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTKSkNCisgICB7DQorICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk1fWFlaKGZsb2F0KSIpOw0KKw0KKyAgICAgIGlmIChyZWRfWCAhPSBOVUxMKQ0KKyAgICAgICAgICpyZWRfWCA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWCwNCisgICAgICAgICAgICAiY0hSTSByZWQgWCIpOw0KKyAgICAgIGlmIChyZWRfWSAhPSBOVUxMKQ0KKyAgICAgICAgICpyZWRfWSA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWSwNCisgICAgICAgICAgICAiY0hSTSByZWQgWSIpOw0KKyAgICAgIGlmIChyZWRfWiAhPSBOVUxMKQ0KKyAgICAgICAgICpyZWRfWiA9IHBuZ19mbG9hdChwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWiwNCisgICAgICAgICAgICAiY0hSTSByZWQgWiIpOw0KKyAgICAgIGlmIChncmVlbl9YICE9IE5VTEwpDQorICAgICAgICAgKmdyZWVuX1ggPSBwbmdfZmxvYXQocG5nX3B0ciwNCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9YLCAiY0hSTSBncmVlbiBYIik7DQorICAgICAgaWYgKGdyZWVuX1kgIT0gTlVMTCkNCisgICAgICAgICAqZ3JlZW5fWSA9IHBuZ19mbG9hdChwbmdfcHRyLA0KKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLmdyZWVuX1ksICJjSFJNIGdyZWVuIFkiKTsNCisgICAgICBpZiAoZ3JlZW5fWiAhPSBOVUxMKQ0KKyAgICAgICAgICpncmVlbl9aID0gcG5nX2Zsb2F0KHBuZ19wdHIsDQorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouZ3JlZW5fWiwgImNIUk0gZ3JlZW4gWiIpOw0KKyAgICAgIGlmIChibHVlX1ggIT0gTlVMTCkNCisgICAgICAgICAqYmx1ZV9YID0gcG5nX2Zsb2F0KHBuZ19wdHIsDQorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouYmx1ZV9YLCAiY0hSTSBibHVlIFgiKTsNCisgICAgICBpZiAoYmx1ZV9ZICE9IE5VTEwpDQorICAgICAgICAgKmJsdWVfWSA9IHBuZ19mbG9hdChwbmdfcHRyLA0KKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLmJsdWVfWSwgImNIUk0gYmx1ZSBZIik7DQorICAgICAgaWYgKGJsdWVfWiAhPSBOVUxMKQ0KKyAgICAgICAgICpibHVlX1ogPSBwbmdfZmxvYXQocG5nX3B0ciwNCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ibHVlX1osICJjSFJNIGJsdWUgWiIpOw0KKyAgICAgIHJldHVybiAoUE5HX0lORk9fY0hSTSk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKyMgIGVuZGlmDQorDQorIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfY0hSTV9YWVpfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X3JlZF9YLCBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfWSwNCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX1osIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX1gsDQorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX1ksIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX1osDQorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfWCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfYmx1ZV9ZLA0KKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX1opDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJg0KKyAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTKSkNCisgICB7DQorICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk1fWFlaIik7DQorDQorICAgICAgaWYgKGludF9yZWRfWCAhPSBOVUxMKQ0KKyAgICAgICAgICppbnRfcmVkX1ggPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5yZWRfWDsNCisgICAgICBpZiAoaW50X3JlZF9ZICE9IE5VTEwpDQorICAgICAgICAgKmludF9yZWRfWSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLnJlZF9ZOw0KKyAgICAgIGlmIChpbnRfcmVkX1ogIT0gTlVMTCkNCisgICAgICAgICAqaW50X3JlZF9aID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVoucmVkX1o7DQorICAgICAgaWYgKGludF9ncmVlbl9YICE9IE5VTEwpDQorICAgICAgICAgKmludF9ncmVlbl9YID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouZ3JlZW5fWDsNCisgICAgICBpZiAoaW50X2dyZWVuX1kgIT0gTlVMTCkNCisgICAgICAgICAqaW50X2dyZWVuX1kgPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ncmVlbl9ZOw0KKyAgICAgIGlmIChpbnRfZ3JlZW5fWiAhPSBOVUxMKQ0KKyAgICAgICAgICppbnRfZ3JlZW5fWiA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLmdyZWVuX1o7DQorICAgICAgaWYgKGludF9ibHVlX1ggIT0gTlVMTCkNCisgICAgICAgICAqaW50X2JsdWVfWCA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfWFlaLmJsdWVfWDsNCisgICAgICBpZiAoaW50X2JsdWVfWSAhPSBOVUxMKQ0KKyAgICAgICAgICppbnRfYmx1ZV9ZID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c19YWVouYmx1ZV9ZOw0KKyAgICAgIGlmIChpbnRfYmx1ZV9aICE9IE5VTEwpDQorICAgICAgICAgKmludF9ibHVlX1ogPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX1hZWi5ibHVlX1o7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19jSFJNKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9jSFJNX2ZpeGVkKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfZml4ZWRfcG9pbnQgKndoaXRlX3gsIHBuZ19maXhlZF9wb2ludCAqd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50ICpyZWRfeCwNCisgICAgcG5nX2ZpeGVkX3BvaW50ICpyZWRfeSwgcG5nX2ZpeGVkX3BvaW50ICpncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgKmdyZWVuX3ksDQorICAgIHBuZ19maXhlZF9wb2ludCAqYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgKmJsdWVfeSkNCit7DQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk0iKTsNCisNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYNCisgICAgICAoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUykpDQorICAgew0KKyAgICAgIGlmICh3aGl0ZV94ICE9IE5VTEwpDQorICAgICAgICAgKndoaXRlX3ggPSBpbmZvX3B0ci0+Y29sb3JzcGFjZS5lbmRfcG9pbnRzX3h5LndoaXRleDsNCisgICAgICBpZiAod2hpdGVfeSAhPSBOVUxMKQ0KKyAgICAgICAgICp3aGl0ZV95ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS53aGl0ZXk7DQorICAgICAgaWYgKHJlZF94ICE9IE5VTEwpDQorICAgICAgICAgKnJlZF94ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5yZWR4Ow0KKyAgICAgIGlmIChyZWRfeSAhPSBOVUxMKQ0KKyAgICAgICAgICpyZWRfeSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkucmVkeTsNCisgICAgICBpZiAoZ3JlZW5feCAhPSBOVUxMKQ0KKyAgICAgICAgICpncmVlbl94ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ncmVlbng7DQorICAgICAgaWYgKGdyZWVuX3kgIT0gTlVMTCkNCisgICAgICAgICAqZ3JlZW5feSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkuZ3JlZW55Ow0KKyAgICAgIGlmIChibHVlX3ggIT0gTlVMTCkNCisgICAgICAgICAqYmx1ZV94ID0gaW5mb19wdHItPmNvbG9yc3BhY2UuZW5kX3BvaW50c194eS5ibHVleDsNCisgICAgICBpZiAoYmx1ZV95ICE9IE5VTEwpDQorICAgICAgICAgKmJsdWVfeSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkuYmx1ZXk7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19jSFJNKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVEDQorIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfZ0FNQV9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX2ZpeGVkX3BvaW50ICpmaWxlX2dhbW1hKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiZ0FNQSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJg0KKyAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEpICYmDQorICAgICAgZmlsZV9nYW1tYSAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAqZmlsZV9nYW1tYSA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLmdhbW1hOw0KKyAgICAgIHJldHVybiAoUE5HX0lORk9fZ0FNQSk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKyMgIGVuZGlmDQorDQorIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfZ0FNQShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwNCisgICAgZG91YmxlICpmaWxlX2dhbW1hKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiZ0FNQShmbG9hdCkiKTsNCisNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYNCisgICAgICAoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9IQVZFX0dBTU1BKSAmJg0KKyAgICAgIGZpbGVfZ2FtbWEgIT0gTlVMTCkNCisgICB7DQorICAgICAgKmZpbGVfZ2FtbWEgPSBwbmdfZmxvYXQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZ2FtbWEsDQorICAgICAgICAgInBuZ19nZXRfZ0FNQSIpOw0KKyAgICAgIHJldHVybiAoUE5HX0lORk9fZ0FNQSk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfc1JHQihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwNCisgICAgaW50ICpmaWxlX3NyZ2JfaW50ZW50KQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAic1JHQiIpOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikNCisgICAgICAgJiYgZmlsZV9zcmdiX2ludGVudCAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAqZmlsZV9zcmdiX2ludGVudCA9IGluZm9fcHRyLT5jb2xvcnNwYWNlLnJlbmRlcmluZ19pbnRlbnQ7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19zUkdCKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfaUNDUChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX2NoYXJwcCBuYW1lLCBpbnQgKmNvbXByZXNzaW9uX3R5cGUsDQorICAgIHBuZ19ieXRlcHAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgKnByb2ZsZW4pDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJpQ0NQIik7DQorDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKQ0KKyAgICAgICAmJiBuYW1lICE9IE5VTEwgJiYgY29tcHJlc3Npb25fdHlwZSAhPSBOVUxMICYmIHByb2ZpbGUgIT0gTlVMTCAmJg0KKwkJIHByb2ZsZW4gIT0gTlVMTCkNCisgICB7DQorICAgICAgKm5hbWUgPSBpbmZvX3B0ci0+aWNjcF9uYW1lOw0KKyAgICAgICpwcm9maWxlID0gaW5mb19wdHItPmljY3BfcHJvZmlsZTsNCisgICAgICAqcHJvZmxlbiA9IHBuZ19nZXRfdWludF8zMihpbmZvX3B0ci0+aWNjcF9wcm9maWxlKTsNCisgICAgICAvKiBUaGlzIGlzIHNvbWV3aGF0IGlycmVsZXZhbnQgc2luY2UgdGhlIHByb2ZpbGUgZGF0YSByZXR1cm5lZCBoYXMNCisgICAgICAgKiBhY3R1YWxseSBiZWVuIHVuY29tcHJlc3NlZC4NCisgICAgICAgKi8NCisgICAgICAqY29tcHJlc3Npb25fdHlwZSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19pQ0NQKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19zUExUX1NVUFBPUlRFRA0KK2ludCBQTkdBUEkNCitwbmdfZ2V0X3NQTFQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19zUExUX3RwcCBzcGFsZXR0ZXMpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiBzcGFsZXR0ZXMgIT0gTlVMTCkNCisgICB7DQorICAgICAgKnNwYWxldHRlcyA9IGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzOw0KKyAgICAgIHJldHVybiBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW07DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X2hJU1QocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ191aW50XzE2cCAqaGlzdCkNCit7DQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImhJU1QiKTsNCisNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpDQorICAgICAgICYmIGhpc3QgIT0gTlVMTCkNCisgICB7DQorICAgICAgKmhpc3QgPSBpbmZvX3B0ci0+aGlzdDsNCisgICAgICByZXR1cm4gKFBOR19JTkZPX2hJU1QpOw0KKyAgIH0NCisNCisgICByZXR1cm4gKDApOw0KK30NCisjZW5kaWYNCisNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X0lIRFIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ191aW50XzMyICp3aWR0aCwgcG5nX3VpbnRfMzIgKmhlaWdodCwgaW50ICpiaXRfZGVwdGgsDQorICAgIGludCAqY29sb3JfdHlwZSwgaW50ICppbnRlcmxhY2VfdHlwZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLA0KKyAgICBpbnQgKmZpbHRlcl90eXBlKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiSUhEUiIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCB3aWR0aCA9PSBOVUxMIHx8DQorICAgICAgIGhlaWdodCA9PSBOVUxMIHx8IGJpdF9kZXB0aCA9PSBOVUxMIHx8IGNvbG9yX3R5cGUgPT0gTlVMTCkNCisgICAgICByZXR1cm4gKDApOw0KKw0KKyAgICp3aWR0aCA9IGluZm9fcHRyLT53aWR0aDsNCisgICAqaGVpZ2h0ID0gaW5mb19wdHItPmhlaWdodDsNCisgICAqYml0X2RlcHRoID0gaW5mb19wdHItPmJpdF9kZXB0aDsNCisgICAqY29sb3JfdHlwZSA9IGluZm9fcHRyLT5jb2xvcl90eXBlOw0KKw0KKyAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IE5VTEwpDQorICAgICAgKmNvbXByZXNzaW9uX3R5cGUgPSBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZTsNCisNCisgICBpZiAoZmlsdGVyX3R5cGUgIT0gTlVMTCkNCisgICAgICAqZmlsdGVyX3R5cGUgPSBpbmZvX3B0ci0+ZmlsdGVyX3R5cGU7DQorDQorICAgaWYgKGludGVybGFjZV90eXBlICE9IE5VTEwpDQorICAgICAgKmludGVybGFjZV90eXBlID0gaW5mb19wdHItPmludGVybGFjZV90eXBlOw0KKw0KKyAgIC8qIFRoaXMgaXMgcmVkdW5kYW50IGlmIHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIGluZm9fcHRyIHZhbHVlcyB3ZXJlIGFsbA0KKyAgICAqIGFzc2lnbmVkIGluIHBuZ19zZXRfSUhEUigpLiAgV2UgZG8gdGhlIGNoZWNrIGFueWhvdyBpbiBjYXNlIGFuDQorICAgICogYXBwbGljYXRpb24gaGFzIGlnbm9yZWQgb3VyIGFkdmljZSBub3QgdG8gbWVzcyB3aXRoIHRoZSBtZW1iZXJzDQorICAgICogb2YgaW5mb19wdHIgZGlyZWN0bHkuDQorICAgICovDQorICAgcG5nX2NoZWNrX0lIRFIocG5nX3B0ciwgaW5mb19wdHItPndpZHRoLCBpbmZvX3B0ci0+aGVpZ2h0LA0KKyAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSwgaW5mb19wdHItPmludGVybGFjZV90eXBlLA0KKyAgICAgICBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSwgaW5mb19wdHItPmZpbHRlcl90eXBlKTsNCisNCisgICByZXR1cm4gKDEpOw0KK30NCisNCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9vRkZzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfaW50XzMyICpvZmZzZXRfeCwgcG5nX2ludF8zMiAqb2Zmc2V0X3ksIGludCAqdW5pdF90eXBlKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAib0ZGcyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykNCisgICAgICAgJiYgb2Zmc2V0X3ggIT0gTlVMTCAmJiBvZmZzZXRfeSAhPSBOVUxMICYmIHVuaXRfdHlwZSAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAqb2Zmc2V0X3ggPSBpbmZvX3B0ci0+eF9vZmZzZXQ7DQorICAgICAgKm9mZnNldF95ID0gaW5mb19wdHItPnlfb2Zmc2V0Ow0KKyAgICAgICp1bml0X3R5cGUgPSAoaW50KWluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlOw0KKyAgICAgIHJldHVybiAoUE5HX0lORk9fb0ZGcyk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X3BDQUwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19jaGFycCAqcHVycG9zZSwgcG5nX2ludF8zMiAqWDAsIHBuZ19pbnRfMzIgKlgxLCBpbnQgKnR5cGUsIGludCAqbnBhcmFtcywNCisgICAgcG5nX2NoYXJwICp1bml0cywgcG5nX2NoYXJwcCAqcGFyYW1zKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicENBTCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcENBTCkNCisgICAgICAgJiYgcHVycG9zZSAhPSBOVUxMICYmIFgwICE9IE5VTEwgJiYgWDEgIT0gTlVMTCAmJiB0eXBlICE9IE5VTEwgJiYNCisgICAgICAgbnBhcmFtcyAhPSBOVUxMICYmIHVuaXRzICE9IE5VTEwgJiYgcGFyYW1zICE9IE5VTEwpDQorICAgew0KKyAgICAgICpwdXJwb3NlID0gaW5mb19wdHItPnBjYWxfcHVycG9zZTsNCisgICAgICAqWDAgPSBpbmZvX3B0ci0+cGNhbF9YMDsNCisgICAgICAqWDEgPSBpbmZvX3B0ci0+cGNhbF9YMTsNCisgICAgICAqdHlwZSA9IChpbnQpaW5mb19wdHItPnBjYWxfdHlwZTsNCisgICAgICAqbnBhcmFtcyA9IChpbnQpaW5mb19wdHItPnBjYWxfbnBhcmFtczsNCisgICAgICAqdW5pdHMgPSBpbmZvX3B0ci0+cGNhbF91bml0czsNCisgICAgICAqcGFyYW1zID0gaW5mb19wdHItPnBjYWxfcGFyYW1zOw0KKyAgICAgIHJldHVybiAoUE5HX0lORk9fcENBTCk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAoMCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQNCisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEDQorIyAgICBpZiBkZWZpbmVkKFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCkgfHwgXA0KKyAgICAgICAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X3NDQUxfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgIGludCAqdW5pdCwgcG5nX2ZpeGVkX3BvaW50ICp3aWR0aCwgcG5nX2ZpeGVkX3BvaW50ICpoZWlnaHQpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJg0KKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkpDQorICAgew0KKyAgICAgICp1bml0ID0gaW5mb19wdHItPnNjYWxfdW5pdDsNCisgICAgICAvKlRPRE86IG1ha2UgdGhpcyB3b3JrIHdpdGhvdXQgRlAgc3VwcG9ydDsgdGhlIEFQSSBpcyBjdXJyZW50bHkgZWxpbWluYXRlZA0KKyAgICAgICAqIGlmIG5laXRoZXIgZmxvYXRpbmcgcG9pbnQgQVBJcyBub3IgaW50ZXJuYWwgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYw0KKyAgICAgICAqIGFyZSBlbmFibGVkLg0KKyAgICAgICAqLw0KKyAgICAgICp3aWR0aCA9IHBuZ19maXhlZChwbmdfcHRyLCBhdG9mKGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgpLCAic0NBTCB3aWR0aCIpOw0KKyAgICAgICpoZWlnaHQgPSBwbmdfZml4ZWQocG5nX3B0ciwgYXRvZihpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCksDQorICAgICAgICAgInNDQUwgaGVpZ2h0Iik7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19zQ0FMKTsNCisgICB9DQorDQorICAgcmV0dXJuKDApOw0KK30NCisjICAgIGVuZGlmIC8qIEZMT0FUSU5HX0FSSVRITUVUSUMgKi8NCisjICBlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLw0KKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X3NDQUwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgIGludCAqdW5pdCwgZG91YmxlICp3aWR0aCwgZG91YmxlICpoZWlnaHQpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJg0KKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkpDQorICAgew0KKyAgICAgICp1bml0ID0gaW5mb19wdHItPnNjYWxfdW5pdDsNCisgICAgICAqd2lkdGggPSBhdG9mKGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgpOw0KKyAgICAgICpoZWlnaHQgPSBhdG9mKGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0KTsNCisgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOw0KKyAgIH0NCisNCisgICByZXR1cm4oMCk7DQorfQ0KKyMgIGVuZGlmIC8qIEZMT0FUSU5HIFBPSU5UICovDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9zQ0FMX3MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsDQorICAgIGludCAqdW5pdCwgcG5nX2NoYXJwcCB3aWR0aCwgcG5nX2NoYXJwcCBoZWlnaHQpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJg0KKyAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkpDQorICAgew0KKyAgICAgICp1bml0ID0gaW5mb19wdHItPnNjYWxfdW5pdDsNCisgICAgICAqd2lkdGggPSBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoOw0KKyAgICAgICpoZWlnaHQgPSBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodDsNCisgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOw0KKyAgIH0NCisNCisgICByZXR1cm4oMCk7DQorfQ0KKyNlbmRpZiAvKiBzQ0FMICovDQorDQorI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfcEhZcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX3VpbnRfMzIgKnJlc194LCBwbmdfdWludF8zMiAqcmVzX3ksIGludCAqdW5pdF90eXBlKQ0KK3sNCisgICBwbmdfdWludF8zMiByZXR2YWwgPSAwOw0KKw0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwSFlzIik7DQorDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmDQorICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSkNCisgICB7DQorICAgICAgaWYgKHJlc194ICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgICpyZXNfeCA9IGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdDsNCisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsNCisgICAgICB9DQorDQorICAgICAgaWYgKHJlc195ICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgICpyZXNfeSA9IGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdDsNCisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsNCisgICAgICB9DQorDQorICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICAqdW5pdF90eXBlID0gKGludClpbmZvX3B0ci0+cGh5c191bml0X3R5cGU7DQorICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gKHJldHZhbCk7DQorfQ0KKyNlbmRpZiAvKiBwSFlzICovDQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9QTFRFKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29sb3JwICpwYWxldHRlLCBpbnQgKm51bV9wYWxldHRlKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiUExURSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fUExURSkNCisgICAgICAgJiYgcGFsZXR0ZSAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAqcGFsZXR0ZSA9IGluZm9fcHRyLT5wYWxldHRlOw0KKyAgICAgICpudW1fcGFsZXR0ZSA9IGluZm9fcHRyLT5udW1fcGFsZXR0ZTsNCisgICAgICBwbmdfZGVidWcxKDMsICJudW1fcGFsZXR0ZSA9ICVkIiwgKm51bV9wYWxldHRlKTsNCisgICAgICByZXR1cm4gKFBOR19JTkZPX1BMVEUpOw0KKyAgIH0NCisNCisgICByZXR1cm4gKDApOw0KK30NCisNCisjaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9zQklUKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29sb3JfOHAgKnNpZ19iaXQpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJzQklUIik7DQorDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQklUKQ0KKyAgICAgICAmJiBzaWdfYml0ICE9IE5VTEwpDQorICAgew0KKyAgICAgICpzaWdfYml0ID0gJihpbmZvX3B0ci0+c2lnX2JpdCk7DQorICAgICAgcmV0dXJuIChQTkdfSU5GT19zQklUKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRA0KK2ludCBQTkdBUEkNCitwbmdfZ2V0X3RleHQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ190ZXh0cCAqdGV4dF9wdHIsIGludCAqbnVtX3RleHQpDQorew0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ci0+bnVtX3RleHQgPiAwKQ0KKyAgIHsNCisgICAgICBwbmdfZGVidWcxKDEsICJpbiAweCVseCByZXRyaWV2YWwgZnVuY3Rpb24iLA0KKyAgICAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPmNodW5rX25hbWUpOw0KKw0KKyAgICAgIGlmICh0ZXh0X3B0ciAhPSBOVUxMKQ0KKyAgICAgICAgICp0ZXh0X3B0ciA9IGluZm9fcHRyLT50ZXh0Ow0KKw0KKyAgICAgIGlmIChudW1fdGV4dCAhPSBOVUxMKQ0KKyAgICAgICAgICpudW1fdGV4dCA9IGluZm9fcHRyLT5udW1fdGV4dDsNCisNCisgICAgICByZXR1cm4gaW5mb19wdHItPm51bV90ZXh0Ow0KKyAgIH0NCisNCisgICBpZiAobnVtX3RleHQgIT0gTlVMTCkNCisgICAgICAqbnVtX3RleHQgPSAwOw0KKw0KKyAgIHJldHVybigwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRA0KK3BuZ191aW50XzMyIFBOR0FQSQ0KK3BuZ19nZXRfdElNRShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX3RpbWVwICptb2RfdGltZSkNCit7DQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInRJTUUiKTsNCisNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpDQorICAgICAgICYmIG1vZF90aW1lICE9IE5VTEwpDQorICAgew0KKyAgICAgICptb2RfdGltZSA9ICYoaW5mb19wdHItPm1vZF90aW1lKTsNCisgICAgICByZXR1cm4gKFBOR19JTkZPX3RJTUUpOw0KKyAgIH0NCisNCisgICByZXR1cm4gKDApOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF90Uk5TKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfYnl0ZXAgKnRyYW5zX2FscGhhLCBpbnQgKm51bV90cmFucywgcG5nX2NvbG9yXzE2cCAqdHJhbnNfY29sb3IpDQorew0KKyAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSkNCisgICB7DQorICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInRSTlMiKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICB7DQorICAgICAgICAgaWYgKHRyYW5zX2FscGhhICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgICp0cmFuc19hbHBoYSA9IGluZm9fcHRyLT50cmFuc19hbHBoYTsNCisgICAgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fdFJOUzsNCisgICAgICAgICB9DQorDQorICAgICAgICAgaWYgKHRyYW5zX2NvbG9yICE9IE5VTEwpDQorICAgICAgICAgICAgKnRyYW5zX2NvbG9yID0gJihpbmZvX3B0ci0+dHJhbnNfY29sb3IpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIC8qIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAqLw0KKyAgICAgIHsNCisgICAgICAgICBpZiAodHJhbnNfY29sb3IgIT0gTlVMTCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgKnRyYW5zX2NvbG9yID0gJihpbmZvX3B0ci0+dHJhbnNfY29sb3IpOw0KKyAgICAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT190Uk5TOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAodHJhbnNfYWxwaGEgIT0gTlVMTCkNCisgICAgICAgICAgICAqdHJhbnNfYWxwaGEgPSBOVUxMOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAobnVtX3RyYW5zICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgICpudW1fdHJhbnMgPSBpbmZvX3B0ci0+bnVtX3RyYW5zOw0KKyAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT190Uk5TOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgcmV0dXJuIChyZXR2YWwpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRA0KK2ludCBQTkdBUEkNCitwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfdW5rbm93bl9jaHVua3BwIHVua25vd25zKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgdW5rbm93bnMgIT0gTlVMTCkNCisgICB7DQorICAgICAgKnVua25vd25zID0gaW5mb19wdHItPnVua25vd25fY2h1bmtzOw0KKyAgICAgIHJldHVybiBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtOw0KKyAgIH0NCisNCisgICByZXR1cm4gKDApOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorcG5nX2J5dGUgUE5HQVBJDQorcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICByZXR1cm4gKHBuZ19ieXRlKShwbmdfcHRyID8gcG5nX3B0ci0+cmdiX3RvX2dyYXlfc3RhdHVzIDogMCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVEDQorcG5nX3ZvaWRwIFBOR0FQSQ0KK3BuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHJldHVybiAocG5nX3B0ciA/IHBuZ19wdHItPnVzZXJfY2h1bmtfcHRyIDogTlVMTCk7DQorfQ0KKyNlbmRpZg0KKw0KK3BuZ19zaXplX3QgUE5HQVBJDQorcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm4gMDsNCisNCisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpDQorIyAgZW5kaWYNCisgICB7DQorIyAgICAgaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisgICAgICAgICByZXR1cm4gcG5nX3B0ci0+SURBVF9yZWFkX3NpemU7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIHJldHVybiBQTkdfSURBVF9SRUFEX1NJWkU7DQorIyAgICAgZW5kaWYNCisgICB9DQorDQorIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKyAgICAgIGVsc2UNCisgICAgICAgICByZXR1cm4gcG5nX3B0ci0+emJ1ZmZlcl9zaXplOw0KKyMgIGVuZGlmDQorfQ0KKw0KKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKy8qIFRoZXNlIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIHRvIGxpYnBuZyAxLjIuNiBhbmQgd2VyZSBlbmFibGVkDQorICogYnkgZGVmYXVsdCBpbiBsaWJwbmctMS40LjAgKi8NCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4IChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcmV0dXJuIChwbmdfcHRyID8gcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggOiAwKTsNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF91c2VyX2hlaWdodF9tYXggKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICByZXR1cm4gKHBuZ19wdHIgPyBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggOiAwKTsNCit9DQorDQorLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuNC4wICovDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9jaHVua19jYWNoZV9tYXggKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICByZXR1cm4gKHBuZ19wdHIgPyBwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA6IDApOw0KK30NCisNCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS40LjEgKi8NCitwbmdfYWxsb2Nfc2l6ZV90IFBOR0FQSQ0KK3BuZ19nZXRfY2h1bmtfbWFsbG9jX21heCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHJldHVybiAocG5nX3B0ciA/IHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA6IDApOw0KK30NCisjZW5kaWYgLyogP1BOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVEICovDQorDQorLyogVGhlc2UgZnVuY3Rpb25zIHdlcmUgYWRkZWQgdG8gbGlicG5nIDEuNC4wICovDQorI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X2lvX3N0YXRlIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcmV0dXJuIHBuZ19wdHItPmlvX3N0YXRlOw0KK30NCisNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X2lvX2NodW5rX3R5cGUgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICByZXR1cm4gcG5nX3B0ci0+Y2h1bmtfbmFtZTsNCit9DQorI2VuZGlmIC8qID9QTkdfSU9fU1RBVEVfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQNCisjICBpZmRlZiBQTkdfR0VUX1BBTEVUVEVfTUFYX1NVUFBPUlRFRA0KK2ludCBQTkdBUEkNCitwbmdfZ2V0X3BhbGV0dGVfbWF4KHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHJldHVybiBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXg7DQorDQorICAgcmV0dXJuICgtMSk7DQorfQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdtZW0uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2YmM2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nbWVtLmMKQEAgLTAsMCArMSwyOTEgQEAKKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX0ZYQ09SRV9GRUFUVVJFX0FMTF8pIHx8IGRlZmluZWQoX1BOR19ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQ0KKy8qIHBuZ21lbS5jIC0gc3R1YiBmdW5jdGlvbnMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uDQorICoNCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10NCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24NCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikNCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pDQorICoNCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXINCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaA0KKyAqDQorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBtZW1vcnkgYWxsb2NhdGlvbi4gIFVzZXJzIHdobw0KKyAqIG5lZWQgc3BlY2lhbCBtZW1vcnkgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHN1cHBseSByZXBsYWNlbWVudA0KKyAqIGZ1bmN0aW9ucyBmb3IgcG5nX21hbGxvYygpIGFuZCBwbmdfZnJlZSgpLCBhbmQgdG8gdXNlDQorICogcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgYW5kIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0bw0KKyAqIGlkZW50aWZ5IHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbnMuDQorICovDQorDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWYgZGVmaW5lZChfRlhfTUFOQUdFRF9DT0RFXykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCit2b2lkKglGWE1FTV9EZWZhdWx0QWxsb2MoaW50IGJ5dGVfc2l6ZSwgaW50KTsNCit2b2lkCUZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCk7DQorDQorI2lmIGRlZmluZWQoX0ZYX01BTkFHRURfQ09ERV8pICYmIGRlZmluZWQoX19jcGx1c3BsdXMpDQorfQ0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQ0KKy8qIEZyZWUgYSBwbmdfc3RydWN0ICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2Rlc3Ryb3lfcG5nX3N0cnVjdChwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgLyogcG5nX2ZyZWUgbWlnaHQgY2FsbCBwbmdfZXJyb3IgYW5kIG1heSBjZXJ0YWlubHkgY2FsbA0KKyAgICAgICAqIHBuZ19nZXRfbWVtX3B0ciwgc28gZmFrZSBhIHRlbXBvcmFyeSBwbmdfc3RydWN0IHRvIHN1cHBvcnQgdGhpcy4NCisgICAgICAgKi8NCisgICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdCA9ICpwbmdfcHRyOw0KKyAgICAgIG1lbXNldChwbmdfcHRyLCAwLCAoc2l6ZW9mICpwbmdfcHRyKSk7DQorICAgICAgcG5nX2ZyZWUoJmR1bW15X3N0cnVjdCwgcG5nX3B0cik7DQorDQorIyAgICAgaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQNCisgICAgICAgICAvKiBXZSBtYXkgaGF2ZSBhIGptcF9idWYgbGVmdCB0byBkZWFsbG9jYXRlLiAqLw0KKyAgICAgICAgIHBuZ19mcmVlX2ptcGJ1ZigmZHVtbXlfc3RydWN0KTsNCisjICAgICBlbmRpZg0KKyAgIH0NCit9DQorDQorLyogQWxsb2NhdGUgbWVtb3J5LiAgRm9yIHJlYXNvbmFibGUgZmlsZXMsIHNpemUgc2hvdWxkIG5ldmVyIGV4Y2VlZA0KKyAqIDY0Sy4gIEhvd2V2ZXIsIHpsaWIgbWF5IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgaWYgeW91IGRvbid0IHRlbGwNCisgKiBpdCBub3QgdG8uICBTZWUgemNvbmYuaCBhbmQgcG5nLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uICB6bGliIGRvZXMNCisgKiBuZWVkIHRvIGFsbG9jYXRlIGV4YWN0bHkgNjRLLCBzbyB3aGF0ZXZlciB5b3UgY2FsbCBoZXJlIG11c3QNCisgKiBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIHRoYXQuDQorICovDQorUE5HX0ZVTkNUSU9OKHBuZ192b2lkcCxQTkdBUEkNCitwbmdfY2FsbG9jLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKSxQTkdfQUxMT0NBVEVEKQ0KK3sNCisgICBwbmdfdm9pZHAgcmV0Ow0KKw0KKyAgIHJldCA9IHBuZ19tYWxsb2MocG5nX3B0ciwgc2l6ZSk7DQorDQorICAgaWYgKHJldCAhPSBOVUxMKQ0KKyAgICAgIG1lbXNldChyZXQsIDAsIHNpemUpOw0KKw0KKyAgIHJldHVybiByZXQ7DQorfQ0KKw0KKy8qIHBuZ19tYWxsb2NfYmFzZSwgYW4gaW50ZXJuYWwgZnVuY3Rpb24gYWRkZWQgYXQgbGlicG5nIDEuNi4wLCBkb2VzIHRoZSB3b3JrIG9mDQorICogYWxsb2NhdGluZyBtZW1vcnksIHRha2luZyBpbnRvIGFjY291bnQgbGltaXRzIGFuZCBQTkdfVVNFUl9NRU1fU1VQUE9SVEVELg0KKyAqIENoZWNraW5nIGFuZCBlcnJvciBoYW5kbGluZyBtdXN0IGhhcHBlbiBvdXRzaWRlIHRoaXMgcm91dGluZTsgaXQgcmV0dXJucyBOVUxMDQorICogaWYgdGhlIGFsbG9jYXRpb24gY2Fubm90IGJlIGRvbmUgKGZvciBhbnkgcmVhc29uLikNCisgKi8NCitQTkdfRlVOQ1RJT04ocG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8sDQorcG5nX21hbGxvY19iYXNlLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKSwNCisgICBQTkdfQUxMT0NBVEVEKQ0KK3sNCisgICAvKiBNb3ZlZCB0byBwbmdfbWFsbG9jX2Jhc2UgZnJvbSBwbmdfbWFsbG9jX2RlZmF1bHQgaW4gMS42LjA7IHRoZSBET1MNCisgICAgKiBhbGxvY2F0b3JzIGhhdmUgYWxzbyBiZWVuIHJlbW92ZWQgaW4gMS42LjAsIHNvIGFueSAxNi1iaXQgc3lzdGVtIG5vdyBoYXMNCisgICAgKiB0byBpbXBsZW1lbnQgYSB1c2VyIG1lbW9yeSBoYW5kbGVyLiAgVGhpcyBjaGVja3MgdG8gYmUgc3VyZSBpdCBpc24ndA0KKyAgICAqIGNhbGxlZCB3aXRoIGJpZyBudW1iZXJzLg0KKyAgICAqLw0KKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEDQorICAgUE5HX1VOVVNFRChwbmdfcHRyKQ0KKyNlbmRpZg0KKyAgIGlmIChzaXplID4gMCAmJiBzaXplIDw9IFBOR19TSVpFX01BWA0KKyMgICAgIGlmZGVmIFBOR19NQVhfTUFMTE9DXzY0Sw0KKyAgICAgICAgICYmIHNpemUgPD0gNjU1MzZVDQorIyAgICAgZW5kaWYNCisgICAgICApDQorICAgew0KKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT5tYWxsb2NfZm4gIT0gTlVMTCkNCisgICAgICAgICByZXR1cm4gcG5nX3B0ci0+bWFsbG9jX2ZuKHBuZ19jb25zdGNhc3QocG5nX3N0cnVjdHJwLHBuZ19wdHIpLCBzaXplKTsNCisNCisgICAgICBlbHNlDQorI2VuZGlmDQorICAgICAgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYygoaW50KXNpemUsIDApOw0KKyAgICAgICAgIC8vcmV0dXJuIG1hbGxvYygoc2l6ZV90KXNpemUpOyAvKiBjaGVja2VkIGZvciB0cnVuY2F0aW9uIGFib3ZlICovDQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICAgICByZXR1cm4gTlVMTDsNCit9DQorDQorLyogVGhpcyBpcyByZWFsbHkgaGVyZSBvbmx5IHRvIHdvcmsgcm91bmQgYSBzcHVyaW91cyB3YXJuaW5nIGluIEdDQyA0LjYgYW5kIDQuNw0KKyAqIHRoYXQgYXJpc2VzIGJlY2F1c2Ugb2YgdGhlIGNoZWNrcyBpbiBwbmdfcmVhbGxvY19hcnJheSB0aGF0IGFyZSByZXBlYXRlZCBpbg0KKyAqIHBuZ19tYWxsb2NfYXJyYXkuDQorICovDQorc3RhdGljIHBuZ192b2lkcA0KK3BuZ19tYWxsb2NfYXJyYXlfY2hlY2tlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgaW50IG5lbGVtZW50cywNCisgICBzaXplX3QgZWxlbWVudF9zaXplKQ0KK3sNCisgICBwbmdfYWxsb2Nfc2l6ZV90IHJlcSA9IG5lbGVtZW50czsgLyoga25vd24gdG8gYmUgPiAwICovDQorDQorICAgaWYgKHJlcSA8PSBQTkdfU0laRV9NQVgvZWxlbWVudF9zaXplKQ0KKyAgICAgIHJldHVybiBwbmdfbWFsbG9jX2Jhc2UocG5nX3B0ciwgcmVxICogZWxlbWVudF9zaXplKTsNCisNCisgICAvKiBUaGUgZmFpbHVyZSBjYXNlIHdoZW4gdGhlIHJlcXVlc3QgaXMgdG9vIGxhcmdlICovDQorICAgcmV0dXJuIE5VTEw7DQorfQ0KKw0KK1BOR19GVU5DVElPTihwbmdfdm9pZHAgLyogUFJJVkFURSAqLywNCitwbmdfbWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgaW50IG5lbGVtZW50cywNCisgICBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKQ0KK3sNCisgICBpZiAobmVsZW1lbnRzIDw9IDAgfHwgZWxlbWVudF9zaXplID09IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCBlcnJvcjogYXJyYXkgYWxsb2MiKTsNCisNCisgICByZXR1cm4gcG5nX21hbGxvY19hcnJheV9jaGVja2VkKHBuZ19wdHIsIG5lbGVtZW50cywgZWxlbWVudF9zaXplKTsNCit9DQorDQorUE5HX0ZVTkNUSU9OKHBuZ192b2lkcCAvKiBQUklWQVRFICovLA0KK3BuZ19yZWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X3ZvaWRwIG9sZF9hcnJheSwNCisgICBpbnQgb2xkX2VsZW1lbnRzLCBpbnQgYWRkX2VsZW1lbnRzLCBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKQ0KK3sNCisgICAvKiBUaGVzZSBhcmUgaW50ZXJuYWwgZXJyb3JzOiAqLw0KKyAgIGlmIChhZGRfZWxlbWVudHMgPD0gMCB8fCBlbGVtZW50X3NpemUgPT0gMCB8fCBvbGRfZWxlbWVudHMgPCAwIHx8DQorICAgICAgKG9sZF9hcnJheSA9PSBOVUxMICYmIG9sZF9lbGVtZW50cyA+IDApKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgZXJyb3I6IGFycmF5IHJlYWxsb2MiKTsNCisNCisgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgb24gdGhlIGVsZW1lbnRzIGNvdW50IChzbyB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgdG8NCisgICAgKiBjaGVjay4pDQorICAgICovDQorICAgaWYgKGFkZF9lbGVtZW50cyA8PSBJTlRfTUFYIC0gb2xkX2VsZW1lbnRzKQ0KKyAgIHsNCisgICAgICBwbmdfdm9pZHAgbmV3X2FycmF5ID0gcG5nX21hbGxvY19hcnJheV9jaGVja2VkKHBuZ19wdHIsDQorICAgICAgICAgb2xkX2VsZW1lbnRzK2FkZF9lbGVtZW50cywgZWxlbWVudF9zaXplKTsNCisNCisgICAgICBpZiAobmV3X2FycmF5ICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgIC8qIEJlY2F1c2UgcG5nX21hbGxvY19hcnJheSB3b3JrZWQgdGhlIHNpemUgY2FsY3VsYXRpb25zIGJlbG93IGNhbm5vdA0KKyAgICAgICAgICAqIG92ZXJmbG93Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChvbGRfZWxlbWVudHMgPiAwKQ0KKyAgICAgICAgICAgIG1lbWNweShuZXdfYXJyYXksIG9sZF9hcnJheSwgZWxlbWVudF9zaXplKih1bnNpZ25lZClvbGRfZWxlbWVudHMpOw0KKw0KKyAgICAgICAgIG1lbXNldCgoY2hhciopbmV3X2FycmF5ICsgZWxlbWVudF9zaXplKih1bnNpZ25lZClvbGRfZWxlbWVudHMsIDAsDQorICAgICAgICAgICAgZWxlbWVudF9zaXplKih1bnNpZ25lZClhZGRfZWxlbWVudHMpOw0KKw0KKyAgICAgICAgIHJldHVybiBuZXdfYXJyYXk7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gTlVMTDsgLyogZXJyb3IgKi8NCit9DQorDQorLyogVmFyaW91cyBmdW5jdGlvbnMgdGhhdCBoYXZlIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBhcmUgZGVyaXZlZCBmcm9tIHRoaXMuDQorICogcG5nX21hbGxvYyBhbHdheXMgZXhpc3RzLCBidXQgaWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCBpcyBkZWZpbmVkIGEgc2VwYXJhdGUNCisgKiBmdW5jdGlvbiBwbmdfbWFsbG9jX2RlZmF1bHQgaXMgYWxzbyBwcm92aWRlZC4NCisgKi8NCitQTkdfRlVOQ1RJT04ocG5nX3ZvaWRwLFBOR0FQSQ0KK3BuZ19tYWxsb2MsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLFBOR19BTExPQ0FURUQpDQorew0KKyAgIHBuZ192b2lkcCByZXQ7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm4gTlVMTDsNCisNCisgICByZXQgPSBwbmdfbWFsbG9jX2Jhc2UocG5nX3B0ciwgc2l6ZSk7DQorDQorICAgaWYgKHJldCA9PSBOVUxMKQ0KKyAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkiKTsgLyogJ20nIG1lYW5zIHBuZ19tYWxsb2MgKi8NCisNCisgICByZXR1cm4gcmV0Ow0KK30NCisNCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRA0KK1BOR19GVU5DVElPTihwbmdfdm9pZHAsUE5HQVBJDQorcG5nX21hbGxvY19kZWZhdWx0LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKSwNCisgICBQTkdfQUxMT0NBVEVEIFBOR19ERVBSRUNBVEVEKQ0KK3sNCisgICBwbmdfdm9pZHAgcmV0Ow0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIE5VTEw7DQorDQorICAgLyogUGFzc2luZyAnTlVMTCcgaGVyZSBieXBhc3NlcyB0aGUgYXBwbGljYXRpb24gcHJvdmlkZWQgbWVtb3J5IGhhbmRsZXIuICovDQorICAgcmV0ID0gcG5nX21hbGxvY19iYXNlKE5VTEwvKnVzZSBtYWxsb2MqLywgc2l6ZSk7DQorDQorICAgaWYgKHJldCA9PSBOVUxMKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIE1lbW9yeSIpOyAvKiAnTScgbWVhbnMgcG5nX21hbGxvY19kZWZhdWx0ICovDQorDQorICAgcmV0dXJuIHJldDsNCit9DQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8NCisNCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMy4gIFRoZSBwbmdfbWFsbG9jX3dhcm4oKQ0KKyAqIGZ1bmN0aW9uIHdpbGwgaXNzdWUgYSBwbmdfd2FybmluZyBhbmQgcmV0dXJuIE5VTEwgaW5zdGVhZCBvZiBpc3N1aW5nIGENCisgKiBwbmdfZXJyb3IsIGlmIGl0IGZhaWxzIHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbWVtb3J5Lg0KKyAqLw0KK1BOR19GVU5DVElPTihwbmdfdm9pZHAsUE5HQVBJDQorcG5nX21hbGxvY193YXJuLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKSwNCisgICBQTkdfQUxMT0NBVEVEKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfdm9pZHAgcmV0ID0gcG5nX21hbGxvY19iYXNlKHBuZ19wdHIsIHNpemUpOw0KKw0KKyAgICAgIGlmIChyZXQgIT0gTlVMTCkNCisgICAgICAgICByZXR1cm4gcmV0Ow0KKw0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5Iik7DQorICAgfQ0KKw0KKyAgIHJldHVybiBOVUxMOw0KK30NCisNCisvKiBGcmVlIGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgcG5nX21hbGxvYygpLiAgSWYgcHRyIGlzIE5VTEwsIHJldHVybg0KKyAqIHdpdGhvdXQgdGFraW5nIGFueSBhY3Rpb24uDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfZnJlZShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBwdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+ZnJlZV9mbiAhPSBOVUxMKQ0KKyAgICAgIHBuZ19wdHItPmZyZWVfZm4ocG5nX2NvbnN0Y2FzdChwbmdfc3RydWN0cnAscG5nX3B0ciksIHB0cik7DQorDQorICAgZWxzZQ0KKyAgICAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcHRyKTsNCit9DQorDQorUE5HX0ZVTkNUSU9OKHZvaWQsUE5HQVBJDQorcG5nX2ZyZWVfZGVmYXVsdCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpLFBOR19ERVBSRUNBVEVEKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLw0KKw0KKyAgIEZYTUVNX0RlZmF1bHRGcmVlKHB0ciwgMCk7DQorICAgLy9mcmVlKHB0cik7DQorfQ0KKw0KKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEDQorLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gdXNlIGFub3RoZXIgbWV0aG9kDQorICogb2YgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBtZW1vcnkuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X21lbV9mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyDQorICBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5tZW1fcHRyID0gbWVtX3B0cjsNCisgICAgICBwbmdfcHRyLT5tYWxsb2NfZm4gPSBtYWxsb2NfZm47DQorICAgICAgcG5nX3B0ci0+ZnJlZV9mbiA9IGZyZWVfZm47DQorICAgfQ0KK30NCisNCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZW1fcHRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcg0KKyAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzDQorICogcG9pbnRlciBiZWZvcmUgcG5nX3dyaXRlX2Rlc3Ryb3kgYW5kIHBuZ19yZWFkX2Rlc3Ryb3kgYXJlIGNhbGxlZC4NCisgKi8NCitwbmdfdm9pZHAgUE5HQVBJDQorcG5nX2dldF9tZW1fcHRyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKw0KKyAgIHJldHVybiBwbmdfcHRyLT5tZW1fcHRyOw0KK30NCisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLw0KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncHJlYWQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDUwNTNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdwcmVhZC5jCkBAIC0wLDAgKzEsMTI5MiBAQAorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorLyogcG5ncHJlYWQuYyAtIHJlYWQgYSBwbmcgZmlsZSBpbiBwdXNoIG1vZGUNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjAgW0ZlYnJ1YXJ5IDE0LCAyMDEzXQ0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWZkZWYgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEDQorDQorLyogUHVzaCBtb2RlbCBtb2RlcyAqLw0KKyNkZWZpbmUgUE5HX1JFQURfU0lHX01PREUgICAwDQorI2RlZmluZSBQTkdfUkVBRF9DSFVOS19NT0RFIDENCisjZGVmaW5lIFBOR19SRUFEX0lEQVRfTU9ERSAgMg0KKyNkZWZpbmUgUE5HX1NLSVBfTU9ERSAgICAgICAzDQorI2RlZmluZSBQTkdfUkVBRF90RVh0X01PREUgIDQNCisjZGVmaW5lIFBOR19SRUFEX3pUWHRfTU9ERSAgNQ0KKyNkZWZpbmUgUE5HX1JFQURfRE9ORV9NT0RFICA2DQorI2RlZmluZSBQTkdfUkVBRF9pVFh0X01PREUgIDcNCisjZGVmaW5lIFBOR19FUlJPUl9NT0RFICAgICAgOA0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3Byb2Nlc3NfZGF0YShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfc2l6ZSkNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHVzaF9yZXN0b3JlX2J1ZmZlcihwbmdfcHRyLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsNCisNCisgICB3aGlsZSAocG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19wcm9jZXNzX3NvbWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0cik7DQorICAgfQ0KK30NCisNCitwbmdfc2l6ZV90IFBOR0FQSQ0KK3BuZ19wcm9jZXNzX2RhdGFfcGF1c2UocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBzYXZlKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAvKiBJdCdzIGVhc2llc3QgZm9yIHRoZSBjYWxsZXIgaWYgd2UgZG8gdGhlIHNhdmUsIHRoZW4gdGhlIGNhbGxlciBkb2Vzbid0DQorICAgICAgICogaGF2ZSB0byBzdXBwbHkgdGhlIHNhbWUgZGF0YSBhZ2FpbjoNCisgICAgICAgKi8NCisgICAgICBpZiAoc2F2ZSkNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIC8qIFRoaXMgaW5jbHVkZXMgYW55IHBlbmRpbmcgc2F2ZWQgYnl0ZXM6ICovDQorICAgICAgICAgcG5nX3NpemVfdCByZW1haW5pbmcgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsNCisgICAgICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSA9IDA7DQorDQorICAgICAgICAgLyogU28gc3VidHJhY3QgdGhlIHNhdmVkIGJ1ZmZlciBzaXplLCB1bmxlc3MgYWxsIHRoZSBkYXRhDQorICAgICAgICAgICogaXMgYWN0dWFsbHkgJ3NhdmVkJywgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IHJldHVybiAwDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgPCByZW1haW5pbmcpDQorICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyAtIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gMDsNCit9DQorDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX3Byb2Nlc3NfZGF0YV9za2lwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfdWludF8zMiByZW1haW5pbmcgPSAwOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID09IFBOR19TS0lQX01PREUgJiYNCisgICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCA+IDApDQorICAgew0KKyAgICAgIC8qIEF0IHRoZSBlbmQgb2YgcG5nX3Byb2Nlc3NfZGF0YSB0aGUgYnVmZmVyIHNpemUgbXVzdCBiZSAwIChzZWUgdGhlIGxvb3ANCisgICAgICAgKiBhYm92ZSkgc28gd2UgY2FuIGRldGVjdCBhIGJyb2tlbiBjYWxsIGhlcmU6DQorICAgICAgICovDQorICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplICE9IDApDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgInBuZ19wcm9jZXNzX2RhdGFfc2tpcCBjYWxsZWQgaW5zaWRlIHBuZ19wcm9jZXNzX2RhdGEiKTsNCisNCisgICAgICAvKiBJZiBpcyBpbXBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBhIHNhdmVkIGJ1ZmZlciBhdCB0aGlzIHBvaW50IC0NCisgICAgICAgKiBvdGhlcndpc2Ugd2UgY291bGQgbm90IGJlIGluIFNLSVAgbW9kZS4gIFRoaXMgd2lsbCBhbHNvIGhhcHBlbiBpZg0KKyAgICAgICAqIHBuZ19wcm9jZXNzX3NraXAgaXMgY2FsbGVkIGluc2lkZSBwbmdfcHJvY2Vzc19kYXRhIChidXQgb25seSB2ZXJ5DQorICAgICAgICogcmFyZWx5LikNCisgICAgICAgKi8NCisgICAgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAhPSAwKQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX3Byb2Nlc3NfZGF0YV9za2lwIGNhbGxlZCB3aXRoIHNhdmVkIGRhdGEiKTsNCisNCisgICAgICByZW1haW5pbmcgPSBwbmdfcHRyLT5za2lwX2xlbmd0aDsNCisgICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCA9IDA7DQorICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfQ0hVTktfTU9ERTsNCisgICB9DQorDQorICAgcmV0dXJuIHJlbWFpbmluZzsNCit9DQorDQorLyogV2hhdCB3ZSBkbyB3aXRoIHRoZSBpbmNvbWluZyBkYXRhIGRlcGVuZHMgb24gd2hhdCB3ZSB3ZXJlIHByZXZpb3VzbHkNCisgKiBkb2luZyBiZWZvcmUgd2UgcmFuIG91dCBvZiBkYXRhLi4uDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3Byb2Nlc3Nfc29tZV9kYXRhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBzd2l0Y2ggKHBuZ19wdHItPnByb2Nlc3NfbW9kZSkNCisgICB7DQorICAgICAgY2FzZSBQTkdfUkVBRF9TSUdfTU9ERToNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfcmVhZF9zaWcocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBjYXNlIFBOR19SRUFEX0NIVU5LX01PREU6DQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3JlYWRfY2h1bmsocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBjYXNlIFBOR19SRUFEX0lEQVRfTU9ERToNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfcmVhZF9JREFUKHBuZ19wdHIpOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBjYXNlIFBOR19TS0lQX01PREU6DQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX2NyY19maW5pc2gocG5nX3B0cik7DQorICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gMDsNCisgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgfQ0KK30NCisNCisvKiBSZWFkIGFueSByZW1haW5pbmcgc2lnbmF0dXJlIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgY29tcGFyZSB0aGVtIHdpdGgNCisgKiB0aGUgY29ycmVjdCBQTkcgc2lnbmF0dXJlLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkDQorICogd2l0aCBieXRlcyBhbHJlYWR5IHJlYWQgZnJvbSB0aGUgc2lnbmF0dXJlLCBlaXRoZXIgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbg0KKyAqIGNoZWNrZWQgYnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24sIG9yIGJlY2F1c2Ugb2YgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcw0KKyAqIHJvdXRpbmUuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3B1c2hfcmVhZF9zaWcocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHBuZ19zaXplX3QgbnVtX2NoZWNrZWQgPSBwbmdfcHRyLT5zaWdfYnl0ZXMsIC8qIFNBRkUsIGRvZXMgbm90IGV4Y2VlZCA4ICovIA0KKyAgICAgICAgICAgICBudW1fdG9fY2hlY2sgPSA4IC0gbnVtX2NoZWNrZWQ7DQorDQorICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgbnVtX3RvX2NoZWNrKQ0KKyAgIHsNCisgICAgICBudW1fdG9fY2hlY2sgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsNCisgICB9DQorDQorICAgcG5nX3B1c2hfZmlsbF9idWZmZXIocG5nX3B0ciwgJihpbmZvX3B0ci0+c2lnbmF0dXJlW251bV9jaGVja2VkXSksDQorICAgICAgIG51bV90b19jaGVjayk7DQorICAgcG5nX3B0ci0+c2lnX2J5dGVzID0gKHBuZ19ieXRlKShwbmdfcHRyLT5zaWdfYnl0ZXMgKyBudW1fdG9fY2hlY2spOw0KKw0KKyAgIGlmIChwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrKSkNCisgICB7DQorICAgICAgaWYgKG51bV9jaGVja2VkIDwgNCAmJg0KKyAgICAgICAgICBwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrIC0gNCkpDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgYSBQTkcgZmlsZSIpOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBORyBmaWxlIGNvcnJ1cHRlZCBieSBBU0NJSSBjb252ZXJzaW9uIik7DQorICAgfQ0KKyAgIGVsc2UNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA+PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9DSFVOS19NT0RFOw0KKyAgICAgIH0NCisgICB9DQorfQ0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19wdXNoX3JlYWRfY2h1bmsocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHBuZ191aW50XzMyIGNodW5rX25hbWU7DQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQNCisgICBpbnQga2VlcDsgLyogdW5rbm93biBoYW5kbGluZyBtZXRob2QgKi8NCisjZW5kaWYNCisNCisgICAvKiBGaXJzdCB3ZSBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSBmb3IgdGhlIDQgYnl0ZSBjaHVuayBuYW1lDQorICAgICogYW5kIHRoZSA0IGJ5dGUgY2h1bmsgbGVuZ3RoIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggZGVjb2RpbmcgdGhlDQorICAgICogY2h1bmsgZGF0YS4gIFRvIGZ1bGx5IGRlY29kZSBlYWNoIG9mIHRoZXNlIGNodW5rcywgd2UgYWxzbyBtYWtlDQorICAgICogc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIGluIHRoZSBidWZmZXIgZm9yIHRoZSA0IGJ5dGUgQ1JDIGF0IHRoZQ0KKyAgICAqIGVuZCBvZiBldmVyeSBjaHVuayAoZXhjZXB0IElEQVQsIHdoaWNoIGlzIGhhbmRsZWQgc2VwYXJhdGVseSkuDQorICAgICovDQorICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0hFQURFUikpDQorICAgew0KKyAgICAgIHBuZ19ieXRlIGNodW5rX2xlbmd0aFs0XTsNCisgICAgICBwbmdfYnl0ZSBjaHVua190YWdbNF07DQorDQorICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgOCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfcHRyLCBjaHVua19sZW5ndGgsIDQpOw0KKyAgICAgIHBuZ19wdHItPnB1c2hfbGVuZ3RoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rX2xlbmd0aCk7DQorICAgICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsNCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgY2h1bmtfdGFnLCA0KTsNCisgICAgICBwbmdfcHRyLT5jaHVua19uYW1lID0gUE5HX0NIVU5LX0ZST01fU1RSSU5HKGNodW5rX3RhZyk7DQorICAgICAgcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7DQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9DSFVOS19IRUFERVI7DQorICAgfQ0KKw0KKyAgIGNodW5rX25hbWUgPSBwbmdfcHRyLT5jaHVua19uYW1lOw0KKw0KKyAgIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKQ0KKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVDsNCisNCisgICAgICAvKiBJZiB3ZSByZWFjaCBhbiBJREFUIGNodW5rLCB0aGlzIG1lYW5zIHdlIGhhdmUgcmVhZCBhbGwgb2YgdGhlDQorICAgICAgICogaGVhZGVyIGNodW5rcywgYW5kIHdlIGNhbiBzdGFydCByZWFkaW5nIHRoZSBpbWFnZSAob3IgaWYgdGhpcw0KKyAgICAgICAqIGlzIGNhbGxlZCBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW4gcmVhZCAtIHdlIGhhdmUgYW4gZXJyb3IpLg0KKyAgICAgICAqLw0KKyAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgSURBVCIpOw0KKw0KKyAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJg0KKyAgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgSURBVCIpOw0KKw0KKyAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSURBVDsNCisNCisgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkpDQorICAgICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoID09IDApDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0FGVEVSX0lEQVQpDQorICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVHMgZm91bmQiKTsNCisgICB9DQorDQorICAgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lIRFIpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCAhPSAxMykNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgSUhEUiBsZW5ndGgiKTsNCisNCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lFTkQpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisNCisgICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9ET05FX01PREU7DQorICAgICAgcG5nX3B1c2hfaGF2ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgIH0NCisNCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKChrZWVwID0gcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcocG5nX3B0ciwgY2h1bmtfbmFtZSkpICE9IDApDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoLCBrZWVwKTsNCisNCisgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfUExURSkNCisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7DQorICAgfQ0KKw0KKyNlbmRpZg0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX1BMVEUpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBwbmdfaGFuZGxlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSURBVCkNCisgICB7DQorICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3B0ci0+cHVzaF9sZW5ndGg7DQorICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfSURBVF9NT0RFOw0KKyAgICAgIHBuZ19wdXNoX2hhdmVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPQ0KKyAgICAgICAgICAodUludCkgUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLA0KKyAgICAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMTsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+cm93X2J1ZjsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNodW5rX25hbWUgPT0gcG5nX2dBTUEpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAocG5nX3B0ci0+Y2h1bmtfbmFtZSA9PSBwbmdfc0JJVCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19oYW5kbGVfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOw0KKyAgIH0NCisNCisjZW5kaWYNCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQNCisgICBlbHNlIGlmIChwbmdfcHRyLT5jaHVua19uYW1lID09IHBuZ19jSFJNKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2hhbmRsZV9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7DQorICAgfQ0KKw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NSR0IpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAocG5nX3B0ci0+Y2h1bmtfbmFtZSA9PSBwbmdfaUNDUCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19oYW5kbGVfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOw0KKyAgIH0NCisNCisjZW5kaWYNCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQNCisgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zUExUKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2hhbmRsZV9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7DQorICAgfQ0KKw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3RSTlMpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfYktHRCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19oYW5kbGVfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOw0KKyAgIH0NCisNCisjZW5kaWYNCisjaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQNCisgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19oSVNUKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2hhbmRsZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7DQorICAgfQ0KKw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3BIWXMpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfb0ZGcykNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19oYW5kbGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOw0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQNCisgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19wQ0FMKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2hhbmRsZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7DQorICAgfQ0KKw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3NDQUwpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfdElNRSkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19oYW5kbGVfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOw0KKyAgIH0NCisNCisjZW5kaWYNCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQNCisgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ190RVh0KQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2hhbmRsZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7DQorICAgfQ0KKw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRA0KKyAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX3pUWHQpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfaGFuZGxlX3pUWHQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsNCisgICB9DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfaVRYdCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19oYW5kbGVfaVRYdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOw0KKyAgIH0NCisNCisjZW5kaWYNCisgICBlbHNlDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoLA0KKyAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCk7DQorICAgfQ0KKw0KKyAgIHBuZ19wdHItPm1vZGUgJj0gflBOR19IQVZFX0NIVU5LX0hFQURFUjsNCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3B1c2hfY3JjX3NraXAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNraXApDQorew0KKyAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19TS0lQX01PREU7DQorICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggPSBza2lwOw0KK30NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfcHVzaF9jcmNfZmluaXNoKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggJiYgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkNCisgICB7DQorICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemUgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplOw0KKyAgICAgIHBuZ191aW50XzMyIHNraXBfbGVuZ3RoID0gcG5nX3B0ci0+c2tpcF9sZW5ndGg7DQorDQorICAgICAgLyogV2Ugd2FudCB0aGUgc21hbGxlciBvZiAnc2tpcF9sZW5ndGgnIGFuZCAnc2F2ZV9idWZmZXJfc2l6ZScsIGJ1dA0KKyAgICAgICAqIHRoZXkgYXJlIG9mIGRpZmZlcmVudCB0eXBlcyBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaCB2YXJpYWJsZSBoYXMgdGhlDQorICAgICAgICogZmV3ZXN0IGJpdHMuICBDYXJlZnVsbHkgc2VsZWN0IHRoZSBzbWFsbGVyIGFuZCBjYXN0IGl0IHRvIHRoZSB0eXBlIG9mDQorICAgICAgICogdGhlIGxhcmdlciAtIHRoaXMgY2Fubm90IG92ZXJmbG93LiAgRG8gbm90IGNhc3QgaW4gdGhlIGZvbGxvd2luZyB0ZXN0DQorICAgICAgICogLSBpdCB3aWxsIGJyZWFrIG9uIGVpdGhlciAxNiBvciA2NCBiaXQgcGxhdGZvcm1zLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChza2lwX2xlbmd0aCA8IHNhdmVfc2l6ZSkNCisgICAgICAgICBzYXZlX3NpemUgPSAocG5nX3NpemVfdClza2lwX2xlbmd0aDsNCisNCisgICAgICBlbHNlDQorICAgICAgICAgc2tpcF9sZW5ndGggPSAocG5nX3VpbnRfMzIpc2F2ZV9zaXplOw0KKw0KKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsNCisNCisgICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCAtPSBza2lwX2xlbmd0aDsNCisgICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7DQorICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7DQorICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyICs9IHNhdmVfc2l6ZTsNCisgICB9DQorICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoICYmIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsNCisgICAgICBwbmdfdWludF8zMiBza2lwX2xlbmd0aCA9IHBuZ19wdHItPnNraXBfbGVuZ3RoOw0KKw0KKyAgICAgIC8qIFdlIHdhbnQgdGhlIHNtYWxsZXIgb2YgJ3NraXBfbGVuZ3RoJyBhbmQgJ2N1cnJlbnRfYnVmZmVyX3NpemUnLCBoZXJlLA0KKyAgICAgICAqIHRoZSBzYW1lIHByb2JsZW0gZXhpc3RzIGFzIGFib3ZlIGFuZCB0aGUgc2FtZSBzb2x1dGlvbi4NCisgICAgICAgKi8NCisgICAgICBpZiAoc2tpcF9sZW5ndGggPCBzYXZlX3NpemUpDQorICAgICAgICAgc2F2ZV9zaXplID0gKHBuZ19zaXplX3Qpc2tpcF9sZW5ndGg7DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHNraXBfbGVuZ3RoID0gKHBuZ191aW50XzMyKXNhdmVfc2l6ZTsNCisNCisgICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7DQorDQorICAgICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggLT0gc2tpcF9sZW5ndGg7DQorICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOw0KKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOw0KKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7DQorICAgfQ0KKyAgIGlmICghcG5nX3B0ci0+c2tpcF9sZW5ndGgpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDQpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7DQorICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfQ0hVTktfTU9ERTsNCisgICB9DQorfQ0KKw0KK3ZvaWQgUE5HQ0JBUEkNCitwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCkNCit7DQorICAgcG5nX2J5dGVwIHB0cjsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwdHIgPSBidWZmZXI7DQorICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOw0KKw0KKyAgICAgIGlmIChsZW5ndGggPCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQ0KKyAgICAgICAgIHNhdmVfc2l6ZSA9IGxlbmd0aDsNCisNCisgICAgICBlbHNlDQorICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsNCisNCisgICAgICBtZW1jcHkocHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7DQorICAgICAgbGVuZ3RoIC09IHNhdmVfc2l6ZTsNCisgICAgICBwdHIgKz0gc2F2ZV9zaXplOw0KKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsNCisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsNCisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOw0KKyAgIH0NCisgICBpZiAobGVuZ3RoICYmIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOw0KKw0KKyAgICAgIGlmIChsZW5ndGggPCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQ0KKyAgICAgICAgIHNhdmVfc2l6ZSA9IGxlbmd0aDsNCisNCisgICAgICBlbHNlDQorICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsNCisNCisgICAgICBtZW1jcHkocHRyLCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7DQorICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOw0KKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOw0KKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7DQorICAgfQ0KK30NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgIT0gcG5nX3B0ci0+c2F2ZV9idWZmZXIpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19zaXplX3QgaSwgaXN0b3A7DQorICAgICAgICAgcG5nX2J5dGVwIHNwOw0KKyAgICAgICAgIHBuZ19ieXRlcCBkcDsNCisNCisgICAgICAgICBpc3RvcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7DQorICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIGRwID0gcG5nX3B0ci0+c2F2ZV9idWZmZXI7DQorICAgICAgICAgICAgIGkgPCBpc3RvcDsgaSsrLCBzcCsrLCBkcCsrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAqZHAgPSAqc3A7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICB9DQorICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgKyBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplID4NCisgICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfbWF4KQ0KKyAgIHsNCisgICAgICBwbmdfc2l6ZV90IG5ld19tYXg7DQorICAgICAgcG5nX2J5dGVwIG9sZF9idWZmZXI7DQorDQorICAgICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgPiBQTkdfU0laRV9NQVggLQ0KKyAgICAgICAgICAocG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NikpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUG90ZW50aWFsIG92ZXJmbG93IG9mIHNhdmVfYnVmZmVyIik7DQorICAgICAgfQ0KKw0KKyAgICAgIG5ld19tYXggPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICsgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NjsNCisgICAgICBvbGRfYnVmZmVyID0gcG5nX3B0ci0+c2F2ZV9idWZmZXI7DQorICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXIgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLA0KKyAgICAgICAgICAocG5nX3NpemVfdCluZXdfbWF4KTsNCisNCisgICAgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXIgPT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX2J1ZmZlcik7DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBzYXZlX2J1ZmZlciIpOw0KKyAgICAgIH0NCisNCisgICAgICBtZW1jcHkocG5nX3B0ci0+c2F2ZV9idWZmZXIsIG9sZF9idWZmZXIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpOw0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF9idWZmZXIpOw0KKyAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX21heCA9IG5ld19tYXg7DQorICAgfQ0KKyAgIGlmIChwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQ0KKyAgIHsNCisgICAgICBtZW1jcHkocG5nX3B0ci0+c2F2ZV9idWZmZXIgKyBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplLA0KKyAgICAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSk7DQorICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSArPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOw0KKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgPSAwOw0KKyAgIH0NCisgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsNCisgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSA9IDA7DQorfQ0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLA0KKyAgIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkNCit7DQorICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXIgPSBidWZmZXI7DQorICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9sZW5ndGg7DQorICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgPSBidWZmZXJfbGVuZ3RoICsgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsNCisgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcjsNCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3B1c2hfcmVhZF9JREFUKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfSEVBREVSKSkNCisgICB7DQorICAgICAgcG5nX2J5dGUgY2h1bmtfbGVuZ3RoWzRdOw0KKyAgICAgIHBuZ19ieXRlIGNodW5rX3RhZ1s0XTsNCisNCisgICAgICAvKiBUT0RPOiB0aGlzIGNvZGUgY2FuIGJlIGNvbW1vbmVkIHVwIHdpdGggdGhlIHNhbWUgY29kZSBpbiBwdXNoX3JlYWQgKi8NCisgICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCA4KQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKHBuZ19wdHIsIGNodW5rX2xlbmd0aCwgNCk7DQorICAgICAgcG5nX3B0ci0+cHVzaF9sZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgY2h1bmtfbGVuZ3RoKTsNCisgICAgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOw0KKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBjaHVua190YWcsIDQpOw0KKyAgICAgIHBuZ19wdHItPmNodW5rX25hbWUgPSBQTkdfQ0hVTktfRlJPTV9TVFJJTkcoY2h1bmtfdGFnKTsNCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0hFQURFUjsNCisNCisgICAgICBpZiAocG5nX3B0ci0+Y2h1bmtfbmFtZSAhPSBwbmdfSURBVCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfQ0hVTktfTU9ERTsNCisNCisgICAgICAgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pTVFJFQU1fRU5ERUQpKQ0KKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm90IGVub3VnaCBjb21wcmVzc2VkIGRhdGEiKTsNCisNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSA9IHBuZ19wdHItPnB1c2hfbGVuZ3RoOw0KKyAgIH0NCisNCisgICBpZiAocG5nX3B0ci0+aWRhdF9zaXplICYmIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsNCisgICAgICBwbmdfdWludF8zMiBpZGF0X3NpemUgPSBwbmdfcHRyLT5pZGF0X3NpemU7DQorDQorICAgICAgLyogV2Ugd2FudCB0aGUgc21hbGxlciBvZiAnaWRhdF9zaXplJyBhbmQgJ2N1cnJlbnRfYnVmZmVyX3NpemUnLCBidXQgdGhleQ0KKyAgICAgICAqIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMgYW5kIHdlIGRvbid0IGtub3cgd2hpY2ggdmFyaWFibGUgaGFzIHRoZSBmZXdlc3QNCisgICAgICAgKiBiaXRzLiAgQ2FyZWZ1bGx5IHNlbGVjdCB0aGUgc21hbGxlciBhbmQgY2FzdCBpdCB0byB0aGUgdHlwZSBvZiB0aGUNCisgICAgICAgKiBsYXJnZXIgLSB0aGlzIGNhbm5vdCBvdmVyZmxvdy4gIERvIG5vdCBjYXN0IGluIHRoZSBmb2xsb3dpbmcgdGVzdCAtIGl0DQorICAgICAgICogd2lsbCBicmVhayBvbiBlaXRoZXIgMTYgb3IgNjQgYml0IHBsYXRmb3Jtcy4NCisgICAgICAgKi8NCisgICAgICBpZiAoaWRhdF9zaXplIDwgc2F2ZV9zaXplKQ0KKyAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KWlkYXRfc2l6ZTsNCisNCisgICAgICBlbHNlDQorICAgICAgICAgaWRhdF9zaXplID0gKHBuZ191aW50XzMyKXNhdmVfc2l6ZTsNCisNCisgICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7DQorDQorICAgICAgcG5nX3Byb2Nlc3NfSURBVF9kYXRhKHBuZ19wdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsNCisNCisgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gaWRhdF9zaXplOw0KKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsNCisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsNCisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOw0KKyAgIH0NCisNCisgICBpZiAocG5nX3B0ci0+aWRhdF9zaXplICYmIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsNCisgICAgICBwbmdfdWludF8zMiBpZGF0X3NpemUgPSBwbmdfcHRyLT5pZGF0X3NpemU7DQorDQorICAgICAgLyogV2Ugd2FudCB0aGUgc21hbGxlciBvZiAnaWRhdF9zaXplJyBhbmQgJ2N1cnJlbnRfYnVmZmVyX3NpemUnLCBidXQgdGhleQ0KKyAgICAgICAqIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMgYW5kIHdlIGRvbid0IGtub3cgd2hpY2ggdmFyaWFibGUgaGFzIHRoZSBmZXdlc3QNCisgICAgICAgKiBiaXRzLiAgQ2FyZWZ1bGx5IHNlbGVjdCB0aGUgc21hbGxlciBhbmQgY2FzdCBpdCB0byB0aGUgdHlwZSBvZiB0aGUNCisgICAgICAgKiBsYXJnZXIgLSB0aGlzIGNhbm5vdCBvdmVyZmxvdy4NCisgICAgICAgKi8NCisgICAgICBpZiAoaWRhdF9zaXplIDwgc2F2ZV9zaXplKQ0KKyAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KWlkYXRfc2l6ZTsNCisNCisgICAgICBlbHNlDQorICAgICAgICAgaWRhdF9zaXplID0gKHBuZ191aW50XzMyKXNhdmVfc2l6ZTsNCisNCisgICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7DQorDQorICAgICAgcG5nX3Byb2Nlc3NfSURBVF9kYXRhKHBuZ19wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsNCisNCisgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gaWRhdF9zaXplOw0KKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsNCisgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsNCisgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOw0KKyAgIH0NCisgICBpZiAoIXBuZ19wdHItPmlkYXRfc2l6ZSkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgNCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsNCisgICAgICBwbmdfcHRyLT5tb2RlICY9IH5QTkdfSEFWRV9DSFVOS19IRUFERVI7DQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsNCisgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOw0KKyAgIH0NCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3Byb2Nlc3NfSURBVF9kYXRhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLA0KKyAgIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkNCit7DQorICAgLyogVGhlIGNhbGxlciBjaGVja3MgZm9yIGEgbm9uLXplcm8gYnVmZmVyIGxlbmd0aC4gKi8NCisgICBpZiAoIShidWZmZXJfbGVuZ3RoID4gMCkgfHwgYnVmZmVyID09IE5VTEwpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJObyBJREFUIGRhdGEgKGludGVybmFsIGVycm9yKSIpOw0KKw0KKyAgIC8qIFRoaXMgcm91dGluZSBtdXN0IHByb2Nlc3MgYWxsIHRoZSBkYXRhIGl0IGhhcyBiZWVuIGdpdmVuDQorICAgICogYmVmb3JlIHJldHVybmluZywgY2FsbGluZyB0aGUgcm93IGNhbGxiYWNrIGFzIHJlcXVpcmVkIHRvDQorICAgICogaGFuZGxlIHRoZSB1bmNvbXByZXNzZWQgcmVzdWx0cy4NCisgICAgKi8NCisgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBidWZmZXI7DQorICAgLyogVE9ETzogV0FSTklORzogVFJVTkNBVElPTiBFUlJPUjogREFOR0VSIFdJTEwgUk9CSU5TT046ICovDQorICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWJ1ZmZlcl9sZW5ndGg7DQorDQorICAgLyogS2VlcCBnb2luZyB1bnRpbCB0aGUgZGVjb21wcmVzc2VkIGRhdGEgaXMgYWxsIHByb2Nlc3NlZA0KKyAgICAqIG9yIHRoZSBzdHJlYW0gbWFya2VkIGFzIGZpbmlzaGVkLg0KKyAgICAqLw0KKyAgIHdoaWxlIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID4gMCAmJg0KKyAgICAgICEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aU1RSRUFNX0VOREVEKSkNCisgICB7DQorICAgICAgaW50IHJldDsNCisNCisgICAgICAvKiBXZSBoYXZlIGRhdGEgZm9yIHpsaWIsIGJ1dCB3ZSBtdXN0IGNoZWNrIHRoYXQgemxpYg0KKyAgICAgICAqIGhhcyBzb21lcGxhY2UgdG8gcHV0IHRoZSByZXN1bHRzLiAgSXQgZG9lc24ndCBtYXR0ZXINCisgICAgICAgKiBpZiB3ZSBkb24ndCBleHBlY3QgYW55IHJlc3VsdHMgLS0gaXQgbWF5IGJlIHRoZSBpbnB1dA0KKyAgICAgICAqIGRhdGEgaXMganVzdCB0aGUgTFogZW5kIGNvZGUuDQorICAgICAgICovDQorICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPiAwKSkNCisgICAgICB7DQorICAgICAgICAgLyogVE9ETzogV0FSTklORzogVFJVTkNBVElPTiBFUlJPUjogREFOR0VSIFdJTEwgUk9CSU5TT046ICovDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkoUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLA0KKyAgICAgICAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMSk7DQorDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFVzaW5nIFpfU1lOQ19GTFVTSCBoZXJlIG1lYW5zIHRoYXQgYW4gdW50ZXJtaW5hdGVkDQorICAgICAgICogTFogc3RyZWFtIChhIHN0cmVhbSB3aXRoIGEgbWlzc2luZyBlbmQgY29kZSkgY2FuIHN0aWxsDQorICAgICAgICogYmUgaGFuZGxlZCwgb3RoZXJ3aXNlIChaX05PX0ZMVVNIKSBhIGZ1dHVyZSB6bGliDQorICAgICAgICogaW1wbGVtZW50YXRpb24gbWlnaHQgZGVmZXIgb3V0cHV0IGFuZCB0aGVyZWZvcmUNCisgICAgICAgKiBjaGFuZ2UgdGhlIGN1cnJlbnQgYmVoYXZpb3IgKHNlZSBjb21tZW50cyBpbiBpbmZsYXRlLmMNCisgICAgICAgKiBmb3Igd2h5IHRoaXMgZG9lc24ndCBoYXBwZW4gYXQgcHJlc2VudCB3aXRoIHpsaWIgMS4yLjUpLg0KKyAgICAgICAqLw0KKyAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfU1lOQ19GTFVTSCk7DQorDQorICAgICAgLyogQ2hlY2sgZm9yIGFueSBmYWlsdXJlIGJlZm9yZSBwcm9jZWVkaW5nLiAqLw0KKyAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBUZXJtaW5hdGUgdGhlIGRlY29tcHJlc3Npb24uICovDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWlNUUkVBTV9FTkRFRDsNCisgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOw0KKw0KKyAgICAgICAgIC8qIFRoaXMgbWF5IGJlIGEgdHJ1bmNhdGVkIHN0cmVhbSAobWlzc2luZyBvcg0KKyAgICAgICAgICAqIGRhbWFnZWQgZW5kIGNvZGUpLiAgVHJlYXQgdGhhdCBhcyBhIHdhcm5pbmcuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPj0gcG5nX3B0ci0+bnVtX3Jvd3MgfHwNCisgICAgICAgICAgICAgcG5nX3B0ci0+cGFzcyA+IDYpDQorICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCBjb21wcmVzc2VkIGRhdGEgaW4gSURBVCIpOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkRlY29tcHJlc3Npb24gZXJyb3IgaW4gSURBVCIpOw0KKw0KKyAgICAgICAgIC8qIFNraXAgdGhlIGNoZWNrIG9uIHVucHJvY2Vzc2VkIGlucHV0ICovDQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBEaWQgaW5mbGF0ZSBvdXRwdXQgYW55IGRhdGE/ICovDQorICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgIT0gcG5nX3B0ci0+cm93X2J1ZikNCisgICAgICB7DQorICAgICAgICAgLyogSXMgdGhpcyB1bmV4cGVjdGVkIGRhdGEgYWZ0ZXIgdGhlIGxhc3Qgcm93Pw0KKyAgICAgICAgICAqIElmIGl0IGlzLCBhcnRpZmljaWFsbHkgdGVybWluYXRlIHRoZSBMWiBvdXRwdXQNCisgICAgICAgICAgKiBoZXJlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID49IHBuZ19wdHItPm51bV9yb3dzIHx8DQorICAgICAgICAgICAgIHBuZ19wdHItPnBhc3MgPiA2KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBFeHRyYSBkYXRhLiAqLw0KKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEgaW4gSURBVCIpOw0KKyAgICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pTVFJFQU1fRU5ERUQ7DQorICAgICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsNCisNCisgICAgICAgICAgICAvKiBEbyBubyBtb3JlIHByb2Nlc3Npbmc7IHNraXAgdGhlIHVucHJvY2Vzc2VkDQorICAgICAgICAgICAgICogaW5wdXQgY2hlY2sgYmVsb3cuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBEbyB3ZSBoYXZlIGEgY29tcGxldGUgcm93PyAqLw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgICAgIHBuZ19wdXNoX3Byb2Nlc3Nfcm93KHBuZ19wdHIpOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBBbmQgY2hlY2sgZm9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8NCisgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkNCisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aU1RSRUFNX0VOREVEOw0KKyAgIH0NCisNCisgICAvKiBBbGwgdGhlIGRhdGEgc2hvdWxkIGhhdmUgYmVlbiBwcm9jZXNzZWQsIGlmIGFueXRoaW5nDQorICAgICogaXMgbGVmdCBhdCB0aGlzIHBvaW50IHdlIGhhdmUgYnl0ZXMgb2YgSURBVCBkYXRhDQorICAgICogYWZ0ZXIgdGhlIHpsaWIgZW5kIGNvZGUuDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPiAwKQ0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2lvbiBkYXRhIGluIElEQVQiKTsNCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3B1c2hfcHJvY2Vzc19yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIDEuNS42OiByb3dfaW5mbyBtb3ZlZCBvdXQgb2YgcG5nX3N0cnVjdCB0byBhIGxvY2FsIGhlcmUuICovDQorICAgcG5nX3Jvd19pbmZvIHJvd19pbmZvOw0KKw0KKyAgIHJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOyAvKiBOT1RFOiB3aWR0aCBvZiBjdXJyZW50IGludGVybGFjZWQgcm93ICovDQorICAgcm93X2luZm8uY29sb3JfdHlwZSA9IHBuZ19wdHItPmNvbG9yX3R5cGU7DQorICAgcm93X2luZm8uYml0X2RlcHRoID0gcG5nX3B0ci0+Yml0X2RlcHRoOw0KKyAgIHJvd19pbmZvLmNoYW5uZWxzID0gcG5nX3B0ci0+Y2hhbm5lbHM7DQorICAgcm93X2luZm8ucGl4ZWxfZGVwdGggPSBwbmdfcHRyLT5waXhlbF9kZXB0aDsNCisgICByb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby5waXhlbF9kZXB0aCwgcm93X2luZm8ud2lkdGgpOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5yb3dfYnVmWzBdID4gUE5HX0ZJTFRFUl9WQUxVRV9OT05FKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cm93X2J1ZlswXSA8IFBOR19GSUxURVJfVkFMVUVfTEFTVCkNCisgICAgICAgICBwbmdfcmVhZF9maWx0ZXJfcm93KHBuZ19wdHIsICZyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsDQorICAgICAgICAgICAgcG5nX3B0ci0+cHJldl9yb3cgKyAxLCBwbmdfcHRyLT5yb3dfYnVmWzBdKTsNCisgICAgICBlbHNlDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJiYWQgYWRhcHRpdmUgZmlsdGVyIHZhbHVlIik7DQorICAgfQ0KKw0KKyAgIC8qIGxpYnBuZyAxLjUuNjogdGhlIGZvbGxvd2luZyBsaW5lIHdhcyBjb3B5aW5nIHBuZ19wdHItPnJvd2J5dGVzIGJlZm9yZQ0KKyAgICAqIDEuNS42LCB3aGlsZSB0aGUgYnVmZmVyIHJlYWxseSBpcyB0aGlzIGJpZyBpbiBjdXJyZW50IHZlcnNpb25zIG9mIGxpYnBuZw0KKyAgICAqIGl0IG1heSBub3QgYmUgaW4gdGhlIGZ1dHVyZSwgc28gdGhpcyB3YXMgY2hhbmdlZCBqdXN0IHRvIGNvcHkgdGhlDQorICAgICogaW50ZXJsYWNlZCByb3cgY291bnQ6DQorICAgICovDQorICAgbWVtY3B5KHBuZ19wdHItPnByZXZfcm93LCBwbmdfcHRyLT5yb3dfYnVmLCByb3dfaW5mby5yb3dieXRlcyArIDEpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpDQorICAgICAgcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIsICZyb3dfaW5mbyk7DQorI2VuZGlmDQorDQorICAgLyogVGhlIHRyYW5zZm9ybWVkIHBpeGVsIGRlcHRoIHNob3VsZCBtYXRjaCB0aGUgZGVwdGggbm93IGluIHJvd19pbmZvLiAqLw0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCA9PSAwKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCA9IHJvd19pbmZvLnBpeGVsX2RlcHRoOw0KKyAgICAgIGlmIChyb3dfaW5mby5waXhlbF9kZXB0aCA+IHBuZ19wdHItPm1heGltdW1fcGl4ZWxfZGVwdGgpDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwcm9ncmVzc2l2ZSByb3cgb3ZlcmZsb3ciKTsNCisgICB9DQorDQorICAgZWxzZSBpZiAocG5nX3B0ci0+dHJhbnNmb3JtZWRfcGl4ZWxfZGVwdGggIT0gcm93X2luZm8ucGl4ZWxfZGVwdGgpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCBwcm9ncmVzc2l2ZSByb3cgc2l6ZSBjYWxjdWxhdGlvbiBlcnJvciIpOw0KKw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICAvKiBCbG93IHVwIGludGVybGFjZWQgcm93cyB0byBmdWxsIHNpemUgKi8NCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5wYXNzIDwgNikNCisgICAgICAgICBwbmdfZG9fcmVhZF9pbnRlcmxhY2UoJnJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cGFzcywNCisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpOw0KKw0KKyAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpDQorICAgIHsNCisgICAgICAgICBjYXNlIDA6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBpOw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICYmIHBuZ19wdHItPnBhc3MgPT0gMDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOyAvKiBVcGRhdGVzIHBuZ19wdHItPnBhc3MgKi8NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gMikgLyogUGFzcyAxIG1pZ2h0IGJlIGVtcHR5ICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0ICYmIHBuZ19wdHItPmhlaWdodCA8PSA0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgTlVMTCk7DQorICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNiAmJiBwbmdfcHRyLT5oZWlnaHQgPD0gNCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBpOw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICYmIHBuZ19wdHItPnBhc3MgPT0gMTsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSAyKSAvKiBTa2lwIHRvcCA0IGdlbmVyYXRlZCByb3dzICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDI7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAyOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNCkgLyogUGFzcyAzIG1pZ2h0IGJlIGVtcHR5ICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBwbmdfcHRyLT5wYXNzID09IDM7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNCkgLyogU2tpcCB0b3AgdHdvIGdlbmVyYXRlZCByb3dzICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogUGFzcyA1IG1pZ2h0IGJlIGVtcHR5ICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIE5VTEwpOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgNToNCisgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGk7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA1OyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDYpIC8qIFNraXAgdG9wIGdlbmVyYXRlZCByb3cgKi8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgTlVMTCk7DQorICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICBjYXNlIDY6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgIT0gNikNCisgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBOVUxMKTsNCisgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICB9DQorICAgZWxzZQ0KKyNlbmRpZg0KKyAgIHsNCisgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOw0KKyAgIH0NCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEDQorICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8NCisNCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8NCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3N0YXJ0W10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07DQorDQorICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19pbmNbXSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsNCisNCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbXSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsNCisNCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195aW5jW10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07DQorDQorICAgLyogSGVpZ2h0IG9mIGludGVybGFjZSBibG9jay4gIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkIC0gaWYgeW91IG5lZWQNCisgICAgKiBpdCwgdW5jb21tZW50IGl0IGhlcmUgYW5kIGluIHBuZy5oDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19oZWlnaHRbXSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsNCisgICAqLw0KKyNlbmRpZg0KKw0KKyAgIHBuZ19wdHItPnJvd19udW1iZXIrKzsNCisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA8IHBuZ19wdHItPm51bV9yb3dzKQ0KKyAgICAgIHJldHVybjsNCisNCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpDQorICAgew0KKyAgICAgIHBuZ19wdHItPnJvd19udW1iZXIgPSAwOw0KKyAgICAgIG1lbXNldChwbmdfcHRyLT5wcmV2X3JvdywgMCwgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsNCisNCisgICAgICBkbw0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5wYXNzKys7DQorICAgICAgICAgaWYgKChwbmdfcHRyLT5wYXNzID09IDEgJiYgcG5nX3B0ci0+d2lkdGggPCA1KSB8fA0KKyAgICAgICAgICAgICAocG5nX3B0ci0+cGFzcyA9PSAzICYmIHBuZ19wdHItPndpZHRoIDwgMykgfHwNCisgICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gNSAmJiBwbmdfcHRyLT53aWR0aCA8IDIpKQ0KKyAgICAgICAgICAgIHBuZ19wdHItPnBhc3MrKzsNCisNCisgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+IDcpDQorICAgICAgICAgICAgcG5nX3B0ci0+cGFzcy0tOw0KKw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID49IDcpDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgcG5nX3B0ci0+aXdpZHRoID0gKHBuZ19wdHItPndpZHRoICsNCisgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtDQorICAgICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3BuZ19wdHItPnBhc3NdKSAvDQorICAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsNCisNCisgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKw0KKyAgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtDQorICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLw0KKyAgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdOw0KKw0KKyAgICAgIH0gd2hpbGUgKHBuZ19wdHItPml3aWR0aCA9PSAwIHx8IHBuZ19wdHItPm51bV9yb3dzID09IDApOw0KKyAgIH0NCisjZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovDQorfQ0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19wdXNoX2hhdmVfaW5mbyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHItPmluZm9fZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5pbmZvX2ZuKSkocG5nX3B0ciwgaW5mb19wdHIpOw0KK30NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfcHVzaF9oYXZlX2VuZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHItPmVuZF9mbiAhPSBOVUxMKQ0KKyAgICAgICgqKHBuZ19wdHItPmVuZF9mbikpKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3cpDQorew0KKyAgIGlmIChwbmdfcHRyLT5yb3dfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5yb3dfZm4pKShwbmdfcHRyLCByb3csIHBuZ19wdHItPnJvd19udW1iZXIsDQorICAgICAgICAgKGludClwbmdfcHRyLT5wYXNzKTsNCit9DQorDQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgb2xkX3JvdywNCisgICAgcG5nX2NvbnN0X2J5dGVwIG5ld19yb3cpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIG5ld19yb3cgaXMgYSBmbGFnIGhlcmUgLSBpZiBpdCBpcyBOVUxMIHRoZW4gdGhlIGFwcCBjYWxsYmFjayB3YXMgY2FsbGVkDQorICAgICogZnJvbSBhbiBlbXB0eSByb3cgKHNlZSB0aGUgY2FsbHMgdG8gcG5nX3N0cnVjdDo6cm93X2ZuIGJlbG93KSwgb3RoZXJ3aXNlDQorICAgICogaXQgbXVzdCBiZSBwbmdfcHRyLT5yb3dfYnVmKzENCisgICAgKi8NCisgICBpZiAobmV3X3JvdyAhPSBOVUxMKQ0KKyAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBvbGRfcm93LCAxLypkaXNwbGF5Ki8pOw0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovDQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBwcm9ncmVzc2l2ZV9wdHIsDQorICAgIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBpbmZvX2ZuLCBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm4sDQorICAgIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIGVuZF9mbikNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+aW5mb19mbiA9IGluZm9fZm47DQorICAgcG5nX3B0ci0+cm93X2ZuID0gcm93X2ZuOw0KKyAgIHBuZ19wdHItPmVuZF9mbiA9IGVuZF9mbjsNCisNCisgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgcHJvZ3Jlc3NpdmVfcHRyLCBwbmdfcHVzaF9maWxsX2J1ZmZlcik7DQorfQ0KKw0KK3BuZ192b2lkcCBQTkdBUEkNCitwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm4gKE5VTEwpOw0KKw0KKyAgIHJldHVybiBwbmdfcHRyLT5pb19wdHI7DQorfQ0KKyNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8NCisjZW5kaWYNCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3JlYWQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MThlODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3JlYWQuYwpAQCAtMCwwICsxLDQwMDEgQEAKKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX0ZYQ09SRV9GRUFUVVJFX0FMTF8pIHx8IGRlZmluZWQoX1BOR19ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQ0KKy8qIHBuZ3JlYWQuYyAtIHJlYWQgYSBQTkcgZmlsZQ0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMSBbTWFyY2ggMjgsIDIwMTNdDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKg0KKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbGxzIGRpcmVjdGx5IHRvDQorICogcmVhZCBhIFBORyBmaWxlIG9yIHN0cmVhbS4NCisgKi8NCisNCisjaW5jbHVkZSAicG5ncHJpdi5oIg0KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpDQorIyAgaW5jbHVkZSA8ZXJybm8uaD4NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVEDQorDQorLyogQ3JlYXRlIGEgUE5HIHN0cnVjdHVyZSBmb3IgcmVhZGluZywgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkLiAqLw0KK1BOR19GVU5DVElPTihwbmdfc3RydWN0cCxQTkdBUEkNCitwbmdfY3JlYXRlX3JlYWRfc3RydWN0LChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLA0KKyAgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4pLFBOR19BTExPQ0FURUQpDQorew0KKyNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRA0KKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsDQorICAgICAgZXJyb3JfZm4sIHdhcm5fZm4sIE5VTEwsIE5VTEwsIE5VTEwpOw0KKyNlbHNlDQorICAgcmV0dXJuIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMih1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwgZXJyb3JfZm4sDQorICAgICAgIHdhcm5fZm4sIE5VTEwsIE5VTEwsIE5VTEwpOw0KK30NCisNCisvKiBBbHRlcm5hdGUgY3JlYXRlIFBORyBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5DQorICogbmVlZGVkLg0KKyAqLw0KK1BOR19GVU5DVElPTihwbmdfc3RydWN0cCxQTkdBUEkNCitwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIsKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsDQorICAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsDQorICAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLFBOR19BTExPQ0FURUQpDQorew0KKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsDQorICAgICAgZXJyb3JfZm4sIHdhcm5fZm4sIG1lbV9wdHIsIG1hbGxvY19mbiwgZnJlZV9mbik7DQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8NCisNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5tb2RlID0gUE5HX0lTX1JFQURfU1RSVUNUOw0KKw0KKyAgICAgIC8qIEFkZGVkIGluIGxpYnBuZy0xLjYuMDsgdGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlY3QgYSByZWFkIHN0cnVjdHVyZSBpZg0KKyAgICAgICAqIHJlcXVpcmVkIChpdCB3aWxsIGJlIHplcm8gaW4gYSB3cml0ZSBzdHJ1Y3R1cmUuKQ0KKyAgICAgICAqLw0KKyMgICAgIGlmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEDQorICAgICAgICAgcG5nX3B0ci0+SURBVF9yZWFkX3NpemUgPSBQTkdfSURBVF9SRUFEX1NJWkU7DQorIyAgICAgZW5kaWYNCisNCisjICAgICBpZmRlZiBQTkdfQkVOSUdOX1JFQURfRVJST1JTX1NVUFBPUlRFRA0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTjsNCisNCisgICAgICAgICAvKiBJbiBzdGFibGUgYnVpbGRzIG9ubHkgd2FybiBpZiBhbiBhcHBsaWNhdGlvbiBlcnJvciBjYW4gYmUgY29tcGxldGVseQ0KKyAgICAgICAgICAqIGhhbmRsZWQuDQorICAgICAgICAgICovDQorIyAgICAgICAgaWYgUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgPj0gUE5HX0xJQlBOR19CVUlMRF9SQw0KKyAgICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0FQUF9XQVJOSU5HU19XQVJOOw0KKyMgICAgICAgIGVuZGlmDQorIyAgICAgZW5kaWYNCisNCisgICAgICAvKiBUT0RPOiBkZWxheSB0aGlzLCBpdCBjYW4gYmUgZG9uZSBpbiBwbmdfaW5pdF9pbyAoaWYgdGhlIGFwcCBkb2Vzbid0DQorICAgICAgICogZG8gaXQgaXRzZWxmKSBhdm9pZGluZyBzZXR0aW5nIHRoZSBkZWZhdWx0IGZ1bmN0aW9uIGlmIGl0IGlzIG5vdA0KKyAgICAgICAqIHJlcXVpcmVkLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCBOVUxMLCBOVUxMKTsNCisgICB9DQorDQorICAgcmV0dXJuIHBuZ19wdHI7DQorfQ0KKw0KKw0KKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRA0KKy8qIFJlYWQgdGhlIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBUaGlzIGhhcyBiZWVuDQorICogY2hhbmdlZCBpbiB2MC45MCB0byBhbGxvdyByZWFkaW5nIGEgZmlsZSB0aGF0IGFscmVhZHkgaGFzIHRoZSBtYWdpYw0KKyAqIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgWW91IGNhbiB0ZWxsIGxpYnBuZyBob3cgbWFueSBieXRlcyBoYXZlDQorICogYmVlbiByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtICh1cCB0byB0aGUgbWF4aW11bSBvZiA4KQ0KKyAqIHZpYSBwbmdfc2V0X3NpZ19ieXRlcygpLCBhbmQgd2Ugd2lsbCBvbmx5IGNoZWNrIHRoZSByZW1haW5pbmcgYnl0ZXMNCisgKiBoZXJlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiB0aGVuIGhhdmUgYWNjZXNzIHRvIHRoZSBzaWduYXR1cmUgYnl0ZXMgd2UNCisgKiByZWFkIGlmIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGlzIGlzbid0IGEgdmFsaWQgUE5HIGZpbGUuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfcmVhZF9pbmZvKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRA0KKyAgIGludCBrZWVwOw0KKyNlbmRpZg0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW5mbyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgLyogUmVhZCBhbmQgY2hlY2sgdGhlIFBORyBmaWxlIHNpZ25hdHVyZS4gKi8NCisgICBwbmdfcmVhZF9zaWcocG5nX3B0ciwgaW5mb19wdHIpOw0KKw0KKyAgIGZvciAoOzspDQorICAgew0KKyAgICAgIHBuZ191aW50XzMyIGxlbmd0aCA9IHBuZ19yZWFkX2NodW5rX2hlYWRlcihwbmdfcHRyKTsNCisgICAgICBwbmdfdWludF8zMiBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsNCisNCisgICAgICAvKiBJREFUIGxvZ2ljIG5lZWRzIHRvIGhhcHBlbiBoZXJlIHRvIHNpbXBsaWZ5IGdldHRpbmcgdGhlIHR3byBmbGFncw0KKyAgICAgICAqIHJpZ2h0Lg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIElEQVQiKTsNCisNCisgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYNCisgICAgICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpDQorICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsNCisNCisgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0FGVEVSX0lEQVQpDQorICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVHMgZm91bmQiKTsNCisNCisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQ0KKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7DQorDQorICAgICAgLyogVGhpcyBzaG91bGQgYmUgYSBiaW5hcnkgc3ViZGl2aXNpb24gc2VhcmNoIG9yIGEgaGFzaCBmb3INCisgICAgICAgKiBtYXRjaGluZyB0aGUgY2h1bmsgbmFtZSByYXRoZXIgdGhhbiBhIGxpbmVhciBzZWFyY2guDQorICAgICAgICovDQorICAgICAgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lIRFIpDQorICAgICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOw0KKw0KKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lFTkQpDQorICAgICAgICAgcG5nX2hhbmRsZV9JRU5EKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOw0KKw0KKyNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoKGtlZXAgPSBwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZyhwbmdfcHRyLCBjaHVua19uYW1lKSkgIT0gMCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgsIGtlZXApOw0KKw0KKyAgICAgICAgIGlmIChjaHVua19uYW1lID09IHBuZ19QTFRFKQ0KKyAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsNCisNCisgICAgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSAwOyAvKiBJdCBoYXMgYmVlbiBjb25zdW1lZCAqLw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorI2VuZGlmDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfUExURSkNCisgICAgICAgICBwbmdfaGFuZGxlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSURBVCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gbGVuZ3RoOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisjaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19iS0dEKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19jSFJNKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19nQU1BKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19oSVNUKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19vRkZzKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19wQ0FMKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfcENBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zQ0FMKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19wSFlzKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zQklUKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zUkdCKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19pQ0NQKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19zUExUKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ190RVh0KQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ190SU1FKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ190Uk5TKQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ196VFh0KQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChjaHVua19uYW1lID09IHBuZ19pVFh0KQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfaVRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsNCisjZW5kaWYNCisNCisgICAgICBlbHNlDQorICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgsDQorICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUKTsNCisgICB9DQorfQ0KKyNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLw0KKw0KKy8qIE9wdGlvbmFsIGNhbGwgdG8gdXBkYXRlIHRoZSB1c2VycyBpbmZvX3B0ciBzdHJ1Y3R1cmUgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIik7DQorDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7DQorDQorIyAgICAgICAgaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQNCisgICAgICAgICAgICBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorIyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIFBOR19VTlVTRUQoaW5mb19wdHIpDQorIyAgICAgICAgZW5kaWYNCisgICAgICB9DQorDQorICAgICAgLyogTmV3IGluIDEuNi4wIHRoaXMgYXZvaWRzIHRoZSBidWcgb2YgZG9pbmcgdGhlIGluaXRpYWxpemF0aW9ucyB0d2ljZSAqLw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgInBuZ19yZWFkX3VwZGF0ZV9pbmZvL3BuZ19zdGFydF9yZWFkX2ltYWdlOiBkdXBsaWNhdGUgY2FsbCIpOw0KKyAgIH0NCit9DQorDQorI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEDQorLyogSW5pdGlhbGl6ZSBwYWxldHRlLCBiYWNrZ3JvdW5kLCBldGMsIGFmdGVyIHRyYW5zZm9ybWF0aW9ucw0KKyAqIGFyZSBzZXQsIGJ1dCBiZWZvcmUgYW55IHJlYWRpbmcgdGFrZXMgcGxhY2UuICBUaGlzIGFsbG93cw0KKyAqIHRoZSB1c2VyIHRvIG9idGFpbiBhIGdhbW1hLWNvcnJlY3RlZCBwYWxldHRlLCBmb3IgZXhhbXBsZS4NCisgKiBJZiB0aGUgdXNlciBkb2Vzbid0IGNhbGwgdGhpcywgd2Ugd2lsbCBkbyBpdCBvdXJzZWx2ZXMuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc3RhcnRfcmVhZF9pbWFnZShwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc3RhcnRfcmVhZF9pbWFnZSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpDQorICAgew0KKyAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkgPT0gMCkNCisgICAgICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7DQorDQorICAgICAgLyogTmV3IGluIDEuNi4wIHRoaXMgYXZvaWRzIHRoZSBidWcgb2YgZG9pbmcgdGhlIGluaXRpYWxpemF0aW9ucyB0d2ljZSAqLw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgInBuZ19zdGFydF9yZWFkX2ltYWdlL3BuZ19yZWFkX3VwZGF0ZV9pbmZvOiBkdXBsaWNhdGUgY2FsbCIpOw0KKyAgIH0NCit9DQorI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfcmVhZF9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3csIHBuZ19ieXRlcCBkc3Bfcm93KQ0KK3sNCisgICBwbmdfcm93X2luZm8gcm93X2luZm87DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX2RlYnVnMigxLCAiaW4gcG5nX3JlYWRfcm93IChyb3cgJWx1LCBwYXNzICVkKSIsDQorICAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOw0KKw0KKyAgIC8qIHBuZ19yZWFkX3N0YXJ0X3JvdyBzZXRzIHRoZSBpbmZvcm1hdGlvbiAoaW4gcGFydGljdWxhciBpd2lkdGgpIGZvciB0aGlzDQorICAgICogaW50ZXJsYWNlIHBhc3MuDQorICAgICovDQorICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpDQorICAgICAgcG5nX3JlYWRfc3RhcnRfcm93KHBuZ19wdHIpOw0KKw0KKyAgIC8qIDEuNS42OiByb3dfaW5mbyBtb3ZlZCBvdXQgb2YgcG5nX3N0cnVjdCB0byBhIGxvY2FsIGhlcmUuICovDQorICAgcm93X2luZm8ud2lkdGggPSBwbmdfcHRyLT5pd2lkdGg7IC8qIE5PVEU6IHdpZHRoIG9mIGN1cnJlbnQgaW50ZXJsYWNlZCByb3cgKi8NCisgICByb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsNCisgICByb3dfaW5mby5iaXRfZGVwdGggPSBwbmdfcHRyLT5iaXRfZGVwdGg7DQorICAgcm93X2luZm8uY2hhbm5lbHMgPSBwbmdfcHRyLT5jaGFubmVsczsNCisgICByb3dfaW5mby5waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOw0KKyAgIHJvd19pbmZvLnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLnBpeGVsX2RlcHRoLCByb3dfaW5mby53aWR0aCk7DQorDQorICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPT0gMCAmJiBwbmdfcHRyLT5wYXNzID09IDApDQorICAgew0KKyAgIC8qIENoZWNrIGZvciB0cmFuc2Zvcm1zIHRoYXQgaGF2ZSBiZWVuIHNldCBidXQgd2VyZSBkZWZpbmVkIG91dCAqLw0KKyNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKQ0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpICYmIFwNCisgICAgIWRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQ0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQ0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKQ0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfQkdSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQ0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKyAgIH0NCisNCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEDQorICAgLyogSWYgaW50ZXJsYWNlZCBhbmQgd2UgZG8gbm90IG5lZWQgYSBuZXcgcm93LCBjb21iaW5lIHJvdyBhbmQgcmV0dXJuLg0KKyAgICAqIE5vdGljZSB0aGF0IHRoZSBwaXhlbHMgd2UgaGF2ZSBmcm9tIHByZXZpb3VzIHJvd3MgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkDQorICAgICogYWxyZWFkeTsgd2UgY2FuIG9ubHkgY29tYmluZSBsaWtlIHdpdGggbGlrZSAodHJhbnNmb3JtZWQgb3INCisgICAgKiB1bnRyYW5zZm9ybWVkKSBhbmQsIGJlY2F1c2Ugb2YgdGhlIGxpYnBuZyBBUEkgZm9yIGludGVybGFjZWQgaW1hZ2VzLCB0aGlzDQorICAgICogbWVhbnMgd2UgbXVzdCB0cmFuc2Zvcm0gYmVmb3JlIGRlLWludGVybGFjaW5nLg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkNCisgICB7DQorICAgICAgc3dpdGNoIChwbmdfcHRyLT5wYXNzKQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgfHwgcG5nX3B0ci0+d2lkdGggPCA1KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOw0KKw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gNCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCAmJiAocG5nX3B0ci0+cm93X251bWJlciAmIDQpKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOw0KKw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMykgfHwgcG5nX3B0ci0+d2lkdGggPCAzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOw0KKw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMykgIT0gMikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCAmJiAocG5nX3B0ci0+cm93X251bWJlciAmIDIpKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOw0KKw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDU6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMSkgfHwgcG5nX3B0ci0+d2lkdGggPCAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAxLypkaXNwbGF5Ki8pOw0KKw0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT5yb3dfbnVtYmVyICYgMSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYXR0ZW1wdCB0byByZWFkIHJvdyBkYXRhIik7DQorDQorICAgLyogRmlsbCB0aGUgcm93IHdpdGggSURBVCBkYXRhOiAqLw0KKyAgIHBuZ19yZWFkX0lEQVRfZGF0YShwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmLCByb3dfaW5mby5yb3dieXRlcyArIDEpOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5yb3dfYnVmWzBdID4gUE5HX0ZJTFRFUl9WQUxVRV9OT05FKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cm93X2J1ZlswXSA8IFBOR19GSUxURVJfVkFMVUVfTEFTVCkNCisgICAgICAgICBwbmdfcmVhZF9maWx0ZXJfcm93KHBuZ19wdHIsICZyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsDQorICAgICAgICAgICAgcG5nX3B0ci0+cHJldl9yb3cgKyAxLCBwbmdfcHRyLT5yb3dfYnVmWzBdKTsNCisgICAgICBlbHNlDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJiYWQgYWRhcHRpdmUgZmlsdGVyIHZhbHVlIik7DQorICAgfQ0KKw0KKyAgIC8qIGxpYnBuZyAxLjUuNjogdGhlIGZvbGxvd2luZyBsaW5lIHdhcyBjb3B5aW5nIHBuZ19wdHItPnJvd2J5dGVzIGJlZm9yZQ0KKyAgICAqIDEuNS42LCB3aGlsZSB0aGUgYnVmZmVyIHJlYWxseSBpcyB0aGlzIGJpZyBpbiBjdXJyZW50IHZlcnNpb25zIG9mIGxpYnBuZw0KKyAgICAqIGl0IG1heSBub3QgYmUgaW4gdGhlIGZ1dHVyZSwgc28gdGhpcyB3YXMgY2hhbmdlZCBqdXN0IHRvIGNvcHkgdGhlDQorICAgICogaW50ZXJsYWNlZCBjb3VudDoNCisgICAgKi8NCisgICBtZW1jcHkocG5nX3B0ci0+cHJldl9yb3csIHBuZ19wdHItPnJvd19idWYsIHJvd19pbmZvLnJvd2J5dGVzICsgMSk7DQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorICAgaWYgKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYNCisgICAgICAgKHBuZ19wdHItPmZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpDQorICAgew0KKyAgICAgIC8qIEludHJhcGl4ZWwgZGlmZmVyZW5jaW5nICovDQorICAgICAgcG5nX2RvX3JlYWRfaW50cmFwaXhlbCgmcm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisgICB9DQorI2VuZGlmDQorDQorDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucykNCisgICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0ciwgJnJvd19pbmZvKTsNCisjZW5kaWYNCisNCisgICAvKiBUaGUgdHJhbnNmb3JtZWQgcGl4ZWwgZGVwdGggc2hvdWxkIG1hdGNoIHRoZSBkZXB0aCBub3cgaW4gcm93X2luZm8uICovDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoID09IDApDQorICAgew0KKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoID0gcm93X2luZm8ucGl4ZWxfZGVwdGg7DQorICAgICAgaWYgKHJvd19pbmZvLnBpeGVsX2RlcHRoID4gcG5nX3B0ci0+bWF4aW11bV9waXhlbF9kZXB0aCkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNlcXVlbnRpYWwgcm93IG92ZXJmbG93Iik7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoICE9IHJvd19pbmZvLnBpeGVsX2RlcHRoKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgc2VxdWVudGlhbCByb3cgc2l6ZSBjYWxjdWxhdGlvbiBlcnJvciIpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICAvKiBCbG93IHVwIGludGVybGFjZWQgcm93cyB0byBmdWxsIHNpemUgKi8NCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJg0KKyAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA2KQ0KKyAgICAgICAgIHBuZ19kb19yZWFkX2ludGVybGFjZSgmcm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wYXNzLA0KKyAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyk7DQorDQorICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkNCisgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywgMS8qZGlzcGxheSovKTsNCisNCisgICAgICBpZiAocm93ICE9IE5VTEwpDQorICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIHJvdywgMC8qcm93Ki8pOw0KKyAgIH0NCisNCisgICBlbHNlDQorI2VuZGlmDQorICAgew0KKyAgICAgIGlmIChyb3cgIT0gTlVMTCkNCisgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgcm93LCAtMS8qaWdub3JlZCovKTsNCisNCisgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQ0KKyAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAtMS8qaWdub3JlZCovKTsNCisgICB9DQorICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisNCisgICBpZiAocG5nX3B0ci0+cmVhZF9yb3dfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5yZWFkX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOw0KKw0KK30NCisjZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisvKiBSZWFkIG9uZSBvciBtb3JlIHJvd3Mgb2YgaW1hZ2UgZGF0YS4gIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLA0KKyAqIGFuZCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHJvd3MgbmVlZCB0bw0KKyAqIGNvbnRhaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSByb3dzIGZyb20gdGhlIHByZXZpb3VzIHBhc3MuICBJZiB0aGUNCisgKiBpbWFnZSBoYXMgYWxwaGEgb3IgdHJhbnNwYXJlbmN5LCBhbmQgcG5nX2hhbmRsZV9hbHBoYSgpWypdIGhhcyBiZWVuDQorICogY2FsbGVkLCB0aGUgcm93cyBjb250ZW50cyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHRoZSBjb250ZW50cyBvZiB0aGUNCisgKiBzY3JlZW4uDQorICoNCisgKiAicm93IiBob2xkcyB0aGUgYWN0dWFsIGltYWdlLCBhbmQgcGl4ZWxzIGFyZSBwbGFjZWQgaW4gaXQNCisgKiBhcyB0aGV5IGFycml2ZS4gIElmIHRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgYWZ0ZXIgZWFjaCBwYXNzLCBpdCB3aWxsDQorICogYXBwZWFyIHRvICJzcGFya2xlIiBpbi4gICJkaXNwbGF5X3JvdyIgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhDQorICogImNodW5reSIgcHJvZ3Jlc3NpdmUgaW1hZ2UsIHdpdGggZmluZXIgZGV0YWlsIGFkZGVkIGFzIGl0IGJlY29tZXMNCisgKiBhdmFpbGFibGUuICBJZiB5b3UgZG8gbm90IHdhbnQgdGhpcyAiY2h1bmt5IiBkaXNwbGF5LCB5b3UgbWF5IHBhc3MNCisgKiBOVUxMIGZvciBkaXNwbGF5X3Jvdy4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGUgc3BhcmtsZSBkaXNwbGF5LCBhbmQNCisgKiB5b3UgaGF2ZSBub3QgY2FsbGVkIHBuZ19oYW5kbGVfYWxwaGEoKSwgeW91IG1heSBwYXNzIE5VTEwgZm9yIHJvd3MuDQorICogSWYgeW91IGhhdmUgY2FsbGVkIHBuZ19oYW5kbGVfYWxwaGEoKSwgYW5kIHRoZSBpbWFnZSBoYXMgZWl0aGVyIGFuDQorICogYWxwaGEgY2hhbm5lbCBvciBhIHRyYW5zcGFyZW5jeSBjaHVuaywgeW91IG11c3QgcHJvdmlkZSBhIGJ1ZmZlciBmb3INCisgKiByb3dzLiAgSW4gdGhpcyBjYXNlLCB5b3UgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSBhIGRpc3BsYXlfcm93IGJ1ZmZlcg0KKyAqIGFsc28sIGJ1dCB5b3UgbWF5LiAgSWYgdGhlIGltYWdlIGlzIG5vdCBpbnRlcmxhY2VkLCBvciBpZiB5b3UgaGF2ZQ0KKyAqIG5vdCBjYWxsZWQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSwgdGhlIGRpc3BsYXlfcm93IGJ1ZmZlciB3aWxsDQorICogYmUgaWdub3JlZCwgc28gcGFzcyBOVUxMIHRvIGl0Lg0KKyAqDQorICogWypdIHBuZ19oYW5kbGVfYWxwaGEoKSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiBsaWJwbmcNCisgKi8NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19yZWFkX3Jvd3MocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgcm93LA0KKyAgICBwbmdfYnl0ZXBwIGRpc3BsYXlfcm93LCBwbmdfdWludF8zMiBudW1fcm93cykNCit7DQorICAgcG5nX3VpbnRfMzIgaTsNCisgICBwbmdfYnl0ZXBwIHJwOw0KKyAgIHBuZ19ieXRlcHAgZHA7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9yb3dzIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcnAgPSByb3c7DQorICAgZHAgPSBkaXNwbGF5X3JvdzsNCisgICBpZiAocnAgIT0gTlVMTCAmJiBkcCAhPSBOVUxMKQ0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYnl0ZXAgcnB0ciA9ICpycCsrOw0KKyAgICAgICAgIHBuZ19ieXRlcCBkcHRyID0gKmRwKys7DQorDQorICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJwdHIsIGRwdHIpOw0KKyAgICAgIH0NCisNCisgICBlbHNlIGlmIChycCAhPSBOVUxMKQ0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYnl0ZXAgcnB0ciA9ICpycDsNCisgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcnB0ciwgTlVMTCk7DQorICAgICAgICAgcnArKzsNCisgICAgICB9DQorDQorICAgZWxzZSBpZiAoZHAgIT0gTlVMTCkNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Jvd3M7IGkrKykNCisgICAgICB7DQorICAgICAgICAgcG5nX2J5dGVwIGRwdHIgPSAqZHA7DQorICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIE5VTEwsIGRwdHIpOw0KKyAgICAgICAgIGRwKys7DQorICAgICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisvKiBSZWFkIHRoZSBlbnRpcmUgaW1hZ2UuICBJZiB0aGUgaW1hZ2UgaGFzIGFuIGFscGhhIGNoYW5uZWwgb3IgYSB0Uk5TDQorICogY2h1bmssIGFuZCB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpWypdLCB5b3Ugd2lsbCBuZWVkIHRvDQorICogaW5pdGlhbGl6ZSB0aGUgaW1hZ2UgdG8gdGhlIGN1cnJlbnQgaW1hZ2UgdGhhdCBQTkcgd2lsbCBiZSBvdmVybGF5aW5nLg0KKyAqIFdlIHNldCB0aGUgbnVtX3Jvd3MgYWdhaW4gaGVyZSwgaW4gY2FzZSBpdCB3YXMgaW5jb3JyZWN0bHkgc2V0IGluDQorICogcG5nX3JlYWRfc3RhcnRfcm93KCkgYnkgYSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgb3INCisgKiBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIGlmIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgd2Fzbid0IGNhbGxlZA0KKyAqIHByaW9yIHRvIGVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMgbGlrZSBpdCBzaG91bGQgaGF2ZSBiZWVuLiAgWW91IGNhbg0KKyAqIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UuICBJZiB5b3UgZGVzaXJlIHRvIGhhdmUgYW4gaW1hZ2UgZm9yDQorICogZWFjaCBwYXNzIG9mIGEgaW50ZXJsYWNlZCBpbWFnZSwgdXNlIHBuZ19yZWFkX3Jvd3MoKSBpbnN0ZWFkLg0KKyAqDQorICogWypdIHBuZ19oYW5kbGVfYWxwaGEoKSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiBsaWJwbmcNCisgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19yZWFkX2ltYWdlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIGltYWdlKQ0KK3sNCisgICBwbmdfdWludF8zMiBpLCBpbWFnZV9oZWlnaHQ7DQorICAgaW50IHBhc3MsIGo7DQorICAgcG5nX2J5dGVwcCBycDsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2ltYWdlIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfUk9XX0lOSVQpKQ0KKyAgIHsNCisgICAgICBwYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7DQorICAgICAgLyogQW5kIG1ha2Ugc3VyZSB0cmFuc2Zvcm1zIGFyZSBpbml0aWFsaXplZC4gKi8NCisgICAgICBwbmdfc3RhcnRfcmVhZF9pbWFnZShwbmdfcHRyKTsNCisgICB9DQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJiAhKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBDYWxsZXIgY2FsbGVkIHBuZ19zdGFydF9yZWFkX2ltYWdlIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIHdpdGhvdXQNCisgICAgICAgICAgKiBmaXJzdCB0dXJuaW5nIG9uIHRoZSBQTkdfSU5URVJMQUNFIHRyYW5zZm9ybS4gIFdlIGNhbiBmaXggdGhpcyBoZXJlLA0KKyAgICAgICAgICAqIGJ1dCB0aGUgY2FsbGVyIHNob3VsZCBkbyBpdCENCisgICAgICAgICAgKi8NCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW50ZXJsYWNlIGhhbmRsaW5nIHNob3VsZCBiZSB0dXJuZWQgb24gd2hlbiAiDQorICAgICAgICAgICAgInVzaW5nIHBuZ19yZWFkX2ltYWdlIik7DQorICAgICAgICAgLyogTWFrZSBzdXJlIHRoaXMgaXMgc2V0IGNvcnJlY3RseSAqLw0KKyAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gcG5nX3B0ci0+aGVpZ2h0Ow0KKyAgICAgIH0NCisNCisgICAgICAvKiBPYnRhaW4gdGhlIHBhc3MgbnVtYmVyLCB3aGljaCBhbHNvIHR1cm5zIG9uIHRoZSBQTkdfSU5URVJMQUNFIGZsYWcgaW4NCisgICAgICAgKiB0aGUgYWJvdmUgZXJyb3IgY2FzZS4NCisgICAgICAgKi8NCisgICAgICBwYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7DQorICAgfQ0KKyNlbHNlDQorICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICJDYW5ub3QgcmVhZCBpbnRlcmxhY2VkIGltYWdlIC0tIGludGVybGFjZSBoYW5kbGVyIGRpc2FibGVkIik7DQorDQorICAgcGFzcyA9IDE7DQorI2VuZGlmDQorDQorICAgaW1hZ2VfaGVpZ2h0PXBuZ19wdHItPmhlaWdodDsNCisNCisgICBmb3IgKGogPSAwOyBqIDwgcGFzczsgaisrKQ0KKyAgIHsNCisgICAgICBycCA9IGltYWdlOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZV9oZWlnaHQ7IGkrKykNCisgICAgICB7DQorICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsICpycCwgTlVMTCk7DQorICAgICAgICAgcnArKzsNCisgICAgICB9DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisvKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlLiAgV2lsbCBub3QgcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlDQorICogZmlsZSwgd2lsbCB2ZXJpZnkgdGhlIGVuZCBpcyBhY2N1cmF0ZSwgYW5kIHdpbGwgcmVhZCBhbnkgY29tbWVudHMNCisgKiBvciB0aW1lIGluZm9ybWF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGlmIGluZm8gaXMgbm90IE5VTEwuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfcmVhZF9lbmQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpDQorew0KKyNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEDQorICAgaW50IGtlZXA7DQorI2VuZGlmDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9lbmQiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBJZiBwbmdfcmVhZF9lbmQgaXMgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YgcmVhZGluZyB0aGUgcm93cyB0aGVyZSBtYXkNCisgICAgKiBzdGlsbCBiZSBwZW5kaW5nIElEQVQgZGF0YSBhbmQgYW4gb3duZWQgenN0cmVhbS4gIERlYWwgd2l0aCB0aGlzIGhlcmUuDQorICAgICovDQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQNCisgICBpZiAoIXBuZ19jaHVua191bmtub3duX2hhbmRsaW5nKHBuZ19wdHIsIHBuZ19JREFUKSkNCisjZW5kaWYNCisgICAgICBwbmdfcmVhZF9maW5pc2hfSURBVChwbmdfcHRyKTsNCisNCisjaWZkZWYgUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorICAgLyogUmVwb3J0IGludmFsaWQgcGFsZXR0ZSBpbmRleDsgYWRkZWQgYXQgbGlibmctMS41LjEwICovDQorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJg0KKyAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA+IHBuZ19wdHItPm51bV9wYWxldHRlKQ0KKyAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiUmVhZCBwYWxldHRlIGluZGV4IGV4Y2VlZGluZyBudW1fcGFsZXR0ZSIpOw0KKyNlbmRpZg0KKw0KKyAgIGRvDQorICAgew0KKyAgICAgIHBuZ191aW50XzMyIGxlbmd0aCA9IHBuZ19yZWFkX2NodW5rX2hlYWRlcihwbmdfcHRyKTsNCisgICAgICBwbmdfdWludF8zMiBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsNCisNCisgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSUhEUikNCisgICAgICAgICBwbmdfaGFuZGxlX0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSUVORCkNCisgICAgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorDQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmICgoa2VlcCA9IHBuZ19jaHVua191bmtub3duX2hhbmRsaW5nKHBuZ19wdHIsIGNodW5rX25hbWUpKSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSURBVCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKChsZW5ndGggPiAwKSB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQpKQ0KKyAgICAgICAgICAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVRzIGZvdW5kIik7DQorICAgICAgICAgfQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoLCBrZWVwKTsNCisgICAgICAgICBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfUExURSkNCisgICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7DQorICAgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICAgIGVsc2UgaWYgKGNodW5rX25hbWUgPT0gcG5nX0lEQVQpDQorICAgICAgew0KKyAgICAgICAgIC8qIFplcm8gbGVuZ3RoIElEQVRzIGFyZSBsZWdhbCBhZnRlciB0aGUgbGFzdCBJREFUIGhhcyBiZWVuDQorICAgICAgICAgICogcmVhZCwgYnV0IG5vdCBhZnRlciBvdGhlciBjaHVua3MgaGF2ZSBiZWVuIHJlYWQuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKChsZW5ndGggPiAwKSB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQpKQ0KKyAgICAgICAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVRzIGZvdW5kIik7DQorDQorICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfUExURSkNCisgICAgICAgICBwbmdfaGFuZGxlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorDQorI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfYktHRCkNCisgICAgICAgICBwbmdfaGFuZGxlX2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfY0hSTSkNCisgICAgICAgICBwbmdfaGFuZGxlX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfZ0FNQSkNCisgICAgICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfaElTVCkNCisgICAgICAgICBwbmdfaGFuZGxlX2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfb0ZGcykNCisgICAgICAgICBwbmdfaGFuZGxlX29GRnMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfcENBTCkNCisgICAgICAgICBwbmdfaGFuZGxlX3BDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc0NBTCkNCisgICAgICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfcEhZcykNCisgICAgICAgICBwbmdfaGFuZGxlX3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc0JJVCkNCisgICAgICAgICBwbmdfaGFuZGxlX3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc1JHQikNCisgICAgICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfaUNDUCkNCisgICAgICAgICBwbmdfaGFuZGxlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfc1BMVCkNCisgICAgICAgICBwbmdfaGFuZGxlX3NQTFQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfdEVYdCkNCisgICAgICAgICBwbmdfaGFuZGxlX3RFWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfdElNRSkNCisgICAgICAgICBwbmdfaGFuZGxlX3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfdFJOUykNCisgICAgICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfelRYdCkNCisgICAgICAgICBwbmdfaGFuZGxlX3pUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEDQorICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfaVRYdCkNCisgICAgICAgICBwbmdfaGFuZGxlX2lUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7DQorI2VuZGlmDQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoLA0KKyAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCk7DQorICAgfSB3aGlsZSAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUVORCkpOw0KK30NCisjZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8NCisNCisvKiBGcmVlIGFsbCBtZW1vcnkgdXNlZCBpbiB0aGUgcmVhZCBzdHJ1Y3QgKi8NCitzdGF0aWMgdm9pZA0KK3BuZ19yZWFkX2Rlc3Ryb3kocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfZGVzdHJveSIpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICBwbmdfZGVzdHJveV9nYW1tYV90YWJsZShwbmdfcHRyKTsNCisjZW5kaWYNCisNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5iaWdfcm93X2J1Zik7DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3ByZXZfcm93KTsNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5yZWFkX2J1ZmZlcik7DQorDQorI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwKTsNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleCk7DQorI2VuZGlmDQorDQorICAgaWYgKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9QTFRFKQ0KKyAgICAgIHBuZ196ZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wYWxldHRlKTsNCisgICBwbmdfcHRyLT5mcmVlX21lICY9IH5QTkdfRlJFRV9QTFRFOw0KKw0KKyNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkgfHwgXA0KKyAgICBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpDQorICAgaWYgKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9UUk5TKQ0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnRyYW5zX2FscGhhKTsNCisgICBwbmdfcHRyLT5mcmVlX21lICY9IH5QTkdfRlJFRV9UUk5TOw0KKyNlbmRpZg0KKw0KKyAgIGluZmxhdGVFbmQoJnBuZ19wdHItPnpzdHJlYW0pOw0KKw0KKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcik7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkgJiZcDQorICAgZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpDQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsNCisjZW5kaWYNCisNCisgICAvKiBOT1RFOiB0aGUgJ3NldGptcCcgYnVmZmVyIG1heSBzdGlsbCBiZSBhbGxvY2F0ZWQgYW5kIHRoZSBtZW1vcnkgYW5kIGVycm9yDQorICAgICogY2FsbGJhY2tzIGFyZSBzdGlsbCBzZXQgYXQgdGhpcyBwb2ludC4gIFRoZXkgYXJlIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZQ0KKyAgICAqIGRlc3RydWN0aW9uIG9mIHRoZSBwbmdfc3RydWN0IGl0c2VsZi4NCisgICAgKi8NCit9DQorDQorLyogRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHJlYWQgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19zdHJ1Y3RwcCBwbmdfcHRyX3B0ciwgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIsDQorICAgIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikNCit7DQorICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBOVUxMOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QiKTsNCisNCisgICBpZiAocG5nX3B0cl9wdHIgIT0gTlVMTCkNCisgICAgICBwbmdfcHRyID0gKnBuZ19wdHJfcHRyOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIGxpYnBuZyAxLjYuMDogdXNlIHRoZSBBUEkgdG8gZGVzdHJveSBpbmZvIHN0cnVjdHMgdG8gZW5zdXJlIGNvbnNpc3RlbnQNCisgICAgKiBiZWhhdmlvci4gIFByaW9yIHRvIDEuNi4wIGxpYnBuZyBkaWQgZXh0cmEgJ2luZm8nIGRlc3RydWN0aW9uIGluIHRoaXMgQVBJLg0KKyAgICAqIFRoZSBleHRyYSB3YXMsIGFwcGFyZW50bHksIHVubmVjZXNzYXJ5IHlldCB0aGlzIGhpZGVzIG1lbW9yeSBsZWFrIGJ1Z3MuDQorICAgICovDQorICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgZW5kX2luZm9fcHRyX3B0cik7DQorICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHJfcHRyKTsNCisNCisgICAqcG5nX3B0cl9wdHIgPSBOVUxMOw0KKyAgIHBuZ19yZWFkX2Rlc3Ryb3kocG5nX3B0cik7DQorICAgcG5nX2Rlc3Ryb3lfcG5nX3N0cnVjdChwbmdfcHRyKTsNCit9DQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfcmVhZF9zdGF0dXNfcHRyIHJlYWRfcm93X2ZuKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT5yZWFkX3Jvd19mbiA9IHJlYWRfcm93X2ZuOw0KK30NCisNCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfcmVhZF9wbmcocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgcGFyYW1zKQ0KK3sNCisgICBpbnQgcm93Ow0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgLyogcG5nX3JlYWRfaW5mbygpIGdpdmVzIHVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUNCisgICAgKiBQTkcgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IElEQVQgKGltYWdlIGRhdGEgY2h1bmspLg0KKyAgICAqLw0KKyAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgIGlmIChpbmZvX3B0ci0+aGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYLyhzaXplb2YgKHBuZ19ieXRlcCkpKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW1hZ2UgaXMgdG9vIGhpZ2ggdG8gcHJvY2VzcyB3aXRoIHBuZ19yZWFkX3BuZygpIik7DQorDQorICAgLyogLS0tLS0tLS0tLS0tLS0gaW1hZ2UgdHJhbnNmb3JtYXRpb25zIHN0YXJ0IGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRA0KKyAgIC8qIFRlbGwgbGlicG5nIHRvIHN0cmlwIDE2LWJpdC9jb2xvciBmaWxlcyBkb3duIHRvIDggYml0cyBwZXIgY29sb3IuDQorICAgICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NDQUxFXzE2KQ0KKyAgIHsNCisgICAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjUuNC4gInN0cmlwXzE2IiBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQgdGhhdCBpdA0KKyAgICAgICogZGlkIGluIGVhcmxpZXIgdmVyc2lvbnMsIHdoaWxlICJzY2FsZV8xNiIgaXMgbm93IG1vcmUgYWNjdXJhdGUuDQorICAgICAgKi8NCisgICAgICBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOw0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQNCisgICAvKiBJZiBib3RoIFNDQUxFIGFuZCBTVFJJUCBhcmUgcmVxdWlyZWQgcG5ncnRyYW4gd2lsbCBlZmZlY3RpdmVseSBjYW5jZWwgdGhlDQorICAgICogbGF0dGVyIGJ5IGRvaW5nIFNDQUxFIGZpcnN0LiAgVGhpcyBpcyBvayBhbmQgYWxsb3dzIGFwcHMgbm90IHRvIGNoZWNrIGZvcg0KKyAgICAqIHdoaWNoIGlzIHN1cHBvcnRlZCB0byBnZXQgdGhlIHJpZ2h0IGFuc3dlci4NCisgICAgKi8NCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYpDQorICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEDQorICAgLyogU3RyaXAgYWxwaGEgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgZGF0YSB3aXRob3V0IGNvbWJpbmluZyB3aXRoDQorICAgICogdGhlIGJhY2tncm91bmQgKG5vdCByZWNvbW1lbmRlZCkuDQorICAgICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBKQ0KKyAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpDQorICAgLyogRXh0cmFjdCBtdWx0aXBsZSBwaXhlbHMgd2l0aCBiaXQgZGVwdGhzIG9mIDEsIDIsIG9yIDQgZnJvbSBhIHNpbmdsZQ0KKyAgICAqIGJ5dGUgaW50byBzZXBhcmF0ZSBieXRlcyAodXNlZnVsIGZvciBwYWxldHRlZCBhbmQgZ3JheXNjYWxlIGltYWdlcykuDQorICAgICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcpDQorICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQNCisgICAvKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHBhY2tlZCBwaXhlbHMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0DQorICAgICogKG5vdCB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBwbmdfc2V0X3BhY2tpbmcpLg0KKyAgICAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCkNCisgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEDQorICAgLyogRXhwYW5kIHBhbGV0dGVkIGNvbG9ycyBpbnRvIHRydWUgUkdCIHRyaXBsZXRzDQorICAgICogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gZnVsbCA4IGJpdHMgZnJvbSAxLCAyLCBvciA0IGJpdHMvcGl4ZWwNCisgICAgKiBFeHBhbmQgcGFsZXR0ZWQgb3IgUkdCIGltYWdlcyB3aXRoIHRyYW5zcGFyZW5jeSB0byBmdWxsIGFscGhhDQorICAgICogY2hhbm5lbHMgc28gdGhlIGRhdGEgd2lsbCBiZSBhdmFpbGFibGUgYXMgUkdCQSBxdWFydGV0cy4NCisgICAgKi8NCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fRVhQQU5EKQ0KKyAgICAgIGlmICgocG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkgfHwNCisgICAgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgfHwNCisgICAgICAgICAgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKSkNCisgICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsNCisjZW5kaWYNCisNCisgICAvKiBXZSBkb24ndCBoYW5kbGUgYmFja2dyb3VuZCBjb2xvciBvciBnYW1tYSB0cmFuc2Zvcm1hdGlvbiBvciBxdWFudGl6aW5nLg0KKyAgICAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEDQorICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgdG8gaGF2ZSAwIGFzIHdoaXRlIGFuZCAxIGFzIGJsYWNrDQorICAgICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PKQ0KKyAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRA0KKyAgIC8qIElmIHlvdSB3YW50IHRvIHNoaWZ0IHRoZSBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgcmFuZ2UgWzAsMjU1XSBvcg0KKyAgICAqIFswLDY1NTM1XSB0byB0aGUgb3JpZ2luYWwgWzAsN10gb3IgWzAsMzFdLCBvciB3aGF0ZXZlciByYW5nZSB0aGUNCisgICAgKiBjb2xvcnMgd2VyZSBvcmlnaW5hbGx5IGluOg0KKyAgICAqLw0KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0hJRlQpDQorICAgICAgICYmIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3NCSVQpKQ0KKyAgIHsNCisgICAgICBwbmdfY29sb3JfOHAgc2lnX2JpdDsNCisNCisgICAgICBwbmdfZ2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsNCisgICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXQpOw0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfQkdSX1NVUFBPUlRFRA0KKyAgIC8qIEZsaXAgdGhlIFJHQiBwaXhlbHMgdG8gQkdSIChvciBSR0JBIHRvIEJHUkEpICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0JHUikNCisgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQNCisgICAvKiBTd2FwIHRoZSBSR0JBIG9yIEdBIGRhdGEgdG8gQVJHQiBvciBBRyAob3IgQkdSQSB0byBBQkdSKSAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBKQ0KKyAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQNCisgICAvKiBTd2FwIGJ5dGVzIG9mIDE2LWJpdCBmaWxlcyB0byBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOKQ0KKyAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsNCisjZW5kaWYNCisNCisvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQxICovDQorI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQNCisgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBvcGFjaXR5IHRvIHRyYW5zcGFyZW5jeSAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpDQorICAgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7DQorI2VuZGlmDQorDQorLyogQWRkZWQgYXQgbGlicG5nLTEuMi40MSAqLw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCisgICAvKiBFeHBhbmQgZ3JheXNjYWxlIGltYWdlIHRvIFJHQiAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQikNCisgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKy8qIEFkZGVkIGF0IGxpYnBuZy0xLjUuNCAqLw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNikNCisgICAgICBwbmdfc2V0X2V4cGFuZF8xNihwbmdfcHRyKTsNCisjZW5kaWYNCisNCisgICAvKiBXZSBkb24ndCBoYW5kbGUgYWRkaW5nIGZpbGxlciBieXRlcyAqLw0KKw0KKyAgIC8qIFdlIHVzZSBwbmdfcmVhZF9pbWFnZSBhbmQgcmVseSBvbiB0aGF0IGZvciBpbnRlcmxhY2UgaGFuZGxpbmcsIGJ1dCB3ZSBhbHNvDQorICAgICogY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyB0aGVyZWZvcmUgbXVzdCB0dXJuIG9uIGludGVybGFjZSBoYW5kbGluZyBub3c6DQorICAgICovDQorICAgKHZvaWQpcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7DQorDQorICAgLyogT3B0aW9uYWwgY2FsbCB0byBnYW1tYSBjb3JyZWN0IGFuZCBhZGQgdGhlIGJhY2tncm91bmQgdG8gdGhlIHBhbGV0dGUNCisgICAgKiBhbmQgdXBkYXRlIGluZm8gc3RydWN0dXJlLiAgUkVRVUlSRUQgaWYgeW91IGFyZSBleHBlY3RpbmcgbGlicG5nIHRvDQorICAgICogdXBkYXRlIHRoZSBwYWxldHRlIGZvciB5b3UgKGkuZS4sIHlvdSBzZWxlY3RlZCBzdWNoIGEgdHJhbnNmb3JtIGFib3ZlKS4NCisgICAgKi8NCisgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorDQorICAgLyogLS0tLS0tLS0tLS0tLS0gaW1hZ2UgdHJhbnNmb3JtYXRpb25zIGVuZCBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ST1dTLCAwKTsNCisgICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycyA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiBpcHRyOw0KKw0KKyAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPSAocG5nX2J5dGVwcClwbmdfbWFsbG9jKHBuZ19wdHIsDQorICAgICAgICAgIGluZm9fcHRyLT5oZWlnaHQgKiAoc2l6ZW9mIChwbmdfYnl0ZXApKSk7DQorICAgICAgZm9yIChpcHRyPTA7IGlwdHI8aW5mb19wdHItPmhlaWdodDsgaXB0cisrKQ0KKyAgICAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnNbaXB0cl0gPSBOVUxMOw0KKw0KKyAgICAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1JPV1M7DQorDQorICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCAoaW50KWluZm9fcHRyLT5oZWlnaHQ7IHJvdysrKQ0KKyAgICAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnNbcm93XSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKTsNCisgICB9DQorDQorICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgaW5mb19wdHItPnJvd19wb2ludGVycyk7DQorICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX0lEQVQ7DQorDQorICAgLyogUmVhZCByZXN0IG9mIGZpbGUsIGFuZCBnZXQgYWRkaXRpb25hbCBjaHVua3MgaW4gaW5mb19wdHIgLSBSRVFVSVJFRCAqLw0KKyAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7DQorDQorICAgUE5HX1VOVVNFRCh0cmFuc2Zvcm1zKSAgIC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzICovDQorICAgUE5HX1VOVVNFRChwYXJhbXMpDQorDQorfQ0KKyNlbmRpZiAvKiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQgKi8NCisjZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQNCisvKiBTSU1QTElGSUVEIFJFQUQNCisgKg0KKyAqIFRoaXMgY29kZSBjdXJyZW50bHkgcmVsaWVzIG9uIHRoZSBzZXF1ZW50aWFsIHJlYWRlciwgdGhvdWdoIGl0IGNvdWxkIGVhc2lseQ0KKyAqIGJlIG1hZGUgdG8gd29yayB3aXRoIHRoZSBwcm9ncmVzc2l2ZSBvbmUuDQorICovDQorLyogQXJndW1lbnRzIHRvIHBuZ19pbWFnZV9maW5pc2hfcmVhZDogKi8NCisNCisvKiBFbmNvZGluZyBvZiBQTkcgZGF0YSAodXNlZCBieSB0aGUgY29sb3ItbWFwIGNvZGUpICovDQorLyogVE9ETzogY2hhbmdlIHRoZXNlLCBkYW5nLCBBTlNJLUMgcmVzZXJ2ZXMgdGhlICdFJyBuYW1lc3BhY2UuICovDQorIyAgZGVmaW5lIEVfTk9UU0VUICAwIC8qIEZpbGUgZW5jb2Rpbmcgbm90IHlldCBrbm93biAqLw0KKyMgIGRlZmluZSBFX3NSR0IgICAgMSAvKiA4LWJpdCBlbmNvZGVkIHRvIHNSR0IgZ2FtbWEgKi8NCisjICBkZWZpbmUgRV9MSU5FQVIgIDIgLyogMTYtYml0IGxpbmVhcjogbm90IGVuY29kZWQsIE5PVCBwcmUtbXVsdGlwbGllZCEgKi8NCisjICBkZWZpbmUgRV9GSUxFICAgIDMgLyogOC1iaXQgZW5jb2RlZCB0byBmaWxlIGdhbW1hLCBub3Qgc1JHQiBvciBsaW5lYXIgKi8NCisjICBkZWZpbmUgRV9MSU5FQVI4IDQgLyogOC1iaXQgbGluZWFyOiBvbmx5IGZyb20gYSBmaWxlIHZhbHVlICovDQorDQorLyogQ29sb3ItbWFwIHByb2Nlc3Npbmc6IGFmdGVyIGxpYnBuZyBoYXMgcnVuIG9uIHRoZSBQTkcgaW1hZ2UgZnVydGhlcg0KKyAqIHByb2Nlc3NpbmcgbWF5IGJlIG5lZWRlZCB0byBjb252ZXIgdGhlIGRhdGEgdG8gY29sb3ItbWFwIGluZGljaWVzLg0KKyAqLw0KKyNkZWZpbmUgUE5HX0NNQVBfTk9ORSAgICAgIDANCisjZGVmaW5lIFBOR19DTUFQX0dBICAgICAgICAxIC8qIFByb2Nlc3MgR0EgZGF0YSB0byBhIGNvbG9yLW1hcCB3aXRoIGFscGhhICovDQorI2RlZmluZSBQTkdfQ01BUF9UUkFOUyAgICAgMiAvKiBQcm9jZXNzIEdBIGRhdGEgdG8gYSBiYWNrZ3JvdW5kIGluZGV4ICovDQorI2RlZmluZSBQTkdfQ01BUF9SR0IgICAgICAgMyAvKiBQcm9jZXNzIFJHQiBkYXRhICovDQorI2RlZmluZSBQTkdfQ01BUF9SR0JfQUxQSEEgNCAvKiBQcm9jZXNzIFJHQkEgZGF0YSAqLw0KKw0KKy8qIFRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgd2hlcmUgdGhlIGJhY2tncm91bmQgaXMgZm9yIGVhY2ggcHJvY2Vzc2luZyBjYXNlLiAqLw0KKyNkZWZpbmUgUE5HX0NNQVBfTk9ORV9CQUNLR1JPVU5EICAgICAgMjU2DQorI2RlZmluZSBQTkdfQ01BUF9HQV9CQUNLR1JPVU5EICAgICAgICAyMzENCisjZGVmaW5lIFBOR19DTUFQX1RSQU5TX0JBQ0tHUk9VTkQgICAgIDI1NA0KKyNkZWZpbmUgUE5HX0NNQVBfUkdCX0JBQ0tHUk9VTkQgICAgICAgMjU2DQorI2RlZmluZSBQTkdfQ01BUF9SR0JfQUxQSEFfQkFDS0dST1VORCAyMTYNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAvKiBBcmd1bWVudHM6ICovDQorICAgcG5nX2ltYWdlcCBpbWFnZTsNCisgICBwbmdfdm9pZHAgIGJ1ZmZlcjsNCisgICBwbmdfaW50XzMyIHJvd19zdHJpZGU7DQorICAgcG5nX3ZvaWRwICBjb2xvcm1hcDsNCisgICBwbmdfY29uc3RfY29sb3JwIGJhY2tncm91bmQ7DQorICAgLyogTG9jYWwgdmFyaWFibGVzOiAqLw0KKyAgIHBuZ192b2lkcCAgICAgICBsb2NhbF9yb3c7DQorICAgcG5nX3ZvaWRwICAgICAgIGZpcnN0X3JvdzsNCisgICBwdHJkaWZmX3QgICAgICAgcm93X2J5dGVzOyAgICAgICAgICAgLyogc3RlcCBiZXR3ZWVuIHJvd3MgKi8NCisgICBpbnQgICAgICAgICAgICAgZmlsZV9lbmNvZGluZzsgICAgICAgLyogRV8gdmFsdWVzIGFib3ZlICovDQorICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3RvX2xpbmVhcjsgICAgIC8qIEZvciBFX0ZJTEUsIHJlY2lwcm9jYWwgb2YgZ2FtbWEgKi8NCisgICBpbnQgICAgICAgICAgICAgY29sb3JtYXBfcHJvY2Vzc2luZzsgLyogUE5HX0NNQVBfIHZhbHVlcyBhYm92ZSAqLw0KK30gcG5nX2ltYWdlX3JlYWRfY29udHJvbDsNCisNCisvKiBEbyBhbGwgdGhlICpzYWZlKiBpbml0aWFsaXphdGlvbiAtICdzYWZlJyBtZWFucyB0aGF0IHBuZ19lcnJvciB3b24ndCBiZQ0KKyAqIGNhbGxlZCwgc28gc2V0dGluZyB1cCB0aGUgam1wX2J1ZiBpcyBub3QgcmVxdWlyZWQuICBUaGlzIG1lYW5zIHRoYXQgYW55dGhpbmcNCisgKiBjYWxsZWQgZnJvbSBoZXJlIG11c3QgKm5vdCogY2FsbCBwbmdfbWFsbG9jIC0gaXQgaGFzIHRvIGNhbGwgcG5nX21hbGxvY193YXJuDQorICogaW5zdGVhZCBzbyB0aGF0IGNvbnRyb2wgaXMgcmV0dXJuZWQgc2FmZWx5IGJhY2sgdG8gdGhpcyByb3V0aW5lLg0KKyAqLw0KK3N0YXRpYyBpbnQNCitwbmdfaW1hZ2VfcmVhZF9pbml0KHBuZ19pbWFnZXAgaW1hZ2UpDQorew0KKyAgIGlmIChpbWFnZS0+b3BhcXVlID09IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgaW1hZ2UsDQorICAgICAgICAgIHBuZ19zYWZlX2Vycm9yLCBwbmdfc2FmZV93YXJuaW5nKTsNCisNCisgICAgICAvKiBBbmQgc2V0IHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gTlVMTCB0byBlbnN1cmUgdGhhdCB0aGUgdmFyaW91cw0KKyAgICAgICAqIGZpZWxkcyBhcmUgY29uc2lzdGVudC4NCisgICAgICAgKi8NCisgICAgICBtZW1zZXQoaW1hZ2UsIDAsIChzaXplb2YgKmltYWdlKSk7DQorICAgICAgaW1hZ2UtPnZlcnNpb24gPSBQTkdfSU1BR0VfVkVSU0lPTjsNCisNCisgICAgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOw0KKw0KKyAgICAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfY29udHJvbHAgY29udHJvbCA9IHBuZ192b2lkY2FzdChwbmdfY29udHJvbHAsDQorICAgICAgICAgICAgICAgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIChzaXplb2YgKmNvbnRyb2wpKSk7DQorDQorICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gTlVMTCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgbWVtc2V0KGNvbnRyb2wsIDAsIChzaXplb2YgKmNvbnRyb2wpKTsNCisNCisgICAgICAgICAgICAgICBjb250cm9sLT5wbmdfcHRyID0gcG5nX3B0cjsNCisgICAgICAgICAgICAgICBjb250cm9sLT5pbmZvX3B0ciA9IGluZm9fcHRyOw0KKyAgICAgICAgICAgICAgIGNvbnRyb2wtPmZvcl93cml0ZSA9IDA7DQorDQorICAgICAgICAgICAgICAgaW1hZ2UtPm9wYXF1ZSA9IGNvbnRyb2w7DQorICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8qIEVycm9yIGNsZWFuIHVwICovDQorICAgICAgICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3B0ciwgJmluZm9fcHRyKTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOw0KKyAgICAgIH0NCisNCisgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLCAicG5nX2ltYWdlX3JlYWQ6IG91dCBvZiBtZW1vcnkiKTsNCisgICB9DQorDQorICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwgInBuZ19pbWFnZV9yZWFkOiBvcGFxdWUgcG9pbnRlciBub3QgTlVMTCIpOw0KK30NCisNCisvKiBVdGlsaXR5IHRvIGZpbmQgdGhlIGJhc2UgZm9ybWF0IG9mIGEgUE5HIGZpbGUgZnJvbSBhIHBuZ19zdHJ1Y3QuICovDQorc3RhdGljIHBuZ191aW50XzMyDQorcG5nX2ltYWdlX2Zvcm1hdChwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX3VpbnRfMzIgZm9ybWF0ID0gMDsNCisNCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQ0KKyAgICAgIGZvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQ09MT1I7DQorDQorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkNCisgICAgICBmb3JtYXQgfD0gUE5HX0ZPUk1BVF9GTEFHX0FMUEhBOw0KKw0KKyAgIC8qIFVzZSBwbmdfcHRyIGhlcmUsIG5vdCBpbmZvX3B0ciwgYmVjYXVzZSBieSBleGFtaW5hdGlvbiBwbmdfaGFuZGxlX3RSTlMNCisgICAgKiBzZXRzIHRoZSBwbmdfc3RydWN0IGZpZWxkczsgdGhhdCdzIGFsbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBoZXJlLiAgVGhlDQorICAgICogcHJlY2lzZSBpbnRlcmFjdGlvbiB3aXRoIGFuIGFwcCBjYWxsIHRvIHBuZ19zZXRfdFJOUyBhbmQgUE5HIGZpbGUgcmVhZGluZw0KKyAgICAqIGlzIHVuY2xlYXIuDQorICAgICovDQorICAgZWxzZSBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gMCkNCisgICAgICBmb3JtYXQgfD0gUE5HX0ZPUk1BVF9GTEFHX0FMUEhBOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpDQorICAgICAgZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19MSU5FQVI7DQorDQorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQ0KKyAgICAgIGZvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVA7DQorDQorICAgcmV0dXJuIGZvcm1hdDsNCit9DQorDQorLyogSXMgdGhlIGdpdmVuIGdhbW1hIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gc1JHQj8gIFRoZSB0ZXN0IGlzIHRoZSBzYW1lDQorICogb25lIHVzZWQgaW4gcG5ncnRyYW4uYyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gZG8gZ2FtbWEgY29ycmVjdGlvbi4gIFRoZQ0KKyAqIGFyaXRobWV0aWMgb3B0aW1pemVzIHRoZSBkaXZpc2lvbiBieSB1c2luZyB0aGUgZmFjdCB0aGF0IHRoZSBpbnZlcnNlIG9mIHRoZQ0KKyAqIGZpbGUgc1JHQiBnYW1tYSBpcyAyLjINCisgKi8NCitzdGF0aWMgaW50DQorcG5nX2dhbW1hX25vdF9zUkdCKHBuZ19maXhlZF9wb2ludCBnKQ0KK3sNCisgICBpZiAoZyA8IFBOR19GUF8xKQ0KKyAgIHsNCisgICAgICAvKiBBbiB1bmluaXRpYWxpemVkIGdhbW1hIGlzIGFzc3VtZWQgdG8gYmUgc1JHQiBmb3IgdGhlIHNpbXBsaWZpZWQgQVBJLiAqLw0KKyAgICAgIGlmIChnID09IDApDQorICAgICAgICAgcmV0dXJuIDA7DQorDQorICAgICAgcmV0dXJuIHBuZ19nYW1tYV9zaWduaWZpY2FudCgoZyAqIDExICsgMikvNSAvKiBpLmUuICoyLjIsIHJvdW5kZWQgKi8pOw0KKyAgIH0NCisNCisgICByZXR1cm4gMTsNCit9DQorDQorLyogRG8gdGhlIG1haW4gYm9keSBvZiBhICdwbmdfaW1hZ2VfYmVnaW5fcmVhZCcgZnVuY3Rpb247IHJlYWQgdGhlIFBORyBmaWxlDQorICogaGVhZGVyIGFuZCBmaWxsIGluIGFsbCB0aGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGV4ZWN1dGVkIGluIGEgc2FmZSBjb250ZXh0LA0KKyAqIHVubGlrZSB0aGUgaW5pdCByb3V0aW5lIGFib3ZlLg0KKyAqLw0KK3N0YXRpYyBpbnQNCitwbmdfaW1hZ2VfcmVhZF9oZWFkZXIocG5nX3ZvaWRwIGFyZ3VtZW50KQ0KK3sNCisgICBwbmdfaW1hZ2VwIGltYWdlID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZXAsIGFyZ3VtZW50KTsNCisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7DQorICAgcG5nX2luZm9ycCBpbmZvX3B0ciA9IGltYWdlLT5vcGFxdWUtPmluZm9fcHRyOw0KKw0KKyAgIHBuZ19zZXRfYmVuaWduX2Vycm9ycyhwbmdfcHRyLCAxLyp3YXJuKi8pOw0KKyAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOw0KKw0KKyAgIC8qIERvIHRoaXMgdGhlIGZhc3Qgd2F5OyBqdXN0IHJlYWQgZGlyZWN0bHkgb3V0IG9mIHBuZ19zdHJ1Y3QuICovDQorICAgaW1hZ2UtPndpZHRoID0gcG5nX3B0ci0+d2lkdGg7DQorICAgaW1hZ2UtPmhlaWdodCA9IHBuZ19wdHItPmhlaWdodDsNCisNCisgICB7DQorICAgICAgcG5nX3VpbnRfMzIgZm9ybWF0ID0gcG5nX2ltYWdlX2Zvcm1hdChwbmdfcHRyKTsNCisNCisgICAgICBpbWFnZS0+Zm9ybWF0ID0gZm9ybWF0Ow0KKw0KKyNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCisgICAgICAvKiBEb2VzIHRoZSBjb2xvcnNwYWNlIG1hdGNoIHNSR0I/ICBJZiB0aGVyZSBpcyBubyBjb2xvciBlbmRwb2ludA0KKyAgICAgICAqIChjb2xvcmFudCkgaW5mb3JtYXRpb24gYXNzdW1lIHllcywgb3RoZXJ3aXNlIHJlcXVpcmUgdGhlDQorICAgICAgICogJ0VORFBPSU5UU19NQVRDSEVfc1JHQicgY29sb3JzcGFjZSBmbGFnIHRvIGhhdmUgYmVlbiBzZXQuICBJZiB0aGUNCisgICAgICAgKiBjb2xvcnNwYWNlIGhhcyBiZWVuIGRldGVybWluZWQgdG8gYmUgaW52YWxpZCBpZ25vcmUgaXQuDQorICAgICAgICovDQorICAgICAgaWYgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpICE9IDAgJiYgKChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzDQorICAgICAgICAgJiAoUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFN8UE5HX0NPTE9SU1BBQ0VfRU5EUE9JTlRTX01BVENIX3NSR0J8DQorICAgICAgICAgICAgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkpID09IFBOR19DT0xPUlNQQUNFX0hBVkVfRU5EUE9JTlRTKSkNCisgICAgICAgICBpbWFnZS0+ZmxhZ3MgfD0gUE5HX0lNQUdFX0ZMQUdfQ09MT1JTUEFDRV9OT1Rfc1JHQjsNCisjZW5kaWYNCisgICB9DQorDQorICAgLyogV2UgbmVlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyByZWdhcmRsZXNzIG9mIHRoZSBmb3JtYXQgdGhlDQorICAgICogYXBwbGljYXRpb24gc2V0cyBoZXJlLg0KKyAgICAqLw0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiBjbWFwX2VudHJpZXM7DQorDQorICAgICAgc3dpdGNoIChwbmdfcHRyLT5jb2xvcl90eXBlKQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6DQorICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gMVUgPDwgcG5nX3B0ci0+Yml0X2RlcHRoOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToNCisgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IDI1NjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICB9DQorDQorICAgICAgaWYgKGNtYXBfZW50cmllcyA+IDI1NikNCisgICAgICAgICBjbWFwX2VudHJpZXMgPSAyNTY7DQorDQorICAgICAgaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMgPSBjbWFwX2VudHJpZXM7DQorICAgfQ0KKw0KKyAgIHJldHVybiAxOw0KK30NCisNCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRA0KK2ludCBQTkdBUEkNCitwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvKHBuZ19pbWFnZXAgaW1hZ2UsIEZJTEUqIGZpbGUpDQorew0KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT52ZXJzaW9uID09IFBOR19JTUFHRV9WRVJTSU9OKQ0KKyAgIHsNCisgICAgICBpZiAoZmlsZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX2ltYWdlX3JlYWRfaW5pdChpbWFnZSkpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgc2xpZ2h0bHkgZXZpbCwgYnV0IHBuZ19pbml0X2lvIGRvZXNuJ3QgZG8gYW55dGhpbmcgb3RoZXINCisgICAgICAgICAgICAgKiB0aGFuIHRoaXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgc3RhbmRhcmQgSU8gZnVuY3Rpb25zIHNvDQorICAgICAgICAgICAgICogdGhpcyBzYXZlcyBhICdzYWZlJyBmdW5jdGlvbi4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLT5pb19wdHIgPSBmaWxlOw0KKyAgICAgICAgICAgIHJldHVybiBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9oZWFkZXIsIGltYWdlKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLA0KKyAgICAgICAgICAgICJwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvOiBpbnZhbGlkIGFyZ3VtZW50Iik7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpDQorICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwNCisgICAgICAgICAicG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbzogaW5jb3JyZWN0IFBOR19JTUFHRV9WRVJTSU9OIik7DQorDQorICAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBQTkdBUEkNCitwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUocG5nX2ltYWdlcCBpbWFnZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lKQ0KK3sNCisgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikNCisgICB7DQorICAgICAgaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7DQorDQorICAgICAgICAgaWYgKGZwICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfaW1hZ2VfcmVhZF9pbml0KGltYWdlKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0ci0+aW9fcHRyID0gZnA7DQorICAgICAgICAgICAgICAgaW1hZ2UtPm9wYXF1ZS0+b3duZWRfZmlsZSA9IDE7DQorICAgICAgICAgICAgICAgcmV0dXJuIHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ19pbWFnZV9yZWFkX2hlYWRlciwgaW1hZ2UpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvKiBDbGVhbiB1cDoganVzdCB0aGUgb3BlbmVkIGZpbGUuICovDQorICAgICAgICAgICAgKHZvaWQpZmNsb3NlKGZwKTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLA0KKyAgICAgICAgICAgICJwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGU6IGludmFsaWQgYXJndW1lbnQiKTsNCisgICB9DQorDQorICAgZWxzZSBpZiAoaW1hZ2UgIT0gTlVMTCkNCisgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLA0KKyAgICAgICAgICJwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGU6IGluY29ycmVjdCBQTkdfSU1BR0VfVkVSU0lPTiIpOw0KKw0KKyAgIHJldHVybiAwOw0KK30NCisjZW5kaWYgLyogUE5HX1NURElPX1NVUFBPUlRFRCAqLw0KKw0KK3N0YXRpYyB2b2lkIFBOR0NCQVBJDQorcG5nX2ltYWdlX21lbW9yeV9yZWFkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBvdXQsIHBuZ19zaXplX3QgbmVlZCkNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2ltYWdlcCBpbWFnZSA9IHBuZ192b2lkY2FzdChwbmdfaW1hZ2VwLCBwbmdfcHRyLT5pb19wdHIpOw0KKyAgICAgIGlmIChpbWFnZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfY29udHJvbHAgY3AgPSBpbWFnZS0+b3BhcXVlOw0KKyAgICAgICAgIGlmIChjcCAhPSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfY29uc3RfYnl0ZXAgbWVtb3J5ID0gY3AtPm1lbW9yeTsNCisgICAgICAgICAgICBwbmdfc2l6ZV90IHNpemUgPSBjcC0+c2l6ZTsNCisNCisgICAgICAgICAgICBpZiAobWVtb3J5ICE9IE5VTEwgJiYgc2l6ZSA+PSBuZWVkKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBtZW1jcHkob3V0LCBtZW1vcnksIG5lZWQpOw0KKyAgICAgICAgICAgICAgIGNwLT5tZW1vcnkgPSBtZW1vcnkgKyBuZWVkOw0KKyAgICAgICAgICAgICAgIGNwLT5zaXplID0gc2l6ZSAtIG5lZWQ7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInJlYWQgYmV5b25kIGVuZCBvZiBkYXRhIik7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgbWVtb3J5IHJlYWQiKTsNCisgICB9DQorfQ0KKw0KK2ludCBQTkdBUEkgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnkocG5nX2ltYWdlcCBpbWFnZSwNCisgICBwbmdfY29uc3Rfdm9pZHAgbWVtb3J5LCBwbmdfc2l6ZV90IHNpemUpDQorew0KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT52ZXJzaW9uID09IFBOR19JTUFHRV9WRVJTSU9OKQ0KKyAgIHsNCisgICAgICBpZiAobWVtb3J5ICE9IE5VTEwgJiYgc2l6ZSA+IDApDQorICAgICAgew0KKyAgICAgICAgIGlmIChwbmdfaW1hZ2VfcmVhZF9pbml0KGltYWdlKSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogTm93IHNldCB0aGUgSU8gZnVuY3Rpb25zIHRvIHJlYWQgZnJvbSB0aGUgbWVtb3J5IGJ1ZmZlciBhbmQNCisgICAgICAgICAgICAgKiBzdG9yZSBpdCBpbnRvIGlvX3B0ci4gIEFnYWluIGRvIHRoaXMgaW4tcGxhY2UgdG8gYXZvaWQgY2FsbGluZyBhDQorICAgICAgICAgICAgICogbGlicG5nIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgZXJyb3IgaGFuZGxpbmcuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaW1hZ2UtPm9wYXF1ZS0+bWVtb3J5ID0gcG5nX3ZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgbWVtb3J5KTsNCisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlLT5zaXplID0gc2l6ZTsNCisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLT5pb19wdHIgPSBpbWFnZTsNCisgICAgICAgICAgICBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSBwbmdfaW1hZ2VfbWVtb3J5X3JlYWQ7DQorDQorICAgICAgICAgICAgcmV0dXJuIHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ19pbWFnZV9yZWFkX2hlYWRlciwgaW1hZ2UpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsDQorICAgICAgICAgICAgInBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5OiBpbnZhbGlkIGFyZ3VtZW50Iik7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpDQorICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwNCisgICAgICAgICAicG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnk6IGluY29ycmVjdCBQTkdfSU1BR0VfVkVSU0lPTiIpOw0KKw0KKyAgIHJldHVybiAwOw0KK30NCisNCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNraXAgY2h1bmtzIHRoYXQgYXJlIG5vdCB1c2VkIGJ5IHRoZSBzaW1wbGlmaWVkIGltYWdlDQorICogcmVhZCBmdW5jdGlvbnMgYW5kIGFuIGFwcHJvcHJpYXRlIG1hY3JvIHRvIGNhbGwgaXQuDQorICovDQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQNCitzdGF0aWMgdm9pZA0KK3BuZ19pbWFnZV9za2lwX3VudXNlZF9jaHVua3MocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIFByZXBhcmUgdGhlIHJlYWRlciB0byBpZ25vcmUgYWxsIHJlY29nbml6ZWQgY2h1bmtzIHdob3NlIGRhdGEgd2lsbCBub3QNCisgICAgKiBiZSB1c2VkLCBpLmUuLCBhbGwgY2h1bmtzIHJlY29nbml6ZWQgYnkgbGlicG5nIGV4Y2VwdCBmb3IgdGhvc2UNCisgICAgKiBpbnZvbHZlZCBpbiBiYXNpYyBpbWFnZSByZWFkaW5nOg0KKyAgICAqDQorICAgICogICAgSUhEUiwgUExURSwgSURBVCwgSUVORA0KKyAgICAqDQorICAgICogT3IgaW1hZ2UgZGF0YSBoYW5kbGluZzoNCisgICAgKg0KKyAgICAqICAgIHRSTlMsIGJLR0QsIGdBTUEsIGNIUk0sIHNSR0IsIGlDQ1AgYW5kIHNCSVQuDQorICAgICoNCisgICAgKiBUaGlzIHByb3ZpZGVzIGEgc21hbGwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYW5kIGVsaW1pbmF0ZXMgYW55DQorICAgICogcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkgdG8gc2VjdXJpdHkgcHJvYmxlbXMgaW4gdGhlIHVudXNlZCBjaHVua3MuDQorICAgICovDQorICAgew0KKyAgICAgICAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgY2h1bmtzX3RvX3Byb2Nlc3NbXSA9IHsNCisgICAgICAgICAgICA5OCwgIDc1LCAgNzEsICA2OCwgJ1wwJywgIC8qIGJLR0QgKi8NCisgICAgICAgICAgICA5OSwgIDcyLCAgODIsICA3NywgJ1wwJywgIC8qIGNIUk0gKi8NCisgICAgICAgICAgIDEwMywgIDY1LCAgNzcsICA2NSwgJ1wwJywgIC8qIGdBTUEgKi8NCisgICAgICAgICAgIDEwNSwgIDY3LCAgNjcsICA4MCwgJ1wwJywgIC8qIGlDQ1AgKi8NCisgICAgICAgICAgIDExNSwgIDY2LCAgNzMsICA4NCwgJ1wwJywgIC8qIHNCSVQgKi8NCisgICAgICAgICAgIDExNSwgIDgyLCAgNzEsICA2NiwgJ1wwJywgIC8qIHNSR0IgKi8NCisgICAgICAgICAgIH07DQorDQorICAgICAgIC8qIElnbm9yZSB1bmtub3duIGNodW5rcyBhbmQgYWxsIG90aGVyIGNodW5rcyBleGNlcHQgZm9yIHRoZQ0KKyAgICAgICAgKiBJSERSLCBQTFRFLCB0Uk5TLCBJREFULCBhbmQgSUVORCBjaHVua3MuDQorICAgICAgICAqLw0KKyAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiwNCisgICAgICAgICBOVUxMLCAtMSk7DQorDQorICAgICAgIC8qIEJ1dCBkbyBub3QgaWdub3JlIGltYWdlIGRhdGEgaGFuZGxpbmcgY2h1bmtzICovDQorICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQsDQorICAgICAgICAgY2h1bmtzX3RvX3Byb2Nlc3MsIChzaXplb2YgY2h1bmtzX3RvX3Byb2Nlc3MpLzUpOw0KKyAgICB9DQorfQ0KKw0KKyMgIGRlZmluZSBQTkdfU0tJUF9DSFVOS1MocCkgcG5nX2ltYWdlX3NraXBfdW51c2VkX2NodW5rcyhwKQ0KKyNlbHNlDQorIyAgZGVmaW5lIFBOR19TS0lQX0NIVU5LUyhwKSAoKHZvaWQpMCkNCisjZW5kaWYgLyogUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRCAqLw0KKw0KKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gZ2l2ZXMgdGhlIGV4YWN0IHJvdW5kZWQgYW5zd2VyIGZvciBhbGwgdmFsdWVzIGluIHRoZQ0KKyAqIHJhbmdlIDAuLjI1NSAoaXQgYWN0dWFsbHkgZGl2aWRlcyBieSA1MS4yLCBidXQgdGhlIHJvdW5kaW5nIHN0aWxsIGdlbmVyYXRlcw0KKyAqIHRoZSBjb3JyZWN0IG51bWJlcnMgMC4uNQ0KKyAqLw0KKyNkZWZpbmUgUE5HX0RJVjUxKHY4KSAoKCh2OCkgKiA1ICsgMTMwKSA+PiA4KQ0KKw0KKy8qIFV0aWxpdHkgZnVuY3Rpb25zIHRvIG1ha2UgcGFydGljdWxhciBjb2xvci1tYXBzICovDQorc3RhdGljIHZvaWQNCitzZXRfZmlsZV9lbmNvZGluZyhwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5KQ0KK3sNCisgICBwbmdfZml4ZWRfcG9pbnQgZyA9IGRpc3BsYXktPmltYWdlLT5vcGFxdWUtPnBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWE7DQorICAgaWYgKHBuZ19nYW1tYV9zaWduaWZpY2FudChnKSkNCisgICB7DQorICAgICAgaWYgKHBuZ19nYW1tYV9ub3Rfc1JHQihnKSkNCisgICAgICB7DQorICAgICAgICAgZGlzcGxheS0+ZmlsZV9lbmNvZGluZyA9IEVfRklMRTsNCisgICAgICAgICBkaXNwbGF5LT5nYW1tYV90b19saW5lYXIgPSBwbmdfcmVjaXByb2NhbChnKTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIGRpc3BsYXktPmZpbGVfZW5jb2RpbmcgPSBFX3NSR0I7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICAgICBkaXNwbGF5LT5maWxlX2VuY29kaW5nID0gRV9MSU5FQVI4Ow0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgaW50DQorZGVjb2RlX2dhbW1hKHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXksIHBuZ191aW50XzMyIHZhbHVlLCBpbnQgZW5jb2RpbmcpDQorew0KKyAgIGlmIChlbmNvZGluZyA9PSBFX0ZJTEUpIC8qIGRvdWJsZSBjaGVjayAqLw0KKyAgICAgIGVuY29kaW5nID0gZGlzcGxheS0+ZmlsZV9lbmNvZGluZzsNCisNCisgICBpZiAoZW5jb2RpbmcgPT0gRV9OT1RTRVQpIC8qIG11c3QgYmUgdGhlIGZpbGUgZW5jb2RpbmcgKi8NCisgICB7DQorICAgICAgc2V0X2ZpbGVfZW5jb2RpbmcoZGlzcGxheSk7DQorICAgICAgZW5jb2RpbmcgPSBkaXNwbGF5LT5maWxlX2VuY29kaW5nOw0KKyAgIH0NCisNCisgICBzd2l0Y2ggKGVuY29kaW5nKQ0KKyAgIHsNCisgICAgICBjYXNlIEVfRklMRToNCisgICAgICAgICB2YWx1ZSA9IHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0KHZhbHVlKjI1NywgZGlzcGxheS0+Z2FtbWFfdG9fbGluZWFyKTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIEVfc1JHQjoNCisgICAgICAgICB2YWx1ZSA9IHBuZ19zUkdCX3RhYmxlW3ZhbHVlXTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIEVfTElORUFSOg0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgRV9MSU5FQVI4Og0KKyAgICAgICAgIHZhbHVlICo9IDI1NzsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIHBuZ19lcnJvcihkaXNwbGF5LT5pbWFnZS0+b3BhcXVlLT5wbmdfcHRyLA0KKyAgICAgICAgICAgICJ1bmV4cGVjdGVkIGVuY29kaW5nIChpbnRlcm5hbCBlcnJvcikiKTsNCisgICAgICAgICBicmVhazsNCisgICB9DQorDQorICAgcmV0dXJuIHZhbHVlOw0KK30NCisNCitzdGF0aWMgcG5nX3VpbnRfMzINCitwbmdfY29sb3JtYXBfY29tcG9zZShwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5LA0KKyAgIHBuZ191aW50XzMyIGZvcmVncm91bmQsIGludCBmb3JlZ3JvdW5kX2VuY29kaW5nLCBwbmdfdWludF8zMiBhbHBoYSwNCisgICBwbmdfdWludF8zMiBiYWNrZ3JvdW5kLCBpbnQgZW5jb2RpbmcpDQorew0KKyAgIC8qIFRoZSBmaWxlIHZhbHVlIGlzIGNvbXBvc2VkIG9uIHRoZSBiYWNrZ3JvdW5kLCB0aGUgYmFja2dyb3VuZCBoYXMgdGhlIGdpdmVuDQorICAgICogZW5jb2RpbmcgYW5kIHNvIGRvZXMgdGhlIHJlc3VsdCwgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoIEVfRklMRSBhbmQgdGhlDQorICAgICogZmlsZSBhbmQgYWxwaGEgYXJlIDgtYml0IHZhbHVlcy4gIFRoZSAob3V0cHV0KSBlbmNvZGluZyB3aWxsIGFsd2F5cyBiZQ0KKyAgICAqIEVfTElORUFSIG9yIEVfc1JHQi4NCisgICAgKi8NCisgICBwbmdfdWludF8zMiBmID0gZGVjb2RlX2dhbW1hKGRpc3BsYXksIGZvcmVncm91bmQsIGZvcmVncm91bmRfZW5jb2RpbmcpOw0KKyAgIHBuZ191aW50XzMyIGIgPSBkZWNvZGVfZ2FtbWEoZGlzcGxheSwgYmFja2dyb3VuZCwgZW5jb2RpbmcpOw0KKw0KKyAgIC8qIFRoZSBhbHBoYSBpcyBhbHdheXMgYW4gOC1iaXQgdmFsdWUgKGl0IGNvbWVzIGZyb20gdGhlIHBhbGV0dGUpLCB0aGUgdmFsdWUNCisgICAgKiBzY2FsZWQgYnkgMjU1IGlzIHdoYXQgUE5HX3NSR0JfRlJPTV9MSU5FQVIgcmVxdWlyZXMuDQorICAgICovDQorICAgZiA9IGYgKiBhbHBoYSArIGIgKiAoMjU1LWFscGhhKTsNCisNCisgICBpZiAoZW5jb2RpbmcgPT0gRV9MSU5FQVIpDQorICAgew0KKyAgICAgIC8qIFNjYWxlIHRvIDY1NTM1OyBkaXZpZGUgYnkgMjU1LCBhcHByb3hpbWF0ZWx5IChpbiBmYWN0IHRoaXMgaXMgZXh0cmVtZWx5DQorICAgICAgICogYWNjdXJhdGUsIGl0IGRpdmlkZXMgYnkgMjU1LjAwMDAwMDA1OTM3MTgxNDE0NTU2LCB3aXRoIG5vIG92ZXJmbG93LikNCisgICAgICAgKi8NCisgICAgICBmICo9IDI1NzsgLyogTm93IHNjYWxlZCBieSA2NTUzNSAqLw0KKyAgICAgIGYgKz0gZiA+PiAxNjsNCisgICAgICBmID0gKGYrMzI3NjgpID4+IDE2Ow0KKyAgIH0NCisNCisgICBlbHNlIC8qIEVfc1JHQiAqLw0KKyAgICAgIGYgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihmKTsNCisNCisgICByZXR1cm4gZjsNCit9DQorDQorLyogTk9URTogRV9MSU5FQVIgdmFsdWVzIHRvIHRoaXMgcm91dGluZSBtdXN0IGJlIDE2LWJpdCwgYnV0IEVfRklMRSB2YWx1ZXMgbXVzdA0KKyAqIGJlIDgtYml0Lg0KKyAqLw0KK3N0YXRpYyB2b2lkDQorcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5LA0KKyAgIHBuZ191aW50XzMyIGlwLCBwbmdfdWludF8zMiByZWQsIHBuZ191aW50XzMyIGdyZWVuLCBwbmdfdWludF8zMiBibHVlLA0KKyAgIHBuZ191aW50XzMyIGFscGhhLCBpbnQgZW5jb2RpbmcpDQorew0KKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsNCisgICBjb25zdCBpbnQgb3V0cHV0X2VuY29kaW5nID0gKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSA/DQorICAgICAgRV9MSU5FQVIgOiBFX3NSR0I7DQorICAgY29uc3QgaW50IGNvbnZlcnRfdG9fWSA9IChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSA9PSAwICYmDQorICAgICAgKHJlZCAhPSBncmVlbiB8fCBncmVlbiAhPSBibHVlKTsNCisNCisgICBpZiAoaXAgPiAyNTUpDQorICAgICAgcG5nX2Vycm9yKGltYWdlLT5vcGFxdWUtPnBuZ19wdHIsICJjb2xvci1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7DQorDQorICAgLyogVXBkYXRlIHRoZSBjYWNoZSB3aXRoIHdoZXRoZXIgdGhlIGZpbGUgZ2FtbWEgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQNCisgICAgKiBmcm9tIHNSR0IuDQorICAgICovDQorICAgaWYgKGVuY29kaW5nID09IEVfRklMRSkNCisgICB7DQorICAgICAgaWYgKGRpc3BsYXktPmZpbGVfZW5jb2RpbmcgPT0gRV9OT1RTRVQpDQorICAgICAgICAgc2V0X2ZpbGVfZW5jb2RpbmcoZGlzcGxheSk7DQorDQorICAgICAgLyogTm90ZSB0aGF0IHRoZSBjYWNoZWQgdmFsdWUgbWF5IGJlIEVfRklMRSB0b28sIGJ1dCBpZiBpdCBpcyB0aGVuIHRoZQ0KKyAgICAgICAqIGdhbW1hX3RvX2xpbmVhciBtZW1iZXIgaGFzIGJlZW4gc2V0Lg0KKyAgICAgICAqLw0KKyAgICAgIGVuY29kaW5nID0gZGlzcGxheS0+ZmlsZV9lbmNvZGluZzsNCisgICB9DQorDQorICAgaWYgKGVuY29kaW5nID09IEVfRklMRSkNCisgICB7DQorICAgICAgcG5nX2ZpeGVkX3BvaW50IGcgPSBkaXNwbGF5LT5nYW1tYV90b19saW5lYXI7DQorDQorICAgICAgcmVkID0gcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QocmVkKjI1NywgZyk7DQorICAgICAgZ3JlZW4gPSBwbmdfZ2FtbWFfMTZiaXRfY29ycmVjdChncmVlbioyNTcsIGcpOw0KKyAgICAgIGJsdWUgPSBwbmdfZ2FtbWFfMTZiaXRfY29ycmVjdChibHVlKjI1NywgZyk7DQorDQorICAgICAgaWYgKGNvbnZlcnRfdG9fWSB8fCBvdXRwdXRfZW5jb2RpbmcgPT0gRV9MSU5FQVIpDQorICAgICAgew0KKyAgICAgICAgIGFscGhhICo9IDI1NzsNCisgICAgICAgICBlbmNvZGluZyA9IEVfTElORUFSOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIHJlZCA9IFBOR19zUkdCX0ZST01fTElORUFSKHJlZCAqIDI1NSk7DQorICAgICAgICAgZ3JlZW4gPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmVlbiAqIDI1NSk7DQorICAgICAgICAgYmx1ZSA9IFBOR19zUkdCX0ZST01fTElORUFSKGJsdWUgKiAyNTUpOw0KKyAgICAgICAgIGVuY29kaW5nID0gRV9zUkdCOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgZWxzZSBpZiAoZW5jb2RpbmcgPT0gRV9MSU5FQVI4KQ0KKyAgIHsNCisgICAgICAvKiBUaGlzIGVuY29kaW5nIG9jY3VycyBxdWl0ZSBmcmVxdWVudGx5IGluIHRlc3QgY2FzZXMgYmVjYXVzZSBQbmdTdWl0ZQ0KKyAgICAgICAqIGluY2x1ZGVzIGEgZ0FNQSAxLjAgY2h1bmsgd2l0aCBtb3N0IGltYWdlcy4NCisgICAgICAgKi8NCisgICAgICByZWQgKj0gMjU3Ow0KKyAgICAgIGdyZWVuICo9IDI1NzsNCisgICAgICBibHVlICo9IDI1NzsNCisgICAgICBhbHBoYSAqPSAyNTc7DQorICAgICAgZW5jb2RpbmcgPSBFX0xJTkVBUjsNCisgICB9DQorDQorICAgZWxzZSBpZiAoZW5jb2RpbmcgPT0gRV9zUkdCICYmIChjb252ZXJ0X3RvX1kgfHwgb3V0cHV0X2VuY29kaW5nID09IEVfTElORUFSKSkNCisgICB7DQorICAgICAgLyogVGhlIHZhbHVlcyBhcmUgOC1iaXQgc1JHQiB2YWx1ZXMsIGJ1dCBtdXN0IGJlIGNvbnZlcnRlZCB0byAxNi1iaXQNCisgICAgICAgKiBsaW5lYXIuDQorICAgICAgICovDQorICAgICAgcmVkID0gcG5nX3NSR0JfdGFibGVbcmVkXTsNCisgICAgICBncmVlbiA9IHBuZ19zUkdCX3RhYmxlW2dyZWVuXTsNCisgICAgICBibHVlID0gcG5nX3NSR0JfdGFibGVbYmx1ZV07DQorICAgICAgYWxwaGEgKj0gMjU3Ow0KKyAgICAgIGVuY29kaW5nID0gRV9MSU5FQVI7DQorICAgfQ0KKw0KKyAgIC8qIFRoaXMgaXMgc2V0IGlmIHRoZSBjb2xvciBpc24ndCBncmF5IGJ1dCB0aGUgb3V0cHV0IGlzLiAqLw0KKyAgIGlmIChlbmNvZGluZyA9PSBFX0xJTkVBUikNCisgICB7DQorICAgICAgaWYgKGNvbnZlcnRfdG9fWSkNCisgICAgICB7DQorICAgICAgICAgLyogTk9URTogdGhlc2UgdmFsdWVzIGFyZSBjb3BpZWQgZnJvbSBwbmdfZG9fcmdiX3RvX2dyYXkgKi8NCisgICAgICAgICBwbmdfdWludF8zMiB5ID0gKHBuZ191aW50XzMyKTY5NjggKiByZWQgICsgKHBuZ191aW50XzMyKTIzNDM0ICogZ3JlZW4gKw0KKyAgICAgICAgICAgIChwbmdfdWludF8zMikyMzY2ICogYmx1ZTsNCisNCisgICAgICAgICBpZiAob3V0cHV0X2VuY29kaW5nID09IEVfTElORUFSKQ0KKyAgICAgICAgICAgIHkgPSAoeSArIDE2Mzg0KSA+PiAxNTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIHkgaXMgc2NhbGVkIGJ5IDMyNzY4LCB3ZSBuZWVkIGl0IHNjYWxlZCBieSAyNTU6ICovDQorICAgICAgICAgICAgeSA9ICh5ICsgMTI4KSA+PiA4Ow0KKyAgICAgICAgICAgIHkgKj0gMjU1Ow0KKyAgICAgICAgICAgIHkgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUigoeSArIDY0KSA+PiA3KTsNCisgICAgICAgICAgICBlbmNvZGluZyA9IEVfc1JHQjsNCisgICAgICAgICB9DQorDQorICAgICAgICAgYmx1ZSA9IHJlZCA9IGdyZWVuID0geTsNCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAob3V0cHV0X2VuY29kaW5nID09IEVfc1JHQikNCisgICAgICB7DQorICAgICAgICAgcmVkID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIocmVkICogMjU1KTsNCisgICAgICAgICBncmVlbiA9IFBOR19zUkdCX0ZST01fTElORUFSKGdyZWVuICogMjU1KTsNCisgICAgICAgICBibHVlID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoYmx1ZSAqIDI1NSk7DQorICAgICAgICAgYWxwaGEgPSBQTkdfRElWMjU3KGFscGhhKTsNCisgICAgICAgICBlbmNvZGluZyA9IEVfc1JHQjsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIGlmIChlbmNvZGluZyAhPSBvdXRwdXRfZW5jb2RpbmcpDQorICAgICAgcG5nX2Vycm9yKGltYWdlLT5vcGFxdWUtPnBuZ19wdHIsICJiYWQgZW5jb2RpbmcgKGludGVybmFsIGVycm9yKSIpOw0KKw0KKyAgIC8qIFN0b3JlIHRoZSB2YWx1ZS4gKi8NCisgICB7DQorIyAgICAgaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVEDQorICAgICAgICAgY29uc3QgaW50IGFmaXJzdCA9IChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCAmJg0KKyAgICAgICAgICAgIChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSAhPSAwOw0KKyMgICAgIGVsc2UNCisjICAgICAgICBkZWZpbmUgYWZpcnN0IDANCisjICAgICBlbmRpZg0KKyMgICAgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRA0KKyAgICAgICAgIGNvbnN0IGludCBiZ3IgPSAoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19CR1IpID8gMiA6IDA7DQorIyAgICAgZWxzZQ0KKyMgICAgICAgIGRlZmluZSBiZ3IgMA0KKyMgICAgIGVuZGlmDQorDQorICAgICAgaWYgKG91dHB1dF9lbmNvZGluZyA9PSBFX0xJTkVBUikNCisgICAgICB7DQorICAgICAgICAgcG5nX3VpbnRfMTZwIGVudHJ5ID0gcG5nX3ZvaWRjYXN0KHBuZ191aW50XzE2cCwgZGlzcGxheS0+Y29sb3JtYXApOw0KKw0KKyAgICAgICAgIGVudHJ5ICs9IGlwICogUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhpbWFnZS0+Zm9ybWF0KTsNCisNCisgICAgICAgICAvKiBUaGUgbGluZWFyIDE2LWJpdCB2YWx1ZXMgbXVzdCBiZSBwcmUtbXVsdGlwbGllZCBieSB0aGUgYWxwaGEgY2hhbm5lbA0KKyAgICAgICAgICAqIHZhbHVlLCBpZiBsZXNzIHRoYW4gNjU1MzUgKHRoaXMgaXMsIGVmZmVjdGl2ZWx5LCBjb21wb3NpdGUgb24gYmxhY2sNCisgICAgICAgICAgKiBpZiB0aGUgYWxwaGEgY2hhbm5lbCBpcyByZW1vdmVkLikNCisgICAgICAgICAgKi8NCisgICAgICAgICBzd2l0Y2ggKFBOR19JTUFHRV9TQU1QTEVfQ0hBTk5FTFMoaW1hZ2UtPmZvcm1hdCkpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgPyAwIDogM10gPSAocG5nX3VpbnRfMTYpYWxwaGE7DQorICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovDQorDQorICAgICAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICAgICAgIGlmIChhbHBoYSA8IDY1NTM1KQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPiAwKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBibHVlID0gKGJsdWUgKiBhbHBoYSArIDMyNzY3VSkvNjU1MzVVOw0KKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKGdyZWVuICogYWxwaGEgKyAzMjc2N1UpLzY1NTM1VTsNCisgICAgICAgICAgICAgICAgICAgICByZWQgPSAocmVkICogYWxwaGEgKyAzMjc2N1UpLzY1NTM1VTsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIHJlZCA9IGdyZWVuID0gYmx1ZSA9IDA7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIGVudHJ5W2FmaXJzdCArICgyIF4gYmdyKV0gPSAocG5nX3VpbnRfMTYpYmx1ZTsNCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyAxXSA9IChwbmdfdWludF8xNilncmVlbjsNCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyBiZ3JdID0gKHBuZ191aW50XzE2KXJlZDsNCisgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgZW50cnlbMSBeIGFmaXJzdF0gPSAocG5nX3VpbnRfMTYpYWxwaGE7DQorICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovDQorDQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgIGlmIChhbHBoYSA8IDY1NTM1KQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPiAwKQ0KKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKGdyZWVuICogYWxwaGEgKyAzMjc2N1UpLzY1NTM1VTsNCisNCisgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAwOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3RdID0gKHBuZ191aW50XzE2KWdyZWVuOw0KKyAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIC8qIG91dHB1dCBlbmNvZGluZyBpcyBFX3NSR0IgKi8NCisgICAgICB7DQorICAgICAgICAgcG5nX2J5dGVwIGVudHJ5ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgZGlzcGxheS0+Y29sb3JtYXApOw0KKw0KKyAgICAgICAgIGVudHJ5ICs9IGlwICogUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhpbWFnZS0+Zm9ybWF0KTsNCisNCisgICAgICAgICBzd2l0Y2ggKFBOR19JTUFHRV9TQU1QTEVfQ0hBTk5FTFMoaW1hZ2UtPmZvcm1hdCkpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgPyAwIDogM10gPSAocG5nX2J5dGUpYWxwaGE7DQorICAgICAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICAgICAgIGVudHJ5W2FmaXJzdCArICgyIF4gYmdyKV0gPSAocG5nX2J5dGUpYmx1ZTsNCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyAxXSA9IChwbmdfYnl0ZSlncmVlbjsNCisgICAgICAgICAgICAgICBlbnRyeVthZmlyc3QgKyBiZ3JdID0gKHBuZ19ieXRlKXJlZDsNCisgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgZW50cnlbMSBeIGFmaXJzdF0gPSAocG5nX2J5dGUpYWxwaGE7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgIGVudHJ5W2FmaXJzdF0gPSAocG5nX2J5dGUpZ3JlZW47DQorICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyMgICAgIGlmZGVmIGFmaXJzdA0KKyMgICAgICAgIHVuZGVmIGFmaXJzdA0KKyMgICAgIGVuZGlmDQorIyAgICAgaWZkZWYgYmdyDQorIyAgICAgICAgdW5kZWYgYmdyDQorIyAgICAgZW5kaWYNCisgICB9DQorfQ0KKw0KK3N0YXRpYyBpbnQNCittYWtlX2dyYXlfZmlsZV9jb2xvcm1hcChwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5KQ0KK3sNCisgICB1bnNpZ25lZCBpbnQgaTsNCisNCisgICBmb3IgKGk9MDsgaTwyNTY7ICsraSkNCisgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGksIGksIGksIGksIDI1NSwgRV9GSUxFKTsNCisNCisgICByZXR1cm4gaTsNCit9DQorDQorc3RhdGljIGludA0KK21ha2VfZ3JheV9jb2xvcm1hcChwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5KQ0KK3sNCisgICB1bnNpZ25lZCBpbnQgaTsNCisNCisgICBmb3IgKGk9MDsgaTwyNTY7ICsraSkNCisgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGksIGksIGksIGksIDI1NSwgRV9zUkdCKTsNCisNCisgICByZXR1cm4gaTsNCit9DQorI2RlZmluZSBQTkdfR1JBWV9DT0xPUk1BUF9FTlRSSUVTIDI1Ng0KKw0KK3N0YXRpYyBpbnQNCittYWtlX2dhX2NvbG9ybWFwKHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkpDQorew0KKyAgIHVuc2lnbmVkIGludCBpLCBhOw0KKw0KKyAgIC8qIEFscGhhIGlzIHJldGFpbmVkLCB0aGUgb3V0cHV0IHdpbGwgYmUgYSBjb2xvci1tYXAgd2l0aCBlbnRyaWVzDQorICAgICogc2VsZWN0ZWQgYnkgc2l4IGxldmVscyBvZiBhbHBoYS4gIE9uZSB0cmFuc3BhcmVudCBlbnRyeSwgNiBncmF5DQorICAgICogbGV2ZWxzIGZvciBhbGwgdGhlIGludGVybWVkaWF0ZSBhbHBoYSB2YWx1ZXMsIGxlYXZpbmcgMjMwIGVudHJpZXMNCisgICAgKiBmb3IgdGhlIG9wYXF1ZSBncmF5cy4gIFRoZSBjb2xvci1tYXAgZW50cmllcyBhcmUgdGhlIHNpeCB2YWx1ZXMNCisgICAgKiBbMC4uNV0qNTEsIHRoZSBHQSBwcm9jZXNzaW5nIHVzZXMgUE5HX0RJVjUxKHZhbHVlKSB0byBmaW5kIHRoZQ0KKyAgICAqIHJlbGV2YW50IGVudHJ5Lg0KKyAgICAqDQorICAgICogaWYgKGFscGhhID4gMjI5KSAvLyBvcGFxdWUNCisgICAgKiB7DQorICAgICogICAgLy8gVGhlIDIzMSBlbnRyaWVzIGFyZSBzZWxlY3RlZCB0byBtYWtlIHRoZSBtYXRoIGJlbG93IHdvcms6DQorICAgICogICAgYmFzZSA9IDA7DQorICAgICogICAgZW50cnkgPSAoMjMxICogZ3JheSArIDEyOCkgPj4gODsNCisgICAgKiB9DQorICAgICogZWxzZSBpZiAoYWxwaGEgPCAyNikgLy8gdHJhbnNwYXJlbnQNCisgICAgKiB7DQorICAgICogICAgYmFzZSA9IDIzMTsNCisgICAgKiAgICBlbnRyeSA9IDA7DQorICAgICogfQ0KKyAgICAqIGVsc2UgLy8gcGFydGlhbGx5IG9wYXF1ZQ0KKyAgICAqIHsNCisgICAgKiAgICBiYXNlID0gMjI2ICsgNiAqIFBOR19ESVY1MShhbHBoYSk7DQorICAgICogICAgZW50cnkgPSBQTkdfRElWNTEoZ3JheSk7DQorICAgICogfQ0KKyAgICAqLw0KKyAgIGkgPSAwOw0KKyAgIHdoaWxlIChpIDwgMjMxKQ0KKyAgIHsNCisgICAgICB1bnNpZ25lZCBpbnQgZ3JheSA9IChpICogMjU2ICsgMTE1KSAvIDIzMTsNCisgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGkrKywgZ3JheSwgZ3JheSwgZ3JheSwgMjU1LCBFX3NSR0IpOw0KKyAgIH0NCisNCisgICAvKiAyNTUgaXMgdXNlZCBoZXJlIGZvciB0aGUgY29tcG9uZW50IHZhbHVlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgY29kZQ0KKyAgICAqIHRoYXQgdW5kb2VzIHByZW11bHRpcGxpY2F0aW9uIGluIHBuZ3dyaXRlLmMuDQorICAgICovDQorICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpKyssIDI1NSwgMjU1LCAyNTUsIDAsIEVfc1JHQik7DQorDQorICAgZm9yIChhPTE7IGE8NTsgKythKQ0KKyAgIHsNCisgICAgICB1bnNpZ25lZCBpbnQgZzsNCisNCisgICAgICBmb3IgKGc9MDsgZzw2OyArK2cpDQorICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpKyssIGcqNTEsIGcqNTEsIGcqNTEsIGEqNTEsDQorICAgICAgICAgICAgRV9zUkdCKTsNCisgICB9DQorDQorICAgcmV0dXJuIGk7DQorfQ0KKw0KKyNkZWZpbmUgUE5HX0dBX0NPTE9STUFQX0VOVFJJRVMgMjU2DQorDQorc3RhdGljIGludA0KK21ha2VfcmdiX2NvbG9ybWFwKHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkpDQorew0KKyAgIHVuc2lnbmVkIGludCBpLCByOw0KKw0KKyAgIC8qIEJ1aWxkIGEgNng2eDYgb3BhcXVlIFJHQiBjdWJlICovDQorICAgZm9yIChpPXI9MDsgcjw2OyArK3IpDQorICAgew0KKyAgICAgIHVuc2lnbmVkIGludCBnOw0KKw0KKyAgICAgIGZvciAoZz0wOyBnPDY7ICsrZykNCisgICAgICB7DQorICAgICAgICAgdW5zaWduZWQgaW50IGI7DQorDQorICAgICAgICAgZm9yIChiPTA7IGI8NjsgKytiKQ0KKyAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSsrLCByKjUxLCBnKjUxLCBiKjUxLCAyNTUsDQorICAgICAgICAgICAgICAgRV9zUkdCKTsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIHJldHVybiBpOw0KK30NCisNCisjZGVmaW5lIFBOR19SR0JfQ09MT1JNQVBfRU5UUklFUyAyMTYNCisNCisvKiBSZXR1cm4gYSBwYWxldHRlIGluZGV4IHRvIHRoZSBhYm92ZSBwYWxldHRlIGdpdmVuIHRocmVlIDgtYml0IHNSR0IgdmFsdWVzLiAqLw0KKyNkZWZpbmUgUE5HX1JHQl9JTkRFWChyLGcsYikgXA0KKyAgICgocG5nX2J5dGUpKDYgKiAoNiAqIFBOR19ESVY1MShyKSArIFBOR19ESVY1MShnKSkgKyBQTkdfRElWNTEoYikpKQ0KKw0KK3N0YXRpYyBpbnQNCitwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcChwbmdfdm9pZHAgYXJndW1lbnQpDQorew0KKyAgIHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkgPQ0KKyAgICAgIHBuZ192b2lkY2FzdChwbmdfaW1hZ2VfcmVhZF9jb250cm9sKiwgYXJndW1lbnQpOw0KKyAgIGNvbnN0IHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsNCisNCisgICBjb25zdCBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7DQorICAgY29uc3QgcG5nX3VpbnRfMzIgb3V0cHV0X2Zvcm1hdCA9IGltYWdlLT5mb3JtYXQ7DQorICAgY29uc3QgaW50IG91dHB1dF9lbmNvZGluZyA9IChvdXRwdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikgPw0KKyAgICAgIEVfTElORUFSIDogRV9zUkdCOw0KKw0KKyAgIHVuc2lnbmVkIGludCBjbWFwX2VudHJpZXM7DQorICAgdW5zaWduZWQgaW50IG91dHB1dF9wcm9jZXNzaW5nOyAgICAgICAgLyogT3V0cHV0IHByb2Nlc3Npbmcgb3B0aW9uICovDQorICAgdW5zaWduZWQgaW50IGRhdGFfZW5jb2RpbmcgPSBFX05PVFNFVDsgLyogRW5jb2RpbmcgbGlicG5nIG11c3QgcHJvZHVjZSAqLw0KKw0KKyAgIC8qIEJhY2tncm91bmQgaW5mb3JtYXRpb247IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFuZCB0aGUgaW5kZXggb2YgdGhpcyBjb2xvcg0KKyAgICAqIGluIHRoZSBjb2xvci1tYXAgaWYgaXQgZXhpc3RzIChlbHNlIDI1NikuDQorICAgICovDQorICAgdW5zaWduZWQgaW50IGJhY2tncm91bmRfaW5kZXggPSAyNTY7DQorICAgcG5nX3VpbnRfMzIgYmFja19yLCBiYWNrX2csIGJhY2tfYjsNCisNCisgICAvKiBGbGFncyB0byBhY2N1bXVsYXRlIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgZG9uZSB0byB0aGUgaW5wdXQuICovDQorICAgaW50IGV4cGFuZF90Uk5TID0gMDsNCisNCisgICAvKiBFeGNsdWRlIHRoZSBOWUkgZmVhdHVyZSBvZiBjb21wb3NpdGluZyBvbnRvIGEgY29sb3ItbWFwcGVkIGJ1ZmZlcjsgaXQgaXMNCisgICAgKiB2ZXJ5IGRpZmZpY3VsdCB0byBkbywgdGhlIHJlc3VsdHMgbG9vayBhd2Z1bCwgYW5kIGl0IGlzIGRpZmZpY3VsdCB0byBzZWUNCisgICAgKiB3aGF0IHBvc3NpYmxlIHVzZSBpdCBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBjYW4ndCBjb250cm9sIHRoZQ0KKyAgICAqIGNvbG9yLW1hcC4NCisgICAgKi8NCisgICBpZiAoKChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDAgfHwNCisgICAgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPiAwKSAvKiBhbHBoYSBpbiBpbnB1dCAqLyAmJg0KKyAgICAgICgob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMCkgLyogbm8gYWxwaGEgaW4gb3V0cHV0ICovKQ0KKyAgIHsNCisgICAgICBpZiAob3V0cHV0X2VuY29kaW5nID09IEVfTElORUFSKSAvKiBjb21wb3NlIG9uIGJsYWNrICovDQorICAgICAgICAgYmFja19iID0gYmFja19nID0gYmFja19yID0gMDsNCisNCisgICAgICBlbHNlIGlmIChkaXNwbGF5LT5iYWNrZ3JvdW5kID09IE5VTEwgLyogbm8gd2F5IHRvIHJlbW92ZSBpdCAqLykNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwNCisgICAgICAgICAgICAiYSBiYWNrZ3JvdW5kIGNvbG9yIG11c3QgYmUgc3VwcGxpZWQgdG8gcmVtb3ZlIGFscGhhL3RyYW5zcGFyZW5jeSIpOw0KKw0KKyAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIGJhY2tncm91bmQgY29sb3IgKHRoaXMgYXZvaWRzIHJlcGVhdGluZyB0aGUgY2hlY2tzDQorICAgICAgICogYmVsb3cuKSAgVGhlIGVuY29kaW5nIGlzIDgtYml0IHNSR0Igb3IgMTYtYml0IGxpbmVhciwgZGVwZW5kaW5nIG9uIHRoZQ0KKyAgICAgICAqIG91dHB1dCBmb3JtYXQuDQorICAgICAgICovDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBiYWNrX2cgPSBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5ncmVlbjsNCisgICAgICAgICBpZiAob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikNCisgICAgICAgICB7DQorICAgICAgICAgICAgYmFja19yID0gZGlzcGxheS0+YmFja2dyb3VuZC0+cmVkOw0KKyAgICAgICAgICAgIGJhY2tfYiA9IGRpc3BsYXktPmJhY2tncm91bmQtPmJsdWU7DQorICAgICAgICAgfQ0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBiYWNrX2IgPSBiYWNrX3IgPSBiYWNrX2c7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBlbHNlIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gRV9MSU5FQVIpDQorICAgICAgYmFja19iID0gYmFja19yID0gYmFja19nID0gNjU1MzU7DQorDQorICAgZWxzZQ0KKyAgICAgIGJhY2tfYiA9IGJhY2tfciA9IGJhY2tfZyA9IDI1NTsNCisNCisgICAvKiBEZWZhdWx0IHRoZSBpbnB1dCBmaWxlIGdhbW1hIGlmIHJlcXVpcmVkIC0gdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQ0KKyAgICAqIGxpYnBuZyBhc3N1bWVzIHRoYXQgaWYgbm8gZ2FtbWEgaW5mb3JtYXRpb24gaXMgcHJlc2VudCB0aGUgZGF0YSBpcyBpbiB0aGUNCisgICAgKiBvdXRwdXQgZm9ybWF0LCBidXQgdGhlIHNpbXBsaWZpZWQgQVBJIGRlZHVjZXMgdGhlIGdhbW1hIGZyb20gdGhlIGlucHV0DQorICAgICogZm9ybWF0Lg0KKyAgICAqLw0KKyAgIGlmICgocG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEpID09IDApDQorICAgew0KKyAgICAgIC8qIERvIHRoaXMgZGlyZWN0bHksIG5vdCB1c2luZyB0aGUgcG5nX2NvbG9yc3BhY2UgZnVuY3Rpb25zLCB0byBlbnN1cmUNCisgICAgICAgKiB0aGF0IGl0IGhhcHBlbnMgZXZlbiBpZiB0aGUgY29sb3JzcGFjZSBpcyBpbnZhbGlkICh0aG91Z2ggcHJvYmFibHkgaWYNCisgICAgICAgKiBpdCBpcyB0aGUgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQpICBOb3RlIHRoYXQgdGhlIHNhbWUgdGhpbmcgY2FuIGJlDQorICAgICAgICogYWNoaWV2ZWQgYXQgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSB3aXRoIHBuZ19zZXRfZ0FNQS4NCisgICAgICAgKi8NCisgICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDE2ICYmDQorICAgICAgICAgKGltYWdlLT5mbGFncyAmIFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0IpID09IDApDQorICAgICAgICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9IFBOR19HQU1NQV9MSU5FQVI7DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEgPSBQTkdfR0FNTUFfc1JHQl9JTlZFUlNFOw0KKw0KKyAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQTsNCisgICB9DQorDQorICAgLyogRGVjaWRlIHdoYXQgdG8gZG8gYmFzZWQgb24gdGhlIFBORyBjb2xvciB0eXBlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVGhlDQorICAgICogdXRpbGl0eSBmdW5jdGlvbiBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5IGRlYWxzIHdpdGggbW9zdCBhc3BlY3RzIG9mIHRoZQ0KKyAgICAqIG91dHB1dCB0cmFuc2Zvcm1hdGlvbnM7IHRoaXMgY29kZSB3b3JrcyBvdXQgaG93IHRvIHByb2R1Y2UgYnl0ZXMgb2YNCisgICAgKiBjb2xvci1tYXAgZW50cmllcyBmcm9tIHRoZSBvcmlnaW5hbCBmb3JtYXQuDQorICAgICovDQorICAgc3dpdGNoIChwbmdfcHRyLT5jb2xvcl90eXBlKQ0KKyAgIHsNCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6DQorICAgICAgICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8PSA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGVyZSBhdCBtb3N0IDI1NiBjb2xvcnMgaW4gdGhlIG91dHB1dCwgcmVnYXJkbGVzcyBvZg0KKyAgICAgICAgICAgICAqIHRyYW5zcGFyZW5jeS4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RlcCwgaSwgdmFsLCB0cmFucyA9IDI1Ni8qaWdub3JlKi8sIGJhY2tfYWxwaGEgPSAwOw0KKw0KKyAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IDFVIDw8IHBuZ19wdHItPmJpdF9kZXB0aDsNCisgICAgICAgICAgICBpZiAoY21hcF9lbnRyaWVzID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpDQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJncmF5WzhdIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7DQorDQorICAgICAgICAgICAgc3RlcCA9IDI1NSAvIChjbWFwX2VudHJpZXMgLSAxKTsNCisgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7DQorDQorICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSB0Uk5TIGNodW5rIHRoZW4gdGhpcyBlaXRoZXIgc2VsZWN0cyBhIHRyYW5zcGFyZW50DQorICAgICAgICAgICAgICogdmFsdWUgb3IsIGlmIHRoZSBvdXRwdXQgaGFzIG5vIGFscGhhLCB0aGUgYmFja2dyb3VuZCBjb2xvci4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgdHJhbnMgPSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5Ow0KKw0KKyAgICAgICAgICAgICAgIGlmICgob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMCkNCisgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhID0gb3V0cHV0X2VuY29kaW5nID09IEVfTElORUFSID8gNjU1MzUgOiAyNTU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8qIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkganVzdCB0YWtlcyBhbiBSR0JBIGFuZCB3cml0ZXMgdGhlDQorICAgICAgICAgICAgICogY29ycmVzcG9uZGluZyBjb2xvci1tYXAgZW50cnkgdXNpbmcgdGhlIGZvcm1hdCBmcm9tICdpbWFnZScsDQorICAgICAgICAgICAgICogaW5jbHVkaW5nIHRoZSByZXF1aXJlZCBjb252ZXJzaW9uIHRvIHNSR0Igb3IgbGluZWFyIGFzDQorICAgICAgICAgICAgICogYXBwcm9wcmlhdGUuICBUaGUgaW5wdXQgdmFsdWVzIGFyZSBhbHdheXMgZWl0aGVyIHNSR0IgKGlmIHRoZQ0KKyAgICAgICAgICAgICAqIGdhbW1hIGNvcnJlY3Rpb24gZmxhZyBpcyAwKSBvciAwLi4yNTUgc2NhbGVkIGZpbGUgZW5jb2RlZCB2YWx1ZXMNCisgICAgICAgICAgICAgKiAoaWYgdGhlIGZ1bmN0aW9uIG11c3QgZ2FtbWEgY29ycmVjdCB0aGVtKS4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBmb3IgKGk9dmFsPTA7IGk8Y21hcF9lbnRyaWVzOyArK2ksIHZhbCArPSBzdGVwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAvKiAnaScgaXMgYSBmaWxlIHZhbHVlLiAgV2hpbGUgdGhpcyB3aWxsIHJlc3VsdCBpbiBkdXBsaWNhdGVkDQorICAgICAgICAgICAgICAgICogZW50cmllcyBmb3IgOC1iaXQgbm9uLXNSR0IgZW5jb2RlZCBmaWxlcyBpdCBpcyBuZWNlc3NhcnkgdG8NCisgICAgICAgICAgICAgICAgKiBoYXZlIG5vbi1nYW1tYSBjb3JyZWN0ZWQgdmFsdWVzIHRvIGRvIHRSTlMgaGFuZGxpbmcuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgaWYgKGkgIT0gdHJhbnMpDQorICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpLCB2YWwsIHZhbCwgdmFsLCAyNTUsDQorICAgICAgICAgICAgICAgICAgICAgRV9GSUxFLyo4LWJpdCB3aXRoIGZpbGUgZ2FtbWEqLyk7DQorDQorICAgICAgICAgICAgICAgLyogRWxzZSB0aGlzIGVudHJ5IGlzIHRyYW5zcGFyZW50LiAgVGhlIGNvbG9ycyBkb24ndCBtYXR0ZXIgaWYNCisgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBhbiBhbHBoYSBjaGFubmVsIChiYWNrX2FscGhhID09IDApLCBidXQgaXQgZG9lcyBubw0KKyAgICAgICAgICAgICAgICAqIGhhcm0gdG8gcGFzcyB0aGVtIGluOyB0aGUgdmFsdWVzIGFyZSBub3Qgc2V0IGFib3ZlIHNvIHRoaXMNCisgICAgICAgICAgICAgICAgKiBwYXNzZXMgaW4gd2hpdGUuDQorICAgICAgICAgICAgICAgICoNCisgICAgICAgICAgICAgICAgKiBOT1RFOiB0aGlzIHByZXNlcnZlcyB0aGUgZnVsbCBwcmVjaXNpb24gb2YgdGhlIGFwcGxpY2F0aW9uDQorICAgICAgICAgICAgICAgICogc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvciB3aGVuIGl0IGlzIHVzZWQuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSwgYmFja19yLCBiYWNrX2csIGJhY2tfYiwNCisgICAgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhLCBvdXRwdXRfZW5jb2RpbmcpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvKiBXZSBuZWVkIGxpYnBuZyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcuICovDQorICAgICAgICAgICAgZGF0YV9lbmNvZGluZyA9IEVfRklMRTsNCisNCisgICAgICAgICAgICAvKiBUaGUgcm93cyBmcm9tIGxpYnBuZywgd2hpbGUgdGVjaG5pY2FsbHkgZ3JheSB2YWx1ZXMsIGFyZSBub3cgYWxzbw0KKyAgICAgICAgICAgICAqIGNvbG9yLW1hcCBpbmRpY2llczsgaG93ZXZlciwgdGhleSBtYXkgbmVlZCB0byBiZSBleHBhbmRlZCB0byAxDQorICAgICAgICAgICAgICogYnl0ZSBwZXIgcGl4ZWwuICBUaGlzIGlzIHdoYXQgcG5nX3NldF9wYWNraW5nIGRvZXMgKGkuZS4sIGl0DQorICAgICAgICAgICAgICogdW5wYWNrcyB0aGUgYml0IHZhbHVlcyBpbnRvIGJ5dGVzLikNCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkNCisgICAgICAgICAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UgLyogYml0IGRlcHRoIGlzIDE2ICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoZSAxNi1iaXQgaW5wdXQgdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgZGlyZWN0bHkgdG8gOC1iaXQgZ2FtbWENCisgICAgICAgICAgICAgKiBlbmNvZGVkIHZhbHVlczsgaG93ZXZlciwgaWYgYSB0Uk5TIGNodW5rIGlzIHByZXNlbnQgMjU3IGNvbG9yLW1hcA0KKyAgICAgICAgICAgICAqIGVudHJpZXMgYXJlIHJlcXVpcmVkLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBleHRyYSBlbnRyeSByZXF1aXJlcw0KKyAgICAgICAgICAgICAqIHNwZWNpYWwgcHJvY2Vzc2luZzsgYWRkIGFuIGFscGhhIGNoYW5uZWwsIHNhY3JpZmljZSBncmF5IGxldmVsDQorICAgICAgICAgICAgICogMjU0IGFuZCBjb252ZXJ0IHRyYW5zcGFyZW50IChhbHBoYT09MCkgZW50cmllcyB0byB0aGF0Lg0KKyAgICAgICAgICAgICAqDQorICAgICAgICAgICAgICogVXNlIGxpYnBuZyB0byBjaG9wIHRoZSBkYXRhIHRvIDggYml0cy4gIENvbnZlcnQgaXQgdG8gc1JHQiBhdCB0aGUNCisgICAgICAgICAgICAgKiBzYW1lIHRpbWUgdG8gbWluaW1pemUgcXVhbGl0eSBsb3NzLiAgSWYgYSB0Uk5TIGNodW5rIGlzIHByZXNlbnQNCisgICAgICAgICAgICAgKiB0aGlzIG1lYW5zIGxpYnBuZyBtdXN0IGhhbmRsZSBpdCB0b287IG90aGVyd2lzZSBpdCBpcyBpbXBvc3NpYmxlDQorICAgICAgICAgICAgICogdG8gZG8gdGhlIGV4YWN0IG1hdGNoIG9uIHRoZSAxNi1iaXQgdmFsdWUuDQorICAgICAgICAgICAgICoNCisgICAgICAgICAgICAgKiBJZiB0aGUgb3V0cHV0IGhhcyBubyBhbHBoYSBjaGFubmVsICphbmQqIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGlzDQorICAgICAgICAgICAgICogZ3JheSB0aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGxldCBsaWJwbmcgaGFuZGxlIHRoZSBzdWJzdGl0dXRpb24gYnkNCisgICAgICAgICAgICAgKiBlbnN1cmluZyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGdyYXkgbGV2ZWwgbWF0Y2hlcyB0aGUgYmFja2dyb3VuZA0KKyAgICAgICAgICAgICAqIGNvbG9yIGV4YWN0bHkuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgZGF0YV9lbmNvZGluZyA9IEVfc1JHQjsNCisNCisgICAgICAgICAgICBpZiAoUE5HX0dSQVlfQ09MT1JNQVBfRU5UUklFUyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQ0KKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiZ3JheVsxNl0gY29sb3ItbWFwOiB0b28gZmV3IGVudHJpZXMiKTsNCisNCisgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBtYWtlX2dyYXlfY29sb3JtYXAoZGlzcGxheSk7DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucyA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYWNrX2FscGhhOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQ0KKyAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgPSAwOw0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaWYgKGJhY2tfciA9PSBiYWNrX2cgJiYgYmFja19nID09IGJhY2tfYikNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBncmF5OyBubyBzcGVjaWFsIHByb2Nlc3Npbmcgd2lsbCBiZQ0KKyAgICAgICAgICAgICAgICAgICAgICAqIHJlcXVpcmVkLg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGdyYXkgPSBiYWNrX2c7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dF9lbmNvZGluZyA9PSBFX0xJTkVBUikNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JheSA9IFBOR19zUkdCX0ZST01fTElORUFSKGdyYXkgKiAyNTUpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBtYWtlIHN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGFsZXR0ZSBlbnRyeQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG1hdGNoZXMuDQorICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBncmF5LCBiYWNrX2csIGJhY2tfZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2csIDY1NTM1LCBFX0xJTkVBUik7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBiYWNrZ3JvdW5kIHBhc3NlZCB0byBsaWJwbmcsIGhvd2V2ZXIsIG11c3QgYmUgdGhlDQorICAgICAgICAgICAgICAgICAgICAgICogc1JHQiB2YWx1ZS4NCisgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICBjLmluZGV4ID0gMDsgLyp1bnVzZWQqLw0KKyAgICAgICAgICAgICAgICAgICAgIGMuZ3JheSA9IGMucmVkID0gYy5ncmVlbiA9IGMuYmx1ZSA9IChwbmdfdWludF8xNilncmF5Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IGRvZXMgdGhpcyB3b3JrIHdpdGhvdXQgZXhwYW5kaW5nIHRSTlMgdG8gYWxwaGE/DQorICAgICAgICAgICAgICAgICAgICAgICogSXQgc2hvdWxkIGJlIHRoZSBjb2xvci0+Z3JheSBjYXNlIGJlbG93IGFwcGFyZW50bHkNCisgICAgICAgICAgICAgICAgICAgICAgKiBkb2Vzbid0Lg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfcHRyLCAmYywNCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKm5lZWRfZXhwYW5kKi8sDQorICAgICAgICAgICAgICAgICAgICAgICAgMC8qZ2FtbWE6IG5vdCB1c2VkKi8pOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfTk9ORTsNCisgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgYmFja19hbHBoYSA9IG91dHB1dF9lbmNvZGluZyA9PSBFX0xJTkVBUiA/IDY1NTM1IDogMjU1Ow0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAvKiBvdXRwdXRfcHJvY2Vzc2luZyBtZWFucyB0aGF0IHRoZSBsaWJwbmctcHJvY2Vzc2VkIHJvdyB3aWxsIGJlDQorICAgICAgICAgICAgICAgICogOC1iaXQgR0EgYW5kIGl0IGhhcyB0byBiZSBwcm9jZXNzaW5nIHRvIHNpbmdsZSBieXRlIGNvbG9yLW1hcA0KKyAgICAgICAgICAgICAgICAqIHZhbHVlcy4gIEVudHJ5IDI1NCBpcyByZXBsYWNlZCBieSBlaXRoZXIgYSBjb21wbGV0ZWx5DQorICAgICAgICAgICAgICAgICogdHJhbnNwYXJlbnQgZW50cnkgb3IgYnkgdGhlIGJhY2tncm91bmQgY29sb3IgYXQgZnVsbA0KKyAgICAgICAgICAgICAgICAqIHByZWNpc2lvbiAoYW5kIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGlzIG5vdCBhIHNpbXBsZSBncmF5IGxldmUNCisgICAgICAgICAgICAgICAgKiBpbiB0aGlzIGNhc2UuKQ0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGV4cGFuZF90Uk5TID0gMTsNCisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX1RSQU5TOw0KKyAgICAgICAgICAgICAgIGJhY2tncm91bmRfaW5kZXggPSAyNTQ7DQorDQorICAgICAgICAgICAgICAgLyogQW5kIHNldCAob3ZlcndyaXRlKSBjb2xvci1tYXAgZW50cnkgMjU0IHRvIHRoZSBhY3R1YWwNCisgICAgICAgICAgICAgICAgKiBiYWNrZ3JvdW5kIGNvbG9yIGF0IGZ1bGwgcHJlY2lzaW9uLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgMjU0LCBiYWNrX3IsIGJhY2tfZywgYmFja19iLA0KKyAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEsIG91dHB1dF9lbmNvZGluZyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7DQorICAgICAgICAgfQ0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQToNCisgICAgICAgICAvKiA4LWJpdCBvciAxNi1iaXQgUE5HIHdpdGggdHdvIGNoYW5uZWxzIC0gZ3JheSBhbmQgYWxwaGEuICBBIG1pbmltdW0NCisgICAgICAgICAgKiBvZiA2NTUzNiBjb21iaW5hdGlvbnMuICBJZiwgaG93ZXZlciwgdGhlIGFscGhhIGNoYW5uZWwgaXMgdG8gYmUNCisgICAgICAgICAgKiByZW1vdmVkIHRoZXJlIGFyZSBvbmx5IDI1NiBwb3NzaWJpbGl0aWVzIGlmIHRoZSBiYWNrZ3JvdW5kIGlzIGdyYXkuDQorICAgICAgICAgICogKE90aGVyd2lzZSB0aGVyZSBpcyBhIHN1YnNldCBvZiB0aGUgNjU1MzYgcG9zc2liaWxpdGllcyBkZWZpbmVkIGJ5DQorICAgICAgICAgICogdGhlIHRyaWFuZ2xlIGJldHdlZW4gYmxhY2ssIHdoaXRlIGFuZCB0aGUgYmFja2dyb3VuZCBjb2xvci4pDQorICAgICAgICAgICoNCisgICAgICAgICAgKiBSZWR1Y2UgMTYtYml0IGZpbGVzIHRvIDgtYml0IGFuZCBzUkdCIGVuY29kZSB0aGUgcmVzdWx0LiAgTm8gbmVlZCB0bw0KKyAgICAgICAgICAqIHdvcnJ5IGFib3V0IHRSTlMgbWF0Y2hpbmcgLSB0Uk5TIGlzIGlnbm9yZWQgaWYgdGhlcmUgaXMgYW4gYWxwaGENCisgICAgICAgICAgKiBjaGFubmVsLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBFX3NSR0I7DQorDQorICAgICAgICAgaWYgKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChQTkdfR0FfQ09MT1JNQVBfRU5UUklFUyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQ0KKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiZ3JheSthbHBoYSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOw0KKw0KKyAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IG1ha2VfZ2FfY29sb3JtYXAoZGlzcGxheSk7DQorDQorICAgICAgICAgICAgYmFja2dyb3VuZF9pbmRleCA9IFBOR19DTUFQX0dBX0JBQ0tHUk9VTkQ7DQorICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9HQTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZSAvKiBhbHBoYSBpcyByZW1vdmVkICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIEFscGhhIG11c3QgYmUgcmVtb3ZlZCBhcyB0aGUgUE5HIGRhdGEgaXMgcHJvY2Vzc2VkIHdoZW4gdGhlDQorICAgICAgICAgICAgICogYmFja2dyb3VuZCBpcyBhIGNvbG9yIGJlY2F1c2UgdGhlIEcgYW5kIEEgY2hhbm5lbHMgYXJlDQorICAgICAgICAgICAgICogaW5kZXBlbmRlbnQgYW5kIHRoZSB2ZWN0b3IgYWRkaXRpb24gKG5vbi1wYXJhbGxlbCB2ZWN0b3JzKSBpcyBhDQorICAgICAgICAgICAgICogMi1EIHByb2JsZW0uDQorICAgICAgICAgICAgICoNCisgICAgICAgICAgICAgKiBUaGlzIGNhbiBiZSByZWR1Y2VkIHRvIHRoZSBzYW1lIGFsZ29yaXRobSBhcyBhYm92ZSBieSBtYWtpbmcgYQ0KKyAgICAgICAgICAgICAqIGNvbG9ybWFwIGNvbnRhaW5pbmcgZ3JheSBsZXZlbHMgKGZvciB0aGUgb3BhcXVlIGdyYXlzKSwgYQ0KKyAgICAgICAgICAgICAqIGJhY2tncm91bmQgZW50cnkgKGZvciBhIHRyYW5zcGFyZW50IHBpeGVsKSBhbmQgYSBzZXQgb2YgZm91ciBzaXgNCisgICAgICAgICAgICAgKiBsZXZlbCBjb2xvciB2YWx1ZXMsIG9uZSBzZXQgZm9yIGVhY2ggaW50ZXJtZWRpYXRlIGFscGhhIHZhbHVlLg0KKyAgICAgICAgICAgICAqIFNlZSB0aGUgY29tbWVudHMgaW4gbWFrZV9nYV9jb2xvcm1hcCBmb3IgaG93IHRoaXMgd29ya3MgaW4gdGhlDQorICAgICAgICAgICAgICogcGVyLXBpeGVsIHByb2Nlc3NpbmcuDQorICAgICAgICAgICAgICoNCisgICAgICAgICAgICAgKiBJZiB0aGUgYmFja2dyb3VuZCBpcyBncmF5LCBob3dldmVyLCB3ZSBvbmx5IG5lZWQgYSAyNTYgZW50cnkgZ3JheQ0KKyAgICAgICAgICAgICAqIGxldmVsIGNvbG9yIG1hcC4gIEl0IGlzIHN1ZmZpY2llbnQgdG8gbWFrZSB0aGUgZW50cnkgZ2VuZXJhdGVkDQorICAgICAgICAgICAgICogZm9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGJlIGV4YWN0bHkgdGhlIGNvbG9yIHNwZWNpZmllZC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAoKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpID09IDAgfHwNCisgICAgICAgICAgICAgICAoYmFja19yID09IGJhY2tfZyAmJiBiYWNrX2cgPT0gYmFja19iKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBncmF5OyBubyBzcGVjaWFsIHByb2Nlc3Npbmcgd2lsbCBiZSByZXF1aXJlZC4gKi8NCisgICAgICAgICAgICAgICBwbmdfY29sb3JfMTYgYzsNCisgICAgICAgICAgICAgICBwbmdfdWludF8zMiBncmF5ID0gYmFja19nOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChQTkdfR1JBWV9DT0xPUk1BUF9FTlRSSUVTID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpDQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJncmF5LWFscGhhIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7DQorDQorICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gbWFrZV9ncmF5X2NvbG9ybWFwKGRpc3BsYXkpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gRV9MSU5FQVIpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGdyYXkgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmF5ICogMjU1KTsNCisNCisgICAgICAgICAgICAgICAgICAvKiBBbmQgbWFrZSBzdXJlIHRoZSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgZW50cnkgbWF0Y2hlcy4gKi8NCisgICAgICAgICAgICAgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGdyYXksIGJhY2tfZywgYmFja19nLA0KKyAgICAgICAgICAgICAgICAgICAgIGJhY2tfZywgNjU1MzUsIEVfTElORUFSKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgLyogVGhlIGJhY2tncm91bmQgcGFzc2VkIHRvIGxpYnBuZywgaG93ZXZlciwgbXVzdCBiZSB0aGUgc1JHQg0KKyAgICAgICAgICAgICAgICAqIHZhbHVlLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGMuaW5kZXggPSAwOyAvKnVudXNlZCovDQorICAgICAgICAgICAgICAgYy5ncmF5ID0gYy5yZWQgPSBjLmdyZWVuID0gYy5ibHVlID0gKHBuZ191aW50XzE2KWdyYXk7DQorDQorICAgICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsICZjLA0KKyAgICAgICAgICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMC8qbmVlZF9leHBhbmQqLywNCisgICAgICAgICAgICAgICAgICAwLypnYW1tYTogbm90IHVzZWQqLyk7DQorDQorICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9OT05FOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGksIGE7DQorDQorICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgc2FtZSBhcyBwbmdfbWFrZV9nYV9jb2xvcm1hcCwgYWJvdmUsIGV4Y2VwdCB0aGF0DQorICAgICAgICAgICAgICAgICogdGhlIGVudHJpZXMgYXJlIGFsbCBvcGFxdWUuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgaWYgKFBOR19HQV9DT0xPUk1BUF9FTlRSSUVTID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpDQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJnYS1hbHBoYSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOw0KKw0KKyAgICAgICAgICAgICAgIGkgPSAwOw0KKyAgICAgICAgICAgICAgIHdoaWxlIChpIDwgMjMxKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBncmF5ID0gKGkgKiAyNTYgKyAxMTUpIC8gMjMxOw0KKyAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSsrLCBncmF5LCBncmF5LCBncmF5LA0KKyAgICAgICAgICAgICAgICAgICAgIDI1NSwgRV9zUkdCKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgLyogTk9URTogdGhpcyBwcmVzZXJ2ZXMgdGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbg0KKyAgICAgICAgICAgICAgICAqIGJhY2tncm91bmQgY29sb3IuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgYmFja2dyb3VuZF9pbmRleCA9IGk7DQorICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpKyssIGJhY2tfciwgYmFja19nLCBiYWNrX2IsDQorICAgICAgICAgICAgICAgICAgb3V0cHV0X2VuY29kaW5nID09IEVfTElORUFSID8gNjU1MzVVIDogMjU1VSwgb3V0cHV0X2VuY29kaW5nKTsNCisNCisgICAgICAgICAgICAgICAvKiBGb3Igbm9uLW9wYXF1ZSBpbnB1dCBjb21wb3NpdGUgb24gdGhlIHNSR0IgYmFja2dyb3VuZCAtIHRoaXMNCisgICAgICAgICAgICAgICAgKiByZXF1aXJlcyBpbnZlcnRpbmcgdGhlIGVuY29kaW5nIGZvciBlYWNoIGNvbXBvbmVudC4gIFRoZSBpbnB1dA0KKyAgICAgICAgICAgICAgICAqIGlzIHN0aWxsIGNvbnZlcnRlZCB0byB0aGUgc1JHQiBlbmNvZGluZyBiZWNhdXNlIHRoaXMgaXMgYQ0KKyAgICAgICAgICAgICAgICAqIHJlYXNvbmFibGUgYXBwcm94aW1hdGUgdG8gdGhlIGxvZ2FyaXRobWljIGN1cnZlIG9mIGh1bWFuDQorICAgICAgICAgICAgICAgICogdmlzdWFsIHNlbnNpdGl2aXR5LCBhdCBsZWFzdCBvdmVyIHRoZSBuYXJyb3cgcmFuZ2Ugd2hpY2ggUE5HDQorICAgICAgICAgICAgICAgICogcmVwcmVzZW50cy4gIENvbnNlcXVlbnRseSAnRycgaXMgYWx3YXlzIHNSR0IgZW5jb2RlZCwgd2hpbGUNCisgICAgICAgICAgICAgICAgKiAnQScgaXMgbGluZWFyLiAgV2UgbmVlZCB0aGUgbGluZWFyIGJhY2tncm91bmQgY29sb3JzLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gRV9zUkdCKSAvKiBlbHNlIGFscmVhZHkgbGluZWFyICovDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgbWF5IHByb2R1Y2UgYSB2YWx1ZSBub3QgZXhhY3RseSBtYXRjaGluZyB0aGUNCisgICAgICAgICAgICAgICAgICAgKiBiYWNrZ3JvdW5kLCBidXQgdGhhdCdzIG9rIGJlY2F1c2UgdGhlc2UgbnVtYmVycyBhcmUgb25seQ0KKyAgICAgICAgICAgICAgICAgICAqIHVzZWQgd2hlbiBhbHBoYSAhPSAwDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgYmFja19yID0gcG5nX3NSR0JfdGFibGVbYmFja19yXTsNCisgICAgICAgICAgICAgICAgICBiYWNrX2cgPSBwbmdfc1JHQl90YWJsZVtiYWNrX2ddOw0KKyAgICAgICAgICAgICAgICAgIGJhY2tfYiA9IHBuZ19zUkdCX3RhYmxlW2JhY2tfYl07DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGZvciAoYT0xOyBhPDU7ICsrYSkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGc7DQorDQorICAgICAgICAgICAgICAgICAgLyogUE5HX3NSR0JfRlJPTV9MSU5FQVIgZXhwZWN0cyBhIDE2LWJpdCBsaW5lYXIgdmFsdWUgc2NhbGVkDQorICAgICAgICAgICAgICAgICAgICogYnkgYW4gOC1iaXQgYWxwaGEgdmFsdWUgKDAuLjI1NSkuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgYWxwaGEgPSA1MSAqIGE7DQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgYmFja19yeCA9ICgyNTUtYWxwaGEpICogYmFja19yOw0KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGJhY2tfZ3ggPSAoMjU1LWFscGhhKSAqIGJhY2tfZzsNCisgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBiYWNrX2J4ID0gKDI1NS1hbHBoYSkgKiBiYWNrX2I7DQorDQorICAgICAgICAgICAgICAgICAgZm9yIChnPTA7IGc8NjsgKytnKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBncmF5ID0gcG5nX3NSR0JfdGFibGVbZyo1MV0gKiBhbHBoYTsNCisNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY3JlYXRlX2NvbG9ybWFwX2VudHJ5KGRpc3BsYXksIGkrKywNCisgICAgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9GUk9NX0xJTkVBUihncmF5ICsgYmFja19yeCksDQorICAgICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfRlJPTV9MSU5FQVIoZ3JheSArIGJhY2tfZ3gpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0ZST01fTElORUFSKGdyYXkgKyBiYWNrX2J4KSwgMjU1LCBFX3NSR0IpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gaTsNCisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX0dBOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6DQorICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6DQorICAgICAgICAgLyogRXhjbHVkZSB0aGUgY2FzZSB3aGVyZSB0aGUgb3V0cHV0IGlzIGdyYXk7IHdlIGNhbiBhbHdheXMgaGFuZGxlIHRoaXMNCisgICAgICAgICAgKiB3aXRoIHRoZSBjYXNlcyBhYm92ZS4NCisgICAgICAgICAgKi8NCisgICAgICAgICBpZiAoKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpID09IDApDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoZSBjb2xvci1tYXAgd2lsbCBiZSBncmF5c2NhbGUsIHNvIHdlIG1heSBhcyB3ZWxsIGNvbnZlcnQgdGhlDQorICAgICAgICAgICAgICogaW5wdXQgUkdCIHZhbHVlcyB0byBhIHNpbXBsZSBncmF5c2NhbGUgYW5kIHVzZSB0aGUgZ3JheXNjYWxlDQorICAgICAgICAgICAgICogY29kZSBhYm92ZS4NCisgICAgICAgICAgICAgKg0KKyAgICAgICAgICAgICAqIE5PVEU6IGNhbGxpbmcgdGhpcyBhcHBhcmVudGx5IGRhbWFnZXMgdGhlIHJlY29nbml0aW9uIG9mIHRoZQ0KKyAgICAgICAgICAgICAqIHRyYW5zcGFyZW50IGNvbG9yIGluIGJhY2tncm91bmQgY29sb3IgaGFuZGxpbmc7IGNhbGwNCisgICAgICAgICAgICAgKiBwbmdfc2V0X3RSTlNfdG9fYWxwaGEgYmVmb3JlIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIFBOR19FUlJPUl9BQ1RJT05fTk9ORSwgLTEsDQorICAgICAgICAgICAgICAgLTEpOw0KKyAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBFX3NSR0I7DQorDQorICAgICAgICAgICAgLyogVGhlIG91dHB1dCB3aWxsIG5vdyBiZSBvbmUgb3IgdHdvIDgtYml0IGdyYXkgb3IgZ3JheSthbHBoYQ0KKyAgICAgICAgICAgICAqIGNoYW5uZWxzLiAgVGhlIG1vcmUgY29tcGxleCBjYXNlIGFyaXNlcyB3aGVuIHRoZSBpbnB1dCBoYXMgYWxwaGEuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSB8fA0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV90cmFucyA+IDApICYmDQorICAgICAgICAgICAgICAgKG91dHB1dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIC8qIEJvdGggaW5wdXQgYW5kIG91dHB1dCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG5vIGJhY2tncm91bmQNCisgICAgICAgICAgICAgICAgKiBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkOyBqdXN0IG1hcCB0aGUgR0EgYnl0ZXMgdG8gdGhlIHJpZ2h0DQorICAgICAgICAgICAgICAgICogY29sb3ItbWFwIGVudHJ5Lg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGV4cGFuZF90Uk5TID0gMTsNCisNCisgICAgICAgICAgICAgICBpZiAoUE5HX0dBX0NPTE9STUFQX0VOVFJJRVMgPiBpbWFnZS0+Y29sb3JtYXBfZW50cmllcykNCisgICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInJnYltnYV0gY29sb3ItbWFwOiB0b28gZmV3IGVudHJpZXMiKTsNCisNCisgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBtYWtlX2dhX2NvbG9ybWFwKGRpc3BsYXkpOw0KKyAgICAgICAgICAgICAgIGJhY2tncm91bmRfaW5kZXggPSBQTkdfQ01BUF9HQV9CQUNLR1JPVU5EOw0KKyAgICAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfR0E7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogRWl0aGVyIHRoZSBpbnB1dCBvciB0aGUgb3V0cHV0IGhhcyBubyBhbHBoYSBjaGFubmVsLCBzbyB0aGVyZQ0KKyAgICAgICAgICAgICAgICAqIHdpbGwgYmUgbm8gbm9uLW9wYXF1ZSBwaXhlbHMgaW4gdGhlIGNvbG9yLW1hcDsgaXQgd2lsbCBqdXN0IGJlDQorICAgICAgICAgICAgICAgICogZ3JheXNjYWxlLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGlmIChQTkdfR1JBWV9DT0xPUk1BUF9FTlRSSUVTID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpDQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJyZ2JbZ3JheV0gY29sb3ItbWFwOiB0b28gZmV3IGVudHJpZXMiKTsNCisNCisgICAgICAgICAgICAgICAvKiBJZGVhbGx5IHRoaXMgY29kZSB3b3VsZCB1c2UgbGlicG5nIHRvIGRvIHRoZSBnYW1tYSBjb3JyZWN0aW9uLA0KKyAgICAgICAgICAgICAgICAqIGJ1dCBpZiBhbiBpbnB1dCBhbHBoYSBjaGFubmVsIGlzIHRvIGJlIHJlbW92ZWQgd2Ugd2lsbCBoaXQgdGhlDQorICAgICAgICAgICAgICAgICogbGlicG5nIGJ1ZyBpbiBnYW1tYStjb21wb3NlK3JnYi10by1ncmF5ICh0aGUgZG91YmxlIGdhbW1hDQorICAgICAgICAgICAgICAgICogY29ycmVjdGlvbiBidWcpLiAgRml4IHRoaXMgYnkgZHJvcHBpbmcgdGhlIGdhbW1hIGNvcnJlY3Rpb24gaW4NCisgICAgICAgICAgICAgICAgKiB0aGlzIGNhc2UgYW5kIGRvaW5nIGl0IGluIHRoZSBwYWxldHRlOyB0aGlzIHdpbGwgcmVzdWx0IGluDQorICAgICAgICAgICAgICAgICogZHVwbGljYXRlIHBhbGV0dGUgZW50cmllcywgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiB0aGUNCisgICAgICAgICAgICAgICAgKiBhbHRlcm5hdGl2ZSBvZiBkb3VibGUgZ2FtbWEgY29ycmVjdGlvbi4NCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8DQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID4gMCkgJiYNCisgICAgICAgICAgICAgICAgICBwbmdfZ2FtbWFfbm90X3NSR0IocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSkpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGNtYXBfZW50cmllcyA9IG1ha2VfZ3JheV9maWxlX2NvbG9ybWFwKGRpc3BsYXkpOw0KKyAgICAgICAgICAgICAgICAgIGRhdGFfZW5jb2RpbmcgPSBFX0ZJTEU7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSBtYWtlX2dyYXlfY29sb3JtYXAoZGlzcGxheSk7DQorDQorICAgICAgICAgICAgICAgLyogQnV0IGlmIHRoZSBpbnB1dCBoYXMgYWxwaGEgb3IgdHJhbnNwYXJlbmN5IGl0IG11c3QgYmUgcmVtb3ZlZA0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSB8fA0KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV90cmFucyA+IDApDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOw0KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGdyYXkgPSBiYWNrX2c7DQorDQorICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYXBwbGljYXRpb24gYmFja2dyb3VuZCBleGlzdHMgaW4NCisgICAgICAgICAgICAgICAgICAgKiB0aGUgY29sb3JtYXAgYW5kIHRoYXQgY29tcGxldGVseSB0cmFuc3BhcmVudCBwaXhlbHMgbWFwIHRvDQorICAgICAgICAgICAgICAgICAgICogaXQuICBBY2hpZXZlIHRoaXMgc2ltcGx5IGJ5IGVuc3VyaW5nIHRoYXQgdGhlIGVudHJ5DQorICAgICAgICAgICAgICAgICAgICogc2VsZWN0ZWQgZm9yIHRoZSBiYWNrZ3JvdW5kIHJlYWxseSBpcyB0aGUgYmFja2dyb3VuZCBjb2xvci4NCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBpZiAoZGF0YV9lbmNvZGluZyA9PSBFX0ZJTEUpIC8qIGZyb20gdGhlIGZpeHVwIGFib3ZlICovDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBhcHAgc3VwcGxpZWQgYSBncmF5IHdoaWNoIGlzIGluIG91dHB1dF9lbmNvZGluZywgd2UNCisgICAgICAgICAgICAgICAgICAgICAgKiBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gYSB2YWx1ZSBvZiB0aGUgaW5wdXQgKEVfRklMRSkNCisgICAgICAgICAgICAgICAgICAgICAgKiBlbmNvZGluZyB0aGVuIHNldCB0aGlzIHBhbGV0dGUgZW50cnkgdG8gdGhlIHJlcXVpcmVkDQorICAgICAgICAgICAgICAgICAgICAgICogb3V0cHV0IGVuY29kaW5nLg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZW5jb2RpbmcgPT0gRV9zUkdCKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYXkgPSBwbmdfc1JHQl90YWJsZVtncmF5XTsgLyogbm93IEVfTElORUFSICovDQorDQorICAgICAgICAgICAgICAgICAgICAgZ3JheSA9IFBOR19ESVYyNTcocG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QoZ3JheSwNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hKSk7IC8qIG5vdyBFX0ZJTEUgKi8NCisNCisgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgbWFrZSBzdXJlIHRoZSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgZW50cnkgY29udGFpbnMNCisgICAgICAgICAgICAgICAgICAgICAgKiBleGFjdGx5IHRoZSByZXF1aXJlZCBzUkdCIHZhbHVlLg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgZ3JheSwgYmFja19nLCBiYWNrX2csDQorICAgICAgICAgICAgICAgICAgICAgICAgYmFja19nLCAwLyp1bnVzZWQqLywgb3V0cHV0X2VuY29kaW5nKTsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob3V0cHV0X2VuY29kaW5nID09IEVfTElORUFSKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBncmF5ID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoZ3JheSAqIDI1NSk7DQorDQorICAgICAgICAgICAgICAgICAgICAgLyogQW5kIG1ha2Ugc3VyZSB0aGUgY29ycmVzcG9uZGluZyBwYWxldHRlIGVudHJ5IG1hdGNoZXMuDQorICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBncmF5LCBiYWNrX2csIGJhY2tfZywNCisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2csIDAvKnVudXNlZCovLCBFX0xJTkVBUik7DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBiYWNrZ3JvdW5kIHBhc3NlZCB0byBsaWJwbmcsIGhvd2V2ZXIsIG11c3QgYmUgdGhlDQorICAgICAgICAgICAgICAgICAgICogb3V0cHV0IChub3JtYWxseSBzUkdCKSB2YWx1ZS4NCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBjLmluZGV4ID0gMDsgLyp1bnVzZWQqLw0KKyAgICAgICAgICAgICAgICAgIGMuZ3JheSA9IGMucmVkID0gYy5ncmVlbiA9IGMuYmx1ZSA9IChwbmdfdWludF8xNilncmF5Ow0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IHRoZSBmb2xsb3dpbmcgaXMgYXBwYXJlbnRseSBhIGJ1ZyBpbiBsaWJwbmcuIFdpdGhvdXQNCisgICAgICAgICAgICAgICAgICAgKiBpdCB0aGUgdHJhbnNwYXJlbnQgY29sb3IgcmVjb2duaXRpb24gaW4NCisgICAgICAgICAgICAgICAgICAgKiBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQgc2VlbXMgdG8gZ28gd3JvbmcuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgZXhwYW5kX3RSTlMgPSAxOw0KKyAgICAgICAgICAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfcHRyLCAmYywNCisgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKm5lZWRfZXhwYW5kKi8sDQorICAgICAgICAgICAgICAgICAgICAgMC8qZ2FtbWE6IG5vdCB1c2VkKi8pOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlIC8qIG91dHB1dCBpcyBjb2xvciAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBXZSBjb3VsZCB1c2UgcG5nX3F1YW50aXplIGhlcmUgc28gbG9uZyBhcyB0aGVyZSBpcyBubyB0cmFuc3BhcmVudA0KKyAgICAgICAgICAgICAqIGNvbG9yIG9yIGFscGhhOyBwbmdfcXVhbnRpemUgaWdub3JlcyBhbHBoYS4gIEVhc2llciBvdmVyYWxsIGp1c3QNCisgICAgICAgICAgICAgKiB0byBkbyBpdCBvbmNlIGFuZCB1c2luZyBQTkdfRElWNTEgb24gdGhlIDZ4Nng2IHJlZHVjZWQgUkdCIGN1YmUuDQorICAgICAgICAgICAgICogQ29uc2VxdWVudGx5IHdlIGFsd2F5cyB3YW50IGxpYnBuZyB0byBwcm9kdWNlIHNSR0IgZGF0YS4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBkYXRhX2VuY29kaW5nID0gRV9zUkdCOw0KKw0KKyAgICAgICAgICAgIC8qIElzIHRoZXJlIGFueSB0cmFuc3BhcmVuY3kgb3IgYWxwaGE/ICovDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogSXMgdGhlcmUgYWxwaGEgaW4gdGhlIG91dHB1dCB0b28/ICBJZiBzbyBhbGwgZm91ciBjaGFubmVscyBhcmUNCisgICAgICAgICAgICAgICAgKiBwcm9jZXNzZWQgaW50byBhIHNwZWNpYWwgUkdCIGN1YmUgd2l0aCBhbHBoYSBzdXBwb3J0Lg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiByOw0KKw0KKyAgICAgICAgICAgICAgICAgIGlmIChQTkdfUkdCX0NPTE9STUFQX0VOVFJJRVMrMSsyNyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQ0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmdiK2FscGhhIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7DQorDQorICAgICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gbWFrZV9yZ2JfY29sb3JtYXAoZGlzcGxheSk7DQorDQorICAgICAgICAgICAgICAgICAgLyogQWRkIGEgdHJhbnNwYXJlbnQgZW50cnkuICovDQorICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBjbWFwX2VudHJpZXMsIDI1NSwgMjU1LA0KKyAgICAgICAgICAgICAgICAgICAgIDI1NSwgMCwgRV9zUkdCKTsNCisNCisgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHN0b3JlZCBhcyB0aGUgYmFja2dyb3VuZCBpbmRleCBmb3IgdGhlIHByb2Nlc3NpbmcNCisgICAgICAgICAgICAgICAgICAgKiBhbGdvcml0aG0uDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZF9pbmRleCA9IGNtYXBfZW50cmllcysrOw0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNyByLGcsYiBlbnRyaWVzIGVhY2ggd2l0aCBhbHBoYSAwLjUuICovDQorICAgICAgICAgICAgICAgICAgZm9yIChyPTA7IHI8MjU2OyByID0gKHIgPDwgMSkgfCAweDdmKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBnOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGZvciAoZz0wOyBnPDI1NjsgZyA9IChnIDw8IDEpIHwgMHg3ZikNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgYjsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBjb21wb25lbnRzIHdpdGggdGhlIHZhbHVlcyAwLCAxMjcgYW5kDQorICAgICAgICAgICAgICAgICAgICAgICAgICogMjU1DQorICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiPTA7IGI8MjU2OyBiID0gKGIgPDwgMSkgfCAweDdmKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgY21hcF9lbnRyaWVzKyssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYiwgMTI4LCBFX3NSR0IpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZXhwYW5kX3RSTlMgPSAxOw0KKyAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm9jZXNzaW5nID0gUE5HX0NNQVBfUkdCX0FMUEhBOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIC8qIEFscGhhL3RyYW5zcGFyZW5jeSBtdXN0IGJlIHJlbW92ZWQuICBUaGUgYmFja2dyb3VuZCBtdXN0DQorICAgICAgICAgICAgICAgICAgICogZXhpc3QgaW4gdGhlIGNvbG9yIG1hcCAoYWNoaWV2ZWQgYnkgc2V0dGluZyBhZGRpbmcgaXQgYWZ0ZXINCisgICAgICAgICAgICAgICAgICAgKiB0aGUgNjY2IGNvbG9yLW1hcCkuICBJZiB0aGUgc3RhbmRhcmQgcHJvY2Vzc2luZyBjb2RlIHdpbGwNCisgICAgICAgICAgICAgICAgICAgKiBwaWNrIHVwIHRoaXMgZW50cnkgYXV0b21hdGljYWxseSB0aGF0J3MgYWxsIHRoYXQgaXMNCisgICAgICAgICAgICAgICAgICAgKiByZXF1aXJlZDsgbGlicG5nIGNhbiBiZSBjYWxsZWQgdG8gZG8gdGhlIGJhY2tncm91bmQNCisgICAgICAgICAgICAgICAgICAgKiBwcm9jZXNzaW5nLg0KKyAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzYW1wbGVfc2l6ZSA9DQorICAgICAgICAgICAgICAgICAgICAgUE5HX0lNQUdFX1NBTVBMRV9TSVpFKG91dHB1dF9mb3JtYXQpOw0KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHIsIGcsIGI7IC8qIHNSR0IgYmFja2dyb3VuZCAqLw0KKw0KKyAgICAgICAgICAgICAgICAgIGlmIChQTkdfUkdCX0NPTE9STUFQX0VOVFJJRVMrMSsyNyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQ0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmdiLWFscGhhIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7DQorDQorICAgICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gbWFrZV9yZ2JfY29sb3JtYXAoZGlzcGxheSk7DQorDQorICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBjbWFwX2VudHJpZXMsIGJhY2tfciwNCisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2csIGJhY2tfYiwgMC8qdW51c2VkKi8sIG91dHB1dF9lbmNvZGluZyk7DQorDQorICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dF9lbmNvZGluZyA9PSBFX0xJTkVBUikNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgciA9IFBOR19zUkdCX0ZST01fTElORUFSKGJhY2tfciAqIDI1NSk7DQorICAgICAgICAgICAgICAgICAgICAgZyA9IFBOR19zUkdCX0ZST01fTElORUFSKGJhY2tfZyAqIDI1NSk7DQorICAgICAgICAgICAgICAgICAgICAgYiA9IFBOR19zUkdCX0ZST01fTElORUFSKGJhY2tfYiAqIDI1NSk7DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgciA9IGJhY2tfcjsNCisgICAgICAgICAgICAgICAgICAgICBnID0gYmFja19nOw0KKyAgICAgICAgICAgICAgICAgICAgIGIgPSBiYWNrX2c7DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIENvbXBhcmUgdGhlIG5ld2x5LWNyZWF0ZWQgY29sb3ItbWFwIGVudHJ5IHdpdGggdGhlIG9uZSB0aGUNCisgICAgICAgICAgICAgICAgICAgKiBQTkdfQ01BUF9SR0IgYWxnb3JpdGhtIHdpbGwgdXNlLiAgSWYgdGhlIHR3byBlbnRyaWVzIGRvbid0DQorICAgICAgICAgICAgICAgICAgICogbWF0Y2gsIGFkZCB0aGUgbmV3IG9uZSBhbmQgc2V0IHRoaXMgYXMgdGhlIGJhY2tncm91bmQNCisgICAgICAgICAgICAgICAgICAgKiBpbmRleC4NCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBpZiAobWVtY21wKChwbmdfY29uc3RfYnl0ZXApZGlzcGxheS0+Y29sb3JtYXAgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplICogY21hcF9lbnRyaWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIChwbmdfY29uc3RfYnl0ZXApZGlzcGxheS0+Y29sb3JtYXAgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplICogUE5HX1JHQl9JTkRFWChyLGcsYiksDQorICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUpICE9IDApDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG11c3QgYmUgYWRkZWQuICovDQorICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZF9pbmRleCA9IGNtYXBfZW50cmllcysrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNyByLGcsYiBlbnRyaWVzIGVhY2ggd2l0aCBjcmVhdGVkIGJ5IGNvbXBvc2luZyB3aXRoDQorICAgICAgICAgICAgICAgICAgICAgICogdGhlIGJhY2tncm91bmQgYXQgYWxwaGEgMC41Lg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIGZvciAocj0wOyByPDI1NjsgciA9IChyIDw8IDEpIHwgMHg3ZikNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChnPTA7IGc8MjU2OyBnID0gKGcgPDwgMSkgfCAweDdmKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBjb21wb25lbnRzIHdpdGggdGhlIHZhbHVlcyAwLCAxMjcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgMjU1DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiPTA7IGI8MjU2OyBiID0gKGIgPDwgMSkgfCAweDdmKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgY21hcF9lbnRyaWVzKyssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9ybWFwX2NvbXBvc2UoZGlzcGxheSwgciwgRV9zUkdCLCAxMjgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja19yLCBvdXRwdXRfZW5jb2RpbmcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcm1hcF9jb21wb3NlKGRpc3BsYXksIGcsIEVfc1JHQiwgMTI4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tfZywgb3V0cHV0X2VuY29kaW5nKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JtYXBfY29tcG9zZShkaXNwbGF5LCBiLCBFX3NSR0IsIDEyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2IsIG91dHB1dF9lbmNvZGluZyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC8qdW51c2VkKi8sIG91dHB1dF9lbmNvZGluZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBleHBhbmRfdFJOUyA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9SR0JfQUxQSEE7DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UgLyogYmFja2dyb3VuZCBjb2xvciBpcyBpbiB0aGUgc3RhbmRhcmQgY29sb3ItbWFwICovDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGMuaW5kZXggPSAwOyAvKnVudXNlZCovDQorICAgICAgICAgICAgICAgICAgICAgYy5yZWQgPSAocG5nX3VpbnRfMTYpYmFja19yOw0KKyAgICAgICAgICAgICAgICAgICAgIGMuZ3JheSA9IGMuZ3JlZW4gPSAocG5nX3VpbnRfMTYpYmFja19nOw0KKyAgICAgICAgICAgICAgICAgICAgIGMuYmx1ZSA9IChwbmdfdWludF8xNiliYWNrX2I7DQorDQorICAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsICZjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMC8qbmVlZF9leHBhbmQqLywNCisgICAgICAgICAgICAgICAgICAgICAgICAwLypnYW1tYTogbm90IHVzZWQqLyk7DQorDQorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9SR0I7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZSAvKiBubyBhbHBoYSBvciB0cmFuc3BhcmVuY3kgaW4gdGhlIGlucHV0ICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIC8qIEFscGhhIGluIHRoZSBvdXRwdXQgaXMgaXJyZWxldmFudCwgc2ltcGx5IG1hcCB0aGUgb3BhcXVlIGlucHV0DQorICAgICAgICAgICAgICAgICogcGl4ZWxzIHRvIHRoZSA2eDZ4NiBjb2xvci1tYXAuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgaWYgKFBOR19SR0JfQ09MT1JNQVBfRU5UUklFUyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQ0KKyAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmdiIGNvbG9yLW1hcDogdG9vIGZldyBlbnRyaWVzIik7DQorDQorICAgICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gbWFrZV9yZ2JfY29sb3JtYXAoZGlzcGxheSk7DQorICAgICAgICAgICAgICAgb3V0cHV0X3Byb2Nlc3NpbmcgPSBQTkdfQ01BUF9SR0I7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6DQorICAgICAgICAgLyogSXQncyBhbHJlYWR5IGdvdCBhIGNvbG9yLW1hcC4gIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gZWxpbWluYXRlIHRoZQ0KKyAgICAgICAgICAqIHRSTlMgZW50cmllcyB0aG91Z2guDQorICAgICAgICAgICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fdHJhbnMgPSBwbmdfcHRyLT5udW1fdHJhbnM7DQorICAgICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIHRyYW5zID0gbnVtX3RyYW5zID4gMCA/IHBuZ19wdHItPnRyYW5zX2FscGhhIDogTlVMTDsNCisgICAgICAgICAgICBwbmdfY29uc3RfY29sb3JwIGNvbG9ybWFwID0gcG5nX3B0ci0+cGFsZXR0ZTsNCisgICAgICAgICAgICBjb25zdCBpbnQgZG9fYmFja2dyb3VuZCA9IHRyYW5zICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICAob3V0cHV0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMDsNCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsNCisNCisgICAgICAgICAgICAvKiBKdXN0IGluIGNhc2U6ICovDQorICAgICAgICAgICAgaWYgKHRyYW5zID09IE5VTEwpDQorICAgICAgICAgICAgICAgbnVtX3RyYW5zID0gMDsNCisNCisgICAgICAgICAgICBvdXRwdXRfcHJvY2Vzc2luZyA9IFBOR19DTUFQX05PTkU7DQorICAgICAgICAgICAgZGF0YV9lbmNvZGluZyA9IEVfRklMRTsgLyogRG9uJ3QgY2hhbmdlIGZyb20gY29sb3ItbWFwIGluZGljaWVzICovDQorICAgICAgICAgICAgY21hcF9lbnRyaWVzID0gcG5nX3B0ci0+bnVtX3BhbGV0dGU7DQorICAgICAgICAgICAgaWYgKGNtYXBfZW50cmllcyA+IDI1NikNCisgICAgICAgICAgICAgICBjbWFwX2VudHJpZXMgPSAyNTY7DQorDQorICAgICAgICAgICAgaWYgKGNtYXBfZW50cmllcyA+IGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzKQ0KKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicGFsZXR0ZSBjb2xvci1tYXA6IHRvbyBmZXcgZW50cmllcyIpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgY21hcF9lbnRyaWVzOyArK2kpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGlmIChkb19iYWNrZ3JvdW5kICYmIGkgPCBudW1fdHJhbnMgJiYgdHJhbnNbaV0gPCAyNTUpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGlmICh0cmFuc1tpXSA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSwgYmFja19yLCBiYWNrX2csDQorICAgICAgICAgICAgICAgICAgICAgICAgYmFja19iLCAwLCBvdXRwdXRfZW5jb2RpbmcpOw0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBjb21wb3NlIHRoZSBQTkcgZmlsZSBjb2xvciBpbiB0aGUgY29sb3ItbWFwIGVudHJ5DQorICAgICAgICAgICAgICAgICAgICAgICogb24gdGhlIHNSR0IgY29sb3IgaW4gJ2JhY2snLg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jcmVhdGVfY29sb3JtYXBfZW50cnkoZGlzcGxheSwgaSwNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JtYXBfY29tcG9zZShkaXNwbGF5LCBjb2xvcm1hcFtpXS5yZWQsIEVfRklMRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1tpXSwgYmFja19yLCBvdXRwdXRfZW5jb2RpbmcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcm1hcF9jb21wb3NlKGRpc3BsYXksIGNvbG9ybWFwW2ldLmdyZWVuLCBFX0ZJTEUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNbaV0sIGJhY2tfZywgb3V0cHV0X2VuY29kaW5nKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29sb3JtYXBfY29tcG9zZShkaXNwbGF5LCBjb2xvcm1hcFtpXS5ibHVlLCBFX0ZJTEUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNbaV0sIGJhY2tfYiwgb3V0cHV0X2VuY29kaW5nKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZW5jb2RpbmcgPT0gRV9MSU5FQVIgPyB0cmFuc1tpXSAqIDI1N1UgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zW2ldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9lbmNvZGluZyk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgcG5nX2NyZWF0ZV9jb2xvcm1hcF9lbnRyeShkaXNwbGF5LCBpLCBjb2xvcm1hcFtpXS5yZWQsDQorICAgICAgICAgICAgICAgICAgICAgY29sb3JtYXBbaV0uZ3JlZW4sIGNvbG9ybWFwW2ldLmJsdWUsDQorICAgICAgICAgICAgICAgICAgICAgaSA8IG51bV90cmFucyA/IHRyYW5zW2ldIDogMjU1VSwgRV9GSUxFLyo4LWJpdCovKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLyogVGhlIFBORyBkYXRhIG1heSBoYXZlIGluZGljaWVzIHBhY2tlZCBpbiBmZXdlciB0aGFuIDggYml0cywgaXQNCisgICAgICAgICAgICAgKiBtdXN0IGJlIGV4cGFuZGVkIGlmIHNvLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQ0KKyAgICAgICAgICAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsNCisgICAgICAgICB9DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgUE5HIGNvbG9yIHR5cGUiKTsNCisgICAgICAgICAvKk5PVCBSRUFDSEVEKi8NCisgICAgICAgICBicmVhazsNCisgICB9DQorDQorICAgLyogTm93IGRlYWwgd2l0aCB0aGUgb3V0cHV0IHByb2Nlc3NpbmcgKi8NCisgICBpZiAoZXhwYW5kX3RSTlMgJiYgcG5nX3B0ci0+bnVtX3RyYW5zID4gMCAmJg0KKyAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpID09IDApDQorICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOw0KKw0KKyAgIHN3aXRjaCAoZGF0YV9lbmNvZGluZykNCisgICB7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImJhZCBkYXRhIG9wdGlvbiAoaW50ZXJuYWwgZXJyb3IpIik7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBFX3NSR0I6DQorICAgICAgICAgLyogQ2hhbmdlIHRvIDgtYml0IHNSR0IgKi8NCisgICAgICAgICBwbmdfc2V0X2FscGhhX21vZGVfZml4ZWQocG5nX3B0ciwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX3NSR0IpOw0KKyAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLw0KKw0KKyAgICAgIGNhc2UgRV9GSUxFOg0KKyAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPiA4KQ0KKyAgICAgICAgICAgIHBuZ19zZXRfc2NhbGVfMTYocG5nX3B0cik7DQorICAgICAgICAgYnJlYWs7DQorICAgfQ0KKw0KKyAgIGlmIChjbWFwX2VudHJpZXMgPiAyNTYgfHwgY21hcF9lbnRyaWVzID4gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJjb2xvciBtYXAgb3ZlcmZsb3cgKEJBRCBpbnRlcm5hbCBlcnJvcikiKTsNCisNCisgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9IGNtYXBfZW50cmllczsNCisNCisgICAvKiBEb3VibGUgY2hlY2sgdXNpbmcgdGhlIHJlY29yZGVkIGJhY2tncm91bmQgaW5kZXggKi8NCisgICBzd2l0Y2ggKG91dHB1dF9wcm9jZXNzaW5nKQ0KKyAgIHsNCisgICAgICBjYXNlIFBOR19DTUFQX05PTkU6DQorICAgICAgICAgaWYgKGJhY2tncm91bmRfaW5kZXggIT0gUE5HX0NNQVBfTk9ORV9CQUNLR1JPVU5EKQ0KKyAgICAgICAgICAgIGdvdG8gYmFkX2JhY2tncm91bmQ7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ01BUF9HQToNCisgICAgICAgICBpZiAoYmFja2dyb3VuZF9pbmRleCAhPSBQTkdfQ01BUF9HQV9CQUNLR1JPVU5EKQ0KKyAgICAgICAgICAgIGdvdG8gYmFkX2JhY2tncm91bmQ7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ01BUF9UUkFOUzoNCisgICAgICAgICBpZiAoYmFja2dyb3VuZF9pbmRleCA+PSBjbWFwX2VudHJpZXMgfHwNCisgICAgICAgICAgICBiYWNrZ3JvdW5kX2luZGV4ICE9IFBOR19DTUFQX1RSQU5TX0JBQ0tHUk9VTkQpDQorICAgICAgICAgICAgZ290byBiYWRfYmFja2dyb3VuZDsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19DTUFQX1JHQjoNCisgICAgICAgICBpZiAoYmFja2dyb3VuZF9pbmRleCAhPSBQTkdfQ01BUF9SR0JfQkFDS0dST1VORCkNCisgICAgICAgICAgICBnb3RvIGJhZF9iYWNrZ3JvdW5kOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0NNQVBfUkdCX0FMUEhBOg0KKyAgICAgICAgIGlmIChiYWNrZ3JvdW5kX2luZGV4ICE9IFBOR19DTUFQX1JHQl9BTFBIQV9CQUNLR1JPVU5EKQ0KKyAgICAgICAgICAgIGdvdG8gYmFkX2JhY2tncm91bmQ7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImJhZCBwcm9jZXNzaW5nIG9wdGlvbiAoaW50ZXJuYWwgZXJyb3IpIik7DQorDQorICAgICAgYmFkX2JhY2tncm91bmQ6DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJiYWQgYmFja2dyb3VuZCBpbmRleCAoaW50ZXJuYWwgZXJyb3IpIik7DQorICAgfQ0KKw0KKyAgIGRpc3BsYXktPmNvbG9ybWFwX3Byb2Nlc3NpbmcgPSBvdXRwdXRfcHJvY2Vzc2luZzsNCisNCisgICByZXR1cm4gMS8qb2sqLzsNCit9DQorDQorLyogVGhlIGZpbmFsIHBhcnQgb2YgdGhlIGNvbG9yLW1hcCByZWFkIGNhbGxlZCBmcm9tIHBuZ19pbWFnZV9maW5pc2hfcmVhZC4gKi8NCitzdGF0aWMgaW50DQorcG5nX2ltYWdlX3JlYWRfYW5kX21hcChwbmdfdm9pZHAgYXJndW1lbnQpDQorew0KKyAgIHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3JlYWRfY29udHJvbCosDQorICAgICAgYXJndW1lbnQpOw0KKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsNCisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7DQorICAgaW50IHBhc3NlczsNCisNCisgICAvKiBDYWxsZWQgd2hlbiB0aGUgbGlicG5nIGRhdGEgbXVzdCBiZSB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjb2xvci1tYXBwZWQNCisgICAgKiBmb3JtLiAgVGhlcmUgaXMgYSBsb2NhbCByb3cgYnVmZmVyIGluIGRpc3BsYXktPmxvY2FsIGFuZCB0aGlzIHJvdXRpbmUgbXVzdA0KKyAgICAqIGRvIHRoZSBpbnRlcmxhY2UgaGFuZGxpbmcuDQorICAgICovDQorICAgc3dpdGNoIChwbmdfcHRyLT5pbnRlcmxhY2VkKQ0KKyAgIHsNCisgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToNCisgICAgICAgICBwYXNzZXMgPSAxOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoNCisgICAgICAgICBwYXNzZXMgPSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIHBhc3NlcyA9IDA7DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGludGVybGFjZSB0eXBlIik7DQorICAgfQ0KKw0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiAgaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsNCisgICAgICBwbmdfdWludF8zMiAgd2lkdGggPSBpbWFnZS0+d2lkdGg7DQorICAgICAgaW50ICAgICAgICAgIHByb2MgPSBkaXNwbGF5LT5jb2xvcm1hcF9wcm9jZXNzaW5nOw0KKyAgICAgIHBuZ19ieXRlcCAgICBmaXJzdF9yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5maXJzdF9yb3cpOw0KKyAgICAgIHB0cmRpZmZfdCAgICBzdGVwX3JvdyA9IGRpc3BsYXktPnJvd19ieXRlczsNCisgICAgICBpbnQgcGFzczsNCisNCisgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgcGFzc2VzOyArK3Bhc3MpDQorICAgICAgew0KKyAgICAgICAgIHVuc2lnbmVkIGludCAgICAgc3RhcnR4LCBzdGVweCwgc3RlcHk7DQorICAgICAgICAgcG5nX3VpbnRfMzIgICAgICB5Ow0KKw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkID09IFBOR19JTlRFUkxBQ0VfQURBTTcpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoZSByb3cgbWF5IGJlIGVtcHR5IGZvciBhIHNob3J0IGltYWdlOiAqLw0KKyAgICAgICAgICAgIGlmIChQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSA9PSAwKQ0KKyAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgICAgICAgIHN0YXJ0eCA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKTsNCisgICAgICAgICAgICBzdGVweCA9IFBOR19QQVNTX0NPTF9PRkZTRVQocGFzcyk7DQorICAgICAgICAgICAgeSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsNCisgICAgICAgICAgICBzdGVweSA9IFBOR19QQVNTX1JPV19PRkZTRVQocGFzcyk7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICB7DQorICAgICAgICAgICAgeSA9IDA7DQorICAgICAgICAgICAgc3RhcnR4ID0gMDsNCisgICAgICAgICAgICBzdGVweCA9IHN0ZXB5ID0gMTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZm9yICg7IHk8aGVpZ2h0OyB5ICs9IHN0ZXB5KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgaW5yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5sb2NhbF9yb3cpOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBvdXRyb3cgPSBmaXJzdF9yb3cgKyB5ICogc3RlcF9yb3c7DQorICAgICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIGVuZF9yb3cgPSBvdXRyb3cgKyB3aWR0aDsNCisNCisgICAgICAgICAgICAvKiBSZWFkIHJlYWQgdGhlIGxpYnBuZyBkYXRhIGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIuICovDQorICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIGlucm93LCBOVUxMKTsNCisNCisgICAgICAgICAgICAvKiBOb3cgcHJvY2VzcyB0aGUgcm93IGFjY29yZGluZyB0byB0aGUgcHJvY2Vzc2luZyBvcHRpb24sIG5vdGUNCisgICAgICAgICAgICAgKiB0aGF0IHRoZSBjYWxsZXIgdmVyaWZpZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoZSBsaWJwbmcgb3V0cHV0DQorICAgICAgICAgICAgICogZGF0YSBpcyBhcyByZXF1aXJlZC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBvdXRyb3cgKz0gc3RhcnR4Ow0KKyAgICAgICAgICAgIHN3aXRjaCAocHJvYykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgY2FzZSBQTkdfQ01BUF9HQToNCisgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZGF0YSBpcyBhbHdheXMgaW4gdGhlIFBORyBvcmRlciAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBncmF5ID0gKmlucm93Kys7DQorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFscGhhID0gKmlucm93Kys7DQorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVudHJ5Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IHRoaXMgY29kZSBpcyBjb3BpZWQgYXMgYSBjb21tZW50IGluDQorICAgICAgICAgICAgICAgICAgICAgICogbWFrZV9nYV9jb2xvcm1hcCBhYm92ZS4gIFBsZWFzZSB1cGRhdGUgdGhlDQorICAgICAgICAgICAgICAgICAgICAgICogY29tbWVudCBpZiB5b3UgY2hhbmdlIHRoaXMgY29kZSENCisgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPiAyMjkpIC8qIG9wYXF1ZSAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9ICgyMzEgKiBncmF5ICsgMTI4KSA+PiA4Ow0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhbHBoYSA8IDI2KSAvKiB0cmFuc3BhcmVudCAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IDIzMTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBwYXJ0aWFsbHkgb3BhcXVlICovDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gMjI2ICsgNiAqIFBOR19ESVY1MShhbHBoYSkgKyBQTkdfRElWNTEoZ3JheSk7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSAocG5nX2J5dGUpZW50cnk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgIGNhc2UgUE5HX0NNQVBfVFJBTlM6DQorICAgICAgICAgICAgICAgICAgZm9yICg7IG91dHJvdyA8IGVuZF9yb3c7IG91dHJvdyArPSBzdGVweCkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgZ3JheSA9ICppbnJvdysrOw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGFscGhhID0gKmlucm93Kys7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDApDQorICAgICAgICAgICAgICAgICAgICAgICAgKm91dHJvdyA9IFBOR19DTUFQX1RSQU5TX0JBQ0tHUk9VTkQ7DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JheSAhPSBQTkdfQ01BUF9UUkFOU19CQUNLR1JPVU5EKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSBncmF5Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cm93ID0gKHBuZ19ieXRlKShQTkdfQ01BUF9UUkFOU19CQUNLR1JPVU5EKzEpOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICBjYXNlIFBOR19DTUFQX1JHQjoNCisgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAqb3V0cm93ID0gUE5HX1JHQl9JTkRFWChpbnJvd1swXSwgaW5yb3dbMV0sIGlucm93WzJdKTsNCisgICAgICAgICAgICAgICAgICAgICBpbnJvdyArPSAzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICBjYXNlIFBOR19DTUFQX1JHQl9BTFBIQToNCisgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxwaGEgPSBpbnJvd1szXTsNCisNCisgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIHRoZSBhbHBoYSBlbnRyaWVzIG9ubHkgaG9sZCBhbHBoYT09MC41IHZhbHVlcw0KKyAgICAgICAgICAgICAgICAgICAgICAqIHNwbGl0IHRoZSBwcm9jZXNzaW5nIGF0IGFscGhhPT0wLjI1ICg2NCkgYW5kIDAuNzUNCisgICAgICAgICAgICAgICAgICAgICAgKiAoMTk2KS4NCisgICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPj0gMTk2KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRyb3cgPSBQTkdfUkdCX0lOREVYKGlucm93WzBdLCBpbnJvd1sxXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnJvd1syXSk7DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWxwaGEgPCA2NCkNCisgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cm93ID0gUE5HX0NNQVBfUkdCX0FMUEhBX0JBQ0tHUk9VTkQ7DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWtld2lzZSB0aGVyZSBhcmUgdGhyZWUgZW50cmllcyBmb3IgZWFjaCBvZiByLCBnDQorICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGIuICBXZSBjb3VsZCBzZWxlY3QgdGhlIGVudHJ5IGJ5IHBvcGNvdW50IG9uDQorICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHRvcCB0d28gYml0cyBvbiB0aG9zZSBhcmNoaXRlY3R1cmVzIHRoYXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdXBwb3J0IGl0LCB0aGlzIGlzIHdoYXQgdGhlIGNvZGUgYmVsb3cgZG9lcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjcnVkZWx5Lg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYWNrX2kgPSBQTkdfQ01BUF9SR0JfQUxQSEFfQkFDS0dST1VORCsxOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgYXJlIGhvdyB0aGUgdmFsdWVzIG1hcDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIDB4MDAgLi4gMHgzZiAtPiAwDQorICAgICAgICAgICAgICAgICAgICAgICAgICogMHg0MCAuLiAweGJmIC0+IDENCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAweGMwIC4uIDB4ZmYgLT4gMg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICAgICAgICAgICAgICAgICAgICAgICAgICogU28sIGFzIGFib3ZlIHdpdGggdGhlIGV4cGxpY2l0IGFscGhhIGNoZWNrcywgdGhlDQorICAgICAgICAgICAgICAgICAgICAgICAgICogYnJlYWtwb2ludHMgYXJlIGF0IDY0IGFuZCAxOTYuDQorICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucm93WzBdICYgMHg4MCkgYmFja19pICs9IDk7IC8qIHJlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnJvd1swXSAmIDB4NDApIGJhY2tfaSArPSA5Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnJvd1swXSAmIDB4ODApIGJhY2tfaSArPSAzOyAvKiBncmVlbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnJvd1swXSAmIDB4NDApIGJhY2tfaSArPSAzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnJvd1swXSAmIDB4ODApIGJhY2tfaSArPSAxOyAvKiBibHVlICovDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucm93WzBdICYgMHg0MCkgYmFja19pICs9IDE7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgKm91dHJvdyA9IChwbmdfYnl0ZSliYWNrX2k7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGlucm93ICs9IDQ7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KKw0KKyAgIHJldHVybiAxOw0KK30NCisNCitzdGF0aWMgaW50DQorcG5nX2ltYWdlX3JlYWRfY29sb3JtYXBwZWQocG5nX3ZvaWRwIGFyZ3VtZW50KQ0KK3sNCisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wqLA0KKyAgICAgIGFyZ3VtZW50KTsNCisgICBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7DQorICAgcG5nX2NvbnRyb2xwIGNvbnRyb2wgPSBpbWFnZS0+b3BhcXVlOw0KKyAgIHBuZ19zdHJ1Y3RycCBwbmdfcHRyID0gY29udHJvbC0+cG5nX3B0cjsNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyID0gY29udHJvbC0+aW5mb19wdHI7DQorDQorICAgaW50IHBhc3NlcyA9IDA7IC8qIEFzIGEgZmxhZyAqLw0KKw0KKyAgIFBOR19TS0lQX0NIVU5LUyhwbmdfcHRyKTsNCisNCisgICAvKiBVcGRhdGUgdGhlICdpbmZvJyBzdHJ1Y3R1cmUgYW5kIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IGlzIGFzIHJlcXVpcmVkOyBmaXJzdA0KKyAgICAqIG1ha2Ugc3VyZSB0byB0dXJuIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxpbmcgaWYgaXQgd2lsbCBiZSByZXF1aXJlZA0KKyAgICAqIChiZWNhdXNlIGl0IGNhbid0IGJlIHR1cm5lZCBvbiAqYWZ0ZXIqIHRoZSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvISkNCisgICAgKi8NCisgICBpZiAoZGlzcGxheS0+Y29sb3JtYXBfcHJvY2Vzc2luZyA9PSBQTkdfQ01BUF9OT05FKQ0KKyAgICAgIHBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOw0KKw0KKyAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCisNCisgICAvKiBUaGUgZXhwZWN0ZWQgb3V0cHV0IGNhbiBiZSBkZWR1Y2VkIGZyb20gdGhlIGNvbG9ybWFwX3Byb2Nlc3Npbmcgb3B0aW9uLiAqLw0KKyAgIHN3aXRjaCAoZGlzcGxheS0+Y29sb3JtYXBfcHJvY2Vzc2luZykNCisgICB7DQorICAgICAgY2FzZSBQTkdfQ01BUF9OT05FOg0KKyAgICAgICAgIC8qIE91dHB1dCBtdXN0IGJlIG9uZSBjaGFubmVsIGFuZCBvbmUgYnl0ZSBwZXIgcGl4ZWwsIHRoZSBvdXRwdXQNCisgICAgICAgICAgKiBlbmNvZGluZyBjYW4gYmUgYW55dGhpbmcuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFIHx8DQorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkgJiYNCisgICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID09IDgpDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgZ290byBiYWRfb3V0cHV0Ow0KKw0KKyAgICAgIGNhc2UgUE5HX0NNQVBfVFJBTlM6DQorICAgICAgY2FzZSBQTkdfQ01BUF9HQToNCisgICAgICAgICAvKiBPdXRwdXQgbXVzdCBiZSB0d28gY2hhbm5lbHMgYW5kIHRoZSAnRycgb25lIG11c3QgYmUgc1JHQiwgdGhlIGxhdHRlcg0KKyAgICAgICAgICAqIGNhbiBiZSBjaGVja2VkIHdpdGggYW4gZXhhY3QgbnVtYmVyIGJlY2F1c2UgaXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQNCisgICAgICAgICAgKiB0byB0aGlzIG51bWJlciBhYm92ZSENCisgICAgICAgICAgKi8NCisgICAgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJg0KKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCAmJg0KKyAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA9PSBQTkdfR0FNTUFfc1JHQiAmJg0KKyAgICAgICAgICAgIGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzID09IDI1NikNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBnb3RvIGJhZF9vdXRwdXQ7DQorDQorICAgICAgY2FzZSBQTkdfQ01BUF9SR0I6DQorICAgICAgICAgLyogT3V0cHV0IG11c3QgYmUgOC1iaXQgc1JHQiBlbmNvZGVkIFJHQiAqLw0KKyAgICAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYNCisgICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID09IDggJiYNCisgICAgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPT0gUE5HX0dBTU1BX3NSR0IgJiYNCisgICAgICAgICAgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9PSAyMTYpDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgZ290byBiYWRfb3V0cHV0Ow0KKw0KKyAgICAgIGNhc2UgUE5HX0NNQVBfUkdCX0FMUEhBOg0KKyAgICAgICAgIC8qIE91dHB1dCBtdXN0IGJlIDgtYml0IHNSR0IgZW5jb2RlZCBSR0JBICovDQorICAgICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSAmJg0KKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCAmJg0KKyAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA9PSBQTkdfR0FNTUFfc1JHQiAmJg0KKyAgICAgICAgICAgIGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzID09IDI0NCAvKiAyMTYgKyAxICsgMjcgKi8pDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgLyogZ290byBiYWRfb3V0cHV0OyAqLw0KKyAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLw0KKw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgYmFkX291dHB1dDoNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImJhZCBjb2xvci1tYXAgcHJvY2Vzc2luZyAoaW50ZXJuYWwgZXJyb3IpIik7DQorICAgfQ0KKw0KKyAgIC8qIE5vdyByZWFkIHRoZSByb3dzLiAgRG8gdGhpcyBoZXJlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgZGlyZWN0bHkgaW50bw0KKyAgICAqIHRoZSBvdXRwdXQgYnVmZmVyLCBvdGhlcndpc2UgYWxsb2NhdGUgYSBsb2NhbCByb3cgYnVmZmVyIG9mIHRoZSBtYXhpbXVtDQorICAgICogc2l6ZSBsaWJwbmcgcmVxdWlyZXMgYW5kIGNhbGwgdGhlIHJlbGV2YW50IHByb2Nlc3Npbmcgcm91dGluZSBzYWZlbHkuDQorICAgICovDQorICAgew0KKyAgICAgIHBuZ192b2lkcCBmaXJzdF9yb3cgPSBkaXNwbGF5LT5idWZmZXI7DQorICAgICAgcHRyZGlmZl90IHJvd19ieXRlcyA9IGRpc3BsYXktPnJvd19zdHJpZGU7DQorDQorICAgICAgLyogVGhlIGZvbGxvd2luZyBleHByZXNzaW9uIGlzIGRlc2lnbmVkIHRvIHdvcmsgY29ycmVjdGx5IHdoZXRoZXIgaXQgZ2l2ZXMNCisgICAgICAgKiBhIHNpZ25lZCBvciBhbiB1bnNpZ25lZCByZXN1bHQuDQorICAgICAgICovDQorICAgICAgaWYgKHJvd19ieXRlcyA8IDApDQorICAgICAgew0KKyAgICAgICAgIGNoYXIgKnB0ciA9IHBuZ192b2lkY2FzdChjaGFyKiwgZmlyc3Rfcm93KTsNCisgICAgICAgICBwdHIgKz0gKGltYWdlLT5oZWlnaHQtMSkgKiAoLXJvd19ieXRlcyk7DQorICAgICAgICAgZmlyc3Rfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ192b2lkcCwgcHRyKTsNCisgICAgICB9DQorDQorICAgICAgZGlzcGxheS0+Zmlyc3Rfcm93ID0gZmlyc3Rfcm93Ow0KKyAgICAgIGRpc3BsYXktPnJvd19ieXRlcyA9IHJvd19ieXRlczsNCisgICB9DQorDQorICAgaWYgKHBhc3NlcyA9PSAwKQ0KKyAgIHsNCisgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgIHBuZ192b2lkcCByb3cgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKTsNCisNCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7DQorICAgICAgcmVzdWx0ID0gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfYW5kX21hcCwgZGlzcGxheSk7DQorICAgICAgZGlzcGxheS0+bG9jYWxfcm93ID0gTlVMTDsNCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3cpOw0KKw0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2FsbG9jX3NpemVfdCByb3dfYnl0ZXMgPSBkaXNwbGF5LT5yb3dfYnl0ZXM7DQorDQorICAgICAgd2hpbGUgKC0tcGFzc2VzID49IDApDQorICAgICAgew0KKyAgICAgICAgIHBuZ191aW50XzMyICAgICAgeSA9IGltYWdlLT5oZWlnaHQ7DQorICAgICAgICAgcG5nX2J5dGVwICAgICAgICByb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5maXJzdF9yb3cpOw0KKw0KKyAgICAgICAgIHdoaWxlICh5LS0gPiAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93LCBOVUxMKTsNCisgICAgICAgICAgICByb3cgKz0gcm93X2J5dGVzOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcmV0dXJuIDE7DQorICAgfQ0KK30NCisNCisvKiBKdXN0IHRoZSByb3cgcmVhZGluZyBwYXJ0IG9mIHBuZ19pbWFnZV9yZWFkLiAqLw0KK3N0YXRpYyBpbnQNCitwbmdfaW1hZ2VfcmVhZF9jb21wb3NpdGUocG5nX3ZvaWRwIGFyZ3VtZW50KQ0KK3sNCisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wqLA0KKyAgICAgIGFyZ3VtZW50KTsNCisgICBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7DQorICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOw0KKyAgIGludCBwYXNzZXM7DQorDQorICAgc3dpdGNoIChwbmdfcHRyLT5pbnRlcmxhY2VkKQ0KKyAgIHsNCisgICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToNCisgICAgICAgICBwYXNzZXMgPSAxOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoNCisgICAgICAgICBwYXNzZXMgPSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIHBhc3NlcyA9IDA7DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGludGVybGFjZSB0eXBlIik7DQorICAgfQ0KKw0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiAgaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsNCisgICAgICBwbmdfdWludF8zMiAgd2lkdGggPSBpbWFnZS0+d2lkdGg7DQorICAgICAgcHRyZGlmZl90ICAgIHN0ZXBfcm93ID0gZGlzcGxheS0+cm93X2J5dGVzOw0KKyAgICAgIHVuc2lnbmVkIGludCBjaGFubmVscyA9IChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSA/IDMgOiAxOw0KKyAgICAgIGludCBwYXNzOw0KKw0KKyAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykNCisgICAgICB7DQorICAgICAgICAgdW5zaWduZWQgaW50ICAgICBzdGFydHgsIHN0ZXB4LCBzdGVweTsNCisgICAgICAgICBwbmdfdWludF8zMiAgICAgIHk7DQorDQorICAgICAgICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhlIHJvdyBtYXkgYmUgZW1wdHkgZm9yIGEgc2hvcnQgaW1hZ2U6ICovDQorICAgICAgICAgICAgaWYgKFBOR19QQVNTX0NPTFMod2lkdGgsIHBhc3MpID09IDApDQorICAgICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgICAgc3RhcnR4ID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpICogY2hhbm5lbHM7DQorICAgICAgICAgICAgc3RlcHggPSBQTkdfUEFTU19DT0xfT0ZGU0VUKHBhc3MpICogY2hhbm5lbHM7DQorICAgICAgICAgICAgeSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsNCisgICAgICAgICAgICBzdGVweSA9IFBOR19QQVNTX1JPV19PRkZTRVQocGFzcyk7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICB7DQorICAgICAgICAgICAgeSA9IDA7DQorICAgICAgICAgICAgc3RhcnR4ID0gMDsNCisgICAgICAgICAgICBzdGVweCA9IGNoYW5uZWxzOw0KKyAgICAgICAgICAgIHN0ZXB5ID0gMTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZm9yICg7IHk8aGVpZ2h0OyB5ICs9IHN0ZXB5KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgaW5yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5sb2NhbF9yb3cpOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBvdXRyb3c7DQorICAgICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIGVuZF9yb3c7DQorDQorICAgICAgICAgICAgLyogUmVhZCB0aGUgcm93LCB3aGljaCBpcyBwYWNrZWQ6ICovDQorICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIGlucm93LCBOVUxMKTsNCisNCisgICAgICAgICAgICBvdXRyb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5maXJzdF9yb3cpOw0KKyAgICAgICAgICAgIG91dHJvdyArPSB5ICogc3RlcF9yb3c7DQorICAgICAgICAgICAgZW5kX3JvdyA9IG91dHJvdyArIHdpZHRoICogY2hhbm5lbHM7DQorDQorICAgICAgICAgICAgLyogTm93IGRvIHRoZSBjb21wb3NpdGlvbiBvbiBlYWNoIHBpeGVsIGluIHRoaXMgcm93LiAqLw0KKyAgICAgICAgICAgIG91dHJvdyArPSBzdGFydHg7DQorICAgICAgICAgICAgZm9yICg7IG91dHJvdyA8IGVuZF9yb3c7IG91dHJvdyArPSBzdGVweCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX2J5dGUgYWxwaGEgPSBpbnJvd1tjaGFubmVsc107DQorDQorICAgICAgICAgICAgICAgaWYgKGFscGhhID4gMCkgLyogZWxzZSBubyBjaGFuZ2UgdG8gdGhlIG91dHB1dCAqLw0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYzsNCisNCisgICAgICAgICAgICAgICAgICBmb3IgKGM9MDsgYzxjaGFubmVsczsgKytjKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSBpbnJvd1tjXTsNCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAyNTUpIC8qIGVsc2UganVzdCB1c2UgY29tcG9uZW50ICovDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgUE5HX09QVElNSVpFRF9BTFBIQSwgdGhlIGNvbXBvbmVudCB2YWx1ZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIGEgbGluZWFyIDgtYml0IHZhbHVlLiAgQ29tYmluZSB0aGlzIHdpdGggdGhlDQorICAgICAgICAgICAgICAgICAgICAgICAgICogY3VycmVudCBvdXRyb3dbY10gdmFsdWUgd2hpY2ggaXMgc1JHQiBlbmNvZGVkLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFyaXRobWV0aWMgaGVyZSBpcyAxNi1iaXRzIHRvIHByZXNlcnZlIHRoZSBvdXRwdXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZXMgY29ycmVjdGx5Lg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCAqPSAyNTcqMjU1OyAvKiA9NjU1MzUgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgKz0gKDI1NS1hbHBoYSkqcG5nX3NSR0JfdGFibGVbb3V0cm93W2NdXTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbyAnY29tcG9uZW50JyBpcyBzY2FsZWQgYnkgMjU1KjY1NTM1IGFuZCBpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHNSR0IgdG8gbGluZWFyDQorICAgICAgICAgICAgICAgICAgICAgICAgICogY29udmVyc2lvbiB0YWJsZS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihjb21wb25lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbY10gPSAocG5nX2J5dGUpY29tcG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgaW5yb3cgKz0gY2hhbm5lbHMrMTsgLyogY29tcG9uZW50cyBhbmQgYWxwaGEgY2hhbm5lbCAqLw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gMTsNCit9DQorDQorLyogVGhlIGRvX2xvY2FsX2JhY2tncm91bmQgY2FzZTsgY2FsbGVkIHdoZW4gYWxsIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtcyBhcmUgdG8NCisgKiBiZSBkb25lOg0KKyAqDQorICogUE5HX1JHQl9UT19HUkFZDQorICogUE5HX0NPTVBPU0lURQ0KKyAqIFBOR19HQU1NQQ0KKyAqDQorICogVGhpcyBpcyBhIHdvcmstcm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgUE5HX1JHQl9UT19HUkFZIGFuZA0KKyAqIFBOR19DT01QT1NJVEUgY29kZSBwZXJmb3JtcyBnYW1tYSBjb3JyZWN0aW9uLCBzbyB3ZSBnZXQgZG91YmxlIGdhbW1hDQorICogY29ycmVjdGlvbi4gIFRoZSBmaXgtdXAgaXMgdG8gcHJldmVudCB0aGUgUE5HX0NPTVBPU0lURSBvcGVyYXRpb24gaGFwcGVuaW5nDQorICogaW5zaWRlIGxpYnBuZywgc28gdGhpcyByb3V0aW5lIHNlZXMgYW4gOCBvciAxNi1iaXQgZ3JheSthbHBoYSByb3cgYW5kIGhhbmRsZXMNCisgKiB0aGUgcmVtb3ZhbCBvciBwcmUtbXVsdGlwbGljYXRpb24gb2YgdGhlIGFscGhhIGNoYW5uZWwuDQorICovDQorc3RhdGljIGludA0KK3BuZ19pbWFnZV9yZWFkX2JhY2tncm91bmQocG5nX3ZvaWRwIGFyZ3VtZW50KQ0KK3sNCisgICBwbmdfaW1hZ2VfcmVhZF9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wqLA0KKyAgICAgIGFyZ3VtZW50KTsNCisgICBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7DQorICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOw0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIgPSBpbWFnZS0+b3BhcXVlLT5pbmZvX3B0cjsNCisgICBwbmdfdWludF8zMiBoZWlnaHQgPSBpbWFnZS0+aGVpZ2h0Ow0KKyAgIHBuZ191aW50XzMyIHdpZHRoID0gaW1hZ2UtPndpZHRoOw0KKyAgIGludCBwYXNzLCBwYXNzZXM7DQorDQorICAgLyogRG91YmxlIGNoZWNrIHRoZSBjb252b2x1dGVkIGxvZ2ljIGJlbG93LiAgV2UgZXhwZWN0IHRvIGdldCBoZXJlIHdpdGgNCisgICAgKiBsaWJwbmcgZG9pbmcgcmdiIHRvIGdyYXkgYW5kIGdhbW1hIGNvcnJlY3Rpb24gYnV0IGJhY2tncm91bmQgcHJvY2Vzc2luZw0KKyAgICAqIGxlZnQgdG8gdGhlIHBuZ19pbWFnZV9yZWFkX2JhY2tncm91bmQgZnVuY3Rpb24uICBUaGUgcm93cyBsaWJwbmcgcHJvZHVjZQ0KKyAgICAqIG1pZ2h0IGJlIDggb3IgMTYtYml0IGJ1dCBzaG91bGQgYWx3YXlzIGhhdmUgdHdvIGNoYW5uZWxzOyBncmF5IHBsdXMgYWxwaGEuDQorICAgICovDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpID09IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJsb3N0IHJnYiB0byBncmF5Iik7DQorDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgIT0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVuZXhwZWN0ZWQgY29tcG9zZSIpOw0KKw0KKyAgIGlmIChwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKSAhPSAyKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAibG9zdC9nYWluZWQgY2hhbm5lbHMiKTsNCisNCisgICAvKiBFeHBlY3QgdGhlIDgtYml0IGNhc2UgdG8gYWx3YXlzIHJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLw0KKyAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpID09IDAgJiYNCisgICAgICAoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVuZXhwZWN0ZWQgOC1iaXQgdHJhbnNmb3JtYXRpb24iKTsNCisNCisgICBzd2l0Y2ggKHBuZ19wdHItPmludGVybGFjZWQpDQorICAgew0KKyAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9OT05FOg0KKyAgICAgICAgIHBhc3NlcyA9IDE7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfSU5URVJMQUNFX0FEQU03Og0KKyAgICAgICAgIHBhc3NlcyA9IFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgcGFzc2VzID0gMDsNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVua25vd24gaW50ZXJsYWNlIHR5cGUiKTsNCisgICB9DQorDQorICAgc3dpdGNoIChwbmdfZ2V0X2JpdF9kZXB0aChwbmdfcHRyLCBpbmZvX3B0cikpDQorICAgew0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ1bmV4cGVjdGVkIGJpdCBkZXB0aCIpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgODoNCisgICAgICAgICAvKiA4LWJpdCBzUkdCIGdyYXkgdmFsdWVzIHdpdGggYW4gYWxwaGEgY2hhbm5lbDsgdGhlIGFscGhhIGNoYW5uZWwgaXMNCisgICAgICAgICAgKiB0byBiZSByZW1vdmVkIGJ5IGNvbXBvc2luZyBvbiBhIGJhY2tncm91bmRpOiBlaXRoZXIgdGhlIHJvdyBpZg0KKyAgICAgICAgICAqIGRpc3BsYXktPmJhY2tncm91bmQgaXMgTlVMTCBvciBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5ncmVlbiBpZiBub3QuDQorICAgICAgICAgICogVW5saWtlIHRoZSBjb2RlIGFib3ZlIEFMUEhBX09QVElNSVpFRCBoYXMgKm5vdCogYmVlbiBkb25lLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZmlyc3Rfcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgZGlzcGxheS0+Zmlyc3Rfcm93KTsNCisgICAgICAgICAgICBwdHJkaWZmX3Qgc3RlcF9yb3cgPSBkaXNwbGF5LT5yb3dfYnl0ZXM7DQorDQorICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IHBhc3NlczsgKytwYXNzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgICAgICAgIHJvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS0+Zmlyc3Rfcm93KTsNCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHN0YXJ0eCwgc3RlcHgsIHN0ZXB5Ow0KKyAgICAgICAgICAgICAgIHBuZ191aW50XzMyICAgICAgeTsNCisNCisgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAvKiBUaGUgcm93IG1heSBiZSBlbXB0eSBmb3IgYSBzaG9ydCBpbWFnZTogKi8NCisgICAgICAgICAgICAgICAgICBpZiAoUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICAgICAgICAgICBzdGFydHggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7DQorICAgICAgICAgICAgICAgICAgc3RlcHggPSBQTkdfUEFTU19DT0xfT0ZGU0VUKHBhc3MpOw0KKyAgICAgICAgICAgICAgICAgIHkgPSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcyk7DQorICAgICAgICAgICAgICAgICAgc3RlcHkgPSBQTkdfUEFTU19ST1dfT0ZGU0VUKHBhc3MpOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHkgPSAwOw0KKyAgICAgICAgICAgICAgICAgIHN0YXJ0eCA9IDA7DQorICAgICAgICAgICAgICAgICAgc3RlcHggPSBzdGVweSA9IDE7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LT5iYWNrZ3JvdW5kID09IE5VTEwpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGZvciAoOyB5PGhlaWdodDsgeSArPSBzdGVweSkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIGlucm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwNCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBvdXRyb3cgPSBmaXJzdF9yb3cgKyB5ICogc3RlcF9yb3c7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIGVuZF9yb3cgPSBvdXRyb3cgKyB3aWR0aDsNCisNCisgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSByb3csIHdoaWNoIGlzIHBhY2tlZDogKi8NCisgICAgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgaW5yb3csIE5VTEwpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkbyB0aGUgY29tcG9zaXRpb24gb24gZWFjaCBwaXhlbCBpbiB0aGlzIHJvdy4gKi8NCisgICAgICAgICAgICAgICAgICAgICBvdXRyb3cgKz0gc3RhcnR4Ow0KKyAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBvdXRyb3cgPCBlbmRfcm93OyBvdXRyb3cgKz0gc3RlcHgpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGFscGhhID0gaW5yb3dbMV07DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID4gMCkgLyogZWxzZSBubyBjaGFuZ2UgdG8gdGhlIG91dHB1dCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSBpbnJvd1swXTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAyNTUpIC8qIGVsc2UganVzdCB1c2UgY29tcG9uZW50ICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpbmNlIFBOR19PUFRJTUlaRURfQUxQSEEgd2FzIG5vdCBzZXQgaXQgaXMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZWNlc3NhcnkgdG8gaW52ZXJ0IHRoZSBzUkdCIHRyYW5zZmVyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gYW5kIG11bHRpcGx5IHRoZSBhbHBoYSBvdXQuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gcG5nX3NSR0JfdGFibGVbY29tcG9uZW50XSAqIGFscGhhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCArPSBwbmdfc1JHQl90YWJsZVtvdXRyb3dbMF1dICoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjU1LWFscGhhKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihjb21wb25lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbMF0gPSAocG5nX2J5dGUpY29tcG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnJvdyArPSAyOyAvKiBncmF5IGFuZCBhbHBoYSBjaGFubmVsICovDQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZSAvKiBjb25zdGFudCBiYWNrZ3JvdW5kIHZhbHVlICovDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJhY2tncm91bmQ4ID0gZGlzcGxheS0+YmFja2dyb3VuZC0+Z3JlZW47DQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYmFja2dyb3VuZCA9IHBuZ19zUkdCX3RhYmxlW2JhY2tncm91bmQ4XTsNCisNCisgICAgICAgICAgICAgICAgICBmb3IgKDsgeTxoZWlnaHQ7IHkgKz0gc3RlcHkpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBpbnJvdyA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS0+bG9jYWxfcm93KTsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgb3V0cm93ID0gZmlyc3Rfcm93ICsgeSAqIHN0ZXBfcm93Ow0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF9ieXRlcCBlbmRfcm93ID0gb3V0cm93ICsgd2lkdGg7DQorDQorICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgcm93LCB3aGljaCBpcyBwYWNrZWQ6ICovDQorICAgICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIGlucm93LCBOVUxMKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZG8gdGhlIGNvbXBvc2l0aW9uIG9uIGVhY2ggcGl4ZWwgaW4gdGhpcyByb3cuICovDQorICAgICAgICAgICAgICAgICAgICAgb3V0cm93ICs9IHN0YXJ0eDsNCisgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBhbHBoYSA9IGlucm93WzFdOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA+IDApIC8qIGVsc2UgdXNlIGJhY2tncm91bmQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgY29tcG9uZW50ID0gaW5yb3dbMF07DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgMjU1KSAvKiBlbHNlIGp1c3QgdXNlIGNvbXBvbmVudCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBwbmdfc1JHQl90YWJsZVtjb21wb25lbnRdICogYWxwaGE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ICs9IGJhY2tncm91bmQgKiAoMjU1LWFscGhhKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihjb21wb25lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbMF0gPSAocG5nX2J5dGUpY29tcG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cm93WzBdID0gYmFja2dyb3VuZDg7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaW5yb3cgKz0gMjsgLyogZ3JheSBhbmQgYWxwaGEgY2hhbm5lbCAqLw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICByb3cgKz0gZGlzcGxheS0+cm93X2J5dGVzOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIDE2Og0KKyAgICAgICAgIC8qIDE2LWJpdCBsaW5lYXIgd2l0aCBwcmUtbXVsdGlwbGllZCBhbHBoYTsgdGhlIHByZS1tdWx0aXBsaWNhdGlvbiBtdXN0DQorICAgICAgICAgICogc3RpbGwgYmUgZG9uZSBhbmQsIG1heWJlLCB0aGUgYWxwaGEgY2hhbm5lbCByZW1vdmVkLiAgVGhpcyBjb2RlIGFsc28NCisgICAgICAgICAgKiBoYW5kbGVzIHRoZSBhbHBoYS1maXJzdCBvcHRpb24uDQorICAgICAgICAgICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ191aW50XzE2cCBmaXJzdF9yb3cgPSBwbmdfdm9pZGNhc3QocG5nX3VpbnRfMTZwLA0KKyAgICAgICAgICAgICAgIGRpc3BsYXktPmZpcnN0X3Jvdyk7DQorICAgICAgICAgICAgLyogVGhlIGRpdmlzaW9uIGJ5IHR3byBpcyBzYWZlIGJlY2F1c2UgdGhlIGNhbGxlciBwYXNzZWQgaW4gYQ0KKyAgICAgICAgICAgICAqIHN0cmlkZSB3aGljaCB3YXMgbXVsdGlwbGllZCBieSAyIChiZWxvdykgdG8gZ2V0IHJvd19ieXRlcy4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBwdHJkaWZmX3QgICAgc3RlcF9yb3cgPSBkaXNwbGF5LT5yb3dfYnl0ZXMgLyAyOw0KKyAgICAgICAgICAgIGludCBwcmVzZXJ2ZV9hbHBoYSA9IChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSAhPSAwOw0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvdXRjaGFubmVscyA9IDErcHJlc2VydmVfYWxwaGE7DQorICAgICAgICAgICAgaW50IHN3YXBfYWxwaGEgPSAwOw0KKw0KKyAgICAgICAgICAgIGlmIChwcmVzZXJ2ZV9hbHBoYSAmJiAoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpKQ0KKyAgICAgICAgICAgICAgIHN3YXBfYWxwaGEgPSAxOw0KKw0KKyAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBzdGFydHgsIHN0ZXB4LCBzdGVweTsNCisgICAgICAgICAgICAgICBwbmdfdWludF8zMiAgICAgIHk7DQorDQorICAgICAgICAgICAgICAgLyogVGhlICd4JyBzdGFydCBhbmQgc3RlcCBhcmUgYWRqdXN0ZWQgdG8gb3V0cHV0IGNvbXBvbmVudHMgaGVyZS4NCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAvKiBUaGUgcm93IG1heSBiZSBlbXB0eSBmb3IgYSBzaG9ydCBpbWFnZTogKi8NCisgICAgICAgICAgICAgICAgICBpZiAoUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICAgICAgICAgICBzdGFydHggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcykgKiBvdXRjaGFubmVsczsNCisgICAgICAgICAgICAgICAgICBzdGVweCA9IFBOR19QQVNTX0NPTF9PRkZTRVQocGFzcykgKiBvdXRjaGFubmVsczsNCisgICAgICAgICAgICAgICAgICB5ID0gUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpOw0KKyAgICAgICAgICAgICAgICAgIHN0ZXB5ID0gUE5HX1BBU1NfUk9XX09GRlNFVChwYXNzKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICB5ID0gMDsNCisgICAgICAgICAgICAgICAgICBzdGFydHggPSAwOw0KKyAgICAgICAgICAgICAgICAgIHN0ZXB4ID0gb3V0Y2hhbm5lbHM7DQorICAgICAgICAgICAgICAgICAgc3RlcHkgPSAxOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBmb3IgKDsgeTxoZWlnaHQ7IHkgKz0gc3RlcHkpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHBuZ19jb25zdF91aW50XzE2cCBpbnJvdzsNCisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNnAgb3V0cm93ID0gZmlyc3Rfcm93ICsgeSpzdGVwX3JvdzsNCisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNnAgZW5kX3JvdyA9IG91dHJvdyArIHdpZHRoICogb3V0Y2hhbm5lbHM7DQorDQorICAgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgcm93LCB3aGljaCBpcyBwYWNrZWQ6ICovDQorICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS0+bG9jYWxfcm93KSwgTlVMTCk7DQorICAgICAgICAgICAgICAgICAgaW5yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBkaXNwbGF5LT5sb2NhbF9yb3cpOw0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIE5vdyBkbyB0aGUgcHJlLW11bHRpcGxpY2F0aW9uIG9uIGVhY2ggcGl4ZWwgaW4gdGhpcyByb3cuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgb3V0cm93ICs9IHN0YXJ0eDsNCisgICAgICAgICAgICAgICAgICBmb3IgKDsgb3V0cm93IDwgZW5kX3Jvdzsgb3V0cm93ICs9IHN0ZXB4KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSBpbnJvd1swXTsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhbHBoYSA9IGlucm93WzFdOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA+IDApIC8qIGVsc2UgMCAqLw0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPCA2NTUzNSkgLyogZWxzZSBqdXN0IHVzZSBjb21wb25lbnQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ICo9IGFscGhhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCArPSAzMjc2NzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgLz0gNjU1MzU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gMDsNCisNCisgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbc3dhcF9hbHBoYV0gPSAocG5nX3VpbnRfMTYpY29tcG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZV9hbHBoYSkNCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRyb3dbMSBeIHN3YXBfYWxwaGFdID0gYWxwaGE7DQorDQorICAgICAgICAgICAgICAgICAgICAgaW5yb3cgKz0gMjsgLyogY29tcG9uZW50cyBhbmQgYWxwaGEgY2hhbm5lbCAqLw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICAgICBicmVhazsNCisgICB9DQorDQorICAgcmV0dXJuIDE7DQorfQ0KKw0KKy8qIFRoZSBndXRzIG9mIHBuZ19pbWFnZV9maW5pc2hfcmVhZCBhcyBhIHBuZ19zYWZlX2V4ZWN1dGUgY2FsbGJhY2suICovDQorc3RhdGljIGludA0KK3BuZ19pbWFnZV9yZWFkX2RpcmVjdChwbmdfdm9pZHAgYXJndW1lbnQpDQorew0KKyAgIHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3JlYWRfY29udHJvbCosDQorICAgICAgYXJndW1lbnQpOw0KKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsNCisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7DQorICAgcG5nX2luZm9ycCBpbmZvX3B0ciA9IGltYWdlLT5vcGFxdWUtPmluZm9fcHRyOw0KKw0KKyAgIHBuZ191aW50XzMyIGZvcm1hdCA9IGltYWdlLT5mb3JtYXQ7DQorICAgaW50IGxpbmVhciA9IChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSAhPSAwOw0KKyAgIGludCBkb19sb2NhbF9jb21wb3NlID0gMDsNCisgICBpbnQgZG9fbG9jYWxfYmFja2dyb3VuZCA9IDA7IC8qIHRvIGF2b2lkIGRvdWJsZSBnYW1tYSBjb3JyZWN0aW9uIGJ1ZyAqLw0KKyAgIGludCBwYXNzZXMgPSAwOw0KKw0KKyAgIC8qIEFkZCB0cmFuc2Zvcm1zIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBvdXRwdXQgZm9ybWF0IGlzIHByb2R1Y2VkIHRoZW4gY2hlY2sNCisgICAgKiB0aGF0IHRoZSByZXF1aXJlZCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGlzIHRoZXJlLiAgQWx3YXlzIGV4cGFuZDsgYWx3YXlzDQorICAgICogbmVlZCA4IGJpdHMgbWluaW11bSwgbm8gcGFsZXR0ZSBhbmQgZXhwYW5kZWQgdFJOUy4NCisgICAgKi8NCisgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsNCisNCisgICAvKiBOb3cgY2hlY2sgdGhlIGZvcm1hdCB0byBzZWUgaWYgaXQgd2FzIG1vZGlmaWVkLiAqLw0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiBiYXNlX2Zvcm1hdCA9IHBuZ19pbWFnZV9mb3JtYXQocG5nX3B0cikgJg0KKyAgICAgICAgIH5QTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgLyogcmVtb3ZlZCBieSBwbmdfc2V0X2V4cGFuZCAqLzsNCisgICAgICBwbmdfdWludF8zMiBjaGFuZ2UgPSBmb3JtYXQgXiBiYXNlX2Zvcm1hdDsNCisgICAgICBwbmdfZml4ZWRfcG9pbnQgb3V0cHV0X2dhbW1hOw0KKyAgICAgIGludCBtb2RlOyAvKiBhbHBoYSBtb2RlICovDQorDQorICAgICAgLyogRG8gdGhpcyBmaXJzdCBzbyB0aGF0IHdlIGhhdmUgYSByZWNvcmQgaWYgcmdiIHRvIGdyYXkgaXMgaGFwcGVuaW5nLiAqLw0KKyAgICAgIGlmIChjaGFuZ2UgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpDQorICAgICAgew0KKyAgICAgICAgIC8qIGdyYXk8LT5jb2xvciB0cmFuc2Zvcm1hdGlvbiByZXF1aXJlZC4gKi8NCisgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKQ0KKyAgICAgICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBsaWJwbmcgY2FuJ3QgZG8gYm90aCByZ2IgdG8gZ3JheSBhbmQNCisgICAgICAgICAgICAgKiBiYWNrZ3JvdW5kL3ByZS1tdWx0aXBsaWNhdGlvbiBpZiB0aGVyZSBpcyBhbHNvIHNpZ25pZmljYW50IGdhbW1hDQorICAgICAgICAgICAgICogY29ycmVjdGlvbiwgYmVjYXVzZSBib3RoIG9wZXJhdGlvbnMgcmVxdWlyZSBsaW5lYXIgY29sb3JzIGFuZA0KKyAgICAgICAgICAgICAqIHRoZSBjb2RlIG9ubHkgc3VwcG9ydHMgb25lIHRyYW5zZm9ybSBkb2luZyB0aGUgZ2FtbWEgY29ycmVjdGlvbi4NCisgICAgICAgICAgICAgKiBIYW5kbGUgdGhpcyBieSBkb2luZyB0aGUgcHJlLW11bHRpcGxpY2F0aW9uIG9yIGJhY2tncm91bmQNCisgICAgICAgICAgICAgKiBvcGVyYXRpb24gaW4gdGhpcyBjb2RlLCBpZiBuZWNlc3NhcnkuDQorICAgICAgICAgICAgICoNCisgICAgICAgICAgICAgKiBUT0RPOiBmaXggdGhpcyBieSByZXdyaXRpbmcgcG5ncnRyYW4uYyAoISkNCisgICAgICAgICAgICAgKg0KKyAgICAgICAgICAgICAqIEZvciB0aGUgbW9tZW50IChnaXZlbiB0aGF0IGZpeGluZyB0aGlzIGluIHBuZ3J0cmFuLmMgaXMgYW4NCisgICAgICAgICAgICAgKiBlbm9ybW91cyBjaGFuZ2UpICdkb19sb2NhbF9iYWNrZ3JvdW5kJyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQNCisgICAgICAgICAgICAgKiB0aGUgcHJvYmxlbSBleGlzdHMuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKGJhc2VfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQ0KKyAgICAgICAgICAgICAgIGRvX2xvY2FsX2JhY2tncm91bmQgPSAxLyptYXliZSovOw0KKw0KKyAgICAgICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3B0ciwgUE5HX0VSUk9SX0FDVElPTl9OT05FLA0KKyAgICAgICAgICAgICAgIFBOR19SR0JfVE9fR1JBWV9ERUZBVUxULCBQTkdfUkdCX1RPX0dSQVlfREVGQVVMVCk7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNoYW5nZSAmPSB+UE5HX0ZPUk1BVF9GTEFHX0NPTE9SOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBTZXQgdGhlIGdhbW1hIGFwcHJvcHJpYXRlbHksIGxpbmVhciBmb3IgMTYtYml0IGlucHV0LCBzUkdCIG90aGVyd2lzZS4NCisgICAgICAgKi8NCisgICAgICB7DQorICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGlucHV0X2dhbW1hX2RlZmF1bHQ7DQorDQorICAgICAgICAgaWYgKChiYXNlX2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpICYmDQorICAgICAgICAgICAgKGltYWdlLT5mbGFncyAmIFBOR19JTUFHRV9GTEFHXzE2QklUX3NSR0IpID09IDApDQorICAgICAgICAgICAgaW5wdXRfZ2FtbWFfZGVmYXVsdCA9IFBOR19HQU1NQV9MSU5FQVI7DQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGlucHV0X2dhbW1hX2RlZmF1bHQgPSBQTkdfREVGQVVMVF9zUkdCOw0KKw0KKyAgICAgICAgIC8qIENhbGwgcG5nX3NldF9hbHBoYV9tb2RlIHRvIHNldCB0aGUgZGVmYXVsdCBmb3IgdGhlIGlucHV0IGdhbW1hOyB0aGUNCisgICAgICAgICAgKiBvdXRwdXQgZ2FtbWEgaXMgc2V0IGJ5IGEgc2Vjb25kIGNhbGwgYmVsb3cuDQorICAgICAgICAgICovDQorICAgICAgICAgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkKHBuZ19wdHIsIFBOR19BTFBIQV9QTkcsIGlucHV0X2dhbW1hX2RlZmF1bHQpOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAobGluZWFyKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBJZiB0aGVyZSAqaXMqIGFuIGFscGhhIGNoYW5uZWwgaW4gdGhlIGlucHV0IGl0IG11c3QgYmUgbXVsdGlwbGllZA0KKyAgICAgICAgICAqIG91dDsgdXNlIFBOR19BTFBIQV9TVEFOREFSRCwgb3RoZXJ3aXNlIGp1c3QgdXNlIFBOR19BTFBIQV9QTkcuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKGJhc2VfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQ0KKyAgICAgICAgICAgIG1vZGUgPSBQTkdfQUxQSEFfU1RBTkRBUkQ7IC8qIGFzc29jaWF0ZWQgYWxwaGEgKi8NCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgbW9kZSA9IFBOR19BTFBIQV9QTkc7DQorDQorICAgICAgICAgb3V0cHV0X2dhbW1hID0gUE5HX0dBTU1BX0xJTkVBUjsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBtb2RlID0gUE5HX0FMUEhBX1BORzsNCisgICAgICAgICBvdXRwdXRfZ2FtbWEgPSBQTkdfREVGQVVMVF9zUkdCOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBJZiAnZG9fbG9jYWxfYmFja2dyb3VuZCcgaXMgc2V0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgZ2FtbWENCisgICAgICAgKiBjb3JyZWN0aW9uOyB0aGlzIGlzIHBhcnQgb2YgdGhlIHdvcmstcm91bmQgZm9yIHRoZSBsaWJwbmcgYnVnDQorICAgICAgICogZGVzY3JpYmVkIGFib3ZlLg0KKyAgICAgICAqDQorICAgICAgICogVE9ETzogZml4IGxpYnBuZyBhbmQgcmVtb3ZlIHRoaXMuDQorICAgICAgICovDQorICAgICAgaWYgKGRvX2xvY2FsX2JhY2tncm91bmQpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19maXhlZF9wb2ludCBndGVzdDsNCisNCisgICAgICAgICAvKiBUaGlzIGlzICdwbmdfZ2FtbWFfdGhyZXNob2xkJyBmcm9tIHBuZ3J0cmFuLmM7IHRoZSB0ZXN0IHVzZWQgZm9yDQorICAgICAgICAgICogZ2FtbWEgY29ycmVjdGlvbiwgdGhlIHNjcmVlbiBnYW1tYSBoYXNuJ3QgYmVlbiBzZXQgb24gcG5nX3N0cnVjdA0KKyAgICAgICAgICAqIHlldDsgaXQncyBzZXQgYmVsb3cuICBwbmdfc3RydWN0OjpnYW1tYSwgaG93ZXZlciwgaXMgc2V0IHRvIHRoZQ0KKyAgICAgICAgICAqIGZpbmFsIHZhbHVlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChwbmdfbXVsZGl2KCZndGVzdCwgb3V0cHV0X2dhbW1hLCBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hLA0KKyAgICAgICAgICAgICAgIFBOR19GUF8xKSAmJiAhcG5nX2dhbW1hX3NpZ25pZmljYW50KGd0ZXN0KSkNCisgICAgICAgICAgICBkb19sb2NhbF9iYWNrZ3JvdW5kID0gMDsNCisNCisgICAgICAgICBlbHNlIGlmIChtb2RlID09IFBOR19BTFBIQV9TVEFOREFSRCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgZG9fbG9jYWxfYmFja2dyb3VuZCA9IDIvKnJlcXVpcmVkKi87DQorICAgICAgICAgICAgbW9kZSA9IFBOR19BTFBIQV9QTkc7IC8qIHByZXZlbnQgbGlicG5nIGRvaW5nIGl0ICovDQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIC8qIGVsc2UgbGVhdmUgYXMgMSBmb3IgdGhlIGNoZWNrcyBiZWxvdyAqLw0KKyAgICAgIH0NCisNCisgICAgICAvKiBJZiB0aGUgYml0LWRlcHRoIGNoYW5nZXMgdGhlbiBoYW5kbGUgdGhhdCBoZXJlLiAqLw0KKyAgICAgIGlmIChjaGFuZ2UgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAobGluZWFyIC8qMTYtYml0IG91dHB1dCovKQ0KKyAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kXzE2KHBuZ19wdHIpOw0KKw0KKyAgICAgICAgIGVsc2UgLyogOC1iaXQgb3V0cHV0ICovDQorICAgICAgICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsNCisNCisgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19MSU5FQVI7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIE5vdyB0aGUgYmFja2dyb3VuZC9hbHBoYSBjaGFubmVsIGNoYW5nZXMuICovDQorICAgICAgaWYgKGNoYW5nZSAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkNCisgICAgICB7DQorICAgICAgICAgLyogUmVtb3ZpbmcgYW4gYWxwaGEgY2hhbm5lbCByZXF1aXJlcyBjb21wb3NpdGlvbiBmb3IgdGhlIDgtYml0DQorICAgICAgICAgICogZm9ybWF0czsgZm9yIHRoZSAxNi1iaXQgaXQgaXMgYWxyZWFkeSBkb25lLCBhYm92ZSwgYnkgdGhlDQorICAgICAgICAgICogcHJlLW11bHRpcGxpY2F0aW9uIGFuZCB0aGUgY2hhbm5lbCBqdXN0IG5lZWRzIHRvIGJlIHN0cmlwcGVkLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChiYXNlX2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogSWYgUkdCLT5ncmF5IGlzIGhhcHBlbmluZyB0aGUgYWxwaGEgY2hhbm5lbCBtdXN0IGJlIGxlZnQgYW5kIHRoZQ0KKyAgICAgICAgICAgICAqIG9wZXJhdGlvbiBjb21wbGV0ZWQgbG9jYWxseS4NCisgICAgICAgICAgICAgKg0KKyAgICAgICAgICAgICAqIFRPRE86IGZpeCBsaWJwbmcgYW5kIHJlbW92ZSB0aGlzLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChkb19sb2NhbF9iYWNrZ3JvdW5kKQ0KKyAgICAgICAgICAgICAgIGRvX2xvY2FsX2JhY2tncm91bmQgPSAyLypyZXF1aXJlZCovOw0KKw0KKyAgICAgICAgICAgIC8qIDE2LWJpdCBvdXRwdXQ6IGp1c3QgcmVtb3ZlIHRoZSBjaGFubmVsICovDQorICAgICAgICAgICAgZWxzZSBpZiAobGluZWFyKSAvKiBjb21wb3NlIG9uIGJsYWNrICh3ZWxsLCBwcmUtbXVsdGlwbHkpICovDQorICAgICAgICAgICAgICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfcHRyKTsNCisNCisgICAgICAgICAgICAvKiA4LWJpdCBvdXRwdXQ6IGRvIGFuIGFwcHJvcHJpYXRlIGNvbXBvc2UgKi8NCisgICAgICAgICAgICBlbHNlIGlmIChkaXNwbGF5LT5iYWNrZ3JvdW5kICE9IE5VTEwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNiBjOw0KKw0KKyAgICAgICAgICAgICAgIGMuaW5kZXggPSAwOyAvKnVudXNlZCovDQorICAgICAgICAgICAgICAgYy5yZWQgPSBkaXNwbGF5LT5iYWNrZ3JvdW5kLT5yZWQ7DQorICAgICAgICAgICAgICAgYy5ncmVlbiA9IGRpc3BsYXktPmJhY2tncm91bmQtPmdyZWVuOw0KKyAgICAgICAgICAgICAgIGMuYmx1ZSA9IGRpc3BsYXktPmJhY2tncm91bmQtPmJsdWU7DQorICAgICAgICAgICAgICAgYy5ncmF5ID0gZGlzcGxheS0+YmFja2dyb3VuZC0+Z3JlZW47DQorDQorICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbHdheXMgYW4gOC1iaXQgc1JHQiB2YWx1ZSwgdXNpbmcgdGhlICdncmVlbicgY2hhbm5lbA0KKyAgICAgICAgICAgICAgICAqIGZvciBncmF5IGlzIG11Y2ggYmV0dGVyIHRoYW4gY2FsY3VsYXRpbmcgdGhlIGx1bWluYW5jZSBoZXJlOw0KKyAgICAgICAgICAgICAgICAqIHdlIGNhbiBnZXQgb2ZmLWJ5LW9uZSBlcnJvcnMgaW4gdGhhdCBjYWxjdWxhdGlvbiByZWxhdGl2ZSB0bw0KKyAgICAgICAgICAgICAgICAqIHRoZSBhcHAgZXhwZWN0YXRpb25zIGFuZCB0aGF0IHdpbGwgc2hvdyB1cCBpbiB0cmFuc3BhcmVudA0KKyAgICAgICAgICAgICAgICAqIHBpeGVscy4NCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQocG5nX3B0ciwgJmMsDQorICAgICAgICAgICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOLCAwLypuZWVkX2V4cGFuZCovLA0KKyAgICAgICAgICAgICAgICAgIDAvKmdhbW1hOiBub3QgdXNlZCovKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZSAvKiBjb21wb3NlIG9uIHJvdzogaW1wbGVtZW50ZWQgYmVsb3cuICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGRvX2xvY2FsX2NvbXBvc2UgPSAxOw0KKyAgICAgICAgICAgICAgIC8qIFRoaXMgbGVhdmVzIHRoZSBhbHBoYSBjaGFubmVsIGluIHRoZSBvdXRwdXQsIHNvIGl0IGhhcyB0byBiZQ0KKyAgICAgICAgICAgICAgICAqIHJlbW92ZWQgYnkgdGhlIGNvZGUgYmVsb3cuICBTZXQgdGhlIGVuY29kaW5nIHRvIHRoZSAnT1BUSU1JWkUnDQorICAgICAgICAgICAgICAgICogb25lIHNvIHRoZSBjb2RlIG9ubHkgaGFzIHRvIGhhY2sgb24gdGhlIHBpeGVscyB0aGF0IHJlcXVpcmUNCisgICAgICAgICAgICAgICAgKiBjb21wb3NpdGlvbi4NCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBtb2RlID0gUE5HX0FMUEhBX09QVElNSVpFRDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UgLyogb3V0cHV0IG5lZWRzIGFuIGFscGhhIGNoYW5uZWwgKi8NCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCBoYXBwZW5zIGJlZm9yZSB0aGUgc3dhcCBvcGVyYXRpb24gaGFzDQorICAgICAgICAgICAgICogYmVlbiBhY2NvbXBsaXNoZWQ7IGhvd2V2ZXIsIHRoZSBzd2FwIGRvZXMgKm5vdCogc3dhcCB0aGUgYWRkZWQNCisgICAgICAgICAgICAgKiBhbHBoYSBjaGFubmVsICh3ZWlyZCBBUEkpLCBzbyBpdCBtdXN0IGJlIGFkZGVkIGluIHRoZSBjb3JyZWN0DQorICAgICAgICAgICAgICogcGxhY2UuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgZmlsbGVyOyAvKiBvcGFxdWUgZmlsbGVyICovDQorICAgICAgICAgICAgaW50IHdoZXJlOw0KKw0KKyAgICAgICAgICAgIGlmIChsaW5lYXIpDQorICAgICAgICAgICAgICAgZmlsbGVyID0gNjU1MzU7DQorDQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIGZpbGxlciA9IDI1NTsNCisNCisjICAgICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQNCisgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgd2hlcmUgPSBQTkdfRklMTEVSX0JFRk9SRTsNCisgICAgICAgICAgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19BRklSU1Q7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisjICAgICAgICAgICBlbmRpZg0KKyAgICAgICAgICAgICAgIHdoZXJlID0gUE5HX0ZJTExFUl9BRlRFUjsNCisNCisgICAgICAgICAgICBwbmdfc2V0X2FkZF9hbHBoYShwbmdfcHRyLCBmaWxsZXIsIHdoZXJlKTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgLyogVGhpcyBzdG9wcyB0aGUgKGlycmVsZXZhbnQpIGNhbGwgdG8gc3dhcF9hbHBoYSBiZWxvdy4gKi8NCisgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19BTFBIQTsNCisgICAgICB9DQorDQorICAgICAgLyogTm93IHNldCB0aGUgYWxwaGEgbW9kZSBjb3JyZWN0bHk7IHRoaXMgaXMgYWx3YXlzIGRvbmUsIGV2ZW4gaWYgdGhlcmUgaXMNCisgICAgICAgKiBubyBhbHBoYSBjaGFubmVsIGluIGVpdGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBiZWNhdXNlIGl0IGNvcnJlY3RseQ0KKyAgICAgICAqIHNldHMgdGhlIG91dHB1dCBnYW1tYS4NCisgICAgICAgKi8NCisgICAgICBwbmdfc2V0X2FscGhhX21vZGVfZml4ZWQocG5nX3B0ciwgbW9kZSwgb3V0cHV0X2dhbW1hKTsNCisNCisjICAgICBpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQNCisgICAgICAgICBpZiAoY2hhbmdlICYgUE5HX0ZPUk1BVF9GTEFHX0JHUikNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogQ2hlY2sgb25seSB0aGUgb3V0cHV0IGZvcm1hdDsgUE5HIGlzIG5ldmVyIEJHUjsgZG9uJ3QgZG8gdGhpcyBpZg0KKyAgICAgICAgICAgICAqIHRoZSBvdXRwdXQgaXMgZ3JheSwgYnV0IGZpeCB1cCB0aGUgJ2Zvcm1hdCcgdmFsdWUgaW4gdGhhdCBjYXNlLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpDQorICAgICAgICAgICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7DQorDQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIGZvcm1hdCAmPSB+UE5HX0ZPUk1BVF9GTEFHX0JHUjsNCisNCisgICAgICAgICAgICBjaGFuZ2UgJj0gflBOR19GT1JNQVRfRkxBR19CR1I7DQorICAgICAgICAgfQ0KKyMgICAgIGVuZGlmDQorDQorIyAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVEDQorICAgICAgICAgaWYgKGNoYW5nZSAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIE9ubHkgcmVsZXZhbnQgaWYgdGhlcmUgaXMgYW4gYWxwaGEgY2hhbm5lbCAtIGl0J3MgcGFydGljdWxhcmx5DQorICAgICAgICAgICAgICogaW1wb3J0YW50IHRvIGhhbmRsZSB0aGlzIGNvcnJlY3RseSBiZWNhdXNlIGRvX2xvY2FsX2NvbXBvc2UgbWF5DQorICAgICAgICAgICAgICogYmUgc2V0IGFib3ZlIGFuZCB0aGVuIGxpYnBuZyB3aWxsIGtlZXAgdGhlIGFscGhhIGNoYW5uZWwgZm9yIHRoaXMNCisgICAgICAgICAgICAgKiBjb2RlIHRvIHJlbW92ZS4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoaXMgaWYgZG9pbmcgYSBsb2NhbCBiYWNrZ3JvdW5kLA0KKyAgICAgICAgICAgICAgICAqIFRPRE86IHJlbW92ZSB0aGlzIHdoZW4gbG9jYWwgYmFja2dyb3VuZCBpcyBubyBsb25nZXIgcmVxdWlyZWQuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgaWYgKGRvX2xvY2FsX2JhY2tncm91bmQgIT0gMikNCisgICAgICAgICAgICAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICBmb3JtYXQgJj0gflBOR19GT1JNQVRfRkxBR19BRklSU1Q7DQorDQorICAgICAgICAgICAgY2hhbmdlICY9IH5QTkdfRk9STUFUX0ZMQUdfQUZJUlNUOw0KKyAgICAgICAgIH0NCisjICAgICBlbmRpZg0KKw0KKyAgICAgIC8qIElmIHRoZSAqb3V0cHV0KiBpcyAxNi1iaXQgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhIGJ5dGUtc3dhcCBvbiB0aGlzDQorICAgICAgICogYXJjaGl0ZWN0dXJlLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChsaW5lYXIpDQorICAgICAgew0KKyAgICAgICAgIFBOR19DT05TVCBwbmdfdWludF8xNiBsZSA9IDB4MDAwMTsNCisNCisgICAgICAgICBpZiAoKihwbmdfY29uc3RfYnl0ZXApJmxlKQ0KKyAgICAgICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsNCisgICAgICB9DQorDQorICAgICAgLyogSWYgY2hhbmdlIGlzIG5vdCBub3cgMCBzb21lIHRyYW5zZm9ybWF0aW9uIGlzIG1pc3NpbmcgLSBlcnJvciBvdXQuICovDQorICAgICAgaWYgKGNoYW5nZSkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19yZWFkX2ltYWdlOiB1bnN1cHBvcnRlZCB0cmFuc2Zvcm1hdGlvbiIpOw0KKyAgIH0NCisNCisgICBQTkdfU0tJUF9DSFVOS1MocG5nX3B0cik7DQorDQorICAgLyogVXBkYXRlIHRoZSAnaW5mbycgc3RydWN0dXJlIGFuZCBtYWtlIHN1cmUgdGhlIHJlc3VsdCBpcyBhcyByZXF1aXJlZDsgZmlyc3QNCisgICAgKiBtYWtlIHN1cmUgdG8gdHVybiBvbiB0aGUgaW50ZXJsYWNlIGhhbmRsaW5nIGlmIGl0IHdpbGwgYmUgcmVxdWlyZWQNCisgICAgKiAoYmVjYXVzZSBpdCBjYW4ndCBiZSB0dXJuZWQgb24gKmFmdGVyKiB0aGUgY2FsbCB0byBwbmdfcmVhZF91cGRhdGVfaW5mbyEpDQorICAgICoNCisgICAgKiBUT0RPOiByZW1vdmUgdGhlIGRvX2xvY2FsX2JhY2tncm91bmQgZml4dXAgYmVsb3cuDQorICAgICovDQorICAgaWYgKCFkb19sb2NhbF9jb21wb3NlICYmIGRvX2xvY2FsX2JhY2tncm91bmQgIT0gMikNCisgICAgICBwYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsNCisNCisgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorDQorICAgew0KKyAgICAgIHBuZ191aW50XzMyIGluZm9fZm9ybWF0ID0gMDsNCisNCisgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikNCisgICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQ09MT1I7DQorDQorICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpDQorICAgICAgew0KKyAgICAgICAgIC8qIGRvX2xvY2FsX2NvbXBvc2UgcmVtb3ZlcyB0aGlzIGNoYW5uZWwgYmVsb3cuICovDQorICAgICAgICAgaWYgKCFkb19sb2NhbF9jb21wb3NlKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBkb19sb2NhbF9iYWNrZ3JvdW5kIGRvZXMgdGhlIHNhbWUgaWYgcmVxdWlyZWQuICovDQorICAgICAgICAgICAgaWYgKGRvX2xvY2FsX2JhY2tncm91bmQgIT0gMiB8fA0KKyAgICAgICAgICAgICAgIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApDQorICAgICAgICAgICAgICAgaW5mb19mb3JtYXQgfD0gUE5HX0ZPUk1BVF9GTEFHX0FMUEhBOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAoZG9fbG9jYWxfY29tcG9zZSkgLyogaW50ZXJuYWwgZXJyb3IgKi8NCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19pbWFnZV9yZWFkOiBhbHBoYSBjaGFubmVsIGxvc3QiKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPmJpdF9kZXB0aCA9PSAxNikNCisgICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfTElORUFSOw0KKw0KKyMgICAgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRA0KKyAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKQ0KKyAgICAgICAgICAgIGluZm9fZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19CR1I7DQorIyAgICAgZW5kaWYNCisNCisjICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQNCisgICAgICAgICBpZiAoZG9fbG9jYWxfYmFja2dyb3VuZCA9PSAyKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkNCisgICAgICAgICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0FMUEhBKSAhPSAwIHx8DQorICAgICAgICAgICAgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQUREX0FMUEhBKSAhPSAwICYmDQorICAgICAgICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKSA9PSAwKSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGRvX2xvY2FsX2JhY2tncm91bmQgPT0gMikNCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInVuZXhwZWN0ZWQgYWxwaGEgc3dhcCB0cmFuc2Zvcm1hdGlvbiIpOw0KKw0KKyAgICAgICAgICAgIGluZm9fZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19BRklSU1Q7DQorICAgICAgICAgfQ0KKyMgICAgIGVuZGlmDQorDQorICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhbiBpbnRlcm5hbCBlcnJvci4gKi8NCisgICAgICBpZiAoaW5mb19mb3JtYXQgIT0gZm9ybWF0KQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX3JlYWRfaW1hZ2U6IGludmFsaWQgdHJhbnNmb3JtYXRpb25zIik7DQorICAgfQ0KKw0KKyAgIC8qIE5vdyByZWFkIHRoZSByb3dzLiAgSWYgZG9fbG9jYWxfY29tcG9zZSBpcyBzZXQgdGhlbiBpdCBpcyBuZWNlc3NhcnkgdG8gdXNlDQorICAgICogYSBsb2NhbCByb3cgYnVmZmVyLiAgVGhlIG91dHB1dCB3aWxsIGJlIEdBLCBSR0JBIG9yIEJHUkEgYW5kIG11c3QgYmUNCisgICAgKiBjb252ZXJ0ZWQgdG8gRywgUkdCIG9yIEJHUiBhcyBhcHByb3ByaWF0ZS4gIFRoZSAnbG9jYWxfcm93JyBtZW1iZXIgb2YgdGhlDQorICAgICogZGlzcGxheSBhY3RzIGFzIGEgZmxhZy4NCisgICAgKi8NCisgICB7DQorICAgICAgcG5nX3ZvaWRwIGZpcnN0X3JvdyA9IGRpc3BsYXktPmJ1ZmZlcjsNCisgICAgICBwdHJkaWZmX3Qgcm93X2J5dGVzID0gZGlzcGxheS0+cm93X3N0cmlkZTsNCisNCisgICAgICBpZiAobGluZWFyKQ0KKyAgICAgICAgIHJvd19ieXRlcyAqPSAyOw0KKw0KKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBpcyBkZXNpZ25lZCB0byB3b3JrIGNvcnJlY3RseSB3aGV0aGVyIGl0IGdpdmVzDQorICAgICAgICogYSBzaWduZWQgb3IgYW4gdW5zaWduZWQgcmVzdWx0Lg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChyb3dfYnl0ZXMgPCAwKQ0KKyAgICAgIHsNCisgICAgICAgICBjaGFyICpwdHIgPSBwbmdfdm9pZGNhc3QoY2hhciosIGZpcnN0X3Jvdyk7DQorICAgICAgICAgcHRyICs9IChpbWFnZS0+aGVpZ2h0LTEpICogKC1yb3dfYnl0ZXMpOw0KKyAgICAgICAgIGZpcnN0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfdm9pZHAsIHB0cik7DQorICAgICAgfQ0KKw0KKyAgICAgIGRpc3BsYXktPmZpcnN0X3JvdyA9IGZpcnN0X3JvdzsNCisgICAgICBkaXNwbGF5LT5yb3dfYnl0ZXMgPSByb3dfYnl0ZXM7DQorICAgfQ0KKw0KKyAgIGlmIChkb19sb2NhbF9jb21wb3NlKQ0KKyAgIHsNCisgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgIHBuZ192b2lkcCByb3cgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKTsNCisNCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7DQorICAgICAgcmVzdWx0ID0gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfY29tcG9zaXRlLCBkaXNwbGF5KTsNCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSBOVUxMOw0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHJvdyk7DQorDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICB9DQorDQorICAgZWxzZSBpZiAoZG9fbG9jYWxfYmFja2dyb3VuZCA9PSAyKQ0KKyAgIHsNCisgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgIHBuZ192b2lkcCByb3cgPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKTsNCisNCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7DQorICAgICAgcmVzdWx0ID0gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfYmFja2dyb3VuZCwgZGlzcGxheSk7DQorICAgICAgZGlzcGxheS0+bG9jYWxfcm93ID0gTlVMTDsNCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCByb3cpOw0KKw0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2FsbG9jX3NpemVfdCByb3dfYnl0ZXMgPSBkaXNwbGF5LT5yb3dfYnl0ZXM7DQorDQorICAgICAgd2hpbGUgKC0tcGFzc2VzID49IDApDQorICAgICAgew0KKyAgICAgICAgIHBuZ191aW50XzMyICAgICAgeSA9IGltYWdlLT5oZWlnaHQ7DQorICAgICAgICAgcG5nX2J5dGVwICAgICAgICByb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5maXJzdF9yb3cpOw0KKw0KKyAgICAgICAgIHdoaWxlICh5LS0gPiAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93LCBOVUxMKTsNCisgICAgICAgICAgICByb3cgKz0gcm93X2J5dGVzOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcmV0dXJuIDE7DQorICAgfQ0KK30NCisNCitpbnQgUE5HQVBJDQorcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKHBuZ19pbWFnZXAgaW1hZ2UsIHBuZ19jb25zdF9jb2xvcnAgYmFja2dyb3VuZCwNCisgICB2b2lkICpidWZmZXIsIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgdm9pZCAqY29sb3JtYXApDQorew0KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT52ZXJzaW9uID09IFBOR19JTUFHRV9WRVJTSU9OKQ0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiBjaGVjazsNCisNCisgICAgICBpZiAocm93X3N0cmlkZSA9PSAwKQ0KKyAgICAgICAgIHJvd19zdHJpZGUgPSBQTkdfSU1BR0VfUk9XX1NUUklERSgqaW1hZ2UpOw0KKw0KKyAgICAgIGlmIChyb3dfc3RyaWRlIDwgMCkNCisgICAgICAgICBjaGVjayA9IC1yb3dfc3RyaWRlOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBjaGVjayA9IHJvd19zdHJpZGU7DQorDQorICAgICAgaWYgKGltYWdlLT5vcGFxdWUgIT0gTlVMTCAmJiBidWZmZXIgIT0gTlVMTCAmJg0KKyAgICAgICAgIGNoZWNrID49IFBOR19JTUFHRV9ST1dfU1RSSURFKCppbWFnZSkpDQorICAgICAgew0KKyAgICAgICAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgPT0gMCB8fA0KKyAgICAgICAgICAgIChpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA+IDAgJiYgY29sb3JtYXAgIT0gTlVMTCkpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGludCByZXN1bHQ7DQorICAgICAgICAgICAgcG5nX2ltYWdlX3JlYWRfY29udHJvbCBkaXNwbGF5Ow0KKw0KKyAgICAgICAgICAgIG1lbXNldCgmZGlzcGxheSwgMCwgKHNpemVvZiBkaXNwbGF5KSk7DQorICAgICAgICAgICAgZGlzcGxheS5pbWFnZSA9IGltYWdlOw0KKyAgICAgICAgICAgIGRpc3BsYXkuYnVmZmVyID0gYnVmZmVyOw0KKyAgICAgICAgICAgIGRpc3BsYXkucm93X3N0cmlkZSA9IHJvd19zdHJpZGU7DQorICAgICAgICAgICAgZGlzcGxheS5jb2xvcm1hcCA9IGNvbG9ybWFwOw0KKyAgICAgICAgICAgIGRpc3BsYXkuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7DQorICAgICAgICAgICAgZGlzcGxheS5sb2NhbF9yb3cgPSBOVUxMOw0KKw0KKyAgICAgICAgICAgIC8qIENob29zZSB0aGUgY29ycmVjdCAnZW5kJyByb3V0aW5lOyBmb3IgdGhlIGNvbG9yLW1hcCBjYXNlIGFsbCB0aGUNCisgICAgICAgICAgICAgKiBzZXR1cCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApDQorICAgICAgICAgICAgICAgcmVzdWx0ID0NCisgICAgICAgICAgICAgICAgICBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcCwgJmRpc3BsYXkpICYmDQorICAgICAgICAgICAgICAgICAgcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfY29sb3JtYXBwZWQsICZkaXNwbGF5KTsNCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgcmVzdWx0ID0NCisgICAgICAgICAgICAgICAgICBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9kaXJlY3QsICZkaXNwbGF5KTsNCisNCisgICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZShpbWFnZSk7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsDQorICAgICAgICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZFtjb2xvci1tYXBdOiBubyBjb2xvci1tYXAiKTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsDQorICAgICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZDogaW52YWxpZCBhcmd1bWVudCIpOw0KKyAgIH0NCisNCisgICBlbHNlIGlmIChpbWFnZSAhPSBOVUxMKQ0KKyAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsDQorICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZDogZGFtYWdlZCBQTkdfSU1BR0VfVkVSU0lPTiIpOw0KKw0KKyAgIHJldHVybiAwOw0KK30NCisNCisjZW5kaWYgLyogUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQgKi8NCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdyaW8uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5MjdkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncmlvLmMKQEAgLTAsMCArMSwxMTkgQEAKKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX0ZYQ09SRV9GRUFUVVJFX0FMTF8pIHx8IGRlZmluZWQoX1BOR19ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQ0KKy8qIHBuZ3Jpby5jIC0gZnVuY3Rpb25zIGZvciBkYXRhIGlucHV0DQorICoNCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10NCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24NCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikNCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pDQorICoNCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXINCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaA0KKyAqDQorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBpbnB1dC4gIFVzZXJzIHdobyBuZWVkDQorICogc3BlY2lhbCBoYW5kbGluZyBhcmUgZXhwZWN0ZWQgdG8gd3JpdGUgYSBmdW5jdGlvbiB0aGF0IGhhcyB0aGUgc2FtZQ0KKyAqIGFyZ3VtZW50cyBhcyB0aGlzIGFuZCBwZXJmb3JtcyBhIHNpbWlsYXIgZnVuY3Rpb24sIGJ1dCB0aGF0IHBvc3NpYmx5DQorICogaGFzIGEgZGlmZmVyZW50IGlucHV0IG1ldGhvZC4gIE5vdGUgdGhhdCB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzDQorICogZnVuY3Rpb24sIGJ1dCByYXRoZXIgd3JpdGUgYSByZXBsYWNlbWVudCBmdW5jdGlvbiBhbmQgdGhlbiBtYWtlDQorICogbGlicG5nIHVzZSBpdCBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfcmVhZF9mbiguLi4pLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJwbmdwcml2LmgiDQorDQorI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KKw0KKy8qIFJlYWQgdGhlIGRhdGEgZnJvbSB3aGF0ZXZlciBpbnB1dCB5b3UgYXJlIHVzaW5nLiAgVGhlIGRlZmF1bHQgcm91dGluZQ0KKyAqIHJlYWRzIGZyb20gYSBmaWxlIHBvaW50ZXIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNvbWV0aW1lcyBnZXRzIGNhbGxlZA0KKyAqIHdpdGggdmVyeSBzbWFsbCBsZW5ndGhzLCBzbyB5b3Ugc2hvdWxkIGltcGxlbWVudCBzb21lIGtpbmQgb2Ygc2ltcGxlDQorICogYnVmZmVyaW5nIGlmIHlvdSBhcmUgdXNpbmcgdW5idWZmZXJlZCByZWFkcy4gIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGFza2VkDQorICogdG8gcmVhZCBtb3JlIHRoZW4gNjRLIG9uIGEgMTYgYml0IG1hY2hpbmUuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfZGF0YShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQ0KK3sNCisgICBwbmdfZGVidWcxKDQsICJyZWFkaW5nICVkIGJ5dGVzIiwgKGludClsZW5ndGgpOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5yZWFkX2RhdGFfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5yZWFkX2RhdGFfZm4pKShwbmdfcHRyLCBkYXRhLCBsZW5ndGgpOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCByZWFkIGZ1bmN0aW9uIik7DQorfQ0KKw0KKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVEDQorLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgcmVhZGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQ0KKyAqIG5vdCByZWFkaW5nIGZyb20gYSBzdGFuZGFyZCBDIHN0cmVhbSwgeW91IHNob3VsZCBjcmVhdGUgYSByZXBsYWNlbWVudA0KKyAqIHJlYWRfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF9yZWFkX2ZuKCksIHJhdGhlcg0KKyAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuDQorICovDQordm9pZCBQTkdDQkFQSQ0KK3BuZ19kZWZhdWx0X3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpDQorew0KKyAgIHBuZ19zaXplX3QgY2hlY2s7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgLyogZnJlYWQoKSByZXR1cm5zIDAgb24gZXJyb3IsIHNvIGl0IGlzIE9LIHRvIHN0b3JlIHRoaXMgaW4gYSBwbmdfc2l6ZV90DQorICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLg0KKyAgICAqLw0KKyAgIGNoZWNrID0gZnJlYWQoZGF0YSwgMSwgbGVuZ3RoLCBwbmdfdm9pZGNhc3QocG5nX0ZJTEVfcCwgcG5nX3B0ci0+aW9fcHRyKSk7DQorDQorICAgaWYgKGNoZWNrICE9IGxlbmd0aCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWQgRXJyb3IiKTsNCit9DQorI2VuZGlmDQorDQorLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBhIG5ldyBpbnB1dCBmdW5jdGlvbg0KKyAqIGZvciBsaWJwbmcgaWYgc3RhbmRhcmQgQyBzdHJlYW1zIGFyZW4ndCBiZWluZyB1c2VkLg0KKyAqDQorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpdHMgYXJndW1lbnRzOg0KKyAqDQorICogcG5nX3B0ciAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBpbnB1dCBkYXRhIHN0cnVjdHVyZQ0KKyAqDQorICogaW9fcHRyICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQNCisgKiAgICAgICAgICAgICAgICB0aGUgaW5wdXQgZnVuY3Rpb25zLiAgTWF5IGJlIE5VTEwuDQorICoNCisgKiByZWFkX2RhdGFfZm4gLSBwb2ludGVyIHRvIGEgbmV3IGlucHV0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYXMgaXRzDQorICogICAgICAgICAgICAgICAgYXJndW1lbnRzIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QsIGEgcG9pbnRlciB0bw0KKyAqICAgICAgICAgICAgICAgIGEgbG9jYXRpb24gd2hlcmUgaW5wdXQgZGF0YSBjYW4gYmUgc3RvcmVkLCBhbmQgYSAzMi1iaXQNCisgKiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQuDQorICogICAgICAgICAgICAgICAgVG8gZXhpdCBhbmQgb3V0cHV0IGFueSBmYXRhbCBlcnJvciBtZXNzYWdlcyB0aGUgbmV3IHdyaXRlDQorICogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGNhbGwgcG5nX2Vycm9yKHBuZ19wdHIsICJFcnJvciBtc2ciKS4NCisgKiAgICAgICAgICAgICAgICBNYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBsaWJwbmcncyBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwNCisgKiAgICAgICAgICAgICAgICBiZSB1c2VkLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9yZWFkX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLA0KKyAgIHBuZ19yd19wdHIgcmVhZF9kYXRhX2ZuKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT5pb19wdHIgPSBpb19wdHI7DQorDQorI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQNCisgICBpZiAocmVhZF9kYXRhX2ZuICE9IE5VTEwpDQorICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcmVhZF9kYXRhX2ZuOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSBwbmdfZGVmYXVsdF9yZWFkX2RhdGE7DQorI2Vsc2UNCisgICBwbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSByZWFkX2RhdGFfZm47DQorI2VuZGlmDQorDQorICAgLyogSXQgaXMgYW4gZXJyb3IgdG8gd3JpdGUgdG8gYSByZWFkIGRldmljZSAqLw0KKyAgIGlmIChwbmdfcHRyLT53cml0ZV9kYXRhX2ZuICE9IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSBOVUxMOw0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsDQorICAgICAgICAgICJDYW4ndCBzZXQgYm90aCByZWFkX2RhdGFfZm4gYW5kIHdyaXRlX2RhdGFfZm4gaW4gdGhlIg0KKyAgICAgICAgICAiIHNhbWUgc3RydWN0dXJlIik7DQorICAgfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEDQorICAgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuID0gTlVMTDsNCisjZW5kaWYNCit9DQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncnRyYW4uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncnRyYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI3OWJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdydHJhbi5jCkBAIC0wLDAgKzEsNTEwNCBAQAorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorLyogcG5ncnRyYW4uYyAtIHRyYW5zZm9ybXMgdGhlIGRhdGEgaW4gYSByb3cgZm9yIFBORyByZWFkZXJzDQorICoNCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yIFtBcHJpbCAyNSwgMjAxM10NCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24NCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikNCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pDQorICoNCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXINCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaA0KKyAqDQorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBvcHRpb25hbGx5IGNhbGxlZCBieSBhbiBhcHBsaWNhdGlvbg0KKyAqIGluIG9yZGVyIHRvIHRlbGwgbGlicG5nIGhvdyB0byBoYW5kbGUgZGF0YSB3aGVuIHJlYWRpbmcgYSBQTkcuDQorICogVHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlIHVzZWQgaW4gYm90aCByZWFkaW5nIGFuZCB3cml0aW5nIGFyZQ0KKyAqIGluIHBuZ3RyYW5zLmMuDQorICovDQorDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVEDQorDQorLyogU2V0IHRoZSBhY3Rpb24gb24gZ2V0dGluZyBhIENSQyBlcnJvciBmb3IgYW4gYW5jaWxsYXJ5IG9yIGNyaXRpY2FsIGNodW5rLiAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9jcmNfYWN0aW9uKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgY3JpdF9hY3Rpb24sIGludCBhbmNpbF9hY3Rpb24pDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jcmNfYWN0aW9uIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgLyogVGVsbCBsaWJwbmcgaG93IHdlIHJlYWN0IHRvIENSQyBlcnJvcnMgaW4gY3JpdGljYWwgY2h1bmtzICovDQorICAgc3dpdGNoIChjcml0X2FjdGlvbikNCisgICB7DQorICAgICAgY2FzZSBQTkdfQ1JDX05PX0NIQU5HRTogICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWF2ZSBzZXR0aW5nIGFzIGlzICovDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXJuL3VzZSBkYXRhICovDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0U7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ1JDX1FVSUVUX1VTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0L3VzZSBkYXRhICovDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkU7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fRElTQ0FSRDogICAgLyogTm90IGEgdmFsaWQgYWN0aW9uIGZvciBjcml0aWNhbCBkYXRhICovDQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgICAiQ2FuJ3QgZGlzY2FyZCBjcml0aWNhbCBkYXRhIG9uIENSQyBlcnJvciIpOw0KKyAgICAgIGNhc2UgUE5HX0NSQ19FUlJPUl9RVUlUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IvcXVpdCAqLw0KKw0KKyAgICAgIGNhc2UgUE5HX0NSQ19ERUZBVUxUOg0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgIH0NCisNCisgICAvKiBUZWxsIGxpYnBuZyBob3cgd2UgcmVhY3QgdG8gQ1JDIGVycm9ycyBpbiBhbmNpbGxhcnkgY2h1bmtzICovDQorICAgc3dpdGNoIChhbmNpbF9hY3Rpb24pDQorICAgew0KKyAgICAgIGNhc2UgUE5HX0NSQ19OT19DSEFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWF2ZSBzZXR0aW5nIGFzIGlzICovDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcm4vdXNlIGRhdGEgKi8NCisgICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0NSQ19RVUlFVF9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0L3VzZSBkYXRhICovDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSzsNCisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk47DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ1JDX0VSUk9SX1FVSVQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yL3F1aXQgKi8NCisgICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0NSQ19XQVJOX0RJU0NBUkQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcm4vZGlzY2FyZCBkYXRhICovDQorDQorICAgICAgY2FzZSBQTkdfQ1JDX0RFRkFVTFQ6DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOw0KKyAgICAgICAgIGJyZWFrOw0KKyAgIH0NCit9DQorDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorLyogSXMgaXQgT0sgdG8gc2V0IGEgdHJhbnNmb3JtYXRpb24gbm93PyAgT25seSBpZiBwbmdfc3RhcnRfcmVhZF9pbWFnZSBvcg0KKyAqIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIGhhdmUgbm90IGJlZW4gY2FsbGVkLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIElIRFINCisgKiB0byBoYXZlIGJlZW4gcmVhZCBpbiBhbGwgY2FzZXMsIHRoZSBwYXJhbWV0ZXIgYWxsb3dzIGZvciB0aGlzIGNoZWNrIHRvby4NCisgKi8NCitzdGF0aWMgaW50DQorcG5nX3J0cmFuX29rKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbmVlZF9JSERSKQ0KK3sNCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkNCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgImludmFsaWQgYWZ0ZXIgcG5nX3N0YXJ0X3JlYWRfaW1hZ2Ugb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8iKTsNCisNCisgICAgICBlbHNlIGlmIChuZWVkX0lIRFIgJiYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSA9PSAwKQ0KKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgImludmFsaWQgYmVmb3JlIHRoZSBQTkcgaGVhZGVyIGhhcyBiZWVuIHJlYWQiKTsNCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIC8qIFR1cm4gb24gZmFpbHVyZSB0byBpbml0aWFsaXplIGNvcnJlY3RseSBmb3IgYWxsIHRyYW5zZm9ybXMuICovDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfREVURUNUX1VOSU5JVElBTElaRUQ7DQorDQorICAgICAgICAgcmV0dXJuIDE7IC8qIE9rICovDQorICAgICAgfQ0KKyAgIH0NCisNCisgICByZXR1cm4gMDsgLyogbm8gcG5nX2Vycm9yIHBvc3NpYmxlISAqLw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQNCisvKiBIYW5kbGUgYWxwaGEgYW5kIHRSTlMgdmlhIGEgYmFja2dyb3VuZCBjb2xvciAqLw0KK3ZvaWQgUE5HRkFQSQ0KK3BuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLCBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLA0KKyAgICBpbnQgbmVlZF9leHBhbmQsIHBuZ19maXhlZF9wb2ludCBiYWNrZ3JvdW5kX2dhbW1hKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZCIpOw0KKw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDApIHx8IGJhY2tncm91bmRfY29sb3IgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKGJhY2tncm91bmRfZ2FtbWFfY29kZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTktOT1dOKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQXBwbGljYXRpb24gbXVzdCBzdXBwbHkgYSBrbm93biBiYWNrZ3JvdW5kIGdhbW1hIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0NPTVBPU0UgfCBQTkdfU1RSSVBfQUxQSEE7DQorICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOw0KKyAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsNCisNCisgICBwbmdfcHRyLT5iYWNrZ3JvdW5kID0gKmJhY2tncm91bmRfY29sb3I7DQorICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSA9IGJhY2tncm91bmRfZ2FtbWE7DQorICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kX2dhbW1hX2NvZGUpOw0KKyAgIGlmIChuZWVkX2V4cGFuZCkNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0JBQ0tHUk9VTkRfRVhQQU5EOw0KKyAgIGVsc2UNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19CQUNLR1JPVU5EX0VYUEFORDsNCit9DQorDQorIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsIGludCBiYWNrZ3JvdW5kX2dhbW1hX2NvZGUsDQorICAgIGludCBuZWVkX2V4cGFuZCwgZG91YmxlIGJhY2tncm91bmRfZ2FtbWEpDQorew0KKyAgIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZChwbmdfcHRyLCBiYWNrZ3JvdW5kX2NvbG9yLCBiYWNrZ3JvdW5kX2dhbW1hX2NvZGUsDQorICAgICAgbmVlZF9leHBhbmQsIHBuZ19maXhlZChwbmdfcHRyLCBiYWNrZ3JvdW5kX2dhbW1hLCAicG5nX3NldF9iYWNrZ3JvdW5kIikpOw0KK30NCisjICBlbmRpZiAgLyogRkxPQVRJTkdfUE9JTlQgKi8NCisjZW5kaWYgLyogUkVBRF9CQUNLR1JPVU5EICovDQorDQorLyogU2NhbGUgMTYtYml0IGRlcHRoIGZpbGVzIHRvIDgtYml0IGRlcHRoLiAgSWYgYm90aCBvZiB0aGVzZSBhcmUgc2V0IHRoZW4gdGhlDQorICogb25lIHRoYXQgcG5ncnRyYW4gZG9lcyBmaXJzdCAoc2NhbGUpIGhhcHBlbnMuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyB0aGUNCisgKiBUUkFOU0ZPUk0gYW5kIEFQSSBiZWhhdmlvciB0byBiZSBzb21ld2hhdCBjb25zaXN0ZW50LCBhbmQgaXQncyBzaW1wbGVyLg0KKyAqLw0KKyNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9zY2FsZV8xNihwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NjYWxlXzE2Iik7DQorDQorICAgaWYgKCFwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfU0NBTEVfMTZfVE9fODsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVEDQorLyogQ2hvcCAxNi1iaXQgZGVwdGggZmlsZXMgdG8gOC1iaXQgZGVwdGggKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfc3RyaXBfMTYocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zdHJpcF8xNiIpOw0KKw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HXzE2X1RPXzg7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zdHJpcF9hbHBoYSIpOw0KKw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NUUklQX0FMUEhBOw0KK30NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpDQorc3RhdGljIHBuZ19maXhlZF9wb2ludA0KK3RyYW5zbGF0ZV9nYW1tYV9mbGFncyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ZpeGVkX3BvaW50IG91dHB1dF9nYW1tYSwNCisgICBpbnQgaXNfc2NyZWVuKQ0KK3sNCisgICAvKiBDaGVjayBmb3IgZmxhZyB2YWx1ZXMuICBUaGUgbWFpbiByZWFzb24gZm9yIGhhdmluZyB0aGUgb2xkIE1hYyB2YWx1ZSBhcyBhDQorICAgICogZmxhZyBpcyB0aGF0IGl0IGlzIHByZXR0eSBuZWFyIGltcG9zc2libGUgdG8gd29yayBvdXQgd2hhdCB0aGUgY29ycmVjdA0KKyAgICAqIHZhbHVlIGlzIGZyb20gQXBwbGUgZG9jdW1lbnRhdGlvbiAtIGEgd29ya2luZyBNYWMgc3lzdGVtIGlzIG5lZWRlZCB0bw0KKyAgICAqIGRpc2NvdmVyIHRoZSB2YWx1ZSENCisgICAgKi8NCisgICBpZiAob3V0cHV0X2dhbW1hID09IFBOR19ERUZBVUxUX3NSR0IgfHwNCisgICAgICBvdXRwdXRfZ2FtbWEgPT0gUE5HX0ZQXzEgLyBQTkdfREVGQVVMVF9zUkdCKQ0KKyAgIHsNCisgICAgICAvKiBJZiB0aGVyZSBpcyBubyBzUkdCIHN1cHBvcnQgdGhpcyBqdXN0IHNldHMgdGhlIGdhbW1hIHRvIHRoZSBzdGFuZGFyZA0KKyAgICAgICAqIHNSR0IgdmFsdWUuICAoVGhpcyBpcyBhIHNpZGUgZWZmZWN0IG9mIHVzaW5nIHRoaXMgZnVuY3Rpb24hKQ0KKyAgICAgICAqLw0KKyMgICAgIGlmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQVNTVU1FX3NSR0I7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIFBOR19VTlVTRUQocG5nX3B0cikNCisjICAgICBlbmRpZg0KKyAgICAgIGlmIChpc19zY3JlZW4pDQorICAgICAgICAgb3V0cHV0X2dhbW1hID0gUE5HX0dBTU1BX3NSR0I7DQorICAgICAgZWxzZQ0KKyAgICAgICAgIG91dHB1dF9nYW1tYSA9IFBOR19HQU1NQV9zUkdCX0lOVkVSU0U7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKG91dHB1dF9nYW1tYSA9PSBQTkdfR0FNTUFfTUFDXzE4IHx8DQorICAgICAgb3V0cHV0X2dhbW1hID09IFBOR19GUF8xIC8gUE5HX0dBTU1BX01BQ18xOCkNCisgICB7DQorICAgICAgaWYgKGlzX3NjcmVlbikNCisgICAgICAgICBvdXRwdXRfZ2FtbWEgPSBQTkdfR0FNTUFfTUFDX09MRDsNCisgICAgICBlbHNlDQorICAgICAgICAgb3V0cHV0X2dhbW1hID0gUE5HX0dBTU1BX01BQ19JTlZFUlNFOw0KKyAgIH0NCisNCisgICByZXR1cm4gb3V0cHV0X2dhbW1hOw0KK30NCisNCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQorc3RhdGljIHBuZ19maXhlZF9wb2ludA0KK2NvbnZlcnRfZ2FtbWFfdmFsdWUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGRvdWJsZSBvdXRwdXRfZ2FtbWEpDQorew0KKyAgIC8qIFRoZSBmb2xsb3dpbmcgc2lsZW50bHkgaWdub3JlcyBjYXNlcyB3aGVyZSBmaXhlZCBwb2ludCAodGltZXMgMTAwLDAwMCkNCisgICAgKiBnYW1tYSB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJLiAgVGhpcyBpcyBzYWZlIGFuZCBpdA0KKyAgICAqIG1lYW5zIHRoZSBmaXhlZCBwb2ludCBjb25zdGFudHMgd29yayBqdXN0IGZpbmUgd2l0aCB0aGUgZmxvYXRpbmcgcG9pbnQNCisgICAgKiBBUEkuICBUaGUgYWx0ZXJuYXRpdmUgd291bGQganVzdCBsZWFkIHRvIHVuZGV0ZWN0ZWQgZXJyb3JzIGFuZCBzcHVyaW91cw0KKyAgICAqIGJ1ZyByZXBvcnRzLiAgTmVnYXRpdmUgdmFsdWVzIGZhaWwgaW5zaWRlIHRoZSBfZml4ZWQgQVBJIHVubGVzcyB0aGV5DQorICAgICogY29ycmVzcG9uZCB0byB0aGUgZmxhZyB2YWx1ZXMuDQorICAgICovDQorICAgaWYgKG91dHB1dF9nYW1tYSA+IDAgJiYgb3V0cHV0X2dhbW1hIDwgMTI4KQ0KKyAgICAgIG91dHB1dF9nYW1tYSAqPSBQTkdfRlBfMTsNCisNCisgICAvKiBUaGlzIHByZXNlcnZlcyAtMSBhbmQgLTIgZXhhY3RseTogKi8NCisgICBvdXRwdXRfZ2FtbWEgPSBmbG9vcihvdXRwdXRfZ2FtbWEgKyAuNSk7DQorDQorICAgaWYgKG91dHB1dF9nYW1tYSA+IFBOR19GUF9NQVggfHwgb3V0cHV0X2dhbW1hIDwgUE5HX0ZQX01JTikNCisgICAgICBwbmdfZml4ZWRfZXJyb3IocG5nX3B0ciwgImdhbW1hIHZhbHVlIik7DQorDQorICAgcmV0dXJuIChwbmdfZml4ZWRfcG9pbnQpb3V0cHV0X2dhbW1hOw0KK30NCisjICBlbmRpZg0KKyNlbmRpZiAvKiBSRUFEX0FMUEhBX01PREUgfHwgUkVBRF9HQU1NQSAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRA0KK3ZvaWQgUE5HRkFQSQ0KK3BuZ19zZXRfYWxwaGFfbW9kZV9maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG1vZGUsDQorICAgcG5nX2ZpeGVkX3BvaW50IG91dHB1dF9nYW1tYSkNCit7DQorICAgaW50IGNvbXBvc2UgPSAwOw0KKyAgIHBuZ19maXhlZF9wb2ludCBmaWxlX2dhbW1hOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9hbHBoYV9tb2RlIik7DQorDQorICAgaWYgKCFwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIG91dHB1dF9nYW1tYSA9IHRyYW5zbGF0ZV9nYW1tYV9mbGFncyhwbmdfcHRyLCBvdXRwdXRfZ2FtbWEsIDEvKnNjcmVlbiovKTsNCisNCisgICAvKiBWYWxpZGF0ZSB0aGUgdmFsdWUgdG8gZW5zdXJlIGl0IGlzIGluIGEgcmVhc29uYWJsZSByYW5nZS4gVGhlIHZhbHVlDQorICAgICogaXMgZXhwZWN0ZWQgdG8gYmUgMSBvciBncmVhdGVyLCBidXQgdGhpcyByYW5nZSB0ZXN0IGFsbG93cyBmb3Igc29tZQ0KKyAgICAqIHZpZXdpbmcgY29ycmVjdGlvbiB2YWx1ZXMuICBUaGUgaW50ZW50IGlzIHRvIHdlZWQgb3V0IHVzZXJzIG9mIHRoaXMgQVBJDQorICAgICogd2hvIHVzZSB0aGUgaW52ZXJzZSBvZiB0aGUgZ2FtbWEgdmFsdWUgYWNjaWRlbnRhbGx5ISAgU2luY2Ugc29tZSBvZiB0aGVzZQ0KKyAgICAqIHZhbHVlcyBhcmUgcmVhc29uYWJsZSB0aGlzIG1heSBoYXZlIHRvIGJlIGNoYW5nZWQuDQorICAgICovDQorICAgaWYgKG91dHB1dF9nYW1tYSA8IDcwMDAwIHx8IG91dHB1dF9nYW1tYSA+IDMwMDAwMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIm91dHB1dCBnYW1tYSBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2UiKTsNCisNCisgICAvKiBUaGUgZGVmYXVsdCBmaWxlIGdhbW1hIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvdXRwdXQgZ2FtbWE7IHRoZSBvdXRwdXQNCisgICAgKiBnYW1tYSBtYXkgYmUgY2hhbmdlZCBiZWxvdyBzbyBnZXQgdGhlIGZpbGUgdmFsdWUgZmlyc3Q6DQorICAgICovDQorICAgZmlsZV9nYW1tYSA9IHBuZ19yZWNpcHJvY2FsKG91dHB1dF9nYW1tYSk7DQorDQorICAgLyogVGhlcmUgYXJlIHJlYWxseSA4IHBvc3NpYmlsaXRpZXMgaGVyZSwgY29tcG9zZWQgb2YgYW55IGNvbWJpbmF0aW9uDQorICAgICogb2Y6DQorICAgICoNCisgICAgKiAgICBwcmVtdWx0aXBseSB0aGUgY29sb3IgY2hhbm5lbHMNCisgICAgKiAgICBkbyBub3QgZW5jb2RlIG5vbi1vcGFxdWUgcGl4ZWxzDQorICAgICogICAgZW5jb2RlIHRoZSBhbHBoYSBhcyB3ZWxsIGFzIHRoZSBjb2xvciBjaGFubmVscw0KKyAgICAqDQorICAgICogVGhlIGRpZmZlcmVuY2VzIGRpc2FwcGVhciBpZiB0aGUgaW5wdXQvb3V0cHV0ICgnc2NyZWVuJykgZ2FtbWEgaXMgMS4wLA0KKyAgICAqIGJlY2F1c2UgdGhlbiB0aGUgZW5jb2RpbmcgaXMgYSBuby1vcCBhbmQgdGhlcmUgaXMgb25seSB0aGUgY2hvaWNlIG9mDQorICAgICogcHJlbXVsdGlwbHlpbmcgdGhlIGNvbG9yIGNoYW5uZWxzIG9yIG5vdC4NCisgICAgKg0KKyAgICAqIHBuZ19zZXRfYWxwaGFfbW9kZSBhbmQgcG5nX3NldF9iYWNrZ3JvdW5kIGludGVyYWN0IGJlY2F1c2UgYm90aCB1c2UNCisgICAgKiBwbmdfY29tcG9zZSB0byBkbyB0aGUgd29yay4gIENhbGxpbmcgYm90aCBpcyBvbmx5IHVzZWZ1bCB3aGVuDQorICAgICogcG5nX3NldF9hbHBoYV9tb2RlIGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IG1vZGUgLSBQTkdfQUxQSEFfUE5HIC0gYWxvbmcNCisgICAgKiB3aXRoIGEgZGVmYXVsdCBnYW1tYSB2YWx1ZS4gIE90aGVyd2lzZSBQTkdfQ09NUE9TRSBtdXN0IG5vdCBiZSBzZXQuDQorICAgICovDQorICAgc3dpdGNoIChtb2RlKQ0KKyAgIHsNCisgICAgICBjYXNlIFBOR19BTFBIQV9QTkc6ICAgICAgICAvKiBkZWZhdWx0OiBwbmcgc3RhbmRhcmQgKi8NCisgICAgICAgICAvKiBObyBjb21wb3NlLCBidXQgaXQgbWF5IGJlIHNldCBieSBwbmdfc2V0X2JhY2tncm91bmQhICovDQorICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19BTFBIQV9BU1NPQ0lBVEVEOiAvKiBjb2xvciBjaGFubmVscyBwcmVtdWx0aXBsaWVkICovDQorICAgICAgICAgY29tcG9zZSA9IDE7DQorICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsNCisgICAgICAgICAvKiBUaGUgb3V0cHV0IGlzIGxpbmVhcjogKi8NCisgICAgICAgICBvdXRwdXRfZ2FtbWEgPSBQTkdfRlBfMTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19BTFBIQV9PUFRJTUlaRUQ6ICAvKiBhc3NvY2lhdGVkLCBub24tb3BhcXVlIHBpeGVscyBsaW5lYXIgKi8NCisgICAgICAgICBjb21wb3NlID0gMTsNCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19FTkNPREVfQUxQSEE7DQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEE7DQorICAgICAgICAgLyogb3V0cHV0X2dhbW1hIHJlY29yZHMgdGhlIGVuY29kaW5nIG9mIG9wYXF1ZSBwaXhlbHMhICovDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQUxQSEFfQlJPS0VOOiAgICAgLyogYXNzb2NpYXRlZCwgbm9uLWxpbmVhciwgYWxwaGEgZW5jb2RlZCAqLw0KKyAgICAgICAgIGNvbXBvc2UgPSAxOw0KKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRU5DT0RFX0FMUEhBOw0KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBhbHBoYSBtb2RlIik7DQorICAgfQ0KKw0KKyAgIC8qIE9ubHkgc2V0IHRoZSBkZWZhdWx0IGdhbW1hIGlmIHRoZSBmaWxlIGdhbW1hIGhhcyBub3QgYmVlbiBzZXQgKHRoaXMgaGFzDQorICAgICogdGhlIHNpZGUgZWZmZWN0IHRoYXQgdGhlIGdhbW1hIGluIGEgc2Vjb25kIGNhbGwgdG8gcG5nX3NldF9hbHBoYV9tb2RlIHdpbGwNCisgICAgKiBiZSBpZ25vcmVkLikNCisgICAgKi8NCisgICBpZiAocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9PSAwKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hID0gZmlsZV9nYW1tYTsNCisgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUE7DQorICAgfQ0KKw0KKyAgIC8qIEJ1dCBhbHdheXMgc2V0IHRoZSBvdXRwdXQgZ2FtbWE6ICovDQorICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID0gb3V0cHV0X2dhbW1hOw0KKw0KKyAgIC8qIEZpbmFsbHksIGlmIHByZS1tdWx0aXBseWluZywgc2V0IHRoZSBiYWNrZ3JvdW5kIGZpZWxkcyB0byBhY2hpZXZlIHRoZQ0KKyAgICAqIGRlc2lyZWQgcmVzdWx0Lg0KKyAgICAqLw0KKyAgIGlmIChjb21wb3NlKQ0KKyAgIHsNCisgICAgICAvKiBBbmQgb2J0YWluIGFscGhhIHByZS1tdWx0aXBsaWNhdGlvbiBieSBjb21wb3Npbmcgb24gYmxhY2s6ICovDQorICAgICAgbWVtc2V0KCZwbmdfcHRyLT5iYWNrZ3JvdW5kLCAwLCAoc2l6ZW9mIHBuZ19wdHItPmJhY2tncm91bmQpKTsNCisgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hID0gcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYTsgLyoganVzdCBpbiBjYXNlICovDQorICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRTsNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19CQUNLR1JPVU5EX0VYUEFORDsNCisNCisgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgImNvbmZsaWN0aW5nIGNhbGxzIHRvIHNldCBhbHBoYSBtb2RlIGFuZCBiYWNrZ3JvdW5kIik7DQorDQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19DT01QT1NFOw0KKyAgIH0NCit9DQorDQorIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbW9kZSwgZG91YmxlIG91dHB1dF9nYW1tYSkNCit7DQorICAgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkKHBuZ19wdHIsIG1vZGUsIGNvbnZlcnRfZ2FtbWFfdmFsdWUocG5nX3B0ciwNCisgICAgICBvdXRwdXRfZ2FtbWEpKTsNCit9DQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEDQorLyogRGl0aGVyIGZpbGUgdG8gOC1iaXQuICBTdXBwbHkgYSBwYWxldHRlLCB0aGUgY3VycmVudCBudW1iZXINCisgKiBvZiBlbGVtZW50cyBpbiB0aGUgcGFsZXR0ZSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzDQorICogYWxsb3dlZCwgYW5kIGEgaGlzdG9ncmFtIGlmIHBvc3NpYmxlLiAgSWYgdGhlIGN1cnJlbnQgbnVtYmVyDQorICogb2YgY29sb3JzIGlzIGdyZWF0ZXIgdGhlbiB0aGUgbWF4aW11bSBudW1iZXIsIHRoZSBwYWxldHRlIHdpbGwgYmUNCisgKiBtb2RpZmllZCB0byBmaXQgaW4gdGhlIG1heGltdW0gbnVtYmVyLiAgImZ1bGxfcXVhbnRpemUiIGluZGljYXRlcw0KKyAqIHdoZXRoZXIgd2UgbmVlZCBhIHF1YW50aXppbmcgY3ViZSBzZXQgdXAgZm9yIFJHQiBpbWFnZXMsIG9yIGlmIHdlDQorICogc2ltcGx5IGFyZSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiBhIHBhbGV0dGVkIGltYWdlLg0KKyAqLw0KKw0KK3R5cGVkZWYgc3RydWN0IHBuZ19kc29ydF9zdHJ1Y3QNCit7DQorICAgc3RydWN0IHBuZ19kc29ydF9zdHJ1Y3QgKiBuZXh0Ow0KKyAgIHBuZ19ieXRlIGxlZnQ7DQorICAgcG5nX2J5dGUgcmlnaHQ7DQorfSBwbmdfZHNvcnQ7DQordHlwZWRlZiBwbmdfZHNvcnQgKiAgIHBuZ19kc29ydHA7DQordHlwZWRlZiBwbmdfZHNvcnQgKiAqIHBuZ19kc29ydHBwOw0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9xdWFudGl6ZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9ycCBwYWxldHRlLA0KKyAgICBpbnQgbnVtX3BhbGV0dGUsIGludCBtYXhpbXVtX2NvbG9ycywgcG5nX2NvbnN0X3VpbnRfMTZwIGhpc3RvZ3JhbSwNCisgICAgaW50IGZ1bGxfcXVhbnRpemUpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9xdWFudGl6ZSIpOw0KKw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1FVQU5USVpFOw0KKw0KKyAgIGlmICghZnVsbF9xdWFudGl6ZSkNCisgICB7DQorICAgICAgaW50IGk7DQorDQorICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXggPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIChzaXplb2YgKHBuZ19ieXRlKSkpKTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykNCisgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtpXSA9IChwbmdfYnl0ZSlpOw0KKyAgIH0NCisNCisgICBpZiAobnVtX3BhbGV0dGUgPiBtYXhpbXVtX2NvbG9ycykNCisgICB7DQorICAgICAgaWYgKGhpc3RvZ3JhbSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBUaGlzIGlzIGVhc3kgZW5vdWdoLCBqdXN0IHRocm93IG91dCB0aGUgbGVhc3QgdXNlZCBjb2xvcnMuDQorICAgICAgICAgICogUGVyaGFwcyBub3QgdGhlIGJlc3Qgc29sdXRpb24sIGJ1dCBnb29kIGVub3VnaC4NCisgICAgICAgICAgKi8NCisNCisgICAgICAgICBpbnQgaTsNCisNCisgICAgICAgICAvKiBJbml0aWFsaXplIGFuIGFycmF5IHRvIHNvcnQgY29sb3JzICovDQorICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfc29ydCA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWxldHRlICogKHNpemVvZiAocG5nX2J5dGUpKSkpOw0KKw0KKyAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHF1YW50aXplX3NvcnQgYXJyYXkgKi8NCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykNCisgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID0gKHBuZ19ieXRlKWk7DQorDQorICAgICAgICAgLyogRmluZCB0aGUgbGVhc3QgdXNlZCBwYWxldHRlIGVudHJpZXMgYnkgc3RhcnRpbmcgYQ0KKyAgICAgICAgICAqIGJ1YmJsZSBzb3J0LCBhbmQgcnVubmluZyBpdCB1bnRpbCB3ZSBoYXZlIHNvcnRlZA0KKyAgICAgICAgICAqIG91dCBlbm91Z2ggY29sb3JzLiAgTm90ZSB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQNCisgICAgICAgICAgKiBzb3J0aW5nIGFsbCB0aGUgY29sb3JzLCBqdXN0IGZpbmRpbmcgd2hpY2ggYXJlDQorICAgICAgICAgICogbGVhc3QgdXNlZC4NCisgICAgICAgICAgKi8NCisNCisgICAgICAgICBmb3IgKGkgPSBudW1fcGFsZXR0ZSAtIDE7IGkgPj0gbWF4aW11bV9jb2xvcnM7IGktLSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGRvbmU7IC8qIFRvIHN0b3AgZWFybHkgaWYgdGhlIGxpc3QgaXMgcHJlLXNvcnRlZCAqLw0KKyAgICAgICAgICAgIGludCBqOw0KKw0KKyAgICAgICAgICAgIGRvbmUgPSAxOw0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGlmIChoaXN0b2dyYW1bcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqXV0NCisgICAgICAgICAgICAgICAgICAgPCBoaXN0b2dyYW1bcG5nX3B0ci0+cXVhbnRpemVfc29ydFtqICsgMV1dKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB0Ow0KKw0KKyAgICAgICAgICAgICAgICAgIHQgPSBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2pdOw0KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnF1YW50aXplX3NvcnRbal0gPSBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ogKyAxXTsNCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ogKyAxXSA9IHQ7DQorICAgICAgICAgICAgICAgICAgZG9uZSA9IDA7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoZG9uZSkNCisgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgLyogU3dhcCB0aGUgcGFsZXR0ZSBhcm91bmQsIGFuZCBzZXQgdXAgYSB0YWJsZSwgaWYgbmVjZXNzYXJ5ICovDQorICAgICAgICAgaWYgKGZ1bGxfcXVhbnRpemUpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBqID0gbnVtX3BhbGV0dGU7DQorDQorICAgICAgICAgICAgLyogUHV0IGFsbCB0aGUgdXNlZnVsIGNvbG9ycyB3aXRoaW4gdGhlIG1heCwgYnV0IGRvbid0DQorICAgICAgICAgICAgICogbW92ZSB0aGUgb3RoZXJzLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhpbXVtX2NvbG9yczsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID49IG1heGltdW1fY29sb3JzKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICAgICAgIGotLTsNCisgICAgICAgICAgICAgICAgICB3aGlsZSAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2pdID49IG1heGltdW1fY29sb3JzKTsNCisNCisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldID0gcGFsZXR0ZVtqXTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBqID0gbnVtX3BhbGV0dGU7DQorDQorICAgICAgICAgICAgLyogTW92ZSBhbGwgdGhlIHVzZWQgY29sb3JzIGluc2lkZSB0aGUgbWF4IGxpbWl0LCBhbmQNCisgICAgICAgICAgICAgKiBkZXZlbG9wIGEgdHJhbnNsYXRpb24gdGFibGUuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heGltdW1fY29sb3JzOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIC8qIE9ubHkgbW92ZSB0aGUgY29sb3JzIHdlIG5lZWQgdG8gKi8NCisgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5xdWFudGl6ZV9zb3J0W2ldID49IG1heGltdW1fY29sb3JzKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfY29sb3IgdG1wX2NvbG9yOw0KKw0KKyAgICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgICAgICAgai0tOw0KKyAgICAgICAgICAgICAgICAgIHdoaWxlICgoaW50KXBuZ19wdHItPnF1YW50aXplX3NvcnRbal0gPj0gbWF4aW11bV9jb2xvcnMpOw0KKw0KKyAgICAgICAgICAgICAgICAgIHRtcF9jb2xvciA9IHBhbGV0dGVbal07DQorICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtqXSA9IHBhbGV0dGVbaV07DQorICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHRtcF9jb2xvcjsNCisgICAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSB3aGVyZSB0aGUgY29sb3Igd2VudCAqLw0KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4W2pdID0gKHBuZ19ieXRlKWk7DQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPSAocG5nX2J5dGUpajsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8qIEZpbmQgY2xvc2VzdCBjb2xvciBmb3IgdGhvc2UgY29sb3JzIHdlIGFyZSBub3QgdXNpbmcgKi8NCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPj0gbWF4aW11bV9jb2xvcnMpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGludCBtaW5fZCwgaywgbWluX2ssIGRfaW5kZXg7DQorDQorICAgICAgICAgICAgICAgICAgLyogRmluZCB0aGUgY2xvc2VzdCBjb2xvciB0byBvbmUgd2UgdGhyZXcgb3V0ICovDQorICAgICAgICAgICAgICAgICAgZF9pbmRleCA9IHBuZ19wdHItPnF1YW50aXplX2luZGV4W2ldOw0KKyAgICAgICAgICAgICAgICAgIG1pbl9kID0gUE5HX0NPTE9SX0RJU1QocGFsZXR0ZVtkX2luZGV4XSwgcGFsZXR0ZVswXSk7DQorICAgICAgICAgICAgICAgICAgZm9yIChrID0gMSwgbWluX2sgPSAwOyBrIDwgbWF4aW11bV9jb2xvcnM7IGsrKykNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgaW50IGQ7DQorDQorICAgICAgICAgICAgICAgICAgICAgZCA9IFBOR19DT0xPUl9ESVNUKHBhbGV0dGVbZF9pbmRleF0sIHBhbGV0dGVba10pOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgbWluX2QpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kID0gZDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fayA9IGs7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBjbG9zZXN0IGNvbG9yICovDQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfaW5kZXhbaV0gPSAocG5nX2J5dGUpbWluX2s7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cXVhbnRpemVfc29ydCk7DQorICAgICAgICAgcG5nX3B0ci0+cXVhbnRpemVfc29ydCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgLyogVGhpcyBpcyBtdWNoIGhhcmRlciB0byBkbyBzaW1wbHkgKGFuZCBxdWlja2x5KS4gIFBlcmhhcHMNCisgICAgICAgICAgKiB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggYSBtZWRpYW4gY3V0IHJvdXRpbmUsIGJ1dCB0aG9zZQ0KKyAgICAgICAgICAqIGRvbid0IGFsd2F5cyBiZWhhdmUgdGhlbXNlbHZlcyB3aXRoIG9ubHkgYSBmZXcgY29sb3JzDQorICAgICAgICAgICogYXMgaW5wdXQuICBTbyB3ZSB3aWxsIGp1c3QgZmluZCB0aGUgY2xvc2VzdCB0d28gY29sb3JzLA0KKyAgICAgICAgICAqIGFuZCB0aHJvdyBvdXQgb25lIG9mIHRoZW0gKGNob3NlbiBzb21ld2hhdCByYW5kb21seSkuDQorICAgICAgICAgICogW1dlIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBhdCBhbGwsIHNvIGlmIHNvbWVvbmUgd2FudHMgdG8NCisgICAgICAgICAgKiAgd29yayBvbiBpbXByb3ZpbmcgaXQsIGJlIG91ciBndWVzdCAtIEFFRCwgR1JQXQ0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGludCBpOw0KKyAgICAgICAgIGludCBtYXhfZDsNCisgICAgICAgICBpbnQgbnVtX25ld19wYWxldHRlOw0KKyAgICAgICAgIHBuZ19kc29ydHAgdDsNCisgICAgICAgICBwbmdfZHNvcnRwcCBoYXNoOw0KKw0KKyAgICAgICAgIHQgPSBOVUxMOw0KKw0KKyAgICAgICAgIC8qIEluaXRpYWxpemUgcGFsZXR0ZSBpbmRleCBhcnJheXMgKi8NCisgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsDQorICAgICAgICAgICAgIChwbmdfdWludF8zMikobnVtX3BhbGV0dGUgKiAoc2l6ZW9mIChwbmdfYnl0ZSkpKSk7DQorICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWxldHRlICogKHNpemVvZiAocG5nX2J5dGUpKSkpOw0KKw0KKyAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNvcnQgYXJyYXkgKi8NCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtpXSA9IChwbmdfYnl0ZSlpOw0KKyAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfdG9faW5kZXhbaV0gPSAocG5nX2J5dGUpaTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgaGFzaCA9IChwbmdfZHNvcnRwcClwbmdfY2FsbG9jKHBuZ19wdHIsIChwbmdfdWludF8zMikoNzY5ICoNCisgICAgICAgICAgICAgKHNpemVvZiAocG5nX2Rzb3J0cCkpKSk7DQorDQorICAgICAgICAgbnVtX25ld19wYWxldHRlID0gbnVtX3BhbGV0dGU7DQorDQorICAgICAgICAgLyogSW5pdGlhbCB3aWxkIGd1ZXNzIGF0IGhvdyBmYXIgYXBhcnQgdGhlIGZhcnRoZXN0IHBpeGVsDQorICAgICAgICAgICogcGFpciB3ZSB3aWxsIGJlIGVsaW1pbmF0aW5nIHdpbGwgYmUuICBMYXJnZXINCisgICAgICAgICAgKiBudW1iZXJzIG1lYW4gbW9yZSBhcmVhcyB3aWxsIGJlIGFsbG9jYXRlZCwgU21hbGxlcg0KKyAgICAgICAgICAqIG51bWJlcnMgcnVuIHRoZSByaXNrIG9mIG5vdCBzYXZpbmcgZW5vdWdoIGRhdGEsIGFuZA0KKyAgICAgICAgICAqIGhhdmluZyB0byBkbyB0aGlzIGFsbCBvdmVyIGFnYWluLg0KKyAgICAgICAgICAqDQorICAgICAgICAgICogSSBoYXZlIG5vdCBkb25lIGV4dGVuc2l2ZSBjaGVja2luZyBvbiB0aGlzIG51bWJlci4NCisgICAgICAgICAgKi8NCisgICAgICAgICBtYXhfZCA9IDk2Ow0KKw0KKyAgICAgICAgIHdoaWxlIChudW1fbmV3X3BhbGV0dGUgPiBtYXhpbXVtX2NvbG9ycykNCisgICAgICAgICB7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9uZXdfcGFsZXR0ZSAtIDE7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaW50IGo7DQorDQorICAgICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBudW1fbmV3X3BhbGV0dGU7IGorKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaW50IGQ7DQorDQorICAgICAgICAgICAgICAgICAgZCA9IFBOR19DT0xPUl9ESVNUKHBhbGV0dGVbaV0sIHBhbGV0dGVbal0pOw0KKw0KKyAgICAgICAgICAgICAgICAgIGlmIChkIDw9IG1heF9kKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisNCisgICAgICAgICAgICAgICAgICAgICB0ID0gKHBuZ19kc29ydHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikoc2l6ZW9mIChwbmdfZHNvcnQpKSk7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICAgdC0+bmV4dCA9IGhhc2hbZF07DQorICAgICAgICAgICAgICAgICAgICAgdC0+bGVmdCA9IChwbmdfYnl0ZSlpOw0KKyAgICAgICAgICAgICAgICAgICAgIHQtPnJpZ2h0ID0gKHBuZ19ieXRlKWo7DQorICAgICAgICAgICAgICAgICAgICAgaGFzaFtkXSA9IHQ7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICBpZiAodCA9PSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAodCAhPSBOVUxMKQ0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4X2Q7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaWYgKGhhc2hbaV0gIT0gTlVMTCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcG5nX2Rzb3J0cCBwOw0KKw0KKyAgICAgICAgICAgICAgICAgIGZvciAocCA9IGhhc2hbaV07IHA7IHAgPSBwLT5uZXh0KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW3AtPmxlZnRdDQorICAgICAgICAgICAgICAgICAgICAgICAgIDwgbnVtX25ld19wYWxldHRlICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtwLT5yaWdodF0NCisgICAgICAgICAgICAgICAgICAgICAgICAgPCBudW1fbmV3X3BhbGV0dGUpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLCBuZXh0X2o7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9uZXdfcGFsZXR0ZSAmIDB4MDEpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwLT5sZWZ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaiA9IHAtPnJpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwLT5yaWdodDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ogPSBwLT5sZWZ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fbmV3X3BhbGV0dGUtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW3BuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal1dDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcGFsZXR0ZVtudW1fbmV3X3BhbGV0dGVdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnVsbF9xdWFudGl6ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGs7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9wYWxldHRlOyBrKyspDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtrXSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnF1YW50aXplX2luZGV4W2tdID0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtuZXh0X2pdOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KXBuZ19wdHItPnF1YW50aXplX2luZGV4W2tdID09DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uZXdfcGFsZXR0ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleFtrXSA9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW3BuZ19wdHItPnBhbGV0dGVfdG9faW5kZXgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bV9uZXdfcGFsZXR0ZV1dID0gcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W3BuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal1dDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtudW1fbmV3X3BhbGV0dGVdOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal0gPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX2J5dGUpbnVtX25ld19wYWxldHRlOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfdG9faW5kZXhbbnVtX25ld19wYWxldHRlXSA9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfYnl0ZSlqOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICBpZiAobnVtX25ld19wYWxldHRlIDw9IG1heGltdW1fY29sb3JzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBpZiAobnVtX25ld19wYWxldHRlIDw9IG1heGltdW1fY29sb3JzKQ0KKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc2OTsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoaGFzaFtpXSAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfZHNvcnRwIHAgPSBoYXNoW2ldOw0KKyAgICAgICAgICAgICAgICAgIHdoaWxlIChwKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICB0ID0gcC0+bmV4dDsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwKTsNCisgICAgICAgICAgICAgICAgICAgICBwID0gdDsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIGhhc2hbaV0gPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtYXhfZCArPSA5NjsNCisgICAgICAgICB9DQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaGFzaCk7DQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCk7DQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSk7DQorICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCA9IE5VTEw7DQorICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG51bV9wYWxldHRlID0gbWF4aW11bV9jb2xvcnM7DQorICAgfQ0KKyAgIGlmIChwbmdfcHRyLT5wYWxldHRlID09IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19wdHItPnBhbGV0dGUgPSBwYWxldHRlOw0KKyAgIH0NCisgICBwbmdfcHRyLT5udW1fcGFsZXR0ZSA9IChwbmdfdWludF8xNiludW1fcGFsZXR0ZTsNCisNCisgICBpZiAoZnVsbF9xdWFudGl6ZSkNCisgICB7DQorICAgICAgaW50IGk7DQorICAgICAgcG5nX2J5dGVwIGRpc3RhbmNlOw0KKyAgICAgIGludCB0b3RhbF9iaXRzID0gUE5HX1FVQU5USVpFX1JFRF9CSVRTICsgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgKw0KKyAgICAgICAgICBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTOw0KKyAgICAgIGludCBudW1fcmVkID0gKDEgPDwgUE5HX1FVQU5USVpFX1JFRF9CSVRTKTsNCisgICAgICBpbnQgbnVtX2dyZWVuID0gKDEgPDwgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpOw0KKyAgICAgIGludCBudW1fYmx1ZSA9ICgxIDw8IFBOR19RVUFOVElaRV9CTFVFX0JJVFMpOw0KKyAgICAgIHBuZ19zaXplX3QgbnVtX2VudHJpZXMgPSAoKHBuZ19zaXplX3QpMSA8PCB0b3RhbF9iaXRzKTsNCisNCisgICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCA9IChwbmdfYnl0ZXApcG5nX2NhbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9lbnRyaWVzICogKHNpemVvZiAocG5nX2J5dGUpKSkpOw0KKw0KKyAgICAgIGRpc3RhbmNlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIChwbmdfdWludF8zMikobnVtX2VudHJpZXMgKg0KKyAgICAgICAgICAoc2l6ZW9mIChwbmdfYnl0ZSkpKSk7DQorDQorICAgICAgbWVtc2V0KGRpc3RhbmNlLCAweGZmLCBudW1fZW50cmllcyAqIChzaXplb2YgKHBuZ19ieXRlKSkpOw0KKw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgaXIsIGlnLCBpYjsNCisgICAgICAgICBpbnQgciA9IChwYWxldHRlW2ldLnJlZCA+PiAoOCAtIFBOR19RVUFOVElaRV9SRURfQklUUykpOw0KKyAgICAgICAgIGludCBnID0gKHBhbGV0dGVbaV0uZ3JlZW4gPj4gKDggLSBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykpOw0KKyAgICAgICAgIGludCBiID0gKHBhbGV0dGVbaV0uYmx1ZSA+PiAoOCAtIFBOR19RVUFOVElaRV9CTFVFX0JJVFMpKTsNCisNCisgICAgICAgICBmb3IgKGlyID0gMDsgaXIgPCBudW1fcmVkOyBpcisrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBpbnQgZHIgPSBhYnMoaXIgLSByKTsgKi8NCisgICAgICAgICAgICBpbnQgZHIgPSAoKGlyID4gcikgPyBpciAtIHIgOiByIC0gaXIpOw0KKyAgICAgICAgICAgIGludCBpbmRleF9yID0gKGlyIDw8IChQTkdfUVVBTlRJWkVfQkxVRV9CSVRTICsNCisgICAgICAgICAgICAgICAgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpKTsNCisNCisgICAgICAgICAgICBmb3IgKGlnID0gMDsgaWcgPCBudW1fZ3JlZW47IGlnKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIC8qIGludCBkZyA9IGFicyhpZyAtIGcpOyAqLw0KKyAgICAgICAgICAgICAgIGludCBkZyA9ICgoaWcgPiBnKSA/IGlnIC0gZyA6IGcgLSBpZyk7DQorICAgICAgICAgICAgICAgaW50IGR0ID0gZHIgKyBkZzsNCisgICAgICAgICAgICAgICBpbnQgZG0gPSAoKGRyID4gZGcpID8gZHIgOiBkZyk7DQorICAgICAgICAgICAgICAgaW50IGluZGV4X2cgPSBpbmRleF9yIHwgKGlnIDw8IFBOR19RVUFOVElaRV9CTFVFX0JJVFMpOw0KKw0KKyAgICAgICAgICAgICAgIGZvciAoaWIgPSAwOyBpYiA8IG51bV9ibHVlOyBpYisrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpbnQgZF9pbmRleCA9IGluZGV4X2cgfCBpYjsNCisgICAgICAgICAgICAgICAgICAvKiBpbnQgZGIgPSBhYnMoaWIgLSBiKTsgKi8NCisgICAgICAgICAgICAgICAgICBpbnQgZGIgPSAoKGliID4gYikgPyBpYiAtIGIgOiBiIC0gaWIpOw0KKyAgICAgICAgICAgICAgICAgIGludCBkbWF4ID0gKChkbSA+IGRiKSA/IGRtIDogZGIpOw0KKyAgICAgICAgICAgICAgICAgIGludCBkID0gZG1heCArIGR0ICsgZGI7DQorDQorICAgICAgICAgICAgICAgICAgaWYgKGQgPCAoaW50KWRpc3RhbmNlW2RfaW5kZXhdKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVtkX2luZGV4XSA9IChwbmdfYnl0ZSlkOw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwW2RfaW5kZXhdID0gKHBuZ19ieXRlKWk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBkaXN0YW5jZSk7DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KK3ZvaWQgUE5HRkFQSQ0KK3BuZ19zZXRfZ2FtbWFfZml4ZWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludCBzY3JuX2dhbW1hLA0KKyAgIHBuZ19maXhlZF9wb2ludCBmaWxlX2dhbW1hKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZ2FtbWFfZml4ZWQiKTsNCisNCisgICBpZiAoIXBuZ19ydHJhbl9vayhwbmdfcHRyLCAwKSkNCisgICAgICByZXR1cm47DQorDQorICAgLyogTmV3IGluIGxpYnBuZy0xLjUuNCAtIHJlc2VydmUgcGFydGljdWxhciBuZWdhdGl2ZSB2YWx1ZXMgYXMgZmxhZ3MuICovDQorICAgc2Nybl9nYW1tYSA9IHRyYW5zbGF0ZV9nYW1tYV9mbGFncyhwbmdfcHRyLCBzY3JuX2dhbW1hLCAxLypzY3JlZW4qLyk7DQorICAgZmlsZV9nYW1tYSA9IHRyYW5zbGF0ZV9nYW1tYV9mbGFncyhwbmdfcHRyLCBmaWxlX2dhbW1hLCAwLypmaWxlKi8pOw0KKw0KKyAgIC8qIENoZWNraW5nIHRoZSBnYW1tYSB2YWx1ZXMgZm9yIGJlaW5nID4wIHdhcyBhZGRlZCBpbiAxLjUuNCBhbG9uZyB3aXRoIHRoZQ0KKyAgICAqIHByZW11bHRpcGxpZWQgYWxwaGEgc3VwcG9ydDsgdGhpcyBhY3R1YWxseSBoaWRlcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZQ0KKyAgICAqIG9mIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3aGljaCBhbGxvd2VkIGdhbW1hIHByb2Nlc3NpbmcgdG8gYmUNCisgICAgKiBkaXNhYmxlZCBpbiBiYWNrZ3JvdW5kIGhhbmRsaW5nLiAgVGhlcmUgaXMgbm8gZXZpZGVuY2UgKHNvIGZhcikgdGhhdCB0aGlzDQorICAgICogd2FzIGJlaW5nIHVzZWQ7IGhvd2V2ZXIsIHBuZ19zZXRfYmFja2dyb3VuZCBpdHNlbGYgYWNjZXB0ZWQgYW5kIG11c3Qgc3RpbGwNCisgICAgKiBhY2NlcHQgJzAnIGZvciB0aGUgZ2FtbWEgdmFsdWUgaXQgdGFrZXMsIGJlY2F1c2UgaXQgaXNuJ3QgYWx3YXlzIHVzZWQuDQorICAgICoNCisgICAgKiBTaW5jZSB0aGlzIGlzIGFuIEFQSSBjaGFuZ2UgKGFsYmVpdCBhIHZlcnkgbWlub3Igb25lIHRoYXQgcmVtb3ZlcyBhbg0KKyAgICAqIHVuZG9jdW1lbnRlZCBBUEkgZmVhdHVyZSkgdGhlIGZvbGxvd2luZyBjaGVja3Mgd2VyZSBvbmx5IGVuYWJsZWQgaW4NCisgICAgKiBsaWJwbmctMS42LjAuDQorICAgICovDQorICAgaWYgKGZpbGVfZ2FtbWEgPD0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgZmlsZSBnYW1tYSBpbiBwbmdfc2V0X2dhbW1hIik7DQorDQorICAgaWYgKHNjcm5fZ2FtbWEgPD0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgc2NyZWVuIGdhbW1hIGluIHBuZ19zZXRfZ2FtbWEiKTsNCisNCisgICAvKiBTZXQgdGhlIGdhbW1hIHZhbHVlcyB1bmNvbmRpdGlvbmFsbHkgLSB0aGlzIG92ZXJyaWRlcyB0aGUgdmFsdWUgaW4gdGhlIFBORw0KKyAgICAqIGZpbGUgaWYgYSBnQU1BIGNodW5rIHdhcyBwcmVzZW50LiAgcG5nX3NldF9hbHBoYV9tb2RlIHByb3ZpZGVzIGENCisgICAgKiBkaWZmZXJlbnQsIGVhc2llciwgd2F5IHRvIGRlZmF1bHQgdGhlIGZpbGUgZ2FtbWEuDQorICAgICovDQorICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9IGZpbGVfZ2FtbWE7DQorICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9IQVZFX0dBTU1BOw0KKyAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA9IHNjcm5fZ2FtbWE7DQorfQ0KKw0KKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfZ2FtbWEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGRvdWJsZSBzY3JuX2dhbW1hLCBkb3VibGUgZmlsZV9nYW1tYSkNCit7DQorICAgcG5nX3NldF9nYW1tYV9maXhlZChwbmdfcHRyLCBjb252ZXJ0X2dhbW1hX3ZhbHVlKHBuZ19wdHIsIHNjcm5fZ2FtbWEpLA0KKyAgICAgIGNvbnZlcnRfZ2FtbWFfdmFsdWUocG5nX3B0ciwgZmlsZV9nYW1tYSkpOw0KK30NCisjICBlbmRpZiAvKiBGTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8NCisjZW5kaWYgLyogUkVBRF9HQU1NQSAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEDQorLyogRXhwYW5kIHBhbGV0dGVkIGltYWdlcyB0byBSR0IsIGV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIG9mDQorICogbGVzcyB0aGFuIDgtYml0IGRlcHRoIHRvIDgtYml0IGRlcHRoLCBhbmQgZXhwYW5kIHRSTlMgY2h1bmtzDQorICogdG8gYWxwaGEgY2hhbm5lbHMuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2V4cGFuZChwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2V4cGFuZCIpOw0KKw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gKFBOR19FWFBBTkQgfCBQTkdfRVhQQU5EX3RSTlMpOw0KK30NCisNCisvKiBHUlIgMTk5OTA2Mjc6ICB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBjdXJyZW50bHkgYXJlIGlkZW50aWNhbA0KKyAqICB0byBwbmdfc2V0X2V4cGFuZCgpLiAgSG93ZXZlciwgaXQgaXMgZW50aXJlbHkgcmVhc29uYWJsZSB0aGF0IHNvbWVvbmUNCisgKiAgbWlnaHQgd2lzaCB0byBleHBhbmQgYW4gaW5kZXhlZCBpbWFnZSB0byBSR0IgYnV0ICpub3QqIGV4cGFuZCBhIHNpbmdsZSwNCisgKiAgZnVsbHkgdHJhbnNwYXJlbnQgcGFsZXR0ZSBlbnRyeSB0byBhIGZ1bGwgYWxwaGEgY2hhbm5lbC0tcGVyaGFwcyBpbnN0ZWFkDQorICogIGNvbnZlcnQgdFJOUyB0byB0aGUgZ3JheXNjYWxlL1JHQiBmb3JtYXQgKDE2LWJpdCBSR0IgdmFsdWUpLCBvciByZXBsYWNlDQorICogIHRoZSB0cmFuc3BhcmVudCBjb2xvciB3aXRoIGEgcGFydGljdWxhciBSR0IgdmFsdWUsIG9yIGRyb3AgdFJOUyBlbnRpcmVseS4NCisgKiAgSU9XLCBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG1heSBtYWtlIHRoZSB0cmFuc2Zvcm1hdGlvbnMgZmxhZw0KKyAqICBhIGJpdCBtb3JlIGZpbmUtZ3JhaW5lZCwgd2l0aCBzZXBhcmF0ZSBiaXRzIGZvciBlYWNoIG9mIHRoZXNlIHRocmVlDQorICogIGZ1bmN0aW9ucy4NCisgKg0KKyAqICBNb3JlIHRvIHRoZSBwb2ludCwgdGhlc2UgZnVuY3Rpb25zIG1ha2UgaXQgb2J2aW91cyB3aGF0IGxpYnBuZyB3aWxsIGJlDQorICogIGRvaW5nLCB3aGVyZWFzICJleHBhbmQiIGNhbiAoYW5kIGRvZXMpIG1lYW4gYW55IG51bWJlciBvZiB0aGluZ3MuDQorICoNCisgKiAgR1JQIDIwMDYwMzA3OiBJbiBsaWJwbmctMS4yLjksIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgd2FzIG1vZGlmaWVkDQorICogIHRvIGV4cGFuZCBvbmx5IHRoZSBzYW1wbGUgZGVwdGggYnV0IG5vdCB0byBleHBhbmQgdGhlIHRSTlMgdG8gYWxwaGENCisgKiAgYW5kIGl0cyBuYW1lIHdhcyBjaGFuZ2VkIHRvIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpLg0KKyAqLw0KKw0KKy8qIEV4cGFuZCBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLiAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiIik7DQorDQorICAgaWYgKCFwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7DQorfQ0KKw0KKy8qIEV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIG9mIGxlc3MgdGhhbiA4LWJpdCBkZXB0aCB0byA4IGJpdHMuICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184Iik7DQorDQorICAgaWYgKCFwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRVhQQU5EOw0KK30NCisNCisvKiBFeHBhbmQgdFJOUyBjaHVua3MgdG8gYWxwaGEgY2hhbm5lbHMuICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3RSTlNfdG9fYWxwaGEocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF90Uk5TX3RvX2FscGhhIik7DQorDQorICAgaWYgKCFwbmdfcnRyYW5fb2socG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7DQorfQ0KKyNlbmRpZiAvKiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpICovDQorDQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQNCisvKiBFeHBhbmQgdG8gMTYtYml0IGNoYW5uZWxzLCBleHBhbmQgdGhlIHRSTlMgY2h1bmsgdG9vIChiZWNhdXNlIG90aGVyd2lzZQ0KKyAqIGl0IG1heSBub3Qgd29yayBjb3JyZWN0bHkuKQ0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9leHBhbmRfMTYocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9leHBhbmRfMTYiKTsNCisNCisgICBpZiAoIXBuZ19ydHJhbl9vayhwbmdfcHRyLCAwKSkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IChQTkdfRVhQQU5EXzE2IHwgUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfZ3JheV90b19yZ2IocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9ncmF5X3RvX3JnYiIpOw0KKw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBCZWNhdXNlIHJnYiBtdXN0IGJlIDggYml0cyBvciBtb3JlOiAqLw0KKyAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0dSQVlfVE9fUkdCOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQordm9pZCBQTkdGQVBJDQorcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGVycm9yX2FjdGlvbiwNCisgICAgcG5nX2ZpeGVkX3BvaW50IHJlZCwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmdiX3RvX2dyYXkiKTsNCisNCisgICAvKiBOZWVkIHRoZSBJSERSIGhlcmUgYmVjYXVzZSBvZiB0aGUgY2hlY2sgb24gY29sb3JfdHlwZSBiZWxvdy4gKi8NCisgICAvKiBUT0RPOiBmaXggdGhpcyAqLw0KKyAgIGlmICghcG5nX3J0cmFuX29rKHBuZ19wdHIsIDEpKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBzd2l0Y2goZXJyb3JfYWN0aW9uKQ0KKyAgIHsNCisgICAgICBjYXNlIFBOR19FUlJPUl9BQ1RJT05fTk9ORToNCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1JHQl9UT19HUkFZOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0VSUk9SX0FDVElPTl9XQVJOOg0KKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUkdCX1RPX0dSQVlfV0FSTjsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19FUlJPUl9BQ1RJT05fRVJST1I6DQorICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19SR0JfVE9fR1JBWV9FUlI7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgZXJyb3IgYWN0aW9uIHRvIHJnYl90b19ncmF5Iik7DQorICAgICAgICAgYnJlYWs7DQorICAgfQ0KKw0KKyAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpDQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsNCisjZWxzZQ0KKyAgIHsNCisgICAgICAvKiBNYWtlIHRoaXMgYW4gZXJyb3IgaW4gMS42IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBhcHBsaWNhdGlvbiBtYXkgYXNzdW1lDQorICAgICAgICogdGhhdCBpdCBqdXN0IHdvcmtlZCBhbmQgZ2V0IGEgbWVtb3J5IG92ZXJ3cml0ZS4NCisgICAgICAgKi8NCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwNCisgICAgICAgICJDYW5ub3QgZG8gUkdCX1RPX0dSQVkgd2l0aG91dCBFWFBBTkRfU1VQUE9SVEVEIik7DQorDQorICAgICAgLyogcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfUkdCX1RPX0dSQVk7ICovDQorICAgfQ0KKyNlbmRpZg0KKyAgIHsNCisgICAgICBpZiAocmVkID49IDAgJiYgZ3JlZW4gPj0gMCAmJiByZWQgKyBncmVlbiA8PSBQTkdfRlBfMSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3VpbnRfMTYgcmVkX2ludCwgZ3JlZW5faW50Ow0KKw0KKyAgICAgICAgIC8qIE5PVEU6IHRoaXMgY2FsY3VsYXRpb24gZG9lcyBub3Qgcm91bmQsIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIHJldGFpbmVkDQorICAgICAgICAgICogZm9yIGNvbnNpc3RlbmN5LCB0aGUgaW5hY2N1cmFjeSBpcyB2ZXJ5IHNtYWxsLiAgVGhlIGNvZGUgaGVyZSBhbHdheXMNCisgICAgICAgICAgKiBvdmVyd3JpdGVzIHRoZSBjb2VmZmljaWVudHMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGhhdmUgYmVlbg0KKyAgICAgICAgICAqIGRlZmF1bHRlZCBvciBzZXQgYWxyZWFkeS4NCisgICAgICAgICAgKi8NCisgICAgICAgICByZWRfaW50ID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzMyKXJlZCozMjc2OCkvMTAwMDAwKTsNCisgICAgICAgICBncmVlbl9pbnQgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMzIpZ3JlZW4qMzI3NjgpLzEwMDAwMCk7DQorDQorICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfcmVkX2NvZWZmICAgPSByZWRfaW50Ow0KKyAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2dyZWVuX2NvZWZmID0gZ3JlZW5faW50Ow0KKyAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2NvZWZmaWNpZW50c19zZXQgPSAxOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIGlmIChyZWQgPj0gMCAmJiBncmVlbiA+PSAwKQ0KKyAgICAgICAgICAgIHBuZ19hcHBfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICJpZ25vcmluZyBvdXQgb2YgcmFuZ2UgcmdiX3RvX2dyYXkgY29lZmZpY2llbnRzIik7DQorDQorICAgICAgICAgLyogVXNlIHRoZSBkZWZhdWx0cywgZnJvbSB0aGUgY0hSTSBjaHVuayBpZiBzZXQsIGVsc2UgdGhlIGhpc3RvcmljYWwNCisgICAgICAgICAgKiB2YWx1ZXMgd2hpY2ggYXJlIGNsb3NlIHRvIHRoZSBzUkdCL0hEVFYvSVRVLVJlYyA3MDkgdmFsdWVzLiAgU2VlDQorICAgICAgICAgICogcG5nX2RvX3JnYl90b19ncmF5IGZvciBtb3JlIGRpc2N1c3Npb24gb2YgdGhlIHZhbHVlcy4gIEluIHRoaXMgY2FzZQ0KKyAgICAgICAgICAqIHRoZSBjb2VmZmljaWVudHMgYXJlIG5vdCBtYXJrZWQgYXMgJ3NldCcgYW5kIGFyZSBub3Qgb3ZlcndyaXR0ZW4gaWYNCisgICAgICAgICAgKiBzb21ldGhpbmcgaGFzIGFscmVhZHkgcHJvdmlkZWQgYSBkZWZhdWx0Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmYgPT0gMCAmJg0KKyAgICAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2dyZWVuX2NvZWZmID09IDApDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X3JlZF9jb2VmZiAgID0gNjk2ODsNCisgICAgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZiA9IDIzNDM0Ow0KKyAgICAgICAgICAgIC8qIHBuZ19wdHItPnJnYl90b19ncmF5X2JsdWVfY29lZmYgID0gMjM2NjsgKi8NCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCit9DQorDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCisvKiBDb252ZXJ0IGEgUkdCIGltYWdlIHRvIGEgZ3JheXNjYWxlIG9mIHRoZSBzYW1lIHdpZHRoLiAgVGhpcyBhbGxvd3MgdXMsDQorICogZm9yIGV4YW1wbGUsIHRvIGNvbnZlcnQgYSAyNCBicHAgUkdCIGltYWdlIGludG8gYW4gOCBicHAgZ3JheXNjYWxlIGltYWdlLg0KKyAqLw0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGVycm9yX2FjdGlvbiwgZG91YmxlIHJlZCwNCisgICBkb3VibGUgZ3JlZW4pDQorew0KKyAgIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3B0ciwgZXJyb3JfYWN0aW9uLA0KKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCByZWQsICJyZ2IgdG8gZ3JheSByZWQgY29lZmZpY2llbnQiKSwNCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgZ3JlZW4sICJyZ2IgdG8gZ3JheSBncmVlbiBjb2VmZmljaWVudCIpKTsNCit9DQorI2VuZGlmIC8qIEZMT0FUSU5HIFBPSU5UICovDQorDQorI2VuZGlmIC8qIFJHQl9UT19HUkFZICovDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0cg0KKyAgICByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiIpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1VTRVJfVFJBTlNGT1JNOw0KKyAgIHBuZ19wdHItPnJlYWRfdXNlcl90cmFuc2Zvcm1fZm4gPSByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorLyogSW4gdGhlIGNhc2Ugb2YgZ2FtbWEgdHJhbnNmb3JtYXRpb25zIG9ubHkgZG8gdHJhbnNmb3JtYXRpb25zIG9uIGltYWdlcyB3aGVyZQ0KKyAqIHRoZSBbZmlsZV0gZ2FtbWEgYW5kIHNjcmVlbl9nYW1tYSBhcmUgbm90IGNsb3NlIHJlY2lwcm9jYWxzLCBvdGhlcndpc2UgaXQNCisgKiBzbG93cyB0aGluZ3MgZG93biBzbGlnaHRseSwgYW5kIGFsc28gbmVlZGxlc3NseSBpbnRyb2R1Y2VzIHNtYWxsIGVycm9ycy4NCisgKi8NCitzdGF0aWMgaW50IC8qIFBSSVZBVEUgKi8NCitwbmdfZ2FtbWFfdGhyZXNob2xkKHBuZ19maXhlZF9wb2ludCBzY3JlZW5fZ2FtbWEsIHBuZ19maXhlZF9wb2ludCBmaWxlX2dhbW1hKQ0KK3sNCisgICAvKiBQTkdfR0FNTUFfVEhSRVNIT0xEIGlzIHRoZSB0aHJlc2hvbGQgZm9yIHBlcmZvcm1pbmcgZ2FtbWENCisgICAgKiBjb3JyZWN0aW9uIGFzIGEgZGlmZmVyZW5jZSBvZiB0aGUgb3ZlcmFsbCB0cmFuc2Zvcm0gZnJvbSAxLjANCisgICAgKg0KKyAgICAqIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgdGhyZXNob2xkIHdpdGggcypmIC0gMSwgaWYgd2UgZ2V0DQorICAgICogb3ZlcmZsb3cgaGVyZSBpdCBpcyBiZWNhdXNlIG9mIHdhY2t5IGdhbW1hIHZhbHVlcyBzbyB3ZQ0KKyAgICAqIHR1cm4gb24gcHJvY2Vzc2luZyBhbnl3YXkuDQorICAgICovDQorICAgcG5nX2ZpeGVkX3BvaW50IGd0ZXN0Ow0KKyAgIHJldHVybiAhcG5nX211bGRpdigmZ3Rlc3QsIHNjcmVlbl9nYW1tYSwgZmlsZV9nYW1tYSwgUE5HX0ZQXzEpIHx8DQorICAgICAgIHBuZ19nYW1tYV9zaWduaWZpY2FudChndGVzdCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBuZWVkZWQgZm9yIHRoZSByZWFkLiAgVGhpcyBpbmNsdWRlcyBtb2RpZnlpbmcNCisgKiB0aGUgcGFsZXR0ZS4NCisgKi8NCisNCisvKkZvciB0aGUgbW9tZW50ICdwbmdfaW5pdF9wYWxldHRlX3RyYW5zZm9ybWF0aW9ucycgYW5kDQorICogJ3BuZ19pbml0X3JnYl90cmFuc2Zvcm1hdGlvbnMnIG9ubHkgZG8gc29tZSBmbGFnIGNhbmNlbGluZyBvcHRpbWl6YXRpb25zLg0KKyAqIFRoZSBpbnRlbnQgaXMgdGhhdCB0aGVzZSB0d28gcm91dGluZXMgc2hvdWxkIGhhdmUgcGFsZXR0ZSBvciByZ2Igb3BlcmF0aW9ucw0KKyAqIGV4dHJhY3RlZCBmcm9tICdwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucycuDQorICovDQorc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19pbml0X3BhbGV0dGVfdHJhbnNmb3JtYXRpb25zKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICAvKiBDYWxsZWQgdG8gaGFuZGxlIHRoZSAoaW5wdXQpIHBhbGV0dGUgY2FzZS4gIEluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucw0KKyAgICAqIHRoZSBmaXJzdCBzdGVwIGlzIHRvIGV4cGFuZCB0aGUgcGFsZXR0ZSBpZiByZXF1ZXN0ZWQsIHNvIHRoaXMgY29kZSBtdXN0DQorICAgICogdGFrZSBjYXJlIHRvIG9ubHkgbWFrZSBjaGFuZ2VzIHRoYXQgYXJlIGludmFyaWFudCB3aXRoIHJlc3BlY3QgdG8gdGhlDQorICAgICogcGFsZXR0ZSBleHBhbnNpb24sIG9yIG9ubHkgZG8gdGhlbSBpZiB0aGVyZSBpcyBubyBleHBhbnNpb24uDQorICAgICoNCisgICAgKiBTVFJJUF9BTFBIQSBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgaW4gdGhlIGNhbGxlciAoYnkgc2V0dGluZyBudW1fdHJhbnMNCisgICAgKiB0byAwLikNCisgICAgKi8NCisgICBpbnQgaW5wdXRfaGFzX2FscGhhID0gMDsNCisgICBpbnQgaW5wdXRfaGFzX3RyYW5zcGFyZW5jeSA9IDA7DQorDQorICAgaWYgKHBuZ19wdHItPm51bV90cmFucyA+IDApDQorICAgew0KKyAgICAgIGludCBpOw0KKw0KKyAgICAgIC8qIElnbm9yZSBpZiBhbGwgdGhlIGVudHJpZXMgYXJlIG9wYXF1ZSAodW5saWtlbHkhKSAqLw0KKyAgICAgIGZvciAoaT0wOyBpPHBuZ19wdHItPm51bV90cmFuczsgKytpKQ0KKyAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSA9PSAyNTUpDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gPT0gMCkNCisgICAgICAgICAgICBpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID0gMTsNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgaW5wdXRfaGFzX2FscGhhID0gMTsNCisgICB9DQorDQorICAgLyogSWYgbm8gYWxwaGEgd2UgY2FuIG9wdGltaXplLiAqLw0KKyAgIGlmICghaW5wdXRfaGFzX2FscGhhKQ0KKyAgIHsNCisgICAgICAvKiBBbnkgYWxwaGEgbWVhbnMgYmFja2dyb3VuZCBhbmQgYXNzb2NpYXRpdmUgYWxwaGEgcHJvY2Vzc2luZyBpcw0KKyAgICAgICAqIHJlcXVpcmVkLCBob3dldmVyIGlmIHRoZSBhbHBoYSBpcyAwIG9yIDEgdGhyb3VnaG91dCBPUFRJSU1JWkVfQUxQSEENCisgICAgICAgKiBhbmQgRU5DT0RFX0FMUEhBIGFyZSBpcnJlbGV2YW50Lg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0VOQ09ERV9BTFBIQTsNCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEE7DQorDQorICAgICAgaWYgKCFpbnB1dF9oYXNfdHJhbnNwYXJlbmN5KQ0KKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+KFBOR19DT01QT1NFIHwgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKTsNCisgICB9DQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkNCisgICAvKiBwbmdfc2V0X2JhY2tncm91bmQgaGFuZGxpbmcgLSBkZWFscyB3aXRoIHRoZSBjb21wbGV4aXR5IG9mIHdoZXRoZXIgdGhlDQorICAgICogYmFja2dyb3VuZCBjb2xvciBpcyBpbiB0aGUgZmlsZSBmb3JtYXQgb3IgdGhlIHNjcmVlbiBmb3JtYXQgaW4gdGhlIGNhc2UNCisgICAgKiB3aGVyZSBhbiAnZXhwYW5kJyB3aWxsIGhhcHBlbi4NCisgICAgKi8NCisNCisgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IGJlIGVudGVyZWQgaW4gdGhlIGFscGhhIHByZS1tdWx0aXBsaWNhdGlvbiBjYXNlDQorICAgICogYmVjYXVzZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgY2FuY2VsbGVkIGJlbG93Lg0KKyAgICAqLw0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAmJg0KKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkpDQorICAgew0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAgID0NCisgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5yZWQ7DQorICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9DQorICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbcG5nX3B0ci0+YmFja2dyb3VuZC5pbmRleF0uZ3JlZW47DQorICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlICA9DQorICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbcG5nX3B0ci0+YmFja2dyb3VuZC5pbmRleF0uYmx1ZTsNCisNCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRA0KKyAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpDQorICAgICAgICB7DQorICAgICAgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpKQ0KKyAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIChpbiB0Uk5TKSB1bmxlc3MgdGhlIHBpeGVscyBhcmUNCisgICAgICAgICAgICAgICAqIGdvaW5nIHRvIGJlIGV4cGFuZGVkLCBpbiB3aGljaCBjYXNlIGxlYXZlIGl0IGZvciBsYXRlcg0KKyAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICBpbnQgaSwgaXN0b3AgPSBwbmdfcHRyLT5udW1fdHJhbnM7DQorDQorICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxpc3RvcDsgaSsrKQ0KKyAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gPSAocG5nX2J5dGUpKDI1NSAtDQorICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19hbHBoYVtpXSk7DQorICAgICAgICAgICB9DQorICAgICAgICB9DQorI2VuZGlmIC8qIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQgKi8NCisgICAgICB9DQorICAgfSAvKiBiYWNrZ3JvdW5kIGV4cGFuZCBhbmQgKHRoZXJlZm9yZSkgbm8gYWxwaGEgYXNzb2NpYXRpb24uICovDQorI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgJiYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgKi8NCit9DQorDQorc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19pbml0X3JnYl90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNDogY2hlY2sgdGhlIGNvbG9yIHR5cGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUNCisgICAgKiBpcyBhbnkgYWxwaGEgb3IgdHJhbnNwYXJlbmN5IGluIHRoZSBpbWFnZSBhbmQgc2ltcGx5IGNhbmNlbCB0aGUNCisgICAgKiBiYWNrZ3JvdW5kIGFuZCBhbHBoYSBtb2RlIHN0dWZmIGlmIHRoZXJlIGlzbid0Lg0KKyAgICAqLw0KKyAgIGludCBpbnB1dF9oYXNfYWxwaGEgPSAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwOw0KKyAgIGludCBpbnB1dF9oYXNfdHJhbnNwYXJlbmN5ID0gcG5nX3B0ci0+bnVtX3RyYW5zID4gMDsNCisNCisgICAvKiBJZiBubyBhbHBoYSB3ZSBjYW4gb3B0aW1pemUuICovDQorICAgaWYgKCFpbnB1dF9oYXNfYWxwaGEpDQorICAgew0KKyAgICAgIC8qIEFueSBhbHBoYSBtZWFucyBiYWNrZ3JvdW5kIGFuZCBhc3NvY2lhdGl2ZSBhbHBoYSBwcm9jZXNzaW5nIGlzDQorICAgICAgICogcmVxdWlyZWQsIGhvd2V2ZXIgaWYgdGhlIGFscGhhIGlzIDAgb3IgMSB0aHJvdWdob3V0IE9QVElJTUlaRV9BTFBIQQ0KKyAgICAgICAqIGFuZCBFTkNPREVfQUxQSEEgYXJlIGlycmVsZXZhbnQuDQorICAgICAgICovDQorIyAgICAgaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQNCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19FTkNPREVfQUxQSEE7DQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX09QVElNSVpFX0FMUEhBOw0KKyMgICAgIGVuZGlmDQorDQorICAgICAgaWYgKCFpbnB1dF9oYXNfdHJhbnNwYXJlbmN5KQ0KKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+KFBOR19DT01QT1NFIHwgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKTsNCisgICB9DQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkNCisgICAvKiBwbmdfc2V0X2JhY2tncm91bmQgaGFuZGxpbmcgLSBkZWFscyB3aXRoIHRoZSBjb21wbGV4aXR5IG9mIHdoZXRoZXIgdGhlDQorICAgICogYmFja2dyb3VuZCBjb2xvciBpcyBpbiB0aGUgZmlsZSBmb3JtYXQgb3IgdGhlIHNjcmVlbiBmb3JtYXQgaW4gdGhlIGNhc2UNCisgICAgKiB3aGVyZSBhbiAnZXhwYW5kJyB3aWxsIGhhcHBlbi4NCisgICAgKi8NCisNCisgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IGJlIGVudGVyZWQgaW4gdGhlIGFscGhhIHByZS1tdWx0aXBsaWNhdGlvbiBjYXNlDQorICAgICogYmVjYXVzZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgY2FuY2VsbGVkIGJlbG93Lg0KKyAgICAqLw0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAmJg0KKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkgJiYNCisgICAgICAgIShwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQ0KKyAgICAgICAvKiBpLmUuLCBHUkFZIG9yIEdSQVlfQUxQSEEgKi8NCisgICB7DQorICAgICAgew0KKyAgICAgICAgIC8qIEV4cGFuZCBiYWNrZ3JvdW5kIGFuZCB0Uk5TIGNodW5rcyAqLw0KKyAgICAgICAgIGludCBncmF5ID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5Ow0KKyAgICAgICAgIGludCB0cmFuc19ncmF5ID0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheTsNCisNCisgICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPmJpdF9kZXB0aCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgIGdyYXkgKj0gMHhmZjsNCisgICAgICAgICAgICAgICB0cmFuc19ncmF5ICo9IDB4ZmY7DQorICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgICAgIGdyYXkgKj0gMHg1NTsNCisgICAgICAgICAgICAgICB0cmFuc19ncmF5ICo9IDB4NTU7DQorICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgICAgIGdyYXkgKj0gMHgxMTsNCisgICAgICAgICAgICAgICB0cmFuc19ncmF5ICo9IDB4MTE7DQorICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgZGVmYXVsdDoNCisNCisgICAgICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIIChBbHJlYWR5IDggYml0cykgKi8NCisNCisgICAgICAgICAgICBjYXNlIDE2Og0KKyAgICAgICAgICAgICAgIC8qIEFscmVhZHkgYSBmdWxsIDE2IGJpdHMgKi8NCisgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0NCisgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSAocG5nX3VpbnRfMTYpZ3JheTsNCisNCisgICAgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19jb2xvci5yZWQgPSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmVlbiA9DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSA9IChwbmdfdWludF8xNil0cmFuc19ncmF5Ow0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfSAvKiBiYWNrZ3JvdW5kIGV4cGFuZCBhbmQgKHRoZXJlZm9yZSkgbm8gYWxwaGEgYXNzb2NpYXRpb24uICovDQorI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgJiYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgKi8NCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMiKTsNCisNCisgICAvKiBUaGlzIGludGVybmFsIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHBuZ19yZWFkX3N0YXJ0X3JvdyBpbiBwbmdydXRpbC5jDQorICAgICogYW5kIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlICdyb3dieXRlcycgY2FsY3VsYXRpb24gaXMgZG9uZSwgc28gdGhlIGNvZGUNCisgICAgKiBpbiBoZXJlIGNhbiBjaGFuZ2Ugb3IgdXBkYXRlIHRoZSB0cmFuc2Zvcm1hdGlvbnMgZmxhZ3MuDQorICAgICoNCisgICAgKiBGaXJzdCBkbyB1cGRhdGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiB0aGUgZGV0YWlscyBvZiB0aGUgUE5HIGltYWdlIGRhdGENCisgICAgKiBiZWluZyBwcm9jZXNzZWQuDQorICAgICovDQorDQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyAgIC8qIFByaW9yIHRvIDEuNS40IHRoZXNlIHRlc3RzIHdlcmUgcGVyZm9ybWVkIGZyb20gcG5nX3NldF9nYW1tYSwgMS41LjQgYWRkcw0KKyAgICAqIHBuZ19zZXRfYWxwaGFfbW9kZSBhbmQgdGhpcyBpcyBhbm90aGVyIHNvdXJjZSBmb3IgYSBkZWZhdWx0IGZpbGUgZ2FtbWEgc28NCisgICAgKiB0aGUgdGVzdCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgbGF0ZXIgLSBoZXJlLiAgSW4gYWRkaXRpb24gcHJpb3IgdG8gMS41LjQNCisgICAgKiB0aGUgdGVzdHMgd2VyZSByZXBlYXRlZCBmb3IgdGhlIFBBTEVUVEUgY29sb3IgdHlwZSBoZXJlIC0gdGhpcyBpcyBubw0KKyAgICAqIGxvbmdlciBuZWNlc3NhcnkgKGFuZCBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBiZWVuIG5lY2Vzc2FyeSBiZWZvcmUuKQ0KKyAgICAqLw0KKyAgIHsNCisgICAgICAvKiBUaGUgZm9sbG93aW5nIHRlbXBvcmFyeSBpbmRpY2F0ZXMgaWYgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIGlzDQorICAgICAgICogcmVxdWlyZWQuDQorICAgICAgICovDQorICAgICAgaW50IGdhbW1hX2NvcnJlY3Rpb24gPSAwOw0KKw0KKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hICE9IDApIC8qIGhhcyBiZWVuIHNldCAqLw0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX3B0ci0+c2NyZWVuX2dhbW1hICE9IDApIC8qIHNjcmVlbiBzZXQgdG9vICovDQorICAgICAgICAgICAgZ2FtbWFfY29ycmVjdGlvbiA9IHBuZ19nYW1tYV90aHJlc2hvbGQocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSwNCisgICAgICAgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAvKiBBc3N1bWUgdGhlIG91dHB1dCBtYXRjaGVzIHRoZSBpbnB1dDsgYSBsb25nIHRpbWUgZGVmYXVsdCBiZWhhdmlvcg0KKyAgICAgICAgICAgICAqIG9mIGxpYnBuZywgYWx0aG91Z2ggdGhlIHN0YW5kYXJkIGhhcyBub3RoaW5nIHRvIHNheSBhYm91dCB0aGlzLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA9IHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgIT0gMCkNCisgICAgICAgICAvKiBUaGUgY29udmVyc2UgLSBhc3N1bWUgdGhlIGZpbGUgbWF0Y2hlcyB0aGUgc2NyZWVuLCBub3RlIHRoYXQgdGhpcw0KKyAgICAgICAgICAqIHBlcmhhcHMgdW5kZXNpcmVhYmxlIGRlZmF1bHQgY2FuIChmcm9tIDEuNS40KSBiZSBjaGFuZ2VkIGJ5IGNhbGxpbmcNCisgICAgICAgICAgKiBwbmdfc2V0X2FscGhhX21vZGUgKGV2ZW4gaWYgdGhlIGFscGhhIGhhbmRsaW5nIG1vZGUgaXNuJ3QgcmVxdWlyZWQNCisgICAgICAgICAgKiBvciBpc24ndCBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuKQ0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEgPSBwbmdfcmVjaXByb2NhbChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOw0KKw0KKyAgICAgIGVsc2UgLyogbmVpdGhlciBhcmUgc2V0ICovDQorICAgICAgICAgLyogSnVzdCBpbiBjYXNlIHRoZSBmb2xsb3dpbmcgcHJldmVudHMgYW55IHByb2Nlc3NpbmcgLSBmaWxlIGFuZCBzY3JlZW4NCisgICAgICAgICAgKiBhcmUgYm90aCBhc3N1bWVkIHRvIGJlIGxpbmVhciBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGludHJvZHVjZSBhDQorICAgICAgICAgICogdGhpcmQgZ2FtbWEgdmFsdWUgb3RoZXIgdGhhbiBwbmdfc2V0X2JhY2tncm91bmQgd2l0aCAnVU5JUVVFJywgYW5kLA0KKyAgICAgICAgICAqIHByaW9yIHRvIDEuNS40DQorICAgICAgICAgICovDQorICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hID0gcG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9IFBOR19GUF8xOw0KKw0KKyAgICAgIC8qIFdlIGhhdmUgYSBnYW1tYSB2YWx1ZSBub3cuICovDQorICAgICAgcG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9IQVZFX0dBTU1BOw0KKw0KKyAgICAgIC8qIE5vdyB0dXJuIHRoZSBnYW1tYSB0cmFuc2Zvcm1hdGlvbiBvbiBvciBvZmYgYXMgYXBwcm9wcmlhdGUuICBOb3RpY2UNCisgICAgICAgKiB0aGF0IFBOR19HQU1NQSBqdXN0IHJlZmVycyB0byB0aGUgZmlsZS0+c2NyZWVuIGNvcnJlY3Rpb24uICBBbHBoYQ0KKyAgICAgICAqIGNvbXBvc2l0aW9uIG1heSBpbmRlcGVuZGVudGx5IGNhdXNlIGdhbW1hIGNvcnJlY3Rpb24gYmVjYXVzZSBpdCBuZWVkcw0KKyAgICAgICAqIGxpbmVhciBkYXRhIChlLmcuIGlmIHRoZSBmaWxlIGhhcyBhIGdBTUEgY2h1bmsgYnV0IHRoZSBzY3JlZW4gZ2FtbWENCisgICAgICAgKiBoYXNuJ3QgYmVlbiBzcGVjaWZpZWQuKSAgSW4gYW55IGNhc2UgdGhpcyBmbGFnIG1heSBnZXQgdHVybmVkIG9mZiBpbg0KKyAgICAgICAqIHRoZSBjb2RlIGltbWVkaWF0ZWx5IGJlbG93IGlmIHRoZSB0cmFuc2Zvcm0gY2FuIGJlIGhhbmRsZWQgb3V0c2lkZSB0aGUNCisgICAgICAgKiByb3cgbG9vcC4NCisgICAgICAgKi8NCisgICAgICBpZiAoZ2FtbWFfY29ycmVjdGlvbikNCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0dBTU1BOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19HQU1NQTsNCisgICB9DQorI2VuZGlmDQorDQorICAgLyogQ2VydGFpbiB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSB0aGUgZWZmZWN0IG9mIHByZXZlbnRpbmcgb3RoZXINCisgICAgKiB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBoYXBwZW4gYWZ0ZXJ3YXJkIGluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucywNCisgICAgKiByZXNvbHZlIHRoZSBpbnRlcmRlcGVuZGVuY2llcyBoZXJlLiAgRnJvbSB0aGUgY29kZSBvZg0KKyAgICAqIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyB0aGUgb3JkZXIgaXM6DQorICAgICoNCisgICAgKiAgMSkgUE5HX0VYUEFORCAoaW5jbHVkaW5nIFBOR19FWFBBTkRfdFJOUykNCisgICAgKiAgMikgUE5HX1NUUklQX0FMUEhBIChpZiBubyBjb21wb3NlKQ0KKyAgICAqICAzKSBQTkdfUkdCX1RPX0dSQVkNCisgICAgKiAgNCkgUE5HX0dSQVlfVE9fUkdCIGlmZiAhUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWQ0KKyAgICAqICA1KSBQTkdfQ09NUE9TRQ0KKyAgICAqICA2KSBQTkdfR0FNTUENCisgICAgKiAgNykgUE5HX1NUUklQX0FMUEhBIChpZiBjb21wb3NlKQ0KKyAgICAqICA4KSBQTkdfRU5DT0RFX0FMUEhBDQorICAgICogIDkpIFBOR19TQ0FMRV8xNl9UT184DQorICAgICogMTApIFBOR18xNl9UT184DQorICAgICogMTEpIFBOR19RVUFOVElaRSAoY29udmVydHMgdG8gcGFsZXR0ZSkNCisgICAgKiAxMikgUE5HX0VYUEFORF8xNg0KKyAgICAqIDEzKSBQTkdfR1JBWV9UT19SR0IgaWZmIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkNCisgICAgKiAxNCkgUE5HX0lOVkVSVF9NT05PDQorICAgICogMTUpIFBOR19TSElGVA0KKyAgICAqIDE2KSBQTkdfUEFDSw0KKyAgICAqIDE3KSBQTkdfQkdSDQorICAgICogMTgpIFBOR19QQUNLU1dBUA0KKyAgICAqIDE5KSBQTkdfRklMTEVSIChpbmNsdWRlcyBQTkdfQUREX0FMUEhBKQ0KKyAgICAqIDIwKSBQTkdfSU5WRVJUX0FMUEhBDQorICAgICogMjEpIFBOR19TV0FQX0FMUEhBDQorICAgICogMjIpIFBOR19TV0FQX0JZVEVTDQorICAgICogMjMpIFBOR19VU0VSX1RSQU5TRk9STSBbbXVzdCBiZSBsYXN0XQ0KKyAgICAqLw0KKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQNCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TVFJJUF9BTFBIQSkgJiYNCisgICAgICAhKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSkNCisgICB7DQorICAgICAgLyogU3RyaXBwaW5nIHRoZSBhbHBoYSBjaGFubmVsIGhhcHBlbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICdleHBhbmQnDQorICAgICAgICogdHJhbnNmb3JtYXRpb25zLCBiZWZvcmUgYWxsIG90aGVyIHRyYW5zZm9ybWF0aW9uLCBzbyBpdCBjYW5jZWxzIG91dA0KKyAgICAgICAqIHRoZSBhbHBoYSBoYW5kbGluZy4gIEl0IGhhcyB0aGUgc2lkZSBlZmZlY3QgbmVnYXRpbmcgdGhlIGVmZmVjdCBvZg0KKyAgICAgICAqIFBOR19FWFBBTkRfdFJOUyB0b286DQorICAgICAgICovDQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH4oUE5HX0JBQ0tHUk9VTkRfRVhQQU5EIHwgUE5HX0VOQ09ERV9BTFBIQSB8DQorICAgICAgICAgUE5HX0VYUEFORF90Uk5TKTsNCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEE7DQorDQorICAgICAgLyogS2lsbCB0aGUgdFJOUyBjaHVuayBpdHNlbGYgdG9vLiAgUHJpb3IgdG8gMS41LjQgdGhpcyBkaWQgbm90IGhhcHBlbg0KKyAgICAgICAqIHNvIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiB3b3VsZCByZW1haW4ganVzdCBzbyBsb25nIGFzIGl0IHdhc24ndA0KKyAgICAgICAqIGV4cGFuZGVkLiAgVGhpcyBwcm9kdWNlcyB1bmV4cGVjdGVkIEFQSSBjaGFuZ2VzIGlmIHRoZSBzZXQgb2YgdGhpbmdzDQorICAgICAgICogdGhhdCBkbyBQTkdfRVhQQU5EX3RSTlMgY2hhbmdlcyAocGVyZmVjdGx5IHBvc3NpYmxlIGdpdmVuIHRoZQ0KKyAgICAgICAqIGRvY3VtZW50YXRpb24gLSB3aGljaCBzYXlzIGFzayBmb3Igd2hhdCB5b3Ugd2FudCwgYWNjZXB0IHdoYXQgeW91DQorICAgICAgICogZ2V0LikgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnQgZnJvbSAxLjUuNDoNCisgICAgICAgKi8NCisgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAwOw0KKyAgIH0NCisjZW5kaWYgLyogU1RSSVBfQUxQSEEgc3VwcG9ydGVkLCBubyBDT01QT1NFICovDQorDQorI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEDQorICAgLyogSWYgdGhlIHNjcmVlbiBnYW1tYSBpcyBhYm91dCAxLjAgdGhlbiB0aGUgT1BUSU1JWkVfQUxQSEEgYW5kIEVOQ09ERV9BTFBIQQ0KKyAgICAqIHNldHRpbmdzIHdpbGwgaGF2ZSBubyBlZmZlY3QuDQorICAgICovDQorICAgaWYgKCFwbmdfZ2FtbWFfc2lnbmlmaWNhbnQocG5nX3B0ci0+c2NyZWVuX2dhbW1hKSkNCisgICB7DQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRU5DT0RFX0FMUEhBOw0KKyAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19PUFRJTUlaRV9BTFBIQTsNCisgICB9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRA0KKyAgIC8qIE1ha2Ugc3VyZSB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgcmdiIHRvIGdyYXkgY29udmVyc2lvbiBhcmUgc2V0DQorICAgICogYXBwcm9wcmlhdGVseS4NCisgICAgKi8NCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKQ0KKyAgICAgIHBuZ19jb2xvcnNwYWNlX3NldF9yZ2JfY29lZmZpY2llbnRzKHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQ0KKyAgIC8qIERldGVjdCBncmF5IGJhY2tncm91bmQgYW5kIGF0dGVtcHQgdG8gZW5hYmxlIG9wdGltaXphdGlvbiBmb3INCisgICAgKiBncmF5IC0tPiBSR0IgY2FzZS4NCisgICAgKg0KKyAgICAqIE5vdGU6ICBpZiBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgc2V0IGFuZCBjb2xvcl90eXBlIGlzIGVpdGhlciBSR0Igb3INCisgICAgKiBSR0JfQUxQSEEgKGluIHdoaWNoIGNhc2UgbmVlZF9leHBhbmQgaXMgc3VwZXJmbHVvdXMgYW55d2F5KSwgdGhlDQorICAgICogYmFja2dyb3VuZCBjb2xvciBtaWdodCBhY3R1YWxseSBiZSBncmF5IHlldCBub3QgYmUgZmxhZ2dlZCBhcyBzdWNoLg0KKyAgICAqIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgdGhlIGN1cnJlbnQgY29kZSwgd2hpY2ggdXNlcw0KKyAgICAqIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkgb25seSB0byBkZWNpZGUgd2hlbiB0byBkbyB0aGUNCisgICAgKiBwbmdfZG9fZ3JheV90b19yZ2IoKSB0cmFuc2Zvcm1hdGlvbi4NCisgICAgKg0KKyAgICAqIFRPRE86IHRoaXMgY29kZSBuZWVkcyB0byBiZSByZXZpc2VkIHRvIGF2b2lkIHRoZSBjb21wbGV4aXR5IGFuZA0KKyAgICAqIGludGVyZGVwZW5kZW5jaWVzLiAgVGhlIGNvbG9yIHR5cGUgb2YgdGhlIGJhY2tncm91bmQgc2hvdWxkIGJlIHJlY29yZGVkIGluDQorICAgICogcG5nX3NldF9iYWNrZ3JvdW5kLCBhbG9uZyB3aXRoIHRoZSBiaXQgZGVwdGgsIHRoZW4gdGhlIGNvZGUgaGFzIGEgcmVjb3JkDQorICAgICogb2YgZXhhY3RseSB3aGF0IGNvbG9yIHNwYWNlIHRoZSBiYWNrZ3JvdW5kIGlzIGN1cnJlbnRseSBpbi4NCisgICAgKi8NCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKQ0KKyAgIHsNCisgICAgICAvKiBQTkdfQkFDS0dST1VORF9FWFBBTkQ6IHRoZSBiYWNrZ3JvdW5kIGlzIGluIHRoZSBmaWxlIGNvbG9yIHNwYWNlLCBzbyBpZg0KKyAgICAgICAqIHRoZSBmaWxlIHdhcyBncmF5c2NhbGUgdGhlIGJhY2tncm91bmQgdmFsdWUgaXMgZ3JheS4NCisgICAgICAgKi8NCisgICAgICBpZiAoIShwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQ0KKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWTsNCisgICB9DQorDQorICAgZWxzZSBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpDQorICAgew0KKyAgICAgIC8qIFBOR19DT01QT1NFOiBwbmdfc2V0X2JhY2tncm91bmQgd2FzIGNhbGxlZCB3aXRoIG5lZWRfZXhwYW5kIGZhbHNlLA0KKyAgICAgICAqIHNvIHRoZSBjb2xvciBpcyBpbiB0aGUgY29sb3Igc3BhY2Ugb2YgdGhlIG91dHB1dCBvciBwbmdfc2V0X2FscGhhX21vZGUNCisgICAgICAgKiB3YXMgY2FsbGVkIGFuZCB0aGUgY29sb3IgaXMgYmxhY2suICBJZ25vcmUgUkdCX1RPX0dSQVkgYmVjYXVzZSB0aGF0DQorICAgICAgICogaGFwcGVucyBiZWZvcmUgR1JBWV9UT19SR0IuDQorICAgICAgICovDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPmJhY2tncm91bmQucmVkID09IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gJiYNCisgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19CQUNLR1JPVU5EX0lTX0dSQVk7DQorICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgJiYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgKi8NCisjZW5kaWYgLyogUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVEICovDQorDQorICAgLyogRm9yIGluZGV4ZWQgUE5HIGRhdGEgKFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIG1hbnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucw0KKyAgICAqIGNhbiBiZSBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGhlIHBhbGV0dGUsIGFuZCBzb21lIChzdWNoIGFzIHJnYiB0byBncmF5KQ0KKyAgICAqIGNhbiBiZSBvcHRpbWl6ZWQgaW5zaWRlIHRoZSBwYWxldHRlLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdHJ1ZSBvZiB0aGUNCisgICAgKiBjb21wb3NpdGUgKGJhY2tncm91bmQgYW5kIGFscGhhKSBzdHVmZiwgd2hpY2ggY2FuIGJlIHByZXR0eSBtdWNoIGFsbCBkb25lDQorICAgICogaW4gdGhlIHBhbGV0dGUgZXZlbiBpZiB0aGUgcmVzdWx0IGlzIGV4cGFuZGVkIHRvIFJHQiBvciBncmF5IGFmdGVyd2FyZC4NCisgICAgKg0KKyAgICAqIE5PVEU6IHRoaXMgaXMgTm90IFlldCBJbXBsZW1lbnRlZCwgdGhlIGNvZGUgYmVoYXZlcyBhcyBpbiAxLjUuMSBhbmQNCisgICAgKiBlYXJsaWVyIGFuZCB0aGUgcGFsZXR0ZSBzdHVmZiBpcyBhY3R1YWxseSBoYW5kbGVkIG9uIHRoZSBmaXJzdCByb3cuICBUaGlzDQorICAgICogbGVhZHMgdG8gdGhlIHJlcG9ydGVkIGJ1ZyB0aGF0IHRoZSBwYWxldHRlIHJldHVybmVkIGJ5IHBuZ19nZXRfUExURSBpcyBub3QNCisgICAgKiB1cGRhdGVkLg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpDQorICAgICAgcG5nX2luaXRfcGFsZXR0ZV90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7DQorDQorICAgZWxzZQ0KKyAgICAgIHBuZ19pbml0X3JnYl90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7DQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpICYmIFwNCisgICBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQpDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EXzE2KSAmJg0KKyAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgJiYNCisgICAgICAhKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgJiYNCisgICAgICBwbmdfcHRyLT5iaXRfZGVwdGggIT0gMTYpDQorICAgew0KKyAgICAgIC8qIFRPRE86IGZpeCB0aGlzLiAgQmVjYXVzZSB0aGUgZXhwYW5kXzE2IG9wZXJhdGlvbiBpcyBhZnRlciB0aGUgY29tcG9zZQ0KKyAgICAgICAqIGhhbmRsaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG11c3QgYmUgOCwgbm90IDE2LCBiaXRzIGRlZXAsIGJ1dCB0aGUNCisgICAgICAgKiBhcHBsaWNhdGlvbiB3aWxsIHN1cHBseSBhIDE2LWJpdCB2YWx1ZSBzbyByZWR1Y2UgaXQgaGVyZS4NCisgICAgICAgKg0KKyAgICAgICAqIFRoZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgY29kZSBhYm92ZSBkb2VzIG5vdCBleHBhbmQgdG8gMTYgYml0cyBhdA0KKyAgICAgICAqIHByZXNlbnQsIHNvIHRoYXQgY2FzZSBpcyBvayAodW50aWwgZG9fZXhwYW5kXzE2IGlzIG1vdmVkLikNCisgICAgICAgKg0KKyAgICAgICAqIE5PVEU6IHRoaXMgZGlzY2FyZHMgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSB1c2VyIHN1cHBsaWVkIGJhY2tncm91bmQNCisgICAgICAgKiBjb2xvciwgYnV0IHVudGlsIGV4cGFuZF8xNiB3b3JrcyBwcm9wZXJseSB0aGVyZSBpcyBubyBjaG9pY2UhDQorICAgICAgICovDQorIyAgICAgZGVmaW5lIENIT1AoeCkgKHgpPSgocG5nX3VpbnRfMTYpUE5HX0RJVjI1Nyh4KSkNCisgICAgICBDSE9QKHBuZ19wdHItPmJhY2tncm91bmQucmVkKTsNCisgICAgICBDSE9QKHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4pOw0KKyAgICAgIENIT1AocG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKTsNCisgICAgICBDSE9QKHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSk7DQorIyAgICAgdW5kZWYgQ0hPUA0KKyAgIH0NCisjZW5kaWYgLyogUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgJiYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRCAqLw0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSAmJiBcDQorICAgKGRlZmluZWQoUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQpIHx8IFwNCisgICBkZWZpbmVkKFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVEKSkNCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfMTZfVE9fOHxQTkdfU0NBTEVfMTZfVE9fOCkpICYmDQorICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKSAmJg0KKyAgICAgICEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAmJg0KKyAgICAgIHBuZ19wdHItPmJpdF9kZXB0aCA9PSAxNikNCisgICB7DQorICAgICAgLyogT24gdGhlIG90aGVyIGhhbmQsIGlmIGEgMTYtYml0IGZpbGUgaXMgdG8gYmUgcmVkdWNlZCB0byA4LWJpdHMgcGVyDQorICAgICAgICogY29tcG9uZW50IHRoaXMgd2lsbCBhbHNvIGhhcHBlbiBhZnRlciBQTkdfQ09NUE9TRSBhbmQgc28gdGhlIGJhY2tncm91bmQNCisgICAgICAgKiBjb2xvciBtdXN0IGJlIHByZS1leHBhbmRlZCBoZXJlLg0KKyAgICAgICAqDQorICAgICAgICogVE9ETzogZml4IHRoaXMgdG9vLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gKHBuZ191aW50XzE2KShwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAqIDI1Nyk7DQorICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9DQorICAgICAgICAgKHBuZ191aW50XzE2KShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuICogMjU3KTsNCisgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSAocG5nX3VpbnRfMTYpKHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSAqIDI1Nyk7DQorICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gKHBuZ191aW50XzE2KShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgKiAyNTcpOw0KKyAgIH0NCisjZW5kaWYNCisNCisgICAvKiBOT1RFOiBiZWxvdyAnUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQnIGlzIHByZXN1bWVkIHRvIGFsc28gZW5hYmxlIHRoZQ0KKyAgICAqIGJhY2tncm91bmQgc3VwcG9ydCAoc2VlIHRoZSBjb21tZW50cyBpbiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhKSwgdGhpcw0KKyAgICAqIGFsbG93cyBwcmUtbXVsdGlwbGljYXRpb24gb2YgdGhlIGFscGhhIGNoYW5uZWwgdG8gYmUgaW1wbGVtZW50ZWQgYXMNCisgICAgKiBjb21wb3NpdGluZyBvbiBibGFjay4gIFRoaXMgaXMgcHJvYmFibHkgc3ViLW9wdGltYWwgYW5kIGhhcyBiZWVuIGRvbmUgaW4NCisgICAgKiAxLjUuNCBiZXRhcyBzaW1wbHkgdG8gZW5hYmxlIGV4dGVybmFsIGNyaXRpcXVlIGFuZCB0ZXN0aW5nIChpLmUuIHRvDQorICAgICogaW1wbGVtZW50IHRoZSBuZXcgQVBJIHF1aWNrbHksIHdpdGhvdXQgbG90cyBvZiBpbnRlcm5hbCBjaGFuZ2VzLikNCisgICAgKi8NCisNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorIyAgaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQNCisgICAgICAvKiBJbmNsdWRlcyBBTFBIQV9NT0RFICovDQorICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xID0gcG5nX3B0ci0+YmFja2dyb3VuZDsNCisjICBlbmRpZg0KKw0KKyAgIC8qIFRoaXMgbmVlZHMgdG8gY2hhbmdlIC0gaW4gdGhlIHBhbGV0dGUgaW1hZ2UgY2FzZSBhIHdob2xlIHNldCBvZiB0YWJsZXMgYXJlDQorICAgICogYnVpbHQgd2hlbiBpdCB3b3VsZCBiZSBxdWlja2VyIHRvIGp1c3QgY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvcg0KKyAgICAqIGVhY2ggcGFsZXR0ZSBlbnRyeSBkaXJlY3RseS4gIEFsc28sIHRoZSB0ZXN0IGlzIHRvbyB0cmlja3kgLSB3aHkgY2hlY2sNCisgICAgKiBQTkdfUkdCX1RPX0dSQVkgaWYgUE5HX0dBTU1BIGlzIG5vdCBzZXQ/ICBUaGUgYW5zd2VyIHNlZW1zIHRvIGJlIHRoYXQNCisgICAgKiBQTkdfR0FNTUEgaXMgY2FuY2VsbGVkIGV2ZW4gaWYgdGhlIGdhbW1hIGlzIGtub3duPyAgVGhlIHRlc3QgZXhjbHVkZXMgdGhlDQorICAgICogUE5HX0NPTVBPU0UgY2FzZSwgc28gYXBwYXJlbnRseSBpZiB0aGVyZSBpcyBubyAqb3ZlcmFsbCogZ2FtbWEgY29ycmVjdGlvbg0KKyAgICAqIHRoZSBnYW1tYSB0YWJsZXMgd2lsbCBub3QgYmUgYnVpbHQgZXZlbiBpZiBjb21wb3NpdGlvbiBpcyByZXF1aXJlZCBvbiBhDQorICAgICogZ2FtbWEgZW5jb2RlZCB2YWx1ZS4NCisgICAgKg0KKyAgICAqIEluIDEuNS40IHRoaXMgaXMgYWRkcmVzc2VkIGJlbG93IGJ5IGFuIGFkZGl0aW9uYWwgY2hlY2sgb24gdGhlIGluZGl2aWR1YWwNCisgICAgKiBmaWxlIGdhbW1hIC0gaWYgaXQgaXMgbm90IDEuMCBib3RoIFJHQl9UT19HUkFZIGFuZCBDT01QT1NFIG5lZWQgdGhlDQorICAgICogdGFibGVzLg0KKyAgICAqLw0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dBTU1BKQ0KKyAgICAgIHx8ICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKQ0KKyAgICAgICAgICYmIChwbmdfZ2FtbWFfc2lnbmlmaWNhbnQocG5nX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSkgfHwNCisgICAgICAgICAgICBwbmdfZ2FtbWFfc2lnbmlmaWNhbnQocG5nX3B0ci0+c2NyZWVuX2dhbW1hKSkpDQorICAgICAgfHwgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkNCisgICAgICAgICAmJiAocG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpDQorICAgICAgICAgICAgfHwgcG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPnNjcmVlbl9nYW1tYSkNCisjICBpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRA0KKyAgICAgICAgICAgIHx8IChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUgPT0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFDQorICAgICAgICAgICAgICAgJiYgcG5nX2dhbW1hX3NpZ25pZmljYW50KHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEpKQ0KKyMgIGVuZGlmDQorICAgICAgKSkgfHwgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRU5DT0RFX0FMUEhBKQ0KKyAgICAgICAgICYmIHBuZ19nYW1tYV9zaWduaWZpY2FudChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpKQ0KKyAgICAgICkNCisgICB7DQorICAgICAgcG5nX2J1aWxkX2dhbW1hX3RhYmxlKHBuZ19wdHIsIHBuZ19wdHItPmJpdF9kZXB0aCk7DQorDQorI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBJc3N1ZSBhIHdhcm5pbmcgYWJvdXQgdGhpcyBjb21iaW5hdGlvbjogYmVjYXVzZSBSR0JfVE9fR1JBWSBpcw0KKyAgICAgICAgICAqIG9wdGltaXplZCB0byBkbyB0aGUgZ2FtbWEgdHJhbnNmb3JtIGlmIHByZXNlbnQgeWV0IGRvX2JhY2tncm91bmQgaGFzDQorICAgICAgICAgICogdG8gZG8gdGhlIHNhbWUgdGhpbmcgaWYgYm90aCBvcHRpb25zIGFyZSBzZXQgYQ0KKyAgICAgICAgICAqIGRvdWJsZS1nYW1tYS1jb3JyZWN0aW9uIGhhcHBlbnMuICBUaGlzIGlzIHRydWUgaW4gYWxsIHZlcnNpb25zIG9mDQorICAgICAgICAgICogbGlicG5nIHRvIGRhdGUuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkNCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICJsaWJwbmcgZG9lcyBub3Qgc3VwcG9ydCBnYW1tYStiYWNrZ3JvdW5kK3JnYl90b19ncmF5Iik7DQorDQorICAgICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogV2UgZG9uJ3QgZ2V0IHRvIGhlcmUgdW5sZXNzIHRoZXJlIGlzIGEgdFJOUyBjaHVuayB3aXRoIG5vbi1vcGFxdWUNCisgICAgICAgICAgICAgKiBlbnRyaWVzIC0gc2VlIHRoZSBjaGVja2luZyBjb2RlIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIHBuZ19jb2xvciBiYWNrLCBiYWNrXzE7DQorICAgICAgICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsNCisgICAgICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsNCisgICAgICAgICAgICBpbnQgaTsNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID09IFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUpDQorICAgICAgICAgICAgew0KKw0KKyAgICAgICAgICAgICAgIGJhY2sucmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcG5nX3B0ci0+YmFja2dyb3VuZC5yZWRdOw0KKyAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuXTsNCisgICAgICAgICAgICAgICBiYWNrLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWVdOw0KKw0KKyAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsNCisgICAgICAgICAgICAgICBiYWNrXzEuZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQuZ3JlZW5dOw0KKyAgICAgICAgICAgICAgIGJhY2tfMS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWVdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19maXhlZF9wb2ludCBnLCBnczsNCisNCisgICAgICAgICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU46DQorICAgICAgICAgICAgICAgICAgICAgZyA9IChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOw0KKyAgICAgICAgICAgICAgICAgICAgIGdzID0gUE5HX0ZQXzE7DQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFOg0KKyAgICAgICAgICAgICAgICAgICAgIGcgPSBwbmdfcmVjaXByb2NhbChwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hKTsNCisgICAgICAgICAgICAgICAgICAgICBncyA9IHBuZ19yZWNpcHJvY2FsMihwbmdfcHRyLT5jb2xvcnNwYWNlLmdhbW1hLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7DQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUU6DQorICAgICAgICAgICAgICAgICAgICAgZyA9IHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEpOw0KKyAgICAgICAgICAgICAgICAgICAgIGdzID0gcG5nX3JlY2lwcm9jYWwyKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEsDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsNCisgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgIGcgPSBQTkdfRlBfMTsgICAgLyogYmFja18xICovDQorICAgICAgICAgICAgICAgICAgICAgZ3MgPSBQTkdfRlBfMTsgICAvKiBiYWNrICovDQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGlmIChwbmdfZ2FtbWFfc2lnbmlmaWNhbnQoZ3MpKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBiYWNrLnJlZCA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQsDQorICAgICAgICAgICAgICAgICAgICAgIGdzKTsNCisgICAgICAgICAgICAgICAgICBiYWNrLmdyZWVuID0gcG5nX2dhbW1hXzhiaXRfY29ycmVjdChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLA0KKyAgICAgICAgICAgICAgICAgICAgICBncyk7DQorICAgICAgICAgICAgICAgICAgYmFjay5ibHVlID0gcG5nX2dhbW1hXzhiaXRfY29ycmVjdChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUsDQorICAgICAgICAgICAgICAgICAgICAgIGdzKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBiYWNrLnJlZCAgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOw0KKyAgICAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsNCisgICAgICAgICAgICAgICAgICBiYWNrLmJsdWUgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgaWYgKHBuZ19nYW1tYV9zaWduaWZpY2FudChnKSkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgYmFja18xLnJlZCA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQsDQorICAgICAgICAgICAgICAgICAgICAgZyk7DQorICAgICAgICAgICAgICAgICAgYmFja18xLmdyZWVuID0gcG5nX2dhbW1hXzhiaXRfY29ycmVjdCgNCisgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLCBnKTsNCisgICAgICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QocG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLA0KKyAgICAgICAgICAgICAgICAgICAgIGcpOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsNCisgICAgICAgICAgICAgICAgICBiYWNrXzEuZ3JlZW4gPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsNCisgICAgICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGlmIChpIDwgKGludClwbmdfcHRyLT5udW1fdHJhbnMgJiYNCisgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gIT0gMHhmZikNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zX2FscGhhW2ldID09IDApDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBiYWNrOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBlbHNlIC8qIGlmIChwbmdfcHRyLT50cmFuc19hbHBoYVtpXSAhPSAweGZmKSAqLw0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0ucmVkXTsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrXzEucmVkKTsNCisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVt3XTsNCisNCisgICAgICAgICAgICAgICAgICAgICB2ID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwYWxldHRlW2ldLmdyZWVuXTsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrXzEuZ3JlZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107DQorDQorICAgICAgICAgICAgICAgICAgICAgdiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcGFsZXR0ZVtpXS5ibHVlXTsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrXzEuYmx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfZnJvbV8xW3ddOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsNCisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ncmVlbl07DQorICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ibHVlXTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8qIFByZXZlbnQgdGhlIHRyYW5zZm9ybWF0aW9ucyBiZWluZyBkb25lIGFnYWluLg0KKyAgICAgICAgICAgICAqDQorICAgICAgICAgICAgICogTk9URTogdGhpcyBpcyBoaWdobHkgZHViaW91czsgaXQgcmVtb3ZlcyB0aGUgdHJhbnNmb3JtYXRpb25zIGluDQorICAgICAgICAgICAgICogcGxhY2UuICBUaGlzIHNlZW1zIGluY29uc2lzdGVudCB3aXRoIHRoZSBnZW5lcmFsIHRyZWF0bWVudCBvZiB0aGUNCisgICAgICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbnMgZWxzZXdoZXJlLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+KFBOR19DT01QT1NFIHwgUE5HX0dBTU1BKTsNCisgICAgICAgICB9IC8qIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAqLw0KKw0KKyAgICAgICAgIC8qIGlmIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUhPVBOR19CQUNLR1JPVU5EX0dBTU1BX1VOS05PV04pICovDQorICAgICAgICAgZWxzZSAvKiBjb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgKi8NCisgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGdzX3NpZywgZ19zaWc7DQorICAgICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGcgPSBQTkdfRlBfMTsgIC8qIENvcnJlY3Rpb24gdG8gbGluZWFyICovDQorICAgICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IGdzID0gUE5HX0ZQXzE7IC8qIENvcnJlY3Rpb24gdG8gc2NyZWVuICovDQorDQorICAgICAgICAgICAgc3dpdGNoIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOOg0KKyAgICAgICAgICAgICAgICAgIGcgPSBwbmdfcHRyLT5zY3JlZW5fZ2FtbWE7DQorICAgICAgICAgICAgICAgICAgLyogZ3MgPSBQTkdfRlBfMTsgKi8NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6DQorICAgICAgICAgICAgICAgICAgZyA9IHBuZ19yZWNpcHJvY2FsKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpOw0KKyAgICAgICAgICAgICAgICAgIGdzID0gcG5nX3JlY2lwcm9jYWwyKHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWEsDQorICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToNCisgICAgICAgICAgICAgICAgICBnID0gcG5nX3JlY2lwcm9jYWwocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSk7DQorICAgICAgICAgICAgICAgICAgZ3MgPSBwbmdfcmVjaXByb2NhbDIocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSwNCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBiYWNrZ3JvdW5kIGdhbW1hIHR5cGUiKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZ19zaWcgPSBwbmdfZ2FtbWFfc2lnbmlmaWNhbnQoZyk7DQorICAgICAgICAgICAgZ3Nfc2lnID0gcG5nX2dhbW1hX3NpZ25pZmljYW50KGdzKTsNCisNCisgICAgICAgICAgICBpZiAoZ19zaWcpDQorICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyYXkgPSBwbmdfZ2FtbWFfY29ycmVjdChwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXksIGcpOw0KKw0KKyAgICAgICAgICAgIGlmIChnc19zaWcpDQorICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5LCBncyk7DQorDQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAhPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuKSB8fA0KKyAgICAgICAgICAgICAgICAocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKSB8fA0KKyAgICAgICAgICAgICAgICAocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogUkdCIG9yIFJHQkEgd2l0aCBjb2xvciBiYWNrZ3JvdW5kICovDQorICAgICAgICAgICAgICAgaWYgKGdfc2lnKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEucmVkID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQsIGcpOw0KKw0KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmVlbiA9IHBuZ19nYW1tYV9jb3JyZWN0KHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4sIGcpOw0KKw0KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5ibHVlID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLCBnKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgaWYgKGdzX3NpZykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfZ2FtbWFfY29ycmVjdChwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCwgZ3MpOw0KKw0KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPSBwbmdfZ2FtbWFfY29ycmVjdChwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLCBncyk7DQorDQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gcG5nX2dhbW1hX2NvcnJlY3QocG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLCBncyk7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIC8qIEdSQVksIEdSQVkgQUxQSEEsIFJHQiwgb3IgUkdCQSB3aXRoIGdyYXkgYmFja2dyb3VuZCAqLw0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuZ3JlZW4NCisgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5Ow0KKw0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbg0KKyAgICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLyogVGhlIGJhY2tncm91bmQgaXMgbm93IGluIHNjcmVlbiBnYW1tYTogKi8NCisgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUgPSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU47DQorICAgICAgICAgfSAvKiBjb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgKi8NCisgICAgICB9LyogcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQgKi8NCisNCisgICAgICBlbHNlDQorICAgICAgLyogVHJhbnNmb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBQTkdfQkFDS0dST1VORCAqLw0KKyNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCAqLw0KKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorICAgICAgICAgLyogUkdCX1RPX0dSQVkgbmVlZHMgdG8gaGF2ZSBub24tZ2FtbWEtY29ycmVjdGVkIHZhbHVlcyEgKi8NCisgICAgICAgICAmJiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpID09IDAgfHwNCisgICAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKSA9PSAwKQ0KKyNlbmRpZg0KKyAgICAgICAgICkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsNCisgICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsNCisgICAgICAgICBpbnQgaTsNCisNCisgICAgICAgICAvKiBOT1RFOiB0aGVyZSBhcmUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIHRoYXQgc2hvdWxkIHByb2JhYmx5IGJlIGluDQorICAgICAgICAgICogaGVyZSB0b28uDQorICAgICAgICAgICovDQorICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5yZWRdOw0KKyAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsNCisgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmJsdWVdOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBEb25lIHRoZSBnYW1tYSBjb3JyZWN0aW9uLiAqLw0KKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0dBTU1BOw0KKyAgICAgIH0gLyogY29sb3JfdHlwZSA9PSBQQUxFVFRFICYmICFQTkdfQkFDS0dST1VORCB0cmFuc2Zvcm1hdGlvbiAqLw0KKyAgIH0NCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQNCisgICBlbHNlDQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRA0KKyAgIC8qIE5vIEdBTU1BIHRyYW5zZm9ybWF0aW9uIChzZWUgdGhlIGhhbmdpbmcgZWxzZSA0IGxpbmVzIGFib3ZlKSAqLw0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpICYmDQorICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQ0KKyAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBpbnQgaXN0b3AgPSAoaW50KXBuZ19wdHItPm51bV90cmFuczsNCisgICAgICBwbmdfY29sb3IgYmFjazsNCisgICAgICBwbmdfY29sb3JwIHBhbGV0dGUgPSBwbmdfcHRyLT5wYWxldHRlOw0KKw0KKyAgICAgIGJhY2sucmVkICAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7DQorICAgICAgYmFjay5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOw0KKyAgICAgIGJhY2suYmx1ZSAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOw0KKw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0gPT0gMCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPnRyYW5zX2FscGhhW2ldICE9IDB4ZmYpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoZSBwbmdfY29tcG9zaXRlKCkgbWFjcm8gaXMgZGVmaW5lZCBpbiBwbmcuaCAqLw0KKyAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5yZWQsIHBhbGV0dGVbaV0ucmVkLA0KKyAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc19hbHBoYVtpXSwgYmFjay5yZWQpOw0KKw0KKyAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5ncmVlbiwgcGFsZXR0ZVtpXS5ncmVlbiwNCisgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfYWxwaGFbaV0sIGJhY2suZ3JlZW4pOw0KKw0KKyAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5ibHVlLCBwYWxldHRlW2ldLmJsdWUsDQorICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX2FscGhhW2ldLCBiYWNrLmJsdWUpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfQ09NUE9TRTsNCisJICANCisgIAkgIC8vcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfU1RSSVBfQUxQSEE7IC8qIEFkZCBieSBTdW5saWFuZy5MaXUgKi8NCisgICB9DQorI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRA0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKSAmJg0KKyAgICAgICEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkgJiYNCisgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpDQorICAgew0KKyAgICAgIGludCBpOw0KKyAgICAgIGludCBpc3RvcCA9IHBuZ19wdHItPm51bV9wYWxldHRlOw0KKyAgICAgIGludCBzaGlmdCA9IDggLSBwbmdfcHRyLT5zaWdfYml0LnJlZDsNCisNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19TSElGVDsNCisNCisgICAgICAvKiBzaWduaWZpY2FudCBiaXRzIGNhbiBiZSBpbiB0aGUgcmFuZ2UgMSB0byA3IGZvciBhIG1lYW5pbmZ1bCByZXN1bHQsIGlmDQorICAgICAgICogdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGlzIDAgdGhlbiBubyBzaGlmdCBpcyBkb25lICh0aGlzIGlzIGFuDQorICAgICAgICogZXJyb3IgY29uZGl0aW9uIHdoaWNoIGlzIHNpbGVudGx5IGlnbm9yZWQuKQ0KKyAgICAgICAqLw0KKyAgICAgIGlmIChzaGlmdCA+IDAgJiYgc2hpZnQgPCA4KSBmb3IgKGk9MDsgaTxpc3RvcDsgKytpKQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgY29tcG9uZW50ID0gcG5nX3B0ci0+cGFsZXR0ZVtpXS5yZWQ7DQorDQorICAgICAgICAgY29tcG9uZW50ID4+PSBzaGlmdDsNCisgICAgICAgICBwbmdfcHRyLT5wYWxldHRlW2ldLnJlZCA9IChwbmdfYnl0ZSljb21wb25lbnQ7DQorICAgICAgfQ0KKw0KKyAgICAgIHNoaWZ0ID0gOCAtIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW47DQorICAgICAgaWYgKHNoaWZ0ID4gMCAmJiBzaGlmdCA8IDgpIGZvciAoaT0wOyBpPGlzdG9wOyArK2kpDQorICAgICAgew0KKyAgICAgICAgIGludCBjb21wb25lbnQgPSBwbmdfcHRyLT5wYWxldHRlW2ldLmdyZWVuOw0KKw0KKyAgICAgICAgIGNvbXBvbmVudCA+Pj0gc2hpZnQ7DQorICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ncmVlbiA9IChwbmdfYnl0ZSljb21wb25lbnQ7DQorICAgICAgfQ0KKw0KKyAgICAgIHNoaWZ0ID0gOCAtIHBuZ19wdHItPnNpZ19iaXQuYmx1ZTsNCisgICAgICBpZiAoc2hpZnQgPiAwICYmIHNoaWZ0IDwgOCkgZm9yIChpPTA7IGk8aXN0b3A7ICsraSkNCisgICAgICB7DQorICAgICAgICAgaW50IGNvbXBvbmVudCA9IHBuZ19wdHItPnBhbGV0dGVbaV0uYmx1ZTsNCisNCisgICAgICAgICBjb21wb25lbnQgPj49IHNoaWZ0Ow0KKyAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbaV0uYmx1ZSA9IChwbmdfYnl0ZSljb21wb25lbnQ7DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYgIC8qIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCAqLw0KK30NCisNCisvKiBNb2RpZnkgdGhlIGluZm8gc3RydWN0dXJlIHRvIHJlZmxlY3QgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIFRoZQ0KKyAqIGluZm8gc2hvdWxkIGJlIHVwZGF0ZWQgc28gYSBQTkcgZmlsZSBjb3VsZCBiZSB3cml0dGVuIHdpdGggaXQsDQorICogYXNzdW1pbmcgdGhlIHRyYW5zZm9ybWF0aW9ucyByZXN1bHQgaW4gdmFsaWQgUE5HIGRhdGEuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8iKTsNCisNCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKQ0KKyAgIHsNCisgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICB7DQorICAgICAgICAgLyogVGhpcyBjaGVjayBtdXN0IG1hdGNoIHdoYXQgYWN0dWFsbHkgaGFwcGVucyBpbg0KKyAgICAgICAgICAqIHBuZ19kb19leHBhbmRfcGFsZXR0ZTsgaWYgaXQgZXZlciBjaGVja3MgdGhlIHRSTlMgY2h1bmsgdG8gc2VlIGlmDQorICAgICAgICAgICogaXQgaXMgYWxsIG9wYXF1ZSB3ZSBtdXN0IGRvIHRoZSBzYW1lIChhdCBwcmVzZW50IGl0IGRvZXMgbm90LikNCisgICAgICAgICAgKi8NCisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gMCkNCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7DQorDQorICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7DQorICAgICAgICAgaW5mb19wdHItPm51bV90cmFucyA9IDA7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykNCisgICAgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19BTFBIQTsNCisgICAgICAgICB9DQorICAgICAgICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPCA4KQ0KKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSA4Ow0KKw0KKyAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAwOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XA0KKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpDQorICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbG1vc3QgY2VydGFpbmx5IHdyb25nIHVubGVzcyB0aGUgYmFja2dyb3VuZCB2YWx1ZSBpcyBpbg0KKyAgICAqIHRoZSBzY3JlZW4gc3BhY2UhDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19DT01QT1NFKQ0KKyAgICAgIGluZm9fcHRyLT5iYWNrZ3JvdW5kID0gcG5nX3B0ci0+YmFja2dyb3VuZDsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorICAgLyogVGhlIGZvbGxvd2luZyB1c2VkIHRvIGJlIGNvbmRpdGlvbmFsIG9uIFBOR19HQU1NQSAocHJpb3IgdG8gMS41LjQpLA0KKyAgICAqIGhvd2V2ZXIgaXQgc2VlbXMgdGhhdCB0aGUgY29kZSBpbiBwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucywgd2hpY2ggaGFzDQorICAgICogYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgZnJvbSBwbmdfcmVhZF91cGRhdGVfaW5mby0+cG5nX3JlYWRfc3RhcnRfcm93DQorICAgICogc29tZXRpbWVzIGRvZXMgdGhlIGdhbW1hIHRyYW5zZm9ybSBhbmQgY2FuY2VscyB0aGUgZmxhZy4NCisgICAgKg0KKyAgICAqIFRPRE86IHRoaXMgbG9va3Mgd3Jvbmc7IHRoZSBpbmZvX3B0ciBzaG91bGQgZW5kIHVwIHdpdGggYSBnYW1tYSBlcXVhbCB0bw0KKyAgICAqIHRoZSBzY3JlZW5fZ2FtbWEgdmFsdWUuICBUaGUgZm9sbG93aW5nIHByb2JhYmx5IHJlc3VsdHMgaW4gd2VpcmRuZXNzIGlmDQorICAgICogdGhlIGluZm9fcHRyIGlzIHVzZWQgYnkgdGhlIGFwcCBhZnRlciB0aGUgcm93cyBoYXZlIGJlZW4gcmVhZC4NCisgICAgKi8NCisgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5nYW1tYSA9IHBuZ19wdHItPmNvbG9yc3BhY2UuZ2FtbWE7DQorI2VuZGlmDQorDQorICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPT0gMTYpDQorICAgew0KKyMgIGlmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRA0KKyMgICAgIGlmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVEDQorICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TQ0FMRV8xNl9UT184KQ0KKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSA4Ow0KKyMgICAgIGVuZGlmDQorDQorIyAgICAgaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQNCisgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HXzE2X1RPXzgpDQorICAgICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7DQorIyAgICAgZW5kaWYNCisNCisjICBlbHNlDQorICAgICAgLyogTm8gMTYgYml0IHN1cHBvcnQ6IGZvcmNlIGNob3BwaW5nIDE2LWJpdCBpbnB1dCBkb3duIHRvIDgsIGluIHRoaXMgY2FzZQ0KKyAgICAgICAqIHRoZSBhcHAgcHJvZ3JhbSBjYW4gY2hvc2UgaWYgYm90aCBBUElzIGFyZSBhdmFpbGFibGUgYnkgc2V0dGluZyB0aGUNCisgICAgICAgKiBjb3JyZWN0IHNjYWxpbmcgdG8gdXNlLg0KKyAgICAgICAqLw0KKyMgICAgIGlmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVEDQorICAgICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyB1c2UgdGhlIHN0cmlwIG1ldGhvZCBieQ0KKyAgICAgICAgICAqIGRlZmF1bHQuICBUaGlzIGNvZGUgd29ya3MgYmVjYXVzZSBpZiBQTkdfU0NBTEVfMTZfVE9fOCBpcyBhbHJlYWR5DQorICAgICAgICAgICogc2V0IHRoZSBjb2RlIGJlbG93IHdpbGwgZG8gdGhhdCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBjaG9wLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfMTZfVE9fODsNCisgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsNCisjICAgICBlbHNlDQorDQorIyAgICAgICAgaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQNCisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NDQUxFXzE2X1RPXzg7DQorICAgICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7DQorIyAgICAgICAgZWxzZQ0KKw0KKyAgICAgICAgICAgIENPTkZJR1VSQVRJT04gRVJST1I6IHlvdSBtdXN0IGVuYWJsZSBhdCBsZWFzdCBvbmUgMTYgdG8gOCBtZXRob2QNCisjICAgICAgICBlbmRpZg0KKyMgICAgZW5kaWYNCisjZW5kaWYgLyogIVJFQURfMTZCSVRfU1VQUE9SVEVEICovDQorICAgfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKQ0KKyAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKShpbmZvX3B0ci0+Y29sb3JfdHlwZSB8DQorICAgICAgICAgUE5HX0NPTE9SX01BU0tfQ09MT1IpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKQ0KKyAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKShpbmZvX3B0ci0+Y29sb3JfdHlwZSAmDQorICAgICAgICAgflBOR19DT0xPUl9NQVNLX0NPTE9SKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19RVUFOVElaRSkNCisgICB7DQorICAgICAgaWYgKCgoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKSB8fA0KKyAgICAgICAgICAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkgJiYNCisgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV9sb29rdXAgJiYgaW5mb19wdHItPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EXzE2ICYmIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCAmJg0KKyAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpDQorICAgew0KKyAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSAxNjsNCisgICB9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDSykgJiYgKGluZm9fcHRyLT5iaXRfZGVwdGggPCA4KSkNCisgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsNCisjZW5kaWYNCisNCisgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAxOw0KKw0KKyAgIGVsc2UgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpDQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMzsNCisNCisgICBlbHNlDQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsNCisNCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TVFJJUF9BTFBIQSkNCisgICB7DQorICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpKGluZm9fcHRyLT5jb2xvcl90eXBlICYNCisgICAgICAgICB+UE5HX0NPTE9SX01BU0tfQUxQSEEpOw0KKyAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAwOw0KKyAgIH0NCisjZW5kaWYNCisNCisgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkNCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMrKzsNCisNCisjaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRA0KKyAgIC8qIFNUUklQX0FMUEhBIGFuZCBGSUxMRVIgYWxsb3dlZDogIE1BU0tfQUxQSEEgYml0IHN0cmlwcGVkIGFib3ZlICovDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKSAmJg0KKyAgICAgICAoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwNCisgICAgICAgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpKSkNCisgICB7DQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7DQorICAgICAgLyogSWYgYWRkaW5nIGEgdHJ1ZSBhbHBoYSBjaGFubmVsIG5vdCBqdXN0IGZpbGxlciAqLw0KKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQUREX0FMUEhBKQ0KKyAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0FMUEhBOw0KKyAgIH0NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkgJiYgXA0KK2RlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQ0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfVVNFUl9UUkFOU0ZPUk0pDQorICAgew0KKyAgICAgIGlmIChpbmZvX3B0ci0+Yml0X2RlcHRoIDwgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGgpDQorICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoOw0KKw0KKyAgICAgIGlmIChpbmZvX3B0ci0+Y2hhbm5lbHMgPCBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVscykNCisgICAgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVsczsNCisgICB9DQorI2VuZGlmDQorDQorICAgaW5mb19wdHItPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShpbmZvX3B0ci0+Y2hhbm5lbHMgKg0KKyAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoKTsNCisNCisgICBpbmZvX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMoaW5mb19wdHItPnBpeGVsX2RlcHRoLCBpbmZvX3B0ci0+d2lkdGgpOw0KKw0KKyAgIC8qIEFkZGluZyBpbiAxLjUuNDogY2FjaGUgdGhlIGFib3ZlIHZhbHVlIGluIHBuZ19zdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gbGF0ZXINCisgICAgKiBjaGVjayBpbiBwbmdfcm93Ynl0ZXMgdGhhdCB0aGUgdXNlciBidWZmZXIgd29uJ3QgZ2V0IG92ZXJ3cml0dGVuLiAgTm90ZQ0KKyAgICAqIHRoYXQgdGhlIGZpZWxkIGlzIG5vdCBhbHdheXMgc2V0IC0gaWYgcG5nX3JlYWRfdXBkYXRlX2luZm8gaXNuJ3QgY2FsbGVkDQorICAgICogdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBlaXRoZXIgbm90IGRvIGFueSB0cmFuc2Zvcm1zIG9yIGdldCB0aGUgY2FsY3VsYXRpb24NCisgICAgKiByaWdodCBpdHNlbGYuDQorICAgICovDQorICAgcG5nX3B0ci0+aW5mb19yb3dieXRlcyA9IGluZm9fcHRyLT5yb3dieXRlczsNCisNCisjaWZuZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0cikNCisgICAgICByZXR1cm47DQorI2VuZGlmDQorfQ0KKw0KKy8qIFRyYW5zZm9ybSB0aGUgcm93LiAgVGhlIG9yZGVyIG9mIHRyYW5zZm9ybWF0aW9ucyBpcyBzaWduaWZpY2FudCwNCisgKiBhbmQgaXMgdmVyeSB0b3VjaHkuICBJZiB5b3UgYWRkIGEgdHJhbnNmb3JtYXRpb24sIHRha2UgY2FyZSB0bw0KKyAqIGRlY2lkZSBob3cgaXQgZml0cyBpbiB3aXRoIHRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgaGVyZS4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zIik7DQorDQorICAgaWYgKHBuZ19wdHItPnJvd19idWYgPT0gTlVMTCkNCisgICB7DQorICAgICAgLyogUHJpb3IgdG8gMS41LjQgdGhpcyBvdXRwdXQgcm93L3Bhc3Mgd2hlcmUgdGhlIE5VTEwgcG9pbnRlciBpcywgYnV0IHRoaXMNCisgICAgICAgKiBlcnJvciBpcyBpbmNyZWRpYmx5IHJhcmUgYW5kIGluY3JlZGlibHkgZWFzeSB0byBkZWJ1ZyB3aXRob3V0IHRoaXMNCisgICAgICAgKiBpbmZvcm1hdGlvbi4NCisgICAgICAgKi8NCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5VTEwgcm93IGJ1ZmZlciIpOw0KKyAgIH0NCisNCisgICAvKiBUaGUgZm9sbG93aW5nIGlzIGRlYnVnZ2luZzsgcHJpb3IgdG8gMS41LjQgdGhlIGNvZGUgd2FzIG5ldmVyIGNvbXBpbGVkIGluOw0KKyAgICAqIGluIDEuNS40IFBOR19GTEFHX0RFVEVDVF9VTklOSVRJQUxJWkVEIHdhcyBhZGRlZCBhbmQgdGhlIG1hY3JvDQorICAgICogUE5HX1dBUk5fVU5JTklUSUFMSVpFRF9ST1cgcmVtb3ZlZC4gIEluIDEuNiB0aGUgbmV3IGZsYWcgaXMgc2V0IG9ubHkgZm9yDQorICAgICogYWxsIHRyYW5zZm9ybWF0aW9ucywgaG93ZXZlciBpbiBwcmFjdGljZSB0aGUgUk9XX0lOSVQgYWx3YXlzIGdldHMgZG9uZSBvbg0KKyAgICAqIGRlbWFuZCwgaWYgbmVjZXNzYXJ5Lg0KKyAgICAqLw0KKyAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ERVRFQ1RfVU5JTklUSUFMSVpFRCkgIT0gMCAmJg0KKyAgICAgICEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpDQorICAgew0KKyAgICAgIC8qIEFwcGxpY2F0aW9uIGhhcyBmYWlsZWQgdG8gY2FsbCBlaXRoZXIgcG5nX3JlYWRfc3RhcnRfaW1hZ2UoKSBvcg0KKyAgICAgICAqIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgc2V0dGluZyB0cmFuc2Zvcm1zIHRoYXQgZXhwYW5kIHBpeGVscy4NCisgICAgICAgKiBUaGlzIGNoZWNrIGFkZGVkIHRvIGxpYnBuZy0xLjIuMTkgKGJ1dCBub3QgZW5hYmxlZCB1bnRpbCAxLjUuNCkuDQorICAgICAgICovDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmluaXRpYWxpemVkIHJvdyIpOw0KKyAgIH0NCisNCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKQ0KKyAgIHsNCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICB7DQorICAgICAgICAgcG5nX2RvX2V4cGFuZF9wYWxldHRlKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwNCisgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZSwgcG5nX3B0ci0+dHJhbnNfYWxwaGEsIHBuZ19wdHItPm51bV90cmFucyk7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucyAmJg0KKyAgICAgICAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSkNCisgICAgICAgICAgICBwbmdfZG9fZXhwYW5kKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwNCisgICAgICAgICAgICAgICAgJihwbmdfcHRyLT50cmFuc19jb2xvcikpOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwbmdfZG9fZXhwYW5kKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwNCisgICAgICAgICAgICAgICAgTlVMTCk7DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1RSSVBfQUxQSEEpICYmDQorICAgICAgIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgJiYNCisgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8DQorICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkpDQorICAgICAgcG5nX2RvX3N0cmlwX2NoYW5uZWwocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLA0KKyAgICAgICAgIDAgLyogYXRfc3RhcnQgPT0gZmFsc2UsIGJlY2F1c2UgU1dBUF9BTFBIQSBoYXBwZW5zIGxhdGVyICovKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkNCisgICB7DQorICAgICAgaW50IHJnYl9lcnJvciA9DQorICAgICAgICAgIHBuZ19kb19yZ2JfdG9fZ3JheShwbmdfcHRyLCByb3dfaW5mbywNCisgICAgICAgICAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisNCisgICAgICBpZiAocmdiX2Vycm9yKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9zdGF0dXM9MTsNCisgICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkgPT0NCisgICAgICAgICAgICAgUE5HX1JHQl9UT19HUkFZX1dBUk4pDQorICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInBuZ19kb19yZ2JfdG9fZ3JheSBmb3VuZCBub25ncmF5IHBpeGVsIik7DQorDQorICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpID09DQorICAgICAgICAgICAgIFBOR19SR0JfVE9fR1JBWV9FUlIpDQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwbmdfZG9fcmdiX3RvX2dyYXkgZm91bmQgbm9uZ3JheSBwaXhlbCIpOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorLyogRnJvbSBBbmRyZWFzIERpbGdlciBlLW1haWwgdG8gcG5nLWltcGxlbWVudCwgMjYgTWFyY2ggMTk5ODoNCisgKg0KKyAqICAgSW4gbW9zdCBjYXNlcywgdGhlICJzaW1wbGUgdHJhbnNwYXJlbmN5IiBzaG91bGQgYmUgZG9uZSBwcmlvciB0byBkb2luZw0KKyAqICAgZ3JheS10by1SR0IsIG9yIHlvdSB3aWxsIGhhdmUgdG8gdGVzdCAzeCBhcyBtYW55IGJ5dGVzIHRvIGNoZWNrIGlmIGENCisgKiAgIHBpeGVsIGlzIHRyYW5zcGFyZW50LiAgWW91IHdvdWxkIGFsc28gbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUNCisgKiAgIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiBpcyB1cGdyYWRlZCB0byBSR0IuDQorICoNCisgKiAgIFRvIHN1bW1hcml6ZSwgdGhlIGN1cnJlbnQgZmxvdyBpczoNCisgKiAgIC0gR3JheSArIHNpbXBsZSB0cmFuc3BhcmVuY3kgLT4gY29tcGFyZSAxIG9yIDIgZ3JheSBieXRlcyBhbmQgY29tcG9zaXRlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYmFja2dyb3VuZCAiaW4gcGxhY2UiIGlmIHRyYW5zcGFyZW50LA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0IHRvIFJHQiBpZiBuZWNlc3NhcnkNCisgKiAgIC0gR3JheSArIGFscGhhIC0+IGNvbXBvc2l0ZSB3aXRoIGdyYXkgYmFja2dyb3VuZCBhbmQgcmVtb3ZlIGFscGhhIGJ5dGVzLA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0IHRvIFJHQiBpZiBuZWNlc3NhcnkNCisgKg0KKyAqICAgVG8gc3VwcG9ydCBSR0IgYmFja2dyb3VuZHMgZm9yIGdyYXkgaW1hZ2VzIHdlIG5lZWQ6DQorICogICAtIEdyYXkgKyBzaW1wbGUgdHJhbnNwYXJlbmN5IC0+IGNvbnZlcnQgdG8gUkdCICsgc2ltcGxlIHRyYW5zcGFyZW5jeSwNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZSAzIG9yIDYgYnl0ZXMgYW5kIGNvbXBvc2l0ZSB3aXRoDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgImluIHBsYWNlIiBpZiB0cmFuc3BhcmVudA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoM3ggY29tcGFyZS9waXhlbCBjb21wYXJlZCB0byBkb2luZw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgd2l0aCBncmF5IGJrZ3JuZCkNCisgKiAgIC0gR3JheSArIGFscGhhIC0+IGNvbnZlcnQgdG8gUkdCICsgYWxwaGEsIGNvbXBvc2l0ZSB3aXRoIGJhY2tncm91bmQgYW5kDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSBhbHBoYSBieXRlcyAoM3ggZmxvYXQNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy9waXhlbCBjb21wYXJlZCB3aXRoIGNvbXBvc2l0ZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBncmF5IGJhY2tncm91bmQpDQorICoNCisgKiAgR3JlZydzIGNoYW5nZSB3aWxsIGRvIHRoaXMuICBUaGUgcmVhc29uIGl0IHdhc24ndCBkb25lIGJlZm9yZSBpcyBmb3INCisgKiAgcGVyZm9ybWFuY2UsIGFzIHRoaXMgaW5jcmVhc2VzIHRoZSBwZXItcGl4ZWwgb3BlcmF0aW9ucy4gIElmIHdlIHdvdWxkIGNoZWNrDQorICogIGluIGFkdmFuY2UgaWYgdGhlIGJhY2tncm91bmQgd2FzIGdyYXkgb3IgUkdCLCBhbmQgcG9zaXRpb24gdGhlIGdyYXktdG8tUkdCDQorICogIHRyYW5zZm9ybSBhcHByb3ByaWF0ZWx5LCB0aGVuIGl0IHdvdWxkIHNhdmUgYSBsb3Qgb2Ygd29yay90aW1lLg0KKyAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCisgICAvKiBJZiBncmF5IC0+IFJHQiwgZG8gc28gbm93IG9ubHkgaWYgYmFja2dyb3VuZCBpcyBub24tZ3JheTsgZWxzZSBkbyBsYXRlcg0KKyAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zDQorICAgICovDQorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR1JBWV9UT19SR0IpICYmDQorICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkpKQ0KKyAgICAgIHBuZ19kb19ncmF5X3RvX3JnYihyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQ0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkNCisgICAgICBwbmdfZG9fY29tcG9zZShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HQU1NQSkgJiYNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorICAgICAgLyogQmVjYXVzZSBSR0JfVE9fR1JBWSBkb2VzIHRoZSBnYW1tYSB0cmFuc2Zvcm0uICovDQorICAgICAgIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpICYmDQorI2VuZGlmDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XA0KKyAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpDQorICAgICAgLyogQmVjYXVzZSBQTkdfQ09NUE9TRSBkb2VzIHRoZSBnYW1tYSB0cmFuc2Zvcm0gaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvDQorICAgICAgICogZG8gKGlmIHRoZXJlIGlzIGFuIGFscGhhIGNoYW5uZWwgb3IgdHJhbnNwYXJlbmN5LikNCisgICAgICAgKi8NCisgICAgICAgISgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0NPTVBPU0UpICYmDQorICAgICAgICgocG5nX3B0ci0+bnVtX3RyYW5zICE9IDApIHx8DQorICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSkgJiYNCisjZW5kaWYNCisgICAgICAvKiBCZWNhdXNlIHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zIHRyYW5zZm9ybXMgdGhlIHBhbGV0dGUsIHVubGVzcw0KKyAgICAgICAqIFJHQl9UT19HUkFZIHdpbGwgZG8gdGhlIHRyYW5zZm9ybS4NCisgICAgICAgKi8NCisgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpDQorICAgICAgcG5nX2RvX2dhbW1hKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0cik7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRA0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NUUklQX0FMUEhBKSAmJg0KKyAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQ09NUE9TRSkgJiYNCisgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBIHx8DQorICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkpDQorICAgICAgcG5nX2RvX3N0cmlwX2NoYW5uZWwocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLA0KKyAgICAgICAgIDAgLyogYXRfc3RhcnQgPT0gZmFsc2UsIGJlY2F1c2UgU1dBUF9BTFBIQSBoYXBwZW5zIGxhdGVyICovKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQNCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FTkNPREVfQUxQSEEpICYmDQorICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKQ0KKyAgICAgIHBuZ19kb19lbmNvZGVfYWxwaGEocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NDQUxFXzE2X1RPXzgpDQorICAgICAgcG5nX2RvX3NjYWxlXzE2X3RvXzgocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQNCisgICAvKiBUaGVyZSBpcyBubyBoYXJtIGluIGRvaW5nIGJvdGggb2YgdGhlc2UgYmVjYXVzZSBvbmx5IG9uZSBoYXMgYW55IGVmZmVjdCwNCisgICAgKiBieSBwdXR0aW5nIHRoZSAnc2NhbGUnIG9wdGlvbiBmaXJzdCBpZiB0aGUgYXBwIGFza3MgZm9yIHNjYWxlIChlaXRoZXIgYnkNCisgICAgKiBjYWxsaW5nIHRoZSBBUEkgb3IgaW4gYSBUUkFOU0ZPUk0gZmxhZykgdGhpcyBpcyB3aGF0IGhhcHBlbnMuDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR18xNl9UT184KQ0KKyAgICAgIHBuZ19kb19jaG9wKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUVVBTlRJWkUpDQorICAgew0KKyAgICAgIHBuZ19kb19xdWFudGl6ZShyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsDQorICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwLCBwbmdfcHRyLT5xdWFudGl6ZV9pbmRleCk7DQorDQorICAgICAgaWYgKHJvd19pbmZvLT5yb3dieXRlcyA9PSAwKQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2RvX3F1YW50aXplIHJldHVybmVkIHJvd2J5dGVzPTAiKTsNCisgICB9DQorI2VuZGlmIC8qIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEDQorICAgLyogRG8gdGhlIGV4cGFuc2lvbiBub3csIGFmdGVyIGFsbCB0aGUgYXJpdGhtZXRpYyBoYXMgYmVlbiBkb25lLiAgTm90aWNlDQorICAgICogdGhhdCBwcmV2aW91cyB0cmFuc2Zvcm1hdGlvbnMgY2FuIGhhbmRsZSB0aGUgUE5HX0VYUEFORF8xNiBmbGFnIGlmIHRoaXMNCisgICAgKiBpcyBlZmZpY2llbnQgKHBhcnRpY3VsYXJseSB0cnVlIGluIHRoZSBjYXNlIG9mIGdhbW1hIGNvcnJlY3Rpb24sIHdoZXJlDQorICAgICogYmV0dGVyIGFjY3VyYWN5IHJlc3VsdHMgZmFzdGVyISkNCisgICAgKi8NCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF8xNikNCisgICAgICBwbmdfZG9fZXhwYW5kXzE2KHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRA0KKyAgIC8qIE5PVEU6IG1vdmVkIGhlcmUgaW4gMS41LjQgKGZyb20gbXVjaCBsYXRlciBpbiB0aGlzIGxpc3QuKSAqLw0KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKSAmJg0KKyAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkpKQ0KKyAgICAgIHBuZ19kb19ncmF5X3RvX3JnYihyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfTU9OTykNCisgICAgICBwbmdfZG9faW52ZXJ0KHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpDQorICAgICAgcG5nX2RvX3Vuc2hpZnQocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLA0KKyAgICAgICAgICAmKHBuZ19wdHItPnNoaWZ0KSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQ0KKyAgICAgIHBuZ19kb191bnBhY2socm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorICAgLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLw0KKyAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmDQorICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA+PSAwKQ0KKyAgICAgIHBuZ19kb19jaGVja19wYWxldHRlX2luZGV4ZXMocG5nX3B0ciwgcm93X2luZm8pOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpDQorICAgICAgcG5nX2RvX2Jncihyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQ0KKyAgICAgIHBuZ19kb19wYWNrc3dhcChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpDQorICAgICAgcG5nX2RvX3JlYWRfZmlsbGVyKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwNCisgICAgICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPmZpbGxlciwgcG5nX3B0ci0+ZmxhZ3MpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpDQorICAgICAgcG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0FMUEhBKQ0KKyAgICAgIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVEDQorI2lmZGVmIFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQ0KKyAgICAgIHBuZ19kb19zd2FwKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfVVNFUl9UUkFOU0ZPUk0pDQorICAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+cmVhZF91c2VyX3RyYW5zZm9ybV9mbiAhPSBOVUxMKQ0KKyAgICAgICAgICgqKHBuZ19wdHItPnJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pKSAvKiBVc2VyIHJlYWQgdHJhbnNmb3JtIGZ1bmN0aW9uICovDQorICAgICAgICAgICAgIChwbmdfcHRyLCAgICAgLyogcG5nX3B0ciAqLw0KKyAgICAgICAgICAgICByb3dfaW5mbywgICAgIC8qIHJvd19pbmZvOiAqLw0KKyAgICAgICAgICAgICAgICAvKiAgcG5nX3VpbnRfMzIgd2lkdGg7ICAgICAgIHdpZHRoIG9mIHJvdyAqLw0KKyAgICAgICAgICAgICAgICAvKiAgcG5nX3NpemVfdCByb3dieXRlczsgICAgIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8NCisgICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICBjb2xvciB0eXBlIG9mIHBpeGVscyAqLw0KKyAgICAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgYml0X2RlcHRoOyAgICAgIGJpdCBkZXB0aCBvZiBzYW1wbGVzICovDQorICAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpICovDQorICAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgYml0cyBwZXIgcGl4ZWwgKGRlcHRoKmNoYW5uZWxzKSAqLw0KKyAgICAgICAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSk7ICAgIC8qIHN0YXJ0IG9mIHBpeGVsIGRhdGEgZm9yIHJvdyAqLw0KKyNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRA0KKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCkNCisgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGg7DQorDQorICAgICAgaWYgKHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzKQ0KKyAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzOw0KKyNlbmRpZg0KKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmJpdF9kZXB0aCAqDQorICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyk7DQorDQorICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X2luZm8tPndpZHRoKTsNCisgICB9DQorI2VuZGlmDQorfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRA0KKy8qIFVucGFjayBwaXhlbHMgb2YgMSwgMiwgb3IgNCBiaXRzIHBlciBwaXhlbCBpbnRvIDEgYnl0ZSBwZXIgcGl4ZWwsDQorICogd2l0aG91dCBjaGFuZ2luZyB0aGUgYWN0dWFsIHZhbHVlcy4gIFRodXMsIGlmIHlvdSBoYWQgYSByb3cgd2l0aA0KKyAqIGEgYml0IGRlcHRoIG9mIDEsIHlvdSB3b3VsZCBlbmQgdXAgd2l0aCBieXRlcyB0aGF0IG9ubHkgY29udGFpbmVkDQorICogdGhlIG51bWJlcnMgMCBvciAxLiAgSWYgeW91IHdvdWxkIHJhdGhlciB0aGV5IGNvbnRhaW4gMCBhbmQgMjU1LCB1c2UNCisgKiBwbmdfZG9fc2hpZnQoKSBhZnRlciB0aGlzLg0KKyAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb191bnBhY2socG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fdW5wYWNrIik7DQorDQorICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQ0KKyAgIHsNCisgICAgICBwbmdfdWludF8zMiBpOw0KKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMyk7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDAxKTsNCisNCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgIHNwLS07DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICBzaGlmdCsrOw0KKw0KKyAgICAgICAgICAgICAgIGRwLS07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgew0KKw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMik7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBzaGlmdCA9IChpbnQpKCgzIC0gKChyb3dfd2lkdGggKyAzKSAmIDB4MDMpKSA8PCAxKTsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDAzKTsNCisNCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNikNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgIHNwLS07DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICBzaGlmdCArPSAyOw0KKw0KKyAgICAgICAgICAgICAgIGRwLS07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMSk7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBzaGlmdCA9IChpbnQpKCgxIC0gKChyb3dfd2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDBmKTsNCisNCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgIHNwLS07DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7DQorDQorICAgICAgICAgICAgICAgZHAtLTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4Ow0KKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoOCAqIHJvd19pbmZvLT5jaGFubmVscyk7DQorICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRA0KKy8qIFJldmVyc2UgdGhlIGVmZmVjdHMgb2YgcG5nX2RvX3NoaWZ0LiAgVGhpcyByb3V0aW5lIG1lcmVseSBzaGlmdHMgdGhlDQorICogcGl4ZWxzIGJhY2sgdG8gdGhlaXIgc2lnbmlmaWNhbnQgYml0cyB2YWx1ZXMuICBUaHVzLCBpZiB5b3UgaGF2ZQ0KKyAqIGEgcm93IG9mIGJpdCBkZXB0aCA4LCBidXQgb25seSA1IGFyZSBzaWduaWZpY2FudCwgdGhpcyB3aWxsIHNoaWZ0DQorICogdGhlIHZhbHVlcyBiYWNrIHRvIDAgdGhyb3VnaCAzMS4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fdW5zaGlmdChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LA0KKyAgICBwbmdfY29uc3RfY29sb3JfOHAgc2lnX2JpdHMpDQorew0KKyAgIGludCBjb2xvcl90eXBlOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3Vuc2hpZnQiKTsNCisNCisgICAvKiBUaGUgcGFsZXR0ZSBjYXNlIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCBpbiB0aGUgX2luaXQgcm91dGluZS4gKi8NCisgICBjb2xvcl90eXBlID0gcm93X2luZm8tPmNvbG9yX3R5cGU7DQorDQorICAgaWYgKGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICB7DQorICAgICAgaW50IHNoaWZ0WzRdOw0KKyAgICAgIGludCBjaGFubmVscyA9IDA7DQorICAgICAgaW50IGJpdF9kZXB0aCA9IHJvd19pbmZvLT5iaXRfZGVwdGg7DQorDQorICAgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikNCisgICAgICB7DQorICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSBiaXRfZGVwdGggLSBzaWdfYml0cy0+cmVkOw0KKyAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gYml0X2RlcHRoIC0gc2lnX2JpdHMtPmdyZWVuOw0KKyAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gYml0X2RlcHRoIC0gc2lnX2JpdHMtPmJsdWU7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSBiaXRfZGVwdGggLSBzaWdfYml0cy0+Z3JheTsNCisgICAgICB9DQorDQorICAgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkNCisgICAgICB7DQorICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSBiaXRfZGVwdGggLSBzaWdfYml0cy0+YWxwaGE7DQorICAgICAgfQ0KKw0KKyAgICAgIHsNCisgICAgICAgICBpbnQgYywgaGF2ZV9zaGlmdDsNCisNCisgICAgICAgICBmb3IgKGMgPSBoYXZlX3NoaWZ0ID0gMDsgYyA8IGNoYW5uZWxzOyArK2MpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIEEgc2hpZnQgb2YgbW9yZSB0aGFuIHRoZSBiaXQgZGVwdGggaXMgYW4gZXJyb3IgY29uZGl0aW9uIGJ1dCBpdA0KKyAgICAgICAgICAgICAqIGdldHMgaWdub3JlZCBoZXJlLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChzaGlmdFtjXSA8PSAwIHx8IHNoaWZ0W2NdID49IGJpdF9kZXB0aCkNCisgICAgICAgICAgICAgICBzaGlmdFtjXSA9IDA7DQorDQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIGhhdmVfc2hpZnQgPSAxOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAoIWhhdmVfc2hpZnQpDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBzd2l0Y2ggKGJpdF9kZXB0aCkNCisgICAgICB7DQorICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAvKiBNdXN0IGJlIDFicHAgZ3JheTogc2hvdWxkIG5vdCBiZSBoZXJlISAqLw0KKyAgICAgICAgICAgIC8qIE5PVFJFQUNIRUQgKi8NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgLyogTXVzdCBiZSAyYnBwIGdyYXkgKi8NCisgICAgICAgICAvKiBhc3NlcnQoY2hhbm5lbHMgPT0gMSAmJiBzaGlmdFswXSA9PSAxKSAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGJwX2VuZCA9IGJwICsgcm93X2luZm8tPnJvd2J5dGVzOw0KKw0KKyAgICAgICAgICAgIHdoaWxlIChicCA8IGJwX2VuZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaW50IGIgPSAoKmJwID4+IDEpICYgMHg1NTsNCisgICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSliOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgIC8qIE11c3QgYmUgNGJwcCBncmF5ICovDQorICAgICAgICAgLyogYXNzZXJ0KGNoYW5uZWxzID09IDEpICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgYnBfZW5kID0gYnAgKyByb3dfaW5mby0+cm93Ynl0ZXM7DQorICAgICAgICAgICAgaW50IGdyYXlfc2hpZnQgPSBzaGlmdFswXTsNCisgICAgICAgICAgICBpbnQgbWFzayA9ICAweGYgPj4gZ3JheV9zaGlmdDsNCisNCisgICAgICAgICAgICBtYXNrIHw9IG1hc2sgPDwgNDsNCisNCisgICAgICAgICAgICB3aGlsZSAoYnAgPCBicF9lbmQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGludCBiID0gKCpicCA+PiBncmF5X3NoaWZ0KSAmIG1hc2s7DQorICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpYjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgODoNCisgICAgICAgICAvKiBTaW5nbGUgYnl0ZSBjb21wb25lbnRzLCBHLCBHQSwgUkdCLCBSR0JBICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgYnBfZW5kID0gYnAgKyByb3dfaW5mby0+cm93Ynl0ZXM7DQorICAgICAgICAgICAgaW50IGNoYW5uZWwgPSAwOw0KKw0KKyAgICAgICAgICAgIHdoaWxlIChicCA8IGJwX2VuZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaW50IGIgPSAqYnAgPj4gc2hpZnRbY2hhbm5lbF07DQorICAgICAgICAgICAgICAgaWYgKCsrY2hhbm5lbCA+PSBjaGFubmVscykNCisgICAgICAgICAgICAgICAgICBjaGFubmVsID0gMDsNCisgICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSliOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorI2lmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRA0KKyAgICAgICAgIGNhc2UgMTY6DQorICAgICAgICAgLyogRG91YmxlIGJ5dGUgY29tcG9uZW50cywgRywgR0EsIFJHQiwgUkdCQSAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGJwX2VuZCA9IGJwICsgcm93X2luZm8tPnJvd2J5dGVzOw0KKyAgICAgICAgICAgIGludCBjaGFubmVsID0gMDsNCisNCisgICAgICAgICAgICB3aGlsZSAoYnAgPCBicF9lbmQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IChicFswXSA8PCA4KSArIGJwWzFdOw0KKw0KKyAgICAgICAgICAgICAgIHZhbHVlID4+PSBzaGlmdFtjaGFubmVsXTsNCisgICAgICAgICAgICAgICBpZiAoKytjaGFubmVsID49IGNoYW5uZWxzKQ0KKyAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAwOw0KKyAgICAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSA+PiA4KTsNCisgICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSkodmFsdWUgJiAweGZmKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRA0KKy8qIFNjYWxlIHJvd3Mgb2YgYml0IGRlcHRoIDE2IGRvd24gdG8gOCBhY2N1cmF0ZWx5ICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3NjYWxlXzE2X3RvXzgocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fc2NhbGVfMTZfdG9fOCIpOw0KKw0KKyAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7IC8qIHNvdXJjZSAqLw0KKyAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsgLyogZGVzdGluYXRpb24gKi8NCisgICAgICBwbmdfYnl0ZXAgZXAgPSBzcCArIHJvd19pbmZvLT5yb3dieXRlczsgLyogZW5kKzEgKi8NCisNCisgICAgICB3aGlsZSAoc3AgPCBlcCkNCisgICAgICB7DQorICAgICAgICAgLyogVGhlIGlucHV0IGlzIGFuIGFycmF5IG9mIDE2IGJpdCBjb21wb25lbnRzLCB0aGVzZSBtdXN0IGJlIHNjYWxlZCB0bw0KKyAgICAgICAgICAqIDggYml0cyBlYWNoLiAgRm9yIGEgMTYgYml0IHZhbHVlIFYgdGhlIHJlcXVpcmVkIHZhbHVlIChmcm9tIHRoZSBQTkcNCisgICAgICAgICAgKiBzcGVjaWZpY2F0aW9uKSBpczoNCisgICAgICAgICAgKg0KKyAgICAgICAgICAqICAgIChWICogMjU1KSAvIDY1NTM1DQorICAgICAgICAgICoNCisgICAgICAgICAgKiBUaGlzIHJlZHVjZXMgdG8gcm91bmQoViAvIDI1NyksIG9yIGZsb29yKChWICsgMTI4LjUpLzI1NykNCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIFJlcHJlc2VudCBWIGFzIHRoZSB0d28gYnl0ZSB2YWx1ZSB2aGkudmxvLiAgTWFrZSBhIGd1ZXNzIHRoYXQgdGhlDQorICAgICAgICAgICogcmVzdWx0IGlzIHRoZSB0b3AgYnl0ZSBvZiBWLCB2aGksIHRoZW4gdGhlIGNvcnJlY3Rpb24gdG8gdGhpcyB2YWx1ZQ0KKyAgICAgICAgICAqIGlzOg0KKyAgICAgICAgICAqDQorICAgICAgICAgICogICAgZXJyb3IgPSBmbG9vcigoKFYtdmhpLnZoaSkgKyAxMjguNSkgLyAyNTcpDQorICAgICAgICAgICogICAgICAgICAgPSBmbG9vcigoKHZsby12aGkpICsgMTI4LjUpIC8gMjU3KQ0KKyAgICAgICAgICAqDQorICAgICAgICAgICogVGhpcyBjYW4gYmUgYXBwcm94aW1hdGVkIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpYyAoYW5kIGEgc2lnbmVkDQorICAgICAgICAgICogc2hpZnQpOg0KKyAgICAgICAgICAqDQorICAgICAgICAgICogICAgZXJyb3IgPSAodmxvLXZoaSsxMjgpID4+IDg7DQorICAgICAgICAgICoNCisgICAgICAgICAgKiBUaGUgYXBwcm94aW1hdGUgZGlmZmVycyBmcm9tIHRoZSBleGFjdCBhbnN3ZXIgb25seSB3aGVuICh2bG8tdmhpKSBpcw0KKyAgICAgICAgICAqIDEyODsgaXQgdGhlbiBnaXZlcyBhIGNvcnJlY3Rpb24gb2YgKzEgd2hlbiB0aGUgZXhhY3QgY29ycmVjdGlvbiBpcw0KKyAgICAgICAgICAqIDAuICBUaGlzIGdpdmVzIDEyOCBlcnJvcnMuICBUaGUgZXhhY3QgYW5zd2VyIChjb3JyZWN0IGZvciBhbGwgMTYgYml0DQorICAgICAgICAgICogaW5wdXQgdmFsdWVzKSBpczoNCisgICAgICAgICAgKg0KKyAgICAgICAgICAqICAgIGVycm9yID0gKHZsby12aGkrMTI4KSo2NTUzNSA+PiAyNDsNCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIEFuIGFsdGVybmF0aXZlIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gd2hpY2ggYWxzbyBnaXZlcyBubyBlcnJvcnMgaXM6DQorICAgICAgICAgICoNCisgICAgICAgICAgKiAgICAoViAqIDI1NSArIDMyODk1KSA+PiAxNg0KKyAgICAgICAgICAqLw0KKw0KKyAgICAgICAgIHBuZ19pbnRfMzIgdG1wID0gKnNwKys7IC8qIG11c3QgYmUgc2lnbmVkISAqLw0KKyAgICAgICAgIHRtcCArPSAoKChpbnQpKnNwKysgLSB0bXAgKyAxMjgpICogNjU1MzUpID4+IDI0Ow0KKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKXRtcDsNCisgICAgICB9DQorDQorICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7DQorICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKSg4ICogcm93X2luZm8tPmNoYW5uZWxzKTsNCisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfaW5mby0+d2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7DQorICAgfQ0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCisvKiBTaW1wbHkgZGlzY2FyZCB0aGUgbG93IGJ5dGUuICBUaGlzIHdhcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBwcmlvcg0KKyAqIHRvIGxpYnBuZy0xLjUuNC4NCisgKi8NCitwbmdfZG9fY2hvcChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19jaG9wIik7DQorDQorICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsgLyogc291cmNlICovDQorICAgICAgcG5nX2J5dGVwIGRwID0gcm93OyAvKiBkZXN0aW5hdGlvbiAqLw0KKyAgICAgIHBuZ19ieXRlcCBlcCA9IHNwICsgcm93X2luZm8tPnJvd2J5dGVzOyAvKiBlbmQrMSAqLw0KKw0KKyAgICAgIHdoaWxlIChzcCA8IGVwKQ0KKyAgICAgIHsNCisgICAgICAgICAqZHArKyA9ICpzcDsNCisgICAgICAgICBzcCArPSAyOyAvKiBza2lwIGxvdyBieXRlICovDQorICAgICAgfQ0KKw0KKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4Ow0KKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoOCAqIHJvd19pbmZvLT5jaGFubmVscyk7DQorICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3JlYWRfc3dhcF9hbHBoYShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEiKTsNCisNCisgICB7DQorICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpDQorICAgICAgew0KKyAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSR0JBIHRvIEFSR0IgKi8NCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7DQorICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc2F2ZSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisjaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIFJSR0dCQkFBIHRvIEFBUlJHR0JCICovDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7DQorICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZVsyXTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgc2F2ZVsxXSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMF07DQorICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMV07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkNCisgICAgICB7DQorICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdBIHRvIEFHICovDQorICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOw0KKyAgICAgICAgICAgIHBuZ19ieXRlIHNhdmU7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNhdmUgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorI2lmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRA0KKyAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBHR0FBIHRvIEFBR0cgKi8NCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsNCisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzYXZlWzBdID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZVswXTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZVsxXTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpDQorew0KKyAgIHBuZ191aW50XzMyIHJvd193aWR0aDsNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSIpOw0KKw0KKyAgIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQ0KKyAgIHsNCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUkdCQSAqLw0KKyAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsNCisgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsNCisgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7DQorDQorLyogICAgICAgICAgVGhpcyBkb2VzIG5vdGhpbmc6DQorICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgV2UgY2FuIHJlcGxhY2UgaXQgd2l0aDoNCisqLw0KKyAgICAgICAgICAgIHNwLT0zOw0KKyAgICAgICAgICAgIGRwPXNwOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorI2lmZGVmIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRA0KKyAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBSUkdHQkJBQSAqLw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOw0KKyAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOw0KKyAgICAgICAgIHBuZ191aW50XzMyIGk7DQorDQorICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsNCisNCisvKiAgICAgICAgICBUaGlzIGRvZXMgbm90aGluZzoNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICBXZSBjYW4gcmVwbGFjZSBpdCB3aXRoOg0KKyovDQorICAgICAgICAgICAgc3AtPTY7DQorICAgICAgICAgICAgZHA9c3A7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisjZW5kaWYNCisgICB9DQorICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkNCisgICB7DQorICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkNCisgICAgICB7DQorICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIEdBICovDQorICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOw0KKyAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOw0KKyAgICAgICAgIHBuZ191aW50XzMyIGk7DQorDQorICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHR0FBICovDQorICAgICAgICAgcG5nX2J5dGVwIHNwICA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsNCisgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsNCisgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7DQorICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7DQorLyoNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisqLw0KKyAgICAgICAgICAgIHNwLT0yOw0KKyAgICAgICAgICAgIGRwPXNwOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorI2VuZGlmDQorICAgfQ0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRA0KKy8qIEFkZCBmaWxsZXIgY2hhbm5lbCBpZiB3ZSBoYXZlIFJHQiBjb2xvciAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb19yZWFkX2ZpbGxlcihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LA0KKyAgICBwbmdfdWludF8zMiBmaWxsZXIsIHBuZ191aW50XzMyIGZsYWdzKQ0KK3sNCisgICBwbmdfdWludF8zMiBpOw0KKyAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisNCisjaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVEDQorICAgcG5nX2J5dGUgaGlfZmlsbGVyID0gKHBuZ19ieXRlKSgoZmlsbGVyPj44KSAmIDB4ZmYpOw0KKyNlbmRpZg0KKyAgIHBuZ19ieXRlIGxvX2ZpbGxlciA9IChwbmdfYnl0ZSkoZmlsbGVyICYgMHhmZik7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9maWxsZXIiKTsNCisNCisgICBpZiAoDQorICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpDQorICAgew0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gRyB0byBHWCAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aDsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSAgc3AgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7DQorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOw0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7DQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMTY7DQorICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMjsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBHIHRvIFhHICovDQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aDsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7DQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMTY7DQorICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMjsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEdHIHRvIEdHWFggKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7DQorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7DQorICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsNCisgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAyOw0KKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOw0KKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gR0cgdG8gWFhHRyAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsNCisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsNCisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0Ow0KKyAgICAgICAgIH0NCisgICAgICB9DQorI2VuZGlmDQorICAgfSAvKiBDT0xPUl9UWVBFID09IEdSQVkgKi8NCisgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpDQorICAgew0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUkdCIHRvIFJHQlggKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAzOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aDsNCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7DQorICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsNCisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsNCisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0Ow0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJHQiB0byBYUkdCICovDQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMzsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCArIChwbmdfc2l6ZV90KXJvd193aWR0aDsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7DQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMzI7DQorICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogNDsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJSR0dCQiB0byBSUkdHQkJYWCAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDY7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsNCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7DQorICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgKigtLWRwKSA9IGhpX2ZpbGxlcjsNCisgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOw0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7DQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gNjQ7DQorICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogODsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBSUkdHQkIgdG8gWFhSUkdHQkIgKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA2Ow0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsNCisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOw0KKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7DQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gNjQ7DQorICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogODsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyNlbmRpZg0KKyAgIH0gLyogQ09MT1JfVFlQRSA9PSBSR0IgKi8NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRA0KKy8qIEV4cGFuZCBncmF5c2NhbGUgZmlsZXMgdG8gUkdCLCB3aXRoIG9yIHdpdGhvdXQgYWxwaGEgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fZ3JheV90b19yZ2IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX3VpbnRfMzIgaTsNCisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZ3JheV90b19yZ2IiKTsNCisNCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA+PSA4ICYmDQorICAgICAgICEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpDQorICAgew0KKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgRyB0byBSR0IgKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOw0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyBHRyB0byBSUkdHQkIgKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyIC0gMTsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA0Ow0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOw0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AgLSAxKTsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgR0EgdG8gUkdCQSAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDIgLSAxOw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOw0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyBHR0FBIHRvIFJSR0dCQkFBICovDQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNCAtIDE7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNDsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOw0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOw0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AgLSAxKTsNCisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOw0KKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwIC0gMSk7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7DQorICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgKyAyKTsNCisgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19DT0xPUjsNCisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqDQorICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGgpOw0KKyAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7DQorICAgfQ0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorLyogUmVkdWNlIFJHQiBmaWxlcyB0byBncmF5c2NhbGUsIHdpdGggb3Igd2l0aG91dCBhbHBoYQ0KKyAqIHVzaW5nIHRoZSBlcXVhdGlvbiBnaXZlbiBpbiBQb3ludG9uJ3MgQ29sb3JGQVEgb2YgMTk5OC0wMS0wNCBhdA0KKyAqIDxodHRwOi8vd3d3LmluZm9yYW1wLm5ldC9+cG95bnRvbi8+ICAoVEhJUyBMSU5LIElTIERFQUQgSnVuZSAyMDA4IGJ1dA0KKyAqIHZlcnNpb25zIGRhdGVkIDE5OTggdGhyb3VnaCBOb3ZlbWJlciAyMDAyIGhhdmUgYmVlbiBhcmNoaXZlZCBhdA0KKyAqIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDAwODE2MjMyNTUzL2h0dHA6Ly93d3cuaW5mb3JhbXAubmV0Lw0KKyAqIH5wb3ludG9uL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvQ29sb3JGQVEudHh0ICkNCisgKiBDaGFybGVzIFBveW50b24gcG95bnRvbiBhdCBwb3ludG9uLmNvbQ0KKyAqDQorICogICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEINCisgKg0KKyAqICB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIHdpdGggaW50ZWdlcnMgYXMNCisgKg0KKyAqICAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4DQorICoNCisgKiBQb3ludG9uJ3MgY3VycmVudCBsaW5rIChhcyBvZiBKYW51YXJ5IDIwMDMgdGhyb3VnaCBKdWx5IDIwMTEpOg0KKyAqIDxodHRwOi8vd3d3LnBveW50b24uY29tL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvPg0KKyAqIGhhcyBjaGFuZ2VkIHRoZSBudW1iZXJzIHNsaWdodGx5Og0KKyAqDQorICogICAgIFkgPSAwLjIxMjYqUiArIDAuNzE1MipHICsgMC4wNzIyKkINCisgKg0KKyAqICB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIHdpdGggaW50ZWdlcnMgYXMNCisgKg0KKyAqICAgICBZID0gKDY5NjYgKiBSICsgMjM0MzYgKiBHICsgMjM2NiAqIEIpLzMyNzY4DQorICoNCisgKiAgSGlzdG9yaWNhbGx5LCBob3dldmVyLCBsaWJwbmcgdXNlcyBudW1iZXJzIGRlcml2ZWQgZnJvbSB0aGUgSVRVLVIgUmVjIDcwOQ0KKyAqICBlbmQgcG9pbnQgY2hyb21hdGljaXRpZXMgYW5kIHRoZSBENjUgd2hpdGUgcG9pbnQuICBEZXBlbmRpbmcgb24gdGhlDQorICogIHByZWNpc2lvbiB1c2VkIGZvciB0aGUgRDY1IHdoaXRlIHBvaW50IHRoaXMgcHJvZHVjZXMgYSB2YXJpZXR5IG9mIGRpZmZlcmVudA0KKyAqICBudW1iZXJzLCBob3dldmVyIGlmIHRoZSBmb3VyIGRlY2ltYWwgcGxhY2UgdmFsdWUgdXNlZCBpbiBJVFUtUiBSZWMgNzA5IGlzDQorICogIHVzZWQgKDAuMzEyNywwLjMyOTApIHRoZSBZIGNhbGN1bGF0aW9uIHdvdWxkIGJlOg0KKyAqDQorICogICAgIFkgPSAoNjk2OCAqIFIgKyAyMzQzNSAqIEcgKyAyMzY2ICogQikvMzI3NjgNCisgKg0KKyAqICBXaGlsZSB0aGlzIGlzIGNvcnJlY3QgdGhlIHJvdW5kaW5nIHJlc3VsdHMgaW4gYW4gb3ZlcmZsb3cgZm9yIHdoaXRlLCBiZWNhdXNlDQorICogIHRoZSBzdW0gb2YgdGhlIHJvdW5kZWQgY29lZmZpY2llbnRzIGlzIDMyNzY5LCBub3QgMzI3NjguICBDb25zZXF1ZW50bHkNCisgKiAgbGlicG5nIHVzZXMsIGluc3RlYWQsIHRoZSBjbG9zZXN0IG5vbi1vdmVyZmxvd2luZyBhcHByb3hpbWF0aW9uOg0KKyAqDQorICogICAgIFkgPSAoNjk2OCAqIFIgKyAyMzQzNCAqIEcgKyAyMzY2ICogQikvMzI3NjgNCisgKg0KKyAqICBTdGFydGluZyB3aXRoIGxpYnBuZy0xLjUuNSwgaWYgdGhlIGltYWdlIGJlaW5nIGNvbnZlcnRlZCBoYXMgYSBjSFJNIGNodW5rDQorICogIChpbmNsdWRpbmcgYW4gc1JHQiBjaHVuaykgdGhlbiB0aGUgY2hyb21hdGljaXRpZXMgYXJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQ0KKyAqICBjb2VmZmljaWVudHMuICBTZWUgdGhlIGNodW5rIGhhbmRsaW5nIGluIHBuZ3J1dGlsLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorICoNCisgKiAgSW4gYWxsIGNhc2VzIHRoZSBjYWxjdWxhdGlvbiBpcyB0byBiZSBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UuICBJZiBubw0KKyAqICBnYW1tYSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdG8gY29ycmVjdCB0aGUgZW5jb2Rpbmcgb2YgdGhlIG9yaWdpbmFsIFJHQg0KKyAqICB2YWx1ZXMgdGhpcyByZXN1bHRzIGluIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCB0aGUgb3JpZ2luYWwgUE5HIFJHQg0KKyAqICB2YWx1ZXMgd2VyZSBsaW5lYXIuDQorICoNCisgKiAgT3RoZXIgaW50ZWdlciBjb2VmZmljZW50cyBjYW4gYmUgdXNlZCB2aWEgcG5nX3NldF9yZ2JfdG9fZ3JheSgpLiAgQmVjYXVzZQ0KKyAqICB0aGUgQVBJIHRha2VzIGp1c3QgcmVkIGFuZCBncmVlbiBjb2VmZmljaWVudHMgdGhlIGJsdWUgY29lZmZpY2llbnQgaXMNCisgKiAgY2FsY3VsYXRlZCB0byBtYWtlIHRoZSBzdW0gMzI3NjguICBUaGlzIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCByb3VuZGluZw0KKyAqICB0byB0aGF0IHVzZWQgYWJvdmUuDQorICovDQoraW50IC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fcmdiX3RvX2dyYXkocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpDQorDQorew0KKyAgIGludCByZ2JfZXJyb3IgPSAwOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JnYl90b19ncmF5Iik7DQorDQorICAgaWYgKCEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKSAmJg0KKyAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpDQorICAgew0KKyAgICAgIFBOR19DT05TVCBwbmdfdWludF8zMiByYyA9IHBuZ19wdHItPnJnYl90b19ncmF5X3JlZF9jb2VmZjsNCisgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMzIgZ2MgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsNCisgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMzIgYmMgPSAzMjc2OCAtIHJjIC0gZ2M7DQorICAgICAgUE5HX0NPTlNUIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisgICAgICBQTkdfQ09OU1QgaW50IGhhdmVfYWxwaGEgPQ0KKyAgICAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSAhPSAwOw0KKw0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICAgICAgICAvKiBOb3RpY2UgdGhhdCBnYW1tYSB0by9mcm9tIDEgYXJlIG5vdCBuZWNlc3NhcmlseSBpbnZlcnNlcyAoaWYNCisgICAgICAgICAgKiB0aGVyZSBpcyBhbiBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24pLiAgUHJpb3IgdG8gMS41LjUgdGhpcyBjb2RlDQorICAgICAgICAgICogY2hlY2tlZCB0aGUgbGluZWFyaXplZCB2YWx1ZXMgZm9yIGVxdWFsaXR5OyB0aGlzIGRvZXNuJ3QgbWF0Y2gNCisgICAgICAgICAgKiB0aGUgZG9jdW1lbnRhdGlvbiwgdGhlIG9yaWdpbmFsIHZhbHVlcyBtdXN0IGJlIGNoZWNrZWQuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hX2Zyb21fMSAhPSBOVUxMICYmIHBuZ19wdHItPmdhbW1hX3RvXzEgIT0gTlVMTCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93Ow0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX2J5dGUgcmVkICAgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7DQorDQorICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcmVkID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtyZWRdOw0KKyAgICAgICAgICAgICAgICAgIGdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtncmVlbl07DQorICAgICAgICAgICAgICAgICAgYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RvXzFbYmx1ZV07DQorDQorICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7DQorICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IHBuZ19wdHItPmdhbW1hX2Zyb21fMVsNCisgICAgICAgICAgICAgICAgICAgICAgKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSArIDE2Mzg0KT4+MTVdOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIG92ZXJhbGwgY29ycmVjdGlvbiB0aGUgdGFibGUgd2lsbCBub3QgYmUNCisgICAgICAgICAgICAgICAgICAgKiBzZXQuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hX3RhYmxlICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgICAgcmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcmVkXTsNCisNCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gcmVkOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBpZiAoaGF2ZV9hbHBoYSkNCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93Ow0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX2J5dGUgcmVkICAgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7DQorDQorICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7DQorICAgICAgICAgICAgICAgICAgLyogTk9URTogdGhpcyBpcyB0aGUgaGlzdG9yaWNhbCBhcHByb2FjaCB3aGljaCBzaW1wbHkNCisgICAgICAgICAgICAgICAgICAgKiB0cnVuY2F0ZXMgdGhlIHJlc3VsdHMuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICooZHArKykgPSByZWQ7DQorDQorICAgICAgICAgICAgICAgaWYgKGhhdmVfYWxwaGEpDQorICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZSAvKiBSR0IgYml0X2RlcHRoID09IDE2ICovDQorICAgICAgew0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICAgICAgICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSAhPSBOVUxMICYmIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93Ow0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCB3Ow0KKw0KKyAgICAgICAgICAgICAgIHJlZCAgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwICsgMSkpOyBzcCArPSAyOw0KKyAgICAgICAgICAgICAgIGdyZWVuID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwICsgMSkpOyBzcCArPSAyOw0KKyAgICAgICAgICAgICAgIGJsdWUgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwICsgMSkpOyBzcCArPSAyOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChyZWQgPT0gZ3JlZW4gJiYgcmVkID09IGJsdWUpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgICAgIHcgPSBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZVsocmVkJjB4ZmYpDQorICAgICAgICAgICAgICAgICAgICAgICAgID4+IHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtyZWQ+PjhdOw0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICB3ID0gcmVkOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZF8xICAgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhyZWQmMHhmZikNCisgICAgICAgICAgICAgICAgICAgICAgPj4gcG5nX3B0ci0+Z2FtbWFfc2hpZnRdW3JlZD4+OF07DQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZ3JlZW5fMSA9DQorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbKGdyZWVuJjB4ZmYpID4+DQorICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmVlbj4+OF07DQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYmx1ZV8xICA9IHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbKGJsdWUmMHhmZikNCisgICAgICAgICAgICAgICAgICAgICAgPj4gcG5nX3B0ci0+Z2FtbWFfc2hpZnRdW2JsdWU+PjhdOw0KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyYXkxNiAgPSAocG5nX3VpbnRfMTYpKChyYypyZWRfMSArIGdjKmdyZWVuXzENCisgICAgICAgICAgICAgICAgICAgICAgKyBiYypibHVlXzEgKyAxNjM4NCk+PjE1KTsNCisgICAgICAgICAgICAgICAgICB3ID0gcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xWyhncmF5MTYmMHhmZikgPj4NCisgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnRdW2dyYXkxNiA+PiA4XTsNCisgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHc+PjgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChoYXZlX2FscGhhKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICAgICBlbHNlDQorI2VuZGlmDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZCwgZ3JlZW4sIGJsdWUsIGdyYXkxNjsNCisNCisgICAgICAgICAgICAgICByZWQgICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCArIDEpKTsgc3AgKz0gMjsNCisgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCArIDEpKTsgc3AgKz0gMjsNCisgICAgICAgICAgICAgICBibHVlICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCArIDEpKTsgc3AgKz0gMjsNCisNCisgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQ0KKyAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOw0KKw0KKyAgICAgICAgICAgICAgIC8qIEZyb20gMS41LjUgaW4gdGhlIDE2IGJpdCBjYXNlIGRvIHRoZSBhY2N1cmF0ZSBjb252ZXJzaW9uIGV2ZW4NCisgICAgICAgICAgICAgICAgKiBpbiB0aGUgJ2Zhc3QnIGNhc2UgLSB0aGlzIGlzIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB0aGUgY29kZQ0KKyAgICAgICAgICAgICAgICAqIGVuZHMgdXAgd2hlbiBoYW5kbGluZyBsaW5lYXIgMTYgYml0IGRhdGEuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSArIDE2Mzg0KSA+Pg0KKyAgICAgICAgICAgICAgICAgIDE1KTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgoZ3JheTE2Pj44KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKGdyYXkxNiAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChoYXZlX2FscGhhKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgLSAyKTsNCisgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IChwbmdfYnl0ZSkocm93X2luZm8tPmNvbG9yX3R5cGUgJg0KKyAgICAgICAgICB+UE5HX0NPTE9SX01BU0tfQ09MT1IpOw0KKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmNoYW5uZWxzICoNCisgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCk7DQorICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsNCisgICB9DQorICAgcmV0dXJuIHJnYl9lcnJvcjsNCit9DQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19CVUlMRF9HUkFZU0NBTEVfUEFMRVRURV9TVVBQT1JURUQNCisvKiBCdWlsZCBhIGdyYXlzY2FsZSBwYWxldHRlLiAgUGFsZXR0ZSBpcyBhc3N1bWVkIHRvIGJlIDEgPDwgYml0X2RlcHRoDQorICogbGFyZ2Ugb2YgcG5nX2NvbG9yLiAgVGhpcyBsZXRzIGdyYXlzY2FsZSBpbWFnZXMgYmUgdHJlYXRlZCBhcw0KKyAqIHBhbGV0dGVkLiAgTW9zdCB1c2VmdWwgZm9yIGdhbW1hIGNvcnJlY3Rpb24gYW5kIHNpbXBsaWZpY2F0aW9uDQorICogb2YgY29kZS4gIFRoaXMgQVBJIGlzIG5vdCB1c2VkIGludGVybmFsbHkuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUoaW50IGJpdF9kZXB0aCwgcG5nX2NvbG9ycCBwYWxldHRlKQ0KK3sNCisgICBpbnQgbnVtX3BhbGV0dGU7DQorICAgaW50IGNvbG9yX2luYzsNCisgICBpbnQgaTsNCisgICBpbnQgdjsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSIpOw0KKw0KKyAgIGlmIChwYWxldHRlID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHN3aXRjaCAoYml0X2RlcHRoKQ0KKyAgIHsNCisgICAgICBjYXNlIDE6DQorICAgICAgICAgbnVtX3BhbGV0dGUgPSAyOw0KKyAgICAgICAgIGNvbG9yX2luYyA9IDB4ZmY7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSAyOg0KKyAgICAgICAgIG51bV9wYWxldHRlID0gNDsNCisgICAgICAgICBjb2xvcl9pbmMgPSAweDU1Ow0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgNDoNCisgICAgICAgICBudW1fcGFsZXR0ZSA9IDE2Ow0KKyAgICAgICAgIGNvbG9yX2luYyA9IDB4MTE7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSA4Og0KKyAgICAgICAgIG51bV9wYWxldHRlID0gMjU2Ow0KKyAgICAgICAgIGNvbG9yX2luYyA9IDE7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBudW1fcGFsZXR0ZSA9IDA7DQorICAgICAgICAgY29sb3JfaW5jID0gMDsNCisgICAgICAgICBicmVhazsNCisgICB9DQorDQorICAgZm9yIChpID0gMCwgdiA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrLCB2ICs9IGNvbG9yX2luYykNCisgICB7DQorICAgICAgcGFsZXR0ZVtpXS5yZWQgPSAocG5nX2J5dGUpdjsNCisgICAgICBwYWxldHRlW2ldLmdyZWVuID0gKHBuZ19ieXRlKXY7DQorICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gKHBuZ19ieXRlKXY7DQorICAgfQ0KK30NCisjZW5kaWYNCisNCisNCisjaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHxcDQorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkNCisvKiBSZXBsYWNlIGFueSBhbHBoYSBvciB0cmFuc3BhcmVuY3kgd2l0aCB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvci4NCisgKiAiYmFja2dyb3VuZCIgaXMgYWxyZWFkeSBpbiB0aGUgc2NyZWVuIGdhbW1hLCB3aGlsZSAiYmFja2dyb3VuZF8xIiBpcw0KKyAqIGF0IGEgZ2FtbWEgb2YgMS4wLiAgUGFsZXR0ZWQgZmlsZXMgaGF2ZSBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZi4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fY29tcG9zZShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyAgIHBuZ19jb25zdF9ieXRlcCBnYW1tYV90YWJsZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlOw0KKyAgIHBuZ19jb25zdF9ieXRlcCBnYW1tYV9mcm9tXzEgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzE7DQorICAgcG5nX2NvbnN0X2J5dGVwIGdhbW1hX3RvXzEgPSBwbmdfcHRyLT5nYW1tYV90b18xOw0KKyAgIHBuZ19jb25zdF91aW50XzE2cHAgZ2FtbWFfMTYgPSBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZTsNCisgICBwbmdfY29uc3RfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMSA9IHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMTsNCisgICBwbmdfY29uc3RfdWludF8xNnBwIGdhbW1hXzE2X3RvXzEgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xOw0KKyAgIGludCBnYW1tYV9zaGlmdCA9IHBuZ19wdHItPmdhbW1hX3NoaWZ0Ow0KKyAgIGludCBvcHRpbWl6ZSA9IChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX09QVElNSVpFX0FMUEhBKSAhPSAwOw0KKyNlbmRpZg0KKw0KKyAgIHBuZ19ieXRlcCBzcDsNCisgICBwbmdfdWludF8zMiBpOw0KKyAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisgICBpbnQgc2hpZnQ7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fY29tcG9zZSIpOw0KKw0KKyAgIHsNCisgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5jb2xvcl90eXBlKQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDc7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MDEpDQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDdmN2YgPj4gKDcgLSBzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdC0tOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgICAgIHsNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsNCisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwMykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDNmM2YgPj4gKDYgLSBzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcCA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZyA9IChnYW1tYV90YWJsZSBbcCB8IChwIDw8IDIpIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAgPDwgNCkgfCAocCA8PCA2KV0gPj4gNikgJiAweDAzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqc3AgJiAoMHgzZjNmID4+ICg2IC0gc2hpZnQpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgfD0gZyA8PCBzaGlmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICBlbHNlDQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsNCisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwMykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpzcCAmICgweDNmM2YgPj4gKDYgLSBzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCAtPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICAgICB7DQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyAgICAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7DQorICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqc3AgJiAoMHhmMGYgPj4gKDQgLSBzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPDwgc2hpZnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcCA9ICgqc3AgPj4gc2hpZnQpICYgMHgwZjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZyA9IChnYW1tYV90YWJsZVtwIHwgKHAgPDwgNCldID4+IDQpICYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSAqc3AgJiAoMHhmMGYgPj4gKDQgLSBzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSBnIDw8IHNoaWZ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkodG1wICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0Ow0KKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDBmKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gKnNwICYgKDB4ZjBmID4+ICg0IC0gc2hpZnQpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgfD0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5IDw8IHNoaWZ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkodG1wICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgICAgew0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICAgICAgICAgICAgICAgICBpZiAoZ2FtbWFfdGFibGUgIT0gTlVMTCkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCsrKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCsrKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBjYXNlIDE2Og0KKyAgICAgICAgICAgICAgIHsNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMikNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmdyYXkpDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2Wyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgZWxzZQ0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDIpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmF5KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkNCisgICAgICAgICAgICB7DQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDMpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmVlbiAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSBnYW1tYV90YWJsZVsqKHNwICsgMSldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IGdhbW1hX3RhYmxlWyooc3AgKyAyKV07DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgZWxzZQ0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDMpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmVlbiAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovDQorICAgICAgICAgICAgew0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA2KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICArICooc3AgKyAzKSk7DQorDQorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYiA9IChwbmdfdWludF8xNikoKCgqKHNwICsgNCkpIDw8IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDUpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5yZWQgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgZyA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ncmVlbiAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICBiID09IHBuZ19wdHItPnRyYW5zX2NvbG9yLmJsdWUpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID4+IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA0KSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorI2VuZGlmDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNikNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnID0gKHBuZ191aW50XzE2KSgoKCooc3AgKyAyKSkgPDwgOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAqKHNwICsgMykpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGIgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDQpKSA8PCA4KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICArICooc3AgKyA1KSk7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIGcgPT0gcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgYiA9PSBwbmdfcHRyLT50cmFuc19jb2xvci5ibHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID4+IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQToNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkNCisgICAgICAgICAgICB7DQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyAgICAgICAgICAgICAgIGlmIChnYW1tYV90b18xICE9IE5VTEwgJiYgZ2FtbWFfZnJvbV8xICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUgIT0gTlVMTCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKihzcCArIDEpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDB4ZmYpDQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5Ow0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGltaXplKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBnYW1tYV9mcm9tXzFbd107DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gdzsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICBlbHNlDQorI2VuZGlmDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMikNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYSA9ICooc3AgKyAxKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA8IDB4ZmYpDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqc3AsICpzcCwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5KTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIC8qIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpICovDQorICAgICAgICAgICAgew0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCAmJiBnYW1tYV8xNl9mcm9tXzEgIT0gTlVMTCAmJg0KKyAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKCgqKHNwICsgMikpIDw8IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDMpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAocG5nX3VpbnRfMTYpMHhmZmZmKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnLCB2LCB3Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnYW1tYV8xNl90b18xWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW1pemUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHY7DQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBnYW1tYV8xNl9mcm9tXzFbKHYmMHhmZikgPj4gZ2FtbWFfc2hpZnRdW3YgPj4gOF07DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodyA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA0KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKCooc3AgKyAyKSkgPDwgOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAqKHNwICsgMykpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDApDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA+PiA4KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhIDwgMHhmZmZmKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnLCB2Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCBnLCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgICAgIHsNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RvXzEgIT0gTlVMTCAmJiBnYW1tYV9mcm9tXzEgIT0gTlVMTCAmJg0KKyAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDQpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGEgPSAqKHNwICsgMyk7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMHhmZikNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSBnYW1tYV90YWJsZVsqKHNwICsgMSldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IGdhbW1hX3RhYmxlWyooc3AgKyAyKV07DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5yZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW1pemUpIHcgPSBnYW1tYV9mcm9tXzFbd107DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gdzsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqKHNwICsgMSldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGltaXplKSB3ID0gZ2FtbWFfZnJvbV8xW3ddOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IHc7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKihzcCArIDIpXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5ibHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGltaXplKSB3ID0gZ2FtbWFfZnJvbV8xW3ddOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IHc7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgZWxzZQ0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDQpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGEgPSAqKHNwICsgMyk7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPCAweGZmKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCpzcCwgKnNwLCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCk7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqKHNwICsgMSksICooc3AgKyAxKSwgYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbik7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqKHNwICsgMiksICooc3AgKyAyKSwgYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8NCisgICAgICAgICAgICB7DQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyAgICAgICAgICAgICAgIGlmIChnYW1tYV8xNiAhPSBOVUxMICYmIGdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMICYmDQorICAgICAgICAgICAgICAgICAgIGdhbW1hXzE2X3RvXzEgIT0gTlVMTCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA4KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzE2KSgqKHNwICsgNikpDQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDgpICsgKHBuZ191aW50XzE2KSgqKHNwICsgNykpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAocG5nX3VpbnRfMTYpMHhmZmZmKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07DQorICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMykgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyAyKV07DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgNSkgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyA0KV07DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID4+IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2LCB3Ow0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90b18xWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5yZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW1pemUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGdhbW1hXzE2X2Zyb21fMVsoKHcmMHhmZikgPj4gZ2FtbWFfc2hpZnQpXVt3ID4+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4XTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh3ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RvXzFbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodywgdiwgYSwgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGltaXplKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBnYW1tYV8xNl9mcm9tXzFbKCh3JjB4ZmYpID4+IGdhbW1hX3NoaWZ0KV1bdyA+Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOF07DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKSgodyA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90b18xWyooc3AgKyA1KSA+PiBnYW1tYV9zaGlmdF1bKihzcCArIDQpXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIHBuZ19wdHItPmJhY2tncm91bmRfMS5ibHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGltaXplKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBnYW1tYV8xNl9mcm9tXzFbKCh3JjB4ZmYpID4+IGdhbW1hX3NoaWZ0KV1bdyA+Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOF07DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgodyA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA1KSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA4KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzE2KSgqKHNwICsgNikpDQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDgpICsgKHBuZ191aW50XzE2KSgqKHNwICsgNykpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID4+IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAzKSA9IChwbmdfYnl0ZSkocG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPj4gOCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA8IDB4ZmZmZikNCisgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICooc3AgKyAzKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYiA9IChwbmdfdWludF8xNikoKCgqKHNwICsgNCkpIDw8IDgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDUpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIHIsIGEsIHBuZ19wdHItPmJhY2tncm91bmQucmVkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCBnLCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCBiLCBhLCBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyA0KSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgIH0NCit9DQorI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEIHx8IFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKy8qIEdhbW1hIGNvcnJlY3QgdGhlIGltYWdlLCBhdm9pZGluZyB0aGUgYWxwaGEgY2hhbm5lbC4gIE1ha2Ugc3VyZQ0KKyAqIHlvdSBkbyB0aGlzIGFmdGVyIHlvdSBkZWFsIHdpdGggdGhlIHRyYW5zcGFyZW5jeSBpc3N1ZSBvbiBncmF5c2NhbGUNCisgKiBvciBSR0IgaW1hZ2VzLiBJZiB5b3VyIGJpdCBkZXB0aCBpcyA4LCB1c2UgZ2FtbWFfdGFibGUsIGlmIGl0DQorICogaXMgMTYsIHVzZSBnYW1tYV8xNl90YWJsZSBhbmQgZ2FtbWFfc2hpZnQuICBCdWlsZCB0aGVzZSB3aXRoDQorICogYnVpbGRfZ2FtbWFfdGFibGUoKS4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fZ2FtbWEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19jb25zdF9ieXRlcCBnYW1tYV90YWJsZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlOw0KKyAgIHBuZ19jb25zdF91aW50XzE2cHAgZ2FtbWFfMTZfdGFibGUgPSBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZTsNCisgICBpbnQgZ2FtbWFfc2hpZnQgPSBwbmdfcHRyLT5nYW1tYV9zaGlmdDsNCisNCisgICBwbmdfYnl0ZXAgc3A7DQorICAgcG5nX3VpbnRfMzIgaTsNCisgICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2dhbW1hIik7DQorDQorICAgaWYgKCgocm93X2luZm8tPmJpdF9kZXB0aCA8PSA4ICYmIGdhbW1hX3RhYmxlICE9IE5VTEwpIHx8DQorICAgICAgIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2ICYmIGdhbW1hXzE2X3RhYmxlICE9IE5VTEwpKSkNCisgICB7DQorICAgICAgc3dpdGNoIChyb3dfaW5mby0+Y29sb3JfdHlwZSkNCisgICAgICB7DQorICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisgICAgICAgICAgICAgICAgICBzcCsrOw0KKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07DQorICAgICAgICAgICAgICAgICAgc3ArKzsNCisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOw0KKyAgICAgICAgICAgICAgICAgIHNwKys7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7DQorDQorICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsNCisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgc3AgKz0gMjsNCisNCisgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOw0KKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICBzcCArPSAyOw0KKw0KKyAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07DQorICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgIHNwICs9IDI7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisgICAgICAgICAgICAgICAgICBzcCsrOw0KKw0KKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07DQorICAgICAgICAgICAgICAgICAgc3ArKzsNCisNCisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOw0KKyAgICAgICAgICAgICAgICAgIHNwKys7DQorDQorICAgICAgICAgICAgICAgICAgc3ArKzsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsNCisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgc3AgKz0gMjsNCisNCisgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOw0KKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICBzcCArPSAyOw0KKw0KKyAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07DQorICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICAgIHNwICs9IDQ7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07DQorICAgICAgICAgICAgICAgICAgc3AgKz0gMjsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsNCisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7DQorICAgICAgICAgICAgICAgICAgc3AgKz0gNDsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkgKz0gNCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaW50IGEgPSAqc3AgJiAweGMwOw0KKyAgICAgICAgICAgICAgICAgIGludCBiID0gKnNwICYgMHgzMDsNCisgICAgICAgICAgICAgICAgICBpbnQgYyA9ICpzcCAmIDB4MGM7DQorICAgICAgICAgICAgICAgICAgaW50IGQgPSAqc3AgJiAweDAzOw0KKw0KKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoDQorICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbYXwoYT4+Mil8KGE+PjQpfChhPj42KV0pICAgKSAmIDB4YzApfA0KKyAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KWdhbW1hX3RhYmxlWyhiPDwyKXxifChiPj4yKXwoYj4+NCldKT4+MikgJiAweDMwKXwNCisgICAgICAgICAgICAgICAgICAgICAgKCgoKGludClnYW1tYV90YWJsZVsoYzw8NCl8KGM8PDIpfGN8KGM+PjIpXSk+PjQpICYgMHgwYyl8DQorICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbKGQ8PDYpfChkPDw0KXwoZDw8Mil8ZF0pPj42KSApKTsNCisgICAgICAgICAgICAgICAgICBzcCsrOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gNCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSArPSAyKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpbnQgbXNiID0gKnNwICYgMHhmMDsNCisgICAgICAgICAgICAgICAgICBpbnQgbHNiID0gKnNwICYgMHgwZjsNCisNCisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCgoKGludClnYW1tYV90YWJsZVttc2IgfCAobXNiID4+IDQpXSkgJiAweGYwKQ0KKyAgICAgICAgICAgICAgICAgICAgICB8ICgoKGludClnYW1tYV90YWJsZVsobHNiIDw8IDQpIHwgbHNiXSkgPj4gNCkpOw0KKyAgICAgICAgICAgICAgICAgIHNwKys7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsNCisgICAgICAgICAgICAgICAgICBzcCsrOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOw0KKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICAgICAgICBzcCArPSAyOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEDQorLyogRW5jb2RlIHRoZSBhbHBoYSBjaGFubmVsIHRvIHRoZSBvdXRwdXQgZ2FtbWEgKHRoZSBpbnB1dCBjaGFubmVsIGlzIGFsd2F5cw0KKyAqIGxpbmVhci4pICBDYWxsZWQgb25seSB3aXRoIGNvbG9yIHR5cGVzIHRoYXQgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLiAgTmVlZHMgdGhlDQorICogZnJvbV8xIHRhYmxlcy4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fZW5jb2RlX2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZW5jb2RlX2FscGhhIik7DQorDQorICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpDQorICAgew0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIFBOR19DT05TVCBwbmdfYnl0ZXAgdGFibGUgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzE7DQorDQorICAgICAgICAgaWYgKHRhYmxlICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIFBOR19DT05TVCBpbnQgc3RlcCA9DQorICAgICAgICAgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpID8gNCA6IDI7DQorDQorICAgICAgICAgICAgLyogVGhlIGFscGhhIGNoYW5uZWwgaXMgdGhlIGxhc3QgY29tcG9uZW50OiAqLw0KKyAgICAgICAgICAgIHJvdyArPSBzdGVwIC0gMTsNCisNCisgICAgICAgICAgICBmb3IgKDsgcm93X3dpZHRoID4gMDsgLS1yb3dfd2lkdGgsIHJvdyArPSBzdGVwKQ0KKyAgICAgICAgICAgICAgICpyb3cgPSB0YWJsZVsqcm93XTsNCisNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgICAgIHsNCisgICAgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMTZwcCB0YWJsZSA9IHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMTsNCisgICAgICAgICBQTkdfQ09OU1QgaW50IGdhbW1hX3NoaWZ0ID0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQ7DQorDQorICAgICAgICAgaWYgKHRhYmxlICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIFBOR19DT05TVCBpbnQgc3RlcCA9DQorICAgICAgICAgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpID8gOCA6IDQ7DQorDQorICAgICAgICAgICAgLyogVGhlIGFscGhhIGNoYW5uZWwgaXMgdGhlIGxhc3QgY29tcG9uZW50OiAqLw0KKyAgICAgICAgICAgIHJvdyArPSBzdGVwIC0gMjsNCisNCisgICAgICAgICAgICBmb3IgKDsgcm93X3dpZHRoID4gMDsgLS1yb3dfd2lkdGgsIHJvdyArPSBzdGVwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2Ow0KKw0KKyAgICAgICAgICAgICAgIHYgPSB0YWJsZVsqKHJvdyArIDEpID4+IGdhbW1hX3NoaWZ0XVsqcm93XTsNCisgICAgICAgICAgICAgICAqcm93ID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICAgICoocm93ICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KKw0KKyAgIC8qIE9ubHkgZ2V0IHRvIGhlcmUgaWYgY2FsbGVkIHdpdGggYSB3ZWlyZCByb3dfaW5mbzsgbm8gaGFybSBoYXMgYmVlbiBkb25lLA0KKyAgICAqIHNvIGp1c3QgaXNzdWUgYSB3YXJuaW5nLg0KKyAgICAqLw0KKyAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJwbmdfZG9fZW5jb2RlX2FscGhhOiB1bmV4cGVjdGVkIGNhbGwiKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQNCisvKiBFeHBhbmRzIGEgcGFsZXR0ZSByb3cgdG8gYW4gUkdCIG9yIFJHQkEgcm93IGRlcGVuZGluZw0KKyAqIHVwb24gd2hldGhlciB5b3Ugc3VwcGx5IHRyYW5zIGFuZCBudW1fdHJhbnMuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX2V4cGFuZF9wYWxldHRlKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csDQorICAgcG5nX2NvbnN0X2NvbG9ycCBwYWxldHRlLCBwbmdfY29uc3RfYnl0ZXAgdHJhbnNfYWxwaGEsIGludCBudW1fdHJhbnMpDQorew0KKyAgIGludCBzaGlmdCwgdmFsdWU7DQorICAgcG5nX2J5dGVwIHNwLCBkcDsNCisgICBwbmdfdWludF8zMiBpOw0KKyAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZXhwYW5kX3BhbGV0dGUiKTsNCisNCisgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICB7DQorICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQ0KKyAgICAgIHsNCisgICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDMpOw0KKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICAgICBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsNCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIGlmICgoKnNwID4+IHNoaWZ0KSAmIDB4MDEpDQorICAgICAgICAgICAgICAgICAgICAgKmRwID0gMTsNCisNCisgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgKmRwID0gMDsNCisNCisgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNykNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgIHNwLS07DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICBzaGlmdCsrOw0KKw0KKyAgICAgICAgICAgICAgICAgIGRwLS07DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAyKTsNCisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7DQorICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7DQorICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsNCisgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdmFsdWU7DQorICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDYpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgICBzcC0tOw0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsNCisNCisgICAgICAgICAgICAgICAgICBkcC0tOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMSk7DQorICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOw0KKyAgICAgICAgICAgICAgIHNoaWZ0ID0gKGludCkoKHJvd193aWR0aCAmIDB4MDEpIDw8IDIpOw0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+IHNoaWZ0KSAmIDB4MGY7DQorICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXZhbHVlOw0KKyAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA0KQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgc3AtLTsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDQ7DQorDQorICAgICAgICAgICAgICAgICAgZHAtLTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKyAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4Ow0KKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDg7DQorICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKG51bV90cmFucyA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMikgLSAxOw0KKw0KKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaWYgKChpbnQpKCpzcCkgPj0gbnVtX3RyYW5zKQ0KKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsNCisNCisgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSB0cmFuc19hbHBoYVsqc3BdOw0KKw0KKyAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLmJsdWU7DQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uZ3JlZW47DQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0ucmVkOw0KKyAgICAgICAgICAgICAgICAgIHNwLS07DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4Ow0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOw0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7DQorICAgICAgICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSA2Ow0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOw0KKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCAqIDMpIC0gMTsNCisNCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLmJsdWU7DQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uZ3JlZW47DQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0ucmVkOw0KKyAgICAgICAgICAgICAgICAgIHNwLS07DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4Ow0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDI0Ow0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDM7DQorICAgICAgICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSAyOw0KKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KK30NCisNCisvKiBJZiB0aGUgYml0IGRlcHRoIDwgOCwgaXQgaXMgZXhwYW5kZWQgdG8gOC4gIEFsc28sIGlmIHRoZSBhbHJlYWR5DQorICogZXhwYW5kZWQgdHJhbnNwYXJlbmN5IHZhbHVlIGlzIHN1cHBsaWVkLCBhbiBhbHBoYSBjaGFubmVsIGlzIGJ1aWx0Lg0KKyAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb19leHBhbmQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywNCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCB0cmFuc19jb2xvcikNCit7DQorICAgaW50IHNoaWZ0LCB2YWx1ZTsNCisgICBwbmdfYnl0ZXAgc3AsIGRwOw0KKyAgIHBuZ191aW50XzMyIGk7DQorICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19leHBhbmQiKTsNCisNCisgICB7DQorICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpDQorICAgICAgew0KKyAgICAgICAgIHVuc2lnbmVkIGludCBncmF5ID0gdHJhbnNfY29sb3IgPyB0cmFuc19jb2xvci0+Z3JheSA6IDA7DQorDQorICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgZ3JheSA9IChncmF5ICYgMHgwMSkgKiAweGZmOw0KKyAgICAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAzKTsNCisgICAgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7DQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3IC0gKGludCkoKHJvd193aWR0aCArIDcpICYgMHgwNyk7DQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBpZiAoKCpzcCA+PiBzaGlmdCkgJiAweDAxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IDB4ZmY7DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IDA7DQorDQorICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDcpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBzcC0tOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQrKzsNCisNCisgICAgICAgICAgICAgICAgICAgICBkcC0tOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBncmF5ID0gKGdyYXkgJiAweDAzKSAqIDB4NTU7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOw0KKyAgICAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKCgzIC0gKChyb3dfd2lkdGggKyAzKSAmIDB4MDMpKSA8PCAxKTsNCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDAzOw0KKyAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkodmFsdWUgfCAodmFsdWUgPDwgMikgfCAodmFsdWUgPDwgNCkgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8PCA2KSk7DQorICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDYpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBzcC0tOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsNCisNCisgICAgICAgICAgICAgICAgICAgICBkcC0tOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBncmF5ID0gKGdyYXkgJiAweDBmKSAqIDB4MTE7DQorICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOw0KKyAgICAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKCgxIC0gKChyb3dfd2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsNCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDBmOw0KKyAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkodmFsdWUgfCAodmFsdWUgPDwgNCkpOw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA0KQ0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3AtLTsNCisgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsNCisNCisgICAgICAgICAgICAgICAgICAgICBkcC0tOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7DQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gODsNCisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGg7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGlmICh0cmFuc19jb2xvciAhPSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBncmF5ID0gZ3JheSAmIDB4ZmY7DQorICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOw0KKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCA8PCAxKSAtIDE7DQorDQorICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IGdyYXkpDQorICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOw0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7DQorDQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBncmF5X2hpZ2ggPSAoZ3JheSA+PiA4KSAmIDB4ZmY7DQorICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGdyYXlfbG93ID0gZ3JheSAmIDB4ZmY7DQorICAgICAgICAgICAgICAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXMgLSAxOw0KKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHJvd19pbmZvLT5yb3dieXRlcyA8PCAxKSAtIDE7DQorICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpZiAoKihzcCAtIDEpID09IGdyYXlfaGlnaCAmJiAqKHNwKSA9PSBncmF5X2xvdykNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7DQorICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOw0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOw0KKyAgICAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7DQorICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsNCisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5iaXRfZGVwdGggPDwgMSk7DQorICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwNCisgICAgICAgICAgICAgICByb3dfd2lkdGgpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICYmIHRyYW5zX2NvbG9yKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZSByZWQgPSAocG5nX2J5dGUpKHRyYW5zX2NvbG9yLT5yZWQgJiAweGZmKTsNCisgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9IChwbmdfYnl0ZSkodHJhbnNfY29sb3ItPmdyZWVuICYgMHhmZik7DQorICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZSA9IChwbmdfYnl0ZSkodHJhbnNfY29sb3ItPmJsdWUgJiAweGZmKTsNCisgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd19pbmZvLT5yb3dieXRlcyAtIDE7DQorICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDIpIC0gMTsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGlmICgqKHNwIC0gMikgPT0gcmVkICYmICooc3AgLSAxKSA9PSBncmVlbiAmJiAqKHNwKSA9PSBibHVlKQ0KKyAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsNCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOw0KKw0KKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07DQorICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsNCisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2J5dGUgcmVkX2hpZ2ggPSAocG5nX2J5dGUpKCh0cmFuc19jb2xvci0+cmVkID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgcG5nX2J5dGUgZ3JlZW5faGlnaCA9IChwbmdfYnl0ZSkoKHRyYW5zX2NvbG9yLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgIHBuZ19ieXRlIGJsdWVfaGlnaCA9IChwbmdfYnl0ZSkoKHRyYW5zX2NvbG9yLT5ibHVlID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgcG5nX2J5dGUgcmVkX2xvdyA9IChwbmdfYnl0ZSkodHJhbnNfY29sb3ItPnJlZCAmIDB4ZmYpOw0KKyAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuX2xvdyA9IChwbmdfYnl0ZSkodHJhbnNfY29sb3ItPmdyZWVuICYgMHhmZik7DQorICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZV9sb3cgPSAocG5nX2J5dGUpKHRyYW5zX2NvbG9yLT5ibHVlICYgMHhmZik7DQorICAgICAgICAgICAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXMgLSAxOw0KKyAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCA8PCAzKSAtIDE7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoKihzcCAtIDUpID09IHJlZF9oaWdoICYmDQorICAgICAgICAgICAgICAgICAgICooc3AgLSA0KSA9PSByZWRfbG93ICYmDQorICAgICAgICAgICAgICAgICAgICooc3AgLSAzKSA9PSBncmVlbl9oaWdoICYmDQorICAgICAgICAgICAgICAgICAgICooc3AgLSAyKSA9PSBncmVlbl9sb3cgJiYNCisgICAgICAgICAgICAgICAgICAgKihzcCAtIDEpID09IGJsdWVfaGlnaCAmJg0KKyAgICAgICAgICAgICAgICAgICAqKHNwICAgICkgPT0gYmx1ZV9sb3cpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsNCisgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOw0KKyAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsNCisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOw0KKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07DQorICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsNCisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOw0KKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsNCisgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0Ow0KKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmJpdF9kZXB0aCA8PCAyKTsNCisgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOw0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEDQorLyogSWYgdGhlIGJpdCBkZXB0aCBpcyA4IGFuZCB0aGUgY29sb3IgdHlwZSBpcyBub3QgYSBwYWxldHRlIHR5cGUgZXhwYW5kIHRoZQ0KKyAqIHdob2xlIHJvdyB0byAxNiBiaXRzLiAgSGFzIG5vIGVmZmVjdCBvdGhlcndpc2UuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX2V4cGFuZF8xNihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQ0KK3sNCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4ICYmDQorICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICB7DQorICAgICAgLyogVGhlIHJvdyBoYXZlIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgY29udGFpbmluZyBbMC4uMjU1XSBhbmQgd2UgbmVlZA0KKyAgICAgICAqIHRvIHR1cm4gaXQgaW50byBhbm90aGVyIHJvdyBjb250YWluaW5nIFswLi42NTUzNV0sIHRvIGRvIHRoaXMgd2UNCisgICAgICAgKiBjYWxjdWxhdGU6DQorICAgICAgICoNCisgICAgICAgKiAgKGlucHV0IC8gMjU1KSAqIDY1NTM1DQorICAgICAgICoNCisgICAgICAgKiAgV2hpY2ggaGFwcGVucyB0byBiZSBleGFjdGx5IGlucHV0ICogMjU3IGFuZCB0aGlzIGNhbiBiZSBhY2hpZXZlZA0KKyAgICAgICAqICBzaW1wbHkgYnkgYnl0ZSByZXBsaWNhdGlvbiBpbiBwbGFjZSAoY29weWluZyBiYWNrd2FyZHMpLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19ieXRlICpzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsgLyogc291cmNlLCBsYXN0IGJ5dGUgKyAxICovDQorICAgICAgcG5nX2J5dGUgKmRwID0gc3AgKyByb3dfaW5mby0+cm93Ynl0ZXM7ICAvKiBkZXN0aW5hdGlvbiwgZW5kICsgMSAqLw0KKyAgICAgIHdoaWxlIChkcCA+IHNwKQ0KKyAgICAgICAgIGRwWy0yXSA9IGRwWy0xXSA9ICotLXNwLCBkcCAtPSAyOw0KKw0KKyAgICAgIHJvd19pbmZvLT5yb3dieXRlcyAqPSAyOw0KKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSAxNjsNCisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqIDE2KTsNCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fcXVhbnRpemUocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywNCisgICAgcG5nX2NvbnN0X2J5dGVwIHBhbGV0dGVfbG9va3VwLCBwbmdfY29uc3RfYnl0ZXAgcXVhbnRpemVfbG9va3VwKQ0KK3sNCisgICBwbmdfYnl0ZXAgc3AsIGRwOw0KKyAgIHBuZ191aW50XzMyIGk7DQorICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19xdWFudGl6ZSIpOw0KKw0KKyAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgew0KKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYgcGFsZXR0ZV9sb29rdXApDQorICAgICAgew0KKyAgICAgICAgIGludCByLCBnLCBiLCBwOw0KKyAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgIGRwID0gcm93Ow0KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgciA9ICpzcCsrOw0KKyAgICAgICAgICAgIGcgPSAqc3ArKzsNCisgICAgICAgICAgICBiID0gKnNwKys7DQorDQorICAgICAgICAgICAgLyogVGhpcyBsb29rcyByZWFsIG1lc3N5LCBidXQgdGhlIGNvbXBpbGVyIHdpbGwgcmVkdWNlDQorICAgICAgICAgICAgICogaXQgZG93biB0byBhIHJlYXNvbmFibGUgZm9ybXVsYS4gIEZvciBleGFtcGxlLCB3aXRoDQorICAgICAgICAgICAgICogNSBiaXRzIHBlciBjb2xvciwgd2UgZ2V0Og0KKyAgICAgICAgICAgICAqIHAgPSAoKChyID4+IDMpICYgMHgxZikgPDwgMTApIHwNCisgICAgICAgICAgICAgKiAgICAoKChnID4+IDMpICYgMHgxZikgPDwgNSkgfA0KKyAgICAgICAgICAgICAqICAgICgoYiA+PiAzKSAmIDB4MWYpOw0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIHAgPSAoKChyID4+ICg4IC0gUE5HX1FVQU5USVpFX1JFRF9CSVRTKSkgJg0KKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX1JFRF9CSVRTKSAtIDEpKSA8PA0KKyAgICAgICAgICAgICAgICAoUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgKyBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgfA0KKyAgICAgICAgICAgICAgICAoKChnID4+ICg4IC0gUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpKSAmDQorICAgICAgICAgICAgICAgICgoMSA8PCBQTkdfUVVBTlRJWkVfR1JFRU5fQklUUykgLSAxKSkgPDwNCisgICAgICAgICAgICAgICAgKFBOR19RVUFOVElaRV9CTFVFX0JJVFMpKSB8DQorICAgICAgICAgICAgICAgICgoYiA+PiAoOCAtIFBOR19RVUFOVElaRV9CTFVFX0JJVFMpKSAmDQorICAgICAgICAgICAgICAgICgoMSA8PCBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSAtIDEpKTsNCisNCisgICAgICAgICAgICAqZHArKyA9IHBhbGV0dGVfbG9va3VwW3BdOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7DQorICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMTsNCisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSByb3dfaW5mby0+Yml0X2RlcHRoOw0KKyAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSAmJg0KKyAgICAgICAgIHBhbGV0dGVfbG9va3VwICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgIGludCByLCBnLCBiLCBwOw0KKyAgICAgICAgIHNwID0gcm93Ow0KKyAgICAgICAgIGRwID0gcm93Ow0KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgciA9ICpzcCsrOw0KKyAgICAgICAgICAgIGcgPSAqc3ArKzsNCisgICAgICAgICAgICBiID0gKnNwKys7DQorICAgICAgICAgICAgc3ArKzsNCisNCisgICAgICAgICAgICBwID0gKCgociA+PiAoOCAtIFBOR19RVUFOVElaRV9SRURfQklUUykpICYNCisgICAgICAgICAgICAgICAgKCgxIDw8IFBOR19RVUFOVElaRV9SRURfQklUUykgLSAxKSkgPDwNCisgICAgICAgICAgICAgICAgKFBOR19RVUFOVElaRV9HUkVFTl9CSVRTICsgUE5HX1FVQU5USVpFX0JMVUVfQklUUykpIHwNCisgICAgICAgICAgICAgICAgKCgoZyA+PiAoOCAtIFBOR19RVUFOVElaRV9HUkVFTl9CSVRTKSkgJg0KKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMpIC0gMSkpIDw8DQorICAgICAgICAgICAgICAgIChQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgfA0KKyAgICAgICAgICAgICAgICAoKGIgPj4gKDggLSBQTkdfUVVBTlRJWkVfQkxVRV9CSVRTKSkgJg0KKyAgICAgICAgICAgICAgICAoKDEgPDwgUE5HX1FVQU5USVpFX0JMVUVfQklUUykgLSAxKSk7DQorDQorICAgICAgICAgICAgKmRwKysgPSBwYWxldHRlX2xvb2t1cFtwXTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOw0KKyAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7DQorICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gcm93X2luZm8tPmJpdF9kZXB0aDsNCisgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmDQorICAgICAgICAgcXVhbnRpemVfbG9va3VwKQ0KKyAgICAgIHsNCisgICAgICAgICBzcCA9IHJvdzsNCisNCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwKyspDQorICAgICAgICAgew0KKyAgICAgICAgICAgICpzcCA9IHF1YW50aXplX2xvb2t1cFsqc3BdOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorLyogVW5kb2VzIGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nICAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb19yZWFkX2ludHJhcGl4ZWwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnRyYXBpeGVsIik7DQorDQorICAgaWYgKA0KKyAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpDQorICAgew0KKyAgICAgIGludCBieXRlc19wZXJfcGl4ZWw7DQorICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKw0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpDQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gMzsNCisNCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpDQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IGJ5dGVzX3Blcl9waXhlbCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgKihycCkgPSAocG5nX2J5dGUpKCgyNTYgKyAqcnAgKyAqKHJwICsgMSkpICYgMHhmZik7DQorICAgICAgICAgICAgKihycCsyKSA9IChwbmdfYnl0ZSkoKDI1NiArICoocnAgKyAyKSArICoocnAgKyAxKSkgJiAweGZmKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpDQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNjsNCisNCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpDQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IGJ5dGVzX3Blcl9waXhlbCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgczAgICA9ICgqKHJwICAgICkgPDwgOCkgfCAqKHJwICsgMSk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgczEgICA9ICgqKHJwICsgMikgPDwgOCkgfCAqKHJwICsgMyk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgczIgICA9ICgqKHJwICsgNCkgPDwgOCkgfCAqKHJwICsgNSk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcmVkICA9IChzMCArIHMxICsgNjU1MzYpICYgMHhmZmZmOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGJsdWUgPSAoczIgKyBzMSArIDY1NTM2KSAmIDB4ZmZmZjsNCisgICAgICAgICAgICAqKHJwICAgICkgPSAocG5nX2J5dGUpKChyZWQgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAqKHJwICsgMSkgPSAocG5nX2J5dGUpKHJlZCAmIDB4ZmYpOw0KKyAgICAgICAgICAgICoocnAgKyA0KSA9IChwbmdfYnl0ZSkoKGJsdWUgPj4gOCkgJiAweGZmKTsNCisgICAgICAgICAgICAqKHJwICsgNSkgPSAocG5nX2J5dGUpKGJsdWUgJiAweGZmKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgIH0NCit9DQorI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncnV0aWwuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncnV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTIzOTVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdydXRpbC5jCkBAIC0wLDAgKzEsNDQ3MyBAQAorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorLyogcG5ncnV0aWwuYyAtIHV0aWxpdGllcyB0byByZWFkIGEgUE5HIGZpbGUNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjMgW0p1bHkgMTgsIDIwMTNdDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKg0KKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFyZSBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbg0KKyAqIGxpYnBuZyBpdHNlbGYgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgcmVhZGluZyBhbiBpbWFnZS4NCisgKi8NCisNCisjaW5jbHVkZSAicG5ncHJpdi5oIg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCisNCitwbmdfdWludF8zMiBQTkdBUEkNCitwbmdfZ2V0X3VpbnRfMzEocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBidWYpDQorew0KKyAgIHBuZ191aW50XzMyIHV2YWwgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsNCisNCisgICBpZiAodXZhbCA+IFBOR19VSU5UXzMxX01BWCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBORyB1bnNpZ25lZCBpbnRlZ2VyIG91dCBvZiByYW5nZSIpOw0KKw0KKyAgIHJldHVybiAodXZhbCk7DQorfQ0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX2NIUk1fU1VQUE9SVEVEKQ0KKy8qIFRoZSBmb2xsb3dpbmcgaXMgYSB2YXJpYXRpb24gb24gdGhlIGFib3ZlIGZvciB1c2Ugd2l0aCB0aGUgZml4ZWQNCisgKiBwb2ludCB2YWx1ZXMgdXNlZCBmb3IgZ0FNQSBhbmQgY0hSTS4gIEluc3RlYWQgb2YgcG5nX2Vycm9yIGl0DQorICogaXNzdWVzIGEgd2FybmluZyBhbmQgcmV0dXJucyAoLTEpIC0gYW4gaW52YWxpZCB2YWx1ZSBiZWNhdXNlIGJvdGgNCisgKiBnQU1BIGFuZCBjSFJNIHVzZSAqdW5zaWduZWQqIGludGVnZXJzIGZvciBmaXhlZCBwb2ludCB2YWx1ZXMuDQorICovDQorI2RlZmluZSBQTkdfRklYRURfRVJST1IgKC0xKQ0KKw0KK3N0YXRpYyBwbmdfZml4ZWRfcG9pbnQgLyogUFJJVkFURSAqLw0KK3BuZ19nZXRfZml4ZWRfcG9pbnQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBidWYpDQorew0KKyAgIHBuZ191aW50XzMyIHV2YWwgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsNCisNCisgICBpZiAodXZhbCA8PSBQTkdfVUlOVF8zMV9NQVgpDQorICAgICAgcmV0dXJuIChwbmdfZml4ZWRfcG9pbnQpdXZhbDsgLyoga25vd24gdG8gYmUgaW4gcmFuZ2UgKi8NCisNCisgICAvKiBUaGUgY2FsbGVyIGNhbiB0dXJuIG9mZiB0aGUgd2FybmluZyBieSBwYXNzaW5nIE5VTEwuICovDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HIGZpeGVkIHBvaW50IGludGVnZXIgb3V0IG9mIHJhbmdlIik7DQorDQorICAgcmV0dXJuIFBOR19GSVhFRF9FUlJPUjsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVEDQorLyogTk9URTogdGhlIHJlYWQgbWFjcm9zIHdpbGwgb2JzY3VyZSB0aGVzZSBkZWZpbml0aW9ucywgc28gdGhhdCBpZg0KKyAqIFBOR19VU0VfUkVBRF9NQUNST1MgaXMgc2V0IHRoZSBsaWJyYXJ5IHdpbGwgbm90IHVzZSB0aGVtIGludGVybmFsbHksDQorICogYnV0IHRoZSBBUElzIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIGV4dGVybmFsbHkuDQorICoNCisgKiBUaGUgcGFyZW50aGVzZXMgYXJvdW5kICJQTkdBUEkgZnVuY3Rpb25fbmFtZSIgaW4gdGhlIGZvbGxvd2luZyB0aHJlZQ0KKyAqIGZ1bmN0aW9ucyBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhleSBhbGxvdyB0aGUgbWFjcm9zIHRvIGNvLWV4aXN0IHdpdGgNCisgKiB0aGVzZSAodW51c2VkIGJ1dCBleHBvcnRlZCkgZnVuY3Rpb25zLg0KKyAqLw0KKw0KKy8qIEdyYWIgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgZnJvbSBhIGJ1ZmZlciBpbiBiaWctZW5kaWFuIGZvcm1hdC4gKi8NCitwbmdfdWludF8zMiAoUE5HQVBJDQorcG5nX2dldF91aW50XzMyKShwbmdfY29uc3RfYnl0ZXAgYnVmKQ0KK3sNCisgICBwbmdfdWludF8zMiB1dmFsID0NCisgICAgICAgKChwbmdfdWludF8zMikoKihidWYgICAgKSkgPDwgMjQpICsNCisgICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAxKSkgPDwgMTYpICsNCisgICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAyKSkgPDwgIDgpICsNCisgICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAzKSkgICAgICApIDsNCisNCisgICByZXR1cm4gdXZhbDsNCit9DQorDQorLyogR3JhYiBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAgVGhlDQorICogZGF0YSBpcyBzdG9yZWQgaW4gdGhlIFBORyBmaWxlIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0IGFuZCB0aGVyZQ0KKyAqIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGEgJ3BuZ19pbnRfMzInIGlzIGV4YWN0bHkgMzIgYml0cywgdGhlcmVmb3JlDQorICogdGhlIGZvbGxvd2luZyBjb2RlIGRvZXMgYSB0d28ncyBjb21wbGVtZW50IHRvIG5hdGl2ZSBjb252ZXJzaW9uLg0KKyAqLw0KK3BuZ19pbnRfMzIgKFBOR0FQSQ0KK3BuZ19nZXRfaW50XzMyKShwbmdfY29uc3RfYnl0ZXAgYnVmKQ0KK3sNCisgICBwbmdfdWludF8zMiB1dmFsID0gcG5nX2dldF91aW50XzMyKGJ1Zik7DQorICAgaWYgKCh1dmFsICYgMHg4MDAwMDAwMCkgPT0gMCkgLyogbm9uLW5lZ2F0aXZlICovDQorICAgICAgcmV0dXJuIHV2YWw7DQorDQorICAgdXZhbCA9ICh1dmFsIF4gMHhmZmZmZmZmZikgKyAxOyAgLyogMidzIGNvbXBsZW1lbnQ6IC14ID0gfngrMSAqLw0KKyAgIHJldHVybiAtKHBuZ19pbnRfMzIpdXZhbDsNCit9DQorDQorLyogR3JhYiBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAqLw0KK3BuZ191aW50XzE2IChQTkdBUEkNCitwbmdfZ2V0X3VpbnRfMTYpKHBuZ19jb25zdF9ieXRlcCBidWYpDQorew0KKyAgIC8qIEFOU0ktQyByZXF1aXJlcyBhbiBpbnQgdmFsdWUgdG8gYWNjb21vZGF0ZSBhdCBsZWFzdCAxNiBiaXRzIHNvIHRoaXMNCisgICAgKiB3b3JrcyBhbmQgYWxsb3dzIHRoZSBjb21waWxlciBub3QgdG8gd29ycnkgYWJvdXQgcG9zc2libGUgbmFycm93aW5nDQorICAgICogb24gMzIgYml0IHN5c3RlbXMuICAoUHJlLUFOU0kgc3lzdGVtcyBkaWQgbm90IG1ha2UgaW50ZWdlcnMgc21hbGxlcg0KKyAgICAqIHRoYW4gMTYgYml0cyBlaXRoZXIuKQ0KKyAgICAqLw0KKyAgIHVuc2lnbmVkIGludCB2YWwgPQ0KKyAgICAgICAoKHVuc2lnbmVkIGludCkoKmJ1ZikgPDwgOCkgKw0KKyAgICAgICAoKHVuc2lnbmVkIGludCkoKihidWYgKyAxKSkpOw0KKw0KKyAgIHJldHVybiAocG5nX3VpbnRfMTYpdmFsOw0KK30NCisNCisjZW5kaWYgLyogUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQgKi8NCisNCisvKiBSZWFkIGFuZCBjaGVjayB0aGUgUE5HIGZpbGUgc2lnbmF0dXJlICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfc2lnKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBwbmdfc2l6ZV90IG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2s7DQorDQorICAgLyogRXhpdCBpZiB0aGUgdXNlciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBleHBlY3QgYSBzaWduYXR1cmUuICovDQorICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA+PSA4KQ0KKyAgICAgIHJldHVybjsNCisNCisgICBudW1fY2hlY2tlZCA9IHBuZ19wdHItPnNpZ19ieXRlczsNCisgICBudW1fdG9fY2hlY2sgPSA4IC0gbnVtX2NoZWNrZWQ7DQorDQorI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX1NJR05BVFVSRTsNCisjZW5kaWYNCisNCisgICAvKiBUaGUgc2lnbmF0dXJlIG11c3QgYmUgc2VyaWFsaXplZCBpbiBhIHNpbmdsZSBJL08gY2FsbC4gKi8NCisgICBwbmdfcmVhZF9kYXRhKHBuZ19wdHIsICYoaW5mb19wdHItPnNpZ25hdHVyZVtudW1fY2hlY2tlZF0pLCBudW1fdG9fY2hlY2spOw0KKyAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IDg7DQorDQorICAgaWYgKHBuZ19zaWdfY21wKGluZm9fcHRyLT5zaWduYXR1cmUsIG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2spKQ0KKyAgIHsNCisgICAgICBpZiAobnVtX2NoZWNrZWQgPCA0ICYmDQorICAgICAgICAgIHBuZ19zaWdfY21wKGluZm9fcHRyLT5zaWduYXR1cmUsIG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2sgLSA0KSkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBhIFBORyBmaWxlIik7DQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUE5HIGZpbGUgY29ycnVwdGVkIGJ5IEFTQ0lJIGNvbnZlcnNpb24iKTsNCisgICB9DQorICAgaWYgKG51bV9jaGVja2VkIDwgMykNCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BOR19TSUdOQVRVUkU7DQorfQ0KKw0KKy8qIFJlYWQgdGhlIGNodW5rIGhlYWRlciAobGVuZ3RoICsgdHlwZSBuYW1lKS4NCisgKiBQdXQgdGhlIHR5cGUgbmFtZSBpbnRvIHBuZ19wdHItPmNodW5rX25hbWUsIGFuZCByZXR1cm4gdGhlIGxlbmd0aC4NCisgKi8NCitwbmdfdWludF8zMiAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfY2h1bmtfaGVhZGVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfYnl0ZSBidWZbOF07DQorICAgcG5nX3VpbnRfMzIgbGVuZ3RoOw0KKw0KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVEDQorICAgcG5nX3B0ci0+aW9fc3RhdGUgPSBQTkdfSU9fUkVBRElORyB8IFBOR19JT19DSFVOS19IRFI7DQorI2VuZGlmDQorDQorICAgLyogUmVhZCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2h1bmsgbmFtZS4NCisgICAgKiBUaGlzIG11c3QgYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIEkvTyBjYWxsLg0KKyAgICAqLw0KKyAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgYnVmLCA4KTsNCisgICBsZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmKTsNCisNCisgICAvKiBQdXQgdGhlIGNodW5rIG5hbWUgaW50byBwbmdfcHRyLT5jaHVua19uYW1lLiAqLw0KKyAgIHBuZ19wdHItPmNodW5rX25hbWUgPSBQTkdfQ0hVTktfRlJPTV9TVFJJTkcoYnVmKzQpOw0KKw0KKyAgIHBuZ19kZWJ1ZzIoMCwgIlJlYWRpbmcgJWx4IGNodW5rLCBsZW5ndGggPSAlbHUiLA0KKyAgICAgICAodW5zaWduZWQgbG9uZylwbmdfcHRyLT5jaHVua19uYW1lLCAodW5zaWduZWQgbG9uZylsZW5ndGgpOw0KKw0KKyAgIC8qIFJlc2V0IHRoZSBjcmMgYW5kIHJ1biBpdCBvdmVyIHRoZSBjaHVuayBuYW1lLiAqLw0KKyAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7DQorICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgYnVmICsgNCwgNCk7DQorDQorICAgLyogQ2hlY2sgdG8gc2VlIGlmIGNodW5rIG5hbWUgaXMgdmFsaWQuICovDQorICAgcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7DQorDQorI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0RBVEE7DQorI2VuZGlmDQorDQorICAgcmV0dXJuIGxlbmd0aDsNCit9DQorDQorLyogUmVhZCBkYXRhLCBhbmQgKG9wdGlvbmFsbHkpIHJ1biBpdCB0aHJvdWdoIHRoZSBDUkMuICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2NyY19yZWFkKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmLCBwbmdfdWludF8zMiBsZW5ndGgpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgYnVmLCBsZW5ndGgpOw0KKyAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIGJ1ZiwgbGVuZ3RoKTsNCit9DQorDQorLyogT3B0aW9uYWxseSBza2lwIGRhdGEgYW5kIHRoZW4gY2hlY2sgdGhlIENSQy4gIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlDQorICogYXJlIHJlYWRpbmcgYW4gYW5jaWxsYXJ5IG9yIGNyaXRpY2FsIGNodW5rLCBhbmQgaG93IHRoZSBwcm9ncmFtIGhhcyBzZXQNCisgKiB0aGluZ3MgdXAsIHdlIG1heSBjYWxjdWxhdGUgdGhlIENSQyBvbiB0aGUgZGF0YSBhbmQgcHJpbnQgYSBtZXNzYWdlLg0KKyAqIFJldHVybnMgJzEnIGlmIHRoZXJlIHdhcyBhIENSQyBlcnJvciwgJzAnIG90aGVyd2lzZS4NCisgKi8NCitpbnQgLyogUFJJVkFURSAqLw0KK3BuZ19jcmNfZmluaXNoKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBza2lwKQ0KK3sNCisgICAvKiBUaGUgc2l6ZSBvZiB0aGUgbG9jYWwgYnVmZmVyIGZvciBpbmZsYXRlIGlzIGEgZ29vZCBndWVzcyBhcyB0byBhDQorICAgICogcmVhc29uYWJsZSBzaXplIHRvIHVzZSBmb3IgYnVmZmVyaW5nIHJlYWRzIGZyb20gdGhlIGFwcGxpY2F0aW9uLg0KKyAgICAqLw0KKyAgIHdoaWxlIChza2lwID4gMCkNCisgICB7DQorICAgICAgcG5nX3VpbnRfMzIgbGVuOw0KKyAgICAgIHBuZ19ieXRlIHRtcGJ1ZltQTkdfSU5GTEFURV9CVUZfU0laRV07DQorDQorICAgICAgbGVuID0gKHNpemVvZiB0bXBidWYpOw0KKyAgICAgIGlmIChsZW4gPiBza2lwKQ0KKyAgICAgICAgIGxlbiA9IHNraXA7DQorICAgICAgc2tpcCAtPSBsZW47DQorDQorICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHRtcGJ1ZiwgbGVuKTsNCisgICB9DQorDQorICAgaWYgKHBuZ19jcmNfZXJyb3IocG5nX3B0cikpDQorICAgew0KKyAgICAgIGlmIChQTkdfQ0hVTktfQU5DSUxMQVJZKHBuZ19wdHItPmNodW5rX25hbWUpID8NCisgICAgICAgICAgIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSA6DQorICAgICAgICAgIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UpKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCAiQ1JDIGVycm9yIik7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiQ1JDIGVycm9yIik7DQorICAgICAgICAgcmV0dXJuICgwKTsNCisgICAgICB9DQorDQorICAgICAgcmV0dXJuICgxKTsNCisgICB9DQorDQorICAgcmV0dXJuICgwKTsNCit9DQorDQorLyogQ29tcGFyZSB0aGUgQ1JDIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgd2l0aCB0aGF0IGNhbGN1bGF0ZWQgYnkgbGlicG5nIGZyb20NCisgKiB0aGUgZGF0YSBpdCBoYXMgcmVhZCB0aHVzIGZhci4NCisgKi8NCitpbnQgLyogUFJJVkFURSAqLw0KK3BuZ19jcmNfZXJyb3IocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19ieXRlIGNyY19ieXRlc1s0XTsNCisgICBwbmdfdWludF8zMiBjcmM7DQorICAgaW50IG5lZWRfY3JjID0gMTsNCisNCisgICBpZiAoUE5HX0NIVU5LX0FOQ0lMTEFSWShwbmdfcHRyLT5jaHVua19uYW1lKSkNCisgICB7DQorICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSykgPT0NCisgICAgICAgICAgKFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFIHwgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pKQ0KKyAgICAgICAgIG5lZWRfY3JjID0gMDsNCisgICB9DQorDQorICAgZWxzZSAvKiBjcml0aWNhbCAqLw0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFKQ0KKyAgICAgICAgIG5lZWRfY3JjID0gMDsNCisgICB9DQorDQorI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19SRUFESU5HIHwgUE5HX0lPX0NIVU5LX0NSQzsNCisjZW5kaWYNCisNCisgICAvKiBUaGUgY2h1bmsgQ1JDIG11c3QgYmUgc2VyaWFsaXplZCBpbiBhIHNpbmdsZSBJL08gY2FsbC4gKi8NCisgICBwbmdfcmVhZF9kYXRhKHBuZ19wdHIsIGNyY19ieXRlcywgNCk7DQorDQorICAgaWYgKG5lZWRfY3JjKQ0KKyAgIHsNCisgICAgICBjcmMgPSBwbmdfZ2V0X3VpbnRfMzIoY3JjX2J5dGVzKTsNCisgICAgICByZXR1cm4gKChpbnQpKGNyYyAhPSBwbmdfcHRyLT5jcmMpKTsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgICAgIHJldHVybiAoMCk7DQorfQ0KKw0KKy8qIE1hbmFnZSB0aGUgcmVhZCBidWZmZXI7IHRoaXMgc2ltcGx5IHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgaWYgaXQgaXMgbm90IHNtYWxsDQorICogZW5vdWdoIChvciBpZiBpdCBpcyBub3QgYWxsb2NhdGVkKS4gIFRoZSByb3V0aW5lIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZQ0KKyAqIGJ1ZmZlcjsgaWYgYW4gZXJyb3Igb2NjdXJzIGFuZCAnd2FybicgaXMgc2V0IHRoZSByb3V0aW5lIHJldHVybnMgTlVMTCwgZWxzZQ0KKyAqIGl0IHdpbGwgY2FsbCBwbmdfZXJyb3IgKHZpYSBwbmdfbWFsbG9jKSBvbiBmYWlsdXJlLiAgKHdhcm4gPT0gMiBtZWFucw0KKyAqICdzaWxlbnQnKS4NCisgKi8NCitzdGF0aWMgcG5nX2J5dGVwDQorcG5nX3JlYWRfYnVmZmVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYWxsb2Nfc2l6ZV90IG5ld19zaXplLCBpbnQgd2FybikNCit7DQorICAgcG5nX2J5dGVwIGJ1ZmZlciA9IHBuZ19wdHItPnJlYWRfYnVmZmVyOw0KKw0KKyAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiBuZXdfc2l6ZSA+IHBuZ19wdHItPnJlYWRfYnVmZmVyX3NpemUpDQorICAgew0KKyAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyID0gTlVMTDsNCisgICAgICBwbmdfcHRyLT5yZWFkX2J1ZmZlciA9IE5VTEw7DQorICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXJfc2l6ZSA9IDA7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgYnVmZmVyKTsNCisgICAgICBidWZmZXIgPSBOVUxMOw0KKyAgIH0NCisNCisgICBpZiAoYnVmZmVyID09IE5VTEwpDQorICAgew0KKyAgICAgIGJ1ZmZlciA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCBuZXdfc2l6ZSkpOw0KKw0KKyAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXIgPSBidWZmZXI7DQorICAgICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXJfc2l6ZSA9IG5ld19zaXplOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmICh3YXJuIDwgMikgLyogZWxzZSBzaWxlbnQgKi8NCisgICAgICB7DQorI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCisgICAgICAgICBpZiAod2FybikNCisgICAgICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgImluc3VmZmljaWVudCBtZW1vcnkgdG8gcmVhZCBjaHVuayIpOw0KKyAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICB7DQorI2lmZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRA0KKyAgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImluc3VmZmljaWVudCBtZW1vcnkgdG8gcmVhZCBjaHVuayIpOw0KKyNlbmRpZg0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KKw0KKyAgIHJldHVybiBidWZmZXI7DQorfQ0KKw0KKy8qIHBuZ19pbmZsYXRlX2NsYWltOiBjbGFpbSB0aGUgenN0cmVhbSBmb3Igc29tZSBuZWZhcmlvdXMgcHVycG9zZSB0aGF0IGludm9sdmVzDQorICogZGVjb21wcmVzc2lvbi4gIFJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBlbHNlIGEgemxpYiBlcnJvciBjb2RlLiAgSXQgY2hlY2tzDQorICogdGhlIG93bmVyIGJ1dCwgaW4gZmluYWwgcmVsZWFzZSBidWlsZHMsIGp1c3QgaXNzdWVzIGEgd2FybmluZyBpZiBzb21lIG90aGVyDQorICogY2h1bmsgYXBwYXJlbnRseSBvd25zIHRoZSBzdHJlYW0uICBQcmlvciB0byByZWxlYXNlIGl0IGRvZXMgYSBwbmdfZXJyb3IuDQorICovDQorc3RhdGljIGludA0KK3BuZ19pbmZsYXRlX2NsYWltKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBvd25lcikNCit7DQorICAgaWYgKHBuZ19wdHItPnpvd25lciAhPSAwKQ0KKyAgIHsNCisgICAgICBjaGFyIG1zZ1s2NF07DQorDQorICAgICAgUE5HX1NUUklOR19GUk9NX0NIVU5LKG1zZywgcG5nX3B0ci0+em93bmVyKTsNCisgICAgICAvKiBTbyB0aGUgbWVzc2FnZSB0aGF0IHJlc3VsdHMgaXMgIjxjaHVuaz4gdXNpbmcgenN0cmVhbSI7IHRoaXMgaXMgYW4NCisgICAgICAgKiBpbnRlcm5hbCBlcnJvciwgYnV0IGlzIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuICBpMThuIHJlcXVpcmVtZW50cw0KKyAgICAgICAqIGFyZSBtaW5pbWFsLg0KKyAgICAgICAqLw0KKyAgICAgICh2b2lkKXBuZ19zYWZlY2F0KG1zZywgKHNpemVvZiBtc2cpLCA0LCAiIHVzaW5nIHpzdHJlYW0iKTsNCisjICAgICBpZiBQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSA+PSBQTkdfTElCUE5HX0JVSUxEX1JDDQorICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsNCisgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOw0KKyMgICAgIGVsc2UNCisgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgbXNnKTsNCisjICAgICBlbmRpZg0KKyAgIH0NCisNCisgICAvKiBJbXBsZW1lbnRhdGlvbiBub3RlOiB1bmxpa2UgJ3BuZ19kZWZsYXRlX2NsYWltJyB0aGlzIGludGVybmFsIGZ1bmN0aW9uDQorICAgICogZG9lcyBub3QgdGFrZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcyBhbiBhcmd1bWVudC4gIFNvbWUgZWZmaWNpZW5jeSBjb3VsZA0KKyAgICAqIGJlIGdhaW5lZCBieSB1c2luZyB0aGlzIHdoZW4gaXQgaXMga25vd24gKmlmKiB0aGUgemxpYiBzdHJlYW0gaXRzZWxmIGRvZXMNCisgICAgKiBub3QgcmVjb3JkIHRoZSBudW1iZXI7IGhvd2V2ZXIsIHRoaXMgaXMgYW4gaWxsdXNpb246IHRoZSBvcmlnaW5hbCB3cml0ZXINCisgICAgKiBvZiB0aGUgUE5HIG1heSBoYXZlIHNlbGVjdGVkIGEgbG93ZXIgd2luZG93IHNpemUsIGFuZCB3ZSByZWFsbHkgbXVzdA0KKyAgICAqIGZvbGxvdyB0aGF0IGJlY2F1c2UsIGZvciBzeXN0ZW1zIHdpdGggd2l0aCBsaW1pdGVkIGNhcGFiaWxpdGllcywgd2UNCisgICAgKiB3b3VsZCBvdGhlcndpc2UgcmVqZWN0IHRoZSBhcHBsaWNhdGlvbidzIGF0dGVtcHRzIHRvIHVzZSBhIHNtYWxsZXIgd2luZG93DQorICAgICogc2l6ZSAoemxpYiBkb2Vzbid0IGhhdmUgYW4gaW50ZXJmYWNlIHRvIHNheSAidGhpcyBvciBsb3dlciIhKS4NCisgICAgKg0KKyAgICAqIGluZmxhdGVSZXNldDIgd2FzIGFkZGVkIHRvIHpsaWIgMS4yLjQ7IGJlZm9yZSB0aGlzIHRoZSB3aW5kb3cgY291bGQgbm90IGJlDQorICAgICogcmVzZXQsIHRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gYWx3YXlzIGFsbG9jYXRlIHRoZSBtYXhpbXVtIHdpbmRvdw0KKyAgICAqIHNpemUgd2l0aCBlYXJsaWVyIHpsaWJzIGp1c3QgaW4gY2FzZSBsYXRlciBjb21wcmVzc2VkIGNodW5rcyBuZWVkIGl0Lg0KKyAgICAqLw0KKyAgIHsNCisgICAgICBpbnQgcmV0OyAvKiB6bGliIHJldHVybiBjb2RlICovDQorIyAgICAgaWYgUE5HX1pMSUJfVkVSTlVNID49IDB4MTI0MA0KKw0KKyMgICAgICAgIGlmIGRlZmluZWQoUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVEKSAmJiBcDQorICAgICAgICAgICAgZGVmaW5lZChQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVykNCisgICAgICAgICAgICBpbnQgd2luZG93X2JpdHM7DQorDQorICAgICAgICAgICAgaWYgKCgocG5nX3B0ci0+b3B0aW9ucyA+PiBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVykgJiAzKSA9PQ0KKyAgICAgICAgICAgICAgIFBOR19PUFRJT05fT04pDQorICAgICAgICAgICAgICAgd2luZG93X2JpdHMgPSAxNTsNCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgd2luZG93X2JpdHMgPSAwOw0KKyMgICAgICAgIGVsc2UNCisjICAgICAgICAgICBkZWZpbmUgd2luZG93X2JpdHMgMA0KKyMgICAgICAgIGVuZGlmDQorIyAgICAgZW5kaWYNCisNCisgICAgICAvKiBTZXQgdGhpcyBmb3Igc2FmZXR5LCBqdXN0IGluIGNhc2UgdGhlIHByZXZpb3VzIG93bmVyIGxlZnQgcG9pbnRlcnMgdG8NCisgICAgICAgKiBtZW1vcnkgYWxsb2NhdGlvbnMuDQorICAgICAgICovDQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gTlVMTDsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gTlVMTDsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7DQorDQorICAgICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRCkNCisgICAgICB7DQorIyAgICAgICAgaWYgUE5HX1pMSUJfVkVSTlVNIDwgMHgxMjQwDQorICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsNCisjICAgICAgICBlbHNlDQorICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZVJlc2V0MigmcG5nX3B0ci0+enN0cmVhbSwgd2luZG93X2JpdHMpOw0KKyMgICAgICAgIGVuZGlmDQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorIyAgICAgICAgaWYgUE5HX1pMSUJfVkVSTlVNIDwgMHgxMjQwDQorICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZUluaXQoJnBuZ19wdHItPnpzdHJlYW0pOw0KKyMgICAgICAgIGVsc2UNCisgICAgICAgICAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnBuZ19wdHItPnpzdHJlYW0sIHdpbmRvd19iaXRzKTsNCisjICAgICAgICBlbmRpZg0KKw0KKyAgICAgICAgIGlmIChyZXQgPT0gWl9PSykNCisgICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aU1RSRUFNX0lOSVRJQUxJWkVEOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAocmV0ID09IFpfT0spDQorICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gb3duZXI7DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIHJldCk7DQorDQorICAgICAgcmV0dXJuIHJldDsNCisgICB9DQorDQorIyAgaWZkZWYgd2luZG93X2JpdHMNCisjICAgICB1bmRlZiB3aW5kb3dfYml0cw0KKyMgIGVuZGlmDQorfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVEDQorLyogcG5nX2luZmxhdGUgbm93IHJldHVybnMgemxpYiBlcnJvciBjb2RlcyBpbmNsdWRpbmcgWl9PSyBhbmQgWl9TVFJFQU1fRU5EIHRvDQorICogYWxsb3cgdGhlIGNhbGxlciB0byBkbyBtdWx0aXBsZSBjYWxscyBpZiByZXF1aXJlZC4gIElmIHRoZSAnZmluaXNoJyBmbGFnIGlzDQorICogc2V0IFpfRklOSVNIIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmaW5hbCBpbmZsYXRlKCkgY2FsbCBhbmQgWl9TVFJFQU1fRU5EIG11c3QNCisgKiBiZSByZXR1cm5lZCBvciB0aGVyZSBoYXMgYmVlbiBhIHByb2JsZW0sIG90aGVyd2lzZSBaX1NZTkNfRkxVU0ggaXMgdXNlZCBhbmQNCisgKiBaX09LIG9yIFpfU1RSRUFNX0VORCB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3MuDQorICoNCisgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBzaXplcyBhcmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsIGFtb3VudHMgb2YgZGF0YSBjb25zdW1lZA0KKyAqIG9yIHdyaXR0ZW4sIG5vdCB0aGUgYW1vdW50IGF2YWlsYWJsZSAoYXMgaW4gYSB6X3N0cmVhbSkuICBUaGUgZGF0YSBwb2ludGVycw0KKyAqIGFyZSBub3QgY2hhbmdlZCwgc28gdGhlIG5leHQgaW5wdXQgaXMgKGRhdGEraW5wdXRfc2l6ZSkgYW5kIHRoZSBuZXh0DQorICogYXZhaWxhYmxlIG91dHB1dCBpcyAob3V0cHV0K291dHB1dF9zaXplKS4NCisgKi8NCitzdGF0aWMgaW50DQorcG5nX2luZmxhdGUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIG93bmVyLCBpbnQgZmluaXNoLA0KKyAgICAvKiBJTlBVVDogKi8gcG5nX2NvbnN0X2J5dGVwIGlucHV0LCBwbmdfdWludF8zMnAgaW5wdXRfc2l6ZV9wdHIsDQorICAgIC8qIE9VVFBVVDogKi8gcG5nX2J5dGVwIG91dHB1dCwgcG5nX2FsbG9jX3NpemVfdCAqb3V0cHV0X3NpemVfcHRyKQ0KK3sNCisgICBpZiAocG5nX3B0ci0+em93bmVyID09IG93bmVyKSAvKiBFbHNlIG5vdCBjbGFpbWVkICovDQorICAgew0KKyAgICAgIGludCByZXQ7DQorICAgICAgcG5nX2FsbG9jX3NpemVfdCBhdmFpbF9vdXQgPSAqb3V0cHV0X3NpemVfcHRyOw0KKyAgICAgIHBuZ191aW50XzMyIGF2YWlsX2luID0gKmlucHV0X3NpemVfcHRyOw0KKw0KKyAgICAgIC8qIHpsaWIgY2FuJ3QgbmVjZXNzYXJpbHkgaGFuZGxlIG1vcmUgdGhhbiA2NTUzNSBieXRlcyBhdCBvbmNlIChpLmUuIGl0DQorICAgICAgICogY2FuJ3QgZXZlbiBuZWNlc3NhcmlseSBoYW5kbGUgNjU1MzYgYnl0ZXMpIGJlY2F1c2UgdGhlIHR5cGUgdUludCBpcw0KKyAgICAgICAqICIxNiBiaXRzIG9yIG1vcmUiLiAgQ29uc2VxdWVudGx5IGl0IGlzIG5lY2Vzc2FyeSB0byBjaHVuayB0aGUgaW5wdXQgdG8NCisgICAgICAgKiB6bGliLiAgVGhpcyBjb2RlIHVzZXMgWkxJQl9JT19NQVgsIGZyb20gcG5ncHJpdi5oLCBhcyB0aGUgbWF4aW11bSAodGhlDQorICAgICAgICogbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSB1SW50LikgIEl0IGlzIHBvc3NpYmxlIHRvIHNldA0KKyAgICAgICAqIFpMSUJfSU9fTUFYIHRvIGEgbG93ZXIgdmFsdWUgaW4gcG5ncHJpdi5oIGFuZCB0aGlzIG1heSBzb21ldGltZXMgaGF2ZQ0KKyAgICAgICAqIGEgcGVyZm9ybWFuY2UgYWR2YW50YWdlLCBiZWNhdXNlIGl0IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBkYXRhIGFjY2Vzc2VkDQorICAgICAgICogYXQgZWFjaCBzdGVwIGFuZCB0aGF0IG1heSBnaXZlIHRoZSBPUyBtb3JlIHRpbWUgdG8gcGFnZSBpdCBpbi4NCisgICAgICAgKi8NCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBQTkdaX0lOUFVUX0NBU1QoaW5wdXQpOw0KKyAgICAgIC8qIGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIHNldCBiZWxvdyBmcm9tICdzaXplJyAqLw0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOw0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsNCisNCisgICAgICAvKiBSZWFkIGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBpZiBpdCBpcyBhdmFpbGFibGUgKHRoaXMgaXMgc2V0IHRvDQorICAgICAgICogYSBsb2NhbCBidWZmZXIgYmVsb3cgaWYgb3V0cHV0IGlzIE5VTEwpLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChvdXRwdXQgIT0gTlVMTCkNCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gb3V0cHV0Ow0KKw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgIHVJbnQgYXZhaWw7DQorICAgICAgICAgQnl0ZSBsb2NhbF9idWZmZXJbUE5HX0lORkxBVEVfQlVGX1NJWkVdOw0KKw0KKyAgICAgICAgIC8qIHpsaWIgSU5QVVQgQlVGRkVSICovDQorICAgICAgICAgLyogVGhlIHNldHRpbmcgb2YgJ2F2YWlsX2luJyB1c2VkIHRvIGJlIG91dHNpZGUgdGhlIGxvb3A7IGJ5IHNldHRpbmcgaXQNCisgICAgICAgICAgKiBpbnNpZGUgaXQgaXMgcG9zc2libGUgdG8gY2h1bmsgdGhlIGlucHV0IHRvIHpsaWIgYW5kIHNpbXBseSByZWx5IG9uDQorICAgICAgICAgICogemxpYiB0byBhZHZhbmNlIHRoZSAnbmV4dF9pbicgcG9pbnRlci4gIFRoaXMgYWxsb3dzIGFyYml0cmFyeQ0KKyAgICAgICAgICAqIGFtb3VudHMgb2YgZGF0YSB0byBiZSBwYXNzZWQgdGhyb3VnaCB6bGliIGF0IHRoZSB1bmF2b2lkYWJsZSBjb3N0IG9mDQorICAgICAgICAgICogcmVxdWlyaW5nIGEgd2luZG93IHNhdmUgKG1lbWNweSBvZiB1cCB0byAzMjc2OCBvdXRwdXQgYnl0ZXMpDQorICAgICAgICAgICogZXZlcnkgWkxJQl9JT19NQVggaW5wdXQgYnl0ZXMuDQorICAgICAgICAgICovDQorICAgICAgICAgYXZhaWxfaW4gKz0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsgLyogbm90IGNvbnN1bWVkIGxhc3QgdGltZSAqLw0KKw0KKyAgICAgICAgIGF2YWlsID0gWkxJQl9JT19NQVg7DQorDQorICAgICAgICAgaWYgKGF2YWlsX2luIDwgYXZhaWwpDQorICAgICAgICAgICAgYXZhaWwgPSAodUludClhdmFpbF9pbjsgLyogc2FmZTogPCB0aGFuIFpMSUJfSU9fTUFYICovDQorDQorICAgICAgICAgYXZhaWxfaW4gLT0gYXZhaWw7DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IGF2YWlsOw0KKw0KKyAgICAgICAgIC8qIHpsaWIgT1VUUFVUIEJVRkZFUiAqLw0KKyAgICAgICAgIGF2YWlsX291dCArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsgLyogbm90IHdyaXR0ZW4gbGFzdCB0aW1lICovDQorDQorICAgICAgICAgYXZhaWwgPSBaTElCX0lPX01BWDsgLyogbWF4aW11bSB6bGliIGNhbiBwcm9jZXNzICovDQorDQorICAgICAgICAgaWYgKG91dHB1dCA9PSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBSZXNldCB0aGUgb3V0cHV0IGJ1ZmZlciBlYWNoIHRpbWUgcm91bmQgaWYgb3V0cHV0IGlzIE5VTEwgYW5kDQorICAgICAgICAgICAgICogbWFrZSBhdmFpbGFibGUgdGhlIGZ1bGwgYnVmZmVyLCB1cCB0byAncmVtYWluaW5nX3NwYWNlJw0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBsb2NhbF9idWZmZXI7DQorICAgICAgICAgICAgaWYgKChzaXplb2YgbG9jYWxfYnVmZmVyKSA8IGF2YWlsKQ0KKyAgICAgICAgICAgICAgIGF2YWlsID0gKHNpemVvZiBsb2NhbF9idWZmZXIpOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAoYXZhaWxfb3V0IDwgYXZhaWwpDQorICAgICAgICAgICAgYXZhaWwgPSAodUludClhdmFpbF9vdXQ7IC8qIHNhZmU6IDwgWkxJQl9JT19NQVggKi8NCisNCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IGF2YWlsOw0KKyAgICAgICAgIGF2YWlsX291dCAtPSBhdmFpbDsNCisNCisgICAgICAgICAvKiB6bGliIGluZmxhdGUgY2FsbCAqLw0KKyAgICAgICAgIC8qIEluIGZhY3QgJ2F2YWlsX291dCcgbWF5IGJlIDAgYXQgdGhpcyBwb2ludCwgdGhhdCBoYXBwZW5zIGF0IHRoZSBlbmQNCisgICAgICAgICAgKiBvZiB0aGUgcmVhZCB3aGVuIHRoZSBmaW5hbCBMWiBlbmQgY29kZSB3YXMgbm90IHBhc3NlZCBhdCB0aGUgZW5kIG9mDQorICAgICAgICAgICogdGhlIHByZXZpb3VzIGNodW5rIG9mIGlucHV0IGRhdGEuICBUZWxsIHpsaWIgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZQ0KKyAgICAgICAgICAqIGVuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4NCisgICAgICAgICAgKi8NCisgICAgICAgICByZXQgPSBpbmZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBhdmFpbF9vdXQgPiAwID8gWl9OT19GTFVTSCA6DQorICAgICAgICAgICAgKGZpbmlzaCA/IFpfRklOSVNIIDogWl9TWU5DX0ZMVVNIKSk7DQorICAgICAgfSB3aGlsZSAocmV0ID09IFpfT0spOw0KKw0KKyAgICAgIC8qIEZvciBzYWZldHkga2lsbCB0aGUgbG9jYWwgYnVmZmVyIHBvaW50ZXIgbm93ICovDQorICAgICAgaWYgKG91dHB1dCA9PSBOVUxMKQ0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBOVUxMOw0KKw0KKyAgICAgIC8qIENsYXcgYmFjayB0aGUgJ3NpemUnIGFuZCAncmVtYWluaW5nX3NwYWNlJyBieXRlIGNvdW50cy4gKi8NCisgICAgICBhdmFpbF9pbiArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luOw0KKyAgICAgIGF2YWlsX291dCArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsNCisNCisgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXM7IHRoZSB1cGRhdGVkIHZhbHVlcyBhcmUgdGhlIGFtb3VudA0KKyAgICAgICAqIGNvbnN1bWVkIG9yIHdyaXR0ZW4sIGVmZmVjdGl2ZWx5IHRoZSBpbnZlcnNlIG9mIHdoYXQgemxpYiB1c2VzLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChhdmFpbF9vdXQgPiAwKQ0KKyAgICAgICAgICpvdXRwdXRfc2l6ZV9wdHIgLT0gYXZhaWxfb3V0Ow0KKw0KKyAgICAgIGlmIChhdmFpbF9pbiA+IDApDQorICAgICAgICAgKmlucHV0X3NpemVfcHRyIC09IGF2YWlsX2luOw0KKw0KKyAgICAgIC8qIEVuc3VyZSBwbmdfcHRyLT56c3RyZWFtLm1zZyBpcyBzZXQgKGV2ZW4gaW4gdGhlIHN1Y2Nlc3MgY2FzZSEpICovDQorICAgICAgcG5nX3pzdHJlYW1fZXJyb3IocG5nX3B0ciwgcmV0KTsNCisgICAgICByZXR1cm4gcmV0Ow0KKyAgIH0NCisNCisgICBlbHNlDQorICAgew0KKyAgICAgIC8qIFRoaXMgaXMgYSBiYWQgaW50ZXJuYWwgZXJyb3IuICBUaGUgcmVjb3ZlcnkgYXNzaWducyB0byB0aGUgenN0cmVhbSBtc2cNCisgICAgICAgKiBwb2ludGVyLCB3aGljaCBpcyBub3Qgb3duZWQgYnkgdGhlIGNhbGxlciwgYnV0IHRoaXMgaXMgc2FmZTsgaXQncyBvbmx5DQorICAgICAgICogdXNlZCBvbiBlcnJvcnMhDQorICAgICAgICovDQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5tc2cgPSBQTkdaX01TR19DQVNUKCJ6c3RyZWFtIHVuY2xhaW1lZCIpOw0KKyAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsNCisgICB9DQorfQ0KKw0KKy8qDQorICogRGVjb21wcmVzcyB0cmFpbGluZyBkYXRhIGluIGEgY2h1bmsuICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHJlYWRfYnVmZmVyDQorICogcG9pbnRzIGF0IGFuIGFsbG9jYXRlZCBhcmVhIGhvbGRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgY2h1bmsgd2l0aCBhDQorICogdHJhaWxpbmcgY29tcHJlc3NlZCBwYXJ0LiAgV2hhdCB3ZSBnZXQgYmFjayBpcyBhbiBhbGxvY2F0ZWQgYXJlYQ0KKyAqIGhvbGRpbmcgdGhlIG9yaWdpbmFsIHByZWZpeCBwYXJ0IGFuZCBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUNCisgKiB0cmFpbGluZyBwYXJ0ICh0aGUgbWFsbG9jIGFyZWEgcGFzc2VkIGluIGlzIGZyZWVkKS4NCisgKi8NCitzdGF0aWMgaW50DQorcG5nX2RlY29tcHJlc3NfY2h1bmsocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX3VpbnRfMzIgY2h1bmtsZW5ndGgsIHBuZ191aW50XzMyIHByZWZpeF9zaXplLA0KKyAgIHBuZ19hbGxvY19zaXplX3QgKm5ld2xlbmd0aCAvKiBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHRoZSBtYXhpbXVtISAqLywNCisgICBpbnQgdGVybWluYXRlIC8qYWRkIGEgJ1wwJyB0byB0aGUgZW5kIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSovKQ0KK3sNCisgICAvKiBUT0RPOiBpbXBsZW1lbnQgZGlmZmVyZW50IGxpbWl0cyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGNodW5rLg0KKyAgICAqDQorICAgICogVGhlIGNhbGxlciBzdXBwbGllcyAqbmV3bGVuZ3RoIHNldCB0byB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlDQorICAgICogdW5jb21wcmVzc2VkIGRhdGEsIGJ1dCB0aGlzIHJvdXRpbmUgYWxsb2NhdGVzIHNwYWNlIGZvciB0aGUgcHJlZml4IGFuZA0KKyAgICAqIG1heWJlIGEgJ1wwJyB0ZXJtaW5hdG9yIHRvby4gIFdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgJ3ByZWZpeF9zaXplJyBpcw0KKyAgICAqIGxpbWl0ZWQgb25seSBieSB0aGUgbWF4aW11bSBjaHVuayBzaXplLg0KKyAgICAqLw0KKyAgIHBuZ19hbGxvY19zaXplX3QgbGltaXQgPSBQTkdfU0laRV9NQVg7DQorDQorIyAgaWZkZWYgUE5HX1NFVF9DSFVOS19NQUxMT0NfTElNSVRfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA+IDAgJiYNCisgICAgICAgICBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggPCBsaW1pdCkNCisgICAgICAgICBsaW1pdCA9IHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heDsNCisjICBlbGlmIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggPiAwDQorICAgICAgaWYgKFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggPCBsaW1pdCkNCisgICAgICAgICBsaW1pdCA9IFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVg7DQorIyAgZW5kaWYNCisNCisgICBpZiAobGltaXQgPj0gcHJlZml4X3NpemUgKyAodGVybWluYXRlICE9IDApKQ0KKyAgIHsNCisgICAgICBpbnQgcmV0Ow0KKw0KKyAgICAgIGxpbWl0IC09IHByZWZpeF9zaXplICsgKHRlcm1pbmF0ZSAhPSAwKTsNCisNCisgICAgICBpZiAobGltaXQgPCAqbmV3bGVuZ3RoKQ0KKyAgICAgICAgICpuZXdsZW5ndGggPSBsaW1pdDsNCisNCisgICAgICAvKiBOb3cgdHJ5IHRvIGNsYWltIHRoZSBzdHJlYW0uICovDQorICAgICAgcmV0ID0gcG5nX2luZmxhdGVfY2xhaW0ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7DQorDQorICAgICAgaWYgKHJldCA9PSBaX09LKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfdWludF8zMiBsenNpemUgPSBjaHVua2xlbmd0aCAtIHByZWZpeF9zaXplOw0KKw0KKyAgICAgICAgIHJldCA9IHBuZ19pbmZsYXRlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUsIDEvKmZpbmlzaCovLA0KKyAgICAgICAgICAgIC8qIGlucHV0OiAqLyBwbmdfcHRyLT5yZWFkX2J1ZmZlciArIHByZWZpeF9zaXplLCAmbHpzaXplLA0KKyAgICAgICAgICAgIC8qIG91dHB1dDogKi8gTlVMTCwgbmV3bGVuZ3RoKTsNCisNCisgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVXNlICdpbmZsYXRlUmVzZXQnIGhlcmUsIG5vdCAnaW5mbGF0ZVJlc2V0MicgYmVjYXVzZSB0aGlzDQorICAgICAgICAgICAgICogcHJlc2VydmVzIHRoZSBwcmV2aW91c2x5IGRlY2lkZWQgd2luZG93IHNpemUgKG90aGVyd2lzZSBpdCB3b3VsZA0KKyAgICAgICAgICAgICAqIGJlIG5lY2Vzc2FyeSB0byBzdG9yZSB0aGUgcHJldmlvdXMgd2luZG93IHNpemUuKSAgSW4gcHJhY3RpY2UNCisgICAgICAgICAgICAgKiB0aGlzIGRvZXNuJ3QgbWF0dGVyIGFueXdheSwgYmVjYXVzZSBwbmdfaW5mbGF0ZSB3aWxsIGNhbGwgaW5mbGF0ZQ0KKyAgICAgICAgICAgICAqIHdpdGggWl9GSU5JU0ggaW4gYWxtb3N0IGFsbCBjYXNlcywgc28gdGhlIHdpbmRvdyB3aWxsIG5vdCBiZQ0KKyAgICAgICAgICAgICAqIG1haW50YWluZWQuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSkgPT0gWl9PSykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogQmVjYXVzZSBvZiB0aGUgbGltaXQgY2hlY2tzIGFib3ZlIHdlIGtub3cgdGhhdCB0aGUgbmV3LA0KKyAgICAgICAgICAgICAgICAqIGV4cGFuZGVkLCBzaXplIHdpbGwgZml0IGluIGEgc2l6ZV90IChsZXQgYWxvbmUgYW4NCisgICAgICAgICAgICAgICAgKiBwbmdfYWxsb2Nfc2l6ZV90KS4gIFVzZSBwbmdfbWFsbG9jX2Jhc2UgaGVyZSB0byBhdm9pZCBhbg0KKyAgICAgICAgICAgICAgICAqIGV4dHJhIE9PTSBtZXNzYWdlLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgbmV3X3NpemUgPSAqbmV3bGVuZ3RoOw0KKyAgICAgICAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgYnVmZmVyX3NpemUgPSBwcmVmaXhfc2l6ZSArIG5ld19zaXplICsNCisgICAgICAgICAgICAgICAgICAodGVybWluYXRlICE9IDApOw0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCB0ZXh0ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgcG5nX21hbGxvY19iYXNlKHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUpKTsNCisNCisgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICByZXQgPSBwbmdfaW5mbGF0ZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lLCAxLypmaW5pc2gqLywNCisgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5yZWFkX2J1ZmZlciArIHByZWZpeF9zaXplLCAmbHpzaXplLA0KKyAgICAgICAgICAgICAgICAgICAgIHRleHQgKyBwcmVmaXhfc2l6ZSwgbmV3bGVuZ3RoKTsNCisNCisgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld19zaXplID09ICpuZXdsZW5ndGgpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hdGUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFtwcmVmaXhfc2l6ZSArICpuZXdsZW5ndGhdID0gMDsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4X3NpemUgPiAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZXh0LCBwbmdfcHRyLT5yZWFkX2J1ZmZlciwgcHJlZml4X3NpemUpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgb2xkX3B0ciA9IHBuZ19wdHItPnJlYWRfYnVmZmVyOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyID0gdGV4dDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5yZWFkX2J1ZmZlcl9zaXplID0gYnVmZmVyX3NpemU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9sZF9wdHI7IC8qIGZyZWVkIGJlbG93ICovDQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzaXplIGNoYW5nZWQgb24gdGhlIHNlY29uZCByZWFkLCB0aGVyZSBjYW4gYmUgbm8NCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBndWFyYW50ZWUgdGhhdCBhbnl0aGluZyBpcyBjb3JyZWN0IGF0IHRoaXMgcG9pbnQuDQorICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlICdtc2cnIHBvaW50ZXIgaGFzIGJlZW4gc2V0IHRvICJ1bmV4cGVjdGVkIGVuZCBvZg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIExaIHN0cmVhbSIsIHdoaWNoIGlzIGZpbmUsIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgdGhlIGNhbGxlciB3b24ndCBhY2NlcHQuDQorICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gUE5HX1VORVhQRUNURURfWkxJQl9SRVRVUk47DQorICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXQgPT0gWl9PSykNCisgICAgICAgICAgICAgICAgICAgICByZXQgPSBQTkdfVU5FWFBFQ1RFRF9aTElCX1JFVFVSTjsgLyogZm9yIHNhZmV0eSAqLw0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIHRleHQgcG9pbnRlciAodGhpcyBpcyB0aGUgb2xkIHJlYWRfYnVmZmVyIG9uDQorICAgICAgICAgICAgICAgICAgICogc3VjY2VzcykNCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0KTsNCisNCisgICAgICAgICAgICAgICAgICAvKiBUaGlzIHJlYWxseSBpcyB2ZXJ5IGJlbmlnbiwgYnV0IGl0J3Mgc3RpbGwgYW4gZXJyb3IgYmVjYXVzZQ0KKyAgICAgICAgICAgICAgICAgICAqIHRoZSBleHRyYSBzcGFjZSBtYXkgb3RoZXJ3aXNlIGJlIHVzZWQgYXMgYSBUcm9qYW4gSG9yc2UuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQgJiYNCisgICAgICAgICAgICAgICAgICAgICBjaHVua2xlbmd0aCAtIHByZWZpeF9zaXplICE9IGx6c2l6ZSkNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJleHRyYSBjb21wcmVzc2VkIGRhdGEiKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgdGhlIGJ1ZmZlciAqLw0KKyAgICAgICAgICAgICAgICAgIHJldCA9IFpfTUVNX0VSUk9SOw0KKyAgICAgICAgICAgICAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIFpfTUVNX0VSUk9SKTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogaW5mbGF0ZVJlc2V0IGZhaWxlZCwgc3RvcmUgdGhlIGVycm9yIG1lc3NhZ2UgKi8NCisgICAgICAgICAgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCByZXQpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQ0KKyAgICAgICAgICAgICAgICAgIHJldCA9IFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZSBpZiAocmV0ID09IFpfT0spDQorICAgICAgICAgICAgcmV0ID0gUE5HX1VORVhQRUNURURfWkxJQl9SRVRVUk47DQorDQorICAgICAgICAgLyogUmVsZWFzZSB0aGUgY2xhaW1lZCBzdHJlYW0gKi8NCisgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIC8qIHRoZSBjbGFpbSBmYWlsZWQgKi8gaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpIC8qIGltcG9zc2libGUhICovDQorICAgICAgICAgcmV0ID0gUE5HX1VORVhQRUNURURfWkxJQl9SRVRVUk47DQorDQorICAgICAgcmV0dXJuIHJldDsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgIHsNCisgICAgICAvKiBBcHBsaWNhdGlvbi9jb25maWd1cmF0aW9uIGxpbWl0cyBleGNlZWRlZCAqLw0KKyAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIFpfTUVNX0VSUk9SKTsNCisgICAgICByZXR1cm4gWl9NRU1fRVJST1I7DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfQ09NUFJFU1NFRF9URVhUX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRA0KKy8qIFBlcmZvcm0gYSBwYXJ0aWFsIHJlYWQgYW5kIGRlY29tcHJlc3MsIHByb2R1Y2luZyAnYXZhaWxfb3V0JyBieXRlcyBhbmQNCisgKiByZWFkaW5nIGZyb20gdGhlIGN1cnJlbnQgY2h1bmsgYXMgcmVxdWlyZWQuDQorICovDQorc3RhdGljIGludA0KK3BuZ19pbmZsYXRlX3JlYWQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCByZWFkX2J1ZmZlciwgdUludCByZWFkX3NpemUsDQorICAgcG5nX3VpbnRfMzJwIGNodW5rX2J5dGVzLCBwbmdfYnl0ZXAgbmV4dF9vdXQsIHBuZ19hbGxvY19zaXplX3QgKm91dF9zaXplLA0KKyAgIGludCBmaW5pc2gpDQorew0KKyAgIGlmIChwbmdfcHRyLT56b3duZXIgPT0gcG5nX3B0ci0+Y2h1bmtfbmFtZSkNCisgICB7DQorICAgICAgaW50IHJldDsNCisNCisgICAgICAvKiBuZXh0X2luIGFuZCBhdmFpbF9pbiBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyLiAqLw0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBuZXh0X291dDsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7IC8qIHNldCBpbiB0aGUgbG9vcCAqLw0KKw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID09IDApDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChyZWFkX3NpemUgPiAqY2h1bmtfYnl0ZXMpDQorICAgICAgICAgICAgICAgcmVhZF9zaXplID0gKHVJbnQpKmNodW5rX2J5dGVzOw0KKyAgICAgICAgICAgICpjaHVua19ieXRlcyAtPSByZWFkX3NpemU7DQorDQorICAgICAgICAgICAgaWYgKHJlYWRfc2l6ZSA+IDApDQorICAgICAgICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHJlYWRfYnVmZmVyLCByZWFkX3NpemUpOw0KKw0KKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IHJlYWRfYnVmZmVyOw0KKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSByZWFkX3NpemU7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICB1SW50IGF2YWlsID0gWkxJQl9JT19NQVg7DQorICAgICAgICAgICAgaWYgKGF2YWlsID4gKm91dF9zaXplKQ0KKyAgICAgICAgICAgICAgIGF2YWlsID0gKHVJbnQpKm91dF9zaXplOw0KKyAgICAgICAgICAgICpvdXRfc2l6ZSAtPSBhdmFpbDsNCisNCisgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IGF2YWlsOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBVc2UgWl9TWU5DX0ZMVVNIIHdoZW4gdGhlcmUgaXMgbm8gbW9yZSBjaHVuayBkYXRhIHRvIGVuc3VyZSB0aGF0IGFsbA0KKyAgICAgICAgICAqIHRoZSBhdmFpbGFibGUgb3V0cHV0IGlzIHByb2R1Y2VkOyB0aGlzIGFsbG93cyByZWFkaW5nIG9mIHRydW5jYXRlZA0KKyAgICAgICAgICAqIHN0cmVhbXMuDQorICAgICAgICAgICovDQorICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwNCisgICAgICAgICAgICAqY2h1bmtfYnl0ZXMgPiAwID8gWl9OT19GTFVTSCA6IChmaW5pc2ggPyBaX0ZJTklTSCA6IFpfU1lOQ19GTFVTSCkpOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocmV0ID09IFpfT0sgJiYgKCpvdXRfc2l6ZSA+IDAgfHwgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPiAwKSk7DQorDQorICAgICAgKm91dF9zaXplICs9IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0Ow0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsgLyogU2hvdWxkIG5vdCBiZSByZXF1aXJlZCwgYnV0IGlzIHNhZmUgKi8NCisNCisgICAgICAvKiBFbnN1cmUgdGhlIGVycm9yIG1lc3NhZ2UgcG9pbnRlciBpcyBhbHdheXMgc2V0OiAqLw0KKyAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIHJldCk7DQorICAgICAgcmV0dXJuIHJldDsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoInpzdHJlYW0gdW5jbGFpbWVkIik7DQorICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorLyogUmVhZCBhbmQgY2hlY2sgdGhlIElESFIgY2h1bmsgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX0lIRFIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2J5dGUgYnVmWzEzXTsNCisgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0Ow0KKyAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIGZpbHRlcl90eXBlOw0KKyAgIGludCBpbnRlcmxhY2VfdHlwZTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfSUhEUiIpOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOw0KKw0KKyAgIC8qIENoZWNrIHRoZSBsZW5ndGggKi8NCisgICBpZiAobGVuZ3RoICE9IDEzKQ0KKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKw0KKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSUhEUjsNCisNCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAxMyk7DQorICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7DQorDQorICAgd2lkdGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmKTsNCisgICBoZWlnaHQgPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmICsgNCk7DQorICAgYml0X2RlcHRoID0gYnVmWzhdOw0KKyAgIGNvbG9yX3R5cGUgPSBidWZbOV07DQorICAgY29tcHJlc3Npb25fdHlwZSA9IGJ1ZlsxMF07DQorICAgZmlsdGVyX3R5cGUgPSBidWZbMTFdOw0KKyAgIGludGVybGFjZV90eXBlID0gYnVmWzEyXTsNCisNCisgICAvKiBTZXQgaW50ZXJuYWwgdmFyaWFibGVzICovDQorICAgcG5nX3B0ci0+d2lkdGggPSB3aWR0aDsNCisgICBwbmdfcHRyLT5oZWlnaHQgPSBoZWlnaHQ7DQorICAgcG5nX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsNCisgICBwbmdfcHRyLT5pbnRlcmxhY2VkID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOw0KKyAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpY29sb3JfdHlwZTsNCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQNCisgICBwbmdfcHRyLT5maWx0ZXJfdHlwZSA9IChwbmdfYnl0ZSlmaWx0ZXJfdHlwZTsNCisjZW5kaWYNCisgICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7DQorDQorICAgLyogRmluZCBudW1iZXIgb2YgY2hhbm5lbHMgKi8NCisgICBzd2l0Y2ggKHBuZ19wdHItPmNvbG9yX3R5cGUpDQorICAgew0KKyAgICAgIGRlZmF1bHQ6IC8qIGludmFsaWQsIHBuZ19zZXRfSUhEUiBjYWxscyBwbmdfZXJyb3IgKi8NCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6DQorICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOg0KKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMTsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoNCisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDM7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOg0KKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMjsNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToNCisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDQ7DQorICAgICAgICAgYnJlYWs7DQorICAgfQ0KKw0KKyAgIC8qIFNldCB1cCBvdGhlciB1c2VmdWwgaW5mbyAqLw0KKyAgIHBuZ19wdHItPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShwbmdfcHRyLT5iaXRfZGVwdGggKg0KKyAgIHBuZ19wdHItPmNoYW5uZWxzKTsNCisgICBwbmdfcHRyLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwgcG5nX3B0ci0+d2lkdGgpOw0KKyAgIHBuZ19kZWJ1ZzEoMywgImJpdF9kZXB0aCA9ICVkIiwgcG5nX3B0ci0+Yml0X2RlcHRoKTsNCisgICBwbmdfZGVidWcxKDMsICJjaGFubmVscyA9ICVkIiwgcG5nX3B0ci0+Y2hhbm5lbHMpOw0KKyAgIHBuZ19kZWJ1ZzEoMywgInJvd2J5dGVzID0gJWx1IiwgKHVuc2lnbmVkIGxvbmcpcG5nX3B0ci0+cm93Ynl0ZXMpOw0KKyAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLA0KKyAgICAgICBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGUpOw0KK30NCisNCisvKiBSZWFkIGFuZCBjaGVjayB0aGUgcGFsZXR0ZSAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfUExURShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfY29sb3IgcGFsZXR0ZVtQTkdfTUFYX1BBTEVUVEVfTEVOR1RIXTsNCisgICBpbnQgbnVtLCBpOw0KKyNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQNCisgICBwbmdfY29sb3JwIHBhbF9wdHI7DQorI2VuZGlmDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX1BMVEUiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICAvKiBNb3ZlZCB0byBiZWZvcmUgdGhlICdhZnRlciBJREFUJyBjaGVjayBiZWxvdyBiZWNhdXNlIG90aGVyd2lzZSBkdXBsaWNhdGUNCisgICAgKiBQTFRFIGNodW5rcyBhcmUgcG90ZW50aWFsbHkgaWdub3JlZCAodGhlIHNwZWMgc2F5cyB0aGVyZSBzaGFsbCBub3QgYmUgbW9yZQ0KKyAgICAqIHRoYW4gb25lIFBMVEUsIHRoZSBlcnJvciBpcyBub3QgdHJlYXRlZCBhcyBiZW5pZ24sIHNvIHRoaXMgY2hlY2sgdHJ1bXBzDQorICAgICogdGhlIHJlcXVpcmVtZW50IHRoYXQgUExURSBhcHBlYXJzIGJlZm9yZSBJREFULikNCisgICAgKi8NCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOw0KKw0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQ0KKyAgIHsNCisgICAgICAvKiBUaGlzIGlzIGJlbmlnbiBiZWNhdXNlIHRoZSBub24tYmVuaWduIGVycm9yIGhhcHBlbmVkIGJlZm9yZSwgd2hlbiBhbg0KKyAgICAgICAqIElEQVQgd2FzIGVuY291bnRlcmVkIGluIGEgY29sb3ItbWFwcGVkIGltYWdlIHdpdGggbm8gUExURS4NCisgICAgICAgKi8NCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOw0KKw0KKyAgIGlmICghKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaWdub3JlZCBpbiBncmF5c2NhbGUgUE5HIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisjaWZuZGVmIFBOR19SRUFEX09QVF9QTFRFX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisjZW5kaWYNCisNCisgICBpZiAobGVuZ3RoID4gMypQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIHx8IGxlbmd0aCAlIDMpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorDQorICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogVGhlIGNhc3QgaXMgc2FmZSBiZWNhdXNlICdsZW5ndGgnIGlzIGxlc3MgdGhhbiAzKlBOR19NQVhfUEFMRVRURV9MRU5HVEggKi8NCisgICBudW0gPSAoaW50KWxlbmd0aCAvIDM7DQorDQorI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRA0KKyAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtOyBpKyssIHBhbF9wdHIrKykNCisgICB7DQorICAgICAgcG5nX2J5dGUgYnVmWzNdOw0KKw0KKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDMpOw0KKyAgICAgIHBhbF9wdHItPnJlZCA9IGJ1ZlswXTsNCisgICAgICBwYWxfcHRyLT5ncmVlbiA9IGJ1ZlsxXTsNCisgICAgICBwYWxfcHRyLT5ibHVlID0gYnVmWzJdOw0KKyAgIH0NCisjZWxzZQ0KKyAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykNCisgICB7DQorICAgICAgcG5nX2J5dGUgYnVmWzNdOw0KKw0KKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDMpOw0KKyAgICAgIC8qIERvbid0IGRlcGVuZCB1cG9uIHBuZ19jb2xvciBiZWluZyBhbnkgb3JkZXIgKi8NCisgICAgICBwYWxldHRlW2ldLnJlZCA9IGJ1ZlswXTsNCisgICAgICBwYWxldHRlW2ldLmdyZWVuID0gYnVmWzFdOw0KKyAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGJ1ZlsyXTsNCisgICB9DQorI2VuZGlmDQorDQorICAgLyogSWYgd2UgYWN0dWFsbHkgbmVlZCB0aGUgUExURSBjaHVuayAoaWUgZm9yIGEgcGFsZXR0ZWQgaW1hZ2UpLCB3ZSBkbw0KKyAgICAqIHdoYXRldmVyIHRoZSBub3JtYWwgQ1JDIGNvbmZpZ3VyYXRpb24gdGVsbHMgdXMuICBIb3dldmVyLCBpZiB3ZQ0KKyAgICAqIGhhdmUgYW4gUkdCIGltYWdlLCB0aGUgUExURSBjYW4gYmUgY29uc2lkZXJlZCBhbmNpbGxhcnksIHNvDQorICAgICogd2Ugd2lsbCBhY3QgYXMgdGhvdWdoIGl0IGlzLg0KKyAgICAqLw0KKyNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisjZW5kaWYNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7DQorICAgfQ0KKw0KKyNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVEDQorICAgZWxzZSBpZiAocG5nX2NyY19lcnJvcihwbmdfcHRyKSkgIC8qIE9ubHkgaWYgd2UgaGF2ZSBhIENSQyBlcnJvciAqLw0KKyAgIHsNCisgICAgICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgZGF0YSBmcm9tIGFuIGFuY2lsbGFyeSBjaHVuaywNCisgICAgICAgKiB3ZSBoYXZlIHR3byBvcHRpb25zOiBhbiBlcnJvciBhYm9ydCwgb3IgYSB3YXJuaW5nIGFuZCB3ZQ0KKyAgICAgICAqIGlnbm9yZSB0aGUgZGF0YSBpbiB0aGlzIGNodW5rICh3aGljaCBzaG91bGQgYmUgT0ssIHNpbmNlDQorICAgICAgICogaXQncyBjb25zaWRlcmVkIGFuY2lsbGFyeSBmb3IgYSBSR0Igb3IgUkdCQSBpbWFnZSkuDQorICAgICAgICoNCisgICAgICAgKiBJTVBMRU1FTlRBVElPTiBOT1RFOiB0aGlzIGlzIG9ubHkgaGVyZSBiZWNhdXNlIHBuZ19jcmNfZmluaXNoIHVzZXMgdGhlDQorICAgICAgICogY2h1bmsgdHlwZSB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjaGVjayB0aGUgYW5jaWxsYXJ5IG9yIHRoZSBjcml0aWNhbA0KKyAgICAgICAqIGZsYWdzLg0KKyAgICAgICAqLw0KKyAgICAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UpKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiQ1JDIGVycm9yIik7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2NodW5rX3dhcm5pbmcocG5nX3B0ciwgIkNSQyBlcnJvciIpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIE90aGVyd2lzZSwgd2UgKG9wdGlvbmFsbHkpIGVtaXQgYSB3YXJuaW5nIGFuZCB1c2UgdGhlIGNodW5rLiAqLw0KKyAgICAgIGVsc2UgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIC8qIFRPRE86IHBuZ19zZXRfUExURSBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIHNldHRpbmcgcG5nX3B0ci0+cGFsZXR0ZSB0byBpdHMNCisgICAgKiBvd24gY29weSBvZiB0aGUgcGFsZXR0ZS4gIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0IHdoZW4gcG5nX3N0YXJ0X3Jvdw0KKyAgICAqIGlzIGNhbGxlZCAodGhpcyBoYXBwZW5zIGFmdGVyIGFueSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKSB0aGUNCisgICAgKiBpbmZvX3B0ciBwYWxldHRlIGdldHMgY2hhbmdlZC4gIFRoaXMgaXMgZXh0cmVtZWx5IHVuZXhwZWN0ZWQgYW5kDQorICAgICogY29uZnVzaW5nLg0KKyAgICAqDQorICAgICogRml4IHRoaXMgYnkgbm90IHNoYXJpbmcgdGhlIHBhbGV0dGUgaW4gdGhpcyB3YXkuDQorICAgICovDQorICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLCBudW0pOw0KKw0KKyAgIC8qIFRoZSB0aHJlZSBjaHVua3MsIGJLR0QsIGhJU1QgYW5kIHRSTlMgKm11c3QqIGFwcGVhciBhZnRlciBQTFRFIGFuZCBiZWZvcmUNCisgICAgKiBJREFULiAgUHJpb3IgdG8gMS42LjAgdGhpcyB3YXMgbm90IGNoZWNrZWQ7IGluc3RlYWQgdGhlIGNvZGUgbWVyZWx5DQorICAgICogY2hlY2tlZCB0aGUgYXBwYXJlbnQgdmFsaWRpdHkgb2YgYSB0Uk5TIGNodW5rIGluc2VydGVkIGJlZm9yZSBQTFRFIG9uIGENCisgICAgKiBwYWxldHRlIFBORy4gIDEuNi4wIGF0dGVtcHRzIHRvIHJpZ29yb3VzbHkgZm9sbG93IHRoZSBzdGFuZGFyZCBhbmQNCisgICAgKiB0aGVyZWZvcmUgZG9lcyBhIGJlbmlnbiBlcnJvciBpZiB0aGUgZXJyb25lb3VzIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCAqYW5kKg0KKyAgICAqIGNhbmNlbHMgdGhlIHRSTlMgaWYgdGhlIGJlbmlnbiBlcnJvciByZXR1cm5zLiAgVGhlIGFsdGVybmF0aXZlIGlzIHRvDQorICAgICogYW1lbmQgdGhlIHN0YW5kYXJkIHNpbmNlIGl0IHdvdWxkIGJlIHJhdGhlciBoeXBvY3JpdGljYWwgb2YgdGhlIHN0YW5kYXJkcw0KKyAgICAqIG1haW50YWluZXJzIHRvIGlnbm9yZSBpdC4NCisgICAgKi8NCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zID4gMCB8fA0KKyAgICAgIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSAhPSAwKSkNCisgICB7DQorICAgICAgLyogQ2FuY2VsIHRoaXMgYmVjYXVzZSBvdGhlcndpc2UgaXQgd291bGQgYmUgdXNlZCBpZiB0aGUgdHJhbnNmb3Jtcw0KKyAgICAgICAqIHJlcXVpcmUgaXQuICBEb24ndCBjYW5jZWwgdGhlICd2YWxpZCcgZmxhZyBiZWNhdXNlIHRoaXMgd291bGQgcHJldmVudA0KKyAgICAgICAqIGRldGVjdGlvbiBvZiBkdXBsaWNhdGUgY2h1bmtzLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDA7DQorDQorICAgICAgaWYgKGluZm9fcHRyICE9IE5VTEwpDQorICAgICAgICAgaW5mb19wdHItPm51bV90cmFucyA9IDA7DQorDQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAidFJOUyBtdXN0IGJlIGFmdGVyIik7DQorICAgfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRA0KKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19oSVNUKSAhPSAwKQ0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImhJU1QgbXVzdCBiZSBhZnRlciIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRA0KKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19iS0dEKSAhPSAwKQ0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImJLR0QgbXVzdCBiZSBhZnRlciIpOw0KKyNlbmRpZg0KK30NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX0lFTkQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX0lFTkQiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgfHwgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsNCisNCisgICBwbmdfcHRyLT5tb2RlIHw9IChQTkdfQUZURVJfSURBVCB8IFBOR19IQVZFX0lFTkQpOw0KKw0KKyAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorDQorICAgaWYgKGxlbmd0aCAhPSAwKQ0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisNCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQ0KK30NCisNCisjaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX2dBTUEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2ZpeGVkX3BvaW50IGlnYW1tYTsNCisgICBwbmdfYnl0ZSBidWZbNF07DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2dBTUEiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgKFBOR19IQVZFX0lEQVR8UE5HX0hBVkVfUExURSkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAobGVuZ3RoICE9IDQpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgNCk7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZ2FtbWEgPSBwbmdfZ2V0X2ZpeGVkX3BvaW50KE5VTEwsIGJ1Zik7DQorDQorICAgcG5nX2NvbG9yc3BhY2Vfc2V0X2dhbW1hKHBuZ19wdHIsICZwbmdfcHRyLT5jb2xvcnNwYWNlLCBpZ2FtbWEpOw0KKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmMocG5nX3B0ciwgaW5mb19wdHIpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX3NCSVQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgdW5zaWduZWQgaW50IHRydWVsZW47DQorICAgcG5nX2J5dGUgYnVmWzRdOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zQklUIik7DQorDQorICAgYnVmWzBdID0gYnVmWzFdID0gYnVmWzJdID0gYnVmWzNdID0gMDsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgKFBOR19IQVZFX0lEQVR8UE5HX0hBVkVfUExURSkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgICAgIHRydWVsZW4gPSAzOw0KKw0KKyAgIGVsc2UNCisgICAgICB0cnVlbGVuID0gcG5nX3B0ci0+Y2hhbm5lbHM7DQorDQorICAgaWYgKGxlbmd0aCAhPSB0cnVlbGVuIHx8IGxlbmd0aCA+IDQpDQorICAgew0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgdHJ1ZWxlbik7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsNCisgICAgICBwbmdfcHRyLT5zaWdfYml0LmdyZWVuID0gYnVmWzFdOw0KKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuYmx1ZSA9IGJ1ZlsyXTsNCisgICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzNdOw0KKyAgIH0NCisNCisgICBlbHNlDQorICAgew0KKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuZ3JheSA9IGJ1ZlswXTsNCisgICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsNCisgICAgICBwbmdfcHRyLT5zaWdfYml0LmdyZWVuID0gYnVmWzBdOw0KKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuYmx1ZSA9IGJ1ZlswXTsNCisgICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzFdOw0KKyAgIH0NCisNCisgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICYocG5nX3B0ci0+c2lnX2JpdCkpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX2NIUk0ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2J5dGUgYnVmWzMyXTsNCisgICBwbmdfeHkgeHk7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2NIUk0iKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgKFBOR19IQVZFX0lEQVR8UE5HX0hBVkVfUExURSkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAobGVuZ3RoICE9IDMyKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDMyKTsNCisNCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHh5LndoaXRleCA9IHBuZ19nZXRfZml4ZWRfcG9pbnQoTlVMTCwgYnVmKTsNCisgICB4eS53aGl0ZXkgPSBwbmdfZ2V0X2ZpeGVkX3BvaW50KE5VTEwsIGJ1ZiArIDQpOw0KKyAgIHh5LnJlZHggICA9IHBuZ19nZXRfZml4ZWRfcG9pbnQoTlVMTCwgYnVmICsgOCk7DQorICAgeHkucmVkeSAgID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyAxMik7DQorICAgeHkuZ3JlZW54ID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyAxNik7DQorICAgeHkuZ3JlZW55ID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyAyMCk7DQorICAgeHkuYmx1ZXggID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyAyNCk7DQorICAgeHkuYmx1ZXkgID0gcG5nX2dldF9maXhlZF9wb2ludChOVUxMLCBidWYgKyAyOCk7DQorDQorICAgaWYgKHh5LndoaXRleCA9PSBQTkdfRklYRURfRVJST1IgfHwNCisgICAgICAgeHkud2hpdGV5ID09IFBOR19GSVhFRF9FUlJPUiB8fA0KKyAgICAgICB4eS5yZWR4ICAgPT0gUE5HX0ZJWEVEX0VSUk9SIHx8DQorICAgICAgIHh5LnJlZHkgICA9PSBQTkdfRklYRURfRVJST1IgfHwNCisgICAgICAgeHkuZ3JlZW54ID09IFBOR19GSVhFRF9FUlJPUiB8fA0KKyAgICAgICB4eS5ncmVlbnkgPT0gUE5HX0ZJWEVEX0VSUk9SIHx8DQorICAgICAgIHh5LmJsdWV4ICA9PSBQTkdfRklYRURfRVJST1IgfHwNCisgICAgICAgeHkuYmx1ZXkgID09IFBOR19GSVhFRF9FUlJPUikNCisgICB7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCB2YWx1ZXMiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIC8qIElmIGEgY29sb3JzcGFjZSBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIG91dHB1dCBza2lwIHRoaXMgY2h1bmsgKi8NCisgICBpZiAocG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfRlJPTV9jSFJNKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7DQorICAgICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0ZST01fY0hSTTsNCisgICAodm9pZClwbmdfY29sb3JzcGFjZV9zZXRfY2hyb21hdGljaXRpZXMocG5nX3B0ciwgJnBuZ19wdHItPmNvbG9yc3BhY2UsICZ4eSwNCisgICAgICAxLypwcmVmZXIgY0hSTSB2YWx1ZXMqLyk7DQorICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfc1JHQihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfYnl0ZSBpbnRlbnQ7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3NSR0IiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgKFBOR19IQVZFX0lEQVR8UE5HX0hBVkVfUExURSkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAobGVuZ3RoICE9IDEpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsICZpbnRlbnQsIDEpOw0KKw0KKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkNCisgICAgICByZXR1cm47DQorDQorICAgLyogSWYgYSBjb2xvcnNwYWNlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gb3V0cHV0IHNraXAgdGhpcyBjaHVuayAqLw0KKyAgIGlmIChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkNCisgICAgICByZXR1cm47DQorDQorICAgLyogT25seSBvbmUgc1JHQiBvciBpQ0NQIGNodW5rIGlzIGFsbG93ZWQsIHVzZSB0aGUgSEFWRV9JTlRFTlQgZmxhZyB0byBkZXRlY3QNCisgICAgKiB0aGlzLg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSEFWRV9JTlRFTlQpDQorICAgew0KKyAgICAgIHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgfD0gUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsNCisgICAgICBwbmdfY29sb3JzcGFjZV9zeW5jKHBuZ19wdHIsIGluZm9fcHRyKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ0b28gbWFueSBwcm9maWxlcyIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgKHZvaWQpcG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0IocG5nX3B0ciwgJnBuZ19wdHItPmNvbG9yc3BhY2UsIGludGVudCk7DQorICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7DQorfQ0KKyNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfaUNDUChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KKy8qIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIHByb2ZpbGVzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLw0KK3sNCisgICBwbmdfY29uc3RfY2hhcnAgZXJybXNnID0gTlVMTDsgLyogZXJyb3IgbWVzc2FnZSBvdXRwdXQsIG9yIG5vIGVycm9yICovDQorICAgaW50IGZpbmlzaGVkID0gMDsgLyogY3JjIGNoZWNrZWQgKi8NCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfaUNDUCIpOw0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOw0KKw0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiAoUE5HX0hBVkVfSURBVHxQTkdfSEFWRV9QTFRFKSkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIC8qIENvbnNpc3RlbnQgd2l0aCBhbGwgdGhlIGFib3ZlIGNvbG9yc3BhY2UgaGFuZGxpbmcgYW4gb2J2aW91c2x5ICppbnZhbGlkKg0KKyAgICAqIGNodW5rIGlzIGp1c3QgaWdub3JlZCwgc28gZG9lcyBub3QgaW52YWxpZGF0ZSB0aGUgY29sb3Igc3BhY2UuICBBbg0KKyAgICAqIGFsdGVybmF0aXZlIGlzIHRvIHNldCB0aGUgJ2ludmFsaWQnIGZsYWdzIGF0IHRoZSBzdGFydCBvZiB0aGlzIHJvdXRpbmUNCisgICAgKiBhbmQgb25seSBjbGVhciB0aGVtIGluIHRoZXkgd2VyZSBub3Qgc2V0IGJlZm9yZSBhbmQgYWxsIHRoZSB0ZXN0cyBwYXNzLg0KKyAgICAqIFRoZSBtaW5pbXVtICdkZWZsYXRlJyBzdHJlYW0gaXMgYXNzdW1lZCB0byBiZSBqdXN0IHRoZSAyIGJ5dGUgaGVhZGVyIGFuZCA0DQorICAgICogYnl0ZSBjaGVja3N1bS4gIFRoZSBrZXl3b3JkIG11c3QgYmUgb25lIGNoYXJhY3RlciBhbmQgdGhlcmUgaXMgYQ0KKyAgICAqIHRlcm1pbmF0b3IgKDApIGJ5dGUgYW5kIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuDQorICAgICovDQorICAgaWYgKGxlbmd0aCA8IDkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAidG9vIHNob3J0Iik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICAvKiBJZiBhIGNvbG9yc3BhY2UgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiBvdXRwdXQgc2tpcCB0aGlzIGNodW5rICovDQorICAgaWYgKHBuZ19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogT25seSBvbmUgc1JHQiBvciBpQ0NQIGNodW5rIGlzIGFsbG93ZWQsIHVzZSB0aGUgSEFWRV9JTlRFTlQgZmxhZyB0byBkZXRlY3QNCisgICAgKiB0aGlzLg0KKyAgICAqLw0KKyAgIGlmICgocG5nX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0hBVkVfSU5URU5UKSA9PSAwKQ0KKyAgIHsNCisgICAgICB1SW50IHJlYWRfbGVuZ3RoLCBrZXl3b3JkX2xlbmd0aDsNCisgICAgICBjaGFyIGtleXdvcmRbODFdOw0KKw0KKyAgICAgIC8qIEZpbmQgdGhlIGtleXdvcmQ7IHRoZSBrZXl3b3JkIHBsdXMgc2VwYXJhdG9yIGFuZCBjb21wcmVzc2lvbiBtZXRob2QNCisgICAgICAgKiBieXRlcyBjYW4gYmUgYXQgbW9zdCA4MSBjaGFyYWN0ZXJzIGxvbmcuDQorICAgICAgICovDQorICAgICAgcmVhZF9sZW5ndGggPSA4MTsgLyogbWF4aW11bSAqLw0KKyAgICAgIGlmIChyZWFkX2xlbmd0aCA+IGxlbmd0aCkNCisgICAgICAgICByZWFkX2xlbmd0aCA9ICh1SW50KWxlbmd0aDsNCisNCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClrZXl3b3JkLCByZWFkX2xlbmd0aCk7DQorICAgICAgbGVuZ3RoIC09IHJlYWRfbGVuZ3RoOw0KKw0KKyAgICAgIGtleXdvcmRfbGVuZ3RoID0gMDsNCisgICAgICB3aGlsZSAoa2V5d29yZF9sZW5ndGggPCA4MCAmJiBrZXl3b3JkX2xlbmd0aCA8IHJlYWRfbGVuZ3RoICYmDQorICAgICAgICAga2V5d29yZFtrZXl3b3JkX2xlbmd0aF0gIT0gMCkNCisgICAgICAgICArK2tleXdvcmRfbGVuZ3RoOw0KKw0KKyAgICAgIC8qIFRPRE86IG1ha2UgdGhlIGtleXdvcmQgY2hlY2tpbmcgY29tbW9uICovDQorICAgICAgaWYgKGtleXdvcmRfbGVuZ3RoID49IDEgJiYga2V5d29yZF9sZW5ndGggPD0gNzkpDQorICAgICAgew0KKyAgICAgICAgIC8qIFdlIG9ubHkgdW5kZXJzdGFuZCAnMCcgY29tcHJlc3Npb24gLSBkZWZsYXRlIC0gc28gaWYgd2UgZ2V0IGENCisgICAgICAgICAgKiBkaWZmZXJlbnQgdmFsdWUgd2UgY2FuJ3Qgc2FmZWx5IGRlY29kZSB0aGUgY2h1bmsuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKGtleXdvcmRfbGVuZ3RoKzEgPCByZWFkX2xlbmd0aCAmJg0KKyAgICAgICAgICAgIGtleXdvcmRba2V5d29yZF9sZW5ndGgrMV0gPT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcmVhZF9sZW5ndGggLT0ga2V5d29yZF9sZW5ndGgrMjsNCisNCisgICAgICAgICAgICBpZiAocG5nX2luZmxhdGVfY2xhaW0ocG5nX3B0ciwgcG5nX2lDQ1ApID09IFpfT0spDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIEJ5dGUgcHJvZmlsZV9oZWFkZXJbMTMyXTsNCisgICAgICAgICAgICAgICBCeXRlIGxvY2FsX2J1ZmZlcltQTkdfSU5GTEFURV9CVUZfU0laRV07DQorICAgICAgICAgICAgICAgcG5nX2FsbG9jX3NpemVfdCBzaXplID0gKHNpemVvZiBwcm9maWxlX2hlYWRlcik7DQorDQorICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilrZXl3b3JkICsgKGtleXdvcmRfbGVuZ3RoKzIpOw0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSByZWFkX2xlbmd0aDsNCisgICAgICAgICAgICAgICAodm9pZClwbmdfaW5mbGF0ZV9yZWFkKHBuZ19wdHIsIGxvY2FsX2J1ZmZlciwNCisgICAgICAgICAgICAgICAgICAoc2l6ZW9mIGxvY2FsX2J1ZmZlciksICZsZW5ndGgsIHByb2ZpbGVfaGVhZGVyLCAmc2l6ZSwNCisgICAgICAgICAgICAgICAgICAwLypmaW5pc2g6IGRvbid0LCBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgdG9vIHNtYWxsKi8pOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChzaXplID09IDApDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgdGhlIElDQyBwcm9maWxlIGhlYWRlcjsgZG8gdGhlIGJhc2ljIGhlYWRlciBjaGVja3MuDQorICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGggPQ0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ19nZXRfdWludF8zMihwcm9maWxlX2hlYWRlcik7DQorDQorICAgICAgICAgICAgICAgICAgaWYgKHBuZ19pY2NfY2hlY2tfbGVuZ3RoKHBuZ19wdHIsICZwbmdfcHRyLT5jb2xvcnNwYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIHByb2ZpbGVfbGVuZ3RoKSkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGxlbmd0aCBpcyBhcHBhcmVudGx5IG9rLCBzbyB3ZSBjYW4gY2hlY2sgdGhlIDEzMg0KKyAgICAgICAgICAgICAgICAgICAgICAqIGJ5dGUgaGVhZGVyLg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChwbmdfaWNjX2NoZWNrX2hlYWRlcihwbmdfcHRyLCAmcG5nX3B0ci0+Y29sb3JzcGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBwcm9maWxlX2xlbmd0aCwgcHJvZmlsZV9oZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSkpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyByZWFkIHRoZSB0YWcgdGFibGU7IGEgdmFyaWFibGUgc2l6ZSBidWZmZXIgaXMNCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZWVkZWQgYXQgdGhpcyBwb2ludCwgYWxsb2NhdGUgb25lIGZvciB0aGUgd2hvbGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9maWxlLiAgVGhlIGhlYWRlciBjaGVjayBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IG5vbmUgb2YgdGhlc2Ugc3R1ZmYgd2lsbCBvdmVyZmxvdy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiB0YWdfY291bnQgPSBwbmdfZ2V0X3VpbnRfMzIoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9oZWFkZXIrMTI4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgcHJvZmlsZSA9IHBuZ19yZWFkX2J1ZmZlcihwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfbGVuZ3RoLCAyLypzaWxlbnQqLyk7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHByb2ZpbGUsIHByb2ZpbGVfaGVhZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YgcHJvZmlsZV9oZWFkZXIpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTIgKiB0YWdfY291bnQ7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcG5nX2luZmxhdGVfcmVhZChwbmdfcHRyLCBsb2NhbF9idWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiBsb2NhbF9idWZmZXIpLCAmbGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgKyAoc2l6ZW9mIHByb2ZpbGVfaGVhZGVyKSwgJnNpemUsIDApOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0aWxsIGV4cGVjdCBhIGEgYnVmZmVyIGVycm9yIGJlY2F1c2Ugd2UgZXhwZWN0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlcmUgdG8gYmUgc29tZSB0YWcgZGF0YSENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG5nX2ljY19jaGVja190YWdfdGFibGUocG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG5nX3B0ci0+Y29sb3JzcGFjZSwga2V5d29yZCwgcHJvZmlsZV9sZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBwcm9maWxlIGhhcyBiZWVuIHZhbGlkYXRlZCBmb3IgYmFzaWMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZWN1cml0eSBpc3N1ZXMsIHNvIHJlYWQgdGhlIHdob2xlIHRoaW5nIGluLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBwcm9maWxlX2xlbmd0aCAtIChzaXplb2YgcHJvZmlsZV9oZWFkZXIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMiAqIHRhZ19jb3VudDsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwbmdfaW5mbGF0ZV9yZWFkKHBuZ19wdHIsIGxvY2FsX2J1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mIGxvY2FsX2J1ZmZlciksICZsZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSArIChzaXplb2YgcHJvZmlsZV9oZWFkZXIpICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiAqIHRhZ19jb3VudCwgJnNpemUsIDEvKmZpbmlzaCovKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiAhKHBuZ19wdHItPmZsYWdzICYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4pKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9ICJleHRyYSBjb21wcmVzc2VkIGRhdGEiOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1dCBvdGhlcndpc2UgYWxsb3cgZXh0cmEgZGF0YTogKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNhbiBiZSBoYW5kbGVkIGNvbXBsZXRlbHksIHNvDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoga2VlcCBnb2luZy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYSBjb21wcmVzc2VkIGRhdGEiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IDE7DQorDQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVEDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGEgbWF0Y2ggYWdhaW5zdCBzUkdCICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2ljY19zZXRfc1JHQihwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbmdfcHRyLT5jb2xvcnNwYWNlLCBwcm9maWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYWRsZXIpOw0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmDQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlYWwgdGhlIHByb2ZpbGUgZm9yIGluZm9fcHRyLiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GUkVFX0lDQ1AsIDApOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX25hbWUgPSBwbmdfdm9pZGNhc3QoY2hhciosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX21hbGxvY19iYXNlKHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZF9sZW5ndGgrMSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvX3B0ci0+aWNjcF9uYW1lICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpbmZvX3B0ci0+aWNjcF9uYW1lLCBrZXl3b3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRfbGVuZ3RoKzEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZsZW4gPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfbGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUgPSBwcm9maWxlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnJlYWRfYnVmZmVyID0gTlVMTDsgLypzdGVhbCovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfSUNDUDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9faUNDUDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSAib3V0IG9mIG1lbW9yeSI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbHNlIHRoZSBwcm9maWxlIHJlbWFpbnMgaW4gdGhlIHJlYWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidWZmZXIgd2hpY2ggZ2V0cyByZXVzZWQgZm9yIHN1YnNlcXVlbnQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaHVua3MuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9fcHRyICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm1zZyA9PSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT56b3duZXIgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPiAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9ICJ0cnVuY2F0ZWQiOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSBwbmdfcHRyLT56c3RyZWFtLm1zZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSBwbmdfaWNjX2NoZWNrX3RhZ190YWJsZSBvdXRwdXQgYW4gZXJyb3IgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBwcm9maWxlIHRydW5jYXRlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9IHBuZ19wdHItPnpzdHJlYW0ubXNnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnID0gIm91dCBvZiBtZW1vcnkiOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAvKiBlbHNlIHBuZ19pY2NfY2hlY2tfaGVhZGVyIG91dHB1dCBhbiBlcnJvciAqLw0KKyAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAvKiBlbHNlIHBuZ19pY2NfY2hlY2tfbGVuZ3RoIG91dHB1dCBhbiBlcnJvciAqLw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlIC8qIHByb2ZpbGUgdHJ1bmNhdGVkICovDQorICAgICAgICAgICAgICAgICAgZXJybXNnID0gcG5nX3B0ci0+enN0cmVhbS5tc2c7DQorDQorICAgICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgc3RyZWFtICovDQorICAgICAgICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZSAvKiBwbmdfaW5mbGF0ZV9jbGFpbSBmYWlsZWQgKi8NCisgICAgICAgICAgICAgICBlcnJtc2cgPSBwbmdfcHRyLT56c3RyZWFtLm1zZzsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGVycm1zZyA9ICJiYWQgY29tcHJlc3Npb24gbWV0aG9kIjsgLyogb3IgbWlzc2luZyAqLw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgZXJybXNnID0gImJhZCBrZXl3b3JkIjsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgICAgIGVycm1zZyA9ICJ0b28gbWFueSBwcm9maWxlcyI7DQorDQorICAgLyogRmFpbHVyZTogdGhlIHJlYXNvbiBpcyBpbiAnZXJybXNnJyAqLw0KKyAgIGlmICghZmluaXNoZWQpDQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisNCisgICBwbmdfcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9IFBOR19DT0xPUlNQQUNFX0lOVkFMSUQ7DQorICAgcG5nX2NvbG9yc3BhY2Vfc3luYyhwbmdfcHRyLCBpbmZvX3B0cik7DQorICAgaWYgKGVycm1zZyAhPSBOVUxMKSAvKiBlbHNlIGFscmVhZHkgb3V0cHV0ICovDQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCBlcnJtc2cpOw0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfaUNDUF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX3NQTFQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCisvKiBOb3RlOiB0aGlzIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBjaHVua3MgdGhhdCBhcmUgPiA2NEsgdW5kZXIgRE9TICovDQorew0KKyAgIHBuZ19ieXRlcCBlbnRyeV9zdGFydCwgYnVmZmVyOw0KKyAgIHBuZ19zUExUX3QgbmV3X3BhbGV0dGU7DQorICAgcG5nX3NQTFRfZW50cnlwIHBwOw0KKyAgIHBuZ191aW50XzMyIGRhdGFfbGVuZ3RoOw0KKyAgIGludCBlbnRyeV9zaXplLCBpOw0KKyAgIHBuZ191aW50XzMyIHNraXAgPSAwOw0KKyAgIHBuZ191aW50XzMyIGRsOw0KKyAgIHBuZ19zaXplX3QgbWF4X2RsOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zUExUIik7DQorDQorI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIHNQTFQiKTsNCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOw0KKw0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0Sw0KKyAgIGlmIChsZW5ndGggPiA2NTUzNVUpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAidG9vIGxhcmdlIHRvIGZpdCBpbiBtZW1vcnkiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIGJ1ZmZlciA9IHBuZ19yZWFkX2J1ZmZlcihwbmdfcHRyLCBsZW5ndGgrMSwgMi8qc2lsZW50Ki8pOw0KKyAgIGlmIChidWZmZXIgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisNCisgICAvKiBXQVJOSU5HOiB0aGlzIG1heSBicmVhayBpZiBzaXplX3QgaXMgbGVzcyB0aGFuIDMyIGJpdHM7IGl0IGlzIGFzc3VtZWQNCisgICAgKiB0aGF0IHRoZSBQTkdfTUFYX01BTExPQ182NEsgdGVzdCBpcyBlbmFibGVkIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgaXMgYQ0KKyAgICAqIHBvdGVudGlhbCBicmVha2FnZSBwb2ludCBpZiB0aGUgdHlwZXMgaW4gcG5nY29uZi5oIGFyZW4ndCBleGFjdGx5IHJpZ2h0Lg0KKyAgICAqLw0KKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWZmZXIsIGxlbmd0aCk7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBidWZmZXJbbGVuZ3RoXSA9IDA7DQorDQorICAgZm9yIChlbnRyeV9zdGFydCA9IGJ1ZmZlcjsgKmVudHJ5X3N0YXJ0OyBlbnRyeV9zdGFydCsrKQ0KKyAgICAgIC8qIEVtcHR5IGxvb3AgdG8gZmluZCBlbmQgb2YgbmFtZSAqLyA7DQorDQorICAgKytlbnRyeV9zdGFydDsNCisNCisgICAvKiBBIHNhbXBsZSBkZXB0aCBzaG91bGQgZm9sbG93IHRoZSBzZXBhcmF0b3IsIGFuZCB3ZSBzaG91bGQgYmUgb24gaXQgICovDQorICAgaWYgKGVudHJ5X3N0YXJ0ID4gYnVmZmVyICsgbGVuZ3RoIC0gMikNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIm1hbGZvcm1lZCBzUExUIGNodW5rIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBuZXdfcGFsZXR0ZS5kZXB0aCA9ICplbnRyeV9zdGFydCsrOw0KKyAgIGVudHJ5X3NpemUgPSAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCA/IDYgOiAxMCk7DQorICAgLyogVGhpcyBtdXN0IGZpdCBpbiBhIHBuZ191aW50XzMyIGJlY2F1c2UgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbA0KKyAgICAqIGNodW5rIGRhdGEgbGVuZ3RoLg0KKyAgICAqLw0KKyAgIGRhdGFfbGVuZ3RoID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKShlbnRyeV9zdGFydCAtIGJ1ZmZlcik7DQorDQorICAgLyogSW50ZWdyaXR5LWNoZWNrIHRoZSBkYXRhIGxlbmd0aCAqLw0KKyAgIGlmIChkYXRhX2xlbmd0aCAlIGVudHJ5X3NpemUpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIGhhcyBiYWQgbGVuZ3RoIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBkbCA9IChwbmdfaW50XzMyKShkYXRhX2xlbmd0aCAvIGVudHJ5X3NpemUpOw0KKyAgIG1heF9kbCA9IFBOR19TSVpFX01BWCAvIChzaXplb2YgKHBuZ19zUExUX2VudHJ5KSk7DQorDQorICAgaWYgKGRsID4gbWF4X2RsKQ0KKyAgIHsNCisgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgdG9vIGxvbmciKTsNCisgICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBuZXdfcGFsZXR0ZS5uZW50cmllcyA9IChwbmdfaW50XzMyKShkYXRhX2xlbmd0aCAvIGVudHJ5X3NpemUpOw0KKw0KKyAgIG5ld19wYWxldHRlLmVudHJpZXMgPSAocG5nX3NQTFRfZW50cnlwKXBuZ19tYWxsb2Nfd2FybigNCisgICAgICAgcG5nX3B0ciwgbmV3X3BhbGV0dGUubmVudHJpZXMgKiAoc2l6ZW9mIChwbmdfc1BMVF9lbnRyeSkpKTsNCisNCisgICBpZiAobmV3X3BhbGV0dGUuZW50cmllcyA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgcmVxdWlyZXMgdG9vIG11Y2ggbWVtb3J5Iik7DQorICAgICAgIHJldHVybjsNCisgICB9DQorDQorI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRA0KKyAgIGZvciAoaSA9IDA7IGkgPCBuZXdfcGFsZXR0ZS5uZW50cmllczsgaSsrKQ0KKyAgIHsNCisgICAgICBwcCA9IG5ld19wYWxldHRlLmVudHJpZXMgKyBpOw0KKw0KKyAgICAgIGlmIChuZXdfcGFsZXR0ZS5kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICBwcC0+cmVkID0gKmVudHJ5X3N0YXJ0Kys7DQorICAgICAgICAgcHAtPmdyZWVuID0gKmVudHJ5X3N0YXJ0Kys7DQorICAgICAgICAgcHAtPmJsdWUgPSAqZW50cnlfc3RhcnQrKzsNCisgICAgICAgICBwcC0+YWxwaGEgPSAqZW50cnlfc3RhcnQrKzsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBwcC0+cmVkICAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOw0KKyAgICAgICAgIHBwLT5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7DQorICAgICAgICAgcHAtPmJsdWUgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsNCisgICAgICAgICBwcC0+YWxwaGEgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOw0KKyAgICAgIH0NCisNCisgICAgICBwcC0+ZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsNCisgICB9DQorI2Vsc2UNCisgICBwcCA9IG5ld19wYWxldHRlLmVudHJpZXM7DQorDQorICAgZm9yIChpID0gMDsgaSA8IG5ld19wYWxldHRlLm5lbnRyaWVzOyBpKyspDQorICAgew0KKw0KKyAgICAgIGlmIChuZXdfcGFsZXR0ZS5kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICBwcFtpXS5yZWQgICA9ICplbnRyeV9zdGFydCsrOw0KKyAgICAgICAgIHBwW2ldLmdyZWVuID0gKmVudHJ5X3N0YXJ0Kys7DQorICAgICAgICAgcHBbaV0uYmx1ZSAgPSAqZW50cnlfc3RhcnQrKzsNCisgICAgICAgICBwcFtpXS5hbHBoYSA9ICplbnRyeV9zdGFydCsrOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIHBwW2ldLnJlZCAgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsNCisgICAgICAgICBwcFtpXS5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7DQorICAgICAgICAgcHBbaV0uYmx1ZSAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOw0KKyAgICAgICAgIHBwW2ldLmFscGhhID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsNCisgICAgICB9DQorDQorICAgICAgcHBbaV0uZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsNCisgICB9DQorI2VuZGlmDQorDQorICAgLyogRGlzY2FyZCBhbGwgY2h1bmsgZGF0YSBleGNlcHQgdGhlIG5hbWUgYW5kIHN0YXNoIHRoYXQgKi8NCisgICBuZXdfcGFsZXR0ZS5uYW1lID0gKHBuZ19jaGFycClidWZmZXI7DQorDQorICAgcG5nX3NldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCAmbmV3X3BhbGV0dGUsIDEpOw0KKw0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19wYWxldHRlLmVudHJpZXMpOw0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfc1BMVF9TVVBQT1JURUQgKi8NCisNCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX3RSTlMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2J5dGUgcmVhZGJ1ZltQTkdfTUFYX1BBTEVUVEVfTEVOR1RIXTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdFJOUyIpOw0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOw0KKw0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdFJOUykpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZSBidWZbMl07DQorDQorICAgICAgaWYgKGxlbmd0aCAhPSAyKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDIpOw0KKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDE7DQorICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JheSA9IHBuZ19nZXRfdWludF8xNihidWYpOw0KKyAgIH0NCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikNCisgICB7DQorICAgICAgcG5nX2J5dGUgYnVmWzZdOw0KKw0KKyAgICAgIGlmIChsZW5ndGggIT0gNikNCisgICAgICB7DQorICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDE7DQorICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IucmVkID0gcG5nX2dldF91aW50XzE2KGJ1Zik7DQorICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuZ3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgMik7DQorICAgICAgcG5nX3B0ci0+dHJhbnNfY29sb3IuYmx1ZSA9IHBuZ19nZXRfdWludF8xNihidWYgKyA0KTsNCisgICB9DQorDQorICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgIHsNCisgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpDQorICAgICAgew0KKyAgICAgICAgIC8qIFRPRE86IGlzIHRoaXMgYWN0dWFsbHkgYW4gZXJyb3IgaW4gdGhlIElTTyBzcGVjPyAqLw0KKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAobGVuZ3RoID4gcG5nX3B0ci0+bnVtX3BhbGV0dGUgfHwgbGVuZ3RoID4gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCB8fA0KKyAgICAgICAgIGxlbmd0aCA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCByZWFkYnVmLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IChwbmdfdWludF8xNilsZW5ndGg7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIHdpdGggYWxwaGEgY2hhbm5lbCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAwOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogVE9ETzogdGhpcyBpcyBhIGhvcnJpYmxlIHNpZGUgZWZmZWN0IGluIHRoZSBwYWxldHRlIGNhc2UgYmVjYXVzZSB0aGUNCisgICAgKiBwbmdfc3RydWN0IGVuZHMgdXAgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHRSTlMgYnVmZmVyIG93bmVkIGJ5IHRoZQ0KKyAgICAqIHBuZ19pbmZvLiAgRml4IHRoaXMuDQorICAgICovDQorICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCByZWFkYnVmLCBwbmdfcHRyLT5udW1fdHJhbnMsDQorICAgICAgICYocG5nX3B0ci0+dHJhbnNfY29sb3IpKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2hhbmRsZV9iS0dEKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpDQorew0KKyAgIHVuc2lnbmVkIGludCB0cnVlbGVuOw0KKyAgIHBuZ19ieXRlIGJ1Zls2XTsNCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZDsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfYktHRCIpOw0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOw0KKw0KKyAgIGVsc2UgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkgfHwNCisgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmDQorICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKSkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2JLR0QpKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICB0cnVlbGVuID0gMTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpDQorICAgICAgdHJ1ZWxlbiA9IDY7DQorDQorICAgZWxzZQ0KKyAgICAgIHRydWVsZW4gPSAyOw0KKw0KKyAgIGlmIChsZW5ndGggIT0gdHJ1ZWxlbikNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCB0cnVlbGVuKTsNCisNCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIFdlIGNvbnZlcnQgdGhlIGluZGV4IHZhbHVlIGludG8gUkdCIGNvbXBvbmVudHMgc28gdGhhdCB3ZSBjYW4gYWxsb3cNCisgICAgKiBhcmJpdHJhcnkgUkdCIHZhbHVlcyBmb3IgYmFja2dyb3VuZCB3aGVuIHdlIGhhdmUgdHJhbnNwYXJlbmN5LCBhbmQNCisgICAgKiBzbyBpdCBpcyBlYXN5IHRvIGRldGVybWluZSB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgYmFja2dyb3VuZCBjb2xvcg0KKyAgICAqIGZyb20gdGhlIGluZm9fcHRyIHN0cnVjdC4NCisgICAgKi8NCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgIHsNCisgICAgICBiYWNrZ3JvdW5kLmluZGV4ID0gYnVmWzBdOw0KKw0KKyAgICAgIGlmIChpbmZvX3B0ciAmJiBpbmZvX3B0ci0+bnVtX3BhbGV0dGUpDQorICAgICAgew0KKyAgICAgICAgIGlmIChidWZbMF0gPj0gaW5mb19wdHItPm51bV9wYWxldHRlKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGluZGV4Iik7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBiYWNrZ3JvdW5kLnJlZCA9IChwbmdfdWludF8xNilwbmdfcHRyLT5wYWxldHRlW2J1ZlswXV0ucmVkOw0KKyAgICAgICAgIGJhY2tncm91bmQuZ3JlZW4gPSAocG5nX3VpbnRfMTYpcG5nX3B0ci0+cGFsZXR0ZVtidWZbMF1dLmdyZWVuOw0KKyAgICAgICAgIGJhY2tncm91bmQuYmx1ZSA9IChwbmdfdWludF8xNilwbmdfcHRyLT5wYWxldHRlW2J1ZlswXV0uYmx1ZTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIGJhY2tncm91bmQucmVkID0gYmFja2dyb3VuZC5ncmVlbiA9IGJhY2tncm91bmQuYmx1ZSA9IDA7DQorDQorICAgICAgYmFja2dyb3VuZC5ncmF5ID0gMDsNCisgICB9DQorDQorICAgZWxzZSBpZiAoIShwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKSAvKiBHUkFZICovDQorICAgew0KKyAgICAgIGJhY2tncm91bmQuaW5kZXggPSAwOw0KKyAgICAgIGJhY2tncm91bmQucmVkID0NCisgICAgICBiYWNrZ3JvdW5kLmdyZWVuID0NCisgICAgICBiYWNrZ3JvdW5kLmJsdWUgPQ0KKyAgICAgIGJhY2tncm91bmQuZ3JheSA9IHBuZ19nZXRfdWludF8xNihidWYpOw0KKyAgIH0NCisNCisgICBlbHNlDQorICAgew0KKyAgICAgIGJhY2tncm91bmQuaW5kZXggPSAwOw0KKyAgICAgIGJhY2tncm91bmQucmVkID0gcG5nX2dldF91aW50XzE2KGJ1Zik7DQorICAgICAgYmFja2dyb3VuZC5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihidWYgKyAyKTsNCisgICAgICBiYWNrZ3JvdW5kLmJsdWUgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgNCk7DQorICAgICAgYmFja2dyb3VuZC5ncmF5ID0gMDsNCisgICB9DQorDQorICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmYmFja2dyb3VuZCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfaElTVChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICB1bnNpZ25lZCBpbnQgbnVtLCBpOw0KKyAgIHBuZ191aW50XzE2IHJlYWRidWZbUE5HX01BWF9QQUxFVFRFX0xFTkdUSF07DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2hJU1QiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpIHx8ICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faElTVCkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBudW0gPSBsZW5ndGggLyAyIDsNCisNCisgICBpZiAobnVtICE9IHBuZ19wdHItPm51bV9wYWxldHRlIHx8IG51bSA+IFBOR19NQVhfUEFMRVRURV9MRU5HVEgpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZSBidWZbMl07DQorDQorICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMik7DQorICAgICAgcmVhZGJ1ZltpXSA9IHBuZ19nZXRfdWludF8xNihidWYpOw0KKyAgIH0NCisNCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgcmVhZGJ1Zik7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfcEhZcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfYnl0ZSBidWZbOV07DQorICAgcG5nX3VpbnRfMzIgcmVzX3gsIHJlc195Ow0KKyAgIGludCB1bml0X3R5cGU7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3BIWXMiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgaWYgKGxlbmd0aCAhPSA5KQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDkpOw0KKw0KKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkNCisgICAgICByZXR1cm47DQorDQorICAgcmVzX3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsNCisgICByZXNfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyA0KTsNCisgICB1bml0X3R5cGUgPSBidWZbOF07DQorICAgcG5nX3NldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCByZXNfeCwgcmVzX3ksIHVuaXRfdHlwZSk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRA0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfb0ZGcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfYnl0ZSBidWZbOV07DQorICAgcG5nX2ludF8zMiBvZmZzZXRfeCwgb2Zmc2V0X3k7DQorICAgaW50IHVuaXRfdHlwZTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfb0ZGcyIpOw0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIm1pc3NpbmcgSUhEUiIpOw0KKw0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBwbGFjZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAobGVuZ3RoICE9IDkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgOSk7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBvZmZzZXRfeCA9IHBuZ19nZXRfaW50XzMyKGJ1Zik7DQorICAgb2Zmc2V0X3kgPSBwbmdfZ2V0X2ludF8zMihidWYgKyA0KTsNCisgICB1bml0X3R5cGUgPSBidWZbOF07DQorICAgcG5nX3NldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBvZmZzZXRfeCwgb2Zmc2V0X3ksIHVuaXRfdHlwZSk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRA0KKy8qIFJlYWQgdGhlIHBDQUwgY2h1bmsgKGRlc2NyaWJlZCBpbiB0aGUgUE5HIEV4dGVuc2lvbnMgZG9jdW1lbnQpICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2hhbmRsZV9wQ0FMKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpDQorew0KKyAgIHBuZ19pbnRfMzIgWDAsIFgxOw0KKyAgIHBuZ19ieXRlIHR5cGUsIG5wYXJhbXM7DQorICAgcG5nX2J5dGVwIGJ1ZmZlciwgYnVmLCB1bml0cywgZW5kcHRyOw0KKyAgIHBuZ19jaGFycHAgcGFyYW1zOw0KKyAgIGludCBpOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9wQ0FMIik7DQorDQorICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQ0KKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7DQorDQorICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIHBsYWNlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wQ0FMKSkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJkdXBsaWNhdGUiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19kZWJ1ZzEoMiwgIkFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgcENBTCBjaHVuayBkYXRhICgldSBieXRlcykiLA0KKyAgICAgICBsZW5ndGggKyAxKTsNCisNCisgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgbGVuZ3RoKzEsIDIvKnNpbGVudCovKTsNCisNCisgICBpZiAoYnVmZmVyID09IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIG1lbW9yeSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZmZlciwgbGVuZ3RoKTsNCisNCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGJ1ZmZlcltsZW5ndGhdID0gMDsgLyogTnVsbCB0ZXJtaW5hdGUgdGhlIGxhc3Qgc3RyaW5nICovDQorDQorICAgcG5nX2RlYnVnKDMsICJGaW5kaW5nIGVuZCBvZiBwQ0FMIHB1cnBvc2Ugc3RyaW5nIik7DQorICAgZm9yIChidWYgPSBidWZmZXI7ICpidWY7IGJ1ZisrKQ0KKyAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOw0KKw0KKyAgIGVuZHB0ciA9IGJ1ZmZlciArIGxlbmd0aDsNCisNCisgICAvKiBXZSBuZWVkIHRvIGhhdmUgYXQgbGVhc3QgMTIgYnl0ZXMgYWZ0ZXIgdGhlIHB1cnBvc2Ugc3RyaW5nDQorICAgICogaW4gb3JkZXIgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uDQorICAgICovDQorICAgaWYgKGVuZHB0ciA8PSBidWYgKyAxMikNCisgICB7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2RlYnVnKDMsICJSZWFkaW5nIHBDQUwgWDAsIFgxLCB0eXBlLCBucGFyYW1zLCBhbmQgdW5pdHMiKTsNCisgICBYMCA9IHBuZ19nZXRfaW50XzMyKChwbmdfYnl0ZXApYnVmKzEpOw0KKyAgIFgxID0gcG5nX2dldF9pbnRfMzIoKHBuZ19ieXRlcClidWYrNSk7DQorICAgdHlwZSA9IGJ1Zls5XTsNCisgICBucGFyYW1zID0gYnVmWzEwXTsNCisgICB1bml0cyA9IGJ1ZiArIDExOw0KKw0KKyAgIHBuZ19kZWJ1ZygzLCAiQ2hlY2tpbmcgcENBTCBlcXVhdGlvbiB0eXBlIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyIpOw0KKyAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZm9yIGtub3duDQorICAgICogZXF1YXRpb24gdHlwZXMuDQorICAgICovDQorICAgaWYgKCh0eXBlID09IFBOR19FUVVBVElPTl9MSU5FQVIgJiYgbnBhcmFtcyAhPSAyKSB8fA0KKyAgICAgICAodHlwZSA9PSBQTkdfRVFVQVRJT05fQkFTRV9FICYmIG5wYXJhbXMgIT0gMykgfHwNCisgICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0FSQklUUkFSWSAmJiBucGFyYW1zICE9IDMpIHx8DQorICAgICAgICh0eXBlID09IFBOR19FUVVBVElPTl9IWVBFUkJPTElDICYmIG5wYXJhbXMgIT0gNCkpDQorICAgew0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQgcGFyYW1ldGVyIGNvdW50Iik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBlbHNlIGlmICh0eXBlID49IFBOR19FUVVBVElPTl9MQVNUKQ0KKyAgIHsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ1bnJlY29nbml6ZWQgZXF1YXRpb24gdHlwZSIpOw0KKyAgIH0NCisNCisgICBmb3IgKGJ1ZiA9IHVuaXRzOyAqYnVmOyBidWYrKykNCisgICAgICAvKiBFbXB0eSBsb29wIHRvIG1vdmUgcGFzdCB0aGUgdW5pdHMgc3RyaW5nLiAqLyA7DQorDQorICAgcG5nX2RlYnVnKDMsICJBbGxvY2F0aW5nIHBDQUwgcGFyYW1ldGVycyBhcnJheSIpOw0KKw0KKyAgIHBhcmFtcyA9IHBuZ192b2lkY2FzdChwbmdfY2hhcnBwLCBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwNCisgICAgICAgbnBhcmFtcyAqIChzaXplb2YgKHBuZ19jaGFycCkpKSk7DQorDQorICAgaWYgKHBhcmFtcyA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICAvKiBHZXQgcG9pbnRlcnMgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggcGFyYW1ldGVyIHN0cmluZy4gKi8NCisgICBmb3IgKGkgPSAwOyBpIDwgbnBhcmFtczsgaSsrKQ0KKyAgIHsNCisgICAgICBidWYrKzsgLyogU2tpcCB0aGUgbnVsbCBzdHJpbmcgdGVybWluYXRvciBmcm9tIHByZXZpb3VzIHBhcmFtZXRlci4gKi8NCisNCisgICAgICBwbmdfZGVidWcxKDMsICJSZWFkaW5nIHBDQUwgcGFyYW1ldGVyICVkIiwgaSk7DQorDQorICAgICAgZm9yIChwYXJhbXNbaV0gPSAocG5nX2NoYXJwKWJ1ZjsgYnVmIDw9IGVuZHB0ciAmJiAqYnVmICE9IDA7IGJ1ZisrKQ0KKyAgICAgICAgIC8qIEVtcHR5IGxvb3AgdG8gbW92ZSBwYXN0IGVhY2ggcGFyYW1ldGVyIHN0cmluZyAqLyA7DQorDQorICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmVuJ3QgcnVuIG91dCBvZiBkYXRhIHlldCAqLw0KKyAgICAgIGlmIChidWYgPiBlbmRwdHIpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhcmFtcyk7DQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCBkYXRhIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgcG5nX3NldF9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAocG5nX2NoYXJwKWJ1ZmZlciwgWDAsIFgxLCB0eXBlLCBucGFyYW1zLA0KKyAgICAgIChwbmdfY2hhcnApdW5pdHMsIHBhcmFtcyk7DQorDQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFyYW1zKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEDQorLyogUmVhZCB0aGUgc0NBTCBjaHVuayAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19oYW5kbGVfc0NBTChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfYnl0ZXAgYnVmZmVyOw0KKyAgIHBuZ19zaXplX3QgaTsNCisgICBpbnQgc3RhdGU7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3NDQUwiKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgcGxhY2UiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NDQUwpKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImR1cGxpY2F0ZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogTmVlZCB1bml0IHR5cGUsIHdpZHRoLCBcMCwgaGVpZ2h0OiBtaW5pbXVtIDQgYnl0ZXMgKi8NCisgICBlbHNlIGlmIChsZW5ndGggPCA0KQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19kZWJ1ZzEoMiwgIkFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgc0NBTCBjaHVuayBkYXRhICgldSBieXRlcykiLA0KKyAgICAgIGxlbmd0aCArIDEpOw0KKw0KKyAgIGJ1ZmZlciA9IHBuZ19yZWFkX2J1ZmZlcihwbmdfcHRyLCBsZW5ndGgrMSwgMi8qc2lsZW50Ki8pOw0KKw0KKyAgIGlmIChidWZmZXIgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAib3V0IG9mIG1lbW9yeSIpOw0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmZmVyLCBsZW5ndGgpOw0KKyAgIGJ1ZmZlcltsZW5ndGhdID0gMDsgLyogTnVsbCB0ZXJtaW5hdGUgdGhlIGxhc3Qgc3RyaW5nICovDQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBWYWxpZGF0ZSB0aGUgdW5pdC4gKi8NCisgICBpZiAoYnVmZmVyWzBdICE9IDEgJiYgYnVmZmVyWzBdICE9IDIpDQorICAgew0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImludmFsaWQgdW5pdCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogVmFsaWRhdGUgdGhlIEFTQ0lJIG51bWJlcnMsIG5lZWQgdHdvIEFTQ0lJIG51bWJlcnMgc2VwYXJhdGVkIGJ5DQorICAgICogYSAnXDAnIGFuZCB0aGV5IG5lZWQgdG8gZml0IGV4YWN0bHkgaW4gdGhlIGNodW5rIGRhdGEuDQorICAgICovDQorICAgaSA9IDE7DQorICAgc3RhdGUgPSAwOw0KKw0KKyAgIGlmICghcG5nX2NoZWNrX2ZwX251bWJlcigocG5nX2NvbnN0X2NoYXJwKWJ1ZmZlciwgbGVuZ3RoLCAmc3RhdGUsICZpKSB8fA0KKyAgICAgICBpID49IGxlbmd0aCB8fCBidWZmZXJbaSsrXSAhPSAwKQ0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImJhZCB3aWR0aCBmb3JtYXQiKTsNCisNCisgICBlbHNlIGlmICghUE5HX0ZQX0lTX1BPU0lUSVZFKHN0YXRlKSkNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJub24tcG9zaXRpdmUgd2lkdGgiKTsNCisNCisgICBlbHNlDQorICAgew0KKyAgICAgIHBuZ19zaXplX3QgaGVpZ2h0aSA9IGk7DQorDQorICAgICAgc3RhdGUgPSAwOw0KKyAgICAgIGlmICghcG5nX2NoZWNrX2ZwX251bWJlcigocG5nX2NvbnN0X2NoYXJwKWJ1ZmZlciwgbGVuZ3RoLCAmc3RhdGUsICZpKSB8fA0KKyAgICAgICAgIGkgIT0gbGVuZ3RoKQ0KKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgImJhZCBoZWlnaHQgZm9ybWF0Iik7DQorDQorICAgICAgZWxzZSBpZiAoIVBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkpDQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAibm9uLXBvc2l0aXZlIGhlaWdodCIpOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICAvKiBUaGlzIGlzIHRoZSAob25seSkgc3VjY2VzcyBjYXNlLiAqLw0KKyAgICAgICAgIHBuZ19zZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCBidWZmZXJbMF0sDQorICAgICAgICAgICAgKHBuZ19jaGFycClidWZmZXIrMSwgKHBuZ19jaGFycClidWZmZXIraGVpZ2h0aSk7DQorICAgfQ0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX3RJTUUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2J5dGUgYnVmWzddOw0KKyAgIHBuZ190aW1lIG1vZF90aW1lOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV90SU1FIik7DQorDQorICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQ0KKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7DQorDQorICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiZHVwbGljYXRlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpDQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsNCisNCisgICBpZiAobGVuZ3RoICE9IDcpDQorICAgew0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiaW52YWxpZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgNyk7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBtb2RfdGltZS5zZWNvbmQgPSBidWZbNl07DQorICAgbW9kX3RpbWUubWludXRlID0gYnVmWzVdOw0KKyAgIG1vZF90aW1lLmhvdXIgPSBidWZbNF07DQorICAgbW9kX3RpbWUuZGF5ID0gYnVmWzNdOw0KKyAgIG1vZF90aW1lLm1vbnRoID0gYnVmWzJdOw0KKyAgIG1vZF90aW1lLnllYXIgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsNCisNCisgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRA0KKy8qIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX3RFWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX3RleHQgIHRleHRfaW5mbzsNCisgICBwbmdfYnl0ZXAgYnVmZmVyOw0KKyAgIHBuZ19jaGFycCBrZXk7DQorICAgcG5nX2NoYXJwIHRleHQ7DQorICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3RFWHQiKTsNCisNCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAibm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUiKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpDQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsNCisNCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLDQorICAgaWYgKGxlbmd0aCA+IDY1NTM1VSkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJ0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorI2VuZGlmDQorDQorICAgYnVmZmVyID0gcG5nX3JlYWRfYnVmZmVyKHBuZ19wdHIsIGxlbmd0aCsxLCAxLyp3YXJuKi8pOw0KKw0KKyAgIGlmIChidWZmZXIgPT0gTlVMTCkNCisgICB7DQorICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7DQorICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWZmZXIsIGxlbmd0aCk7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBrZXkgPSAocG5nX2NoYXJwKWJ1ZmZlcjsNCisgICBrZXlbbGVuZ3RoXSA9IDA7DQorDQorICAgZm9yICh0ZXh0ID0ga2V5OyAqdGV4dDsgdGV4dCsrKQ0KKyAgICAgIC8qIEVtcHR5IGxvb3AgdG8gZmluZCBlbmQgb2Yga2V5ICovIDsNCisNCisgICBpZiAodGV4dCAhPSBrZXkgKyBsZW5ndGgpDQorICAgICAgdGV4dCsrOw0KKw0KKyAgIHRleHRfaW5mby5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7DQorICAgdGV4dF9pbmZvLmtleSA9IGtleTsNCisgICB0ZXh0X2luZm8ubGFuZyA9IE5VTEw7DQorICAgdGV4dF9pbmZvLmxhbmdfa2V5ID0gTlVMTDsNCisgICB0ZXh0X2luZm8uaXR4dF9sZW5ndGggPSAwOw0KKyAgIHRleHRfaW5mby50ZXh0ID0gdGV4dDsNCisgICB0ZXh0X2luZm8udGV4dF9sZW5ndGggPSBzdHJsZW4odGV4dCk7DQorDQorICAgaWYgKHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dF9pbmZvLCAxKSkNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIHRleHQgY2h1bmsiKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEDQorLyogTm90ZTogdGhpcyBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX3pUWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2NvbnN0X2NoYXJwIGVycm1zZyA9IE5VTEw7DQorICAgcG5nX2J5dGVwICAgICAgIGJ1ZmZlcjsNCisgICBwbmdfdWludF8zMiAgICAga2V5d29yZF9sZW5ndGg7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3pUWHQiKTsNCisNCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKw0KKyAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAibm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUiKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpDQorICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJtaXNzaW5nIElIRFIiKTsNCisNCisgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpDQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsNCisNCisgICBidWZmZXIgPSBwbmdfcmVhZF9idWZmZXIocG5nX3B0ciwgbGVuZ3RoLCAyLypzaWxlbnQqLyk7DQorDQorICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm91dCBvZiBtZW1vcnkiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWZmZXIsIGxlbmd0aCk7DQorDQorICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBUT0RPOiBhbHNvIGNoZWNrIHRoYXQgdGhlIGtleXdvcmQgY29udGVudHMgbWF0Y2ggdGhlIHNwZWMhICovDQorICAgZm9yIChrZXl3b3JkX2xlbmd0aCA9IDA7DQorICAgICAga2V5d29yZF9sZW5ndGggPCBsZW5ndGggJiYgYnVmZmVyW2tleXdvcmRfbGVuZ3RoXSAhPSAwOw0KKyAgICAgICsra2V5d29yZF9sZW5ndGgpDQorICAgICAgLyogRW1wdHkgbG9vcCB0byBmaW5kIGVuZCBvZiBuYW1lICovIDsNCisNCisgICBpZiAoa2V5d29yZF9sZW5ndGggPiA3OSB8fCBrZXl3b3JkX2xlbmd0aCA8IDEpDQorICAgICAgZXJybXNnID0gImJhZCBrZXl3b3JkIjsNCisNCisgICAvKiB6VFh0IG11c3QgaGF2ZSBzb21lIExaIGRhdGEgYWZ0ZXIgdGhlIGtleXdvcmQsIGFsdGhvdWdoIGl0IG1heSBleHBhbmQgdG8NCisgICAgKiB6ZXJvIGJ5dGVzOyB3ZSBuZWVkIGEgJ1wwJyBhdCB0aGUgZW5kIG9mIHRoZSBrZXl3b3JkLCB0aGUgY29tcHJlc3Npb24gdHlwZQ0KKyAgICAqIHRoZW4gdGhlIExaIGRhdGE6DQorICAgICovDQorICAgZWxzZSBpZiAoa2V5d29yZF9sZW5ndGggKyAzID4gbGVuZ3RoKQ0KKyAgICAgIGVycm1zZyA9ICJ0cnVuY2F0ZWQiOw0KKw0KKyAgIGVsc2UgaWYgKGJ1ZmZlcltrZXl3b3JkX2xlbmd0aCsxXSAhPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQ0KKyAgICAgIGVycm1zZyA9ICJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUiOw0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2FsbG9jX3NpemVfdCB1bmNvbXByZXNzZWRfbGVuZ3RoID0gUE5HX1NJWkVfTUFYOw0KKw0KKyAgICAgIC8qIFRPRE86IGF0IHByZXNlbnQgcG5nX2RlY29tcHJlc3NfY2h1bmsgaW1wb3NlcyBhIHNpbmdsZSBhcHBsaWNhdGlvbg0KKyAgICAgICAqIGxldmVsIG1lbW9yeSBsaW1pdCwgdGhpcyBzaG91bGQgYmUgc3BsaXQgdG8gZGlmZmVyZW50IHZhbHVlcyBmb3IgaUNDUA0KKyAgICAgICAqIGFuZCB0ZXh0IGNodW5rcy4NCisgICAgICAgKi8NCisgICAgICBpZiAocG5nX2RlY29tcHJlc3NfY2h1bmsocG5nX3B0ciwgbGVuZ3RoLCBrZXl3b3JkX2xlbmd0aCsyLA0KKyAgICAgICAgICZ1bmNvbXByZXNzZWRfbGVuZ3RoLCAxLyp0ZXJtaW5hdGUqLykgPT0gWl9TVFJFQU1fRU5EKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfdGV4dCB0ZXh0Ow0KKw0KKyAgICAgICAgIC8qIEl0IHdvcmtlZDsgcG5nX3B0ci0+cmVhZF9idWZmZXIgbm93IGxvb2tzIGxpa2UgYSB0RVh0IGNodW5rIGV4Y2VwdA0KKyAgICAgICAgICAqIGZvciB0aGUgZXh0cmEgY29tcHJlc3Npb24gdHlwZSBieXRlIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGlzbid0DQorICAgICAgICAgICogbmVjZXNzYXJpbHkgJ1wwJyB0ZXJtaW5hdGVkLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGJ1ZmZlciA9IHBuZ19wdHItPnJlYWRfYnVmZmVyOw0KKyAgICAgICAgIGJ1ZmZlclt1bmNvbXByZXNzZWRfbGVuZ3RoKyhrZXl3b3JkX2xlbmd0aCsyKV0gPSAwOw0KKw0KKyAgICAgICAgIHRleHQuY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0Ow0KKyAgICAgICAgIHRleHQua2V5ID0gKHBuZ19jaGFycClidWZmZXI7DQorICAgICAgICAgdGV4dC50ZXh0ID0gKHBuZ19jaGFycCkoYnVmZmVyICsga2V5d29yZF9sZW5ndGgrMik7DQorICAgICAgICAgdGV4dC50ZXh0X2xlbmd0aCA9IHVuY29tcHJlc3NlZF9sZW5ndGg7DQorICAgICAgICAgdGV4dC5pdHh0X2xlbmd0aCA9IDA7DQorICAgICAgICAgdGV4dC5sYW5nID0gTlVMTDsNCisgICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gTlVMTDsNCisNCisgICAgICAgICBpZiAocG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCAxKSkNCisgICAgICAgICAgICBlcnJtc2cgPSAiaW5zdWZmaWNpZW50IG1lbW9yeSI7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBlcnJtc2cgPSBwbmdfcHRyLT56c3RyZWFtLm1zZzsNCisgICB9DQorDQorICAgaWYgKGVycm1zZyAhPSBOVUxMKQ0KKyAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgZXJybXNnKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEDQorLyogTm90ZTogdGhpcyBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfaGFuZGxlX2lUWHQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkNCit7DQorICAgcG5nX2NvbnN0X2NoYXJwIGVycm1zZyA9IE5VTEw7DQorICAgcG5nX2J5dGVwIGJ1ZmZlcjsNCisgICBwbmdfdWludF8zMiBwcmVmaXhfbGVuZ3RoOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9pVFh0Iik7DQorDQorI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm5vIHNwYWNlIGluIGNodW5rIGNhY2hlIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQ0KKyAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAibWlzc2luZyBJSERSIik7DQorDQorICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQ0KKyAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7DQorDQorICAgYnVmZmVyID0gcG5nX3JlYWRfYnVmZmVyKHBuZ19wdHIsIGxlbmd0aCsxLCAxLyp3YXJuKi8pOw0KKw0KKyAgIGlmIChidWZmZXIgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJvdXQgb2YgbWVtb3J5Iik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmZmVyLCBsZW5ndGgpOw0KKw0KKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkNCisgICAgICByZXR1cm47DQorDQorICAgLyogRmlyc3QgdGhlIGtleXdvcmQuICovDQorICAgZm9yIChwcmVmaXhfbGVuZ3RoPTA7DQorICAgICAgcHJlZml4X2xlbmd0aCA8IGxlbmd0aCAmJiBidWZmZXJbcHJlZml4X2xlbmd0aF0gIT0gMDsNCisgICAgICArK3ByZWZpeF9sZW5ndGgpDQorICAgICAgLyogRW1wdHkgbG9vcCAqLyA7DQorDQorICAgLyogUGVyZm9ybSBhIGJhc2ljIGNoZWNrIG9uIHRoZSBrZXl3b3JkIGxlbmd0aCBoZXJlLiAqLw0KKyAgIGlmIChwcmVmaXhfbGVuZ3RoID4gNzkgfHwgcHJlZml4X2xlbmd0aCA8IDEpDQorICAgICAgZXJybXNnID0gImJhZCBrZXl3b3JkIjsNCisNCisgICAvKiBFeHBlY3Qga2V5d29yZCwgY29tcHJlc3Npb24gZmxhZywgY29tcHJlc3Npb24gdHlwZSwgbGFuZ3VhZ2UsIHRyYW5zbGF0ZWQNCisgICAgKiBrZXl3b3JkIChib3RoIG1heSBiZSBlbXB0eSBidXQgYXJlIDAgdGVybWluYXRlZCkgdGhlbiB0aGUgdGV4dCwgd2hpY2ggbWF5DQorICAgICogYmUgZW1wdHkuDQorICAgICovDQorICAgZWxzZSBpZiAocHJlZml4X2xlbmd0aCArIDUgPiBsZW5ndGgpDQorICAgICAgZXJybXNnID0gInRydW5jYXRlZCI7DQorDQorICAgZWxzZSBpZiAoYnVmZmVyW3ByZWZpeF9sZW5ndGgrMV0gPT0gMCB8fA0KKyAgICAgIChidWZmZXJbcHJlZml4X2xlbmd0aCsxXSA9PSAxICYmDQorICAgICAgYnVmZmVyW3ByZWZpeF9sZW5ndGgrMl0gPT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkpDQorICAgew0KKyAgICAgIGludCBjb21wcmVzc2VkID0gYnVmZmVyW3ByZWZpeF9sZW5ndGgrMV0gIT0gMDsNCisgICAgICBwbmdfdWludF8zMiBsYW5ndWFnZV9vZmZzZXQsIHRyYW5zbGF0ZWRfa2V5d29yZF9vZmZzZXQ7DQorICAgICAgcG5nX2FsbG9jX3NpemVfdCB1bmNvbXByZXNzZWRfbGVuZ3RoID0gMDsNCisNCisgICAgICAvKiBOb3cgdGhlIGxhbmd1YWdlIHRhZyAqLw0KKyAgICAgIHByZWZpeF9sZW5ndGggKz0gMzsNCisgICAgICBsYW5ndWFnZV9vZmZzZXQgPSBwcmVmaXhfbGVuZ3RoOw0KKw0KKyAgICAgIGZvciAoOyBwcmVmaXhfbGVuZ3RoIDwgbGVuZ3RoICYmIGJ1ZmZlcltwcmVmaXhfbGVuZ3RoXSAhPSAwOw0KKyAgICAgICAgICsrcHJlZml4X2xlbmd0aCkNCisgICAgICAgICAvKiBFbXB0eSBsb29wICovIDsNCisNCisgICAgICAvKiBXQVJOSU5HOiB0aGUgbGVuZ3RoIG1heSBiZSBpbnZhbGlkIGhlcmUsIHRoaXMgaXMgY2hlY2tlZCBiZWxvdy4gKi8NCisgICAgICB0cmFuc2xhdGVkX2tleXdvcmRfb2Zmc2V0ID0gKytwcmVmaXhfbGVuZ3RoOw0KKw0KKyAgICAgIGZvciAoOyBwcmVmaXhfbGVuZ3RoIDwgbGVuZ3RoICYmIGJ1ZmZlcltwcmVmaXhfbGVuZ3RoXSAhPSAwOw0KKyAgICAgICAgICsrcHJlZml4X2xlbmd0aCkNCisgICAgICAgICAvKiBFbXB0eSBsb29wICovIDsNCisNCisgICAgICAvKiBwcmVmaXhfbGVuZ3RoIHNob3VsZCBub3cgYmUgYXQgdGhlIHRyYWlsaW5nICdcMCcgb2YgdGhlIHRyYW5zbGF0ZWQNCisgICAgICAgKiBrZXl3b3JkLCBidXQgaXQgbWF5IGFscmVhZHkgYmUgb3ZlciB0aGUgZW5kLiAgTm9uZSBvZiB0aGlzIGFyaXRobWV0aWMNCisgICAgICAgKiBjYW4gb3ZlcmZsb3cgYmVjYXVzZSBjaHVua3MgYXJlIGF0IG1vc3QgMl4zMSBieXRlcyBsb25nLCBidXQgb24gMTYtYml0DQorICAgICAgICogc3lzdGVtcyB0aGUgYXZhaWxhYmxlIGFsbG9jYXRvbiBtYXkgb3ZlcmZsb3cuDQorICAgICAgICovDQorICAgICAgKytwcmVmaXhfbGVuZ3RoOw0KKw0KKyAgICAgIGlmICghY29tcHJlc3NlZCAmJiBwcmVmaXhfbGVuZ3RoIDw9IGxlbmd0aCkNCisgICAgICAgICB1bmNvbXByZXNzZWRfbGVuZ3RoID0gbGVuZ3RoIC0gcHJlZml4X2xlbmd0aDsNCisNCisgICAgICBlbHNlIGlmIChjb21wcmVzc2VkICYmIHByZWZpeF9sZW5ndGggPCBsZW5ndGgpDQorICAgICAgew0KKyAgICAgICAgIHVuY29tcHJlc3NlZF9sZW5ndGggPSBQTkdfU0laRV9NQVg7DQorDQorICAgICAgICAgLyogVE9ETzogYXQgcHJlc2VudCBwbmdfZGVjb21wcmVzc19jaHVuayBpbXBvc2VzIGEgc2luZ2xlIGFwcGxpY2F0aW9uDQorICAgICAgICAgICogbGV2ZWwgbWVtb3J5IGxpbWl0LCB0aGlzIHNob3VsZCBiZSBzcGxpdCB0byBkaWZmZXJlbnQgdmFsdWVzIGZvcg0KKyAgICAgICAgICAqIGlDQ1AgYW5kIHRleHQgY2h1bmtzLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChwbmdfZGVjb21wcmVzc19jaHVuayhwbmdfcHRyLCBsZW5ndGgsIHByZWZpeF9sZW5ndGgsDQorICAgICAgICAgICAgJnVuY29tcHJlc3NlZF9sZW5ndGgsIDEvKnRlcm1pbmF0ZSovKSA9PSBaX1NUUkVBTV9FTkQpDQorICAgICAgICAgICAgYnVmZmVyID0gcG5nX3B0ci0+cmVhZF9idWZmZXI7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGVycm1zZyA9IHBuZ19wdHItPnpzdHJlYW0ubXNnOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgZXJybXNnID0gInRydW5jYXRlZCI7DQorDQorICAgICAgaWYgKGVycm1zZyA9PSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfdGV4dCB0ZXh0Ow0KKw0KKyAgICAgICAgIGJ1ZmZlclt1bmNvbXByZXNzZWRfbGVuZ3RoK3ByZWZpeF9sZW5ndGhdID0gMDsNCisNCisgICAgICAgICBpZiAoY29tcHJlc3NlZCkNCisgICAgICAgICAgICB0ZXh0LmNvbXByZXNzaW9uID0gUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgdGV4dC5jb21wcmVzc2lvbiA9IFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQ7DQorDQorICAgICAgICAgdGV4dC5rZXkgPSAocG5nX2NoYXJwKWJ1ZmZlcjsNCisgICAgICAgICB0ZXh0LmxhbmcgPSAocG5nX2NoYXJwKWJ1ZmZlciArIGxhbmd1YWdlX29mZnNldDsNCisgICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gKHBuZ19jaGFycClidWZmZXIgKyB0cmFuc2xhdGVkX2tleXdvcmRfb2Zmc2V0Ow0KKyAgICAgICAgIHRleHQudGV4dCA9IChwbmdfY2hhcnApYnVmZmVyICsgcHJlZml4X2xlbmd0aDsNCisgICAgICAgICB0ZXh0LnRleHRfbGVuZ3RoID0gMDsNCisgICAgICAgICB0ZXh0Lml0eHRfbGVuZ3RoID0gdW5jb21wcmVzc2VkX2xlbmd0aDsNCisNCisgICAgICAgICBpZiAocG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCAxKSkNCisgICAgICAgICAgICBlcnJtc2cgPSAiaW5zdWZmaWNpZW50IG1lbW9yeSI7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBlbHNlDQorICAgICAgZXJybXNnID0gImJhZCBjb21wcmVzc2lvbiBpbmZvIjsNCisNCisgICBpZiAoZXJybXNnICE9IE5VTEwpDQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCBlcnJtc2cpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorLyogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcG5nX2hhbmRsZV91bmtub3duOyBzZXQgdXAgcG5nX3B0cjo6dW5rbm93bl9jaHVuayAqLw0KK3N0YXRpYyBpbnQNCitwbmdfY2FjaGVfdW5rbm93bl9jaHVuayhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfYWxsb2Nfc2l6ZV90IGxpbWl0ID0gUE5HX1NJWkVfTUFYOw0KKw0KKyAgIGlmIChwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgIT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhKTsNCisgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSBOVUxMOw0KKyAgIH0NCisNCisjICBpZmRlZiBQTkdfU0VUX0NIVU5LX01BTExPQ19MSU1JVF9TVVBQT1JURUQNCisgICAgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ID4gMCAmJg0KKyAgICAgICAgIHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA8IGxpbWl0KQ0KKyAgICAgICAgIGxpbWl0ID0gcG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4Ow0KKw0KKyMgIGVsaWYgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCA+IDANCisgICAgICBpZiAoUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCA8IGxpbWl0KQ0KKyAgICAgICAgIGxpbWl0ID0gUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWDsNCisjICBlbmRpZg0KKw0KKyAgIGlmIChsZW5ndGggPD0gbGltaXQpDQorICAgew0KKyAgICAgIFBOR19DU1RSSU5HX0ZST01fQ0hVTksocG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lLCBwbmdfcHRyLT5jaHVua19uYW1lKTsNCisgICAgICAvKiBUaGUgZm9sbG93aW5nIGlzIHNhZmUgYmVjYXVzZSBvZiB0aGUgUE5HX1NJWkVfTUFYIGluaXQgYWJvdmUgKi8NCisgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLnNpemUgPSAocG5nX3NpemVfdClsZW5ndGgvKlNBRkUqLzsNCisgICAgICAvKiAnbW9kZScgaXMgYSBmbGFnIGFycmF5LCBvbmx5IHRoZSBib3R0b20gZm91ciBiaXRzIG1hdHRlciBoZXJlICovDQorICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5sb2NhdGlvbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5tb2RlLypTQUZFKi87DQorDQorICAgICAgaWYgKGxlbmd0aCA9PSAwKQ0KKyAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBEbyBhICd3YXJuJyBoZXJlIC0gaXQgaXMgaGFuZGxlZCBiZWxvdy4gKi8NCisgICAgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLA0KKyAgICAgICAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpKTsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIGlmIChwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPT0gTlVMTCAmJiBsZW5ndGggPiAwKQ0KKyAgIHsNCisgICAgICAvKiBUaGlzIGlzIGJlbmlnbiBiZWNhdXNlIHdlIGNsZWFuIHVwIGNvcnJlY3RseSAqLw0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7DQorICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAidW5rbm93biBjaHVuayBleGNlZWRzIG1lbW9yeSBsaW1pdHMiKTsNCisgICAgICByZXR1cm4gMDsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBpZiAobGVuZ3RoID4gMCkNCisgICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhLCBsZW5ndGgpOw0KKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOw0KKyAgICAgIHJldHVybiAxOw0KKyAgIH0NCit9DQorI2VuZGlmIC8qIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCAqLw0KKw0KKy8qIEhhbmRsZSBhbiB1bmtub3duLCBvciBrbm93biBidXQgZGlzYWJsZWQsIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2hhbmRsZV91bmtub3duKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgIHBuZ191aW50XzMyIGxlbmd0aCwgaW50IGtlZXApDQorew0KKyAgIGludCBoYW5kbGVkID0gMDsgLyogdGhlIGNodW5rIHdhcyBoYW5kbGVkICovDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3Vua25vd24iKTsNCisNCisjaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgLyogTk9URTogdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBjb2RlIGluIGxpYnBuZy0xLjQuMTIgZXhjZXB0IGZvciBmaXhpbmcNCisgICAgKiB0aGUgYnVnIHdoaWNoIG1lYW50IHRoYXQgc2V0dGluZyBhIG5vbi1kZWZhdWx0IGJlaGF2aW9yIGZvciBhIHNwZWNpZmljDQorICAgICogY2h1bmsgd291bGQgYmUgaWdub3JlZCAodGhlIGRlZmF1bHQgd2FzIGFsd2F5cyB1c2VkIHVubGVzcyBhIHVzZXINCisgICAgKiBjYWxsYmFjayB3YXMgaW5zdGFsbGVkKS4NCisgICAgKg0KKyAgICAqICdrZWVwJyBpcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcsIHRoZSBzZXR0aW5nIGZvcg0KKyAgICAqIHRoaXMgc3BlY2lmaWMgY2h1bmtfbmFtZSwgaWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRCwgaWYgbm90IGl0DQorICAgICogd2lsbCBhbHdheXMgYmUgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUIGFuZCBpdCBuZWVkcyB0byBiZSBzZXQgaGVyZS4NCisgICAgKiBUaGlzIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBsb29rdXANCisgICAgKiBmdW5jdGlvbi4NCisgICAgKi8NCisjICBpZm5kZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRA0KKyMgICAgIGlmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgICAgICAga2VlcCA9IHBuZ19jaHVua191bmtub3duX2hhbmRsaW5nKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpOw0KKyMgICAgIGVuZGlmDQorIyAgZW5kaWYNCisNCisgICAvKiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIHdpbGwgcmVhZCB0aGUgY2h1bmsgb3Igc2tpcCBpdCAoYXQgbGVhc3Qgb25lDQorICAgICogb2YgdGhlc2UgaXMgYWx3YXlzIGRlZmluZWQgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBzd2l0Y2ggb24NCisgICAgKiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpDQorICAgICovDQorIyAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVEDQorICAgICAgLyogVGhlIHVzZXIgY2FsbGJhY2sgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBjaHVuayBrZWVwIHZhbHVlLCBidXQgdGhlDQorICAgICAgICoga2VlcCB2YWx1ZSBpcyBzdGlsbCByZXF1aXJlZCB0byB2YWxpZGF0ZSBhIHNhdmUgb2YgYSBjcml0aWNhbCBjaHVuay4NCisgICAgICAgKi8NCisgICAgICBpZiAocG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuICE9IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgIGlmIChwbmdfY2FjaGVfdW5rbm93bl9jaHVuayhwbmdfcHRyLCBsZW5ndGgpKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBDYWxsYmFjayB0byB1c2VyIHVua25vd24gY2h1bmsgaGFuZGxlciAqLw0KKyAgICAgICAgICAgIGludCByZXQgPSAoKihwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4pKShwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICZwbmdfcHRyLT51bmtub3duX2NodW5rKTsNCisNCisgICAgICAgICAgICAvKiByZXQgaXM6DQorICAgICAgICAgICAgICogbmVnYXRpdmU6IEFuIGVycm9yIG9jY3VyZWQsIHBuZ19jaHVua19lcnJvciB3aWxsIGJlIGNhbGxlZC4NCisgICAgICAgICAgICAgKiAgICAgemVybzogVGhlIGNodW5rIHdhcyBub3QgaGFuZGxlZCwgdGhlIGNodW5rIHdpbGwgYmUgZGlzY2FyZGVkDQorICAgICAgICAgICAgICogICAgICAgICAgIHVubGVzcyBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MgaGFzIGJlZW4gdXNlZCB0byBzZXQNCisgICAgICAgICAgICAgKiAgICAgICAgICAgYSAna2VlcCcgYmVoYXZpb3IgZm9yIHRoaXMgcGFydGljdWxhciBjaHVuaywgaW4gd2hpY2gNCisgICAgICAgICAgICAgKiAgICAgICAgICAgY2FzZSB0aGF0IHdpbGwgYmUgdXNlZC4gIEEgY3JpdGljYWwgY2h1bmsgd2lsbCBjYXVzZSBhbg0KKyAgICAgICAgICAgICAqICAgICAgICAgICBlcnJvciBhdCB0aGlzIHBvaW50IHVubGVzcyBpdCBpcyB0byBiZSBzYXZlZC4NCisgICAgICAgICAgICAgKiBwb3NpdGl2ZTogVGhlIGNodW5rIHdhcyBoYW5kbGVkLCBsaWJwbmcgd2lsbCBpZ25vcmUvZGlzY2FyZCBpdC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAocmV0IDwgMCkNCisgICAgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImVycm9yIGluIHVzZXIgY2h1bmsiKTsNCisNCisgICAgICAgICAgICBlbHNlIGlmIChyZXQgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogSWYgdGhlIGtlZXAgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICduZXZlcicgb3ZlcnJpZGUgaXQsIGJ1dA0KKyAgICAgICAgICAgICAgICAqIHN0aWxsIGVycm9yIG91dCBvbiBjcml0aWNhbCBjaHVua3MgdW5sZXNzIHRoZSBrZWVwIHZhbHVlIGlzDQorICAgICAgICAgICAgICAgICogJ2Fsd2F5cycgIFdoaWxlIHRoaXMgaXMgd2VpcmQgaXQgaXMgdGhlIGJlaGF2aW9yIGluIDEuNC4xMi4NCisgICAgICAgICAgICAgICAgKiBBIHBvc3NpYmxlIGltcHJvdmVtZW50IHdvdWxkIGJlIHRvIG9iZXkgdGhlIHZhbHVlIHNldCBmb3IgdGhlDQorICAgICAgICAgICAgICAgICogY2h1bmssIGJ1dCB0aGlzIHdvdWxkIGJlIGFuIEFQSSBjaGFuZ2UgdGhhdCB3b3VsZCBwcm9iYWJseQ0KKyAgICAgICAgICAgICAgICAqIGRhbWFnZSBzb21lIGFwcGxpY2F0aW9ucy4NCisgICAgICAgICAgICAgICAgKg0KKyAgICAgICAgICAgICAgICAqIFRoZSBwbmdfYXBwX3dhcm5pbmcgYmVsb3cgY2F0Y2hlcyB0aGUgY2FzZSB0aGF0IG1hdHRlcnMsIHdoZXJlDQorICAgICAgICAgICAgICAgICogdGhlIGFwcGxpY2F0aW9uIGhhcyBub3Qgc2V0IHNwZWNpZmljIHNhdmUgb3IgaWdub3JlIGZvciB0aGlzDQorICAgICAgICAgICAgICAgICogY2h1bmsgb3IgZ2xvYmFsIHNhdmUgb3IgaWdub3JlLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGlmIChrZWVwIDwgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFKQ0KKyAgICAgICAgICAgICAgIHsNCisjICAgICAgICAgICAgICAgICBpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRA0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT51bmtub3duX2RlZmF1bHQgPCBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUpDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJTYXZpbmcgdW5rbm93biBjaHVuazoiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2luZyBzYXZlIG9mIGFuIHVuaGFuZGxlZCBjaHVuazsiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwbGVhc2UgY2FsbCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRoIGtlZXAgPSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgKi8NCisgICAgICAgICAgICAgICAgICAgICB9DQorIyAgICAgICAgICAgICAgICAgZW5kaWYNCisgICAgICAgICAgICAgICAgICBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZSAvKiBjaHVuayB3YXMgaGFuZGxlZCAqLw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBoYW5kbGVkID0gMTsNCisgICAgICAgICAgICAgICAvKiBDcml0aWNhbCBjaHVua3MgY2FuIGJlIHNhZmVseSBkaXNjYXJkZWQgYXQgdGhpcyBwb2ludC4gKi8NCisgICAgICAgICAgICAgICBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUjsgLyogaW5zdWZmaWNpZW50IG1lbW9yeSAqLw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgLyogVXNlIHRoZSBTQVZFX1VOS05PV05fQ0hVTktTIGNvZGUgb3Igc2tpcCB0aGUgY2h1bmsgKi8NCisjICBlbmRpZiAvKiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQgKi8NCisNCisjICBpZmRlZiBQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisgICAgICB7DQorICAgICAgICAgLyoga2VlcCBpcyBjdXJyZW50bHkganVzdCB0aGUgcGVyLWNodW5rIHNldHRpbmcsIGlmIHRoZXJlIHdhcyBubw0KKyAgICAgICAgICAqIHNldHRpbmcgY2hhbmdlIGl0IHRvIHRoZSBnbG9iYWwgZGVmYXVsdCBub3cgKG5vdCB0aGF0IHRoaXMgbWF5DQorICAgICAgICAgICogc3RpbGwgYmUgQVNfREVGQVVMVCkgdGhlbiBvYnRhaW4gdGhlIGNhY2hlIG9mIHRoZSBjaHVuayBpZiByZXF1aXJlZCwNCisgICAgICAgICAgKiBpZiBub3Qgc2ltcGx5IHNraXAgdGhlIGNodW5rLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkNCisgICAgICAgICAgICBrZWVwID0gcG5nX3B0ci0+dW5rbm93bl9kZWZhdWx0Ow0KKw0KKyAgICAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8DQorICAgICAgICAgICAgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICYmDQorICAgICAgICAgICAgIFBOR19DSFVOS19BTkNJTExBUlkocG5nX3B0ci0+Y2h1bmtfbmFtZSkpKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIXBuZ19jYWNoZV91bmtub3duX2NodW5rKHBuZ19wdHIsIGxlbmd0aCkpDQorICAgICAgICAgICAgICAga2VlcCA9IFBOR19IQU5ETEVfQ0hVTktfTkVWRVI7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOw0KKyAgICAgIH0NCisjICBlbHNlDQorIyAgICAgaWZuZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRA0KKyMgICAgICAgIGVycm9yIG5vIG1ldGhvZCB0byBzdXBwb3J0IFJFQURfVU5LTk9XTl9DSFVOS1MNCisjICAgICBlbmRpZg0KKw0KKyAgICAgIHsNCisgICAgICAgICAvKiBJZiBoZXJlIHRoZXJlIGlzIG5vIHJlYWQgY2FsbGJhY2sgcG9pbnRlciBzZXQgYW5kIG5vIHN1cHBvcnQgaXMNCisgICAgICAgICAgKiBjb21waWxlZCBpbiB0byBqdXN0IHNhdmUgdGhlIHVua25vd24gY2h1bmtzLCBzbyBzaW1wbHkgc2tpcCB0aGlzDQorICAgICAgICAgICogY2h1bmsuICBJZiAna2VlcCcgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gQVNfREVGQVVMVCBvciBORVZFUiB0aGVuDQorICAgICAgICAgICogdGhlIGFwcCBoYXMgZXJyb25lb3VzbHkgYXNrZWQgZm9yIHVua25vd24gY2h1bmsgc2F2aW5nIHdoZW4gdGhlcmUNCisgICAgICAgICAgKiBpcyBubyBzdXBwb3J0Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChrZWVwID4gUE5HX0hBTkRMRV9DSFVOS19ORVZFUikNCisgICAgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJubyB1bmtub3duIGNodW5rIHN1cHBvcnQgYXZhaWxhYmxlIik7DQorDQorICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICAgICB9DQorIyAgZW5kaWYNCisNCisjICBpZmRlZiBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgICAgLyogTm93IHN0b3JlIHRoZSBjaHVuayBpbiB0aGUgY2h1bmsgbGlzdCBpZiBhcHByb3ByaWF0ZSwgYW5kIGlmIHRoZSBsaW1pdHMNCisgICAgICAgKiBwZXJtaXQgaXQuDQorICAgICAgICovDQorICAgICAgaWYgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwNCisgICAgICAgICAoa2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgJiYNCisgICAgICAgICAgUE5HX0NIVU5LX0FOQ0lMTEFSWShwbmdfcHRyLT5jaHVua19uYW1lKSkpDQorICAgICAgew0KKyMgICAgIGlmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQNCisgICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPSAxOw0KKyAgICAgICAgICAgICAgIHBuZ19jaHVua19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIm5vIHNwYWNlIGluIGNodW5rIGNhY2hlIik7DQorICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovDQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgIC8qIE5PVEU6IHByaW9yIHRvIDEuNi4wIHRoaXMgY2FzZSByZXN1bHRlZCBpbiBhbiB1bmtub3duIGNyaXRpY2FsDQorICAgICAgICAgICAgICAgICogY2h1bmsgYmVpbmcgc2tpcHBlZCwgbm93IHRoZXJlIHdpbGwgYmUgYSBoYXJkIGVycm9yIGJlbG93Lg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIG5vdCBhdCBsaW1pdCAqLw0KKyAgICAgICAgICAgICAgIC0tKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4KTsNCisgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8NCisgICAgICAgICAgICBjYXNlIDA6IC8qIG5vIGxpbWl0ICovDQorIyAgICAgZW5kaWYgLyogUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRCAqLw0KKyAgICAgICAgICAgICAgIC8qIEhlcmUgd2hlbiB0aGUgbGltaXQgaXNuJ3QgcmVhY2hlZCBvciB3aGVuIGxpbWl0cyBhcmUgY29tcGlsZWQNCisgICAgICAgICAgICAgICAgKiBvdXQ7IHN0b3JlIHRoZSBjaHVuay4NCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLA0KKyAgICAgICAgICAgICAgICAgICZwbmdfcHRyLT51bmtub3duX2NodW5rLCAxKTsNCisgICAgICAgICAgICAgICBoYW5kbGVkID0gMTsNCisjICAgICBpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVEDQorICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKyMgICAgIGVuZGlmDQorICAgICAgfQ0KKyMgIGVsc2UgLyogbm8gc3RvcmUgc3VwcG9ydCEgKi8NCisgICAgICBQTkdfVU5VU0VEKGluZm9fcHRyKQ0KKyMgICAgIGVycm9yIHVudGVzdGVkIGNvZGUgKHJlYWRpbmcgdW5rbm93biBjaHVua3Mgd2l0aCBubyBzdG9yZSBzdXBwb3J0KQ0KKyMgIGVuZGlmDQorDQorICAgLyogUmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IgaGFuZGxpbmcgYmVsb3cgdGhlIGNhY2hlZCBkYXRhIChpZiBhbnkpIGNhbiBiZQ0KKyAgICAqIGZyZWVkIG5vdy4gIE5vdGljZSB0aGF0IHRoZSBkYXRhIGlzIG5vdCBmcmVlZCBpZiB0aGVyZSBpcyBhIHBuZ19lcnJvciwgYnV0DQorICAgICogaXQgd2lsbCBiZSBmcmVlZCBieSBkZXN0cm95X3JlYWRfc3RydWN0Lg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgIT0gTlVMTCkNCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpOw0KKyAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7DQorDQorI2Vsc2UgLyogIVBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCAqLw0KKyAgIC8qIFRoZXJlIGlzIG5vIHN1cHBvcnQgdG8gcmVhZCBhbiB1bmtub3duIGNodW5rLCBzbyBqdXN0IHNraXAgaXQuICovDQorICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsNCisgICBQTkdfVU5VU0VEKGluZm9fcHRyKQ0KKyAgIFBOR19VTlVTRUQoa2VlcCkNCisjZW5kaWYgLyogIVBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCAqLw0KKw0KKyAgIC8qIENoZWNrIGZvciB1bmhhbmRsZWQgY3JpdGljYWwgY2h1bmtzICovDQorICAgaWYgKCFoYW5kbGVkICYmIFBOR19DSFVOS19DUklUSUNBTChwbmdfcHRyLT5jaHVua19uYW1lKSkNCisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgInVuaGFuZGxlZCBjcml0aWNhbCBjaHVuayIpOw0KK30NCisNCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgdGhhdCBhIGNodW5rIG5hbWUgaXMgdmFsaWQuDQorICogVGhpcyBmdW5jdGlvbiBjYW4ndCBoYXZlIHRoZSAiY3JpdGljYWwgY2h1bmsgY2hlY2siIGluY29ycG9yYXRlZA0KKyAqIGludG8gaXQsIHNpbmNlIGluIHRoZSBmdXR1cmUgd2Ugd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gY2FsbCB1c2VyDQorICogZnVuY3Rpb25zIHRvIGhhbmRsZSB1bmtub3duIGNyaXRpY2FsIGNodW5rcyBhZnRlciB3ZSBjaGVjayB0aGF0DQorICogdGhlIGNodW5rIG5hbWUgaXRzZWxmIGlzIHZhbGlkLg0KKyAqLw0KKw0KKy8qIEJpdCBoYWNraW5nOiB0aGUgdGVzdCBmb3IgYW4gaW52YWxpZCBieXRlIGluIHRoZSA0IGJ5dGUgY2h1bmsgbmFtZSBpczoNCisgKg0KKyAqICgoYykgPCA2NSB8fCAoYykgPiAxMjIgfHwgKChjKSA+IDkwICYmIChjKSA8IDk3KSkNCisgKi8NCisNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY2hlY2tfY2h1bmtfbmFtZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSkNCit7DQorICAgaW50IGk7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY2hlY2tfY2h1bmtfbmFtZSIpOw0KKw0KKyAgIGZvciAoaT0xOyBpPD00OyArK2kpDQorICAgew0KKyAgICAgIGludCBjID0gY2h1bmtfbmFtZSAmIDB4ZmY7DQorDQorICAgICAgaWYgKGMgPCA2NSB8fCBjID4gMTIyIHx8IChjID4gOTAgJiYgYyA8IDk3KSkNCisgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImludmFsaWQgY2h1bmsgdHlwZSIpOw0KKw0KKyAgICAgIGNodW5rX25hbWUgPj49IDg7DQorICAgfQ0KK30NCisNCisvKiBDb21iaW5lcyB0aGUgcm93IHJlY2VudGx5IHJlYWQgaW4gd2l0aCB0aGUgZXhpc3RpbmcgcGl4ZWxzIGluIHRoZSByb3cuICBUaGlzDQorICogcm91dGluZSB0YWtlcyBjYXJlIG9mIGFscGhhIGFuZCB0cmFuc3BhcmVuY3kgaWYgcmVxdWVzdGVkLiAgVGhpcyByb3V0aW5lIGFsc28NCisgKiBoYW5kbGVzIHRoZSB0d28gbWV0aG9kcyBvZiBwcm9ncmVzc2l2ZSBkaXNwbGF5IG9mIGludGVybGFjZWQgaW1hZ2VzLA0KKyAqIGRlcGVuZGluZyBvbiB0aGUgJ2Rpc3BsYXknIHZhbHVlOyBpZiAnZGlzcGxheScgaXMgdHJ1ZSB0aGVuIHRoZSB3aG9sZSByb3cNCisgKiAoZHApIGlzIGZpbGxlZCBmcm9tIHRoZSBzdGFydCBieSByZXBsaWNhdGluZyB0aGUgYXZhaWxhYmxlIHBpeGVscy4gIElmDQorICogJ2Rpc3BsYXknIGlzIGZhbHNlIG9ubHkgdGhvc2UgcGl4ZWxzIHByZXNlbnQgaW4gdGhlIHBhc3MgYXJlIGZpbGxlZCBpbi4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfY29tYmluZV9yb3cocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBkcCwgaW50IGRpc3BsYXkpDQorew0KKyAgIHVuc2lnbmVkIGludCBwaXhlbF9kZXB0aCA9IHBuZ19wdHItPnRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoOw0KKyAgIHBuZ19jb25zdF9ieXRlcCBzcCA9IHBuZ19wdHItPnJvd19idWYgKyAxOw0KKyAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHBuZ19wdHItPndpZHRoOw0KKyAgIHVuc2lnbmVkIGludCBwYXNzID0gcG5nX3B0ci0+cGFzczsNCisgICBwbmdfYnl0ZXAgZW5kX3B0ciA9IDA7DQorICAgcG5nX2J5dGUgZW5kX2J5dGUgPSAwOw0KKyAgIHVuc2lnbmVkIGludCBlbmRfbWFzazsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jb21iaW5lX3JvdyIpOw0KKw0KKyAgIC8qIEFkZGVkIGluIDEuNS42OiBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIGVudGVyIHRoaXMgcm91dGluZSB1bnRpbCBhdA0KKyAgICAqIGxlYXN0IG9uZSByb3cgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBQTkcgZGF0YSBhbmQgdHJhbnNmb3JtZWQuDQorICAgICovDQorICAgaWYgKHBpeGVsX2RlcHRoID09IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpbnRlcm5hbCByb3cgbG9naWMgZXJyb3IiKTsNCisNCisgICAvKiBBZGRlZCBpbiAxLjUuNDogdGhlIHBpeGVsIGRlcHRoIHNob3VsZCBtYXRjaCB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkNCisgICAgKiBhbnkgY2FsbCB0byBwbmdfcmVhZF91cGRhdGVfaW5mbyBhdCB0aGlzIHBvaW50LiAgRG8gbm90IGNvbnRpbnVlIGlmIHdlIGdvdA0KKyAgICAqIHRoaXMgd3JvbmcuDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPmluZm9fcm93Ynl0ZXMgIT0gMCAmJiBwbmdfcHRyLT5pbmZvX3Jvd2J5dGVzICE9DQorICAgICAgICAgIFBOR19ST1dCWVRFUyhwaXhlbF9kZXB0aCwgcm93X3dpZHRoKSkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludGVybmFsIHJvdyBzaXplIGNhbGN1bGF0aW9uIGVycm9yIik7DQorDQorICAgLyogRG9uJ3QgZXhwZWN0IHRoaXMgdG8gZXZlciBoYXBwZW46ICovDQorICAgaWYgKHJvd193aWR0aCA9PSAwKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW50ZXJuYWwgcm93IHdpZHRoIGVycm9yIik7DQorDQorICAgLyogUHJlc2VydmUgdGhlIGxhc3QgYnl0ZSBpbiBjYXNlcyB3aGVyZSBvbmx5IHBhcnQgb2YgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiwNCisgICAgKiB0aGUgbXVsdGlwbHkgYmVsb3cgbWF5IG92ZXJmbG93LCB3ZSBkb24ndCBjYXJlIGJlY2F1c2UgQU5TSS1DIGd1YXJhbnRlZXMNCisgICAgKiB3ZSBnZXQgdGhlIGxvdyBiaXRzLg0KKyAgICAqLw0KKyAgIGVuZF9tYXNrID0gKHBpeGVsX2RlcHRoICogcm93X3dpZHRoKSAmIDc7DQorICAgaWYgKGVuZF9tYXNrICE9IDApDQorICAgew0KKyAgICAgIC8qIGVuZF9wdHIgPT0gTlVMTCBpcyBhIGZsYWcgdG8gc2F5IGRvIG5vdGhpbmcgKi8NCisgICAgICBlbmRfcHRyID0gZHAgKyBQTkdfUk9XQllURVMocGl4ZWxfZGVwdGgsIHJvd193aWR0aCkgLSAxOw0KKyAgICAgIGVuZF9ieXRlID0gKmVuZF9wdHI7DQorIyAgICAgaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEDQorICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkgLyogbGl0dGxlLWVuZGlhbiBieXRlICovDQorICAgICAgICAgICAgZW5kX21hc2sgPSAweGZmIDw8IGVuZF9tYXNrOw0KKw0KKyAgICAgICAgIGVsc2UgLyogYmlnLWVuZGlhbiBieXRlICovDQorIyAgICAgZW5kaWYNCisgICAgICAgICBlbmRfbWFzayA9IDB4ZmYgPj4gZW5kX21hc2s7DQorICAgICAgLyogZW5kX21hc2sgaXMgbm93IHRoZSBiaXRzIHRvICprZWVwKiBmcm9tIHRoZSBkZXN0aW5hdGlvbiByb3cgKi8NCisgICB9DQorDQorICAgLyogRm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcyB0aGlzIHJlZHVjZXMgdG8gYSBtZW1jcHkoKS4gQSBtZW1jcHkoKQ0KKyAgICAqIHdpbGwgYWxzbyBoYXBwZW4gaWYgaW50ZXJsYWNpbmcgaXNuJ3Qgc3VwcG9ydGVkIG9yIGlmIHRoZSBhcHBsaWNhdGlvbg0KKyAgICAqIGRvZXMgbm90IGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKS4gIEluIHRoZSBsYXR0ZXIgY2FzZXMgdGhlDQorICAgICogY2FsbGVyIGp1c3QgZ2V0cyBhIHNlcXVlbmNlIG9mIHRoZSB1bmV4cGFuZGVkIHJvd3MgZnJvbSBlYWNoIGludGVybGFjZQ0KKyAgICAqIHBhc3MuDQorICAgICovDQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSAmJg0KKyAgICAgIHBhc3MgPCA2ICYmIChkaXNwbGF5ID09IDAgfHwNCisgICAgICAvKiBUaGUgZm9sbG93aW5nIGNvcGllcyBldmVyeXRoaW5nIGZvciAnZGlzcGxheScgb24gcGFzc2VzIDAsIDIgYW5kIDQuICovDQorICAgICAgKGRpc3BsYXkgPT0gMSAmJiAocGFzcyAmIDEpICE9IDApKSkNCisgICB7DQorICAgICAgLyogTmFycm93IGltYWdlcyBtYXkgaGF2ZSBubyBiaXRzIGluIGEgcGFzczsgdGhlIGNhbGxlciBzaG91bGQgaGFuZGxlDQorICAgICAgICogdGhpcywgYnV0IHRoaXMgdGVzdCBpcyBjaGVhcDoNCisgICAgICAgKi8NCisgICAgICBpZiAocm93X3dpZHRoIDw9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKSkNCisgICAgICAgICByZXR1cm47DQorDQorICAgICAgaWYgKHBpeGVsX2RlcHRoIDwgOCkNCisgICAgICB7DQorICAgICAgICAgLyogRm9yIHBpeGVsIGRlcHRocyB1cCB0byA0IGJwcCB0aGUgOC1waXhlbCBtYXNrIGNhbiBiZSBleHBhbmRlZCB0byBmaXQNCisgICAgICAgICAgKiBpbnRvIDMyIGJpdHMsIHRoZW4gYSBzaW5nbGUgbG9vcCBvdmVyIHRoZSBieXRlcyB1c2luZyB0aGUgZm91ciBieXRlDQorICAgICAgICAgICogdmFsdWVzIGluIHRoZSAzMi1iaXQgbWFzayBjYW4gYmUgdXNlZC4gIEZvciB0aGUgJ2Rpc3BsYXknIG9wdGlvbiB0aGUNCisgICAgICAgICAgKiBleHBhbmRlZCBtYXNrIG1heSBhbHNvIG5vdCByZXF1aXJlIGFueSBtYXNraW5nIHdpdGhpbiBhIGJ5dGUuICBUbw0KKyAgICAgICAgICAqIG1ha2UgdGhpcyB3b3JrIHRoZSBQQUNLU1dBUCBvcHRpb24gbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQgLSBpdA0KKyAgICAgICAgICAqIHNpbXBseSByZXF1aXJlcyB0aGUgcGl4ZWxzIHRvIGJlIHJldmVyc2VkIGluIGVhY2ggYnl0ZS4NCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIFRoZSAncmVndWxhcicgY2FzZSByZXF1aXJlcyBhIG1hc2sgZm9yIGVhY2ggb2YgdGhlIGZpcnN0IDYgcGFzc2VzLA0KKyAgICAgICAgICAqIHRoZSAnZGlzcGxheScgY2FzZSBkb2VzIGEgY29weSBmb3IgdGhlIGV2ZW4gcGFzc2VzIGluIHRoZSByYW5nZQ0KKyAgICAgICAgICAqIDAuLjYuICBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCBpbiB0aGUgdGVzdCBhYm92ZS4NCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIFRoZSBtYXNrcyBhcmUgYXJyYW5nZWQgYXMgZm91ciBieXRlcyB3aXRoIHRoZSBmaXJzdCBieXRlIHRvIHVzZSBpbg0KKyAgICAgICAgICAqIHRoZSBsb3dlc3QgYml0cyAobGl0dGxlLWVuZGlhbikgcmVnYXJkbGVzcyBvZiB0aGUgb3JkZXIgKFBBQ0tTV0FQIG9yDQorICAgICAgICAgICogbm90KSBvZiB0aGUgcGl4ZWxzIGluIGVhY2ggYnl0ZS4NCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIE5PVEU6IHRoZSB3aG9sZSBvZiB0aGlzIGxvZ2ljIGRlcGVuZHMgb24gdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uDQorICAgICAgICAgICogb25seSBjYWxsaW5nIGl0IG9uIHJvd3MgYXBwcm9wcmlhdGUgdG8gdGhlIHBhc3MuICBUaGlzIGZ1bmN0aW9uIG9ubHkNCisgICAgICAgICAgKiB1bmRlcnN0YW5kcyB0aGUgJ3gnIGxvZ2ljOyB0aGUgJ3knIGxvZ2ljIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4NCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhbGxvdyBnZW5lcmF0aW9uIG9mIGNvbXBpbGUgdGltZSBjb25zdGFudCBiaXQNCisgICAgICAgICAgKiBtYXNrcyBmb3IgZWFjaCBwaXhlbCBkZXB0aCBhbmQgZWFjaCBwb3NzaWJpbGl0eSBvZiBzd2FwcGVkIG9yIG5vdA0KKyAgICAgICAgICAqIHN3YXBwZWQgYnl0ZXMuICBQYXNzICdwJyBpcyBpbiB0aGUgcmFuZ2UgMC4uNjsgJ3gnLCBhIHBpeGVsIGluZGV4LA0KKyAgICAgICAgICAqIGlzIGluIHRoZSByYW5nZSAwLi43OyBhbmQgdGhlIHJlc3VsdCBpcyAxIGlmIHRoZSBwaXhlbCBpcyB0byBiZQ0KKyAgICAgICAgICAqIGNvcGllZCBpbiB0aGUgcGFzcywgMCBpZiBub3QuICAnUycgaXMgZm9yIHRoZSBzcGFya2xlIG1ldGhvZCwgJ0InDQorICAgICAgICAgICogZm9yIHRoZSBibG9jayBtZXRob2QuDQorICAgICAgICAgICoNCisgICAgICAgICAgKiBXaXRoIHNvbWUgY29tcGlsZXJzIGEgY29tcGlsZSB0aW1lIGV4cHJlc3Npb24gb2YgdGhlIGdlbmVyYWwgZm9ybToNCisgICAgICAgICAgKg0KKyAgICAgICAgICAqICAgIChzaGlmdCA+PSAzMikgPyAoYSA+PiAoc2hpZnQtMzIpKSA6IChiID4+IHNoaWZ0KQ0KKyAgICAgICAgICAqDQorICAgICAgICAgICogUHJvZHVjZXMgd2FybmluZ3Mgd2l0aCB2YWx1ZXMgb2YgJ3NoaWZ0JyBpbiB0aGUgcmFuZ2UgMzMgdG8gNjMNCisgICAgICAgICAgKiBiZWNhdXNlIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlID86IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGJ5DQorICAgICAgICAgICogdGhlIGNvbXBpbGVyIGV2ZW4gdGhvdWdoIGl0IGlzbid0IHVzZWQuICBNaWNyb3NvZnQgVmlzdWFsIEMgKHZhcmlvdXMNCisgICAgICAgICAgKiB2ZXJzaW9ucykgYW5kIHRoZSBJbnRlbCBDIGNvbXBpbGVyIGFyZSBrbm93biB0byBkbyB0aGlzLiAgVG8gYXZvaWQNCisgICAgICAgICAgKiB0aGlzIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VkIGluIDEuNS42LiAgVGhpcyBpcyBhIHRlbXBvcmFyeQ0KKyAgICAgICAgICAqIHNvbHV0aW9uIHRvIGF2b2lkIGRlc3RhYmlsaXppbmcgdGhlIGNvZGUgZHVyaW5nIHRoZSByZWxlYXNlIHByb2Nlc3MuDQorICAgICAgICAgICovDQorIyAgICAgICAgaWYgUE5HX1VTRV9DT01QSUxFX1RJTUVfTUFTS1MNCisjICAgICAgICAgICBkZWZpbmUgUE5HX0xTUih4LHMpICgoeCk+PigocykgJiAweDFmKSkNCisjICAgICAgICAgICBkZWZpbmUgUE5HX0xTTCh4LHMpICgoeCk8PCgocykgJiAweDFmKSkNCisjICAgICAgICBlbHNlDQorIyAgICAgICAgICAgZGVmaW5lIFBOR19MU1IoeCxzKSAoKHgpPj4ocykpDQorIyAgICAgICAgICAgZGVmaW5lIFBOR19MU0woeCxzKSAoKHgpPDwocykpDQorIyAgICAgICAgZW5kaWYNCisjICAgICAgICBkZWZpbmUgU19DT1BZKHAseCkgKCgocCk8NCA/IFBOR19MU1IoMHg4MDA4ODgyMiwoMy0ocCkpKjgrKDctKHgpKSkgOlwNCisgICAgICAgICAgIFBOR19MU1IoMHhhYTU1ZmYwMCwoNy0ocCkpKjgrKDctKHgpKSkpICYgMSkNCisjICAgICAgICBkZWZpbmUgQl9DT1BZKHAseCkgKCgocCk8NCA/IFBOR19MU1IoMHhmZjBmZmYzMywoMy0ocCkpKjgrKDctKHgpKSkgOlwNCisgICAgICAgICAgIFBOR19MU1IoMHhmZjU1ZmYwMCwoNy0ocCkpKjgrKDctKHgpKSkpICYgMSkNCisNCisgICAgICAgICAvKiBSZXR1cm4gYSBtYXNrIGZvciBwYXNzICdwJyBwaXhlbCAneCcgYXQgZGVwdGggJ2QnLiAgVGhlIG1hc2sgaXMNCisgICAgICAgICAgKiBsaXR0bGUgZW5kaWFuIC0gdGhlIGZpcnN0IHBpeGVsIGlzIGF0IGJpdCAwIC0gaG93ZXZlciB0aGUgZXh0cmENCisgICAgICAgICAgKiBwYXJhbWV0ZXIgJ3MnIGNhbiBiZSBzZXQgdG8gY2F1c2UgdGhlIG1hc2sgcG9zaXRpb24gdG8gYmUgc3dhcHBlZA0KKyAgICAgICAgICAqIHdpdGhpbiBlYWNoIGJ5dGUsIHRvIG1hdGNoIHRoZSBQTkcgZm9ybWF0LiAgVGhpcyBpcyBkb25lIGJ5IFhPUiBvZg0KKyAgICAgICAgICAqIHRoZSBzaGlmdCB3aXRoIDcsIDYgb3IgNCBmb3IgYml0IGRlcHRocyAxLCAyIGFuZCA0Lg0KKyAgICAgICAgICAqLw0KKyMgICAgICAgIGRlZmluZSBQSVhFTF9NQVNLKHAseCxkLHMpIFwNCisgICAgICAgICAgICAoUE5HX0xTTCgoKFBOR19MU0woMVUsKGQpKSktMSksKCgoeCkqKGQpKV4oKHMpPzgtKGQpOjApKSkpDQorDQorICAgICAgICAgLyogSGVuY2UgZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlICdibG9jaycgb3IgJ3NwYXJrbGUnIHBpeGVsIGNvcHkgbWFzay4NCisgICAgICAgICAgKi8NCisjICAgICAgICBkZWZpbmUgU19NQVNLeChwLHgsZCxzKSAoU19DT1BZKHAseCk/UElYRUxfTUFTSyhwLHgsZCxzKTowKQ0KKyMgICAgICAgIGRlZmluZSBCX01BU0t4KHAseCxkLHMpIChCX0NPUFkocCx4KT9QSVhFTF9NQVNLKHAseCxkLHMpOjApDQorDQorICAgICAgICAgLyogQ29tYmluZSA4IG9mIHRoZXNlIHRvIGdldCB0aGUgZnVsbCBtYXNrLiAgRm9yIHRoZSAxLWJwcCBhbmQgMi1icHANCisgICAgICAgICAgKiBjYXNlcyB0aGUgcmVzdWx0IG5lZWRzIHJlcGxpY2F0aW5nLCBmb3IgdGhlIDQtYnBwIGNhc2UgdGhlIGFib3ZlDQorICAgICAgICAgICogZ2VuZXJhdGVzIGEgZnVsbCAzMiBiaXRzLg0KKyAgICAgICAgICAqLw0KKyMgICAgICAgIGRlZmluZSBNQVNLX0VYUEFORChtLGQpICgobSkqKChkKT09MT8weDAxMDEwMTAxOigoZCk9PTI/MHgwMDAxMDAwMToxKSkpDQorDQorIyAgICAgICAgZGVmaW5lIFNfTUFTSyhwLGQscykgTUFTS19FWFBBTkQoU19NQVNLeChwLDAsZCxzKSArIFNfTUFTS3gocCwxLGQscykgK1wNCisgICAgICAgICAgICBTX01BU0t4KHAsMixkLHMpICsgU19NQVNLeChwLDMsZCxzKSArIFNfTUFTS3gocCw0LGQscykgK1wNCisgICAgICAgICAgICBTX01BU0t4KHAsNSxkLHMpICsgU19NQVNLeChwLDYsZCxzKSArIFNfTUFTS3gocCw3LGQscyksIGQpDQorDQorIyAgICAgICAgZGVmaW5lIEJfTUFTSyhwLGQscykgTUFTS19FWFBBTkQoQl9NQVNLeChwLDAsZCxzKSArIEJfTUFTS3gocCwxLGQscykgK1wNCisgICAgICAgICAgICBCX01BU0t4KHAsMixkLHMpICsgQl9NQVNLeChwLDMsZCxzKSArIEJfTUFTS3gocCw0LGQscykgK1wNCisgICAgICAgICAgICBCX01BU0t4KHAsNSxkLHMpICsgQl9NQVNLeChwLDYsZCxzKSArIEJfTUFTS3gocCw3LGQscyksIGQpDQorDQorI2lmIFBOR19VU0VfQ09NUElMRV9USU1FX01BU0tTDQorICAgICAgICAgLyogVXRpbGl0eSBtYWNyb3MgdG8gY29uc3RydWN0IGFsbCB0aGUgbWFza3MgZm9yIGEgZGVwdGgvc3dhcA0KKyAgICAgICAgICAqIGNvbWJpbmF0aW9uLiAgVGhlICdzJyBwYXJhbWV0ZXIgc2F5cyB3aGV0aGVyIHRoZSBmb3JtYXQgaXMgUE5HDQorICAgICAgICAgICogKGJpZyBlbmRpYW4gYnl0ZXMpIG9yIG5vdC4gIE9ubHkgdGhlIHRocmVlIG9kZC1udW1iZXJlZCBwYXNzZXMgYXJlDQorICAgICAgICAgICogcmVxdWlyZWQgZm9yIHRoZSBkaXNwbGF5L2Jsb2NrIGFsZ29yaXRobS4NCisgICAgICAgICAgKi8NCisjICAgICAgICBkZWZpbmUgU19NQVNLUyhkLHMpIHsgU19NQVNLKDAsZCxzKSwgU19NQVNLKDEsZCxzKSwgU19NQVNLKDIsZCxzKSxcDQorICAgICAgICAgICAgU19NQVNLKDMsZCxzKSwgU19NQVNLKDQsZCxzKSwgU19NQVNLKDUsZCxzKSB9DQorDQorIyAgICAgICAgZGVmaW5lIEJfTUFTS1MoZCxzKSB7IEJfTUFTSygxLGQscyksIFNfTUFTSygzLGQscyksIFNfTUFTSyg1LGQscykgfQ0KKw0KKyMgICAgICAgIGRlZmluZSBERVBUSF9JTkRFWChkKSAoKGQpPT0xPzA6KChkKT09Mj8xOjIpKQ0KKw0KKyAgICAgICAgIC8qIEhlbmNlIHRoZSBwcmUtY29tcGlsZWQgbWFza3MgaW5kZXhlZCBieSBQQUNLU1dBUCAob3Igbm90KSwgZGVwdGggYW5kDQorICAgICAgICAgICogdGhlbiBwYXNzOg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX3VpbnRfMzIgcm93X21hc2tbMi8qUEFDS1NXQVAqL11bMy8qZGVwdGgqL11bNl0gPQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBMaXR0bGUtZW5kaWFuIGJ5dGUgbWFza3MgZm9yIFBBQ0tTV0FQICovDQorICAgICAgICAgICAgeyBTX01BU0tTKDEsMCksIFNfTUFTS1MoMiwwKSwgU19NQVNLUyg0LDApIH0sDQorICAgICAgICAgICAgLyogTm9ybWFsIChiaWctZW5kaWFuIGJ5dGUpIG1hc2tzIC0gUE5HIGZvcm1hdCAqLw0KKyAgICAgICAgICAgIHsgU19NQVNLUygxLDEpLCBTX01BU0tTKDIsMSksIFNfTUFTS1MoNCwxKSB9DQorICAgICAgICAgfTsNCisNCisgICAgICAgICAvKiBkaXNwbGF5X21hc2sgaGFzIG9ubHkgdGhyZWUgZW50cmllcyBmb3IgdGhlIG9kZCBwYXNzZXMsIHNvIGluZGV4IGJ5DQorICAgICAgICAgICogcGFzcz4+MS4NCisgICAgICAgICAgKi8NCisgICAgICAgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ191aW50XzMyIGRpc3BsYXlfbWFza1syXVszXVszXSA9DQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIExpdHRsZS1lbmRpYW4gYnl0ZSBtYXNrcyBmb3IgUEFDS1NXQVAgKi8NCisgICAgICAgICAgICB7IEJfTUFTS1MoMSwwKSwgQl9NQVNLUygyLDApLCBCX01BU0tTKDQsMCkgfSwNCisgICAgICAgICAgICAvKiBOb3JtYWwgKGJpZy1lbmRpYW4gYnl0ZSkgbWFza3MgLSBQTkcgZm9ybWF0ICovDQorICAgICAgICAgICAgeyBCX01BU0tTKDEsMSksIEJfTUFTS1MoMiwxKSwgQl9NQVNLUyg0LDEpIH0NCisgICAgICAgICB9Ow0KKw0KKyMgICAgICAgIGRlZmluZSBNQVNLKHBhc3MsZGVwdGgsZGlzcGxheSxwbmcpXA0KKyAgICAgICAgICAgICgoZGlzcGxheSk/ZGlzcGxheV9tYXNrW3BuZ11bREVQVEhfSU5ERVgoZGVwdGgpXVtwYXNzPj4xXTpcDQorICAgICAgICAgICAgICAgcm93X21hc2tbcG5nXVtERVBUSF9JTkRFWChkZXB0aCldW3Bhc3NdKQ0KKw0KKyNlbHNlIC8qICFQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyAqLw0KKyAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHJ1bnRpbWUgYWx0ZXJuYXRpdmU6IGl0IHNlZW1zIHVubGlrZWx5IHRoYXQgdGhpcyB3aWxsDQorICAgICAgICAgICogZXZlciBiZSBlaXRoZXIgc21hbGxlciBvciBmYXN0ZXIgdGhhbiB0aGUgY29tcGlsZSB0aW1lIGFwcHJvYWNoLg0KKyAgICAgICAgICAqLw0KKyMgICAgICAgIGRlZmluZSBNQVNLKHBhc3MsZGVwdGgsZGlzcGxheSxwbmcpXA0KKyAgICAgICAgICAgICgoZGlzcGxheSk/Ql9NQVNLKHBhc3MsZGVwdGgscG5nKTpTX01BU0socGFzcyxkZXB0aCxwbmcpKQ0KKyNlbmRpZiAvKiAhUE5HX1VTRV9DT01QSUxFX1RJTUVfTUFTS1MgKi8NCisNCisgICAgICAgICAvKiBVc2UgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gY29weSB0aGUgcmVxdWlyZWQgYml0cy4gIEluIHNvbWUgY2FzZXMNCisgICAgICAgICAgKiB0aGUgYnl0ZSBtYXNrIHdpbGwgYmUgMCBvciAweGZmLCBvcHRpbWl6ZSB0aGVzZSBjYXNlcy4gIHJvd193aWR0aCBpcw0KKyAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgcGl4ZWxzLCBidXQgdGhlIGNvZGUgY29waWVzIGJ5dGVzLCBzbyBpdCBpcyBuZWNlc3NhcnkNCisgICAgICAgICAgKiB0byBzcGVjaWFsIGNhc2UgdGhlIGVuZC4NCisgICAgICAgICAgKi8NCisgICAgICAgICBwbmdfdWludF8zMiBwaXhlbHNfcGVyX2J5dGUgPSA4IC8gcGl4ZWxfZGVwdGg7DQorICAgICAgICAgcG5nX3VpbnRfMzIgbWFzazsNCisNCisjICAgICAgICBpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQ0KKyAgICAgICAgICAgICAgIG1hc2sgPSBNQVNLKHBhc3MsIHBpeGVsX2RlcHRoLCBkaXNwbGF5LCAwKTsNCisNCisgICAgICAgICAgICBlbHNlDQorIyAgICAgICAgZW5kaWYNCisgICAgICAgICAgICBtYXNrID0gTUFTSyhwYXNzLCBwaXhlbF9kZXB0aCwgZGlzcGxheSwgMSk7DQorDQorICAgICAgICAgZm9yICg7OykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgbTsNCisNCisgICAgICAgICAgICAvKiBJdCBkb2Vzbid0IG1hdHRlciBpbiB0aGUgZm9sbG93aW5nIGlmIHBuZ191aW50XzMyIGhhcyBtb3JlIHRoYW4NCisgICAgICAgICAgICAgKiAzMiBiaXRzIGJlY2F1c2UgdGhlIGhpZ2ggYml0cyBhbHdheXMgbWF0Y2ggdGhvc2UgaW4gbTw8MjQ7IGl0IGlzLA0KKyAgICAgICAgICAgICAqIGhvd2V2ZXIsIGVzc2VudGlhbCB0byB1c2UgT1IgaGVyZSwgbm90ICssIGJlY2F1c2Ugb2YgdGhpcy4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBtID0gbWFzazsNCisgICAgICAgICAgICBtYXNrID0gKG0gPj4gOCkgfCAobSA8PCAyNCk7IC8qIHJvdGF0ZSByaWdodCB0byBnb29kIGNvbXBpbGVycyAqLw0KKyAgICAgICAgICAgIG0gJj0gMHhmZjsNCisNCisgICAgICAgICAgICBpZiAobSAhPSAwKSAvKiBzb21ldGhpbmcgdG8gY29weSAqLw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAobSAhPSAweGZmKQ0KKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpkcCAmIH5tKSB8ICgqc3AgJiBtKSk7DQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICpkcCA9ICpzcDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLyogTk9URTogdGhpcyBtYXkgb3ZlcndyaXRlIHRoZSBsYXN0IGJ5dGUgd2l0aCBnYXJiYWdlIGlmIHRoZSBpbWFnZQ0KKyAgICAgICAgICAgICAqIGlzIG5vdCBhbiBleGFjdCBudW1iZXIgb2YgYnl0ZXMgd2lkZTsgbGlicG5nIGhhcyBhbHdheXMgZG9uZQ0KKyAgICAgICAgICAgICAqIHRoaXMuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKHJvd193aWR0aCA8PSBwaXhlbHNfcGVyX2J5dGUpDQorICAgICAgICAgICAgICAgYnJlYWs7IC8qIE1heSBuZWVkIHRvIHJlc3RvcmUgcGFydCBvZiB0aGUgbGFzdCBieXRlICovDQorDQorICAgICAgICAgICAgcm93X3dpZHRoIC09IHBpeGVsc19wZXJfYnl0ZTsNCisgICAgICAgICAgICArK2RwOw0KKyAgICAgICAgICAgICsrc3A7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIC8qIHBpeGVsX2RlcHRoID49IDggKi8NCisgICAgICB7DQorICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzX3RvX2NvcHksIGJ5dGVzX3RvX2p1bXA7DQorDQorICAgICAgICAgLyogVmFsaWRhdGUgdGhlIGRlcHRoIC0gaXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggKi8NCisgICAgICAgICBpZiAocGl4ZWxfZGVwdGggJiA3KQ0KKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW52YWxpZCB1c2VyIHRyYW5zZm9ybSBwaXhlbCBkZXB0aCIpOw0KKw0KKyAgICAgICAgIHBpeGVsX2RlcHRoID4+PSAzOyAvKiBub3cgaW4gYnl0ZXMgKi8NCisgICAgICAgICByb3dfd2lkdGggKj0gcGl4ZWxfZGVwdGg7DQorDQorICAgICAgICAgLyogUmVnYXJkbGVzcyBvZiBwYXNzIG51bWJlciB0aGUgQWRhbSA3IGludGVybGFjZSBhbHdheXMgcmVzdWx0cyBpbiBhDQorICAgICAgICAgICogZml4ZWQgbnVtYmVyIG9mIHBpeGVscyB0byBjb3B5IHRoZW4gdG8gc2tpcC4gIFRoZXJlIG1heSBiZSBhDQorICAgICAgICAgICogZGlmZmVyZW50IG51bWJlciBvZiBwaXhlbHMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgdGhvdWdoLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpICogcGl4ZWxfZGVwdGg7DQorDQorICAgICAgICAgICAgcm93X3dpZHRoIC09IG9mZnNldDsNCisgICAgICAgICAgICBkcCArPSBvZmZzZXQ7DQorICAgICAgICAgICAgc3AgKz0gb2Zmc2V0Ow0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBXb3JrIG91dCB0aGUgYnl0ZXMgdG8gY29weS4gKi8NCisgICAgICAgICBpZiAoZGlzcGxheSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogV2hlbiBkb2luZyB0aGUgJ2Jsb2NrJyBhbGdvcml0aG0gdGhlIHBpeGVsIGluIHRoZSBwYXNzIGdldHMNCisgICAgICAgICAgICAgKiByZXBsaWNhdGVkIHRvIGFkamFjZW50IHBpeGVscy4gIFRoaXMgaXMgd2h5IHRoZSBldmVuICgwLDIsNCw2KQ0KKyAgICAgICAgICAgICAqIHBhc3NlcyBhcmUgc2tpcHBlZCBhYm92ZSAtIHRoZSBlbnRpcmUgZXhwYW5kZWQgcm93IGlzIGNvcGllZC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBieXRlc190b19jb3B5ID0gKDE8PCgoNi1wYXNzKT4+MSkpICogcGl4ZWxfZGVwdGg7DQorDQorICAgICAgICAgICAgLyogQnV0IGRvbid0IGFsbG93IHRoaXMgbnVtYmVyIHRvIGV4Y2VlZCB0aGUgYWN0dWFsIHJvdyB3aWR0aC4gKi8NCisgICAgICAgICAgICBpZiAoYnl0ZXNfdG9fY29weSA+IHJvd193aWR0aCkNCisgICAgICAgICAgICAgICBieXRlc190b19jb3B5ID0gcm93X3dpZHRoOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlIC8qIG5vcm1hbCByb3c7IEFkYW03IG9ubHkgZXZlciBnaXZlcyB1cyBvbmUgcGl4ZWwgdG8gY29weS4gKi8NCisgICAgICAgICAgICBieXRlc190b19jb3B5ID0gcGl4ZWxfZGVwdGg7DQorDQorICAgICAgICAgLyogSW4gQWRhbTcgdGhlcmUgaXMgYSBjb25zdGFudCBvZmZzZXQgYmV0d2VlbiB3aGVyZSB0aGUgcGl4ZWxzIGdvLiAqLw0KKyAgICAgICAgIGJ5dGVzX3RvX2p1bXAgPSBQTkdfUEFTU19DT0xfT0ZGU0VUKHBhc3MpICogcGl4ZWxfZGVwdGg7DQorDQorICAgICAgICAgLyogQW5kIHNpbXBseSBjb3B5IHRoZXNlIGJ5dGVzLiAgU29tZSBvcHRpbWl6YXRpb24gaXMgcG9zc2libGUgaGVyZSwNCisgICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mICdieXRlc190b19jb3B5Jy4gIFNwZWNpYWwgY2FzZSB0aGUgbG93DQorICAgICAgICAgICogYnl0ZSBjb3VudHMsIHdoaWNoIHdlIGtub3cgdG8gYmUgZnJlcXVlbnQuDQorICAgICAgICAgICoNCisgICAgICAgICAgKiBOb3RpY2UgdGhhdCB0aGVzZSBjYXNlcyBhbGwgJ3JldHVybicgcmF0aGVyIHRoYW4gJ2JyZWFrJyAtIHRoaXMNCisgICAgICAgICAgKiBhdm9pZHMgYW4gdW5uZWNlc3NhcnkgdGVzdCBvbiB3aGV0aGVyIHRvIHJlc3RvcmUgdGhlIGxhc3QgYnl0ZQ0KKyAgICAgICAgICAqIGJlbG93Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHN3aXRjaCAoYnl0ZXNfdG9fY29weSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgIGZvciAoOzspDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICpkcCA9ICpzcDsNCisNCisgICAgICAgICAgICAgICAgICBpZiAocm93X3dpZHRoIDw9IGJ5dGVzX3RvX2p1bXApDQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgICAgICAgICAgIGRwICs9IGJ5dGVzX3RvX2p1bXA7DQorICAgICAgICAgICAgICAgICAgc3AgKz0gYnl0ZXNfdG9fanVtcDsNCisgICAgICAgICAgICAgICAgICByb3dfd2lkdGggLT0gYnl0ZXNfdG9fanVtcDsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2YgYSBwYXJ0aWFsIGNvcHkgYXQgdGhlIGVuZCBoZXJlOyB0aGlzDQorICAgICAgICAgICAgICAgICogc2xvd3MgdGhlIGNvZGUgZG93biBzb21ld2hhdC4NCisgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBkcFswXSA9IHNwWzBdLCBkcFsxXSA9IHNwWzFdOw0KKw0KKyAgICAgICAgICAgICAgICAgIGlmIChyb3dfd2lkdGggPD0gYnl0ZXNfdG9fanVtcCkNCisgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorDQorICAgICAgICAgICAgICAgICAgc3AgKz0gYnl0ZXNfdG9fanVtcDsNCisgICAgICAgICAgICAgICAgICBkcCArPSBieXRlc190b19qdW1wOw0KKyAgICAgICAgICAgICAgICAgIHJvd193aWR0aCAtPSBieXRlc190b19qdW1wOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB3aGlsZSAocm93X3dpZHRoID4gMSk7DQorDQorICAgICAgICAgICAgICAgLyogQW5kIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBieXRlIGxlZnQgYXQgdGhpcyBwb2ludDogKi8NCisgICAgICAgICAgICAgICAqZHAgPSAqc3A7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICAgICAvKiBUaGlzIGNhbiBvbmx5IGJlIHRoZSBSR0IgY2FzZSwgc28gZWFjaCBjb3B5IGlzIGV4YWN0bHkgb25lDQorICAgICAgICAgICAgICAgICogcGl4ZWwgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2hlY2sgZm9yIGEgcGFydGlhbCBjb3B5Lg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIGZvcig7OykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgZHBbMF0gPSBzcFswXSwgZHBbMV0gPSBzcFsxXSwgZHBbMl0gPSBzcFsyXTsNCisNCisgICAgICAgICAgICAgICAgICBpZiAocm93X3dpZHRoIDw9IGJ5dGVzX3RvX2p1bXApDQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgICAgICAgICAgIHNwICs9IGJ5dGVzX3RvX2p1bXA7DQorICAgICAgICAgICAgICAgICAgZHAgKz0gYnl0ZXNfdG9fanVtcDsNCisgICAgICAgICAgICAgICAgICByb3dfd2lkdGggLT0gYnl0ZXNfdG9fanVtcDsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZGVmYXVsdDoNCisjaWYgUE5HX0FMSUdOX1RZUEUgIT0gUE5HX0FMSUdOX05PTkUNCisgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgZG91YmxlIGJ5dGUgYWxpZ25tZW50IGFuZCwgaWYgcG9zc2libGUsIHVzZSBhDQorICAgICAgICAgICAgICAgICogMTYtYml0IGNvcHkuICBEb24ndCBhdHRlbXB0IHRoaXMgZm9yIG5hcnJvdyBpbWFnZXMgLSBvbmVzIHRoYXQNCisgICAgICAgICAgICAgICAgKiBhcmUgbGVzcyB0aGFuIGFuIGludGVybGFjZSBwYW5lbCB3aWRlLiAgRG9uJ3QgYXR0ZW1wdCBpdCBmb3INCisgICAgICAgICAgICAgICAgKiB3aWRlIGJ5dGVzX3RvX2NvcHkgZWl0aGVyIC0gdXNlIHRoZSBtZW1jcHkgdGhlcmUuDQorICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgaWYgKGJ5dGVzX3RvX2NvcHkgPCAxNiAvKmVsc2UgdXNlIG1lbWNweSovICYmDQorICAgICAgICAgICAgICAgICAgcG5nX2lzYWxpZ25lZChkcCwgcG5nX3VpbnRfMTYpICYmDQorICAgICAgICAgICAgICAgICAgcG5nX2lzYWxpZ25lZChzcCwgcG5nX3VpbnRfMTYpICYmDQorICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fY29weSAlIChzaXplb2YgKHBuZ191aW50XzE2KSkgPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2p1bXAgJSAoc2l6ZW9mIChwbmdfdWludF8xNikpID09IDApDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIC8qIEV2ZXJ5dGhpbmcgaXMgYWxpZ25lZCBmb3IgcG5nX3VpbnRfMTYgY29waWVzLCBidXQgdHJ5IGZvcg0KKyAgICAgICAgICAgICAgICAgICAqIHBuZ191aW50XzMyIGZpcnN0Lg0KKyAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgIGlmIChwbmdfaXNhbGlnbmVkKGRwLCBwbmdfdWludF8zMikgJiYNCisgICAgICAgICAgICAgICAgICAgICBwbmdfaXNhbGlnbmVkKHNwLCBwbmdfdWludF8zMikgJiYNCisgICAgICAgICAgICAgICAgICAgICBieXRlc190b19jb3B5ICUgKHNpemVvZiAocG5nX3VpbnRfMzIpKSA9PSAwICYmDQorICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fanVtcCAlIChzaXplb2YgKHBuZ191aW50XzMyKSkgPT0gMCkNCisgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzJwIGRwMzIgPSBwbmdfYWxpZ25jYXN0KHBuZ191aW50XzMycCxkcCk7DQorICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMzJwIHNwMzIgPSBwbmdfYWxpZ25jYXN0Y29uc3QoDQorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMzJwLCBzcCk7DQorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNraXAgPSAoYnl0ZXNfdG9fanVtcC1ieXRlc190b19jb3B5KSAvDQorICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiAocG5nX3VpbnRfMzIpKTsNCisNCisgICAgICAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYyA9IGJ5dGVzX3RvX2NvcHk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRwMzIrKyA9ICpzcDMyKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAtPSAoc2l6ZW9mIChwbmdfdWludF8zMikpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYyA+IDApOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dfd2lkdGggPD0gYnl0ZXNfdG9fanVtcCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgZHAzMiArPSBza2lwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNwMzIgKz0gc2tpcDsNCisgICAgICAgICAgICAgICAgICAgICAgICByb3dfd2lkdGggLT0gYnl0ZXNfdG9fanVtcDsNCisgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJ5dGVzX3RvX2NvcHkgPD0gcm93X3dpZHRoKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdG8gaGVyZSB3aGVuIHRoZSByb3dfd2lkdGggdHJ1bmNhdGVzIHRoZSBmaW5hbCBjb3B5Lg0KKyAgICAgICAgICAgICAgICAgICAgICAqIFRoZXJlIHdpbGwgYmUgMS0zIGJ5dGVzIGxlZnQgdG8gY29weSwgc28gZG9uJ3QgdHJ5IHRoZQ0KKyAgICAgICAgICAgICAgICAgICAgICAqIDE2LWJpdCBsb29wIGJlbG93Lg0KKyAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgIGRwID0gKHBuZ19ieXRlcClkcDMyOw0KKyAgICAgICAgICAgICAgICAgICAgIHNwID0gKHBuZ19jb25zdF9ieXRlcClzcDMyOw0KKyAgICAgICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsNCisgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1yb3dfd2lkdGggPiAwKTsNCisgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIC8qIEVsc2UgZG8gaXQgaW4gMTYtYml0IHF1YW50aXRpZXMsIGJ1dCBvbmx5IGlmIHRoZSBzaXplIGlzDQorICAgICAgICAgICAgICAgICAgICogbm90IHRvbyBsYXJnZS4NCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2cCBkcDE2ID0gcG5nX2FsaWduY2FzdChwbmdfdWludF8xNnAsIGRwKTsNCisgICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAgc3AxNiA9IHBuZ19hbGlnbmNhc3Rjb25zdCgNCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAsIHNwKTsNCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2tpcCA9IChieXRlc190b19qdW1wLWJ5dGVzX3RvX2NvcHkpIC8NCisgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mIChwbmdfdWludF8xNikpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjID0gYnl0ZXNfdG9fY29weTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHAxNisrID0gKnNwMTYrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjIC09IChzaXplb2YgKHBuZ191aW50XzE2KSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjID4gMCk7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd193aWR0aCA8PSBieXRlc190b19qdW1wKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBkcDE2ICs9IHNraXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3AxNiArPSBza2lwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd193aWR0aCAtPSBieXRlc190b19qdW1wOw0KKyAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNfdG9fY29weSA8PSByb3dfd2lkdGgpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiByb3cgLSAxIGJ5dGUgbGVmdCwgYnl0ZXNfdG9fY29weSA+IHJvd193aWR0aDogKi8NCisgICAgICAgICAgICAgICAgICAgICBkcCA9IChwbmdfYnl0ZXApZHAxNjsNCisgICAgICAgICAgICAgICAgICAgICBzcCA9IChwbmdfY29uc3RfYnl0ZXApc3AxNjsNCisgICAgICAgICAgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7DQorICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tcm93X3dpZHRoID4gMCk7DQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICB9DQorI2VuZGlmIC8qIFBOR19BTElHTl8gY29kZSAqLw0KKw0KKyAgICAgICAgICAgICAgIC8qIFRoZSB0cnVlIGRlZmF1bHQgLSB1c2UgYSBtZW1jcHk6ICovDQorICAgICAgICAgICAgICAgZm9yICg7OykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgbWVtY3B5KGRwLCBzcCwgYnl0ZXNfdG9fY29weSk7DQorDQorICAgICAgICAgICAgICAgICAgaWYgKHJvd193aWR0aCA8PSBieXRlc190b19qdW1wKQ0KKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisNCisgICAgICAgICAgICAgICAgICBzcCArPSBieXRlc190b19qdW1wOw0KKyAgICAgICAgICAgICAgICAgIGRwICs9IGJ5dGVzX3RvX2p1bXA7DQorICAgICAgICAgICAgICAgICAgcm93X3dpZHRoIC09IGJ5dGVzX3RvX2p1bXA7DQorICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzX3RvX2NvcHkgPiByb3dfd2lkdGgpDQorICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fY29weSA9IHJvd193aWR0aDsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIC8qIE5PVCBSRUFDSEVEKi8NCisgICAgICB9IC8qIHBpeGVsX2RlcHRoID49IDggKi8NCisNCisgICAgICAvKiBIZXJlIGlmIHBpeGVsX2RlcHRoIDwgOCB0byBjaGVjayAnZW5kX3B0cicgYmVsb3cuICovDQorICAgfQ0KKyAgIGVsc2UNCisjZW5kaWYNCisNCisgICAvKiBJZiBoZXJlIHRoZW4gdGhlIHN3aXRjaCBhYm92ZSB3YXNuJ3QgdXNlZCBzbyBqdXN0IG1lbWNweSB0aGUgd2hvbGUgcm93DQorICAgICogZnJvbSB0aGUgdGVtcG9yYXJ5IHJvdyBidWZmZXIgKG5vdGljZSB0aGF0IHRoaXMgb3ZlcndyaXRlcyB0aGUgZW5kIG9mIHRoZQ0KKyAgICAqIGRlc3RpbmF0aW9uIHJvdyBpZiBpdCBpcyBhIHBhcnRpYWwgYnl0ZS4pDQorICAgICovDQorICAgbWVtY3B5KGRwLCBzcCwgUE5HX1JPV0JZVEVTKHBpeGVsX2RlcHRoLCByb3dfd2lkdGgpKTsNCisNCisgICAvKiBSZXN0b3JlIHRoZSBvdmVyd3JpdHRlbiBiaXRzIGZyb20gdGhlIGxhc3QgYnl0ZSBpZiBuZWNlc3NhcnkuICovDQorICAgaWYgKGVuZF9wdHIgIT0gTlVMTCkNCisgICAgICAqZW5kX3B0ciA9IChwbmdfYnl0ZSkoKGVuZF9ieXRlICYgZW5kX21hc2spIHwgKCplbmRfcHRyICYgfmVuZF9tYXNrKSk7DQorfQ0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MsDQorICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zIC8qIEJlY2F1c2UgdGhlc2UgbWF5IGFmZmVjdCB0aGUgYnl0ZSBsYXlvdXQgKi8pDQorew0KKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovDQorICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9Ow0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfaW50ZXJsYWNlIik7DQorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ191aW50XzMyIGZpbmFsX3dpZHRoOw0KKw0KKyAgICAgIGZpbmFsX3dpZHRoID0gcm93X2luZm8tPndpZHRoICogcG5nX3Bhc3NfaW5jW3Bhc3NdOw0KKw0KKyAgICAgIHN3aXRjaCAocm93X2luZm8tPnBpeGVsX2RlcHRoKQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMyk7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKChmaW5hbF93aWR0aCAtIDEpID4+IDMpOw0KKyAgICAgICAgICAgIGludCBzc2hpZnQsIGRzaGlmdDsNCisgICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOw0KKyAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsNCisgICAgICAgICAgICBwbmdfYnl0ZSB2Ow0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorICAgICAgICAgICAgaW50IGo7DQorDQorI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRA0KKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgocm93X2luZm8tPndpZHRoICsgNykgJiAweDA3KTsNCisgICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKGZpbmFsX3dpZHRoICsgNykgJiAweDA3KTsNCisgICAgICAgICAgICAgICAgc19zdGFydCA9IDc7DQorICAgICAgICAgICAgICAgIHNfZW5kID0gMDsNCisgICAgICAgICAgICAgICAgc19pbmMgPSAtMTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZQ0KKyNlbmRpZg0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc3NoaWZ0ID0gNyAtIChpbnQpKChyb3dfaW5mby0+d2lkdGggKyA3KSAmIDB4MDcpOw0KKyAgICAgICAgICAgICAgICBkc2hpZnQgPSA3IC0gKGludCkoKGZpbmFsX3dpZHRoICsgNykgJiAweDA3KTsNCisgICAgICAgICAgICAgICAgc19zdGFydCA9IDA7DQorICAgICAgICAgICAgICAgIHNfZW5kID0gNzsNCisgICAgICAgICAgICAgICAgc19pbmMgPSAxOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHYgPSAocG5nX2J5dGUpKCgqc3AgPj4gc3NoaWZ0KSAmIDB4MDEpOw0KKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gKmRwICYgKDB4N2Y3ZiA+PiAoNyAtIGRzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgIHRtcCB8PSB2IDw8IGRzaGlmdDsNCisgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgICAgIGlmIChkc2hpZnQgPT0gc19lbmQpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCA9IHNfc3RhcnQ7DQorICAgICAgICAgICAgICAgICAgICAgZHAtLTsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgaWYgKHNzaGlmdCA9PSBzX2VuZCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ID0gc19zdGFydDsNCisgICAgICAgICAgICAgICAgICBzcC0tOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ICs9IHNfaW5jOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3VpbnRfMzIpKChyb3dfaW5mby0+d2lkdGggLSAxKSA+PiAyKTsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3VpbnRfMzIpKChmaW5hbF93aWR0aCAtIDEpID4+IDIpOw0KKyAgICAgICAgICAgIGludCBzc2hpZnQsIGRzaGlmdDsNCisgICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOw0KKyAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQNCisgICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoKHJvd19pbmZvLT53aWR0aCArIDMpICYgMHgwMykgPDwgMSk7DQorICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKChmaW5hbF93aWR0aCArIDMpICYgMHgwMykgPDwgMSk7DQorICAgICAgICAgICAgICAgc19zdGFydCA9IDY7DQorICAgICAgICAgICAgICAgc19lbmQgPSAwOw0KKyAgICAgICAgICAgICAgIHNfaW5jID0gLTI7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisjZW5kaWYNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKDMgLSAoKHJvd19pbmZvLT53aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOw0KKyAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgzIC0gKChmaW5hbF93aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOw0KKyAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOw0KKyAgICAgICAgICAgICAgIHNfZW5kID0gNjsNCisgICAgICAgICAgICAgICBzX2luYyA9IDI7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX2J5dGUgdjsNCisgICAgICAgICAgICAgICBpbnQgajsNCisNCisgICAgICAgICAgICAgICB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweDAzKTsNCisgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwganN0b3A7IGorKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpkcCAmICgweDNmM2YgPj4gKDYgLSBkc2hpZnQpKTsNCisgICAgICAgICAgICAgICAgICB0bXAgfD0gdiA8PCBkc2hpZnQ7DQorICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSh0bXAgJiAweGZmKTsNCisNCisgICAgICAgICAgICAgICAgICBpZiAoZHNoaWZ0ID09IHNfZW5kKQ0KKyAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICBkc2hpZnQgPSBzX3N0YXJ0Ow0KKyAgICAgICAgICAgICAgICAgICAgIGRwLS07DQorICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHNzaGlmdCA9IHNfc3RhcnQ7DQorICAgICAgICAgICAgICAgICAgc3AtLTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHNzaGlmdCArPSBzX2luYzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfaW5mby0+d2lkdGggLSAxKSA+PiAxKTsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoKGZpbmFsX3dpZHRoIC0gMSkgPj4gMSk7DQorICAgICAgICAgICAgaW50IHNzaGlmdCwgZHNoaWZ0Ow0KKyAgICAgICAgICAgIGludCBzX3N0YXJ0LCBzX2VuZCwgc19pbmM7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107DQorDQorI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRA0KKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSA8PCAyKTsNCisgICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoKGZpbmFsX3dpZHRoICsgMSkgJiAweDAxKSA8PCAyKTsNCisgICAgICAgICAgICAgICBzX3N0YXJ0ID0gNDsNCisgICAgICAgICAgICAgICBzX2VuZCA9IDA7DQorICAgICAgICAgICAgICAgc19pbmMgPSAtNDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZQ0KKyNlbmRpZg0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoMSAtICgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7DQorICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKDEgLSAoKGZpbmFsX3dpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7DQorICAgICAgICAgICAgICAgc19zdGFydCA9IDA7DQorICAgICAgICAgICAgICAgc19lbmQgPSA0Ow0KKyAgICAgICAgICAgICAgIHNfaW5jID0gNDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19pbmZvLT53aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZSB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweDBmKTsNCisgICAgICAgICAgICAgICBpbnQgajsNCisNCisgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwganN0b3A7IGorKykNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9ICpkcCAmICgweGYwZiA+PiAoNCAtIGRzaGlmdCkpOw0KKyAgICAgICAgICAgICAgICAgIHRtcCB8PSB2IDw8IGRzaGlmdDsNCisgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKHRtcCAmIDB4ZmYpOw0KKw0KKyAgICAgICAgICAgICAgICAgIGlmIChkc2hpZnQgPT0gc19lbmQpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCA9IHNfc3RhcnQ7DQorICAgICAgICAgICAgICAgICAgICAgZHAtLTsNCisgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgaWYgKHNzaGlmdCA9PSBzX2VuZCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ID0gc19zdGFydDsNCisgICAgICAgICAgICAgICAgICBzcC0tOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ICs9IHNfaW5jOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3NpemVfdCBwaXhlbF9ieXRlcyA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggPj4gMyk7DQorDQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd19pbmZvLT53aWR0aCAtIDEpDQorICAgICAgICAgICAgICAgICogcGl4ZWxfYnl0ZXM7DQorDQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKGZpbmFsX3dpZHRoIC0gMSkgKiBwaXhlbF9ieXRlczsNCisNCisgICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHZbOF07IC8qIFNBRkU7IHBpeGVsX2RlcHRoIGRvZXMgbm90IGV4Y2VlZCA2NCAqLw0KKyAgICAgICAgICAgICAgIGludCBqOw0KKw0KKyAgICAgICAgICAgICAgIG1lbWNweSh2LCBzcCwgcGl4ZWxfYnl0ZXMpOw0KKw0KKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBtZW1jcHkoZHAsIHYsIHBpeGVsX2J5dGVzKTsNCisgICAgICAgICAgICAgICAgICBkcCAtPSBwaXhlbF9ieXRlczsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgc3AgLT0gcGl4ZWxfYnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcm93X2luZm8tPndpZHRoID0gZmluYWxfd2lkdGg7DQorICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgZmluYWxfd2lkdGgpOw0KKyAgIH0NCisjaWZuZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRA0KKyAgIFBOR19VTlVTRUQodHJhbnNmb3JtYXRpb25zKSAgLyogU2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovDQorI2VuZGlmDQorfQ0KKyNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8NCisNCitzdGF0aWMgdm9pZA0KK3BuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csDQorICAgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KQ0KK3sNCisgICBwbmdfc2l6ZV90IGk7DQorICAgcG5nX3NpemVfdCBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsNCisgICB1bnNpZ25lZCBpbnQgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7DQorICAgcG5nX2J5dGVwIHJwID0gcm93ICsgYnBwOw0KKw0KKyAgIFBOR19VTlVTRUQocHJldl9yb3cpDQorDQorICAgZm9yIChpID0gYnBwOyBpIDwgaXN0b3A7IGkrKykNCisgICB7DQorICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIChpbnQpKCoocnAtYnBwKSkpICYgMHhmZik7DQorICAgICAgcnArKzsNCisgICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQorcG5nX3JlYWRfZmlsdGVyX3Jvd191cChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LA0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdykNCit7DQorICAgcG5nX3NpemVfdCBpOw0KKyAgIHBuZ19zaXplX3QgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7DQorICAgcG5nX2J5dGVwIHJwID0gcm93Ow0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHByZXZfcm93Ow0KKw0KKyAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQ0KKyAgIHsNCisgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsgKGludCkoKnBwKyspKSAmIDB4ZmYpOw0KKyAgICAgIHJwKys7DQorICAgfQ0KK30NCisNCitzdGF0aWMgdm9pZA0KK3BuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csDQorICAgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KQ0KK3sNCisgICBwbmdfc2l6ZV90IGk7DQorICAgcG5nX2J5dGVwIHJwID0gcm93Ow0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHByZXZfcm93Ow0KKyAgIHVuc2lnbmVkIGludCBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsNCisgICBwbmdfc2l6ZV90IGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzIC0gYnBwOw0KKw0KKyAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKykNCisgICB7DQorICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArDQorICAgICAgICAgKChpbnQpKCpwcCsrKSAvIDIgKSkgJiAweGZmKTsNCisNCisgICAgICBycCsrOw0KKyAgIH0NCisNCisgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykNCisgICB7DQorICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArDQorICAgICAgICAgKGludCkoKnBwKysgKyAqKHJwLWJwcCkpIC8gMiApICYgMHhmZik7DQorDQorICAgICAgcnArKzsNCisgICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQorcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aF8xYnl0ZV9waXhlbChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LA0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdykNCit7DQorICAgcG5nX2J5dGVwIHJwX2VuZCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsNCisgICBpbnQgYSwgYzsNCisNCisgICAvKiBGaXJzdCBwaXhlbC9ieXRlICovDQorICAgYyA9ICpwcmV2X3JvdysrOw0KKyAgIGEgPSAqcm93ICsgYzsNCisgICAqcm93KysgPSAocG5nX2J5dGUpYTsNCisNCisgICAvKiBSZW1haW5kZXIgKi8NCisgICB3aGlsZSAocm93IDwgcnBfZW5kKQ0KKyAgIHsNCisgICAgICBpbnQgYiwgcGEsIHBiLCBwYywgcDsNCisNCisgICAgICBhICY9IDB4ZmY7IC8qIEZyb20gcHJldmlvdXMgaXRlcmF0aW9uIG9yIHN0YXJ0ICovDQorICAgICAgYiA9ICpwcmV2X3JvdysrOw0KKw0KKyAgICAgIHAgPSBiIC0gYzsNCisgICAgICBwYyA9IGEgLSBjOw0KKw0KKyMgICAgIGlmZGVmIFBOR19VU0VfQUJTDQorICAgICAgICAgcGEgPSBhYnMocCk7DQorICAgICAgICAgcGIgPSBhYnMocGMpOw0KKyAgICAgICAgIHBjID0gYWJzKHAgKyBwYyk7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7DQorICAgICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsNCisgICAgICAgICBwYyA9IChwICsgcGMpIDwgMCA/IC0ocCArIHBjKSA6IHAgKyBwYzsNCisjICAgICBlbmRpZg0KKw0KKyAgICAgIC8qIEZpbmQgdGhlIGJlc3QgcHJlZGljdG9yLCB0aGUgbGVhc3Qgb2YgcGEsIHBiLCBwYyBmYXZvcmluZyB0aGUgZWFybGllcg0KKyAgICAgICAqIG9uZXMgaW4gdGhlIGNhc2Ugb2YgYSB0aWUuDQorICAgICAgICovDQorICAgICAgaWYgKHBiIDwgcGEpIHBhID0gcGIsIGEgPSBiOw0KKyAgICAgIGlmIChwYyA8IHBhKSBhID0gYzsNCisNCisgICAgICAvKiBDYWxjdWxhdGUgdGhlIGN1cnJlbnQgcGl4ZWwgaW4gYSwgYW5kIG1vdmUgdGhlIHByZXZpb3VzIHJvdyBwaXhlbCB0byBjDQorICAgICAgICogZm9yIHRoZSBuZXh0IHRpbWUgcm91bmQgdGhlIGxvb3ANCisgICAgICAgKi8NCisgICAgICBjID0gYjsNCisgICAgICBhICs9ICpyb3c7DQorICAgICAgKnJvdysrID0gKHBuZ19ieXRlKWE7DQorICAgfQ0KK30NCisNCitzdGF0aWMgdm9pZA0KK3BuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGhfbXVsdGlieXRlX3BpeGVsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csDQorICAgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KQ0KK3sNCisgICBpbnQgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7DQorICAgcG5nX2J5dGVwIHJwX2VuZCA9IHJvdyArIGJwcDsNCisNCisgICAvKiBQcm9jZXNzIHRoZSBmaXJzdCBwaXhlbCBpbiB0aGUgcm93IGNvbXBsZXRlbHkgKHRoaXMgaXMgdGhlIHNhbWUgYXMgJ3VwJw0KKyAgICAqIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIHByZWRpY3RvciBmb3IgdGhlIGZpcnN0IHJvdykuDQorICAgICovDQorICAgd2hpbGUgKHJvdyA8IHJwX2VuZCkNCisgICB7DQorICAgICAgaW50IGEgPSAqcm93ICsgKnByZXZfcm93Kys7DQorICAgICAgKnJvdysrID0gKHBuZ19ieXRlKWE7DQorICAgfQ0KKw0KKyAgIC8qIFJlbWFpbmRlciAqLw0KKyAgIHJwX2VuZCArPSByb3dfaW5mby0+cm93Ynl0ZXMgLSBicHA7DQorDQorICAgd2hpbGUgKHJvdyA8IHJwX2VuZCkNCisgICB7DQorICAgICAgaW50IGEsIGIsIGMsIHBhLCBwYiwgcGMsIHA7DQorDQorICAgICAgYyA9ICoocHJldl9yb3cgLSBicHApOw0KKyAgICAgIGEgPSAqKHJvdyAtIGJwcCk7DQorICAgICAgYiA9ICpwcmV2X3JvdysrOw0KKw0KKyAgICAgIHAgPSBiIC0gYzsNCisgICAgICBwYyA9IGEgLSBjOw0KKw0KKyMgICAgIGlmZGVmIFBOR19VU0VfQUJTDQorICAgICAgICAgcGEgPSBhYnMocCk7DQorICAgICAgICAgcGIgPSBhYnMocGMpOw0KKyAgICAgICAgIHBjID0gYWJzKHAgKyBwYyk7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7DQorICAgICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsNCisgICAgICAgICBwYyA9IChwICsgcGMpIDwgMCA/IC0ocCArIHBjKSA6IHAgKyBwYzsNCisjICAgICBlbmRpZg0KKw0KKyAgICAgIGlmIChwYiA8IHBhKSBwYSA9IHBiLCBhID0gYjsNCisgICAgICBpZiAocGMgPCBwYSkgYSA9IGM7DQorDQorICAgICAgYyA9IGI7DQorICAgICAgYSArPSAqcm93Ow0KKyAgICAgICpyb3crKyA9IChwbmdfYnl0ZSlhOw0KKyAgIH0NCit9DQorDQorc3RhdGljIHZvaWQNCitwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zKHBuZ19zdHJ1Y3RycCBwcCkNCisgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBldmVyeSBQTkcgaW1hZ2UgdG8gc2V0IHRoZQ0KKyAgICAqIGltcGxlbWVudGF0aW9ucyByZXF1aXJlZCB0byByZXZlcnNlIHRoZSBmaWx0ZXJpbmcgb2YgUE5HIHJvd3MuICBSZXZlcnNpbmcNCisgICAgKiB0aGUgZmlsdGVyIGlzIHRoZSBmaXJzdCB0cmFuc2Zvcm1hdGlvbiBwZXJmb3JtZWQgb24gdGhlIHJvdyBkYXRhLiAgSXQgaXMNCisgICAgKiBwZXJmb3JtZWQgaW4gcGxhY2UsIHRoZXJlZm9yZSBhbiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgc2VsZWN0ZWQgYmFzZWQgb24NCisgICAgKiB0aGUgaW1hZ2UgcGl4ZWwgZm9ybWF0LiAgSWYgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gaW1hZ2Ugd2lkdGggdGhlbg0KKyAgICAqIHRha2UgY2FyZSB0byBlbnN1cmUgdGhhdCBpdCB3b3JrcyBjb3JyZWN0bHkgaWYgdGhlIGltYWdlIGlzIGludGVybGFjZWQgLQ0KKyAgICAqIGludGVybGFjaW5nIGNhdXNlcyB0aGUgYWN0dWFsIHJvdyB3aWR0aCB0byB2YXJ5Lg0KKyAgICAqLw0KK3sNCisgICB1bnNpZ25lZCBpbnQgYnBwID0gKHBwLT5waXhlbF9kZXB0aCArIDcpID4+IDM7DQorDQorICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfU1VCLTFdID0gcG5nX3JlYWRfZmlsdGVyX3Jvd19zdWI7DQorICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfVVAtMV0gPSBwbmdfcmVhZF9maWx0ZXJfcm93X3VwOw0KKyAgIHBwLT5yZWFkX2ZpbHRlcltQTkdfRklMVEVSX1ZBTFVFX0FWRy0xXSA9IHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnOw0KKyAgIGlmIChicHAgPT0gMSkNCisgICAgICBwcC0+cmVhZF9maWx0ZXJbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSC0xXSA9DQorICAgICAgICAgcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aF8xYnl0ZV9waXhlbDsNCisgICBlbHNlDQorICAgICAgcHAtPnJlYWRfZmlsdGVyW1BOR19GSUxURVJfVkFMVUVfUEFFVEgtMV0gPQ0KKyAgICAgICAgIHBuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGhfbXVsdGlieXRlX3BpeGVsOw0KKw0KKyNpZmRlZiBQTkdfRklMVEVSX09QVElNSVpBVElPTlMNCisgICAvKiBUbyB1c2UgdGhpcyBkZWZpbmUgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TIGFzIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8NCisgICAgKiBjYWxsIHRvIGluc3RhbGwgaGFyZHdhcmUgb3B0aW1pemF0aW9ucyBmb3IgdGhlIGFib3ZlIGZ1bmN0aW9uczsgc2ltcGx5DQorICAgICogcmVwbGFjZSB3aGF0ZXZlciBlbGVtZW50cyBvZiB0aGUgcHAtPnJlYWRfZmlsdGVyW10gYXJyYXkgd2l0aCBhIGhhcmR3YXJlDQorICAgICogc3BlY2lmaWMgKG9yLCBmb3IgdGhhdCBtYXR0ZXIsIGdlbmVyaWMpIG9wdGltaXphdGlvbi4NCisgICAgKg0KKyAgICAqIFRvIHNlZSBhbiBleGFtcGxlIG9mIHRoaXMgZXhhbWluZSB3aGF0IGNvbmZpZ3VyZS5hYyBkb2VzIHdoZW4NCisgICAgKiAtLWVuYWJsZS1hcm0tbmVvbiBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4NCisgICAgKi8NCisgICBQTkdfRklMVEVSX09QVElNSVpBVElPTlMocHAsIGJwcCk7DQorI2VuZGlmDQorfQ0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19yZWFkX2ZpbHRlcl9yb3cocG5nX3N0cnVjdHJwIHBwLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LA0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdywgaW50IGZpbHRlcikNCit7DQorICAgLyogT1BUSU1JWkFUSU9OOiBETyBOT1QgTU9ESUZZIFRISVMgRlVOQ1RJT04sIGluc3RlYWQgI2RlZmluZQ0KKyAgICAqIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyB0byBhIGZ1bmN0aW9uIHRoYXQgb3ZlcnJpZGVzIHRoZSBnZW5lcmljDQorICAgICogaW1wbGVtZW50YXRpb25zLiAgU2VlIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnMgYWJvdmUuDQorICAgICovDQorICAgaWYgKHBwLT5yZWFkX2ZpbHRlclswXSA9PSBOVUxMKQ0KKyAgICAgIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnMocHApOw0KKyAgIGlmIChmaWx0ZXIgPiBQTkdfRklMVEVSX1ZBTFVFX05PTkUgJiYgZmlsdGVyIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUKQ0KKyAgICAgIHBwLT5yZWFkX2ZpbHRlcltmaWx0ZXItMV0ocm93X2luZm8sIHJvdywgcHJldl9yb3cpOw0KK30NCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfcmVhZF9JREFUX2RhdGEocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBvdXRwdXQsDQorICAgcG5nX2FsbG9jX3NpemVfdCBhdmFpbF9vdXQpDQorew0KKyAgIC8qIExvb3AgcmVhZGluZyBJREFUcyBhbmQgZGVjb21wcmVzc2luZyB0aGUgcmVzdWx0IGludG8gb3V0cHV0W2F2YWlsX291dF0gKi8NCisgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gb3V0cHV0Ow0KKyAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsgLyogc2FmZXR5OiBzZXQgYmVsb3cgKi8NCisNCisgICBpZiAob3V0cHV0ID09IE5VTEwpDQorICAgICAgYXZhaWxfb3V0ID0gMDsNCisNCisgICBkbw0KKyAgIHsNCisgICAgICBpbnQgcmV0Ow0KKyAgICAgIHBuZ19ieXRlIHRtcGJ1ZltQTkdfSU5GTEFURV9CVUZfU0laRV07DQorDQorICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPT0gMCkNCisgICAgICB7DQorICAgICAgICAgdUludCBhdmFpbF9pbjsNCisgICAgICAgICBwbmdfYnl0ZXAgYnVmZmVyOw0KKw0KKyAgICAgICAgIHdoaWxlIChwbmdfcHRyLT5pZGF0X3NpemUgPT0gMCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7DQorDQorICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKHBuZ19wdHIpOw0KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXJyb3IgZXZlbiBpbiB0aGUgJ2NoZWNrJyBjYXNlIGJlY2F1c2UgdGhlIGNvZGUganVzdA0KKyAgICAgICAgICAgICAqIGNvbnN1bWVkIGEgbm9uLUlEQVQgaGVhZGVyLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5jaHVua19uYW1lICE9IHBuZ19JREFUKQ0KKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm90IGVub3VnaCBpbWFnZSBkYXRhIik7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGF2YWlsX2luID0gcG5nX3B0ci0+SURBVF9yZWFkX3NpemU7DQorDQorICAgICAgICAgaWYgKGF2YWlsX2luID4gcG5nX3B0ci0+aWRhdF9zaXplKQ0KKyAgICAgICAgICAgIGF2YWlsX2luID0gKHVJbnQpcG5nX3B0ci0+aWRhdF9zaXplOw0KKw0KKyAgICAgICAgIC8qIEEgUE5HIHdpdGggYSBncmFkdWFsbHkgaW5jcmVhc2luZyBJREFUIHNpemUgd2lsbCBkZWZlYXQgdGhpcyBhdHRlbXB0DQorICAgICAgICAgICogdG8gbWluaW1pemUgbWVtb3J5IHVzYWdlIGJ5IGNhdXNpbmcgbG90cyBvZiByZS1hbGxvY3MsIGJ1dA0KKyAgICAgICAgICAqIHJlYWxpc3RpY2FsbHkgZG9pbmcgSURBVF9yZWFkX3NpemUgcmUtYWxsb2NzIGlzIG5vdCBsaWtlbHkgdG8gYmUgYQ0KKyAgICAgICAgICAqIGJpZyBwcm9ibGVtLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGJ1ZmZlciA9IHBuZ19yZWFkX2J1ZmZlcihwbmdfcHRyLCBhdmFpbF9pbiwgMC8qZXJyb3IqLyk7DQorDQorICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZmZlciwgYXZhaWxfaW4pOw0KKyAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSAtPSBhdmFpbF9pbjsNCisNCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBidWZmZXI7DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IGF2YWlsX2luOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBBbmQgc2V0IHVwIHRoZSBvdXRwdXQgc2lkZS4gKi8NCisgICAgICBpZiAob3V0cHV0ICE9IE5VTEwpIC8qIHN0YW5kYXJkIHJlYWQgKi8NCisgICAgICB7DQorICAgICAgICAgdUludCBvdXQgPSBaTElCX0lPX01BWDsNCisNCisgICAgICAgICBpZiAob3V0ID4gYXZhaWxfb3V0KQ0KKyAgICAgICAgICAgIG91dCA9ICh1SW50KWF2YWlsX291dDsNCisNCisgICAgICAgICBhdmFpbF9vdXQgLT0gb3V0Ow0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gb3V0Ow0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIC8qIGFmdGVyIGxhc3Qgcm93LCBjaGVja2luZyBmb3IgZW5kICovDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSB0bXBidWY7DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAoc2l6ZW9mIHRtcGJ1Zik7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFVzZSBOT19GTFVTSDsgdGhpcyBnaXZlcyB6bGliIHRoZSBtYXhpbXVtIG9wcG9ydHVuaXR5IHRvIG9wdGltaXplIHRoZQ0KKyAgICAgICAqIHByb2Nlc3MuICBJZiB0aGUgTFogc3RyZWFtIGlzIHRydW5jYXRlZCB0aGUgc2VxdWVudGlhbCByZWFkZXIgd2lsbA0KKyAgICAgICAqIHRlcm1pbmFsbHkgZGFtYWdlIHRoZSBzdHJlYW0sIGFib3ZlLCBieSByZWFkaW5nIHRoZSBjaHVuayBoZWFkZXIgb2YgdGhlDQorICAgICAgICogZm9sbG93aW5nIGNodW5rIChpdCB0aGVuIGV4aXRzIHdpdGggcG5nX2Vycm9yKS4NCisgICAgICAgKg0KKyAgICAgICAqIFRPRE86IGRlYWwgbW9yZSBlbGVnYW50bHkgd2l0aCB0cnVuY2F0ZWQgSURBVCBsaXN0cy4NCisgICAgICAgKi8NCisgICAgICByZXQgPSBpbmZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBaX05PX0ZMVVNIKTsNCisNCisgICAgICAvKiBUYWtlIHRoZSB1bmNvbnN1bWVkIG91dHB1dCBiYWNrLiAqLw0KKyAgICAgIGlmIChvdXRwdXQgIT0gTlVMTCkNCisgICAgICAgICBhdmFpbF9vdXQgKz0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7DQorDQorICAgICAgZWxzZSAvKiBhdmFpbF9vdXQgY291bnRzIHRoZSBleHRyYSBieXRlcyAqLw0KKyAgICAgICAgIGF2YWlsX291dCArPSAoc2l6ZW9mIHRtcGJ1ZikgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsNCisNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7DQorDQorICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpDQorICAgICAgew0KKyAgICAgICAgIC8qIERvIHRoaXMgZm9yIHNhZmV0eTsgd2Ugd29uJ3QgcmVhZCBhbnkgbW9yZSBpbnRvIHRoaXMgcm93LiAqLw0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBOVUxMOw0KKw0KKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7DQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWlNUUkVBTV9FTkRFRDsNCisNCisgICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA+IDAgfHwgcG5nX3B0ci0+aWRhdF9zaXplID4gMCkNCisgICAgICAgICAgICBwbmdfY2h1bmtfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiKTsNCisgICAgICAgICBicmVhazsNCisgICAgICB9DQorDQorICAgICAgaWYgKHJldCAhPSBaX09LKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfenN0cmVhbV9lcnJvcihwbmdfcHRyLCByZXQpOw0KKw0KKyAgICAgICAgIGlmIChvdXRwdXQgIT0gTlVMTCkNCisgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOw0KKw0KKyAgICAgICAgIGVsc2UgLyogY2hlY2tpbmcgKi8NCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfSB3aGlsZSAoYXZhaWxfb3V0ID4gMCk7DQorDQorICAgaWYgKGF2YWlsX291dCA+IDApDQorICAgew0KKyAgICAgIC8qIFRoZSBzdHJlYW0gZW5kZWQgYmVmb3JlIHRoZSBpbWFnZTsgdGhpcyBpcyB0aGUgc2FtZSBhcyB0b28gZmV3IElEQVRzIHNvDQorICAgICAgICogc2hvdWxkIGJlIGhhbmRsZWQgdGhlIHNhbWUgd2F5Lg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChvdXRwdXQgIT0gTlVMTCkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBlbm91Z2ggaW1hZ2UgZGF0YSIpOw0KKw0KKyAgICAgIGVsc2UgLyogdGhlIGRlZmxhdGUgc3RyZWFtIGNvbnRhaW5lZCBleHRyYSBkYXRhICovDQorICAgICAgICAgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiVG9vIG11Y2ggaW1hZ2UgZGF0YSIpOw0KKyAgIH0NCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfZmluaXNoX0lEQVQocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIFdlIGRvbid0IG5lZWQgYW55IG1vcmUgZGF0YSBhbmQgdGhlIHN0cmVhbSBzaG91bGQgaGF2ZSBlbmRlZCwgaG93ZXZlciB0aGUNCisgICAgKiBMWiBlbmQgY29kZSBtYXkgYWN0dWFsbHkgbm90IGhhdmUgYmVlbiBwcm9jZXNzZWQuICBJbiB0aGlzIGNhc2Ugd2UgbXVzdA0KKyAgICAqIHJlYWQgaXQgb3RoZXJ3aXNlIHN0cmF5IHVucmVhZCBJREFUIGRhdGEgb3IsIG1vcmUgbGlrZWx5LCBhbiBJREFUIGNodW5rDQorICAgICogbWF5IHN0aWxsIHJlbWFpbiB0byBiZSBjb25zdW1lZC4NCisgICAgKi8NCisgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pTVFJFQU1fRU5ERUQpKQ0KKyAgIHsNCisgICAgICAvKiBUaGUgTlVMTCBjYXVzZXMgcG5nX3JlYWRfSURBVF9kYXRhIHRvIHN3YWxsb3cgYW55IHJlbWFpbmluZyBieXRlcyBpbg0KKyAgICAgICAqIHRoZSBjb21wcmVzc2VkIHN0cmVhbSwgYnV0IHRoZSBzdHJlYW0gbWF5IGJlIGRhbWFnZWQgdG9vLCBzbyBldmVuIGFmdGVyDQorICAgICAgICogdGhpcyBjYWxsIHdlIG1heSBuZWVkIHRvIHRlcm1pbmF0ZSB0aGUgenN0cmVhbSBvd25lcnNoaXAuDQorICAgICAgICovDQorICAgICAgcG5nX3JlYWRfSURBVF9kYXRhKHBuZ19wdHIsIE5VTEwsIDApOw0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBOVUxMOyAvKiBzYWZldHkgKi8NCisNCisgICAgICAvKiBOb3cgY2xlYXIgZXZlcnl0aGluZyBvdXQgZm9yIHNhZmV0eTsgdGhlIGZvbGxvd2luZyBtYXkgbm90IGhhdmUgYmVlbg0KKyAgICAgICAqIGRvbmUuDQorICAgICAgICovDQorICAgICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aU1RSRUFNX0VOREVEKSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsNCisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aU1RSRUFNX0VOREVEOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgLyogSWYgdGhlIHpzdHJlYW0gaGFzIG5vdCBiZWVuIHJlbGVhc2VkIGRvIGl0IG5vdyAqYW5kKiB0ZXJtaW5hdGUgdGhlIHJlYWRpbmcNCisgICAgKiBvZiB0aGUgZmluYWwgSURBVCBjaHVuay4NCisgICAgKi8NCisgICBpZiAocG5nX3B0ci0+em93bmVyID09IHBuZ19JREFUKQ0KKyAgIHsNCisgICAgICAvKiBBbHdheXMgZG8gdGhpczsgdGhlIHBvaW50ZXJzIG90aGVyd2lzZSBwb2ludCBpbnRvIHRoZSByZWFkIGJ1ZmZlci4gKi8NCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBOVUxMOw0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOw0KKw0KKyAgICAgIC8qIE5vdyB3ZSBubyBsb25nZXIgb3duIHRoZSB6c3RyZWFtLiAqLw0KKyAgICAgIHBuZ19wdHItPnpvd25lciA9IDA7DQorDQorICAgICAgLyogVGhlIHNsaWdodGx5IHdlaXJkIHNlbWFudGljcyBvZiB0aGUgc2VxdWVudGlhbCBJREFUIHJlYWRpbmcgaXMgdGhhdCB3ZQ0KKyAgICAgICAqIGFyZSBhbHdheXMgaW4gb3IgYXQgdGhlIGVuZCBvZiBhbiBJREFUIGNodW5rLCBzbyB3ZSBhbHdheXMgbmVlZCB0byBkbyBhDQorICAgICAgICogY3JjX2ZpbmlzaCBoZXJlLiAgSWYgaWRhdF9zaXplIGlzIG5vbi16ZXJvIHdlIGFsc28gbmVlZCB0byByZWFkIHRoZQ0KKyAgICAgICAqIHNwdXJpb3VzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rIG5vdy4NCisgICAgICAgKi8NCisgICAgICAodm9pZClwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBwbmdfcHRyLT5pZGF0X3NpemUpOw0KKyAgIH0NCit9DQorDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3JlYWRfZmluaXNoX3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovDQorDQorICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsNCisNCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8NCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsNCisNCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07DQorDQorICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLw0KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsNCisjZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9maW5pc2hfcm93Iik7DQorICAgcG5nX3B0ci0+cm93X251bWJlcisrOw0KKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpDQorICAgICAgcmV0dXJuOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkNCisgICB7DQorICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7DQorDQorICAgICAgLyogVE8gRE86IGRvbid0IGRvIHRoaXMgaWYgcHJldl9yb3cgaXNuJ3QgbmVlZGVkIChyZXF1aXJlcw0KKyAgICAgICAqIHJlYWQtYWhlYWQgb2YgdGhlIG5leHQgcm93J3MgZmlsdGVyIGJ5dGUuDQorICAgICAgICovDQorICAgICAgbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLCBwbmdfcHRyLT5yb3dieXRlcyArIDEpOw0KKw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPnBhc3MrKzsNCisNCisgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgIHBuZ19wdHItPml3aWR0aCA9IChwbmdfcHRyLT53aWR0aCArDQorICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtDQorICAgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8NCisgICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc107DQorDQorICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArDQorICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0NCisgICAgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0W3BuZ19wdHItPnBhc3NdKSAvDQorICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UgIC8qIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSAqLw0KKyAgICAgICAgICAgIGJyZWFrOyAvKiBsaWJwbmcgZGVpbnRlcmxhY2luZyBzZWVzIGV2ZXJ5IHJvdyAqLw0KKw0KKyAgICAgIH0gd2hpbGUgKHBuZ19wdHItPm51bV9yb3dzID09IDAgfHwgcG5nX3B0ci0+aXdpZHRoID09IDApOw0KKw0KKyAgICAgIGlmIChwbmdfcHRyLT5wYXNzIDwgNykNCisgICAgICAgICByZXR1cm47DQorICAgfQ0KKyNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8NCisNCisgICAvKiBIZXJlIGFmdGVyIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3Qgcm93IG9mIHRoZSBsYXN0IHBhc3MuICovDQorICAgcG5nX3JlYWRfZmluaXNoX0lEQVQocG5nX3B0cik7DQorfQ0KKyNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLw0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19yZWFkX3N0YXJ0X3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovDQorDQorICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsNCisNCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8NCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsNCisNCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07DQorDQorICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLw0KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsNCisjZW5kaWYNCisNCisgICBpbnQgbWF4X3BpeGVsX2RlcHRoOw0KKyAgIHBuZ19zaXplX3Qgcm93X2J5dGVzOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfc3RhcnRfcm93Iik7DQorDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorICAgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7DQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQ0KKyAgIHsNCisgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkNCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKyBwbmdfcGFzc195aW5jWzBdIC0gMSAtDQorICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFswXSkgLyBwbmdfcGFzc195aW5jWzBdOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsNCisNCisgICAgICBwbmdfcHRyLT5pd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKw0KKyAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0NCisgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8NCisgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOw0KKyAgIH0NCisNCisgICBlbHNlDQorI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLw0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsNCisgICAgICBwbmdfcHRyLT5pd2lkdGggPSBwbmdfcHRyLT53aWR0aDsNCisgICB9DQorDQorICAgbWF4X3BpeGVsX2RlcHRoID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7DQorDQorICAgLyogV0FSTklORzogKiBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyAocG5ncnRyYW4uYykgcGVyZm9ybXMgYSBzaW1wbGlhciBzZXQgb2YNCisgICAgKiBjYWxjdWxhdGlvbnMgdG8gY2FsY3VsYXRlIHRoZSBmaW5hbCBwaXhlbCBkZXB0aCwgdGhlbg0KKyAgICAqIHBuZ19kb19yZWFkX3RyYW5zZm9ybXMgYWN0dWFsbHkgZG9lcyB0aGUgdHJhbnNmb3Jtcy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUNCisgICAgKiBjb2RlIHdoaWNoIGVmZmVjdGl2ZWx5IGNhbGN1bGF0ZXMgdGhpcyB2YWx1ZSBpcyBhY3R1YWxseSByZXBlYXRlZCBpbiB0aHJlZQ0KKyAgICAqIHNlcGFyYXRlIHBsYWNlcy4gIFRoZXkgbXVzdCBhbGwgbWF0Y2guICBJbm5vY2VudCBjaGFuZ2VzIHRvIHRoZSBvcmRlciBvZg0KKyAgICAqIHRyYW5zZm9ybWF0aW9ucyBjYW4gYW5kIHdpbGwgYnJlYWsgbGlicG5nIGluIGEgd2F5IHRoYXQgY2F1c2VzIG1lbW9yeQ0KKyAgICAqIG92ZXJ3cml0ZXMuDQorICAgICoNCisgICAgKiBUT0RPOiBmaXggdGhpcy4NCisgICAgKi8NCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQNCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKSAmJiBwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQ0KKyAgICAgIG1heF9waXhlbF9kZXB0aCA9IDg7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkNCisgICB7DQorICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykNCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAzMjsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMjQ7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkNCisgICAgICB7DQorICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8IDgpDQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gODsNCisNCisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zKQ0KKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCAqPSAyOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykNCisgICAgICAgICB7DQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoICo9IDQ7DQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoIC89IDM7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF8xNikNCisgICB7DQorIyAgICAgaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRA0KKyAgICAgICAgIC8qIEluIGZhY3QgaXQgaXMgYW4gZXJyb3IgaWYgaXQgaXNuJ3Qgc3VwcG9ydGVkLCBidXQgY2hlY2tpbmcgaXMNCisgICAgICAgICAgKiB0aGUgc2FmZSB3YXkuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCAxNikNCisgICAgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggKj0gMjsNCisgICAgICAgICB9DQorICAgICAgICAgZWxzZQ0KKyMgICAgIGVuZGlmDQorICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfRVhQQU5EXzE2Ow0KKyAgIH0NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0ZJTExFUikpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpDQorICAgICAgew0KKyAgICAgICAgIGlmIChtYXhfcGl4ZWxfZGVwdGggPD0gOCkNCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAxNjsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8DQorICAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDMyKQ0KKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKQ0KKyAgIHsNCisgICAgICBpZiAoDQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQNCisgICAgICAgICAgKHBuZ19wdHItPm51bV90cmFucyAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkpIHx8DQorI2VuZGlmDQorI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQNCisgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfRklMTEVSKSkgfHwNCisjZW5kaWYNCisgICAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDE2KQ0KKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDgpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkNCisgICAgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAzMjsNCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMjQ7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQ0KKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDY0Ow0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA0ODsNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgJiYgXA0KK2RlZmluZWQoUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQpDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkNCisgICB7DQorICAgICAgaW50IHVzZXJfcGl4ZWxfZGVwdGggPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCAqDQorICAgICAgICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7DQorDQorICAgICAgaWYgKHVzZXJfcGl4ZWxfZGVwdGggPiBtYXhfcGl4ZWxfZGVwdGgpDQorICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gdXNlcl9waXhlbF9kZXB0aDsNCisgICB9DQorI2VuZGlmDQorDQorICAgLyogVGhpcyB2YWx1ZSBpcyBzdG9yZWQgaW4gcG5nX3N0cnVjdCBhbmQgZG91YmxlIGNoZWNrZWQgaW4gdGhlIHJvdyByZWFkDQorICAgICogY29kZS4NCisgICAgKi8NCisgICBwbmdfcHRyLT5tYXhpbXVtX3BpeGVsX2RlcHRoID0gKHBuZ19ieXRlKW1heF9waXhlbF9kZXB0aDsNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCA9IDA7IC8qIGNhbGN1bGF0ZWQgb24gZGVtYW5kICovDQorDQorICAgLyogQWxpZ24gdGhlIHdpZHRoIG9uIHRoZSBuZXh0IGxhcmdlciA4IHBpeGVscy4gIE1haW5seSB1c2VkDQorICAgICogZm9yIGludGVybGFjaW5nDQorICAgICovDQorICAgcm93X2J5dGVzID0gKChwbmdfcHRyLT53aWR0aCArIDcpICYgfigocG5nX3VpbnRfMzIpNykpOw0KKyAgIC8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBieXRlcyBuZWVkZWQsIGFkZGluZyBhIGJ5dGUgYW5kIGEgcGl4ZWwNCisgICAgKiBmb3Igc2FmZXR5J3Mgc2FrZQ0KKyAgICAqLw0KKyAgIHJvd19ieXRlcyA9IFBOR19ST1dCWVRFUyhtYXhfcGl4ZWxfZGVwdGgsIHJvd19ieXRlcykgKw0KKyAgICAgICAxICsgKChtYXhfcGl4ZWxfZGVwdGggKyA3KSA+PiAzKTsNCisNCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLDQorICAgaWYgKHJvd19ieXRlcyA+IChwbmdfdWludF8zMik2NTUzNkwpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJUaGlzIGltYWdlIHJlcXVpcmVzIGEgcm93IGdyZWF0ZXIgdGhhbiA2NEtCIik7DQorI2VuZGlmDQorDQorICAgaWYgKHJvd19ieXRlcyArIDQ4ID4gcG5nX3B0ci0+b2xkX2JpZ19yb3dfYnVmX3NpemUpDQorICAgew0KKyAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3Jvd19idWYpOw0KKyAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YmlnX3ByZXZfcm93KTsNCisNCisgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQ0KKyAgICAgICAgcG5nX3B0ci0+YmlnX3Jvd19idWYgPSAocG5nX2J5dGVwKXBuZ19jYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgICByb3dfYnl0ZXMgKyA0OCk7DQorDQorICAgICBlbHNlDQorICAgICAgICBwbmdfcHRyLT5iaWdfcm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCByb3dfYnl0ZXMgKyA0OCk7DQorDQorICAgICBwbmdfcHRyLT5iaWdfcHJldl9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgcm93X2J5dGVzICsgNDgpOw0KKw0KKyNpZmRlZiBQTkdfQUxJR05FRF9NRU1PUllfU1VQUE9SVEVEDQorICAgICAvKiBVc2UgMTYtYnl0ZSBhbGlnbmVkIG1lbW9yeSBmb3Igcm93X2J1ZiB3aXRoIGF0IGxlYXN0IDE2IGJ5dGVzDQorICAgICAgKiBvZiBwYWRkaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgcm93X2J1ZjsgdHJlYXQgcHJldl9yb3cgc2ltaWxhcmx5Lg0KKyAgICAgICogTk9URTogdGhlIGFsaWdubWVudCBpcyB0byB0aGUgc3RhcnQgb2YgdGhlIHBpeGVscywgb25lIGJleW9uZCB0aGUgc3RhcnQNCisgICAgICAqIG9mIHRoZSBidWZmZXIsIGJlY2F1c2Ugb2YgdGhlIGZpbHRlciBieXRlLiAgUHJpb3IgdG8gbGlicG5nIDEuNS42IHRoaXMNCisgICAgICAqIHdhcyBpbmNvcnJlY3Q7IHRoZSBmaWx0ZXIgYnl0ZSB3YXMgYWxpZ25lZCwgd2hpY2ggaGFkIHRoZSBleGFjdA0KKyAgICAgICogb3Bwb3NpdGUgZWZmZWN0IG9mIHRoYXQgaW50ZW5kZWQuDQorICAgICAgKi8NCisgICAgIHsNCisgICAgICAgIHBuZ19ieXRlcCB0ZW1wID0gcG5nX3B0ci0+YmlnX3Jvd19idWYgKyAzMjsNCisgICAgICAgIGludCBleHRyYSA9IChpbnQpKCh0ZW1wIC0gKHBuZ19ieXRlcCkwKSAmIDB4MGYpOw0KKyAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiA9IHRlbXAgLSBleHRyYSAtIDEvKmZpbHRlciBieXRlKi87DQorDQorICAgICAgICB0ZW1wID0gcG5nX3B0ci0+YmlnX3ByZXZfcm93ICsgMzI7DQorICAgICAgICBleHRyYSA9IChpbnQpKCh0ZW1wIC0gKHBuZ19ieXRlcCkwKSAmIDB4MGYpOw0KKyAgICAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSB0ZW1wIC0gZXh0cmEgLSAxLypmaWx0ZXIgYnl0ZSovOw0KKyAgICAgfQ0KKw0KKyNlbHNlDQorICAgICAvKiBVc2UgMzEgYnl0ZXMgb2YgcGFkZGluZyBiZWZvcmUgYW5kIDE3IGJ5dGVzIGFmdGVyIHJvd19idWYuICovDQorICAgICBwbmdfcHRyLT5yb3dfYnVmID0gcG5nX3B0ci0+YmlnX3Jvd19idWYgKyAzMTsNCisgICAgIHBuZ19wdHItPnByZXZfcm93ID0gcG5nX3B0ci0+YmlnX3ByZXZfcm93ICsgMzE7DQorI2VuZGlmDQorICAgICBwbmdfcHRyLT5vbGRfYmlnX3Jvd19idWZfc2l6ZSA9IHJvd19ieXRlcyArIDQ4Ow0KKyAgIH0NCisNCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLDQorICAgaWYgKHBuZ19wdHItPnJvd2J5dGVzID4gNjU1MzUpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJUaGlzIGltYWdlIHJlcXVpcmVzIGEgcm93IGdyZWF0ZXIgdGhhbiA2NEtCIik7DQorDQorI2VuZGlmDQorICAgaWYgKHBuZ19wdHItPnJvd2J5dGVzID4gKFBOR19TSVpFX01BWCAtIDEpKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUm93IGhhcyB0b28gbWFueSBieXRlcyB0byBhbGxvY2F0ZSBpbiBtZW1vcnkiKTsNCisNCisgICBtZW1zZXQocG5nX3B0ci0+cHJldl9yb3csIDAsIHBuZ19wdHItPnJvd2J5dGVzICsgMSk7DQorDQorICAgcG5nX2RlYnVnMSgzLCAid2lkdGggPSAldSwiLCBwbmdfcHRyLT53aWR0aCk7DQorICAgcG5nX2RlYnVnMSgzLCAiaGVpZ2h0ID0gJXUsIiwgcG5nX3B0ci0+aGVpZ2h0KTsNCisgICBwbmdfZGVidWcxKDMsICJpd2lkdGggPSAldSwiLCBwbmdfcHRyLT5pd2lkdGgpOw0KKyAgIHBuZ19kZWJ1ZzEoMywgIm51bV9yb3dzID0gJXUsIiwgcG5nX3B0ci0+bnVtX3Jvd3MpOw0KKyAgIHBuZ19kZWJ1ZzEoMywgInJvd2J5dGVzID0gJWx1LCIsICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPnJvd2J5dGVzKTsNCisgICBwbmdfZGVidWcxKDMsICJpcm93Ynl0ZXMgPSAlbHUiLA0KKyAgICAgICAodW5zaWduZWQgbG9uZylQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHBuZ19wdHItPml3aWR0aCkgKyAxKTsNCisNCisgICAvKiBUaGUgc2VxdWVudGlhbCByZWFkZXIgbmVlZHMgYSBidWZmZXIgZm9yIElEQVQsIGJ1dCB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyDQorICAgICogZG9lcyBub3QsIHNvIGZyZWUgdGhlIHJlYWQgYnVmZmVyIG5vdyByZWdhcmRsZXNzOyB0aGUgc2VxdWVudGlhbCByZWFkZXINCisgICAgKiByZWFsbG9jYXRlcyBpdCBvbiBkZW1hbmQuDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPnJlYWRfYnVmZmVyKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgYnVmZmVyID0gcG5nX3B0ci0+cmVhZF9idWZmZXI7DQorDQorICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXJfc2l6ZSA9IDA7DQorICAgICAgcG5nX3B0ci0+cmVhZF9idWZmZXIgPSBOVUxMOw0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGJ1ZmZlcik7DQorICAgfQ0KKw0KKyAgIC8qIEZpbmFsbHkgY2xhaW0gdGhlIHpzdHJlYW0gZm9yIHRoZSBpbmZsYXRlIG9mIHRoZSBJREFUIGRhdGEsIHVzZSB0aGUgYml0cw0KKyAgICAqIHZhbHVlIGZyb20gdGhlIHN0cmVhbSAobm90ZSB0aGF0IHRoaXMgd2lsbCByZXN1bHQgaW4gYSBmYXRhbCBlcnJvciBpZiB0aGUNCisgICAgKiBJREFUIHN0cmVhbSBoYXMgYSBib2d1cyBkZWZsYXRlIGhlYWRlciB3aW5kb3dfYml0cyB2YWx1ZSwgYnV0IHRoaXMgc2hvdWxkDQorICAgICogbm90IGJlIGhhcHBlbmluZyBhbnkgbG9uZ2VyISkNCisgICAgKi8NCisgICBpZiAocG5nX2luZmxhdGVfY2xhaW0ocG5nX3B0ciwgcG5nX0lEQVQpICE9IFpfT0spDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsNCisNCisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19ST1dfSU5JVDsNCit9DQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nc2V0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDc0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3NldC5jCkBAIC0wLDAgKzEsMTU5OCBAQAorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorLyogcG5nc2V0LmMgLSBzdG9yYWdlIG9mIGltYWdlIGluZm9ybWF0aW9uIGludG8gaW5mbyBzdHJ1Y3QNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjMgW0p1bHkgMTgsIDIwMTNdDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKg0KKyAqIFRoZSBmdW5jdGlvbnMgaGVyZSBhcmUgdXNlZCBkdXJpbmcgcmVhZHMgdG8gc3RvcmUgZGF0YSBmcm9tIHRoZSBmaWxlDQorICogaW50byB0aGUgaW5mbyBzdHJ1Y3QsIGFuZCBkdXJpbmcgd3JpdGVzIHRvIHN0b3JlIGFwcGxpY2F0aW9uIGRhdGENCisgKiBpbnRvIHRoZSBpbmZvIHN0cnVjdCBmb3Igd3JpdGluZyBpbnRvIHRoZSBmaWxlLiAgVGhpcyBhYnN0cmFjdHMgdGhlDQorICogaW5mbyBzdHJ1Y3QgYW5kIGFsbG93cyB1cyB0byBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBpbiB0aGUgZnV0dXJlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJwbmdwcml2LmgiDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpDQorDQorI2lmZGVmIFBOR19iS0dEX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9iS0dEKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmQpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiYktHRCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBiYWNrZ3JvdW5kID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGluZm9fcHRyLT5iYWNrZ3JvdW5kID0gKmJhY2tncm91bmQ7DQorICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2JLR0Q7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQNCit2b2lkIFBOR0ZBUEkNCitwbmdfc2V0X2NIUk1fZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50IHJlZF94LA0KKyAgICBwbmdfZml4ZWRfcG9pbnQgcmVkX3ksIHBuZ19maXhlZF9wb2ludCBncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feSwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeCwgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeSkNCit7DQorICAgcG5nX3h5IHh5Ow0KKw0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiY0hSTSBmaXhlZCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgeHkucmVkeCA9IHJlZF94Ow0KKyAgIHh5LnJlZHkgPSByZWRfeTsNCisgICB4eS5ncmVlbnggPSBncmVlbl94Ow0KKyAgIHh5LmdyZWVueSA9IGdyZWVuX3k7DQorICAgeHkuYmx1ZXggPSBibHVlX3g7DQorICAgeHkuYmx1ZXkgPSBibHVlX3k7DQorICAgeHkud2hpdGV4ID0gd2hpdGVfeDsNCisgICB4eS53aGl0ZXkgPSB3aGl0ZV95Ow0KKw0KKyAgIGlmIChwbmdfY29sb3JzcGFjZV9zZXRfY2hyb21hdGljaXRpZXMocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLCAmeHksDQorICAgICAgMi8qIG92ZXJyaWRlIHdpdGggYXBwIHZhbHVlcyovKSkNCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk07DQorDQorICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorDQordm9pZCBQTkdGQVBJDQorcG5nX3NldF9jSFJNX1hZWl9maXhlZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfWCwgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfWSwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfWiwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl9YLA0KKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX1ksIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5fWiwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX1gsIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV9ZLA0KKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfWikNCit7DQorICAgcG5nX1hZWiBYWVo7DQorDQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJjSFJNIFhZWiBmaXhlZCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgWFlaLnJlZF9YID0gaW50X3JlZF9YOw0KKyAgIFhZWi5yZWRfWSA9IGludF9yZWRfWTsNCisgICBYWVoucmVkX1ogPSBpbnRfcmVkX1o7DQorICAgWFlaLmdyZWVuX1ggPSBpbnRfZ3JlZW5fWDsNCisgICBYWVouZ3JlZW5fWSA9IGludF9ncmVlbl9ZOw0KKyAgIFhZWi5ncmVlbl9aID0gaW50X2dyZWVuX1o7DQorICAgWFlaLmJsdWVfWCA9IGludF9ibHVlX1g7DQorICAgWFlaLmJsdWVfWSA9IGludF9ibHVlX1k7DQorICAgWFlaLmJsdWVfWiA9IGludF9ibHVlX1o7DQorDQorICAgaWYgKHBuZ19jb2xvcnNwYWNlX3NldF9lbmRwb2ludHMocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLCAmWFlaLCAyKSkNCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PSBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk07DQorDQorICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorDQorIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9jSFJNKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBkb3VibGUgd2hpdGVfeCwgZG91YmxlIHdoaXRlX3ksIGRvdWJsZSByZWRfeCwgZG91YmxlIHJlZF95LA0KKyAgICBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpDQorew0KKyAgIHBuZ19zZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwNCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgd2hpdGVfeCwgImNIUk0gV2hpdGUgWCIpLA0KKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCB3aGl0ZV95LCAiY0hSTSBXaGl0ZSBZIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIHJlZF94LCAiY0hSTSBSZWQgWCIpLA0KKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCByZWRfeSwgImNIUk0gUmVkIFkiKSwNCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgZ3JlZW5feCwgImNIUk0gR3JlZW4gWCIpLA0KKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCBncmVlbl95LCAiY0hSTSBHcmVlbiBZIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGJsdWVfeCwgImNIUk0gQmx1ZSBYIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGJsdWVfeSwgImNIUk0gQmx1ZSBZIikpOw0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfY0hSTV9YWVoocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGRvdWJsZSByZWRfWCwNCisgICAgZG91YmxlIHJlZF9ZLCBkb3VibGUgcmVkX1osIGRvdWJsZSBncmVlbl9YLCBkb3VibGUgZ3JlZW5fWSwgZG91YmxlIGdyZWVuX1osDQorICAgIGRvdWJsZSBibHVlX1gsIGRvdWJsZSBibHVlX1ksIGRvdWJsZSBibHVlX1opDQorew0KKyAgIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIHJlZF9YLCAiY0hSTSBSZWQgWCIpLA0KKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCByZWRfWSwgImNIUk0gUmVkIFkiKSwNCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgcmVkX1osICJjSFJNIFJlZCBaIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGdyZWVuX1gsICJjSFJNIFJlZCBYIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGdyZWVuX1ksICJjSFJNIFJlZCBZIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGdyZWVuX1osICJjSFJNIFJlZCBaIiksDQorICAgICAgcG5nX2ZpeGVkKHBuZ19wdHIsIGJsdWVfWCwgImNIUk0gUmVkIFgiKSwNCisgICAgICBwbmdfZml4ZWQocG5nX3B0ciwgYmx1ZV9ZLCAiY0hSTSBSZWQgWSIpLA0KKyAgICAgIHBuZ19maXhlZChwbmdfcHRyLCBibHVlX1osICJjSFJNIFJlZCBaIikpOw0KK30NCisjICBlbmRpZiAvKiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEICovDQorDQorI2VuZGlmIC8qIFBOR19jSFJNX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQNCit2b2lkIFBOR0ZBUEkNCitwbmdfc2V0X2dBTUFfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19maXhlZF9wb2ludCBmaWxlX2dhbW1hKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImdBTUEiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19jb2xvcnNwYWNlX3NldF9nYW1tYShwbmdfcHRyLCAmaW5mb19wdHItPmNvbG9yc3BhY2UsIGZpbGVfZ2FtbWEpOw0KKyAgIHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorfQ0KKw0KKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfZ0FNQShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpDQorew0KKyAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX2ZpeGVkKHBuZ19wdHIsIGZpbGVfZ2FtbWEsDQorICAgICAgICJwbmdfc2V0X2dBTUEiKSk7DQorfQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9oSVNUKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29uc3RfdWludF8xNnAgaGlzdCkNCit7DQorICAgaW50IGk7DQorDQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJoSVNUIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAoaW5mb19wdHItPm51bV9wYWxldHRlID09IDAgfHwgaW5mb19wdHItPm51bV9wYWxldHRlDQorICAgICAgID4gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgIkludmFsaWQgcGFsZXR0ZSBzaXplLCBoSVNUIGFsbG9jYXRpb24gc2tpcHBlZCIpOw0KKw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfSElTVCwgMCk7DQorDQorICAgLyogQ2hhbmdlZCBmcm9tIGluZm8tPm51bV9wYWxldHRlIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4NCisgICAgKiB2ZXJzaW9uIDEuMi4xDQorICAgICovDQorICAgaW5mb19wdHItPmhpc3QgPSBwbmdfdm9pZGNhc3QocG5nX3VpbnRfMTZwLCBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwNCisgICAgICAgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCAqIChzaXplb2YgKHBuZ191aW50XzE2KSkpKTsNCisNCisgICBpZiAoaW5mb19wdHItPmhpc3QgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIGhJU1QgY2h1bmsgZGF0YSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfSElTVDsNCisNCisgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV9wYWxldHRlOyBpKyspDQorICAgICAgaW5mb19wdHItPmhpc3RbaV0gPSBoaXN0W2ldOw0KKw0KKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19oSVNUOw0KK30NCisjZW5kaWYNCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfSUhEUihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwNCisgICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsDQorICAgIGludCBmaWx0ZXJfdHlwZSkNCit7DQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJJSERSIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpbmZvX3B0ci0+d2lkdGggPSB3aWR0aDsNCisgICBpbmZvX3B0ci0+aGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOw0KKyAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7DQorICAgaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGUgPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsNCisgICBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUgPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7DQorICAgaW5mb19wdHItPmludGVybGFjZV90eXBlID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOw0KKw0KKyAgIHBuZ19jaGVja19JSERSIChwbmdfcHRyLCBpbmZvX3B0ci0+d2lkdGgsIGluZm9fcHRyLT5oZWlnaHQsDQorICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGUsDQorICAgICAgIGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlLCBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUpOw0KKw0KKyAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDE7DQorDQorICAgZWxzZSBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikNCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAzOw0KKw0KKyAgIGVsc2UNCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAxOw0KKw0KKyAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQ0KKyAgICAgIGluZm9fcHRyLT5jaGFubmVscysrOw0KKw0KKyAgIGluZm9fcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoaW5mb19wdHItPmNoYW5uZWxzICogaW5mb19wdHItPmJpdF9kZXB0aCk7DQorDQorICAgaW5mb19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKGluZm9fcHRyLT5waXhlbF9kZXB0aCwgd2lkdGgpOw0KK30NCisNCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X29GRnMocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIHBuZ19pbnRfMzIgb2Zmc2V0X3ksIGludCB1bml0X3R5cGUpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAib0ZGcyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaW5mb19wdHItPnhfb2Zmc2V0ID0gb2Zmc2V0X3g7DQorICAgaW5mb19wdHItPnlfb2Zmc2V0ID0gb2Zmc2V0X3k7DQorICAgaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgPSAocG5nX2J5dGUpdW5pdF90eXBlOw0KKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19vRkZzOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3BDQUwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19jb25zdF9jaGFycCBwdXJwb3NlLCBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwNCisgICAgaW50IG5wYXJhbXMsIHBuZ19jb25zdF9jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpDQorew0KKyAgIHBuZ19zaXplX3QgbGVuZ3RoOw0KKyAgIGludCBpOw0KKw0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAicENBTCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBwdXJwb3NlID09IE5VTEwgfHwgdW5pdHMgPT0gTlVMTA0KKyAgICAgIHx8IChucGFyYW1zID4gMCAmJiBwYXJhbXMgPT0gTlVMTCkpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGxlbmd0aCA9IHN0cmxlbihwdXJwb3NlKSArIDE7DQorICAgcG5nX2RlYnVnMSgzLCAiYWxsb2NhdGluZyBwdXJwb3NlIGZvciBpbmZvICglbHUgYnl0ZXMpIiwNCisgICAgICAgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoKTsNCisNCisgICAvKiBUT0RPOiB2YWxpZGF0ZSBmb3JtYXQgb2YgY2FsaWJyYXRpb24gbmFtZSBhbmQgdW5pdCBuYW1lICovDQorDQorICAgLyogQ2hlY2sgdGhhdCB0aGUgdHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpY2F0aW9uLiAqLw0KKyAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID4gMykNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcENBTCBlcXVhdGlvbiB0eXBlIik7DQorDQorICAgaWYgKG5wYXJhbXMgPCAwIHx8IG5wYXJhbXMgPiAyNTUpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIHBDQUwgcGFyYW1ldGVyIGNvdW50Iik7DQorDQorICAgLyogVmFsaWRhdGUgcGFyYW1zW25wYXJhbXNdICovDQorICAgZm9yIChpPTA7IGk8bnBhcmFtczsgKytpKQ0KKyAgICAgIGlmIChwYXJhbXNbaV0gPT0gTlVMTCB8fA0KKyAgICAgICAgICFwbmdfY2hlY2tfZnBfc3RyaW5nKHBhcmFtc1tpXSwgc3RybGVuKHBhcmFtc1tpXSkpKQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBmb3JtYXQgZm9yIHBDQUwgcGFyYW1ldGVyIik7DQorDQorICAgaW5mb19wdHItPnBjYWxfcHVycG9zZSA9IHBuZ192b2lkY2FzdChwbmdfY2hhcnAsDQorICAgICAgcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCkpOw0KKw0KKyAgIGlmIChpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID09IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBwQ0FMIHB1cnBvc2UiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIG1lbWNweShpbmZvX3B0ci0+cGNhbF9wdXJwb3NlLCBwdXJwb3NlLCBsZW5ndGgpOw0KKw0KKyAgIHBuZ19kZWJ1ZygzLCAic3RvcmluZyBYMCwgWDEsIHR5cGUsIGFuZCBucGFyYW1zIGluIGluZm8iKTsNCisgICBpbmZvX3B0ci0+cGNhbF9YMCA9IFgwOw0KKyAgIGluZm9fcHRyLT5wY2FsX1gxID0gWDE7DQorICAgaW5mb19wdHItPnBjYWxfdHlwZSA9IChwbmdfYnl0ZSl0eXBlOw0KKyAgIGluZm9fcHRyLT5wY2FsX25wYXJhbXMgPSAocG5nX2J5dGUpbnBhcmFtczsNCisNCisgICBsZW5ndGggPSBzdHJsZW4odW5pdHMpICsgMTsNCisgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXRzIGZvciBpbmZvICglbHUgYnl0ZXMpIiwNCisgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7DQorDQorICAgaW5mb19wdHItPnBjYWxfdW5pdHMgPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwLA0KKyAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpKTsNCisNCisgICBpZiAoaW5mb19wdHItPnBjYWxfdW5pdHMgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgdW5pdHMiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIG1lbWNweShpbmZvX3B0ci0+cGNhbF91bml0cywgdW5pdHMsIGxlbmd0aCk7DQorDQorICAgaW5mb19wdHItPnBjYWxfcGFyYW1zID0gcG5nX3ZvaWRjYXN0KHBuZ19jaGFycHAsIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLA0KKyAgICAgICAocG5nX3NpemVfdCkoKG5wYXJhbXMgKyAxKSAqIChzaXplb2YgKHBuZ19jaGFycCkpKSkpOw0KKw0KKyAgIGlmIChpbmZvX3B0ci0+cGNhbF9wYXJhbXMgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgcGFyYW1zIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBtZW1zZXQoaW5mb19wdHItPnBjYWxfcGFyYW1zLCAwLCAobnBhcmFtcyArIDEpICogKHNpemVvZiAocG5nX2NoYXJwKSkpOw0KKw0KKyAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspDQorICAgew0KKyAgICAgIGxlbmd0aCA9IHN0cmxlbihwYXJhbXNbaV0pICsgMTsNCisgICAgICBwbmdfZGVidWcyKDMsICJhbGxvY2F0aW5nIHBhcmFtZXRlciAlZCBmb3IgaW5mbyAoJWx1IGJ5dGVzKSIsIGksDQorICAgICAgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7DQorDQorICAgICAgaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsNCisNCisgICAgICBpZiAoaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldID09IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBwQ0FMIHBhcmFtZXRlciIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgbWVtY3B5KGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSwgcGFyYW1zW2ldLCBsZW5ndGgpOw0KKyAgIH0NCisNCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fcENBTDsNCisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9QQ0FMOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3NDQUxfcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgaW50IHVuaXQsIHBuZ19jb25zdF9jaGFycCBzd2lkdGgsIHBuZ19jb25zdF9jaGFycCBzaGVpZ2h0KQ0KK3sNCisgICBwbmdfc2l6ZV90IGxlbmd0aHcgPSAwLCBsZW5ndGhoID0gMDsNCisNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNDQUwiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIERvdWJsZSBjaGVjayB0aGUgdW5pdCAoc2hvdWxkIG5ldmVyIGdldCBoZXJlIHdpdGggYW4gaW52YWxpZA0KKyAgICAqIHVuaXQgdW5sZXNzIHRoaXMgaXMgYW4gQVBJIGNhbGwuKQ0KKyAgICAqLw0KKyAgIGlmICh1bml0ICE9IDEgJiYgdW5pdCAhPSAyKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIHVuaXQiKTsNCisNCisgICBpZiAoc3dpZHRoID09IE5VTEwgfHwgKGxlbmd0aHcgPSBzdHJsZW4oc3dpZHRoKSkgPT0gMCB8fA0KKyAgICAgICBzd2lkdGhbMF0gPT0gNDUgLyogJy0nICovIHx8ICFwbmdfY2hlY2tfZnBfc3RyaW5nKHN3aWR0aCwgbGVuZ3RodykpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIHNDQUwgd2lkdGgiKTsNCisNCisgICBpZiAoc2hlaWdodCA9PSBOVUxMIHx8IChsZW5ndGhoID0gc3RybGVuKHNoZWlnaHQpKSA9PSAwIHx8DQorICAgICAgIHNoZWlnaHRbMF0gPT0gNDUgLyogJy0nICovIHx8ICFwbmdfY2hlY2tfZnBfc3RyaW5nKHNoZWlnaHQsIGxlbmd0aGgpKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIGhlaWdodCIpOw0KKw0KKyAgIGluZm9fcHRyLT5zY2FsX3VuaXQgPSAocG5nX2J5dGUpdW5pdDsNCisNCisgICArK2xlbmd0aHc7DQorDQorICAgcG5nX2RlYnVnMSgzLCAiYWxsb2NhdGluZyB1bml0IGZvciBpbmZvICgldSBieXRlcykiLCAodW5zaWduZWQgaW50KWxlbmd0aHcpOw0KKw0KKyAgIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGggPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwLA0KKyAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGh3KSk7DQorDQorICAgaWYgKGluZm9fcHRyLT5zY2FsX3Nfd2lkdGggPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aGlsZSBwcm9jZXNzaW5nIHNDQUwiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIG1lbWNweShpbmZvX3B0ci0+c2NhbF9zX3dpZHRoLCBzd2lkdGgsIGxlbmd0aHcpOw0KKw0KKyAgICsrbGVuZ3RoaDsNCisNCisgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXQgZm9yIGluZm8gKCV1IGJ5dGVzKSIsICh1bnNpZ25lZCBpbnQpbGVuZ3RoaCk7DQorDQorICAgaW5mb19wdHItPnNjYWxfc19oZWlnaHQgPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwLA0KKyAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGhoKSk7DQorDQorICAgaWYgKGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID09IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ19mcmVlIChwbmdfcHRyLCBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoKTsNCisgICAgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gTlVMTDsNCisNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIHdoaWxlIHByb2Nlc3Npbmcgc0NBTCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgbWVtY3B5KGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0LCBzaGVpZ2h0LCBsZW5ndGhoKTsNCisNCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc0NBTDsNCisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9TQ0FMOw0KK30NCisNCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3NDQUwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LA0KKyAgICBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOw0KKw0KKyAgIC8qIENoZWNrIHRoZSBhcmd1bWVudHMuICovDQorICAgaWYgKHdpZHRoIDw9IDApDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0NBTCB3aWR0aCBpZ25vcmVkIik7DQorDQorICAgZWxzZSBpZiAoaGVpZ2h0IDw9IDApDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0NBTCBoZWlnaHQgaWdub3JlZCIpOw0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgLyogQ29udmVydCAnd2lkdGgnIGFuZCAnaGVpZ2h0JyB0byBBU0NJSS4gKi8NCisgICAgICBjaGFyIHN3aWR0aFtQTkdfc0NBTF9NQVhfRElHSVRTKzFdOw0KKyAgICAgIGNoYXIgc2hlaWdodFtQTkdfc0NBTF9NQVhfRElHSVRTKzFdOw0KKw0KKyAgICAgIHBuZ19hc2NpaV9mcm9tX2ZwKHBuZ19wdHIsIHN3aWR0aCwgKHNpemVvZiBzd2lkdGgpLCB3aWR0aCwNCisgICAgICAgICBQTkdfc0NBTF9QUkVDSVNJT04pOw0KKyAgICAgIHBuZ19hc2NpaV9mcm9tX2ZwKHBuZ19wdHIsIHNoZWlnaHQsIChzaXplb2Ygc2hlaWdodCksIGhlaWdodCwNCisgICAgICAgICBQTkdfc0NBTF9QUkVDSVNJT04pOw0KKw0KKyAgICAgIHBuZ19zZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCB1bml0LCBzd2lkdGgsIHNoZWlnaHQpOw0KKyAgIH0NCit9DQorIyAgZW5kaWYNCisNCisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3NDQUxfZml4ZWQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LA0KKyAgICBwbmdfZml4ZWRfcG9pbnQgd2lkdGgsIHBuZ19maXhlZF9wb2ludCBoZWlnaHQpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOw0KKw0KKyAgIC8qIENoZWNrIHRoZSBhcmd1bWVudHMuICovDQorICAgaWYgKHdpZHRoIDw9IDApDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0NBTCB3aWR0aCBpZ25vcmVkIik7DQorDQorICAgZWxzZSBpZiAoaGVpZ2h0IDw9IDApDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0NBTCBoZWlnaHQgaWdub3JlZCIpOw0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgLyogQ29udmVydCAnd2lkdGgnIGFuZCAnaGVpZ2h0JyB0byBBU0NJSS4gKi8NCisgICAgICBjaGFyIHN3aWR0aFtQTkdfc0NBTF9NQVhfRElHSVRTKzFdOw0KKyAgICAgIGNoYXIgc2hlaWdodFtQTkdfc0NBTF9NQVhfRElHSVRTKzFdOw0KKw0KKyAgICAgIHBuZ19hc2NpaV9mcm9tX2ZpeGVkKHBuZ19wdHIsIHN3aWR0aCwgKHNpemVvZiBzd2lkdGgpLCB3aWR0aCk7DQorICAgICAgcG5nX2FzY2lpX2Zyb21fZml4ZWQocG5nX3B0ciwgc2hlaWdodCwgKHNpemVvZiBzaGVpZ2h0KSwgaGVpZ2h0KTsNCisNCisgICAgICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgc3dpZHRoLCBzaGVpZ2h0KTsNCisgICB9DQorfQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9wSFlzKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfdWludF8zMiByZXNfeCwgcG5nX3VpbnRfMzIgcmVzX3ksIGludCB1bml0X3R5cGUpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAicEhZcyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0ID0gcmVzX3g7DQorICAgaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0ID0gcmVzX3k7DQorICAgaW5mb19wdHItPnBoeXNfdW5pdF90eXBlID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsNCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fcEhZczsNCit9DQorI2VuZGlmDQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X1BMVEUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19jb25zdF9jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKQ0KK3sNCisNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgIlBMVEUiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmIChudW1fcGFsZXR0ZSA8IDAgfHwgbnVtX3BhbGV0dGUgPiBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQ0KKyAgIHsNCisgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcGFsZXR0ZSBsZW5ndGgiKTsNCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBhbGV0dGUgbGVuZ3RoIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgaWYgKChudW1fcGFsZXR0ZSA+IDAgJiYgcGFsZXR0ZSA9PSBOVUxMKSB8fA0KKyAgICAgIChudW1fcGFsZXR0ZSA9PSAwDQorIyAgICAgICAgaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQNCisgICAgICAgICAgICAmJiAocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSA9PSAwDQorIyAgICAgICAgZW5kaWYNCisgICAgICApKQ0KKyAgIHsNCisgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJJbnZhbGlkIHBhbGV0dGUiLCBQTkdfQ0hVTktfRVJST1IpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgLyogSXQgbWF5IG5vdCBhY3R1YWxseSBiZSBuZWNlc3NhcnkgdG8gc2V0IHBuZ19wdHItPnBhbGV0dGUgaGVyZTsNCisgICAgKiB3ZSBkbyBpdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3YXkgdGhlIHBuZ19oYW5kbGVfdFJOUw0KKyAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gZG8gdGhlIGFsbG9jYXRpb24uDQorICAgICoNCisgICAgKiAxLjYuMDogdGhlIGFib3ZlIHN0YXRlbWVudCBhcHBlYXJzIHRvIGJlIGluY29ycmVjdDsgc29tZXRoaW5nIGhhcyB0byBzZXQNCisgICAgKiB0aGUgcGFsZXR0ZSBpbnNpZGUgcG5nX3N0cnVjdCBvbiByZWFkLg0KKyAgICAqLw0KKyAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1BMVEUsIDApOw0KKw0KKyAgIC8qIENoYW5nZWQgaW4gbGlicG5nLTEuMi4xIHRvIGFsbG9jYXRlIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW5zdGVhZA0KKyAgICAqIG9mIG51bV9wYWxldHRlIGVudHJpZXMsIGluIGNhc2Ugb2YgYW4gaW52YWxpZCBQTkcgZmlsZSB0aGF0IGhhcw0KKyAgICAqIHRvby1sYXJnZSBzYW1wbGUgdmFsdWVzLg0KKyAgICAqLw0KKyAgIHBuZ19wdHItPnBhbGV0dGUgPSBwbmdfdm9pZGNhc3QocG5nX2NvbG9ycCwgcG5nX2NhbGxvYyhwbmdfcHRyLA0KKyAgICAgICBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICogKHNpemVvZiAocG5nX2NvbG9yKSkpKTsNCisNCisgICBpZiAobnVtX3BhbGV0dGUgPiAwKQ0KKyAgICAgIG1lbWNweShwbmdfcHRyLT5wYWxldHRlLCBwYWxldHRlLCBudW1fcGFsZXR0ZSAqIChzaXplb2YgKHBuZ19jb2xvcikpKTsNCisgICBpbmZvX3B0ci0+cGFsZXR0ZSA9IHBuZ19wdHItPnBhbGV0dGU7DQorICAgaW5mb19wdHItPm51bV9wYWxldHRlID0gcG5nX3B0ci0+bnVtX3BhbGV0dGUgPSAocG5nX3VpbnRfMTYpbnVtX3BhbGV0dGU7DQorDQorICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfUExURTsNCisNCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fUExURTsNCit9DQorDQorI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9zQklUKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29uc3RfY29sb3JfOHAgc2lnX2JpdCkNCit7DQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJzQklUIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IHNpZ19iaXQgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaW5mb19wdHItPnNpZ19iaXQgPSAqc2lnX2JpdDsNCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc0JJVDsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9zUkdCKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLCBpbnQgc3JnYl9pbnRlbnQpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic1JHQiIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgKHZvaWQpcG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0IocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLCBzcmdiX2ludGVudCk7DQorICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgaW50IHNyZ2JfaW50ZW50KQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNSR0JfZ0FNQV9hbmRfY0hSTSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKHBuZ19jb2xvcnNwYWNlX3NldF9zUkdCKHBuZ19wdHIsICZpbmZvX3B0ci0+Y29sb3JzcGFjZSwgc3JnYl9pbnRlbnQpKQ0KKyAgIHsNCisgICAgICAvKiBUaGlzIGNhdXNlcyB0aGUgZ0FNQSBhbmQgY0hSTSB0byBiZSB3cml0dGVuIHRvbyAqLw0KKyAgICAgIGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzIHw9DQorICAgICAgICAgUE5HX0NPTE9SU1BBQ0VfRlJPTV9nQU1BfFBOR19DT0xPUlNQQUNFX0ZST01fY0hSTTsNCisgICB9DQorDQorICAgcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorI2VuZGlmIC8qIHNSR0IgKi8NCisNCisNCisjaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2lDQ1AocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19jb25zdF9jaGFycCBuYW1lLCBpbnQgY29tcHJlc3Npb25fdHlwZSwNCisgICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUsIHBuZ191aW50XzMyIHByb2ZsZW4pDQorew0KKyAgIHBuZ19jaGFycCBuZXdfaWNjcF9uYW1lOw0KKyAgIHBuZ19ieXRlcCBuZXdfaWNjcF9wcm9maWxlOw0KKyAgIHBuZ19zaXplX3QgbGVuZ3RoOw0KKw0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaUNDUCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwgfHwgcHJvZmlsZSA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAoY29tcHJlc3Npb25fdHlwZSAhPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQ0KKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgaUNDUCBjb21wcmVzc2lvbiBtZXRob2QiKTsNCisNCisgICAvKiBTZXQgdGhlIGNvbG9yc3BhY2UgZmlyc3QgYmVjYXVzZSB0aGlzIHZhbGlkYXRlcyB0aGUgcHJvZmlsZTsgZG8gbm90DQorICAgICogb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgYXBwIGNIUk0gb3IgZ0FNQSBoZXJlIChiZWNhdXNlIGxpa2VseSBhcyBub3QgdGhlDQorICAgICogYXBwbGljYXRpb24ga25vd3MgYmV0dGVyIHRoYW4gbGlicG5nIHdoYXQgdGhlIGNvcnJlY3QgdmFsdWVzIGFyZS4pICBQYXNzDQorICAgICogdGhlIGluZm9fcHRyIGNvbG9yX3R5cGUgZmllbGQgdG8gcG5nX2NvbG9yc3BhY2Vfc2V0X0lDQyBiZWNhdXNlIGluIHRoZQ0KKyAgICAqIHdyaXRlIGNhc2UgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdG9yZWQgaW4gcG5nX3B0ci4NCisgICAgKi8NCisgICB7DQorICAgICAgaW50IHJlc3VsdCA9IHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLCBuYW1lLA0KKyAgICAgICAgIHByb2ZsZW4sIHByb2ZpbGUsIGluZm9fcHRyLT5jb2xvcl90eXBlKTsNCisNCisgICAgICBwbmdfY29sb3JzcGFjZV9zeW5jX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOw0KKw0KKyAgICAgIC8qIERvbid0IGRvIGFueSBvZiB0aGUgY29weWluZyBpZiB0aGUgcHJvZmlsZSB3YXMgYmFkLCBvciBpbmNvbnNpc3RlbnQuICovDQorICAgICAgaWYgKCFyZXN1bHQpDQorICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgIC8qIEJ1dCBkbyB3cml0ZSB0aGUgZ0FNQSBhbmQgY0hSTSBjaHVua3MgZnJvbSB0aGUgcHJvZmlsZS4gKi8NCisgICAgICBpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyB8PQ0KKyAgICAgICAgIFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQXxQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk07DQorICAgfQ0KKw0KKyAgIGxlbmd0aCA9IHN0cmxlbihuYW1lKSsxOw0KKyAgIG5ld19pY2NwX25hbWUgPSBwbmdfdm9pZGNhc3QocG5nX2NoYXJwLCBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKSk7DQorDQorICAgaWYgKG5ld19pY2NwX25hbWUgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIGlDQ1AgY2h1bmsiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIG1lbWNweShuZXdfaWNjcF9uYW1lLCBuYW1lLCBsZW5ndGgpOw0KKyAgIG5ld19pY2NwX3Byb2ZpbGUgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLA0KKyAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBwcm9mbGVuKSk7DQorDQorICAgaWYgKG5ld19pY2NwX3Byb2ZpbGUgPT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2ljY3BfbmFtZSk7DQorICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLA0KKyAgICAgICAgICAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIGlDQ1AgcHJvZmlsZSIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgbWVtY3B5KG5ld19pY2NwX3Byb2ZpbGUsIHByb2ZpbGUsIHByb2ZsZW4pOw0KKw0KKyAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0lDQ1AsIDApOw0KKw0KKyAgIGluZm9fcHRyLT5pY2NwX3Byb2ZsZW4gPSBwcm9mbGVuOw0KKyAgIGluZm9fcHRyLT5pY2NwX25hbWUgPSBuZXdfaWNjcF9uYW1lOw0KKyAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUgPSBuZXdfaWNjcF9wcm9maWxlOw0KKyAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX0lDQ1A7DQorICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2lDQ1A7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfdGV4dChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX2NvbnN0X3RleHRwIHRleHRfcHRyLCBpbnQgbnVtX3RleHQpDQorew0KKyAgIGludCByZXQ7DQorICAgcmV0ID0gcG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7DQorDQorICAgaWYgKHJldCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gc3RvcmUgdGV4dCIpOw0KK30NCisNCitpbnQgLyogUFJJVkFURSAqLw0KK3BuZ19zZXRfdGV4dF8yKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29uc3RfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCkNCit7DQorICAgaW50IGk7DQorDQorICAgcG5nX2RlYnVnMSgxLCAiaW4gJWx4IHN0b3JhZ2UgZnVuY3Rpb24iLCBwbmdfcHRyID09IE5VTEwgPyAidW5leHBlY3RlZCIgOg0KKyAgICAgICh1bnNpZ25lZCBsb25nKXBuZ19wdHItPmNodW5rX25hbWUpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBudW1fdGV4dCA8PSAwIHx8IHRleHRfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuKDApOw0KKw0KKyAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgInRleHQiIGFycmF5IGluIGluZm9fc3RydWN0DQorICAgICogdG8gaG9sZCBhbGwgb2YgdGhlIGluY29taW5nIHRleHRfcHRyIG9iamVjdHMuICBUaGlzIGNvbXBhcmUgY2FuJ3Qgb3ZlcmZsb3cNCisgICAgKiBiZWNhdXNlIG1heF90ZXh0ID49IG51bV90ZXh0IChhbnl3YXksIHN1YnRyYWN0IG9mIHR3byBwb3NpdGl2ZSBpbnRlZ2Vycw0KKyAgICAqIGNhbid0IG92ZXJmbG93IGluIGFueSBjYXNlLikNCisgICAgKi8NCisgICBpZiAobnVtX3RleHQgPiBpbmZvX3B0ci0+bWF4X3RleHQgLSBpbmZvX3B0ci0+bnVtX3RleHQpDQorICAgew0KKyAgICAgIGludCBvbGRfbnVtX3RleHQgPSBpbmZvX3B0ci0+bnVtX3RleHQ7DQorICAgICAgaW50IG1heF90ZXh0Ow0KKyAgICAgIHBuZ190ZXh0cCBuZXdfdGV4dCA9IE5VTEw7DQorDQorICAgICAgLyogQ2FsY3VsYXRlIGFuIGFwcHJvcHJpYXRlIG1heF90ZXh0LCBjaGVja2luZyBmb3Igb3ZlcmZsb3cuICovDQorICAgICAgbWF4X3RleHQgPSBvbGRfbnVtX3RleHQ7DQorICAgICAgaWYgKG51bV90ZXh0IDw9IElOVF9NQVggLSBtYXhfdGV4dCkNCisgICAgICB7DQorICAgICAgICAgbWF4X3RleHQgKz0gbnVtX3RleHQ7DQorDQorICAgICAgICAgLyogUm91bmQgdXAgdG8gYSBtdWx0aXBsZSBvZiA4ICovDQorICAgICAgICAgaWYgKG1heF90ZXh0IDwgSU5UX01BWC04KQ0KKyAgICAgICAgICAgIG1heF90ZXh0ID0gKG1heF90ZXh0ICsgOCkgJiB+MHg3Ow0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBtYXhfdGV4dCA9IElOVF9NQVg7DQorDQorICAgICAgICAgLyogTm93IGFsbG9jYXRlIGEgbmV3IGFycmF5IGFuZCBjb3B5IHRoZSBvbGQgbWVtYmVycyBpbiwgdGhpcyBkb2VzIGFsbA0KKyAgICAgICAgICAqIHRoZSBvdmVyZmxvdyBjaGVja3MuDQorICAgICAgICAgICovDQorICAgICAgICAgbmV3X3RleHQgPSBwbmdfdm9pZGNhc3QocG5nX3RleHRwLHBuZ19yZWFsbG9jX2FycmF5KHBuZ19wdHIsDQorICAgICAgICAgICAgaW5mb19wdHItPnRleHQsIG9sZF9udW1fdGV4dCwgbWF4X3RleHQtb2xkX251bV90ZXh0LA0KKyAgICAgICAgICAgIHNpemVvZiAqbmV3X3RleHQpKTsNCisgICAgICB9DQorDQorICAgICAgaWYgKG5ld190ZXh0ID09IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgInRvbyBtYW55IHRleHQgY2h1bmtzIiwNCisgICAgICAgICAgICBQTkdfQ0hVTktfV1JJVEVfRVJST1IpOw0KKyAgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dCk7DQorDQorICAgICAgaW5mb19wdHItPnRleHQgPSBuZXdfdGV4dDsNCisgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9URVhUOw0KKyAgICAgIGluZm9fcHRyLT5tYXhfdGV4dCA9IG1heF90ZXh0Ow0KKyAgICAgIC8qIG51bV90ZXh0IGlzIGFkanVzdGVkIGJlbG93IGFzIHRoZSBlbnRyaWVzIGFyZSBjb3BpZWQgaW4gKi8NCisNCisgICAgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0ZWQgJWQgZW50cmllcyBmb3IgaW5mb19wdHItPnRleHQiLCBtYXhfdGV4dCk7DQorICAgfQ0KKw0KKyAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGV4dDsgaSsrKQ0KKyAgIHsNCisgICAgICBzaXplX3QgdGV4dF9sZW5ndGgsIGtleV9sZW47DQorICAgICAgc2l6ZV90IGxhbmdfbGVuLCBsYW5nX2tleV9sZW47DQorICAgICAgcG5nX3RleHRwIHRleHRwID0gJihpbmZvX3B0ci0+dGV4dFtpbmZvX3B0ci0+bnVtX3RleHRdKTsNCisNCisgICAgICBpZiAodGV4dF9wdHJbaV0ua2V5ID09IE5VTEwpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA8IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgfHwNCisgICAgICAgICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gPj0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTEFTVCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAidGV4dCBjb21wcmVzc2lvbiBtb2RlIGlzIG91dCBvZiByYW5nZSIsDQorICAgICAgICAgICAgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCisgICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorDQorICAgICAga2V5X2xlbiA9IHN0cmxlbih0ZXh0X3B0cltpXS5rZXkpOw0KKw0KKyAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA8PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBsYW5nX2xlbiA9IDA7DQorICAgICAgICAgbGFuZ19rZXlfbGVuID0gMDsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyMgIGlmZGVmIFBOR19pVFh0X1NVUFBPUlRFRA0KKyAgICAgIHsNCisgICAgICAgICAvKiBTZXQgaVRYdCBkYXRhICovDQorDQorICAgICAgICAgaWYgKHRleHRfcHRyW2ldLmxhbmcgIT0gTlVMTCkNCisgICAgICAgICAgICBsYW5nX2xlbiA9IHN0cmxlbih0ZXh0X3B0cltpXS5sYW5nKTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgbGFuZ19sZW4gPSAwOw0KKw0KKyAgICAgICAgIGlmICh0ZXh0X3B0cltpXS5sYW5nX2tleSAhPSBOVUxMKQ0KKyAgICAgICAgICAgIGxhbmdfa2V5X2xlbiA9IHN0cmxlbih0ZXh0X3B0cltpXS5sYW5nX2tleSk7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGxhbmdfa2V5X2xlbiA9IDA7DQorICAgICAgfQ0KKyMgIGVsc2UgLyogUE5HX2lUWHRfU1VQUE9SVEVEICovDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgImlUWHQgY2h1bmsgbm90IHN1cHBvcnRlZCIsDQorICAgICAgICAgICAgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCisgICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorIyAgZW5kaWYNCisNCisgICAgICBpZiAodGV4dF9wdHJbaV0udGV4dCA9PSBOVUxMIHx8IHRleHRfcHRyW2ldLnRleHRbMF0gPT0gJ1wwJykNCisgICAgICB7DQorICAgICAgICAgdGV4dF9sZW5ndGggPSAwOw0KKyMgIGlmZGVmIFBOR19pVFh0X1NVUFBPUlRFRA0KKyAgICAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA+IDApDQorICAgICAgICAgICAgdGV4dHAtPmNvbXByZXNzaW9uID0gUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORTsNCisNCisgICAgICAgICBlbHNlDQorIyAgZW5kaWYNCisgICAgICAgICAgICB0ZXh0cC0+Y29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIHRleHRfbGVuZ3RoID0gc3RybGVuKHRleHRfcHRyW2ldLnRleHQpOw0KKyAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IHRleHRfcHRyW2ldLmNvbXByZXNzaW9uOw0KKyAgICAgIH0NCisNCisgICAgICB0ZXh0cC0+a2V5ID0gcG5nX3ZvaWRjYXN0KHBuZ19jaGFycCxwbmdfbWFsbG9jX2Jhc2UocG5nX3B0ciwNCisgICAgICAgICAga2V5X2xlbiArIHRleHRfbGVuZ3RoICsgbGFuZ19sZW4gKyBsYW5nX2tleV9sZW4gKyA0KSk7DQorDQorICAgICAgaWYgKHRleHRwLT5rZXkgPT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAidGV4dCBjaHVuazogb3V0IG9mIG1lbW9yeSIsDQorICAgICAgICAgICAgICAgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCisgICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorDQorICAgICAgcG5nX2RlYnVnMigyLCAiQWxsb2NhdGVkICVsdSBieXRlcyBhdCAlcCBpbiBwbmdfc2V0X3RleHQiLA0KKyAgICAgICAgICAodW5zaWduZWQgbG9uZykocG5nX3VpbnRfMzIpDQorICAgICAgICAgIChrZXlfbGVuICsgbGFuZ19sZW4gKyBsYW5nX2tleV9sZW4gKyB0ZXh0X2xlbmd0aCArIDQpLA0KKyAgICAgICAgICB0ZXh0cC0+a2V5KTsNCisNCisgICAgICBtZW1jcHkodGV4dHAtPmtleSwgdGV4dF9wdHJbaV0ua2V5LCBrZXlfbGVuKTsNCisgICAgICAqKHRleHRwLT5rZXkgKyBrZXlfbGVuKSA9ICdcMCc7DQorDQorICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uID4gMCkNCisgICAgICB7DQorICAgICAgICAgdGV4dHAtPmxhbmcgPSB0ZXh0cC0+a2V5ICsga2V5X2xlbiArIDE7DQorICAgICAgICAgbWVtY3B5KHRleHRwLT5sYW5nLCB0ZXh0X3B0cltpXS5sYW5nLCBsYW5nX2xlbik7DQorICAgICAgICAgKih0ZXh0cC0+bGFuZyArIGxhbmdfbGVuKSA9ICdcMCc7DQorICAgICAgICAgdGV4dHAtPmxhbmdfa2V5ID0gdGV4dHAtPmxhbmcgKyBsYW5nX2xlbiArIDE7DQorICAgICAgICAgbWVtY3B5KHRleHRwLT5sYW5nX2tleSwgdGV4dF9wdHJbaV0ubGFuZ19rZXksIGxhbmdfa2V5X2xlbik7DQorICAgICAgICAgKih0ZXh0cC0+bGFuZ19rZXkgKyBsYW5nX2tleV9sZW4pID0gJ1wwJzsNCisgICAgICAgICB0ZXh0cC0+dGV4dCA9IHRleHRwLT5sYW5nX2tleSArIGxhbmdfa2V5X2xlbiArIDE7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgdGV4dHAtPmxhbmc9TlVMTDsNCisgICAgICAgICB0ZXh0cC0+bGFuZ19rZXk9TlVMTDsNCisgICAgICAgICB0ZXh0cC0+dGV4dCA9IHRleHRwLT5rZXkgKyBrZXlfbGVuICsgMTsNCisgICAgICB9DQorDQorICAgICAgaWYgKHRleHRfbGVuZ3RoKQ0KKyAgICAgICAgIG1lbWNweSh0ZXh0cC0+dGV4dCwgdGV4dF9wdHJbaV0udGV4dCwgdGV4dF9sZW5ndGgpOw0KKw0KKyAgICAgICoodGV4dHAtPnRleHQgKyB0ZXh0X2xlbmd0aCkgPSAnXDAnOw0KKw0KKyMgIGlmZGVmIFBOR19pVFh0X1NVUFBPUlRFRA0KKyAgICAgIGlmICh0ZXh0cC0+Y29tcHJlc3Npb24gPiAwKQ0KKyAgICAgIHsNCisgICAgICAgICB0ZXh0cC0+dGV4dF9sZW5ndGggPSAwOw0KKyAgICAgICAgIHRleHRwLT5pdHh0X2xlbmd0aCA9IHRleHRfbGVuZ3RoOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorIyAgZW5kaWYNCisgICAgICB7DQorICAgICAgICAgdGV4dHAtPnRleHRfbGVuZ3RoID0gdGV4dF9sZW5ndGg7DQorICAgICAgICAgdGV4dHAtPml0eHRfbGVuZ3RoID0gMDsNCisgICAgICB9DQorDQorICAgICAgaW5mb19wdHItPm51bV90ZXh0Kys7DQorICAgICAgcG5nX2RlYnVnMSgzLCAidHJhbnNmZXJyZWQgdGV4dCBjaHVuayAlZCIsIGluZm9fcHRyLT5udW1fdGV4dCk7DQorICAgfQ0KKw0KKyAgIHJldHVybigwKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF90SU1FKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBwbmdfY29uc3RfdGltZXAgbW9kX3RpbWUpDQorew0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAidElNRSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fCBtb2RfdGltZSA9PSBOVUxMIHx8DQorICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX3RJTUUpKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAobW9kX3RpbWUtPm1vbnRoID09IDAgICB8fCBtb2RfdGltZS0+bW9udGggPiAxMiAgfHwNCisgICAgICAgbW9kX3RpbWUtPmRheSAgID09IDAgICB8fCBtb2RfdGltZS0+ZGF5ICAgPiAzMSAgfHwNCisgICAgICAgbW9kX3RpbWUtPmhvdXIgID4gMjMgICB8fCBtb2RfdGltZS0+bWludXRlID4gNTkgfHwNCisgICAgICAgbW9kX3RpbWUtPnNlY29uZCA+IDYwKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSWdub3JpbmcgaW52YWxpZCB0aW1lIHZhbHVlIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpbmZvX3B0ci0+bW9kX3RpbWUgPSAqbW9kX3RpbWU7DQorICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3RJTUU7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfdFJOUyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwNCisgICAgcG5nX2NvbnN0X2J5dGVwIHRyYW5zX2FscGhhLCBpbnQgbnVtX3RyYW5zLCBwbmdfY29uc3RfY29sb3JfMTZwIHRyYW5zX2NvbG9yKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInRSTlMiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmICh0cmFuc19hbHBoYSAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAgLyogSXQgbWF5IG5vdCBhY3R1YWxseSBiZSBuZWNlc3NhcnkgdG8gc2V0IHBuZ19wdHItPnRyYW5zX2FscGhhIGhlcmU7DQorICAgICAgICAqIHdlIGRvIGl0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHdheSB0aGUgcG5nX2hhbmRsZV90Uk5TDQorICAgICAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gZG8gdGhlIGFsbG9jYXRpb24uDQorICAgICAgICAqDQorICAgICAgICAqIDEuNi4wOiBUaGUgYWJvdmUgc3RhdGVtZW50IGlzIGluY29ycmVjdDsgcG5nX2hhbmRsZV90Uk5TIGVmZmVjdGl2ZWx5DQorICAgICAgICAqIHJlbGllcyBvbiBwbmdfc2V0X3RSTlMgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gcG5nX3N0cnVjdA0KKyAgICAgICAgKiAob3RoZXJ3aXNlIGl0IHdvbid0IGJlIHRoZXJlIGZvciB0aGUgY29kZSBpbiBwbmdydHJhbi5jKS4NCisgICAgICAgICovDQorDQorICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1RSTlMsIDApOw0KKw0KKyAgICAgICAvKiBDaGFuZ2VkIGZyb20gbnVtX3RyYW5zIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4gdmVyc2lvbiAxLjIuMSAqLw0KKyAgICAgICBwbmdfcHRyLT50cmFuc19hbHBoYSA9IGluZm9fcHRyLT50cmFuc19hbHBoYSA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsDQorICAgICAgICAgcG5nX21hbGxvYyhwbmdfcHRyLCBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKSk7DQorDQorICAgICAgIGlmIChudW1fdHJhbnMgPiAwICYmIG51bV90cmFucyA8PSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQ0KKyAgICAgICAgICBtZW1jcHkoaW5mb19wdHItPnRyYW5zX2FscGhhLCB0cmFuc19hbHBoYSwgKHBuZ19zaXplX3QpbnVtX3RyYW5zKTsNCisgICB9DQorDQorICAgaWYgKHRyYW5zX2NvbG9yICE9IE5VTEwpDQorICAgew0KKyAgICAgIGludCBzYW1wbGVfbWF4ID0gKDEgPDwgaW5mb19wdHItPmJpdF9kZXB0aCk7DQorDQorICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmDQorICAgICAgICAgIHRyYW5zX2NvbG9yLT5ncmF5ID4gc2FtcGxlX21heCkgfHwNCisgICAgICAgICAgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJg0KKyAgICAgICAgICAodHJhbnNfY29sb3ItPnJlZCA+IHNhbXBsZV9tYXggfHwNCisgICAgICAgICAgdHJhbnNfY29sb3ItPmdyZWVuID4gc2FtcGxlX21heCB8fA0KKyAgICAgICAgICB0cmFuc19jb2xvci0+Ymx1ZSA+IHNhbXBsZV9tYXgpKSkNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICJ0Uk5TIGNodW5rIGhhcyBvdXQtb2YtcmFuZ2Ugc2FtcGxlcyBmb3IgYml0X2RlcHRoIik7DQorDQorICAgICAgaW5mb19wdHItPnRyYW5zX2NvbG9yID0gKnRyYW5zX2NvbG9yOw0KKw0KKyAgICAgIGlmIChudW1fdHJhbnMgPT0gMCkNCisgICAgICAgICBudW1fdHJhbnMgPSAxOw0KKyAgIH0NCisNCisgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gKHBuZ191aW50XzE2KW51bV90cmFuczsNCisNCisgICBpZiAobnVtX3RyYW5zICE9IDApDQorICAgew0KKyAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT190Uk5TOw0KKyAgICAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1RSTlM7DQorICAgfQ0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3NQTFQocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF9zUExUX3RwIGVudHJpZXMsIGludCBuZW50cmllcykNCisvKg0KKyAqICBlbnRyaWVzICAgICAgICAtIGFycmF5IG9mIHBuZ19zUExUX3Qgc3RydWN0dXJlcw0KKyAqICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzDQorICogICAgICAgICAgICAgICAgICAgaW4gdGhlIGluZm8gc3RydWN0dXJlLg0KKyAqDQorICogIG5lbnRyaWVzICAgICAgIC0gbnVtYmVyIG9mIHBhbGV0dGUgc3RydWN0dXJlcyB0byBiZQ0KKyAqICAgICAgICAgICAgICAgICAgIGFkZGVkLg0KKyAqLw0KK3sNCisgICBwbmdfc1BMVF90cCBucDsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbmVudHJpZXMgPD0gMCB8fCBlbnRyaWVzID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIFVzZSB0aGUgaW50ZXJuYWwgcmVhbGxvYyBmdW5jdGlvbiwgd2hpY2ggY2hlY2tzIGZvciBhbGwgdGhlIHBvc3NpYmxlDQorICAgICogb3ZlcmZsb3dzLiAgTm90aWNlIHRoYXQgdGhlIHBhcmFtZXRlcnMgYXJlIChpbnQpIGFuZCAoc2l6ZV90KQ0KKyAgICAqLw0KKyAgIG5wID0gcG5nX3ZvaWRjYXN0KHBuZ19zUExUX3RwLHBuZ19yZWFsbG9jX2FycmF5KHBuZ19wdHIsDQorICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSwgbmVudHJpZXMsDQorICAgICAgc2l6ZW9mICpucCkpOw0KKw0KKyAgIGlmIChucCA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICAvKiBPdXQgb2YgbWVtb3J5IG9yIHRvbyBtYW55IGNodW5rcyAqLw0KKyAgICAgIHBuZ19jaHVua19yZXBvcnQocG5nX3B0ciwgInRvbyBtYW55IHNQTFQgY2h1bmtzIiwgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKTsNCisgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyA9IG5wOw0KKyAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1NQTFQ7DQorDQorICAgbnAgKz0gaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtOw0KKw0KKyAgIGRvDQorICAgew0KKyAgICAgIHBuZ19zaXplX3QgbGVuZ3RoOw0KKw0KKyAgICAgIC8qIFNraXAgaW52YWxpZCBpbnB1dCBlbnRyaWVzICovDQorICAgICAgaWYgKGVudHJpZXMtPm5hbWUgPT0gTlVMTCB8fCBlbnRyaWVzLT5lbnRyaWVzID09IE5VTEwpDQorICAgICAgew0KKyAgICAgICAgIC8qIHBuZ19oYW5kbGVfc1BMVCBkb2Vzbid0IGRvIHRoaXMsIHNvIHRoaXMgaXMgYW4gYXBwIGVycm9yICovDQorICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAicG5nX3NldF9zUExUOiBpbnZhbGlkIHNQTFQiKTsNCisgICAgICAgICAvKiBKdXN0IHNraXAgdGhlIGludmFsaWQgZW50cnkgKi8NCisgICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorDQorICAgICAgbnAtPmRlcHRoID0gZW50cmllcy0+ZGVwdGg7DQorDQorICAgICAgLyogSW4gdGhlIGV2ZW4gb2Ygb3V0LW9mLW1lbW9yeSBqdXN0IHJldHVybiAtIHRoZXJlJ3Mgbm8gcG9pbnQga2VlcGluZyBvbg0KKyAgICAgICAqIHRyeWluZyB0byBhZGQgc1BMVCBjaHVua3MuDQorICAgICAgICovDQorICAgICAgbGVuZ3RoID0gc3RybGVuKGVudHJpZXMtPm5hbWUpICsgMTsNCisgICAgICBucC0+bmFtZSA9IHBuZ192b2lkY2FzdChwbmdfY2hhcnAsIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCBsZW5ndGgpKTsNCisNCisgICAgICBpZiAobnAtPm5hbWUgPT0gTlVMTCkNCisgICAgICAgICBicmVhazsNCisNCisgICAgICBtZW1jcHkobnAtPm5hbWUsIGVudHJpZXMtPm5hbWUsIGxlbmd0aCk7DQorDQorICAgICAgLyogSU1QT1JUQU5UOiB3ZSBoYXZlIG1lbW9yeSBub3cgdGhhdCB3b24ndCBnZXQgZnJlZWQgaWYgc29tZXRoaW5nIGVsc2UNCisgICAgICAgKiBnb2VzIHdyb25nLCB0aGlzIGNvZGUgbXVzdCBmcmVlIGl0LiAgcG5nX21hbGxvY19hcnJheSBwcm9kdWNlcyBubw0KKyAgICAgICAqIHdhcm5pbmdzLCB1c2UgYSBwbmdfY2h1bmtfcmVwb3J0IChiZWxvdykgaWYgdGhlcmUgaXMgYW4gZXJyb3IuDQorICAgICAgICovDQorICAgICAgbnAtPmVudHJpZXMgPSBwbmdfdm9pZGNhc3QocG5nX3NQTFRfZW50cnlwLCBwbmdfbWFsbG9jX2FycmF5KHBuZ19wdHIsDQorICAgICAgICAgIGVudHJpZXMtPm5lbnRyaWVzLCBzaXplb2YgKHBuZ19zUExUX2VudHJ5KSkpOw0KKw0KKyAgICAgIGlmIChucC0+ZW50cmllcyA9PSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBucC0+bmFtZSk7DQorICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyAgICAgIG5wLT5uZW50cmllcyA9IGVudHJpZXMtPm5lbnRyaWVzOw0KKyAgICAgIC8qIFRoaXMgbXVsdGlwbHkgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSBwbmdfbWFsbG9jX2FycmF5IGhhcyBhbHJlYWR5DQorICAgICAgICogY2hlY2tlZCBpdCB3aGVuIGRvaW5nIHRoZSBhbGxvY2F0aW9uLg0KKyAgICAgICAqLw0KKyAgICAgIG1lbWNweShucC0+ZW50cmllcywgZW50cmllcy0+ZW50cmllcywNCisgICAgICAgICBlbnRyaWVzLT5uZW50cmllcyAqIHNpemVvZiAocG5nX3NQTFRfZW50cnkpKTsNCisNCisgICAgICAvKiBOb3RlIHRoYXQgJ2NvbnRpbnVlJyBza2lwcyB0aGUgYWR2YW5jZSBvZiB0aGUgb3V0IHBvaW50ZXIgYW5kIG91dA0KKyAgICAgICAqIGNvdW50LCBzbyBhbiBpbnZhbGlkIGVudHJ5IGlzIG5vdCBhZGRlZC4NCisgICAgICAgKi8NCisgICAgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc1BMVDsNCisgICAgICArKyhpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0pOw0KKyAgICAgICsrbnA7DQorICAgfQ0KKyAgIHdoaWxlICgrK2VudHJpZXMsIC0tbmVudHJpZXMpOw0KKw0KKyAgIGlmIChuZW50cmllcyA+IDApDQorICAgICAgcG5nX2NodW5rX3JlcG9ydChwbmdfcHRyLCAic1BMVCBvdXQgb2YgbWVtb3J5IiwgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCit9DQorI2VuZGlmIC8qIFBOR19zUExUX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorc3RhdGljIHBuZ19ieXRlDQorY2hlY2tfbG9jYXRpb24ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIGludCBsb2NhdGlvbikNCit7DQorICAgbG9jYXRpb24gJj0gKFBOR19IQVZFX0lIRFJ8UE5HX0hBVkVfUExURXxQTkdfQUZURVJfSURBVCk7DQorDQorICAgLyogTmV3IGluIDEuNi4wOyBjb3B5IHRoZSBsb2NhdGlvbiBhbmQgY2hlY2sgaXQuICBUaGlzIGlzIGFuIEFQSQ0KKyAgICAqIGNoYW5nZSwgcHJldmlvdXNseSB0aGUgYXBwIGhhZCB0byB1c2UgdGhlDQorICAgICogcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uIEFQSSBiZWxvdyBmb3IgZWFjaCBjaHVuay4NCisgICAgKi8NCisgICBpZiAobG9jYXRpb24gPT0gMCAmJiAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpKQ0KKyAgIHsNCisgICAgICAvKiBXcml0ZSBzdHJ1Y3QsIHNvIHVua25vd24gY2h1bmtzIGNvbWUgZnJvbSB0aGUgYXBwICovDQorICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsDQorICAgICAgICAgInBuZ19zZXRfdW5rbm93bl9jaHVua3Mgbm93IGV4cGVjdHMgYSB2YWxpZCBsb2NhdGlvbiIpOw0KKyAgICAgIC8qIFVzZSB0aGUgb2xkIGJlaGF2aW9yICovDQorICAgICAgbG9jYXRpb24gPSAocG5nX2J5dGUpKHBuZ19wdHItPm1vZGUgJg0KKyAgICAgICAgIChQTkdfSEFWRV9JSERSfFBOR19IQVZFX1BMVEV8UE5HX0FGVEVSX0lEQVQpKTsNCisgICB9DQorDQorICAgLyogVGhpcyBuZWVkIG5vdCBiZSBhbiBpbnRlcm5hbCBlcnJvciAtIGlmIHRoZSBhcHAgY2FsbHMNCisgICAgKiBwbmdfc2V0X3Vua25vd25fY2h1bmtzIG9uIGEgcmVhZCBwb2ludGVyIGl0IG11c3QgZ2V0IHRoZSBsb2NhdGlvbiByaWdodC4NCisgICAgKi8NCisgICBpZiAobG9jYXRpb24gPT0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgbG9jYXRpb24gaW4gcG5nX3NldF91bmtub3duX2NodW5rcyIpOw0KKw0KKyAgIC8qIE5vdyByZWR1Y2UgdGhlIGxvY2F0aW9uIHRvIHRoZSB0b3AtbW9zdCBzZXQgYml0IGJ5IHJlbW92aW5nIGVhY2ggbGVhc3QNCisgICAgKiBzaWduaWZpY2FudCBiaXQgaW4gdHVybi4NCisgICAgKi8NCisgICB3aGlsZSAobG9jYXRpb24gIT0gKGxvY2F0aW9uICYgLWxvY2F0aW9uKSkNCisgICAgICBsb2NhdGlvbiAmPSB+KGxvY2F0aW9uICYgLWxvY2F0aW9uKTsNCisNCisgICAvKiBUaGUgY2FzdCBpcyBzYWZlIGJlY2F1c2UgJ2xvY2F0aW9uJyBpcyBhIGJpdCBtYXNrIGFuZCBvbmx5IHRoZSBsb3cgZm91cg0KKyAgICAqIGJpdHMgYXJlIHNpZ25pZmljYW50Lg0KKyAgICAqLw0KKyAgIHJldHVybiAocG5nX2J5dGUpbG9jYXRpb247DQorfQ0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdW5rbm93bl9jaHVua3AgdW5rbm93bnMsIGludCBudW1fdW5rbm93bnMpDQorew0KKyAgIHBuZ191bmtub3duX2NodW5rcCBucDsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbnVtX3Vua25vd25zIDw9IDAgfHwNCisgICAgICB1bmtub3ducyA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBDaGVjayBmb3IgdGhlIGZhaWx1cmUgY2FzZXMgd2hlcmUgc3VwcG9ydCBoYXMgYmVlbiBkaXNhYmxlZCBhdCBjb21waWxlDQorICAgICogdGltZS4gIFRoaXMgY29kZSBpcyBoYXJkbHkgZXZlciBjb21waWxlZCAtIGl0J3MgaGVyZSBiZWNhdXNlDQorICAgICogU1RPUkVfVU5LTk9XTl9DSFVOS1MgaXMgc2V0IGJ5IGJvdGggcmVhZCBhbmQgd3JpdGUgY29kZSAoY29tcGlsaW5nIGluIHRoaXMNCisgICAgKiBjb2RlKSBidXQgbWF5IGJlIG1lYW5pbmdsZXNzIGlmIHRoZSByZWFkIG9yIHdyaXRlIGhhbmRsaW5nIG9mIHVua25vd24NCisgICAgKiBjaHVua3MgaXMgbm90IGNvbXBpbGVkIGluLg0KKyAgICAqLw0KKyMgIGlmICFkZWZpbmVkKFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkgJiYgXA0KKyAgICAgIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKQ0KKyAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJubyB1bmtub3duIGNodW5rIHN1cHBvcnQgb24gcmVhZCIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorIyAgZW5kaWYNCisjICBpZiAhZGVmaW5lZChQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKSAmJiBcDQorICAgICAgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQ0KKyAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJubyB1bmtub3duIGNodW5rIHN1cHBvcnQgb24gd3JpdGUiKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyMgIGVuZGlmDQorDQorICAgLyogUHJpb3IgdG8gMS42LjAgdGhpcyBjb2RlIHVzZWQgcG5nX21hbGxvY193YXJuOyBob3dldmVyLCB0aGlzIG1lYW50IHRoYXQNCisgICAgKiB1bmtub3duIGNyaXRpY2FsIGNodW5rcyBjb3VsZCBiZSBsb3N0IHdpdGgganVzdCBhIHdhcm5pbmcgcmVzdWx0aW5nIGluDQorICAgICogdW5kZWZpbmVkIGJlaGF2aW9yLiAgTm93IHBuZ19jaHVua19yZXBvcnQgaXMgdXNlZCB0byBwcm92aWRlIGJlaGF2aW9yDQorICAgICogYXBwcm9wcmlhdGUgdG8gcmVhZCBvciB3cml0ZS4NCisgICAgKi8NCisgICBucCA9IHBuZ192b2lkY2FzdChwbmdfdW5rbm93bl9jaHVua3AsIHBuZ19yZWFsbG9jX2FycmF5KHBuZ19wdHIsDQorICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzLCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtLCBudW1fdW5rbm93bnMsDQorICAgICAgICAgc2l6ZW9mICpucCkpOw0KKw0KKyAgIGlmIChucCA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJ0b28gbWFueSB1bmtub3duIGNodW5rcyIsDQorICAgICAgICAgUE5HX0NIVU5LX1dSSVRFX0VSUk9SKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7DQorICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzID0gbnA7IC8qIHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsaXplZCAqLw0KKyAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1VOS047DQorDQorICAgbnAgKz0gaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsNCisNCisgICAvKiBJbmNyZW1lbnQgdW5rbm93bl9jaHVua3NfbnVtIGVhY2ggdGltZSByb3VuZCB0aGUgbG9vcCB0byBwcm90ZWN0IHRoZQ0KKyAgICAqIGp1c3QtYWxsb2NhdGVkIGNodW5rIGRhdGEuDQorICAgICovDQorICAgZm9yICg7IG51bV91bmtub3ducyA+IDA7IC0tbnVtX3Vua25vd25zLCArK3Vua25vd25zKQ0KKyAgIHsNCisgICAgICBtZW1jcHkobnAtPm5hbWUsIHVua25vd25zLT5uYW1lLCAoc2l6ZW9mIG5wLT5uYW1lKSk7DQorICAgICAgbnAtPm5hbWVbKHNpemVvZiBucC0+bmFtZSktMV0gPSAnXDAnOw0KKyAgICAgIG5wLT5sb2NhdGlvbiA9IGNoZWNrX2xvY2F0aW9uKHBuZ19wdHIsIHVua25vd25zLT5sb2NhdGlvbik7DQorDQorICAgICAgaWYgKHVua25vd25zLT5zaXplID09IDApDQorICAgICAgew0KKyAgICAgICAgIG5wLT5kYXRhID0gTlVMTDsNCisgICAgICAgICBucC0+c2l6ZSA9IDA7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgbnAtPmRhdGEgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLA0KKyAgICAgICAgICAgIHBuZ19tYWxsb2NfYmFzZShwbmdfcHRyLCB1bmtub3ducy0+c2l6ZSkpOw0KKw0KKyAgICAgICAgIGlmIChucC0+ZGF0YSA9PSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfY2h1bmtfcmVwb3J0KHBuZ19wdHIsICJ1bmtub3duIGNodW5rOiBvdXQgb2YgbWVtb3J5IiwNCisgICAgICAgICAgICAgICBQTkdfQ0hVTktfV1JJVEVfRVJST1IpOw0KKyAgICAgICAgICAgIC8qIEJ1dCBqdXN0IHNraXAgc3RvcmluZyB0aGUgdW5rbm93biBjaHVuayAqLw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBtZW1jcHkobnAtPmRhdGEsIHVua25vd25zLT5kYXRhLCB1bmtub3ducy0+c2l6ZSk7DQorICAgICAgICAgbnAtPnNpemUgPSB1bmtub3ducy0+c2l6ZTsNCisgICAgICB9DQorDQorICAgICAgLyogVGhlc2UgaW5jcmVtZW50cyBhcmUgc2tpcHBlZCBvbiBvdXQtb2YtbWVtb3J5IGZvciB0aGUgZGF0YSAtIHRoZQ0KKyAgICAgICAqIHVua25vd24gY2h1bmsgZW50cnkgZ2V0cyBvdmVyd3JpdHRlbiBpZiB0aGUgcG5nX2NodW5rX3JlcG9ydCByZXR1cm5zLg0KKyAgICAgICAqIFRoaXMgaXMgY29ycmVjdCBpbiB0aGUgcmVhZCBjYXNlICh0aGUgY2h1bmsgaXMganVzdCBkcm9wcGVkLikNCisgICAgICAgKi8NCisgICAgICArK25wOw0KKyAgICAgICsrKGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pOw0KKyAgIH0NCit9DQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIGludCBjaHVuaywgaW50IGxvY2F0aW9uKQ0KK3sNCisgICAvKiBUaGlzIEFQSSBpcyBwcmV0dHkgcG9pbnRsZXNzIGluIDEuNi4wIGJlY2F1c2UgdGhlIGxvY2F0aW9uIGNhbiBiZSBzZXQNCisgICAgKiBiZWZvcmUgdGhlIGNhbGwgdG8gcG5nX3NldF91bmtub3duX2NodW5rcy4NCisgICAgKg0KKyAgICAqIFRPRE86IGFkZCBhIHBuZ19hcHBfd2FybmluZyBpbiAxLjcNCisgICAgKi8NCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgY2h1bmsgPj0gMCAmJg0KKyAgICAgIGNodW5rIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkNCisgICB7DQorICAgICAgaWYgKChsb2NhdGlvbiAmIChQTkdfSEFWRV9JSERSfFBOR19IQVZFX1BMVEV8UE5HX0FGVEVSX0lEQVQpKSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIHVua25vd24gY2h1bmsgbG9jYXRpb24iKTsNCisgICAgICAgICAvKiBGYWtlIG91dCB0aGUgcHJlIDEuNi4wIGJlaGF2aW9yOiAqLw0KKyAgICAgICAgIGlmICgobG9jYXRpb24gJiBQTkdfSEFWRV9JREFUKSkgLyogdW5kb2N1bWVudGVkISAqLw0KKyAgICAgICAgICAgIGxvY2F0aW9uID0gUE5HX0FGVEVSX0lEQVQ7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGxvY2F0aW9uID0gUE5HX0hBVkVfSUhEUjsgLyogYWxzbyB1bmRvY3VtZW50ZWQgKi8NCisgICAgICB9DQorDQorICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzW2NodW5rXS5sb2NhdGlvbiA9DQorICAgICAgICAgY2hlY2tfbG9jYXRpb24ocG5nX3B0ciwgbG9jYXRpb24pOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXMpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiAwOw0KKw0KKyAgIHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgPSBtbmdfZmVhdHVyZXMgJiBQTkdfQUxMX01OR19GRUFUVVJFUzsNCisNCisgICByZXR1cm4gcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZDsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQNCitzdGF0aWMgdW5zaWduZWQgaW50DQorYWRkX29uZV9jaHVuayhwbmdfYnl0ZXAgbGlzdCwgdW5zaWduZWQgaW50IGNvdW50LCBwbmdfY29uc3RfYnl0ZXAgYWRkLCBpbnQga2VlcCkNCit7DQorICAgdW5zaWduZWQgaW50IGk7DQorDQorICAgLyogVXRpbGl0eSBmdW5jdGlvbjogdXBkYXRlIHRoZSAna2VlcCcgc3RhdGUgb2YgYSBjaHVuayBpZiBpdCBpcyBhbHJlYWR5IGluDQorICAgICogdGhlIGxpc3QsIG90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIGxpc3QuDQorICAgICovDQorICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSwgbGlzdCArPSA1KSBpZiAobWVtY21wKGxpc3QsIGFkZCwgNCkgPT0gMCkNCisgICB7DQorICAgICAgbGlzdFs0XSA9IChwbmdfYnl0ZSlrZWVwOw0KKyAgICAgIHJldHVybiBjb3VudDsNCisgICB9DQorDQorICAgaWYgKGtlZXAgIT0gUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUKQ0KKyAgIHsNCisgICAgICArK2NvdW50Ow0KKyAgICAgIG1lbWNweShsaXN0LCBhZGQsIDQpOw0KKyAgICAgIGxpc3RbNF0gPSAocG5nX2J5dGUpa2VlcDsNCisgICB9DQorDQorICAgcmV0dXJuIGNvdW50Ow0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGtlZXAsDQorICAgIHBuZ19jb25zdF9ieXRlcCBjaHVua19saXN0LCBpbnQgbnVtX2NodW5rc19pbikNCit7DQorICAgcG5nX2J5dGVwIG5ld19saXN0Ow0KKyAgIHVuc2lnbmVkIGludCBudW1fY2h1bmtzLCBvbGRfbnVtX2NodW5rczsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAoa2VlcCA8IDAgfHwga2VlcCA+PSBQTkdfSEFORExFX0NIVU5LX0xBU1QpDQorICAgew0KKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgInBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rczogaW52YWxpZCBrZWVwIik7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAobnVtX2NodW5rc19pbiA8PSAwKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT51bmtub3duX2RlZmF1bHQgPSBrZWVwOw0KKw0KKyAgICAgIC8qICcwJyBtZWFucyBqdXN0IHNldCB0aGUgZmxhZ3MsIHNvIHN0b3AgaGVyZSAqLw0KKyAgICAgIGlmIChudW1fY2h1bmtzX2luID09IDApDQorICAgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIGlmIChudW1fY2h1bmtzX2luIDwgMCkNCisgICB7DQorICAgICAgLyogSWdub3JlIGFsbCB1bmtub3duIGNodW5rcyBhbmQgYWxsIGNodW5rcyByZWNvZ25pemVkIGJ5DQorICAgICAgICogbGlicG5nIGV4Y2VwdCBmb3IgSUhEUiwgUExURSwgdFJOUywgSURBVCwgYW5kIElFTkQNCisgICAgICAgKi8NCisgICAgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIGNodW5rc190b19pZ25vcmVbXSA9IHsNCisgICAgICAgICA5OCwgIDc1LCAgNzEsICA2OCwgJ1wwJywgIC8qIGJLR0QgKi8NCisgICAgICAgICA5OSwgIDcyLCAgODIsICA3NywgJ1wwJywgIC8qIGNIUk0gKi8NCisgICAgICAgIDEwMywgIDY1LCAgNzcsICA2NSwgJ1wwJywgIC8qIGdBTUEgKi8NCisgICAgICAgIDEwNCwgIDczLCAgODMsICA4NCwgJ1wwJywgIC8qIGhJU1QgKi8NCisgICAgICAgIDEwNSwgIDY3LCAgNjcsICA4MCwgJ1wwJywgIC8qIGlDQ1AgKi8NCisgICAgICAgIDEwNSwgIDg0LCAgODgsIDExNiwgJ1wwJywgIC8qIGlUWHQgKi8NCisgICAgICAgIDExMSwgIDcwLCAgNzAsIDExNSwgJ1wwJywgIC8qIG9GRnMgKi8NCisgICAgICAgIDExMiwgIDY3LCAgNjUsICA3NiwgJ1wwJywgIC8qIHBDQUwgKi8NCisgICAgICAgIDExMiwgIDcyLCAgODksIDExNSwgJ1wwJywgIC8qIHBIWXMgKi8NCisgICAgICAgIDExNSwgIDY2LCAgNzMsICA4NCwgJ1wwJywgIC8qIHNCSVQgKi8NCisgICAgICAgIDExNSwgIDY3LCAgNjUsICA3NiwgJ1wwJywgIC8qIHNDQUwgKi8NCisgICAgICAgIDExNSwgIDgwLCAgNzYsICA4NCwgJ1wwJywgIC8qIHNQTFQgKi8NCisgICAgICAgIDExNSwgIDg0LCAgNjksICA4MiwgJ1wwJywgIC8qIHNURVIgKi8NCisgICAgICAgIDExNSwgIDgyLCAgNzEsICA2NiwgJ1wwJywgIC8qIHNSR0IgKi8NCisgICAgICAgIDExNiwgIDY5LCAgODgsIDExNiwgJ1wwJywgIC8qIHRFWHQgKi8NCisgICAgICAgIDExNiwgIDczLCAgNzcsICA2OSwgJ1wwJywgIC8qIHRJTUUgKi8NCisgICAgICAgIDEyMiwgIDg0LCAgODgsIDExNiwgJ1wwJyAgIC8qIHpUWHQgKi8NCisgICAgICB9Ow0KKw0KKyAgICAgIGNodW5rX2xpc3QgPSBjaHVua3NfdG9faWdub3JlOw0KKyAgICAgIG51bV9jaHVua3MgPSAoc2l6ZW9mIGNodW5rc190b19pZ25vcmUpLzU7DQorICAgfQ0KKw0KKyAgIGVsc2UgLyogbnVtX2NodW5rc19pbiA+IDAgKi8NCisgICB7DQorICAgICAgaWYgKGNodW5rX2xpc3QgPT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgLyogUHJpb3IgdG8gMS42LjAgdGhpcyB3YXMgc2lsZW50bHkgaWdub3JlZCwgbm93IGl0IGlzIGFuIGFwcF9lcnJvcg0KKyAgICAgICAgICAqIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBvZmYuDQorICAgICAgICAgICovDQorICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAicG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzOiBubyBjaHVuayBsaXN0Iik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBudW1fY2h1bmtzID0gbnVtX2NodW5rc19pbjsNCisgICB9DQorDQorICAgb2xkX251bV9jaHVua3MgPSBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdDsNCisgICBpZiAocG5nX3B0ci0+Y2h1bmtfbGlzdCA9PSBOVUxMKQ0KKyAgICAgIG9sZF9udW1fY2h1bmtzID0gMDsNCisNCisgICAvKiBTaW5jZSBudW1fY2h1bmtzIGlzIGFsd2F5cyByZXN0cmljdGVkIHRvIFVJTlRfTUFYLzUgdGhpcyBjYW4ndCBvdmVyZmxvdy4NCisgICAgKi8NCisgICBpZiAobnVtX2NodW5rcyArIG9sZF9udW1fY2h1bmtzID4gVUlOVF9NQVgvNSkNCisgICB7DQorICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAicG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzOiB0b28gbWFueSBjaHVua3MiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIC8qIElmIHRoZXNlIGNodW5rcyBhcmUgYmVpbmcgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdGhlbiBubyBtb3JlIG1lbW9yeSBpcw0KKyAgICAqIHJlcXVpcmVkIGJlY2F1c2UgYWRkX29uZV9jaHVuayBhYm92ZSBkb2Vzbid0IGV4dGVuZCB0aGUgbGlzdCBpZiB0aGUgJ2tlZXAnDQorICAgICogcGFyYW1ldGVyIGlzIHRoZSBkZWZhdWx0Lg0KKyAgICAqLw0KKyAgIGlmIChrZWVwKQ0KKyAgIHsNCisgICAgICBuZXdfbGlzdCA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIHBuZ19tYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgNSAqIChudW1fY2h1bmtzICsgb2xkX251bV9jaHVua3MpKSk7DQorDQorICAgICAgaWYgKG9sZF9udW1fY2h1bmtzID4gMCkNCisgICAgICAgICBtZW1jcHkobmV3X2xpc3QsIHBuZ19wdHItPmNodW5rX2xpc3QsIDUqb2xkX251bV9jaHVua3MpOw0KKyAgIH0NCisNCisgICBlbHNlIGlmIChvbGRfbnVtX2NodW5rcyA+IDApDQorICAgICAgbmV3X2xpc3QgPSBwbmdfcHRyLT5jaHVua19saXN0Ow0KKw0KKyAgIGVsc2UNCisgICAgICBuZXdfbGlzdCA9IE5VTEw7DQorDQorICAgLyogQWRkIHRoZSBuZXcgY2h1bmtzIHRvZ2V0aGVyIHdpdGggZWFjaCBvbmUncyBoYW5kbGluZyBjb2RlLiAgSWYgdGhlIGNodW5rDQorICAgICogYWxyZWFkeSBleGlzdHMgdGhlIGNvZGUgaXMgdXBkYXRlZCwgb3RoZXJ3aXNlIHRoZSBjaHVuayBpcyBhZGRlZCB0byB0aGUNCisgICAgKiBlbmQuICAoSW4gbGlicG5nIDEuNi4wIG9yZGVyIG5vIGxvbmdlciBtYXR0ZXJzIGJlY2F1c2UgdGhpcyBjb2RlIGVuZm9yY2VzDQorICAgICogdGhlIGVhcmxpZXIgY29udmVudGlvbiB0aGF0IHRoZSBsYXN0IHNldHRpbmcgaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQuKQ0KKyAgICAqLw0KKyAgIGlmIChuZXdfbGlzdCAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfY29uc3RfYnl0ZXAgaW5saXN0Ow0KKyAgICAgIHBuZ19ieXRlcCBvdXRsaXN0Ow0KKyAgICAgIHVuc2lnbmVkIGludCBpOw0KKw0KKyAgICAgIGZvciAoaT0wOyBpPG51bV9jaHVua3M7ICsraSkNCisgICAgICAgICBvbGRfbnVtX2NodW5rcyA9IGFkZF9vbmVfY2h1bmsobmV3X2xpc3QsIG9sZF9udW1fY2h1bmtzLA0KKyAgICAgICAgICAgIGNodW5rX2xpc3QrNSppLCBrZWVwKTsNCisNCisgICAgICAvKiBOb3cgcmVtb3ZlIGFueSBzcHVyaW91cyAnZGVmYXVsdCcgZW50cmllcy4gKi8NCisgICAgICBudW1fY2h1bmtzID0gMDsNCisgICAgICBmb3IgKGk9MCwgaW5saXN0PW91dGxpc3Q9bmV3X2xpc3Q7IGk8b2xkX251bV9jaHVua3M7ICsraSwgaW5saXN0ICs9IDUpDQorICAgICAgICAgaWYgKGlubGlzdFs0XSkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKG91dGxpc3QgIT0gaW5saXN0KQ0KKyAgICAgICAgICAgICAgIG1lbWNweShvdXRsaXN0LCBpbmxpc3QsIDUpOw0KKyAgICAgICAgICAgIG91dGxpc3QgKz0gNTsNCisgICAgICAgICAgICArK251bV9jaHVua3M7DQorICAgICAgICAgfQ0KKw0KKyAgICAgIC8qIFRoaXMgbWVhbnMgdGhlIGFwcGxpY2F0aW9uIGhhcyByZW1vdmVkIGFsbCB0aGUgc3BlY2lhbGl6ZWQgaGFuZGxpbmcuICovDQorICAgICAgaWYgKG51bV9jaHVua3MgPT0gMCkNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPmNodW5rX2xpc3QgIT0gbmV3X2xpc3QpDQorICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2xpc3QpOw0KKw0KKyAgICAgICAgIG5ld19saXN0ID0gTlVMTDsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICAgICBudW1fY2h1bmtzID0gMDsNCisNCisgICBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9IG51bV9jaHVua3M7DQorDQorICAgaWYgKHBuZ19wdHItPmNodW5rX2xpc3QgIT0gbmV3X2xpc3QpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5jaHVua19saXN0ICE9IE5VTEwpDQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbGlzdCk7DQorDQorICAgICAgcG5nX3B0ci0+Y2h1bmtfbGlzdCA9IG5ld19saXN0Ow0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCB1c2VyX2NodW5rX3B0ciwNCisgICAgcG5nX3VzZXJfY2h1bmtfcHRyIHJlYWRfdXNlcl9jaHVua19mbikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbiIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiA9IHJlYWRfdXNlcl9jaHVua19mbjsNCisgICBwbmdfcHRyLT51c2VyX2NodW5rX3B0ciA9IHVzZXJfY2h1bmtfcHRyOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3Jvd3MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsDQorICAgIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzKQ0KK3sNCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInJvd3MiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzICYmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzICE9IHJvd19wb2ludGVycykpDQorICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfUk9XUywgMCk7DQorDQorICAgaW5mb19wdHItPnJvd19wb2ludGVycyA9IHJvd19wb2ludGVyczsNCisNCisgICBpZiAocm93X3BvaW50ZXJzKQ0KKyAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19JREFUOw0KK30NCisjZW5kaWYNCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19zaXplX3Qgc2l6ZSkNCit7DQorICAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgIHJldHVybjsNCisNCisgICAgaWYgKHNpemUgPT0gMCB8fCBzaXplID4gUE5HX1VJTlRfMzFfTUFYKQ0KKyAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludmFsaWQgY29tcHJlc3Npb24gYnVmZmVyIHNpemUiKTsNCisNCisjICBpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRA0KKyAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5JREFUX3JlYWRfc2l6ZSA9IChwbmdfdWludF8zMilzaXplOyAvKiBjaGVja2VkIGFib3ZlICovDQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisjICBlbmRpZg0KKw0KKyMgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQNCisgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKSkNCisgICAgICB7DQorICAgICAgICAgaWYgKHBuZ19wdHItPnpvd25lciAhPSAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgIkNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIGNhbm5vdCBiZSBjaGFuZ2VkIGJlY2F1c2UgaXQgaXMgaW4gdXNlIik7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAoc2l6ZSA+IFpMSUJfSU9fTUFYKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICJDb21wcmVzc2lvbiBidWZmZXIgc2l6ZSBsaW1pdGVkIHRvIHN5c3RlbSBtYXhpbXVtIik7DQorICAgICAgICAgICAgc2l6ZSA9IFpMSUJfSU9fTUFYOyAvKiBtdXN0IGZpdCAqLw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlIGlmIChzaXplIDwgNikNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogRGVmbGF0ZSB3aWxsIHBvdGVudGlhbGx5IGdvIGludG8gYW4gaW5maW5pdGUgbG9vcCBvbiBhIFNZTkNfRkxVU0gNCisgICAgICAgICAgICAgKiBpZiB0aGlzIGlzIHBlcm1pdHRlZC4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICJDb21wcmVzc2lvbiBidWZmZXIgc2l6ZSBjYW5ub3QgYmUgcmVkdWNlZCBiZWxvdyA2Iik7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBpZiAocG5nX3B0ci0+emJ1ZmZlcl9zaXplICE9IHNpemUpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19mcmVlX2J1ZmZlcl9saXN0KHBuZ19wdHIsICZwbmdfcHRyLT56YnVmZmVyX2xpc3QpOw0KKyAgICAgICAgICAgIHBuZ19wdHItPnpidWZmZXJfc2l6ZSA9ICh1SW50KXNpemU7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisjICBlbmRpZg0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfaW52YWxpZChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IG1hc2spDQorew0KKyAgIGlmIChwbmdfcHRyICYmIGluZm9fcHRyKQ0KKyAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+bWFzazsNCit9DQorDQorDQorI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVEDQorLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi42ICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3VzZXJfbGltaXRzIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXgsDQorICAgIHBuZ191aW50XzMyIHVzZXJfaGVpZ2h0X21heCkNCit7DQorICAgLyogSW1hZ2VzIHdpdGggZGltZW5zaW9ucyBsYXJnZXIgdGhhbiB0aGVzZSBsaW1pdHMgd2lsbCBiZQ0KKyAgICAqIHJlamVjdGVkIGJ5IHBuZ19zZXRfSUhEUigpLiAgVG8gYWNjZXB0IGFueSBQTkcgZGF0YXN0cmVhbQ0KKyAgICAqIHJlZ2FyZGxlc3Mgb2YgZGltZW5zaW9ucywgc2V0IGJvdGggbGltaXRzIHRvIDB4N2ZmZmZmZkwuDQorICAgICovDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSB1c2VyX3dpZHRoX21heDsNCisgICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggPSB1c2VyX2hlaWdodF9tYXg7DQorfQ0KKw0KKy8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjQuMCAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9jaHVua19jYWNoZV9tYXggKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiB1c2VyX2NodW5rX2NhY2hlX21heCkNCit7DQorICAgIGlmIChwbmdfcHRyKQ0KKyAgICAgICBwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9IHVzZXJfY2h1bmtfY2FjaGVfbWF4Ow0KK30NCisNCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS40LjEgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfY2h1bmtfbWFsbG9jX21heCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19hbGxvY19zaXplX3QgdXNlcl9jaHVua19tYWxsb2NfbWF4KQ0KK3sNCisgICBpZiAocG5nX3B0cikNCisgICAgICBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggPSB1c2VyX2NodW5rX21hbGxvY19tYXg7DQorfQ0KKyNlbmRpZiAvKiA/UE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQgKi8NCisNCisNCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2Jlbmlnbl9lcnJvcnMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBhbGxvd2VkKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYmVuaWduX2Vycm9ycyIpOw0KKw0KKyAgIC8qIElmIGFsbG93ZWQgaXMgMSwgcG5nX2Jlbmlnbl9lcnJvcigpIGlzIHRyZWF0ZWQgYXMgYSB3YXJuaW5nLg0KKyAgICAqDQorICAgICogSWYgYWxsb3dlZCBpcyAwLCBwbmdfYmVuaWduX2Vycm9yKCkgaXMgdHJlYXRlZCBhcyBhbiBlcnJvciAod2hpY2gNCisgICAgKiBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpZiBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSBpcyBub3QgY2FsbGVkKS4NCisgICAgKi8NCisNCisgICBpZiAoYWxsb3dlZCkNCisgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4gfA0KKyAgICAgICAgIFBOR19GTEFHX0FQUF9XQVJOSU5HU19XQVJOIHwgUE5HX0ZMQUdfQVBQX0VSUk9SU19XQVJOOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+KFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTiB8DQorICAgICAgICAgUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk4gfCBQTkdfRkxBR19BUFBfRVJST1JTX1dBUk4pOw0KK30NCisjZW5kaWYgLyogUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQNCisgICAvKiBXaGV0aGVyIHRvIHJlcG9ydCBpbnZhbGlkIHBhbGV0dGUgaW5kZXg7IGFkZGVkIGF0IGxpYm5nLTEuNS4xMC4NCisgICAgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gaW5kZXhlZCAoY29sb3ItdHlwZT09MykgUE5HIGZpbGUgdG8gY29udGFpbg0KKyAgICAqIHBpeGVscyB3aXRoIGludmFsaWQgKG91dC1vZi1yYW5nZSkgaW5kZXhlcyBpZiB0aGUgUExURSBjaHVuayBoYXMNCisgICAgKiBmZXdlciBlbnRyaWVzIHRoYW4gdGhlIGltYWdlJ3MgYml0LWRlcHRoIHdvdWxkIGFsbG93LiBXZSByZWNvdmVyDQorICAgICogZnJvbSB0aGlzIGdyYWNlZnVsbHkgYnkgZmlsbGluZyBhbnkgaW5jb21wbGV0ZSBwYWxldHRlIHdpdGggemVyb2VzDQorICAgICogKG9wYXF1ZSBibGFjaykuICBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgb2NjdXJzIGxpYnBuZyB3aWxsIGlzc3VlDQorICAgICogYSBiZW5pZ24gZXJyb3IuICBUaGlzIEFQSSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGF0IGJlaGF2aW9yLg0KKyAgICAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGFsbG93ZWQpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleCIpOw0KKw0KKyAgIGlmIChhbGxvd2VkID4gMCkNCisgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPSAwOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPSAtMTsNCit9DQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd0cmFucy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd0cmFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmIwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3RyYW5zLmMKQEAgLTAsMCArMSw4NDIgQEAKKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX0ZYQ09SRV9GRUFUVVJFX0FMTF8pIHx8IGRlZmluZWQoX1BOR19ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQ0KKy8qIHBuZ3RyYW5zLmMgLSB0cmFuc2Zvcm1zIHRoZSBkYXRhIGluIGEgcm93ICh1c2VkIGJ5IGJvdGggcmVhZGVycyBhbmQgd3JpdGVycykNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjIgW0FwcmlsIDI1LCAyMDEzXQ0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQ0KKy8qIFR1cm4gb24gQkdSLXRvLVJHQiBtYXBwaW5nICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2Jncihwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2JnciIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfQkdSOw0KK30NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpDQorLyogVHVybiBvbiAxNiBiaXQgYnl0ZSBzd2FwcGluZyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9zd2FwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfc3dhcCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpDQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TV0FQX0JZVEVTOw0KK30NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpDQorLyogVHVybiBvbiBwaXhlbCBwYWNraW5nICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3BhY2tpbmcocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9wYWNraW5nIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpDQorICAgew0KKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUEFDSzsNCisgICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoID0gODsNCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCl8fGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkNCisvKiBUdXJuIG9uIHBhY2tlZCBwaXhlbCBzd2FwcGluZyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9wYWNrc3dhcChwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3BhY2tzd2FwIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpDQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19QQUNLU1dBUDsNCit9DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3NoaWZ0KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY29sb3JfOHAgdHJ1ZV9iaXRzKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfc2hpZnQiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NISUZUOw0KKyAgIHBuZ19wdHItPnNoaWZ0ID0gKnRydWVfYml0czsNCit9DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkNCitpbnQgUE5HQVBJDQorcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9pbnRlcmxhY2UgaGFuZGxpbmciKTsNCisNCisgICBpZiAocG5nX3B0ciAmJiBwbmdfcHRyLT5pbnRlcmxhY2VkKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0lOVEVSTEFDRTsNCisgICAgICByZXR1cm4gKDcpOw0KKyAgIH0NCisNCisgICByZXR1cm4gKDEpOw0KK30NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQ0KKy8qIEFkZCBhIGZpbGxlciBieXRlIG9uIHJlYWQsIG9yIHJlbW92ZSBhIGZpbGxlciBvciBhbHBoYSBieXRlIG9uIHdyaXRlLg0KKyAqIFRoZSBmaWxsZXIgdHlwZSBoYXMgY2hhbmdlZCBpbiB2MC45NSB0byBhbGxvdyBmdXR1cmUgMi1ieXRlIGZpbGxlcnMNCisgKiBmb3IgNDgtYml0IGlucHV0IGRhdGEsIGFzIHdlbGwgYXMgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBzb21lIGNvbXBpbGVycw0KKyAqIHRoYXQgZG9uJ3QgbGlrZSBieXRlcyBhcyBwYXJhbWV0ZXJzLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9maWxsZXIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGZpbGxlciwgaW50IGZpbGxlcl9sb2MpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9maWxsZXIiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBJbiBsaWJwbmcgMS42IGl0IGlzIHBvc3NpYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFkIG9yIHdyaXRlDQorICAgICogb3BlcmF0aW9uIGFuZCB0aGVyZWZvcmUgdG8gZG8gbW9yZSBjaGVja2luZyBoZXJlIGZvciBhIHZhbGlkIGNhbGwuDQorICAgICovDQorICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpDQorICAgew0KKyMgICAgIGlmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQNCisgICAgICAgICAvKiBPbiByZWFkIHBuZ19zZXRfZmlsbGVyIGlzIGFsd2F5cyB2YWxpZCwgcmVnYXJkbGVzcyBvZiB0aGUgYmFzZSBQTkcNCisgICAgICAgICAgKiBmb3JtYXQsIGJlY2F1c2Ugb3RoZXIgdHJhbnNmb3JtYXRpb25zIGNhbiBnaXZlIGEgZm9ybWF0IHdoZXJlIHRoZQ0KKyAgICAgICAgICAqIGZpbGxlciBjb2RlIGNhbiBleGVjdXRlIChiYXNpY2FsbHkgYW4gOCBvciAxNi1iaXQgY29tcG9uZW50IFJHQiBvciBHDQorICAgICAgICAgICogZm9ybWF0LikNCisgICAgICAgICAgKg0KKyAgICAgICAgICAqIE5PVEU6IHVzcl9jaGFubmVscyBpcyBub3QgdXNlZCBieSB0aGUgcmVhZCBjb2RlISAgKFRoaXMgaGFzIGxlZCB0bw0KKyAgICAgICAgICAqIGNvbmZ1c2lvbiBpbiB0aGUgcGFzdC4pICBUaGUgZmlsbGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgcmVhZCBjb2RlLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHBuZ19wdHItPmZpbGxlciA9IChwbmdfdWludF8xNilmaWxsZXI7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgInBuZ19zZXRfZmlsbGVyIG5vdCBzdXBwb3J0ZWQgb24gcmVhZCIpOw0KKyAgICAgICAgIFBOR19VTlVTRUQoZmlsbGVyKSAvKiBub3QgdXNlZCBpbiB0aGUgd3JpdGUgY2FzZSAqLw0KKyAgICAgICAgIHJldHVybjsNCisjICAgICBlbmRpZg0KKyAgIH0NCisNCisgICBlbHNlIC8qIHdyaXRlICovDQorICAgew0KKyMgICAgIGlmZGVmIFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEDQorICAgICAgICAgLyogT24gd3JpdGUgdGhlIHVzcl9jaGFubmVscyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgY29ycmVjdGx5IGF0IHRoZQ0KKyAgICAgICAgICAqIHN0YXJ0IHRvIHJlY29yZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBhcHAtc3VwcGxpZWQgZGF0YS4NCisgICAgICAgICAgKi8NCisgICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPmNvbG9yX3R5cGUpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOg0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPnVzcl9jaGFubmVscyA9IDQ7DQorICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOg0KKyAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPj0gOCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dXNyX2NoYW5uZWxzID0gMjsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAvKiBUaGVyZSBzaW1wbHkgaXNuJ3QgYW55IGNvZGUgaW4gbGlicG5nIHRvIHN0cmlwIG91dCBiaXRzDQorICAgICAgICAgICAgICAgICAgICogZnJvbSBieXRlcyB3aGVuIHRoZSBjb21wb25lbnRzIGFyZSBsZXNzIHRoYW4gYSBieXRlIGluDQorICAgICAgICAgICAgICAgICAgICogc2l6ZSENCisgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICBwbmdfYXBwX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgInBuZ19zZXRfZmlsbGVyIGlzIGludmFsaWQgZm9yIGxvdyBiaXQgZGVwdGggZ3JheSBvdXRwdXQiKTsNCisgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICJwbmdfc2V0X2ZpbGxlcjogaW5hcHByb3ByaWF0ZSBjb2xvciB0eXBlIik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisjICAgICBlbHNlDQorICAgICAgICAgcG5nX2FwcF9lcnJvcihwbmdfcHRyLCAicG5nX3NldF9maWxsZXIgbm90IHN1cHBvcnRlZCBvbiB3cml0ZSIpOw0KKyAgICAgICAgIHJldHVybjsNCisjICAgICBlbmRpZg0KKyAgIH0NCisNCisgICAvKiBIZXJlIG9uIHN1Y2Nlc3MgLSBsaWJwbmcgc3VwcG9ydHMgdGhlIG9wZXJhdGlvbiwgc2V0IHRoZSB0cmFuc2Zvcm1hdGlvbg0KKyAgICAqIGFuZCB0aGUgZmxhZyB0byBzYXkgd2hlcmUgdGhlIGZpbGxlciBjaGFubmVsIGlzLg0KKyAgICAqLw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRklMTEVSOw0KKw0KKyAgIGlmIChmaWxsZXJfbG9jID09IFBOR19GSUxMRVJfQUZURVIpDQorICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfRklMTEVSX0FGVEVSOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfRklMTEVSX0FGVEVSOw0KK30NCisNCisvKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfYWRkX2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmaWxsZXJfbG9jKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYWRkX2FscGhhIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBmaWxsZXJfbG9jKTsNCisgICAvKiBUaGUgYWJvdmUgbWF5IGZhaWwgdG8gZG8gYW55dGhpbmcuICovDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpDQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19BRERfQUxQSEE7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVEKQ0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9zd2FwX2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfc3dhcF9hbHBoYSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfU1dBUF9BTFBIQTsNCit9DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkgfHwgXA0KKyAgICBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQ0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9pbnZlcnRfYWxwaGEiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0lOVkVSVF9BTFBIQTsNCit9DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9pbnZlcnRfbW9ubyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfSU5WRVJUX01PTk87DQorfQ0KKw0KKy8qIEludmVydCBtb25vY2hyb21lIGdyYXlzY2FsZSBkYXRhICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX2ludmVydChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19pbnZlcnQiKTsNCisNCisgIC8qIFRoaXMgdGVzdCByZW1vdmVkIGZyb20gbGlicG5nIHZlcnNpb24gMS4wLjEzIGFuZCAxLjIuMDoNCisgICAqICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMSAmJg0KKyAgICovDQorICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsNCisgICAgICBwbmdfc2l6ZV90IGk7DQorICAgICAgcG5nX3NpemVfdCBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsNCisNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykNCisgICAgICB7DQorICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSh+KCpycCkpOw0KKyAgICAgICAgIHJwKys7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBICYmDQorICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7DQorICAgICAgcG5nX3NpemVfdCBpOw0KKyAgICAgIHBuZ19zaXplX3QgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7DQorDQorICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpICs9IDIpDQorICAgICAgew0KKyAgICAgICAgICpycCA9IChwbmdfYnl0ZSkofigqcnApKTsNCisgICAgICAgICBycCArPSAyOw0KKyAgICAgIH0NCisgICB9DQorDQorI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQNCisgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBICYmDQorICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikNCisgICB7DQorICAgICAgcG5nX2J5dGVwIHJwID0gcm93Ow0KKyAgICAgIHBuZ19zaXplX3QgaTsNCisgICAgICBwbmdfc2l6ZV90IGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOw0KKw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSArPSA0KQ0KKyAgICAgIHsNCisgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKH4oKnJwKSk7DQorICAgICAgICAgKihycCArIDEpID0gKHBuZ19ieXRlKSh+KCoocnAgKyAxKSkpOw0KKyAgICAgICAgIHJwICs9IDQ7DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpDQorLyogU3dhcHMgYnl0ZSBvcmRlciBvbiAxNiBiaXQgZGVwdGggaW1hZ2VzICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3N3YXAocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fc3dhcCIpOw0KKw0KKyAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7DQorICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICBwbmdfdWludF8zMiBpc3RvcD0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOw0KKw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrLCBycCArPSAyKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYnl0ZSB0ID0gKnJwOw0KKyAgICAgICAgICpycCA9ICoocnAgKyAxKTsNCisgICAgICAgICAqKHJwICsgMSkgPSB0Ow0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCl8fGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkNCitzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIG9uZWJwcHN3YXB0YWJsZVsyNTZdID0gew0KKyAgIDB4MDAsIDB4ODAsIDB4NDAsIDB4QzAsIDB4MjAsIDB4QTAsIDB4NjAsIDB4RTAsDQorICAgMHgxMCwgMHg5MCwgMHg1MCwgMHhEMCwgMHgzMCwgMHhCMCwgMHg3MCwgMHhGMCwNCisgICAweDA4LCAweDg4LCAweDQ4LCAweEM4LCAweDI4LCAweEE4LCAweDY4LCAweEU4LA0KKyAgIDB4MTgsIDB4OTgsIDB4NTgsIDB4RDgsIDB4MzgsIDB4QjgsIDB4NzgsIDB4RjgsDQorICAgMHgwNCwgMHg4NCwgMHg0NCwgMHhDNCwgMHgyNCwgMHhBNCwgMHg2NCwgMHhFNCwNCisgICAweDE0LCAweDk0LCAweDU0LCAweEQ0LCAweDM0LCAweEI0LCAweDc0LCAweEY0LA0KKyAgIDB4MEMsIDB4OEMsIDB4NEMsIDB4Q0MsIDB4MkMsIDB4QUMsIDB4NkMsIDB4RUMsDQorICAgMHgxQywgMHg5QywgMHg1QywgMHhEQywgMHgzQywgMHhCQywgMHg3QywgMHhGQywNCisgICAweDAyLCAweDgyLCAweDQyLCAweEMyLCAweDIyLCAweEEyLCAweDYyLCAweEUyLA0KKyAgIDB4MTIsIDB4OTIsIDB4NTIsIDB4RDIsIDB4MzIsIDB4QjIsIDB4NzIsIDB4RjIsDQorICAgMHgwQSwgMHg4QSwgMHg0QSwgMHhDQSwgMHgyQSwgMHhBQSwgMHg2QSwgMHhFQSwNCisgICAweDFBLCAweDlBLCAweDVBLCAweERBLCAweDNBLCAweEJBLCAweDdBLCAweEZBLA0KKyAgIDB4MDYsIDB4ODYsIDB4NDYsIDB4QzYsIDB4MjYsIDB4QTYsIDB4NjYsIDB4RTYsDQorICAgMHgxNiwgMHg5NiwgMHg1NiwgMHhENiwgMHgzNiwgMHhCNiwgMHg3NiwgMHhGNiwNCisgICAweDBFLCAweDhFLCAweDRFLCAweENFLCAweDJFLCAweEFFLCAweDZFLCAweEVFLA0KKyAgIDB4MUUsIDB4OUUsIDB4NUUsIDB4REUsIDB4M0UsIDB4QkUsIDB4N0UsIDB4RkUsDQorICAgMHgwMSwgMHg4MSwgMHg0MSwgMHhDMSwgMHgyMSwgMHhBMSwgMHg2MSwgMHhFMSwNCisgICAweDExLCAweDkxLCAweDUxLCAweEQxLCAweDMxLCAweEIxLCAweDcxLCAweEYxLA0KKyAgIDB4MDksIDB4ODksIDB4NDksIDB4QzksIDB4MjksIDB4QTksIDB4NjksIDB4RTksDQorICAgMHgxOSwgMHg5OSwgMHg1OSwgMHhEOSwgMHgzOSwgMHhCOSwgMHg3OSwgMHhGOSwNCisgICAweDA1LCAweDg1LCAweDQ1LCAweEM1LCAweDI1LCAweEE1LCAweDY1LCAweEU1LA0KKyAgIDB4MTUsIDB4OTUsIDB4NTUsIDB4RDUsIDB4MzUsIDB4QjUsIDB4NzUsIDB4RjUsDQorICAgMHgwRCwgMHg4RCwgMHg0RCwgMHhDRCwgMHgyRCwgMHhBRCwgMHg2RCwgMHhFRCwNCisgICAweDFELCAweDlELCAweDVELCAweERELCAweDNELCAweEJELCAweDdELCAweEZELA0KKyAgIDB4MDMsIDB4ODMsIDB4NDMsIDB4QzMsIDB4MjMsIDB4QTMsIDB4NjMsIDB4RTMsDQorICAgMHgxMywgMHg5MywgMHg1MywgMHhEMywgMHgzMywgMHhCMywgMHg3MywgMHhGMywNCisgICAweDBCLCAweDhCLCAweDRCLCAweENCLCAweDJCLCAweEFCLCAweDZCLCAweEVCLA0KKyAgIDB4MUIsIDB4OUIsIDB4NUIsIDB4REIsIDB4M0IsIDB4QkIsIDB4N0IsIDB4RkIsDQorICAgMHgwNywgMHg4NywgMHg0NywgMHhDNywgMHgyNywgMHhBNywgMHg2NywgMHhFNywNCisgICAweDE3LCAweDk3LCAweDU3LCAweEQ3LCAweDM3LCAweEI3LCAweDc3LCAweEY3LA0KKyAgIDB4MEYsIDB4OEYsIDB4NEYsIDB4Q0YsIDB4MkYsIDB4QUYsIDB4NkYsIDB4RUYsDQorICAgMHgxRiwgMHg5RiwgMHg1RiwgMHhERiwgMHgzRiwgMHhCRiwgMHg3RiwgMHhGRg0KK307DQorDQorc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSB0d29icHBzd2FwdGFibGVbMjU2XSA9IHsNCisgICAweDAwLCAweDQwLCAweDgwLCAweEMwLCAweDEwLCAweDUwLCAweDkwLCAweEQwLA0KKyAgIDB4MjAsIDB4NjAsIDB4QTAsIDB4RTAsIDB4MzAsIDB4NzAsIDB4QjAsIDB4RjAsDQorICAgMHgwNCwgMHg0NCwgMHg4NCwgMHhDNCwgMHgxNCwgMHg1NCwgMHg5NCwgMHhENCwNCisgICAweDI0LCAweDY0LCAweEE0LCAweEU0LCAweDM0LCAweDc0LCAweEI0LCAweEY0LA0KKyAgIDB4MDgsIDB4NDgsIDB4ODgsIDB4QzgsIDB4MTgsIDB4NTgsIDB4OTgsIDB4RDgsDQorICAgMHgyOCwgMHg2OCwgMHhBOCwgMHhFOCwgMHgzOCwgMHg3OCwgMHhCOCwgMHhGOCwNCisgICAweDBDLCAweDRDLCAweDhDLCAweENDLCAweDFDLCAweDVDLCAweDlDLCAweERDLA0KKyAgIDB4MkMsIDB4NkMsIDB4QUMsIDB4RUMsIDB4M0MsIDB4N0MsIDB4QkMsIDB4RkMsDQorICAgMHgwMSwgMHg0MSwgMHg4MSwgMHhDMSwgMHgxMSwgMHg1MSwgMHg5MSwgMHhEMSwNCisgICAweDIxLCAweDYxLCAweEExLCAweEUxLCAweDMxLCAweDcxLCAweEIxLCAweEYxLA0KKyAgIDB4MDUsIDB4NDUsIDB4ODUsIDB4QzUsIDB4MTUsIDB4NTUsIDB4OTUsIDB4RDUsDQorICAgMHgyNSwgMHg2NSwgMHhBNSwgMHhFNSwgMHgzNSwgMHg3NSwgMHhCNSwgMHhGNSwNCisgICAweDA5LCAweDQ5LCAweDg5LCAweEM5LCAweDE5LCAweDU5LCAweDk5LCAweEQ5LA0KKyAgIDB4MjksIDB4NjksIDB4QTksIDB4RTksIDB4MzksIDB4NzksIDB4QjksIDB4RjksDQorICAgMHgwRCwgMHg0RCwgMHg4RCwgMHhDRCwgMHgxRCwgMHg1RCwgMHg5RCwgMHhERCwNCisgICAweDJELCAweDZELCAweEFELCAweEVELCAweDNELCAweDdELCAweEJELCAweEZELA0KKyAgIDB4MDIsIDB4NDIsIDB4ODIsIDB4QzIsIDB4MTIsIDB4NTIsIDB4OTIsIDB4RDIsDQorICAgMHgyMiwgMHg2MiwgMHhBMiwgMHhFMiwgMHgzMiwgMHg3MiwgMHhCMiwgMHhGMiwNCisgICAweDA2LCAweDQ2LCAweDg2LCAweEM2LCAweDE2LCAweDU2LCAweDk2LCAweEQ2LA0KKyAgIDB4MjYsIDB4NjYsIDB4QTYsIDB4RTYsIDB4MzYsIDB4NzYsIDB4QjYsIDB4RjYsDQorICAgMHgwQSwgMHg0QSwgMHg4QSwgMHhDQSwgMHgxQSwgMHg1QSwgMHg5QSwgMHhEQSwNCisgICAweDJBLCAweDZBLCAweEFBLCAweEVBLCAweDNBLCAweDdBLCAweEJBLCAweEZBLA0KKyAgIDB4MEUsIDB4NEUsIDB4OEUsIDB4Q0UsIDB4MUUsIDB4NUUsIDB4OUUsIDB4REUsDQorICAgMHgyRSwgMHg2RSwgMHhBRSwgMHhFRSwgMHgzRSwgMHg3RSwgMHhCRSwgMHhGRSwNCisgICAweDAzLCAweDQzLCAweDgzLCAweEMzLCAweDEzLCAweDUzLCAweDkzLCAweEQzLA0KKyAgIDB4MjMsIDB4NjMsIDB4QTMsIDB4RTMsIDB4MzMsIDB4NzMsIDB4QjMsIDB4RjMsDQorICAgMHgwNywgMHg0NywgMHg4NywgMHhDNywgMHgxNywgMHg1NywgMHg5NywgMHhENywNCisgICAweDI3LCAweDY3LCAweEE3LCAweEU3LCAweDM3LCAweDc3LCAweEI3LCAweEY3LA0KKyAgIDB4MEIsIDB4NEIsIDB4OEIsIDB4Q0IsIDB4MUIsIDB4NUIsIDB4OUIsIDB4REIsDQorICAgMHgyQiwgMHg2QiwgMHhBQiwgMHhFQiwgMHgzQiwgMHg3QiwgMHhCQiwgMHhGQiwNCisgICAweDBGLCAweDRGLCAweDhGLCAweENGLCAweDFGLCAweDVGLCAweDlGLCAweERGLA0KKyAgIDB4MkYsIDB4NkYsIDB4QUYsIDB4RUYsIDB4M0YsIDB4N0YsIDB4QkYsIDB4RkYNCit9Ow0KKw0KK3N0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgZm91cmJwcHN3YXB0YWJsZVsyNTZdID0gew0KKyAgIDB4MDAsIDB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsIDB4NTAsIDB4NjAsIDB4NzAsDQorICAgMHg4MCwgMHg5MCwgMHhBMCwgMHhCMCwgMHhDMCwgMHhEMCwgMHhFMCwgMHhGMCwNCisgICAweDAxLCAweDExLCAweDIxLCAweDMxLCAweDQxLCAweDUxLCAweDYxLCAweDcxLA0KKyAgIDB4ODEsIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4RDEsIDB4RTEsIDB4RjEsDQorICAgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHg0MiwgMHg1MiwgMHg2MiwgMHg3MiwNCisgICAweDgyLCAweDkyLCAweEEyLCAweEIyLCAweEMyLCAweEQyLCAweEUyLCAweEYyLA0KKyAgIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4NDMsIDB4NTMsIDB4NjMsIDB4NzMsDQorICAgMHg4MywgMHg5MywgMHhBMywgMHhCMywgMHhDMywgMHhEMywgMHhFMywgMHhGMywNCisgICAweDA0LCAweDE0LCAweDI0LCAweDM0LCAweDQ0LCAweDU0LCAweDY0LCAweDc0LA0KKyAgIDB4ODQsIDB4OTQsIDB4QTQsIDB4QjQsIDB4QzQsIDB4RDQsIDB4RTQsIDB4RjQsDQorICAgMHgwNSwgMHgxNSwgMHgyNSwgMHgzNSwgMHg0NSwgMHg1NSwgMHg2NSwgMHg3NSwNCisgICAweDg1LCAweDk1LCAweEE1LCAweEI1LCAweEM1LCAweEQ1LCAweEU1LCAweEY1LA0KKyAgIDB4MDYsIDB4MTYsIDB4MjYsIDB4MzYsIDB4NDYsIDB4NTYsIDB4NjYsIDB4NzYsDQorICAgMHg4NiwgMHg5NiwgMHhBNiwgMHhCNiwgMHhDNiwgMHhENiwgMHhFNiwgMHhGNiwNCisgICAweDA3LCAweDE3LCAweDI3LCAweDM3LCAweDQ3LCAweDU3LCAweDY3LCAweDc3LA0KKyAgIDB4ODcsIDB4OTcsIDB4QTcsIDB4QjcsIDB4QzcsIDB4RDcsIDB4RTcsIDB4RjcsDQorICAgMHgwOCwgMHgxOCwgMHgyOCwgMHgzOCwgMHg0OCwgMHg1OCwgMHg2OCwgMHg3OCwNCisgICAweDg4LCAweDk4LCAweEE4LCAweEI4LCAweEM4LCAweEQ4LCAweEU4LCAweEY4LA0KKyAgIDB4MDksIDB4MTksIDB4MjksIDB4MzksIDB4NDksIDB4NTksIDB4NjksIDB4NzksDQorICAgMHg4OSwgMHg5OSwgMHhBOSwgMHhCOSwgMHhDOSwgMHhEOSwgMHhFOSwgMHhGOSwNCisgICAweDBBLCAweDFBLCAweDJBLCAweDNBLCAweDRBLCAweDVBLCAweDZBLCAweDdBLA0KKyAgIDB4OEEsIDB4OUEsIDB4QUEsIDB4QkEsIDB4Q0EsIDB4REEsIDB4RUEsIDB4RkEsDQorICAgMHgwQiwgMHgxQiwgMHgyQiwgMHgzQiwgMHg0QiwgMHg1QiwgMHg2QiwgMHg3QiwNCisgICAweDhCLCAweDlCLCAweEFCLCAweEJCLCAweENCLCAweERCLCAweEVCLCAweEZCLA0KKyAgIDB4MEMsIDB4MUMsIDB4MkMsIDB4M0MsIDB4NEMsIDB4NUMsIDB4NkMsIDB4N0MsDQorICAgMHg4QywgMHg5QywgMHhBQywgMHhCQywgMHhDQywgMHhEQywgMHhFQywgMHhGQywNCisgICAweDBELCAweDFELCAweDJELCAweDNELCAweDRELCAweDVELCAweDZELCAweDdELA0KKyAgIDB4OEQsIDB4OUQsIDB4QUQsIDB4QkQsIDB4Q0QsIDB4REQsIDB4RUQsIDB4RkQsDQorICAgMHgwRSwgMHgxRSwgMHgyRSwgMHgzRSwgMHg0RSwgMHg1RSwgMHg2RSwgMHg3RSwNCisgICAweDhFLCAweDlFLCAweEFFLCAweEJFLCAweENFLCAweERFLCAweEVFLCAweEZFLA0KKyAgIDB4MEYsIDB4MUYsIDB4MkYsIDB4M0YsIDB4NEYsIDB4NUYsIDB4NkYsIDB4N0YsDQorICAgMHg4RiwgMHg5RiwgMHhBRiwgMHhCRiwgMHhDRiwgMHhERiwgMHhFRiwgMHhGRg0KK307DQorDQorLyogU3dhcHMgcGl4ZWwgcGFja2luZyBvcmRlciB3aXRoaW4gYnl0ZXMgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fcGFja3N3YXAocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcGFja3N3YXAiKTsNCisNCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICBwbmdfY29uc3RfYnl0ZXAgZW5kLCB0YWJsZTsNCisNCisgICAgICBlbmQgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7DQorDQorICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMSkNCisgICAgICAgICB0YWJsZSA9IG9uZWJwcHN3YXB0YWJsZTsNCisNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpDQorICAgICAgICAgdGFibGUgPSB0d29icHBzd2FwdGFibGU7DQorDQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0KQ0KKyAgICAgICAgIHRhYmxlID0gZm91cmJwcHN3YXB0YWJsZTsNCisNCisgICAgICBlbHNlDQorICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgIGZvciAocnAgPSByb3c7IHJwIDwgZW5kOyBycCsrKQ0KKyAgICAgICAgICpycCA9IHRhYmxlWypycF07DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEIG9yIFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQgKi8NCisNCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgfHwgXA0KKyAgICBkZWZpbmVkKFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRCkNCisvKiBSZW1vdmUgYSBjaGFubmVsIC0gdGhpcyB1c2VkIHRvIGJlICdwbmdfZG9fc3RyaXBfZmlsbGVyJyBidXQgaXQgdXNlZCBhDQorICogc29tZXdoYXQgd2VpcmQgY29tYmluYXRpb24gb2YgZmxhZ3MgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8uICBBbGwgdGhlIGNhbGxzDQorICogdG8gcG5nX2RvX3N0cmlwX2ZpbGxlciBhcmUgY2hhbmdlZCBpbiAxLjUuMiB0byBjYWxsIHRoaXMgaW5zdGVhZCB3aXRoIHRoZQ0KKyAqIGNvcnJlY3QgYXJndW1lbnRzLg0KKyAqDQorICogVGhlIHJvdXRpbmUgaXNuJ3QgZ2VuZXJhbCAtIHRoZSBjaGFubmVsIG11c3QgYmUgdGhlIGNoYW5uZWwgYXQgdGhlIHN0YXJ0IG9yDQorICogZW5kIChub3QgaW4gdGhlIG1pZGRsZSkgb2YgZWFjaCBwaXhlbC4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fc3RyaXBfY2hhbm5lbChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBpbnQgYXRfc3RhcnQpDQorew0KKyAgIHBuZ19ieXRlcCBzcCA9IHJvdzsgLyogc291cmNlIHBvaW50ZXIgKi8NCisgICBwbmdfYnl0ZXAgZHAgPSByb3c7IC8qIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8NCisgICBwbmdfYnl0ZXAgZXAgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7IC8qIE9uZSBiZXlvbmQgZW5kIG9mIHJvdyAqLw0KKw0KKyAgIC8qIEF0IHRoZSBzdGFydCBzcCB3aWxsIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlIHRvIGNvcHkgYW5kIGRwIHRvIHdoZXJlDQorICAgICogaXQgaXMgY29waWVkIHRvLiAgZXAgYWx3YXlzIHBvaW50cyBqdXN0IGJleW9uZCB0aGUgZW5kIG9mIHRoZSByb3csIHNvDQorICAgICogdGhlIGxvb3Agc2ltcGx5IGNvcGllcyAoY2hhbm5lbHMtMSkgY2hhbm5lbHMgdW50aWwgc3AgcmVhY2hlcyBlcC4NCisgICAgKg0KKyAgICAqIGF0X3N0YXJ0OiAgICAgICAgMCAtLSBjb252ZXJ0IEFHLCBYRywgQVJHQiwgWFJHQiwgQUFHRywgWFhHRywgZXRjLg0KKyAgICAqICAgICAgICAgICAgbm9uemVybyAtLSBjb252ZXJ0IEdBLCBHWCwgUkdCQSwgUkdCWCwgR0dBQSwgUlJHR0JCWFgsIGV0Yy4NCisgICAgKi8NCisNCisgICAvKiBHQSwgR1gsIFhHIGNhc2VzICovDQorICAgaWYgKHJvd19pbmZvLT5jaGFubmVscyA9PSAyKQ0KKyAgIHsNCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoYXRfc3RhcnQpIC8qIFNraXAgaW5pdGlhbCBmaWxsZXIgKi8NCisgICAgICAgICAgICArK3NwOw0KKyAgICAgICAgIGVsc2UgICAgICAgICAgLyogU2tpcCBpbml0aWFsIGNoYW5uZWwgYW5kLCBmb3Igc3AsIHRoZSBmaWxsZXIgKi8NCisgICAgICAgICAgICBzcCArPSAyLCArK2RwOw0KKw0KKyAgICAgICAgIC8qIEZvciBhIDEgcGl4ZWwgd2lkZSBpbWFnZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvICovDQorICAgICAgICAgd2hpbGUgKHNwIDwgZXApDQorICAgICAgICAgICAgKmRwKysgPSAqc3AsIHNwICs9IDI7DQorDQorICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gODsNCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikNCisgICAgICB7DQorICAgICAgICAgaWYgKGF0X3N0YXJ0KSAvKiBTa2lwIGluaXRpYWwgZmlsbGVyICovDQorICAgICAgICAgICAgc3AgKz0gMjsNCisgICAgICAgICBlbHNlICAgICAgICAgIC8qIFNraXAgaW5pdGlhbCBjaGFubmVsIGFuZCwgZm9yIHNwLCB0aGUgZmlsbGVyICovDQorICAgICAgICAgICAgc3AgKz0gNCwgZHAgKz0gMjsNCisNCisgICAgICAgICB3aGlsZSAoc3AgPCBlcCkNCisgICAgICAgICAgICAqZHArKyA9ICpzcCsrLCAqZHArKyA9ICpzcCwgc3AgKz0gMzsNCisNCisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHJldHVybjsgLyogYmFkIGJpdCBkZXB0aCAqLw0KKw0KKyAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7DQorDQorICAgICAgLyogRmluYWxseSBmaXggdGhlIGNvbG9yIHR5cGUgaWYgaXQgcmVjb3JkcyBhbiBhbHBoYSBjaGFubmVsICovDQorICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpDQorICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOw0KKyAgIH0NCisNCisgICAvKiBSR0JBLCBSR0JYLCBYUkdCIGNhc2VzICovDQorICAgZWxzZSBpZiAocm93X2luZm8tPmNoYW5uZWxzID09IDQpDQorICAgew0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIGlmIChhdF9zdGFydCkgLyogU2tpcCBpbml0aWFsIGZpbGxlciAqLw0KKyAgICAgICAgICAgICsrc3A7DQorICAgICAgICAgZWxzZSAgICAgICAgICAvKiBTa2lwIGluaXRpYWwgY2hhbm5lbHMgYW5kLCBmb3Igc3AsIHRoZSBmaWxsZXIgKi8NCisgICAgICAgICAgICBzcCArPSA0LCBkcCArPSAzOw0KKw0KKyAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgbG9vcCBhZGRzIDMgdG8gZHAgYW5kIDQgdG8gc3AgZWFjaCB0aW1lLiAqLw0KKyAgICAgICAgIHdoaWxlIChzcCA8IGVwKQ0KKyAgICAgICAgICAgICpkcCsrID0gKnNwKyssICpkcCsrID0gKnNwKyssICpkcCsrID0gKnNwLCBzcCArPSAyOw0KKw0KKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDI0Ow0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoYXRfc3RhcnQpIC8qIFNraXAgaW5pdGlhbCBmaWxsZXIgKi8NCisgICAgICAgICAgICBzcCArPSAyOw0KKyAgICAgICAgIGVsc2UgICAgICAgICAgLyogU2tpcCBpbml0aWFsIGNoYW5uZWxzIGFuZCwgZm9yIHNwLCB0aGUgZmlsbGVyICovDQorICAgICAgICAgICAgc3AgKz0gOCwgZHAgKz0gNjsNCisNCisgICAgICAgICB3aGlsZSAoc3AgPCBlcCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogQ29weSA2IGJ5dGVzLCBza2lwIDIgKi8NCisgICAgICAgICAgICAqZHArKyA9ICpzcCsrLCAqZHArKyA9ICpzcCsrOw0KKyAgICAgICAgICAgICpkcCsrID0gKnNwKyssICpkcCsrID0gKnNwKys7DQorICAgICAgICAgICAgKmRwKysgPSAqc3ArKywgKmRwKysgPSAqc3AsIHNwICs9IDM7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDQ4Ow0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgcmV0dXJuOyAvKiBiYWQgYml0IGRlcHRoICovDQorDQorICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMzsNCisNCisgICAgICAvKiBGaW5hbGx5IGZpeCB0aGUgY29sb3IgdHlwZSBpZiBpdCByZWNvcmRzIGFuIGFscGhhIGNoYW5uZWwgKi8NCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQ0KKyAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOw0KKyAgIH0NCisNCisgICBlbHNlDQorICAgICAgcmV0dXJuOyAvKiBUaGUgZmlsbGVyIGNoYW5uZWwgaGFzIGdvbmUgYWxyZWFkeSAqLw0KKw0KKyAgIC8qIEZpeCB0aGUgcm93Ynl0ZXMgdmFsdWUuICovDQorICAgcm93X2luZm8tPnJvd2J5dGVzID0gZHAtcm93Ow0KK30NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQ0KKy8qIFN3YXBzIHJlZCBhbmQgYmx1ZSBieXRlcyB3aXRoaW4gYSBwaXhlbCAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb19iZ3IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fYmdyIik7DQorDQorICAgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkNCisgICB7DQorICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7DQorICAgICAgICAgICAgICAgKnJwID0gKihycCArIDIpOw0KKyAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7DQorICAgICAgICAgICAgICAgKnJwID0gKihycCArIDIpOw0KKyAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgcnA7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSA2KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKnJwOw0KKyAgICAgICAgICAgICAgICpycCA9ICoocnAgKyA0KTsNCisgICAgICAgICAgICAgICAqKHJwICsgNCkgPSBzYXZlOw0KKyAgICAgICAgICAgICAgIHNhdmUgPSAqKHJwICsgMSk7DQorICAgICAgICAgICAgICAgKihycCArIDEpID0gKihycCArIDUpOw0KKyAgICAgICAgICAgICAgICoocnAgKyA1KSA9IHNhdmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7DQorICAgICAgICAgICAgICAgKnJwID0gKihycCArIDQpOw0KKyAgICAgICAgICAgICAgICoocnAgKyA0KSA9IHNhdmU7DQorICAgICAgICAgICAgICAgc2F2ZSA9ICoocnAgKyAxKTsNCisgICAgICAgICAgICAgICAqKHJwICsgMSkgPSAqKHJwICsgNSk7DQorICAgICAgICAgICAgICAgKihycCArIDUpID0gc2F2ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisjZW5kaWYNCisgICB9DQorfQ0KKyNlbmRpZiAvKiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVEIG9yIFBOR19XUklURV9CR1JfU1VQUE9SVEVEICovDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCkNCisvKiBBZGRlZCBhdCBsaWJwbmctMS41LjEwICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX2NoZWNrX3BhbGV0dGVfaW5kZXhlcyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbykNCit7DQorICAgaWYgKHBuZ19wdHItPm51bV9wYWxldHRlIDwgKDEgPDwgcm93X2luZm8tPmJpdF9kZXB0aCkgJiYNCisgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZSA+IDApIC8qIG51bV9wYWxldHRlIGNhbiBiZSAwIGluIE1ORyBmaWxlcyAqLw0KKyAgIHsNCisgICAgICAvKiBDYWxjdWxhdGlvbnMgbW92ZWQgb3V0c2lkZSBzd2l0Y2ggaW4gYW4gYXR0ZW1wdCB0byBzdG9wIGRpZmZlcmVudA0KKyAgICAgICAqIGNvbXBpbGVyIHdhcm5pbmdzLiAgJ3BhZGRpbmcnIGlzIGluICpiaXRzKiB3aXRoaW4gdGhlIGxhc3QgYnl0ZSwgaXQgaXMNCisgICAgICAgKiBhbiAnaW50JyBiZWNhdXNlIHBpeGVsX2RlcHRoIGJlY29tZXMgYW4gJ2ludCcgaW4gdGhlIGV4cHJlc3Npb24gYmVsb3csDQorICAgICAgICogYW5kIHRoaXMgY2FsY3VsYXRpb24gaXMgdXNlZCBiZWNhdXNlIGl0IGF2b2lkcyB3YXJuaW5ncyB0aGF0IG90aGVyDQorICAgICAgICogZm9ybXMgcHJvZHVjZWQgb24gZWl0aGVyIEdDQyBvciBNU1ZDLg0KKyAgICAgICAqLw0KKyAgICAgIGludCBwYWRkaW5nID0gKC1yb3dfaW5mby0+cGl4ZWxfZGVwdGggKiByb3dfaW5mby0+d2lkdGgpICYgNzsNCisgICAgICBwbmdfYnl0ZXAgcnAgPSBwbmdfcHRyLT5yb3dfYnVmICsgcm93X2luZm8tPnJvd2J5dGVzOw0KKw0KKyAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkNCisgICAgICB7DQorICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBpbiB0aGlzIGNhc2UsIGFsbCBieXRlcyBtdXN0IGJlIDAgc28gd2UgZG9uJ3QgbmVlZA0KKyAgICAgICAgICAgICAqIHRvIHVucGFjayB0aGUgcGl4ZWxzIGV4Y2VwdCBmb3IgdGhlIHJpZ2h0bW9zdCBvbmUuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgZm9yICg7IHJwID4gcG5nX3B0ci0+cm93X2J1ZjsgcnAtLSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBpZiAoKnJwID4+IHBhZGRpbmcgIT0gMCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IDE7DQorICAgICAgICAgICAgICBwYWRkaW5nID0gMDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICB7DQorICAgICAgICAgICAgZm9yICg7IHJwID4gcG5nX3B0ci0+cm93X2J1ZjsgcnAtLSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBpbnQgaSA9ICgoKnJwID4+IHBhZGRpbmcpICYgMHgwMyk7DQorDQorICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7DQorDQorICAgICAgICAgICAgICBpID0gKCgoKnJwID4+IHBhZGRpbmcpID4+IDIpICYgMHgwMyk7DQorDQorICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7DQorDQorICAgICAgICAgICAgICBpID0gKCgoKnJwID4+IHBhZGRpbmcpID4+IDQpICYgMHgwMyk7DQorDQorICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7DQorDQorICAgICAgICAgICAgICBpID0gKCgoKnJwID4+IHBhZGRpbmcpID4+IDYpICYgMHgwMyk7DQorDQorICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7DQorDQorICAgICAgICAgICAgICBwYWRkaW5nID0gMDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICB7DQorICAgICAgICAgICAgZm9yICg7IHJwID4gcG5nX3B0ci0+cm93X2J1ZjsgcnAtLSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBpbnQgaSA9ICgoKnJwID4+IHBhZGRpbmcpICYgMHgwZik7DQorDQorICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7DQorDQorICAgICAgICAgICAgICBpID0gKCgoKnJwID4+IHBhZGRpbmcpID4+IDQpICYgMHgwZik7DQorDQorICAgICAgICAgICAgICBpZiAoaSA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IGk7DQorDQorICAgICAgICAgICAgICBwYWRkaW5nID0gMDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgODoNCisgICAgICAgICB7DQorICAgICAgICAgICAgZm9yICg7IHJwID4gcG5nX3B0ci0+cm93X2J1ZjsgcnAtLSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaWYgKCpycCA+IHBuZ19wdHItPm51bV9wYWxldHRlX21heCkNCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPSAoaW50KSAqcnA7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZiAvKiBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEICovDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkNCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwDQorICAgdXNlcl90cmFuc2Zvcm1fcHRyLCBpbnQgdXNlcl90cmFuc2Zvcm1fZGVwdGgsIGludCB1c2VyX3RyYW5zZm9ybV9jaGFubmVscykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8iKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEDQorICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0lTX1JFQURfU1RSVUNUKSAhPSAwICYmDQorICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfUk9XX0lOSVQpICE9IDApDQorICAgew0KKyAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwNCisgICAgICAgICAgICAiaW5mbyBjaGFuZ2UgYWZ0ZXIgcG5nX3N0YXJ0X3JlYWRfaW1hZ2Ugb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8iKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKyNlbmRpZg0KKw0KKyAgIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX3B0ciA9IHVzZXJfdHJhbnNmb3JtX3B0cjsNCisgICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCA9IChwbmdfYnl0ZSl1c2VyX3RyYW5zZm9ybV9kZXB0aDsNCisgICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVscyA9IChwbmdfYnl0ZSl1c2VyX3RyYW5zZm9ybV9jaGFubmVsczsNCit9DQorI2VuZGlmDQorDQorLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdXNlcl90cmFuc2Zvcm1fcHRyIGFzc29jaWF0ZWQgd2l0aA0KKyAqIHRoZSB1c2VyIHRyYW5zZm9ybSBmdW5jdGlvbnMuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGZyZWUgYW55IG1lbW9yeQ0KKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95IGFuZCBwbmdfcmVhZF9kZXN0cm95DQorICogYXJlIGNhbGxlZC4NCisgKi8NCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQNCitwbmdfdm9pZHAgUE5HQVBJDQorcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIChOVUxMKTsNCisNCisgICByZXR1cm4gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fcHRyOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX0lORk9fU1VQUE9SVEVEDQorcG5nX3VpbnRfMzIgUE5HQVBJDQorcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIFNlZSB0aGUgY29tbWVudHMgaW4gcG5nLmggLSB0aGlzIGlzIHRoZSBzdWItaW1hZ2Ugcm93IHdoZW4gcmVhZGluZyBhbmQNCisgICAgKiBpbnRlcmxhY2VkIGltYWdlLg0KKyAgICAqLw0KKyAgIGlmIChwbmdfcHRyICE9IE5VTEwpDQorICAgICAgcmV0dXJuIHBuZ19wdHItPnJvd19udW1iZXI7DQorDQorICAgcmV0dXJuIFBOR19VSU5UXzMyX01BWDsgLyogaGVscCB0aGUgYXBwIG5vdCB0byBmYWlsIHNpbGVudGx5ICovDQorfQ0KKw0KK3BuZ19ieXRlIFBOR0FQSQ0KK3BuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICAgICByZXR1cm4gcG5nX3B0ci0+cGFzczsNCisgICByZXR1cm4gODsgLyogaW52YWxpZCAqLw0KK30NCisjZW5kaWYgLyogUE5HX1VTRVJfVFJBTlNGT1JNX0lORk9fU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCB8fA0KKyAgICAgICAgICBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd3aW8uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMTMzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd2lvLmMKQEAgLTAsMCArMSwxNjUgQEAKKw0KKy8qIHBuZ3dpby5jIC0gZnVuY3Rpb25zIGZvciBkYXRhIG91dHB1dA0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKg0KKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGxvY2F0aW9uIGZvciBhbGwgb3V0cHV0LiAgVXNlcnMgd2hvIG5lZWQNCisgKiBzcGVjaWFsIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSBmdW5jdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lDQorICogYXJndW1lbnRzIGFzIHRoZXNlIGFuZCBwZXJmb3JtIHNpbWlsYXIgZnVuY3Rpb25zLCBidXQgdGhhdCBwb3NzaWJseQ0KKyAqIHVzZSBkaWZmZXJlbnQgb3V0cHV0IG1ldGhvZHMuICBOb3RlIHRoYXQgeW91IHNob3VsZG4ndCBjaGFuZ2UgdGhlc2UNCisgKiBmdW5jdGlvbnMsIGJ1dCByYXRoZXIgd3JpdGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zIGFuZCB0aGVuIGNoYW5nZQ0KKyAqIHRoZW0gYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3dyaXRlX2ZuKC4uLikuDQorICovDQorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKw0KKy8qIFdyaXRlIHRoZSBkYXRhIHRvIHdoYXRldmVyIG91dHB1dCB5b3UgYXJlIHVzaW5nLiAgVGhlIGRlZmF1bHQgcm91dGluZQ0KKyAqIHdyaXRlcyB0byBhIGZpbGUgcG9pbnRlci4gIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgc29tZXRpbWVzIGdldHMgY2FsbGVkDQorICogd2l0aCB2ZXJ5IHNtYWxsIGxlbmd0aHMsIHNvIHlvdSBzaG91bGQgaW1wbGVtZW50IHNvbWUga2luZCBvZiBzaW1wbGUNCisgKiBidWZmZXJpbmcgaWYgeW91IGFyZSB1c2luZyB1bmJ1ZmZlcmVkIHdyaXRlcy4gIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGFza2VkDQorICogdG8gd3JpdGUgbW9yZSB0aGFuIDY0SyBvbiBhIDE2IGJpdCBtYWNoaW5lLg0KKyAqLw0KKw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ193cml0ZV9kYXRhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpDQorew0KKyAgIC8qIE5PVEU6IHdyaXRlX2RhdGFfZm4gbXVzdCBub3QgY2hhbmdlIHRoZSBidWZmZXIhICovDQorICAgaWYgKHBuZ19wdHItPndyaXRlX2RhdGFfZm4gIT0gTlVMTCApDQorICAgICAgKCoocG5nX3B0ci0+d3JpdGVfZGF0YV9mbikpKHBuZ19wdHIsIHBuZ19jb25zdGNhc3QocG5nX2J5dGVwLGRhdGEpLA0KKyAgICAgICAgIGxlbmd0aCk7DQorDQorICAgZWxzZQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FsbCB0byBOVUxMIHdyaXRlIGZ1bmN0aW9uIik7DQorfQ0KKw0KKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVEDQorLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgd3JpdGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQ0KKyAqIG5vdCB3cml0aW5nIHRvIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQNCisgKiB3cml0ZV9kYXRhIGZ1bmN0aW9uIGFuZCB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3dyaXRlX2ZuKCksIHJhdGhlcg0KKyAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuDQorICovDQordm9pZCBQTkdDQkFQSQ0KK3BuZ19kZWZhdWx0X3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQ0KK3sNCisgICBwbmdfc2l6ZV90IGNoZWNrOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGNoZWNrID0gZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgKHBuZ19GSUxFX3ApKHBuZ19wdHItPmlvX3B0cikpOw0KKw0KKyAgIGlmIChjaGVjayAhPSBsZW5ndGgpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJXcml0ZSBFcnJvciIpOw0KK30NCisjZW5kaWYNCisNCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvdXRwdXQgYW55IGRhdGEgcGVuZGluZyB3cml0aW5nIChub3JtYWxseQ0KKyAqIHRvIGRpc2spLiAgQWZ0ZXIgcG5nX2ZsdXNoIGlzIGNhbGxlZCwgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgcGVuZGluZw0KKyAqIHdyaXRpbmcgaW4gYW55IGJ1ZmZlcnMuDQorICovDQorI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZmx1c2gocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIGlmIChwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gIT0gTlVMTCkNCisgICAgICAoKihwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4pKShwbmdfcHRyKTsNCit9DQorDQorIyAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQ0JBUEkNCitwbmdfZGVmYXVsdF9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfRklMRV9wIGlvX3B0cjsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpb19wdHIgPSBwbmdfdm9pZGNhc3QocG5nX0ZJTEVfcCwgKHBuZ19wdHItPmlvX3B0cikpOw0KKyAgIGZmbHVzaChpb19wdHIpOw0KK30NCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKy8qIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzdXBwbHkgbmV3IG91dHB1dCBmdW5jdGlvbnMgZm9yDQorICogbGlicG5nIGlmIHN0YW5kYXJkIEMgc3RyZWFtcyBhcmVuJ3QgYmVpbmcgdXNlZC4NCisgKg0KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgaXRzIGFyZ3VtZW50czoNCisgKiBwbmdfcHRyICAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBvdXRwdXQgZGF0YSBzdHJ1Y3R1cmUNCisgKiBpb19wdHIgICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQNCisgKiAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBmdW5jdGlvbnMuICBNYXkgYmUgTlVMTC4NCisgKiB3cml0ZV9kYXRhX2ZuIC0gcG9pbnRlciB0byBhIG5ldyBvdXRwdXQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMNCisgKiAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QsIGEgcG9pbnRlciB0bw0KKyAqICAgICAgICAgICAgICAgICBkYXRhIHRvIGJlIHdyaXR0ZW4sIGFuZCBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgdGhhdCBpcw0KKyAqICAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uICBUaGUgbmV3IHdyaXRlDQorICogICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBjYWxsIHBuZ19lcnJvcihwbmdfcHRyLCAiRXJyb3IgbXNnIikNCisgKiAgICAgICAgICAgICAgICAgdG8gZXhpdCBhbmQgb3V0cHV0IGFueSBmYXRhbCBlcnJvciBtZXNzYWdlcy4gIE1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICBOVUxMLCBpbiB3aGljaCBjYXNlIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbA0KKyAqICAgICAgICAgICAgICAgICBiZSB1c2VkLg0KKyAqIGZsdXNoX2RhdGFfZm4gLSBwb2ludGVyIHRvIGEgbmV3IGZsdXNoIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYXMgaXRzDQorICogICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0LiAgQWZ0ZXIgYSBjYWxsIHRvDQorICogICAgICAgICAgICAgICAgIHRoZSBmbHVzaCBmdW5jdGlvbiwgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgaW4gYW55IGJ1ZmZlcnMNCisgKiAgICAgICAgICAgICAgICAgb3IgcGVuZGluZyB0cmFuc21pc3Npb24uICBJZiB0aGUgb3V0cHV0IG1ldGhvZCBkb2Vzbid0IGRvDQorICogICAgICAgICAgICAgICAgIGFueSBidWZmZXJpbmcgb2Ygb3V0cHV0LCBhIGZ1bmN0aW9uIHByb3RvdHlwZSBtdXN0IHN0aWxsIGJlDQorICogICAgICAgICAgICAgICAgIHN1cHBsaWVkIGFsdGhvdWdoIGl0IGRvZXNuJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy4gIElmDQorICogICAgICAgICAgICAgICAgIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQgYXQgbGlicG5nIGNvbXBpbGUNCisgKiAgICAgICAgICAgICAgICAgdGltZSwgb3V0cHV0X2ZsdXNoX2ZuIHdpbGwgYmUgaWdub3JlZCwgYWx0aG91Z2ggaXQgbXVzdCBiZQ0KKyAqICAgICAgICAgICAgICAgICBzdXBwbGllZCBmb3IgY29tcGF0aWJpbGl0eS4gIE1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlDQorICogICAgICAgICAgICAgICAgIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLCBpZg0KKyAqICAgICAgICAgICAgICAgICBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIGlzIGRlZmluZWQuICBUaGlzIGlzIG5vdA0KKyAqICAgICAgICAgICAgICAgICBhIGdvb2QgaWRlYSBpZiBpb19wdHIgZG9lcyBub3QgcG9pbnQgdG8gYSBzdGFuZGFyZA0KKyAqICAgICAgICAgICAgICAgICAqRklMRSBzdHJ1Y3R1cmUuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3dyaXRlX2ZuKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLA0KKyAgICBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT5pb19wdHIgPSBpb19wdHI7DQorDQorI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQNCisgICBpZiAod3JpdGVfZGF0YV9mbiAhPSBOVUxMKQ0KKyAgICAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSB3cml0ZV9kYXRhX2ZuOw0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfcHRyLT53cml0ZV9kYXRhX2ZuID0gcG5nX2RlZmF1bHRfd3JpdGVfZGF0YTsNCisjZWxzZQ0KKyAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSB3cml0ZV9kYXRhX2ZuOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEDQorIyAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRA0KKw0KKyAgIGlmIChvdXRwdXRfZmx1c2hfZm4gIT0gTlVMTCkNCisgICAgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBvdXRwdXRfZmx1c2hfZm47DQorDQorICAgZWxzZQ0KKyAgICAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IHBuZ19kZWZhdWx0X2ZsdXNoOw0KKw0KKyMgIGVsc2UNCisgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBvdXRwdXRfZmx1c2hfZm47DQorIyAgZW5kaWYNCisjZW5kaWYgLyogUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCAqLw0KKw0KKyAgIC8qIEl0IGlzIGFuIGVycm9yIHRvIHJlYWQgd2hpbGUgd3JpdGluZyBhIHBuZyBmaWxlICovDQorICAgaWYgKHBuZ19wdHItPnJlYWRfZGF0YV9mbiAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSBOVUxMOw0KKw0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsDQorICAgICAgICAgICJDYW4ndCBzZXQgYm90aCByZWFkX2RhdGFfZm4gYW5kIHdyaXRlX2RhdGFfZm4gaW4gdGhlIg0KKyAgICAgICAgICAiIHNhbWUgc3RydWN0dXJlIik7DQorICAgfQ0KK30NCisjZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLw0KKyNlbmRpZi8vX0ZQREZBUElfTUlOSV8NCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3dyaXRlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmY2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd3JpdGUuYwpAQCAtMCwwICsxLDIzMzEgQEAKKw0KKy8qIHBuZ3dyaXRlLmMgLSBnZW5lcmFsIHJvdXRpbmVzIHRvIHdyaXRlIGEgUE5HIGZpbGUNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjIgW0FwcmlsIDI1LCAyMDEzXQ0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisjaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkNCisjICBpbmNsdWRlIDxlcnJuby5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorDQorI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisvKiBXcml0ZSBvdXQgYWxsIHRoZSB1bmtub3duIGNodW5rcyBmb3IgdGhlIGN1cnJlbnQgZ2l2ZW4gbG9jYXRpb24gKi8NCitzdGF0aWMgdm9pZA0KK3dyaXRlX3Vua25vd25fY2h1bmtzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLA0KKyAgIHVuc2lnbmVkIGludCB3aGVyZSkNCit7DQorICAgaWYgKGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pDQorICAgew0KKyAgICAgIHBuZ19jb25zdF91bmtub3duX2NodW5rcCB1cDsNCisNCisgICAgICBwbmdfZGVidWcoNSwgIndyaXRpbmcgZXh0cmEgY2h1bmtzIik7DQorDQorICAgICAgZm9yICh1cCA9IGluZm9fcHRyLT51bmtub3duX2NodW5rczsNCisgICAgICAgICAgIHVwIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzICsgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsNCisgICAgICAgICAgICsrdXApDQorICAgICAgICAgaWYgKHVwLT5sb2NhdGlvbiAmIHdoZXJlKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBJZiBwZXItY2h1bmsgdW5rbm93biBjaHVuayBoYW5kbGluZyBpcyBlbmFibGVkIHVzZSBpdCwgb3RoZXJ3aXNlDQorICAgICAgICAgICoganVzdCB3cml0ZSB0aGUgY2h1bmtzIHRoZSBhcHBsaWNhdGlvbiBoYXMgc2V0Lg0KKyAgICAgICAgICAqLw0KKyNpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRA0KKyAgICAgICAgIGludCBrZWVwID0gcG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHVwLT5uYW1lKTsNCisNCisgICAgICAgICAvKiBOT1RFOiB0aGlzIGNvZGUgaXMgcmFkaWNhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSByZWFkIHNpZGUgaW4gdGhlDQorICAgICAgICAgICogbWF0dGVyIG9mIGhhbmRsaW5nIGFuIGFuY2lsbGFyeSB1bmtub3duIGNodW5rLiAgSW4gdGhlIHJlYWQgc2lkZQ0KKyAgICAgICAgICAqIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRpc2NhcmQgaXQsIGluIHRoZSBjb2RlIGJlbG93IHRoZSBkZWZhdWx0DQorICAgICAgICAgICogYmVoYXZpb3IgaXMgdG8gd3JpdGUgaXQuICBDcml0aWNhbCBjaHVua3MgYXJlLCBob3dldmVyLCBvbmx5DQorICAgICAgICAgICogd3JpdHRlbiBpZiBleHBsaWNpdGx5IGxpc3RlZCBvciBpZiB0aGUgZGVmYXVsdCBpcyBzZXQgdG8gd3JpdGUgYWxsDQorICAgICAgICAgICogdW5rbm93biBjaHVua3MuDQorICAgICAgICAgICoNCisgICAgICAgICAgKiBUaGUgZGVmYXVsdCBoYW5kbGluZyBpcyBhbHNvIHNsaWdodGx5IHdlaXJkIC0gaXQgaXMgbm90IHBvc3NpYmxlIHRvDQorICAgICAgICAgICogc3RvcCB0aGUgd3JpdGluZyBvZiBhbGwgdW5zYWZlLXRvLWNvcHkgY2h1bmtzIQ0KKyAgICAgICAgICAqDQorICAgICAgICAgICogVE9ETzogUkVWSUVXOiB0aGlzIHdvdWxkIHNlZW0gdG8gYmUgYSBidWcuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKGtlZXAgIT0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAmJg0KKyAgICAgICAgICAgICAoKHVwLT5uYW1lWzNdICYgMHgyMCkgLyogc2FmZS10by1jb3B5IG92ZXJyaWRlcyBldmVyeXRoaW5nICovIHx8DQorICAgICAgICAgICAgICBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8DQorICAgICAgICAgICAgICAoa2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgJiYNCisgICAgICAgICAgICAgICBwbmdfcHRyLT51bmtub3duX2RlZmF1bHQgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMpKSkNCisjZW5kaWYNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVE9ETzogcmV2aWV3LCB3aGF0IGlzIHdyb25nIHdpdGggYSB6ZXJvIGxlbmd0aCB1bmtub3duIGNodW5rPyAqLw0KKyAgICAgICAgICAgIGlmICh1cC0+c2l6ZSA9PSAwKQ0KKyAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJXcml0aW5nIHplcm8tbGVuZ3RoIHVua25vd24gY2h1bmsiKTsNCisNCisgICAgICAgICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgdXAtPm5hbWUsIHVwLT5kYXRhLCB1cC0+c2l6ZSk7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEICovDQorDQorLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgc3VnZ2VzdGVkIHdheSB0byB1c2UgdGhlDQorICogbGlicmFyeS4gIElmIHlvdSBoYXZlIGEgbmV3IGNodW5rIHRvIGFkZCwgbWFrZSBhIGZ1bmN0aW9uIHRvIHdyaXRlIGl0LA0KKyAqIGFuZCBwdXQgaXQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24gaGVyZS4gIElmIHlvdSB3YW50IHRoZSBjaHVuayB3cml0dGVuDQorICogYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHB1dCBpdCBpbiBwbmdfd3JpdGVfZW5kKCkuICBJIHN0cm9uZ2x5IGVuY291cmFnZQ0KKyAqIHlvdSB0byBzdXBwbHkgYSBQTkdfSU5GT18gZmxhZywgYW5kIGNoZWNrIGluZm9fcHRyLT52YWxpZCBiZWZvcmUgd3JpdGluZw0KKyAqIHRoZSBjaHVuaywgYXMgdGhhdCB3aWxsIGtlZXAgdGhlIGNvZGUgZnJvbSBicmVha2luZyBpZiB5b3Ugd2FudCB0byBqdXN0DQorICogd3JpdGUgYSBwbGFpbiBQTkcgZmlsZS4gIElmIHlvdSBoYXZlIGxvbmcgY29tbWVudHMsIEkgc3VnZ2VzdCB3cml0aW5nDQorICogdGhlbSBpbiBwbmdfd3JpdGVfZW5kKCksIGFuZCBjb21wcmVzc2luZyB0aGVtLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSkpDQorICAgew0KKyAgIC8qIFdyaXRlIFBORyBzaWduYXR1cmUgKi8NCisgICBwbmdfd3JpdGVfc2lnKHBuZ19wdHIpOw0KKw0KKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRA0KKyAgIGlmICgocG5nX3B0ci0+bW9kZSZQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSAmJiBcDQorICAgICAgIChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkKSkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1ORyBmZWF0dXJlcyBhcmUgbm90IGFsbG93ZWQgaW4gYSBQTkcgZGF0YXN0cmVhbSIpOw0KKyAgICAgIHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgPSAwOw0KKyAgIH0NCisjZW5kaWYNCisNCisgICAvKiBXcml0ZSBJSERSIGluZm9ybWF0aW9uLiAqLw0KKyAgIHBuZ193cml0ZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLT53aWR0aCwgaW5mb19wdHItPmhlaWdodCwNCisgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCwgaW5mb19wdHItPmNvbG9yX3R5cGUsIGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlLA0KKyAgICAgICBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUsDQorI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICAgICAgaW5mb19wdHItPmludGVybGFjZV90eXBlDQorI2Vsc2UNCisgICAgICAgMA0KKyNlbmRpZg0KKyAgICAgICk7DQorDQorICAgLyogVGhlIHJlc3Qgb2YgdGhlc2UgY2hlY2sgdG8gc2VlIGlmIHRoZSB2YWxpZCBmaWVsZCBoYXMgdGhlIGFwcHJvcHJpYXRlDQorICAgICogZmxhZyBzZXQsIGFuZCBpZiBpdCBkb2VzLCB3cml0ZXMgdGhlIGNodW5rLg0KKyAgICAqDQorICAgICogMS42LjA6IENPTE9SU1BBQ0Ugc3VwcG9ydCBjb250cm9scyB0aGUgd3JpdGluZyBvZiB0aGVzZSBjaHVua3MgdG9vLCBhbmQNCisgICAgKiB0aGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBpZiB0aGUgV1JJVEUgcm91dGluZSBpcyB0aGVyZSBhbmQgaW5mb3JtYXRpb24NCisgICAgKiBpcyBhdmFpbGFibGUgaW4gdGhlIENPTE9SU1BBQ0UuICAoU2VlIHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbyBpbiBwbmcuYw0KKyAgICAqIGZvciB3aGVyZSB0aGUgdmFsaWQgZmxhZ3MgZ2V0IHNldC4pDQorICAgICoNCisgICAgKiBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgdGhlIGNvbG9yc3BhY2UgY2FuIGJlIGludmFsaWRhdGVkIHdpdGhvdXQNCisgICAgKiBzeW5jaW5nIHRoZSBpbmZvX3N0cnVjdCAndmFsaWQnIGZsYWdzOyB0aGlzIGhhcHBlbnMgaWYgbGlicG5nIGRldGVjdHMgYW5kDQorICAgICogZXJyb3IgYW5kIGNhbGxzIHBuZ19lcnJvciB3aGlsZSB0aGUgY29sb3Igc3BhY2UgaXMgYmVpbmcgc2V0LCB5ZXQgdGhlDQorICAgICogYXBwbGljYXRpb24gY29udGludWVzIHdyaXRpbmcgdGhlIFBORy4gIFNvIGNoZWNrIHRoZSAnaW52YWxpZCcgZmxhZyBoZXJlDQorICAgICogdG9vLg0KKyAgICAqLw0KKyNpZmRlZiBQTkdfR0FNTUFfU1VQUE9SVEVEDQorIyAgaWZkZWYgUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVEDQorICAgICAgaWYgKCEoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKSAmJg0KKyAgICAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQSkgJiYNCisgICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fZ0FNQSkpDQorICAgICAgICAgcG5nX3dyaXRlX2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHItPmNvbG9yc3BhY2UuZ2FtbWEpOw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRA0KKyAgIC8qIFdyaXRlIG9ubHkgb25lIG9mIHNSR0Igb3IgYW4gSUNDIHByb2ZpbGUuICBJZiBhIHByb2ZpbGUgd2FzIHN1cHBsaWVkDQorICAgICogYW5kIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBrbm93biBzUkdCIG9uZXMgaXNzdWUgYSB3YXJuaW5nLg0KKyAgICAqLw0KKyMgIGlmZGVmIFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRA0KKyAgICAgIGlmICghKGluZm9fcHRyLT5jb2xvcnNwYWNlLmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkgJiYNCisgICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faUNDUCkpDQorICAgICAgew0KKyMgICAgICAgIGlmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRA0KKyAgICAgICAgICAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKQ0KKyAgICAgICAgICAgICAgIHBuZ19hcHBfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICJwcm9maWxlIG1hdGNoZXMgc1JHQiBidXQgd3JpdGluZyBpQ0NQIGluc3RlYWQiKTsNCisjICAgICAgICBlbmRpZg0KKw0KKyAgICAgICAgIHBuZ193cml0ZV9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLT5pY2NwX25hbWUsDQorICAgICAgICAgICAgaW5mb19wdHItPmljY3BfcHJvZmlsZSk7DQorICAgICAgfQ0KKyMgICAgIGlmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRA0KKyAgICAgICAgIGVsc2UNCisjICAgICBlbmRpZg0KKyMgIGVuZGlmDQorDQorIyAgaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVEDQorICAgICAgaWYgKCEoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKSAmJg0KKyAgICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKSkNCisgICAgICAgICBwbmdfd3JpdGVfc1JHQihwbmdfcHRyLCBpbmZvX3B0ci0+Y29sb3JzcGFjZS5yZW5kZXJpbmdfaW50ZW50KTsNCisjICBlbmRpZiAvKiBXUklURV9zUkdCICovDQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgKi8NCisNCisjaWZkZWYgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVEDQorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NCSVQpDQorICAgICAgcG5nX3dyaXRlX3NCSVQocG5nX3B0ciwgJihpbmZvX3B0ci0+c2lnX2JpdCksIGluZm9fcHRyLT5jb2xvcl90eXBlKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVEDQorIyAgaWZkZWYgUE5HX1dSSVRFX2NIUk1fU1VQUE9SVEVEDQorICAgICAgaWYgKCEoaW5mb19wdHItPmNvbG9yc3BhY2UuZmxhZ3MgJiBQTkdfQ09MT1JTUEFDRV9JTlZBTElEKSAmJg0KKyAgICAgICAgIChpbmZvX3B0ci0+Y29sb3JzcGFjZS5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0ZST01fY0hSTSkgJiYNCisgICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fY0hSTSkpDQorICAgICAgICAgcG5nX3dyaXRlX2NIUk1fZml4ZWQocG5nX3B0ciwgJmluZm9fcHRyLT5jb2xvcnNwYWNlLmVuZF9wb2ludHNfeHkpOw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisgICAgICB3cml0ZV91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0hBVkVfSUhEUik7DQorI2VuZGlmDQorDQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURTsNCisgICB9DQorfQ0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3dyaXRlX2luZm8ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpDQorew0KKyNpZiBkZWZpbmVkKFBOR19XUklURV9URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQpDQorICAgaW50IGk7DQorI2VuZGlmDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaW5mbyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIpOw0KKw0KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19QTFRFKQ0KKyAgICAgIHBuZ193cml0ZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLT5wYWxldHRlLA0KKyAgICAgICAgICAocG5nX3VpbnRfMzIpaW5mb19wdHItPm51bV9wYWxldHRlKTsNCisNCisgICBlbHNlIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVmFsaWQgcGFsZXR0ZSByZXF1aXJlZCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIik7DQorDQorI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRA0KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKQ0KKyAgIHsNCisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQNCisgICAgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgKGluIHRSTlMpICovDQorICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX0FMUEhBKSAmJg0KKyAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgajsNCisgICAgICAgICBmb3IgKGogPSAwOyBqPChpbnQpaW5mb19wdHItPm51bV90cmFuczsgaisrKQ0KKyAgICAgICAgICAgIGluZm9fcHRyLT50cmFuc19hbHBoYVtqXSA9DQorICAgICAgICAgICAgICAgKHBuZ19ieXRlKSgyNTUgLSBpbmZvX3B0ci0+dHJhbnNfYWxwaGFbal0pOw0KKyAgICAgIH0NCisjZW5kaWYNCisgICAgICBwbmdfd3JpdGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ci0+dHJhbnNfYWxwaGEsICYoaW5mb19wdHItPnRyYW5zX2NvbG9yKSwNCisgICAgICAgICAgaW5mb19wdHItPm51bV90cmFucywgaW5mb19wdHItPmNvbG9yX3R5cGUpOw0KKyAgIH0NCisjZW5kaWYNCisjaWZkZWYgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVEDQorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2JLR0QpDQorICAgICAgcG5nX3dyaXRlX2JLR0QocG5nX3B0ciwgJihpbmZvX3B0ci0+YmFja2dyb3VuZCksIGluZm9fcHRyLT5jb2xvcl90eXBlKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVEDQorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpDQorICAgICAgcG5nX3dyaXRlX2hJU1QocG5nX3B0ciwgaW5mb19wdHItPmhpc3QsIGluZm9fcHRyLT5udW1fcGFsZXR0ZSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9vRkZzX1NVUFBPUlRFRA0KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKQ0KKyAgICAgIHBuZ193cml0ZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLT54X29mZnNldCwgaW5mb19wdHItPnlfb2Zmc2V0LA0KKyAgICAgICAgICBpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRA0KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wQ0FMKQ0KKyAgICAgIHBuZ193cml0ZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UsIGluZm9fcHRyLT5wY2FsX1gwLA0KKyAgICAgICAgICBpbmZvX3B0ci0+cGNhbF9YMSwgaW5mb19wdHItPnBjYWxfdHlwZSwgaW5mb19wdHItPnBjYWxfbnBhcmFtcywNCisgICAgICAgICAgaW5mb19wdHItPnBjYWxfdW5pdHMsIGluZm9fcHRyLT5wY2FsX3BhcmFtcyk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRA0KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKQ0KKyAgICAgIHBuZ193cml0ZV9zQ0FMX3MocG5nX3B0ciwgKGludClpbmZvX3B0ci0+c2NhbF91bml0LA0KKyAgICAgICAgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoLCBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCk7DQorI2VuZGlmIC8qIHNDQUwgKi8NCisNCisjaWZkZWYgUE5HX1dSSVRFX3BIWXNfU1VQUE9SVEVEDQorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpDQorICAgICAgcG5nX3dyaXRlX3BIWXMocG5nX3B0ciwgaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0LA0KKyAgICAgICAgICBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQsIGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSk7DQorI2VuZGlmIC8qIHBIWXMgKi8NCisNCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEDQorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpDQorICAgew0KKyAgICAgIHBuZ193cml0ZV90SU1FKHBuZ19wdHIsICYoaW5mb19wdHItPm1vZF90aW1lKSk7DQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfV1JPVEVfdElNRTsNCisgICB9DQorI2VuZGlmIC8qIHRJTUUgKi8NCisNCisjaWZkZWYgUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVEDQorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NQTFQpDQorICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtOyBpKyspDQorICAgICAgICAgcG5nX3dyaXRlX3NQTFQocG5nX3B0ciwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMgKyBpKTsNCisjZW5kaWYgLyogc1BMVCAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQNCisgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB3cml0ZSB0ZXh0IGNodW5rcyAqLw0KKyAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykNCisgICB7DQorICAgICAgcG5nX2RlYnVnMigyLCAiV3JpdGluZyBoZWFkZXIgdGV4dCBjaHVuayAlZCwgdHlwZSAlZCIsIGksDQorICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsNCisgICAgICAvKiBBbiBpbnRlcm5hdGlvbmFsaXplZCBjaHVuaz8gKi8NCisgICAgICBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPiAwKQ0KKyAgICAgIHsNCisjaWZkZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVEDQorICAgICAgICAgLyogV3JpdGUgaW50ZXJuYXRpb25hbCBjaHVuayAqLw0KKyAgICAgICAgIHBuZ193cml0ZV9pVFh0KHBuZ19wdHIsDQorICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uLA0KKyAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5rZXksDQorICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmcsDQorICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmdfa2V5LA0KKyAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0KTsNCisjZWxzZQ0KKyAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGludGVybmF0aW9uYWwgdGV4dCIpOw0KKyNlbmRpZg0KKyAgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLw0KKyAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIElmIHdlIHdhbnQgYSBjb21wcmVzc2VkIHRleHQgY2h1bmsgKi8NCisgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KQ0KKyAgICAgIHsNCisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVEDQorICAgICAgICAgLyogV3JpdGUgY29tcHJlc3NlZCBjaHVuayAqLw0KKyAgICAgICAgIHBuZ193cml0ZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwNCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCwNCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24pOw0KKyNlbHNlDQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBjb21wcmVzc2VkIHRleHQiKTsNCisjZW5kaWYNCisgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLw0KKyAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUjsNCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkNCisgICAgICB7DQorI2lmZGVmIFBOR19XUklURV90RVh0X1NVUFBPUlRFRA0KKyAgICAgICAgIC8qIFdyaXRlIHVuY29tcHJlc3NlZCBjaHVuayAqLw0KKyAgICAgICAgIHBuZ193cml0ZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwNCisgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwNCisgICAgICAgICAgICAgMCk7DQorICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8NCisgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7DQorI2Vsc2UNCisgICAgICAgICAvKiBDYW4ndCBnZXQgaGVyZSAqLw0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgdW5jb21wcmVzc2VkIHRleHQiKTsNCisjZW5kaWYNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZiAvKiB0RVh0ICovDQorDQorI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisgICB3cml0ZV91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0hBVkVfUExURSk7DQorI2VuZGlmDQorfQ0KKw0KKy8qIFdyaXRlcyB0aGUgZW5kIG9mIHRoZSBQTkcgZmlsZS4gIElmIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIGNvbW1lbnRzIG9yDQorICogdGltZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBwYXNzIE5VTEwgZm9yIGluZm8uICBJZiB5b3UgYWxyZWFkeSB3cm90ZSB0aGVzZQ0KKyAqIGluIHBuZ193cml0ZV9pbmZvKCksIGRvIG5vdCB3cml0ZSB0aGVtIGFnYWluIGhlcmUuICBJZiB5b3UgaGF2ZSBsb25nDQorICogY29tbWVudHMsIEkgc3VnZ2VzdCB3cml0aW5nIHRoZW0gaGVyZSwgYW5kIGNvbXByZXNzaW5nIHRoZW0uDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfd3JpdGVfZW5kKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9lbmQiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJObyBJREFUcyB3cml0dGVuIGludG8gZmlsZSIpOw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPm51bV9wYWxldHRlX21heCA+IHBuZ19wdHItPm51bV9wYWxldHRlKQ0KKyAgICAgIHBuZ19iZW5pZ25fZXJyb3IocG5nX3B0ciwgIldyb3RlIHBhbGV0dGUgaW5kZXggZXhjZWVkaW5nIG51bV9wYWxldHRlIik7DQorI2VuZGlmDQorDQorICAgLyogU2VlIGlmIHVzZXIgd2FudHMgdXMgdG8gd3JpdGUgaW5mb3JtYXRpb24gY2h1bmtzICovDQorICAgaWYgKGluZm9fcHRyICE9IE5VTEwpDQorICAgew0KKyNpZmRlZiBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQNCisgICAgICBpbnQgaTsgLyogbG9jYWwgaW5kZXggdmFyaWFibGUgKi8NCisjZW5kaWYNCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEDQorICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHVzZXIgaGFzIHN1cHBsaWVkIGEgdGltZSBjaHVuayAqLw0KKyAgICAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkgJiYNCisgICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX3RJTUUpKQ0KKyAgICAgICAgIHBuZ193cml0ZV90SU1FKHBuZ19wdHIsICYoaW5mb19wdHItPm1vZF90aW1lKSk7DQorDQorI2VuZGlmDQorI2lmZGVmIFBOR19XUklURV9URVhUX1NVUFBPUlRFRA0KKyAgICAgIC8qIExvb3AgdGhyb3VnaCBjb21tZW50IGNodW5rcyAqLw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykNCisgICAgICB7DQorICAgICAgICAgcG5nX2RlYnVnMigyLCAiV3JpdGluZyB0cmFpbGVyIHRleHQgY2h1bmsgJWQsIHR5cGUgJWQiLCBpLA0KKyAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsNCisgICAgICAgICAvKiBBbiBpbnRlcm5hdGlvbmFsaXplZCBjaHVuaz8gKi8NCisgICAgICAgICBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPiAwKQ0KKyAgICAgICAgIHsNCisjaWZkZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVEDQorICAgICAgICAgICAgLyogV3JpdGUgaW50ZXJuYXRpb25hbCBjaHVuayAqLw0KKyAgICAgICAgICAgIHBuZ193cml0ZV9pVFh0KHBuZ19wdHIsDQorICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5rZXksDQorICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmcsDQorICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmdfa2V5LA0KKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0KTsNCisjZWxzZQ0KKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgaW50ZXJuYXRpb25hbCB0ZXh0Iik7DQorI2VuZGlmDQorICAgICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8NCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID49IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQpDQorICAgICAgICAgew0KKyNpZmRlZiBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQNCisgICAgICAgICAgICAvKiBXcml0ZSBjb21wcmVzc2VkIGNodW5rICovDQorICAgICAgICAgICAgcG5nX3dyaXRlX3pUWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LA0KKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0LCAwLA0KKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbik7DQorI2Vsc2UNCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGNvbXByZXNzZWQgdGV4dCIpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovDQorICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQ0KKyAgICAgICAgIHsNCisjaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVEDQorICAgICAgICAgICAgLyogV3JpdGUgdW5jb21wcmVzc2VkIGNodW5rICovDQorICAgICAgICAgICAgcG5nX3dyaXRlX3RFWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LA0KKyAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0LCAwKTsNCisjZWxzZQ0KKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgdW5jb21wcmVzc2VkIHRleHQiKTsNCisjZW5kaWYNCisNCisgICAgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLw0KKyAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUjsNCisgICAgICAgICB9DQorICAgICAgfQ0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgICAgd3JpdGVfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsIFBOR19BRlRFUl9JREFUKTsNCisjZW5kaWYNCisgICB9DQorDQorICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsNCisNCisgICAvKiBXcml0ZSBlbmQgb2YgUE5HIGZpbGUgKi8NCisgICBwbmdfd3JpdGVfSUVORChwbmdfcHRyKTsNCisgICAvKiBUaGlzIGZsdXNoLCBhZGRlZCBpbiBsaWJwbmctMS4wLjgsIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4wLjliZXRhMDMsDQorICAgICogYW5kIHJlc3RvcmVkIGFnYWluIGluIGxpYnBuZy0xLjIuMzAsIG1heSBjYXVzZSBzb21lIGFwcGxpY2F0aW9ucyB0aGF0DQorICAgICogZG8gbm90IHNldCBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gdG8gY3Jhc2guICBJZiB5b3VyIGFwcGxpY2F0aW9uDQorICAgICogZXhwZXJpZW5jZXMgYSBwcm9ibGVtLCBwbGVhc2UgdHJ5IGJ1aWxkaW5nIGxpYnBuZyB3aXRoDQorICAgICogUE5HX1dSSVRFX0ZMVVNIX0FGVEVSX0lFTkRfU1VQUE9SVEVEIGRlZmluZWQsIGFuZCByZXBvcnQgdGhlIGV2ZW50IHRvDQorICAgICogcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0IC4NCisgICAgKi8NCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRA0KKyMgIGlmZGVmIFBOR19XUklURV9GTFVTSF9BRlRFUl9JRU5EX1NVUFBPUlRFRA0KKyAgIHBuZ19mbHVzaChwbmdfcHRyKTsNCisjICBlbmRpZg0KKyNlbmRpZg0KK30NCisNCisjaWZkZWYgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQNCit2b2lkIFBOR0FQSQ0KK3BuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKHBuZ190aW1lcCBwdGltZSwgUE5HX0NPTlNUIHN0cnVjdCB0bSAqIHR0aW1lKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtIik7DQorDQorICAgcHRpbWUtPnllYXIgPSAocG5nX3VpbnRfMTYpKDE5MDAgKyB0dGltZS0+dG1feWVhcik7DQorICAgcHRpbWUtPm1vbnRoID0gKHBuZ19ieXRlKSh0dGltZS0+dG1fbW9uICsgMSk7DQorICAgcHRpbWUtPmRheSA9IChwbmdfYnl0ZSl0dGltZS0+dG1fbWRheTsNCisgICBwdGltZS0+aG91ciA9IChwbmdfYnl0ZSl0dGltZS0+dG1faG91cjsNCisgICBwdGltZS0+bWludXRlID0gKHBuZ19ieXRlKXR0aW1lLT50bV9taW47DQorICAgcHRpbWUtPnNlY29uZCA9IChwbmdfYnl0ZSl0dGltZS0+dG1fc2VjOw0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19jb252ZXJ0X2Zyb21fdGltZV90KHBuZ190aW1lcCBwdGltZSwgdGltZV90IHR0aW1lKQ0KK3sNCisgICBzdHJ1Y3QgdG0gKnRidWY7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY29udmVydF9mcm9tX3RpbWVfdCIpOw0KKw0KKyAgIHRidWYgPSBnbXRpbWUoJnR0aW1lKTsNCisgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bShwdGltZSwgdGJ1Zik7DQorfQ0KKyNlbmRpZg0KKw0KKy8qIEluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZCAqLw0KK1BOR19GVU5DVElPTihwbmdfc3RydWN0cCxQTkdBUEkNCitwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCwocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwNCisgICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSxQTkdfQUxMT0NBVEVEKQ0KK3sNCisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQNCisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcG5nX3N0cnVjdCh1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwNCisgICAgICBlcnJvcl9mbiwgd2Fybl9mbiwgTlVMTCwgTlVMTCwgTlVMTCk7DQorI2Vsc2UNCisgICByZXR1cm4gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMih1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwgZXJyb3JfZm4sDQorICAgICAgIHdhcm5fZm4sIE5VTEwsIE5VTEwsIE5VTEwpOw0KK30NCisNCisvKiBBbHRlcm5hdGUgaW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkICovDQorUE5HX0ZVTkNUSU9OKHBuZ19zdHJ1Y3RwLFBOR0FQSQ0KK3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIsKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsDQorICAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsDQorICAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLFBOR19BTExPQ0FURUQpDQorew0KKyAgIHBuZ19zdHJ1Y3RycCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9wbmdfc3RydWN0KHVzZXJfcG5nX3ZlciwgZXJyb3JfcHRyLA0KKyAgICAgIGVycm9yX2ZuLCB3YXJuX2ZuLCBtZW1fcHRyLCBtYWxsb2NfZm4sIGZyZWVfZm4pOw0KKyNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgLyogU2V0IHRoZSB6bGliIGNvbnRyb2wgdmFsdWVzIHRvIGRlZmF1bHRzOyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZQ0KKyAgICAgICAqIGFwcGxpY2F0aW9uIGFmdGVyIHRoZSBzdHJ1Y3QgaGFzIGJlZW4gY3JlYXRlZC4NCisgICAgICAgKi8NCisgICAgICBwbmdfcHRyLT56YnVmZmVyX3NpemUgPSBQTkdfWkJVRl9TSVpFOw0KKw0KKyAgICAgIC8qIFRoZSAnemxpYl9zdHJhdGVneScgc2V0dGluZyBpcyBpcnJlbGV2YW50IGJlY2F1c2UgcG5nX2RlZmF1bHRfY2xhaW0gaW4NCisgICAgICAgKiBwbmd3dXRpbC5jIGRlZmF1bHRzIGl0IGFjY29yZGluZyB0byB3aGV0aGVyIG9yIG5vdCBmaWx0ZXJzIHdpbGwgYmUNCisgICAgICAgKiB1c2VkLCBhbmQgaWdub3JlcyB0aGlzIHNldHRpbmcuDQorICAgICAgICovDQorICAgICAgcG5nX3B0ci0+emxpYl9zdHJhdGVneSA9IFBOR19aX0RFRkFVTFRfU1RSQVRFR1k7DQorICAgICAgcG5nX3B0ci0+emxpYl9sZXZlbCA9IFBOR19aX0RFRkFVTFRfQ09NUFJFU1NJT047DQorICAgICAgcG5nX3B0ci0+emxpYl9tZW1fbGV2ZWwgPSA4Ow0KKyAgICAgIHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHMgPSAxNTsNCisgICAgICBwbmdfcHRyLT56bGliX21ldGhvZCA9IDg7DQorDQorI2lmZGVmIFBOR19XUklURV9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVEDQorICAgICAgcG5nX3B0ci0+emxpYl90ZXh0X3N0cmF0ZWd5ID0gUE5HX1RFWFRfWl9ERUZBVUxUX1NUUkFURUdZOw0KKyAgICAgIHBuZ19wdHItPnpsaWJfdGV4dF9sZXZlbCA9IFBOR19URVhUX1pfREVGQVVMVF9DT01QUkVTU0lPTjsNCisgICAgICBwbmdfcHRyLT56bGliX3RleHRfbWVtX2xldmVsID0gODsNCisgICAgICBwbmdfcHRyLT56bGliX3RleHRfd2luZG93X2JpdHMgPSAxNTsNCisgICAgICBwbmdfcHRyLT56bGliX3RleHRfbWV0aG9kID0gODsNCisjZW5kaWYgLyogUE5HX1dSSVRFX0NPTVBSRVNTRURfVEVYVF9TVVBQT1JURUQgKi8NCisNCisgICAgICAvKiBUaGlzIGlzIGEgaGlnaGx5IGR1YmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb247IGJ5IGRlZmF1bHQgaXQgaXMgb2ZmLA0KKyAgICAgICAqIGJ1dCBpdCBtYXkgYmUgYXBwcm9wcmlhdGUgZm9yIHByaXZhdGUgYnVpbGRzIHRoYXQgYXJlIHRlc3RpbmcNCisgICAgICAgKiBleHRlbnNpb25zIG5vdCBjb25mb3JtYW50IHRvIHRoZSBjdXJyZW50IHNwZWNpZmljYXRpb24sIG9yIG9mDQorICAgICAgICogYXBwbGljYXRpb25zIHRoYXQgbXVzdCBub3QgZmFpbCB0byB3cml0ZSBhdCBhbGwgY29zdHMhDQorICAgICAgICovDQorI2lmZGVmIFBOR19CRU5JR05fV1JJVEVfRVJST1JTX1NVUFBPUlRFRA0KKyAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0JFTklHTl9FUlJPUlNfV0FSTjsNCisgICAgICAvKiBJbiBzdGFibGUgYnVpbGRzIG9ubHkgd2FybiBpZiBhbiBhcHBsaWNhdGlvbiBlcnJvciBjYW4gYmUgY29tcGxldGVseQ0KKyAgICAgICAqIGhhbmRsZWQuDQorICAgICAgICovDQorI2VuZGlmDQorDQorICAgICAgLyogQXBwIHdhcm5pbmdzIGFyZSB3YXJuaW5ncyBpbiByZWxlYXNlIChvciByZWxlYXNlIGNhbmRpZGF0ZSkgYnVpbGRzIGJ1dA0KKyAgICAgICAqIGFyZSBlcnJvcnMgZHVyaW5nIGRldmVsb3BtZW50Lg0KKyAgICAgICAqLw0KKyNpZiBQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSA+PSBQTkdfTElCUE5HX0JVSUxEX1JDDQorICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk47DQorI2VuZGlmDQorDQorICAgICAgLyogVE9ETzogZGVsYXkgdGhpcywgaXQgY2FuIGJlIGRvbmUgaW4gcG5nX2luaXRfaW8oKSAoaWYgdGhlIGFwcCBkb2Vzbid0DQorICAgICAgICogZG8gaXQgaXRzZWxmKSBhdm9pZGluZyBzZXR0aW5nIHRoZSBkZWZhdWx0IGZ1bmN0aW9uIGlmIGl0IGlzIG5vdA0KKyAgICAgICAqIHJlcXVpcmVkLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3B0ciwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICAgfQ0KKw0KKyAgIHJldHVybiBwbmdfcHRyOw0KK30NCisNCisNCisvKiBXcml0ZSBhIGZldyByb3dzIG9mIGltYWdlIGRhdGEuICBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwNCisgKiBlaXRoZXIgeW91IHdpbGwgaGF2ZSB0byB3cml0ZSB0aGUgNyBzdWIgaW1hZ2VzLCBvciwgaWYgeW91DQorICogaGF2ZSBjYWxsZWQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSwgeW91IHdpbGwgaGF2ZSB0bw0KKyAqICJ3cml0ZSIgdGhlIGltYWdlIHNldmVuIHRpbWVzLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3dyaXRlX3Jvd3MocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgcm93LA0KKyAgICBwbmdfdWludF8zMiBudW1fcm93cykNCit7DQorICAgcG5nX3VpbnRfMzIgaTsgLyogcm93IGNvdW50ZXIgKi8NCisgICBwbmdfYnl0ZXBwIHJwOyAvKiByb3cgcG9pbnRlciAqLw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3Jvd3MiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBMb29wIHRocm91Z2ggdGhlIHJvd3MgKi8NCisgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IG51bV9yb3dzOyBpKyssIHJwKyspDQorICAgew0KKyAgICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgKnJwKTsNCisgICB9DQorfQ0KKw0KKy8qIFdyaXRlIHRoZSBpbWFnZS4gIFlvdSBvbmx5IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UsIGV2ZW4NCisgKiBpZiB5b3UgYXJlIHdyaXRpbmcgYW4gaW50ZXJsYWNlZCBpbWFnZS4NCisgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ193cml0ZV9pbWFnZShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwcCBpbWFnZSkNCit7DQorICAgcG5nX3VpbnRfMzIgaTsgLyogcm93IGluZGV4ICovDQorICAgaW50IHBhc3MsIG51bV9wYXNzOyAvKiBwYXNzIHZhcmlhYmxlcyAqLw0KKyAgIHBuZ19ieXRlcHAgcnA7IC8qIHBvaW50cyB0byBjdXJyZW50IHJvdyAqLw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ltYWdlIik7DQorDQorI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICAvKiBJbml0aWFsaXplIGludGVybGFjZSBoYW5kbGluZy4gIElmIGltYWdlIGlzIG5vdCBpbnRlcmxhY2VkLA0KKyAgICAqIHRoaXMgd2lsbCBzZXQgcGFzcyB0byAxDQorICAgICovDQorICAgbnVtX3Bhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsNCisjZWxzZQ0KKyAgIG51bV9wYXNzID0gMTsNCisjZW5kaWYNCisgICAvKiBMb29wIHRocm91Z2ggcGFzc2VzICovDQorICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bV9wYXNzOyBwYXNzKyspDQorICAgew0KKyAgICAgIC8qIExvb3AgdGhyb3VnaCBpbWFnZSAqLw0KKyAgICAgIGZvciAoaSA9IDAsIHJwID0gaW1hZ2U7IGkgPCBwbmdfcHRyLT5oZWlnaHQ7IGkrKywgcnArKykNCisgICAgICB7DQorICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCAqcnApOw0KKyAgICAgIH0NCisgICB9DQorfQ0KKw0KKy8qIENhbGxlZCBieSB1c2VyIHRvIHdyaXRlIGEgcm93IG9mIGltYWdlIGRhdGEgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ193cml0ZV9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCByb3cpDQorew0KKyAgIC8qIDEuNS42OiBtb3ZlZCBmcm9tIHBuZ19zdHJ1Y3QgdG8gYmUgYSBsb2NhbCBzdHJ1Y3R1cmU6ICovDQorICAgcG5nX3Jvd19pbmZvIHJvd19pbmZvOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19kZWJ1ZzIoMSwgImluIHBuZ193cml0ZV9yb3cgKHJvdyAldSwgcGFzcyAlZCkiLA0KKyAgICAgIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOw0KKw0KKyAgIC8qIEluaXRpYWxpemUgdHJhbnNmb3JtYXRpb25zIGFuZCBvdGhlciBzdHVmZiBpZiBmaXJzdCB0aW1lICovDQorICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPT0gMCAmJiBwbmdfcHRyLT5wYXNzID09IDApDQorICAgew0KKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgaGVhZGVyIGluZm8gKi8NCisgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX0lORk9fQkVGT1JFX1BMVEUpKQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLA0KKyAgICAgICAgICAgICAicG5nX3dyaXRlX2luZm8gd2FzIG5ldmVyIGNhbGxlZCBiZWZvcmUgcG5nX3dyaXRlX3JvdyIpOw0KKw0KKyAgICAgIC8qIENoZWNrIGZvciB0cmFuc2Zvcm1zIHRoYXQgaGF2ZSBiZWVuIHNldCBidXQgd2VyZSBkZWZpbmVkIG91dCAqLw0KKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKQ0KKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pDQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7DQorI2VuZGlmDQorDQorI2lmICFkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpDQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIik7DQorI2VuZGlmDQorI2lmICFkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpICYmIFwNCisgICAgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAiUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQ0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsNCisjZW5kaWYNCisNCisjaWYgIWRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TSElGVCkNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKQ0KKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKQ0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCIpOw0KKyNlbmRpZg0KKw0KKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpDQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQ0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQiKTsNCisjZW5kaWYNCisNCisgICAgICBwbmdfd3JpdGVfc3RhcnRfcm93KHBuZ19wdHIpOw0KKyAgIH0NCisNCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIC8qIElmIGludGVybGFjZWQgYW5kIG5vdCBpbnRlcmVzdGVkIGluIHJvdywgcmV0dXJuICovDQorICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQ0KKyAgIHsNCisgICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpDQorICAgICAgew0KKyAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOw0KKyAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpIHx8IHBuZ19wdHItPndpZHRoIDwgNSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gNCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMykgfHwgcG5nX3B0ci0+d2lkdGggPCAzKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAzKSAhPSAyKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsNCisgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgIGNhc2UgNToNCisgICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAxKSB8fCBwbmdfcHRyLT53aWR0aCA8IDIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOw0KKyAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgY2FzZSA2Og0KKyAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAxKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICBkZWZhdWx0OiAvKiBlcnJvcjogaWdub3JlIGl0ICovDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgIH0NCisjZW5kaWYNCisNCisgICAvKiBTZXQgdXAgcm93IGluZm8gZm9yIHRyYW5zZm9ybWF0aW9ucyAqLw0KKyAgIHJvd19pbmZvLmNvbG9yX3R5cGUgPSBwbmdfcHRyLT5jb2xvcl90eXBlOw0KKyAgIHJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+dXNyX3dpZHRoOw0KKyAgIHJvd19pbmZvLmNoYW5uZWxzID0gcG5nX3B0ci0+dXNyX2NoYW5uZWxzOw0KKyAgIHJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPnVzcl9iaXRfZGVwdGg7DQorICAgcm93X2luZm8ucGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLmJpdF9kZXB0aCAqIHJvd19pbmZvLmNoYW5uZWxzKTsNCisgICByb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby5waXhlbF9kZXB0aCwgcm93X2luZm8ud2lkdGgpOw0KKw0KKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5jb2xvcl90eXBlID0gJWQiLCByb3dfaW5mby5jb2xvcl90eXBlKTsNCisgICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+d2lkdGggPSAldSIsIHJvd19pbmZvLndpZHRoKTsNCisgICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+Y2hhbm5lbHMgPSAlZCIsIHJvd19pbmZvLmNoYW5uZWxzKTsNCisgICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+Yml0X2RlcHRoID0gJWQiLCByb3dfaW5mby5iaXRfZGVwdGgpOw0KKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5waXhlbF9kZXB0aCA9ICVkIiwgcm93X2luZm8ucGl4ZWxfZGVwdGgpOw0KKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5yb3dieXRlcyA9ICVsdSIsICh1bnNpZ25lZCBsb25nKXJvd19pbmZvLnJvd2J5dGVzKTsNCisNCisgICAvKiBDb3B5IHVzZXIncyByb3cgaW50byBidWZmZXIsIGxlYXZpbmcgcm9vbSBmb3IgZmlsdGVyIGJ5dGUuICovDQorICAgbWVtY3B5KHBuZ19wdHItPnJvd19idWYgKyAxLCByb3csIHJvd19pbmZvLnJvd2J5dGVzKTsNCisNCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIC8qIEhhbmRsZSBpbnRlcmxhY2luZyAqLw0KKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIHBuZ19wdHItPnBhc3MgPCA2ICYmDQorICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkNCisgICB7DQorICAgICAgcG5nX2RvX3dyaXRlX2ludGVybGFjZSgmcm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wYXNzKTsNCisgICAgICAvKiBUaGlzIHNob3VsZCBhbHdheXMgZ2V0IGNhdWdodCBhYm92ZSwgYnV0IHN0aWxsIC4uLiAqLw0KKyAgICAgIGlmICghKHJvd19pbmZvLndpZHRoKSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9UUkFOU0ZPUk1TX1NVUFBPUlRFRA0KKyAgIC8qIEhhbmRsZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgKi8NCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zKQ0KKyAgICAgIHBuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMocG5nX3B0ciwgJnJvd19pbmZvKTsNCisjZW5kaWYNCisNCisgICAvKiBBdCB0aGlzIHBvaW50IHRoZSByb3dfaW5mbyBwaXhlbCBkZXB0aCBtdXN0IG1hdGNoIHRoZSAndHJhbnNmb3JtZWQnIGRlcHRoLA0KKyAgICAqIHdoaWNoIGlzIGFsc28gdGhlIG91dHB1dCBkZXB0aC4NCisgICAgKi8NCisgICBpZiAocm93X2luZm8ucGl4ZWxfZGVwdGggIT0gcG5nX3B0ci0+cGl4ZWxfZGVwdGggfHwNCisgICAgICByb3dfaW5mby5waXhlbF9kZXB0aCAhPSBwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImludGVybmFsIHdyaXRlIHRyYW5zZm9ybSBsb2dpYyBlcnJvciIpOw0KKw0KKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRA0KKyAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmDQorICAgICogMS4gTGlicG5nIHdhcyBjb21waWxlZCB3aXRoIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZA0KKyAgICAqIDIuIExpYnBuZyBkaWQgbm90IHdyaXRlIGEgUE5HIHNpZ25hdHVyZSAodGhpcyBmaWx0ZXJfbWV0aG9kIGlzIG9ubHkNCisgICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZA0KKyAgICAqIDMuIFRoZSBhcHBsaWNhdGlvbiBjYWxsZWQgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgd2l0aCBhIG1hc2sgdGhhdA0KKyAgICAqICAgIGluY2x1ZGVkIFBOR19GTEFHX01OR19GSUxURVJfNjQgYW5kDQorICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kDQorICAgICogNS4gVGhlIGNvbG9yX3R5cGUgaXMgUkdCIG9yIFJHQkENCisgICAgKi8NCisgICBpZiAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAmJg0KKyAgICAgICAocG5nX3B0ci0+ZmlsdGVyX3R5cGUgPT0gUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKSkNCisgICB7DQorICAgICAgLyogSW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgKi8NCisgICAgICBwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCgmcm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisgICB9DQorI2VuZGlmDQorDQorLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLw0KKyNpZmRlZiBQTkdfV1JJVEVfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBwYWxldHRlIGluZGV4ICovDQorICAgaWYgKHJvd19pbmZvLmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJg0KKyAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZV9tYXggPj0gMCkNCisgICAgICBwbmdfZG9fY2hlY2tfcGFsZXR0ZV9pbmRleGVzKHBuZ19wdHIsICZyb3dfaW5mbyk7DQorI2VuZGlmDQorDQorICAgLyogRmluZCBhIGZpbHRlciBpZiBuZWNlc3NhcnksIGZpbHRlciB0aGUgcm93IGFuZCB3cml0ZSBpdCBvdXQuICovDQorICAgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKHBuZ19wdHIsICZyb3dfaW5mbyk7DQorDQorICAgaWYgKHBuZ19wdHItPndyaXRlX3Jvd19mbiAhPSBOVUxMKQ0KKyAgICAgICgqKHBuZ19wdHItPndyaXRlX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOw0KK30NCisNCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRA0KKy8qIFNldCB0aGUgYXV0b21hdGljIGZsdXNoIGludGVydmFsIG9yIDAgdG8gdHVybiBmbHVzaGluZyBvZmYgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfZmx1c2gocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBucm93cykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZsdXNoIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+Zmx1c2hfZGlzdCA9IChucm93cyA8IDAgPyAwIDogbnJvd3MpOw0KK30NCisNCisvKiBGbHVzaCB0aGUgY3VycmVudCBvdXRwdXQgYnVmZmVycyBub3cgKi8NCit2b2lkIFBOR0FQSQ0KK3BuZ193cml0ZV9mbHVzaChwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZmx1c2giKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYWxsIG9mIHRoZSBkYXRhICovDQorICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPj0gcG5nX3B0ci0+bnVtX3Jvd3MpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIHBuZ19jb21wcmVzc19JREFUKHBuZ19wdHIsIE5VTEwsIDAsIFpfU1lOQ19GTFVTSCk7DQorICAgcG5nX3B0ci0+Zmx1c2hfcm93cyA9IDA7DQorICAgcG5nX2ZsdXNoKHBuZ19wdHIpOw0KK30NCisjZW5kaWYgLyogUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KK3N0YXRpYyB2b2lkIHBuZ19yZXNldF9maWx0ZXJfaGV1cmlzdGljcyhwbmdfc3RydWN0cnAgcG5nX3B0cik7LyogZm9yd2FyZCBkZWNsICovDQorI2VuZGlmDQorDQorLyogRnJlZSBhbnkgbWVtb3J5IHVzZWQgaW4gcG5nX3B0ciBzdHJ1Y3Qgd2l0aG91dCBmcmVlaW5nIHRoZSBzdHJ1Y3QgaXRzZWxmLiAqLw0KK3N0YXRpYyB2b2lkDQorcG5nX3dyaXRlX2Rlc3Ryb3kocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2Rlc3Ryb3kiKTsNCisNCisgICAvKiBGcmVlIGFueSBtZW1vcnkgemxpYiB1c2VzICovDQorICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRCkNCisgICAgICBkZWZsYXRlRW5kKCZwbmdfcHRyLT56c3RyZWFtKTsNCisNCisgICAvKiBGcmVlIG91ciBtZW1vcnkuICBwbmdfZnJlZSBjaGVja3MgTlVMTCBmb3IgdXMuICovDQorICAgcG5nX2ZyZWVfYnVmZmVyX2xpc3QocG5nX3B0ciwgJnBuZ19wdHItPnpidWZmZXJfbGlzdCk7DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1Zik7DQorI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEDQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3cpOw0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnN1Yl9yb3cpOw0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnVwX3Jvdyk7DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YXZnX3Jvdyk7DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFldGhfcm93KTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQNCisgICAvKiBVc2UgdGhpcyB0byBzYXZlIGEgbGl0dGxlIGNvZGUgc3BhY2UsIGl0IGRvZXNuJ3QgZnJlZSB0aGUgZmlsdGVyX2Nvc3RzICovDQorICAgcG5nX3Jlc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIpOw0KKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmZpbHRlcl9jb3N0cyk7DQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0cyk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbGlzdCk7DQorI2VuZGlmDQorDQorICAgLyogVGhlIGVycm9yIGhhbmRsaW5nIGFuZCBtZW1vcnkgaGFuZGxpbmcgaW5mb3JtYXRpb24gaXMgbGVmdCBpbnRhY3QgYXQgdGhpcw0KKyAgICAqIHBvaW50OiB0aGUgam1wX2J1ZiBtYXkgc3RpbGwgaGF2ZSB0byBiZSBmcmVlZC4gIFNlZSBwbmdfZGVzdHJveV9wbmdfc3RydWN0DQorICAgICogZm9yIGhvdyB0aGlzIGhhcHBlbnMuDQorICAgICovDQorfQ0KKw0KKy8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSB3cml0ZS4NCisgKiBJbiBsaWJwbmcgMS42LjAgdGhpcyBBUEkgY2hhbmdlZCBxdWlldGx5IHRvIG5vIGxvbmdlciBhY2NlcHQgYSBOVUxMIHZhbHVlIGZvcg0KKyAqICpwbmdfcHRyX3B0ci4gIFByaW9yIHRvIDEuNi4wIGl0IHdvdWxkIGFjY2VwdCBzdWNoIGEgdmFsdWUgYW5kIGl0IHdvdWxkIGZyZWUNCisgKiB0aGUgcGFzc2VkIGluIGluZm9fc3RydWN0cyBidXQgaXQgd291bGQgcXVpZXRseSBmYWlsIHRvIGZyZWUgYW55IG9mIHRoZSBkYXRhDQorICogaW5zaWRlIHRoZW0uICBJbiAxLjYuMCBpdCBxdWlldGx5IGRvZXMgbm90aGluZyAoaXQgaGFzIHRvIGJlIHF1aWV0IGJlY2F1c2UgaXQNCisgKiBoYXMgbm8gcG5nX3B0ci4pDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QiKTsNCisNCisgICBpZiAocG5nX3B0cl9wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSAqcG5nX3B0cl9wdHI7DQorDQorICAgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkgLyogYWRkZWQgaW4gbGlicG5nIDEuNi4wICovDQorICAgICAgew0KKyAgICAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHBuZ19wdHIsIGluZm9fcHRyX3B0cik7DQorDQorICAgICAgICAgKnBuZ19wdHJfcHRyID0gTlVMTDsNCisgICAgICAgICBwbmdfd3JpdGVfZGVzdHJveShwbmdfcHRyKTsNCisgICAgICAgICBwbmdfZGVzdHJveV9wbmdfc3RydWN0KHBuZ19wdHIpOw0KKyAgICAgIH0NCisgICB9DQorfQ0KKw0KKy8qIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWxlY3Qgb25lIG9yIG1vcmUgcm93IGZpbHRlcnMgdG8gdXNlLiAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9maWx0ZXIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZXRob2QsIGludCBmaWx0ZXJzKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZmlsdGVyIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorICAgaWYgKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYNCisgICAgICAgKG1ldGhvZCA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpKQ0KKyAgICAgIG1ldGhvZCA9IFBOR19GSUxURVJfVFlQRV9CQVNFOw0KKw0KKyNlbmRpZg0KKyAgIGlmIChtZXRob2QgPT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpDQorICAgew0KKyAgICAgIHN3aXRjaCAoZmlsdGVycyAmIChQTkdfQUxMX0ZJTFRFUlMgfCAweDA3KSkNCisgICAgICB7DQorI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEDQorICAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICBjYXNlIDc6IHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlVua25vd24gcm93IGZpbHRlciBmb3IgbWV0aG9kIDAiKTsNCisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8NCisjZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8NCisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfTk9ORToNCisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX05PTkU7IGJyZWFrOw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRA0KKyAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9TVUI6DQorICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9TVUI7IGJyZWFrOw0KKw0KKyAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9VUDoNCisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX1VQOyBicmVhazsNCisNCisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfQVZHOg0KKyAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfQVZHOyBicmVhazsNCisNCisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfUEFFVEg6DQorICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9QQUVUSDsgYnJlYWs7DQorDQorICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSAocG5nX2J5dGUpZmlsdGVyczsgYnJlYWs7DQorI2Vsc2UNCisgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHBuZ19hcHBfZXJyb3IocG5nX3B0ciwgIlVua25vd24gcm93IGZpbHRlciBmb3IgbWV0aG9kIDAiKTsNCisjZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8NCisgICAgICB9DQorDQorICAgICAgLyogSWYgd2UgaGF2ZSBhbGxvY2F0ZWQgdGhlIHJvd19idWYsIHRoaXMgbWVhbnMgd2UgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQNCisgICAgICAgKiB3aXRoIHRoZSBpbWFnZSBhbmQgd2Ugc2hvdWxkIGhhdmUgYWxsb2NhdGVkIGFsbCBvZiB0aGUgZmlsdGVyIGJ1ZmZlcnMNCisgICAgICAgKiB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZC4gIElmIHByZXZfcm93IGlzbid0IGFscmVhZHkgYWxsb2NhdGVkLCB0aGVuDQorICAgICAgICogaXQgaXMgdG9vIGxhdGUgdG8gc3RhcnQgdXNpbmcgdGhlIGZpbHRlcnMgdGhhdCBuZWVkIGl0LCBzaW5jZSB3ZQ0KKyAgICAgICAqIHdpbGwgYmUgbWlzc2luZyB0aGUgZGF0YSBpbiB0aGUgcHJldmlvdXMgcm93LiAgSWYgYW4gYXBwbGljYXRpb24NCisgICAgICAgKiB3YW50cyB0byBzdGFydCBhbmQgc3RvcCB1c2luZyBwYXJ0aWN1bGFyIGZpbHRlcnMgZHVyaW5nIGNvbXByZXNzaW9uLA0KKyAgICAgICAqIGl0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMsIGFuZCB0aGVuIGFkZCBhbmQNCisgICAgICAgKiByZW1vdmUgdGhlbSBhZnRlciB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24uDQorICAgICAgICovDQorICAgICAgaWYgKHBuZ19wdHItPnJvd19idWYgIT0gTlVMTCkNCisgICAgICB7DQorI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEDQorICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1NVQikgJiYgcG5nX3B0ci0+c3ViX3JvdyA9PSBOVUxMKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5zdWJfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsDQorICAgICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsNCisgICAgICAgICAgICBwbmdfcHRyLT5zdWJfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9TVUI7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9VUCkgJiYgcG5nX3B0ci0+dXBfcm93ID09IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyA9PSBOVUxMKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2FuJ3QgYWRkIFVwIGZpbHRlciBhZnRlciBzdGFydGluZyIpOw0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IChwbmdfYnl0ZSkocG5nX3B0ci0+ZG9fZmlsdGVyICYNCisgICAgICAgICAgICAgICAgICAgflBOR19GSUxURVJfVVApOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPnVwX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+dXBfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9VUDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9BVkcpICYmIHBuZ19wdHItPmF2Z19yb3cgPT0gTlVMTCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ID09IE5VTEwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCBhZGQgQXZlcmFnZSBmaWx0ZXIgYWZ0ZXIgc3RhcnRpbmciKTsNCisgICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSAocG5nX2J5dGUpKHBuZ19wdHItPmRvX2ZpbHRlciAmDQorICAgICAgICAgICAgICAgICAgIH5QTkdfRklMVEVSX0FWRyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+YXZnX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+YXZnX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfQVZHOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1BBRVRIKSAmJg0KKyAgICAgICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3cgPT0gTlVMTCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ID09IE5VTEwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCBhZGQgUGFldGggZmlsdGVyIGFmdGVyIHN0YXJ0aW5nIik7DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyICY9IChwbmdfYnl0ZSkoflBOR19GSUxURVJfUEFFVEgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPnBhZXRoX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgPT0gUE5HX05PX0ZJTFRFUlMpDQorI2VuZGlmIC8qIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEICovDQorICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9OT05FOw0KKyAgICAgIH0NCisgICB9DQorICAgZWxzZQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5rbm93biBjdXN0b20gZmlsdGVyIG1ldGhvZCIpOw0KK30NCisNCisvKiBUaGlzIGFsbG93cyB1cyB0byBpbmZsdWVuY2UgdGhlIHdheSBpbiB3aGljaCBsaWJwbmcgY2hvb3NlcyB0aGUgImJlc3QiDQorICogZmlsdGVyIGZvciB0aGUgY3VycmVudCBzY2FubGluZS4gIFdoaWxlIHRoZSAibWluaW11bS1zdW0tb2YtYWJzb2x1dGUtDQorICogZGlmZmVyZW5jZXMgbWV0cmljIGlzIHJlbGF0aXZlbHkgZmFzdCBhbmQgZWZmZWN0aXZlLCB0aGVyZSBpcyBzb21lDQorICogcXVlc3Rpb24gYXMgdG8gd2hldGhlciBpdCBjYW4gYmUgaW1wcm92ZWQgdXBvbiBieSB0cnlpbmcgdG8ga2VlcCB0aGUNCisgKiBmaWx0ZXJlZCBkYXRhIGdvaW5nIHRvIHpsaWIgbW9yZSBjb25zaXN0ZW50LCBob3BlZnVsbHkgcmVzdWx0aW5nIGluDQorICogYmV0dGVyIGNvbXByZXNzaW9uLg0KKyAqLw0KKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCAgICAgIC8qIEdSUiA5NzAxMTYgKi8NCisvKiBDb252ZW5pZW5jZSByZXNldCBBUEkuICovDQorc3RhdGljIHZvaWQNCitwbmdfcmVzZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIENsZWFyIG91dCBhbnkgb2xkIHZhbHVlcyBpbiB0aGUgJ3dlaWdodHMnIC0gdGhpcyBtdXN0IGJlIGRvbmUgYmVjYXVzZSBpZg0KKyAgICAqIHRoZSBhcHAgY2FsbHMgc2V0X2ZpbHRlcl9oZXVyaXN0aWNzIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50DQorICAgICogJ251bV93ZWlnaHRzJyB2YWx1ZXMgd2Ugd291bGQgb3RoZXJ3aXNlIHBvdGVudGlhbGx5IGhhdmUgd3Jvbmcgc2l6ZWQNCisgICAgKiBhcnJheXMuDQorICAgICovDQorICAgcG5nX3B0ci0+bnVtX3ByZXZfZmlsdGVycyA9IDA7DQorICAgcG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9IFBOR19GSUxURVJfSEVVUklTVElDX1VOV0VJR0hURUQ7DQorICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVycyAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgb2xkID0gcG5nX3B0ci0+cHJldl9maWx0ZXJzOw0KKyAgICAgIHBuZ19wdHItPnByZXZfZmlsdGVycyA9IE5VTEw7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkKTsNCisgICB9DQorICAgaWYgKHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzICE9IE5VTEwpDQorICAgew0KKyAgICAgIHBuZ191aW50XzE2cCBvbGQgPSBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0czsNCisgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0cyA9IE5VTEw7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkKTsNCisgICB9DQorDQorICAgaWYgKHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0cyAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfdWludF8xNnAgb2xkID0gcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzOw0KKyAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0cyA9IE5VTEw7DQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkKTsNCisgICB9DQorDQorICAgLyogTGVhdmUgdGhlIGZpbHRlcl9jb3N0cyAtIHRoaXMgYXJyYXkgaXMgZml4ZWQgc2l6ZS4gKi8NCit9DQorDQorc3RhdGljIGludA0KK3BuZ19pbml0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgaGV1cmlzdGljX21ldGhvZCwNCisgICBpbnQgbnVtX3dlaWdodHMpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuIDA7DQorDQorICAgLyogQ2xlYXIgb3V0IHRoZSBhcnJheXMgKi8NCisgICBwbmdfcmVzZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3B0cik7DQorDQorICAgLyogQ2hlY2sgYXJndW1lbnRzOyB0aGUgJ3Jlc2V0JyBmdW5jdGlvbiBtYWtlcyB0aGUgY29ycmVjdCBzZXR0aW5ncyBmb3IgdGhlDQorICAgICogdW53ZWlnaHRlZCBjYXNlLCBidXQgd2UgbXVzdCBoYW5kbGUgdGhlIHdlaWdodCBjYXNlIGJ5IGluaXRpYWxpemluZyB0aGUNCisgICAgKiBhcnJheXMgZm9yIHRoZSBjYWxsZXIuDQorICAgICovDQorICAgaWYgKGhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpDQorICAgew0KKyAgICAgIGludCBpOw0KKw0KKyAgICAgIGlmIChudW1fd2VpZ2h0cyA+IDApDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPnByZXZfZmlsdGVycyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKChzaXplb2YgKHBuZ19ieXRlKSkgKiBudW1fd2VpZ2h0cykpOw0KKw0KKyAgICAgICAgIC8qIFRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB3ZWlnaHRpbmcgc3RhcnRzIG91dCBmYWlybHkgKi8NCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzW2ldID0gMjU1Ow0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKChzaXplb2YgKHBuZ191aW50XzE2KSkgKiBudW1fd2VpZ2h0cykpOw0KKw0KKyAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKChzaXplb2YgKHBuZ191aW50XzE2KSkgKiBudW1fd2VpZ2h0cykpOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fd2VpZ2h0czsgaSsrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbaV0gPQ0KKyAgICAgICAgICAgIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2ldID0gUE5HX1dFSUdIVF9GQUNUT1I7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIC8qIFNhZmUgdG8gc2V0IHRoaXMgbm93ICovDQorICAgICAgICAgcG5nX3B0ci0+bnVtX3ByZXZfZmlsdGVycyA9IChwbmdfYnl0ZSludW1fd2VpZ2h0czsNCisgICAgICB9DQorDQorICAgICAgLyogSWYsIGluIHRoZSBmdXR1cmUsIHRoZXJlIGFyZSBvdGhlciBmaWx0ZXIgbWV0aG9kcywgdGhpcyB3b3VsZA0KKyAgICAgICAqIG5lZWQgdG8gYmUgYmFzZWQgb24gcG5nX3B0ci0+ZmlsdGVyLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChwbmdfcHRyLT5maWx0ZXJfY29zdHMgPT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsDQorICAgICAgICAgICAgIChwbmdfdWludF8zMikoKHNpemVvZiAocG5nX3VpbnRfMTYpKSAqIFBOR19GSUxURVJfVkFMVUVfTEFTVCkpOw0KKw0KKyAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHMgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgICAgKHBuZ191aW50XzMyKSgoc2l6ZW9mIChwbmdfdWludF8xNikpICogUE5HX0ZJTFRFUl9WQUxVRV9MQVNUKSk7DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBQTkdfRklMVEVSX1ZBTFVFX0xBU1Q7IGkrKykNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tpXSA9DQorICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW2ldID0gUE5HX0NPU1RfRkFDVE9SOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBBbGwgdGhlIGFycmF5cyBhcmUgaW5pdGVkLCBzYWZlIHRvIHNldCB0aGlzOiAqLw0KKyAgICAgIHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRDsNCisNCisgICAgICAvKiBSZXR1cm4gdGhlICdvaycgY29kZS4gKi8NCisgICAgICByZXR1cm4gMTsNCisgICB9DQorICAgZWxzZSBpZiAoaGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19ERUZBVUxUIHx8DQorICAgICAgaGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19VTldFSUdIVEVEKQ0KKyAgIHsNCisgICAgICByZXR1cm4gMTsNCisgICB9DQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBmaWx0ZXIgaGV1cmlzdGljIG1ldGhvZCIpOw0KKyAgICAgIHJldHVybiAwOw0KKyAgIH0NCit9DQorDQorLyogUHJvdmlkZSBmbG9hdGluZyBhbmQgZml4ZWQgcG9pbnQgQVBJcyAqLw0KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgaGV1cmlzdGljX21ldGhvZCwNCisgICAgaW50IG51bV93ZWlnaHRzLCBwbmdfY29uc3RfZG91YmxlcCBmaWx0ZXJfd2VpZ2h0cywNCisgICAgcG5nX2NvbnN0X2RvdWJsZXAgZmlsdGVyX2Nvc3RzKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MiKTsNCisNCisgICAvKiBUaGUgaW50ZXJuYWwgQVBJIGFsbG9jYXRlcyBhbGwgdGhlIGFycmF5cyBhbmQgZW5zdXJlcyB0aGF0IHRoZSBlbGVtZW50cyBvZg0KKyAgICAqIHRob3NlIGFycmF5cyBhcmUgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlLg0KKyAgICAqLw0KKyAgIGlmICghcG5nX2luaXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3B0ciwgaGV1cmlzdGljX21ldGhvZCwgbnVtX3dlaWdodHMpKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAvKiBJZiB1c2luZyB0aGUgd2VpZ2h0ZWQgbWV0aG9kIGNvcHkgaW4gdGhlIHdlaWdodHMuICovDQorICAgaWYgKGhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpDQorICAgew0KKyAgICAgIGludCBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fd2VpZ2h0czsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoZmlsdGVyX3dlaWdodHNbaV0gPD0gMC4wKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbaV0gPQ0KKyAgICAgICAgICAgIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2ldID0gUE5HX1dFSUdIVF9GQUNUT1I7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2ldID0NCisgICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KShQTkdfV0VJR0hUX0ZBQ1RPUipmaWx0ZXJfd2VpZ2h0c1tpXSsuNSk7DQorDQorICAgICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbaV0gPQ0KKyAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKFBOR19XRUlHSFRfRkFDVE9SL2ZpbHRlcl93ZWlnaHRzW2ldKy41KTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIEhlcmUgaXMgd2hlcmUgd2Ugc2V0IHRoZSByZWxhdGl2ZSBjb3N0cyBvZiB0aGUgZGlmZmVyZW50IGZpbHRlcnMuICBXZQ0KKyAgICAgICAqIHNob3VsZCB0YWtlIHRoZSBkZXNpcmVkIGNvbXByZXNzaW9uIGxldmVsIGludG8gYWNjb3VudCB3aGVuIHNldHRpbmcNCisgICAgICAgKiB0aGUgY29zdHMsIHNvIHRoYXQgUGFldGgsIGZvciBpbnN0YW5jZSwgaGFzIGEgaGlnaCByZWxhdGl2ZSBjb3N0IGF0IGxvdw0KKyAgICAgICAqIGNvbXByZXNzaW9uIGxldmVscywgd2hpbGUgaXQgaGFzIGEgbG93ZXIgcmVsYXRpdmUgY29zdCBhdCBoaWdoZXINCisgICAgICAgKiBjb21wcmVzc2lvbiBzZXR0aW5ncy4gIFRoZSBmaWx0ZXIgdHlwZXMgYXJlIGluIG9yZGVyIG9mIGluY3JlYXNpbmcNCisgICAgICAgKiByZWxhdGl2ZSBjb3N0LCBzbyBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzIHdpdGggYW4gYWxnb3JpdGhtLg0KKyAgICAgICAqLw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBQTkdfRklMVEVSX1ZBTFVFX0xBU1Q7IGkrKykgaWYgKGZpbHRlcl9jb3N0c1tpXSA+PSAxLjApDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbaV0gPQ0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKFBOR19DT1NUX0ZBQ1RPUiAvIGZpbHRlcl9jb3N0c1tpXSArIC41KTsNCisNCisgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHNbaV0gPQ0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKFBOR19DT1NUX0ZBQ1RPUiAqIGZpbHRlcl9jb3N0c1tpXSArIC41KTsNCisgICAgICB9DQorICAgfQ0KK30NCisjZW5kaWYgLyogRkxPQVRJTkdfUE9JTlQgKi8NCisNCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljc19maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGhldXJpc3RpY19tZXRob2QsDQorICAgIGludCBudW1fd2VpZ2h0cywgcG5nX2NvbnN0X2ZpeGVkX3BvaW50X3AgZmlsdGVyX3dlaWdodHMsDQorICAgIHBuZ19jb25zdF9maXhlZF9wb2ludF9wIGZpbHRlcl9jb3N0cykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzX2ZpeGVkIik7DQorDQorICAgLyogVGhlIGludGVybmFsIEFQSSBhbGxvY2F0ZXMgYWxsIHRoZSBhcnJheXMgYW5kIGVuc3VyZXMgdGhhdCB0aGUgZWxlbWVudHMgb2YNCisgICAgKiB0aG9zZSBhcnJheXMgYXJlIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZS4NCisgICAgKi8NCisgICBpZiAoIXBuZ19pbml0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIsIGhldXJpc3RpY19tZXRob2QsIG51bV93ZWlnaHRzKSkNCisgICAgICByZXR1cm47DQorDQorICAgLyogSWYgdXNpbmcgdGhlIHdlaWdodGVkIG1ldGhvZCBjb3B5IGluIHRoZSB3ZWlnaHRzLiAqLw0KKyAgIGlmIChoZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQ0KKyAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykNCisgICAgICB7DQorICAgICAgICAgaWYgKGZpbHRlcl93ZWlnaHRzW2ldIDw9IDApDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tpXSA9DQorICAgICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbaV0gPSBQTkdfV0VJR0hUX0ZBQ1RPUjsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbaV0gPSAocG5nX3VpbnRfMTYpDQorICAgICAgICAgICAgICAgKChQTkdfV0VJR0hUX0ZBQ1RPUipmaWx0ZXJfd2VpZ2h0c1tpXStQTkdfRlBfSEFMRikvUE5HX0ZQXzEpOw0KKw0KKyAgICAgICAgICAgIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2ldID0gKHBuZ191aW50XzE2KSgoUE5HX1dFSUdIVF9GQUNUT1IqDQorICAgICAgICAgICAgICAgUE5HX0ZQXzErKGZpbHRlcl93ZWlnaHRzW2ldLzIpKS9maWx0ZXJfd2VpZ2h0c1tpXSk7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICAvKiBIZXJlIGlzIHdoZXJlIHdlIHNldCB0aGUgcmVsYXRpdmUgY29zdHMgb2YgdGhlIGRpZmZlcmVudCBmaWx0ZXJzLiAgV2UNCisgICAgICAgKiBzaG91bGQgdGFrZSB0aGUgZGVzaXJlZCBjb21wcmVzc2lvbiBsZXZlbCBpbnRvIGFjY291bnQgd2hlbiBzZXR0aW5nDQorICAgICAgICogdGhlIGNvc3RzLCBzbyB0aGF0IFBhZXRoLCBmb3IgaW5zdGFuY2UsIGhhcyBhIGhpZ2ggcmVsYXRpdmUgY29zdCBhdCBsb3cNCisgICAgICAgKiBjb21wcmVzc2lvbiBsZXZlbHMsIHdoaWxlIGl0IGhhcyBhIGxvd2VyIHJlbGF0aXZlIGNvc3QgYXQgaGlnaGVyDQorICAgICAgICogY29tcHJlc3Npb24gc2V0dGluZ3MuICBUaGUgZmlsdGVyIHR5cGVzIGFyZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nDQorICAgICAgICogcmVsYXRpdmUgY29zdCwgc28gaXQgd291bGQgYmUgcG9zc2libGUgdG8gZG8gdGhpcyB3aXRoIGFuIGFsZ29yaXRobS4NCisgICAgICAgKi8NCisgICAgICBmb3IgKGkgPSAwOyBpIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUOyBpKyspDQorICAgICAgICAgaWYgKGZpbHRlcl9jb3N0c1tpXSA+PSBQTkdfRlBfMSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3VpbnRfMzIgdG1wOw0KKw0KKyAgICAgICAgIC8qIFVzZSBhIDMyIGJpdCB1bnNpZ25lZCB0ZW1wb3JhcnkgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSB0aGUNCisgICAgICAgICAgKiBpbnRlcm1lZGlhdGUgdmFsdWUgd2lsbCBiZSBhIDMyIGJpdCAqc2lnbmVkKiBpbnRlZ2VyIChBTlNJIHJ1bGVzKQ0KKyAgICAgICAgICAqIGFuZCB0aGlzIHdpbGwgZ2V0IHRoZSB3cm9uZyBhbnN3ZXIgb24gZGl2aXNpb24uDQorICAgICAgICAgICovDQorICAgICAgICAgdG1wID0gUE5HX0NPU1RfRkFDVE9SKlBOR19GUF8xICsgKGZpbHRlcl9jb3N0c1tpXS8yKTsNCisgICAgICAgICB0bXAgLz0gZmlsdGVyX2Nvc3RzW2ldOw0KKw0KKyAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbaV0gPSAocG5nX3VpbnRfMTYpdG1wOw0KKw0KKyAgICAgICAgIHRtcCA9IFBOR19DT1NUX0ZBQ1RPUiAqIGZpbHRlcl9jb3N0c1tpXSArIFBOR19GUF9IQUxGOw0KKyAgICAgICAgIHRtcCAvPSBQTkdfRlBfMTsNCisNCisgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHNbaV0gPSAocG5nX3VpbnRfMTYpdG1wOw0KKyAgICAgIH0NCisgICB9DQorfQ0KKyNlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLw0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCAqLw0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGxldmVsKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT56bGliX2xldmVsID0gbGV2ZWw7DQorfQ0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZW1fbGV2ZWwpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT56bGliX21lbV9sZXZlbCA9IG1lbV9sZXZlbDsNCit9DQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgc3RyYXRlZ3kpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIFRoZSBmbGFnIHNldHRpbmcgaGVyZSBwcmV2ZW50cyB0aGUgbGlicG5nIGR5bmFtaWMgc2VsZWN0aW9uIG9mIHN0cmF0ZWd5Lg0KKyAgICAqLw0KKyAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZOw0KKyAgIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kgPSBzdHJhdGVneTsNCit9DQorDQorLyogSWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQgaXMgZGVmaW5lZCwgbGlicG5nIHdpbGwgdXNlIGENCisgKiBzbWFsbGVyIHZhbHVlIG9mIHdpbmRvd19iaXRzIGlmIGl0IGNhbiBkbyBzbyBzYWZlbHkuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgd2luZG93X2JpdHMpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIFByaW9yIHRvIDEuNi4wIHRoaXMgd291bGQgd2FybiBidXQgdGhlbiBzZXQgdGhlIHdpbmRvd19iaXRzIHZhbHVlLCB0aGlzDQorICAgICogbWVhbnQgdGhhdCBuZWdhdGl2ZSB3aW5kb3cgYml0cyB2YWx1ZXMgY291bGQgYmUgc2VsZWN0ZWQgd2hpY2ggd291bGQgY2F1c2UNCisgICAgKiBsaWJwbmcgdG8gd3JpdGUgYSBub24tc3RhbmRhcmQgUE5HIGZpbGUgd2l0aCByYXcgZGVmbGF0ZSBvciBnemlwDQorICAgICogY29tcHJlc3NlZCBJREFUIG9yIGFuY2lsbGFyeSBjaHVua3MuICBTdWNoIGZpbGVzIGNhbiBiZSByZWFkIGFuZCB0aGVyZSBpcw0KKyAgICAqIG5vIHdhcm5pbmcgb24gcmVhZCwgc28gdGhpcyBzZWVtcyBsaWtlIGEgdmVyeSBiYWQgaWRlYS4NCisgICAgKi8NCisgICBpZiAod2luZG93X2JpdHMgPiAxNSkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA8PSAzMmsgc3VwcG9ydGVkIGJ5IFBORyIpOw0KKyAgICAgIHdpbmRvd19iaXRzID0gMTU7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKHdpbmRvd19iaXRzIDwgOCkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA+PSAyNTYgc3VwcG9ydGVkIGJ5IFBORyIpOw0KKyAgICAgIHdpbmRvd19iaXRzID0gODsNCisgICB9DQorDQorICAgcG5nX3B0ci0+emxpYl93aW5kb3dfYml0cyA9IHdpbmRvd19iaXRzOw0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbWV0aG9kKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgLyogVGhpcyB3b3VsZCBwcm9kdWNlIGFuIGludmFsaWQgUE5HIGZpbGUgaWYgaXQgd29ya2VkLCBidXQgaXQgZG9lc24ndCBhbmQNCisgICAgKiBkZWZsYXRlIHdpbGwgZmF1bHQgaXQsIHNvIGl0IGlzIGhhcm1sZXNzIHRvIGp1c3Qgd2FybiBoZXJlLg0KKyAgICAqLw0KKyAgIGlmIChtZXRob2QgIT0gOCkNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiBtZXRob2QgOCBpcyBzdXBwb3J0ZWQgYnkgUE5HIik7DQorDQorICAgcG5nX3B0ci0+emxpYl9tZXRob2QgPSBtZXRob2Q7DQorfQ0KKw0KKy8qIFRoZSBmb2xsb3dpbmcgd2VyZSBhZGRlZCB0byBsaWJwbmctMS41LjQgKi8NCisjaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbGV2ZWwpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+emxpYl90ZXh0X2xldmVsID0gbGV2ZWw7DQorfQ0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG1lbV9sZXZlbCkNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+emxpYl90ZXh0X21lbV9sZXZlbCA9IG1lbV9sZXZlbDsNCit9DQorDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBzdHJhdGVneSkNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kiKTsNCisNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBwbmdfcHRyLT56bGliX3RleHRfc3RyYXRlZ3kgPSBzdHJhdGVneTsNCit9DQorDQorLyogSWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQgaXMgZGVmaW5lZCwgbGlicG5nIHdpbGwgdXNlIGENCisgKiBzbWFsbGVyIHZhbHVlIG9mIHdpbmRvd19iaXRzIGlmIGl0IGNhbiBkbyBzbyBzYWZlbHkuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCB3aW5kb3dfYml0cykNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgaWYgKHdpbmRvd19iaXRzID4gMTUpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPbmx5IGNvbXByZXNzaW9uIHdpbmRvd3MgPD0gMzJrIHN1cHBvcnRlZCBieSBQTkciKTsNCisgICAgICB3aW5kb3dfYml0cyA9IDE1Ow0KKyAgIH0NCisNCisgICBlbHNlIGlmICh3aW5kb3dfYml0cyA8IDgpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPbmx5IGNvbXByZXNzaW9uIHdpbmRvd3MgPj0gMjU2IHN1cHBvcnRlZCBieSBQTkciKTsNCisgICAgICB3aW5kb3dfYml0cyA9IDg7DQorICAgfQ0KKw0KKyAgIHBuZ19wdHItPnpsaWJfdGV4dF93aW5kb3dfYml0cyA9IHdpbmRvd19iaXRzOw0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBtZXRob2QpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZCIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIGlmIChtZXRob2QgIT0gOCkNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiBtZXRob2QgOCBpcyBzdXBwb3J0ZWQgYnkgUE5HIik7DQorDQorICAgcG5nX3B0ci0+emxpYl90ZXh0X21ldGhvZCA9IG1ldGhvZDsNCit9DQorI2VuZGlmIC8qIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQgKi8NCisvKiBlbmQgb2YgQVBJIGFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLw0KKw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF93cml0ZV9zdGF0dXNfZm4ocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ193cml0ZV9zdGF0dXNfcHRyIHdyaXRlX3Jvd19mbikNCit7DQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+d3JpdGVfcm93X2ZuID0gd3JpdGVfcm93X2ZuOw0KK30NCisNCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRA0KK3ZvaWQgUE5HQVBJDQorcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0cg0KKyAgICB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbikNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuIik7DQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19VU0VSX1RSQU5TRk9STTsNCisgICBwbmdfcHRyLT53cml0ZV91c2VyX3RyYW5zZm9ybV9mbiA9IHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuOw0KK30NCisjZW5kaWYNCisNCisNCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEDQordm9pZCBQTkdBUEkNCitwbmdfd3JpdGVfcG5nKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW5mb3JwIGluZm9fcHRyLA0KKyAgICBpbnQgdHJhbnNmb3Jtcywgdm9pZHAgcGFyYW1zKQ0KK3sNCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIFdyaXRlIHRoZSBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbi4gKi8NCisgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorDQorICAgLyogLS0tLS0tIHRoZXNlIHRyYW5zZm9ybWF0aW9ucyBkb24ndCB0b3VjaCB0aGUgaW5mbyBzdHJ1Y3R1cmUgLS0tLS0tLSAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRA0KKyAgIC8qIEludmVydCBtb25vY2hyb21lIHBpeGVscyAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTykNCisgICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEDQorICAgLyogU2hpZnQgdGhlIHBpeGVscyB1cCB0byBhIGxlZ2FsIGJpdCBkZXB0aCBhbmQgZmlsbCBpbg0KKyAgICAqIGFzIGFwcHJvcHJpYXRlIHRvIGNvcnJlY3RseSBzY2FsZSB0aGUgaW1hZ2UuDQorICAgICovDQorICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TSElGVCkNCisgICAgICAgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NCSVQpKQ0KKyAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJmluZm9fcHRyLT5zaWdfYml0KTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEDQorICAgLyogUGFjayBwaXhlbHMgaW50byBieXRlcyAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLSU5HKQ0KKyAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRA0KKyAgIC8qIFN3YXAgbG9jYXRpb24gb2YgYWxwaGEgYnl0ZXMgZnJvbSBBUkdCIHRvIFJHQkEgKi8NCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSkNCisgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEDQorICAgLyogUGFjayBYUkdCL1JHQlgvQVJHQi9SR0JBIGludG8gUkdCICg0IGNoYW5uZWxzIC0+IDMgY2hhbm5lbHMpICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUikNCisgICAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0FGVEVSKTsNCisNCisgICBlbHNlIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFKQ0KKyAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQkVGT1JFKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQNCisgICAvKiBGbGlwIEJHUiBwaXhlbHMgdG8gUkdCICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0JHUikNCisgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEDQorICAgLyogU3dhcCBieXRlcyBvZiAxNi1iaXQgZmlsZXMgdG8gbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOKQ0KKyAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRA0KKyAgIC8qIFN3YXAgYml0cyBvZiAxLCAyLCA0IGJpdCBwYWNrZWQgcGl4ZWwgZm9ybWF0cyAqLw0KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCkNCisgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRA0KKyAgIC8qIEludmVydCB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIG9wYWNpdHkgdG8gdHJhbnNwYXJlbmN5ICovDQorICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSkNCisgICAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsNCisjZW5kaWYNCisNCisgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgb2YgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisgICAvKiBXcml0ZSB0aGUgYml0cyAqLw0KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19JREFUKQ0KKyAgICAgICBwbmdfd3JpdGVfaW1hZ2UocG5nX3B0ciwgaW5mb19wdHItPnJvd19wb2ludGVycyk7DQorDQorICAgLyogSXQgaXMgUkVRVUlSRUQgdG8gY2FsbCB0aGlzIHRvIGZpbmlzaCB3cml0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWxlICovDQorICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7DQorDQorICAgUE5HX1VOVVNFRCh0cmFuc2Zvcm1zKSAgIC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzICovDQorICAgUE5HX1VOVVNFRChwYXJhbXMpDQorfQ0KKyNlbmRpZg0KKw0KKw0KKyNpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQNCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRCAvKiBjdXJyZW50bHkgcmVxdWlyZWQgZm9yIHBuZ19pbWFnZV93cml0ZV8qICovDQorLyogSW5pdGlhbGl6ZSB0aGUgd3JpdGUgc3RydWN0dXJlIC0gZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdHkuICovDQorc3RhdGljIGludA0KK3BuZ19pbWFnZV93cml0ZV9pbml0KHBuZ19pbWFnZXAgaW1hZ2UpDQorew0KKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIGltYWdlLA0KKyAgICAgICAgICBwbmdfc2FmZV9lcnJvciwgcG5nX3NhZmVfd2FybmluZyk7DQorDQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkNCisgICB7DQorICAgICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsNCisNCisgICAgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NvbnRyb2xwIGNvbnRyb2wgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnRyb2xwLA0KKyAgICAgICAgICAgIHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCAoc2l6ZW9mICpjb250cm9sKSkpOw0KKw0KKyAgICAgICAgIGlmIChjb250cm9sICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIG1lbXNldChjb250cm9sLCAwLCAoc2l6ZW9mICpjb250cm9sKSk7DQorDQorICAgICAgICAgICAgY29udHJvbC0+cG5nX3B0ciA9IHBuZ19wdHI7DQorICAgICAgICAgICAgY29udHJvbC0+aW5mb19wdHIgPSBpbmZvX3B0cjsNCisgICAgICAgICAgICBjb250cm9sLT5mb3Jfd3JpdGUgPSAxOw0KKw0KKyAgICAgICAgICAgIGltYWdlLT5vcGFxdWUgPSBjb250cm9sOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBFcnJvciBjbGVhbiB1cCAqLw0KKyAgICAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHBuZ19wdHIsICZpbmZvX3B0cik7DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCk7DQorICAgfQ0KKw0KKyAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsICJwbmdfaW1hZ2Vfd3JpdGVfOiBvdXQgb2YgbWVtb3J5Iik7DQorfQ0KKw0KKy8qIEFyZ3VtZW50cyB0byBwbmdfaW1hZ2Vfd3JpdGVfbWFpbjogKi8NCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAvKiBBcmd1bWVudHM6ICovDQorICAgcG5nX2ltYWdlcCAgICAgIGltYWdlOw0KKyAgIHBuZ19jb25zdF92b2lkcCBidWZmZXI7DQorICAgcG5nX2ludF8zMiAgICAgIHJvd19zdHJpZGU7DQorICAgcG5nX2NvbnN0X3ZvaWRwIGNvbG9ybWFwOw0KKyAgIGludCAgICAgICAgICAgICBjb252ZXJ0X3RvXzhiaXQ7DQorICAgLyogTG9jYWwgdmFyaWFibGVzOiAqLw0KKyAgIHBuZ19jb25zdF92b2lkcCBmaXJzdF9yb3c7DQorICAgcHRyZGlmZl90ICAgICAgIHJvd19ieXRlczsNCisgICBwbmdfdm9pZHAgICAgICAgbG9jYWxfcm93Ow0KK30gcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2w7DQorDQorLyogV3JpdGUgcG5nX3VpbnRfMTYgaW5wdXQgdG8gYSAxNi1iaXQgUE5HOyB0aGUgcG5nX3B0ciBoYXMgYWxyZWFkeSBiZWVuIHNldCB0bw0KKyAqIGRvIGFueSBuZWNlc3NhcnkgYnl0ZSBzd2FwcGluZy4gIFRoZSBjb21wb25lbnQgb3JkZXIgaXMgZGVmaW5lZCBieSB0aGUNCisgKiBwbmdfaW1hZ2UgZm9ybWF0IHZhbHVlLg0KKyAqLw0KK3N0YXRpYyBpbnQNCitwbmdfd3JpdGVfaW1hZ2VfMTZiaXQocG5nX3ZvaWRwIGFyZ3VtZW50KQ0KK3sNCisgICBwbmdfaW1hZ2Vfd3JpdGVfY29udHJvbCAqZGlzcGxheSA9IHBuZ192b2lkY2FzdChwbmdfaW1hZ2Vfd3JpdGVfY29udHJvbCosDQorICAgICAgYXJndW1lbnQpOw0KKyAgIHBuZ19pbWFnZXAgaW1hZ2UgPSBkaXNwbGF5LT5pbWFnZTsNCisgICBwbmdfc3RydWN0cnAgcG5nX3B0ciA9IGltYWdlLT5vcGFxdWUtPnBuZ19wdHI7DQorDQorICAgcG5nX2NvbnN0X3VpbnRfMTZwIGlucHV0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfdWludF8xNnAsDQorICAgICAgZGlzcGxheS0+Zmlyc3Rfcm93KTsNCisgICBwbmdfdWludF8xNnAgb3V0cHV0X3JvdyA9IHBuZ192b2lkY2FzdChwbmdfdWludF8xNnAsIGRpc3BsYXktPmxvY2FsX3Jvdyk7DQorICAgcG5nX3VpbnRfMTZwIHJvd19lbmQ7DQorICAgY29uc3QgaW50IGNoYW5uZWxzID0gKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpID8gMyA6IDE7DQorICAgaW50IGFpbmRleCA9IDA7DQorICAgcG5nX3VpbnRfMzIgeSA9IGltYWdlLT5oZWlnaHQ7DQorDQorICAgaWYgKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpDQorICAgew0KKyAgICAgIGlmIChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkNCisgICAgICB7DQorICAgICAgICAgYWluZGV4ID0gLTE7DQorICAgICAgICAgKytpbnB1dF9yb3c7IC8qIFRvIHBvaW50IHRvIHRoZSBmaXJzdCBjb21wb25lbnQgKi8NCisgICAgICAgICArK291dHB1dF9yb3c7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBhaW5kZXggPSBjaGFubmVsczsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX3dyaXRlX2ltYWdlOiBpbnRlcm5hbCBjYWxsIGVycm9yIik7DQorDQorICAgLyogV29yayBvdXQgdGhlIG91dHB1dCByb3cgZW5kIGFuZCBjb3VudCBvdmVyIHRoaXMsIG5vdGUgdGhhdCB0aGUgaW5jcmVtZW50DQorICAgICogYWJvdmUgdG8gJ3JvdycgbWVhbnMgdGhhdCByb3dfZW5kIGNhbiBhY3R1YWxseSBiZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUNCisgICAgKiByb3c7IHRoaXMgaXMgY29ycmVjdC4NCisgICAgKi8NCisgICByb3dfZW5kID0gb3V0cHV0X3JvdyArIGltYWdlLT53aWR0aCAqIChjaGFubmVscysxKTsNCisNCisgICB3aGlsZSAoeS0tID4gMCkNCisgICB7DQorICAgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGluX3B0ciA9IGlucHV0X3JvdzsNCisgICAgICBwbmdfdWludF8xNnAgb3V0X3B0ciA9IG91dHB1dF9yb3c7DQorDQorICAgICAgd2hpbGUgKG91dF9wdHIgPCByb3dfZW5kKQ0KKyAgICAgIHsNCisgICAgICAgICBjb25zdCBwbmdfdWludF8xNiBhbHBoYSA9IGluX3B0clthaW5kZXhdOw0KKyAgICAgICAgIHBuZ191aW50XzMyIHJlY2lwcm9jYWwgPSAwOw0KKyAgICAgICAgIGludCBjOw0KKw0KKyAgICAgICAgIG91dF9wdHJbYWluZGV4XSA9IGFscGhhOw0KKw0KKyAgICAgICAgIC8qIENhbGN1bGF0ZSBhIHJlY2lwcm9jYWwuICBUaGUgY29ycmVjdCBjYWxjdWxhdGlvbiBpcyBzaW1wbHkNCisgICAgICAgICAgKiBjb21wb25lbnQvYWxwaGEqNjU1MzUgPDwgMTUuIChJLmUuIDE1IGJpdHMgb2YgcHJlY2lzaW9uKTsgdGhpcw0KKyAgICAgICAgICAqIGFsbG93cyBjb3JyZWN0IHJvdW5kaW5nIGJ5IGFkZGluZyAuNSBiZWZvcmUgdGhlIHNoaWZ0LiAgJ3JlY2lwcm9jYWwnDQorICAgICAgICAgICogaXMgb25seSBpbml0aWFsaXplZCB3aGVuIHJlcXVpcmVkLg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIGlmIChhbHBoYSA+IDAgJiYgYWxwaGEgPCA2NTUzNSkNCisgICAgICAgICAgICByZWNpcHJvY2FsID0gKCgweGZmZmY8PDE1KSsoYWxwaGE+PjEpKS9hbHBoYTsNCisNCisgICAgICAgICBjID0gY2hhbm5lbHM7DQorICAgICAgICAgZG8gLyogYWx3YXlzIGF0IGxlYXN0IG9uZSBjaGFubmVsICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ191aW50XzE2IGNvbXBvbmVudCA9ICppbl9wdHIrKzsNCisNCisgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGdpdmVzIDY1NTM1IGZvciBhbiBhbHBoYSBvZiAwLCB3aGljaCBpcyBmaW5lLA0KKyAgICAgICAgICAgICAqIG90aGVyd2lzZSBpZiAwLzAgaXMgcmVwcmVzZW50ZWQgYXMgc29tZSBvdGhlciB2YWx1ZSB0aGVyZSBpcyBtb3JlDQorICAgICAgICAgICAgICogbGlrZWx5IHRvIGJlIGEgZGlzY29udGludWl0eSB3aGljaCB3aWxsIHByb2JhYmx5IGRhbWFnZQ0KKyAgICAgICAgICAgICAqIGNvbXByZXNzaW9uIHdoZW4gbW92aW5nIGZyb20gYSBmdWxseSB0cmFuc3BhcmVudCBhcmVhIHRvIGENCisgICAgICAgICAgICAgKiBuZWFybHkgdHJhbnNwYXJlbnQgb25lLiAgKFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCBvcGFxdWUNCisgICAgICAgICAgICAgKiBhcmVhcyB0ZW5kIG5vdCB0byBiZSAwIGludGVuc2l0eS4pDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA+PSBhbHBoYSkNCisgICAgICAgICAgICAgICBjb21wb25lbnQgPSA2NTUzNTsNCisNCisgICAgICAgICAgICAvKiBjb21wb25lbnQ8YWxwaGEsIHNvIGNvbXBvbmVudC9hbHBoYSBpcyBsZXNzIHRoYW4gb25lIGFuZA0KKyAgICAgICAgICAgICAqIGNvbXBvbmVudCpyZWNpcHJvY2FsIGlzIGxlc3MgdGhhbiAyXjMxLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudCA+IDAgJiYgYWxwaGEgPCA2NTUzNSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgY2FsYyA9IGNvbXBvbmVudCAqIHJlY2lwcm9jYWw7DQorICAgICAgICAgICAgICAgY2FsYyArPSAxNjM4NDsgLyogcm91bmQgdG8gbmVhcmVzdCAqLw0KKyAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IChwbmdfdWludF8xNikoY2FsYyA+PiAxNSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICpvdXRfcHRyKysgPSBjb21wb25lbnQ7DQorICAgICAgICAgfQ0KKyAgICAgICAgIHdoaWxlICgtLWMgPiAwKTsNCisNCisgICAgICAgICAvKiBTa2lwIHRvIG5leHQgY29tcG9uZW50IChza2lwIHRoZSBpbnRlcnZlbmluZyBhbHBoYSBjaGFubmVsKSAqLw0KKyAgICAgICAgICsraW5fcHRyOw0KKyAgICAgICAgICsrb3V0X3B0cjsNCisgICAgICB9DQorDQorICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBkaXNwbGF5LT5sb2NhbF9yb3cpKTsNCisgICAgICBpbnB1dF9yb3cgKz0gZGlzcGxheS0+cm93X2J5dGVzLyhzaXplb2YgKHBuZ191aW50XzE2KSk7DQorICAgfQ0KKw0KKyAgIHJldHVybiAxOw0KK30NCisNCisvKiBHaXZlbiAxNi1iaXQgaW5wdXQgKDEgdG8gNCBjaGFubmVscykgd3JpdGUgOC1iaXQgb3V0cHV0LiAgSWYgYW4gYWxwaGEgY2hhbm5lbA0KKyAqIGlzIHByZXNlbnQgaXQgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIGNvbXBvbmVudHMsIHRoZSBjb21wb25lbnRzIGFyZSB0aGVuDQorICogd3JpdHRlbiBpbiBzUkdCIGVuY29kaW5nLiAgTm8gY29tcG9uZW50cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4NCisgKg0KKyAqIENhbGN1bGF0ZSBhbiBhbHBoYSByZWNpcHJvY2FsIHRvIHJldmVyc2UgcHJlLW11bHRpcGxpY2F0aW9uLiAgQXMgYWJvdmUgdGhlDQorICogY2FsY3VsYXRpb24gY2FuIGJlIGRvbmUgdG8gMTUgYml0cyBvZiBhY2N1cmFjeTsgaG93ZXZlciwgdGhlIG91dHB1dCBuZWVkcyB0bw0KKyAqIGJlIHNjYWxlZCBpbiB0aGUgcmFuZ2UgMC4uMjU1KjY1NTM1LCBzbyBpbmNsdWRlIHRoYXQgc2NhbGluZyBoZXJlLg0KKyAqLw0KKyNkZWZpbmUgVU5QX1JFQ0lQUk9DQUwoYWxwaGEpICgoKCgweGZmZmYqMHhmZik8PDcpKyhhbHBoYT4+MSkpL2FscGhhKQ0KKw0KK3N0YXRpYyBwbmdfYnl0ZQ0KK3BuZ191bnByZW11bHRpcGx5KHBuZ191aW50XzMyIGNvbXBvbmVudCwgcG5nX3VpbnRfMzIgYWxwaGEsDQorICAgcG5nX3VpbnRfMzIgcmVjaXByb2NhbC8qZnJvbSB0aGUgYWJvdmUgbWFjcm8qLykNCit7DQorICAgLyogVGhlIGZvbGxvd2luZyBnaXZlcyAxLjAgZm9yIGFuIGFscGhhIG9mIDAsIHdoaWNoIGlzIGZpbmUsIG90aGVyd2lzZSBpZiAwLzANCisgICAgKiBpcyByZXByZXNlbnRlZCBhcyBzb21lIG90aGVyIHZhbHVlIHRoZXJlIGlzIG1vcmUgbGlrZWx5IHRvIGJlIGENCisgICAgKiBkaXNjb250aW51aXR5IHdoaWNoIHdpbGwgcHJvYmFibHkgZGFtYWdlIGNvbXByZXNzaW9uIHdoZW4gbW92aW5nIGZyb20gYQ0KKyAgICAqIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEgdG8gYSBuZWFybHkgdHJhbnNwYXJlbnQgb25lLiAgKFRoZSBhc3N1bXB0aW9uIGhlcmUNCisgICAgKiBpcyB0aGF0IG9wYXF1ZSBhcmVhcyB0ZW5kIG5vdCB0byBiZSAwIGludGVuc2l0eS4pDQorICAgICoNCisgICAgKiBUaGVyZSBpcyBhIHJvdW5kaW5nIHByb2JsZW0gaGVyZTsgaWYgYWxwaGEgaXMgbGVzcyB0aGFuIDEyOCBpdCB3aWxsIGVuZCB1cA0KKyAgICAqIGFzIDAgd2hlbiBzY2FsZWQgdG8gOCBiaXRzLiAgVG8gYXZvaWQgaW50cm9kdWNpbmcgc3B1cmlvdXMgY29sb3JzIGludG8gdGhlDQorICAgICogb3V0cHV0IGNoYW5nZSBmb3IgdGhpcyB0b28uDQorICAgICovDQorICAgaWYgKGNvbXBvbmVudCA+PSBhbHBoYSB8fCBhbHBoYSA8IDEyOCkNCisgICAgICByZXR1cm4gMjU1Ow0KKw0KKyAgIC8qIGNvbXBvbmVudDxhbHBoYSwgc28gY29tcG9uZW50L2FscGhhIGlzIGxlc3MgdGhhbiBvbmUgYW5kDQorICAgICogY29tcG9uZW50KnJlY2lwcm9jYWwgaXMgbGVzcyB0aGFuIDJeMzEuDQorICAgICovDQorICAgZWxzZSBpZiAoY29tcG9uZW50ID4gMCkNCisgICB7DQorICAgICAgLyogVGhlIHRlc3QgaXMgdGhhdCBhbHBoYS8yNTcgKHJvdW5kZWQpIGlzIGxlc3MgdGhhbiAyNTUsIHRoZSBmaXJzdCB2YWx1ZQ0KKyAgICAgICAqIHRoYXQgYmVjb21lcyAyNTUgaXMgNjU0MDcuDQorICAgICAgICogTk9URTogdGhpcyBtdXN0IGFncmVlIHdpdGggdGhlIFBOR19ESVYyNTcgbWFjcm8gKHdoaWNoIG11c3QsIHRoZXJlZm9yZSwNCisgICAgICAgKiBiZSBleGFjdCEpICBbQ291bGQgYWxzbyB0ZXN0IHJlY2lwcm9jYWwgIT0gMF0NCisgICAgICAgKi8NCisgICAgICBpZiAoYWxwaGEgPCA2NTQwNykNCisgICAgICB7DQorICAgICAgICAgY29tcG9uZW50ICo9IHJlY2lwcm9jYWw7DQorICAgICAgICAgY29tcG9uZW50ICs9IDY0OyAvKiByb3VuZCB0byBuZWFyZXN0ICovDQorICAgICAgICAgY29tcG9uZW50ID4+PSA3Ow0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgY29tcG9uZW50ICo9IDI1NTsNCisNCisgICAgICAvKiBDb252ZXJ0IHRoZSBjb21wb25lbnQgdG8gc1JHQi4gKi8NCisgICAgICByZXR1cm4gKHBuZ19ieXRlKVBOR19zUkdCX0ZST01fTElORUFSKGNvbXBvbmVudCk7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICAgICByZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludA0KK3BuZ193cml0ZV9pbWFnZV84Yml0KHBuZ192b2lkcCBhcmd1bWVudCkNCit7DQorICAgcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wqLA0KKyAgICAgIGFyZ3VtZW50KTsNCisgICBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7DQorICAgcG5nX3N0cnVjdHJwIHBuZ19wdHIgPSBpbWFnZS0+b3BhcXVlLT5wbmdfcHRyOw0KKw0KKyAgIHBuZ19jb25zdF91aW50XzE2cCBpbnB1dF9yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLA0KKyAgICAgIGRpc3BsYXktPmZpcnN0X3Jvdyk7DQorICAgcG5nX2J5dGVwIG91dHB1dF9yb3cgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLCBkaXNwbGF5LT5sb2NhbF9yb3cpOw0KKyAgIHBuZ191aW50XzMyIHkgPSBpbWFnZS0+aGVpZ2h0Ow0KKyAgIGNvbnN0IGludCBjaGFubmVscyA9IChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSA/IDMgOiAxOw0KKw0KKyAgIGlmIChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgcm93X2VuZDsNCisgICAgICBpbnQgYWluZGV4Ow0KKw0KKyAgICAgIGlmIChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkNCisgICAgICB7DQorICAgICAgICAgYWluZGV4ID0gLTE7DQorICAgICAgICAgKytpbnB1dF9yb3c7IC8qIFRvIHBvaW50IHRvIHRoZSBmaXJzdCBjb21wb25lbnQgKi8NCisgICAgICAgICArK291dHB1dF9yb3c7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBhaW5kZXggPSBjaGFubmVsczsNCisNCisgICAgICAvKiBVc2Ugcm93X2VuZCBpbiBwbGFjZSBvZiBhIGxvb3AgY291bnRlcjogKi8NCisgICAgICByb3dfZW5kID0gb3V0cHV0X3JvdyArIGltYWdlLT53aWR0aCAqIChjaGFubmVscysxKTsNCisNCisgICAgICB3aGlsZSAoeS0tID4gMCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGluX3B0ciA9IGlucHV0X3JvdzsNCisgICAgICAgICBwbmdfYnl0ZXAgb3V0X3B0ciA9IG91dHB1dF9yb3c7DQorDQorICAgICAgICAgd2hpbGUgKG91dF9wdHIgPCByb3dfZW5kKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfdWludF8xNiBhbHBoYSA9IGluX3B0clthaW5kZXhdOw0KKyAgICAgICAgICAgIHBuZ19ieXRlIGFscGhhYnl0ZSA9IChwbmdfYnl0ZSlQTkdfRElWMjU3KGFscGhhKTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByZWNpcHJvY2FsID0gMDsNCisgICAgICAgICAgICBpbnQgYzsNCisNCisgICAgICAgICAgICAvKiBTY2FsZSBhbmQgd3JpdGUgdGhlIGFscGhhIGNoYW5uZWwuICovDQorICAgICAgICAgICAgb3V0X3B0clthaW5kZXhdID0gYWxwaGFieXRlOw0KKw0KKyAgICAgICAgICAgIGlmIChhbHBoYWJ5dGUgPiAwICYmIGFscGhhYnl0ZSA8IDI1NSkNCisgICAgICAgICAgICAgICByZWNpcHJvY2FsID0gVU5QX1JFQ0lQUk9DQUwoYWxwaGEpOw0KKw0KKyAgICAgICAgICAgIGMgPSBjaGFubmVsczsNCisgICAgICAgICAgICBkbyAvKiBhbHdheXMgYXQgbGVhc3Qgb25lIGNoYW5uZWwgKi8NCisgICAgICAgICAgICAgICAqb3V0X3B0cisrID0gcG5nX3VucHJlbXVsdGlwbHkoKmluX3B0cisrLCBhbHBoYSwgcmVjaXByb2NhbCk7DQorICAgICAgICAgICAgd2hpbGUgKC0tYyA+IDApOw0KKw0KKyAgICAgICAgICAgIC8qIFNraXAgdG8gbmV4dCBjb21wb25lbnQgKHNraXAgdGhlIGludGVydmVuaW5nIGFscGhhIGNoYW5uZWwpICovDQorICAgICAgICAgICAgKytpbl9wdHI7DQorICAgICAgICAgICAgKytvdXRfcHRyOw0KKyAgICAgICAgIH0gLyogd2hpbGUgb3V0X3B0ciA8IHJvd19lbmQgKi8NCisNCisgICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIHBuZ192b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsDQorICAgICAgICAgICAgZGlzcGxheS0+bG9jYWxfcm93KSk7DQorICAgICAgICAgaW5wdXRfcm93ICs9IGRpc3BsYXktPnJvd19ieXRlcy8oc2l6ZW9mIChwbmdfdWludF8xNikpOw0KKyAgICAgIH0gLyogd2hpbGUgeSAqLw0KKyAgIH0NCisNCisgICBlbHNlDQorICAgew0KKyAgICAgIC8qIE5vIGFscGhhIGNoYW5uZWwsIHNvIHRoZSByb3dfZW5kIHJlYWxseSBpcyB0aGUgZW5kIG9mIHRoZSByb3cgYW5kIGl0DQorICAgICAgICogaXMgc3VmZmljaWVudCB0byBsb29wIG92ZXIgdGhlIGNvbXBvbmVudHMgb25lIGJ5IG9uZS4NCisgICAgICAgKi8NCisgICAgICBwbmdfYnl0ZXAgcm93X2VuZCA9IG91dHB1dF9yb3cgKyBpbWFnZS0+d2lkdGggKiBjaGFubmVsczsNCisNCisgICAgICB3aGlsZSAoeS0tID4gMCkNCisgICAgICB7DQorICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGluX3B0ciA9IGlucHV0X3JvdzsNCisgICAgICAgICBwbmdfYnl0ZXAgb3V0X3B0ciA9IG91dHB1dF9yb3c7DQorDQorICAgICAgICAgd2hpbGUgKG91dF9wdHIgPCByb3dfZW5kKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBjb21wb25lbnQgPSAqaW5fcHRyKys7DQorDQorICAgICAgICAgICAgY29tcG9uZW50ICo9IDI1NTsNCisgICAgICAgICAgICAqb3V0X3B0cisrID0gKHBuZ19ieXRlKVBOR19zUkdCX0ZST01fTElORUFSKGNvbXBvbmVudCk7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgb3V0cHV0X3Jvdyk7DQorICAgICAgICAgaW5wdXRfcm93ICs9IGRpc3BsYXktPnJvd19ieXRlcy8oc2l6ZW9mIChwbmdfdWludF8xNikpOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgcmV0dXJuIDE7DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQorcG5nX2ltYWdlX3NldF9QTFRFKHBuZ19pbWFnZV93cml0ZV9jb250cm9sICpkaXNwbGF5KQ0KK3sNCisgICBjb25zdCBwbmdfaW1hZ2VwIGltYWdlID0gZGlzcGxheS0+aW1hZ2U7DQorICAgY29uc3Qgdm9pZCAqY21hcCA9IGRpc3BsYXktPmNvbG9ybWFwOw0KKyAgIGNvbnN0IGludCBlbnRyaWVzID0gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMgPiAyNTYgPyAyNTYgOg0KKyAgICAgIChpbnQpaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXM7DQorDQorICAgLyogTk9URTogdGhlIGNhbGxlciBtdXN0IGNoZWNrIGZvciBjbWFwICE9IE5VTEwgYW5kIGVudHJpZXMgIT0gMCAqLw0KKyAgIGNvbnN0IHBuZ191aW50XzMyIGZvcm1hdCA9IGltYWdlLT5mb3JtYXQ7DQorICAgY29uc3QgaW50IGNoYW5uZWxzID0gUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhmb3JtYXQpOw0KKw0KKyMgIGlmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRA0KKyAgICAgIGNvbnN0IGludCBhZmlyc3QgPSAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkgIT0gMCAmJg0KKyAgICAgICAgIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDA7DQorIyAgZWxzZQ0KKyMgICAgIGRlZmluZSBhZmlyc3QgMA0KKyMgIGVuZGlmDQorDQorIyAgaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVEDQorICAgICAgY29uc3QgaW50IGJnciA9IChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKSA/IDIgOiAwOw0KKyMgIGVsc2UNCisjICAgICBkZWZpbmUgYmdyIDANCisjICBlbmRpZg0KKw0KKyAgIGludCBpLCBudW1fdHJhbnM7DQorICAgcG5nX2NvbG9yIHBhbGV0dGVbMjU2XTsNCisgICBwbmdfYnl0ZSB0Uk5TWzI1Nl07DQorDQorICAgbWVtc2V0KHRSTlMsIDI1NSwgKHNpemVvZiB0Uk5TKSk7DQorICAgbWVtc2V0KHBhbGV0dGUsIDAsIChzaXplb2YgcGFsZXR0ZSkpOw0KKw0KKyAgIGZvciAoaT1udW1fdHJhbnM9MDsgaTxlbnRyaWVzOyArK2kpDQorICAgew0KKyAgICAgIC8qIFRoaXMgZ2V0cyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBzUkdCIHdpdGggcmV2ZXJzYWwgb2YgdGhlDQorICAgICAgICogcHJlLW11bHRpcGxpY2F0aW9uIGlmIHRoZSBjb2xvci1tYXAgaGFzIGFuIGFscGhhIGNoYW5uZWwuDQorICAgICAgICovDQorICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jb25zdF91aW50XzE2cCBlbnRyeSA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfdWludF8xNnAsIGNtYXApOw0KKw0KKyAgICAgICAgIGVudHJ5ICs9IGkgKiBjaGFubmVsczsNCisNCisgICAgICAgICBpZiAoY2hhbm5lbHMgJiAxKSAvKiBubyBhbHBoYSAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPj0gMykgLyogUkdCICovDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IChwbmdfYnl0ZSlQTkdfc1JHQl9GUk9NX0xJTkVBUigyNTUgKg0KKyAgICAgICAgICAgICAgICAgIGVudHJ5WygyIF4gYmdyKV0pOw0KKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSAocG5nX2J5dGUpUE5HX3NSR0JfRlJPTV9MSU5FQVIoMjU1ICoNCisgICAgICAgICAgICAgICAgICBlbnRyeVsxXSk7DQorICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSAocG5nX2J5dGUpUE5HX3NSR0JfRlJPTV9MSU5FQVIoMjU1ICoNCisgICAgICAgICAgICAgICAgICBlbnRyeVtiZ3JdKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZWxzZSAvKiBHcmF5ICovDQorICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcGFsZXR0ZVtpXS5yZWQgPSBwYWxldHRlW2ldLmdyZWVuID0NCisgICAgICAgICAgICAgICAgICAocG5nX2J5dGUpUE5HX3NSR0JfRlJPTV9MSU5FQVIoMjU1ICogKmVudHJ5KTsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZSAvKiBhbHBoYSAqLw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfdWludF8xNiBhbHBoYSA9IGVudHJ5W2FmaXJzdCA/IDAgOiBjaGFubmVscy0xXTsNCisgICAgICAgICAgICBwbmdfYnl0ZSBhbHBoYWJ5dGUgPSAocG5nX2J5dGUpUE5HX0RJVjI1NyhhbHBoYSk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcmVjaXByb2NhbCA9IDA7DQorDQorICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGEgcmVjaXByb2NhbCwgYXMgaW4gdGhlIHBuZ193cml0ZV9pbWFnZV84Yml0IGNvZGUgYWJvdmUNCisgICAgICAgICAgICAgKiB0aGlzIGlzIGRlc2lnbmVkIHRvIHByb2R1Y2UgYSB2YWx1ZSBzY2FsZWQgdG8gMjU1KjY1NTM1IHdoZW4NCisgICAgICAgICAgICAgKiBkaXZpZGVkIGJ5IDEyOCAoaS5lLiBhc3IgNykuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgaWYgKGFscGhhYnl0ZSA+IDAgJiYgYWxwaGFieXRlIDwgMjU1KQ0KKyAgICAgICAgICAgICAgIHJlY2lwcm9jYWwgPSAoKCgweGZmZmYqMHhmZik8PDcpKyhhbHBoYT4+MSkpL2FscGhhOw0KKw0KKyAgICAgICAgICAgIHRSTlNbaV0gPSBhbHBoYWJ5dGU7DQorICAgICAgICAgICAgaWYgKGFscGhhYnl0ZSA8IDI1NSkNCisgICAgICAgICAgICAgICBudW1fdHJhbnMgPSBpKzE7DQorDQorICAgICAgICAgICAgaWYgKGNoYW5uZWxzID49IDMpIC8qIFJHQiAqLw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfdW5wcmVtdWx0aXBseShlbnRyeVthZmlyc3QgKyAoMiBeIGJncildLA0KKyAgICAgICAgICAgICAgICAgIGFscGhhLCByZWNpcHJvY2FsKTsNCisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3VucHJlbXVsdGlwbHkoZW50cnlbYWZpcnN0ICsgMV0sIGFscGhhLA0KKyAgICAgICAgICAgICAgICAgIHJlY2lwcm9jYWwpOw0KKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3VucHJlbXVsdGlwbHkoZW50cnlbYWZpcnN0ICsgYmdyXSwgYWxwaGEsDQorICAgICAgICAgICAgICAgICAgcmVjaXByb2NhbCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UgLyogZ3JheSAqLw0KKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBhbGV0dGVbaV0ucmVkID0gcGFsZXR0ZVtpXS5ncmVlbiA9DQorICAgICAgICAgICAgICAgICAgcG5nX3VucHJlbXVsdGlwbHkoZW50cnlbYWZpcnN0XSwgYWxwaGEsIHJlY2lwcm9jYWwpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZSAvKiBDb2xvci1tYXAgaGFzIHNSR0IgdmFsdWVzICovDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jb25zdF9ieXRlcCBlbnRyeSA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIGNtYXApOw0KKw0KKyAgICAgICAgIGVudHJ5ICs9IGkgKiBjaGFubmVsczsNCisNCisgICAgICAgICBzd2l0Y2ggKGNoYW5uZWxzKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgICAgdFJOU1tpXSA9IGVudHJ5W2FmaXJzdCA/IDAgOiAzXTsNCisgICAgICAgICAgICAgICBpZiAodFJOU1tpXSA8IDI1NSkNCisgICAgICAgICAgICAgICAgICBudW1fdHJhbnMgPSBpKzE7DQorICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovDQorICAgICAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGVudHJ5W2FmaXJzdCArICgyIF4gYmdyKV07DQorICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IGVudHJ5W2FmaXJzdCArIDFdOw0KKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gZW50cnlbYWZpcnN0ICsgYmdyXTsNCisgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgdFJOU1tpXSA9IGVudHJ5WzEgXiBhZmlyc3RdOw0KKyAgICAgICAgICAgICAgIGlmICh0Uk5TW2ldIDwgMjU1KQ0KKyAgICAgICAgICAgICAgICAgIG51bV90cmFucyA9IGkrMTsNCisgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8NCisgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcGFsZXR0ZVtpXS5yZWQgPSBwYWxldHRlW2ldLmdyZWVuID0NCisgICAgICAgICAgICAgICAgICBlbnRyeVthZmlyc3RdOw0KKyAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICB9DQorDQorIyAgaWZkZWYgYWZpcnN0DQorIyAgICAgdW5kZWYgYWZpcnN0DQorIyAgZW5kaWYNCisjICBpZmRlZiBiZ3INCisjICAgICB1bmRlZiBiZ3INCisjICBlbmRpZg0KKw0KKyAgIHBuZ19zZXRfUExURShpbWFnZS0+b3BhcXVlLT5wbmdfcHRyLCBpbWFnZS0+b3BhcXVlLT5pbmZvX3B0ciwgcGFsZXR0ZSwNCisgICAgICBlbnRyaWVzKTsNCisNCisgICBpZiAobnVtX3RyYW5zID4gMCkNCisgICAgICBwbmdfc2V0X3RSTlMoaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0ciwgaW1hZ2UtPm9wYXF1ZS0+aW5mb19wdHIsIHRSTlMsDQorICAgICAgICAgbnVtX3RyYW5zLCBOVUxMKTsNCisNCisgICBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA9IGVudHJpZXM7DQorfQ0KKw0KK3N0YXRpYyBpbnQNCitwbmdfaW1hZ2Vfd3JpdGVfbWFpbihwbmdfdm9pZHAgYXJndW1lbnQpDQorew0KKyAgIHBuZ19pbWFnZV93cml0ZV9jb250cm9sICpkaXNwbGF5ID0gcG5nX3ZvaWRjYXN0KHBuZ19pbWFnZV93cml0ZV9jb250cm9sKiwNCisgICAgICBhcmd1bWVudCk7DQorICAgcG5nX2ltYWdlcCBpbWFnZSA9IGRpc3BsYXktPmltYWdlOw0KKyAgIHBuZ19zdHJ1Y3RycCBwbmdfcHRyID0gaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0cjsNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyID0gaW1hZ2UtPm9wYXF1ZS0+aW5mb19wdHI7DQorICAgcG5nX3VpbnRfMzIgZm9ybWF0ID0gaW1hZ2UtPmZvcm1hdDsNCisNCisgICBpbnQgY29sb3JtYXAgPSAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAhPSAwOw0KKyAgIGludCBsaW5lYXIgPSAhY29sb3JtYXAgJiYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpICE9IDA7IC8qIGlucHV0ICovDQorICAgaW50IGFscGhhID0gIWNvbG9ybWFwICYmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDA7DQorICAgaW50IHdyaXRlXzE2Yml0ID0gbGluZWFyICYmICFjb2xvcm1hcCAmJiAhZGlzcGxheS0+Y29udmVydF90b184Yml0Ow0KKw0KKyMgIGlmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRA0KKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBlcnJvciBvdXQgb24gYW55IGJhZCBzaXR1YXRpb24gKi8NCisgICAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMocG5nX3B0ciwgMC8qZXJyb3IqLyk7DQorIyAgZW5kaWYNCisNCisgICAvKiBEZWZhdWx0IHRoZSAncm93X3N0cmlkZScgcGFyYW1ldGVyIGlmIHJlcXVpcmVkLiAqLw0KKyAgIGlmIChkaXNwbGF5LT5yb3dfc3RyaWRlID09IDApDQorICAgICAgZGlzcGxheS0+cm93X3N0cmlkZSA9IFBOR19JTUFHRV9ST1dfU1RSSURFKCppbWFnZSk7DQorDQorICAgLyogU2V0IHRoZSByZXF1aXJlZCB0cmFuc2Zvcm1zIHRoZW4gd3JpdGUgdGhlIHJvd3MgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICovDQorICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkNCisgICB7DQorICAgICAgaWYgKGRpc3BsYXktPmNvbG9ybWFwICE9IE5VTEwgJiYgaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMgPiAwKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfdWludF8zMiBlbnRyaWVzID0gaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXM7DQorDQorICAgICAgICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQsDQorICAgICAgICAgICAgZW50cmllcyA+IDE2ID8gOCA6IChlbnRyaWVzID4gNCA/IDQgOiAoZW50cmllcyA+IDIgPyAyIDogMSkpLA0KKyAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUsIFBOR19JTlRFUkxBQ0VfTk9ORSwNCisgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7DQorDQorICAgICAgICAgcG5nX2ltYWdlX3NldF9QTFRFKGRpc3BsYXkpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgcG5nX2Vycm9yKGltYWdlLT5vcGFxdWUtPnBuZ19wdHIsDQorICAgICAgICAgICAgIm5vIGNvbG9yLW1hcCBmb3IgY29sb3ItbWFwcGVkIGltYWdlIik7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCwNCisgICAgICAgICB3cml0ZV8xNmJpdCA/IDE2IDogOCwNCisgICAgICAgICAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikgPyBQTkdfQ09MT1JfTUFTS19DT0xPUiA6IDApICsNCisgICAgICAgICAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPyBQTkdfQ09MT1JfTUFTS19BTFBIQSA6IDApLA0KKyAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOw0KKw0KKyAgIC8qIENvdW50ZXItaW50dWl0aXZlbHkgdGhlIGRhdGEgdHJhbnNmb3JtYXRpb25zIG11c3QgYmUgY2FsbGVkICphZnRlcioNCisgICAgKiBwbmdfd3JpdGVfaW5mbywgbm90IGJlZm9yZSBhcyBpbiB0aGUgcmVhZCBjb2RlLCBidXQgdGhlICdzZXQnIGZ1bmN0aW9ucw0KKyAgICAqIG11c3Qgc3RpbGwgYmUgY2FsbGVkIGJlZm9yZS4gIEp1c3Qgc2V0IHRoZSBjb2xvciBzcGFjZSBpbmZvcm1hdGlvbiwgbmV2ZXINCisgICAgKiB3cml0ZSBhbiBpbnRlcmxhY2VkIGltYWdlLg0KKyAgICAqLw0KKw0KKyAgIGlmICh3cml0ZV8xNmJpdCkNCisgICB7DQorICAgICAgLyogVGhlIGdhbW1hIGhlcmUgaXMgMS4wIChsaW5lYXIpIGFuZCB0aGUgY0hSTSBjaHVuayBtYXRjaGVzIHNSR0IuICovDQorICAgICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfR0FNTUFfTElORUFSKTsNCisNCisgICAgICBpZiAoIShpbWFnZS0+ZmxhZ3MgJiBQTkdfSU1BR0VfRkxBR19DT0xPUlNQQUNFX05PVF9zUkdCKSkNCisgICAgICAgICBwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsDQorICAgICAgICAgICAgLyogY29sb3IgICAgICB4ICAgICAgIHkgKi8NCisgICAgICAgICAgICAvKiB3aGl0ZSAqLyAzMTI3MCwgMzI5MDAsDQorICAgICAgICAgICAgLyogcmVkICAgKi8gNjQwMDAsIDMzMDAwLA0KKyAgICAgICAgICAgIC8qIGdyZWVuICovIDMwMDAwLCA2MDAwMCwNCisgICAgICAgICAgICAvKiBibHVlICAqLyAxNTAwMCwgIDYwMDANCisgICAgICAgICApOw0KKyAgIH0NCisNCisgICBlbHNlIGlmICghKGltYWdlLT5mbGFncyAmIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IpKQ0KKyAgICAgIHBuZ19zZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX3NSR0JfSU5URU5UX1BFUkNFUFRVQUwpOw0KKw0KKyAgIC8qIEVsc2Ugd3JpdGluZyBhbiA4LWJpdCBmaWxlIGFuZCB0aGUgKmNvbG9ycyogYXJlbid0IHNSR0IsIGJ1dCB0aGUgOC1iaXQNCisgICAgKiBzcGFjZSBtdXN0IHN0aWxsIGJlIGdhbW1hIGVuY29kZWQuDQorICAgICovDQorICAgZWxzZQ0KKyAgICAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0dBTU1BX3NSR0JfSU5WRVJTRSk7DQorDQorICAgLyogV3JpdGUgdGhlIGZpbGUgaGVhZGVyLiAqLw0KKyAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCisNCisgICAvKiBOb3cgc2V0IHVwIHRoZSBkYXRhIHRyYW5zZm9ybWF0aW9ucyAoKmFmdGVyKiB0aGUgaGVhZGVyIGlzIHdyaXR0ZW4pLA0KKyAgICAqIHJlbW92ZSB0aGUgaGFuZGxlZCB0cmFuc2Zvcm1hdGlvbnMgZnJvbSB0aGUgJ2Zvcm1hdCcgZmxhZ3MgZm9yIGNoZWNraW5nLg0KKyAgICAqDQorICAgICogRmlyc3QgY2hlY2sgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gaWYgd3JpdGluZyAxNiBiaXQgZmlsZXMuDQorICAgICovDQorICAgaWYgKHdyaXRlXzE2Yml0KQ0KKyAgIHsNCisgICAgICBQTkdfQ09OU1QgcG5nX3VpbnRfMTYgbGUgPSAweDAwMDE7DQorDQorICAgICAgaWYgKCoocG5nX2NvbnN0X2J5dGVwKSZsZSkNCisgICAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7DQorICAgfQ0KKw0KKyMgIGlmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX0JHUl9TVVBQT1JURUQNCisgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0JHUikNCisgICAgICB7DQorICAgICAgICAgaWYgKCFjb2xvcm1hcCAmJiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSAhPSAwKQ0KKyAgICAgICAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOw0KKyAgICAgICAgIGZvcm1hdCAmPSB+UE5HX0ZPUk1BVF9GTEFHX0JHUjsNCisgICAgICB9DQorIyAgZW5kaWYNCisNCisjICBpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9BRklSU1RfU1VQUE9SVEVEDQorICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpDQorICAgICAgew0KKyAgICAgICAgIGlmICghY29sb3JtYXAgJiYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgIT0gMCkNCisgICAgICAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7DQorICAgICAgICAgZm9ybWF0ICY9IH5QTkdfRk9STUFUX0ZMQUdfQUZJUlNUOw0KKyAgICAgIH0NCisjICBlbmRpZg0KKw0KKyAgIC8qIElmIHRoZXJlIGFyZSAxNiBvciBmZXdlciBjb2xvci1tYXAgZW50cmllcyB3ZSB3cm90ZSBhIGxvd2VyIGJpdCBkZXB0aA0KKyAgICAqIGFib3ZlLCBidXQgdGhlIGFwcGxpY2F0aW9uIGRhdGEgaXMgc3RpbGwgYnl0ZSBwYWNrZWQuDQorICAgICovDQorICAgaWYgKGNvbG9ybWFwICYmIGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzIDw9IDE2KQ0KKyAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsNCisNCisgICAvKiBUaGF0IHNob3VsZCBoYXZlIGhhbmRsZWQgYWxsIChib3RoKSB0aGUgdHJhbnNmb3Jtcy4gKi8NCisgICBpZiAoKGZvcm1hdCAmIH4ocG5nX3VpbnRfMzIpKFBOR19GT1JNQVRfRkxBR19DT0xPUiB8IFBOR19GT1JNQVRfRkxBR19MSU5FQVIgfA0KKyAgICAgICAgIFBOR19GT1JNQVRfRkxBR19BTFBIQSB8IFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkpICE9IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwbmdfd3JpdGVfaW1hZ2U6IHVuc3VwcG9ydGVkIHRyYW5zZm9ybWF0aW9uIik7DQorDQorICAgew0KKyAgICAgIHBuZ19jb25zdF9ieXRlcCByb3cgPSBwbmdfdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBkaXNwbGF5LT5idWZmZXIpOw0KKyAgICAgIHB0cmRpZmZfdCByb3dfYnl0ZXMgPSBkaXNwbGF5LT5yb3dfc3RyaWRlOw0KKw0KKyAgICAgIGlmIChsaW5lYXIpDQorICAgICAgICAgcm93X2J5dGVzICo9IChzaXplb2YgKHBuZ191aW50XzE2KSk7DQorDQorICAgICAgaWYgKHJvd19ieXRlcyA8IDApDQorICAgICAgICAgcm93ICs9IChpbWFnZS0+aGVpZ2h0LTEpICogKC1yb3dfYnl0ZXMpOw0KKw0KKyAgICAgIGRpc3BsYXktPmZpcnN0X3JvdyA9IHJvdzsNCisgICAgICBkaXNwbGF5LT5yb3dfYnl0ZXMgPSByb3dfYnl0ZXM7DQorICAgfQ0KKw0KKyAgIC8qIEFwcGx5ICdmYXN0JyBvcHRpb25zIGlmIHRoZSBmbGFnIGlzIHNldC4gKi8NCisgICBpZiAoKGltYWdlLT5mbGFncyAmIFBOR19JTUFHRV9GTEFHX0ZBU1QpICE9IDApDQorICAgew0KKyAgICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLCBQTkdfTk9fRklMVEVSUyk7DQorICAgICAgLyogTk9URTogZGV0ZXJtaW5lZCBieSBleHBlcmltZW50IHVzaW5nIHBuZ3N0ZXN0LCB0aGlzIHJlZmxlY3RzIHNvbWUNCisgICAgICAgKiBiYWxhbmNlIGJldHdlZW4gdGhlIHRpbWUgdG8gd3JpdGUgdGhlIGltYWdlIG9uY2UgYW5kIHRoZSB0aW1lIHRvIHJlYWQNCisgICAgICAgKiBpdCBhYm91dCA1MCB0aW1lcy4gIFRoZSBzcGVlZC11cCBpbiBwbmdzdGVzdCB3YXMgYWJvdXQgMTAtMjAlIG9mIHRoZQ0KKyAgICAgICAqIHRvdGFsICh1c2VyKSB0aW1lIG9uIGEgaGVhdmlseSBsb2FkZWQgc3lzdGVtLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgMyk7DQorICAgfQ0KKw0KKyAgIC8qIENoZWNrIGZvciB0aGUgY2FzZXMgdGhhdCBjdXJyZW50bHkgcmVxdWlyZSBhIHByZS10cmFuc2Zvcm0gb24gdGhlIHJvdw0KKyAgICAqIGJlZm9yZSBpdCBpcyB3cml0dGVuLiAgVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgaW5wdXQgaXMgMTYtYml0IGFuZA0KKyAgICAqIGVpdGhlciB0aGVyZSBpcyBhbiBhbHBoYSBjaGFubmVsIG9yIGl0IGlzIGNvbnZlcnRlZCB0byA4LWJpdC4NCisgICAgKi8NCisgICBpZiAoKGxpbmVhciAmJiBhbHBoYSkgfHwgKCFjb2xvcm1hcCAmJiBkaXNwbGF5LT5jb252ZXJ0X3RvXzhiaXQpKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgcm93ID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwgcG5nX21hbGxvYyhwbmdfcHRyLA0KKyAgICAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpKSk7DQorICAgICAgaW50IHJlc3VsdDsNCisNCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSByb3c7DQorICAgICAgaWYgKHdyaXRlXzE2Yml0KQ0KKyAgICAgICAgIHJlc3VsdCA9IHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ193cml0ZV9pbWFnZV8xNmJpdCwgZGlzcGxheSk7DQorICAgICAgZWxzZQ0KKyAgICAgICAgIHJlc3VsdCA9IHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ193cml0ZV9pbWFnZV84Yml0LCBkaXNwbGF5KTsNCisgICAgICBkaXNwbGF5LT5sb2NhbF9yb3cgPSBOVUxMOw0KKw0KKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHJvdyk7DQorDQorICAgICAgLyogU2tpcCB0aGUgJ3dyaXRlX2VuZCcgb24gZXJyb3I6ICovDQorICAgICAgaWYgKCFyZXN1bHQpDQorICAgICAgICAgcmV0dXJuIDA7DQorICAgfQ0KKw0KKyAgIC8qIE90aGVyd2lzZSB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBpbnB1dCBpcyBpbiBhIGZvcm1hdCBjdXJyZW50bHkNCisgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGxpYnBuZyB3cml0ZSBjb2RlOyBjYWxsIGl0IGRpcmVjdGx5Lg0KKyAgICAqLw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2NvbnN0X2J5dGVwIHJvdyA9IHBuZ192b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIGRpc3BsYXktPmZpcnN0X3Jvdyk7DQorICAgICAgcHRyZGlmZl90IHJvd19ieXRlcyA9IGRpc3BsYXktPnJvd19ieXRlczsNCisgICAgICBwbmdfdWludF8zMiB5ID0gaW1hZ2UtPmhlaWdodDsNCisNCisgICAgICB3aGlsZSAoeS0tID4gMCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCByb3cpOw0KKyAgICAgICAgIHJvdyArPSByb3dfYnl0ZXM7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsNCisgICByZXR1cm4gMTsNCit9DQorDQoraW50IFBOR0FQSQ0KK3BuZ19pbWFnZV93cml0ZV90b19zdGRpbyhwbmdfaW1hZ2VwIGltYWdlLCBGSUxFICpmaWxlLCBpbnQgY29udmVydF90b184Yml0LA0KKyAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgcG5nX2ludF8zMiByb3dfc3RyaWRlLCBjb25zdCB2b2lkICpjb2xvcm1hcCkNCit7DQorICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiAoRklMRSopLiAqLw0KKyAgIGlmIChpbWFnZSAhPSBOVUxMICYmIGltYWdlLT52ZXJzaW9uID09IFBOR19JTUFHRV9WRVJTSU9OKQ0KKyAgIHsNCisgICAgICBpZiAoZmlsZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX2ltYWdlX3dyaXRlX2luaXQoaW1hZ2UpKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfaW1hZ2Vfd3JpdGVfY29udHJvbCBkaXNwbGF5Ow0KKyAgICAgICAgICAgIGludCByZXN1bHQ7DQorDQorICAgICAgICAgICAgLyogVGhpcyBpcyBzbGlnaHRseSBldmlsLCBidXQgcG5nX2luaXRfaW8gZG9lc24ndCBkbyBhbnl0aGluZyBvdGhlcg0KKyAgICAgICAgICAgICAqIHRoYW4gdGhpcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBzdGFuZGFyZCBJTyBmdW5jdGlvbnMgc28NCisgICAgICAgICAgICAgKiB0aGlzIHNhdmVzIGEgJ3NhZmUnIGZ1bmN0aW9uLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGltYWdlLT5vcGFxdWUtPnBuZ19wdHItPmlvX3B0ciA9IGZpbGU7DQorDQorICAgICAgICAgICAgbWVtc2V0KCZkaXNwbGF5LCAwLCAoc2l6ZW9mIGRpc3BsYXkpKTsNCisgICAgICAgICAgICBkaXNwbGF5LmltYWdlID0gaW1hZ2U7DQorICAgICAgICAgICAgZGlzcGxheS5idWZmZXIgPSBidWZmZXI7DQorICAgICAgICAgICAgZGlzcGxheS5yb3dfc3RyaWRlID0gcm93X3N0cmlkZTsNCisgICAgICAgICAgICBkaXNwbGF5LmNvbG9ybWFwID0gY29sb3JtYXA7DQorICAgICAgICAgICAgZGlzcGxheS5jb252ZXJ0X3RvXzhiaXQgPSBjb252ZXJ0X3RvXzhiaXQ7DQorDQorICAgICAgICAgICAgcmVzdWx0ID0gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3dyaXRlX21haW4sICZkaXNwbGF5KTsNCisgICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZShpbWFnZSk7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICB9DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwNCisgICAgICAgICAgICAicG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvOiBpbnZhbGlkIGFyZ3VtZW50Iik7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpDQorICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwNCisgICAgICAgICAicG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvOiBpbmNvcnJlY3QgUE5HX0lNQUdFX1ZFUlNJT04iKTsNCisNCisgICBlbHNlDQorICAgICAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBQTkdBUEkNCitwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZShwbmdfaW1hZ2VwIGltYWdlLCBjb25zdCBjaGFyICpmaWxlX25hbWUsDQorICAgaW50IGNvbnZlcnRfdG9fOGJpdCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBwbmdfaW50XzMyIHJvd19zdHJpZGUsDQorICAgY29uc3Qgdm9pZCAqY29sb3JtYXApDQorew0KKyAgIC8qIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZS4gKi8NCisgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikNCisgICB7DQorICAgICAgaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQ0KKyAgICAgIHsNCisgICAgICAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7DQorDQorICAgICAgICAgaWYgKGZwICE9IE5VTEwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8oaW1hZ2UsIGZwLCBjb252ZXJ0X3RvXzhiaXQsIGJ1ZmZlciwNCisgICAgICAgICAgICAgICByb3dfc3RyaWRlLCBjb2xvcm1hcCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGludCBlcnJvcjsgLyogZnJvbSBmZmx1c2gvZmNsb3NlICovDQorDQorICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaWxlIGlzIGZsdXNoZWQgY29ycmVjdGx5LiAqLw0KKyAgICAgICAgICAgICAgIGlmIChmZmx1c2goZnApID09IDAgJiYgZmVycm9yKGZwKSA9PSAwKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBpZiAoZmNsb3NlKGZwKSA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKw0KKyAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJybm87IC8qIGZyb20gZmNsb3NlICovDQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJubzsgLyogZnJvbSBmZmx1c2ggb3IgZmVycm9yICovDQorICAgICAgICAgICAgICAgICAgKHZvaWQpZmNsb3NlKGZwKTsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgKHZvaWQpcmVtb3ZlKGZpbGVfbmFtZSk7DQorICAgICAgICAgICAgICAgLyogVGhlIGltYWdlIGhhcyBhbHJlYWR5IGJlZW4gY2xlYW5lZCB1cDsgdGhpcyBpcyBqdXN0IHVzZWQgdG8NCisgICAgICAgICAgICAgICAgKiBzZXQgdGhlIGVycm9yIChiZWNhdXNlIHRoZSBvcmlnaW5hbCB3cml0ZSBzdWNjZWVkZWQpLg0KKyAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsIHN0cmVycm9yKGVycm9yKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogQ2xlYW4gdXA6IGp1c3QgdGhlIG9wZW5lZCBmaWxlLiAqLw0KKyAgICAgICAgICAgICAgICh2b2lkKWZjbG9zZShmcCk7DQorICAgICAgICAgICAgICAgKHZvaWQpcmVtb3ZlKGZpbGVfbmFtZSk7DQorICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsDQorICAgICAgICAgICAgInBuZ19pbWFnZV93cml0ZV90b19maWxlOiBpbnZhbGlkIGFyZ3VtZW50Iik7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpDQorICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwNCisgICAgICAgICAicG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGU6IGluY29ycmVjdCBQTkdfSU1BR0VfVkVSU0lPTiIpOw0KKw0KKyAgIGVsc2UNCisgICAgICByZXR1cm4gMDsNCit9DQorI2VuZGlmIC8qIFBOR19TVERJT19TVVBQT1JURUQgKi8NCisjZW5kaWYgLyogU0lNUExJRklFRF9XUklURSAqLw0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfU1VQUE9SVEVEICovDQorI2VuZGlmLy9fRlBERkFQSV9NSU5JXw0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd3RyYW4uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd3RyYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI4MTEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd3dHJhbi5jCkBAIC0wLDAgKzEsNjM4IEBACisNCisvKiBwbmd3dHJhbi5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyBmb3IgUE5HIHdyaXRlcnMNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjAgW0ZlYnJ1YXJ5IDE0LCAyMDEzXQ0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQNCisvKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgd2lzaGVzLiAgVGhlIG9yZGVyIG9mDQorICogdHJhbnNmb3JtYXRpb25zIGlzIHNpZ25pZmljYW50Lg0KKyAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucyIpOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkNCisgICAgICBpZiAocG5nX3B0ci0+d3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gIT0gTlVMTCkNCisgICAgICAgICAoKihwbmdfcHRyLT53cml0ZV91c2VyX3RyYW5zZm9ybV9mbikpIC8qIFVzZXIgd3JpdGUgdHJhbnNmb3JtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICovDQorICAgICAgICAgICAgIChwbmdfcHRyLCAgLyogcG5nX3B0ciAqLw0KKyAgICAgICAgICAgICByb3dfaW5mbywgIC8qIHJvd19pbmZvOiAqLw0KKyAgICAgICAgICAgICAgICAvKiAgcG5nX3VpbnRfMzIgd2lkdGg7ICAgICAgIHdpZHRoIG9mIHJvdyAqLw0KKyAgICAgICAgICAgICAgICAvKiAgcG5nX3NpemVfdCByb3dieXRlczsgICAgIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8NCisgICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICBjb2xvciB0eXBlIG9mIHBpeGVscyAqLw0KKyAgICAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgYml0X2RlcHRoOyAgICAgIGJpdCBkZXB0aCBvZiBzYW1wbGVzICovDQorICAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpICovDQorICAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgYml0cyBwZXIgcGl4ZWwgKGRlcHRoKmNoYW5uZWxzKSAqLw0KKyAgICAgICAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSk7ICAgICAgLyogc3RhcnQgb2YgcGl4ZWwgZGF0YSBmb3Igcm93ICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpDQorICAgICAgcG5nX2RvX3N0cmlwX2NoYW5uZWwocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxLA0KKyAgICAgICAgICEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApDQorICAgICAgcG5nX2RvX3BhY2tzd2FwKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9QQUNLX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDSykNCisgICAgICBwbmdfZG9fcGFjayhyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEsDQorICAgICAgICAgIChwbmdfdWludF8zMilwbmdfcHRyLT5iaXRfZGVwdGgpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQllURVMpDQorICAgICAgcG5nX2RvX3N3YXAocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpDQorICAgICAgcG5nX2RvX3NoaWZ0KHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwNCisgICAgICAgICAgJihwbmdfcHRyLT5zaGlmdCkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQUxQSEEpDQorICAgICAgcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEocm93X2luZm8sIHBuZ19wdHItPnJvd19idWYgKyAxKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQNCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkNCisgICAgICBwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhKHJvd19pbmZvLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9CR1JfU1VQUE9SVEVEDQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpDQorICAgICAgcG5nX2RvX2Jncihyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRA0KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pDQorICAgICAgcG5nX2RvX2ludmVydChyb3dfaW5mbywgcG5nX3B0ci0+cm93X2J1ZiArIDEpOw0KKyNlbmRpZg0KK30NCisNCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEDQorLyogUGFjayBwaXhlbHMgaW50byBieXRlcy4gIFBhc3MgdGhlIHRydWUgYml0IGRlcHRoIGluIGJpdF9kZXB0aC4gIFRoZQ0KKyAqIHJvd19pbmZvIGJpdCBkZXB0aCBzaG91bGQgYmUgOCAob25lIHBpeGVsIHBlciBieXRlKS4gIFRoZSBjaGFubmVscw0KKyAqIHNob3VsZCBiZSAxICh0aGlzIG9ubHkgaGFwcGVucyBvbiBncmF5c2NhbGUgYW5kIHBhbGV0dGVkIGltYWdlcykuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3BhY2socG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgYml0X2RlcHRoKQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19wYWNrIik7DQorDQorICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCAmJg0KKyAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9PSAxKQ0KKyAgIHsNCisgICAgICBzd2l0Y2ggKChpbnQpYml0X2RlcHRoKQ0KKyAgICAgIHsNCisgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7DQorICAgICAgICAgICAgaW50IG1hc2ssIHY7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgZHAgPSByb3c7DQorICAgICAgICAgICAgbWFzayA9IDB4ODA7DQorICAgICAgICAgICAgdiA9IDA7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoKnNwICE9IDApDQorICAgICAgICAgICAgICAgICAgdiB8PSBtYXNrOw0KKw0KKyAgICAgICAgICAgICAgIHNwKys7DQorDQorICAgICAgICAgICAgICAgaWYgKG1hc2sgPiAxKQ0KKyAgICAgICAgICAgICAgICAgIG1hc2sgPj49IDE7DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBtYXNrID0gMHg4MDsNCisgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsNCisgICAgICAgICAgICAgICAgICBkcCsrOw0KKyAgICAgICAgICAgICAgICAgIHYgPSAwOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKG1hc2sgIT0gMHg4MCkNCisgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsNCisNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOw0KKyAgICAgICAgICAgIGludCBzaGlmdCwgdjsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisNCisgICAgICAgICAgICBzcCA9IHJvdzsNCisgICAgICAgICAgICBkcCA9IHJvdzsNCisgICAgICAgICAgICBzaGlmdCA9IDY7DQorICAgICAgICAgICAgdiA9IDA7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZSB2YWx1ZTsNCisNCisgICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfYnl0ZSkoKnNwICYgMHgwMyk7DQorICAgICAgICAgICAgICAgdiB8PSAodmFsdWUgPDwgc2hpZnQpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7DQorICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7DQorICAgICAgICAgICAgICAgICAgZHArKzsNCisgICAgICAgICAgICAgICAgICB2ID0gMDsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7DQorDQorICAgICAgICAgICAgICAgc3ArKzsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDYpDQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7DQorDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsNCisgICAgICAgICAgICBpbnQgc2hpZnQsIHY7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgc3AgPSByb3c7DQorICAgICAgICAgICAgZHAgPSByb3c7DQorICAgICAgICAgICAgc2hpZnQgPSA0Ow0KKyAgICAgICAgICAgIHYgPSAwOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX2J5dGUgdmFsdWU7DQorDQorICAgICAgICAgICAgICAgdmFsdWUgPSAocG5nX2J5dGUpKCpzcCAmIDB4MGYpOw0KKyAgICAgICAgICAgICAgIHYgfD0gKHZhbHVlIDw8IHNoaWZ0KTsNCisNCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0Ow0KKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2Ow0KKyAgICAgICAgICAgICAgICAgIGRwKys7DQorICAgICAgICAgICAgICAgICAgdiA9IDA7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICBzaGlmdCAtPSA0Ow0KKw0KKyAgICAgICAgICAgICAgIHNwKys7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA0KQ0KKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2Ow0KKw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsNCisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGJpdF9kZXB0aCAqIHJvd19pbmZvLT5jaGFubmVscyk7DQorICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwNCisgICAgICAgICAgcm93X2luZm8tPndpZHRoKTsNCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEDQorLyogU2hpZnQgcGl4ZWwgdmFsdWVzIHRvIHRha2UgYWR2YW50YWdlIG9mIHdob2xlIHJhbmdlLiAgUGFzcyB0aGUNCisgKiB0cnVlIG51bWJlciBvZiBiaXRzIGluIGJpdF9kZXB0aC4gIFRoZSByb3cgc2hvdWxkIGJlIHBhY2tlZA0KKyAqIGFjY29yZGluZyB0byByb3dfaW5mby0+Yml0X2RlcHRoLiAgVGh1cywgaWYgeW91IGhhZCBhIHJvdyBvZg0KKyAqIGJpdCBkZXB0aCA0LCBidXQgdGhlIHBpeGVscyBvbmx5IGhhZCB2YWx1ZXMgZnJvbSAwIHRvIDcsIHlvdQ0KKyAqIHdvdWxkIHBhc3MgMyBhcyBiaXRfZGVwdGgsIGFuZCB0aGlzIHJvdXRpbmUgd291bGQgdHJhbnNsYXRlIHRoZQ0KKyAqIGRhdGEgdG8gMCB0byAxNS4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfZG9fc2hpZnQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywNCisgICAgcG5nX2NvbnN0X2NvbG9yXzhwIGJpdF9kZXB0aCkNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fc2hpZnQiKTsNCisNCisgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICB7DQorICAgICAgaW50IHNoaWZ0X3N0YXJ0WzRdLCBzaGlmdF9kZWNbNF07DQorICAgICAgaW50IGNoYW5uZWxzID0gMDsNCisNCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikNCisgICAgICB7DQorICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+cmVkOw0KKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPnJlZDsNCisgICAgICAgICBjaGFubmVscysrOw0KKw0KKyAgICAgICAgIHNoaWZ0X3N0YXJ0W2NoYW5uZWxzXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBiaXRfZGVwdGgtPmdyZWVuOw0KKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmdyZWVuOw0KKyAgICAgICAgIGNoYW5uZWxzKys7DQorDQorICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Ymx1ZTsNCisgICAgICAgICBzaGlmdF9kZWNbY2hhbm5lbHNdID0gYml0X2RlcHRoLT5ibHVlOw0KKyAgICAgICAgIGNoYW5uZWxzKys7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Z3JheTsNCisgICAgICAgICBzaGlmdF9kZWNbY2hhbm5lbHNdID0gYml0X2RlcHRoLT5ncmF5Ow0KKyAgICAgICAgIGNoYW5uZWxzKys7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQ0KKyAgICAgIHsNCisgICAgICAgICBzaGlmdF9zdGFydFtjaGFubmVsc10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gYml0X2RlcHRoLT5hbHBoYTsNCisgICAgICAgICBzaGlmdF9kZWNbY2hhbm5lbHNdID0gYml0X2RlcHRoLT5hbHBoYTsNCisgICAgICAgICBjaGFubmVscysrOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBXaXRoIGxvdyByb3cgZGVwdGhzLCBjb3VsZCBvbmx5IGJlIGdyYXlzY2FsZSwgc28gb25lIGNoYW5uZWwgKi8NCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsNCisgICAgICAgICBwbmdfc2l6ZV90IGk7DQorICAgICAgICAgdW5zaWduZWQgaW50IG1hc2s7DQorICAgICAgICAgcG5nX3NpemVfdCByb3dfYnl0ZXMgPSByb3dfaW5mby0+cm93Ynl0ZXM7DQorDQorICAgICAgICAgaWYgKGJpdF9kZXB0aC0+Z3JheSA9PSAxICYmIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikNCisgICAgICAgICAgICBtYXNrID0gMHg1NTsNCisNCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDQgJiYgYml0X2RlcHRoLT5ncmF5ID09IDMpDQorICAgICAgICAgICAgbWFzayA9IDB4MTE7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIG1hc2sgPSAweGZmOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfYnl0ZXM7IGkrKywgYnArKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgaW50IGo7DQorICAgICAgICAgICAgdW5zaWduZWQgaW50IHYsIG91dDsNCisNCisgICAgICAgICAgICB2ID0gKmJwOw0KKyAgICAgICAgICAgIG91dCA9IDA7DQorDQorICAgICAgICAgICAgZm9yIChqID0gc2hpZnRfc3RhcnRbMF07IGogPiAtc2hpZnRfZGVjWzBdOyBqIC09IHNoaWZ0X2RlY1swXSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaWYgKGogPiAwKQ0KKyAgICAgICAgICAgICAgICAgIG91dCB8PSB2IDw8IGo7DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIG91dCB8PSAodiA+PiAoLWopKSAmIG1hc2s7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICpicCA9IChwbmdfYnl0ZSkob3V0ICYgMHhmZik7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsNCisgICAgICAgICBwbmdfdWludF8zMiBpOw0KKyAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gY2hhbm5lbHMgKiByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyssIGJwKyspDQorICAgICAgICAgew0KKw0KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjID0gaSVjaGFubmVsczsNCisgICAgICAgICAgICBpbnQgajsNCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdiwgb3V0Ow0KKw0KKyAgICAgICAgICAgIHYgPSAqYnA7DQorICAgICAgICAgICAgb3V0ID0gMDsNCisNCisgICAgICAgICAgICBmb3IgKGogPSBzaGlmdF9zdGFydFtjXTsgaiA+IC1zaGlmdF9kZWNbY107IGogLT0gc2hpZnRfZGVjW2NdKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBpZiAoaiA+IDApDQorICAgICAgICAgICAgICAgICAgb3V0IHw9IHYgPDwgajsNCisNCisgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgb3V0IHw9IHYgPj4gKC1qKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgKmJwID0gKHBuZ19ieXRlKShvdXQgJiAweGZmKTsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgcG5nX2J5dGVwIGJwOw0KKyAgICAgICAgIHBuZ191aW50XzMyIGk7DQorICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSBjaGFubmVscyAqIHJvd19pbmZvLT53aWR0aDsNCisNCisgICAgICAgICBmb3IgKGJwID0gcm93LCBpID0gMDsgaSA8IGlzdG9wOyBpKyspDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjID0gaSVjaGFubmVsczsNCisgICAgICAgICAgICBpbnQgajsNCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUsIHY7DQorDQorICAgICAgICAgICAgdiA9IHBuZ19nZXRfdWludF8xNihicCk7DQorICAgICAgICAgICAgdmFsdWUgPSAwOw0KKw0KKyAgICAgICAgICAgIGZvciAoaiA9IHNoaWZ0X3N0YXJ0W2NdOyBqID4gLXNoaWZ0X2RlY1tjXTsgaiAtPSBzaGlmdF9kZWNbY10pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGlmIChqID4gMCkNCisgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSB2IDw8IGo7DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IHYgPj4gKC1qKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpKCh2YWx1ZSA+PiA4KSAmIDB4ZmYpOw0KKyAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSAmIDB4ZmYpOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVEDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykNCit7DQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSIpOw0KKw0KKyAgIHsNCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gQVJHQiB0byBSR0JBICovDQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBQVJSR0dCQiB0byBSUkdHQkJBQSAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOw0KKyAgICAgICAgICAgICAgIHNhdmVbMF0gPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgIHNhdmVbMV0gPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzBdOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzFdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorI2VuZGlmIC8qIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQgKi8NCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkNCisgICAgICB7DQorICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFHIHRvIEdBICovDQorICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisNCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQNCisgICAgICAgICBlbHNlDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBQUdHIHRvIEdHQUEgKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZVsyXTsNCisgICAgICAgICAgICAgICBzYXZlWzBdID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICBzYXZlWzFdID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVswXTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVsxXTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEICovDQorICAgICAgfQ0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQ0KK3sNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEiKTsNCisNCisgICB7DQorICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkNCisgICAgICB7DQorICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJHQkEgKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogRG9lcyBub3RoaW5nDQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBzcCs9MzsgZHAgPSBzcDsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUlJHR0JCQUEgKi8NCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgLyogRG9lcyBub3RoaW5nDQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7DQorICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICBzcCs9NjsgZHAgPSBzcDsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEICovDQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpDQorICAgICAgew0KKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpDQorICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHQSAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0dBQSAqLw0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAvKiBEb2VzIG5vdGhpbmcNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsNCisgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgIHNwKz0yOyBkcCA9IHNwOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOw0KKyAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorI2VuZGlmIC8qIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQgKi8NCisgICAgICB9DQorICAgfQ0KK30NCisjZW5kaWYNCisjZW5kaWYgLyogUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorLyogVW5kb2VzIGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nICAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb193cml0ZV9pbnRyYXBpeGVsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwiKTsNCisNCisgICBpZiAoKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQ0KKyAgIHsNCisgICAgICBpbnQgYnl0ZXNfcGVyX3BpeGVsOw0KKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYnl0ZXAgcnA7DQorICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisNCisgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQ0KKyAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDM7DQorDQorICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQ0KKyAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDQ7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJldHVybjsNCisNCisgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpDQorICAgICAgICAgew0KKyAgICAgICAgICAgICoocnApICAgICA9IChwbmdfYnl0ZSkoKCpycCAgICAgICAtICoocnAgKyAxKSkgJiAweGZmKTsNCisgICAgICAgICAgICAqKHJwICsgMikgPSAocG5nX2J5dGUpKCgqKHJwICsgMikgLSAqKHJwICsgMSkpICYgMHhmZik7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisNCisjaWZkZWYgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRA0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19ieXRlcCBycDsNCisgICAgICAgICBwbmdfdWludF8zMiBpOw0KKw0KKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpDQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNjsNCisNCisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpDQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IGJ5dGVzX3Blcl9waXhlbCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgczAgICA9ICgqKHJwICAgICkgPDwgOCkgfCAqKHJwICsgMSk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgczEgICA9ICgqKHJwICsgMikgPDwgOCkgfCAqKHJwICsgMyk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgczIgICA9ICgqKHJwICsgNCkgPDwgOCkgfCAqKHJwICsgNSk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcmVkICA9IChwbmdfdWludF8zMikoKHMwIC0gczEpICYgMHhmZmZmTCk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgYmx1ZSA9IChwbmdfdWludF8zMikoKHMyIC0gczEpICYgMHhmZmZmTCk7DQorICAgICAgICAgICAgKihycCAgICApID0gKHBuZ19ieXRlKSgocmVkID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgKihycCArIDEpID0gKHBuZ19ieXRlKShyZWQgJiAweGZmKTsNCisgICAgICAgICAgICAqKHJwICsgNCkgPSAocG5nX2J5dGUpKChibHVlID4+IDgpICYgMHhmZik7DQorICAgICAgICAgICAgKihycCArIDUpID0gKHBuZ19ieXRlKShibHVlICYgMHhmZik7DQorICAgICAgICAgfQ0KKyAgICAgIH0NCisjZW5kaWYgLyogUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRCAqLw0KKyAgIH0NCit9DQorI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8NCisjZW5kaWYvL19GUERGQVBJX01JTklfDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd3dXRpbC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd3dXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTU1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3d1dGlsLmMKQEAgLTAsMCArMSwzMDI0IEBACisNCisvKiBwbmd3dXRpbC5jIC0gdXRpbGl0aWVzIHRvIHdyaXRlIGEgUE5HIGZpbGUNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjIgW0FwcmlsIDI1LCAyMDEzXQ0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfRlhDT1JFX0ZFQVRVUkVfQUxMXykgfHwgZGVmaW5lZChfUE5HX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pDQorI2luY2x1ZGUgInBuZ3ByaXYuaCINCisNCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQNCisvKiBQbGFjZSBhIDMyLWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4gIFdlIHdvcmsNCisgKiB3aXRoIHVuc2lnbmVkIG51bWJlcnMgZm9yIGNvbnZlbmllbmNlLCBhbHRob3VnaCBvbmUgc3VwcG9ydGVkDQorICogYW5jaWxsYXJ5IGNodW5rIHVzZXMgc2lnbmVkICh0d28ncyBjb21wbGVtZW50KSBudW1iZXJzLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NhdmVfdWludF8zMihwbmdfYnl0ZXAgYnVmLCBwbmdfdWludF8zMiBpKQ0KK3sNCisgICBidWZbMF0gPSAocG5nX2J5dGUpKChpID4+IDI0KSAmIDB4ZmYpOw0KKyAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoKGkgPj4gMTYpICYgMHhmZik7DQorICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOw0KKyAgIGJ1ZlszXSA9IChwbmdfYnl0ZSkoaSAmIDB4ZmYpOw0KK30NCisNCisvKiBQbGFjZSBhIDE2LWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4NCisgKiBUaGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHVuc2lnbmVkIGludCwgbm90IHBuZ191aW50XzE2LA0KKyAqIGp1c3QgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9uIHByZS1BTlNJIEMgY29tcGlsZXJzLg0KKyAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3NhdmVfdWludF8xNihwbmdfYnl0ZXAgYnVmLCB1bnNpZ25lZCBpbnQgaSkNCit7DQorICAgYnVmWzBdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOw0KKyAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoaSAmIDB4ZmYpOw0KK30NCisjZW5kaWYNCisNCisvKiBTaW1wbGUgZnVuY3Rpb24gdG8gd3JpdGUgdGhlIHNpZ25hdHVyZS4gIElmIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuDQorICogdGhlIG1hZ2ljIGJ5dGVzIG9mIHRoZSBzaWduYXR1cmUsIG9yIG1vcmUgbGlrZWx5LCB0aGUgUE5HIHN0cmVhbSBpcw0KKyAqIGJlaW5nIGVtYmVkZGVkIGludG8gYW5vdGhlciBzdHJlYW0gYW5kIGRvZXNuJ3QgbmVlZCBpdHMgb3duIHNpZ25hdHVyZSwNCisgKiB3ZSBzaG91bGQgY2FsbCBwbmdfc2V0X3NpZ19ieXRlcygpIHRvIHRlbGwgbGlicG5nIGhvdyBtYW55IG9mIHRoZQ0KKyAqIGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfd3JpdGVfc2lnKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisgICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9Ow0KKw0KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVEDQorICAgLyogSW5mb3JtIHRoZSBJL08gY2FsbGJhY2sgdGhhdCB0aGUgc2lnbmF0dXJlIGlzIGJlaW5nIHdyaXR0ZW4gKi8NCisgICBwbmdfcHRyLT5pb19zdGF0ZSA9IFBOR19JT19XUklUSU5HIHwgUE5HX0lPX1NJR05BVFVSRTsNCisjZW5kaWYNCisNCisgICAvKiBXcml0ZSB0aGUgcmVzdCBvZiB0aGUgOCBieXRlIHNpZ25hdHVyZSAqLw0KKyAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsICZwbmdfc2lnbmF0dXJlW3BuZ19wdHItPnNpZ19ieXRlc10sDQorICAgICAgKHBuZ19zaXplX3QpKDggLSBwbmdfcHRyLT5zaWdfYnl0ZXMpKTsNCisNCisgICBpZiAocG5nX3B0ci0+c2lnX2J5dGVzIDwgMykNCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BOR19TSUdOQVRVUkU7DQorfQ0KKw0KKy8qIFdyaXRlIHRoZSBzdGFydCBvZiBhIFBORyBjaHVuay4gIFRoZSB0eXBlIGlzIHRoZSBjaHVuayB0eXBlLg0KKyAqIFRoZSB0b3RhbF9sZW5ndGggaXMgdGhlIHN1bSBvZiB0aGUgbGVuZ3RocyBvZiBhbGwgdGhlIGRhdGEgeW91IHdpbGwgYmUNCisgKiBwYXNzaW5nIGluIHBuZ193cml0ZV9jaHVua19kYXRhKCkuDQorICovDQorc3RhdGljIHZvaWQNCitwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBjaHVua19uYW1lLA0KKyAgICBwbmdfdWludF8zMiBsZW5ndGgpDQorew0KKyAgIHBuZ19ieXRlIGJ1Zls4XTsNCisNCisjaWYgZGVmaW5lZChQTkdfREVCVUcpICYmIChQTkdfREVCVUcgPiAwKQ0KKyAgIFBOR19DU1RSSU5HX0ZST01fQ0hVTksoYnVmLCBjaHVua19uYW1lKTsNCisgICBwbmdfZGVidWcyKDAsICJXcml0aW5nICVzIGNodW5rLCBsZW5ndGggPSAlbHUiLCBidWYsICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7DQorI2VuZGlmDQorDQorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorDQorI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCisgICAvKiBJbmZvcm0gdGhlIEkvTyBjYWxsYmFjayB0aGF0IHRoZSBjaHVuayBoZWFkZXIgaXMgYmVpbmcgd3JpdHRlbi4NCisgICAgKiBQTkdfSU9fQ0hVTktfSERSIHJlcXVpcmVzIGEgc2luZ2xlIEkvTyBjYWxsLg0KKyAgICAqLw0KKyAgIHBuZ19wdHItPmlvX3N0YXRlID0gUE5HX0lPX1dSSVRJTkcgfCBQTkdfSU9fQ0hVTktfSERSOw0KKyNlbmRpZg0KKw0KKyAgIC8qIFdyaXRlIHRoZSBsZW5ndGggYW5kIHRoZSBjaHVuayBuYW1lICovDQorICAgcG5nX3NhdmVfdWludF8zMihidWYsIGxlbmd0aCk7DQorICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCBjaHVua19uYW1lKTsNCisgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCBidWYsIDgpOw0KKw0KKyAgIC8qIFB1dCB0aGUgY2h1bmsgbmFtZSBpbnRvIHBuZ19wdHItPmNodW5rX25hbWUgKi8NCisgICBwbmdfcHRyLT5jaHVua19uYW1lID0gY2h1bmtfbmFtZTsNCisNCisgICAvKiBSZXNldCB0aGUgY3JjIGFuZCBydW4gaXQgb3ZlciB0aGUgY2h1bmsgbmFtZSAqLw0KKyAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7DQorDQorICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgYnVmICsgNCwgNCk7DQorDQorI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCisgICAvKiBJbmZvcm0gdGhlIEkvTyBjYWxsYmFjayB0aGF0IGNodW5rIGRhdGEgd2lsbCAocG9zc2libHkpIGJlIHdyaXR0ZW4uDQorICAgICogUE5HX0lPX0NIVU5LX0RBVEEgZG9lcyBOT1QgcmVxdWlyZSBhIHNwZWNpZmljIG51bWJlciBvZiBJL08gY2FsbHMuDQorICAgICovDQorICAgcG5nX3B0ci0+aW9fc3RhdGUgPSBQTkdfSU9fV1JJVElORyB8IFBOR19JT19DSFVOS19EQVRBOw0KKyNlbmRpZg0KK30NCisNCit2b2lkIFBOR0FQSQ0KK3BuZ193cml0ZV9jaHVua19zdGFydChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIGNodW5rX3N0cmluZywNCisgICAgcG5nX3VpbnRfMzIgbGVuZ3RoKQ0KK3sNCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIFBOR19DSFVOS19GUk9NX1NUUklORyhjaHVua19zdHJpbmcpLCBsZW5ndGgpOw0KK30NCisNCisvKiBXcml0ZSB0aGUgZGF0YSBvZiBhIFBORyBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX2hlYWRlcigpLg0KKyAqIE5vdGUgdGhhdCBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBhbGxvd2VkLCBhbmQgdGhhdCB0aGUNCisgKiBzdW0gb2YgdGhlIGxlbmd0aHMgZnJvbSB0aGVzZSBjYWxscyAqbXVzdCogYWRkIHVwIHRvIHRoZSB0b3RhbF9sZW5ndGgNCisgKiBnaXZlbiB0byBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKCkuDQorICovDQordm9pZCBQTkdBUEkNCitwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2J5dGVwIGRhdGEsDQorICAgIHBuZ19zaXplX3QgbGVuZ3RoKQ0KK3sNCisgICAvKiBXcml0ZSB0aGUgZGF0YSwgYW5kIHJ1biB0aGUgQ1JDIG92ZXIgaXQgKi8NCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisNCisgICBpZiAoZGF0YSAhPSBOVUxMICYmIGxlbmd0aCA+IDApDQorICAgew0KKyAgICAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7DQorDQorICAgICAgLyogVXBkYXRlIHRoZSBDUkMgYWZ0ZXIgd3JpdGluZyB0aGUgZGF0YSwNCisgICAgICAgKiBpbiBjYXNlIHRoYXQgdGhlIHVzZXIgSS9PIHJvdXRpbmUgYWx0ZXJzIGl0Lg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7DQorICAgfQ0KK30NCisNCisvKiBGaW5pc2ggYSBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX2hlYWRlcigpLiAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorICAgcG5nX2J5dGUgYnVmWzRdOw0KKw0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpIHJldHVybjsNCisNCisjaWZkZWYgUE5HX0lPX1NUQVRFX1NVUFBPUlRFRA0KKyAgIC8qIEluZm9ybSB0aGUgSS9PIGNhbGxiYWNrIHRoYXQgdGhlIGNodW5rIENSQyBpcyBiZWluZyB3cml0dGVuLg0KKyAgICAqIFBOR19JT19DSFVOS19DUkMgcmVxdWlyZXMgYSBzaW5nbGUgSS9PIGZ1bmN0aW9uIGNhbGwuDQorICAgICovDQorICAgcG5nX3B0ci0+aW9fc3RhdGUgPSBQTkdfSU9fV1JJVElORyB8IFBOR19JT19DSFVOS19DUkM7DQorI2VuZGlmDQorDQorICAgLyogV3JpdGUgdGhlIGNyYyBpbiBhIHNpbmdsZSBvcGVyYXRpb24gKi8NCisgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgcG5nX3B0ci0+Y3JjKTsNCisNCisgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTQpOw0KK30NCisNCisvKiBXcml0ZSBhIFBORyBjaHVuayBhbGwgYXQgb25jZS4gIFRoZSB0eXBlIGlzIGFuIGFycmF5IG9mIEFTQ0lJIGNoYXJhY3RlcnMNCisgKiByZXByZXNlbnRpbmcgdGhlIGNodW5rIG5hbWUuICBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGluDQorICogbGVuZ3RoLCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBudWxsIHRlcm1pbmF0ZWQuICBUbyBiZSBzYWZlLCBwYXNzIHRoZQ0KKyAqIHByZS1kZWZpbmVkIGNodW5rIG5hbWVzIGhlcmUsIGFuZCBpZiB5b3UgbmVlZCBhIG5ldyBvbmUsIGRlZmluZSBpdA0KKyAqIHdoZXJlIHRoZSBvdGhlcnMgYXJlIGRlZmluZWQuICBUaGUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuDQorICogQWxsIHRoZSBkYXRhIG11c3QgYmUgcHJlc2VudC4gIElmIHRoYXQgaXMgbm90IHBvc3NpYmxlLCB1c2UgdGhlDQorICogcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCksIHBuZ193cml0ZV9jaHVua19kYXRhKCksIGFuZCBwbmdfd3JpdGVfY2h1bmtfZW5kKCkNCisgKiBmdW5jdGlvbnMgaW5zdGVhZC4NCisgKi8NCitzdGF0aWMgdm9pZA0KK3BuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSwNCisgICBwbmdfY29uc3RfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpDQorew0KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgIC8qIE9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzICdsZW5ndGgnIG1heSBub3QgZml0IGluIGEgcG5nX3VpbnRfMzIuICovDQorICAgaWYgKGxlbmd0aCA+IFBOR19VSU5UXzMxX01BWCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImxlbmd0aCBleGNlZWRzIFBORyBtYXhpbWEiKTsNCisNCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIGNodW5rX25hbWUsIChwbmdfdWludF8zMilsZW5ndGgpOw0KKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7DQorICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsNCit9DQorDQorLyogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2FsbHMgdGhlIGludGVybmFsIGZ1bmN0aW9uIGFib3ZlLiAqLw0KK3ZvaWQgUE5HQVBJDQorcG5nX3dyaXRlX2NodW5rKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAgY2h1bmtfc3RyaW5nLA0KKyAgIHBuZ19jb25zdF9ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkNCit7DQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIFBOR19DSFVOS19GUk9NX1NUUklORyhjaHVua19zdHJpbmcpLCBkYXRhLA0KKyAgICAgIGxlbmd0aCk7DQorfQ0KKw0KKy8qIFRoaXMgaXMgdXNlZCBiZWxvdyB0byBmaW5kIHRoZSBzaXplIG9mIGFuIGltYWdlIHRvIHBhc3MgdG8gcG5nX2RlZmxhdGVfY2xhaW0sDQorICogc28gaXQgb25seSBuZWVkcyB0byBiZSBhY2N1cmF0ZSBpZiB0aGUgc2l6ZSBpcyBsZXNzIHRoYW4gMTYzODQgYnl0ZXMgKHRoZQ0KKyAqIHBvaW50IGF0IHdoaWNoIGEgbG93ZXIgTFogd2luZG93IHNpemUgY2FuIGJlIHVzZWQuKQ0KKyAqLw0KK3N0YXRpYyBwbmdfYWxsb2Nfc2l6ZV90DQorcG5nX2ltYWdlX3NpemUocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIC8qIE9ubHkgcmV0dXJuIHNpemVzIHVwIHRvIHRoZSBtYXhpbXVtIG9mIGEgcG5nX3VpbnRfMzIsIGRvIHRoaXMgYnkgbGltaXRpbmcNCisgICAgKiB0aGUgd2lkdGggYW5kIGhlaWdodCB1c2VkIHRvIDE1IGJpdHMuDQorICAgICovDQorICAgcG5nX3VpbnRfMzIgaCA9IHBuZ19wdHItPmhlaWdodDsNCisNCisgICBpZiAocG5nX3B0ci0+cm93Ynl0ZXMgPCAzMjc2OCAmJiBoIDwgMzI3NjgpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBJbnRlcmxhY2luZyBtYWtlcyB0aGUgaW1hZ2UgbGFyZ2VyIGJlY2F1c2Ugb2YgdGhlIHJlcGxpY2F0aW9uIG9mDQorICAgICAgICAgICogYm90aCB0aGUgZmlsdGVyIGJ5dGUgYW5kIHRoZSBwYWRkaW5nIHRvIGEgYnl0ZSBib3VuZGFyeS4NCisgICAgICAgICAgKi8NCisgICAgICAgICBwbmdfdWludF8zMiB3ID0gcG5nX3B0ci0+d2lkdGg7DQorICAgICAgICAgdW5zaWduZWQgaW50IHBkID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7DQorICAgICAgICAgcG5nX2FsbG9jX3NpemVfdCBjYl9iYXNlOw0KKyAgICAgICAgIGludCBwYXNzOw0KKw0KKyAgICAgICAgIGZvciAoY2JfYmFzZT0wLCBwYXNzPTA7IHBhc3M8PTY7ICsrcGFzcykNCisgICAgICAgICB7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcHcgPSBQTkdfUEFTU19DT0xTKHcsIHBhc3MpOw0KKw0KKyAgICAgICAgICAgIGlmIChwdyA+IDApDQorICAgICAgICAgICAgICAgY2JfYmFzZSArPSAoUE5HX1JPV0JZVEVTKHBkLCBwdykrMSkgKiBQTkdfUEFTU19ST1dTKGgsIHBhc3MpOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICByZXR1cm4gY2JfYmFzZTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHJldHVybiAocG5nX3B0ci0+cm93Ynl0ZXMrMSkgKiBoOw0KKyAgIH0NCisNCisgICBlbHNlDQorICAgICAgcmV0dXJuIDB4ZmZmZmZmZmZVOw0KK30NCisNCisjaWZkZWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQNCisgICAvKiBUaGlzIGlzIHRoZSBjb2RlIHRvIGhhY2sgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gKHRoZQ0KKyAgICAqIGRlZmxhdGUgaGVhZGVyKSB0byBjb3JyZWN0IHRoZSB3aW5kb3dCaXRzIHZhbHVlIHRvIG1hdGNoIHRoZSBhY3R1YWwgZGF0YQ0KKyAgICAqIHNpemUuICBOb3RlIHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgKnVuY29tcHJlc3NlZCogc2l6ZSBidXQgdGhlDQorICAgICogZmlyc3QgYXJndW1lbnQgaXMgdGhlICpjb21wcmVzc2VkKiBkYXRhIChhbmQgaXQgbXVzdCBiZSBkZWZsYXRlDQorICAgICogY29tcHJlc3NlZC4pDQorICAgICovDQorc3RhdGljIHZvaWQNCitvcHRpbWl6ZV9jbWYocG5nX2J5dGVwIGRhdGEsIHBuZ19hbGxvY19zaXplX3QgZGF0YV9zaXplKQ0KK3sNCisgICAvKiBPcHRpbWl6ZSB0aGUgQ01GIGZpZWxkIGluIHRoZSB6bGliIHN0cmVhbS4gIFRoZSByZXN1bHRhbnQgemxpYiBzdHJlYW0gaXMNCisgICAgKiBzdGlsbCBjb21wbGlhbnQgdG8gdGhlIHN0cmVhbSBzcGVjaWZpY2F0aW9uLg0KKyAgICAqLw0KKyAgIGlmIChkYXRhX3NpemUgPD0gMTYzODQpIC8qIGVsc2Ugd2luZG93Qml0cyBtdXN0IGJlIDE1ICovDQorICAgew0KKyAgICAgIHVuc2lnbmVkIGludCB6X2NtZiA9IGRhdGFbMF07ICAvKiB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCBhbmQgZmxhZ3MgKi8NCisNCisgICAgICBpZiAoKHpfY21mICYgMHgwZikgPT0gOCAmJiAoel9jbWYgJiAweGYwKSA8PSAweDcwKQ0KKyAgICAgIHsNCisgICAgICAgICB1bnNpZ25lZCBpbnQgel9jaW5mbzsNCisgICAgICAgICB1bnNpZ25lZCBpbnQgaGFsZl96X3dpbmRvd19zaXplOw0KKw0KKyAgICAgICAgIHpfY2luZm8gPSB6X2NtZiA+PiA0Ow0KKyAgICAgICAgIGhhbGZfel93aW5kb3dfc2l6ZSA9IDFVIDw8ICh6X2NpbmZvICsgNyk7DQorDQorICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8PSBoYWxmX3pfd2luZG93X3NpemUpIC8qIGVsc2Ugbm8gY2hhbmdlICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB0bXA7DQorDQorICAgICAgICAgICAgZG8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgaGFsZl96X3dpbmRvd19zaXplID4+PSAxOw0KKyAgICAgICAgICAgICAgIC0tel9jaW5mbzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKHpfY2luZm8gPiAwICYmIGRhdGFfc2l6ZSA8PSBoYWxmX3pfd2luZG93X3NpemUpOw0KKw0KKyAgICAgICAgICAgIHpfY21mID0gKHpfY21mICYgMHgwZikgfCAoel9jaW5mbyA8PCA0KTsNCisNCisgICAgICAgICAgICBkYXRhWzBdID0gKHBuZ19ieXRlKXpfY21mOw0KKyAgICAgICAgICAgIHRtcCA9IGRhdGFbMV0gJiAweGUwOw0KKyAgICAgICAgICAgIHRtcCArPSAweDFmIC0gKCh6X2NtZiA8PCA4KSArIHRtcCkgJSAweDFmOw0KKyAgICAgICAgICAgIGRhdGFbMV0gPSAocG5nX2J5dGUpdG1wOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgfQ0KK30NCisjZWxzZQ0KKyMgIGRlZmluZSBvcHRpbWl6ZV9jbWYoZHAsZGwpICgodm9pZCkwKQ0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfT1BUSU1JWkVfQ01GX1NVUFBPUlRFRCAqLw0KKw0KKy8qIEluaXRpYWxpemUgdGhlIGNvbXByZXNzb3IgZm9yIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIGNvbXByZXNzaW9uLiAqLw0KK3N0YXRpYyBpbnQNCitwbmdfZGVmbGF0ZV9jbGFpbShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgb3duZXIsDQorICAgcG5nX2FsbG9jX3NpemVfdCBkYXRhX3NpemUpDQorew0KKyAgIGlmIChwbmdfcHRyLT56b3duZXIgIT0gMCkNCisgICB7DQorICAgICAgY2hhciBtc2dbNjRdOw0KKw0KKyAgICAgIFBOR19TVFJJTkdfRlJPTV9DSFVOSyhtc2csIG93bmVyKTsNCisgICAgICBtc2dbNF0gPSAnOic7DQorICAgICAgbXNnWzVdID0gJyAnOw0KKyAgICAgIFBOR19TVFJJTkdfRlJPTV9DSFVOSyhtc2crNiwgcG5nX3B0ci0+em93bmVyKTsNCisgICAgICAvKiBTbyB0aGUgbWVzc2FnZSB0aGF0IHJlc3VsdHMgaXMgIjxjaHVuaz4gdXNpbmcgenN0cmVhbSI7IHRoaXMgaXMgYW4NCisgICAgICAgKiBpbnRlcm5hbCBlcnJvciwgYnV0IGlzIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuICBpMThuIHJlcXVpcmVtZW50cw0KKyAgICAgICAqIGFyZSBtaW5pbWFsLg0KKyAgICAgICAqLw0KKyAgICAgICh2b2lkKXBuZ19zYWZlY2F0KG1zZywgKHNpemVvZiBtc2cpLCAxMCwgIiB1c2luZyB6c3RyZWFtIik7DQorIyAgICAgaWYgUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgPj0gUE5HX0xJQlBOR19CVUlMRF9SQw0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7DQorDQorICAgICAgICAgLyogQXR0ZW1wdCBzYW5lIGVycm9yIHJlY292ZXJ5ICovDQorICAgICAgICAgaWYgKHBuZ19wdHItPnpvd25lciA9PSBwbmdfSURBVCkgLyogZG9uJ3Qgc3RlYWwgZnJvbSBJREFUICovDQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubXNnID0gUE5HWl9NU0dfQ0FTVCgiaW4gdXNlIGJ5IElEQVQiKTsNCisgICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIHBuZ19wdHItPnpvd25lciA9IDA7DQorIyAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOw0KKyMgICAgIGVuZGlmDQorICAgfQ0KKw0KKyAgIHsNCisgICAgICBpbnQgbGV2ZWwgPSBwbmdfcHRyLT56bGliX2xldmVsOw0KKyAgICAgIGludCBtZXRob2QgPSBwbmdfcHRyLT56bGliX21ldGhvZDsNCisgICAgICBpbnQgd2luZG93Qml0cyA9IHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHM7DQorICAgICAgaW50IG1lbUxldmVsID0gcG5nX3B0ci0+emxpYl9tZW1fbGV2ZWw7DQorICAgICAgaW50IHN0cmF0ZWd5OyAvKiBzZXQgYmVsb3cgKi8NCisgICAgICBpbnQgcmV0OyAvKiB6bGliIHJldHVybiBjb2RlICovDQorDQorICAgICAgaWYgKG93bmVyID09IHBuZ19JREFUKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9TVFJBVEVHWSkNCisgICAgICAgICAgICBzdHJhdGVneSA9IHBuZ19wdHItPnpsaWJfc3RyYXRlZ3k7DQorDQorICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICE9IFBOR19GSUxURVJfTk9ORSkNCisgICAgICAgICAgICBzdHJhdGVneSA9IFBOR19aX0RFRkFVTFRfU1RSQVRFR1k7DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gUE5HX1pfREVGQVVMVF9OT0ZJTFRFUl9TVFJBVEVHWTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisjICAgICAgICBpZmRlZiBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVEDQorICAgICAgICAgICAgbGV2ZWwgPSBwbmdfcHRyLT56bGliX3RleHRfbGV2ZWw7DQorICAgICAgICAgICAgbWV0aG9kID0gcG5nX3B0ci0+emxpYl90ZXh0X21ldGhvZDsNCisgICAgICAgICAgICB3aW5kb3dCaXRzID0gcG5nX3B0ci0+emxpYl90ZXh0X3dpbmRvd19iaXRzOw0KKyAgICAgICAgICAgIG1lbUxldmVsID0gcG5nX3B0ci0+emxpYl90ZXh0X21lbV9sZXZlbDsNCisgICAgICAgICAgICBzdHJhdGVneSA9IHBuZ19wdHItPnpsaWJfdGV4dF9zdHJhdGVneTsNCisjICAgICAgICBlbHNlDQorICAgICAgICAgICAgLyogSWYgY3VzdG9taXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHRoZSB2YWx1ZXMgYWxsIGNvbWUgZnJvbSB0aGUNCisgICAgICAgICAgICAgKiBJREFUIHZhbHVlcyBleGNlcHQgZm9yIHRoZSBzdHJhdGVneSwgd2hpY2ggaXMgZml4ZWQgdG8gdGhlDQorICAgICAgICAgICAgICogZGVmYXVsdC4gIChUaGlzIGlzIHRoZSBwcmUtMS42LjAgYmVoYXZpb3IgdG9vLCBhbHRob3VnaCBpdCB3YXMNCisgICAgICAgICAgICAgKiBpbXBsZW1lbnRlZCBpbiBhIHZlcnkgZGlmZmVyZW50IHdheS4pDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1k7DQorIyAgICAgICAgZW5kaWYNCisgICAgICB9DQorDQorICAgICAgLyogQWRqdXN0ICd3aW5kb3dCaXRzJyBkb3duIGlmIGxhcmdlciB0aGFuICdkYXRhX3NpemUnOyB0byBzdG9wIHRoaXMNCisgICAgICAgKiBoYXBwZW5pbmcganVzdCBwYXNzIDMyNzY4IGFzIHRoZSBkYXRhX3NpemUgcGFyYW1ldGVyLiAgTm90aWNlIHRoYXQgemxpYg0KKyAgICAgICAqIHJlcXVpcmVzIGFuIGV4dHJhIDI2MiBieXRlcyBpbiB0aGUgd2luZG93IGluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHRvIGJlDQorICAgICAgICogYWJsZSB0byBzZWUgdGhlIHdob2xlIG9mIHRoZSBkYXRhLCBzbyBpZiBkYXRhX3NpemUrMjYyIHRha2VzIHVzIHRvIHRoZQ0KKyAgICAgICAqIG5leHQgd2luZG93Qml0cyBzaXplIHdlIG5lZWQgdG8gZml4IHVwIHRoZSB2YWx1ZSBsYXRlci4gIChCZWNhdXNlIGV2ZW4NCisgICAgICAgKiB0aG91Z2ggZGVmbGF0ZSBuZWVkcyB0aGUgZXh0cmEgd2luZG93LCBpbmZsYXRlIGRvZXMgbm90ISkNCisgICAgICAgKi8NCisgICAgICBpZiAoZGF0YV9zaXplIDw9IDE2Mzg0KQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBJTVBMRU1FTlRBVElPTiBOT1RFOiB0aGlzICdoYWxmX3dpbmRvd19zaXplJyBzdHVmZiBpcyBvbmx5IGhlcmUgdG8NCisgICAgICAgICAgKiB3b3JrIHJvdW5kIGEgTWljcm9zb2Z0IFZpc3VhbCBDIG1pc2JlaGF2aW9yIHdoaWNoLCBjb250cmFyeSB0byBDLTkwLA0KKyAgICAgICAgICAqIHdpZGVucyB0aGUgcmVzdWx0IG9mIHRoZSBmb2xsb3dpbmcgc2hpZnQgdG8gNjQtYml0cyBpZiAoYW5kLA0KKyAgICAgICAgICAqIGFwcGFyZW50bHksIG9ubHkgaWYpIGl0IGlzIHVzZWQgaW4gYSB0ZXN0Lg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHVuc2lnbmVkIGludCBoYWxmX3dpbmRvd19zaXplID0gMVUgPDwgKHdpbmRvd0JpdHMtMSk7DQorDQorICAgICAgICAgd2hpbGUgKGRhdGFfc2l6ZSArIDI2MiA8PSBoYWxmX3dpbmRvd19zaXplKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBoYWxmX3dpbmRvd19zaXplID4+PSAxOw0KKyAgICAgICAgICAgIC0td2luZG93Qml0czsNCisgICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIENoZWNrIGFnYWluc3QgdGhlIHByZXZpb3VzIGluaXRpYWxpemVkIHZhbHVlcywgaWYgYW55LiAqLw0KKyAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aU1RSRUFNX0lOSVRJQUxJWkVEKSAmJg0KKyAgICAgICAgIChwbmdfcHRyLT56bGliX3NldF9sZXZlbCAhPSBsZXZlbCB8fA0KKyAgICAgICAgIHBuZ19wdHItPnpsaWJfc2V0X21ldGhvZCAhPSBtZXRob2QgfHwNCisgICAgICAgICBwbmdfcHRyLT56bGliX3NldF93aW5kb3dfYml0cyAhPSB3aW5kb3dCaXRzIHx8DQorICAgICAgICAgcG5nX3B0ci0+emxpYl9zZXRfbWVtX2xldmVsICE9IG1lbUxldmVsIHx8DQorICAgICAgICAgcG5nX3B0ci0+emxpYl9zZXRfc3RyYXRlZ3kgIT0gc3RyYXRlZ3kpKQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAoZGVmbGF0ZUVuZCgmcG5nX3B0ci0+enN0cmVhbSkgIT0gWl9PSykNCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiZGVmbGF0ZUVuZCBmYWlsZWQgKGlnbm9yZWQpIik7DQorDQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1pTVFJFQU1fSU5JVElBTElaRUQ7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIEZvciBzYWZldHkgY2xlYXIgb3V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHBvaW50ZXJzIChjdXJyZW50bHkgemxpYg0KKyAgICAgICAqIGRvZXNuJ3QgdXNlIHRoZW0gb24gSW5pdCwgYnV0IGl0IG1pZ2h0IGluIHRoZSBmdXR1cmUpLg0KKyAgICAgICAqLw0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IE5VTEw7DQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7DQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IE5VTEw7DQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAwOw0KKw0KKyAgICAgIC8qIE5vdyBpbml0aWFsaXplIGlmIHJlcXVpcmVkLCBzZXR0aW5nIHRoZSBuZXcgcGFyYW1ldGVycywgb3RoZXJ3aXNlIGp1c3QNCisgICAgICAgKiB0byBhIHNpbXBsZSByZXNldCB0byB0aGUgcHJldmlvdXMgcGFyYW1ldGVycy4NCisgICAgICAgKi8NCisgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aU1RSRUFNX0lOSVRJQUxJWkVEKQ0KKyAgICAgICAgIHJldCA9IGRlZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSk7DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoJnBuZ19wdHItPnpzdHJlYW0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsDQorICAgICAgICAgICAgbWVtTGV2ZWwsIHN0cmF0ZWd5KTsNCisNCisgICAgICAgICBpZiAocmV0ID09IFpfT0spDQorICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRDsNCisgICAgICB9DQorDQorICAgICAgLyogVGhlIHJldHVybiBjb2RlIGlzIGZyb20gZWl0aGVyIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlSW5pdDI7IHRoZXkgaGF2ZQ0KKyAgICAgICAqIHByZXR0eSBtdWNoIHRoZSBzYW1lIHNldCBvZiBlcnJvciBjb2Rlcy4NCisgICAgICAgKi8NCisgICAgICBpZiAocmV0ID09IFpfT0spDQorICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gb3duZXI7DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIHJldCk7DQorDQorICAgICAgcmV0dXJuIHJldDsNCisgICB9DQorfQ0KKw0KKy8qIENsZWFuIHVwIChvciB0cmltKSBhIGxpbmtlZCBsaXN0IG9mIGNvbXByZXNzaW9uIGJ1ZmZlcnMuICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2ZyZWVfYnVmZmVyX2xpc3QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb21wcmVzc2lvbl9idWZmZXJwICpsaXN0cCkNCit7DQorICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgbGlzdCA9ICpsaXN0cDsNCisNCisgICBpZiAobGlzdCAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICAqbGlzdHAgPSBOVUxMOw0KKw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgIHBuZ19jb21wcmVzc2lvbl9idWZmZXJwIG5leHQgPSBsaXN0LT5uZXh0Ow0KKw0KKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGxpc3QpOw0KKyAgICAgICAgIGxpc3QgPSBuZXh0Ow0KKyAgICAgIH0NCisgICAgICB3aGlsZSAobGlzdCAhPSBOVUxMKTsNCisgICB9DQorfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfQ09NUFJFU1NFRF9URVhUX1NVUFBPUlRFRA0KKy8qIFRoaXMgcGFpciBvZiBmdW5jdGlvbnMgZW5jYXBzdWxhdGVzIHRoZSBvcGVyYXRpb24gb2YgKGEpIGNvbXByZXNzaW5nIGENCisgKiB0ZXh0IHN0cmluZywgYW5kIChiKSBpc3N1aW5nIGl0IGxhdGVyIGFzIGEgc2VyaWVzIG9mIGNodW5rIGRhdGEgd3JpdGVzLg0KKyAqIFRoZSBjb21wcmVzc2lvbl9zdGF0ZSBzdHJ1Y3R1cmUgaXMgc2hhcmVkIGNvbnRleHQgZm9yIHRoZXNlIGZ1bmN0aW9ucw0KKyAqIHNldCB1cCBieSB0aGUgY2FsbGVyIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgcmVsZXZhbnQgbG9jYWwgdmFyaWFibGVzLg0KKyAqDQorICogY29tcHJlc3Npb25fYnVmZmVyIChuZXcgaW4gMS42LjApIGlzIGp1c3QgYSBsaW5rZWQgbGlzdCBvZiB6YnVmZmVyX3NpemUNCisgKiB0ZW1wb3JhcnkgYnVmZmVycy4gIEZyb20gMS42LjAgaXQgaXMgcmV0YWluZWQgaW4gcG5nX3N0cnVjdCBzbyB0aGF0IGl0IHdpbGwNCisgKiBiZSBjb3JyZWN0bHkgZnJlZWQgaW4gdGhlIGV2ZW50IG9mIGEgd3JpdGUgZXJyb3IgKHByZXZpb3VzIGltcGxlbWVudGF0aW9ucw0KKyAqIGp1c3QgbGVha2VkIG1lbW9yeS4pDQorICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgcG5nX2NvbnN0X2J5dGVwICAgICAgaW5wdXQ7ICAgICAgICAvKiBUaGUgdW5jb21wcmVzc2VkIGlucHV0IGRhdGEgKi8NCisgICBwbmdfYWxsb2Nfc2l6ZV90ICAgICBpbnB1dF9sZW47ICAgIC8qIEl0cyBsZW5ndGggKi8NCisgICBwbmdfdWludF8zMiAgICAgICAgICBvdXRwdXRfbGVuOyAgIC8qIEZpbmFsIGNvbXByZXNzZWQgbGVuZ3RoICovDQorICAgcG5nX2J5dGUgICAgICAgICAgICAgb3V0cHV0WzEwMjRdOyAvKiBGaXJzdCBibG9jayBvZiBvdXRwdXQgKi8NCit9IGNvbXByZXNzaW9uX3N0YXRlOw0KKw0KK3N0YXRpYyB2b2lkDQorcG5nX3RleHRfY29tcHJlc3NfaW5pdChjb21wcmVzc2lvbl9zdGF0ZSAqY29tcCwgcG5nX2NvbnN0X2J5dGVwIGlucHV0LA0KKyAgIHBuZ19hbGxvY19zaXplX3QgaW5wdXRfbGVuKQ0KK3sNCisgICBjb21wLT5pbnB1dCA9IGlucHV0Ow0KKyAgIGNvbXAtPmlucHV0X2xlbiA9IGlucHV0X2xlbjsNCisgICBjb21wLT5vdXRwdXRfbGVuID0gMDsNCit9DQorDQorLyogQ29tcHJlc3MgdGhlIGRhdGEgaW4gdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlucHV0ICovDQorc3RhdGljIGludA0KK3BuZ190ZXh0X2NvbXByZXNzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBjaHVua19uYW1lLA0KKyAgIGNvbXByZXNzaW9uX3N0YXRlICpjb21wLCBwbmdfdWludF8zMiBwcmVmaXhfbGVuKQ0KK3sNCisgICBpbnQgcmV0Ow0KKw0KKyAgIC8qIFRvIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGl0IGlzIG5lY2Vzc2FyeSB0byBmaXJzdCBjb21wcmVzcyB0aGUNCisgICAgKiBpbnB1dCwgdGhlIHJlc3VsdCBpcyBidWZmZXJlZCByYXRoZXIgdGhhbiB1c2luZyB0aGUgdHdvLXBhc3MgYWxnb3JpdGhtDQorICAgICogdGhhdCBpcyB1c2VkIG9uIHRoZSBpbmZsYXRlIHNpZGU7IGRlZmxhdGUgaXMgYXNzdW1lZCB0byBiZSBzbG93ZXIgYW5kIGENCisgICAgKiBQTkcgd3JpdGVyIGlzIGFzc3VtZWQgdG8gaGF2ZSBtb3JlIG1lbW9yeSBhdmFpbGFibGUgdGhhbiBhIFBORyByZWFkZXIuDQorICAgICoNCisgICAgKiBJTVBMRU1FTlRBVElPTiBOT1RFOiB0aGUgemxpYiBBUEkgZGVmbGF0ZUJvdW5kKCkgY2FuIGJlIHVzZWQgdG8gZmluZCBhbg0KKyAgICAqIHVwcGVyIGxpbWl0IG9uIHRoZSBvdXRwdXQgc2l6ZSwgYnV0IGl0IGlzIGFsd2F5cyBiaWdnZXIgdGhhbiB0aGUgaW5wdXQNCisgICAgKiBzaXplIHNvIGl0IGlzIGxpa2VseSB0byBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgdGhpcyBsaW5rZWQtbGlzdA0KKyAgICAqIGFwcHJvYWNoLg0KKyAgICAqLw0KKyAgIHJldCA9IHBuZ19kZWZsYXRlX2NsYWltKHBuZ19wdHIsIGNodW5rX25hbWUsIGNvbXAtPmlucHV0X2xlbik7DQorDQorICAgaWYgKHJldCAhPSBaX09LKQ0KKyAgICAgIHJldHVybiByZXQ7DQorDQorICAgLyogU2V0IHVwIHRoZSBjb21wcmVzc2lvbiBidWZmZXJzLCB3ZSBuZWVkIGEgbG9vcCBoZXJlIHRvIGF2b2lkIG92ZXJmbG93aW5nIGENCisgICAgKiB1SW50LiAgVXNlIFpMSUJfSU9fTUFYIHRvIGxpbWl0IHRoZSBpbnB1dC4gIFRoZSBvdXRwdXQgaXMgYWx3YXlzIGxpbWl0ZWQNCisgICAgKiBieSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHRoYXQuICBTaW5jZSB0aGlzDQorICAgICogaXMgQU5TSS1DIHdlIGtub3cgdGhhdCBhbiAnaW50JywgaGVuY2UgYSB1SW50LCBpcyBhbHdheXMgYXQgbGVhc3QgMTYgYml0cw0KKyAgICAqIGluIHNpemUuDQorICAgICovDQorICAgew0KKyAgICAgIHBuZ19jb21wcmVzc2lvbl9idWZmZXJwICplbmQgPSAmcG5nX3B0ci0+emJ1ZmZlcl9saXN0Ow0KKyAgICAgIHBuZ19hbGxvY19zaXplX3QgaW5wdXRfbGVuID0gY29tcC0+aW5wdXRfbGVuOyAvKiBtYXkgYmUgemVybyEgKi8NCisgICAgICBwbmdfdWludF8zMiBvdXRwdXRfbGVuOw0KKw0KKyAgICAgIC8qIHpsaWIgdXBkYXRlcyB0aGVzZSBmb3IgdXM6ICovDQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gUE5HWl9JTlBVVF9DQVNUKGNvbXAtPmlucHV0KTsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsgLyogU2V0IGJlbG93ICovDQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IGNvbXAtPm91dHB1dDsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IChzaXplb2YgY29tcC0+b3V0cHV0KTsNCisNCisgICAgICBvdXRwdXRfbGVuID0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7DQorDQorICAgICAgZG8NCisgICAgICB7DQorICAgICAgICAgdUludCBhdmFpbF9pbiA9IFpMSUJfSU9fTUFYOw0KKw0KKyAgICAgICAgIGlmIChhdmFpbF9pbiA+IGlucHV0X2xlbikNCisgICAgICAgICAgICBhdmFpbF9pbiA9ICh1SW50KWlucHV0X2xlbjsNCisNCisgICAgICAgICBpbnB1dF9sZW4gLT0gYXZhaWxfaW47DQorDQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IGF2YWlsX2luOw0KKw0KKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfY29tcHJlc3Npb25fYnVmZmVyICpuZXh0Ow0KKw0KKyAgICAgICAgICAgIC8qIENodW5rIGRhdGEgaXMgbGltaXRlZCB0byAyXjMxIGJ5dGVzIGluIGxlbmd0aCwgc28gdGhlIHByZWZpeA0KKyAgICAgICAgICAgICAqIGxlbmd0aCBtdXN0IGJlIGNvdW50ZWQgaGVyZS4NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAob3V0cHV0X2xlbiArIHByZWZpeF9sZW4gPiBQTkdfVUlOVF8zMV9NQVgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHJldCA9IFpfTUVNX0VSUk9SOw0KKyAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvKiBOZWVkIGEgbmV3IChtYWxsb2MnZWQpIGJ1ZmZlciwgYnV0IHRoZXJlIG1heSBiZSBvbmUgcHJlc2VudA0KKyAgICAgICAgICAgICAqIGFscmVhZHkuDQorICAgICAgICAgICAgICovDQorICAgICAgICAgICAgbmV4dCA9ICplbmQ7DQorICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgbmV4dCA9IHBuZ192b2lkY2FzdChwbmdfY29tcHJlc3Npb25fYnVmZmVycCwgcG5nX21hbGxvY19iYXNlDQorICAgICAgICAgICAgICAgICAgKHBuZ19wdHIsIFBOR19DT01QUkVTU0lPTl9CVUZGRVJfU0laRShwbmdfcHRyKSkpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpDQorICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgIHJldCA9IFpfTUVNX0VSUk9SOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAvKiBMaW5rIGluIHRoaXMgYnVmZmVyIChzbyB0aGF0IGl0IHdpbGwgYmUgZnJlZWQgbGF0ZXIpICovDQorICAgICAgICAgICAgICAgbmV4dC0+bmV4dCA9IE5VTEw7DQorICAgICAgICAgICAgICAgKmVuZCA9IG5leHQ7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBuZXh0LT5vdXRwdXQ7DQorICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSBwbmdfcHRyLT56YnVmZmVyX3NpemU7DQorICAgICAgICAgICAgb3V0cHV0X2xlbiArPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsNCisNCisgICAgICAgICAgICAvKiBNb3ZlICdlbmQnIHRvIHRoZSBuZXh0IGJ1ZmZlciBwb2ludGVyLiAqLw0KKyAgICAgICAgICAgIGVuZCA9ICZuZXh0LT5uZXh0Ow0KKyAgICAgICAgIH0NCisNCisgICAgICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLw0KKyAgICAgICAgIHJldCA9IGRlZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sDQorICAgICAgICAgICAgaW5wdXRfbGVuID4gMCA/IFpfTk9fRkxVU0ggOiBaX0ZJTklTSCk7DQorDQorICAgICAgICAgLyogQ2xhdyBiYWNrIGlucHV0IGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChiZWNhdXNlIGF2YWlsX2luIGlzDQorICAgICAgICAgICogcmVzZXQgYWJvdmUgZXZlcnkgdGltZSByb3VuZCB0aGUgbG9vcCkuDQorICAgICAgICAgICovDQorICAgICAgICAgaW5wdXRfbGVuICs9IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW47DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7IC8qIHNhZmV0eSAqLw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocmV0ID09IFpfT0spOw0KKw0KKyAgICAgIC8qIFRoZXJlIG1heSBiZSBzb21lIHNwYWNlIGxlZnQgaW4gdGhlIGxhc3Qgb3V0cHV0IGJ1ZmZlciwgdGhpcyBuZWVkcyB0bw0KKyAgICAgICAqIGJlIHN1YnRyYWN0ZWQgZnJvbSBvdXRwdXRfbGVuLg0KKyAgICAgICAqLw0KKyAgICAgIG91dHB1dF9sZW4gLT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7DQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAwOyAvKiBzYWZldHkgKi8NCisgICAgICBjb21wLT5vdXRwdXRfbGVuID0gb3V0cHV0X2xlbjsNCisNCisgICAgICAvKiBOb3cgZG91YmxlIGNoZWNrIHRoZSBvdXRwdXQgbGVuZ3RoLCBwdXQgaW4gYSBjdXN0b20gbWVzc2FnZSBpZiBpdCBpcw0KKyAgICAgICAqIHRvbyBsb25nLiAgT3RoZXJ3aXNlIGVuc3VyZSB0aGUgel9zdHJlYW06Om1zZyBwb2ludGVyIGlzIHNldCB0bw0KKyAgICAgICAqIHNvbWV0aGluZy4NCisgICAgICAgKi8NCisgICAgICBpZiAob3V0cHV0X2xlbiArIHByZWZpeF9sZW4gPj0gUE5HX1VJTlRfMzFfTUFYKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm1zZyA9IFBOR1pfTVNHX0NBU1QoImNvbXByZXNzZWQgZGF0YSB0b28gbG9uZyIpOw0KKyAgICAgICAgIHJldCA9IFpfTUVNX0VSUk9SOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgICAgcG5nX3pzdHJlYW1fZXJyb3IocG5nX3B0ciwgcmV0KTsNCisNCisgICAgICAvKiBSZXNldCB6bGliIGZvciBhbm90aGVyIHpUWHQvaVRYdCBvciBpbWFnZSBkYXRhICovDQorICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsNCisNCisgICAgICAvKiBUaGUgb25seSBzdWNjZXNzIGNhc2UgaXMgWl9TVFJFQU1fRU5ELCBpbnB1dF9sZW4gbXVzdCBiZSAwLCBpZiBub3QgdGhpcw0KKyAgICAgICAqIGlzIGFuIGludGVybmFsIGVycm9yLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EICYmIGlucHV0X2xlbiA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICAvKiBGaXggdXAgdGhlIGRlZmxhdGUgaGVhZGVyLCBpZiByZXF1aXJlZCAqLw0KKyAgICAgICAgIG9wdGltaXplX2NtZihjb21wLT5vdXRwdXQsIGNvbXAtPmlucHV0X2xlbik7DQorDQorICAgICAgICAgLyogQnV0IFpfT0sgaXMgcmV0dXJuZWQsIG5vdCBaX1NUUkVBTV9FTkQ7IHRoaXMgYWxsb3dzIHRoZSBjbGFpbQ0KKyAgICAgICAgICAqIGZ1bmN0aW9uIGFib3ZlIHRvIHJldHVybiBaX1NUUkVBTV9FTkQgb24gYW4gZXJyb3IgKHRob3VnaCBpdCBuZXZlcg0KKyAgICAgICAgICAqIGRvZXMgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbnMgb2YgemxpYi4pDQorICAgICAgICAgICovDQorICAgICAgICAgcmV0dXJuIFpfT0s7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgIH0NCit9DQorDQorLyogU2hpcCB0aGUgY29tcHJlc3NlZCB0ZXh0IG91dCB2aWEgY2h1bmsgd3JpdGVzICovDQorc3RhdGljIHZvaWQNCitwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfc3RydWN0cnAgcG5nX3B0ciwgY29tcHJlc3Npb25fc3RhdGUgKmNvbXApDQorew0KKyAgIHBuZ191aW50XzMyIG91dHB1dF9sZW4gPSBjb21wLT5vdXRwdXRfbGVuOw0KKyAgIHBuZ19jb25zdF9ieXRlcCBvdXRwdXQgPSBjb21wLT5vdXRwdXQ7DQorICAgcG5nX3VpbnRfMzIgYXZhaWwgPSAoc2l6ZW9mIGNvbXAtPm91dHB1dCk7DQorICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlciAqbmV4dCA9IHBuZ19wdHItPnpidWZmZXJfbGlzdDsNCisNCisgICBmb3IgKDs7KQ0KKyAgIHsNCisgICAgICBpZiAoYXZhaWwgPiBvdXRwdXRfbGVuKQ0KKyAgICAgICAgIGF2YWlsID0gb3V0cHV0X2xlbjsNCisNCisgICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBvdXRwdXQsIGF2YWlsKTsNCisNCisgICAgICBvdXRwdXRfbGVuIC09IGF2YWlsOw0KKw0KKyAgICAgIGlmIChvdXRwdXRfbGVuID09IDAgfHwgbmV4dCA9PSBOVUxMKQ0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGF2YWlsID0gcG5nX3B0ci0+emJ1ZmZlcl9zaXplOw0KKyAgICAgIG91dHB1dCA9IG5leHQtPm91dHB1dDsNCisgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsNCisgICB9DQorDQorICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvcjsgJ25leHQnIG11c3QgaGF2ZSBiZWVuIE5VTEwhICovDQorICAgaWYgKG91dHB1dF9sZW4gPiAwKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiZXJyb3Igd3JpdGluZyBhbmNpbGxhcnkgY2h1bmtlZCBjb21wcmVzc2VkIGRhdGEiKTsNCit9DQorI2VuZGlmIC8qIFBOR19XUklURV9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVEICovDQorDQorI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkgfHwgXA0KKyAgICBkZWZpbmVkKFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQpDQorLyogQ2hlY2sgdGhhdCB0aGUgdEVYdCBvciB6VFh0IGtleXdvcmQgaXMgdmFsaWQgcGVyIFBORyAxLjAgc3BlY2lmaWNhdGlvbiwNCisgKiBhbmQgaWYgaW52YWxpZCwgY29ycmVjdCB0aGUga2V5d29yZCByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUNCisgKiBjaHVuay4gIFRoZSBQTkcgMS4wIHNwZWNpZmljYXRpb24gcmVxdWlyZXMga2V5d29yZHMgMS03OSBjaGFyYWN0ZXJzIGluDQorICogbGVuZ3RoLCBmb3JiaWRzIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSwgbXVsdGlwbGUgaW50ZXJuYWwgc3BhY2VzLA0KKyAqIGFuZCB0aGUgbm9uLWJyZWFrIHNwYWNlICgweDgwKSBmcm9tIElTTyA4ODU5LTEuICBSZXR1cm5zIGtleXdvcmQgbGVuZ3RoLg0KKyAqDQorICogVGhlICduZXdfa2V5JyBidWZmZXIgbXVzdCBiZSA4MCBjaGFyYWN0ZXJzIGluIHNpemUgKGZvciB0aGUga2V5d29yZCBwbHVzIGENCisgKiB0cmFpbGluZyAnXDAnKS4gIElmIHRoaXMgcm91dGluZSByZXR1cm5zIDAgdGhlbiB0aGVyZSB3YXMgbm8ga2V5d29yZCwgb3IgYQ0KKyAqIHZhbGlkIG9uZSBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLCBhbmQgdGhlIGNhbGxlciBtdXN0IHBuZ19lcnJvci4NCisgKi8NCitzdGF0aWMgcG5nX3VpbnRfMzINCitwbmdfY2hlY2tfa2V5d29yZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2J5dGVwIG5ld19rZXkpDQorew0KKyAgIHBuZ19jb25zdF9jaGFycCBvcmlnX2tleSA9IGtleTsNCisgICBwbmdfdWludF8zMiBrZXlfbGVuID0gMDsNCisgICBpbnQgYmFkX2NoYXJhY3RlciA9IDA7DQorICAgaW50IHNwYWNlID0gMTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jaGVja19rZXl3b3JkIik7DQorDQorICAgaWYgKGtleSA9PSBOVUxMKQ0KKyAgIHsNCisgICAgICAqbmV3X2tleSA9IDA7DQorICAgICAgcmV0dXJuIDA7DQorICAgfQ0KKw0KKyAgIHdoaWxlICgqa2V5ICYmIGtleV9sZW4gPCA3OSkNCisgICB7DQorICAgICAgcG5nX2J5dGUgY2ggPSAocG5nX2J5dGUpKDB4ZmYgJiAqa2V5KyspOw0KKw0KKyAgICAgIGlmICgoY2ggPiAzMiAmJiBjaCA8PSAxMjYpIHx8IChjaCA+PSAxNjEgLyomJiBjaCA8PSAyNTUqLykpDQorICAgICAgICAgKm5ld19rZXkrKyA9IGNoLCArK2tleV9sZW4sIHNwYWNlID0gMDsNCisNCisgICAgICBlbHNlIGlmICghc3BhY2UpDQorICAgICAgew0KKyAgICAgICAgIC8qIEEgc3BhY2Ugb3IgYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2hlbiBvbmUgd2Fzbid0IHNlZW4gaW1tZWRpYXRlbHkNCisgICAgICAgICAgKiBiZWZvcmU7IG91dHB1dCBqdXN0IGEgc3BhY2UuDQorICAgICAgICAgICovDQorICAgICAgICAgKm5ld19rZXkrKyA9IDMyLCArK2tleV9sZW4sIHNwYWNlID0gMTsNCisNCisgICAgICAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIHdhcyBub3QgYSBzcGFjZSB0aGVuIGl0IGlzIGludmFsaWQuICovDQorICAgICAgICAgaWYgKGNoICE9IDMyKQ0KKyAgICAgICAgICAgIGJhZF9jaGFyYWN0ZXIgPSBjaDsNCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAoIWJhZF9jaGFyYWN0ZXIpDQorICAgICAgICAgYmFkX2NoYXJhY3RlciA9IGNoOyAvKiBqdXN0IHNraXAgaXQsIHJlY29yZCB0aGUgZmlyc3QgZXJyb3IgKi8NCisgICB9DQorDQorICAgaWYgKGtleV9sZW4gPiAwICYmIHNwYWNlKSAvKiB0cmFpbGluZyBzcGFjZSAqLw0KKyAgIHsNCisgICAgICAtLWtleV9sZW4sIC0tbmV3X2tleTsNCisgICAgICBpZiAoIWJhZF9jaGFyYWN0ZXIpDQorICAgICAgICAgYmFkX2NoYXJhY3RlciA9IDMyOw0KKyAgIH0NCisNCisgICAvKiBUZXJtaW5hdGUgdGhlIGtleXdvcmQgKi8NCisgICAqbmV3X2tleSA9IDA7DQorDQorICAgaWYgKGtleV9sZW4gPT0gMCkNCisgICAgICByZXR1cm4gMDsNCisNCisgICAvKiBUcnkgdG8gb25seSBvdXRwdXQgb25lIHdhcm5pbmcgcGVyIGtleXdvcmQ6ICovDQorICAgaWYgKCprZXkpIC8qIGtleXdvcmQgdG9vIGxvbmcgKi8NCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAia2V5d29yZCB0cnVuY2F0ZWQiKTsNCisNCisgICBlbHNlIGlmIChiYWRfY2hhcmFjdGVyKQ0KKyAgIHsNCisgICAgICBQTkdfV0FSTklOR19QQVJBTUVURVJTKHApDQorDQorICAgICAgcG5nX3dhcm5pbmdfcGFyYW1ldGVyKHAsIDEsIG9yaWdfa2V5KTsNCisgICAgICBwbmdfd2FybmluZ19wYXJhbWV0ZXJfc2lnbmVkKHAsIDIsIFBOR19OVU1CRVJfRk9STUFUXzAyeCwgYmFkX2NoYXJhY3Rlcik7DQorDQorICAgICAgcG5nX2Zvcm1hdHRlZF93YXJuaW5nKHBuZ19wdHIsIHAsICJrZXl3b3JkIFwiQDFcIjogYmFkIGNoYXJhY3RlciAnMHhAMiciKTsNCisgICB9DQorDQorICAgcmV0dXJuIGtleV9sZW47DQorfQ0KKyNlbmRpZg0KKw0KKy8qIFdyaXRlIHRoZSBJSERSIGNodW5rLCBhbmQgdXBkYXRlIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIG5lY2Vzc2FyeQ0KKyAqIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoZSByZXN0IG9mIHRoaXMgY29kZSBkZXBlbmRzIHVwb24gdGhpcw0KKyAqIGluZm9ybWF0aW9uIGJlaW5nIGNvcnJlY3QuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX0lIRFIocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsDQorICAgIGludCBiaXRfZGVwdGgsIGludCBjb2xvcl90eXBlLCBpbnQgY29tcHJlc3Npb25fdHlwZSwgaW50IGZpbHRlcl90eXBlLA0KKyAgICBpbnQgaW50ZXJsYWNlX3R5cGUpDQorew0KKyAgIHBuZ19ieXRlIGJ1ZlsxM107IC8qIEJ1ZmZlciB0byBzdG9yZSB0aGUgSUhEUiBpbmZvICovDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfSUhEUiIpOw0KKw0KKyAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSB2YWxpZCBpbnB1dCBkYXRhIGZyb20gdGhlIGFwcGxpY2F0aW9uIGluZm8gKi8NCisgICBzd2l0Y2ggKGNvbG9yX3R5cGUpDQorICAgew0KKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToNCisgICAgICAgICBzd2l0Y2ggKGJpdF9kZXB0aCkNCisgICAgICAgICB7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgY2FzZSA4Og0KKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgICAgICAgY2FzZSAxNjoNCisjZW5kaWYNCisgICAgICAgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDE7IGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgZ3JheXNjYWxlIGltYWdlIik7DQorICAgICAgICAgfQ0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOg0KKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikNCisjZWxzZQ0KKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCkNCisjZW5kaWYNCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBSR0IgaW1hZ2UiKTsNCisNCisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDM7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOg0KKyAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAxOw0KKyAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgcGFsZXR0ZWQgaW1hZ2UiKTsNCisgICAgICAgICB9DQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOg0KKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpDQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgZ3JheXNjYWxlK2FscGhhIGltYWdlIik7DQorDQorICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAyOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOg0KKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikNCisjZWxzZQ0KKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCkNCisjZW5kaWYNCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBSR0JBIGltYWdlIik7DQorDQorICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSA0Ow0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIGNvbG9yIHR5cGUgc3BlY2lmaWVkIik7DQorICAgfQ0KKw0KKyAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpDQorICAgew0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNvbXByZXNzaW9uIHR5cGUgc3BlY2lmaWVkIik7DQorICAgICAgY29tcHJlc3Npb25fdHlwZSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7DQorICAgfQ0KKw0KKyAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmDQorICAgICogMS4gTGlicG5nIHdhcyBjb21waWxlZCB3aXRoIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZA0KKyAgICAqIDIuIExpYnBuZyBkaWQgbm90IHdyaXRlIGEgUE5HIHNpZ25hdHVyZSAodGhpcyBmaWx0ZXJfbWV0aG9kIGlzIG9ubHkNCisgICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZA0KKyAgICAqIDMuIFRoZSBhcHBsaWNhdGlvbiBjYWxsZWQgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgd2l0aCBhIG1hc2sgdGhhdA0KKyAgICAqICAgIGluY2x1ZGVkIFBOR19GTEFHX01OR19GSUxURVJfNjQgYW5kDQorICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kDQorICAgICogNS4gVGhlIGNvbG9yX3R5cGUgaXMgUkdCIG9yIFJHQkENCisgICAgKi8NCisgICBpZiAoDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorICAgICAgICEoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAmJg0KKyAgICAgICAoKHBuZ19wdHItPm1vZGUmUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgPT0gMCkgJiYNCisgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8DQorICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkgJiYNCisgICAgICAgKGZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpICYmDQorI2VuZGlmDQorICAgICAgIGZpbHRlcl90eXBlICE9IFBOR19GSUxURVJfVFlQRV9CQVNFKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBmaWx0ZXIgdHlwZSBzcGVjaWZpZWQiKTsNCisgICAgICBmaWx0ZXJfdHlwZSA9IFBOR19GSUxURVJfVFlQRV9CQVNFOw0KKyAgIH0NCisNCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIGlmIChpbnRlcmxhY2VfdHlwZSAhPSBQTkdfSU5URVJMQUNFX05PTkUgJiYNCisgICAgICAgaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9BREFNNykNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgaW50ZXJsYWNlIHR5cGUgc3BlY2lmaWVkIik7DQorICAgICAgaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX0FEQU03Ow0KKyAgIH0NCisjZWxzZQ0KKyAgIGludGVybGFjZV90eXBlPVBOR19JTlRFUkxBQ0VfTk9ORTsNCisjZW5kaWYNCisNCisgICAvKiBTYXZlIHRoZSByZWxldmVudCBpbmZvcm1hdGlvbiAqLw0KKyAgIHBuZ19wdHItPmJpdF9kZXB0aCA9IChwbmdfYnl0ZSliaXRfZGVwdGg7DQorICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9IChwbmdfYnl0ZSljb2xvcl90eXBlOw0KKyAgIHBuZ19wdHItPmludGVybGFjZWQgPSAocG5nX2J5dGUpaW50ZXJsYWNlX3R5cGU7DQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorICAgcG5nX3B0ci0+ZmlsdGVyX3R5cGUgPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7DQorI2VuZGlmDQorICAgcG5nX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOw0KKyAgIHBuZ19wdHItPndpZHRoID0gd2lkdGg7DQorICAgcG5nX3B0ci0+aGVpZ2h0ID0gaGVpZ2h0Ow0KKw0KKyAgIHBuZ19wdHItPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShiaXRfZGVwdGggKiBwbmdfcHRyLT5jaGFubmVscyk7DQorICAgcG5nX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHdpZHRoKTsNCisgICAvKiBTZXQgdGhlIHVzciBpbmZvLCBzbyBhbnkgdHJhbnNmb3JtYXRpb25zIGNhbiBtb2RpZnkgaXQgKi8NCisgICBwbmdfcHRyLT51c3Jfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsNCisgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoID0gcG5nX3B0ci0+Yml0X2RlcHRoOw0KKyAgIHBuZ19wdHItPnVzcl9jaGFubmVscyA9IHBuZ19wdHItPmNoYW5uZWxzOw0KKw0KKyAgIC8qIFBhY2sgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSBidWZmZXIgKi8NCisgICBwbmdfc2F2ZV91aW50XzMyKGJ1Ziwgd2lkdGgpOw0KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgNCwgaGVpZ2h0KTsNCisgICBidWZbOF0gPSAocG5nX2J5dGUpYml0X2RlcHRoOw0KKyAgIGJ1Zls5XSA9IChwbmdfYnl0ZSljb2xvcl90eXBlOw0KKyAgIGJ1ZlsxMF0gPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsNCisgICBidWZbMTFdID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOw0KKyAgIGJ1ZlsxMl0gPSAocG5nX2J5dGUpaW50ZXJsYWNlX3R5cGU7DQorDQorICAgLyogV3JpdGUgdGhlIGNodW5rICovDQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19JSERSLCBidWYsIChwbmdfc2l6ZV90KTEzKTsNCisNCisgICBpZiAoIShwbmdfcHRyLT5kb19maWx0ZXIpKQ0KKyAgIHsNCisgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFIHx8DQorICAgICAgICAgIHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpDQorICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9OT05FOw0KKw0KKyAgICAgIGVsc2UNCisgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfQUxMX0ZJTFRFUlM7DQorICAgfQ0KKw0KKyAgIHBuZ19wdHItPm1vZGUgPSBQTkdfSEFWRV9JSERSOyAvKiBub3QgUkVBRFlfRk9SX1pUWFQgKi8NCit9DQorDQorLyogV3JpdGUgdGhlIHBhbGV0dGUuICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gdHJ1c3QgcG5nX2NvbG9yIHRvIGJlIGluIHRoZQ0KKyAqIGNvcnJlY3Qgb3JkZXIgZm9yIFBORywgc28gcGVvcGxlIGNhbiByZWRlZmluZSBpdCB0byBhbnkgY29udmVuaWVudA0KKyAqIHN0cnVjdHVyZS4NCisgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfUExURShwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NvbG9ycCBwYWxldHRlLA0KKyAgICBwbmdfdWludF8zMiBudW1fcGFsKQ0KK3sNCisgICBwbmdfdWludF8zMiBpOw0KKyAgIHBuZ19jb25zdF9jb2xvcnAgcGFsX3B0cjsNCisgICBwbmdfYnl0ZSBidWZbM107DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfUExURSIpOw0KKw0KKyAgIGlmICgoDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorICAgICAgICEocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSAmJg0KKyNlbmRpZg0KKyAgICAgICBudW1fcGFsID09IDApIHx8IG51bV9wYWwgPiAyNTYpDQorICAgew0KKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgY29sb3JzIGluIHBhbGV0dGUiKTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgY29sb3JzIGluIHBhbGV0dGUiKTsNCisgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgIH0NCisNCisgICBpZiAoIShwbmdfcHRyLT5jb2xvcl90eXBlJlBOR19DT0xPUl9NQVNLX0NPTE9SKSkNCisgICB7DQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgIklnbm9yaW5nIHJlcXVlc3QgdG8gd3JpdGUgYSBQTFRFIGNodW5rIGluIGdyYXlzY2FsZSBQTkciKTsNCisNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIHBuZ19wdHItPm51bV9wYWxldHRlID0gKHBuZ191aW50XzE2KW51bV9wYWw7DQorICAgcG5nX2RlYnVnMSgzLCAibnVtX3BhbGV0dGUgPSAlZCIsIHBuZ19wdHItPm51bV9wYWxldHRlKTsNCisNCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIHBuZ19QTFRFLCAocG5nX3VpbnRfMzIpKG51bV9wYWwgKiAzKSk7DQorI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRA0KKw0KKyAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtX3BhbDsgaSsrLCBwYWxfcHRyKyspDQorICAgew0KKyAgICAgIGJ1ZlswXSA9IHBhbF9wdHItPnJlZDsNCisgICAgICBidWZbMV0gPSBwYWxfcHRyLT5ncmVlbjsNCisgICAgICBidWZbMl0gPSBwYWxfcHRyLT5ibHVlOw0KKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpMyk7DQorICAgfQ0KKw0KKyNlbHNlDQorICAgLyogVGhpcyBpcyBhIGxpdHRsZSBzbG93ZXIgYnV0IHNvbWUgYnVnZ3kgY29tcGlsZXJzIG5lZWQgdG8gZG8gdGhpcw0KKyAgICAqIGluc3RlYWQNCisgICAgKi8NCisgICBwYWxfcHRyPXBhbGV0dGU7DQorDQorICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWw7IGkrKykNCisgICB7DQorICAgICAgYnVmWzBdID0gcGFsX3B0cltpXS5yZWQ7DQorICAgICAgYnVmWzFdID0gcGFsX3B0cltpXS5ncmVlbjsNCisgICAgICBidWZbMl0gPSBwYWxfcHRyW2ldLmJsdWU7DQorICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkzKTsNCisgICB9DQorDQorI2VuZGlmDQorICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsNCisgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7DQorfQ0KKw0KKy8qIFRoaXMgaXMgc2ltaWxhciB0byBwbmdfdGV4dF9jb21wcmVzcywgYWJvdmUsIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IHJlcXVpcmUNCisgKiBhbGwgb2YgdGhlIGRhdGEgYXQgb25jZSBhbmQsIGluc3RlYWQgb2YgYnVmZmVyaW5nIHRoZSBjb21wcmVzc2VkIHJlc3VsdCwNCisgKiB3cml0ZXMgaXQgYXMgSURBVCBjaHVua3MuICBVbmxpa2UgcG5nX3RleHRfY29tcHJlc3MgaXQgKmNhbiogcG5nX2Vycm9yIG91dA0KKyAqIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHdyaXRlIGludGVyZmFjZS4gIEFzIGEgcmVzdWx0IGl0IGRvZXMgaXRzIG93biBlcnJvcg0KKyAqIHJlcG9ydGluZyBhbmQgZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIGNvZGUuICBJbiB0aGUgZXZlbnQgb2YgZXJyb3IgaXQgd2lsbA0KKyAqIGp1c3QgY2FsbCBwbmdfZXJyb3IuICBUaGUgaW5wdXQgZGF0YSBsZW5ndGggbWF5IGV4Y2VlZCAzMi1iaXRzLiAgVGhlICdmbHVzaCcNCisgKiBwYXJhbWV0ZXIgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGF0IHRvIGRlZmxhdGUsIHdpdGggdGhlIGZvbGxvd2luZw0KKyAqIG1lYW5pbmdzOg0KKyAqDQorICogWl9OT19GTFVTSDogbm9ybWFsIGluY3JlbWVudGFsIG91dHB1dCBvZiBjb21wcmVzc2VkIGRhdGENCisgKiBaX1NZTkNfRkxVU0g6IGRvIGEgU1lOQ19GTFVTSCwgdXNlZCBieSBwbmdfd3JpdGVfZmx1c2gNCisgKiBaX0ZJTklTSDogdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgZG8gYSBaX0ZJTklTSCBhbmQgY2xlYW4gdXANCisgKg0KKyAqIFRoZSByb3V0aW5lIG1hbmFnZXMgdGhlIGFjcXVpcmUgYW5kIHJlbGVhc2Ugb2YgdGhlIHBuZ19wdHItPnpzdHJlYW0gYnkNCisgKiBjaGVja2luZyBhbmQgKGF0IHRoZSBlbmQpIGNsZWFyaW5nIHBuZ19wdHItPnpvd25lciwgaXQgZG9lcyBzb21lIHNhbml0eQ0KKyAqIGNoZWNrcyBvbiB0aGUgJ21vZGUnIGZsYWdzIHdoaWxlIGRvaW5nIHRoaXMuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX2NvbXByZXNzX0lEQVQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCBpbnB1dCwNCisgICBwbmdfYWxsb2Nfc2l6ZV90IGlucHV0X2xlbiwgaW50IGZsdXNoKQ0KK3sNCisgICBpZiAocG5nX3B0ci0+em93bmVyICE9IHBuZ19JREFUKQ0KKyAgIHsNCisgICAgICAvKiBGaXJzdCB0aW1lLiAgIEVuc3VyZSB3ZSBoYXZlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgY29tcHJlc3Npb24gYW5kDQorICAgICAgICogdHJpbSB0aGUgYnVmZmVyIGxpc3QgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgZW50cnkgdG8gZnJlZSBtZW1vcnkuDQorICAgICAgICogSWYgJ1dSSVRFX0NPTVBSRVNTRURfVEVYVCcgaXMgbm90IHNldCB0aGUgbGlzdCB3aWxsIG5ldmVyIGhhdmUgYmVlbg0KKyAgICAgICAqIGNyZWF0ZWQgYXQgdGhpcyBwb2ludCwgYnV0IHRoZSBjaGVjayBoZXJlIGlzIHF1aWNrIGFuZCBzYWZlLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChwbmdfcHRyLT56YnVmZmVyX2xpc3QgPT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+emJ1ZmZlcl9saXN0ID0gcG5nX3ZvaWRjYXN0KHBuZ19jb21wcmVzc2lvbl9idWZmZXJwLA0KKyAgICAgICAgICAgIHBuZ19tYWxsb2MocG5nX3B0ciwgUE5HX0NPTVBSRVNTSU9OX0JVRkZFUl9TSVpFKHBuZ19wdHIpKSk7DQorICAgICAgICAgcG5nX3B0ci0+emJ1ZmZlcl9saXN0LT5uZXh0ID0gTlVMTDsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgICAgIHBuZ19mcmVlX2J1ZmZlcl9saXN0KHBuZ19wdHIsICZwbmdfcHRyLT56YnVmZmVyX2xpc3QtPm5leHQpOw0KKw0KKyAgICAgIC8qIEl0IGlzIGEgdGVybWluYWwgZXJyb3IgaWYgd2UgY2FuJ3QgY2xhaW0gdGhlIHpzdHJlYW0uICovDQorICAgICAgaWYgKHBuZ19kZWZsYXRlX2NsYWltKHBuZ19wdHIsIHBuZ19JREFULCBwbmdfaW1hZ2Vfc2l6ZShwbmdfcHRyKSkgIT0gWl9PSykNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOw0KKw0KKyAgICAgIC8qIFRoZSBvdXRwdXQgc3RhdGUgaXMgbWFpbnRhaW5lZCBpbiBwbmdfcHRyLT56c3RyZWFtLCBzbyBpdCBtdXN0IGJlDQorICAgICAgICogaW5pdGlhbGl6ZWQgaGVyZSBhZnRlciB0aGUgY2xhaW0uDQorICAgICAgICovDQorICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWZmZXJfbGlzdC0+b3V0cHV0Ow0KKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gcG5nX3B0ci0+emJ1ZmZlcl9zaXplOw0KKyAgIH0NCisNCisgICAvKiBOb3cgbG9vcCByZWFkaW5nIGFuZCB3cml0aW5nIHVudGlsIGFsbCB0aGUgaW5wdXQgaXMgY29uc3VtZWQgb3IgYW4gZXJyb3INCisgICAgKiB0ZXJtaW5hdGVzIHRoZSBvcGVyYXRpb24uICBUaGUgX291dCB2YWx1ZXMgYXJlIG1haW50YWluZWQgYWNyb3NzIGNhbGxzIHRvDQorICAgICogdGhpcyBmdW5jdGlvbiwgYnV0IHRoZSBpbnB1dCBtdXN0IGJlIHJlc2V0IGVhY2ggdGltZS4NCisgICAgKi8NCisgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBQTkdaX0lOUFVUX0NBU1QoaW5wdXQpOw0KKyAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOyAvKiBzZXQgYmVsb3cgKi8NCisgICBmb3IgKDs7KQ0KKyAgIHsNCisgICAgICBpbnQgcmV0Ow0KKw0KKyAgICAgIC8qIElOUFVUOiBmcm9tIHRoZSByb3cgZGF0YSAqLw0KKyAgICAgIHVJbnQgYXZhaWwgPSBaTElCX0lPX01BWDsNCisNCisgICAgICBpZiAoYXZhaWwgPiBpbnB1dF9sZW4pDQorICAgICAgICAgYXZhaWwgPSAodUludClpbnB1dF9sZW47IC8qIHNhZmUgYmVjYXVzZSBvZiB0aGUgY2hlY2sgKi8NCisNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gYXZhaWw7DQorICAgICAgaW5wdXRfbGVuIC09IGF2YWlsOw0KKw0KKyAgICAgIHJldCA9IGRlZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIGlucHV0X2xlbiA+IDAgPyBaX05PX0ZMVVNIIDogZmx1c2gpOw0KKw0KKyAgICAgIC8qIEluY2x1ZGUgYXMteWV0IHVuY29uc3VtZWQgaW5wdXQgKi8NCisgICAgICBpbnB1dF9sZW4gKz0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsNCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsNCisNCisgICAgICAvKiBPVVRQVVQ6IHdyaXRlIGNvbXBsZXRlIElEQVQgY2h1bmtzIHdoZW4gYXZhaWxfb3V0IGRyb3BzIHRvIHplcm8sIG5vdGUNCisgICAgICAgKiB0aGF0IHRoZXNlIHR3byB6c3RyZWFtIGZpZWxkcyBhcmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbHMsIHRoZXJlZm9yZQ0KKyAgICAgICAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IHRoZXNlIHVwIG9uIGVudHJ5IHRvIHRoZSBsb29wLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYnl0ZXAgZGF0YSA9IHBuZ19wdHItPnpidWZmZXJfbGlzdC0+b3V0cHV0Ow0KKyAgICAgICAgIHVJbnQgc2l6ZSA9IHBuZ19wdHItPnpidWZmZXJfc2l6ZTsNCisNCisgICAgICAgICAvKiBXcml0ZSBhbiBJREFUIGNvbnRhaW5pbmcgdGhlIGRhdGEgdGhlbiByZXNldCB0aGUgYnVmZmVyLiAgVGhlDQorICAgICAgICAgICogZmlyc3QgSURBVCBtYXkgbmVlZCBkZWZsYXRlIGhlYWRlciBvcHRpbWl6YXRpb24uDQorICAgICAgICAgICovDQorIyAgICAgICAgaWZkZWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQNCisgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkgJiYNCisgICAgICAgICAgICAgICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID09IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpDQorICAgICAgICAgICAgICAgb3B0aW1pemVfY21mKGRhdGEsIHBuZ19pbWFnZV9zaXplKHBuZ19wdHIpKTsNCisjICAgICAgICBlbmRpZg0KKw0KKyAgICAgICAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfSURBVCwgZGF0YSwgc2l6ZSk7DQorICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOw0KKw0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBkYXRhOw0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsNCisNCisgICAgICAgICAvKiBGb3IgU1lOQ19GTFVTSCBvciBGSU5JU0ggaXQgaXMgZXNzZW50aWFsIHRvIGtlZXAgY2FsbGluZyB6bGliIHdpdGgNCisgICAgICAgICAgKiB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdW50aWwgaXQgaGFzIGZpbmlzaGVkIG91dHB1dCwgZm9yIE5PX0ZMVVNIDQorICAgICAgICAgICogaXQgZG9lc24ndCBtYXR0ZXIuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKHJldCA9PSBaX09LICYmIGZsdXNoICE9IFpfTk9fRkxVU0gpDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFRoZSBvcmRlciBvZiB0aGVzZSBjaGVja3MgZG9lc24ndCBtYXR0ZXIgbXVjaDsgaXQganVzdCBlZmZlY3Qgd2hpY2gNCisgICAgICAgKiBwb3NzaWJsZSBlcnJvciBtaWdodCBiZSBkZXRlY3RlZCBpZiBtdWx0aXBsZSB0aGluZ3MgZ28gd3JvbmcgYXQgb25jZS4NCisgICAgICAgKi8NCisgICAgICBpZiAocmV0ID09IFpfT0spIC8qIG1vc3QgbGlrZWx5IHJldHVybiBjb2RlISAqLw0KKyAgICAgIHsNCisgICAgICAgICAvKiBJZiBhbGwgdGhlIGlucHV0IGhhcyBiZWVuIGNvbnN1bWVkIHRoZW4ganVzdCByZXR1cm4uICBJZiBaX0ZJTklTSA0KKyAgICAgICAgICAqIHdhcyB1c2VkIGFzIHRoZSBmbHVzaCBwYXJhbWV0ZXIgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nIGlmIHdlIGdldA0KKyAgICAgICAgICAqIGhlcmUuDQorICAgICAgICAgICovDQorICAgICAgICAgaWYgKGlucHV0X2xlbiA9PSAwKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpDQorICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJaX09LIG9uIFpfRklOSVNIIHdpdGggb3V0cHV0IHNwYWNlIik7DQorDQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgZWxzZSBpZiAocmV0ID09IFpfU1RSRUFNX0VORCAmJiBmbHVzaCA9PSBaX0ZJTklTSCkNCisgICAgICB7DQorICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBJREFUIGRhdGE7IGFueSBwZW5kaW5nIG91dHB1dCBtdXN0IGJlDQorICAgICAgICAgICogZmx1c2hlZC4gIEZvciBzbWFsbCBQTkcgZmlsZXMgd2UgbWF5IHN0aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcuDQorICAgICAgICAgICovDQorICAgICAgICAgcG5nX2J5dGVwIGRhdGEgPSBwbmdfcHRyLT56YnVmZmVyX2xpc3QtPm91dHB1dDsNCisgICAgICAgICB1SW50IHNpemUgPSBwbmdfcHRyLT56YnVmZmVyX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsNCisNCisjICAgICAgICBpZmRlZiBQTkdfV1JJVEVfT1BUSU1JWkVfQ01GX1NVUFBPUlRFRA0KKyAgICAgICAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAmJg0KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmNvbXByZXNzaW9uX3R5cGUgPT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkNCisgICAgICAgICAgICAgICBvcHRpbWl6ZV9jbWYoZGF0YSwgcG5nX2ltYWdlX3NpemUocG5nX3B0cikpOw0KKyMgICAgICAgIGVuZGlmDQorDQorICAgICAgICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19JREFULCBkYXRhLCBzaXplKTsNCisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7DQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IE5VTEw7DQorICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUIHwgUE5HX0FGVEVSX0lEQVQ7DQorDQorICAgICAgICAgcG5nX3B0ci0+em93bmVyID0gMDsgLyogUmVsZWFzZSB0aGUgc3RyZWFtICovDQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXJyb3IgY29uZGl0aW9uLiAqLw0KKyAgICAgICAgIHBuZ196c3RyZWFtX2Vycm9yKHBuZ19wdHIsIHJldCk7DQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsNCisgICAgICB9DQorICAgfQ0KK30NCisNCisvKiBXcml0ZSBhbiBJRU5EIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX0lFTkQocG5nX3N0cnVjdHJwIHBuZ19wdHIpDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX0lFTkQiKTsNCisNCisgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX0lFTkQsIE5VTEwsIChwbmdfc2l6ZV90KTApOw0KKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSUVORDsNCit9DQorDQorI2lmZGVmIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRA0KKy8qIFdyaXRlIGEgZ0FNQSBjaHVuayAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ193cml0ZV9nQU1BX2ZpeGVkKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkNCit7DQorICAgcG5nX2J5dGUgYnVmWzRdOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2dBTUEiKTsNCisNCisgICAvKiBmaWxlX2dhbW1hIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLw0KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCAocG5nX3VpbnRfMzIpZmlsZV9nYW1tYSk7DQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19nQU1BLCBidWYsIChwbmdfc2l6ZV90KTQpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVEDQorLyogV3JpdGUgYSBzUkdCIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX3NSR0IocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBzcmdiX2ludGVudCkNCit7DQorICAgcG5nX2J5dGUgYnVmWzFdOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NSR0IiKTsNCisNCisgICBpZiAoc3JnYl9pbnRlbnQgPj0gUE5HX3NSR0JfSU5URU5UX0xBU1QpDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgIkludmFsaWQgc1JHQiByZW5kZXJpbmcgaW50ZW50IHNwZWNpZmllZCIpOw0KKw0KKyAgIGJ1ZlswXT0ocG5nX2J5dGUpc3JnYl9pbnRlbnQ7DQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19zUkdCLCBidWYsIChwbmdfc2l6ZV90KTEpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEDQorLyogV3JpdGUgYW4gaUNDUCBjaHVuayAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ193cml0ZV9pQ0NQKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUpDQorew0KKyAgIHBuZ191aW50XzMyIG5hbWVfbGVuOw0KKyAgIHBuZ191aW50XzMyIHByb2ZpbGVfbGVuOw0KKyAgIHBuZ19ieXRlIG5ld19uYW1lWzgxXTsgLyogMSBieXRlIGZvciB0aGUgY29tcHJlc3Npb24gYnl0ZSAqLw0KKyAgIGNvbXByZXNzaW9uX3N0YXRlIGNvbXA7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaUNDUCIpOw0KKw0KKyAgIC8qIFRoZXNlIGFyZSBhbGwgaW50ZXJuYWwgcHJvYmxlbXM6IHRoZSBwcm9maWxlIHNob3VsZCBoYXZlIGJlZW4gY2hlY2tlZA0KKyAgICAqIGJlZm9yZSB3aGVuIGl0IHdhcyBzdG9yZWQuDQorICAgICovDQorICAgaWYgKHByb2ZpbGUgPT0gTlVMTCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vIHByb2ZpbGUgZm9yIGlDQ1AgY2h1bmsiKTsgLyogaW50ZXJuYWwgZXJyb3IgKi8NCisNCisgICBwcm9maWxlX2xlbiA9IHBuZ19nZXRfdWludF8zMihwcm9maWxlKTsNCisNCisgICBpZiAocHJvZmlsZV9sZW4gPCAxMzIpDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJQ0MgcHJvZmlsZSB0b28gc2hvcnQiKTsNCisNCisgICBpZiAocHJvZmlsZV9sZW4gJiAweDAzKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSUNDIHByb2ZpbGUgbGVuZ3RoIGludmFsaWQgKG5vdCBhIG11bHRpcGxlIG9mIDQpIik7DQorDQorICAgew0KKyAgICAgIHBuZ191aW50XzMyIGVtYmVkZGVkX3Byb2ZpbGVfbGVuID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUpOw0KKw0KKyAgICAgIGlmIChwcm9maWxlX2xlbiAhPSBlbWJlZGRlZF9wcm9maWxlX2xlbikNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlByb2ZpbGUgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHByb2ZpbGUiKTsNCisgICB9DQorDQorICAgbmFtZV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBuYW1lLCBuZXdfbmFtZSk7DQorDQorICAgaWYgKG5hbWVfbGVuID09IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJpQ0NQOiBpbnZhbGlkIGtleXdvcmQiKTsNCisNCisgICBuZXdfbmFtZVsrK25hbWVfbGVuXSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7DQorDQorICAgLyogTWFrZSBzdXJlIHdlIGluY2x1ZGUgdGhlIE5VTEwgYWZ0ZXIgdGhlIG5hbWUgYW5kIHRoZSBjb21wcmVzc2lvbiB0eXBlICovDQorICAgKytuYW1lX2xlbjsNCisNCisgICBwbmdfdGV4dF9jb21wcmVzc19pbml0KCZjb21wLCBwcm9maWxlLCBwcm9maWxlX2xlbik7DQorDQorICAgLyogQWxsb3cgZm9yIGtleXdvcmQgdGVybWluYXRvciBhbmQgY29tcHJlc3Npb24gYnl0ZSAqLw0KKyAgIGlmIChwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCBwbmdfaUNDUCwgJmNvbXAsIG5hbWVfbGVuKSAhPSBaX09LKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7DQorDQorICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfaUNDUCwgbmFtZV9sZW4gKyBjb21wLm91dHB1dF9sZW4pOw0KKw0KKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIG5ld19uYW1lLCBuYW1lX2xlbik7DQorDQorICAgcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3B0ciwgJmNvbXApOw0KKw0KKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQNCisvKiBXcml0ZSBhIHNQTFQgY2h1bmsgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfc1BMVChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X3NQTFRfdHAgc3BhbGV0dGUpDQorew0KKyAgIHBuZ191aW50XzMyIG5hbWVfbGVuOw0KKyAgIHBuZ19ieXRlIG5ld19uYW1lWzgwXTsNCisgICBwbmdfYnl0ZSBlbnRyeWJ1ZlsxMF07DQorICAgcG5nX3NpemVfdCBlbnRyeV9zaXplID0gKHNwYWxldHRlLT5kZXB0aCA9PSA4ID8gNiA6IDEwKTsNCisgICBwbmdfc2l6ZV90IHBhbGV0dGVfc2l6ZSA9IGVudHJ5X3NpemUgKiBzcGFsZXR0ZS0+bmVudHJpZXM7DQorICAgcG5nX3NQTFRfZW50cnlwIGVwOw0KKyNpZm5kZWYgUE5HX1BPSU5URVJfSU5ERVhJTkdfU1VQUE9SVEVEDQorICAgaW50IGk7DQorI2VuZGlmDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc1BMVCIpOw0KKw0KKyAgIG5hbWVfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwgc3BhbGV0dGUtPm5hbWUsIG5ld19uYW1lKTsNCisNCisgICBpZiAobmFtZV9sZW4gPT0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNQTFQ6IGludmFsaWQga2V5d29yZCIpOw0KKw0KKyAgIC8qIE1ha2Ugc3VyZSB3ZSBpbmNsdWRlIHRoZSBOVUxMIGFmdGVyIHRoZSBuYW1lICovDQorICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfc1BMVCwNCisgICAgICAgKHBuZ191aW50XzMyKShuYW1lX2xlbiArIDIgKyBwYWxldHRlX3NpemUpKTsNCisNCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19uYW1lLA0KKyAgICAgICAocG5nX3NpemVfdCkobmFtZV9sZW4gKyAxKSk7DQorDQorICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgJnNwYWxldHRlLT5kZXB0aCwgKHBuZ19zaXplX3QpMSk7DQorDQorICAgLyogTG9vcCB0aHJvdWdoIGVhY2ggcGFsZXR0ZSBlbnRyeSwgd3JpdGluZyBhcHByb3ByaWF0ZWx5ICovDQorI2lmZGVmIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRA0KKyAgIGZvciAoZXAgPSBzcGFsZXR0ZS0+ZW50cmllczsgZXA8c3BhbGV0dGUtPmVudHJpZXMgKyBzcGFsZXR0ZS0+bmVudHJpZXM7IGVwKyspDQorICAgew0KKyAgICAgIGlmIChzcGFsZXR0ZS0+ZGVwdGggPT0gOCkNCisgICAgICB7DQorICAgICAgICAgZW50cnlidWZbMF0gPSAocG5nX2J5dGUpZXAtPnJlZDsNCisgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcC0+Z3JlZW47DQorICAgICAgICAgZW50cnlidWZbMl0gPSAocG5nX2J5dGUpZXAtPmJsdWU7DQorICAgICAgICAgZW50cnlidWZbM10gPSAocG5nX2J5dGUpZXAtPmFscGhhOw0KKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcC0+ZnJlcXVlbmN5KTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMCwgZXAtPnJlZCk7DQorICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDIsIGVwLT5ncmVlbik7DQorICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDQsIGVwLT5ibHVlKTsNCisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNiwgZXAtPmFscGhhKTsNCisgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgOCwgZXAtPmZyZXF1ZW5jeSk7DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGVudHJ5YnVmLCBlbnRyeV9zaXplKTsNCisgICB9DQorI2Vsc2UNCisgICBlcD1zcGFsZXR0ZS0+ZW50cmllczsNCisgICBmb3IgKGkgPSAwOyBpPnNwYWxldHRlLT5uZW50cmllczsgaSsrKQ0KKyAgIHsNCisgICAgICBpZiAoc3BhbGV0dGUtPmRlcHRoID09IDgpDQorICAgICAgew0KKyAgICAgICAgIGVudHJ5YnVmWzBdID0gKHBuZ19ieXRlKWVwW2ldLnJlZDsNCisgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcFtpXS5ncmVlbjsNCisgICAgICAgICBlbnRyeWJ1ZlsyXSA9IChwbmdfYnl0ZSllcFtpXS5ibHVlOw0KKyAgICAgICAgIGVudHJ5YnVmWzNdID0gKHBuZ19ieXRlKWVwW2ldLmFscGhhOw0KKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcFtpXS5mcmVxdWVuY3kpOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyAwLCBlcFtpXS5yZWQpOw0KKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyAyLCBlcFtpXS5ncmVlbik7DQorICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDQsIGVwW2ldLmJsdWUpOw0KKyAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA2LCBlcFtpXS5hbHBoYSk7DQorICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDgsIGVwW2ldLmZyZXF1ZW5jeSk7DQorICAgICAgfQ0KKw0KKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGVudHJ5YnVmLCBlbnRyeV9zaXplKTsNCisgICB9DQorI2VuZGlmDQorDQorICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9zQklUX1NVUFBPUlRFRA0KKy8qIFdyaXRlIHRoZSBzQklUIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX3NCSVQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jb2xvcl84cCBzYml0LCBpbnQgY29sb3JfdHlwZSkNCit7DQorICAgcG5nX2J5dGUgYnVmWzRdOw0KKyAgIHBuZ19zaXplX3Qgc2l6ZTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zQklUIik7DQorDQorICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGRlcGVuZCB1cG9uIHRoZSBvcmRlciBvZiBQTkdfQ09MT1JfOCAqLw0KKyAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpDQorICAgew0KKyAgICAgIHBuZ19ieXRlIG1heGJpdHM7DQorDQorICAgICAgbWF4Yml0cyA9IChwbmdfYnl0ZSkoY29sb3JfdHlwZT09UE5HX0NPTE9SX1RZUEVfUEFMRVRURSA/IDggOg0KKyAgICAgICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoKTsNCisNCisgICAgICBpZiAoc2JpdC0+cmVkID09IDAgfHwgc2JpdC0+cmVkID4gbWF4Yml0cyB8fA0KKyAgICAgICAgICBzYml0LT5ncmVlbiA9PSAwIHx8IHNiaXQtPmdyZWVuID4gbWF4Yml0cyB8fA0KKyAgICAgICAgICBzYml0LT5ibHVlID09IDAgfHwgc2JpdC0+Ymx1ZSA+IG1heGJpdHMpDQorICAgICAgew0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgZGVwdGggc3BlY2lmaWVkIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBidWZbMF0gPSBzYml0LT5yZWQ7DQorICAgICAgYnVmWzFdID0gc2JpdC0+Z3JlZW47DQorICAgICAgYnVmWzJdID0gc2JpdC0+Ymx1ZTsNCisgICAgICBzaXplID0gMzsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBpZiAoc2JpdC0+Z3JheSA9PSAwIHx8IHNiaXQtPmdyYXkgPiBwbmdfcHRyLT51c3JfYml0X2RlcHRoKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgYnVmWzBdID0gc2JpdC0+Z3JheTsNCisgICAgICBzaXplID0gMTsNCisgICB9DQorDQorICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkNCisgICB7DQorICAgICAgaWYgKHNiaXQtPmFscGhhID09IDAgfHwgc2JpdC0+YWxwaGEgPiBwbmdfcHRyLT51c3JfYml0X2RlcHRoKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgYnVmW3NpemUrK10gPSBzYml0LT5hbHBoYTsNCisgICB9DQorDQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19zQklULCBidWYsIHNpemUpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX2NIUk1fU1VQUE9SVEVEDQorLyogV3JpdGUgdGhlIGNIUk0gY2h1bmsgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfY0hSTV9maXhlZChwbmdfc3RydWN0cnAgcG5nX3B0ciwgY29uc3QgcG5nX3h5ICp4eSkNCit7DQorICAgcG5nX2J5dGUgYnVmWzMyXTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9jSFJNIik7DQorDQorICAgLyogRWFjaCB2YWx1ZSBpcyBzYXZlZCBpbiAxLzEwMCwwMDB0aHMgKi8NCisgICBwbmdfc2F2ZV9pbnRfMzIoYnVmLCAgICAgIHh5LT53aGl0ZXgpOw0KKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyAgNCwgeHktPndoaXRleSk7DQorDQorICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArICA4LCB4eS0+cmVkeCk7DQorICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDEyLCB4eS0+cmVkeSk7DQorDQorICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDE2LCB4eS0+Z3JlZW54KTsNCisgICBwbmdfc2F2ZV9pbnRfMzIoYnVmICsgMjAsIHh5LT5ncmVlbnkpOw0KKw0KKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyAyNCwgeHktPmJsdWV4KTsNCisgICBwbmdfc2F2ZV9pbnRfMzIoYnVmICsgMjgsIHh5LT5ibHVleSk7DQorDQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19jSFJNLCBidWYsIDMyKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRA0KKy8qIFdyaXRlIHRoZSB0Uk5TIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX3RSTlMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9ieXRlcCB0cmFuc19hbHBoYSwNCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCB0cmFuLCBpbnQgbnVtX3RyYW5zLCBpbnQgY29sb3JfdHlwZSkNCit7DQorICAgcG5nX2J5dGUgYnVmWzZdOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RSTlMiKTsNCisNCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQ0KKyAgIHsNCisgICAgICBpZiAobnVtX3RyYW5zIDw9IDAgfHwgbnVtX3RyYW5zID4gKGludClwbmdfcHRyLT5udW1fcGFsZXR0ZSkNCisgICAgICB7DQorICAgICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsDQorICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiB0cmFuc3BhcmVudCBjb2xvcnMgc3BlY2lmaWVkIik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICAvKiBXcml0ZSB0aGUgY2h1bmsgb3V0IGFzIGl0IGlzICovDQorICAgICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ190Uk5TLCB0cmFuc19hbHBoYSwNCisgICAgICAgICAocG5nX3NpemVfdCludW1fdHJhbnMpOw0KKyAgIH0NCisNCisgICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpDQorICAgew0KKyAgICAgIC8qIE9uZSAxNiBiaXQgdmFsdWUgKi8NCisgICAgICBpZiAodHJhbi0+Z3JheSA+PSAoMSA8PCBwbmdfcHRyLT5iaXRfZGVwdGgpKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfYXBwX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gd3JpdGUgdFJOUyBjaHVuayBvdXQtb2YtcmFuZ2UgZm9yIGJpdF9kZXB0aCIpOw0KKw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIHRyYW4tPmdyYXkpOw0KKyAgICAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfdFJOUywgYnVmLCAocG5nX3NpemVfdCkyKTsNCisgICB9DQorDQorICAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpDQorICAgew0KKyAgICAgIC8qIFRocmVlIDE2IGJpdCB2YWx1ZXMgKi8NCisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgdHJhbi0+cmVkKTsNCisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDIsIHRyYW4tPmdyZWVuKTsNCisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDQsIHRyYW4tPmJsdWUpOw0KKyNpZmRlZiBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA9PSA4ICYmIChidWZbMF0gfCBidWZbMl0gfCBidWZbNF0pKQ0KKyNlbHNlDQorICAgICAgaWYgKGJ1ZlswXSB8IGJ1ZlsyXSB8IGJ1Zls0XSkNCisjZW5kaWYNCisgICAgICB7DQorICAgICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsDQorICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSAxNi1iaXQgdFJOUyBjaHVuayB3aGVuIGJpdF9kZXB0aCBpcyA4Iik7DQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX3RSTlMsIGJ1ZiwgKHBuZ19zaXplX3QpNik7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgcG5nX2FwcF93YXJuaW5nKHBuZ19wdHIsICJDYW4ndCB3cml0ZSB0Uk5TIHdpdGggYW4gYWxwaGEgY2hhbm5lbCIpOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRA0KKy8qIFdyaXRlIHRoZSBiYWNrZ3JvdW5kIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX2JLR0QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jb2xvcl8xNnAgYmFjaywgaW50IGNvbG9yX3R5cGUpDQorew0KKyAgIHBuZ19ieXRlIGJ1Zls2XTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9iS0dEIik7DQorDQorICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkNCisgICB7DQorICAgICAgaWYgKA0KKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRA0KKyAgICAgICAgICAocG5nX3B0ci0+bnVtX3BhbGV0dGUgfHwNCisgICAgICAgICAgKCEocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSkpICYmDQorI2VuZGlmDQorICAgICAgICAgYmFjay0+aW5kZXggPj0gcG5nX3B0ci0+bnVtX3BhbGV0dGUpDQorICAgICAgew0KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGJhY2tncm91bmQgcGFsZXR0ZSBpbmRleCIpOw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgYnVmWzBdID0gYmFjay0+aW5kZXg7DQorICAgICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19iS0dELCBidWYsIChwbmdfc2l6ZV90KTEpOw0KKyAgIH0NCisNCisgICBlbHNlIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpDQorICAgew0KKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmLCBiYWNrLT5yZWQpOw0KKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgMiwgYmFjay0+Z3JlZW4pOw0KKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgNCwgYmFjay0+Ymx1ZSk7DQorI2lmZGVmIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQNCisgICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDggJiYgKGJ1ZlswXSB8IGJ1ZlsyXSB8IGJ1Zls0XSkpDQorI2Vsc2UNCisgICAgICBpZiAoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKQ0KKyNlbmRpZg0KKyAgICAgIHsNCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLA0KKyAgICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSAxNi1iaXQgYktHRCBjaHVuayB3aGVuIGJpdF9kZXB0aCBpcyA4Iik7DQorDQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisNCisgICAgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX2JLR0QsIGJ1ZiwgKHBuZ19zaXplX3QpNik7DQorICAgfQ0KKw0KKyAgIGVsc2UNCisgICB7DQorICAgICAgaWYgKGJhY2stPmdyYXkgPj0gKDEgPDwgcG5nX3B0ci0+Yml0X2RlcHRoKSkNCisgICAgICB7DQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwNCisgICAgICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gd3JpdGUgYktHRCBjaHVuayBvdXQtb2YtcmFuZ2UgZm9yIGJpdF9kZXB0aCIpOw0KKw0KKyAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorDQorICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGJhY2stPmdyYXkpOw0KKyAgICAgIHBuZ193cml0ZV9jb21wbGV0ZV9jaHVuayhwbmdfcHRyLCBwbmdfYktHRCwgYnVmLCAocG5nX3NpemVfdCkyKTsNCisgICB9DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQNCisvKiBXcml0ZSB0aGUgaGlzdG9ncmFtICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX2hJU1QocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF91aW50XzE2cCBoaXN0LCBpbnQgbnVtX2hpc3QpDQorew0KKyAgIGludCBpOw0KKyAgIHBuZ19ieXRlIGJ1ZlszXTsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9oSVNUIik7DQorDQorICAgaWYgKG51bV9oaXN0ID4gKGludClwbmdfcHRyLT5udW1fcGFsZXR0ZSkNCisgICB7DQorICAgICAgcG5nX2RlYnVnMigzLCAibnVtX2hpc3QgPSAlZCwgbnVtX3BhbGV0dGUgPSAlZCIsIG51bV9oaXN0LA0KKyAgICAgICAgICBwbmdfcHRyLT5udW1fcGFsZXR0ZSk7DQorDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIGhpc3RvZ3JhbSBlbnRyaWVzIHNwZWNpZmllZCIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfaElTVCwgKHBuZ191aW50XzMyKShudW1faGlzdCAqIDIpKTsNCisNCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2hpc3Q7IGkrKykNCisgICB7DQorICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGhpc3RbaV0pOw0KKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpMik7DQorICAgfQ0KKw0KKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQNCisvKiBXcml0ZSBhIHRFWHQgY2h1bmsgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfdEVYdChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2NvbnN0X2NoYXJwIHRleHQsDQorICAgIHBuZ19zaXplX3QgdGV4dF9sZW4pDQorew0KKyAgIHBuZ191aW50XzMyIGtleV9sZW47DQorICAgcG5nX2J5dGUgbmV3X2tleVs4MF07DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfdEVYdCIpOw0KKw0KKyAgIGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksIG5ld19rZXkpOw0KKw0KKyAgIGlmIChrZXlfbGVuID09IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ0RVh0OiBpbnZhbGlkIGtleXdvcmQiKTsNCisNCisgICBpZiAodGV4dCA9PSBOVUxMIHx8ICp0ZXh0ID09ICdcMCcpDQorICAgICAgdGV4dF9sZW4gPSAwOw0KKw0KKyAgIGVsc2UNCisgICAgICB0ZXh0X2xlbiA9IHN0cmxlbih0ZXh0KTsNCisNCisgICBpZiAodGV4dF9sZW4gPiBQTkdfVUlOVF8zMV9NQVggLSAoa2V5X2xlbisxKSkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInRFWHQ6IHRleHQgdG9vIGxvbmciKTsNCisNCisgICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgMCBhZnRlciB0aGUga2V5ICovDQorICAgcG5nX3dyaXRlX2NodW5rX2hlYWRlcihwbmdfcHRyLCBwbmdfdEVYdCwNCisgICAgICAgKHBuZ191aW50XzMyKS8qY2hlY2tlZCBhYm92ZSovKGtleV9sZW4gKyB0ZXh0X2xlbiArIDEpKTsNCisgICAvKg0KKyAgICAqIFdlIGxlYXZlIGl0IHRvIHRoZSBhcHBsaWNhdGlvbiB0byBtZWV0IFBORy0xLjAgcmVxdWlyZW1lbnRzIG9uIHRoZQ0KKyAgICAqIGNvbnRlbnRzIG9mIHRoZSB0ZXh0LiAgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgZGlzY291cmFnZSB0aGUgdXNlIG9mDQorICAgICogYW55IG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBORVdMSU5FLiAgSVNPIFBORyB3aWxsIGZvcmJpZCB0aGVtLg0KKyAgICAqIFRoZSBOVUwgY2hhcmFjdGVyIGlzIGZvcmJpZGRlbiBieSBQTkctMS4wIHRocm91Z2ggUE5HLTEuMiBhbmQgSVNPIFBORy4NCisgICAgKi8NCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfa2V5LCBrZXlfbGVuICsgMSk7DQorDQorICAgaWYgKHRleHRfbGVuKQ0KKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfY29uc3RfYnl0ZXApdGV4dCwgdGV4dF9sZW4pOw0KKw0KKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQNCisvKiBXcml0ZSBhIGNvbXByZXNzZWQgdGV4dCBjaHVuayAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ193cml0ZV96VFh0KHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAga2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCwNCisgICAgcG5nX3NpemVfdCB0ZXh0X2xlbiwgaW50IGNvbXByZXNzaW9uKQ0KK3sNCisgICBwbmdfdWludF8zMiBrZXlfbGVuOw0KKyAgIHBuZ19ieXRlIG5ld19rZXlbODFdOw0KKyAgIGNvbXByZXNzaW9uX3N0YXRlIGNvbXA7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfelRYdCIpOw0KKyAgIFBOR19VTlVTRUQodGV4dF9sZW4pIC8qIEFsd2F5cyB1c2Ugc3RybGVuICovDQorDQorICAgaWYgKGNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpDQorICAgew0KKyAgICAgIHBuZ193cml0ZV90RVh0KHBuZ19wdHIsIGtleSwgdGV4dCwgMCk7DQorICAgICAgcmV0dXJuOw0KKyAgIH0NCisNCisgICBpZiAoY29tcHJlc3Npb24gIT0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpUWHQ6IGludmFsaWQgY29tcHJlc3Npb24gdHlwZSIpOw0KKw0KKyAgIGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksIG5ld19rZXkpOw0KKw0KKyAgIGlmIChrZXlfbGVuID09IDApDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6VFh0OiBpbnZhbGlkIGtleXdvcmQiKTsNCisNCisgICAvKiBBZGQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBhbmQgMSBmb3IgdGhlIGtleXdvcmQgc2VwYXJhdG9yLiAqLw0KKyAgIG5ld19rZXlbKytrZXlfbGVuXSA9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0U7DQorICAgKytrZXlfbGVuOw0KKw0KKyAgIC8qIENvbXB1dGUgdGhlIGNvbXByZXNzZWQgZGF0YTsgZG8gaXQgbm93IGZvciB0aGUgbGVuZ3RoICovDQorICAgcG5nX3RleHRfY29tcHJlc3NfaW5pdCgmY29tcCwgKHBuZ19jb25zdF9ieXRlcCl0ZXh0LA0KKyAgICAgIHRleHQgPT0gTlVMTCA/IDAgOiBzdHJsZW4odGV4dCkpOw0KKw0KKyAgIGlmIChwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCBwbmdfelRYdCwgJmNvbXAsIGtleV9sZW4pICE9IFpfT0spDQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsNCisNCisgICAvKiBXcml0ZSBzdGFydCBvZiBjaHVuayAqLw0KKyAgIHBuZ193cml0ZV9jaHVua19oZWFkZXIocG5nX3B0ciwgcG5nX3pUWHQsIGtleV9sZW4gKyBjb21wLm91dHB1dF9sZW4pOw0KKw0KKyAgIC8qIFdyaXRlIGtleSAqLw0KKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIG5ld19rZXksIGtleV9sZW4pOw0KKw0KKyAgIC8qIFdyaXRlIHRoZSBjb21wcmVzc2VkIGRhdGEgKi8NCisgICBwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfcHRyLCAmY29tcCk7DQorDQorICAgLyogQ2xvc2UgdGhlIGNodW5rICovDQorICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRA0KKy8qIFdyaXRlIGFuIGlUWHQgY2h1bmsgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfaVRYdChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGNvbXByZXNzaW9uLCBwbmdfY29uc3RfY2hhcnAga2V5LA0KKyAgICBwbmdfY29uc3RfY2hhcnAgbGFuZywgcG5nX2NvbnN0X2NoYXJwIGxhbmdfa2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCkNCit7DQorICAgcG5nX3VpbnRfMzIga2V5X2xlbiwgcHJlZml4X2xlbjsNCisgICBwbmdfc2l6ZV90IGxhbmdfbGVuLCBsYW5nX2tleV9sZW47DQorICAgcG5nX2J5dGUgbmV3X2tleVs4Ml07DQorICAgY29tcHJlc3Npb25fc3RhdGUgY29tcDsNCisNCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pVFh0Iik7DQorDQorICAga2V5X2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIGtleSwgbmV3X2tleSk7DQorDQorICAgaWYgKGtleV9sZW4gPT0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImlUWHQ6IGludmFsaWQga2V5d29yZCIpOw0KKw0KKyAgIC8qIFNldCB0aGUgY29tcHJlc3Npb24gZmxhZyAqLw0KKyAgIHN3aXRjaCAoY29tcHJlc3Npb24pDQorICAgew0KKyAgICAgIGNhc2UgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORToNCisgICAgICBjYXNlIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU6DQorICAgICAgICAgY29tcHJlc3Npb24gPSBuZXdfa2V5Wysra2V5X2xlbl0gPSAwOyAvKiBubyBjb21wcmVzc2lvbiAqLw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgIGNhc2UgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdDoNCisgICAgICBjYXNlIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQ6DQorICAgICAgICAgY29tcHJlc3Npb24gPSBuZXdfa2V5Wysra2V5X2xlbl0gPSAxOyAvKiBjb21wcmVzc2VkICovDQorICAgICAgICAgYnJlYWs7DQorDQorICAgICAgZGVmYXVsdDoNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImlUWHQ6IGludmFsaWQgY29tcHJlc3Npb24iKTsNCisgICB9DQorDQorICAgbmV3X2tleVsrK2tleV9sZW5dID0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRTsNCisgICArK2tleV9sZW47IC8qIGZvciB0aGUga2V5d29kIHNlcGFyYXRvciAqLw0KKw0KKyAgIC8qIFdlIGxlYXZlIGl0IHRvIHRoZSBhcHBsaWNhdGlvbiB0byBtZWV0IFBORy0xLjAgcmVxdWlyZW1lbnRzIG9uIHRoZQ0KKyAgICAqIGNvbnRlbnRzIG9mIHRoZSB0ZXh0LiAgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgZGlzY291cmFnZSB0aGUgdXNlIG9mDQorICAgICogYW55IG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBORVdMSU5FLiAgSVNPIFBORywgaG93ZXZlciwNCisgICAgKiBzcGVjaWZpZXMgdGhhdCB0aGUgdGV4dCBpcyBVVEYtOCBhbmQgdGhpcyByZWFsbHkgZG9lc24ndCByZXF1aXJlIGFueQ0KKyAgICAqIGNoZWNraW5nLg0KKyAgICAqDQorICAgICogVGhlIE5VTCBjaGFyYWN0ZXIgaXMgZm9yYmlkZGVuIGJ5IFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGFuZCBJU08gUE5HLg0KKyAgICAqDQorICAgICogVE9ETzogdmFsaWRhdGUgdGhlIGxhbmd1YWdlIHRhZyBjb3JyZWN0bHkgKHNlZSB0aGUgc3BlYy4pDQorICAgICovDQorICAgaWYgKGxhbmcgPT0gTlVMTCkgbGFuZyA9ICIiOyAvKiBlbXB0eSBsYW5ndWFnZSBpcyB2YWxpZCAqLw0KKyAgIGxhbmdfbGVuID0gc3RybGVuKGxhbmcpKzE7DQorICAgaWYgKGxhbmdfa2V5ID09IE5VTEwpIGxhbmdfa2V5ID0gIiI7IC8qIG1heSBiZSBlbXB0eSAqLw0KKyAgIGxhbmdfa2V5X2xlbiA9IHN0cmxlbihsYW5nX2tleSkrMTsNCisgICBpZiAodGV4dCA9PSBOVUxMKSB0ZXh0ID0gIiI7IC8qIG1heSBiZSBlbXB0eSAqLw0KKw0KKyAgIHByZWZpeF9sZW4gPSBrZXlfbGVuOw0KKyAgIGlmIChsYW5nX2xlbiA+IFBOR19VSU5UXzMxX01BWC1wcmVmaXhfbGVuKQ0KKyAgICAgIHByZWZpeF9sZW4gPSBQTkdfVUlOVF8zMV9NQVg7DQorICAgZWxzZQ0KKyAgICAgIHByZWZpeF9sZW4gPSAocG5nX3VpbnRfMzIpKHByZWZpeF9sZW4gKyBsYW5nX2xlbik7DQorDQorICAgaWYgKGxhbmdfa2V5X2xlbiA+IFBOR19VSU5UXzMxX01BWC1wcmVmaXhfbGVuKQ0KKyAgICAgIHByZWZpeF9sZW4gPSBQTkdfVUlOVF8zMV9NQVg7DQorICAgZWxzZQ0KKyAgICAgIHByZWZpeF9sZW4gPSAocG5nX3VpbnRfMzIpKHByZWZpeF9sZW4gKyBsYW5nX2tleV9sZW4pOw0KKw0KKyAgIHBuZ190ZXh0X2NvbXByZXNzX2luaXQoJmNvbXAsIChwbmdfY29uc3RfYnl0ZXApdGV4dCwgc3RybGVuKHRleHQpKTsNCisNCisgICBpZiAoY29tcHJlc3Npb24pDQorICAgew0KKyAgICAgIGlmIChwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCBwbmdfaVRYdCwgJmNvbXAsIHByZWZpeF9sZW4pICE9IFpfT0spDQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsNCisgICB9DQorDQorICAgZWxzZQ0KKyAgIHsNCisgICAgICBpZiAoY29tcC5pbnB1dF9sZW4gPiBQTkdfVUlOVF8zMV9NQVgtcHJlZml4X2xlbikNCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgImlUWHQ6IHVuY29tcHJlc3NlZCB0ZXh0IHRvbyBsb25nIik7DQorDQorICAgICAgLyogU28gdGhlIHN0cmluZyB3aWxsIGZpdCBpbiBhIGNodW5rOiAqLw0KKyAgICAgIGNvbXAub3V0cHV0X2xlbiA9IChwbmdfdWludF8zMikvKlNBRkUqL2NvbXAuaW5wdXRfbGVuOw0KKyAgIH0NCisNCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIHBuZ19pVFh0LCBjb21wLm91dHB1dF9sZW4gKyBwcmVmaXhfbGVuKTsNCisNCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfa2V5LCBrZXlfbGVuKTsNCisNCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2NvbnN0X2J5dGVwKWxhbmcsIGxhbmdfbGVuKTsNCisNCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2NvbnN0X2J5dGVwKWxhbmdfa2V5LCBsYW5nX2tleV9sZW4pOw0KKw0KKyAgIGlmIChjb21wcmVzc2lvbikNCisgICAgICBwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfcHRyLCAmY29tcCk7DQorDQorICAgZWxzZQ0KKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfY29uc3RfYnl0ZXApdGV4dCwgY29tcC5pbnB1dF9sZW4pOw0KKw0KKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQNCisvKiBXcml0ZSB0aGUgb0ZGcyBjaHVuayAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ193cml0ZV9vRkZzKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfaW50XzMyIHhfb2Zmc2V0LCBwbmdfaW50XzMyIHlfb2Zmc2V0LA0KKyAgICBpbnQgdW5pdF90eXBlKQ0KK3sNCisgICBwbmdfYnl0ZSBidWZbOV07DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfb0ZGcyIpOw0KKw0KKyAgIGlmICh1bml0X3R5cGUgPj0gUE5HX09GRlNFVF9MQVNUKQ0KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbnJlY29nbml6ZWQgdW5pdCB0eXBlIGZvciBvRkZzIGNodW5rIik7DQorDQorICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiwgeF9vZmZzZXQpOw0KKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyA0LCB5X29mZnNldCk7DQorICAgYnVmWzhdID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsNCisNCisgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX29GRnMsIGJ1ZiwgKHBuZ19zaXplX3QpOSk7DQorfQ0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQNCisvKiBXcml0ZSB0aGUgcENBTCBjaHVuayAoZGVzY3JpYmVkIGluIHRoZSBQTkcgZXh0ZW5zaW9ucyBkb2N1bWVudCkgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfcENBTChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsDQorICAgIHBuZ19pbnRfMzIgWDEsIGludCB0eXBlLCBpbnQgbnBhcmFtcywgcG5nX2NvbnN0X2NoYXJwIHVuaXRzLA0KKyAgICBwbmdfY2hhcnBwIHBhcmFtcykNCit7DQorICAgcG5nX3VpbnRfMzIgcHVycG9zZV9sZW47DQorICAgcG5nX3NpemVfdCB1bml0c19sZW4sIHRvdGFsX2xlbjsNCisgICBwbmdfc2l6ZV90cCBwYXJhbXNfbGVuOw0KKyAgIHBuZ19ieXRlIGJ1ZlsxMF07DQorICAgcG5nX2J5dGUgbmV3X3B1cnBvc2VbODBdOw0KKyAgIGludCBpOw0KKw0KKyAgIHBuZ19kZWJ1ZzEoMSwgImluIHBuZ193cml0ZV9wQ0FMICglZCBwYXJhbWV0ZXJzKSIsIG5wYXJhbXMpOw0KKw0KKyAgIGlmICh0eXBlID49IFBOR19FUVVBVElPTl9MQVNUKQ0KKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5yZWNvZ25pemVkIGVxdWF0aW9uIHR5cGUgZm9yIHBDQUwgY2h1bmsiKTsNCisNCisgICBwdXJwb3NlX2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIHB1cnBvc2UsIG5ld19wdXJwb3NlKTsNCisNCisgICBpZiAocHVycG9zZV9sZW4gPT0gMCkNCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBDQUw6IGludmFsaWQga2V5d29yZCIpOw0KKw0KKyAgICsrcHVycG9zZV9sZW47IC8qIHRlcm1pbmF0b3IgKi8NCisNCisgICBwbmdfZGVidWcxKDMsICJwQ0FMIHB1cnBvc2UgbGVuZ3RoID0gJWQiLCAoaW50KXB1cnBvc2VfbGVuKTsNCisgICB1bml0c19sZW4gPSBzdHJsZW4odW5pdHMpICsgKG5wYXJhbXMgPT0gMCA/IDAgOiAxKTsNCisgICBwbmdfZGVidWcxKDMsICJwQ0FMIHVuaXRzIGxlbmd0aCA9ICVkIiwgKGludCl1bml0c19sZW4pOw0KKyAgIHRvdGFsX2xlbiA9IHB1cnBvc2VfbGVuICsgdW5pdHNfbGVuICsgMTA7DQorDQorICAgcGFyYW1zX2xlbiA9IChwbmdfc2l6ZV90cClwbmdfbWFsbG9jKHBuZ19wdHIsDQorICAgICAgIChwbmdfYWxsb2Nfc2l6ZV90KShucGFyYW1zICogKHNpemVvZiAocG5nX3NpemVfdCkpKSk7DQorDQorICAgLyogRmluZCB0aGUgbGVuZ3RoIG9mIGVhY2ggcGFyYW1ldGVyLCBtYWtpbmcgc3VyZSB3ZSBkb24ndCBjb3VudCB0aGUNCisgICAgKiBudWxsIHRlcm1pbmF0b3IgZm9yIHRoZSBsYXN0IHBhcmFtZXRlci4NCisgICAgKi8NCisgICBmb3IgKGkgPSAwOyBpIDwgbnBhcmFtczsgaSsrKQ0KKyAgIHsNCisgICAgICBwYXJhbXNfbGVuW2ldID0gc3RybGVuKHBhcmFtc1tpXSkgKyAoaSA9PSBucGFyYW1zIC0gMSA/IDAgOiAxKTsNCisgICAgICBwbmdfZGVidWcyKDMsICJwQ0FMIHBhcmFtZXRlciAlZCBsZW5ndGggPSAlbHUiLCBpLA0KKyAgICAgICAgICAodW5zaWduZWQgbG9uZylwYXJhbXNfbGVuW2ldKTsNCisgICAgICB0b3RhbF9sZW4gKz0gcGFyYW1zX2xlbltpXTsNCisgICB9DQorDQorICAgcG5nX2RlYnVnMSgzLCAicENBTCB0b3RhbCBsZW5ndGggPSAlZCIsIChpbnQpdG90YWxfbGVuKTsNCisgICBwbmdfd3JpdGVfY2h1bmtfaGVhZGVyKHBuZ19wdHIsIHBuZ19wQ0FMLCAocG5nX3VpbnRfMzIpdG90YWxfbGVuKTsNCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBuZXdfcHVycG9zZSwgcHVycG9zZV9sZW4pOw0KKyAgIHBuZ19zYXZlX2ludF8zMihidWYsIFgwKTsNCisgICBwbmdfc2F2ZV9pbnRfMzIoYnVmICsgNCwgWDEpOw0KKyAgIGJ1Zls4XSA9IChwbmdfYnl0ZSl0eXBlOw0KKyAgIGJ1Zls5XSA9IChwbmdfYnl0ZSlucGFyYW1zOw0KKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpMTApOw0KKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfY29uc3RfYnl0ZXApdW5pdHMsIChwbmdfc2l6ZV90KXVuaXRzX2xlbik7DQorDQorICAgZm9yIChpID0gMDsgaSA8IG5wYXJhbXM7IGkrKykNCisgICB7DQorICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19jb25zdF9ieXRlcClwYXJhbXNbaV0sIHBhcmFtc19sZW5baV0pOw0KKyAgIH0NCisNCisgICBwbmdfZnJlZShwbmdfcHRyLCBwYXJhbXNfbGVuKTsNCisgICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVEDQorLyogV3JpdGUgdGhlIHNDQUwgY2h1bmsgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfc0NBTF9zKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgdW5pdCwgcG5nX2NvbnN0X2NoYXJwIHdpZHRoLA0KKyAgICBwbmdfY29uc3RfY2hhcnAgaGVpZ2h0KQ0KK3sNCisgICBwbmdfYnl0ZSBidWZbNjRdOw0KKyAgIHBuZ19zaXplX3Qgd2xlbiwgaGxlbiwgdG90YWxfbGVuOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NDQUxfcyIpOw0KKw0KKyAgIHdsZW4gPSBzdHJsZW4od2lkdGgpOw0KKyAgIGhsZW4gPSBzdHJsZW4oaGVpZ2h0KTsNCisgICB0b3RhbF9sZW4gPSB3bGVuICsgaGxlbiArIDI7DQorDQorICAgaWYgKHRvdGFsX2xlbiA+IDY0KQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2FuJ3Qgd3JpdGUgc0NBTCAoYnVmZmVyIHRvbyBzbWFsbCkiKTsNCisgICAgICByZXR1cm47DQorICAgfQ0KKw0KKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSl1bml0Ow0KKyAgIG1lbWNweShidWYgKyAxLCB3aWR0aCwgd2xlbiArIDEpOyAgICAgIC8qIEFwcGVuZCB0aGUgJ1wwJyBoZXJlICovDQorICAgbWVtY3B5KGJ1ZiArIHdsZW4gKyAyLCBoZWlnaHQsIGhsZW4pOyAgLyogRG8gTk9UIGFwcGVuZCB0aGUgJ1wwJyBoZXJlICovDQorDQorICAgcG5nX2RlYnVnMSgzLCAic0NBTCB0b3RhbCBsZW5ndGggPSAldSIsICh1bnNpZ25lZCBpbnQpdG90YWxfbGVuKTsNCisgICBwbmdfd3JpdGVfY29tcGxldGVfY2h1bmsocG5nX3B0ciwgcG5nX3NDQUwsIGJ1ZiwgdG90YWxfbGVuKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRA0KKy8qIFdyaXRlIHRoZSBwSFlzIGNodW5rICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX3BIWXMocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0LA0KKyAgICBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdCwNCisgICAgaW50IHVuaXRfdHlwZSkNCit7DQorICAgcG5nX2J5dGUgYnVmWzldOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3BIWXMiKTsNCisNCisgICBpZiAodW5pdF90eXBlID49IFBOR19SRVNPTFVUSU9OX0xBU1QpDQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIHBIWXMgY2h1bmsiKTsNCisNCisgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgeF9waXhlbHNfcGVyX3VuaXQpOw0KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgNCwgeV9waXhlbHNfcGVyX3VuaXQpOw0KKyAgIGJ1Zls4XSA9IChwbmdfYnl0ZSl1bml0X3R5cGU7DQorDQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ19wSFlzLCBidWYsIChwbmdfc2l6ZV90KTkpOw0KK30NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEDQorLyogV3JpdGUgdGhlIHRJTUUgY2h1bmsuICBVc2UgZWl0aGVyIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkNCisgKiBvciBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpLCBvciBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgeW91cnNlbGYuDQorICovDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX3RJTUUocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF90aW1lcCBtb2RfdGltZSkNCit7DQorICAgcG5nX2J5dGUgYnVmWzddOw0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RJTUUiKTsNCisNCisgICBpZiAobW9kX3RpbWUtPm1vbnRoICA+IDEyIHx8IG1vZF90aW1lLT5tb250aCAgPCAxIHx8DQorICAgICAgIG1vZF90aW1lLT5kYXkgICAgPiAzMSB8fCBtb2RfdGltZS0+ZGF5ICAgIDwgMSB8fA0KKyAgICAgICBtb2RfdGltZS0+aG91ciAgID4gMjMgfHwgbW9kX3RpbWUtPnNlY29uZCA+IDYwKQ0KKyAgIHsNCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCB0aW1lIHNwZWNpZmllZCBmb3IgdElNRSBjaHVuayIpOw0KKyAgICAgIHJldHVybjsNCisgICB9DQorDQorICAgcG5nX3NhdmVfdWludF8xNihidWYsIG1vZF90aW1lLT55ZWFyKTsNCisgICBidWZbMl0gPSBtb2RfdGltZS0+bW9udGg7DQorICAgYnVmWzNdID0gbW9kX3RpbWUtPmRheTsNCisgICBidWZbNF0gPSBtb2RfdGltZS0+aG91cjsNCisgICBidWZbNV0gPSBtb2RfdGltZS0+bWludXRlOw0KKyAgIGJ1Zls2XSA9IG1vZF90aW1lLT5zZWNvbmQ7DQorDQorICAgcG5nX3dyaXRlX2NvbXBsZXRlX2NodW5rKHBuZ19wdHIsIHBuZ190SU1FLCBidWYsIChwbmdfc2l6ZV90KTcpOw0KK30NCisjZW5kaWYNCisNCisvKiBJbml0aWFsaXplcyB0aGUgcm93IHdyaXRpbmcgY2FwYWJpbGl0eSBvZiBsaWJwbmcgKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfc3RhcnRfcm93KHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQ0KK3sNCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovDQorDQorICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsNCisNCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8NCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsNCisNCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07DQorDQorICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLw0KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsNCisjZW5kaWYNCisNCisgICBwbmdfYWxsb2Nfc2l6ZV90IGJ1Zl9zaXplOw0KKyAgIGludCB1c3JfcGl4ZWxfZGVwdGg7DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc3RhcnRfcm93Iik7DQorDQorICAgdXNyX3BpeGVsX2RlcHRoID0gcG5nX3B0ci0+dXNyX2NoYW5uZWxzICogcG5nX3B0ci0+dXNyX2JpdF9kZXB0aDsNCisgICBidWZfc2l6ZSA9IFBOR19ST1dCWVRFUyh1c3JfcGl4ZWxfZGVwdGgsIHBuZ19wdHItPndpZHRoKSArIDE7DQorDQorICAgLyogMS41LjY6IGFkZGVkIHRvIGFsbG93IGNoZWNraW5nIGluIHRoZSByb3cgd3JpdGUgY29kZS4gKi8NCisgICBwbmdfcHRyLT50cmFuc2Zvcm1lZF9waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOw0KKyAgIHBuZ19wdHItPm1heGltdW1fcGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpdXNyX3BpeGVsX2RlcHRoOw0KKw0KKyAgIC8qIFNldCB1cCByb3cgYnVmZmVyICovDQorICAgcG5nX3B0ci0+cm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCBidWZfc2l6ZSk7DQorDQorICAgcG5nX3B0ci0+cm93X2J1ZlswXSA9IFBOR19GSUxURVJfVkFMVUVfTk9ORTsNCisNCisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQNCisgICAvKiBTZXQgdXAgZmlsdGVyaW5nIGJ1ZmZlciwgaWYgdXNpbmcgdGhpcyBmaWx0ZXIgKi8NCisgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9TVUIpDQorICAgew0KKyAgICAgIHBuZ19wdHItPnN1Yl9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsNCisNCisgICAgICBwbmdfcHRyLT5zdWJfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9TVUI7DQorICAgfQ0KKw0KKyAgIC8qIFdlIG9ubHkgbmVlZCB0byBrZWVwIHRoZSBwcmV2aW91cyByb3cgaWYgd2UgYXJlIHVzaW5nIG9uZSBvZiB0aGVzZS4gKi8NCisgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgKFBOR19GSUxURVJfQVZHIHwgUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfUEFFVEgpKQ0KKyAgIHsNCisgICAgICAvKiBTZXQgdXAgcHJldmlvdXMgcm93IGJ1ZmZlciAqLw0KKyAgICAgIHBuZ19wdHItPnByZXZfcm93ID0gKHBuZ19ieXRlcClwbmdfY2FsbG9jKHBuZ19wdHIsIGJ1Zl9zaXplKTsNCisNCisgICAgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9VUCkNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+dXBfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsDQorICAgICAgICAgICAgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsNCisNCisgICAgICAgICBwbmdfcHRyLT51cF9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1VQOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9BVkcpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPmF2Z19yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgICAgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsNCisNCisgICAgICAgICBwbmdfcHRyLT5hdmdfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9BVkc7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1BBRVRIKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwNCisgICAgICAgICAgICAgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsNCisNCisgICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmIC8qIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICAvKiBJZiBpbnRlcmxhY2VkLCB3ZSBuZWVkIHRvIHNldCB1cCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHBhc3MgKi8NCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkNCisgICB7DQorICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpDQorICAgICAgew0KKyAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArIHBuZ19wYXNzX3lpbmNbMF0gLSAxIC0NCisgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0WzBdKSAvIHBuZ19wYXNzX3lpbmNbMF07DQorDQorICAgICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gKHBuZ19wdHItPndpZHRoICsgcG5nX3Bhc3NfaW5jWzBdIC0gMSAtDQorICAgICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0WzBdKSAvIHBuZ19wYXNzX2luY1swXTsNCisgICAgICB9DQorDQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsNCisgICAgICAgICBwbmdfcHRyLT51c3Jfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIGVsc2UNCisjZW5kaWYNCisgICB7DQorICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSBwbmdfcHRyLT5oZWlnaHQ7DQorICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7DQorICAgfQ0KK30NCisNCisvKiBJbnRlcm5hbCB1c2Ugb25seS4gIENhbGxlZCB3aGVuIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSByb3cgb2YgZGF0YS4gKi8NCit2b2lkIC8qIFBSSVZBVEUgKi8NCitwbmdfd3JpdGVfZmluaXNoX3Jvdyhwbmdfc3RydWN0cnAgcG5nX3B0cikNCit7DQorI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisgICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLw0KKw0KKyAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLw0KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07DQorDQorICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07DQorDQorICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLw0KKyAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgcG5nX3Bhc3NfeXN0YXJ0WzddID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9Ow0KKw0KKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8NCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07DQorI2VuZGlmDQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZmluaXNoX3JvdyIpOw0KKw0KKyAgIC8qIE5leHQgcm93ICovDQorICAgcG5nX3B0ci0+cm93X251bWJlcisrOw0KKw0KKyAgIC8qIFNlZSBpZiB3ZSBhcmUgZG9uZSAqLw0KKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpDQorICAgICAgcmV0dXJuOw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEDQorICAgLyogSWYgaW50ZXJsYWNlZCwgZ28gdG8gbmV4dCBwYXNzICovDQorICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpDQorICAgew0KKyAgICAgIHBuZ19wdHItPnJvd19udW1iZXIgPSAwOw0KKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfcHRyLT5wYXNzKys7DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAgLyogTG9vcCB1bnRpbCB3ZSBmaW5kIGEgbm9uLXplcm8gd2lkdGggb3IgaGVpZ2h0IHBhc3MgKi8NCisgICAgICAgICBkbw0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfcHRyLT5wYXNzKys7DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPj0gNykNCisgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBwbmdfcHRyLT51c3Jfd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKw0KKyAgICAgICAgICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0NCisgICAgICAgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8NCisgICAgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOw0KKw0KKyAgICAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArDQorICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0NCisgICAgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0W3BuZ19wdHItPnBhc3NdKSAvDQorICAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc107DQorDQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpDQorICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgfSB3aGlsZSAocG5nX3B0ci0+dXNyX3dpZHRoID09IDAgfHwgcG5nX3B0ci0+bnVtX3Jvd3MgPT0gMCk7DQorDQorICAgICAgfQ0KKw0KKyAgICAgIC8qIFJlc2V0IHRoZSByb3cgYWJvdmUgdGhlIGltYWdlIGZvciB0aGUgbmV4dCBwYXNzICovDQorICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA3KQ0KKyAgICAgIHsNCisgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9yb3cgIT0gTlVMTCkNCisgICAgICAgICAgICBtZW1zZXQocG5nX3B0ci0+cHJldl9yb3csIDAsDQorICAgICAgICAgICAgICAgIChwbmdfc2l6ZV90KShQTkdfUk9XQllURVMocG5nX3B0ci0+dXNyX2NoYW5uZWxzKg0KKyAgICAgICAgICAgICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoLCBwbmdfcHRyLT53aWR0aCkpICsgMSk7DQorDQorICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICB9DQorI2VuZGlmDQorDQorICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGp1c3Qgd3JpdHRlbiB0aGUgbGFzdCByb3csIHNvIHdlIG5lZWQNCisgICAgICB0byBmbHVzaCB0aGUgY29tcHJlc3NvciAqLw0KKyAgIHBuZ19jb21wcmVzc19JREFUKHBuZ19wdHIsIE5VTEwsIDAsIFpfRklOSVNIKTsNCit9DQorDQorI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisvKiBQaWNrIG91dCB0aGUgY29ycmVjdCBwaXhlbHMgZm9yIHRoZSBpbnRlcmxhY2UgcGFzcy4NCisgKiBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRvIGdvIHRocm91Z2ggdGhlIHJvdyB3aXRoIGEgc291cmNlDQorICogcG9pbnRlciBhbmQgYSBkZXN0aW5hdGlvbiBwb2ludGVyIChzcCBhbmQgZHApLCBhbmQgY29weSB0aGUNCisgKiBjb3JyZWN0IHBpeGVscyBmb3IgdGhlIHBhc3MuICBBcyB0aGUgcm93IGdldHMgY29tcGFjdGVkLA0KKyAqIHNwIHdpbGwgYWx3YXlzIGJlID49IGRwLCBzbyB3ZSBzaG91bGQgbmV2ZXIgb3ZlcndyaXRlIGFueXRoaW5nLg0KKyAqIFNlZSB0aGUgZGVmYXVsdDogY2FzZSBmb3IgdGhlIGVhc2llc3QgY29kZSB0byB1bmRlcnN0YW5kLg0KKyAqLw0KK3ZvaWQgLyogUFJJVkFURSAqLw0KK3BuZ19kb193cml0ZV9pbnRlcmxhY2UocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MpDQorew0KKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovDQorDQorICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovDQorICAgc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsNCisNCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8NCisgICBzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlICBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07DQorDQorICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlIik7DQorDQorICAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBvbiB0aGUgbGFzdCBwYXNzICg2KSAqLw0KKyAgIGlmIChwYXNzIDwgNikNCisgICB7DQorICAgICAgLyogRWFjaCBwaXhlbCBkZXB0aCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgKi8NCisgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5waXhlbF9kZXB0aCkNCisgICAgICB7DQorICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwOw0KKyAgICAgICAgICAgIGludCBzaGlmdDsNCisgICAgICAgICAgICBpbnQgZDsNCisgICAgICAgICAgICBpbnQgdmFsdWU7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgZHAgPSByb3c7DQorICAgICAgICAgICAgZCA9IDA7DQorICAgICAgICAgICAgc2hpZnQgPSA3Ow0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOw0KKyAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDMpOw0KKyAgICAgICAgICAgICAgIHZhbHVlID0gKGludCkoKnNwID4+ICg3IC0gKGludCkoaSAmIDB4MDcpKSkgJiAweDAxOw0KKyAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsNCisNCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkNCisgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3Ow0KKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKWQ7DQorICAgICAgICAgICAgICAgICAgZCA9IDA7DQorICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICBzaGlmdC0tOw0KKw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoc2hpZnQgIT0gNykNCisgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpZDsNCisNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICB9DQorDQorICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwOw0KKyAgICAgICAgICAgIGludCBzaGlmdDsNCisgICAgICAgICAgICBpbnQgZDsNCisgICAgICAgICAgICBpbnQgdmFsdWU7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7DQorDQorICAgICAgICAgICAgZHAgPSByb3c7DQorICAgICAgICAgICAgc2hpZnQgPSA2Ow0KKyAgICAgICAgICAgIGQgPSAwOw0KKw0KKyAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOw0KKyAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDIpOw0KKyAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiAoKDMgLSAoaW50KShpICYgMHgwMykpIDw8IDEpKSAmIDB4MDM7DQorICAgICAgICAgICAgICAgZCB8PSAodmFsdWUgPDwgc2hpZnQpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7DQorICAgICAgICAgICAgICAgICAgKmRwKysgPSAocG5nX2J5dGUpZDsNCisgICAgICAgICAgICAgICAgICBkID0gMDsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA2KQ0KKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSlkOw0KKw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgew0KKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgZHA7DQorICAgICAgICAgICAgaW50IHNoaWZ0Ow0KKyAgICAgICAgICAgIGludCBkOw0KKyAgICAgICAgICAgIGludCB2YWx1ZTsNCisgICAgICAgICAgICBwbmdfdWludF8zMiBpOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsNCisNCisgICAgICAgICAgICBkcCA9IHJvdzsNCisgICAgICAgICAgICBzaGlmdCA9IDQ7DQorICAgICAgICAgICAgZCA9IDA7DQorICAgICAgICAgICAgZm9yIChpID0gcG5nX3Bhc3Nfc3RhcnRbcGFzc107IGkgPCByb3dfd2lkdGg7DQorICAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDEpOw0KKyAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiAoKDEgLSAoaW50KShpICYgMHgwMSkpIDw8IDIpKSAmIDB4MGY7DQorICAgICAgICAgICAgICAgZCB8PSAodmFsdWUgPDwgc2hpZnQpOw0KKw0KKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQ0KKyAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7DQorICAgICAgICAgICAgICAgICAgKmRwKysgPSAocG5nX2J5dGUpZDsNCisgICAgICAgICAgICAgICAgICBkID0gMDsNCisgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA0KQ0KKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSlkOw0KKw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7DQorICAgICAgICAgICAgcG5nX2J5dGVwIGRwOw0KKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7DQorICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOw0KKyAgICAgICAgICAgIHBuZ19zaXplX3QgcGl4ZWxfYnl0ZXM7DQorDQorICAgICAgICAgICAgLyogU3RhcnQgYXQgdGhlIGJlZ2lubmluZyAqLw0KKyAgICAgICAgICAgIGRwID0gcm93Ow0KKw0KKyAgICAgICAgICAgIC8qIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIGVhY2ggcGl4ZWwgdGFrZXMgdXAgKi8NCisgICAgICAgICAgICBwaXhlbF9ieXRlcyA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggPj4gMyk7DQorDQorICAgICAgICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSByb3csIG9ubHkgbG9va2luZyBhdCB0aGUgcGl4ZWxzIHRoYXQgbWF0dGVyICovDQorICAgICAgICAgICAgZm9yIChpID0gcG5nX3Bhc3Nfc3RhcnRbcGFzc107IGkgPCByb3dfd2lkdGg7DQorICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIC8qIEZpbmQgb3V0IHdoZXJlIHRoZSBvcmlnaW5hbCBwaXhlbCBpcyAqLw0KKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpaSAqIHBpeGVsX2J5dGVzOw0KKw0KKyAgICAgICAgICAgICAgIC8qIE1vdmUgdGhlIHBpeGVsICovDQorICAgICAgICAgICAgICAgaWYgKGRwICE9IHNwKQ0KKyAgICAgICAgICAgICAgICAgIG1lbWNweShkcCwgc3AsIHBpeGVsX2J5dGVzKTsNCisNCisgICAgICAgICAgICAgICAvKiBOZXh0IHBpeGVsICovDQorICAgICAgICAgICAgICAgZHAgKz0gcGl4ZWxfYnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgLyogU2V0IG5ldyByb3cgd2lkdGggKi8NCisgICAgICByb3dfaW5mby0+d2lkdGggPSAocm93X2luZm8tPndpZHRoICsNCisgICAgICAgICAgcG5nX3Bhc3NfaW5jW3Bhc3NdIC0gMSAtDQorICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3Bhc3NdKSAvDQorICAgICAgICAgIHBuZ19wYXNzX2luY1twYXNzXTsNCisNCisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLA0KKyAgICAgICAgICByb3dfaW5mby0+d2lkdGgpOw0KKyAgIH0NCit9DQorI2VuZGlmDQorDQorLyogVGhpcyBmaWx0ZXJzIHRoZSByb3csIGNob29zZXMgd2hpY2ggZmlsdGVyIHRvIHVzZSwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5DQorICogYmVlbiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdGhlbiB3cml0ZXMgdGhlIHJvdyBvdXQgd2l0aCB0aGUNCisgKiBjaG9zZW4gZmlsdGVyLg0KKyAqLw0KK3N0YXRpYyB2b2lkIHBuZ193cml0ZV9maWx0ZXJlZF9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBmaWx0ZXJlZF9yb3csDQorICAgcG5nX3NpemVfdCByb3dfYnl0ZXMpOw0KKw0KKyNkZWZpbmUgUE5HX01BWFNVTSAoKChwbmdfdWludF8zMikoLTEpKSA+PiAxKQ0KKyNkZWZpbmUgUE5HX0hJU0hJRlQgMTANCisjZGVmaW5lIFBOR19MT01BU0sgKChwbmdfdWludF8zMikweGZmZmZMKQ0KKyNkZWZpbmUgUE5HX0hJTUFTSyAoKHBuZ191aW50XzMyKSh+UE5HX0xPTUFTSyA+PiBQTkdfSElTSElGVCkpDQordm9pZCAvKiBQUklWQVRFICovDQorcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvKQ0KK3sNCisgICBwbmdfYnl0ZXAgYmVzdF9yb3c7DQorI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEDQorICAgcG5nX2J5dGVwIHByZXZfcm93LCByb3dfYnVmOw0KKyAgIHBuZ191aW50XzMyIG1pbnMsIGJwcDsNCisgICBwbmdfYnl0ZSBmaWx0ZXJfdG9fZG8gPSBwbmdfcHRyLT5kb19maWx0ZXI7DQorICAgcG5nX3NpemVfdCByb3dfYnl0ZXMgPSByb3dfaW5mby0+cm93Ynl0ZXM7DQorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEDQorICAgaW50IG51bV9wX2ZpbHRlcnMgPSBwbmdfcHRyLT5udW1fcHJldl9maWx0ZXJzOw0KKyNlbmRpZg0KKw0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZpbmRfZmlsdGVyIik7DQorDQorI2lmbmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KKyAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPT0gMCAmJiBmaWx0ZXJfdG9fZG8gPT0gUE5HX0FMTF9GSUxURVJTKQ0KKyAgew0KKyAgICAgLyogVGhlc2Ugd2lsbCBuZXZlciBiZSBzZWxlY3RlZCBzbyB3ZSBuZWVkIG5vdCB0ZXN0IHRoZW0uICovDQorICAgICBmaWx0ZXJfdG9fZG8gJj0gfihQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9QQUVUSCk7DQorICB9DQorI2VuZGlmDQorDQorICAgLyogRmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgb2Zmc2V0IGVhY2ggcGl4ZWwgaXMgKi8NCisgICBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsNCisNCisgICBwcmV2X3JvdyA9IHBuZ19wdHItPnByZXZfcm93Ow0KKyNlbmRpZg0KKyAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+cm93X2J1ZjsNCisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQNCisgICByb3dfYnVmID0gYmVzdF9yb3c7DQorICAgbWlucyA9IFBOR19NQVhTVU07DQorDQorICAgLyogVGhlIHByZWRpY3Rpb24gbWV0aG9kIHdlIHVzZSBpcyB0byBmaW5kIHdoaWNoIG1ldGhvZCBwcm92aWRlcyB0aGUNCisgICAgKiBzbWFsbGVzdCB2YWx1ZSB3aGVuIHN1bW1pbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgZGlzdGFuY2VzDQorICAgICogZnJvbSB6ZXJvLCB1c2luZyBhbnl0aGluZyA+PSAxMjggYXMgbmVnYXRpdmUgbnVtYmVycy4gIFRoaXMgaXMga25vd24NCisgICAgKiBhcyB0aGUgIm1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIiBoZXVyaXN0aWMuICBPdGhlcg0KKyAgICAqIGhldXJpc3RpY3MgYXJlIHRoZSAid2VpZ2h0ZWQgbWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiDQorICAgICogKGV4cGVyaW1lbnRhbCBhbmQgY2FuIGluIHRoZW9yeSBpbXByb3ZlIGNvbXByZXNzaW9uKSwgYW5kIHRoZSAiemxpYg0KKyAgICAqIHByZWRpY3RpdmUiIG1ldGhvZCAobm90IGltcGxlbWVudGVkIHlldCksIHdoaWNoIGRvZXMgdGVzdCBjb21wcmVzc2lvbnMNCisgICAgKiBvZiBsaW5lcyB1c2luZyBkaWZmZXJlbnQgZmlsdGVyIG1ldGhvZHMsIGFuZCB0aGVuIGNob29zZXMgdGhlDQorICAgICogKHNlcmllcyBvZikgZmlsdGVyKHMpIHRoYXQgZ2l2ZSBtaW5pbXVtIGNvbXByZXNzZWQgZGF0YSBzaXplIChWRVJZDQorICAgICogY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSkuDQorICAgICoNCisgICAgKiBHUlIgOTgwNTI1OiAgY29uc2lkZXIgYWxzbw0KKyAgICAqDQorICAgICogICAoMSkgbWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMgZnJvbSBydW5uaW5nIGF2ZXJhZ2UgKGkuZS4sDQorICAgICogICAgICAga2VlcCBydW5uaW5nIHN1bSBvZiBub24tYWJzb2x1dGUgZGlmZmVyZW5jZXMgJiBjb3VudCBvZiBieXRlcykNCisgICAgKiAgICAgICBbdHJhY2sgZGlzcGVyc2lvbiwgdG9vPyAgcmVzdGFydCBhdmVyYWdlIGlmIGRpc3BlcnNpb24gdG9vIGxhcmdlP10NCisgICAgKg0KKyAgICAqICAoMWIpIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIGZyb20gc2xpZGluZyBhdmVyYWdlLCBwcm9iYWJseQ0KKyAgICAqICAgICAgIHdpdGggd2luZG93IHNpemUgPD0gZGVmbGF0ZSB3aW5kb3cgKHVzdWFsbHkgMzJLKQ0KKyAgICAqDQorICAgICogICAoMikgbWluaW11bSBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlcyBmcm9tIHplcm8gb3IgcnVubmluZyBhdmVyYWdlDQorICAgICogICAgICAgKGkuZS4sIH4gcm9vdC1tZWFuLXNxdWFyZSBhcHByb2FjaCkNCisgICAgKi8NCisNCisNCisgICAvKiBXZSBkb24ndCBuZWVkIHRvIHRlc3QgdGhlICdubyBmaWx0ZXInIGNhc2UgaWYgdGhpcyBpcyB0aGUgb25seSBmaWx0ZXINCisgICAgKiB0aGF0IGhhcyBiZWVuIGNob3NlbiwgYXMgaXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB0byB0aGUgZGF0YS4NCisgICAgKi8NCisgICBpZiAoKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfTk9ORSkgJiYgZmlsdGVyX3RvX2RvICE9IFBOR19GSUxURVJfTk9ORSkNCisgICB7DQorICAgICAgcG5nX2J5dGVwIHJwOw0KKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDA7DQorICAgICAgcG5nX3NpemVfdCBpOw0KKyAgICAgIGludCB2Ow0KKw0KKyAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKywgcnArKykNCisgICAgICB7DQorICAgICAgICAgdiA9ICpycDsNCisgICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7DQorICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KKyAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQ0KKyAgICAgIHsNCisgICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87DQorICAgICAgICAgaW50IGo7DQorICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOw0KKyAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOyAvKiBHaXZlcyB1cyBzb21lIGZvb3Ryb29tICovDQorDQorICAgICAgICAgLyogUmVkdWNlIHRoZSBzdW0gaWYgd2UgbWF0Y2ggYW55IG9mIHRoZSBwcmV2aW91cyByb3dzICovDQorICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX05PTkUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+DQorICAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7DQorDQorICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIC8qIEZhY3RvciBpbiB0aGUgY29zdCBvZiB0aGlzIGZpbHRlciAodGhpcyBpcyBoZXJlIGZvciBjb21wbGV0ZW5lc3MsDQorICAgICAgICAgICogYnV0IGl0IG1ha2VzIG5vIHNlbnNlIHRvIGhhdmUgYSAiY29zdCIgZm9yIHRoZSBOT05FIGZpbHRlciwgYXMNCisgICAgICAgICAgKiBpdCBoYXMgdGhlIG1pbmltdW0gcG9zc2libGUgY29tcHV0YXRpb25hbCBjb3N0IC0gbm9uZSkuDQorICAgICAgICAgICovDQorICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9OT05FXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9OT05FXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykNCisgICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87DQorICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgIG1pbnMgPSBzdW07DQorICAgfQ0KKw0KKyAgIC8qIFN1YiBmaWx0ZXIgKi8NCisgICBpZiAoZmlsdGVyX3RvX2RvID09IFBOR19GSUxURVJfU1VCKQ0KKyAgIC8qIEl0J3MgdGhlIG9ubHkgZmlsdGVyIHNvIG5vIHRlc3RpbmcgaXMgbmVlZGVkICovDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBycCwgbHAsIGRwOw0KKyAgICAgIHBuZ19zaXplX3QgaTsNCisNCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnN1Yl9yb3cgKyAxOyBpIDwgYnBwOw0KKyAgICAgICAgICAgaSsrLCBycCsrLCBkcCsrKQ0KKyAgICAgIHsNCisgICAgICAgICAqZHAgPSAqcnA7DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsNCisgICAgICAgICBpKyssIHJwKyssIGxwKyssIGRwKyspDQorICAgICAgew0KKyAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKChpbnQpKnJwIC0gKGludCkqbHApICYgMHhmZik7DQorICAgICAgfQ0KKw0KKyAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+c3ViX3JvdzsNCisgICB9DQorDQorICAgZWxzZSBpZiAoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9TVUIpDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBycCwgZHAsIGxwOw0KKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsNCisgICAgICBwbmdfc2l6ZV90IGk7DQorICAgICAgaW50IHY7DQorDQorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEDQorICAgICAgLyogV2UgdGVtcG9yYXJpbHkgaW5jcmVhc2UgdGhlICJtaW5pbXVtIHN1bSIgYnkgdGhlIGZhY3RvciB3ZQ0KKyAgICAgICAqIHdvdWxkIHJlZHVjZSB0aGUgc3VtIG9mIHRoaXMgZmlsdGVyLCBzbyB0aGF0IHdlIGNhbiBkbyB0aGUNCisgICAgICAgKiBlYXJseSBleGl0IGNvbXBhcmlzb24gd2l0aG91dCBzY2FsaW5nIHRoZSBzdW0gZWFjaCB0aW1lLg0KKyAgICAgICAqLw0KKyAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgajsNCisgICAgICAgICBwbmdfdWludF8zMiBsbWhpLCBsbWxvOw0KKyAgICAgICAgIGxtbG8gPSBsbWlucyAmIFBOR19MT01BU0s7DQorICAgICAgICAgbG1oaSA9IChsbWlucyA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOw0KKw0KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9TVUIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisNCisgICAgICAgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+DQorICAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1NVQl0pID4+DQorICAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOw0KKw0KKyAgICAgICAgIGlmIChsbWhpID4gUE5HX0hJTUFTSykNCisgICAgICAgICAgICBsbWlucyA9IFBOR19NQVhTVU07DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGxtaW5zID0gKGxtaGkgPDwgUE5HX0hJU0hJRlQpICsgbG1sbzsNCisgICAgICB9DQorI2VuZGlmDQorDQorICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5zdWJfcm93ICsgMTsgaSA8IGJwcDsNCisgICAgICAgICAgIGkrKywgcnArKywgZHArKykNCisgICAgICB7DQorICAgICAgICAgdiA9ICpkcCA9ICpycDsNCisNCisgICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsNCisgICAgICAgICBpKyssIHJwKyssIGxwKyssIGRwKyspDQorICAgICAgew0KKyAgICAgICAgIHYgPSAqZHAgPSAocG5nX2J5dGUpKCgoaW50KSpycCAtIChpbnQpKmxwKSAmIDB4ZmYpOw0KKw0KKyAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsNCisNCisgICAgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KKyAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgajsNCisgICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87DQorICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOw0KKyAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOw0KKw0KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9TVUIpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+Pg0KKyAgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOw0KKw0KKyAgICAgICAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+Pg0KKyAgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykNCisgICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87DQorICAgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICAgIGlmIChzdW0gPCBtaW5zKQ0KKyAgICAgIHsNCisgICAgICAgICBtaW5zID0gc3VtOw0KKyAgICAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+c3ViX3JvdzsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIC8qIFVwIGZpbHRlciAqLw0KKyAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9VUCkNCisgICB7DQorICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHA7DQorICAgICAgcG5nX3NpemVfdCBpOw0KKw0KKyAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+dXBfcm93ICsgMSwNCisgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7DQorICAgICAgICAgIGkrKywgcnArKywgcHArKywgZHArKykNCisgICAgICB7DQorICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKGludCkqcnAgLSAoaW50KSpwcCkgJiAweGZmKTsNCisgICAgICB9DQorDQorICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT51cF9yb3c7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfVVApDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBycCwgZHAsIHBwOw0KKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsNCisgICAgICBwbmdfc2l6ZV90IGk7DQorICAgICAgaW50IHY7DQorDQorDQorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpDQorICAgICAgew0KKyAgICAgICAgIGludCBqOw0KKyAgICAgICAgIHBuZ191aW50XzMyIGxtaGksIGxtbG87DQorICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsNCisgICAgICAgICBsbWhpID0gKGxtaW5zID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7DQorDQorICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1VQKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+DQorICAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7DQorDQorICAgICAgICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+Pg0KKyAgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1VQXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1VQXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgaWYgKGxtaGkgPiBQTkdfSElNQVNLKQ0KKyAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgbG1pbnMgPSAobG1oaSA8PCBQTkdfSElTSElGVCkgKyBsbWxvOw0KKyAgICAgIH0NCisjZW5kaWYNCisNCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnVwX3JvdyArIDEsDQorICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspDQorICAgICAgew0KKyAgICAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoaW50KSpwcCsrKSAmIDB4ZmYpOw0KKw0KKyAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsNCisNCisgICAgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KKyAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQ0KKyAgICAgIHsNCisgICAgICAgICBpbnQgajsNCisgICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87DQorICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOw0KKyAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOw0KKw0KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspDQorICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9VUCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisNCisgICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+Pg0KKyAgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICB9DQorDQorICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9VUF0pID4+DQorICAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOw0KKw0KKyAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfVVBdKSA+Pg0KKyAgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsNCisNCisgICAgICAgICBpZiAoc3VtaGkgPiBQTkdfSElNQVNLKQ0KKyAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHN1bSA9IChzdW1oaSA8PCBQTkdfSElTSElGVCkgKyBzdW1sbzsNCisgICAgICB9DQorI2VuZGlmDQorDQorICAgICAgaWYgKHN1bSA8IG1pbnMpDQorICAgICAgew0KKyAgICAgICAgIG1pbnMgPSBzdW07DQorICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT51cF9yb3c7DQorICAgICAgfQ0KKyAgIH0NCisNCisgICAvKiBBdmcgZmlsdGVyICovDQorICAgaWYgKGZpbHRlcl90b19kbyA9PSBQTkdfRklMVEVSX0FWRykNCisgICB7DQorICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHAsIGxwOw0KKyAgICAgIHBuZ191aW50XzMyIGk7DQorDQorICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5hdmdfcm93ICsgMSwNCisgICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgYnBwOyBpKyspDQorICAgICAgew0KKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoaW50KSpwcCsrIC8gMikpICYgMHhmZik7DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoKChpbnQpKnBwKysgKyAoaW50KSpscCsrKSAvIDIpKQ0KKyAgICAgICAgICAgICAgICAgJiAweGZmKTsNCisgICAgICB9DQorICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5hdmdfcm93Ow0KKyAgIH0NCisNCisgICBlbHNlIGlmIChmaWx0ZXJfdG9fZG8gJiBQTkdfRklMVEVSX0FWRykNCisgICB7DQorICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHAsIGxwOw0KKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsNCisgICAgICBwbmdfc2l6ZV90IGk7DQorICAgICAgaW50IHY7DQorDQorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpDQorICAgICAgew0KKyAgICAgICAgIGludCBqOw0KKyAgICAgICAgIHBuZ191aW50XzMyIGxtaGksIGxtbG87DQorICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsNCisgICAgICAgICBsbWhpID0gKGxtaW5zID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7DQorDQorICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX0FWRykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+Pg0KKyAgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOw0KKw0KKyAgICAgICAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+Pg0KKyAgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsNCisNCisgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfQVZHXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgaWYgKGxtaGkgPiBQTkdfSElNQVNLKQ0KKyAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsNCisNCisgICAgICAgICBlbHNlDQorICAgICAgICAgICAgbG1pbnMgPSAobG1oaSA8PCBQTkdfSElTSElGVCkgKyBsbWxvOw0KKyAgICAgIH0NCisjZW5kaWYNCisNCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPmF2Z19yb3cgKyAxLA0KKyAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykNCisgICAgICB7DQorICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoaW50KSpwcCsrIC8gMikpICYgMHhmZik7DQorDQorICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2Ow0KKyAgICAgIH0NCisNCisgICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykNCisgICAgICB7DQorICAgICAgICAgdiA9ICpkcCsrID0NCisgICAgICAgICAgICAgKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoKGludCkqcHArKyArIChpbnQpKmxwKyspIC8gMikpICYgMHhmZik7DQorDQorICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2Ow0KKw0KKyAgICAgICAgIGlmIChzdW0gPiBsbWlucykgIC8qIFdlIGFyZSBhbHJlYWR5IHdvcnNlLCBkb24ndCBjb250aW51ZS4gKi8NCisgICAgICAgICAgICBicmVhazsNCisgICAgICB9DQorDQorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEDQorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpDQorICAgICAgew0KKyAgICAgICAgIGludCBqOw0KKyAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsNCisgICAgICAgICBzdW1sbyA9IHN1bSAmIFBOR19MT01BU0s7DQorICAgICAgICAgc3VtaGkgPSAoc3VtID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7DQorDQorICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykNCisgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX05PTkUpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+DQorICAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7DQorDQorICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfQVZHXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+Pg0KKyAgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsNCisNCisgICAgICAgICBpZiAoc3VtaGkgPiBQTkdfSElNQVNLKQ0KKyAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07DQorDQorICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHN1bSA9IChzdW1oaSA8PCBQTkdfSElTSElGVCkgKyBzdW1sbzsNCisgICAgICB9DQorI2VuZGlmDQorDQorICAgICAgaWYgKHN1bSA8IG1pbnMpDQorICAgICAgew0KKyAgICAgICAgIG1pbnMgPSBzdW07DQorICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5hdmdfcm93Ow0KKyAgICAgIH0NCisgICB9DQorDQorICAgLyogUGFldGggZmlsdGVyICovDQorICAgaWYgKGZpbHRlcl90b19kbyA9PSBQTkdfRklMVEVSX1BBRVRIKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgY3AsIGxwOw0KKyAgICAgIHBuZ19zaXplX3QgaTsNCisNCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnBhZXRoX3JvdyArIDEsDQorICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgYnBwOyBpKyspDQorICAgICAgew0KKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIChpbnQpKnBwKyspICYgMHhmZik7DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMSwgY3AgPSBwcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykNCisgICAgICB7DQorICAgICAgICAgaW50IGEsIGIsIGMsIHBhLCBwYiwgcGMsIHA7DQorDQorICAgICAgICAgYiA9ICpwcCsrOw0KKyAgICAgICAgIGMgPSAqY3ArKzsNCisgICAgICAgICBhID0gKmxwKys7DQorDQorICAgICAgICAgcCA9IGIgLSBjOw0KKyAgICAgICAgIHBjID0gYSAtIGM7DQorDQorI2lmZGVmIFBOR19VU0VfQUJTDQorICAgICAgICAgcGEgPSBhYnMocCk7DQorICAgICAgICAgcGIgPSBhYnMocGMpOw0KKyAgICAgICAgIHBjID0gYWJzKHAgKyBwYyk7DQorI2Vsc2UNCisgICAgICAgICBwYSA9IHAgPCAwID8gLXAgOiBwOw0KKyAgICAgICAgIHBiID0gcGMgPCAwID8gLXBjIDogcGM7DQorICAgICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7DQorI2VuZGlmDQorDQorICAgICAgICAgcCA9IChwYSA8PSBwYiAmJiBwYSA8PXBjKSA/IGEgOiAocGIgPD0gcGMpID8gYiA6IGM7DQorDQorICAgICAgICAgKmRwKysgPSAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gcCkgJiAweGZmKTsNCisgICAgICB9DQorICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5wYWV0aF9yb3c7DQorICAgfQ0KKw0KKyAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfUEFFVEgpDQorICAgew0KKyAgICAgIHBuZ19ieXRlcCBycCwgZHAsIHBwLCBjcCwgbHA7DQorICAgICAgcG5nX3VpbnRfMzIgc3VtID0gMCwgbG1pbnMgPSBtaW5zOw0KKyAgICAgIHBuZ19zaXplX3QgaTsNCisgICAgICBpbnQgdjsNCisNCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQNCisgICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkNCisgICAgICB7DQorICAgICAgICAgaW50IGo7DQorICAgICAgICAgcG5nX3VpbnRfMzIgbG1oaSwgbG1sbzsNCisgICAgICAgICBsbWxvID0gbG1pbnMgJiBQTkdfTE9NQVNLOw0KKyAgICAgICAgIGxtaGkgPSAobG1pbnMgPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsNCisNCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfUEFFVEgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisNCisgICAgICAgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+DQorICAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgIH0NCisNCisgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+Pg0KKyAgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsNCisNCisgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+Pg0KKyAgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsNCisNCisgICAgICAgICBpZiAobG1oaSA+IFBOR19ISU1BU0spDQorICAgICAgICAgICAgbG1pbnMgPSBQTkdfTUFYU1VNOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBsbWlucyA9IChsbWhpIDw8IFBOR19ISVNISUZUKSArIGxtbG87DQorICAgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+cGFldGhfcm93ICsgMSwNCisgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykNCisgICAgICB7DQorICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIChpbnQpKnBwKyspICYgMHhmZik7DQorDQorICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2Ow0KKyAgICAgIH0NCisNCisgICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDEsIGNwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspDQorICAgICAgew0KKyAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOw0KKw0KKyAgICAgICAgIGIgPSAqcHArKzsNCisgICAgICAgICBjID0gKmNwKys7DQorICAgICAgICAgYSA9ICpscCsrOw0KKw0KKyNpZm5kZWYgUE5HX1NMT1dfUEFFVEgNCisgICAgICAgICBwID0gYiAtIGM7DQorICAgICAgICAgcGMgPSBhIC0gYzsNCisjaWZkZWYgUE5HX1VTRV9BQlMNCisgICAgICAgICBwYSA9IGFicyhwKTsNCisgICAgICAgICBwYiA9IGFicyhwYyk7DQorICAgICAgICAgcGMgPSBhYnMocCArIHBjKTsNCisjZWxzZQ0KKyAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7DQorICAgICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsNCisgICAgICAgICBwYyA9IChwICsgcGMpIDwgMCA/IC0ocCArIHBjKSA6IHAgKyBwYzsNCisjZW5kaWYNCisgICAgICAgICBwID0gKHBhIDw9IHBiICYmIHBhIDw9cGMpID8gYSA6IChwYiA8PSBwYykgPyBiIDogYzsNCisjZWxzZSAvKiBQTkdfU0xPV19QQUVUSCAqLw0KKyAgICAgICAgIHAgPSBhICsgYiAtIGM7DQorICAgICAgICAgcGEgPSBhYnMocCAtIGEpOw0KKyAgICAgICAgIHBiID0gYWJzKHAgLSBiKTsNCisgICAgICAgICBwYyA9IGFicyhwIC0gYyk7DQorDQorICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKQ0KKyAgICAgICAgICAgIHAgPSBhOw0KKw0KKyAgICAgICAgIGVsc2UgaWYgKHBiIDw9IHBjKQ0KKyAgICAgICAgICAgIHAgPSBiOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwID0gYzsNCisjZW5kaWYgLyogUE5HX1NMT1dfUEFFVEggKi8NCisNCisgICAgICAgICB2ID0gKmRwKysgPSAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gcCkgJiAweGZmKTsNCisNCisgICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7DQorDQorICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQNCisgICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkNCisgICAgICB7DQorICAgICAgICAgaW50IGo7DQorICAgICAgICAgcG5nX3VpbnRfMzIgc3VtaGksIHN1bWxvOw0KKyAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsNCisgICAgICAgICBzdW1oaSA9IChzdW0gPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsNCisNCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQ0KKyAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfUEFFVEgpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+DQorICAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7DQorDQorICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4NCisgICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgfQ0KKw0KKyAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+Pg0KKyAgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsNCisNCisgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1BBRVRIXSkgPj4NCisgICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7DQorDQorICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykNCisgICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOw0KKw0KKyAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87DQorICAgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICAgIGlmIChzdW0gPCBtaW5zKQ0KKyAgICAgIHsNCisgICAgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnBhZXRoX3JvdzsNCisgICAgICB9DQorICAgfQ0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLw0KKw0KKyAgIC8qIERvIHRoZSBhY3R1YWwgd3JpdGluZyBvZiB0aGUgZmlsdGVyZWQgcm93IGRhdGEgZnJvbSB0aGUgY2hvc2VuIGZpbHRlci4gKi8NCisgICBwbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19wdHIsIGJlc3Rfcm93LCByb3dfaW5mby0+cm93Ynl0ZXMrMSk7DQorDQorI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEDQorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEDQorICAgLyogU2F2ZSB0aGUgdHlwZSBvZiBmaWx0ZXIgd2UgcGlja2VkIHRoaXMgdGltZSBmb3IgZnV0dXJlIGNhbGN1bGF0aW9ucyAqLw0KKyAgIGlmIChwbmdfcHRyLT5udW1fcHJldl9maWx0ZXJzID4gMCkNCisgICB7DQorICAgICAgaW50IGo7DQorDQorICAgICAgZm9yIChqID0gMTsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykNCisgICAgICB7DQorICAgICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID0gcG5nX3B0ci0+cHJldl9maWx0ZXJzW2ogLSAxXTsNCisgICAgICB9DQorDQorICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID0gYmVzdF9yb3dbMF07DQorICAgfQ0KKyNlbmRpZg0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLw0KK30NCisNCisNCisvKiBEbyB0aGUgYWN0dWFsIHdyaXRpbmcgb2YgYSBwcmV2aW91c2x5IGZpbHRlcmVkIHJvdy4gKi8NCitzdGF0aWMgdm9pZA0KK3BuZ193cml0ZV9maWx0ZXJlZF9yb3cocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCBmaWx0ZXJlZF9yb3csDQorICAgcG5nX3NpemVfdCBmdWxsX3Jvd19sZW5ndGgvKmluY2x1ZGVzIGZpbHRlciBieXRlKi8pDQorew0KKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyIpOw0KKw0KKyAgIHBuZ19kZWJ1ZzEoMiwgImZpbHRlciA9ICVkIiwgZmlsdGVyZWRfcm93WzBdKTsNCisNCisgICBwbmdfY29tcHJlc3NfSURBVChwbmdfcHRyLCBmaWx0ZXJlZF9yb3csIGZ1bGxfcm93X2xlbmd0aCwgWl9OT19GTFVTSCk7DQorDQorICAgLyogU3dhcCB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgcm93cyAqLw0KKyAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyAhPSBOVUxMKQ0KKyAgIHsNCisgICAgICBwbmdfYnl0ZXAgdHB0cjsNCisNCisgICAgICB0cHRyID0gcG5nX3B0ci0+cHJldl9yb3c7DQorICAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSBwbmdfcHRyLT5yb3dfYnVmOw0KKyAgICAgIHBuZ19wdHItPnJvd19idWYgPSB0cHRyOw0KKyAgIH0NCisNCisgICAvKiBGaW5pc2ggcm93IC0gdXBkYXRlcyBjb3VudGVycyBhbmQgZmx1c2hlcyB6bGliIGlmIGxhc3Qgcm93ICovDQorICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7DQorDQorI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCisgICBwbmdfcHRyLT5mbHVzaF9yb3dzKys7DQorDQorICAgaWYgKHBuZ19wdHItPmZsdXNoX2Rpc3QgPiAwICYmDQorICAgICAgIHBuZ19wdHItPmZsdXNoX3Jvd3MgPj0gcG5nX3B0ci0+Zmx1c2hfZGlzdCkNCisgICB7DQorICAgICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOw0KKyAgIH0NCisjZW5kaWYNCit9DQorI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8NCisjZW5kaWYvL19GUERGQVBJX01JTklfDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmcuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmYjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5nLmgKQEAgLTAsMCArMSwzNTYzIEBACisKKy8qIHBuZy5oIC0gaGVhZGVyIGZpbGUgZm9yIFBORyByZWZlcmVuY2UgbGlicmFyeQorICoKKyAqIGxpYnBuZyB2ZXJzaW9uIDEuNi4zIC0gSnVseSAxOCwgMjAxMworICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlIChTZWUgTElDRU5TRSwgYmVsb3cpCisgKgorICogQXV0aG9ycyBhbmQgbWFpbnRhaW5lcnM6CisgKiAgIGxpYnBuZyB2ZXJzaW9ucyAwLjcxLCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTY6IEd1eSBTY2hhbG5hdAorICogICBsaWJwbmcgdmVyc2lvbnMgMC44OWMsIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NzogQW5kcmVhcyBEaWxnZXIKKyAqICAgbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjYuMyAtIEp1bHkgMTgsIDIwMTM6IEdsZW5uCisgKiAgIFNlZSBhbHNvICJDb250cmlidXRpbmcgQXV0aG9ycyIsIGJlbG93LgorICoKKyAqIE5vdGUgYWJvdXQgbGlicG5nIHZlcnNpb24gbnVtYmVyczoKKyAqCisgKiAgIER1ZSB0byB2YXJpb3VzIG1pc2NvbW11bmljYXRpb25zLCB1bmZvcmVzZWVuIGNvZGUgaW5jb21wYXRpYmlsaXRpZXMKKyAqICAgYW5kIG9jY2FzaW9uYWwgZmFjdG9ycyBvdXRzaWRlIHRoZSBhdXRob3JzJyBjb250cm9sLCB2ZXJzaW9uIG51bWJlcmluZworICogICBvbiB0aGUgbGlicmFyeSBoYXMgbm90IGFsd2F5cyBiZWVuIGNvbnNpc3RlbnQgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4KKyAqICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIG1hdHRlcnMgc2luY2UgdmVyc2lvbiAwLjg5Yywgd2hpY2ggd2FzCisgKiAgIHRoZSBmaXJzdCB3aWRlbHkgdXNlZCByZWxlYXNlOgorICoKKyAqICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgcG5nLmggIHBuZy5oICBzaGFyZWQtbGliCisgKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgIHN0cmluZyAgIGludCAgdmVyc2lvbgorICogICAgLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0gLS0tLS0gIC0tLS0tLS0tLS0KKyAqICAgIDAuODljICIxLjAgYmV0YSAzIiAgICAgMC44OSAgICAgIDg5ICAxLjAuODkKKyAqICAgIDAuOTAgICIxLjAgYmV0YSA0IiAgICAgMC45MCAgICAgIDkwICAwLjkwICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTBdCisgKiAgICAwLjk1ICAiMS4wIGJldGEgNSIgICAgIDAuOTUgICAgICA5NSAgMC45NSAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk1XQorICogICAgMC45NiAgIjEuMCBiZXRhIDYiICAgICAwLjk2ICAgICAgOTYgIDAuOTYgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45Nl0KKyAqICAgIDAuOTdiICIxLjAwLjk3IGJldGEgNyIgMS4wMC45NyAgIDk3ICAxLjAuMSBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTddCisgKiAgICAwLjk3YyAgICAgICAgICAgICAgICAgIDAuOTcgICAgICA5NyAgMi4wLjk3CisgKiAgICAwLjk4ICAgICAgICAgICAgICAgICAgIDAuOTggICAgICA5OCAgMi4wLjk4CisgKiAgICAwLjk5ICAgICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OCAgMi4wLjk5CisgKiAgICAwLjk5YS1tICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OSAgMi4wLjk5CisgKiAgICAxLjAwICAgICAgICAgICAgICAgICAgIDEuMDAgICAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCisgKiAgICAxLjAuMCAgICAgIChmcm9tIGhlcmUgb24sIHRoZSAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCisgKiAgICAxLjAuMSAgICAgICBwbmcuaCBzdHJpbmcgaXMgICAxMDAwMSAgMi4xLjAKKyAqICAgIDEuMC4xYS1lICAgIGlkZW50aWNhbCB0byB0aGUgIDEwMDAyICBmcm9tIGhlcmUgb24sIHRoZSBzaGFyZWQgbGlicmFyeQorICogICAgMS4wLjIgICAgICAgc291cmNlIHZlcnNpb24pICAgMTAwMDIgIGlzIDIuViB3aGVyZSBWIGlzIHRoZSBzb3VyY2UgY29kZQorICogICAgMS4wLjJhLWIgICAgICAgICAgICAgICAgICAgICAgMTAwMDMgIHZlcnNpb24sIGV4Y2VwdCBhcyBub3RlZC4KKyAqICAgIDEuMC4zICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAzCisgKiAgICAxLjAuM2EtZCAgICAgICAgICAgICAgICAgICAgICAxMDAwNAorICogICAgMS4wLjQgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDQKKyAqICAgIDEuMC40YS1mICAgICAgICAgICAgICAgICAgICAgIDEwMDA1CisgKiAgICAxLjAuNSAoKyAyIHBhdGNoZXMpICAgICAgICAgICAxMDAwNQorICogICAgMS4wLjVhLWQgICAgICAgICAgICAgICAgICAgICAgMTAwMDYKKyAqICAgIDEuMC41ZS1yICAgICAgICAgICAgICAgICAgICAgIDEwMTAwIChub3Qgc291cmNlIGNvbXBhdGlibGUpCisgKiAgICAxLjAuNXMtdiAgICAgICAgICAgICAgICAgICAgICAxMDAwNiAobm90IGJpbmFyeSBjb21wYXRpYmxlKQorICogICAgMS4wLjYgKCsgMyBwYXRjaGVzKSAgICAgICAgICAgMTAwMDYgKHN0aWxsIGJpbmFyeSBpbmNvbXBhdGlibGUpCisgKiAgICAxLjAuNmQtZiAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKKyAqICAgIDEuMC42ZyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3CisgKiAgICAxLjAuNmggICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmggKHRlc3RpbmcgeHkueiBzby1udW1iZXJpbmcpCisgKiAgICAxLjAuNmkgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmkKKyAqICAgIDEuMC42aiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAyLjEuMC42aiAoaW5jb21wYXRpYmxlIHdpdGggMS4wLjApCisgKiAgICAxLjAuN2JldGExMS0xNCAgICAgICAgRExMTlVNICAxMDAwNyAgMi4xLjAuN2JldGExMS0xNCAoYmluYXJ5IGNvbXBhdGlibGUpCisgKiAgICAxLjAuN2JldGExNS0xOCAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN2JldGExNS0xOCAoYmluYXJ5IGNvbXBhdGlibGUpCisgKiAgICAxLjAuN3JjMS0yICAgICAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN3JjMS0yIChiaW5hcnkgY29tcGF0aWJsZSkKKyAqICAgIDEuMC43ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAoc3RpbGwgY29tcGF0aWJsZSkKKyAqICAgIDEuMC44YmV0YTEtNCAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44YmV0YTEtNAorICogICAgMS4wLjhyYzEgICAgICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjhyYzEKKyAqICAgIDEuMC44ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44CisgKiAgICAxLjAuOWJldGExLTYgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOWJldGExLTYKKyAqICAgIDEuMC45cmMxICAgICAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45cmMxCisgKiAgICAxLjAuOWJldGE3LTEwICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOWJldGE3LTEwCisgKiAgICAxLjAuOXJjMiAgICAgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOXJjMgorICogICAgMS4wLjkgICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjkKKyAqICAgIDEuMC4xMGJldGExICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMGJldGExCisgKiAgICAxLjAuMTByYzEgICAgICAgICAgICAgICAgMSAgICAxMDAxMCAgMi4xLjAuMTByYzEKKyAqICAgIDEuMC4xMCAgICAgICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMAorICogICAgMS4wLjExYmV0YTEtMyAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExYmV0YTEtMworICogICAgMS4wLjExcmMxICAgICAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExcmMxCisgKiAgICAxLjAuMTEgICAgICAgICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTEKKyAqICAgIDEuMC4xMmJldGExLTIgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMmJldGExLTIKKyAqICAgIDEuMC4xMnJjMSAgICAgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMnJjMQorICogICAgMS4wLjEyICAgICAgICAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEyCisgKiAgICAxLjEuMGEtZiAgICAgICAgICAgICAgICAgLSAgICAxMDEwMCAgMi4xLjEuMGEtZiAoYnJhbmNoIGFiYW5kb25lZCkKKyAqICAgIDEuMi4wYmV0YTEtMiAgICAgICAgICAgICAyICAgIDEwMjAwICAyLjEuMi4wYmV0YTEtMgorICogICAgMS4yLjBiZXRhMy01ICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjBiZXRhMy01CisgKiAgICAxLjIuMHJjMSAgICAgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMHJjMQorICogICAgMS4yLjAgICAgICAgICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjAKKyAqICAgIDEuMi4xYmV0YTEtNCAgICAgICAgICAgICAzICAgIDEwMjAxICAzLjEuMi4xYmV0YTEtNAorICogICAgMS4yLjFyYzEtMiAgICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjFyYzEtMgorICogICAgMS4yLjEgICAgICAgICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjEKKyAqICAgIDEuMi4yYmV0YTEtNiAgICAgICAgICAgIDEyICAgIDEwMjAyICAxMi5zby4wLjEuMi4yYmV0YTEtNgorICogICAgMS4wLjEzYmV0YTEgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzYmV0YTEKKyAqICAgIDEuMC4xM3JjMSAgICAgICAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xM3JjMQorICogICAgMS4yLjJyYzEgICAgICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjJyYzEKKyAqICAgIDEuMC4xMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xMworICogICAgMS4yLjIgICAgICAgICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjIKKyAqICAgIDEuMi4zcmMxLTYgICAgICAgICAgICAgIDEyICAgIDEwMjAzICAxMi5zby4wLjEuMi4zcmMxLTYKKyAqICAgIDEuMi4zICAgICAgICAgICAgICAgICAgIDEyICAgIDEwMjAzICAxMi5zby4wLjEuMi4zCisgKiAgICAxLjIuNGJldGExLTMgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNGJldGExLTMKKyAqICAgIDEuMC4xNHJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNHJjMQorICogICAgMS4yLjRyYzEgICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjRyYzEKKyAqICAgIDEuMC4xNCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNAorICogICAgMS4yLjQgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjQKKyAqICAgIDEuMi41YmV0YTEtMiAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41YmV0YTEtMgorICogICAgMS4wLjE1cmMxLTMgICAgICAgICAgICAgMTAgICAgMTAwMTUgIDEwLnNvLjAuMS4wLjE1cmMxLTMKKyAqICAgIDEuMi41cmMxLTMgICAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41cmMxLTMKKyAqICAgIDEuMC4xNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE1ICAxMC5zby4wLjEuMC4xNQorICogICAgMS4yLjUgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjUKKyAqICAgIDEuMi42YmV0YTEtNCAgICAgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42YmV0YTEtNAorICogICAgMS4wLjE2ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMTYgIDEwLnNvLjAuMS4wLjE2CisgKiAgICAxLjIuNiAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIwNiAgMTIuc28uMC4xLjIuNgorICogICAgMS4yLjdiZXRhMS0yICAgICAgICAgICAgMTMgICAgMTAyMDcgIDEyLnNvLjAuMS4yLjdiZXRhMS0yCisgKiAgICAxLjAuMTdyYzEgICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTIuc28uMC4xLjAuMTdyYzEKKyAqICAgIDEuMi43cmMxICAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43cmMxCisgKiAgICAxLjAuMTcgICAgICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTIuc28uMC4xLjAuMTcKKyAqICAgIDEuMi43ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43CisgKiAgICAxLjIuOGJldGExLTUgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOGJldGExLTUKKyAqICAgIDEuMC4xOHJjMS01ICAgICAgICAgICAgIDEwICAgIDEwMDE4ICAxMi5zby4wLjEuMC4xOHJjMS01CisgKiAgICAxLjIuOHJjMS01ICAgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOHJjMS01CisgKiAgICAxLjAuMTggICAgICAgICAgICAgICAgICAxMCAgICAxMDAxOCAgMTIuc28uMC4xLjAuMTgKKyAqICAgIDEuMi44ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA4ICAxMi5zby4wLjEuMi44CisgKiAgICAxLjIuOWJldGExLTMgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC4xLjIuOWJldGExLTMKKyAqICAgIDEuMi45YmV0YTQtMTEgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCisgKiAgICAxLjIuOXJjMSAgICAgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQorICogICAgMS4yLjkgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KKyAqICAgIDEuMi4xMGJldGExLTcgICAgICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQorICogICAgMS4yLjEwcmMxLTIgICAgICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCisgKiAgICAxLjIuMTAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KKyAqICAgIDEuNC4wYmV0YTEtNSAgICAgICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4wLjBbLjBdCisgKiAgICAxLjIuMTFiZXRhMS00ICAgICAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KKyAqICAgIDEuNC4wYmV0YTctOCAgICAgICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4wLjBbLjBdCisgKiAgICAxLjIuMTEgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KKyAqICAgIDEuMi4xMiAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEyICAxMi5zby4wLjEyWy4wXQorICogICAgMS40LjBiZXRhOS0xNCAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjAuMFsuMF0KKyAqICAgIDEuMi4xMyAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEzICAxMi5zby4wLjEzWy4wXQorICogICAgMS40LjBiZXRhMTUtMzYgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjAuMFsuMF0KKyAqICAgIDEuNC4wYmV0YTM3LTg3ICAgICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4xNC4wWy4wXQorICogICAgMS40LjByYzAxICAgICAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjE0LjBbLjBdCisgKiAgICAxLjQuMGJldGE4OC0xMDkgICAgICAgICAxNCAgICAxMDQwMCAgMTQuc28uMTQuMFsuMF0KKyAqICAgIDEuNC4wcmMwMi0wOCAgICAgICAgICAgIDE0ICAgIDEwNDAwICAxNC5zby4xNC4wWy4wXQorICogICAgMS40LjAgICAgICAgICAgICAgICAgICAgMTQgICAgMTA0MDAgIDE0LnNvLjE0LjBbLjBdCisgKiAgICAxLjQuMWJldGEwMS0wMyAgICAgICAgICAxNCAgICAxMDQwMSAgMTQuc28uMTQuMVsuMF0KKyAqICAgIDEuNC4xcmMwMSAgICAgICAgICAgICAgIDE0ICAgIDEwNDAxICAxNC5zby4xNC4xWy4wXQorICogICAgMS40LjFiZXRhMDQtMTIgICAgICAgICAgMTQgICAgMTA0MDEgIDE0LnNvLjE0LjFbLjBdCisgKiAgICAxLjQuMSAgICAgICAgICAgICAgICAgICAxNCAgICAxMDQwMSAgMTQuc28uMTQuMVsuMF0KKyAqICAgIDEuNC4yICAgICAgICAgICAgICAgICAgIDE0ICAgIDEwNDAyICAxNC5zby4xNC4yWy4wXQorICogICAgMS40LjMgICAgICAgICAgICAgICAgICAgMTQgICAgMTA0MDMgIDE0LnNvLjE0LjNbLjBdCisgKiAgICAxLjQuNCAgICAgICAgICAgICAgICAgICAxNCAgICAxMDQwNCAgMTQuc28uMTQuNFsuMF0KKyAqICAgIDEuNS4wYmV0YTAxLTU4ICAgICAgICAgIDE1ICAgIDEwNTAwICAxNS5zby4xNS4wWy4wXQorICogICAgMS41LjByYzAxLTA3ICAgICAgICAgICAgMTUgICAgMTA1MDAgIDE1LnNvLjE1LjBbLjBdCisgKiAgICAxLjUuMCAgICAgICAgICAgICAgICAgICAxNSAgICAxMDUwMCAgMTUuc28uMTUuMFsuMF0KKyAqICAgIDEuNS4xYmV0YTAxLTExICAgICAgICAgIDE1ICAgIDEwNTAxICAxNS5zby4xNS4xWy4wXQorICogICAgMS41LjFyYzAxLTAyICAgICAgICAgICAgMTUgICAgMTA1MDEgIDE1LnNvLjE1LjFbLjBdCisgKiAgICAxLjUuMSAgICAgICAgICAgICAgICAgICAxNSAgICAxMDUwMSAgMTUuc28uMTUuMVsuMF0KKyAqICAgIDEuNS4yYmV0YTAxLTAzICAgICAgICAgIDE1ICAgIDEwNTAyICAxNS5zby4xNS4yWy4wXQorICogICAgMS41LjJyYzAxLTAzICAgICAgICAgICAgMTUgICAgMTA1MDIgIDE1LnNvLjE1LjJbLjBdCisgKiAgICAxLjUuMiAgICAgICAgICAgICAgICAgICAxNSAgICAxMDUwMiAgMTUuc28uMTUuMlsuMF0KKyAqICAgIDEuNS4zYmV0YTAxLTEwICAgICAgICAgIDE1ICAgIDEwNTAzICAxNS5zby4xNS4zWy4wXQorICogICAgMS41LjNyYzAxLTAyICAgICAgICAgICAgMTUgICAgMTA1MDMgIDE1LnNvLjE1LjNbLjBdCisgKiAgICAxLjUuM2JldGExMSAgICAgICAgICAgICAxNSAgICAxMDUwMyAgMTUuc28uMTUuM1suMF0KKyAqICAgIDEuNS4zIFtvbWl0dGVkXQorICogICAgMS41LjRiZXRhMDEtMDggICAgICAgICAgMTUgICAgMTA1MDQgIDE1LnNvLjE1LjRbLjBdCisgKiAgICAxLjUuNHJjMDEgICAgICAgICAgICAgICAxNSAgICAxMDUwNCAgMTUuc28uMTUuNFsuMF0KKyAqICAgIDEuNS40ICAgICAgICAgICAgICAgICAgIDE1ICAgIDEwNTA0ICAxNS5zby4xNS40Wy4wXQorICogICAgMS41LjViZXRhMDEtMDggICAgICAgICAgMTUgICAgMTA1MDUgIDE1LnNvLjE1LjVbLjBdCisgKiAgICAxLjUuNXJjMDEgICAgICAgICAgICAgICAxNSAgICAxMDUwNSAgMTUuc28uMTUuNVsuMF0KKyAqICAgIDEuNS41ICAgICAgICAgICAgICAgICAgIDE1ICAgIDEwNTA1ICAxNS5zby4xNS41Wy4wXQorICogICAgMS41LjZiZXRhMDEtMDcgICAgICAgICAgMTUgICAgMTA1MDYgIDE1LnNvLjE1LjZbLjBdCisgKiAgICAxLjUuNnJjMDEtMDMgICAgICAgICAgICAxNSAgICAxMDUwNiAgMTUuc28uMTUuNlsuMF0KKyAqICAgIDEuNS42ICAgICAgICAgICAgICAgICAgIDE1ICAgIDEwNTA2ICAxNS5zby4xNS42Wy4wXQorICogICAgMS41LjdiZXRhMDEtMDUgICAgICAgICAgMTUgICAgMTA1MDcgIDE1LnNvLjE1LjdbLjBdCisgKiAgICAxLjUuN3JjMDEtMDMgICAgICAgICAgICAxNSAgICAxMDUwNyAgMTUuc28uMTUuN1suMF0KKyAqICAgIDEuNS43ICAgICAgICAgICAgICAgICAgIDE1ICAgIDEwNTA3ICAxNS5zby4xNS43Wy4wXQorICogICAgMS42LjBiZXRhMDEtNDAgICAgICAgICAgMTYgICAgMTA2MDAgIDE2LnNvLjE2LjBbLjBdCisgKiAgICAxLjYuMHJjMDEtMDggICAgICAgICAgICAxNiAgICAxMDYwMCAgMTYuc28uMTYuMFsuMF0KKyAqICAgIDEuNi4wICAgICAgICAgICAgICAgICAgIDE2ICAgIDEwNjAwICAxNi5zby4xNi4wWy4wXQorICogICAgMS42LjFiZXRhMDEtMDkgICAgICAgICAgMTYgICAgMTA2MDEgIDE2LnNvLjE2LjFbLjBdCisgKiAgICAxLjYuMXJjMDEgICAgICAgICAgICAgICAxNiAgICAxMDYwMSAgMTYuc28uMTYuMVsuMF0KKyAqICAgIDEuNi4xICAgICAgICAgICAgICAgICAgIDE2ICAgIDEwNjAxICAxNi5zby4xNi4xWy4wXQorICogICAgMS42LjJiZXRhMDEgICAgICAgICAgICAgMTYgICAgMTA2MDIgIDE2LnNvLjE2LjJbLjBdCisgKiAgICAxLjYuMnJjMDEtMDYgICAgICAgICAgICAxNiAgICAxMDYwMiAgMTYuc28uMTYuMlsuMF0KKyAqICAgIDEuNi4yICAgICAgICAgICAgICAgICAgIDE2ICAgIDEwNjAyICAxNi5zby4xNi4yWy4wXQorICogICAgMS42LjNiZXRhMDEtMTEgICAgICAgICAgMTYgICAgMTA2MDMgIDE2LnNvLjE2LjNbLjBdCisgKiAgICAxLjYuM3JjMDEgICAgICAgICAgICAgICAxNiAgICAxMDYwMyAgMTYuc28uMTYuM1suMF0KKyAqICAgIDEuNi4zICAgICAgICAgICAgICAgICAgIDE2ICAgIDEwNjAzICAxNi5zby4xNi4zWy4wXQorICoKKyAqICAgSGVuY2Vmb3J0aCB0aGUgc291cmNlIHZlcnNpb24gd2lsbCBtYXRjaCB0aGUgc2hhcmVkLWxpYnJhcnkgbWFqb3IKKyAqICAgYW5kIG1pbm9yIG51bWJlcnM7IHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvciB2ZXJzaW9uIG51bWJlciB3aWxsIGJlCisgKiAgIHVzZWQgZm9yIGNoYW5nZXMgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYXMgaXQgaXMgaW50ZW5kZWQuICBUaGUKKyAqICAgUE5HX0xJQlBOR19WRVIgbWFjcm8sIHdoaWNoIGlzIG5vdCB1c2VkIHdpdGhpbiBsaWJwbmcgYnV0IGlzIGF2YWlsYWJsZQorICogICBmb3IgYXBwbGljYXRpb25zLCBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIG9mIHRoZSBmb3JtIHh5eXp6IGNvcnJlc3BvbmRpbmcKKyAqICAgdG8gdGhlIHNvdXJjZSB2ZXJzaW9uIHgueS56IChsZWFkaW5nIHplcm9zIGluIHkgYW5kIHopLiAgQmV0YSB2ZXJzaW9ucworICogICB3ZXJlIGdpdmVuIHRoZSBwcmV2aW91cyBwdWJsaWMgcmVsZWFzZSBudW1iZXIgcGx1cyBhIGxldHRlciwgdW50aWwKKyAqICAgdmVyc2lvbiAxLjAuNmo7IGZyb20gdGhlbiBvbiB0aGV5IHdlcmUgZ2l2ZW4gdGhlIHVwY29taW5nIHB1YmxpYworICogICByZWxlYXNlIG51bWJlciBwbHVzICJiZXRhTk4iIG9yICJyY05OIi4KKyAqCisgKiAgIEJpbmFyeSBpbmNvbXBhdGliaWxpdHkgZXhpc3RzIG9ubHkgd2hlbiBhcHBsaWNhdGlvbnMgbWFrZSBkaXJlY3QgYWNjZXNzCisgKiAgIHRvIHRoZSBpbmZvX3B0ciBvciBwbmdfcHRyIG1lbWJlcnMgdGhyb3VnaCBwbmcuaCwgYW5kIHRoZSBjb21waWxlZAorICogICBhcHBsaWNhdGlvbiBpcyBsb2FkZWQgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorICoKKyAqICAgRExMTlVNIHdpbGwgY2hhbmdlIGVhY2ggdGltZSB0aGVyZSBhcmUgZm9yd2FyZCBvciBiYWNrd2FyZCBjaGFuZ2VzCisgKiAgIGluIGJpbmFyeSBjb21wYXRpYmlsaXR5IChlLmcuLCB3aGVuIGEgbmV3IGZlYXR1cmUgaXMgYWRkZWQpLgorICoKKyAqIFNlZSBsaWJwbmctbWFudWFsLnR4dCBvciBsaWJwbmcuMyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFRoZSBQTkcKKyAqIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlIGFzIGEgVzNDIFJlY29tbWVuZGF0aW9uIGFuZCBhcyBhbiBJU08KKyAqIFNwZWNpZmljYXRpb24sIDxodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1JFQy1QTkctMjAwMzExMTAvCisgKi8KKworLyoKKyAqIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgorICoKKyAqIElmIHlvdSBtb2RpZnkgbGlicG5nIHlvdSBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwgbm90aWNlcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAqIHRoaXMgc2VudGVuY2UuCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqCisgKiBsaWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjYuMywgSnVseSAxOCwgMjAxMywgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKKyAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQorICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgQ29zbWluIFRydXRhCisgKgorICogbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS4yLjUsIE9jdG9iZXIgMywgMjAwMiwgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKKyAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNgorICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgorICoKKyAqICAgIFNpbW9uLVBpZXJyZSBDYWRpZXV4CisgKiAgICBFcmljIFMuIFJheW1vbmQKKyAqICAgIEdpbGxlcyBWb2xsYW50CisgKgorICogYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6CisgKgorICogICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUKKyAqICAgIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91cgorICogICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcworICogICAgb3IgbmVlZHMuICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQorICogICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKKyAqICAgIHRoZSB1c2VyLgorICoKKyAqIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4wLjYsIE1hcmNoIDIwLCAyMDAwLCBhcmUKKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKKyAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjk2LAorICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgorICoKKyAqICAgIFRvbSBMYW5lCisgKiAgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqICAgIFdpbGxlbSB2YW4gU2NoYWlrCisgKgorICogbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NywgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKKyAqIERpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjg4LAorICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgorICoKKyAqICAgIEpvaG4gQm93bGVyCisgKiAgICBLZXZpbiBCcmFjZXkKKyAqICAgIFNhbSBCdXNoZWxsCisgKiAgICBNYWdudXMgSG9sbWdyZW4KKyAqICAgIEdyZWcgUm9lbG9mcworICogICAgVG9tIFRhbm5lcgorICoKKyAqIGxpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisgKgorICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgorICogaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKKyAqCisgKiAgICBBbmRyZWFzIERpbGdlcgorICogICAgRGF2ZSBNYXJ0aW5kYWxlCisgKiAgICBHdXkgRXJpYyBTY2hhbG5hdAorICogICAgUGF1bCBTY2htaWR0CisgKiAgICBUaW0gV2VnbmVyCisgKgorICogVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCisgKiBhbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAorICogaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKKyAqIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgorICogYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorICogb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCisgKiBSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KKyAqCisgKiAgIDIuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoIGFuZCBtdXN0IG5vdAorICogICAgICBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgorICoKKyAqICAgMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20KKyAqICAgICAgYW55IHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCisgKgorICogVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLiBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0CisgKiBmZWUsIGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvCisgKiBzdXBwb3J0aW5nIHRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4gIElmIHlvdSB1c2UgdGhpcworICogc291cmNlIGNvZGUgaW4gYSBwcm9kdWN0LCBhY2tub3dsZWRnbWVudCBpcyBub3QgcmVxdWlyZWQgYnV0IHdvdWxkIGJlCisgKiBhcHByZWNpYXRlZC4KKyAqLworCisvKgorICogQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKKyAqIGJveGVzIGFuZCB0aGUgbGlrZToKKyAqCisgKiAgICAgcHJpbnRmKCIlcyIsIHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKKyAqCisgKiBBbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCisgKiBmaWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgorICovCisKKy8qCisgKiBMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgaXMgYQorICogY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorICovCisKKy8qCisgKiBUaGUgY29udHJpYnV0aW5nIGF1dGhvcnMgd291bGQgbGlrZSB0byB0aGFuayBhbGwgdGhvc2Ugd2hvIGhlbHBlZAorICogd2l0aCB0ZXN0aW5nLCBidWcgZml4ZXMsIGFuZCBwYXRpZW5jZS4gIFRoaXMgd291bGRuJ3QgaGF2ZSBiZWVuCisgKiBwb3NzaWJsZSB3aXRob3V0IGFsbCBvZiB5b3UuCisgKgorICogVGhhbmtzIHRvIEZyYW5rIEouIFQuIFdvamNpayBmb3IgaGVscGluZyB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLgorICovCisKKy8qCisgKiBZMksgY29tcGxpYW5jZSBpbiBsaWJwbmc6CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgSnVseSAxOCwgMjAxMworICoKKyAqICAgIFNpbmNlIHRoZSBQTkcgRGV2ZWxvcG1lbnQgZ3JvdXAgaXMgYW4gYWQtaG9jIGJvZHksIHdlIGNhbid0IG1ha2UKKyAqICAgIGFuIG9mZmljaWFsIGRlY2xhcmF0aW9uLgorICoKKyAqICAgIFRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKKyAqICAgIHVwd2FyZCB0aHJvdWdoIDEuNi4zIGFyZSBZMksgY29tcGxpYW50LiAgSXQgaXMgbXkgYmVsaWVmIHRoYXQKKyAqICAgIGVhcmxpZXIgdmVyc2lvbnMgd2VyZSBhbHNvIFkySyBjb21wbGlhbnQuCisgKgorICogICAgTGlicG5nIG9ubHkgaGFzIHR3byB5ZWFyIGZpZWxkcy4gIE9uZSBpcyBhIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyCisgKiAgICB0aGF0IHdpbGwgaG9sZCB5ZWFycyB1cCB0byA2NTUzNS4gIFRoZSBvdGhlciwgd2hpY2ggaXMgZGVwcmVjYXRlZCwKKyAqICAgIGhvbGRzIHRoZSBkYXRlIGluIHRleHQgZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCisgKgorICogICAgVGhlIGludGVnZXIgaXMKKyAqICAgICAgICAicG5nX3VpbnRfMTYgeWVhciIgaW4gcG5nX3RpbWVfc3RydWN0LgorICoKKyAqICAgIFRoZSBzdHJpbmcgaXMKKyAqICAgICAgICAiY2hhciB0aW1lX2J1ZmZlclsyOV0iIGluIHBuZ19zdHJ1Y3QuICBUaGlzIGlzIG5vIGxvbmdlciB1c2VkCisgKiAgICBpbiBsaWJwbmctMS42LnggYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjcuMC4KKyAqCisgKiAgICBUaGVyZSBhcmUgc2V2ZW4gdGltZS1yZWxhdGVkIGZ1bmN0aW9uczoKKyAqICAgICAgICBwbmcuYzogcG5nX2NvbnZlcnRfdG9fcmZjXzExMjNfYnVmZmVyKCkgaW4gcG5nLmMKKyAqICAgICAgICAgIChmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTEyMygpIHByaW9yIHRvIGxpYnBuZy0xLjUueCBhbmQKKyAqICAgICAgICAgIHBuZ19jb252ZXJ0X3RvX3JmY18xMTUyKCkgaW4gZXJyb3IgcHJpb3IgdG8gbGlicG5nLTAuOTgpCisgKiAgICAgICAgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBpbiBwbmd3cml0ZS5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYworICogICAgICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYworICogICAgICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCisgKiAgICAgICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYworICogICAgICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCisgKiAgICAgICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYworICoKKyAqICAgIEFsbCBoYW5kbGUgZGF0ZXMgcHJvcGVybHkgaW4gYSBZMksgZW52aXJvbm1lbnQuICBUaGUKKyAqICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgZnVuY3Rpb24gY2FsbHMgZ210aW1lKCkgdG8gY29udmVydCBmcm9tIHN5c3RlbQorICogICAgY2xvY2sgdGltZSwgd2hpY2ggcmV0dXJucyAoeWVhciAtIDE5MDApLCB3aGljaCB3ZSBwcm9wZXJseSBjb252ZXJ0IHRvCisgKiAgICB0aGUgZnVsbCA0LWRpZ2l0IHllYXIuICBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgbGlicG5nIGFwcGxpY2F0aW9ucworICogICAgYXJlIG5vdCBwYXNzaW5nIDQtZGlnaXQgeWVhcnMgaW50byB0aGUgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjNfYnVmZmVyKCkKKyAqICAgIGZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgorICogICAgaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCisgKiAgICBidXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cworICogICAgc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCisgKiAgICBkb2N1bWVudGVkIGFzIHN1Y2guCisgKgorICogICAgVGhlIHRJTUUgY2h1bmsgaXRzZWxmIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IHVzZXMgYSAyLWJ5dGUgdW5zaWduZWQKKyAqICAgIGludGVnZXIgdG8gaG9sZCB0aGUgeWVhciwgYW5kIGNhbiBob2xkIHllYXJzIGFzIGxhcmdlIGFzIDY1NTM1LgorICoKKyAqICAgIHpsaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCisgKiAgICBubyBkYXRlLXJlbGF0ZWQgY29kZS4KKyAqCisgKiAgICAgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqICAgICAgIGxpYnBuZyBtYWludGFpbmVyCisgKiAgICAgICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqLworCisjaWZuZGVmIFBOR19ICisjZGVmaW5lIFBOR19ICisKKy8qIFRoaXMgaXMgbm90IHRoZSBwbGFjZSB0byBsZWFybiBob3cgdG8gdXNlIGxpYnBuZy4gVGhlIGZpbGUgbGlicG5nLW1hbnVhbC50eHQKKyAqIGRlc2NyaWJlcyBob3cgdG8gdXNlIGxpYnBuZywgYW5kIHRoZSBmaWxlIGV4YW1wbGUuYyBzdW1tYXJpemVzIGl0CisgKiB3aXRoIHNvbWUgY29kZSBvbiB3aGljaCB0byBidWlsZC4gIFRoaXMgZmlsZSBpcyB1c2VmdWwgZm9yIGxvb2tpbmcKKyAqIGF0IHRoZSBhY3R1YWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZSBjb21wb25lbnRzLgorICoKKyAqIElmIHlvdSBqdXN0IG5lZWQgdG8gcmVhZCBhIFBORyBmaWxlIGFuZCBkb24ndCB3YW50IHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24KKyAqIHNraXAgdG8gdGhlIGVuZCBvZiB0aGlzIGZpbGUgYW5kIHJlYWQgdGhlIHNlY3Rpb24gZW50aXRsZWQgJ3NpbXBsaWZpZWQgQVBJJy4KKyAqLworCisvKiBTdW5saWFuZy5saXUgYWRkIDIwMTAwMzE5IGZvciBhdm9pZCBuYW1lIGNvbmZsaWN0LiAqLworI2RlZmluZSBwbmdfc2V0X3NpZ19ieXRlcyBGT1hJVF9wbmdfc2V0X3NpZ19ieXRlcworI2RlZmluZSBwbmdfc2lnX2NtcCBGT1hJVF9wbmdfc2lnX2NtcAorI2RlZmluZSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IEZPWElUX3BuZ19jcmVhdGVfaW5mb19zdHJ1Y3QKKyNkZWZpbmUgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QgRk9YSVRfcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QKKyNkZWZpbmUgcG5nX2luZm9faW5pdF8zIEZPWElUX3BuZ19pbmZvX2luaXRfMworI2RlZmluZSBwbmdfZGF0YV9mcmVlciBGT1hJVF9wbmdfZGF0YV9mcmVlcgorI2RlZmluZSBwbmdfZnJlZV9kYXRhIEZPWElUX3BuZ19mcmVlX2RhdGEKKyNkZWZpbmUgcG5nX2luZm9fZGVzdHJveSBGT1hJVF9wbmdfaW5mb19kZXN0cm95CisjZGVmaW5lIHBuZ19nZXRfaW9fcHRyIEZPWElUX3BuZ19nZXRfaW9fcHRyCisjZGVmaW5lIHBuZ19pbml0X2lvIEZPWElUX3BuZ19pbml0X2lvCisjZGVmaW5lIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMgRk9YSVRfcG5nX2NvbnZlcnRfdG9fcmZjMTEyMworI2RlZmluZSBwbmdfZ2V0X2NvcHlyaWdodCBGT1hJVF9wbmdfZ2V0X2NvcHlyaWdodAorI2RlZmluZSBwbmdfZ2V0X2xpYnBuZ192ZXIgRk9YSVRfcG5nX2dldF9saWJwbmdfdmVyCisjZGVmaW5lIHBuZ19nZXRfaGVhZGVyX3ZlciBGT1hJVF9wbmdfZ2V0X2hlYWRlcl92ZXIKKyNkZWZpbmUgcG5nX2dldF9oZWFkZXJfdmVyc2lvbiBGT1hJVF9wbmdfZ2V0X2hlYWRlcl92ZXJzaW9uCisjZGVmaW5lIHBuZ19oYW5kbGVfYXNfdW5rbm93biBGT1hJVF9wbmdfaGFuZGxlX2FzX3Vua25vd24KKyNkZWZpbmUgcG5nX3Jlc2V0X3pzdHJlYW0gRk9YSVRfcG5nX3Jlc2V0X3pzdHJlYW0KKyNkZWZpbmUgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlciBGT1hJVF9wbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyCisjZGVmaW5lIHBuZ19tbXhfc3VwcG9ydCBGT1hJVF9wbmdfbW14X3N1cHBvcnQKKyNkZWZpbmUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCBGT1hJVF9wbmdfY3JlYXRlX3JlYWRfc3RydWN0CisjZGVmaW5lIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMiBGT1hJVF9wbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIKKyNkZWZpbmUgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgRk9YSVRfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QKKyNkZWZpbmUgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiBGT1hJVF9wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yCisjZGVmaW5lIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgRk9YSVRfcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZQorI2RlZmluZSBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplIEZPWElUX3BuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUKKyNkZWZpbmUgcG5nX3NldF9sb25nam1wX2ZuIEZPWElUX3BuZ19zZXRfbG9uZ2ptcF9mbgorI2RlZmluZSBwbmdfbG9uZ2ptcCBGT1hJVF9wbmdfbG9uZ2ptcAorI2RlZmluZSBwbmdfd3JpdGVfc2lnIEZPWElUX3BuZ193cml0ZV9zaWcKKyNkZWZpbmUgcG5nX3dyaXRlX2NodW5rIEZPWElUX3BuZ193cml0ZV9jaHVuaworI2RlZmluZSBwbmdfd3JpdGVfY2h1bmtfc3RhcnQgRk9YSVRfcG5nX3dyaXRlX2NodW5rX3N0YXJ0CisjZGVmaW5lIHBuZ193cml0ZV9jaHVua19kYXRhIEZPWElUX3BuZ193cml0ZV9jaHVua19kYXRhCisjZGVmaW5lIHBuZ193cml0ZV9jaHVua19lbmQgRk9YSVRfcG5nX3dyaXRlX2NodW5rX2VuZAorI2RlZmluZSBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSBGT1hJVF9wbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURQorI2RlZmluZSBwbmdfd3JpdGVfaW5mbyBGT1hJVF9wbmdfd3JpdGVfaW5mbworI2RlZmluZSBwbmdfcmVhZF9pbmZvIEZPWElUX3BuZ19yZWFkX2luZm8KKyNkZWZpbmUgcG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIgRk9YSVRfcG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIKKyNkZWZpbmUgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0gRk9YSVRfcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0KKyNkZWZpbmUgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QgRk9YSVRfcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QKKyNkZWZpbmUgcG5nX3NldF9leHBhbmQgRk9YSVRfcG5nX3NldF9leHBhbmQKKyNkZWZpbmUgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184IEZPWElUX3BuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOAorI2RlZmluZSBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiIEZPWElUX3BuZ19zZXRfcGFsZXR0ZV90b19yZ2IKKyNkZWZpbmUgcG5nX3NldF90Uk5TX3RvX2FscGhhIEZPWElUX3BuZ19zZXRfdFJOU190b19hbHBoYQorI2RlZmluZSBwbmdfc2V0X2V4cGFuZF8xNiBGT1hJVF9wbmdfc2V0X2V4cGFuZF8xNgorI2RlZmluZSBwbmdfc2V0X2JnciBGT1hJVF9wbmdfc2V0X2JncgorI2RlZmluZSBwbmdfc2V0X2dyYXlfdG9fcmdiIEZPWElUX3BuZ19zZXRfZ3JheV90b19yZ2IKKyNkZWZpbmUgcG5nX3NldF9yZ2JfdG9fZ3JheSBGT1hJVF9wbmdfc2V0X3JnYl90b19ncmF5CisjZGVmaW5lIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQgRk9YSVRfcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZAorI2RlZmluZSBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyBGT1hJVF9wbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cworI2RlZmluZSBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUgRk9YSVRfcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlCisjZGVmaW5lIHBuZ19zZXRfYWxwaGFfbW9kZSBGT1hJVF9wbmdfc2V0X2FscGhhX21vZGUKKyNkZWZpbmUgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkIEZPWElUX3BuZ19zZXRfYWxwaGFfbW9kZV9maXhlZAorI2RlZmluZSBwbmdfc2V0X3N0cmlwX2FscGhhIEZPWElUX3BuZ19zZXRfc3RyaXBfYWxwaGEKKyNkZWZpbmUgcG5nX3NldF9zd2FwX2FscGhhIEZPWElUX3BuZ19zZXRfc3dhcF9hbHBoYQorI2RlZmluZSBwbmdfc2V0X2ludmVydF9hbHBoYSBGT1hJVF9wbmdfc2V0X2ludmVydF9hbHBoYQorI2RlZmluZSBwbmdfc2V0X2ZpbGxlciBGT1hJVF9wbmdfc2V0X2ZpbGxlcgorI2RlZmluZSBwbmdfc2V0X2FkZF9hbHBoYSBGT1hJVF9wbmdfc2V0X2FkZF9hbHBoYQorI2RlZmluZSBwbmdfc2V0X3N3YXAgRk9YSVRfcG5nX3NldF9zd2FwCisjZGVmaW5lIHBuZ19zZXRfcGFja2luZyBGT1hJVF9wbmdfc2V0X3BhY2tpbmcKKyNkZWZpbmUgcG5nX3NldF9wYWNrc3dhcCBGT1hJVF9wbmdfc2V0X3BhY2tzd2FwCisjZGVmaW5lIHBuZ19zZXRfc2hpZnQgRk9YSVRfcG5nX3NldF9zaGlmdAorI2RlZmluZSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyBGT1hJVF9wbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZworI2RlZmluZSBwbmdfc2V0X2ludmVydF9tb25vIEZPWElUX3BuZ19zZXRfaW52ZXJ0X21vbm8KKyNkZWZpbmUgcG5nX3NldF9iYWNrZ3JvdW5kIEZPWElUX3BuZ19zZXRfYmFja2dyb3VuZAorI2RlZmluZSBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQgRk9YSVRfcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkCisjZGVmaW5lIHBuZ19zZXRfc2NhbGVfMTYgRk9YSVRfcG5nX3NldF9zY2FsZV8xNgorI2RlZmluZSBwbmdfc2V0X3F1YW50aXplIEZPWElUX3BuZ19zZXRfcXVhbnRpemUKKyNkZWZpbmUgcG5nX3NldF9nYW1tYSBGT1hJVF9wbmdfc2V0X2dhbW1hCisjZGVmaW5lIHBuZ19zZXRfZ2FtbWFfZml4ZWQgRk9YSVRfcG5nX3NldF9nYW1tYV9maXhlZAorI2RlZmluZSBwbmdfc2V0X2ZsdXNoIEZPWElUX3BuZ19zZXRfZmx1c2gKKyNkZWZpbmUgcG5nX3dyaXRlX2ZsdXNoIEZPWElUX3BuZ193cml0ZV9mbHVzaAorI2RlZmluZSBwbmdfc3RhcnRfcmVhZF9pbWFnZSBGT1hJVF9wbmdfc3RhcnRfcmVhZF9pbWFnZQorI2RlZmluZSBwbmdfcmVhZF91cGRhdGVfaW5mbyBGT1hJVF9wbmdfcmVhZF91cGRhdGVfaW5mbworI2RlZmluZSBwbmdfcmVhZF9yb3dzIEZPWElUX3BuZ19yZWFkX3Jvd3MKKyNkZWZpbmUgcG5nX3JlYWRfcm93IEZPWElUX3BuZ19yZWFkX3JvdworI2RlZmluZSBwbmdfcmVhZF9pbWFnZSBGT1hJVF9wbmdfcmVhZF9pbWFnZQorI2RlZmluZSBwbmdfd3JpdGVfcm93IEZPWElUX3BuZ193cml0ZV9yb3cKKyNkZWZpbmUgcG5nX3dyaXRlX3Jvd3MgRk9YSVRfcG5nX3dyaXRlX3Jvd3MKKyNkZWZpbmUgcG5nX3dyaXRlX2ltYWdlIEZPWElUX3BuZ193cml0ZV9pbWFnZQorI2RlZmluZSBwbmdfd3JpdGVfZW5kIEZPWElUX3BuZ193cml0ZV9lbmQKKyNkZWZpbmUgcG5nX3JlYWRfZW5kIEZPWElUX3BuZ19yZWFkX2VuZAorI2RlZmluZSBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCBGT1hJVF9wbmdfZGVzdHJveV9yZWFkX3N0cnVjdAorI2RlZmluZSBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QgRk9YSVRfcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0CisjZGVmaW5lIHBuZ19zZXRfY3JjX2FjdGlvbiBGT1hJVF9wbmdfc2V0X2NyY19hY3Rpb24KKyNkZWZpbmUgcG5nX3NldF9maWx0ZXIgRk9YSVRfcG5nX3NldF9maWx0ZXIKKyNkZWZpbmUgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyBGT1hJVF9wbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzCisjZGVmaW5lIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3NfZml4ZWQgRk9YSVRfcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljc19maXhlZAorI2RlZmluZSBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIEZPWElUX3BuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwKKyNkZWZpbmUgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgRk9YSVRfcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwKKyNkZWZpbmUgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSBGT1hJVF9wbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5CisjZGVmaW5lIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgRk9YSVRfcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cworI2RlZmluZSBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCBGT1hJVF9wbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZAorI2RlZmluZSBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbGV2ZWwgRk9YSVRfcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsCisjZGVmaW5lIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgRk9YSVRfcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21lbV9sZXZlbAorI2RlZmluZSBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kgRk9YSVRfcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5CisjZGVmaW5lIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyBGT1hJVF9wbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMKKyNkZWZpbmUgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZCBGT1hJVF9wbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kCisjZGVmaW5lIHBuZ19zZXRfZXJyb3JfZm4gRk9YSVRfcG5nX3NldF9lcnJvcl9mbgorI2RlZmluZSBwbmdfZ2V0X2Vycm9yX3B0ciBGT1hJVF9wbmdfZ2V0X2Vycm9yX3B0cgorI2RlZmluZSBwbmdfc2V0X3dyaXRlX2ZuIEZPWElUX3BuZ19zZXRfd3JpdGVfZm4KKyNkZWZpbmUgcG5nX3NldF9yZWFkX2ZuIEZPWElUX3BuZ19zZXRfcmVhZF9mbgorI2RlZmluZSBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuIEZPWElUX3BuZ19zZXRfcmVhZF9zdGF0dXNfZm4KKyNkZWZpbmUgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4gRk9YSVRfcG5nX3NldF93cml0ZV9zdGF0dXNfZm4KKyNkZWZpbmUgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIEZPWElUX3BuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbgorI2RlZmluZSBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuIEZPWElUX3BuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4KKyNkZWZpbmUgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvIEZPWElUX3BuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbworI2RlZmluZSBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ciBGT1hJVF9wbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cgorI2RlZmluZSBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlciBGT1hJVF9wbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlcgorI2RlZmluZSBwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIgRk9YSVRfcG5nX2dldF9jdXJyZW50X3Bhc3NfbnVtYmVyCisjZGVmaW5lIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuIEZPWElUX3BuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuCisjZGVmaW5lIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgRk9YSVRfcG5nX2dldF91c2VyX2NodW5rX3B0cgorI2RlZmluZSBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4gRk9YSVRfcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuCisjZGVmaW5lIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyIEZPWElUX3BuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyCisjZGVmaW5lIHBuZ19wcm9jZXNzX2RhdGEgRk9YSVRfcG5nX3Byb2Nlc3NfZGF0YQorI2RlZmluZSBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlIEZPWElUX3BuZ19wcm9jZXNzX2RhdGFfcGF1c2UKKyNkZWZpbmUgcG5nX3Byb2Nlc3NfZGF0YV9za2lwIEZPWElUX3BuZ19wcm9jZXNzX2RhdGFfc2tpcAorI2RlZmluZSBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgRk9YSVRfcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93CisjZGVmaW5lIHBuZ19jYWxsb2MgRk9YSVRfcG5nX2NhbGxvYworI2RlZmluZSBwbmdfZXJyb3IgRk9YSVRfcG5nX2Vycm9yCisjZGVmaW5lIHBuZ19jaHVua19lcnJvciBGT1hJVF9wbmdfY2h1bmtfZXJyb3IKKyNkZWZpbmUgcG5nX2VyciBGT1hJVF9wbmdfZXJyCisjZGVmaW5lIHBuZ193YXJuaW5nIEZPWElUX3BuZ193YXJuaW5nCisjZGVmaW5lIHBuZ19jaHVua193YXJuaW5nIEZPWElUX3BuZ19jaHVua193YXJuaW5nCisjZGVmaW5lIHBuZ19iZW5pZ25fZXJyb3IgRk9YSVRfcG5nX2Jlbmlnbl9lcnJvcgorI2RlZmluZSBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIEZPWElUX3BuZ19jaHVua19iZW5pZ25fZXJyb3IKKyNkZWZpbmUgcG5nX3NldF9iZW5pZ25fZXJyb3JzIEZPWElUX3BuZ19zZXRfYmVuaWduX2Vycm9ycworI2RlZmluZSBwbmdfZ2V0X3ZhbGlkIEZPWElUX3BuZ19nZXRfdmFsaWQKKyNkZWZpbmUgcG5nX2dldF9yb3dieXRlcyBGT1hJVF9wbmdfZ2V0X3Jvd2J5dGVzCisjZGVmaW5lIHBuZ19nZXRfcm93cyBGT1hJVF9wbmdfZ2V0X3Jvd3MKKyNkZWZpbmUgcG5nX3NldF9yb3dzIEZPWElUX3BuZ19zZXRfcm93cworI2RlZmluZSBwbmdfZ2V0X2NoYW5uZWxzIEZPWElUX3BuZ19nZXRfY2hhbm5lbHMKKyNkZWZpbmUgcG5nX2dldF9pbWFnZV93aWR0aCBGT1hJVF9wbmdfZ2V0X2ltYWdlX3dpZHRoCisjZGVmaW5lIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0IEZPWElUX3BuZ19nZXRfaW1hZ2VfaGVpZ2h0CisjZGVmaW5lIHBuZ19nZXRfYml0X2RlcHRoIEZPWElUX3BuZ19nZXRfYml0X2RlcHRoCisjZGVmaW5lIHBuZ19nZXRfY29sb3JfdHlwZSBGT1hJVF9wbmdfZ2V0X2NvbG9yX3R5cGUKKyNkZWZpbmUgcG5nX2dldF9maWx0ZXJfdHlwZSBGT1hJVF9wbmdfZ2V0X2ZpbHRlcl90eXBlCisjZGVmaW5lIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUgRk9YSVRfcG5nX2dldF9pbnRlcmxhY2VfdHlwZQorI2RlZmluZSBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUgRk9YSVRfcG5nX2dldF9jb21wcmVzc2lvbl90eXBlCisjZGVmaW5lIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciBGT1hJVF9wbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIKKyNkZWZpbmUgcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIgRk9YSVRfcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIKKyNkZWZpbmUgcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIgRk9YSVRfcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIKKyNkZWZpbmUgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8gRk9YSVRfcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8KKyNkZWZpbmUgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW9fZml4ZWQgRk9YSVRfcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW9fZml4ZWQKKyNkZWZpbmUgcG5nX2dldF94X29mZnNldF9waXhlbHMgRk9YSVRfcG5nX2dldF94X29mZnNldF9waXhlbHMKKyNkZWZpbmUgcG5nX2dldF95X29mZnNldF9waXhlbHMgRk9YSVRfcG5nX2dldF95X29mZnNldF9waXhlbHMKKyNkZWZpbmUgcG5nX2dldF94X29mZnNldF9taWNyb25zIEZPWElUX3BuZ19nZXRfeF9vZmZzZXRfbWljcm9ucworI2RlZmluZSBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMgRk9YSVRfcG5nX2dldF95X29mZnNldF9taWNyb25zCisjZGVmaW5lIHBuZ19nZXRfc2lnbmF0dXJlIEZPWElUX3BuZ19nZXRfc2lnbmF0dXJlDQorI2RlZmluZSBwbmdfZ2V0X2JLR0QgRk9YSVRfcG5nX2dldF9iS0dEDQorI2RlZmluZSBwbmdfc2V0X2JLR0QgRk9YSVRfcG5nX3NldF9iS0dEDQorI2RlZmluZSBwbmdfZ2V0X2NIUk0gRk9YSVRfcG5nX2dldF9jSFJNDQorI2RlZmluZSBwbmdfZ2V0X2NIUk1fWFlaIEZPWElUX3BuZ19nZXRfY0hSTV9YWVoNCisjZGVmaW5lIHBuZ19nZXRfY0hSTV9maXhlZCBGT1hJVF9wbmdfZ2V0X2NIUk1fZml4ZWQNCisjZGVmaW5lIHBuZ19nZXRfY0hSTV9YWVpfZml4ZWQgRk9YSVRfcG5nX2dldF9jSFJNX1hZWl9maXhlZA0KKyNkZWZpbmUgcG5nX3NldF9jSFJNIEZPWElUX3BuZ19zZXRfY0hSTQ0KKyNkZWZpbmUgcG5nX3NldF9jSFJNX1hZWiBGT1hJVF9wbmdfc2V0X2NIUk1fWFlaDQorI2RlZmluZSBwbmdfc2V0X2NIUk1fZml4ZWQgRk9YSVRfcG5nX3NldF9jSFJNX2ZpeGVkDQorI2RlZmluZSBwbmdfc2V0X2NIUk1fWFlaX2ZpeGVkIEZPWElUX3BuZ19zZXRfY0hSTV9YWVpfZml4ZWQNCisjZGVmaW5lIHBuZ19nZXRfZ0FNQSBGT1hJVF9wbmdfZ2V0X2dBTUENCisjZGVmaW5lIHBuZ19zZXRfZ0FNQSBGT1hJVF9wbmdfc2V0X2dBTUENCisjZGVmaW5lIHBuZ19zZXRfZ0FNQV9maXhlZCBGT1hJVF9wbmdfc2V0X2dBTUFfZml4ZWQNCisjZGVmaW5lIHBuZ19nZXRfaElTVCBGT1hJVF9wbmdfZ2V0X2hJU1QNCisjZGVmaW5lIHBuZ19zZXRfaElTVCBGT1hJVF9wbmdfc2V0X2hJU1QNCisjZGVmaW5lIHBuZ19nZXRfSUhEUiBGT1hJVF9wbmdfZ2V0X0lIRFINCisjZGVmaW5lIHBuZ19zZXRfSUhEUiBGT1hJVF9wbmdfc2V0X0lIRFINCisjZGVmaW5lIHBuZ19nZXRfb0ZGcyBGT1hJVF9wbmdfZ2V0X29GRnMNCisjZGVmaW5lIHBuZ19zZXRfb0ZGcyBGT1hJVF9wbmdfc2V0X29GRnMNCisjZGVmaW5lIHBuZ19nZXRfcENBTCBGT1hJVF9wbmdfZ2V0X3BDQUwNCisjZGVmaW5lIHBuZ19zZXRfcENBTCBGT1hJVF9wbmdfc2V0X3BDQUwNCisjZGVmaW5lIHBuZ19zZXRfcEhZcyBGT1hJVF9wbmdfc2V0X3BIWXMNCisjZGVmaW5lIHBuZ19nZXRfUExURSBGT1hJVF9wbmdfZ2V0X1BMVEUNCisjZGVmaW5lIHBuZ19zZXRfUExURSBGT1hJVF9wbmdfc2V0X1BMVEUNCisjZGVmaW5lIHBuZ19nZXRfc0JJVCBGT1hJVF9wbmdfZ2V0X3NCSVQNCisjZGVmaW5lIHBuZ19zZXRfc0JJVCBGT1hJVF9wbmdfc2V0X3NCSVQNCisjZGVmaW5lIHBuZ19nZXRfc1JHQiBGT1hJVF9wbmdfZ2V0X3NSR0INCisjZGVmaW5lIHBuZ19zZXRfc1JHQiBGT1hJVF9wbmdfc2V0X3NSR0INCisjZGVmaW5lIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNIEZPWElUX3BuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNDQorI2RlZmluZSBwbmdfZ2V0X2lDQ1AgRk9YSVRfcG5nX2dldF9pQ0NQDQorI2RlZmluZSBwbmdfc2V0X2lDQ1AgRk9YSVRfcG5nX3NldF9pQ0NQDQorI2RlZmluZSBwbmdfZ2V0X3NQTFQgRk9YSVRfcG5nX2dldF9zUExUDQorI2RlZmluZSBwbmdfc2V0X3NQTFQgRk9YSVRfcG5nX3NldF9zUExUDQorI2RlZmluZSBwbmdfZ2V0X3RleHQgRk9YSVRfcG5nX2dldF90ZXh0DQorI2RlZmluZSBwbmdfc2V0X3RleHQgRk9YSVRfcG5nX3NldF90ZXh0DQorI2RlZmluZSBwbmdfZ2V0X3RJTUUgRk9YSVRfcG5nX2dldF90SU1FDQorI2RlZmluZSBwbmdfc2V0X3RJTUUgRk9YSVRfcG5nX3NldF90SU1FDQorI2RlZmluZSBwbmdfZ2V0X3RSTlMgRk9YSVRfcG5nX2dldF90Uk5TDQorI2RlZmluZSBwbmdfc2V0X3RSTlMgRk9YSVRfcG5nX3NldF90Uk5TDQorI2RlZmluZSBwbmdfZ2V0X3NDQUwgRk9YSVRfcG5nX2dldF9zQ0FMDQorI2RlZmluZSBwbmdfZ2V0X3NDQUxfZml4ZWQgRk9YSVRfcG5nX2dldF9zQ0FMX2ZpeGVkDQorI2RlZmluZSBwbmdfZ2V0X3NDQUxfcyBGT1hJVF9wbmdfZ2V0X3NDQUxfcw0KKyNkZWZpbmUgcG5nX3NldF9zQ0FMIEZPWElUX3BuZ19zZXRfc0NBTA0KKyNkZWZpbmUgcG5nX3NldF9zQ0FMX3MgRk9YSVRfcG5nX3NldF9zQ0FMX3MNCisjZGVmaW5lIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyBGT1hJVF9wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MNCisjZGVmaW5lIHBuZ19zZXRfdW5rbm93bl9jaHVua3MgRk9YSVRfcG5nX3NldF91bmtub3duX2NodW5rcw0KKyNkZWZpbmUgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uIEZPWElUX3BuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbg0KKyNkZWZpbmUgcG5nX2dldF91bmtub3duX2NodW5rcyBGT1hJVF9wbmdfZ2V0X3Vua25vd25fY2h1bmtzDQorI2RlZmluZSBwbmdfc2V0X2ludmFsaWQgRk9YSVRfcG5nX3NldF9pbnZhbGlkDQorI2RlZmluZSBwbmdfcmVhZF9wbmcgRk9YSVRfcG5nX3JlYWRfcG5nDQorI2RlZmluZSBwbmdfd3JpdGVfcG5nIEZPWElUX3BuZ193cml0ZV9wbmcNCisjZGVmaW5lIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIEZPWElUX3BuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzDQorI2RlZmluZSBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMgRk9YSVRfcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzDQorI2RlZmluZSBwbmdfc2V0X3VzZXJfbGltaXRzIEZPWElUX3BuZ19zZXRfdXNlcl9saW1pdHMNCisjZGVmaW5lIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggRk9YSVRfcG5nX2dldF91c2VyX3dpZHRoX21heA0KKyNkZWZpbmUgcG5nX2dldF91c2VyX2hlaWdodF9tYXggRk9YSVRfcG5nX2dldF91c2VyX2hlaWdodF9tYXgNCisjZGVmaW5lIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4IEZPWElUX3BuZ19zZXRfY2h1bmtfY2FjaGVfbWF4DQorI2RlZmluZSBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCBGT1hJVF9wbmdfZ2V0X2NodW5rX2NhY2hlX21heA0KKyNkZWZpbmUgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4IEZPWElUX3BuZ19zZXRfY2h1bmtfbWFsbG9jX21heA0KKyNkZWZpbmUgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4IEZPWElUX3BuZ19nZXRfY2h1bmtfbWFsbG9jX21heA0KKyNkZWZpbmUgcG5nX2dldF9waXhlbHNfcGVyX2luY2ggRk9YSVRfcG5nX2dldF9waXhlbHNfcGVyX2luY2gNCisjZGVmaW5lIHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2ggRk9YSVRfcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaA0KKyNkZWZpbmUgcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaCBGT1hJVF9wbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoDQorI2RlZmluZSBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyBGT1hJVF9wbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcw0KKyNkZWZpbmUgcG5nX2dldF94X29mZnNldF9pbmNoZXNfZml4ZWQgRk9YSVRfcG5nX2dldF94X29mZnNldF9pbmNoZXNfZml4ZWQNCisjZGVmaW5lIHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzIEZPWElUX3BuZ19nZXRfeV9vZmZzZXRfaW5jaGVzDQorI2RlZmluZSBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlc19maXhlZCBGT1hJVF9wbmdfZ2V0X3lfb2Zmc2V0X2luY2hlc19maXhlZA0KKyNkZWZpbmUgcG5nX2dldF9wSFlzX2RwaSBGT1hJVF9wbmdfZ2V0X3BIWXNfZHBpDQorI2RlZmluZSBwbmdfZ2V0X2lvX3N0YXRlIEZPWElUX3BuZ19nZXRfaW9fc3RhdGUNCisjZGVmaW5lIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSBGT1hJVF9wbmdfZ2V0X2lvX2NodW5rX25hbWUNCisjZGVmaW5lIHBuZ19nZXRfaW9fY2h1bmtfdHlwZSBGT1hJVF9wbmdfZ2V0X2lvX2NodW5rX3R5cGUNCisjZGVmaW5lIHBuZ19nZXRfdWludF8zMSBGT1hJVF9wbmdfZ2V0X3VpbnRfMzENCisjZGVmaW5lIHBuZ19zYXZlX3VpbnRfMzIgRk9YSVRfcG5nX3NhdmVfdWludF8zMg0KKyNkZWZpbmUgcG5nX3NhdmVfaW50XzMyIEZPWElUX3BuZ19zYXZlX2ludF8zMg0KKyNkZWZpbmUgcG5nX3NhdmVfdWludF8xNiBGT1hJVF9wbmdfc2F2ZV91aW50XzE2DQorI2RlZmluZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUgRk9YSVRfcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlDQorI2RlZmluZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvIEZPWElUX3BuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8NCisjZGVmaW5lIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5IEZPWElUX3BuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5DQorI2RlZmluZSBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgRk9YSVRfcG5nX2ltYWdlX2ZpbmlzaF9yZWFkDQorI2RlZmluZSBwbmdfaW1hZ2VfZnJlZSBGT1hJVF9wbmdfaW1hZ2VfZnJlZQ0KKyNkZWZpbmUgcG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUgRk9YSVRfcG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUNCisjZGVmaW5lIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbyBGT1hJVF9wbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8NCisjZGVmaW5lIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXggRk9YSVRfcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleA0KKyNkZWZpbmUgcG5nX2dldF9wYWxldHRlX21heCBGT1hJVF9wbmdfZ2V0X3BhbGV0dGVfbWF4DQorI2RlZmluZSBwbmdfc2V0X29wdGlvbiBGT1hJVF9wbmdfc2V0X29wdGlvbgorCisjZGVmaW5lIHBuZ19zZXRfc3RyaXBfMTYgRk9YSVRfcG5nX3NldF9zdHJpcF8xNgorI2RlZmluZSBwbmdfNjRiaXRfcHJvZHVjdCBGT1hJVF9wbmdfNjRiaXRfcHJvZHVjdAorI2RlZmluZSBwbmdfY2hlY2tfY0hSTV9maXhlZCBGT1hJVF9wbmdfY2hlY2tfY0hSTV9maXhlZAorI2RlZmluZSBwbmdfZnJlZSBGT1hJVF9wbmdfZnJlZQorI2RlZmluZSBwbmdfZnJlZV9kZWZhdWx0IEZPWElUX3BuZ19mcmVlX2RlZmF1bHQKKyNkZWZpbmUgcG5nX2dldF9tZW1fcHRyIEZPWElUX3BuZ19nZXRfbWVtX3B0cgorI2RlZmluZSBwbmdfbWFsbG9jIEZPWElUX3BuZ19tYWxsb2MKKyNkZWZpbmUgcG5nX21hbGxvY19kZWZhdWx0IEZPWElUX3BuZ19tYWxsb2NfZGVmYXVsdAorI2RlZmluZSBwbmdfbWFsbG9jX3dhcm4gRk9YSVRfcG5nX21hbGxvY193YXJuCisjZGVmaW5lIHBuZ19tZW1jcHlfY2hlY2sgRk9YSVRfcG5nX21lbWNweV9jaGVjaworI2RlZmluZSBwbmdfbWVtc2V0X2NoZWNrIEZPWElUX3BuZ19tZW1zZXRfY2hlY2sKKyNkZWZpbmUgcG5nX3Bhc3NfZHNwX21hc2sgRk9YSVRfcG5nX3Bhc3NfZHNwX21hc2sKKyNkZWZpbmUgcG5nX3Bhc3NfaW5jIEZPWElUX3BuZ19wYXNzX2luYworI2RlZmluZSBwbmdfcGFzc19tYXNrIEZPWElUX3BuZ19wYXNzX21hc2sKKyNkZWZpbmUgcG5nX3Bhc3Nfc3RhcnQgRk9YSVRfcG5nX3Bhc3Nfc3RhcnQKKyNkZWZpbmUgcG5nX3Bhc3NfeWluYyBGT1hJVF9wbmdfcGFzc195aW5jCisjZGVmaW5lIHBuZ19wYXNzX3lzdGFydCBGT1hJVF9wbmdfcGFzc195c3RhcnQKKyNkZWZpbmUgcG5nX3NldF9tZW1fZm4gRk9YSVRfcG5nX3NldF9tZW1fZm4KKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgcG5nLmggLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgdmVyc2lvbiBpbiBwbmcuYyAqLworI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgIjEuNi4zIgorI2RlZmluZSBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIFwKKyAgICAgIiBsaWJwbmcgdmVyc2lvbiAxLjYuMyAtIEp1bHkgMTgsIDIwMTNcbiIKKworI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9TT05VTSAgIDE2CisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX0RMTE5VTSAgMTYKKworLyogVGhlc2Ugc2hvdWxkIG1hdGNoIHRoZSBmaXJzdCAzIGNvbXBvbmVudHMgb2YgUE5HX0xJQlBOR19WRVJfU1RSSU5HOiAqLworI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9NQUpPUiAgIDEKKyNkZWZpbmUgUE5HX0xJQlBOR19WRVJfTUlOT1IgICA2CisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX1JFTEVBU0UgMworCisvKiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgbnVtZXJpYyBwYXJ0IG9mIHRoZSBmaW5hbCBjb21wb25lbnQgb2YKKyAqIFBOR19MSUJQTkdfVkVSX1NUUklORywgb21pdHRpbmcgYW55IGxlYWRpbmcgemVybzoKKyAqLworCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX0JVSUxEICAwCisKKy8qIFJlbGVhc2UgU3RhdHVzICovCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQUxQSEEgICAgMQorI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX0JFVEEgICAgIDIKKyNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9SQyAgICAgICAzCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFICAgNAorI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1JFTEVBU0VfU1RBVFVTX01BU0sgNworCisvKiBSZWxlYXNlLVNwZWNpZmljIEZsYWdzICovCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfUEFUQ0ggICAgOCAvKiBDYW4gYmUgT1InZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlBOR19CVUlMRF9TVEFCTEUgb25seSAqLworI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUgMTYgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCAqLworI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwgMzIgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSAqLworCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFCisKKy8qIENhcmVmdWwgaGVyZS4gIEF0IG9uZSB0aW1lLCBHdXkgd2FudGVkIHRvIHVzZSAwODIsIGJ1dCB0aGF0IHdvdWxkIGJlIG9jdGFsLgorICogV2UgbXVzdCBub3QgaW5jbHVkZSBsZWFkaW5nIHplcm9zLgorICogVmVyc2lvbnMgMC43IHRocm91Z2ggMS4wLjAgd2VyZSBpbiB0aGUgcmFuZ2UgMCB0byAxMDAgaGVyZSAob25seQorICogdmVyc2lvbiAxLjAuMCB3YXMgbWlzLW51bWJlcmVkIDEwMCBpbnN0ZWFkIG9mIDEwMDAwKS4gIEZyb20KKyAqIHZlcnNpb24gMS4wLjEgaXQncyAgICB4eHl5enosIHdoZXJlIHg9bWFqb3IsIHk9bWlub3IsIHo9cmVsZWFzZQorICovCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSIDEwNjAzIC8qIDEuNi4zICovCisKKy8qIExpYnJhcnkgY29uZmlndXJhdGlvbjogdGhlc2Ugb3B0aW9ucyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlcgorICogdGhlIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQuCisgKi8KKyNpZm5kZWYgUE5HTENPTkZfSAorICAgIC8qIElmIHBuZ2xpYmNvbmYuaCBpcyBtaXNzaW5nLCB5b3UgY2FuCisgICAgICogY29weSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0byBwbmdsaWJjb25mLmgKKyAgICAgKi8KKyMgICBpbmNsdWRlICJwbmdsaWJjb25mLmgiCisjZW5kaWYKKworI2lmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkKKyAgIC8qIE1hY2hpbmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gKi8KKyMgIGluY2x1ZGUgInBuZ2NvbmYuaCIKKyNlbmRpZgorCisvKgorICogQWRkZWQgYXQgbGlicG5nLTEuMi44CisgKgorICogUmVmIE1TRE46IFByaXZhdGUgYXMgcHJpb3JpdHkgb3ZlciBTcGVjaWFsCisgKiBWU19GRl9QUklWQVRFQlVJTEQgRmlsZSAqd2FzIG5vdCogYnVpbHQgdXNpbmcgc3RhbmRhcmQgcmVsZWFzZQorICogcHJvY2VkdXJlcy4gSWYgdGhpcyB2YWx1ZSBpcyBnaXZlbiwgdGhlIFN0cmluZ0ZpbGVJbmZvIGJsb2NrIG11c3QKKyAqIGNvbnRhaW4gYSBQcml2YXRlQnVpbGQgc3RyaW5nLgorICoKKyAqIFZTX0ZGX1NQRUNJQUxCVUlMRCBGaWxlICp3YXMqIGJ1aWx0IGJ5IHRoZSBvcmlnaW5hbCBjb21wYW55IHVzaW5nCisgKiBzdGFuZGFyZCByZWxlYXNlIHByb2NlZHVyZXMgYnV0IGlzIGEgdmFyaWF0aW9uIG9mIHRoZSBzdGFuZGFyZAorICogZmlsZSBvZiB0aGUgc2FtZSB2ZXJzaW9uIG51bWJlci4gSWYgdGhpcyB2YWx1ZSBpcyBnaXZlbiwgdGhlCisgKiBTdHJpbmdGaWxlSW5mbyBibG9jayBtdXN0IGNvbnRhaW4gYSBTcGVjaWFsQnVpbGQgc3RyaW5nLgorICovCisKKyNpZmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQgLyogRnJvbSBwbmdsaWJjb25mLmggKi8KKyMgIGRlZmluZSBQTkdfTElCUE5HX0JVSUxEX1RZUEUgXAorICAgICAgIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSB8IFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSkKKyNlbHNlCisjICBpZmRlZiBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRAorIyAgICBkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9UWVBFIFwKKyAgICAgICAgIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSB8IFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfVFlQRSAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZCisKKy8qIEluaGliaXQgQysrIG5hbWUtbWFuZ2xpbmcgZm9yIGxpYnBuZyBmdW5jdGlvbnMgYnV0IG5vdCBmb3Igc3lzdGVtIGNhbGxzLiAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBDIGZpbGVzLCBzdG9yZWQgaW4gcG5nLmMuICBUaGlzIGhhZCBiZXR0ZXIgbWF0Y2gKKyAqIHRoZSB2ZXJzaW9uIGFib3ZlLgorICovCisjZGVmaW5lIHBuZ19saWJwbmdfdmVyIHBuZ19nZXRfaGVhZGVyX3ZlcihOVUxMKQorCisvKiBUaGlzIGZpbGUgaXMgYXJyYW5nZWQgaW4gc2V2ZXJhbCBzZWN0aW9uczoKKyAqCisgKiAxLiBBbnkgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBieSBmb3IgdGhlIGFwcGxpY2F0aW9uCisgKiAgICBjb2RlIHdoZW4gaXQgaXMgYnVpbHQuICAoQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIGlzIGluIHBuZ2xpYmNvbmYuaCkKKyAqIDIuIFR5cGUgZGVmaW5pdGlvbnMgKGJhc2UgdHlwZXMgYXJlIGRlZmluZWQgaW4gcG5nY29uZi5oKSwgc3RydWN0dXJlCisgKiAgICBkZWZpbml0aW9ucy4KKyAqIDMuIEV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zLgorICogNC4gU2ltcGxpZmllZCBBUEkuCisgKgorICogVGhlIGxpYnJhcnkgc291cmNlIGNvZGUgaGFzIGFkZGl0aW9uYWwgZmlsZXMgKHByaW5jaXBhbGx5IHBuZ3ByaXYuaCkgdGhhdAorICogYWxsb3cgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAqLworLyogU2VjdGlvbiAxOiBydW4gdGltZSBjb25maWd1cmF0aW9uCisgKiBTZWUgcG5nbGliY29uZi5oIGZvciBidWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSdW4gdGltZSBjb25maWd1cmF0aW9uIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gY2hvb3NlIGJldHdlZW4KKyAqIGltcGxlbWVudGF0aW9ucyBvZiBjZXJ0YWluIGFyaXRobWV0aWMgQVBJcy4gIFRoZSBkZWZhdWx0IGlzIHNldAorICogYXQgYnVpbGQgdGltZSBhbmQgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oLCBidXQgaXQgaXMgc2FmZSB0bworICogb3ZlcnJpZGUgdGhlc2UgKGFuZCBvbmx5IHRoZXNlKSBzZXR0aW5ncy4gIE5vdGUgdGhhdCB0aGlzIHdvbid0CisgKiBjaGFuZ2Ugd2hhdCB0aGUgbGlicmFyeSBkb2VzLCBvbmx5IGFwcGxpY2F0aW9uIGNvZGUsIGFuZCB0aGUKKyAqIHNldHRpbmdzIGNhbiAoYW5kIHByb2JhYmx5IHNob3VsZCkgYmUgbWFkZSBvbiBhIHBlci1maWxlIGJhc2lzCisgKiBieSBzZXR0aW5nIHRoZSAjZGVmaW5lcyBiZWZvcmUgaW5jbHVkaW5nIHBuZy5oCisgKgorICogVXNlIG1hY3JvcyB0byByZWFkIGludGVnZXJzIGZyb20gUE5HIGRhdGEgb3IgdXNlIHRoZSBleHBvcnRlZAorICogZnVuY3Rpb25zPworICogICBQTkdfVVNFX1JFQURfTUFDUk9TOiB1c2UgdGhlIG1hY3JvcyAoc2VlIGJlbG93KSAgTm90ZSB0aGF0CisgKiAgICAgdGhlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcy4KKyAqICAgUE5HX05PX1VTRV9SRUFEX01BQ1JPUzogY2FsbCB0aGUgcmVsZXZhbnQgbGlicmFyeSBmdW5jdGlvbi4KKyAqCisgKiBVc2UgdGhlIGFsdGVybmF0aXZlIGFsZ29yaXRobSBmb3IgY29tcG9zaXRpbmcgYWxwaGEgc2FtcGxlcyB0aGF0CisgKiBkb2VzIG5vdCB1c2UgZGl2aXNpb24/CisgKiAgIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQ6IHVzZSB0aGUgJ25vIGRpdmlzaW9uJworICogICAgICBhbGdvcml0aG0uCisgKiAgIFBOR19OT19SRUFEX0NPTVBPU0lURV9OT0RJVjogdXNlIHRoZSAnZGl2aXNpb24nIGFsZ29yaXRobS4KKyAqCisgKiBIb3cgdG8gaGFuZGxlIGJlbmlnbiBlcnJvcnMgaWYgUE5HX0FMTE9XX0JFTklHTl9FUlJPUlMgaXMKKyAqIGZhbHNlPworICogICBQTkdfQUxMT1dfQkVOSUdOX0VSUk9SUzogbWFwIGNhbGxzIHRvIHRoZSBiZW5pZ24gZXJyb3IKKyAqICAgICAgQVBJcyB0byBwbmdfd2FybmluZy4KKyAqIE90aGVyd2lzZSB0aGUgY2FsbHMgYXJlIG1hcHBlZCB0byBwbmdfZXJyb3IuCisgKi8KKworLyogU2VjdGlvbiAyOiB0eXBlIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgc3RydWN0dXJlcyBhbmQgY29tcGlsZSB0aW1lCisgKiBjb25zdGFudHMuCisgKiBTZWUgcG5nY29uZi5oIGZvciBiYXNlIHR5cGVzIHRoYXQgdmFyeSBieSBtYWNoaW5lL3N5c3RlbQorICovCisKKy8qIFRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBpbiBwbmcuYywgaWYgcG5nLmMgYW5kIHBuZy5oCisgKiBkbyBub3QgYWdyZWUgdXBvbiB0aGUgdmVyc2lvbiBudW1iZXIuCisgKi8KK3R5cGVkZWYgY2hhciogcG5nX2xpYnBuZ192ZXJzaW9uXzFfNl8zOworCisvKiBCYXNpYyBjb250cm9sIHN0cnVjdGlvbnMuICBSZWFkIGxpYnBuZy1tYW51YWwudHh0IG9yIGxpYnBuZy4zIGZvciBtb3JlIGluZm8uCisgKgorICogcG5nX3N0cnVjdCBpcyB0aGUgY2FjaGUgb2YgaW5mb3JtYXRpb24gdXNlZCB3aGlsZSByZWFkaW5nIG9yIHdyaXRpbmcgYSBzaW5nbGUKKyAqIFBORyBmaWxlLiAgT25lIG9mIHRoZXNlIGlzIGFsd2F5cyByZXF1aXJlZCwgYWx0aG91Z2ggdGhlIHNpbXBsaWZpZWQgQVBJCisgKiAoYmVsb3cpIGhpZGVzIHRoZSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gb2YgaXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ19zdHJ1Y3RfZGVmIHBuZ19zdHJ1Y3Q7Cit0eXBlZGVmIGNvbnN0IHBuZ19zdHJ1Y3QgKiBwbmdfY29uc3Rfc3RydWN0cDsKK3R5cGVkZWYgcG5nX3N0cnVjdCAqIHBuZ19zdHJ1Y3RwOwordHlwZWRlZiBwbmdfc3RydWN0ICogKiBwbmdfc3RydWN0cHA7CisKKy8qIHBuZ19pbmZvIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlYWQgZnJvbSBvciB0byBiZSB3cml0dGVuIHRvIGEgUE5HIGZpbGUuICBPbmUKKyAqIG9yIG1vcmUgb2YgdGhlc2UgbXVzdCBleGlzdCB3aGlsZSByZWFkaW5nIG9yIGNyZWF0aW5nIGEgUE5HIGZpbGUuICBUaGUKKyAqIGluZm9ybWF0aW9uIGlzIG5vdCB1c2VkIGJ5IGxpYnBuZyBkdXJpbmcgcmVhZCBidXQgaXMgdXNlZCB0byBjb250cm9sIHdoYXQKKyAqIGdldHMgd3JpdHRlbiB3aGVuIGEgUE5HIGZpbGUgaXMgY3JlYXRlZC4gICJwbmdfZ2V0XyIgZnVuY3Rpb24gY2FsbHMgcmVhZAorICogaW5mb3JtYXRpb24gZHVyaW5nIHJlYWQgYW5kICJwbmdfc2V0XyIgZnVuY3Rpb25zIGNhbGxzIHdyaXRlIGluZm9ybWF0aW9uCisgKiB3aGVuIGNyZWF0aW5nIGEgUE5HLgorICogYmVlbiBtb3ZlZCBpbnRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUgdGhhdCBpcyBub3QgYWNjZXNzaWJsZSB0bworICogYXBwbGljYXRpb25zLiAgUmVhZCBsaWJwbmctbWFudWFsLnR4dCBvciBsaWJwbmcuMyBmb3IgbW9yZSBpbmZvLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfaW5mb19kZWYgcG5nX2luZm87Cit0eXBlZGVmIHBuZ19pbmZvICogcG5nX2luZm9wOwordHlwZWRlZiBjb25zdCBwbmdfaW5mbyAqIHBuZ19jb25zdF9pbmZvcDsKK3R5cGVkZWYgcG5nX2luZm8gKiAqIHBuZ19pbmZvcHA7CisKKy8qIFR5cGVzIHdpdGggbmFtZXMgZW5kaW5nICdwJyBhcmUgcG9pbnRlciB0eXBlcy4gIFRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIHdpdGgKKyAqIG5hbWVzIGVuZGluZyAncnAnIGFyZSBpZGVudGljYWwgcG9pbnRlciB0eXBlcyBleGNlcHQgdGhhdCB0aGUgcG9pbnRlciBpcworICogbWFya2VkICdyZXN0cmljdCcsIHdoaWNoIG1lYW5zIHRoYXQgaXQgaXMgdGhlIG9ubHkgcG9pbnRlciB0byB0aGUgb2JqZWN0CisgKiBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgQXBwbGljYXRpb25zIHNob3VsZCBub3QgdXNlIHRoZSAncmVzdHJpY3QnIHR5cGVzOworICogaXQgaXMgYWx3YXlzIHZhbGlkIHRvIHBhc3MgJ3AnIHRvIGEgcG9pbnRlciB3aXRoIGEgZnVuY3Rpb24gYXJndW1lbnQgb2YgdGhlCisgKiBjb3JyZXNwb25kaW5nICdycCcgdHlwZS4gIERpZmZlcmVudCBjb21waWxlcnMgaGF2ZSBkaWZmZXJlbnQgcnVsZXMgd2l0aAorICogcmVnYXJkIHRvIHR5cGUgbWF0Y2hpbmcgaW4gdGhlIHByZXNlbmNlIG9mICdyZXN0cmljdCcuICBGb3IgYmFja3dhcmQKKyAqIGNvbXBhdGliaWxpdHkgbGlicG5nIGNhbGxiYWNrcyBuZXZlciBoYXZlICdyZXN0cmljdCcgaW4gdGhlaXIgcGFyYW1ldGVycyBhbmQsCisgKiBjb25zZXF1ZW50aWFsbHksIHdyaXRpbmcgcG9ydGFibGUgYXBwbGljYXRpb24gY29kZSBpcyBleHRyZW1lbHkgZGlmZmljdWx0IGlmCisgKiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlICdyZXN0cmljdCcuCisgKi8KK3R5cGVkZWYgcG5nX3N0cnVjdCAqIFBOR19SRVNUUklDVCBwbmdfc3RydWN0cnA7Cit0eXBlZGVmIGNvbnN0IHBuZ19zdHJ1Y3QgKiBQTkdfUkVTVFJJQ1QgcG5nX2NvbnN0X3N0cnVjdHJwOwordHlwZWRlZiBwbmdfaW5mbyAqIFBOR19SRVNUUklDVCBwbmdfaW5mb3JwOwordHlwZWRlZiBjb25zdCBwbmdfaW5mbyAqIFBOR19SRVNUUklDVCBwbmdfY29uc3RfaW5mb3JwOworCisvKiBUaHJlZSBjb2xvciBkZWZpbml0aW9ucy4gIFRoZSBvcmRlciBvZiB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUsIChhbmQgdGhlCisgKiBleGFjdCBzaXplKSBpcyBub3QgaW1wb3J0YW50LCBhbHRob3VnaCB0aGUgc2l6ZSBvZiB0aGUgZmllbGRzIG5lZWQgdG8KKyAqIGJlIHBuZ19ieXRlIG9yIHBuZ191aW50XzE2IChhcyBkZWZpbmVkIGJlbG93KS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbG9yX3N0cnVjdAoreworICAgcG5nX2J5dGUgcmVkOworICAgcG5nX2J5dGUgZ3JlZW47CisgICBwbmdfYnl0ZSBibHVlOworfSBwbmdfY29sb3I7Cit0eXBlZGVmIHBuZ19jb2xvciAqIHBuZ19jb2xvcnA7Cit0eXBlZGVmIGNvbnN0IHBuZ19jb2xvciAqIHBuZ19jb25zdF9jb2xvcnA7Cit0eXBlZGVmIHBuZ19jb2xvciAqICogcG5nX2NvbG9ycHA7CisKK3R5cGVkZWYgc3RydWN0IHBuZ19jb2xvcl8xNl9zdHJ1Y3QKK3sKKyAgIHBuZ19ieXRlIGluZGV4OyAgICAvKiB1c2VkIGZvciBwYWxldHRlIGZpbGVzICovCisgICBwbmdfdWludF8xNiByZWQ7ICAgLyogZm9yIHVzZSBpbiByZWQgZ3JlZW4gYmx1ZSBmaWxlcyAqLworICAgcG5nX3VpbnRfMTYgZ3JlZW47CisgICBwbmdfdWludF8xNiBibHVlOworICAgcG5nX3VpbnRfMTYgZ3JheTsgIC8qIGZvciB1c2UgaW4gZ3JheXNjYWxlIGZpbGVzICovCit9IHBuZ19jb2xvcl8xNjsKK3R5cGVkZWYgcG5nX2NvbG9yXzE2ICogcG5nX2NvbG9yXzE2cDsKK3R5cGVkZWYgY29uc3QgcG5nX2NvbG9yXzE2ICogcG5nX2NvbnN0X2NvbG9yXzE2cDsKK3R5cGVkZWYgcG5nX2NvbG9yXzE2ICogKiBwbmdfY29sb3JfMTZwcDsKKwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbG9yXzhfc3RydWN0Cit7CisgICBwbmdfYnl0ZSByZWQ7ICAgLyogZm9yIHVzZSBpbiByZWQgZ3JlZW4gYmx1ZSBmaWxlcyAqLworICAgcG5nX2J5dGUgZ3JlZW47CisgICBwbmdfYnl0ZSBibHVlOworICAgcG5nX2J5dGUgZ3JheTsgIC8qIGZvciB1c2UgaW4gZ3JheXNjYWxlIGZpbGVzICovCisgICBwbmdfYnl0ZSBhbHBoYTsgLyogZm9yIGFscGhhIGNoYW5uZWwgZmlsZXMgKi8KK30gcG5nX2NvbG9yXzg7Cit0eXBlZGVmIHBuZ19jb2xvcl84ICogcG5nX2NvbG9yXzhwOwordHlwZWRlZiBjb25zdCBwbmdfY29sb3JfOCAqIHBuZ19jb25zdF9jb2xvcl84cDsKK3R5cGVkZWYgcG5nX2NvbG9yXzggKiAqIHBuZ19jb2xvcl84cHA7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR3byBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGZvciB0aGUgaW4tY29yZSByZXByZXNlbnRhdGlvbgorICogb2Ygc1BMVCBjaHVua3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ19zUExUX2VudHJ5X3N0cnVjdAoreworICAgcG5nX3VpbnRfMTYgcmVkOworICAgcG5nX3VpbnRfMTYgZ3JlZW47CisgICBwbmdfdWludF8xNiBibHVlOworICAgcG5nX3VpbnRfMTYgYWxwaGE7CisgICBwbmdfdWludF8xNiBmcmVxdWVuY3k7Cit9IHBuZ19zUExUX2VudHJ5OwordHlwZWRlZiBwbmdfc1BMVF9lbnRyeSAqIHBuZ19zUExUX2VudHJ5cDsKK3R5cGVkZWYgY29uc3QgcG5nX3NQTFRfZW50cnkgKiBwbmdfY29uc3Rfc1BMVF9lbnRyeXA7Cit0eXBlZGVmIHBuZ19zUExUX2VudHJ5ICogKiBwbmdfc1BMVF9lbnRyeXBwOworCisvKiAgV2hlbiB0aGUgZGVwdGggb2YgdGhlIHNQTFQgcGFsZXR0ZSBpcyA4IGJpdHMsIHRoZSBjb2xvciBhbmQgYWxwaGEgc2FtcGxlcworICogIG9jY3VweSB0aGUgTFNCIG9mIHRoZWlyIHJlc3BlY3RpdmUgbWVtYmVycywgYW5kIHRoZSBNU0Igb2YgZWFjaCBtZW1iZXIKKyAqICBpcyB6ZXJvLWZpbGxlZC4gIFRoZSBmcmVxdWVuY3kgbWVtYmVyIGFsd2F5cyBvY2N1cGllcyB0aGUgZnVsbCAxNiBiaXRzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHBuZ19zUExUX3N0cnVjdAoreworICAgcG5nX2NoYXJwIG5hbWU7ICAgICAgICAgICAvKiBwYWxldHRlIG5hbWUgKi8KKyAgIHBuZ19ieXRlIGRlcHRoOyAgICAgICAgICAgLyogZGVwdGggb2YgcGFsZXR0ZSBzYW1wbGVzICovCisgICBwbmdfc1BMVF9lbnRyeXAgZW50cmllczsgIC8qIHBhbGV0dGUgZW50cmllcyAqLworICAgcG5nX2ludF8zMiBuZW50cmllczsgICAgICAvKiBudW1iZXIgb2YgcGFsZXR0ZSBlbnRyaWVzICovCit9IHBuZ19zUExUX3Q7Cit0eXBlZGVmIHBuZ19zUExUX3QgKiBwbmdfc1BMVF90cDsKK3R5cGVkZWYgY29uc3QgcG5nX3NQTFRfdCAqIHBuZ19jb25zdF9zUExUX3RwOwordHlwZWRlZiBwbmdfc1BMVF90ICogKiBwbmdfc1BMVF90cHA7CisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKy8qIHBuZ190ZXh0IGhvbGRzIHRoZSBjb250ZW50cyBvZiBhIHRleHQvenR4dC9pdHh0IGNodW5rIGluIGEgUE5HIGZpbGUsCisgKiBhbmQgd2hldGhlciB0aGF0IGNvbnRlbnRzIGlzIGNvbXByZXNzZWQgb3Igbm90LiAgVGhlICJrZXkiIGZpZWxkCisgKiBwb2ludHMgdG8gYSByZWd1bGFyIHplcm8tdGVybWluYXRlZCBDIHN0cmluZy4gIFRoZSAidGV4dCIgZmllbGRzIGNhbiBiZSBhCisgKiByZWd1bGFyIEMgc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcsIG9yIGEgTlVMTCBwb2ludGVyLgorICogSG93ZXZlciwgdGhlIHN0cnVjdHVyZSByZXR1cm5lZCBieSBwbmdfZ2V0X3RleHQoKSB3aWxsIGFsd2F5cyBjb250YWluCisgKiB0aGUgInRleHQiIGZpZWxkIGFzIGEgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmcgKHBvc3NpYmx5CisgKiBlbXB0eSksIG5ldmVyIGEgTlVMTCBwb2ludGVyLCBzbyBpdCBjYW4gYmUgc2FmZWx5IHVzZWQgaW4gcHJpbnRmKCkgYW5kCisgKiBvdGhlciBzdHJpbmctaGFuZGxpbmcgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IHRoZSAiaXR4dF9sZW5ndGgiLCAibGFuZyIsIGFuZAorICogImxhbmdfa2V5IiBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3R1cmUgb25seSBleGlzdCB3aGVuIHRoZSBsaWJyYXJ5IGlzIGJ1aWx0CisgKiB3aXRoIGlUWHQgY2h1bmsgc3VwcG9ydC4gIFByaW9yIHRvIGxpYnBuZy0xLjQuMCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgYnkKKyAqIGRlZmF1bHQgd2l0aG91dCBpVFh0IHN1cHBvcnQuIEFsc28gbm90ZSB0aGF0IHdoZW4gaVRYdCAqaXMqIHN1cHBvcnRlZCwKKyAqIHRoZSAibGFuZyIgYW5kICJsYW5nX2tleSIgZmllbGRzIGNvbnRhaW4gTlVMTCBwb2ludGVycyB3aGVuIHRoZQorICogImNvbXByZXNzaW9uIiBmaWVsZCBjb250YWlucyAqIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IKKyAqIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQuIE5vdGUgdGhhdCB0aGUgImNvbXByZXNzaW9uIHZhbHVlIiBpcyBub3QgdGhlCisgKiBzYW1lIGFzIHdoYXQgYXBwZWFycyBpbiB0aGUgUE5HIHRFWHQvelRYdC9pVFh0IGNodW5rJ3MgImNvbXByZXNzaW9uIGZsYWciCisgKiB3aGljaCBpcyBhbHdheXMgMCBvciAxLCBvciBpdHMgImNvbXByZXNzaW9uIG1ldGhvZCIgd2hpY2ggaXMgYWx3YXlzIDAuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ190ZXh0X3N0cnVjdAoreworICAgaW50ICBjb21wcmVzc2lvbjsgICAgICAgLyogY29tcHJlc3Npb24gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiB0RVh0LCBub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiB6VFh0LCBkZWZsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBpVFh0LCBub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBpVFh0LCBkZWZsYXRlICAqLworICAgcG5nX2NoYXJwIGtleTsgICAgICAgICAgLyoga2V5d29yZCwgMS03OSBjaGFyYWN0ZXIgZGVzY3JpcHRpb24gb2YgInRleHQiICovCisgICBwbmdfY2hhcnAgdGV4dDsgICAgICAgICAvKiBjb21tZW50LCBtYXkgYmUgYW4gZW1wdHkgc3RyaW5nIChpZSAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgTlVMTCBwb2ludGVyICovCisgICBwbmdfc2l6ZV90IHRleHRfbGVuZ3RoOyAvKiBsZW5ndGggb2YgdGhlIHRleHQgc3RyaW5nICovCisgICBwbmdfc2l6ZV90IGl0eHRfbGVuZ3RoOyAvKiBsZW5ndGggb2YgdGhlIGl0eHQgc3RyaW5nICovCisgICBwbmdfY2hhcnAgbGFuZzsgICAgICAgICAvKiBsYW5ndWFnZSBjb2RlLCAwLTc5IGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgTlVMTCBwb2ludGVyICovCisgICBwbmdfY2hhcnAgbGFuZ19rZXk7ICAgICAvKiBrZXl3b3JkIHRyYW5zbGF0ZWQgVVRGLTggc3RyaW5nLCAwIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzIG9yIGEgTlVMTCBwb2ludGVyICovCit9IHBuZ190ZXh0OwordHlwZWRlZiBwbmdfdGV4dCAqIHBuZ190ZXh0cDsKK3R5cGVkZWYgY29uc3QgcG5nX3RleHQgKiBwbmdfY29uc3RfdGV4dHA7Cit0eXBlZGVmIHBuZ190ZXh0ICogKiBwbmdfdGV4dHBwOworI2VuZGlmCisKKy8qIFN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlcyBmb3IgdGV4dCBpbiBQTkcgZmlsZXMgKHRFWHQsIGFuZCB6VFh0KS4KKyAqIFRoZSB2YWx1ZXMgb2YgdGhlIFBOR19URVhUX0NPTVBSRVNTSU9OXyBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUiAtMworI2RlZmluZSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSIC0yCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgICAgLTEKKyNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCAgICAgMAorI2RlZmluZSBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FICAgICAxCisjZGVmaW5lIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQgICAgIDIKKyNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05fTEFTVCAgICAgMyAgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KKworLyogcG5nX3RpbWUgaXMgYSB3YXkgdG8gaG9sZCB0aGUgdGltZSBpbiBhbiBtYWNoaW5lIGluZGVwZW5kZW50IHdheS4KKyAqIFR3byBjb252ZXJzaW9ucyBhcmUgcHJvdmlkZWQsIGJvdGggZnJvbSB0aW1lX3QgYW5kIHN0cnVjdCB0bS4gIFRoZXJlCisgKiBpcyBubyBwb3J0YWJsZSB3YXkgdG8gY29udmVydCB0byBlaXRoZXIgb2YgdGhlc2Ugc3RydWN0dXJlcywgYXMgZmFyCisgKiBhcyBJIGtub3cuICBJZiB5b3Uga25vdyBvZiBhIHBvcnRhYmxlIHdheSwgc2VuZCBpdCB0byBtZS4gIEFzIGEgc2lkZQorICogbm90ZSAtIFBORyBoYXMgYWx3YXlzIGJlZW4gWWVhciAyMDAwIGNvbXBsaWFudCEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX3RpbWVfc3RydWN0Cit7CisgICBwbmdfdWludF8xNiB5ZWFyOyAvKiBmdWxsIHllYXIsIGFzIGluLCAxOTk1ICovCisgICBwbmdfYnl0ZSBtb250aDsgICAvKiBtb250aCBvZiB5ZWFyLCAxIC0gMTIgKi8KKyAgIHBuZ19ieXRlIGRheTsgICAgIC8qIGRheSBvZiBtb250aCwgMSAtIDMxICovCisgICBwbmdfYnl0ZSBob3VyOyAgICAvKiBob3VyIG9mIGRheSwgMCAtIDIzICovCisgICBwbmdfYnl0ZSBtaW51dGU7ICAvKiBtaW51dGUgb2YgaG91ciwgMCAtIDU5ICovCisgICBwbmdfYnl0ZSBzZWNvbmQ7ICAvKiBzZWNvbmQgb2YgbWludXRlLCAwIC0gNjAgKGZvciBsZWFwIHNlY29uZHMpICovCit9IHBuZ190aW1lOwordHlwZWRlZiBwbmdfdGltZSAqIHBuZ190aW1lcDsKK3R5cGVkZWYgY29uc3QgcG5nX3RpbWUgKiBwbmdfY29uc3RfdGltZXA7Cit0eXBlZGVmIHBuZ190aW1lICogKiBwbmdfdGltZXBwOworCisjaWZkZWYgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorLyogcG5nX3Vua25vd25fY2h1bmsgaXMgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBxdWV1ZWQgY2h1bmtzIGZvciB3aGljaCB0aGVyZSBpcworICogbm8gc3BlY2lmaWMgc3VwcG9ydC4gIFRoZSBpZGVhIGlzIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHRvIHF1ZXVlCisgKiB1cCBwcml2YXRlIGNodW5rcyBmb3Igb3V0cHV0IGV2ZW4gdGhvdWdoIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkKKyAqIGtub3cgYWJvdXQgdGhlaXIgc2VtYW50aWNzLgorICoKKyAqIFRoZSBkYXRhIGluIHRoZSBzdHJ1Y3R1cmUgaXMgc2V0IGJ5IGxpYnBuZyBvbiByZWFkIGFuZCB1c2VkIG9uIHdyaXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfdW5rbm93bl9jaHVua190Cit7CisgICAgcG5nX2J5dGUgbmFtZVs1XTsgLyogVGV4dHVhbCBjaHVuayBuYW1lIHdpdGggJ1wwJyB0ZXJtaW5hdG9yICovCisgICAgcG5nX2J5dGUgKmRhdGE7ICAgLyogRGF0YSwgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBvbiByZWFkISAqLworICAgIHBuZ19zaXplX3Qgc2l6ZTsKKworICAgIC8qIE9uIHdyaXRlICdsb2NhdGlvbicgbXVzdCBiZSBzZXQgdXNpbmcgdGhlIGZsYWcgdmFsdWVzIGxpc3RlZCBiZWxvdy4KKyAgICAgKiBOb3RpY2UgdGhhdCBvbiByZWFkIGl0IGlzIHNldCBieSBsaWJwbmcgaG93ZXZlciB0aGUgdmFsdWVzIHN0b3JlZCBoYXZlCisgICAgICogbW9yZSBiaXRzIHNldCB0aGFuIGFyZSBsaXN0ZWQgYmVsb3cuICBBbHdheXMgdHJlYXQgdGhlIHZhbHVlIGFzIGEKKyAgICAgKiBiaXRtYXNrLiAgT24gd3JpdGUgc2V0IG9ubHkgb25lIGJpdCAtIHNldHRpbmcgbXVsdGlwbGUgYml0cyBtYXkgY2F1c2UgdGhlCisgICAgICogY2h1bmsgdG8gYmUgd3JpdHRlbiBpbiBtdWx0aXBsZSBwbGFjZXMuCisgICAgICovCisgICAgcG5nX2J5dGUgbG9jYXRpb247IC8qIG1vZGUgb2Ygb3BlcmF0aW9uIGF0IHJlYWQgdGltZSAqLworfQorcG5nX3Vua25vd25fY2h1bms7CisKK3R5cGVkZWYgcG5nX3Vua25vd25fY2h1bmsgKiBwbmdfdW5rbm93bl9jaHVua3A7Cit0eXBlZGVmIGNvbnN0IHBuZ191bmtub3duX2NodW5rICogcG5nX2NvbnN0X3Vua25vd25fY2h1bmtwOwordHlwZWRlZiBwbmdfdW5rbm93bl9jaHVuayAqICogcG5nX3Vua25vd25fY2h1bmtwcDsKKyNlbmRpZgorCisvKiBGbGFnIHZhbHVlcyBmb3IgdGhlIHVua25vd24gY2h1bmsgbG9jYXRpb24gYnl0ZS4gKi8KKyNkZWZpbmUgUE5HX0hBVkVfSUhEUiAgMHgwMQorI2RlZmluZSBQTkdfSEFWRV9QTFRFICAweDAyCisjZGVmaW5lIFBOR19BRlRFUl9JREFUIDB4MDgKKworLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHVzZWQgaW4gUE5HIGlzICgyXjMxKS0xICovCisjZGVmaW5lIFBOR19VSU5UXzMxX01BWCAoKHBuZ191aW50XzMyKTB4N2ZmZmZmZmZMKQorI2RlZmluZSBQTkdfVUlOVF8zMl9NQVggKChwbmdfdWludF8zMikoLTEpKQorI2RlZmluZSBQTkdfU0laRV9NQVggKChwbmdfc2l6ZV90KSgtMSkpCisKKy8qIFRoZXNlIGFyZSBjb25zdGFudHMgZm9yIGZpeGVkIHBvaW50IHZhbHVlcyBlbmNvZGVkIGluIHRoZQorICogUE5HIHNwZWNpZmljYXRpb24gbWFubmVyICh4MTAwMDAwKQorICovCisjZGVmaW5lIFBOR19GUF8xICAgIDEwMDAwMAorI2RlZmluZSBQTkdfRlBfSEFMRiAgNTAwMDAKKyNkZWZpbmUgUE5HX0ZQX01BWCAgKChwbmdfZml4ZWRfcG9pbnQpMHg3ZmZmZmZmZkwpCisjZGVmaW5lIFBOR19GUF9NSU4gICgtUE5HX0ZQX01BWCkKKworLyogVGhlc2UgZGVzY3JpYmUgdGhlIGNvbG9yX3R5cGUgZmllbGQgaW4gcG5nX2luZm8uICovCisvKiBjb2xvciB0eXBlIG1hc2tzICovCisjZGVmaW5lIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUgICAgMQorI2RlZmluZSBQTkdfQ09MT1JfTUFTS19DT0xPUiAgICAgIDIKKyNkZWZpbmUgUE5HX0NPTE9SX01BU0tfQUxQSEEgICAgICA0CisKKy8qIGNvbG9yIHR5cGVzLiAgTm90ZSB0aGF0IG5vdCBhbGwgY29tYmluYXRpb25zIGFyZSBsZWdhbCAqLworI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9HUkFZIDAKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAgKFBOR19DT0xPUl9NQVNLX0NPTE9SIHwgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUkdCICAgICAgICAoUE5HX0NPTE9SX01BU0tfQ09MT1IpCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSAgKFBOR19DT0xPUl9NQVNLX0NPTE9SIHwgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgKFBOR19DT0xPUl9NQVNLX0FMUEhBKQorLyogYWxpYXNlcyAqLworI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9SR0JBICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfR0EgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKKworLyogVGhpcyBpcyBmb3IgY29tcHJlc3Npb24gdHlwZS4gUE5HIDEuMC0xLjIgb25seSBkZWZpbmUgdGhlIHNpbmdsZSB0eXBlLiAqLworI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIDAgLyogRGVmbGF0ZSBtZXRob2QgOCwgMzJLIHdpbmRvdyAqLworI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKKworLyogVGhpcyBpcyBmb3IgZmlsdGVyIHR5cGUuIFBORyAxLjAtMS4yIG9ubHkgZGVmaW5lIHRoZSBzaW5nbGUgdHlwZS4gKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UgICAgICAwIC8qIFNpbmdsZSByb3cgcGVyLWJ5dGUgZmlsdGVyaW5nICovCisjZGVmaW5lIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyA2NCAvKiBVc2VkIG9ubHkgaW4gTU5HIGRhdGFzdHJlYW1zICovCisjZGVmaW5lIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUICAgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKKworLyogVGhlc2UgYXJlIGZvciB0aGUgaW50ZXJsYWNpbmcgdHlwZS4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19JTlRFUkxBQ0VfTk9ORSAgICAgICAgMCAvKiBOb24taW50ZXJsYWNlZCBpbWFnZSAqLworI2RlZmluZSBQTkdfSU5URVJMQUNFX0FEQU03ICAgICAgIDEgLyogQWRhbTcgaW50ZXJsYWNpbmcgKi8KKyNkZWZpbmUgUE5HX0lOVEVSTEFDRV9MQVNUICAgICAgICAyIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIG9GRnMgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLworI2RlZmluZSBQTkdfT0ZGU0VUX1BJWEVMICAgICAgICAgIDAgLyogT2Zmc2V0IGluIHBpeGVscyAqLworI2RlZmluZSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIgICAgIDEgLyogT2Zmc2V0IGluIG1pY3JvbWV0ZXJzICgxLzEwXjYgbWV0ZXIpICovCisjZGVmaW5lIFBOR19PRkZTRVRfTEFTVCAgICAgICAgICAgMiAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBwQ0FMIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX0VRVUFUSU9OX0xJTkVBUiAgICAgICAwIC8qIExpbmVhciB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSBQTkdfRVFVQVRJT05fQkFTRV9FICAgICAgIDEgLyogRXhwb25lbnRpYWwgYmFzZSBlIHRyYW5zZm9ybSAqLworI2RlZmluZSBQTkdfRVFVQVRJT05fQVJCSVRSQVJZICAgIDIgLyogQXJiaXRyYXJ5IGJhc2UgZXhwb25lbnRpYWwgdHJhbnNmb3JtICovCisjZGVmaW5lIFBOR19FUVVBVElPTl9IWVBFUkJPTElDICAgMyAvKiBIeXBlcmJvbGljIHNpbmUgdHJhbnNmb3JtYXRpb24gKi8KKyNkZWZpbmUgUE5HX0VRVUFUSU9OX0xBU1QgICAgICAgICA0IC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIHNDQUwgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLworI2RlZmluZSBQTkdfU0NBTEVfVU5LTk9XTiAgICAgICAgIDAgLyogdW5rbm93biB1bml0IChpbWFnZSBzY2FsZSkgKi8KKyNkZWZpbmUgUE5HX1NDQUxFX01FVEVSICAgICAgICAgICAxIC8qIG1ldGVycyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUgUE5HX1NDQUxFX1JBRElBTiAgICAgICAgICAyIC8qIHJhZGlhbnMgcGVyIHBpeGVsICovCisjZGVmaW5lIFBOR19TQ0FMRV9MQVNUICAgICAgICAgICAgMyAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBwSFlzIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX1JFU09MVVRJT05fVU5LTk9XTiAgICAwIC8qIHBpeGVscy91bmtub3duIHVuaXQgKGFzcGVjdCByYXRpbykgKi8KKyNkZWZpbmUgUE5HX1JFU09MVVRJT05fTUVURVIgICAgICAxIC8qIHBpeGVscy9tZXRlciAqLworI2RlZmluZSBQTkdfUkVTT0xVVElPTl9MQVNUICAgICAgIDIgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KKworLyogVGhlc2UgYXJlIGZvciB0aGUgc1JHQiBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9QRVJDRVBUVUFMIDAKKyNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX1JFTEFUSVZFICAgMQorI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfU0FUVVJBVElPTiAyCisjZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSAgIDMKKyNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX0xBU1QgICAgICAgNCAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGlzIGlzIGZvciB0ZXh0IGNodW5rcyAqLworI2RlZmluZSBQTkdfS0VZV09SRF9NQVhfTEVOR1RIICAgICA3OQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIFBMVEUvc1BMVC90Uk5TIGFycmF5cyAqLworI2RlZmluZSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICAgIDI1NgorCisvKiBUaGVzZSBkZXRlcm1pbmUgaWYgYW4gYW5jaWxsYXJ5IGNodW5rJ3MgZGF0YSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVhZAorICogZnJvbSB0aGUgUE5HIGhlYWRlciwgb3IgaWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBmaWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRhdGEgaW4gdGhlIGluZm9fc3RydWN0IHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0IGZpbGUuICBUaGUgdmFsdWVzCisgKiBvZiB0aGUgUE5HX0lORk9fPGNodW5rPiBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBQTkdfSU5GT19nQU1BIDB4MDAwMQorI2RlZmluZSBQTkdfSU5GT19zQklUIDB4MDAwMgorI2RlZmluZSBQTkdfSU5GT19jSFJNIDB4MDAwNAorI2RlZmluZSBQTkdfSU5GT19QTFRFIDB4MDAwOAorI2RlZmluZSBQTkdfSU5GT190Uk5TIDB4MDAxMAorI2RlZmluZSBQTkdfSU5GT19iS0dEIDB4MDAyMAorI2RlZmluZSBQTkdfSU5GT19oSVNUIDB4MDA0MAorI2RlZmluZSBQTkdfSU5GT19wSFlzIDB4MDA4MAorI2RlZmluZSBQTkdfSU5GT19vRkZzIDB4MDEwMAorI2RlZmluZSBQTkdfSU5GT190SU1FIDB4MDIwMAorI2RlZmluZSBQTkdfSU5GT19wQ0FMIDB4MDQwMAorI2RlZmluZSBQTkdfSU5GT19zUkdCIDB4MDgwMCAgIC8qIEdSLVAsIDAuOTZhICovCisjZGVmaW5lIFBOR19JTkZPX2lDQ1AgMHgxMDAwICAgLyogRVNSLCAxLjAuNiAqLworI2RlZmluZSBQTkdfSU5GT19zUExUIDB4MjAwMCAgIC8qIEVTUiwgMS4wLjYgKi8KKyNkZWZpbmUgUE5HX0lORk9fc0NBTCAweDQwMDAgICAvKiBFU1IsIDEuMC42ICovCisjZGVmaW5lIFBOR19JTkZPX0lEQVQgMHg4MDAwICAgLyogRVNSLCAxLjAuNiAqLworCisvKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcywgYXMgc29tZSBvZiB0aGVtCisgKiBjaGFuZ2UgdGhlc2UgdmFsdWVzIGZvciB0aGUgcm93LiAgSXQgYWxzbyBzaG91bGQgZW5hYmxlIHVzaW5nCisgKiB0aGUgcm91dGluZXMgZm9yIG90aGVyIHB1cnBvc2VzLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfcm93X2luZm9fc3RydWN0Cit7CisgICBwbmdfdWludF8zMiB3aWR0aDsgICAgLyogd2lkdGggb2Ygcm93ICovCisgICBwbmdfc2l6ZV90IHJvd2J5dGVzOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHJvdyAqLworICAgcG5nX2J5dGUgY29sb3JfdHlwZTsgIC8qIGNvbG9yIHR5cGUgb2Ygcm93ICovCisgICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgLyogYml0IGRlcHRoIG9mIHJvdyAqLworICAgcG5nX2J5dGUgY2hhbm5lbHM7ICAgIC8qIG51bWJlciBvZiBjaGFubmVscyAoMSwgMiwgMywgb3IgNCkgKi8KKyAgIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAvKiBiaXRzIHBlciBwaXhlbCAoZGVwdGggKiBjaGFubmVscykgKi8KK30gcG5nX3Jvd19pbmZvOworCit0eXBlZGVmIHBuZ19yb3dfaW5mbyAqIHBuZ19yb3dfaW5mb3A7Cit0eXBlZGVmIHBuZ19yb3dfaW5mbyAqICogcG5nX3Jvd19pbmZvcHA7CisKKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb24gdHlwZXMgZm9yIHRoZSBJL08gZnVuY3Rpb25zIGFuZCBmb3IgdGhlIGZ1bmN0aW9ucworICogdGhhdCBhbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBJL08gZnVuY3Rpb25zIHdpdGggaGlzIG9yIGhlcgorICogb3duLiAgVGhlIHBuZ19lcnJvcl9wdHIgdHlwZSBzaG91bGQgbWF0Y2ggdGhhdCBvZiB1c2VyLXN1cHBsaWVkIHdhcm5pbmcKKyAqIGFuZCBlcnJvciBmdW5jdGlvbnMsIHdoaWxlIHRoZSBwbmdfcndfcHRyIHR5cGUgc2hvdWxkIG1hdGNoIHRoYXQgb2YgdGhlCisgKiB1c2VyIHJlYWQvd3JpdGUgZGF0YSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgdGhlICd3cml0ZScgZnVuY3Rpb24gbXVzdCBub3QKKyAqIG1vZGlmeSB0aGUgYnVmZmVyIGl0IGlzIHBhc3NlZC4gVGhlICdyZWFkJyBmdW5jdGlvbiwgb24gdGhlIG90aGVyIGhhbmQsIGlzCisgKiBleHBlY3RlZCB0byByZXR1cm4gdGhlIHJlYWQgZGF0YSBpbiB0aGUgYnVmZmVyLgorICovCit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX2Vycm9yX3B0ciwgKHBuZ19zdHJ1Y3RwLCBwbmdfY29uc3RfY2hhcnApKTsKK3R5cGVkZWYgUE5HX0NBTExCQUNLKHZvaWQsICpwbmdfcndfcHRyLCAocG5nX3N0cnVjdHAsIHBuZ19ieXRlcCwgcG5nX3NpemVfdCkpOwordHlwZWRlZiBQTkdfQ0FMTEJBQ0sodm9pZCwgKnBuZ19mbHVzaF9wdHIsIChwbmdfc3RydWN0cCkpOwordHlwZWRlZiBQTkdfQ0FMTEJBQ0sodm9pZCwgKnBuZ19yZWFkX3N0YXR1c19wdHIsIChwbmdfc3RydWN0cCwgcG5nX3VpbnRfMzIsCisgICAgaW50KSk7Cit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3dyaXRlX3N0YXR1c19wdHIsIChwbmdfc3RydWN0cCwgcG5nX3VpbnRfMzIsCisgICAgaW50KSk7CisKKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKK3R5cGVkZWYgUE5HX0NBTExCQUNLKHZvaWQsICpwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIsIChwbmdfc3RydWN0cCwgcG5nX2luZm9wKSk7Cit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIsIChwbmdfc3RydWN0cCwgcG5nX2luZm9wKSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2sgcmVjZWl2ZXMgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MgZm9yIHRoZQorICogcG5nX2J5dGVwIGRhdGEgb2YgdGhlIHJvdy4gIFdoZW4gdHJhbnNmb3JtaW5nIGFuIGludGVybGFjZWQgaW1hZ2UgdGhlCisgKiByb3cgbnVtYmVyIGlzIHRoZSByb3cgbnVtYmVyIHdpdGhpbiB0aGUgc3ViLWltYWdlIG9mIHRoZSBpbnRlcmxhY2UgcGFzcywgc28KKyAqIHRoZSB2YWx1ZSB3aWxsIGluY3JlYXNlIHRvIHRoZSBoZWlnaHQgb2YgdGhlIHN1Yi1pbWFnZSAobm90IHRoZSBmdWxsIGltYWdlKQorICogdGhlbiByZXNldCB0byAwIGZvciB0aGUgbmV4dCBwYXNzLgorICoKKyAqIFVzZSBQTkdfUk9XX0ZST01fUEFTU19ST1cocm93LCBwYXNzKSBhbmQgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKGNvbCwgcGFzcykgdG8KKyAqIGZpbmQgdGhlIG91dHB1dCBwaXhlbCAoeCx5KSBnaXZlbiBhbiBpbnRlcmxhY2VkIHN1Yi1pbWFnZSBwaXhlbAorICogKHJvdyxjb2wscGFzcykuICAoU2VlIGJlbG93IGZvciB0aGVzZSBtYWNyb3MuKQorICovCit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIsIChwbmdfc3RydWN0cCwgcG5nX2J5dGVwLAorICAgIHBuZ191aW50XzMyLCBpbnQpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCit0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciwgKHBuZ19zdHJ1Y3RwLCBwbmdfcm93X2luZm9wLAorICAgIHBuZ19ieXRlcCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECit0eXBlZGVmIFBOR19DQUxMQkFDSyhpbnQsICpwbmdfdXNlcl9jaHVua19wdHIsIChwbmdfc3RydWN0cCwKKyAgICBwbmdfdW5rbm93bl9jaHVua3ApKTsKKyNlbmRpZgorI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKy8qIG5vdCB1c2VkIGFueXdoZXJlICovCisvKiB0eXBlZGVmIFBOR19DQUxMQkFDSyh2b2lkLCAqcG5nX3Vua25vd25fY2h1bmtfcHRyLCAocG5nX3N0cnVjdHApKTsgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKy8qIFRoaXMgbXVzdCBtYXRjaCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiA8c2V0am1wLmg+LCBhbmQgdGhlIGFwcGxpY2F0aW9uCisgKiBtdXN0IGluY2x1ZGUgdGhpcyBiZWZvcmUgcG5nLmggdG8gb2J0YWluIHRoZSBkZWZpbml0aW9uIG9mIGptcF9idWYuICBUaGUKKyAqIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIFBOR19OT1JFVFVSTiwgYnV0IHRoaXMgaXMgbm90IGNoZWNrZWQuICBJZiB0aGUKKyAqIGZ1bmN0aW9uIGRvZXMgcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNyYXNoIHZpYSBhbiBhYm9ydCgpIG9yIHNpbWlsYXIKKyAqIHN5c3RlbSBsZXZlbCBjYWxsLgorICoKKyAqIElmIHlvdSBnZXQgYSB3YXJuaW5nIGhlcmUgd2hpbGUgYnVpbGRpbmcgdGhlIGxpYnJhcnkgeW91IG1heSBuZWVkIHRvIG1ha2UKKyAqIGNoYW5nZXMgdG8gZW5zdXJlIHRoYXQgcG5nbGliY29uZi5oIHJlY29yZHMgdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5CisgKiB5b3VyIGNvbXBpbGVyLiAgVGhpcyBtYXkgYmUgdmVyeSBkaWZmaWN1bHQgLSB0cnkgdXNpbmcgYSBkaWZmZXJlbnQgY29tcGlsZXIKKyAqIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IQorICovCitQTkdfRlVOQ1RJT04odm9pZCwgKFBOR0NBUEkgKnBuZ19sb25nam1wX3B0ciksIFBOR0FSRygoam1wX2J1ZiwgaW50KSksIHR5cGVkZWYpOworI2VuZGlmCisKKy8qIFRyYW5zZm9ybSBtYXNrcyBmb3IgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICAgMHgwMDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICAgMHgwMDAxICAgIC8qIHJlYWQgb25seSAqLworI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgIDB4MDAwMiAgICAvKiByZWFkIG9ubHkgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgICAweDAwMDQgICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgICAweDAwMDggICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgICAweDAwMTAgICAgLyogcmVhZCBvbmx5ICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICAgMHgwMDIwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICAgMHgwMDQwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICAgMHgwMDgwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICAgMHgwMTAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICAgMHgwMjAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICAgMHgwNDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSICAgMHgwODAwICAgIC8qIHdyaXRlIG9ubHkgKi8KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuMzQgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSIDB4MTAwMCAvKiB3cml0ZSBvbmx5ICovCisvKiBBZGRlZCB0byBsaWJwbmctMS40LjAgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiAgIDB4MjAwMCAgICAgIC8qIHJlYWQgb25seSAqLworLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fRVhQQU5EXzE2ICAgICAweDQwMDAgICAgICAvKiByZWFkIG9ubHkgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9TQ0FMRV8xNiAgICAgIDB4ODAwMCAgICAgIC8qIHJlYWQgb25seSAqLworCisvKiBGbGFncyBmb3IgTU5HIHN1cHBvcnRlZCBmZWF0dXJlcyAqLworI2RlZmluZSBQTkdfRkxBR19NTkdfRU1QVFlfUExURSAgICAgMHgwMQorI2RlZmluZSBQTkdfRkxBR19NTkdfRklMVEVSXzY0ICAgICAgMHgwNAorI2RlZmluZSBQTkdfQUxMX01OR19GRUFUVVJFUyAgICAgICAgMHgwNQorCisvKiBOT1RFOiBwcmlvciB0byAxLjUgdGhlc2UgZnVuY3Rpb25zIGhhZCBubyAnQVBJJyBzdHlsZSBkZWNsYXJhdGlvbiwKKyAqIHRoaXMgYWxsb3dlZCB0aGUgemxpYiBkZWZhdWx0IGZ1bmN0aW9ucyB0byBiZSB1c2VkIG9uIFdpbmRvd3MKKyAqIHBsYXRmb3Jtcy4gIEluIDEuNSB0aGUgemxpYiBkZWZhdWx0IG1hbGxvYyAod2hpY2gganVzdCBjYWxscyBtYWxsb2MgYW5kCisgKiBpZ25vcmVzIHRoZSBmaXJzdCBhcmd1bWVudCkgc2hvdWxkIGJlIGNvbXBsZXRlbHkgY29tcGF0aWJsZSB3aXRoIHRoZQorICogZm9sbG93aW5nLgorICovCit0eXBlZGVmIFBOR19DQUxMQkFDSyhwbmdfdm9pZHAsICpwbmdfbWFsbG9jX3B0ciwgKHBuZ19zdHJ1Y3RwLAorICAgIHBuZ19hbGxvY19zaXplX3QpKTsKK3R5cGVkZWYgUE5HX0NBTExCQUNLKHZvaWQsICpwbmdfZnJlZV9wdHIsIChwbmdfc3RydWN0cCwgcG5nX3ZvaWRwKSk7CisKKy8qIFNlY3Rpb24gMzogZXhwb3J0ZWQgZnVuY3Rpb25zCisgKiBIZXJlIGFyZSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgbW9zdCBjb21tb25seSB1c2VkLiAgVGhpcyBpcyBub3QKKyAqIHRoZSBwbGFjZSB0byBmaW5kIG91dCBob3cgdG8gdXNlIGxpYnBuZy4gIFNlZSBsaWJwbmctbWFudWFsLnR4dCBmb3IgdGhlCisgKiBmdWxsIGV4cGxhbmF0aW9uLCBzZWUgZXhhbXBsZS5jIGZvciB0aGUgc3VtbWFyeS4gIFRoaXMganVzdCBwcm92aWRlcworICogYSBzaW1wbGUgb25lIGxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIHVzZSBvZiBlYWNoIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBQTkdfRVhQT1JUKCkgYW5kIFBOR19FWFBPUlRBKCkgbWFjcm9zIHVzZWQgYmVsb3cgYXJlIGRlZmluZWQgaW4KKyAqIHBuZ2NvbmYuaCBhbmQgaW4gdGhlICouZGZuIGZpbGVzIGluIHRoZSBzY3JpcHRzIGRpcmVjdG9yeS4KKyAqCisgKiAgIFBOR19FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgKGFyZ3MpKTsKKyAqCisgKiAgICAgICBvcmRpbmFsOiAgICBvcmRpbmFsIHRoYXQgaXMgdXNlZCB3aGlsZSBidWlsZGluZworICogICAgICAgICAgICAgICAgICAgKi5kZWYgZmlsZXMuIFRoZSBvcmRpbmFsIHZhbHVlIGlzIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IHdoZW4gcHJlcHJvY2Vzc2luZyBwbmcuaCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB0aGUgKi5kZm4gZmlsZXMgZm9yIGJ1aWxkaW5nIHN5bWJvbCB0YWJsZQorICogICAgICAgICAgICAgICAgICAgZW50cmllcywgYW5kIGFyZSByZW1vdmVkIGJ5IHBuZ2NvbmYuaC4KKyAqICAgICAgIHR5cGU6ICAgICAgIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbgorICogICAgICAgbmFtZTogICAgICAgZnVuY3Rpb24gbmFtZQorICogICAgICAgYXJnczogICAgICAgZnVuY3Rpb24gYXJndW1lbnRzLCB3aXRoIHR5cGVzCisgKgorICogV2hlbiB3ZSB3aXNoIHRvIGFwcGVuZCBhdHRyaWJ1dGVzIHRvIGEgZnVuY3Rpb24gcHJvdG90eXBlIHdlIHVzZQorICogdGhlIFBOR19FWFBPUlRBKCkgbWFjcm8gaW5zdGVhZC4KKyAqCisgKiAgIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIChhcmdzKSwgYXR0cmlidXRlcyk7CisgKgorICogICAgICAgb3JkaW5hbCwgdHlwZSwgbmFtZSwgYW5kIGFyZ3M6IHNhbWUgYXMgaW4gUE5HX0VYUE9SVCgpLgorICogICAgICAgYXR0cmlidXRlczogZnVuY3Rpb24gYXR0cmlidXRlcworICovCisKKy8qIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5ICovCitQTkdfRVhQT1JUKDEsIHBuZ191aW50XzMyLCBwbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyLCAodm9pZCkpOworCisvKiBUZWxsIGxpYiB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgZmlyc3QgPG51bV9ieXRlcz4gbWFnaWMgYnl0ZXMuCisgKiBIYW5kbGluZyBtb3JlIHRoYW4gOCBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgaXMgYW4gZXJyb3IuCisgKi8KK1BOR19FWFBPUlQoMiwgdm9pZCwgcG5nX3NldF9zaWdfYnl0ZXMsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG51bV9ieXRlcykpOworCisvKiBDaGVjayBzaWdbc3RhcnRdIHRocm91Z2ggc2lnW3N0YXJ0ICsgbnVtX3RvX2NoZWNrIC0gMV0gdG8gc2VlIGlmIGl0J3MgYQorICogUE5HIGZpbGUuICBSZXR1cm5zIHplcm8gaWYgdGhlIHN1cHBsaWVkIGJ5dGVzIG1hdGNoIHRoZSA4LWJ5dGUgUE5HCisgKiBzaWduYXR1cmUsIGFuZCBub24temVybyBvdGhlcndpc2UuICBIYXZpbmcgbnVtX3RvX2NoZWNrID09IDAgb3IKKyAqIHN0YXJ0ID4gNyB3aWxsIGFsd2F5cyBmYWlsIChpZSByZXR1cm4gbm9uLXplcm8pLgorICovCitQTkdfRVhQT1JUKDMsIGludCwgcG5nX3NpZ19jbXAsIChwbmdfY29uc3RfYnl0ZXAgc2lnLCBwbmdfc2l6ZV90IHN0YXJ0LAorICAgIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKSk7CisKKy8qIFNpbXBsZSBzaWduYXR1cmUgY2hlY2tpbmcgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKKyAqIHBuZ19jaGVja19zaWcoc2lnLCBuKSA6PSAhcG5nX3NpZ19jbXAoc2lnLCAwLCBuKS4KKyAqLworI2RlZmluZSBwbmdfY2hlY2tfc2lnKHNpZywgbikgIXBuZ19zaWdfY21wKChzaWcpLCAwLCAobikpCisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBuZ19wdHIgc3RydWN0IGZvciByZWFkaW5nLCBhbmQgYW55IG90aGVyIG1lbW9yeS4gKi8KK1BOR19FWFBPUlRBKDQsIHBuZ19zdHJ1Y3RwLCBwbmdfY3JlYXRlX3JlYWRfc3RydWN0LAorICAgIChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAorICAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiksCisgICAgUE5HX0FMTE9DQVRFRCk7CisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBuZ19wdHIgc3RydWN0IGZvciB3cml0aW5nLCBhbmQgYW55IG90aGVyIG1lbW9yeSAqLworUE5HX0VYUE9SVEEoNSwgcG5nX3N0cnVjdHAsIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0LAorICAgIChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLAorICAgIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiksCisgICAgUE5HX0FMTE9DQVRFRCk7CisKK1BOR19FWFBPUlQoNiwgcG5nX3NpemVfdCwgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKworUE5HX0VYUE9SVCg3LCB2b2lkLCBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3NpemVfdCBzaXplKSk7CisKKy8qIE1vdmVkIGZyb20gcG5nY29uZi5oIGluIDEuNC4wIGFuZCBtb2RpZmllZCB0byBlbnN1cmUgc2V0am1wL2xvbmdqbXAKKyAqIG1hdGNoIHVwLgorICovCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgam1wX2J1ZiBidWlsdCBpbiB0byAqcG5nX3B0ci4gIEl0IG11c3QgYmUKKyAqIHN1cHBsaWVkIHdpdGggYW4gYXBwcm9wcmlhdGUgJ2xvbmdqbXAnIGZ1bmN0aW9uIHRvIHVzZSBvbiB0aGF0IGptcF9idWYKKyAqIHVubGVzcyB0aGUgZGVmYXVsdCBlcnJvciBmdW5jdGlvbiBpcyBvdmVycmlkZGVuIGluIHdoaWNoIGNhc2UgTlVMTCBpcworICogYWNjZXB0YWJsZS4gIFRoZSBzaXplIG9mIHRoZSBqbXBfYnVmIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgYWN0dWFsIHNpemUKKyAqIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeSAtIHRoZSBjYWxsIHdpbGwgcmV0dXJuIE5VTEwgb24gYSBtaXNtYXRjaAorICogaW5kaWNhdGluZyBhbiBBQkkgbWlzbWF0Y2guCisgKi8KK1BOR19FWFBPUlQoOCwgam1wX2J1ZiosIHBuZ19zZXRfbG9uZ2ptcF9mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19sb25nam1wX3B0ciBsb25nam1wX2ZuLCBzaXplX3Qgam1wX2J1Zl9zaXplKSk7CisjICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSBcCisgICAgICAoKnBuZ19zZXRfbG9uZ2ptcF9mbigocG5nX3B0ciksIGxvbmdqbXAsIChzaXplb2YgKGptcF9idWYpKSkpCisjZWxzZQorIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgXAorICAgICAgKExJQlBOR19XQVNfQ09NUElMRURfV0lUSF9fUE5HX05PX1NFVEpNUCkKKyNlbmRpZgorLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBieSBsaWJwbmcgYXBwbGljYXRpb25zIGluIHBsYWNlIG9mCisgKiBsb25nam1wKHBuZ19wdHItPmptcGJ1ZiwgdmFsKS4gIElmIGxvbmdqbXBfZm4oKSBoYXMgYmVlbiBzZXQsIGl0CisgKiB3aWxsIHVzZSBpdDsgb3RoZXJ3aXNlIGl0IHdpbGwgY2FsbCBQTkdfQUJPUlQoKS4gIFRoaXMgZnVuY3Rpb24gd2FzCisgKiBhZGRlZCBpbiBsaWJwbmctMS41LjAuCisgKi8KK1BOR19FWFBPUlRBKDksIHZvaWQsIHBuZ19sb25nam1wLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIGludCB2YWwpLAorICAgIFBOR19OT1JFVFVSTik7CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIFJlc2V0IHRoZSBjb21wcmVzc2lvbiBzdHJlYW0gKi8KK1BOR19FWFBPUlRBKDEwLCBpbnQsIHBuZ19yZXNldF96c3RyZWFtLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpLCBQTkdfREVQUkVDQVRFRCk7CisjZW5kaWYKKworLyogTmV3IGZ1bmN0aW9ucyBhZGRlZCBpbiBsaWJwbmctMS4wLjIgKG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgdW50aWwgMS4yLjApICovCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorUE5HX0VYUE9SVEEoMTEsIHBuZ19zdHJ1Y3RwLCBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIsCisgICAgKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sCisgICAgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuLAorICAgIHBuZ192b2lkcCBtZW1fcHRyLCBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKSwKKyAgICBQTkdfQUxMT0NBVEVEKTsKK1BOR19FWFBPUlRBKDEyLCBwbmdfc3RydWN0cCwgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiwKKyAgICAocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwKKyAgICBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sCisgICAgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLAorICAgIFBOR19BTExPQ0FURUQpOworI2VuZGlmCisKKy8qIFdyaXRlIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICovCitQTkdfRVhQT1JUKDEzLCB2b2lkLCBwbmdfd3JpdGVfc2lnLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKworLyogV3JpdGUgYSBQTkcgY2h1bmsgLSBzaXplLCB0eXBlLCAob3B0aW9uYWwpIGRhdGEsIENSQy4gKi8KK1BOR19FWFBPUlQoMTQsIHZvaWQsIHBuZ193cml0ZV9jaHVuaywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfYnl0ZXAKKyAgICBjaHVua19uYW1lLCBwbmdfY29uc3RfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKKworLyogV3JpdGUgdGhlIHN0YXJ0IG9mIGEgUE5HIGNodW5rIC0gbGVuZ3RoIGFuZCBjaHVuayBuYW1lLiAqLworUE5HX0VYUE9SVCgxNSwgdm9pZCwgcG5nX3dyaXRlX2NodW5rX3N0YXJ0LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2J5dGVwIGNodW5rX25hbWUsIHBuZ191aW50XzMyIGxlbmd0aCkpOworCisvKiBXcml0ZSB0aGUgZGF0YSBvZiBhIFBORyBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkuICovCitQTkdfRVhQT1JUKDE2LCB2b2lkLCBwbmdfd3JpdGVfY2h1bmtfZGF0YSwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkpOworCisvKiBGaW5pc2ggYSBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkgKGluY2x1ZGVzIENSQykuICovCitQTkdfRVhQT1JUKDE3LCB2b2lkLCBwbmdfd3JpdGVfY2h1bmtfZW5kLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKworLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGluZm8gc3RydWN0dXJlICovCitQTkdfRVhQT1JUQSgxOCwgcG5nX2luZm9wLCBwbmdfY3JlYXRlX2luZm9fc3RydWN0LCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpLAorICAgIFBOR19BTExPQ0FURUQpOworCisvKiBERVBSRUNBVEVEOiB0aGlzIGZ1bmN0aW9uIGFsbG93ZWQgaW5pdCBzdHJ1Y3R1cmVzIHRvIGJlIGNyZWF0ZWQgdXNpbmcgdGhlCisgKiBkZWZhdWx0IGFsbG9jYXRpb24gbWV0aG9kICh0eXBpY2FsbHkgbWFsbG9jKS4gIFVzZSBpcyBkZXByZWNhdGVkIGluIDEuNi4wIGFuZAorICogdGhlIEFQSSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAqLworUE5HX0VYUE9SVEEoMTksIHZvaWQsIHBuZ19pbmZvX2luaXRfMywgKHBuZ19pbmZvcHAgaW5mb19wdHIsCisgICAgcG5nX3NpemVfdCBwbmdfaW5mb19zdHJ1Y3Rfc2l6ZSksIFBOR19ERVBSRUNBVEVEKTsKKworLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgaW1hZ2UuICovCitQTkdfRVhQT1JUKDIwLCB2b2lkLCBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSwKKyAgICAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKK1BOR19FWFBPUlQoMjEsIHZvaWQsIHBuZ193cml0ZV9pbmZvLAorICAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICovCitQTkdfRVhQT1JUKDIyLCB2b2lkLCBwbmdfcmVhZF9pbmZvLAorICAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorICAgLyogQ29udmVydCB0byBhIFVTIHN0cmluZyBmb3JtYXQ6IHRoZXJlIGlzIG5vIGxvY2FsaXphdGlvbiBzdXBwb3J0IGluIHRoaXMKKyAgICAqIHJvdXRpbmUuICBUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gdXNlZCBhIDI5IGNoYXJhY3RlciBidWZmZXIgaW4KKyAgICAqIHBuZ19zdHJ1Y3QsIHRoaXMgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4KKyAgICAqLworI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKKy8qIFRvIGRvOiByZW1vdmUgdGhpcyBmcm9tIGxpYnBuZzE3IChhbmQgZnJvbSBsaWJwbmcxNy9wbmcuYyBhbmQgcG5nc3RydWN0LmgpICovCitQTkdfRVhQT1JUQSgyMywgcG5nX2NvbnN0X2NoYXJwLCBwbmdfY29udmVydF90b19yZmMxMTIzLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X3RpbWVwIHB0aW1lKSxQTkdfREVQUkVDQVRFRCk7CisjZW5kaWYKK1BOR19FWFBPUlQoMjQxLCBpbnQsIHBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyLCAoY2hhciBvdXRbMjldLAorICAgIHBuZ19jb25zdF90aW1lcCBwdGltZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAorLyogQ29udmVydCBmcm9tIGEgc3RydWN0IHRtIHRvIHBuZ190aW1lICovCitQTkdfRVhQT1JUKDI0LCB2b2lkLCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSwgKHBuZ190aW1lcCBwdGltZSwKKyAgICBjb25zdCBzdHJ1Y3QgdG0gKiB0dGltZSkpOworCisvKiBDb252ZXJ0IGZyb20gdGltZV90IHRvIHBuZ190aW1lLiAgVXNlcyBnbXRpbWUoKSAqLworUE5HX0VYUE9SVCgyNSwgdm9pZCwgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QsIChwbmdfdGltZXAgcHRpbWUsIHRpbWVfdCB0dGltZSkpOworI2VuZGlmIC8qIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisvKiBFeHBhbmQgZGF0YSB0byAyNC1iaXQgUkdCLCBvciA4LWJpdCBncmF5c2NhbGUsIHdpdGggYWxwaGEgaWYgYXZhaWxhYmxlLiAqLworUE5HX0VYUE9SVCgyNiwgdm9pZCwgcG5nX3NldF9leHBhbmQsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworUE5HX0VYUE9SVCgyNywgdm9pZCwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMjgsIHZvaWQsIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworUE5HX0VYUE9SVCgyOSwgdm9pZCwgcG5nX3NldF90Uk5TX3RvX2FscGhhLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAorLyogRXhwYW5kIHRvIDE2LWJpdCBjaGFubmVscywgZm9yY2VzIGNvbnZlcnNpb24gb2YgcGFsZXR0ZSB0byBSR0IgYW5kIGV4cGFuc2lvbgorICogb2YgYSB0Uk5TIGNodW5rIGlmIHByZXNlbnQuCisgKi8KK1BOR19FWFBPUlQoMjIxLCB2b2lkLCBwbmdfc2V0X2V4cGFuZF8xNiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkKKy8qIFVzZSBibHVlLCBncmVlbiwgcmVkIG9yZGVyIGZvciBwaXhlbHMuICovCitQTkdfRVhQT1JUKDMwLCB2b2lkLCBwbmdfc2V0X2JnciwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorLyogRXhwYW5kIHRoZSBncmF5c2NhbGUgdG8gMjQtYml0IFJHQiBpZiBuZWNlc3NhcnkuICovCitQTkdfRVhQT1JUKDMxLCB2b2lkLCBwbmdfc2V0X2dyYXlfdG9fcmdiLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisvKiBSZWR1Y2UgUkdCIHRvIGdyYXlzY2FsZS4gKi8KKyNkZWZpbmUgUE5HX0VSUk9SX0FDVElPTl9OT05FICAxCisjZGVmaW5lIFBOR19FUlJPUl9BQ1RJT05fV0FSTiAgMgorI2RlZmluZSBQTkdfRVJST1JfQUNUSU9OX0VSUk9SIDMKKyNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX0RFRkFVTFQgKC0xKS8qZm9yIHJlZC9ncmVlbiBjb2VmZmljaWVudHMqLworCitQTkdfRlBfRVhQT1JUKDMyLCB2b2lkLCBwbmdfc2V0X3JnYl90b19ncmF5LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IGVycm9yX2FjdGlvbiwgZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuKSkKK1BOR19GSVhFRF9FWFBPUlQoMzMsIHZvaWQsIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgZXJyb3JfYWN0aW9uLCBwbmdfZml4ZWRfcG9pbnQgcmVkLCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW4pKQorCitQTkdfRVhQT1JUKDM0LCBwbmdfYnl0ZSwgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMsIChwbmdfY29uc3Rfc3RydWN0cnAKKyAgICBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19CVUlMRF9HUkFZU0NBTEVfUEFMRVRURV9TVVBQT1JURUQKK1BOR19FWFBPUlQoMzUsIHZvaWQsIHBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSwgKGludCBiaXRfZGVwdGgsCisgICAgcG5nX2NvbG9ycCBwYWxldHRlKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECisvKiBIb3cgdGhlIGFscGhhIGNoYW5uZWwgaXMgaW50ZXJwcmV0ZWQgLSB0aGlzIGFmZmVjdHMgaG93IHRoZSBjb2xvciBjaGFubmVscyBvZgorICogYSBQTkcgZmlsZSBhcmUgcmV0dXJuZWQgd2hlbiBhbiBhbHBoYSBjaGFubmVsLCBvciB0Uk5TIGNodW5rIGluIGEgcGFsZXR0ZQorICogZmlsZSwgaXMgcHJlc2VudC4KKyAqCisgKiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIHdheSBwaXhlbHMgYXJlIHdyaXR0ZW4gaW50byBhIFBORyBvdXRwdXQKKyAqIGRhdGFzdHJlYW0uIFRoZSBjb2xvciBzYW1wbGVzIGluIGEgUE5HIGRhdGFzdHJlYW0gYXJlIG5ldmVyIHByZW11bHRpcGxpZWQKKyAqIHdpdGggdGhlIGFscGhhIHNhbXBsZXMuCisgKgorICogVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbjogdGhlIGFscGhhCisgKiBjaGFubmVsIGlzIGEgbGluZWFyIG1lYXN1cmUgb2YgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgcGl4ZWwgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGNvbXBvc2l0ZWQgcGl4ZWwuICBUaGUgZ2FtbWEgZW5jb2RlZCBjb2xvciBjaGFubmVscyBtdXN0IGJlCisgKiBzY2FsZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250cmlidXRpb24gYW5kIHRvIGRvIHRoaXMgaXQgaXMgbmVjZXNzYXJ5IHRvIHVuZG8KKyAqIHRoZSBlbmNvZGluZywgc2NhbGUgdGhlIGNvbG9yIHZhbHVlcywgcGVyZm9ybSB0aGUgY29tcG9zaXRpb24gYW5kIHJlZW5jb2RlCisgKiB0aGUgdmFsdWVzLiAgVGhpcyBpcyB0aGUgJ1BORycgbW9kZS4KKyAqCisgKiBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gJ2Fzc29jaWF0ZScgdGhlIGFscGhhIHdpdGggdGhlIGNvbG9yIGluZm9ybWF0aW9uIGJ5CisgKiBzdG9yaW5nIGNvbG9yIGNoYW5uZWwgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHNjYWxlZCBieSB0aGUgYWxwaGEuICBUaGUKKyAqIGFkdmFudGFnZSBpcyB0aGF0IHRoZSBjb2xvciBjaGFubmVscyBjYW4gYmUgcmVzYW1wbGVkICh0aGUgaW1hZ2UgY2FuIGJlCisgKiBzY2FsZWQpIGluIHRoaXMgZm9ybS4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBub3JtYWwgcHJhY3RpY2UgaXMgdG8gc3RvcmUKKyAqIGxpbmVhciwgbm90IChnYW1tYSkgZW5jb2RlZCwgdmFsdWVzIGFuZCB0aGlzIHJlcXVpcmVzIDE2LWJpdCBjaGFubmVscyBmb3IKKyAqIHN0aWxsIGltYWdlcyByYXRoZXIgdGhhbiB0aGUgOC1iaXQgY2hhbm5lbHMgdGhhdCBhcmUganVzdCBhYm91dCBzdWZmaWNpZW50IGlmCisgKiBnYW1tYSBlbmNvZGluZyBpcyB1c2VkLiAgSW4gYWRkaXRpb24gYWxsIG5vbi10cmFuc3BhcmVudCBwaXhlbCB2YWx1ZXMsCisgKiBpbmNsdWRpbmcgY29tcGxldGVseSBvcGFxdWUgb25lcywgbXVzdCBiZSBnYW1tYSBlbmNvZGVkIHRvIHByb2R1Y2UgdGhlIGZpbmFsCisgKiBpbWFnZS4gIFRoaXMgaXMgdGhlICdTVEFOREFSRCcsICdBU1NPQ0lBVEVEJyBvciAnUFJFTVVMVElQTElFRCcgbW9kZSAodGhlCisgKiBsYXR0ZXIgYmVpbmcgdGhlIHR3byBjb21tb24gbmFtZXMgZm9yIGFzc29jaWF0ZWQgYWxwaGEgY29sb3IgY2hhbm5lbHMuKQorICoKKyAqIFNpbmNlIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhcml0aG1ldGljIG9uIG9wYXF1ZSBjb2xvciB2YWx1ZXMgc28KKyAqIGxvbmcgYXMgdGhleSBhcmUgbm90IHRvIGJlIHJlc2FtcGxlZCBhbmQgYXJlIGluIHRoZSBmaW5hbCBjb2xvciBzcGFjZSBpdCBpcworICogcG9zc2libGUgdG8gb3B0aW1pemUgdGhlIGhhbmRsaW5nIG9mIGFscGhhIGJ5IHN0b3JpbmcgdGhlIG9wYXF1ZSBwaXhlbHMgaW4KKyAqIHRoZSBQTkcgZm9ybWF0IChhZGp1c3RlZCBmb3IgdGhlIG91dHB1dCBjb2xvciBzcGFjZSkgd2hpbGUgc3RvcmluZyBwYXJ0aWFsbHkKKyAqIG9wYXF1ZSBwaXhlbHMgaW4gdGhlIHN0YW5kYXJkLCBsaW5lYXIsIGZvcm1hdC4gIFRoZSBhY2N1cmFjeSByZXF1aXJlZCBmb3IKKyAqIHN0YW5kYXJkIGFscGhhIGNvbXBvc2l0aW9uIGlzIHJlbGF0aXZlbHkgbG93LCBiZWNhdXNlIHRoZSBwaXhlbHMgYXJlCisgKiBpc29sYXRlZCwgdGhlcmVmb3JlIHR5cGljYWxseSB0aGUgYWNjdXJhY3kgbG9zcyBpbiBzdG9yaW5nIDgtYml0IGxpbmVhcgorICogdmFsdWVzIGlzIGFjY2VwdGFibGUuICAoVGhpcyBpcyBub3QgdHJ1ZSBpZiB0aGUgYWxwaGEgY2hhbm5lbCBpcyB1c2VkIHRvCisgKiBzaW11bGF0ZSB0cmFuc3BhcmVuY3kgb3ZlciBsYXJnZSBhcmVhcyAtIHVzZSAxNiBiaXRzIG9yIHRoZSBQTkcgbW9kZSBpbgorICogdGhpcyBjYXNlISkgIFRoaXMgaXMgdGhlICdPUFRJTUlaRUQnIG1vZGUuICBGb3IgdGhpcyBtb2RlIGEgcGl4ZWwgaXMKKyAqIHRyZWF0ZWQgYXMgb3BhcXVlIG9ubHkgaWYgdGhlIGFscGhhIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZhbHVlLgorICoKKyAqIFRoZSBmaW5hbCBjaG9pY2UgaXMgdG8gZ2FtbWEgZW5jb2RlIHRoZSBhbHBoYSBjaGFubmVsIGFzIHdlbGwuICBUaGlzIGlzCisgKiBicm9rZW4gYmVjYXVzZSwgaW4gcHJhY3RpY2UsIG5vIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGlzIGNob2ljZQorICogY29ycmVjdGx5IHVuZG9lcyB0aGUgZW5jb2RpbmcgYmVmb3JlIGhhbmRsaW5nIGFscGhhIGNvbXBvc2l0aW9uLiAgVXNlIHRoaXMKKyAqIGNob2ljZSBvbmx5IGlmIG90aGVyIHNlcmlvdXMgZXJyb3JzIGluIHRoZSBzb2Z0d2FyZSBvciBoYXJkd2FyZSB5b3UgdXNlCisgKiBtYW5kYXRlIGl0OyB0aGUgdHlwaWNhbCBzZXJpb3VzIGVycm9yIGlzIGZvciBkYXJrIGhhbG9zIHRvIGFwcGVhciBhcm91bmQKKyAqIG9wYXF1ZSBhcmVhcyBvZiB0aGUgY29tcG9zaXRlZCBQTkcgaW1hZ2UgYmVjYXVzZSBvZiBhcml0aG1ldGljIG92ZXJmbG93LgorICoKKyAqIFRoZSBBUEkgZnVuY3Rpb24gcG5nX3NldF9hbHBoYV9tb2RlIHNwZWNpZmllcyB3aGljaCBvZiB0aGVzZSBjaG9pY2VzIHRvIHVzZQorICogd2l0aCBhbiBlbnVtZXJhdGVkICdtb2RlJyB2YWx1ZSBhbmQgdGhlIGdhbW1hIG9mIHRoZSByZXF1aXJlZCBvdXRwdXQ6CisgKi8KKyNkZWZpbmUgUE5HX0FMUEhBX1BORyAgICAgICAgICAgMCAvKiBhY2NvcmRpbmcgdG8gdGhlIFBORyBzdGFuZGFyZCAqLworI2RlZmluZSBQTkdfQUxQSEFfU1RBTkRBUkQgICAgICAxIC8qIGFjY29yZGluZyB0byBQb3J0ZXIvRHVmZiAqLworI2RlZmluZSBQTkdfQUxQSEFfQVNTT0NJQVRFRCAgICAxIC8qIGFzIGFib3ZlOyB0aGlzIGlzIHRoZSBub3JtYWwgcHJhY3RpY2UgKi8KKyNkZWZpbmUgUE5HX0FMUEhBX1BSRU1VTFRJUExJRUQgMSAvKiBhcyBhYm92ZSAqLworI2RlZmluZSBQTkdfQUxQSEFfT1BUSU1JWkVEICAgICAyIC8qICdQTkcnIGZvciBvcGFxdWUgcGl4ZWxzLCBlbHNlICdTVEFOREFSRCcgKi8KKyNkZWZpbmUgUE5HX0FMUEhBX0JST0tFTiAgICAgICAgMyAvKiB0aGUgYWxwaGEgY2hhbm5lbCBpcyBnYW1tYSBlbmNvZGVkICovCisKK1BOR19GUF9FWFBPUlQoMjI3LCB2b2lkLCBwbmdfc2V0X2FscGhhX21vZGUsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG1vZGUsCisgICAgZG91YmxlIG91dHB1dF9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDIyOCwgdm9pZCwgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IG1vZGUsIHBuZ19maXhlZF9wb2ludCBvdXRwdXRfZ2FtbWEpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpCisvKiBUaGUgb3V0cHV0X2dhbW1hIHZhbHVlIGlzIGEgc2NyZWVuIGdhbW1hIGluIGxpYnBuZyB0ZXJtaW5vbG9neTogaXQgZXhwcmVzc2VzCisgKiBob3cgdG8gZGVjb2RlIHRoZSBvdXRwdXQgdmFsdWVzLCBub3QgaG93IHRoZXkgYXJlIGVuY29kZWQuICBUaGUgdmFsdWVzIHVzZWQKKyAqIGNvcnJlc3BvbmQgdG8gdGhlIG5vcm1hbCBudW1iZXJzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIG92ZXJhbGwgZ2FtbWEgb2YgYQorICogY29tcHV0ZXIgZGlzcGxheSBzeXN0ZW07IGZvciBleGFtcGxlIDIuMiBmb3IgYW4gc1JHQiBjb25mb3JtYW50IHN5c3RlbS4gIFRoZQorICogdmFsdWVzIGFyZSBzY2FsZWQgYnkgMTAwMDAwIGluIHRoZSBfZml4ZWQgdmVyc2lvbiBvZiB0aGUgQVBJIChzbyAyMjAwMDAgZm9yCisgKiBzUkdCLikKKyAqCisgKiBUaGUgaW52ZXJzZSBvZiB0aGUgdmFsdWUgaXMgYWx3YXlzIHVzZWQgdG8gcHJvdmlkZSBhIGRlZmF1bHQgZm9yIHRoZSBQTkcgZmlsZQorICogZW5jb2RpbmcgaWYgaXQgaGFzIG5vIGdBTUEgY2h1bmsgYW5kIGlmIHBuZ19zZXRfZ2FtbWEoKSBoYXMgbm90IGJlZW4gY2FsbGVkCisgKiB0byBvdmVycmlkZSB0aGUgUE5HIGdhbW1hIGluZm9ybWF0aW9uLgorICoKKyAqIFdoZW4gdGhlIEFMUEhBX09QVElNSVpFRCBtb2RlIGlzIHNlbGVjdGVkIHRoZSBvdXRwdXQgZ2FtbWEgaXMgdXNlZCB0byBlbmNvZGUKKyAqIG9wYXF1ZSBwaXhlbHMgaG93ZXZlciBwaXhlbHMgd2l0aCBsb3dlciBhbHBoYSB2YWx1ZXMgYXJlIG5vdCBlbmNvZGVkLAorICogcmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGdhbW1hIHNldHRpbmcuCisgKgorICogV2hlbiB0aGUgc3RhbmRhcmQgUG9ydGVyIER1ZmYgaGFuZGxpbmcgaXMgcmVxdWVzdGVkIHdpdGggbW9kZSAxIHRoZSBvdXRwdXQKKyAqIGVuY29kaW5nIGlzIHNldCB0byBiZSBsaW5lYXIgYW5kIHRoZSBvdXRwdXRfZ2FtbWEgdmFsdWUgaXMgb25seSByZWxldmFudAorICogYXMgYSBkZWZhdWx0IGZvciBpbnB1dCBkYXRhIHRoYXQgaGFzIG5vIGdhbW1hIGluZm9ybWF0aW9uLiAgVGhlIGxpbmVhciBvdXRwdXQKKyAqIGVuY29kaW5nIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBwbmdfc2V0X2dhbW1hKCkgaXMgY2FsbGVkIC0gdGhlIHJlc3VsdHMgbWF5IGJlCisgKiBoaWdobHkgdW5leHBlY3RlZCEKKyAqCisgKiBUaGUgZm9sbG93aW5nIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgc1JHQiBzdGFuZGFyZCBhbmQgdGhlIHJlc2VhcmNoCisgKiBiZWhpbmQgaXQuICBzUkdCIGlzIGRlZmluZWQgdG8gYmUgYXBwcm94aW1hdGVkIGJ5IGEgUE5HIGdBTUEgY2h1bmsgdmFsdWUgb2YKKyAqIDAuNDU0NTUgKDEvMi4yKSBmb3IgUE5HLiAgVGhlIHZhbHVlIGltcGxpY2l0bHkgaW5jbHVkZXMgYW55IHZpZXdpbmcKKyAqIGNvcnJlY3Rpb24gcmVxdWlyZWQgdG8gdGFrZSBhY2NvdW50IG9mIGFueSBkaWZmZXJlbmNlcyBpbiB0aGUgY29sb3IKKyAqIGVudmlyb25tZW50IG9mIHRoZSBvcmlnaW5hbCBzY2VuZSBhbmQgdGhlIGludGVuZGVkIGRpc3BsYXkgZW52aXJvbm1lbnQ7IHRoZQorICogdmFsdWUgZXhwcmVzc2VzIGhvdyB0byAqZGVjb2RlKiB0aGUgaW1hZ2UgZm9yIGRpc3BsYXksIG5vdCBob3cgdGhlIG9yaWdpbmFsCisgKiBkYXRhIHdhcyAqZW5jb2RlZCouCisgKgorICogc1JHQiBwcm92aWRlcyBhIHBlZyBmb3IgdGhlIFBORyBzdGFuZGFyZCBieSBkZWZpbmluZyBhIHZpZXdpbmcgZW52aXJvbm1lbnQuCisgKiBzUkdCIGl0c2VsZiwgYW5kIGVhcmxpZXIgVFYgc3RhbmRhcmRzLCBhY3R1YWxseSB1c2UgYSBtb3JlIGNvbXBsZXggdHJhbnNmb3JtCisgKiAoYSBsaW5lYXIgcG9ydGlvbiB0aGVuIGEgZ2FtbWEgMi40IHBvd2VyIGxhdykgdGhhbiBQTkcgY2FuIGV4cHJlc3MuICAoUE5HIGlzCisgKiBsaW1pdGVkIHRvIHNpbXBsZSBwb3dlciBsYXdzLikgIEJ5IHNheWluZyB0aGF0IGFuIGltYWdlIGZvciBkaXJlY3QgZGlzcGxheSBvbgorICogYW4gc1JHQiBjb25mb3JtYW50IHN5c3RlbSBzaG91bGQgYmUgc3RvcmVkIHdpdGggYSBnQU1BIGNodW5rIHZhbHVlIG9mIDQ1NDU1CisgKiAoMTEuMy4zLjIgYW5kIDExLjMuMy41IG9mIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24pIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgorICogbWFrZXMgaXQgcG9zc2libGUgdG8gZGVyaXZlIHZhbHVlcyBmb3Igb3RoZXIgZGlzcGxheSBzeXN0ZW1zIGFuZAorICogZW52aXJvbm1lbnRzLgorICoKKyAqIFRoZSBNYWMgdmFsdWUgaXMgZGVkdWNlZCBmcm9tIHRoZSBzUkdCIGJhc2VkIG9uIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUgYWN0dWFsCisgKiBleHRyYSB2aWV3aW5nIGNvcnJlY3Rpb24gdXNlZCBpbiBlYXJseSBNYWMgZGlzcGxheSBzeXN0ZW1zIHdhcyBpbXBsZW1lbnRlZCBhcworICogYSBwb3dlciAxLjQ1IGxvb2t1cCB0YWJsZS4KKyAqCisgKiBBbnkgc3lzdGVtIHdoZXJlIGEgcHJvZ3JhbW1hYmxlIGxvb2t1cCB0YWJsZSBpcyB1c2VkIG9yIHdoZXJlIHRoZSBiZWhhdmlvciBvZgorICogdGhlIGZpbmFsIGRpc3BsYXkgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBjYW4gYmUgY2hhbmdlZCByZXF1aXJlcyBzeXN0ZW0KKyAqIHNwZWNpZmljIGNvZGUgdG8gb2J0YWluIHRoZSBjdXJyZW50IGNoYXJhY3RlcmlzdGljLiAgSG93ZXZlciB0aGlzIGNhbiBiZQorICogZGlmZmljdWx0IGFuZCBtb3N0IFBORyBnYW1tYSBjb3JyZWN0aW9uIG9ubHkgcmVxdWlyZXMgYW4gYXBwcm94aW1hdGUgdmFsdWUuCisgKgorICogQnkgZGVmYXVsdCwgaWYgcG5nX3NldF9hbHBoYV9tb2RlKCkgaXMgbm90IGNhbGxlZCwgbGlicG5nIGFzc3VtZXMgdGhhdCBhbGwKKyAqIHZhbHVlcyBhcmUgdW5lbmNvZGVkLCBsaW5lYXIsIHZhbHVlcyBhbmQgdGhhdCB0aGUgb3V0cHV0IGRldmljZSBhbHNvIGhhcyBhCisgKiBsaW5lYXIgY2hhcmFjdGVyaXN0aWMuICBUaGlzIGlzIG9ubHkgdmVyeSByYXJlbHkgY29ycmVjdCAtIGl0IGlzIGludmFyaWFibHkKKyAqIGJldHRlciB0byBjYWxsIHBuZ19zZXRfYWxwaGFfbW9kZSgpIHdpdGggUE5HX0RFRkFVTFRfc1JHQiB0aGFuIHJlbHkgb24gdGhlCisgKiBkZWZhdWx0IGlmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0IGFuc3dlciBpcyEKKyAqCisgKiBUaGUgc3BlY2lhbCB2YWx1ZSBQTkdfR0FNTUFfTUFDXzE4IGluZGljYXRlcyBhbiBvbGRlciBNYWMgc3lzdGVtIChwcmUgTWFjIE9TCisgKiAxMC42KSB3aGljaCB1c2VkIGEgY29ycmVjdGlvbiB0YWJsZSB0byBpbXBsZW1lbnQgYSBzb21ld2hhdCBsb3dlciBnYW1tYSBvbiBhbgorICogb3RoZXJ3aXNlIHNSR0Igc3lzdGVtLgorICoKKyAqIEJvdGggdGhlc2UgdmFsdWVzIGFyZSByZXNlcnZlZCAobm90IHNpbXBsZSBnYW1tYSB2YWx1ZXMpIGluIG9yZGVyIHRvIGFsbG93CisgKiBtb3JlIHByZWNpc2UgY29ycmVjdGlvbiBpbnRlcm5hbGx5IGluIHRoZSBmdXR1cmUuCisgKgorICogTk9URTogdGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuIGJlIHBhc3NlZCB0byBlaXRoZXIgdGhlIGZpeGVkIG9yIGZsb2F0aW5nCisgKiBwb2ludCBBUElzLCBidXQgdGhlIGZsb2F0aW5nIHBvaW50IEFQSSB3aWxsIGFsc28gYWNjZXB0IGZsb2F0aW5nIHBvaW50CisgKiB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgUE5HX0RFRkFVTFRfc1JHQiAtMSAgICAgICAvKiBzUkdCIGdhbW1hIGFuZCBjb2xvciBzcGFjZSAqLworI2RlZmluZSBQTkdfR0FNTUFfTUFDXzE4IC0yICAgICAgIC8qIE9sZCBNYWMgJzEuOCcgZ2FtbWEgYW5kIGNvbG9yIHNwYWNlICovCisjZGVmaW5lIFBOR19HQU1NQV9zUkdCICAgMjIwMDAwICAgLyogVGVsZXZpc2lvbiBzdGFuZGFyZHMtLW1hdGNoZXMgc1JHQiBnYW1tYSAqLworI2RlZmluZSBQTkdfR0FNTUFfTElORUFSIFBOR19GUF8xIC8qIExpbmVhciAqLworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGNhbGxzIHRvIHBuZ19zZXRfYWxwaGFfbW9kZSB0byBhY2hpZXZlIHRoZQorICogcmVxdWlyZWQgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIGFuZCwgd2hlcmUgbmVjZXNzYXJ5LCBhbHBoYQorICogcHJlbXVsdGlwbGljYXRpb24uCisgKgorICogcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfUE5HLCBQTkdfREVGQVVMVF9zUkdCKTsKKyAqICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgbGlicG5nIGhhbmRsaW5nIG9mIHRoZSBhbHBoYSBjaGFubmVsIC0gaXQgaXMgbm90CisgKiAgICBwcmUtbXVsdGlwbGllZCBpbnRvIHRoZSBjb2xvciBjb21wb25lbnRzLiAgSW4gYWRkaXRpb24gdGhlIGNhbGwgc3RhdGVzCisgKiAgICB0aGF0IHRoZSBvdXRwdXQgaXMgZm9yIGEgc1JHQiBzeXN0ZW0gYW5kIGNhdXNlcyBhbGwgUE5HIGZpbGVzIHdpdGhvdXQgZ0FNQQorICogICAgY2h1bmtzIHRvIGJlIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCB1c2luZyBzUkdCLgorICoKKyAqIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX01BQyk7CisgKiAgICBJbiB0aGlzIGNhc2UgdGhlIG91dHB1dCBpcyBhc3N1bWVkIHRvIGJlIHNvbWV0aGluZyBsaWtlIGFuIHNSR0IgY29uZm9ybWFudAorICogICAgZGlzcGxheSBwcmVjZWVkZWQgYnkgYSBwb3dlci1sYXcgbG9va3VwIHRhYmxlIG9mIHBvd2VyIDEuNDUuICBUaGlzIGlzIGhvdworICogICAgZWFybHkgTWFjIHN5c3RlbXMgYmVoYXZlZC4KKyAqCisgKiBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9TVEFOREFSRCwgUE5HX0dBTU1BX0xJTkVBUik7CisgKiAgICBUaGlzIGlzIHRoZSBjbGFzc2ljIEppbSBCbGlubiBhcHByb2FjaCBhbmQgd2lsbCB3b3JrIGluIGFjYWRlbWljCisgKiAgICBlbnZpcm9ubWVudHMgd2hlcmUgZXZlcnl0aGluZyBpcyBkb25lIGJ5IHRoZSBib29rLiAgSXQgaGFzIHRoZSBzaG9ydGNvbWluZworICogICAgb2YgYXNzdW1pbmcgdGhhdCBpbnB1dCBQTkcgZGF0YSB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIGlzIGxpbmVhciAtIHRoaXMKKyAqICAgIGlzIHVubGlrZWx5IHRvIGJlIGNvcnJlY3QgdW5sZXNzIHRoZSBQTkcgZmlsZXMgd2hlcmUgZ2VuZXJhdGVkIGxvY2FsbHkuCisgKiAgICBNb3N0IG9mIHRoZSB0aW1lIHRoZSBvdXRwdXQgcHJlY2lzaW9uIHdpbGwgYmUgc28gbG93IGFzIHRvIHNob3cKKyAqICAgIHNpZ25pZmljYW50IGJhbmRpbmcgaW4gZGFyayBhcmVhcyBvZiB0aGUgaW1hZ2UuCisgKgorICogcG5nX3NldF9leHBhbmRfMTYocHApOworICogcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfU1RBTkRBUkQsIFBOR19ERUZBVUxUX3NSR0IpOworICogICAgVGhpcyBpcyBhIHNvbWV3aGF0IG1vcmUgcmVhbGlzdGljIEppbSBCbGlubiBpbnNwaXJlZCBhcHByb2FjaC4gIFBORyBmaWxlcworICogICAgYXJlIGFzc3VtZWQgdG8gaGF2ZSB0aGUgc1JHQiBlbmNvZGluZyBpZiBub3QgbWFya2VkIHdpdGggYSBnYW1tYSB2YWx1ZSBhbmQKKyAqICAgIHRoZSBvdXRwdXQgaXMgYWx3YXlzIDE2IGJpdHMgcGVyIGNvbXBvbmVudC4gIFRoaXMgcGVybWl0cyBhY2N1cmF0ZSBzY2FsaW5nCisgKiAgICBhbmQgcHJvY2Vzc2luZyBvZiB0aGUgZGF0YS4gIElmIHlvdSBrbm93IHRoYXQgeW91ciBpbnB1dCBQTkcgZmlsZXMgd2VyZQorICogICAgZ2VuZXJhdGVkIGxvY2FsbHkgeW91IG1pZ2h0IG5lZWQgdG8gcmVwbGFjZSBQTkdfREVGQVVMVF9zUkdCIHdpdGggdGhlCisgKiAgICBjb3JyZWN0IHZhbHVlIGZvciB5b3VyIHN5c3RlbS4KKyAqCisgKiBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9PUFRJTUlaRUQsIFBOR19ERUZBVUxUX3NSR0IpOworICogICAgSWYgeW91IGp1c3QgbmVlZCB0byBjb21wb3NpdGUgdGhlIFBORyBpbWFnZSBvbnRvIGFuIGV4aXN0aW5nIGJhY2tncm91bmQKKyAqICAgIGFuZCBpZiB5b3UgY29udHJvbCB0aGUgY29kZSB0aGF0IGRvZXMgdGhpcyB5b3UgY2FuIHVzZSB0aGUgb3B0aW1pemF0aW9uCisgKiAgICBzZXR0aW5nLiAgSW4gdGhpcyBjYXNlIHlvdSBqdXN0IGNvcHkgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzIHRvIHRoZQorICogICAgb3V0cHV0LiAgRm9yIHBpeGVscyB0aGF0IGFyZSBub3QgY29tcGxldGVseSB0cmFuc3BhcmVudCAoeW91IGp1c3Qgc2tpcAorICogICAgdGhvc2UpIHlvdSBkbyB0aGUgY29tcG9zaXRpb24gbWF0aCB1c2luZyBwbmdfY29tcG9zaXRlIG9yIHBuZ19jb21wb3NpdGVfMTYKKyAqICAgIGJlbG93IHRoZW4gZW5jb2RlIHRoZSByZXN1bHRhbnQgOC1iaXQgb3IgMTYtYml0IHZhbHVlcyB0byBtYXRjaCB0aGUgb3V0cHV0CisgKiAgICBlbmNvZGluZy4KKyAqCisgKiBPdGhlciBjYXNlcworICogICAgSWYgbmVpdGhlciB0aGUgUE5HIG5vciB0aGUgc3RhbmRhcmQgbGluZWFyIGVuY29kaW5nIHdvcmsgZm9yIHlvdSBiZWNhdXNlCisgKiAgICBvZiB0aGUgc29mdHdhcmUgb3IgaGFyZHdhcmUgeW91IHVzZSB0aGVuIHlvdSBoYXZlIGEgYmlnIHByb2JsZW0uICBUaGUgUE5HCisgKiAgICBjYXNlIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluIGhhbG9zIGFyb3VuZCB0aGUgaW1hZ2UuICBUaGUgbGluZWFyIGVuY29kaW5nCisgKiAgICB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBhIHdhc2hlZCBvdXQsIHRvbyBicmlnaHQsIGltYWdlIChpdCdzIGFjdHVhbGx5IHRvbworICogICAgY29udHJhc3R5LikgIFRyeSB0aGUgQUxQSEFfT1BUSU1JWkVEIG1vZGUgYWJvdmUgLSB0aGlzIHdpbGwgcHJvYmFibHkKKyAqICAgIHN1YnN0YW50aWFsbHkgcmVkdWNlIHRoZSBoYWxvcy4gIEFsdGVybmF0aXZlbHkgdHJ5OgorICoKKyAqIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX0JST0tFTiwgUE5HX0RFRkFVTFRfc1JHQik7CisgKiAgICBUaGlzIG9wdGlvbiB3aWxsIGFsc28gcmVkdWNlIHRoZSBoYWxvcywgYnV0IHRoZXJlIHdpbGwgYmUgc2xpZ2h0IGRhcmsKKyAqICAgIGhhbG9zIHJvdW5kIHRoZSBvcGFxdWUgcGFydHMgb2YgdGhlIGltYWdlIHdoZXJlIHRoZSBiYWNrZ3JvdW5kIGlzIGxpZ2h0LgorICogICAgSW4gdGhlIE9QVElNSVpFRCBtb2RlIHRoZSBoYWxvcyB3aWxsIGJlIGxpZ2h0IGhhbG9zIHdoZXJlIHRoZSBiYWNrZ3JvdW5kCisgKiAgICBpcyBkYXJrLiAgVGFrZSB5b3VyIHBpY2sgLSB0aGUgaGFsb3MgYXJlIHVuYXZvaWRhYmxlIHVubGVzcyB5b3UgY2FuIGdldAorICogICAgeW91ciBoYXJkd2FyZS9zb2Z0d2FyZSBmaXhlZCEgIChUaGUgT1BUSU1JWkVEIGFwcHJvYWNoIGlzIHNsaWdodGx5CisgKiAgICBmYXN0ZXIuKQorICoKKyAqIFdoZW4gdGhlIGRlZmF1bHQgZ2FtbWEgb2YgUE5HIGZpbGVzIGRvZXNuJ3QgbWF0Y2ggdGhlIG91dHB1dCBnYW1tYS4KKyAqICAgIElmIHlvdSBoYXZlIFBORyBmaWxlcyB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIHBuZ19zZXRfYWxwaGFfbW9kZSBhbGxvd3MKKyAqICAgIHlvdSB0byBwcm92aWRlIGEgZGVmYXVsdCBnYW1tYSwgYnV0IGl0IGFsc28gc2V0cyB0aGUgb3VwdXQgZ2FtbWEgdG8gdGhlCisgKiAgICBtYXRjaGluZyB2YWx1ZS4gIElmIHlvdSBrbm93IHlvdXIgUE5HIGZpbGVzIGhhdmUgYSBnYW1tYSB0aGF0IGRvZXNuJ3QKKyAqICAgIG1hdGNoIHRoZSBvdXRwdXQgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0CisgKiAgICBwbmdfc2V0X2FscGhhX21vZGUgYWx3YXlzIHNldHMgdGhlIG91dHB1dCBnYW1tYSBidXQgb25seSBzZXRzIHRoZSBQTkcKKyAqICAgIGRlZmF1bHQgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0OgorICoKKyAqIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0RFRkFVTFRfc1JHQik7CisgKiBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19HQU1NQV9NQUMpOworICogICAgVGhlIGZpcnN0IGNhbGwgc2V0cyBib3RoIHRoZSBkZWZhdWx0IGFuZCB0aGUgb3V0cHV0IGdhbW1hIHZhbHVlcywgdGhlCisgKiAgICBzZWNvbmQgY2FsbCBvdmVycmlkZXMgdGhlIG91dHB1dCBnYW1tYSB3aXRob3V0IGNoYW5naW5nIHRoZSBkZWZhdWx0LiAgVGhpcworICogICAgaXMgZWFzaWVyIHRoYW4gYWNoaWV2aW5nIHRoZSBzYW1lIGVmZmVjdCB3aXRoIHBuZ19zZXRfZ2FtbWEuICBZb3UgbXVzdCB1c2UKKyAqICAgIFBOR19BTFBIQV9QTkcgZm9yIHRoZSBmaXJzdCBjYWxsIC0gaW50ZXJuYWwgY2hlY2tpbmcgaW4gcG5nX3NldF9hbHBoYSB3aWxsCisgKiAgICBmaXJlIGlmIG1vcmUgdGhhbiBvbmUgY2FsbCB0byBwbmdfc2V0X2FscGhhX21vZGUgYW5kIHBuZ19zZXRfYmFja2dyb3VuZCBpcworICogICAgbWFkZSBpbiB0aGUgc2FtZSByZWFkIG9wZXJhdGlvbiwgaG93ZXZlciBtdWx0aXBsZSBjYWxscyB3aXRoIFBOR19BTFBIQV9QTkcKKyAqICAgIGFyZSBpZ25vcmVkLgorICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKK1BOR19FWFBPUlQoMzYsIHZvaWQsIHBuZ19zZXRfc3RyaXBfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQpCitQTkdfRVhQT1JUKDM3LCB2b2lkLCBwbmdfc2V0X3N3YXBfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQorUE5HX0VYUE9SVCgzOCwgdm9pZCwgcG5nX3NldF9pbnZlcnRfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpCisvKiBBZGQgYSBmaWxsZXIgYnl0ZSB0byA4LWJpdCBHcmF5IG9yIDI0LWJpdCBSR0IgaW1hZ2VzLiAqLworUE5HX0VYUE9SVCgzOSwgdm9pZCwgcG5nX3NldF9maWxsZXIsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgZmlsbGVyLAorICAgIGludCBmbGFncykpOworLyogVGhlIHZhbHVlcyBvZiB0aGUgUE5HX0ZJTExFUl8gZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQgKi8KKyMgIGRlZmluZSBQTkdfRklMTEVSX0JFRk9SRSAwCisjICBkZWZpbmUgUE5HX0ZJTExFUl9BRlRFUiAxCisvKiBBZGQgYW4gYWxwaGEgYnl0ZSB0byA4LWJpdCBHcmF5IG9yIDI0LWJpdCBSR0IgaW1hZ2VzLiAqLworUE5HX0VYUE9SVCg0MCwgdm9pZCwgcG5nX3NldF9hZGRfYWxwaGEsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmbGFncykpOworI2VuZGlmIC8qIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQgKi8KKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQorLyogU3dhcCBieXRlcyBpbiAxNi1iaXQgZGVwdGggZmlsZXMuICovCitQTkdfRVhQT1JUKDQxLCB2b2lkLCBwbmdfc2V0X3N3YXAsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkKKy8qIFVzZSAxIGJ5dGUgcGVyIHBpeGVsIGluIDEsIDIsIG9yIDQtYml0IGRlcHRoIGZpbGVzLiAqLworUE5HX0VYUE9SVCg0Miwgdm9pZCwgcG5nX3NldF9wYWNraW5nLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCisvKiBTd2FwIHBhY2tpbmcgb3JkZXIgb2YgcGl4ZWxzIGluIGJ5dGVzLiAqLworUE5HX0VYUE9SVCg0Mywgdm9pZCwgcG5nX3NldF9wYWNrc3dhcCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpCisvKiBDb252ZXJ0cyBmaWxlcyB0byBsZWdhbCBiaXQgZGVwdGhzLiAqLworUE5HX0VYUE9SVCg0NCwgdm9pZCwgcG5nX3NldF9zaGlmdCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY29sb3JfOHAKKyAgICB0cnVlX2JpdHMpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCisvKiBIYXZlIHRoZSBjb2RlIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFzc2VzLgorICogTVVTVCBiZSBjYWxsZWQgYmVmb3JlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIG9yIHBuZ19zdGFydF9yZWFkX2ltYWdlLAorICogb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LiAgTm90ZSB0aGF0IGl0IGlzIHN0aWxsCisgKiBuZWNlc3NhcnkgdG8gY2FsbCBwbmdfcmVhZF9yb3cgb3IgcG5nX3JlYWRfcm93cyBwbmdfZ2V0X2ltYWdlX2hlaWdodAorICogdGltZXMgZm9yIGVhY2ggcGFzcy4KKyovCitQTkdfRVhQT1JUKDQ1LCBpbnQsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQorLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgKi8KK1BOR19FWFBPUlQoNDYsIHZvaWQsIHBuZ19zZXRfaW52ZXJ0X21vbm8sIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorLyogSGFuZGxlIGFscGhhIGFuZCB0Uk5TIGJ5IHJlcGxhY2luZyB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gIFByaW9yIHRvCisgKiBsaWJwbmctMS41LjQgdGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgUE5HIGZpbGUgaGVhZGVyIGhhcyBiZWVuCisgKiByZWFkLiAgRG9pbmcgc28gd2lsbCByZXN1bHQgaW4gdW5leHBlY3RlZCBiZWhhdmlvciBhbmQgcG9zc2libGUgd2FybmluZ3Mgb3IKKyAqIGVycm9ycyBpZiB0aGUgUE5HIGZpbGUgY29udGFpbnMgYSBiS0dEIGNodW5rLgorICovCitQTkdfRlBfRVhQT1JUKDQ3LCB2b2lkLCBwbmdfc2V0X2JhY2tncm91bmQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsIGludCBiYWNrZ3JvdW5kX2dhbW1hX2NvZGUsCisgICAgaW50IG5lZWRfZXhwYW5kLCBkb3VibGUgYmFja2dyb3VuZF9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDIxNSwgdm9pZCwgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLCBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLAorICAgIGludCBuZWVkX2V4cGFuZCwgcG5nX2ZpeGVkX3BvaW50IGJhY2tncm91bmRfZ2FtbWEpKQorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTktOT1dOIDAKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4gIDEKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFICAgIDIKKyMgIGRlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgIDMKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKKy8qIFNjYWxlIGEgMTYtYml0IGRlcHRoIGZpbGUgZG93biB0byA4LWJpdCwgYWNjdXJhdGVseS4gKi8KK1BOR19FWFBPUlQoMjI5LCB2b2lkLCBwbmdfc2V0X3NjYWxlXzE2LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKKyNkZWZpbmUgUE5HX1JFQURfMTZfVE9fOCBTVVBQT1JURUQgLyogTmFtZSBwcmlvciB0byAxLjUuNCAqLworLyogU3RyaXAgdGhlIHNlY29uZCBieXRlIG9mIGluZm9ybWF0aW9uIGZyb20gYSAxNi1iaXQgZGVwdGggZmlsZS4gKi8KK1BOR19FWFBPUlQoNDgsIHZvaWQsIHBuZ19zZXRfc3RyaXBfMTYsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQKKy8qIFR1cm4gb24gcXVhbnRpemluZywgYW5kIHJlZHVjZSB0aGUgcGFsZXR0ZSB0byB0aGUgbnVtYmVyIG9mIGNvbG9ycworICogYXZhaWxhYmxlLgorICovCitQTkdfRVhQT1JUKDQ5LCB2b2lkLCBwbmdfc2V0X3F1YW50aXplLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUsIGludCBtYXhpbXVtX2NvbG9ycywKKyAgICBwbmdfY29uc3RfdWludF8xNnAgaGlzdG9ncmFtLCBpbnQgZnVsbF9xdWFudGl6ZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKy8qIFRoZSB0aHJlc2hvbGQgb24gZ2FtbWEgcHJvY2Vzc2luZyBpcyBjb25maWd1cmFibGUgYnV0IGhhcmQtd2lyZWQgaW50byB0aGUKKyAqIGxpYnJhcnkuICBUaGUgZm9sbG93aW5nIGlzIHRoZSBmbG9hdGluZyBwb2ludCB2YXJpYW50LgorICovCisjZGVmaW5lIFBOR19HQU1NQV9USFJFU0hPTEQgKFBOR19HQU1NQV9USFJFU0hPTERfRklYRUQqLjAwMDAxKQorCisvKiBIYW5kbGUgZ2FtbWEgY29ycmVjdGlvbi4gU2NyZWVuX2dhbW1hPShkaXNwbGF5X2V4cG9uZW50KS4KKyAqIE5PVEU6IHRoaXMgQVBJIHNpbXBseSBzZXRzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgdmFsdWVzLiBJdCB3aWxsCisgKiB0aGVyZWZvcmUgb3ZlcnJpZGUgdGhlIHZhbHVlIGZvciBnYW1tYSBpbiBhIFBORyBmaWxlIGlmIGl0IGlzIGNhbGxlZCBhZnRlcgorICogdGhlIGZpbGUgaGVhZGVyIGhhcyBiZWVuIHJlYWQgLSB1c2Ugd2l0aCBjYXJlICAtIGNhbGwgYmVmb3JlIHJlYWRpbmcgdGhlIFBORworICogZmlsZSBmb3IgYmVzdCByZXN1bHRzIQorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGFjY2VwdCB0aGUgc2FtZSBnYW1tYSB2YWx1ZXMgYXMgcG5nX3NldF9hbHBoYV9tb2RlIChkZXNjcmliZWQKKyAqIGFib3ZlKS4gIFRoZSBQTkdfR0FNTUFfIGRlZmluZXMgYW5kIFBOR19ERUZBVUxUX3NSR0IgY2FuIGJlIHBhc3NlZCB0byBlaXRoZXIKKyAqIEFQSSAoZmxvYXRpbmcgcG9pbnQgb3IgZml4ZWQuKSAgTm90aWNlLCBob3dldmVyLCB0aGF0IHRoZSAnZmlsZV9nYW1tYScgdmFsdWUKKyAqIGlzIHRoZSBpbnZlcnNlIG9mIGEgJ3NjcmVlbiBnYW1tYScgdmFsdWUuCisgKi8KK1BOR19GUF9FWFBPUlQoNTAsIHZvaWQsIHBuZ19zZXRfZ2FtbWEsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBkb3VibGUgc2NyZWVuX2dhbW1hLCBkb3VibGUgb3ZlcnJpZGVfZmlsZV9nYW1tYSkpCitQTkdfRklYRURfRVhQT1JUKDIwOCwgdm9pZCwgcG5nX3NldF9nYW1tYV9maXhlZCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCBzY3JlZW5fZ2FtbWEsIHBuZ19maXhlZF9wb2ludCBvdmVycmlkZV9maWxlX2dhbW1hKSkKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorLyogU2V0IGhvdyBtYW55IGxpbmVzIGJldHdlZW4gb3V0cHV0IGZsdXNoZXMgLSAwIGZvciBubyBmbHVzaGluZyAqLworUE5HX0VYUE9SVCg1MSwgdm9pZCwgcG5nX3NldF9mbHVzaCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgbnJvd3MpKTsKKy8qIEZsdXNoIHRoZSBjdXJyZW50IFBORyBvdXRwdXQgYnVmZmVyICovCitQTkdfRVhQT1JUKDUyLCB2b2lkLCBwbmdfd3JpdGVfZmx1c2gsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKy8qIE9wdGlvbmFsIHVwZGF0ZSBwYWxldHRlIHdpdGggcmVxdWVzdGVkIHRyYW5zZm9ybWF0aW9ucyAqLworUE5HX0VYUE9SVCg1Mywgdm9pZCwgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBPcHRpb25hbCBjYWxsIHRvIHVwZGF0ZSB0aGUgdXNlcnMgaW5mbyBzdHJ1Y3R1cmUgKi8KK1BOR19FWFBPUlQoNTQsIHZvaWQsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgb25lIG9yIG1vcmUgcm93cyBvZiBpbWFnZSBkYXRhLiAqLworUE5HX0VYUE9SVCg1NSwgdm9pZCwgcG5nX3JlYWRfcm93cywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKKyAgICBwbmdfYnl0ZXBwIGRpc3BsYXlfcm93LCBwbmdfdWludF8zMiBudW1fcm93cykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCBhIHJvdyBvZiBkYXRhLiAqLworUE5HX0VYUE9SVCg1Niwgdm9pZCwgcG5nX3JlYWRfcm93LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3csCisgICAgcG5nX2J5dGVwIGRpc3BsYXlfcm93KSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisvKiBSZWFkIHRoZSB3aG9sZSBpbWFnZSBpbnRvIG1lbW9yeSBhdCBvbmNlLiAqLworUE5HX0VYUE9SVCg1Nywgdm9pZCwgcG5nX3JlYWRfaW1hZ2UsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwcCBpbWFnZSkpOworI2VuZGlmCisKKy8qIFdyaXRlIGEgcm93IG9mIGltYWdlIGRhdGEgKi8KK1BOR19FWFBPUlQoNTgsIHZvaWQsIHBuZ193cml0ZV9yb3csIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgcm93KSk7CisKKy8qIFdyaXRlIGEgZmV3IHJvd3Mgb2YgaW1hZ2UgZGF0YTogKCpyb3cpIGlzIG5vdCB3cml0dGVuOyBob3dldmVyLCB0aGUgdHlwZQorICogaXMgZGVjbGFyZWQgYXMgd3JpdGVhYmxlIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucworICogb2YgbGlicG5nIGFuZCB0byBhbGxvdyB0aGUgJ2Rpc3BsYXlfcm93JyBhcnJheSBmcm9tIHJlYWRfcm93cyB0byBiZSBwYXNzZWQKKyAqIHVuY2hhbmdlZCB0byB3cml0ZV9yb3dzLgorICovCitQTkdfRVhQT1JUKDU5LCB2b2lkLCBwbmdfd3JpdGVfcm93cywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKKyAgICBwbmdfdWludF8zMiBudW1fcm93cykpOworCisvKiBXcml0ZSB0aGUgaW1hZ2UgZGF0YSAqLworUE5HX0VYUE9SVCg2MCwgdm9pZCwgcG5nX3dyaXRlX2ltYWdlLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpKTsKKworLyogV3JpdGUgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICovCitQTkdfRVhQT1JUKDYxLCB2b2lkLCBwbmdfd3JpdGVfZW5kLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICovCitQTkdfRVhQT1JUKDYyLCB2b2lkLCBwbmdfcmVhZF9lbmQsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0cikpOworI2VuZGlmCisKKy8qIEZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19pbmZvX3N0cnVjdCAqLworUE5HX0VYUE9SVCg2Mywgdm9pZCwgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikpOworCisvKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2luZm9fc3RydWN0cyAqLworUE5HX0VYUE9SVCg2NCwgdm9pZCwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QsIChwbmdfc3RydWN0cHAgcG5nX3B0cl9wdHIsCisgICAgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIsIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikpOworCisvKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2luZm9fc3RydWN0cyAqLworUE5HX0VYUE9SVCg2NSwgdm9pZCwgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0LCAocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLAorICAgIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyKSk7CisKKy8qIFNldCB0aGUgbGlicG5nIG1ldGhvZCBvZiBoYW5kbGluZyBjaHVuayBDUkMgZXJyb3JzICovCitQTkdfRVhQT1JUKDY2LCB2b2lkLCBwbmdfc2V0X2NyY19hY3Rpb24sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGNyaXRfYWN0aW9uLAorICAgIGludCBhbmNpbF9hY3Rpb24pKTsKKworLyogVmFsdWVzIGZvciBwbmdfc2V0X2NyY19hY3Rpb24oKSBzYXkgaG93IHRvIGhhbmRsZSBDUkMgZXJyb3JzIGluCisgKiBhbmNpbGxhcnkgYW5kIGNyaXRpY2FsIGNodW5rcywgYW5kIHdoZXRoZXIgdG8gdXNlIHRoZSBkYXRhIGNvbnRhaW5lZAorICogdGhlcmVpbi4gIE5vdGUgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvICJkaXNjYXJkIiBkYXRhIGluIGEgY3JpdGljYWwKKyAqIGNodW5rLiAgRm9yIHZlcnNpb25zIHByaW9yIHRvIDAuOTAsIHRoZSBhY3Rpb24gd2FzIGFsd2F5cyBlcnJvci9xdWl0LAorICogd2hlcmVhcyBpbiB2ZXJzaW9uIDAuOTAgYW5kIGxhdGVyLCB0aGUgYWN0aW9uIGZvciBDUkMgZXJyb3JzIGluIGFuY2lsbGFyeQorICogY2h1bmtzIGlzIHdhcm4vZGlzY2FyZC4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCisgKgorICogICAgICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOmNyaXRpY2FsICAgICBhY3Rpb246YW5jaWxsYXJ5CisgKi8KKyNkZWZpbmUgUE5HX0NSQ19ERUZBVUxUICAgICAgIDAgIC8qIGVycm9yL3F1aXQgICAgICAgICAgd2Fybi9kaXNjYXJkIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NSQ19FUlJPUl9RVUlUICAgIDEgIC8qIGVycm9yL3F1aXQgICAgICAgICAgZXJyb3IvcXVpdCAgICAgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19XQVJOX0RJU0NBUkQgIDIgIC8qIChJTlZBTElEKSAgICAgICAgICAgd2Fybi9kaXNjYXJkIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NSQ19XQVJOX1VTRSAgICAgIDMgIC8qIHdhcm4vdXNlIGRhdGEgICAgICAgd2Fybi91c2UgZGF0YSAgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19RVUlFVF9VU0UgICAgIDQgIC8qIHF1aWV0L3VzZSBkYXRhICAgICAgcXVpZXQvdXNlIGRhdGEgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19OT19DSEFOR0UgICAgIDUgIC8qIHVzZSBjdXJyZW50IHZhbHVlICAgdXNlIGN1cnJlbnQgdmFsdWUgKi8KKworLyogVGhlc2UgZnVuY3Rpb25zIGdpdmUgdGhlIHVzZXIgY29udHJvbCBvdmVyIHRoZSBzY2FuLWxpbmUgZmlsdGVyaW5nIGluCisgKiBsaWJwbmcgYW5kIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIHVzZWQgYnkgemxpYi4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIG1haW5seSB1c2VmdWwgZm9yIHRlc3RpbmcsIGFzIHRoZSBkZWZhdWx0cyBzaG91bGQgd29yayB3aXRoIG1vc3QgdXNlcnMuCisgKiBUaG9zZSB1c2VycyB3aG8gYXJlIHRpZ2h0IG9uIG1lbW9yeSBvciB3YW50IGZhc3RlciBwZXJmb3JtYW5jZSBhdCB0aGUKKyAqIGV4cGVuc2Ugb2YgY29tcHJlc3Npb24gY2FuIG1vZGlmeSB0aGVtLiAgU2VlIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBoZWFkZXIgZmlsZSAoemxpYi5oKSBmb3IgYW4gZXhwbGluYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9ucy4KKyAqLworCisvKiBTZXQgdGhlIGZpbHRlcmluZyBtZXRob2QocykgdXNlZCBieSBsaWJwbmcuICBDdXJyZW50bHksIHRoZSBvbmx5IHZhbGlkCisgKiB2YWx1ZSBmb3IgIm1ldGhvZCIgaXMgMC4KKyAqLworUE5HX0VYUE9SVCg2Nywgdm9pZCwgcG5nX3NldF9maWx0ZXIsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IG1ldGhvZCwKKyAgICBpbnQgZmlsdGVycykpOworCisvKiBGbGFncyBmb3IgcG5nX3NldF9maWx0ZXIoKSB0byBzYXkgd2hpY2ggZmlsdGVycyB0byB1c2UuICBUaGUgZmxhZ3MKKyAqIGFyZSBjaG9zZW4gc28gdGhhdCB0aGV5IGRvbid0IGNvbmZsaWN0IHdpdGggcmVhbCBmaWx0ZXIgdHlwZXMKKyAqIGJlbG93LCBpbiBjYXNlIHRoZXkgYXJlIHN1cHBsaWVkIGluc3RlYWQgb2YgdGhlICNkZWZpbmVkIGNvbnN0YW50cy4KKyAqIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUgUE5HX05PX0ZJTFRFUlMgICAgIDB4MDAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9OT05FICAgIDB4MDgKKyNkZWZpbmUgUE5HX0ZJTFRFUl9TVUIgICAgIDB4MTAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9VUCAgICAgIDB4MjAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9BVkcgICAgIDB4NDAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9QQUVUSCAgIDB4ODAKKyNkZWZpbmUgUE5HX0FMTF9GSUxURVJTIChQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQiB8IFBOR19GSUxURVJfVVAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9BVkcgfCBQTkdfRklMVEVSX1BBRVRIKQorCisvKiBGaWx0ZXIgdmFsdWVzIChub3QgZmxhZ3MpIC0gdXNlZCBpbiBwbmd3cml0ZS5jLCBwbmd3dXRpbC5jIGZvciBub3cuCisgKiBUaGVzZSBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX05PTkUgIDAKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgICAxCisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfVVAgICAgMgorI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX0FWRyAgIDMKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSCA0CisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfTEFTVCAgNQorCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQgLyogRVhQRVJJTUVOVEFMICovCisvKiBUaGUgImhldXJpc3RpY19tZXRob2QiIGlzIGdpdmVuIGJ5IG9uZSBvZiB0aGUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfCisgKiBkZWZpbmVzLCBlaXRoZXIgdGhlIGRlZmF1bHQgKG1pbmltdW0tc3VtLW9mLWFic29sdXRlLWRpZmZlcmVuY2VzKSwgb3IKKyAqIHRoZSBleHBlcmltZW50YWwgbWV0aG9kICh3ZWlnaHRlZC1taW5pbXVtLXN1bS1vZi1hYnNvbHV0ZS1kaWZmZXJlbmNlcykuCisgKgorICogV2VpZ2h0cyBhcmUgZmFjdG9ycyA+PSAxLjAsIGluZGljYXRpbmcgaG93IGltcG9ydGFudCBpdCBpcyB0byBrZWVwIHRoZQorICogZmlsdGVyIHR5cGUgY29uc2lzdGVudCBiZXR3ZWVuIHJvd3MuICBMYXJnZXIgbnVtYmVycyBtZWFuIHRoZSBjdXJyZW50CisgKiBmaWx0ZXIgaXMgdGhhdCBtYW55IHRpbWVzIGFzIGxpa2VseSB0byBiZSB0aGUgc2FtZSBhcyB0aGUgIm51bV93ZWlnaHRzIgorICogcHJldmlvdXMgZmlsdGVycy4gIFRoaXMgaXMgY3VtdWxhdGl2ZSBmb3IgZWFjaCBwcmV2aW91cyByb3cgd2l0aCBhIHdlaWdodC4KKyAqIFRoZXJlIG5lZWRzIHRvIGJlICJudW1fd2VpZ2h0cyIgdmFsdWVzIGluICJmaWx0ZXJfd2VpZ2h0cyIsIG9yIGl0IGNhbiBiZQorICogTlVMTCBpZiB0aGUgd2VpZ2h0cyBhcmVuJ3QgYmVpbmcgc3BlY2lmaWVkLiAgV2VpZ2h0cyBoYXZlIG5vIGluZmx1ZW5jZSBvbgorICogdGhlIHNlbGVjdGlvbiBvZiB0aGUgZmlyc3Qgcm93IGZpbHRlci4gIFdlbGwgY2hvc2VuIHdlaWdodHMgY2FuIChpbiB0aGVvcnkpCisgKiBpbXByb3ZlIHRoZSBjb21wcmVzc2lvbiBmb3IgYSBnaXZlbiBpbWFnZS4KKyAqCisgKiBDb3N0cyBhcmUgZmFjdG9ycyA+PSAxLjAgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgZGVjb2RpbmcgY29zdHMgb2YgYQorICogZmlsdGVyIHR5cGUuICBIaWdoZXIgY29zdHMgaW5kaWNhdGUgbW9yZSBkZWNvZGluZyBleHBlbnNlLCBhbmQgYXJlCisgKiB0aGVyZWZvcmUgbGVzcyBsaWtlbHkgdG8gYmUgc2VsZWN0ZWQgb3ZlciBhIGZpbHRlciB3aXRoIGxvd2VyIGNvbXB1dGF0aW9uYWwKKyAqIGNvc3RzLiAgVGhlcmUgbmVlZHMgdG8gYmUgYSB2YWx1ZSBpbiAiZmlsdGVyX2Nvc3RzIiBmb3IgZWFjaCB2YWxpZCBmaWx0ZXIKKyAqIHR5cGUgKGdpdmVuIGJ5IFBOR19GSUxURVJfVkFMVUVfTEFTVCksIG9yIGl0IGNhbiBiZSBOVUxMIGlmIHlvdSBhcmVuJ3QKKyAqIHNldHRpbmcgdGhlIGNvc3RzLiAgQ29zdHMgdHJ5IHRvIGltcHJvdmUgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gd2l0aG91dAorICogdW5kdWx5IGluY3JlYXNpbmcgdGhlIGNvbXByZXNzZWQgaW1hZ2Ugc2l6ZS4KKyAqCisgKiBBIG5lZ2F0aXZlIHdlaWdodCBvciBjb3N0IGluZGljYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBiZSB1c2VkLCBhbmQKKyAqIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzAuMCwgMS4wKSBpbmRpY2F0ZSB0aGUgdmFsdWUgaXMgdG8gcmVtYWluIHVuY2hhbmdlZC4KKyAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYm90aCB3ZWlnaHRzIGFuZCBjb3N0cyBhcmUgY3VycmVudGx5IDEuMCwgYnV0IG1heQorICogY2hhbmdlIGlmIGdvb2QgZ2VuZXJhbCB3ZWlnaHRpbmcvY29zdCBoZXVyaXN0aWNzIGNhbiBiZSBmb3VuZC4gIElmIGJvdGgKKyAqIHRoZSB3ZWlnaHRzIGFuZCBjb3N0cyBhcmUgc2V0IHRvIDEuMCwgdGhpcyBkZWdlbmVyYXRlcyB0aGUgV0VJR0hURUQgbWV0aG9kCisgKiB0byB0aGUgVU5XRUlHSFRFRCBtZXRob2QsIGJ1dCB3aXRoIGFkZGVkIGVuY29kaW5nIHRpbWUvY29tcHV0YXRpb24uCisgKi8KK1BOR19GUF9FWFBPUlQoNjgsIHZvaWQsIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBpbnQgaGV1cmlzdGljX21ldGhvZCwgaW50IG51bV93ZWlnaHRzLCBwbmdfY29uc3RfZG91YmxlcCBmaWx0ZXJfd2VpZ2h0cywKKyAgICBwbmdfY29uc3RfZG91YmxlcCBmaWx0ZXJfY29zdHMpKQorUE5HX0ZJWEVEX0VYUE9SVCgyMDksIHZvaWQsIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3NfZml4ZWQsCisgICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgaGV1cmlzdGljX21ldGhvZCwgaW50IG51bV93ZWlnaHRzLAorICAgIHBuZ19jb25zdF9maXhlZF9wb2ludF9wIGZpbHRlcl93ZWlnaHRzLAorICAgIHBuZ19jb25zdF9maXhlZF9wb2ludF9wIGZpbHRlcl9jb3N0cykpCisjZW5kaWYgLyogIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEICovCisKKy8qIEhldXJpc3RpYyB1c2VkIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbi4gIFRoZXNlIGRlZmluZXMgc2hvdWxkIE5PVCBiZQorICogY2hhbmdlZC4KKyAqLworI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19ERUZBVUxUICAgIDAgIC8qIEN1cnJlbnRseSAiVU5XRUlHSFRFRCIgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfVU5XRUlHSFRFRCAxICAvKiBVc2VkIGJ5IGxpYnBuZyA8IDAuOTUgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQgICAyICAvKiBFeHBlcmltZW50YWwgZmVhdHVyZSAqLworI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19MQVNUICAgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisvKiBTZXQgdGhlIGxpYnJhcnkgY29tcHJlc3Npb24gbGV2ZWwuICBDdXJyZW50bHksIHZhbGlkIHZhbHVlcyByYW5nZSBmcm9tCisgKiAwIC0gOSwgY29ycmVzcG9uZGluZyBkaXJlY3RseSB0byB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbHMgMCAtIDkKKyAqICgwIC0gbm8gY29tcHJlc3Npb24sIDkgLSAibWF4aW1hbCIgY29tcHJlc3Npb24pLiAgTm90ZSB0aGF0IHRlc3RzIGhhdmUKKyAqIHNob3duIHRoYXQgemxpYiBjb21wcmVzc2lvbiBsZXZlbHMgMy02IHVzdWFsbHkgcGVyZm9ybSBhcyB3ZWxsIGFzIGxldmVsIDkKKyAqIGZvciBQTkcgaW1hZ2VzLCBhbmQgZG8gY29uc2lkZXJhYmx5IGZld2VyIGNhY2x1bGF0aW9ucy4gIEluIHRoZSBmdXR1cmUsCisgKiB0aGVzZSB2YWx1ZXMgbWF5IG5vdCBjb3JyZXNwb25kIGRpcmVjdGx5IHRvIHRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVscy4KKyAqLworUE5HX0VYUE9SVCg2OSwgdm9pZCwgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBsZXZlbCkpOworCitQTkdfRVhQT1JUKDcwLCB2b2lkLCBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBtZW1fbGV2ZWwpKTsKKworUE5HX0VYUE9SVCg3MSwgdm9pZCwgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBzdHJhdGVneSkpOworCisvKiBJZiBQTkdfV1JJVEVfT1BUSU1JWkVfQ01GX1NVUFBPUlRFRCBpcyBkZWZpbmVkLCBsaWJwbmcgd2lsbCB1c2UgYQorICogc21hbGxlciB2YWx1ZSBvZiB3aW5kb3dfYml0cyBpZiBpdCBjYW4gZG8gc28gc2FmZWx5LgorICovCitQTkdfRVhQT1JUKDcyLCB2b2lkLCBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IHdpbmRvd19iaXRzKSk7CisKK1BOR19FWFBPUlQoNzMsIHZvaWQsIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IG1ldGhvZCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVECisvKiBBbHNvIHNldCB6bGliIHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW5nIG5vbi1JREFUIGNodW5rcyAqLworUE5HX0VYUE9SVCgyMjIsIHZvaWQsIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBsZXZlbCkpOworCitQTkdfRVhQT1JUKDIyMywgdm9pZCwgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21lbV9sZXZlbCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBtZW1fbGV2ZWwpKTsKKworUE5HX0VYUE9SVCgyMjQsIHZvaWQsIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneSwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBzdHJhdGVneSkpOworCisvKiBJZiBQTkdfV1JJVEVfT1BUSU1JWkVfQ01GX1NVUFBPUlRFRCBpcyBkZWZpbmVkLCBsaWJwbmcgd2lsbCB1c2UgYQorICogc21hbGxlciB2YWx1ZSBvZiB3aW5kb3dfYml0cyBpZiBpdCBjYW4gZG8gc28gc2FmZWx5LgorICovCitQTkdfRVhQT1JUKDIyNSwgdm9pZCwgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzLAorICAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IHdpbmRvd19iaXRzKSk7CisKK1BOR19FWFBPUlQoMjI2LCB2b2lkLCBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgaW50IG1ldGhvZCkpOworI2VuZGlmIC8qIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQgKi8KKworLyogVGhlc2UgbmV4dCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgaW5wdXQvb3V0cHV0LCBtZW1vcnksIGFuZCBlcnJvcgorICogaGFuZGxpbmcuICBUaGV5IGFyZSBpbiB0aGUgZmlsZSBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLAorICogYW5kIGNhbGwgc3RhbmRhcmQgQyBJL08gcm91dGluZXMgc3VjaCBhcyBmcmVhZCgpLCBmd3JpdGUoKSwgYW5kCisgKiBmcHJpbnRmKCkuICBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIG1hZGUgdG8gdXNlIG90aGVyIEkvTyByb3V0aW5lcworICogYXQgcnVuIHRpbWUgZm9yIHRob3NlIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gaGFuZGxlIEkvTyBpbiBhCisgKiBkaWZmZXJlbnQgbWFubmVyIGJ5IGNhbGxpbmcgcG5nX3NldF8/Pz9fZm4oKS4gIFNlZSBsaWJwbmctbWFudWFsLnR4dCBmb3IKKyAqIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKKy8qIEluaXRpYWxpemUgdGhlIGlucHV0L291dHB1dCBmb3IgdGhlIFBORyBmaWxlIHRvIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucy4gKi8KK1BOR19FWFBPUlQoNzQsIHZvaWQsIHBuZ19pbml0X2lvLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19GSUxFX3AgZnApKTsKKyNlbmRpZgorCisvKiBSZXBsYWNlIHRoZSAoZXJyb3IgYW5kIGFib3J0KSwgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHdpdGggdXNlcgorICogc3VwcGxpZWQgZnVuY3Rpb25zLiAgSWYgbm8gbWVzc2FnZXMgYXJlIHRvIGJlIHByaW50ZWQgeW91IG11c3Qgc3RpbGwKKyAqIHdyaXRlIGFuZCB1c2UgcmVwbGFjZW1lbnQgZnVuY3Rpb25zLiBUaGUgcmVwbGFjZW1lbnQgZXJyb3JfZm4gc2hvdWxkCisgKiBzdGlsbCBkbyBhIGxvbmdqbXAgdG8gdGhlIGxhc3Qgc2V0am1wIGxvY2F0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhpcworICogbWV0aG9kIG9mIGVycm9yIGhhbmRsaW5nLiAgSWYgZXJyb3JfZm4gb3Igd2FybmluZ19mbiBpcyBOVUxMLCB0aGUKKyAqIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLgorICovCisKK1BOR19FWFBPUlQoNzUsIHZvaWQsIHBuZ19zZXRfZXJyb3JfZm4sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pKTsKKworLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvciBmdW5jdGlvbnMgKi8KK1BOR19FWFBPUlQoNzYsIHBuZ192b2lkcCwgcG5nX2dldF9lcnJvcl9wdHIsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGRhdGEgb3V0cHV0IGZ1bmN0aW9ucyB3aXRoIGEgdXNlciBzdXBwbGllZCBvbmUocykuCisgKiBJZiBidWZmZXJlZCBvdXRwdXQgaXMgbm90IHVzZWQsIHRoZW4gb3V0cHV0X2ZsdXNoX2ZuIGNhbiBiZSBzZXQgdG8gTlVMTC4KKyAqIElmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQgYXQgbGlicG5nIGNvbXBpbGUgdGltZQorICogb3V0cHV0X2ZsdXNoX2ZuIHdpbGwgYmUgaWdub3JlZCAoYW5kIHRodXMgY2FuIGJlIE5VTEwpLgorICogSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlIHRvIHVzZSBOVUxMIGZvciBvdXRwdXRfZmx1c2hfZm4gaWYKKyAqIHdyaXRlX2RhdGFfZm4gaXMgbm90IGFsc28gTlVMTCB1bmxlc3MgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGgKKyAqIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgdW5kZWZpbmVkLCBiZWNhdXNlIGluIHRoaXMgY2FzZSBsaWJwbmcncworICogZGVmYXVsdCBmbHVzaCBmdW5jdGlvbiwgd2hpY2ggdXNlcyB0aGUgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLCB3aWxsCisgKiBiZSB1c2VkLgorICovCitQTkdfRVhQT1JUKDc3LCB2b2lkLCBwbmdfc2V0X3dyaXRlX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBpb19wdHIsCisgICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLCBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbikpOworCisvKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGRhdGEgaW5wdXQgZnVuY3Rpb24gd2l0aCBhIHVzZXIgc3VwcGxpZWQgb25lLiAqLworUE5HX0VYUE9SVCg3OCwgdm9pZCwgcG5nX3NldF9yZWFkX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ192b2lkcCBpb19wdHIsCisgICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pKTsKKworLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBJL08gZnVuY3Rpb25zICovCitQTkdfRVhQT1JUKDc5LCBwbmdfdm9pZHAsIHBuZ19nZXRfaW9fcHRyLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKworUE5HX0VYUE9SVCg4MCwgdm9pZCwgcG5nX3NldF9yZWFkX3N0YXR1c19mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19yZWFkX3N0YXR1c19wdHIgcmVhZF9yb3dfZm4pKTsKKworUE5HX0VYUE9SVCg4MSwgdm9pZCwgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfd3JpdGVfc3RhdHVzX3B0ciB3cml0ZV9yb3dfZm4pKTsKKworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKy8qIFJlcGxhY2UgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIHdpdGggdXNlciBzdXBwbGllZCBvbmUocykuICovCitQTkdfRVhQT1JUKDgyLCB2b2lkLCBwbmdfc2V0X21lbV9mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdm9pZHAgbWVtX3B0ciwKKyAgICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKSk7CisvKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIG1lbW9yeSBmdW5jdGlvbnMgKi8KK1BOR19FWFBPUlQoODMsIHBuZ192b2lkcCwgcG5nX2dldF9tZW1fcHRyLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECitQTkdfRVhQT1JUKDg0LCB2b2lkLCBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4sIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorUE5HX0VYUE9SVCg4NSwgdm9pZCwgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4pKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKK1BOR19FWFBPUlQoODYsIHZvaWQsIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ192b2lkcCB1c2VyX3RyYW5zZm9ybV9wdHIsIGludCB1c2VyX3RyYW5zZm9ybV9kZXB0aCwKKyAgICBpbnQgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpKTsKKy8qIFJldHVybiB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0cmFuc2Zvcm0gZnVuY3Rpb25zICovCitQTkdfRVhQT1JUKDg3LCBwbmdfdm9pZHAsIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fSU5GT19TVVBQT1JURUQKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm93IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuICBOb3RlIHRoYXQgdGhlc2UKKyAqIEFQSXMgZG8gbm90IGZhaWwgYnV0IHdpbGwgcmV0dXJuIHVuZXhwZWN0ZWQgcmVzdWx0cyBpZiBjYWxsZWQgb3V0c2lkZSBhIHVzZXIKKyAqIHRyYW5zZm9ybSBjYWxsYmFjay4gIEFsc28gbm90ZSB0aGF0IHdoZW4gdHJhbnNmb3JtaW5nIGFuIGludGVybGFjZWQgaW1hZ2UgdGhlCisgKiByb3cgbnVtYmVyIGlzIHRoZSByb3cgbnVtYmVyIHdpdGhpbiB0aGUgc3ViLWltYWdlIG9mIHRoZSBpbnRlcmxhY2UgcGFzcywgc28KKyAqIHRoZSB2YWx1ZSB3aWxsIGluY3JlYXNlIHRvIHRoZSBoZWlnaHQgb2YgdGhlIHN1Yi1pbWFnZSAobm90IHRoZSBmdWxsIGltYWdlKQorICogdGhlbiByZXNldCB0byAwIGZvciB0aGUgbmV4dCBwYXNzLgorICoKKyAqIFVzZSBQTkdfUk9XX0ZST01fUEFTU19ST1cocm93LCBwYXNzKSBhbmQgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKGNvbCwgcGFzcykgdG8KKyAqIGZpbmQgdGhlIG91dHB1dCBwaXhlbCAoeCx5KSBnaXZlbiBhbiBpbnRlcmxhY2VkIHN1Yi1pbWFnZSBwaXhlbAorICogKHJvdyxjb2wscGFzcykuICAoU2VlIGJlbG93IGZvciB0aGVzZSBtYWNyb3MuKQorICovCitQTkdfRVhQT1JUKDIxNywgcG5nX3VpbnRfMzIsIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyLCAocG5nX2NvbnN0X3N0cnVjdHJwKSk7CitQTkdfRVhQT1JUKDIxOCwgcG5nX2J5dGUsIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlciwgKHBuZ19jb25zdF9zdHJ1Y3RycCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKy8qIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIG9ubHkgZm9yICp1bmtub3duKiBjaHVua3MuICBJZgorICogUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRCBpcyBzZXQgdGhlbiBpdCBpcyBwb3NzaWJsZSB0byBzZXQga25vd24KKyAqIGNodW5rcyB0byBiZSB0cmVhdGVkIGFzIHVua25vd24sIGhvd2V2ZXIgaW4gdGhpcyBjYXNlIHRoZSBjYWxsYmFjayBtdXN0IGRvCisgKiBhbnkgcHJvY2Vzc2luZyByZXF1aXJlZCBieSB0aGUgY2h1bmsgKGUuZy4gYnkgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUKKyAqIHBuZ19zZXRfIEFQSXMuKQorICoKKyAqIFRoZXJlIGlzIG5vIHdyaXRlIHN1cHBvcnQgLSBvbiB3cml0ZSwgYnkgZGVmYXVsdCwgYWxsIHRoZSBjaHVua3MgaW4gdGhlCisgKiAndW5rbm93bicgbGlzdCBhcmUgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgorICoKKyAqIFRoZSBpbnRlZ2VyIHJldHVybiBmcm9tIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnRlcnByZXRlZCB0aHVzOgorICoKKyAqIG5lZ2F0aXZlOiBBbiBlcnJvciBvY2N1cmVkLCBwbmdfY2h1bmtfZXJyb3Igd2lsbCBiZSBjYWxsZWQuCisgKiAgICAgemVybzogVGhlIGNodW5rIHdhcyBub3QgaGFuZGxlZCwgdGhlIGNodW5rIHdpbGwgYmUgc2F2ZWQuIEEgY3JpdGljYWwKKyAqICAgICAgICAgICBjaHVuayB3aWxsIGNhdXNlIGFuIGVycm9yIGF0IHRoaXMgcG9pbnQgdW5sZXNzIGl0IGlzIHRvIGJlIHNhdmVkLgorICogcG9zaXRpdmU6IFRoZSBjaHVuayB3YXMgaGFuZGxlZCwgbGlicG5nIHdpbGwgaWdub3JlL2Rpc2NhcmQgaXQuCisgKgorICogU2VlICJJTlRFUkFDVElPTiBXVElIIFVTRVIgQ0hVTksgQ0FMTEJBQ0tTIiBiZWxvdyBmb3IgaW1wb3J0YW50IG5vdGVzIGFib3V0CisgKiBob3cgdGhpcyBiZWhhdmlvciB3aWxsIGNoYW5nZSBpbiBsaWJwbmcgMS43CisgKi8KK1BOR19FWFBPUlQoODgsIHZvaWQsIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyLCBwbmdfdXNlcl9jaHVua19wdHIgcmVhZF91c2VyX2NodW5rX2ZuKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKK1BOR19FWFBPUlQoODksIHBuZ192b2lkcCwgcG5nX2dldF91c2VyX2NodW5rX3B0ciwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorLyogU2V0cyB0aGUgZnVuY3Rpb24gY2FsbGJhY2tzIGZvciB0aGUgcHVzaCByZWFkZXIsIGFuZCBhIHBvaW50ZXIgdG8gYQorICogdXNlci1kZWZpbmVkIHN0cnVjdHVyZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KKyAqLworUE5HX0VYUE9SVCg5MCwgdm9pZCwgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3ZvaWRwIHByb2dyZXNzaXZlX3B0ciwgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4sCisgICAgcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIgcm93X2ZuLCBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm4pKTsKKworLyogUmV0dXJucyB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVzaCByZWFkIGZ1bmN0aW9ucyAqLworUE5HX0VYUE9SVCg5MSwgcG5nX3ZvaWRwLCBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0ciwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKworLyogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSAqLworUE5HX0VYUE9SVCg5Miwgdm9pZCwgcG5nX3Byb2Nlc3NfZGF0YSwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX3NpemUpKTsKKworLyogQSBmdW5jdGlvbiB3aGljaCBtYXkgYmUgY2FsbGVkICpvbmx5KiB3aXRoaW4gcG5nX3Byb2Nlc3NfZGF0YSB0byBzdG9wIHRoZQorICogcHJvY2Vzc2luZyBvZiBhbnkgbW9yZSBkYXRhLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICogcmVtYWluaW5nLCBleGNsdWRpbmcgYW55IHRoYXQgbGlicG5nIGhhcyBjYWNoZWQgaW50ZXJuYWxseS4gIEEgc3Vic2VxdWVudAorICogY2FsbCB0byBwbmdfcHJvY2Vzc19kYXRhIG11c3Qgc3VwcGx5IHRoZXNlIGJ5dGVzIGFnYWluLiAgSWYgdGhlIGFyZ3VtZW50CisgKiAnc2F2ZScgaXMgc2V0IHRvIHRydWUgdGhlIHJvdXRpbmUgd2lsbCBmaXJzdCBzYXZlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGFuZAorICogd2lsbCBhbHdheXMgcmV0dXJuIDAuCisgKi8KK1BOR19FWFBPUlQoMjE5LCBwbmdfc2l6ZV90LCBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlLCAocG5nX3N0cnVjdHJwLCBpbnQgc2F2ZSkpOworCisvKiBBIGZ1bmN0aW9uIHdoaWNoIG1heSBiZSBjYWxsZWQgKm9ubHkqIG91dHNpZGUgKGFmdGVyKSBhIGNhbGwgdG8KKyAqIHBuZ19wcm9jZXNzX2RhdGEuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBza2lwIGluIHRoZQorICogaW5wdXQuICBOb3JtYWxseSBpdCB3aWxsIHJldHVybiAwLCBidXQgaWYgaXQgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIHRoZQorICogYXBwbGljYXRpb24gbXVzdCBza2lwIHRoYW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGlucHV0IGRhdGEgYW5kIHBhc3MgdGhlCisgKiBmb2xsb3dpbmcgZGF0YSB0byB0aGUgbmV4dCBjYWxsIHRvIHBuZ19wcm9jZXNzX2RhdGEuCisgKi8KK1BOR19FWFBPUlQoMjIwLCBwbmdfdWludF8zMiwgcG5nX3Byb2Nlc3NfZGF0YV9za2lwLCAocG5nX3N0cnVjdHJwKSk7CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKy8qIEZ1bmN0aW9uIHRoYXQgY29tYmluZXMgcm93cy4gICduZXdfcm93JyBpcyBhIGZsYWcgdGhhdCBzaG91bGQgY29tZSBmcm9tCisgKiB0aGUgY2FsbGJhY2sgYW5kIGJlIG5vbi1OVUxMIGlmIGFueXRoaW5nIG5lZWRzIHRvIGJlIGRvbmU7IHRoZSBsaWJyYXJ5CisgKiBzdG9yZXMgaXRzIG93biB2ZXJzaW9uIG9mIHRoZSBuZXcgZGF0YSBpbnRlcm5hbGx5IGFuZCBpZ25vcmVzIHRoZSBwYXNzZWQKKyAqIGluIHZhbHVlLgorICovCitQTkdfRVhQT1JUKDkzLCB2b2lkLCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3csIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYnl0ZXAgb2xkX3JvdywgcG5nX2NvbnN0X2J5dGVwIG5ld19yb3cpKTsKKyNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KKyNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8KKworUE5HX0VYUE9SVEEoOTQsIHBuZ192b2lkcCwgcG5nX21hbGxvYywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSksIFBOR19BTExPQ0FURUQpOworLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8KK1BOR19FWFBPUlRBKDk1LCBwbmdfdm9pZHAsIHBuZ19jYWxsb2MsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLCBQTkdfQUxMT0NBVEVEKTsKKworLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjQgKi8KK1BOR19FWFBPUlRBKDk2LCBwbmdfdm9pZHAsIHBuZ19tYWxsb2Nfd2FybiwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSksIFBOR19BTExPQ0FURUQpOworCisvKiBGcmVlcyBhIHBvaW50ZXIgYWxsb2NhdGVkIGJ5IHBuZ19tYWxsb2MoKSAqLworUE5HX0VYUE9SVCg5Nywgdm9pZCwgcG5nX2ZyZWUsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikpOworCisvKiBGcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGludGVybmFsbHkgKi8KK1BOR19FWFBPUlQoOTgsIHZvaWQsIHBuZ19mcmVlX2RhdGEsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBmcmVlX21lLCBpbnQgbnVtKSk7CisKKy8qIFJlYXNzaWduIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIGV4aXN0aW5nIGRhdGEsIHdoZXRoZXIgYWxsb2NhdGVkCisgKiBieSBsaWJwbmcgb3IgYnkgdGhlIGFwcGxpY2F0aW9uOyB0aGlzIHdvcmtzIG9uIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgcGFzc2VkCisgKiBpbiwgaXQgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3Igb3RoZXIgcG5nX2luZm8gc3RydWN0dXJlcy4KKyAqCisgKiBJdCBpcyB1bmxpa2VseSB0aGF0IHRoaXMgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5IGFzIG9mIDEuNi4wIGFuZCB1c2luZyBpdAorICogbWF5IHJlc3VsdCBlaXRoZXIgaW4gbWVtb3J5IGxlYWtzIG9yIGRvdWJsZSBmcmVlIG9mIGFsbG9jYXRlZCBkYXRhLgorICovCitQTkdfRVhQT1JUQSg5OSwgdm9pZCwgcG5nX2RhdGFfZnJlZXIsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBpbnQgZnJlZXIsIHBuZ191aW50XzMyIG1hc2spLCBQTkdfREVQUkVDQVRFRCk7CisKKy8qIEFzc2lnbm1lbnRzIGZvciBwbmdfZGF0YV9mcmVlciAqLworI2RlZmluZSBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSAxCisjZGVmaW5lIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEgMQorI2RlZmluZSBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSAyCisvKiBGbGFncyBmb3IgcG5nX3B0ci0+ZnJlZV9tZSBhbmQgaW5mb19wdHItPmZyZWVfbWUgKi8KKyNkZWZpbmUgUE5HX0ZSRUVfSElTVCAweDAwMDgKKyNkZWZpbmUgUE5HX0ZSRUVfSUNDUCAweDAwMTAKKyNkZWZpbmUgUE5HX0ZSRUVfU1BMVCAweDAwMjAKKyNkZWZpbmUgUE5HX0ZSRUVfUk9XUyAweDAwNDAKKyNkZWZpbmUgUE5HX0ZSRUVfUENBTCAweDAwODAKKyNkZWZpbmUgUE5HX0ZSRUVfU0NBTCAweDAxMDAKKyNpZmRlZiBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX0ZSRUVfVU5LTiAweDAyMDAKKyNlbmRpZgorLyogICAgICBQTkdfRlJFRV9MSVNUIDB4MDQwMCAgICByZW1vdmVkIGluIDEuNi4wIGJlY2F1c2UgaXQgaXMgaWdub3JlZCAqLworI2RlZmluZSBQTkdfRlJFRV9QTFRFIDB4MTAwMAorI2RlZmluZSBQTkdfRlJFRV9UUk5TIDB4MjAwMAorI2RlZmluZSBQTkdfRlJFRV9URVhUIDB4NDAwMAorI2RlZmluZSBQTkdfRlJFRV9BTEwgIDB4N2ZmZgorI2RlZmluZSBQTkdfRlJFRV9NVUwgIDB4NDIyMCAvKiBQTkdfRlJFRV9TUExUfFBOR19GUkVFX1RFWFR8UE5HX0ZSRUVfVU5LTiAqLworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorUE5HX0VYUE9SVEEoMTAwLCBwbmdfdm9pZHAsIHBuZ19tYWxsb2NfZGVmYXVsdCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSksIFBOR19BTExPQ0FURUQgUE5HX0RFUFJFQ0FURUQpOworUE5HX0VYUE9SVEEoMTAxLCB2b2lkLCBwbmdfZnJlZV9kZWZhdWx0LCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3ZvaWRwIHB0ciksIFBOR19ERVBSRUNBVEVEKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECisvKiBGYXRhbCBlcnJvciBpbiBQTkcgaW1hZ2Ugb2YgbGlicG5nIC0gY2FuJ3QgY29udGludWUgKi8KK1BOR19FWFBPUlRBKDEwMiwgdm9pZCwgcG5nX2Vycm9yLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpLCBQTkdfTk9SRVRVUk4pOworCisvKiBUaGUgc2FtZSwgYnV0IHRoZSBjaHVuayBuYW1lIGlzIHByZXBlbmRlZCB0byB0aGUgZXJyb3Igc3RyaW5nLiAqLworUE5HX0VYUE9SVEEoMTAzLCB2b2lkLCBwbmdfY2h1bmtfZXJyb3IsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSksIFBOR19OT1JFVFVSTik7CisKKyNlbHNlCisvKiBGYXRhbCBlcnJvciBpbiBQTkcgaW1hZ2Ugb2YgbGlicG5nIC0gY2FuJ3QgY29udGludWUgKi8KK1BOR19FWFBPUlRBKDEwNCwgdm9pZCwgcG5nX2VyciwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSwgUE5HX05PUkVUVVJOKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorLyogTm9uLWZhdGFsIGVycm9yIGluIGxpYnBuZy4gIENhbiBjb250aW51ZSwgYnV0IG1heSBoYXZlIGEgcHJvYmxlbS4gKi8KK1BOR19FWFBPUlQoMTA1LCB2b2lkLCBwbmdfd2FybmluZywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKKworLyogTm9uLWZhdGFsIGVycm9yIGluIGxpYnBuZywgY2h1bmsgbmFtZSBpcyBwcmVwZW5kZWQgdG8gbWVzc2FnZS4gKi8KK1BOR19FWFBPUlQoMTA2LCB2b2lkLCBwbmdfY2h1bmtfd2FybmluZywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECisvKiBCZW5pZ24gZXJyb3IgaW4gbGlicG5nLiAgQ2FuIGNvbnRpbnVlLCBidXQgbWF5IGhhdmUgYSBwcm9ibGVtLgorICogVXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdG8gaGFuZGxlIGFzIGEgZmF0YWwgZXJyb3Igb3IgYXMgYSB3YXJuaW5nLiAqLworUE5HX0VYUE9SVCgxMDcsIHZvaWQsIHBuZ19iZW5pZ25fZXJyb3IsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIFNhbWUsIGNodW5rIG5hbWUgaXMgcHJlcGVuZGVkIHRvIG1lc3NhZ2UgKG9ubHkgZHVyaW5nIHJlYWQpICovCitQTkdfRVhQT1JUKDEwOCwgdm9pZCwgcG5nX2NodW5rX2Jlbmlnbl9lcnJvciwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKKyNlbmRpZgorCitQTkdfRVhQT1JUKDEwOSwgdm9pZCwgcG5nX3NldF9iZW5pZ25fZXJyb3JzLAorICAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgaW50IGFsbG93ZWQpKTsKKyNlbHNlCisjICBpZmRlZiBQTkdfQUxMT1dfQkVOSUdOX0VSUk9SUworIyAgICBkZWZpbmUgcG5nX2Jlbmlnbl9lcnJvciBwbmdfd2FybmluZworIyAgICBkZWZpbmUgcG5nX2NodW5rX2Jlbmlnbl9lcnJvciBwbmdfY2h1bmtfd2FybmluZworIyAgZWxzZQorIyAgICBkZWZpbmUgcG5nX2Jlbmlnbl9lcnJvciBwbmdfZXJyb3IKKyMgICAgZGVmaW5lIHBuZ19jaHVua19iZW5pZ25fZXJyb3IgcG5nX2NodW5rX2Vycm9yCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBwbmdfc2V0XzxjaHVuaz4gZnVuY3Rpb25zIGFyZSBmb3Igc3RvcmluZyB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdC4KKyAqIFNpbWlsYXJseSwgdGhlIHBuZ19nZXRfPGNodW5rPiBjYWxscyBhcmUgdXNlZCB0byByZWFkIHZhbHVlcyBmcm9tIHRoZQorICogcG5nX2luZm9fc3RydWN0LCBlaXRoZXIgc3RvcmluZyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgcGFzc2VkIHZhcmlhYmxlcywgb3IKKyAqIHNldHRpbmcgcG9pbnRlcnMgaW50byB0aGUgcG5nX2luZm9fc3RydWN0IHdoZXJlIHRoZSBkYXRhIGlzIHN0b3JlZC4gIFRoZQorICogcG5nX2dldF88Y2h1bms+IGZ1bmN0aW9ucyByZXR1cm4gYSBub24temVybyB2YWx1ZSBpZiB0aGUgZGF0YSB3YXMgYXZhaWxhYmxlCisgKiBpbiBpbmZvX3B0ciwgb3IgcmV0dXJuIHplcm8gYW5kIGRvIG5vdCBjaGFuZ2UgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlmIHRoZQorICogZGF0YSB3YXMgbm90IGF2YWlsYWJsZS4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcG5nX2luZm8KKyAqIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZnV0dXJlIGNoYW5nZXMgaW4gdGhlIHNpemUgYW5kIGludGVybmFsIGxheW91dCBvZgorICogcG5nX2luZm9fc3RydWN0LgorICovCisvKiBSZXR1cm5zICJmbGFnIiBpZiBjaHVuayBkYXRhIGlzIHZhbGlkIGluIGluZm9fcHRyLiAqLworUE5HX0VYUE9SVCgxMTAsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3ZhbGlkLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgZmxhZykpOworCisvKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHRyYW5zZm9ybWVkIHJvdy4gKi8KK1BOR19FWFBPUlQoMTExLCBwbmdfc2l6ZV90LCBwbmdfZ2V0X3Jvd2J5dGVzLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECisvKiBSZXR1cm5zIHJvd19wb2ludGVycywgd2hpY2ggaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2NhbmxpbmVzIHRoYXQgd2FzCisgKiByZXR1cm5lZCBmcm9tIHBuZ19yZWFkX3BuZygpLgorICovCitQTkdfRVhQT1JUKDExMiwgcG5nX2J5dGVwcCwgcG5nX2dldF9yb3dzLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBTZXQgcm93X3BvaW50ZXJzLCB3aGljaCBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMgZm9yIHVzZQorICogYnkgcG5nX3dyaXRlX3BuZygpLgorICovCitQTkdfRVhQT1JUKDExMywgdm9pZCwgcG5nX3NldF9yb3dzLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnMpKTsKKyNlbmRpZgorCisvKiBSZXR1cm5zIG51bWJlciBvZiBjb2xvciBjaGFubmVscyBpbiBpbWFnZS4gKi8KK1BOR19FWFBPUlQoMTE0LCBwbmdfYnl0ZSwgcG5nX2dldF9jaGFubmVscywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworI2lmZGVmIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQKKy8qIFJldHVybnMgaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzLiAqLworUE5HX0VYUE9SVCgxMTUsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2ltYWdlX3dpZHRoLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGhlaWdodCBpbiBwaXhlbHMuICovCitQTkdfRVhQT1JUKDExNiwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0LCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGJpdF9kZXB0aC4gKi8KK1BOR19FWFBPUlQoMTE3LCBwbmdfYnl0ZSwgcG5nX2dldF9iaXRfZGVwdGgsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKKy8qIFJldHVybnMgaW1hZ2UgY29sb3JfdHlwZS4gKi8KK1BOR19FWFBPUlQoMTE4LCBwbmdfYnl0ZSwgcG5nX2dldF9jb2xvcl90eXBlLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGZpbHRlcl90eXBlLiAqLworUE5HX0VYUE9SVCgxMTksIHBuZ19ieXRlLCBwbmdfZ2V0X2ZpbHRlcl90eXBlLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGludGVybGFjZV90eXBlLiAqLworUE5HX0VYUE9SVCgxMjAsIHBuZ19ieXRlLCBwbmdfZ2V0X2ludGVybGFjZV90eXBlLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGNvbXByZXNzaW9uX3R5cGUuICovCitQTkdfRVhQT1JUKDEyMSwgcG5nX2J5dGUsIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgbWV0ZXIsIGZyb20gcEhZcyBjaHVuayBkYXRhLiAqLworUE5HX0VYUE9SVCgxMjIsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CitQTkdfRVhQT1JUKDEyMywgcG5nX3VpbnRfMzIsIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworUE5HX0VYUE9SVCgxMjQsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlciwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBwaXhlbCBhc3BlY3QgcmF0aW8sIGNvbXB1dGVkIGZyb20gcEhZcyBjaHVuayBkYXRhLiAgKi8KK1BOR19GUF9FWFBPUlQoMTI1LCBmbG9hdCwgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8sCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSkKK1BOR19GSVhFRF9FWFBPUlQoMjEwLCBwbmdfZml4ZWRfcG9pbnQsIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpCisKKy8qIFJldHVybnMgaW1hZ2UgeCwgeSBvZmZzZXQgaW4gcGl4ZWxzIG9yIG1pY3JvbnMsIGZyb20gb0ZGcyBjaHVuayBkYXRhLiAqLworUE5HX0VYUE9SVCgxMjYsIHBuZ19pbnRfMzIsIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworUE5HX0VYUE9SVCgxMjcsIHBuZ19pbnRfMzIsIHBuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworUE5HX0VYUE9SVCgxMjgsIHBuZ19pbnRfMzIsIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucywKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKK1BOR19FWFBPUlQoMTI5LCBwbmdfaW50XzMyLCBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKKyNlbmRpZiAvKiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIFJldHVybnMgcG9pbnRlciB0byBzaWduYXR1cmUgc3RyaW5nIHJlYWQgZnJvbSBQTkcgaGVhZGVyICovCitQTkdfRVhQT1JUKDEzMCwgcG5nX2NvbnN0X2J5dGVwLCBwbmdfZ2V0X3NpZ25hdHVyZSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVECitQTkdfRVhQT1JUKDEzMSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfYktHRCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb2xvcl8xNnAgKmJhY2tncm91bmQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVECitQTkdfRVhQT1JUKDEzMiwgdm9pZCwgcG5nX3NldF9iS0dELCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X2NvbG9yXzE2cCBiYWNrZ3JvdW5kKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAorUE5HX0ZQX0VYUE9SVCgxMzMsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2NIUk0sIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBkb3VibGUgKndoaXRlX3gsIGRvdWJsZSAqd2hpdGVfeSwgZG91YmxlICpyZWRfeCwKKyAgICBkb3VibGUgKnJlZF95LCBkb3VibGUgKmdyZWVuX3gsIGRvdWJsZSAqZ3JlZW5feSwgZG91YmxlICpibHVlX3gsCisgICAgZG91YmxlICpibHVlX3kpKQorUE5HX0ZQX0VYUE9SVCgyMzAsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2NIUk1fWFlaLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgZG91YmxlICpyZWRfWCwgZG91YmxlICpyZWRfWSwgZG91YmxlICpyZWRfWiwKKyAgICBkb3VibGUgKmdyZWVuX1gsIGRvdWJsZSAqZ3JlZW5fWSwgZG91YmxlICpncmVlbl9aLCBkb3VibGUgKmJsdWVfWCwKKyAgICBkb3VibGUgKmJsdWVfWSwgZG91YmxlICpibHVlX1opKQorUE5HX0ZJWEVEX0VYUE9SVCgxMzQsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2NIUk1fZml4ZWQsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X3doaXRlX3gsIHBuZ19maXhlZF9wb2ludCAqaW50X3doaXRlX3ksCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX3gsIHBuZ19maXhlZF9wb2ludCAqaW50X3JlZF95LAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX3gsIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX3ksCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX3kpKQorUE5HX0ZJWEVEX0VYUE9SVCgyMzEsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2NIUk1fWFlaX2ZpeGVkLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfWCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX1ksCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX1osIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX1gsCisgICAgcG5nX2ZpeGVkX3BvaW50ICppbnRfZ3JlZW5fWSwgcG5nX2ZpeGVkX3BvaW50ICppbnRfZ3JlZW5fWiwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX1gsIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfWSwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX1opKQorI2VuZGlmCisKKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKK1BOR19GUF9FWFBPUlQoMTM1LCB2b2lkLCBwbmdfc2V0X2NIUk0sIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLAorICAgIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwgZG91YmxlIHJlZF94LCBkb3VibGUgcmVkX3ksIGRvdWJsZSBncmVlbl94LAorICAgIGRvdWJsZSBncmVlbl95LCBkb3VibGUgYmx1ZV94LCBkb3VibGUgYmx1ZV95KSkKK1BOR19GUF9FWFBPUlQoMjMyLCB2b2lkLCBwbmdfc2V0X2NIUk1fWFlaLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgZG91YmxlIHJlZF9YLCBkb3VibGUgcmVkX1ksIGRvdWJsZSByZWRfWiwKKyAgICBkb3VibGUgZ3JlZW5fWCwgZG91YmxlIGdyZWVuX1ksIGRvdWJsZSBncmVlbl9aLCBkb3VibGUgYmx1ZV9YLAorICAgIGRvdWJsZSBibHVlX1ksIGRvdWJsZSBibHVlX1opKQorUE5HX0ZJWEVEX0VYUE9SVCgxMzYsIHZvaWQsIHBuZ19zZXRfY0hSTV9maXhlZCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3ksIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3gsCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeSwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl94LAorICAgIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5feSwgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3gsCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3kpKQorUE5HX0ZJWEVEX0VYUE9SVCgyMzMsIHZvaWQsIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF9YLCBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF9ZLAorICAgIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX1osIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5fWCwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX1ksIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5fWiwKKyAgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfWCwgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX1ksCisgICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX1opKQorI2VuZGlmCisKKyNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKK1BOR19GUF9FWFBPUlQoMTM3LCBwbmdfdWludF8zMiwgcG5nX2dldF9nQU1BLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgZG91YmxlICpmaWxlX2dhbW1hKSkKK1BOR19GSVhFRF9FWFBPUlQoMTM4LCBwbmdfdWludF8zMiwgcG5nX2dldF9nQU1BX2ZpeGVkLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9maWxlX2dhbW1hKSkKKyNlbmRpZgorCisjaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVECitQTkdfRlBfRVhQT1JUKDEzOSwgdm9pZCwgcG5nX3NldF9nQU1BLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpKQorUE5HX0ZJWEVEX0VYUE9SVCgxNDAsIHZvaWQsIHBuZ19zZXRfZ0FNQV9maXhlZCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCBpbnRfZmlsZV9nYW1tYSkpCisjZW5kaWYKKworI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNDEsIHBuZ191aW50XzMyLCBwbmdfZ2V0X2hJU1QsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8xNnAgKmhpc3QpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE0Miwgdm9pZCwgcG5nX3NldF9oSVNULCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X3VpbnRfMTZwIGhpc3QpKTsKKyNlbmRpZgorCitQTkdfRVhQT1JUKDE0MywgcG5nX3VpbnRfMzIsIHBuZ19nZXRfSUhEUiwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyICp3aWR0aCwgcG5nX3VpbnRfMzIgKmhlaWdodCwKKyAgICBpbnQgKmJpdF9kZXB0aCwgaW50ICpjb2xvcl90eXBlLCBpbnQgKmludGVybGFjZV9tZXRob2QsCisgICAgaW50ICpjb21wcmVzc2lvbl9tZXRob2QsIGludCAqZmlsdGVyX21ldGhvZCkpOworCitQTkdfRVhQT1JUKDE0NCwgdm9pZCwgcG5nX3NldF9JSERSLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwKKyAgICBpbnQgY29sb3JfdHlwZSwgaW50IGludGVybGFjZV9tZXRob2QsIGludCBjb21wcmVzc2lvbl9tZXRob2QsCisgICAgaW50IGZpbHRlcl9tZXRob2QpKTsKKworI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNDUsIHBuZ191aW50XzMyLCBwbmdfZ2V0X29GRnMsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsIHBuZ19pbnRfMzIgKm9mZnNldF94LCBwbmdfaW50XzMyICpvZmZzZXRfeSwKKyAgIGludCAqdW5pdF90eXBlKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNDYsIHZvaWQsIHBuZ19zZXRfb0ZGcywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIHBuZ19pbnRfMzIgb2Zmc2V0X3ksCisgICAgaW50IHVuaXRfdHlwZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTQ3LCBwbmdfdWludF8zMiwgcG5nX2dldF9wQ0FMLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NoYXJwICpwdXJwb3NlLCBwbmdfaW50XzMyICpYMCwKKyAgICBwbmdfaW50XzMyICpYMSwgaW50ICp0eXBlLCBpbnQgKm5wYXJhbXMsIHBuZ19jaGFycCAqdW5pdHMsCisgICAgcG5nX2NoYXJwcCAqcGFyYW1zKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNDgsIHZvaWQsIHBuZ19zZXRfcENBTCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF9jaGFycCBwdXJwb3NlLCBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLAorICAgIGludCB0eXBlLCBpbnQgbnBhcmFtcywgcG5nX2NvbnN0X2NoYXJwIHVuaXRzLCBwbmdfY2hhcnBwIHBhcmFtcykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKK1BOR19FWFBPUlQoMTQ5LCBwbmdfdWludF8zMiwgcG5nX2dldF9wSFlzLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgKnJlc194LCBwbmdfdWludF8zMiAqcmVzX3ksCisgICAgaW50ICp1bml0X3R5cGUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE1MCwgdm9pZCwgcG5nX3NldF9wSFlzLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgcmVzX3gsIHBuZ191aW50XzMyIHJlc195LCBpbnQgdW5pdF90eXBlKSk7CisjZW5kaWYKKworUE5HX0VYUE9SVCgxNTEsIHBuZ191aW50XzMyLCBwbmdfZ2V0X1BMVEUsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb2xvcnAgKnBhbGV0dGUsIGludCAqbnVtX3BhbGV0dGUpKTsKKworUE5HX0VYUE9SVCgxNTIsIHZvaWQsIHBuZ19zZXRfUExURSwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF9jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSk7CisKKyNpZmRlZiBQTkdfc0JJVF9TVVBQT1JURUQKK1BOR19FWFBPUlQoMTUzLCBwbmdfdWludF8zMiwgcG5nX2dldF9zQklULCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbG9yXzhwICpzaWdfYml0KSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNTQsIHZvaWQsIHBuZ19zZXRfc0JJVCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF9jb2xvcl84cCBzaWdfYml0KSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNTUsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3NSR0IsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBpbnQgKmZpbGVfc3JnYl9pbnRlbnQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE1Niwgdm9pZCwgcG5nX3NldF9zUkdCLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IHNyZ2JfaW50ZW50KSk7CitQTkdfRVhQT1JUKDE1Nywgdm9pZCwgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0sIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBpbnQgc3JnYl9pbnRlbnQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE1OCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfaUNDUCwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jaGFycHAgbmFtZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAorICAgIHBuZ19ieXRlcHAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgKnByb2ZsZW4pKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE1OSwgdm9pZCwgcG5nX3NldF9pQ0NQLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsIGludCBjb21wcmVzc2lvbl90eXBlLAorICAgIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlLCBwbmdfdWludF8zMiBwcm9mbGVuKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19zUExUX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNjAsIGludCwgcG5nX2dldF9zUExULCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3NQTFRfdHBwIGVudHJpZXMpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE2MSwgdm9pZCwgcG5nX3NldF9zUExULCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X3NQTFRfdHAgZW50cmllcywgaW50IG5lbnRyaWVzKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorLyogcG5nX2dldF90ZXh0IGFsc28gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRleHQgY2h1bmtzIGluICpudW1fdGV4dCAqLworUE5HX0VYUE9SVCgxNjIsIGludCwgcG5nX2dldF90ZXh0LCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3RleHRwICp0ZXh0X3B0ciwgaW50ICpudW1fdGV4dCkpOworI2VuZGlmCisKKy8qIE5vdGUgd2hpbGUgcG5nX3NldF90ZXh0KCkgd2lsbCBhY2NlcHQgYSBzdHJ1Y3R1cmUgd2hvc2UgdGV4dCwKKyAqIGxhbmd1YWdlLCBhbmQgIHRyYW5zbGF0ZWQga2V5d29yZHMgYXJlIE5VTEwgcG9pbnRlcnMsIHRoZSBzdHJ1Y3R1cmUKKyAqIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCB3aWxsIGFsd2F5cyBjb250YWluIHJlZ3VsYXIKKyAqIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MuICBUaGV5IG1pZ2h0IGJlIGVtcHR5IHN0cmluZ3MgYnV0CisgKiB0aGV5IHdpbGwgbmV2ZXIgYmUgTlVMTCBwb2ludGVycy4KKyAqLworCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE2Mywgdm9pZCwgcG5nX3NldF90ZXh0LCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X3RleHRwIHRleHRfcHRyLCBpbnQgbnVtX3RleHQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE2NCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfdElNRSwgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ190aW1lcCAqbW9kX3RpbWUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE2NSwgdm9pZCwgcG5nX3NldF90SU1FLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX2NvbnN0X3RpbWVwIG1vZF90aW1lKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR190Uk5TX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNjYsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3RSTlMsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfYnl0ZXAgKnRyYW5zX2FscGhhLCBpbnQgKm51bV90cmFucywKKyAgICBwbmdfY29sb3JfMTZwICp0cmFuc19jb2xvcikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKK1BOR19FWFBPUlQoMTY3LCB2b2lkLCBwbmdfc2V0X3RSTlMsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfYnl0ZXAgdHJhbnNfYWxwaGEsIGludCBudW1fdHJhbnMsCisgICAgcG5nX2NvbnN0X2NvbG9yXzE2cCB0cmFuc19jb2xvcikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc0NBTF9TVVBQT1JURUQKK1BOR19GUF9FWFBPUlQoMTY4LCBwbmdfdWludF8zMiwgcG5nX2dldF9zQ0FMLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgaW50ICp1bml0LCBkb3VibGUgKndpZHRoLCBkb3VibGUgKmhlaWdodCkpCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQpIHx8IFwKKyAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKKy8qIE5PVEU6IHRoaXMgQVBJIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB1c2luZyBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLAorICogY29uc2VxdWVudGx5IGl0IGNhbiBvbmx5IGJlIHVzZWQgb24gc3lzdGVtcyB3aXRoIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisgKiBJbiBhbnkgY2FzZSB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHN1cHBvcnRlZCBieSBwbmdfZml4ZWRfcG9pbnQgaXMgc21hbGwgYW5kIGl0CisgKiBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBwbmdfZ2V0X3NDQUxfcyBiZSB1c2VkIGluc3RlYWQuCisgKi8KK1BOR19GSVhFRF9FWFBPUlQoMjE0LCBwbmdfdWludF8zMiwgcG5nX2dldF9zQ0FMX2ZpeGVkLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0ciwgaW50ICp1bml0LAorICAgIHBuZ19maXhlZF9wb2ludCAqd2lkdGgsIHBuZ19maXhlZF9wb2ludCAqaGVpZ2h0KSkKKyNlbmRpZgorUE5HX0VYUE9SVCgxNjksIHBuZ191aW50XzMyLCBwbmdfZ2V0X3NDQUxfcywKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIsIGludCAqdW5pdCwKKyAgICBwbmdfY2hhcnBwIHN3aWR0aCwgcG5nX2NoYXJwcCBzaGVpZ2h0KSk7CisKK1BOR19GUF9FWFBPUlQoMTcwLCB2b2lkLCBwbmdfc2V0X3NDQUwsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBpbnQgdW5pdCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSkKK1BOR19GSVhFRF9FWFBPUlQoMjEzLCB2b2lkLCBwbmdfc2V0X3NDQUxfZml4ZWQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LCBwbmdfZml4ZWRfcG9pbnQgd2lkdGgsCisgICBwbmdfZml4ZWRfcG9pbnQgaGVpZ2h0KSkKK1BOR19FWFBPUlQoMTcxLCB2b2lkLCBwbmdfc2V0X3NDQUxfcywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCB1bml0LAorICAgIHBuZ19jb25zdF9jaGFycCBzd2lkdGgsIHBuZ19jb25zdF9jaGFycCBzaGVpZ2h0KSk7CisjZW5kaWYgLyogUE5HX3NDQUxfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorLyogUHJvdmlkZSB0aGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgYWxsIHVua25vd24gY2h1bmtzIG9yLCBvcHRpb25hbGx5LCBmb3IKKyAqIHNwZWNpZmljIHVua25vd24gY2h1bmtzLgorICoKKyAqIE5PVEU6IHByaW9yIHRvIDEuNi4wIHRoZSBoYW5kbGluZyBzcGVjaWZpZWQgZm9yIHBhcnRpY3VsYXIgY2h1bmtzIG9uIHJlYWQgd2FzCisgKiBpZ25vcmVkIGFuZCB0aGUgZGVmYXVsdCB3YXMgdXNlZCwgdGhlIHBlci1jaHVuayBzZXR0aW5nIG9ubHkgaGFkIGFuIGVmZmVjdCBvbgorICogd3JpdGUuICBJZiB5b3Ugd2lzaCB0byBoYXZlIGNodW5rLXNwZWNpZmljIGhhbmRsaW5nIG9uIHJlYWQgaW4gY29kZSB0aGF0IG11c3QKKyAqIHdvcmsgb24gZWFybGllciB2ZXJzaW9ucyB5b3UgbXVzdCB1c2UgYSB1c2VyIGNodW5rIGNhbGxiYWNrIHRvIHNwZWNpZnkgdGhlCisgKiBkZXNpcmVkIGhhbmRsaW5nIChrZWVwIG9yIGRpc2NhcmQuKQorICoKKyAqIFRoZSAna2VlcCcgcGFyYW1ldGVyIGlzIGEgUE5HX0hBTkRMRV9DSFVOS18gdmFsdWUgYXMgbGlzdGVkIGJlbG93LiAgVGhlCisgKiBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKyAqCisgKiBSRUFEOgorICogICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOgorICogICAgICAgS25vd24gY2h1bmtzOiBkbyBub3JtYWwgbGlicG5nIHByb2Nlc3NpbmcsIGRvIG5vdCBrZWVwIHRoZSBjaHVuayAoYnV0CisgKiAgICAgICAgICBzZWUgdGhlIGNvbW1lbnRzIGJlbG93IGFib3V0IFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQpCisgKiAgICAgICBVbmtub3duIGNodW5rczogZm9yIGEgc3BlY2lmaWMgY2h1bmsgdXNlIHRoZSBnbG9iYWwgZGVmYXVsdCwgd2hlbiB1c2VkCisgKiAgICAgICAgICBhcyB0aGUgZGVmYXVsdCBkaXNjYXJkIHRoZSBjaHVuayBkYXRhLgorICogICAgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKKyAqICAgICAgIERpc2NhcmQgdGhlIGNodW5rIGRhdGEuCisgKiAgICBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkU6CisgKiAgICAgICBLZWVwIHRoZSBjaHVuayBkYXRhIGlmIHRoZSBjaHVuayBpcyBub3QgY3JpdGljYWwgZWxzZSByYWlzZSBhIGNodW5rCisgKiAgICAgICBlcnJvci4KKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTOgorICogICAgICAgS2VlcCB0aGUgY2h1bmsgZGF0YS4KKyAqCisgKiBJZiB0aGUgY2h1bmsgZGF0YSBpcyBzYXZlZCBpdCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHBuZ19nZXRfdW5rbm93bl9jaHVua3MsCisgKiBiZWxvdy4gIE5vdGljZSB0aGF0IHNwZWNpZnlpbmcgIkFTX0RFRkFVTFQiIGFzIGEgZ2xvYmFsIGRlZmF1bHQgaXMgZXF1aXZhbGVudAorICogdG8gc3BlY2lmeWluZyAiTkVWRVIiLCBob3dldmVyIHdoZW4gIkFTX0RFRkFVTFQiIGlzIHVzZWQgZm9yIHNwZWNpZmljIGNodW5rcworICogaXQgc2ltcGx5IHJlc2V0cyB0aGUgYmVoYXZpb3IgdG8gdGhlIGxpYnBuZyBkZWZhdWx0LgorICoKKyAqIElOVEVSQUNUSU9OIFdUSUggVVNFUiBDSFVOSyBDQUxMQkFDS1M6CisgKiBUaGUgcGVyLWNodW5rIGhhbmRsaW5nIGlzIGFsd2F5cyB1c2VkIHdoZW4gdGhlcmUgaXMgYSBwbmdfdXNlcl9jaHVua19wdHIKKyAqIGNhbGxiYWNrIGFuZCB0aGUgY2FsbGJhY2sgcmV0dXJucyAwOyB0aGUgY2h1bmsgaXMgdGhlbiBhbHdheXMgc3RvcmVkICp1bmxlc3MqCisgKiBpdCBpcyBjcml0aWNhbCBhbmQgdGhlIHBlci1jaHVuayBzZXR0aW5nIGlzIG90aGVyIHRoYW4gQUxXQVlTLiAgTm90aWNlIHRoYXQKKyAqIHRoZSBnbG9iYWwgZGVmYXVsdCBpcyAqbm90KiB1c2VkIGluIHRoaXMgY2FzZS4gIChJbiBlZmZlY3QgdGhlIHBlci1jaHVuaworICogdmFsdWUgaXMgaW5jcmVtZW50ZWQgdG8gYXQgbGVhc3QgSUZfU0FGRS4pCisgKgorICogSU1QT1JUQU5UIE5PVEU6IHRoaXMgYmVoYXZpb3Igd2lsbCBjaGFuZ2UgaW4gbGlicG5nIDEuNyAtIHRoZSBnbG9iYWwgYW5kCisgKiBwZXItY2h1bmsgZGVmYXVsdHMgd2lsbCBiZSBob25vcmVkLiAgSWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQKKyAqIGJlaGF2aW9yIHdoZW4geW91ciBjYWxsYmFjayByZXR1cm5zIDAgeW91IG11c3Qgc2V0IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRQorICogYXMgdGhlIGRlZmF1bHQgLSBpZiB5b3UgZG9uJ3QgZG8gdGhpcyBsaWJwbmcgMS42IHdpbGwgaXNzdWUgYSB3YXJuaW5nLgorICoKKyAqIElmIHlvdSB3YW50IHVuaGFuZGxlZCB1bmtub3duIGNodW5rcyB0byBiZSBkaXNjYXJkZWQgaW4gbGlicG5nIDEuNiBhbmQKKyAqIGVhcmxpZXIgc2ltcGx5IHJldHVybiAnMScgKGhhbmRsZWQpLgorICoKKyAqIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQ6CisgKiAgICBJZiB0aGlzIGlzICpub3QqIHNldCBrbm93biBjaHVua3Mgd2lsbCBhbHdheXMgYmUgaGFuZGxlZCBieSBsaWJwbmcgYW5kCisgKiAgICB3aWxsIG5ldmVyIGJlIHN0b3JlZCBpbiB0aGUgdW5rbm93biBjaHVuayBsaXN0LiAgS25vd24gY2h1bmtzIGxpc3RlZCB0bworICogICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIHdpbGwgaGF2ZSBubyBlZmZlY3QuICBJZiBpdCBpcyBzZXQgdGhlbiBrbm93bgorICogICAgY2h1bmtzIGxpc3RlZCB3aXRoIGEga2VlcCBvdGhlciB0aGFuIEFTX0RFRkFVTFQgd2lsbCAqbmV2ZXIqIGJlIHByb2Nlc3NlZAorICogICAgYnkgbGlicG5nLCBpbiBhZGRpdGlvbiBjcml0aWNhbCBjaHVua3MgbXVzdCBlaXRoZXIgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorICogICAgY2FsbGJhY2sgb3Igc2F2ZWQuCisgKgorICogICAgVGhlIElIRFIgYW5kIElFTkQgY2h1bmtzIG11c3Qgbm90IGJlIGxpc3RlZC4gIEJlY2F1c2UgdGhpcyB0dXJucyBvZmYgdGhlCisgKiAgICBkZWZhdWx0IGhhbmRsaW5nIGZvciBjaHVua3MgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcmVjb2duaXplZCB0aGUKKyAqICAgIGJlaGF2aW9yIG9mIGxpYnBuZyB0cmFuc2Zvcm1hdGlvbnMgbWF5IHdlbGwgYmVjb21lIGluY29ycmVjdCEKKyAqCisgKiBXUklURToKKyAqICAgIFdoZW4gd3JpdGluZyBjaHVua3MgdGhlIG9wdGlvbnMgb25seSBhcHBseSB0byB0aGUgY2h1bmtzIHNwZWNpZmllZCBieQorICogICAgcG5nX3NldF91bmtub3duX2NodW5rcyAoYmVsb3cpLCBsaWJwbmcgd2lsbCAqYWx3YXlzKiB3cml0ZSBrbm93biBjaHVua3MKKyAqICAgIHJlcXVpcmVkIGJ5IHBuZ19zZXRfIGNhbGxzIGFuZCB3aWxsIGFsd2F5cyB3cml0ZSB0aGUgY29yZSBjcml0aWNhbCBjaHVua3MKKyAqICAgIChhcyByZXF1aXJlZCBmb3IgUExURSkuCisgKgorICogICAgRWFjaCBjaHVuayBpbiB0aGUgcG5nX3NldF91bmtub3duX2NodW5rcyBsaXN0IGlzIGxvb2tlZCB1cCBpbiB0aGUKKyAqICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyBsaXN0IHRvIGZpbmQgdGhlIGtlZXAgc2V0dGluZywgdGhpcyBpcyB0aGVuCisgKiAgICBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICoKKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKKyAqICAgICAgIFdyaXRlIHNhZmUtdG8tY29weSBjaHVua3MgYW5kIHdyaXRlIG90aGVyIGNodW5rcyBpZiB0aGUgZ2xvYmFsCisgKiAgICAgICBkZWZhdWx0IGlzIHNldCB0byBfQUxXQVlTLCBvdGhlcndpc2UgZG9uJ3Qgd3JpdGUgdGhpcyBjaHVuay4KKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVI6CisgKiAgICAgICBEbyBub3Qgd3JpdGUgdGhlIGNodW5rLgorICogICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFOgorICogICAgICAgV3JpdGUgdGhlIGNodW5rIGlmIGl0IGlzIHNhZmUtdG8tY29weSwgb3RoZXJ3aXNlIGRvIG5vdCB3cml0ZSBpdC4KKyAqICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTOgorICogICAgICAgV3JpdGUgdGhlIGNodW5rLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBlZmZlY3RpdmVseSB0aGUgb3Bwb3NpdGUgb2YgdGhlIHJlYWQgY2FzZSAtCisgKiBpbiByZWFkIHVua25vd24gY2h1bmtzIGFyZSBub3Qgc3RvcmVkIGJ5IGRlZmF1bHQsIGluIHdyaXRlIHRoZXkgYXJlIHdyaXR0ZW4KKyAqIGJ5IGRlZmF1bHQuICBBbHNvIHRoZSBiZWhhdmlvciBvZiBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgaXMgdmVyeSBkaWZmZXJlbnQKKyAqIC0gb24gd3JpdGUgdGhlIHNhZmUtdG8tY29weSBiaXQgaXMgY2hlY2tlZCwgb24gcmVhZCB0aGUgY3JpdGljYWwgYml0IGlzCisgKiBjaGVja2VkIGFuZCBvbiByZWFkIGlmIHRoZSBjaHVuayBpcyBjcml0aWNhbCBhbiBlcnJvciB3aWxsIGJlIHJhaXNlZC4KKyAqCisgKiBudW1fY2h1bmtzOgorICogPT09PT09PT09PT0KKyAqICAgIElmIG51bV9jaHVua3MgaXMgcG9zaXRpdmUsIHRoZW4gdGhlICJrZWVwIiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBtYW5uZXIKKyAqICAgIGZvciBoYW5kbGluZyBvbmx5IHRob3NlIGNodW5rcyBhcHBlYXJpbmcgaW4gdGhlIGNodW5rX2xpc3QgYXJyYXksCisgKiAgICBvdGhlcndpc2UgdGhlIGNodW5rIGxpc3QgYXJyYXkgaXMgaWdub3JlZC4KKyAqCisgKiAgICBJZiBudW1fY2h1bmtzIGlzIDAgdGhlICJrZWVwIiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvcgorICogICAgdW5rbm93biBjaHVua3MsIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqCisgKiAgICBJZiBudW1fY2h1bmtzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSAia2VlcCIgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbWFubmVyCisgKiAgICBmb3IgaGFuZGxpbmcgYWxsIHVua25vd24gY2h1bmtzIHBsdXMgYWxsIGNodW5rcyByZWNvZ25pemVkIGJ5IGxpYnBuZworICogICAgZXhjZXB0IGZvciB0aGUgSUhEUiwgUExURSwgdFJOUywgSURBVCwgYW5kIElFTkQgY2h1bmtzICh3aGljaCBjb250aW51ZSB0bworICogICAgYmUgcHJvY2Vzc2VkIGJ5IGxpYnBuZy4KKyAqLworUE5HX0VYUE9SVCgxNzIsIHZvaWQsIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIGludCBrZWVwLCBwbmdfY29uc3RfYnl0ZXAgY2h1bmtfbGlzdCwgaW50IG51bV9jaHVua3MpKTsKKworLyogVGhlICJrZWVwIiBQTkdfSEFORExFX0NIVU5LXyBwYXJhbWV0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY2h1bmsgaXMgcmV0dXJuZWQ7CisgKiB0aGUgcmVzdWx0IGlzIHRoZXJlZm9yZSB0cnVlIChub24temVybykgaWYgc3BlY2lhbCBoYW5kbGluZyBpcyByZXF1aXJlZCwKKyAqIGZhbHNlIGZvciB0aGUgZGVmYXVsdCBoYW5kbGluZy4KKyAqLworUE5HX0VYUE9SVCgxNzMsIGludCwgcG5nX2hhbmRsZV9hc191bmtub3duLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2J5dGVwIGNodW5rX25hbWUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgxNzQsIHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua3MsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdW5rbm93bl9jaHVua3AgdW5rbm93bnMsCisgICAgaW50IG51bV91bmtub3ducykpOworICAgLyogTk9URTogcHJpb3IgdG8gMS42LjAgdGhpcyByb3V0aW5lIHNldCB0aGUgJ2xvY2F0aW9uJyBmaWVsZCBvZiB0aGUgYWRkZWQKKyAgICAqIHVua25vd25zIHRvIHRoZSBsb2NhdGlvbiBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBwbmdfc3RydWN0LiAgVGhpcyBpcworICAgICogaW52YXJpYWJseSB0aGUgd3JvbmcgdmFsdWUgb24gd3JpdGUuICBUbyBmaXggdGhpcyBjYWxsIHRoZSBmb2xsb3dpbmcgQVBJCisgICAgKiBmb3IgZWFjaCBjaHVuayBpbiB0aGUgbGlzdCB3aXRoIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiAgSWYgeW91IGtub3cgeW91cgorICAgICogY29kZSB3b24ndCBiZSBjb21waWxlZCBvbiBlYXJsaWVyIHZlcnNpb25zIHlvdSBjYW4gcmVseSBvbgorICAgICogcG5nX3NldF91bmtub3duX2NodW5rcyh3cml0ZS1wdHIsIHBuZ19nZXRfdW5rbm93bl9jaHVua3MocmVhZC1wdHIpKSBkb2luZworICAgICogdGhlIGNvcnJlY3QgdGhpbmcuCisgICAgKi8KKworUE5HX0VYUE9SVCgxNzUsIHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbiwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19pbmZvcnAgaW5mb19wdHIsIGludCBjaHVuaywgaW50IGxvY2F0aW9uKSk7CisKK1BOR19FWFBPUlQoMTc2LCBpbnQsIHBuZ19nZXRfdW5rbm93bl9jaHVua3MsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdW5rbm93bl9jaHVua3BwIGVudHJpZXMpKTsKKyNlbmRpZgorCisvKiBQbmdfZnJlZV9kYXRhKCkgd2lsbCB0dXJuIG9mZiB0aGUgInZhbGlkIiBmbGFnIGZvciBhbnl0aGluZyBpdCBmcmVlcy4KKyAqIElmIHlvdSBuZWVkIHRvIHR1cm4gaXQgb2ZmIGZvciBhIGNodW5rIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBoYXMgZnJlZWQsCisgKiB5b3UgY2FuIHVzZSBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX0NITkspOworICovCitQTkdfRVhQT1JUKDE3Nywgdm9pZCwgcG5nX3NldF9pbnZhbGlkLCAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgaW50IG1hc2spKTsKKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorLyogVGhlICJwYXJhbXMiIHBvaW50ZXIgaXMgY3VycmVudGx5IG5vdCB1c2VkIGFuZCBpcyBmb3IgZnV0dXJlIGV4cGFuc2lvbi4gKi8KK1BOR19FWFBPUlQoMTc4LCB2b2lkLCBwbmdfcmVhZF9wbmcsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBpbnQgdHJhbnNmb3JtcywgcG5nX3ZvaWRwIHBhcmFtcykpOworUE5HX0VYUE9SVCgxNzksIHZvaWQsIHBuZ193cml0ZV9wbmcsIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2luZm9ycCBpbmZvX3B0ciwKKyAgICBpbnQgdHJhbnNmb3JtcywgcG5nX3ZvaWRwIHBhcmFtcykpOworI2VuZGlmCisKK1BOR19FWFBPUlQoMTgwLCBwbmdfY29uc3RfY2hhcnAsIHBuZ19nZXRfY29weXJpZ2h0LAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworUE5HX0VYUE9SVCgxODEsIHBuZ19jb25zdF9jaGFycCwgcG5nX2dldF9oZWFkZXJfdmVyLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworUE5HX0VYUE9SVCgxODIsIHBuZ19jb25zdF9jaGFycCwgcG5nX2dldF9oZWFkZXJfdmVyc2lvbiwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMTgzLCBwbmdfY29uc3RfY2hhcnAsIHBuZ19nZXRfbGlicG5nX3ZlciwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKworI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE4NCwgcG5nX3VpbnRfMzIsIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3VpbnRfMzIgbW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCkpOworI2VuZGlmCisKKy8qIEZvciB1c2UgaW4gcG5nX3NldF9rZWVwX3Vua25vd24sIGFkZGVkIHRvIHZlcnNpb24gMS4yLjYgKi8KKyNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUICAgMAorI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX05FVkVSICAgICAgICAxCisjZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAgICAgIDIKKyNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMworI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0xBU1QgICAgICAgICA0CisKKy8qIFN0cmlwIHRoZSBwcmVwZW5kZWQgZXJyb3IgbnVtYmVycyAoIiNubm4gIikgZnJvbSBlcnJvciBhbmQgd2FybmluZworICogbWVzc2FnZXMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZXJyb3Igb3Igd2FybmluZyBoYW5kbGVyLgorICovCisjaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE4NSwgdm9pZCwgcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX3VpbnRfMzIgc3RyaXBfbW9kZSkpOworI2VuZGlmCisKKy8qIEFkZGVkIGluIGxpYnBuZy0xLjIuNiAqLworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE4Niwgdm9pZCwgcG5nX3NldF91c2VyX2xpbWl0cywgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIHVzZXJfd2lkdGhfbWF4LCBwbmdfdWludF8zMiB1c2VyX2hlaWdodF9tYXgpKTsKK1BOR19FWFBPUlQoMTg3LCBwbmdfdWludF8zMiwgcG5nX2dldF91c2VyX3dpZHRoX21heCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKK1BOR19FWFBPUlQoMTg4LCBwbmdfdWludF8zMiwgcG5nX2dldF91c2VyX2hlaWdodF9tYXgsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyKSk7CisvKiBBZGRlZCBpbiBsaWJwbmctMS40LjAgKi8KK1BOR19FWFBPUlQoMTg5LCB2b2lkLCBwbmdfc2V0X2NodW5rX2NhY2hlX21heCwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfY2FjaGVfbWF4KSk7CitQTkdfRVhQT1JUKDE5MCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4LAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworLyogQWRkZWQgaW4gbGlicG5nLTEuNC4xICovCitQTkdfRVhQT1JUKDE5MSwgdm9pZCwgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4LCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX2NhY2hlX21heCkpOworUE5HX0VYUE9SVCgxOTIsIHBuZ19hbGxvY19zaXplX3QsIHBuZ19nZXRfY2h1bmtfbWFsbG9jX21heCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpCitQTkdfRVhQT1JUKDE5MywgcG5nX3VpbnRfMzIsIHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpOworCitQTkdfRVhQT1JUKDE5NCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gsCisgICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyKSk7CisKK1BOR19FWFBPUlQoMTk1LCBwbmdfdWludF8zMiwgcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaCwKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKTsKKworUE5HX0ZQX0VYUE9SVCgxOTYsIGZsb2F0LCBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcywKKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgLyogb3RoZXJ3aXNlIG5vdCBpbXBsZW1lbnRlZC4gKi8KK1BOR19GSVhFRF9FWFBPUlQoMjExLCBwbmdfZml4ZWRfcG9pbnQsIHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzX2ZpeGVkLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpCisjZW5kaWYKKworUE5HX0ZQX0VYUE9SVCgxOTcsIGZsb2F0LCBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlcywgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9pbmZvcnAgaW5mb19wdHIpKQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgLyogb3RoZXJ3aXNlIG5vdCBpbXBsZW1lbnRlZC4gKi8KK1BOR19GSVhFRF9FWFBPUlQoMjEyLCBwbmdfZml4ZWRfcG9pbnQsIHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzX2ZpeGVkLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2luZm9ycCBpbmZvX3B0cikpCisjZW5kaWYKKworIyAgaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE5OCwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfcEhZc19kcGksIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiAqcmVzX3gsIHBuZ191aW50XzMyICpyZXNfeSwKKyAgICBpbnQgKnVuaXRfdHlwZSkpOworIyAgZW5kaWYgLyogUE5HX3BIWXNfU1VQUE9SVEVEICovCisjZW5kaWYgIC8qIFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCAqLworCisvKiBBZGRlZCBpbiBsaWJwbmctMS40LjAgKi8KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECitQTkdfRVhQT1JUKDE5OSwgcG5nX3VpbnRfMzIsIHBuZ19nZXRfaW9fc3RhdGUsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBSZW1vdmVkIGZyb20gbGlicG5nIDEuNjsgdXNlIHBuZ19nZXRfaW9fY2h1bmtfdHlwZS4gKi8KK1BOR19SRU1PVkVEKDIwMCwgcG5nX2NvbnN0X2J5dGVwLCBwbmdfZ2V0X2lvX2NodW5rX25hbWUsIChwbmdfc3RydWN0cnAgcG5nX3B0ciksCisgICAgUE5HX0RFUFJFQ0FURUQpCisKK1BOR19FWFBPUlQoMjE2LCBwbmdfdWludF8zMiwgcG5nX2dldF9pb19jaHVua190eXBlLAorICAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikpOworCisvKiBUaGUgZmxhZ3MgcmV0dXJuZWQgYnkgcG5nX2dldF9pb19zdGF0ZSgpIGFyZSB0aGUgZm9sbG93aW5nOiAqLworIyAgZGVmaW5lIFBOR19JT19OT05FICAgICAgICAweDAwMDAgICAvKiBubyBJL08gYXQgdGhpcyBtb21lbnQgKi8KKyMgIGRlZmluZSBQTkdfSU9fUkVBRElORyAgICAgMHgwMDAxICAgLyogY3VycmVudGx5IHJlYWRpbmcgKi8KKyMgIGRlZmluZSBQTkdfSU9fV1JJVElORyAgICAgMHgwMDAyICAgLyogY3VycmVudGx5IHdyaXRpbmcgKi8KKyMgIGRlZmluZSBQTkdfSU9fU0lHTkFUVVJFICAgMHgwMDEwICAgLyogY3VycmVudGx5IGF0IHRoZSBmaWxlIHNpZ25hdHVyZSAqLworIyAgZGVmaW5lIFBOR19JT19DSFVOS19IRFIgICAweDAwMjAgICAvKiBjdXJyZW50bHkgYXQgdGhlIGNodW5rIGhlYWRlciAqLworIyAgZGVmaW5lIFBOR19JT19DSFVOS19EQVRBICAweDAwNDAgICAvKiBjdXJyZW50bHkgYXQgdGhlIGNodW5rIGRhdGEgKi8KKyMgIGRlZmluZSBQTkdfSU9fQ0hVTktfQ1JDICAgMHgwMDgwICAgLyogY3VycmVudGx5IGF0IHRoZSBjaHVuayBjcmMgKi8KKyMgIGRlZmluZSBQTkdfSU9fTUFTS19PUCAgICAgMHgwMDBmICAgLyogY3VycmVudCBvcGVyYXRpb246IHJlYWRpbmcvd3JpdGluZyAqLworIyAgZGVmaW5lIFBOR19JT19NQVNLX0xPQyAgICAweDAwZjAgICAvKiBjdXJyZW50IGxvY2F0aW9uOiBzaWcvaGRyL2RhdGEvY3JjICovCisjZW5kaWYgLyogP1BOR19JT19TVEFURV9TVVBQT1JURUQgKi8KKworLyogSW50ZXJsYWNlIHN1cHBvcnQuICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgYWx3YXlzIGRlZmluZWQgc28gdGhhdCBpZgorICogbGlicG5nIGludGVybGFjZSBoYW5kbGluZyBpcyB0dXJuZWQgb2ZmIHRoZSBtYWNyb3MgbWF5IGJlIHVzZWQgdG8gaGFuZGxlCisgKiBpbnRlcmxhY2VkIGltYWdlcyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLgorICovCisjZGVmaW5lIFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTIDcKKworLyogVHdvIG1hY3JvcyB0byByZXR1cm4gdGhlIGZpcnN0IHJvdyBhbmQgZmlyc3QgY29sdW1uIG9mIHRoZSBvcmlnaW5hbCwKKyAqIGZ1bGwsIGltYWdlIHdoaWNoIGFwcGVhcnMgaW4gYSBnaXZlbiBwYXNzLiAgJ3Bhc3MnIGlzIGluIHRoZSByYW5nZSAwCisgKiB0byA2IGFuZCB0aGUgcmVzdWx0IGlzIGluIHRoZSByYW5nZSAwIHRvIDcuCisgKi8KKyNkZWZpbmUgUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpICgoKDEmfihwYXNzKSk8PCgzLSgocGFzcyk+PjEpKSkmNykKKyNkZWZpbmUgUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpICgoKDEmIChwYXNzKSk8PCgzLSgoKHBhc3MpKzEpPj4xKSkpJjcpCisKKy8qIEEgbWFjcm8gdG8gcmV0dXJuIHRoZSBvZmZzZXQgYmV0d2VlbiBwaXhlbHMgaW4gdGhlIG91dHB1dCByb3cgZm9yIGEgcGFpciBvZgorICogcGl4ZWxzIGluIHRoZSBpbnB1dCAtIGVmZmVjdGl2ZWx5IHRoZSBpbnZlcnNlIG9mIHRoZSAnQ09MX1NISUZUJyBtYWNybyB0aGF0CisgKiBmb2xsb3dzLiAgTm90ZSB0aGF0IFJPV19PRkZTRVQgaXMgdGhlIG9mZnNldCBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQgd2hlcmVhcworICogQ09MX09GRlNFVCBpcyBmcm9tIG9uZSBjb2x1bW4gdG8gdGhlIG5leHQsIHdpdGhpbiBhIHJvdy4KKyAqLworI2RlZmluZSBQTkdfUEFTU19ST1dfT0ZGU0VUKHBhc3MpICgocGFzcyk+Mj8oOD4+KCgocGFzcyktMSk+PjEpKTo4KQorI2RlZmluZSBQTkdfUEFTU19DT0xfT0ZGU0VUKHBhc3MpICgxPDwoKDctKHBhc3MpKT4+MSkpCisKKy8qIFR3byBtYWNyb3MgdG8gaGVscCBldmFsdWF0ZSB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgY29sdW1ucyBpbiBlYWNoCisgKiBwYXNzLiAgVGhpcyBpcyBleHByZXNzZWQgYXMgYSBzaGlmdCAtIGVmZmVjdGl2ZWx5IGxvZzIgb2YgdGhlIG51bWJlciBvcgorICogcm93cyBvciBjb2x1bW5zIGluIGVhY2ggOHg4IHRpbGUgb2YgdGhlIG9yaWdpbmFsIGltYWdlLgorICovCisjZGVmaW5lIFBOR19QQVNTX1JPV19TSElGVChwYXNzKSAoKHBhc3MpPjI/KDgtKHBhc3MpKT4+MTozKQorI2RlZmluZSBQTkdfUEFTU19DT0xfU0hJRlQocGFzcykgKChwYXNzKT4xPyg3LShwYXNzKSk+PjE6MykKKworLyogSGVuY2UgdHdvIG1hY3JvcyB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb3dzIG9yIGNvbHVtbnMgaW4gYSBnaXZlbgorICogcGFzcyBvZiBhbiBpbWFnZSBnaXZlbiBpdHMgaGVpZ2h0IG9yIHdpZHRoLiAgSW4gZmFjdCB0aGVzZSBtYWNyb3MgbWF5CisgKiByZXR1cm4gbm9uLXplcm8gZXZlbiB0aG91Z2ggdGhlIHN1Yi1pbWFnZSBpcyBlbXB0eSwgYmVjYXVzZSB0aGUgb3RoZXIKKyAqIGRpbWVuc2lvbiBtYXkgYmUgZW1wdHkgZm9yIGEgc21hbGwgaW1hZ2UuCisgKi8KKyNkZWZpbmUgUE5HX1BBU1NfUk9XUyhoZWlnaHQsIHBhc3MpICgoKGhlaWdodCkrKCgoMTw8UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKVwKKyAgIC0xKS1QTkdfUEFTU19TVEFSVF9ST1cocGFzcykpKT4+UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKQorI2RlZmluZSBQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSAoKCh3aWR0aCkrKCgoMTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKVwKKyAgIC0xKS1QTkdfUEFTU19TVEFSVF9DT0wocGFzcykpKT4+UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKQorCisvKiBGb3IgdGhlIHJlYWRlciByb3cgY2FsbGJhY2tzIChib3RoIHByb2dyZXNzaXZlIGFuZCBzZXF1ZW50aWFsKSBpdCBpcworICogbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIHJvdyBpbiB0aGUgb3V0cHV0IGltYWdlIGdpdmVuIGEgcm93IGluIGFuIGludGVybGFjZWQKKyAqIGltYWdlLCBzbyB0d28gbW9yZSBtYWNyb3M6CisgKi8KKyNkZWZpbmUgUE5HX1JPV19GUk9NX1BBU1NfUk9XKHlfaW4sIHBhc3MpIFwKKyAgICgoKHlfaW4pPDxQTkdfUEFTU19ST1dfU0hJRlQocGFzcykpK1BOR19QQVNTX1NUQVJUX1JPVyhwYXNzKSkKKyNkZWZpbmUgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKHhfaW4sIHBhc3MpIFwKKyAgICgoKHhfaW4pPDxQTkdfUEFTU19DT0xfU0hJRlQocGFzcykpK1BOR19QQVNTX1NUQVJUX0NPTChwYXNzKSkKKworLyogVHdvIG1hY3JvcyB3aGljaCByZXR1cm4gYSBib29sZWFuICgwIG9yIDEpIHNheWluZyB3aGV0aGVyIHRoZSBnaXZlbiByb3cKKyAqIG9yIGNvbHVtbiBpcyBpbiBhIHBhcnRpY3VsYXIgcGFzcy4gIFRoZXNlIHVzZSBhIGNvbW1vbiB1dGlsaXR5IG1hY3JvIHRoYXQKKyAqIHJldHVybnMgYSBtYXNrIGZvciBhIGdpdmVuIHBhc3MgLSB0aGUgb2Zmc2V0ICdvZmYnIHNlbGVjdHMgdGhlIHJvdyBvcgorICogY29sdW1uIHZlcnNpb24uICBUaGUgbWFzayBoYXMgdGhlIGFwcHJvcHJpYXRlIGJpdCBzZXQgZm9yIGVhY2ggY29sdW1uIGluCisgKiB0aGUgdGlsZS4KKyAqLworI2RlZmluZSBQTkdfUEFTU19NQVNLKHBhc3Msb2ZmKSAoIFwKKyAgICgoMHgxMTAxNDVBRj4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGKSB8IFwKKyAgICgoMHgwMTE0NUFGMD4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGMCkpCisKKyNkZWZpbmUgUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBwYXNzKSBcCisgICAoKFBOR19QQVNTX01BU0socGFzcywwKSA+PiAoKHkpJjcpKSAmIDEpCisjZGVmaW5lIFBOR19DT0xfSU5fSU5URVJMQUNFX1BBU1MoeCwgcGFzcykgXAorICAgKChQTkdfUEFTU19NQVNLKHBhc3MsMSkgPj4gKCh4KSY3KSkgJiAxKQorCisjaWZkZWYgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRAorLyogV2l0aCB0aGVzZSByb3V0aW5lcyB3ZSBhdm9pZCBhbiBpbnRlZ2VyIGRpdmlkZSwgd2hpY2ggd2lsbCBiZSBzbG93ZXIgb24KKyAqIG1vc3QgbWFjaGluZXMuICBIb3dldmVyLCBpdCBkb2VzIHRha2UgbW9yZSBvcGVyYXRpb25zIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRpdmlkZSBtZXRob2QsIHNvIGl0IG1heSBiZSBzbG93ZXIgb24gYSBmZXcgUklTQyBzeXN0ZW1zLiAgVGhlcmUgYXJlIHR3bworICogc2hpZnRzIChieSA4IG9yIDE2IGJpdHMpIGFuZCBhbiBhZGRpdGlvbiwgdmVyc3VzIGEgc2luZ2xlIGludGVnZXIgZGl2aWRlLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcm91bmRpbmcgZmFjdG9ycyBhcmUgTk9UIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lISAgMTI4IGFuZAorICogMzI3NjggYXJlIGNvcnJlY3QgZm9yIHRoZSBOT0RJViBjb2RlOyAxMjcgYW5kIDMyNzY3IGFyZSBjb3JyZWN0IGZvciB0aGUKKyAqIHN0YW5kYXJkIG1ldGhvZC4KKyAqCisgKiBbT3B0aW1pemVkIGNvZGUgYnkgR3JlZyBSb2Vsb2ZzIGFuZCBNYXJrIEFkbGVyLi4uYmxhbWUgdXMgZm9yIGJ1Z3MuIDotKSBdCisgKi8KKworIC8qIGZnIGFuZCBiZyBzaG91bGQgYmUgaW4gYGdhbW1hIDEuMCcgc3BhY2U7IGFscGhhIGlzIHRoZSBvcGFjaXR5ICovCisKKyMgIGRlZmluZSBwbmdfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICBcCisgICAgIHsgcG5nX3VpbnRfMTYgdGVtcCA9IChwbmdfdWludF8xNikoKHBuZ191aW50XzE2KShmZykgXAorICAgICAgICAgICAqIChwbmdfdWludF8xNikoYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKyAocG5nX3VpbnRfMTYpKGJnKSoocG5nX3VpbnRfMTYpKDI1NSAgICAgICAgICBcCisgICAgICAgICAgIC0gKHBuZ191aW50XzE2KShhbHBoYSkpICsgMTI4KTsgICAgICAgICAgICAgICAgXAorICAgICAgIChjb21wb3NpdGUpID0gKHBuZ19ieXRlKSgodGVtcCArICh0ZW1wID4+IDgpKSA+PiA4KTsgfQorCisjICBkZWZpbmUgcG5nX2NvbXBvc2l0ZV8xNihjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgIFwKKyAgICAgeyBwbmdfdWludF8zMiB0ZW1wID0gKHBuZ191aW50XzMyKSgocG5nX3VpbnRfMzIpKGZnKSAgXAorICAgICAgICAgICAqIChwbmdfdWludF8zMikoYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICsgKHBuZ191aW50XzMyKShiZykqKDY1NTM1ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgLSAocG5nX3VpbnRfMzIpKGFscGhhKSkgKyAzMjc2OCk7ICAgICAgICAgICAgICAgXAorICAgICAgIChjb21wb3NpdGUpID0gKHBuZ191aW50XzE2KSgodGVtcCArICh0ZW1wID4+IDE2KSkgPj4gMTYpOyB9CisKKyNlbHNlICAvKiBTdGFuZGFyZCBtZXRob2QgdXNpbmcgaW50ZWdlciBkaXZpc2lvbiAqLworCisjICBkZWZpbmUgcG5nX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChjb21wb3NpdGUpID0gKHBuZ19ieXRlKSgoKHBuZ191aW50XzE2KShmZykgKiAocG5nX3VpbnRfMTYpKGFscGhhKSArICBcCisgICAgIChwbmdfdWludF8xNikoYmcpICogKHBuZ191aW50XzE2KSgyNTUgLSAocG5nX3VpbnRfMTYpKGFscGhhKSkgKyAgICAgICBcCisgICAgIDEyNykgLyAyNTUpCisKKyMgIGRlZmluZSBwbmdfY29tcG9zaXRlXzE2KGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoY29tcG9zaXRlKSA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8zMikoZmcpICogKHBuZ191aW50XzMyKShhbHBoYSkgKyBcCisgICAgIChwbmdfdWludF8zMikoYmcpKihwbmdfdWludF8zMikoNjU1MzUgLSAocG5nX3VpbnRfMzIpKGFscGhhKSkgKyAgICAgICAgIFwKKyAgICAgMzI3NjcpIC8gNjU1MzUpCisjZW5kaWYgLyogUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKK1BOR19FWFBPUlQoMjAxLCBwbmdfdWludF8zMiwgcG5nX2dldF91aW50XzMyLCAocG5nX2NvbnN0X2J5dGVwIGJ1ZikpOworUE5HX0VYUE9SVCgyMDIsIHBuZ191aW50XzE2LCBwbmdfZ2V0X3VpbnRfMTYsIChwbmdfY29uc3RfYnl0ZXAgYnVmKSk7CitQTkdfRVhQT1JUKDIwMywgcG5nX2ludF8zMiwgcG5nX2dldF9pbnRfMzIsIChwbmdfY29uc3RfYnl0ZXAgYnVmKSk7CisjZW5kaWYKKworUE5HX0VYUE9SVCgyMDQsIHBuZ191aW50XzMyLCBwbmdfZ2V0X3VpbnRfMzEsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfYnl0ZXAgYnVmKSk7CisvKiBObyBwbmdfZ2V0X2ludF8xNiAtLSBtYXkgYmUgYWRkZWQgaWYgdGhlcmUncyBhIHJlYWwgbmVlZCBmb3IgaXQuICovCisKKy8qIFBsYWNlIGEgMzItYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyIChiaWctZW5kaWFuKS4gKi8KKyNpZmRlZiBQTkdfV1JJVEVfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKK1BOR19FWFBPUlQoMjA1LCB2b2lkLCBwbmdfc2F2ZV91aW50XzMyLCAocG5nX2J5dGVwIGJ1ZiwgcG5nX3VpbnRfMzIgaSkpOworI2VuZGlmCisjaWZkZWYgUE5HX1NBVkVfSU5UXzMyX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgyMDYsIHZvaWQsIHBuZ19zYXZlX2ludF8zMiwgKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkpOworI2VuZGlmCisKKy8qIFBsYWNlIGEgMTYtYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLgorICogVGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB1bnNpZ25lZCBpbnQsIG5vdCBwbmdfdWludF8xNiwKKyAqIGp1c3QgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9uIHByZS1BTlNJIEMgY29tcGlsZXJzLgorICovCisjaWZkZWYgUE5HX1dSSVRFX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVECitQTkdfRVhQT1JUKDIwNywgdm9pZCwgcG5nX3NhdmVfdWludF8xNiwgKHBuZ19ieXRlcCBidWYsIHVuc2lnbmVkIGludCBpKSk7CisvKiBObyBwbmdfc2F2ZV9pbnRfMTYgLS0gbWF5IGJlIGFkZGVkIGlmIHRoZXJlJ3MgYSByZWFsIG5lZWQgZm9yIGl0LiAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFX1JFQURfTUFDUk9TCisvKiBJbmxpbmUgbWFjcm9zIHRvIGRvIGRpcmVjdCByZWFkcyBvZiBieXRlcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIuCisgKiBUaGUgcG5nX2dldF9pbnRfMzIoKSByb3V0aW5lIGFzc3VtZXMgd2UgYXJlIHVzaW5nIHR3bydzIGNvbXBsZW1lbnQKKyAqIGZvcm1hdCBmb3IgbmVnYXRpdmUgdmFsdWVzLCB3aGljaCBpcyBhbG1vc3QgY2VydGFpbmx5IHRydWUuCisgKi8KKyMgIGRlZmluZSBQTkdfZ2V0X3VpbnRfMzIoYnVmKSBcCisgICAgICgoKHBuZ191aW50XzMyKSgqKGJ1ZikpIDw8IDI0KSArIFwKKyAgICAgICgocG5nX3VpbnRfMzIpKCooKGJ1ZikgKyAxKSkgPDwgMTYpICsgXAorICAgICAgKChwbmdfdWludF8zMikoKigoYnVmKSArIDIpKSA8PCA4KSArIFwKKyAgICAgICgocG5nX3VpbnRfMzIpKCooKGJ1ZikgKyAzKSkpKQorCisgICAvKiBGcm9tIGxpYnBuZy0xLjQuMCB1bnRpbCAxLjQuNCwgdGhlIHBuZ19nZXRfdWludF8xNiBtYWNybyAoYnV0IG5vdCB0aGUKKyAgICAqIGZ1bmN0aW9uKSBpbmNvcnJlY3RseSByZXR1cm5lZCBhIHZhbHVlIG9mIHR5cGUgcG5nX3VpbnRfMzIuCisgICAgKi8KKyMgIGRlZmluZSBQTkdfZ2V0X3VpbnRfMTYoYnVmKSBcCisgICAgICgocG5nX3VpbnRfMTYpIFwKKyAgICAgICgoKHVuc2lnbmVkIGludCkoKihidWYpKSA8PCA4KSArIFwKKyAgICAgICAoKHVuc2lnbmVkIGludCkoKigoYnVmKSArIDEpKSkpKQorCisjICBkZWZpbmUgUE5HX2dldF9pbnRfMzIoYnVmKSBcCisgICAgICgocG5nX2ludF8zMikoKCooYnVmKSAmIDB4ODApIFwKKyAgICAgID8gLSgocG5nX2ludF8zMikoKHBuZ19nZXRfdWludF8zMihidWYpIF4gMHhmZmZmZmZmZkwpICsgMSkpIFwKKyAgICAgIDogKHBuZ19pbnRfMzIpcG5nX2dldF91aW50XzMyKGJ1ZikpKQorCisgICAvKiBJZiBQTkdfUFJFRklYIGlzIGRlZmluZWQgdGhlIHNhbWUgdGhpbmcgYXMgYmVsb3cgaGFwcGVucyBpbiBwbmdsaWJjb25mLmgsCisgICAgKiBidXQgZGVmaW5pbmcgYSBtYWNybyBuYW1lIHByZWZpeGVkIHdpdGggUE5HX1BSRUZJWC4KKyAgICAqLworIyAgaWZuZGVmIFBOR19QUkVGSVgKKyMgICAgIGRlZmluZSBwbmdfZ2V0X3VpbnRfMzIoYnVmKSBQTkdfZ2V0X3VpbnRfMzIoYnVmKQorIyAgICAgZGVmaW5lIHBuZ19nZXRfdWludF8xNihidWYpIFBOR19nZXRfdWludF8xNihidWYpCisjICAgICBkZWZpbmUgcG5nX2dldF9pbnRfMzIoYnVmKSAgUE5HX2dldF9pbnRfMzIoYnVmKQorIyAgZW5kaWYKKyNlbHNlCisjICBpZmRlZiBQTkdfUFJFRklYCisgICAgICAvKiBObyBtYWNyb3M7IHJldmVydCB0byB0aGUgKHJlZGVmaW5lZCkgZnVuY3Rpb24gKi8KKyMgICAgIGRlZmluZSBQTkdfZ2V0X3VpbnRfMzIgKHBuZ19nZXRfdWludF8zMikKKyMgICAgIGRlZmluZSBQTkdfZ2V0X3VpbnRfMTYgKHBuZ19nZXRfdWludF8xNikKKyMgICAgIGRlZmluZSBQTkdfZ2V0X2ludF8zMiAgKHBuZ19nZXRfaW50XzMyKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNJTVBMSUZJRUQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGluIGxpYnBuZy1tYW51YWwudHh0IChUT0RPOiB3cml0ZSBzYWlkCisgKiBkb2N1bWVudGF0aW9uKSBpZiB5b3UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IGZvbGxvd3MuCisgKgorICogVGhlIHNpbXBsaWZpZWQgQVBJIGhpZGVzIHRoZSBkZXRhaWxzIG9mIGJvdGggbGlicG5nIGFuZCB0aGUgUE5HIGZpbGUgZm9ybWF0CisgKiBpdHNlbGYuICBJdCBhbGxvd3MgUE5HIGZpbGVzIHRvIGJlIHJlYWQgaW50byBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YKKyAqIGluLW1lbW9yeSBiaXRtYXAgZm9ybWF0cyBvciB0byBiZSB3cml0dGVuIGZyb20gdGhlIHNhbWUgZm9ybWF0cy4gIElmIHRoZXNlCisgKiBmb3JtYXRzIGRvIG5vdCBhY2NvbW9kYXRlIHlvdXIgbmVlZHMgdGhlbiB5b3UgY2FuLCBhbmQgc2hvdWxkLCB1c2UgdGhlIG1vcmUKKyAqIHNvcGhpc3RpY2F0ZWQgQVBJcyBhYm92ZSAtIHRoZXNlIHN1cHBvcnQgYSB3aWRlIHZhcmlldHkgb2YgaW4tbWVtb3J5IGZvcm1hdHMKKyAqIGFuZCBhIHdpZGUgdmFyaWV0eSBvZiBzb3BoaXN0aWNhdGVkIHRyYW5zZm9ybWF0aW9ucyB0byB0aG9zZSBmb3JtYXRzIGFzIHdlbGwKKyAqIGFzIGEgd2lkZSB2YXJpZXR5IG9mIEFQSXMgdG8gbWFuaXB1bGF0ZSBhbmNpbGxhcnkgaW5mb3JtYXRpb24uCisgKgorICogVG8gcmVhZCBhIFBORyBmaWxlIHVzaW5nIHRoZSBzaW1wbGlmaWVkIEFQSToKKyAqCisgKiAxKSBEZWNsYXJlIGEgJ3BuZ19pbWFnZScgc3RydWN0dXJlIChzZWUgYmVsb3cpIG9uIHRoZSBzdGFjayBhbmQgc2V0IHRoZQorICogICAgdmVyc2lvbiBmaWVsZCB0byBQTkdfSU1BR0VfVkVSU0lPTi4KKyAqIDIpIENhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19pbWFnZV9iZWdpbl9yZWFkLi4uIGZ1bmN0aW9uLgorICogMykgU2V0IHRoZSBwbmdfaW1hZ2UgJ2Zvcm1hdCcgbWVtYmVyIHRvIHRoZSByZXF1aXJlZCBzYW1wbGUgZm9ybWF0LgorICogNCkgQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBpbWFnZSBhbmQsIGlmIHJlcXVpcmVkLCB0aGUgY29sb3ItbWFwLgorICogNSkgQ2FsbCBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgdG8gcmVhZCB0aGUgaW1hZ2UgYW5kLCBpZiByZXF1aXJlZCwgdGhlCisgKiAgICBjb2xvci1tYXAgaW50byB5b3VyIGJ1ZmZlcnMuCisgKgorICogVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUgZm9ybWF0IG9mIHRoZSBQTkcgaW5wdXQgaXRzZWxmOyBhbGwgdmFsaWQKKyAqIGNvbG9yIHR5cGVzLCBiaXQgZGVwdGhzLCBhbmQgaW50ZXJsYWNlIG1ldGhvZHMgYXJlIGFjY2VwdGFibGUsIGFuZCB0aGUKKyAqIGlucHV0IGltYWdlIGlzIHRyYW5zZm9ybWVkIGFzIG5lY2Vzc2FyeSB0byB0aGUgcmVxdWVzdGVkIGluLW1lbW9yeSBmb3JtYXQKKyAqIGR1cmluZyB0aGUgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCkgc3RlcC4gIFRoZSBvbmx5IGNhdmVhdCBpcyB0aGF0IGlmIHlvdQorICogcmVxdWVzdCBhIGNvbG9yLW1hcHBlZCBpbWFnZSBmcm9tIGEgUE5HIHRoYXQgaXMgZnVsbC1jb2xvciBvciBtYWtlcworICogY29tcGxleCB1c2Ugb2YgYW4gYWxwaGEgY2hhbm5lbCB0aGUgdHJhbnNmb3JtYXRpb24gaXMgZXh0cmVtZWx5IGxvc3N5IGFuZCB0aGUKKyAqIHJlc3VsdCBtYXkgbG9vayB0ZXJyaWJsZS4KKyAqCisgKiBUbyB3cml0ZSBhIFBORyBmaWxlIHVzaW5nIHRoZSBzaW1wbGlmaWVkIEFQSToKKyAqCisgKiAxKSBEZWNsYXJlIGEgJ3BuZ19pbWFnZScgc3RydWN0dXJlIG9uIHRoZSBzdGFjayBhbmQgbWVtc2V0KCkgaXQgdG8gYWxsIHplcm8uCisgKiAyKSBJbml0aWFsaXplIHRoZSBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZSB0aGUgaW1hZ2UsIHNldHRpbmcKKyAqICAgIHRoZSAnZm9ybWF0JyBtZW1iZXIgdG8gdGhlIGZvcm1hdCBvZiB0aGUgaW1hZ2Ugc2FtcGxlcy4KKyAqIDMpIENhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19pbWFnZV93cml0ZS4uLiBmdW5jdGlvbiB3aXRoIGEgcG9pbnRlciB0byB0aGUKKyAqICAgIGltYWdlIGFuZCwgaWYgbmVjZXNzYXJ5LCB0aGUgY29sb3ItbWFwIHRvIHdyaXRlIHRoZSBQTkcgZGF0YS4KKyAqCisgKiBwbmdfaW1hZ2UgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgdGhlIGluLW1lbW9yeSBmb3JtYXQgb2YgYW4gaW1hZ2UKKyAqIHdoZW4gaXQgaXMgYmVpbmcgcmVhZCBvciBkZWZpbmVzIHRoZSBpbi1tZW1vcnkgZm9ybWF0IG9mIGFuIGltYWdlIHRoYXQgeW91CisgKiBuZWVkIHRvIHdyaXRlOgorICovCisjZGVmaW5lIFBOR19JTUFHRV9WRVJTSU9OIDEKKwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbnRyb2wgKnBuZ19jb250cm9scDsKK3R5cGVkZWYgc3RydWN0Cit7CisgICBwbmdfY29udHJvbHAgb3BhcXVlOyAgICAvKiBJbml0aWFsaXplIHRvIE5VTEwsIGZyZWUgd2l0aCBwbmdfaW1hZ2VfZnJlZSAqLworICAgcG5nX3VpbnRfMzIgIHZlcnNpb247ICAgLyogU2V0IHRvIFBOR19JTUFHRV9WRVJTSU9OICovCisgICBwbmdfdWludF8zMiAgd2lkdGg7ICAgICAvKiBJbWFnZSB3aWR0aCBpbiBwaXhlbHMgKGNvbHVtbnMpICovCisgICBwbmdfdWludF8zMiAgaGVpZ2h0OyAgICAvKiBJbWFnZSBoZWlnaHQgaW4gcGl4ZWxzIChyb3dzKSAqLworICAgcG5nX3VpbnRfMzIgIGZvcm1hdDsgICAgLyogSW1hZ2UgZm9ybWF0IGFzIGRlZmluZWQgYmVsb3cgKi8KKyAgIHBuZ191aW50XzMyICBmbGFnczsgICAgIC8qIEEgYml0IG1hc2sgY29udGFpbmluZyBpbmZvcm1hdGlvbmFsIGZsYWdzICovCisgICBwbmdfdWludF8zMiAgY29sb3JtYXBfZW50cmllczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgKi8KKworICAgLyogSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIG9yIHdhcm5pbmcgdGhlIGZvbGxvd2luZyBmaWVsZCB3aWxsIGJlIHNldCB0byBhCisgICAgKiBub24temVybyB2YWx1ZSBhbmQgdGhlICdtZXNzYWdlJyBmaWVsZCB3aWxsIGNvbnRhaW4gYSAnXDAnIHRlcm1pbmF0ZWQKKyAgICAqIHN0cmluZyB3aXRoIHRoZSBsaWJwbmcgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLiAgSWYgYm90aCB3YXJuaW5ncyBhbmQKKyAgICAqIGFuIGVycm9yIHdlcmUgZW5jb3VudGVyZWQsIG9ubHkgdGhlIGVycm9yIGlzIHJlY29yZGVkLiAgSWYgdGhlcmUKKyAgICAqIGFyZSBtdWx0aXBsZSB3YXJuaW5ncywgb25seSB0aGUgZmlyc3Qgb25lIGlzIHJlY29yZGVkLgorICAgICoKKyAgICAqIFRoZSB1cHBlciAzMCBiaXRzIG9mIHRoaXMgdmFsdWUgYXJlIHJlc2VydmVkLCB0aGUgbG93IHR3byBiaXRzIGNvbnRhaW4KKyAgICAqIGEgdmFsdWUgYXMgZm9sbG93czoKKyAgICAqLworIyAgZGVmaW5lIFBOR19JTUFHRV9XQVJOSU5HIDEKKyMgIGRlZmluZSBQTkdfSU1BR0VfRVJST1IgMgorICAgLyoKKyAgICAqIFRoZSByZXN1bHQgaXMgYSB0d28gYml0IGNvZGUgc3VjaCB0aGF0IGEgdmFsdWUgbW9yZSB0aGFuIDEgaW5kaWNhdGVzCisgICAgKiBhIGZhaWx1cmUgaW4gdGhlIEFQSSBqdXN0IGNhbGxlZDoKKyAgICAqCisgICAgKiAgICAwIC0gbm8gd2FybmluZyBvciBlcnJvcgorICAgICogICAgMSAtIHdhcm5pbmcKKyAgICAqICAgIDIgLSBlcnJvcgorICAgICogICAgMyAtIGVycm9yIHByZWNlZGVkIGJ5IHdhcm5pbmcKKyAgICAqLworIyAgZGVmaW5lIFBOR19JTUFHRV9GQUlMRUQocG5nX2NudHJsKSAoKCgocG5nX2NudHJsKS53YXJuaW5nX29yX2Vycm9yKSYweDAzKT4xKQorCisgICBwbmdfdWludF8zMiAgd2FybmluZ19vcl9lcnJvcjsKKworICAgY2hhciAgICAgICAgIG1lc3NhZ2VbNjRdOworfSBwbmdfaW1hZ2UsICpwbmdfaW1hZ2VwOworCisvKiBUaGUgc2FtcGxlcyBvZiB0aGUgaW1hZ2UgaGF2ZSBvbmUgdG8gZm91ciBjaGFubmVscyB3aG9zZSBjb21wb25lbnRzIGhhdmUKKyAqIG9yaWdpbmFsIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCB0byAxLjA6CisgKgorICogMTogQSBzaW5nbGUgZ3JheSBvciBsdW1pbmFuY2UgY2hhbm5lbCAoRykuCisgKiAyOiBBIGdyYXkvbHVtaW5hbmNlIGNoYW5uZWwgYW5kIGFuIGFscGhhIGNoYW5uZWwgKEdBKS4KKyAqIDM6IFRocmVlIHJlZCwgZ3JlZW4sIGJsdWUgY29sb3IgY2hhbm5lbHMgKFJHQikuCisgKiA0OiBUaHJlZSBjb2xvciBjaGFubmVscyBhbmQgYW4gYWxwaGEgY2hhbm5lbCAoUkdCQSkuCisgKgorICogVGhlIGNvbXBvbmVudHMgYXJlIGVuY29kZWQgaW4gb25lIG9mIHR3byB3YXlzOgorICoKKyAqIGEpIEFzIGEgc21hbGwgaW50ZWdlciwgdmFsdWUgMC4uMjU1LCBjb250YWluZWQgaW4gYSBzaW5nbGUgYnl0ZS4gIEZvciB0aGUKKyAqIGFscGhhIGNoYW5uZWwgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIHNpbXBseSB2YWx1ZS8yNTUuICBGb3IgdGhlIGNvbG9yIG9yCisgKiBsdW1pbmFuY2UgY2hhbm5lbHMgdGhlIHZhbHVlIGlzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24KKyAqIGFuZCBtYXRjaGVzIHRoZSA4LWJpdCBmb3JtYXQgZXhwZWN0ZWQgYnkgdHlwaWNhbCBkaXNwbGF5IGRldmljZXMuCisgKgorICogVGhlIGNvbG9yL2dyYXkgY2hhbm5lbHMgYXJlIG5vdCBzY2FsZWQgKHByZS1tdWx0aXBsaWVkKSBieSB0aGUgYWxwaGEKKyAqIGNoYW5uZWwgYW5kIGFyZSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBjb2xvciBtYW5hZ2VtZW50IHNvZnR3YXJlLgorICoKKyAqIGIpIEFzIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjY1NTM1LCBjb250YWluZWQgaW4gYSAyLWJ5dGUgaW50ZWdlci4gIEFsbAorICogY2hhbm5lbHMgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgb3JpZ2luYWwgdmFsdWUgYnkgZGl2aWRpbmcgYnkgNjU1MzU7IGFsbAorICogY2hhbm5lbHMgYXJlIGxpbmVhci4gIENvbG9yIGNoYW5uZWxzIHVzZSB0aGUgUkdCIGVuY29kaW5nIChSR0IgZW5kLXBvaW50cykgb2YKKyAqIHRoZSBzUkdCIHNwZWNpZmljYXRpb24uICBUaGlzIGVuY29kaW5nIGlzIGlkZW50aWZpZWQgYnkgdGhlCisgKiBQTkdfRk9STUFUX0ZMQUdfTElORUFSIGZsYWcgYmVsb3cuCisgKgorICogV2hlbiB0aGUgc2ltcGxpZmllZCBBUEkgbmVlZHMgdG8gY29udmVydCBiZXR3ZWVuIHNSR0IgYW5kIGxpbmVhciBjb2xvcnNwYWNlcywKKyAqIHRoZSBhY3R1YWwgc1JHQiB0cmFuc2ZlciBjdXJ2ZSBkZWZpbmVkIGluIHRoZSBzUkdCIHNwZWNpZmljYXRpb24gKHNlZSB0aGUKKyAqIGFydGljbGUgYXQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUkdCKSBpcyB1c2VkLCBub3QgdGhlIGdhbW1hPTEvMi4yCisgKiBhcHByb3hpbWF0aW9uIHVzZWQgZWxzZXdoZXJlIGluIGxpYnBuZy4KKyAqCisgKiBXaGVuIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCBpdCBpcyBleHBlY3RlZCB0byBkZW5vdGUgcGl4ZWwgY292ZXJhZ2UKKyAqIG9mIHRoZSBjb2xvciBvciBsdW1pbmFuY2UgY2hhbm5lbHMgYW5kIGlzIHJldHVybmVkIGFzIGFuIGFzc29jaWF0ZWQgYWxwaGEKKyAqIGNoYW5uZWw6IHRoZSBjb2xvci9ncmF5IGNoYW5uZWxzIGFyZSBzY2FsZWQgKHByZS1tdWx0aXBsaWVkKSBieSB0aGUgYWxwaGEKKyAqIHZhbHVlLgorICoKKyAqIFRoZSBzYW1wbGVzIGFyZSBlaXRoZXIgY29udGFpbmVkIGRpcmVjdGx5IGluIHRoZSBpbWFnZSBkYXRhLCBiZXR3ZWVuIDEgYW5kIDgKKyAqIGJ5dGVzIHBlciBwaXhlbCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nLCBvciBhcmUgaGVsZCBpbiBhIGNvbG9yLW1hcCBpbmRleGVkCisgKiBieSBieXRlcyBpbiB0aGUgaW1hZ2UgZGF0YS4gIEluIHRoZSBjYXNlIG9mIGEgY29sb3ItbWFwIHRoZSBjb2xvci1tYXAgZW50cmllcworICogYXJlIGluZGl2aWR1YWwgc2FtcGxlcywgZW5jb2RlZCBhcyBhYm92ZSwgYW5kIHRoZSBpbWFnZSBkYXRhIGhhcyBvbmUgYnl0ZSBwZXIKKyAqIHBpeGVsIHRvIHNlbGVjdCB0aGUgcmVsZXZhbnQgc2FtcGxlIGZyb20gdGhlIGNvbG9yLW1hcC4KKyAqLworCisvKiBQTkdfRk9STUFUXyoKKyAqCisgKiAjZGVmaW5lcyB0byBiZSB1c2VkIGluIHBuZ19pbWFnZTo6Zm9ybWF0LiAgRWFjaCAjZGVmaW5lIGlkZW50aWZpZXMgYQorICogcGFydGljdWxhciBsYXlvdXQgb2Ygc2FtcGxlIGRhdGEgYW5kLCBpZiBwcmVzZW50LCBhbHBoYSB2YWx1ZXMuICBUaGVyZSBhcmUKKyAqIHNlcGFyYXRlIGRlZmluZXMgZm9yIGVhY2ggb2YgdGhlIHR3byBjb21wb25lbnQgZW5jb2RpbmdzLgorICoKKyAqIEEgZm9ybWF0IGlzIGJ1aWx0IHVwIHVzaW5nIHNpbmdsZSBiaXQgZmxhZyB2YWx1ZXMuICBBbGwgY29tYmluYXRpb25zIGFyZQorICogdmFsaWQuICBGb3JtYXRzIGNhbiBiZSBidWlsdCB1cCBmcm9tIHRoZSBmbGFnIHZhbHVlcyBvciB5b3UgY2FuIHVzZSBvbmUgb2YKKyAqIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyBiZWxvdy4gIFdoZW4gdGVzdGluZyBmb3JtYXRzIGFsd2F5cyB1c2UgdGhlIEZPUk1BVF9GTEFHCisgKiBtYWNyb3MgdG8gdGVzdCBmb3IgaW5kaXZpZHVhbCBmZWF0dXJlcyAtIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBtYXkKKyAqIGFkZCBuZXcgZmxhZ3MuCisgKgorICogV2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgY29sb3ItbWFwcGVkIGltYWdlcyB0aGUgZm9ybWF0IHNob3VsZCBiZSBzZXQgdG8gdGhlCisgKiBmb3JtYXQgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCB0aGVuIHBuZ19pbWFnZV97cmVhZCx3cml0ZX1fY29sb3JtYXAKKyAqIGNhbGxlZCB0byByZWFkIG9yIHdyaXRlIHRoZSBjb2xvci1tYXAgYW5kIHNldCB0aGUgZm9ybWF0IGNvcnJlY3RseSBmb3IgdGhlCisgKiBpbWFnZSBkYXRhLiAgRG8gbm90IHNldCB0aGUgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGJpdCBkaXJlY3RseSEKKyAqCisgKiBOT1RFOiBsaWJwbmcgY2FuIGJlIGJ1aWx0IHdpdGggcGFydGljdWxhciBmZWF0dXJlcyBkaXNhYmxlZCwgaWYgeW91IHNlZQorICogY29tcGlsZXIgZXJyb3JzIGJlY2F1c2UgdGhlIGRlZmluaXRpb24gb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MgaGFzIGJlZW4KKyAqIGNvbXBpbGVkIG91dCBpdCBpcyBiZWNhdXNlIGxpYnBuZyBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBzdXBwb3J0LiAgSXQgaXMKKyAqIHBvc3NpYmxlLCBob3dldmVyLCBmb3IgdGhlIGxpYnBuZyBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgZm9ybWF0IG9uIGp1c3QKKyAqIHJlYWQgb3IganVzdCB3cml0ZTsgaW4gdGhhdCBjYXNlIHlvdSBtYXkgc2VlIGFuIGVycm9yIGF0IHJ1biB0aW1lLiAgWW91IGNhbgorICogZ3VhcmQgYWdhaW5zdCB0aGlzIGJ5IGNoZWNraW5nIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUKKyAqICJfU1VQUE9SVEVEIiBtYWNybywgb25lIG9mOgorICoKKyAqICAgIFBOR19TSU1QTElGSUVEX3tSRUFELFdSSVRFfV97QkdSLEFGSVJTVH1fU1VQUE9SVEVECisgKi8KKyNkZWZpbmUgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBICAgIDB4MDFVIC8qIGZvcm1hdCB3aXRoIGFuIGFscGhhIGNoYW5uZWwgKi8KKyNkZWZpbmUgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SICAgIDB4MDJVIC8qIGNvbG9yIGZvcm1hdDogb3RoZXJ3aXNlIGdyYXlzY2FsZSAqLworI2RlZmluZSBQTkdfRk9STUFUX0ZMQUdfTElORUFSICAgMHgwNFUgLyogMiBieXRlIGNoYW5uZWxzIGVsc2UgMSBieXRlICovCisjZGVmaW5lIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCAweDA4VSAvKiBpbWFnZSBkYXRhIGlzIGNvbG9yLW1hcHBlZCAqLworCisjaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX0ZPUk1BVF9GTEFHX0JHUiAgICAweDEwVSAvKiBCR1IgY29sb3JzLCBlbHNlIG9yZGVyIGlzIFJHQiAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUIDB4MjBVIC8qIGFscGhhIGNoYW5uZWwgY29tZXMgZmlyc3QgKi8KKyNlbmRpZgorCisvKiBDb21tb25seSB1c2VkIGZvcm1hdHMgaGF2ZSBwcmVkZWZpbmVkIG1hY3Jvcy4KKyAqCisgKiBGaXJzdCB0aGUgc2luZ2xlIGJ5dGUgKHNSR0IpIGZvcm1hdHM6CisgKi8KKyNkZWZpbmUgUE5HX0ZPUk1BVF9HUkFZIDAKKyNkZWZpbmUgUE5HX0ZPUk1BVF9HQSAgIFBOR19GT1JNQVRfRkxBR19BTFBIQQorI2RlZmluZSBQTkdfRk9STUFUX0FHICAgKFBOR19GT1JNQVRfR0F8UE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9SR0IgIFBOR19GT1JNQVRfRkxBR19DT0xPUgorI2RlZmluZSBQTkdfRk9STUFUX0JHUiAgKFBOR19GT1JNQVRfRkxBR19DT0xPUnxQTkdfRk9STUFUX0ZMQUdfQkdSKQorI2RlZmluZSBQTkdfRk9STUFUX1JHQkEgKFBOR19GT1JNQVRfUkdCfFBOR19GT1JNQVRfRkxBR19BTFBIQSkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9BUkdCIChQTkdfRk9STUFUX1JHQkF8UE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9CR1JBIChQTkdfRk9STUFUX0JHUnxQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCisjZGVmaW5lIFBOR19GT1JNQVRfQUJHUiAoUE5HX0ZPUk1BVF9CR1JBfFBOR19GT1JNQVRfRkxBR19BRklSU1QpCisKKy8qIFRoZW4gdGhlIGxpbmVhciAyLWJ5dGUgZm9ybWF0cy4gIFdoZW4gbmFtaW5nIHRoZXNlICJZIiBpcyB1c2VkIHRvCisgKiBpbmRpY2F0ZSBhIGx1bWluYW5jZSAoZ3JheSkgY2hhbm5lbC4KKyAqLworI2RlZmluZSBQTkdfRk9STUFUX0xJTkVBUl9ZIFBOR19GT1JNQVRfRkxBR19MSU5FQVIKKyNkZWZpbmUgUE5HX0ZPUk1BVF9MSU5FQVJfWV9BTFBIQSAoUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUnxQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCisjZGVmaW5lIFBOR19GT1JNQVRfTElORUFSX1JHQiAoUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUnxQTkdfRk9STUFUX0ZMQUdfQ09MT1IpCisjZGVmaW5lIFBOR19GT1JNQVRfTElORUFSX1JHQl9BTFBIQSBcCisgICAoUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUnxQTkdfRk9STUFUX0ZMQUdfQ09MT1J8UE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQorCisvKiBXaXRoIGNvbG9yLW1hcHBlZCBmb3JtYXRzIHRoZSBpbWFnZSBkYXRhIGlzIG9uZSBieXRlIGZvciBlYWNoIHBpeGVsLCB0aGUgYnl0ZQorICogaXMgYW4gaW5kZXggaW50byB0aGUgY29sb3ItbWFwIHdoaWNoIGlzIGZvcm1hdHRlZCBhcyBhYm92ZS4gIFRvIG9idGFpbiBhCisgKiBjb2xvci1tYXBwZWQgZm9ybWF0IGl0IGlzIHN1ZmZpY2llbnQganVzdCB0byBhZGQgdGhlIFBOR19GT01BVF9GTEFHX0NPTE9STUFQCisgKiB0byBvbmUgb2YgdGhlIGFib3ZlIGRlZmluaXRpb25zLCBvciB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGRlZmluaXRpb25zIGJlbG93LgorICovCisjZGVmaW5lIFBOR19GT1JNQVRfUkdCX0NPTE9STUFQICAoUE5HX0ZPUk1BVF9SR0J8UE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQorI2RlZmluZSBQTkdfRk9STUFUX0JHUl9DT0xPUk1BUCAgKFBOR19GT1JNQVRfQkdSfFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9SR0JBX0NPTE9STUFQIChQTkdfRk9STUFUX1JHQkF8UE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQorI2RlZmluZSBQTkdfRk9STUFUX0FSR0JfQ09MT1JNQVAgKFBOR19GT1JNQVRfQVJHQnxQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApCisjZGVmaW5lIFBOR19GT1JNQVRfQkdSQV9DT0xPUk1BUCAoUE5HX0ZPUk1BVF9CR1JBfFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKKyNkZWZpbmUgUE5HX0ZPUk1BVF9BQkdSX0NPTE9STUFQIChQTkdfRk9STUFUX0FCR1J8UE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQorCisvKiBQTkdfSU1BR0UgbWFjcm9zCisgKgorICogVGhlc2UgYXJlIGNvbnZlbmllbmNlIG1hY3JvcyB0byBkZXJpdmUgaW5mb3JtYXRpb24gZnJvbSBhIHBuZ19pbWFnZQorICogc3RydWN0dXJlLiAgVGhlIFBOR19JTUFHRV9TQU1QTEVfIG1hY3JvcyByZXR1cm4gdmFsdWVzIGFwcHJvcHJpYXRlIHRvIHRoZQorICogYWN0dWFsIGltYWdlIHNhbXBsZSB2YWx1ZXMgLSBlaXRoZXIgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCBvciB0aGUKKyAqIHBpeGVscyBpbiB0aGUgaW1hZ2UuICBUaGUgUE5HX0lNQUdFX1BJWEVMXyBtYWNyb3MgcmV0dXJuIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgKiBmb3IgdGhlIHBpeGVscyBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIDEgZm9yIGNvbG9yLW1hcHBlZCBmb3JtYXRzLiAgVGhlCisgKiByZW1haW5pbmcgbWFjcm9zIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm93cyBpbiB0aGUgaW1hZ2UgYW5kIHRoZQorICogY29tcGxldGUgaW1hZ2UuCisgKgorICogTk9URTogQWxsIHRoZSBtYWNyb3MgdGhhdCB0YWtlIGEgcG5nX2ltYWdlOjpmb3JtYXQgcGFyYW1ldGVyIGFyZSBjb21waWxlIHRpbWUKKyAqIGNvbnN0YW50cyBpZiB0aGUgZm9ybWF0IHBhcmFtZXRlciBpcywgaXRzZWxmLCBhIGNvbnN0YW50LiAgVGhlcmVmb3JlIHRoZXNlCisgKiBtYWNyb3MgY2FuIGJlIHVzZWQgaW4gYXJyYXkgZGVjbGFyYXRpb25zIGFuZCBjYXNlIGxhYmVscyB3aGVyZSByZXF1aXJlZC4KKyAqIFNpbWlsYXJseSB0aGUgbWFjcm9zIGFyZSBhbHNvIHByZS1wcm9jZXNzb3IgY29uc3RhbnRzIChzaXplb2YgaXMgbm90IHVzZWQpIHNvCisgKiB0aGV5IGNhbiBiZSB1c2VkIGluICNpZiB0ZXN0cy4KKyAqCisgKiBGaXJzdCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZXMuCisgKi8KKyNkZWZpbmUgUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhmbXQpXAorICAgKCgoZm10KSYoUE5HX0ZPUk1BVF9GTEFHX0NPTE9SfFBOR19GT1JNQVRfRkxBR19BTFBIQSkpKzEpCisgICAvKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBjaGFubmVscyBpbiBhIGdpdmVuIGZvcm1hdDogMS4uNCAqLworCisjZGVmaW5lIFBOR19JTUFHRV9TQU1QTEVfQ09NUE9ORU5UX1NJWkUoZm10KVwKKyAgICgoKChmbXQpICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikgPj4gMikrMSkKKyAgIC8qIFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgYSBwaXhlbCBvciBjb2xvci1tYXAKKyAgICAqIGVudHJ5IChhcyBhcHByb3ByaWF0ZSkgaW4gdGhlIGltYWdlOiAxIG9yIDIuCisgICAgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfU0FNUExFX1NJWkUoZm10KVwKKyAgIChQTkdfSU1BR0VfU0FNUExFX0NIQU5ORUxTKGZtdCkgKiBQTkdfSU1BR0VfU0FNUExFX0NPTVBPTkVOVF9TSVpFKGZtdCkpCisgICAvKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZGF0YSBmb3Igb25lIHNhbXBsZS4gIElmIHRoZSBpbWFnZSBpcworICAgICogY29sb3ItbWFwcGVkIGl0IGlzIHRoZSBzaXplIG9mIG9uZSBjb2xvci1tYXAgZW50cnkgKGFuZCBpbWFnZSBwaXhlbHMgYXJlCisgICAgKiBvbmUgYnl0ZSBpbiBzaXplKSwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBzaXplIG9mIG9uZSBpbWFnZSBwaXhlbC4KKyAgICAqLworCisjZGVmaW5lIFBOR19JTUFHRV9NQVhJTVVNX0NPTE9STUFQX0NPTVBPTkVOVFMoZm10KVwKKyAgIChQTkdfSU1BR0VfU0FNUExFX0NIQU5ORUxTKGZtdCkgKiAyNTYpCisgICAvKiBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb2xvci1tYXAgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdCBleHByZXNzZWQgaW4gYQorICAgICogY291bnQgb2YgY29tcG9uZW50cy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29tcGlsZS10aW1lIGFsbG9jYXRlIGEKKyAgICAqIGNvbG9yLW1hcDoKKyAgICAqCisgICAgKiBwbmdfdWludF8xNiBjb2xvcm1hcFtQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKGxpbmVhcl9mbXQpXTsKKyAgICAqCisgICAgKiBwbmdfYnl0ZSBjb2xvcm1hcFtQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKHNSR0JfZm10KV07CisgICAgKgorICAgICogQWx0ZXJuYXRpdmVseSB1c2UgdGhlIFBOR19JTUFHRV9DT0xPUk1BUF9TSVpFIG1hY3JvIGJlbG93IHRvIHVzZSB0aGUKKyAgICAqIGluZm9ybWF0aW9uIGZyb20gb25lIG9mIHRoZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF8gQVBJcyBhbmQgZHluYW1pY2FsbHkKKyAgICAqIGFsbG9jYXRlIHRoZSByZXF1aXJlZCBtZW1vcnkuCisgICAgKi8KKworLyogQ29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGl4ZWxzICovCisjZGVmaW5lIFBOR19JTUFHRV9QSVhFTF8odGVzdCxmbXQpXAorICAgKCgoZm10KSZQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApPzE6dGVzdChmbXQpKQorCisjZGVmaW5lIFBOR19JTUFHRV9QSVhFTF9DSEFOTkVMUyhmbXQpXAorICAgUE5HX0lNQUdFX1BJWEVMXyhQTkdfSU1BR0VfU0FNUExFX0NIQU5ORUxTLGZtdCkKKyAgIC8qIFRoZSBudW1iZXIgb2Ygc2VwYXJhdGUgY2hhbm5lbHMgKGNvbXBvbmVudHMpIGluIGEgcGl4ZWw7IDEgZm9yIGEKKyAgICAqIGNvbG9yLW1hcHBlZCBpbWFnZS4KKyAgICAqLworCisjZGVmaW5lIFBOR19JTUFHRV9QSVhFTF9DT01QT05FTlRfU0laRShmbXQpXAorICAgUE5HX0lNQUdFX1BJWEVMXyhQTkdfSU1BR0VfU0FNUExFX0NPTVBPTkVOVF9TSVpFLGZtdCkKKyAgIC8qIFRoZSBzaXplLCBpbiBieXRlcywgb2YgZWFjaCBjb21wb25lbnQgaW4gYSBwaXhlbDsgMSBmb3IgYSBjb2xvci1tYXBwZWQKKyAgICAqIGltYWdlLgorICAgICovCisKKyNkZWZpbmUgUE5HX0lNQUdFX1BJWEVMX1NJWkUoZm10KSBQTkdfSU1BR0VfUElYRUxfKFBOR19JTUFHRV9TQU1QTEVfU0laRSxmbXQpCisgICAvKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgY29tcGxldGUgcGl4ZWw7IDEgZm9yIGEgY29sb3ItbWFwcGVkIGltYWdlLiAqLworCisvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgd2hvbGUgcm93LCBvciB3aG9sZSBpbWFnZSAqLworI2RlZmluZSBQTkdfSU1BR0VfUk9XX1NUUklERShpbWFnZSlcCisgICAoUE5HX0lNQUdFX1BJWEVMX0NIQU5ORUxTKChpbWFnZSkuZm9ybWF0KSAqIChpbWFnZSkud2lkdGgpCisgICAvKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBjb21wb25lbnRzIGluIGEgc2luZ2xlIHJvdyBvZiB0aGUgaW1hZ2U7IHRoaXMKKyAgICAqIGlzIHRoZSBtaW5pbXVtICdyb3cgc3RyaWRlJywgdGhlIG1pbmltdW0gY291bnQgb2YgY29tcG9uZW50cyBiZXR3ZWVuIGVhY2gKKyAgICAqIHJvdy4gIEZvciBhIGNvbG9yLW1hcHBlZCBpbWFnZSB0aGlzIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBpbiBhCisgICAgKiByb3cuCisgICAgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfQlVGRkVSX1NJWkUoaW1hZ2UsIHJvd19zdHJpZGUpXAorICAgKFBOR19JTUFHRV9QSVhFTF9DT01QT05FTlRfU0laRSgoaW1hZ2UpLmZvcm1hdCkqKGltYWdlKS5oZWlnaHQqKHJvd19zdHJpZGUpKQorICAgLyogUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYW4gaW1hZ2UgYnVmZmVyIGdpdmVuIGEgcG5nX2ltYWdlIGFuZCBhIHJvdworICAgICogc3RyaWRlIC0gdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIGxlYXZlIHNwYWNlIGZvciBpbiBlYWNoIHJvdy4KKyAgICAqLworCisjZGVmaW5lIFBOR19JTUFHRV9TSVpFKGltYWdlKVwKKyAgIFBOR19JTUFHRV9CVUZGRVJfU0laRShpbWFnZSwgUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UpKQorICAgLyogUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGltYWdlIGluIG1lbW9yeSBnaXZlbiBqdXN0IGEgcG5nX2ltYWdlOworICAgICogdGhlIHJvdyBzdHJpZGUgaXMgdGhlIG1pbmltdW0gc3RyaWRlIHJlcXVpcmVkIGZvciB0aGUgaW1hZ2UuCisgICAgKi8KKworI2RlZmluZSBQTkdfSU1BR0VfQ09MT1JNQVBfU0laRShpbWFnZSlcCisgICAoUE5HX0lNQUdFX1NBTVBMRV9TSVpFKChpbWFnZSkuZm9ybWF0KSAqIChpbWFnZSkuY29sb3JtYXBfZW50cmllcykKKyAgIC8qIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBjb2xvci1tYXAgb2YgdGhpcyBpbWFnZS4gIElmIHRoZSBpbWFnZQorICAgICogZm9ybWF0IGlzIG5vdCBhIGNvbG9yLW1hcCBmb3JtYXQgdGhpcyB3aWxsIHJldHVybiBhIHNpemUgc3VmZmljaWVudCBmb3IKKyAgICAqIDI1NiBlbnRyaWVzIGluIHRoZSBnaXZlbiBmb3JtYXQ7IGNoZWNrIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBpZgorICAgICogeW91IGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYSBjb2xvci1tYXAgaW4gdGhpcyBjYXNlLgorICAgICovCisKKy8qIFBOR19JTUFHRV9GTEFHXyoKKyAqCisgKiBGbGFncyBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIGFyZSBoZWxkIGluIHRoZQorICogJ2ZsYWdzJyBmaWVsZCBvZiBwbmdfaW1hZ2UuCisgKi8KKyNkZWZpbmUgUE5HX0lNQUdFX0ZMQUdfQ09MT1JTUEFDRV9OT1Rfc1JHQiAweDAxCisgICAvKiBUaGlzIGluZGljYXRlcyB0aGUgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGluLW1lbW9yeSBiaXRtYXAgZG8gbm90CisgICAgKiBjb3JyZXNwb25kIHRvIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGVuZC1wb2ludHMgZGVmaW5lZCBieSBzUkdCLgorICAgICovCisKKyNkZWZpbmUgUE5HX0lNQUdFX0ZMQUdfRkFTVCAweDAyCisgICAvKiBPbiB3cml0ZSBlbXBoYXNpc2Ugc3BlZWQgb3ZlciBjb21wcmVzc2lvbjsgdGhlIHJlc3VsdGFudCBQTkcgZmlsZSB3aWxsIGJlCisgICAgKiBsYXJnZXIgYnV0IHdpbGwgYmUgcHJvZHVjZWQgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIHBhcnRpY3VsYXIgZm9yIGxhcmdlCisgICAgKiBpbWFnZXMuICBEbyBub3QgdXNlIHRoaXMgb3B0aW9uIGZvciBpbWFnZXMgd2hpY2ggd2lsbCBiZSBkaXN0cmlidXRlZCwgb25seQorICAgICogdXNlZCBpdCB3aGVuIHByb2R1Y2luZyBpbnRlcm1lZGlhdGUgZmlsZXMgdGhhdCB3aWxsIGJlIHJlYWQgYmFjayBpbgorICAgICogcmVwZWF0ZWRseS4gIEZvciBhIHR5cGljYWwgMjQtYml0IGltYWdlIHRoZSBvcHRpb24gd2lsbCBkb3VibGUgdGhlIHJlYWQKKyAgICAqIHNwZWVkIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNpbmcgdGhlIGltYWdlIHNpemUgYnkgMjUlLCBob3dldmVyIGZvciBtYW55CisgICAgKiBtb3JlIGNvbXByZXNzaWJsZSBpbWFnZXMgdGhlIFBORyBmaWxlIGNhbiBiZSAxMCB0aW1lcyBsYXJnZXIgd2l0aCBvbmx5IGEKKyAgICAqIHNsaWdodCBzcGVlZCBnYWluLgorICAgICovCisKKyNkZWZpbmUgUE5HX0lNQUdFX0ZMQUdfMTZCSVRfc1JHQiAweDA0CisgICAvKiBPbiByZWFkIGlmIHRoZSBpbWFnZSBpcyBhIDE2LWJpdCBwZXIgY29tcG9uZW50IGltYWdlIGFuZCB0aGVyZSBpcyBubyBnQU1BCisgICAgKiBvciBzUkdCIGNodW5rIGFzc3VtZSB0aGF0IHRoZSBjb21wb25lbnRzIGFyZSBzUkdCIGVuY29kZWQuICBOb3RpY2UgdGhhdAorICAgICogaW1hZ2VzIG91dHB1dCBieSB0aGUgc2ltcGxpZmllZCBBUEkgYWx3YXlzIGhhdmUgZ2FtbWEgaW5mb3JtYXRpb247IHNldHRpbmcKKyAgICAqIHRoaXMgZmxhZyBvbmx5IGFmZmVjdHMgdGhlIGludGVycHJldGF0aW9uIG9mIDE2LWJpdCBpbWFnZXMgZnJvbSBhbgorICAgICogZXh0ZXJuYWwgc291cmNlLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgYXBwbGljYXRpb24gZXhwb3NlIHRoaXMgZmxhZworICAgICogdG8gdGhlIHVzZXI7IHRoZSB1c2VyIGNhbiBub3JtYWxseSBlYXNpbHkgcmVjb2duaXplIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAqIGxpbmVhciBhbmQgc1JHQiBlbmNvZGluZy4gIFRoaXMgZmxhZyBoYXMgbm8gZWZmZWN0IG9uIHdyaXRlIC0gdGhlIGRhdGEKKyAgICAqIHBhc3NlZCB0byB0aGUgd3JpdGUgQVBJcyBtdXN0IGhhdmUgdGhlIGNvcnJlY3QgZW5jb2RpbmcgKGFzIGRlZmluZWQKKyAgICAqIGFib3ZlLikKKyAgICAqCisgICAgKiBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0ICh0aGUgZGVmYXVsdCkgaW5wdXQgMTYtYml0IHBlciBjb21wb25lbnQgZGF0YSBpcworICAgICogYXNzdW1lZCB0byBiZSBsaW5lYXIuCisgICAgKgorICAgICogTk9URTogdGhlIGZsYWcgY2FuIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF8gY2FsbCwKKyAgICAqIGJlY2F1c2UgdGhhdCBjYWxsIGluaXRpYWxpemVzIHRoZSAnZmxhZ3MnIGZpZWxkLgorICAgICovCisKKyNpZmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRAorLyogUkVBRCBBUElzCisgKiAtLS0tLS0tLS0KKyAqCisgKiBUaGUgcG5nX2ltYWdlIHBhc3NlZCB0byB0aGUgcmVhZCBBUElzIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IHNldHRpbmcKKyAqIHRoZSBwbmdfY29udHJvbHAgZmllbGQgJ29wYXF1ZScgdG8gTlVMTCAob3IsIHNhZmVyLCBtZW1zZXQgdGhlIHdob2xlIHRoaW5nLikKKyAqLworI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKK1BOR19FWFBPUlQoMjM0LCBpbnQsIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICBjb25zdCBjaGFyICpmaWxlX25hbWUpKTsKKyAgIC8qIFRoZSBuYW1lZCBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZCBhbmQgdGhlIGltYWdlIGhlYWRlciBpcyBmaWxsZWQgaW4KKyAgICAqIGZyb20gdGhlIFBORyBoZWFkZXIgaW4gdGhlIGZpbGUuCisgICAgKi8KKworUE5HX0VYUE9SVCgyMzUsIGludCwgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbywgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICBGSUxFKiBmaWxlKSk7CisgICAvKiBUaGUgUE5HIGhlYWRlciBpcyByZWFkIGZyb20gdGhlIHN0ZGlvIEZJTEUgb2JqZWN0LiAqLworI2VuZGlmIC8qIFBOR19TVERJT19TVVBQT1JURUQgKi8KKworUE5HX0VYUE9SVCgyMzYsIGludCwgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnksIChwbmdfaW1hZ2VwIGltYWdlLAorICAgcG5nX2NvbnN0X3ZvaWRwIG1lbW9yeSwgcG5nX3NpemVfdCBzaXplKSk7CisgICAvKiBUaGUgUE5HIGhlYWRlciBpcyByZWFkIGZyb20gdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIuICovCisKK1BOR19FWFBPUlQoMjM3LCBpbnQsIHBuZ19pbWFnZV9maW5pc2hfcmVhZCwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICBwbmdfY29uc3RfY29sb3JwIGJhY2tncm91bmQsIHZvaWQgKmJ1ZmZlciwgcG5nX2ludF8zMiByb3dfc3RyaWRlLAorICAgdm9pZCAqY29sb3JtYXApKTsKKyAgIC8qIEZpbmlzaCByZWFkaW5nIHRoZSBpbWFnZSBpbnRvIHRoZSBzdXBwbGllZCBidWZmZXIgYW5kIGNsZWFuIHVwIHRoZQorICAgICogcG5nX2ltYWdlIHN0cnVjdHVyZS4KKyAgICAqCisgICAgKiByb3dfc3RyaWRlIGlzIHRoZSBzdGVwLCBpbiBieXRlIG9yIDItYnl0ZSB1bml0cyBhcyBhcHByb3ByaWF0ZSwKKyAgICAqIGJldHdlZW4gYWRqYWNlbnQgcm93cy4gIEEgcG9zaXRpdmUgc3RyaWRlIGluZGljYXRlcyB0aGF0IHRoZSB0b3AtbW9zdCByb3cKKyAgICAqIGlzIGZpcnN0IGluIHRoZSBidWZmZXIgLSB0aGUgbm9ybWFsIHRvcC1kb3duIGFycmFuZ2VtZW50LiAgQSBuZWdhdGl2ZQorICAgICogc3RyaWRlIGluZGljYXRlcyB0aGF0IHRoZSBib3R0b20tbW9zdCByb3cgaXMgZmlyc3QgaW4gdGhlIGJ1ZmZlci4KKyAgICAqCisgICAgKiBiYWNrZ3JvdW5kIG5lZWQgb25seSBiZSBzdXBwbGllZCBpZiBhbiBhbHBoYSBjaGFubmVsIG11c3QgYmUgcmVtb3ZlZCBmcm9tCisgICAgKiBhIHBuZ19ieXRlIGZvcm1hdCBhbmQgdGhlIHJlbW92YWwgaXMgdG8gYmUgZG9uZSBieSBjb21wb3NpdGluZyBvbiBhIHNvbGlkCisgICAgKiBjb2xvcjsgb3RoZXJ3aXNlIGl0IG1heSBiZSBOVUxMIGFuZCBhbnkgY29tcG9zaXRpb24gd2lsbCBiZSBkb25lIGRpcmVjdGx5CisgICAgKiBvbnRvIHRoZSBidWZmZXIuICBUaGUgdmFsdWUgaXMgYW4gc1JHQiBjb2xvciB0byB1c2UgZm9yIHRoZSBiYWNrZ3JvdW5kLAorICAgICogZm9yIGdyYXlzY2FsZSBvdXRwdXQgdGhlIGdyZWVuIGNoYW5uZWwgaXMgdXNlZC4KKyAgICAqCisgICAgKiBiYWNrZ3JvdW5kIG11c3QgYmUgc3VwcGxpZWQgd2hlbiBhbiBhbHBoYSBjaGFubmVsIG11c3QgYmUgcmVtb3ZlZCBmcm9tIGEKKyAgICAqIHNpbmdsZSBieXRlIGNvbG9yLW1hcHBlZCBvdXRwdXQgZm9ybWF0LCBpbiBvdGhlciB3b3JkcyBpZjoKKyAgICAqCisgICAgKiAxKSBUaGUgb3JpZ2luYWwgZm9ybWF0IGZyb20gcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV8qIGhhZAorICAgICogICAgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBIHNldC4KKyAgICAqIDIpIFRoZSBmb3JtYXQgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdC4KKyAgICAqIDMpIFRoZSBmb3JtYXQgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiBoYXMgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIHNldCBhbmQKKyAgICAqICAgIFBOR19GT1JNQVRfRkxBR19MSU5FQVIgKm5vdCogc2V0LgorICAgICoKKyAgICAqIEZvciBsaW5lYXIgb3V0cHV0IHJlbW92aW5nIHRoZSBhbHBoYSBjaGFubmVsIGlzIGFsd2F5cyBkb25lIGJ5IGNvbXBvc2l0aW5nCisgICAgKiBvbiBibGFjayBhbmQgYmFja2dyb3VuZCBpcyBpZ25vcmVkLgorICAgICoKKyAgICAqIGNvbG9ybWFwIG11c3QgYmUgc3VwcGxpZWQgd2hlbiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgaXMgc2V0LiAgSXQgbXVzdAorICAgICogYmUgYXQgbGVhc3QgdGhlIHNpemUgKGluIGJ5dGVzKSByZXR1cm5lZCBieSBQTkdfSU1BR0VfQ09MT1JNQVBfU0laRS4KKyAgICAqIGltYWdlLT5jb2xvcm1hcF9lbnRyaWVzIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBlbnRyaWVzCisgICAgKiB3cml0dGVuIHRvIHRoZSBjb2xvcm1hcDsgdGhpcyBtYXkgYmUgbGVzcyB0aGFuIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAgICAqLworCitQTkdfRVhQT1JUKDIzOCwgdm9pZCwgcG5nX2ltYWdlX2ZyZWUsIChwbmdfaW1hZ2VwIGltYWdlKSk7CisgICAvKiBGcmVlIGFueSBkYXRhIGFsbG9jYXRlZCBieSBsaWJwbmcgaW4gaW1hZ2UtPm9wYXF1ZSwgc2V0dGluZyB0aGUgcG9pbnRlciB0bworICAgICogTlVMTC4gIE1heSBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKyAgICAqLworI2VuZGlmIC8qIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisvKiBXUklURSBBUElTCisgKiAtLS0tLS0tLS0tCisgKiBGb3Igd3JpdGUgeW91IG11c3QgaW5pdGlhbGl6ZSBhIHBuZ19pbWFnZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGltYWdlIHRvCisgKiBiZSB3cml0dGVuLiAgVG8gZG8gdGhpcyB1c2UgbWVtc2V0IHRvIHNldCB0aGUgd2hvbGUgc3RydWN0dXJlIHRvIDAgdGhlbgorICogaW5pdGlhbGl6ZSBmaWVsZHMgZGVzY3JpYmluZyB5b3VyIGltYWdlLgorICoKKyAqIHZlcnNpb246IG11c3QgYmUgc2V0IHRvIFBOR19JTUFHRV9WRVJTSU9OCisgKiBvcGFxdWU6IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gTlVMTAorICogd2lkdGg6IGltYWdlIHdpZHRoIGluIHBpeGVscworICogaGVpZ2h0OiBpbWFnZSBoZWlnaHQgaW4gcm93cworICogZm9ybWF0OiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIChpbWFnZSBhbmQgY29sb3ItbWFwKSB5b3Ugd2lzaCB0byB3cml0ZQorICogZmxhZ3M6IHNldCB0byAwIHVubGVzcyBvbmUgb2YgdGhlIGRlZmluZWQgZmxhZ3MgYXBwbGllczsgc2V0CisgKiAgICBQTkdfSU1BR0VfRkxBR19DT0xPUlNQQUNFX05PVF9zUkdCIGZvciBjb2xvciBmb3JtYXQgaW1hZ2VzIHdoZXJlIHRoZSBSR0IKKyAqICAgIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgY29sb3JzIGluIHNSR0IuCisgKiBjb2xvcm1hcF9lbnRyaWVzOiBzZXQgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgKDAgdG8gMjU2KQorICovCitQTkdfRVhQT1JUKDIzOSwgaW50LCBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSwgKHBuZ19pbWFnZXAgaW1hZ2UsCisgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgY29udmVydF90b184Yml0LCBjb25zdCB2b2lkICpidWZmZXIsCisgICBwbmdfaW50XzMyIHJvd19zdHJpZGUsIGNvbnN0IHZvaWQgKmNvbG9ybWFwKSk7CisgICAvKiBXcml0ZSB0aGUgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUuICovCisKK1BOR19FWFBPUlQoMjQwLCBpbnQsIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbywgKHBuZ19pbWFnZXAgaW1hZ2UsIEZJTEUgKmZpbGUsCisgICBpbnQgY29udmVydF90b184X2JpdCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBwbmdfaW50XzMyIHJvd19zdHJpZGUsCisgICBjb25zdCB2b2lkICpjb2xvcm1hcCkpOworICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiAoRklMRSopLiAqLworCisvKiBXaXRoIGJvdGggd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGggMTYtYml0CisgKiBkYXRhIHRoZW4gc2V0dGluZyBjb252ZXJ0X3RvXzhfYml0IHdpbGwgY2F1c2UgdGhlIG91dHB1dCB0byBiZSBhbiA4LWJpdCBQTkcKKyAqIGdhbW1hIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24sIG90aGVyd2lzZSBhIDE2LWJpdCBsaW5lYXIKKyAqIGVuY29kZWQgUE5HIGZpbGUgaXMgd3JpdHRlbi4KKyAqCisgKiBXaXRoIGNvbG9yLW1hcHBlZCBkYXRhIGZvcm1hdHMgdGhlIGNvbG9ybWFwIHBhcmFtZXRlciBwb2ludCB0byBhIGNvbG9yLW1hcAorICogd2l0aCBhdCBsZWFzdCBpbWFnZS0+Y29sb3JtYXBfZW50cmllcyBlbmNvZGVkIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0LiAgSWYKKyAqIHRoZSBmb3JtYXQgaXMgbGluZWFyIHRoZSB3cml0dGVuIFBORyBjb2xvci1tYXAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc1JHQgorICogcmVnYXJkbGVzcyBvZiB0aGUgY29udmVydF90b184X2JpdCBmbGFnLgorICoKKyAqIFdpdGggYWxsIEFQSXMgcm93X3N0cmlkZSBpcyBoYW5kbGVkIGFzIGluIHRoZSByZWFkIEFQSXMgLSBpdCBpcyB0aGUgc3BhY2luZworICogZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0IGluIGNvbXBvbmVudCBzaXplZCB1bml0cyAoMSBvciAyIGJ5dGVzKSBhbmQgaWYKKyAqIG5lZ2F0aXZlIGluZGljYXRlcyBhIGJvdHRvbS11cCByb3cgbGF5b3V0IGluIHRoZSBidWZmZXIuCisgKgorICogTm90ZSB0aGF0IHRoZSB3cml0ZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmxhY2luZyBvciBzdWItOC1iaXQgcGl4ZWxzLgorICovCisjZW5kaWYgLyogUE5HX1NURElPX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBFTkQgT0YgU0lNUExJRklFRCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVECitQTkdfRVhQT1JUKDI0Miwgdm9pZCwgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleCwKKyAgICAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCBhbGxvd2VkKSk7CisjICBpZmRlZiBQTkdfR0VUX1BBTEVUVEVfTUFYX1NVUFBPUlRFRAorUE5HX0VYUE9SVCgyNDMsIGludCwgcG5nX2dldF9wYWxldHRlX21heCwgKHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19wdHIsCisgICAgcG5nX2NvbnN0X2luZm9wIGluZm9fcHRyKSk7CisjICBlbmRpZgorI2VuZGlmIC8qIENIRUNLX0ZPUl9JTlZBTElEX0lOREVYICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSU1QTEVNRU5UQVRJT04gT1BUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdXBwb3J0IGZvciBhcmJpdHJhcnkgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgb3B0aW1pemF0aW9ucy4gIFRoZSBBUEkgYWxsb3dzCisgKiBwYXJ0aWN1bGFyIG9wdGlvbnMgdG8gYmUgdHVybmVkIG9uIG9yIG9mZi4gICdPcHRpb24nIGlzIHRoZSBudW1iZXIgb2YgdGhlCisgKiBvcHRpb24gYW5kICdvbm9mZicgaXMgMCAob2ZmKSBvciBub24tMCAob24pLiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIGdpdmVuCisgKiBieSB0aGUgUE5HX09QVElPTl8gZGVmaW5lcyBiZWxvdy4KKyAqCisgKiBIQVJEV0FSRTogbm9ybWFsbHkgaGFyZHdhcmUgY2FwYWJpbGl0ZXMsIHN1Y2ggYXMgdGhlIEludGVsIFNTRSBpbnN0cnVjdGlvbnMsCisgKiAgICAgICAgICAgYXJlIGRldGVjdGVkIGF0IHJ1biB0aW1lLCBob3dldmVyIHNvbWV0aW1lcyBpdCBtYXkgYmUgaW1wb3NzaWJsZQorICogICAgICAgICAgIHRvIGRvIHRoaXMgaW4gdXNlciBtb2RlLCBpbiB3aGljaCBjYXNlIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNjb3ZlcgorICogICAgICAgICAgIHRoZSBjYXBhYmlsaXRpZXMgaW4gYW4gT1Mgc3BlY2lmaWMgd2F5LiAgU3VjaCBjYXBhYmlsaXRpZXMgYXJlCisgKiAgICAgICAgICAgbGlzdGVkIGhlcmUgd2hlbiBsaWJwbmcgaGFzIHN1cHBvcnQgZm9yIHRoZW0gYW5kIG11c3QgYmUgdHVybmVkCisgKiAgICAgICAgICAgT04gYnkgdGhlIGFwcGxpY2F0aW9uIGlmIHByZXNlbnQuCisgKgorICogU09GVFdBUkU6IHNvbWV0aW1lcyBzb2Z0d2FyZSBvcHRpbWl6YXRpb25zIGFjdHVhbGx5IHJlc3VsdCBpbiBwZXJmb3JtYW5jZQorICogICAgICAgICAgIGRlY3JlYXNlIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBvciBzeXN0ZW1zLCBvciB3aXRoIHNvbWUgc2V0cyBvZgorICogICAgICAgICAgIFBORyBpbWFnZXMuICAnU29mdHdhcmUnIG9wdGlvbnMgYWxsb3cgc3VjaCBvcHRpbWl6YXRpb25zIHRvIGJlCisgKiAgICAgICAgICAgc2VsZWN0ZWQgYXQgcnVuIHRpbWUuCisgKi8KKyNpZmRlZiBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQKKyNpZmRlZiBQTkdfQVJNX05FT05fQVBJX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19BUk1fTkVPTiAgIDAgLyogSEFSRFdBUkU6IEFSTSBOZW9uIFNJTUQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCAqLworI2VuZGlmCisjZGVmaW5lIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XIDIgLyogU09GVFdBUkU6IGZvcmNlIG1heGltdW0gd2luZG93ICovCisjZGVmaW5lIFBOR19PUFRJT05fTkVYVCAgNCAvKiBOZXh0IG9wdGlvbiAtIG51bWJlcnMgbXVzdCBiZSBldmVuICovCisKKy8qIFJldHVybiB2YWx1ZXM6IE5PVEU6IHRoZXJlIGFyZSBmb3VyIHZhbHVlcyBhbmQgJ29mZicgaXMgKm5vdCogemVybyAqLworI2RlZmluZSBQTkdfT1BUSU9OX1VOU0VUICAgMCAvKiBVbnNldCAtIGRlZmF1bHRzIHRvIG9mZiAqLworI2RlZmluZSBQTkdfT1BUSU9OX0lOVkFMSUQgMSAvKiBPcHRpb24gbnVtYmVyIG91dCBvZiByYW5nZSAqLworI2RlZmluZSBQTkdfT1BUSU9OX09GRiAgICAgMgorI2RlZmluZSBQTkdfT1BUSU9OX09OICAgICAgMworCitQTkdfRVhQT1JUKDI0NCwgaW50LCBwbmdfc2V0X29wdGlvbiwgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgb3B0aW9uLAorICAgaW50IG9ub2ZmKSk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBFTkQgT0YgSEFSRFdBUkUgT1BUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwdWJsaWMgcHJvdG90eXBlcyBoZXJlIF4sIGluIGxpYnBuZy4zLCBhbmQgcHJvamVjdAorICogZGVmcywgc2NyaXB0cy9wbmdsaWJjb25mLmgsIGFuZCBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAorICovCisKKy8qIFRoZSBsYXN0IG9yZGluYWwgbnVtYmVyICh0aGlzIGlzIHRoZSAqbGFzdCogb25lIGFscmVhZHkgdXNlZDsgdGhlIG5leHQKKyAqIG9uZSB0byB1c2UgaXMgb25lIG1vcmUgdGhhbiB0aGlzLikgIE1haW50YWluZXIsIHJlbWVtYmVyIHRvIGFkZCBhbiBlbnRyeSB0bworICogc2NyaXB0cy9zeW1ib2xzLmRlZiBhcyB3ZWxsLgorICovCisjaWZkZWYgUE5HX0VYUE9SVF9MQVNUX09SRElOQUwKKyAgUE5HX0VYUE9SVF9MQVNUX09SRElOQUwoMjQ0KTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE5HX1ZFUlNJT05fSU5GT19PTkxZICovCisvKiBEbyBub3QgcHV0IGFueXRoaW5nIHBhc3QgdGhpcyBsaW5lICovCisjZW5kaWYgLyogUE5HX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5nY29uZi5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmNzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5nY29uZi5oCkBAIC0wLDAgKzEsNjE3IEBACisNCisvKiBwbmdjb25mLmggLSBtYWNoaW5lIGNvbmZpZ3VyYWJsZSBmaWxlIGZvciBsaWJwbmcNCisgKg0KKyAqIGxpYnBuZyB2ZXJzaW9uIDEuNi4zIC0gSnVseSAxOCwgMjAxMw0KKyAqDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKg0KKyAqLw0KKw0KKy8qIEFueSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgaXMgbmVhciB0aGUgZnJvbnQgb2YgdGhpcyBmaWxlLCBzbyBpZiB5b3UNCisgKiBhcmUgY29uZmlndXJpbmcgbGlicG5nIGZvciBhIG1hY2hpbmUsIHlvdSBtYXkgd2FudCB0byByZWFkIHRoZSBzZWN0aW9uDQorICogc3RhcnRpbmcgaGVyZSBkb3duIHRvIHdoZXJlIGl0IHN0YXJ0cyB0byB0eXBlZGVmIHBuZ19jb2xvciwgcG5nX3RleHQsDQorICogYW5kIHBuZ19pbmZvLg0KKyAqLw0KKw0KKyNpZm5kZWYgUE5HQ09ORl9IDQorI2RlZmluZSBQTkdDT05GX0gNCisNCisvKiBUbyBkbzogRG8gYWxsIG9mIHRoaXMgaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYSAqLw0KKyNpZmRlZiBQTkdfU0FGRV9MSU1JVFNfU1VQUE9SVEVEDQorIyAgaWZkZWYgUE5HX1VTRVJfV0lEVEhfTUFYDQorIyAgICB1bmRlZiBQTkdfVVNFUl9XSURUSF9NQVgNCisjICAgIGRlZmluZSBQTkdfVVNFUl9XSURUSF9NQVggMTAwMDAwMEwNCisjICBlbmRpZg0KKyMgIGlmZGVmIFBOR19VU0VSX0hFSUdIVF9NQVgNCisjICAgIHVuZGVmIFBOR19VU0VSX0hFSUdIVF9NQVgNCisjICAgIGRlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDEwMDAwMDBMDQorIyAgZW5kaWYNCisjICBpZmRlZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYDQorIyAgICB1bmRlZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYDQorIyAgICBkZWZpbmUgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCA0MDAwMDAwTA0KKyMgIGVuZGlmDQorIyAgaWZkZWYgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYDQorIyAgICB1bmRlZiBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVgNCisjICAgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMTI4DQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19CVUlMRElOR19TWU1CT0xfVEFCTEUgLyogZWxzZSBpbmNsdWRlcyBtYXkgY2F1c2UgcHJvYmxlbXMgKi8NCisNCisvKiBGcm9tIGxpYnBuZyAxLjYuMCBsaWJwbmcgcmVxdWlyZXMgYW4gQU5TSSBYMy4xNTktMTk4OSAoIklTT0M5MCIpIGNvbXBsaWFudCBDDQorICogY29tcGlsZXIgZm9yIGNvcnJlY3QgY29tcGlsYXRpb24uICBUaGUgZm9sbG93aW5nIGhlYWRlciBmaWxlcyBhcmUgcmVxdWlyZWQgYnkNCisgKiB0aGUgc3RhbmRhcmQuICBJZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSB0aGVzZSBoZWFkZXIgZmlsZXMsIG9yIHRoZXkNCisgKiBkbyBub3QgbWF0Y2ggdGhlIHN0YW5kYXJkLCB5b3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUvaW1wcm92ZSB0aGVtLg0KKyAqLw0KKyNpbmNsdWRlIDxsaW1pdHMuaD4NCisjaW5jbHVkZSA8c3RkZGVmLmg+DQorDQorLyogTGlicmFyeSBoZWFkZXIgZmlsZXMuICBUaGVzZSBoZWFkZXIgZmlsZXMgYXJlIGFsbCBkZWZpbmVkIGJ5IElTT0M5MDsgbGlicG5nDQorICogZXhwZWN0cyBjb25mb3JtYW50IGltcGxlbWVudGF0aW9ucywgaG93ZXZlciwgYW4gSVNPQzkwIGNvbmZvcm1hbnQgc3lzdGVtIG5lZWQNCisgKiBub3QgcHJvdmlkZSB0aGVzZSBoZWFkZXIgZmlsZXMgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIGltcGxlbWVudGVkLg0KKyAqIEluIHRoaXMgY2FzZSBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoZSByZWxldmFudCBwYXJ0cyBvZiBsaWJwbmcgaW4NCisgKiB0aGUgYnVpbGQgb2YgcG5nbGliY29uZi5oLg0KKyAqDQorICogUHJpb3IgdG8gMS42LjAgc3RyaW5nLmggd2FzIGluY2x1ZGVkIGhlcmU7IHRoZSBBUEkgY2hhbmdlcyBpbiAxLjYuMCB0byBub3QNCisgKiBpbmNsdWRlIHRoaXMgdW5uZWNlc3NhcnkgaGVhZGVyIGZpbGUuDQorICovDQorDQorI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQNCisgICAvKiBSZXF1aXJlZCBmb3IgdGhlIGRlZmluaXRpb24gb2YgRklMRTogKi8NCisjICBpbmNsdWRlIDxzdGRpby5oPg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRA0KKyAgIC8qIFJlcXVpcmVkIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBqbXBfYnVmIGFuZCB0aGUgZGVjbGFyYXRpb24gb2YgbG9uZ2ptcDogKi8NCisjICBpbmNsdWRlIDxzZXRqbXAuaD4NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQNCisgICAvKiBSZXF1aXJlZCBmb3Igc3RydWN0IHRtOiAqLw0KKyMgIGluY2x1ZGUgPHRpbWUuaD4NCisjZW5kaWYNCisNCisjZW5kaWYgLyogUE5HX0JVSUxESU5HX1NZTUJPTF9UQUJMRSAqLw0KKw0KKy8qIFByaW9yIHRvIDEuNi4wIGl0IHdhcyBwb3NzaWJsZSB0byB0dXJuIG9mZiAnY29uc3QnIGluIGRlY2xhcmF0aW9ucyB1c2luZw0KKyAqIFBOR19OT19DT05TVDsgdGhpcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGV4Y2VwdCBmb3IgZGF0YSBkZWNsYXJhdGlvbnMgd2hpY2gNCisgKiBhcHBhcmVudGx5IHN0aWxsIGNhdXNlIHByb2JsZW1zIGluIDIwMTEgb24gc29tZSBjb21waWxlcnMuDQorICovDQorI2RlZmluZSBQTkdfQ09OU1QgY29uc3QgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5ICovDQorDQorLyogVGhpcyBjb250cm9scyBvcHRpbWl6YXRpb24gb2YgdGhlIHJlYWRpbmcgb2YgMTYgYW5kIDMyIGJpdCB2YWx1ZXMNCisgKiBmcm9tIFBORyBmaWxlcy4gIEl0IGNhbiBiZSBzZXQgb24gYSBwZXItYXBwLWZpbGUgYmFzaXMgLSBpdA0KKyAqIGp1c3QgY2hhbmdlcyB3aGV0aGVyIGEgbWFjcm8gaXMgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuDQorICogVGhlIGxpYnJhcnkgYnVpbGRlciBzZXRzIHRoZSBkZWZhdWx0OyBpZiByZWFkIGZ1bmN0aW9ucyBhcmUgbm90DQorICogYnVpbHQgaW50byB0aGUgbGlicmFyeSB0aGUgbWFjcm8gaW1wbGVtZW50YXRpb24gaXMgZm9yY2VkIG9uLg0KKyAqLw0KKyNpZm5kZWYgUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQNCisjICBkZWZpbmUgUE5HX1VTRV9SRUFEX01BQ1JPUw0KKyNlbmRpZg0KKyNpZiAhZGVmaW5lZChQTkdfTk9fVVNFX1JFQURfTUFDUk9TKSAmJiAhZGVmaW5lZChQTkdfVVNFX1JFQURfTUFDUk9TKQ0KKyMgIGlmIFBOR19ERUZBVUxUX1JFQURfTUFDUk9TDQorIyAgICBkZWZpbmUgUE5HX1VTRV9SRUFEX01BQ1JPUw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogQ09NUElMRVIgU1BFQ0lGSUMgT1BUSU9OUy4NCisgKg0KKyAqIFRoZXNlIG9wdGlvbnMgYXJlIHByb3ZpZGVkIHNvIHRoYXQgYSB2YXJpZXR5IG9mIGRpZmZpY3VsdCBjb21waWxlcnMNCisgKiBjYW4gYmUgdXNlZC4gIFNvbWUgYXJlIGZpeGVkIGF0IGJ1aWxkIHRpbWUgKGUuZy4gUE5HX0FQSV9SVUxFDQorICogYmVsb3cpIGJ1dCBzdGlsbCBoYXZlIGNvbXBpbGVyIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucywgb3RoZXJzDQorICogbWF5IGJlIGNoYW5nZWQgb24gYSBwZXItZmlsZSBiYXNpcyB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IGxpYnBuZy4NCisgKi8NCisNCisvKiBUaGUgUE5HQVJHIG1hY3JvIHdhcyB1c2VkIGluIHZlcnNpb25zIG9mIGxpYnBuZyBwcmlvciB0byAxLjYuMCB0byBwcm90ZWN0DQorICogYWdhaW5zdCBsZWdhY3kgKHByZSBJU09DOTApIGNvbXBpbGVycyB0aGF0IGRpZCBub3QgdW5kZXJzdGFuZCBmdW5jdGlvbg0KKyAqIHByb3RvdHlwZXMuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIG1vZGVybiBDIGNvbXBpbGVycy4NCisgKi8NCisjaWZuZGVmIFBOR0FSRw0KKyMgIGRlZmluZSBQTkdBUkcoYXJnbGlzdCkgYXJnbGlzdA0KKyNlbmRpZg0KKw0KKy8qIEZ1bmN0aW9uIGNhbGxpbmcgY29udmVudGlvbnMuDQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgKiBOb3JtYWxseSBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgdG8gdGhlIGNvbXBpbGVyIGhvdyB0byBjYWxsDQorICogYSBmdW5jdGlvbiAtIGl0IGp1c3QgZG9lcyBpdCAtIGhvd2V2ZXIgb24geDg2IHN5c3RlbXMgZGVyaXZlZCBmcm9tDQorICogTWljcm9zb2Z0IGFuZCBCb3JsYW5kIEMgY29tcGlsZXJzICgnSUJNIFBDJywgJ0RPUycsICdXaW5kb3dzJyBzeXN0ZW1zDQorICogYW5kIHNvbWUgb3RoZXJzKSB0aGVyZSBhcmUgbXVsdGlwbGUgd2F5cyB0byBjYWxsIGEgZnVuY3Rpb24gYW5kIHRoZQ0KKyAqIGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4gIEZvciB0aGlzIHJlYXNvbg0KKyAqIGxpYnBuZyBzcGVjaWZpZXMgdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBldmVyeSBleHBvcnRlZCBmdW5jdGlvbiBhbmQNCisgKiBldmVyeSBmdW5jdGlvbiBjYWxsZWQgdmlhIGEgdXNlciBzdXBwbGllZCBmdW5jdGlvbiBwb2ludGVyLiAgVGhpcyBpcw0KKyAqIGRvbmUgaW4gdGhpcyBmaWxlIGJ5IGRlZmluaW5nIHRoZSBmb2xsb3dpbmcgbWFjcm9zOg0KKyAqDQorICogUE5HQVBJICAgIENhbGxpbmcgY29udmVudGlvbiBmb3IgZXhwb3J0ZWQgZnVuY3Rpb25zLg0KKyAqIFBOR0NCQVBJICBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIHVzZXIgcHJvdmlkZWQgKGNhbGxiYWNrKSBmdW5jdGlvbnMuDQorICogUE5HQ0FQSSAgIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBBTlNJLUMgbGlicmFyeSAocmVxdWlyZWQNCisgKiAgICAgICAgICAgZm9yIGxvbmdqbXAgY2FsbGJhY2tzIGFuZCBzb21ldGltZXMgdXNlZCBpbnRlcm5hbGx5IHRvDQorICogICAgICAgICAgIHNwZWNpZnkgdGhlIGNhbGxpbmcgY29udmVudGlvbiBmb3IgemxpYikuDQorICoNCisgKiBUaGVzZSBtYWNyb3Mgc2hvdWxkIG5ldmVyIGJlIG92ZXJyaWRkZW4uICBJZiBpdCBpcyBuZWNlc3NhcnkgdG8NCisgKiBjaGFuZ2UgY2FsbGluZyBjb252ZW50aW9uIGluIGEgcHJpdmF0ZSBidWlsZCB0aGlzIGNhbiBiZSBkb25lDQorICogYnkgc2V0dGluZyBQTkdfQVBJX1JVTEUgKHdoaWNoIGRlZmF1bHRzIHRvIDApIHRvIG9uZSBvZiB0aGUgdmFsdWVzDQorICogYmVsb3cgdG8gc2VsZWN0IHRoZSBjb3JyZWN0ICdBUEknIHZhcmlhbnRzLg0KKyAqDQorICogUE5HX0FQSV9SVUxFPTAgVXNlIFBOR0NBUEkgLSB0aGUgJ0MnIGNhbGxpbmcgY29udmVudGlvbiAtIHRocm91Z2hvdXQuDQorICogICAgICAgICAgICAgICAgVGhpcyBpcyBjb3JyZWN0IGluIGV2ZXJ5IGtub3duIGVudmlyb25tZW50Lg0KKyAqIFBOR19BUElfUlVMRT0xIFVzZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBjb252ZW50aW9uIGZvciBQTkdBUEkgYW5kDQorICogICAgICAgICAgICAgICAgdGhlICdDJyBjYWxsaW5nIGNvbnZlbnRpb24gKGZyb20gUE5HQ0FQSSkgZm9yDQorICogICAgICAgICAgICAgICAgY2FsbGJhY2tzIChQTkdDQkFQSSkuICBUaGlzIGlzIG5vIGxvbmdlciByZXF1aXJlZA0KKyAqICAgICAgICAgICAgICAgIGluIGFueSBrbm93biBlbnZpcm9ubWVudCAtIGlmIGl0IGhhcyB0byBiZSB1c2VkDQorICogICAgICAgICAgICAgICAgcGxlYXNlIHBvc3QgYW4gZXhwbGFuYXRpb24gb2YgdGhlIHByb2JsZW0gdG8gdGhlDQorICogICAgICAgICAgICAgICAgbGlicG5nIG1haWxpbmcgbGlzdC4NCisgKg0KKyAqIFRoZXNlIGNhc2VzIG9ubHkgZGlmZmVyIGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHVzZSB0aGUgQw0KKyAqIGNhbGxpbmcgY29udmVudGlvbiwgYXQgcHJlc2VudCB0aGlzIGp1c3QgbWVhbnMgdGhlIGFib3ZlIGNhc2VzDQorICogKHg4NiBET1MvV2luZG93cyBzeXRlbXMpIGFuZCwgZXZlbiB0aGVuLCB0aGlzIGRvZXMgbm90IGFwcGx5IHRvDQorICogQ3lnd2luIHJ1bm5pbmcgb24gdGhvc2Ugc3lzdGVtcy4NCisgKg0KKyAqIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBkZWZpbmVkIGluIHBuZ2xpYmNvbmYuaCBzbyB0aGF0IHdoYXQNCisgKiB0aGUgYXBwbGljYXRpb24gdXNlcyB0byBjYWxsIHRoZSBsaWJyYXJ5IG1hdGNoZXMgdGhlIGNvbnZlbnRpb25zDQorICogc2V0IHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuDQorICovDQorDQorLyogU3ltYm9sIGV4cG9ydA0KKyAqID09PT09PT09PT09PT0NCisgKiBXaGVuIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgaXQgaXMgYWxtb3N0IGFsd2F5cyBuZWNlc3NhcnkgdG8gdGVsbA0KKyAqIHRoZSBjb21waWxlciB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gIFRoZSBwbmcuaCBtYWNybyAnUE5HX0VYUE9SVCcNCisgKiBpcyB1c2VkIHRvIG1hcmsgdGhlIHN5bWJvbHMuICBPbiBzb21lIHN5c3RlbXMgdGhlc2Ugc3ltYm9scyBjYW4gYmUNCisgKiBleHRyYWN0ZWQgYXQgbGluayB0aW1lIGFuZCBuZWVkIG5vIHNwZWNpYWwgcHJvY2Vzc2luZyBieSB0aGUgY29tcGlsZXIsDQorICogb24gb3RoZXIgc3lzdGVtcyB0aGUgc3ltYm9scyBhcmUgZmxhZ2dlZCBieSB0aGUgY29tcGlsZXIgYW5kIGp1c3QNCisgKiB0aGUgZGVjbGFyYXRpb24gcmVxdWlyZXMgYSBzcGVjaWFsIHRhZyBhcHBsaWVkICh1bmZvcnR1bmF0ZWx5KSBpbiBhDQorICogY29tcGlsZXIgZGVwZW5kZW50IHdheS4gIFNvbWUgc3lzdGVtcyBjYW4gZG8gZWl0aGVyLg0KKyAqDQorICogQSBzbWFsbCBudW1iZXIgb2Ygb2xkZXIgc3lzdGVtcyBhbHNvIHJlcXVpcmUgYSBzeW1ib2wgZnJvbSBhIERMTCB0bw0KKyAqIGJlIGZsYWdnZWQgdG8gdGhlIHByb2dyYW0gdGhhdCBjYWxscyBpdC4gIFRoaXMgaXMgYSBwcm9ibGVtIGJlY2F1c2UNCisgKiB3ZSBkbyBub3Qga25vdyBpbiB0aGUgaGVhZGVyIGZpbGUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb24gY29kZSB0aGF0DQorICogdGhlIHN5bWJvbCB3aWxsIGNvbWUgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljYWxseQ0KKyAqIGxpbmtlZCBvbmUuICBGb3IgdGhpcyByZWFzb24gdGhlIGFwcGxpY2F0aW9uIG11c3QgdGVsbCB1cyBieSBzZXR0aW5nDQorICogdGhlIG1hZ2ljIGZsYWcgUE5HX1VTRV9ETEwgdG8gdHVybiBvbiB0aGUgc3BlY2lhbCBwcm9jZXNzaW5nIGJlZm9yZQ0KKyAqIGl0IGluY2x1ZGVzIHBuZy5oLg0KKyAqDQorICogRm91ciBhZGRpdGlvbmFsIG1hY3JvcyBhcmUgdXNlZCB0byBtYWtlIHRoaXMgaGFwcGVuOg0KKyAqDQorICogUE5HX0lNUEVYUCBUaGUgbWFnaWMgKGlmIGFueSkgdG8gY2F1c2UgYSBzeW1ib2wgdG8gYmUgZXhwb3J0ZWQgZnJvbQ0KKyAqICAgICAgICAgICAgdGhlIGJ1aWxkIG9yIGltcG9ydGVkIGlmIFBOR19VU0VfRExMIGlzIHNldCAtIGNvbXBpbGVyDQorICogICAgICAgICAgICBhbmQgc3lzdGVtIHNwZWNpZmljLg0KKyAqDQorICogUE5HX0VYUE9SVF9UWVBFKHR5cGUpIEEgbWFjcm8gdGhhdCBwcmUgb3IgYXBwZW5kcyBQTkdfSU1QRVhQIHRvDQorICogICAgICAgICAgICAgICAgICAgICAgICd0eXBlJywgY29tcGlsZXIgc3BlY2lmaWMuDQorICoNCisgKiBQTkdfRExMX0VYUE9SVCBTZXQgdG8gdGhlIG1hZ2ljIHRvIHVzZSBkdXJpbmcgYSBsaWJwbmcgYnVpbGQgdG8NCisgKiAgICAgICAgICAgICAgICBtYWtlIGEgc3ltYm9sIGV4cG9ydGVkIGZyb20gdGhlIERMTC4gIE5vdCB1c2VkIGluIHRoZQ0KKyAqICAgICAgICAgICAgICAgIHB1YmxpYyBoZWFkZXIgZmlsZXM7IHNlZSBwbmdwcml2LmggZm9yIGhvdyBpdCBpcyB1c2VkDQorICogICAgICAgICAgICAgICAgaW4gdGhlIGxpYnBuZyBidWlsZC4NCisgKg0KKyAqIFBOR19ETExfSU1QT1JUIFNldCB0byB0aGUgbWFnaWMgdG8gZm9yY2UgdGhlIGxpYnBuZyBzeW1ib2xzIHRvIGNvbWUNCisgKiAgICAgICAgICAgICAgICBmcm9tIGEgRExMIC0gdXNlZCB0byBkZWZpbmUgUE5HX0lNUEVYUCB3aGVuDQorICogICAgICAgICAgICAgICAgUE5HX1VTRV9ETEwgaXMgc2V0Lg0KKyAqLw0KKw0KKy8qIFN5c3RlbSBzcGVjaWZpYyBkaXNjb3ZlcnkuDQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgKiBUaGlzIGNvZGUgaXMgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGZpbmQgUE5HX0lNUEVYUCwgdGhlIEFQSSBzZXR0aW5ncw0KKyAqIGFuZCBQTkdfRVhQT1JUX1RZUEUoKSwgaXQgbWF5IGFsc28gc2V0IGEgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIERMTA0KKyAqIGltcG9ydCBwcm9jZXNzaW5nIGlzIHBvc3NpYmxlLiAgT24gV2luZG93cyBzeXN0ZW1zIGl0IGFsc28gc2V0cw0KKyAqIGNvbXBpbGVyLXNwZWNpZmljIG1hY3JvcyB0byB0aGUgdmFsdWVzIHJlcXVpcmVkIHRvIGNoYW5nZSB0aGUgY2FsbGluZw0KKyAqIGNvbnZlbnRpb25zIG9mIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucy4NCisgKi8NCisjaWYgZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikgfHxcDQorICAgIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQ0KKyAgLyogV2luZG93cyBzeXN0ZW0gKERPUyBkb2Vzbid0IHN1cHBvcnQgRExMcykuICBJbmNsdWRlcyBidWlsZHMgdW5kZXIgQ3lnd2luIG9yDQorICAgKiBNaW5HVyBvbiBhbnkgYXJjaGl0ZWN0dXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgV2luZG93cy4gIEFsc28gaW5jbHVkZXMNCisgICAqIFdhdGNvbSBidWlsZHMgYnV0IHRoZXNlIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgYmVjYXVzZSB0aGV5IGFyZSBub3QNCisgICAqIGNvbXBhdGlibGUgd2l0aCBHQ0Mgb3IgVmlzdWFsIEMgYmVjYXVzZSBvZiBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9ucy4NCisgICAqLw0KKyMgIGlmIFBOR19BUElfUlVMRSA9PSAyDQorICAgIC8qIElmIHRoaXMgbGluZSByZXN1bHRzIGluIGFuIGVycm9yLCBlaXRoZXIgYmVjYXVzZSBfX3dhdGNhbGwgaXMgbm90DQorICAgICAqIHVuZGVyc3Rvb2Qgb3IgYmVjYXVzZSBvZiBhIHJlZGVmaW5lIGp1c3QgYmVsb3cgeW91IGNhbm5vdCB1c2UgKnRoaXMqDQorICAgICAqIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGNvbXBpbGVyIHlvdSBhcmUgdXNpbmcuICAqVGhpcyogYnVpbGQgd2FzDQorICAgICAqIGJ1aWxkIHVzaW5nIFdhdGNvbSBhbmQgYXBwbGljYXRpb25zIG11c3QgYWxzbyBiZSBidWlsdCB1c2luZyBXYXRjb20hDQorICAgICAqLw0KKyMgICAgZGVmaW5lIFBOR0NBUEkgX193YXRjYWxsDQorIyAgZW5kaWYNCisNCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDgwMCkpDQorIyAgICBkZWZpbmUgUE5HQ0FQSSBfX2NkZWNsDQorIyAgICBpZiBQTkdfQVBJX1JVTEUgPT0gMQ0KKyAgICAgICAvKiBJZiB0aGlzIGxpbmUgcmVzdWx0cyBpbiBhbiBlcnJvciBfX3N0ZGNhbGwgaXMgbm90IHVuZGVyc3Rvb2QgYW5kDQorICAgICAgICAqIFBOR19BUElfUlVMRSBzaG91bGQgbm90IGhhdmUgYmVlbiBzZXQgdG8gJzEnLg0KKyAgICAgICAgKi8NCisjICAgICAgZGVmaW5lIFBOR0FQSSBfX3N0ZGNhbGwNCisjICAgIGVuZGlmDQorIyAgZWxzZQ0KKyAgICAvKiBBbiBvbGRlciBjb21waWxlciwgb3Igb25lIG5vdCBkZXRlY3RlZCAoZXJyb25lb3VzbHkpIGFib3ZlLA0KKyAgICAgKiBpZiBuZWNlc3Nhcnkgb3ZlcnJpZGUgb24gdGhlIGNvbW1hbmQgbGluZSB0byBnZXQgdGhlIGNvcnJlY3QNCisgICAgICogdmFyaWFudHMgZm9yIHRoZSBjb21waWxlci4NCisgICAgICovDQorIyAgICBpZm5kZWYgUE5HQ0FQSQ0KKyMgICAgICBkZWZpbmUgUE5HQ0FQSSBfY2RlY2wNCisjICAgIGVuZGlmDQorIyAgICBpZiBQTkdfQVBJX1JVTEUgPT0gMSAmJiAhZGVmaW5lZChQTkdBUEkpDQorIyAgICAgIGRlZmluZSBQTkdBUEkgX3N0ZGNhbGwNCisjICAgIGVuZGlmDQorIyAgZW5kaWYgLyogY29tcGlsZXIvYXBpICovDQorDQorICAvKiBOT1RFOiBQTkdDQkFQSSBhbHdheXMgZGVmYXVsdHMgdG8gUE5HQ0FQSS4gKi8NCisNCisjICBpZiBkZWZpbmVkKFBOR0FQSSkgJiYgIWRlZmluZWQoUE5HX1VTRVJfUFJJVkFURUJVSUxEKQ0KKyMgICAgIGVycm9yICJQTkdfVVNFUl9QUklWQVRFQlVJTEQgbXVzdCBiZSBkZWZpbmVkIGlmIFBOR0FQSSBpcyBjaGFuZ2VkIg0KKyMgIGVuZGlmDQorDQorIyAgaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgODAwKSB8fFwNCisgICAgICAoZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIF9fQk9STEFORENfXyA8IDB4NTAwKQ0KKyAgICAvKiBvbGRlciBCb3JsYW5kIGFuZCBNU0MNCisgICAgICogY29tcGlsZXJzIHVzZWQgJ19fZXhwb3J0JyBhbmQgcmVxdWlyZWQgdGhpcyB0byBiZSBhZnRlcg0KKyAgICAgKiB0aGUgdHlwZS4NCisgICAgICovDQorIyAgICBpZm5kZWYgUE5HX0VYUE9SVF9UWVBFDQorIyAgICAgIGRlZmluZSBQTkdfRVhQT1JUX1RZUEUodHlwZSkgdHlwZSBQTkdfSU1QRVhQDQorIyAgICBlbmRpZg0KKyMgICAgZGVmaW5lIFBOR19ETExfRVhQT1JUIF9fZXhwb3J0DQorIyAgZWxzZSAvKiBuZXdlciBjb21waWxlciAqLw0KKyMgICAgZGVmaW5lIFBOR19ETExfRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQ0KKyMgICAgaWZuZGVmIFBOR19ETExfSU1QT1JUDQorIyAgICAgIGRlZmluZSBQTkdfRExMX0lNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkNCisjICAgIGVuZGlmDQorIyAgZW5kaWYgLyogY29tcGlsZXIgKi8NCisNCisjZWxzZSAvKiAhV2luZG93cyAqLw0KKyMgIGlmIChkZWZpbmVkKF9fSUJNQ19fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pKSAmJiBkZWZpbmVkKF9fT1MyX18pDQorIyAgICBkZWZpbmUgUE5HQVBJIF9TeXN0ZW0NCisjICBlbHNlIC8qICFXaW5kb3dzL3g4NiAmJiAhT1MvMiAqLw0KKyAgICAvKiBVc2UgdGhlIGRlZmF1bHRzLCBvciBkZWZpbmUgUE5HKkFQSSBvbiB0aGUgY29tbWFuZCBsaW5lIChidXQNCisgICAgICogdGhpcyB3aWxsIGhhdmUgdG8gYmUgZG9uZSBmb3IgZXZlcnkgY29tcGlsZSEpDQorICAgICAqLw0KKyMgIGVuZGlmIC8qIG90aGVyIHN5c3RlbSwgIU9TLzIgKi8NCisjZW5kaWYgLyogIVdpbmRvd3MveDg2ICovDQorDQorLyogTm93IGRvIGFsbCB0aGUgZGVmYXVsdGluZyAuICovDQorI2lmbmRlZiBQTkdDQVBJDQorIyAgZGVmaW5lIFBOR0NBUEkNCisjZW5kaWYNCisjaWZuZGVmIFBOR0NCQVBJDQorIyAgZGVmaW5lIFBOR0NCQVBJIFBOR0NBUEkNCisjZW5kaWYNCisjaWZuZGVmIFBOR0FQSQ0KKyMgIGRlZmluZSBQTkdBUEkgUE5HQ0FQSQ0KKyNlbmRpZg0KKw0KKy8qIFBOR19JTVBFWFAgbWF5IGJlIHNldCBvbiB0aGUgY29tcGlsYXRpb24gc3lzdGVtIGNvbW1hbmQgbGluZSBvciAoaWYgbm90IHNldCkNCisgKiB0aGVuIGluIGFuIGludGVybmFsIGhlYWRlciBmaWxlIHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnksIG90aGVyd2lzZSAod2hlbg0KKyAqIHVzaW5nIHRoZSBsaWJyYXJ5KSBpdCBpcyBzZXQgaGVyZS4NCisgKi8NCisjaWZuZGVmIFBOR19JTVBFWFANCisjICBpZiBkZWZpbmVkKFBOR19VU0VfRExMKSAmJiBkZWZpbmVkKFBOR19ETExfSU1QT1JUKQ0KKyAgICAgLyogVGhpcyBmb3JjZXMgdXNlIG9mIGEgRExMLCBkaXNhbGxvd2luZyBzdGF0aWMgbGlua2luZyAqLw0KKyMgICAgZGVmaW5lIFBOR19JTVBFWFAgUE5HX0RMTF9JTVBPUlQNCisjICBlbmRpZg0KKw0KKyMgIGlmbmRlZiBQTkdfSU1QRVhQDQorIyAgICBkZWZpbmUgUE5HX0lNUEVYUA0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogSW4gMS41LjIgdGhlIGRlZmluaXRpb24gb2YgUE5HX0ZVTkNUSU9OIGhhcyBiZWVuIGNoYW5nZWQgdG8gYWx3YXlzIHRyZWF0DQorICogJ2F0dHJpYnV0ZXMnIGFzIGEgc3RvcmFnZSBjbGFzcyAtIHRoZSBhdHRyaWJ1dGVzIGdvIGF0IHRoZSBzdGFydCBvZiB0aGUNCisgKiBmdW5jdGlvbiBkZWZpbml0aW9uLCBhbmQgYXR0cmlidXRlcyBhcmUgYWx3YXlzIGFwcGVuZGVkIHJlZ2FyZGxlc3Mgb2YgdGhlDQorICogY29tcGlsZXIuICBUaGlzIGNvbnNpZGVyYWJseSBzaW1wbGlmaWVzIHRoZXNlIG1hY3JvcyBidXQgbWF5IGNhdXNlIHByb2JsZW1zDQorICogaWYgYW55IGNvbXBpbGVycyBib3RoIG5lZWQgZnVuY3Rpb24gYXR0cmlidXRlcyBhbmQgZmFpbCB0byBoYW5kbGUgdGhlbSBhcw0KKyAqIGEgc3RvcmFnZSBjbGFzcyAodGhpcyBpcyB1bmxpa2VseS4pDQorICovDQorI2lmbmRlZiBQTkdfRlVOQ1RJT04NCisjICBkZWZpbmUgUE5HX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpIGF0dHJpYnV0ZXMgdHlwZSBuYW1lIGFyZ3MNCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19FWFBPUlRfVFlQRQ0KKyMgIGRlZmluZSBQTkdfRVhQT1JUX1RZUEUodHlwZSkgUE5HX0lNUEVYUCB0eXBlDQorI2VuZGlmDQorDQorICAgLyogVGhlIG9yZGluYWwgdmFsdWUgaXMgb25seSByZWxldmFudCB3aGVuIHByZXByb2Nlc3NpbmcgcG5nLmggZm9yIHN5bWJvbA0KKyAgICAqIHRhYmxlIGVudHJpZXMsIHNvIHdlIGRpc2NhcmQgaXQgaGVyZS4gIFNlZSB0aGUgLmRmbiBmaWxlcyBpbiB0aGUNCisgICAgKiBzY3JpcHRzIGRpcmVjdG9yeS4NCisgICAgKi8NCisjaWZuZGVmIFBOR19FWFBPUlRBDQorDQorIyAgZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXA0KKyAgICAgIFBOR19GVU5DVElPTihQTkdfRVhQT1JUX1RZUEUodHlwZSksKFBOR0FQSSBuYW1lKSxQTkdBUkcoYXJncyksIFwNCisgICAgICAgIGV4dGVybiBhdHRyaWJ1dGVzKQ0KKyNlbmRpZg0KKw0KKy8qIEFOU0ktQyAoQzkwKSBkb2VzIG5vdCBwZXJtaXQgYSBtYWNybyB0byBiZSBpbnZva2VkIHdpdGggYW4gZW1wdHkgYXJndW1lbnQsDQorICogc28gbWFrZSBzb21ldGhpbmcgbm9uLWVtcHR5IHRvIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50Og0KKyAqLw0KKyNkZWZpbmUgUE5HX0VNUFRZIC8qZW1wdHkgbGlzdCovDQorDQorI2RlZmluZSBQTkdfRVhQT1JUKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MpXA0KKyAgIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIFBOR19FTVBUWSkNCisNCisvKiBVc2UgUE5HX1JFTU9WRUQgdG8gY29tbWVudCBvdXQgYSByZW1vdmVkIGludGVyZmFjZS4gKi8NCisjaWZuZGVmIFBOR19SRU1PVkVEDQorIyAgZGVmaW5lIFBOR19SRU1PVkVEKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpDQorI2VuZGlmDQorDQorI2lmbmRlZiBQTkdfQ0FMTEJBQ0sNCisjICBkZWZpbmUgUE5HX0NBTExCQUNLKHR5cGUsIG5hbWUsIGFyZ3MpIHR5cGUgKFBOR0NCQVBJIG5hbWUpIFBOR0FSRyhhcmdzKQ0KKyNlbmRpZg0KKw0KKy8qIFN1cHBvcnQgZm9yIGNvbXBpbGVyIHNwZWNpZmljIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICBUaGVzZSBhcmUgdXNlZA0KKyAqIHNvIHRoYXQgd2hlcmUgY29tcGlsZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUgaW5jb3JyZWN0IHVzZSBvZiBBUEkNCisgKiBmdW5jdGlvbnMgaW4gcG5nLmggd2lsbCBnZW5lcmF0ZSBjb21waWxlciB3YXJuaW5ncy4NCisgKg0KKyAqIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDEuDQorICovDQorDQorI2lmbmRlZiBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MNCisjICBpZm5kZWYgUE5HX1BFREFOVElDX1dBUk5JTkdTX1NVUFBPUlRFRA0KKyMgICAgZGVmaW5lIFBOR19QRURBTlRJQ19XQVJOSU5HU19TVVBQT1JURUQNCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUEVEQU5USUNfV0FSTklOR1NfU1VQUE9SVEVEDQorICAvKiBTdXBwb3J0IGZvciBjb21waWxlciBzcGVjaWZpYyBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgVGhlc2UgYXJlIHVzZWQNCisgICAqIHNvIHRoYXQgd2hlcmUgY29tcGlsZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUsIGluY29ycmVjdCB1c2Ugb2YgQVBJDQorICAgKiBmdW5jdGlvbnMgaW4gcG5nLmggd2lsbCBnZW5lcmF0ZSBjb21waWxlciB3YXJuaW5ncy4gIEFkZGVkIGF0IGxpYnBuZw0KKyAgICogdmVyc2lvbiAxLjIuNDEuICBEaXNhYmxpbmcgdGhlc2UgcmVtb3ZlcyB0aGUgd2FybmluZ3MgYnV0IG1heSBhbHNvIHByb2R1Y2UNCisgICAqIGxlc3MgZWZmaWNpZW50IGNvZGUuDQorICAgKi8NCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKQ0KKyMgICAgaWZuZGVmIFBOR19VU0VfUkVTVUxUDQorIyAgICAgIGRlZmluZSBQTkdfVVNFX1JFU1VMVCBfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSkNCisjICAgIGVuZGlmDQorIyAgICBpZm5kZWYgUE5HX05PUkVUVVJODQorIyAgICAgIGRlZmluZSBQTkdfTk9SRVRVUk4gICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQ0KKyMgICAgZW5kaWYNCisjICAgIGlmIF9fR05VQ19fID49IDMNCisjICAgICAgaWZuZGVmIFBOR19BTExPQ0FURUQNCisjICAgICAgICBkZWZpbmUgUE5HX0FMTE9DQVRFRCAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpDQorIyAgICAgIGVuZGlmDQorIyAgICAgIGlmbmRlZiBQTkdfREVQUkVDQVRFRA0KKyMgICAgICAgIGRlZmluZSBQTkdfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpDQorIyAgICAgIGVuZGlmDQorIyAgICAgIGlmbmRlZiBQTkdfUFJJVkFURQ0KKyMgICAgICAgIGlmIDAgLyogRG9lc24ndCB3b3JrIHNvIHdlIHVzZSBkZXByZWNhdGVkIGluc3RlYWQqLw0KKyMgICAgICAgICAgZGVmaW5lIFBOR19QUklWQVRFIFwNCisgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuaW5nKCJUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCBieSBsaWJwbmcuIikpKQ0KKyMgICAgICAgIGVsc2UNCisjICAgICAgICAgIGRlZmluZSBQTkdfUFJJVkFURSBcDQorICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQ0KKyMgICAgICAgIGVuZGlmDQorIyAgICAgIGVuZGlmDQorIyAgICAgIGlmICgoX19HTlVDX18gIT0gMykgfHwgIWRlZmluZWQoX19HTlVDX01JTk9SX18pIHx8IChfX0dOVUNfTUlOT1JfXyA+PSAxKSkNCisjICAgICAgICBpZm5kZWYgUE5HX1JFU1RSSUNUDQorIyAgICAgICAgICBkZWZpbmUgUE5HX1JFU1RSSUNUIF9fcmVzdHJpY3QNCisjICAgICAgICBlbmRpZg0KKyMgICAgICBlbmRpZiAvKiAgX19HTlVDX18gPT0gMy4wICovDQorIyAgICBlbmRpZiAvKiAgX19HTlVDX18gPj0gMyAqLw0KKw0KKyMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgICYmIChfTVNDX1ZFUiA+PSAxMzAwKQ0KKyMgICAgaWZuZGVmIFBOR19VU0VfUkVTVUxUDQorIyAgICAgIGRlZmluZSBQTkdfVVNFX1JFU1VMVCAvKiBub3Qgc3VwcG9ydGVkICovDQorIyAgICBlbmRpZg0KKyMgICAgaWZuZGVmIFBOR19OT1JFVFVSTg0KKyMgICAgICBkZWZpbmUgUE5HX05PUkVUVVJOICAgX19kZWNsc3BlYyhub3JldHVybikNCisjICAgIGVuZGlmDQorIyAgICBpZm5kZWYgUE5HX0FMTE9DQVRFRA0KKyMgICAgICBpZiAoX01TQ19WRVIgPj0gMTQwMCkNCisjICAgICAgICBkZWZpbmUgUE5HX0FMTE9DQVRFRCBfX2RlY2xzcGVjKHJlc3RyaWN0KQ0KKyMgICAgICBlbmRpZg0KKyMgICAgZW5kaWYNCisjICAgIGlmbmRlZiBQTkdfREVQUkVDQVRFRA0KKyMgICAgICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQ0KKyMgICAgZW5kaWYNCisjICAgIGlmbmRlZiBQTkdfUFJJVkFURQ0KKyMgICAgICBkZWZpbmUgUE5HX1BSSVZBVEUgX19kZWNsc3BlYyhkZXByZWNhdGVkKQ0KKyMgICAgZW5kaWYNCisjICAgIGlmbmRlZiBQTkdfUkVTVFJJQ1QNCisjICAgICAgaWYgKF9NU0NfVkVSID49IDE0MDApDQorIyAgICAgICAgZGVmaW5lIFBOR19SRVNUUklDVCBfX3Jlc3RyaWN0DQorIyAgICAgIGVuZGlmDQorIyAgICBlbmRpZg0KKw0KKyMgIGVsaWYgZGVmaW5lZChfX1dBVENPTUNfXykNCisjICAgIGlmbmRlZiBQTkdfUkVTVFJJQ1QNCisjICAgICAgZGVmaW5lIFBOR19SRVNUUklDVCBfX3Jlc3RyaWN0DQorIyAgICBlbmRpZg0KKyMgIGVuZGlmIC8qIF9NU0NfVkVSICovDQorI2VuZGlmIC8qIFBOR19QRURBTlRJQ19XQVJOSU5HUyAqLw0KKw0KKyNpZm5kZWYgUE5HX0RFUFJFQ0FURUQNCisjICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQgIC8qIFVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgKi8NCisjZW5kaWYNCisjaWZuZGVmIFBOR19VU0VfUkVTVUxUDQorIyAgZGVmaW5lIFBOR19VU0VfUkVTVUxUICAvKiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjaGVja2VkICovDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfTk9SRVRVUk4NCisjICBkZWZpbmUgUE5HX05PUkVUVVJOICAgIC8qIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuICovDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfQUxMT0NBVEVEDQorIyAgZGVmaW5lIFBOR19BTExPQ0FURUQgICAvKiBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBpcyBuZXcgbWVtb3J5ICovDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfUFJJVkFURQ0KKyMgIGRlZmluZSBQTkdfUFJJVkFURSAgICAgLyogVGhpcyBpcyBhIHByaXZhdGUgbGlicG5nIGZ1bmN0aW9uICovDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfUkVTVFJJQ1QNCisjICBkZWZpbmUgUE5HX1JFU1RSSUNUICAgIC8qIFRoZSBDOTkgInJlc3RyaWN0IiBmZWF0dXJlICovDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfRlBfRVhQT1JUICAgICAvKiBBIGZsb2F0aW5nIHBvaW50IEFQSS4gKi8NCisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQorIyAgICAgZGVmaW5lIFBOR19GUF9FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncylcDQorICAgICAgICAgUE5HX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKTsNCisjICBlbHNlICAgICAgICAgICAgICAgICAgIC8qIE5vIGZsb2F0aW5nIHBvaW50IEFQSXMgKi8NCisjICAgICBkZWZpbmUgUE5HX0ZQX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfRklYRURfRVhQT1JUICAvKiBBIGZpeGVkIHBvaW50IEFQSS4gKi8NCisjICBpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEDQorIyAgICAgZGVmaW5lIFBOR19GSVhFRF9FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncylcDQorICAgICAgICAgUE5HX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKTsNCisjICBlbHNlICAgICAgICAgICAgICAgICAgIC8qIE5vIGZpeGVkIHBvaW50IEFQSXMgKi8NCisjICAgICBkZWZpbmUgUE5HX0ZJWEVEX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmbmRlZiBQTkdfQlVJTERJTkdfU1lNQk9MX1RBQkxFDQorLyogU29tZSB0eXBlZGVmcyB0byBnZXQgdXMgc3RhcnRlZC4gIFRoZXNlIHNob3VsZCBiZSBzYWZlIG9uIG1vc3Qgb2YgdGhlIGNvbW1vbg0KKyAqIHBsYXRmb3Jtcy4NCisgKg0KKyAqIHBuZ191aW50XzMyIGFuZCBwbmdfaW50XzMyIG1heSwgY3VycmVudGx5LCBiZSBsYXJnZXIgdGhhbiByZXF1aXJlZCB0byBob2xkIGENCisgKiAzMi1iaXQgdmFsdWUgaG93ZXZlciB0aGlzIGlzIG5vdCBub3JtYWxseSBhZHZpc2FibGUuDQorICoNCisgKiBwbmdfdWludF8xNiBhbmQgcG5nX2ludF8xNiBzaG91bGQgYWx3YXlzIGJlIHR3byBieXRlcyBpbiBzaXplIC0gdGhpcyBpcw0KKyAqIHZlcmlmaWVkIGF0IGxpYnJhcnkgYnVpbGQgdGltZS4NCisgKg0KKyAqIHBuZ19ieXRlIG11c3QgYWx3YXlzIGJlIG9uZSBieXRlIGluIHNpemUuDQorICoNCisgKiBUaGUgY2hlY2tzIGJlbG93IHVzZSBjb25zdGFudHMgZnJvbSBsaW1pdHMuaCwgYXMgZGVmaW5lZCBieSB0aGUgSVNPQzkwDQorICogc3RhbmRhcmQuDQorICovDQorI2lmIENIQVJfQklUID09IDggJiYgVUNIQVJfTUFYID09IDI1NQ0KKyAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBwbmdfYnl0ZTsNCisjZWxzZQ0KKyMgIGVycm9yICJsaWJwbmcgcmVxdWlyZXMgOCBiaXQgYnl0ZXMiDQorI2VuZGlmDQorDQorI2lmIElOVF9NSU4gPT0gLTMyNzY4ICYmIElOVF9NQVggPT0gMzI3NjcNCisgICB0eXBlZGVmIGludCBwbmdfaW50XzE2Ow0KKyNlbGlmIFNIUlRfTUlOID09IC0zMjc2OCAmJiBTSFJUX01BWCA9PSAzMjc2Nw0KKyAgIHR5cGVkZWYgc2hvcnQgcG5nX2ludF8xNjsNCisjZWxzZQ0KKyMgIGVycm9yICJsaWJwbmcgcmVxdWlyZXMgYSBzaWduZWQgMTYgYml0IHR5cGUiDQorI2VuZGlmDQorDQorI2lmIFVJTlRfTUFYID09IDY1NTM1DQorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgcG5nX3VpbnRfMTY7DQorI2VsaWYgVVNIUlRfTUFYID09IDY1NTM1DQorICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBwbmdfdWludF8xNjsNCisjZWxzZQ0KKyMgIGVycm9yICJsaWJwbmcgcmVxdWlyZXMgYW4gdW5zaWduZWQgMTYgYml0IHR5cGUiDQorI2VuZGlmDQorDQorI2lmIElOVF9NSU4gPCAtMjE0NzQ4MzY0NiAmJiBJTlRfTUFYID4gMjE0NzQ4MzY0Ng0KKyAgIHR5cGVkZWYgaW50IHBuZ19pbnRfMzI7DQorI2VsaWYgTE9OR19NSU4gPCAtMjE0NzQ4MzY0NiAmJiBMT05HX01BWCA+IDIxNDc0ODM2NDYNCisgICB0eXBlZGVmIGxvbmcgaW50IHBuZ19pbnRfMzI7DQorI2Vsc2UNCisjICBlcnJvciAibGlicG5nIHJlcXVpcmVzIGEgc2lnbmVkIDMyIGJpdCAob3IgbW9yZSkgdHlwZSINCisjZW5kaWYNCisNCisjaWYgVUlOVF9NQVggPiA0Mjk0OTY3Mjk0DQorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgcG5nX3VpbnRfMzI7DQorI2VsaWYgVUxPTkdfTUFYID4gNDI5NDk2NzI5NA0KKyAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcG5nX3VpbnRfMzI7DQorI2Vsc2UNCisjICBlcnJvciAibGlicG5nIHJlcXVpcmVzIGFuIHVuc2lnbmVkIDMyIGJpdCAob3IgbW9yZSkgdHlwZSINCisjZW5kaWYNCisNCisvKiBQcmlvciB0byAxLjYuMCBpdCB3YXMgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIHNpemVfdCwgMS42LjAsIGhvd2V2ZXIsDQorICogcmVxdWlyZXMgYW4gSVNPQzkwIGNvbXBpbGVyIGFuZCByZWxpZXMgb24gY29uc2lzdGVudCBiZWhhdmlvciBvZiBzaXplb2YuDQorICovDQordHlwZWRlZiBzaXplX3QgcG5nX3NpemVfdDsNCit0eXBlZGVmIHB0cmRpZmZfdCBwbmdfcHRyZGlmZl90Ow0KKw0KKy8qIGxpYnBuZyBuZWVkcyB0byBrbm93IHRoZSBtYXhpbXVtIHZhbHVlIG9mICdzaXplX3QnIGFuZCB0aGlzIGNvbnRyb2xzIHRoZQ0KKyAqIGRlZmluaXRpb24gb2YgcG5nX2FsbG9jX3NpemVfdCwgYmVsb3cuICBUaGlzIG1heGltdW0gdmFsdWUgb2Ygc2l6ZV90IGxpbWl0cw0KKyAqIGJ1dCBkb2VzIG5vdCBjb250cm9sIHRoZSBtYXhpbXVtIGFsbG9jYXRpb25zIHRoZSBsaWJyYXJ5IG1ha2VzIC0gdGhlcmUgaXMNCisgKiBkaXJlY3QgYXBwbGljYXRpb24gY29udHJvbCBvZiB0aGlzIHRocm91Z2ggcG5nX3NldF91c2VyX2xpbWl0cygpLg0KKyAqLw0KKyNpZm5kZWYgUE5HX1NNQUxMX1NJWkVfVA0KKyAgIC8qIENvbXBpbGVyIHNwZWNpZmljIHRlc3RzIGZvciBzeXN0ZW1zIHdoZXJlIHNpemVfdCBpcyBrbm93biB0byBiZSBsZXNzIHRoYW4NCisgICAgKiAzMiBiaXRzIChzb21lIG9mIHRoZXNlIHN5c3RlbXMgbWF5IG5vIGxvbmdlciB3b3JrIGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YNCisgICAgKiAnZmFyJyBzdXBwb3J0OyBzZWUgYWJvdmUuKQ0KKyAgICAqLw0KKyMgIGlmIChkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSkgfHxcDQorICAgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoTUFYU0VHXzY0SykpDQorIyAgICAgZGVmaW5lIFBOR19TTUFMTF9TSVpFX1QNCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKy8qIHBuZ19hbGxvY19zaXplX3QgaXMgZ3VhcmFudGVlZCB0byBiZSBubyBzbWFsbGVyIHRoYW4gcG5nX3NpemVfdCwgYW5kIG5vDQorICogc21hbGxlciB0aGFuIHBuZ191aW50XzMyLiAgQ2FzdHMgZnJvbSBwbmdfc2l6ZV90IG9yIHBuZ191aW50XzMyIHRvDQorICogcG5nX2FsbG9jX3NpemVfdCBhcmUgbm90IG5lY2Vzc2FyeTsgaW4gZmFjdCwgaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvIHVzZQ0KKyAqIHRoZW0gYXQgYWxsIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBjb21wbGFpbiB3aGVuIHNvbWV0aGluZyB0dXJucyBvdXQgdG8gYmUNCisgKiBwcm9ibGVtYXRpYy4NCisgKg0KKyAqIENhc3RzIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKGZyb20gcG5nX2FsbG9jX3NpemVfdCB0byBwbmdfc2l6ZV90IG9yDQorICogcG5nX3VpbnRfMzIpIHNob3VsZCBiZSBleHBsaWNpdGx5IGFwcGxpZWQ7IGhvd2V2ZXIsIHdlIGRvIG5vdCBleHBlY3QgdG8NCisgKiBlbmNvdW50ZXIgcHJhY3RpY2FsIHNpdHVhdGlvbnMgdGhhdCByZXF1aXJlIHN1Y2ggY29udmVyc2lvbnMuDQorICoNCisgKiBQTkdfU01BTExfU0laRV9UIG11c3QgYmUgZGVmaW5lZCBpZiB0aGUgbWF4aW11bSB2YWx1ZSBvZiBzaXplX3QgaXMgbGVzcyB0aGFuDQorICogNDI5NDk2NzI5NSAtIGkuZS4gbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHBuZ191aW50XzMyLg0KKyAqLw0KKyNpZmRlZiBQTkdfU01BTExfU0laRV9UDQorICAgdHlwZWRlZiBwbmdfdWludF8zMiBwbmdfYWxsb2Nfc2l6ZV90Ow0KKyNlbHNlDQorICAgdHlwZWRlZiBwbmdfc2l6ZV90IHBuZ19hbGxvY19zaXplX3Q7DQorI2VuZGlmDQorDQorLyogUHJpb3IgdG8gMS42LjAgbGlicG5nIG9mZmVyZWQgbGltaXRlZCBzdXBwb3J0IGZvciBNaWNyb3NvZnQgQyBjb21waWxlcg0KKyAqIGltcGxlbWVudGF0aW9ucyBvZiBJbnRlbCBDUFUgc3BlY2lmaWMgc3VwcG9ydCBvZiB1c2VyLW1vZGUgc2VnbWVudGVkIGFkZHJlc3MNCisgKiBzcGFjZXMsIHdoZXJlIDE2LWJpdCBwb2ludGVycyBhZGRyZXNzIG1vcmUgdGhhbiA2NTUzNiBieXRlcyBvZiBtZW1vcnkgdXNpbmcNCisgKiBzZXBhcmF0ZSAnc2VnbWVudCcgcmVnaXN0ZXJzLiAgVGhlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHR3byBkaWZmZXJlbnQNCisgKiB0eXBlcyBvZiBwb2ludGVyIChvbmx5IG9uZSBvZiB3aGljaCBpbmNsdWRlcyB0aGUgc2VnbWVudCB2YWx1ZS4pDQorICoNCisgKiBJZiByZXF1aXJlZCB0aGlzIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gMS4yIG9mIGxpYnBuZyBhbmQgbWF5IGJlDQorICogYXZhaWxhYmxlIGluIHZlcnNpb25zIHRocm91Z2ggMS41LCBhbHRob3VnaCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvZGUgaGFzDQorICogbm90IGJlZW4gdmVyaWZpZWQgcmVjZW50bHkuDQorICovDQorDQorLyogVHlwZWRlZiBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycyB0aGF0IGFyZSBjb252ZXJ0ZWQgdG8gZml4ZWQtcG9pbnQgd2l0aCBhDQorICogbXVsdGlwbGUgb2YgMTAwLDAwMCwgZS5nLiwgZ2FtbWENCisgKi8NCit0eXBlZGVmIHBuZ19pbnRfMzIgcG5nX2ZpeGVkX3BvaW50Ow0KKw0KKy8qIEFkZCB0eXBlZGVmcyBmb3IgcG9pbnRlcnMgKi8NCit0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAqIHBuZ192b2lkcDsNCit0eXBlZGVmIGNvbnN0IHZvaWQgICAgICAgICAgICAqIHBuZ19jb25zdF92b2lkcDsNCit0eXBlZGVmIHBuZ19ieXRlICAgICAgICAgICAgICAqIHBuZ19ieXRlcDsNCit0eXBlZGVmIGNvbnN0IHBuZ19ieXRlICAgICAgICAqIHBuZ19jb25zdF9ieXRlcDsNCit0eXBlZGVmIHBuZ191aW50XzMyICAgICAgICAgICAqIHBuZ191aW50XzMycDsNCit0eXBlZGVmIGNvbnN0IHBuZ191aW50XzMyICAgICAqIHBuZ19jb25zdF91aW50XzMycDsNCit0eXBlZGVmIHBuZ19pbnRfMzIgICAgICAgICAgICAqIHBuZ19pbnRfMzJwOw0KK3R5cGVkZWYgY29uc3QgcG5nX2ludF8zMiAgICAgICogcG5nX2NvbnN0X2ludF8zMnA7DQordHlwZWRlZiBwbmdfdWludF8xNiAgICAgICAgICAgKiBwbmdfdWludF8xNnA7DQordHlwZWRlZiBjb25zdCBwbmdfdWludF8xNiAgICAgKiBwbmdfY29uc3RfdWludF8xNnA7DQordHlwZWRlZiBwbmdfaW50XzE2ICAgICAgICAgICAgKiBwbmdfaW50XzE2cDsNCit0eXBlZGVmIGNvbnN0IHBuZ19pbnRfMTYgICAgICAqIHBuZ19jb25zdF9pbnRfMTZwOw0KK3R5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICogcG5nX2NoYXJwOw0KK3R5cGVkZWYgY29uc3QgY2hhciAgICAgICAgICAgICogcG5nX2NvbnN0X2NoYXJwOw0KK3R5cGVkZWYgcG5nX2ZpeGVkX3BvaW50ICAgICAgICogcG5nX2ZpeGVkX3BvaW50X3A7DQordHlwZWRlZiBjb25zdCBwbmdfZml4ZWRfcG9pbnQgKiBwbmdfY29uc3RfZml4ZWRfcG9pbnRfcDsNCit0eXBlZGVmIHBuZ19zaXplX3QgICAgICAgICAgICAqIHBuZ19zaXplX3RwOw0KK3R5cGVkZWYgY29uc3QgcG5nX3NpemVfdCAgICAgICogcG5nX2NvbnN0X3NpemVfdHA7DQorDQorI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQNCit0eXBlZGVmIEZJTEUgICAgICAgICAgICAqIHBuZ19GSUxFX3A7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCit0eXBlZGVmIGRvdWJsZSAgICAgICAqIHBuZ19kb3VibGVwOw0KK3R5cGVkZWYgY29uc3QgZG91YmxlICogcG5nX2NvbnN0X2RvdWJsZXA7DQorI2VuZGlmDQorDQorLyogUG9pbnRlcnMgdG8gcG9pbnRlcnM7IGkuZS4gYXJyYXlzICovDQordHlwZWRlZiBwbmdfYnl0ZSAgICAgICAgKiAqIHBuZ19ieXRlcHA7DQordHlwZWRlZiBwbmdfdWludF8zMiAgICAgKiAqIHBuZ191aW50XzMycHA7DQordHlwZWRlZiBwbmdfaW50XzMyICAgICAgKiAqIHBuZ19pbnRfMzJwcDsNCit0eXBlZGVmIHBuZ191aW50XzE2ICAgICAqICogcG5nX3VpbnRfMTZwcDsNCit0eXBlZGVmIHBuZ19pbnRfMTYgICAgICAqICogcG5nX2ludF8xNnBwOw0KK3R5cGVkZWYgY29uc3QgY2hhciAgICAgICogKiBwbmdfY29uc3RfY2hhcnBwOw0KK3R5cGVkZWYgY2hhciAgICAgICAgICAgICogKiBwbmdfY2hhcnBwOw0KK3R5cGVkZWYgcG5nX2ZpeGVkX3BvaW50ICogKiBwbmdfZml4ZWRfcG9pbnRfcHA7DQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCit0eXBlZGVmIGRvdWJsZSAgICAgICAgICAqICogcG5nX2RvdWJsZXBwOw0KKyNlbmRpZg0KKw0KKy8qIFBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIHBvaW50ZXJzOyBpLmUuLCBwb2ludGVyIHRvIGFycmF5ICovDQordHlwZWRlZiBjaGFyICAgICAgICAgICAgKiAqICogcG5nX2NoYXJwcHA7DQorDQorI2VuZGlmIC8qIFBOR19CVUlMRElOR19TWU1CT0xfVEFCTEUgKi8NCisNCisjZW5kaWYgLyogUE5HQ09ORl9IICovDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdkZWJ1Zy5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdkZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzFlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ2RlYnVnLmgKQEAgLTAsMCArMSwxNTcgQEAKKw0KKy8qIHBuZ2RlYnVnLmggLSBEZWJ1Z2dpbmcgbWFjcm9zIGZvciBsaWJwbmcsIGFsc28gdXNlZCBpbiBwbmd0ZXN0LmMNCisgKg0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDExIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS41LjAgW0phbnVhcnkgNiwgMjAxMV0NCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorDQorLyogRGVmaW5lIFBOR19ERUJVRyBhdCBjb21waWxlIHRpbWUgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEhpZ2hlcg0KKyAqIG51bWJlcnMgZm9yIFBOR19ERUJVRyBtZWFuIG1vcmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBoYXMNCisgKiBvbmx5IGJlZW4gYWRkZWQgc2luY2UgdmVyc2lvbiAwLjk1IHNvIGl0IGlzIG5vdCBpbXBsZW1lbnRlZCB0aHJvdWdob3V0DQorICogbGlicG5nIHlldCwgYnV0IG1vcmUgc3VwcG9ydCB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4NCisgKg0KKyAqIHBuZ19kZWJ1Z1sxLTJdPyhsZXZlbCwgbWVzc2FnZSAsYXJnezAtMn0pDQorICogICBFeHBhbmRzIHRvIGEgc3RhdGVtZW50IChlaXRoZXIgYSBzaW1wbGUgZXhwcmVzc2lvbiBvciBhIGNvbXBvdW5kDQorICogICBkby4ud2hpbGUoMCkgc3RhdGVtZW50KSB0aGF0IG91dHB1dHMgYSBtZXNzYWdlIHdpdGggcGFyYW1ldGVyDQorICogICBzdWJzdGl0dXRpb24gaWYgUE5HX0RFQlVHIGlzIGRlZmluZWQgdG8gMiBvciBtb3JlLiAgSWYgUE5HX0RFQlVHDQorICogICBpcyB1bmRlZmluZWQsIDAgb3IgMSBldmVyeSBwbmdfZGVidWcgZXhwYW5kcyB0byBhIHNpbXBsZSBleHByZXNzaW9uDQorICogICAoYWN0dWFsbHkgKCh2b2lkKTApKS4NCisgKg0KKyAqICAgbGV2ZWw6IGxldmVsIG9mIGRldGFpbCBvZiBtZXNzYWdlLCBzdGFydGluZyBhdCAwLiAgQSBsZXZlbCAnbicNCisgKiAgICAgICAgICBtZXNzYWdlIGlzIHByZWNlZGVkIGJ5ICduJyB0YWIgY2hhcmFjdGVycyAobm90IGltcGxlbWVudGVkDQorICogICAgICAgICAgb24gTWljcm9zb2Z0IGNvbXBpbGVycyB1bmxlc3MgUE5HX0RFQlVHX0ZJTEUgaXMgYWxzbw0KKyAqICAgICAgICAgIGRlZmluZWQsIHRvIGFsbG93IGRlYnVnIERMTCBjb21waWxhdGlvbiB3aXRoIG5vIHN0YW5kYXJkIElPKS4NCisgKiAgIG1lc3NhZ2U6IGEgcHJpbnRmKDMpIHN0eWxlIHRleHQgc3RyaW5nLiAgQSB0cmFpbGluZyAnXG4nIGlzIGFkZGVkDQorICogICAgICAgICAgICB0byB0aGUgbWVzc2FnZS4NCisgKiAgIGFyZzogMCB0byAyIGFyZ3VtZW50cyBmb3IgcHJpbnRmKDMpIHN0eWxlIHN1YnN0aXR1dGlvbiBpbiBtZXNzYWdlLg0KKyAqLw0KKyNpZm5kZWYgUE5HREVCVUdfSA0KKyNkZWZpbmUgUE5HREVCVUdfSA0KKy8qIFRoZXNlIHNldHRpbmdzIGNvbnRyb2wgdGhlIGZvcm1hdHRpbmcgb2YgbWVzc2FnZXMgaW4gcG5nLmMgYW5kIHBuZ2Vycm9yLmMgKi8NCisvKiBNb3ZlZCB0byBwbmdkZWJ1Zy5oIGF0IDEuNS4wICovDQorIyAgaWZuZGVmIFBOR19MSVRFUkFMX1NIQVJQDQorIyAgICBkZWZpbmUgUE5HX0xJVEVSQUxfU0hBUlAgMHgyMw0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19MSVRFUkFMX0xFRlRfU1FVQVJFX0JSQUNLRVQNCisjICAgIGRlZmluZSBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUIDB4NWINCisjICBlbmRpZg0KKyMgIGlmbmRlZiBQTkdfTElURVJBTF9SSUdIVF9TUVVBUkVfQlJBQ0tFVA0KKyMgICAgZGVmaW5lIFBOR19MSVRFUkFMX1JJR0hUX1NRVUFSRV9CUkFDS0VUIDB4NWQNCisjICBlbmRpZg0KKyMgIGlmbmRlZiBQTkdfU1RSSU5HX05FV0xJTkUNCisjICAgIGRlZmluZSBQTkdfU1RSSU5HX05FV0xJTkUgIlxuIg0KKyMgIGVuZGlmDQorDQorI2lmZGVmIFBOR19ERUJVRw0KKyMgIGlmIChQTkdfREVCVUcgPiAwKQ0KKyMgICAgaWYgIWRlZmluZWQoUE5HX0RFQlVHX0ZJTEUpICYmIGRlZmluZWQoX01TQ19WRVIpDQorIyAgICAgIGluY2x1ZGUgPGNydGRiZy5oPg0KKyMgICAgICBpZiAoUE5HX0RFQlVHID4gMSkNCisjICAgICAgICBpZm5kZWYgX0RFQlVHDQorIyAgICAgICAgICBkZWZpbmUgX0RFQlVHDQorIyAgICAgICAgZW5kaWYNCisjICAgICAgICBpZm5kZWYgcG5nX2RlYnVnDQorIyAgICAgICAgICBkZWZpbmUgcG5nX2RlYnVnKGwsbSkgIF9SUFQwKF9DUlRfV0FSTixtIFBOR19TVFJJTkdfTkVXTElORSkNCisjICAgICAgICBlbmRpZg0KKyMgICAgICAgIGlmbmRlZiBwbmdfZGVidWcxDQorIyAgICAgICAgICBkZWZpbmUgcG5nX2RlYnVnMShsLG0scDEpICBfUlBUMShfQ1JUX1dBUk4sbSBQTkdfU1RSSU5HX05FV0xJTkUscDEpDQorIyAgICAgICAgZW5kaWYNCisjICAgICAgICBpZm5kZWYgcG5nX2RlYnVnMg0KKyMgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzIobCxtLHAxLHAyKSBcDQorICAgICAgICAgICAgIF9SUFQyKF9DUlRfV0FSTixtIFBOR19TVFJJTkdfTkVXTElORSxwMSxwMikNCisjICAgICAgICBlbmRpZg0KKyMgICAgICBlbmRpZg0KKyMgICAgZWxzZSAvKiBQTkdfREVCVUdfRklMRSB8fCAhX01TQ19WRVIgKi8NCisjICAgICAgaWZuZGVmIFBOR19TVERJT19TVVBQT1JURUQNCisjICAgICAgICBpbmNsdWRlIDxzdGRpby5oPiAvKiBub3QgaW5jbHVkZWQgeWV0ICovDQorIyAgICAgIGVuZGlmDQorIyAgICAgIGlmbmRlZiBQTkdfREVCVUdfRklMRQ0KKyMgICAgICAgIGRlZmluZSBQTkdfREVCVUdfRklMRSBzdGRlcnINCisjICAgICAgZW5kaWYgLyogUE5HX0RFQlVHX0ZJTEUgKi8NCisNCisjICAgICAgaWYgKFBOR19ERUJVRyA+IDEpDQorLyogTm90ZTogWyIlcyJtIFBOR19TVFJJTkdfTkVXTElORV0gcHJvYmFibHkgZG9lcyBub3Qgd29yayBvbg0KKyAqIG5vbi1JU08gY29tcGlsZXJzDQorICovDQorIyAgICAgICAgaWZkZWYgX19TVERDX18NCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcNCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZyhsLG0pIFwNCisgICAgICAgZG8geyBcDQorICAgICAgIGludCBudW1fdGFicz1sOyBcDQorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FLChudW1fdGFicz09MSA/ICJcdCIgOiBcDQorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSkpOyBcDQorICAgICAgIH0gd2hpbGUgKDApDQorIyAgICAgICAgICBlbmRpZg0KKyMgICAgICAgICAgaWZuZGVmIHBuZ19kZWJ1ZzENCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzEobCxtLHAxKSBcDQorICAgICAgIGRvIHsgXA0KKyAgICAgICBpbnQgbnVtX3RhYnM9bDsgXA0KKyAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCIlcyJtIFBOR19TVFJJTkdfTkVXTElORSwobnVtX3RhYnM9PTEgPyAiXHQiIDogXA0KKyAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLHAxKTsgXA0KKyAgICAgICB9IHdoaWxlICgwKQ0KKyMgICAgICAgICAgZW5kaWYNCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcyDQorIyAgICAgICAgICAgIGRlZmluZSBwbmdfZGVidWcyKGwsbSxwMSxwMikgXA0KKyAgICAgICBkbyB7IFwNCisgICAgICAgaW50IG51bV90YWJzPWw7IFwNCisgICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwiJXMibSBQTkdfU1RSSU5HX05FV0xJTkUsKG51bV90YWJzPT0xID8gIlx0IiA6IFwNCisgICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSxwMSxwMik7IFwNCisgICAgICAgfSB3aGlsZSAoMCkNCisjICAgICAgICAgIGVuZGlmDQorIyAgICAgICAgZWxzZSAvKiBfX1NUREMgX18gKi8NCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcNCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZyhsLG0pIFwNCisgICAgICAgZG8geyBcDQorICAgICAgIGludCBudW1fdGFicz1sOyBcDQorICAgICAgIGNoYXIgZm9ybWF0WzI1Nl07IFwNCisgICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXA0KKyAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLCBcDQorICAgICAgICAgbSxQTkdfU1RSSU5HX05FV0xJTkUpOyBcDQorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0KTsgXA0KKyAgICAgICB9IHdoaWxlICgwKQ0KKyMgICAgICAgICAgZW5kaWYNCisjICAgICAgICAgIGlmbmRlZiBwbmdfZGVidWcxDQorIyAgICAgICAgICAgIGRlZmluZSBwbmdfZGVidWcxKGwsbSxwMSkgXA0KKyAgICAgICBkbyB7IFwNCisgICAgICAgaW50IG51bV90YWJzPWw7IFwNCisgICAgICAgY2hhciBmb3JtYXRbMjU2XTsgXA0KKyAgICAgICBzbnByaW50Zihmb3JtYXQsMjU2LCIlcyVzJXMiLChudW1fdGFicz09MSA/ICJcdCIgOiBcDQorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwNCisgICAgICAgICBtLFBOR19TVFJJTkdfTkVXTElORSk7IFwNCisgICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSxmb3JtYXQscDEpOyBcDQorICAgICAgIH0gd2hpbGUgKDApDQorIyAgICAgICAgICBlbmRpZg0KKyMgICAgICAgICAgaWZuZGVmIHBuZ19kZWJ1ZzINCisjICAgICAgICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzIobCxtLHAxLHAyKSBcDQorICAgICAgIGRvIHsgXA0KKyAgICAgICBpbnQgbnVtX3RhYnM9bDsgXA0KKyAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcDQorICAgICAgIHNucHJpbnRmKGZvcm1hdCwyNTYsIiVzJXMlcyIsKG51bV90YWJzPT0xID8gIlx0IiA6IFwNCisgICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSwgXA0KKyAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXA0KKyAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLGZvcm1hdCxwMSxwMik7IFwNCisgICAgICAgfSB3aGlsZSAoMCkNCisjICAgICAgICAgIGVuZGlmDQorIyAgICAgICAgZW5kaWYgLyogX19TVERDIF9fICovDQorIyAgICAgIGVuZGlmIC8qIChQTkdfREVCVUcgPiAxKSAqLw0KKw0KKyMgICAgZW5kaWYgLyogX01TQ19WRVIgKi8NCisjICBlbmRpZiAvKiAoUE5HX0RFQlVHID4gMCkgKi8NCisjZW5kaWYgLyogUE5HX0RFQlVHICovDQorI2lmbmRlZiBwbmdfZGVidWcNCisjICBkZWZpbmUgcG5nX2RlYnVnKGwsIG0pICgodm9pZCkwKQ0KKyNlbmRpZg0KKyNpZm5kZWYgcG5nX2RlYnVnMQ0KKyMgIGRlZmluZSBwbmdfZGVidWcxKGwsIG0sIHAxKSAoKHZvaWQpMCkNCisjZW5kaWYNCisjaWZuZGVmIHBuZ19kZWJ1ZzINCisjICBkZWZpbmUgcG5nX2RlYnVnMihsLCBtLCBwMSwgcDIpICgodm9pZCkwKQ0KKyNlbmRpZg0KKyNlbmRpZiAvKiBQTkdERUJVR19IICovDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdpbmZvLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNiN2VhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdpbmZvLmgKQEAgLTAsMCArMSwyNjAgQEAKKw0KKy8qIHBuZ2luZm8uaCAtIGhlYWRlciBmaWxlIGZvciBQTkcgcmVmZXJlbmNlIGxpYnJhcnkNCisgKg0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbg0KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQ0KKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikNCisgKg0KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjEgW01hcmNoIDI4LCAyMDEzXQ0KKyAqDQorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4NCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyDQorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgNCisgKi8NCisNCisgLyogcG5nX2luZm8gaXMgYSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gaW4gYSBQTkcgZmlsZSBzbw0KKyAqIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBmaW5kIG91dCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbWFnZS4NCisgKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhlIGZpbGUsIHRoaXMgc3RydWN0dXJlIHdpbGwgdGVsbCB5b3Ugd2hhdCBpcw0KKyAqIGluIHRoZSBQTkcgZmlsZS4gIElmIHlvdSBhcmUgd3JpdGluZyB0aGUgZmlsZSwgZmlsbCBpbiB0aGUgaW5mb3JtYXRpb24NCisgKiB5b3Ugd2FudCB0byBwdXQgaW50byB0aGUgUE5HIGZpbGUsIHVzaW5nIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgdGhlbg0KKyAqIGNhbGwgcG5nX3dyaXRlX2luZm8oKS4NCisgKg0KKyAqIFRoZSBuYW1lcyBjaG9zZW4gc2hvdWxkIGJlIHZlcnkgY2xvc2UgdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBzbw0KKyAqIGNvbnN1bHQgdGhhdCBkb2N1bWVudCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgZWFjaCBmaWVsZC4NCisgKg0KKyAqIFdpdGggbGlicG5nIDwgMC45NSwgaXQgd2FzIG9ubHkgcG9zc2libGUgdG8gZGlyZWN0bHkgc2V0IGFuZCByZWFkIHRoZQ0KKyAqIHRoZSB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdCwgd2hpY2ggbWVhbnQgdGhhdCB0aGUgY29udGVudHMgYW5kDQorICogb3JkZXIgb2YgdGhlIHZhbHVlcyBoYWQgdG8gcmVtYWluIGZpeGVkLiAgV2l0aCBsaWJwbmcgMC45NSBhbmQgbGF0ZXIsDQorICogaG93ZXZlciwgdGhlcmUgYXJlIG5vdyBmdW5jdGlvbnMgdGhhdCBhYnN0cmFjdCB0aGUgY29udGVudHMgb2YNCisgKiBwbmdfaW5mb19zdHJ1Y3QgZnJvbSB0aGUgYXBwbGljYXRpb24sIHNvIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZQ0KKyAqIGxpYnBuZyB3aXRoIGR5bmFtaWMgbGlicmFyaWVzLCBhbmQgZXZlbiBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UNCisgKiBsaWJyYXJpZXMgdGhhdCBkb24ndCBoYXZlIGFsbCBvZiB0aGUgbGlicG5nIGFuY2lsbGFyeSBjaHVuay1oYW5kaW5nDQorICogZnVuY3Rpb25hbGl0eS4gIEluIGxpYnBuZy0xLjUuMCB0aGlzIHdhcyBtb3ZlZCBpbnRvIGEgc2VwYXJhdGUgcHJpdmF0ZQ0KKyAqIGZpbGUgdGhhdCBpcyBub3QgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMuDQorICoNCisgKiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgbWF5IGhhdmUgYWxsb2NhdGVkIHN0b3JhZ2UgYXR0YWNoZWQgdGhhdCBzaG91bGQgYmUNCisgKiBjbGVhbmVkIHVwIGJlZm9yZSB0aGUgc3RydWN0dXJlIGlzIGRpc2NhcmRlZDogcGFsZXR0ZSwgdHJhbnMsIHRleHQsDQorICogcGNhbF9wdXJwb3NlLCBwY2FsX3VuaXRzLCBwY2FsX3BhcmFtcywgaGlzdCwgaWNjcF9uYW1lLCBpY2NwX3Byb2ZpbGUsDQorICogc3BsdF9wYWxldHRlcywgc2NhbF91bml0LCByb3dfcG9pbnRlcnMsIGFuZCB1bmtub3ducy4gICBCeSBkZWZhdWx0LCB0aGVzZQ0KKyAqIGFyZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIGluZm8gc3RydWN0dXJlIGlzIGRlYWxsb2NhdGVkLCBpZiB0aGV5IHdlcmUNCisgKiBhbGxvY2F0ZWQgaW50ZXJuYWxseSBieSBsaWJwbmcuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5IG1lYW5zDQorICogb2YgdGhlIHBuZ19kYXRhX2ZyZWVyKCkgZnVuY3Rpb24uDQorICoNCisgKiBNb3JlIGFsbG9jYXRpb24gZGV0YWlsczogYWxsIHRoZSBjaHVuay1yZWFkaW5nIGZ1bmN0aW9ucyB0aGF0DQorICogY2hhbmdlIHRoZXNlIG1lbWJlcnMgZ28gdGhyb3VnaCB0aGUgY29ycmVzcG9uZGluZyBwbmdfc2V0XyoNCisgKiBmdW5jdGlvbnMuICBBIGZ1bmN0aW9uIHRvIGNsZWFyIHRoZXNlIG1lbWJlcnMgaXMgYXZhaWxhYmxlOiBzZWUNCisgKiBwbmdfZnJlZV9kYXRhKCkuICBUaGUgcG5nX3NldF8qIGZ1bmN0aW9ucyBkbyBub3QgZGVwZW5kIG9uIGJlaW5nDQorICogYWJsZSB0byBwb2ludCBpbmZvIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGFueSBvZiB0aGUgc3RvcmFnZSB0aGV5IGFyZQ0KKyAqIHBhc3NlZCAodGhleSBtYWtlIHRoZWlyIG93biBjb3BpZXMpLCBFWENFUFQgdGhhdCB0aGUgcG5nX3NldF90ZXh0DQorICogZnVuY3Rpb25zIHVzZSB0aGUgc2FtZSBzdG9yYWdlIHBhc3NlZCB0byB0aGVtIGluIHRoZSB0ZXh0X3B0ciBvcg0KKyAqIGl0eHRfcHRyIHN0cnVjdHVyZSBhcmd1bWVudCwgYW5kIHRoZSBwbmdfc2V0X3Jvd3MgYW5kIHBuZ19zZXRfdW5rbm93bnMNCisgKiBmdW5jdGlvbnMgZG8gbm90IG1ha2UgdGhlaXIgb3duIGNvcGllcy4NCisgKi8NCisjaWZuZGVmIFBOR0lORk9fSA0KKyNkZWZpbmUgUE5HSU5GT19IDQorDQorc3RydWN0IHBuZ19pbmZvX2RlZg0KK3sNCisgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBuZWNlc3NhcnkgZm9yIGV2ZXJ5IFBORyBmaWxlICovDQorICAgcG5nX3VpbnRfMzIgd2lkdGg7ICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKGZyb20gSUhEUikgKi8NCisgICBwbmdfdWludF8zMiBoZWlnaHQ7IC8qIGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMgKGZyb20gSUhEUikgKi8NCisgICBwbmdfdWludF8zMiB2YWxpZDsgIC8qIHZhbGlkIGNodW5rIGRhdGEgKHNlZSBQTkdfSU5GT18gYmVsb3cpICovDQorICAgcG5nX3NpemVfdCByb3dieXRlczsgLyogYnl0ZXMgbmVlZGVkIHRvIGhvbGQgYW4gdW50cmFuc2Zvcm1lZCByb3cgKi8NCisgICBwbmdfY29sb3JwIHBhbGV0dGU7ICAgICAgLyogYXJyYXkgb2YgY29sb3IgdmFsdWVzICh2YWxpZCAmIFBOR19JTkZPX1BMVEUpICovDQorICAgcG5nX3VpbnRfMTYgbnVtX3BhbGV0dGU7IC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluICJwYWxldHRlIiAoUExURSkgKi8NCisgICBwbmdfdWludF8xNiBudW1fdHJhbnM7ICAgLyogbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBhbGV0dGUgY29sb3IgKHRSTlMpICovDQorICAgcG5nX2J5dGUgYml0X2RlcHRoOyAgICAgIC8qIDEsIDIsIDQsIDgsIG9yIDE2IGJpdHMvY2hhbm5lbCAoZnJvbSBJSERSKSAqLw0KKyAgIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICAvKiBzZWUgUE5HX0NPTE9SX1RZUEVfIGJlbG93IChmcm9tIElIRFIpICovDQorICAgLyogVGhlIGZvbGxvd2luZyB0aHJlZSBzaG91bGQgaGF2ZSBiZWVuIG5hbWVkICpfbWV0aG9kIG5vdCAqX3R5cGUgKi8NCisgICBwbmdfYnl0ZSBjb21wcmVzc2lvbl90eXBlOyAvKiBtdXN0IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgKElIRFIpICovDQorICAgcG5nX2J5dGUgZmlsdGVyX3R5cGU7ICAgIC8qIG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UgKGZyb20gSUhEUikgKi8NCisgICBwbmdfYnl0ZSBpbnRlcmxhY2VfdHlwZTsgLyogT25lIG9mIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0lOVEVSTEFDRV9BREFNNyAqLw0KKw0KKyAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHNldCBieSBwbmdfc2V0X0lIRFIsIGNhbGxlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBvbg0KKyAgICAqIHdyaXRlLCBidXQgdGhlIGFyZSBuZXZlciBhY3R1YWxseSB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlLg0KKyAgICAqLw0KKyAgIHBuZ19ieXRlIGNoYW5uZWxzOyAgICAgICAvKiBudW1iZXIgb2YgZGF0YSBjaGFubmVscyBwZXIgcGl4ZWwgKDEsIDIsIDMsIDQpICovDQorICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgIC8qIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAqLw0KKyAgIHBuZ19ieXRlIHNwYXJlX2J5dGU7ICAgICAvKiB0byBhbGlnbiB0aGUgZGF0YSwgYW5kIGZvciBmdXR1cmUgdXNlICovDQorDQorI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KKyAgIC8qIFRoaXMgaXMgbmV2ZXIgc2V0IGR1cmluZyB3cml0ZSAqLw0KKyAgIHBuZ19ieXRlIHNpZ25hdHVyZVs4XTsgICAvKiBtYWdpYyBieXRlcyByZWFkIGJ5IGxpYnBuZyBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8NCisjZW5kaWYNCisNCisgICAvKiBUaGUgcmVzdCBvZiB0aGUgZGF0YSBpcyBvcHRpb25hbC4gIElmIHlvdSBhcmUgcmVhZGluZywgY2hlY2sgdGhlDQorICAgICogdmFsaWQgZmllbGQgdG8gc2VlIGlmIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBhcmUgdmFsaWQuICBJZiB5b3UNCisgICAgKiBhcmUgd3JpdGluZywgc2V0IHRoZSB2YWxpZCBmaWVsZCB0byB0aG9zZSBjaHVua3MgeW91IHdhbnQgd3JpdHRlbiwNCisgICAgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGJlbG93Lg0KKyAgICAqLw0KKw0KKyNpZiBkZWZpbmVkKFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfR0FNTUFfU1VQUE9SVEVEKQ0KKyAgIC8qIHBuZ19jb2xvcnNwYWNlIG9ubHkgY29udGFpbnMgJ2ZsYWdzJyBpZiBuZWl0aGVyIEdBTU1BIG9yIENPTE9SU1BBQ0UgYXJlDQorICAgICogZGVmaW5lZC4gIFdoZW4gQ09MT1JTUEFDRSBpcyBzd2l0Y2hlZCBvbiBhbGwgdGhlIGNvbG9yc3BhY2UtZGVmaW5pbmcNCisgICAgKiBjaHVua3Mgc2hvdWxkIGJlIGVuYWJsZWQsIHdoZW4gR0FNTUEgaXMgc3dpdGNoZWQgb24gYWxsIHRoZSBnYW1tYS1kZWZpbmluZw0KKyAgICAqIGNodW5rcyBzaG91bGQgYmUgZW5hYmxlZC4gIElmIHRoaXMgaXMgbm90IGRvbmUgaXQgYmVjb21lcyBwb3NzaWJsZSB0byByZWFkDQorICAgICogaW5jb25zaXN0ZW50IFBORyBmaWxlcyBhbmQgYXNzaWduIGEgcHJvYmFibHkgaW5jb3JyZWN0IGludGVycHJldGF0aW9uIHRvDQorICAgICogdGhlIGluZm9ybWF0aW9uLiAgKEluIG90aGVyIHdvcmRzLCBieSBjYXJlZnVsbHkgY2hvb3Npbmcgd2hpY2ggY2h1bmtzIHRvDQorICAgICogcmVjb2duaXplIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiBjYW4gc2VsZWN0IGFuIGludGVycHJldGF0aW9uIGZvciBQTkcNCisgICAgKiBmaWxlcyBjb250YWluaW5nIGFtYmlndW91cyBkYXRhIGFuZCB0aGlzIHdpbGwgcmVzdWx0IGluIGluY29uc2lzdGVudA0KKyAgICAqIGJlaGF2aW9yIGJldHdlZW4gZGlmZmVyZW50IGxpYnBuZyBidWlsZHMhKQ0KKyAgICAqLw0KKyAgIHBuZ19jb2xvcnNwYWNlIGNvbG9yc3BhY2U7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRA0KKyAgIC8qIGlDQ1AgY2h1bmsgZGF0YS4gKi8NCisgICBwbmdfY2hhcnAgaWNjcF9uYW1lOyAgICAgLyogcHJvZmlsZSBuYW1lICovDQorICAgcG5nX2J5dGVwIGljY3BfcHJvZmlsZTsgIC8qIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBwcm9maWxlIGRhdGEgKi8NCisgICBwbmdfdWludF8zMiBpY2NwX3Byb2ZsZW47ICAvKiBJQ0MgcHJvZmlsZSBkYXRhIGxlbmd0aCAqLw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQNCisgICAvKiBUaGUgdEVYdCwgYW5kIHpUWHQgY2h1bmtzIGNvbnRhaW4gaHVtYW4tcmVhZGFibGUgdGV4dHVhbCBkYXRhIGluDQorICAgICogdW5jb21wcmVzc2VkLCBjb21wcmVzc2VkLCBhbmQgb3B0aW9uYWxseSBjb21wcmVzc2VkIGZvcm1zLCByZXNwZWN0aXZlbHkuDQorICAgICogVGhlIGRhdGEgaW4gInRleHQiIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHVuY29tcHJlc3NlZCwNCisgICAgKiBudWxsLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiBFYWNoIGNodW5rIGhhcyBhIGtleXdvcmQgdGhhdCBkZXNjcmliZXMgdGhlDQorICAgICogdGV4dHVhbCBkYXRhIGNvbnRhaW5lZCBpbiB0aGF0IGNodW5rLiAgS2V5d29yZHMgYXJlIG5vdCByZXF1aXJlZCB0byBiZQ0KKyAgICAqIHVuaXF1ZSwgYW5kIHRoZSB0ZXh0IHN0cmluZyBtYXkgYmUgZW1wdHkuICBBbnkgbnVtYmVyIG9mIHRleHQgY2h1bmtzIG1heQ0KKyAgICAqIGJlIGluIGFuIGltYWdlLg0KKyAgICAqLw0KKyAgIGludCBudW1fdGV4dDsgLyogbnVtYmVyIG9mIGNvbW1lbnRzIHJlYWQgb3IgY29tbWVudHMgdG8gd3JpdGUgKi8NCisgICBpbnQgbWF4X3RleHQ7IC8qIGN1cnJlbnQgc2l6ZSBvZiB0ZXh0IGFycmF5ICovDQorICAgcG5nX3RleHRwIHRleHQ7IC8qIGFycmF5IG9mIGNvbW1lbnRzIHJlYWQgb3IgY29tbWVudHMgdG8gd3JpdGUgKi8NCisjZW5kaWYgLyogUE5HX1RFWFRfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRA0KKyAgIC8qIFRoZSB0SU1FIGNodW5rIGhvbGRzIHRoZSBsYXN0IHRpbWUgdGhlIGRpc3BsYXllZCBpbWFnZSBkYXRhIHdhcw0KKyAgICAqIG1vZGlmaWVkLiAgU2VlIHRoZSBwbmdfdGltZSBzdHJ1Y3QgZm9yIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdC4NCisgICAgKi8NCisgICBwbmdfdGltZSBtb2RfdGltZTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVEDQorICAgLyogVGhlIHNCSVQgY2h1bmsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgaGlnaC1vcmRlciBiaXRzDQorICAgICogaW4gdGhlIHBpeGVsIGRhdGEuICBWYWx1ZXMgYXJlIGluIHRoZSByYW5nZSBbMSwgYml0X2RlcHRoXSwgYW5kIGFyZQ0KKyAgICAqIG9ubHkgc3BlY2lmaWVkIGZvciB0aGUgY2hhbm5lbHMgaW4gdGhlIHBpeGVsIGRhdGEuICBUaGUgY29udGVudHMgb2YNCisgICAgKiB0aGUgbG93LW9yZGVyIGJpdHMgaXMgbm90IHNwZWNpZmllZC4gIERhdGEgaXMgdmFsaWQgaWYNCisgICAgKiAodmFsaWQgJiBQTkdfSU5GT19zQklUKSBpcyBub24temVyby4NCisgICAgKi8NCisgICBwbmdfY29sb3JfOCBzaWdfYml0OyAvKiBzaWduaWZpY2FudCBiaXRzIGluIGNvbG9yIGNoYW5uZWxzICovDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IFwNCitkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQ0KKyAgIC8qIFRoZSB0Uk5TIGNodW5rIHN1cHBsaWVzIHRyYW5zcGFyZW5jeSBkYXRhIGZvciBwYWxldHRlZCBpbWFnZXMgYW5kDQorICAgICogb3RoZXIgaW1hZ2UgdHlwZXMgdGhhdCBkb24ndCBuZWVkIGEgZnVsbCBhbHBoYSBjaGFubmVsLiAgVGhlcmUgYXJlDQorICAgICogIm51bV90cmFucyIgdHJhbnNwYXJlbmN5IHZhbHVlcyBmb3IgYSBwYWxldHRlZCBpbWFnZSwgc3RvcmVkIGluIHRoZQ0KKyAgICAqIHNhbWUgb3JkZXIgYXMgdGhlIHBhbGV0dGUgY29sb3JzLCBzdGFydGluZyBmcm9tIGluZGV4IDAuICBWYWx1ZXMNCisgICAgKiBmb3IgdGhlIGRhdGEgYXJlIGluIHRoZSByYW5nZSBbMCwgMjU1XSwgcmFuZ2luZyBmcm9tIGZ1bGx5IHRyYW5zcGFyZW50DQorICAgICogdG8gZnVsbHkgb3BhcXVlLCByZXNwZWN0aXZlbHkuICBGb3Igbm9uLXBhbGV0dGVkIGltYWdlcywgdGhlcmUgaXMgYQ0KKyAgICAqIHNpbmdsZSBjb2xvciBzcGVjaWZpZWQgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBmdWxseSB0cmFuc3BhcmVudC4NCisgICAgKiBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3RSTlMpIGlzIG5vbi16ZXJvLg0KKyAgICAqLw0KKyAgIHBuZ19ieXRlcCB0cmFuc19hbHBoYTsgICAgLyogYWxwaGEgdmFsdWVzIGZvciBwYWxldHRlZCBpbWFnZSAqLw0KKyAgIHBuZ19jb2xvcl8xNiB0cmFuc19jb2xvcjsgLyogdHJhbnNwYXJlbnQgY29sb3IgZm9yIG5vbi1wYWxldHRlIGltYWdlICovDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX2JLR0RfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQ0KKyAgIC8qIFRoZSBiS0dEIGNodW5rIGdpdmVzIHRoZSBzdWdnZXN0ZWQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpZiB0aGUNCisgICAgKiBkaXNwbGF5IHByb2dyYW0gZG9lcyBub3QgaGF2ZSBpdHMgb3duIGJhY2tncm91bmQgY29sb3IgYW5kIHRoZSBpbWFnZQ0KKyAgICAqIGlzIG5lZWRzIHRvIGNvbXBvc2l0ZWQgb250byBhIGJhY2tncm91bmQgYmVmb3JlIGRpc3BsYXkuICBUaGUgY29sb3JzDQorICAgICogaW4gImJhY2tncm91bmQiIGFyZSBub3JtYWxseSBpbiB0aGUgc2FtZSBjb2xvciBzcGFjZS9kZXB0aCBhcyB0aGUNCisgICAgKiBwaXhlbCBkYXRhLiAgRGF0YSBpcyB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19iS0dEKSBpcyBub24temVyby4NCisgICAgKi8NCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZDsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVEDQorICAgLyogVGhlIG9GRnMgY2h1bmsgZ2l2ZXMgdGhlIG9mZnNldCBpbiAib2Zmc2V0X3VuaXRfdHlwZSIgdW5pdHMgcmlnaHR3YXJkcw0KKyAgICAqIGFuZCBkb3dud2FyZHMgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBkaXNwbGF5LCBwYWdlLCBvciBvdGhlcg0KKyAgICAqIGFwcGxpY2F0aW9uLXNwZWNpZmljIGNvLW9yZGluYXRlIHNwYWNlLiAgU2VlIHRoZSBQTkdfT0ZGU0VUXyBkZWZpbmVzDQorICAgICogYmVsb3cgZm9yIHRoZSB1bml0IHR5cGVzLiAgVmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fb0ZGcykgbm9uLXplcm8uDQorICAgICovDQorICAgcG5nX2ludF8zMiB4X29mZnNldDsgLyogeCBvZmZzZXQgb24gcGFnZSAqLw0KKyAgIHBuZ19pbnRfMzIgeV9vZmZzZXQ7IC8qIHkgb2Zmc2V0IG9uIHBhZ2UgKi8NCisgICBwbmdfYnl0ZSBvZmZzZXRfdW5pdF90eXBlOyAvKiBvZmZzZXQgdW5pdHMgdHlwZSAqLw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQNCisgICAvKiBUaGUgcEhZcyBjaHVuayBnaXZlcyB0aGUgcGh5c2ljYWwgcGl4ZWwgZGVuc2l0eSBvZiB0aGUgaW1hZ2UgZm9yDQorICAgICogZGlzcGxheSBvciBwcmludGluZyBpbiAicGh5c191bml0X3R5cGUiIHVuaXRzIChzZWUgUE5HX1JFU09MVVRJT05fDQorICAgICogZGVmaW5lcyBiZWxvdykuICBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3BIWXMpIGlzIG5vbi16ZXJvLg0KKyAgICAqLw0KKyAgIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0OyAvKiBob3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8NCisgICBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdDsgLyogdmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLw0KKyAgIHBuZ19ieXRlIHBoeXNfdW5pdF90eXBlOyAvKiByZXNvbHV0aW9uIHR5cGUgKHNlZSBQTkdfUkVTT0xVVElPTl8gYmVsb3cpICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRA0KKyAgIC8qIFRoZSBoSVNUIGNodW5rIGNvbnRhaW5zIHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgb3IgaW1wb3J0YW5jZSBvZiB0aGUNCisgICAgKiB2YXJpb3VzIHBhbGV0dGUgZW50cmllcywgc28gdGhhdCBhIHZpZXdlciBjYW4gaW50ZWxsaWdlbnRseSBzZWxlY3QgYQ0KKyAgICAqIHJlZHVjZWQtY29sb3IgcGFsZXR0ZSwgaWYgcmVxdWlyZWQuICBEYXRhIGlzIGFuIGFycmF5IG9mICJudW1fcGFsZXR0ZSINCisgICAgKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLDY1NTM1XS4gRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19oSVNUKQ0KKyAgICAqIGlzIG5vbi16ZXJvLg0KKyAgICAqLw0KKyAgIHBuZ191aW50XzE2cCBoaXN0Ow0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQNCisgICAvKiBUaGUgcENBTCBjaHVuayBkZXNjcmliZXMgYSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIHRoZSBzdG9yZWQgcGl4ZWwNCisgICAgKiB2YWx1ZXMgYW5kIG9yaWdpbmFsIHBoeXNpY2FsIGRhdGEgdmFsdWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZS4NCisgICAgKiBUaGUgaW50ZWdlciByYW5nZSBbMCwgMl5iaXRfZGVwdGggLSAxXSBtYXBzIHRvIHRoZSBmbG9hdGluZy1wb2ludA0KKyAgICAqIHJhbmdlIGdpdmVuIGJ5IFtwY2FsX1gwLCBwY2FsX1gxXSwgYW5kIGFyZSBmdXJ0aGVyIHRyYW5zZm9ybWVkIGJ5IGENCisgICAgKiAocG9zc2libHkgbm9uLWxpbmVhcikgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gZ2l2ZW4gYnkgInBjYWxfdHlwZSINCisgICAgKiBhbmQgInBjYWxfcGFyYW1zIiBpbnRvICJwY2FsX3VuaXRzIi4gIFBsZWFzZSBzZWUgdGhlIFBOR19FUVVBVElPTl8NCisgICAgKiBkZWZpbmVzIGJlbG93LCBhbmQgdGhlIFBORy1Hcm91cCdzIFBORyBleHRlbnNpb25zIGRvY3VtZW50IGZvciBhDQorICAgICogY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBhbmQgaG93IHRoZXkgc2hvdWxkIGJlDQorICAgICogaW1wbGVtZW50ZWQsIGFuZCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNDSUkgcGFyYW1ldGVyIHN0cmluZ3MuDQorICAgICogRGF0YSB2YWx1ZXMgYXJlIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3BDQUwpIG5vbi16ZXJvLg0KKyAgICAqLw0KKyAgIHBuZ19jaGFycCBwY2FsX3B1cnBvc2U7ICAvKiBwQ0FMIGNodW5rIGRlc2NyaXB0aW9uIHN0cmluZyAqLw0KKyAgIHBuZ19pbnRfMzIgcGNhbF9YMDsgICAgICAvKiBtaW5pbXVtIHZhbHVlICovDQorICAgcG5nX2ludF8zMiBwY2FsX1gxOyAgICAgIC8qIG1heGltdW0gdmFsdWUgKi8NCisgICBwbmdfY2hhcnAgcGNhbF91bml0czsgICAgLyogTGF0aW4tMSBzdHJpbmcgZ2l2aW5nIHBoeXNpY2FsIHVuaXRzICovDQorICAgcG5nX2NoYXJwcCBwY2FsX3BhcmFtczsgIC8qIEFTQ0lJIHN0cmluZ3MgY29udGFpbmluZyBwYXJhbWV0ZXIgdmFsdWVzICovDQorICAgcG5nX2J5dGUgcGNhbF90eXBlOyAgICAgIC8qIGVxdWF0aW9uIHR5cGUgKHNlZSBQTkdfRVFVQVRJT05fIGJlbG93KSAqLw0KKyAgIHBuZ19ieXRlIHBjYWxfbnBhcmFtczsgICAvKiBudW1iZXIgb2YgcGFyYW1ldGVycyBnaXZlbiBpbiBwY2FsX3BhcmFtcyAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuNiAqLw0KKyAgIHBuZ191aW50XzMyIGZyZWVfbWU7ICAgICAvKiBmbGFncyBpdGVtcyBsaWJwbmcgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgKi8NCisNCisjaWZkZWYgUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRA0KKyAgIC8qIFN0b3JhZ2UgZm9yIHVua25vd24gY2h1bmtzIHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCByZWNvZ25pemUuICovDQorICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25fY2h1bmtzOw0KKw0KKyAgIC8qIFRoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMgbGltaXRlZCBieSB0aGUgdHlwZSBvZiANCisgICAgKiBwbmdfc3RydWN0Ojp1c2VyX2NodW5rX2NhY2hlX21heCwgZWxzZSBvdmVyZmxvdyBjYW4gb2NjdXIuDQorICAgICovDQorICAgaW50ICAgICAgICAgICAgICAgIHVua25vd25fY2h1bmtzX251bTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3NQTFRfU1VQUE9SVEVEDQorICAgLyogRGF0YSBvbiBzUExUIGNodW5rcyAodGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUpLiAqLw0KKyAgIHBuZ19zUExUX3RwIHNwbHRfcGFsZXR0ZXM7DQorICAgaW50ICAgICAgICAgc3BsdF9wYWxldHRlc19udW07IC8qIE1hdGNoIHR5cGUgcmV0dXJuZWQgYnkgcG5nX2dldCBBUEkgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVEDQorICAgLyogVGhlIHNDQUwgY2h1bmsgZGVzY3JpYmVzIHRoZSBhY3R1YWwgcGh5c2ljYWwgZGltZW5zaW9ucyBvZiB0aGUNCisgICAgKiBzdWJqZWN0IG1hdHRlciBvZiB0aGUgZ3JhcGhpYy4gIFRoZSBjaHVuayBjb250YWlucyBhIHVuaXQgc3BlY2lmaWNhdGlvbg0KKyAgICAqIGEgYnl0ZSB2YWx1ZSwgYW5kIHR3byBBU0NJSSBzdHJpbmdzIHJlcHJlc2VudGluZyBmbG9hdGluZy1wb2ludA0KKyAgICAqIHZhbHVlcy4gIFRoZSB2YWx1ZXMgYXJlIHdpZHRoIGFuZCBoZWlnaHQgY29ycmVzcG9uc2luZyB0byBvbmUgcGl4ZWwNCisgICAgKiBpbiB0aGUgaW1hZ2UuICBEYXRhIHZhbHVlcyBhcmUgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fc0NBTCkgaXMNCisgICAgKiBub24temVyby4NCisgICAgKi8NCisgICBwbmdfYnl0ZSBzY2FsX3VuaXQ7ICAgICAgICAgLyogdW5pdCBvZiBwaHlzaWNhbCBzY2FsZSAqLw0KKyAgIHBuZ19jaGFycCBzY2FsX3Nfd2lkdGg7ICAgICAvKiBzdHJpbmcgY29udGFpbmluZyBoZWlnaHQgKi8NCisgICBwbmdfY2hhcnAgc2NhbF9zX2hlaWdodDsgICAgLyogc3RyaW5nIGNvbnRhaW5pbmcgd2lkdGggKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEDQorICAgLyogTWVtb3J5IGhhcyBiZWVuIGFsbG9jYXRlZCBpZiAodmFsaWQgJiBQTkdfQUxMT0NBVEVEX0lORk9fUk9XUykNCisgICAgICBub24temVybyAqLw0KKyAgIC8qIERhdGEgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fSURBVCkgbm9uLXplcm8gKi8NCisgICBwbmdfYnl0ZXBwIHJvd19wb2ludGVyczsgICAgICAgIC8qIHRoZSBpbWFnZSBiaXRzICovDQorI2VuZGlmDQorDQorfTsNCisjZW5kaWYgLyogUE5HSU5GT19IICovDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdsaWJjb25mLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ2xpYmNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VjYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdsaWJjb25mLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8qIGxpYnBuZyAxLjYuMyBTVEFOREFSRCBBUEkgREVGSU5JVElPTiAqLw0KKw0KKy8qIHBuZ2xpYmNvbmYuaCAtIGxpYnJhcnkgYnVpbGQgY29uZmlndXJhdGlvbiAqLw0KKw0KKy8qIExpYnBuZyB2ZXJzaW9uIDEuNi4zIC0gSnVseSAxOCwgMjAxMyAqLw0KKw0KKy8qIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbiAqLw0KKw0KKy8qIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuICovDQorLyogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lciAqLw0KKy8qIGFuZCBsaWNlbnNlIGluIHBuZy5oICovDQorDQorLyogcG5nbGliY29uZi5oICovDQorLyogTWFjaGluZSBnZW5lcmF0ZWQgZmlsZTogRE8gTk9UIEVESVQgKi8NCisvKiBEZXJpdmVkIGZyb206IHNjcmlwdHMvcG5nbGliY29uZi5kZmEgKi8NCisjaWZuZGVmIFBOR0xDT05GX0gNCisjZGVmaW5lIFBOR0xDT05GX0gNCisvKiBvcHRpb25zICovDQorI2RlZmluZSBQTkdfMTZCSVRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfQUxJR05FRF9NRU1PUllfU1VQUE9SVEVEDQorLyojdW5kZWYgUE5HX0FSTV9ORU9OX0FQSV9TVVBQT1JURUQqLw0KKy8qI3VuZGVmIFBOR19BUk1fTkVPTl9DSEVDS19TVVBQT1JURUQqLw0KKyNkZWZpbmUgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfQkVOSUdOX1JFQURfRVJST1JTX1NVUFBPUlRFRA0KKy8qI3VuZGVmIFBOR19CRU5JR05fV1JJVEVfRVJST1JTX1NVUFBPUlRFRCovDQorI2RlZmluZSBQTkdfQlVJTERfR1JBWVNDQUxFX1BBTEVUVEVfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQNCisvKiN1bmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQqLw0KKyNkZWZpbmUgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfR0FNTUFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfR0VUX1BBTEVUVEVfTUFYX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19JT19TVEFURV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9CR1JfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0NPTVBSRVNTRURfVEVYVF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfR0VUX1BBTEVUVEVfTUFYX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfUEFDS19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9TVFJJUF8xNl9UT184X1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfVEVYVF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfcENBTF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1JFQURfelRYdF9TVVBQT1JURUQNCisvKiN1bmRlZiBQTkdfU0FGRV9MSU1JVFNfU1VQUE9SVEVEKi8NCisjZGVmaW5lIFBOR19TQVZFX0lOVF8zMl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0VUX0NIVU5LX0NBQ0hFX0xJTUlUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1NFVF9DSFVOS19NQUxMT0NfTElNSVRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1NJTVBMSUZJRURfUkVBRF9BRklSU1RfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0lNUExJRklFRF9SRUFEX0JHUl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0lNUExJRklFRF9XUklURV9BRklSU1RfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0lNUExJRklFRF9XUklURV9CR1JfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19TVERJT19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19URVhUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19VU0VSX1RSQU5TRk9STV9JTkZPX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9QQUNLX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9URVhUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV9zUExUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19XUklURV90SU1FX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19iS0dEX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX2NIUk1fU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfZ0FNQV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19oSVNUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX2lDQ1BfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfaVRYdF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19vRkZzX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX3BDQUxfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfcEhZc19TVVBQT1JURUQNCisjZGVmaW5lIFBOR19zQklUX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX3NDQUxfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfc1BMVF9TVVBQT1JURUQNCisjZGVmaW5lIFBOR19zUkdCX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX3RFWHRfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfdElNRV9TVVBQT1JURUQNCisjZGVmaW5lIFBOR190Uk5TX1NVUFBPUlRFRA0KKyNkZWZpbmUgUE5HX3pUWHRfU1VQUE9SVEVEDQorLyogZW5kIG9mIG9wdGlvbnMgKi8NCisvKiBzZXR0aW5ncyAqLw0KKyNkZWZpbmUgUE5HX0FQSV9SVUxFIDANCisjZGVmaW5lIFBOR19DQUxMT0NfU1VQUE9SVEVEDQorI2RlZmluZSBQTkdfQ09TVF9TSElGVCAzDQorI2RlZmluZSBQTkdfREVGQVVMVF9SRUFEX01BQ1JPUyAxDQorI2RlZmluZSBQTkdfR0FNTUFfVEhSRVNIT0xEX0ZJWEVEIDUwMDANCisjZGVmaW5lIFBOR19JREFUX1JFQURfU0laRSBQTkdfWkJVRl9TSVpFDQorI2RlZmluZSBQTkdfSU5GTEFURV9CVUZfU0laRSAxMDI0DQorI2RlZmluZSBQTkdfTUFYX0dBTU1BXzggMTENCisjZGVmaW5lIFBOR19RVUFOVElaRV9CTFVFX0JJVFMgNQ0KKyNkZWZpbmUgUE5HX1FVQU5USVpFX0dSRUVOX0JJVFMgNQ0KKyNkZWZpbmUgUE5HX1FVQU5USVpFX1JFRF9CSVRTIDUNCisjZGVmaW5lIFBOR19URVhUX1pfREVGQVVMVF9DT01QUkVTU0lPTiAoLTEpDQorI2RlZmluZSBQTkdfVEVYVF9aX0RFRkFVTFRfU1RSQVRFR1kgMA0KKyNkZWZpbmUgUE5HX1dFSUdIVF9TSElGVCA4DQorI2RlZmluZSBQTkdfWkJVRl9TSVpFIDgxOTINCisjZGVmaW5lIFBOR19aTElCX1ZFUk5VTSAwIC8qIHVua25vd24gKi8NCisjZGVmaW5lIFBOR19aX0RFRkFVTFRfQ09NUFJFU1NJT04gKC0xKQ0KKyNkZWZpbmUgUE5HX1pfREVGQVVMVF9OT0ZJTFRFUl9TVFJBVEVHWSAwDQorI2RlZmluZSBQTkdfWl9ERUZBVUxUX1NUUkFURUdZIDENCisjZGVmaW5lIFBOR19zQ0FMX1BSRUNJU0lPTiA1DQorI2RlZmluZSBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyAyDQorLyogZW5kIG9mIHNldHRpbmdzICovDQorI2VuZGlmIC8qIFBOR0xDT05GX0ggKi8NCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ3ByaXYuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5ncHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTNkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ3ByaXYuaApAQCAtMCwwICsxLDIwMDYgQEAKKw0KKy8qIHBuZ3ByaXYuaCAtIHByaXZhdGUgZGVjbGFyYXRpb25zIGZvciB1c2UgaW5zaWRlIGxpYnBuZw0KKyAqDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMyBbSnVseSAxOCwgMjAxM10NCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorDQorLyogVGhlIHN5bWJvbHMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlIChpbmNsdWRpbmcgdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZA0KKyAqIGFzIGV4dGVybikgYXJlIFBSSVZBVEUuICBUaGV5IGFyZSBub3QgcGFydCBvZiB0aGUgbGlicG5nIHB1YmxpYw0KKyAqIGludGVyZmFjZSwgYW5kIGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBieSByZWd1bGFyIGFwcGxpY2F0aW9ucy4NCisgKiBTb21lIG9mIHRoZW0gbWF5IGJlY29tZSBwdWJsaWMgaW4gdGhlIGZ1dHVyZTsgb3RoZXJzIG1heSBzdGF5IHByaXZhdGUsDQorICogY2hhbmdlIGluIGFuIGluY29tcGF0aWJsZSB3YXksIG9yIGV2ZW4gZGlzYXBwZWFyLg0KKyAqIEFsdGhvdWdoIHRoZSBsaWJwbmcgdXNlcnMgYXJlIG5vdCBmb3JiaWRkZW4gdG8gaW5jbHVkZSB0aGlzIGhlYWRlciwNCisgKiB0aGV5IHNob3VsZCBiZSB3ZWxsIGF3YXJlIG9mIHRoZSBpc3N1ZXMgdGhhdCBtYXkgYXJpc2UgZnJvbSBkb2luZyBzby4NCisgKi8NCisNCisjaWZuZGVmIFBOR1BSSVZfSA0KKyNkZWZpbmUgUE5HUFJJVl9IDQorDQorLyogRmVhdHVyZSBUZXN0IE1hY3Jvcy4gIFRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQgaGVyZSB0byBlbnN1cmUgdGhhdCBjb3JyZWN0bHkNCisgKiBpbXBsZW1lbnRlZCBsaWJyYXJpZXMgcmV2ZWFsIHRoZSBBUElzIGxpYnBuZyBuZWVkcyB0byBidWlsZCBhbmQgaGlkZSB0aG9zZQ0KKyAqIHRoYXQgYXJlIG5vdCBuZWVkZWQgYW5kIHBvdGVudGlhbGx5IGRhbWFnaW5nIHRvIHRoZSBjb21waWxhdGlvbi4NCisgKg0KKyAqIEZlYXR1cmUgVGVzdCBNYWNyb3MgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBhbnkgc3lzdGVtIGhlYWRlciBpcyBpbmNsdWRlZCAoc2VlDQorICogUE9TSVggMTAwMy4xIDIuOC4yICJQT1NJWCBTeW1ib2xzLiINCisgKg0KKyAqIFRoZXNlIG1hY3JvcyBvbmx5IGhhdmUgYW4gZWZmZWN0IGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnRzIGVpdGhlcg0KKyAqIFBPU0lYIDEwMDMuMSBvciBDOTksIG9yIGJvdGguICBPbiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyAocGFydGljdWxhcmx5DQorICogV2luZG93cy9WaXN1YWwgU3R1ZGlvKSB0aGVyZSBpcyBubyBlZmZlY3Q7IHRoZSBPUyBzcGVjaWZpYyB0ZXN0cyBiZWxvdyBhcmUNCisgKiBzdGlsbCByZXF1aXJlZCAoYXMgb2YgMjAxMS0wNS0wMi4pDQorICovDQorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEgLyogSnVzdCB0aGUgUE9TSVggMTAwMy4xIGFuZCBDODkgQVBJcyAqLw0KKw0KKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZDQorLyogU3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzIG5vdCByZXF1aXJlZCBieSBwbmcuaDogKi8NCisjICBpbmNsdWRlIDxzdGRsaWIuaD4NCisjICBpbmNsdWRlIDxzdHJpbmcuaD4NCisjZW5kaWYNCisNCisjZGVmaW5lIFBOR0xJQl9CVUlMRCAvKmxpYnBuZyBpcyBiZWluZyBidWlsdCwgbm90IHVzZWQqLw0KKw0KKy8qIElmIEhBVkVfQ09ORklHX0ggaXMgZGVmaW5lZCBkdXJpbmcgdGhlIGJ1aWxkIHRoZW4gdGhlIGJ1aWxkIHN5c3RlbSBtdXN0DQorICogcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSAiY29uZmlnLmgiIGZpbGUgb24gdGhlIGluY2x1ZGUgcGF0aC4gIFRoZSBoZWFkZXIgZmlsZQ0KKyAqIG11c3QgcHJvdmlkZSBkZWZpbml0aW9ucyBhcyByZXF1aXJlZCBiZWxvdyAoc2VhcmNoIGZvciAiSEFWRV9DT05GSUdfSCIpOw0KKyAqIHNlZSBjb25maWd1cmUuYWMgZm9yIG1vcmUgZGV0YWlscyBvZiB0aGUgcmVxdWlyZW1lbnRzLiAgVGhlIG1hY3JvDQorICogIlBOR19OT19DT05GSUdfSCIgaXMgcHJvdmlkZWQgZm9yIG1haW50YWluZXJzIHRvIHRlc3QgZm9yIGRlcGVuZGVuY2llcyBvbg0KKyAqICdjb25maWd1cmUnOyBkZWZpbmUgdGhpcyBtYWNybyB0byBwcmV2ZW50IHRoZSBjb25maWd1cmUgYnVpbGQgaW5jbHVkaW5nIHRoZQ0KKyAqIGNvbmZpZ3VyZSBnZW5lcmF0ZWQgY29uZmlnLmguICBMaWJwbmcgaXMgZXhwZWN0ZWQgdG8gY29tcGlsZSB3aXRob3V0ICphbnkqDQorICogc3BlY2lhbCBidWlsZCBzeXN0ZW0gc3VwcG9ydCBvbiBhIHJlYXNvbmFibHkgQU5TSS1DIGNvbXBsaWFudCBzeXN0ZW0uDQorICovDQorI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQ0KKyMgIGluY2x1ZGUgPGNvbmZpZy5oPg0KKw0KKyAgIC8qIFBpY2sgdXAgdGhlIGRlZmluaXRpb24gb2YgJ3Jlc3RyaWN0JyBmcm9tIGNvbmZpZy5oIGlmIGl0IHdhcyByZWFkOiAqLw0KKyMgIGRlZmluZSBQTkdfUkVTVFJJQ1QgcmVzdHJpY3QNCisjZW5kaWYNCisNCisvKiBUbyBzdXBwb3J0IHN5bWJvbCBwcmVmaXhpbmcgaXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgKmJlZm9yZSogaW5jbHVkaW5nIHBuZy5oDQorICogd2hldGhlciB0aGUgZml4ZWQgcG9pbnQgKGFuZCBtYXliZSBvdGhlcikgQVBJcyBhcmUgZXhwb3J0ZWQsIGJlY2F1c2UgaWYgdGhleQ0KKyAqIGFyZSBub3QgaW50ZXJuYWwgZGVmaW5pdGlvbnMgbWF5IGJlIHJlcXVpcmVkLiAgVGhpcyBpcyBoYW5kbGVkIGJlbG93IGp1c3QNCisgKiBiZWZvcmUgcG5nLmggaXMgaW5jbHVkZWQsIGJ1dCBsb2FkIHRoZSBjb25maWd1cmF0aW9uIG5vdyBpZiBpdCBpcyBhdmFpbGFibGUuDQorICovDQorI2lmbmRlZiBQTkdMQ09ORl9IDQorIyAgaW5jbHVkZSAicG5nbGliY29uZi5oIg0KKyNlbmRpZg0KKw0KKy8qIExvY2FsIHJlbmFtZXMgbWF5IGNoYW5nZSBub24tZXhwb3J0ZWQgQVBJIGZ1bmN0aW9ucyBmcm9tIHBuZy5oICovDQorI2lmIGRlZmluZWQoUE5HX1BSRUZJWCkgJiYgIWRlZmluZWQoUE5HUFJFRklYX0gpDQorIyAgaW5jbHVkZSAicG5ncHJlZml4LmgiDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19VU0VSX0NPTkZJRw0KKyMgIGluY2x1ZGUgInBuZ3Vzci5oIg0KKyAgIC8qIFRoZXNlIHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBwbmd1c3IuaCAqLw0KKyMgIGlmbmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQNCisjICAgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgIkN1c3RvbSBsaWJwbmcgYnVpbGQiDQorIyAgZW5kaWYNCisjICBpZm5kZWYgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWA0KKyMgICAgZGVmaW5lIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggIkNiIg0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogQ29tcGlsZSB0aW1lIG9wdGlvbnMuDQorICogPT09PT09PT09PT09PT09PT09PT09DQorICogSW4gYSBtdWx0aS1hcmNoIGJ1aWxkIHRoZSBjb21waWxlciBtYXkgY29tcGlsZSB0aGUgY29kZSBzZXZlcmFsIHRpbWVzIGZvciB0aGUNCisgKiBzYW1lIG9iamVjdCBtb2R1bGUsIHByb2R1Y2luZyBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLg0KKyAqIFdoZW4gdGhpcyBoYXBwZW5zIGNvbmZpZ3VyZS10aW1lIHNldHRpbmcgb2YgdGhlIHRhcmdldCBob3N0IG9wdGlvbnMgY2Fubm90IGJlDQorICogZG9uZSBhbmQgdGhpcyBpbnRlcmZlcmVzIHdpdGggdGhlIGhhbmRsaW5nIG9mIHRoZSBBUk0gTkVPTiBvcHRpbWl6YXRpb25zLCBhbmQNCisgKiBwb3NzaWJseSBvdGhlciBzaW1pbGFyIG9wdGltaXphdGlvbnMuICBQdXQgYWRkaXRpb25hbCB0ZXN0cyBoZXJlOyBpbiBnZW5lcmFsDQorICogdGhpcyBpcyBuZWVkZWQgd2hlbiB0aGUgc2FtZSBvcHRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm90aCBjb21waWxlIHRpbWUgYW5kDQorICogcnVuIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgT1MgKGkuZS4gaU9TIHZzIEFuZHJvaWQuKQ0KKyAqDQorICogTk9URTogc3ltYm9sIHByZWZpeGluZyBkb2VzIG5vdCBwYXNzICQoQ0ZMQUdTKSB0byB0aGUgcHJlcHJvY2Vzc29yLCBiZWNhdXNlDQorICogdGhpcyBpcyBub3QgcG9zc2libGUgd2l0aCBjZXJ0YWluIGNvbXBpbGVycyAoT3JhY2xlIFNVTiBPUyBDQyksIGFzIGEgcmVzdWx0DQorICogaXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbCBleHRlcm4gZnVuY3Rpb25zIHRoYXQgKm1pZ2h0KiBiZSB1c2VkDQorICogcmVnYXJkbGVzcyBvZiAkKENGTEFHUykgZ2V0IGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gIFRoZSB0ZXN0IG9uIF9fQVJNX05FT05fXw0KKyAqIGJlbG93IGlzIG9uZSBleGFtcGxlIG9mIHRoaXMgYmVoYXZpb3IgYmVjYXVzZSBpdCBpcyBjb250cm9sbGVkIGJ5IHRoZQ0KKyAqIHByZXNlbmNlIG9yIG5vdCBvZiAtbWZwdT1uZW9uIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLCBpdCBpcyBwb3NzaWJsZSB0byBkbw0KKyAqIHRoaXMgaW4gJChDQyksIGUuZy4gIkNDPWdjYyAtbWZwdT1uZW9uIiwgYnV0IHBlb3BsZSB3aG8gYnVpbGQgbGlicG5nIHJhcmVseQ0KKyAqIGRvIHRoaXMuDQorICovDQorI2lmbmRlZiBQTkdfQVJNX05FT05fT1BUDQorICAgLyogQVJNIE5FT04gb3B0aW1pemF0aW9ucyBhcmUgYmVpbmcgY29udHJvbGxlZCBieSB0aGUgY29tcGlsZXIgc2V0dGluZ3MsDQorICAgICogdHlwaWNhbGx5IHRoZSB0YXJnZXQgRlBVLiAgSWYgdGhlIEZQVSBoYXMgYmVlbiBzZXQgdG8gTkVPTiAoLW1mcHU9bmVvbg0KKyAgICAqIHdpdGggR0NDKSB0aGVuIHRoZSBjb21waWxlciB3aWxsIGRlZmluZSBfX0FSTV9ORU9OX18gYW5kIHdlIGNhbiByZWx5DQorICAgICogdW5jb25kaXRpb25hbGx5IG9uIE5FT04gaW5zdHJ1Y3Rpb25zIG5vdCBjcmFzaGluZywgb3RoZXJ3aXNlIHdlIG11c3QNCisgICAgKiBkaXNhYmxlIHVzZSBvZiBORU9OIGluc3RydWN0aW9uczoNCisgICAgKi8NCisjICBpZmRlZiBfX0FSTV9ORU9OX18NCisjICAgICBkZWZpbmUgUE5HX0FSTV9ORU9OX09QVCAyDQorIyAgZWxzZQ0KKyMgICAgIGRlZmluZSBQTkdfQVJNX05FT05fT1BUIDANCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZiBQTkdfQVJNX05FT05fT1BUID4gMA0KKyAgIC8qIE5FT04gb3B0aW1pemF0aW9ucyBhcmUgdG8gYmUgYXQgbGVhc3QgY29uc2lkZXJlZCBieSBsaWJwbmcsIHNvIGVuYWJsZSB0aGUNCisgICAgKiBjYWxsYmFja3MgdG8gZG8gdGhpcy4NCisgICAgKi8NCisjICBkZWZpbmUgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnNfbmVvbg0KKyNlbmRpZg0KKw0KKy8qIElzIHRoaXMgYSBidWlsZCBvZiBhIERMTCB3aGVyZSBjb21waWxhdGlvbiBvZiB0aGUgb2JqZWN0IG1vZHVsZXMgcmVxdWlyZXMNCisgKiBkaWZmZXJlbnQgcHJlcHJvY2Vzc29yIHNldHRpbmdzIHRvIHRob3NlIHJlcXVpcmVkIGZvciBhIHNpbXBsZSBsaWJyYXJ5PyAgSWYNCisgKiBzbyBQTkdfQlVJTERfRExMIG11c3QgYmUgc2V0Lg0KKyAqDQorICogSWYgbGlicG5nIGlzIHVzZWQgaW5zaWRlIGEgRExMIGJ1dCB0aGF0IERMTCBkb2VzIG5vdCBleHBvcnQgdGhlIGxpYnBuZyBBUElzDQorICogUE5HX0JVSUxEX0RMTCBtdXN0IG5vdCBiZSBzZXQuICBUbyBhdm9pZCB0aGUgY29kZSBiZWxvdyBraWNraW5nIGluIGJ1aWxkIGENCisgKiBzdGF0aWMgbGlicmFyeSBvZiBsaWJwbmcgdGhlbiBsaW5rIHRoZSBETEwgYWdhaW5zdCB0aGF0Lg0KKyAqLw0KKyNpZm5kZWYgUE5HX0JVSUxEX0RMTA0KKyMgIGlmZGVmIERMTF9FWFBPUlQNCisgICAgICAvKiBUaGlzIGlzIHNldCBieSBsaWJ0b29sIHdoZW4gZmlsZXMgYXJlIGNvbXBpbGVkIGZvciBhIERMTDsgbGlidG9vbA0KKyAgICAgICAqIGFsd2F5cyBjb21waWxlcyB0d2ljZSwgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzbid0IG5lY2Vzc2FyeS4gIFNldA0KKyAgICAgICAqIFBOR19CVUlMRF9ETEwgaW4gY2FzZSBpdCBpcyBuZWNlc3Nhcnk6DQorICAgICAgICovDQorIyAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwNCisjICBlbHNlDQorIyAgICAgaWZkZWYgX1dJTkRMTA0KKyAgICAgICAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBJREUgaW4gcHJvamVjdHMgdGhhdA0KKyAgICAgICAgICAqIGJ1aWxkIGEgRExMLiAgSXQgY2FuJ3QgZWFzaWx5IGJlIHJlbW92ZWQgZnJvbSB0aG9zZSBwcm9qZWN0cyAoaXQNCisgICAgICAgICAgKiBpc24ndCB2aXNpYmxlIGluIHRoZSBWaXN1YWwgU3R1ZGlvIFVJKSBzbyBpdCBpcyBhIGZhaXJseSByZWxpYWJsZQ0KKyAgICAgICAgICAqIGluZGljYXRpb24gdGhhdCBQTkdfSU1QRVhQIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgRExMIGV4cG9ydA0KKyAgICAgICAgICAqIGF0dHJpYnV0ZXMuDQorICAgICAgICAgICovDQorIyAgICAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwNCisjICAgICBlbHNlDQorIyAgICAgICAgaWZkZWYgX19ETExfXw0KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBCb3JsYW5kIEMgc3lzdGVtIHdoZW4gY29tcGlsaW5nIGZvciBhIERMTA0KKyAgICAgICAgICAgICAqIChhcyBhYm92ZS4pDQorICAgICAgICAgICAgICovDQorIyAgICAgICAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwNCisjICAgICAgICBlbHNlDQorICAgICAgICAgICAgLyogQWRkIGFkZGl0aW9uYWwgY29tcGlsZXIgY2FzZXMgaGVyZS4gKi8NCisjICAgICAgICBlbmRpZg0KKyMgICAgIGVuZGlmDQorIyAgZW5kaWYNCisjZW5kaWYgLyogU2V0dGluZyBQTkdfQlVJTERfRExMIGlmIHJlcXVpcmVkICovDQorDQorLyogU2VlIHBuZ2NvbmYuaCBmb3IgbW9yZSBkZXRhaWxzOiB0aGUgYnVpbGRlciBvZiB0aGUgbGlicmFyeSBtYXkgc2V0IHRoaXMgb24NCisgKiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIHNwZWNpZmljIGNvbXBpbGF0aW9uIHN5c3RlbSBvciBpdA0KKyAqIG1heSBiZSBhdXRvbWFnaWNhbGx5IHNldCBhYm92ZSAoYXQgcHJlc2VudCB3ZSBrbm93IG9mIG5vIHN5c3RlbSB3aGVyZSBpdCBkb2VzDQorICogbmVlZCB0byBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4pDQorICoNCisgKiBQTkdfSU1QRVhQIG11c3QgYmUgc2V0IGhlcmUgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeSB0byBwcmV2ZW50IHBuZ2NvbmYuaA0KKyAqIHNldHRpbmcgaXQgdG8gdGhlICJpbXBvcnQiIHNldHRpbmcgZm9yIGEgRExMIGJ1aWxkLg0KKyAqLw0KKyNpZm5kZWYgUE5HX0lNUEVYUA0KKyMgIGlmZGVmIFBOR19CVUlMRF9ETEwNCisjICAgICBkZWZpbmUgUE5HX0lNUEVYUCBQTkdfRExMX0VYUE9SVA0KKyMgIGVsc2UNCisgICAgICAvKiBOb3QgYnVpbGRpbmcgYSBETEwsIG9yIHRoZSBETEwgZG9lc24ndCByZXF1aXJlIHNwZWNpZmljIGV4cG9ydA0KKyAgICAgICAqIGRlZmluaXRpb25zLg0KKyAgICAgICAqLw0KKyMgICAgIGRlZmluZSBQTkdfSU1QRVhQDQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisvKiBObyB3YXJuaW5ncyBmb3IgcHJpdmF0ZSBvciBkZXByZWNhdGVkIGZ1bmN0aW9ucyBpbiB0aGUgYnVpbGQ6ICovDQorI2lmbmRlZiBQTkdfREVQUkVDQVRFRA0KKyMgIGRlZmluZSBQTkdfREVQUkVDQVRFRA0KKyNlbmRpZg0KKyNpZm5kZWYgUE5HX1BSSVZBVEUNCisjICBkZWZpbmUgUE5HX1BSSVZBVEUNCisjZW5kaWYNCisNCisvKiBTeW1ib2wgcHJlcHJvY2Vzc2luZyBzdXBwb3J0Lg0KKyAqDQorICogVG8gZW5hYmxlIGxpc3RpbmcgZ2xvYmFsLCBidXQgaW50ZXJuYWwsIHN5bWJvbHMgdGhlIGZvbGxvd2luZyBtYWNyb3Mgc2hvdWxkDQorICogYWx3YXlzIGJlIHVzZWQgdG8gZGVjbGFyZSBhbiBleHRlcm4gZGF0YSBvciBmdW5jdGlvbiBvYmplY3QgaW4gdGhpcyBmaWxlLg0KKyAqLw0KKyNpZm5kZWYgUE5HX0lOVEVSTkFMX0RBVEENCisjICBkZWZpbmUgUE5HX0lOVEVSTkFMX0RBVEEodHlwZSwgbmFtZSwgYXJyYXkpIGV4dGVybiB0eXBlIG5hbWUgYXJyYXkNCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19JTlRFUk5BTF9GVU5DVElPTg0KKyMgIGRlZmluZSBQTkdfSU5URVJOQUxfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgYXR0cmlidXRlcylcDQorICAgICAgZXh0ZXJuIFBOR19GVU5DVElPTih0eXBlLCBuYW1lLCBhcmdzLCBQTkdfRU1QVFkgYXR0cmlidXRlcykNCisjZW5kaWYNCisNCisvKiBJZiBmbG9hdGluZyBvciBmaXhlZCBwb2ludCBBUElzIGFyZSBkaXNhYmxlZCB0aGV5IG1heSBzdGlsbCBiZSBjb21waWxlZA0KKyAqIGludGVybmFsbHkuICBUbyBoYW5kbGUgdGhpcyBtYWtlIHN1cmUgdGhleSBhcmUgZGVjbGFyZWQgYXMgdGhlIGFwcHJvcHJpYXRlDQorICogaW50ZXJuYWwgZXh0ZXJuIGZ1bmN0aW9uIChvdGhlcndpc2UgdGhlIHN5bWJvbCBwcmVmaXhpbmcgc3R1ZmYgd29uJ3Qgd29yayBhbmQNCisgKiB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZCB3aXRob3V0IGRlZmluaXRpb25zLikNCisgKg0KKyAqIE5PVEU6IGFsdGhvdWdoIGFsbCB0aGUgQVBJIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgaGVyZSB0aGV5IGFyZSBub3QgYWxsDQorICogYWN0dWFsbHkgYnVpbHQhICBCZWNhdXNlIHRoZSBkZWNsYXJhdGlvbnMgYXJlIHN0aWxsIG1hZGUgaXQgaXMgbmVjZXNzYXJ5IHRvDQorICogZmFrZSBvdXQgdHlwZXMgdGhhdCB0aGV5IGRlcGVuZCBvbi4NCisgKi8NCisjaWZuZGVmIFBOR19GUF9FWFBPUlQNCisjICBpZm5kZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRA0KKyMgICAgIGRlZmluZSBQTkdfRlBfRVhQT1JUKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MpXA0KKyAgICAgICAgIFBOR19JTlRFUk5BTF9GVU5DVElPTih0eXBlLCBuYW1lLCBhcmdzLCBQTkdfRU1QVFkpOw0KKyMgICAgIGlmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkNCisgICAgICAgICB0eXBlZGVmIHN0cnVjdCBwbmdfaW5jb21wbGV0ZSBwbmdfZG91YmxlOw0KKyAgICAgICAgIHR5cGVkZWYgcG5nX2RvdWJsZSogICAgICAgICAgIHBuZ19kb3VibGVwOw0KKyAgICAgICAgIHR5cGVkZWYgY29uc3QgcG5nX2RvdWJsZSogICAgIHBuZ19jb25zdF9kb3VibGVwOw0KKyAgICAgICAgIHR5cGVkZWYgcG5nX2RvdWJsZSoqICAgICAgICAgIHBuZ19kb3VibGVwcDsNCisjICAgICBlbmRpZg0KKyMgIGVuZGlmDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfRklYRURfRVhQT1JUDQorIyAgaWZuZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCisjICAgICBkZWZpbmUgUE5HX0ZJWEVEX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKVwNCisgICAgICAgICBQTkdfSU5URVJOQUxfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgUE5HX0VNUFRZKTsNCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJwbmcuaCINCisNCisvKiBwbmdjb25mLmggZG9lcyBub3Qgc2V0IFBOR19ETExfRVhQT1JUIHVubGVzcyBpdCBpcyByZXF1aXJlZCwgc286ICovDQorI2lmbmRlZiBQTkdfRExMX0VYUE9SVA0KKyMgIGRlZmluZSBQTkdfRExMX0VYUE9SVA0KKyNlbmRpZg0KKw0KKy8qIFNFQ1VSSVRZIGFuZCBTQUZFVFk6DQorICoNCisgKiBCeSBkZWZhdWx0IGxpYnBuZyBpcyBidWlsdCB3aXRob3V0IGFueSBpbnRlcm5hbCBsaW1pdHMgb24gaW1hZ2Ugc2l6ZSwNCisgKiBpbmRpdmlkdWFsIGhlYXAgKHBuZ19tYWxsb2MpIGFsbG9jYXRpb25zIG9yIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHVzZWQuDQorICogSWYgUE5HX1NBRkVfTElNSVRTX1NVUFBPUlRFRCBpcyBkZWZpbmVkLCBob3dldmVyLCB0aGUgbGltaXRzIGJlbG93IGFyZSB1c2VkDQorICogKHVubGVzcyBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbikuICBUaGVzZSBsaW1pdHMgYXJlIGJlbGlldmVkIHRvIGJlIGZhaXJseQ0KKyAqIHNhZmUsIGJ1dCBidWlsZGVycyBvZiBzZWN1cmUgc3lzdGVtcyBzaG91bGQgdmVyaWZ5IHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUNCisgKiByZWFsIHN5c3RlbSBjYXBhYmlsaXRpZXMuDQorICovDQorI2lmZGVmIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQNCisgICAvKiAnc2FmZScgbGltaXRzICovDQorIyAgaWZuZGVmIFBOR19VU0VSX1dJRFRIX01BWA0KKyMgICAgIGRlZmluZSBQTkdfVVNFUl9XSURUSF9NQVggMTAwMDAwMA0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19VU0VSX0hFSUdIVF9NQVgNCisjICAgICBkZWZpbmUgUE5HX1VTRVJfSEVJR0hUX01BWCAxMDAwMDAwDQorIyAgZW5kaWYNCisjICBpZm5kZWYgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYDQorIyAgICAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCAxMjgNCisjICBlbmRpZg0KKyMgIGlmbmRlZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYDQorIyAgICAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggODAwMDAwMA0KKyMgIGVuZGlmDQorI2Vsc2UNCisgICAvKiB2YWx1ZXMgZm9yIG5vIGxpbWl0cyAqLw0KKyMgIGlmbmRlZiBQTkdfVVNFUl9XSURUSF9NQVgNCisjICAgICBkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDB4N2ZmZmZmZmYNCisjICBlbmRpZg0KKyMgIGlmbmRlZiBQTkdfVVNFUl9IRUlHSFRfTUFYDQorIyAgICAgZGVmaW5lIFBOR19VU0VSX0hFSUdIVF9NQVggMHg3ZmZmZmZmZg0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWA0KKyMgICAgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMA0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVgNCisjICAgICBkZWZpbmUgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCAwDQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisvKiBNb3ZlZCB0byBwbmdwcml2LmggYXQgbGlicG5nLTEuNS4wICovDQorLyogTk9URTogc29tZSBvZiB0aGVzZSBtYXkgaGF2ZSBiZWVuIHVzZWQgaW4gZXh0ZXJuYWwgYXBwbGljYXRpb25zIGFzDQorICogdGhlc2UgZGVmaW5pdGlvbnMgd2VyZSBleHBvc2VkIGluIHBuZ2NvbmYuaCBwcmlvciB0byAxLjUuDQorICovDQorDQorLyogSWYgeW91IGFyZSBydW5uaW5nIG9uIGEgbWFjaGluZSB3aGVyZSB5b3UgY2Fubm90IGFsbG9jYXRlIG1vcmUNCisgKiB0aGFuIDY0SyBvZiBtZW1vcnkgYXQgb25jZSwgdW5jb21tZW50IHRoaXMuICBXaGlsZSBsaWJwbmcgd2lsbCBub3QNCisgKiBub3JtYWxseSBuZWVkIHRoYXQgbXVjaCBtZW1vcnkgaW4gYSBjaHVuayAodW5sZXNzIHlvdSBsb2FkIHVwIGEgdmVyeQ0KKyAqIGxhcmdlIGZpbGUpLCB6bGliIG5lZWRzIHRvIGtub3cgaG93IGJpZyBvZiBhIGNodW5rIGl0IGNhbiB1c2UsIGFuZA0KKyAqIGxpYnBuZyB0aHVzIG1ha2VzIHN1cmUgdG8gY2hlY2sgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRvIHZlcmlmeSBpdA0KKyAqIHdpbGwgZml0IGludG8gbWVtb3J5Lg0KKyAqDQorICogemxpYiBwcm92aWRlcyAnTUFYU0VHXzY0Sycgd2hpY2gsIGlmIGRlZmluZWQsIGluZGljYXRlcyB0aGUNCisgKiBzYW1lIGxpbWl0IGFuZCBwbmdjb25mLmggKGFscmVhZHkgaW5jbHVkZWQpIHNldHMgdGhlIGxpbWl0DQorICogaWYgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgZGV0ZWN0ZWQuDQorICovDQorI2lmIGRlZmluZWQoTUFYU0VHXzY0SykgJiYgIWRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQ0KKyMgIGRlZmluZSBQTkdfTUFYX01BTExPQ182NEsNCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19VTlVTRUQNCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciB3YXJuaW5ncyBhcmUgc2lsZW5jZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybw0KKyAqIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGhhdmUgbm8gYmFkIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UgKG9wdGltaXppbmcNCisgKiBjb21waWxlcnMgd2lsbCBwcm9iYWJseSByZW1vdmUgaXQgZW50aXJlbHkpLiAgTm90ZSB0aGF0IGlmIHlvdSByZXBsYWNlDQorICogaXQgd2l0aCBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGl0ZXNwYWNlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZw0KKyAqIHNlbWljb2xvbi4NCisgKi8NCisjICBkZWZpbmUgUE5HX1VOVVNFRChwYXJhbSkgKHZvaWQpcGFyYW07DQorI2VuZGlmDQorDQorLyogSnVzdCBhIGxpdHRsZSBjaGVjayB0aGF0IHNvbWVvbmUgaGFzbid0IHRyaWVkIHRvIGRlZmluZSBzb21ldGhpbmcNCisgKiBjb250cmFkaWN0b3J5Lg0KKyAqLw0KKyNpZiAoUE5HX1pCVUZfU0laRSA+IDY1NTM2TCkgJiYgZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspDQorIyAgdW5kZWYgUE5HX1pCVUZfU0laRQ0KKyMgIGRlZmluZSBQTkdfWkJVRl9TSVpFIDY1NTM2TA0KKyNlbmRpZg0KKw0KKy8qIElmIHdhcm5pbmdzIG9yIGVycm9ycyBhcmUgdHVybmVkIG9mZiB0aGUgY29kZSBpcyBkaXNhYmxlZCBvciByZWRpcmVjdGVkIGhlcmUuDQorICogRnJvbSAxLjUuNCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIGFsbG93IHZlcnkgbGltaXRlZCBmb3JtYXR0aW5nIG9mDQorICogZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgLSB0aGlzIGNvZGUgd2lsbCBhbHNvIGJlIGRpc2FibGVkIGhlcmUuDQorICovDQorI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSUyhwKSBwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHA7DQorI2Vsc2UNCisjICBkZWZpbmUgcG5nX3dhcm5pbmcoczEsczIpICgodm9pZCkoczEpKQ0KKyMgIGRlZmluZSBwbmdfY2h1bmtfd2FybmluZyhzMSxzMikgKCh2b2lkKShzMSkpDQorIyAgZGVmaW5lIHBuZ193YXJuaW5nX3BhcmFtZXRlcihwLG51bWJlcixzdHJpbmcpICgodm9pZCkwKQ0KKyMgIGRlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXJfdW5zaWduZWQocCxudW1iZXIsZm9ybWF0LHZhbHVlKSAoKHZvaWQpMCkNCisjICBkZWZpbmUgcG5nX3dhcm5pbmdfcGFyYW1ldGVyX3NpZ25lZChwLG51bWJlcixmb3JtYXQsdmFsdWUpICgodm9pZCkwKQ0KKyMgIGRlZmluZSBwbmdfZm9ybWF0dGVkX3dhcm5pbmcocHAscCxtZXNzYWdlKSAoKHZvaWQpKHBwKSkNCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSUyhwKQ0KKyNlbmRpZg0KKyNpZm5kZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEDQorIyAgZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkNCisjICBkZWZpbmUgcG5nX2NodW5rX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQ0KKyMgIGRlZmluZSBwbmdfZml4ZWRfZXJyb3IoczEsczIpIHBuZ19lcnIoczEpDQorI2VuZGlmDQorDQorLyogQyBhbGxvd3MgdXAtY2FzdHMgZnJvbSAodm9pZCopIHRvIGFueSBwb2ludGVyIGFuZCAoY29uc3Qgdm9pZCopIHRvIGFueQ0KKyAqIHBvaW50ZXIgdG8gYSBjb25zdCBvYmplY3QuICBDKysgcmVnYXJkcyB0aGlzIGFzIGEgdHlwZSBlcnJvciBhbmQgcmVxdWlyZXMgYW4NCisgKiBleHBsaWNpdCwgc3RhdGljLCBjYXN0IGFuZCBwcm92aWRlcyB0aGUgc3RhdGljX2Nhc3Q8PiBydW5lIHRvIGVuc3VyZSB0aGF0DQorICogY29uc3QgaXMgbm90IGNhc3QgYXdheS4NCisgKi8NCisjaWZkZWYgX19jcGx1c3BsdXMNCisjICBkZWZpbmUgcG5nX3ZvaWRjYXN0KHR5cGUsIHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkNCisjICBkZWZpbmUgcG5nX2NvbnN0Y2FzdCh0eXBlLCB2YWx1ZSkgY29uc3RfY2FzdDx0eXBlPih2YWx1ZSkNCisjICBkZWZpbmUgcG5nX2FsaWduY2FzdCh0eXBlLCB2YWx1ZSkgXA0KKyAgIHN0YXRpY19jYXN0PHR5cGU+KHN0YXRpY19jYXN0PHZvaWQqPih2YWx1ZSkpDQorIyAgZGVmaW5lIHBuZ19hbGlnbmNhc3Rjb25zdCh0eXBlLCB2YWx1ZSkgXA0KKyAgIHN0YXRpY19jYXN0PHR5cGU+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpDQorI2Vsc2UNCisjICBkZWZpbmUgcG5nX3ZvaWRjYXN0KHR5cGUsIHZhbHVlKSAodmFsdWUpDQorIyAgZGVmaW5lIHBuZ19jb25zdGNhc3QodHlwZSwgdmFsdWUpICgodHlwZSkodmFsdWUpKQ0KKyMgIGRlZmluZSBwbmdfYWxpZ25jYXN0KHR5cGUsIHZhbHVlKSAoKHZvaWQqKSh2YWx1ZSkpDQorIyAgZGVmaW5lIHBuZ19hbGlnbmNhc3Rjb25zdCh0eXBlLCB2YWx1ZSkgKChjb25zdCB2b2lkKikodmFsdWUpKQ0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKy8qIFNvbWUgZml4ZWQgcG9pbnQgQVBJcyBhcmUgc3RpbGwgcmVxdWlyZWQgZXZlbiBpZiBub3QgZXhwb3J0ZWQgYmVjYXVzZQ0KKyAqIHRoZXkgZ2V0IHVzZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZmxvYXRpbmcgcG9pbnQgQVBJcy4gIFRoaXMgbWFnaWMNCisgKiBkZWFscyB3aXRoIHRoaXM6DQorICovDQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCisjICBkZWZpbmUgUE5HRkFQSSBQTkdBUEkNCisjZWxzZQ0KKyMgIGRlZmluZSBQTkdGQVBJIC8qIFBSSVZBVEUgKi8NCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQ0KKy8qIE90aGVyIGRlZmluZXMgc3BlY2lmaWMgdG8gY29tcGlsZXJzIGNhbiBnbyBoZXJlLiAgVHJ5IHRvIGtlZXANCisgKiB0aGVtIGluc2lkZSBhbiBhcHByb3ByaWF0ZSBpZmRlZi9lbmRpZiBwYWlyIGZvciBwb3J0YWJpbGl0eS4NCisgKi8NCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSB8fFwNCisgICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQpDQorICAgLyogcG5nLmMgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBBTlNJLUMgY29uc3RhbnRzIGlmIHRoZSBjb252ZXJzaW9uIG9mDQorICAgICogZmxvYXRpbmcgcG9pbnQgdG8gQVNDSUkgaXMgaW1wbGVtZW50ZWQgdGhlcmVpbjoNCisgICAgKg0KKyAgICAqICBEQkxfRElHICBNYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyAoY2FuIGJlIHNldCB0byBhbnkgY29uc3RhbnQpDQorICAgICogIERCTF9NSU4gIFNtYWxsZXN0IG5vcm1hbGl6ZWQgZnAgbnVtYmVyIChjYW4gYmUgc2V0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSkNCisgICAgKiAgREJMX01BWCAgTWF4aW11bSBmbG9hdGluZyBwb2ludCBudW1iZXIgKGNhbiBiZSBzZXQgdG8gYW4gYXJiaXRyYXJ5IHZhbHVlKQ0KKyAgICAqLw0KKyMgIGluY2x1ZGUgPGZsb2F0Lmg+DQorDQorIyAgaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChtYWNpbnRvc2gpKSB8fCBkZWZpbmVkKGFwcGxlYykgfHwgXA0KKyAgICBkZWZpbmVkKFRISU5LX0MpIHx8IGRlZmluZWQoX19TQ19fKSB8fCBkZWZpbmVkKFRBUkdFVF9PU19NQUMpDQorICAgICAvKiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgPG1hdGguaD4gaGFzbid0IGFscmVhZHkgYmVlbiBpbmNsdWRlZCBlYXJsaWVyDQorICAgICAgKiBhcyBpdCBzZWVtcyBpdCBkb2Vzbid0IGFncmVlIHdpdGggPGZwLmg+LCB5ZXQgd2Ugc2hvdWxkIHJlYWxseSB1c2UNCisgICAgICAqIDxmcC5oPiBpZiBwb3NzaWJsZS4NCisgICAgICAqLw0KKyMgICAgaWYgIWRlZmluZWQoX19NQVRIX0hfXykgJiYgIWRlZmluZWQoX19NQVRIX0gpICYmICFkZWZpbmVkKF9fY21hdGhfXykNCisjICAgICAgaW5jbHVkZSA8ZnAuaD4NCisjICAgIGVuZGlmDQorIyAgZWxzZQ0KKyMgICAgaW5jbHVkZSA8bWF0aC5oPg0KKyMgIGVuZGlmDQorIyAgaWYgZGVmaW5lZChfQU1JR0EpICYmIGRlZmluZWQoX19TQVNDKSAmJiBkZWZpbmVkKF9NNjg4ODEpDQorICAgICAvKiBBbWlnYSBTQVMvQzogV2UgbXVzdCBpbmNsdWRlIGJ1aWx0aW4gRlBVIGZ1bmN0aW9ucyB3aGVuIGNvbXBpbGluZyB1c2luZw0KKyAgICAgICogTUFUSD02ODg4MQ0KKyAgICAgICovDQorIyAgICBpbmNsdWRlIDxtNjg4ODEuaD4NCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKy8qIFRoaXMgcHJvdmlkZXMgdGhlIG5vbi1BTlNJIChmYXIpIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLiAqLw0KKyNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIGRlZmluZWQoX19NU0RPU19fKQ0KKyMgIGluY2x1ZGUgPG1lbS5oPg0KKyMgIGluY2x1ZGUgPGFsbG9jLmg+DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IFwNCisgICAgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQ0KKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8qIGRlZmluZXMgX1dJTkRPV1NfIG1hY3JvICovDQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLw0KKw0KKy8qIE1vdmVkIGhlcmUgYXJvdW5kIDEuNS4wYmV0YTM2IGZyb20gcG5nY29uZi5oICovDQorLyogVXNlcnMgbWF5IHdhbnQgdG8gdXNlIHRoZXNlIHNvIHRoZXkgYXJlIG5vdCBwcml2YXRlLiAgQW55IGxpYnJhcnkNCisgKiBmdW5jdGlvbnMgdGhhdCBhcmUgcGFzc2VkIGZhciBkYXRhIG11c3QgYmUgbW9kZWwtaW5kZXBlbmRlbnQuDQorICovDQorDQorLyogTWVtb3J5IG1vZGVsL3BsYXRmb3JtIGluZGVwZW5kZW50IGZucyAqLw0KKyNpZm5kZWYgUE5HX0FCT1JUDQorIyAgaWZkZWYgX1dJTkRPV1NfDQorIyAgICBkZWZpbmUgUE5HX0FCT1JUKCkgRXhpdFByb2Nlc3MoMCkNCisjICBlbHNlDQorIyAgICBkZWZpbmUgUE5HX0FCT1JUKCkgYWJvcnQoKQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogVGhlc2UgbWFjcm9zIG1heSBuZWVkIHRvIGJlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQuICovDQorI2RlZmluZSBQTkdfQUxJR05fTk9ORSAgIDAgLyogZG8gbm90IHVzZSBkYXRhIGFsaWdubWVudCAqLw0KKyNkZWZpbmUgUE5HX0FMSUdOX0FMV0FZUyAxIC8qIGFzc3VtZSB1bmFsaWduZWQgYWNjZXNzZXMgYXJlIE9LICovDQorI2lmZGVmIG9mZnNldG9mDQorIyAgZGVmaW5lIFBOR19BTElHTl9PRkZTRVQgMiAvKiB1c2Ugb2Zmc2V0b2YgdG8gZGV0ZXJtaW5lIGFsaWdubWVudCAqLw0KKyNlbHNlDQorIyAgZGVmaW5lIFBOR19BTElHTl9PRkZTRVQgLTEgLyogcHJldmVudCB0aGUgdXNlIG9mIHRoaXMgKi8NCisjZW5kaWYNCisjZGVmaW5lIFBOR19BTElHTl9TSVpFICAgMyAvKiB1c2Ugc2l6ZW9mIHRvIGRldGVybWluZSBhbGlnbm1lbnQgKi8NCisNCisjaWZuZGVmIFBOR19BTElHTl9UWVBFDQorICAgLyogRGVmYXVsdCB0byB1c2luZyBhbGlnbmVkIGFjY2VzcyBvcHRpbWl6YXRpb25zIGFuZCByZXF1aXJpbmcgYWxpZ25tZW50IHRvIGENCisgICAgKiBtdWx0aXBsZSBvZiB0aGUgZGF0YSB0eXBlIHNpemUuICBPdmVycmlkZSBpbiBhIGNvbXBpbGVyIHNwZWNpZmljIGZhc2hpb24NCisgICAgKiBpZiBuZWNlc3NhcnkgYnkgaW5zZXJ0aW5nIHRlc3RzIGhlcmU6DQorICAgICovDQorIyAgZGVmaW5lIFBOR19BTElHTl9UWVBFIFBOR19BTElHTl9TSVpFDQorI2VuZGlmDQorDQorI2lmIFBOR19BTElHTl9UWVBFID09IFBOR19BTElHTl9TSVpFDQorICAgLyogVGhpcyBpcyB1c2VkIGJlY2F1c2UgaW4gc29tZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbnMgbm9uLWFsaWduZWQNCisgICAgKiBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgc3VwcG9ydGVkLCBzbyB0aGUgb2Zmc2V0b2YgYXBwcm9hY2ggYmVsb3cgZmFpbHMuDQorICAgICogU2V0IFBOR19BTElHTl9TSVpFPTAgZm9yIGNvbXBpbGVyIGNvbWJpbmF0aW9ucyB3aGVyZSB1bmFsaWduZWQgYWNjZXNzDQorICAgICogaXMgZ29vZCBmb3IgcGVyZm9ybWFuY2UuICBEbyBub3QgZG8gdGhpcyB1bmxlc3MgeW91IGhhdmUgdGVzdGVkIHRoZSByZXN1bHQNCisgICAgKiBhbmQgdW5kZXJzdGFuZCBpdC4NCisgICAgKi8NCisjICBkZWZpbmUgcG5nX2FsaWdub2YodHlwZSkgKHNpemVvZiAodHlwZSkpDQorI2Vsc2UNCisjICBpZiBQTkdfQUxJR05fVFlQRSA9PSBQTkdfQUxJR05fT0ZGU0VUDQorIyAgICAgZGVmaW5lIHBuZ19hbGlnbm9mKHR5cGUpIG9mZnNldG9mKHN0cnVjdHtjaGFyIGM7IHR5cGUgdDt9LCB0KQ0KKyMgIGVsc2UNCisjICAgICBpZiBQTkdfQUxJR05fVFlQRSA9PSBQTkdfQUxJR05fQUxXQVlTDQorIyAgICAgICAgZGVmaW5lIHBuZ19hbGlnbm9mKHR5cGUpICgxKQ0KKyMgICAgIGVuZGlmDQorICAgICAgLyogRWxzZSBsZWF2ZSBwbmdfYWxpZ25vZiB1bmRlZmluZWQgdG8gcHJldmVudCB1c2UgdGhlcmVvZiAqLw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogVGhpcyBpbXBsaWNpdGx5IGFzc3VtZXMgYWxpZ25tZW50IGlzIGFsd2F5cyB0byBhIHBvd2VyIG9mIDIuICovDQorI2lmZGVmIHBuZ19hbGlnbm9mDQorIyAgZGVmaW5lIHBuZ19pc2FsaWduZWQocHRyLCB0eXBlKVwNCisgICAoKCgoY29uc3QgY2hhciopcHRyLShjb25zdCBjaGFyKikwKSAmIChwbmdfYWxpZ25vZih0eXBlKS0xKSkgPT0gMCkNCisjZWxzZQ0KKyMgIGRlZmluZSBwbmdfaXNhbGlnbmVkKHB0ciwgdHlwZSkgMA0KKyNlbmRpZg0KKw0KKy8qIEVuZCBvZiBtZW1vcnkgbW9kZWwvcGxhdGZvcm0gaW5kZXBlbmRlbnQgc3VwcG9ydCAqLw0KKy8qIEVuZCBvZiAxLjUuMGJldGEzNiBtb3ZlIGZyb20gcG5nY29uZi5oICovDQorDQorLyogQ09OU1RBTlRTIGFuZCBVVElMSVRZIE1BQ1JPUw0KKyAqIFRoZXNlIGFyZSB1c2VkIGludGVybmFsbHkgYnkgbGlicG5nIGFuZCBub3QgZXhwb3NlZCBpbiB0aGUgQVBJDQorICovDQorDQorLyogVmFyaW91cyBtb2RlcyBvZiBvcGVyYXRpb24uICBOb3RlIHRoYXQgYWZ0ZXIgYW4gaW5pdCwgbW9kZSBpcyBzZXQgdG8NCisgKiB6ZXJvIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICBUaHJlZSBvZiB0aGVzZQ0KKyAqIGFyZSBkZWZpbmVkIGluIHBuZy5oIGJlY2F1c2UgdGhleSBuZWVkIHRvIGJlIHZpc2libGUgdG8gYXBwbGljYXRpb25zDQorICogdGhhdCBjYWxsIHBuZ19zZXRfdW5rbm93bl9jaHVuaygpLg0KKyAqLw0KKy8qICNkZWZpbmUgUE5HX0hBVkVfSUhEUiAgICAgICAgICAgIDB4MDEgKGRlZmluZWQgaW4gcG5nLmgpICovDQorLyogI2RlZmluZSBQTkdfSEFWRV9QTFRFICAgICAgICAgICAgMHgwMiAoZGVmaW5lZCBpbiBwbmcuaCkgKi8NCisjZGVmaW5lIFBOR19IQVZFX0lEQVQgICAgICAgICAgICAgICAweDA0DQorLyogI2RlZmluZSBQTkdfQUZURVJfSURBVCAgICAgICAgICAgMHgwOCAoZGVmaW5lZCBpbiBwbmcuaCkgKi8NCisjZGVmaW5lIFBOR19IQVZFX0lFTkQgICAgICAgICAgICAgICAweDEwDQorICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgMHgyMCAodW51c2VkKSAqLw0KKyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIDB4NDAgKHVudXNlZCkgKi8NCisgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAweDgwICh1bnVzZWQpICovDQorI2RlZmluZSBQTkdfSEFWRV9DSFVOS19IRUFERVIgICAgICAweDEwMA0KKyNkZWZpbmUgUE5HX1dST1RFX3RJTUUgICAgICAgICAgICAgMHgyMDANCisjZGVmaW5lIFBOR19XUk9URV9JTkZPX0JFRk9SRV9QTFRFIDB4NDAwDQorI2RlZmluZSBQTkdfQkFDS0dST1VORF9JU19HUkFZICAgICAweDgwMA0KKyNkZWZpbmUgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSAgICAweDEwMDANCisjZGVmaW5lIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQgMHgyMDAwIC8qIEhhdmUgYW5vdGhlciBjaHVuayBhZnRlciBJREFUICovDQorICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgIDB4NDAwMCAodW51c2VkKSAqLw0KKyNkZWZpbmUgUE5HX0lTX1JFQURfU1RSVUNUICAgICAgICAweDgwMDAgLyogRWxzZSBpcyBhIHdyaXRlIHN0cnVjdCAqLw0KKw0KKy8qIEZsYWdzIGZvciB0aGUgdHJhbnNmb3JtYXRpb25zIHRoZSBQTkcgbGlicmFyeSBkb2VzIG9uIHRoZSBpbWFnZSBkYXRhICovDQorI2RlZmluZSBQTkdfQkdSICAgICAgICAgICAgICAgICAweDAwMDENCisjZGVmaW5lIFBOR19JTlRFUkxBQ0UgICAgICAgICAgIDB4MDAwMg0KKyNkZWZpbmUgUE5HX1BBQ0sgICAgICAgICAgICAgICAgMHgwMDA0DQorI2RlZmluZSBQTkdfU0hJRlQgICAgICAgICAgICAgICAweDAwMDgNCisjZGVmaW5lIFBOR19TV0FQX0JZVEVTICAgICAgICAgIDB4MDAxMA0KKyNkZWZpbmUgUE5HX0lOVkVSVF9NT05PICAgICAgICAgMHgwMDIwDQorI2RlZmluZSBQTkdfUVVBTlRJWkUgICAgICAgICAgICAweDAwNDANCisjZGVmaW5lIFBOR19DT01QT1NFICAgICAgICAgICAgIDB4MDA4MCAgICAgLyogV2FzIFBOR19CQUNLR1JPVU5EICovDQorI2RlZmluZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgICAweDAxMDANCisjZGVmaW5lIFBOR19FWFBBTkRfMTYgICAgICAgICAgIDB4MDIwMCAgICAgLyogQWRkZWQgdG8gbGlicG5nIDEuNS4yICovDQorI2RlZmluZSBQTkdfMTZfVE9fOCAgICAgICAgICAgICAweDA0MDAgICAgIC8qIEJlY29tZXMgJ2Nob3AnIGluIDEuNS40ICovDQorI2RlZmluZSBQTkdfUkdCQSAgICAgICAgICAgICAgICAweDA4MDANCisjZGVmaW5lIFBOR19FWFBBTkQgICAgICAgICAgICAgIDB4MTAwMA0KKyNkZWZpbmUgUE5HX0dBTU1BICAgICAgICAgICAgICAgMHgyMDAwDQorI2RlZmluZSBQTkdfR1JBWV9UT19SR0IgICAgICAgICAweDQwMDANCisjZGVmaW5lIFBOR19GSUxMRVIgICAgICAgICAgICAgIDB4ODAwMA0KKyNkZWZpbmUgUE5HX1BBQ0tTV0FQICAgICAgICAgICAweDEwMDAwDQorI2RlZmluZSBQTkdfU1dBUF9BTFBIQSAgICAgICAgIDB4MjAwMDANCisjZGVmaW5lIFBOR19TVFJJUF9BTFBIQSAgICAgICAgMHg0MDAwMA0KKyNkZWZpbmUgUE5HX0lOVkVSVF9BTFBIQSAgICAgICAweDgwMDAwDQorI2RlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk0gICAgMHgxMDAwMDANCisjZGVmaW5lIFBOR19SR0JfVE9fR1JBWV9FUlIgICAweDIwMDAwMA0KKyNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX1dBUk4gIDB4NDAwMDAwDQorI2RlZmluZSBQTkdfUkdCX1RPX0dSQVkgICAgICAgMHg2MDAwMDAgLyogdHdvIGJpdHMsIFJHQl9UT19HUkFZX0VSUnxXQVJOICovDQorI2RlZmluZSBQTkdfRU5DT0RFX0FMUEhBICAgICAgMHg4MDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQorI2RlZmluZSBQTkdfQUREX0FMUEhBICAgICAgICAgMHgxMDAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuNyAqLw0KKyNkZWZpbmUgUE5HX0VYUEFORF90Uk5TICAgICAgIDB4MjAwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjkgKi8NCisjZGVmaW5lIFBOR19TQ0FMRV8xNl9UT184ICAgICAweDQwMDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQorICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4ODAwMDAwMCB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAweDEwMDAwMDAwIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MjAwMDAwMDAgdW51c2VkICovDQorICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHg0MDAwMDAwMCB1bnVzZWQgKi8NCisvKiBGbGFncyBmb3IgcG5nX2NyZWF0ZV9zdHJ1Y3QgKi8NCisjZGVmaW5lIFBOR19TVFJVQ1RfUE5HICAgMHgwMDAxDQorI2RlZmluZSBQTkdfU1RSVUNUX0lORk8gIDB4MDAwMg0KKw0KKy8qIFNjYWxpbmcgZmFjdG9yIGZvciBmaWx0ZXIgaGV1cmlzdGljIHdlaWdodGluZyBjYWxjdWxhdGlvbnMgKi8NCisjZGVmaW5lIFBOR19XRUlHSFRfRkFDVE9SICgxPDwoUE5HX1dFSUdIVF9TSElGVCkpDQorI2RlZmluZSBQTkdfQ09TVF9GQUNUT1IgKDE8PChQTkdfQ09TVF9TSElGVCkpDQorDQorLyogRmxhZ3MgZm9yIHRoZSBwbmdfcHRyLT5mbGFncyByYXRoZXIgdGhhbiBkZWNsYXJpbmcgYSBieXRlIGZvciBlYWNoIG9uZSAqLw0KKyNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fU1RSQVRFR1kgICAgIDB4MDAwMQ0KKyNkZWZpbmUgUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRCAgICAgIDB4MDAwMiAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAweDAwMDQgICAgdW51c2VkICovDQorI2RlZmluZSBQTkdfRkxBR19aU1RSRUFNX0VOREVEICAgICAgICAgICAgMHgwMDA4IC8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDB4MDAxMCAgICB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAweDAwMjAgICAgdW51c2VkICovDQorI2RlZmluZSBQTkdfRkxBR19ST1dfSU5JVCAgICAgICAgICAgICAgICAgMHgwMDQwDQorI2RlZmluZSBQTkdfRkxBR19GSUxMRVJfQUZURVIgICAgICAgICAgICAgMHgwMDgwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSAgICAgICAgMHgwMTAwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTiAgICAgMHgwMjAwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFICAgICAgICAgMHgwNDAwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFICAgICAgMHgwODAwDQorI2RlZmluZSBQTkdfRkxBR19BU1NVTUVfc1JHQiAgICAgICAgICAgICAgMHgxMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLw0KKyNkZWZpbmUgUE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEEgICAgICAgICAgIDB4MjAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS41LjQgKi8NCisjZGVmaW5lIFBOR19GTEFHX0RFVEVDVF9VTklOSVRJQUxJWkVEICAgICAweDQwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQorLyogI2RlZmluZSBQTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTICAgICAgMHg4MDAwICovDQorLyogI2RlZmluZSBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1MgICAgICAweDEwMDAwICovDQorI2RlZmluZSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIICAgICAgICAweDIwMDAwDQorI2RlZmluZSBQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTICAgICAweDQwMDAwDQorI2RlZmluZSBQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUICAgICAgICAweDgwMDAwDQorI2RlZmluZSBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4gICAgIDB4MTAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjQuMCAqLw0KKyNkZWZpbmUgUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk4gICAgICAweDIwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8NCisjZGVmaW5lIFBOR19GTEFHX0FQUF9FUlJPUlNfV0FSTiAgICAgICAgMHg0MDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNi4wICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDB4ODAwMDAwICAgIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4MTAwMDAwMCAgICB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDIwMDAwMDAgICAgdW51c2VkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMHg0MDAwMDAwICAgIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4ODAwMDAwMCAgICB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MTAwMDAwMDAgICAgdW51c2VkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAweDIwMDAwMDAwICAgIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHg0MDAwMDAwMCAgICB1bnVzZWQgKi8NCisNCisjZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSyAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKQ0KKw0KKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0sgIChQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFIHwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFKQ0KKw0KKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX01BU0sgICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0sgfCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLKQ0KKw0KKy8qIFNhdmUgdHlwaW5nIGFuZCBtYWtlIGNvZGUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgKi8NCisNCisjZGVmaW5lIFBOR19DT0xPUl9ESVNUKGMxLCBjMikgKGFicygoaW50KSgoYzEpLnJlZCkgLSAoaW50KSgoYzIpLnJlZCkpICsgXA0KKyAgIGFicygoaW50KSgoYzEpLmdyZWVuKSAtIChpbnQpKChjMikuZ3JlZW4pKSArIFwNCisgICBhYnMoKGludCkoKGMxKS5ibHVlKSAtIChpbnQpKChjMikuYmx1ZSkpKQ0KKw0KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMDogc2NhbGUgYSAxNi1iaXQgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjY1NTM1IHRvIDAuLjI1NQ0KKyAqIGJ5IGRpdmlkaW5nIGJ5IDI1NyAqd2l0aCByb3VuZGluZyouICBUaGlzIG1hY3JvIGlzIGV4YWN0IGZvciB0aGUgZ2l2ZW4gcmFuZ2UuDQorICogU2VlIHRoZSBkaXNjb3Vyc2UgaW4gcG5ncnRyYW4uYyBwbmdfZG9fc2NhbGVfMTZfdG9fOC4gIFRoZSB2YWx1ZXMgaW4gdGhlDQorICogbWFjcm8gd2VyZSBlc3RhYmxpc2hlZCBieSBleHBlcmltZW50IChtb2RpZnlpbmcgdGhlIGFkZGVkIHZhbHVlKS4gIFRoZSBtYWNybw0KKyAqIGhhcyBhIHNlY29uZCB2YXJpYW50IHRoYXQgdGFrZXMgYSB2YWx1ZSBhbHJlYWR5IHNjYWxlZCBieSAyNTUgYW5kIGRpdmlkZXMgYnkNCisgKiA2NTUzNSAtIHRoaXMgaGFzIGEgbWF4aW11bSBlcnJvciBvZiAuNTAyLiAgT3ZlciB0aGUgcmFuZ2UgMC4uNjU1MzUqNjU1MzUgaXQNCisgKiBvbmx5IGdpdmVzIG9mZi1ieS1vbmUgZXJyb3JzIGFuZCBvbmx5IGZvciAwLjUlICgxIGluIDIwMCkgb2YgdGhlIHZhbHVlcy4NCisgKi8NCisjZGVmaW5lIFBOR19ESVY2NTUzNSh2MjQpICgoKHYyNCkgKyAzMjg5NSkgPj4gMTYpDQorI2RlZmluZSBQTkdfRElWMjU3KHYxNikgUE5HX0RJVjY1NTM1KChwbmdfdWludF8zMikodjE2KSAqIDI1NSkNCisNCisvKiBBZGRlZCB0byBsaWJwbmctMS4yLjYgSkIgKi8NCisjZGVmaW5lIFBOR19ST1dCWVRFUyhwaXhlbF9iaXRzLCB3aWR0aCkgXA0KKyAgICAoKHBpeGVsX2JpdHMpID49IDggPyBcDQorICAgICgocG5nX3NpemVfdCkod2lkdGgpICogKCgocG5nX3NpemVfdCkocGl4ZWxfYml0cykpID4+IDMpKSA6IFwNCisgICAgKCggKChwbmdfc2l6ZV90KSh3aWR0aCkgKiAoKHBuZ19zaXplX3QpKHBpeGVsX2JpdHMpKSkgKyA3KSA+PiAzKSApDQorDQorLyogUE5HX09VVF9PRl9SQU5HRSByZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2UNCisgKiBpZGVhbC1kZWx0YS4uaWRlYWwrZGVsdGEuICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCB0d2ljZS4NCisgKiAiaWRlYWwiIGFuZCAiZGVsdGEiIHNob3VsZCBiZSBjb25zdGFudHMsIG5vcm1hbGx5IHNpbXBsZQ0KKyAqIGludGVnZXJzLCAidmFsdWUiIGEgdmFyaWFibGUuIEFkZGVkIHRvIGxpYnBuZy0xLjIuNiBKQg0KKyAqLw0KKyNkZWZpbmUgUE5HX09VVF9PRl9SQU5HRSh2YWx1ZSwgaWRlYWwsIGRlbHRhKSBcDQorICAgKCAodmFsdWUpIDwgKGlkZWFsKS0oZGVsdGEpIHx8ICh2YWx1ZSkgPiAoaWRlYWwpKyhkZWx0YSkgKQ0KKw0KKy8qIENvbnZlcnNpb25zIGJldHdlZW4gZml4ZWQgYW5kIGZsb2F0aW5nIHBvaW50LCBvbmx5IGRlZmluZWQgaWYNCisgKiByZXF1aXJlZCAodG8gbWFrZSBzdXJlIHRoZSBjb2RlIGRvZXNuJ3QgYWNjaWRlbnRhbGx5IHVzZSBmbG9hdA0KKyAqIHdoZW4gaXQgaXMgc3VwcG9zZWRseSBkaXNhYmxlZC4pDQorICovDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCisvKiBUaGUgZmxvYXRpbmcgcG9pbnQgY29udmVyc2lvbiBjYW4ndCBvdmVyZmxvdywgdGhvdWdoIGl0IGNhbiBhbmQNCisgKiBkb2VzIGxvc2UgYWNjdXJhY3kgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGZpeGVkIHBvaW50IHZhbHVlLg0KKyAqIEluIHByYWN0aWNlIHRoaXMgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSBwbmdfZml4ZWRfcG9pbnQgb25seQ0KKyAqIHN0b3JlcyBudW1iZXJzIHdpdGggdmVyeSBsb3cgcHJlY2lzaW9uLiAgVGhlIHBuZ19wdHIgYW5kIHMNCisgKiBhcmd1bWVudHMgYXJlIHVudXNlZCBieSBkZWZhdWx0IGJ1dCBhcmUgdGhlcmUgaW4gY2FzZSBlcnJvcg0KKyAqIGNoZWNraW5nIGJlY29tZXMgYSByZXF1aXJlbWVudC4NCisgKi8NCisjZGVmaW5lIHBuZ19mbG9hdChwbmdfcHRyLCBmaXhlZCwgcykgKC4wMDAwMSAqIChmaXhlZCkpDQorDQorLyogVGhlIGZpeGVkIHBvaW50IGNvbnZlcnNpb24gcGVyZm9ybXMgcmFuZ2UgY2hlY2tpbmcgYW5kIGV2YWx1YXRlcw0KKyAqIGl0cyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcywgc28gbXVzdCBiZSB1c2VkIHdpdGggY2FyZS4gIFRoZQ0KKyAqIHJhbmdlIGNoZWNraW5nIHVzZXMgdGhlIFBORyBzcGVjaWZpY2F0aW9uIHZhbHVlcyBmb3IgYSBzaWduZWQNCisgKiAzMiBiaXQgZml4ZWQgcG9pbnQgdmFsdWUgZXhjZXB0IHRoYXQgdGhlIHZhbHVlcyBhcmUgZGVsaWJlcmF0ZWx5DQorICogcm91bmRlZC10by16ZXJvIHRvIGFuIGludGVncmFsIHZhbHVlIC0gMjE0NzQgKDIxNDc0LjgzIGlzIHJvdWdobHkNCisgKiAoMl4zMS0xKSAqIDEwMDAwMCkuICdzJyBpcyBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgdmFsdWUgYmVpbmcNCisgKiBjb252ZXJ0ZWQuDQorICoNCisgKiBOT1RFOiB0aGlzIG1hY3JvIHdpbGwgcmFpc2UgYSBwbmdfZXJyb3IgaWYgdGhlIHJhbmdlIGNoZWNrIGZhaWxzLA0KKyAqIHRoZXJlZm9yZSBpdCBpcyBub3JtYWxseSBvbmx5IGFwcHJvcHJpYXRlIHRvIHVzZSB0aGlzIG9uIHZhbHVlcw0KKyAqIHRoYXQgY29tZSBmcm9tIEFQSSBjYWxscyBvciBvdGhlciBzb3VyY2VzIHdoZXJlIGFuIG91dCBvZiByYW5nZQ0KKyAqIGVycm9yIGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yLCBub3QgYSBkYXRhIGVycm9yIQ0KKyAqDQorICogTk9URTogYnkgZGVmYXVsdCB0aGlzIGlzIG9mZiAtIHRoZSBtYWNybyBpcyBub3QgdXNlZCAtIGJlY2F1c2UgdGhlDQorICogZnVuY3Rpb24gY2FsbCBzYXZlcyBhIGxvdCBvZiBjb2RlLg0KKyAqLw0KKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfTUFDUk9fU1VQUE9SVEVEDQorI2RlZmluZSBwbmdfZml4ZWQocG5nX3B0ciwgZnAsIHMpICgoZnApIDw9IDIxNDc0ICYmIChmcCkgPj0gLTIxNDc0ID9cDQorICAgICgocG5nX2ZpeGVkX3BvaW50KSgxMDAwMDAgKiAoZnApKSkgOiAocG5nX2ZpeGVkX2Vycm9yKHBuZ19wdHIsIHMpLDApKQ0KKyNlbmRpZg0KKy8qIGVsc2UgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gaXMgZGVmaW5lZCBiZWxvdywgaW5zaWRlIHRoZSBzY29wZSBvZiB0aGUNCisgKiBjcGx1c3BsdXMgdGVzdC4NCisgKi8NCisjZW5kaWYNCisNCisvKiBDb25zdGFudHMgZm9yIGtub3duIGNodW5rIHR5cGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIGEgY2h1bmssIGRlZmluZSB0aGUgbmFtZQ0KKyAqIGhlcmUuICBGb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZXNlIGNvbnN0YW50cyBoYXZlIHRoZSBmb3JtIHBuZ188bmFtZT47IGkuZS4NCisgKiB0aGUgcHJlZml4IGlzIGxvd2VyIGNhc2UuICBQbGVhc2UgdXNlIGRlY2ltYWwgdmFsdWVzIGFzIHRoZSBwYXJhbWV0ZXJzIHRvDQorICogbWF0Y2ggdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbiBhbmQgdG8gYXZvaWQgcmVseWluZyBvbiB0aGUgQyBsb2NhbGUNCisgKiBpbnRlcnByZXRhdGlvbiBvZiBjaGFyYWN0ZXIgdmFsdWVzLg0KKyAqDQorICogUHJpb3IgdG8gMS41LjYgdGhlc2UgY29uc3RhbnRzIHdlcmUgc3RyaW5ncywgYXMgb2YgMS41LjYgcG5nX3VpbnRfMzIgdmFsdWVzDQorICogYXJlIGNvbXB1dGVkIGFuZCBhIG5ldyBtYWNybyAoUE5HX1NUUklOR19GUk9NX0NIVU5LKSBhZGRlZCB0byBhbGxvdyBhIHN0cmluZw0KKyAqIHRvIGJlIGdlbmVyYXRlZCBpZiByZXF1aXJlZC4NCisgKg0KKyAqIFBOR18zMmIgY29ycmVjdGx5IHByb2R1Y2VzIGEgdmFsdWUgc2hpZnRlZCBieSB1cCB0byAyNCBiaXRzLCBldmVuIG9uDQorICogYXJjaGl0ZWN0dXJlcyB3aGVyZSAoaW50KSBpcyBvbmx5IDE2IGJpdHMuDQorICovDQorI2RlZmluZSBQTkdfMzJiKGIscykgKChwbmdfdWludF8zMikoYikgPDwgKHMpKQ0KKyNkZWZpbmUgUE5HX1UzMihiMSxiMixiMyxiNCkgXA0KKyAgIChQTkdfMzJiKGIxLDI0KSB8IFBOR18zMmIoYjIsMTYpIHwgUE5HXzMyYihiMyw4KSB8IFBOR18zMmIoYjQsMCkpDQorDQorLyogQ29uc3RhbnRzIGZvciBrbm93biBjaHVuayB0eXBlcy4NCisgKg0KKyAqIE1BSU5UQUlORVJTOiBJZiB5b3UgbmVlZCB0byBhZGQgYSBjaHVuaywgZGVmaW5lIHRoZSBuYW1lIGhlcmUuDQorICogRm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGVzZSBjb25zdGFudHMgaGF2ZSB0aGUgZm9ybSBwbmdfPG5hbWU+OyBpLmUuDQorICogdGhlIHByZWZpeCBpcyBsb3dlciBjYXNlLiAgUGxlYXNlIHVzZSBkZWNpbWFsIHZhbHVlcyBhcyB0aGUgcGFyYW1ldGVycyB0bw0KKyAqIG1hdGNoIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24gYW5kIHRvIGF2b2lkIHJlbHlpbmcgb24gdGhlIEMgbG9jYWxlDQorICogaW50ZXJwcmV0YXRpb24gb2YgY2hhcmFjdGVyIHZhbHVlcy4gIFBsZWFzZSBrZWVwIHRoZSBsaXN0IHNvcnRlZC4NCisgKg0KKyAqIE5vdGljZSB0aGF0IFBOR19VMzIgaXMgdXNlZCB0byBkZWZpbmUgYSAzMi1iaXQgdmFsdWUgZm9yIHRoZSA0IGJ5dGUgY2h1bmsNCisgKiB0eXBlLiAgSW4gZmFjdCB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBleHByZXNzIGNodW5rIHR5cGVzIHRoaXMgd2F5LA0KKyAqIGhvd2V2ZXIgdXNpbmcgYSAzMi1iaXQgdmFsdWUgbWVhbnMgdGhhdCB0aGUgY2h1bmsgdHlwZSBjYW4gYmUgcmVhZCBmcm9tIHRoZQ0KKyAqIHN0cmVhbSB1c2luZyBleGFjdGx5IHRoZSBzYW1lIGNvZGUgYXMgdXNlZCBmb3IgYSAzMi1iaXQgdW5zaWduZWQgdmFsdWUgYW5kDQorICogY2FuIGJlIGV4YW1pbmVkIGZhciBtb3JlIGVmZmljaWVudGx5ICh1c2luZyBvbmUgYXJpdGhtZXRpYyBjb21wYXJlKS4NCisgKg0KKyAqIFByaW9yIHRvIDEuNS42IHRoZSBjaHVuayB0eXBlIGNvbnN0YW50cyB3ZXJlIGV4cHJlc3NlZCBhcyBDIHN0cmluZ3MuICBUaGUNCisgKiBsaWJwbmcgQVBJIHN0aWxsIHVzZXMgc3RyaW5ncyBmb3IgJ3Vua25vd24nIGNodW5rcyBhbmQgYSBtYWNybywNCisgKiBQTkdfU1RSSU5HX0ZST01fQ0hVTkssIGFsbG93cyBhIHN0cmluZyB0byBiZSBnZW5lcmF0ZWQgaWYgcmVxdWlyZWQuICBOb3RpY2UNCisgKiB0aGF0IGZvciBwb3J0YWJsZSBjb2RlIG51bWVyaWMgdmFsdWVzIG11c3Qgc3RpbGwgYmUgdXNlZDsgdGhlIHN0cmluZyAiSUhEUiINCisgKiBpcyBub3QgcG9ydGFibGUgYW5kIG5laXRoZXIgaXMgUE5HX1UzMignSScsICdIJywgJ0QnLCAnUicpLg0KKyAqDQorICogSW4gMS43LjAgdGhlIGRlZmluaXRpb25zIHdpbGwgYmUgbWFkZSBwdWJsaWMgaW4gcG5nLmggdG8gYXZvaWQgaGF2aW5nIHRvDQorICogZHVwbGljYXRlIHRoZSBzYW1lIGRlZmluaXRpb25zIGluIGFwcGxpY2F0aW9uIGNvZGUuDQorICovDQorI2RlZmluZSBwbmdfSURBVCBQTkdfVTMyKCA3MywgIDY4LCAgNjUsICA4NCkNCisjZGVmaW5lIHBuZ19JRU5EIFBOR19VMzIoIDczLCAgNjksICA3OCwgIDY4KQ0KKyNkZWZpbmUgcG5nX0lIRFIgUE5HX1UzMiggNzMsICA3MiwgIDY4LCAgODIpDQorI2RlZmluZSBwbmdfUExURSBQTkdfVTMyKCA4MCwgIDc2LCAgODQsICA2OSkNCisjZGVmaW5lIHBuZ19iS0dEIFBOR19VMzIoIDk4LCAgNzUsICA3MSwgIDY4KQ0KKyNkZWZpbmUgcG5nX2NIUk0gUE5HX1UzMiggOTksICA3MiwgIDgyLCAgNzcpDQorI2RlZmluZSBwbmdfZlJBYyBQTkdfVTMyKDEwMiwgIDgyLCAgNjUsICA5OSkgLyogcmVnaXN0ZXJlZCwgbm90IGRlZmluZWQgKi8NCisjZGVmaW5lIHBuZ19nQU1BIFBOR19VMzIoMTAzLCAgNjUsICA3NywgIDY1KQ0KKyNkZWZpbmUgcG5nX2dJRmcgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMDMpDQorI2RlZmluZSBwbmdfZ0lGdCBQTkdfVTMyKDEwMywgIDczLCAgNzAsIDExNikgLyogZGVwcmVjYXRlZCAqLw0KKyNkZWZpbmUgcG5nX2dJRnggUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMjApDQorI2RlZmluZSBwbmdfaElTVCBQTkdfVTMyKDEwNCwgIDczLCAgODMsICA4NCkNCisjZGVmaW5lIHBuZ19pQ0NQIFBOR19VMzIoMTA1LCAgNjcsICA2NywgIDgwKQ0KKyNkZWZpbmUgcG5nX2lUWHQgUE5HX1UzMigxMDUsICA4NCwgIDg4LCAxMTYpDQorI2RlZmluZSBwbmdfb0ZGcyBQTkdfVTMyKDExMSwgIDcwLCAgNzAsIDExNSkNCisjZGVmaW5lIHBuZ19wQ0FMIFBOR19VMzIoMTEyLCAgNjcsICA2NSwgIDc2KQ0KKyNkZWZpbmUgcG5nX3BIWXMgUE5HX1UzMigxMTIsICA3MiwgIDg5LCAxMTUpDQorI2RlZmluZSBwbmdfc0JJVCBQTkdfVTMyKDExNSwgIDY2LCAgNzMsICA4NCkNCisjZGVmaW5lIHBuZ19zQ0FMIFBOR19VMzIoMTE1LCAgNjcsICA2NSwgIDc2KQ0KKyNkZWZpbmUgcG5nX3NQTFQgUE5HX1UzMigxMTUsICA4MCwgIDc2LCAgODQpDQorI2RlZmluZSBwbmdfc1JHQiBQTkdfVTMyKDExNSwgIDgyLCAgNzEsICA2NikNCisjZGVmaW5lIHBuZ19zVEVSIFBOR19VMzIoMTE1LCAgODQsICA2OSwgIDgyKQ0KKyNkZWZpbmUgcG5nX3RFWHQgUE5HX1UzMigxMTYsICA2OSwgIDg4LCAxMTYpDQorI2RlZmluZSBwbmdfdElNRSBQTkdfVTMyKDExNiwgIDczLCAgNzcsICA2OSkNCisjZGVmaW5lIHBuZ190Uk5TIFBOR19VMzIoMTE2LCAgODIsICA3OCwgIDgzKQ0KKyNkZWZpbmUgcG5nX3pUWHQgUE5HX1UzMigxMjIsICA4NCwgIDg4LCAxMTYpDQorDQorLyogVGhlIGZvbGxvd2luZyB3aWxsIHdvcmsgb24gKHNpZ25lZCBjaGFyKikgc3RyaW5ncywgd2hlcmVhcyB0aGUgZ2V0X3VpbnRfMzINCisgKiBtYWNybyB3aWxsIGZhaWwgb24gdG9wLWJpdC1zZXQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlIHNpZ24gZXh0ZW5zaW9uLg0KKyAqLw0KKyNkZWZpbmUgUE5HX0NIVU5LX0ZST01fU1RSSU5HKHMpXA0KKyAgIFBOR19VMzIoMHhmZiYocylbMF0sIDB4ZmYmKHMpWzFdLCAweGZmJihzKVsyXSwgMHhmZiYocylbM10pDQorDQorLyogVGhpcyB1c2VzIChjaGFyKSwgbm90IChwbmdfYnl0ZSkgdG8gYXZvaWQgd2FybmluZ3Mgb24gc3lzdGVtcyB3aGVyZSAoY2hhcikgaXMNCisgKiBzaWduZWQgYW5kIHRoZSBhcmd1bWVudCBpcyBhIChjaGFyW10pICBUaGlzIG1hY3JvIHdpbGwgZmFpbCBtaXNlcmFibHkgb24NCisgKiBzeXN0ZW1zIHdoZXJlIChjaGFyKSBpcyBtb3JlIHRoYW4gOCBiaXRzLg0KKyAqLw0KKyNkZWZpbmUgUE5HX1NUUklOR19GUk9NX0NIVU5LKHMsYylcDQorICAgKHZvaWQpKCgoY2hhciopKHMpKVswXT0oY2hhcikoKGMpPj4yNCksICgoY2hhciopKHMpKVsxXT0oY2hhcikoKGMpPj4xNiksXA0KKyAgICgoY2hhciopKHMpKVsyXT0oY2hhcikoKGMpPj44KSwgKChjaGFyKikocykpWzNdPShjaGFyKSgoYykpKQ0KKw0KKy8qIERvIHRoZSBzYW1lIGJ1dCB0ZXJtaW5hdGUgd2l0aCBhIG51bGwgY2hhcmFjdGVyLiAqLw0KKyNkZWZpbmUgUE5HX0NTVFJJTkdfRlJPTV9DSFVOSyhzLGMpXA0KKyAgICh2b2lkKShQTkdfU1RSSU5HX0ZST01fQ0hVTksocyxjKSwgKChjaGFyKikocykpWzRdID0gMCkNCisNCisvKiBUZXN0IG9uIGZsYWcgdmFsdWVzIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKHNlY3Rpb24gNS40KTogKi8NCisjZGVmaW5lIFBOR19DSFVOS19BTkNJTExBUlkoYykgICAoMSAmICgoYykgPj4gMjkpKQ0KKyNkZWZpbmUgUE5HX0NIVU5LX0NSSVRJQ0FMKGMpICAgICAoIVBOR19DSFVOS19BTkNJTExBUlkoYykpDQorI2RlZmluZSBQTkdfQ0hVTktfUFJJVkFURShjKSAgICAgICgxICYgKChjKSA+PiAyMSkpDQorI2RlZmluZSBQTkdfQ0hVTktfUkVTRVJWRUQoYykgICAgICgxICYgKChjKSA+PiAxMykpDQorI2RlZmluZSBQTkdfQ0hVTktfU0FGRV9UT19DT1BZKGMpICgxICYgKChjKSA+PiAgNSkpDQorDQorLyogR2FtbWEgdmFsdWVzIChuZXcgYXQgbGlicG5nLTEuNS40KTogKi8NCisjZGVmaW5lIFBOR19HQU1NQV9NQUNfT0xEIDE1MTcyNCAgLyogQXNzdW1lICcxLjgnIGlzIHJlYWxseSAyLjIvMS40NSEgKi8NCisjZGVmaW5lIFBOR19HQU1NQV9NQUNfSU5WRVJTRSA2NTkwOQ0KKyNkZWZpbmUgUE5HX0dBTU1BX3NSR0JfSU5WRVJTRSA0NTQ1NQ0KKw0KKy8qIEFsbW9zdCBldmVyeXRoaW5nIGJlbG93IGlzIEMgc3BlY2lmaWM7IHRoZSAjZGVmaW5lcyBhYm92ZSBjYW4gYmUgdXNlZCBpbg0KKyAqIG5vbi1DIGNvZGUgKHNvIGxvbmcgYXMgaXQgaXMgQy1wcmVwcm9jZXNzZWQpIHRoZSByZXN0IG9mIHRoaXMgc3R1ZmYgY2Fubm90Lg0KKyAqLw0KKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZDQorDQorI2luY2x1ZGUgInBuZ3N0cnVjdC5oIg0KKyNpbmNsdWRlICJwbmdpbmZvLmgiDQorDQorLyogVmFsaWRhdGUgdGhlIGluY2x1ZGUgcGF0aHMgLSB0aGUgaW5jbHVkZSBwYXRoIHVzZWQgdG8gZ2VuZXJhdGUgcG5nbGliY29uZi5oDQorICogbXVzdCBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGJ1aWxkLCBvciB3ZSBtdXN0IGJlIHVzaW5nIHBuZ2xpYmNvbmYuaC5wcmVidWlsdDoNCisgKi8NCisjaWYgUE5HX1pMSUJfVkVSTlVNICE9IDAgJiYgUE5HX1pMSUJfVkVSTlVNICE9IFpMSUJfVkVSTlVNDQorIyAgZXJyb3IgWkxJQl9WRVJOVU0gIT0gUE5HX1pMSUJfVkVSTlVNIFwNCisgICAgICAiLUkgKGluY2x1ZGUgcGF0aCkgZXJyb3I6IHNlZSB0aGUgbm90ZXMgaW4gcG5ncHJpdi5oIg0KKyAgIC8qIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHBuZ2xpYmNvbmYuaCB3YXMgYnVpbHQgdGhlIGNvcHkgb2YgemxpYi5oIHRoYXQgaXQNCisgICAgKiB1c2VkIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb25lIGJlaW5nIHVzZWQgaGVyZS4gIEJlY2F1c2UgdGhlIGJ1aWxkIG9mDQorICAgICogbGlicG5nIG1ha2VzIGRlY2lzaW9ucyB0byB1c2UgaW5mbGF0ZUluaXQyIGFuZCBpbmZsYXRlUmVzZXQyIGJhc2VkIG9uIHRoZQ0KKyAgICAqIHpsaWIgdmVyc2lvbiBudW1iZXIgYW5kIGJlY2F1c2UgdGhpcyBhZmZlY3RzIGhhbmRsaW5nIG9mIGNlcnRhaW4gYnJva2VuDQorICAgICogUE5HIGZpbGVzIHRoZSAtSSBkaXJlY3RpdmVzIG11c3QgbWF0Y2guDQorICAgICoNCisgICAgKiBUaGUgbW9zdCBsaWtlbHkgZXhwbGFuYXRpb24gaXMgdGhhdCB5b3UgcGFzc2VkIGEgLUkgaW4gQ0ZMQUdTLCB0aGlzIHdpbGwNCisgICAgKiBub3Qgd29yazsgYWxsIHRoZSBwcmVwcm9jZXNzb3IgZGlyZWN0b3JpZXMgYW5kIGluIHBhcnRpY3VsYXIgYWxsIHRoZSAtSQ0KKyAgICAqIGRpcmVjdGl2ZXMgbXVzdCBiZSBpbiBDUFBGTEFHUy4NCisgICAgKi8NCisjZW5kaWYNCisNCisvKiBUaGlzIGlzIHVzZWQgZm9yIDE2IGJpdCBnYW1tYSB0YWJsZXMgLS0gb25seSB0aGUgdG9wIGxldmVsIHBvaW50ZXJzIGFyZQ0KKyAqIGNvbnN0OyB0aGlzIGNvdWxkIGJlIGNoYW5nZWQ6DQorICovDQordHlwZWRlZiBjb25zdCBwbmdfdWludF8xNnAgKiBwbmdfY29uc3RfdWludF8xNnBwOw0KKw0KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNzogc1JHQiBjb252ZXJzaW9uIHRhYmxlcyAqLw0KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkNCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfREFUQShjb25zdCBwbmdfdWludF8xNiwgcG5nX3NSR0JfdGFibGUsIFsyNTZdKTsNCisgICAvKiBDb252ZXJ0IGZyb20gYW4gc1JHQiBlbmNvZGVkIHZhbHVlIDAuLjI1NSB0byBhIDE2LWJpdCBsaW5lYXIgdmFsdWUsDQorICAgICogMC4uNjU1MzUuICBUaGlzIHRhYmxlIGdpdmVzIHRoZSBjbG9zZXN0IDE2LWJpdCBhbnN3ZXJzIChubyBlcnJvcnMpLg0KKyAgICAqLw0KKyNlbmRpZg0KKw0KK1BOR19JTlRFUk5BTF9EQVRBKGNvbnN0IHBuZ191aW50XzE2LCBwbmdfc1JHQl9iYXNlLCBbNTEyXSk7DQorUE5HX0lOVEVSTkFMX0RBVEEoY29uc3QgcG5nX2J5dGUsIHBuZ19zUkdCX2RlbHRhLCBbNTEyXSk7DQorDQorI2RlZmluZSBQTkdfc1JHQl9GUk9NX0xJTkVBUihsaW5lYXIpICgocG5nX2J5dGUpKChwbmdfc1JHQl9iYXNlWyhsaW5lYXIpPj4xNV0gK1wNCisgICAoKCgobGluZWFyKSYweDdmZmYpKnBuZ19zUkdCX2RlbHRhWyhsaW5lYXIpPj4xNV0pPj4xMikpID4+IDgpKQ0KKyAgIC8qIEdpdmVuIGEgdmFsdWUgJ2xpbmVhcicgaW4gdGhlIHJhbmdlIDAuLjI1NSo2NTUzNSBjYWxjdWxhdGUgdGhlIDgtYml0IHNSR0INCisgICAgKiBlbmNvZGVkIHZhbHVlIHdpdGggbWF4aW11bSBlcnJvciAwLjY0NjM2NS4gIE5vdGUgdGhhdCB0aGUgaW5wdXQgaXMgbm90IGENCisgICAgKiAxNi1iaXQgdmFsdWU7IGl0IGhhcyBiZWVuIG11bHRpcGxpZWQgYnkgMjU1ISAqLw0KKyNlbmRpZiAvKiBQTkdfU0lNUExJRklFRF9SRUFEL1dSSVRFICovDQorDQorDQorLyogSW5oaWJpdCBDKysgbmFtZS1tYW5nbGluZyBmb3IgbGlicG5nIGZ1bmN0aW9ucyBidXQgbm90IGZvciBzeXN0ZW0gY2FsbHMuICovDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorLyogSW50ZXJuYWwgZnVuY3Rpb25zOyB0aGVzZSBhcmUgbm90IGV4cG9ydGVkIGZyb20gYSBETEwgaG93ZXZlciBiZWNhdXNlIHRoZXkNCisgKiBhcmUgdXNlZCB3aXRoaW4gc2V2ZXJhbCBvZiB0aGUgQyBzb3VyY2UgZmlsZXMgdGhleSBoYXZlIHRvIGJlIEMgZXh0ZXJuLg0KKyAqDQorICogQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHdpdGggUE5HX0lOVEVSTkFMX0ZVTkNUSU9OLg0KKyAqLw0KKw0KKy8qIFpsaWIgc3VwcG9ydCAqLw0KKyNkZWZpbmUgUE5HX1VORVhQRUNURURfWkxJQl9SRVRVUk4gKC03KQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLCBwbmdfenN0cmVhbV9lcnJvciwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCByZXQpLA0KKyAgIFBOR19FTVBUWSk7DQorICAgLyogVXNlZCBieSB0aGUgemxpYiBoYW5kbGluZyBmdW5jdGlvbnMgdG8gZW5zdXJlIHRoYXQgel9zdHJlYW06Om1zZyBpcyBhbHdheXMNCisgICAgKiBzZXQgYmVmb3JlIHRoZXkgcmV0dXJuLg0KKyAgICAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ZyZWVfYnVmZmVyX2xpc3QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb21wcmVzc2lvbl9idWZmZXJwICpsaXN0KSxQTkdfRU1QVFkpOw0KKyAgIC8qIEZyZWUgdGhlIGJ1ZmZlciBsaXN0IHVzZWQgYnkgdGhlIGNvbXByZXNzZWQgd3JpdGUgY29kZS4gKi8NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSAmJiBcDQorICAgIWRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX01BQ1JPX1NVUFBPUlRFRCkgJiYgXA0KKyAgIChkZWZpbmVkKFBOR19nQU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfY0hSTV9TVVBQT1JURUQpIHx8IFwNCisgICBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKSkgfHwgXA0KKyAgIChkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkgJiYgXA0KKyAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEKSkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19maXhlZCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgZG91YmxlIGZwLCBwbmdfY29uc3RfY2hhcnAgdGV4dCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBDaGVjayB0aGUgdXNlciB2ZXJzaW9uIHN0cmluZyBmb3IgY29tcGF0aWJpbGl0eSwgcmV0dXJucyBmYWxzZSBpZiB0aGUgdmVyc2lvbg0KKyAqIG51bWJlcnMgYXJlbid0IGNvbXBhdGlibGUuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfdXNlcl92ZXJzaW9uX2NoZWNrLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIEludGVybmFsIGJhc2UgYWxsb2NhdG9yIC0gbm8gbWVzc2FnZXMsIE5VTEwgb24gZmFpbHVyZSB0byBhbGxvY2F0ZS4gIFRoaXMNCisgKiBkb2VzLCBob3dldmVyLCBjYWxsIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlZCBhbGxvY2F0b3IgYW5kIHRoYXQgY291bGQgY2FsbA0KKyAqIHBuZ19lcnJvciAoYWx0aG91Z2ggdGhhdCB3b3VsZCBiZSBhIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24gaW1wbGVtZW50YXRpb24uKQ0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdm9pZHAscG5nX21hbGxvY19iYXNlLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLFBOR19BTExPQ0FURUQpOw0KKw0KKyNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfc1BMVF9TVVBQT1JURUQpIHx8XA0KKyAgIGRlZmluZWQoUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkNCisvKiBJbnRlcm5hbCBhcnJheSBhbGxvY2F0b3IsIG91dHB1dHMgbm8gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlcyBvbiBmYWlsdXJlLA0KKyAqIGp1c3QgcmV0dXJucyBOVUxMLiAgDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ192b2lkcCxwbmdfbWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBpbnQgbmVsZW1lbnRzLCBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKTsNCisNCisvKiBUaGUgc2FtZSBidXQgYW4gZXhpc3RpbmcgYXJyYXkgaXMgZXh0ZW5kZWQgYnkgYWRkX2VsZW1lbnRzLiAgVGhpcyBmdW5jdGlvbg0KKyAqIGFsc28gbWVtc2V0cyB0aGUgbmV3IGVsZW1lbnRzIHRvIDAgYW5kIGNvcGllcyB0aGUgb2xkIGVsZW1lbnRzLiAgVGhlIG9sZA0KKyAqIGFycmF5IGlzIG5vdCBmcmVlZCBvciBhbHRlcmVkLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdm9pZHAscG5nX3JlYWxsb2NfYXJyYXksKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF92b2lkcCBhcnJheSwgaW50IG9sZF9lbGVtZW50cywgaW50IGFkZF9lbGVtZW50cywNCisgICBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKTsNCisjZW5kaWYgLyogdGV4dCwgc1BMVCBvciB1bmtub3duIGNodW5rcyAqLw0KKw0KKy8qIE1hZ2ljIHRvIGNyZWF0ZSBhIHN0cnVjdCB3aGVuIHRoZXJlIGlzIG5vIHN0cnVjdCB0byBjYWxsIHRoZSB1c2VyIHN1cHBsaWVkDQorICogbWVtb3J5IGFsbG9jYXRvcnMuICBCZWNhdXNlIGVycm9yIGhhbmRsaW5nIGhhcyBub3QgYmVlbiBzZXQgdXAgdGhlIG1lbW9yeQ0KKyAqIGhhbmRsZXJzIGNhbid0IHNhZmVseSBjYWxsIHBuZ19lcnJvciwgYnV0IHRoaXMgaXMgYW4gb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkDQorICogcmVzdHJpY3Rpb24gc28gbGlicG5nIGhhcyB0byBhc3N1bWUgdGhhdCB0aGUgJ2ZyZWUnIGhhbmRsZXIsIGF0IGxlYXN0LCBtaWdodA0KKyAqIGNhbGwgcG5nX2Vycm9yLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QsDQorICAgKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sDQorICAgIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwNCisgICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLFBOR19BTExPQ0FURUQpOw0KKw0KKy8qIEZyZWUgbWVtb3J5IGZyb20gaW50ZXJuYWwgbGlicG5nIHN0cnVjdCAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kZXN0cm95X3BuZ19zdHJ1Y3QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KKw0KKy8qIEZyZWUgYW4gYWxsb2NhdGVkIGptcF9idWYgKGFsd2F5cyBzdWNjZWVkcykgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZnJlZV9qbXBidWYsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYi4gIFBOR0FQSSBpcyBkaXNhbGxvd2VkLiAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkcGYscG5nX3phbGxvYywodm9pZHBmIHBuZ19wdHIsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSksDQorICAgUE5HX0FMTE9DQVRFRCk7DQorDQorLyogRnVuY3Rpb24gdG8gZnJlZSBtZW1vcnkgZm9yIHpsaWIuICBQTkdBUEkgaXMgZGlzYWxsb3dlZC4gKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfemZyZWUsKHZvaWRwZiBwbmdfcHRyLCB2b2lkcGYgcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIE5leHQgZm91ciBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSBhcyBjYWxsYmFja3MuICBQTkdDQkFQSSBpcyByZXF1aXJlZA0KKyAqIGJ1dCBub3QgUE5HX0VYUE9SVC4gIFBOR0FQSSBhZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMywgY2hhbmdlZCB0bw0KKyAqIFBOR0NCQVBJIGF0IDEuNS4wDQorICovDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfcmVhZF9kYXRhLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkIFBOR0NCQVBJLHBuZ19wdXNoX2ZpbGxfYnVmZmVyLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCBQTkdDQkFQSSxwbmdfZGVmYXVsdF93cml0ZV9kYXRhLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCisjICBpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfZmx1c2gsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpLA0KKyAgIFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Jlc2V0X2NyYywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorDQorLyogV3JpdGUgdGhlICJkYXRhIiBidWZmZXIgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb25zdF9ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsNCisNCisvKiBSZWFkIGFuZCBjaGVjayB0aGUgUE5HIGZpbGUgc2lnbmF0dXJlICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfc2lnLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIFJlYWQgdGhlIGNodW5rIGhlYWRlciAobGVuZ3RoICsgdHlwZSBuYW1lKSAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdWludF8zMixwbmdfcmVhZF9jaHVua19oZWFkZXIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KKw0KKy8qIFJlYWQgZGF0YSBmcm9tIHdoYXRldmVyIGlucHV0IHlvdSBhcmUgdXNpbmcgaW50byB0aGUgImRhdGEiIGJ1ZmZlciAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2RhdGEsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwNCisgICAgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorLyogUmVhZCBieXRlcyBpbnRvIGJ1ZiwgYW5kIHVwZGF0ZSBwbmdfcHRyLT5jcmMgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY3JjX3JlYWQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmLA0KKyAgICBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorLyogUmVhZCAic2tpcCIgYnl0ZXMsIHJlYWQgdGhlIGZpbGUgY3JjLCBhbmQgKG9wdGlvbmFsbHkpIHZlcmlmeSBwbmdfcHRyLT5jcmMgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jcmNfZmluaXNoLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfdWludF8zMiBza2lwKSxQTkdfRU1QVFkpOw0KKw0KKy8qIFJlYWQgdGhlIENSQyBmcm9tIHRoZSBmaWxlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsaWJwbmcgY2FsY3VsYXRlZCBDUkMgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jcmNfZXJyb3IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBOb3RlIHRoYXQgd2UgYXJlIG9ubHkNCisgKiBwYXNzaW5nIGEgbWF4aW11bSBvZiA2NEsgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhpcyBhcyBhIG1lbW9yeSBsaW1pdCwNCisgKiBzaW5jZSB0aGlzIGlzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIHdlIGNhbiBzcGVjaWZ5Lg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jYWxjdWxhdGVfY3JjLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHRyLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsNCisNCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19mbHVzaCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorLyogV3JpdGUgdmFyaW91cyBjaHVua3MgKi8NCisNCisvKiBXcml0ZSB0aGUgSUhEUiBjaHVuaywgYW5kIHVwZGF0ZSB0aGUgcG5nX3N0cnVjdCB3aXRoIHRoZSBuZWNlc3NhcnkNCisgKiBpbmZvcm1hdGlvbi4NCisgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfSUhEUiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwgaW50IGNvbG9yX3R5cGUsDQorICAgaW50IGNvbXByZXNzaW9uX21ldGhvZCwgaW50IGZpbHRlcl9tZXRob2QsIGludCBpbnRlcmxhY2VfbWV0aG9kKSxQTkdfRU1QVFkpOw0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9QTFRFLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY29sb3JwIHBhbGV0dGUsIHBuZ191aW50XzMyIG51bV9wYWwpLFBOR19FTVBUWSk7DQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbXByZXNzX0lEQVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9ieXRlcCByb3dfZGF0YSwgcG5nX2FsbG9jX3NpemVfdCByb3dfZGF0YV9sZW5ndGgsIGludCBmbHVzaCksDQorICAgUE5HX0VNUFRZKTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfSUVORCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9nQU1BX2ZpeGVkLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGZpbGVfZ2FtbWEpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9zQklUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9zQklULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X2NvbG9yXzhwIHNiaXQsIGludCBjb2xvcl90eXBlKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfY0hSTV9maXhlZCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIGNvbnN0IHBuZ194eSAqeHkpLCBQTkdfRU1QVFkpOw0KKyAgICAvKiBUaGUgeHkgdmFsdWUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB2YWxpZGF0ZWQgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3NSR0IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBpbnQgaW50ZW50KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfaUNDUCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbnN0X2NoYXJwIG5hbWUsIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlKSwgUE5HX0VNUFRZKTsNCisgICAvKiBUaGUgcHJvZmlsZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZCBmb3IgY29ycmVjdG5lc3MsIHRoZQ0KKyAgICAqIGxlbmd0aCBjb21lcyBmcm9tIHRoZSBmaXJzdCBmb3VyIGJ5dGVzLiAgT25seSB0aGUgYmFzZSwgZGVmbGF0ZSwNCisgICAgKiBjb21wcmVzc2lvbiBpcyBzdXBwb3J0ZWQuDQorICAgICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9zUExUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9zUExULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X3NQTFRfdHAgcGFsZXR0ZSksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3RSTlMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfY29uc3RfYnl0ZXAgdHJhbnMsIHBuZ19jb25zdF9jb2xvcl8xNnAgdmFsdWVzLCBpbnQgbnVtYmVyLA0KKyAgICBpbnQgY29sb3JfdHlwZSksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2JLR0QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIHZhbHVlcywgaW50IGNvbG9yX3R5cGUpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9oSVNULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGhpc3QsIGludCBudW1faGlzdCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBDaHVua3MgdGhhdCBoYXZlIGtleXdvcmRzICovDQorI2lmZGVmIFBOR19XUklURV90RVh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90RVh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAga2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCwgcG5nX3NpemVfdCB0ZXh0X2xlbiksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnANCisgICAga2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCwgcG5nX3NpemVfdCB0ZXh0X2xlbiwgaW50IGNvbXByZXNzaW9uKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIGludCBjb21wcmVzc2lvbiwgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2NvbnN0X2NoYXJwIGxhbmcsDQorICAgIHBuZ19jb25zdF9jaGFycCBsYW5nX2tleSwgcG5nX2NvbnN0X2NoYXJwIHRleHQpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRCAgLyogQWRkZWQgYXQgdmVyc2lvbiAxLjAuMTQgYW5kIDEuMi40ICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfc2V0X3RleHRfMiwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF90ZXh0cCB0ZXh0X3B0ciwgaW50IG51bV90ZXh0KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfb0ZGcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbnRfMzIgeF9vZmZzZXQsIHBuZ19pbnRfMzIgeV9vZmZzZXQsIGludCB1bml0X3R5cGUpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9wQ0FMLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsIHBuZ19pbnRfMzIgWDEsIGludCB0eXBlLCBpbnQgbnBhcmFtcywNCisgICAgcG5nX2NvbnN0X2NoYXJwIHVuaXRzLCBwbmdfY2hhcnBwIHBhcmFtcyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3BIWXNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3BIWXMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfdWludF8zMiB4X3BpeGVsc19wZXJfdW5pdCwgcG5nX3VpbnRfMzIgeV9waXhlbHNfcGVyX3VuaXQsDQorICAgIGludCB1bml0X3R5cGUpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV90SU1FX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90SU1FLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X3RpbWVwIG1vZF90aW1lKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc0NBTF9zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgaW50IHVuaXQsIHBuZ19jb25zdF9jaGFycCB3aWR0aCwgcG5nX2NvbnN0X2NoYXJwIGhlaWdodCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfZmluaXNoX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KKyAgICBQTkdfRU1QVFkpOw0KKw0KKy8qIEludGVybmFsIHVzZSBvbmx5LiAgIENhbGxlZCBiZWZvcmUgZmlyc3Qgcm93IG9mIGRhdGEgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc3RhcnRfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQorICAgIFBOR19FTVBUWSk7DQorDQorLyogQ29tYmluZSBhIHJvdyBvZiBkYXRhLCBkZWFsaW5nIHdpdGggYWxwaGEsIGV0Yy4gaWYgcmVxdWVzdGVkLiAgJ3JvdycgaXMgYW4NCisgKiBhcnJheSBvZiBwbmdfcHRyLT53aWR0aCBwaXhlbHMuICBJZiB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQgb3IgdGhpcw0KKyAqIGlzIHRoZSBmaW5hbCBwYXNzIHRoaXMganVzdCBkb2VzIGEgbWVtY3B5LCBvdGhlcndpc2UgdGhlICJkaXNwbGF5IiBmbGFnDQorICogaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb3B5IHBpeGVscyB0aGF0IGFyZSBub3QgaW4gdGhlIGN1cnJlbnQgcGFzcy4NCisgKg0KKyAqIEJlY2F1c2UgJ3BuZ19kb19yZWFkX2ludGVybGFjZScgKGJlbG93KSByZXBsaWNhdGVzIHBpeGVscyB0aGlzIGFsbG93cyB0aGlzDQorICogZnVuY3Rpb24gdG8gYWNoaWV2ZSB0aGUgZG9jdW1lbnRlZCAnYmxvY2t5JyBhcHBlYXJhbmNlIGR1cmluZyBpbnRlcmxhY2VkIHJlYWQNCisgKiBpZiBkaXNwbGF5IGlzIDEgYW5kIHRoZSAnc3BhcmtsZScgYXBwZWFyYW5jZSwgd2hlcmUgZXhpc3RpbmcgcGl4ZWxzIGluICdyb3cnDQorICogYXJlIG5vdCBjaGFuZ2VkIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgY3VycmVudCBwYXNzLCB3aGVuIGRpc3BsYXkgaXMgMC4NCisgKg0KKyAqICdkaXNwbGF5JyBtdXN0IGJlIDAgb3IgMSwgb3RoZXJ3aXNlIHRoZSBtZW1jcHkgd2lsbCBiZSBkb25lIHJlZ2FyZGxlc3MuDQorICoNCisgKiBUaGUgQVBJIGFsd2F5cyByZWFkcyBmcm9tIHRoZSBwbmdfc3RydWN0IHJvdyBidWZmZXIgYW5kIGFsd2F5cyBhc3N1bWVzIHRoYXQNCisgKiBpdCBpcyBmdWxsIHdpZHRoIChwbmdfZG9fcmVhZF9pbnRlcmxhY2UgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuKQ0KKyAqDQorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV2ZXIgdXNlZCB0byB3cml0ZSB0byByb3cgYnVmZmVycyBwcm92aWRlZCBieSB0aGUNCisgKiBjYWxsZXIgb2YgdGhlIHJlbGV2YW50IGxpYnBuZyBBUEkgYW5kIHRoZSByb3cgbXVzdCBoYXZlIGFscmVhZHkgYmVlbg0KKyAqIHRyYW5zZm9ybWVkIGJ5IHRoZSByZWFkIHRyYW5zZm9ybWF0aW9ucy4NCisgKg0KKyAqIFRoZSBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyBvcHRpb24gY2F1c2VzIGdlbmVyYXRpb24gb2YgcHJlLWNvbXB1dGVkDQorICogYml0bWFza3MgZm9yIHVzZSB3aXRoaW4gdGhlIGNvZGUsIG90aGVyd2lzZSBydW50aW1lIGdlbmVyYXRlZCBtYXNrcyBhcmUgdXNlZC4NCisgKiBUaGUgZGVmYXVsdCBpcyBjb21waWxlIHRpbWUgbWFza3MuDQorICovDQorI2lmbmRlZiBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUw0KKyMgIGRlZmluZSBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyAxDQorI2VuZGlmDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbWJpbmVfcm93LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2J5dGVwIHJvdywgaW50IGRpc3BsYXkpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKy8qIEV4cGFuZCBhbiBpbnRlcmxhY2VkIHJvdzogdGhlICdyb3dfaW5mbycgZGVzY3JpYmVzIHRoZSBwYXNzIGRhdGEgdGhhdCBoYXMNCisgKiBiZWVuIHJlYWQgaW4gYW5kIG11c3QgY29ycmVzcG9uZCB0byB0aGUgcGl4ZWxzIGluICdyb3cnLCB0aGUgcGl4ZWxzIGFyZQ0KKyAqIGV4cGFuZGVkIChtb3ZlZCBhcGFydCkgaW4gJ3JvdycgdG8gbWF0Y2ggdGhlIGZpbmFsIGxheW91dCwgd2hlbiBkb2luZyB0aGlzDQorICogdGhlIHBpeGVscyBhcmUgKnJlcGxpY2F0ZWQqIHRvIHRoZSBpbnRlcnZlbmluZyBzcGFjZS4gIFRoaXMgaXMgZXNzZW50aWFsIGZvcg0KKyAqIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBvZiBwbmdfY29tYmluZV9yb3csIGFib3ZlLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX2ludGVybGFjZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MsIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBHUlIgVE8gRE8gKDIuMCBvciB3aGVuZXZlcik6ICBzaW1wbGlmeSBvdGhlciBpbnRlcm5hbCBjYWxsaW5nIGludGVyZmFjZXMgKi8NCisNCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKy8qIEdyYWIgcGl4ZWxzIG91dCBvZiBhIHJvdyBmb3IgYW4gaW50ZXJsYWNlZCBwYXNzICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3dyaXRlX2ludGVybGFjZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorLyogVW5maWx0ZXIgYSByb3c6IGNoZWNrIHRoZSBmaWx0ZXIgdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcywgdGhlcmUgaXMgbm8gcG9pbnQNCisgKiBjYWxsaW5nIGl0IGZvciBQTkdfRklMVEVSX1ZBTFVFX05PTkUuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3JvdywocG5nX3N0cnVjdHJwIHBwLCBwbmdfcm93X2luZm9wDQorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3csIGludCBmaWx0ZXIpLFBOR19FTVBUWSk7DQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd191cF9uZW9uLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19zdWIzX25lb24sKHBuZ19yb3dfaW5mb3ANCisgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfbmVvbiwocG5nX3Jvd19pbmZvcA0KKyAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnM19uZW9uLChwbmdfcm93X2luZm9wDQorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19hdmc0X25lb24sKHBuZ19yb3dfaW5mb3ANCisgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoM19uZW9uLChwbmdfcm93X2luZm9wDQorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDRfbmVvbiwocG5nX3Jvd19pbmZvcA0KKyAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KKw0KKy8qIENob29zZSB0aGUgYmVzdCBmaWx0ZXIgdG8gdXNlIGFuZCBmaWx0ZXIgdGhlIHJvdyBkYXRhICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2ZpbmRfZmlsdGVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyksUE5HX0VNUFRZKTsNCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9JREFUX2RhdGEsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19ieXRlcCBvdXRwdXQsIHBuZ19hbGxvY19zaXplX3QgYXZhaWxfb3V0KSxQTkdfRU1QVFkpOw0KKyAgIC8qIFJlYWQgJ2F2YWlsX291dCcgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBJREFUIHN0cmVhbS4gIElmIHRoZSBvdXRwdXQgYnVmZmVyDQorICAgICogaXMgTlVMTCB0aGUgZnVuY3Rpb24gY2hlY2tzLCBpbnN0ZWFkLCBmb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAgSW4gdGhpcw0KKyAgICAqIGNhc2UgYSBiZW5pZ24gZXJyb3Igd2lsbCBiZSBpc3N1ZWQgaWYgdGhlIHN0cmVhbSBlbmQgaXMgbm90IGZvdW5kIG9yIGlmDQorICAgICogZXh0cmEgZGF0YSBoYXMgdG8gYmUgY29uc3VtZWQuDQorICAgICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmluaXNoX0lEQVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KKyAgIC8qIFRoaXMgY2xlYW5zIHVwIHdoZW4gdGhlIElEQVQgTFogc3RyZWFtIGRvZXMgbm90IGVuZCB3aGVuIHRoZSBsYXN0IGltYWdlDQorICAgICogYnl0ZSBpcyByZWFkOyB0aGVyZSBpcyBzdGlsbCBzb21lIHBlbmRpbmcgaW5wdXQuDQorICAgICovDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmluaXNoX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KKyAgIFBOR19FTVBUWSk7DQorICAgLyogRmluaXNoIGEgcm93IHdoaWxlIHJlYWRpbmcsIGRlYWxpbmcgd2l0aCBpbnRlcmxhY2luZyBwYXNzZXMsIGV0Yy4gKi8NCisjZW5kaWYNCisNCisvKiBJbml0aWFsaXplIHRoZSByb3cgYnVmZmVycywgZXRjLiAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX3N0YXJ0X3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorLyogT3B0aW9uYWwgY2FsbCB0byB1cGRhdGUgdGhlIHVzZXJzIGluZm8gc3RydWN0dXJlICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfdHJhbnNmb3JtX2luZm8sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgZG8gdGhlIHRyYW5zZm9ybWF0aW9ucyAqLw0KKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfZmlsbGVyLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBmaWxsZXIsIHBuZ191aW50XzMyIGZsYWdzKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX3N3YXBfYWxwaGEsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb193cml0ZV9zd2FwX2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpIHx8IFwNCisgICAgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3N0cmlwX2NoYW5uZWwsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3csIGludCBhdF9zdGFydCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRA0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fc3dhcCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IFwNCisgICAgZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19wYWNrc3dhcCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfZG9fcmdiX3RvX2dyYXksKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fZ3JheV90b19yZ2IsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3VucGFjaywocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3Vuc2hpZnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9jb2xvcl84cCBzaWdfYml0cyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19pbnZlcnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3NjYWxlXzE2X3RvXzgsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2Nob3AsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19xdWFudGl6ZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHBhbGV0dGVfbG9va3VwLA0KKyAgICBwbmdfY29uc3RfYnl0ZXAgcXVhbnRpemVfbG9va3VwKSxQTkdfRU1QVFkpOw0KKw0KKyMgIGlmZGVmIFBOR19DT1JSRUNUX1BBTEVUVEVfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvcnJlY3RfcGFsZXR0ZSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSxQTkdfRU1QVFkpOw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fYmdyLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcGFjaywocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBiaXRfZGVwdGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fc2hpZnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9jb2xvcl84cCBiaXRfZGVwdGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XA0KKyAgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19jb21wb3NlLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2dhbW1hLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fZW5jb2RlX2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgIHBuZ19ieXRlcCByb3csIHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2V4cGFuZF9wYWxldHRlLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfY29sb3JwIHBhbGV0dGUsIHBuZ19jb25zdF9ieXRlcCB0cmFucywNCisgICAgaW50IG51bV90cmFucyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fZXhwYW5kLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfY29sb3JfMTZwIHRyYW5zX2NvbG9yKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2V4cGFuZF8xNiwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBUaGUgZm9sbG93aW5nIGRlY29kZXMgdGhlIGFwcHJvcHJpYXRlIGNodW5rcywgYW5kIGRvZXMgZXJyb3IgY29ycmVjdGlvbiwNCisgKiB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFjayBmb3IgdGhlIGNodW5rIGlmIGl0IGlzIHZhbGlkLg0KKyAqLw0KKw0KKy8qIERlY29kZSB0aGUgSUhEUiBjaHVuayAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfSUhEUiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX1BMVEUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9JRU5ELChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfYktHRCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2NIUk0sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9nQU1BLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfaElTVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2lDQ1AsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmIC8qIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9pVFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfb0ZGcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3BDQUwsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9wSFlzLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc0JJVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3NDQUwsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9zUExULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZiAvKiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc1JHQiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3RFWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV90SU1FLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfdFJOUywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NoZWNrX2NodW5rX25hbWUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfdWludF8zMiBjaHVua19uYW1lKSxQTkdfRU1QVFkpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3Vua25vd24sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgsIGludCBrZWVwKSxQTkdfRU1QVFkpOw0KKyAgIC8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIHVua25vd24gY2h1bmtzLiAgVGhlICdrZWVwJw0KKyAgICAqIGFyZ3VtZW50IGlzIGVpdGhlciBub24temVybyBmb3IgYSBrbm93biBjaHVuayB0aGF0IGhhcyBiZWVuIHNldCB0byBiZQ0KKyAgICAqIGhhbmRsZWQgYXMgdW5rbm93biBvciB6ZXJvIGZvciBhbiB1bmtub3duIGNodW5rLiAgQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24NCisgICAgKiBqdXN0IHNraXBzIHRoZSBjaHVuayBvciBlcnJvcnMgb3V0IGlmIGl0IGlzIGNyaXRpY2FsLg0KKyAgICAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisjaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jaHVua191bmtub3duX2hhbmRsaW5nLA0KKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGNodW5rX25hbWUpLFBOR19FTVBUWSk7DQorICAgLyogRXhhY3RseSBhcyB0aGUgQVBJIHBuZ19oYW5kbGVfYXNfdW5rbm93bigpIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudCBpcyBhDQorICAgICogMzItYml0IGNodW5rIG5hbWUsIG5vdCBhIHN0cmluZy4NCisgICAgKi8NCisjZW5kaWYNCisjZW5kaWYgLyogUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLw0KKw0KKy8qIEhhbmRsZSB0aGUgdHJhbnNmb3JtYXRpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nICovDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfcm93X2luZm9wIHJvd19pbmZvKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfcm93X2luZm9wIHJvd19pbmZvKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQorICAgIFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfY2h1bmssKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfc2lnLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9jaGVja19jcmMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2NyY19za2lwLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2NyY19maW5pc2gsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICAgUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9zYXZlX2J1ZmZlciwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KKyAgICBQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfSURBVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Byb2Nlc3NfSURBVF9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3Byb2Nlc3Nfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQorICAgIFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGFuZGxlX3Vua25vd24sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYXZlX2luZm8sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGF2ZV9lbmQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGF2ZV9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX2VuZCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Byb2Nlc3Nfc29tZV9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICAgUE5HX0VNUFRZKTsNCisjICBpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV90RVh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfdEVYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisjICBpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV96VFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfelRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisjICBpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV9pVFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisNCisjZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfaW50cmFwaXhlbCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjYuMCAqLw0KKyNpZmRlZiBQTkdfR0FNTUFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbG9yc3BhY2Vfc2V0X2dhbW1hLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfZml4ZWRfcG9pbnQgZ0FNQSksIFBOR19FTVBUWSk7DQorICAgLyogU2V0IHRoZSBjb2xvcnNwYWNlIGdhbW1hIHdpdGggYSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gb3IgYnkNCisgICAgKiB0aGUgZ0FNQSBjaHVuayBvbiByZWFkLiAgVGhlIHZhbHVlIHdpbGwgb3ZlcnJpZGUgYW55dGhpbmcgc2V0IGJ5IGFuIElDQw0KKyAgICAqIHByb2ZpbGUuDQorICAgICovDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksIFBOR19FTVBUWSk7DQorICAgIC8qIFN5bmNocm9uaXplIHRoZSBpbmZvICd2YWxpZCcgZmxhZ3Mgd2l0aCB0aGUgY29sb3JzcGFjZSAqLw0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb2xvcnNwYWNlX3N5bmMsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSwgUE5HX0VNUFRZKTsNCisgICAgLyogQ29weSB0aGUgcG5nX3N0cnVjdCBjb2xvcnNwYWNlIHRvIHRoZSBpbmZvX3N0cnVjdCBhbmQgY2FsbCB0aGUgYWJvdmUgdG8NCisgICAgICogc3luY2hyb25pemUgdGhlIGZsYWdzLiAgQ2hlY2tzIGZvciBOVUxMIGluZm9fcHRyIGFuZCBkb2VzIG5vdGhpbmcuDQorICAgICAqLw0KKyNlbmRpZg0KKw0KKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovDQorI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRA0KKy8qIFRoZXNlIGludGVybmFsIGZ1bmN0aW9ucyBhcmUgZm9yIG1haW50YWluaW5nIHRoZSBjb2xvcnNwYWNlIHN0cnVjdHVyZSB3aXRoaW4NCisgKiBhIHBuZ19pbmZvIG9yIHBuZ19zdHJ1Y3QgKG9yLCBpbmRlZWQsIGJvdGgpLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NvbG9yc3BhY2Vfc2V0X2Nocm9tYXRpY2l0aWVzLA0KKyAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfeHkgKnh5LA0KKyAgICBpbnQgcHJlZmVycmVkKSwgUE5HX0VNUFRZKTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9lbmRwb2ludHMsDQorICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIGNvbnN0IHBuZ19YWVogKlhZWiwNCisgICAgaW50IHByZWZlcnJlZCksIFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgaW50IGludGVudCksIFBOR19FTVBUWSk7DQorICAgLyogVGhpcyBkb2VzIHNldCB0aGUgY29sb3JzcGFjZSBnQU1BIGFuZCBjSFJNIHZhbHVlcyB0b28sIGJ1dCBkb2Vzbid0IHNldCB0aGUNCisgICAgKiBmbGFncyB0byB3cml0ZSB0aGVtLCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZXJlIHdhcyBhIHByb2JsZW0gYW5kIGFuIGVycm9yDQorICAgICogbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIG91dHB1dCAoYnV0IHRoZSBjb2xvcnNwYWNlIG1heSBzdGlsbCBuZWVkIHRvIGJlDQorICAgICogc3luY2VkIHRvIHJlY29yZCB0aGUgaW52YWxpZCBmbGFnKS4NCisgICAgKi8NCisjZW5kaWYgLyogc1JHQiAqLw0KKw0KKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsDQorICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlLCBpbnQgY29sb3JfdHlwZSksDQorICAgUE5HX0VNUFRZKTsNCisgICAvKiBUaGUgJ25hbWUnIGlzIHVzZWQgZm9yIGluZm9ybWF0aW9uIG9ubHkgKi8NCisNCisvKiBSb3V0aW5lcyBmb3IgY2hlY2tpbmcgcGFydHMgb2YgYW4gSUNDIHByb2ZpbGUuICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX2xlbmd0aCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCksIFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX2hlYWRlciwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSAvKiBmaXJzdCAxMzIgYnl0ZXMgb25seSAqLywgaW50IGNvbG9yX3R5cGUpLA0KKyAgIFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX3RhZ190YWJsZSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSAvKiBoZWFkZXIgcGx1cyB3aG9sZSB0YWcgdGFibGUgKi8pLCBQTkdfRU1QVFkpOw0KKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaWNjX3NldF9zUkdCLCgNCisgICBwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLA0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlLCB1TG9uZyBhZGxlciksIFBOR19FTVBUWSk7DQorICAgLyogJ2FkbGVyJyBpcyB0aGUgQWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgdW5jb21wcmVzc2VkIHByb2ZpbGUgZGF0YS4gSXQgbWF5DQorICAgICogYmUgemVybyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIG5vdCBhdmFpbGFibGUuICBJdCBpcyB1c2VkLCBpZiBwcm92aWRlZCwNCisgICAgKiBhcyBhIGZhc3QgY2hlY2sgb24gdGhlIHByb2ZpbGUgd2hlbiBjaGVja2luZyB0byBzZWUgaWYgaXQgaXMgc1JHQi4NCisgICAgKi8NCisjZW5kaWYNCisjZW5kaWYgLyogaUNDUCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY29sb3JzcGFjZV9zZXRfcmdiX2NvZWZmaWNpZW50cywNCisgICAocG5nX3N0cnVjdHJwIHBuZ19wdHIpLCBQTkdfRU1QVFkpOw0KKyAgIC8qIFNldCB0aGUgcmdiX3RvX2dyYXkgY29lZmZpY2llbnRzIGZyb20gdGhlIGNvbG9yc3BhY2UgWSB2YWx1ZXMgKi8NCisjZW5kaWYgLyogUkVBRF9SR0JfVE9fR1JBWSAqLw0KKyNlbmRpZiAvKiBDT0xPUlNQQUNFICovDQorDQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY2hlY2tfSUhEUiwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsIGludCBiaXRfZGVwdGgsDQorICAgIGludCBjb2xvcl90eXBlLCBpbnQgaW50ZXJsYWNlX3R5cGUsIGludCBjb21wcmVzc2lvbl90eXBlLA0KKyAgICBpbnQgZmlsdGVyX3R5cGUpLFBOR19FTVBUWSk7DQorDQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS41LjEwICovDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fY2hlY2tfcGFsZXR0ZV9pbmRleGVzLA0KKyAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZml4ZWRfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBuYW1lKSxQTkdfTk9SRVRVUk4pOw0KKyNlbmRpZg0KKw0KKy8qIFB1dHMgJ3N0cmluZycgaW50byAnYnVmZmVyJyBhdCBidWZmZXJbcG9zXSwgdGFraW5nIGNhcmUgbmV2ZXIgdG8gb3ZlcndyaXRlDQorICogdGhlIGVuZC4gIEFsd2F5cyBsZWF2ZXMgdGhlIGJ1ZmZlciBudWwgdGVybWluYXRlZC4gIE5ldmVyIGVycm9ycyBvdXQgKGFuZA0KKyAqIHRoZXJlIGlzIG5vIGVycm9yIGNvZGUuKQ0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihzaXplX3QscG5nX3NhZmVjYXQsKHBuZ19jaGFycCBidWZmZXIsIHNpemVfdCBidWZzaXplLA0KKyAgIHNpemVfdCBwb3MsIHBuZ19jb25zdF9jaGFycCBzdHJpbmcpLFBOR19FTVBUWSk7DQorDQorLyogVmFyaW91cyBpbnRlcm5hbCBmdW5jdGlvbnMgdG8gaGFuZGxlIGZvcm1hdHRlZCB3YXJuaW5nIG1lc3NhZ2VzLCBjdXJyZW50bHkNCisgKiBvbmx5IGltcGxlbWVudGVkIGZvciB3YXJuaW5ncy4NCisgKi8NCisjaWYgZGVmaW5lZChQTkdfV0FSTklOR1NfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEKQ0KKy8qIFV0aWxpdHkgdG8gZHVtcCBhbiB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgYnVmZmVyLCBnaXZlbiBhIHN0YXJ0IHBvaW50ZXIgYW5kDQorICogYW5kIGVuZCBwb2ludGVyICh3aGljaCBzaG91bGQgcG9pbnQganVzdCAqYmV5b25kKiB0aGUgZW5kIG9mIHRoZSBidWZmZXIhKQ0KKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLiAgVGhpcyB1dGlsaXR5IG9ubHkNCisgKiBkb2VzIHVuc2lnbmVkIHZhbHVlcy4NCisgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2NoYXJwLHBuZ19mb3JtYXRfbnVtYmVyLChwbmdfY29uc3RfY2hhcnAgc3RhcnQsDQorICAgcG5nX2NoYXJwIGVuZCwgaW50IGZvcm1hdCwgcG5nX2FsbG9jX3NpemVfdCBudW1iZXIpLFBOR19FTVBUWSk7DQorDQorLyogQ29udmVuaWVuY2UgbWFjcm8gdGhhdCB0YWtlcyBhbiBhcnJheTogKi8NCisjZGVmaW5lIFBOR19GT1JNQVRfTlVNQkVSKGJ1ZmZlcixmb3JtYXQsbnVtYmVyKSBcDQorICAgcG5nX2Zvcm1hdF9udW1iZXIoYnVmZmVyLCBidWZmZXIgKyAoc2l6ZW9mIGJ1ZmZlciksIGZvcm1hdCwgbnVtYmVyKQ0KKw0KKy8qIFN1Z2dlc3RlZCBzaXplIGZvciBhIG51bWJlciBidWZmZXIgKGVub3VnaCBmb3IgNjQgYml0cyBhbmQgYSBzaWduISkgKi8NCisjZGVmaW5lIFBOR19OVU1CRVJfQlVGRkVSX1NJWkUgMjQNCisNCisvKiBUaGVzZSBhcmUgdGhlIGludGVnZXIgZm9ybWF0cyBjdXJyZW50bHkgc3VwcG9ydGVkLCB0aGUgbmFtZSBpcyBmb3JtZWQgZnJvbQ0KKyAqIHRoZSBzdGFuZGFyZCBwcmludGYoMykgZm9ybWF0IHN0cmluZy4NCisgKi8NCisjZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX3UgICAgIDEgLyogY2hvc2UgdW5zaWduZWQgQVBJISAqLw0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJ1ICAgMg0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfZCAgICAgMSAvKiBjaG9zZSBzaWduZWQgQVBJISAqLw0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJkICAgMg0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfeCAgICAgMw0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJ4ICAgNA0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfZml4ZWQgNSAvKiBjaG9vc2UgdGhlIHNpZ25lZCBBUEkgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRA0KKy8qIE5ldyBkZWZpbmVzIGFuZCBtZW1iZXJzIGFkZGluZyBpbiBsaWJwbmctMS41LjQgKi8NCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSX1NJWkUgMzINCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSX0NPVU5UIDggLyogTWF4aW11bSA5OyBzZWUgcG5nZXJyb3IuYyAqLw0KKw0KKy8qIEFuIGwtdmFsdWUgb2YgdGhpcyB0eXBlIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIEFQSXMgYmVsb3cgdG8gY2FjaGUgdGhlDQorICogdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzIHRvIGEgZm9ybWF0dGVkIHdhcm5pbmcgbWVzc2FnZS4NCisgKi8NCit0eXBlZGVmIGNoYXIgcG5nX3dhcm5pbmdfcGFyYW1ldGVyc1tQTkdfV0FSTklOR19QQVJBTUVURVJfQ09VTlRdWw0KKyAgIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9TSVpFXTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd2FybmluZ19wYXJhbWV0ZXIsKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwNCisgICBpbnQgbnVtYmVyLCBwbmdfY29uc3RfY2hhcnAgc3RyaW5nKSxQTkdfRU1QVFkpOw0KKyAgIC8qIFBhcmFtZXRlcnMgYXJlIGxpbWl0ZWQgaW4gc2l6ZSB0byBQTkdfV0FSTklOR19QQVJBTUVURVJfU0laRSBjaGFyYWN0ZXJzLA0KKyAgICAqIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJy4NCisgICAgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd2FybmluZ19wYXJhbWV0ZXJfdW5zaWduZWQsDQorICAgKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwgcG5nX2FsbG9jX3NpemVfdCB2YWx1ZSksDQorICAgUE5HX0VNUFRZKTsNCisgICAvKiBVc2UgcG5nX2FsbG9jX3NpemVfdCBiZWNhdXNlIGl0IGlzIGFuIHVuc2lnbmVkIHR5cGUgYXMgYmlnIGFzIGFueSB3ZQ0KKyAgICAqIG5lZWQgdG8gb3V0cHV0LiAgVXNlIHRoZSBmb2xsb3dpbmcgZm9yIGEgc2lnbmVkIHZhbHVlLg0KKyAgICAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQsDQorICAgKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwgcG5nX2ludF8zMiB2YWx1ZSksDQorICAgUE5HX0VNUFRZKTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZm9ybWF0dGVkX3dhcm5pbmcsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpLFBOR19FTVBUWSk7DQorICAgLyogJ21lc3NhZ2UnIGZvbGxvd3MgdGhlIFgvT3BlbiBhcHByb2FjaCBvZiB1c2luZyBAMSwgQDIgdG8gaW5zZXJ0DQorICAgICogcGFyYW1ldGVycyBwcmV2aW91c2x5IHN1cHBsaWVkIHVzaW5nIHRoZSBhYm92ZSBmdW5jdGlvbnMuICBFcnJvcnMgaW4NCisgICAgKiBzcGVjaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIHdpbGwgc2ltcGx5IHJlc3VsdCBpbiBnYXJiYWdlIHN1YnN0aXR1dGlvbnMuDQorICAgICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRA0KKy8qIEFwcGxpY2F0aW9uIGVycm9ycyAobmV3IGluIDEuNik7IHVzZSB0aGVzZSBmdW5jdGlvbnMgKGRlY2xhcmVkIGJlbG93KSBmb3INCisgKiBlcnJvcnMgaW4gdGhlIHBhcmFtZXRlcnMgb3Igb3JkZXIgb2YgQVBJIGZ1bmN0aW9uIGNhbGxzIG9uIHJlYWQuICBUaGUNCisgKiAnd2FybmluZycgc2hvdWxkIGJlIHVzZWQgZm9yIGFuIGVycm9yIHRoYXQgY2FuIGJlIGhhbmRsZWQgY29tcGxldGVseTsgdGhlDQorICogJ2Vycm9yJyBmb3Igb25lIHdoaWNoIGNhbiBiZSBoYW5kbGVkIHNhZmVseSBidXQgd2hpY2ggbWF5IGxvc2UgYXBwbGljYXRpb24NCisgKiBpbmZvcm1hdGlvbiBvciBzZXR0aW5ncy4NCisgKg0KKyAqIEJ5IGRlZmF1bHQgdGhlc2UgYm90aCByZXN1bHQgaW4gYSBwbmdfZXJyb3IgY2FsbCBwcmlvciB0byByZWxlYXNlLCB3aGlsZSBpbiBhDQorICogcmVsZWFzZWQgdmVyc2lvbiB0aGUgJ3dhcm5pbmcnIGlzIGp1c3QgYSB3YXJuaW5nLiAgSG93ZXZlciBpZiB0aGUgYXBwbGljYXRpb24NCisgKiBleHBsaWNpdGx5IGRpc2FibGVzIGJlbmlnbiBlcnJvcnMgKGV4cGxpY2l0bHkgcGVybWl0dGluZyB0aGUgY29kZSB0byBsb3NlDQorICogaW5mb3JtYXRpb24pIHRoZXkgYm90aCB0dXJuIGludG8gd2FybmluZ3MuDQorICoNCisgKiBJZiBiZW5pZ24gZXJyb3JzIGFyZW4ndCBzdXBwb3J0ZWQgdGhleSBlbmQgdXAgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBjYWxsDQorICogKHBuZ193YXJuaW5nIG9yIHBuZ19lcnJvci4pDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2FwcF93YXJuaW5nLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSksUE5HX0VNUFRZKTsNCisgICAvKiBUaGUgYXBwbGljYXRpb24gcHJvdmlkZWQgaW52YWxpZCBwYXJhbWV0ZXJzIHRvIGFuIEFQSSBmdW5jdGlvbiBvciBjYWxsZWQNCisgICAgKiBhbiBBUEkgZnVuY3Rpb24gYXQgdGhlIHdyb25nIHRpbWUsIGxpYnBuZyBjYW4gY29tcGxldGVseSByZWNvdmVyLg0KKyAgICAqLw0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19hcHBfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKSxQTkdfRU1QVFkpOw0KKyAgIC8qIEFzIGFib3ZlIGJ1dCBsaWJwbmcgd2lsbCBpZ25vcmUgdGhlIGNhbGwsIG9yIGF0dGVtcHQgc29tZSBvdGhlciBwYXJ0aWFsDQorICAgICogcmVjb3ZlcnkgZnJvbSB0aGUgZXJyb3IuDQorICAgICovDQorI2Vsc2UNCisjICBkZWZpbmUgcG5nX2FwcF93YXJuaW5nKHBwLHMpIHBuZ193YXJuaW5nKHBwLHMpDQorIyAgZGVmaW5lIHBuZ19hcHBfZXJyb3IocHAscykgcG5nX2Vycm9yKHBwLHMpDQorI2VuZGlmDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NodW5rX3JlcG9ydCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UsIGludCBlcnJvciksUE5HX0VNUFRZKTsNCisgICAvKiBSZXBvcnQgYSByZWNvdmVyYWJsZSBpc3N1ZSBpbiBjaHVuayBkYXRhLiAgT24gcmVhZCB0aGlzIGlzIHVzZWQgdG8gcmVwb3J0DQorICAgICogYSBwcm9ibGVtIGZvdW5kIHdoaWxlIHJlYWRpbmcgYSBwYXJ0aWN1bGFyIGNodW5rIGFuZCB0aGUNCisgICAgKiBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIG9yIHBuZ19jaHVua193YXJuaW5nIGZ1bmN0aW9uIGlzIHVzZWQgYXMNCisgICAgKiBhcHByb3ByaWF0ZS4gIE9uIHdyaXRlIHRoaXMgaXMgdXNlZCB0byByZXBvcnQgYW4gZXJyb3IgdGhhdCBjb21lcyBmcm9tDQorICAgICogZGF0YSBzZXQgdmlhIGFuIGFwcGxpY2F0aW9uIGNhbGwgdG8gYSBwbmdfc2V0XyBBUEkgYW5kIHBuZ19hcHBfZXJyb3Igb3INCisgICAgKiBwbmdfYXBwX3dhcm5pbmcgaXMgdXNlZCBhcyBhcHByb3ByaWF0ZS4NCisgICAgKg0KKyAgICAqIFRoZSAnZXJyb3InIHBhcmFtZXRlciBtdXN0IGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKyAgICAqLw0KKyNkZWZpbmUgUE5HX0NIVU5LX1dBUk5JTkcgICAgIDAgLyogbmV2ZXIgYW4gZXJyb3IgKi8NCisjZGVmaW5lIFBOR19DSFVOS19XUklURV9FUlJPUiAxIC8qIGFuIGVycm9yIG9ubHkgb24gd3JpdGUgKi8NCisjZGVmaW5lIFBOR19DSFVOS19FUlJPUiAgICAgICAyIC8qIGFsd2F5cyBhbiBlcnJvciAqLw0KKw0KKy8qIEFTQ0lJIHRvIEZQIGludGVyZmFjZXMsIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGlmIHNDQUwNCisgKiBzdXBwb3J0IGlzIHJlcXVpcmVkLg0KKyAqLw0KKyNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkNCisvKiBNQVhfRElHSVRTIGlzIGFjdHVhbGx5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIHNDQUwNCisgKiB3aWR0aCBvciBoZWlnaHQsIGRlcml2ZWQgZnJvbSB0aGUgcHJlY2lzaW9uIChudW1iZXIgb2Ygc2lnbmlmaWNhbnQNCisgKiBkaWdpdHMgLSBhIGJ1aWxkIHRpbWUgc2V0dGFibGUgb3B0aW9uKSBhbmQgYXNzdW1wdGlvbnMgYWJvdXQgdGhlDQorICogbWF4aW11bSByaWRpY3Vsb3VzIGV4cG9uZW50Lg0KKyAqLw0KKyNkZWZpbmUgUE5HX3NDQUxfTUFYX0RJR0lUUyAoUE5HX3NDQUxfUFJFQ0lTSU9OKzEvKi4qLysxLypFKi8rMTAvKmV4cG9uZW50Ki8pDQorDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYXNjaWlfZnJvbV9mcCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NoYXJwIGFzY2lpLCBwbmdfc2l6ZV90IHNpemUsIGRvdWJsZSBmcCwgdW5zaWduZWQgaW50IHByZWNpc2lvbiksDQorICAgUE5HX0VNUFRZKTsNCisjZW5kaWYgLyogRkxPQVRJTkdfUE9JTlQgKi8NCisNCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19hc2NpaV9mcm9tX2ZpeGVkLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY2hhcnAgYXNjaWksIHBuZ19zaXplX3Qgc2l6ZSwgcG5nX2ZpeGVkX3BvaW50IGZwKSxQTkdfRU1QVFkpOw0KKyNlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLw0KKyNlbmRpZiAvKiBzQ0FMICovDQorDQorI2lmIGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19wQ0FMX1NVUFBPUlRFRCkNCisvKiBBbiBpbnRlcm5hbCBBUEkgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4NCisgKiBUaGUgcmVzdWx0IGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIuICBJZiB0aGUgbnVtYmVyIGlzDQorICogbm90IHZhbGlkIGl0IHdpbGwgYmUgdGhlIGluZGV4IG9mIGEgY2hhcmFjdGVyIGluIHRoZSBzdXBwb3NlZCBudW1iZXIuDQorICoNCisgKiBUaGUgZm9ybWF0IG9mIGEgbnVtYmVyIGlzIGRlZmluZWQgaW4gdGhlIFBORyBleHRlbnNpb25zIHNwZWNpZmljYXRpb24NCisgKiBhbmQgdGhpcyBBUEkgaXMgc3RyaWN0bHkgY29uZm9ybWFudCB0byB0aGF0IHNwZWMsIG5vdCBhbnlvbmUgZWxzZXMhDQorICoNCisgKiBUaGUgZm9ybWF0IGFzIGEgcmVndWxhciBleHByZXNzaW9uIGlzOg0KKyAqDQorICogWystXT9bMC05XSsuPyhbRWVdWystXT9bMC05XSspPw0KKyAqDQorICogb3I6DQorICoNCisgKiBbKy1dPy5bMC05XSsoLlswLTldKyk/KFtFZV1bKy1dP1swLTldKyk/DQorICoNCisgKiBUaGUgY29tcGxleGl0eSBpcyB0aGF0IGVpdGhlciBpbnRlZ2VyIG9yIGZyYWN0aW9uIG11c3QgYmUgcHJlc2VudCBhbmQgdGhlDQorICogZnJhY3Rpb24gaXMgcGVybWl0dGVkIHRvIGhhdmUgbm8gZGlnaXRzIG9ubHkgaWYgdGhlIGludGVnZXIgaXMgcHJlc2VudC4NCisgKg0KKyAqIE5PVEU6IFRoZSBkYW5nbGluZyBFIHByb2JsZW0uDQorICogICBUaGVyZSBpcyBhIFBORyB2YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gdGhlIGZvbGxvd2luZzoNCisgKg0KKyAqICAgICAgIFBORyBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBub3QgZ3JlZWR5Lg0KKyAqDQorICogICBXb3JraW5nIHRoaXMgb3V0IHJlcXVpcmVzICpUV08qIGNoYXJhY3RlciBsb29rYWhlYWQgKGJlY2F1c2Ugb2YgdGhlDQorICogICBzaWduKSwgdGhlIHBhcnNlciBkb2VzIG5vdCBkbyB0aGlzIC0gaXQgd2lsbCBmYWlsIGF0IHRoZSAncicgLSB0aGlzDQorICogICBkb2Vzbid0IG1hdHRlciBmb3IgUE5HIHNDQUwgY2h1bmsgdmFsdWVzLCBidXQgaXQgcmVxdWlyZXMgbW9yZSBjYXJlDQorICogICBpZiB0aGUgdmFsdWUgd2VyZSBldmVyIHRvIGJlIGVtYmVkZGVkIGluIHNvbWV0aGluZyBtb3JlIGNvbXBsZXguICBVc2UNCisgKiAgIEFOU0ktQyBzdHJ0b2QgaWYgeW91IG5lZWQgdGhlIGxvb2thaGVhZC4NCisgKi8NCisvKiBTdGF0ZSB0YWJsZSBmb3IgdGhlIHBhcnNlci4gKi8NCisjZGVmaW5lIFBOR19GUF9JTlRFR0VSICAgIDAgIC8qIGJlZm9yZSBvciBpbiBpbnRlZ2VyICovDQorI2RlZmluZSBQTkdfRlBfRlJBQ1RJT04gICAxICAvKiBiZWZvcmUgb3IgaW4gZnJhY3Rpb24gKi8NCisjZGVmaW5lIFBOR19GUF9FWFBPTkVOVCAgIDIgIC8qIGJlZm9yZSBvciBpbiBleHBvbmVudCAqLw0KKyNkZWZpbmUgUE5HX0ZQX1NUQVRFICAgICAgMyAgLyogbWFzayBmb3IgdGhlIGFib3ZlICovDQorI2RlZmluZSBQTkdfRlBfU0FXX1NJR04gICA0ICAvKiBTYXcgKy8tIGluIGN1cnJlbnQgc3RhdGUgKi8NCisjZGVmaW5lIFBOR19GUF9TQVdfRElHSVQgIDggIC8qIFNhdyBhIGRpZ2l0IGluIGN1cnJlbnQgc3RhdGUgKi8NCisjZGVmaW5lIFBOR19GUF9TQVdfRE9UICAgMTYgIC8qIFNhdyBhIGRvdCBpbiBjdXJyZW50IHN0YXRlICovDQorI2RlZmluZSBQTkdfRlBfU0FXX0UgICAgIDMyICAvKiBTYXcgYW4gRSAob3IgZSkgaW4gY3VycmVudCBzdGF0ZSAqLw0KKyNkZWZpbmUgUE5HX0ZQX1NBV19BTlkgICA2MCAgLyogU2F3IGFueSBvZiB0aGUgYWJvdmUgNCAqLw0KKw0KKy8qIFRoZXNlIHRocmVlIHZhbHVlcyBkb24ndCBhZmZlY3QgdGhlIHBhcnNlci4gIFRoZXkgYXJlIHNldCBidXQgbm90IHVzZWQuDQorICovDQorI2RlZmluZSBQTkdfRlBfV0FTX1ZBTElEIDY0ICAvKiBQcmVjZWRpbmcgc3Vic3RyaW5nIGlzIGEgdmFsaWQgZnAgbnVtYmVyICovDQorI2RlZmluZSBQTkdfRlBfTkVHQVRJVkUgMTI4ICAvKiBBIG5lZ2F0aXZlIG51bWJlciwgaW5jbHVkaW5nICItMCIgKi8NCisjZGVmaW5lIFBOR19GUF9OT05aRVJPICAyNTYgIC8qIEEgbm9uLXplcm8gdmFsdWUgKi8NCisjZGVmaW5lIFBOR19GUF9TVElDS1kgICA0NDggIC8qIFRoZSBhYm92ZSB0aHJlZSBmbGFncyAqLw0KKw0KKy8qIFRoaXMgaXMgYXZhaWxhYmxlIGZvciB0aGUgY2FsbGVyIHRvIHN0b3JlIGluICdzdGF0ZScgaWYgcmVxdWlyZWQuICBEbyBub3QNCisgKiBjYWxsIHRoZSBwYXJzZXIgYWZ0ZXIgc2V0dGluZyBpdCAodGhlIHBhcnNlciBzb21ldGltZXMgY2xlYXJzIGl0LikNCisgKi8NCisjZGVmaW5lIFBOR19GUF9JTlZBTElEICA1MTIgIC8qIEF2YWlsYWJsZSBmb3IgY2FsbGVycyBhcyBhIGRpc3RpbmN0IHZhbHVlICovDQorDQorLyogUmVzdWx0IGNvZGVzIGZvciB0aGUgcGFyc2VyIChib29sZWFuIC0gdHJ1ZSBtZWFudHMgb2ssIGZhbHNlIG1lYW5zDQorICogbm90IG9rIHlldC4pDQorICovDQorI2RlZmluZSBQTkdfRlBfTUFZQkUgICAgICAwICAvKiBUaGUgbnVtYmVyIG1heSBiZSB2YWxpZCBpbiB0aGUgZnV0dXJlICovDQorI2RlZmluZSBQTkdfRlBfT0sgICAgICAgICAxICAvKiBUaGUgbnVtYmVyIGlzIHZhbGlkICovDQorDQorLyogVGVzdHMgb24gdGhlIHN0aWNreSBub24temVybyBhbmQgbmVnYXRpdmUgZmxhZ3MuICBUbyBwYXNzIHRoZXNlIGNoZWNrcw0KKyAqIHRoZSBzdGF0ZSBtdXN0IGFsc28gaW5kaWNhdGUgdGhhdCB0aGUgd2hvbGUgbnVtYmVyIGlzIHZhbGlkIC0gdGhpcyBpcw0KKyAqIGFjaGlldmVkIGJ5IHRlc3RpbmcgUE5HX0ZQX1NBV19ESUdJVCAoc2VlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igd2h5IHRoaXMNCisgKiBpcyBlcXVpdmFsZW50IHRvIFBOR19GUF9PSyBhYm92ZS4pDQorICovDQorI2RlZmluZSBQTkdfRlBfTlpfTUFTSyAoUE5HX0ZQX1NBV19ESUdJVCB8IFBOR19GUF9ORUdBVElWRSB8IFBOR19GUF9OT05aRVJPKQ0KKyAgIC8qIE5aX01BU0s6IHRoZSBzdHJpbmcgaXMgdmFsaWQgYW5kIGEgbm9uLXplcm8gbmVnYXRpdmUgdmFsdWUgKi8NCisjZGVmaW5lIFBOR19GUF9aX01BU0sgKFBOR19GUF9TQVdfRElHSVQgfCBQTkdfRlBfTk9OWkVSTykNCisgICAvKiBaIE1BU0s6IHRoZSBzdHJpbmcgaXMgdmFsaWQgYW5kIGEgbm9uLXplcm8gdmFsdWUuICovDQorICAgLyogUE5HX0ZQX1NBV19ESUdJVDogdGhlIHN0cmluZyBpcyB2YWxpZC4gKi8NCisjZGVmaW5lIFBOR19GUF9JU19aRVJPKHN0YXRlKSAoKChzdGF0ZSkgJiBQTkdfRlBfWl9NQVNLKSA9PSBQTkdfRlBfU0FXX0RJR0lUKQ0KKyNkZWZpbmUgUE5HX0ZQX0lTX1BPU0lUSVZFKHN0YXRlKSAoKChzdGF0ZSkgJiBQTkdfRlBfTlpfTUFTSykgPT0gUE5HX0ZQX1pfTUFTSykNCisjZGVmaW5lIFBOR19GUF9JU19ORUdBVElWRShzdGF0ZSkgKCgoc3RhdGUpICYgUE5HX0ZQX05aX01BU0spID09IFBOR19GUF9OWl9NQVNLKQ0KKw0KKy8qIFRoZSBhY3R1YWwgcGFyc2VyLiAgVGhpcyBjYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHkuIEl0IHVwZGF0ZXMNCisgKiB0aGUgaW5kZXggaW50byB0aGUgc3RyaW5nIGFuZCB0aGUgc3RhdGUgdmFyaWFibGUgKHdoaWNoIG11c3QNCisgKiBiZSBpbml0aWFsaXplZCB0byAwKS4gIEl0IHJldHVybnMgYSByZXN1bHQgY29kZSwgYXMgYWJvdmUuICBUaGVyZQ0KKyAqIGlzIG5vIHBvaW50IGNhbGxpbmcgdGhlIHBhcnNlciBhbnkgbW9yZSBpZiBpdCBmYWlscyB0byBhZHZhbmNlIHRvDQorICogdGhlIGVuZCBvZiB0aGUgc3RyaW5nIC0gaXQgaXMgc3R1Y2sgb24gYW4gaW52YWxpZCBjaGFyYWN0ZXIgKG9yDQorICogdGVybWluYXRlZCBieSAnXDAnKS4NCisgKg0KKyAqIE5vdGUgdGhhdCB0aGUgcG9pbnRlciB3aWxsIGNvbnN1bWUgYW4gRSBvciBldmVuIGFuIEUrIGFuZCB0aGVuIGxlYXZlDQorICogYSAnbWF5YmUnIHN0YXRlIGV2ZW4gdGhvdWdoIGEgcHJlY2VkaW5nIGludGVnZXIuZnJhY3Rpb24gaXMgdmFsaWQuDQorICogVGhlIFBOR19GUF9XQVNfVkFMSUQgZmxhZyBpbmRpY2F0ZXMgdGhhdCBhIHByZWNlZGluZyBzdWJzdHJpbmcgd2FzDQorICogYSB2YWxpZCBudW1iZXIuICBJdCdzIHBvc3NpYmxlIHRvIHJlY292ZXIgZnJvbSB0aGlzIGJ5IGNhbGxpbmcNCisgKiB0aGUgcGFyc2VyIGFnYWluIChmcm9tIHRoZSBzdGFydCwgd2l0aCBzdGF0ZSAwKSBidXQgd2l0aCBhIHN0cmluZw0KKyAqIHRoYXQgb21pdHMgdGhlIGxhc3QgY2hhcmFjdGVyIChpLmUuIHNldCB0aGUgc2l6ZSB0byB0aGUgaW5kZXggb2YNCisgKiB0aGUgcHJvYmxlbSBjaGFyYWN0ZXIuKSAgVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIHdpdGhpbiBsaWJwbmcuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY2hlY2tfZnBfbnVtYmVyLChwbmdfY29uc3RfY2hhcnAgc3RyaW5nLA0KKyAgIHBuZ19zaXplX3Qgc2l6ZSwgaW50ICpzdGF0ZXAsIHBuZ19zaXplX3RwIHdoZXJlYW1pKSxQTkdfRU1QVFkpOw0KKw0KKy8qIFRoaXMgaXMgdGhlIHNhbWUgYnV0IGl0IGNoZWNrcyBhIGNvbXBsZXRlIHN0cmluZyBhbmQgcmV0dXJucyB0cnVlDQorICogb25seSBpZiBpdCBqdXN0IGNvbnRhaW5zIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgQXMgb2YgMS41LjQgdGhpcw0KKyAqIGZ1bmN0aW9uIGFsc28gcmV0dXJucyB0aGUgc3RhdGUgYXQgdGhlIGVuZCBvZiBwYXJzaW5nIHRoZSBudW1iZXIgaWYNCisgKiBpdCB3YXMgdmFsaWQgKG90aGVyd2lzZSBpdCByZXR1cm5zIDAuKSAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgdGVzdGluZw0KKyAqIGZvciBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlcyB1c2luZyB0aGUgc3RpY2t5IGZsYWcuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY2hlY2tfZnBfc3RyaW5nLChwbmdfY29uc3RfY2hhcnAgc3RyaW5nLA0KKyAgIHBuZ19zaXplX3Qgc2l6ZSksUE5HX0VNUFRZKTsNCisjZW5kaWYgLyogcENBTCB8fCBzQ0FMICovDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fFwNCisgICAgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpDQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS41LjAgKi8NCisvKiBUaGlzIGlzIGEgdXRpbGl0eSB0byBwcm92aWRlIGEqdGltZXMvZGl2IChyb3VuZGVkKSBhbmQgaW5kaWNhdGUNCisgKiBpZiB0aGVyZSBpcyBhbiBvdmVyZmxvdy4gIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIC0gZmFsc2UgKDApDQorICogZm9yIG92ZXJmbG93LCB0cnVlICgxKSBpZiBubyBvdmVyZmxvdywgaW4gd2hpY2ggY2FzZSAqcmVzDQorICogaG9sZHMgdGhlIHJlc3VsdC4NCisgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19tdWxkaXYsKHBuZ19maXhlZF9wb2ludF9wIHJlcywgcG5nX2ZpeGVkX3BvaW50IGEsDQorICAgcG5nX2ludF8zMiBtdWx0aXBsaWVkX2J5LCBwbmdfaW50XzMyIGRpdmlkZWRfYnkpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCkNCisvKiBTYW1lIGRlYWwsIGJ1dCBpc3N1ZSBhIHdhcm5pbmcgb24gb3ZlcmZsb3cgYW5kIHJldHVybiAwLiAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfZml4ZWRfcG9pbnQscG5nX211bGRpdl93YXJuLA0KKyAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGEsIHBuZ19pbnRfMzIgbXVsdGlwbGllZF9ieSwNCisgICBwbmdfaW50XzMyIGRpdmlkZWRfYnkpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19HQU1NQV9TVVBQT1JURUQNCisvKiBDYWxjdWxhdGUgYSByZWNpcHJvY2FsIC0gdXNlZCBmb3IgZ2FtbWEgdmFsdWVzLiAgVGhpcyByZXR1cm5zDQorICogMCBpZiB0aGUgYXJndW1lbnQgaXMgMCBpbiBvcmRlciB0byBtYWludGFpbiBhbiB1bmRlZmluZWQgdmFsdWU7DQorICogdGhlcmUgYXJlIG5vIHdhcm5pbmdzLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfZml4ZWRfcG9pbnQscG5nX3JlY2lwcm9jYWwsKHBuZ19maXhlZF9wb2ludCBhKSwNCisgICBQTkdfRU1QVFkpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisvKiBUaGUgc2FtZSBidXQgZ2l2ZXMgYSByZWNpcHJvY2FsIG9mIHRoZSBwcm9kdWN0IG9mIHR3byBmaXhlZCBwb2ludA0KKyAqIHZhbHVlcy4gIEFjY3VyYWN5IGlzIHN1aXRhYmxlIGZvciBnYW1tYSBjYWxjdWxhdGlvbnMgYnV0IHRoaXMgaXMNCisgKiBub3QgZXhhY3QgLSB1c2UgcG5nX211bGRpdiBmb3IgdGhhdC4gIE9ubHkgcmVxdWlyZWQgYXQgcHJlc2VudCBvbiByZWFkLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfZml4ZWRfcG9pbnQscG5nX3JlY2lwcm9jYWwyLChwbmdfZml4ZWRfcG9pbnQgYSwNCisgICBwbmdfZml4ZWRfcG9pbnQgYiksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2FtbWEgdmFsdWUgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSAxLjAgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19nYW1tYV9zaWduaWZpY2FudCwocG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSwNCisgICBQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisvKiBJbnRlcm5hbCBmaXhlZCBwb2ludCBnYW1tYSBjb3JyZWN0aW9uLiAgVGhlc2UgQVBJcyBhcmUgY2FsbGVkIGFzDQorICogcmVxdWlyZWQgdG8gY29udmVydCBzaW5nbGUgdmFsdWVzIC0gdGhleSBkb24ndCBuZWVkIHRvIGJlIGZhc3QsDQorICogdGhleSBhcmUgbm90IHVzZWQgd2hlbiBwcm9jZXNzaW5nIGltYWdlIHBpeGVsIHZhbHVlcy4NCisgKg0KKyAqIFdoaWxlIHRoZSBpbnB1dCBpcyBhbiAndW5zaWduZWQnIHZhbHVlIGl0IG11c3QgYWN0dWFsbHkgYmUgdGhlDQorICogY29ycmVjdCBiaXQgdmFsdWUgLSAwLi4yNTUgb3IgMC4uNjU1MzUgYXMgcmVxdWlyZWQuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ191aW50XzE2LHBuZ19nYW1tYV9jb3JyZWN0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICB1bnNpZ25lZCBpbnQgdmFsdWUsIHBuZ19maXhlZF9wb2ludCBnYW1tYV92YWx1ZSksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3VpbnRfMTYscG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QsKHVuc2lnbmVkIGludCB2YWx1ZSwNCisgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsdWUpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19ieXRlLHBuZ19nYW1tYV84Yml0X2NvcnJlY3QsKHVuc2lnbmVkIGludCB2YWx1ZSwNCisgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsdWUpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2Rlc3Ryb3lfZ2FtbWFfdGFibGUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19idWlsZF9nYW1tYV90YWJsZSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgaW50IGJpdF9kZXB0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBTSU1QTElGSUVEIFJFQUQvV1JJVEUgU1VQUE9SVCAqLw0KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkNCisvKiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIHRoYXQgcG5nX2ltYWdlOjpvcGFxdWUgcG9pbnRzIHRvLiAqLw0KK3R5cGVkZWYgc3RydWN0IHBuZ19jb250cm9sDQorew0KKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7DQorICAgcG5nX2luZm9wICAgaW5mb19wdHI7DQorICAgcG5nX3ZvaWRwICAgZXJyb3JfYnVmOyAgICAgICAgICAgLyogQWx3YXlzIGEgam1wX2J1ZiBhdCBwcmVzZW50LiAqLw0KKw0KKyAgIHBuZ19jb25zdF9ieXRlcCBtZW1vcnk7ICAgICAgICAgIC8qIE1lbW9yeSBidWZmZXIuICovDQorICAgcG5nX3NpemVfdCAgICAgIHNpemU7ICAgICAgICAgICAgLyogU2l6ZSBvZiB0aGUgbWVtb3J5IGJ1ZmZlci4gKi8NCisNCisgICB1bnNpZ25lZCBpbnQgZm9yX3dyaXRlICAgICAgIDoxOyAvKiBPdGhlcndpc2UgaXQgaXMgYSByZWFkIHN0cnVjdHVyZSAqLw0KKyAgIHVuc2lnbmVkIGludCBvd25lZF9maWxlICAgICAgOjE7IC8qIFdlIG93biB0aGUgZmlsZSBpbiBpb19wdHIgKi8NCit9IHBuZ19jb250cm9sOw0KKw0KKy8qIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBmcm9tIGEgcG5nX2NvbnRyb2w6IG5lY2Vzc2FyeSBiZWNhdXNlIEMNCisgKiBkb2VzIG5vdCByZXZlYWwgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIGptcF9idWYuDQorICovDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorIyAgZGVmaW5lIHBuZ19jb250cm9sX2ptcF9idWYocGMpICgoKGptcF9idWYqKSgocGMpLT5lcnJvcl9idWYpKVswXSkNCisjZWxzZQ0KKyMgIGRlZmluZSBwbmdfY29udHJvbF9qbXBfYnVmKHBjKSAoKHBjKS0+ZXJyb3JfYnVmKQ0KKyNlbmRpZg0KKw0KKy8qIFV0aWxpdHkgdG8gc2FmZWx5IGV4ZWN1dGUgYSBwaWVjZSBvZiBsaWJwbmcgY29kZSBjYXRjaGluZyBhbmQgbG9nZ2luZyBhbnkNCisgKiBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ci4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChlaXRoZXINCisgKiBvZiB0aGUgZnVuY3Rpb24gb3IgYXMgYSByZXN1bHQgb2YgYSBwbmdfZXJyb3IuKQ0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19zYWZlX2Vycm9yLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSxQTkdfTk9SRVRVUk4pOw0KKw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3NhZmVfd2FybmluZywocG5nX3N0cnVjdHAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSxQTkdfRU1QVFkpOw0KKyNlbHNlDQorIyAgZGVmaW5lIHBuZ19zYWZlX3dhcm5pbmcgMC8qZHVtbXkgYXJndW1lbnQqLw0KKyNlbmRpZg0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX3NhZmVfZXhlY3V0ZSwocG5nX2ltYWdlcCBpbWFnZSwNCisgICBpbnQgKCpmdW5jdGlvbikocG5nX3ZvaWRwKSwgcG5nX3ZvaWRwIGFyZyksUE5HX0VNUFRZKTsNCisNCisvKiBVdGlsaXR5IHRvIGxvZyBhbiBlcnJvcjsgdGhpcyBhbHNvIGNsZWFucyB1cCB0aGUgcG5nX2ltYWdlOyB0aGUgZnVuY3Rpb24NCisgKiBhbHdheXMgcmV0dXJucyAwIChmYWxzZSkuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaW1hZ2VfZXJyb3IsKHBuZ19pbWFnZXAgaW1hZ2UsDQorICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpLFBOR19FTVBUWSk7DQorDQorI2lmbmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRA0KKy8qIHBuZ19pbWFnZV9mcmVlIGlzIHVzZWQgYnkgdGhlIHdyaXRlIGNvZGUgYnV0IG5vdCBleHBvcnRlZCAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLCBwbmdfaW1hZ2VfZnJlZSwgKHBuZ19pbWFnZXAgaW1hZ2UpLCBQTkdfRU1QVFkpOw0KKyNlbmRpZiAvKiAhU0lNUExJRklFRF9SRUFEICovDQorDQorI2VuZGlmIC8qIFNJTVBMSUZJRUQgUkVBRC9XUklURSAqLw0KKw0KKy8qIFRoZXNlIGFyZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgZm9yIGhhcmR3YXJlIHNwZWNpZmljIFBORyBmaWx0ZXINCisgKiBvcHRpbWl6YXRpb25zOyBsaXN0IHRoZXNlIGhlcmUgdGhlbiBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIG9uZSBhdCBjb21waWxlDQorICogdGltZSB1c2luZyB0aGUgbWFjcm8gUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TLiAgSWYgdGhlIG1hY3JvIGlzIG5vdCBkZWZpbmVkDQorICogdGhlIGdlbmVyaWMgY29kZSBpcyB1c2VkLg0KKyAqLw0KKyNpZmRlZiBQTkdfRklMVEVSX09QVElNSVpBVElPTlMNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TLCAocG5nX3N0cnVjdHAgcG5nX3B0ciwNCisgICB1bnNpZ25lZCBpbnQgYnBwKSwgUE5HX0VNUFRZKTsNCisgICAvKiBKdXN0IGRlY2xhcmUgdGhlIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCAqLw0KKyNlbHNlDQorICAgLyogTGlzdCAqYWxsKiB0aGUgcG9zc2libGUgb3B0aW1pemF0aW9ucyBoZXJlIC0gdGhpcyBicmFuY2ggaXMgcmVxdWlyZWQgaWYNCisgICAgKiB0aGUgYnVpbGRlciBvZiBsaWJwbmcgcGFzc2VzIHRoZSBkZWZpbml0aW9uIG9mIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyBpbg0KKyAgICAqIENGTEFHUyBpbiBwbGFjZSBvZiBDUFBGTEFHUyAqYW5kKiB1c2VzIHN5bWJvbCBwcmVmaXhpbmcuDQorICAgICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQsIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnNfbmVvbiwNCisgICAocG5nX3N0cnVjdHAgcG5nX3B0ciwgdW5zaWduZWQgaW50IGJwcCksIFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeICovDQorDQorI2luY2x1ZGUgInBuZ2RlYnVnLmgiDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiBQTkdfVkVSU0lPTl9JTkZPX09OTFkgKi8NCisjZW5kaWYgLyogUE5HUFJJVl9IICovDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2xwbmdfdjE2My9wbmdzdHJ1Y3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5nc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5NDcwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9scG5nX3YxNjMvcG5nc3RydWN0LmgKQEAgLTAsMCArMSw0ODkgQEAKKw0KKy8qIHBuZ3N0cnVjdC5oIC0gaGVhZGVyIGZpbGUgZm9yIFBORyByZWZlcmVuY2UgbGlicmFyeQ0KKyAqDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMSBbTWFyY2ggMjgsIDIwMTNdDQorICoNCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXINCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaA0KKyAqLw0KKw0KKy8qIFRoZSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gdG8gcmVhZCBhbmQgd3JpdGUgUE5HIGZpbGVzLg0KKyAqIFRoZSBvbmx5IHBlb3BsZSB3aG8gbmVlZCB0byBjYXJlIGFib3V0IHdoYXQgaXMgaW5zaWRlIG9mIHRoaXMgYXJlIHRoZQ0KKyAqIHBlb3BsZSB3aG8gd2lsbCBiZSBtb2RpZnlpbmcgdGhlIGxpYnJhcnkgZm9yIHRoZWlyIG93biBzcGVjaWFsIG5lZWRzLg0KKyAqIEl0IHNob3VsZCBOT1QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24uDQorICovDQorDQorI2lmbmRlZiBQTkdTVFJVQ1RfSA0KKyNkZWZpbmUgUE5HU1RSVUNUX0gNCisvKiB6bGliLmggZGVmaW5lcyB0aGUgc3RydWN0dXJlIHpfc3RyZWFtLCBhbiBpbnN0YW5jZSBvZiB3aGljaCBpcyBpbmNsdWRlZA0KKyAqIGluIHRoaXMgc3RydWN0dXJlIGFuZCBpcyByZXF1aXJlZCBmb3IgZGVjb21wcmVzc2luZyB0aGUgTFogY29tcHJlc3NlZA0KKyAqIGRhdGEgaW4gUE5HIGZpbGVzLg0KKyAqLw0KKyNpZm5kZWYgWkxJQl9DT05TVA0KKyAgIC8qIFdlIG11c3QgZW5zdXJlIHRoYXQgemxpYiB1c2VzICdjb25zdCcgaW4gZGVjbGFyYXRpb25zLiAqLw0KKyMgIGRlZmluZSBaTElCX0NPTlNUDQorI2VuZGlmDQorI2luY2x1ZGUgIi4uLy4uL2Z4X3psaWIvaW5jbHVkZS9meF96bGliLmgiDQorI2lmZGVmIGNvbnN0DQorICAgLyogemxpYi5oIHNvbWV0aW1lcyAjZGVmaW5lcyBjb25zdCB0byBub3RoaW5nLCB1bmRvIHRoaXMuICovDQorIyAgdW5kZWYgY29uc3QNCisjZW5kaWYNCisNCisvKiB6bGliLmggaGFzIG1lZGlvY3JlIHpfY29uc3QgdXNlIGJlZm9yZSAxLjIuNiwgdGhpcyBzdHVmZiBpcyBmb3IgY29tcGF0aWJpbGl0eQ0KKyAqIHdpdGggb2xkZXIgYnVpbGRzLg0KKyAqLw0KKyNpZiBaTElCX1ZFUk5VTSA8IDB4MTI2MA0KKyMgIGRlZmluZSBQTkdaX01TR19DQVNUKHMpIHBuZ19jb25zdGNhc3QoY2hhcioscykNCisjICBkZWZpbmUgUE5HWl9JTlBVVF9DQVNUKGIpIHBuZ19jb25zdGNhc3QocG5nX2J5dGVwLGIpDQorI2Vsc2UNCisjICBkZWZpbmUgUE5HWl9NU0dfQ0FTVChzKSAocykNCisjICBkZWZpbmUgUE5HWl9JTlBVVF9DQVNUKGIpIChiKQ0KKyNlbmRpZg0KKw0KKy8qIHpsaWIuaCBkZWNsYXJlcyBhIG1hZ2ljIHR5cGUgJ3VJbnQnIHRoYXQgbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHpsaWINCisgKiBjYW4gaGFuZGxlIGF0IG9uY2UuICBUaGlzIHR5cGUgbmVlZCBiZSBubyBsYXJnZXIgdGhhbiAxNiBiaXRzIChzbyBtYXhpbXVtIG9mDQorICogNjU1MzUpLCB0aGlzIGRlZmluZSBhbGxvd3MgdXMgdG8gZGlzY292ZXIgaG93IGJpZyBpdCBpcywgYnV0IGxpbWl0ZWQgYnkgdGhlDQorICogbWF4aW11dW0gZm9yIHBuZ19zaXplX3QuICBUaGUgdmFsdWUgY2FuIGJlIG92ZXJyaWRlbiBpbiBhIGxpYnJhcnkgYnVpbGQNCisgKiAocG5ndXNyLmgsIG9yIHNldCBpdCBpbiBDUFBGTEFHUykgYW5kIGl0IHdvcmtzIHRvIHNldCBpdCB0byBhIGNvbnNpZGVyYWJseQ0KKyAqIGxvd2VyIHZhbHVlIChlLmcuIDI1NSB3b3JrcykuICBBIGxvd2VyIHZhbHVlIG1heSBoZWxwIG1lbW9yeSB1c2FnZSAoc2xpZ2h0bHkpDQorICogYW5kIG1heSBldmVuIGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gc29tZSBzeXN0ZW1zIChhbmQgZGVncmFkZSBpdCBvbiBvdGhlcnMuKQ0KKyAqLw0KKyNpZm5kZWYgWkxJQl9JT19NQVgNCisjICBkZWZpbmUgWkxJQl9JT19NQVggKCh1SW50KS0xKQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorLyogVGhlIHR5cGUgb2YgYSBjb21wcmVzc2lvbiBidWZmZXIgbGlzdCB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlLiAqLw0KK3R5cGVkZWYgc3RydWN0IHBuZ19jb21wcmVzc2lvbl9idWZmZXINCit7DQorICAgc3RydWN0IHBuZ19jb21wcmVzc2lvbl9idWZmZXIgKm5leHQ7DQorICAgcG5nX2J5dGUgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxXTsgLyogYWN0dWFsbHkgemJ1Zl9zaXplICovDQorfSBwbmdfY29tcHJlc3Npb25fYnVmZmVyLCAqcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnA7DQorDQorI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fQlVGRkVSX1NJWkUocHApXA0KKyAgIChvZmZzZXRvZihwbmdfY29tcHJlc3Npb25fYnVmZmVyLCBvdXRwdXQpICsgKHBwKS0+emJ1ZmZlcl9zaXplKQ0KKyNlbmRpZg0KKw0KKy8qIENvbG9yc3BhY2Ugc3VwcG9ydDsgc3RydWN0dXJlcyB1c2VkIGluIHBuZ19zdHJ1Y3QsIHBuZ19pbmZvIGFuZCBpbiBpbnRlcm5hbA0KKyAqIGZ1bmN0aW9ucyB0byBob2xkIGFuZCBjb21tdW5pY2F0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sb3Igc3BhY2UuDQorICoNCisgKiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgYXBwbGljYXRpb24gd2lsbCBwZXJmb3JtDQorICogY29sb3JzcGFjZSBjb3JyZWN0aW9ucywgb3RoZXJ3aXNlIGFsbCB0aGUgY29sb3JzcGFjZSBpbmZvcm1hdGlvbiBjYW4gYmUNCisgKiBza2lwcGVkIGFuZCB0aGUgc2l6ZSBvZiBsaWJwbmcgY2FuIGJlIHJlZHVjZWQgKHNpZ25pZmljYW50bHkpIGJ5IGNvbXBpbGluZw0KKyAqIG91dCB0aGUgY29sb3JzcGFjZSBzdXBwb3J0Lg0KKyAqLw0KKyNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCisvKiBUaGUgY2hyb21hdGljaXRpZXMgb2YgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29sb3JhbnRzIGFuZCB0aGUgY2hyb21hdGljaXR5DQorICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgd2hpdGUgcG9pbnQgKGkuZS4gb2YgcmdiKDEuMCwxLjAsMS4wKSkuDQorICovDQordHlwZWRlZiBzdHJ1Y3QgcG5nX3h5DQorew0KKyAgIHBuZ19maXhlZF9wb2ludCByZWR4LCByZWR5Ow0KKyAgIHBuZ19maXhlZF9wb2ludCBncmVlbngsIGdyZWVueTsNCisgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZXgsIGJsdWV5Ow0KKyAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZXgsIHdoaXRleTsNCit9IHBuZ194eTsNCisNCisvKiBUaGUgc2FtZSBkYXRhIGFzIGFib3ZlIGJ1dCBlbmNvZGVkIGFzIENJRSBYWVogdmFsdWVzLiAgV2hlbiB0aGlzIGRhdGEgY29tZXMNCisgKiBmcm9tIGNocm9tYXRpY2l0aWVzIHRoZSBzdW0gb2YgdGhlIFkgdmFsdWVzIGlzIGFzc3VtZWQgdG8gYmUgMS4wDQorICovDQordHlwZWRlZiBzdHJ1Y3QgcG5nX1hZWg0KK3sNCisgICBwbmdfZml4ZWRfcG9pbnQgcmVkX1gsIHJlZF9ZLCByZWRfWjsNCisgICBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5fWCwgZ3JlZW5fWSwgZ3JlZW5fWjsNCisgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZV9YLCBibHVlX1ksIGJsdWVfWjsNCit9IHBuZ19YWVo7DQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgKi8NCisNCisjaWYgZGVmaW5lZChQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX0dBTU1BX1NVUFBPUlRFRCkNCisvKiBBIGNvbG9yc3BhY2UgaXMgYWxsIHRoZSBhYm92ZSBwbHVzLCBwb3RlbnRpYWxseSwgcHJvZmlsZSBpbmZvcm1hdGlvbiwNCisgKiBob3dldmVyIGF0IHByZXNlbnQgbGlicG5nIGRvZXMgbm90IHVzZSB0aGUgcHJvZmlsZSBpbnRlcm5hbGx5IHNvIGl0IGlzIG9ubHkNCisgKiBzdG9yZWQgaW4gdGhlIHBuZ19pbmZvIHN0cnVjdCAoaWYgaUNDUCBpcyBzdXBwb3J0ZWQuKSAgVGhlIHJlbmRlcmluZyBpbnRlbnQNCisgKiBpcyByZXRhaW5lZCBoZXJlIGFuZCBpcyBjaGVja2VkLg0KKyAqDQorICogVGhlIGZpbGUgZ2FtbWEgZW5jb2RpbmcgaW5mb3JtYXRpb24gaXMgYWxzbyBzdG9yZWQgaGVyZSBhbmQgZ2FtbWEgY29ycmVjdGlvbg0KKyAqIGlzIGRvbmUgYnkgbGlicG5nLCB3aGVyZWFzIGNvbG9yIGNvcnJlY3Rpb24gbXVzdCBjdXJyZW50bHkgYmUgZG9uZSBieSB0aGUNCisgKiBhcHBsaWNhdGlvbi4NCisgKi8NCit0eXBlZGVmIHN0cnVjdCBwbmdfY29sb3JzcGFjZQ0KK3sNCisjaWZkZWYgUE5HX0dBTU1BX1NVUFBPUlRFRA0KKyAgIHBuZ19maXhlZF9wb2ludCBnYW1tYTsgICAgICAgIC8qIEZpbGUgZ2FtbWEgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVEDQorICAgcG5nX3h5ICAgICAgZW5kX3BvaW50c194eTsgICAgLyogRW5kIHBvaW50cyBhcyBjaHJvbWF0aWNpdGllcyAqLw0KKyAgIHBuZ19YWVogICAgIGVuZF9wb2ludHNfWFlaOyAgIC8qIEVuZCBwb2ludHMgYXMgQ0lFIFhZWiBjb2xvcmFudCB2YWx1ZXMgKi8NCisgICBwbmdfdWludF8xNiByZW5kZXJpbmdfaW50ZW50OyAvKiBSZW5kZXJpbmcgaW50ZW50IG9mIGEgcHJvZmlsZSAqLw0KKyNlbmRpZg0KKw0KKyAgIC8qIEZsYWdzIGFyZSBhbHdheXMgZGVmaW5lZCB0byBzaW1wbGlmeSB0aGUgY29kZS4gKi8NCisgICBwbmdfdWludF8xNiBmbGFnczsgICAgICAgICAgICAvKiBBcyBkZWZpbmVkIGJlbG93ICovDQorfSBwbmdfY29sb3JzcGFjZSwgKiBQTkdfUkVTVFJJQ1QgcG5nX2NvbG9yc3BhY2VycDsNCisNCit0eXBlZGVmIGNvbnN0IHBuZ19jb2xvcnNwYWNlICogUE5HX1JFU1RSSUNUIHBuZ19jb25zdF9jb2xvcnNwYWNlcnA7DQorDQorLyogR2VuZXJhbCBmbGFncyBmb3IgdGhlICdmbGFncycgZmllbGQgKi8NCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEgICAgICAgICAgIDB4MDAwMQ0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMgICAgICAgMHgwMDAyDQorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9IQVZFX0lOVEVOVCAgICAgICAgICAweDAwMDQNCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQSAgICAgICAgICAgIDB4MDAwOA0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfRlJPTV9jSFJNICAgICAgICAgICAgMHgwMDEwDQorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9GUk9NX3NSR0IgICAgICAgICAgICAweDAwMjANCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0VORFBPSU5UU19NQVRDSF9zUkdCIDB4MDA0MA0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfTUFUQ0hFU19zUkdCICAgICAgICAgMHgwMDgwIC8qIGV4YWN0IG1hdGNoIG9uIHByb2ZpbGUgKi8NCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQgICAgICAgICAgICAgIDB4ODAwMA0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfQ0FOQ0VMKGZsYWdzKSAgICAgICAgKDB4ZmZmZiBeIChmbGFncykpDQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgfHwgR0FNTUEgKi8NCisNCitzdHJ1Y3QgcG5nX3N0cnVjdF9kZWYNCit7DQorI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorICAgam1wX2J1ZiBqbXBfYnVmX2xvY2FsOyAgICAgLyogTmV3IG5hbWUgaW4gMS42LjAgZm9yIGptcF9idWYgaW4gcG5nX3N0cnVjdCAqLw0KKyAgIHBuZ19sb25nam1wX3B0ciBsb25nam1wX2ZuOy8qIHNldGptcCBub24tbG9jYWwgZ290byBmdW5jdGlvbi4gKi8NCisgICBqbXBfYnVmICpqbXBfYnVmX3B0cjsgICAgICAvKiBwYXNzZWQgdG8gbG9uZ2ptcF9mbiAqLw0KKyAgIHNpemVfdCBqbXBfYnVmX3NpemU7ICAgICAgIC8qIHNpemUgb2YgdGhlIGFib3ZlLCBpZiBhbGxvY2F0ZWQgKi8NCisjZW5kaWYNCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuOyAgICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgZXJyb3JzIGFuZCBhYm9ydGluZyAqLw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuOyAgLyogZnVuY3Rpb24gZm9yIHByaW50aW5nIHdhcm5pbmdzICovDQorI2VuZGlmDQorICAgcG5nX3ZvaWRwIGVycm9yX3B0cjsgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yIGVycm9yIGZ1bmN0aW9ucyAqLw0KKyAgIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbjsgIC8qIGZ1bmN0aW9uIGZvciB3cml0aW5nIG91dHB1dCBkYXRhICovDQorICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm47ICAgLyogZnVuY3Rpb24gZm9yIHJlYWRpbmcgaW5wdXQgZGF0YSAqLw0KKyAgIHBuZ192b2lkcCBpb19wdHI7ICAgICAgICAgIC8qIHB0ciB0byBhcHBsaWNhdGlvbiBzdHJ1Y3QgZm9yIEkvTyBmdW5jdGlvbnMgKi8NCisNCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEDQorICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuOyAvKiB1c2VyIHJlYWQgdHJhbnNmb3JtICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQNCisgICBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuOyAvKiB1c2VyIHdyaXRlIHRyYW5zZm9ybSAqLw0KKyNlbmRpZg0KKw0KKy8qIFRoZXNlIHdlcmUgYWRkZWQgaW4gbGlicG5nLTEuMC4yICovDQorI2lmZGVmIFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVEDQorI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkNCisgICBwbmdfdm9pZHAgdXNlcl90cmFuc2Zvcm1fcHRyOyAvKiB1c2VyIHN1cHBsaWVkIHN0cnVjdCBmb3IgdXNlciB0cmFuc2Zvcm0gKi8NCisgICBwbmdfYnl0ZSB1c2VyX3RyYW5zZm9ybV9kZXB0aDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovDQorICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7IC8qIGNoYW5uZWxzIGluIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovDQorI2VuZGlmDQorI2VuZGlmDQorDQorICAgcG5nX3VpbnRfMzIgbW9kZTsgICAgICAgICAgLyogdGVsbHMgdXMgd2hlcmUgd2UgYXJlIGluIHRoZSBQTkcgZmlsZSAqLw0KKyAgIHBuZ191aW50XzMyIGZsYWdzOyAgICAgICAgIC8qIGZsYWdzIGluZGljYXRpbmcgdmFyaW91cyB0aGluZ3MgdG8gbGlicG5nICovDQorICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zOyAvKiB3aGljaCB0cmFuc2Zvcm1hdGlvbnMgdG8gcGVyZm9ybSAqLw0KKw0KKyAgIHBuZ191aW50XzMyIHpvd25lcjsgICAgICAgIC8qIElEIChjaHVuayB0eXBlKSBvZiB6c3RyZWFtIG93bmVyLCAwIGlmIG5vbmUgKi8NCisgICB6X3N0cmVhbSAgICB6c3RyZWFtOyAgICAgICAvKiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZSAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgemJ1ZmZlcl9saXN0OyAvKiBDcmVhdGVkIG9uIGRlbWFuZCBkdXJpbmcgd3JpdGUgKi8NCisgICB1SW50ICAgICAgICAgICAgICAgICAgICB6YnVmZmVyX3NpemU7IC8qIHNpemUgb2YgdGhlIGFjdHVhbCBidWZmZXIgKi8NCisNCisgICBpbnQgemxpYl9sZXZlbDsgICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIGxldmVsICovDQorICAgaW50IHpsaWJfbWV0aG9kOyAgICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZXRob2QgKi8NCisgICBpbnQgemxpYl93aW5kb3dfYml0czsgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHdpbmRvdyBiaXRzICovDQorICAgaW50IHpsaWJfbWVtX2xldmVsOyAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZW1vcnkgbGV2ZWwgKi8NCisgICBpbnQgemxpYl9zdHJhdGVneTsgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovDQorI2VuZGlmDQorLyogQWRkZWQgYXQgbGlicG5nIDEuNS40ICovDQorI2lmZGVmIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQNCisgICBpbnQgemxpYl90ZXh0X2xldmVsOyAgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8NCisgICBpbnQgemxpYl90ZXh0X21ldGhvZDsgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kICovDQorICAgaW50IHpsaWJfdGV4dF93aW5kb3dfYml0czsgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHdpbmRvdyBiaXRzICovDQorICAgaW50IHpsaWJfdGV4dF9tZW1fbGV2ZWw7ICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1lbW9yeSBsZXZlbCAqLw0KKyAgIGludCB6bGliX3RleHRfc3RyYXRlZ3k7ICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLw0KKyNlbmRpZg0KKy8qIEVuZCBvZiBtYXRlcmlhbCBhZGRlZCBhdCBsaWJwbmcgMS41LjQgKi8NCisvKiBBZGRlZCBhdCBsaWJwbmcgMS42LjAgKi8NCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKyAgIGludCB6bGliX3NldF9sZXZlbDsgICAgICAgIC8qIEFjdHVhbCB2YWx1ZXMgc2V0IGludG8gdGhlIHpzdHJlYW0gb24gd3JpdGUgKi8NCisgICBpbnQgemxpYl9zZXRfbWV0aG9kOw0KKyAgIGludCB6bGliX3NldF93aW5kb3dfYml0czsNCisgICBpbnQgemxpYl9zZXRfbWVtX2xldmVsOw0KKyAgIGludCB6bGliX3NldF9zdHJhdGVneTsNCisjZW5kaWYNCisNCisgICBwbmdfdWludF8zMiB3aWR0aDsgICAgICAgICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8NCisgICBwbmdfdWludF8zMiBoZWlnaHQ7ICAgICAgICAvKiBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzICovDQorICAgcG5nX3VpbnRfMzIgbnVtX3Jvd3M7ICAgICAgLyogbnVtYmVyIG9mIHJvd3MgaW4gY3VycmVudCBwYXNzICovDQorICAgcG5nX3VpbnRfMzIgdXNyX3dpZHRoOyAgICAgLyogd2lkdGggb2Ygcm93IGF0IHN0YXJ0IG9mIHdyaXRlICovDQorICAgcG5nX3NpemVfdCByb3dieXRlczsgICAgICAgLyogc2l6ZSBvZiByb3cgaW4gYnl0ZXMgKi8NCisgICBwbmdfdWludF8zMiBpd2lkdGg7ICAgICAgICAvKiB3aWR0aCBvZiBjdXJyZW50IGludGVybGFjZWQgcm93IGluIHBpeGVscyAqLw0KKyAgIHBuZ191aW50XzMyIHJvd19udW1iZXI7ICAgIC8qIGN1cnJlbnQgcm93IGluIGludGVybGFjZSBwYXNzICovDQorICAgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZTsgICAgLyogUE5HX0NIVU5LKCkgaWQgb2YgY3VycmVudCBjaHVuayAqLw0KKyAgIHBuZ19ieXRlcCBwcmV2X3JvdzsgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlIHByZXZpb3VzICh1bmZpbHRlcmVkKSByb3cuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBhIHBvaW50ZXIgaW50byBiaWdfcHJldl9yb3cNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICBwbmdfYnl0ZXAgcm93X2J1ZjsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBjdXJyZW50ICh1bmZpbHRlcmVkKSByb3cuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBhIHBvaW50ZXIgaW50byBiaWdfcm93X2J1Zg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgcG5nX2J5dGVwIHN1Yl9yb3c7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInN1YiIgcm93IHdoZW4gZmlsdGVyaW5nICovDQorICAgcG5nX2J5dGVwIHVwX3JvdzsgICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInVwIiByb3cgd2hlbiBmaWx0ZXJpbmcgKi8NCisgICBwbmdfYnl0ZXAgYXZnX3JvdzsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAiYXZnIiByb3cgd2hlbiBmaWx0ZXJpbmcgKi8NCisgICBwbmdfYnl0ZXAgcGFldGhfcm93OyAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAiUGFldGgiIHJvdyB3aGVuIGZpbHRlcmluZyAqLw0KKyNlbmRpZg0KKyAgIHBuZ19zaXplX3QgaW5mb19yb3dieXRlczsgIC8qIEFkZGVkIGluIDEuNS40OiBjYWNoZSBvZiB1cGRhdGVkIHJvdyBieXRlcyAqLw0KKw0KKyAgIHBuZ191aW50XzMyIGlkYXRfc2l6ZTsgICAgIC8qIGN1cnJlbnQgSURBVCBzaXplIGZvciByZWFkICovDQorICAgcG5nX3VpbnRfMzIgY3JjOyAgICAgICAgICAgLyogY3VycmVudCBjaHVuayBDUkMgdmFsdWUgKi8NCisgICBwbmdfY29sb3JwIHBhbGV0dGU7ICAgICAgICAvKiBwYWxldHRlIGZyb20gdGhlIGlucHV0IGZpbGUgKi8NCisgICBwbmdfdWludF8xNiBudW1fcGFsZXR0ZTsgICAvKiBudW1iZXIgb2YgY29sb3IgZW50cmllcyBpbiBwYWxldHRlICovDQorDQorLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLw0KKyNpZmRlZiBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorICAgaW50IG51bV9wYWxldHRlX21heDsgICAgICAgLyogbWF4aW11bSBwYWxldHRlIGluZGV4IGZvdW5kIGluIElEQVQgKi8NCisjZW5kaWYNCisNCisgICBwbmdfdWludF8xNiBudW1fdHJhbnM7ICAgICAvKiBudW1iZXIgb2YgdHJhbnNwYXJlbmN5IHZhbHVlcyAqLw0KKyAgIHBuZ19ieXRlIGNvbXByZXNzaW9uOyAgICAgIC8qIGZpbGUgY29tcHJlc3Npb24gdHlwZSAoYWx3YXlzIDApICovDQorICAgcG5nX2J5dGUgZmlsdGVyOyAgICAgICAgICAgLyogZmlsZSBmaWx0ZXIgdHlwZSAoYWx3YXlzIDApICovDQorICAgcG5nX2J5dGUgaW50ZXJsYWNlZDsgICAgICAgLyogUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfSU5URVJMQUNFX0FEQU03ICovDQorICAgcG5nX2J5dGUgcGFzczsgICAgICAgICAgICAgLyogY3VycmVudCBpbnRlcmxhY2UgcGFzcyAoMCAtIDYpICovDQorICAgcG5nX2J5dGUgZG9fZmlsdGVyOyAgICAgICAgLyogcm93IGZpbHRlciBmbGFncyAoc2VlIFBOR19GSUxURVJfIGJlbG93ICkgKi8NCisgICBwbmdfYnl0ZSBjb2xvcl90eXBlOyAgICAgICAvKiBjb2xvciB0eXBlIG9mIGZpbGUgKi8NCisgICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgICAvKiBiaXQgZGVwdGggb2YgZmlsZSAqLw0KKyAgIHBuZ19ieXRlIHVzcl9iaXRfZGVwdGg7ICAgIC8qIGJpdCBkZXB0aCBvZiB1c2VycyByb3c6IHdyaXRlIG9ubHkgKi8NCisgICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgKi8NCisgICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gZmlsZSAqLw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgcG5nX2J5dGUgdXNyX2NoYW5uZWxzOyAgICAgLyogY2hhbm5lbHMgYXQgc3RhcnQgb2Ygd3JpdGU6IHdyaXRlIG9ubHkgKi8NCisjZW5kaWYNCisgICBwbmdfYnl0ZSBzaWdfYnl0ZXM7ICAgICAgICAvKiBtYWdpYyBieXRlcyByZWFkL3dyaXR0ZW4gZnJvbSBzdGFydCBvZiBmaWxlICovDQorICAgcG5nX2J5dGUgbWF4aW11bV9waXhlbF9kZXB0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBkZXB0aCB1c2VkIGZvciB0aGUgcm93IGJ1ZmZlcnMgKi8NCisgICBwbmdfYnl0ZSB0cmFuc2Zvcm1lZF9waXhlbF9kZXB0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBkZXB0aCBhZnRlciByZWFkL3dyaXRlIHRyYW5zZm9ybXMgKi8NCisjaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQ0KKyAgIHBuZ191aW50XzE2IGZpbGxlcjsgICAgICAgICAgIC8qIGZpbGxlciBieXRlcyBmb3IgcGl4ZWwgZXhwYW5zaW9uICovDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX2JLR0RfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQ0KKyAgIHBuZ19ieXRlIGJhY2tncm91bmRfZ2FtbWFfdHlwZTsNCisgICBwbmdfZml4ZWRfcG9pbnQgYmFja2dyb3VuZF9nYW1tYTsNCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZDsgICAvKiBiYWNrZ3JvdW5kIGNvbG9yIGluIHNjcmVlbiBnYW1tYSBzcGFjZSAqLw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZF8xOyAvKiBiYWNrZ3JvdW5kIG5vcm1hbGl6ZWQgdG8gZ2FtbWEgMS4wICovDQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19iS0dEX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEDQorICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm47IC8qIEZ1bmN0aW9uIGZvciBmbHVzaGluZyBvdXRwdXQgKi8NCisgICBwbmdfdWludF8zMiBmbHVzaF9kaXN0OyAgICAvKiBob3cgbWFueSByb3dzIGFwYXJ0IHRvIGZsdXNoLCAwIC0gbm8gZmx1c2ggKi8NCisgICBwbmdfdWludF8zMiBmbHVzaF9yb3dzOyAgICAvKiBudW1iZXIgb2Ygcm93cyB3cml0dGVuIHNpbmNlIGxhc3QgZmx1c2ggKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorICAgaW50IGdhbW1hX3NoaWZ0OyAgICAgIC8qIG51bWJlciBvZiAiaW5zaWduaWZpY2FudCIgYml0cyBpbiAxNi1iaXQgZ2FtbWEgKi8NCisgICBwbmdfZml4ZWRfcG9pbnQgc2NyZWVuX2dhbW1hOyAvKiBzY3JlZW4gZ2FtbWEgdmFsdWUgKGRpc3BsYXlfZXhwb25lbnQpICovDQorDQorICAgcG5nX2J5dGVwIGdhbW1hX3RhYmxlOyAgICAgLyogZ2FtbWEgdGFibGUgZm9yIDgtYml0IGRlcHRoIGZpbGVzICovDQorICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZTsgLyogZ2FtbWEgdGFibGUgZm9yIDE2LWJpdCBkZXB0aCBmaWxlcyAqLw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcDQorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQ0KKyAgIHBuZ19ieXRlcCBnYW1tYV9mcm9tXzE7ICAgIC8qIGNvbnZlcnRzIGZyb20gMS4wIHRvIHNjcmVlbiAqLw0KKyAgIHBuZ19ieXRlcCBnYW1tYV90b18xOyAgICAgIC8qIGNvbnZlcnRzIGZyb20gZmlsZSB0byAxLjAgKi8NCisgICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMTsgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovDQorICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90b18xOyAvKiBjb252ZXJ0cyBmcm9tIGZpbGUgdG8gMS4wICovDQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgfHwgUkdCX1RPX0dSQVkgKi8NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NCSVRfU1VQUE9SVEVEKQ0KKyAgIHBuZ19jb2xvcl84IHNpZ19iaXQ7ICAgICAgIC8qIHNpZ25pZmljYW50IGJpdHMgaW4gZWFjaCBhdmFpbGFibGUgY2hhbm5lbCAqLw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQ0KKyAgIHBuZ19jb2xvcl84IHNoaWZ0OyAgICAgICAgIC8qIHNoaWZ0IGZvciBzaWduaWZpY2FudCBiaXQgdHJhbmZvcm1hdGlvbiAqLw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgXA0KKyB8fCBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpDQorICAgcG5nX2J5dGVwIHRyYW5zX2FscGhhOyAgICAgICAgICAgLyogYWxwaGEgdmFsdWVzIGZvciBwYWxldHRlZCBmaWxlcyAqLw0KKyAgIHBuZ19jb2xvcl8xNiB0cmFuc19jb2xvcjsgIC8qIHRyYW5zcGFyZW50IGNvbG9yIGZvciBub24tcGFsZXR0ZWQgZmlsZXMgKi8NCisjZW5kaWYNCisNCisgICBwbmdfcmVhZF9zdGF0dXNfcHRyIHJlYWRfcm93X2ZuOyAgIC8qIGNhbGxlZCBhZnRlciBlYWNoIHJvdyBpcyBkZWNvZGVkICovDQorICAgcG5nX3dyaXRlX3N0YXR1c19wdHIgd3JpdGVfcm93X2ZuOyAvKiBjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaXMgZW5jb2RlZCAqLw0KKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQNCisgICBwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIgaW5mb19mbjsgLyogY2FsbGVkIGFmdGVyIGhlYWRlciBkYXRhIGZ1bGx5IHJlYWQgKi8NCisgICBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm47ICAgLyogY2FsbGVkIGFmdGVyIGEgcHJvZy4gcm93IGlzIGRlY29kZWQgKi8NCisgICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm47ICAgLyogY2FsbGVkIGFmdGVyIGltYWdlIGlzIGNvbXBsZXRlICovDQorICAgcG5nX2J5dGVwIHNhdmVfYnVmZmVyX3B0cjsgICAgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gc2F2ZV9idWZmZXIgKi8NCisgICBwbmdfYnl0ZXAgc2F2ZV9idWZmZXI7ICAgICAgICAgICAgLyogYnVmZmVyIGZvciBwcmV2aW91c2x5IHJlYWQgZGF0YSAqLw0KKyAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlcl9wdHI7ICAgICAvKiBjdXJyZW50IGxvY2F0aW9uIGluIGN1cnJlbnRfYnVmZmVyICovDQorICAgcG5nX2J5dGVwIGN1cnJlbnRfYnVmZmVyOyAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcmVjZW50bHkgdXNlZCBkYXRhICovDQorICAgcG5nX3VpbnRfMzIgcHVzaF9sZW5ndGg7ICAgICAgICAgIC8qIHNpemUgb2YgY3VycmVudCBpbnB1dCBjaHVuayAqLw0KKyAgIHBuZ191aW50XzMyIHNraXBfbGVuZ3RoOyAgICAgICAgICAvKiBieXRlcyB0byBza2lwIGluIGlucHV0IGRhdGEgKi8NCisgICBwbmdfc2l6ZV90IHNhdmVfYnVmZmVyX3NpemU7ICAgICAgLyogYW1vdW50IG9mIGRhdGEgbm93IGluIHNhdmVfYnVmZmVyICovDQorICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9tYXg7ICAgICAgIC8qIHRvdGFsIHNpemUgb2Ygc2F2ZV9idWZmZXIgKi8NCisgICBwbmdfc2l6ZV90IGJ1ZmZlcl9zaXplOyAgICAgICAgICAgLyogdG90YWwgYW1vdW50IG9mIGF2YWlsYWJsZSBpbnB1dCBkYXRhICovDQorICAgcG5nX3NpemVfdCBjdXJyZW50X2J1ZmZlcl9zaXplOyAgIC8qIGFtb3VudCBvZiBkYXRhIG5vdyBpbiBjdXJyZW50X2J1ZmZlciAqLw0KKyAgIGludCBwcm9jZXNzX21vZGU7ICAgICAgICAgICAgICAgICAvKiB3aGF0IHB1c2ggbGlicmFyeSBpcyBjdXJyZW50bHkgZG9pbmcgKi8NCisgICBpbnQgY3VyX3BhbGV0dGU7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBwdXNoIGxpYnJhcnkgcGFsZXR0ZSBpbmRleCAqLw0KKw0KKyNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8NCisNCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfV2luZG93cykgJiYgIWRlZmluZWQoX19GTEFUX18pDQorLyogRm9yIHRoZSBCb3JsYW5kIHNwZWNpYWwgNjRLIHNlZ21lbnQgaGFuZGxlciAqLw0KKyAgIHBuZ19ieXRlcHAgb2Zmc2V0X3RhYmxlX3B0cjsNCisgICBwbmdfYnl0ZXAgb2Zmc2V0X3RhYmxlOw0KKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9udW1iZXI7DQorICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX2NvdW50Ow0KKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9jb3VudF9mcmVlOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQNCisgICBwbmdfYnl0ZXAgcGFsZXR0ZV9sb29rdXA7IC8qIGxvb2t1cCB0YWJsZSBmb3IgcXVhbnRpemluZyAqLw0KKyAgIHBuZ19ieXRlcCBxdWFudGl6ZV9pbmRleDsgLyogaW5kZXggdHJhbnNsYXRpb24gZm9yIHBhbGV0dGUgZmlsZXMgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQNCisgICBwbmdfYnl0ZSBoZXVyaXN0aWNfbWV0aG9kOyAgICAgICAgLyogaGV1cmlzdGljIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbiAqLw0KKyAgIHBuZ19ieXRlIG51bV9wcmV2X2ZpbHRlcnM7ICAgICAgICAvKiBudW1iZXIgb2Ygd2VpZ2h0cyBmb3IgcHJldmlvdXMgcm93cyAqLw0KKyAgIHBuZ19ieXRlcCBwcmV2X2ZpbHRlcnM7ICAgICAgICAgICAvKiBmaWx0ZXIgdHlwZShzKSBvZiBwcmV2aW91cyByb3cocykgKi8NCisgICBwbmdfdWludF8xNnAgZmlsdGVyX3dlaWdodHM7ICAgICAgLyogd2VpZ2h0KHMpIGZvciBwcmV2aW91cyBsaW5lKHMpICovDQorICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfd2VpZ2h0czsgIC8qIDEvd2VpZ2h0KHMpIGZvciBwcmV2aW91cyBsaW5lKHMpICovDQorICAgcG5nX3VpbnRfMTZwIGZpbHRlcl9jb3N0czsgICAgICAgIC8qIHJlbGF0aXZlIGZpbHRlciBjYWxjdWxhdGlvbiBjb3N0ICovDQorICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfY29zdHM7ICAgIC8qIDEvcmVsYXRpdmUgZmlsdGVyIGNhbGN1bGF0aW9uIGNvc3QgKi8NCisjZW5kaWYNCisNCisgICAvKiBPcHRpb25zICovDQorI2lmZGVmIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRA0KKyAgIHBuZ19ieXRlIG9wdGlvbnM7ICAgICAgICAgICAvKiBPbi9vZmYgc3RhdGUgKHVwIHRvIDQgb3B0aW9ucykgKi8NCisjZW5kaWYNCisNCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMA0KKy8qIFRvIGRvOiByZW1vdmUgdGhpcyBmcm9tIGxpYnBuZy0xLjcgKi8NCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQNCisgICBjaGFyIHRpbWVfYnVmZmVyWzI5XTsgLyogU3RyaW5nIHRvIGhvbGQgUkZDIDExMjMgdGltZSB0ZXh0ICovDQorI2VuZGlmDQorI2VuZGlmDQorDQorLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC42ICovDQorDQorICAgcG5nX3VpbnRfMzIgZnJlZV9tZTsgICAgLyogZmxhZ3MgaXRlbXMgbGlicG5nIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nICovDQorDQorI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQNCisgICBwbmdfdm9pZHAgdXNlcl9jaHVua19wdHI7DQorI2lmZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRA0KKyAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm47IC8qIHVzZXIgcmVhZCBjaHVuayBoYW5kbGVyICovDQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgaW50ICAgICAgICAgIHVua25vd25fZGVmYXVsdDsgLyogQXMgUE5HX0hBTkRMRV8qICovDQorICAgdW5zaWduZWQgaW50IG51bV9jaHVua19saXN0OyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QgKi8NCisgICBwbmdfYnl0ZXAgICAgY2h1bmtfbGlzdDsgICAgICAvKiBMaXN0IG9mIHBuZ19ieXRlWzVdOyB0aGUgdGV4dHVhbCBjaHVuayBuYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9sbG93ZWQgYnkgYSBQTkdfSEFORExFXyogYnl0ZSAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMyAqLw0KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQNCisgICBwbmdfYnl0ZSByZ2JfdG9fZ3JheV9zdGF0dXM7DQorICAgLyogQWRkZWQgaW4gbGlicG5nIDEuNS41IHRvIHJlY29yZCBzZXR0aW5nIG9mIGNvZWZmaWNpZW50czogKi8NCisgICBwbmdfYnl0ZSByZ2JfdG9fZ3JheV9jb2VmZmljaWVudHNfc2V0Ow0KKyAgIC8qIFRoZXNlIHdlcmUgY2hhbmdlZCBmcm9tIHBuZ19ieXRlIGluIGxpYnBuZy0xLjAuNiAqLw0KKyAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X3JlZF9jb2VmZjsNCisgICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsNCisgICAvKiBkZWxldGVkIGluIDEuNS41OiByZ2JfdG9fZ3JheV9ibHVlX2NvZWZmOyAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC40IChyZW5hbWVkIGluIDEuMC45KSAqLw0KKyNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKQ0KKy8qIENoYW5nZWQgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMiBhdCB2ZXJzaW9uIDEuMi4wICovDQorICAgcG5nX3VpbnRfMzIgbW5nX2ZlYXR1cmVzX3Blcm1pdHRlZDsNCisjZW5kaWYNCisNCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuOSwgaWZkZWYnZWQgb3V0IGluIDEuMC4xMiwgZW5hYmxlZCBpbiAxLjIuMCAqLw0KKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRA0KKyAgIHBuZ19ieXRlIGZpbHRlcl90eXBlOw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjIuMCAqLw0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMiBidXQgZmlyc3QgZW5hYmxlZCBieSBkZWZhdWx0IGluIDEuMi4wICovDQorI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQNCisgICBwbmdfdm9pZHAgbWVtX3B0cjsgICAgICAgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yIG1lbSBmdW5jdGlvbnMgKi8NCisgICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm47ICAgICAgLyogZnVuY3Rpb24gZm9yIGFsbG9jYXRpbmcgbWVtb3J5ICovDQorICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm47ICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBmcmVlaW5nIG1lbW9yeSAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC4xMyBhbmQgMS4yLjAgKi8NCisgICBwbmdfYnl0ZXAgYmlnX3Jvd19idWY7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgY3VycmVudCAodW5maWx0ZXJlZCkgcm93ICovDQorDQorI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KKy8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWVtYmVycyB3ZXJlIGFkZGVkIGF0IHZlcnNpb24gMS4wLjE0IGFuZCAxLjIuNCAqLw0KKyAgIHBuZ19ieXRlcCBxdWFudGl6ZV9zb3J0OyAgICAgICAgICAvKiB3b3JraW5nIHNvcnQgYXJyYXkgKi8NCisgICBwbmdfYnl0ZXAgaW5kZXhfdG9fcGFsZXR0ZTsgICAgICAgLyogd2hlcmUgdGhlIG9yaWdpbmFsIGluZGV4IGN1cnJlbnRseSBpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcGFsZXR0ZSAqLw0KKyAgIHBuZ19ieXRlcCBwYWxldHRlX3RvX2luZGV4OyAgICAgICAvKiB3aGljaCBvcmlnaW5hbCBpbmRleCBwb2ludHMgdG8gdGhpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSBjb2xvciAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42ICovDQorICAgcG5nX2J5dGUgY29tcHJlc3Npb25fdHlwZTsNCisNCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKyAgIHBuZ191aW50XzMyIHVzZXJfd2lkdGhfbWF4Ow0KKyAgIHBuZ191aW50XzMyIHVzZXJfaGVpZ2h0X21heDsNCisNCisgICAvKiBBZGRlZCBpbiBsaWJwbmctMS40LjA6IFRvdGFsIG51bWJlciBvZiBzUExULCB0ZXh0LCBhbmQgdW5rbm93bg0KKyAgICAqIGNodW5rcyB0aGF0IGNhbiBiZSBzdG9yZWQgKDAgbWVhbnMgdW5saW1pdGVkKS4NCisgICAgKi8NCisgICBwbmdfdWludF8zMiB1c2VyX2NodW5rX2NhY2hlX21heDsNCisNCisgICAvKiBUb3RhbCBtZW1vcnkgdGhhdCBhIHpUWHQsIHNQTFQsIGlUWHQsIGlDQ1AsIG9yIHVua25vd24gY2h1bmsNCisgICAgKiBjYW4gb2NjdXB5IHdoZW4gZGVjb21wcmVzc2VkLiAgMCBtZWFucyB1bmxpbWl0ZWQuDQorICAgICovDQorICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX21hbGxvY19tYXg7DQorI2VuZGlmDQorDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjI1IGFuZCAxLjIuMTcgKi8NCisjaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHVua25vd24gY2h1bmsgdGhhdCB0aGUgbGlicmFyeSBkb2Vzbid0IHJlY29nbml6ZSwNCisgICAgKiB1c2VkIHdoaWxlIHJlYWRpbmcgdGhlIGNodW5rLg0KKyAgICAqLw0KKyAgIHBuZ191bmtub3duX2NodW5rIHVua25vd25fY2h1bms7DQorI2VuZGlmDQorDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4yLjI2ICovDQorICBwbmdfc2l6ZV90IG9sZF9iaWdfcm93X2J1Zl9zaXplOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjIuMzAgKi8NCisgIHBuZ19ieXRlcCAgICAgICAgcmVhZF9idWZmZXI7ICAgICAgLyogYnVmZmVyIGZvciByZWFkaW5nIGNodW5rIGRhdGEgKi8NCisgIHBuZ19hbGxvY19zaXplX3QgcmVhZF9idWZmZXJfc2l6ZTsgLyogY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIgKi8NCisjZW5kaWYNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisgIHVJbnQgICAgICAgICAgICAgSURBVF9yZWFkX3NpemU7ICAgLyogbGltaXQgb24gcmVhZCBidWZmZXIgc2l6ZSBmb3IgSURBVCAqLw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVEDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS40LjAgKi8NCisgICBwbmdfdWludF8zMiBpb19zdGF0ZTsNCisjZW5kaWYNCisNCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjUuNiAqLw0KKyAgIHBuZ19ieXRlcCBiaWdfcHJldl9yb3c7DQorDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS41LjcgKi8NCisgICB2b2lkICgqcmVhZF9maWx0ZXJbUE5HX0ZJTFRFUl9WQUxVRV9MQVNULTFdKShwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3Jvdyk7DQorDQorI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KKyNpZiBkZWZpbmVkKFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfR0FNTUFfU1VQUE9SVEVEKQ0KKyAgIHBuZ19jb2xvcnNwYWNlICAgY29sb3JzcGFjZTsNCisjZW5kaWYNCisjZW5kaWYNCit9Ow0KKyNlbmRpZiAvKiBQTkdTVFJVQ1RfSCAqLw0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjU4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZy5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nZXJyb3IuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTgxYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdlcnJvci5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ2Vycm9yLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdnZXQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4ZGM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nZ2V0LmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5nZ2V0LmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdtZW0uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5MjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nbWVtLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5nbWVtLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdwcmVhZC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdwcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3ByZWFkLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5ncHJlYWQuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ncmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTJiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmdyZWFkLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdyaW8uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ncmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNGE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ncmlvLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5ncmlvLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdydHJhbi5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdydHJhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzM4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3J0cmFuLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5ncnRyYW4uYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3J1dGlsLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3J1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYTM1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ncnV0aWwuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmdydXRpbC5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nc2V0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTcyMjIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdzZXQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmdzZXQuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3RyYW5zLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3RyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjNDliZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ndHJhbnMuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd0cmFucy5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd2lvLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3dpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjIxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3dpby5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3dpby5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd3JpdGUuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDM0ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmd3cml0ZS5jCkBAIC0wLDAgKzEsMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmZGVmIF9NU0NfVkVSDQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUw0KKyNlbmRpZg0KKyNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5nd3JpdGUuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3d0cmFuLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3d0cmFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwOTVkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd3RyYW4uYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd3dHJhbi5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDdmYjQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmd3dXRpbC5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3d1dGlsLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL2luY2x1ZGUvZnhfdGlmZmlvcC5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL2luY2x1ZGUvZnhfdGlmZmlvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzg5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvaW5jbHVkZS9meF90aWZmaW9wLmgKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmZmlvcC5oIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2F1eC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfYXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkNGY2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2F1eC5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9hdXguYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9jbG9zZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY2xvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ1YmQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY2xvc2UuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfY2xvc2UuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9jb2RlYy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODM2MjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29kZWMuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfY29kZWMuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9jb2xvci5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBmNmZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29sb3IuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfY29sb3IuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9jb21wcmVzcy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJmMjZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29tcHJlc3MuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfY29tcHJlc3MuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzk0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXIuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfZGlyLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZGlyaW5mby5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZGlyaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODE3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXJpbmZvLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX2RpcmluZm8uYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXJyZWFkLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXJyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1N2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2RpcnJlYWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfZGlycmVhZC5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2RpcndyaXRlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXJ3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWU3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXJ3cml0ZS5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9kaXJ3cml0ZS5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2R1bXBtb2RlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kdW1wbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlY2UzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kdW1wbW9kZS5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9kdW1wbW9kZS5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2Vycm9yLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTNlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9lcnJvci5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9lcnJvci5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2V4dGVuc2lvbi5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZXh0ZW5zaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5MjQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2V4dGVuc2lvbi5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9leHRlbnNpb24uYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9mYXgzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9mYXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkMjZkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2ZheDMuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfZmF4My5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2ZheDNzbS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZmF4M3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2MzNlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2ZheDNzbS5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9mYXgzc20uYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9mbHVzaC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZmx1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg4NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZmx1c2guYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfZmx1c2guYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9nZXRpbWFnZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZ2V0aW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWM4ZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZ2V0aW1hZ2UuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfZ2V0aW1hZ2UuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9qcGVnLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9qcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlZTUxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2pwZWcuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfanBlZy5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2x1di5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfbHV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3NjhlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2x1di5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9sdXYuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9sencuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2x6dy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjMxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9sencuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfbHp3LmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfbmV4dC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfbmV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2RmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9uZXh0LmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX25leHQuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9vanBlZy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfb2pwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQxOTExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfb2pwZWcuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfb2pwZWcuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9vcGVuLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyZmZlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX29wZW4uYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfb3Blbi5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3BhY2tiaXRzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9wYWNrYml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTkzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9wYWNrYml0cy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9wYWNrYml0cy5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3BpeGFybG9nLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9waXhhcmxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTI5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9waXhhcmxvZy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9waXhhcmxvZy5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ByZWRpY3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ByZWRpY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI0MDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfcHJlZGljdC5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl9wcmVkaWN0LmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfcHJpbnQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExNmE5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ByaW50LmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX3ByaW50LmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfcmVhZC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9yZWFkLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX3JlYWQuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9zdHJpcC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfc3RyaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQyYTRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfc3RyaXAuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfc3RyaXAuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9zd2FiLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9zd2FiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljNmIxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3N3YWIuYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfc3dhYi5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3RodW5kZXIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3RodW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGY1MjNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfdGh1bmRlci5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl90aHVuZGVyLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfdGlsZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfdGlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2Q0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl90aWxlLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX3RpbGUuYyINCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl92ZXJzaW9uLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MmUzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ZlcnNpb24uYwpAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL3RpZmZfdjQwMy90aWZfdmVyc2lvbi5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3dhcm5pbmcuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3dhcm5pbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE5MjFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfd2FybmluZy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vdGlmZl92NDAzL3RpZl93YXJuaW5nLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfd3JpdGUuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiNDNmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3dyaXRlLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX3dyaXRlLmMiDQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfemlwLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl96aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYwYTNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfemlwLmMKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi90aWZmX3Y0MDMvdGlmX3ppcC5jIg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdDQuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA4ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90NC5oCkBAIC0wLDAgKzEsMjkyIEBACisvKiAkSWQ6IHQ0LmgsdiAxLjMgMjAxMC0wMy0xMCAxODo1Njo0OCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfVDRfCisjZGVmaW5lCV9UNF8KKy8qCisgKiBDQ0lUVCBULjQgMUQgSHVmZm1hbiBydW5sZW5ndGggY29kZXMgYW5kCisgKiByZWxhdGVkIGRlZmluaXRpb25zLiAgR2l2ZW4gdGhlIHNtYWxsIHNpemVzCisgKiBvZiB0aGVzZSB0YWJsZXMgaXQgZG9lcyBub3Qgc2VlbQorICogd29ydGh3aGlsZSB0byBtYWtlIGNvZGUgJiBsZW5ndGggOCBiaXRzLgorICovCit0eXBlZGVmIHN0cnVjdCB0YWJsZWVudHJ5IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7ICAvKiBiaXQgbGVuZ3RoIG9mIGczIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb2RlOyAgICAvKiBnMyBjb2RlICovCisgICAgc2hvcnQgcnVubGVuOyAgICAgICAgICAgLyogcnVuIGxlbmd0aCBpbiBiaXRzICovCit9IHRhYmxlZW50cnk7CisKKyNkZWZpbmUgRU9MCTB4MDAxCS8qIEVPTCBjb2RlIHZhbHVlIC0gMDAwMCAwMDAwIDAwMDAgMSAqLworCisvKiBzdGF0dXMgdmFsdWVzIHJldHVybmVkIGluc3RlYWQgb2YgYSBydW4gbGVuZ3RoICovCisjZGVmaW5lIEczQ09ERV9FT0wJLTEJLyogTkI6IEFDVF9FT0wgLSBBQ1RfV1JVTlQgKi8KKyNkZWZpbmUgRzNDT0RFX0lOVkFMSUQJLTIJLyogTkI6IEFDVF9JTlZBTElEIC0gQUNUX1dSVU5UICovCisjZGVmaW5lIEczQ09ERV9FT0YJLTMJLyogZW5kIG9mIGlucHV0IGRhdGEgKi8KKyNkZWZpbmUgRzNDT0RFX0lOQ09NUAktNAkvKiBpbmNvbXBsZXRlIHJ1biBjb2RlICovCisKKy8qCisgKiBOb3RlIHRoYXQgdGhlc2UgdGFibGVzIGFyZSBvcmRlcmVkIHN1Y2ggdGhhdCB0aGUKKyAqIGluZGV4IGludG8gdGhlIHRhYmxlIGlzIGtub3duIHRvIGJlIGVpdGhlciB0aGUKKyAqIHJ1biBsZW5ndGgsIG9yIChydW4gbGVuZ3RoIC8gNjQpICsgYSBmaXhlZCBvZmZzZXQuCisgKgorICogTkI6IFRoZSBHM0NPREVfSU5WQUxJRCBlbnRyaWVzIGFyZSBvbmx5IHVzZWQKKyAqICAgICBkdXJpbmcgc3RhdGUgZ2VuZXJhdGlvbiAoc2VlIG1rZzNzdGF0ZXMuYykuCisgKi8KKyNpZmRlZiBHM0NPREVTCitjb25zdCB0YWJsZWVudHJ5IFRJRkZGYXhXaGl0ZUNvZGVzW10gPSB7CisgICAgeyA4LCAweDM1LCAwIH0sCS8qIDAwMTEgMDEwMSAqLworICAgIHsgNiwgMHg3LCAxIH0sCS8qIDAwMDEgMTEgKi8KKyAgICB7IDQsIDB4NywgMiB9LAkvKiAwMTExICovCisgICAgeyA0LCAweDgsIDMgfSwJLyogMTAwMCAqLworICAgIHsgNCwgMHhCLCA0IH0sCS8qIDEwMTEgKi8KKyAgICB7IDQsIDB4QywgNSB9LAkvKiAxMTAwICovCisgICAgeyA0LCAweEUsIDYgfSwJLyogMTExMCAqLworICAgIHsgNCwgMHhGLCA3IH0sCS8qIDExMTEgKi8KKyAgICB7IDUsIDB4MTMsIDggfSwJLyogMTAwMSAxICovCisgICAgeyA1LCAweDE0LCA5IH0sCS8qIDEwMTAgMCAqLworICAgIHsgNSwgMHg3LCAxMCB9LAkvKiAwMDExIDEgKi8KKyAgICB7IDUsIDB4OCwgMTEgfSwJLyogMDEwMCAwICovCisgICAgeyA2LCAweDgsIDEyIH0sCS8qIDAwMTAgMDAgKi8KKyAgICB7IDYsIDB4MywgMTMgfSwJLyogMDAwMCAxMSAqLworICAgIHsgNiwgMHgzNCwgMTQgfSwJLyogMTEwMSAwMCAqLworICAgIHsgNiwgMHgzNSwgMTUgfSwJLyogMTEwMSAwMSAqLworICAgIHsgNiwgMHgyQSwgMTYgfSwJLyogMTAxMCAxMCAqLworICAgIHsgNiwgMHgyQiwgMTcgfSwJLyogMTAxMCAxMSAqLworICAgIHsgNywgMHgyNywgMTggfSwJLyogMDEwMCAxMTEgKi8KKyAgICB7IDcsIDB4QywgMTkgfSwJLyogMDAwMSAxMDAgKi8KKyAgICB7IDcsIDB4OCwgMjAgfSwJLyogMDAwMSAwMDAgKi8KKyAgICB7IDcsIDB4MTcsIDIxIH0sCS8qIDAwMTAgMTExICovCisgICAgeyA3LCAweDMsIDIyIH0sCS8qIDAwMDAgMDExICovCisgICAgeyA3LCAweDQsIDIzIH0sCS8qIDAwMDAgMTAwICovCisgICAgeyA3LCAweDI4LCAyNCB9LAkvKiAwMTAxIDAwMCAqLworICAgIHsgNywgMHgyQiwgMjUgfSwJLyogMDEwMSAwMTEgKi8KKyAgICB7IDcsIDB4MTMsIDI2IH0sCS8qIDAwMTAgMDExICovCisgICAgeyA3LCAweDI0LCAyNyB9LAkvKiAwMTAwIDEwMCAqLworICAgIHsgNywgMHgxOCwgMjggfSwJLyogMDAxMSAwMDAgKi8KKyAgICB7IDgsIDB4MiwgMjkgfSwJLyogMDAwMCAwMDEwICovCisgICAgeyA4LCAweDMsIDMwIH0sCS8qIDAwMDAgMDAxMSAqLworICAgIHsgOCwgMHgxQSwgMzEgfSwJLyogMDAwMSAxMDEwICovCisgICAgeyA4LCAweDFCLCAzMiB9LAkvKiAwMDAxIDEwMTEgKi8KKyAgICB7IDgsIDB4MTIsIDMzIH0sCS8qIDAwMDEgMDAxMCAqLworICAgIHsgOCwgMHgxMywgMzQgfSwJLyogMDAwMSAwMDExICovCisgICAgeyA4LCAweDE0LCAzNSB9LAkvKiAwMDAxIDAxMDAgKi8KKyAgICB7IDgsIDB4MTUsIDM2IH0sCS8qIDAwMDEgMDEwMSAqLworICAgIHsgOCwgMHgxNiwgMzcgfSwJLyogMDAwMSAwMTEwICovCisgICAgeyA4LCAweDE3LCAzOCB9LAkvKiAwMDAxIDAxMTEgKi8KKyAgICB7IDgsIDB4MjgsIDM5IH0sCS8qIDAwMTAgMTAwMCAqLworICAgIHsgOCwgMHgyOSwgNDAgfSwJLyogMDAxMCAxMDAxICovCisgICAgeyA4LCAweDJBLCA0MSB9LAkvKiAwMDEwIDEwMTAgKi8KKyAgICB7IDgsIDB4MkIsIDQyIH0sCS8qIDAwMTAgMTAxMSAqLworICAgIHsgOCwgMHgyQywgNDMgfSwJLyogMDAxMCAxMTAwICovCisgICAgeyA4LCAweDJELCA0NCB9LAkvKiAwMDEwIDExMDEgKi8KKyAgICB7IDgsIDB4NCwgNDUgfSwJLyogMDAwMCAwMTAwICovCisgICAgeyA4LCAweDUsIDQ2IH0sCS8qIDAwMDAgMDEwMSAqLworICAgIHsgOCwgMHhBLCA0NyB9LAkvKiAwMDAwIDEwMTAgKi8KKyAgICB7IDgsIDB4QiwgNDggfSwJLyogMDAwMCAxMDExICovCisgICAgeyA4LCAweDUyLCA0OSB9LAkvKiAwMTAxIDAwMTAgKi8KKyAgICB7IDgsIDB4NTMsIDUwIH0sCS8qIDAxMDEgMDAxMSAqLworICAgIHsgOCwgMHg1NCwgNTEgfSwJLyogMDEwMSAwMTAwICovCisgICAgeyA4LCAweDU1LCA1MiB9LAkvKiAwMTAxIDAxMDEgKi8KKyAgICB7IDgsIDB4MjQsIDUzIH0sCS8qIDAwMTAgMDEwMCAqLworICAgIHsgOCwgMHgyNSwgNTQgfSwJLyogMDAxMCAwMTAxICovCisgICAgeyA4LCAweDU4LCA1NSB9LAkvKiAwMTAxIDEwMDAgKi8KKyAgICB7IDgsIDB4NTksIDU2IH0sCS8qIDAxMDEgMTAwMSAqLworICAgIHsgOCwgMHg1QSwgNTcgfSwJLyogMDEwMSAxMDEwICovCisgICAgeyA4LCAweDVCLCA1OCB9LAkvKiAwMTAxIDEwMTEgKi8KKyAgICB7IDgsIDB4NEEsIDU5IH0sCS8qIDAxMDAgMTAxMCAqLworICAgIHsgOCwgMHg0QiwgNjAgfSwJLyogMDEwMCAxMDExICovCisgICAgeyA4LCAweDMyLCA2MSB9LAkvKiAwMDExIDAwMTAgKi8KKyAgICB7IDgsIDB4MzMsIDYyIH0sCS8qIDAwMTEgMDAxMSAqLworICAgIHsgOCwgMHgzNCwgNjMgfSwJLyogMDAxMSAwMTAwICovCisgICAgeyA1LCAweDFCLCA2NCB9LAkvKiAxMTAxIDEgKi8KKyAgICB7IDUsIDB4MTIsIDEyOCB9LAkvKiAxMDAxIDAgKi8KKyAgICB7IDYsIDB4MTcsIDE5MiB9LAkvKiAwMTAxIDExICovCisgICAgeyA3LCAweDM3LCAyNTYgfSwJLyogMDExMCAxMTEgKi8KKyAgICB7IDgsIDB4MzYsIDMyMCB9LAkvKiAwMDExIDAxMTAgKi8KKyAgICB7IDgsIDB4MzcsIDM4NCB9LAkvKiAwMDExIDAxMTEgKi8KKyAgICB7IDgsIDB4NjQsIDQ0OCB9LAkvKiAwMTEwIDAxMDAgKi8KKyAgICB7IDgsIDB4NjUsIDUxMiB9LAkvKiAwMTEwIDAxMDEgKi8KKyAgICB7IDgsIDB4NjgsIDU3NiB9LAkvKiAwMTEwIDEwMDAgKi8KKyAgICB7IDgsIDB4NjcsIDY0MCB9LAkvKiAwMTEwIDAxMTEgKi8KKyAgICB7IDksIDB4Q0MsIDcwNCB9LAkvKiAwMTEwIDAxMTAgMCAqLworICAgIHsgOSwgMHhDRCwgNzY4IH0sCS8qIDAxMTAgMDExMCAxICovCisgICAgeyA5LCAweEQyLCA4MzIgfSwJLyogMDExMCAxMDAxIDAgKi8KKyAgICB7IDksIDB4RDMsIDg5NiB9LAkvKiAwMTEwIDEwMDEgMSAqLworICAgIHsgOSwgMHhENCwgOTYwIH0sCS8qIDAxMTAgMTAxMCAwICovCisgICAgeyA5LCAweEQ1LCAxMDI0IH0sCS8qIDAxMTAgMTAxMCAxICovCisgICAgeyA5LCAweEQ2LCAxMDg4IH0sCS8qIDAxMTAgMTAxMSAwICovCisgICAgeyA5LCAweEQ3LCAxMTUyIH0sCS8qIDAxMTAgMTAxMSAxICovCisgICAgeyA5LCAweEQ4LCAxMjE2IH0sCS8qIDAxMTAgMTEwMCAwICovCisgICAgeyA5LCAweEQ5LCAxMjgwIH0sCS8qIDAxMTAgMTEwMCAxICovCisgICAgeyA5LCAweERBLCAxMzQ0IH0sCS8qIDAxMTAgMTEwMSAwICovCisgICAgeyA5LCAweERCLCAxNDA4IH0sCS8qIDAxMTAgMTEwMSAxICovCisgICAgeyA5LCAweDk4LCAxNDcyIH0sCS8qIDAxMDAgMTEwMCAwICovCisgICAgeyA5LCAweDk5LCAxNTM2IH0sCS8qIDAxMDAgMTEwMCAxICovCisgICAgeyA5LCAweDlBLCAxNjAwIH0sCS8qIDAxMDAgMTEwMSAwICovCisgICAgeyA2LCAweDE4LCAxNjY0IH0sCS8qIDAxMTAgMDAgKi8KKyAgICB7IDksIDB4OUIsIDE3MjggfSwJLyogMDEwMCAxMTAxIDEgKi8KKyAgICB7IDExLCAweDgsIDE3OTIgfSwJLyogMDAwMCAwMDAxIDAwMCAqLworICAgIHsgMTEsIDB4QywgMTg1NiB9LAkvKiAwMDAwIDAwMDEgMTAwICovCisgICAgeyAxMSwgMHhELCAxOTIwIH0sCS8qIDAwMDAgMDAwMSAxMDEgKi8KKyAgICB7IDEyLCAweDEyLCAxOTg0IH0sCS8qIDAwMDAgMDAwMSAwMDEwICovCisgICAgeyAxMiwgMHgxMywgMjA0OCB9LAkvKiAwMDAwIDAwMDEgMDAxMSAqLworICAgIHsgMTIsIDB4MTQsIDIxMTIgfSwJLyogMDAwMCAwMDAxIDAxMDAgKi8KKyAgICB7IDEyLCAweDE1LCAyMTc2IH0sCS8qIDAwMDAgMDAwMSAwMTAxICovCisgICAgeyAxMiwgMHgxNiwgMjI0MCB9LAkvKiAwMDAwIDAwMDEgMDExMCAqLworICAgIHsgMTIsIDB4MTcsIDIzMDQgfSwJLyogMDAwMCAwMDAxIDAxMTEgKi8KKyAgICB7IDEyLCAweDFDLCAyMzY4IH0sCS8qIDAwMDAgMDAwMSAxMTAwICovCisgICAgeyAxMiwgMHgxRCwgMjQzMiB9LAkvKiAwMDAwIDAwMDEgMTEwMSAqLworICAgIHsgMTIsIDB4MUUsIDI0OTYgfSwJLyogMDAwMCAwMDAxIDExMTAgKi8KKyAgICB7IDEyLCAweDFGLCAyNTYwIH0sCS8qIDAwMDAgMDAwMSAxMTExICovCisgICAgeyAxMiwgMHgxLCBHM0NPREVfRU9MIH0sCS8qIDAwMDAgMDAwMCAwMDAxICovCisgICAgeyA5LCAweDEsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAxICovCisgICAgeyAxMCwgMHgxLCBHM0NPREVfSU5WQUxJRCB9LAkvKiAwMDAwIDAwMDAgMDEgKi8KKyAgICB7IDExLCAweDEsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAwMDEgKi8KKyAgICB7IDEyLCAweDAsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAwMDAwICovCit9OworCitjb25zdCB0YWJsZWVudHJ5IFRJRkZGYXhCbGFja0NvZGVzW10gPSB7CisgICAgeyAxMCwgMHgzNywgMCB9LAkvKiAwMDAwIDExMDEgMTEgKi8KKyAgICB7IDMsIDB4MiwgMSB9LAkvKiAwMTAgKi8KKyAgICB7IDIsIDB4MywgMiB9LAkvKiAxMSAqLworICAgIHsgMiwgMHgyLCAzIH0sCS8qIDEwICovCisgICAgeyAzLCAweDMsIDQgfSwJLyogMDExICovCisgICAgeyA0LCAweDMsIDUgfSwJLyogMDAxMSAqLworICAgIHsgNCwgMHgyLCA2IH0sCS8qIDAwMTAgKi8KKyAgICB7IDUsIDB4MywgNyB9LAkvKiAwMDAxIDEgKi8KKyAgICB7IDYsIDB4NSwgOCB9LAkvKiAwMDAxIDAxICovCisgICAgeyA2LCAweDQsIDkgfSwJLyogMDAwMSAwMCAqLworICAgIHsgNywgMHg0LCAxMCB9LAkvKiAwMDAwIDEwMCAqLworICAgIHsgNywgMHg1LCAxMSB9LAkvKiAwMDAwIDEwMSAqLworICAgIHsgNywgMHg3LCAxMiB9LAkvKiAwMDAwIDExMSAqLworICAgIHsgOCwgMHg0LCAxMyB9LAkvKiAwMDAwIDAxMDAgKi8KKyAgICB7IDgsIDB4NywgMTQgfSwJLyogMDAwMCAwMTExICovCisgICAgeyA5LCAweDE4LCAxNSB9LAkvKiAwMDAwIDExMDAgMCAqLworICAgIHsgMTAsIDB4MTcsIDE2IH0sCS8qIDAwMDAgMDEwMSAxMSAqLworICAgIHsgMTAsIDB4MTgsIDE3IH0sCS8qIDAwMDAgMDExMCAwMCAqLworICAgIHsgMTAsIDB4OCwgMTggfSwJLyogMDAwMCAwMDEwIDAwICovCisgICAgeyAxMSwgMHg2NywgMTkgfSwJLyogMDAwMCAxMTAwIDExMSAqLworICAgIHsgMTEsIDB4NjgsIDIwIH0sCS8qIDAwMDAgMTEwMSAwMDAgKi8KKyAgICB7IDExLCAweDZDLCAyMSB9LAkvKiAwMDAwIDExMDEgMTAwICovCisgICAgeyAxMSwgMHgzNywgMjIgfSwJLyogMDAwMCAwMTEwIDExMSAqLworICAgIHsgMTEsIDB4MjgsIDIzIH0sCS8qIDAwMDAgMDEwMSAwMDAgKi8KKyAgICB7IDExLCAweDE3LCAyNCB9LAkvKiAwMDAwIDAwMTAgMTExICovCisgICAgeyAxMSwgMHgxOCwgMjUgfSwJLyogMDAwMCAwMDExIDAwMCAqLworICAgIHsgMTIsIDB4Q0EsIDI2IH0sCS8qIDAwMDAgMTEwMCAxMDEwICovCisgICAgeyAxMiwgMHhDQiwgMjcgfSwJLyogMDAwMCAxMTAwIDEwMTEgKi8KKyAgICB7IDEyLCAweENDLCAyOCB9LAkvKiAwMDAwIDExMDAgMTEwMCAqLworICAgIHsgMTIsIDB4Q0QsIDI5IH0sCS8qIDAwMDAgMTEwMCAxMTAxICovCisgICAgeyAxMiwgMHg2OCwgMzAgfSwJLyogMDAwMCAwMTEwIDEwMDAgKi8KKyAgICB7IDEyLCAweDY5LCAzMSB9LAkvKiAwMDAwIDAxMTAgMTAwMSAqLworICAgIHsgMTIsIDB4NkEsIDMyIH0sCS8qIDAwMDAgMDExMCAxMDEwICovCisgICAgeyAxMiwgMHg2QiwgMzMgfSwJLyogMDAwMCAwMTEwIDEwMTEgKi8KKyAgICB7IDEyLCAweEQyLCAzNCB9LAkvKiAwMDAwIDExMDEgMDAxMCAqLworICAgIHsgMTIsIDB4RDMsIDM1IH0sCS8qIDAwMDAgMTEwMSAwMDExICovCisgICAgeyAxMiwgMHhENCwgMzYgfSwJLyogMDAwMCAxMTAxIDAxMDAgKi8KKyAgICB7IDEyLCAweEQ1LCAzNyB9LAkvKiAwMDAwIDExMDEgMDEwMSAqLworICAgIHsgMTIsIDB4RDYsIDM4IH0sCS8qIDAwMDAgMTEwMSAwMTEwICovCisgICAgeyAxMiwgMHhENywgMzkgfSwJLyogMDAwMCAxMTAxIDAxMTEgKi8KKyAgICB7IDEyLCAweDZDLCA0MCB9LAkvKiAwMDAwIDAxMTAgMTEwMCAqLworICAgIHsgMTIsIDB4NkQsIDQxIH0sCS8qIDAwMDAgMDExMCAxMTAxICovCisgICAgeyAxMiwgMHhEQSwgNDIgfSwJLyogMDAwMCAxMTAxIDEwMTAgKi8KKyAgICB7IDEyLCAweERCLCA0MyB9LAkvKiAwMDAwIDExMDEgMTAxMSAqLworICAgIHsgMTIsIDB4NTQsIDQ0IH0sCS8qIDAwMDAgMDEwMSAwMTAwICovCisgICAgeyAxMiwgMHg1NSwgNDUgfSwJLyogMDAwMCAwMTAxIDAxMDEgKi8KKyAgICB7IDEyLCAweDU2LCA0NiB9LAkvKiAwMDAwIDAxMDEgMDExMCAqLworICAgIHsgMTIsIDB4NTcsIDQ3IH0sCS8qIDAwMDAgMDEwMSAwMTExICovCisgICAgeyAxMiwgMHg2NCwgNDggfSwJLyogMDAwMCAwMTEwIDAxMDAgKi8KKyAgICB7IDEyLCAweDY1LCA0OSB9LAkvKiAwMDAwIDAxMTAgMDEwMSAqLworICAgIHsgMTIsIDB4NTIsIDUwIH0sCS8qIDAwMDAgMDEwMSAwMDEwICovCisgICAgeyAxMiwgMHg1MywgNTEgfSwJLyogMDAwMCAwMTAxIDAwMTEgKi8KKyAgICB7IDEyLCAweDI0LCA1MiB9LAkvKiAwMDAwIDAwMTAgMDEwMCAqLworICAgIHsgMTIsIDB4MzcsIDUzIH0sCS8qIDAwMDAgMDAxMSAwMTExICovCisgICAgeyAxMiwgMHgzOCwgNTQgfSwJLyogMDAwMCAwMDExIDEwMDAgKi8KKyAgICB7IDEyLCAweDI3LCA1NSB9LAkvKiAwMDAwIDAwMTAgMDExMSAqLworICAgIHsgMTIsIDB4MjgsIDU2IH0sCS8qIDAwMDAgMDAxMCAxMDAwICovCisgICAgeyAxMiwgMHg1OCwgNTcgfSwJLyogMDAwMCAwMTAxIDEwMDAgKi8KKyAgICB7IDEyLCAweDU5LCA1OCB9LAkvKiAwMDAwIDAxMDEgMTAwMSAqLworICAgIHsgMTIsIDB4MkIsIDU5IH0sCS8qIDAwMDAgMDAxMCAxMDExICovCisgICAgeyAxMiwgMHgyQywgNjAgfSwJLyogMDAwMCAwMDEwIDExMDAgKi8KKyAgICB7IDEyLCAweDVBLCA2MSB9LAkvKiAwMDAwIDAxMDEgMTAxMCAqLworICAgIHsgMTIsIDB4NjYsIDYyIH0sCS8qIDAwMDAgMDExMCAwMTEwICovCisgICAgeyAxMiwgMHg2NywgNjMgfSwJLyogMDAwMCAwMTEwIDAxMTEgKi8KKyAgICB7IDEwLCAweEYsIDY0IH0sCS8qIDAwMDAgMDAxMSAxMSAqLworICAgIHsgMTIsIDB4QzgsIDEyOCB9LAkvKiAwMDAwIDExMDAgMTAwMCAqLworICAgIHsgMTIsIDB4QzksIDE5MiB9LAkvKiAwMDAwIDExMDAgMTAwMSAqLworICAgIHsgMTIsIDB4NUIsIDI1NiB9LAkvKiAwMDAwIDAxMDEgMTAxMSAqLworICAgIHsgMTIsIDB4MzMsIDMyMCB9LAkvKiAwMDAwIDAwMTEgMDAxMSAqLworICAgIHsgMTIsIDB4MzQsIDM4NCB9LAkvKiAwMDAwIDAwMTEgMDEwMCAqLworICAgIHsgMTIsIDB4MzUsIDQ0OCB9LAkvKiAwMDAwIDAwMTEgMDEwMSAqLworICAgIHsgMTMsIDB4NkMsIDUxMiB9LAkvKiAwMDAwIDAwMTEgMDExMCAwICovCisgICAgeyAxMywgMHg2RCwgNTc2IH0sCS8qIDAwMDAgMDAxMSAwMTEwIDEgKi8KKyAgICB7IDEzLCAweDRBLCA2NDAgfSwJLyogMDAwMCAwMDEwIDAxMDEgMCAqLworICAgIHsgMTMsIDB4NEIsIDcwNCB9LAkvKiAwMDAwIDAwMTAgMDEwMSAxICovCisgICAgeyAxMywgMHg0QywgNzY4IH0sCS8qIDAwMDAgMDAxMCAwMTEwIDAgKi8KKyAgICB7IDEzLCAweDRELCA4MzIgfSwJLyogMDAwMCAwMDEwIDAxMTAgMSAqLworICAgIHsgMTMsIDB4NzIsIDg5NiB9LAkvKiAwMDAwIDAwMTEgMTAwMSAwICovCisgICAgeyAxMywgMHg3MywgOTYwIH0sCS8qIDAwMDAgMDAxMSAxMDAxIDEgKi8KKyAgICB7IDEzLCAweDc0LCAxMDI0IH0sCS8qIDAwMDAgMDAxMSAxMDEwIDAgKi8KKyAgICB7IDEzLCAweDc1LCAxMDg4IH0sCS8qIDAwMDAgMDAxMSAxMDEwIDEgKi8KKyAgICB7IDEzLCAweDc2LCAxMTUyIH0sCS8qIDAwMDAgMDAxMSAxMDExIDAgKi8KKyAgICB7IDEzLCAweDc3LCAxMjE2IH0sCS8qIDAwMDAgMDAxMSAxMDExIDEgKi8KKyAgICB7IDEzLCAweDUyLCAxMjgwIH0sCS8qIDAwMDAgMDAxMCAxMDAxIDAgKi8KKyAgICB7IDEzLCAweDUzLCAxMzQ0IH0sCS8qIDAwMDAgMDAxMCAxMDAxIDEgKi8KKyAgICB7IDEzLCAweDU0LCAxNDA4IH0sCS8qIDAwMDAgMDAxMCAxMDEwIDAgKi8KKyAgICB7IDEzLCAweDU1LCAxNDcyIH0sCS8qIDAwMDAgMDAxMCAxMDEwIDEgKi8KKyAgICB7IDEzLCAweDVBLCAxNTM2IH0sCS8qIDAwMDAgMDAxMCAxMTAxIDAgKi8KKyAgICB7IDEzLCAweDVCLCAxNjAwIH0sCS8qIDAwMDAgMDAxMCAxMTAxIDEgKi8KKyAgICB7IDEzLCAweDY0LCAxNjY0IH0sCS8qIDAwMDAgMDAxMSAwMDEwIDAgKi8KKyAgICB7IDEzLCAweDY1LCAxNzI4IH0sCS8qIDAwMDAgMDAxMSAwMDEwIDEgKi8KKyAgICB7IDExLCAweDgsIDE3OTIgfSwJLyogMDAwMCAwMDAxIDAwMCAqLworICAgIHsgMTEsIDB4QywgMTg1NiB9LAkvKiAwMDAwIDAwMDEgMTAwICovCisgICAgeyAxMSwgMHhELCAxOTIwIH0sCS8qIDAwMDAgMDAwMSAxMDEgKi8KKyAgICB7IDEyLCAweDEyLCAxOTg0IH0sCS8qIDAwMDAgMDAwMSAwMDEwICovCisgICAgeyAxMiwgMHgxMywgMjA0OCB9LAkvKiAwMDAwIDAwMDEgMDAxMSAqLworICAgIHsgMTIsIDB4MTQsIDIxMTIgfSwJLyogMDAwMCAwMDAxIDAxMDAgKi8KKyAgICB7IDEyLCAweDE1LCAyMTc2IH0sCS8qIDAwMDAgMDAwMSAwMTAxICovCisgICAgeyAxMiwgMHgxNiwgMjI0MCB9LAkvKiAwMDAwIDAwMDEgMDExMCAqLworICAgIHsgMTIsIDB4MTcsIDIzMDQgfSwJLyogMDAwMCAwMDAxIDAxMTEgKi8KKyAgICB7IDEyLCAweDFDLCAyMzY4IH0sCS8qIDAwMDAgMDAwMSAxMTAwICovCisgICAgeyAxMiwgMHgxRCwgMjQzMiB9LAkvKiAwMDAwIDAwMDEgMTEwMSAqLworICAgIHsgMTIsIDB4MUUsIDI0OTYgfSwJLyogMDAwMCAwMDAxIDExMTAgKi8KKyAgICB7IDEyLCAweDFGLCAyNTYwIH0sCS8qIDAwMDAgMDAwMSAxMTExICovCisgICAgeyAxMiwgMHgxLCBHM0NPREVfRU9MIH0sCS8qIDAwMDAgMDAwMCAwMDAxICovCisgICAgeyA5LCAweDEsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAxICovCisgICAgeyAxMCwgMHgxLCBHM0NPREVfSU5WQUxJRCB9LAkvKiAwMDAwIDAwMDAgMDEgKi8KKyAgICB7IDExLCAweDEsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAwMDEgKi8KKyAgICB7IDEyLCAweDAsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAwMDAwICovCit9OworI2Vsc2UKK2V4dGVybiBjb25zdCB0YWJsZWVudHJ5IFRJRkZGYXhXaGl0ZUNvZGVzW107CitleHRlcm4gY29uc3QgdGFibGVlbnRyeSBUSUZGRmF4QmxhY2tDb2Rlc1tdOworI2VuZGlmCisjZW5kaWYgLyogX1Q0XyAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfYXV4LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9hdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJlOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfYXV4LmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qICRJZDogdGlmX2F1eC5jLHYgMS4yNiAyMDEwLTA3LTAxIDE1OjMzOjI4IGRyb24gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogQXV4aWxpYXJ5IFN1cHBvcnQgUm91dGluZXMuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlICJ0aWZfcHJlZGljdC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKwordWludDMyCitfVElGRk11bHRpcGx5MzIoVElGRiogdGlmLCB1aW50MzIgZmlyc3QsIHVpbnQzMiBzZWNvbmQsIGNvbnN0IGNoYXIqIHdoZXJlKQoreworCXVpbnQzMiBieXRlcyA9IGZpcnN0ICogc2Vjb25kOworCisJaWYgKHNlY29uZCAmJiBieXRlcyAvIHNlY29uZCAhPSBmaXJzdCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgd2hlcmUsICJJbnRlZ2VyIG92ZXJmbG93IGluICVzIiwgd2hlcmUpOworCQlieXRlcyA9IDA7CisJfQorCisJcmV0dXJuIGJ5dGVzOworfQorCit1aW50NjQKK19USUZGTXVsdGlwbHk2NChUSUZGKiB0aWYsIHVpbnQ2NCBmaXJzdCwgdWludDY0IHNlY29uZCwgY29uc3QgY2hhciogd2hlcmUpCit7CisJdWludDY0IGJ5dGVzID0gZmlyc3QgKiBzZWNvbmQ7CisKKwlpZiAoc2Vjb25kICYmIGJ5dGVzIC8gc2Vjb25kICE9IGZpcnN0KSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB3aGVyZSwgIkludGVnZXIgb3ZlcmZsb3cgaW4gJXMiLCB3aGVyZSk7CisJCWJ5dGVzID0gMDsKKwl9CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3ZvaWQqCitfVElGRkNoZWNrUmVhbGxvYyhUSUZGKiB0aWYsIHZvaWQqIGJ1ZmZlciwKKwkJICB0bXNpemVfdCBubWVtYiwgdG1zaXplX3QgZWxlbV9zaXplLCBjb25zdCBjaGFyKiB3aGF0KQoreworCXZvaWQqIGNwID0gTlVMTDsKKwl0bXNpemVfdCBieXRlcyA9IG5tZW1iICogZWxlbV9zaXplOworCisJLyoKKwkgKiBYWFg6IENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93LgorCSAqLworCWlmIChubWVtYiAmJiBlbGVtX3NpemUgJiYgYnl0ZXMgLyBlbGVtX3NpemUgPT0gbm1lbWIpCisJCWNwID0gX1RJRkZyZWFsbG9jKGJ1ZmZlciwgYnl0ZXMpOworCisJaWYgKGNwID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlcyAiCisJCQkgICAgICIoJWxkIGVsZW1lbnRzIG9mICVsZCBieXRlcyBlYWNoKSIsCisJCQkgICAgIHdoYXQsKGxvbmcpIG5tZW1iLCAobG9uZykgZWxlbV9zaXplKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKK3ZvaWQqCitfVElGRkNoZWNrTWFsbG9jKFRJRkYqIHRpZiwgdG1zaXplX3Qgbm1lbWIsIHRtc2l6ZV90IGVsZW1fc2l6ZSwgY29uc3QgY2hhciogd2hhdCkKK3sKKwlyZXR1cm4gX1RJRkZDaGVja1JlYWxsb2ModGlmLCBOVUxMLCBubWVtYiwgZWxlbV9zaXplLCB3aGF0KTsgIAorfQorCitzdGF0aWMgaW50CitUSUZGRGVmYXVsdFRyYW5zZmVyRnVuY3Rpb24oVElGRkRpcmVjdG9yeSogdGQpCit7CisJdWludDE2ICoqdGYgPSB0ZC0+dGRfdHJhbnNmZXJmdW5jdGlvbjsKKwl0bXNpemVfdCBpLCBuLCBuYnl0ZXM7CisKKwl0ZlswXSA9IHRmWzFdID0gdGZbMl0gPSAwOworCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA+PSBzaXplb2YodG1zaXplX3QpICogOCAtIDIpCisJCXJldHVybiAwOworCisJbiA9ICgodG1zaXplX3QpMSk8PHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCW5ieXRlcyA9IG4gKiBzaXplb2YgKHVpbnQxNik7CisJaWYgKCEodGZbMF0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKSkpCisJCXJldHVybiAwOworCXRmWzBdWzBdID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisJCWRvdWJsZSB0ID0gKGRvdWJsZSlpLygoZG91YmxlKSBuLTEuKTsKKwkJdGZbMF1baV0gPSAodWludDE2KWZsb29yKDY1NTM1Lipwb3codCwgMi4yKSArIC41KTsKKwl9CisKKwlpZiAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXMgPiAxKSB7CisJCWlmICghKHRmWzFdID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKG5ieXRlcykpKQorCQkJZ290byBiYWQ7CisJCV9USUZGbWVtY3B5KHRmWzFdLCB0ZlswXSwgbmJ5dGVzKTsKKwkJaWYgKCEodGZbMl0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKSkpCisJCQlnb3RvIGJhZDsKKwkJX1RJRkZtZW1jcHkodGZbMl0sIHRmWzBdLCBuYnl0ZXMpOworCX0KKwlyZXR1cm4gMTsKKworYmFkOgorCWlmICh0ZlswXSkKKwkJX1RJRkZmcmVlKHRmWzBdKTsKKwlpZiAodGZbMV0pCisJCV9USUZGZnJlZSh0ZlsxXSk7CisJaWYgKHRmWzJdKQorCQlfVElGRmZyZWUodGZbMl0pOworCXRmWzBdID0gdGZbMV0gPSB0ZlsyXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZEZWZhdWx0UmVmQmxhY2tXaGl0ZShUSUZGRGlyZWN0b3J5KiB0ZCkKK3sKKwlpbnQgaTsKKworCWlmICghKHRkLT50ZF9yZWZibGFja3doaXRlID0gKGZsb2F0ICopX1RJRkZtYWxsb2MoNipzaXplb2YgKGZsb2F0KSkpKQorCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUikgeworCQkvKgorCQkgKiBZQ2JDciAoQ2xhc3MgWSkgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgUmVmZXJlbmNlQmxhY2tXaGl0ZQorCQkgKiB0YWcgc2V0LiBGaXggdGhlIGJyb2tlbiBpbWFnZXMsIHdoaWNoIGxhY2tzIHRoYXQgdGFnLgorCQkgKi8KKwkJdGQtPnRkX3JlZmJsYWNrd2hpdGVbMF0gPSAwLjBGOworCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsxXSA9IHRkLT50ZF9yZWZibGFja3doaXRlWzNdID0KKwkJCXRkLT50ZF9yZWZibGFja3doaXRlWzVdID0gMjU1LjBGOworCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsyXSA9IHRkLT50ZF9yZWZibGFja3doaXRlWzRdID0gMTI4LjBGOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFzc3VtZSBSR0IgKENsYXNzIFIpCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCSAgICB0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsyKmkrMF0gPSAwOworCQkgICAgdGQtPnRkX3JlZmJsYWNrd2hpdGVbMippKzFdID0KKwkJCSAgICAoZmxvYXQpKCgxTDw8dGQtPnRkX2JpdHNwZXJzYW1wbGUpLTFMKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIExpa2UgVElGRkdldEZpZWxkLCBidXQgcmV0dXJuIGFueSBkZWZhdWx0CisgKiB2YWx1ZSBpZiB0aGUgdGFnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkuCisgKgorICogTkI6CVdlIHVzZSB0aGUgdmFsdWUgaW4gdGhlIGRpcmVjdG9yeSwgcmF0aGVyIHRoYW4KKyAqCWV4cGxjaXQgdmFsdWVzIHNvIHRoYXQgZGVmYXVsdHMgZXhpc3Qgb25seSBvbmUKKyAqCXBsYWNlIGluIHRoZSBsaWJyYXJ5IC0tIGluIFRJRkZEZWZhdWx0RGlyZWN0b3J5LgorICovCitpbnQKK1RJRkZWR2V0RmllbGREZWZhdWx0ZWQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmIChUSUZGVkdldEZpZWxkKHRpZiwgdGFnLCBhcCkpCisJCXJldHVybiAoMSk7CisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfU1VCRklMRVRZUEU6CisJCSp2YV9hcmcoYXAsIHVpbnQzMiAqKSA9IHRkLT50ZF9zdWJmaWxldHlwZTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfQklUU1BFUlNBTVBMRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX2JpdHNwZXJzYW1wbGU7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1RIUkVTSEhPTERJTkc6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF90aHJlc2hob2xkaW5nOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19GSUxMT1JERVI6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF9maWxsb3JkZXI7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX09SSUVOVEFUSU9OOgorCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfb3JpZW50YXRpb247CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTDoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfUk9XU1BFUlNUUklQOgorCQkqdmFfYXJnKGFwLCB1aW50MzIgKikgPSB0ZC0+dGRfcm93c3BlcnN0cmlwOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19NSU5TQU1QTEVWQUxVRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX21pbnNhbXBsZXZhbHVlOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19NQVhTQU1QTEVWQUxVRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX21heHNhbXBsZXZhbHVlOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19QTEFOQVJDT05GSUc6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF9wbGFuYXJjb25maWc7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1JFU09MVVRJT05VTklUOgorCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfcmVzb2x1dGlvbnVuaXQ7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKKyAgICAgICAgICAgICAgICB7CisJCQlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gKFRJRkZQcmVkaWN0b3JTdGF0ZSopIHRpZi0+dGlmX2RhdGE7CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICh1aW50MTYpIHNwLT5wcmVkaWN0b3I7CisJCQlyZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisJY2FzZSBUSUZGVEFHX0RPVFJBTkdFOgorCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSAwOworCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSAoMTw8dGQtPnRkX2JpdHNwZXJzYW1wbGUpLTE7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX0lOS1NFVDoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gSU5LU0VUX0NNWUs7CisJCXJldHVybiAxOworCWNhc2UgVElGRlRBR19OVU1CRVJPRklOS1M6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IDQ7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX0VYVFJBU0FNUExFUzoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX2V4dHJhc2FtcGxlczsKKwkJKnZhX2FyZyhhcCwgdWludDE2ICoqKSA9IHRkLT50ZF9zYW1wbGVpbmZvOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19NQVRURUlORzoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0KKwkJICAgICh0ZC0+dGRfZXh0cmFzYW1wbGVzID09IDEgJiYKKwkJICAgICB0ZC0+dGRfc2FtcGxlaW5mb1swXSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfVElMRURFUFRIOgorCQkqdmFfYXJnKGFwLCB1aW50MzIgKikgPSB0ZC0+dGRfdGlsZWRlcHRoOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19EQVRBVFlQRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX3NhbXBsZWZvcm1hdC0xOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19TQU1QTEVGT1JNQVQ6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF9zYW1wbGVmb3JtYXQ7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworCWNhc2UgVElGRlRBR19JTUFHRURFUFRIOgorCQkqdmFfYXJnKGFwLCB1aW50MzIgKikgPSB0ZC0+dGRfaW1hZ2VkZXB0aDsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfWUNCQ1JDT0VGRklDSUVOVFM6CisJCXsKKwkJCS8qIGRlZmF1bHRzIGFyZSBmcm9tIENDSVIgUmVjb21tZW5kYXRpb24gNjAxLTEgKi8KKwkJCXN0YXRpYyBmbG9hdCB5Y2JjcmNvZWZmc1tdID0geyAwLjI5OWYsIDAuNTg3ZiwgMC4xMTRmIH07CisJCQkqdmFfYXJnKGFwLCBmbG9hdCAqKikgPSB5Y2JjcmNvZWZmczsKKwkJCXJldHVybiAxOworCQl9CisJY2FzZSBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkc6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdOworCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfWUNCQ1JQT1NJVElPTklORzoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX3ljYmNycG9zaXRpb25pbmc7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1dISVRFUE9JTlQ6CisJCXsKKwkJCXN0YXRpYyBmbG9hdCB3aGl0ZXBvaW50WzJdOworCisJCQkvKiBUSUZGIDYuMCBzcGVjaWZpY2F0aW9uIHRlbGxzIHRoYXQgaXQgaXMgbm8gZGVmYXVsdAorCQkJICAgdmFsdWUgZm9yIHRoZSBXaGl0ZVBvaW50LCBidXQgQWRvYmVQaG90b3Nob3AgVElGRgorCQkJICAgVGVjaG5pY2FsIE5vdGUgdGVsbHMgdGhhdCBpdCBzaG91bGQgYmUgQ0lFIEQ1MC4gKi8KKwkJCXdoaXRlcG9pbnRbMF0gPQlENTBfWDAgLyAoRDUwX1gwICsgRDUwX1kwICsgRDUwX1owKTsKKwkJCXdoaXRlcG9pbnRbMV0gPQlENTBfWTAgLyAoRDUwX1gwICsgRDUwX1kwICsgRDUwX1owKTsKKwkJCSp2YV9hcmcoYXAsIGZsb2F0ICoqKSA9IHdoaXRlcG9pbnQ7CisJCQlyZXR1cm4gMTsKKwkJfQorCWNhc2UgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OOgorCQlpZiAoIXRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdICYmCisJCSAgICAhVElGRkRlZmF1bHRUcmFuc2ZlckZ1bmN0aW9uKHRkKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsICJObyBzcGFjZSBmb3IgXCJUcmFuc2ZlckZ1bmN0aW9uXCIgdGFnIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKikgPSB0ZC0+dGRfdHJhbnNmZXJmdW5jdGlvblswXTsKKwkJaWYgKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgLSB0ZC0+dGRfZXh0cmFzYW1wbGVzID4gMSkgeworCQkJKnZhX2FyZyhhcCwgdWludDE2ICoqKSA9IHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzFdOworCQkJKnZhX2FyZyhhcCwgdWludDE2ICoqKSA9IHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzJdOworCQl9CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CisJCWlmICghdGQtPnRkX3JlZmJsYWNrd2hpdGUgJiYgIVRJRkZEZWZhdWx0UmVmQmxhY2tXaGl0ZSh0ZCkpCisJCQlyZXR1cm4gKDApOworCQkqdmFfYXJnKGFwLCBmbG9hdCAqKikgPSB0ZC0+dGRfcmVmYmxhY2t3aGl0ZTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMaWtlIFRJRkZHZXRGaWVsZCwgYnV0IHJldHVybiBhbnkgZGVmYXVsdAorICogdmFsdWUgaWYgdGhlIHRhZyBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGlyZWN0b3J5LgorICovCitpbnQKK1RJRkZHZXRGaWVsZERlZmF1bHRlZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLikKK3sKKwlpbnQgb2s7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCB0YWcpOworCW9rID0gIFRJRkZWR2V0RmllbGREZWZhdWx0ZWQodGlmLCB0YWcsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiAob2spOworfQorCitzdHJ1Y3QgX0ludDY0UGFydHMgeworCWludDMyIGxvdywgaGlnaDsKK307CisKK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCBfSW50NjRQYXJ0cyBwYXJ0OworCWludDY0IHZhbHVlOworfSBfSW50NjQ7CisKK2Zsb2F0CitfVElGRlVJbnQ2NFRvRmxvYXQodWludDY0IHVpNjQpCit7CisJX0ludDY0IGk7CisKKwlpLnZhbHVlID0gdWk2NDsKKwlpZiAoaS5wYXJ0LmhpZ2ggPj0gMCkgeworCQlyZXR1cm4gKGZsb2F0KWkudmFsdWU7CisJfSBlbHNlIHsKKwkJbG9uZyBkb3VibGUgZGY7CisJCWRmID0gKGxvbmcgZG91YmxlKWkudmFsdWU7CisJCWRmICs9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2LjA7IC8qIGFkZGluZyAyKio2NCAqLworCQlyZXR1cm4gKGZsb2F0KWRmOworCX0KK30KKworZG91YmxlCitfVElGRlVJbnQ2NFRvRG91YmxlKHVpbnQ2NCB1aTY0KQoreworCV9JbnQ2NCBpOworCisJaS52YWx1ZSA9IHVpNjQ7CisJaWYgKGkucGFydC5oaWdoID49IDApIHsKKwkJcmV0dXJuIChkb3VibGUpaS52YWx1ZTsKKwl9IGVsc2UgeworCQlsb25nIGRvdWJsZSBkZjsKKwkJZGYgPSAobG9uZyBkb3VibGUpaS52YWx1ZTsKKwkJZGYgKz0gMTg0NDY3NDQwNzM3MDk1NTE2MTYuMDsgLyogYWRkaW5nIDIqKjY0ICovCisJCXJldHVybiAoZG91YmxlKWRmOworCX0KK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisgI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9jbG9zZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfY2xvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJiMzBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfY2xvc2UuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogJElkOiB0aWZfY2xvc2UuYyx2IDEuMTkgMjAxMC0wMy0xMCAxODo1Njo0OCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRkNsZWFudXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQXV4aWxpYXJ5IGZ1bmN0aW9uIHRvIGZyZWUgdGhlIFRJRkYgc3RydWN0dXJlLiBHaXZlbiBzdHJ1Y3R1cmUgd2lsbCBiZQorICogY29tcGxldGV0bHkgZnJlZWQsIHNvIHlvdSBzaG91bGQgc2F2ZSBvcGVuZWQgZmlsZSBoYW5kbGUgYW5kIHBvaW50ZXIKKyAqIHRvIHRoZSBjbG9zZSBwcm9jZWR1cmUgaW4gZXh0ZXJuYWwgdmFyaWFibGVzIGJlZm9yZSBjYWxsaW5nCisgKiBfVElGRkNsZWFudXAoKSwgaWYgeW91IHdpbGwgbmVlZCB0aGVzZSBvbmVzIHRvIGNsb3NlIHRoZSBmaWxlLgorICogCisgKiBAcGFyYW0gdGlmIEEgVElGRiBwb2ludGVyLgorICovCisKK3ZvaWQKK1RJRkZDbGVhbnVwKFRJRkYqIHRpZikKK3sKKwkvKgorICAgICAgICAgKiBGbHVzaCBidWZmZXJlZCBkYXRhIGFuZCBkaXJlY3RvcnkgKGlmIGRpcnR5KS4KKyAgICAgICAgICovCisJaWYgKHRpZi0+dGlmX21vZGUgIT0gT19SRE9OTFkpCisJCVRJRkZGbHVzaCh0aWYpOworCSgqdGlmLT50aWZfY2xlYW51cCkodGlmKTsKKwlUSUZGRnJlZURpcmVjdG9yeSh0aWYpOworCisJaWYgKHRpZi0+dGlmX2Rpcmxpc3QpCisJCV9USUZGZnJlZSh0aWYtPnRpZl9kaXJsaXN0KTsKKworCS8qCisgICAgICAgICAqIENsZWFuIHVwIGNsaWVudCBpbmZvIGxpbmtzLgorICAgICAgICAgKi8KKwl3aGlsZSggdGlmLT50aWZfY2xpZW50aW5mbyApCisJeworCQlUSUZGQ2xpZW50SW5mb0xpbmsgKmxpbmsgPSB0aWYtPnRpZl9jbGllbnRpbmZvOworCisJCXRpZi0+dGlmX2NsaWVudGluZm8gPSBsaW5rLT5uZXh0OworCQlfVElGRmZyZWUoIGxpbmstPm5hbWUgKTsKKwkJX1RJRkZmcmVlKCBsaW5rICk7CisJfQorCisJaWYgKHRpZi0+dGlmX3Jhd2RhdGEgJiYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTVlCVUZGRVIpKQorCQlfVElGRmZyZWUodGlmLT50aWZfcmF3ZGF0YSk7CisJaWYgKGlzTWFwcGVkKHRpZikpCisJCVRJRkZVbm1hcEZpbGVDb250ZW50cyh0aWYsIHRpZi0+dGlmX2Jhc2UsICh0b2ZmX3QpdGlmLT50aWZfc2l6ZSk7CisKKwkvKgorICAgICAgICAgKiBDbGVhbiB1cCBjdXN0b20gZmllbGRzLgorICAgICAgICAgKi8KKwlpZiAodGlmLT50aWZfZmllbGRzICYmIHRpZi0+dGlmX25maWVsZHMgPiAwKSB7CisJCXVpbnQzMiBpOworCisJCWZvciAoaSA9IDA7IGkgPCB0aWYtPnRpZl9uZmllbGRzOyBpKyspIHsKKwkJCVRJRkZGaWVsZCAqZmxkID0gdGlmLT50aWZfZmllbGRzW2ldOworCQkJaWYgKGZsZC0+ZmllbGRfYml0ID09IEZJRUxEX0NVU1RPTSAmJgorCQkJICAgIHN0cm5jbXAoIlRhZyAiLCBmbGQtPmZpZWxkX25hbWUsIDQpID09IDApIHsKKwkJCQlfVElGRmZyZWUoZmxkLT5maWVsZF9uYW1lKTsKKwkJCQlfVElGRmZyZWUoZmxkKTsKKwkJCX0KKwkJfQorCisJCV9USUZGZnJlZSh0aWYtPnRpZl9maWVsZHMpOworCX0KKworICAgICAgICBpZiAodGlmLT50aWZfbmZpZWxkc2NvbXBhdCA+IDApIHsKKyAgICAgICAgICAgICAgICB1aW50MzIgaTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aWYtPnRpZl9uZmllbGRzY29tcGF0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWYtPnRpZl9maWVsZHNjb21wYXRbaV0uYWxsb2NhdGVkX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZSh0aWYtPnRpZl9maWVsZHNjb21wYXRbaV0uZmllbGRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX1RJRkZmcmVlKHRpZi0+dGlmX2ZpZWxkc2NvbXBhdCk7CisgICAgICAgIH0KKworCV9USUZGZnJlZSh0aWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRkNsb3NlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQ2xvc2UgYSBwcmV2aW91c2x5IG9wZW5lZCBUSUZGIGZpbGUuCisgKgorICogVElGRkNsb3NlIGNsb3NlcyBhIGZpbGUgdGhhdCB3YXMgcHJldmlvdXNseSBvcGVuZWQgd2l0aCBUSUZGT3BlbigpLgorICogQW55IGJ1ZmZlcmVkIGRhdGEgYXJlIGZsdXNoZWQgdG8gdGhlIGZpbGUsIGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YKKyAqIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoaWYgbW9kaWZpZWQpOyBhbmQgYWxsIHJlc291cmNlcyBhcmUgcmVjbGFpbWVkLgorICogCisgKiBAcGFyYW0gdGlmIEEgVElGRiBwb2ludGVyLgorICovCisKK3ZvaWQKK1RJRkZDbG9zZShUSUZGKiB0aWYpCit7CisJVElGRkNsb3NlUHJvYyBjbG9zZXByb2MgPSB0aWYtPnRpZl9jbG9zZXByb2M7CisJdGhhbmRsZV90IGZkID0gdGlmLT50aWZfY2xpZW50ZGF0YTsKKworCVRJRkZDbGVhbnVwKHRpZik7CisJKHZvaWQpICgqY2xvc2Vwcm9jKShmZCk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfY29kZWMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2NvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMjM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2NvZGVjLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qICRJZDogdGlmX2NvZGVjLmMsdiAxLjE1IDIwMTAtMTItMTQgMTI6NTM6MDAgZHJvbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeQorICoKKyAqIEJ1aWx0aW4gQ29tcHJlc3Npb24gU2NoZW1lIENvbmZpZ3VyYXRpb24gU3VwcG9ydC4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCitzdGF0aWMgaW50IE5vdENvbmZpZ3VyZWQoVElGRiosIGludCk7CisKKyNpZm5kZWYgTFpXX1NVUFBPUlQKKyNkZWZpbmUgVElGRkluaXRMWlcgTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIFBBQ0tCSVRTX1NVUFBPUlQKKyNkZWZpbmUgVElGRkluaXRQYWNrQml0cyBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgVEhVTkRFUl9TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0VGh1bmRlclNjYW4gTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIE5FWFRfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdE5lWFQgTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIEpQRUdfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdEpQRUcgTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIE9KUEVHX1NVUFBPUlQKKyNkZWZpbmUgVElGRkluaXRPSlBFRyBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgQ0NJVFRfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdENDSVRUUkxFIE5vdENvbmZpZ3VyZWQKKyNkZWZpbmUgVElGRkluaXRDQ0lUVFJMRVcgTm90Q29uZmlndXJlZAorI2RlZmluZSBUSUZGSW5pdENDSVRURmF4MyBOb3RDb25maWd1cmVkCisjZGVmaW5lIFRJRkZJbml0Q0NJVFRGYXg0IE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBKQklHX1NVUFBPUlQKKyNkZWZpbmUgVElGRkluaXRKQklHIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBaSVBfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdFpJUCBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgUElYQVJMT0dfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdFBpeGFyTG9nIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBMT0dMVVZfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdFNHSUxvZyBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgTFpNQV9TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0TFpNQSBOb3RDb25maWd1cmVkCisjZW5kaWYKKworLyoKKyAqIENvbXByZXNzaW9uIHNjaGVtZXMgc3RhdGljYWxseSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgorICovCisjaWZkZWYgVk1TCitjb25zdCBUSUZGQ29kZWMgX1RJRkZCdWlsdGluQ09ERUNTW10gPSB7CisjZWxzZQorVElGRkNvZGVjIF9USUZGQnVpbHRpbkNPREVDU1tdID0geworI2VuZGlmCisgICAgeyAiTm9uZSIsCQlDT01QUkVTU0lPTl9OT05FLAlUSUZGSW5pdER1bXBNb2RlIH0sCisgICAgeyAiTFpXIiwJCUNPTVBSRVNTSU9OX0xaVywJVElGRkluaXRMWlcgfSwKKyAgICB7ICJQYWNrQml0cyIsCUNPTVBSRVNTSU9OX1BBQ0tCSVRTLAlUSUZGSW5pdFBhY2tCaXRzIH0sCisgICAgeyAiVGh1bmRlclNjYW4iLAlDT01QUkVTU0lPTl9USFVOREVSU0NBTixUSUZGSW5pdFRodW5kZXJTY2FuIH0sCisgICAgeyAiTmVYVCIsCQlDT01QUkVTU0lPTl9ORVhULAlUSUZGSW5pdE5lWFQgfSwKKyAgICB7ICJKUEVHIiwJCUNPTVBSRVNTSU9OX0pQRUcsCVRJRkZJbml0SlBFRyB9LAorICAgIHsgIk9sZC1zdHlsZSBKUEVHIiwJQ09NUFJFU1NJT05fT0pQRUcsCVRJRkZJbml0T0pQRUcgfSwKKyAgICB7ICJDQ0lUVCBSTEUiLAlDT01QUkVTU0lPTl9DQ0lUVFJMRSwJVElGRkluaXRDQ0lUVFJMRSB9LAorICAgIHsgIkNDSVRUIFJMRS9XIiwJQ09NUFJFU1NJT05fQ0NJVFRSTEVXLAlUSUZGSW5pdENDSVRUUkxFVyB9LAorICAgIHsgIkNDSVRUIEdyb3VwIDMiLAlDT01QUkVTU0lPTl9DQ0lUVEZBWDMsCVRJRkZJbml0Q0NJVFRGYXgzIH0sCisgICAgeyAiQ0NJVFQgR3JvdXAgNCIsCUNPTVBSRVNTSU9OX0NDSVRURkFYNCwJVElGRkluaXRDQ0lUVEZheDQgfSwKKyAgICB7ICJJU08gSkJJRyIsCUNPTVBSRVNTSU9OX0pCSUcsCVRJRkZJbml0SkJJRyB9LAorICAgIHsgIkRlZmxhdGUiLAlDT01QUkVTU0lPTl9ERUZMQVRFLAlUSUZGSW5pdFpJUCB9LAorICAgIHsgIkFkb2JlRGVmbGF0ZSIsICAgQ09NUFJFU1NJT05fQURPQkVfREVGTEFURSAsIFRJRkZJbml0WklQIH0sIAorICAgIHsgIlBpeGFyTG9nIiwJQ09NUFJFU1NJT05fUElYQVJMT0csCVRJRkZJbml0UGl4YXJMb2cgfSwKKyAgICB7ICJTR0lMb2ciLAkJQ09NUFJFU1NJT05fU0dJTE9HLAlUSUZGSW5pdFNHSUxvZyB9LAorICAgIHsgIlNHSUxvZzI0IiwJQ09NUFJFU1NJT05fU0dJTE9HMjQsCVRJRkZJbml0U0dJTG9nIH0sCisgICAgeyAiTFpNQSIsCQlDT01QUkVTU0lPTl9MWk1BLAlUSUZGSW5pdExaTUEgfSwKKyAgICB7IE5VTEwsICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIE5VTEwgfQorfTsKKworc3RhdGljIGludAorX25vdENvbmZpZ3VyZWQoVElGRiogdGlmKQoreworCWNvbnN0IFRJRkZDb2RlYyogYyA9IFRJRkZGaW5kQ09ERUModGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uKTsKKyAgICAgICAgY2hhciBjb21wcmVzc2lvbl9jb2RlWzIwXTsKKyAgICAgICAgCisgICAgICAgIHNwcmludGYoIGNvbXByZXNzaW9uX2NvZGUsICIlZCIsIHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiApOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIiVzIGNvbXByZXNzaW9uIHN1cHBvcnQgaXMgbm90IGNvbmZpZ3VyZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgIGMgPyBjLT5uYW1lIDogY29tcHJlc3Npb25fY29kZSApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK05vdENvbmZpZ3VyZWQoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisKKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBfbm90Q29uZmlndXJlZDsKKwl0aWYtPnRpZl9kZWNvZGVzdGF0dXMgPSBGQUxTRTsKKwl0aWYtPnRpZl9zZXR1cGRlY29kZSA9IF9ub3RDb25maWd1cmVkOworCXRpZi0+dGlmX2VuY29kZXN0YXR1cyA9IEZBTFNFOworCXRpZi0+dGlmX3NldHVwZW5jb2RlID0gX25vdENvbmZpZ3VyZWQ7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBUSUZGSXNDT0RFQ0NvbmZpZ3VyZWQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB3b3JraW5nIGNvZGVjIGZvciB0aGUgc3BlY2lmaWMgY29kaW5nIHNjaGVtZS4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgMSBpZiB0aGUgY29kZWMgaXMgY29uZmlndXJlZCBhbmQgd29ya2luZy4gT3RoZXJ3aXNlCisgKiAwIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KKworaW50CitUSUZGSXNDT0RFQ0NvbmZpZ3VyZWQodWludDE2IHNjaGVtZSkKK3sKKwljb25zdCBUSUZGQ29kZWMqIGNvZGVjID0gVElGRkZpbmRDT0RFQyhzY2hlbWUpOworCisJaWYoY29kZWMgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYoY29kZWMtPmluaXQgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYoY29kZWMtPmluaXQgIT0gTm90Q29uZmlndXJlZCl7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2NvbG9yLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9jb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZWZmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9jb2xvci5jCkBAIC0wLDAgKzEsMjg5IEBACisvKiAkSWQ6IHRpZl9jb2xvci5jLHYgMS4xOSAyMDEwLTEyLTE0IDAyOjIyOjQyIGZheGd1eSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENJRSBMKmEqYiogdG8gQ0lFIFhZWiBhbmQgQ0lFIFhZWiB0byBSR0IgY29udmVyc2lvbiByb3V0aW5lcyBhcmUgdGFrZW4KKyAqIGZyb20gdGhlIFZJUFMgbGlicmFyeSAoaHR0cDovL3d3dy52aXBzLmVjcy5zb3Rvbi5hYy51aykgd2l0aAorICogdGhlIHBlcm1pc3Npb24gb2YgSm9obiBDdXBpdHQsIHRoZSBWSVBTIGF1dGhvci4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qCisgKiBDb252ZXJ0IGNvbG9yIHZhbHVlIGZyb20gdGhlIENJRSBMKmEqYiogMTk3NiBzcGFjZSB0byBDSUUgWFlaLgorICovCit2b2lkCitUSUZGQ0lFTGFiVG9YWVooVElGRkNJRUxhYlRvUkdCICpjaWVsYWIsIHVpbnQzMiBsLCBpbnQzMiBhLCBpbnQzMiBiLAorCQlmbG9hdCAqWCwgZmxvYXQgKlksIGZsb2F0ICpaKQoreworCWZsb2F0IEwgPSAoZmxvYXQpbCAqIDEwMC4wRiAvIDI1NS4wRjsKKwlmbG9hdCBjYnksIHRtcDsKKworCWlmKCBMIDwgOC44NTZGICkgeworCQkqWSA9IChMICogY2llbGFiLT5ZMCkgLyA5MDMuMjkyRjsKKwkJY2J5ID0gNy43ODdGICogKCpZIC8gY2llbGFiLT5ZMCkgKyAxNi4wRiAvIDExNi4wRjsKKwl9IGVsc2UgeworCQljYnkgPSAoTCArIDE2LjBGKSAvIDExNi4wRjsKKwkJKlkgPSBjaWVsYWItPlkwICogY2J5ICogY2J5ICogY2J5OworCX0KKworCXRtcCA9IChmbG9hdClhIC8gNTAwLjBGICsgY2J5OworCWlmKCB0bXAgPCAwLjIwNjlGICkKKwkJKlggPSBjaWVsYWItPlgwICogKHRtcCAtIDAuMTM3OTNGKSAvIDcuNzg3RjsKKwllbHNlICAgIAorCQkqWCA9IGNpZWxhYi0+WDAgKiB0bXAgKiB0bXAgKiB0bXA7CisKKwl0bXAgPSBjYnkgLSAoZmxvYXQpYiAvIDIwMC4wRjsKKwlpZiggdG1wIDwgMC4yMDY5RiApCisJCSpaID0gY2llbGFiLT5aMCAqICh0bXAgLSAwLjEzNzkzRikgLyA3Ljc4N0Y7CisJZWxzZSAgICAKKwkJKlogPSBjaWVsYWItPlowICogdG1wICogdG1wICogdG1wOworfQorCisjZGVmaW5lIFJJTlQoUikgKCh1aW50MzIpKChSKT4wPygoUikrMC41KTooKFIpLTAuNSkpKQorLyoKKyAqIENvbnZlcnQgY29sb3IgdmFsdWUgZnJvbSB0aGUgWFlaIHNwYWNlIHRvIFJHQi4KKyAqLwordm9pZAorVElGRlhZWlRvUkdCKFRJRkZDSUVMYWJUb1JHQiAqY2llbGFiLCBmbG9hdCBYLCBmbG9hdCBZLCBmbG9hdCBaLAorCSAgICAgdWludDMyICpyLCB1aW50MzIgKmcsIHVpbnQzMiAqYikKK3sKKwlpbnQgaTsKKwlmbG9hdCBZciwgWWcsIFliOworCWZsb2F0ICptYXRyaXggPSAmY2llbGFiLT5kaXNwbGF5LmRfbWF0WzBdWzBdOworCisJLyogTXVsdGlwbHkgdGhyb3VnaCB0aGUgbWF0cml4IHRvIGdldCBsdW1pbm9zaXR5IHZhbHVlcy4gKi8KKwlZciA9ICBtYXRyaXhbMF0gKiBYICsgbWF0cml4WzFdICogWSArIG1hdHJpeFsyXSAqIFo7CisJWWcgPSAgbWF0cml4WzNdICogWCArIG1hdHJpeFs0XSAqIFkgKyBtYXRyaXhbNV0gKiBaOworCVliID0gIG1hdHJpeFs2XSAqIFggKyBtYXRyaXhbN10gKiBZICsgbWF0cml4WzhdICogWjsKKworCS8qIENsaXAgaW5wdXQgKi8KKwlZciA9IFRJRkZtYXgoWXIsIGNpZWxhYi0+ZGlzcGxheS5kX1kwUik7CisJWWcgPSBUSUZGbWF4KFlnLCBjaWVsYWItPmRpc3BsYXkuZF9ZMEcpOworCVliID0gVElGRm1heChZYiwgY2llbGFiLT5kaXNwbGF5LmRfWTBCKTsKKworCS8qIEF2b2lkIG92ZXJmbG93IGluIGNhc2Ugb2Ygd3JvbmcgaW5wdXQgdmFsdWVzICovCisJWXIgPSBUSUZGbWluKFlyLCBjaWVsYWItPmRpc3BsYXkuZF9ZQ1IpOworCVlnID0gVElGRm1pbihZZywgY2llbGFiLT5kaXNwbGF5LmRfWUNHKTsKKwlZYiA9IFRJRkZtaW4oWWIsIGNpZWxhYi0+ZGlzcGxheS5kX1lDQik7CisKKwkvKiBUdXJuIGx1bWlub3NpdHkgdG8gY29sb3VyIHZhbHVlLiAqLworCWkgPSAoaW50KSgoWXIgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMFIpIC8gY2llbGFiLT5yc3RlcCk7CisJaSA9IFRJRkZtaW4oY2llbGFiLT5yYW5nZSwgaSk7CisJKnIgPSBSSU5UKGNpZWxhYi0+WXIycltpXSk7CisKKwlpID0gKGludCkoKFlnIC0gY2llbGFiLT5kaXNwbGF5LmRfWTBHKSAvIGNpZWxhYi0+Z3N0ZXApOworCWkgPSBUSUZGbWluKGNpZWxhYi0+cmFuZ2UsIGkpOworCSpnID0gUklOVChjaWVsYWItPllnMmdbaV0pOworCisJaSA9IChpbnQpKChZYiAtIGNpZWxhYi0+ZGlzcGxheS5kX1kwQikgLyBjaWVsYWItPmJzdGVwKTsKKwlpID0gVElGRm1pbihjaWVsYWItPnJhbmdlLCBpKTsKKwkqYiA9IFJJTlQoY2llbGFiLT5ZYjJiW2ldKTsKKworCS8qIENsaXAgb3V0cHV0LiAqLworCSpyID0gVElGRm1pbigqciwgY2llbGFiLT5kaXNwbGF5LmRfVnJ3cik7CisJKmcgPSBUSUZGbWluKCpnLCBjaWVsYWItPmRpc3BsYXkuZF9WcndnKTsKKwkqYiA9IFRJRkZtaW4oKmIsIGNpZWxhYi0+ZGlzcGxheS5kX1Zyd2IpOworfQorI3VuZGVmIFJJTlQKKworLyogCisgKiBBbGxvY2F0ZSBjb252ZXJzaW9uIHN0YXRlIHN0cnVjdHVyZXMgYW5kIG1ha2UgbG9va191cCB0YWJsZXMgZm9yCisgKiB0aGUgWXIsWWIsWWcgPD0+IHIsZyxiIGNvbnZlcnNpb25zLgorICovCitpbnQKK1RJRkZDSUVMYWJUb1JHQkluaXQoVElGRkNJRUxhYlRvUkdCKiBjaWVsYWIsCisJCSAgICBjb25zdCBUSUZGRGlzcGxheSAqZGlzcGxheSwgZmxvYXQgKnJlZldoaXRlKQoreworCWludCBpOworCWRvdWJsZSBnYW1tYTsKKworCWNpZWxhYi0+cmFuZ2UgPSBDSUVMQUJUT1JHQl9UQUJMRV9SQU5HRTsKKworCV9USUZGbWVtY3B5KCZjaWVsYWItPmRpc3BsYXksIGRpc3BsYXksIHNpemVvZihUSUZGRGlzcGxheSkpOworCisJLyogUmVkICovCisJZ2FtbWEgPSAxLjAgLyBjaWVsYWItPmRpc3BsYXkuZF9nYW1tYVIgOworCWNpZWxhYi0+cnN0ZXAgPQorCQkoY2llbGFiLT5kaXNwbGF5LmRfWUNSIC0gY2llbGFiLT5kaXNwbGF5LmRfWTBSKQkvIGNpZWxhYi0+cmFuZ2U7CisJZm9yKGkgPSAwOyBpIDw9IGNpZWxhYi0+cmFuZ2U7IGkrKykgeworCQljaWVsYWItPllyMnJbaV0gPSBjaWVsYWItPmRpc3BsYXkuZF9WcndyCisJCSAgICAqICgoZmxvYXQpcG93KChkb3VibGUpaSAvIGNpZWxhYi0+cmFuZ2UsIGdhbW1hKSk7CisJfQorCisJLyogR3JlZW4gKi8KKwlnYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hRyA7CisJY2llbGFiLT5nc3RlcCA9CisJICAgIChjaWVsYWItPmRpc3BsYXkuZF9ZQ1IgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMFIpIC8gY2llbGFiLT5yYW5nZTsKKwlmb3IoaSA9IDA7IGkgPD0gY2llbGFiLT5yYW5nZTsgaSsrKSB7CisJCWNpZWxhYi0+WWcyZ1tpXSA9IGNpZWxhYi0+ZGlzcGxheS5kX1Zyd2cKKwkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZ2FtbWEpKTsKKwl9CisKKwkvKiBCbHVlICovCisJZ2FtbWEgPSAxLjAgLyBjaWVsYWItPmRpc3BsYXkuZF9nYW1tYUIgOworCWNpZWxhYi0+YnN0ZXAgPQorCSAgICAoY2llbGFiLT5kaXNwbGF5LmRfWUNSIC0gY2llbGFiLT5kaXNwbGF5LmRfWTBSKSAvIGNpZWxhYi0+cmFuZ2U7CisJZm9yKGkgPSAwOyBpIDw9IGNpZWxhYi0+cmFuZ2U7IGkrKykgeworCQljaWVsYWItPlliMmJbaV0gPSBjaWVsYWItPmRpc3BsYXkuZF9WcndiCisJCSAgICAqICgoZmxvYXQpcG93KChkb3VibGUpaSAvIGNpZWxhYi0+cmFuZ2UsIGdhbW1hKSk7CisJfQorCisJLyogSW5pdCByZWZlcmVuY2Ugd2hpdGUgcG9pbnQgKi8KKwljaWVsYWItPlgwID0gcmVmV2hpdGVbMF07CisJY2llbGFiLT5ZMCA9IHJlZldoaXRlWzFdOworCWNpZWxhYi0+WjAgPSByZWZXaGl0ZVsyXTsKKworCXJldHVybiAwOworfQorCisvKiAKKyAqIENvbnZlcnQgY29sb3IgdmFsdWUgZnJvbSB0aGUgWUNiQ3Igc3BhY2UgdG8gQ0lFIFhZWi4KKyAqIFRoZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24gYWxnb3JpdGhtIGNvbWVzIGZyb20gdGhlIElKRyB2NWEgY29kZTsKKyAqIHNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgaXQgd29ya3MuCisgKi8KKyNkZWZpbmUJU0hJRlQJCQkxNgorI2RlZmluZQlGSVgoeCkJCQkoKGludDMyKSgoeCkgKiAoMUw8PFNISUZUKSArIDAuNSkpCisjZGVmaW5lCU9ORV9IQUxGCQkoKGludDMyKSgxPDwoU0hJRlQtMSkpKQorI2RlZmluZQlDb2RlMlYoYywgUkIsIFJXLCBDUikJKCgoKGMpLShpbnQzMikoUkIpKSooZmxvYXQpKENSKSkvKGZsb2F0KSgoKFJXKS0oUkIpKSA/ICgoUlcpLShSQikpIDogMSkpCisjZGVmaW5lCUNMQU1QKGYsbWluLG1heCkJKChmKTwobWluKT8obWluKTooZik+KG1heCk/KG1heCk6KGYpKQorI2RlZmluZSBISUNMQU1QKGYsbWF4KQkJKChmKT4obWF4KT8obWF4KTooZikpCisKK3ZvaWQKK1RJRkZZQ2JDcnRvUkdCKFRJRkZZQ2JDclRvUkdCICp5Y2JjciwgdWludDMyIFksIGludDMyIENiLCBpbnQzMiBDciwKKwkgICAgICAgdWludDMyICpyLCB1aW50MzIgKmcsIHVpbnQzMiAqYikKK3sKKwlpbnQzMiBpOworCisJLyogWFhYOiBPbmx5IDgtYml0IFlDYkNyIGlucHV0IHN1cHBvcnRlZCBmb3Igbm93ICovCisJWSA9IEhJQ0xBTVAoWSwgMjU1KSwgQ2IgPSBDTEFNUChDYiwgMCwgMjU1KSwgQ3IgPSBDTEFNUChDciwgMCwgMjU1KTsKKworCWkgPSB5Y2Jjci0+WV90YWJbWV0gKyB5Y2Jjci0+Q3Jfcl90YWJbQ3JdOworCSpyID0gQ0xBTVAoaSwgMCwgMjU1KTsKKwlpID0geWNiY3ItPllfdGFiW1ldCisJICAgICsgKGludCkoKHljYmNyLT5DYl9nX3RhYltDYl0gKyB5Y2Jjci0+Q3JfZ190YWJbQ3JdKSA+PiBTSElGVCk7CisJKmcgPSBDTEFNUChpLCAwLCAyNTUpOworCWkgPSB5Y2Jjci0+WV90YWJbWV0gKyB5Y2Jjci0+Q2JfYl90YWJbQ2JdOworCSpiID0gQ0xBTVAoaSwgMCwgMjU1KTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFlDYkNyLT5SR0IgY29udmVyc2lvbiB0YWJsZXMuICBUaGUgY29udmVyc2lvbgorICogaXMgZG9uZSBhY2NvcmRpbmcgdG8gdGhlIDYuMCBzcGVjOgorICoKKyAqICAgIFIgPSBZICsgQ3IqKDIgLSAyKkx1bWFSZWQpCisgKiAgICBCID0gWSArIENiKigyIC0gMipMdW1hQmx1ZSkKKyAqICAgIEcgPSAgIFkKKyAqICAgICAgICAtIEx1bWFCbHVlKkNiKigyLTIqTHVtYUJsdWUpL0x1bWFHcmVlbgorICogICAgICAgIC0gTHVtYVJlZCpDciooMi0yKkx1bWFSZWQpL0x1bWFHcmVlbgorICoKKyAqIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzIHRoYXQKKyAqIGNvbWUgb3V0IG9mIHRoZSBlcXVhdGlvbnMgYXJlIHJlcHJlc2VudGVkIGFzIGZpeGVkIHBvaW50IHZhbHVlcworICogaW4gdGhlIHJhbmdlIDAuLi4yXjE2LiAgV2UgYWxzbyBlbGltaW5hdGUgbXVsdGlwbGljYXRpb25zIGJ5CisgKiBwcmUtY2FsY3VsYXRpbmcgcG9zc2libGUgdmFsdWVzIGluZGV4ZWQgYnkgQ2IgYW5kIENyICh0aGlzIGNvZGUKKyAqIGFzc3VtZXMgY29udmVyc2lvbiBpcyBiZWluZyBkb25lIGZvciA4LWJpdCBzYW1wbGVzKS4KKyAqLworaW50CitUSUZGWUNiQ3JUb1JHQkluaXQoVElGRllDYkNyVG9SR0IqIHljYmNyLCBmbG9hdCAqbHVtYSwgZmxvYXQgKnJlZkJsYWNrV2hpdGUpCit7CisgICAgVElGRlJHQlZhbHVlKiBjbGFtcHRhYjsKKyAgICBpbnQgaTsKKyAgICAKKyNkZWZpbmUgTHVtYVJlZAkgICAgbHVtYVswXQorI2RlZmluZSBMdW1hR3JlZW4gICBsdW1hWzFdCisjZGVmaW5lIEx1bWFCbHVlICAgIGx1bWFbMl0KKworICAgIGNsYW1wdGFiID0gKFRJRkZSR0JWYWx1ZSopKAorCSh1aW50OCopIHljYmNyK1RJRkZyb3VuZHVwXzMyKHNpemVvZiAoVElGRllDYkNyVG9SR0IpLCBzaXplb2YgKGxvbmcpKSk7ICAKKyAgICBfVElGRm1lbXNldChjbGFtcHRhYiwgMCwgMjU2KTsJCS8qIHYgPCAwID0+IDAgKi8KKyAgICB5Y2Jjci0+Y2xhbXB0YWIgPSAoY2xhbXB0YWIgKz0gMjU2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJY2xhbXB0YWJbaV0gPSAoVElGRlJHQlZhbHVlKSBpOworICAgIF9USUZGbWVtc2V0KGNsYW1wdGFiKzI1NiwgMjU1LCAyKjI1Nik7CS8qIHYgPiAyNTUgPT4gMjU1ICovCisgICAgeWNiY3ItPkNyX3JfdGFiID0gKGludCopIChjbGFtcHRhYiArIDMqMjU2KTsKKyAgICB5Y2Jjci0+Q2JfYl90YWIgPSB5Y2Jjci0+Q3Jfcl90YWIgKyAyNTY7CisgICAgeWNiY3ItPkNyX2dfdGFiID0gKGludDMyKikgKHljYmNyLT5DYl9iX3RhYiArIDI1Nik7CisgICAgeWNiY3ItPkNiX2dfdGFiID0geWNiY3ItPkNyX2dfdGFiICsgMjU2OworICAgIHljYmNyLT5ZX3RhYiA9IHljYmNyLT5DYl9nX3RhYiArIDI1NjsKKworICAgIHsgZmxvYXQgZjEgPSAyLTIqTHVtYVJlZDsJCWludDMyIEQxID0gRklYKGYxKTsKKyAgICAgIGZsb2F0IGYyID0gTHVtYVJlZCpmMS9MdW1hR3JlZW47CWludDMyIEQyID0gLUZJWChmMik7CisgICAgICBmbG9hdCBmMyA9IDItMipMdW1hQmx1ZTsJCWludDMyIEQzID0gRklYKGYzKTsKKyAgICAgIGZsb2F0IGY0ID0gTHVtYUJsdWUqZjMvTHVtYUdyZWVuOwlpbnQzMiBENCA9IC1GSVgoZjQpOworICAgICAgaW50IHg7CisKKyN1bmRlZiBMdW1hQmx1ZQorI3VuZGVmIEx1bWFHcmVlbgorI3VuZGVmIEx1bWFSZWQKKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSBpbiB0aGUgcmFuZ2UgMC4uMjU1CisgICAgICAgKiBDYiBhbmQgQ3IgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgLTEyOC4uMTI3IChhY3R1YWxseQorICAgICAgICogdGhleSBhcmUgaW4gYSByYW5nZSBkZWZpbmVkIGJ5IHRoZSBSZWZlcmVuY2VCbGFja1doaXRlCisgICAgICAgKiB0YWcpIHNvIHRoZXJlIGlzIHNvbWUgcmFuZ2Ugc2hpZnRpbmcgdG8gZG8gaGVyZSB3aGVuCisgICAgICAgKiBjb25zdHJ1Y3RpbmcgdGFibGVzIGluZGV4ZWQgYnkgdGhlIHJhdyBwaXhlbCBkYXRhLgorICAgICAgICovCisgICAgICBmb3IgKGkgPSAwLCB4ID0gLTEyODsgaSA8IDI1NjsgaSsrLCB4KyspIHsKKwkgICAgaW50MzIgQ3IgPSAoaW50MzIpQ29kZTJWKHgsIHJlZkJsYWNrV2hpdGVbNF0gLSAxMjguMEYsCisJCQkgICAgcmVmQmxhY2tXaGl0ZVs1XSAtIDEyOC4wRiwgMTI3KTsKKwkgICAgaW50MzIgQ2IgPSAoaW50MzIpQ29kZTJWKHgsIHJlZkJsYWNrV2hpdGVbMl0gLSAxMjguMEYsCisJCQkgICAgcmVmQmxhY2tXaGl0ZVszXSAtIDEyOC4wRiwgMTI3KTsKKworCSAgICB5Y2Jjci0+Q3Jfcl90YWJbaV0gPSAoaW50MzIpKChEMSpDciArIE9ORV9IQUxGKT4+U0hJRlQpOworCSAgICB5Y2Jjci0+Q2JfYl90YWJbaV0gPSAoaW50MzIpKChEMypDYiArIE9ORV9IQUxGKT4+U0hJRlQpOworCSAgICB5Y2Jjci0+Q3JfZ190YWJbaV0gPSBEMipDcjsKKwkgICAgeWNiY3ItPkNiX2dfdGFiW2ldID0gRDQqQ2IgKyBPTkVfSEFMRjsKKwkgICAgeWNiY3ItPllfdGFiW2ldID0KKwkJICAgIChpbnQzMilDb2RlMlYoeCArIDEyOCwgcmVmQmxhY2tXaGl0ZVswXSwgcmVmQmxhY2tXaGl0ZVsxXSwgMjU1KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyN1bmRlZglISUNMQU1QCisjdW5kZWYJQ0xBTVAKKyN1bmRlZglDb2RlMlYKKyN1bmRlZglTSElGVAorI3VuZGVmCU9ORV9IQUxGCisjdW5kZWYJRklYCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2NvbXByZXNzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmI0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9jb21wcmVzcy5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiAkSWQ6IHRpZl9jb21wcmVzcy5jLHYgMS4yMiAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5CisgKgorICogQ29tcHJlc3Npb24gU2NoZW1lIENvbmZpZ3VyYXRpb24gU3VwcG9ydC4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCitzdGF0aWMgaW50CitUSUZGTm9FbmNvZGUoVElGRiogdGlmLCBjb25zdCBjaGFyKiBtZXRob2QpCit7CisJY29uc3QgVElGRkNvZGVjKiBjID0gVElGRkZpbmRDT0RFQyh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24pOworCisJaWYgKGMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICIlcyAlcyBlbmNvZGluZyBpcyBub3QgaW1wbGVtZW50ZWQiLAorCQkJICAgICBjLT5uYW1lLCBtZXRob2QpOworCX0gZWxzZSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJIkNvbXByZXNzaW9uIHNjaGVtZSAldSAlcyBlbmNvZGluZyBpcyBub3QgaW1wbGVtZW50ZWQiLAorCQkJICAgICB0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24sIG1ldGhvZCk7CisJfQorCXJldHVybiAoLTEpOworfQorCitpbnQKK19USUZGTm9Sb3dFbmNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwkodm9pZCkgcHA7ICh2b2lkKSBjYzsgKHZvaWQpIHM7CisJcmV0dXJuIChUSUZGTm9FbmNvZGUodGlmLCAic2NhbmxpbmUiKSk7Cit9CisKK2ludAorX1RJRkZOb1N0cmlwRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJKHZvaWQpIHBwOyAodm9pZCkgY2M7ICh2b2lkKSBzOworCXJldHVybiAoVElGRk5vRW5jb2RlKHRpZiwgInN0cmlwIikpOworfQorCitpbnQKK19USUZGTm9UaWxlRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJKHZvaWQpIHBwOyAodm9pZCkgY2M7ICh2b2lkKSBzOworCXJldHVybiAoVElGRk5vRW5jb2RlKHRpZiwgInRpbGUiKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZOb0RlY29kZShUSUZGKiB0aWYsIGNvbnN0IGNoYXIqIG1ldGhvZCkKK3sKKwljb25zdCBUSUZGQ29kZWMqIGMgPSBUSUZGRmluZENPREVDKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbik7CisKKwlpZiAoYykKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICIlcyAlcyBkZWNvZGluZyBpcyBub3QgaW1wbGVtZW50ZWQiLAorCQkJICAgICBjLT5uYW1lLCBtZXRob2QpOworCWVsc2UKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICJDb21wcmVzc2lvbiBzY2hlbWUgJXUgJXMgZGVjb2RpbmcgaXMgbm90IGltcGxlbWVudGVkIiwKKwkJCSAgICAgdGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uLCBtZXRob2QpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK19USUZGTm9GaXh1cFRhZ3MoVElGRiogdGlmKQoreworCSh2b2lkKSB0aWY7CisJcmV0dXJuICgxKTsKK30KKworaW50CitfVElGRk5vUm93RGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJKHZvaWQpIHBwOyAodm9pZCkgY2M7ICh2b2lkKSBzOworCXJldHVybiAoVElGRk5vRGVjb2RlKHRpZiwgInNjYW5saW5lIikpOworfQorCitpbnQKK19USUZGTm9TdHJpcERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCSh2b2lkKSBwcDsgKHZvaWQpIGNjOyAodm9pZCkgczsKKwlyZXR1cm4gKFRJRkZOb0RlY29kZSh0aWYsICJzdHJpcCIpKTsKK30KKworaW50CitfVElGRk5vVGlsZURlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCSh2b2lkKSBwcDsgKHZvaWQpIGNjOyAodm9pZCkgczsKKwlyZXR1cm4gKFRJRkZOb0RlY29kZSh0aWYsICJ0aWxlIikpOworfQorCitpbnQKK19USUZGTm9TZWVrKFRJRkYqIHRpZiwgdWludDMyIG9mZikKK3sKKwkodm9pZCkgb2ZmOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkgICAgICJDb21wcmVzc2lvbiBhbGdvcml0aG0gZG9lcyBub3Qgc3VwcG9ydCByYW5kb20gYWNjZXNzIik7CisJcmV0dXJuICgwKTsKK30KKworaW50CitfVElGRk5vUHJlQ29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCSh2b2lkKSB0aWY7ICh2b2lkKSBzOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQgX1RJRkZ0cnVlKFRJRkYqIHRpZikgeyAodm9pZCkgdGlmOyByZXR1cm4gKDEpOyB9CitzdGF0aWMgdm9pZCBfVElGRnZvaWQoVElGRiogdGlmKSB7ICh2b2lkKSB0aWY7IH0KKwordm9pZAorX1RJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZShUSUZGKiB0aWYpCit7CisJdGlmLT50aWZfZml4dXB0YWdzID0gX1RJRkZOb0ZpeHVwVGFnczsgCisJdGlmLT50aWZfZGVjb2Rlc3RhdHVzID0gVFJVRTsKKwl0aWYtPnRpZl9zZXR1cGRlY29kZSA9IF9USUZGdHJ1ZTsKKwl0aWYtPnRpZl9wcmVkZWNvZGUgPSBfVElGRk5vUHJlQ29kZTsKKwl0aWYtPnRpZl9kZWNvZGVyb3cgPSBfVElGRk5vUm93RGVjb2RlOyAgCisJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBfVElGRk5vU3RyaXBEZWNvZGU7CisJdGlmLT50aWZfZGVjb2RldGlsZSA9IF9USUZGTm9UaWxlRGVjb2RlOyAgCisJdGlmLT50aWZfZW5jb2Rlc3RhdHVzID0gVFJVRTsKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IF9USUZGdHJ1ZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBfVElGRk5vUHJlQ29kZTsKKwl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gX1RJRkZ0cnVlOworCXRpZi0+dGlmX2VuY29kZXJvdyA9IF9USUZGTm9Sb3dFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBfVElGRk5vU3RyaXBFbmNvZGU7ICAKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gX1RJRkZOb1RpbGVFbmNvZGU7ICAKKwl0aWYtPnRpZl9jbG9zZSA9IF9USUZGdm9pZDsKKwl0aWYtPnRpZl9zZWVrID0gX1RJRkZOb1NlZWs7CisJdGlmLT50aWZfY2xlYW51cCA9IF9USUZGdm9pZDsKKwl0aWYtPnRpZl9kZWZzdHJpcHNpemUgPSBfVElGRkRlZmF1bHRTdHJpcFNpemU7CisJdGlmLT50aWZfZGVmdGlsZXNpemUgPSBfVElGRkRlZmF1bHRUaWxlU2l6ZTsKKwl0aWYtPnRpZl9mbGFncyAmPSB+KFRJRkZfTk9CSVRSRVZ8VElGRl9OT1JFQURSQVcpOworfQorCitpbnQKK1RJRkZTZXRDb21wcmVzc2lvblNjaGVtZShUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJY29uc3QgVElGRkNvZGVjICpjID0gVElGRkZpbmRDT0RFQygodWludDE2KSBzY2hlbWUpOworCisJX1RJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZSh0aWYpOworCS8qCisJICogRG9uJ3QgdHJlYXQgYW4gdW5rbm93biBjb21wcmVzc2lvbiBzY2hlbWUgYXMgYW4gZXJyb3IuCisJICogVGhpcyBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0byBvcGVuIGZpbGVzIHdpdGggZGF0YSB0aGF0CisJICogdGhlIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSBidWlsdGluIHN1cHBvcnQgZm9yLCBidXQgd2hpY2gKKwkgKiBtYXkgc3RpbGwgYmUgbWVhbmluZ2Z1bC4KKwkgKi8KKwlyZXR1cm4gKGMgPyAoKmMtPmluaXQpKHRpZiwgc2NoZW1lKSA6IDEpOworfQorCisvKgorICogT3RoZXIgY29tcHJlc3Npb24gc2NoZW1lcyBtYXkgYmUgcmVnaXN0ZXJlZC4gIFJlZ2lzdGVyZWQKKyAqIHNjaGVtZXMgY2FuIGFsc28gb3ZlcnJpZGUgdGhlIGJ1aWx0aW4gdmVyc2lvbnMgcHJvdmlkZWQKKyAqIGJ5IHRoaXMgbGlicmFyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2NvZGVjIHsKKwlzdHJ1Y3QgX2NvZGVjKiBuZXh0OworCVRJRkZDb2RlYyogaW5mbzsKK30gY29kZWNfdDsKK3N0YXRpYyBjb2RlY190KiByZWdpc3RlcmVkQ09ERUNTID0gTlVMTDsKKworY29uc3QgVElGRkNvZGVjKgorVElGRkZpbmRDT0RFQyh1aW50MTYgc2NoZW1lKQoreworCWNvbnN0IFRJRkZDb2RlYyogYzsKKwljb2RlY190KiBjZDsKKworCWZvciAoY2QgPSByZWdpc3RlcmVkQ09ERUNTOyBjZDsgY2QgPSBjZC0+bmV4dCkKKwkJaWYgKGNkLT5pbmZvLT5zY2hlbWUgPT0gc2NoZW1lKQorCQkJcmV0dXJuICgoY29uc3QgVElGRkNvZGVjKikgY2QtPmluZm8pOworCWZvciAoYyA9IF9USUZGQnVpbHRpbkNPREVDUzsgYy0+bmFtZTsgYysrKQorCQlpZiAoYy0+c2NoZW1lID09IHNjaGVtZSkKKwkJCXJldHVybiAoYyk7CisJcmV0dXJuICgoY29uc3QgVElGRkNvZGVjKikgMCk7Cit9CisKK1RJRkZDb2RlYyoKK1RJRkZSZWdpc3RlckNPREVDKHVpbnQxNiBzY2hlbWUsIGNvbnN0IGNoYXIqIG5hbWUsIFRJRkZJbml0TWV0aG9kIGluaXQpCit7CisJY29kZWNfdCogY2QgPSAoY29kZWNfdCopCisJICAgIF9USUZGbWFsbG9jKCh0bXNpemVfdCkoc2l6ZW9mIChjb2RlY190KSArIHNpemVvZiAoVElGRkNvZGVjKSArIHN0cmxlbihuYW1lKSsxKSk7CisKKwlpZiAoY2QgIT0gTlVMTCkgeworCQljZC0+aW5mbyA9IChUSUZGQ29kZWMqKSAoKHVpbnQ4KikgY2QgKyBzaXplb2YgKGNvZGVjX3QpKTsKKwkJY2QtPmluZm8tPm5hbWUgPSAoY2hhciopCisJCSAgICAoKHVpbnQ4KikgY2QtPmluZm8gKyBzaXplb2YgKFRJRkZDb2RlYykpOworCQlzdHJjcHkoY2QtPmluZm8tPm5hbWUsIG5hbWUpOworCQljZC0+aW5mby0+c2NoZW1lID0gc2NoZW1lOworCQljZC0+aW5mby0+aW5pdCA9IGluaXQ7CisJCWNkLT5uZXh0ID0gcmVnaXN0ZXJlZENPREVDUzsKKwkJcmVnaXN0ZXJlZENPREVDUyA9IGNkOworCX0gZWxzZSB7CisJCVRJRkZFcnJvckV4dCgwLCAiVElGRlJlZ2lzdGVyQ09ERUMiLAorCQkgICAgIk5vIHNwYWNlIHRvIHJlZ2lzdGVyIGNvbXByZXNzaW9uIHNjaGVtZSAlcyIsIG5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIChjZC0+aW5mbyk7Cit9CisKK3ZvaWQKK1RJRkZVblJlZ2lzdGVyQ09ERUMoVElGRkNvZGVjKiBjKQoreworCWNvZGVjX3QqIGNkOworCWNvZGVjX3QqKiBwY2Q7CisKKwlmb3IgKHBjZCA9ICZyZWdpc3RlcmVkQ09ERUNTOyAoY2QgPSAqcGNkKTsgcGNkID0gJmNkLT5uZXh0KQorCQlpZiAoY2QtPmluZm8gPT0gYykgeworCQkJKnBjZCA9IGNkLT5uZXh0OworCQkJX1RJRkZmcmVlKGNkKTsKKwkJCXJldHVybjsKKwkJfQorCVRJRkZFcnJvckV4dCgwLCAiVElGRlVuUmVnaXN0ZXJDT0RFQyIsCisJICAgICJDYW5ub3QgcmVtb3ZlIGNvbXByZXNzaW9uIHNjaGVtZSAlczsgbm90IHJlZ2lzdGVyZWQiLCBjLT5uYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBUSUZGR2V0Q29uZmlzdXJlZENPREVDcygpICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEdldCBsaXN0IG9mIGNvbmZpZ3VyZWQgY29kZWNzLCBib3RoIGJ1aWx0LWluIGFuZCByZWdpc3RlcmVkIGJ5IHVzZXIuCisgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZnJlZSB0aGlzIHN0cnVjdHVyZS4KKyAqIAorICogQHJldHVybiByZXR1cm5zIGFycmF5IG9mIFRJRkZDb2RlYyByZWNvcmRzICh0aGUgbGFzdCByZWNvcmQgc2hvdWxkIGJlIE5VTEwpCisgKiBvciBOVUxMIGlmIGZ1bmN0aW9uIGZhaWxlZC4KKyAqLworCitUSUZGQ29kZWMqCitUSUZGR2V0Q29uZmlndXJlZENPREVDcygpCit7CisJaW50IGkgPSAxOworCWNvZGVjX3QgKmNkOworCWNvbnN0IFRJRkZDb2RlYyogYzsKKwlUSUZGQ29kZWMqIGNvZGVjcyA9IE5VTEw7CisJVElGRkNvZGVjKiBuZXdfY29kZWNzOworCisJZm9yIChjZCA9IHJlZ2lzdGVyZWRDT0RFQ1M7IGNkOyBjZCA9IGNkLT5uZXh0KSB7CisJCW5ld19jb2RlY3MgPSAoVElGRkNvZGVjICopCisJCQlfVElGRnJlYWxsb2MoY29kZWNzLCBpICogc2l6ZW9mKFRJRkZDb2RlYykpOworCQlpZiAoIW5ld19jb2RlY3MpIHsKKwkJCV9USUZGZnJlZSAoY29kZWNzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWNvZGVjcyA9IG5ld19jb2RlY3M7CisJCV9USUZGbWVtY3B5KGNvZGVjcyArIGkgLSAxLCBjZCwgc2l6ZW9mKFRJRkZDb2RlYykpOworCQlpKys7CisJfQorCWZvciAoYyA9IF9USUZGQnVpbHRpbkNPREVDUzsgYy0+bmFtZTsgYysrKSB7CisJCWlmIChUSUZGSXNDT0RFQ0NvbmZpZ3VyZWQoYy0+c2NoZW1lKSkgeworCQkJbmV3X2NvZGVjcyA9IChUSUZGQ29kZWMgKikKKwkJCQlfVElGRnJlYWxsb2MoY29kZWNzLCBpICogc2l6ZW9mKFRJRkZDb2RlYykpOworCQkJaWYgKCFuZXdfY29kZWNzKSB7CisJCQkJX1RJRkZmcmVlIChjb2RlY3MpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJY29kZWNzID0gbmV3X2NvZGVjczsKKwkJCV9USUZGbWVtY3B5KGNvZGVjcyArIGkgLSAxLCAoY29uc3Qgdm9pZCopYywgc2l6ZW9mKFRJRkZDb2RlYykpOworCQkJaSsrOworCQl9CisJfQorCisJbmV3X2NvZGVjcyA9IChUSUZGQ29kZWMgKikgX1RJRkZyZWFsbG9jKGNvZGVjcywgaSAqIHNpemVvZihUSUZGQ29kZWMpKTsKKwlpZiAoIW5ld19jb2RlY3MpIHsKKwkJX1RJRkZmcmVlIChjb2RlY3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY29kZWNzID0gbmV3X2NvZGVjczsKKwlfVElGRm1lbXNldChjb2RlY3MgKyBpIC0gMSwgMCwgc2l6ZW9mKFRJRkZDb2RlYykpOworCisJcmV0dXJuIGNvZGVjczsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZGlyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZkOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZGlyLmMKQEAgLTAsMCArMSwxNjYyIEBACisvKiAkSWQ6IHRpZl9kaXIuYyx2IDEuMTEzIDIwMTItMDYtMTQgMjA6MzI6NTMgZndhcm1lcmRhbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBEaXJlY3RvcnkgVGFnIEdldCAmIFNldCBSb3V0aW5lcy4KKyAqIChhbmQgYWxzbyBzb21lIG1pc2NlbGxhbmVvdXMgc3R1ZmYpCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb2RlLi4uCisgKi8KKyNkZWZpbmUgREFUQVRZUEVfVk9JRAkJMCAgICAgICAvKiAhdW50eXBlZCBkYXRhICovCisjZGVmaW5lIERBVEFUWVBFX0lOVAkJMSAgICAgICAvKiAhc2lnbmVkIGludGVnZXIgZGF0YSAqLworI2RlZmluZSBEQVRBVFlQRV9VSU5UCQkyICAgICAgIC8qICF1bnNpZ25lZCBpbnRlZ2VyIGRhdGEgKi8KKyNkZWZpbmUgREFUQVRZUEVfSUVFRUZQCQkzICAgICAgIC8qICFJRUVFIGZsb2F0aW5nIHBvaW50IGRhdGEgKi8KKworc3RhdGljIHZvaWQKK3NldEJ5dGVBcnJheSh2b2lkKiogdnBwLCB2b2lkKiB2cCwgc2l6ZV90IG5tZW1iLCBzaXplX3QgZWxlbV9zaXplKQoreworCWlmICgqdnBwKQorCQlfVElGRmZyZWUoKnZwcCksICp2cHAgPSAwOworCWlmICh2cCkgeworCQl0bXNpemVfdCBieXRlcyA9ICh0bXNpemVfdCkobm1lbWIgKiBlbGVtX3NpemUpOworCQlpZiAoZWxlbV9zaXplICYmIGJ5dGVzIC8gZWxlbV9zaXplID09IG5tZW1iKQorCQkJKnZwcCA9ICh2b2lkKikgX1RJRkZtYWxsb2MoYnl0ZXMpOworCQlpZiAoKnZwcCkKKwkJCV9USUZGbWVtY3B5KCp2cHAsIHZwLCBieXRlcyk7CisJfQorfQordm9pZCBfVElGRnNldEJ5dGVBcnJheSh2b2lkKiogdnBwLCB2b2lkKiB2cCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkodnBwLCB2cCwgbiwgMSk7IH0KK3ZvaWQgX1RJRkZzZXRTdHJpbmcoY2hhcioqIGNwcCwgY2hhciogY3ApCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgY3BwLCAodm9pZCopIGNwLCBzdHJsZW4oY3ApKzEsIDEpOyB9Cit2b2lkIF9USUZGc2V0TlN0cmluZyhjaGFyKiogY3BwLCBjaGFyKiBjcCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgY3BwLCAodm9pZCopIGNwLCBuLCAxKTsgfQordm9pZCBfVElGRnNldFNob3J0QXJyYXkodWludDE2Kiogd3BwLCB1aW50MTYqIHdwLCB1aW50MzIgbikKKyAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSB3cHAsICh2b2lkKikgd3AsIG4sIHNpemVvZiAodWludDE2KSk7IH0KK3ZvaWQgX1RJRkZzZXRMb25nQXJyYXkodWludDMyKiogbHBwLCB1aW50MzIqIGxwLCB1aW50MzIgbikKKyAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBscHAsICh2b2lkKikgbHAsIG4sIHNpemVvZiAodWludDMyKSk7IH0KK3ZvaWQgX1RJRkZzZXRMb25nOEFycmF5KHVpbnQ2NCoqIGxwcCwgdWludDY0KiBscCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgbHBwLCAodm9pZCopIGxwLCBuLCBzaXplb2YgKHVpbnQ2NCkpOyB9Cit2b2lkIF9USUZGc2V0RmxvYXRBcnJheShmbG9hdCoqIGZwcCwgZmxvYXQqIGZwLCB1aW50MzIgbikKKyAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBmcHAsICh2b2lkKikgZnAsIG4sIHNpemVvZiAoZmxvYXQpKTsgfQordm9pZCBfVElGRnNldERvdWJsZUFycmF5KGRvdWJsZSoqIGRwcCwgZG91YmxlKiBkcCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgZHBwLCAodm9pZCopIGRwLCBuLCBzaXplb2YgKGRvdWJsZSkpOyB9CisKK3N0YXRpYyB2b2lkCitzZXREb3VibGVBcnJheU9uZVZhbHVlKGRvdWJsZSoqIHZwcCwgZG91YmxlIHZhbHVlLCBzaXplX3Qgbm1lbWIpCit7CisJaWYgKCp2cHApCisJCV9USUZGZnJlZSgqdnBwKTsKKwkqdnBwID0gX1RJRkZtYWxsb2Mobm1lbWIqc2l6ZW9mKGRvdWJsZSkpOworCWlmICgqdnBwKQorCXsKKwkJd2hpbGUgKG5tZW1iLS0pCisJCQkoKGRvdWJsZSopKnZwcClbbm1lbWJdID0gdmFsdWU7CisJfQorfQorCisvKgorICogSW5zdGFsbCBleHRyYSBzYW1wbGVzIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgaW50CitzZXRFeHRyYVNhbXBsZXMoVElGRkRpcmVjdG9yeSogdGQsIHZhX2xpc3QgYXAsIHVpbnQzMiogdikKK3sKKy8qIFhYWDogVW5hc3NvY2lhdGVkIGFscGhhIGRhdGEgPT0gOTk5IGlzIGEga25vd24gQ29yZWwgRHJhdyBidWcsIHNlZSBiZWxvdyAqLworI2RlZmluZSBFWFRSQVNBTVBMRV9DT1JFTF9VTkFTU0FMUEhBIDk5OSAKKworCXVpbnQxNiogdmE7CisJdWludDMyIGk7CisKKwkqdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJaWYgKCh1aW50MTYpICp2ID4gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCkKKwkJcmV0dXJuIDA7CisJdmEgPSB2YV9hcmcoYXAsIHVpbnQxNiopOworCWlmICgqdiA+IDAgJiYgdmEgPT0gTlVMTCkJCS8qIHR5cGljYWxseSBtaXNzaW5nIHBhcmFtICovCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCAqdjsgaSsrKSB7CisJCWlmICh2YVtpXSA+IEVYVFJBU0FNUExFX1VOQVNTQUxQSEEpIHsKKwkJCS8qCisJCQkgKiBYWFg6IENvcmVsIERyYXcgaXMga25vd24gdG8gcHJvZHVjZSBpbmNvcnJlY3QKKwkJCSAqIEV4dHJhU2FtcGxlcyB0YWdzIHdoaWNoIG11c3QgYmUgcGF0Y2hlZCBoZXJlIGlmIHdlCisJCQkgKiB3YW50IHRvIGJlIGFibGUgdG8gb3BlbiBzb21lIG9mIHRoZSBkYW1hZ2VkIFRJRkYKKwkJCSAqIGZpbGVzOiAKKwkJCSAqLworCQkJaWYgKHZhW2ldID09IEVYVFJBU0FNUExFX0NPUkVMX1VOQVNTQUxQSEEpCisJCQkJdmFbaV0gPSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXRkLT50ZF9leHRyYXNhbXBsZXMgPSAodWludDE2KSAqdjsKKwlfVElGRnNldFNob3J0QXJyYXkoJnRkLT50ZF9zYW1wbGVpbmZvLCB2YSwgdGQtPnRkX2V4dHJhc2FtcGxlcyk7CisJcmV0dXJuIDE7CisKKyN1bmRlZiBFWFRSQVNBTVBMRV9DT1JFTF9VTkFTU0FMUEhBCit9CisKKy8qCisgKiBDb25maXJtIHdlIGhhdmUgInNhbXBsZXNwZXJwaXhlbCIgaW5rIG5hbWVzIHNlcGFyYXRlZCBieSBcMC4gIFJldHVybnMgCisgKiB6ZXJvIGlmIHRoZSBpbmsgbmFtZXMgYXJlIG5vdCBhcyBleHBlY3RlZC4KKyAqLworc3RhdGljIHVpbnQzMgorY2hlY2tJbmtOYW1lc1N0cmluZyhUSUZGKiB0aWYsIHVpbnQzMiBzbGVuLCBjb25zdCBjaGFyKiBzKQoreworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50MTYgaSA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisKKwlpZiAoc2xlbiA+IDApIHsKKwkJY29uc3QgY2hhciogZXAgPSBzK3NsZW47CisJCWNvbnN0IGNoYXIqIGNwID0gczsKKwkJZm9yICg7IGkgPiAwOyBpLS0pIHsKKwkJCWZvciAoOyBjcCA8IGVwICYmICpjcCAhPSAnXDAnOyBjcCsrKSB7fQorCQkJaWYgKGNwID49IGVwKQorCQkJCWdvdG8gYmFkOworCQkJY3ArKzsJCQkJLyogc2tpcCBcMCAqLworCQl9CisJCXJldHVybiAoKHVpbnQzMikoY3AtcykpOworCX0KK2JhZDoKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZTZXRGaWVsZCIsCisJICAgICIlczogSW52YWxpZCBJbmtOYW1lcyB2YWx1ZTsgZXhwZWN0aW5nICVkIG5hbWVzLCBmb3VuZCAlZCIsCisJICAgIHRpZi0+dGlmX25hbWUsCisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsCisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwtaSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorX1RJRkZWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIl9USUZGVlNldEZpZWxkIjsKKworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwlpbnQgc3RhdHVzID0gMTsKKwl1aW50MzIgdjMyLCBpLCB2OworCWNoYXIqIHM7CisJY29uc3QgVElGRkZpZWxkICpmaXAgPSBUSUZGRmluZEZpZWxkKHRpZiwgdGFnLCBUSUZGX0FOWSk7CisJdWludDMyIHN0YW5kYXJkX3RhZyA9IHRhZzsKKworCS8qCisJICogV2Ugd2FudCB0byBmb3JjZSB0aGUgY3VzdG9tIGNvZGUgdG8gYmUgdXNlZCBmb3IgY3VzdG9tCisJICogZmllbGRzIGV2ZW4gaWYgdGhlIHRhZyBoYXBwZW5zIHRvIG1hdGNoIGEgd2VsbCBrbm93biAKKwkgKiBvbmUgLSBpbXBvcnRhbnQgZm9yIHJlaW50ZXJwcmV0ZWQgaGFuZGxpbmcgb2Ygc3RhbmRhcmQKKwkgKiB0YWcgdmFsdWVzIGluIGN1c3RvbSBkaXJlY3RvcmllcyAoaWUuIEVYSUYpIAorCSAqLworCWlmIChmaXAtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00pIHsKKwkJc3RhbmRhcmRfdGFnID0gMDsKKwl9CisKKwlzd2l0Y2ggKHN0YW5kYXJkX3RhZykgeworCWNhc2UgVElGRlRBR19TVUJGSUxFVFlQRToKKwkJdGQtPnRkX3N1YmZpbGV0eXBlID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfSU1BR0VXSURUSDoKKwkJdGQtPnRkX2ltYWdld2lkdGggPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19JTUFHRUxFTkdUSDoKKwkJdGQtPnRkX2ltYWdlbGVuZ3RoID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQklUU1BFUlNBTVBMRToKKwkJdGQtPnRkX2JpdHNwZXJzYW1wbGUgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQkvKgorCQkgKiBJZiB0aGUgZGF0YSByZXF1aXJlIHBvc3QtZGVjb2RpbmcgcHJvY2Vzc2luZyB0byBieXRlLXN3YXAKKwkJICogc2FtcGxlcywgc2V0IGl0IHVwIGhlcmUuICBOb3RlIHRoYXQgc2luY2UgdGFncyBhcmUgcmVxdWlyZWQKKwkJICogdG8gYmUgb3JkZXJlZCwgY29tcHJlc3Npb24gY29kZSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIKKwkJICogaW4gdGhlIHNldHVwIG1ldGhvZCBpZiBpdCB3YW50cyB0byByb2xsIHRoZSBwb3N0IGRlY29kaW5nCisJCSAqIHdvcmsgaW4gd2l0aCBpdHMgbm9ybWFsIHdvcmsuCisJCSAqLworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpIHsKKwkJCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSA4KQorCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKwkJCWVsc2UgaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlID09IDE2KQorCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRlN3YWIxNkJpdERhdGE7CisJCQllbHNlIGlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSAyNCkKKwkJCQl0aWYtPnRpZl9wb3N0ZGVjb2RlID0gX1RJRkZTd2FiMjRCaXREYXRhOworCQkJZWxzZSBpZiAodGQtPnRkX2JpdHNwZXJzYW1wbGUgPT0gMzIpCisJCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGU3dhYjMyQml0RGF0YTsKKwkJCWVsc2UgaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlID09IDY0KQorCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRlN3YWI2NEJpdERhdGE7CisJCQllbHNlIGlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSAxMjgpIC8qIHR3byA2NCdzICovCisJCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGU3dhYjY0Qml0RGF0YTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQ09NUFJFU1NJT046CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQkvKgorCQkgKiBJZiB3ZSdyZSBjaGFuZ2luZyB0aGUgY29tcHJlc3Npb24gc2NoZW1lLCB0aGUgbm90aWZ5IHRoZQorCQkgKiBwcmV2aW91cyBtb2R1bGUgc28gdGhhdCBpdCBjYW4gY2xlYW51cCBhbnkgc3RhdGUgaXQncworCQkgKiBzZXR1cC4KKwkJICovCisJCWlmIChUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9DT01QUkVTU0lPTikpIHsKKwkJCWlmICgodWludDMyKXRkLT50ZF9jb21wcmVzc2lvbiA9PSB2KQorCQkJCWJyZWFrOworCQkJKCp0aWYtPnRpZl9jbGVhbnVwKSh0aWYpOworCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfQ09ERVJTRVRVUDsKKwkJfQorCQkvKgorCQkgKiBTZXR1cCBuZXcgY29tcHJlc3Npb24gcm91dGluZSBzdGF0ZS4KKwkJICovCisJCWlmKCAoc3RhdHVzID0gVElGRlNldENvbXByZXNzaW9uU2NoZW1lKHRpZiwgdikpICE9IDAgKQorCQkgICAgdGQtPnRkX2NvbXByZXNzaW9uID0gKHVpbnQxNikgdjsKKwkJZWxzZQorCQkgICAgc3RhdHVzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1BIT1RPTUVUUklDOgorCQl0ZC0+dGRfcGhvdG9tZXRyaWMgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfVEhSRVNISE9MRElORzoKKwkJdGQtPnRkX3RocmVzaGhvbGRpbmcgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfRklMTE9SREVSOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYgKHYgIT0gRklMTE9SREVSX0xTQjJNU0IgJiYgdiAhPSBGSUxMT1JERVJfTVNCMkxTQikKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9maWxsb3JkZXIgPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfT1JJRU5UQVRJT046CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlpZiAodiA8IE9SSUVOVEFUSU9OX1RPUExFRlQgfHwgT1JJRU5UQVRJT05fTEVGVEJPVCA8IHYpCisJCQlnb3RvIGJhZHZhbHVlOworCQllbHNlCisJCQl0ZC0+dGRfb3JpZW50YXRpb24gPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYgKHYgPT0gMCkKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfUk9XU1BFUlNUUklQOgorCQl2MzIgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWlmICh2MzIgPT0gMCkKKwkJCWdvdG8gYmFkdmFsdWUzMjsKKwkJdGQtPnRkX3Jvd3NwZXJzdHJpcCA9IHYzMjsKKwkJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9USUxFRElNRU5TSU9OUykpIHsKKwkJCXRkLT50ZF90aWxlbGVuZ3RoID0gdjMyOworCQkJdGQtPnRkX3RpbGV3aWR0aCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCQl9CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19NSU5TQU1QTEVWQUxVRToKKwkJdGQtPnRkX21pbnNhbXBsZXZhbHVlID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX01BWFNBTVBMRVZBTFVFOgorCQl0ZC0+dGRfbWF4c2FtcGxldmFsdWUgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFOgorCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkKKwkJCV9USUZGc2V0RG91YmxlQXJyYXkoJnRkLT50ZF9zbWluc2FtcGxldmFsdWUsIHZhX2FyZyhhcCwgZG91YmxlKiksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQllbHNlCisJCQlzZXREb3VibGVBcnJheU9uZVZhbHVlKCZ0ZC0+dGRfc21pbnNhbXBsZXZhbHVlLCB2YV9hcmcoYXAsIGRvdWJsZSksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU01BWFNBTVBMRVZBTFVFOgorCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkKKwkJCV9USUZGc2V0RG91YmxlQXJyYXkoJnRkLT50ZF9zbWF4c2FtcGxldmFsdWUsIHZhX2FyZyhhcCwgZG91YmxlKiksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQllbHNlCisJCQlzZXREb3VibGVBcnJheU9uZVZhbHVlKCZ0ZC0+dGRfc21heHNhbXBsZXZhbHVlLCB2YV9hcmcoYXAsIGRvdWJsZSksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWFJFU09MVVRJT046CisJCXRkLT50ZF94cmVzb2x1dGlvbiA9IChmbG9hdCkgdmFfYXJnKGFwLCBkb3VibGUpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWVJFU09MVVRJT046CisJCXRkLT50ZF95cmVzb2x1dGlvbiA9IChmbG9hdCkgdmFfYXJnKGFwLCBkb3VibGUpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfUExBTkFSQ09ORklHOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYgKHYgIT0gUExBTkFSQ09ORklHX0NPTlRJRyAmJiB2ICE9IFBMQU5BUkNPTkZJR19TRVBBUkFURSkKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9wbGFuYXJjb25maWcgPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWFBPU0lUSU9OOgorCQl0ZC0+dGRfeHBvc2l0aW9uID0gKGZsb2F0KSB2YV9hcmcoYXAsIGRvdWJsZSk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19ZUE9TSVRJT046CisJCXRkLT50ZF95cG9zaXRpb24gPSAoZmxvYXQpIHZhX2FyZyhhcCwgZG91YmxlKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1JFU09MVVRJT05VTklUOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYgKHYgPCBSRVNVTklUX05PTkUgfHwgUkVTVU5JVF9DRU5USU1FVEVSIDwgdikKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9yZXNvbHV0aW9udW5pdCA9ICh1aW50MTYpIHY7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19QQUdFTlVNQkVSOgorCQl0ZC0+dGRfcGFnZW51bWJlclswXSA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCXRkLT50ZF9wYWdlbnVtYmVyWzFdID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0hBTEZUT05FSElOVFM6CisJCXRkLT50ZF9oYWxmdG9uZWhpbnRzWzBdID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJdGQtPnRkX2hhbGZ0b25laGludHNbMV0gPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQ09MT1JNQVA6CisJCXYzMiA9ICh1aW50MzIpKDFMPDx0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCV9USUZGc2V0U2hvcnRBcnJheSgmdGQtPnRkX2NvbG9ybWFwWzBdLCB2YV9hcmcoYXAsIHVpbnQxNiopLCB2MzIpOworCQlfVElGRnNldFNob3J0QXJyYXkoJnRkLT50ZF9jb2xvcm1hcFsxXSwgdmFfYXJnKGFwLCB1aW50MTYqKSwgdjMyKTsKKwkJX1RJRkZzZXRTaG9ydEFycmF5KCZ0ZC0+dGRfY29sb3JtYXBbMl0sIHZhX2FyZyhhcCwgdWludDE2KiksIHYzMik7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19FWFRSQVNBTVBMRVM6CisJCWlmICghc2V0RXh0cmFTYW1wbGVzKHRkLCBhcCwgJnYpKQorCQkJZ290byBiYWR2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX01BVFRFSU5HOgorCQl0ZC0+dGRfZXh0cmFzYW1wbGVzID0gICgoKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKSkgIT0gMCk7CisJCWlmICh0ZC0+dGRfZXh0cmFzYW1wbGVzKSB7CisJCQl1aW50MTYgc3YgPSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBOworCQkJX1RJRkZzZXRTaG9ydEFycmF5KCZ0ZC0+dGRfc2FtcGxlaW5mbywgJnN2LCAxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJRkZUQUdfVElMRVdJRFRIOgorCQl2MzIgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWlmICh2MzIgJSAxNikgeworCQkJaWYgKHRpZi0+dGlmX21vZGUgIT0gT19SRE9OTFkpCisJCQkJZ290byBiYWR2YWx1ZTMyOworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkiTm9uc3RhbmRhcmQgdGlsZSB3aWR0aCAlZCwgY29udmVydCBmaWxlIiwgdjMyKTsKKwkJfQorCQl0ZC0+dGRfdGlsZXdpZHRoID0gdjMyOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0lTVElMRUQ7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19USUxFTEVOR1RIOgorCQl2MzIgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWlmICh2MzIgJSAxNikgeworCQkJaWYgKHRpZi0+dGlmX21vZGUgIT0gT19SRE9OTFkpCisJCQkJZ290byBiYWR2YWx1ZTMyOworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAiTm9uc3RhbmRhcmQgdGlsZSBsZW5ndGggJWQsIGNvbnZlcnQgZmlsZSIsIHYzMik7CisJCX0KKwkJdGQtPnRkX3RpbGVsZW5ndGggPSB2MzI7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfSVNUSUxFRDsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1RJTEVERVBUSDoKKwkJdjMyID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlpZiAodjMyID09IDApCisJCQlnb3RvIGJhZHZhbHVlMzI7CisJCXRkLT50ZF90aWxlZGVwdGggPSB2MzI7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19EQVRBVFlQRToKKwkJdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCXN3aXRjaCAodikgeworCQljYXNlIERBVEFUWVBFX1ZPSUQ6CXYgPSBTQU1QTEVGT1JNQVRfVk9JRDsJYnJlYWs7CisJCWNhc2UgREFUQVRZUEVfSU5UOgl2ID0gU0FNUExFRk9STUFUX0lOVDsJYnJlYWs7CisJCWNhc2UgREFUQVRZUEVfVUlOVDoJdiA9IFNBTVBMRUZPUk1BVF9VSU5UOwlicmVhazsKKwkJY2FzZSBEQVRBVFlQRV9JRUVFRlA6CXYgPSBTQU1QTEVGT1JNQVRfSUVFRUZQO2JyZWFrOworCQlkZWZhdWx0OgkJZ290byBiYWR2YWx1ZTsKKwkJfQorCQl0ZC0+dGRfc2FtcGxlZm9ybWF0ID0gKHVpbnQxNikgdjsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1NBTVBMRUZPUk1BVDoKKwkJdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWlmICh2IDwgU0FNUExFRk9STUFUX1VJTlQgfHwgU0FNUExFRk9STUFUX0NPTVBMRVhJRUVFRlAgPCB2KQorCQkJZ290byBiYWR2YWx1ZTsKKwkJdGQtPnRkX3NhbXBsZWZvcm1hdCA9ICh1aW50MTYpIHY7CisKKwkJLyogIFRyeSB0byBmaXggdXAgdGhlIFNXQUIgZnVuY3Rpb24gZm9yIGNvbXBsZXggZGF0YS4gKi8KKwkJaWYoIHRkLT50ZF9zYW1wbGVmb3JtYXQgPT0gU0FNUExFRk9STUFUX0NPTVBMRVhJTlQKKwkJICAgICYmIHRkLT50ZF9iaXRzcGVyc2FtcGxlID09IDMyCisJCSAgICAmJiB0aWYtPnRpZl9wb3N0ZGVjb2RlID09IF9USUZGU3dhYjMyQml0RGF0YSApCisJCSAgICB0aWYtPnRpZl9wb3N0ZGVjb2RlID0gX1RJRkZTd2FiMTZCaXREYXRhOworCQllbHNlIGlmKCAodGQtPnRkX3NhbXBsZWZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfQ09NUExFWElOVAorCQkJICB8fCB0ZC0+dGRfc2FtcGxlZm9ybWF0ID09IFNBTVBMRUZPUk1BVF9DT01QTEVYSUVFRUZQKQorCQkJICYmIHRkLT50ZF9iaXRzcGVyc2FtcGxlID09IDY0CisJCQkgJiYgdGlmLT50aWZfcG9zdGRlY29kZSA9PSBfVElGRlN3YWI2NEJpdERhdGEgKQorCQkgICAgdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGU3dhYjMyQml0RGF0YTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0lNQUdFREVQVEg6CisJCXRkLT50ZF9pbWFnZWRlcHRoID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU1VCSUZEOgorCQlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9JTlNVQklGRCkgPT0gMCkgeworCQkJdGQtPnRkX25zdWJpZmQgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQkJX1RJRkZzZXRMb25nOEFycmF5KCZ0ZC0+dGRfc3ViaWZkLCAodWludDY0KikgdmFfYXJnKGFwLCB1aW50NjQqKSwKKwkJCSAgICAobG9uZykgdGQtPnRkX25zdWJpZmQpOworCQl9IGVsc2UgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgICIlczogU29ycnksIGNhbm5vdCBuZXN0IFN1YklGRHMiLAorCQkJCSAgICAgdGlmLT50aWZfbmFtZSk7CisJCQlzdGF0dXMgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19ZQ0JDUlBPU0lUSU9OSU5HOgorCQl0ZC0+dGRfeWNiY3Jwb3NpdGlvbmluZyA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HOgorCQl0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1swXSA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCXRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1RSQU5TRkVSRlVOQ1RJT046CisJCXYgPSAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXMpID4gMSA/IDMgOiAxOworCQlmb3IgKGkgPSAwOyBpIDwgdjsgaSsrKQorCQkJX1RJRkZzZXRTaG9ydEFycmF5KCZ0ZC0+dGRfdHJhbnNmZXJmdW5jdGlvbltpXSwKKwkJCSAgICB2YV9hcmcoYXAsIHVpbnQxNiopLCAxTDw8dGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURToKKwkJLyogWFhYIHNob3VsZCBjaGVjayBmb3IgbnVsbCByYW5nZSAqLworCQlfVElGRnNldEZsb2F0QXJyYXkoJnRkLT50ZF9yZWZibGFja3doaXRlLCB2YV9hcmcoYXAsIGZsb2F0KiksIDYpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfSU5LTkFNRVM6CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlzID0gdmFfYXJnKGFwLCBjaGFyKik7CisJCXYgPSBjaGVja0lua05hbWVzU3RyaW5nKHRpZiwgdiwgcyk7CisJCXN0YXR1cyA9IHYgPiAwOworCQlpZiggdiA+IDAgKSB7CisJCQlfVElGRnNldE5TdHJpbmcoJnRkLT50ZF9pbmtuYW1lcywgcywgdik7CisJCQl0ZC0+dGRfaW5rbmFtZXNsZW4gPSB2OworCQl9CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19QRVJTQU1QTEU6CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlpZiggdiA9PSBQRVJTQU1QTEVfTVVMVEkgKQorCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9QRVJTQU1QTEU7CisJCWVsc2UKKwkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX1BFUlNBTVBMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDogeworCQlUSUZGVGFnVmFsdWUgKnR2OworCQlpbnQgdHZfc2l6ZSwgaUN1c3RvbTsKKworCQkvKgorCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgbXVsdGlwbGUgaW1hZ2VzIGFyZSBvcGVuIHdpdGggZGlmZmVyZW50CisJCSAqIGNvZGVjcyB3aGljaCBoYXZlIHByaXZhdGUgdGFncy4gIFRoZSBnbG9iYWwgdGFnIGluZm9ybWF0aW9uCisJCSAqIHRhYmxlIG1heSB0aGVuIGhhdmUgdGFncyB0aGF0IGFyZSB2YWxpZCBmb3Igb25lIGZpbGUgYnV0IG5vdAorCQkgKiB0aGUgb3RoZXIuIElmIHRoZSBjbGllbnQgdHJpZXMgdG8gc2V0IGEgdGFnIHRoYXQgaXMgbm90IHZhbGlkCisJCSAqIGZvciB0aGUgaW1hZ2UncyBjb2RlYyB0aGVuIHdlJ2xsIGFycml2ZSBoZXJlLiAgVGhpcworCQkgKiBoYXBwZW5zLCBmb3IgZXhhbXBsZSwgd2hlbiB0aWZmY3AgaXMgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4KKwkJICogY29tcHJlc3Npb24gc2NoZW1lcyBhbmQgY29kZWMtc3BlY2lmaWMgdGFncyBhcmUgYmxpbmRseSBjb3BpZWQuCisJCSAqLworCQlpZihmaXAgPT0gTlVMTCB8fCBmaXAtPmZpZWxkX2JpdCAhPSBGSUVMRF9DVVNUT00pIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIiVzOiBJbnZhbGlkICVzdGFnIFwiJXNcIiAobm90IHN1cHBvcnRlZCBieSBjb2RlYykiLAorCQkJICAgIHRpZi0+dGlmX25hbWUsIGlzUHNldWRvVGFnKHRhZykgPyAicHNldWRvLSIgOiAiIiwKKwkJCSAgICBmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAiVW5rbm93biIpOworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogRmluZCB0aGUgZXhpc3RpbmcgZW50cnkgZm9yIHRoaXMgY3VzdG9tIHZhbHVlLgorCQkgKi8KKwkJdHYgPSBOVUxMOworCQlmb3IgKGlDdXN0b20gPSAwOyBpQ3VzdG9tIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQ7IGlDdXN0b20rKykgeworCQkJaWYgKHRkLT50ZF9jdXN0b21WYWx1ZXNbaUN1c3RvbV0uaW5mby0+ZmllbGRfdGFnID09IHRhZykgeworCQkJCXR2ID0gdGQtPnRkX2N1c3RvbVZhbHVlcyArIGlDdXN0b207CisJCQkJaWYgKHR2LT52YWx1ZSAhPSBOVUxMKSB7CisJCQkJCV9USUZGZnJlZSh0di0+dmFsdWUpOworCQkJCQl0di0+dmFsdWUgPSBOVUxMOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIEdyb3cgdGhlIGN1c3RvbSBsaXN0IGlmIHRoZSBlbnRyeSB3YXMgbm90IGZvdW5kLgorCQkgKi8KKwkJaWYodHYgPT0gTlVMTCkgeworCQkJVElGRlRhZ1ZhbHVlICpuZXdfY3VzdG9tVmFsdWVzOworCisJCQl0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudCsrOworCQkJbmV3X2N1c3RvbVZhbHVlcyA9IChUSUZGVGFnVmFsdWUgKikKKwkJCSAgICBfVElGRnJlYWxsb2ModGQtPnRkX2N1c3RvbVZhbHVlcywKKwkJCSAgICBzaXplb2YoVElGRlRhZ1ZhbHVlKSAqIHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50KTsKKwkJCWlmICghbmV3X2N1c3RvbVZhbHVlcykgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBsaXN0IG9mIGN1c3RvbSB2YWx1ZXMiLAorCQkJCSAgICB0aWYtPnRpZl9uYW1lKTsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQl0ZC0+dGRfY3VzdG9tVmFsdWVzID0gbmV3X2N1c3RvbVZhbHVlczsKKworCQkJdHYgPSB0ZC0+dGRfY3VzdG9tVmFsdWVzICsgKHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50IC0gMSk7CisJCQl0di0+aW5mbyA9IGZpcDsKKwkJCXR2LT52YWx1ZSA9IE5VTEw7CisJCQl0di0+Y291bnQgPSAwOworCQl9CisKKwkJLyoKKwkJICogU2V0IGN1c3RvbSB2YWx1ZSAuLi4gc2F2ZSBhIGNvcHkgb2YgdGhlIGN1c3RvbSB0YWcgdmFsdWUuCisJCSAqLworCQl0dl9zaXplID0gX1RJRkZEYXRhU2l6ZShmaXAtPmZpZWxkX3R5cGUpOworCQlpZiAodHZfc2l6ZSA9PSAwKSB7CisJCQlzdGF0dXMgPSAwOworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiJXM6IEJhZCBmaWVsZCB0eXBlICVkIGZvciBcIiVzXCIiLAorCQkJICAgIHRpZi0+dGlmX25hbWUsIGZpcC0+ZmllbGRfdHlwZSwKKwkJCSAgICBmaXAtPmZpZWxkX25hbWUpOworCQkJZ290byBlbmQ7CisJCX0KKworCQlpZiAoZmlwLT5maWVsZF90eXBlID09IFRJRkZfQVNDSUkpCisJCXsKKwkJCXVpbnQzMiBtYTsKKwkJCWNoYXIqIG1iOworCQkJaWYgKGZpcC0+ZmllbGRfcGFzc2NvdW50KQorCQkJeworCQkJCWFzc2VydChmaXAtPmZpZWxkX3dyaXRlY291bnQ9PVRJRkZfVkFSSUFCTEUyKTsKKwkJCQltYT0odWludDMyKXZhX2FyZyhhcCx1aW50MzIpOworCQkJCW1iPShjaGFyKil2YV9hcmcoYXAsY2hhciopOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1iPShjaGFyKil2YV9hcmcoYXAsY2hhciopOworCQkJCW1hPSh1aW50MzIpKHN0cmxlbihtYikrMSk7CisJCQl9CisJCQl0di0+Y291bnQ9bWE7CisJCQlzZXRCeXRlQXJyYXkoJnR2LT52YWx1ZSxtYixtYSwxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChmaXAtPmZpZWxkX3Bhc3Njb3VudCkgeworCQkJCWlmIChmaXAtPmZpZWxkX3dyaXRlY291bnQgPT0gVElGRl9WQVJJQUJMRTIpCisJCQkJCXR2LT5jb3VudCA9ICh1aW50MzIpIHZhX2FyZyhhcCwgdWludDMyKTsKKwkJCQllbHNlCisJCQkJCXR2LT5jb3VudCA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJCX0gZWxzZSBpZiAoZmlwLT5maWVsZF93cml0ZWNvdW50ID09IFRJRkZfVkFSSUFCTEUKKwkJCSAgIHx8IGZpcC0+ZmllbGRfd3JpdGVjb3VudCA9PSBUSUZGX1ZBUklBQkxFMikKKwkJCQl0di0+Y291bnQgPSAxOworCQkJZWxzZSBpZiAoZmlwLT5maWVsZF93cml0ZWNvdW50ID09IFRJRkZfU1BQKQorCQkJCXR2LT5jb3VudCA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisJCQllbHNlCisJCQkJdHYtPmNvdW50ID0gZmlwLT5maWVsZF93cml0ZWNvdW50OworCisJCQlpZiAodHYtPmNvdW50ID09IDApIHsKKwkJCQlzdGF0dXMgPSAwOworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIiVzOiBOdWxsIGNvdW50IGZvciBcIiVzXCIgKHR5cGUgIgorCQkJCQkgICAgICIlZCwgd3JpdGVjb3VudCAlZCwgcGFzc2NvdW50ICVkKSIsCisJCQkJCSAgICAgdGlmLT50aWZfbmFtZSwKKwkJCQkJICAgICBmaXAtPmZpZWxkX25hbWUsCisJCQkJCSAgICAgZmlwLT5maWVsZF90eXBlLAorCQkJCQkgICAgIGZpcC0+ZmllbGRfd3JpdGVjb3VudCwKKwkJCQkJICAgICBmaXAtPmZpZWxkX3Bhc3Njb3VudCk7CisJCQkJZ290byBlbmQ7CisJCQl9CisKKwkJCXR2LT52YWx1ZSA9IF9USUZGQ2hlY2tNYWxsb2ModGlmLCB0di0+Y291bnQsIHR2X3NpemUsCisJCQkgICAgImN1c3RvbSB0YWcgYmluYXJ5IG9iamVjdCIpOworCQkJaWYgKCF0di0+dmFsdWUpIHsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQlpZiAoZmlwLT5maWVsZF90YWcgPT0gVElGRlRBR19ET1RSQU5HRSAKKwkJCSAgICAmJiBzdHJjbXAoZmlwLT5maWVsZF9uYW1lLCJEb3RSYW5nZSIpID09IDApIHsKKwkJCQkvKiBUT0RPOiBUaGlzIGlzIGFuIGV2aWwgZXhjZXB0aW9uIGFuZCBzaG91bGQgbm90IGhhdmUgYmVlbgorCQkJCSAgIGhhbmRsZWQgdGhpcyB3YXkgLi4uIGxpa2VseSBiZXN0IGlmIHdlIG1vdmUgaXQgaW50bworCQkJCSAgIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpdGggYW4gZXhwbGljaXQgZmllbGQgaW4gCisJCQkJICAgbGlidGlmZiA0LjEgYW5kIGFzc2lnbiBpdCBhIEZJRUxEXyB2YWx1ZSAqLworCQkJCXVpbnQxNiB2WzJdOworCQkJCXZbMF0gPSAodWludDE2KXZhX2FyZyhhcCwgaW50KTsKKwkJCQl2WzFdID0gKHVpbnQxNil2YV9hcmcoYXAsIGludCk7CisJCQkJX1RJRkZtZW1jcHkodHYtPnZhbHVlLCAmdiwgNCk7CisJCQl9CisKKwkJCWVsc2UgaWYgKGZpcC0+ZmllbGRfcGFzc2NvdW50CisJCQkJICB8fCBmaXAtPmZpZWxkX3dyaXRlY291bnQgPT0gVElGRl9WQVJJQUJMRQorCQkJCSAgfHwgZmlwLT5maWVsZF93cml0ZWNvdW50ID09IFRJRkZfVkFSSUFCTEUyCisJCQkJICB8fCBmaXAtPmZpZWxkX3dyaXRlY291bnQgPT0gVElGRl9TUFAKKwkJCQkgIHx8IHR2LT5jb3VudCA+IDEpIHsKKwkJCQlfVElGRm1lbWNweSh0di0+dmFsdWUsIHZhX2FyZyhhcCwgdm9pZCAqKSwKKwkJCQkgICAgdHYtPmNvdW50ICogdHZfc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCWNoYXIgKnZhbCA9IChjaGFyICopdHYtPnZhbHVlOworCQkJCWFzc2VydCggdHYtPmNvdW50ID09IDEgKTsKKworCQkJCXN3aXRjaCAoZmlwLT5maWVsZF90eXBlKSB7CisJCQkJY2FzZSBUSUZGX0JZVEU6CisJCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJCQkJeworCQkJCQkJdWludDggdiA9ICh1aW50OCl2YV9hcmcoYXAsIGludCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0JZVEU6CisJCQkJCXsKKwkJCQkJCWludDggdiA9IChpbnQ4KXZhX2FyZyhhcCwgaW50KTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9TSE9SVDoKKwkJCQkJeworCQkJCQkJdWludDE2IHYgPSAodWludDE2KXZhX2FyZyhhcCwgaW50KTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJCXsKKwkJCQkJCWludDE2IHYgPSAoaW50MTYpdmFfYXJnKGFwLCBpbnQpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0xPTkc6CisJCQkJY2FzZSBUSUZGX0lGRDoKKwkJCQkJeworCQkJCQkJdWludDMyIHYgPSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0xPTkc6CisJCQkJCXsKKwkJCQkJCWludDMyIHYgPSB2YV9hcmcoYXAsIGludDMyKTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9MT05HODoKKwkJCQljYXNlIFRJRkZfSUZEODoKKwkJCQkJeworCQkJCQkJdWludDY0IHYgPSB2YV9hcmcoYXAsIHVpbnQ2NCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJCQl7CisJCQkJCQlpbnQ2NCB2ID0gdmFfYXJnKGFwLCBpbnQ2NCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJCQljYXNlIFRJRkZfRkxPQVQ6CisJCQkJCXsKKwkJCQkJCWZsb2F0IHYgPSAoZmxvYXQpdmFfYXJnKGFwLCBkb3VibGUpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCQkJeworCQkJCQkJZG91YmxlIHYgPSB2YV9hcmcoYXAsIGRvdWJsZSk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlfVElGRm1lbXNldCh2YWwsIDAsIHR2X3NpemUpOworCQkJCQlzdGF0dXMgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJfQorCWlmIChzdGF0dXMpIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXA9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKwkJaWYgKGZpcCkgICAgICAgICAgICAgICAgCisJCQlUSUZGU2V0RmllbGRCaXQodGlmLCBmaXAtPmZpZWxkX2JpdCk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfRElSVFlESVJFQ1Q7CisJfQorCitlbmQ6CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gKHN0YXR1cyk7CitiYWR2YWx1ZToKKyAgICAgICAgeworCQljb25zdCBUSUZGRmllbGQqIGZpcD1USUZGRmllbGRXaXRoVGFnKHRpZix0YWcpOworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgICIlczogQmFkIHZhbHVlICV1IGZvciBcIiVzXCIgdGFnIiwKKwkJICAgICB0aWYtPnRpZl9uYW1lLCB2LAorCQkgICAgIGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJVbmtub3duIik7CisJCXZhX2VuZChhcCk7CisgICAgICAgIH0KKwlyZXR1cm4gKDApOworYmFkdmFsdWUzMjoKKyAgICAgICAgeworCQljb25zdCBUSUZGRmllbGQqIGZpcD1USUZGRmllbGRXaXRoVGFnKHRpZix0YWcpOworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgICIlczogQmFkIHZhbHVlICV1IGZvciBcIiVzXCIgdGFnIiwKKwkJICAgICB0aWYtPnRpZl9uYW1lLCB2MzIsCisJCSAgICAgZmlwID8gZmlwLT5maWVsZF9uYW1lIDogIlVua25vd24iKTsKKwkJdmFfZW5kKGFwKTsKKyAgICAgICAgfQorCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBSZXR1cm4gMS8wIGFjY29yZGluZyB0byB3aGV0aGVyIG9yIG5vdAorICogaXQgaXMgcGVybWlzc2libGUgdG8gc2V0IHRoZSB0YWcncyB2YWx1ZS4KKyAqIE5vdGUgdGhhdCB3ZSBhbGxvdyBJbWFnZUxlbmd0aCB0byBiZSBjaGFuZ2VkCisgKiBzbyB0aGF0IHdlIGNhbiBhcHBlbmQgYW5kIGV4dGVuZCB0byBpbWFnZXMuCisgKiBBbnkgb3RoZXIgdGFnIG1heSBub3QgYmUgYWx0ZXJlZCBvbmNlIHdyaXRpbmcKKyAqIGhhcyBjb21tZW5jZWQsIHVubGVzcyBpdHMgdmFsdWUgaGFzIG5vIGVmZmVjdAorICogb24gdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSB0aGF0IGlzIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQKK09rVG9DaGFuZ2VUYWcoVElGRiogdGlmLCB1aW50MzIgdGFnKQoreworCWNvbnN0IFRJRkZGaWVsZCogZmlwID0gVElGRkZpbmRGaWVsZCh0aWYsIHRhZywgVElGRl9BTlkpOworCWlmICghZmlwKSB7CQkJLyogdW5rbm93biB0YWcgKi8KKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGU2V0RmllbGQiLCAiJXM6IFVua25vd24gJXN0YWcgJXUiLAorCQkgICAgdGlmLT50aWZfbmFtZSwgaXNQc2V1ZG9UYWcodGFnKSA/ICJwc2V1ZG8tIiA6ICIiLCB0YWcpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAodGFnICE9IFRJRkZUQUdfSU1BR0VMRU5HVEggJiYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9CRUVOV1JJVElORykgJiYKKwkgICAgIWZpcC0+ZmllbGRfb2t0b2NoYW5nZSkgeworCQkvKgorCQkgKiBDb25zdWx0IGluZm8gdGFibGUgdG8gc2VlIGlmIHRhZyBjYW4gYmUgY2hhbmdlZAorCQkgKiBhZnRlciB3ZSd2ZSBzdGFydGVkIHdyaXRpbmcuICBXZSBvbmx5IGFsbG93IGNoYW5nZXMKKwkJICogdG8gdGhvc2UgdGFncyB0aGF0IGRvbid0L3Nob3VsZG4ndCBhZmZlY3QgdGhlCisJCSAqIGNvbXByZXNzaW9uIGFuZC9vciBmb3JtYXQgb2YgdGhlIGRhdGEuCisJCSAqLworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZTZXRGaWVsZCIsCisJCSAgICAiJXM6IENhbm5vdCBtb2RpZnkgdGFnIFwiJXNcIiB3aGlsZSB3cml0aW5nIiwKKwkJICAgIHRpZi0+dGlmX25hbWUsIGZpcC0+ZmllbGRfbmFtZSk7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIHZhbHVlIG9mIGEgZmllbGQgaW4gdGhlCisgKiBpbnRlcm5hbCBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCisgKiBmaWVsZCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUKKyAqIHdoZW4vaWYgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMKKyAqIHVwZGF0ZWQuCisgKi8KK2ludAorVElGRlNldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHN0YXR1czsKKworCXZhX3N0YXJ0KGFwLCB0YWcpOworCXN0YXR1cyA9IFRJRkZWU2V0RmllbGQodGlmLCB0YWcsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqIENsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgZmllbGQgaW4gdGhlIGludGVybmFsIHN0cnVjdHVyZS4KKyAqLworaW50CitUSUZGVW5zZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcpCit7CisgICAgY29uc3QgVElGRkZpZWxkICpmaXAgPSAgVElGRkZpZWxkV2l0aFRhZyh0aWYsIHRhZyk7CisgICAgVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYoICFmaXAgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCBmaXAtPmZpZWxkX2JpdCAhPSBGSUVMRF9DVVNUT00gKQorICAgICAgICBUSUZGQ2xyRmllbGRCaXQodGlmLCBmaXAtPmZpZWxkX2JpdCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVElGRlRhZ1ZhbHVlICp0diA9IE5VTEw7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0diA9IHRkLT50ZF9jdXN0b21WYWx1ZXMgKyBpOworICAgICAgICAgICAgaWYoIHR2LT5pbmZvLT5maWVsZF90YWcgPT0gdGFnICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBpIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICBfVElGRmZyZWUodHYtPnZhbHVlKTsKKyAgICAgICAgICAgIGZvciggOyBpIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQtMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGQtPnRkX2N1c3RvbVZhbHVlc1tpXSA9IHRkLT50ZF9jdXN0b21WYWx1ZXNbaSsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50LS07CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIHRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfRElSVFlESVJFQ1Q7CisKKyAgICByZXR1cm4gKDEpOworfQorCisvKgorICogTGlrZSBUSUZGU2V0RmllbGQsIGJ1dCB0YWtpbmcgYSB2YXJhcmdzCisgKiBwYXJhbWV0ZXIgbGlzdC4gIFRoaXMgcm91dGluZSBpcyB1c2VmdWwKKyAqIGZvciBidWlsZGluZyBoaWdoZXItbGV2ZWwgaW50ZXJmYWNlcyBvbgorICogdG9wIG9mIHRoZSBsaWJyYXJ5LgorICovCitpbnQKK1RJRkZWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCXJldHVybiBPa1RvQ2hhbmdlVGFnKHRpZiwgdGFnKSA/CisJICAgICgqdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQpKHRpZiwgdGFnLCBhcCkgOiAwOworfQorCitzdGF0aWMgaW50CitfVElGRlZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCWludCByZXRfdmFsID0gMTsKKwl1aW50MzIgc3RhbmRhcmRfdGFnID0gdGFnOworCWNvbnN0IFRJRkZGaWVsZCogZmlwID0gVElGRkZpbmRGaWVsZCh0aWYsIHRhZywgVElGRl9BTlkpOworCQorCS8qCisJICogV2Ugd2FudCB0byBmb3JjZSB0aGUgY3VzdG9tIGNvZGUgdG8gYmUgdXNlZCBmb3IgY3VzdG9tCisJICogZmllbGRzIGV2ZW4gaWYgdGhlIHRhZyBoYXBwZW5zIHRvIG1hdGNoIGEgd2VsbCBrbm93biAKKwkgKiBvbmUgLSBpbXBvcnRhbnQgZm9yIHJlaW50ZXJwcmV0ZWQgaGFuZGxpbmcgb2Ygc3RhbmRhcmQKKwkgKiB0YWcgdmFsdWVzIGluIGN1c3RvbSBkaXJlY3RvcmllcyAoaWUuIEVYSUYpIAorCSAqLworCWlmIChmaXAtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00pIHsKKwkJc3RhbmRhcmRfdGFnID0gMDsKKwl9CisKKwlzd2l0Y2ggKHN0YW5kYXJkX3RhZykgeworCQljYXNlIFRJRkZUQUdfU1VCRklMRVRZUEU6CisJCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9IHRkLT50ZF9zdWJmaWxldHlwZTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSU1BR0VXSURUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX2ltYWdld2lkdGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0lNQUdFTEVOR1RIOgorCQkJKnZhX2FyZyhhcCwgdWludDMyKikgPSB0ZC0+dGRfaW1hZ2VsZW5ndGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0JJVFNQRVJTQU1QTEU6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19DT01QUkVTU0lPTjoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX2NvbXByZXNzaW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19QSE9UT01FVFJJQzoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3Bob3RvbWV0cmljOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19USFJFU0hIT0xESU5HOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfdGhyZXNoaG9sZGluZzsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfRklMTE9SREVSOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfZmlsbG9yZGVyOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19PUklFTlRBVElPTjoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX29yaWVudGF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19TQU1QTEVTUEVSUElYRUw6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1JPV1NQRVJTVFJJUDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfTUlOU0FNUExFVkFMVUU6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9taW5zYW1wbGV2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfTUFYU0FNUExFVkFMVUU6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9tYXhzYW1wbGV2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFOgorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9QRVJTQU1QTEUpCisJCQkJKnZhX2FyZyhhcCwgZG91YmxlKiopID0gdGQtPnRkX3NtaW5zYW1wbGV2YWx1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBsaWJ0aWZmIGhpc3RvcmlhbGx5IHRyZWF0cyB0aGlzIGFzIGEgc2luZ2xlIHZhbHVlLiAqLworCQkJCXVpbnQxNiBpOworCQkJCWRvdWJsZSB2ID0gdGQtPnRkX3NtaW5zYW1wbGV2YWx1ZVswXTsKKwkJCQlmb3IgKGk9MTsgaSA8IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7ICsraSkKKwkJCQkJaWYoIHRkLT50ZF9zbWluc2FtcGxldmFsdWVbaV0gPCB2ICkKKwkJCQkJCXYgPSB0ZC0+dGRfc21pbnNhbXBsZXZhbHVlW2ldOworCQkJCSp2YV9hcmcoYXAsIGRvdWJsZSopID0gdjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfU01BWFNBTVBMRVZBTFVFOgorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9QRVJTQU1QTEUpCisJCQkJKnZhX2FyZyhhcCwgZG91YmxlKiopID0gdGQtPnRkX3NtYXhzYW1wbGV2YWx1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBsaWJ0aWZmIGhpc3RvcmlhbGx5IHRyZWF0cyB0aGlzIGFzIGEgc2luZ2xlIHZhbHVlLiAqLworCQkJCXVpbnQxNiBpOworCQkJCWRvdWJsZSB2ID0gdGQtPnRkX3NtYXhzYW1wbGV2YWx1ZVswXTsKKwkJCQlmb3IgKGk9MTsgaSA8IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7ICsraSkKKwkJCQkJaWYoIHRkLT50ZF9zbWF4c2FtcGxldmFsdWVbaV0gPiB2ICkKKwkJCQkJCXYgPSB0ZC0+dGRfc21heHNhbXBsZXZhbHVlW2ldOworCQkJCSp2YV9hcmcoYXAsIGRvdWJsZSopID0gdjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWFJFU09MVVRJT046CisJCQkqdmFfYXJnKGFwLCBmbG9hdCopID0gdGQtPnRkX3hyZXNvbHV0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19ZUkVTT0xVVElPTjoKKwkJCSp2YV9hcmcoYXAsIGZsb2F0KikgPSB0ZC0+dGRfeXJlc29sdXRpb247CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1BMQU5BUkNPTkZJRzoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3BsYW5hcmNvbmZpZzsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWFBPU0lUSU9OOgorCQkJKnZhX2FyZyhhcCwgZmxvYXQqKSA9IHRkLT50ZF94cG9zaXRpb247CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1lQT1NJVElPTjoKKwkJCSp2YV9hcmcoYXAsIGZsb2F0KikgPSB0ZC0+dGRfeXBvc2l0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19SRVNPTFVUSU9OVU5JVDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3Jlc29sdXRpb251bml0OworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19QQUdFTlVNQkVSOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfcGFnZW51bWJlclswXTsKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3BhZ2VudW1iZXJbMV07CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0hBTEZUT05FSElOVFM6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9oYWxmdG9uZWhpbnRzWzBdOworCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfaGFsZnRvbmVoaW50c1sxXTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfQ09MT1JNQVA6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKikgPSB0ZC0+dGRfY29sb3JtYXBbMF07CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKikgPSB0ZC0+dGRfY29sb3JtYXBbMV07CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKikgPSB0ZC0+dGRfY29sb3JtYXBbMl07CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NUUklQT0ZGU0VUUzoKKwkJY2FzZSBUSUZGVEFHX1RJTEVPRkZTRVRTOgorCQkJX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisJCQkqdmFfYXJnKGFwLCB1aW50NjQqKikgPSB0ZC0+dGRfc3RyaXBvZmZzZXQ7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NUUklQQllURUNPVU5UUzoKKwkJY2FzZSBUSUZGVEFHX1RJTEVCWVRFQ09VTlRTOgorCQkJX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisJCQkqdmFfYXJnKGFwLCB1aW50NjQqKikgPSB0ZC0+dGRfc3RyaXBieXRlY291bnQ7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX01BVFRFSU5HOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPQorCQkJICAgICh0ZC0+dGRfZXh0cmFzYW1wbGVzID09IDEgJiYKKwkJCSAgICB0ZC0+dGRfc2FtcGxlaW5mb1swXSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfRVhUUkFTQU1QTEVTOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfZXh0cmFzYW1wbGVzOworCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3NhbXBsZWluZm87CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1RJTEVXSURUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3RpbGV3aWR0aDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfVElMRUxFTkdUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3RpbGVsZW5ndGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1RJTEVERVBUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3RpbGVkZXB0aDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfREFUQVRZUEU6CisJCQlzd2l0Y2ggKHRkLT50ZF9zYW1wbGVmb3JtYXQpIHsKKwkJCQljYXNlIFNBTVBMRUZPUk1BVF9VSU5UOgorCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IERBVEFUWVBFX1VJTlQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FNUExFRk9STUFUX0lOVDoKKwkJCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBEQVRBVFlQRV9JTlQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FNUExFRk9STUFUX0lFRUVGUDoKKwkJCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBEQVRBVFlQRV9JRUVFRlA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FNUExFRk9STUFUX1ZPSUQ6CisJCQkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gREFUQVRZUEVfVk9JRDsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NBTVBMRUZPUk1BVDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3NhbXBsZWZvcm1hdDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSU1BR0VERVBUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX2ltYWdlZGVwdGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NVQklGRDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX25zdWJpZmQ7CisJCQkqdmFfYXJnKGFwLCB1aW50NjQqKikgPSB0ZC0+dGRfc3ViaWZkOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19ZQ0JDUlBPU0lUSU9OSU5HOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfeWNiY3Jwb3NpdGlvbmluZzsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORzoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF07CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMF07CisJCQlpZiAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXMgPiAxKSB7CisJCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMV07CisJCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CisJCQkqdmFfYXJnKGFwLCBmbG9hdCoqKSA9IHRkLT50ZF9yZWZibGFja3doaXRlOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19JTktOQU1FUzoKKwkJCSp2YV9hcmcoYXAsIGNoYXIqKikgPSB0ZC0+dGRfaW5rbmFtZXM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlpbnQgaTsKKworCQkJCS8qCisJCQkJICogVGhpcyBjYW4gaGFwcGVuIGlmIG11bHRpcGxlIGltYWdlcyBhcmUgb3BlbgorCQkJCSAqIHdpdGggZGlmZmVyZW50IGNvZGVjcyB3aGljaCBoYXZlIHByaXZhdGUKKwkJCQkgKiB0YWdzLiAgVGhlIGdsb2JhbCB0YWcgaW5mb3JtYXRpb24gdGFibGUgbWF5CisJCQkJICogdGhlbiBoYXZlIHRhZ3MgdGhhdCBhcmUgdmFsaWQgZm9yIG9uZSBmaWxlCisJCQkJICogYnV0IG5vdCB0aGUgb3RoZXIuIElmIHRoZSBjbGllbnQgdHJpZXMgdG8KKwkJCQkgKiBnZXQgYSB0YWcgdGhhdCBpcyBub3QgdmFsaWQgZm9yIHRoZSBpbWFnZSdzCisJCQkJICogY29kZWMgdGhlbiB3ZSdsbCBhcnJpdmUgaGVyZS4KKwkJCQkgKi8KKwkJCQlpZiggZmlwID09IE5VTEwgfHwgZmlwLT5maWVsZF9iaXQgIT0gRklFTERfQ1VTVE9NICkKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiX1RJRkZWR2V0RmllbGQiLAorCQkJCQkgICAgIiVzOiBJbnZhbGlkICVzdGFnIFwiJXNcIiAiCisJCQkJCSAgICAiKG5vdCBzdXBwb3J0ZWQgYnkgY29kZWMpIiwKKwkJCQkJICAgIHRpZi0+dGlmX25hbWUsCisJCQkJCSAgICBpc1BzZXVkb1RhZyh0YWcpID8gInBzZXVkby0iIDogIiIsCisJCQkJCSAgICBmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAiVW5rbm93biIpOworCQkJCQlyZXRfdmFsID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBEbyB3ZSBoYXZlIGEgY3VzdG9tIHZhbHVlPworCQkJCSAqLworCQkJCXJldF92YWwgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudDsgaSsrKSB7CisJCQkJCVRJRkZUYWdWYWx1ZSAqdHYgPSB0ZC0+dGRfY3VzdG9tVmFsdWVzICsgaTsKKworCQkJCQlpZiAodHYtPmluZm8tPmZpZWxkX3RhZyAhPSB0YWcpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlpZiAoZmlwLT5maWVsZF9wYXNzY291bnQpIHsKKwkJCQkJCWlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFMikKKwkJCQkJCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9ICh1aW50MzIpdHYtPmNvdW50OworCQkJCQkJZWxzZSAgLyogQXNzdW1lIFRJRkZfVkFSSUFCTEUgKi8KKwkJCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICh1aW50MTYpdHYtPmNvdW50OworCQkJCQkJKnZhX2FyZyhhcCwgdm9pZCAqKikgPSB0di0+dmFsdWU7CisJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJfSBlbHNlIGlmIChmaXAtPmZpZWxkX3RhZyA9PSBUSUZGVEFHX0RPVFJBTkdFCisJCQkJCQkgICAmJiBzdHJjbXAoZmlwLT5maWVsZF9uYW1lLCJEb3RSYW5nZSIpID09IDApIHsKKwkJCQkJCS8qIFRPRE86IFRoaXMgaXMgYW4gZXZpbCBleGNlcHRpb24gYW5kIHNob3VsZCBub3QgaGF2ZSBiZWVuCisJCQkJCQkgICBoYW5kbGVkIHRoaXMgd2F5IC4uLiBsaWtlbHkgYmVzdCBpZiB3ZSBtb3ZlIGl0IGludG8KKwkJCQkJCSAgIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpdGggYW4gZXhwbGljaXQgZmllbGQgaW4gCisJCQkJCQkgICBsaWJ0aWZmIDQuMSBhbmQgYXNzaWduIGl0IGEgRklFTERfIHZhbHVlICovCisJCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICgodWludDE2ICopdHYtPnZhbHVlKVswXTsKKwkJCQkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gKCh1aW50MTYgKil0di0+dmFsdWUpWzFdOworCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoZmlwLT5maWVsZF90eXBlID09IFRJRkZfQVNDSUkKKwkJCQkJCSAgICB8fCBmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFCisJCQkJCQkgICAgfHwgZmlwLT5maWVsZF9yZWFkY291bnQgPT0gVElGRl9WQVJJQUJMRTIKKwkJCQkJCSAgICB8fCBmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1NQUAorCQkJCQkJICAgIHx8IHR2LT5jb3VudCA+IDEpIHsKKwkJCQkJCQkqdmFfYXJnKGFwLCB2b2lkICoqKSA9IHR2LT52YWx1ZTsKKwkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY2hhciAqdmFsID0gKGNoYXIgKil0di0+dmFsdWU7CisJCQkJCQkJYXNzZXJ0KCB0di0+Y291bnQgPT0gMSApOworCQkJCQkJCXN3aXRjaCAoZmlwLT5maWVsZF90eXBlKSB7CisJCQkJCQkJY2FzZSBUSUZGX0JZVEU6CisJCQkJCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJCQkJCQkJKnZhX2FyZyhhcCwgdWludDgqKSA9CisJCQkJCQkJCQkqKHVpbnQ4ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBpbnQ4KikgPQorCQkJCQkJCQkJKihpbnQ4ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NIT1JUOgorCQkJCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9CisJCQkJCQkJCQkqKHVpbnQxNiAqKXZhbDsKKwkJCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJCQkJCSp2YV9hcmcoYXAsIGludDE2KikgPQorCQkJCQkJCQkJKihpbnQxNiAqKXZhbDsKKwkJCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9MT05HOgorCQkJCQkJCWNhc2UgVElGRl9JRkQ6CisJCQkJCQkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0KKwkJCQkJCQkJCSoodWludDMyICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBpbnQzMiopID0KKwkJCQkJCQkJCSooaW50MzIgKil2YWw7CisJCQkJCQkJCXJldF92YWwgPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRJRkZfTE9ORzg6CisJCQkJCQkJY2FzZSBUSUZGX0lGRDg6CisJCQkJCQkJCSp2YV9hcmcoYXAsIHVpbnQ2NCopID0KKwkJCQkJCQkJCSoodWludDY0ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NMT05HODoKKwkJCQkJCQkJKnZhX2FyZyhhcCwgaW50NjQqKSA9CisJCQkJCQkJCQkqKGludDY0ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJCQkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQkJCQkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBmbG9hdCopID0KKwkJCQkJCQkJCSooZmxvYXQgKil2YWw7CisJCQkJCQkJCXJldF92YWwgPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBkb3VibGUqKSA9CisJCQkJCQkJCQkqKGRvdWJsZSAqKXZhbDsKKwkJCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXJldF92YWwgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCX0KKwlyZXR1cm4ocmV0X3ZhbCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZmllbGQgaW4gdGhlCisgKiBpbnRlcm5hbCBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICovCitpbnQKK1RJRkZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLikKK3sKKwlpbnQgc3RhdHVzOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgdGFnKTsKKwlzdGF0dXMgPSBUSUZGVkdldEZpZWxkKHRpZiwgdGFnLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBMaWtlIFRJRkZHZXRGaWVsZCwgYnV0IHRha2luZyBhIHZhcmFyZ3MKKyAqIHBhcmFtZXRlciBsaXN0LiAgVGhpcyByb3V0aW5lIGlzIHVzZWZ1bAorICogZm9yIGJ1aWxkaW5nIGhpZ2hlci1sZXZlbCBpbnRlcmZhY2VzIG9uCisgKiB0b3Agb2YgdGhlIGxpYnJhcnkuCisgKi8KK2ludAorVElGRlZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBUSUZGRmluZEZpZWxkKHRpZiwgdGFnLCBUSUZGX0FOWSk7CisJcmV0dXJuIChmaXAgJiYgKGlzUHNldWRvVGFnKHRhZykgfHwgVElGRkZpZWxkU2V0KHRpZiwgZmlwLT5maWVsZF9iaXQpKSA/CisJICAgICgqdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQpKHRpZiwgdGFnLCBhcCkgOiAwKTsKK30KKworI2RlZmluZQlDbGVhbnVwRmllbGQobWVtYmVyKSB7CQlcCisgICAgaWYgKHRkLT5tZW1iZXIpIHsJCQlcCisJX1RJRkZmcmVlKHRkLT5tZW1iZXIpOwkJXAorCXRkLT5tZW1iZXIgPSAwOwkJCVwKKyAgICB9CQkJCQlcCit9CisKKy8qCisgKiBSZWxlYXNlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGEgZGlyZWN0b3J5LgorICovCit2b2lkCitUSUZGRnJlZURpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCWludCAgICAgICAgICAgIGk7CisKKwlfVElGRm1lbXNldCh0ZC0+dGRfZmllbGRzc2V0LCAwLCBGSUVMRF9TRVRMT05HUyk7CisJQ2xlYW51cEZpZWxkKHRkX3NtaW5zYW1wbGV2YWx1ZSk7CisJQ2xlYW51cEZpZWxkKHRkX3NtYXhzYW1wbGV2YWx1ZSk7CisJQ2xlYW51cEZpZWxkKHRkX2NvbG9ybWFwWzBdKTsKKwlDbGVhbnVwRmllbGQodGRfY29sb3JtYXBbMV0pOworCUNsZWFudXBGaWVsZCh0ZF9jb2xvcm1hcFsyXSk7CisJQ2xlYW51cEZpZWxkKHRkX3NhbXBsZWluZm8pOworCUNsZWFudXBGaWVsZCh0ZF9zdWJpZmQpOworCUNsZWFudXBGaWVsZCh0ZF9pbmtuYW1lcyk7CisJQ2xlYW51cEZpZWxkKHRkX3JlZmJsYWNrd2hpdGUpOworCUNsZWFudXBGaWVsZCh0ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdKTsKKwlDbGVhbnVwRmllbGQodGRfdHJhbnNmZXJmdW5jdGlvblsxXSk7CisJQ2xlYW51cEZpZWxkKHRkX3RyYW5zZmVyZnVuY3Rpb25bMl0pOworCUNsZWFudXBGaWVsZCh0ZF9zdHJpcG9mZnNldCk7CisJQ2xlYW51cEZpZWxkKHRkX3N0cmlwYnl0ZWNvdW50KTsKKwlUSUZGQ2xyRmllbGRCaXQodGlmLCBGSUVMRF9ZQ0JDUlNVQlNBTVBMSU5HKTsKKwlUSUZGQ2xyRmllbGRCaXQodGlmLCBGSUVMRF9ZQ0JDUlBPU0lUSU9OSU5HKTsKKworCS8qIENsZWFudXAgY3VzdG9tIHRhZyB2YWx1ZXMgKi8KKwlmb3IoIGkgPSAwOyBpIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQ7IGkrKyApIHsKKwkJaWYgKHRkLT50ZF9jdXN0b21WYWx1ZXNbaV0udmFsdWUpCisJCQlfVElGRmZyZWUodGQtPnRkX2N1c3RvbVZhbHVlc1tpXS52YWx1ZSk7CisJfQorCisJdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQgPSAwOworCUNsZWFudXBGaWVsZCh0ZF9jdXN0b21WYWx1ZXMpOworCisjaWYgZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkKKyAgICAgICAgX1RJRkZtZW1zZXQoICYodGQtPnRkX3N0cmlwb2Zmc2V0X2VudHJ5KSwgMCwgc2l6ZW9mKFRJRkZEaXJFbnRyeSkpOworICAgICAgICBfVElGRm1lbXNldCggJih0ZC0+dGRfc3RyaXBieXRlY291bnRfZW50cnkpLCAwLCBzaXplb2YoVElGRkRpckVudHJ5KSk7CisjZW5kaWYgICAgICAgIAorfQorI3VuZGVmIENsZWFudXBGaWVsZAorCisvKgorICogQ2xpZW50IFRhZyBleHRlbnNpb24gc3VwcG9ydCAoZnJvbSBOaWxlcyBSaXR0ZXIpLgorICovCitzdGF0aWMgVElGRkV4dGVuZFByb2MgX1RJRkZleHRlbmRlciA9IChUSUZGRXh0ZW5kUHJvYykgTlVMTDsKKworVElGRkV4dGVuZFByb2MKK1RJRkZTZXRUYWdFeHRlbmRlcihUSUZGRXh0ZW5kUHJvYyBleHRlbmRlcikKK3sKKwlUSUZGRXh0ZW5kUHJvYyBwcmV2ID0gX1RJRkZleHRlbmRlcjsKKwlfVElGRmV4dGVuZGVyID0gZXh0ZW5kZXI7CisJcmV0dXJuIChwcmV2KTsKK30KKworLyoKKyAqIFNldHVwIGZvciBhIG5ldyBkaXJlY3RvcnkuICBTaG91bGQgd2UgYXV0b21hdGljYWxseSBjYWxsCisgKiBUSUZGV3JpdGVEaXJlY3RvcnkoKSBpZiB0aGUgY3VycmVudCBvbmUgaXMgZGlydHk/CisgKgorICogVGhlIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5IHdpbGwgbm90IGV4aXN0IG9uIHRoZSBmaWxlIHRpbGwKKyAqIFRJRkZXcml0ZURpcmVjdG9yeSgpLCBUSUZGRmx1c2goKSBvciBUSUZGQ2xvc2UoKSBpcyBjYWxsZWQuCisgKi8KK2ludAorVElGRkNyZWF0ZURpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJVElGRkRlZmF1bHREaXJlY3RvcnkodGlmKTsKKwl0aWYtPnRpZl9kaXJvZmYgPSAwOworCXRpZi0+dGlmX25leHRkaXJvZmYgPSAwOworCXRpZi0+dGlmX2N1cm9mZiA9IDA7CisJdGlmLT50aWZfcm93ID0gKHVpbnQzMikgLTE7CisJdGlmLT50aWZfY3Vyc3RyaXAgPSAodWludDMyKSAtMTsKKworCXJldHVybiAwOworfQorCitpbnQKK1RJRkZDcmVhdGVDdXN0b21EaXJlY3RvcnkoVElGRiogdGlmLCBjb25zdCBUSUZGRmllbGRBcnJheSogaW5mb2FycmF5KQoreworCVRJRkZEZWZhdWx0RGlyZWN0b3J5KHRpZik7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBmaWVsZCBkZWZpbml0aW9ucyB0byBtYXRjaCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZWQgbGlzdC4gCisJICogSG9wZWZ1bGx5IFRJRkZEZWZhdWx0RGlyZWN0b3J5KCkgd29uJ3QgaGF2ZSBkb25lIGFueXRoaW5nIGlycmV2ZXJzYWJsZQorCSAqIGJhc2VkIG9uIGl0J3MgYXNzdW1wdGlvbiB0aGlzIGlzIGFuIGltYWdlIGRpcmVjdG9yeS4KKwkgKi8KKwlfVElGRlNldHVwRmllbGRzKHRpZiwgaW5mb2FycmF5KTsKKworCXRpZi0+dGlmX2Rpcm9mZiA9IDA7CisJdGlmLT50aWZfbmV4dGRpcm9mZiA9IDA7CisJdGlmLT50aWZfY3Vyb2ZmID0gMDsKKwl0aWYtPnRpZl9yb3cgPSAodWludDMyKSAtMTsKKwl0aWYtPnRpZl9jdXJzdHJpcCA9ICh1aW50MzIpIC0xOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorVElGRkNyZWF0ZUVYSUZEaXJlY3RvcnkoVElGRiogdGlmKQoreworCWNvbnN0IFRJRkZGaWVsZEFycmF5KiBleGlmRmllbGRBcnJheTsKKwlleGlmRmllbGRBcnJheSA9IF9USUZGR2V0RXhpZkZpZWxkcygpOworCXJldHVybiBUSUZGQ3JlYXRlQ3VzdG9tRGlyZWN0b3J5KHRpZiwgZXhpZkZpZWxkQXJyYXkpOworfQorCisvKgorICogU2V0dXAgYSBkZWZhdWx0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKi8KK2ludAorVElGRkRlZmF1bHREaXJlY3RvcnkoVElGRiogdGlmKQoreworCXJlZ2lzdGVyIFRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwljb25zdCBUSUZGRmllbGRBcnJheSogdGlmZkZpZWxkQXJyYXk7CisKKwl0aWZmRmllbGRBcnJheSA9IF9USUZGR2V0RmllbGRzKCk7CisJX1RJRkZTZXR1cEZpZWxkcyh0aWYsIHRpZmZGaWVsZEFycmF5KTsgICAKKworCV9USUZGbWVtc2V0KHRkLCAwLCBzaXplb2YgKCp0ZCkpOworCXRkLT50ZF9maWxsb3JkZXIgPSBGSUxMT1JERVJfTVNCMkxTQjsKKwl0ZC0+dGRfYml0c3BlcnNhbXBsZSA9IDE7CisJdGQtPnRkX3RocmVzaGhvbGRpbmcgPSBUSFJFU0hIT0xEX0JJTEVWRUw7CisJdGQtPnRkX29yaWVudGF0aW9uID0gT1JJRU5UQVRJT05fVE9QTEVGVDsKKwl0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID0gMTsKKwl0ZC0+dGRfcm93c3BlcnN0cmlwID0gKHVpbnQzMikgLTE7CisJdGQtPnRkX3RpbGV3aWR0aCA9IDA7CisJdGQtPnRkX3RpbGVsZW5ndGggPSAwOworCXRkLT50ZF90aWxlZGVwdGggPSAxOworCXRkLT50ZF9zdHJpcGJ5dGVjb3VudHNvcnRlZCA9IDE7IC8qIE91ciBvd24gYXJyYXlzIGFsd2F5cyBzb3J0ZWQuICovICAKKwl0ZC0+dGRfcmVzb2x1dGlvbnVuaXQgPSBSRVNVTklUX0lOQ0g7CisJdGQtPnRkX3NhbXBsZWZvcm1hdCA9IFNBTVBMRUZPUk1BVF9VSU5UOworCXRkLT50ZF9pbWFnZWRlcHRoID0gMTsKKwl0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1swXSA9IDI7CisJdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV0gPSAyOworCXRkLT50ZF95Y2JjcnBvc2l0aW9uaW5nID0gWUNCQ1JQT1NJVElPTl9DRU5URVJFRDsKKwl0aWYtPnRpZl9wb3N0ZGVjb2RlID0gX1RJRkZOb1Bvc3REZWNvZGU7ICAKKwl0aWYtPnRpZl9mb3VuZGZpZWxkID0gTlVMTDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IF9USUZGVlNldEZpZWxkOyAgCisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBfVElGRlZHZXRGaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyID0gTlVMTDsKKwkvKgorCSAqICBHaXZlIGNsaWVudCBjb2RlIGEgY2hhbmNlIHRvIGluc3RhbGwgdGhlaXIgb3duCisJICogIHRhZyBleHRlbnNpb25zICYgbWV0aG9kcywgcHJpb3IgdG8gY29tcHJlc3Npb24gb3ZlcmxvYWRzLgorCSAqLworCWlmIChfVElGRmV4dGVuZGVyKQorCQkoKl9USUZGZXh0ZW5kZXIpKHRpZik7CisJKHZvaWQpIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfQ09NUFJFU1NJT04sIENPTVBSRVNTSU9OX05PTkUpOworCS8qCisJICogTkI6IFRoZSBkaXJlY3RvcnkgaXMgbWFya2VkIGRpcnR5IGFzIGEgcmVzdWx0IG9mIHNldHRpbmcKKwkgKiB1cCB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBzY2hlbWUuICBIb3dldmVyLCB0aGlzIHJlYWxseQorCSAqIGlzbid0IGNvcnJlY3QgLS0gd2Ugd2FudCBUSUZGX0RJUlRZRElSRUNUIHRvIGJlIHNldCBvbmx5CisJICogaWYgdGhlIHVzZXIgZG9lcyBzb21ldGhpbmcuICBXZSBjb3VsZCBqdXN0IGRvIHRoZSBzZXR1cAorCSAqIGJ5IGhhbmQsIGJ1dCBpdCBzZWVtcyBiZXR0ZXIgdG8gdXNlIHRoZSBub3JtYWwgbWVjaGFuaXNtCisJICogKGkuZS4gVElGRlNldEZpZWxkKS4KKwkgKi8KKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9ESVJUWURJUkVDVDsKKworCS8qCisJICogQXMgcGVyIGh0dHA6Ly9idWd6aWxsYS5yZW1vdGVzZW5zaW5nLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTkKKwkgKiB3ZSBjbGVhciB0aGUgSVNUSUxFRCBmbGFnIHdoZW4gc2V0dGluZyB1cCBhIG5ldyBkaXJlY3RvcnkuCisJICogU2hvdWxkIHdlIGFsc28gYmUgY2xlYXJpbmcgc3R1ZmYgbGlrZSBJTlNVQklGRD8KKwkgKi8KKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9JU1RJTEVEOworCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorVElGRkFkdmFuY2VEaXJlY3RvcnkoVElGRiogdGlmLCB1aW50NjQqIG5leHRkaXIsIHVpbnQ2NCogb2ZmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZBZHZhbmNlRGlyZWN0b3J5IjsKKwlpZiAoaXNNYXBwZWQodGlmKSkKKwl7CisJCXVpbnQ2NCBwb2ZmPSpuZXh0ZGlyOworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQl0bXNpemVfdCBwb2ZmYSxwb2ZmYixwb2ZmYyxwb2ZmZDsKKwkJCXVpbnQxNiBkaXJjb3VudDsKKwkJCXVpbnQzMiBuZXh0ZGlyMzI7CisJCQlwb2ZmYT0odG1zaXplX3QpcG9mZjsKKwkJCXBvZmZiPXBvZmZhK3NpemVvZih1aW50MTYpOworCQkJaWYgKCgodWludDY0KXBvZmZhIT1wb2ZmKXx8KHBvZmZiPHBvZmZhKXx8KHBvZmZiPCh0bXNpemVfdClzaXplb2YodWludDE2KSl8fChwb2ZmYj50aWYtPnRpZl9zaXplKSkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBjb3VudCIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCV9USUZGbWVtY3B5KCZkaXJjb3VudCx0aWYtPnRpZl9iYXNlK3BvZmZhLHNpemVvZih1aW50MTYpKTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgmZGlyY291bnQpOworCQkJcG9mZmM9cG9mZmIrZGlyY291bnQqMTI7CisJCQlwb2ZmZD1wb2ZmYytzaXplb2YodWludDMyKTsKKwkJCWlmICgocG9mZmM8cG9mZmIpfHwocG9mZmM8ZGlyY291bnQqMTIpfHwocG9mZmQ8cG9mZmMpfHwocG9mZmQ8KHRtc2l6ZV90KXNpemVvZih1aW50MzIpKXx8KHBvZmZkPnRpZi0+dGlmX3NpemUpKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlpZiAob2ZmIT1OVUxMKQorCQkJCSpvZmY9KHVpbnQ2NClwb2ZmYzsKKwkJCV9USUZGbWVtY3B5KCZuZXh0ZGlyMzIsdGlmLT50aWZfYmFzZStwb2ZmYyxzaXplb2YodWludDMyKSk7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygmbmV4dGRpcjMyKTsKKwkJCSpuZXh0ZGlyPW5leHRkaXIzMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRtc2l6ZV90IHBvZmZhLHBvZmZiLHBvZmZjLHBvZmZkOworCQkJdWludDY0IGRpcmNvdW50NjQ7CisJCQl1aW50MTYgZGlyY291bnQxNjsKKwkJCXBvZmZhPSh0bXNpemVfdClwb2ZmOworCQkJcG9mZmI9cG9mZmErc2l6ZW9mKHVpbnQ2NCk7CisJCQlpZiAoKCh1aW50NjQpcG9mZmEhPXBvZmYpfHwocG9mZmI8cG9mZmEpfHwocG9mZmI8KHRtc2l6ZV90KXNpemVvZih1aW50NjQpKXx8KHBvZmZiPnRpZi0+dGlmX3NpemUpKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJX1RJRkZtZW1jcHkoJmRpcmNvdW50NjQsdGlmLT50aWZfYmFzZStwb2ZmYSxzaXplb2YodWludDY0KSk7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJmRpcmNvdW50NjQpOworCQkJaWYgKGRpcmNvdW50NjQ+MHhGRkZGKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU2FuaXR5IGNoZWNrIG9uIGRpcmVjdG9yeSBjb3VudCBmYWlsZWQiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlkaXJjb3VudDE2PSh1aW50MTYpZGlyY291bnQ2NDsKKwkJCXBvZmZjPXBvZmZiK2RpcmNvdW50MTYqMjA7CisJCQlwb2ZmZD1wb2ZmYytzaXplb2YodWludDY0KTsKKwkJCWlmICgocG9mZmM8cG9mZmIpfHwocG9mZmM8ZGlyY291bnQxNioyMCl8fChwb2ZmZDxwb2ZmYyl8fChwb2ZmZDwodG1zaXplX3Qpc2l6ZW9mKHVpbnQ2NCkpfHwocG9mZmQ+dGlmLT50aWZfc2l6ZSkpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgbGluayIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCWlmIChvZmYhPU5VTEwpCisJCQkJKm9mZj0odWludDY0KXBvZmZjOworCQkJX1RJRkZtZW1jcHkobmV4dGRpcix0aWYtPnRpZl9iYXNlK3BvZmZjLHNpemVvZih1aW50NjQpKTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nOChuZXh0ZGlyKTsKKwkJfQorCQlyZXR1cm4oMSk7CisJfQorCWVsc2UKKwl7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCXVpbnQxNiBkaXJjb3VudDsKKwkJCXVpbnQzMiBuZXh0ZGlyMzI7CisJCQlpZiAoIVNlZWtPSyh0aWYsICpuZXh0ZGlyKSB8fAorCQkJICAgICFSZWFkT0sodGlmLCAmZGlyY291bnQsIHNpemVvZiAodWludDE2KSkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXM6IEVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBjb3VudCIsCisJCQkJICAgIHRpZi0+dGlmX25hbWUpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgmZGlyY291bnQpOworCQkJaWYgKG9mZiAhPSBOVUxMKQorCQkJCSpvZmYgPSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBkaXJjb3VudCoxMiwgU0VFS19DVVIpOworCQkJZWxzZQorCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBkaXJjb3VudCoxMiwgU0VFS19DVVIpOworCQkJaWYgKCFSZWFkT0sodGlmLCAmbmV4dGRpcjMyLCBzaXplb2YgKHVpbnQzMikpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzOiBFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgbGluayIsCisJCQkJICAgIHRpZi0+dGlmX25hbWUpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nKCZuZXh0ZGlyMzIpOworCQkJKm5leHRkaXI9bmV4dGRpcjMyOworCQl9CisJCWVsc2UKKwkJeworCQkJdWludDY0IGRpcmNvdW50NjQ7CisJCQl1aW50MTYgZGlyY291bnQxNjsKKwkJCWlmICghU2Vla09LKHRpZiwgKm5leHRkaXIpIHx8CisJCQkgICAgIVJlYWRPSyh0aWYsICZkaXJjb3VudDY0LCBzaXplb2YgKHVpbnQ2NCkpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzOiBFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgY291bnQiLAorCQkJCSAgICB0aWYtPnRpZl9uYW1lKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJmRpcmNvdW50NjQpOworCQkJaWYgKGRpcmNvdW50NjQ+MHhGRkZGKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgY291bnQiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlkaXJjb3VudDE2ID0gKHVpbnQxNilkaXJjb3VudDY0OworCQkJaWYgKG9mZiAhPSBOVUxMKQorCQkJCSpvZmYgPSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBkaXJjb3VudDE2KjIwLCBTRUVLX0NVUik7CisJCQllbHNlCisJCQkJKHZvaWQpIFRJRkZTZWVrRmlsZSh0aWYsCisJCQkJICAgIGRpcmNvdW50MTYqMjAsIFNFRUtfQ1VSKTsKKwkJCWlmICghUmVhZE9LKHRpZiwgbmV4dGRpciwgc2l6ZW9mICh1aW50NjQpKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlczogRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiLAorCQkJCSAgICB0aWYtPnRpZl9uYW1lKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgobmV4dGRpcik7CisJCX0KKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGluIGEgZmlsZS4KKyAqLwordWludDE2CitUSUZGTnVtYmVyT2ZEaXJlY3RvcmllcyhUSUZGKiB0aWYpCit7CisJdWludDY0IG5leHRkaXI7CisJdWludDE2IG47CisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmOworCWVsc2UKKwkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmY7CisJbiA9IDA7CisJd2hpbGUgKG5leHRkaXIgIT0gMCAmJiBUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCBOVUxMKSkKKwkJbisrOworCXJldHVybiAobik7Cit9CisKKy8qCisgKiBTZXQgdGhlIG4tdGggZGlyZWN0b3J5IGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqIE5COiBEaXJlY3RvcmllcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgYXQgMC4KKyAqLworaW50CitUSUZGU2V0RGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDE2IGRpcm4pCit7CisJdWludDY0IG5leHRkaXI7CisJdWludDE2IG47CisKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmY7CisJZWxzZQorCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZjsKKwlmb3IgKG4gPSBkaXJuOyBuID4gMCAmJiBuZXh0ZGlyICE9IDA7IG4tLSkKKwkJaWYgKCFUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCBOVUxMKSkKKwkJCXJldHVybiAoMCk7CisJdGlmLT50aWZfbmV4dGRpcm9mZiA9IG5leHRkaXI7CisJLyoKKwkgKiBTZXQgY3VyZGlyIHRvIHRoZSBhY3R1YWwgZGlyZWN0b3J5IGluZGV4LiAgVGhlCisJICogLTEgaXMgYmVjYXVzZSBUSUZGUmVhZERpcmVjdG9yeSB3aWxsIGluY3JlbWVudAorCSAqIHRpZl9jdXJkaXIgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHJlYWRpbmcgdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwl0aWYtPnRpZl9jdXJkaXIgPSAoZGlybiAtIG4pIC0gMTsKKwkvKgorCSAqIFJlc2V0IHRpZl9kaXJudW1iZXIgY291bnRlciBhbmQgc3RhcnQgbmV3IGxpc3Qgb2Ygc2VlbiBkaXJlY3Rvcmllcy4KKwkgKiBXZSBuZWVkIHRoaXMgdG8gcHJldmVudCBJRkQgbG9vcHMuCisJICovCisJdGlmLT50aWZfZGlybnVtYmVyID0gMDsKKwlyZXR1cm4gKFRJRkZSZWFkRGlyZWN0b3J5KHRpZikpOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byBiZSB0aGUgZGlyZWN0b3J5CisgKiBsb2NhdGVkIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBvZmZzZXQuICBUaGlzIGludGVyZmFjZQorICogaXMgdXNlZCBtYWlubHkgdG8gYWNjZXNzIGRpcmVjdG9yaWVzIGxpbmtlZCB3aXRoCisgKiB0aGUgU3ViSUZEIHRhZyAoZS5nLiB0aHVtYm5haWwgaW1hZ2VzKS4KKyAqLworaW50CitUSUZGU2V0U3ViRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0IGRpcm9mZikKK3sKKwl0aWYtPnRpZl9uZXh0ZGlyb2ZmID0gZGlyb2ZmOworCS8qCisJICogUmVzZXQgdGlmX2Rpcm51bWJlciBjb3VudGVyIGFuZCBzdGFydCBuZXcgbGlzdCBvZiBzZWVuIGRpcmVjdG9yaWVzLgorCSAqIFdlIG5lZWQgdGhpcyB0byBwcmV2ZW50IElGRCBsb29wcy4KKwkgKi8KKwl0aWYtPnRpZl9kaXJudW1iZXIgPSAwOworCXJldHVybiAoVElGRlJlYWREaXJlY3RvcnkodGlmKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gZmlsZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICovCit1aW50NjQKK1RJRkZDdXJyZW50RGlyT2Zmc2V0KFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2Rpcm9mZik7Cit9CisKKy8qCisgKiBSZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUKKyAqIGF0IHRoZSBsYXN0IGRpcmVjdG9yeSBpbiB0aGUgZmlsZS4KKyAqLworaW50CitUSUZGTGFzdERpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9uZXh0ZGlyb2ZmID09IDApOworfQorCisvKgorICogVW5saW5rIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZyb20gdGhlIGRpcmVjdG9yeSBjaGFpbi4KKyAqLworaW50CitUSUZGVW5saW5rRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDE2IGRpcm4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlVubGlua0RpcmVjdG9yeSI7CisJdWludDY0IG5leHRkaXI7CisJdWludDY0IG9mZjsKKwl1aW50MTYgbjsKKworCWlmICh0aWYtPnRpZl9tb2RlID09IE9fUkRPTkxZKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHVubGluayBkaXJlY3RvcnkgaW4gcmVhZC1vbmx5IGZpbGUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyoKKwkgKiBHbyB0byB0aGUgZGlyZWN0b3J5IGJlZm9yZSB0aGUgb25lIHdlIHdhbnQKKwkgKiB0byB1bmxpbmsgYW5kIG5hYiB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5rCisJICogZmllbGQgd2UnbGwgbmVlZCB0byBwYXRjaC4KKwkgKi8KKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmOworCQlvZmYgPSA0OworCX0KKwllbHNlCisJeworCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZjsKKwkJb2ZmID0gODsKKwl9CisJZm9yIChuID0gZGlybi0xOyBuID4gMDsgbi0tKSB7CisJCWlmIChuZXh0ZGlyID09IDApIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJEaXJlY3RvcnkgJWQgZG9lcyBub3QgZXhpc3QiLCBkaXJuKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJaWYgKCFUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCAmb2ZmKSkKKwkJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogQWR2YW5jZSB0byB0aGUgZGlyZWN0b3J5IHRvIGJlIHVubGlua2VkIGFuZCBmZXRjaAorCSAqIHRoZSBvZmZzZXQgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGZvbGxvd3MuCisJICovCisJaWYgKCFUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCBOVUxMKSkKKwkJcmV0dXJuICgwKTsKKwkvKgorCSAqIEdvIGJhY2sgYW5kIHBhdGNoIHRoZSBsaW5rIGZpZWxkIG9mIHRoZSBwcmVjZWRpbmcKKwkgKiBkaXJlY3RvcnkgdG8gcG9pbnQgdG8gdGhlIG9mZnNldCBvZiB0aGUgZGlyZWN0b3J5CisJICogdGhhdCBmb2xsb3dzLgorCSAqLworCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLCBvZmYsIFNFRUtfU0VUKTsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJdWludDMyIG5leHRkaXIzMjsKKwkJbmV4dGRpcjMyPSh1aW50MzIpbmV4dGRpcjsKKwkJYXNzZXJ0KCh1aW50NjQpbmV4dGRpcjMyPT1uZXh0ZGlyKTsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZuZXh0ZGlyMzIpOworCQlpZiAoIVdyaXRlT0sodGlmLCAmbmV4dGRpcjMyLCBzaXplb2YgKHVpbnQzMikpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgbGluayIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmc4KCZuZXh0ZGlyKTsKKwkJaWYgKCFXcml0ZU9LKHRpZiwgJm5leHRkaXIsIHNpemVvZiAodWludDY0KSkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJFcnJvciB3cml0aW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCS8qCisJICogTGVhdmUgZGlyZWN0b3J5IHN0YXRlIHNldHVwIHNhZmVseS4gIFdlIGRvbid0IGhhdmUKKwkgKiBmYWNpbGl0aWVzIGZvciBkb2luZyBpbnNlcnRpbmcgYW5kIHJlbW92aW5nIGRpcmVjdG9yaWVzLAorCSAqIHNvIGl0J3Mgc2FmZXN0IHRvIGp1c3QgaW52YWxpZGF0ZSBldmVyeXRoaW5nLiAgVGhpcworCSAqIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBjYW4gb25seSBhcHBlbmQgdG8gdGhlIGRpcmVjdG9yeQorCSAqIGNoYWluLgorCSAqLworCSgqdGlmLT50aWZfY2xlYW51cCkodGlmKTsKKwlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikgJiYgdGlmLT50aWZfcmF3ZGF0YSkgeworCQlfVElGRmZyZWUodGlmLT50aWZfcmF3ZGF0YSk7CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IDA7CisJfQorCXRpZi0+dGlmX2ZsYWdzICY9IH4oVElGRl9CRUVOV1JJVElOR3xUSUZGX0JVRkZFUlNFVFVQfFRJRkZfUE9TVEVOQ09ERXxUSUZGX0JVRjRXUklURSk7CisJVElGRkZyZWVEaXJlY3RvcnkodGlmKTsKKwlUSUZGRGVmYXVsdERpcmVjdG9yeSh0aWYpOworCXRpZi0+dGlmX2Rpcm9mZiA9IDA7CQkJLyogZm9yY2UgbGluayBvbiBuZXh0IHdyaXRlICovCisJdGlmLT50aWZfbmV4dGRpcm9mZiA9IDA7CQkvKiBuZXh0IHdyaXRlIG11c3QgYmUgYXQgZW5kICovCisJdGlmLT50aWZfY3Vyb2ZmID0gMDsKKwl0aWYtPnRpZl9yb3cgPSAodWludDMyKSAtMTsKKwl0aWYtPnRpZl9jdXJzdHJpcCA9ICh1aW50MzIpIC0xOworCXJldHVybiAoMSk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2Rpci5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmNWYzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2Rpci5oCkBAIC0wLDAgKzEsMzA4IEBACisvKiAkSWQ6IHRpZl9kaXIuaCx2IDEuNTQgMjAxMS0wMi0xOCAyMDo1MzowNSBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9USUZGRElSXworI2RlZmluZQlfVElGRkRJUl8KKy8qCisgKiBgYExpYnJhcnktcHJpdmF0ZScnIERpcmVjdG9yeS1yZWxhdGVkIERlZmluaXRpb25zLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBUSUZGRmllbGQgKmluZm87CisJaW50ICAgICAgICAgICAgIGNvdW50OworCXZvaWQgICAgICAgICAgICp2YWx1ZTsKK30gVElGRlRhZ1ZhbHVlOworCisvKgorICogVElGRiBJbWFnZSBGaWxlIERpcmVjdG9yaWVzIGFyZSBjb21wcmlzZWQgb2YgYSB0YWJsZSBvZiBmaWVsZAorICogZGVzY3JpcHRvcnMgb2YgdGhlIGZvcm0gc2hvd24gYmVsb3cuICBUaGUgdGFibGUgaXMgc29ydGVkIGluCisgKiBhc2NlbmRpbmcgb3JkZXIgYnkgdGFnLiAgVGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBlbnRyeSBhcmUKKyAqIGRpc2pvaW50IGFuZCBtYXkgYXBwZWFyIGFueXdoZXJlIGluIHRoZSBmaWxlIChzbyBsb25nIGFzIHRoZXkgYXJlCisgKiBwbGFjZWQgb24gYSB3b3JkIGJvdW5kYXJ5KS4KKyAqCisgKiBJZiB0aGUgdmFsdWUgaXMgNCBieXRlcyBvciBsZXNzLCBpbiBDbGFzc2ljVElGRiwgb3IgOCBieXRlcyBvciBsZXNzIGluCisgKiBCaWdUSUZGLCB0aGVuIGl0IGlzIHBsYWNlZCBpbiB0aGUgb2Zmc2V0IGZpZWxkIHRvIHNhdmUgc3BhY2UuIElmIHNvLAorICogaXQgaXMgbGVmdC1qdXN0aWZpZWQgaW4gdGhlIG9mZnNldCBmaWVsZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNiB0ZGlyX3RhZzsgICAgICAgIC8qIHNlZSBiZWxvdyAqLworCXVpbnQxNiB0ZGlyX3R5cGU7ICAgICAgIC8qIGRhdGEgdHlwZTsgc2VlIGJlbG93ICovCisJdWludDY0IHRkaXJfY291bnQ7ICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zOyBsZW5ndGggaW4gc3BlYyAqLworCXVuaW9uIHsKKwkJdWludDE2IHRvZmZfc2hvcnQ7CisJCXVpbnQzMiB0b2ZmX2xvbmc7CisJCXVpbnQ2NCB0b2ZmX2xvbmc4OworCX0gdGRpcl9vZmZzZXQ7CQkvKiBlaXRoZXIgb2Zmc2V0IG9yIHRoZSBkYXRhIGl0c2VsZiBpZiBmaXRzICovCit9IFRJRkZEaXJFbnRyeTsKKworLyoKKyAqIEludGVybmFsIGZvcm1hdCBvZiBhIFRJRkYgZGlyZWN0b3J5IGVudHJ5LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisjZGVmaW5lIEZJRUxEX1NFVExPTkdTIDQKKwkvKiBiaXQgdmVjdG9yIG9mIGZpZWxkcyB0aGF0IGFyZSBzZXQgKi8KKwl1bnNpZ25lZCBsb25nIHRkX2ZpZWxkc3NldFtGSUVMRF9TRVRMT05HU107CisKKwl1aW50MzIgIHRkX2ltYWdld2lkdGgsIHRkX2ltYWdlbGVuZ3RoLCB0ZF9pbWFnZWRlcHRoOworCXVpbnQzMiAgdGRfdGlsZXdpZHRoLCB0ZF90aWxlbGVuZ3RoLCB0ZF90aWxlZGVwdGg7CisJdWludDMyICB0ZF9zdWJmaWxldHlwZTsKKwl1aW50MTYgIHRkX2JpdHNwZXJzYW1wbGU7CisJdWludDE2ICB0ZF9zYW1wbGVmb3JtYXQ7CisJdWludDE2ICB0ZF9jb21wcmVzc2lvbjsKKwl1aW50MTYgIHRkX3Bob3RvbWV0cmljOworCXVpbnQxNiAgdGRfdGhyZXNoaG9sZGluZzsKKwl1aW50MTYgIHRkX2ZpbGxvcmRlcjsKKwl1aW50MTYgIHRkX29yaWVudGF0aW9uOworCXVpbnQxNiAgdGRfc2FtcGxlc3BlcnBpeGVsOworCXVpbnQzMiAgdGRfcm93c3BlcnN0cmlwOworCXVpbnQxNiAgdGRfbWluc2FtcGxldmFsdWUsIHRkX21heHNhbXBsZXZhbHVlOworCWRvdWJsZSogdGRfc21pbnNhbXBsZXZhbHVlOworCWRvdWJsZSogdGRfc21heHNhbXBsZXZhbHVlOworCWZsb2F0ICAgdGRfeHJlc29sdXRpb24sIHRkX3lyZXNvbHV0aW9uOworCXVpbnQxNiAgdGRfcmVzb2x1dGlvbnVuaXQ7CisJdWludDE2ICB0ZF9wbGFuYXJjb25maWc7CisJZmxvYXQgICB0ZF94cG9zaXRpb24sIHRkX3lwb3NpdGlvbjsKKwl1aW50MTYgIHRkX3BhZ2VudW1iZXJbMl07CisJdWludDE2KiB0ZF9jb2xvcm1hcFszXTsKKwl1aW50MTYgIHRkX2hhbGZ0b25laGludHNbMl07CisJdWludDE2ICB0ZF9leHRyYXNhbXBsZXM7CisJdWludDE2KiB0ZF9zYW1wbGVpbmZvOworCS8qIGV2ZW4gdGhvdWdoIHRoZSBuYW1lIGlzIG1pc2xlYWRpbmcsIHRkX3N0cmlwc3BlcmltYWdlIGlzIHRoZSBudW1iZXIKKwkgKiBvZiBzdHJpbGVzICg9c3RyaXBzIG9yIHRpbGVzKSBwZXIgcGxhbmUsIGFuZCB0ZF9uc3RyaXBzIHRoZSB0b3RhbAorCSAqIG51bWJlciBvZiBzdHJpbGVzICovCisJdWludDMyICB0ZF9zdHJpcHNwZXJpbWFnZTsgIAorCXVpbnQzMiAgdGRfbnN0cmlwczsgICAgICAgICAgICAgIC8qIHNpemUgb2Ygb2Zmc2V0ICYgYnl0ZWNvdW50IGFycmF5cyAqLworCXVpbnQ2NCogdGRfc3RyaXBvZmZzZXQ7CisJdWludDY0KiB0ZF9zdHJpcGJ5dGVjb3VudDsKKwlpbnQgICAgIHRkX3N0cmlwYnl0ZWNvdW50c29ydGVkOyAvKiBpcyB0aGUgYnl0ZWNvdW50IGFycmF5IHNvcnRlZCBhc2NlbmRpbmc/ICovCisjaWYgZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkKKyAgICAgICAgVElGRkRpckVudHJ5IHRkX3N0cmlwb2Zmc2V0X2VudHJ5OyAgICAvKiBmb3IgZGVmZXJyZWQgbG9hZGluZyAqLworICAgICAgICBUSUZGRGlyRW50cnkgdGRfc3RyaXBieXRlY291bnRfZW50cnk7IC8qIGZvciBkZWZlcnJlZCBsb2FkaW5nICovCisjZW5kaWYKKwl1aW50MTYgIHRkX25zdWJpZmQ7CisJdWludDY0KiB0ZF9zdWJpZmQ7CisJLyogWUNiQ3IgcGFyYW1ldGVycyAqLworCXVpbnQxNiAgdGRfeWNiY3JzdWJzYW1wbGluZ1syXTsKKwl1aW50MTYgIHRkX3ljYmNycG9zaXRpb25pbmc7CisJLyogQ29sb3JpbWV0cnkgcGFyYW1ldGVycyAqLworCXVpbnQxNiogdGRfdHJhbnNmZXJmdW5jdGlvblszXTsKKwlmbG9hdCoJdGRfcmVmYmxhY2t3aGl0ZTsKKwkvKiBDTVlLIHBhcmFtZXRlcnMgKi8KKwlpbnQgICAgIHRkX2lua25hbWVzbGVuOworCWNoYXIqICAgdGRfaW5rbmFtZXM7CisKKwlpbnQgICAgIHRkX2N1c3RvbVZhbHVlQ291bnQ7CisgICAgICAgIFRJRkZUYWdWYWx1ZSAqdGRfY3VzdG9tVmFsdWVzOworfSBUSUZGRGlyZWN0b3J5OworCisvKgorICogRmllbGQgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gc2V0IGluIGEgZGlyZWN0b3J5LCBhbmQKKyAqIHRvIHJlZmVyZW5jZSBmaWVsZHMgd2hlbiBtYW5pcHVsYXRpbmcgYSBkaXJlY3RvcnkuCisgKi8KKworLyoKKyAqIEZJRUxEX0lHTk9SRSBpcyB1c2VkIHRvIHNpZ25pZnkgdGFncyB0aGF0IGFyZSB0byBiZSBwcm9jZXNzZWQgYnV0IG90aGVyd2lzZQorICogaWdub3JlZC4gIFRoaXMgcGVybWl0cyBhbnRpcXVhdGVkIHRhZ3MgdG8gYmUgcXVpZXRseSByZWFkIGFuZCBkaXNjYXJkZWQuCisgKiBOb3RlIHRoYXQgYSBiaXQgKmlzKiBhbGxvY2F0ZWQgZm9yIGlnbm9yZWQgdGFnczsgdGhpcyBpcyB1bmRlcnN0b29kIGJ5IHRoZQorICogZGlyZWN0b3J5IHJlYWRpbmcgbG9naWMgd2hpY2ggdXNlcyB0aGlzIGZhY3QgdG8gYXZvaWQgc3BlY2lhbC1jYXNlIGhhbmRsaW5nCisgKi8KKyNkZWZpbmUgRklFTERfSUdOT1JFICAgICAgICAgICAgICAgICAgIDAKKworLyogbXVsdGktaXRlbSBmaWVsZHMgKi8KKyNkZWZpbmUgRklFTERfSU1BR0VESU1FTlNJT05TICAgICAgICAgIDEKKyNkZWZpbmUgRklFTERfVElMRURJTUVOU0lPTlMgICAgICAgICAgIDIKKyNkZWZpbmUgRklFTERfUkVTT0xVVElPTiAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgRklFTERfUE9TSVRJT04gICAgICAgICAgICAgICAgIDQKKworLyogc2luZ2xlLWl0ZW0gZmllbGRzICovCisjZGVmaW5lIEZJRUxEX1NVQkZJTEVUWVBFICAgICAgICAgICAgICA1CisjZGVmaW5lIEZJRUxEX0JJVFNQRVJTQU1QTEUgICAgICAgICAgICA2CisjZGVmaW5lIEZJRUxEX0NPTVBSRVNTSU9OICAgICAgICAgICAgICA3CisjZGVmaW5lIEZJRUxEX1BIT1RPTUVUUklDICAgICAgICAgICAgICA4CisjZGVmaW5lIEZJRUxEX1RIUkVTSEhPTERJTkcgICAgICAgICAgICA5CisjZGVmaW5lIEZJRUxEX0ZJTExPUkRFUiAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBGSUVMRF9PUklFTlRBVElPTiAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgRklFTERfU0FNUExFU1BFUlBJWEVMICAgICAgICAgIDE2CisjZGVmaW5lIEZJRUxEX1JPV1NQRVJTVFJJUCAgICAgICAgICAgICAxNworI2RlZmluZSBGSUVMRF9NSU5TQU1QTEVWQUxVRSAgICAgICAgICAgMTgKKyNkZWZpbmUgRklFTERfTUFYU0FNUExFVkFMVUUgICAgICAgICAgIDE5CisjZGVmaW5lIEZJRUxEX1BMQU5BUkNPTkZJRyAgICAgICAgICAgICAyMAorI2RlZmluZSBGSUVMRF9SRVNPTFVUSU9OVU5JVCAgICAgICAgICAgMjIKKyNkZWZpbmUgRklFTERfUEFHRU5VTUJFUiAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIEZJRUxEX1NUUklQQllURUNPVU5UUyAgICAgICAgICAyNAorI2RlZmluZSBGSUVMRF9TVFJJUE9GRlNFVFMgICAgICAgICAgICAgMjUKKyNkZWZpbmUgRklFTERfQ09MT1JNQVAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIEZJRUxEX0VYVFJBU0FNUExFUyAgICAgICAgICAgICAzMQorI2RlZmluZSBGSUVMRF9TQU1QTEVGT1JNQVQgICAgICAgICAgICAgMzIKKyNkZWZpbmUgRklFTERfU01JTlNBTVBMRVZBTFVFICAgICAgICAgIDMzCisjZGVmaW5lIEZJRUxEX1NNQVhTQU1QTEVWQUxVRSAgICAgICAgICAzNAorI2RlZmluZSBGSUVMRF9JTUFHRURFUFRIICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgRklFTERfVElMRURFUFRIICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIEZJRUxEX0hBTEZUT05FSElOVFMgICAgICAgICAgICAzNworI2RlZmluZSBGSUVMRF9ZQ0JDUlNVQlNBTVBMSU5HICAgICAgICAgMzkKKyNkZWZpbmUgRklFTERfWUNCQ1JQT1NJVElPTklORyAgICAgICAgIDQwCisjZGVmaW5lCUZJRUxEX1JFRkJMQUNLV0hJVEUgICAgICAgICAgICA0MQorI2RlZmluZSBGSUVMRF9UUkFOU0ZFUkZVTkNUSU9OICAgICAgICAgNDQKKyNkZWZpbmUgRklFTERfSU5LTkFNRVMgICAgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIEZJRUxEX1NVQklGRCAgICAgICAgICAgICAgICAgICA0OQorLyogICAgICBGSUVMRF9DVVNUT00gKHNlZSB0aWZmaW8uaCkgICAgNjUgKi8KKy8qIGVuZCBvZiBzdXBwb3J0IGZvciB3ZWxsLWtub3duIHRhZ3M7IGNvZGVjLXByaXZhdGUgdGFncyBmb2xsb3cgKi8KKyNkZWZpbmUgRklFTERfQ09ERUMgICAgICAgICAgICAgICAgICAgIDY2ICAvKiBiYXNlIG9mIGNvZGVjLXByaXZhdGUgdGFncyAqLworCisKKy8qCisgKiBQc2V1ZG8tdGFncyBkb24ndCBub3JtYWxseSBuZWVkIGZpZWxkIGJpdHMgc2luY2UgdGhleSBhcmUgbm90IHdyaXR0ZW4gdG8gYW4KKyAqIG91dHB1dCBmaWxlIChieSBkZWZpbml0aW9uKS4gVGhlIGxpYnJhcnkgYWxzbyBoYXMgZXhwcmVzcyBsb2dpYyB0byBhbHdheXMKKyAqIHF1ZXJ5IGEgY29kZWMgZm9yIGEgcHNldWRvLXRhZyBzbyBhbGxvY2F0aW5nIGEgZmllbGQgYml0IGZvciBvbmUgaXMgYQorICogd2FzdGUuICAgSWYgY29kZWMgd2FudHMgdG8gcHJvbW90ZSB0aGUgbm90aW9uIG9mIGEgcHNldWRvLXRhZyBiZWluZyBgYHNldCcnCisgKiBvciBgYHVuc2V0JycgdGhlbiBpdCBjYW4gZG8gdXNpbmcgaW50ZXJuYWwgc3RhdGUgZmxhZ3Mgd2l0aG91dCBwb2xsdXRpbmcKKyAqIHRoZSBmaWVsZCBiaXQgc3BhY2UgZGVmaW5lZCBmb3IgcmVhbCB0YWdzLgorICovCisjZGVmaW5lIEZJRUxEX1BTRVVETwkJCTAKKworI2RlZmluZSBGSUVMRF9MQVNUCQkJKDMyKkZJRUxEX1NFVExPTkdTLTEpCisKKyNkZWZpbmUgQklUbihuKQkJCQkoKCh1bnNpZ25lZCBsb25nKTFMKTw8KChuKSYweDFmKSkKKyNkZWZpbmUgQklURklFTERuKHRpZiwgbikJCSgodGlmKS0+dGlmX2Rpci50ZF9maWVsZHNzZXRbKG4pLzMyXSkKKyNkZWZpbmUgVElGRkZpZWxkU2V0KHRpZiwgZmllbGQpCShCSVRGSUVMRG4odGlmLCBmaWVsZCkgJiBCSVRuKGZpZWxkKSkKKyNkZWZpbmUgVElGRlNldEZpZWxkQml0KHRpZiwgZmllbGQpCShCSVRGSUVMRG4odGlmLCBmaWVsZCkgfD0gQklUbihmaWVsZCkpCisjZGVmaW5lIFRJRkZDbHJGaWVsZEJpdCh0aWYsIGZpZWxkKQkoQklURklFTERuKHRpZiwgZmllbGQpICY9IH5CSVRuKGZpZWxkKSkKKworI2RlZmluZSBGaWVsZFNldChmaWVsZHMsIGYpCQkoZmllbGRzWyhmKS8zMl0gJiBCSVRuKGYpKQorI2RlZmluZSBSZXNldEZpZWxkQml0KGZpZWxkcywgZikJKGZpZWxkc1soZikvMzJdICY9IH5CSVRuKGYpKQorCit0eXBlZGVmIGVudW0geworCVRJRkZfU0VUR0VUX1VOREVGSU5FRCA9IDAsCisJVElGRl9TRVRHRVRfQVNDSUkgPSAxLAorCVRJRkZfU0VUR0VUX1VJTlQ4ID0gMiwKKwlUSUZGX1NFVEdFVF9TSU5UOCA9IDMsCisJVElGRl9TRVRHRVRfVUlOVDE2ID0gNCwKKwlUSUZGX1NFVEdFVF9TSU5UMTYgPSA1LAorCVRJRkZfU0VUR0VUX1VJTlQzMiA9IDYsCisJVElGRl9TRVRHRVRfU0lOVDMyID0gNywKKwlUSUZGX1NFVEdFVF9VSU5UNjQgPSA4LAorCVRJRkZfU0VUR0VUX1NJTlQ2NCA9IDksCisJVElGRl9TRVRHRVRfRkxPQVQgPSAxMCwKKwlUSUZGX1NFVEdFVF9ET1VCTEUgPSAxMSwKKwlUSUZGX1NFVEdFVF9JRkQ4ID0gMTIsCisJVElGRl9TRVRHRVRfSU5UID0gMTMsCisJVElGRl9TRVRHRVRfVUlOVDE2X1BBSVIgPSAxNCwKKwlUSUZGX1NFVEdFVF9DMF9BU0NJSSA9IDE1LAorCVRJRkZfU0VUR0VUX0MwX1VJTlQ4ID0gMTYsCisJVElGRl9TRVRHRVRfQzBfU0lOVDggPSAxNywKKwlUSUZGX1NFVEdFVF9DMF9VSU5UMTYgPSAxOCwKKwlUSUZGX1NFVEdFVF9DMF9TSU5UMTYgPSAxOSwKKwlUSUZGX1NFVEdFVF9DMF9VSU5UMzIgPSAyMCwKKwlUSUZGX1NFVEdFVF9DMF9TSU5UMzIgPSAyMSwKKwlUSUZGX1NFVEdFVF9DMF9VSU5UNjQgPSAyMiwKKwlUSUZGX1NFVEdFVF9DMF9TSU5UNjQgPSAyMywKKwlUSUZGX1NFVEdFVF9DMF9GTE9BVCA9IDI0LAorCVRJRkZfU0VUR0VUX0MwX0RPVUJMRSA9IDI1LAorCVRJRkZfU0VUR0VUX0MwX0lGRDggPSAyNiwKKwlUSUZGX1NFVEdFVF9DMTZfQVNDSUkgPSAyNywKKwlUSUZGX1NFVEdFVF9DMTZfVUlOVDggPSAyOCwKKwlUSUZGX1NFVEdFVF9DMTZfU0lOVDggPSAyOSwKKwlUSUZGX1NFVEdFVF9DMTZfVUlOVDE2ID0gMzAsCisJVElGRl9TRVRHRVRfQzE2X1NJTlQxNiA9IDMxLAorCVRJRkZfU0VUR0VUX0MxNl9VSU5UMzIgPSAzMiwKKwlUSUZGX1NFVEdFVF9DMTZfU0lOVDMyID0gMzMsCisJVElGRl9TRVRHRVRfQzE2X1VJTlQ2NCA9IDM0LAorCVRJRkZfU0VUR0VUX0MxNl9TSU5UNjQgPSAzNSwKKwlUSUZGX1NFVEdFVF9DMTZfRkxPQVQgPSAzNiwKKwlUSUZGX1NFVEdFVF9DMTZfRE9VQkxFID0gMzcsCisJVElGRl9TRVRHRVRfQzE2X0lGRDggPSAzOCwKKwlUSUZGX1NFVEdFVF9DMzJfQVNDSUkgPSAzOSwKKwlUSUZGX1NFVEdFVF9DMzJfVUlOVDggPSA0MCwKKwlUSUZGX1NFVEdFVF9DMzJfU0lOVDggPSA0MSwKKwlUSUZGX1NFVEdFVF9DMzJfVUlOVDE2ID0gNDIsCisJVElGRl9TRVRHRVRfQzMyX1NJTlQxNiA9IDQzLAorCVRJRkZfU0VUR0VUX0MzMl9VSU5UMzIgPSA0NCwKKwlUSUZGX1NFVEdFVF9DMzJfU0lOVDMyID0gNDUsCisJVElGRl9TRVRHRVRfQzMyX1VJTlQ2NCA9IDQ2LAorCVRJRkZfU0VUR0VUX0MzMl9TSU5UNjQgPSA0NywKKwlUSUZGX1NFVEdFVF9DMzJfRkxPQVQgPSA0OCwKKwlUSUZGX1NFVEdFVF9DMzJfRE9VQkxFID0gNDksCisJVElGRl9TRVRHRVRfQzMyX0lGRDggPSA1MCwKKwlUSUZGX1NFVEdFVF9PVEhFUiA9IDUxCit9IFRJRkZTZXRHZXRGaWVsZFR5cGU7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IFRJRkZGaWVsZEFycmF5KiBfVElGRkdldEZpZWxkcyh2b2lkKTsKK2V4dGVybiBjb25zdCBUSUZGRmllbGRBcnJheSogX1RJRkZHZXRFeGlmRmllbGRzKHZvaWQpOworZXh0ZXJuIHZvaWQgX1RJRkZTZXR1cEZpZWxkcyhUSUZGKiB0aWYsIGNvbnN0IFRJRkZGaWVsZEFycmF5KiBpbmZvYXJyYXkpOworZXh0ZXJuIHZvaWQgX1RJRkZQcmludEZpZWxkSW5mbyhUSUZGKiwgRklMRSopOworCitleHRlcm4gaW50IF9USUZGRmlsbFN0cmlsZXMoVElGRiopOyAgICAgICAgCisKK3R5cGVkZWYgZW51bSB7CisJdGZpYXRJbWFnZSwKKwl0ZmlhdEV4aWYsCisJdGZpYXRPdGhlcgorfSBUSUZGRmllbGRBcnJheVR5cGU7CisKK3N0cnVjdCBfVElGRkZpZWxkQXJyYXkgeworCVRJRkZGaWVsZEFycmF5VHlwZSB0eXBlOyAgICAvKiBhcnJheSB0eXBlLCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIElGRCBpcyBpbWFnZSBhbmQgc3VjaCAqLworCXVpbnQzMiBhbGxvY2F0ZWRfc2l6ZTsgICAgICAvKiAwIGlmIGFycmF5IGlzIGNvbnN0YW50LCBvdGhlciBpZiBtb2RpZmllZCBieSBmdXR1cmUgZGVmaW5pdGlvbiBleHRlbnNpb24gc3VwcG9ydCAqLworCXVpbnQzMiBjb3VudDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gZmllbGRzIGFycmF5ICovCisJVElGRkZpZWxkKiBmaWVsZHM7ICAgICAgICAgIC8qIGFjdHVhbCBmaWVsZCBpbmZvICovCit9OworCitzdHJ1Y3QgX1RJRkZGaWVsZCB7CisJdWludDMyIGZpZWxkX3RhZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpZWxkJ3MgdGFnICovCisJc2hvcnQgZmllbGRfcmVhZGNvdW50OyAgICAgICAgICAgICAgICAgIC8qIHJlYWQgY291bnQvVElGRl9WQVJJQUJMRS9USUZGX1NQUCAqLworCXNob3J0IGZpZWxkX3dyaXRlY291bnQ7ICAgICAgICAgICAgICAgICAvKiB3cml0ZSBjb3VudC9USUZGX1ZBUklBQkxFICovCisJVElGRkRhdGFUeXBlIGZpZWxkX3R5cGU7ICAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgYXNzb2NpYXRlZCBkYXRhICovCisJdWludDMyIHJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uICovCisJVElGRlNldEdldEZpZWxkVHlwZSBzZXRfZmllbGRfdHlwZTsgICAgIC8qIHR5cGUgdG8gYmUgcGFzc2VkIHRvIFRJRkZTZXRGaWVsZCAqLworCVRJRkZTZXRHZXRGaWVsZFR5cGUgZ2V0X2ZpZWxkX3R5cGU7ICAgICAvKiB0eXBlIHRvIGJlIHBhc3NlZCB0byBUSUZGR2V0RmllbGQgKi8KKwl1bnNpZ25lZCBzaG9ydCBmaWVsZF9iaXQ7ICAgICAgICAgICAgICAgLyogYml0IGluIGZpZWxkc3NldCBiaXQgdmVjdG9yICovCisJdW5zaWduZWQgY2hhciBmaWVsZF9va3RvY2hhbmdlOyAgICAgICAgIC8qIGlmIHRydWUsIGNhbiBjaGFuZ2Ugd2hpbGUgd3JpdGluZyAqLworCXVuc2lnbmVkIGNoYXIgZmllbGRfcGFzc2NvdW50OyAgICAgICAgICAvKiBpZiB0cnVlLCBwYXNzIGRpciBjb3VudCBvbiBzZXQgKi8KKwljaGFyKiBmaWVsZF9uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogQVNDSUkgbmFtZSAqLworCVRJRkZGaWVsZEFycmF5KiBmaWVsZF9zdWJmaWVsZHM7ICAgICAgICAvKiBpZiBmaWVsZCBwb2ludHMgdG8gY2hpbGQgaWZkcywgY2hpbGQgaWZkIGZpZWxkIGRlZmluaXRpb24gYXJyYXkgKi8KK307CisKK2V4dGVybiBpbnQgX1RJRkZNZXJnZUZpZWxkcyhUSUZGKiwgY29uc3QgVElGRkZpZWxkW10sIHVpbnQzMik7CitleHRlcm4gY29uc3QgVElGRkZpZWxkKiBfVElGRkZpbmRPclJlZ2lzdGVyRmllbGQoVElGRiAqLCB1aW50MzIsIFRJRkZEYXRhVHlwZSk7CitleHRlcm4gIFRJRkZGaWVsZCogX1RJRkZDcmVhdGVBbm9uRmllbGQoVElGRiAqLCB1aW50MzIsIFRJRkZEYXRhVHlwZSk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYgLyogX1RJRkZESVJfICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9kaXJpbmZvLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9kaXJpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOGQyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2RpcmluZm8uYwpAQCAtMCwwICsxLDk3OCBAQAorLyogJElkOiB0aWZfZGlyaW5mby5jLHYgMS4xMTcgMjAxMi0wOC0xOSAxNjo1NjozNCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBDb3JlIERpcmVjdG9yeSBUYWcgU3VwcG9ydC4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKgorICogTk9URTogVEhJUyBBUlJBWSBJUyBBU1NVTUVEIFRPIEJFIFNPUlRFRCBCWSBUQUcuCisgKgorICogTk9URTogVGhlIHNlY29uZCBmaWVsZCAoZmllbGRfcmVhZGNvdW50KSBhbmQgdGhpcmQgZmllbGQgKGZpZWxkX3dyaXRlY291bnQpCisgKiAgICAgICBzb21ldGltZXMgdXNlIHRoZSB2YWx1ZXMgVElGRl9WQVJJQUJMRSAoLTEpLCBUSUZGX1ZBUklBQkxFMiAoLTMpCisgKiAgICAgICBhbmQgVElGRl9TUFAgKC0yKS4gVGhlIG1hY3JvcyBzaG91bGQgYmUgdXNlZCBidXQgd291bGQgdGhyb3cgb2ZmCisgKiAgICAgICB0aGUgZm9ybWF0dGluZyBvZiB0aGUgY29kZSwgc28gcGxlYXNlIGludGVycHJldGUgdGhlIC0xLCAtMiBhbmQgLTMKKyAqICAgICAgIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAqLworCitzdGF0aWMgVElGRkZpZWxkQXJyYXkgdGlmZkZpZWxkQXJyYXk7CitzdGF0aWMgVElGRkZpZWxkQXJyYXkgZXhpZkZpZWxkQXJyYXk7CisKK3N0YXRpYyBUSUZGRmllbGQKK3RpZmZGaWVsZHNbXSA9IHsKKwl7IFRJRkZUQUdfU1VCRklMRVRZUEUsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NVQkZJTEVUWVBFLCAxLCAwLCAiU3ViZmlsZVR5cGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX09TVUJGSUxFVFlQRSwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NVQkZJTEVUWVBFLCAxLCAwLCAiT2xkU3ViZmlsZVR5cGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0lNQUdFV0lEVEgsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lNQUdFRElNRU5TSU9OUywgMCwgMCwgIkltYWdlV2lkdGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0lNQUdFTEVOR1RILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JTUFHRURJTUVOU0lPTlMsIDEsIDAsICJJbWFnZUxlbmd0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQklUU1BFUlNBTVBMRSwgMCwgMCwgIkJpdHNQZXJTYW1wbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NPTVBSRVNTSU9OLCAtMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NPTVBSRVNTSU9OLCAwLCAwLCAiQ29tcHJlc3Npb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BIT1RPTUVUUklDLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUEhPVE9NRVRSSUMsIDAsIDAsICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19USFJFU0hIT0xESU5HLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfVEhSRVNISE9MRElORywgMSwgMCwgIlRocmVzaGhvbGRpbmciLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NFTExXSURUSCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkNlbGxXaWR0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0VMTExFTkdUSCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkNlbGxMZW5ndGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ZJTExPUkRFUiwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0ZJTExPUkRFUiwgMCwgMCwgIkZpbGxPcmRlciIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRE9DVU1FTlROQU1FLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkRvY3VtZW50TmFtZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfSU1BR0VERVNDUklQVElPTiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJJbWFnZURlc2NyaXB0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19NQUtFLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIk1ha2UiLCBOVUxMIH0sCisJeyBUSUZGVEFHX01PREVMLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIk1vZGVsIiwgTlVMTCB9LAorCXsgVElGRlRBR19TVFJJUE9GRlNFVFMsIC0xLCAtMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NUUklQT0ZGU0VUUywgMCwgMCwgIlN0cmlwT2Zmc2V0cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfT1JJRU5UQVRJT04sIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9PUklFTlRBVElPTiwgMCwgMCwgIk9yaWVudGF0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TQU1QTEVTUEVSUElYRUwsIDAsIDAsICJTYW1wbGVzUGVyUGl4ZWwiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUk9XU1BFUlNUUklQLCAwLCAwLCAiUm93c1BlclN0cmlwIiwgTlVMTCB9LAorCXsgVElGRlRBR19TVFJJUEJZVEVDT1VOVFMsIC0xLCAtMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NUUklQQllURUNPVU5UUywgMCwgMCwgIlN0cmlwQnl0ZUNvdW50cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfTUlOU0FNUExFVkFMVUUsIC0yLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX01JTlNBTVBMRVZBTFVFLCAxLCAwLCAiTWluU2FtcGxlVmFsdWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX01BWFNBTVBMRVZBTFVFLCAtMiwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9NQVhTQU1QTEVWQUxVRSwgMSwgMCwgIk1heFNhbXBsZVZhbHVlIiwgTlVMTCB9LAorCXsgVElGRlRBR19YUkVTT0xVVElPTiwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1JFU09MVVRJT04sIDEsIDAsICJYUmVzb2x1dGlvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfWVJFU09MVVRJT04sIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9SRVNPTFVUSU9OLCAxLCAwLCAiWVJlc29sdXRpb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BMQU5BUkNPTkZJRywgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BMQU5BUkNPTkZJRywgMCwgMCwgIlBsYW5hckNvbmZpZ3VyYXRpb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BBR0VOQU1FLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlBhZ2VOYW1lIiwgTlVMTCB9LAorCXsgVElGRlRBR19YUE9TSVRJT04sIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QT1NJVElPTiwgMSwgMCwgIlhQb3NpdGlvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfWVBPU0lUSU9OLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUE9TSVRJT04sIDEsIDAsICJZUG9zaXRpb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ZSRUVPRkZTRVRTLCAtMSwgLTEsIFRJRkZfTE9ORzgsIDAsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JR05PUkUsIDAsIDAsICJGcmVlT2Zmc2V0cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRlJFRUJZVEVDT1VOVFMsIC0xLCAtMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMCwgMCwgIkZyZWVCeXRlQ291bnRzIiwgTlVMTCB9LAorCXsgVElGRlRBR19HUkFZUkVTUE9OU0VVTklULCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfSUdOT1JFLCAxLCAwLCAiR3JheVJlc3BvbnNlVW5pdCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfR1JBWVJFU1BPTlNFQ1VSVkUsIC0xLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkdyYXlSZXNwb25zZUN1cnZlIiwgTlVMTCB9LAorCXsgVElGRlRBR19SRVNPTFVUSU9OVU5JVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1JFU09MVVRJT05VTklULCAxLCAwLCAiUmVzb2x1dGlvblVuaXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BBR0VOVU1CRVIsIDIsIDIsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNl9QQUlSLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BBR0VOVU1CRVIsIDEsIDAsICJQYWdlTnVtYmVyIiwgTlVMTCB9LAorCXsgVElGRlRBR19DT0xPUlJFU1BPTlNFVU5JVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkNvbG9yUmVzcG9uc2VVbml0IiwgTlVMTCB9LAorCXsgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX09USEVSLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1RSQU5TRkVSRlVOQ1RJT04sIDEsIDAsICJUcmFuc2ZlckZ1bmN0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19TT0ZUV0FSRSwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTb2Z0d2FyZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfREFURVRJTUUsIDIwLCAyMCwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRGF0ZVRpbWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0FSVElTVCwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJBcnRpc3QiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0hPU1RDT01QVVRFUiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJIb3N0Q29tcHV0ZXIiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1dISVRFUE9JTlQsIDIsIDIsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MwX0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIldoaXRlUG9pbnQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BSSU1BUllDSFJPTUFUSUNJVElFUywgNiwgNiwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzBfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiUHJpbWFyeUNocm9tYXRpY2l0aWVzIiwgTlVMTCB9LAorCXsgVElGRlRBR19DT0xPUk1BUCwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9PVEhFUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DT0xPUk1BUCwgMSwgMCwgIkNvbG9yTWFwIiwgTlVMTCB9LAorCXsgVElGRlRBR19IQUxGVE9ORUhJTlRTLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTZfUEFJUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9IQUxGVE9ORUhJTlRTLCAxLCAwLCAiSGFsZnRvbmVIaW50cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRVdJRFRILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9USUxFRElNRU5TSU9OUywgMCwgMCwgIlRpbGVXaWR0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRUxFTkdUSCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfVElMRURJTUVOU0lPTlMsIDAsIDAsICJUaWxlTGVuZ3RoIiwgTlVMTCB9LAorCXsgVElGRlRBR19USUxFT0ZGU0VUUywgLTEsIDEsIFRJRkZfTE9ORzgsIDAsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TVFJJUE9GRlNFVFMsIDAsIDAsICJUaWxlT2Zmc2V0cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRUJZVEVDT1VOVFMsIC0xLCAxLCBUSUZGX0xPTkc4LCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU1RSSVBCWVRFQ09VTlRTLCAwLCAwLCAiVGlsZUJ5dGVDb3VudHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NVQklGRCwgLTEsIC0xLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0MxNl9JRkQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NVQklGRCwgMSwgMSwgIlN1YklGRCIsICZ0aWZmRmllbGRBcnJheSB9LAorCXsgVElGRlRBR19JTktTRVQsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJJbmtTZXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0lOS05BTUVTLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0MxNl9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JTktOQU1FUywgMSwgMSwgIklua05hbWVzIiwgTlVMTCB9LAorCXsgVElGRlRBR19OVU1CRVJPRklOS1MsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJOdW1iZXJPZklua3MiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0RPVFJBTkdFLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTZfUEFJUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJEb3RSYW5nZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVEFSR0VUUFJJTlRFUiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJUYXJnZXRQcmludGVyIiwgTlVMTCB9LAorCXsgVElGRlRBR19FWFRSQVNBTVBMRVMsIC0xLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9FWFRSQVNBTVBMRVMsIDAsIDEsICJFeHRyYVNhbXBsZXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU0FNUExFRk9STUFULCAwLCAwLCAiU2FtcGxlRm9ybWF0IiwgTlVMTCB9LAorCXsgVElGRlRBR19TTUlOU0FNUExFVkFMVUUsIC0yLCAtMSwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TTUlOU0FNUExFVkFMVUUsIDEsIDAsICJTTWluU2FtcGxlVmFsdWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRSwgLTIsIC0xLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NNQVhTQU1QTEVWQUxVRSwgMSwgMCwgIlNNYXhTYW1wbGVWYWx1ZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0xJUFBBVEgsIC0xLCAtMywgVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQ2xpcFBhdGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1hDTElQUEFUSFVOSVRTLCAxLCAxLCBUSUZGX1NMT05HLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiWENsaXBQYXRoVW5pdHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1hDTElQUEFUSFVOSVRTLCAxLCAxLCBUSUZGX1NCWVRFLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiWENsaXBQYXRoVW5pdHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1lDTElQUEFUSFVOSVRTLCAxLCAxLCBUSUZGX1NMT05HLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiWUNsaXBQYXRoVW5pdHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1lDQkNSQ09FRkZJQ0lFTlRTLCAzLCAzLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJZQ2JDckNvZWZmaWNpZW50cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywgMiwgMiwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2X1BBSVIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfWUNCQ1JTVUJTQU1QTElORywgMCwgMCwgIllDYkNyU3Vic2FtcGxpbmciLCBOVUxMIH0sCisJeyBUSUZGVEFHX1lDQkNSUE9TSVRJT05JTkcsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9ZQ0JDUlBPU0lUSU9OSU5HLCAwLCAwLCAiWUNiQ3JQb3NpdGlvbmluZyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURSwgNiwgNiwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzBfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUkVGQkxBQ0tXSElURSwgMSwgMCwgIlJlZmVyZW5jZUJsYWNrV2hpdGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1hNTFBBQ0tFVCwgLTMsIC0zLCBUSUZGX0JZVEUsIDAsIFRJRkZfU0VUR0VUX0MzMl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJYTUxQYWNrZXQiLCBOVUxMIH0sCisJLyogYmVnaW4gU0dJIHRhZ3MgKi8KKwl7IFRJRkZUQUdfTUFUVEVJTkcsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9FWFRSQVNBTVBMRVMsIDAsIDAsICJNYXR0ZWluZyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfREFUQVRZUEUsIC0yLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NBTVBMRUZPUk1BVCwgMCwgMCwgIkRhdGFUeXBlIiwgTlVMTCB9LAorCXsgVElGRlRBR19JTUFHRURFUFRILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JTUFHRURFUFRILCAwLCAwLCAiSW1hZ2VEZXB0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRURFUFRILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9USUxFREVQVEgsIDAsIDAsICJUaWxlRGVwdGgiLCBOVUxMIH0sCisJLyogZW5kIFNHSSB0YWdzICovCisJLyogYmVnaW4gUGl4YXIgdGFncyAqLworCXsgVElGRlRBR19QSVhBUl9JTUFHRUZVTExXSURUSCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiSW1hZ2VGdWxsV2lkdGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BJWEFSX0lNQUdFRlVMTExFTkdUSCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiSW1hZ2VGdWxsTGVuZ3RoIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9URVhUVVJFRk9STUFULCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlRleHR1cmVGb3JtYXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BJWEFSX1dSQVBNT0RFUywgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJUZXh0dXJlV3JhcE1vZGVzIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9GT1ZDT1QsIDEsIDEsIFRJRkZfRkxPQVQsIDAsIFRJRkZfU0VUR0VUX0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZpZWxkT2ZWaWV3Q290YW5nZW50IiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9NQVRSSVhfV09STERUT1NDUkVFTiwgMTYsIDE2LCBUSUZGX0ZMT0FULCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJNYXRyaXhXb3JsZFRvU2NyZWVuIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9NQVRSSVhfV09STERUT0NBTUVSQSwgMTYsIDE2LCBUSUZGX0ZMT0FULCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJNYXRyaXhXb3JsZFRvQ2FtZXJhIiwgTlVMTCB9LAorCXsgVElGRlRBR19DT1BZUklHSFQsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiQ29weXJpZ2h0IiwgTlVMTCB9LAorCS8qIGVuZCBQaXhhciB0YWdzICovCisJeyBUSUZGVEFHX1JJQ0hUSUZGSVBUQywgLTMsIC0zLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MzMl9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiUmljaFRJRkZJUFRDIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSE9UT1NIT1AsIC0zLCAtMywgVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiUGhvdG9zaG9wIiwgTlVMTCB9LAorCXsgVElGRlRBR19FWElGSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0lGRDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRVhJRklGRE9mZnNldCIsICZleGlmRmllbGRBcnJheSB9LAorCXsgVElGRlRBR19JQ0NQUk9GSUxFLCAtMywgLTMsIFRJRkZfVU5ERUZJTkVELCAwLCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiSUNDIFByb2ZpbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0dQU0lGRCwgMSwgMSwgVElGRl9JRkQ4LCAwLCBUSUZGX1NFVEdFVF9JRkQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkdQU0lGRE9mZnNldCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRkFYUkVDVlBBUkFNUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VJTlQzMiwgRklFTERfQ1VTVE9NLCBUUlVFLCBGQUxTRSwgIkZheFJlY3ZQYXJhbXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ZBWFNVQkFERFJFU1MsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX0FTQ0lJLCBGSUVMRF9DVVNUT00sIFRSVUUsIEZBTFNFLCAiRmF4U3ViQWRkcmVzcyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRkFYUkVDVlRJTUUsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VSU5UMzIsIEZJRUxEX0NVU1RPTSwgVFJVRSwgRkFMU0UsICJGYXhSZWN2VGltZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRkFYRENTLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9BU0NJSSwgRklFTERfQ1VTVE9NLCBUUlVFLCBGQUxTRSwgIkZheERjcyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfU1RPTklUUywgMSwgMSwgVElGRl9ET1VCTEUsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJTdG9OaXRzIiwgTlVMTCB9LAorCXsgVElGRlRBR19JTlRFUk9QRVJBQklMSVRZSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJJbnRlcm9wZXJhYmlsaXR5SUZET2Zmc2V0IiwgTlVMTCB9LAorCS8qIGJlZ2luIERORyB0YWdzICovCisJeyBUSUZGVEFHX0ROR1ZFUlNJT04sIDQsIDQsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRE5HVmVyc2lvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRE5HQkFDS1dBUkRWRVJTSU9OLCA0LCA0LCBUSUZGX0JZVEUsIDAsIFRJRkZfU0VUR0VUX0MwX1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkROR0JhY2t3YXJkVmVyc2lvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVU5JUVVFQ0FNRVJBTU9ERUwsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiVW5pcXVlQ2FtZXJhTW9kZWwiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0xPQ0FMSVpFRENBTUVSQU1PREVMLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIkxvY2FsaXplZENhbWVyYU1vZGVsIiwgTlVMTCB9LAorCXsgVElGRlRBR19DRkFQTEFORUNPTE9SLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkNGQVBsYW5lQ29sb3IiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NGQUxBWU9VVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkNGQUxheW91dCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfTElORUFSSVpBVElPTlRBQkxFLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiTGluZWFyaXphdGlvblRhYmxlIiwgTlVMTCB9LAorCXsgVElGRlRBR19CTEFDS0xFVkVMUkVQRUFURElNLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9DMF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQmxhY2tMZXZlbFJlcGVhdERpbSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQkxBQ0tMRVZFTCwgLTEsIC0xLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQmxhY2tMZXZlbCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQkxBQ0tMRVZFTERFTFRBSCwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkJsYWNrTGV2ZWxEZWx0YUgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0JMQUNLTEVWRUxERUxUQVYsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJCbGFja0xldmVsRGVsdGFWIiwgTlVMTCB9LAorCXsgVElGRlRBR19XSElURUxFVkVMLCAtMSwgLTEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJXaGl0ZUxldmVsIiwgTlVMTCB9LAorCXsgVElGRlRBR19ERUZBVUxUU0NBTEUsIDIsIDIsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MwX0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkRlZmF1bHRTY2FsZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQkVTVFFVQUxJVFlTQ0FMRSwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJlc3RRdWFsaXR5U2NhbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0RFRkFVTFRDUk9QT1JJR0lOLCAyLCAyLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJEZWZhdWx0Q3JvcE9yaWdpbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfREVGQVVMVENST1BTSVpFLCAyLCAyLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJEZWZhdWx0Q3JvcFNpemUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NPTE9STUFUUklYMSwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkNvbG9yTWF0cml4MSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ09MT1JNQVRSSVgyLCAtMSwgLTEsIFRJRkZfU1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQ29sb3JNYXRyaXgyIiwgTlVMTCB9LAorCXsgVElGRlRBR19DQU1FUkFDQUxJQlJBVElPTjEsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJDYW1lcmFDYWxpYnJhdGlvbjEiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NBTUVSQUNBTElCUkFUSU9OMiwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkNhbWVyYUNhbGlicmF0aW9uMiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUkVEVUNUSU9OTUFUUklYMSwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIlJlZHVjdGlvbk1hdHJpeDEiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1JFRFVDVElPTk1BVFJJWDIsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJSZWR1Y3Rpb25NYXRyaXgyIiwgTlVMTCB9LAorCXsgVElGRlRBR19BTkFMT0dCQUxBTkNFLCAtMSwgLTEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJBbmFsb2dCYWxhbmNlIiwgTlVMTCB9LAorCXsgVElGRlRBR19BU1NIT1RORVVUUkFMLCAtMSwgLTEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJBc1Nob3ROZXV0cmFsIiwgTlVMTCB9LAorCXsgVElGRlRBR19BU1NIT1RXSElURVhZLCAyLCAyLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJBc1Nob3RXaGl0ZVhZIiwgTlVMTCB9LAorCXsgVElGRlRBR19CQVNFTElORUVYUE9TVVJFLCAxLCAxLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJhc2VsaW5lRXhwb3N1cmUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0JBU0VMSU5FTk9JU0UsIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJCYXNlbGluZU5vaXNlIiwgTlVMTCB9LAorCXsgVElGRlRBR19CQVNFTElORVNIQVJQTkVTUywgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJhc2VsaW5lU2hhcnBuZXNzIiwgTlVMTCB9LAorCXsgVElGRlRBR19CQVlFUkdSRUVOU1BMSVQsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJheWVyR3JlZW5TcGxpdCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfTElORUFSUkVTUE9OU0VMSU1JVCwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkxpbmVhclJlc3BvbnNlTGltaXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NBTUVSQVNFUklBTE5VTUJFUiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJDYW1lcmFTZXJpYWxOdW1iZXIiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0xFTlNJTkZPLCA0LCA0LCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJMZW5zSW5mbyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0hST01BQkxVUlJBRElVUywgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkNocm9tYUJsdXJSYWRpdXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0FOVElBTElBU1NUUkVOR1RILCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQW50aUFsaWFzU3RyZW5ndGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NIQURPV1NDQUxFLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiU2hhZG93U2NhbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ROR1BSSVZBVEVEQVRBLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkROR1ByaXZhdGVEYXRhIiwgTlVMTCB9LAorCXsgVElGRlRBR19NQUtFUk5PVEVTQUZFVFksIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJNYWtlck5vdGVTYWZldHkiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDEsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJDYWxpYnJhdGlvbklsbHVtaW5hbnQxIiwgTlVMTCB9LAorCXsgVElGRlRBR19DQUxJQlJBVElPTklMTFVNSU5BTlQyLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQ2FsaWJyYXRpb25JbGx1bWluYW50MiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUkFXREFUQVVOSVFVRUlELCAxNiwgMTYsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiUmF3RGF0YVVuaXF1ZUlEIiwgTlVMTCB9LAorCXsgVElGRlRBR19PUklHSU5BTFJBV0ZJTEVOQU1FLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIk9yaWdpbmFsUmF3RmlsZU5hbWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX09SSUdJTkFMUkFXRklMRURBVEEsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJPcmlnaW5hbFJhd0ZpbGVEYXRhIiwgTlVMTCB9LAorCXsgVElGRlRBR19BQ1RJVkVBUkVBLCA0LCA0LCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MwX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJBY3RpdmVBcmVhIiwgTlVMTCB9LAorCXsgVElGRlRBR19NQVNLRURBUkVBUywgLTEsIC0xLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiTWFza2VkQXJlYXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0FTU0hPVElDQ1BST0ZJTEUsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJBc1Nob3RJQ0NQcm9maWxlIiwgTlVMTCB9LAorCXsgVElGRlRBR19BU1NIT1RQUkVQUk9GSUxFTUFUUklYLCAtMSwgLTEsIFRJRkZfU1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQXNTaG90UHJlUHJvZmlsZU1hdHJpeCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ1VSUkVOVElDQ1BST0ZJTEUsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJDdXJyZW50SUNDUHJvZmlsZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ1VSUkVOVFBSRVBST0ZJTEVNQVRSSVgsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJDdXJyZW50UHJlUHJvZmlsZU1hdHJpeCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUEVSU0FNUExFLCAwLCAwLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBUUlVFLCBGQUxTRSwgIlBlclNhbXBsZSIsIE5VTEx9LAorCS8qIGVuZCBETkcgdGFncyAqLworCS8qIGJlZ2luIFRJRkYvRlggdGFncyAqLworICAgIHsgVElGRlRBR19JTkRFWEVELCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiSW5kZXhlZCIgfSwKKyAgICB7IFRJRkZUQUdfR0xPQkFMUEFSQU1FVEVSU0lGRCwgMSwgMSwgVElGRl9JRkQsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJHbG9iYWxQYXJhbWV0ZXJzSUZEIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19QUk9GSUxFVFlQRSwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiUHJvZmlsZVR5cGUiLCBOVUxMIH0sCisgICAgeyBUSUZGVEFHX0ZBWFBST0ZJTEUsIDEsIDEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRmF4UHJvZmlsZSIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfQ09ESU5HTUVUSE9EUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQ29kaW5nTWV0aG9kcyIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfVkVSU0lPTllFQVIsIDQsIDQsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiVmVyc2lvblllYXIiLCBOVUxMIH0sCisgICAgeyBUSUZGVEFHX01PREVOVU1CRVIsIDEsIDEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiTW9kZU51bWJlciIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfREVDT0RFLCAtMSwgLTEsIFRJRkZfU1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiRGVjb2RlIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19JTUFHRUJBU0VDT0xPUiwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9DMTZfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkltYWdlQmFzZUNvbG9yIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19UODJPUFRJT05TLCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJUODJPcHRpb25zIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19TVFJJUFJPV0NPVU5UUywgLTEsIC0xLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiU3RyaXBSb3dDb3VudHMiLCBOVUxMIH0sCisgICAgeyBUSUZGVEFHX0lNQUdFTEFZRVIsIDIsIDIsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkltYWdlTGF5ZXIiLCBOVUxMIH0sCisJLyogZW5kIERORyB0YWdzICovCisJLyogYmVnaW4gcHNldWRvIHRhZ3MgKi8KK307CisKK3N0YXRpYyBUSUZGRmllbGQKK2V4aWZGaWVsZHNbXSA9IHsKKwl7IEVYSUZUQUdfRVhQT1NVUkVUSU1FLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhwb3N1cmVUaW1lIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GTlVNQkVSLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRk51bWJlciIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRVhQT1NVUkVQUk9HUkFNLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhwb3N1cmVQcm9ncmFtIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TUEVDVFJBTFNFTlNJVElWSVRZLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlNwZWN0cmFsU2Vuc2l0aXZpdHkiLCBOVUxMIH0sCisJeyBFWElGVEFHX0lTT1NQRUVEUkFUSU5HUywgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9DMTZfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIklTT1NwZWVkUmF0aW5ncyIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfT0VDRiwgLTEsIC0xLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIk9wdG9lbGVjdHJpY0NvbnZlcnNpb25GYWN0b3IiLCBOVUxMIH0sCisJeyBFWElGVEFHX0VYSUZWRVJTSU9OLCA0LCA0LCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhpZlZlcnNpb24iLCBOVUxMIH0sCisJeyBFWElGVEFHX0RBVEVUSU1FT1JJR0lOQUwsIDIwLCAyMCwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRGF0ZVRpbWVPcmlnaW5hbCIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfREFURVRJTUVESUdJVElaRUQsIDIwLCAyMCwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRGF0ZVRpbWVEaWdpdGl6ZWQiLCBOVUxMIH0sCisJeyBFWElGVEFHX0NPTVBPTkVOVFNDT05GSUdVUkFUSU9OLCA0LCA0LCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24iLCBOVUxMIH0sCisJeyBFWElGVEFHX0NPTVBSRVNTRURCSVRTUEVSUElYRUwsIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJDb21wcmVzc2VkQml0c1BlclBpeGVsIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TSFVUVEVSU1BFRURWQUxVRSwgMSwgMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTaHV0dGVyU3BlZWRWYWx1ZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfQVBFUlRVUkVWQUxVRSwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkFwZXJ0dXJlVmFsdWUiLCBOVUxMIH0sCisJeyBFWElGVEFHX0JSSUdIVE5FU1NWQUxVRSwgMSwgMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJCcmlnaHRuZXNzVmFsdWUiLCBOVUxMIH0sCisJeyBFWElGVEFHX0VYUE9TVVJFQklBU1ZBTFVFLCAxLCAxLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkV4cG9zdXJlQmlhc1ZhbHVlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19NQVhBUEVSVFVSRVZBTFVFLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiTWF4QXBlcnR1cmVWYWx1ZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU1VCSkVDVERJU1RBTkNFLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU3ViamVjdERpc3RhbmNlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19NRVRFUklOR01PREUsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJNZXRlcmluZ01vZGUiLCBOVUxMIH0sCisJeyBFWElGVEFHX0xJR0hUU09VUkNFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiTGlnaHRTb3VyY2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZMQVNILCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRmxhc2giLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZPQ0FMTEVOR1RILCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRm9jYWxMZW5ndGgiLCBOVUxMIH0sCisJeyBFWElGVEFHX1NVQkpFQ1RBUkVBLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAxLCAiU3ViamVjdEFyZWEiLCBOVUxMIH0sCisJeyBFWElGVEFHX01BS0VSTk9URSwgLTEsIC0xLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIk1ha2VyTm90ZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfVVNFUkNPTU1FTlQsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDEsICJVc2VyQ29tbWVudCIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU1VCU0VDVElNRSwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTdWJTZWNUaW1lIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TVUJTRUNUSU1FT1JJR0lOQUwsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU3ViU2VjVGltZU9yaWdpbmFsIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TVUJTRUNUSU1FRElHSVRJWkVELCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlN1YlNlY1RpbWVEaWdpdGl6ZWQiLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZMQVNIUElYVkVSU0lPTiwgNCwgNCwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MwX1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZsYXNocGl4VmVyc2lvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfQ09MT1JTUEFDRSwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkNvbG9yU3BhY2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX1BJWEVMWERJTUVOU0lPTiwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiUGl4ZWxYRGltZW5zaW9uIiwgTlVMTCB9LAorCXsgRVhJRlRBR19QSVhFTFlESU1FTlNJT04sIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlBpeGVsWURpbWVuc2lvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfUkVMQVRFRFNPVU5ERklMRSwgMTMsIDEzLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJSZWxhdGVkU291bmRGaWxlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GTEFTSEVORVJHWSwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZsYXNoRW5lcmd5IiwgTlVMTCB9LAorCXsgRVhJRlRBR19TUEFUSUFMRlJFUVVFTkNZUkVTUE9OU0UsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDEsICJTcGF0aWFsRnJlcXVlbmN5UmVzcG9uc2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZPQ0FMUExBTkVYUkVTT0xVVElPTiwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZvY2FsUGxhbmVYUmVzb2x1dGlvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRk9DQUxQTEFORVlSRVNPTFVUSU9OLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRm9jYWxQbGFuZVlSZXNvbHV0aW9uIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GT0NBTFBMQU5FUkVTT0xVVElPTlVOSVQsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJGb2NhbFBsYW5lUmVzb2x1dGlvblVuaXQiLCBOVUxMIH0sCisJeyBFWElGVEFHX1NVQkpFQ1RMT0NBVElPTiwgMiwgMiwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlN1YmplY3RMb2NhdGlvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRVhQT1NVUkVJTkRFWCwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkV4cG9zdXJlSW5kZXgiLCBOVUxMIH0sCisJeyBFWElGVEFHX1NFTlNJTkdNRVRIT0QsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTZW5zaW5nTWV0aG9kIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GSUxFU09VUkNFLCAxLCAxLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRmlsZVNvdXJjZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU0NFTkVUWVBFLCAxLCAxLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU2NlbmVUeXBlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19DRkFQQVRURVJOLCAtMSwgLTEsIFRJRkZfVU5ERUZJTkVELCAwLCBUSUZGX1NFVEdFVF9DMTZfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAxLCAiQ0ZBUGF0dGVybiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfQ1VTVE9NUkVOREVSRUQsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJDdXN0b21SZW5kZXJlZCIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRVhQT1NVUkVNT0RFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhwb3N1cmVNb2RlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19XSElURUJBTEFOQ0UsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJXaGl0ZUJhbGFuY2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0RJR0lUQUxaT09NUkFUSU8sIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJEaWdpdGFsWm9vbVJhdGlvIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GT0NBTExFTkdUSElOMzVNTUZJTE0sIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJGb2NhbExlbmd0aEluMzVtbUZpbG0iLCBOVUxMIH0sCisJeyBFWElGVEFHX1NDRU5FQ0FQVFVSRVRZUEUsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTY2VuZUNhcHR1cmVUeXBlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19HQUlOQ09OVFJPTCwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkdhaW5Db250cm9sIiwgTlVMTCB9LAorCXsgRVhJRlRBR19DT05UUkFTVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkNvbnRyYXN0IiwgTlVMTCB9LAorCXsgRVhJRlRBR19TQVRVUkFUSU9OLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU2F0dXJhdGlvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU0hBUlBORVNTLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU2hhcnBuZXNzIiwgTlVMTCB9LAorCXsgRVhJRlRBR19ERVZJQ0VTRVRUSU5HREVTQ1JJUFRJT04sIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDEsICJEZXZpY2VTZXR0aW5nRGVzY3JpcHRpb24iLCBOVUxMIH0sCisJeyBFWElGVEFHX1NVQkpFQ1RESVNUQU5DRVJBTkdFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU3ViamVjdERpc3RhbmNlUmFuZ2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0lNQUdFVU5JUVVFSUQsIDMzLCAzMywgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiSW1hZ2VVbmlxdWVJRCIsIE5VTEwgfQorfTsKKworc3RhdGljIFRJRkZGaWVsZEFycmF5Cit0aWZmRmllbGRBcnJheSA9IHsgdGZpYXRJbWFnZSwgMCwgVElGRkFycmF5Q291bnQodGlmZkZpZWxkcyksIHRpZmZGaWVsZHMgfTsKK3N0YXRpYyBUSUZGRmllbGRBcnJheQorZXhpZkZpZWxkQXJyYXkgPSB7IHRmaWF0RXhpZiwgMCwgVElGRkFycmF5Q291bnQoZXhpZkZpZWxkcyksIGV4aWZGaWVsZHMgfTsKKworLyoKKyAqICBXZSBoYXZlIG91ciBvd24gbG9jYWwgbGZpbmQoKSBlcXVpdmVsZW50IHRvIGF2b2lkIHN1YnRsZSBkaWZmZXJlbmNlcworICogIGluIHR5cGVzIHBhc3NlZCB0byBsZmluZCgpIG9uIGRpZmZlcmVudCBzeXN0ZW1zLiAKKyAqLworCitzdGF0aWMgdm9pZCAqCit0ZF9sZmluZChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCAqbm1lbWIsIHNpemVfdCBzaXplLAorICAgICAgICAgaW50KCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKyAgICBjaGFyICplbGVtZW50LCAqZW5kOworCisgICAgZW5kID0gKGNoYXIgKiliYXNlICsgKm5tZW1iICogc2l6ZTsKKyAgICBmb3IgKGVsZW1lbnQgPSAoY2hhciAqKWJhc2U7IGVsZW1lbnQgPCBlbmQ7IGVsZW1lbnQgKz0gc2l6ZSkKKyAgICAgICAgaWYgKCFjb21wYXIoa2V5LCBlbGVtZW50KSkJCS8qIGtleSBmb3VuZCAqLworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgVElGRkZpZWxkQXJyYXkqCitfVElGRkdldEZpZWxkcyh2b2lkKQoreworCXJldHVybigmdGlmZkZpZWxkQXJyYXkpOworfQorCitjb25zdCBUSUZGRmllbGRBcnJheSoKK19USUZGR2V0RXhpZkZpZWxkcyh2b2lkKQoreworCXJldHVybigmZXhpZkZpZWxkQXJyYXkpOworfQorCit2b2lkCitfVElGRlNldHVwRmllbGRzKFRJRkYqIHRpZiwgY29uc3QgVElGRkZpZWxkQXJyYXkqIGZpZWxkYXJyYXkpCit7CisJaWYgKHRpZi0+dGlmX2ZpZWxkcyAmJiB0aWYtPnRpZl9uZmllbGRzID4gMCkgeworCQl1aW50MzIgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdGlmLT50aWZfbmZpZWxkczsgaSsrKSB7CisJCQlUSUZGRmllbGQgKmZsZCA9IHRpZi0+dGlmX2ZpZWxkc1tpXTsKKwkJCWlmIChmbGQtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00gJiYKKwkJCQlzdHJuY21wKCJUYWcgIiwgZmxkLT5maWVsZF9uYW1lLCA0KSA9PSAwKSB7CisJCQkJCV9USUZGZnJlZShmbGQtPmZpZWxkX25hbWUpOworCQkJCQlfVElGRmZyZWUoZmxkKTsKKwkJCQl9CisJCX0KKworCQlfVElGRmZyZWUodGlmLT50aWZfZmllbGRzKTsKKwkJdGlmLT50aWZfZmllbGRzID0gTlVMTDsKKwkJdGlmLT50aWZfbmZpZWxkcyA9IDA7CisJfQorCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIGZpZWxkYXJyYXktPmZpZWxkcywgZmllbGRhcnJheS0+Y291bnQpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiX1RJRkZTZXR1cEZpZWxkcyIsCisJCQkgICAgICJTZXR0aW5nIHVwIGZpZWxkIGluZm8gZmFpbGVkIik7CisJfQorfQorCitzdGF0aWMgaW50Cit0YWdDb21wYXJlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCit7CisJY29uc3QgVElGRkZpZWxkKiB0YSA9ICooY29uc3QgVElGRkZpZWxkKiopIGE7CisJY29uc3QgVElGRkZpZWxkKiB0YiA9ICooY29uc3QgVElGRkZpZWxkKiopIGI7CisJLyogTkI6IGJlIGNhcmVmdWwgb2YgcmV0dXJuIHZhbHVlcyBmb3IgMTYtYml0IHBsYXRmb3JtcyAqLworCWlmICh0YS0+ZmllbGRfdGFnICE9IHRiLT5maWVsZF90YWcpCisJCXJldHVybiAoaW50KXRhLT5maWVsZF90YWcgLSAoaW50KXRiLT5maWVsZF90YWc7CisJZWxzZQorCQlyZXR1cm4gKHRhLT5maWVsZF90eXBlID09IFRJRkZfQU5ZKSA/CisJCQkwIDogKChpbnQpdGItPmZpZWxkX3R5cGUgLSAoaW50KXRhLT5maWVsZF90eXBlKTsKK30KKworc3RhdGljIGludAordGFnTmFtZUNvbXBhcmUoY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCogYikKK3sKKwljb25zdCBUSUZGRmllbGQqIHRhID0gKihjb25zdCBUSUZGRmllbGQqKikgYTsKKwljb25zdCBUSUZGRmllbGQqIHRiID0gKihjb25zdCBUSUZGRmllbGQqKikgYjsKKwlpbnQgcmV0ID0gc3RyY21wKHRhLT5maWVsZF9uYW1lLCB0Yi0+ZmllbGRfbmFtZSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuICh0YS0+ZmllbGRfdHlwZSA9PSBUSUZGX0FOWSkgPworCQkJMCA6ICgoaW50KXRiLT5maWVsZF90eXBlIC0gKGludCl0YS0+ZmllbGRfdHlwZSk7Cit9CisKK2ludAorX1RJRkZNZXJnZUZpZWxkcyhUSUZGKiB0aWYsIGNvbnN0IFRJRkZGaWVsZCBpbmZvW10sIHVpbnQzMiBuKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIl9USUZGTWVyZ2VGaWVsZHMiOworCXN0YXRpYyBjb25zdCBjaGFyIHJlYXNvbltdID0gImZvciBmaWVsZHMgYXJyYXkiOworCS8qIFRJRkZGaWVsZCoqIHRwOyAqLworCXVpbnQzMiBpOworCisgICAgICAgIHRpZi0+dGlmX2ZvdW5kZmllbGQgPSBOVUxMOworCisJaWYgKHRpZi0+dGlmX2ZpZWxkcyAmJiB0aWYtPnRpZl9uZmllbGRzID4gMCkgeworCQl0aWYtPnRpZl9maWVsZHMgPSAoVElGRkZpZWxkKiopCisJCQlfVElGRkNoZWNrUmVhbGxvYyh0aWYsIHRpZi0+dGlmX2ZpZWxkcywKKwkJCQkJICAodGlmLT50aWZfbmZpZWxkcyArIG4pLAorCQkJCQkgIHNpemVvZihUSUZGRmllbGQgKiksIHJlYXNvbik7CisJfSBlbHNlIHsKKwkJdGlmLT50aWZfZmllbGRzID0gKFRJRkZGaWVsZCAqKikKKwkJCV9USUZGQ2hlY2tNYWxsb2ModGlmLCBuLCBzaXplb2YoVElGRkZpZWxkICopLAorCQkJCQkgcmVhc29uKTsKKwl9CisJaWYgKCF0aWYtPnRpZl9maWVsZHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWVsZHMgYXJyYXkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdHAgPSB0aWYtPnRpZl9maWVsZHMgKyB0aWYtPnRpZl9uZmllbGRzOyAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJY29uc3QgVElGRkZpZWxkICpmaXAgPQorCQkJVElGRkZpbmRGaWVsZCh0aWYsIGluZm9baV0uZmllbGRfdGFnLCBUSUZGX0FOWSk7CisKKyAgICAgICAgICAgICAgICAvKiBvbmx5IGFkZCBkZWZpbml0aW9ucyB0aGF0IGFyZW4ndCBhbHJlYWR5IHByZXNlbnQgKi8KKwkJaWYgKCFmaXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZpZWxkc1t0aWYtPnRpZl9uZmllbGRzXSA9IChUSUZGRmllbGQgKikgKGluZm8raSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uZmllbGRzKys7CisgICAgICAgICAgICAgICAgfQorCX0KKworICAgICAgICAvKiBTb3J0IHRoZSBmaWVsZCBpbmZvIGJ5IHRhZyBudW1iZXIgKi8KKwlxc29ydCh0aWYtPnRpZl9maWVsZHMsIHRpZi0+dGlmX25maWVsZHMsCisJICAgICAgc2l6ZW9mKFRJRkZGaWVsZCAqKSwgdGFnQ29tcGFyZSk7CisKKwlyZXR1cm4gbjsKK30KKwordm9pZAorX1RJRkZQcmludEZpZWxkSW5mbyhUSUZGKiB0aWYsIEZJTEUqIGZkKQoreworCXVpbnQzMiBpOworCisJZnByaW50ZihmZCwgIiVzOiBcbiIsIHRpZi0+dGlmX25hbWUpOworCWZvciAoaSA9IDA7IGkgPCB0aWYtPnRpZl9uZmllbGRzOyBpKyspIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXAgPSB0aWYtPnRpZl9maWVsZHNbaV07CisJCWZwcmludGYoZmQsICJmaWVsZFslMmRdICU1bHUsICUyZCwgJTJkLCAlZCwgJTJkLCAlNXMsICU1cywgJXNcbiIKKwkJCSwgKGludClpCisJCQksICh1bnNpZ25lZCBsb25nKSBmaXAtPmZpZWxkX3RhZworCQkJLCBmaXAtPmZpZWxkX3JlYWRjb3VudCwgZmlwLT5maWVsZF93cml0ZWNvdW50CisJCQksIGZpcC0+ZmllbGRfdHlwZQorCQkJLCBmaXAtPmZpZWxkX2JpdAorCQkJLCBmaXAtPmZpZWxkX29rdG9jaGFuZ2UgPyAiVFJVRSIgOiAiRkFMU0UiCisJCQksIGZpcC0+ZmllbGRfcGFzc2NvdW50ID8gIlRSVUUiIDogIkZBTFNFIgorCQkJLCBmaXAtPmZpZWxkX25hbWUKKwkJKTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gc2l6ZSBvZiBUSUZGRGF0YVR5cGUgaW4gYnl0ZXMKKyAqLworaW50CitUSUZGRGF0YVdpZHRoKFRJRkZEYXRhVHlwZSB0eXBlKQoreworCXN3aXRjaCh0eXBlKQorCXsKKwkJY2FzZSAwOiAgLyogbm90aGluZyAqLworCQljYXNlIFRJRkZfQllURToKKwkJY2FzZSBUSUZGX0FTQ0lJOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfU0xPTkc6CisJCWNhc2UgVElGRl9GTE9BVDoKKwkJY2FzZSBUSUZGX0lGRDoKKwkJCXJldHVybiA0OworCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCWNhc2UgVElGRl9ET1VCTEU6CisJCWNhc2UgVElGRl9MT05HODoKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJY2FzZSBUSUZGX0lGRDg6CisJCQlyZXR1cm4gODsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOyAvKiB3aWxsIHJldHVybiAwIGZvciB1bmtub3duIHR5cGVzICovCisJfQorfQorCisvKgorICogUmV0dXJuIHNpemUgb2YgVElGRkRhdGFUeXBlIGluIGJ5dGVzLgorICoKKyAqIFhYWDogV2UgbmVlZCBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc3BhY2UgbmVlZGVkCisgKiB0byBzdG9yZSB0aGUgdmFsdWUuIEZvciBUSUZGX1JBVElPTkFMIHZhbHVlcyBUSUZGRGF0YVdpZHRoKCkgcmV0dXJucyA4LAorICogYnV0IHdlIHVzZSA0LWJ5dGUgZmxvYXQgdG8gcmVwcmVzZW50IHJhdGlvbmFscy4KKyAqLworaW50CitfVElGRkRhdGFTaXplKFRJRkZEYXRhVHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9BU0NJSToKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJICAgIHJldHVybiAxOworCQljYXNlIFRJRkZfU0hPUlQ6CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCSAgICByZXR1cm4gMjsKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0ZMT0FUOgorCQljYXNlIFRJRkZfSUZEOgorCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCSAgICByZXR1cm4gNDsKKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQljYXNlIFRJRkZfSUZEODoKKwkJICAgIHJldHVybiA4OworCQlkZWZhdWx0OgorCQkgICAgcmV0dXJuIDA7CisJfQorfQorCisvKiBTeW5jIGZyb20gMy44LjIncyBtb2RpZmllZCovCisjaWZkZWYgX1dJTjMyX1dDRQordm9pZCogd2NlZXhfYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJCQkJCQlpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CisjZGVmaW5lIGJzZWFyY2ggd2NlZXhfYnNlYXJjaAorI2VuZGlmCisKK2NvbnN0IFRJRkZGaWVsZCoKK1RJRkZGaW5kRmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCBUSUZGRGF0YVR5cGUgZHQpCit7CisJVElGRkZpZWxkIGtleSA9IHswLCAwLCAwLCBUSUZGX05PVFlQRSwgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTH07CisJVElGRkZpZWxkKiBwa2V5ID0gJmtleTsKKwljb25zdCBUSUZGRmllbGQgKipyZXQ7CisJaWYgKHRpZi0+dGlmX2ZvdW5kZmllbGQgJiYgdGlmLT50aWZfZm91bmRmaWVsZC0+ZmllbGRfdGFnID09IHRhZyAmJgorCSAgICAoZHQgPT0gVElGRl9BTlkgfHwgZHQgPT0gdGlmLT50aWZfZm91bmRmaWVsZC0+ZmllbGRfdHlwZSkpCisJCXJldHVybiB0aWYtPnRpZl9mb3VuZGZpZWxkOworCisJLyogSWYgd2UgYXJlIGludm9rZWQgd2l0aCBubyBmaWVsZCBpbmZvcm1hdGlvbiwgdGhlbiBqdXN0IHJldHVybi4gKi8KKwlpZiAoIXRpZi0+dGlmX2ZpZWxkcykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBOQjogdXNlIHNvcnRlZCBzZWFyY2ggKGUuZy4gYmluYXJ5IHNlYXJjaCkgKi8KKworCWtleS5maWVsZF90YWcgPSB0YWc7CisJa2V5LmZpZWxkX3R5cGUgPSBkdDsKKworCXJldCA9IChjb25zdCBUSUZGRmllbGQgKiopIGJzZWFyY2goJnBrZXksIHRpZi0+dGlmX2ZpZWxkcywKKwkJCQkJICAgdGlmLT50aWZfbmZpZWxkcywKKwkJCQkJICAgc2l6ZW9mKFRJRkZGaWVsZCAqKSwgdGFnQ29tcGFyZSk7CisJcmV0dXJuIHRpZi0+dGlmX2ZvdW5kZmllbGQgPSAocmV0ID8gKnJldCA6IE5VTEwpOworfQorCitjb25zdCBUSUZGRmllbGQqCitfVElGRkZpbmRGaWVsZEJ5TmFtZShUSUZGKiB0aWYsIGNvbnN0IGNoYXIgKmZpZWxkX25hbWUsIFRJRkZEYXRhVHlwZSBkdCkKK3sKKwlUSUZGRmllbGQga2V5ID0gezAsIDAsIDAsIFRJRkZfTk9UWVBFLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMfTsKKwlUSUZGRmllbGQqIHBrZXkgPSAma2V5OworCWNvbnN0IFRJRkZGaWVsZCAqKnJldDsKKwlpZiAodGlmLT50aWZfZm91bmRmaWVsZAorCSAgICAmJiBzdHJlcSh0aWYtPnRpZl9mb3VuZGZpZWxkLT5maWVsZF9uYW1lLCBmaWVsZF9uYW1lKQorCSAgICAmJiAoZHQgPT0gVElGRl9BTlkgfHwgZHQgPT0gdGlmLT50aWZfZm91bmRmaWVsZC0+ZmllbGRfdHlwZSkpCisJCXJldHVybiAodGlmLT50aWZfZm91bmRmaWVsZCk7CisKKwkvKiBJZiB3ZSBhcmUgaW52b2tlZCB3aXRoIG5vIGZpZWxkIGluZm9ybWF0aW9uLCB0aGVuIGp1c3QgcmV0dXJuLiAqLworCWlmICghdGlmLT50aWZfZmllbGRzKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE5COiB1c2UgbGluZWFyIHNlYXJjaCBzaW5jZSBsaXN0IGlzIHNvcnRlZCBieSBrZXkjLCBub3QgbmFtZSAqLworCisJa2V5LmZpZWxkX25hbWUgPSAoY2hhciAqKWZpZWxkX25hbWU7CisJa2V5LmZpZWxkX3R5cGUgPSBkdDsKKworI2lmIDEKKwlyZXQgPSAoY29uc3QgVElGRkZpZWxkICoqKSAKKyAgICAgICAgICAgIHRkX2xmaW5kKCZwa2V5LCB0aWYtPnRpZl9maWVsZHMsICZ0aWYtPnRpZl9uZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRJRkZGaWVsZCAqKSwgdGFnTmFtZUNvbXBhcmUpOworI2Vsc2UKKwkvLyBmcm9tIG9sZCBzdm4gdmVyc2lvbgorCS8qcmV0ID0gKGNvbnN0IFRJRkZGaWVsZEluZm8gKiopIGxmaW5kKCZwa2V5LAorCQkJCQkJCQkJCQl0aWYtPnRpZl9maWVsZGluZm8sIAorCQkJCQkJCQkJCQkmdGlmLT50aWZfbmZpZWxkcywKKwkJCQkJCQkJCQkJc2l6ZW9mKFRJRkZGaWVsZEluZm8gKiksCisJCQkJCQkJCQkJCXRhZ05hbWVDb21wYXJlKTsKKwkqLworCS8qbW9kaWZ5IGJ5IFN1bmxpYW5nLkxpdSAyMDA5MDgyNyBmb3Igc29tZSBwbGF0Zm9ybSBub3Qgc3VwcG9ydCBsZmluZCovCisJcmV0ID0gTlVMTDsKKyNlbmRpZgorCXJldHVybiB0aWYtPnRpZl9mb3VuZGZpZWxkID0gKHJldCA/ICpyZXQgOiBOVUxMKTsKK30KKworY29uc3QgVElGRkZpZWxkKgorVElGRkZpZWxkV2l0aFRhZyhUSUZGKiB0aWYsIHVpbnQzMiB0YWcpCit7CisJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBUSUZGRmluZEZpZWxkKHRpZiwgdGFnLCBUSUZGX0FOWSk7CisJaWYgKCFmaXApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGRmllbGRXaXRoVGFnIiwKKwkJCSAgICAgIkludGVybmFsIGVycm9yLCB1bmtub3duIHRhZyAweCV4IiwKKwkJCSAgICAgKHVuc2lnbmVkIGludCkgdGFnKTsKKwl9CisJcmV0dXJuIChmaXApOworfQorCitjb25zdCBUSUZGRmllbGQqCitUSUZGRmllbGRXaXRoTmFtZShUSUZGKiB0aWYsIGNvbnN0IGNoYXIgKmZpZWxkX25hbWUpCit7CisJY29uc3QgVElGRkZpZWxkKiBmaXAgPQorCQlfVElGRkZpbmRGaWVsZEJ5TmFtZSh0aWYsIGZpZWxkX25hbWUsIFRJRkZfQU5ZKTsKKwlpZiAoIWZpcCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZGaWVsZFdpdGhOYW1lIiwKKwkJCSAgICAgIkludGVybmFsIGVycm9yLCB1bmtub3duIHRhZyAlcyIsIGZpZWxkX25hbWUpOworCX0KKwlyZXR1cm4gKGZpcCk7Cit9CisKK3VpbnQzMgorVElGRkZpZWxkVGFnKGNvbnN0IFRJRkZGaWVsZCogZmlwKQoreworCXJldHVybiBmaXAtPmZpZWxkX3RhZzsKK30KKworY29uc3QgY2hhciAqCitUSUZGRmllbGROYW1lKGNvbnN0IFRJRkZGaWVsZCogZmlwKQoreworCXJldHVybiBmaXAtPmZpZWxkX25hbWU7Cit9CisKK1RJRkZEYXRhVHlwZQorVElGRkZpZWxkRGF0YVR5cGUoY29uc3QgVElGRkZpZWxkKiBmaXApCit7CisJcmV0dXJuIGZpcC0+ZmllbGRfdHlwZTsKK30KKworaW50CitUSUZGRmllbGRQYXNzQ291bnQoY29uc3QgVElGRkZpZWxkKiBmaXApCit7CisJcmV0dXJuIGZpcC0+ZmllbGRfcGFzc2NvdW50OworfQorCitpbnQKK1RJRkZGaWVsZFJlYWRDb3VudChjb25zdCBUSUZGRmllbGQqIGZpcCkKK3sKKwlyZXR1cm4gZmlwLT5maWVsZF9yZWFkY291bnQ7Cit9CisKK2ludAorVElGRkZpZWxkV3JpdGVDb3VudChjb25zdCBUSUZGRmllbGQqIGZpcCkKK3sKKwlyZXR1cm4gZmlwLT5maWVsZF93cml0ZWNvdW50OworfQorCitjb25zdCBUSUZGRmllbGQqCitfVElGRkZpbmRPclJlZ2lzdGVyRmllbGQoVElGRiAqdGlmLCB1aW50MzIgdGFnLCBUSUZGRGF0YVR5cGUgZHQpCisKK3sKKwljb25zdCBUSUZGRmllbGQgKmZsZDsKKworCWZsZCA9IFRJRkZGaW5kRmllbGQodGlmLCB0YWcsIGR0KTsKKwlpZiAoZmxkID09IE5VTEwpIHsKKwkJZmxkID0gX1RJRkZDcmVhdGVBbm9uRmllbGQodGlmLCB0YWcsIGR0KTsKKwkJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgZmxkLCAxKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBmbGQ7Cit9CisKK1RJRkZGaWVsZCoKK19USUZGQ3JlYXRlQW5vbkZpZWxkKFRJRkYgKnRpZiwgdWludDMyIHRhZywgVElGRkRhdGFUeXBlIGZpZWxkX3R5cGUpCit7CisJVElGRkZpZWxkICpmbGQ7CisJKHZvaWQpIHRpZjsKKworCWZsZCA9IChUSUZGRmllbGQgKikgX1RJRkZtYWxsb2Moc2l6ZW9mIChUSUZGRmllbGQpKTsKKwlpZiAoZmxkID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworCV9USUZGbWVtc2V0KGZsZCwgMCwgc2l6ZW9mKFRJRkZGaWVsZCkpOworCisJZmxkLT5maWVsZF90YWcgPSB0YWc7CisJZmxkLT5maWVsZF9yZWFkY291bnQgPSBUSUZGX1ZBUklBQkxFMjsKKwlmbGQtPmZpZWxkX3dyaXRlY291bnQgPSBUSUZGX1ZBUklBQkxFMjsKKwlmbGQtPmZpZWxkX3R5cGUgPSBmaWVsZF90eXBlOworCWZsZC0+cmVzZXJ2ZWQgPSAwOworCXN3aXRjaCAoZmllbGRfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfVU5ERUZJTkVEOgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UODsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfVUlOVDg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0FTQ0lJOgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9BU0NJSTsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfQVNDSUk7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UMTY7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1VJTlQxNjsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfVUlOVDMyOworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UMzI7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQljYXNlIFRJRkZfRkxPQVQ6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX0ZMT0FUOworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9GTE9BVDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1NJTlQ4OworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9TSU5UODsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9TSU5UMTY7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1NJTlQxNjsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1NJTlQzMjsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfU0lOVDMyOworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9ET1VCTEU6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX0RPVUJMRTsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfRE9VQkxFOworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9JRkQ6CisJCWNhc2UgVElGRl9JRkQ4OgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9JRkQ4OworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9JRkQ4OworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfVUlOVDY0OworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UNjQ7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfU0lOVDY0OworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9TSU5UNjQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9VTkRFRklORUQ7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfVU5ERUZJTkVEOworCQkJYnJlYWs7CisJfQorCWZsZC0+ZmllbGRfYml0ID0gRklFTERfQ1VTVE9NOworCWZsZC0+ZmllbGRfb2t0b2NoYW5nZSA9IFRSVUU7CisJZmxkLT5maWVsZF9wYXNzY291bnQgPSBUUlVFOworCWZsZC0+ZmllbGRfbmFtZSA9IChjaGFyICopIF9USUZGbWFsbG9jKDMyKTsKKwlpZiAoZmxkLT5maWVsZF9uYW1lID09IE5VTEwpIHsKKwkgICAgX1RJRkZmcmVlKGZsZCk7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlmbGQtPmZpZWxkX3N1YmZpZWxkcyA9IE5VTEw7CisKKwkvKiAKKwkgKiBub3RlIHRoYXQgdGhpcyBuYW1lIGlzIGEgc3BlY2lhbCBzaWduIHRvIFRJRkZDbG9zZSgpIGFuZAorCSAqIF9USUZGU2V0dXBGaWVsZHMoKSB0byBmcmVlIHRoZSBmaWVsZAorCSAqLworCXNwcmludGYoZmxkLT5maWVsZF9uYW1lLCAiVGFnICVkIiwgKGludCkgdGFnKTsKKworCXJldHVybiBmbGQ7ICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBPIEIgUyBPIEwgRSBUIEUgRCAgICBJIE4gVCBFIFIgRiBBIEMgRSBTCisgKgorICogRG9uJ3QgdXNlIHRoaXMgc3R1ZmYgaW4geW91ciBhcHBsaWNhdGlvbnMsIGl0IG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUKKyAqIGxpYnRpZmYgdmVyc2lvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFRJRkZTZXRHZXRGaWVsZFR5cGUKK19USUZGU2V0R2V0VHlwZShUSUZGRGF0YVR5cGUgdHlwZSwgc2hvcnQgY291bnQsIHVuc2lnbmVkIGNoYXIgcGFzc2NvdW50KQoreworCWlmICh0eXBlID09IFRJRkZfQVNDSUkgJiYgY291bnQgPT0gVElGRl9WQVJJQUJMRSAmJiBwYXNzY291bnQgPT0gMCkKKwkJcmV0dXJuIFRJRkZfU0VUR0VUX0FTQ0lJOworCisJZWxzZSBpZiAoY291bnQgPT0gMSAmJiBwYXNzY291bnQgPT0gMCkgeworCQlzd2l0Y2ggKHR5cGUpCisJCXsKKwkJCWNhc2UgVElGRl9CWVRFOgorCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfVUlOVDg7CisJCQljYXNlIFRJRkZfQVNDSUk6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0FTQ0lJOworCQkJY2FzZSBUSUZGX1NIT1JUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9VSU5UMTY7CisJCQljYXNlIFRJRkZfTE9ORzoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfVUlOVDMyOworCQkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJCWNhc2UgVElGRl9GTE9BVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfRkxPQVQ7CisJCQljYXNlIFRJRkZfU0JZVEU6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1NJTlQ4OworCQkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfU0lOVDE2OworCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9TSU5UMzI7CisJCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9ET1VCTEU7CisJCQljYXNlIFRJRkZfSUZEOgorCQkJY2FzZSBUSUZGX0lGRDg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0lGRDg7CisJCQljYXNlIFRJRkZfTE9ORzg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1VJTlQ2NDsKKwkJCWNhc2UgVElGRl9TTE9ORzg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1NJTlQ2NDsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1VOREVGSU5FRDsKKwkJfQorCX0KKworCWVsc2UgaWYgKGNvdW50ID49IDEgJiYgcGFzc2NvdW50ID09IDApIHsKKwkJc3dpdGNoICh0eXBlKQorCQl7CisJCQljYXNlIFRJRkZfQllURToKKwkJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX1VJTlQ4OworCQkJY2FzZSBUSUZGX0FTQ0lJOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9BU0NJSTsKKwkJCWNhc2UgVElGRl9TSE9SVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfVUlOVDE2OworCQkJY2FzZSBUSUZGX0xPTkc6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX1VJTlQzMjsKKwkJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQljYXNlIFRJRkZfRkxPQVQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX0ZMT0FUOworCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9TSU5UODsKKwkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX1NJTlQxNjsKKwkJCWNhc2UgVElGRl9TTE9ORzoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfU0lOVDMyOworCQkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfRE9VQkxFOworCQkJY2FzZSBUSUZGX0lGRDoKKwkJCWNhc2UgVElGRl9JRkQ4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9JRkQ4OworCQkJY2FzZSBUSUZGX0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9VSU5UNjQ7CisJCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9TSU5UNjQ7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9VTkRFRklORUQ7CisJCX0KKwl9CisKKwllbHNlIGlmIChjb3VudCA9PSBUSUZGX1ZBUklBQkxFICYmIHBhc3Njb3VudCA9PSAxKSB7CisJCXN3aXRjaCAodHlwZSkKKwkJeworCQkJY2FzZSBUSUZGX0JZVEU6CisJCQljYXNlIFRJRkZfVU5ERUZJTkVEOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfVUlOVDg7CisJCQljYXNlIFRJRkZfQVNDSUk6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MxNl9BU0NJSTsKKwkJCWNhc2UgVElGRl9TSE9SVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1VJTlQxNjsKKwkJCWNhc2UgVElGRl9MT05HOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfVUlOVDMyOworCQkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJCWNhc2UgVElGRl9GTE9BVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X0ZMT0FUOworCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfU0lOVDg7CisJCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfU0lOVDE2OworCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfU0lOVDMyOworCQkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X0RPVUJMRTsKKwkJCWNhc2UgVElGRl9JRkQ6CisJCQljYXNlIFRJRkZfSUZEODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X0lGRDg7CisJCQljYXNlIFRJRkZfTE9ORzg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MxNl9VSU5UNjQ7CisJCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfU0lOVDY0OworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfVU5ERUZJTkVEOworCQl9CisJfQorCisJZWxzZSBpZiAoY291bnQgPT0gVElGRl9WQVJJQUJMRTIgJiYgcGFzc2NvdW50ID09IDEpIHsKKwkJc3dpdGNoICh0eXBlKQorCQl7CisJCQljYXNlIFRJRkZfQllURToKKwkJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9VSU5UODsKKwkJCWNhc2UgVElGRl9BU0NJSToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzMyX0FTQ0lJOworCQkJY2FzZSBUSUZGX1NIT1JUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfVUlOVDE2OworCQkJY2FzZSBUSUZGX0xPTkc6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9VSU5UMzI7CisJCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfRkxPQVQ7CisJCQljYXNlIFRJRkZfU0JZVEU6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9TSU5UODsKKwkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9TSU5UMTY7CisJCQljYXNlIFRJRkZfU0xPTkc6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9TSU5UMzI7CisJCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfRE9VQkxFOworCQkJY2FzZSBUSUZGX0lGRDoKKwkJCWNhc2UgVElGRl9JRkQ4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfSUZEODsKKwkJCWNhc2UgVElGRl9MT05HODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzMyX1VJTlQ2NDsKKwkJCWNhc2UgVElGRl9TTE9ORzg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9TSU5UNjQ7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9VTkRFRklORUQ7CisJCX0KKwl9CisKKwlyZXR1cm4gVElGRl9TRVRHRVRfVU5ERUZJTkVEOworfQorCitpbnQKK1RJRkZNZXJnZUZpZWxkSW5mbyhUSUZGKiB0aWYsIGNvbnN0IFRJRkZGaWVsZEluZm8gaW5mb1tdLCB1aW50MzIgbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGTWVyZ2VGaWVsZEluZm8iOworCXN0YXRpYyBjb25zdCBjaGFyIHJlYXNvbltdID0gImZvciBmaWVsZHMgYXJyYXkiOworCVRJRkZGaWVsZCAqdHA7CisJc2l6ZV90IG5maWVsZHM7CisJdWludDMyIGk7CisKKwlpZiAodGlmLT50aWZfbmZpZWxkc2NvbXBhdCA+IDApIHsKKwkJdGlmLT50aWZfZmllbGRzY29tcGF0ID0gKFRJRkZGaWVsZEFycmF5ICopCisJCQlfVElGRkNoZWNrUmVhbGxvYyh0aWYsIHRpZi0+dGlmX2ZpZWxkc2NvbXBhdCwKKwkJCQkJICB0aWYtPnRpZl9uZmllbGRzY29tcGF0ICsgMSwKKwkJCQkJICBzaXplb2YoVElGRkZpZWxkQXJyYXkpLCByZWFzb24pOworCX0gZWxzZSB7CisJCXRpZi0+dGlmX2ZpZWxkc2NvbXBhdCA9IChUSUZGRmllbGRBcnJheSAqKQorCQkJX1RJRkZDaGVja01hbGxvYyh0aWYsIDEsIHNpemVvZihUSUZGRmllbGRBcnJheSksCisJCQkJCSByZWFzb24pOworCX0KKwlpZiAoIXRpZi0+dGlmX2ZpZWxkc2NvbXBhdCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZpZWxkcyBhcnJheSIpOworCQlyZXR1cm4gLTE7CisJfQorCW5maWVsZHMgPSB0aWYtPnRpZl9uZmllbGRzY29tcGF0Kys7CisKKwl0aWYtPnRpZl9maWVsZHNjb21wYXRbbmZpZWxkc10udHlwZSA9IHRmaWF0T3RoZXI7CisJdGlmLT50aWZfZmllbGRzY29tcGF0W25maWVsZHNdLmFsbG9jYXRlZF9zaXplID0gbjsKKwl0aWYtPnRpZl9maWVsZHNjb21wYXRbbmZpZWxkc10uY291bnQgPSBuOworCXRpZi0+dGlmX2ZpZWxkc2NvbXBhdFtuZmllbGRzXS5maWVsZHMgPQorCQkoVElGRkZpZWxkICopX1RJRkZDaGVja01hbGxvYyh0aWYsIG4sIHNpemVvZihUSUZGRmllbGQpLAorCQkJCQkgICAgICByZWFzb24pOworCWlmICghdGlmLT50aWZfZmllbGRzY29tcGF0W25maWVsZHNdLmZpZWxkcykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZpZWxkcyBhcnJheSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdHAgPSB0aWYtPnRpZl9maWVsZHNjb21wYXRbbmZpZWxkc10uZmllbGRzOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJdHAtPmZpZWxkX3RhZyA9IGluZm9baV0uZmllbGRfdGFnOworCQl0cC0+ZmllbGRfcmVhZGNvdW50ID0gaW5mb1tpXS5maWVsZF9yZWFkY291bnQ7CisJCXRwLT5maWVsZF93cml0ZWNvdW50ID0gaW5mb1tpXS5maWVsZF93cml0ZWNvdW50OworCQl0cC0+ZmllbGRfdHlwZSA9IGluZm9baV0uZmllbGRfdHlwZTsKKwkJdHAtPnJlc2VydmVkID0gMDsKKwkJdHAtPnNldF9maWVsZF90eXBlID0KKwkJICAgICBfVElGRlNldEdldFR5cGUoaW5mb1tpXS5maWVsZF90eXBlLAorCQkJCWluZm9baV0uZmllbGRfcmVhZGNvdW50LAorCQkJCWluZm9baV0uZmllbGRfcGFzc2NvdW50KTsKKwkJdHAtPmdldF9maWVsZF90eXBlID0KKwkJICAgICBfVElGRlNldEdldFR5cGUoaW5mb1tpXS5maWVsZF90eXBlLAorCQkJCWluZm9baV0uZmllbGRfcmVhZGNvdW50LAorCQkJCWluZm9baV0uZmllbGRfcGFzc2NvdW50KTsKKwkJdHAtPmZpZWxkX2JpdCA9IGluZm9baV0uZmllbGRfYml0OworCQl0cC0+ZmllbGRfb2t0b2NoYW5nZSA9IGluZm9baV0uZmllbGRfb2t0b2NoYW5nZTsKKwkJdHAtPmZpZWxkX3Bhc3Njb3VudCA9IGluZm9baV0uZmllbGRfcGFzc2NvdW50OworCQl0cC0+ZmllbGRfbmFtZSA9IGluZm9baV0uZmllbGRfbmFtZTsKKwkJdHAtPmZpZWxkX3N1YmZpZWxkcyA9IE5VTEw7CisJCXRwKys7CisJfQorCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgdGlmLT50aWZfZmllbGRzY29tcGF0W25maWVsZHNdLmZpZWxkcywgbikpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIlNldHRpbmcgdXAgZmllbGQgaW5mbyBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2RpcnJlYWQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2RpcnJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDI4ZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZGlycmVhZC5jCkBAIC0wLDAgKzEsNTYxNiBAQAorLyogJElkOiB0aWZfZGlycmVhZC5jLHYgMS4xNzggMjAxMi0wOC0xOSAxNjo1NjozNCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBEaXJlY3RvcnkgUmVhZCBTdXBwb3J0IFJvdXRpbmVzLgorICovCisKKy8qIFN1Z2dlc3RlZCBwZW5kaW5nIGltcHJvdmVtZW50czoKKyAqIC0gYWRkIGEgZmllbGQgJ2lnbm9yZScgdG8gdGhlIFRJRkZEaXJFbnRyeSBzdHJ1Y3R1cmUsIHRvIGZsYWcgc3RhdHVzLAorICogICBlbGltaW5hdGluZyBjdXJyZW50IHVzZSBvZiB0aGUgSUdOT1JFIHZhbHVlLCBhbmQgdGhlcmVmb3JlIGVsaW1pbmF0aW5nCisgKiAgIGN1cnJlbnQgaXJyYXRpb25hbCBiZWhhdmlvdXIgb24gdGFncyB3aXRoIHRhZyBpZCBjb2RlIDAKKyAqIC0gYWRkIGEgZmllbGQgJ2ZpZWxkX2luZm8nIHRvIHRoZSBUSUZGRGlyRW50cnkgc3RydWN0dXJlLCBhbmQgc2V0IHRoYXQgd2l0aAorICogICB0aGUgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgVElGRkZpZWxkIHN0cnVjdHVyZSBlYXJseSBvbiBpbgorICogICBUSUZGUmVhZERpcmVjdG9yeSwgc28gYXMgdG8gZWxpbWluYXRlIGN1cnJlbnQgcG9zc2libHkgcmVwZXRpdGl2ZSBsb29rdXAuCisgKi8KKyAKKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworI2RlZmluZSBJR05PUkUgMCAgICAgICAgICAvKiB0YWcgcGxhY2Vob2xkZXIgdXNlZCBiZWxvdyAqLworI2RlZmluZSBGQUlMRURfRklJICAgICgodWludDMyKSAtMSkKKworI2lmZGVmIEhBVkVfSUVFRUZQCisjIGRlZmluZSBUSUZGQ3Z0SUVFRUZsb2F0VG9OYXRpdmUodGlmLCBuLCBmcCkKKyMgZGVmaW5lIFRJRkZDdnRJRUVFRG91YmxlVG9OYXRpdmUodGlmLCBuLCBkcCkKKyNlbHNlCitleHRlcm4gdm9pZCBUSUZGQ3Z0SUVFRUZsb2F0VG9OYXRpdmUoVElGRiosIHVpbnQzMiwgZmxvYXQqKTsKK2V4dGVybiB2b2lkIFRJRkZDdnRJRUVFRG91YmxlVG9OYXRpdmUoVElGRiosIHVpbnQzMiwgZG91YmxlKik7CisjZW5kaWYKKworZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIHsKKwlUSUZGUmVhZERpckVudHJ5RXJyT2sgPSAwLAorCVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCA9IDEsCisJVElGRlJlYWREaXJFbnRyeUVyclR5cGUgPSAyLAorCVRJRkZSZWFkRGlyRW50cnlFcnJJbyA9IDMsCisJVElGRlJlYWREaXJFbnRyeUVyclJhbmdlID0gNCwKKwlUSUZGUmVhZERpckVudHJ5RXJyUHNkaWYgPSA1LAorCVRJRkZSZWFkRGlyRW50cnlFcnJTaXplc2FuID0gNiwKKwlUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MgPSA3LAorfTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Qnl0ZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ4KiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5TG9uZyhUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQzMiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5TG9uZzgoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50NjQqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUZsb2F0KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZmxvYXQqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeURvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5SWZkOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCogdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQzMiogY291bnQsIHVpbnQzMiBkZXN0dHlwZXNpemUsIHZvaWQqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50OCoqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVNieXRlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQ4KiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5U2hvcnRBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNioqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVNzaG9ydEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MTYqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTbG9uZ0FycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MzIqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlMb25nOEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDY0KiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5U2xvbmc4QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQ2NCoqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUZsb2F0QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBmbG9hdCoqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeURvdWJsZUFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZG91YmxlKiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5SWZkOEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDY0KiogdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlQZXJzYW1wbGVTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpOworI2lmIDAKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVBlcnNhbXBsZURvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ4KiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNieXRlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50OCogdmFsdWUpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTc2hvcnQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQxNiogdmFsdWUpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDMyKiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MzIqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDY0KiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkUmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTcmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKTsKK3N0YXRpYyB2b2lkIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkRmxvYXQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBmbG9hdCogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZERvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNieXRlKGludDggdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTaG9ydCh1aW50MTYgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTc2hvcnQoaW50MTYgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVMb25nKHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlTG9uZzgodWludDY0IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2xvbmc4KGludDY0IHZhbHVlKTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlQnl0ZSh1aW50OCB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTaG9ydCh1aW50MTYgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU3Nob3J0KGludDE2IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZUxvbmcodWludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZVNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZUxvbmc4KHVpbnQ2NCB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTbG9uZzgoaW50NjQgdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTYnl0ZShpbnQ4IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNzaG9ydChpbnQxNiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nKHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZyhpbnQzMiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nOCh1aW50NjQgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U2xvbmc4KGludDY0IHZhbHVlKTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNob3J0KHVpbnQxNiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU3Nob3J0TG9uZyh1aW50MzIgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRMb25nOCh1aW50NjQgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNsb25nOChpbnQ2NCB2YWx1ZSk7CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2J5dGUoaW50OCB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1NzaG9ydChpbnQxNiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1Nsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nTG9uZzgodWludDY0IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2xvbmc4KGludDY0IHZhbHVlKTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nTG9uZyh1aW50MzIgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nTG9uZzgodWludDY0IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ1Nsb25nOChpbnQ2NCB2YWx1ZSk7CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNieXRlKGludDggdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U3Nob3J0KGludDE2IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNsb25nOChpbnQ2NCB2YWx1ZSk7CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZzhMb25nOCh1aW50NjQgdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlEYXRhKFRJRkYqIHRpZiwgdWludDY0IG9mZnNldCwgdG1zaXplX3Qgc2l6ZSwgdm9pZCogZGVzdCk7CitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKFRJRkYqIHRpZiwgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVyciwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiB0YWduYW1lLCBpbnQgcmVjb3Zlcik7CisKK3N0YXRpYyB2b2lkIFRJRkZSZWFkRGlyZWN0b3J5Q2hlY2tPcmRlcihUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgZGlyY291bnQpOworc3RhdGljIFRJRkZEaXJFbnRyeSogVElGRlJlYWREaXJlY3RvcnlGaW5kRW50cnkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IGRpcmNvdW50LCB1aW50MTYgdGFnaWQpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJlY3RvcnlGaW5kRmllbGRJbmZvKFRJRkYqIHRpZiwgdWludDE2IHRhZ2lkLCB1aW50MzIqIGZpaSk7CisKK3N0YXRpYyBpbnQgRXN0aW1hdGVTdHJpcEJ5dGVDb3VudHMoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IGRpcmNvdW50KTsKK3N0YXRpYyB2b2lkIE1pc3NpbmdSZXF1aXJlZChUSUZGKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBUSUZGQ2hlY2tEaXJPZmZzZXQoVElGRiogdGlmLCB1aW50NjQgZGlyb2ZmKTsKK3N0YXRpYyBpbnQgQ2hlY2tEaXJDb3VudChUSUZGKiwgVElGRkRpckVudHJ5KiwgdWludDMyKTsKK3N0YXRpYyB1aW50MTYgVElGRkZldGNoRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0IGRpcm9mZiwgVElGRkRpckVudHJ5KiogcGRpciwgdWludDY0KiBuZXh0ZGlyb2ZmKTsKK3N0YXRpYyBpbnQgVElGRkZldGNoTm9ybWFsVGFnKFRJRkYqLCBUSUZGRGlyRW50cnkqLCBpbnQgcmVjb3Zlcik7CitzdGF0aWMgaW50IFRJRkZGZXRjaFN0cmlwVGhpbmcoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDMyIG5zdHJpcHMsIHVpbnQ2NCoqIGxwcCk7CitzdGF0aWMgaW50IFRJRkZGZXRjaFN1YmplY3REaXN0YW5jZShUSUZGKiwgVElGRkRpckVudHJ5Kik7CitzdGF0aWMgdm9pZCBDaG9wVXBTaW5nbGVVbmNvbXByZXNzZWRTdHJpcChUSUZGKik7CitzdGF0aWMgdWludDY0IFRJRkZSZWFkVUludDY0KGNvbnN0IHVpbnQ4ICp2YWx1ZSk7CisKK3R5cGVkZWYgdW5pb24gX1VJbnQ2NEFsaWduZWRfdAoreworICAgICAgICBkb3VibGUgZDsKKwl1aW50NjQgbDsKKwl1aW50MzIgaVsyXTsKKwl1aW50MTYgc1s0XTsKKwl1aW50OCAgY1s4XTsKK30gVUludDY0QWxpZ25lZF90OworCisvKgorICBVbmFsaWduZWQgc2FmZSBjb3B5IG9mIGEgdWludDY0IHZhbHVlIGZyb20gYW4gb2N0ZXQgYXJyYXkuCisqLworc3RhdGljIHVpbnQ2NCBUSUZGUmVhZFVJbnQ2NChjb25zdCB1aW50OCAqdmFsdWUpCit7CisJVUludDY0QWxpZ25lZF90IHJlc3VsdDsKKworCXJlc3VsdC5jWzBdPXZhbHVlWzBdOworCXJlc3VsdC5jWzFdPXZhbHVlWzFdOworCXJlc3VsdC5jWzJdPXZhbHVlWzJdOworCXJlc3VsdC5jWzNdPXZhbHVlWzNdOworCXJlc3VsdC5jWzRdPXZhbHVlWzRdOworCXJlc3VsdC5jWzVdPXZhbHVlWzVdOworCXJlc3VsdC5jWzZdPXZhbHVlWzZdOworCXJlc3VsdC5jWzddPXZhbHVlWzddOworCisJcmV0dXJuIHJlc3VsdC5sOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlCeXRlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDgqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTYnl0ZShtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDgpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2hvcnQodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2hvcnQobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ4KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNzaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTc2hvcnQobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ4KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HOgorCQkJeworCQkJCXVpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVMb25nKG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50OCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNsb25nKG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50OCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZzgodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVMb25nOChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDgpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNsb25nOChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDgpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwlpZiAoZGlyZW50cnktPnRkaXJfY291bnQhPTEpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQ291bnQpOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRCeXRlKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPSh1aW50MTYpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NCWVRFOgorCQkJeworCQkJCWludDggbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNieXRlKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTYnl0ZShtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDE2KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2hvcnQodGlmLGRpcmVudHJ5LHZhbHVlKTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTc2hvcnQodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNzaG9ydChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDE2KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HOgorCQkJeworCQkJCXVpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0TG9uZyhtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDE2KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJCXsKKwkJCQlpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2xvbmcodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNsb25nKG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50MTYpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJeworCQkJCXVpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZExvbmc4KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydExvbmc4KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50MTYpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZzgobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQxNiltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlKTsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUxvbmcoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTYnl0ZShtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPSh1aW50MzIpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCXsKKwkJCQlpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU3Nob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1NzaG9ydChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HOgorCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSx2YWx1ZSk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTbG9uZyhtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ0xvbmc4KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50MzIpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1Nsb25nOChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5TG9uZzgoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50NjQqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDY0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2J5dGUobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ2NCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDY0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNzaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U3Nob3J0KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50NjQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPSh1aW50NjQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmcobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ2NCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfTE9ORzg6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQl7CisJCQkJaW50NjQgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZzgodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmc4KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50NjQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlGbG9hdChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGZsb2F0KiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCWlmIChkaXJlbnRyeS0+dGRpcl9jb3VudCE9MSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCk7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDggbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEJ5dGUodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQkqdmFsdWU9KGZsb2F0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2hvcnQodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQkqdmFsdWU9KGZsb2F0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNzaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZzgodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoX01TQ19WRVIgPCAxNTAwKQorCQkJCS8qCisJCQkJICogWFhYOiBNU1ZDIDYuMCBkb2VzIG5vdCBzdXBwb3J0IGNvbnZlcnNpb24KKwkJCQkgKiBvZiA2NC1iaXQgaW50ZWdlcnMgaW50byBmbG9hdGluZyBwb2ludAorCQkJCSAqIHZhbHVlcy4KKwkJCQkgKi8KKwkJCQkqdmFsdWUgPSBfVElGRlVJbnQ2NFRvRmxvYXQobSk7CisjZWxzZQorCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKyNlbmRpZgorCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2xvbmc4KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KGZsb2F0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCXsKKwkJCQlkb3VibGUgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRSYXRpb25hbCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJeworCQkJCWRvdWJsZSBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNyYXRpb25hbCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfRkxPQVQ6CisJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEZsb2F0KHRpZixkaXJlbnRyeSx2YWx1ZSk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCXsKKwkJCQlkb3VibGUgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWREb3VibGUodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlEb3VibGUoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZG91YmxlKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZG91YmxlKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCXsKKwkJCQlpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU3Nob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZG91YmxlKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChfTVNDX1ZFUiA8IDE1MDApCisJCQkJLyoKKwkJCQkgKiBYWFg6IE1TVkMgNi4wIGRvZXMgbm90IHN1cHBvcnQgY29udmVyc2lvbgorCQkJCSAqIG9mIDY0LWJpdCBpbnRlZ2VycyBpbnRvIGZsb2F0aW5nIHBvaW50CisJCQkJICogdmFsdWVzLgorCQkJCSAqLworCQkJCSp2YWx1ZSA9IF9USUZGVUludDY0VG9Eb3VibGUobSk7CisjZWxzZQorCQkJCSp2YWx1ZSA9IChkb3VibGUpbTsKKyNlbmRpZgorCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2xvbmc4KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KGRvdWJsZSltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRSYXRpb25hbCh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRTcmF0aW9uYWwodGlmLGRpcmVudHJ5LHZhbHVlKTsKKwkJCXJldHVybihlcnIpOworCQljYXNlIFRJRkZfRkxPQVQ6CisJCQl7CisJCQkJZmxvYXQgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEZsb2F0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZERvdWJsZSh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5SWZkOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwlpZiAoZGlyZW50cnktPnRkaXJfY291bnQhPTEpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQ291bnQpOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfSUZEOgorCQkJeworCQkJCXVpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDY0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HODoKKwkJY2FzZSBUSUZGX0lGRDg6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqIGNvdW50LCB1aW50MzIgZGVzdHR5cGVzaXplLCB2b2lkKiogdmFsdWUpCit7CisJaW50IHR5cGVzaXplOworCXVpbnQzMiBkYXRhc2l6ZTsKKwl2b2lkKiBkYXRhOworCXR5cGVzaXplPVRJRkZEYXRhV2lkdGgoZGlyZW50cnktPnRkaXJfdHlwZSk7CisJaWYgKChkaXJlbnRyeS0+dGRpcl9jb3VudD09MCl8fCh0eXBlc2l6ZT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorICAgICAgICAodm9pZCkgZGVzdHR5cGVzaXplOworCisgICAgICAgIC8qIAorICAgICAgICAgKiBBcyBhIHNhbml0eSBjaGVjaywgbWFrZSBzdXJlIHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgMkdCIHRhZyBhcnJheSAKKyAgICAgICAgICogaW4gZWl0aGVyIHRoZSBjdXJyZW50IGRhdGEgdHlwZSBvciB0aGUgZGVzdCBkYXRhIHR5cGUuICBUaGlzIGFsc28KKyAgICAgICAgICogYXZvaWRzIHByb2JsZW1zIHdpdGggb3ZlcmZsb3cgb2YgdG1zaXplX3Qgb24gMzJiaXQgc3lzdGVtcy4KKyAgICAgICAgICovCisJaWYgKCh1aW50NjQpKDIxNDc0ODM2NDcvdHlwZXNpemUpPGRpcmVudHJ5LT50ZGlyX2NvdW50KQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclNpemVzYW4pOworCWlmICgodWludDY0KSgyMTQ3NDgzNjQ3L2Rlc3R0eXBlc2l6ZSk8ZGlyZW50cnktPnRkaXJfY291bnQpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyU2l6ZXNhbik7CisKKwkqY291bnQ9KHVpbnQzMilkaXJlbnRyeS0+dGRpcl9jb3VudDsKKwlkYXRhc2l6ZT0oKmNvdW50KSp0eXBlc2l6ZTsKKwlhc3NlcnQoKHRtc2l6ZV90KWRhdGFzaXplPjApOworCWRhdGE9X1RJRkZDaGVja01hbGxvYyh0aWYsICpjb3VudCwgdHlwZXNpemUsICJSZWFkRGlyRW50cnlBcnJheSIpOworCWlmIChkYXRhPT0wKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJaWYgKGRhdGFzaXplPD00KQorCQkJX1RJRkZtZW1jcHkoZGF0YSwmZGlyZW50cnktPnRkaXJfb2Zmc2V0LGRhdGFzaXplKTsKKwkJZWxzZQorCQl7CisJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygmb2Zmc2V0KTsKKwkJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsKHVpbnQ2NClvZmZzZXQsKHRtc2l6ZV90KWRhdGFzaXplLGRhdGEpOworCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJeworCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQlyZXR1cm4oZXJyKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAoZGF0YXNpemU8PTgpCisJCQlfVElGRm1lbWNweShkYXRhLCZkaXJlbnRyeS0+dGRpcl9vZmZzZXQsZGF0YXNpemUpOworCQllbHNlCisJCXsKKwkJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCQl1aW50NjQgb2Zmc2V0ID0gZGlyZW50cnktPnRkaXJfb2Zmc2V0LnRvZmZfbG9uZzg7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJm9mZnNldCk7CisJCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCwodG1zaXplX3QpZGF0YXNpemUsZGF0YSk7CisJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQl7CisJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCXJldHVybihlcnIpOworCQkJfQorCQl9CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50OCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCXVpbnQ4KiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9BU0NJSToKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCwxLCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9BU0NJSToKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQkqdmFsdWU9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbTsKKwkJCQl1aW50MzIgbjsKKwkJCQltPShpbnQ4KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNieXRlKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwl9CisJZGF0YT0odWludDgqKV9USUZGbWFsbG9jKGNvdW50KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQobWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTc2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZUxvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCXVpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcoKHVpbnQzMiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2xvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgobWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlTG9uZzgoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTbG9uZzgoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTYnl0ZUFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50OCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCWludDgqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCwxLCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVCeXRlKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KGludDgqKW9yaWdkYXRhOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0JZVEU6CisJCQkqdmFsdWU9KGludDgqKW9yaWdkYXRhOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorCWRhdGE9KGludDgqKV9USUZGbWFsbG9jKGNvdW50KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2KiBtYTsKKwkJCQlpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQ4KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYqIG1hOworCQkJCWludDgqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZVNzaG9ydCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDgpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyKiBtYTsKKwkJCQlpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVMb25nKCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCWludDgqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2xvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQ4KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQqIG1hOworCQkJCWludDgqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50NjQqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmc4KG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVMb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDgpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJaW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2xvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTaG9ydEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDE2KiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwl1aW50MzIgY291bnQ7CisJdm9pZCogb3JpZ2RhdGE7CisJdWludDE2KiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsMiwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQkqdmFsdWU9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiQXJyYXlPZlNob3J0KCp2YWx1ZSxjb3VudCk7ICAKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KGludDE2KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U3Nob3J0KCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJfQorCWRhdGE9KHVpbnQxNiopX1RJRkZtYWxsb2MoY291bnQqMik7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCXVpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPSh1aW50MTYpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJdWludDE2KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTYnl0ZSgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0TG9uZygqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCXVpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKCh1aW50MzIqKW1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZygqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtYTsKKwkJCQl1aW50MTYqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50NjQqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmc4KG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQl1aW50MTYqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNsb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTc2hvcnRBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDE2KiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwl1aW50MzIgY291bnQ7CisJdm9pZCogb3JpZ2RhdGE7CisJaW50MTYqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCwyLCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG07CisJCQkJdWludDMyIG47CisJCQkJbT0odWludDE2KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQobSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNob3J0KCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KGludDE2KilvcmlnZGF0YTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCSp2YWx1ZT0oaW50MTYqKW9yaWdkYXRhOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkFycmF5T2ZTaG9ydCgodWludDE2KikoKnZhbHVlKSxjb3VudCk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwl9CisJZGF0YT0oaW50MTYqKV9USUZGbWFsbG9jKGNvdW50KjIpOworCWlmIChkYXRhPT0wKQorCXsKKwkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYyk7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4KiBtYTsKKwkJCQlpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShpbnQxNikoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4KiBtYTsKKwkJCQlpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDgqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQkJKm1iKys9KGludDE2KSgqbWErKyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyKiBtYTsKKwkJCQlpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydExvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCWludDE2KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcoKHVpbnQzMiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRTbG9uZygqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDE2KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQqIG1hOworCQkJCWludDE2KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydExvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50MTYpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJaW50MTYqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRTbG9uZzgoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwl1aW50MzIqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCw0LCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HOgorCQkJKnZhbHVlPSh1aW50MzIqKW9yaWdkYXRhOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkFycmF5T2ZMb25nKCp2YWx1ZSxjb3VudCk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KGludDMyKilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1Nsb25nKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJfQorCWRhdGE9KHVpbnQzMiopX1RJRkZtYWxsb2MoY291bnQqNCk7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCXVpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPSh1aW50MzIpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJdWludDMyKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1NieXRlKCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0odWludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG1hOworCQkJCXVpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQobWEpOworCQkJCQkqbWIrKz0odWludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYqIG1hOworCQkJCXVpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTc2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50MzIpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJeworCQkJCXVpbnQ2NCogbWE7CisJCQkJdWludDMyKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdMb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQzMikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQl1aW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2xvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0odWludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCV9USUZGZnJlZShvcmlnZGF0YSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCXsKKwkJX1RJRkZmcmVlKGRhdGEpOworCQlyZXR1cm4oZXJyKTsKKwl9CisJKnZhbHVlPWRhdGE7CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVNsb25nQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQzMioqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCWludDMyKiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsNCwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG07CisJCQkJdWludDMyIG47CisJCQkJbT0odWludDMyKilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2xvbmdMb25nKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KGludDMyKilvcmlnZGF0YTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJKnZhbHVlPShpbnQzMiopb3JpZ2RhdGE7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiQXJyYXlPZkxvbmcoKHVpbnQzMiopKCp2YWx1ZSksY291bnQpOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorCWRhdGE9KGludDMyKilfVElGRm1hbGxvYyhjb3VudCo0KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCogbWE7CisJCQkJaW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oaW50MzIpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJaW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShpbnQzMikoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG1hOworCQkJCWludDMyKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCSptYisrPShpbnQzMikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQlpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCSptYisrPShpbnQzMikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtYTsKKwkJCQlpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgobWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ0xvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50MzIpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJaW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ1Nsb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCV9USUZGZnJlZShvcmlnZGF0YSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCXsKKwkJX1RJRkZmcmVlKGRhdGEpOworCQlyZXR1cm4oZXJyKTsKKwl9CisJKnZhbHVlPWRhdGE7CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUxvbmc4QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50NjQqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwl1aW50NjQqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCw4LCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCSp2YWx1ZT0odWludDY0KilvcmlnZGF0YTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZzgoKnZhbHVlLGNvdW50KTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KGludDY0KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmc4KCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJfQorCWRhdGE9KHVpbnQ2NCopX1RJRkZtYWxsb2MoY291bnQqOCk7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCXVpbnQ2NCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPSh1aW50NjQpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJdWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZzhTYnl0ZSgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2KiBtYTsKKwkJCQl1aW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KG1hKTsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQl1aW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNzaG9ydCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQ2NCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCSptYisrPSh1aW50NjQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtYTsKKwkJCQl1aW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50NjQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQlfVElGRmZyZWUoZGF0YSk7CisJCXJldHVybihlcnIpOworCX0KKwkqdmFsdWU9ZGF0YTsKKwlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5U2xvbmc4QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQ2NCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCWludDY0KiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsOCwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmc4KG0pOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZzhMb25nOCgqbSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJCQkJCXJldHVybihlcnIpOworCQkJCQl9CisJCQkJCW0rKzsKKwkJCQl9CisJCQkJKnZhbHVlPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQkqdmFsdWU9KGludDY0KilvcmlnZGF0YTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZzgoKHVpbnQ2NCopKCp2YWx1ZSksY291bnQpOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorCWRhdGE9KGludDY0KilfVElGRm1hbGxvYyhjb3VudCo4KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCogbWE7CisJCQkJaW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oaW50NjQpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJaW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG1hOworCQkJCWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQlpbnQ2NCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJKm1iKys9KGludDY0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJCXsKKwkJCQlpbnQzMiogbWE7CisJCQkJaW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlGbG9hdEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZmxvYXQqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwlmbG9hdCogZGF0YTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJY2FzZSBUSUZGX1NCWVRFOgorCQljYXNlIFRJRkZfU0hPUlQ6CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfU0xPTkc6CisJCWNhc2UgVElGRl9MT05HODoKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQljYXNlIFRJRkZfRkxPQVQ6CisJCWNhc2UgVElGRl9ET1VCTEU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCw0LCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9GTE9BVDoKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZygodWludDMyKilvcmlnZGF0YSxjb3VudCk7ICAKKwkJCVRJRkZDdnRJRUVFRG91YmxlVG9OYXRpdmUodGlmLGNvdW50LChmbG9hdCopb3JpZ2RhdGEpOworCQkJKnZhbHVlPShmbG9hdCopb3JpZ2RhdGE7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwl9CisJZGF0YT0oZmxvYXQqKV9USUZGbWFsbG9jKGNvdW50KnNpemVvZihmbG9hdCkpOworCWlmIChkYXRhPT0wKQorCXsKKwkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYyk7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4KiBtYTsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShmbG9hdCkoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4KiBtYTsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDgqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KG1hKTsKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYqIG1hOworCQkJCWZsb2F0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW1hKTsKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcobWEpOworCQkJCQkqbWIrKz0oZmxvYXQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtYTsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKCh1aW50MzIqKW1hKTsKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQqIG1hOworCQkJCWZsb2F0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChfTVNDX1ZFUiA8IDE1MDApCisJCQkJCS8qCisJCQkJCSAqIFhYWDogTVNWQyA2LjAgZG9lcyBub3Qgc3VwcG9ydAorCQkJCQkgKiBjb252ZXJzaW9uIG9mIDY0LWJpdCBpbnRlZ2VycyBpbnRvCisJCQkJCSAqIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KKwkJCQkJICovCisJCQkJCSptYisrID0gX1RJRkZVSW50NjRUb0Zsb2F0KCptYSsrKTsKKyNlbHNlCisJCQkJCSptYisrID0gKGZsb2F0KSgqbWErKyk7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQkqbWIrKz0oZmxvYXQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJdWludDMyIG1hYTsKKwkJCQl1aW50MzIgbWFiOworCQkJCWZsb2F0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFhPSptYSsrOworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFiPSptYSsrOworCQkJCQlpZiAobWFiPT0wKQorCQkJCQkJKm1iKys9MC4wOworCQkJCQllbHNlCisJCQkJCQkqbWIrKz0oZmxvYXQpbWFhLyhmbG9hdCltYWI7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQl7CisJCQkJdWludDMyKiBtYTsKKwkJCQlpbnQzMiBtYWE7CisJCQkJdWludDMyIG1hYjsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCW1hYT0qKGludDMyKiltYTsKKwkJCQkJbWErKzsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCW1hYj0qbWErKzsKKwkJCQkJaWYgKG1hYj09MCkKKwkJCQkJCSptYisrPTAuMDsKKwkJCQkJZWxzZQorCQkJCQkJKm1iKys9KGZsb2F0KW1hYS8oZmxvYXQpbWFiOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJeworCQkJCWRvdWJsZSogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiQXJyYXlPZkxvbmc4KCh1aW50NjQqKW9yaWdkYXRhLGNvdW50KTsKKwkJCQlUSUZGQ3Z0SUVFRURvdWJsZVRvTmF0aXZlKHRpZixjb3VudCwoZG91YmxlKilvcmlnZGF0YSk7CisJCQkJbWE9KGRvdWJsZSopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oZmxvYXQpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5RG91YmxlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwlkb3VibGUqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJY2FzZSBUSUZGX0ZMT0FUOgorCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsOCwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkFycmF5T2ZMb25nOCgodWludDY0KilvcmlnZGF0YSxjb3VudCk7CisJCQlUSUZGQ3Z0SUVFRURvdWJsZVRvTmF0aXZlKHRpZixjb3VudCwoZG91YmxlKilvcmlnZGF0YSk7CisJCQkqdmFsdWU9KGRvdWJsZSopb3JpZ2RhdGE7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwl9CisJZGF0YT0oZG91YmxlKilfVElGRm1hbGxvYyhjb3VudCpzaXplb2YoZG91YmxlKSk7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCWRvdWJsZSogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oZG91YmxlKSgqbWErKyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCXsKKwkJCQlpbnQxNiogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW1hKTsKKwkJCQkJKm1iKys9KGRvdWJsZSkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCWRvdWJsZSogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtYTsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJeworCQkJCXVpbnQ2NCogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChfTVNDX1ZFUiA8IDE1MDApCisJCQkJCS8qCisJCQkJCSAqIFhYWDogTVNWQyA2LjAgZG9lcyBub3Qgc3VwcG9ydAorCQkJCQkgKiBjb252ZXJzaW9uIG9mIDY0LWJpdCBpbnRlZ2VycyBpbnRvCisJCQkJCSAqIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KKwkJCQkJICovCisJCQkJCSptYisrID0gX1RJRkZVSW50NjRUb0RvdWJsZSgqbWErKyk7CisjZWxzZQorCQkJCQkqbWIrKyA9IChkb3VibGUpKCptYSsrKTsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQkqbWIrKz0oZG91YmxlKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQzMiBtYWE7CisJCQkJdWludDMyIG1hYjsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcobWEpOworCQkJCQltYWE9Km1hKys7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcobWEpOworCQkJCQltYWI9Km1hKys7CisJCQkJCWlmIChtYWI9PTApCisJCQkJCQkqbWIrKz0wLjA7CisJCQkJCWVsc2UKKwkJCQkJCSptYisrPShkb3VibGUpbWFhLyhkb3VibGUpbWFiOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJaW50MzIgbWFhOworCQkJCXVpbnQzMiBtYWI7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFhPSooaW50MzIqKW1hOworCQkJCQltYSsrOworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFiPSptYSsrOworCQkJCQlpZiAobWFiPT0wKQorCQkJCQkJKm1iKys9MC4wOworCQkJCQllbHNlCisJCQkJCQkqbWIrKz0oZG91YmxlKW1hYS8oZG91YmxlKW1hYjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJeworCQkJCWZsb2F0KiBtYTsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiQXJyYXlPZkxvbmcoKHVpbnQzMiopb3JpZ2RhdGEsY291bnQpOyAgCisJCQkJVElGRkN2dElFRUVGbG9hdFRvTmF0aXZlKHRpZixjb3VudCwoZmxvYXQqKW9yaWdkYXRhKTsKKwkJCQltYT0oZmxvYXQqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQkJKm1iKys9KGRvdWJsZSkoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJfQorCV9USUZGZnJlZShvcmlnZGF0YSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCXsKKwkJX1RJRkZmcmVlKGRhdGEpOworCQlyZXR1cm4oZXJyKTsKKwl9CisJKnZhbHVlPWRhdGE7CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUlmZDhBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCXVpbnQ2NCogZGF0YTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfSUZEOgorCQljYXNlIFRJRkZfSUZEODoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlKTsKKwl9CisJZXJyPVRJRkZSZWFkRGlyRW50cnlBcnJheSh0aWYsZGlyZW50cnksJmNvdW50LDgsJm9yaWdkYXRhKTsKKwlpZiAoKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKXx8KG9yaWdkYXRhPT0wKSkKKwl7CisJCSp2YWx1ZT0wOworCQlyZXR1cm4oZXJyKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfSUZEODoKKwkJCSp2YWx1ZT0odWludDY0KilvcmlnZGF0YTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZzgoKnZhbHVlLGNvdW50KTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCX0KKwlkYXRhPSh1aW50NjQqKV9USUZGbWFsbG9jKGNvdW50KjgpOworCWlmIChkYXRhPT0wKQorCXsKKwkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYyk7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfSUZEOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJdWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlQZXJzYW1wbGVTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwl1aW50MTYqIG07CisJdWludDE2KiBuYTsKKwl1aW50MTYgbmI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50PCh1aW50NjQpdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCk7CisJZXJyPVRJRkZSZWFkRGlyRW50cnlTaG9ydEFycmF5KHRpZixkaXJlbnRyeSwmbSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQlyZXR1cm4oZXJyKTsKKwluYT1tOworCW5iPXRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7CisJKnZhbHVlPSpuYSsrOworCW5iLS07CisJd2hpbGUgKG5iPjApCisJeworCQlpZiAoKm5hKyshPSp2YWx1ZSkKKwkJeworCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJQc2RpZjsKKwkJCWJyZWFrOworCQl9CisJCW5iLS07CisJfQorCV9USUZGZnJlZShtKTsKKwlyZXR1cm4oZXJyKTsKK30KKworI2lmIDAKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVBlcnNhbXBsZURvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwlkb3VibGUqIG07CisJZG91YmxlKiBuYTsKKwl1aW50MTYgbmI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50PCh1aW50NjQpdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCk7CisJZXJyPVRJRkZSZWFkRGlyRW50cnlEb3VibGVBcnJheSh0aWYsZGlyZW50cnksJm0pOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJcmV0dXJuKGVycik7CisJbmE9bTsKKwluYj10aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOworCSp2YWx1ZT0qbmErKzsKKwluYi0tOworCXdoaWxlIChuYj4wKQorCXsKKwkJaWYgKCpuYSsrIT0qdmFsdWUpCisJCXsKKwkJCWVycj1USUZGUmVhZERpckVudHJ5RXJyUHNkaWY7CisJCQlicmVhazsKKwkJfQorCQluYi0tOworCX0KKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRCeXRlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDgqIHZhbHVlKQoreworCSh2b2lkKSB0aWY7CisJKnZhbHVlPSoodWludDgqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDgqIHZhbHVlKQoreworCSh2b2lkKSB0aWY7CisJKnZhbHVlPSooaW50OCopKCZkaXJlbnRyeS0+dGRpcl9vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNob3J0KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDE2KiB2YWx1ZSkKK3sKKwkqdmFsdWUgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9zaG9ydDsKKwkvKiAqdmFsdWU9Kih1aW50MTYqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsgKi8KKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYlNob3J0KHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTc2hvcnQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQxNiogdmFsdWUpCit7CisJKnZhbHVlPSooaW50MTYqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDMyKiB2YWx1ZSkKK3sKKwkqdmFsdWU9Kih1aW50MzIqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmcodmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MzIqIHZhbHVlKQoreworCSp2YWx1ZT0qKGludDMyKikoJmRpcmVudHJ5LT50ZGlyX29mZnNldCk7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJMb25nKCh1aW50MzIqKXZhbHVlKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZExvbmc4KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDY0KiB2YWx1ZSkKK3sKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsb2Zmc2V0LDgsdmFsdWUpOworCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQlyZXR1cm4oZXJyKTsKKwl9CisJZWxzZQorCQkqdmFsdWUgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9sb25nODsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmc4KHZhbHVlKTsKKwlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDY0KiB2YWx1ZSkKK3sKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsb2Zmc2V0LDgsdmFsdWUpOworCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQlyZXR1cm4oZXJyKTsKKwl9CisJZWxzZQorCQkqdmFsdWU9KihpbnQ2NCopKCZkaXJlbnRyeS0+dGRpcl9vZmZzZXQpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopdmFsdWUpOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkUmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKQoreworCVVJbnQ2NEFsaWduZWRfdCBtOworCisJYXNzZXJ0KHNpemVvZihkb3VibGUpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwl7CisJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCXVpbnQzMiBvZmZzZXQgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9sb25nOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZvZmZzZXQpOworCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCw4LG0uaSk7CisJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCXJldHVybihlcnIpOworCX0KKwllbHNlCisJCW0ubCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOworCWlmIChtLmlbMF09PTApCisJCSp2YWx1ZT0wLjA7CisJZWxzZQorCQkqdmFsdWU9KGRvdWJsZSltLmlbMF0vKGRvdWJsZSltLmlbMV07CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTcmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKQoreworCVVJbnQ2NEFsaWduZWRfdCBtOworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKGludDMyKT09NCk7CisJYXNzZXJ0KHNpemVvZih1aW50MzIpPT00KTsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsb2Zmc2V0LDgsbS5pKTsKKwkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJcmV0dXJuKGVycik7CisJfQorCWVsc2UKKwkJbS5sPWRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOworCWlmICgoaW50MzIpbS5pWzBdPT0wKQorCQkqdmFsdWU9MC4wOworCWVsc2UKKwkJKnZhbHVlPShkb3VibGUpKChpbnQzMiltLmlbMF0pLyhkb3VibGUpbS5pWzFdOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEZsb2F0KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZmxvYXQqIHZhbHVlKQoreworICAgICAgICAgdW5pb24KKwkgeworCSAgIGZsb2F0ICBmOworCSAgIHVpbnQzMiBpOworCSB9IGZsb2F0X3VuaW9uOworCWFzc2VydChzaXplb2YoZmxvYXQpPT00KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWFzc2VydChzaXplb2YoZmxvYXRfdW5pb24pPT00KTsKKwlmbG9hdF91bmlvbi5pPSoodWludDMyKikoJmRpcmVudHJ5LT50ZGlyX29mZnNldCk7CisJKnZhbHVlPWZsb2F0X3VuaW9uLmY7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJMb25nKCh1aW50MzIqKXZhbHVlKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZERvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpCit7CisJYXNzZXJ0KHNpemVvZihkb3VibGUpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydChzaXplb2YoVUludDY0QWxpZ25lZF90KT09OCk7CisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwl7CisJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCXVpbnQzMiBvZmZzZXQgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9sb25nOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZvZmZzZXQpOworCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCw4LHZhbHVlKTsKKwkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJcmV0dXJuKGVycik7CisJfQorCWVsc2UKKwl7CisJICAgICAgIFVJbnQ2NEFsaWduZWRfdCB1aW50NjRfdW5pb247CisJICAgICAgIHVpbnQ2NF91bmlvbi5sPWRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCSAgICAgICAqdmFsdWU9dWludDY0X3VuaW9uLmQ7CisJfQorCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopdmFsdWUpOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNieXRlKGludDggdmFsdWUpCit7CisJaWYgKHZhbHVlPDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2hvcnQodWludDE2IHZhbHVlKQoreworCWlmICh2YWx1ZT4weEZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNzaG9ydChpbnQxNiB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPDApfHwodmFsdWU+MHhGRikpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlTG9uZyh1aW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlPjB4RkYpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwwKXx8KHZhbHVlPjB4RkYpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZUxvbmc4KHVpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHhGRikKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwwKXx8KHZhbHVlPjB4RkYpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVCeXRlKHVpbnQ4IHZhbHVlKQoreworCWlmICh2YWx1ZT4weDdGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTaG9ydCh1aW50MTYgdmFsdWUpCit7CisJaWYgKHZhbHVlPjB4N0YpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZVNzaG9ydChpbnQxNiB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPC0weDgwKXx8KHZhbHVlPjB4N0YpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVMb25nKHVpbnQzMiB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHg3RikKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwtMHg4MCl8fCh2YWx1ZT4weDdGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlTG9uZzgodWludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZT4weDdGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwtMHg4MCl8fCh2YWx1ZT4weDdGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U2J5dGUoaW50OCB2YWx1ZSkKK3sKKwlpZiAodmFsdWU8MCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U3Nob3J0KGludDE2IHZhbHVlKQoreworCWlmICh2YWx1ZTwwKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nKHVpbnQzMiB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHhGRkZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZyhpbnQzMiB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPDApfHwodmFsdWU+MHhGRkZGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0TG9uZzgodWludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZT4weEZGRkYpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNsb25nOChpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPDApfHwodmFsdWU+MHhGRkZGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNob3J0KHVpbnQxNiB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHg3RkZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU3Nob3J0TG9uZyh1aW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlPjB4N0ZGRikKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNsb25nKGludDMyIHZhbHVlKQoreworCWlmICgodmFsdWU8LTB4ODAwMCl8fCh2YWx1ZT4weDdGRkYpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU3Nob3J0TG9uZzgodWludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZT4weDdGRkYpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwtMHg4MDAwKXx8KHZhbHVlPjB4N0ZGRikpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2J5dGUoaW50OCB2YWx1ZSkKK3sKKwlpZiAodmFsdWU8MCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTc2hvcnQoaW50MTYgdmFsdWUpCit7CisJaWYgKHZhbHVlPDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlPDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKKy8qCisgKiBMYXJnZXN0IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICovCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBUSUZGX1VJTlQzMl9NQVggMHhGRkZGRkZGRkk2NAorI2Vsc2UKKyMgZGVmaW5lIFRJRkZfVUlOVDMyX01BWCAweEZGRkZGRkZGTEwKKyNlbmRpZgorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdMb25nOCh1aW50NjQgdmFsdWUpCit7CisJaWYgKHZhbHVlID4gVElGRl9VSU5UMzJfTUFYKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwwKSB8fCAodmFsdWUgPiBUSUZGX1VJTlQzMl9NQVgpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCisjdW5kZWYgVElGRl9VSU5UMzJfTUFYCisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIKK1RJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2xvbmdMb25nKHVpbnQzMiB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPiAweDdGRkZGRkZGVUwpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIKK1RJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2xvbmdMb25nOCh1aW50NjQgdmFsdWUpCit7CisJaWYgKHZhbHVlID4gMHg3RkZGRkZGRlVMKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nU2xvbmc4KGludDY0IHZhbHVlKQoreworCWlmICgodmFsdWUgPCAwTC0weDgwMDAwMDAwTCkgfHwgKHZhbHVlID4gMHg3RkZGRkZGRkwpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2J5dGUoaW50OCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U3Nob3J0KGludDE2IHZhbHVlKQoreworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIKK1RJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZzhTbG9uZyhpbnQzMiB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmc4KGludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKKy8qCisgKiBMYXJnZXN0IDY0LWJpdCBzaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAqLworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgVElGRl9JTlQ2NF9NQVggMHg3RkZGRkZGRkZGRkZGRkZGSTY0CisjZWxzZQorIyBkZWZpbmUgVElGRl9JTlQ2NF9NQVggMHg3RkZGRkZGRkZGRkZGRkZGTEwKKyNlbmRpZgorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nOExvbmc4KHVpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPiBUSUZGX0lOVDY0X01BWCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworI3VuZGVmIFRJRkZfSU5UNjRfTUFYCisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIKK1RJRkZSZWFkRGlyRW50cnlEYXRhKFRJRkYqIHRpZiwgdWludDY0IG9mZnNldCwgdG1zaXplX3Qgc2l6ZSwgdm9pZCogZGVzdCkKK3sKKwlhc3NlcnQoc2l6ZT4wKTsKKwlpZiAoIWlzTWFwcGVkKHRpZikpIHsKKwkJaWYgKCFTZWVrT0sodGlmLG9mZnNldCkpCisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVycklvKTsKKwkJaWYgKCFSZWFkT0sodGlmLGRlc3Qsc2l6ZSkpCisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVycklvKTsKKwl9IGVsc2UgeworCQlzaXplX3QgbWEsbWI7CisJCW1hPShzaXplX3Qpb2Zmc2V0OworCQltYj1tYStzaXplOworCQlpZiAoKCh1aW50NjQpbWEhPW9mZnNldCkKKwkJICAgIHx8IChtYiA8IG1hKQorCQkgICAgfHwgKG1iIC0gbWEgIT0gKHNpemVfdCkgc2l6ZSkKKwkJICAgIHx8IChtYiA8IChzaXplX3Qpc2l6ZSkKKwkJICAgIHx8IChtYiA+IChzaXplX3QpdGlmLT50aWZfc2l6ZSkKKwkJICAgICkKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJySW8pOworCQlfVElGRm1lbWNweShkZXN0LHRpZi0+dGlmX2Jhc2UrbWEsc2l6ZSk7CisJfQorCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKFRJRkYqIHRpZiwgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVyciwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiB0YWduYW1lLCBpbnQgcmVjb3ZlcikKK3sKKwlpZiAoIXJlY292ZXIpIHsKKwkJc3dpdGNoIChlcnIpIHsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyckNvdW50OgorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkluY29ycmVjdCBjb3VudCBmb3IgXCIlc1wiIiwKKwkJCQkJICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclR5cGU6CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiSW5jb21wYXRpYmxlIHR5cGUgZm9yIFwiJXNcIiIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJJbzoKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJJTyBlcnJvciBkdXJpbmcgcmVhZGluZyBvZiBcIiVzXCIiLAorCQkJCQkgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2U6CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiSW5jb3JyZWN0IHZhbHVlIGZvciBcIiVzXCIiLAorCQkJCQkgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGUmVhZERpckVudHJ5RXJyUHNkaWY6CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJDYW5ub3QgaGFuZGxlIGRpZmZlcmVudCB2YWx1ZXMgcGVyIHNhbXBsZSBmb3IgXCIlc1wiIiwKKwkJCQkJICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclNpemVzYW46CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiU2FuaXR5IGNoZWNrIG9uIHNpemUgb2YgXCIlc1wiIHZhbHVlIGZhaWxlZCIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYzoKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJPdXQgb2YgbWVtb3J5IHJlYWRpbmcgb2YgXCIlc1wiIiwKKwkJCQkJICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYXNzZXJ0KDApOyAgIC8qIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChlcnIpIHsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyckNvdW50OgorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIkluY29ycmVjdCBjb3VudCBmb3IgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlOgorCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiSW5jb21wYXRpYmxlIHR5cGUgZm9yIFwiJXNcIjsgdGFnIGlnbm9yZWQiLAorCQkJCQkgICAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJJbzoKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiSU8gZXJyb3IgZHVyaW5nIHJlYWRpbmcgb2YgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclJhbmdlOgorCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiSW5jb3JyZWN0IHZhbHVlIGZvciBcIiVzXCI7IHRhZyBpZ25vcmVkIiwKKwkJCQkJICAgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGUmVhZERpckVudHJ5RXJyUHNkaWY6CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCSJDYW5ub3QgaGFuZGxlIGRpZmZlcmVudCB2YWx1ZXMgcGVyIHNhbXBsZSBmb3IgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclNpemVzYW46CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkiU2FuaXR5IGNoZWNrIG9uIHNpemUgb2YgXCIlc1wiIHZhbHVlIGZhaWxlZDsgdGFnIGlnbm9yZWQiLAorCQkJCQkgICAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYzoKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIk91dCBvZiBtZW1vcnkgcmVhZGluZyBvZiBcIiVzXCI7IHRhZyBpZ25vcmVkIiwKKwkJCQkJICAgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhc3NlcnQoMCk7ICAgLyogd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IFRJRkYgZGlyZWN0b3J5IGZyb20gYSBmaWxlIGFuZCBjb252ZXJ0IGl0IHRvIHRoZSBpbnRlcm5hbAorICogZm9ybWF0LiBXZSByZWFkIGRpcmVjdG9yaWVzIHNlcXVlbnRpYWxseS4KKyAqLworaW50CitUSUZGUmVhZERpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWREaXJlY3RvcnkiOworCVRJRkZEaXJFbnRyeSogZGlyOworCXVpbnQxNiBkaXJjb3VudDsKKwlUSUZGRGlyRW50cnkqIGRwOworCXVpbnQxNiBkaTsKKwljb25zdCBUSUZGRmllbGQqIGZpcDsKKwl1aW50MzIgZmlpPUZBSUxFRF9GSUk7CisgICAgICAgIHRvZmZfdCBuZXh0ZGlyb2ZmOworCXRpZi0+dGlmX2Rpcm9mZj10aWYtPnRpZl9uZXh0ZGlyb2ZmOworCWlmICghVElGRkNoZWNrRGlyT2Zmc2V0KHRpZix0aWYtPnRpZl9uZXh0ZGlyb2ZmKSkKKwkJcmV0dXJuIDA7ICAgICAgICAgICAvKiBsYXN0IG9mZnNldCBvciBiYWQgb2Zmc2V0IChJRkQgbG9vcGluZykgKi8KKwkoKnRpZi0+dGlmX2NsZWFudXApKHRpZik7ICAgLyogY2xlYW51cCBhbnkgcHJldmlvdXMgY29tcHJlc3Npb24gc3RhdGUgKi8KKwl0aWYtPnRpZl9jdXJkaXIrKzsKKyAgICAgICAgbmV4dGRpcm9mZiA9IHRpZi0+dGlmX25leHRkaXJvZmY7CisJZGlyY291bnQ9VElGRkZldGNoRGlyZWN0b3J5KHRpZixuZXh0ZGlyb2ZmLCZkaXIsJnRpZi0+dGlmX25leHRkaXJvZmYpOworCWlmICghZGlyY291bnQpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCSAgICAiRmFpbGVkIHRvIHJlYWQgZGlyZWN0b3J5IGF0IG9mZnNldCAiIFRJRkZfVUlOVDY0X0ZPUk1BVCxuZXh0ZGlyb2ZmKTsKKwkJcmV0dXJuIDA7CisJfQorCVRJRkZSZWFkRGlyZWN0b3J5Q2hlY2tPcmRlcih0aWYsZGlyLGRpcmNvdW50KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXJrIGR1cGxpY2F0ZXMgb2YgYW55IHRhZyB0byBiZSBpZ25vcmVkIChidWd6aWxsYSAxOTk0KQorICAgICAgICAgKiB0byBhdm9pZCBjZXJ0YWluIHBhdGhvbG9naWNhbCBwcm9ibGVtcy4KKyAgICAgICAgICovCisJeworCQlUSUZGRGlyRW50cnkqIG1hOworCQl1aW50MTYgbWI7CisJCWZvciAobWE9ZGlyLCBtYj0wOyBtYjxkaXJjb3VudDsgbWErKywgbWIrKykKKwkJeworCQkJVElGRkRpckVudHJ5KiBuYTsKKwkJCXVpbnQxNiBuYjsKKwkJCWZvciAobmE9bWErMSwgbmI9bWIrMTsgbmI8ZGlyY291bnQ7IG5hKyssIG5iKyspCisJCQl7CisJCQkJaWYgKG1hLT50ZGlyX3RhZz09bmEtPnRkaXJfdGFnKQorCQkJCQluYS0+dGRpcl90YWc9SUdOT1JFOworCQkJfQorCQl9CisJfQorICAgICAgICAKKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CRUVOV1JJVElORzsgICAgLyogcmVzZXQgYmVmb3JlIG5ldyBkaXIgKi8KKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUY0V1JJVEU7ICAgICAgLyogcmVzZXQgYmVmb3JlIG5ldyBkaXIgKi8KKwkvKiBmcmVlIGFueSBvbGQgc3R1ZmYgYW5kIHJlaW5pdCAqLworCVRJRkZGcmVlRGlyZWN0b3J5KHRpZik7CisJVElGRkRlZmF1bHREaXJlY3RvcnkodGlmKTsKKwkvKgorCSAqIEVsZWN0cm9uaWMgQXJ0cyB3cml0ZXMgZ3JheS1zY2FsZSBUSUZGIGZpbGVzCisJICogd2l0aG91dCBhIFBsYW5hckNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IGVudHJ5LgorCSAqIFRodXMgd2Ugc2V0dXAgYSBkZWZhdWx0IHZhbHVlIGhlcmUsIGV2ZW4gdGhvdWdoCisJICogdGhlIFRJRkYgc3BlYyBzYXlzIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCisJICovCisJVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1BMQU5BUkNPTkZJRyxQTEFOQVJDT05GSUdfQ09OVElHKTsKKwkvKgorCSAqIFNldHVwIGRlZmF1bHQgdmFsdWUgYW5kIHRoZW4gbWFrZSBhIHBhc3Mgb3ZlcgorCSAqIHRoZSBmaWVsZHMgdG8gY2hlY2sgdHlwZSBhbmQgdGFnIGluZm9ybWF0aW9uLAorCSAqIGFuZCB0byBleHRyYWN0IGluZm8gcmVxdWlyZWQgdG8gc2l6ZSBkYXRhCisJICogc3RydWN0dXJlcy4gIEEgc2Vjb25kIHBhc3MgaXMgbWFkZSBhZnRlcndhcmRzCisJICogdG8gcmVhZCBpbiBldmVydGhpbmcgbm90IHRha2VuIGluIHRoZSBmaXJzdCBwYXNzLgorCSAqIEJ1dCB3ZSBtdXN0IHByb2Nlc3MgdGhlIENvbXByZXNzaW9uIHRhZyBmaXJzdAorCSAqIGluIG9yZGVyIHRvIG1lcmdlIGluIGNvZGVjLXByaXZhdGUgdGFnIGRlZmluaXRpb25zIChvdGhlcndpc2UKKwkgKiB3ZSBtYXkgZ2V0IGNvbXBsYWludHMgYWJvdXQgdW5rbm93biB0YWdzKS4gIEhvd2V2ZXIsIHRoZQorCSAqIENvbXByZXNzaW9uIHRhZyBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBTYW1wbGVzUGVyUGl4ZWwKKwkgKiB0YWcgdmFsdWUgYmVjYXVzZSBvbGRlciBUSUZGIHNwZWNzIHBlcm1pdGVkIENvbXByZXNzaW9uCisJICogdG8gYmUgd3JpdHRlbiBhcyBhIFNhbXBsZXNQZXJQaXhlbC1jb3VudCB0YWcgZW50cnkuCisJICogVGh1cyBpZiB3ZSBkb24ndCBmaXJzdCBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IFNhbXBsZXNQZXJQaXhlbAorCSAqIHRhZyB2YWx1ZSB0aGVuIHdlIG1heSBlbmQgdXAgaWdub3JpbmcgdGhlIENvbXByZXNzaW9uIHRhZworCSAqIHZhbHVlIGJlY2F1c2UgaXQgaGFzIGFuIGluY29ycmVjdCBjb3VudCB2YWx1ZSAoaWYgdGhlCisJICogdHJ1ZSB2YWx1ZSBvZiBTYW1wbGVzUGVyUGl4ZWwgaXMgbm90IDEpLgorCSAqLworCWRwPVRJRkZSZWFkRGlyZWN0b3J5RmluZEVudHJ5KHRpZixkaXIsZGlyY291bnQsVElGRlRBR19TQU1QTEVTUEVSUElYRUwpOworCWlmIChkcCkKKwl7CisJCWlmICghVElGRkZldGNoTm9ybWFsVGFnKHRpZixkcCwwKSkKKwkJCWdvdG8gYmFkOworCQlkcC0+dGRpcl90YWc9SUdOT1JFOworCX0KKwlkcD1USUZGUmVhZERpcmVjdG9yeUZpbmRFbnRyeSh0aWYsZGlyLGRpcmNvdW50LFRJRkZUQUdfQ09NUFJFU1NJT04pOworCWlmIChkcCkKKwl7CisJCS8qCisJCSAqIFRoZSA1LjAgc3BlYyBzYXlzIHRoZSBDb21wcmVzc2lvbiB0YWcgaGFzIG9uZSB2YWx1ZSwgd2hpbGUKKwkJICogZWFybGllciBzcGVjcyBzYXkgaXQgaGFzIG9uZSB2YWx1ZSBwZXIgc2FtcGxlLiAgQmVjYXVzZSBvZgorCQkgKiB0aGlzLCB3ZSBhY2NlcHQgdGhlIHRhZyBpZiBvbmUgdmFsdWUgaXMgc3VwcGxpZWQgd2l0aCBlaXRoZXIKKwkJICogY291bnQuCisJCSAqLworCQl1aW50MTYgdmFsdWU7CisJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnQodGlmLGRwLCZ2YWx1ZSk7CisJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCkKKwkJCWVycj1USUZGUmVhZERpckVudHJ5UGVyc2FtcGxlU2hvcnQodGlmLGRwLCZ2YWx1ZSk7CisJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJeworCQkJVElGRlJlYWREaXJFbnRyeU91dHB1dEVycih0aWYsZXJyLG1vZHVsZSwiQ29tcHJlc3Npb24iLDApOworCQkJZ290byBiYWQ7CisJCX0KKwkJaWYgKCFUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfQ09NUFJFU1NJT04sdmFsdWUpKQorCQkJZ290byBiYWQ7CisJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJfQorCWVsc2UKKwl7CisJCWlmICghVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX0NPTVBSRVNTSU9OLENPTVBSRVNTSU9OX05PTkUpKQorCQkJZ290byBiYWQ7CisJfQorCS8qCisJICogRmlyc3QgcmVhbCBwYXNzIG92ZXIgdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwlmb3IgKGRpPTAsIGRwPWRpcjsgZGk8ZGlyY291bnQ7IGRpKyssIGRwKyspCisJeworCQlpZiAoZHAtPnRkaXJfdGFnIT1JR05PUkUpCisJCXsKKwkJCVRJRkZSZWFkRGlyZWN0b3J5RmluZEZpZWxkSW5mbyh0aWYsZHAtPnRkaXJfdGFnLCZmaWkpOworCQkJaWYgKGZpaSA9PSBGQUlMRURfRklJKQorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIlVua25vd24gZmllbGQgd2l0aCB0YWcgJWQgKDB4JXgpIGVuY291bnRlcmVkIiwKKwkJCQkgICAgZHAtPnRkaXJfdGFnLGRwLT50ZGlyX3RhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBmb2xsb3dpbmcga25vd2luZ2x5IGxlYWtzIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzIGZpZWxkIHN0cnVjdHVyZSAqLworCQkJCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsCisJCQkJCV9USUZGQ3JlYXRlQW5vbkZpZWxkKHRpZiwKKwkJCQkJCWRwLT50ZGlyX3RhZywKKwkJCQkJCShUSUZGRGF0YVR5cGUpIGRwLT50ZGlyX3R5cGUpLAorCQkJCQkxKSkgeworCQkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLAorCQkJCQkgICAgbW9kdWxlLAorCQkJCQkgICAgIlJlZ2lzdGVyaW5nIGFub255bW91cyBmaWVsZCB3aXRoIHRhZyAlZCAoMHgleCkgZmFpbGVkIiwKKwkJCQkJICAgIGRwLT50ZGlyX3RhZywKKwkJCQkJICAgIGRwLT50ZGlyX3RhZyk7CisJCQkJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJVElGRlJlYWREaXJlY3RvcnlGaW5kRmllbGRJbmZvKHRpZixkcC0+dGRpcl90YWcsJmZpaSk7CisJCQkJCWFzc2VydChmaWkgIT0gRkFJTEVEX0ZJSSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChkcC0+dGRpcl90YWchPUlHTk9SRSkKKwkJeworCQkJZmlwPXRpZi0+dGlmX2ZpZWxkc1tmaWldOworCQkJaWYgKGZpcC0+ZmllbGRfYml0PT1GSUVMRF9JR05PUkUpCisJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlzd2l0Y2ggKGRwLT50ZGlyX3RhZykKKwkJCQl7CisJCQkJCWNhc2UgVElGRlRBR19TVFJJUE9GRlNFVFM6CisJCQkJCWNhc2UgVElGRlRBR19TVFJJUEJZVEVDT1VOVFM6CisJCQkJCWNhc2UgVElGRlRBR19USUxFT0ZGU0VUUzoKKwkJCQkJY2FzZSBUSUZGVEFHX1RJTEVCWVRFQ09VTlRTOgorCQkJCQkJVElGRlNldEZpZWxkQml0KHRpZixmaXAtPmZpZWxkX2JpdCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUSUZGVEFHX0lNQUdFV0lEVEg6CisJCQkJCWNhc2UgVElGRlRBR19JTUFHRUxFTkdUSDoKKwkJCQkJY2FzZSBUSUZGVEFHX0lNQUdFREVQVEg6CisJCQkJCWNhc2UgVElGRlRBR19USUxFTEVOR1RIOgorCQkJCQljYXNlIFRJRkZUQUdfVElMRVdJRFRIOgorCQkJCQljYXNlIFRJRkZUQUdfVElMRURFUFRIOgorCQkJCQljYXNlIFRJRkZUQUdfUExBTkFSQ09ORklHOgorCQkJCQljYXNlIFRJRkZUQUdfUk9XU1BFUlNUUklQOgorCQkJCQljYXNlIFRJRkZUQUdfRVhUUkFTQU1QTEVTOgorCQkJCQkJaWYgKCFUSUZGRmV0Y2hOb3JtYWxUYWcodGlmLGRwLDApKQorCQkJCQkJCWdvdG8gYmFkOworCQkJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIFhYWDogT0pQRUcgaGFjay4KKwkgKiBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYikgcGxhbmFyY29uZmlnIHRhZyBzYXlzIGl0J3Mgc2VwYXJhdGUsCisJICogYykgc3RyaXAgb2Zmc2V0cy9ieXRlY291bnRzIHRhZyBhcmUgYm90aCBwcmVzZW50IGFuZAorCSAqIGQpIGJvdGggY29udGFpbiBleGFjdGx5IG9uZSB2YWx1ZSwgdGhlbiB3ZSBjb25zaXN0ZW50bHkgZmluZAorCSAqIHRoYXQgdGhlIGJ1Z2d5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBidWdneSBjb21wcmVzc2lvbiBzY2hlbWUKKwkgKiBtYXRjaGVzIGNvbnRpZyBwbGFuYXJjb25maWcgYmVzdC4gU28gd2UgJ2ZpeC11cCcgdGhlIHRhZyBoZXJlCisJICovCisJaWYgKCh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb249PUNPTVBSRVNTSU9OX09KUEVHKSYmCisJICAgICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnPT1QTEFOQVJDT05GSUdfU0VQQVJBVEUpKQorCXsKKyAgICAgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKHRpZikpCisgICAgICAgICAgICBnb3RvIGJhZDsKKwkJZHA9VElGRlJlYWREaXJlY3RvcnlGaW5kRW50cnkodGlmLGRpcixkaXJjb3VudCxUSUZGVEFHX1NUUklQT0ZGU0VUUyk7CisJCWlmICgoZHAhPTApJiYoZHAtPnRkaXJfY291bnQ9PTEpKQorCQl7CisJCQlkcD1USUZGUmVhZERpcmVjdG9yeUZpbmRFbnRyeSh0aWYsZGlyLGRpcmNvdW50LAorCQkJICAgIFRJRkZUQUdfU1RSSVBCWVRFQ09VTlRTKTsKKwkJCWlmICgoZHAhPTApJiYoZHAtPnRkaXJfY291bnQ9PTEpKQorCQkJeworCQkJCXRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWc9UExBTkFSQ09ORklHX0NPTlRJRzsKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkgICAgIlBsYW5hcmNvbmZpZyB0YWcgdmFsdWUgYXNzdW1lZCBpbmNvcnJlY3QsICIKKwkJCQkgICAgImFzc3VtaW5nIGRhdGEgaXMgY29udGlnIGluc3RlYWQgb2YgY2h1bmt5Iik7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBBbGxvY2F0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBzZXR1cCBkZWZhdWx0cy4KKwkgKi8KKwlpZiAoIVRJRkZGaWVsZFNldCh0aWYsRklFTERfSU1BR0VESU1FTlNJT05TKSkKKwl7CisJCU1pc3NpbmdSZXF1aXJlZCh0aWYsIkltYWdlTGVuZ3RoIik7CisJCWdvdG8gYmFkOworCX0KKwkvKgorCSAqIFNldHVwIGFwcHJvcHJpYXRlIHN0cnVjdHVyZXMgKGJ5IHN0cmlwIG9yIGJ5IHRpbGUpCisJICovCisJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9USUxFRElNRU5TSU9OUykpIHsKKwkJdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPSBUSUZGTnVtYmVyT2ZTdHJpcHModGlmKTsgIAorCQl0aWYtPnRpZl9kaXIudGRfdGlsZXdpZHRoID0gdGlmLT50aWZfZGlyLnRkX2ltYWdld2lkdGg7CisJCXRpZi0+dGlmX2Rpci50ZF90aWxlbGVuZ3RoID0gdGlmLT50aWZfZGlyLnRkX3Jvd3NwZXJzdHJpcDsKKwkJdGlmLT50aWZfZGlyLnRkX3RpbGVkZXB0aCA9IHRpZi0+dGlmX2Rpci50ZF9pbWFnZWRlcHRoOworCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9JU1RJTEVEOworCX0gZWxzZSB7CisJCXRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID0gVElGRk51bWJlck9mVGlsZXModGlmKTsKKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9JU1RJTEVEOworCX0KKwlpZiAoIXRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiQ2Fubm90IGhhbmRsZSB6ZXJvIG51bWJlciBvZiAlcyIsCisJCSAgICBpc1RpbGVkKHRpZikgPyAidGlsZXMiIDogInN0cmlwcyIpOworCQlnb3RvIGJhZDsKKwl9CisJdGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlID0gdGlmLT50aWZfZGlyLnRkX25zdHJpcHM7CisJaWYgKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorCQl0aWYtPnRpZl9kaXIudGRfc3RyaXBzcGVyaW1hZ2UgLz0gdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsKKwlpZiAoIVRJRkZGaWVsZFNldCh0aWYsIEZJRUxEX1NUUklQT0ZGU0VUUykpIHsKKwkJaWYgKCh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb249PUNPTVBSRVNTSU9OX09KUEVHKSAmJgorCQkgICAgKGlzVGlsZWQodGlmKT09MCkgJiYKKwkJICAgICh0aWYtPnRpZl9kaXIudGRfbnN0cmlwcz09MSkpIHsKKwkJCS8qCisJCQkgKiBYWFg6IE9KUEVHIGhhY2suCisJCQkgKiBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYikgaXQncyBub3QgYSB0aWxlZCBUSUZGLAorCQkJICogYW5kIGMpIHRoZSBudW1iZXIgb2Ygc3RyaXBzIGlzIDEsCisJCQkgKiB0aGVuIHdlIHRvbGVyYXRlIHRoZSBhYnNlbmNlIG9mIHN0cmlwb2Zmc2V0cyB0YWcsCisJCQkgKiBiZWNhdXNlLCBwcmVzdW1hYmx5LCBhbGwgcmVxdWlyZWQgZGF0YSBpcyBpbiB0aGUKKwkJCSAqIEpwZWdJbnRlcmNoYW5nZUZvcm1hdCBzdHJlYW0uCisJCQkgKi8KKwkJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1NUUklQT0ZGU0VUUyk7CisJCX0gZWxzZSB7CisJCQlNaXNzaW5nUmVxdWlyZWQodGlmLAorCQkJCWlzVGlsZWQodGlmKSA/ICJUaWxlT2Zmc2V0cyIgOiAiU3RyaXBPZmZzZXRzIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKwkvKgorCSAqIFNlY29uZCBwYXNzOiBleHRyYWN0IG90aGVyIGluZm9ybWF0aW9uLgorCSAqLworCWZvciAoZGk9MCwgZHA9ZGlyOyBkaTxkaXJjb3VudDsgZGkrKywgZHArKykKKwl7CisJCXN3aXRjaCAoZHAtPnRkaXJfdGFnKQorCQl7CisJCQljYXNlIElHTk9SRToKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlRBR19NSU5TQU1QTEVWQUxVRToKKwkJCWNhc2UgVElGRlRBR19NQVhTQU1QTEVWQUxVRToKKwkJCWNhc2UgVElGRlRBR19CSVRTUEVSU0FNUExFOgorCQkJY2FzZSBUSUZGVEFHX0RBVEFUWVBFOgorCQkJY2FzZSBUSUZGVEFHX1NBTVBMRUZPUk1BVDoKKwkJCQkvKgorCQkJCSAqIFRoZSBNaW5TYW1wbGVWYWx1ZSwgTWF4U2FtcGxlVmFsdWUsIEJpdHNQZXJTYW1wbGUKKwkJCQkgKiBEYXRhVHlwZSBhbmQgU2FtcGxlRm9ybWF0IHRhZ3MgYXJlIHN1cHBvc2VkIHRvIGJlCisJCQkJICogd3JpdHRlbiBhcyBvbmUgdmFsdWUvc2FtcGxlLCBidXQgc29tZSB2ZW5kb3JzCisJCQkJICogaW5jb3JyZWN0bHkgd3JpdGUgb25lIHZhbHVlIG9ubHkgLS0gc28gd2UgYWNjZXB0CisJCQkJICogdGhhdCBhcyB3ZWxsICh5ZWNoKS4gT3RoZXIgdmVuZG9ycyB3cml0ZSBjb3JyZWN0CisJCQkJICogdmFsdWUgZm9yIE51bWJlck9mU2FtcGxlcywgYnV0IGluY29ycmVjdCBvbmUgZm9yCisJCQkJICogQml0c1BlclNhbXBsZSBhbmQgZnJpZW5kcywgYW5kIHdlIHdpbGwgcmVhZCB0aGlzCisJCQkJICogdG9vLgorCQkJCSAqLworCQkJCXsKKwkJCQkJdWludDE2IHZhbHVlOworCQkJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNob3J0KHRpZixkcCwmdmFsdWUpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyQ291bnQpCisJCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeVBlcnNhbXBsZVNob3J0KHRpZixkcCwmdmFsdWUpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRwLT50ZGlyX3RhZyk7CisJCQkJCQlUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKHRpZixlcnIsbW9kdWxlLGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLDApOworCQkJCQkJZ290byBiYWQ7CisJCQkJCX0KKwkJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyx2YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFOgorCQkJY2FzZSBUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRToKKwkJCQl7CisKKwkJCQkJZG91YmxlICpkYXRhOworCQkJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJCQl1aW50MzIgc2F2ZWRfZmxhZ3M7CisJCQkJCWludCBtOworCQkJCQlpZiAoZHAtPnRkaXJfY291bnQgIT0gKHVpbnQ2NCl0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKQorCQkJCQkJZXJyID0gVElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCQllbHNlCisJCQkJCQllcnIgPSBUSUZGUmVhZERpckVudHJ5RG91YmxlQXJyYXkodGlmLCBkcCwgJmRhdGEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRwLT50ZGlyX3RhZyk7CisJCQkJCQlUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKHRpZixlcnIsbW9kdWxlLGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLDApOworCQkJCQkJZ290byBiYWQ7CisJCQkJCX0KKwkJCQkJc2F2ZWRfZmxhZ3MgPSB0aWYtPnRpZl9mbGFnczsKKwkJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9QRVJTQU1QTEU7CisJCQkJCW0gPSBUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhKTsKKwkJCQkJdGlmLT50aWZfZmxhZ3MgPSBzYXZlZF9mbGFnczsKKwkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZUQUdfU1RSSVBPRkZTRVRTOgorCQkJY2FzZSBUSUZGVEFHX1RJTEVPRkZTRVRTOgorI2lmIGRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGbWVtY3B5KCAmKHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldF9lbnRyeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcCwgc2l6ZW9mKFRJRkZEaXJFbnRyeSkgKTsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlpZiAoIVRJRkZGZXRjaFN0cmlwVGhpbmcodGlmLGRwLHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLCZ0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQpKSAgCisJCQkJCWdvdG8gYmFkOworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlRBR19TVFJJUEJZVEVDT1VOVFM6CisJCQljYXNlIFRJRkZUQUdfVElMRUJZVEVDT1VOVFM6CisjaWYgZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZtZW1jcHkoICYodGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50X2VudHJ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLCBzaXplb2YoVElGRkRpckVudHJ5KSApOworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCWlmICghVElGRkZldGNoU3RyaXBUaGluZyh0aWYsZHAsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsJnRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkpICAKKwkJCQkJZ290byBiYWQ7CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGVEFHX0NPTE9STUFQOgorCQkJY2FzZSBUSUZGVEFHX1RSQU5TRkVSRlVOQ1RJT046CisJCQkJeworCQkJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJCQl1aW50MzIgY291bnRwZXJzYW1wbGU7CisJCQkJCXVpbnQzMiBjb3VudHJlcXVpcmVkOworCQkJCQl1aW50MzIgaW5jcmVtZW50cGVyc2FtcGxlOworCQkJCQl1aW50MTYqIHZhbHVlPU5VTEw7CisJCQkJCWNvdW50cGVyc2FtcGxlPSgxTDw8dGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUpOworCQkJCQlpZiAoKGRwLT50ZGlyX3RhZz09VElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OKSYmKGRwLT50ZGlyX2NvdW50PT0odWludDY0KWNvdW50cGVyc2FtcGxlKSkKKwkJCQkJeworCQkJCQkJY291bnRyZXF1aXJlZD1jb3VudHBlcnNhbXBsZTsKKwkJCQkJCWluY3JlbWVudHBlcnNhbXBsZT0wOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJY291bnRyZXF1aXJlZD0zKmNvdW50cGVyc2FtcGxlOworCQkJCQkJaW5jcmVtZW50cGVyc2FtcGxlPWNvdW50cGVyc2FtcGxlOworCQkJCQl9CisJCQkJCWlmIChkcC0+dGRpcl9jb3VudCE9KHVpbnQ2NCljb3VudHJlcXVpcmVkKQorCQkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDsKKwkJCQkJZWxzZQorCQkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTaG9ydEFycmF5KHRpZixkcCwmdmFsdWUpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCWZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRwLT50ZGlyX3RhZyk7CisJCQkJCQlUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKHRpZixlcnIsbW9kdWxlLGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLDEpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJVElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsdmFsdWUsdmFsdWUraW5jcmVtZW50cGVyc2FtcGxlLHZhbHVlKzIqaW5jcmVtZW50cGVyc2FtcGxlKTsKKwkJCQkJCV9USUZGZnJlZSh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisvKiBCRUdJTiBSRVYgNC4wIENPTVBBVElCSUxJVFkgKi8KKwkJCWNhc2UgVElGRlRBR19PU1VCRklMRVRZUEU6CisJCQkJeworCQkJCQl1aW50MTYgdmFsdWVvOworCQkJCQl1aW50MzIgdmFsdWU7CisJCQkJCWlmIChUSUZGUmVhZERpckVudHJ5U2hvcnQodGlmLGRwLCZ2YWx1ZW8pPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAodmFsdWVvKQorCQkJCQkJeworCQkJCQkJCWNhc2UgT0ZJTEVUWVBFX1JFRFVDRURJTUFHRTogdmFsdWU9RklMRVRZUEVfUkVEVUNFRElNQUdFOyBicmVhazsKKwkJCQkJCQljYXNlIE9GSUxFVFlQRV9QQUdFOiB2YWx1ZT1GSUxFVFlQRV9QQUdFOyBicmVhazsKKwkJCQkJCQlkZWZhdWx0OiB2YWx1ZT0wOyBicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICh2YWx1ZSE9MCkKKwkJCQkJCQlUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfU1VCRklMRVRZUEUsdmFsdWUpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworLyogRU5EIFJFViA0LjAgQ09NUEFUSUJJTElUWSAqLworCQkJZGVmYXVsdDoKKwkJCQkodm9pZCkgVElGRkZldGNoTm9ybWFsVGFnKHRpZiwgZHAsIFRSVUUpOworCQkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogT0pQRUcgaGFjazoKKwkgKiAtIElmIGEpIGNvbXByZXNzaW9uIGlzIE9KUEVHLCBhbmQgYikgcGhvdG9tZXRyaWMgdGFnIGlzIG1pc3NpbmcsCisJICogdGhlbiB3ZSBjb25zaXN0ZW50bHkgZmluZCB0aGF0IHBob3RvbWV0cmljIHNob3VsZCBiZSBZQ2JDcgorCSAqIC0gSWYgYSkgY29tcHJlc3Npb24gaXMgT0pQRUcsIGFuZCBiKSBwaG90b21ldHJpYyB0YWcgc2F5cyBpdCdzIFJHQiwKKwkgKiB0aGVuIHdlIGNvbnNpc3RlbnRseSBmaW5kIHRoYXQgdGhlIGJ1Z2d5IGltcGxlbWVudGF0aW9uIG9mIHRoZQorCSAqIGJ1Z2d5IGNvbXByZXNzaW9uIHNjaGVtZSBtYXRjaGVzIHBob3RvbWV0cmljIFlDYkNyIGluc3RlYWQuCisJICogLSBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYW5kIGIpIGJpdHNwZXJzYW1wbGUgdGFnIGlzIG1pc3NpbmcsCisJICogdGhlbiB3ZSBjb25zaXN0ZW50bHkgZmluZCBiaXRzcGVyc2FtcGxlIHNob3VsZCBiZSA4LgorCSAqIC0gSWYgYSkgY29tcHJlc3Npb24gaXMgT0pQRUcsIGIpIHNhbXBsZXNwZXJwaXhlbCB0YWcgaXMgbWlzc2luZywKKwkgKiBhbmQgYykgcGhvdG9tZXRyaWMgaXMgUkdCIG9yIFlDYkNyLCB0aGVuIHdlIGNvbnNpc3RlbnRseSBmaW5kCisJICogc2FtcGxlc3BlcnBpeGVsIHNob3VsZCBiZSAzCisJICogLSBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYikgc2FtcGxlc3BlcnBpeGVsIHRhZyBpcyBtaXNzaW5nLAorCSAqIGFuZCBjKSBwaG90b21ldHJpYyBpcyBNSU5JU1dISVRFIG9yIE1JTklTQkxBQ0ssIHRoZW4gd2UgY29uc2lzdGVudGx5CisJICogZmluZCBzYW1wbGVzcGVycGl4ZWwgc2hvdWxkIGJlIDMKKwkgKi8KKwlpZiAodGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uPT1DT01QUkVTU0lPTl9PSlBFRykKKwl7CisJCWlmICghVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QSE9UT01FVFJJQykpCisJCXsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiUGhvdG9tZXRyaWMgdGFnIGlzIG1pc3NpbmcsIGFzc3VtaW5nIGRhdGEgaXMgWUNiQ3IiKTsKKwkJCWlmICghVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1BIT1RPTUVUUklDLFBIT1RPTUVUUklDX1lDQkNSKSkKKwkJCQlnb3RvIGJhZDsKKwkJfQorCQllbHNlIGlmICh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWM9PVBIT1RPTUVUUklDX1JHQikKKwkJeworCQkJdGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljPVBIT1RPTUVUUklDX1lDQkNSOworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJQaG90b21ldHJpYyB0YWcgdmFsdWUgYXNzdW1lZCBpbmNvcnJlY3QsICIKKwkJCSAgICAiYXNzdW1pbmcgZGF0YSBpcyBZQ2JDciBpbnN0ZWFkIG9mIFJHQiIpOworCQl9CisJCWlmICghVElGRkZpZWxkU2V0KHRpZixGSUVMRF9CSVRTUEVSU0FNUExFKSkKKwkJeworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCQkgICAgIkJpdHNQZXJTYW1wbGUgdGFnIGlzIG1pc3NpbmcsIGFzc3VtaW5nIDggYml0cyBwZXIgc2FtcGxlIik7CisJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsVElGRlRBR19CSVRTUEVSU0FNUExFLDgpKQorCQkJCWdvdG8gYmFkOworCQl9CisJCWlmICghVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TQU1QTEVTUEVSUElYRUwpKQorCQl7CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljPT1QSE9UT01FVFJJQ19SR0IpCisJCQl7CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCQkJICAgICJTYW1wbGVzUGVyUGl4ZWwgdGFnIGlzIG1pc3NpbmcsICIKKwkJCQkgICAgImFzc3VtaW5nIGNvcnJlY3QgU2FtcGxlc1BlclBpeGVsIHZhbHVlIGlzIDMiKTsKKwkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsVElGRlRBR19TQU1QTEVTUEVSUElYRUwsMykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfWUNCQ1IpCisJCQl7CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCQkJICAgICJTYW1wbGVzUGVyUGl4ZWwgdGFnIGlzIG1pc3NpbmcsICIKKwkJCQkgICAgImFwcGx5aW5nIGNvcnJlY3QgU2FtcGxlc1BlclBpeGVsIHZhbHVlIG9mIDMiKTsKKwkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsVElGRlRBR19TQU1QTEVTUEVSUElYRUwsMykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJZWxzZSBpZiAoKHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfTUlOSVNXSElURSkKKwkJCQkgfHwgKHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfTUlOSVNCTEFDSykpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBTYW1wbGVzUGVyUGl4ZWwgdGFnIGlzIG1pc3NpbmcsIGJ1dCBpcyBub3QgcmVxdWlyZWQKKwkJCQkgKiBieSBzcGVjLiAgQXNzdW1lIGNvcnJlY3QgU2FtcGxlc1BlclBpeGVsIHZhbHVlIG9mIDEuCisJCQkJICovCisJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLDEpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIFZlcmlmeSBQYWxldHRlIGltYWdlIGhhcyBhIENvbG9ybWFwLgorCSAqLworCWlmICh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfUEFMRVRURSAmJgorCSAgICAhVElGRkZpZWxkU2V0KHRpZiwgRklFTERfQ09MT1JNQVApKSB7CisJCWlmICggdGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU+PTggJiYgdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbD09MykKKwkJCXRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYyA9IFBIT1RPTUVUUklDX1JHQjsKKwkJZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU+PTgpCisJCQl0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOworCQllbHNlIHsKKwkJCU1pc3NpbmdSZXF1aXJlZCh0aWYsICJDb2xvcm1hcCIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisJLyoKKwkgKiBPSlBFRyBoYWNrOgorCSAqIFdlIGRvIG5vIGZ1cnRoZXIgbWVzc2luZyB3aXRoIHN0cmlwL3RpbGUgb2Zmc2V0cy9ieXRlY291bnRzIGluIE9KUEVHCisJICogVElGRnMKKwkgKi8KKwlpZiAodGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uIT1DT01QUkVTU0lPTl9PSlBFRykKKwl7CisJCS8qCisJCSAqIEF0dGVtcHQgdG8gZGVhbCB3aXRoIGEgbWlzc2luZyBTdHJpcEJ5dGVDb3VudHMgdGFnLgorCQkgKi8KKwkJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9TVFJJUEJZVEVDT1VOVFMpKSB7CisJCQkvKgorCQkJICogU29tZSBtYW51ZmFjdHVyZXJzIHZpb2xhdGUgdGhlIHNwZWMgYnkgbm90IGdpdmluZworCQkJICogdGhlIHNpemUgb2YgdGhlIHN0cmlwcy4gIEluIHRoaXMgY2FzZSwgYXNzdW1lIHRoZXJlCisJCQkgKiBpcyBvbmUgdW5jb21wcmVzc2VkIHN0cmlwIG9mIGRhdGEuCisJCQkgKi8KKwkJCWlmICgodGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHICYmCisJCQkgICAgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPiAxKSB8fAorCQkJICAgICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSAmJgorCQkJICAgICB0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyAhPSAodWludDMyKXRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwpKSB7CisJCQkgICAgTWlzc2luZ1JlcXVpcmVkKHRpZiwgIlN0cmlwQnl0ZUNvdW50cyIpOworCQkJICAgIGdvdG8gYmFkOworCQkJfQorCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSJUSUZGIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHJlcXVpcmVkICIKKwkJCQkiXCJTdHJpcEJ5dGVDb3VudHNcIiBmaWVsZCwgY2FsY3VsYXRpbmcgZnJvbSBpbWFnZWxlbmd0aCIpOworCQkJaWYgKEVzdGltYXRlU3RyaXBCeXRlQ291bnRzKHRpZiwgZGlyLCBkaXJjb3VudCkgPCAwKQorCQkJICAgIGdvdG8gYmFkOworCQkvKgorCQkgKiBBc3N1bWUgd2UgaGF2ZSB3cm9uZyBTdHJpcEJ5dGVDb3VudCB2YWx1ZSAoaW4gY2FzZQorCQkgKiBvZiBzaW5nbGUgc3RyaXApIGluIGZvbGxvd2luZyBjYXNlczoKKwkJICogICAtIGl0IGlzIGVxdWFsIHRvIHplcm8gYWxvbmcgd2l0aCBTdHJpcE9mZnNldDsKKwkJICogICAtIGl0IGlzIGxhcmdlciB0aGFuIGZpbGUgaXRzZWxmIChpbiBjYXNlIG9mIHVuY29tcHJlc3NlZAorCQkgKiAgICAgaW1hZ2UpOworCQkgKiAgIC0gaXQgaXMgc21hbGxlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBieXRlcyBwZXIgcm93CisJCSAqICAgICBtdWx0aXBsaWVkIG9uIHRoZSBudW1iZXIgb2Ygcm93cy4gIFRoZSBsYXN0IGNhc2Ugc2hvdWxkCisJCSAqICAgICBub3QgYmUgY2hlY2tlZCBpbiB0aGUgY2FzZSBvZiB3cml0aW5nIG5ldyBpbWFnZSwKKwkJICogICAgIGJlY2F1c2Ugd2UgbWF5IGRvIG5vdCBrbm93IHRoZSBleGFjdCBzdHJpcCBzaXplCisJCSAqICAgICB1bnRpbCB0aGUgd2hvbGUgaW1hZ2Ugd2lsbCBiZSB3cml0dGVuIGFuZCBkaXJlY3RvcnkKKwkJICogICAgIGR1bXBlZCBvdXQuCisJCSAqLworCQkjZGVmaW5lCUJZVEVDT1VOVExPT0tTQkFEIFwKKwkJICAgICggKHRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudFswXSA9PSAwICYmIHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldFswXSAhPSAwKSB8fCBcCisJCSAgICAgICh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fTk9ORSAmJiBcCisJCSAgICAgICB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF0gPiBUSUZGR2V0RmlsZVNpemUodGlmKSAtIHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldFswXSkgfHwgXAorCQkgICAgICAodGlmLT50aWZfbW9kZSA9PSBPX1JET05MWSAmJiBcCisJCSAgICAgICB0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fTk9ORSAmJiBcCisJCSAgICAgICB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF0gPCBUSUZGU2NhbmxpbmVTaXplNjQodGlmKSAqIHRpZi0+dGlmX2Rpci50ZF9pbWFnZWxlbmd0aCkgKQorCisJCX0gZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1RJRkZGaWxsU3RyaWxlcyh0aWYpCisJCQkgICAmJiB0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbMF0gIT0gMAorCQkJICAgJiYgQllURUNPVU5UTE9PS1NCQUQpIHsKKwkJCS8qCisJCQkgKiBYWFg6IFBsZXh1cyAoYW5kIG90aGVycykgc29tZXRpbWVzIGdpdmUgYSB2YWx1ZSBvZgorCQkJICogemVybyBmb3IgYSB0YWcgd2hlbiB0aGV5IGRvbid0IGtub3cgd2hhdCB0aGUKKwkJCSAqIGNvcnJlY3QgdmFsdWUgaXMhICBUcnkgYW5kIGhhbmRsZSB0aGUgc2ltcGxlIGNhc2UKKwkJCSAqIG9mIGVzdGltYXRpbmcgdGhlIHNpemUgb2YgYSBvbmUgc3RyaXAgaW1hZ2UuCisJCQkgKi8KKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQm9ndXMgXCJTdHJpcEJ5dGVDb3VudHNcIiBmaWVsZCwgaWdub3JpbmcgYW5kIGNhbGN1bGF0aW5nIGZyb20gaW1hZ2VsZW5ndGgiKTsKKwkJCWlmKEVzdGltYXRlU3RyaXBCeXRlQ291bnRzKHRpZiwgZGlyLCBkaXJjb3VudCkgPCAwKQorCQkJICAgIGdvdG8gYmFkOworCisjaWYgIWRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpCisJCX0gZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHCisJCQkgICAmJiB0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyA+IDIKKwkJCSAgICYmIHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9OT05FCisJCQkgICAmJiB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF0gIT0gdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzFdCisJCQkgICAmJiB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF0gIT0gMAorCQkJICAgJiYgdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzFdICE9IDAgKSB7CisJCQkvKgorCQkJICogWFhYOiBTb21lIHZlbmRvcnMgZmlsbCBTdHJpcEJ5dGVDb3VudCBhcnJheSB3aXRoCisJCQkgKiBhYnNvbHV0ZWx5IHdyb25nIHZhbHVlcyAoaXQgY2FuIGJlIGVxdWFsIHRvCisJCQkgKiBTdHJpcE9mZnNldCBhcnJheSwgZm9yIGV4YW1wbGUpLiBDYXRjaCB0aGlzIGNhc2UKKwkJCSAqIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICogV2UgYXZvaWQgdGhpcyBjaGVjayBpZiBkZWZlcnJpbmcgc3RyaWxlIGxvYWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzIGl0IHdvdWxkIGFsd2F5cyBmb3JjZSB1cyB0byBsb2FkIHRoZSBzdHJpcC90aWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGlvbi4KKwkJCSAqLworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJXcm9uZyBcIlN0cmlwQnl0ZUNvdW50c1wiIGZpZWxkLCBpZ25vcmluZyBhbmQgY2FsY3VsYXRpbmcgZnJvbSBpbWFnZWxlbmd0aCIpOworCQkJaWYgKEVzdGltYXRlU3RyaXBCeXRlQ291bnRzKHRpZiwgZGlyLCBkaXJjb3VudCkgPCAwKQorCQkJICAgIGdvdG8gYmFkOworI2VuZGlmIC8qICFkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKSAqLyAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJfQorCWlmIChkaXIpCisJeworCQlfVElGRmZyZWUoZGlyKTsKKwkJZGlyPU5VTEw7CisJfQorCWlmICghVElGRkZpZWxkU2V0KHRpZiwgRklFTERfTUFYU0FNUExFVkFMVUUpKQorCXsKKwkJaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPj0xNikKKwkJCXRpZi0+dGlmX2Rpci50ZF9tYXhzYW1wbGV2YWx1ZT0weEZGRkY7CisJCWVsc2UKKwkJCXRpZi0+dGlmX2Rpci50ZF9tYXhzYW1wbGV2YWx1ZSA9ICh1aW50MTYpKCgxTDw8dGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUpLTEpOworCX0KKwkvKgorCSAqIFhYWDogV2UgY2FuIG9wdGltaXplIGNoZWNraW5nIGZvciB0aGUgc3RyaXAgYm91bmRzIHVzaW5nIHRoZSBzb3J0ZWQKKwkgKiBieXRlY291bnRzIGFycmF5LiBTZWUgYWxzbyBjb21tZW50cyBmb3IgVElGRkFwcGVuZFRvU3RyaXAoKQorCSAqIGZ1bmN0aW9uIGluIHRpZl93cml0ZS5jLgorCSAqLworI2lmICFkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKSAgICAgICAgCisJaWYgKHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID4gMSkgeworCQl1aW50MzIgc3RyaXA7CisKKwkJdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50c29ydGVkID0gMTsKKwkJZm9yIChzdHJpcCA9IDE7IHN0cmlwIDwgdGlmLT50aWZfZGlyLnRkX25zdHJpcHM7IHN0cmlwKyspIHsKKwkJCWlmICh0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbc3RyaXAgLSAxXSA+CisJCQkgICAgdGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSkgeworCQkJCXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudHNvcnRlZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogIWRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpICovCisgICAgICAgIAorCS8qCisJICogQW4gb3Bwb3J0dW5pdHkgZm9yIGNvbXByZXNzaW9uIG1vZGUgZGVwZW5kZW50IHRhZyBmaXh1cAorCSAqLworCSgqdGlmLT50aWZfZml4dXB0YWdzKSh0aWYpOworCisJLyoKKwkgKiBTb21lIG1hbnVmYWN0dXJlcnMgbWFrZSBsaWZlIGRpZmZpY3VsdCBieSB3cml0aW5nCisJICogbGFyZ2UgYW1vdW50cyBvZiB1bmNvbXByZXNzZWQgZGF0YSBhcyBhIHNpbmdsZSBzdHJpcC4KKwkgKiBUaGlzIGlzIGNvbnRyYXJ5IHRvIHRoZSByZWNvbW1lbmRhdGlvbnMgb2YgdGhlIHNwZWMuCisJICogVGhlIGZvbGxvd2luZyBtYWtlcyBhbiBhdHRlbXB0IGF0IGJyZWFraW5nIHN1Y2ggaW1hZ2VzCisJICogaW50byBzdHJpcHMgY2xvc2VyIHRvIHRoZSByZWNvbW1lbmRlZCA4ayBieXRlcy4gIEEKKwkgKiBzaWRlIGVmZmVjdCwgaG93ZXZlciwgaXMgdGhhdCB0aGUgUm93c1BlclN0cmlwIHRhZworCSAqIHZhbHVlIG1heSBiZSBjaGFuZ2VkLgorCSAqLworCWlmICgodGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZz09UExBTkFSQ09ORklHX0NPTlRJRykmJgorCSAgICAodGlmLT50aWZfZGlyLnRkX25zdHJpcHM9PTEpJiYKKwkgICAgKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbj09Q09NUFJFU1NJT05fTk9ORSkmJiAgCisJICAgICgodGlmLT50aWZfZmxhZ3MmKFRJRkZfU1RSSVBDSE9QfFRJRkZfSVNUSUxFRCkpPT1USUZGX1NUUklQQ0hPUCkpCisgICAgeworICAgICAgICBpZiAoICFfVElGRkZpbGxTdHJpbGVzKHRpZikgfHwgIXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCApCisgICAgICAgICAgICByZXR1cm4gMDsKKwkJQ2hvcFVwU2luZ2xlVW5jb21wcmVzc2VkU3RyaXAodGlmKTsKKyAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgdGhlIGRpcnR5IGRpcmVjdG9yeSBmbGFnLiAKKyAgICAgICAgICovCisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfRElSVFlESVJFQ1Q7CisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfRElSVFlTVFJJUDsKKworCS8qCisJICogUmVpbml0aWFsaXplIGkvbyBzaW5jZSB3ZSBhcmUgc3RhcnRpbmcgb24gYSBuZXcgZGlyZWN0b3J5LgorCSAqLworCXRpZi0+dGlmX3JvdyA9ICh1aW50MzIpIC0xOworCXRpZi0+dGlmX2N1cnN0cmlwID0gKHVpbnQzMikgLTE7CisJdGlmLT50aWZfY29sID0gKHVpbnQzMikgLTE7CisJdGlmLT50aWZfY3VydGlsZSA9ICh1aW50MzIpIC0xOworCXRpZi0+dGlmX3RpbGVzaXplID0gKHRtc2l6ZV90KSAtMTsKKworCXRpZi0+dGlmX3NjYW5saW5lc2l6ZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwlpZiAoIXRpZi0+dGlmX3NjYW5saW5lc2l6ZSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIkNhbm5vdCBoYW5kbGUgemVybyBzY2FubGluZSBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGlzVGlsZWQodGlmKSkgeworCQl0aWYtPnRpZl90aWxlc2l6ZSA9IFRJRkZUaWxlU2l6ZSh0aWYpOworCQlpZiAoIXRpZi0+dGlmX3RpbGVzaXplKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiQ2Fubm90IGhhbmRsZSB6ZXJvIHRpbGUgc2l6ZSIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghVElGRlN0cmlwU2l6ZSh0aWYpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJDYW5ub3QgaGFuZGxlIHplcm8gc3RyaXAgc2l6ZSIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKwlyZXR1cm4gKDEpOworYmFkOgorCWlmIChkaXIpCisJCV9USUZGZnJlZShkaXIpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitUSUZGUmVhZERpcmVjdG9yeUNoZWNrT3JkZXIoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IGRpcmNvdW50KQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZWFkRGlyZWN0b3J5Q2hlY2tPcmRlciI7CisJdWludDE2IG07CisJdWludDE2IG47CisJVElGRkRpckVudHJ5KiBvOworCW09MDsKKwlmb3IgKG49MCwgbz1kaXI7IG48ZGlyY291bnQ7IG4rKywgbysrKQorCXsKKwkJaWYgKG8tPnRkaXJfdGFnPG0pCisJCXsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJICAgICJJbnZhbGlkIFRJRkYgZGlyZWN0b3J5OyB0YWdzIGFyZSBub3Qgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciIpOworCQkJYnJlYWs7CisJCX0KKwkJbT1vLT50ZGlyX3RhZysxOworCX0KK30KKworc3RhdGljIFRJRkZEaXJFbnRyeSoKK1RJRkZSZWFkRGlyZWN0b3J5RmluZEVudHJ5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiBkaXJjb3VudCwgdWludDE2IHRhZ2lkKQoreworCVRJRkZEaXJFbnRyeSogbTsKKwl1aW50MTYgbjsKKwkodm9pZCkgdGlmOworCWZvciAobT1kaXIsIG49MDsgbjxkaXJjb3VudDsgbSsrLCBuKyspCisJeworCQlpZiAobS0+dGRpcl90YWc9PXRhZ2lkKQorCQkJcmV0dXJuKG0pOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkCitUSUZGUmVhZERpcmVjdG9yeUZpbmRGaWVsZEluZm8oVElGRiogdGlmLCB1aW50MTYgdGFnaWQsIHVpbnQzMiogZmlpKQoreworCWludDMyIG1hLG1iLG1jOworCW1hPS0xOworCW1jPShpbnQzMil0aWYtPnRpZl9uZmllbGRzOworCXdoaWxlICgxKQorCXsKKwkJaWYgKG1hKzE9PW1jKQorCQl7CisJCQkqZmlpID0gRkFJTEVEX0ZJSTsKKwkJCXJldHVybjsKKwkJfQorCQltYj0obWErbWMpLzI7CisJCWlmICh0aWYtPnRpZl9maWVsZHNbbWJdLT5maWVsZF90YWc9PSh1aW50MzIpdGFnaWQpCisJCQlicmVhazsKKwkJaWYgKHRpZi0+dGlmX2ZpZWxkc1ttYl0tPmZpZWxkX3RhZzwodWludDMyKXRhZ2lkKQorCQkJbWE9bWI7CisJCWVsc2UKKwkJCW1jPW1iOworCX0KKwl3aGlsZSAoMSkKKwl7CisJCWlmIChtYj09MCkKKwkJCWJyZWFrOworCQlpZiAodGlmLT50aWZfZmllbGRzW21iLTFdLT5maWVsZF90YWchPSh1aW50MzIpdGFnaWQpCisJCQlicmVhazsKKwkJbWItLTsKKwl9CisJKmZpaT1tYjsKK30KKworLyoKKyAqIFJlYWQgY3VzdG9tIGRpcmVjdG9yeSBmcm9tIHRoZSBhcmJpdGFycnkgb2Zmc2V0LgorICogVGhlIGNvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIFRJRkZSZWFkRGlyZWN0b3J5KCkuCisgKi8KK2ludAorVElGRlJlYWRDdXN0b21EaXJlY3RvcnkoVElGRiogdGlmLCB0b2ZmX3QgZGlyb2ZmLAorCQkJY29uc3QgVElGRkZpZWxkQXJyYXkqIGluZm9hcnJheSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmVhZEN1c3RvbURpcmVjdG9yeSI7CisJVElGRkRpckVudHJ5KiBkaXI7CisJdWludDE2IGRpcmNvdW50OworCVRJRkZEaXJFbnRyeSogZHA7CisJdWludDE2IGRpOworCWNvbnN0IFRJRkZGaWVsZCogZmlwOworCXVpbnQzMiBmaWk7CisJX1RJRkZTZXR1cEZpZWxkcyh0aWYsIGluZm9hcnJheSk7CisJZGlyY291bnQ9VElGRkZldGNoRGlyZWN0b3J5KHRpZixkaXJvZmYsJmRpcixOVUxMKTsKKwlpZiAoIWRpcmNvdW50KQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkgICAgIkZhaWxlZCB0byByZWFkIGN1c3RvbSBkaXJlY3RvcnkgYXQgb2Zmc2V0ICIgVElGRl9VSU5UNjRfRk9STUFULGRpcm9mZik7CisJCXJldHVybiAwOworCX0KKwlUSUZGRnJlZURpcmVjdG9yeSh0aWYpOworCV9USUZGbWVtc2V0KCZ0aWYtPnRpZl9kaXIsIDAsIHNpemVvZihUSUZGRGlyZWN0b3J5KSk7CisJVElGRlJlYWREaXJlY3RvcnlDaGVja09yZGVyKHRpZixkaXIsZGlyY291bnQpOworCWZvciAoZGk9MCwgZHA9ZGlyOyBkaTxkaXJjb3VudDsgZGkrKywgZHArKykKKwl7CisJCVRJRkZSZWFkRGlyZWN0b3J5RmluZEZpZWxkSW5mbyh0aWYsZHAtPnRkaXJfdGFnLCZmaWkpOworCQlpZiAoZmlpID09IEZBSUxFRF9GSUkpCisJCXsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiVW5rbm93biBmaWVsZCB3aXRoIHRhZyAlZCAoMHgleCkgZW5jb3VudGVyZWQiLAorCQkJICAgIGRwLT50ZGlyX3RhZywgZHAtPnRkaXJfdGFnKTsKKwkJCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIF9USUZGQ3JlYXRlQW5vbkZpZWxkKHRpZiwKKwkJCQkJCWRwLT50ZGlyX3RhZywKKwkJCQkJCShUSUZGRGF0YVR5cGUpIGRwLT50ZGlyX3R5cGUpLAorCQkJCQkgICAgIDEpKSB7CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiUmVnaXN0ZXJpbmcgYW5vbnltb3VzIGZpZWxkIHdpdGggdGFnICVkICgweCV4KSBmYWlsZWQiLAorCQkJCSAgICBkcC0+dGRpcl90YWcsIGRwLT50ZGlyX3RhZyk7CisJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCX0gZWxzZSB7CisJCQkJVElGRlJlYWREaXJlY3RvcnlGaW5kRmllbGRJbmZvKHRpZixkcC0+dGRpcl90YWcsJmZpaSk7CisJCQkJYXNzZXJ0KCBmaWkgIT0gRkFJTEVEX0ZJSSApOworCQkJfQorCQl9CisJCWlmIChkcC0+dGRpcl90YWchPUlHTk9SRSkKKwkJeworCQkJZmlwPXRpZi0+dGlmX2ZpZWxkc1tmaWldOworCQkJaWYgKGZpcC0+ZmllbGRfYml0PT1GSUVMRF9JR05PUkUpCisJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBjaGVjayBkYXRhIHR5cGUgKi8KKwkJCQl3aGlsZSAoKGZpcC0+ZmllbGRfdHlwZSE9VElGRl9BTlkpJiYoZmlwLT5maWVsZF90eXBlIT1kcC0+dGRpcl90eXBlKSkKKwkJCQl7CisJCQkJCWZpaSsrOworCQkJCQlpZiAoKGZpaT09dGlmLT50aWZfbmZpZWxkcyl8fAorCQkJCQkgICAgKHRpZi0+dGlmX2ZpZWxkc1tmaWldLT5maWVsZF90YWchPSh1aW50MzIpZHAtPnRkaXJfdGFnKSkKKwkJCQkJeworCQkJCQkJZmlpPTB4RkZGRjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWZpcD10aWYtPnRpZl9maWVsZHNbZmlpXTsKKwkJCQl9CisJCQkJaWYgKGZpaT09MHhGRkZGKQorCQkJCXsKKwkJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgIldyb25nIGRhdGEgdHlwZSAlZCBmb3IgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICBkcC0+dGRpcl90eXBlLGZpcC0+ZmllbGRfbmFtZSk7CisJCQkJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIGNoZWNrIGNvdW50IGlmIGtub3duIGluIGFkdmFuY2UgKi8KKwkJCQkJaWYgKChmaXAtPmZpZWxkX3JlYWRjb3VudCE9VElGRl9WQVJJQUJMRSkmJgorCQkJCQkgICAgKGZpcC0+ZmllbGRfcmVhZGNvdW50IT1USUZGX1ZBUklBQkxFMikpCisJCQkJCXsKKwkJCQkJCXVpbnQzMiBleHBlY3RlZDsKKwkJCQkJCWlmIChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9TUFApCisJCQkJCQkJZXhwZWN0ZWQ9KHVpbnQzMil0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOworCQkJCQkJZWxzZQorCQkJCQkJCWV4cGVjdGVkPSh1aW50MzIpZmlwLT5maWVsZF9yZWFkY291bnQ7CisJCQkJCQlpZiAoIUNoZWNrRGlyQ291bnQodGlmLGRwLGV4cGVjdGVkKSkKKwkJCQkJCQlkcC0+dGRpcl90YWc9SUdOT1JFOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3dpdGNoIChkcC0+dGRpcl90YWcpCisJCQl7CisJCQkJY2FzZSBJR05PUkU6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRVhJRlRBR19TVUJKRUNURElTVEFOQ0U6CisJCQkJCSh2b2lkKSBUSUZGRmV0Y2hTdWJqZWN0RGlzdGFuY2UodGlmLGRwKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJKHZvaWQpIFRJRkZGZXRjaE5vcm1hbFRhZyh0aWYsIGRwLCBUUlVFKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKGRpcikKKwkJX1RJRkZmcmVlKGRpcik7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFWElGIGlzIGltcG9ydGFudCBzcGVjaWFsIGNhc2Ugb2YgY3VzdG9tIElGRCwgc28gd2UgaGF2ZSBhIHNwZWNpYWwKKyAqIGZ1bmN0aW9uIHRvIHJlYWQgaXQuCisgKi8KK2ludAorVElGRlJlYWRFWElGRGlyZWN0b3J5KFRJRkYqIHRpZiwgdG9mZl90IGRpcm9mZikKK3sKKwljb25zdCBUSUZGRmllbGRBcnJheSogZXhpZkZpZWxkQXJyYXk7CisJZXhpZkZpZWxkQXJyYXkgPSBfVElGRkdldEV4aWZGaWVsZHMoKTsKKwlyZXR1cm4gVElGRlJlYWRDdXN0b21EaXJlY3RvcnkodGlmLCBkaXJvZmYsIGV4aWZGaWVsZEFycmF5KTsgIAorfQorCitzdGF0aWMgaW50CitFc3RpbWF0ZVN0cmlwQnl0ZUNvdW50cyhUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgZGlyY291bnQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiRXN0aW1hdGVTdHJpcEJ5dGVDb3VudHMiOworCisJVElGRkRpckVudHJ5ICpkcDsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIHN0cmlwOworCisgICAgX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisKKwlpZiAodGQtPnRkX3N0cmlwYnl0ZWNvdW50KQorCQlfVElGRmZyZWUodGQtPnRkX3N0cmlwYnl0ZWNvdW50KTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnQgPSAodWludDY0KikKKwkgICAgX1RJRkZDaGVja01hbGxvYyh0aWYsIHRkLT50ZF9uc3RyaXBzLCBzaXplb2YgKHVpbnQ2NCksCisJCSJmb3IgXCJTdHJpcEJ5dGVDb3VudHNcIiBhcnJheSIpOworICAgICAgICBpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50ID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisJaWYgKHRkLT50ZF9jb21wcmVzc2lvbiAhPSBDT01QUkVTU0lPTl9OT05FKSB7CisJCXVpbnQ2NCBzcGFjZTsKKwkJdWludDY0IGZpbGVzaXplOworCQl1aW50MTYgbjsKKwkJZmlsZXNpemUgPSBUSUZGR2V0RmlsZVNpemUodGlmKTsKKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCXNwYWNlPXNpemVvZihUSUZGSGVhZGVyQ2xhc3NpYykrMitkaXJjb3VudCoxMis0OworCQllbHNlCisJCQlzcGFjZT1zaXplb2YoVElGRkhlYWRlckJpZykrOCtkaXJjb3VudCoyMCs4OworCQkvKiBjYWxjdWxhdGUgYW1vdW50IG9mIHNwYWNlIHVzZWQgYnkgaW5kaXJlY3QgdmFsdWVzICovCisJCWZvciAoZHAgPSBkaXIsIG4gPSBkaXJjb3VudDsgbiA+IDA7IG4tLSwgZHArKykKKwkJeworCQkJdWludDMyIHR5cGV3aWR0aCA9IFRJRkZEYXRhV2lkdGgoKFRJRkZEYXRhVHlwZSkgZHAtPnRkaXJfdHlwZSk7CisJCQl1aW50NjQgZGF0YXNpemU7CisJCQl0eXBld2lkdGggPSBUSUZGRGF0YVdpZHRoKChUSUZGRGF0YVR5cGUpIGRwLT50ZGlyX3R5cGUpOworCQkJaWYgKHR5cGV3aWR0aCA9PSAwKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIkNhbm5vdCBkZXRlcm1pbmUgc2l6ZSBvZiB1bmtub3duIHRhZyB0eXBlICVkIiwKKwkJCQkgICAgZHAtPnRkaXJfdHlwZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZGF0YXNpemU9KHVpbnQ2NCl0eXBld2lkdGgqZHAtPnRkaXJfY291bnQ7CisJCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQkJeworCQkJCWlmIChkYXRhc2l6ZTw9NCkKKwkJCQkJZGF0YXNpemU9MDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoZGF0YXNpemU8PTgpCisJCQkJCWRhdGFzaXplPTA7CisJCQl9CisJCQlzcGFjZSs9ZGF0YXNpemU7CisJCX0KKwkJc3BhY2UgPSBmaWxlc2l6ZSAtIHNwYWNlOworCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpCisJCQlzcGFjZSAvPSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOworCQlmb3IgKHN0cmlwID0gMDsgc3RyaXAgPCB0ZC0+dGRfbnN0cmlwczsgc3RyaXArKykKKwkJCXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gPSBzcGFjZTsKKwkJLyoKKwkJICogVGhpcyBncm9zcyBoYWNrIGhhbmRsZXMgdGhlIGNhc2Ugd2VyZSB0aGUgb2Zmc2V0IHRvCisJCSAqIHRoZSBsYXN0IHN0cmlwIGlzIHBhc3QgdGhlIHBsYWNlIHdoZXJlIHdlIHRoaW5rIHRoZSBzdHJpcAorCQkgKiBzaG91bGQgYmVnaW4uICBTaW5jZSBhIHN0cmlwIG9mIGRhdGEgbXVzdCBiZSBjb250aWd1b3VzLAorCQkgKiBpdCdzIHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UndmUgb3ZlcmVzdGltYXRlZCB0aGUgYW1vdW50CisJCSAqIG9mIGRhdGEgaW4gdGhlIHN0cmlwIGFuZCB0cmltIHRoaXMgbnVtYmVyIGJhY2sgYWNjb3JkaW5nbHkuCisJCSAqLworCQlzdHJpcC0tOworCQlpZiAodGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSt0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdID4gZmlsZXNpemUpCisJCQl0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdID0gZmlsZXNpemUgLSB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdOworCX0gZWxzZSBpZiAoaXNUaWxlZCh0aWYpKSB7CisJCXVpbnQ2NCBieXRlc3BlcnRpbGUgPSBUSUZGVGlsZVNpemU2NCh0aWYpOworCisJCWZvciAoc3RyaXAgPSAwOyBzdHJpcCA8IHRkLT50ZF9uc3RyaXBzOyBzdHJpcCsrKQorCQkgICAgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IGJ5dGVzcGVydGlsZTsKKwl9IGVsc2UgeworCQl1aW50NjQgcm93Ynl0ZXMgPSBUSUZGU2NhbmxpbmVTaXplNjQodGlmKTsKKwkJdWludDMyIHJvd3NwZXJzdHJpcCA9IHRkLT50ZF9pbWFnZWxlbmd0aC90ZC0+dGRfc3RyaXBzcGVyaW1hZ2U7CisJCWZvciAoc3RyaXAgPSAwOyBzdHJpcCA8IHRkLT50ZF9uc3RyaXBzOyBzdHJpcCsrKQorCQkJdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IHJvd2J5dGVzICogcm93c3BlcnN0cmlwOworCX0KKwlUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9TVFJJUEJZVEVDT1VOVFMpOworCWlmICghVElGRkZpZWxkU2V0KHRpZiwgRklFTERfUk9XU1BFUlNUUklQKSkKKwkJdGQtPnRkX3Jvd3NwZXJzdHJpcCA9IHRkLT50ZF9pbWFnZWxlbmd0aDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK01pc3NpbmdSZXF1aXJlZChUSUZGKiB0aWYsIGNvbnN0IGNoYXIqIHRhZ25hbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTWlzc2luZ1JlcXVpcmVkIjsKKworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJICAgICJUSUZGIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHJlcXVpcmVkIFwiJXNcIiBmaWVsZCIsCisJICAgIHRhZ25hbWUpOworfQorCisvKgorICogQ2hlY2sgdGhlIGRpcmVjdG9yeSBvZmZzZXQgYWdhaW5zdCB0aGUgbGlzdCBvZiBhbHJlYWR5IHNlZW4gZGlyZWN0b3J5CisgKiBvZmZzZXRzLiBUaGlzIGlzIGEgdHJpY2sgdG8gcHJldmVudCBJRkQgbG9vcGluZy4gVGhlIG9uZSBjYW4gY3JlYXRlIFRJRkYKKyAqIGZpbGUgd2l0aCBsb29wZWQgZGlyZWN0b3J5IHBvaW50ZXJzLiBXZSB3aWxsIG1haW50YWluIGEgbGlzdCBvZiBhbHJlYWR5CisgKiBzZWVuIGRpcmVjdG9yaWVzIGFuZCBjaGVjayBldmVyeSBJRkQgb2Zmc2V0IGFnYWluc3QgdGhhdCBsaXN0LgorICovCitzdGF0aWMgaW50CitUSUZGQ2hlY2tEaXJPZmZzZXQoVElGRiogdGlmLCB1aW50NjQgZGlyb2ZmKQoreworCXVpbnQxNiBuOworCisJaWYgKGRpcm9mZiA9PSAwKQkJCS8qIG5vIG1vcmUgZGlyZWN0b3JpZXMgKi8KKwkJcmV0dXJuIDA7CisKKwlmb3IgKG4gPSAwOyBuIDwgdGlmLT50aWZfZGlybnVtYmVyICYmIHRpZi0+dGlmX2Rpcmxpc3Q7IG4rKykgeworCQlpZiAodGlmLT50aWZfZGlybGlzdFtuXSA9PSBkaXJvZmYpCisJCQlyZXR1cm4gMDsKKwl9CisKKwl0aWYtPnRpZl9kaXJudW1iZXIrKzsKKworCWlmICh0aWYtPnRpZl9kaXJudW1iZXIgPiB0aWYtPnRpZl9kaXJsaXN0c2l6ZSkgeworCQl1aW50NjQqIG5ld19kaXJsaXN0OworCisJCS8qCisJCSAqIFhYWDogUmVkdWNlIG1lbW9yeSBhbGxvY2F0aW9uIGdyYW51bGFyaXR5IG9mIHRoZSBkaXJsaXN0CisJCSAqIGFycmF5LgorCQkgKi8KKwkJbmV3X2Rpcmxpc3QgPSAodWludDY0KilfVElGRkNoZWNrUmVhbGxvYyh0aWYsIHRpZi0+dGlmX2Rpcmxpc3QsCisJCSAgICB0aWYtPnRpZl9kaXJudW1iZXIsIDIgKiBzaXplb2YodWludDY0KSwgImZvciBJRkQgbGlzdCIpOworCQlpZiAoIW5ld19kaXJsaXN0KQorCQkJcmV0dXJuIDA7CisJCXRpZi0+dGlmX2Rpcmxpc3RzaXplID0gMiAqIHRpZi0+dGlmX2Rpcm51bWJlcjsKKwkJdGlmLT50aWZfZGlybGlzdCA9IG5ld19kaXJsaXN0OworCX0KKworCXRpZi0+dGlmX2Rpcmxpc3RbdGlmLT50aWZfZGlybnVtYmVyIC0gMV0gPSBkaXJvZmY7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrIHRoZSBjb3VudCBmaWVsZCBvZiBhIGRpcmVjdG9yeSBlbnRyeSBhZ2FpbnN0IGEga25vd24gdmFsdWUuICBUaGUKKyAqIGNhbGxlciBpcyBleHBlY3RlZCB0byBza2lwL2lnbm9yZSB0aGUgdGFnIGlmIHRoZXJlIGlzIGEgbWlzbWF0Y2guCisgKi8KK3N0YXRpYyBpbnQKK0NoZWNrRGlyQ291bnQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDMyIGNvdW50KQoreworCWlmICgodWludDY0KWNvdW50ID4gZGlyLT50ZGlyX2NvdW50KSB7CisJCWNvbnN0IFRJRkZGaWVsZCogZmlwID0gVElGRkZpZWxkV2l0aFRhZyh0aWYsIGRpci0+dGRpcl90YWcpOworCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCSJpbmNvcnJlY3QgY291bnQgZm9yIGZpZWxkIFwiJXNcIiAoIiBUSUZGX1VJTlQ2NF9GT1JNQVQgIiwgZXhwZWN0aW5nICV1KTsgdGFnIGlnbm9yZWQiLAorCQkgICAgZmlwID8gZmlwLT5maWVsZF9uYW1lIDogInVua25vd24gdGFnbmFtZSIsCisJCSAgICBkaXItPnRkaXJfY291bnQsIGNvdW50KTsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgaWYgKCh1aW50NjQpY291bnQgPCBkaXItPnRkaXJfY291bnQpIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZiwgZGlyLT50ZGlyX3RhZyk7CisJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJImluY29ycmVjdCBjb3VudCBmb3IgZmllbGQgXCIlc1wiICgiIFRJRkZfVUlOVDY0X0ZPUk1BVCAiLCBleHBlY3RpbmcgJXUpOyB0YWcgdHJpbW1lZCIsCisJCSAgICBmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAidW5rbm93biB0YWduYW1lIiwKKwkJICAgIGRpci0+dGRpcl9jb3VudCwgY291bnQpOworCQlkaXItPnRkaXJfY291bnQgPSBjb3VudDsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFJlYWQgSUZEIHN0cnVjdHVyZSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiBJZiB0aGUgcG9pbnRlciB0bworICogbmV4dGRpcm9mZiB2YXJpYWJsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlYWQgaXQgdG9vLiBGdW5jdGlvbiByZXR1cm5zIGEKKyAqIG51bWJlciBvZiBmaWVsZHMgaW4gdGhlIGRpcmVjdG9yeSBvciAwIGlmIGZhaWxlZC4KKyAqLworc3RhdGljIHVpbnQxNgorVElGRkZldGNoRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0IGRpcm9mZiwgVElGRkRpckVudHJ5KiogcGRpciwKKyAgICAgICAgICAgICAgICAgICB1aW50NjQgKm5leHRkaXJvZmYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoRGlyZWN0b3J5IjsKKworCXZvaWQqIG9yaWdkaXI7CisJdWludDE2IGRpcmNvdW50MTY7CisJdWludDMyIGRpcnNpemU7CisJVElGRkRpckVudHJ5KiBkaXI7CisJdWludDgqIG1hOworCVRJRkZEaXJFbnRyeSogbWI7CisJdWludDE2IG47CisKKwlhc3NlcnQocGRpcik7CisKKwl0aWYtPnRpZl9kaXJvZmYgPSBkaXJvZmY7CisJaWYgKG5leHRkaXJvZmYpCisJCSpuZXh0ZGlyb2ZmID0gMDsKKwlpZiAoIWlzTWFwcGVkKHRpZikpIHsKKwkJaWYgKCFTZWVrT0sodGlmLCB0aWYtPnRpZl9kaXJvZmYpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSIlczogU2VlayBlcnJvciBhY2Nlc3NpbmcgVElGRiBkaXJlY3RvcnkiLAorCQkJCXRpZi0+dGlmX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJeworCQkJaWYgKCFSZWFkT0sodGlmLCAmZGlyY291bnQxNiwgc2l6ZW9mICh1aW50MTYpKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICIlczogQ2FuIG5vdCByZWFkIFRJRkYgZGlyZWN0b3J5IGNvdW50IiwKKwkJCQkgICAgdGlmLT50aWZfbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgmZGlyY291bnQxNik7CisJCQlpZiAoZGlyY291bnQxNj40MDk2KQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICJTYW5pdHkgY2hlY2sgb24gZGlyZWN0b3J5IGNvdW50IGZhaWxlZCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSB2YWxpZCBJRkQgb2Zmc2V0Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlkaXJzaXplID0gMTI7CisJCX0gZWxzZSB7CisJCQl1aW50NjQgZGlyY291bnQ2NDsKKwkJCWlmICghUmVhZE9LKHRpZiwgJmRpcmNvdW50NjQsIHNpemVvZiAodWludDY0KSkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkiJXM6IENhbiBub3QgcmVhZCBUSUZGIGRpcmVjdG9yeSBjb3VudCIsCisJCQkJCXRpZi0+dGlmX25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJmRpcmNvdW50NjQpOworCQkJaWYgKGRpcmNvdW50NjQ+NDA5NikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiU2FuaXR5IGNoZWNrIG9uIGRpcmVjdG9yeSBjb3VudCBmYWlsZWQsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgdmFsaWQgSUZEIG9mZnNldCIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZGlyY291bnQxNiA9ICh1aW50MTYpZGlyY291bnQ2NDsKKwkJCWRpcnNpemUgPSAyMDsKKwkJfQorCQlvcmlnZGlyID0gX1RJRkZDaGVja01hbGxvYyh0aWYsIGRpcmNvdW50MTYsCisJCSAgICBkaXJzaXplLCAidG8gcmVhZCBUSUZGIGRpcmVjdG9yeSIpOworCQlpZiAob3JpZ2RpciA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmICghUmVhZE9LKHRpZiwgb3JpZ2RpciwgKHRtc2l6ZV90KShkaXJjb3VudDE2KmRpcnNpemUpKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiJS4xMDBzOiBDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkiLAorCQkJCXRpZi0+dGlmX25hbWUpOworCQkJX1RJRkZmcmVlKG9yaWdkaXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogUmVhZCBvZmZzZXQgdG8gbmV4dCBkaXJlY3RvcnkgZm9yIHNlcXVlbnRpYWwgc2NhbnMgaWYKKwkJICogbmVlZGVkLgorCQkgKi8KKwkJaWYgKG5leHRkaXJvZmYpCisJCXsKKwkJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCQl7CisJCQkJdWludDMyIG5leHRkaXJvZmYzMjsKKwkJCQlpZiAoIVJlYWRPSyh0aWYsICZuZXh0ZGlyb2ZmMzIsIHNpemVvZih1aW50MzIpKSkKKwkJCQkJbmV4dGRpcm9mZjMyID0gMDsKKwkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmcoJm5leHRkaXJvZmYzMik7CisJCQkJKm5leHRkaXJvZmY9bmV4dGRpcm9mZjMyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIVJlYWRPSyh0aWYsIG5leHRkaXJvZmYsIHNpemVvZih1aW50NjQpKSkKKwkJCQkJKm5leHRkaXJvZmYgPSAwOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiTG9uZzgobmV4dGRpcm9mZik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl0bXNpemVfdCBtOworCQl0bXNpemVfdCBvZmYgPSAodG1zaXplX3QpIHRpZi0+dGlmX2Rpcm9mZjsKKwkJaWYgKCh1aW50NjQpb2ZmIT10aWYtPnRpZl9kaXJvZmYpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ2FuIG5vdCByZWFkIFRJRkYgZGlyZWN0b3J5IGNvdW50Iik7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyB3aGVuIHZhbGlkYXRpbmcgdGhlIGRpcl9vZmYsCisJCSAqIG90aGVyd2lzZSBhIHZlcnkgaGlnaCBvZmZzZXQgbWF5IGNhdXNlIGFuIE9PQiByZWFkIGFuZAorCQkgKiBjcmFzaCB0aGUgY2xpZW50LiBNYWtlIHR3byBjb21wYXJpc29ucyBpbnN0ZWFkIG9mCisJCSAqCisJCSAqICBvZmYgKyBzaXplb2YodWludDE2KSA+IHRpZi0+dGlmX3NpemUKKwkJICoKKwkJICogdG8gYXZvaWQgb3ZlcmZsb3cuCisJCSAqLworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQltPW9mZitzaXplb2YodWludDE2KTsKKwkJCWlmICgobTxvZmYpfHwobTwodG1zaXplX3Qpc2l6ZW9mKHVpbnQxNikpfHwobT50aWYtPnRpZl9zaXplKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSJDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkgY291bnQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJX1RJRkZtZW1jcHkoJmRpcmNvdW50MTYsIHRpZi0+dGlmX2Jhc2UgKyBvZmYsCisJCQkJCSAgICBzaXplb2YodWludDE2KSk7CisJCQl9CisJCQlvZmYgKz0gc2l6ZW9mICh1aW50MTYpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoJmRpcmNvdW50MTYpOworCQkJaWYgKGRpcmNvdW50MTY+NDA5NikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiU2FuaXR5IGNoZWNrIG9uIGRpcmVjdG9yeSBjb3VudCBmYWlsZWQsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgdmFsaWQgSUZEIG9mZnNldCIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZGlyc2l6ZSA9IDEyOworCQl9CisJCWVsc2UKKwkJeworCQkJdG1zaXplX3QgbTsKKwkJCXVpbnQ2NCBkaXJjb3VudDY0OworCQkJbT1vZmYrc2l6ZW9mKHVpbnQ2NCk7CisJCQlpZiAoKG08b2ZmKXx8KG08KHRtc2l6ZV90KXNpemVvZih1aW50NjQpKXx8KG0+dGlmLT50aWZfc2l6ZSkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkiQ2FuIG5vdCByZWFkIFRJRkYgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCV9USUZGbWVtY3B5KCZkaXJjb3VudDY0LCB0aWYtPnRpZl9iYXNlICsgb2ZmLAorCQkJCQkgICAgc2l6ZW9mKHVpbnQ2NCkpOworCQkJfQorCQkJb2ZmICs9IHNpemVvZiAodWludDY0KTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKwkJCWlmIChkaXJjb3VudDY0PjQwOTYpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIlNhbml0eSBjaGVjayBvbiBkaXJlY3RvcnkgY291bnQgZmFpbGVkLCB0aGlzIGlzIHByb2JhYmx5IG5vdCBhIHZhbGlkIElGRCBvZmZzZXQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWRpcmNvdW50MTYgPSAodWludDE2KWRpcmNvdW50NjQ7CisJCQlkaXJzaXplID0gMjA7CisJCX0KKwkJaWYgKGRpcmNvdW50MTYgPT0gMCApCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICAgICAgICAgIlNhbml0eSBjaGVjayBvbiBkaXJlY3RvcnkgY291bnQgZmFpbGVkLCB6ZXJvIHRhZyBkaXJlY3RvcmllcyBub3Qgc3VwcG9ydGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvcmlnZGlyID0gX1RJRkZDaGVja01hbGxvYyh0aWYsIGRpcmNvdW50MTYsCisJCQkJCQlkaXJzaXplLAorCQkJCQkJInRvIHJlYWQgVElGRiBkaXJlY3RvcnkiKTsKKwkJaWYgKG9yaWdkaXIgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQltPW9mZitkaXJjb3VudDE2KmRpcnNpemU7CisJCWlmICgobTxvZmYpfHwobTwodG1zaXplX3QpKGRpcmNvdW50MTYqZGlyc2l6ZSkpfHwobT50aWYtPnRpZl9zaXplKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgICJDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkiKTsKKwkJCV9USUZGZnJlZShvcmlnZGlyKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJX1RJRkZtZW1jcHkob3JpZ2RpciwgdGlmLT50aWZfYmFzZSArIG9mZiwKKwkJCQkgICAgZGlyY291bnQxNiAqIGRpcnNpemUpOworCQl9CisJCWlmIChuZXh0ZGlyb2ZmKSB7CisJCQlvZmYgKz0gZGlyY291bnQxNiAqIGRpcnNpemU7CisJCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQkJeworCQkJCXVpbnQzMiBuZXh0ZGlyb2ZmMzI7CisJCQkJbT1vZmYrc2l6ZW9mKHVpbnQzMik7CisJCQkJaWYgKChtPG9mZil8fChtPCh0bXNpemVfdClzaXplb2YodWludDMyKSl8fChtPnRpZi0+dGlmX3NpemUpKQorCQkJCQluZXh0ZGlyb2ZmMzIgPSAwOworCQkJCWVsc2UKKwkJCQkJX1RJRkZtZW1jcHkoJm5leHRkaXJvZmYzMiwgdGlmLT50aWZfYmFzZSArIG9mZiwKKwkJCQkJCSAgICBzaXplb2YgKHVpbnQzMikpOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiTG9uZygmbmV4dGRpcm9mZjMyKTsKKwkJCQkqbmV4dGRpcm9mZiA9IG5leHRkaXJvZmYzMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltPW9mZitzaXplb2YodWludDY0KTsKKwkJCQlpZiAoKG08b2ZmKXx8KG08KHRtc2l6ZV90KXNpemVvZih1aW50NjQpKXx8KG0+dGlmLT50aWZfc2l6ZSkpCisJCQkJCSpuZXh0ZGlyb2ZmID0gMDsKKwkJCQllbHNlCisJCQkJCV9USUZGbWVtY3B5KG5leHRkaXJvZmYsIHRpZi0+dGlmX2Jhc2UgKyBvZmYsCisJCQkJCQkgICAgc2l6ZW9mICh1aW50NjQpKTsKKwkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmc4KG5leHRkaXJvZmYpOworCQkJfQorCQl9CisJfQorCWRpciA9IChUSUZGRGlyRW50cnkqKV9USUZGQ2hlY2tNYWxsb2ModGlmLCBkaXJjb3VudDE2LAorCQkJCQkJc2l6ZW9mKFRJRkZEaXJFbnRyeSksCisJCQkJCQkidG8gcmVhZCBUSUZGIGRpcmVjdG9yeSIpOworCWlmIChkaXI9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2Rpcik7CisJCXJldHVybiAwOworCX0KKwltYT0odWludDgqKW9yaWdkaXI7CisJbWI9ZGlyOworCWZvciAobj0wOyBuPGRpcmNvdW50MTY7IG4rKykKKwl7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW1hKTsKKwkJbWItPnRkaXJfdGFnPSoodWludDE2KiltYTsKKwkJbWErPXNpemVvZih1aW50MTYpOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCW1iLT50ZGlyX3R5cGU9Kih1aW50MTYqKW1hOworCQltYSs9c2l6ZW9mKHVpbnQxNik7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nKCh1aW50MzIqKW1hKTsKKwkJCW1iLT50ZGlyX2NvdW50PSh1aW50NjQpKCoodWludDMyKiltYSk7CisJCQltYSs9c2l6ZW9mKHVpbnQzMik7CisJCQkqKHVpbnQzMiopKCZtYi0+dGRpcl9vZmZzZXQpPSoodWludDMyKiltYTsKKwkJCW1hKz1zaXplb2YodWludDMyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiltYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+dGRpcl9jb3VudD1USUZGUmVhZFVJbnQ2NChtYSk7CisJCQltYSs9c2l6ZW9mKHVpbnQ2NCk7CisJCQltYi0+dGRpcl9vZmZzZXQudG9mZl9sb25nOD1USUZGUmVhZFVJbnQ2NChtYSk7CisJCQltYSs9c2l6ZW9mKHVpbnQ2NCk7CisJCX0KKwkJbWIrKzsKKwl9CisJX1RJRkZmcmVlKG9yaWdkaXIpOworCSpwZGlyID0gZGlyOworCXJldHVybiBkaXJjb3VudDE2OworfQorCisvKgorICogRmV0Y2ggYSB0YWcgdGhhdCBpcyBub3QgaGFuZGxlZCBieSBzcGVjaWFsIGNhc2UgY29kZS4KKyAqLworc3RhdGljIGludAorVElGRkZldGNoTm9ybWFsVGFnKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkcCwgaW50IHJlY292ZXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoTm9ybWFsVGFnIjsKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBmaWk7CisJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBOVUxMOworCVRJRkZSZWFkRGlyZWN0b3J5RmluZEZpZWxkSW5mbyh0aWYsZHAtPnRkaXJfdGFnLCZmaWkpOworICAgICAgICBpZiggZmlpID09IEZBSUxFRF9GSUkgKQorICAgICAgICB7CisgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZGZXRjaE5vcm1hbFRhZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGRlZmluaXRpb24gZm91bmQgZm9yIHRhZyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPnRkaXJfdGFnKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisJZmlwPXRpZi0+dGlmX2ZpZWxkc1tmaWldOworCWFzc2VydChmaXAtPnNldF9maWVsZF90eXBlIT1USUZGX1NFVEdFVF9PVEhFUik7ICAvKiBpZiBzbywgd2Ugc2hvdWxkbid0IGFycml2ZSBoZXJlIGJ1dCBkZWFsIHdpdGggdGhpcyBpbiBzcGVjaWFsaXplZCBjb2RlICovCisJYXNzZXJ0KGZpcC0+c2V0X2ZpZWxkX3R5cGUhPVRJRkZfU0VUR0VUX0lOVCk7ICAgIC8qIGlmIHNvLCB3ZSBzaG91bGRuJ3QgYXJyaXZlIGhlcmUgYXMgdGhpcyBpcyBvbmx5IHRoZSBjYXNlIGZvciBwc2V1ZG8tdGFncyAqLworCWVycj1USUZGUmVhZERpckVudHJ5RXJyT2s7CisJc3dpdGNoIChmaXAtPnNldF9maWVsZF90eXBlKQorCXsKKwkJY2FzZSBUSUZGX1NFVEdFVF9VTkRFRklORUQ6CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9BU0NJSToKKwkJCXsKKwkJCQl1aW50OCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Qnl0ZUFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJdWludDgqIG1hOworCQkJCQl1aW50MzIgbWI7CisJCQkJCWludCBuOworCQkJCQltYT1kYXRhOworCQkJCQltYj0wOworCQkJCQl3aGlsZSAobWI8KHVpbnQzMilkcC0+dGRpcl9jb3VudCkKKwkJCQkJeworCQkJCQkJaWYgKCptYT09MCkKKwkJCQkJCQlicmVhazsKKwkJCQkJCW1hKys7CisJCQkJCQltYisrOworCQkJCQl9CisJCQkJCWlmIChtYisxPCh1aW50MzIpZHAtPnRkaXJfY291bnQpCisJCQkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQVNDSUkgdmFsdWUgZm9yIHRhZyBcIiVzXCIgY29udGFpbnMgbnVsbCBieXRlIGluIHZhbHVlOyB2YWx1ZSBpbmNvcnJlY3RseSB0cnVuY2F0ZWQgZHVyaW5nIHJlYWRpbmcgZHVlIHRvIGltcGxlbWVudGF0aW9uIGxpbWl0YXRpb25zIixmaXAtPmZpZWxkX25hbWUpOworCQkJCQllbHNlIGlmIChtYisxPih1aW50MzIpZHAtPnRkaXJfY291bnQpCisJCQkJCXsKKwkJCQkJCXVpbnQ4KiBvOworCQkJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkFTQ0lJIHZhbHVlIGZvciB0YWcgXCIlc1wiIGRvZXMgbm90IGVuZCBpbiBudWxsIGJ5dGUiLGZpcC0+ZmllbGRfbmFtZSk7CisJCQkJCQlpZiAoKHVpbnQzMilkcC0+dGRpcl9jb3VudCsxIT1kcC0+dGRpcl9jb3VudCsxKQorCQkJCQkJCW89TlVMTDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlvPV9USUZGbWFsbG9jKCh1aW50MzIpZHAtPnRkaXJfY291bnQrMSk7CisJCQkJCQlpZiAobz09TlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoZGF0YSE9TlVMTCkKKwkJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJCXJldHVybigwKTsKKwkJCQkJCX0KKwkJCQkJCV9USUZGbWVtY3B5KG8sZGF0YSwodWludDMyKWRwLT50ZGlyX2NvdW50KTsKKwkJCQkJCW9bKHVpbnQzMilkcC0+dGRpcl9jb3VudF09MDsKKwkJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJCWRhdGE9bzsKKwkJCQkJfQorCQkJCQluPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFuKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX1VJTlQ4OgorCQkJeworCQkJCXVpbnQ4IGRhdGE9MDsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlCeXRlKHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhKSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9VSU5UMTY6CisJCQl7CisJCQkJdWludDE2IGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT0xKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnQodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX1VJTlQzMjoKKwkJCXsKKwkJCQl1aW50MzIgZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlMb25nKHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhKSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9VSU5UNjQ6CisJCQl7CisJCQkJdWludDY0IGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT0xKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5TG9uZzgodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0ZMT0FUOgorCQkJeworCQkJCWZsb2F0IGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT0xKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5RmxvYXQodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0RPVUJMRToKKwkJCXsKKwkJCQlkb3VibGUgZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlEb3VibGUodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0lGRDg6CisJCQl7CisJCQkJdWludDY0IGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT0xKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5SWZkOCh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWlmICghVElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSkpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfVUlOVDE2X1BBSVI6CisJCQl7CisJCQkJdWludDE2KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09Mik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQhPTIpIHsKKwkJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCQkJCQkgICAgICAgImluY29ycmVjdCBjb3VudCBmb3IgZmllbGQgXCIlc1wiLCBleHBlY3RlZCAyLCBnb3QgJWQiLAorCQkJCQkJICAgICAgIGZpcC0+ZmllbGRfbmFtZSwoaW50KWRwLT50ZGlyX2NvdW50KTsKKwkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNob3J0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhWzBdLGRhdGFbMV0pOworCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCWlmICghbSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMF9VSU5UODoKKwkJCXsKKwkJCQl1aW50OCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ+PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50IT0odWludDY0KWZpcC0+ZmllbGRfcmVhZGNvdW50KSB7CisJCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCQkJICAgICAgICJpbmNvcnJlY3QgY291bnQgZm9yIGZpZWxkIFwiJXNcIiwgZXhwZWN0ZWQgJWQsIGdvdCAlZCIsCisJCQkJCQkgICAgICAgZmlwLT5maWVsZF9uYW1lLChpbnQpIGZpcC0+ZmllbGRfcmVhZGNvdW50LCAoaW50KWRwLT50ZGlyX2NvdW50KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Qnl0ZUFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MwX1VJTlQxNjoKKwkJCXsKKwkJCQl1aW50MTYqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50Pj0xKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWlmIChkcC0+dGRpcl9jb3VudCE9KHVpbnQ2NClmaXAtPmZpZWxkX3JlYWRjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcnJ1cHQgZmlsZSAqLzsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNob3J0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzBfVUlOVDMyOgorCQkJeworCQkJCXVpbnQzMiogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ+PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50IT0odWludDY0KWZpcC0+ZmllbGRfcmVhZGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ycnVwdCBmaWxlICovOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5TG9uZ0FycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MwX0ZMT0FUOgorCQkJeworCQkJCWZsb2F0KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD49MSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQhPSh1aW50NjQpZmlwLT5maWVsZF9yZWFkY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3JydXB0IGZpbGUgKi87CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlGbG9hdEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9BU0NJSToKKwkJCXsKKwkJCQl1aW50OCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50PjB4RkZGRikKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUJ5dGVBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzE2X1VJTlQ4OgorCQkJeworCQkJCXVpbnQ4KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Qnl0ZUFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MTYpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJCWlmICghbSkKKwkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMTZfVUlOVDE2OgorCQkJeworCQkJCXVpbnQxNiogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50PjB4RkZGRikKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNob3J0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQxNikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9VSU5UMzI6CisJCQl7CisJCQkJdWludDMyKiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5TG9uZ0FycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MTYpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJCWlmICghbSkKKwkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMTZfVUlOVDY0OgorCQkJeworCQkJCXVpbnQ2NCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50PjB4RkZGRikKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUxvbmc4QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQxNikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9GTE9BVDoKKwkJCXsKKwkJCQlmbG9hdCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50PjB4RkZGRikKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUZsb2F0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQxNikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9ET1VCTEU6CisJCQl7CisJCQkJZG91YmxlKiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5RG91YmxlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQxNikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9JRkQ4OgorCQkJeworCQkJCXVpbnQ2NCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50PjB4RkZGRikKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUlmZDhBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX0FTQ0lJOgorCQkJeworCQkJCXVpbnQ4KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1VJTlQ4OgorCQkJeworCQkJCXVpbnQ4KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1NJTlQ4OgorCQkJeworCQkJCWludDgqIGRhdGEgPSBOVUxMOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTYnl0ZUFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9VSU5UMTY6CisJCQl7CisJCQkJdWludDE2KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTaG9ydEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9TSU5UMTY6CisJCQl7CisJCQkJaW50MTYqIGRhdGEgPSBOVUxMOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTc2hvcnRBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWludCBtOworCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MzIpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCWlmICghbSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMzJfVUlOVDMyOgorCQkJeworCQkJCXVpbnQzMiogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUyKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5TG9uZ0FycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9TSU5UMzI6CisJCQl7CisJCQkJaW50MzIqIGRhdGEgPSBOVUxMOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTbG9uZ0FycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9VSU5UNjQ6CisJCQl7CisJCQkJdWludDY0KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlMb25nOEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9TSU5UNjQ6CisJCQl7CisJCQkJaW50NjQqIGRhdGEgPSBOVUxMOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTbG9uZzhBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWludCBtOworCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MzIpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCWlmICghbSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMzJfRkxPQVQ6CisJCQl7CisJCQkJZmxvYXQqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUZsb2F0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX0RPVUJMRToKKwkJCXsKKwkJCQlkb3VibGUqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeURvdWJsZUFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9JRkQ4OgorCQkJeworCQkJCXVpbnQ2NCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUyKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5SWZkOEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXNzZXJ0KDApOyAgICAvKiB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQlUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKHRpZixlcnIsbW9kdWxlLGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLHJlY292ZXIpOworCQlyZXR1cm4oMCk7CisJfQorCXJldHVybigxKTsKK30KKworLyoKKyAqIEZldGNoIGEgc2V0IG9mIG9mZnNldHMgb3IgbGVuZ3Rocy4KKyAqIFdoaWxlIHRoaXMgcm91dGluZSBzYXlzICJzdHJpcHMiLCBpbiBmYWN0IGl0J3MgYWxzbyB1c2VkIGZvciB0aWxlcy4KKyAqLworc3RhdGljIGludAorVElGRkZldGNoU3RyaXBUaGluZyhUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MzIgbnN0cmlwcywgdWludDY0KiogbHBwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGZXRjaFN0cmlwVGhpbmciOworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDY0KiBkYXRhOworCWVycj1USUZGUmVhZERpckVudHJ5TG9uZzhBcnJheSh0aWYsZGlyLCZkYXRhKTsKKwlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQljb25zdCBUSUZGRmllbGQqIGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRpci0+dGRpcl90YWcpOyAKKwkJVElGRlJlYWREaXJFbnRyeU91dHB1dEVycih0aWYsZXJyLG1vZHVsZSxmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAidW5rbm93biB0YWduYW1lIiwwKTsKKwkJcmV0dXJuKDApOworCX0KKwlpZiAoZGlyLT50ZGlyX2NvdW50IT0odWludDY0KW5zdHJpcHMpCisJeworCQl1aW50NjQqIHJlc2l6ZWRkYXRhOworCQlyZXNpemVkZGF0YT0odWludDY0KilfVElGRkNoZWNrTWFsbG9jKHRpZixuc3RyaXBzLHNpemVvZih1aW50NjQpLCJmb3Igc3RyaXAgYXJyYXkiKTsKKwkJaWYgKHJlc2l6ZWRkYXRhPT0wKSB7CisJCQlfVElGRmZyZWUoZGF0YSk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJaWYgKGRpci0+dGRpcl9jb3VudDwodWludDY0KW5zdHJpcHMpCisJCXsKKwkJCV9USUZGbWVtY3B5KHJlc2l6ZWRkYXRhLGRhdGEsKHVpbnQzMilkaXItPnRkaXJfY291bnQqc2l6ZW9mKHVpbnQ2NCkpOworCQkJX1RJRkZtZW1zZXQocmVzaXplZGRhdGErKHVpbnQzMilkaXItPnRkaXJfY291bnQsMCwobnN0cmlwcy0odWludDMyKWRpci0+dGRpcl9jb3VudCkqc2l6ZW9mKHVpbnQ2NCkpOworCQl9CisJCWVsc2UKKwkJCV9USUZGbWVtY3B5KHJlc2l6ZWRkYXRhLGRhdGEsbnN0cmlwcypzaXplb2YodWludDY0KSk7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJZGF0YT1yZXNpemVkZGF0YTsKKwl9CisJKmxwcD1kYXRhOworCXJldHVybigxKTsKK30KKworLyoKKyAqIEZldGNoIGFuZCBzZXQgdGhlIFN1YmplY3REaXN0YW5jZSBFWElGIHRhZy4KKyAqLworc3RhdGljIGludAorVElGRkZldGNoU3ViamVjdERpc3RhbmNlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoU3ViamVjdERpc3RhbmNlIjsKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCVVJbnQ2NEFsaWduZWRfdCBtOworICAgIG0ubD0wOworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWlmIChkaXItPnRkaXJfY291bnQhPTEpCisJCWVycj1USUZGUmVhZERpckVudHJ5RXJyQ291bnQ7CisJZWxzZSBpZiAoZGlyLT50ZGlyX3R5cGUhPVRJRkZfUkFUSU9OQUwpCisJCWVycj1USUZGUmVhZERpckVudHJ5RXJyVHlwZTsKKwllbHNlCisJeworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQl1aW50MzIgb2Zmc2V0OworCQkJb2Zmc2V0PSoodWludDMyKikoJmRpci0+dGRpcl9vZmZzZXQpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCw4LG0uaSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltLmw9ZGlyLT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJPazsKKwkJfQorCX0KKwlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQlkb3VibGUgbjsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOworCQlpZiAobS5pWzBdPT0wKQorCQkJbj0wLjA7CisJCWVsc2UgaWYgKG0uaVswXT09MHhGRkZGRkZGRikKKwkJCS8qCisJCQkgKiBYWFg6IE51bWVyYXRvciAweEZGRkZGRkZGIG1lYW5zIHRoYXQgd2UgaGF2ZSBpbmZpbml0ZQorCQkJICogZGlzdGFuY2UuIEluZGljYXRlIHRoYXQgd2l0aCBhIG5lZ2F0aXZlIGZsb2F0aW5nIHBvaW50CisJCQkgKiBTdWJqZWN0RGlzdGFuY2UgdmFsdWUuCisJCQkgKi8KKwkJCW49LTEuMDsKKwkJZWxzZQorCQkJbj0oZG91YmxlKW0uaVswXS8oZG91YmxlKW0uaVsxXTsKKwkJcmV0dXJuKFRJRkZTZXRGaWVsZCh0aWYsZGlyLT50ZGlyX3RhZyxuKSk7CisJfQorCWVsc2UKKwl7CisJCVRJRkZSZWFkRGlyRW50cnlPdXRwdXRFcnIodGlmLGVycixtb2R1bGUsIlN1YmplY3REaXN0YW5jZSIsVFJVRSk7CisJCXJldHVybigwKTsKKwl9Cit9CisKKy8qCisgKiBSZXBsYWNlIGEgc2luZ2xlIHN0cmlwICh0aWxlKSBvZiB1bmNvbXByZXNzZWQgZGF0YSBieSBtdWx0aXBsZSBzdHJpcHMKKyAqICh0aWxlcyksIGVhY2ggYXBwcm94aW1hdGVseSBTVFJJUF9TSVpFX0RFRkFVTFQgYnl0ZXMuIFRoaXMgaXMgdXNlZnVsIGZvcgorICogZGVhbGluZyB3aXRoIGxhcmdlIGltYWdlcyBvciBmb3IgZGVhbGluZyB3aXRoIG1hY2hpbmVzIHdpdGggYSBsaW1pdGVkCisgKiBhbW91bnQgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZAorQ2hvcFVwU2luZ2xlVW5jb21wcmVzc2VkU3RyaXAoVElGRiogdGlmKQoreworCXJlZ2lzdGVyIFRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgYnl0ZWNvdW50OworCXVpbnQ2NCBvZmZzZXQ7CisJdWludDMyIHJvd2Jsb2NrOworCXVpbnQ2NCByb3dibG9ja2J5dGVzOworCXVpbnQ2NCBzdHJpcGJ5dGVzOworCXVpbnQzMiBzdHJpcDsKKwl1aW50NjQgbnN0cmlwczY0OworCXVpbnQzMiBuc3RyaXBzMzI7CisJdWludDMyIHJvd3NwZXJzdHJpcDsKKwl1aW50NjQqIG5ld2NvdW50czsKKwl1aW50NjQqIG5ld29mZnNldHM7CisKKwlieXRlY291bnQgPSB0ZC0+dGRfc3RyaXBieXRlY291bnRbMF07CisJb2Zmc2V0ID0gdGQtPnRkX3N0cmlwb2Zmc2V0WzBdOworCWFzc2VydCh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcpOworCWlmICgodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSKSYmCisJICAgICghaXNVcFNhbXBsZWQodGlmKSkpCisJCXJvd2Jsb2NrID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV07CisJZWxzZQorCQlyb3dibG9jayA9IDE7CisJcm93YmxvY2tieXRlcyA9IFRJRkZWVGlsZVNpemU2NCh0aWYsIHJvd2Jsb2NrKTsKKwkvKgorCSAqIE1ha2UgdGhlIHJvd3MgaG9sZCBhdCBsZWFzdCBvbmUgc2NhbmxpbmUsIGJ1dCBmaWxsIHNwZWNpZmllZCBhbW91bnQKKwkgKiBvZiBkYXRhIGlmIHBvc3NpYmxlLgorCSAqLworCWlmIChyb3dibG9ja2J5dGVzID4gU1RSSVBfU0laRV9ERUZBVUxUKSB7CisJCXN0cmlwYnl0ZXMgPSByb3dibG9ja2J5dGVzOworCQlyb3dzcGVyc3RyaXAgPSByb3dibG9jazsKKwl9IGVsc2UgaWYgKHJvd2Jsb2NrYnl0ZXMgPiAwICkgeworCQl1aW50MzIgcm93YmxvY2tzcGVyc3RyaXA7CisJCXJvd2Jsb2Nrc3BlcnN0cmlwID0gKHVpbnQzMikgKFNUUklQX1NJWkVfREVGQVVMVCAvIHJvd2Jsb2NrYnl0ZXMpOworCQlyb3dzcGVyc3RyaXAgPSByb3dibG9ja3NwZXJzdHJpcCAqIHJvd2Jsb2NrOworCQlzdHJpcGJ5dGVzID0gcm93YmxvY2tzcGVyc3RyaXAgKiByb3dibG9ja2J5dGVzOworCX0KKwllbHNlCisJICAgIHJldHVybjsKKworCS8qCisJICogbmV2ZXIgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBzdHJpcHMgaW4gYW4gaW1hZ2UKKwkgKi8KKwlpZiAocm93c3BlcnN0cmlwID49IHRkLT50ZF9yb3dzcGVyc3RyaXApCisJCXJldHVybjsKKwluc3RyaXBzNjQgPSBUSUZGaG93bWFueV82NChieXRlY291bnQsIHN0cmlwYnl0ZXMpOworCWlmICgobnN0cmlwczY0PT0wKXx8KG5zdHJpcHM2ND4weEZGRkZGRkZGKSkgLyogc29tZXRoaW5nIGlzIHdvbmt5LCBkbyBub3RoaW5nLiAqLworCSAgICByZXR1cm47CisJbnN0cmlwczMyID0gKHVpbnQzMiluc3RyaXBzNjQ7CisKKwluZXdjb3VudHMgPSAodWludDY0KikgX1RJRkZDaGVja01hbGxvYyh0aWYsIG5zdHJpcHMzMiwgc2l6ZW9mICh1aW50NjQpLAorCQkJCSJmb3IgY2hvcHBlZCBcIlN0cmlwQnl0ZUNvdW50c1wiIGFycmF5Iik7CisJbmV3b2Zmc2V0cyA9ICh1aW50NjQqKSBfVElGRkNoZWNrTWFsbG9jKHRpZiwgbnN0cmlwczMyLCBzaXplb2YgKHVpbnQ2NCksCisJCQkJImZvciBjaG9wcGVkIFwiU3RyaXBPZmZzZXRzXCIgYXJyYXkiKTsKKwlpZiAobmV3Y291bnRzID09IE5VTEwgfHwgbmV3b2Zmc2V0cyA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFVuYWJsZSB0byBhbGxvY2F0ZSBuZXcgc3RyaXAgaW5mb3JtYXRpb24sIGdpdmUgdXAgYW5kIHVzZQorCQkgKiB0aGUgb3JpZ2luYWwgb25lIHN0cmlwIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKG5ld2NvdW50cyAhPSBOVUxMKQorCQkJX1RJRkZmcmVlKG5ld2NvdW50cyk7CisJCWlmIChuZXdvZmZzZXRzICE9IE5VTEwpCisJCQlfVElGRmZyZWUobmV3b2Zmc2V0cyk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBGaWxsIHRoZSBzdHJpcCBpbmZvcm1hdGlvbiBhcnJheXMgd2l0aCBuZXcgYnl0ZWNvdW50cyBhbmQgb2Zmc2V0cworCSAqIHRoYXQgcmVmbGVjdCB0aGUgYnJva2VuLXVwIGZvcm1hdC4KKwkgKi8KKwlmb3IgKHN0cmlwID0gMDsgc3RyaXAgPCBuc3RyaXBzMzI7IHN0cmlwKyspIHsKKwkJaWYgKHN0cmlwYnl0ZXMgPiBieXRlY291bnQpCisJCQlzdHJpcGJ5dGVzID0gYnl0ZWNvdW50OworCQluZXdjb3VudHNbc3RyaXBdID0gc3RyaXBieXRlczsKKwkJbmV3b2Zmc2V0c1tzdHJpcF0gPSBvZmZzZXQ7CisJCW9mZnNldCArPSBzdHJpcGJ5dGVzOworCQlieXRlY291bnQgLT0gc3RyaXBieXRlczsKKwl9CisJLyoKKwkgKiBSZXBsYWNlIG9sZCBzaW5nbGUgc3RyaXAgaW5mbyB3aXRoIG11bHRpLXN0cmlwIGluZm8uCisJICovCisJdGQtPnRkX3N0cmlwc3BlcmltYWdlID0gdGQtPnRkX25zdHJpcHMgPSBuc3RyaXBzMzI7CisJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsIHJvd3NwZXJzdHJpcCk7CisKKwlfVElGRmZyZWUodGQtPnRkX3N0cmlwYnl0ZWNvdW50KTsKKwlfVElGRmZyZWUodGQtPnRkX3N0cmlwb2Zmc2V0KTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnQgPSBuZXdjb3VudHM7CisJdGQtPnRkX3N0cmlwb2Zmc2V0ID0gbmV3b2Zmc2V0czsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnRzb3J0ZWQgPSAxOworfQorCitpbnQgX1RJRkZGaWxsU3RyaWxlcyggVElGRiAqdGlmICkKK3sKKyNpZiBkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKQorICAgICAgICByZWdpc3RlciBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgICAgIGludCByZXR1cm5fdmFsdWUgPSAxOworCisgICAgICAgIGlmKCB0ZC0+dGRfc3RyaXBvZmZzZXQgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaWYoIHRkLT50ZF9zdHJpcG9mZnNldF9lbnRyeS50ZGlyX2NvdW50ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICghVElGRkZldGNoU3RyaXBUaGluZyh0aWYsJih0ZC0+dGRfc3RyaXBvZmZzZXRfZW50cnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnRkX25zdHJpcHMsJnRkLT50ZF9zdHJpcG9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFUSUZGRmV0Y2hTdHJpcFRoaW5nKHRpZiwmKHRkLT50ZF9zdHJpcGJ5dGVjb3VudF9lbnRyeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dGRfbnN0cmlwcywmdGQtPnRkX3N0cmlwYnl0ZWNvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBfVElGRm1lbXNldCggJih0ZC0+dGRfc3RyaXBvZmZzZXRfZW50cnkpLCAwLCBzaXplb2YoVElGRkRpckVudHJ5KSk7CisgICAgICAgIF9USUZGbWVtc2V0KCAmKHRkLT50ZF9zdHJpcGJ5dGVjb3VudF9lbnRyeSksIDAsIHNpemVvZihUSUZGRGlyRW50cnkpKTsKKworCWlmICh0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyA+IDEgJiYgcmV0dXJuX3ZhbHVlID09IDEgKSB7CisJCXVpbnQzMiBzdHJpcDsKKworCQl0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRzb3J0ZWQgPSAxOworCQlmb3IgKHN0cmlwID0gMTsgc3RyaXAgPCB0aWYtPnRpZl9kaXIudGRfbnN0cmlwczsgc3RyaXArKykgeworCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldFtzdHJpcCAtIDFdID4KKwkJCSAgICB0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbc3RyaXBdKSB7CisJCQkJdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50c29ydGVkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworI2Vsc2UgLyogIWRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpICovCisgICAgICAgICh2b2lkKSB0aWY7CisgICAgICAgIHJldHVybiAxOworI2VuZGlmIAorfQorCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworICNlbmRpZgorIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZGlyd3JpdGUuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2RpcndyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxM2NkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2RpcndyaXRlLmMKQEAgLTAsMCArMSwyOTEyIEBACisvKiAkSWQ6IHRpZl9kaXJ3cml0ZS5jLHYgMS43NyAyMDEyLTA3LTA2IDE5OjE4OjMxIGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIERpcmVjdG9yeSBXcml0ZSBTdXBwb3J0IFJvdXRpbmVzLgorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisKKyNpZmRlZiBIQVZFX0lFRUVGUAorI2RlZmluZSBUSUZGQ3Z0TmF0aXZlVG9JRUVFRmxvYXQodGlmLCBuLCBmcCkKKyNkZWZpbmUgVElGRkN2dE5hdGl2ZVRvSUVFRURvdWJsZSh0aWYsIG4sIGRwKQorI2Vsc2UKK2V4dGVybiB2b2lkIFRJRkZDdnROYXRpdmVUb0lFRUVGbG9hdChUSUZGKiB0aWYsIHVpbnQzMiBuLCBmbG9hdCogZnApOworZXh0ZXJuIHZvaWQgVElGRkN2dE5hdGl2ZVRvSUVFRURvdWJsZShUSUZGKiB0aWYsIHVpbnQzMiBuLCBkb3VibGUqIGRwKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVNlYyhUSUZGKiB0aWYsIGludCBpc2ltYWdlLCBpbnQgaW1hZ2Vkb25lLCB1aW50NjQqIHBkaXJvZmYpOworCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBkb3VibGUqIHZhbHVlKTsKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSk7CisjZW5kaWYKKworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdBc2NpaShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgY2hhciogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdVbmRlZmluZWRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDgqIHZhbHVlKTsKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ4IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSk7CisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDggdmFsdWUpOworI2VuZGlmCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50OCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2J5dGVBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50OCogdmFsdWUpOworI2lmIDAKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2J5dGVQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQ4IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQxNiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQxNiogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQxNiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDE2IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTc2hvcnRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50MTYqIHZhbHVlKTsKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDE2IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0FycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MzIqIHZhbHVlKTsKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgdmFsdWUpOworI2VuZGlmCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50MzIgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDMyKiB2YWx1ZSk7CisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZ1BlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDMyIHZhbHVlKTsKKyNlbmRpZgorI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ2NCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDY0IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50NjQqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWwoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBmbG9hdCogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTcmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKTsKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRmxvYXQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBmbG9hdCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRmxvYXRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKTsKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0UGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZmxvYXQgdmFsdWUpOworI2VuZGlmCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGRvdWJsZSogdmFsdWUpOworI2lmIDAKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDMyKiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0lmZDhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRMb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0xvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRJZmQ4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydExvbmdMb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDb2xvcm1hcChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdUcmFuc2ZlcmZ1bmN0aW9uKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpcik7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1N1YmlmZChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIpOworCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRBc2NpaShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgY2hhciogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkVW5kZWZpbmVkQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRCeXRlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDggdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRCeXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTYnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDggdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTYnl0ZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQ4KiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQxNiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MTYqIHZhbHVlKTsKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNzaG9ydChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDE2IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3Nob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDE2KiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmdBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDMyKiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDMyIHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmdBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50MzIqIHZhbHVlKTsKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmc4KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDY0IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZzgoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQ2NCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQ2NCogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWwoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNyYXRpb25hbEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBmbG9hdCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRmxvYXQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBmbG9hdCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEZsb2F0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWREb3VibGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWREb3VibGVBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZG91YmxlKiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDMyKiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmQ4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpOworCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgZGF0YXR5cGUsIHVpbnQzMiBjb3VudCwgdWludDMyIGRhdGFsZW5ndGgsIHZvaWQqIGRhdGEpOworCitzdGF0aWMgaW50IFRJRkZMaW5rRGlyZWN0b3J5KFRJRkYqKTsKKworLyoKKyAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAqIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgcm91dGluZSBkb2Vzbid0CisgKiBoYW5kbGUgb3ZlcndyaXRpbmcgYSBkaXJlY3Rvcnkgd2l0aCBhdXhpbGlhcnkKKyAqIHN0b3JhZ2UgdGhhdCdzIGJlZW4gY2hhbmdlZC4KKyAqLworaW50CitUSUZGV3JpdGVEaXJlY3RvcnkoVElGRiogdGlmKQoreworCXJldHVybiBUSUZGV3JpdGVEaXJlY3RvcnlTZWModGlmLFRSVUUsVFJVRSxOVUxMKTsKK30KKworLyoKKyAqIFNpbWlsYXIgdG8gVElGRldyaXRlRGlyZWN0b3J5KCksIHdyaXRlcyB0aGUgZGlyZWN0b3J5IG91dAorICogYnV0IGxlYXZlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGluIG1lbW9yeSBzbyB0aGF0IGl0IGNhbiBiZQorICogd3JpdHRlbiBhZ2Fpbi4gIFRoaXMgd2lsbCBtYWtlIGEgcGFydGlhbGx5IHdyaXR0ZW4gVElGRiBmaWxlCisgKiByZWFkYWJsZSBiZWZvcmUgaXQgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC9jbG9zZWQuCisgKi8KK2ludAorVElGRkNoZWNrcG9pbnREaXJlY3RvcnkoVElGRiogdGlmKQoreworCWludCByYzsKKwkvKiBTZXR1cCB0aGUgc3RyaXBzIGFycmF5cywgaWYgdGhleSBoYXZlbid0IGFscmVhZHkgYmVlbi4gKi8KKwlpZiAodGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0ID09IE5VTEwpCisJICAgICh2b2lkKSBUSUZGU2V0dXBTdHJpcHModGlmKTsKKwlyYyA9IFRJRkZXcml0ZURpcmVjdG9yeVNlYyh0aWYsVFJVRSxGQUxTRSxOVUxMKTsKKwkodm9pZCkgVElGRlNldFdyaXRlT2Zmc2V0KHRpZiwgVElGRlNlZWtGaWxlKHRpZiwgMCwgU0VFS19FTkQpKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorVElGRldyaXRlQ3VzdG9tRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0KiBwZGlyb2ZmKQoreworCXJldHVybiBUSUZGV3JpdGVEaXJlY3RvcnlTZWModGlmLEZBTFNFLEZBTFNFLHBkaXJvZmYpOworfQorCisvKgorICogU2ltaWxhciB0byBUSUZGV3JpdGVEaXJlY3RvcnkoKSwgYnV0IGlmIHRoZSBkaXJlY3RvcnkgaGFzIGFscmVhZHkKKyAqIGJlZW4gd3JpdHRlbiBvbmNlLCBpdCBpcyByZWxvY2F0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgaW4gY2FzZSBpdAorICogaGFzIGNoYW5nZWQgaW4gc2l6ZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSBsb3NzIG9mIHRoZQorICogcHJldmlvdXNseSB1c2VkIGRpcmVjdG9yeSBzcGFjZS4gCisgKi8gCitpbnQKK1RJRkZSZXdyaXRlRGlyZWN0b3J5KCBUSUZGICp0aWYgKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZXdyaXRlRGlyZWN0b3J5IjsKKworCS8qIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBpZiBpdCBoYXNuJ3QgYmVlbiB3cml0dGVuLiAqLworCWlmKCB0aWYtPnRpZl9kaXJvZmYgPT0gMCApCisJCXJldHVybiBUSUZGV3JpdGVEaXJlY3RvcnkoIHRpZiApOworCisJLyoKKwkgKiBGaW5kIGFuZCB6ZXJvIHRoZSBwb2ludGVyIHRvIHRoaXMgZGlyZWN0b3J5LCBzbyB0aGF0IFRJRkZMaW5rRGlyZWN0b3J5CisJICogd2lsbCBjYXVzZSBpdCB0byBiZSBhZGRlZCBhZnRlciB0aGlzIGRpcmVjdG9yaWVzIGN1cnJlbnQgcHJlLWxpbmsuCisJICovCisKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJaWYgKHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmID09IHRpZi0+dGlmX2Rpcm9mZikKKwkJeworCQkJdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmYgPSAwOworCQkJdGlmLT50aWZfZGlyb2ZmID0gMDsKKworCQkJVElGRlNlZWtGaWxlKHRpZiw0LFNFRUtfU0VUKTsKKwkJCWlmICghV3JpdGVPSyh0aWYsICYodGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmYpLDQpKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJCSAgICAiRXJyb3IgdXBkYXRpbmcgVElGRiBoZWFkZXIiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdWludDMyIG5leHRkaXI7CisJCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmY7CisJCQl3aGlsZSgxKSB7CisJCQkJdWludDE2IGRpcmNvdW50OworCQkJCXVpbnQzMiBuZXh0bmV4dGRpcjsKKworCQkJCWlmICghU2Vla09LKHRpZiwgbmV4dGRpcikgfHwKKwkJCQkgICAgIVJlYWRPSyh0aWYsICZkaXJjb3VudCwgMikpIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQkJVElGRlN3YWJTaG9ydCgmZGlyY291bnQpOworCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBuZXh0ZGlyKzIrZGlyY291bnQqMTIsIFNFRUtfU0VUKTsKKwkJCQlpZiAoIVJlYWRPSyh0aWYsICZuZXh0bmV4dGRpciwgNCkpIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmcoJm5leHRuZXh0ZGlyKTsKKwkJCQlpZiAobmV4dG5leHRkaXI9PXRpZi0+dGlmX2Rpcm9mZikKKwkJCQl7CisJCQkJCXVpbnQzMiBtOworCQkJCQltPTA7CisJCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCQkgICAgbmV4dGRpcisyK2RpcmNvdW50KjEyLCBTRUVLX1NFVCk7CisJCQkJCWlmICghV3JpdGVPSyh0aWYsICZtLCA0KSkgeworCQkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQkJCXJldHVybiAoMCk7CisJCQkJCX0KKwkJCQkJdGlmLT50aWZfZGlyb2ZmPTA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQluZXh0ZGlyPW5leHRuZXh0ZGlyOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmICh0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmID09IHRpZi0+dGlmX2Rpcm9mZikKKwkJeworCQkJdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZiA9IDA7CisJCQl0aWYtPnRpZl9kaXJvZmYgPSAwOworCisJCQlUSUZGU2Vla0ZpbGUodGlmLDgsU0VFS19TRVQpOworCQkJaWYgKCFXcml0ZU9LKHRpZiwgJih0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmKSw4KSkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkgICAgIkVycm9yIHVwZGF0aW5nIFRJRkYgaGVhZGVyIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXVpbnQ2NCBuZXh0ZGlyOworCQkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmY7CisJCQl3aGlsZSgxKSB7CisJCQkJdWludDY0IGRpcmNvdW50NjQ7CisJCQkJdWludDE2IGRpcmNvdW50OworCQkJCXVpbnQ2NCBuZXh0bmV4dGRpcjsKKworCQkJCWlmICghU2Vla09LKHRpZiwgbmV4dGRpcikgfHwKKwkJCQkgICAgIVJlYWRPSyh0aWYsICZkaXJjb3VudDY0LCA4KSkgeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgY291bnQiKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKwkJCQlpZiAoZGlyY291bnQ2ND4weEZGRkYpCisJCQkJeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJTYW5pdHkgY2hlY2sgb24gdGFnIGNvdW50IGZhaWxlZCwgbGlrZWx5IGNvcnJ1cHQgVElGRiIpOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlkaXJjb3VudD0odWludDE2KWRpcmNvdW50NjQ7CisJCQkJKHZvaWQpIFRJRkZTZWVrRmlsZSh0aWYsCisJCQkJICAgIG5leHRkaXIrOCtkaXJjb3VudCoyMCwgU0VFS19TRVQpOworCQkJCWlmICghUmVhZE9LKHRpZiwgJm5leHRuZXh0ZGlyLCA4KSkgeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgbGluayIpOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiTG9uZzgoJm5leHRuZXh0ZGlyKTsKKwkJCQlpZiAobmV4dG5leHRkaXI9PXRpZi0+dGlmX2Rpcm9mZikKKwkJCQl7CisJCQkJCXVpbnQ2NCBtOworCQkJCQltPTA7CisJCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCQkgICAgbmV4dGRpcis4K2RpcmNvdW50KjIwLCBTRUVLX1NFVCk7CisJCQkJCWlmICghV3JpdGVPSyh0aWYsICZtLCA4KSkgeworCQkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQkJCXJldHVybiAoMCk7CisJCQkJCX0KKwkJCQkJdGlmLT50aWZfZGlyb2ZmPTA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQluZXh0ZGlyPW5leHRuZXh0ZGlyOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBOb3cgdXNlIFRJRkZXcml0ZURpcmVjdG9yeSgpIG5vcm1hbGx5LgorCSAqLworCisJcmV0dXJuIFRJRkZXcml0ZURpcmVjdG9yeSggdGlmICk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVNlYyhUSUZGKiB0aWYsIGludCBpc2ltYWdlLCBpbnQgaW1hZ2Vkb25lLCB1aW50NjQqIHBkaXJvZmYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5U2VjIjsKKwl1aW50MzIgbmRpcjsKKwlUSUZGRGlyRW50cnkqIGRpcjsKKwl1aW50MzIgZGlyc2l6ZTsKKwl2b2lkKiBkaXJtZW07CisJdWludDMyIG07CisJaWYgKHRpZi0+dGlmX21vZGUgPT0gT19SRE9OTFkpCisJCXJldHVybiAoMSk7CisKKyAgICAgICAgX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisgICAgICAgIAorCS8qCisJICogQ2xlYXIgd3JpdGUgc3RhdGUgc28gdGhhdCBzdWJzZXF1ZW50IGltYWdlcyB3aXRoCisJICogZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcyBnZXQgdGhlIHJpZ2h0IGJ1ZmZlcnMKKwkgKiBzZXR1cCBmb3IgdGhlbS4KKwkgKi8KKwlpZiAoaW1hZ2Vkb25lKQorCXsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9QT1NURU5DT0RFKQorCQl7CisJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9QT1NURU5DT0RFOworCQkJaWYgKCEoKnRpZi0+dGlmX3Bvc3RlbmNvZGUpKHRpZikpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCSAgICAiRXJyb3IgcG9zdC1lbmNvZGluZyBiZWZvcmUgZGlyZWN0b3J5IHdyaXRlIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJfQorCQkoKnRpZi0+dGlmX2Nsb3NlKSh0aWYpOyAgICAgICAvKiBzaHV0ZG93biBlbmNvZGVyICovCisJCS8qCisJCSAqIEZsdXNoIGFueSBkYXRhIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHdyaXR0ZW4KKwkJICogYnkgdGhlIGNvbXByZXNzaW9uIGNsb3NlK2NsZWFudXAgcm91dGluZXMuICBCdXQKKyAgICAgICAgICAgICAgICAgKiBiZSBjYXJlZnVsIG5vdCB0byB3cml0ZSBzdHVmZiBpZiB3ZSBkaWRuJ3QgYWRkIGRhdGEKKyAgICAgICAgICAgICAgICAgKiBpbiB0aGUgcHJldmlvdXMgc3RlcHMgYXMgdGhlICJyYXdjYyIgZGF0YSBtYXkgd2VsbCBiZQorICAgICAgICAgICAgICAgICAqIGEgcHJldmlvdXNseSByZWFkIHRpbGUvc3RyaXAgaW4gbWl4ZWQgcmVhZC93cml0ZSBtb2RlLgorCQkgKi8KKwkJaWYgKHRpZi0+dGlmX3Jhd2NjID4gMCAKKwkJICAgICYmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfQkVFTldSSVRJTkcpICE9IDAgKQorCQl7CisJCSAgICBpZiggIVRJRkZGbHVzaERhdGExKHRpZikgKQorICAgICAgICAgICAgICAgICAgICB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJFcnJvciBmbHVzaGluZyBkYXRhIGJlZm9yZSBkaXJlY3Rvcnkgd3JpdGUiKTsKKwkJCXJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorCQlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikgJiYgdGlmLT50aWZfcmF3ZGF0YSkKKwkJeworCQkJX1RJRkZmcmVlKHRpZi0+dGlmX3Jhd2RhdGEpOworCQkJdGlmLT50aWZfcmF3ZGF0YSA9IE5VTEw7CisJCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisJCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhb2ZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgPSAwOworCQl9CisJCXRpZi0+dGlmX2ZsYWdzICY9IH4oVElGRl9CRUVOV1JJVElOR3xUSUZGX0JVRkZFUlNFVFVQKTsKKwl9CisJZGlyPU5VTEw7CisJZGlybWVtPU5VTEw7CisJZGlyc2l6ZT0wOworCXdoaWxlICgxKQorCXsKKwkJbmRpcj0wOworCQlpZiAoaXNpbWFnZSkKKwkJeworCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSU1BR0VESU1FTlNJT05TKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfSU1BR0VXSURUSCx0aWYtPnRpZl9kaXIudGRfaW1hZ2V3aWR0aCkpCisJCQkJCWdvdG8gYmFkOworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRMb25nKHRpZiwmbmRpcixkaXIsVElGRlRBR19JTUFHRUxFTkdUSCx0aWYtPnRpZl9kaXIudGRfaW1hZ2VsZW5ndGgpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RJTEVESU1FTlNJT05TKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfVElMRVdJRFRILHRpZi0+dGlmX2Rpci50ZF90aWxld2lkdGgpKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfVElMRUxFTkdUSCx0aWYtPnRpZl9kaXIudGRfdGlsZWxlbmd0aCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUkVTT0xVVElPTikpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfWFJFU09MVVRJT04sdGlmLT50aWZfZGlyLnRkX3hyZXNvbHV0aW9uKSkKKwkJCQkJZ290byBiYWQ7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfWVJFU09MVVRJT04sdGlmLT50aWZfZGlyLnRkX3lyZXNvbHV0aW9uKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QT1NJVElPTikpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfWFBPU0lUSU9OLHRpZi0+dGlmX2Rpci50ZF94cG9zaXRpb24pKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1JhdGlvbmFsKHRpZiwmbmRpcixkaXIsVElGRlRBR19ZUE9TSVRJT04sdGlmLT50aWZfZGlyLnRkX3lwb3NpdGlvbikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU1VCRklMRVRZUEUpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfU1VCRklMRVRZUEUsdGlmLT50aWZfZGlyLnRkX3N1YmZpbGV0eXBlKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9CSVRTUEVSU0FNUExFKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0UGVyU2FtcGxlKHRpZiwmbmRpcixkaXIsVElGRlRBR19CSVRTUEVSU0FNUExFLHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9DT01QUkVTU0lPTikpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfQ09NUFJFU1NJT04sdGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QSE9UT01FVFJJQykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfUEhPVE9NRVRSSUMsdGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9USFJFU0hIT0xESU5HKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsVElGRlRBR19USFJFU0hIT0xESU5HLHRpZi0+dGlmX2Rpci50ZF90aHJlc2hob2xkaW5nKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9GSUxMT1JERVIpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX0ZJTExPUkRFUix0aWYtPnRpZl9kaXIudGRfZmlsbG9yZGVyKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PUklFTlRBVElPTikpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfT1JJRU5UQVRJT04sdGlmLT50aWZfZGlyLnRkX29yaWVudGF0aW9uKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TQU1QTEVTUEVSUElYRUwpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9ST1dTUEVSU1RSSVApKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRMb25nKHRpZiwmbmRpcixkaXIsVElGRlRBR19ST1dTUEVSU1RSSVAsdGlmLT50aWZfZGlyLnRkX3Jvd3NwZXJzdHJpcCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfTUlOU0FNUExFVkFMVUUpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRQZXJTYW1wbGUodGlmLCZuZGlyLGRpcixUSUZGVEFHX01JTlNBTVBMRVZBTFVFLHRpZi0+dGlmX2Rpci50ZF9taW5zYW1wbGV2YWx1ZSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfTUFYU0FNUExFVkFMVUUpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRQZXJTYW1wbGUodGlmLCZuZGlyLGRpcixUSUZGVEFHX01BWFNBTVBMRVZBTFVFLHRpZi0+dGlmX2Rpci50ZF9tYXhzYW1wbGV2YWx1ZSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUExBTkFSQ09ORklHKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsVElGRlRBR19QTEFOQVJDT05GSUcsdGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUkVTT0xVVElPTlVOSVQpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX1JFU09MVVRJT05VTklULHRpZi0+dGlmX2Rpci50ZF9yZXNvbHV0aW9udW5pdCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUEFHRU5VTUJFUikpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19QQUdFTlVNQkVSLDIsJnRpZi0+dGlmX2Rpci50ZF9wYWdlbnVtYmVyWzBdKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TVFJJUEJZVEVDT1VOVFMpKQorCQkJeworCQkJCWlmICghaXNUaWxlZCh0aWYpKQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nTG9uZzhBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfU1RSSVBCWVRFQ09VTlRTLHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLHRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nTG9uZzhBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfVElMRUJZVEVDT1VOVFMsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NUUklQT0ZGU0VUUykpCisJCQl7CisJCQkJaWYgKCFpc1RpbGVkKHRpZikpCisJCQkJeworCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdMb25nOEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19TVFJJUE9GRlNFVFMsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsdGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0KSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdMb25nOEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19USUxFT0ZGU0VUUyx0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyx0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQ09MT1JNQVApKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQ29sb3JtYXAodGlmLCZuZGlyLGRpcikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfRVhUUkFTQU1QTEVTKSkKKwkJCXsKKwkJCQlpZiAodGlmLT50aWZfZGlyLnRkX2V4dHJhc2FtcGxlcykKKwkJCQl7CisJCQkJCXVpbnQxNiBuYTsKKwkJCQkJdWludDE2KiBuYjsKKwkJCQkJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZixUSUZGVEFHX0VYVFJBU0FNUExFUywmbmEsJm5iKTsKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19FWFRSQVNBTVBMRVMsbmEsbmIpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU0FNUExFRk9STUFUKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0UGVyU2FtcGxlKHRpZiwmbmRpcixkaXIsVElGRlRBR19TQU1QTEVGT1JNQVQsdGlmLT50aWZfZGlyLnRkX3NhbXBsZWZvcm1hdCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU01JTlNBTVBMRVZBTFVFKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19TTUlOU0FNUExFVkFMVUUsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCx0aWYtPnRpZl9kaXIudGRfc21pbnNhbXBsZXZhbHVlKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TTUFYU0FNUExFVkFMVUUpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2FtcGxlZm9ybWF0QXJyYXkodGlmLCZuZGlyLGRpcixUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRSx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsLHRpZi0+dGlmX2Rpci50ZF9zbWF4c2FtcGxldmFsdWUpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0lNQUdFREVQVEgpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfSU1BR0VERVBUSCx0aWYtPnRpZl9kaXIudGRfaW1hZ2VkZXB0aCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfVElMRURFUFRIKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmcodGlmLCZuZGlyLGRpcixUSUZGVEFHX1RJTEVERVBUSCx0aWYtPnRpZl9kaXIudGRfdGlsZWRlcHRoKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9IQUxGVE9ORUhJTlRTKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcixUSUZGVEFHX0hBTEZUT05FSElOVFMsMiwmdGlmLT50aWZfZGlyLnRkX2hhbGZ0b25laGludHNbMF0pKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1lDQkNSU1VCU0FNUExJTkcpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywyLCZ0aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1swXSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfWUNCQ1JQT1NJVElPTklORykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfWUNCQ1JQT1NJVElPTklORyx0aWYtPnRpZl9kaXIudGRfeWNiY3Jwb3NpdGlvbmluZykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUkVGQkxBQ0tXSElURSkpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19SRUZFUkVOQ0VCTEFDS1dISVRFLDYsdGlmLT50aWZfZGlyLnRkX3JlZmJsYWNrd2hpdGUpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RSQU5TRkVSRlVOQ1RJT04pKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnVHJhbnNmZXJmdW5jdGlvbih0aWYsJm5kaXIsZGlyKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9JTktOQU1FUykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdBc2NpaSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfSU5LTkFNRVMsdGlmLT50aWZfZGlyLnRkX2lua25hbWVzbGVuLHRpZi0+dGlmX2Rpci50ZF9pbmtuYW1lcykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU1VCSUZEKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1N1YmlmZCh0aWYsJm5kaXIsZGlyKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQl7CisJCQkJdWludDMyIG47CisJCQkJZm9yIChuPTA7IG48dGlmLT50aWZfbmZpZWxkczsgbisrKSB7CisJCQkJCWNvbnN0IFRJRkZGaWVsZCogbzsKKwkJCQkJbyA9IHRpZi0+dGlmX2ZpZWxkc1tuXTsKKwkJCQkJaWYgKChvLT5maWVsZF9iaXQ+PUZJRUxEX0NPREVDKSYmKFRJRkZGaWVsZFNldCh0aWYsby0+ZmllbGRfYml0KSkpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoby0+Z2V0X2ZpZWxkX3R5cGUpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBUSUZGX1NFVEdFVF9BU0NJSToKKwkJCQkJCQkJeworCQkJCQkJCQkJdWludDMyIHBhOworCQkJCQkJCQkJY2hhciogcGI7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfdHlwZT09VElGRl9BU0NJSSk7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFKTsKKwkJCQkJCQkJCWFzc2VydChvLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCQkJCQkJVElGRkdldEZpZWxkKHRpZixvLT5maWVsZF90YWcsJnBiKTsKKwkJCQkJCQkJCXBhPSh1aW50MzIpKHN0cmxlbihwYikpOworCQkJCQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdBc2NpaSh0aWYsJm5kaXIsZGlyLG8tPmZpZWxkX3RhZyxwYSxwYikpCisJCQkJCQkJCQkJZ290byBiYWQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NFVEdFVF9VSU5UMTY6CisJCQkJCQkJCXsKKwkJCQkJCQkJCXVpbnQxNiBwOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3R5cGU9PVRJRkZfU0hPUlQpOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3JlYWRjb3VudD09MSk7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQkJCQkJCVRJRkZHZXRGaWVsZCh0aWYsby0+ZmllbGRfdGFnLCZwKTsKKwkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscCkpCisJCQkJCQkJCQkJZ290byBiYWQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NFVEdFVF9VSU5UMzI6CisJCQkJCQkJCXsKKwkJCQkJCQkJCXVpbnQzMiBwOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3R5cGU9PVRJRkZfTE9ORyk7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcmVhZGNvdW50PT0xKTsKKwkJCQkJCQkJCWFzc2VydChvLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCQkJCQkJVElGRkdldEZpZWxkKHRpZixvLT5maWVsZF90YWcsJnApOworCQkJCQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nKHRpZiwmbmRpcixkaXIsby0+ZmllbGRfdGFnLHApKQorCQkJCQkJCQkJCWdvdG8gYmFkOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1VJTlQ4OgorCQkJCQkJCQl7CisJCQkJCQkJCQl1aW50MzIgcGE7CisJCQkJCQkJCQl2b2lkKiBwYjsKKwkJCQkJCQkJCWFzc2VydChvLT5maWVsZF90eXBlPT1USUZGX1VOREVGSU5FRCk7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQkJCQkJCVRJRkZHZXRGaWVsZCh0aWYsby0+ZmllbGRfdGFnLCZwYSwmcGIpOworCQkJCQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdVbmRlZmluZWRBcnJheSh0aWYsJm5kaXIsZGlyLG8tPmZpZWxkX3RhZyxwYSxwYikpCisJCQkJCQkJCQkJZ290byBiYWQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJYXNzZXJ0KDApOyAgIC8qIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKG09MDsgbTwodWludDMyKSh0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVDb3VudCk7IG0rKykKKwkJeworCQkJc3dpdGNoICh0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3R5cGUpCisJCQl7CisJCQkJY2FzZSBUSUZGX0FTQ0lJOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0FzY2lpKHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfVU5ERUZJTkVEOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1VuZGVmaW5lZEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfQllURToKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9TQllURToKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZUFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0hPUlQ6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTc2hvcnRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0xPTkc6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0FycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0xPTkc6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmdBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0xPTkc4OgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9TTE9ORzg6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1NyYXRpb25hbEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfRkxPQVQ6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnRmxvYXRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdEb3VibGVBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0lGRDoKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0lGRDg6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkSWZkOEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlhc3NlcnQoMCk7ICAgLyogd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChkaXIhPU5VTEwpCisJCQlicmVhazsKKwkJZGlyPV9USUZGbWFsbG9jKG5kaXIqc2l6ZW9mKFRJRkZEaXJFbnRyeSkpOworCQlpZiAoZGlyPT1OVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmIChpc2ltYWdlKQorCQl7CisJCQlpZiAoKHRpZi0+dGlmX2Rpcm9mZj09MCkmJighVElGRkxpbmtEaXJlY3RvcnkodGlmKSkpCisJCQkJZ290byBiYWQ7CisJCX0KKwkJZWxzZQorCQkJdGlmLT50aWZfZGlyb2ZmPShUSUZGU2Vla0ZpbGUodGlmLDAsU0VFS19FTkQpKzEpJih+MSk7CisJCWlmIChwZGlyb2ZmIT1OVUxMKQorCQkJKnBkaXJvZmY9dGlmLT50aWZfZGlyb2ZmOworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQkJZGlyc2l6ZT0yK25kaXIqMTIrNDsKKwkJZWxzZQorCQkJZGlyc2l6ZT04K25kaXIqMjArODsKKwkJdGlmLT50aWZfZGF0YW9mZj10aWYtPnRpZl9kaXJvZmYrZGlyc2l6ZTsKKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCXRpZi0+dGlmX2RhdGFvZmY9KHVpbnQzMil0aWYtPnRpZl9kYXRhb2ZmOworCQlpZiAoKHRpZi0+dGlmX2RhdGFvZmY8dGlmLT50aWZfZGlyb2ZmKXx8KHRpZi0+dGlmX2RhdGFvZmY8KHVpbnQ2NClkaXJzaXplKSkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJNYXhpbXVtIFRJRkYgZmlsZSBzaXplIGV4Y2VlZGVkIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAodGlmLT50aWZfZGF0YW9mZiYxKQorCQkJdGlmLT50aWZfZGF0YW9mZisrOworCQlpZiAoaXNpbWFnZSkKKwkJCXRpZi0+dGlmX2N1cmRpcisrOworCX0KKwlpZiAoaXNpbWFnZSkKKwl7CisJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NVQklGRCkmJih0aWYtPnRpZl9zdWJpZmRvZmY9PTApKQorCQl7CisJCQl1aW50MzIgbmE7CisJCQlUSUZGRGlyRW50cnkqIG5iOworCQkJZm9yIChuYT0wLCBuYj1kaXI7IDsgbmErKywgbmIrKykKKwkJCXsKKwkJCQlhc3NlcnQobmE8bmRpcik7CisJCQkJaWYgKG5iLT50ZGlyX3RhZz09VElGRlRBR19TVUJJRkQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCQl0aWYtPnRpZl9zdWJpZmRvZmY9dGlmLT50aWZfZGlyb2ZmKzIrbmEqMTIrODsKKwkJCWVsc2UKKwkJCQl0aWYtPnRpZl9zdWJpZmRvZmY9dGlmLT50aWZfZGlyb2ZmKzgrbmEqMjArMTI7CisJCX0KKwl9CisJZGlybWVtPV9USUZGbWFsbG9jKGRpcnNpemUpOworCWlmIChkaXJtZW09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJZ290byBiYWQ7CisJfQorCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJeworCQl1aW50OCogbjsKKwkJdWludDMyIG5UbXA7CisJCVRJRkZEaXJFbnRyeSogbzsKKwkJbj1kaXJtZW07CisJCSoodWludDE2KiluPW5kaXI7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW4pOworCQluKz0yOworCQlvPWRpcjsKKwkJZm9yIChtPTA7IG08bmRpcjsgbSsrKQorCQl7CisJCQkqKHVpbnQxNiopbj1vLT50ZGlyX3RhZzsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiluKTsKKwkJCW4rPTI7CisJCQkqKHVpbnQxNiopbj1vLT50ZGlyX3R5cGU7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbik7CisJCQluKz0yOworCQkJblRtcCA9ICh1aW50MzIpby0+dGRpcl9jb3VudDsKKwkJCV9USUZGbWVtY3B5KG4sJm5UbXAsNCk7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiluKTsKKwkJCW4rPTQ7CisJCQkvKiBUaGlzIGlzIGNvcnJlY3QuIFRoZSBkYXRhIGhhcyBiZWVuICovCisJCQkvKiBzd2FiYmVkIHByZXZpb3VzbHkgaW4gVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSAqLworCQkJX1RJRkZtZW1jcHkobiwmby0+dGRpcl9vZmZzZXQsNCk7CisJCQluKz00OworCQkJbysrOworCQl9CisJCW5UbXAgPSAodWludDMyKXRpZi0+dGlmX25leHRkaXJvZmY7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm5UbXApOworCQlfVElGRm1lbWNweShuLCZuVG1wLDQpOworCX0KKwllbHNlCisJeworCQl1aW50OCogbjsKKwkJVElGRkRpckVudHJ5KiBvOworCQluPWRpcm1lbTsKKwkJKih1aW50NjQqKW49bmRpcjsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbik7CisJCW4rPTg7CisJCW89ZGlyOworCQlmb3IgKG09MDsgbTxuZGlyOyBtKyspCisJCXsKKwkJCSoodWludDE2KiluPW8tPnRkaXJfdGFnOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW4pOworCQkJbis9MjsKKwkJCSoodWludDE2KiluPW8tPnRkaXJfdHlwZTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiluKTsKKwkJCW4rPTI7CisJCQlfVElGRm1lbWNweShuLCZvLT50ZGlyX2NvdW50LDgpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCh1aW50NjQqKW4pOworCQkJbis9ODsKKwkJCV9USUZGbWVtY3B5KG4sJm8tPnRkaXJfb2Zmc2V0LDgpOworCQkJbis9ODsKKwkJCW8rKzsKKwkJfQorCQlfVElGRm1lbWNweShuLCZ0aWYtPnRpZl9uZXh0ZGlyb2ZmLDgpOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nOCgodWludDY0KiluKTsKKwl9CisJX1RJRkZmcmVlKGRpcik7CisJZGlyPU5VTEw7CisJaWYgKCFTZWVrT0sodGlmLHRpZi0+dGlmX2Rpcm9mZikpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIklPIGVycm9yIHdyaXRpbmcgZGlyZWN0b3J5Iik7CisJCWdvdG8gYmFkOworCX0KKwlpZiAoIVdyaXRlT0sodGlmLGRpcm1lbSwodG1zaXplX3QpZGlyc2l6ZSkpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIklPIGVycm9yIHdyaXRpbmcgZGlyZWN0b3J5Iik7CisJCWdvdG8gYmFkOworCX0KKwlfVElGRmZyZWUoZGlybWVtKTsKKwlpZiAoaW1hZ2Vkb25lKQorCXsKKwkJVElGRkZyZWVEaXJlY3RvcnkodGlmKTsKKwkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfRElSVFlESVJFQ1Q7CisJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZU1RSSVA7CisJCSgqdGlmLT50aWZfY2xlYW51cCkodGlmKTsKKwkJLyoKKwkJKiBSZXNldCBkaXJlY3RvcnktcmVsYXRlZCBzdGF0ZSBmb3Igc3Vic2VxdWVudAorCQkqIGRpcmVjdG9yaWVzLgorCQkqLworCQlUSUZGQ3JlYXRlRGlyZWN0b3J5KHRpZik7CisJfQorCXJldHVybigxKTsKK2JhZDoKKwlpZiAoZGlyIT1OVUxMKQorCQlfVElGRmZyZWUoZGlyKTsKKwlpZiAoZGlybWVtIT1OVUxMKQorCQlfVElGRmZyZWUoZGlybWVtKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBkb3VibGUqIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdEFycmF5IjsKKwl2b2lkKiBjb252OworCXVpbnQzMiBpOworCWludCBvazsKKwljb252ID0gX1RJRkZtYWxsb2MoY291bnQqc2l6ZW9mKGRvdWJsZSkpOworCWlmIChjb252ID09IE5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4gKDApOworCX0KKworCXN3aXRjaCAodGlmLT50aWZfZGlyLnRkX3NhbXBsZWZvcm1hdCkKKwl7CisJCWNhc2UgU0FNUExFRk9STUFUX0lFRUVGUDoKKwkJCWlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZTw9MzIpCisJCQl7CisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQkJCSgoZmxvYXQqKWNvbnYpW2ldID0gKGZsb2F0KXZhbHVlW2ldOworCQkJCW9rID0gVElGRldyaXRlRGlyZWN0b3J5VGFnRmxvYXRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LChmbG9hdCopY29udik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdEb3VibGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNBTVBMRUZPUk1BVF9JTlQ6CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTgpCisJCQl7CisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQkJCSgoaW50OCopY29udilbaV0gPSAoaW50OCl2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwoaW50OCopY29udik7CisJCQl9CisJCQllbHNlIGlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZTw9MTYpCisJCQl7CisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQkJCSgoaW50MTYqKWNvbnYpW2ldID0gKGludDE2KXZhbHVlW2ldOworCQkJCW9rID0gVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwoaW50MTYqKWNvbnYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJCQkoKGludDMyKiljb252KVtpXSA9IChpbnQzMil2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwoaW50MzIqKWNvbnYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0FNUExFRk9STUFUX1VJTlQ6CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTgpCisJCQl7CisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQkJCSgodWludDgqKWNvbnYpW2ldID0gKHVpbnQ4KXZhbHVlW2ldOworCQkJCW9rID0gVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKHVpbnQ4Kiljb252KTsKKwkJCX0KKwkJCWVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPD0xNikKKwkJCXsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJCQkJKCh1aW50MTYqKWNvbnYpW2ldID0gKHVpbnQxNil2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwodWludDE2Kiljb252KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJCQkJKCh1aW50MzIqKWNvbnYpW2ldID0gKHVpbnQzMil2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LCh1aW50MzIqKWNvbnYpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvayA9IDA7CisJfQorCisJX1RJRkZmcmVlKGNvbnYpOworCXJldHVybiAob2spOworfQorCisjaWYgMAorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU2FtcGxlZm9ybWF0UGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKQoreworCXN3aXRjaCAodGlmLT50aWZfZGlyLnRkX3NhbXBsZWZvcm1hdCkKKwl7CisJCWNhc2UgU0FNUExFRk9STUFUX0lFRUVGUDoKKwkJCWlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZTw9MzIpCisJCQkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0UGVyU2FtcGxlKHRpZixuZGlyLGRpcix0YWcsKGZsb2F0KXZhbHVlKSk7CisJCQllbHNlCisJCQkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZVBlclNhbXBsZSh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7CisJCWNhc2UgU0FNUExFRk9STUFUX0lOVDoKKwkJCWlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZTw9OCkKKwkJCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnU2J5dGVQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZywoaW50OCl2YWx1ZSkpOworCQkJZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTE2KQorCQkJCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdTc2hvcnRQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZywoaW50MTYpdmFsdWUpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmdQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZywoaW50MzIpdmFsdWUpKTsKKwkJY2FzZSBTQU1QTEVGT1JNQVRfVUlOVDoKKwkJCWlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZTw9OCkKKwkJCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZVBlclNhbXBsZSh0aWYsbmRpcixkaXIsdGFnLCh1aW50OCl2YWx1ZSkpOworCQkJZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTE2KQorCQkJCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydFBlclNhbXBsZSh0aWYsbmRpcixkaXIsdGFnLCh1aW50MTYpdmFsdWUpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ1BlclNhbXBsZSh0aWYsbmRpcixkaXIsdGFnLCh1aW50MzIpdmFsdWUpKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybigxKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQXNjaWkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGNoYXIqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRBc2NpaSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1VuZGVmaW5lZEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50OCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFVuZGVmaW5lZEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ4IHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRCeXRlKHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0J5dGVQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50OCB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlUGVyU2FtcGxlIjsKKwl1aW50OCogbTsKKwl1aW50OCogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZih1aW50OCkpOworCWlmIChtPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJZm9yIChuYT1tLCBuYj0wOyBuYjx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOyBuYSsrLCBuYisrKQorCQkqbmE9dmFsdWU7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCxtKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorI2VuZGlmCisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50OCB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2J5dGUodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDgqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTYnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50OCB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZVBlclNhbXBsZSI7CisJaW50OCogbTsKKwlpbnQ4KiBuYTsKKwl1aW50MTYgbmI7CisJaW50IG87CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwltPV9USUZGbWFsbG9jKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwqc2l6ZW9mKGludDgpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9bSwgbmI9MDsgbmI8dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbmErKywgbmIrKykKKwkJKm5hPXZhbHVlOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNieXRlQXJyYXkodGlmLG5kaXIsZGlyLHRhZyx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsLG0pOworCV9USUZGZnJlZShtKTsKKwlyZXR1cm4obyk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0KHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDE2KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0UGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDE2IHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0UGVyU2FtcGxlIjsKKwl1aW50MTYqIG07CisJdWludDE2KiBuYTsKKwl1aW50MTYgbmI7CisJaW50IG87CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwltPV9USUZGbWFsbG9jKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwqc2l6ZW9mKHVpbnQxNikpOworCWlmIChtPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJZm9yIChuYT1tLCBuYj0wOyBuYjx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOyBuYSsrLCBuYisrKQorCQkqbmE9dmFsdWU7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnRBcnJheSh0aWYsbmRpcixkaXIsdGFnLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsbSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50MTYgdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNzaG9ydCh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDE2KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3Nob3J0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCisjaWYgMAorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0UGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50MTYgdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0UGVyU2FtcGxlIjsKKwlpbnQxNiogbTsKKwlpbnQxNiogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZihpbnQxNikpOworCWlmIChtPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJZm9yIChuYT1tLCBuYj0wOyBuYjx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOyBuYSsrLCBuYisrKQorCQkqbmE9dmFsdWU7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3Nob3J0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsLG0pOworCV9USUZGZnJlZShtKTsKKwlyZXR1cm4obyk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZyh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDMyKiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZ0FycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ1BlclNhbXBsZSI7CisJdWludDMyKiBtOworCXVpbnQzMiogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZih1aW50MzIpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9bSwgbmI9MDsgbmI8dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbmErKywgbmIrKykKKwkJKm5hPXZhbHVlOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsbSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKyNlbmRpZgorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDMyIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZyh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmdBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50MzIqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZ0FycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50MzIgdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmdQZXJTYW1wbGUiOworCWludDMyKiBtOworCWludDMyKiBuYTsKKwl1aW50MTYgbmI7CisJaW50IG87CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwltPV9USUZGbWFsbG9jKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwqc2l6ZW9mKGludDMyKSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPW0sIG5iPTA7IG5iPHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7IG5hKyssIG5iKyspCisJCSpuYT12YWx1ZTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZ0FycmF5KHRpZixuZGlyLGRpcix0YWcsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCxtKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorI2VuZGlmCisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmc4KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDY0IHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nOCh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzhBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDY0IHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZzgodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQ2NCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nOEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWwoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFJhdGlvbmFsKHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRSYXRpb25hbEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU3JhdGlvbmFsQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3JhdGlvbmFsQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZmxvYXQgdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEZsb2F0KHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRmxvYXRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0UGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZmxvYXQgdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnRmxvYXRQZXJTYW1wbGUiOworCWZsb2F0KiBtOworCWZsb2F0KiBuYTsKKwl1aW50MTYgbmI7CisJaW50IG87CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwltPV9USUZGbWFsbG9jKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwqc2l6ZW9mKGZsb2F0KSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPW0sIG5iPTA7IG5iPHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7IG5hKyssIG5iKyspCisJCSpuYT12YWx1ZTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRGbG9hdEFycmF5KHRpZixuZGlyLGRpcix0YWcsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCxtKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorI2VuZGlmCisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWREb3VibGUodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGRvdWJsZSogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZERvdWJsZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZVBlclNhbXBsZSI7CisJZG91YmxlKiBtOworCWRvdWJsZSogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZihkb3VibGUpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9bSwgbmI9MDsgbmI8dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbmErKywgbmIrKykKKwkJKm5hPXZhbHVlOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZERvdWJsZUFycmF5KHRpZixuZGlyLGRpcix0YWcsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCxtKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0lmZEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MzIqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0lmZDhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkOEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydExvbmcoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlpZiAodmFsdWU8PTB4RkZGRikKKwkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydCh0aWYsbmRpcixkaXIsdGFnLCh1aW50MTYpdmFsdWUpKTsKKwllbHNlCisJCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZyh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICBUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nTG9uZzhBcnJheSgpICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgV3JpdGUgb3V0IExPTkc4IGFycmF5IGFzIExPTkc4IGZvciBCaWdUSUZGIG9yIExPTkcgZm9yICAgICAgICAgICovCisvKiAgICAgIENsYXNzaWMgVElGRiB3aXRoIHNvbWUgY2hlY2tpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0xvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0xvbmc4QXJyYXkiOworICAgIHVpbnQ2NCogbWE7CisgICAgdWludDMyIG1iOworICAgIHVpbnQzMiogcDsKKyAgICB1aW50MzIqIHE7CisgICAgaW50IG87CisKKyAgICAvKiBpcyB0aGlzIGp1c3QgYSBjb3VudGluZyBwYXNzPyAqLworICAgIGlmIChkaXI9PU5VTEwpCisgICAgeworICAgICAgICAoKm5kaXIpKys7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICAvKiBXZSBhbHdheXMgd3JpdGUgTE9ORzggZm9yIEJpZ1RJRkYsIG5vIGNoZWNraW5nIG5lZWRlZC4gKi8KKyAgICBpZiggdGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGICkKKyAgICAgICAgcmV0dXJuIFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nOEFycmF5KHRpZixuZGlyLGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyxjb3VudCx2YWx1ZSk7CisKKyAgICAvKgorICAgICoqIEZvciBjbGFzc2ljIHRpZmYgd2Ugd2FudCB0byB2ZXJpZnkgZXZlcnl0aGluZyBpcyBpbiByYW5nZSBmb3IgTE9ORworICAgICoqIGFuZCBjb252ZXJ0IHRvIGxvbmcgZm9ybWF0LgorICAgICovCisKKyAgICBwID0gX1RJRkZtYWxsb2MoY291bnQqc2l6ZW9mKHVpbnQzMikpOworICAgIGlmIChwPT1OVUxMKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBmb3IgKHE9cCwgbWE9dmFsdWUsIG1iPTA7IG1iPGNvdW50OyBtYSsrLCBtYisrLCBxKyspCisgICAgeworICAgICAgICBpZiAoKm1hPjB4RkZGRkZGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB2YWx1ZSBsYXJnZXIgdGhhbiAweEZGRkZGRkZGIGluIENsYXNzaWMgVElGRiBmaWxlLiIpOworICAgICAgICAgICAgX1RJRkZmcmVlKHApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICAgICpxPSAodWludDMyKSgqbWEpOworICAgIH0KKworICAgIG89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHApOworICAgIF9USUZGZnJlZShwKTsKKworICAgIHJldHVybihvKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICBUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRJZmQ4QXJyYXkoKSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBXcml0ZSBlaXRoZXIgSUZEOCBvciBJRkQgYXJyYXkgZGVwZW5kaW5nIG9uIGZpbGUgdHlwZS4gICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0lmZElmZDhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRJZmQ4QXJyYXkiOworICAgIHVpbnQ2NCogbWE7CisgICAgdWludDMyIG1iOworICAgIHVpbnQzMiogcDsKKyAgICB1aW50MzIqIHE7CisgICAgaW50IG87CisKKyAgICAvKiBpcyB0aGlzIGp1c3QgYSBjb3VudGluZyBwYXNzPyAqLworICAgIGlmIChkaXI9PU5VTEwpCisgICAgeworICAgICAgICAoKm5kaXIpKys7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICAvKiBXZSBhbHdheXMgd3JpdGUgSUZEOCBmb3IgQmlnVElGRiwgbm8gY2hlY2tpbmcgbmVlZGVkLiAqLworICAgIGlmKCB0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYgKQorICAgICAgICByZXR1cm4gVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZElmZDhBcnJheSh0aWYsbmRpcixkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyxjb3VudCx2YWx1ZSk7CisKKyAgICAvKgorICAgICoqIEZvciBjbGFzc2ljIHRpZmYgd2Ugd2FudCB0byB2ZXJpZnkgZXZlcnl0aGluZyBpcyBpbiByYW5nZSBmb3IgSUZECisgICAgKiogYW5kIGNvbnZlcnQgdG8gbG9uZyBmb3JtYXQuCisgICAgKi8KKworICAgIHAgPSBfVElGRm1hbGxvYyhjb3VudCpzaXplb2YodWludDMyKSk7CisgICAgaWYgKHA9PU5VTEwpCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGZvciAocT1wLCBtYT12YWx1ZSwgbWI9MDsgbWI8Y291bnQ7IG1hKyssIG1iKyssIHErKykKKyAgICB7CisgICAgICAgIGlmICgqbWE+MHhGRkZGRkZGRikKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHdyaXRlIHZhbHVlIGxhcmdlciB0aGFuIDB4RkZGRkZGRkYgaW4gQ2xhc3NpYyBUSUZGIGZpbGUuIik7CisgICAgICAgICAgICBfVElGRmZyZWUocCk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgKnE9ICh1aW50MzIpKCptYSk7CisgICAgfQorCisgICAgbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCxwKTsKKyAgICBfVElGRmZyZWUocCk7CisKKyAgICByZXR1cm4obyk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZ0xvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRMb25nTG9uZzhBcnJheSI7CisJdWludDY0KiBtYTsKKwl1aW50MzIgbWI7CisJdWludDggbjsKKwlpbnQgbzsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW49MDsKKwlmb3IgKG1hPXZhbHVlLCBtYj0wOyBtYjxjb3VudDsgbWErKywgbWIrKykKKwl7CisJCWlmICgobj09MCkmJigqbWE+MHhGRkZGKSkKKwkJCW49MTsKKwkJaWYgKChuPT0xKSYmKCptYT4weEZGRkZGRkZGKSkKKwkJeworCQkJbj0yOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG49PTApCisJeworCQl1aW50MTYqIHA7CisJCXVpbnQxNiogcTsKKwkJcD1fVElGRm1hbGxvYyhjb3VudCpzaXplb2YodWludDE2KSk7CisJCWlmIChwPT1OVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlmb3IgKG1hPXZhbHVlLCBtYj0wLCBxPXA7IG1iPGNvdW50OyBtYSsrLCBtYisrLCBxKyspCisJCQkqcT0odWludDE2KSgqbWEpOworCQlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQscCk7CisJCV9USUZGZnJlZShwKTsKKwl9CisJZWxzZSBpZiAobj09MSkKKwl7CisJCXVpbnQzMiogcDsKKwkJdWludDMyKiBxOworCQlwPV9USUZGbWFsbG9jKGNvdW50KnNpemVvZih1aW50MzIpKTsKKwkJaWYgKHA9PU5VTEwpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQkJcmV0dXJuKDApOworCQl9CisJCWZvciAobWE9dmFsdWUsIG1iPTAsIHE9cDsgbWI8Y291bnQ7IG1hKyssIG1iKyssIHErKykKKwkJCSpxPSh1aW50MzIpKCptYSk7CisJCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHApOworCQlfVElGRmZyZWUocCk7CisJfQorCWVsc2UKKwl7CisJCWFzc2VydChuPT0yKTsKKwkJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzhBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKTsKKwl9CisJcmV0dXJuKG8pOworfQorI2VuZGlmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDb2xvcm1hcChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnQ29sb3JtYXAiOworCXVpbnQzMiBtOworCXVpbnQxNiogbjsKKwlpbnQgbzsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09KDE8PHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlKTsKKwluPV9USUZGbWFsbG9jKDMqbSpzaXplb2YodWludDE2KSk7CisJaWYgKG49PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlfVElGRm1lbWNweSgmblswXSx0aWYtPnRpZl9kaXIudGRfY29sb3JtYXBbMF0sbSpzaXplb2YodWludDE2KSk7CisJX1RJRkZtZW1jcHkoJm5bbV0sdGlmLT50aWZfZGlyLnRkX2NvbG9ybWFwWzFdLG0qc2l6ZW9mKHVpbnQxNikpOworCV9USUZGbWVtY3B5KCZuWzIqbV0sdGlmLT50aWZfZGlyLnRkX2NvbG9ybWFwWzJdLG0qc2l6ZW9mKHVpbnQxNikpOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0QXJyYXkodGlmLG5kaXIsZGlyLFRJRkZUQUdfQ09MT1JNQVAsMyptLG4pOworCV9USUZGZnJlZShuKTsKKwlyZXR1cm4obyk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1RyYW5zZmVyZnVuY3Rpb24oVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ1RyYW5zZmVyZnVuY3Rpb24iOworCXVpbnQzMiBtOworCXVpbnQxNiBuOworCXVpbnQxNiogbzsKKwlpbnQgcDsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09KDE8PHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlKTsKKwluPXRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwtdGlmLT50aWZfZGlyLnRkX2V4dHJhc2FtcGxlczsKKwkvKgorCSAqIENoZWNrIGlmIHRoZSB0YWJsZSBjYW4gYmUgd3JpdHRlbiBhcyBhIHNpbmdsZSBjb2x1bW4sCisJICogb3IgaWYgaXQgbXVzdCBiZSB3cml0dGVuIGFzIDMgY29sdW1ucy4gIE5vdGUgdGhhdCB3ZQorCSAqIHdyaXRlIGEgMy1jb2x1bW4gdGFnIGlmIHRoZXJlIGFyZSAyIHNhbXBsZXMvcGl4ZWwgYW5kCisJICogYSBzaW5nbGUgY29sdW1uIG9mIGRhdGEgd29uJ3Qgc3VmZmljZS0taG1tLgorCSAqLworCWlmIChuPjMpCisJCW49MzsKKwlpZiAobj09MykKKwl7CisJCWlmICghX1RJRkZtZW1jbXAodGlmLT50aWZfZGlyLnRkX3RyYW5zZmVyZnVuY3Rpb25bMF0sdGlmLT50aWZfZGlyLnRkX3RyYW5zZmVyZnVuY3Rpb25bMl0sbSpzaXplb2YodWludDE2KSkpCisJCQluPTI7CisJfQorCWlmIChuPT0yKQorCXsKKwkJaWYgKCFfVElGRm1lbWNtcCh0aWYtPnRpZl9kaXIudGRfdHJhbnNmZXJmdW5jdGlvblswXSx0aWYtPnRpZl9kaXIudGRfdHJhbnNmZXJmdW5jdGlvblsxXSxtKnNpemVvZih1aW50MTYpKSkKKwkJCW49MTsKKwl9CisJaWYgKG49PTApCisJCW49MTsKKwlvPV9USUZGbWFsbG9jKG4qbSpzaXplb2YodWludDE2KSk7CisJaWYgKG89PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlfVElGRm1lbWNweSgmb1swXSx0aWYtPnRpZl9kaXIudGRfdHJhbnNmZXJmdW5jdGlvblswXSxtKnNpemVvZih1aW50MTYpKTsKKwlpZiAobj4xKQorCQlfVElGRm1lbWNweSgmb1ttXSx0aWYtPnRpZl9kaXIudGRfdHJhbnNmZXJmdW5jdGlvblsxXSxtKnNpemVvZih1aW50MTYpKTsKKwlpZiAobj4yKQorCQlfVElGRm1lbWNweSgmb1syKm1dLHRpZi0+dGlmX2Rpci50ZF90cmFuc2ZlcmZ1bmN0aW9uWzJdLG0qc2l6ZW9mKHVpbnQxNikpOworCXA9VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0QXJyYXkodGlmLG5kaXIsZGlyLFRJRkZUQUdfVFJBTlNGRVJGVU5DVElPTixuKm0sbyk7CisJX1RJRkZmcmVlKG8pOworCXJldHVybihwKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU3ViaWZkKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpcikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdTdWJpZmQiOworCXVpbnQ2NCBtOworCWludCBuOworCWlmICh0aWYtPnRpZl9kaXIudGRfbnN1YmlmZD09MCkKKwkJcmV0dXJuKDEpOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT10aWYtPnRpZl9kYXRhb2ZmOworCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJeworCQl1aW50MzIqIG87CisJCXVpbnQ2NCogcGE7CisJCXVpbnQzMiogcGI7CisJCXVpbnQxNiBwOworCQlvPV9USUZGbWFsbG9jKHRpZi0+dGlmX2Rpci50ZF9uc3ViaWZkKnNpemVvZih1aW50MzIpKTsKKwkJaWYgKG89PU5VTEwpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQkJcmV0dXJuKDApOworCQl9CisJCXBhPXRpZi0+dGlmX2Rpci50ZF9zdWJpZmQ7CisJCXBiPW87CisJCWZvciAocD0wOyBwIDwgdGlmLT50aWZfZGlyLnRkX25zdWJpZmQ7IHArKykKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHBhICE9IDApOworCQkJYXNzZXJ0KCpwYSA8PSAweEZGRkZGRkZGVUwpOworCQkJKnBiKys9KHVpbnQzMikoKnBhKyspOworCQl9CisJCW49VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZElmZEFycmF5KHRpZixuZGlyLGRpcixUSUZGVEFHX1NVQklGRCx0aWYtPnRpZl9kaXIudGRfbnN1YmlmZCxvKTsKKwkJX1RJRkZmcmVlKG8pOworCX0KKwllbHNlCisJCW49VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZElmZDhBcnJheSh0aWYsbmRpcixkaXIsVElGRlRBR19TVUJJRkQsdGlmLT50aWZfZGlyLnRkX25zdWJpZmQsdGlmLT50aWZfZGlyLnRkX3N1YmlmZCk7CisJaWYgKCFuKQorCQlyZXR1cm4oMCk7CisJLyoKKwkgKiBUb3RhbCBoYWNrOiBpZiB0aGlzIGRpcmVjdG9yeSBpbmNsdWRlcyBhIFN1YklGRAorCSAqIHRhZyB0aGVuIGZvcmNlIHRoZSBuZXh0IDxuPiBkaXJlY3RvcmllcyB0byBiZQorCSAqIHdyaXR0ZW4gYXMgYGBzdWIgZGlyZWN0b3JpZXMnJyBvZiB0aGlzIG9uZS4gIFRoaXMKKwkgKiBpcyB1c2VkIHRvIHdyaXRlIHRoaW5ncyBsaWtlIHRodW1ibmFpbHMgYW5kCisJICogaW1hZ2UgbWFza3MgdGhhdCBvbmUgd2FudHMgdG8ga2VlcCBvdXQgb2YgdGhlCisJICogbm9ybWFsIGRpcmVjdG9yeSBsaW5rYWdlIGFjY2VzcyBtZWNoYW5pc20uCisJICovCisJdGlmLT50aWZfZmxhZ3N8PVRJRkZfSU5TVUJJRkQ7CisJdGlmLT50aWZfbnN1YmlmZD10aWYtPnRpZl9kaXIudGRfbnN1YmlmZDsKKwlpZiAodGlmLT50aWZfZGlyLnRkX25zdWJpZmQ9PTEpCisJCXRpZi0+dGlmX3N1YmlmZG9mZj0wOworCWVsc2UKKwkJdGlmLT50aWZfc3ViaWZkb2ZmPW07CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQXNjaWkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGNoYXIqIHZhbHVlKQoreworCWFzc2VydChzaXplb2YoY2hhcik9PTEpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9BU0NJSSxjb3VudCxjb3VudCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkVW5kZWZpbmVkQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSkKK3sKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ4KT09MSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1VOREVGSU5FRCxjb3VudCxjb3VudCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ4IHZhbHVlKQoreworCWFzc2VydChzaXplb2YodWludDgpPT0xKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfQllURSwxLDEsJnZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEJ5dGVBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDgqIHZhbHVlKQoreworCWFzc2VydChzaXplb2YodWludDgpPT0xKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfQllURSxjb3VudCxjb3VudCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2J5dGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQ4IHZhbHVlKQoreworCWFzc2VydChzaXplb2YoaW50OCk9PTEpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TQllURSwxLDEsJnZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNieXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDgqIHZhbHVlKQoreworCWFzc2VydChzaXplb2YoaW50OCk9PTEpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TQllURSxjb3VudCxjb3VudCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgdmFsdWUpCit7CisJdWludDE2IG07CisJYXNzZXJ0KHNpemVvZih1aW50MTYpPT0yKTsKKwltPXZhbHVlOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiU2hvcnQoJm0pOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TSE9SVCwxLDIsJm0pKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQxNiogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4ODAwMDAwMDApOworCWFzc2VydChzaXplb2YodWludDE2KT09Mik7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mU2hvcnQodmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TSE9SVCxjb3VudCxjb3VudCoyLHZhbHVlKSk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTc2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQxNiB2YWx1ZSkKK3sKKwlpbnQxNiBtOworCWFzc2VydChzaXplb2YoaW50MTYpPT0yKTsKKwltPXZhbHVlOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopKCZtKSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1NTSE9SVCwxLDIsJm0pKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3Nob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDE2KiB2YWx1ZSkKK3sKKwlhc3NlcnQoY291bnQ8MHg4MDAwMDAwMCk7CisJYXNzZXJ0KHNpemVvZihpbnQxNik9PTIpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZlNob3J0KCh1aW50MTYqKXZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU1NIT1JULGNvdW50LGNvdW50KjIsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmcoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgdmFsdWUpCit7CisJdWludDMyIG07CisJYXNzZXJ0KHNpemVvZih1aW50MzIpPT00KTsKKwltPXZhbHVlOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZygmbSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0xPTkcsMSw0LCZtKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQzMiogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4NDAwMDAwMDApOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mTG9uZyh2YWx1ZSxjb3VudCk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0xPTkcsY291bnQsY291bnQqNCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmcoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQzMiB2YWx1ZSkKK3sKKwlpbnQzMiBtOworCWFzc2VydChzaXplb2YoaW50MzIpPT00KTsKKwltPXZhbHVlOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZygodWludDMyKikoJm0pKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0xPTkcsMSw0LCZtKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDMyKiB2YWx1ZSkKK3sKKwlhc3NlcnQoY291bnQ8MHg0MDAwMDAwMCk7CisJYXNzZXJ0KHNpemVvZihpbnQzMik9PTQpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcoKHVpbnQzMiopdmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TTE9ORyxjb3VudCxjb3VudCo0LHZhbHVlKSk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ2NCB2YWx1ZSkKK3sKKwl1aW50NjQgbTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydCh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpOworCW09dmFsdWU7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJMb25nOCgmbSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0xPTkc4LDEsOCwmbSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDIwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydCh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmc4KHZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfTE9ORzgsY291bnQsY291bnQqOCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmc4KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50NjQgdmFsdWUpCit7CisJaW50NjQgbTsKKwlhc3NlcnQoc2l6ZW9mKGludDY0KT09OCk7CisJYXNzZXJ0KHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRik7CisJbT12YWx1ZTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmc4KCh1aW50NjQqKSgmbSkpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TTE9ORzgsMSw4LCZtKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQ2NCogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4MjAwMDAwMDApOworCWFzc2VydChzaXplb2YoaW50NjQpPT04KTsKKwlhc3NlcnQodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZMb25nOCgodWludDY0Kil2YWx1ZSxjb3VudCk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1NMT05HOCxjb3VudCxjb3VudCo4LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRSYXRpb25hbChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSkKK3sKKwl1aW50MzIgbVsyXTsKKwlhc3NlcnQodmFsdWU+PTAuMCk7CisJYXNzZXJ0KHNpemVvZih1aW50MzIpPT00KTsKKwlpZiAodmFsdWU8PTAuMCkKKwl7CisJCW1bMF09MDsKKwkJbVsxXT0xOworCX0KKwllbHNlIGlmICh2YWx1ZT09KGRvdWJsZSkodWludDMyKXZhbHVlKQorCXsKKwkJbVswXT0odWludDMyKXZhbHVlOworCQltWzFdPTE7CisJfQorCWVsc2UgaWYgKHZhbHVlPDEuMCkKKwl7CisJCW1bMF09KHVpbnQzMikodmFsdWUqMHhGRkZGRkZGRik7CisJCW1bMV09MHhGRkZGRkZGRjsKKwl9CisJZWxzZQorCXsKKwkJbVswXT0weEZGRkZGRkZGOworCQltWzFdPSh1aW50MzIpKDB4RkZGRkZGRkYvdmFsdWUpOworCX0KKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCXsKKwkJVElGRlN3YWJMb25nKCZtWzBdKTsKKwkJVElGRlN3YWJMb25nKCZtWzFdKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1JBVElPTkFMLDEsOCwmbVswXSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRSYXRpb25hbEFycmF5IjsKKwl1aW50MzIqIG07CisJZmxvYXQqIG5hOworCXVpbnQzMiogbmI7CisJdWludDMyIG5jOworCWludCBvOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJbT1fVElGRm1hbGxvYyhjb3VudCoyKnNpemVvZih1aW50MzIpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9dmFsdWUsIG5iPW0sIG5jPTA7IG5jPGNvdW50OyBuYSsrLCBuYis9MiwgbmMrKykKKwl7CisJCWlmICgqbmE8PTAuMCkKKwkJeworCQkJbmJbMF09MDsKKwkJCW5iWzFdPTE7CisJCX0KKwkJZWxzZSBpZiAoKm5hPT0oZmxvYXQpKHVpbnQzMikoKm5hKSkKKwkJeworCQkJbmJbMF09KHVpbnQzMikoKm5hKTsKKwkJCW5iWzFdPTE7CisJCX0KKwkJZWxzZSBpZiAoKm5hPDEuMCkKKwkJeworCQkJbmJbMF09KHVpbnQzMikoKCpuYSkqMHhGRkZGRkZGRik7CisJCQluYlsxXT0weEZGRkZGRkZGOworCQl9CisJCWVsc2UKKwkJeworCQkJbmJbMF09MHhGRkZGRkZGRjsKKwkJCW5iWzFdPSh1aW50MzIpKDB4RkZGRkZGRkYvKCpuYSkpOworCQl9CisJfQorCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcobSxjb3VudCoyKTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1JBVElPTkFMLGNvdW50LGNvdW50KjgsJm1bMF0pOworCV9USUZGZnJlZShtKTsKKwlyZXR1cm4obyk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTcmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTcmF0aW9uYWxBcnJheSI7CisJaW50MzIqIG07CisJZmxvYXQqIG5hOworCWludDMyKiBuYjsKKwl1aW50MzIgbmM7CisJaW50IG87CisJYXNzZXJ0KHNpemVvZihpbnQzMik9PTQpOworCW09X1RJRkZtYWxsb2MoY291bnQqMipzaXplb2YoaW50MzIpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9dmFsdWUsIG5iPW0sIG5jPTA7IG5jPGNvdW50OyBuYSsrLCBuYis9MiwgbmMrKykKKwl7CisJCWlmICgqbmE8MC4wKQorCQl7CisJCQlpZiAoKm5hPT0oaW50MzIpKCpuYSkpCisJCQl7CisJCQkJbmJbMF09KGludDMyKSgqbmEpOworCQkJCW5iWzFdPTE7CisJCQl9CisJCQllbHNlIGlmICgqbmE+LTEuMCkKKwkJCXsKKwkJCQluYlswXT0tKGludDMyKSgoLSpuYSkqMHg3RkZGRkZGRik7CisJCQkJbmJbMV09MHg3RkZGRkZGRjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluYlswXT0tMHg3RkZGRkZGRjsKKwkJCQluYlsxXT0oaW50MzIpKDB4N0ZGRkZGRkYvKC0qbmEpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgqbmE9PShpbnQzMikoKm5hKSkKKwkJCXsKKwkJCQluYlswXT0oaW50MzIpKCpuYSk7CisJCQkJbmJbMV09MTsKKwkJCX0KKwkJCWVsc2UgaWYgKCpuYTwxLjApCisJCQl7CisJCQkJbmJbMF09KGludDMyKSgoKm5hKSoweDdGRkZGRkZGKTsKKwkJCQluYlsxXT0weDdGRkZGRkZGOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW5iWzBdPTB4N0ZGRkZGRkY7CisJCQkJbmJbMV09KGludDMyKSgweDdGRkZGRkZGLygqbmEpKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZMb25nKCh1aW50MzIqKW0sY291bnQqMik7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TUkFUSU9OQUwsY291bnQsY291bnQqOCwmbVswXSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEZsb2F0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZmxvYXQgdmFsdWUpCit7CisJZmxvYXQgbTsKKwlhc3NlcnQoc2l6ZW9mKGZsb2F0KT09NCk7CisJbT12YWx1ZTsKKwlUSUZGQ3Z0TmF0aXZlVG9JRUVFRmxvYXQodGlmLDEsJm0pOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiRmxvYXQoJm0pOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9GTE9BVCwxLDQsJm0pKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRmxvYXRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDQwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKGZsb2F0KT09NCk7CisJVElGRkN2dE5hdGl2ZVRvSUVFRUZsb2F0KHRpZixjb3VudCwmdmFsdWUpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkZsb2F0KHZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfRkxPQVQsY291bnQsY291bnQqNCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRG91YmxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKQoreworCWRvdWJsZSBtOworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJbT12YWx1ZTsKKwlUSUZGQ3Z0TmF0aXZlVG9JRUVFRG91YmxlKHRpZiwxLCZtKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkRvdWJsZSgmbSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0RPVUJMRSwxLDgsJm0pKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRG91YmxlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGRvdWJsZSogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4MjAwMDAwMDApOworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJVElGRkN2dE5hdGl2ZVRvSUVFRURvdWJsZSh0aWYsY291bnQsJnZhbHVlKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZEb3VibGUodmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9ET1VCTEUsY291bnQsY291bnQqOCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQzMiogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4NDAwMDAwMDApOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mTG9uZyh2YWx1ZSxjb3VudCk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0lGRCxjb3VudCxjb3VudCo0LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmQ4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4MjAwMDAwMDApOworCWFzc2VydChzaXplb2YodWludDY0KT09OCk7CisJYXNzZXJ0KHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRik7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mTG9uZzgodmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9JRkQ4LGNvdW50LGNvdW50KjgsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQxNiBkYXRhdHlwZSwgdWludDMyIGNvdW50LCB1aW50MzIgZGF0YWxlbmd0aCwgdm9pZCogZGF0YSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhIjsKKwl1aW50MzIgbTsKKwltPTA7CisJd2hpbGUgKG08KCpuZGlyKSkKKwl7CisJCWFzc2VydChkaXJbbV0udGRpcl90YWchPXRhZyk7CisJCWlmIChkaXJbbV0udGRpcl90YWc+dGFnKQorCQkJYnJlYWs7CisJCW0rKzsKKwl9CisJaWYgKG08KCpuZGlyKSkKKwl7CisJCXVpbnQzMiBuOworCQlmb3IgKG49Km5kaXI7IG4+bTsgbi0tKQorCQkJZGlyW25dPWRpcltuLTFdOworCX0KKwlkaXJbbV0udGRpcl90YWc9dGFnOworCWRpclttXS50ZGlyX3R5cGU9ZGF0YXR5cGU7CisJZGlyW21dLnRkaXJfY291bnQ9Y291bnQ7CisJZGlyW21dLnRkaXJfb2Zmc2V0LnRvZmZfbG9uZzggPSAwOworCWlmIChkYXRhbGVuZ3RoPD0oKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRik/MHg4VToweDRVKSkKKwkJX1RJRkZtZW1jcHkoJmRpclttXS50ZGlyX29mZnNldCxkYXRhLGRhdGFsZW5ndGgpOworCWVsc2UKKwl7CisJCXVpbnQ2NCBuYSxuYjsKKwkJbmE9dGlmLT50aWZfZGF0YW9mZjsKKwkJbmI9bmErZGF0YWxlbmd0aDsKKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCW5iPSh1aW50MzIpbmI7CisJCWlmICgobmI8bmEpfHwobmI8ZGF0YWxlbmd0aCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiTWF4aW11bSBUSUZGIGZpbGUgc2l6ZSBleGNlZWRlZCIpOworCQkJcmV0dXJuKDApOworCQl9CisJCWlmICghU2Vla09LKHRpZixuYSkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSU8gZXJyb3Igd3JpdGluZyB0YWcgZGF0YSIpOworCQkJcmV0dXJuKDApOworCQl9CisJCWFzc2VydChkYXRhbGVuZ3RoPDB4ODAwMDAwMDBVTCk7CisJCWlmICghV3JpdGVPSyh0aWYsZGF0YSwodG1zaXplX3QpZGF0YWxlbmd0aCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSU8gZXJyb3Igd3JpdGluZyB0YWcgZGF0YSIpOworCQkJcmV0dXJuKDApOworCQl9CisJCXRpZi0+dGlmX2RhdGFvZmY9bmI7CisJCWlmICh0aWYtPnRpZl9kYXRhb2ZmJjEpCisJCQl0aWYtPnRpZl9kYXRhb2ZmKys7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCXVpbnQzMiBvOworCQkJbz0odWludDMyKW5hOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoJm8pOworCQkJX1RJRkZtZW1jcHkoJmRpclttXS50ZGlyX29mZnNldCwmbyw0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRpclttXS50ZGlyX29mZnNldC50b2ZmX2xvbmc4ID0gbmE7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJmRpclttXS50ZGlyX29mZnNldC50b2ZmX2xvbmc4KTsKKwkJfQorCX0KKwkoKm5kaXIpKys7CisJcmV0dXJuKDEpOworfQorCisvKgorICogTGluayB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW50byB0aGUgZGlyZWN0b3J5IGNoYWluIGZvciB0aGUgZmlsZS4KKyAqLworc3RhdGljIGludAorVElGRkxpbmtEaXJlY3RvcnkoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZMaW5rRGlyZWN0b3J5IjsKKworCXRpZi0+dGlmX2Rpcm9mZiA9IChUSUZGU2Vla0ZpbGUodGlmLDAsU0VFS19FTkQpKzEpICZ+IDE7CisKKwkvKgorCSAqIEhhbmRsZSBTdWJJRkRzCisJICovCisJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9JTlNVQklGRCkKKwl7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCXVpbnQzMiBtOworCQkJbSA9ICh1aW50MzIpdGlmLT50aWZfZGlyb2ZmOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygmbSk7CisJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwgdGlmLT50aWZfc3ViaWZkb2ZmLCBTRUVLX1NFVCk7CisJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgNCkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgU3ViSUZEIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IFN1YklGRCBvciwgaWYgdGhpcyBpcworCQkJICogdGhlIGxhc3Qgb25lIGNvbmZpZ3VyZWQsIHJldmVydCBiYWNrIHRvIHRoZQorCQkJICogbm9ybWFsIGRpcmVjdG9yeSBsaW5rYWdlLgorCQkJICovCisJCQlpZiAoLS10aWYtPnRpZl9uc3ViaWZkKQorCQkJCXRpZi0+dGlmX3N1YmlmZG9mZiArPSA0OworCQkJZWxzZQorCQkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0lOU1VCSUZEOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXVpbnQ2NCBtOworCQkJbSA9IHRpZi0+dGlmX2Rpcm9mZjsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZtKTsKKwkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLCB0aWYtPnRpZl9zdWJpZmRvZmYsIFNFRUtfU0VUKTsKKwkJCWlmICghV3JpdGVPSyh0aWYsICZtLCA4KSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICAiRXJyb3Igd3JpdGluZyBTdWJJRkQgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJLyoKKwkJCSAqIEFkdmFuY2UgdG8gdGhlIG5leHQgU3ViSUZEIG9yLCBpZiB0aGlzIGlzCisJCQkgKiB0aGUgbGFzdCBvbmUgY29uZmlndXJlZCwgcmV2ZXJ0IGJhY2sgdG8gdGhlCisJCQkgKiBub3JtYWwgZGlyZWN0b3J5IGxpbmthZ2UuCisJCQkgKi8KKwkJCWlmICgtLXRpZi0+dGlmX25zdWJpZmQpCisJCQkJdGlmLT50aWZfc3ViaWZkb2ZmICs9IDg7CisJCQllbHNlCisJCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfSU5TVUJJRkQ7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwl7CisJCXVpbnQzMiBtOworCQl1aW50MzIgbmV4dGRpcjsKKwkJbSA9ICh1aW50MzIpKHRpZi0+dGlmX2Rpcm9mZik7CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCVRJRkZTd2FiTG9uZygmbSk7CisJCWlmICh0aWYtPnRpZl9oZWFkZXIuY2xhc3NpYy50aWZmX2Rpcm9mZiA9PSAwKSB7CisJCQkvKgorCQkJICogRmlyc3QgZGlyZWN0b3J5LCBvdmVyd3JpdGUgb2Zmc2V0IGluIGhlYWRlci4KKwkJCSAqLworCQkJdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmYgPSAodWludDMyKSB0aWYtPnRpZl9kaXJvZmY7CisJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiw0LCBTRUVLX1NFVCk7CisJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgNCkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkJICAgICAiRXJyb3Igd3JpdGluZyBUSUZGIGhlYWRlciIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlyZXR1cm4gKDEpOworCQl9CisJCS8qCisJCSAqIE5vdCB0aGUgZmlyc3QgZGlyZWN0b3J5LCBzZWFyY2ggdG8gdGhlIGxhc3QgYW5kIGFwcGVuZC4KKwkJICovCisJCW5leHRkaXIgPSB0aWYtPnRpZl9oZWFkZXIuY2xhc3NpYy50aWZmX2Rpcm9mZjsKKwkJd2hpbGUoMSkgeworCQkJdWludDE2IGRpcmNvdW50OworCQkJdWludDMyIG5leHRuZXh0ZGlyOworCisJCQlpZiAoIVNlZWtPSyh0aWYsIG5leHRkaXIpIHx8CisJCQkgICAgIVJlYWRPSyh0aWYsICZkaXJjb3VudCwgMikpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgY291bnQiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoJmRpcmNvdW50KTsKKwkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJICAgIG5leHRkaXIrMitkaXJjb3VudCoxMiwgU0VFS19TRVQpOworCQkJaWYgKCFSZWFkT0sodGlmLCAmbmV4dG5leHRkaXIsIDQpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygmbmV4dG5leHRkaXIpOworCQkJaWYgKG5leHRuZXh0ZGlyPT0wKQorCQkJeworCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBuZXh0ZGlyKzIrZGlyY291bnQqMTIsIFNFRUtfU0VUKTsKKwkJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgNCkpIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgbGluayIpOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCW5leHRkaXI9bmV4dG5leHRkaXI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdWludDY0IG07CisJCXVpbnQ2NCBuZXh0ZGlyOworCQltID0gdGlmLT50aWZfZGlyb2ZmOworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmc4KCZtKTsKKwkJaWYgKHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmYgPT0gMCkgeworCQkJLyoKKwkJCSAqIEZpcnN0IGRpcmVjdG9yeSwgb3ZlcndyaXRlIG9mZnNldCBpbiBoZWFkZXIuCisJCQkgKi8KKwkJCXRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmYgPSB0aWYtPnRpZl9kaXJvZmY7CisJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiw4LCBTRUVLX1NFVCk7CisJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgOCkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkJICAgICAiRXJyb3Igd3JpdGluZyBUSUZGIGhlYWRlciIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlyZXR1cm4gKDEpOworCQl9CisJCS8qCisJCSAqIE5vdCB0aGUgZmlyc3QgZGlyZWN0b3J5LCBzZWFyY2ggdG8gdGhlIGxhc3QgYW5kIGFwcGVuZC4KKwkJICovCisJCW5leHRkaXIgPSB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmOworCQl3aGlsZSgxKSB7CisJCQl1aW50NjQgZGlyY291bnQ2NDsKKwkJCXVpbnQxNiBkaXJjb3VudDsKKwkJCXVpbnQ2NCBuZXh0bmV4dGRpcjsKKworCQkJaWYgKCFTZWVrT0sodGlmLCBuZXh0ZGlyKSB8fAorCQkJICAgICFSZWFkT0sodGlmLCAmZGlyY291bnQ2NCwgOCkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgY291bnQiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJmRpcmNvdW50NjQpOworCQkJaWYgKGRpcmNvdW50NjQ+MHhGRkZGKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIlNhbml0eSBjaGVjayBvbiB0YWcgY291bnQgZmFpbGVkLCBsaWtlbHkgY29ycnVwdCBUSUZGIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWRpcmNvdW50PSh1aW50MTYpZGlyY291bnQ2NDsKKwkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJICAgIG5leHRkaXIrOCtkaXJjb3VudCoyMCwgU0VFS19TRVQpOworCQkJaWYgKCFSZWFkT0sodGlmLCAmbmV4dG5leHRkaXIsIDgpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJm5leHRuZXh0ZGlyKTsKKwkJCWlmIChuZXh0bmV4dGRpcj09MCkKKwkJCXsKKwkJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkgICAgbmV4dGRpcis4K2RpcmNvdW50KjIwLCBTRUVLX1NFVCk7CisJCQkJaWYgKCFXcml0ZU9LKHRpZiwgJm0sIDgpKSB7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQluZXh0ZGlyPW5leHRuZXh0ZGlyOworCQl9CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRlJld3JpdGVGaWVsZCgpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUmV3cml0ZSBhIGZpZWxkIGluIHRoZSBkaXJlY3Rvcnkgb24gZGlzayB3aXRob3V0IHJlZ2FyZCB0byAgICAgICovCisvKiAgICAgIHVwZGF0aW5nIHRoZSBUSUZGIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW4gbWVtb3J5LiAgQ3VycmVudGx5ICAgICAqLworLyogICAgICBvbmx5IHN1cHBvcnRlZCBmb3IgZmllbGQgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBvbi1kaXNrICAgICAgKi8KKy8qICAgICAgZGlyZWN0b3J5LiAgTWFpbmx5IHVzZWQgZm9yIHVwZGF0aW5nIHN0cmlwb2Zmc2V0IC8gICAgICAgICAgICAgICovCisvKiAgICAgIHN0cmlwYnl0ZWNvdW50IHZhbHVlcyBhZnRlciB0aGUgZGlyZWN0b3J5IGlzIGFscmVhZHkgb24gICAgICAgICAqLworLyogICAgICBkaXNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJldHVybnMgemVybyBvbiBmYWlsdXJlLCBhbmQgb25lIG9uIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitfVElGRlJld3JpdGVGaWVsZChUSUZGKiB0aWYsIHVpbnQxNiB0YWcsIFRJRkZEYXRhVHlwZSBpbl9kYXRhdHlwZSwgCisgICAgICAgICAgICAgICAgICB0bXNpemVfdCBjb3VudCwgdm9pZCogZGF0YSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmVzZXRGaWVsZCI7CisgICAgLyogY29uc3QgVElGRkZpZWxkKiBmaXAgPSBOVUxMOyAqLworICAgIHVpbnQxNiBkaXJjb3VudDsKKyAgICB0bXNpemVfdCBkaXJzaXplOworICAgIHVpbnQ4IGRpcmVudHJ5X3Jhd1syMF07CisgICAgdWludDE2IGVudHJ5X3RhZyA9IDA7CisgICAgdWludDE2IGVudHJ5X3R5cGUgPSAwOworICAgIHVpbnQ2NCBlbnRyeV9jb3VudCA9IDA7CisgICAgdWludDY0IGVudHJ5X29mZnNldCA9IDA7CisgICAgaW50ICAgIHZhbHVlX2luX2VudHJ5ID0gMDsKKyAgICB1aW50NjQgcmVhZF9vZmZzZXQ7CisgICAgdWludDggKmJ1Zl90b193cml0ZSA9IE5VTEw7CisgICAgVElGRkRhdGFUeXBlIGRhdGF0eXBlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBGaW5kIGZpZWxkIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLypmaXAgPSovIFRJRkZGaW5kRmllbGQodGlmLCB0YWcsIFRJRkZfQU5ZKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRG8gc29tZSBjaGVja2luZyB0aGlzIGlzIGEgc3RyYWlnaHQgZm9yd2FyZCBjYXNlLiAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmKCBpc01hcHBlZCh0aWYpICkKKyAgICB7CisgICAgICAgIFRJRkZFcnJvckV4dCggdGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IG1hcHBlZCBmaWxlcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24uIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiggdGlmLT50aWZfZGlyb2ZmID09IDAgKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KCB0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsIAorICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHJlc2V0IGZpZWxkIG9uIGRpcmVjdG9yeSBub3QgYWxyZWFkeSBvbiBkaXNrLiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBSZWFkIHRoZSBkaXJlY3RvcnkgZW50cnkgY291bnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgaWYgKCFTZWVrT0sodGlmLCB0aWYtPnRpZl9kaXJvZmYpKSB7CisgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IFNlZWsgZXJyb3IgYWNjZXNzaW5nIFRJRkYgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZWFkX29mZnNldCA9IHRpZi0+dGlmX2Rpcm9mZjsKKworICAgIGlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisgICAgeworICAgICAgICBpZiAoIVJlYWRPSyh0aWYsICZkaXJjb3VudCwgc2l6ZW9mICh1aW50MTYpKSkgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENhbiBub3QgcmVhZCBUSUZGIGRpcmVjdG9yeSBjb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYlNob3J0KCZkaXJjb3VudCk7CisgICAgICAgIGRpcnNpemUgPSAxMjsKKyAgICAgICAgcmVhZF9vZmZzZXQgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50NjQgZGlyY291bnQ2NDsKKyAgICAgICAgaWYgKCFSZWFkT0sodGlmLCAmZGlyY291bnQ2NCwgc2l6ZW9mICh1aW50NjQpKSkgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENhbiBub3QgcmVhZCBUSUZGIGRpcmVjdG9yeSBjb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKyAgICAgICAgZGlyY291bnQgPSAodWludDE2KWRpcmNvdW50NjQ7CisgICAgICAgIGRpcnNpemUgPSAyMDsKKyAgICAgICAgcmVhZF9vZmZzZXQgKz0gODsKKyAgICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIFJlYWQgdGhyb3VnaCBkaXJlY3RvcnkgdG8gZmluZCB0YXJnZXQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICB3aGlsZSggZGlyY291bnQgPiAwICkKKyAgICB7CisgICAgICAgIGlmICghUmVhZE9LKHRpZiwgZGlyZW50cnlfcmF3LCBkaXJzaXplKSkgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENhbiBub3QgcmVhZCBUSUZGIGRpcmVjdG9yeSBlbnRyeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoICZlbnRyeV90YWcsIGRpcmVudHJ5X3JhdyArIDAsIHNpemVvZih1aW50MTYpICk7CisgICAgICAgIGlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYlNob3J0KCAmZW50cnlfdGFnICk7CisKKyAgICAgICAgaWYoIGVudHJ5X3RhZyA9PSB0YWcgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcmVhZF9vZmZzZXQgKz0gZGlyc2l6ZTsKKyAgICB9CisKKyAgICBpZiggZW50cnlfdGFnICE9IHRhZyApCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgZmluZCB0YWcgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUsIHRhZyApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEV4dHJhY3QgdGhlIHR5cGUsIGNvdW50IGFuZCBvZmZzZXQgZm9yIHRoaXMgZW50cnkuICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBtZW1jcHkoICZlbnRyeV90eXBlLCBkaXJlbnRyeV9yYXcgKyAyLCBzaXplb2YodWludDE2KSApOworICAgIGlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisgICAgICAgIFRJRkZTd2FiU2hvcnQoICZlbnRyeV90eXBlICk7CisKKyAgICBpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorICAgIHsKKyAgICAgICAgdWludDMyIHZhbHVlOworICAgICAgICAKKyAgICAgICAgbWVtY3B5KCAmdmFsdWUsIGRpcmVudHJ5X3JhdyArIDQsIHNpemVvZih1aW50MzIpICk7CisgICAgICAgIGlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYkxvbmcoICZ2YWx1ZSApOworICAgICAgICBlbnRyeV9jb3VudCA9IHZhbHVlOworCisgICAgICAgIG1lbWNweSggJnZhbHVlLCBkaXJlbnRyeV9yYXcgKyA4LCBzaXplb2YodWludDMyKSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nKCAmdmFsdWUgKTsKKyAgICAgICAgZW50cnlfb2Zmc2V0ID0gdmFsdWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbWNweSggJmVudHJ5X2NvdW50LCBkaXJlbnRyeV9yYXcgKyA0LCBzaXplb2YodWludDY0KSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nOCggJmVudHJ5X2NvdW50ICk7CisKKyAgICAgICAgbWVtY3B5KCAmZW50cnlfb2Zmc2V0LCBkaXJlbnRyeV9yYXcgKyAxMiwgc2l6ZW9mKHVpbnQ2NCkgKTsKKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKyAgICAgICAgICAgIFRJRkZTd2FiTG9uZzgoICZlbnRyeV9vZmZzZXQgKTsKKyAgICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIFdoYXQgZGF0YSB0eXBlIGRvIHdlIHdhbnQgdG8gd3JpdGUgdGhpcyBhcz8gICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBpZiggVElGRkRhdGFXaWR0aChpbl9kYXRhdHlwZSkgPT0gOCAmJiAhKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikgKQorICAgIHsKKyAgICAgICAgaWYoIGluX2RhdGF0eXBlID09IFRJRkZfTE9ORzggKQorICAgICAgICAgICAgZGF0YXR5cGUgPSBUSUZGX0xPTkc7CisgICAgICAgIGVsc2UgaWYoIGluX2RhdGF0eXBlID09IFRJRkZfU0xPTkc4ICkKKyAgICAgICAgICAgIGRhdGF0eXBlID0gVElGRl9TTE9ORzsKKyAgICAgICAgZWxzZSBpZiggaW5fZGF0YXR5cGUgPT0gVElGRl9JRkQ4ICkKKyAgICAgICAgICAgIGRhdGF0eXBlID0gVElGRl9JRkQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRhdGF0eXBlID0gaW5fZGF0YXR5cGU7CisgICAgfQorICAgIGVsc2UgCisgICAgICAgIGRhdGF0eXBlID0gaW5fZGF0YXR5cGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIFByZXBhcmUgYnVmZmVyIG9mIGFjdHVhbCBkYXRhIHRvIHdyaXRlLiAgVGhpcyBpbmNsdWRlcyAgICAgICAgICAqLworLyogICAgICBzd2FiYmluZyBhcyBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgYnVmX3RvX3dyaXRlID0KKwkgICAgKHVpbnQ4ICopX1RJRkZDaGVja01hbGxvYyh0aWYsIGNvdW50LCBUSUZGRGF0YVdpZHRoKGRhdGF0eXBlKSwKKwkJCQkgICAgICAiZm9yIGZpZWxkIGJ1ZmZlci4iKTsKKyAgICBpZiAoIWJ1Zl90b193cml0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiggZGF0YXR5cGUgPT0gaW5fZGF0YXR5cGUgKQorICAgICAgICBtZW1jcHkoIGJ1Zl90b193cml0ZSwgZGF0YSwgY291bnQgKiBUSUZGRGF0YVdpZHRoKGRhdGF0eXBlKSApOworICAgIGVsc2UgaWYoIGRhdGF0eXBlID09IFRJRkZfU0xPTkcgJiYgaW5fZGF0YXR5cGUgPT0gVElGRl9TTE9ORzggKQorICAgIHsKKwl0bXNpemVfdCBpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgKChpbnQzMiAqKSBidWZfdG9fd3JpdGUpW2ldID0gCisgICAgICAgICAgICAgICAgKGludDMyKSAoKGludDY0ICopIGRhdGEpW2ldOworICAgICAgICAgICAgaWYoIChpbnQ2NCkgKChpbnQzMiAqKSBidWZfdG9fd3JpdGUpW2ldICE9ICgoaW50NjQgKikgZGF0YSlbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9USUZGZnJlZSggYnVmX3RvX3dyaXRlICk7CisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KCB0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIGV4Y2VlZHMgMzJiaXQgcmFuZ2Ugb2Ygb3V0cHV0IHR5cGUuIiApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIChkYXRhdHlwZSA9PSBUSUZGX0xPTkcgJiYgaW5fZGF0YXR5cGUgPT0gVElGRl9MT05HOCkKKyAgICAgICAgICAgICB8fCAoZGF0YXR5cGUgPT0gVElGRl9JRkQgJiYgaW5fZGF0YXR5cGUgPT0gVElGRl9JRkQ4KSApCisgICAgeworCXRtc2l6ZV90IGk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICAoKHVpbnQzMiAqKSBidWZfdG9fd3JpdGUpW2ldID0gCisgICAgICAgICAgICAgICAgKHVpbnQzMikgKCh1aW50NjQgKikgZGF0YSlbaV07CisgICAgICAgICAgICBpZiggKHVpbnQ2NCkgKCh1aW50MzIgKikgYnVmX3RvX3dyaXRlKVtpXSAhPSAoKHVpbnQ2NCAqKSBkYXRhKVtpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX1RJRkZmcmVlKCBidWZfdG9fd3JpdGUgKTsKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQoIHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgZXhjZWVkcyAzMmJpdCByYW5nZSBvZiBvdXRwdXQgdHlwZS4iICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggVElGRkRhdGFXaWR0aChkYXRhdHlwZSkgPiAxICYmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpICkKKyAgICB7CisgICAgICAgIGlmKCBUSUZGRGF0YVdpZHRoKGRhdGF0eXBlKSA9PSAyICkKKyAgICAgICAgICAgIFRJRkZTd2FiQXJyYXlPZlNob3J0KCAodWludDE2ICopIGJ1Zl90b193cml0ZSwgY291bnQgKTsKKyAgICAgICAgZWxzZSBpZiggVElGRkRhdGFXaWR0aChkYXRhdHlwZSkgPT0gNCApCisgICAgICAgICAgICBUSUZGU3dhYkFycmF5T2ZMb25nKCAodWludDMyICopIGJ1Zl90b193cml0ZSwgY291bnQgKTsKKyAgICAgICAgZWxzZSBpZiggVElGRkRhdGFXaWR0aChkYXRhdHlwZSkgPT0gOCApCisgICAgICAgICAgICBUSUZGU3dhYkFycmF5T2ZMb25nOCggKHVpbnQ2NCAqKSBidWZfdG9fd3JpdGUsIGNvdW50ICk7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBJcyB0aGlzIGEgdmFsdWUgdGhhdCBmaXRzIGludG8gdGhlIGRpcmVjdG9yeSBlbnRyeT8gICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKyAgICB7CisgICAgICAgIGlmKCBUSUZGRGF0YVdpZHRoKGRhdGF0eXBlKSAqIGNvdW50IDw9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyeV9vZmZzZXQgPSByZWFkX29mZnNldCArIDg7CisgICAgICAgICAgICB2YWx1ZV9pbl9lbnRyeSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIFRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpICogY291bnQgPD0gOCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudHJ5X29mZnNldCA9IHJlYWRfb2Zmc2V0ICsgMTI7CisgICAgICAgICAgICB2YWx1ZV9pbl9lbnRyeSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIElmIHRoZSB0YWcgdHlwZSwgYW5kIGNvdW50IG1hdGNoLCB0aGVuIHdlIGp1c3Qgd3JpdGUgaXQgb3V0ICAgICAqLworLyogICAgICBvdmVyIHRoZSBvbGQgdmFsdWVzIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIGRpcmVjdG9yeSBlbnRyeSBhdCAgICAgKi8KKy8qICAgICAgYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmKCBlbnRyeV9jb3VudCA9PSAodWludDY0KWNvdW50ICYmIGVudHJ5X3R5cGUgPT0gKHVpbnQxNikgZGF0YXR5cGUgKQorICAgIHsKKyAgICAgICAgaWYgKCFTZWVrT0sodGlmLCBlbnRyeV9vZmZzZXQpKSB7CisgICAgICAgICAgICBfVElGRmZyZWUoIGJ1Zl90b193cml0ZSApOworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFNlZWsgZXJyb3IgYWNjZXNzaW5nIFRJRkYgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghV3JpdGVPSyh0aWYsIGJ1Zl90b193cml0ZSwgY291bnQqVElGRkRhdGFXaWR0aChkYXRhdHlwZSkpKSB7CisgICAgICAgICAgICBfVElGRmZyZWUoIGJ1Zl90b193cml0ZSApOworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgbGluayIpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIF9USUZGZnJlZSggYnVmX3RvX3dyaXRlICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgT3RoZXJ3aXNlLCB3ZSB3cml0ZSB0aGUgbmV3IHRhZyBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmKCAhdmFsdWVfaW5fZW50cnkgKQorICAgIHsKKyAgICAgICAgZW50cnlfb2Zmc2V0ID0gVElGRlNlZWtGaWxlKHRpZiwwLFNFRUtfRU5EKTsKKyAgICAgICAgCisgICAgICAgIGlmICghV3JpdGVPSyh0aWYsIGJ1Zl90b193cml0ZSwgY291bnQqVElGRkRhdGFXaWR0aChkYXRhdHlwZSkpKSB7CisgICAgICAgICAgICBfVElGRmZyZWUoIGJ1Zl90b193cml0ZSApOworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgbGluayIpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgX1RJRkZmcmVlKCBidWZfdG9fd3JpdGUgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtY3B5KCAmZW50cnlfb2Zmc2V0LCBidWZfdG9fd3JpdGUsIGNvdW50KlRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpKTsKKyAgICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEFkanVzdCB0aGUgZGlyZWN0b3J5IGVudHJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBlbnRyeV90eXBlID0gZGF0YXR5cGU7CisgICAgbWVtY3B5KCBkaXJlbnRyeV9yYXcgKyAyLCAmZW50cnlfdHlwZSwgc2l6ZW9mKHVpbnQxNikgKTsKKyAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICBUSUZGU3dhYlNob3J0KCAodWludDE2ICopIChkaXJlbnRyeV9yYXcgKyAyKSApOworCisgICAgaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKyAgICB7CisgICAgICAgIHVpbnQzMiB2YWx1ZTsKKworICAgICAgICB2YWx1ZSA9ICh1aW50MzIpIGVudHJ5X2NvdW50OworICAgICAgICBtZW1jcHkoIGRpcmVudHJ5X3JhdyArIDQsICZ2YWx1ZSwgc2l6ZW9mKHVpbnQzMikgKTsKKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKyAgICAgICAgICAgIFRJRkZTd2FiTG9uZyggKHVpbnQzMiAqKSAoZGlyZW50cnlfcmF3ICsgNCkgKTsKKworICAgICAgICB2YWx1ZSA9ICh1aW50MzIpIGVudHJ5X29mZnNldDsKKyAgICAgICAgbWVtY3B5KCBkaXJlbnRyeV9yYXcgKyA4LCAmdmFsdWUsIHNpemVvZih1aW50MzIpICk7CisgICAgICAgIGlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYkxvbmcoICh1aW50MzIgKikgKGRpcmVudHJ5X3JhdyArIDgpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbWNweSggZGlyZW50cnlfcmF3ICsgNCwgJmVudHJ5X2NvdW50LCBzaXplb2YodWludDY0KSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nOCggKHVpbnQ2NCAqKSAoZGlyZW50cnlfcmF3ICsgNCkgKTsKKworICAgICAgICBtZW1jcHkoIGRpcmVudHJ5X3JhdyArIDEyLCAmZW50cnlfb2Zmc2V0LCBzaXplb2YodWludDY0KSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nOCggKHVpbnQ2NCAqKSAoZGlyZW50cnlfcmF3ICsgMTIpICk7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBXcml0ZSB0aGUgZGlyZWN0b3J5IGVudHJ5IG91dCB0byBkaXNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgaWYgKCFTZWVrT0sodGlmLCByZWFkX29mZnNldCApKSB7CisgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IFNlZWsgZXJyb3IgYWNjZXNzaW5nIFRJRkYgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIVdyaXRlT0sodGlmLCBkaXJlbnRyeV9yYXcsZGlyc2l6ZSkpCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBDYW4gbm90IHdyaXRlIFRJRkYgZGlyZWN0b3J5IGVudHJ5LiIsCisgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiAxOworfQorLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2R1bXBtb2RlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9kdW1wbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWIwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9kdW1wbW9kZS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl9kdW1wbW9kZS5jLHYgMS4xNCAyMDExLTA0LTAyIDIwOjU0OjA5IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqICJOdWxsIiBDb21wcmVzc2lvbiBBbGdvcml0aG0gU3VwcG9ydC4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCitzdGF0aWMgaW50CitEdW1wRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBodW5rIG9mIHBpeGVscy4KKyAqLworc3RhdGljIGludAorRHVtcE1vZGVFbmNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwkodm9pZCkgczsKKwl3aGlsZSAoY2MgPiAwKSB7CisJCXRtc2l6ZV90IG47CisKKwkJbiA9IGNjOworCQlpZiAodGlmLT50aWZfcmF3Y2MgKyBuID4gdGlmLT50aWZfcmF3ZGF0YXNpemUpCisJCQluID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKworCQlhc3NlcnQoIG4gPiAwICk7CisKKwkJLyoKKwkJICogQXZvaWQgY29weSBpZiBjbGllbnQgaGFzIHNldHVwIHJhdworCQkgKiBkYXRhIGJ1ZmZlciB0byBhdm9pZCBleHRyYSBjb3B5LgorCQkgKi8KKwkJaWYgKHRpZi0+dGlmX3Jhd2NwICE9IHBwKQorCQkJX1RJRkZtZW1jcHkodGlmLT50aWZfcmF3Y3AsIHBwLCBuKTsKKwkJdGlmLT50aWZfcmF3Y3AgKz0gbjsKKwkJdGlmLT50aWZfcmF3Y2MgKz0gbjsKKwkJcHAgKz0gbjsKKwkJY2MgLT0gbjsKKwkJaWYgKHRpZi0+dGlmX3Jhd2NjID49IHRpZi0+dGlmX3Jhd2RhdGFzaXplICYmCisJCSAgICAhVElGRkZsdXNoRGF0YTEodGlmKSkKKwkJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgaHVuayBvZiBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK0R1bXBNb2RlRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkR1bXBNb2RlRGVjb2RlIjsKKwkodm9pZCkgczsKKwlpZiAodGlmLT50aWZfcmF3Y2MgPCBjYykgeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisiTm90IGVub3VnaCBkYXRhIGZvciBzY2FubGluZSAlbHUsIGV4cGVjdGVkIGEgcmVxdWVzdCBmb3IgYXQgbW9zdCAlSTY0ZCBieXRlcywgZ290IGEgcmVxdWVzdCBmb3IgJUk2NGQgYnl0ZXMiLAorCQkgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJICAgICAgICAgICAgIChzaWduZWQgX19pbnQ2NCkgdGlmLT50aWZfcmF3Y2MsCisJCSAgICAgICAgICAgICAoc2lnbmVkIF9faW50NjQpIGNjKTsKKyNlbHNlCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisiTm90IGVub3VnaCBkYXRhIGZvciBzY2FubGluZSAlbHUsIGV4cGVjdGVkIGEgcmVxdWVzdCBmb3IgYXQgbW9zdCAlbGxkIGJ5dGVzLCBnb3QgYSByZXF1ZXN0IGZvciAlbGxkIGJ5dGVzIiwKKwkJICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCSAgICAgICAgICAgICAoc2lnbmVkIGxvbmcgbG9uZykgdGlmLT50aWZfcmF3Y2MsCisJCSAgICAgICAgICAgICAoc2lnbmVkIGxvbmcgbG9uZykgY2MpOworI2VuZGlmCisJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogQXZvaWQgY29weSBpZiBjbGllbnQgaGFzIHNldHVwIHJhdworCSAqIGRhdGEgYnVmZmVyIHRvIGF2b2lkIGV4dHJhIGNvcHkuCisJICovCisJaWYgKHRpZi0+dGlmX3Jhd2NwICE9IGJ1ZikKKwkJX1RJRkZtZW1jcHkoYnVmLCB0aWYtPnRpZl9yYXdjcCwgY2MpOworCXRpZi0+dGlmX3Jhd2NwICs9IGNjOworCXRpZi0+dGlmX3Jhd2NjIC09IGNjOyAgCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFNlZWsgZm9yd2FyZHMgbnJvd3MgaW4gdGhlIGN1cnJlbnQgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK0R1bXBNb2RlU2VlayhUSUZGKiB0aWYsIHVpbnQzMiBucm93cykKK3sKKwl0aWYtPnRpZl9yYXdjcCArPSBucm93cyAqIHRpZi0+dGlmX3NjYW5saW5lc2l6ZTsKKwl0aWYtPnRpZl9yYXdjYyAtPSBucm93cyAqIHRpZi0+dGlmX3NjYW5saW5lc2l6ZTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBkdW1wIG1vZGUuCisgKi8KK2ludAorVElGRkluaXREdW1wTW9kZShUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJKHZvaWQpIHNjaGVtZTsKKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBEdW1wRml4dXBUYWdzOyAgCisJdGlmLT50aWZfZGVjb2Rlcm93ID0gRHVtcE1vZGVEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBEdW1wTW9kZURlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gRHVtcE1vZGVEZWNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93ID0gRHVtcE1vZGVFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBEdW1wTW9kZUVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gRHVtcE1vZGVFbmNvZGU7IAorCXRpZi0+dGlmX3NlZWsgPSBEdW1wTW9kZVNlZWs7CisJcmV0dXJuICgxKTsKK30KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9lcnJvci5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ3OGMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZXJyb3IuYwpAQCAtMCwwICsxLDg1IEBACisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl9lcnJvci5jLHYgMS41IDIwMTAtMDMtMTAgMTg6NTY6NDggYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLypUSUZGRXJyb3JIYW5kbGVyRXh0IF9USUZGZXJyb3JIYW5kbGVyRXh0ID0gTlVMTDsqLworLyogTW9kaWZ5IGhlcmUgZm9yIHVzZSBfVElGRmVycm9ySGFuZGxlckV4dCBieSBTdW5saWFuZy5MaXUgMjAwOTA3MTUgKi8KK1RJRkZFcnJvckhhbmRsZXIgX1RJRkZlcnJvckhhbmRsZXIgPSBOVUxMOworCitUSUZGRXJyb3JIYW5kbGVyCitUSUZGU2V0RXJyb3JIYW5kbGVyKFRJRkZFcnJvckhhbmRsZXIgaGFuZGxlcikKK3sKKwlUSUZGRXJyb3JIYW5kbGVyIHByZXYgPSBfVElGRmVycm9ySGFuZGxlcjsKKwlfVElGRmVycm9ySGFuZGxlciA9IGhhbmRsZXI7CisJcmV0dXJuIChwcmV2KTsKK30KKworVElGRkVycm9ySGFuZGxlckV4dAorVElGRlNldEVycm9ySGFuZGxlckV4dChUSUZGRXJyb3JIYW5kbGVyRXh0IGhhbmRsZXIpCit7CisJVElGRkVycm9ySGFuZGxlckV4dCBwcmV2ID0gX1RJRkZlcnJvckhhbmRsZXJFeHQ7CisJX1RJRkZlcnJvckhhbmRsZXJFeHQgPSBoYW5kbGVyOworCXJldHVybiAocHJldik7Cit9CisKK3ZvaWQKK1RJRkZFcnJvcihjb25zdCBjaGFyKiBtb2R1bGUsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKF9USUZGZXJyb3JIYW5kbGVyKQorCQkoKl9USUZGZXJyb3JIYW5kbGVyKShtb2R1bGUsIGZtdCwgYXApOworCWlmIChfVElGRmVycm9ySGFuZGxlckV4dCkKKwkJKCpfVElGRmVycm9ySGFuZGxlckV4dCkoMCwgbW9kdWxlLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCit2b2lkCitUSUZGRXJyb3JFeHQodGhhbmRsZV90IGZkLCBjb25zdCBjaGFyKiBtb2R1bGUsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKF9USUZGZXJyb3JIYW5kbGVyKQorCQkoKl9USUZGZXJyb3JIYW5kbGVyKShtb2R1bGUsIGZtdCwgYXApOworCWlmIChfVElGRmVycm9ySGFuZGxlckV4dCkKKwkJKCpfVElGRmVycm9ySGFuZGxlckV4dCkoZmQsIG1vZHVsZSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2V4dGVuc2lvbi5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZXh0ZW5zaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0Y2Q3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2V4dGVuc2lvbi5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl9leHRlbnNpb24uYyx2IDEuNyAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIFZhcmlvdXMgcm91dGluZXMgc3VwcG9ydCBleHRlcm5hbCBleHRlbnNpb24gb2YgdGhlIHRhZyBzZXQsIGFuZCBvdGhlcgorICogYXBwbGljYXRpb24gZXh0ZW5zaW9uIGNhcGFiaWxpdGllcy4gCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworaW50IFRJRkZHZXRUYWdMaXN0Q291bnQoIFRJRkYgKnRpZiApCisKK3sKKyAgICBUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgCisgICAgcmV0dXJuIHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50OworfQorCit1aW50MzIgVElGRkdldFRhZ0xpc3RFbnRyeSggVElGRiAqdGlmLCBpbnQgdGFnX2luZGV4ICkKKworeworICAgIFRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworICAgIGlmKCB0YWdfaW5kZXggPCAwIHx8IHRhZ19pbmRleCA+PSB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudCApCisgICAgICAgIHJldHVybiAodWludDMyKSgtMSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdGQtPnRkX2N1c3RvbVZhbHVlc1t0YWdfaW5kZXhdLmluZm8tPmZpZWxkX3RhZzsKK30KKworLyoKKyoqIFRoaXMgcHJvdmlkZXMgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIFRJRkZUYWdNZXRob2RzIHdpdGhpbiB0aGUgVElGRgorKiogc3RydWN0dXJlIHRvIGFwcGxpY2F0aW9uIGNvZGUgd2l0aG91dCBnaXZpbmcgYWNjZXNzIHRvIHRoZSBwcml2YXRlCisqKiBUSUZGIHN0cnVjdHVyZS4KKyovCitUSUZGVGFnTWV0aG9kcyAqVElGRkFjY2Vzc1RhZ01ldGhvZHMoIFRJRkYgKnRpZiApCisKK3sKKyAgICByZXR1cm4gJih0aWYtPnRpZl90YWdtZXRob2RzKTsKK30KKwordm9pZCAqVElGRkdldENsaWVudEluZm8oIFRJRkYgKnRpZiwgY29uc3QgY2hhciAqbmFtZSApCisKK3sKKyAgICBUSUZGQ2xpZW50SW5mb0xpbmsgKmxpbmsgPSB0aWYtPnRpZl9jbGllbnRpbmZvOworCisgICAgd2hpbGUoIGxpbmsgIT0gTlVMTCAmJiBzdHJjbXAobGluay0+bmFtZSxuYW1lKSAhPSAwICkKKyAgICAgICAgbGluayA9IGxpbmstPm5leHQ7CisKKyAgICBpZiggbGluayAhPSBOVUxMICkKKyAgICAgICAgcmV0dXJuIGxpbmstPmRhdGE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUSUZGU2V0Q2xpZW50SW5mbyggVElGRiAqdGlmLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpuYW1lICkKKworeworICAgIFRJRkZDbGllbnRJbmZvTGluayAqbGluayA9IHRpZi0+dGlmX2NsaWVudGluZm87CisKKyAgICAvKgorICAgICoqIERvIHdlIGhhdmUgYW4gZXhpc3RpbmcgbGluayB3aXRoIHRoaXMgbmFtZT8gIElmIHNvLCBqdXN0CisgICAgKiogc2V0IGl0LgorICAgICovCisgICAgd2hpbGUoIGxpbmsgIT0gTlVMTCAmJiBzdHJjbXAobGluay0+bmFtZSxuYW1lKSAhPSAwICkKKyAgICAgICAgbGluayA9IGxpbmstPm5leHQ7CisKKyAgICBpZiggbGluayAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGxpbmstPmRhdGEgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAqKiBDcmVhdGUgYSBuZXcgbGluay4KKyAgICAqLworCisgICAgbGluayA9IChUSUZGQ2xpZW50SW5mb0xpbmsgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKFRJRkZDbGllbnRJbmZvTGluaykpOworICAgIGFzc2VydCAobGluayAhPSBOVUxMKTsKKyAgICBsaW5rLT5uZXh0ID0gdGlmLT50aWZfY2xpZW50aW5mbzsKKyAgICBsaW5rLT5uYW1lID0gKGNoYXIgKikgX1RJRkZtYWxsb2MoKHRtc2l6ZV90KShzdHJsZW4obmFtZSkrMSkpOworICAgIGFzc2VydCAobGluay0+bmFtZSAhPSBOVUxMKTsKKyAgICBzdHJjcHkobGluay0+bmFtZSwgbmFtZSk7CisgICAgbGluay0+ZGF0YSA9IGRhdGE7CisKKyAgICB0aWYtPnRpZl9jbGllbnRpbmZvID0gbGluazsKK30KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mYXgzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mYXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2YTNmNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2ZheDMuYwpAQCAtMCwwICsxLDE2MjUgQEAKKy8qICRJZDogdGlmX2ZheDMuYyx2IDEuNzQgMjAxMi0wNi0yMSAwMjowMTozMSBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIENDSVRUX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogQ0NJVFQgR3JvdXAgMyAoVC40KSBhbmQgR3JvdXAgNCAoVC42KSBDb21wcmVzc2lvbiBTdXBwb3J0LgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciBkZWNvZGluZyBhbmQgZW5jb2RpbmcgVElGRgorICogY29tcHJlc3Npb24gYWxnb3JpdGhtcyAyLCAzLCA0LCBhbmQgMzI3NzEuCisgKgorICogRGVjb2RlciBzdXBwb3J0IGlzIGRlcml2ZWQsIHdpdGggcGVybWlzc2lvbiwgZnJvbSB0aGUgY29kZQorICogaW4gRnJhbmsgQ3JpbmdsZSdzIHZpZXdmYXggcHJvZ3JhbTsKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTk1ICBGcmFuayBELiBDcmluZ2xlLgorICovCisjaW5jbHVkZSAidGlmX2ZheDMuaCIKKyNkZWZpbmUJRzNDT0RFUworI2luY2x1ZGUgInQ0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIENvbXByZXNzaW9uK2RlY29tcHJlc3Npb24gc3RhdGUgYmxvY2tzIGFyZQorICogZGVyaXZlZCBmcm9tIHRoaXMgYGBiYXNlIHN0YXRlJycgYmxvY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgICAgICByd19tb2RlOyAgICAgICAgICAgICAgICAvKiBPX1JET05MWSBmb3IgZGVjb2RlLCBlbHNlIGVuY29kZSAqLworCWludCAgICAgIG1vZGU7ICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGluZyBtb2RlICovCisJdG1zaXplX3Qgcm93Ynl0ZXM7ICAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gYSBkZWNvZGVkIHNjYW5saW5lICovCisJdWludDMyICAgcm93cGl4ZWxzOyAgICAgICAgICAgICAgLyogcGl4ZWxzIGluIGEgc2NhbmxpbmUgKi8KKworCXVpbnQxNiAgIGNsZWFuZmF4ZGF0YTsgICAgICAgICAgIC8qIENsZWFuRmF4RGF0YSB0YWcgKi8KKwl1aW50MzIgICBiYWRmYXhydW47ICAgICAgICAgICAgICAvKiBCYWRGYXhSdW4gdGFnICovCisJdWludDMyICAgYmFkZmF4bGluZXM7ICAgICAgICAgICAgLyogQmFkRmF4TGluZXMgdGFnICovCisJdWludDMyICAgZ3JvdXBvcHRpb25zOyAgICAgICAgICAgLyogR3JvdXAgMy80IG9wdGlvbnMgdGFnICovCisKKwlUSUZGVkdldE1ldGhvZCAgdmdldHBhcmVudDsgICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZCAgdnNldHBhcmVudDsgICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGUHJpbnRNZXRob2QgcHJpbnRkaXI7ICAgICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KK30gRmF4M0Jhc2VTdGF0ZTsKKyNkZWZpbmUJRmF4M1N0YXRlKHRpZikJCSgoRmF4M0Jhc2VTdGF0ZSopICh0aWYpLT50aWZfZGF0YSkKKwordHlwZWRlZiBlbnVtIHsgRzNfMUQsIEczXzJEIH0gVHRhZzsKK3R5cGVkZWYgc3RydWN0IHsKKwlGYXgzQmFzZVN0YXRlIGI7CisKKwkvKiBEZWNvZGVyIHN0YXRlIGluZm8gKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyKiBiaXRtYXA7CS8qIGJpdCByZXZlcnNhbCB0YWJsZSAqLworCXVpbnQzMglkYXRhOwkJCS8qIGN1cnJlbnQgaS9vIGJ5dGUvd29yZCAqLworCWludAliaXQ7CQkJLyogY3VycmVudCBpL28gYml0IGluIGJ5dGUgKi8KKwlpbnQJRU9MY250OwkJCS8qIGNvdW50IG9mIEVPTCBjb2RlcyByZWNvZ25pemVkICovCisJVElGRkZheEZpbGxGdW5jIGZpbGw7CQkvKiBmaWxsIHJvdXRpbmUgKi8KKwl1aW50MzIqCXJ1bnM7CQkJLyogYiZ3IHJ1bnMgZm9yIGN1cnJlbnQvcHJldmlvdXMgcm93ICovCisJdWludDMyKglyZWZydW5zOwkJLyogcnVucyBmb3IgcmVmZXJlbmNlIGxpbmUgKi8KKwl1aW50MzIqCWN1cnJ1bnM7CQkvKiBydW5zIGZvciBjdXJyZW50IGxpbmUgKi8KKworCS8qIEVuY29kZXIgc3RhdGUgaW5mbyAqLworCVR0YWcgICAgdGFnOwkJCS8qIGVuY29kaW5nIHN0YXRlICovCisJdW5zaWduZWQgY2hhcioJcmVmbGluZTsJLyogcmVmZXJlbmNlIGxpbmUgZm9yIDJkIGRlY29kaW5nICovCisJaW50CWs7CQkJLyogI3Jvd3MgbGVmdCB0aGF0IGNhbiBiZSAyZCBlbmNvZGVkICovCisJaW50CW1heGs7CQkJLyogbWF4ICNyb3dzIHRoYXQgY2FuIGJlIDJkIGVuY29kZWQgKi8KKworCWludCBsaW5lOworfSBGYXgzQ29kZWNTdGF0ZTsKKyNkZWZpbmUgRGVjb2RlclN0YXRlKHRpZikgKChGYXgzQ29kZWNTdGF0ZSopIEZheDNTdGF0ZSh0aWYpKQorI2RlZmluZSBFbmNvZGVyU3RhdGUodGlmKSAoKEZheDNDb2RlY1N0YXRlKikgRmF4M1N0YXRlKHRpZikpCisKKyNkZWZpbmUgaXMyREVuY29kaW5nKHNwKSAoc3AtPmIuZ3JvdXBvcHRpb25zICYgR1JPVVAzT1BUXzJERU5DT0RJTkcpCisjZGVmaW5lIGlzQWxpZ25lZChwLHQpICgoKChzaXplX3QpKHApKSAmIChzaXplb2YgKHQpLTEpKSA9PSAwKQorCisvKgorICogR3JvdXAgMyBhbmQgR3JvdXAgNCBEZWNvZGluZy4KKyAqLworCisvKgorICogVGhlc2UgbWFjcm9zIGdsdWUgdGhlIFRJRkYgbGlicmFyeSBzdGF0ZSB0bworICogdGhlIHN0YXRlIGV4cGVjdGVkIGJ5IEZyYW5rJ3MgZGVjb2Rlci4KKyAqLworI2RlZmluZQlERUNMQVJFX1NUQVRFKHRpZiwgc3AsIG1vZCkJCQkJCVwKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9IG1vZDsJCQkJCVwKKyAgICBGYXgzQ29kZWNTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsJCQkJXAorICAgIGludCBhMDsJCQkJLyogcmVmZXJlbmNlIGVsZW1lbnQgKi8JCVwKKyAgICBpbnQgbGFzdHggPSBzcC0+Yi5yb3dwaXhlbHM7CS8qIGxhc3QgZWxlbWVudCBpbiByb3cgKi8JXAorICAgIHVpbnQzMiBCaXRBY2M7CQkJLyogYml0IGFjY3VtdWxhdG9yICovCQlcCisgICAgaW50IEJpdHNBdmFpbDsJCQkvKiAjIHZhbGlkIGJpdHMgaW4gQml0QWNjICovCVwKKyAgICBpbnQgUnVuTGVuZ3RoOwkJCS8qIGxlbmd0aCBvZiBjdXJyZW50IHJ1biAqLwlcCisgICAgdW5zaWduZWQgY2hhciogY3A7CQkJLyogbmV4dCBieXRlIG9mIGlucHV0IGRhdGEgKi8JXAorICAgIHVuc2lnbmVkIGNoYXIqIGVwOwkJCS8qIGVuZCBvZiBpbnB1dCBkYXRhICovCQlcCisgICAgdWludDMyKiBwYTsJCQkJLyogcGxhY2UgdG8gc3R1ZmYgbmV4dCBydW4gKi8JXAorICAgIHVpbnQzMiogdGhpc3J1bjsJCQkvKiBjdXJyZW50IHJvdydzIHJ1biBhcnJheSAqLwlcCisgICAgaW50IEVPTGNudDsJCQkJLyogIyBFT0wgY29kZXMgcmVjb2duaXplZCAqLwlcCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogYml0bWFwID0gc3AtPmJpdG1hcDsJLyogaW5wdXQgZGF0YSBiaXQgcmV2ZXJzZXIgKi8JXAorICAgIGNvbnN0IFRJRkZGYXhUYWJFbnQqIFRhYkVudAorI2RlZmluZQlERUNMQVJFX1NUQVRFXzJEKHRpZiwgc3AsIG1vZCkJCQkJCVwKKyAgICBERUNMQVJFX1NUQVRFKHRpZiwgc3AsIG1vZCk7CQkJCQlcCisgICAgaW50IGIxOwkJCQkvKiBuZXh0IGNoYW5nZSBvbiBwcmV2IGxpbmUgKi8JXAorICAgIHVpbnQzMiogcGIJCQkJLyogbmV4dCBydW4gaW4gcmVmZXJlbmNlIGxpbmUgKi9cCisvKgorICogTG9hZCBhbnkgc3RhdGUgdGhhdCBtYXkgYmUgY2hhbmdlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KKyNkZWZpbmUJQ0FDSEVfU1RBVEUodGlmLCBzcCkgZG8gewkJCQkJXAorICAgIEJpdEFjYyA9IHNwLT5kYXRhOwkJCQkJCQlcCisgICAgQml0c0F2YWlsID0gc3AtPmJpdDsJCQkJCQlcCisgICAgRU9MY250ID0gc3AtPkVPTGNudDsJCQkJCQlcCisgICAgY3AgPSAodW5zaWduZWQgY2hhciopIHRpZi0+dGlmX3Jhd2NwOwkJCQlcCisgICAgZXAgPSBjcCArIHRpZi0+dGlmX3Jhd2NjOwkJCQkJCVwKK30gd2hpbGUgKDApCisvKgorICogU2F2ZSBzdGF0ZSBwb3NzaWJseSBjaGFuZ2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworI2RlZmluZQlVTkNBQ0hFX1NUQVRFKHRpZiwgc3ApIGRvIHsJCQkJCVwKKyAgICBzcC0+Yml0ID0gQml0c0F2YWlsOwkJCQkJCVwKKyAgICBzcC0+ZGF0YSA9IEJpdEFjYzsJCQkJCQkJXAorICAgIHNwLT5FT0xjbnQgPSBFT0xjbnQ7CQkJCQkJXAorICAgIHRpZi0+dGlmX3Jhd2NjIC09ICh0bXNpemVfdCkoKHVpbnQ4KikgY3AgLSB0aWYtPnRpZl9yYXdjcCk7CQlcCisgICAgdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBjcDsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBTZXR1cCBzdGF0ZSBmb3IgZGVjb2RpbmcgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorRmF4M1ByZURlY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCXNwLT5iaXQgPSAwOwkJCS8qIGZvcmNlIGluaXRpYWwgcmVhZCAqLworCXNwLT5kYXRhID0gMDsKKwlzcC0+RU9MY250ID0gMDsJCQkvKiBmb3JjZSBpbml0aWFsIHNjYW4gZm9yIEVPTCAqLworCS8qCisJICogRGVjb2RlciBhc3N1bWVzIGxzYi10by1tc2IgYml0IG9yZGVyLiAgTm90ZSB0aGF0IHdlIHNlbGVjdAorCSAqIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBGYXgzU2V0dXBTdGF0ZSBzbyB0aGF0IHZpZXdlcnMgY2FuCisJICogaG9sZCB0aGUgaW1hZ2Ugb3BlbiwgZmlkZGxlIHdpdGggdGhlIEZpbGxPcmRlciB0YWcgdmFsdWUsCisJICogYW5kIHRoZW4gcmUtZGVjb2RlIHRoZSBpbWFnZS4gIE90aGVyd2lzZSB0aGV5J2QgbmVlZCB0byBjbG9zZQorCSAqIGFuZCBvcGVuIHRoZSBpbWFnZSB0byBnZXQgdGhlIHN0YXRlIHJlc2V0LgorCSAqLworCXNwLT5iaXRtYXAgPQorCSAgICBUSUZGR2V0Qml0UmV2VGFibGUodGlmLT50aWZfZGlyLnRkX2ZpbGxvcmRlciAhPSBGSUxMT1JERVJfTFNCMk1TQik7CisJaWYgKHNwLT5yZWZydW5zKSB7CQkvKiBpbml0IHJlZmVyZW5jZSBsaW5lIHRvIHdoaXRlICovCisJCXNwLT5yZWZydW5zWzBdID0gKHVpbnQzMikgc3AtPmIucm93cGl4ZWxzOworCQlzcC0+cmVmcnVuc1sxXSA9IDA7CisJfQorCXNwLT5saW5lID0gMDsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogUm91dGluZSBmb3IgaGFuZGxpbmcgdmFyaW91cyBlcnJvcnMvY29uZGl0aW9ucy4KKyAqIE5vdGUgaG93IHRoZXkgYXJlICJnbHVlZCBpbnRvIHRoZSBkZWNvZGVyIiBieQorICogb3ZlcnJpZGluZyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgZGVjb2Rlci4KKyAqLworCitzdGF0aWMgdm9pZAorRmF4M1VuZXhwZWN0ZWQoY29uc3QgY2hhciogbW9kdWxlLCBUSUZGKiB0aWYsIHVpbnQzMiBsaW5lLCB1aW50MzIgYTApCit7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkJhZCBjb2RlIHdvcmQgYXQgbGluZSAldSBvZiAlcyAldSAoeCAldSkiLAorCSAgICBsaW5lLCBpc1RpbGVkKHRpZikgPyAidGlsZSIgOiAic3RyaXAiLAorCSAgICAoaXNUaWxlZCh0aWYpID8gdGlmLT50aWZfY3VydGlsZSA6IHRpZi0+dGlmX2N1cnN0cmlwKSwKKwkgICAgYTApOworfQorI2RlZmluZQl1bmV4cGVjdGVkKHRhYmxlLCBhMCkJRmF4M1VuZXhwZWN0ZWQobW9kdWxlLCB0aWYsIHNwLT5saW5lLCBhMCkKKworc3RhdGljIHZvaWQKK0ZheDNFeHRlbnNpb24oY29uc3QgY2hhciogbW9kdWxlLCBUSUZGKiB0aWYsIHVpbnQzMiBsaW5lLCB1aW50MzIgYTApCit7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkgICAgIlVuY29tcHJlc3NlZCBkYXRhIChub3Qgc3VwcG9ydGVkKSBhdCBsaW5lICV1IG9mICVzICV1ICh4ICV1KSIsCisJICAgIGxpbmUsIGlzVGlsZWQodGlmKSA/ICJ0aWxlIiA6ICJzdHJpcCIsCisJICAgIChpc1RpbGVkKHRpZikgPyB0aWYtPnRpZl9jdXJ0aWxlIDogdGlmLT50aWZfY3Vyc3RyaXApLAorCSAgICBhMCk7Cit9CisjZGVmaW5lCWV4dGVuc2lvbihhMCkJRmF4M0V4dGVuc2lvbihtb2R1bGUsIHRpZiwgc3AtPmxpbmUsIGEwKQorCitzdGF0aWMgdm9pZAorRmF4M0JhZExlbmd0aChjb25zdCBjaGFyKiBtb2R1bGUsIFRJRkYqIHRpZiwgdWludDMyIGxpbmUsIHVpbnQzMiBhMCwgdWludDMyIGxhc3R4KQoreworCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzIGF0IGxpbmUgJXUgb2YgJXMgJXUgKGdvdCAldSwgZXhwZWN0ZWQgJXUpIiwKKwkgICAgYTAgPCBsYXN0eCA/ICJQcmVtYXR1cmUgRU9MIiA6ICJMaW5lIGxlbmd0aCBtaXNtYXRjaCIsCisJICAgIGxpbmUsIGlzVGlsZWQodGlmKSA/ICJ0aWxlIiA6ICJzdHJpcCIsCisJICAgIChpc1RpbGVkKHRpZikgPyB0aWYtPnRpZl9jdXJ0aWxlIDogdGlmLT50aWZfY3Vyc3RyaXApLAorCSAgICBhMCwgbGFzdHgpOworfQorI2RlZmluZQliYWRsZW5ndGgoYTAsbGFzdHgpCUZheDNCYWRMZW5ndGgobW9kdWxlLCB0aWYsIHNwLT5saW5lLCBhMCwgbGFzdHgpCisKK3N0YXRpYyB2b2lkCitGYXgzUHJlbWF0dXJlRU9GKGNvbnN0IGNoYXIqIG1vZHVsZSwgVElGRiogdGlmLCB1aW50MzIgbGluZSwgdWludDMyIGEwKQoreworCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlByZW1hdHVyZSBFT0YgYXQgbGluZSAldSBvZiAlcyAldSAoeCAldSkiLAorCSAgICBsaW5lLCBpc1RpbGVkKHRpZikgPyAidGlsZSIgOiAic3RyaXAiLAorCSAgICAoaXNUaWxlZCh0aWYpID8gdGlmLT50aWZfY3VydGlsZSA6IHRpZi0+dGlmX2N1cnN0cmlwKSwKKwkgICAgYTApOworfQorI2RlZmluZQlwcmVtYXR1cmVFT0YoYTApCUZheDNQcmVtYXR1cmVFT0YobW9kdWxlLCB0aWYsIHNwLT5saW5lLCBhMCkKKworI2RlZmluZQlOb3AKKworLyoKKyAqIERlY29kZSB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBHMyAxRC1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNEZWNvZGUxRChUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJREVDTEFSRV9TVEFURSh0aWYsIHNwLCAiRmF4M0RlY29kZTFEIik7CisJKHZvaWQpIHM7CisJaWYgKG9jYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlDQUNIRV9TVEFURSh0aWYsIHNwKTsKKwl0aGlzcnVuID0gc3AtPmN1cnJ1bnM7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW47CisjaWZkZWYgRkFYM19ERUJVRworCQlwcmludGYoIlxuQml0QWNjPSUwOFgsIEJpdHNBdmFpbCA9ICVkXG4iLCBCaXRBY2MsIEJpdHNBdmFpbCk7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gJWRcbiIsIHRpZi0+dGlmX3Jvdyk7CisJCWZmbHVzaChzdGRvdXQpOworI2VuZGlmCisJCVNZTkNfRU9MKEVPRjFEKTsKKwkJRVhQQU5EMUQoRU9GMURhKTsKKwkJKCpzcC0+ZmlsbCkoYnVmLCB0aGlzcnVuLCBwYSwgbGFzdHgpOworCQlidWYgKz0gc3AtPmIucm93Ynl0ZXM7CisJCW9jYyAtPSBzcC0+Yi5yb3dieXRlczsKKwkJc3AtPmxpbmUrKzsKKwkJY29udGludWU7CisJRU9GMUQ6CQkJCS8qIHByZW1hdHVyZSBFT0YgKi8KKwkJQ0xFQU5VUF9SVU5TKCk7CisJRU9GMURhOgkJCQkvKiBwcmVtYXR1cmUgRU9GICovCisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJVU5DQUNIRV9TVEFURSh0aWYsIHNwKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCVVOQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKworI2RlZmluZQlTV0FQKHQsYSxiKQl7IHQgeDsgeCA9IChhKTsgKGEpID0gKGIpOyAoYikgPSB4OyB9CisvKgorICogRGVjb2RlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIEczIDJELWVuY29kZWQgZGF0YS4KKyAqLworc3RhdGljIGludAorRmF4M0RlY29kZTJEKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlERUNMQVJFX1NUQVRFXzJEKHRpZiwgc3AsICJGYXgzRGVjb2RlMkQiKTsKKwlpbnQgaXMxRDsJCQkvKiBjdXJyZW50IGxpbmUgaXMgMWQvMmQtZW5jb2RlZCAqLworCSh2b2lkKSBzOworCWlmIChvY2MgJSBzcC0+Yi5yb3dieXRlcykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJGcmFjdGlvbmFsIHNjYW5saW5lcyBjYW5ub3QgYmUgcmVhZCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW4gPSBzcC0+Y3VycnVuczsKKyNpZmRlZiBGQVgzX0RFQlVHCisJCXByaW50ZigiXG5CaXRBY2M9JTA4WCwgQml0c0F2YWlsID0gJWQgRU9MY250ID0gJWQiLAorCQkgICAgQml0QWNjLCBCaXRzQXZhaWwsIEVPTGNudCk7CisjZW5kaWYKKwkJU1lOQ19FT0woRU9GMkQpOworCQlOZWVkQml0czgoMSwgRU9GMkQpOworCQlpczFEID0gR2V0Qml0cygxKTsJLyogMUQvMkQtZW5jb2RpbmcgdGFnIGJpdCAqLworCQlDbHJCaXRzKDEpOworI2lmZGVmIEZBWDNfREVCVUcKKwkJcHJpbnRmKCIgJXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tICVkXG4iLAorCQkgICAgaXMxRCA/ICIxRCIgOiAiMkQiLCB0aWYtPnRpZl9yb3cpOworCQlmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCQlwYiA9IHNwLT5yZWZydW5zOworCQliMSA9ICpwYisrOworCQlpZiAoaXMxRCkKKwkJCUVYUEFORDFEKEVPRjJEYSk7CisJCWVsc2UKKwkJCUVYUEFORDJEKEVPRjJEYSk7CisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJU0VUVkFMVUUoMCk7CQkvKiBpbWFnaW5hcnkgY2hhbmdlIGZvciByZWZlcmVuY2UgKi8KKwkJU1dBUCh1aW50MzIqLCBzcC0+Y3VycnVucywgc3AtPnJlZnJ1bnMpOworCQlidWYgKz0gc3AtPmIucm93Ynl0ZXM7CisJCW9jYyAtPSBzcC0+Yi5yb3dieXRlczsKKwkJc3AtPmxpbmUrKzsKKwkJY29udGludWU7CisJRU9GMkQ6CQkJCS8qIHByZW1hdHVyZSBFT0YgKi8KKwkJQ0xFQU5VUF9SVU5TKCk7CisJRU9GMkRhOgkJCQkvKiBwcmVtYXR1cmUgRU9GICovCisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJVU5DQUNIRV9TVEFURSh0aWYsIHNwKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCVVOQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKyN1bmRlZiBTV0FQCisKKy8qCisgKiBUaGUgWkVSTyAmIEZJTEwgbWFjcm9zIG11c3QgaGFuZGxlIHNwYW5zIDwgMipzaXplb2YobG9uZykgYnl0ZXMuCisgKiBGb3IgbWFjaGluZXMgd2l0aCA2NC1iaXQgbG9uZ3MgdGhpcyBpcyA8MTYgYnl0ZXM7IG90aGVyd2lzZQorICogdGhpcyBpcyA8OCBieXRlcy4gIFdlIG9wdGltaXplIHRoZSBjb2RlIGhlcmUgdG8gcmVmbGVjdCB0aGUKKyAqIG1hY2hpbmUgY2hhcmFjdGVyaXN0aWNzLgorICovCisjaWYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gOAorIyBkZWZpbmUgRklMTChuLCBjcCkJCQkJCQkJICAgIFwKKyAgICBzd2l0Y2ggKG4pIHsJCQkJCQkJICAgIFwKKyAgICBjYXNlIDE1OihjcClbMTRdID0gMHhmZjsgY2FzZSAxNDooY3ApWzEzXSA9IDB4ZmY7IGNhc2UgMTM6IChjcClbMTJdID0gMHhmZjtcCisgICAgY2FzZSAxMjooY3ApWzExXSA9IDB4ZmY7IGNhc2UgMTE6KGNwKVsxMF0gPSAweGZmOyBjYXNlIDEwOiAoY3ApWzldID0gMHhmZjtcCisgICAgY2FzZSAgOTogKGNwKVs4XSA9IDB4ZmY7IGNhc2UgIDg6IChjcClbN10gPSAweGZmOyBjYXNlICA3OiAoY3ApWzZdID0gMHhmZjtcCisgICAgY2FzZSAgNjogKGNwKVs1XSA9IDB4ZmY7IGNhc2UgIDU6IChjcClbNF0gPSAweGZmOyBjYXNlICA0OiAoY3ApWzNdID0gMHhmZjtcCisgICAgY2FzZSAgMzogKGNwKVsyXSA9IDB4ZmY7IGNhc2UgIDI6IChjcClbMV0gPSAweGZmOwkJCSAgICAgIFwKKyAgICBjYXNlICAxOiAoY3ApWzBdID0gMHhmZjsgKGNwKSArPSAobik7IGNhc2UgMDogIDsJCQkgICAgICBcCisgICAgfQorIyBkZWZpbmUgWkVSTyhuLCBjcCkJCQkJCQkJXAorICAgIHN3aXRjaCAobikgewkJCQkJCQlcCisgICAgY2FzZSAxNTooY3ApWzE0XSA9IDA7IGNhc2UgMTQ6KGNwKVsxM10gPSAwOyBjYXNlIDEzOiAoY3ApWzEyXSA9IDA7CVwKKyAgICBjYXNlIDEyOihjcClbMTFdID0gMDsgY2FzZSAxMTooY3ApWzEwXSA9IDA7IGNhc2UgMTA6IChjcClbOV0gPSAwOwlcCisgICAgY2FzZSAgOTogKGNwKVs4XSA9IDA7IGNhc2UgIDg6IChjcClbN10gPSAwOyBjYXNlICA3OiAoY3ApWzZdID0gMDsJXAorICAgIGNhc2UgIDY6IChjcClbNV0gPSAwOyBjYXNlICA1OiAoY3ApWzRdID0gMDsgY2FzZSAgNDogKGNwKVszXSA9IDA7CVwKKyAgICBjYXNlICAzOiAoY3ApWzJdID0gMDsgY2FzZSAgMjogKGNwKVsxXSA9IDA7CQkJCVwKKyAgICBjYXNlICAxOiAoY3ApWzBdID0gMDsgKGNwKSArPSAobik7IGNhc2UgMDogIDsJCQlcCisgICAgfQorI2Vsc2UKKyMgZGVmaW5lIEZJTEwobiwgY3ApCQkJCQkJCSAgICBcCisgICAgc3dpdGNoIChuKSB7CQkJCQkJCSAgICBcCisgICAgY2FzZSA3OiAoY3ApWzZdID0gMHhmZjsgY2FzZSA2OiAoY3ApWzVdID0gMHhmZjsgY2FzZSA1OiAoY3ApWzRdID0gMHhmZjsgXAorICAgIGNhc2UgNDogKGNwKVszXSA9IDB4ZmY7IGNhc2UgMzogKGNwKVsyXSA9IDB4ZmY7IGNhc2UgMjogKGNwKVsxXSA9IDB4ZmY7IFwKKyAgICBjYXNlIDE6IChjcClbMF0gPSAweGZmOyAoY3ApICs9IChuKTsgY2FzZSAwOiAgOwkJCSAgICBcCisgICAgfQorIyBkZWZpbmUgWkVSTyhuLCBjcCkJCQkJCQkJXAorICAgIHN3aXRjaCAobikgewkJCQkJCQlcCisgICAgY2FzZSA3OiAoY3ApWzZdID0gMDsgY2FzZSA2OiAoY3ApWzVdID0gMDsgY2FzZSA1OiAoY3ApWzRdID0gMDsJXAorICAgIGNhc2UgNDogKGNwKVszXSA9IDA7IGNhc2UgMzogKGNwKVsyXSA9IDA7IGNhc2UgMjogKGNwKVsxXSA9IDA7CVwKKyAgICBjYXNlIDE6IChjcClbMF0gPSAwOyAoY3ApICs9IChuKTsgY2FzZSAwOiAgOwkJCVwKKyAgICB9CisjZW5kaWYKKworLyoKKyAqIEJpdC1maWxsIGEgcm93IGFjY29yZGluZyB0byB0aGUgd2hpdGUvYmxhY2sKKyAqIHJ1bnMgZ2VuZXJhdGVkIGR1cmluZyBHMy9HNCBkZWNvZGluZy4KKyAqLwordm9pZAorX1RJRkZGYXgzZmlsbHJ1bnModW5zaWduZWQgY2hhciogYnVmLCB1aW50MzIqIHJ1bnMsIHVpbnQzMiogZXJ1biwgdWludDMyIGxhc3R4KQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9maWxsbWFza3NbXSA9CisJICAgIHsgMHgwMCwgMHg4MCwgMHhjMCwgMHhlMCwgMHhmMCwgMHhmOCwgMHhmYywgMHhmZSwgMHhmZiB9OworCXVuc2lnbmVkIGNoYXIqIGNwOworCXVpbnQzMiB4LCBieCwgcnVuLGJ4XzsvKiBhZGQgYnhfID0gOC1ieCBmb3IgYXZvaWQgbXMgZXZjIGNvbXBpbGVyIGJ1ZyovCisJaW50MzIgbiwgbnc7CisJbG9uZyogbHA7CisKKwlpZiAoKGVydW4tcnVucykmMSkKKwkgICAgKmVydW4rKyA9IDA7CisJeCA9IDA7CisJZm9yICg7IHJ1bnMgPCBlcnVuOyBydW5zICs9IDIpIHsKKwkgICAgcnVuID0gcnVuc1swXTsKKwkgICAgaWYgKHgrcnVuID4gbGFzdHggfHwgcnVuID4gbGFzdHggKQorCQlydW4gPSBydW5zWzBdID0gKHVpbnQzMikgKGxhc3R4IC0geCk7CisJICAgIGlmIChydW4pIHsKKwkJY3AgPSBidWYgKyAoeD4+Myk7CisJCWJ4ID0geCY3OworLy8gCQlpZiAocnVuID4gOC1ieCkgeworLy8gCQkJaWYgKGJ4KSB7CQkJLyogYWxpZ24gdG8gYnl0ZSBib3VuZGFyeSAqLworLy8gCQkJCSpjcCsrICY9IDB4ZmYgPDwgKDgtYngpOworLy8gCQkJCXJ1biAtPSA4LWJ4OworLy8gCQkgICAgfQorLy9Nb2RpZnkgYnkgU3VubGlhbmcuTGl1IDIwMDkwODA0CisvL0RldGFpbDogRm9yIGF2b2lkIG1zIGV2YyBjb21waWxlciBidWcgaW4gV0NFIEFSTVY0KEkpIFJlbGVhc2UKKwkJYnhfID0gOC1ieDsKKwkJaWYgKHJ1biA+IGJ4XykgeworCQkgICAgaWYgKGJ4KSB7CQkJLyogYWxpZ24gdG8gYnl0ZSBib3VuZGFyeSAqLworCQkJKmNwKysgJj0gMHhmZiA8PCBieF87CisJCQlydW4gLT0gYnhfOworCQkgICAgfQorCQkgICAgaWYoIChuID0gcnVuID4+IDMpICE9IDAgKSB7CS8qIG11bHRpcGxlIGJ5dGVzIHRvIGZpbGwgKi8KKwkJCWlmICgobi9zaXplb2YgKGxvbmcpKSA+IDEpIHsKKwkJCSAgICAvKgorCQkJICAgICAqIEFsaWduIHRvIGxvbmd3b3JkIGJvdW5kYXJ5IGFuZCBmaWxsLgorCQkJICAgICAqLworCQkJICAgIGZvciAoOyBuICYmICFpc0FsaWduZWQoY3AsIGxvbmcpOyBuLS0pCisJCQkJICAgICpjcCsrID0gMHgwMDsKKwkJCSAgICBscCA9IChsb25nKikgY3A7CisJCQkgICAgbncgPSAoaW50MzIpKG4gLyBzaXplb2YgKGxvbmcpKTsKKwkJCSAgICBuIC09IG53ICogc2l6ZW9mIChsb25nKTsKKwkJCSAgICBkbyB7CisJCQkJICAgICpscCsrID0gMEw7CisJCQkgICAgfSB3aGlsZSAoLS1udyk7CisJCQkgICAgY3AgPSAodW5zaWduZWQgY2hhciopIGxwOworCQkJfQorI2lmZGVmIEZBWDNfREVCVUcKKwkJCXByaW50ZigiX1RJRkZGYXgzZmlsbHJ1bnMgWkVSTzogJWRcbiIsbik7CisjZW5kaWYKKwkJCVpFUk8obiwgY3ApOworCQkJcnVuICY9IDc7CisJCSAgICB9CisJCSAgICBpZiAocnVuKQorCQkJY3BbMF0gJj0gMHhmZiA+PiBydW47CisJCX0gZWxzZQorCQkgICAgY3BbMF0gJj0gfihfZmlsbG1hc2tzW3J1bl0+PmJ4KTsKKwkJeCArPSBydW5zWzBdOworCSAgICB9CisJICAgIHJ1biA9IHJ1bnNbMV07CisJICAgIGlmICh4K3J1biA+IGxhc3R4IHx8IHJ1biA+IGxhc3R4ICkKKwkJcnVuID0gcnVuc1sxXSA9IGxhc3R4IC0geDsKKwkgICAgaWYgKHJ1bikgeworCQljcCA9IGJ1ZiArICh4Pj4zKTsKKwkJYnggPSB4Jjc7CisJCWlmIChydW4gPiA4LWJ4KSB7CisJCSAgICBpZiAoYngpIHsJCQkvKiBhbGlnbiB0byBieXRlIGJvdW5kYXJ5ICovCisJCQkqY3ArKyB8PSAweGZmID4+IGJ4OworCQkJcnVuIC09IDgtYng7CisJCSAgICB9CisJCSAgICBpZiggKG4gPSBydW4+PjMpICE9IDAgKSB7CS8qIG11bHRpcGxlIGJ5dGVzIHRvIGZpbGwgKi8KKwkJCWlmICgobi9zaXplb2YgKGxvbmcpKSA+IDEpIHsKKwkJCSAgICAvKgorCQkJICAgICAqIEFsaWduIHRvIGxvbmd3b3JkIGJvdW5kYXJ5IGFuZCBmaWxsLgorCQkJICAgICAqLworCQkJICAgIGZvciAoOyBuICYmICFpc0FsaWduZWQoY3AsIGxvbmcpOyBuLS0pCisJCQkJKmNwKysgPSAweGZmOworCQkJICAgIGxwID0gKGxvbmcqKSBjcDsKKwkJCSAgICBudyA9IChpbnQzMikobiAvIHNpemVvZiAobG9uZykpOworCQkJICAgIG4gLT0gbncgKiBzaXplb2YgKGxvbmcpOworCQkJICAgIGRvIHsKKwkJCQkqbHArKyA9IC0xTDsKKwkJCSAgICB9IHdoaWxlICgtLW53KTsKKwkJCSAgICBjcCA9ICh1bnNpZ25lZCBjaGFyKikgbHA7CisJCQl9CisjaWZkZWYgRkFYM19ERUJVRworCQkJcHJpbnRmKCJfVElGRkZheDNmaWxscnVucyBGSUxMOiAlZFxuIixuKTsKKyNlbmRpZgorCQkJRklMTChuLCBjcCk7CisJCQlydW4gJj0gNzsKKwkJICAgIH0KKwkJICAgIGlmIChydW4pCisJCQljcFswXSB8PSAweGZmMDAgPj4gcnVuOworCQl9IGVsc2UKKwkJICAgIGNwWzBdIHw9IF9maWxsbWFza3NbcnVuXT4+Yng7CisJCXggKz0gcnVuc1sxXTsKKwkgICAgfQorCX0KKwlhc3NlcnQoeCA9PSBsYXN0eCk7Cit9CisjdW5kZWYJWkVSTworI3VuZGVmCUZJTEwKKworc3RhdGljIGludAorRmF4M0ZpeHVwVGFncyhUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogU2V0dXAgRzMvRzQtcmVsYXRlZCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIHN0YXRlCisgKiBiZWZvcmUgZGF0YSBpcyBwcm9jZXNzZWQuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9uY2UKKyAqIHBlciBpbWFnZSAtLSBpdCBzZXRzIHVwIGRpZmZlcmVudCBzdGF0ZSBiYXNlZCBvbiB3aGV0aGVyCisgKiBvciBub3QgZGVjb2Rpbmcgb3IgZW5jb2RpbmcgaXMgYmVpbmcgZG9uZSBhbmQgd2hldGhlcgorICogMUQtIG9yIDJELWVuY29kZWQgZGF0YSBpcyBpbnZvbHZlZC4KKyAqLworc3RhdGljIGludAorRmF4M1NldHVwU3RhdGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkZheDNTZXR1cFN0YXRlIjsKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJRmF4M0Jhc2VTdGF0ZSogc3AgPSBGYXgzU3RhdGUodGlmKTsKKwlpbnQgbmVlZHNSZWZMaW5lOworCUZheDNDb2RlY1N0YXRlKiBkc3AgPSAoRmF4M0NvZGVjU3RhdGUqKSBGYXgzU3RhdGUodGlmKTsKKwl0bXNpemVfdCByb3dieXRlczsKKwl1aW50MzIgcm93cGl4ZWxzLCBucnVuczsKKworCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSAxKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiQml0cy9zYW1wbGUgbXVzdCBiZSAxIGZvciBHcm91cCAzLzQgZW5jb2RpbmcvZGVjb2RpbmciKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNjYW5saW5lL3RpbGUgd2lkdGhzLgorCSAqLworCWlmIChpc1RpbGVkKHRpZikpIHsKKwkJcm93Ynl0ZXMgPSBUSUZGVGlsZVJvd1NpemUodGlmKTsKKwkJcm93cGl4ZWxzID0gdGQtPnRkX3RpbGV3aWR0aDsKKwl9IGVsc2UgeworCQlyb3dieXRlcyA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwkJcm93cGl4ZWxzID0gdGQtPnRkX2ltYWdld2lkdGg7CisJfQorCXNwLT5yb3dieXRlcyA9IHJvd2J5dGVzOworCXNwLT5yb3dwaXhlbHMgPSByb3dwaXhlbHM7CisJLyoKKwkgKiBBbGxvY2F0ZSBhbnkgYWRkaXRpb25hbCBzcGFjZSByZXF1aXJlZCBmb3IgZGVjb2RpbmcvZW5jb2RpbmcuCisJICovCisJbmVlZHNSZWZMaW5lID0gKAorCSAgICAoc3AtPmdyb3Vwb3B0aW9ucyAmIEdST1VQM09QVF8yREVOQ09ESU5HKSB8fAorCSAgICB0ZC0+dGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fQ0NJVFRGQVg0CisJKTsKKworCS8qCisJICBBc3N1cmUgdGhhdCBhbGxvY2F0aW9uIGNvbXB1dGF0aW9ucyBkbyBub3Qgb3ZlcmZsb3cuCisJICAKKwkgIFRJRkZyb3VuZHVwIGFuZCBUSUZGU2FmZU11bHRpcGx5IHJldHVybiB6ZXJvIG9uIGludGVnZXIgb3ZlcmZsb3cKKwkqLworCWRzcC0+cnVucz0odWludDMyKikgTlVMTDsKKwlucnVucyA9IFRJRkZyb3VuZHVwXzMyKHJvd3BpeGVscywzMik7CisJaWYgKG5lZWRzUmVmTGluZSkgeworCQlucnVucyA9IFRJRkZTYWZlTXVsdGlwbHkodWludDMyLG5ydW5zLDIpOworCX0KKwlpZiAoKG5ydW5zID09IDApIHx8IChUSUZGU2FmZU11bHRpcGx5KHVpbnQzMixucnVucywyKSA9PSAwKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAgIlJvdyBwaXhlbHMgaW50ZWdlciBvdmVyZmxvdyAocm93cGl4ZWxzICV1KSIsCisJCQkgICAgIHJvd3BpeGVscyk7CisJCXJldHVybiAoMCk7CisJfQorCWRzcC0+cnVucyA9ICh1aW50MzIqKSBfVElGRkNoZWNrTWFsbG9jKHRpZiwKKwkJCQkJICAgICAgIFRJRkZTYWZlTXVsdGlwbHkodWludDMyLG5ydW5zLDIpLAorCQkJCQkgICAgICAgc2l6ZW9mICh1aW50MzIpLAorCQkJCQkgICAgICAgImZvciBHcm91cCAzLzQgcnVuIGFycmF5cyIpOworCWlmIChkc3AtPnJ1bnMgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwltZW1zZXQoIGRzcC0+cnVucywgMCwgVElGRlNhZmVNdWx0aXBseSh1aW50MzIsbnJ1bnMsMikqc2l6ZW9mKHVpbnQzMikpOworCWRzcC0+Y3VycnVucyA9IGRzcC0+cnVuczsKKwlpZiAobmVlZHNSZWZMaW5lKQorCQlkc3AtPnJlZnJ1bnMgPSBkc3AtPnJ1bnMgKyBucnVuczsKKwllbHNlCisJCWRzcC0+cmVmcnVucyA9IE5VTEw7CisJaWYgKHRkLT50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDMKKwkgICAgJiYgaXMyREVuY29kaW5nKGRzcCkpIHsJLyogTkI6IGRlZmF1bHQgaXMgMUQgcm91dGluZSAqLworCQl0aWYtPnRpZl9kZWNvZGVyb3cgPSBGYXgzRGVjb2RlMkQ7CisJCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gRmF4M0RlY29kZTJEOworCQl0aWYtPnRpZl9kZWNvZGV0aWxlID0gRmF4M0RlY29kZTJEOworCX0KKworCWlmIChuZWVkc1JlZkxpbmUpIHsJCS8qIDJkIGVuY29kaW5nICovCisJCUZheDNDb2RlY1N0YXRlKiBlc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwkJLyoKKwkJICogMmQgZW5jb2RpbmcgcmVxdWlyZXMgYSBzY2FubGluZQorCQkgKiBidWZmZXIgZm9yIHRoZSBgYHJlZmVyZW5jZSBsaW5lJyc7IHRoZQorCQkgKiBzY2FubGluZSBhZ2FpbnN0IHdoaWNoIGRlbHRhIGVuY29kaW5nCisJCSAqIGlzIHJlZmVyZW5jZWQuICBUaGUgcmVmZXJlbmNlIGxpbmUgbXVzdAorCQkgKiBiZSBpbml0aWFsaXplZCB0byBiZSBgYHdoaXRlJycgKGRvbmUgZWxzZXdoZXJlKS4KKwkJICovCisJCWVzcC0+cmVmbGluZSA9ICh1bnNpZ25lZCBjaGFyKikgX1RJRkZtYWxsb2Mocm93Ynl0ZXMpOworCQlpZiAoZXNwLT5yZWZsaW5lID09IE5VTEwpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIk5vIHNwYWNlIGZvciBHcm91cCAzLzQgcmVmZXJlbmNlIGxpbmUiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9IGVsc2UJCQkJCS8qIDFkIGVuY29kaW5nICovCisJCUVuY29kZXJTdGF0ZSh0aWYpLT5yZWZsaW5lID0gTlVMTDsKKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBDQ0lUVCBHcm91cCAzIEZBWCBFbmNvZGluZy4KKyAqLworCisjZGVmaW5lCUZheDNGbHVzaEJpdHModGlmLCBzcCkgewkJCQlcCisJaWYgKCh0aWYpLT50aWZfcmF3Y2MgPj0gKHRpZiktPnRpZl9yYXdkYXRhc2l6ZSkJCVwKKwkJKHZvaWQpIFRJRkZGbHVzaERhdGExKHRpZik7CQkJXAorCSoodGlmKS0+dGlmX3Jhd2NwKysgPSAodWludDgpIChzcCktPmRhdGE7CQlcCisJKHRpZiktPnRpZl9yYXdjYysrOwkJCQkJXAorCShzcCktPmRhdGEgPSAwLCAoc3ApLT5iaXQgPSA4OwkJCQlcCit9CisjZGVmaW5lCV9GbHVzaEJpdHModGlmKSB7CQkJCQlcCisJaWYgKCh0aWYpLT50aWZfcmF3Y2MgPj0gKHRpZiktPnRpZl9yYXdkYXRhc2l6ZSkJCVwKKwkJKHZvaWQpIFRJRkZGbHVzaERhdGExKHRpZik7CQkJXAorCSoodGlmKS0+dGlmX3Jhd2NwKysgPSAodWludDgpIGRhdGE7CQlcCisJKHRpZiktPnRpZl9yYXdjYysrOwkJCQkJXAorCWRhdGEgPSAwLCBiaXQgPSA4OwkJCQkJXAorfQorc3RhdGljIGNvbnN0IGludCBfbXNibWFza1s5XSA9CisgICAgeyAweDAwLCAweDAxLCAweDAzLCAweDA3LCAweDBmLCAweDFmLCAweDNmLCAweDdmLCAweGZmIH07CisjZGVmaW5lCV9QdXRCaXRzKHRpZiwgYml0cywgbGVuZ3RoKSB7CQkJCVwKKwl3aGlsZSAobGVuZ3RoID4gYml0KSB7CQkJCQlcCisJCWRhdGEgfD0gYml0cyA+PiAobGVuZ3RoIC0gYml0KTsJCQlcCisJCWxlbmd0aCAtPSBiaXQ7CQkJCQlcCisJCV9GbHVzaEJpdHModGlmKTsJCQkJXAorCX0JCQkJCQkJXAorICAgICAgICBhc3NlcnQoIGxlbmd0aCA8IDkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkYXRhIHw9IChiaXRzICYgX21zYm1hc2tbbGVuZ3RoXSkgPDwgKGJpdCAtIGxlbmd0aCk7CVwKKwliaXQgLT0gbGVuZ3RoOwkJCQkJCVwKKwlpZiAoYml0ID09IDApCQkJCQkJXAorCQlfRmx1c2hCaXRzKHRpZik7CQkJCVwKK30KKwkKKy8qCisgKiBXcml0ZSBhIHZhcmlhYmxlLWxlbmd0aCBiaXQtdmFsdWUgdG8KKyAqIHRoZSBvdXRwdXQgc3RyZWFtLiAgVmFsdWVzIGFyZQorICogYXNzdW1lZCB0byBiZSBhdCBtb3N0IDE2IGJpdHMuCisgKi8KK3N0YXRpYyB2b2lkCitGYXgzUHV0Qml0cyhUSUZGKiB0aWYsIHVuc2lnbmVkIGludCBiaXRzLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCXVuc2lnbmVkIGludCBiaXQgPSBzcC0+Yml0OworCWludCBkYXRhID0gc3AtPmRhdGE7CisKKwlfUHV0Qml0cyh0aWYsIGJpdHMsIGxlbmd0aCk7CisKKwlzcC0+ZGF0YSA9IGRhdGE7CisJc3AtPmJpdCA9IGJpdDsKK30KKworLyoKKyAqIFdyaXRlIGEgY29kZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqLworI2RlZmluZSBwdXRjb2RlKHRpZiwgdGUpCUZheDNQdXRCaXRzKHRpZiwgKHRlKS0+Y29kZSwgKHRlKS0+bGVuZ3RoKQorCisjaWZkZWYgRkFYM19ERUJVRworI2RlZmluZQlERUJVR19DT0xPUih3KSAodGFiID09IFRJRkZGYXhXaGl0ZUNvZGVzID8gdyAiVyIgOiB3ICJCIikKKyNkZWZpbmUJREVCVUdfUFJJTlQod2hhdCxsZW4pIHsJCQkJCQlcCisgICAgaW50IHQ7CQkJCQkJCQlcCisgICAgcHJpbnRmKCIlMDhYLyUtMmQ6ICVzJTVkXHQiLCBkYXRhLCBiaXQsIERFQlVHX0NPTE9SKHdoYXQpLCBsZW4pOwlcCisgICAgZm9yICh0ID0gbGVuZ3RoLTE7IHQgPj0gMDsgdC0tKQkJCQkJXAorCXB1dGNoYXIoY29kZSAmICgxPDx0KSA/ICcxJyA6ICcwJyk7CQkJCVwKKyAgICBwdXRjaGFyKCdcbicpOwkJCQkJCQlcCit9CisjZW5kaWYKKworLyoKKyAqIFdyaXRlIHRoZSBzZXF1ZW5jZSBvZiBjb2RlcyB0aGF0IGRlc2NyaWJlcworICogdGhlIHNwZWNpZmllZCBzcGFuIG9mIHplcm8ncyBvciBvbmUncy4gIFRoZQorICogYXBwcm9wcmlhdGUgdGFibGUgdGhhdCBob2xkcyB0aGUgbWFrZS11cCBhbmQKKyAqIHRlcm1pbmF0aW5nIGNvZGVzIGlzIHN1cHBsaWVkLgorICovCitzdGF0aWMgdm9pZAorcHV0c3BhbihUSUZGKiB0aWYsIGludDMyIHNwYW4sIGNvbnN0IHRhYmxlZW50cnkqIHRhYikKK3sKKwlGYXgzQ29kZWNTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0gc3AtPmJpdDsKKwlpbnQgZGF0YSA9IHNwLT5kYXRhOworCXVuc2lnbmVkIGludCBjb2RlLCBsZW5ndGg7CisKKwl3aGlsZSAoc3BhbiA+PSAyNjI0KSB7CisJCWNvbnN0IHRhYmxlZW50cnkqIHRlID0gJnRhYls2MyArICgyNTYwPj42KV07CisJCWNvZGUgPSB0ZS0+Y29kZSwgbGVuZ3RoID0gdGUtPmxlbmd0aDsKKyNpZmRlZiBGQVgzX0RFQlVHCisJCURFQlVHX1BSSU5UKCJNYWtlVXAiLCB0ZS0+cnVubGVuKTsKKyNlbmRpZgorCQlfUHV0Qml0cyh0aWYsIGNvZGUsIGxlbmd0aCk7CisJCXNwYW4gLT0gdGUtPnJ1bmxlbjsKKwl9CisJaWYgKHNwYW4gPj0gNjQpIHsKKwkJY29uc3QgdGFibGVlbnRyeSogdGUgPSAmdGFiWzYzICsgKHNwYW4+PjYpXTsKKwkJYXNzZXJ0KHRlLT5ydW5sZW4gPT0gNjQqKHNwYW4+PjYpKTsKKwkJY29kZSA9IHRlLT5jb2RlLCBsZW5ndGggPSB0ZS0+bGVuZ3RoOworI2lmZGVmIEZBWDNfREVCVUcKKwkJREVCVUdfUFJJTlQoIk1ha2VVcCIsIHRlLT5ydW5sZW4pOworI2VuZGlmCisJCV9QdXRCaXRzKHRpZiwgY29kZSwgbGVuZ3RoKTsKKwkJc3BhbiAtPSB0ZS0+cnVubGVuOworCX0KKwljb2RlID0gdGFiW3NwYW5dLmNvZGUsIGxlbmd0aCA9IHRhYltzcGFuXS5sZW5ndGg7CisjaWZkZWYgRkFYM19ERUJVRworCURFQlVHX1BSSU5UKCIgIFRlcm0iLCB0YWJbc3Bhbl0ucnVubGVuKTsKKyNlbmRpZgorCV9QdXRCaXRzKHRpZiwgY29kZSwgbGVuZ3RoKTsKKworCXNwLT5kYXRhID0gZGF0YTsKKwlzcC0+Yml0ID0gYml0OworfQorCisvKgorICogV3JpdGUgYW4gRU9MIGNvZGUgdG8gdGhlIG91dHB1dCBzdHJlYW0uICBUaGUgemVyby1maWxsCisgKiBsb2dpYyBmb3IgYnl0ZS1hbGlnbmluZyBlbmNvZGVkIHNjYW5saW5lcyBpcyBoYW5kbGVkCisgKiBoZXJlLiAgV2UgYWxzbyBoYW5kbGUgd3JpdGluZyB0aGUgdGFnIGJpdCBmb3IgdGhlIG5leHQKKyAqIHNjYW5saW5lIHdoZW4gZG9pbmcgMmQgZW5jb2RpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitGYXgzUHV0RU9MKFRJRkYqIHRpZikKK3sKKwlGYXgzQ29kZWNTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0gc3AtPmJpdDsKKwlpbnQgZGF0YSA9IHNwLT5kYXRhOworCXVuc2lnbmVkIGludCBjb2RlLCBsZW5ndGgsIHRwYXJtOworCisJaWYgKHNwLT5iLmdyb3Vwb3B0aW9ucyAmIEdST1VQM09QVF9GSUxMQklUUykgeworCQkvKgorCQkgKiBGb3JjZSBiaXQgYWxpZ25tZW50IHNvIEVPTCB3aWxsIHRlcm1pbmF0ZSBvbgorCQkgKiBhIGJ5dGUgYm91bmRhcnkuICBUaGF0IGlzLCBmb3JjZSB0aGUgYml0IGFsaWdubWVudAorCQkgKiB0byAxNi0xMiA9IDQgYmVmb3JlIHB1dHRpbmcgb3V0IHRoZSBFT0wgY29kZS4KKwkJICovCisJCWludCBhbGlnbiA9IDggLSA0OworCQlpZiAoYWxpZ24gIT0gc3AtPmJpdCkgeworCQkJaWYgKGFsaWduID4gc3AtPmJpdCkKKwkJCQlhbGlnbiA9IHNwLT5iaXQgKyAoOCAtIGFsaWduKTsKKwkJCWVsc2UKKwkJCQlhbGlnbiA9IHNwLT5iaXQgLSBhbGlnbjsKKwkJCWNvZGUgPSAwOworCQkJdHBhcm09YWxpZ247IAorCQkJX1B1dEJpdHModGlmLCAwLCB0cGFybSk7CisJCX0KKwl9CisJY29kZSA9IEVPTCwgbGVuZ3RoID0gMTI7CisJaWYgKGlzMkRFbmNvZGluZyhzcCkpCisJCWNvZGUgPSAoY29kZTw8MSkgfCAoc3AtPnRhZyA9PSBHM18xRCksIGxlbmd0aCsrOworCV9QdXRCaXRzKHRpZiwgY29kZSwgbGVuZ3RoKTsKKworCXNwLT5kYXRhID0gZGF0YTsKKwlzcC0+Yml0ID0gYml0OworfQorCisvKgorICogUmVzZXQgZW5jb2Rpbmcgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNQcmVFbmNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwlGYXgzQ29kZWNTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlzcC0+Yml0ID0gODsKKwlzcC0+ZGF0YSA9IDA7CisJc3AtPnRhZyA9IEczXzFEOworCS8qCisJICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIEdyb3VwIDQ7IG90aGVyd2lzZSBpdCBpc24ndAorCSAqIG5lZWRlZCBiZWNhdXNlIHRoZSBmaXJzdCBzY2FubGluZSBvZiBlYWNoIHN0cmlwIGVuZHMKKwkgKiB1cCBiZWluZyBjb3BpZWQgaW50byB0aGUgcmVmbGluZS4KKwkgKi8KKwlpZiAoc3AtPnJlZmxpbmUpCisJCV9USUZGbWVtc2V0KHNwLT5yZWZsaW5lLCAweDAwLCBzcC0+Yi5yb3dieXRlcyk7CisJaWYgKGlzMkRFbmNvZGluZyhzcCkpIHsKKwkJZmxvYXQgcmVzID0gdGlmLT50aWZfZGlyLnRkX3lyZXNvbHV0aW9uOworCQkvKgorCQkgKiBUaGUgQ0NJVFQgc3BlYyBzYXlzIHRoYXQgd2hlbiBkb2luZyAyZCBlbmNvZGluZywgeW91CisJCSAqIHNob3VsZCBvbmx5IGRvIGl0IG9uIEsgY29uc2VjdXRpdmUgc2NhbmxpbmVzLCB3aGVyZSBLCisJCSAqIGRlcGVuZHMgb24gdGhlIHJlc29sdXRpb24gb2YgdGhlIGltYWdlIGJlaW5nIGVuY29kZWQKKwkJICogKDIgZm9yIDw9IDIwMCBscGksIDQgZm9yID4gMjAwIGxwaSkuICBTaW5jZSB0aGUgZGlyZWN0b3J5CisJCSAqIGNvZGUgaW5pdGlhbGl6ZXMgdGRfeXJlc29sdXRpb24gdG8gMCwgdGhpcyBjb2RlIHdpbGwKKwkJICogc2VsZWN0IGEgSyBvZiAyIHVubGVzcyB0aGUgWVJlc29sdXRpb24gdGFnIGlzIHNldAorCQkgKiBhcHByb3ByaWF0ZWx5LiAgKE5vdGUgYWxzbyB0aGF0IHdlIGZ1ZGdlIGEgbGl0dGxlIGhlcmUKKwkJICogYW5kIHVzZSAxNTAgbHBpIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdW5pdHMgY29udmVyc2lvbi4pCisJCSAqLworCQlpZiAodGlmLT50aWZfZGlyLnRkX3Jlc29sdXRpb251bml0ID09IFJFU1VOSVRfQ0VOVElNRVRFUikKKwkJCXJlcyAqPSAyLjU0ZjsJCS8qIGNvbnZlcnQgdG8gaW5jaGVzICovCisJCXNwLT5tYXhrID0gKHJlcyA+IDE1MCA/IDQgOiAyKTsKKwkJc3AtPmsgPSBzcC0+bWF4ay0xOworCX0gZWxzZQorCQlzcC0+ayA9IHNwLT5tYXhrID0gMDsKKwlzcC0+bGluZSA9IDA7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgemVyb3J1bnNbMjU2XSA9IHsKKyAgICA4LCA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAkvKiAweDAwIC0gMHgwZiAqLworICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIDB4MTAgLSAweDFmICovCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwJLyogMHgyMCAtIDB4MmYgKi8KKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAkvKiAweDMwIC0gMHgzZiAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCS8qIDB4NDAgLSAweDRmICovCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwJLyogMHg1MCAtIDB4NWYgKi8KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAkvKiAweDYwIC0gMHg2ZiAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCS8qIDB4NzAgLSAweDdmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHg4MCAtIDB4OGYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDkwIC0gMHg5ZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4YTAgLSAweGFmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHhiMCAtIDB4YmYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweGMwIC0gMHhjZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4ZDAgLSAweGRmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHhlMCAtIDB4ZWYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweGYwIC0gMHhmZiAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG9uZXJ1bnNbMjU2XSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDAwIC0gMHgwZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4MTAgLSAweDFmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHgyMCAtIDB4MmYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDMwIC0gMHgzZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4NDAgLSAweDRmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHg1MCAtIDB4NWYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDYwIC0gMHg2ZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4NzAgLSAweDdmICovCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwJLyogMHg4MCAtIDB4OGYgKi8KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAkvKiAweDkwIC0gMHg5ZiAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCS8qIDB4YTAgLSAweGFmICovCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwJLyogMHhiMCAtIDB4YmYgKi8KKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAkvKiAweGMwIC0gMHhjZiAqLworICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCS8qIDB4ZDAgLSAweGRmICovCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywJLyogMHhlMCAtIDB4ZWYgKi8KKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA3LCA4LAkvKiAweGYwIC0gMHhmZiAqLworfTsKKworLyoKKyAqIE9uIGNlcnRhaW4gc3lzdGVtcyBpdCBwYXlzIHRvIGlubGluZQorICogdGhlIHJvdXRpbmVzIHRoYXQgZmluZCBwaXhlbCBzcGFucy4KKyAqLworI2lmZGVmIFZBWEMKK3N0YXRpYwlpbnQzMiBmaW5kMHNwYW4odW5zaWduZWQgY2hhciosIGludDMyLCBpbnQzMik7CitzdGF0aWMJaW50MzIgZmluZDFzcGFuKHVuc2lnbmVkIGNoYXIqLCBpbnQzMiwgaW50MzIpOworI3ByYWdtYSBpbmxpbmUoZmluZDBzcGFuLGZpbmQxc3BhbikKKyNlbmRpZgorCisvKgorICogRmluZCBhIHNwYW4gb2Ygb25lcyBvciB6ZXJvcyB1c2luZyB0aGUgc3VwcGxpZWQKKyAqIHRhYmxlLiAgVGhlIGBgYmFzZScnIG9mIHRoZSBiaXQgc3RyaW5nIGlzIHN1cHBsaWVkCisgKiBhbG9uZyB3aXRoIHRoZSBzdGFydCtlbmQgYml0IGluZGljZXMuCisgKi8KK2lubGluZSBzdGF0aWMgaW50MzIKK2ZpbmQwc3Bhbih1bnNpZ25lZCBjaGFyKiBicCwgaW50MzIgYnMsIGludDMyIGJlKQoreworCWludDMyIGJpdHMgPSBiZSAtIGJzOworCWludDMyIG4sIHNwYW47CisKKwlicCArPSBicz4+MzsKKwkvKgorCSAqIENoZWNrIHBhcnRpYWwgYnl0ZSBvbiBsaHMuCisJICovCisJaWYgKGJpdHMgPiAwICYmIChuID0gKGJzICYgNykpKSB7CisJCXNwYW4gPSB6ZXJvcnVuc1soKmJwIDw8IG4pICYgMHhmZl07CisJCWlmIChzcGFuID4gOC1uKQkJLyogdGFibGUgdmFsdWUgdG9vIGdlbmVyb3VzICovCisJCQlzcGFuID0gOC1uOworCQlpZiAoc3BhbiA+IGJpdHMpCS8qIGNvbnN0cmFpbiBzcGFuIHRvIGJpdCByYW5nZSAqLworCQkJc3BhbiA9IGJpdHM7CisJCWlmIChuK3NwYW4gPCA4KQkJLyogZG9lc24ndCBleHRlbmQgdG8gZWRnZSBvZiBieXRlICovCisJCQlyZXR1cm4gKHNwYW4pOworCQliaXRzIC09IHNwYW47CisJCWJwKys7CisJfSBlbHNlCisJCXNwYW4gPSAwOworCWlmIChiaXRzID49IChpbnQzMikoMiAqIDggKiBzaXplb2YobG9uZykpKSB7CisJCWxvbmcqIGxwOworCQkvKgorCQkgKiBBbGlnbiB0byBsb25nd29yZCBib3VuZGFyeSBhbmQgY2hlY2sgbG9uZ3dvcmRzLgorCQkgKi8KKwkJd2hpbGUgKCFpc0FsaWduZWQoYnAsIGxvbmcpKSB7CisJCQlpZiAoKmJwICE9IDB4MDApCisJCQkJcmV0dXJuIChzcGFuICsgemVyb3J1bnNbKmJwXSk7CisJCQlzcGFuICs9IDgsIGJpdHMgLT0gODsKKwkJCWJwKys7CisJCX0KKwkJbHAgPSAobG9uZyopIGJwOworCQl3aGlsZSAoKGJpdHMgPj0gKGludDMyKSg4ICogc2l6ZW9mKGxvbmcpKSkgJiYgKDAgPT0gKmxwKSkgeworCQkJc3BhbiArPSA4KnNpemVvZiAobG9uZyksIGJpdHMgLT0gOCpzaXplb2YgKGxvbmcpOworCQkJbHArKzsKKwkJfQorCQlicCA9ICh1bnNpZ25lZCBjaGFyKikgbHA7CisJfQorCS8qCisJICogU2NhbiBmdWxsIGJ5dGVzIGZvciBhbGwgMCdzLgorCSAqLworCXdoaWxlIChiaXRzID49IDgpIHsKKwkJaWYgKCpicCAhPSAweDAwKQkvKiBlbmQgb2YgcnVuICovCisJCQlyZXR1cm4gKHNwYW4gKyB6ZXJvcnVuc1sqYnBdKTsKKwkJc3BhbiArPSA4LCBiaXRzIC09IDg7CisJCWJwKys7CisJfQorCS8qCisJICogQ2hlY2sgcGFydGlhbCBieXRlIG9uIHJocy4KKwkgKi8KKwlpZiAoYml0cyA+IDApIHsKKwkJbiA9IHplcm9ydW5zWypicF07CisJCXNwYW4gKz0gKG4gPiBiaXRzID8gYml0cyA6IG4pOworCX0KKwlyZXR1cm4gKHNwYW4pOworfQorCitpbmxpbmUgc3RhdGljIGludDMyCitmaW5kMXNwYW4odW5zaWduZWQgY2hhciogYnAsIGludDMyIGJzLCBpbnQzMiBiZSkKK3sKKwlpbnQzMiBiaXRzID0gYmUgLSBiczsKKwlpbnQzMiBuLCBzcGFuOworCisJYnAgKz0gYnM+PjM7CisJLyoKKwkgKiBDaGVjayBwYXJ0aWFsIGJ5dGUgb24gbGhzLgorCSAqLworCWlmIChiaXRzID4gMCAmJiAobiA9IChicyAmIDcpKSkgeworCQlzcGFuID0gb25lcnVuc1soKmJwIDw8IG4pICYgMHhmZl07CisJCWlmIChzcGFuID4gOC1uKQkJLyogdGFibGUgdmFsdWUgdG9vIGdlbmVyb3VzICovCisJCQlzcGFuID0gOC1uOworCQlpZiAoc3BhbiA+IGJpdHMpCS8qIGNvbnN0cmFpbiBzcGFuIHRvIGJpdCByYW5nZSAqLworCQkJc3BhbiA9IGJpdHM7CisJCWlmIChuK3NwYW4gPCA4KQkJLyogZG9lc24ndCBleHRlbmQgdG8gZWRnZSBvZiBieXRlICovCisJCQlyZXR1cm4gKHNwYW4pOworCQliaXRzIC09IHNwYW47CisJCWJwKys7CisJfSBlbHNlCisJCXNwYW4gPSAwOworCWlmIChiaXRzID49IChpbnQzMikoMiAqIDggKiBzaXplb2YobG9uZykpKSB7CisJCWxvbmcqIGxwOworCQkvKgorCQkgKiBBbGlnbiB0byBsb25nd29yZCBib3VuZGFyeSBhbmQgY2hlY2sgbG9uZ3dvcmRzLgorCQkgKi8KKwkJd2hpbGUgKCFpc0FsaWduZWQoYnAsIGxvbmcpKSB7CisJCQlpZiAoKmJwICE9IDB4ZmYpCisJCQkJcmV0dXJuIChzcGFuICsgb25lcnVuc1sqYnBdKTsKKwkJCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQkJYnArKzsKKwkJfQorCQlscCA9IChsb25nKikgYnA7CisJCXdoaWxlICgoYml0cyA+PSAoaW50MzIpKDggKiBzaXplb2YobG9uZykpKSAmJiAofjAgPT0gKmxwKSkgeworCQkJc3BhbiArPSA4KnNpemVvZiAobG9uZyksIGJpdHMgLT0gOCpzaXplb2YgKGxvbmcpOworCQkJbHArKzsKKwkJfQorCQlicCA9ICh1bnNpZ25lZCBjaGFyKikgbHA7CisJfQorCS8qCisJICogU2NhbiBmdWxsIGJ5dGVzIGZvciBhbGwgMSdzLgorCSAqLworCXdoaWxlIChiaXRzID49IDgpIHsKKwkJaWYgKCpicCAhPSAweGZmKQkvKiBlbmQgb2YgcnVuICovCisJCQlyZXR1cm4gKHNwYW4gKyBvbmVydW5zWypicF0pOworCQlzcGFuICs9IDgsIGJpdHMgLT0gODsKKwkJYnArKzsKKwl9CisJLyoKKwkgKiBDaGVjayBwYXJ0aWFsIGJ5dGUgb24gcmhzLgorCSAqLworCWlmIChiaXRzID4gMCkgeworCQluID0gb25lcnVuc1sqYnBdOworCQlzcGFuICs9IChuID4gYml0cyA/IGJpdHMgOiBuKTsKKwl9CisJcmV0dXJuIChzcGFuKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGJpdCBpbiB0aGUgcmFuZ2UKKyAqIFticy4uYmVdIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNwZWNpZmllZAorICogY29sb3IuICBUaGUgZW5kLCBiZSwgaXMgcmV0dXJuZWQgaWYgbm8gc3VjaCBiaXQKKyAqIGV4aXN0cy4KKyAqLworI2RlZmluZQlmaW5kZGlmZihfY3AsIF9icywgX2JlLCBfY29sb3IpCVwKKwkoX2JzICsgKF9jb2xvciA/IGZpbmQxc3BhbihfY3AsX2JzLF9iZSkgOiBmaW5kMHNwYW4oX2NwLF9icyxfYmUpKSkKKy8qCisgKiBMaWtlIGZpbmRkaWZmLCBidXQgYWxzbyBjaGVjayB0aGUgc3RhcnRpbmcgYml0CisgKiBhZ2FpbnN0IHRoZSBlbmQgaW4gY2FzZSBzdGFydCA+IGVuZC4KKyAqLworI2RlZmluZQlmaW5kZGlmZjIoX2NwLCBfYnMsIF9iZSwgX2NvbG9yKSBcCisJKF9icyA8IF9iZSA/IGZpbmRkaWZmKF9jcCxfYnMsX2JlLF9jb2xvcikgOiBfYmUpCisKKy8qCisgKiAxZC1lbmNvZGUgYSByb3cgb2YgcGl4ZWxzLiAgVGhlIGVuY29kaW5nIGlzCisgKiBhIHNlcXVlbmNlIG9mIGFsbC13aGl0ZSBvciBhbGwtYmxhY2sgc3BhbnMKKyAqIG9mIHBpeGVscyBlbmNvZGVkIHdpdGggSHVmZm1hbiBjb2Rlcy4KKyAqLworc3RhdGljIGludAorRmF4M0VuY29kZTFEUm93KFRJRkYqIHRpZiwgdW5zaWduZWQgY2hhciogYnAsIHVpbnQzMiBiaXRzKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCWludDMyIHNwYW47CisgICAgICAgIHVpbnQzMiBicyA9IDA7CisKKwlmb3IgKDs7KSB7CisJCXNwYW4gPSBmaW5kMHNwYW4oYnAsIGJzLCBiaXRzKTsJCS8qIHdoaXRlIHNwYW4gKi8KKwkJcHV0c3Bhbih0aWYsIHNwYW4sIFRJRkZGYXhXaGl0ZUNvZGVzKTsKKwkJYnMgKz0gc3BhbjsKKwkJaWYgKGJzID49IGJpdHMpCisJCQlicmVhazsKKwkJc3BhbiA9IGZpbmQxc3BhbihicCwgYnMsIGJpdHMpOwkJLyogYmxhY2sgc3BhbiAqLworCQlwdXRzcGFuKHRpZiwgc3BhbiwgVElGRkZheEJsYWNrQ29kZXMpOworCQlicyArPSBzcGFuOworCQlpZiAoYnMgPj0gYml0cykKKwkJCWJyZWFrOworCX0KKwlpZiAoc3AtPmIubW9kZSAmIChGQVhNT0RFX0JZVEVBTElHTnxGQVhNT0RFX1dPUkRBTElHTikpIHsKKwkJaWYgKHNwLT5iaXQgIT0gOCkJCQkvKiBieXRlLWFsaWduICovCisJCQlGYXgzRmx1c2hCaXRzKHRpZiwgc3ApOworCQlpZiAoKHNwLT5iLm1vZGUmRkFYTU9ERV9XT1JEQUxJR04pICYmCisJCSAgICAhaXNBbGlnbmVkKHRpZi0+dGlmX3Jhd2NwLCB1aW50MTYpKQorCQkJRmF4M0ZsdXNoQml0cyh0aWYsIHNwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGNvbnN0IHRhYmxlZW50cnkgaG9yaXpjb2RlID0KKyAgICB7IDMsIDB4MSwgMCB9OwkvKiAwMDEgKi8KK3N0YXRpYyBjb25zdCB0YWJsZWVudHJ5IHBhc3Njb2RlID0KKyAgICB7IDQsIDB4MSwgMCB9OwkvKiAwMDAxICovCitzdGF0aWMgY29uc3QgdGFibGVlbnRyeSB2Y29kZXNbN10gPSB7CisgICAgeyA3LCAweDAzLCAwIH0sCS8qIDAwMDAgMDExICovCisgICAgeyA2LCAweDAzLCAwIH0sCS8qIDAwMDAgMTEgKi8KKyAgICB7IDMsIDB4MDMsIDAgfSwJLyogMDExICovCisgICAgeyAxLCAweDEsIDAgfSwJLyogMSAqLworICAgIHsgMywgMHgyLCAwIH0sCS8qIDAxMCAqLworICAgIHsgNiwgMHgwMiwgMCB9LAkvKiAwMDAwIDEwICovCisgICAgeyA3LCAweDAyLCAwIH0JLyogMDAwMCAwMTAgKi8KK307CisKKy8qCisgKiAyZC1lbmNvZGUgYSByb3cgb2YgcGl4ZWxzLiAgQ29uc3VsdCB0aGUgQ0NJVFQKKyAqIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhbGdvcml0aG0uCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNFbmNvZGUyRFJvdyhUSUZGKiB0aWYsIHVuc2lnbmVkIGNoYXIqIGJwLCB1bnNpZ25lZCBjaGFyKiBycCwgdWludDMyIGJpdHMpCit7CisjZGVmaW5lCVBJWEVMKGJ1ZixpeCkJKCgoKGJ1ZilbKGl4KT4+M10pID4+ICg3LSgoaXgpJjcpKSkgJiAxKQorICAgICAgICB1aW50MzIgYTAgPSAwOworCXVpbnQzMiBhMSA9IChQSVhFTChicCwgMCkgIT0gMCA/IDAgOiBmaW5kZGlmZihicCwgMCwgYml0cywgMCkpOworCXVpbnQzMiBiMSA9IChQSVhFTChycCwgMCkgIT0gMCA/IDAgOiBmaW5kZGlmZihycCwgMCwgYml0cywgMCkpOworCXVpbnQzMiBhMiwgYjI7CisKKwlmb3IgKDs7KSB7CisJCWIyID0gZmluZGRpZmYyKHJwLCBiMSwgYml0cywgUElYRUwocnAsYjEpKTsKKwkJaWYgKGIyID49IGExKSB7CisJCQlpbnQzMiBkID0gYjEgLSBhMTsKKwkJCWlmICghKC0zIDw9IGQgJiYgZCA8PSAzKSkgewkvKiBob3Jpem9udGFsIG1vZGUgKi8KKwkJCQlhMiA9IGZpbmRkaWZmMihicCwgYTEsIGJpdHMsIFBJWEVMKGJwLGExKSk7CisJCQkJcHV0Y29kZSh0aWYsICZob3JpemNvZGUpOworCQkJCWlmIChhMCthMSA9PSAwIHx8IFBJWEVMKGJwLCBhMCkgPT0gMCkgeworCQkJCQlwdXRzcGFuKHRpZiwgYTEtYTAsIFRJRkZGYXhXaGl0ZUNvZGVzKTsKKwkJCQkJcHV0c3Bhbih0aWYsIGEyLWExLCBUSUZGRmF4QmxhY2tDb2Rlcyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHV0c3Bhbih0aWYsIGExLWEwLCBUSUZGRmF4QmxhY2tDb2Rlcyk7CisJCQkJCXB1dHNwYW4odGlmLCBhMi1hMSwgVElGRkZheFdoaXRlQ29kZXMpOworCQkJCX0KKwkJCQlhMCA9IGEyOworCQkJfSBlbHNlIHsJCQkvKiB2ZXJ0aWNhbCBtb2RlICovCisJCQkJcHV0Y29kZSh0aWYsICZ2Y29kZXNbZCszXSk7CisJCQkJYTAgPSBhMTsKKwkJCX0KKwkJfSBlbHNlIHsJCQkJLyogcGFzcyBtb2RlICovCisJCQlwdXRjb2RlKHRpZiwgJnBhc3Njb2RlKTsKKwkJCWEwID0gYjI7CisJCX0KKwkJaWYgKGEwID49IGJpdHMpCisJCQlicmVhazsKKwkJYTEgPSBmaW5kZGlmZihicCwgYTAsIGJpdHMsIFBJWEVMKGJwLGEwKSk7CisJCWIxID0gZmluZGRpZmYocnAsIGEwLCBiaXRzLCAhUElYRUwoYnAsYTApKTsKKwkJYjEgPSBmaW5kZGlmZihycCwgYjEsIGJpdHMsIFBJWEVMKGJwLGEwKSk7CisJfQorCXJldHVybiAoMSk7CisjdW5kZWYgUElYRUwKK30KKworLyoKKyAqIEVuY29kZSBhIGJ1ZmZlciBvZiBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNFbmNvZGUoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJGYXgzRW5jb2RlIjsKKwlGYXgzQ29kZWNTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwkodm9pZCkgczsKKwlpZiAoY2MgJSBzcC0+Yi5yb3dieXRlcykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJGcmFjdGlvbmFsIHNjYW5saW5lcyBjYW5ub3QgYmUgd3JpdHRlbiIpOworCQlyZXR1cm4gKDApOworCX0KKwl3aGlsZSAoY2MgPiAwKSB7CisJCWlmICgoc3AtPmIubW9kZSAmIEZBWE1PREVfTk9FT0wpID09IDApCisJCQlGYXgzUHV0RU9MKHRpZik7CisJCWlmIChpczJERW5jb2Rpbmcoc3ApKSB7CisJCQlpZiAoc3AtPnRhZyA9PSBHM18xRCkgeworCQkJCWlmICghRmF4M0VuY29kZTFEUm93KHRpZiwgYnAsIHNwLT5iLnJvd3BpeGVscykpCisJCQkJCXJldHVybiAoMCk7CisJCQkJc3AtPnRhZyA9IEczXzJEOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIUZheDNFbmNvZGUyRFJvdyh0aWYsIGJwLCBzcC0+cmVmbGluZSwKKwkJCQkgICAgc3AtPmIucm93cGl4ZWxzKSkKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQlzcC0+ay0tOworCQkJfQorCQkJaWYgKHNwLT5rID09IDApIHsKKwkJCQlzcC0+dGFnID0gRzNfMUQ7CisJCQkJc3AtPmsgPSBzcC0+bWF4ay0xOworCQkJfSBlbHNlCisJCQkJX1RJRkZtZW1jcHkoc3AtPnJlZmxpbmUsIGJwLCBzcC0+Yi5yb3dieXRlcyk7CisJCX0gZWxzZSB7CisJCQlpZiAoIUZheDNFbmNvZGUxRFJvdyh0aWYsIGJwLCBzcC0+Yi5yb3dwaXhlbHMpKQorCQkJCXJldHVybiAoMCk7CisJCX0KKwkJYnAgKz0gc3AtPmIucm93Ynl0ZXM7CisJCWNjIC09IHNwLT5iLnJvd2J5dGVzOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitGYXgzUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJRmF4M0NvZGVjU3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwlpZiAoc3AtPmJpdCAhPSA4KQorCQlGYXgzRmx1c2hCaXRzKHRpZiwgc3ApOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitGYXgzQ2xvc2UoVElGRiogdGlmKQoreworCWlmICgoRmF4M1N0YXRlKHRpZiktPm1vZGUgJiBGQVhNT0RFX05PUlRDKSA9PSAwKSB7CisJCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCQl1bnNpZ25lZCBpbnQgY29kZSA9IEVPTDsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IDEyOworCQlpbnQgaTsKKworCQlpZiAoaXMyREVuY29kaW5nKHNwKSkKKwkJCWNvZGUgPSAoY29kZTw8MSkgfCAoc3AtPnRhZyA9PSBHM18xRCksIGxlbmd0aCsrOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJRmF4M1B1dEJpdHModGlmLCBjb2RlLCBsZW5ndGgpOworCQlGYXgzRmx1c2hCaXRzKHRpZiwgc3ApOworCX0KK30KKworc3RhdGljIHZvaWQKK0ZheDNDbGVhbnVwKFRJRkYqIHRpZikKK3sKKwlGYXgzQ29kZWNTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKwkKKwlhc3NlcnQoc3AgIT0gMCk7CisKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IHNwLT5iLnZnZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBzcC0+Yi52c2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXIgPSBzcC0+Yi5wcmludGRpcjsKKworCWlmIChzcC0+cnVucykKKwkJX1RJRkZmcmVlKHNwLT5ydW5zKTsKKwlpZiAoc3AtPnJlZmxpbmUpCisJCV9USUZGZnJlZShzcC0+cmVmbGluZSk7CisKKwlfVElGRmZyZWUodGlmLT50aWZfZGF0YSk7CisJdGlmLT50aWZfZGF0YSA9IE5VTEw7CisKKwlfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKHRpZik7Cit9CisKKyNkZWZpbmUJRklFTERfQkFERkFYTElORVMJKEZJRUxEX0NPREVDKzApCisjZGVmaW5lCUZJRUxEX0NMRUFORkFYREFUQQkoRklFTERfQ09ERUMrMSkKKyNkZWZpbmUJRklFTERfQkFERkFYUlVOCQkoRklFTERfQ09ERUMrMikKKworI2RlZmluZQlGSUVMRF9PUFRJT05TCQkoRklFTERfQ09ERUMrNykKKworc3RhdGljIGNvbnN0IFRJRkZGaWVsZCBmYXhGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfRkFYTU9ERSwgMCwgMCwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIEZBTFNFLCBGQUxTRSwgIkZheE1vZGUiLCBOVUxMIH0sCisgICAgeyBUSUZGVEFHX0ZBWEZJTExGVU5DLCAwLCAwLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfT1RIRVIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBGQUxTRSwgRkFMU0UsICJGYXhGaWxsRnVuYyIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfQkFERkFYTElORVMsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VSU5UMzIsIEZJRUxEX0JBREZBWExJTkVTLCBUUlVFLCBGQUxTRSwgIkJhZEZheExpbmVzIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19DTEVBTkZBWERBVEEsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVUlOVDE2LCBGSUVMRF9DTEVBTkZBWERBVEEsIFRSVUUsIEZBTFNFLCAiQ2xlYW5GYXhEYXRhIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19DT05TRUNVVElWRUJBREZBWExJTkVTLCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVUlOVDMyLCBGSUVMRF9CQURGQVhSVU4sIFRSVUUsIEZBTFNFLCAiQ29uc2VjdXRpdmVCYWRGYXhMaW5lcyIsIE5VTEwgfX07CitzdGF0aWMgY29uc3QgVElGRkZpZWxkIGZheDNGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfR1JPVVAzT1BUSU9OUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VJTlQzMiwgRklFTERfT1BUSU9OUywgRkFMU0UsIEZBTFNFLCAiR3JvdXAzT3B0aW9ucyIsIE5VTEwgfSwKK307CitzdGF0aWMgY29uc3QgVElGRkZpZWxkIGZheDRGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfR1JPVVA0T1BUSU9OUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VJTlQzMiwgRklFTERfT1BUSU9OUywgRkFMU0UsIEZBTFNFLCAiR3JvdXA0T3B0aW9ucyIsIE5VTEwgfSwKK307CisKK3N0YXRpYyBpbnQKK0ZheDNWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCUZheDNCYXNlU3RhdGUqIHNwID0gRmF4M1N0YXRlKHRpZik7CisJY29uc3QgVElGRkZpZWxkKiBmaXA7CisKKwlhc3NlcnQoc3AgIT0gMCk7CisJYXNzZXJ0KHNwLT52c2V0cGFyZW50ICE9IDApOworCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfRkFYTU9ERToKKwkJc3AtPm1vZGUgPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCXJldHVybiAxOwkJCS8qIE5COiBwc2V1ZG8gdGFnICovCisJY2FzZSBUSUZGVEFHX0ZBWEZJTExGVU5DOgorCQlEZWNvZGVyU3RhdGUodGlmKS0+ZmlsbCA9IHZhX2FyZyhhcCwgVElGRkZheEZpbGxGdW5jKTsKKwkJcmV0dXJuIDE7CQkJLyogTkI6IHBzZXVkbyB0YWcgKi8KKwljYXNlIFRJRkZUQUdfR1JPVVAzT1BUSU9OUzoKKwkJLyogWFhYOiBhdm9pZCByZWFkaW5nIG9wdGlvbnMgaWYgY29tcHJlc3Npb24gbWlzbWF0Y2hlcy4gKi8KKwkJaWYgKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDMpCisJCQlzcC0+Z3JvdXBvcHRpb25zID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfR1JPVVA0T1BUSU9OUzoKKwkJLyogWFhYOiBhdm9pZCByZWFkaW5nIG9wdGlvbnMgaWYgY29tcHJlc3Npb24gbWlzbWF0Y2hlcy4gKi8KKwkJaWYgKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDQpCisJCQlzcC0+Z3JvdXBvcHRpb25zID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQkFERkFYTElORVM6CisJCXNwLT5iYWRmYXhsaW5lcyA9ICh1aW50MzIpIHZhX2FyZyhhcCwgdWludDMyKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0NMRUFORkFYREFUQToKKwkJc3AtPmNsZWFuZmF4ZGF0YSA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19DT05TRUNVVElWRUJBREZBWExJTkVTOgorCQlzcC0+YmFkZmF4cnVuID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJCisJaWYgKChmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZiwgdGFnKSkpCisJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIGZpcC0+ZmllbGRfYml0KTsKKwllbHNlCisJCXJldHVybiAwOworCisJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9ESVJUWURJUkVDVDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorRmF4M1ZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJRmF4M0Jhc2VTdGF0ZSogc3AgPSBGYXgzU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSAwKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX0ZBWE1PREU6CisJCSp2YV9hcmcoYXAsIGludCopID0gc3AtPm1vZGU7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19GQVhGSUxMRlVOQzoKKwkJKnZhX2FyZyhhcCwgVElGRkZheEZpbGxGdW5jKikgPSBEZWNvZGVyU3RhdGUodGlmKS0+ZmlsbDsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0dST1VQM09QVElPTlM6CisJY2FzZSBUSUZGVEFHX0dST1VQNE9QVElPTlM6CisJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gc3AtPmdyb3Vwb3B0aW9uczsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0JBREZBWExJTkVTOgorCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9IHNwLT5iYWRmYXhsaW5lczsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0NMRUFORkFYREFUQToKKwkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBzcC0+Y2xlYW5mYXhkYXRhOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQ09OU0VDVVRJVkVCQURGQVhMSU5FUzoKKwkJKnZhX2FyZyhhcCwgdWludDMyKikgPSBzcC0+YmFkZmF4cnVuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK0ZheDNQcmludERpcihUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKQoreworCUZheDNCYXNlU3RhdGUqIHNwID0gRmF4M1N0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gMCk7CisKKwkodm9pZCkgZmxhZ3M7CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfT1BUSU9OUykpIHsKKwkJY29uc3QgY2hhciogc2VwID0gIiAiOworCQlpZiAodGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX0NDSVRURkFYNCkgeworCQkJZnByaW50ZihmZCwgIiAgR3JvdXAgNCBPcHRpb25zOiIpOworCQkJaWYgKHNwLT5ncm91cG9wdGlvbnMgJiBHUk9VUDRPUFRfVU5DT01QUkVTU0VEKQorCQkJCWZwcmludGYoZmQsICIlc3VuY29tcHJlc3NlZCBkYXRhIiwgc2VwKTsKKwkJfSBlbHNlIHsKKworCQkJZnByaW50ZihmZCwgIiAgR3JvdXAgMyBPcHRpb25zOiIpOworCQkJaWYgKHNwLT5ncm91cG9wdGlvbnMgJiBHUk9VUDNPUFRfMkRFTkNPRElORykKKwkJCQlmcHJpbnRmKGZkLCAiJXMyLWQgZW5jb2RpbmciLCBzZXApLCBzZXAgPSAiKyI7CisJCQlpZiAoc3AtPmdyb3Vwb3B0aW9ucyAmIEdST1VQM09QVF9GSUxMQklUUykKKwkJCQlmcHJpbnRmKGZkLCAiJXNFT0wgcGFkZGluZyIsIHNlcCksIHNlcCA9ICIrIjsKKwkJCWlmIChzcC0+Z3JvdXBvcHRpb25zICYgR1JPVVAzT1BUX1VOQ09NUFJFU1NFRCkKKwkJCQlmcHJpbnRmKGZkLCAiJXN1bmNvbXByZXNzZWQgZGF0YSIsIHNlcCk7CisJCX0KKwkJZnByaW50ZihmZCwgIiAoJWx1ID0gMHglbHgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNwLT5ncm91cG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc3AtPmdyb3Vwb3B0aW9ucyk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0NMRUFORkFYREFUQSkpIHsKKwkJZnByaW50ZihmZCwgIiAgRmF4IERhdGE6Iik7CisJCXN3aXRjaCAoc3AtPmNsZWFuZmF4ZGF0YSkgeworCQljYXNlIENMRUFORkFYREFUQV9DTEVBTjoKKwkJCWZwcmludGYoZmQsICIgY2xlYW4iKTsKKwkJCWJyZWFrOworCQljYXNlIENMRUFORkFYREFUQV9SRUdFTkVSQVRFRDoKKwkJCWZwcmludGYoZmQsICIgcmVjZWl2ZXIgcmVnZW5lcmF0ZWQiKTsKKwkJCWJyZWFrOworCQljYXNlIENMRUFORkFYREFUQV9VTkNMRUFOOgorCQkJZnByaW50ZihmZCwgIiB1bmNvcnJlY3RlZCBlcnJvcnMiKTsKKwkJCWJyZWFrOworCQl9CisJCWZwcmludGYoZmQsICIgKCV1ID0gMHgleClcbiIsCisJCSAgICBzcC0+Y2xlYW5mYXhkYXRhLCBzcC0+Y2xlYW5mYXhkYXRhKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQkFERkFYTElORVMpKQorCQlmcHJpbnRmKGZkLCAiICBCYWQgRmF4IExpbmVzOiAlbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc3AtPmJhZGZheGxpbmVzKTsKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9CQURGQVhSVU4pKQorCQlmcHJpbnRmKGZkLCAiICBDb25zZWN1dGl2ZSBCYWQgRmF4IExpbmVzOiAlbHVcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZykgc3AtPmJhZGZheHJ1bik7CisJaWYgKHNwLT5wcmludGRpcikKKwkJKCpzcC0+cHJpbnRkaXIpKHRpZiwgZmQsIGZsYWdzKTsKK30KKworc3RhdGljIGludAorSW5pdENDSVRURmF4MyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiSW5pdENDSVRURmF4MyI7CisJRmF4M0Jhc2VTdGF0ZSogc3A7CisKKwkvKgorCSAqIE1lcmdlIGNvZGVjLXNwZWNpZmljIHRhZyBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBmYXhGaWVsZHMsIFRJRkZBcnJheUNvdW50KGZheEZpZWxkcykpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiSW5pdENDSVRURmF4MyIsCisJCQkiTWVyZ2luZyBjb21tb24gQ0NJVFQgRmF4IGNvZGVjLXNwZWNpZmljIHRhZ3MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWxsb2NhdGUgc3RhdGUgYmxvY2sgc28gdGFnIG1ldGhvZHMgaGF2ZSBzdG9yYWdlIHRvIHJlY29yZCB2YWx1ZXMuCisJICovCisJdGlmLT50aWZfZGF0YSA9ICh1aW50OCopCisJCV9USUZGbWFsbG9jKHNpemVvZiAoRmF4M0NvZGVjU3RhdGUpKTsKKworCWlmICh0aWYtPnRpZl9kYXRhID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJObyBzcGFjZSBmb3Igc3RhdGUgYmxvY2siKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlzcCA9IEZheDNTdGF0ZSh0aWYpOworICAgICAgICBzcC0+cndfbW9kZSA9IHRpZi0+dGlmX21vZGU7CisKKwkvKgorCSAqIE92ZXJyaWRlIHBhcmVudCBnZXQvc2V0IGZpZWxkIG1ldGhvZHMuCisJICovCisJc3AtPnZnZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IEZheDNWR2V0RmllbGQ7IC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKwlzcC0+dnNldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gRmF4M1ZTZXRGaWVsZDsgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCXNwLT5wcmludGRpciA9IHRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXI7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9IEZheDNQcmludERpcjsgICAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisJc3AtPmdyb3Vwb3B0aW9ucyA9IDA7CQorCisJaWYgKHNwLT5yd19tb2RlID09IE9fUkRPTkxZKSAvKiBGSVhNRTogaW1wcm92ZSBmb3IgaW4gcGxhY2UgdXBkYXRlICovCisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTk9CSVRSRVY7IC8qIGRlY29kZXIgZG9lcyBiaXQgcmV2ZXJzYWwgKi8KKwlEZWNvZGVyU3RhdGUodGlmKS0+cnVucyA9IE5VTEw7CisJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19GQVhGSUxMRlVOQywgX1RJRkZGYXgzZmlsbHJ1bnMpOworCUVuY29kZXJTdGF0ZSh0aWYpLT5yZWZsaW5lID0gTlVMTDsKKworCS8qCisJICogSW5zdGFsbCBjb2RlYyBtZXRob2RzLgorCSAqLworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IEZheDNGaXh1cFRhZ3M7CisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBGYXgzU2V0dXBTdGF0ZTsKKwl0aWYtPnRpZl9wcmVkZWNvZGUgPSBGYXgzUHJlRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXJvdyA9IEZheDNEZWNvZGUxRDsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEZheDNEZWNvZGUxRDsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gRmF4M0RlY29kZTFEOworCXRpZi0+dGlmX3NldHVwZW5jb2RlID0gRmF4M1NldHVwU3RhdGU7CisJdGlmLT50aWZfcHJlZW5jb2RlID0gRmF4M1ByZUVuY29kZTsKKwl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gRmF4M1Bvc3RFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93ID0gRmF4M0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IEZheDNFbmNvZGU7CisJdGlmLT50aWZfZW5jb2RldGlsZSA9IEZheDNFbmNvZGU7CisJdGlmLT50aWZfY2xvc2UgPSBGYXgzQ2xvc2U7CisJdGlmLT50aWZfY2xlYW51cCA9IEZheDNDbGVhbnVwOworCisJcmV0dXJuICgxKTsKK30KKworaW50CitUSUZGSW5pdENDSVRURmF4MyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJKHZvaWQpIHNjaGVtZTsKKwlpZiAoSW5pdENDSVRURmF4Myh0aWYpKSB7CisJCS8qCisJCSAqIE1lcmdlIGNvZGVjLXNwZWNpZmljIHRhZyBpbmZvcm1hdGlvbi4KKwkJICovCisJCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIGZheDNGaWVsZHMsCisJCQkJICAgICAgVElGRkFycmF5Q291bnQoZmF4M0ZpZWxkcykpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZJbml0Q0NJVFRGYXgzIiwKKwkJCSJNZXJnaW5nIENDSVRUIEZheCAzIGNvZGVjLXNwZWNpZmljIHRhZ3MgZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBkZWZhdWx0IGZvcm1hdCBpcyBDbGFzcy9GLXN0eWxlIHcvbyBSVEMuCisJCSAqLworCQlyZXR1cm4gVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19GQVhNT0RFLCBGQVhNT0RFX0NMQVNTRik7CisJfSBlbHNlCisJCXJldHVybiAwMTsKK30KKworLyoKKyAqIENDSVRUIEdyb3VwIDQgKFQuNikgRmFjc2ltaWxlLWNvbXBhdGlibGUKKyAqIENvbXByZXNzaW9uIFNjaGVtZSBTdXBwb3J0LgorICovCisKKyNkZWZpbmUgU1dBUCh0LGEsYikgeyB0IHg7IHggPSAoYSk7IChhKSA9IChiKTsgKGIpID0geDsgfQorLyoKKyAqIERlY29kZSB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBHNC1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDREZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworI2lmZGVmIEZBWDNfREVCVUcKKwlGSUxFKiBmaWxlOworI2VuZGlmCisJREVDTEFSRV9TVEFURV8yRCh0aWYsIHNwLCAiRmF4NERlY29kZSIpOworCisJKHZvaWQpIHM7CisJaWYgKG9jYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlDQUNIRV9TVEFURSh0aWYsIHNwKTsKKwl3aGlsZSAob2NjID4gMCkgeworCQlhMCA9IDA7CisJCVJ1bkxlbmd0aCA9IDA7CisJCXBhID0gdGhpc3J1biA9IHNwLT5jdXJydW5zOworCQlwYiA9IHNwLT5yZWZydW5zOworCQliMSA9ICpwYisrOworI2lmZGVmIEZBWDNfREVCVUcKKwkJcHJpbnRmKCJcbkJpdEFjYz0lMDhYLCBCaXRzQXZhaWwgPSAlZFxuIiwgQml0QWNjLCBCaXRzQXZhaWwpOworCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tICVkXG4iLCB0aWYtPnRpZl9yb3cpOworCQlmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCQlFWFBBTkQyRChFT0ZHNCk7CisgICAgICAgICAgICAgICAgaWYgKEVPTGNudCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFT0ZHNDsKKwkJKCpzcC0+ZmlsbCkoYnVmLCB0aGlzcnVuLCBwYSwgbGFzdHgpOworI2lmZGVmIEZBWDNfREVCVUcKKwkJZmlsZSA9IGZvcGVuKCJmaWxsYnVmLnR4dCIsICJhIik7CisJCWZ3cml0ZShidWYsIHNwLT5iLnJvd2J5dGVzLCAxLCBmaWxlKTsKKwkJZmNsb3NlKGZpbGUpOworI2VuZGlmCisJCVNFVFZBTFVFKDApOwkJLyogaW1hZ2luYXJ5IGNoYW5nZSBmb3IgcmVmZXJlbmNlICovCisJCVNXQVAodWludDMyKiwgc3AtPmN1cnJ1bnMsIHNwLT5yZWZydW5zKTsKKwkJYnVmICs9IHNwLT5iLnJvd2J5dGVzOworCQlvY2MgLT0gc3AtPmIucm93Ynl0ZXM7CisJCXNwLT5saW5lKys7CisJCWNvbnRpbnVlOworCUVPRkc0OgorICAgICAgICAgICAgICAgIE5lZWRCaXRzMTYoIDEzLCBCQURHNCApOworICAgICAgICBCQURHNDoKKyNpZmRlZiBGQVgzX0RFQlVHCisgICAgICAgICAgICAgICAgaWYoIEdldEJpdHMoMTMpICE9IDB4MTAwMSApCisgICAgICAgICAgICAgICAgICAgIGZwdXRzKCAiQmFkIEVPRkJcbiIsIHN0ZGVyciApOworI2VuZGlmICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENsckJpdHMoIDEzICk7CisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKyNpZmRlZiBGQVgzX0RFQlVHCisJCWZpbGUgPSBmb3BlbigiZmlsbGJ1Zi50eHQiLCAiYSIpOworCQlmd3JpdGUoYnVmLCBzcC0+Yi5yb3dieXRlcywgMSwgZmlsZSk7CisJCWZjbG9zZShmaWxlKTsKKyNlbmRpZgorCQlVTkNBQ0hFX1NUQVRFKHRpZiwgc3ApOworCQlyZXR1cm4gKCBzcC0+bGluZSA/IDEgOiAtMSk7CS8qIGRvbid0IGVycm9yIG9uIGJhZGx5LXRlcm1pbmF0ZWQgc3RyaXBzICovCisJfQorCVVOQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKyN1bmRlZglTV0FQCisKKy8qCisgKiBFbmNvZGUgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YS4KKyAqLworc3RhdGljIGludAorRmF4NEVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkZheDRFbmNvZGUiOworCUZheDNDb2RlY1N0YXRlICpzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCSh2b2lkKSBzOworCWlmIChjYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSB3cml0dGVuIik7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlIChjYyA+IDApIHsKKwkJaWYgKCFGYXgzRW5jb2RlMkRSb3codGlmLCBicCwgc3AtPnJlZmxpbmUsIHNwLT5iLnJvd3BpeGVscykpCisJCQlyZXR1cm4gKDApOworCQlfVElGRm1lbWNweShzcC0+cmVmbGluZSwgYnAsIHNwLT5iLnJvd2J5dGVzKTsKKwkJYnAgKz0gc3AtPmIucm93Ynl0ZXM7CisJCWNjIC09IHNwLT5iLnJvd2J5dGVzOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitGYXg0UG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJRmF4M0NvZGVjU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwkvKiB0ZXJtaW5hdGUgc3RyaXAgdy8gRU9GQiAqLworCUZheDNQdXRCaXRzKHRpZiwgRU9MLCAxMik7CisJRmF4M1B1dEJpdHModGlmLCBFT0wsIDEyKTsKKwlpZiAoc3AtPmJpdCAhPSA4KQorCQlGYXgzRmx1c2hCaXRzKHRpZiwgc3ApOworCXJldHVybiAoMSk7Cit9CisKK2ludAorVElGRkluaXRDQ0lUVEZheDQoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisJaWYgKEluaXRDQ0lUVEZheDModGlmKSkgewkJLyogcmV1c2UgRzMgc3VwcG9ydCAqLworCQkvKgorCQkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJCSAqLworCQlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBmYXg0RmllbGRzLAorCQkJCSAgICAgIFRJRkZBcnJheUNvdW50KGZheDRGaWVsZHMpKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGSW5pdENDSVRURmF4NCIsCisJCQkiTWVyZ2luZyBDQ0lUVCBGYXggNCBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl0aWYtPnRpZl9kZWNvZGVyb3cgPSBGYXg0RGVjb2RlOworCQl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEZheDREZWNvZGU7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBGYXg0RGVjb2RlOworCQl0aWYtPnRpZl9lbmNvZGVyb3cgPSBGYXg0RW5jb2RlOworCQl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IEZheDRFbmNvZGU7CisJCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBGYXg0RW5jb2RlOworCQl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gRmF4NFBvc3RFbmNvZGU7CisJCS8qCisJCSAqIFN1cHByZXNzIFJUQyBhdCB0aGUgZW5kIG9mIGVhY2ggc3RyaXAuCisJCSAqLworCQlyZXR1cm4gVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19GQVhNT0RFLCBGQVhNT0RFX05PUlRDKTsKKwl9IGVsc2UKKwkJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENDSVRUIEdyb3VwIDMgMS1EIE1vZGlmaWVkIEh1ZmZtYW4gUkxFIENvbXByZXNzaW9uIFN1cHBvcnQuCisgKiAoQ29tcHJlc3Npb24gYWxnb3JpdGhtcyAyIGFuZCAzMjc3MSkKKyAqLworCisvKgorICogRGVjb2RlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIFJMRS1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNEZWNvZGVSTEUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworCURFQ0xBUkVfU1RBVEUodGlmLCBzcCwgIkZheDNEZWNvZGVSTEUiKTsKKwlpbnQgbW9kZSA9IHNwLT5iLm1vZGU7CisJKHZvaWQpIHM7CisJaWYgKG9jYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlDQUNIRV9TVEFURSh0aWYsIHNwKTsKKwl0aGlzcnVuID0gc3AtPmN1cnJ1bnM7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW47CisjaWZkZWYgRkFYM19ERUJVRworCQlwcmludGYoIlxuQml0QWNjPSUwOFgsIEJpdHNBdmFpbCA9ICVkXG4iLCBCaXRBY2MsIEJpdHNBdmFpbCk7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gJWRcbiIsIHRpZi0+dGlmX3Jvdyk7CisJCWZmbHVzaChzdGRvdXQpOworI2VuZGlmCisJCUVYUEFORDFEKEVPRlJMRSk7CisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJLyoKKwkJICogQ2xlYW51cCBhdCB0aGUgZW5kIG9mIHRoZSByb3cuCisJCSAqLworCQlpZiAobW9kZSAmIEZBWE1PREVfQllURUFMSUdOKSB7CisJCQlpbnQgbiA9IEJpdHNBdmFpbCAtIChCaXRzQXZhaWwgJn4gNyk7CisJCQlDbHJCaXRzKG4pOworCQl9IGVsc2UgaWYgKG1vZGUgJiBGQVhNT0RFX1dPUkRBTElHTikgeworCQkJaW50IG4gPSBCaXRzQXZhaWwgLSAoQml0c0F2YWlsICZ+IDE1KTsKKwkJCUNsckJpdHMobik7CisJCQlpZiAoQml0c0F2YWlsID09IDAgJiYgIWlzQWxpZ25lZChjcCwgdWludDE2KSkKKwkJCSAgICBjcCsrOworCQl9CisJCWJ1ZiArPSBzcC0+Yi5yb3dieXRlczsKKwkJb2NjIC09IHNwLT5iLnJvd2J5dGVzOworCQlzcC0+bGluZSsrOworCQljb250aW51ZTsKKwlFT0ZSTEU6CQkJCS8qIHByZW1hdHVyZSBFT0YgKi8KKwkJKCpzcC0+ZmlsbCkoYnVmLCB0aGlzcnVuLCBwYSwgbGFzdHgpOworCQlVTkNBQ0hFX1NUQVRFKHRpZiwgc3ApOworCQlyZXR1cm4gKC0xKTsKKwl9CisJVU5DQUNIRV9TVEFURSh0aWYsIHNwKTsKKwlyZXR1cm4gKDEpOworfQorCitpbnQKK1RJRkZJbml0Q0NJVFRSTEUoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisJaWYgKEluaXRDQ0lUVEZheDModGlmKSkgewkJLyogcmV1c2UgRzMgc3VwcG9ydCAqLworCQl0aWYtPnRpZl9kZWNvZGVyb3cgPSBGYXgzRGVjb2RlUkxFOworCQl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEZheDNEZWNvZGVSTEU7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBGYXgzRGVjb2RlUkxFOworCQkvKgorCQkgKiBTdXBwcmVzcyBSVEMrRU9McyB3aGVuIGVuY29kaW5nIGFuZCBieXRlLWFsaWduIGRhdGEuCisJCSAqLworCQlyZXR1cm4gVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19GQVhNT0RFLAorCQkgICAgRkFYTU9ERV9OT1JUQ3xGQVhNT0RFX05PRU9MfEZBWE1PREVfQllURUFMSUdOKTsKKwl9IGVsc2UKKwkJcmV0dXJuICgwKTsKK30KKworaW50CitUSUZGSW5pdENDSVRUUkxFVyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJKHZvaWQpIHNjaGVtZTsKKwlpZiAoSW5pdENDSVRURmF4Myh0aWYpKSB7CQkvKiByZXVzZSBHMyBzdXBwb3J0ICovCisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IEZheDNEZWNvZGVSTEU7CisJCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gRmF4M0RlY29kZVJMRTsKKwkJdGlmLT50aWZfZGVjb2RldGlsZSA9IEZheDNEZWNvZGVSTEU7ICAKKwkJLyoKKwkJICogU3VwcHJlc3MgUlRDK0VPTHMgd2hlbiBlbmNvZGluZyBhbmQgd29yZC1hbGlnbiBkYXRhLgorCQkgKi8KKwkJcmV0dXJuIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfRkFYTU9ERSwKKwkJICAgIEZBWE1PREVfTk9SVEN8RkFYTU9ERV9OT0VPTHxGQVhNT0RFX1dPUkRBTElHTik7CisJfSBlbHNlCisJCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogQ0NJVFRfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mYXgzLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mYXgzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmNDZjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2ZheDMuaApAQCAtMCwwICsxLDUzOCBAQAorLyogJElkOiB0aWZfZmF4My5oLHYgMS45IDIwMTEtMDMtMTAgMjA6MjM6MDcgZndhcm1lcmRhbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRkFYM18KKyNkZWZpbmUJX0ZBWDNfCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIENDSVRUIEdyb3VwIDMgKFQuNCkgYW5kIEdyb3VwIDQgKFQuNikgRGVjb21wcmVzc2lvbiBTdXBwb3J0LgorICoKKyAqIERlY29kZXIgc3VwcG9ydCBpcyBkZXJpdmVkLCB3aXRoIHBlcm1pc3Npb24sIGZyb20gdGhlIGNvZGUKKyAqIGluIEZyYW5rIENyaW5nbGUncyB2aWV3ZmF4IHByb2dyYW07CisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5NSAgRnJhbmsgRC4gQ3JpbmdsZS4KKyAqLworI2luY2x1ZGUgInRpZmYuaCIKKworLyoKKyAqIFRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJvdXRpbmUgdXNlZCB0byBpbWFnZSBkZWNvZGVkCisgKiBzcGFucyBvbmUgY2FuIHVzZSB0aGUgcHNlZHVvIHRhZyBUSUZGVEFHX0ZBWEZJTExGVU5DLgorICogVGhlIHJvdXRpbmUgbXVzdCBoYXZlIHRoZSB0eXBlIHNpZ25hdHVyZSBnaXZlbiBiZWxvdzsKKyAqIGZvciBleGFtcGxlOgorICoKKyAqIGZpbGxydW5zKHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdWludDMyKiBydW5zLCB1aW50MzIqIGVydW4sIHVpbnQzMiBsYXN0eCkKKyAqCisgKiB3aGVyZSBidWYgaXMgcGxhY2UgdG8gc2V0IHRoZSBiaXRzLCBydW5zIGlzIHRoZSBhcnJheSBvZiBiJncgcnVuCisgKiBsZW5ndGhzICh3aGl0ZSB0aGVuIGJsYWNrKSwgZXJ1biBpcyB0aGUgbGFzdCBydW4gaW4gdGhlIGFycmF5LCBhbmQKKyAqIGxhc3R4IGlzIHRoZSB3aWR0aCBvZiB0aGUgcm93IGluIHBpeGVscy4gIEZpbGwgcm91dGluZXMgY2FuIGFzc3VtZQorICogdGhlIHJ1biBhcnJheSBoYXMgcm9vbSBmb3IgYXQgbGVhc3QgbGFzdHggcnVucyBhbmQgY2FuIG92ZXJ3cml0ZQorICogZGF0YSBpbiB0aGUgcnVuIGFycmF5IGFzIG5lZWRlZCAoZS5nLiB0byBhcHBlbmQgemVybyBydW5zIHRvIGJyaW5nCisgKiB0aGUgY291bnQgdXAgdG8gYSBuaWNlIG11bHRpcGxlKS4KKyAqLwordHlwZWRlZiB2b2lkICgqVElGRkZheEZpbGxGdW5jKSh1bnNpZ25lZCBjaGFyKiwgdWludDMyKiwgdWludDMyKiwgdWludDMyKTsKKworLyoKKyAqIFRoZSBkZWZhdWx0IHJ1biBmaWxsZXI7IG1hZGUgZXh0ZXJuYWwgZm9yIG90aGVyIGRlY29kZXJzLgorICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gdm9pZCBfVElGRkZheDNmaWxscnVucyh1bnNpZ25lZCBjaGFyKiwgdWludDMyKiwgdWludDMyKiwgdWludDMyKTsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKworLyogZmluaXRlIHN0YXRlIG1hY2hpbmUgY29kZXMgKi8KKyNkZWZpbmUgU19OdWxsICAgICAwCisjZGVmaW5lIFNfUGFzcyAgICAgMQorI2RlZmluZSBTX0hvcml6ICAgIDIKKyNkZWZpbmUgU19WMCAgICAgICAzCisjZGVmaW5lIFNfVlIgICAgICAgNAorI2RlZmluZSBTX1ZMICAgICAgIDUKKyNkZWZpbmUgU19FeHQgICAgICA2CisjZGVmaW5lIFNfVGVybVcgICAgNworI2RlZmluZSBTX1Rlcm1CICAgIDgKKyNkZWZpbmUgU19NYWtlVXBXICA5CisjZGVmaW5lIFNfTWFrZVVwQiAgMTAKKyNkZWZpbmUgU19NYWtlVXAgICAxMQorI2RlZmluZSBTX0VPTCAgICAgIDEyCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgLyogc3RhdGUgdGFibGUgZW50cnkgKi8KKwl1bnNpZ25lZCBjaGFyIFN0YXRlOyAgICAvKiBzZWUgYWJvdmUgKi8KKwl1bnNpZ25lZCBjaGFyIFdpZHRoOyAgICAvKiB3aWR0aCBvZiBjb2RlIGluIGJpdHMgKi8KKwl1aW50MzIgUGFyYW07ICAgICAgICAgICAvKiB1bnNpZ25lZCAzMi1iaXQgcnVuIGxlbmd0aCBpbiBiaXRzICovCit9IFRJRkZGYXhUYWJFbnQ7CisKK2V4dGVybiBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhNYWluVGFibGVbXTsKK2V4dGVybiBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhXaGl0ZVRhYmxlW107CitleHRlcm4gY29uc3QgVElGRkZheFRhYkVudCBUSUZGRmF4QmxhY2tUYWJsZVtdOworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgZGVmaW5lIHRoZSBtYWpvcml0eSBvZiB0aGUgRzMvRzQgZGVjb2RlcgorICogYWxnb3JpdGhtIHVzaW5nIHRoZSBzdGF0ZSB0YWJsZXMgZGVmaW5lZCBlbHNld2hlcmUuICBUbyBidWlsZAorICogYSBkZWNvZGVyIHlvdSBuZWVkIHNvbWUgc2V0dXAgY29kZSBhbmQgc29tZSBnbHVlIGNvZGUuIE5vdGUKKyAqIHRoYXQgeW91IG1heSBhbHNvIG5lZWQvd2FudCB0byBjaGFuZ2UgdGhlIHdheSB0aGUgTmVlZEJpdHMqCisgKiBtYWNyb3MgZ2V0IGlucHV0IGRhdGEgaWYsIGZvciBleGFtcGxlLCB5b3Uga25vdyB0aGUgZGF0YSB0byBiZQorICogZGVjb2RlZCBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZCBvcmllbnRlZCAoZG9pbmcgc28gYmVmb3JlIHJ1bm5pbmcKKyAqIHRoZSBkZWNvZGVyIGNhbiBiZSBhIGJpZyBwZXJmb3JtYW5jZSB3aW4pLgorICoKKyAqIENvbnN1bHQgdGhlIGRlY29kZXIgaW4gdGhlIFRJRkYgbGlicmFyeSBmb3IgYW4gaWRlYSBvZiB3aGF0IHlvdQorICogbmVlZCB0byBkZWZpbmUgYW5kIHNldHVwIHRvIG1ha2UgdXNlIG9mIHRoZXNlIGRlZmluaXRpb25zLgorICoKKyAqIE5COiB0byBlbmFibGUgYSBkZWJ1Z2dpbmcgdmVyc2lvbiBvZiB0aGVzZSBtYWNyb3MgZGVmaW5lIEZBWDNfREVCVUcKKyAqICAgICBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4gIFRyYWNlIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKyAqLworCisjaWZuZGVmIEVuZE9mRGF0YQorI2RlZmluZSBFbmRPZkRhdGEoKQkoY3AgPj0gZXApCisjZW5kaWYKKy8qCisgKiBOZWVkIDw9OCBvciA8PTE2IGJpdHMgb2YgaW5wdXQgZGF0YS4gIFVubGlrZSB2aWV3ZmF4IHdlCisgKiBjYW5ub3QgdXNlL2Fzc3VtZSBhIHdvcmQtYWxpZ25lZCwgcHJvcGVybHkgYml0IHN3aXp6bGVkCisgKiBpbnB1dCBkYXRhIHNldCBiZWNhdXNlIGRhdGEgbWF5IGNvbWUgZnJvbSBhbiBhcmJpdHJhcmlseQorICogYWxpZ25lZCwgcmVhZC1vbmx5IHNvdXJjZSBzdWNoIGFzIGEgbWVtb3J5LW1hcHBlZCBmaWxlLgorICogTm90ZSBhbHNvIHRoYXQgdGhlIHZpZXdmYXggZGVjb2RlciBkb2VzIG5vdCBjaGVjayBmb3IKKyAqIHJ1bm5pbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVyLiAgVGhpcyBpcworICogcG9zc2libGUgZm9yIEczLWVuY29kZWQgZGF0YSBiZWNhdXNlIGl0IHByZXNjYW5zIHRoZSBpbnB1dAorICogZGF0YSB0byBjb3VudCBFT0wgbWFya2VycywgYnV0IGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgRzQKKyAqIGRhdGEuICBJbiBhbnkgZXZlbnQsIHdlIGRvbid0IHByZXNjYW4gYW5kIG11c3Qgd2F0Y2ggZm9yCisgKiBydW5uaW5nIG91dCBvZiBkYXRhIHNpbmNlIHdlIGNhbid0IHBlcm1pdCB0aGUgbGlicmFyeSB0bworICogc2NhbiBwYXN0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVyLgorICoKKyAqIEZpbmFsbHksIG5vdGUgdGhhdCB3ZSBtdXN0IGhhbmRsZSByZW1haW5kZXJlZCBkYXRhIGF0IHRoZSBlbmQKKyAqIG9mIGEgc3RyaXAgc3BlY2lhbGx5LiAgVGhlIGNvZGVyIGFza3MgZm9yIGEgZml4ZWQgbnVtYmVyIG9mCisgKiBiaXRzIHdoZW4gc2Nhbm5pbmcgZm9yIHRoZSBuZXh0IGNvZGUuICBUaGlzIG1heSBiZSBtb3JlIGJpdHMKKyAqIHRoYW4gYXJlIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIGRhdGEgc3RyZWFtLiAgSWYgd2UgYXBwZWFyCisgKiB0byBydW4gb3V0IG9mIGRhdGEgYnV0IHN0aWxsIGhhdmUgc29tZSBudW1iZXIgb2YgdmFsaWQgYml0cworICogcmVtYWluaW5nIHRoZW4gd2UgbWFrZXVwIHRoZSByZXF1ZXN0ZWQgYW1vdW50IHdpdGggemVyb3MgYW5kCisgKiByZXR1cm4gc3VjY2Vzc2Z1bGx5LiAgSWYgdGhlIHJldHVybmVkIGRhdGEgaXMgaW5jb3JyZWN0IHRoZW4KKyAqIHdlIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gYW5kIGdldCBhIHByZW1hdHVyZSBFT0YgZXJyb3I7CisgKiBvdGhlcndpc2Ugd2Ugc2hvdWxkIGdldCB0aGUgcmlnaHQgYW5zd2VyLgorICovCisjaWZuZGVmIE5lZWRCaXRzOAorI2RlZmluZSBOZWVkQml0czgobixlb2ZsYWIpIGRvIHsJCQkJCVwKKyAgICBpZiAoQml0c0F2YWlsIDwgKG4pKSB7CQkJCQkJXAorCWlmIChFbmRPZkRhdGEoKSkgewkJCQkJCVwKKwkgICAgaWYgKEJpdHNBdmFpbCA9PSAwKQkJCS8qIG5vIHZhbGlkIGJpdHMgKi8JXAorCQlnb3RvIGVvZmxhYjsJCQkJCQlcCisJICAgIEJpdHNBdmFpbCA9IChuKTsJCQkvKiBwYWQgd2l0aCB6ZXJvcyAqLwlcCisJfSBlbHNlIHsJCQkJCQkJXAorCSAgICBCaXRBY2MgfD0gKCh1aW50MzIpIGJpdG1hcFsqY3ArK10pPDxCaXRzQXZhaWw7CQlcCisJICAgIEJpdHNBdmFpbCArPSA4OwkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgTmVlZEJpdHMxNgorI2RlZmluZSBOZWVkQml0czE2KG4sZW9mbGFiKSBkbyB7CQkJCQlcCisgICAgaWYgKEJpdHNBdmFpbCA8IChuKSkgewkJCQkJCVwKKwlpZiAoRW5kT2ZEYXRhKCkpIHsJCQkJCQlcCisJICAgIGlmIChCaXRzQXZhaWwgPT0gMCkJCQkvKiBubyB2YWxpZCBiaXRzICovCVwKKwkJZ290byBlb2ZsYWI7CQkJCQkJXAorCSAgICBCaXRzQXZhaWwgPSAobik7CQkJLyogcGFkIHdpdGggemVyb3MgKi8JXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkgICAgQml0QWNjIHw9ICgodWludDMyKSBiaXRtYXBbKmNwKytdKTw8Qml0c0F2YWlsOwkJXAorCSAgICBpZiAoKEJpdHNBdmFpbCArPSA4KSA8IChuKSkgewkJCQlcCisJCWlmIChFbmRPZkRhdGEoKSkgewkJCQkJXAorCQkgICAgLyogTkI6IHdlIGtub3cgQml0c0F2YWlsIGlzIG5vbi16ZXJvIGhlcmUgKi8JXAorCQkgICAgQml0c0F2YWlsID0gKG4pOwkJLyogcGFkIHdpdGggemVyb3MgKi8JXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJICAgIEJpdEFjYyB8PSAoKHVpbnQzMikgYml0bWFwWypjcCsrXSk8PEJpdHNBdmFpbDsJXAorCQkgICAgQml0c0F2YWlsICs9IDg7CQkJCQlcCisJCX0JCQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIEdldEJpdHMobikJKEJpdEFjYyAmICgoMTw8KG4pKS0xKSkKKyNkZWZpbmUgQ2xyQml0cyhuKSBkbyB7CQkJCQkJCVwKKyAgICBCaXRzQXZhaWwgLT0gKG4pOwkJCQkJCQlcCisgICAgQml0QWNjID4+PSAobik7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBGQVgzX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciogU3RhdGVOYW1lc1tdID0geworICAgICJOdWxsICAgIiwKKyAgICAiUGFzcyAgICIsCisgICAgIkhvcml6ICAiLAorICAgICJWMCAgICAgIiwKKyAgICAiVlIgICAgICIsCisgICAgIlZMICAgICAiLAorICAgICJFeHQgICAgIiwKKyAgICAiVGVybVcgICIsCisgICAgIlRlcm1CICAiLAorICAgICJNYWtlVXBXIiwKKyAgICAiTWFrZVVwQiIsCisgICAgIk1ha2VVcCAiLAorICAgICJFT0wgICAgIiwKK307CisjZGVmaW5lIERFQlVHX1NIT1cgcHV0Y2hhcihCaXRBY2MgJiAoMSA8PCB0KSA/ICcxJyA6ICcwJykKKyNkZWZpbmUgTE9PS1VQOCh3aWQsdGFiLGVvZmxhYikgZG8gewkJCQkJXAorICAgIGludCB0OwkJCQkJCQkJXAorICAgIE5lZWRCaXRzOCh3aWQsZW9mbGFiKTsJCQkJCQlcCisgICAgVGFiRW50ID0gdGFiICsgR2V0Qml0cyh3aWQpOwkJCQkJXAorICAgIHByaW50ZigiJTA4bFgvJWQ6ICVzJTVkXHQiLCAobG9uZykgQml0QWNjLCBCaXRzQXZhaWwsCQlcCisJICAgU3RhdGVOYW1lc1tUYWJFbnQtPlN0YXRlXSwgVGFiRW50LT5QYXJhbSk7CQkJXAorICAgIGZvciAodCA9IDA7IHQgPCBUYWJFbnQtPldpZHRoOyB0KyspCQkJCQlcCisJREVCVUdfU0hPVzsJCQkJCQkJXAorICAgIHB1dGNoYXIoJ1xuJyk7CQkJCQkJCVwKKyAgICBmZmx1c2goc3Rkb3V0KTsJCQkJCQkJXAorICAgIENsckJpdHMoVGFiRW50LT5XaWR0aCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTE9PS1VQMTYod2lkLHRhYixlb2ZsYWIpIGRvIHsJCQkJCVwKKyAgICBpbnQgdDsJCQkJCQkJCVwKKyAgICBOZWVkQml0czE2KHdpZCxlb2ZsYWIpOwkJCQkJCVwKKyAgICBUYWJFbnQgPSB0YWIgKyBHZXRCaXRzKHdpZCk7CQkJCQlcCisgICAgcHJpbnRmKCIlMDhsWC8lZDogJXMlNWRcdCIsIChsb25nKSBCaXRBY2MsIEJpdHNBdmFpbCwJCVwKKwkgICBTdGF0ZU5hbWVzW1RhYkVudC0+U3RhdGVdLCBUYWJFbnQtPlBhcmFtKTsJCQlcCisgICAgZm9yICh0ID0gMDsgdCA8IFRhYkVudC0+V2lkdGg7IHQrKykJCQkJCVwKKwlERUJVR19TSE9XOwkJCQkJCQlcCisgICAgcHV0Y2hhcignXG4nKTsJCQkJCQkJXAorICAgIGZmbHVzaChzdGRvdXQpOwkJCQkJCQlcCisgICAgQ2xyQml0cyhUYWJFbnQtPldpZHRoKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVFZBTFVFKHgpIGRvIHsJCQkJCQkJXAorICAgICpwYSsrID0gUnVuTGVuZ3RoICsgKHgpOwkJCQkJCVwKKyAgICBwcmludGYoIlNFVFZBTFVFOiAlZFx0JWRcbiIsIFJ1bkxlbmd0aCArICh4KSwgYTApOwkJCVwKKyAgICBhMCArPSB4OwkJCQkJCQkJXAorICAgIFJ1bkxlbmd0aCA9IDA7CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBMT09LVVA4KHdpZCx0YWIsZW9mbGFiKSBkbyB7CQkJCQlcCisgICAgTmVlZEJpdHM4KHdpZCxlb2ZsYWIpOwkJCQkJCVwKKyAgICBUYWJFbnQgPSB0YWIgKyBHZXRCaXRzKHdpZCk7CQkJCQlcCisgICAgQ2xyQml0cyhUYWJFbnQtPldpZHRoKTsJCQkJCQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBMT09LVVAxNih3aWQsdGFiLGVvZmxhYikgZG8gewkJCQkJXAorICAgIE5lZWRCaXRzMTYod2lkLGVvZmxhYik7CQkJCQkJXAorICAgIFRhYkVudCA9IHRhYiArIEdldEJpdHMod2lkKTsJCQkJCVwKKyAgICBDbHJCaXRzKFRhYkVudC0+V2lkdGgpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBBcHBlbmQgYSBydW4gdG8gdGhlIHJ1biBsZW5ndGggYXJyYXkgZm9yIHRoZQorICogY3VycmVudCByb3cgYW5kIHJlc2V0IGRlY29kaW5nIHN0YXRlLgorICovCisjZGVmaW5lIFNFVFZBTFVFKHgpIGRvIHsJCQkJCQkJXAorICAgICpwYSsrID0gUnVuTGVuZ3RoICsgKHgpOwkJCQkJCVwKKyAgICBhMCArPSAoeCk7CQkJCQkJCQlcCisgICAgUnVuTGVuZ3RoID0gMDsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogU3luY2hyb25pemUgaW5wdXQgZGVjb2RpbmcgYXQgdGhlIHN0YXJ0IG9mIGVhY2gKKyAqIHJvdyBieSBzY2FubmluZyBmb3IgYW4gRU9MIChpZiBhcHByb3ByaWF0ZSkgYW5kCisgKiBza2lwcGluZyBhbnkgdHJhc2ggZGF0YSB0aGF0IG1pZ2h0IGJlIHByZXNlbnQKKyAqIGFmdGVyIGEgZGVjb2RpbmcgZXJyb3IuICBOb3RlIHRoYXQgdGhlIGRlY29kaW5nCisgKiBkb25lIGVsc2V3aGVyZSB0aGF0IHJlY29nbml6ZXMgYW4gRU9MIG9ubHkgY29uc3VtZXMKKyAqIDExIGNvbnNlY3V0aXZlIHplcm8gYml0cy4gIFRoaXMgbWVhbnMgdGhhdCBpZiBFT0xjbnQKKyAqIGlzIG5vbi16ZXJvIHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBzY2FuIGZvciB0aGUgZmluYWwgZmxhZworICogYml0IHRoYXQgaXMgcGFydCBvZiB0aGUgRU9MIGNvZGUuCisgKi8KKyNkZWZpbmUJU1lOQ19FT0woZW9mbGFiKSBkbyB7CQkJCQkJXAorICAgIGlmIChFT0xjbnQgPT0gMCkgewkJCQkJCQlcCisJZm9yICg7OykgewkJCQkJCQlcCisJICAgIE5lZWRCaXRzMTYoMTEsZW9mbGFiKTsJCQkJCVwKKwkgICAgaWYgKEdldEJpdHMoMTEpID09IDApCQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJICAgIENsckJpdHMoMSk7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgICBmb3IgKDs7KSB7CQkJCQkJCQlcCisJTmVlZEJpdHM4KDgsZW9mbGFiKTsJCQkJCQlcCisJaWYgKEdldEJpdHMoOCkpCQkJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwlDbHJCaXRzKDgpOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoR2V0Qml0cygxKSA9PSAwKQkJCQkJCVwKKwlDbHJCaXRzKDEpOwkJCQkJCQlcCisgICAgQ2xyQml0cygxKTsJCQkJLyogRU9MIGJpdCAqLwkJCVwKKyAgICBFT0xjbnQgPSAwOwkJCQkvKiByZXNldCBFT0wgY291bnRlci9mbGFnICovCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBDbGVhbnVwIHRoZSBhcnJheSBvZiBydW5zIGFmdGVyIGRlY29kaW5nIGEgcm93LgorICogV2UgYWRqdXN0IGZpbmFsIHJ1bnMgdG8gaW5zdXJlIHRoZSB1c2VyIGJ1ZmZlciBpcyBub3QKKyAqIG92ZXJ3cml0dGVuIGFuZC9vciB1bmRlY29kZWQgYXJlYSBpcyB3aGl0ZSBmaWxsZWQuCisgKi8KKyNkZWZpbmUJQ0xFQU5VUF9SVU5TKCkgZG8gewkJCQkJCVwKKyAgICBpZiAoUnVuTGVuZ3RoKQkJCQkJCQlcCisJU0VUVkFMVUUoMCk7CQkJCQkJCVwKKyAgICBpZiAoYTAgIT0gbGFzdHgpIHsJCQkJCQkJXAorCWJhZGxlbmd0aChhMCwgbGFzdHgpOwkJCQkJCVwKKwl3aGlsZSAoYTAgPiBsYXN0eCAmJiBwYSA+IHRoaXNydW4pCQkJCVwKKwkgICAgYTAgLT0gKi0tcGE7CQkJCQkJXAorCWlmIChhMCA8IGxhc3R4KSB7CQkJCQkJXAorCSAgICBpZiAoYTAgPCAwKQkJCQkJCQlcCisJCWEwID0gMDsJCQkJCQkJXAorCSAgICBpZiAoKHBhLXRoaXNydW4pJjEpCQkJCQkJXAorCQlTRVRWQUxVRSgwKTsJCQkJCQlcCisJICAgIFNFVFZBTFVFKGxhc3R4IC0gYTApOwkJCQkJCVwKKwl9IGVsc2UgaWYgKGEwID4gbGFzdHgpIHsJCQkJCVwKKwkgICAgU0VUVkFMVUUobGFzdHgpOwkJCQkJCVwKKwkgICAgU0VUVkFMVUUoMCk7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBEZWNvZGUgYSBsaW5lIG9mIDFELWVuY29kZWQgZGF0YS4KKyAqCisgKiBUaGUgbGluZSBleHBhbmRlcnMgYXJlIHdyaXR0ZW4gYXMgbWFjcm9zIHNvIHRoYXQgdGhleSBjYW4gYmUgcmV1c2VkCisgKiBidXQgc3RpbGwgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlICJjYWxsaW5nIgorICogZnVuY3Rpb24uCisgKgorICogTm90ZSB0aGF0IHVubGlrZSB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgdGVzdCBmb3IKKyAqIGEwID49IGxhc3R4IGFmdGVyIGVhY2ggYmxhY2svd2hpdGUgcnVuIGlzIGRlY29kZWQuICBUaGlzIGlzIGJlY2F1c2UKKyAqIHRoZSBvcmlnaW5hbCBjb2RlIGRlcGVuZGVkIG9uIHRoZSBpbnB1dCBkYXRhIGJlaW5nIHplcm8tcGFkZGVkIHRvCisgKiBpbnN1cmUgdGhlIGRlY29kZXIgcmVjb2duaXplZCBhbiBFT0wgYmVmb3JlIHJ1bm5pbmcgb3V0IG9mIGRhdGEuCisgKi8KKyNkZWZpbmUgRVhQQU5EMUQoZW9mbGFiKSBkbyB7CQkJCQkJXAorICAgIGZvciAoOzspIHsJCQkJCQkJCVwKKwlmb3IgKDs7KSB7CQkJCQkJCVwKKwkgICAgTE9PS1VQMTYoMTIsIFRJRkZGYXhXaGl0ZVRhYmxlLCBlb2YxZCk7CQkJXAorCSAgICBzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJCVwKKwkgICAgY2FzZSBTX0VPTDoJCQkJCQkJXAorCQlFT0xjbnQgPSAxOwkJCQkJCVwKKwkJZ290byBkb25lMWQ7CQkJCQkJXAorCSAgICBjYXNlIFNfVGVybVc6CQkJCQkJXAorCQlTRVRWQUxVRShUYWJFbnQtPlBhcmFtKTsJCQkJCVwKKwkJZ290byBkb25lV2hpdGUxZDsJCQkJCVwKKwkgICAgY2FzZSBTX01ha2VVcFc6CQkJCQkJXAorCSAgICBjYXNlIFNfTWFrZVVwOgkJCQkJCVwKKwkJYTAgKz0gVGFiRW50LT5QYXJhbTsJCQkJCVwKKwkJUnVuTGVuZ3RoICs9IFRhYkVudC0+UGFyYW07CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkgICAgZGVmYXVsdDoJCQkJCQkJXAorCQl1bmV4cGVjdGVkKCJXaGl0ZVRhYmxlIiwgYTApOwkJCQlcCisJCWdvdG8gZG9uZTFkOwkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICBkb25lV2hpdGUxZDoJCQkJCQkJXAorCWlmIChhMCA+PSBsYXN0eCkJCQkJCQlcCisJICAgIGdvdG8gZG9uZTFkOwkJCQkJCVwKKwlmb3IgKDs7KSB7CQkJCQkJCVwKKwkgICAgTE9PS1VQMTYoMTMsIFRJRkZGYXhCbGFja1RhYmxlLCBlb2YxZCk7CQkJXAorCSAgICBzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJCVwKKwkgICAgY2FzZSBTX0VPTDoJCQkJCQkJXAorCQlFT0xjbnQgPSAxOwkJCQkJCVwKKwkJZ290byBkb25lMWQ7CQkJCQkJXAorCSAgICBjYXNlIFNfVGVybUI6CQkJCQkJXAorCQlTRVRWQUxVRShUYWJFbnQtPlBhcmFtKTsJCQkJCVwKKwkJZ290byBkb25lQmxhY2sxZDsJCQkJCVwKKwkgICAgY2FzZSBTX01ha2VVcEI6CQkJCQkJXAorCSAgICBjYXNlIFNfTWFrZVVwOgkJCQkJCVwKKwkJYTAgKz0gVGFiRW50LT5QYXJhbTsJCQkJCVwKKwkJUnVuTGVuZ3RoICs9IFRhYkVudC0+UGFyYW07CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkgICAgZGVmYXVsdDoJCQkJCQkJXAorCQl1bmV4cGVjdGVkKCJCbGFja1RhYmxlIiwgYTApOwkJCQlcCisJCWdvdG8gZG9uZTFkOwkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICBkb25lQmxhY2sxZDoJCQkJCQkJXAorCWlmIChhMCA+PSBsYXN0eCkJCQkJCQlcCisJICAgIGdvdG8gZG9uZTFkOwkJCQkJCVwKKyAgICAgICAgaWYoICoocGEtMSkgPT0gMCAmJiAqKHBhLTIpID09IDAgKQkJCQlcCisgICAgICAgICAgICBwYSAtPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQkJCQkJCQkJCVwKK2VvZjFkOgkJCQkJCQkJCVwKKyAgICBwcmVtYXR1cmVFT0YoYTApOwkJCQkJCQlcCisgICAgQ0xFQU5VUF9SVU5TKCk7CQkJCQkJCVwKKyAgICBnb3RvIGVvZmxhYjsJCQkJCQkJXAorZG9uZTFkOgkJCQkJCQkJCVwKKyAgICBDTEVBTlVQX1JVTlMoKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgYjEgdXNpbmcgdGhlIGFycmF5CisgKiBvZiBydW5zIGZvciB0aGUgcmVmZXJlbmNlIGxpbmUuCisgKi8KKyNkZWZpbmUgQ0hFQ0tfYjEgZG8gewkJCQkJCQlcCisgICAgaWYgKHBhICE9IHRoaXNydW4pIHdoaWxlIChiMSA8PSBhMCAmJiBiMSA8IGxhc3R4KSB7CQkJXAorCWIxICs9IHBiWzBdICsgcGJbMV07CQkJCQkJXAorCXBiICs9IDI7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEV4cGFuZCBhIHJvdyBvZiAyRC1lbmNvZGVkIGRhdGEuCisgKi8KKyNkZWZpbmUgRVhQQU5EMkQoZW9mbGFiKSBkbyB7CQkJCQkJXAorICAgIHdoaWxlIChhMCA8IGxhc3R4KSB7CQkJCQkJXAorCUxPT0tVUDgoNywgVElGRkZheE1haW5UYWJsZSwgZW9mMmQpOwkJCQlcCisJc3dpdGNoIChUYWJFbnQtPlN0YXRlKSB7CQkJCQlcCisJY2FzZSBTX1Bhc3M6CQkJCQkJCVwKKwkgICAgQ0hFQ0tfYjE7CQkJCQkJCVwKKwkgICAgYjEgKz0gKnBiKys7CQkJCQkJXAorCSAgICBSdW5MZW5ndGggKz0gYjEgLSBhMDsJCQkJCVwKKwkgICAgYTAgPSBiMTsJCQkJCQkJXAorCSAgICBiMSArPSAqcGIrKzsJCQkJCQlcCisJICAgIGJyZWFrOwkJCQkJCQlcCisJY2FzZSBTX0hvcml6OgkJCQkJCQlcCisJICAgIGlmICgocGEtdGhpc3J1bikmMSkgewkJCQkJXAorCQlmb3IgKDs7KSB7CS8qIGJsYWNrIGZpcnN0ICovCQkJXAorCQkgICAgTE9PS1VQMTYoMTMsIFRJRkZGYXhCbGFja1RhYmxlLCBlb2YyZCk7CQlcCisJCSAgICBzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJXAorCQkgICAgY2FzZSBTX1Rlcm1COgkJCQkJXAorCQkJU0VUVkFMVUUoVGFiRW50LT5QYXJhbSk7CQkJCVwKKwkJCWdvdG8gZG9uZVdoaXRlMmRhOwkJCQlcCisJCSAgICBjYXNlIFNfTWFrZVVwQjoJCQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXA6CQkJCQlcCisJCQlhMCArPSBUYWJFbnQtPlBhcmFtOwkJCQlcCisJCQlSdW5MZW5ndGggKz0gVGFiRW50LT5QYXJhbTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCSAgICBkZWZhdWx0OgkJCQkJCVwKKwkJCWdvdG8gYmFkQmxhY2syZDsJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCX0JCQkJCQkJXAorCSAgICBkb25lV2hpdGUyZGE6OwkJCQkJCVwKKwkJZm9yICg7OykgewkvKiB0aGVuIHdoaXRlICovCQkJXAorCQkgICAgTE9PS1VQMTYoMTIsIFRJRkZGYXhXaGl0ZVRhYmxlLCBlb2YyZCk7CQlcCisJCSAgICBzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJXAorCQkgICAgY2FzZSBTX1Rlcm1XOgkJCQkJXAorCQkJU0VUVkFMVUUoVGFiRW50LT5QYXJhbSk7CQkJCVwKKwkJCWdvdG8gZG9uZUJsYWNrMmRhOwkJCQlcCisJCSAgICBjYXNlIFNfTWFrZVVwVzoJCQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXA6CQkJCQlcCisJCQlhMCArPSBUYWJFbnQtPlBhcmFtOwkJCQlcCisJCQlSdW5MZW5ndGggKz0gVGFiRW50LT5QYXJhbTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCSAgICBkZWZhdWx0OgkJCQkJCVwKKwkJCWdvdG8gYmFkV2hpdGUyZDsJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCX0JCQkJCQkJXAorCSAgICBkb25lQmxhY2syZGE6OwkJCQkJCVwKKwkgICAgfSBlbHNlIHsJCQkJCQkJXAorCQlmb3IgKDs7KSB7CS8qIHdoaXRlIGZpcnN0ICovCQkJXAorCQkgICAgTE9PS1VQMTYoMTIsIFRJRkZGYXhXaGl0ZVRhYmxlLCBlb2YyZCk7CQlcCisJCSAgICBzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJXAorCQkgICAgY2FzZSBTX1Rlcm1XOgkJCQkJXAorCQkJU0VUVkFMVUUoVGFiRW50LT5QYXJhbSk7CQkJCVwKKwkJCWdvdG8gZG9uZVdoaXRlMmRiOwkJCQlcCisJCSAgICBjYXNlIFNfTWFrZVVwVzoJCQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXA6CQkJCQlcCisJCQlhMCArPSBUYWJFbnQtPlBhcmFtOwkJCQlcCisJCQlSdW5MZW5ndGggKz0gVGFiRW50LT5QYXJhbTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCSAgICBkZWZhdWx0OgkJCQkJCVwKKwkJCWdvdG8gYmFkV2hpdGUyZDsJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCX0JCQkJCQkJXAorCSAgICBkb25lV2hpdGUyZGI6OwkJCQkJCVwKKwkJZm9yICg7OykgewkvKiB0aGVuIGJsYWNrICovCQkJXAorCQkgICAgTE9PS1VQMTYoMTMsIFRJRkZGYXhCbGFja1RhYmxlLCBlb2YyZCk7CQlcCisJCSAgICBzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJXAorCQkgICAgY2FzZSBTX1Rlcm1COgkJCQkJXAorCQkJU0VUVkFMVUUoVGFiRW50LT5QYXJhbSk7CQkJCVwKKwkJCWdvdG8gZG9uZUJsYWNrMmRiOwkJCQlcCisJCSAgICBjYXNlIFNfTWFrZVVwQjoJCQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXA6CQkJCQlcCisJCQlhMCArPSBUYWJFbnQtPlBhcmFtOwkJCQlcCisJCQlSdW5MZW5ndGggKz0gVGFiRW50LT5QYXJhbTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCSAgICBkZWZhdWx0OgkJCQkJCVwKKwkJCWdvdG8gYmFkQmxhY2syZDsJCQkJXAorCQkgICAgfQkJCQkJCQlcCisJCX0JCQkJCQkJXAorCSAgICBkb25lQmxhY2syZGI6OwkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCSAgICBDSEVDS19iMTsJCQkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCWNhc2UgU19WMDoJCQkJCQkJXAorCSAgICBDSEVDS19iMTsJCQkJCQkJXAorCSAgICBTRVRWQUxVRShiMSAtIGEwKTsJCQkJCQlcCisJICAgIGIxICs9ICpwYisrOwkJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwljYXNlIFNfVlI6CQkJCQkJCVwKKwkgICAgQ0hFQ0tfYjE7CQkJCQkJCVwKKwkgICAgU0VUVkFMVUUoYjEgLSBhMCArIFRhYkVudC0+UGFyYW0pOwkJCQlcCisJICAgIGIxICs9ICpwYisrOwkJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwljYXNlIFNfVkw6CQkJCQkJCVwKKwkgICAgQ0hFQ0tfYjE7CQkJCQkJCVwKKwkgICAgaWYgKGIxIDw9IChpbnQpIChhMCArIFRhYkVudC0+UGFyYW0pKSB7CQkJXAorCQlpZiAoYjEgPCAoaW50KSAoYTAgKyBUYWJFbnQtPlBhcmFtKSB8fCBwYSAhPSB0aGlzcnVuKSB7CVwKKwkJICAgIHVuZXhwZWN0ZWQoIlZMIiwgYTApOwkJCQlcCisJCSAgICBnb3RvIGVvbDJkOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwkgICAgU0VUVkFMVUUoYjEgLSBhMCAtIFRhYkVudC0+UGFyYW0pOwkJCQlcCisJICAgIGIxIC09ICotLXBiOwkJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwljYXNlIFNfRXh0OgkJCQkJCQlcCisJICAgICpwYSsrID0gbGFzdHggLSBhMDsJCQkJCQlcCisJICAgIGV4dGVuc2lvbihhMCk7CQkJCQkJXAorCSAgICBnb3RvIGVvbDJkOwkJCQkJCQlcCisJY2FzZSBTX0VPTDoJCQkJCQkJXAorCSAgICAqcGErKyA9IGxhc3R4IC0gYTA7CQkJCQkJXAorCSAgICBOZWVkQml0czgoNCxlb2YyZCk7CQkJCQkJXAorCSAgICBpZiAoR2V0Qml0cyg0KSkJCQkJCQlcCisJCXVuZXhwZWN0ZWQoIkVPTCIsIGEwKTsJCQkJCVwKKyAgICAgICAgICAgIENsckJpdHMoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgRU9MY250ID0gMTsJCQkJCQkJXAorCSAgICBnb3RvIGVvbDJkOwkJCQkJCQlcCisJZGVmYXVsdDoJCQkJCQkJXAorCWJhZE1haW4yZDoJCQkJCQkJXAorCSAgICB1bmV4cGVjdGVkKCJNYWluVGFibGUiLCBhMCk7CQkJCVwKKwkgICAgZ290byBlb2wyZDsJCQkJCQkJXAorCWJhZEJsYWNrMmQ6CQkJCQkJCVwKKwkgICAgdW5leHBlY3RlZCgiQmxhY2tUYWJsZSIsIGEwKTsJCQkJXAorCSAgICBnb3RvIGVvbDJkOwkJCQkJCQlcCisJYmFkV2hpdGUyZDoJCQkJCQkJXAorCSAgICB1bmV4cGVjdGVkKCJXaGl0ZVRhYmxlIiwgYTApOwkJCQlcCisJICAgIGdvdG8gZW9sMmQ7CQkJCQkJCVwKKwllb2YyZDoJCQkJCQkJCVwKKwkgICAgcHJlbWF0dXJlRU9GKGEwKTsJCQkJCQlcCisJICAgIENMRUFOVVBfUlVOUygpOwkJCQkJCVwKKwkgICAgZ290byBlb2ZsYWI7CQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIGlmIChSdW5MZW5ndGgpIHsJCQkJCQkJXAorCWlmIChSdW5MZW5ndGggKyBhMCA8IGxhc3R4KSB7CQkJCQlcCisJICAgIC8qIGV4cGVjdCBhIGZpbmFsIFYwICovCQkJCQlcCisJICAgIE5lZWRCaXRzOCgxLGVvZjJkKTsJCQkJCQlcCisJICAgIGlmICghR2V0Qml0cygxKSkJCQkJCQlcCisJCWdvdG8gYmFkTWFpbjJkOwkJCQkJCVwKKwkgICAgQ2xyQml0cygxKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlTRVRWQUxVRSgwKTsJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCitlb2wyZDoJCQkJCQkJCQlcCisgICAgQ0xFQU5VUF9SVU5TKCk7CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYgLyogX0ZBWDNfICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mYXgzc20uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2ZheDNzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YTUzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mYXgzc20uYwpAQCAtMCwwICsxLDEyNjMgQEAKKy8qIFdBUk5JTkcsIHRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlCisgICAgbWtnM3N0YXRlcyBwcm9ncmFtICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmLmgiCisjaW5jbHVkZSAidGlmX2ZheDMuaCIKKyBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhNYWluVGFibGVbMTI4XSA9IHsKK3sxMiw3LDB9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sezEsNCwwfSx7MywxLDB9LAorezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sezUsNiwyfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSwKK3syLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sezEsNCwwfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sCit7NCwzLDF9LHszLDEsMH0sezUsNywzfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LAorezEsNCwwfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LHs0LDYsMn0sezMsMSwwfSwKK3s1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LHsxLDQsMH0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sCit7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LHs2LDcsMH0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LAorezQsMywxfSx7MywxLDB9LHsxLDQsMH0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSwKK3s1LDYsMn0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSx7MSw0LDB9LHszLDEsMH0sCit7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSx7NCw3LDN9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LAorezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSx7MSw0LDB9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSwKK3s0LDMsMX0sezMsMSwwfSx7NCw2LDJ9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sCit7MSw0LDB9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0KK307CisgY29uc3QgVElGRkZheFRhYkVudCBUSUZGRmF4V2hpdGVUYWJsZVs0MDk2XSA9IHsKK3sxMiwxMSwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LAorezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LAorezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LAorezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sCit7OSw5LDE0NzJ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjE2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSw5NjB9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSwKK3s3LDgsNTd9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDcsMjZ9LHs3LDUsOX0sezksOSw3MDR9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDExLDE3OTJ9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSwKK3s3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSwKK3s5LDksODMyfSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sCit7Nyw4LDUyfSx7Nyw2LDE1fSx7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNjAwfSx7Nyw0LDV9LAorezcsOCw0NH0sezcsNiwxN30sezksOSwxMzQ0fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw4LDM0fSx7OSw1LDEyOH0sezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSwKK3s3LDgsNjB9LHs3LDQsNX0sezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMDg4fSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSwKK3s5LDgsNjQwfSx7Nyw0LDZ9LHs3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LAorezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LAorezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSwKK3s3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNTM2fSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LAorezksOSwxMjgwfSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LAorezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LAorezcsOCw0MX0sezcsNiwxNn0sezksOSwxMDI0fSx7Nyw0LDZ9LHs3LDgsMzF9LHs3LDUsOH0sezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw5LDc2OH0sezcsNCw2fSwKK3s3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDMyMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHsxMSwxMSwxODU2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCw0MH0sezcsNiwxNn0sezksOSw4OTZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSwKK3s3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sezcsOCwzNn0sezksNSwxMjh9LHs3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTcyOH0sezcsNCw1fSx7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDE0MDh9LHs3LDQsNn0sCit7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSwKK3s3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDh9LHs3LDQsM30sezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSwKK3s5LDksMTE1Mn0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LHs3LDgsNTh9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LAorezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSwKK3s3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7MCwwLDB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LAorezcsNywyN30sezcsNCw1fSx7Nyw4LDM5fSx7Nyw2LDE2fSx7OSw4LDU3Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0NX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sCit7OSw4LDQ0OH0sezcsNCw2fSx7Nyw4LDM1fSx7OSw1LDEyOH0sezcsOCw1MX0sezcsNiwxNX0sezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTQ3Mn0sezcsNCw1fSx7Nyw4LDQzfSx7Nyw2LDE3fSx7OSw5LDEyMTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LAorezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzN9LHs5LDUsMTI4fSx7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDd9LHs3LDQsM30sezcsOCw1OX0sezcsNCw1fSx7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDk2MH0sezcsNCw2fSwKK3s3LDgsMzF9LHs3LDUsOH0sezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw5LDcwNH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sCit7OSw4LDMyMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LAorezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3sxMSwxMiwyMTEyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LAorezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LAorezcsOCw0MH0sezcsNiwxNn0sezksOSw4MzJ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LAorezcsOCwzNn0sezksNSwxMjh9LHs3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s5LDksMTYwMH0sezcsNCw1fSx7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDEzNDR9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LAorezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDh9LHs3LDQsM30sezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDEwODh9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSwKK3s3LDgsNTh9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDcsMjZ9LHs3LDUsOX0sezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sCit7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sCit7OSw4LDU3Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0NX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LAorezcsOCw1MX0sezcsNiwxNX0sezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE1MzZ9LHs3LDQsNX0sCit7Nyw4LDQzfSx7Nyw2LDE3fSx7OSw5LDEyODB9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDgsMzN9LHs5LDUsMTI4fSx7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LAorezcsOCw1OX0sezcsNCw1fSx7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDEwMjR9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOSw3Njh9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDEyLDIzNjh9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDg5Nn0sezcsNCw2fSwKK3s3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sCit7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNzI4fSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LAorezksOSwxNDA4fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LAorezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LAorezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMTUyfSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSwKK3s3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sCit7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNDcyfSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTIxNn0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LAorezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LAorezksOSw5NjB9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzA0fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSwKK3s3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sCit7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezExLDEyLDE5ODR9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LAorezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDgzMn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sCit7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezksOSwxNjAwfSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTM0NH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTA4OH0sezcsNCw2fSwKK3s3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sCit7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LAorezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3swLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSwKK3s3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSwKK3s3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1NX0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1M30sezcsNSw5fSx7OSw4LDQ0OH0sezcsNCw2fSwKK3s3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezksOSwxNTM2fSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTI4MH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LHs3LDgsNjF9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LHs5LDksMTAyNH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LAorezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw5LDc2OH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTEsMTkyMH0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LAorezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LAorezksOSw4OTZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSwKK3s3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE3Mjh9LHs3LDQsNX0sCit7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDE0MDh9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LAorezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDExNTJ9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sCit7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LAorezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE0NzJ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sCit7OSw5LDEyMTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sCit7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sCit7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDk2MH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LHs3LDgsNTd9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOSw3MDR9LHs3LDQsNn0sCit7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sCit7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTIsMjI0MH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LHs5LDksODMyfSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sCit7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSx7Nyw4LDUyfSx7Nyw2LDE1fSx7Nyw4LDB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE2MDB9LHs3LDQsNX0sezcsOCw0NH0sezcsNiwxN30sezksOSwxMzQ0fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDMwfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDM0fSx7OSw1LDEyOH0sezcsOCw1MH0sezcsNiwxNH0sCit7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LHs3LDgsNjB9LHs3LDQsNX0sezcsOCw0Mn0sezcsNiwxNn0sCit7OSw5LDEwODh9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDgsNjQwfSx7Nyw0LDZ9LHs3LDgsMzh9LHs5LDUsMTI4fSwKK3s3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sCit7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSwKK3s3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LAorezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7OSw5LDE1MzZ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjgwfSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSwxMDI0fSx7Nyw0LDZ9LAorezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzY4fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSwKK3s5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sCit7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezExLDEyLDI0OTZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sCit7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sCit7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDg5Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sCit7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezksOSwxNzI4fSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTQwOH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTE1Mn0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LAorezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTIsMTEsMH0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LAorezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LAorezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSwKK3s3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNDcyfSx7Nyw0LDV9LAorezcsOCw0M30sezcsNiwxN30sezksOSwxMjE2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSwKK3s3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSw5NjB9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOSw3MDR9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDExLDE3OTJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDgzMn0sezcsNCw2fSwKK3s3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sCit7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNjAwfSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LAorezksOSwxMzQ0fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LAorezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LAorezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMDg4fSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSwKK3s3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sCit7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNTM2fSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTI4MH0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LAorezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LAorezksOSwxMDI0fSx7Nyw0LDZ9LHs3LDgsMzF9LHs3LDUsOH0sezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw5LDc2OH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sCit7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDMyMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LAorezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHsxMSwxMSwxODU2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSwKK3s3LDcsMjd9LHs3LDQsNX0sezcsOCw0MH0sezcsNiwxNn0sezksOSw4OTZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LAorezksOCw1MTJ9LHs3LDQsNn0sezcsOCwzNn0sezksNSwxMjh9LHs3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTcyOH0sezcsNCw1fSx7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDE0MDh9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LAorezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDh9LHs3LDQsM30sezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDExNTJ9LHs3LDQsNn0sCit7Nyw4LDMyfSx7Nyw1LDh9LHs3LDgsNTh9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LAorezksOCwzODR9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSwKK3s5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7MCwwLDB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sCit7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sCit7Nyw4LDM5fSx7Nyw2LDE2fSx7OSw4LDU3Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0NX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sCit7Nyw4LDM1fSx7OSw1LDEyOH0sezcsOCw1MX0sezcsNiwxNX0sezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s5LDksMTQ3Mn0sezcsNCw1fSx7Nyw4LDQzfSx7Nyw2LDE3fSx7OSw5LDEyMTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LAorezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzN9LHs5LDUsMTI4fSx7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDd9LHs3LDQsM30sezcsOCw1OX0sezcsNCw1fSx7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDk2MH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LAorezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw5LDcwNH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTIsMjE3Nn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LAorezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LAorezksOSw4MzJ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSwKK3s3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE2MDB9LHs3LDQsNX0sCit7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDEzNDR9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LAorezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDEwODh9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sCit7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LAorezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE1MzZ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sCit7OSw5LDEyODB9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sCit7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sCit7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDEwMjR9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzY4fSx7Nyw0LDZ9LAorezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDEyLDI0MzJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LAorezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDg5Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LAorezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNzI4fSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTQwOH0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LAorezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LAorezksOSwxMTUyfSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sCit7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LAorezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sCit7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1NX0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1M30sezcsNSw5fSwKK3s5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezksOSwxNDcyfSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTIxNn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LHs3LDgsNjF9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LHs5LDksOTYwfSx7Nyw0LDZ9LAorezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzA0fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSwKK3s5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sCit7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezExLDEyLDIwNDh9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sCit7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sCit7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDgzMn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sCit7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezksOSwxNjAwfSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTM0NH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTA4OH0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LAorezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MCwwLDB9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSwKK3s3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDM5fSx7Nyw2LDE2fSwKK3s5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1NX0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1M30sezcsNSw5fSx7OSw4LDQ0OH0sezcsNCw2fSx7Nyw4LDM1fSx7OSw1LDEyOH0sCit7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTUzNn0sezcsNCw1fSwKK3s3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTI4MH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LHs3LDgsNjF9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDd9LHs3LDQsM30sCit7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LHs5LDksMTAyNH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LHs3LDgsNTd9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sCit7OSw5LDc2OH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTEsMTkyMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LHs5LDksODk2fSx7Nyw0LDZ9LAorezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ2fSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSx7Nyw4LDUyfSx7Nyw2LDE1fSwKK3s3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE3Mjh9LHs3LDQsNX0sezcsOCw0NH0sezcsNiwxN30sCit7OSw5LDE0MDh9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDM0fSx7OSw1LDEyOH0sCit7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LHs3LDgsNjB9LHs3LDQsNX0sCit7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDExNTJ9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDgsNjQwfSx7Nyw0LDZ9LAorezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSwKK3s3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE0NzJ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjE2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sCit7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sCit7OSw5LDk2MH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LHs3LDgsNTd9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOSw3MDR9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LAorezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSwKK3s3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7MTEsMTIsMjMwNH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sCit7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LHs5LDksODMyfSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSwKK3s5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSx7Nyw4LDUyfSx7Nyw2LDE1fSx7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7OSw5LDE2MDB9LHs3LDQsNX0sezcsOCw0NH0sezcsNiwxN30sezksOSwxMzQ0fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDM0fSx7OSw1LDEyOH0sezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LHs3LDgsNjB9LHs3LDQsNX0sezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMDg4fSx7Nyw0LDZ9LAorezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDgsNjQwfSx7Nyw0LDZ9LHs3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSwKK3s5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sCit7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LAorezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LAorezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LAorezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sCit7OSw5LDE1MzZ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjgwfSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSwxMDI0fSx7Nyw0LDZ9LHs3LDgsMzF9LHs3LDUsOH0sCit7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzY4fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDMyMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sCit7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHsxMSwxMiwyNTYwfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sCit7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCw0MH0sezcsNiwxNn0sCit7OSw5LDg5Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sezcsOCwzNn0sezksNSwxMjh9LAorezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTcyOH0sezcsNCw1fSwKK3s3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTQwOH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDh9LHs3LDQsM30sCit7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTE1Mn0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LHs3LDgsNTh9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sCit7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fQorfTsKKyBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhCbGFja1RhYmxlWzgxOTJdID0geworezEyLDExLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOSwxNX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDExLDE3OTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTEsMjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMSwyNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDEyOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDU2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiwzMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDExLDE4NTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDU3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTR9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsOSwxNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezExLDEyLDIxMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQ0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM2fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDM4NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsMjh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw2MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMzY4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxNn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTAsNjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwxOTg0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDM0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMywxNjY0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwyNn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMywxNDA4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDExLDE5MjB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsNjF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MTAsMTMsMTAyNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOSwxNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3sxMCwxMyw3Njh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDYyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTIsMjI0MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiwzOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsNTEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDExLDE5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDI0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTEsMTIsMjQ5Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMCw2NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEyLDExLDB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw5LDE1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTc5Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjN9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDExLDI1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MTAsMTIsMTkyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMywxMjgwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDMxfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTg1Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMSwyMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsODk2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw5LDE1fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDY0MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMTc2fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDQ1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDQ0OH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsMjl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTMsMTUzNn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyNDMyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxNn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEwLDY0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3sxMSwxMiwyMDQ4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw1MX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzNX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMiwzMjB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDI3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDMzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTkyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDI1Nn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEzLDExNTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTV9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsNjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMzA0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw0N30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDM5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDUzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwxOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDI0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDEyLDI1NjB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMCwxMCw2NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEyLDExLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw5LDE1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTc5Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMSwyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyNX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTIsMTI4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDU2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTEsMTEsMTg1Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjF9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOSwxNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDUyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw0OH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDEyLDIxMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQ0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsMzZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTIsMzg0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiwyOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw2MH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMiw0MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezExLDEyLDIzNjh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTAsNjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwxOTg0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDUwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDE3Mjh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDI2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEzLDE0NzJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDMyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTkyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNjF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw0Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsMTA4OH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw5LDE1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMyw4MzJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDYyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3sxMSwxMiwyMjQwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw0Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMyw1NzZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDE5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDIyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTIsMjQ5Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTZ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEwLDY0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTIsMTEsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMSwxNzkyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDExLDIwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDI1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTIsMTkyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDEzNDR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDMxfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTg1Nn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMiw1OH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMCwxMyw5NjB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTMsNzA0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw0OX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDEyLDIxNzZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQ1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsMzd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDQ0OH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMiwyOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsMTYwMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDF9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezExLDEyLDI0MzJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTAsNjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMCwxOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMDQ4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1MX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEyLDMyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsMjd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsMzN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMSwxOTIwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTIsMjU2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsNDN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDEyMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1NX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMzA0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDQ3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDE5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTEsMjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDExLDIyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTIsMjU2MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMCw2NH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfQorfTsKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9mbHVzaC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZmx1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzViM2JjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfZmx1c2guYwpAQCAtMCwwICsxLDEyMSBAQAorLyogJElkOiB0aWZfZmx1c2guYyx2IDEuOSAyMDEwLTAzLTMxIDA2OjQwOjEwIGZ3YXJtZXJkYW0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworaW50CitUSUZGRmx1c2goVElGRiogdGlmKQoreworICAgIGlmKCB0aWYtPnRpZl9tb2RlID09IE9fUkRPTkxZICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoIVRJRkZGbHVzaERhdGEodGlmKSkKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAvKiBJbiB1cGRhdGUgKHIrKSBtb2RlIHdlIHRyeSB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgCisgICAgICAgb25seSB0aGUgc3RyaXAvdGlsZSBtYXAgaGFzIGJlZW4gYWx0ZXJlZCwgYW5kIHdlIHRyeSB0byAKKyAgICAgICByZXdyaXRlIG9ubHkgdGhhdCBwb3J0aW9uIG9mIHRoZSBkaXJlY3Rvcnkgd2l0aG91dCAKKyAgICAgICBtYWtpbmcgYW55IG90aGVyIGNoYW5nZXMgKi8KKyAgICAgICAgICAgICAgICAKKyAgICBpZiggKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9ESVJUWVNUUklQKQorICAgICAgICAmJiAhKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9ESVJUWURJUkVDVCkgCisgICAgICAgICYmIHRpZi0+dGlmX21vZGUgPT0gT19SRFdSICkKKyAgICB7CisgICAgICAgIHVpbnQ2NCAgKm9mZnNldHM9TlVMTCwgKnNpemVzPU5VTEw7CisKKyAgICAgICAgaWYoIFRJRkZJc1RpbGVkKHRpZikgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRU9GRlNFVFMsICZvZmZzZXRzICkgCisgICAgICAgICAgICAgICAgJiYgVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRUJZVEVDT1VOVFMsICZzaXplcyApIAorICAgICAgICAgICAgICAgICYmIF9USUZGUmV3cml0ZUZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRU9GRlNFVFMsIFRJRkZfTE9ORzgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9kaXIudGRfbnN0cmlwcywgb2Zmc2V0cyApCisgICAgICAgICAgICAgICAgJiYgX1RJRkZSZXdyaXRlRmllbGQoIHRpZiwgVElGRlRBR19USUxFQllURUNPVU5UUywgVElGRl9MT05HOCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLCBzaXplcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9ESVJUWVNUUklQOworICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0JFRU5XUklUSU5HOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIFRJRkZHZXRGaWVsZCggdGlmLCBUSUZGVEFHX1NUUklQT0ZGU0VUUywgJm9mZnNldHMgKSAKKyAgICAgICAgICAgICAgICAmJiBUSUZGR2V0RmllbGQoIHRpZiwgVElGRlRBR19TVFJJUEJZVEVDT1VOVFMsICZzaXplcyApIAorICAgICAgICAgICAgICAgICYmIF9USUZGUmV3cml0ZUZpZWxkKCB0aWYsIFRJRkZUQUdfU1RSSVBPRkZTRVRTLCBUSUZGX0xPTkc4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsIG9mZnNldHMgKQorICAgICAgICAgICAgICAgICYmIF9USUZGUmV3cml0ZUZpZWxkKCB0aWYsIFRJRkZUQUdfU1RSSVBCWVRFQ09VTlRTLCBUSUZGX0xPTkc4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsIHNpemVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZU1RSSVA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfQkVFTldSSVRJTkc7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHRpZi0+dGlmX2ZsYWdzICYgKFRJRkZfRElSVFlESVJFQ1R8VElGRl9ESVJUWVNUUklQKSkgCisgICAgICAgICYmICFUSUZGUmV3cml0ZURpcmVjdG9yeSh0aWYpKQorICAgICAgICByZXR1cm4gKDApOworCisgICAgcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEZsdXNoIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlIGZpbGUuCisgKgorICogRnJhbmsgV2FybWVyZGFtJzIwMDA6IEkgbW9kaWZpZWQgdGhpcyB0byByZXR1cm4gMSBpZiBUSUZGX0JFRU5XUklUSU5HCisgKiBpcyBub3Qgc2V0LCBzbyB0aGF0IFRJRkZGbHVzaCgpIHdpbGwgcHJvY2VlZCB0byB3cml0ZSBvdXQgdGhlIGRpcmVjdG9yeS4KKyAqIFRoZSBkb2N1bWVudGF0aW9uIHNheXMgcmV0dXJuaW5nIDEgaXMgYW4gZXJyb3IgaW5kaWNhdG9yLCBidXQgbm90IGhhdmluZworICogYmVlbiB3cml0aW5nIGlzbid0IGV4YWN0bHkgYSBhbiBlcnJvci4gIEhvcGVmdWxseSB0aGlzIGRvZXNuJ3QgY2F1c2UKKyAqIHByb2JsZW1zIGZvciBvdGhlciBwZW9wbGUuIAorICovCitpbnQKK1RJRkZGbHVzaERhdGEoVElGRiogdGlmKQoreworCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0JFRU5XUklUSU5HKSA9PSAwKQorCQlyZXR1cm4gKDEpOworCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfUE9TVEVOQ09ERSkgeworCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9QT1NURU5DT0RFOworCQlpZiAoISgqdGlmLT50aWZfcG9zdGVuY29kZSkodGlmKSkKKwkJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoVElGRkZsdXNoRGF0YTEodGlmKSk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2dldGltYWdlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9nZXRpbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDdhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9nZXRpbWFnZS5jCkBAIC0wLDAgKzEsMjk5MSBAQAorLyogJElkOiB0aWZfZ2V0aW1hZ2UuYyx2IDEuODIgMjAxMi0wNi0wNiAwMDoxNzo0OSBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5CisgKgorICogUmVhZCBhbmQgcmV0dXJuIGEgcGFja2VkIFJHQkEgaW1hZ2UuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IGd0VGlsZUNvbnRpZyhUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOworc3RhdGljIGludCBndFRpbGVTZXBhcmF0ZShUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOworc3RhdGljIGludCBndFN0cmlwQ29udGlnKFRJRkZSR0JBSW1hZ2UqLCB1aW50MzIqLCB1aW50MzIsIHVpbnQzMik7CitzdGF0aWMgaW50IGd0U3RyaXBTZXBhcmF0ZShUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOworc3RhdGljIGludCBQaWNrQ29udGlnQ2FzZShUSUZGUkdCQUltYWdlKik7CitzdGF0aWMgaW50IFBpY2tTZXBhcmF0ZUNhc2UoVElGRlJHQkFJbWFnZSopOworCitzdGF0aWMgaW50IEJ1aWxkTWFwVWFUb0FhKFRJRkZSR0JBSW1hZ2UqIGltZyk7CitzdGF0aWMgaW50IEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChUSUZGUkdCQUltYWdlKiBpbWcpOworCitzdGF0aWMgY29uc3QgY2hhciBwaG90b1RhZ1tdID0gIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24iOworCisvKiAKKyAqIEhlbHBlciBjb25zdGFudHMgdXNlZCBpbiBPcmllbnRhdGlvbiB0YWcgaGFuZGxpbmcKKyAqLworI2RlZmluZSBGTElQX1ZFUlRJQ0FMTFkgMHgwMQorI2RlZmluZSBGTElQX0hPUklaT05UQUxMWSAweDAyCisKKy8qCisgKiBDb2xvciBjb252ZXJzaW9uIGNvbnN0YW50cy4gV2Ugd2lsbCBkZWZpbmUgZGlzcGxheSB0eXBlcyBoZXJlLgorICovCisKK3N0YXRpYyBjb25zdCBUSUZGRGlzcGxheSBkaXNwbGF5X3NSR0IgPSB7CisJewkJCS8qIFhZWiAtPiBsdW1pbmFuY2UgbWF0cml4ICovCisJCXsgIDMuMjQxMEYsIC0xLjUzNzRGLCAtMC40OTg2RiB9LAorCQl7ICAtMC45NjkyRiwgMS44NzYwRiwgMC4wNDE2RiB9LAorCQl7ICAwLjA1NTZGLCAtMC4yMDQwRiwgMS4wNTcwRiB9CisJfSwJCisJMTAwLjBGLCAxMDAuMEYsIDEwMC4wRiwJLyogTGlnaHQgby9wIGZvciByZWZlcmVuY2Ugd2hpdGUgKi8KKwkyNTUsIDI1NSwgMjU1LAkJLyogUGl4ZWwgdmFsdWVzIGZvciByZWYuIHdoaXRlICovCisJMS4wRiwgMS4wRiwgMS4wRiwJLyogUmVzaWR1YWwgbGlnaHQgby9wIGZvciBibGFjayBwaXhlbCAqLworCTIuNEYsIDIuNEYsIDIuNEYsCS8qIEdhbW1hIHZhbHVlcyBmb3IgdGhlIHRocmVlIGd1bnMgKi8KK307CisKKy8qCisgKiBDaGVjayB0aGUgaW1hZ2UgdG8gc2VlIGlmIFRJRkZSZWFkUkdCQUltYWdlIGNhbiBkZWFsIHdpdGggaXQuCisgKiAxLzAgaXMgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZSBjYW4KKyAqIGJlIGhhbmRsZWQuICBJZiAwIGlzIHJldHVybmVkLCBlbXNnIGNvbnRhaW5zIHRoZSByZWFzb24KKyAqIHdoeSBpdCBpcyBiZWluZyByZWplY3RlZC4KKyAqLworaW50CitUSUZGUkdCQUltYWdlT0soVElGRiogdGlmLCBjaGFyIGVtc2dbMTAyNF0pCit7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQxNiBwaG90b21ldHJpYzsKKwlpbnQgY29sb3JjaGFubmVsczsKKworCWlmICghdGlmLT50aWZfZGVjb2Rlc3RhdHVzKSB7CisJCXNwcmludGYoZW1zZywgIlNvcnJ5LCByZXF1ZXN0ZWQgY29tcHJlc3Npb24gbWV0aG9kIGlzIG5vdCBjb25maWd1cmVkIik7CisJCXJldHVybiAoMCk7CisJfQorCXN3aXRjaCAodGQtPnRkX2JpdHNwZXJzYW1wbGUpIHsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJY2FzZSA4OgorCQljYXNlIDE2OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2VzIHdpdGggJWQtYml0IHNhbXBsZXMiLAorCQkJICAgIHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJCXJldHVybiAoMCk7CisJfQorCWNvbG9yY2hhbm5lbHMgPSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIC0gdGQtPnRkX2V4dHJhc2FtcGxlczsKKwlpZiAoIVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZwaG90b21ldHJpYykpIHsKKwkJc3dpdGNoIChjb2xvcmNoYW5uZWxzKSB7CisJCQljYXNlIDE6CisJCQkJcGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXBob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfUkdCOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzcHJpbnRmKGVtc2csICJNaXNzaW5nIG5lZWRlZCAlcyB0YWciLCBwaG90b1RhZyk7CisJCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKwlzd2l0Y2ggKHBob3RvbWV0cmljKSB7CisJCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKKwkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorCQljYXNlIFBIT1RPTUVUUklDX1BBTEVUVEU6CisJCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHCisJCQkgICAgJiYgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAhPSAxCisJCQkgICAgJiYgdGQtPnRkX2JpdHNwZXJzYW1wbGUgPCA4ICkgeworCQkJCXNwcmludGYoZW1zZywKKwkJCQkgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBjb250aWd1b3VzIGRhdGEgd2l0aCAlcz0lZCwgIgorCQkJCSAgICAiYW5kICVzPSVkIGFuZCBCaXRzL1NhbXBsZT0lZCIsCisJCQkJICAgIHBob3RvVGFnLCBwaG90b21ldHJpYywKKwkJCQkgICAgIlNhbXBsZXMvcGl4ZWwiLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAorCQkJCSAgICB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBzaG91bGQgbGlrZWx5IHZhbGlkYXRlIHRoYXQgYW55IGV4dHJhIHNhbXBsZXMgYXJlIGVpdGhlcgorCQkJICogdG8gYmUgaWdub3JlZCwgb3IgYXJlIGFscGhhLCBhbmQgaWYgYWxwaGEgd2Ugc2hvdWxkIHRyeSB0byB1c2UKKwkJCSAqIHRoZW0uICBCdXQgZm9yIG5vdyB3ZSB3b24ndCBib3RoZXIgd2l0aCB0aGlzLgorCQkJKi8KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorCQkJLyoKKwkJCSAqIFRPRE86IGlmIGF0IGFsbCBtZWFuaW5nZnVsIGFuZCB1c2VmdWwsIG1ha2UgbW9yZSBjb21wbGV0ZQorCQkJICogc3VwcG9ydCBjaGVjayBoZXJlLCBvciBiZXR0ZXIgc3RpbGwsIHJlZmFjdG9yIHRvIGxldCBzdXBwb3J0aW5nCisJCQkgKiBjb2RlIGRlY2lkZSB3aGV0aGVyIHRoZXJlIGlzIHN1cHBvcnQgYW5kIHdoYXQgbWVhbmluZ2Z1bGwKKwkJCSAqIGVycm9yIHRvIHJldHVybgorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19SR0I6CisJCQlpZiAoY29sb3JjaGFubmVscyA8IDMpIHsKKwkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgUkdCIGltYWdlIHdpdGggJXM9JWQiLAorCQkJCSAgICAiQ29sb3IgY2hhbm5lbHMiLCBjb2xvcmNoYW5uZWxzKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgorCQkJeworCQkJCXVpbnQxNiBpbmtzZXQ7CisJCQkJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19JTktTRVQsICZpbmtzZXQpOworCQkJCWlmIChpbmtzZXQgIT0gSU5LU0VUX0NNWUspIHsKKwkJCQkJc3ByaW50ZihlbXNnLAorCQkJCQkgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBzZXBhcmF0ZWQgaW1hZ2Ugd2l0aCAlcz0lZCIsCisJCQkJCSAgICAiSW5rU2V0IiwgaW5rc2V0KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmICh0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDwgNCkgeworCQkJCQlzcHJpbnRmKGVtc2csCisJCQkJCSAgICAiU29ycnksIGNhbiBub3QgaGFuZGxlIHNlcGFyYXRlZCBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCQkJICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBQSE9UT01FVFJJQ19MT0dMOgorCQkJaWYgKHRkLT50ZF9jb21wcmVzc2lvbiAhPSBDT01QUkVTU0lPTl9TR0lMT0cpIHsKKwkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgTG9nTCBkYXRhIG11c3QgaGF2ZSAlcz0lZCIsCisJCQkJICAgICJDb21wcmVzc2lvbiIsIENPTVBSRVNTSU9OX1NHSUxPRyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX0xPR0xVVjoKKwkJCWlmICh0ZC0+dGRfY29tcHJlc3Npb24gIT0gQ09NUFJFU1NJT05fU0dJTE9HICYmCisJCQkgICAgdGQtPnRkX2NvbXByZXNzaW9uICE9IENPTVBSRVNTSU9OX1NHSUxPRzI0KSB7CisJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIExvZ0x1diBkYXRhIG11c3QgaGF2ZSAlcz0lZCBvciAlZCIsCisJCQkJICAgICJDb21wcmVzc2lvbiIsIENPTVBSRVNTSU9OX1NHSUxPRywgQ09NUFJFU1NJT05fU0dJTE9HMjQpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyAhPSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIExvZ0x1diBpbWFnZXMgd2l0aCAlcz0lZCIsCisJCQkJICAgICJQbGFuYXJjb25maWd1cmF0aW9uIiwgdGQtPnRkX3BsYW5hcmNvbmZpZyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX0NJRUxBQjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlIHdpdGggJXM9JWQiLAorCQkJICAgIHBob3RvVGFnLCBwaG90b21ldHJpYyk7CisJCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitUSUZGUkdCQUltYWdlRW5kKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKwlpZiAoaW1nLT5NYXApCisJCV9USUZGZnJlZShpbWctPk1hcCksIGltZy0+TWFwID0gTlVMTDsKKwlpZiAoaW1nLT5CV21hcCkKKwkJX1RJRkZmcmVlKGltZy0+QldtYXApLCBpbWctPkJXbWFwID0gTlVMTDsKKwlpZiAoaW1nLT5QQUxtYXApCisJCV9USUZGZnJlZShpbWctPlBBTG1hcCksIGltZy0+UEFMbWFwID0gTlVMTDsKKwlpZiAoaW1nLT55Y2JjcikKKwkJX1RJRkZmcmVlKGltZy0+eWNiY3IpLCBpbWctPnljYmNyID0gTlVMTDsKKwlpZiAoaW1nLT5jaWVsYWIpCisJCV9USUZGZnJlZShpbWctPmNpZWxhYiksIGltZy0+Y2llbGFiID0gTlVMTDsKKwlpZiAoaW1nLT5VYVRvQWEpCisJCV9USUZGZnJlZShpbWctPlVhVG9BYSksIGltZy0+VWFUb0FhID0gTlVMTDsKKwlpZiAoaW1nLT5CaXRkZXB0aDE2VG84KQorCQlfVElGRmZyZWUoaW1nLT5CaXRkZXB0aDE2VG84KSwgaW1nLT5CaXRkZXB0aDE2VG84ID0gTlVMTDsKKworCWlmKCBpbWctPnJlZGNtYXAgKSB7CisJCV9USUZGZnJlZSggaW1nLT5yZWRjbWFwICk7CisJCV9USUZGZnJlZSggaW1nLT5ncmVlbmNtYXAgKTsKKwkJX1RJRkZmcmVlKCBpbWctPmJsdWVjbWFwICk7CisgICAgICAgICAgICAgICAgaW1nLT5yZWRjbWFwID0gaW1nLT5ncmVlbmNtYXAgPSBpbWctPmJsdWVjbWFwID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2lzQ0NJVFRDb21wcmVzc2lvbihUSUZGKiB0aWYpCit7CisgICAgdWludDE2IGNvbXByZXNzOworICAgIFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfQ09NUFJFU1NJT04sICZjb21wcmVzcyk7CisgICAgcmV0dXJuIChjb21wcmVzcyA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDMgfHwKKwkgICAgY29tcHJlc3MgPT0gQ09NUFJFU1NJT05fQ0NJVFRGQVg0IHx8CisJICAgIGNvbXByZXNzID09IENPTVBSRVNTSU9OX0NDSVRUUkxFIHx8CisJICAgIGNvbXByZXNzID09IENPTVBSRVNTSU9OX0NDSVRUUkxFVyk7Cit9CisKK2ludAorVElGRlJHQkFJbWFnZUJlZ2luKFRJRkZSR0JBSW1hZ2UqIGltZywgVElGRiogdGlmLCBpbnQgc3RvcCwgY2hhciBlbXNnWzEwMjRdKQoreworCXVpbnQxNiogc2FtcGxlaW5mbzsKKwl1aW50MTYgZXh0cmFzYW1wbGVzOworCXVpbnQxNiBwbGFuYXJjb25maWc7CisJdWludDE2IGNvbXByZXNzOworCWludCBjb2xvcmNoYW5uZWxzOworCXVpbnQxNiAqcmVkX29yaWcsICpncmVlbl9vcmlnLCAqYmx1ZV9vcmlnOworCWludCBuX2NvbG9yOworCisJLyogSW5pdGlhbGl6ZSB0byBub3JtYWwgdmFsdWVzICovCisJaW1nLT5yb3dfb2Zmc2V0ID0gMDsKKwlpbWctPmNvbF9vZmZzZXQgPSAwOworCWltZy0+cmVkY21hcCA9IE5VTEw7CisJaW1nLT5ncmVlbmNtYXAgPSBOVUxMOworCWltZy0+Ymx1ZWNtYXAgPSBOVUxMOworCWltZy0+cmVxX29yaWVudGF0aW9uID0gT1JJRU5UQVRJT05fQk9UTEVGVDsgICAgIC8qIEl0IGlzIHRoZSBkZWZhdWx0ICovCisKKwlpbWctPnRpZiA9IHRpZjsKKwlpbWctPnN0b3BvbmVyciA9IHN0b3A7CisJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAmaW1nLT5iaXRzcGVyc2FtcGxlKTsKKwlzd2l0Y2ggKGltZy0+Yml0c3BlcnNhbXBsZSkgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSA0OgorCQljYXNlIDg6CisJCWNhc2UgMTY6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZXMgd2l0aCAlZC1iaXQgc2FtcGxlcyIsCisJCQkgICAgaW1nLT5iaXRzcGVyc2FtcGxlKTsKKwkJCWdvdG8gZmFpbF9yZXR1cm47CisJfQorCWltZy0+YWxwaGEgPSAwOworCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAmaW1nLT5zYW1wbGVzcGVycGl4ZWwpOworCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfRVhUUkFTQU1QTEVTLAorCSAgICAmZXh0cmFzYW1wbGVzLCAmc2FtcGxlaW5mbyk7CisJaWYgKGV4dHJhc2FtcGxlcyA+PSAxKQorCXsKKwkJc3dpdGNoIChzYW1wbGVpbmZvWzBdKSB7CisJCQljYXNlIEVYVFJBU0FNUExFX1VOU1BFQ0lGSUVEOiAgICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBzb21lIGltYWdlcyB3aXRob3V0ICovCisJCQkJaWYgKGltZy0+c2FtcGxlc3BlcnBpeGVsID4gMykgIC8qIGNvcnJlY3QgaW5mbyBhYm91dCBhbHBoYSBjaGFubmVsICovCisJCQkJCWltZy0+YWxwaGEgPSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBOworCQkJCWJyZWFrOworCQkJY2FzZSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBOiAgICAgICAgICAgLyogZGF0YSBpcyBwcmUtbXVsdGlwbGllZCAqLworCQkJY2FzZSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOiAgICAgICAgICAgLyogZGF0YSBpcyBub3QgcHJlLW11bHRpcGxpZWQgKi8KKwkJCQlpbWctPmFscGhhID0gc2FtcGxlaW5mb1swXTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworI2lmZGVmIERFRkFVTFRfRVhUUkFTQU1QTEVfQVNfQUxQSEEKKwlpZiggIVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZpbWctPnBob3RvbWV0cmljKSkKKwkJaW1nLT5waG90b21ldHJpYyA9IFBIT1RPTUVUUklDX01JTklTV0hJVEU7CisKKwlpZiggZXh0cmFzYW1wbGVzID09IDAKKwkgICAgJiYgaW1nLT5zYW1wbGVzcGVycGl4ZWwgPT0gNAorCSAgICAmJiBpbWctPnBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1JHQiApCisJeworCQlpbWctPmFscGhhID0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQTsKKwkJZXh0cmFzYW1wbGVzID0gMTsKKwl9CisjZW5kaWYKKworCWNvbG9yY2hhbm5lbHMgPSBpbWctPnNhbXBsZXNwZXJwaXhlbCAtIGV4dHJhc2FtcGxlczsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX0NPTVBSRVNTSU9OLCAmY29tcHJlc3MpOworCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfUExBTkFSQ09ORklHLCAmcGxhbmFyY29uZmlnKTsKKwlpZiAoIVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZpbWctPnBob3RvbWV0cmljKSkgeworCQlzd2l0Y2ggKGNvbG9yY2hhbm5lbHMpIHsKKwkJCWNhc2UgMToKKwkJCQlpZiAoaXNDQ0lUVENvbXByZXNzaW9uKHRpZikpCisJCQkJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOworCQkJCWVsc2UKKwkJCQkJaW1nLT5waG90b21ldHJpYyA9IFBIT1RPTUVUUklDX01JTklTQkxBQ0s7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaW1nLT5waG90b21ldHJpYyA9IFBIT1RPTUVUUklDX1JHQjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3ByaW50ZihlbXNnLCAiTWlzc2luZyBuZWVkZWQgJXMgdGFnIiwgcGhvdG9UYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxfcmV0dXJuOworCQl9CisJfQorCXN3aXRjaCAoaW1nLT5waG90b21ldHJpYykgeworCQljYXNlIFBIT1RPTUVUUklDX1BBTEVUVEU6CisJCQlpZiAoIVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfQ09MT1JNQVAsCisJCQkgICAgJnJlZF9vcmlnLCAmZ3JlZW5fb3JpZywgJmJsdWVfb3JpZykpIHsKKwkJCQlzcHJpbnRmKGVtc2csICJNaXNzaW5nIHJlcXVpcmVkIFwiQ29sb3JtYXBcIiB0YWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCX0KKworCQkJLyogY29weSB0aGUgY29sb3JtYXBzIHNvIHdlIGNhbiBtb2RpZnkgdGhlbSAqLworCQkJbl9jb2xvciA9ICgxTCA8PCBpbWctPmJpdHNwZXJzYW1wbGUpOworCQkJaW1nLT5yZWRjbWFwID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyhzaXplb2YodWludDE2KSpuX2NvbG9yKTsKKwkJCWltZy0+Z3JlZW5jbWFwID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyhzaXplb2YodWludDE2KSpuX2NvbG9yKTsKKwkJCWltZy0+Ymx1ZWNtYXAgPSAodWludDE2ICopIF9USUZGbWFsbG9jKHNpemVvZih1aW50MTYpKm5fY29sb3IpOworCQkJaWYoICFpbWctPnJlZGNtYXAgfHwgIWltZy0+Z3JlZW5jbWFwIHx8ICFpbWctPmJsdWVjbWFwICkgeworCQkJCXNwcmludGYoZW1zZywgIk91dCBvZiBtZW1vcnkgZm9yIGNvbG9ybWFwIGNvcHkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCX0KKworCQkJX1RJRkZtZW1jcHkoIGltZy0+cmVkY21hcCwgcmVkX29yaWcsIG5fY29sb3IgKiAyICk7CisJCQlfVElGRm1lbWNweSggaW1nLT5ncmVlbmNtYXAsIGdyZWVuX29yaWcsIG5fY29sb3IgKiAyICk7CisJCQlfVElGRm1lbWNweSggaW1nLT5ibHVlY21hcCwgYmx1ZV9vcmlnLCBuX2NvbG9yICogMiApOworCisJCQkvKiBmYWxsIHRocnUuLi4gKi8KKwkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOgorCQljYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CisJCQlpZiAocGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcKKwkJCSAgICAmJiBpbWctPnNhbXBsZXNwZXJwaXhlbCAhPSAxCisJCQkgICAgJiYgaW1nLT5iaXRzcGVyc2FtcGxlIDwgOCApIHsKKwkJCQlzcHJpbnRmKGVtc2csCisJCQkJICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgY29udGlndW91cyBkYXRhIHdpdGggJXM9JWQsICIKKwkJCQkgICAgImFuZCAlcz0lZCBhbmQgQml0cy9TYW1wbGU9JWQiLAorCQkJCSAgICBwaG90b1RhZywgaW1nLT5waG90b21ldHJpYywKKwkJCQkgICAgIlNhbXBsZXMvcGl4ZWwiLCBpbWctPnNhbXBsZXNwZXJwaXhlbCwKKwkJCQkgICAgaW1nLT5iaXRzcGVyc2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorCQkJLyogSXQgd291bGQgcHJvYmFibHkgYmUgbmljZSB0byBoYXZlIGEgcmVhbGl0eSBjaGVjayBoZXJlLiAqLworCQkJaWYgKHBsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKQorCQkJCS8qIGNhbiByZWx5IG9uIGxpYmpwZWcgdG8gY29udmVydCB0byBSR0IgKi8KKwkJCQkvKiBYWFggc2hvdWxkIHJlc3RvcmUgY3VycmVudCBzdGF0ZSBvbiBleGl0ICovCisJCQkJc3dpdGNoIChjb21wcmVzcykgeworCQkJCQljYXNlIENPTVBSRVNTSU9OX0pQRUc6CisJCQkJCQkvKgorCQkJCQkJICogVE9ETzogd2hlbiBjb21wbGV0ZSB0ZXN0cyB2ZXJpZnkgY29tcGxldGUgZGVzdWJzYW1wbGluZworCQkJCQkJICogYW5kIFlDYkNyIGhhbmRsaW5nLCByZW1vdmUgdXNlIG9mIFRJRkZUQUdfSlBFR0NPTE9STU9ERSBpbgorCQkJCQkJICogZmF2b3Igb2YgdGlmX2dldGltYWdlLmMgbmF0aXZlIGhhbmRsaW5nCisJCQkJCQkgKi8KKwkJCQkJCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfSlBFR0NPTE9STU9ERSwgSlBFR0NPTE9STU9ERV9SR0IpOworCQkJCQkJaW1nLT5waG90b21ldHJpYyA9IFBIT1RPTUVUUklDX1JHQjsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJLyogZG8gbm90aGluZyAqLzsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCS8qCisJCQkgKiBUT0RPOiBpZiBhdCBhbGwgbWVhbmluZ2Z1bCBhbmQgdXNlZnVsLCBtYWtlIG1vcmUgY29tcGxldGUKKwkJCSAqIHN1cHBvcnQgY2hlY2sgaGVyZSwgb3IgYmV0dGVyIHN0aWxsLCByZWZhY3RvciB0byBsZXQgc3VwcG9ydGluZworCQkJICogY29kZSBkZWNpZGUgd2hldGhlciB0aGVyZSBpcyBzdXBwb3J0IGFuZCB3aGF0IG1lYW5pbmdmdWxsCisJCQkgKiBlcnJvciB0byByZXR1cm4KKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfUkdCOgorCQkJaWYgKGNvbG9yY2hhbm5lbHMgPCAzKSB7CisJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIFJHQiBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCQkgICAgIkNvbG9yIGNoYW5uZWxzIiwgY29sb3JjaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19TRVBBUkFURUQ6CisJCQl7CisJCQkJdWludDE2IGlua3NldDsKKwkJCQlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX0lOS1NFVCwgJmlua3NldCk7CisJCQkJaWYgKGlua3NldCAhPSBJTktTRVRfQ01ZSykgeworCQkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgc2VwYXJhdGVkIGltYWdlIHdpdGggJXM9JWQiLAorCQkJCQkgICAgIklua1NldCIsIGlua3NldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCQl9CisJCQkJaWYgKGltZy0+c2FtcGxlc3BlcnBpeGVsIDwgNCkgeworCQkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgc2VwYXJhdGVkIGltYWdlIHdpdGggJXM9JWQiLAorCQkJCQkgICAgIlNhbXBsZXMvcGl4ZWwiLCBpbWctPnNhbXBsZXNwZXJwaXhlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19MT0dMOgorCQkJaWYgKGNvbXByZXNzICE9IENPTVBSRVNTSU9OX1NHSUxPRykgeworCQkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBMb2dMIGRhdGEgbXVzdCBoYXZlICVzPSVkIiwKKwkJCQkgICAgIkNvbXByZXNzaW9uIiwgQ09NUFJFU1NJT05fU0dJTE9HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCX0KKwkJCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0dJTE9HREFUQUZNVCwgU0dJTE9HREFUQUZNVF84QklUKTsKKwkJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOwkvKiBsaXR0bGUgd2hpdGUgbGllICovCisJCQlpbWctPmJpdHNwZXJzYW1wbGUgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfTE9HTFVWOgorCQkJaWYgKGNvbXByZXNzICE9IENPTVBSRVNTSU9OX1NHSUxPRyAmJiBjb21wcmVzcyAhPSBDT01QUkVTU0lPTl9TR0lMT0cyNCkgeworCQkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBMb2dMdXYgZGF0YSBtdXN0IGhhdmUgJXM9JWQgb3IgJWQiLAorCQkJCSAgICAiQ29tcHJlc3Npb24iLCBDT01QUkVTU0lPTl9TR0lMT0csIENPTVBSRVNTSU9OX1NHSUxPRzI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJCX0KKwkJCWlmIChwbGFuYXJjb25maWcgIT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBMb2dMdXYgaW1hZ2VzIHdpdGggJXM9JWQiLAorCQkJCSAgICAiUGxhbmFyY29uZmlndXJhdGlvbiIsIHBsYW5hcmNvbmZpZyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0dJTE9HREFUQUZNVCwgU0dJTE9HREFUQUZNVF84QklUKTsKKwkJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19SR0I7CQkvKiBsaXR0bGUgd2hpdGUgbGllICovCisJCQlpbWctPmJpdHNwZXJzYW1wbGUgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfQ0lFTEFCOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2Ugd2l0aCAlcz0lZCIsCisJCQkgICAgcGhvdG9UYWcsIGltZy0+cGhvdG9tZXRyaWMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwl9CisJaW1nLT5NYXAgPSBOVUxMOworCWltZy0+QldtYXAgPSBOVUxMOworCWltZy0+UEFMbWFwID0gTlVMTDsKKwlpbWctPnljYmNyID0gTlVMTDsKKwlpbWctPmNpZWxhYiA9IE5VTEw7CisJaW1nLT5VYVRvQWEgPSBOVUxMOworCWltZy0+Qml0ZGVwdGgxNlRvOCA9IE5VTEw7CisJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19JTUFHRVdJRFRILCAmaW1nLT53aWR0aCk7CisJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19JTUFHRUxFTkdUSCwgJmltZy0+aGVpZ2h0KTsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX09SSUVOVEFUSU9OLCAmaW1nLT5vcmllbnRhdGlvbik7CisJaW1nLT5pc0NvbnRpZyA9CisJICAgICEocGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSAmJiBpbWctPnNhbXBsZXNwZXJwaXhlbCA+IDEpOworCWlmIChpbWctPmlzQ29udGlnKSB7CisJCWlmICghUGlja0NvbnRpZ0Nhc2UoaW1nKSkgeworCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlIik7CisJCQlnb3RvIGZhaWxfcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFQaWNrU2VwYXJhdGVDYXNlKGltZykpIHsKKwkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSIpOworCQkJZ290byBmYWlsX3JldHVybjsKKwkJfQorCX0KKwlyZXR1cm4gMTsKKworICBmYWlsX3JldHVybjoKKyAgICAgICAgX1RJRkZmcmVlKCBpbWctPnJlZGNtYXAgKTsKKyAgICAgICAgX1RJRkZmcmVlKCBpbWctPmdyZWVuY21hcCApOworICAgICAgICBfVElGRmZyZWUoIGltZy0+Ymx1ZWNtYXAgKTsKKyAgICAgICAgaW1nLT5yZWRjbWFwID0gaW1nLT5ncmVlbmNtYXAgPSBpbWctPmJsdWVjbWFwID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludAorVElGRlJHQkFJbWFnZUdldChUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCit7CisgICAgaWYgKGltZy0+Z2V0ID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKGltZy0+dGlmKSwgIk5vIFwiZ2V0XCIgcm91dGluZSBzZXR1cCIpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoaW1nLT5wdXQuYW55ID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKGltZy0+dGlmKSwKKwkJIk5vIFwicHV0XCIgcm91dGluZSBzZXR1cGw7IHByb2JhYmx5IGNhbiBub3QgaGFuZGxlIGltYWdlIGZvcm1hdCIpOworCQlyZXR1cm4gKDApOworICAgIH0KKyAgICByZXR1cm4gKCppbWctPmdldCkoaW1nLCByYXN0ZXIsIHcsIGgpOworfQorCisvKgorICogUmVhZCB0aGUgc3BlY2lmaWVkIGltYWdlIGludG8gYW4gQUJHUi1mb3JtYXQgcmFzdGVydGFraW5nIGluIGFjY291bnQKKyAqIHNwZWNpZmllZCBvcmllbnRhdGlvbi4KKyAqLworaW50CitUSUZGUmVhZFJHQkFJbWFnZU9yaWVudGVkKFRJRkYqIHRpZiwKKwkJCSAgdWludDMyIHJ3aWR0aCwgdWludDMyIHJoZWlnaHQsIHVpbnQzMiogcmFzdGVyLAorCQkJICBpbnQgb3JpZW50YXRpb24sIGludCBzdG9wKQoreworICAgIGNoYXIgZW1zZ1sxMDI0XSA9ICIiOworICAgIFRJRkZSR0JBSW1hZ2UgaW1nOworICAgIGludCBvazsKKworCWlmIChUSUZGUkdCQUltYWdlT0sodGlmLCBlbXNnKSAmJiBUSUZGUkdCQUltYWdlQmVnaW4oJmltZywgdGlmLCBzdG9wLCBlbXNnKSkgeworCQlpbWcucmVxX29yaWVudGF0aW9uID0gb3JpZW50YXRpb247CisJCS8qIFhYWCB2ZXJpZnkgcndpZHRoIGFuZCByaGVpZ2h0IGFnYWluc3Qgd2lkdGggYW5kIGhlaWdodCAqLworCQlvayA9IFRJRkZSR0JBSW1hZ2VHZXQoJmltZywgcmFzdGVyKyhyaGVpZ2h0LWltZy5oZWlnaHQpKnJ3aWR0aCwKKwkJCXJ3aWR0aCwgaW1nLmhlaWdodCk7CisJCVRJRkZSR0JBSW1hZ2VFbmQoJmltZyk7CisJfSBlbHNlIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCBlbXNnKTsKKwkJb2sgPSAwOworICAgIH0KKyAgICByZXR1cm4gKG9rKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIHNwZWNpZmllZCBpbWFnZSBpbnRvIGFuIEFCR1ItZm9ybWF0IHJhc3Rlci4gVXNlIGJvdHRvbSBsZWZ0CisgKiBvcmlnaW4gZm9yIHJhc3RlciBieSBkZWZhdWx0LgorICovCitpbnQKK1RJRkZSZWFkUkdCQUltYWdlKFRJRkYqIHRpZiwKKwkJICB1aW50MzIgcndpZHRoLCB1aW50MzIgcmhlaWdodCwgdWludDMyKiByYXN0ZXIsIGludCBzdG9wKQoreworCXJldHVybiBUSUZGUmVhZFJHQkFJbWFnZU9yaWVudGVkKHRpZiwgcndpZHRoLCByaGVpZ2h0LCByYXN0ZXIsCisJCQkJCSBPUklFTlRBVElPTl9CT1RMRUZULCBzdG9wKTsKK30KKworc3RhdGljIGludCAKK3NldG9yaWVudGF0aW9uKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKwlzd2l0Y2ggKGltZy0+b3JpZW50YXRpb24pIHsKKwkJY2FzZSBPUklFTlRBVElPTl9UT1BMRUZUOgorCQljYXNlIE9SSUVOVEFUSU9OX0xFRlRUT1A6CisJCQlpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVE9QUklHSFQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9SSUdIVFRPUCkKKwkJCQlyZXR1cm4gRkxJUF9IT1JJWk9OVEFMTFk7CisJCQllbHNlIGlmIChpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9CT1RSSUdIVCB8fAorCQkJICAgIGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1JJR0hUQk9UKQorCQkJCXJldHVybiBGTElQX0hPUklaT05UQUxMWSB8IEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0JPVExFRlQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9MRUZUQk9UKQorCQkJCXJldHVybiBGTElQX1ZFUlRJQ0FMTFk7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCWNhc2UgT1JJRU5UQVRJT05fVE9QUklHSFQ6CisJCWNhc2UgT1JJRU5UQVRJT05fUklHSFRUT1A6CisJCQlpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVE9QTEVGVCB8fAorCQkJICAgIGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0xFRlRUT1ApCisJCQkJcmV0dXJuIEZMSVBfSE9SSVpPTlRBTExZOworCQkJZWxzZSBpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fQk9UUklHSFQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9SSUdIVEJPVCkKKwkJCQlyZXR1cm4gRkxJUF9WRVJUSUNBTExZOworCQkJZWxzZSBpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fQk9UTEVGVCB8fAorCQkJICAgIGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0xFRlRCT1QpCisJCQkJcmV0dXJuIEZMSVBfSE9SSVpPTlRBTExZIHwgRkxJUF9WRVJUSUNBTExZOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQljYXNlIE9SSUVOVEFUSU9OX0JPVFJJR0hUOgorCQljYXNlIE9SSUVOVEFUSU9OX1JJR0hUQk9UOgorCQkJaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1RPUExFRlQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9MRUZUVE9QKQorCQkJCXJldHVybiBGTElQX0hPUklaT05UQUxMWSB8IEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1RPUFJJR0hUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fUklHSFRUT1ApCisJCQkJcmV0dXJuIEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0JPVExFRlQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9MRUZUQk9UKQorCQkJCXJldHVybiBGTElQX0hPUklaT05UQUxMWTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJY2FzZSBPUklFTlRBVElPTl9CT1RMRUZUOgorCQljYXNlIE9SSUVOVEFUSU9OX0xFRlRCT1Q6CisJCQlpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVE9QTEVGVCB8fAorCQkJICAgIGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0xFRlRUT1ApCisJCQkJcmV0dXJuIEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1RPUFJJR0hUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fUklHSFRUT1ApCisJCQkJcmV0dXJuIEZMSVBfSE9SSVpPTlRBTExZIHwgRkxJUF9WRVJUSUNBTExZOworCQkJZWxzZSBpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fQk9UUklHSFQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9SSUdIVEJPVCkKKwkJCQlyZXR1cm4gRkxJUF9IT1JJWk9OVEFMTFk7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CS8qIE5PVFJFQUNIRUQgKi8KKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIEdldCBhbiB0aWxlLW9yZ2FuaXplZCBpbWFnZSB0aGF0IGhhcworICoJUGxhbmFyQ29uZmlndXJhdGlvbiBjb250aWd1b3VzIGlmIFNhbXBsZXNQZXJQaXhlbCA+IDEKKyAqIG9yCisgKglTYW1wbGVzUGVyUGl4ZWwgPT0gMQorICovCQorc3RhdGljIGludAorZ3RUaWxlQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKK3sKKyAgICBUSUZGKiB0aWYgPSBpbWctPnRpZjsKKyAgICB0aWxlQ29udGlnUm91dGluZSBwdXQgPSBpbWctPnB1dC5jb250aWc7CisgICAgdWludDMyIGNvbCwgcm93LCB5LCByb3dzdG9yZWFkOworICAgIHRtc2l6ZV90IHBvczsKKyAgICB1aW50MzIgdHcsIHRoOworICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKKyAgICBpbnQzMiBmcm9tc2tldywgdG9za2V3OworICAgIHVpbnQzMiBucm93OworICAgIGludCByZXQgPSAxLCBmbGlwOworCisgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKSBfVElGRm1hbGxvYyhUSUZGVGlsZVNpemUodGlmKSk7CisgICAgaWYgKGJ1ZiA9PSAwKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIk5vIHNwYWNlIGZvciB0aWxlIGJ1ZmZlciIpOworCQlyZXR1cm4gKDApOworICAgIH0KKyAgICBfVElGRm1lbXNldChidWYsIDAsIFRJRkZUaWxlU2l6ZSh0aWYpKTsKKyAgICBUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1RJTEVXSURUSCwgJnR3KTsKKyAgICBUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1RJTEVMRU5HVEgsICZ0aCk7CisKKyAgICBmbGlwID0gc2V0b3JpZW50YXRpb24oaW1nKTsKKyAgICBpZiAoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSkgeworCSAgICB5ID0gaCAtIDE7CisJICAgIHRvc2tldyA9IC0oaW50MzIpKHR3ICsgdyk7CisgICAgfQorICAgIGVsc2UgeworCSAgICB5ID0gMDsKKwkgICAgdG9za2V3ID0gLShpbnQzMikodHcgLSB3KTsKKyAgICB9CisgICAgIAorICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisgICAgeworICAgICAgICByb3dzdG9yZWFkID0gdGggLSAocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSAlIHRoOworICAgIAlucm93ID0gKHJvdyArIHJvd3N0b3JlYWQgPiBoID8gaCAtIHJvdyA6IHJvd3N0b3JlYWQpOworCWZvciAoY29sID0gMDsgY29sIDwgdzsgY29sICs9IHR3KSAKKyAgICAgICAgeworCSAgICBpZiAoVElGRlJlYWRUaWxlKHRpZiwgYnVmLCBjb2wraW1nLT5jb2xfb2Zmc2V0LCAgCisJCQkgICAgIHJvdytpbWctPnJvd19vZmZzZXQsIDAsIDApPT0odG1zaXplX3QpKC0xKSAmJiBpbWctPnN0b3BvbmVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCSAgICAKKwkgICAgcG9zID0gKChyb3craW1nLT5yb3dfb2Zmc2V0KSAlIHRoKSAqIFRJRkZUaWxlUm93U2l6ZSh0aWYpOyAgCisKKyAgICAJICAgIGlmIChjb2wgKyB0dyA+IHcpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVGlsZSBpcyBjbGlwcGVkIGhvcml6b250YWxseS4gIENhbGN1bGF0ZQorICAgICAgICAgICAgICAgICAqIHZpc2libGUgcG9ydGlvbiBhbmQgc2tld2luZyBmYWN0b3JzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHVpbnQzMiBucGl4ID0gdyAtIGNvbDsKKyAgICAgICAgICAgICAgICBmcm9tc2tldyA9IHR3IC0gbnBpeDsKKyAgICAgICAgICAgICAgICAoKnB1dCkoaW1nLCByYXN0ZXIreSp3K2NvbCwgY29sLCB5LAorICAgICAgICAgICAgICAgICAgICAgICBucGl4LCBucm93LCBmcm9tc2tldywgdG9za2V3ICsgZnJvbXNrZXcsIGJ1ZiArIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHV0KShpbWcsIHJhc3Rlcit5KncrY29sLCBjb2wsIHksIHR3LCBucm93LCAwLCB0b3NrZXcsIGJ1ZiArIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB5ICs9IChmbGlwICYgRkxJUF9WRVJUSUNBTExZID8gLShpbnQzMikgbnJvdyA6IChpbnQzMikgbnJvdyk7CisgICAgfQorICAgIF9USUZGZnJlZShidWYpOworCisgICAgaWYgKGZsaXAgJiBGTElQX0hPUklaT05UQUxMWSkgeworCSAgICB1aW50MzIgbGluZTsKKworCSAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7CisJCSAgICB1aW50MzIgKmxlZnQgPSByYXN0ZXIgKyAobGluZSAqIHcpOworCQkgICAgdWludDMyICpyaWdodCA9IGxlZnQgKyB3IC0gMTsKKwkJICAgIAorCQkgICAgd2hpbGUgKCBsZWZ0IDwgcmlnaHQgKSB7CisJCQkgICAgdWludDMyIHRlbXAgPSAqbGVmdDsKKwkJCSAgICAqbGVmdCA9ICpyaWdodDsKKwkJCSAgICAqcmlnaHQgPSB0ZW1wOworCQkJICAgIGxlZnQrKywgcmlnaHQtLTsKKwkJICAgIH0KKwkgICAgfQorICAgIH0KKworICAgIHJldHVybiAocmV0KTsKK30KKworLyoKKyAqIEdldCBhbiB0aWxlLW9yZ2FuaXplZCBpbWFnZSB0aGF0IGhhcworICoJIFNhbXBsZXNQZXJQaXhlbCA+IDEKKyAqCSBQbGFuYXJDb25maWd1cmF0aW9uIHNlcGFyYXRlZAorICogV2UgYXNzdW1lIHRoYXQgYWxsIHN1Y2ggaW1hZ2VzIGFyZSBSR0IuCisgKi8JCitzdGF0aWMgaW50CitndFRpbGVTZXBhcmF0ZShUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCit7CisJVElGRiogdGlmID0gaW1nLT50aWY7CisJdGlsZVNlcGFyYXRlUm91dGluZSBwdXQgPSBpbWctPnB1dC5zZXBhcmF0ZTsKKwl1aW50MzIgY29sLCByb3csIHksIHJvd3N0b3JlYWQ7CisJdG1zaXplX3QgcG9zOworCXVpbnQzMiB0dywgdGg7CisJdW5zaWduZWQgY2hhciogYnVmOworCXVuc2lnbmVkIGNoYXIqIHAwOworCXVuc2lnbmVkIGNoYXIqIHAxOworCXVuc2lnbmVkIGNoYXIqIHAyOworCXVuc2lnbmVkIGNoYXIqIHBhOworCXRtc2l6ZV90IHRpbGVzaXplOworCXRtc2l6ZV90IGJ1ZnNpemU7CisJaW50MzIgZnJvbXNrZXcsIHRvc2tldzsKKwlpbnQgYWxwaGEgPSBpbWctPmFscGhhOworCXVpbnQzMiBucm93OworCWludCByZXQgPSAxLCBmbGlwOworICAgICAgICBpbnQgY29sb3JjaGFubmVsczsKKworCXRpbGVzaXplID0gVElGRlRpbGVTaXplKHRpZik7ICAKKwlidWZzaXplID0gVElGRlNhZmVNdWx0aXBseSh0bXNpemVfdCxhbHBoYT80OjMsdGlsZXNpemUpOworCWlmIChidWZzaXplID09IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiSW50ZWdlciBvdmVyZmxvdyBpbiAlcyIsICJndFRpbGVTZXBhcmF0ZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlidWYgPSAodW5zaWduZWQgY2hhciopIF9USUZGbWFsbG9jKGJ1ZnNpemUpOworCWlmIChidWYgPT0gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJX1RJRkZtZW1zZXQoYnVmLCAwLCBidWZzaXplKTsKKwlwMCA9IGJ1ZjsKKwlwMSA9IHAwICsgdGlsZXNpemU7CisJcDIgPSBwMSArIHRpbGVzaXplOworCXBhID0gKGFscGhhPyhwMit0aWxlc2l6ZSk6TlVMTCk7CisJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFV0lEVEgsICZ0dyk7CisJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGgpOworCisJZmxpcCA9IHNldG9yaWVudGF0aW9uKGltZyk7CisJaWYgKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkpIHsKKwkJeSA9IGggLSAxOworCQl0b3NrZXcgPSAtKGludDMyKSh0dyArIHcpOworCX0KKwllbHNlIHsKKwkJeSA9IDA7CisJCXRvc2tldyA9IC0oaW50MzIpKHR3IC0gdyk7CisJfQorCisgICAgICAgIHN3aXRjaCggaW1nLT5waG90b21ldHJpYyApCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX01JTklTV0hJVEU6CisgICAgICAgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKyAgICAgICAgICAgIGNvbG9yY2hhbm5lbHMgPSAxOworICAgICAgICAgICAgcDIgPSBwMSA9IHAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29sb3JjaGFubmVscyA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3cgKz0gbnJvdykKKwl7CisJCXJvd3N0b3JlYWQgPSB0aCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgdGg7CisJCW5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CisJCWZvciAoY29sID0gMDsgY29sIDwgdzsgY29sICs9IHR3KQorCQl7CisJCQlpZiAoVElGRlJlYWRUaWxlKHRpZiwgcDAsIGNvbCtpbWctPmNvbF9vZmZzZXQsICAKKwkJCSAgICByb3craW1nLT5yb3dfb2Zmc2V0LDAsMCk9PSh0bXNpemVfdCkoLTEpICYmIGltZy0+c3RvcG9uZXJyKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29sb3JjaGFubmVscyA+IDEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVElGRlJlYWRUaWxlKHRpZiwgcDEsIGNvbCtpbWctPmNvbF9vZmZzZXQsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwwLDEpID09ICh0bXNpemVfdCkoLTEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29sb3JjaGFubmVscyA+IDEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVElGRlJlYWRUaWxlKHRpZiwgcDIsIGNvbCtpbWctPmNvbF9vZmZzZXQsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwwLDIpID09ICh0bXNpemVfdCkoLTEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYWxwaGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUSUZGUmVhZFRpbGUodGlmLHBhLGNvbCtpbWctPmNvbF9vZmZzZXQsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwwLGNvbG9yY2hhbm5lbHMpID09ICh0bXNpemVfdCkoLTEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltZy0+c3RvcG9uZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9CisKKwkJCXBvcyA9ICgocm93K2ltZy0+cm93X29mZnNldCkgJSB0aCkgKiBUSUZGVGlsZVJvd1NpemUodGlmKTsgIAorCisJCQlpZiAoY29sICsgdHcgPiB3KQorCQkJeworCQkJCS8qCisJCQkJICogVGlsZSBpcyBjbGlwcGVkIGhvcml6b250YWxseS4gIENhbGN1bGF0ZQorCQkJCSAqIHZpc2libGUgcG9ydGlvbiBhbmQgc2tld2luZyBmYWN0b3JzLgorCQkJCSAqLworCQkJCXVpbnQzMiBucGl4ID0gdyAtIGNvbDsKKwkJCQlmcm9tc2tldyA9IHR3IC0gbnBpeDsKKwkJCQkoKnB1dCkoaW1nLCByYXN0ZXIreSp3K2NvbCwgY29sLCB5LAorCQkJCSAgICBucGl4LCBucm93LCBmcm9tc2tldywgdG9za2V3ICsgZnJvbXNrZXcsCisJCQkJICAgIHAwICsgcG9zLCBwMSArIHBvcywgcDIgKyBwb3MsIChhbHBoYT8ocGErcG9zKTpOVUxMKSk7CisJCQl9IGVsc2UgeworCQkJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncrY29sLCBjb2wsIHksCisJCQkJICAgIHR3LCBucm93LCAwLCB0b3NrZXcsIHAwICsgcG9zLCBwMSArIHBvcywgcDIgKyBwb3MsIChhbHBoYT8ocGErcG9zKTpOVUxMKSk7CisJCQl9CisJCX0KKworCQl5ICs9IChmbGlwICYgRkxJUF9WRVJUSUNBTExZID8tKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKKwl9CisKKwlpZiAoZmxpcCAmIEZMSVBfSE9SSVpPTlRBTExZKSB7CisJCXVpbnQzMiBsaW5lOworCisJCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKKwkJCXVpbnQzMiAqbGVmdCA9IHJhc3RlciArIChsaW5lICogdyk7CisJCQl1aW50MzIgKnJpZ2h0ID0gbGVmdCArIHcgLSAxOworCisJCQl3aGlsZSAoIGxlZnQgPCByaWdodCApIHsKKwkJCQl1aW50MzIgdGVtcCA9ICpsZWZ0OworCQkJCSpsZWZ0ID0gKnJpZ2h0OworCQkJCSpyaWdodCA9IHRlbXA7CisJCQkJbGVmdCsrLCByaWdodC0tOworCQkJfQorCQl9CisJfQorCisJX1RJRkZmcmVlKGJ1Zik7CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogR2V0IGEgc3RyaXAtb3JnYW5pemVkIGltYWdlIHRoYXQgaGFzCisgKglQbGFuYXJDb25maWd1cmF0aW9uIGNvbnRpZ3VvdXMgaWYgU2FtcGxlc1BlclBpeGVsID4gMQorICogb3IKKyAqCVNhbXBsZXNQZXJQaXhlbCA9PSAxCisgKi8JCitzdGF0aWMgaW50CitndFN0cmlwQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKK3sKKwlUSUZGKiB0aWYgPSBpbWctPnRpZjsKKwl0aWxlQ29udGlnUm91dGluZSBwdXQgPSBpbWctPnB1dC5jb250aWc7CisJdWludDMyIHJvdywgeSwgbnJvdywgbnJvd3N1Yiwgcm93c3RvcmVhZDsKKwl0bXNpemVfdCBwb3M7CisJdW5zaWduZWQgY2hhciogYnVmOworCXVpbnQzMiByb3dzcGVyc3RyaXA7CisJdWludDE2IHN1YnNhbXBsaW5naG9yLHN1YnNhbXBsaW5ndmVyOworCXVpbnQzMiBpbWFnZXdpZHRoID0gaW1nLT53aWR0aDsKKwl0bXNpemVfdCBzY2FubGluZTsKKwlpbnQzMiBmcm9tc2tldywgdG9za2V3OworCWludCByZXQgPSAxLCBmbGlwOworCisJYnVmID0gKHVuc2lnbmVkIGNoYXIqKSBfVElGRm1hbGxvYyhUSUZGU3RyaXBTaXplKHRpZikpOworCWlmIChidWYgPT0gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3Igc3RyaXAgYnVmZmVyIik7CisJCXJldHVybiAoMCk7CisJfQorCV9USUZGbWVtc2V0KGJ1ZiwgMCwgVElGRlN0cmlwU2l6ZSh0aWYpKTsKKworCWZsaXAgPSBzZXRvcmllbnRhdGlvbihpbWcpOworCWlmIChmbGlwICYgRkxJUF9WRVJUSUNBTExZKSB7CisJCXkgPSBoIC0gMTsKKwkJdG9za2V3ID0gLShpbnQzMikodyArIHcpOworCX0gZWxzZSB7CisJCXkgPSAwOworCQl0b3NrZXcgPSAtKGludDMyKSh3IC0gdyk7CisJfQorCisJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZyb3dzcGVyc3RyaXApOworCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywgJnN1YnNhbXBsaW5naG9yLCAmc3Vic2FtcGxpbmd2ZXIpOworCXNjYW5saW5lID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCWZyb21za2V3ID0gKHcgPCBpbWFnZXdpZHRoID8gaW1hZ2V3aWR0aCAtIHcgOiAwKTsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IGg7IHJvdyArPSBucm93KQorCXsKKwkJcm93c3RvcmVhZCA9IHJvd3NwZXJzdHJpcCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgcm93c3BlcnN0cmlwOworCQlucm93ID0gKHJvdyArIHJvd3N0b3JlYWQgPiBoID8gaCAtIHJvdyA6IHJvd3N0b3JlYWQpOworCQlucm93c3ViID0gbnJvdzsKKwkJaWYgKChucm93c3ViJXN1YnNhbXBsaW5ndmVyKSE9MCkKKwkJCW5yb3dzdWIrPXN1YnNhbXBsaW5ndmVyLW5yb3dzdWIlc3Vic2FtcGxpbmd2ZXI7CisJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsCisJCSAgICBUSUZGQ29tcHV0ZVN0cmlwKHRpZixyb3craW1nLT5yb3dfb2Zmc2V0LCAwKSwKKwkJICAgIGJ1ZiwKKwkJICAgICgocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSVyb3dzcGVyc3RyaXAgKyBucm93c3ViKSAqIHNjYW5saW5lKT09KHRtc2l6ZV90KSgtMSkKKwkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQl7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlwb3MgPSAoKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXApICogc2NhbmxpbmU7CisJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncsIDAsIHksIHcsIG5yb3csIGZyb21za2V3LCB0b3NrZXcsIGJ1ZiArIHBvcyk7CisJCXkgKz0gKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkgPyAtKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKKwl9CisKKwlpZiAoZmxpcCAmIEZMSVBfSE9SSVpPTlRBTExZKSB7CisJCXVpbnQzMiBsaW5lOworCisJCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKKwkJCXVpbnQzMiAqbGVmdCA9IHJhc3RlciArIChsaW5lICogdyk7CisJCQl1aW50MzIgKnJpZ2h0ID0gbGVmdCArIHcgLSAxOworCisJCQl3aGlsZSAoIGxlZnQgPCByaWdodCApIHsKKwkJCQl1aW50MzIgdGVtcCA9ICpsZWZ0OworCQkJCSpsZWZ0ID0gKnJpZ2h0OworCQkJCSpyaWdodCA9IHRlbXA7CisJCQkJbGVmdCsrLCByaWdodC0tOworCQkJfQorCQl9CisJfQorCisJX1RJRkZmcmVlKGJ1Zik7CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogR2V0IGEgc3RyaXAtb3JnYW5pemVkIGltYWdlIHdpdGgKKyAqCSBTYW1wbGVzUGVyUGl4ZWwgPiAxCisgKgkgUGxhbmFyQ29uZmlndXJhdGlvbiBzZXBhcmF0ZWQKKyAqIFdlIGFzc3VtZSB0aGF0IGFsbCBzdWNoIGltYWdlcyBhcmUgUkdCLgorICovCitzdGF0aWMgaW50CitndFN0cmlwU2VwYXJhdGUoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQoreworCVRJRkYqIHRpZiA9IGltZy0+dGlmOworCXRpbGVTZXBhcmF0ZVJvdXRpbmUgcHV0ID0gaW1nLT5wdXQuc2VwYXJhdGU7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnAwLCAqcDEsICpwMiwgKnBhOworCXVpbnQzMiByb3csIHksIG5yb3csIHJvd3N0b3JlYWQ7CisJdG1zaXplX3QgcG9zOworCXRtc2l6ZV90IHNjYW5saW5lOworCXVpbnQzMiByb3dzcGVyc3RyaXAsIG9mZnNldF9yb3c7CisJdWludDMyIGltYWdld2lkdGggPSBpbWctPndpZHRoOworCXRtc2l6ZV90IHN0cmlwc2l6ZTsKKwl0bXNpemVfdCBidWZzaXplOworCWludDMyIGZyb21za2V3LCB0b3NrZXc7CisJaW50IGFscGhhID0gaW1nLT5hbHBoYTsKKwlpbnQgcmV0ID0gMSwgZmxpcCwgY29sb3JjaGFubmVsczsKKworCXN0cmlwc2l6ZSA9IFRJRkZTdHJpcFNpemUodGlmKTsgIAorCWJ1ZnNpemUgPSBUSUZGU2FmZU11bHRpcGx5KHRtc2l6ZV90LGFscGhhPzQ6MyxzdHJpcHNpemUpOworCWlmIChidWZzaXplID09IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiSW50ZWdlciBvdmVyZmxvdyBpbiAlcyIsICJndFN0cmlwU2VwYXJhdGUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcDAgPSBidWYgPSAodW5zaWduZWQgY2hhciAqKV9USUZGbWFsbG9jKGJ1ZnNpemUpOworCWlmIChidWYgPT0gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJX1RJRkZtZW1zZXQoYnVmLCAwLCBidWZzaXplKTsKKwlwMSA9IHAwICsgc3RyaXBzaXplOworCXAyID0gcDEgKyBzdHJpcHNpemU7CisJcGEgPSAoYWxwaGE/KHAyK3N0cmlwc2l6ZSk6TlVMTCk7CisKKwlmbGlwID0gc2V0b3JpZW50YXRpb24oaW1nKTsKKwlpZiAoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSkgeworCQl5ID0gaCAtIDE7CisJCXRvc2tldyA9IC0oaW50MzIpKHcgKyB3KTsKKwl9CisJZWxzZSB7CisJCXkgPSAwOworCQl0b3NrZXcgPSAtKGludDMyKSh3IC0gdyk7CisJfQorCisgICAgICAgIHN3aXRjaCggaW1nLT5waG90b21ldHJpYyApCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX01JTklTV0hJVEU6CisgICAgICAgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKyAgICAgICAgICAgIGNvbG9yY2hhbm5lbHMgPSAxOworICAgICAgICAgICAgcDIgPSBwMSA9IHAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29sb3JjaGFubmVscyA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZyb3dzcGVyc3RyaXApOworCXNjYW5saW5lID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOyAgCisJZnJvbXNrZXcgPSAodyA8IGltYWdld2lkdGggPyBpbWFnZXdpZHRoIC0gdyA6IDApOworCWZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisJeworCQlyb3dzdG9yZWFkID0gcm93c3BlcnN0cmlwIC0gKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXA7CisJCW5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CisJCW9mZnNldF9yb3cgPSByb3cgKyBpbWctPnJvd19vZmZzZXQ7CisJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCAwKSwKKwkJICAgIHAwLCAoKHJvdyArIGltZy0+cm93X29mZnNldCklcm93c3BlcnN0cmlwICsgbnJvdykgKiBzY2FubGluZSk9PSh0bXNpemVfdCkoLTEpCisJCSAgICAmJiBpbWctPnN0b3BvbmVycikKKwkJeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb2xvcmNoYW5uZWxzID4gMSAKKyAgICAgICAgICAgICAgICAgICAgJiYgVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgb2Zmc2V0X3JvdywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxLCAoKHJvdyArIGltZy0+cm93X29mZnNldCklcm93c3BlcnN0cmlwICsgbnJvdykgKiBzY2FubGluZSkgPT0gKHRtc2l6ZV90KSgtMSkKKwkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQl7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvbG9yY2hhbm5lbHMgPiAxIAorICAgICAgICAgICAgICAgICAgICAmJiBUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDIsICgocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSVyb3dzcGVyc3RyaXAgKyBucm93KSAqIHNjYW5saW5lKSA9PSAodG1zaXplX3QpKC0xKQorCQkgICAgJiYgaW1nLT5zdG9wb25lcnIpCisJCXsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYWxwaGEpCisJCXsKKwkJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCBjb2xvcmNoYW5uZWxzKSwKKwkJCSAgICBwYSwgKChyb3cgKyBpbWctPnJvd19vZmZzZXQpJXJvd3NwZXJzdHJpcCArIG5yb3cpICogc2NhbmxpbmUpPT0odG1zaXplX3QpKC0xKQorCQkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlwb3MgPSAoKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXApICogc2NhbmxpbmU7CisJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncsIDAsIHksIHcsIG5yb3csIGZyb21za2V3LCB0b3NrZXcsIHAwICsgcG9zLCBwMSArIHBvcywKKwkJICAgIHAyICsgcG9zLCAoYWxwaGE/KHBhK3Bvcyk6TlVMTCkpOworCQl5ICs9IChmbGlwICYgRkxJUF9WRVJUSUNBTExZID8gLShpbnQzMikgbnJvdyA6IChpbnQzMikgbnJvdyk7CisJfQorCisJaWYgKGZsaXAgJiBGTElQX0hPUklaT05UQUxMWSkgeworCQl1aW50MzIgbGluZTsKKworCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7CisJCQl1aW50MzIgKmxlZnQgPSByYXN0ZXIgKyAobGluZSAqIHcpOworCQkJdWludDMyICpyaWdodCA9IGxlZnQgKyB3IC0gMTsKKworCQkJd2hpbGUgKCBsZWZ0IDwgcmlnaHQgKSB7CisJCQkJdWludDMyIHRlbXAgPSAqbGVmdDsKKwkJCQkqbGVmdCA9ICpyaWdodDsKKwkJCQkqcmlnaHQgPSB0ZW1wOworCQkJCWxlZnQrKywgcmlnaHQtLTsKKwkJCX0KKwkJfQorCX0KKworCV9USUZGZnJlZShidWYpOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgbW92ZSBkZWNvZGVkIGRhdGEgcmV0dXJuZWQKKyAqIGZyb20gdGhlIFRJRkYgbGlicmFyeSBpbnRvIHJhc3RlcnMgZmlsbGVkIHdpdGggcGFja2VkCisgKiBBQkdSIHBpeGVscyAoaS5lLiBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBscmVjd3JpdGUuKQorICoKKyAqIFRoZSByb3V0aW5lcyBoYXZlIGJlZW4gY3JlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIG1vc3QKKyAqIGltcG9ydGFudCBjYXNlcyBhbmQgb3B0aW1pemVkLiAgUGlja0NvbnRpZ0Nhc2UgYW5kCisgKiBQaWNrU2VwYXJhdGVDYXNlIGFuYWx5emUgdGhlIHBhcmFtZXRlcnMgYW5kIHNlbGVjdAorICogdGhlIGFwcHJvcHJpYXRlICJnZXQiIGFuZCAicHV0IiByb3V0aW5lIHRvIHVzZS4KKyAqLworI2RlZmluZQlSRVBFQVQ4KG9wKQlSRVBFQVQ0KG9wKTsgUkVQRUFUNChvcCkKKyNkZWZpbmUJUkVQRUFUNChvcCkJUkVQRUFUMihvcCk7IFJFUEVBVDIob3ApCisjZGVmaW5lCVJFUEVBVDIob3ApCW9wOyBvcAorI2RlZmluZQlDQVNFOCh4LG9wKQkJCVwKKyAgICBzd2l0Y2ggKHgpIHsJCQlcCisgICAgY2FzZSA3OiBvcDsgY2FzZSA2OiBvcDsgY2FzZSA1OiBvcDsJXAorICAgIGNhc2UgNDogb3A7IGNhc2UgMzogb3A7IGNhc2UgMjogb3A7CVwKKyAgICBjYXNlIDE6IG9wOwkJCQlcCisgICAgfQorI2RlZmluZQlDQVNFNCh4LG9wKQlzd2l0Y2ggKHgpIHsgY2FzZSAzOiBvcDsgY2FzZSAyOiBvcDsgY2FzZSAxOiBvcDsgfQorI2RlZmluZQlOT1AKKworI2RlZmluZQlVTlJPTEw4KHcsIG9wMSwgb3AyKSB7CQlcCisgICAgdWludDMyIF94OwkJCQlcCisgICAgZm9yIChfeCA9IHc7IF94ID49IDg7IF94IC09IDgpIHsJXAorCW9wMTsJCQkJXAorCVJFUEVBVDgob3AyKTsJCQlcCisgICAgfQkJCQkJXAorICAgIGlmIChfeCA+IDApIHsJCQlcCisJb3AxOwkJCQlcCisJQ0FTRTgoX3gsb3AyKTsJCQlcCisgICAgfQkJCQkJXAorfQorI2RlZmluZQlVTlJPTEw0KHcsIG9wMSwgb3AyKSB7CQlcCisgICAgdWludDMyIF94OwkJCQlcCisgICAgZm9yIChfeCA9IHc7IF94ID49IDQ7IF94IC09IDQpIHsJXAorCW9wMTsJCQkJXAorCVJFUEVBVDQob3AyKTsJCQlcCisgICAgfQkJCQkJXAorICAgIGlmIChfeCA+IDApIHsJCQlcCisJb3AxOwkJCQlcCisJQ0FTRTQoX3gsb3AyKTsJCQlcCisgICAgfQkJCQkJXAorfQorI2RlZmluZQlVTlJPTEwyKHcsIG9wMSwgb3AyKSB7CQlcCisgICAgdWludDMyIF94OwkJCQlcCisgICAgZm9yIChfeCA9IHc7IF94ID49IDI7IF94IC09IDIpIHsJXAorCW9wMTsJCQkJXAorCVJFUEVBVDIob3AyKTsJCQlcCisgICAgfQkJCQkJXAorICAgIGlmIChfeCkgewkJCQlcCisJb3AxOwkJCQlcCisJb3AyOwkJCQlcCisgICAgfQkJCQkJXAorfQorICAgIAorI2RlZmluZQlTS0VXKHIsZyxiLHNrZXcpCXsgciArPSBza2V3OyBnICs9IHNrZXc7IGIgKz0gc2tldzsgfQorI2RlZmluZQlTS0VXNChyLGcsYixhLHNrZXcpCXsgciArPSBza2V3OyBnICs9IHNrZXc7IGIgKz0gc2tldzsgYSs9IHNrZXc7IH0KKworI2RlZmluZSBBMSAoKCh1aW50MzIpMHhmZkwpPDwyNCkKKyNkZWZpbmUJUEFDSyhyLGcsYikJXAorCSgodWludDMyKShyKXwoKHVpbnQzMikoZyk8PDgpfCgodWludDMyKShiKTw8MTYpfEExKQorI2RlZmluZQlQQUNLNChyLGcsYixhKQlcCisJKCh1aW50MzIpKHIpfCgodWludDMyKShnKTw8OCl8KCh1aW50MzIpKGIpPDwxNil8KCh1aW50MzIpKGEpPDwyNCkpCisjZGVmaW5lIFcyQih2KSAoKCh2KT4+OCkmMHhmZikKKy8qIFRPRE86IFBBQ0tXIHNob3VsZCBoYXZlIGJlIG1hZGUgcmVkdW5kYW50IGluIGZhdm9yIG9mIEJpdGRlcHRoMTZUbzggTFVUICovCisjZGVmaW5lCVBBQ0tXKHIsZyxiKQlcCisJKCh1aW50MzIpVzJCKHIpfCgodWludDMyKVcyQihnKTw8OCl8KCh1aW50MzIpVzJCKGIpPDwxNil8QTEpCisjZGVmaW5lCVBBQ0tXNChyLGcsYixhKQlcCisJKCh1aW50MzIpVzJCKHIpfCgodWludDMyKVcyQihnKTw8OCl8KCh1aW50MzIpVzJCKGIpPDwxNil8KCh1aW50MzIpVzJCKGEpPDwyNCkpCisKKyNkZWZpbmUJREVDTEFSRUNvbnRpZ1B1dEZ1bmMobmFtZSkgXAorc3RhdGljIHZvaWQgbmFtZShcCisgICAgVElGRlJHQkFJbWFnZSogaW1nLCBcCisgICAgdWludDMyKiBjcCwgXAorICAgIHVpbnQzMiB4LCB1aW50MzIgeSwgXAorICAgIHVpbnQzMiB3LCB1aW50MzIgaCwgXAorICAgIGludDMyIGZyb21za2V3LCBpbnQzMiB0b3NrZXcsIFwKKyAgICB1bnNpZ25lZCBjaGFyKiBwcCBcCispCisKKy8qCisgKiA4LWJpdCBwYWxldHRlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQ4Yml0Y21hcHRpbGUpCit7CisgICAgdWludDMyKiogUEFMbWFwID0gaW1nLT5QQUxtYXA7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCisgICAgKHZvaWQpIHk7CisgICAgd2hpbGUgKGgtLSA+IDApIHsKKwlmb3IgKHggPSB3OyB4LS0gPiAwOykKKyAgICAgICAgeworCSAgICAqY3ArKyA9IFBBTG1hcFsqcHBdWzBdOworICAgICAgICAgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsOworICAgICAgICB9CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDQtYml0IHBhbGV0dGUgPT4gY29sb3JtYXAvUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dDRiaXRjbWFwdGlsZSkKK3sKKyAgICB1aW50MzIqKiBQQUxtYXAgPSBpbWctPlBBTG1hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSAyOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEwyKHcsIGJ3ID0gUEFMbWFwWypwcCsrXSwgKmNwKysgPSAqYncrKyk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDItYml0IHBhbGV0dGUgPT4gY29sb3JtYXAvUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dDJiaXRjbWFwdGlsZSkKK3sKKyAgICB1aW50MzIqKiBQQUxtYXAgPSBpbWctPlBBTG1hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA0OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw0KHcsIGJ3ID0gUEFMbWFwWypwcCsrXSwgKmNwKysgPSAqYncrKyk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDEtYml0IHBhbGV0dGUgPT4gY29sb3JtYXAvUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dDFiaXRjbWFwdGlsZSkKK3sKKyAgICB1aW50MzIqKiBQQUxtYXAgPSBpbWctPlBBTG1hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA4OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw4KHcsIGJ3ID0gUEFMbWFwWypwcCsrXSwgKmNwKysgPSAqYncrKyk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IGdyZXlzY2FsZSA9PiBjb2xvcm1hcC9SR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0Z3JleXRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB5OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJZm9yICh4ID0gdzsgeC0tID4gMDspCisgICAgICAgIHsKKwkgICAgKmNwKysgPSBCV21hcFsqcHBdWzBdOworICAgICAgICAgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsOworICAgICAgICB9CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IGdyZXlzY2FsZSB3aXRoIGFzc29jaWF0ZWQgYWxwaGEgPT4gY29sb3JtYXAvUkdCQQorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRhZ3JleXRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB5OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJZm9yICh4ID0gdzsgeC0tID4gMDspCisgICAgICAgIHsKKyAgICAgICAgICAgICpjcCsrID0gQldtYXBbKnBwXVswXSAmICgqKHBwKzEpIDw8IDI0IHwgfkExKTsKKyAgICAgICAgICAgIHBwICs9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICAgICAgfQorCWNwICs9IHRvc2tldzsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisKKy8qCisgKiAxNi1iaXQgZ3JleXNjYWxlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQxNmJpdGJ3dGlsZSkKK3sKKyAgICBpbnQgc2FtcGxlc3BlcnBpeGVsID0gaW1nLT5zYW1wbGVzcGVycGl4ZWw7CisgICAgdWludDMyKiogQldtYXAgPSBpbWctPkJXbWFwOworCisgICAgKHZvaWQpIHk7CisgICAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICAgICAgdWludDE2ICp3cCA9ICh1aW50MTYgKikgcHA7CisKKwlmb3IgKHggPSB3OyB4LS0gPiAwOykKKyAgICAgICAgeworICAgICAgICAgICAgLyogdXNlIGhpZ2ggb3JkZXIgYnl0ZSBvZiAxNmJpdCB2YWx1ZSAqLworCisJICAgICpjcCsrID0gQldtYXBbKndwID4+IDhdWzBdOworICAgICAgICAgICAgcHAgKz0gMiAqIHNhbXBsZXNwZXJwaXhlbDsKKyAgICAgICAgICAgIHdwICs9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICAgICAgfQorCWNwICs9IHRvc2tldzsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisKKy8qCisgKiAxLWJpdCBiaWxldmVsID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQxYml0Ynd0aWxlKQoreworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA4OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw4KHcsIGJ3ID0gQldtYXBbKnBwKytdLCAqY3ArKyA9ICpidysrKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogMi1iaXQgZ3JleXNjYWxlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQyYml0Ynd0aWxlKQoreworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA0OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw0KHcsIGJ3ID0gQldtYXBbKnBwKytdLCAqY3ArKyA9ICpidysrKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogNC1iaXQgZ3JleXNjYWxlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQ0Yml0Ynd0aWxlKQoreworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSAyOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEwyKHcsIGJ3ID0gQldtYXBbKnBwKytdLCAqY3ArKyA9ICpidysrKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIHNhbXBsZXMsIG5vIE1hcCA9PiBSR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCY29udGlnOGJpdHRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCisgICAgKHZvaWQpIHg7ICh2b2lkKSB5OworICAgIGZyb21za2V3ICo9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICB3aGlsZSAoaC0tID4gMCkgeworCVVOUk9MTDgodywgTk9QLAorCSAgICAqY3ArKyA9IFBBQ0socHBbMF0sIHBwWzFdLCBwcFsyXSk7CisJICAgIHBwICs9IHNhbXBsZXNwZXJwaXhlbCk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IHBhY2tlZCBzYW1wbGVzID0+IFJHQkEgdy8gYXNzb2NpYXRlZCBhbHBoYQorICogKGtub3duIHRvIGhhdmUgTWFwID09IE5VTEwpCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dFJHQkFBY29udGlnOGJpdHRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCisgICAgKHZvaWQpIHg7ICh2b2lkKSB5OworICAgIGZyb21za2V3ICo9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICB3aGlsZSAoaC0tID4gMCkgeworCVVOUk9MTDgodywgTk9QLAorCSAgICAqY3ArKyA9IFBBQ0s0KHBwWzBdLCBwcFsxXSwgcHBbMl0sIHBwWzNdKTsKKwkgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyB1bmFzc29jaWF0ZWQgYWxwaGEKKyAqIChrbm93biB0byBoYXZlIE1hcCA9PSBOVUxMKQorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRSR0JVQWNvbnRpZzhiaXR0aWxlKQoreworCWludCBzYW1wbGVzcGVycGl4ZWwgPSBpbWctPnNhbXBsZXNwZXJwaXhlbDsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSBzYW1wbGVzcGVycGl4ZWw7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJdWludDMyIHIsIGcsIGIsIGE7CisJCXVpbnQ4KiBtOworCQlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCQkJYSA9IHBwWzNdOworCQkJbSA9IGltZy0+VWFUb0FhKyhhPDw4KTsKKwkJCXIgPSBtW3BwWzBdXTsKKwkJCWcgPSBtW3BwWzFdXTsKKwkJCWIgPSBtW3BwWzJdXTsKKwkJCSpjcCsrID0gUEFDSzQocixnLGIsYSk7CisJCQlwcCArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJY3AgKz0gdG9za2V3OworCQlwcCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiAxNi1iaXQgcGFja2VkIHNhbXBsZXMgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dFJHQmNvbnRpZzE2Yml0dGlsZSkKK3sKKwlpbnQgc2FtcGxlc3BlcnBpeGVsID0gaW1nLT5zYW1wbGVzcGVycGl4ZWw7CisJdWludDE2ICp3cCA9ICh1aW50MTYgKilwcDsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSBzYW1wbGVzcGVycGl4ZWw7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKKwkJCSpjcCsrID0gUEFDSyhpbWctPkJpdGRlcHRoMTZUbzhbd3BbMF1dLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFt3cFsxXV0sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84W3dwWzJdXSk7CisJCQl3cCArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJY3AgKz0gdG9za2V3OworCQl3cCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiAxNi1iaXQgcGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyBhc3NvY2lhdGVkIGFscGhhCisgKiAoa25vd24gdG8gaGF2ZSBNYXAgPT0gTlVMTCkKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCQUFjb250aWcxNmJpdHRpbGUpCit7CisJaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCXVpbnQxNiAqd3AgPSAodWludDE2ICopcHA7CisJKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQkqY3ArKyA9IFBBQ0s0KGltZy0+Qml0ZGVwdGgxNlRvOFt3cFswXV0sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84W3dwWzFdXSwKKwkJCSAgICBpbWctPkJpdGRlcHRoMTZUbzhbd3BbMl1dLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFt3cFszXV0pOworCQkJd3AgKz0gc2FtcGxlc3BlcnBpeGVsOworCQl9CisJCWNwICs9IHRvc2tldzsKKwkJd3AgKz0gZnJvbXNrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHBhY2tlZCBzYW1wbGVzID0+IFJHQkEgdy8gdW5hc3NvY2lhdGVkIGFscGhhCisgKiAoa25vd24gdG8gaGF2ZSBNYXAgPT0gTlVMTCkKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCVUFjb250aWcxNmJpdHRpbGUpCit7CisJaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCXVpbnQxNiAqd3AgPSAodWludDE2ICopcHA7CisJKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCXVpbnQzMiByLGcsYixhOworCQl1aW50OCogbTsKKwkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKKwkJCWEgPSBpbWctPkJpdGRlcHRoMTZUbzhbd3BbM11dOworCQkJbSA9IGltZy0+VWFUb0FhKyhhPDw4KTsKKwkJCXIgPSBtW2ltZy0+Qml0ZGVwdGgxNlRvOFt3cFswXV1dOworCQkJZyA9IG1baW1nLT5CaXRkZXB0aDE2VG84W3dwWzFdXV07CisJCQliID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbd3BbMl1dXTsKKwkJCSpjcCsrID0gUEFDSzQocixnLGIsYSk7CisJCQl3cCArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJY3AgKz0gdG9za2V3OworCQl3cCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgQ01ZSyBzYW1wbGVzIHcvbyBNYXAgPT4gUkdCCisgKgorICogTkI6IFRoZSBjb252ZXJzaW9uIG9mIENNWUstPlJHQiBpcyAqdmVyeSogY3J1ZGUuCisgKi8KKy8qREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCY29udGlnOGJpdENNWUt0aWxlKQoreworICAgIGludCBzYW1wbGVzcGVycGl4ZWwgPSBpbWctPnNhbXBsZXNwZXJwaXhlbDsKKyAgICB1aW50MTYgciwgZywgYiwgazsKKwkKKyAgICAodm9pZCkgeDsgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJCVVOUk9MTDgodywgTk9QLAorCSAJICAgIGsgPSAyNTUgLSBwcFszXTsKKwkgCSAgICByID0gKGsqKDI1NS1wcFswXSkpLzI1NTsKKwkgCSAgICBnID0gKGsqKDI1NS1wcFsxXSkpLzI1NTsKKwkgCSAgICBiID0gKGsqKDI1NS1wcFsyXSkpLzI1NTsKKwkJKmNwKysgPSBQQUNLKHIsIGcsIGIpOworCQlwcCArPSBzYW1wbGVzcGVycGl4ZWwpOworCQljcCArPSB0b3NrZXc7CisJCXBwICs9IGZyb21za2V3OworfSovCisvKiBNb2RpZnkgaW4gMjAwOTA3MjMgYnkgU3VubGlhbmcuTGl1ICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRSR0Jjb250aWc4Yml0Q01ZS3RpbGUpCit7CisJaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCXVpbnQ4IHIsIGcsIGIsIGs7CisKKwkodm9pZCkgeDsgKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCVVOUk9MTDgodywgTk9QLAorCQkJaWYoIVRJRkZDbXlrMlJnYihpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEscHBbMF0scHBbMV0scHBbMl0scHBbM10sCisJCQkJJnIsJmcsJmIpKXsKKwkJCQkJayA9IDI1NSAtIHBwWzNdOworCQkJCQlyID0gKGsqKDI1NS1wcFswXSkpLzI1NTsKKwkJCQkJZyA9IChrKigyNTUtcHBbMV0pKS8yNTU7CisJCQkJCWIgPSAoayooMjU1LXBwWzJdKSkvMjU1OworCQkJfQorCisJCQkqY3ArKyA9IFBBQ0sociwgZywgYik7CisJCQlwcCArPSBzYW1wbGVzcGVycGl4ZWwpOworCQkJY3AgKz0gdG9za2V3OworCQkJcHAgKz0gZnJvbXNrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHBhY2tlZCBDTVlLIHNhbXBsZXMgdy9vIE1hcCA9PiBSR0IoOC1iaXQpCisgKgorICogTkI6IFRoZSBjb252ZXJzaW9uIG9mIENNWUstPlJHQiBpcyAqdmVyeSogY3J1ZGUuCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dFJHQmNvbnRpZzE2Yml0Q01ZS3RpbGUpCit7CisJaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCXVpbnQxNiogd3AgPSAodWludDE2KilwcDsKKwl1aW50OCBDLCBNLCBZLCBLOworCXVpbnQ4IHIsIGcsIGI7CisKKwkodm9pZCkgeDsgKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCVVOUk9MTDgodywgTk9QLAorCQkJQyA9IHdwWzBdPj44O00gPSB3cFsxXT4+ODtZID0gd3BbMl0+Pjg7SyA9IHdwWzNdPj44OworCQlpZighVElGRkNteWsyUmdiKGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSxDLE0sWSxLLAorCQkJJnIsJmcsJmIpKXsKKwkJCQlLID0gMjU1IC0gSzsKKwkJCQlyID0gKEsqKDI1NS1DKSkvMjU1OworCQkJCWcgPSAoSyooMjU1LU0pKS8yNTU7CisJCQkJYiA9IChLKigyNTUtWSkpLzI1NTsKKwkJfQorCisJCSpjcCsrID0gUEFDSyhyLCBnLCBiKTsKKwkJd3AgKz0gc2FtcGxlc3BlcnBpeGVsKTsKKwkJY3AgKz0gdG9za2V3OworCQl3cCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgQ01ZSyBzYW1wbGVzIHcvTWFwID0+IFJHQgorICoKKyAqIE5COiBUaGUgY29udmVyc2lvbiBvZiBDTVlLLT5SR0IgaXMgKnZlcnkqIGNydWRlLgorICovCisvKgorREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCY29udGlnOGJpdENNWUtNYXB0aWxlKQoreworICAgIGludCBzYW1wbGVzcGVycGl4ZWwgPSBpbWctPnNhbXBsZXNwZXJwaXhlbDsKKyAgICBUSUZGUkdCVmFsdWUqIE1hcCA9IGltZy0+TWFwOworICAgIHVpbnQxNiByLCBnLCBiLCBrOworCisgICAgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKKwkgICAgayA9IDI1NSAtIHBwWzNdOworCSAgICByID0gKGsqKDI1NS1wcFswXSkpLzI1NTsKKwkgICAgZyA9IChrKigyNTUtcHBbMV0pKS8yNTU7CisJICAgIGIgPSAoayooMjU1LXBwWzJdKSkvMjU1OworCSAgICAqY3ArKyA9IFBBQ0soTWFwW3JdLCBNYXBbZ10sIE1hcFtiXSk7CisJICAgIHBwICs9IHNhbXBsZXNwZXJwaXhlbDsKKwl9CisJcHAgKz0gZnJvbXNrZXc7CisJY3AgKz0gdG9za2V3OworICAgIH0KK30qLworLyogTW9kaWZ5IGluIDIwMDkwNzIzIGJ5IFN1bmxpYW5nLkxpdSAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCY29udGlnOGJpdENNWUtNYXB0aWxlKQoreworCWludCBzYW1wbGVzcGVycGl4ZWwgPSBpbWctPnNhbXBsZXNwZXJwaXhlbDsKKwlUSUZGUkdCVmFsdWUqIE1hcCA9IGltZy0+TWFwOworCXVpbnQ4IHIsIGcsIGIsIGs7CisKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSBzYW1wbGVzcGVycGl4ZWw7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKKwkJCWlmKCFUSUZGQ215azJSZ2IoaW1nLT50aWYtPnRpZl9jbGllbnRkYXRhLHBwWzBdLHBwWzFdLHBwWzJdLHBwWzNdLAorCQkJCSZyLCZnLCZiKSl7CisJCQkJCWsgPSAyNTUgLSBwcFszXTsKKwkJCQkJciA9IChrKigyNTUtcHBbMF0pKS8yNTU7CisJCQkJCWcgPSAoayooMjU1LXBwWzFdKSkvMjU1OworCQkJCQliID0gKGsqKDI1NS1wcFsyXSkpLzI1NTsKKwkJCX0KKwkJCSpjcCsrID0gUEFDSyhNYXBbcl0sIE1hcFtnXSwgTWFwW2JdKTsKKwkJCXBwICs9IHNhbXBsZXNwZXJwaXhlbDsKKwkJfQorCQlwcCArPSBmcm9tc2tldzsKKwkJY3AgKz0gdG9za2V3OworCX0KK30KKworLyoKKyAqIDE2LWJpdCBwYWNrZWQgQ01ZSyBzYW1wbGVzIHcvTWFwID0+IFJHQig4LWJpdCkKKyAqCisgKiBOQjogVGhlIGNvbnZlcnNpb24gb2YgQ01ZSy0+UkdCIGlzICp2ZXJ5KiBjcnVkZS4KKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCY29udGlnMTZiaXRDTVlLTWFwdGlsZSkKK3sKKwlpbnQgc2FtcGxlc3BlcnBpeGVsID0gaW1nLT5zYW1wbGVzcGVycGl4ZWw7CisJVElGRlJHQlZhbHVlKiBNYXAgPSBpbWctPk1hcDsKKwl1aW50MTYqIHdwID0gKHVpbnQxNiopcHA7CisJdWludDggQywgTSwgWSwgSzsKKwl1aW50OCByLCBnLCBiOworCisJKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQlDID0gd3BbMF0+Pjg7TSA9IHdwWzFdPj44O1kgPSB3cFsyXT4+ODtLID0gd3BbM10+Pjg7CisJCQlpZighVElGRkNteWsyUmdiKGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSxDLE0sWSxLLAorCQkJCSZyLCZnLCZiKSl7CisJCQkJCUsgPSAyNTUgLSBLOworCQkJCQlyID0gKEsqKDI1NS1DKSkvMjU1OworCQkJCQlnID0gKEsqKDI1NS1NKSkvMjU1OworCQkJCQliID0gKEsqKDI1NS1ZKSkvMjU1OworCQkJfQorCQkJKmNwKysgPSBQQUNLKE1hcFtyXSwgTWFwW2ddLCBNYXBbYl0pOworCQkJd3AgKz0gc2FtcGxlc3BlcnBpeGVsOworCQl9CisJCXdwICs9IGZyb21za2V3OworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisjZGVmaW5lCURFQ0xBUkVTZXBQdXRGdW5jKG5hbWUpIFwKK3N0YXRpYyB2b2lkIG5hbWUoXAorICAgIFRJRkZSR0JBSW1hZ2UqIGltZyxcCisgICAgdWludDMyKiBjcCxcCisgICAgdWludDMyIHgsIHVpbnQzMiB5LCBcCisgICAgdWludDMyIHcsIHVpbnQzMiBoLFwKKyAgICBpbnQzMiBmcm9tc2tldywgaW50MzIgdG9za2V3LFwKKyAgICB1bnNpZ25lZCBjaGFyKiByLCB1bnNpZ25lZCBjaGFyKiBnLCB1bnNpZ25lZCBjaGFyKiBiLCB1bnNpZ25lZCBjaGFyKiBhXAorKQorCisvKgorICogOC1iaXQgdW5wYWNrZWQgc2FtcGxlcyA9PiBSR0IKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0UkdCc2VwYXJhdGU4Yml0dGlsZSkKK3sKKyAgICAodm9pZCkgaW1nOyAodm9pZCkgeDsgKHZvaWQpIHk7ICh2b2lkKSBhOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJVU5ST0xMOCh3LCBOT1AsICpjcCsrID0gUEFDSygqcisrLCAqZysrLCAqYisrKSk7CisJU0tFVyhyLCBnLCBiLCBmcm9tc2tldyk7CisJY3AgKz0gdG9za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyBhc3NvY2lhdGVkIGFscGhhCisgKi8KK0RFQ0xBUkVTZXBQdXRGdW5jKHB1dFJHQkFBc2VwYXJhdGU4Yml0dGlsZSkKK3sKKwkodm9pZCkgaW1nOyAodm9pZCkgeDsgKHZvaWQpIHk7IAorCXdoaWxlIChoLS0gPiAwKSB7CisJCVVOUk9MTDgodywgTk9QLCAqY3ArKyA9IFBBQ0s0KCpyKyssICpnKyssICpiKyssICphKyspKTsKKwkJU0tFVzQociwgZywgYiwgYSwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogOC1iaXQgdW5wYWNrZWQgQ01ZSyBzYW1wbGVzID0+IFJHQkEKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0Q01ZS3NlcGFyYXRlOGJpdHRpbGUpCit7CisJKHZvaWQpIGltZzsgKHZvaWQpIHk7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJdWludDMyIHJ2LCBndiwgYnYsIGt2OworCQlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCQkJa3YgPSAyNTUgLSAqYSsrOworCQkJcnYgPSAoa3YqKDI1NS0qcisrKSkvMjU1OworCQkJZ3YgPSAoa3YqKDI1NS0qZysrKSkvMjU1OworCQkJYnYgPSAoa3YqKDI1NS0qYisrKSkvMjU1OworCQkJKmNwKysgPSBQQUNLNChydixndixidiwyNTUpOworCQl9CisJCVNLRVc0KHIsIGcsIGIsIGEsIGZyb21za2V3KTsKKwkJY3AgKz0gdG9za2V3OworCX0KK30KKworLyoKKyAqIDgtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyB1bmFzc29jaWF0ZWQgYWxwaGEKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0UkdCVUFzZXBhcmF0ZThiaXR0aWxlKQoreworCSh2b2lkKSBpbWc7ICh2b2lkKSB5OworCXdoaWxlIChoLS0gPiAwKSB7CisJCXVpbnQzMiBydiwgZ3YsIGJ2LCBhdjsKKwkJdWludDgqIG07CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQlhdiA9ICphKys7CisJCQltID0gaW1nLT5VYVRvQWErKGF2PDw4KTsKKwkJCXJ2ID0gbVsqcisrXTsKKwkJCWd2ID0gbVsqZysrXTsKKwkJCWJ2ID0gbVsqYisrXTsKKwkJCSpjcCsrID0gUEFDSzQocnYsZ3YsYnYsYXYpOworCQl9CisJCVNLRVc0KHIsIGcsIGIsIGEsIGZyb21za2V3KTsKKwkJY3AgKz0gdG9za2V3OworCX0KK30KKworLyoKKyAqIDE2LWJpdCB1bnBhY2tlZCBzYW1wbGVzID0+IFJHQgorICovCitERUNMQVJFU2VwUHV0RnVuYyhwdXRSR0JzZXBhcmF0ZTE2Yml0dGlsZSkKK3sKKwl1aW50MTYgKndyID0gKHVpbnQxNiopIHI7CisJdWludDE2ICp3ZyA9ICh1aW50MTYqKSBnOworCXVpbnQxNiAqd2IgPSAodWludDE2KikgYjsKKwkodm9pZCkgaW1nOyAodm9pZCkgeTsgKHZvaWQpIGE7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKwkJCSpjcCsrID0gUEFDSyhpbWctPkJpdGRlcHRoMTZUbzhbKndyKytdLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFsqd2crK10sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84Wyp3YisrXSk7CisJCVNLRVcod3IsIHdnLCB3YiwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyBhc3NvY2lhdGVkIGFscGhhCisgKi8KK0RFQ0xBUkVTZXBQdXRGdW5jKHB1dFJHQkFBc2VwYXJhdGUxNmJpdHRpbGUpCit7CisJdWludDE2ICp3ciA9ICh1aW50MTYqKSByOworCXVpbnQxNiAqd2cgPSAodWludDE2KikgZzsKKwl1aW50MTYgKndiID0gKHVpbnQxNiopIGI7CisJdWludDE2ICp3YSA9ICh1aW50MTYqKSBhOworCSh2b2lkKSBpbWc7ICh2b2lkKSB5OworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IDA7IHggPCB3OyB4KyspCisJCQkqY3ArKyA9IFBBQ0s0KGltZy0+Qml0ZGVwdGgxNlRvOFsqd3IrK10sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84Wyp3ZysrXSwKKwkJCSAgICBpbWctPkJpdGRlcHRoMTZUbzhbKndiKytdLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFsqd2ErK10pOworCQlTS0VXNCh3ciwgd2csIHdiLCB3YSwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyB1bmFzc29jaWF0ZWQgYWxwaGEKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0UkdCVUFzZXBhcmF0ZTE2Yml0dGlsZSkKK3sKKwl1aW50MTYgKndyID0gKHVpbnQxNiopIHI7CisJdWludDE2ICp3ZyA9ICh1aW50MTYqKSBnOworCXVpbnQxNiAqd2IgPSAodWludDE2KikgYjsKKwl1aW50MTYgKndhID0gKHVpbnQxNiopIGE7CisJKHZvaWQpIGltZzsgKHZvaWQpIHk7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJdWludDMyIHIsZyxiLGE7CisJCXVpbnQ4KiBtOworCQlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCQkJYSA9IGltZy0+Qml0ZGVwdGgxNlRvOFsqd2ErK107CisJCQltID0gaW1nLT5VYVRvQWErKGE8PDgpOworCQkJciA9IG1baW1nLT5CaXRkZXB0aDE2VG84Wyp3cisrXV07CisJCQlnID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbKndnKytdXTsKKwkJCWIgPSBtW2ltZy0+Qml0ZGVwdGgxNlRvOFsqd2IrK11dOworCQkJKmNwKysgPSBQQUNLNChyLGcsYixhKTsKKwkJfQorCQlTS0VXNCh3ciwgd2csIHdiLCB3YSwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIENJRSBMKmEqYiAxOTc2IHNhbXBsZXMgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRDSUVMYWIpCit7CisJZmxvYXQgWCwgWSwgWjsKKwl1aW50MzIgciwgZywgYjsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSAzOworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQlUSUZGQ0lFTGFiVG9YWVooaW1nLT5jaWVsYWIsCisJCQkJCSh1bnNpZ25lZCBjaGFyKXBwWzBdLAorCQkJCQkoc2lnbmVkIGNoYXIpcHBbMV0sCisJCQkJCShzaWduZWQgY2hhcilwcFsyXSwKKwkJCQkJJlgsICZZLCAmWik7CisJCQlUSUZGWFlaVG9SR0IoaW1nLT5jaWVsYWIsIFgsIFksIFosICZyLCAmZywgJmIpOworCQkJKmNwKysgPSBQQUNLKHIsIGcsIGIpOworCQkJcHAgKz0gMzsKKwkJfQorCQljcCArPSB0b3NrZXc7CisJCXBwICs9IGZyb21za2V3OworCX0KK30KKworLyoKKyAqIFlDYkNyIC0+IFJHQiBjb252ZXJzaW9uIGFuZCBwYWNraW5nIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUJWUNiQ3J0b1JHQihkc3QsIFkpIHsJCQkJCQlcCisJdWludDMyIHIsIGcsIGI7CQkJCQkJCVwKKwlUSUZGWUNiQ3J0b1JHQihpbWctPnljYmNyLCAoWSksIENiLCBDciwgJnIsICZnLCAmYik7CQlcCisJZHN0ID0gUEFDSyhyLCBnLCBiKTsJCQkJCQlcCit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyA9PiBSR0IgCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGdlbmVyaWMgZm9yIGRpZmZlcmVudCBzYW1wbGluZyBzaXplcywgCisgKiBhbmQgY2FuIGhhbmRsZSBibG9ja3Mgc2l6ZXMgdGhhdCBhcmVuJ3QgbXVsdGlwbGVzIG9mIHRoZQorICogc2FtcGxpbmcgc2l6ZS4gIEhvd2V2ZXIsIGl0IGlzIHN1YnN0YW50aWFsbHkgbGVzcyBvcHRpbWl6ZWQKKyAqIHRoYW4gdGhlIHNwZWNpZmljIHNhbXBsaW5nIGNhc2VzLiAgSXQgaXMgdXNlZCBhcyBhIGZhbGxiYWNrCisgKiBmb3IgZGlmZmljdWx0IGJsb2Nrcy4KKyAqLworI2lmZGVmIG5vdGRlZgorc3RhdGljIHZvaWQgcHV0Y29udGlnOGJpdFlDYkNyR2VuZXJpY1RpbGUoIAorICAgIFRJRkZSR0JBSW1hZ2UqIGltZywgCisgICAgdWludDMyKiBjcCwgCisgICAgdWludDMyIHgsIHVpbnQzMiB5LCAKKyAgICB1aW50MzIgdywgdWludDMyIGgsIAorICAgIGludDMyIGZyb21za2V3LCBpbnQzMiB0b3NrZXcsIAorICAgIHVuc2lnbmVkIGNoYXIqIHBwLAorICAgIGludCBoX2dyb3VwLCAKKyAgICBpbnQgdl9ncm91cCApCisKK3sKKyAgICB1aW50MzIqIGNwMSA9IGNwK3crdG9za2V3OworICAgIHVpbnQzMiogY3AyID0gY3AxK3crdG9za2V3OworICAgIHVpbnQzMiogY3AzID0gY3AyK3crdG9za2V3OworICAgIGludDMyIGluY3IgPSAzKncrNCp0b3NrZXc7CisgICAgaW50MzIgICBDYiwgQ3I7CisgICAgaW50ICAgICBncm91cF9zaXplID0gdl9ncm91cCAqIGhfZ3JvdXAgKyAyOworCisgICAgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgPSAoZnJvbXNrZXcgKiBncm91cF9zaXplKSAvIGhfZ3JvdXA7CisKKyAgICBmb3IoIHl5ID0gMDsgeXkgPCBoOyB5eSsrICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwX2xpbmU7CisgICAgICAgIGludCAgICAgeV9saW5lX2dyb3VwID0geXkgLyB2X2dyb3VwOworICAgICAgICBpbnQgICAgIHlfcmVtYWluZGVyID0geXkgLSB5X2xpbmVfZ3JvdXAgKiB2X2dyb3VwOworCisgICAgICAgIHBwX2xpbmUgPSBwcCArIHZfbGluZV9ncm91cCAqIAorCisgICAgICAgIAorICAgICAgICBmb3IoIHh4ID0gMDsgeHggPCB3OyB4eCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2IgPSBwcAorICAgICAgICB9CisgICAgfQorICAgIGZvciAoOyBoID49IDQ7IGggLT0gNCkgeworCXggPSB3Pj4yOworCWRvIHsKKwkgICAgQ2IgPSBwcFsxNl07CisJICAgIENyID0gcHBbMTddOworCisJICAgIFlDYkNydG9SR0IoY3AgWzBdLCBwcFsgMF0pOworCSAgICBZQ2JDcnRvUkdCKGNwIFsxXSwgcHBbIDFdKTsKKwkgICAgWUNiQ3J0b1JHQihjcCBbMl0sIHBwWyAyXSk7CisJICAgIFlDYkNydG9SR0IoY3AgWzNdLCBwcFsgM10pOworCSAgICBZQ2JDcnRvUkdCKGNwMVswXSwgcHBbIDRdKTsKKwkgICAgWUNiQ3J0b1JHQihjcDFbMV0sIHBwWyA1XSk7CisJICAgIFlDYkNydG9SR0IoY3AxWzJdLCBwcFsgNl0pOworCSAgICBZQ2JDcnRvUkdCKGNwMVszXSwgcHBbIDddKTsKKwkgICAgWUNiQ3J0b1JHQihjcDJbMF0sIHBwWyA4XSk7CisJICAgIFlDYkNydG9SR0IoY3AyWzFdLCBwcFsgOV0pOworCSAgICBZQ2JDcnRvUkdCKGNwMlsyXSwgcHBbMTBdKTsKKwkgICAgWUNiQ3J0b1JHQihjcDJbM10sIHBwWzExXSk7CisJICAgIFlDYkNydG9SR0IoY3AzWzBdLCBwcFsxMl0pOworCSAgICBZQ2JDcnRvUkdCKGNwM1sxXSwgcHBbMTNdKTsKKwkgICAgWUNiQ3J0b1JHQihjcDNbMl0sIHBwWzE0XSk7CisJICAgIFlDYkNydG9SR0IoY3AzWzNdLCBwcFsxNV0pOworCisJICAgIGNwICs9IDQsIGNwMSArPSA0LCBjcDIgKz0gNCwgY3AzICs9IDQ7CisJICAgIHBwICs9IDE4OworCX0gd2hpbGUgKC0teCk7CisJY3AgKz0gaW5jciwgY3AxICs9IGluY3IsIGNwMiArPSBpbmNyLCBjcDMgKz0gaW5jcjsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIDgtYml0IHBhY2tlZCBZQ2JDciBzYW1wbGVzIHcvIDQsNCBzdWJzYW1wbGluZyA9PiBSR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0Y29udGlnOGJpdFlDYkNyNDR0aWxlKQoreworICAgIHVpbnQzMiogY3AxID0gY3Ardyt0b3NrZXc7CisgICAgdWludDMyKiBjcDIgPSBjcDErdyt0b3NrZXc7CisgICAgdWludDMyKiBjcDMgPSBjcDIrdyt0b3NrZXc7CisgICAgaW50MzIgaW5jciA9IDMqdys0KnRvc2tldzsKKworICAgICh2b2lkKSB5OworICAgIC8qIGFkanVzdCBmcm9tc2tldyAqLworICAgIGZyb21za2V3ID0gKGZyb21za2V3ICogMTgpIC8gNDsKKyAgICBpZiAoKGggJiAzKSA9PSAwICYmICh3ICYgMykgPT0gMCkgewkJCQkgICAgICAgIAorICAgICAgICBmb3IgKDsgaCA+PSA0OyBoIC09IDQpIHsKKyAgICAgICAgICAgIHggPSB3Pj4yOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDMyIENiID0gcHBbMTZdOworICAgICAgICAgICAgICAgIGludDMyIENyID0gcHBbMTddOworCisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMF0sIHBwWyAwXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWyAxXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMl0sIHBwWyAyXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbM10sIHBwWyAzXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMF0sIHBwWyA0XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMV0sIHBwWyA1XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMl0sIHBwWyA2XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbM10sIHBwWyA3XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbMF0sIHBwWyA4XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbMV0sIHBwWyA5XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbMl0sIHBwWzEwXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbM10sIHBwWzExXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbMF0sIHBwWzEyXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbMV0sIHBwWzEzXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbMl0sIHBwWzE0XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbM10sIHBwWzE1XSk7CisKKyAgICAgICAgICAgICAgICBjcCArPSA0LCBjcDEgKz0gNCwgY3AyICs9IDQsIGNwMyArPSA0OworICAgICAgICAgICAgICAgIHBwICs9IDE4OworICAgICAgICAgICAgfSB3aGlsZSAoLS14KTsKKyAgICAgICAgICAgIGNwICs9IGluY3IsIGNwMSArPSBpbmNyLCBjcDIgKz0gaW5jciwgY3AzICs9IGluY3I7CisgICAgICAgICAgICBwcCArPSBmcm9tc2tldzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChoID4gMCkgeworICAgICAgICAgICAgZm9yICh4ID0gdzsgeCA+IDA7KSB7CisgICAgICAgICAgICAgICAgaW50MzIgQ2IgPSBwcFsxNl07CisgICAgICAgICAgICAgICAgaW50MzIgQ3IgPSBwcFsxN107CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AzWzNdLCBwcFsxNV0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICBZQ2JDcnRvUkdCKGNwMlszXSwgcHBbMTFdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgWUNiQ3J0b1JHQihjcDFbM10sIHBwWyA3XSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogIFlDYkNydG9SR0IoY3AgWzNdLCBwcFsgM10pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBZQ2JDcnRvUkdCKGNwM1syXSwgcHBbMTRdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgWUNiQ3J0b1JHQihjcDJbMl0sIHBwWzEwXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogIFlDYkNydG9SR0IoY3AxWzJdLCBwcFsgNl0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICBZQ2JDcnRvUkdCKGNwIFsyXSwgcHBbIDJdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogWUNiQ3J0b1JHQihjcDNbMV0sIHBwWzEzXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogIFlDYkNydG9SR0IoY3AyWzFdLCBwcFsgOV0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICBZQ2JDcnRvUkdCKGNwMVsxXSwgcHBbIDVdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWyAxXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AzWzBdLCBwcFsxMl0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICBZQ2JDcnRvUkdCKGNwMlswXSwgcHBbIDhdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgWUNiQ3J0b1JHQihjcDFbMF0sIHBwWyA0XSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogIFlDYkNydG9SR0IoY3AgWzBdLCBwcFsgMF0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHggPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGNwICs9IHg7IGNwMSArPSB4OyBjcDIgKz0geDsgY3AzICs9IHg7CisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3AgKz0gNDsgY3AxICs9IDQ7IGNwMiArPSA0OyBjcDMgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgeCAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcCArPSAxODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoIDw9IDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBoIC09IDQ7CisgICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jciwgY3AyICs9IGluY3IsIGNwMyArPSBpbmNyOworICAgICAgICAgICAgcHAgKz0gZnJvbXNrZXc7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyB3LyA0LDIgc3Vic2FtcGxpbmcgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRZQ2JDcjQydGlsZSkKK3sKKyAgICB1aW50MzIqIGNwMSA9IGNwK3crdG9za2V3OworICAgIGludDMyIGluY3IgPSAyKnRvc2tldyt3OworCisgICAgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgPSAoZnJvbXNrZXcgKiAxMCkgLyA0OworICAgIGlmICgoaCAmIDMpID09IDAgJiYgKHcgJiAxKSA9PSAwKSB7CisgICAgICAgIGZvciAoOyBoID49IDI7IGggLT0gMikgeworICAgICAgICAgICAgeCA9IHc+PjI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50MzIgQ2IgPSBwcFs4XTsKKyAgICAgICAgICAgICAgICBpbnQzMiBDciA9IHBwWzldOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFlDYkNydG9SR0IoY3AgWzBdLCBwcFswXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWzFdKTsKKyAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwIFsyXSwgcHBbMl0pOworICAgICAgICAgICAgICAgIFlDYkNydG9SR0IoY3AgWzNdLCBwcFszXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMF0sIHBwWzRdKTsKKyAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwMVsxXSwgcHBbNV0pOworICAgICAgICAgICAgICAgIFlDYkNydG9SR0IoY3AxWzJdLCBwcFs2XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbM10sIHBwWzddKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjcCArPSA0LCBjcDEgKz0gNDsKKyAgICAgICAgICAgICAgICBwcCArPSAxMDsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0teCk7CisgICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jcjsKKyAgICAgICAgICAgIHBwICs9IGZyb21za2V3OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKHggPSB3OyB4ID4gMDspIHsKKyAgICAgICAgICAgICAgICBpbnQzMiBDYiA9IHBwWzhdOworICAgICAgICAgICAgICAgIGludDMyIENyID0gcHBbOV07CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AxWzNdLCBwcFsgN10pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICBZQ2JDcnRvUkdCKGNwIFszXSwgcHBbIDNdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogWUNiQ3J0b1JHQihjcDFbMl0sIHBwWyA2XSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogIFlDYkNydG9SR0IoY3AgWzJdLCBwcFsgMl0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBZQ2JDcnRvUkdCKGNwMVsxXSwgcHBbIDVdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWyAxXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AxWzBdLCBwcFsgNF0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICBZQ2JDcnRvUkdCKGNwIFswXSwgcHBbIDBdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4IDwgNCkgeworICAgICAgICAgICAgICAgICAgICBjcCArPSB4OyBjcDEgKz0geDsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcCArPSA0OyBjcDEgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgeCAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoIDw9IDIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBoIC09IDI7CisgICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jcjsKKyAgICAgICAgICAgIHBwICs9IGZyb21za2V3OworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIFlDYkNyIHNhbXBsZXMgdy8gNCwxIHN1YnNhbXBsaW5nID0+IFJHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRjb250aWc4Yml0WUNiQ3I0MXRpbGUpCit7CisgICAgKHZvaWQpIHk7CisgICAgLyogWFhYIGFkanVzdCBmcm9tc2tldyAqLworICAgIGRvIHsKKwl4ID0gdz4+MjsKKwlkbyB7CisJICAgIGludDMyIENiID0gcHBbNF07CisJICAgIGludDMyIENyID0gcHBbNV07CisKKwkgICAgWUNiQ3J0b1JHQihjcCBbMF0sIHBwWzBdKTsKKwkgICAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWzFdKTsKKwkgICAgWUNiQ3J0b1JHQihjcCBbMl0sIHBwWzJdKTsKKwkgICAgWUNiQ3J0b1JHQihjcCBbM10sIHBwWzNdKTsKKworCSAgICBjcCArPSA0OworCSAgICBwcCArPSA2OworCX0gd2hpbGUgKC0teCk7CisKKyAgICAgICAgaWYoICh3JjMpICE9IDAgKQorICAgICAgICB7CisJICAgIGludDMyIENiID0gcHBbNF07CisJICAgIGludDMyIENyID0gcHBbNV07CisKKyAgICAgICAgICAgIHN3aXRjaCggKHcmMykgKSB7CisgICAgICAgICAgICAgIGNhc2UgMzogWUNiQ3J0b1JHQihjcCBbMl0sIHBwWzJdKTsKKyAgICAgICAgICAgICAgY2FzZSAyOiBZQ2JDcnRvUkdCKGNwIFsxXSwgcHBbMV0pOworICAgICAgICAgICAgICBjYXNlIDE6IFlDYkNydG9SR0IoY3AgWzBdLCBwcFswXSk7CisgICAgICAgICAgICAgIGNhc2UgMDogYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNwICs9ICh3JjMpOworICAgICAgICAgICAgcHAgKz0gNjsKKyAgICAgICAgfQorCisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0gd2hpbGUgKC0taCk7CisKK30KKworLyoKKyAqIDgtYml0IHBhY2tlZCBZQ2JDciBzYW1wbGVzIHcvIDIsMiBzdWJzYW1wbGluZyA9PiBSR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0Y29udGlnOGJpdFlDYkNyMjJ0aWxlKQoreworCXVpbnQzMiogY3AyOworCWludDMyIGluY3IgPSAyKnRvc2tldyt3OworCSh2b2lkKSB5OworCWZyb21za2V3ID0gKGZyb21za2V3IC8gMikgKiA2OworCWNwMiA9IGNwK3crdG9za2V3OworCXdoaWxlIChoPj0yKSB7CisJCXggPSB3OworCQl3aGlsZSAoeD49MikgeworCQkJdWludDMyIENiID0gcHBbNF07CisJCQl1aW50MzIgQ3IgPSBwcFs1XTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3BbMV0sIHBwWzFdKTsKKwkJCVlDYkNydG9SR0IoY3AyWzBdLCBwcFsyXSk7CisJCQlZQ2JDcnRvUkdCKGNwMlsxXSwgcHBbM10pOworCQkJY3AgKz0gMjsKKwkJCWNwMiArPSAyOworCQkJcHAgKz0gNjsKKwkJCXggLT0gMjsKKwkJfQorCQlpZiAoeD09MSkgeworCQkJdWludDMyIENiID0gcHBbNF07CisJCQl1aW50MzIgQ3IgPSBwcFs1XTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3AyWzBdLCBwcFsyXSk7CisJCQljcCArKyA7CisJCQljcDIgKysgOworCQkJcHAgKz0gNjsKKwkJfQorCQljcCArPSBpbmNyOworCQljcDIgKz0gaW5jcjsKKwkJcHAgKz0gZnJvbXNrZXc7CisJCWgtPTI7CisJfQorCWlmIChoPT0xKSB7CisJCXggPSB3OworCQl3aGlsZSAoeD49MikgeworCQkJdWludDMyIENiID0gcHBbNF07CisJCQl1aW50MzIgQ3IgPSBwcFs1XTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3BbMV0sIHBwWzFdKTsKKwkJCWNwICs9IDI7CisJCQljcDIgKz0gMjsKKwkJCXBwICs9IDY7CisJCQl4IC09IDI7CisJCX0KKwkJaWYgKHg9PTEpIHsKKwkJCXVpbnQzMiBDYiA9IHBwWzRdOworCQkJdWludDMyIENyID0gcHBbNV07CisJCQlZQ2JDcnRvUkdCKGNwWzBdLCBwcFswXSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyB3LyAyLDEgc3Vic2FtcGxpbmcgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRZQ2JDcjIxdGlsZSkKK3sKKwkodm9pZCkgeTsKKwlmcm9tc2tldyA9IChmcm9tc2tldyAqIDQpIC8gMjsKKwlkbyB7CisJCXggPSB3Pj4xOworCQlkbyB7CisJCQlpbnQzMiBDYiA9IHBwWzJdOworCQkJaW50MzIgQ3IgPSBwcFszXTsKKworCQkJWUNiQ3J0b1JHQihjcFswXSwgcHBbMF0pOworCQkJWUNiQ3J0b1JHQihjcFsxXSwgcHBbMV0pOworCisJCQljcCArPSAyOworCQkJcHAgKz0gNDsKKwkJfSB3aGlsZSAoLS14KTsKKworCQlpZiggKHcmMSkgIT0gMCApCisJCXsKKwkJCWludDMyIENiID0gcHBbMl07CisJCQlpbnQzMiBDciA9IHBwWzNdOworCisJCQlZQ2JDcnRvUkdCKGNwWzBdLCBwcFswXSk7CisKKwkJCWNwICs9IDE7CisJCQlwcCArPSA0OworCQl9CisKKwkJY3AgKz0gdG9za2V3OworCQlwcCArPSBmcm9tc2tldzsKKwl9IHdoaWxlICgtLWgpOworfQorCisvKgorICogOC1iaXQgcGFja2VkIFlDYkNyIHNhbXBsZXMgdy8gMSwyIHN1YnNhbXBsaW5nID0+IFJHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRjb250aWc4Yml0WUNiQ3IxMnRpbGUpCit7CisJdWludDMyKiBjcDI7CisJaW50MzIgaW5jciA9IDIqdG9za2V3K3c7CisJKHZvaWQpIHk7CisJZnJvbXNrZXcgPSAoZnJvbXNrZXcgLyAyKSAqIDQ7CisJY3AyID0gY3Ardyt0b3NrZXc7CisJd2hpbGUgKGg+PTIpIHsKKwkJeCA9IHc7CisJCWRvIHsKKwkJCXVpbnQzMiBDYiA9IHBwWzJdOworCQkJdWludDMyIENyID0gcHBbM107CisJCQlZQ2JDcnRvUkdCKGNwWzBdLCBwcFswXSk7CisJCQlZQ2JDcnRvUkdCKGNwMlswXSwgcHBbMV0pOworCQkJY3AgKys7CisJCQljcDIgKys7CisJCQlwcCArPSA0OworCQl9IHdoaWxlICgtLXgpOworCQljcCArPSBpbmNyOworCQljcDIgKz0gaW5jcjsKKwkJcHAgKz0gZnJvbXNrZXc7CisJCWgtPTI7CisJfQorCWlmIChoPT0xKSB7CisJCXggPSB3OworCQlkbyB7CisJCQl1aW50MzIgQ2IgPSBwcFsyXTsKKwkJCXVpbnQzMiBDciA9IHBwWzNdOworCQkJWUNiQ3J0b1JHQihjcFswXSwgcHBbMF0pOworCQkJY3AgKys7CisJCQlwcCArPSA0OworCQl9IHdoaWxlICgtLXgpOworCX0KK30KKworLyoKKyAqIDgtYml0IHBhY2tlZCBZQ2JDciBzYW1wbGVzIHcvIG5vIHN1YnNhbXBsaW5nID0+IFJHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRjb250aWc4Yml0WUNiQ3IxMXRpbGUpCit7CisJKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gMzsKKwlkbyB7CisJCXggPSB3OyAvKiB3YXMgeCA9IHc+PjE7IHBhdGNoZWQgMjAwMC8wOS8yNSB3YXJtZXJkYUBob21lLmNvbSAqLworCQlkbyB7CisJCQlpbnQzMiBDYiA9IHBwWzFdOworCQkJaW50MzIgQ3IgPSBwcFsyXTsKKworCQkJWUNiQ3J0b1JHQigqY3ArKywgcHBbMF0pOworCisJCQlwcCArPSAzOworCQl9IHdoaWxlICgtLXgpOworCQljcCArPSB0b3NrZXc7CisJCXBwICs9IGZyb21za2V3OworCX0gd2hpbGUgKC0taCk7Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyB3LyBubyBzdWJzYW1wbGluZyA9PiBSR0IKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0c2VwYXJhdGU4Yml0WUNiQ3IxMXRpbGUpCit7CisJKHZvaWQpIHk7CisJKHZvaWQpIGE7CisJLyogVE9ETzogbmFtaW5nIG9mIGlucHV0IHZhcnMgaXMgc3RpbGwgb2ZmLCBjaGFuZ2Ugb2JmdXNjYXRpbmcgZGVjbGFyYXRpb24gaW5zaWRlIGRlZmluZSwgb3IgcmVzb2x2ZSBvYmZ1c2NhdGlvbiAqLworCXdoaWxlIChoLS0gPiAwKSB7CisJCXggPSB3OworCQlkbyB7CisJCQl1aW50MzIgZHIsIGRnLCBkYjsKKwkJCVRJRkZZQ2JDcnRvUkdCKGltZy0+eWNiY3IsKnIrKywqZysrLCpiKyssJmRyLCZkZywmZGIpOworCQkJKmNwKysgPSBQQUNLKGRyLGRnLGRiKTsKKwkJfSB3aGlsZSAoLS14KTsKKwkJU0tFVyhyLCBnLCBiLCBmcm9tc2tldyk7CisJCWNwICs9IHRvc2tldzsKKwl9Cit9CisjdW5kZWYgWUNiQ3J0b1JHQgorCitzdGF0aWMgaW50Citpbml0WUNiQ3JDb252ZXJzaW9uKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJpbml0WUNiQ3JDb252ZXJzaW9uIjsKKworCWZsb2F0ICpsdW1hLCAqcmVmQmxhY2tXaGl0ZTsKKworCWlmIChpbWctPnljYmNyID09IE5VTEwpIHsKKwkJaW1nLT55Y2JjciA9IChUSUZGWUNiQ3JUb1JHQiopIF9USUZGbWFsbG9jKAorCQkgICAgVElGRnJvdW5kdXBfMzIoc2l6ZW9mIChUSUZGWUNiQ3JUb1JHQiksIHNpemVvZiAobG9uZykpICAKKwkJICAgICsgNCoyNTYqc2l6ZW9mIChUSUZGUkdCVmFsdWUpCisJCSAgICArIDIqMjU2KnNpemVvZiAoaW50KQorCQkgICAgKyAzKjI1NipzaXplb2YgKGludDMyKQorCQkgICAgKTsKKwkJaWYgKGltZy0+eWNiY3IgPT0gTlVMTCkgeworCQkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJObyBzcGFjZSBmb3IgWUNiQ3ItPlJHQiBjb252ZXJzaW9uIHN0YXRlIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJVElGRkdldEZpZWxkRGVmYXVsdGVkKGltZy0+dGlmLCBUSUZGVEFHX1lDQkNSQ09FRkZJQ0lFTlRTLCAmbHVtYSk7CisJVElGRkdldEZpZWxkRGVmYXVsdGVkKGltZy0+dGlmLCBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEUsCisJICAgICZyZWZCbGFja1doaXRlKTsKKwlpZiAoVElGRllDYkNyVG9SR0JJbml0KGltZy0+eWNiY3IsIGx1bWEsIHJlZkJsYWNrV2hpdGUpIDwgMCkKKwkJcmV0dXJuKDApOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB0aWxlQ29udGlnUm91dGluZQoraW5pdENJRUxhYkNvbnZlcnNpb24oVElGRlJHQkFJbWFnZSogaW1nKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gImluaXRDSUVMYWJDb252ZXJzaW9uIjsKKworCWZsb2F0ICAgKndoaXRlUG9pbnQ7CisJZmxvYXQgICByZWZXaGl0ZVszXTsKKworCWlmICghaW1nLT5jaWVsYWIpIHsKKwkJaW1nLT5jaWVsYWIgPSAoVElGRkNJRUxhYlRvUkdCICopCisJCQlfVElGRm1hbGxvYyhzaXplb2YoVElGRkNJRUxhYlRvUkdCKSk7CisJCWlmICghaW1nLT5jaWVsYWIpIHsKKwkJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiTm8gc3BhY2UgZm9yIENJRSBMKmEqYiotPlJHQiBjb252ZXJzaW9uIHN0YXRlLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQoaW1nLT50aWYsIFRJRkZUQUdfV0hJVEVQT0lOVCwgJndoaXRlUG9pbnQpOworCXJlZldoaXRlWzFdID0gMTAwLjBGOworCXJlZldoaXRlWzBdID0gd2hpdGVQb2ludFswXSAvIHdoaXRlUG9pbnRbMV0gKiByZWZXaGl0ZVsxXTsKKwlyZWZXaGl0ZVsyXSA9ICgxLjBGIC0gd2hpdGVQb2ludFswXSAtIHdoaXRlUG9pbnRbMV0pCisJCSAgICAgIC8gd2hpdGVQb2ludFsxXSAqIHJlZldoaXRlWzFdOworCWlmIChUSUZGQ0lFTGFiVG9SR0JJbml0KGltZy0+Y2llbGFiLCAmZGlzcGxheV9zUkdCLCByZWZXaGl0ZSkgPCAwKSB7CisJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBDSUUgTCphKmIqLT5SR0IgY29udmVyc2lvbiBzdGF0ZS4iKTsKKwkJX1RJRkZmcmVlKGltZy0+Y2llbGFiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICh0aWxlQ29udGlnUm91dGluZSlwdXRjb250aWc4Yml0Q0lFTGFiOworfQorCisvKgorICogR3JleXNjYWxlIGltYWdlcyB3aXRoIGxlc3MgdGhhbiA4IGJpdHMvc2FtcGxlIGFyZSBoYW5kbGVkCisgKiB3aXRoIGEgdGFibGUgdG8gYXZvaWQgbG90cyBvZiBzaGlmdHMgYW5kIG1hc2tzLiAgVGhlIHRhYmxlCisgKiBpcyBzZXR1cCBzbyB0aGF0IHB1dCpid3RpbGUgKGJlbG93KSBjYW4gcmV0cmlldmUgOC9iaXRzcGVyc2FtcGxlCisgKiBwaXhlbCB2YWx1ZXMgc2ltcGx5IGJ5IGluZGV4aW5nIGludG8gdGhlIHRhYmxlIHdpdGggb25lCisgKiBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQKK21ha2Vid21hcChUSUZGUkdCQUltYWdlKiBpbWcpCit7CisgICAgVElGRlJHQlZhbHVlKiBNYXAgPSBpbWctPk1hcDsKKyAgICBpbnQgYml0c3BlcnNhbXBsZSA9IGltZy0+Yml0c3BlcnNhbXBsZTsKKyAgICBpbnQgbnNhbXBsZXMgPSA4IC8gYml0c3BlcnNhbXBsZTsKKyAgICBpbnQgaTsKKyAgICB1aW50MzIqIHA7CisKKyAgICBpZiggbnNhbXBsZXMgPT0gMCApCisgICAgICAgIG5zYW1wbGVzID0gMTsKKworICAgIGltZy0+QldtYXAgPSAodWludDMyKiopIF9USUZGbWFsbG9jKAorCTI1NipzaXplb2YgKHVpbnQzMiAqKSsoMjU2Km5zYW1wbGVzKnNpemVvZih1aW50MzIpKSk7CisgICAgaWYgKGltZy0+QldtYXAgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQoaW1nLT50aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUoaW1nLT50aWYpLCAiTm8gc3BhY2UgZm9yIEImVyBtYXBwaW5nIHRhYmxlIik7CisJCXJldHVybiAoMCk7CisgICAgfQorICAgIHAgPSAodWludDMyKikoaW1nLT5CV21hcCArIDI1Nik7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJVElGRlJHQlZhbHVlIGM7CisJaW1nLT5CV21hcFtpXSA9IHA7CisJc3dpdGNoIChiaXRzcGVyc2FtcGxlKSB7CisjZGVmaW5lCUdSRVkoeCkJYyA9IE1hcFt4XTsgKnArKyA9IFBBQ0soYyxjLGMpOworCWNhc2UgMToKKwkgICAgR1JFWShpPj43KTsKKwkgICAgR1JFWSgoaT4+NikmMSk7CisJICAgIEdSRVkoKGk+PjUpJjEpOworCSAgICBHUkVZKChpPj40KSYxKTsKKwkgICAgR1JFWSgoaT4+MykmMSk7CisJICAgIEdSRVkoKGk+PjIpJjEpOworCSAgICBHUkVZKChpPj4xKSYxKTsKKwkgICAgR1JFWShpJjEpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIEdSRVkoaT4+Nik7CisJICAgIEdSRVkoKGk+PjQpJjMpOworCSAgICBHUkVZKChpPj4yKSYzKTsKKwkgICAgR1JFWShpJjMpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIEdSRVkoaT4+NCk7CisJICAgIEdSRVkoaSYweGYpOworCSAgICBicmVhazsKKwljYXNlIDg6CisgICAgICAgIGNhc2UgMTY6CisJICAgIEdSRVkoaSk7CisJICAgIGJyZWFrOworCX0KKyN1bmRlZglHUkVZCisgICAgfQorICAgIHJldHVybiAoMSk7Cit9CisKKy8qCisgKiBDb25zdHJ1Y3QgYSBtYXBwaW5nIHRhYmxlIHRvIGNvbnZlcnQgZnJvbSB0aGUgcmFuZ2UKKyAqIG9mIHRoZSBkYXRhIHNhbXBsZXMgdG8gWzAsMjU1XSAtLWZvciBkaXNwbGF5LiAgVGhpcworICogcHJvY2VzcyBhbHNvIGhhbmRsZXMgaW52ZXJ0aW5nIEImVyBpbWFnZXMgd2hlbiBuZWVkZWQuCisgKi8gCitzdGF0aWMgaW50CitzZXR1cE1hcChUSUZGUkdCQUltYWdlKiBpbWcpCit7CisgICAgaW50MzIgeCwgcmFuZ2U7CisKKyAgICByYW5nZSA9IChpbnQzMikoKDFMPDxpbWctPmJpdHNwZXJzYW1wbGUpLTEpOworICAgIAorICAgIC8qIHRyZWF0IDE2IGJpdCB0aGUgc2FtZSBhcyBlaWdodCBiaXQgKi8KKyAgICBpZiggaW1nLT5iaXRzcGVyc2FtcGxlID09IDE2ICkKKyAgICAgICAgcmFuZ2UgPSAoaW50MzIpIDI1NTsKKworICAgIGltZy0+TWFwID0gKFRJRkZSR0JWYWx1ZSopIF9USUZGbWFsbG9jKChyYW5nZSsxKSAqIHNpemVvZiAoVElGRlJHQlZhbHVlKSk7CisgICAgaWYgKGltZy0+TWFwID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKGltZy0+dGlmKSwKKwkJCSJObyBzcGFjZSBmb3IgcGhvdG9tZXRyaWMgY29udmVyc2lvbiB0YWJsZSIpOworCQlyZXR1cm4gKDApOworICAgIH0KKyAgICBpZiAoaW1nLT5waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU1dISVRFKSB7CisJZm9yICh4ID0gMDsgeCA8PSByYW5nZTsgeCsrKQorCSAgICBpbWctPk1hcFt4XSA9IChUSUZGUkdCVmFsdWUpICgoKHJhbmdlIC0geCkgKiAyNTUpIC8gcmFuZ2UpOworICAgIH0gZWxzZSB7CisJZm9yICh4ID0gMDsgeCA8PSByYW5nZTsgeCsrKQorCSAgICBpbWctPk1hcFt4XSA9IChUSUZGUkdCVmFsdWUpICgoeCAqIDI1NSkgLyByYW5nZSk7CisgICAgfQorICAgIGlmIChpbWctPmJpdHNwZXJzYW1wbGUgPD0gMTYgJiYKKwkoaW1nLT5waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLIHx8CisJIGltZy0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTUlOSVNXSElURSkpIHsKKwkvKgorCSAqIFVzZSBwaG90b21ldHJpYyBtYXBwaW5nIHRhYmxlIHRvIGNvbnN0cnVjdAorCSAqIHVucGFja2luZyB0YWJsZXMgZm9yIHNhbXBsZXMgPD0gOCBiaXRzLgorCSAqLworCWlmICghbWFrZWJ3bWFwKGltZykpCisJICAgIHJldHVybiAoMCk7CisJLyogbm8gbG9uZ2VyIG5lZWQgTWFwLCBmcmVlIGl0ICovCisJX1RJRkZmcmVlKGltZy0+TWFwKSwgaW1nLT5NYXAgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitjaGVja2NtYXAoVElGRlJHQkFJbWFnZSogaW1nKQoreworICAgIHVpbnQxNiogciA9IGltZy0+cmVkY21hcDsKKyAgICB1aW50MTYqIGcgPSBpbWctPmdyZWVuY21hcDsKKyAgICB1aW50MTYqIGIgPSBpbWctPmJsdWVjbWFwOworICAgIGxvbmcgbiA9IDFMPDxpbWctPmJpdHNwZXJzYW1wbGU7CisKKyAgICB3aGlsZSAobi0tID4gMCkKKwlpZiAoKnIrKyA+PSAyNTYgfHwgKmcrKyA+PSAyNTYgfHwgKmIrKyA+PSAyNTYpCisJICAgIHJldHVybiAoMTYpOworICAgIHJldHVybiAoOCk7Cit9CisKK3N0YXRpYyB2b2lkCitjdnRjbWFwKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKyAgICB1aW50MTYqIHIgPSBpbWctPnJlZGNtYXA7CisgICAgdWludDE2KiBnID0gaW1nLT5ncmVlbmNtYXA7CisgICAgdWludDE2KiBiID0gaW1nLT5ibHVlY21hcDsKKyAgICBsb25nIGk7CisKKyAgICBmb3IgKGkgPSAoMUw8PGltZy0+Yml0c3BlcnNhbXBsZSktMTsgaSA+PSAwOyBpLS0pIHsKKyNkZWZpbmUJQ1ZUKHgpCQkoKHVpbnQxNikoKHgpPj44KSkKKwlyW2ldID0gQ1ZUKHJbaV0pOworCWdbaV0gPSBDVlQoZ1tpXSk7CisJYltpXSA9IENWVChiW2ldKTsKKyN1bmRlZglDVlQKKyAgICB9Cit9CisKKy8qCisgKiBQYWxldHRlIGltYWdlcyB3aXRoIDw9IDggYml0cy9zYW1wbGUgYXJlIGhhbmRsZWQKKyAqIHdpdGggYSB0YWJsZSB0byBhdm9pZCBsb3RzIG9mIHNoaWZ0cyBhbmQgbWFza3MuICBUaGUgdGFibGUKKyAqIGlzIHNldHVwIHNvIHRoYXQgcHV0KmNtYXB0aWxlIChiZWxvdykgY2FuIHJldHJpZXZlIDgvYml0c3BlcnNhbXBsZQorICogcGl4ZWwgdmFsdWVzIHNpbXBseSBieSBpbmRleGluZyBpbnRvIHRoZSB0YWJsZSB3aXRoIG9uZQorICogbnVtYmVyLgorICovCitzdGF0aWMgaW50CittYWtlY21hcChUSUZGUkdCQUltYWdlKiBpbWcpCit7CisgICAgaW50IGJpdHNwZXJzYW1wbGUgPSBpbWctPmJpdHNwZXJzYW1wbGU7CisgICAgaW50IG5zYW1wbGVzID0gOCAvIGJpdHNwZXJzYW1wbGU7CisgICAgdWludDE2KiByID0gaW1nLT5yZWRjbWFwOworICAgIHVpbnQxNiogZyA9IGltZy0+Z3JlZW5jbWFwOworICAgIHVpbnQxNiogYiA9IGltZy0+Ymx1ZWNtYXA7CisgICAgdWludDMyICpwOworICAgIGludCBpOworCisgICAgaW1nLT5QQUxtYXAgPSAodWludDMyKiopIF9USUZGbWFsbG9jKAorCTI1NipzaXplb2YgKHVpbnQzMiAqKSsoMjU2Km5zYW1wbGVzKnNpemVvZih1aW50MzIpKSk7CisgICAgaWYgKGltZy0+UEFMbWFwID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKGltZy0+dGlmKSwgIk5vIHNwYWNlIGZvciBQYWxldHRlIG1hcHBpbmcgdGFibGUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisgICAgcCA9ICh1aW50MzIqKShpbWctPlBBTG1hcCArIDI1Nik7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJVElGRlJHQlZhbHVlIGM7CisJaW1nLT5QQUxtYXBbaV0gPSBwOworI2RlZmluZQlDTUFQKHgpCWMgPSAoVElGRlJHQlZhbHVlKSB4OyAqcCsrID0gUEFDSyhyW2NdJjB4ZmYsIGdbY10mMHhmZiwgYltjXSYweGZmKTsKKwlzd2l0Y2ggKGJpdHNwZXJzYW1wbGUpIHsKKwljYXNlIDE6CisJICAgIENNQVAoaT4+Nyk7CisJICAgIENNQVAoKGk+PjYpJjEpOworCSAgICBDTUFQKChpPj41KSYxKTsKKwkgICAgQ01BUCgoaT4+NCkmMSk7CisJICAgIENNQVAoKGk+PjMpJjEpOworCSAgICBDTUFQKChpPj4yKSYxKTsKKwkgICAgQ01BUCgoaT4+MSkmMSk7CisJICAgIENNQVAoaSYxKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBDTUFQKGk+PjYpOworCSAgICBDTUFQKChpPj40KSYzKTsKKwkgICAgQ01BUCgoaT4+MikmMyk7CisJICAgIENNQVAoaSYzKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBDTUFQKGk+PjQpOworCSAgICBDTUFQKGkmMHhmKTsKKwkgICAgYnJlYWs7CisJY2FzZSA4OgorCSAgICBDTUFQKGkpOworCSAgICBicmVhazsKKwl9CisjdW5kZWYgQ01BUAorICAgIH0KKyAgICByZXR1cm4gKDEpOworfQorCisvKiAKKyAqIENvbnN0cnVjdCBhbnkgbWFwcGluZyB0YWJsZSB1c2VkCisgKiBieSB0aGUgYXNzb2NpYXRlZCBwdXQgcm91dGluZS4KKyAqLworc3RhdGljIGludAorYnVpbGRNYXAoVElGRlJHQkFJbWFnZSogaW1nKQoreworICAgIHN3aXRjaCAoaW1nLT5waG90b21ldHJpYykgeworICAgIGNhc2UgUEhPVE9NRVRSSUNfUkdCOgorICAgIGNhc2UgUEhPVE9NRVRSSUNfWUNCQ1I6CisgICAgY2FzZSBQSE9UT01FVFJJQ19TRVBBUkFURUQ6CisJaWYgKGltZy0+Yml0c3BlcnNhbXBsZSA9PSA4KQorCSAgICBicmVhazsKKwkvKiBmYWxsIHRocnUuLi4gKi8KKyAgICBjYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CisgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOgorCWlmICghc2V0dXBNYXAoaW1nKSkKKwkgICAgcmV0dXJuICgwKTsKKwlicmVhazsKKyAgICBjYXNlIFBIT1RPTUVUUklDX1BBTEVUVEU6CisJLyoKKwkgKiBDb252ZXJ0IDE2LWJpdCBjb2xvcm1hcCB0byA4LWJpdCAodW5sZXNzIGl0IGxvb2tzCisJICogbGlrZSBhbiBvbGQtc3R5bGUgOC1iaXQgY29sb3JtYXApLgorCSAqLworCWlmIChjaGVja2NtYXAoaW1nKSA9PSAxNikKKwkgICAgY3Z0Y21hcChpbWcpOworCWVsc2UKKwkgICAgVElGRldhcm5pbmdFeHQoaW1nLT50aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUoaW1nLT50aWYpLCAiQXNzdW1pbmcgOC1iaXQgY29sb3JtYXAiKTsKKwkvKgorCSAqIFVzZSBtYXBwaW5nIHRhYmxlIGFuZCBjb2xvcm1hcCB0byBjb25zdHJ1Y3QKKwkgKiB1bnBhY2tpbmcgdGFibGVzIGZvciBzYW1wbGVzIDwgOCBiaXRzLgorCSAqLworCWlmIChpbWctPmJpdHNwZXJzYW1wbGUgPD0gOCAmJiAhbWFrZWNtYXAoaW1nKSkKKwkgICAgcmV0dXJuICgwKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY29udmVyc2lvbiByb3V0aW5lIGZvciBwYWNrZWQgZGF0YS4KKyAqLworc3RhdGljIGludAorUGlja0NvbnRpZ0Nhc2UoVElGRlJHQkFJbWFnZSogaW1nKQoreworCWltZy0+Z2V0ID0gVElGRklzVGlsZWQoaW1nLT50aWYpID8gZ3RUaWxlQ29udGlnIDogZ3RTdHJpcENvbnRpZzsKKwlpbWctPnB1dC5jb250aWcgPSBOVUxMOworCXN3aXRjaCAoaW1nLT5waG90b21ldHJpYykgeworCQljYXNlIFBIT1RPTUVUUklDX1JHQjoKKwkJCXN3aXRjaCAoaW1nLT5iaXRzcGVyc2FtcGxlKSB7CisJCQkJY2FzZSA4OgorCQkJCQlpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKQorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCQUFjb250aWc4Yml0dGlsZTsKKwkJCQkJZWxzZSBpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBKQorCQkJCQl7CisJCQkJCQlpZiAoQnVpbGRNYXBVYVRvQWEoaW1nKSkKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRSR0JVQWNvbnRpZzhiaXR0aWxlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQmNvbnRpZzhiaXR0aWxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE2OgorCQkJCQlpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKQorCQkJCQl7CisJCQkJCQlpZiAoQnVpbGRNYXBCaXRkZXB0aDE2VG84KGltZykpCisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCQUFjb250aWcxNmJpdHRpbGU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBKQorCQkJCQl7CisJCQkJCQlpZiAoQnVpbGRNYXBCaXRkZXB0aDE2VG84KGltZykgJiYKKwkJCQkJCSAgICBCdWlsZE1hcFVhVG9BYShpbWcpKQorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQlVBY29udGlnMTZiaXR0aWxlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYgKEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChpbWcpKQorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQmNvbnRpZzE2Yml0dGlsZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1NFUEFSQVRFRDoKKwkJCWlmIChidWlsZE1hcChpbWcpKSB7CisJCQkJaWYgKGltZy0+Yml0c3BlcnNhbXBsZSA9PSA4KSB7CisJCQkJaWYgKCFpbWctPk1hcCkKKwkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCY29udGlnOGJpdENNWUt0aWxlOworCQkJCWVsc2UKKwkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCY29udGlnOGJpdENNWUtNYXB0aWxlOworCQkJfQorCQkJZWxzZSBpZihpbWctPmJpdHNwZXJzYW1wbGUgPT0gMTYpIC8qTGl1U3VubGlhbmcgYWRkZWQgMTZicHAgQ01ZSyBzdXBwb3J0LiovCisJCQl7CisJCQkJaWYgKCFpbWctPk1hcCkKKwkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCY29udGlnMTZiaXRDTVlLdGlsZTsKKwkJCQllbHNlCisJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQmNvbnRpZzE2Yml0Q01ZS01hcHRpbGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQSE9UT01FVFJJQ19QQUxFVFRFOgorCQkJaWYgKGJ1aWxkTWFwKGltZykpIHsKKwkJCQlzd2l0Y2ggKGltZy0+Yml0c3BlcnNhbXBsZSkgeworCQkJCQljYXNlIDg6CisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXQ4Yml0Y21hcHRpbGU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0NGJpdGNtYXB0aWxlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dDJiaXRjbWFwdGlsZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXQxYml0Y21hcHRpbGU7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOgorCQljYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CisJCQlpZiAoYnVpbGRNYXAoaW1nKSkgeworCQkJCXN3aXRjaCAoaW1nLT5iaXRzcGVyc2FtcGxlKSB7CisJCQkJCWNhc2UgMTY6CisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXQxNmJpdGJ3dGlsZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDg6CisJCQkJCQlpZiAoaW1nLT5hbHBoYSAmJiBpbWctPnNhbXBsZXNwZXJwaXhlbCA9PSAyKQorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dGFncmV5dGlsZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRncmV5dGlsZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXQ0Yml0Ynd0aWxlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dDJiaXRid3RpbGU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0MWJpdGJ3dGlsZTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorCQkJaWYgKChpbWctPmJpdHNwZXJzYW1wbGU9PTgpICYmIChpbWctPnNhbXBsZXNwZXJwaXhlbD09MykpCisJCQl7CisJCQkJaWYgKGluaXRZQ2JDckNvbnZlcnNpb24oaW1nKSE9MCkKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIFRoZSA2LjAgc3BlYyBzYXlzIHRoYXQgc3Vic2FtcGxpbmcgbXVzdCBiZQorCQkJCQkgKiBvbmUgb2YgMSwgMiwgb3IgNCwgYW5kIHRoYXQgdmVydGljYWwgc3Vic2FtcGxpbmcKKwkJCQkJICogbXVzdCBhbHdheXMgYmUgPD0gaG9yaXpvbnRhbCBzdWJzYW1wbGluZzsgc28KKwkJCQkJICogdGhlcmUgYXJlIG9ubHkgYSBmZXcgcG9zc2liaWxpdGllcyBhbmQgd2UganVzdAorCQkJCQkgKiBlbnVtZXJhdGUgdGhlIGNhc2VzLgorCQkJCQkgKiBKb3JpczogYWRkZWQgc3VwcG9ydCBmb3IgdGhlIFsxLDJdIGNhc2UsIG5vbmV0aGVsZXNzLCB0byBhY2NvbW9kYXRlCisJCQkJCSAqIHNvbWUgT0pQRUcgZmlsZXMKKwkJCQkJICovCisJCQkJCXVpbnQxNiBTdWJzYW1wbGluZ0hvcjsKKwkJCQkJdWludDE2IFN1YnNhbXBsaW5nVmVyOworCQkJCQlUSUZGR2V0RmllbGREZWZhdWx0ZWQoaW1nLT50aWYsIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywgJlN1YnNhbXBsaW5nSG9yLCAmU3Vic2FtcGxpbmdWZXIpOworCQkJCQlzd2l0Y2ggKChTdWJzYW1wbGluZ0hvcjw8NCl8U3Vic2FtcGxpbmdWZXIpIHsKKwkJCQkJCWNhc2UgMHg0NDoKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRjb250aWc4Yml0WUNiQ3I0NHRpbGU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4NDI6CisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0Y29udGlnOGJpdFlDYkNyNDJ0aWxlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweDQxOgorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dGNvbnRpZzhiaXRZQ2JDcjQxdGlsZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMHgyMjoKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRjb250aWc4Yml0WUNiQ3IyMnRpbGU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4MjE6CisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0Y29udGlnOGJpdFlDYkNyMjF0aWxlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweDEyOgorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dGNvbnRpZzhiaXRZQ2JDcjEydGlsZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMHgxMToKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRjb250aWc4Yml0WUNiQ3IxMXRpbGU7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19DSUVMQUI6CisJCQlpZiAoYnVpbGRNYXAoaW1nKSkgeworCQkJCWlmIChpbWctPmJpdHNwZXJzYW1wbGUgPT0gOCkKKwkJCQkJaW1nLT5wdXQuY29udGlnID0gaW5pdENJRUxhYkNvbnZlcnNpb24oaW1nKTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJcmV0dXJuICgoaW1nLT5nZXQhPU5VTEwpICYmIChpbWctPnB1dC5jb250aWchPU5VTEwpKTsKK30KKworLyoKKyAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY29udmVyc2lvbiByb3V0aW5lIGZvciB1bnBhY2tlZCBkYXRhLgorICoKKyAqIE5COiB3ZSBhc3N1bWUgdGhhdCB1bnBhY2tlZCBzaW5nbGUgY2hhbm5lbCBkYXRhIGlzIGRpcmVjdGVkCisgKgkgdG8gdGhlICJwYWNrZWQgcm91dGluZXMuCisgKi8KK3N0YXRpYyBpbnQKK1BpY2tTZXBhcmF0ZUNhc2UoVElGRlJHQkFJbWFnZSogaW1nKQoreworCWltZy0+Z2V0ID0gVElGRklzVGlsZWQoaW1nLT50aWYpID8gZ3RUaWxlU2VwYXJhdGUgOiBndFN0cmlwU2VwYXJhdGU7CisJaW1nLT5wdXQuc2VwYXJhdGUgPSBOVUxMOworCXN3aXRjaCAoaW1nLT5waG90b21ldHJpYykgeworCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKKwljYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CisJCS8qIGdyZXlzY2FsZSBpbWFnZXMgcHJvY2Vzc2VkIHByZXR0eSBtdWNoIGFzIFJHQiBieSBndFRpbGVTZXBhcmF0ZSAqLworCWNhc2UgUEhPVE9NRVRSSUNfUkdCOgorCQlzd2l0Y2ggKGltZy0+Yml0c3BlcnNhbXBsZSkgeworCQljYXNlIDg6CisJCQlpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKQorCQkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0UkdCQUFzZXBhcmF0ZThiaXR0aWxlOworCQkJZWxzZSBpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBKQorCQkJeworCQkJCWlmIChCdWlsZE1hcFVhVG9BYShpbWcpKQorCQkJCQlpbWctPnB1dC5zZXBhcmF0ZSA9IHB1dFJHQlVBc2VwYXJhdGU4Yml0dGlsZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlpbWctPnB1dC5zZXBhcmF0ZSA9IHB1dFJHQnNlcGFyYXRlOGJpdHRpbGU7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWlmIChpbWctPmFscGhhID09IEVYVFJBU0FNUExFX0FTU09DQUxQSEEpCisJCQl7CisJCQkJaWYgKEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChpbWcpKQorCQkJCQlpbWctPnB1dC5zZXBhcmF0ZSA9IHB1dFJHQkFBc2VwYXJhdGUxNmJpdHRpbGU7CisJCQl9CisJCQllbHNlIGlmIChpbWctPmFscGhhID09IEVYVFJBU0FNUExFX1VOQVNTQUxQSEEpCisJCQl7CisJCQkJaWYgKEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChpbWcpICYmCisJCQkJICAgIEJ1aWxkTWFwVWFUb0FhKGltZykpCisJCQkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0UkdCVUFzZXBhcmF0ZTE2Yml0dGlsZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoQnVpbGRNYXBCaXRkZXB0aDE2VG84KGltZykpCisJCQkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0UkdCc2VwYXJhdGUxNmJpdHRpbGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFBIT1RPTUVUUklDX1NFUEFSQVRFRDoKKwkJaWYgKGltZy0+Yml0c3BlcnNhbXBsZSA9PSA4ICYmIGltZy0+c2FtcGxlc3BlcnBpeGVsID09IDQpCisJCXsKKwkJCWltZy0+YWxwaGEgPSAxOyAvLyBOb3QgYWxwaGEsIGJ1dCBzZWVtcyBsaWtlIHRoZSBvbmx5IHdheSB0byBnZXQgNHRoIGJhbmQKKwkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0Q01ZS3NlcGFyYXRlOGJpdHRpbGU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQSE9UT01FVFJJQ19ZQ0JDUjoKKwkJaWYgKChpbWctPmJpdHNwZXJzYW1wbGU9PTgpICYmIChpbWctPnNhbXBsZXNwZXJwaXhlbD09MykpCisJCXsKKwkJCWlmIChpbml0WUNiQ3JDb252ZXJzaW9uKGltZykhPTApCisJCQl7CisJCQkJdWludDE2IGhzLCB2czsKKwkJCQlUSUZGR2V0RmllbGREZWZhdWx0ZWQoaW1nLT50aWYsIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywgJmhzLCAmdnMpOworCQkJCXN3aXRjaCAoKGhzPDw0KXx2cykgeworCQkJCWNhc2UgMHgxMToKKwkJCQkJaW1nLT5wdXQuc2VwYXJhdGUgPSBwdXRzZXBhcmF0ZThiaXRZQ2JDcjExdGlsZTsKKwkJCQkJYnJlYWs7CisJCQkJCS8qIFRPRE86IGFkZCBvdGhlciBjYXNlcyBoZXJlICovCisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKChpbWctPmdldCE9TlVMTCkgJiYgKGltZy0+cHV0LnNlcGFyYXRlIT1OVUxMKSk7Cit9CisKK3N0YXRpYyBpbnQKK0J1aWxkTWFwVWFUb0FhKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iQnVpbGRNYXBVYVRvQWEiOworCXVpbnQ4KiBtOworCXVpbnQxNiBuYSxudjsKKwlhc3NlcnQoaW1nLT5VYVRvQWE9PU5VTEwpOworCWltZy0+VWFUb0FhPV9USUZGbWFsbG9jKDY1NTM2KTsKKwlpZiAoaW1nLT5VYVRvQWE9PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQoaW1nLT50aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCW09aW1nLT5VYVRvQWE7CisJZm9yIChuYT0wOyBuYTwyNTY7IG5hKyspCisJeworCQlmb3IgKG52PTA7IG52PDI1NjsgbnYrKykKKwkJCSptKys9KG52Km5hKzEyNykvMjU1OworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK0J1aWxkTWFwQml0ZGVwdGgxNlRvOChUSUZGUkdCQUltYWdlKiBpbWcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109IkJ1aWxkTWFwQml0ZGVwdGgxNlRvOCI7CisJdWludDgqIG07CisJdWludDMyIG47CisJYXNzZXJ0KGltZy0+Qml0ZGVwdGgxNlRvOD09TlVMTCk7CisJaW1nLT5CaXRkZXB0aDE2VG84PV9USUZGbWFsbG9jKDY1NTM2KTsKKwlpZiAoaW1nLT5CaXRkZXB0aDE2VG84PT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwltPWltZy0+Qml0ZGVwdGgxNlRvODsKKwlmb3IgKG49MDsgbjw2NTUzNjsgbisrKQorCQkqbSsrPShuKzEyOCkvMjU3OworCXJldHVybigxKTsKK30KKworCisvKgorICogUmVhZCBhIHdob2xlIHN0cmlwIG9mZiBkYXRhIGZyb20gdGhlIGZpbGUsIGFuZCBjb252ZXJ0IHRvIFJHQkEgZm9ybS4KKyAqIElmIHRoaXMgaXMgdGhlIGxhc3Qgc3RyaXAsIHRoZW4gaXQgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHBvcnRpb24gb2YKKyAqIHRoZSBzdHJpcCB0aGF0IGlzIGFjdHVhbGx5IHdpdGhpbiB0aGUgaW1hZ2Ugc3BhY2UuICBUaGUgcmVzdWx0IGlzCisgKiBvcmdhbml6ZWQgaW4gYm90dG9tIHRvIHRvcCBmb3JtLgorICovCisKKworaW50CitUSUZGUmVhZFJHQkFTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiByb3csIHVpbnQzMiAqIHJhc3RlciApCisKK3sKKyAgICBjaGFyIAllbXNnWzEwMjRdID0gIiI7CisgICAgVElGRlJHQkFJbWFnZSBpbWc7CisgICAgaW50IAlvazsKKyAgICB1aW50MzIJcm93c3BlcnN0cmlwLCByb3dzX3RvX3JlYWQ7CisKKyAgICBpZiggVElGRklzVGlsZWQoIHRpZiApICkKKyAgICB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwKKyAgICAgICAgICAgICAgICAgICJDYW4ndCB1c2UgVElGRlJlYWRSR0JBU3RyaXAoKSB3aXRoIHRpbGVkIGZpbGUuIik7CisJcmV0dXJuICgwKTsKKyAgICB9CisgICAgCisgICAgVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZyb3dzcGVyc3RyaXApOworICAgIGlmKCAocm93ICUgcm93c3BlcnN0cmlwKSAhPSAwICkKKyAgICB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwKKwkJCQkiUm93IHBhc3NlZCB0byBUSUZGUmVhZFJHQkFTdHJpcCgpIG11c3QgYmUgZmlyc3QgaW4gYSBzdHJpcC4iKTsKKwkJcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBpZiAoVElGRlJHQkFJbWFnZU9LKHRpZiwgZW1zZykgJiYgVElGRlJHQkFJbWFnZUJlZ2luKCZpbWcsIHRpZiwgMCwgZW1zZykpIHsKKworICAgICAgICBpbWcucm93X29mZnNldCA9IHJvdzsKKyAgICAgICAgaW1nLmNvbF9vZmZzZXQgPSAwOworCisgICAgICAgIGlmKCByb3cgKyByb3dzcGVyc3RyaXAgPiBpbWcuaGVpZ2h0ICkKKyAgICAgICAgICAgIHJvd3NfdG9fcmVhZCA9IGltZy5oZWlnaHQgLSByb3c7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJvd3NfdG9fcmVhZCA9IHJvd3NwZXJzdHJpcDsKKyAgICAgICAgCisJb2sgPSBUSUZGUkdCQUltYWdlR2V0KCZpbWcsIHJhc3RlciwgaW1nLndpZHRoLCByb3dzX3RvX3JlYWQgKTsKKyAgICAgICAgCisJVElGRlJHQkFJbWFnZUVuZCgmaW1nKTsKKyAgICB9IGVsc2UgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsIGVtc2cpOworCQlvayA9IDA7CisgICAgfQorICAgIAorICAgIHJldHVybiAob2spOworfQorCisvKgorICogUmVhZCBhIHdob2xlIHRpbGUgb2ZmIGRhdGEgZnJvbSB0aGUgZmlsZSwgYW5kIGNvbnZlcnQgdG8gUkdCQSBmb3JtLgorICogVGhlIHJldHVybmVkIFJHQkEgZGF0YSBpcyBvcmdhbml6ZWQgZnJvbSBib3R0b20gdG8gdG9wIG9mIHRpbGUsCisgKiBhbmQgbWF5IGluY2x1ZGUgemVyb2VkIGFyZWFzIGlmIHRoZSB0aWxlIGV4dGVuZHMgb2ZmIHRoZSBpbWFnZS4KKyAqLworCitpbnQKK1RJRkZSZWFkUkdCQVRpbGUoVElGRiogdGlmLCB1aW50MzIgY29sLCB1aW50MzIgcm93LCB1aW50MzIgKiByYXN0ZXIpCisKK3sKKyAgICBjaGFyIAllbXNnWzEwMjRdID0gIiI7CisgICAgVElGRlJHQkFJbWFnZSBpbWc7CisgICAgaW50IAlvazsKKyAgICB1aW50MzIJdGlsZV94c2l6ZSwgdGlsZV95c2l6ZTsKKyAgICB1aW50MzIJcmVhZF94c2l6ZSwgcmVhZF95c2l6ZTsKKyAgICB1aW50MzIJaV9yb3c7CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGF0IG91ciByZXF1ZXN0IGlzIGxlZ2FsIC0gb24gYSB0aWxlIGZpbGUsIGFuZCBvbiBhCisgICAgICogdGlsZSBib3VuZGFyeS4KKyAgICAgKi8KKyAgICAKKyAgICBpZiggIVRJRkZJc1RpbGVkKCB0aWYgKSApCisgICAgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksCisJCQkJICAiQ2FuJ3QgdXNlIFRJRkZSZWFkUkdCQVRpbGUoKSB3aXRoIHN0cmlwcGVkIGZpbGUuIik7CisJCXJldHVybiAoMCk7CisgICAgfQorICAgIAorICAgIFRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfVElMRVdJRFRILCAmdGlsZV94c2l6ZSk7CisgICAgVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGlsZV95c2l6ZSk7CisgICAgaWYoIChjb2wgJSB0aWxlX3hzaXplKSAhPSAwIHx8IChyb3cgJSB0aWxlX3lzaXplKSAhPSAwICkKKyAgICB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwKKyAgICAgICAgICAgICAgICAgICJSb3cvY29sIHBhc3NlZCB0byBUSUZGUmVhZFJHQkFUaWxlKCkgbXVzdCBiZSB0b3AiCisgICAgICAgICAgICAgICAgICAibGVmdCBjb3JuZXIgb2YgYSB0aWxlLiIpOworCXJldHVybiAoMCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgUkdCQSByZWFkZXIuCisgICAgICovCisgICAgCisgICAgaWYgKCFUSUZGUkdCQUltYWdlT0sodGlmLCBlbXNnKSAKKwl8fCAhVElGRlJHQkFJbWFnZUJlZ2luKCZpbWcsIHRpZiwgMCwgZW1zZykpIHsKKwkgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCBlbXNnKTsKKwkgICAgcmV0dXJuKCAwICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgVElGRlJHQkFJbWFnZUdldCgpIGZ1bmN0aW9uIGRvZXNuJ3QgYWxsb3cgdXMgdG8gZ2V0IG9mZiB0aGUKKyAgICAgKiBlZGdlIG9mIHRoZSBpbWFnZSwgZXZlbiB0byBmaWxsIGFuIG90aGVyd2lzZSB2YWxpZCB0aWxlLiAgU28gd2UKKyAgICAgKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGNhbiByZWFkLCBhbmQgZml4IHVwIHRoZSB0aWxlIGJ1ZmZlciB0bworICAgICAqIGEgZnVsbCB0aWxlIGNvbmZpZ3VyYXRpb24gYWZ0ZXJ3YXJkcy4KKyAgICAgKi8KKworICAgIGlmKCByb3cgKyB0aWxlX3lzaXplID4gaW1nLmhlaWdodCApCisgICAgICAgIHJlYWRfeXNpemUgPSBpbWcuaGVpZ2h0IC0gcm93OworICAgIGVsc2UKKyAgICAgICAgcmVhZF95c2l6ZSA9IHRpbGVfeXNpemU7CisgICAgCisgICAgaWYoIGNvbCArIHRpbGVfeHNpemUgPiBpbWcud2lkdGggKQorICAgICAgICByZWFkX3hzaXplID0gaW1nLndpZHRoIC0gY29sOworICAgIGVsc2UKKyAgICAgICAgcmVhZF94c2l6ZSA9IHRpbGVfeHNpemU7CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIGNodW5rIG9mIGltYWdlcnkuCisgICAgICovCisgICAgCisgICAgaW1nLnJvd19vZmZzZXQgPSByb3c7CisgICAgaW1nLmNvbF9vZmZzZXQgPSBjb2w7CisKKyAgICBvayA9IFRJRkZSR0JBSW1hZ2VHZXQoJmltZywgcmFzdGVyLCByZWFkX3hzaXplLCByZWFkX3lzaXplICk7CisgICAgICAgIAorICAgIFRJRkZSR0JBSW1hZ2VFbmQoJmltZyk7CisKKyAgICAvKgorICAgICAqIElmIG91ciByZWFkIHdhcyBpbmNvbXBsZXRlIHdlIHdpbGwgbmVlZCB0byBmaXggdXAgdGhlIHRpbGUgYnkKKyAgICAgKiBzaGlmdGluZyB0aGUgZGF0YSBhcm91bmQgYXMgaWYgYSBmdWxsIHRpbGUgb2YgZGF0YSBpcyBiZWluZyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYWxsIHRoZSBtb3JlIGNvbXBsaWNhdGVkIGJlY2F1c2UgdGhlIGltYWdlIGlzIG9yZ2FuaXplZCBpbgorICAgICAqIGJvdHRvbSB0byB0b3AgZm9ybWF0LiAKKyAgICAgKi8KKworICAgIGlmKCByZWFkX3hzaXplID09IHRpbGVfeHNpemUgJiYgcmVhZF95c2l6ZSA9PSB0aWxlX3lzaXplICkKKyAgICAgICAgcmV0dXJuKCBvayApOworCisgICAgZm9yKCBpX3JvdyA9IDA7IGlfcm93IDwgcmVhZF95c2l6ZTsgaV9yb3crKyApIHsKKyAgICAgICAgbWVtbW92ZSggcmFzdGVyICsgKHRpbGVfeXNpemUgLSBpX3JvdyAtIDEpICogdGlsZV94c2l6ZSwKKyAgICAgICAgICAgICAgICAgcmFzdGVyICsgKHJlYWRfeXNpemUgLSBpX3JvdyAtIDEpICogcmVhZF94c2l6ZSwKKyAgICAgICAgICAgICAgICAgcmVhZF94c2l6ZSAqIHNpemVvZih1aW50MzIpICk7CisgICAgICAgIF9USUZGbWVtc2V0KCByYXN0ZXIgKyAodGlsZV95c2l6ZSAtIGlfcm93IC0gMSkgKiB0aWxlX3hzaXplK3JlYWRfeHNpemUsCisgICAgICAgICAgICAgICAgICAgICAwLCBzaXplb2YodWludDMyKSAqICh0aWxlX3hzaXplIC0gcmVhZF94c2l6ZSkgKTsKKyAgICB9CisKKyAgICBmb3IoIGlfcm93ID0gcmVhZF95c2l6ZTsgaV9yb3cgPCB0aWxlX3lzaXplOyBpX3JvdysrICkgeworICAgICAgICBfVElGRm1lbXNldCggcmFzdGVyICsgKHRpbGVfeXNpemUgLSBpX3JvdyAtIDEpICogdGlsZV94c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIDAsIHNpemVvZih1aW50MzIpICogdGlsZV94c2l6ZSApOworICAgIH0KKworICAgIHJldHVybiAob2spOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9qcGVnLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9qcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmMGY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2pwZWcuYwpAQCAtMCwwICsxLDIzMTEgQEAKKy8qICRJZDogdGlmX2pwZWcuYyx2IDEuMTExIDIwMTItMDctMDYgMTg6NDg6MDQgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBWQ19FWFRSQUxFQU4KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpZmRlZiBKUEVHX1NVUFBPUlQKKworLyoKKyAqIFRJRkYgTGlicmFyeQorICoKKyAqIEpQRUcgQ29tcHJlc3Npb24gc3VwcG9ydCBwZXIgVElGRiBUZWNobmljYWwgTm90ZSAjMgorICogKCpub3QqIHBlciB0aGUgb3JpZ2luYWwgVElGRiA2LjAgc3BlYykuCisgKgorICogVGhpcyBmaWxlIGlzIHNpbXBseSBhbiBpbnRlcmZhY2UgdG8gdGhlIGxpYmpwZWcgbGlicmFyeSB3cml0dGVuIGJ5CisgKiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cC4gIFlvdSBuZWVkIHJlbGVhc2UgNSBvciBsYXRlciBvZiB0aGUgSUpHCisgKiBjb2RlLCB3aGljaCB5b3UgY2FuIGZpbmQgb24gdGhlIEludGVybmV0IGF0IGZ0cC51dS5uZXQ6L2dyYXBoaWNzL2pwZWcvLgorICoKKyAqIENvbnRyaWJ1dGVkIGJ5IFRvbSBMYW5lIDx0Z2xAc3NzLnBnaC5wYS51cz4uCisgKi8KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworaW50IFRJRkZGaWxsU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApOworaW50IFRJRkZGaWxsVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlKTsKK2ludCBUSUZGUmVJbml0SlBFR18xMiggVElGRiAqdGlmLCBpbnQgc2NoZW1lLCBpbnQgaXNfZW5jb2RlICk7CisKKy8qIFdlIHVuZGVmaW5lIEZBUiB0byBhdm9pZCBjb25mbGljdCB3aXRoIEpQRUcgZGVmaW5pdGlvbiAqLworCisjaWZkZWYgRkFSCisjdW5kZWYgRkFSCisjZW5kaWYKKworLyoKKyAgTGlianBlZydzIGptb3JlY2ZnLmggZGVmaW5lcyBJTlQxNiBhbmQgSU5UMzIsIGJ1dCBvbmx5IGlmIFhNRF9IIGlzCisgIG5vdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgdGhlIE1pbkdXIGFuZCBCb3JsYW5kIGNvbXBpbGVycyBpbmNsdWRlCisgIGEgdHlwZWRlZiBmb3IgSU5UMzIsIHdoaWNoIGNhdXNlcyBhIGNvbmZsaWN0LiAgTVNWQyBkb2VzIG5vdCBpbmNsdWRlCisgIGEgY29uZmljdGluZyB0eXBlZGVmIGdpdmVuIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBpbmNsdWRlZC4KKyovCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjIGRlZmluZSBYTURfSCAxCisjZW5kaWYKKworLyoKKyAgIFRoZSB3aW5kb3dzIFJQQ05EUi5IIGZpbGUgZGVmaW5lcyBib29sZWFuLCBidXQgZGVmaW5lcyBpdCB3aXRoIHRoZQorICAgdW5zaWduZWQgY2hhciBzaXplLiAgWW91IHNob3VsZCBjb21waWxlIEpQRUcgbGlicmFyeSB1c2luZyBhcHByb3ByaWF0ZQorICAgZGVmaW5pdGlvbnMgaW4gamNvbmZpZy5oIGhlYWRlciwgYnV0IG1hbnkgdXNlcnMgY29tcGlsZSBsaWJyYXJ5IGluIHdyb25nCisgICB3YXkuIFRoYXQgY2F1c2VzIGVycm9ycyBvZiB0aGUgZm9sbG93aW5nIHR5cGU6CisKKyAgICJKUEVHTGliOiBKUEVHIHBhcmFtZXRlciBzdHJ1Y3QgbWlzbWF0Y2g6IGxpYnJhcnkgdGhpbmtzIHNpemUgaXMgNDMyLAorICAgY2FsbGVyIGV4cGVjdHMgNDY0IgorCisgICBGb3Igc3VjaCB1c2VycyB3ZSB3aWwgZml4IHRoZSBwcm9ibGVtIGhlcmUuIFNlZSBpbnN0YWxsLmRvYyBmaWxlIGZyb20KKyAgIHRoZSBKUEVHIGxpYnJhcnkgZGlzdHJpYnV0aW9uIGZvciBkZXRhaWxzLgorKi8KKworLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20uICovCisjaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisjIGlmbmRlZiBfX1JQQ05EUl9IX18gICAgICAgICAgICAvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KKyAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOworIyBlbmRpZgorIyBkZWZpbmUgSEFWRV9CT09MRUFOICAgICAgICAgICAgLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLworI2VuZGlmCisKKyNpZm5kZWYgX0ZYX0pQRUdfVFVSQk9fCisJI2luY2x1ZGUgIi4uLy4uL2xpYmpwZWcvanBlZ2xpYi5oIgorCSNpbmNsdWRlICIuLi8uLi9saWJqcGVnL2plcnJvci5oIgorI2Vsc2UKKwkjaW5jbHVkZSAiLi4vLi4vbGlianBlZy10dXJiby9qcGVnbGliLmgiCisJI2luY2x1ZGUgIi4uLy4uL2xpYmpwZWctdHVyYm8vamVycm9yLmgiCisjZW5kaWYvL19GWF9KUEVHX1RVUkJPXworCisvKiAKKyAqIERvIHdlIHdhbnQgdG8gZG8gc3BlY2lhbCBwcm9jZXNzaW5nIHN1aXRhYmxlIGZvciB3aGVuIEpTQU1QTEUgaXMgYQorICogMTZiaXQgdmFsdWU/ICAKKyAqLworCisjaWYgZGVmaW5lZChKUEVHX0xJQl9NSzEpCisjICBkZWZpbmUgSlBFR19MSUJfTUsxX09SXzEyQklUIDEKKyNlbGlmIEJJVFNfSU5fSlNBTVBMRSA9PSAxMgorIyAgZGVmaW5lIEpQRUdfTElCX01LMV9PUl8xMkJJVCAxCisjZW5kaWYKKworLyoKKyAqIFdlIGFyZSB1c2luZyB3aWR0aF9pbl9ibG9ja3Mgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgcHJpdmF0ZSB0bworICogbGlianBlZy4gVW5mb3J0dW5hdGVseSwgdGhlIGxpYmpwZWcgZGVsaXZlcmVkIHdpdGggQ3lnd2luIGhhcworICogcmVuYW1lZCB0aGlzIG1lbWJlciB0byB3aWR0aF9pbl9kYXRhX3VuaXRzLiAgU2luY2UgdGhlIGhlYWRlciBoYXMKKyAqIGFsc28gcmVuYW1lZCBhIGRlZmluZSwgdXNlIHRoYXQgdW5pcXVlIGRlZmluZSBuYW1lIGluIG9yZGVyIHRvCisgKiBkZXRlY3QgdGhlIHByb2JsZW0gaGVhZGVyIGFuZCBhZGp1c3QgdG8gc3VpdC4KKyAqLworI2lmIGRlZmluZWQoRF9NQVhfREFUQV9VTklUU19JTl9NQ1UpCisjZGVmaW5lIHdpZHRoX2luX2Jsb2NrcyB3aWR0aF9pbl9kYXRhX3VuaXRzCisjZW5kaWYKKworLyoKKyAqIE9uIHNvbWUgbWFjaGluZXMgaXQgbWF5IGJlIHdvcnRod2hpbGUgdG8gdXNlIF9zZXRqbXAgb3Igc2lnc2V0am1wCisgKiBpbiBwbGFjZSBvZiBwbGFpbiBzZXRqbXAuICBUaGVzZSBtYWNyb3Mgd2lsbCBtYWtlIGl0IGVhc2llci4KKyAqLworI2RlZmluZSBTRVRKTVAoamJ1ZikJCXNldGptcChqYnVmKQorI2RlZmluZSBMT05HSk1QKGpidWYsY29kZSkJbG9uZ2ptcChqYnVmLGNvZGUpCisjZGVmaW5lIEpNUF9CVUYJCQlqbXBfYnVmCisKK3R5cGVkZWYgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIGpwZWdfZGVzdGluYXRpb25fbWdyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpwZWdfc291cmNlX21ncjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGpwZWdfZXJyb3JfbWdyOworCisvKgorICogU3RhdGUgYmxvY2sgZm9yIGVhY2ggb3BlbiBUSUZGIGZpbGUgdXNpbmcKKyAqIGxpYmpwZWcgdG8gZG8gSlBFRyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICoKKyAqIGxpYmpwZWcncyB2aXNpYmxlIHN0YXRlIGlzIGVpdGhlciBhIGpwZWdfY29tcHJlc3Nfc3RydWN0CisgKiBvciBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGRlcGVuZGluZyBvbiB3aGljaCB3YXkgd2UKKyAqIGFyZSBnb2luZy4gIGNvbW0gY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGZpZWxkcworICogd2hpY2ggYXJlIGNvbW1vbiB0byBib3RoLgorICoKKyAqIE5COiBjaW5mbyBpcyByZXF1aXJlZCB0byBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIEpQRUdTdGF0ZSwKKyAqICAgICBzbyB3ZSBjYW4gc2FmZWx5IGNhc3QgSlBFR1N0YXRlKiAtPiBqcGVnX3h4eF9zdHJ1Y3QqCisgKiAgICAgYW5kIHZpY2UgdmVyc2EhCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjOworCQlzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBkOworCQlzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IGNvbW07CisJfSBjaW5mbzsJCQkvKiBOQjogbXVzdCBiZSBmaXJzdCAqLworCWludCAgICAgICAgICAgICBjaW5mb19pbml0aWFsaXplZDsKKworCWpwZWdfZXJyb3JfbWdyCWVycjsJCS8qIGxpYmpwZWcgZXJyb3IgbWFuYWdlciAqLworCUpNUF9CVUYJCWV4aXRfam1wYnVmOwkvKiBmb3IgY2F0Y2hpbmcgbGlianBlZyBmYWlsdXJlcyAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyBjb3VsZCBiZSBhIHVuaW9uLCBidXQKKwkgKiB0aGV5J3JlIHNtYWxsIGVub3VnaCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQuCisJICovCisJanBlZ19kZXN0aW5hdGlvbl9tZ3IgZGVzdDsJLyogZGF0YSBkZXN0IGZvciBjb21wcmVzc2lvbiAqLworCWpwZWdfc291cmNlX21ncglzcmM7CQkvKiBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLworCQkJCQkvKiBwcml2YXRlIHN0YXRlICovCisJVElGRioJCXRpZjsJCS8qIGJhY2sgbGluayBuZWVkZWQgYnkgc29tZSBjb2RlICovCisJdWludDE2CQlwaG90b21ldHJpYzsJLyogY29weSBvZiBQaG90b21ldHJpY0ludGVycHJldGF0aW9uICovCisJdWludDE2CQloX3NhbXBsaW5nOwkvKiBsdW1pbmFuY2Ugc2FtcGxpbmcgZmFjdG9ycyAqLworCXVpbnQxNgkJdl9zYW1wbGluZzsKKwl0bXNpemVfdCAgIAlieXRlc3BlcmxpbmU7CS8qIGRlY29tcHJlc3NlZCBieXRlcyBwZXIgc2NhbmxpbmUgKi8KKwkvKiBwb2ludGVycyB0byBpbnRlcm1lZGlhdGUgYnVmZmVycyB3aGVuIHByb2Nlc3NpbmcgZG93bnNhbXBsZWQgZGF0YSAqLworCUpTQU1QQVJSQVkJZHNfYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKwlpbnQJCXNjYW5jb3VudDsJLyogbnVtYmVyIG9mICJzY2FubGluZXMiIGFjY3VtdWxhdGVkICovCisJaW50CQlzYW1wbGVzcGVyY2x1bXA7CisKKwlUSUZGVkdldE1ldGhvZAl2Z2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZAl2c2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGUHJpbnRNZXRob2QgcHJpbnRkaXI7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZTdHJpcE1ldGhvZAlkZWZzcGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVGlsZU1ldGhvZAlkZWZ0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwkJCQkJLyogcHNldWRvLXRhZyBmaWVsZHMgKi8KKwl2b2lkKgkJanBlZ3RhYmxlczsJLyogSlBFR1RhYmxlcyB0YWcgdmFsdWUsIG9yIE5VTEwgKi8KKwl1aW50MzIJCWpwZWd0YWJsZXNfbGVuZ3RoOyAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc2FtZSAqLworCWludAkJanBlZ3F1YWxpdHk7CS8qIENvbXByZXNzaW9uIHF1YWxpdHkgbGV2ZWwgKi8KKwlpbnQJCWpwZWdjb2xvcm1vZGU7CS8qIEF1dG8gUkdCPD0+WUNiQ3IgY29udmVydD8gKi8KKwlpbnQJCWpwZWd0YWJsZXNtb2RlOwkvKiBXaGF0IHRvIHB1dCBpbiBKUEVHVGFibGVzICovCisKKyAgICAgICAgaW50ICAgICAgICAgICAgIHljYmNyc2FtcGxpbmdfZmV0Y2hlZDsKK30gSlBFR1N0YXRlOworCisjZGVmaW5lCUpTdGF0ZSh0aWYpCSgoSlBFR1N0YXRlKikodGlmKS0+dGlmX2RhdGEpCisKK3N0YXRpYyBpbnQgSlBFR0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IEpQRUdEZWNvZGVSYXcoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworc3RhdGljIGludCBKUEVHRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgSlBFR0VuY29kZVJhdyhUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IEpQRUdJbml0aWFsaXplTGliSlBFRyhUSUZGICogdGlmLCBpbnQgZGVjb2RlICk7CitzdGF0aWMgaW50IERlY29kZVJvd0Vycm9yKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKKworI2RlZmluZQlGSUVMRF9KUEVHVEFCTEVTCShGSUVMRF9DT0RFQyswKQorCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIGpwZWdGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfSlBFR1RBQkxFUywgLTMsIC0zLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzMyX1VJTlQ4LCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIEZJRUxEX0pQRUdUQUJMRVMsIEZBTFNFLCBUUlVFLCAiSlBFR1RhYmxlcyIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfSlBFR1FVQUxJVFksIDAsIDAsIFRJRkZfQU5ZLCAwLCBUSUZGX1NFVEdFVF9JTlQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBUUlVFLCBGQUxTRSwgIiIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfSlBFR0NPTE9STU9ERSwgMCwgMCwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIEZBTFNFLCBGQUxTRSwgIiIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfSlBFR1RBQkxFU01PREUsIDAsIDAsIFRJRkZfQU5ZLCAwLCBUSUZGX1NFVEdFVF9JTlQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBGQUxTRSwgRkFMU0UsICIiLCBOVUxMIH0KK307CisKKy8qCisgKiBsaWJqcGVnIGludGVyZmFjZSBsYXllci4KKyAqCisgKiBXZSB1c2Ugc2V0am1wL2xvbmdqbXAgdG8gcmV0dXJuIGNvbnRyb2wgdG8gbGlidGlmZgorICogd2hlbiBhIGZhdGFsIGVycm9yIGlzIGVuY291bnRlcmVkIHdpdGhpbiB0aGUgSlBFRworICogbGlicmFyeS4gIFdlIGFsc28gZGlyZWN0IGxpYmpwZWcgZXJyb3IgYW5kIHdhcm5pbmcKKyAqIG1lc3NhZ2VzIHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGxpYnRpZmYgaGFuZGxlcnMuCisgKi8KKworLyoKKyAqIEVycm9yIGhhbmRsaW5nIHJvdXRpbmVzICh0aGVzZSByZXBsYWNlIGNvcnJlc3BvbmRpbmcKKyAqIElKRyByb3V0aW5lcyBmcm9tIGplcnJvci5jKS4gIFRoZXNlIGFyZSB1c2VkIGZvciBib3RoCisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAqLworc3RhdGljIHZvaWQKK1RJRkZqcGVnX2Vycm9yX2V4aXQoal9jb21tb25fcHRyIGNpbmZvKQoreworCUpQRUdTdGF0ZSAqc3AgPSAoSlBFR1N0YXRlICopIGNpbmZvOwkvKiBOQjogY2luZm8gYXNzdW1lZCBmaXJzdCAqLworCWNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKwkoKmNpbmZvLT5lcnItPmZvcm1hdF9tZXNzYWdlKSAoY2luZm8sIGJ1ZmZlcik7CisJVElGRkVycm9yRXh0KHNwLT50aWYtPnRpZl9jbGllbnRkYXRhLCAiSlBFR0xpYiIsICIlcyIsIGJ1ZmZlcik7CQkvKiBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlICovCisJanBlZ19hYm9ydChjaW5mbyk7CQkJLyogY2xlYW4gdXAgbGlianBlZyBzdGF0ZSAqLworCUxPTkdKTVAoc3AtPmV4aXRfam1wYnVmLCAxKTsJCS8qIHJldHVybiB0byBsaWJ0aWZmIGNhbGxlciAqLworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgb25seSBmb3Igd2FybmluZyBtZXNzYWdlcywKKyAqIHNpbmNlIGVycm9yX2V4aXQgZG9lcyBpdHMgb3duIHRoaW5nIGFuZCB0cmFjZV9sZXZlbAorICogaXMgbmV2ZXIgc2V0ID4gMC4KKyAqLworc3RhdGljIHZvaWQKK1RJRkZqcGVnX291dHB1dF9tZXNzYWdlKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKwljaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOworCisJKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOworCVRJRkZXYXJuaW5nRXh0KCgoSlBFR1N0YXRlICopIGNpbmZvKS0+dGlmLT50aWZfY2xpZW50ZGF0YSwgIkpQRUdMaWIiLCAiJXMiLCBidWZmZXIpOworfQorCisvKgorICogSW50ZXJmYWNlIHJvdXRpbmVzLiAgVGhpcyBsYXllciBvZiByb3V0aW5lcyBleGlzdHMKKyAqIHByaW1hcmlseSB0byBsaW1pdCBzaWRlLWVmZmVjdHMgZnJvbSB1c2luZyBzZXRqbXAuCisgKiBBbHNvLCBub3JtYWwvZXJyb3IgcmV0dXJucyBhcmUgY29udmVydGVkIGludG8gcmV0dXJuCisgKiB2YWx1ZXMgcGVyIGxpYnRpZmYgcHJhY3RpY2UuCisgKi8KKyNkZWZpbmUJQ0FMTEpQRUcoc3AsIGZhaWwsIG9wKQkoU0VUSk1QKChzcCktPmV4aXRfam1wYnVmKSA/IChmYWlsKSA6IChvcCkpCisjZGVmaW5lCUNBTExWSlBFRyhzcCwgb3ApCUNBTExKUEVHKHNwLCAwLCAoKG9wKSwxKSkKKworc3RhdGljIGludAorVElGRmpwZWdfY3JlYXRlX2NvbXByZXNzKEpQRUdTdGF0ZSogc3ApCit7CisJLyogaW5pdGlhbGl6ZSBKUEVHIGVycm9yIGhhbmRsaW5nICovCisJc3AtPmNpbmZvLmMuZXJyID0ganBlZ19zdGRfZXJyb3IoJnNwLT5lcnIpOworCXNwLT5lcnIuZXJyb3JfZXhpdCA9IFRJRkZqcGVnX2Vycm9yX2V4aXQ7CisJc3AtPmVyci5vdXRwdXRfbWVzc2FnZSA9IFRJRkZqcGVnX291dHB1dF9tZXNzYWdlOworCisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19jcmVhdGVfY29tcHJlc3MoJnNwLT5jaW5mby5jKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKEpQRUdTdGF0ZSogc3ApCit7CisJLyogaW5pdGlhbGl6ZSBKUEVHIGVycm9yIGhhbmRsaW5nICovCisJc3AtPmNpbmZvLmQuZXJyID0ganBlZ19zdGRfZXJyb3IoJnNwLT5lcnIpOworCXNwLT5lcnIuZXJyb3JfZXhpdCA9IFRJRkZqcGVnX2Vycm9yX2V4aXQ7CisJc3AtPmVyci5vdXRwdXRfbWVzc2FnZSA9IFRJRkZqcGVnX291dHB1dF9tZXNzYWdlOworCisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19jcmVhdGVfZGVjb21wcmVzcygmc3AtPmNpbmZvLmQpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfc2V0X2RlZmF1bHRzKEpQRUdTdGF0ZSogc3ApCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19zZXRfZGVmYXVsdHMoJnNwLT5jaW5mby5jKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3NldF9jb2xvcnNwYWNlKEpQRUdTdGF0ZSogc3AsIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkKK3sKKwlyZXR1cm4gQ0FMTFZKUEVHKHNwLCBqcGVnX3NldF9jb2xvcnNwYWNlKCZzcC0+Y2luZm8uYywgY29sb3JzcGFjZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19zZXRfcXVhbGl0eShKUEVHU3RhdGUqIHNwLCBpbnQgcXVhbGl0eSwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKK3sKKwlyZXR1cm4gQ0FMTFZKUEVHKHNwLAorCSAgICBqcGVnX3NldF9xdWFsaXR5KCZzcC0+Y2luZm8uYywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfc3VwcHJlc3NfdGFibGVzKEpQRUdTdGF0ZSogc3AsIGJvb2xlYW4gc3VwcHJlc3MpCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19zdXBwcmVzc190YWJsZXMoJnNwLT5jaW5mby5jLCBzdXBwcmVzcykpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19zdGFydF9jb21wcmVzcyhKUEVHU3RhdGUqIHNwLCBib29sZWFuIHdyaXRlX2FsbF90YWJsZXMpCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwKKwkgICAganBlZ19zdGFydF9jb21wcmVzcygmc3AtPmNpbmZvLmMsIHdyaXRlX2FsbF90YWJsZXMpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfd3JpdGVfc2NhbmxpbmVzKEpQRUdTdGF0ZSogc3AsIEpTQU1QQVJSQVkgc2NhbmxpbmVzLCBpbnQgbnVtX2xpbmVzKQoreworCXJldHVybiBDQUxMSlBFRyhzcCwgLTEsIChpbnQpIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZzcC0+Y2luZm8uYywKKwkgICAgc2NhbmxpbmVzLCAoSkRJTUVOU0lPTikgbnVtX2xpbmVzKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3dyaXRlX3Jhd19kYXRhKEpQRUdTdGF0ZSogc3AsIEpTQU1QSU1BR0UgZGF0YSwgaW50IG51bV9saW5lcykKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIC0xLCAoaW50KSBqcGVnX3dyaXRlX3Jhd19kYXRhKCZzcC0+Y2luZm8uYywKKwkgICAgZGF0YSwgKEpESU1FTlNJT04pIG51bV9saW5lcykpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19maW5pc2hfY29tcHJlc3MoSlBFR1N0YXRlKiBzcCkKK3sKKwlyZXR1cm4gQ0FMTFZKUEVHKHNwLCBqcGVnX2ZpbmlzaF9jb21wcmVzcygmc3AtPmNpbmZvLmMpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfd3JpdGVfdGFibGVzKEpQRUdTdGF0ZSogc3ApCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ193cml0ZV90YWJsZXMoJnNwLT5jaW5mby5jKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3JlYWRfaGVhZGVyKEpQRUdTdGF0ZSogc3AsIGJvb2xlYW4gcmVxdWlyZV9pbWFnZSkKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIC0xLCBqcGVnX3JlYWRfaGVhZGVyKCZzcC0+Y2luZm8uZCwgcmVxdWlyZV9pbWFnZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19zdGFydF9kZWNvbXByZXNzKEpQRUdTdGF0ZSogc3ApCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19zdGFydF9kZWNvbXByZXNzKCZzcC0+Y2luZm8uZCkpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19yZWFkX3NjYW5saW5lcyhKUEVHU3RhdGUqIHNwLCBKU0FNUEFSUkFZIHNjYW5saW5lcywgaW50IG1heF9saW5lcykKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIC0xLCAoaW50KSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZzcC0+Y2luZm8uZCwKKwkgICAgc2NhbmxpbmVzLCAoSkRJTUVOU0lPTikgbWF4X2xpbmVzKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3JlYWRfcmF3X2RhdGEoSlBFR1N0YXRlKiBzcCwgSlNBTVBJTUFHRSBkYXRhLCBpbnQgbWF4X2xpbmVzKQoreworCXJldHVybiBDQUxMSlBFRyhzcCwgLTEsIChpbnQpIGpwZWdfcmVhZF9yYXdfZGF0YSgmc3AtPmNpbmZvLmQsCisJICAgIGRhdGEsIChKRElNRU5TSU9OKSBtYXhfbGluZXMpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfZmluaXNoX2RlY29tcHJlc3MoSlBFR1N0YXRlKiBzcCkKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIC0xLCAoaW50KSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZzcC0+Y2luZm8uZCkpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19hYm9ydChKUEVHU3RhdGUqIHNwKQoreworCXJldHVybiBDQUxMVkpQRUcoc3AsIGpwZWdfYWJvcnQoJnNwLT5jaW5mby5jb21tKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX2Rlc3Ryb3koSlBFR1N0YXRlKiBzcCkKK3sKKwlyZXR1cm4gQ0FMTFZKUEVHKHNwLCBqcGVnX2Rlc3Ryb3koJnNwLT5jaW5mby5jb21tKSk7Cit9CisKK3N0YXRpYyBKU0FNUEFSUkFZCitUSUZGanBlZ19hbGxvY19zYXJyYXkoSlBFR1N0YXRlKiBzcCwgaW50IHBvb2xfaWQsCisJCSAgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQoreworCXJldHVybiBDQUxMSlBFRyhzcCwgKEpTQU1QQVJSQVkpIE5VTEwsCisJICAgICgqc3AtPmNpbmZvLmNvbW0ubWVtLT5hbGxvY19zYXJyYXkpCisJCSgmc3AtPmNpbmZvLmNvbW0sIHBvb2xfaWQsIHNhbXBsZXNwZXJyb3csIG51bXJvd3MpKTsKK30KKworLyoKKyAqIEpQRUcgbGlicmFyeSBkZXN0aW5hdGlvbiBkYXRhIG1hbmFnZXIuCisgKiBUaGVzZSByb3V0aW5lcyBkaXJlY3QgY29tcHJlc3NlZCBkYXRhIGZyb20gbGlianBlZyBpbnRvIHRoZQorICogbGlidGlmZiBvdXRwdXQgYnVmZmVyLgorICovCisKK3N0YXRpYyB2b2lkCitzdGRfaW5pdF9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSopIGNpbmZvOworCVRJRkYqIHRpZiA9IHNwLT50aWY7CisKKwlzcC0+ZGVzdC5uZXh0X291dHB1dF9ieXRlID0gKEpPQ1RFVCopIHRpZi0+dGlmX3Jhd2RhdGE7CisJc3AtPmRlc3QuZnJlZV9pbl9idWZmZXIgPSAoc2l6ZV90KSB0aWYtPnRpZl9yYXdkYXRhc2l6ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK3N0ZF9lbXB0eV9vdXRwdXRfYnVmZmVyKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworCUpQRUdTdGF0ZSogc3AgPSAoSlBFR1N0YXRlKikgY2luZm87CisJVElGRiogdGlmID0gc3AtPnRpZjsKKworCS8qIHRoZSBlbnRpcmUgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZCAqLworCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemU7CisKKyNpZmRlZiBJUFBKX0hVRkYKKyAgICAgICAvKgorICAgICAgICAqIFRoZSBJbnRlbCBJUFAgcGVyZm9ybWFuY2UgbGlicmFyeSBkb2VzIG5vdCBuZWNlc3NhcmlseSBmaWxsIHVwCisgICAgICAgICogdGhlIHdob2xlIG91dHB1dCBidWZmZXIgb24gZWFjaCBwYXNzLCBzbyBvbmx5IGR1bXAgb3V0IHRoZSBwYXJ0cworICAgICAgICAqIHRoYXQgaGF2ZSBiZWVuIGZpbGxlZC4KKyAgICAgICAgKiAgIGh0dHA6Ly90cmFjLm9zZ2VvLm9yZy9nZGFsL3dpa2kvSnBlZ0lQUAorICAgICAgICAqLworICAgICAgIGlmICggc3AtPmRlc3QuZnJlZV9pbl9idWZmZXIgPj0gMCApIHsKKyAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBzcC0+ZGVzdC5mcmVlX2luX2J1ZmZlcjsKKyAgICAgICB9CisjZW5kaWYKKworCVRJRkZGbHVzaERhdGExKHRpZik7CisJc3AtPmRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IChKT0NURVQqKSB0aWYtPnRpZl9yYXdkYXRhOworCXNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyID0gKHNpemVfdCkgdGlmLT50aWZfcmF3ZGF0YXNpemU7CisKKwlyZXR1cm4gKFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorc3RkX3Rlcm1fZGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKwlUSUZGKiB0aWYgPSBzcC0+dGlmOworCisJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBzcC0+ZGVzdC5uZXh0X291dHB1dF9ieXRlOworCXRpZi0+dGlmX3Jhd2NjID0KKwkgICAgdGlmLT50aWZfcmF3ZGF0YXNpemUgLSAodG1zaXplX3QpIHNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyOworCS8qIE5COiBsaWJ0aWZmIGRvZXMgdGhlIGZpbmFsIGJ1ZmZlciBmbHVzaCAqLworfQorCitzdGF0aWMgdm9pZAorVElGRmpwZWdfZGF0YV9kZXN0KEpQRUdTdGF0ZSogc3AsIFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXNwLT5jaW5mby5jLmRlc3QgPSAmc3AtPmRlc3Q7CisJc3AtPmRlc3QuaW5pdF9kZXN0aW5hdGlvbiA9IHN0ZF9pbml0X2Rlc3RpbmF0aW9uOworCXNwLT5kZXN0LmVtcHR5X291dHB1dF9idWZmZXIgPSBzdGRfZW1wdHlfb3V0cHV0X2J1ZmZlcjsKKwlzcC0+ZGVzdC50ZXJtX2Rlc3RpbmF0aW9uID0gc3RkX3Rlcm1fZGVzdGluYXRpb247Cit9CisKKy8qCisgKiBBbHRlcm5hdGUgZGVzdGluYXRpb24gbWFuYWdlciBmb3Igb3V0cHV0dGluZyB0byBKUEVHVGFibGVzIGZpZWxkLgorICovCisKK3N0YXRpYyB2b2lkCit0YWJsZXNfaW5pdF9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSopIGNpbmZvOworCisJLyogd2hpbGUgYnVpbGRpbmcsIGpwZWd0YWJsZXNfbGVuZ3RoIGlzIGFsbG9jYXRlZCBidWZmZXIgc2l6ZSAqLworCXNwLT5kZXN0Lm5leHRfb3V0cHV0X2J5dGUgPSAoSk9DVEVUKikgc3AtPmpwZWd0YWJsZXM7CisJc3AtPmRlc3QuZnJlZV9pbl9idWZmZXIgPSAoc2l6ZV90KSBzcC0+anBlZ3RhYmxlc19sZW5ndGg7Cit9CisKK3N0YXRpYyBib29sZWFuCit0YWJsZXNfZW1wdHlfb3V0cHV0X2J1ZmZlcihqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSopIGNpbmZvOworCXZvaWQqIG5ld2J1ZjsKKworCS8qIHRoZSBlbnRpcmUgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZDsgZW5sYXJnZSBpdCBieSAxMDAwIGJ5dGVzICovCisJbmV3YnVmID0gX1RJRkZyZWFsbG9jKCh2b2lkKikgc3AtPmpwZWd0YWJsZXMsCisJCQkgICAgICAodG1zaXplX3QpIChzcC0+anBlZ3RhYmxlc19sZW5ndGggKyAxMDAwKSk7CisJaWYgKG5ld2J1ZiA9PSBOVUxMKQorCQlFUlJFWElUMShjaW5mbywgSkVSUl9PVVRfT0ZfTUVNT1JZLCAxMDApOworCXNwLT5kZXN0Lm5leHRfb3V0cHV0X2J5dGUgPSAoSk9DVEVUKikgbmV3YnVmICsgc3AtPmpwZWd0YWJsZXNfbGVuZ3RoOworCXNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyID0gKHNpemVfdCkgMTAwMDsKKwlzcC0+anBlZ3RhYmxlcyA9IG5ld2J1ZjsKKwlzcC0+anBlZ3RhYmxlc19sZW5ndGggKz0gMTAwMDsKKwlyZXR1cm4gKFRSVUUpOworfQorCitzdGF0aWMgdm9pZAordGFibGVzX3Rlcm1fZGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKworCS8qIHNldCB0YWJsZXMgbGVuZ3RoIHRvIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBlbWl0dGVkICovCisJc3AtPmpwZWd0YWJsZXNfbGVuZ3RoIC09ICh1aW50MzIpIHNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ190YWJsZXNfZGVzdChKUEVHU3RhdGUqIHNwLCBUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwkvKgorCSAqIEFsbG9jYXRlIGEgd29ya2luZyBidWZmZXIgZm9yIGJ1aWxkaW5nIHRhYmxlcy4KKwkgKiBJbml0aWFsIHNpemUgaXMgMTAwMCBieXRlcywgd2hpY2ggaXMgdXN1YWxseSBhZGVxdWF0ZS4KKwkgKi8KKwlpZiAoc3AtPmpwZWd0YWJsZXMpCisJCV9USUZGZnJlZShzcC0+anBlZ3RhYmxlcyk7CisJc3AtPmpwZWd0YWJsZXNfbGVuZ3RoID0gMTAwMDsKKwlzcC0+anBlZ3RhYmxlcyA9ICh2b2lkKikgX1RJRkZtYWxsb2MoKHRtc2l6ZV90KSBzcC0+anBlZ3RhYmxlc19sZW5ndGgpOworCWlmIChzcC0+anBlZ3RhYmxlcyA9PSBOVUxMKSB7CisJCXNwLT5qcGVndGFibGVzX2xlbmd0aCA9IDA7CisJCVRJRkZFcnJvckV4dChzcC0+dGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZqcGVnX3RhYmxlc19kZXN0IiwgIk5vIHNwYWNlIGZvciBKUEVHVGFibGVzIik7CisJCXJldHVybiAoMCk7CisJfQorCXNwLT5jaW5mby5jLmRlc3QgPSAmc3AtPmRlc3Q7CisJc3AtPmRlc3QuaW5pdF9kZXN0aW5hdGlvbiA9IHRhYmxlc19pbml0X2Rlc3RpbmF0aW9uOworCXNwLT5kZXN0LmVtcHR5X291dHB1dF9idWZmZXIgPSB0YWJsZXNfZW1wdHlfb3V0cHV0X2J1ZmZlcjsKKwlzcC0+ZGVzdC50ZXJtX2Rlc3RpbmF0aW9uID0gdGFibGVzX3Rlcm1fZGVzdGluYXRpb247CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEpQRUcgbGlicmFyeSBzb3VyY2UgZGF0YSBtYW5hZ2VyLgorICogVGhlc2Ugcm91dGluZXMgc3VwcGx5IGNvbXByZXNzZWQgZGF0YSB0byBsaWJqcGVnLgorICovCisKK3N0YXRpYyB2b2lkCitzdGRfaW5pdF9zb3VyY2Uoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSopIGNpbmZvOworCVRJRkYqIHRpZiA9IHNwLT50aWY7CisKKwlzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZSA9IChjb25zdCBKT0NURVQqKSB0aWYtPnRpZl9yYXdkYXRhOworCXNwLT5zcmMuYnl0ZXNfaW5fYnVmZmVyID0gKHNpemVfdCkgdGlmLT50aWZfcmF3Y2M7Cit9CisKK3N0YXRpYyBib29sZWFuCitzdGRfZmlsbF9pbnB1dF9idWZmZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSogKSBjaW5mbzsKKwlzdGF0aWMgY29uc3QgSk9DVEVUIGR1bW15X0VPSVsyXSA9IHsgMHhGRiwgSlBFR19FT0kgfTsKKworI2lmZGVmIElQUEpfSFVGRgorICAgICAgICAvKgorICAgICAgICAgKiBUaGUgSW50ZWwgSVBQIHBlcmZvcm1hbmNlIGxpYnJhcnkgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVhZCB0aGUgd2hvbGUKKyAgICAgICAgICogaW5wdXQgYnVmZmVyIGluIG9uZSBwYXNzLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBnZXQgaGVyZSB3aXRoIGRhdGEKKyAgICAgICAgICogeWV0IHRvIHJlYWQuIAorICAgICAgICAgKiAKKyAgICAgICAgICogV2UganVzdCByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZywgdW50aWwgdGhlIGVudGlyZSBidWZmZXIgaGFzCisgICAgICAgICAqIGJlZW4gcmVhZC4gIAorICAgICAgICAgKiBodHRwOi8vdHJhYy5vc2dlby5vcmcvZ2RhbC93aWtpL0pwZWdJUFAKKyAgICAgICAgICovCisgICAgICAgIGlmKCBzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlciA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gKFRSVUUpOworICAgICAgICB9CisjZW5kaWYKKworCS8qCisgICAgICAgICAqIE5vcm1hbGx5IHRoZSB3aG9sZSBzdHJpcC90aWxlIGlzIHJlYWQgYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8KKyAgICAgICAgICogYSBmaWxsLiAgSW4gdGhlIGNhc2Ugb2YgQ0hVTktZX1NUUklQX1JFQURfU1VQUE9SVCB3ZSBtaWdodCBub3QgaGF2ZQorICAgICAgICAgKiBhbGwgdGhlIGRhdGEsIGJ1dCB0aGUgcmF3ZGF0YSBpcyByZWZyZXNoZWQgYmV0d2VlbiBzY2FubGluZXMgYW5kCisgICAgICAgICAqIHdlIHB1c2ggdGhpcyBpbnRvIHRoZSBpbyBtYWNoaW5lcnkgaW4gSlBFR0RlY29kZSgpLiAJIAorICAgICAgICAgKiBodHRwOi8vdHJhYy5vc2dlby5vcmcvZ2RhbC90aWNrZXQvMzg5NAorCSAqLworICAgICAgICAKKwlXQVJOTVMoY2luZm8sIEpXUk5fSlBFR19FT0YpOworCS8qIGluc2VydCBhIGZha2UgRU9JIG1hcmtlciAqLworCXNwLT5zcmMubmV4dF9pbnB1dF9ieXRlID0gZHVtbXlfRU9JOworCXNwLT5zcmMuYnl0ZXNfaW5fYnVmZmVyID0gMjsKKwlyZXR1cm4gKFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorc3RkX3NraXBfaW5wdXRfZGF0YShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSopIGNpbmZvOworCisJaWYgKG51bV9ieXRlcyA+IDApIHsKKwkJaWYgKChzaXplX3QpbnVtX2J5dGVzID4gc3AtPnNyYy5ieXRlc19pbl9idWZmZXIpIHsKKwkJCS8qIG9vcHMsIGJ1ZmZlciBvdmVycnVuICovCisJCQkodm9pZCkgc3RkX2ZpbGxfaW5wdXRfYnVmZmVyKGNpbmZvKTsKKwkJfSBlbHNlIHsKKwkJCXNwLT5zcmMubmV4dF9pbnB1dF9ieXRlICs9IChzaXplX3QpIG51bV9ieXRlczsKKwkJCXNwLT5zcmMuYnl0ZXNfaW5fYnVmZmVyIC09IChzaXplX3QpIG51bV9ieXRlczsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3N0ZF90ZXJtX3NvdXJjZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworCS8qIE5vIHdvcmsgbmVjZXNzYXJ5IGhlcmUgKi8KKwkodm9pZCkgY2luZm87Cit9CisKK3N0YXRpYyB2b2lkCitUSUZGanBlZ19kYXRhX3NyYyhKUEVHU3RhdGUqIHNwLCBUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwlzcC0+Y2luZm8uZC5zcmMgPSAmc3AtPnNyYzsKKwlzcC0+c3JjLmluaXRfc291cmNlID0gc3RkX2luaXRfc291cmNlOworCXNwLT5zcmMuZmlsbF9pbnB1dF9idWZmZXIgPSBzdGRfZmlsbF9pbnB1dF9idWZmZXI7CisJc3AtPnNyYy5za2lwX2lucHV0X2RhdGEgPSBzdGRfc2tpcF9pbnB1dF9kYXRhOworCXNwLT5zcmMucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OworCXNwLT5zcmMudGVybV9zb3VyY2UgPSBzdGRfdGVybV9zb3VyY2U7CisJc3AtPnNyYy5ieXRlc19pbl9idWZmZXIgPSAwOwkJLyogZm9yIHNhZmV0eSAqLworCXNwLT5zcmMubmV4dF9pbnB1dF9ieXRlID0gTlVMTDsKK30KKworLyoKKyAqIEFsdGVybmF0ZSBzb3VyY2UgbWFuYWdlciBmb3IgcmVhZGluZyBmcm9tIEpQRUdUYWJsZXMuCisgKiBXZSBjYW4gc2hhcmUgYWxsIHRoZSBjb2RlIGV4Y2VwdCBmb3IgdGhlIGluaXQgcm91dGluZS4KKyAqLworCitzdGF0aWMgdm9pZAordGFibGVzX2luaXRfc291cmNlKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKworCXNwLT5zcmMubmV4dF9pbnB1dF9ieXRlID0gKGNvbnN0IEpPQ1RFVCopIHNwLT5qcGVndGFibGVzOworCXNwLT5zcmMuYnl0ZXNfaW5fYnVmZmVyID0gKHNpemVfdCkgc3AtPmpwZWd0YWJsZXNfbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZAorVElGRmpwZWdfdGFibGVzX3NyYyhKUEVHU3RhdGUqIHNwLCBUSUZGKiB0aWYpCit7CisJVElGRmpwZWdfZGF0YV9zcmMoc3AsIHRpZik7CisJc3AtPnNyYy5pbml0X3NvdXJjZSA9IHRhYmxlc19pbml0X3NvdXJjZTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGRvd25zYW1wbGVkLWRhdGEgYnVmZmVycyBuZWVkZWQgZm9yIGRvd25zYW1wbGVkIEkvTy4KKyAqIFdlIHVzZSB2YWx1ZXMgY29tcHV0ZWQgaW4ganBlZ19zdGFydF9jb21wcmVzcyBvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCisgKiBXZSB1c2UgbGlianBlZydzIGFsbG9jYXRvciBzbyB0aGF0IGJ1ZmZlcnMgd2lsbCBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5CisgKiB3aGVuIGRvbmUgd2l0aCBzdHJpcC90aWxlLgorICogVGhpcyBpcyBhbHNvIGEgaGFuZHkgcGxhY2UgdG8gY29tcHV0ZSBzYW1wbGVzcGVyY2x1bXAsIGJ5dGVzcGVybGluZS4KKyAqLworc3RhdGljIGludAorYWxsb2NfZG93bnNhbXBsZWRfYnVmZmVycyhUSUZGKiB0aWYsIGpwZWdfY29tcG9uZW50X2luZm8qIGNvbXBfaW5mbywKKwkJCSAgaW50IG51bV9jb21wb25lbnRzKQoreworCUpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKwlpbnQgY2k7CisJanBlZ19jb21wb25lbnRfaW5mbyogY29tcHB0cjsKKwlKU0FNUEFSUkFZIGJ1ZjsKKwlpbnQgc2FtcGxlc19wZXJfY2x1bXAgPSAwOworCisJZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjb21wX2luZm87IGNpIDwgbnVtX2NvbXBvbmVudHM7CisJICAgICBjaSsrLCBjb21wcHRyKyspIHsKKwkJc2FtcGxlc19wZXJfY2x1bXAgKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqCisJCQljb21wcHRyLT52X3NhbXBfZmFjdG9yOworCQlidWYgPSBUSUZGanBlZ19hbGxvY19zYXJyYXkoc3AsIEpQT09MX0lNQUdFLAorCQkJCWNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJCQkJKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuICgwKTsKKwkJc3AtPmRzX2J1ZmZlcltjaV0gPSBidWY7CisJfQorCXNwLT5zYW1wbGVzcGVyY2x1bXAgPSBzYW1wbGVzX3Blcl9jbHVtcDsKKwlyZXR1cm4gKDEpOworfQorCisKKy8qCisgKiBKUEVHIERlY29kaW5nLgorICovCisKKyNpZmRlZiBDSEVDS19KUEVHX1lDQkNSX1NVQlNBTVBMSU5HCisKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09GMCAweEMwCisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPRjEgMHhDMQorI2RlZmluZSBKUEVHX01BUktFUl9TT0YzIDB4QzMKKyNkZWZpbmUgSlBFR19NQVJLRVJfREhUIDB4QzQKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09JIDB4RDgKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09TIDB4REEKKyNkZWZpbmUgSlBFR19NQVJLRVJfRFFUIDB4REIKKyNkZWZpbmUgSlBFR19NQVJLRVJfRFJJIDB4REQKKyNkZWZpbmUgSlBFR19NQVJLRVJfQVBQMCAweEUwCisjZGVmaW5lIEpQRUdfTUFSS0VSX0NPTSAweEZFCitzdHJ1Y3QgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nRGF0YQoreworCVRJRkYqIHRpZjsKKwl2b2lkKiBidWZmZXI7CisJdWludDMyIGJ1ZmZlcnNpemU7CisJdWludDgqIGJ1ZmZlcmN1cnJlbnRieXRlOworCXVpbnQzMiBidWZmZXJieXRlc2xlZnQ7CisJdWludDY0IGZpbGVvZmZzZXQ7CisJdWludDY0IGZpbGVieXRlc2xlZnQ7CisJdWludDggZmlsZXBvc2l0aW9uZWQ7Cit9Oworc3RhdGljIHZvaWQgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NlYyhzdHJ1Y3QgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nRGF0YSogZGF0YSk7CitzdGF0aWMgaW50IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRCeXRlKHN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhKiBkYXRhLCB1aW50OCogcmVzdWx0KTsKK3N0YXRpYyBpbnQgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZFdvcmQoc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEqIGRhdGEsIHVpbnQxNiogcmVzdWx0KTsKK3N0YXRpYyB2b2lkIEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NraXAoc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEqIGRhdGEsIHVpbnQxNiBza2lwbGVuZ3RoKTsKKworI2VuZGlmCisKK3N0YXRpYyBpbnQKK0pQRUdGaXh1cFRhZ3MoVElGRiogdGlmKQoreworI2lmZGVmIENIRUNLX0pQRUdfWUNCQ1JfU1VCU0FNUExJTkcKKwlpZiAoKHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfWUNCQ1IpJiYKKwkgICAgKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWc9PVBMQU5BUkNPTkZJR19DT05USUcpJiYKKwkgICAgKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw9PTMpKQorCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmcodGlmKTsKKyNlbmRpZgorICAgICAgICAKKwlyZXR1cm4oMSk7Cit9CisKKyNpZmRlZiBDSEVDS19KUEVHX1lDQkNSX1NVQlNBTVBMSU5HCisKK3N0YXRpYyB2b2lkCitKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmcoVElGRiogdGlmKQoreworCS8qCisJICogU29tZSBKUEVHLWluLVRJRkYgcHJvZHVjZXMgZG8gbm90IGVtaXQgdGhlIFlDQkNSU1VCU0FNUExJTkcgdmFsdWVzIGluCisJICogdGhlIFRJRkYgdGFncywgYnV0IHN0aWxsIHVzZSBub24tZGVmYXVsdCAoMiwyKSB2YWx1ZXMgd2l0aGluIHRoZSBqcGVnCisJICogZGF0YSBzdHJlYW0gaXRzZWxmLiAgSW4gb3JkZXIgZm9yIFRJRkYgYXBwbGljYXRpb25zIHRvIHdvcmsgcHJvcGVybHkKKwkgKiAtIGZvciBpbnN0YW5jZSB0byBnZXQgdGhlIHN0cmlwIGJ1ZmZlciBzaXplIHJpZ2h0IC0gaXQgaXMgaW1wZXJhdGl2ZQorCSAqIHRoYXQgdGhlIHN1YnNhbXBsaW5nIGJlIGF2YWlsYWJsZSBiZWZvcmUgd2Ugc3RhcnQgcmVhZGluZyB0aGUgaW1hZ2UKKwkgKiBkYXRhIG5vcm1hbGx5LiAgVGhpcyBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gYW5hbHl6ZSB0aGUgZmlyc3Qgc3RyaXAgaW4KKwkgKiBvcmRlciB0byBnZXQgdGhlIHNhbXBsaW5nIHZhbHVlcyBmcm9tIHRoZSBqcGVnIGRhdGEgc3RyZWFtLgorCSAqCisJICogTm90ZSB0aGF0IEpQRUdQcmVEZW9jb2RlKCkgd2lsbCBwcm9kdWNlIGEgZmFpcmx5IGxvdWQgd2FybmluZyB3aGVuIHRoZQorCSAqIGRpc2NvdmVyZWQgc2FtcGxpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIGRlZmF1bHQgc2FtcGxpbmcgKDIsMikgb3Igd2hhdGV2ZXIKKwkgKiB3YXMgYWN0dWFsbHkgaW4gdGhlIHRpZmYgdGFncy4KKwkgKgorCSAqIFNlZSB0aGUgYnVnIGluIGJ1Z3ppbGxhIGZvciBkZXRhaWxzOgorCSAqCisJICogaHR0cDovL2J1Z3ppbGxhLnJlbW90ZXNlbnNpbmcub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjgKKwkgKgorCSAqIEZyYW5rIFdhcm1lcmRhbSwgSnVseSAyMDAyCisJICogSm9yaXMgVmFuIERhbW1lLCBNYXkgMjAwNworCSAqLworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZyI7CisJc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEgbTsKKworICAgICAgICBfVElGRkZpbGxTdHJpbGVzKCB0aWYgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQgPT0gTlVMTAorICAgICAgICAgICAgfHwgdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzBdID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEbyBub3QgZXZlbiB0cnkgdG8gY2hlY2sgaWYgdGhlIGZpcnN0IHN0cmlwL3RpbGUgZG9lcyBub3QKKyAgICAgICAgICAgICAgIHlldCBleGlzdCwgYXMgb2NjdXJzIHdoZW4gR0RBTCBoYXMgY3JlYXRlZCBhIG5ldyBOVUxMIGZpbGUKKyAgICAgICAgICAgICAgIGZvciBpbnN0YW5jZS4gKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisJbS50aWY9dGlmOworCW0uYnVmZmVyc2l6ZT0yMDQ4OworCW0uYnVmZmVyPV9USUZGbWFsbG9jKG0uYnVmZmVyc2l6ZSk7CisJaWYgKG0uYnVmZmVyPT1OVUxMKQorCXsKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYXV0by1jb3JyZWN0aW5nIG9mIHN1YnNhbXBsaW5nIHZhbHVlczsgYXV0by1jb3JyZWN0aW5nIHNraXBwZWQiKTsKKwkJcmV0dXJuOworCX0KKwltLmJ1ZmZlcmN1cnJlbnRieXRlPU5VTEw7CisJbS5idWZmZXJieXRlc2xlZnQ9MDsKKwltLmZpbGVvZmZzZXQ9dGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0WzBdOworCW0uZmlsZXBvc2l0aW9uZWQ9MDsKKwltLmZpbGVieXRlc2xlZnQ9dGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzBdOworCWlmICghSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nU2VjKCZtKSkKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCSAgICAiVW5hYmxlIHRvIGF1dG8tY29ycmVjdCBzdWJzYW1wbGluZyB2YWx1ZXMsIGxpa2VseSBjb3JydXB0IEpQRUcgY29tcHJlc3NlZCBkYXRhIGluIGZpcnN0IHN0cmlwL3RpbGU7IGF1dG8tY29ycmVjdGluZyBza2lwcGVkIik7CisJX1RJRkZmcmVlKG0uYnVmZmVyKTsKK30KKworc3RhdGljIGludAorSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nU2VjKHN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhKiBkYXRhKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NlYyI7CisJdWludDggbTsKKwl3aGlsZSAoMSkKKwl7CisJCXdoaWxlICgxKQorCQl7CisJCQlpZiAoIUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRCeXRlKGRhdGEsJm0pKQorCQkJCXJldHVybigwKTsKKwkJCWlmIChtPT0yNTUpCisJCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKDEpCisJCXsKKwkJCWlmICghSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZEJ5dGUoZGF0YSwmbSkpCisJCQkJcmV0dXJuKDApOworCQkJaWYgKG0hPTI1NSkKKwkJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKG0pCisJCXsKKwkJCWNhc2UgSlBFR19NQVJLRVJfU09JOgorCQkJCS8qIHRoaXMgdHlwZSBvZiBtYXJrZXIgaGFzIG5vIGRhdGEgYW5kIHNob3VsZCBiZSBza2lwcGVkICovCisJCQkJYnJlYWs7CisJCQljYXNlIEpQRUdfTUFSS0VSX0NPTToKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMDoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzI6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMzoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs0OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzU6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArNjoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs3OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzg6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArOToKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxMDoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxMToKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxMjoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxMzoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxNDoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsxNToKKwkJCWNhc2UgSlBFR19NQVJLRVJfRFFUOgorCQkJY2FzZSBKUEVHX01BUktFUl9TT1M6CisJCQljYXNlIEpQRUdfTUFSS0VSX0RIVDoKKwkJCWNhc2UgSlBFR19NQVJLRVJfRFJJOgorCQkJCS8qIHRoaXMgdHlwZSBvZiBtYXJrZXIgaGFzIGRhdGEsIGJ1dCBpdCBoYXMgbm8gdXNlIHRvIHVzIGFuZCBzaG91bGQgYmUgc2tpcHBlZCAqLworCQkJCXsKKwkJCQkJdWludDE2IG47CisJCQkJCWlmICghSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZFdvcmQoZGF0YSwmbikpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCWlmIChuPDIpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCW4tPTI7CisJCQkJCWlmIChuPjApCisJCQkJCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKGRhdGEsbik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9TT0YwOgorCQkJY2FzZSBKUEVHX01BUktFUl9TT0YxOgorCQkJCS8qIHRoaXMgbWFya2VyIGNvbnRhaW5zIHRoZSBzdWJzYW1wbGluZyBmYWN0b3JzIHdlJ3JlIHNjYW5uaW5nIGZvciAqLworCQkJCXsKKwkJCQkJdWludDE2IG47CisJCQkJCXVpbnQxNiBvOworCQkJCQl1aW50OCBwOworCQkJCQl1aW50OCBwaCxwdjsKKwkJCQkJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkV29yZChkYXRhLCZuKSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJaWYgKG4hPTgrZGF0YS0+dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCozKQorCQkJCQkJcmV0dXJuKDApOworCQkJCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKGRhdGEsNyk7CisJCQkJCWlmICghSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZEJ5dGUoZGF0YSwmcCkpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCXBoPShwPj40KTsKKwkJCQkJcHY9KHAmMTUpOworCQkJCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKGRhdGEsMSk7CisJCQkJCWZvciAobz0xOyBvPGRhdGEtPnRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7IG8rKykKKwkJCQkJeworCQkJCQkJSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nU2tpcChkYXRhLDEpOworCQkJCQkJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkQnl0ZShkYXRhLCZwKSkKKwkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCQlpZiAocCE9MHgxMSkKKwkJCQkJCXsKKwkJCQkJCQlUSUZGV2FybmluZ0V4dChkYXRhLT50aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkJCQkgICAgIlN1YnNhbXBsaW5nIHZhbHVlcyBpbnNpZGUgSlBFRyBjb21wcmVzc2VkIGRhdGEgaGF2ZSBubyBUSUZGIGVxdWl2YWxlbnQsIGF1dG8tY29ycmVjdGlvbiBvZiBUSUZGIHN1YnNhbXBsaW5nIHZhbHVlcyBmYWlsZWQiKTsKKwkJCQkJCQlyZXR1cm4oMSk7CisJCQkJCQl9CisJCQkJCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKGRhdGEsMSk7CisJCQkJCX0KKwkJCQkJaWYgKCgocGghPTEpJiYocGghPTIpJiYocGghPTQpKXx8KChwdiE9MSkmJihwdiE9MikmJihwdiE9NCkpKQorCQkJCQl7CisJCQkJCQlUSUZGV2FybmluZ0V4dChkYXRhLT50aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkJCSAgICAiU3Vic2FtcGxpbmcgdmFsdWVzIGluc2lkZSBKUEVHIGNvbXByZXNzZWQgZGF0YSBoYXZlIG5vIFRJRkYgZXF1aXZhbGVudCwgYXV0by1jb3JyZWN0aW9uIG9mIFRJRkYgc3Vic2FtcGxpbmcgdmFsdWVzIGZhaWxlZCIpOworCQkJCQkJcmV0dXJuKDEpOworCQkJCQl9CisJCQkJCWlmICgocGghPWRhdGEtPnRpZi0+dGlmX2Rpci50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdKXx8KHB2IT1kYXRhLT50aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1sxXSkpCisJCQkJCXsKKwkJCQkJCVRJRkZXYXJuaW5nRXh0KGRhdGEtPnRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCQkJICAgICJBdXRvLWNvcnJlY3RlZCBmb3JtZXIgVElGRiBzdWJzYW1wbGluZyB2YWx1ZXMgWyVkLCVkXSB0byBtYXRjaCBzdWJzYW1wbGluZyB2YWx1ZXMgaW5zaWRlIEpQRUcgY29tcHJlc3NlZCBkYXRhIFslZCwlZF0iLAorCQkJCQkJICAgIChpbnQpZGF0YS0+dGlmLT50aWZfZGlyLnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0sCisJCQkJCQkgICAgKGludClkYXRhLT50aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1sxXSwKKwkJCQkJCSAgICAoaW50KXBoLChpbnQpcHYpOworCQkJCQkJZGF0YS0+dGlmLT50aWZfZGlyLnRkX3ljYmNyc3Vic2FtcGxpbmdbMF09cGg7CisJCQkJCQlkYXRhLT50aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1sxXT1wdjsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4oMSk7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybigwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZEJ5dGUoc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEqIGRhdGEsIHVpbnQ4KiByZXN1bHQpCit7CisJaWYgKGRhdGEtPmJ1ZmZlcmJ5dGVzbGVmdD09MCkKKwl7CisJCXVpbnQzMiBtOworCQlpZiAoZGF0YS0+ZmlsZWJ5dGVzbGVmdD09MCkKKwkJCXJldHVybigwKTsKKwkJaWYgKCFkYXRhLT5maWxlcG9zaXRpb25lZCkKKwkJeworCQkJVElGRlNlZWtGaWxlKGRhdGEtPnRpZixkYXRhLT5maWxlb2Zmc2V0LFNFRUtfU0VUKTsKKwkJCWRhdGEtPmZpbGVwb3NpdGlvbmVkPTE7CisJCX0KKwkJbT1kYXRhLT5idWZmZXJzaXplOworCQlpZiAoKHVpbnQ2NCltPmRhdGEtPmZpbGVieXRlc2xlZnQpCisJCQltPSh1aW50MzIpZGF0YS0+ZmlsZWJ5dGVzbGVmdDsKKwkJYXNzZXJ0KG08MHg4MDAwMDAwMFVMKTsKKwkJaWYgKFRJRkZSZWFkRmlsZShkYXRhLT50aWYsZGF0YS0+YnVmZmVyLCh0bXNpemVfdCltKSE9KHRtc2l6ZV90KW0pCisJCQlyZXR1cm4oMCk7CisJCWRhdGEtPmJ1ZmZlcmN1cnJlbnRieXRlPWRhdGEtPmJ1ZmZlcjsKKwkJZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0PW07CisJCWRhdGEtPmZpbGVvZmZzZXQrPW07CisJCWRhdGEtPmZpbGVieXRlc2xlZnQtPW07CisJfQorCSpyZXN1bHQ9KmRhdGEtPmJ1ZmZlcmN1cnJlbnRieXRlOworCWRhdGEtPmJ1ZmZlcmN1cnJlbnRieXRlKys7CisJZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0LS07CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkV29yZChzdHJ1Y3QgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nRGF0YSogZGF0YSwgdWludDE2KiByZXN1bHQpCit7CisJdWludDggbWE7CisJdWludDggbWI7CisJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkQnl0ZShkYXRhLCZtYSkpCisJCXJldHVybigwKTsKKwlpZiAoIUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRCeXRlKGRhdGEsJm1iKSkKKwkJcmV0dXJuKDApOworCSpyZXN1bHQ9KG1hPDw4KXxtYjsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKHN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhKiBkYXRhLCB1aW50MTYgc2tpcGxlbmd0aCkKK3sKKwlpZiAoKHVpbnQzMilza2lwbGVuZ3RoPD1kYXRhLT5idWZmZXJieXRlc2xlZnQpCisJeworCQlkYXRhLT5idWZmZXJjdXJyZW50Ynl0ZSs9c2tpcGxlbmd0aDsKKwkJZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0LT1za2lwbGVuZ3RoOworCX0KKwllbHNlCisJeworCQl1aW50MTYgbTsKKwkJbT1za2lwbGVuZ3RoLWRhdGEtPmJ1ZmZlcmJ5dGVzbGVmdDsKKwkJaWYgKG08PWRhdGEtPmZpbGVieXRlc2xlZnQpCisJCXsKKwkJCWRhdGEtPmJ1ZmZlcmJ5dGVzbGVmdD0wOworCQkJZGF0YS0+ZmlsZW9mZnNldCs9bTsKKwkJCWRhdGEtPmZpbGVieXRlc2xlZnQtPW07CisJCQlkYXRhLT5maWxlcG9zaXRpb25lZD0wOworCQl9CisJCWVsc2UKKwkJeworCQkJZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0PTA7CisJCQlkYXRhLT5maWxlYnl0ZXNsZWZ0PTA7CisJCX0KKwl9Cit9CisKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQKK0pQRUdTZXR1cERlY29kZShUSUZGKiB0aWYpCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworI2lmIGRlZmluZWQoSlBFR19EVUFMX01PREVfOF8xMikgJiYgIWRlZmluZWQoVElGRkluaXRKUEVHKQorICAgICAgICBpZiggdGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUgPT0gMTIgKQorICAgICAgICAgICAgcmV0dXJuIFRJRkZSZUluaXRKUEVHXzEyKCB0aWYsIENPTVBSRVNTSU9OX0pQRUcsIDAgKTsKKyNlbmRpZgorCisJSlBFR0luaXRpYWxpemVMaWJKUEVHKCB0aWYsIFRSVUUgKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlhc3NlcnQoc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yKTsKKworCS8qIFJlYWQgSlBFR1RhYmxlcyBpZiBpdCBpcyBwcmVzZW50ICovCisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSlBFR1RBQkxFUykpIHsKKwkJVElGRmpwZWdfdGFibGVzX3NyYyhzcCwgdGlmKTsKKwkJaWYoVElGRmpwZWdfcmVhZF9oZWFkZXIoc3AsRkFMU0UpICE9IEpQRUdfSEVBREVSX1RBQkxFU19PTkxZKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIkpQRUdTZXR1cERlY29kZSIsICJCb2d1cyBKUEVHVGFibGVzIGZpZWxkIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJLyogR3JhYiBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNhbWUgZm9yIGFsbCBzdHJpcHMvdGlsZXMgKi8KKwlzcC0+cGhvdG9tZXRyaWMgPSB0ZC0+dGRfcGhvdG9tZXRyaWM7CisJc3dpdGNoIChzcC0+cGhvdG9tZXRyaWMpIHsKKwljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorCQlzcC0+aF9zYW1wbGluZyA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdOworCQlzcC0+dl9zYW1wbGluZyA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBUSUZGIDYuMCBmb3JiaWRzIHN1YnNhbXBsaW5nIG9mIGFsbCBvdGhlciBjb2xvciBzcGFjZXMgKi8KKwkJc3AtPmhfc2FtcGxpbmcgPSAxOworCQlzcC0+dl9zYW1wbGluZyA9IDE7CisJCWJyZWFrOworCX0KKworCS8qIFNldCB1cCBmb3IgcmVhZGluZyBub3JtYWwgZGF0YSAqLworCVRJRkZqcGVnX2RhdGFfc3JjKHNwLCB0aWYpOworCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsgLyogb3ZlcnJpZGUgYnl0ZSBzd2FwcGluZyAqLworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXQgdXAgZm9yIGRlY29kaW5nIGEgc3RyaXAgb3IgdGlsZS4KKyAqLworc3RhdGljIGludAorSlBFR1ByZURlY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiSlBFR1ByZURlY29kZSI7CisJdWludDMyIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0OworCWludCBkb3duc2FtcGxlZF9vdXRwdXQ7CisJaW50IGNpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworICAKKwlpZiAoc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yID09IDApCisJeworCQl0aWYtPnRpZl9zZXR1cGRlY29kZSggdGlmICk7CisJfQorICAKKwlhc3NlcnQoc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yKTsKKwkvKgorCSAqIFJlc2V0IGRlY29kZXIgc3RhdGUgZnJvbSBhbnkgcHJldmlvdXMgc3RyaXAvdGlsZSwKKwkgKiBpbiBjYXNlIGFwcGxpY2F0aW9uIGRpZG4ndCByZWFkIHRoZSB3aG9sZSBzdHJpcC4KKwkgKi8KKwlpZiAoIVRJRkZqcGVnX2Fib3J0KHNwKSkKKwkJcmV0dXJuICgwKTsKKwkvKgorCSAqIFJlYWQgdGhlIGhlYWRlciBmb3IgdGhpcyBzdHJpcC90aWxlLgorCSAqLworICAgICAgICAKKwlpZiAoVElGRmpwZWdfcmVhZF9oZWFkZXIoc3AsIFRSVUUpICE9IEpQRUdfSEVBREVSX09LKQorCQlyZXR1cm4gKDApOworCisgICAgICAgIHRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4Kikgc3AtPnNyYy5uZXh0X2lucHV0X2J5dGU7CisgICAgICAgIHRpZi0+dGlmX3Jhd2NjID0gc3AtPnNyYy5ieXRlc19pbl9idWZmZXI7CisKKwkvKgorCSAqIENoZWNrIGltYWdlIHBhcmFtZXRlcnMgYW5kIHNldCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCisJICovCisJc2VnbWVudF93aWR0aCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX2ltYWdlbGVuZ3RoIC0gdGlmLT50aWZfcm93OworCWlmIChpc1RpbGVkKHRpZikpIHsKKyAgICAgICAgICAgICAgICBzZWdtZW50X3dpZHRoID0gdGQtPnRkX3RpbGV3aWR0aDsKKyAgICAgICAgICAgICAgICBzZWdtZW50X2hlaWdodCA9IHRkLT50ZF90aWxlbGVuZ3RoOworCQlzcC0+Ynl0ZXNwZXJsaW5lID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisJfSBlbHNlIHsKKwkJaWYgKHNlZ21lbnRfaGVpZ2h0ID4gdGQtPnRkX3Jvd3NwZXJzdHJpcCkKKwkJCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJc3AtPmJ5dGVzcGVybGluZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwl9CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFICYmIHMgPiAwKSB7CisJCS8qCisJCSAqIEZvciBQQyAyLCBzY2FsZSBkb3duIHRoZSBleHBlY3RlZCBzdHJpcC90aWxlIHNpemUKKwkJICogdG8gbWF0Y2ggYSBkb3duc2FtcGxlZCBjb21wb25lbnQKKwkJICovCisJCXNlZ21lbnRfd2lkdGggPSBUSUZGaG93bWFueV8zMihzZWdtZW50X3dpZHRoLCBzcC0+aF9zYW1wbGluZyk7CisJCXNlZ21lbnRfaGVpZ2h0ID0gVElGRmhvd21hbnlfMzIoc2VnbWVudF9oZWlnaHQsIHNwLT52X3NhbXBsaW5nKTsKKwl9CisJaWYgKHNwLT5jaW5mby5kLmltYWdlX3dpZHRoIDwgc2VnbWVudF93aWR0aCB8fAorCSAgICBzcC0+Y2luZm8uZC5pbWFnZV9oZWlnaHQgPCBzZWdtZW50X2hlaWdodCkgeworCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICAgIkltcHJvcGVyIEpQRUcgc3RyaXAvdGlsZSBzaXplLCAiCisJCQkgICAgICAgImV4cGVjdGVkICVkeCVkLCBnb3QgJWR4JWQiLAorCQkJICAgICAgIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0LAorCQkJICAgICAgIHNwLT5jaW5mby5kLmltYWdlX3dpZHRoLAorCQkJICAgICAgIHNwLT5jaW5mby5kLmltYWdlX2hlaWdodCk7CisJfSAKKwlpZiAoc3AtPmNpbmZvLmQuaW1hZ2Vfd2lkdGggPiBzZWdtZW50X3dpZHRoIHx8CisJICAgIHNwLT5jaW5mby5kLmltYWdlX2hlaWdodCA+IHNlZ21lbnRfaGVpZ2h0KSB7CisJCS8qCisJCSAqIFRoaXMgY2FzZSBjb3VsZCBiZSBkYW5nZXJvdXMsIGlmIHRoZSBzdHJpcCBvciB0aWxlIHNpemUgaGFzCisJCSAqIGJlZW4gcmVwb3J0ZWQgYXMgbGVzcyB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSBqcGVnIHdpbGwKKwkJICogcmV0dXJuLCBzb21lIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMgYXJpc2UuIENhdGNoIHRoaXMKKwkJICogY2FzZSBhbmQgZXJyb3Igb3V0LgorCQkgKi8KKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkpQRUcgc3RyaXAvdGlsZSBzaXplIGV4Y2VlZHMgZXhwZWN0ZWQgZGltZW5zaW9ucywiCisJCQkgICAgICIgZXhwZWN0ZWQgJWR4JWQsIGdvdCAlZHglZCIsCisJCQkgICAgIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0LAorCQkJICAgICBzcC0+Y2luZm8uZC5pbWFnZV93aWR0aCwgc3AtPmNpbmZvLmQuaW1hZ2VfaGVpZ2h0KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzICE9CisJICAgICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgPworCSAgICAgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA6IDEpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbXByb3BlciBKUEVHIGNvbXBvbmVudCBjb3VudCIpOworCQlyZXR1cm4gKDApOworCX0KKyNpZmRlZiBKUEVHX0xJQl9NSzEKKwlpZiAoMTIgIT0gdGQtPnRkX2JpdHNwZXJzYW1wbGUgJiYgOCAhPSB0ZC0+dGRfYml0c3BlcnNhbXBsZSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiSW1wcm9wZXIgSlBFRyBkYXRhIHByZWNpc2lvbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlzcC0+Y2luZm8uZC5kYXRhX3ByZWNpc2lvbiA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCXNwLT5jaW5mby5kLmJpdHNfaW5fanNhbXBsZSA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworI2Vsc2UKKwlpZiAoc3AtPmNpbmZvLmQuZGF0YV9wcmVjaXNpb24gIT0gdGQtPnRkX2JpdHNwZXJzYW1wbGUpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkltcHJvcGVyIEpQRUcgZGF0YSBwcmVjaXNpb24iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZW5kaWYKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisJCS8qIENvbXBvbmVudCAwIHNob3VsZCBoYXZlIGV4cGVjdGVkIHNhbXBsaW5nIGZhY3RvcnMgKi8KKwkJaWYgKHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IHNwLT5oX3NhbXBsaW5nIHx8CisJCSAgICBzcC0+Y2luZm8uZC5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciAhPSBzcC0+dl9zYW1wbGluZykgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgICAgIkltcHJvcGVyIEpQRUcgc2FtcGxpbmcgZmFjdG9ycyAlZCwlZFxuIgorCQkJCSAgICAgICAiQXBwYXJlbnRseSBzaG91bGQgYmUgJWQsJWQuIiwKKwkJCQkgICAgICAgc3AtPmNpbmZvLmQuY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IsCisJCQkJICAgICAgIHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yLAorCQkJCSAgICAgICBzcC0+aF9zYW1wbGluZywgc3AtPnZfc2FtcGxpbmcpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQkvKiBSZXN0IHNob3VsZCBoYXZlIHNhbXBsaW5nIGZhY3RvcnMgMSwxICovCisJCWZvciAoY2kgPSAxOyBjaSA8IHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJCQlpZiAoc3AtPmNpbmZvLmQuY29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKwkJCSAgICBzcC0+Y2luZm8uZC5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3IgIT0gMSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbXByb3BlciBKUEVHIHNhbXBsaW5nIGZhY3RvcnMiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogUEMgMidzIHNpbmdsZSBjb21wb25lbnQgc2hvdWxkIGhhdmUgc2FtcGxpbmcgZmFjdG9ycyAxLDEgKi8KKwkJaWYgKHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKwkJICAgIHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yICE9IDEpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbXByb3BlciBKUEVHIHNhbXBsaW5nIGZhY3RvcnMiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJZG93bnNhbXBsZWRfb3V0cHV0ID0gRkFMU0U7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyAmJgorCSAgICBzcC0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfWUNCQ1IgJiYKKwkgICAgc3AtPmpwZWdjb2xvcm1vZGUgPT0gSlBFR0NPTE9STU9ERV9SR0IpIHsKKwkJLyogQ29udmVydCBZQ2JDciB0byBSR0IgKi8KKwkJc3AtPmNpbmZvLmQuanBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKwkJc3AtPmNpbmZvLmQub3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKwl9IGVsc2UgeworCQkvKiBTdXBwcmVzcyBjb2xvcnNwYWNlIGhhbmRsaW5nICovCisJCXNwLT5jaW5mby5kLmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKwkJc3AtPmNpbmZvLmQub3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisJCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgJiYKKwkJICAgIChzcC0+aF9zYW1wbGluZyAhPSAxIHx8IHNwLT52X3NhbXBsaW5nICE9IDEpKQorCQkJZG93bnNhbXBsZWRfb3V0cHV0ID0gVFJVRTsKKwkJLyogWFhYIHdoYXQgYWJvdXQgdXAtc2FtcGxpbmc/ICovCisJfQorCWlmIChkb3duc2FtcGxlZF9vdXRwdXQpIHsKKwkJLyogTmVlZCB0byB1c2UgcmF3LWRhdGEgaW50ZXJmYWNlIHRvIGxpYmpwZWcgKi8KKwkJc3AtPmNpbmZvLmQucmF3X2RhdGFfb3V0ID0gVFJVRTsKKyNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDcwCisJCXNwLT5jaW5mby5kLmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKKyNlbmRpZiAvKiBKUEVHX0xJQl9WRVJTSU9OID49IDcwICovCisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IERlY29kZVJvd0Vycm9yOworCQl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEpQRUdEZWNvZGVSYXc7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBKUEVHRGVjb2RlUmF3OworCX0gZWxzZSB7CisJCS8qIFVzZSBub3JtYWwgaW50ZXJmYWNlIHRvIGxpYmpwZWcgKi8KKwkJc3AtPmNpbmZvLmQucmF3X2RhdGFfb3V0ID0gRkFMU0U7CisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IEpQRUdEZWNvZGU7CisJCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gSlBFR0RlY29kZTsKKwkJdGlmLT50aWZfZGVjb2RldGlsZSA9IEpQRUdEZWNvZGU7ICAKKwl9CisJLyogU3RhcnQgSlBFRyBkZWNvbXByZXNzb3IgKi8KKwlpZiAoIVRJRkZqcGVnX3N0YXJ0X2RlY29tcHJlc3Moc3ApKQorCQlyZXR1cm4gKDApOworCS8qIEFsbG9jYXRlIGRvd25zYW1wbGVkLWRhdGEgYnVmZmVycyBpZiBuZWVkZWQgKi8KKwlpZiAoZG93bnNhbXBsZWRfb3V0cHV0KSB7CisJCWlmICghYWxsb2NfZG93bnNhbXBsZWRfYnVmZmVycyh0aWYsIHNwLT5jaW5mby5kLmNvbXBfaW5mbywKKwkJCQkJICAgICAgIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzKSkKKwkJCXJldHVybiAoMCk7CisJCXNwLT5zY2FuY291bnQgPSBEQ1RTSVpFOwkvKiBtYXJrIGJ1ZmZlciBlbXB0eSAqLworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgY2h1bmsgb2YgcGl4ZWxzLgorICogIlN0YW5kYXJkIiBjYXNlOiByZXR1cm5lZCBkYXRhIGlzIG5vdCBkb3duc2FtcGxlZC4KKyAqLworLypBUkdTVVNFRCovIHN0YXRpYyBpbnQKK0pQRUdEZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCXRtc2l6ZV90IG5yb3dzOworCSh2b2lkKSBzOworCisgICAgICAgIC8qCisgICAgICAgICoqIFVwZGF0ZSBhdmFpbGFibGUgaW5mb3JtYXRpb24sIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIHJlZmlsbGVkCisgICAgICAgICoqIGJldHdlZW4gZGVjb2RlIHJlcXVlc3RzCisgICAgICAgICovCisJc3AtPnNyYy5uZXh0X2lucHV0X2J5dGUgPSAoY29uc3QgSk9DVEVUKikgdGlmLT50aWZfcmF3Y3A7CisJc3AtPnNyYy5ieXRlc19pbl9idWZmZXIgPSAoc2l6ZV90KSB0aWYtPnRpZl9yYXdjYzsKKworICAgICAgICBpZiggc3AtPmJ5dGVzcGVybGluZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisJbnJvd3MgPSBjYyAvIHNwLT5ieXRlc3BlcmxpbmU7CisJaWYgKGNjICUgc3AtPmJ5dGVzcGVybGluZSkKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwgImZyYWN0aW9uYWwgc2NhbmxpbmUgbm90IHJlYWQiKTsKKworCWlmKCBucm93cyA+ICh0bXNpemVfdCkgc3AtPmNpbmZvLmQuaW1hZ2VfaGVpZ2h0ICkKKwkJbnJvd3MgPSBzcC0+Y2luZm8uZC5pbWFnZV9oZWlnaHQ7CisKKwkvKiBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIHJlYWQgaW4gbXVsdGlwbGVzIG9mIGEgc2NhbmxpbmUgKi8KKwlpZiAobnJvd3MpCisJeworCQlKU0FNUFJPVyBsaW5lX3dvcmtfYnVmID0gTlVMTDsKKworCQkvKgorCQkgKiBGb3IgNkIsIG9ubHkgdXNlIHRlbXBvcmFyeSBidWZmZXIgZm9yIDEyIGJpdCBpbWFnZXJ5LgorCQkgKiBGb3IgTWsxIGFsd2F5cyB1c2UgaXQuCisJCSAqLworI2lmICFkZWZpbmVkKEpQRUdfTElCX01LMSkKKwkJaWYoIHNwLT5jaW5mby5kLmRhdGFfcHJlY2lzaW9uID09IDEyICkKKyNlbmRpZgorCQl7CisJCQlsaW5lX3dvcmtfYnVmID0gKEpTQU1QUk9XKQorCQkJICAgIF9USUZGbWFsbG9jKHNpemVvZihzaG9ydCkgKiBzcC0+Y2luZm8uZC5vdXRwdXRfd2lkdGgKKwkJCSAgICAqIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzICk7CisJCX0KKworCQlkbyB7CisJCQlpZiggbGluZV93b3JrX2J1ZiAhPSBOVUxMICkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIEluIHRoZSBNSzEgY2FzZSwgd2UgYXdheXMgcmVhZCBpbnRvIGEgMTZiaXQgYnVmZmVyLCBhbmQgdGhlbgorCQkJCSAqIHBhY2sgZG93biB0byAxMmJpdCBvciA4Yml0LiAgSW4gNkIgY2FzZSB3ZSBvbmx5IHJlYWQgaW50byAxNgorCQkJCSAqIGJpdCBidWZmZXIgZm9yIDEyYml0IGRhdGEsIHdoaWNoIHdlIG5lZWQgdG8gcmVwYWNrLgorCQkJCSovCisJCQkJaWYgKFRJRkZqcGVnX3JlYWRfc2NhbmxpbmVzKHNwLCAmbGluZV93b3JrX2J1ZiwgMSkgIT0gMSkKKwkJCQkJcmV0dXJuICgwKTsKKworCQkJCWlmKCBzcC0+Y2luZm8uZC5kYXRhX3ByZWNpc2lvbiA9PSAxMiApCisJCQkJeworCQkJCQlpbnQgdmFsdWVfcGFpcnMgPSAoc3AtPmNpbmZvLmQub3V0cHV0X3dpZHRoCisJCQkJCSAgICAqIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzKSAvIDI7CisJCQkJCWludCBpUGFpcjsKKworCQkJCQlmb3IoIGlQYWlyID0gMDsgaVBhaXIgPCB2YWx1ZV9wYWlyczsgaVBhaXIrKyApCisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKm91dF9wdHIgPQorCQkJCQkJICAgICgodW5zaWduZWQgY2hhciAqKSBidWYpICsgaVBhaXIgKiAzOworCQkJCQkJSlNBTVBMRSAqaW5fcHRyID0gbGluZV93b3JrX2J1ZiArIGlQYWlyICogMjsKKworCQkJCQkJb3V0X3B0clswXSA9IChpbl9wdHJbMF0gJiAweGZmMCkgPj4gNDsKKwkJCQkJCW91dF9wdHJbMV0gPSAoKGluX3B0clswXSAmIDB4ZikgPDwgNCkKKwkJCQkJCSAgICB8ICgoaW5fcHRyWzFdICYgMHhmMDApID4+IDgpOworCQkJCQkJb3V0X3B0clsyXSA9ICgoaW5fcHRyWzFdICYgMHhmZikgPj4gMCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiggc3AtPmNpbmZvLmQuZGF0YV9wcmVjaXNpb24gPT0gOCApCisJCQkJeworCQkJCQlpbnQgdmFsdWVfY291bnQgPSAoc3AtPmNpbmZvLmQub3V0cHV0X3dpZHRoCisJCQkJCSAgICAqIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzKTsKKwkJCQkJaW50IGlWYWx1ZTsKKworCQkJCQlmb3IoIGlWYWx1ZSA9IDA7IGlWYWx1ZSA8IHZhbHVlX2NvdW50OyBpVmFsdWUrKyApCisJCQkJCXsKKwkJCQkJCSgodW5zaWduZWQgY2hhciAqKSBidWYpW2lWYWx1ZV0gPQorCQkJCQkJICAgIGxpbmVfd29ya19idWZbaVZhbHVlXSAmIDB4ZmY7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyoKKwkJCQkgKiBJbiB0aGUgbGlianBlZzZiIDhiaXQgY2FzZS4gIFdlIHJlYWQgZGlyZWN0bHkgaW50byB0aGUKKwkJCQkgKiBUSUZGIGJ1ZmZlci4KKwkJCQkqLworCQkJCUpTQU1QUk9XIGJ1ZnB0ciA9IChKU0FNUFJPVylidWY7CisKKwkJCQlpZiAoVElGRmpwZWdfcmVhZF9zY2FubGluZXMoc3AsICZidWZwdHIsIDEpICE9IDEpCisJCQkJCXJldHVybiAoMCk7CisJCQl9CisKKwkJCSsrdGlmLT50aWZfcm93OworCQkJYnVmICs9IHNwLT5ieXRlc3BlcmxpbmU7CisJCQljYyAtPSBzcC0+Ynl0ZXNwZXJsaW5lOworCQl9IHdoaWxlICgtLW5yb3dzID4gMCk7CisKKwkJaWYoIGxpbmVfd29ya19idWYgIT0gTlVMTCApCisJCQlfVElGRmZyZWUoIGxpbmVfd29ya19idWYgKTsKKwl9CisKKyAgICAgICAgLyogVXBkYXRlIGluZm9ybWF0aW9uIG9uIGNvbnN1bWVkIGRhdGEgKi8KKyAgICAgICAgdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZTsKKyAgICAgICAgdGlmLT50aWZfcmF3Y2MgPSBzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAKKwkvKiBDbG9zZSBkb3duIHRoZSBkZWNvbXByZXNzb3IgaWYgd2UndmUgZmluaXNoZWQgdGhlIHN0cmlwIG9yIHRpbGUuICovCisJcmV0dXJuIHNwLT5jaW5mby5kLm91dHB1dF9zY2FubGluZSA8IHNwLT5jaW5mby5kLm91dHB1dF9oZWlnaHQKKwkgICAgfHwgVElGRmpwZWdfZmluaXNoX2RlY29tcHJlc3Moc3ApOworfQorCisvKkFSR1NVU0VEKi8gc3RhdGljIGludAorRGVjb2RlUm93RXJyb3IoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCisKK3sKKyAgICAodm9pZCkgYnVmOworICAgICh2b2lkKSBjYzsKKyAgICAodm9pZCkgczsKKworICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiVElGRlJlYWRTY2FubGluZSIsCisgICAgICAgICAgICAgICAgICJzY2FubGluZSBvcmllbnRlZCBhY2Nlc3MgaXMgbm90IHN1cHBvcnRlZCBmb3IgZG93bnNhbXBsZWQgSlBFRyBjb21wcmVzc2VkIGltYWdlcywgY29uc2lkZXIgZW5hYmxpbmcgVElGRl9KUEVHQ09MT1JNT0RFIGFzIEpQRUdDT0xPUk1PREVfUkdCLiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqIFJldHVybmVkIGRhdGEgaXMgZG93bnNhbXBsZWQgcGVyIHNhbXBsaW5nIGZhY3RvcnMuCisgKi8KKy8qQVJHU1VTRUQqLyBzdGF0aWMgaW50CitKUEVHRGVjb2RlUmF3KFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwl0bXNpemVfdCBucm93czsKKwkodm9pZCkgczsKKworCS8qIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgcmVhZCBpbiBtdWx0aXBsZXMgb2YgYSBzY2FubGluZSAqLworCWlmICggKG5yb3dzID0gc3AtPmNpbmZvLmQuaW1hZ2VfaGVpZ2h0KSApIHsKKworCQkvKiBDYixDciBib3RoIGhhdmUgc2FtcGxpbmcgZmFjdG9ycyAxLCBzbyB0aGlzIGlzIGNvcnJlY3QgKi8KKwkJSkRJTUVOU0lPTiBjbHVtcHNfcGVyX2xpbmUgPSBzcC0+Y2luZm8uZC5jb21wX2luZm9bMV0uZG93bnNhbXBsZWRfd2lkdGg7ICAgICAgICAgICAgCisJCWludCBzYW1wbGVzX3Blcl9jbHVtcCA9IHNwLT5zYW1wbGVzcGVyY2x1bXA7CisKKyNpZiBkZWZpbmVkKEpQRUdfTElCX01LMV9PUl8xMkJJVCkKKwkJdW5zaWduZWQgc2hvcnQqIHRtcGJ1ZiA9IF9USUZGbWFsbG9jKHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKgorCQkJCQkJICAgICBzcC0+Y2luZm8uZC5vdXRwdXRfd2lkdGggKgorCQkJCQkJICAgICBzcC0+Y2luZm8uZC5udW1fY29tcG9uZW50cyk7CisJCWlmKHRtcGJ1Zj09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJKUEVHRGVjb2RlUmF3IiwKKwkJCQkgICAgICJPdXQgb2YgbWVtb3J5Iik7CisJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworCQlkbyB7CisJCQlqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCQkJaW50IGNpLCBjbHVtcG9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNjIDwgc3AtPmJ5dGVzcGVybGluZSApIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIkpQRUdEZWNvZGVSYXciLAorCQkJCQkgICAgICJhcHBsaWNhdGlvbiBidWZmZXIgbm90IGxhcmdlIGVub3VnaCBmb3IgYWxsIGRhdGEuIik7CisJCQkJcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCS8qIFJlbG9hZCBkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlciBpZiBuZWVkZWQgKi8KKwkJCWlmIChzcC0+c2NhbmNvdW50ID49IERDVFNJWkUpIHsKKwkJCQlpbnQgbiA9IHNwLT5jaW5mby5kLm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKwkJCQlpZiAoVElGRmpwZWdfcmVhZF9yYXdfZGF0YShzcCwgc3AtPmRzX2J1ZmZlciwgbikgIT0gbikKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQlzcC0+c2NhbmNvdW50ID0gMDsKKwkJCX0KKwkJCS8qCisJCQkgKiBGYXN0ZXN0IHdheSB0byB1bnNlcGFyYXRlIGRhdGEgaXMgdG8gbWFrZSBvbmUgcGFzcworCQkJICogb3ZlciB0aGUgc2NhbmxpbmUgZm9yIGVhY2ggcm93IG9mIGVhY2ggY29tcG9uZW50LgorCQkJICovCisJCQljbHVtcG9mZnNldCA9IDA7ICAgIC8qIGZpcnN0IHNhbXBsZSBpbiBjbHVtcCAqLworCQkJZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBzcC0+Y2luZm8uZC5jb21wX2luZm87CisJCQkgICAgIGNpIDwgc3AtPmNpbmZvLmQubnVtX2NvbXBvbmVudHM7CisJCQkgICAgIGNpKyssIGNvbXBwdHIrKykgeworCQkJCWludCBoc2FtcCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisJCQkJaW50IHZzYW1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkJCQlpbnQgeXBvczsKKworCQkJCWZvciAoeXBvcyA9IDA7IHlwb3MgPCB2c2FtcDsgeXBvcysrKSB7CisJCQkJCUpTQU1QTEUgKmlucHRyID0gc3AtPmRzX2J1ZmZlcltjaV1bc3AtPnNjYW5jb3VudCp2c2FtcCArIHlwb3NdOworCQkJCQlKRElNRU5TSU9OIG5jbHVtcDsKKyNpZiBkZWZpbmVkKEpQRUdfTElCX01LMV9PUl8xMkJJVCkKKwkJCQkJSlNBTVBMRSAqb3V0cHRyID0gKEpTQU1QTEUqKXRtcGJ1ZiArIGNsdW1wb2Zmc2V0OworI2Vsc2UKKwkJCQkJSlNBTVBMRSAqb3V0cHRyID0gKEpTQU1QTEUqKWJ1ZiArIGNsdW1wb2Zmc2V0OworCQkJCQlpZiAoY2MgPCAodG1zaXplX3QpIChjbHVtcG9mZnNldCArIHNhbXBsZXNfcGVyX2NsdW1wKihjbHVtcHNfcGVyX2xpbmUtMSkgKyBoc2FtcCkpIHsKKwkJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiSlBFR0RlY29kZVJhdyIsCisJCQkJCQkJICAgICAiYXBwbGljYXRpb24gYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggZm9yIGFsbCBkYXRhLCBwb3NzaWJsZSBzdWJzYW1wbGluZyBpc3N1ZSIpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKyNlbmRpZgorCisJCQkJCWlmIChoc2FtcCA9PSAxKSB7CisJCQkJCQkvKiBmYXN0IHBhdGggZm9yIGF0IGxlYXN0IENiIGFuZCBDciAqLworCQkJCQkJZm9yIChuY2x1bXAgPSBjbHVtcHNfcGVyX2xpbmU7IG5jbHVtcC0tID4gMDsgKSB7CisJCQkJCQkJb3V0cHRyWzBdID0gKmlucHRyKys7CisJCQkJCQkJb3V0cHRyICs9IHNhbXBsZXNfcGVyX2NsdW1wOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IHhwb3M7CisKKwkJCQkJCS8qIGdlbmVyYWwgY2FzZSAqLworCQkJCQkJZm9yIChuY2x1bXAgPSBjbHVtcHNfcGVyX2xpbmU7IG5jbHVtcC0tID4gMDsgKSB7CisJCQkJCQkJZm9yICh4cG9zID0gMDsgeHBvcyA8IGhzYW1wOyB4cG9zKyspCisJCQkJCQkJCW91dHB0clt4cG9zXSA9ICppbnB0cisrOworCQkJCQkJCW91dHB0ciArPSBzYW1wbGVzX3Blcl9jbHVtcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQljbHVtcG9mZnNldCArPSBoc2FtcDsKKwkJCQl9CisJCQl9CisKKyNpZiBkZWZpbmVkKEpQRUdfTElCX01LMV9PUl8xMkJJVCkKKwkJCXsKKwkJCQlpZiAoc3AtPmNpbmZvLmQuZGF0YV9wcmVjaXNpb24gPT0gOCkKKwkJCQl7CisJCQkJCWludCBpPTA7CisJCQkJCWludCBsZW4gPSBzcC0+Y2luZm8uZC5vdXRwdXRfd2lkdGggKiBzcC0+Y2luZm8uZC5udW1fY29tcG9uZW50czsKKwkJCQkJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCQkJCXsKKwkJCQkJCSgodW5zaWduZWQgY2hhciopYnVmKVtpXSA9IHRtcGJ1ZltpXSAmIDB4ZmY7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsgICAgICAgICAvKiAxMi1iaXQgKi8KKwkJCQkJaW50IHZhbHVlX3BhaXJzID0gKHNwLT5jaW5mby5kLm91dHB1dF93aWR0aAorCQkJCQkJCSAgICogc3AtPmNpbmZvLmQubnVtX2NvbXBvbmVudHMpIC8gMjsKKwkJCQkJaW50IGlQYWlyOworCQkJCQlmb3IoIGlQYWlyID0gMDsgaVBhaXIgPCB2YWx1ZV9wYWlyczsgaVBhaXIrKyApCisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKm91dF9wdHIgPSAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKSArIGlQYWlyICogMzsKKwkJCQkJCUpTQU1QTEUgKmluX3B0ciA9IChKU0FNUExFICopICh0bXBidWYgKyBpUGFpciAqIDIpOworCQkJCQkJb3V0X3B0clswXSA9IChpbl9wdHJbMF0gJiAweGZmMCkgPj4gNDsKKwkJCQkJCW91dF9wdHJbMV0gPSAoKGluX3B0clswXSAmIDB4ZikgPDwgNCkKKwkJCQkJCQl8ICgoaW5fcHRyWzFdICYgMHhmMDApID4+IDgpOworCQkJCQkJb3V0X3B0clsyXSA9ICgoaW5fcHRyWzFdICYgMHhmZikgPj4gMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJc3AtPnNjYW5jb3VudCArKzsKKwkJCXRpZi0+dGlmX3JvdyArPSBzcC0+dl9zYW1wbGluZzsKKworCQkJYnVmICs9IHNwLT5ieXRlc3BlcmxpbmU7CisJCQljYyAtPSBzcC0+Ynl0ZXNwZXJsaW5lOworCisJCQlucm93cyAtPSBzcC0+dl9zYW1wbGluZzsKKwkJfSB3aGlsZSAobnJvd3MgPiAwKTsKKworI2lmIGRlZmluZWQoSlBFR19MSUJfTUsxX09SXzEyQklUKQorCQlfVElGRmZyZWUodG1wYnVmKTsKKyNlbmRpZgorCisJfQorCisJLyogQ2xvc2UgZG93biB0aGUgZGVjb21wcmVzc29yIGlmIGRvbmUuICovCisJcmV0dXJuIHNwLT5jaW5mby5kLm91dHB1dF9zY2FubGluZSA8IHNwLT5jaW5mby5kLm91dHB1dF9oZWlnaHQKKwkJfHwgVElGRmpwZWdfZmluaXNoX2RlY29tcHJlc3Moc3ApOworfQorCisKKy8qCisgKiBKUEVHIEVuY29kaW5nLgorICovCisKK3N0YXRpYyB2b2lkCit1bnN1cHByZXNzX3F1YW50X3RhYmxlIChKUEVHU3RhdGUqIHNwLCBpbnQgdGJsbm8pCit7CisJSlFVQU5UX1RCTCogcXRibDsKKworCWlmICgocXRibCA9IHNwLT5jaW5mby5jLnF1YW50X3RibF9wdHJzW3RibG5vXSkgIT0gTlVMTCkKKwkJcXRibC0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAordW5zdXBwcmVzc19odWZmX3RhYmxlIChKUEVHU3RhdGUqIHNwLCBpbnQgdGJsbm8pCit7CisJSkhVRkZfVEJMKiBodGJsOworCisJaWYgKChodGJsID0gc3AtPmNpbmZvLmMuZGNfaHVmZl90YmxfcHRyc1t0Ymxub10pICE9IE5VTEwpCisJCWh0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsKKwlpZiAoKGh0YmwgPSBzcC0+Y2luZm8uYy5hY19odWZmX3RibF9wdHJzW3RibG5vXSkgIT0gTlVMTCkKKwkJaHRibC0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCitzdGF0aWMgaW50CitwcmVwYXJlX0pQRUdUYWJsZXMoVElGRiogdGlmKQoreworCUpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKworCS8qIEluaXRpYWxpemUgcXVhbnQgdGFibGVzIGZvciBjdXJyZW50IHF1YWxpdHkgc2V0dGluZyAqLworCWlmICghVElGRmpwZWdfc2V0X3F1YWxpdHkoc3AsIHNwLT5qcGVncXVhbGl0eSwgRkFMU0UpKQorCQlyZXR1cm4gKDApOworCS8qIE1hcmsgb25seSB0aGUgdGFibGVzIHdlIHdhbnQgZm9yIG91dHB1dCAqLworCS8qIE5COiBjaHJvbWluYW5jZSB0YWJsZXMgYXJlIGN1cnJlbnRseSB1c2VkIG9ubHkgd2l0aCBZQ2JDciAqLworCWlmICghVElGRmpwZWdfc3VwcHJlc3NfdGFibGVzKHNwLCBUUlVFKSkKKwkJcmV0dXJuICgwKTsKKwlpZiAoc3AtPmpwZWd0YWJsZXNtb2RlICYgSlBFR1RBQkxFU01PREVfUVVBTlQpIHsKKwkJdW5zdXBwcmVzc19xdWFudF90YWJsZShzcCwgMCk7CisJCWlmIChzcC0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfWUNCQ1IpCisJCQl1bnN1cHByZXNzX3F1YW50X3RhYmxlKHNwLCAxKTsKKwl9CisJaWYgKHNwLT5qcGVndGFibGVzbW9kZSAmIEpQRUdUQUJMRVNNT0RFX0hVRkYpIHsKKwkJdW5zdXBwcmVzc19odWZmX3RhYmxlKHNwLCAwKTsKKwkJaWYgKHNwLT5waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUikKKwkJCXVuc3VwcHJlc3NfaHVmZl90YWJsZShzcCwgMSk7CisJfQorCS8qIERpcmVjdCBsaWJqcGVnIG91dHB1dCBpbnRvIGpwZWd0YWJsZXMgKi8KKwlpZiAoIVRJRkZqcGVnX3RhYmxlc19kZXN0KHNwLCB0aWYpKQorCQlyZXR1cm4gKDApOworCS8qIEVtaXQgdGFibGVzLW9ubHkgZGF0YXN0cmVhbSAqLworCWlmICghVElGRmpwZWdfd3JpdGVfdGFibGVzKHNwKSkKKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK0pQRUdTZXR1cEVuY29kZShUSUZGKiB0aWYpCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJKUEVHU2V0dXBFbmNvZGUiOworCisjaWYgZGVmaW5lZChKUEVHX0RVQUxfTU9ERV84XzEyKSAmJiAhZGVmaW5lZChUSUZGSW5pdEpQRUcpCisgICAgICAgIGlmKCB0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSA9PSAxMiApCisgICAgICAgICAgICByZXR1cm4gVElGRlJlSW5pdEpQRUdfMTIoIHRpZiwgQ09NUFJFU1NJT05fSlBFRywgMSApOworI2VuZGlmCisKKyAgICAgICAgSlBFR0luaXRpYWxpemVMaWJKUEVHKCB0aWYsIEZBTFNFICk7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJYXNzZXJ0KCFzcC0+Y2luZm8uY29tbS5pc19kZWNvbXByZXNzb3IpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGFsbCBKUEVHIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMuCisJICogTm90ZSB0aGF0IGpwZWdfc2V0X2RlZmF1bHRzIG5lZWRzIGxlZ2FsIHZhbHVlcyBmb3IKKwkgKiBpbl9jb2xvcl9zcGFjZSBhbmQgaW5wdXRfY29tcG9uZW50cy4KKwkgKi8KKwlzcC0+Y2luZm8uYy5pbl9jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworCXNwLT5jaW5mby5jLmlucHV0X2NvbXBvbmVudHMgPSAxOworCWlmICghVElGRmpwZWdfc2V0X2RlZmF1bHRzKHNwKSkKKwkJcmV0dXJuICgwKTsKKwkvKiBTZXQgcGVyLWZpbGUgcGFyYW1ldGVycyAqLworCXNwLT5waG90b21ldHJpYyA9IHRkLT50ZF9waG90b21ldHJpYzsKKwlzd2l0Y2ggKHNwLT5waG90b21ldHJpYykgeworCWNhc2UgUEhPVE9NRVRSSUNfWUNCQ1I6CisJCXNwLT5oX3NhbXBsaW5nID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF07CisJCXNwLT52X3NhbXBsaW5nID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV07CisJCS8qCisJCSAqIEEgUmVmZXJlbmNlQmxhY2tXaGl0ZSBmaWVsZCAqbXVzdCogYmUgcHJlc2VudCBzaW5jZSB0aGUKKwkJICogZGVmYXVsdCB2YWx1ZSBpcyBpbmFwcHJvcHJpYXRlIGZvciBZQ2JDci4gIEZpbGwgaW4gdGhlCisJCSAqIHByb3BlciB2YWx1ZSBpZiBhcHBsaWNhdGlvbiBkaWRuJ3Qgc2V0IGl0LgorCQkgKi8KKwkJeworCQkJZmxvYXQgKnJlZjsKKwkJCWlmICghVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19SRUZFUkVOQ0VCTEFDS1dISVRFLAorCQkJCQkgICZyZWYpKSB7CisJCQkJZmxvYXQgcmVmYndbNl07CisJCQkJbG9uZyB0b3AgPSAxTCA8PCB0ZC0+dGRfYml0c3BlcnNhbXBsZTsKKwkJCQlyZWZid1swXSA9IDA7CisJCQkJcmVmYndbMV0gPSAoZmxvYXQpKHRvcC0xTCk7CisJCQkJcmVmYndbMl0gPSAoZmxvYXQpKHRvcD4+MSk7CisJCQkJcmVmYndbM10gPSByZWZid1sxXTsKKwkJCQlyZWZid1s0XSA9IHJlZmJ3WzJdOworCQkJCXJlZmJ3WzVdID0gcmVmYndbMV07CisJCQkJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19SRUZFUkVOQ0VCTEFDS1dISVRFLAorCQkJCQkgICAgIHJlZmJ3KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFBIT1RPTUVUUklDX1BBTEVUVEU6CQkvKiBkaXNhbGxvd2VkIGJ5IFRlY2ggTm90ZSAqLworCWNhc2UgUEhPVE9NRVRSSUNfTUFTSzoKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24gJWQgbm90IGFsbG93ZWQgZm9yIEpQRUciLAorCQkJICAoaW50KSBzcC0+cGhvdG9tZXRyaWMpOworCQlyZXR1cm4gKDApOworCWRlZmF1bHQ6CisJCS8qIFRJRkYgNi4wIGZvcmJpZHMgc3Vic2FtcGxpbmcgb2YgYWxsIG90aGVyIGNvbG9yIHNwYWNlcyAqLworCQlzcC0+aF9zYW1wbGluZyA9IDE7CisJCXNwLT52X3NhbXBsaW5nID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogVmVyaWZ5IG1pc2NlbGxhbmVvdXMgcGFyYW1ldGVycyAqLworCisJLyoKKwkgKiBUaGlzIHdvdWxkIG5lZWQgd29yayBpZiBsaWJ0aWZmIGV2ZXIgc3VwcG9ydHMgZGlmZmVyZW50CisJICogZGVwdGhzIGZvciBkaWZmZXJlbnQgY29tcG9uZW50cywgb3IgaWYgbGlianBlZyBldmVyIHN1cHBvcnRzCisJICogcnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRlcHRoLiAgTmVpdGhlciBpcyBpbW1pbmVudC4KKwkgKi8KKyNpZmRlZiBKUEVHX0xJQl9NSzEKKyAgICAgICAgLyogQklUU19JTl9KU0FNUExFIG5vdyBwZXJtaXRzIDggYW5kIDEyIC0tLSBkZ2lsYmVydCAqLworCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSA4ICYmIHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IDEyKSAKKyNlbHNlCisJaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IEJJVFNfSU5fSlNBTVBMRSApCisjZW5kaWYKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJCaXRzUGVyU2FtcGxlICVkIG5vdCBhbGxvd2VkIGZvciBKUEVHIiwKKwkJCSAgKGludCkgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlyZXR1cm4gKDApOworCX0KKwlzcC0+Y2luZm8uYy5kYXRhX3ByZWNpc2lvbiA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworI2lmZGVmIEpQRUdfTElCX01LMQorICAgICAgICBzcC0+Y2luZm8uYy5iaXRzX2luX2pzYW1wbGUgPSB0ZC0+dGRfYml0c3BlcnNhbXBsZTsKKyNlbmRpZgorCWlmIChpc1RpbGVkKHRpZikpIHsKKwkJaWYgKCh0ZC0+dGRfdGlsZWxlbmd0aCAlIChzcC0+dl9zYW1wbGluZyAqIERDVFNJWkUpKSAhPSAwKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgIkpQRUcgdGlsZSBoZWlnaHQgbXVzdCBiZSBtdWx0aXBsZSBvZiAlZCIsCisJCQkJICBzcC0+dl9zYW1wbGluZyAqIERDVFNJWkUpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlpZiAoKHRkLT50ZF90aWxld2lkdGggJSAoc3AtPmhfc2FtcGxpbmcgKiBEQ1RTSVpFKSkgIT0gMCkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICJKUEVHIHRpbGUgd2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAlZCIsCisJCQkJICBzcC0+aF9zYW1wbGluZyAqIERDVFNJWkUpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0ZC0+dGRfcm93c3BlcnN0cmlwIDwgdGQtPnRkX2ltYWdlbGVuZ3RoICYmCisJCSAgICAodGQtPnRkX3Jvd3NwZXJzdHJpcCAlIChzcC0+dl9zYW1wbGluZyAqIERDVFNJWkUpKSAhPSAwKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgIlJvd3NQZXJTdHJpcCBtdXN0IGJlIG11bHRpcGxlIG9mICVkIGZvciBKUEVHIiwKKwkJCQkgIHNwLT52X3NhbXBsaW5nICogRENUU0laRSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJLyogQ3JlYXRlIGEgSlBFR1RhYmxlcyBmaWVsZCBpZiBhcHByb3ByaWF0ZSAqLworCWlmIChzcC0+anBlZ3RhYmxlc21vZGUgJiAoSlBFR1RBQkxFU01PREVfUVVBTlR8SlBFR1RBQkxFU01PREVfSFVGRikpIHsKKyAgICAgICAgICAgICAgICBpZiggc3AtPmpwZWd0YWJsZXMgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICB8fCBtZW1jbXAoc3AtPmpwZWd0YWJsZXMsIlwwXDBcMFwwXDBcMFwwXDBcMCIsOCkgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVwYXJlX0pQRUdUYWJsZXModGlmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhlIGZpZWxkIHByZXNlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IHVzZSBUSUZGU2V0RmllbGQgc2luY2UgQkVFTldSSVRJTkcgaXMgYWxyZWFkeSBzZXQhICovCisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworICAgICAgICAgICAgICAgICAgICAgICAgVElGRlNldEZpZWxkQml0KHRpZiwgRklFTERfSlBFR1RBQkxFUyk7CisgICAgICAgICAgICAgICAgfQorCX0gZWxzZSB7CisJCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGFwcGxpY2F0aW9uLXN1cHBsaWVkIEpQRUdUYWJsZXMsICovCisJCS8qIHNvIG1hcmsgdGhlIGZpZWxkIG5vdCBwcmVzZW50ICovCisJCVRJRkZDbHJGaWVsZEJpdCh0aWYsIEZJRUxEX0pQRUdUQUJMRVMpOworCX0KKworCS8qIERpcmVjdCBsaWJqcGVnIG91dHB1dCB0byBsaWJ0aWZmJ3Mgb3V0cHV0IGJ1ZmZlciAqLworCVRJRkZqcGVnX2RhdGFfZGVzdChzcCwgdGlmKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXQgZW5jb2Rpbmcgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaXAgb3IgdGlsZS4KKyAqLworc3RhdGljIGludAorSlBFR1ByZUVuY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiSlBFR1ByZUVuY29kZSI7CisJdWludDMyIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0OworCWludCBkb3duc2FtcGxlZF9pbnB1dDsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKyAgCisJaWYgKHNwLT5jaW5mby5jb21tLmlzX2RlY29tcHJlc3NvciA9PSAxKQorCXsKKwkJdGlmLT50aWZfc2V0dXBlbmNvZGUoIHRpZiApOworCX0KKyAgCisJYXNzZXJ0KCFzcC0+Y2luZm8uY29tbS5pc19kZWNvbXByZXNzb3IpOworCS8qCisJICogU2V0IGVuY29kaW5nIHBhcmFtZXRlcnMgZm9yIHRoaXMgc3RyaXAvdGlsZS4KKwkgKi8KKwlpZiAoaXNUaWxlZCh0aWYpKSB7CisJCXNlZ21lbnRfd2lkdGggPSB0ZC0+dGRfdGlsZXdpZHRoOworCQlzZWdtZW50X2hlaWdodCA9IHRkLT50ZF90aWxlbGVuZ3RoOworCQlzcC0+Ynl0ZXNwZXJsaW5lID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisJfSBlbHNlIHsKKwkJc2VnbWVudF93aWR0aCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCQlzZWdtZW50X2hlaWdodCA9IHRkLT50ZF9pbWFnZWxlbmd0aCAtIHRpZi0+dGlmX3JvdzsKKwkJaWYgKHNlZ21lbnRfaGVpZ2h0ID4gdGQtPnRkX3Jvd3NwZXJzdHJpcCkKKwkJCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJc3AtPmJ5dGVzcGVybGluZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwl9CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFICYmIHMgPiAwKSB7CisJCS8qIGZvciBQQyAyLCBzY2FsZSBkb3duIHRoZSBzdHJpcC90aWxlIHNpemUKKwkJICogdG8gbWF0Y2ggYSBkb3duc2FtcGxlZCBjb21wb25lbnQKKwkJICovCisJCXNlZ21lbnRfd2lkdGggPSBUSUZGaG93bWFueV8zMihzZWdtZW50X3dpZHRoLCBzcC0+aF9zYW1wbGluZyk7IAorCQlzZWdtZW50X2hlaWdodCA9IFRJRkZob3dtYW55XzMyKHNlZ21lbnRfaGVpZ2h0LCBzcC0+dl9zYW1wbGluZyk7CisJfQorCWlmIChzZWdtZW50X3dpZHRoID4gNjU1MzUgfHwgc2VnbWVudF9oZWlnaHQgPiA2NTUzNSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiU3RyaXAvdGlsZSB0b28gbGFyZ2UgZm9yIEpQRUciKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJc3AtPmNpbmZvLmMuaW1hZ2Vfd2lkdGggPSBzZWdtZW50X3dpZHRoOworCXNwLT5jaW5mby5jLmltYWdlX2hlaWdodCA9IHNlZ21lbnRfaGVpZ2h0OworCWRvd25zYW1wbGVkX2lucHV0ID0gRkFMU0U7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQlzcC0+Y2luZm8uYy5pbnB1dF9jb21wb25lbnRzID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJaWYgKHNwLT5waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUikgeworCQkJaWYgKHNwLT5qcGVnY29sb3Jtb2RlID09IEpQRUdDT0xPUk1PREVfUkdCKSB7CisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCQkJfSBlbHNlIHsKKwkJCQlzcC0+Y2luZm8uYy5pbl9jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKwkJCQlpZiAoc3AtPmhfc2FtcGxpbmcgIT0gMSB8fCBzcC0+dl9zYW1wbGluZyAhPSAxKQorCQkJCQlkb3duc2FtcGxlZF9pbnB1dCA9IFRSVUU7CisJCQl9CisJCQlpZiAoIVRJRkZqcGVnX3NldF9jb2xvcnNwYWNlKHNwLCBKQ1NfWUNiQ3IpKQorCQkJCXJldHVybiAoMCk7CisJCQkvKgorCQkJICogU2V0IFkgc2FtcGxpbmcgZmFjdG9yczsKKwkJCSAqIHdlIGFzc3VtZSBqcGVnX3NldF9jb2xvcnNwYWNlKCkgc2V0IHRoZSByZXN0IHRvIDEKKwkJCSAqLworCQkJc3AtPmNpbmZvLmMuY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSBzcC0+aF9zYW1wbGluZzsKKwkJCXNwLT5jaW5mby5jLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gc3AtPnZfc2FtcGxpbmc7CisJCX0gZWxzZSB7CisJCQlpZiAoKHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU1dISVRFIHx8IHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLKSAmJiB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID09IDEpCisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworCQkJZWxzZSBpZiAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1JHQiAmJiB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID09IDMpCisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCQkJZWxzZSBpZiAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1NFUEFSQVRFRCAmJiB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID09IDQpCisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKwkJCWVsc2UKKwkJCQlzcC0+Y2luZm8uYy5pbl9jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworCQkJaWYgKCFUSUZGanBlZ19zZXRfY29sb3JzcGFjZShzcCwgc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UpKQorCQkJCXJldHVybiAoMCk7CisJCQkvKiBqcGVnX3NldF9jb2xvcnNwYWNlIHNldCBhbGwgc2FtcGxpbmcgZmFjdG9ycyB0byAxICovCisJCX0KKwl9IGVsc2UgeworCQlzcC0+Y2luZm8uYy5pbnB1dF9jb21wb25lbnRzID0gMTsKKwkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKwkJaWYgKCFUSUZGanBlZ19zZXRfY29sb3JzcGFjZShzcCwgSkNTX1VOS05PV04pKQorCQkJcmV0dXJuICgwKTsKKwkJc3AtPmNpbmZvLmMuY29tcF9pbmZvWzBdLmNvbXBvbmVudF9pZCA9IHM7CisJCS8qIGpwZWdfc2V0X2NvbG9yc3BhY2UoKSBzZXQgc2FtcGxpbmcgZmFjdG9ycyB0byAxICovCisJCWlmIChzcC0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfWUNCQ1IgJiYgcyA+IDApIHsKKwkJCXNwLT5jaW5mby5jLmNvbXBfaW5mb1swXS5xdWFudF90Ymxfbm8gPSAxOworCQkJc3AtPmNpbmZvLmMuY29tcF9pbmZvWzBdLmRjX3RibF9ubyA9IDE7CisJCQlzcC0+Y2luZm8uYy5jb21wX2luZm9bMF0uYWNfdGJsX25vID0gMTsKKwkJfQorCX0KKwkvKiBlbnN1cmUgbGlianBlZyB3b24ndCB3cml0ZSBhbnkgZXh0cmFuZW91cyBtYXJrZXJzICovCisJc3AtPmNpbmZvLmMud3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsKKwlzcC0+Y2luZm8uYy53cml0ZV9BZG9iZV9tYXJrZXIgPSBGQUxTRTsKKwkvKiBzZXQgdXAgdGFibGUgaGFuZGxpbmcgY29ycmVjdGx5ICovCisgICAgICAgIGlmICghVElGRmpwZWdfc2V0X3F1YWxpdHkoc3AsIHNwLT5qcGVncXVhbGl0eSwgRkFMU0UpKQorCQlyZXR1cm4gKDApOworCWlmICghIChzcC0+anBlZ3RhYmxlc21vZGUgJiBKUEVHVEFCTEVTTU9ERV9RVUFOVCkpIHsKKwkJdW5zdXBwcmVzc19xdWFudF90YWJsZShzcCwgMCk7CisJCXVuc3VwcHJlc3NfcXVhbnRfdGFibGUoc3AsIDEpOworCX0KKwlpZiAoc3AtPmpwZWd0YWJsZXNtb2RlICYgSlBFR1RBQkxFU01PREVfSFVGRikKKwkJc3AtPmNpbmZvLmMub3B0aW1pemVfY29kaW5nID0gRkFMU0U7CisJZWxzZQorCQlzcC0+Y2luZm8uYy5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCWlmIChkb3duc2FtcGxlZF9pbnB1dCkgeworCQkvKiBOZWVkIHRvIHVzZSByYXctZGF0YSBpbnRlcmZhY2UgdG8gbGlianBlZyAqLworCQlzcC0+Y2luZm8uYy5yYXdfZGF0YV9pbiA9IFRSVUU7CisJCXRpZi0+dGlmX2VuY29kZXJvdyA9IEpQRUdFbmNvZGVSYXc7CisJCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gSlBFR0VuY29kZVJhdzsKKwkJdGlmLT50aWZfZW5jb2RldGlsZSA9IEpQRUdFbmNvZGVSYXc7CisJfSBlbHNlIHsKKwkJLyogVXNlIG5vcm1hbCBpbnRlcmZhY2UgdG8gbGlianBlZyAqLworCQlzcC0+Y2luZm8uYy5yYXdfZGF0YV9pbiA9IEZBTFNFOworCQl0aWYtPnRpZl9lbmNvZGVyb3cgPSBKUEVHRW5jb2RlOworCQl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IEpQRUdFbmNvZGU7CisJCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBKUEVHRW5jb2RlOworCX0KKwkvKiBTdGFydCBKUEVHIGNvbXByZXNzb3IgKi8KKwlpZiAoIVRJRkZqcGVnX3N0YXJ0X2NvbXByZXNzKHNwLCBGQUxTRSkpCisJCXJldHVybiAoMCk7CisJLyogQWxsb2NhdGUgZG93bnNhbXBsZWQtZGF0YSBidWZmZXJzIGlmIG5lZWRlZCAqLworCWlmIChkb3duc2FtcGxlZF9pbnB1dCkgeworCQlpZiAoIWFsbG9jX2Rvd25zYW1wbGVkX2J1ZmZlcnModGlmLCBzcC0+Y2luZm8uYy5jb21wX2luZm8sCisJCQkJCSAgICAgICBzcC0+Y2luZm8uYy5udW1fY29tcG9uZW50cykpCisJCQlyZXR1cm4gKDApOworCX0KKwlzcC0+c2NhbmNvdW50ID0gMDsKKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBjaHVuayBvZiBwaXhlbHMuCisgKiAiU3RhbmRhcmQiIGNhc2U6IGluY29taW5nIGRhdGEgaXMgbm90IGRvd25zYW1wbGVkLgorICovCitzdGF0aWMgaW50CitKUEVHRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwl0bXNpemVfdCBucm93czsKKwlKU0FNUFJPVyBidWZwdHJbMV07CisgICAgICAgIHNob3J0ICpsaW5lMTYgPSBOVUxMOworICAgICAgICBpbnQgICAgbGluZTE2X2NvdW50ID0gMDsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwkvKiBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIHN1cHBsaWVkIGluIG11bHRpcGxlcyBvZiBhIHNjYW5saW5lICovCisJbnJvd3MgPSBjYyAvIHNwLT5ieXRlc3BlcmxpbmU7CisJaWYgKGNjICUgc3AtPmJ5dGVzcGVybGluZSkKKyAgICAgICAgICAgIFRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYWN0aW9uYWwgc2NhbmxpbmUgZGlzY2FyZGVkIik7CisKKyAgICAgICAgLyogVGhlIGxhc3Qgc3RyaXAgd2lsbCBiZSBsaW1pdGVkIHRvIGltYWdlIHNpemUgKi8KKyAgICAgICAgaWYoICFpc1RpbGVkKHRpZikgJiYgdGlmLT50aWZfcm93K25yb3dzID4gdGlmLT50aWZfZGlyLnRkX2ltYWdlbGVuZ3RoICkKKyAgICAgICAgICAgIG5yb3dzID0gdGlmLT50aWZfZGlyLnRkX2ltYWdlbGVuZ3RoIC0gdGlmLT50aWZfcm93OworCisgICAgICAgIGlmKCBzcC0+Y2luZm8uYy5kYXRhX3ByZWNpc2lvbiA9PSAxMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmUxNl9jb3VudCA9IChpbnQpKChzcC0+Ynl0ZXNwZXJsaW5lICogMikgLyAzKTsKKyAgICAgICAgICAgIGxpbmUxNiA9IChzaG9ydCAqKSBfVElGRm1hbGxvYyhzaXplb2Yoc2hvcnQpICogbGluZTE2X2NvdW50KTsKKwkgICAgLy8gRklYTUU6IHVuZGlhZ25vc2VkIG1hbGxvYyBmYWlsdXJlCisgICAgICAgIH0KKyAgICAgICAgICAgIAorCXdoaWxlIChucm93cy0tID4gMCkgeworCisgICAgICAgICAgICBpZiggc3AtPmNpbmZvLmMuZGF0YV9wcmVjaXNpb24gPT0gMTIgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaW50IHZhbHVlX3BhaXJzID0gbGluZTE2X2NvdW50IC8gMjsKKyAgICAgICAgICAgICAgICBpbnQgaVBhaXI7CisKKwkJYnVmcHRyWzBdID0gKEpTQU1QUk9XKSBsaW5lMTY7CisKKyAgICAgICAgICAgICAgICBmb3IoIGlQYWlyID0gMDsgaVBhaXIgPCB2YWx1ZV9wYWlyczsgaVBhaXIrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbl9wdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopIGJ1ZikgKyBpUGFpciAqIDM7CisgICAgICAgICAgICAgICAgICAgIEpTQU1QTEUgKm91dF9wdHIgPSAoSlNBTVBMRSAqKSAobGluZTE2ICsgaVBhaXIgKiAyKTsKKworICAgICAgICAgICAgICAgICAgICBvdXRfcHRyWzBdID0gKGluX3B0clswXSA8PCA0KSB8ICgoaW5fcHRyWzFdICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIG91dF9wdHJbMV0gPSAoKGluX3B0clsxXSAmIDB4MGYpIDw8IDgpIHwgaW5fcHRyWzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJYnVmcHRyWzBdID0gKEpTQU1QUk9XKSBidWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVElGRmpwZWdfd3JpdGVfc2NhbmxpbmVzKHNwLCBidWZwdHIsIDEpICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIGlmIChucm93cyA+IDApCisgICAgICAgICAgICAgICAgdGlmLT50aWZfcm93Kys7CisgICAgICAgICAgICBidWYgKz0gc3AtPmJ5dGVzcGVybGluZTsKKwl9CisKKyAgICAgICAgaWYoIHNwLT5jaW5mby5jLmRhdGFfcHJlY2lzaW9uID09IDEyICkKKyAgICAgICAgeworICAgICAgICAgICAgX1RJRkZmcmVlKCBsaW5lMTYgKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqIEluY29taW5nIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgZG93bnNhbXBsZWQgcGVyIHNhbXBsaW5nIGZhY3RvcnMuCisgKi8KK3N0YXRpYyBpbnQKK0pQRUdFbmNvZGVSYXcoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCUpTQU1QTEUqIGlucHRyOworCUpTQU1QTEUqIG91dHB0cjsKKwl0bXNpemVfdCBucm93czsKKwlKRElNRU5TSU9OIGNsdW1wc19wZXJfbGluZSwgbmNsdW1wOworCWludCBjbHVtcG9mZnNldCwgY2ksIHhwb3MsIHlwb3M7CisJanBlZ19jb21wb25lbnRfaW5mbyogY29tcHB0cjsKKwlpbnQgc2FtcGxlc19wZXJfY2x1bXAgPSBzcC0+c2FtcGxlc3BlcmNsdW1wOworCXRtc2l6ZV90IGJ5dGVzcGVyY2x1bXBsaW5lOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCS8qIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgc3VwcGxpZWQgaW4gbXVsdGlwbGVzIG9mIGEgY2x1bXBsaW5lICovCisJLyogYSBjbHVtcGxpbmUgaXMgZXF1aXZhbGVudCB0byB2X3NhbXBsaW5nIGRlc3Vic2FtcGxlZCBzY2FubGluZXMgKi8KKwkvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9uIG9mIGJ5dGVzcGVyY2x1bXBsaW5lLCBzaG91bGQgc3Vic3RpdHV0ZSBjYWxjdWxhdGlvbiBvZiBzcC0+Ynl0ZXNwZXJsaW5lLCBleGNlcHQgdGhhdCBpdCBpcyBwZXIgdl9zYW1wbGluZyBsaW5lcyAqLworCWJ5dGVzcGVyY2x1bXBsaW5lID0gKCgoc3AtPmNpbmZvLmMuaW1hZ2Vfd2lkdGgrc3AtPmhfc2FtcGxpbmctMSkvc3AtPmhfc2FtcGxpbmcpCisJCQkgICAgICooc3AtPmhfc2FtcGxpbmcqc3AtPnZfc2FtcGxpbmcrMikqc3AtPmNpbmZvLmMuZGF0YV9wcmVjaXNpb24rNykKKwkJCSAgICAvODsKKworCW5yb3dzID0gKCBjYyAvIGJ5dGVzcGVyY2x1bXBsaW5lICkgKiBzcC0+dl9zYW1wbGluZzsKKwlpZiAoY2MgJSBieXRlc3BlcmNsdW1wbGluZSkKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwgImZyYWN0aW9uYWwgc2NhbmxpbmUgZGlzY2FyZGVkIik7CisKKwkvKiBDYixDciBib3RoIGhhdmUgc2FtcGxpbmcgZmFjdG9ycyAxLCBzbyB0aGlzIGlzIGNvcnJlY3QgKi8KKwljbHVtcHNfcGVyX2xpbmUgPSBzcC0+Y2luZm8uYy5jb21wX2luZm9bMV0uZG93bnNhbXBsZWRfd2lkdGg7CisKKwl3aGlsZSAobnJvd3MgPiAwKSB7CisJCS8qCisJCSAqIEZhc3Rlc3Qgd2F5IHRvIHNlcGFyYXRlIHRoZSBkYXRhIGlzIHRvIG1ha2Ugb25lIHBhc3MKKwkJICogb3ZlciB0aGUgc2NhbmxpbmUgZm9yIGVhY2ggcm93IG9mIGVhY2ggY29tcG9uZW50LgorCQkgKi8KKwkJY2x1bXBvZmZzZXQgPSAwOwkJLyogZmlyc3Qgc2FtcGxlIGluIGNsdW1wICovCisJCWZvciAoY2kgPSAwLCBjb21wcHRyID0gc3AtPmNpbmZvLmMuY29tcF9pbmZvOworCQkgICAgIGNpIDwgc3AtPmNpbmZvLmMubnVtX2NvbXBvbmVudHM7CisJCSAgICAgY2krKywgY29tcHB0cisrKSB7CisJCSAgICBpbnQgaHNhbXAgPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworCQkgICAgaW50IHZzYW1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkJICAgIGludCBwYWRkaW5nID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgLQorCQkJCQkgY2x1bXBzX3Blcl9saW5lICogaHNhbXApOworCQkgICAgZm9yICh5cG9zID0gMDsgeXBvcyA8IHZzYW1wOyB5cG9zKyspIHsKKwkJCWlucHRyID0gKChKU0FNUExFKikgYnVmKSArIGNsdW1wb2Zmc2V0OworCQkJb3V0cHRyID0gc3AtPmRzX2J1ZmZlcltjaV1bc3AtPnNjYW5jb3VudCp2c2FtcCArIHlwb3NdOworCQkJaWYgKGhzYW1wID09IDEpIHsKKwkJCSAgICAvKiBmYXN0IHBhdGggZm9yIGF0IGxlYXN0IENiIGFuZCBDciAqLworCQkJICAgIGZvciAobmNsdW1wID0gY2x1bXBzX3Blcl9saW5lOyBuY2x1bXAtLSA+IDA7ICkgeworCQkJCSpvdXRwdHIrKyA9IGlucHRyWzBdOworCQkJCWlucHRyICs9IHNhbXBsZXNfcGVyX2NsdW1wOworCQkJICAgIH0KKwkJCX0gZWxzZSB7CisJCQkgICAgLyogZ2VuZXJhbCBjYXNlICovCisJCQkgICAgZm9yIChuY2x1bXAgPSBjbHVtcHNfcGVyX2xpbmU7IG5jbHVtcC0tID4gMDsgKSB7CisJCQkJZm9yICh4cG9zID0gMDsgeHBvcyA8IGhzYW1wOyB4cG9zKyspCisJCQkJICAgICpvdXRwdHIrKyA9IGlucHRyW3hwb3NdOworCQkJCWlucHRyICs9IHNhbXBsZXNfcGVyX2NsdW1wOworCQkJICAgIH0KKwkJCX0KKwkJCS8qIHBhZCBlYWNoIHNjYW5saW5lIGFzIG5lZWRlZCAqLworCQkJZm9yICh4cG9zID0gMDsgeHBvcyA8IHBhZGRpbmc7IHhwb3MrKykgeworCQkJICAgICpvdXRwdHIgPSBvdXRwdHJbLTFdOworCQkJICAgIG91dHB0cisrOworCQkJfQorCQkJY2x1bXBvZmZzZXQgKz0gaHNhbXA7CisJCSAgICB9CisJCX0KKwkJc3AtPnNjYW5jb3VudCsrOworCQlpZiAoc3AtPnNjYW5jb3VudCA+PSBEQ1RTSVpFKSB7CisJCQlpbnQgbiA9IHNwLT5jaW5mby5jLm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKwkJCWlmIChUSUZGanBlZ193cml0ZV9yYXdfZGF0YShzcCwgc3AtPmRzX2J1ZmZlciwgbikgIT0gbikKKwkJCQlyZXR1cm4gKDApOworCQkJc3AtPnNjYW5jb3VudCA9IDA7CisJCX0KKwkJdGlmLT50aWZfcm93ICs9IHNwLT52X3NhbXBsaW5nOworCQlidWYgKz0gYnl0ZXNwZXJjbHVtcGxpbmU7CisJCW5yb3dzIC09IHNwLT52X3NhbXBsaW5nOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBzdHJpcCBvciB0aWxlLgorICovCitzdGF0aWMgaW50CitKUEVHUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCisJaWYgKHNwLT5zY2FuY291bnQgPiAwKSB7CisJCS8qCisJCSAqIE5lZWQgdG8gZW1pdCBhIHBhcnRpYWwgYnVmZmVybG9hZCBvZiBkb3duc2FtcGxlZCBkYXRhLgorCQkgKiBQYWQgdGhlIGRhdGEgdmVydGljYWxseS4KKwkJICovCisJCWludCBjaSwgeXBvcywgbjsKKwkJanBlZ19jb21wb25lbnRfaW5mbyogY29tcHB0cjsKKworCQlmb3IgKGNpID0gMCwgY29tcHB0ciA9IHNwLT5jaW5mby5jLmNvbXBfaW5mbzsKKwkJICAgICBjaSA8IHNwLT5jaW5mby5jLm51bV9jb21wb25lbnRzOworCQkgICAgIGNpKyssIGNvbXBwdHIrKykgeworCQkJaW50IHZzYW1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkJCXRtc2l6ZV90IHJvd193aWR0aCA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUKKwkJCQkqIHNpemVvZihKU0FNUExFKTsKKwkJCWZvciAoeXBvcyA9IHNwLT5zY2FuY291bnQgKiB2c2FtcDsKKwkJCSAgICAgeXBvcyA8IERDVFNJWkUgKiB2c2FtcDsgeXBvcysrKSB7CisJCQkJX1RJRkZtZW1jcHkoKHZvaWQqKXNwLT5kc19idWZmZXJbY2ldW3lwb3NdLAorCQkJCQkgICAgKHZvaWQqKXNwLT5kc19idWZmZXJbY2ldW3lwb3MtMV0sCisJCQkJCSAgICByb3dfd2lkdGgpOworCisJCQl9CisJCX0KKwkJbiA9IHNwLT5jaW5mby5jLm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKwkJaWYgKFRJRkZqcGVnX3dyaXRlX3Jhd19kYXRhKHNwLCBzcC0+ZHNfYnVmZmVyLCBuKSAhPSBuKQorCQkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKFRJRkZqcGVnX2ZpbmlzaF9jb21wcmVzcyhKU3RhdGUodGlmKSkpOworfQorCitzdGF0aWMgdm9pZAorSlBFR0NsZWFudXAoVElGRiogdGlmKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwkKKwlhc3NlcnQoc3AgIT0gMCk7CisKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IHNwLT52Z2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gc3AtPnZzZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9IHNwLT5wcmludGRpcjsKKworCWlmKCBzcCAhPSBOVUxMICkgeworCQlpZiggc3AtPmNpbmZvX2luaXRpYWxpemVkICkKKwkJICAgIFRJRkZqcGVnX2Rlc3Ryb3koc3ApOwkvKiByZWxlYXNlIGxpYmpwZWcgcmVzb3VyY2VzICovCisJCWlmIChzcC0+anBlZ3RhYmxlcykJCS8qIHRhZyB2YWx1ZSAqLworCQkJX1RJRkZmcmVlKHNwLT5qcGVndGFibGVzKTsKKwl9CisJX1RJRkZmcmVlKHRpZi0+dGlmX2RhdGEpOwkvKiByZWxlYXNlIGxvY2FsIHN0YXRlICovCisJdGlmLT50aWZfZGF0YSA9IE5VTEw7CisKKwlfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKHRpZik7Cit9CisKK3N0YXRpYyB2b2lkIAorSlBFR1Jlc2V0VXBzYW1wbGVkKCBUSUZGKiB0aWYgKQoreworCUpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwkvKgorCSAqIE1hcmsgd2hldGhlciByZXR1cm5lZCBkYXRhIGlzIHVwLXNhbXBsZWQgb3Igbm90IHNvIFRJRkZTdHJpcFNpemUKKwkgKiBhbmQgVElGRlRpbGVTaXplIHJldHVybiB2YWx1ZXMgdGhhdCByZWZsZWN0IHRoZSB0cnVlIGFtb3VudCBvZgorCSAqIGRhdGEuCisJICovCisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfVVBTQU1QTEVEOworCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcpIHsKKwkJaWYgKHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUiAmJgorCQkgICAgc3AtPmpwZWdjb2xvcm1vZGUgPT0gSlBFR0NPTE9STU9ERV9SR0IpIHsKKwkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfVVBTQU1QTEVEOworCQl9IGVsc2UgeworI2lmZGVmIG5vdGRlZgorCQkJaWYgKHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdICE9IDEgfHwKKwkJCSAgICB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXSAhPSAxKQorCQkJCTsgLyogWFhYIHdoYXQgYWJvdXQgdXAtc2FtcGxpbmc/ICovCisjZW5kaWYKKwkJfQorCX0KKworCS8qCisJICogTXVzdCByZWNhbGN1bGF0ZSBjYWNoZWQgdGlsZSBzaXplIGluIGNhc2Ugc2FtcGxpbmcgc3RhdGUgY2hhbmdlZC4KKwkgKiBTaG91bGQgd2UgcmVhbGx5IGJlIGRvaW5nIHRoaXMgbm93IGlmIGltYWdlIHNpemUgaXNuJ3Qgc2V0PyAKKwkgKi8KKyAgICAgICAgaWYoIHRpZi0+dGlmX3RpbGVzaXplID4gMCApCisgICAgICAgICAgICB0aWYtPnRpZl90aWxlc2l6ZSA9IGlzVGlsZWQodGlmKSA/IFRJRkZUaWxlU2l6ZSh0aWYpIDogKHRtc2l6ZV90KSgtMSk7ICAgCisgICAgICAgIGlmKCB0aWYtPnRpZl9zY2FubGluZXNpemUgPiAwICkKKyAgICAgICAgICAgIHRpZi0+dGlmX3NjYW5saW5lc2l6ZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsgCit9CisKK3N0YXRpYyBpbnQKK0pQRUdWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCUpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKwljb25zdCBUSUZGRmllbGQqIGZpcDsKKwl1aW50MzIgdjMyOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfSlBFR1RBQkxFUzoKKwkJdjMyID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlpZiAodjMyID09IDApIHsKKwkJCS8qIFhYWCAqLworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlfVElGRnNldEJ5dGVBcnJheSgmc3AtPmpwZWd0YWJsZXMsIHZhX2FyZyhhcCwgdm9pZCopLAorCQkgICAgKGxvbmcpIHYzMik7CisJCXNwLT5qcGVndGFibGVzX2xlbmd0aCA9IHYzMjsKKwkJVElGRlNldEZpZWxkQml0KHRpZiwgRklFTERfSlBFR1RBQkxFUyk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19KUEVHUVVBTElUWToKKwkJc3AtPmpwZWdxdWFsaXR5ID0gKGludCkgdmFfYXJnKGFwLCBpbnQpOworCQlyZXR1cm4gKDEpOwkJCS8qIHBzZXVkbyB0YWcgKi8KKwljYXNlIFRJRkZUQUdfSlBFR0NPTE9STU9ERToKKwkJc3AtPmpwZWdjb2xvcm1vZGUgPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCUpQRUdSZXNldFVwc2FtcGxlZCggdGlmICk7CisJCXJldHVybiAoMSk7CQkJLyogcHNldWRvIHRhZyAqLworCWNhc2UgVElGRlRBR19QSE9UT01FVFJJQzoKKwl7CisJCWludCByZXRfdmFsdWUgPSAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCQlKUEVHUmVzZXRVcHNhbXBsZWQoIHRpZiApOworCQlyZXR1cm4gcmV0X3ZhbHVlOworCX0KKwljYXNlIFRJRkZUQUdfSlBFR1RBQkxFU01PREU6CisJCXNwLT5qcGVndGFibGVzbW9kZSA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJcmV0dXJuICgxKTsJCQkvKiBwc2V1ZG8gdGFnICovCisJY2FzZSBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkc6CisJCS8qIG1hcmsgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGEgcmVhbCB5Y2JjcnN1YnNhbXBsaW5nISAqLworCQlzcC0+eWNiY3JzYW1wbGluZ19mZXRjaGVkID0gMTsKKwkJLyogc2hvdWxkIHdlIGJlIHJlY29tcHV0aW5nIHVwc2FtcGxpbmcgaW5mbyBoZXJlPyAqLworCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisKKwlpZiAoKGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpKSkgeworCQlUSUZGU2V0RmllbGRCaXQodGlmLCBmaXAtPmZpZWxkX2JpdCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK0pQRUdWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCUpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCXN3aXRjaCAodGFnKSB7CisJCWNhc2UgVElGRlRBR19KUEVHVEFCTEVTOgorCQkJKnZhX2FyZyhhcCwgdWludDMyKikgPSBzcC0+anBlZ3RhYmxlc19sZW5ndGg7CisJCQkqdmFfYXJnKGFwLCB2b2lkKiopID0gc3AtPmpwZWd0YWJsZXM7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0pQRUdRVUFMSVRZOgorCQkJKnZhX2FyZyhhcCwgaW50KikgPSBzcC0+anBlZ3F1YWxpdHk7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0pQRUdDT0xPUk1PREU6CisJCQkqdmFfYXJnKGFwLCBpbnQqKSA9IHNwLT5qcGVnY29sb3Jtb2RlOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHVEFCTEVTTU9ERToKKwkJCSp2YV9hcmcoYXAsIGludCopID0gc3AtPmpwZWd0YWJsZXNtb2RlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK0pQRUdQcmludERpcihUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKQoreworCUpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwkodm9pZCkgZmxhZ3M7CisKKyAgICAgICAgaWYoIHNwICE9IE5VTEwgKSB7CisJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0pQRUdUQUJMRVMpKQorCQkJZnByaW50ZihmZCwgIiAgSlBFRyBUYWJsZXM6ICglbHUgYnl0ZXMpXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSBzcC0+anBlZ3RhYmxlc19sZW5ndGgpOworCQlpZiAoc3AtPnByaW50ZGlyKQorCQkJKCpzcC0+cHJpbnRkaXIpKHRpZiwgZmQsIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB1aW50MzIKK0pQRUdEZWZhdWx0U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHMpCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCXMgPSAoKnNwLT5kZWZzcGFyZW50KSh0aWYsIHMpOworCWlmIChzIDwgdGQtPnRkX2ltYWdlbGVuZ3RoKQorCQlzID0gVElGRnJvdW5kdXBfMzIocywgdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV0gKiBEQ1RTSVpFKTsKKwlyZXR1cm4gKHMpOworfQorCitzdGF0aWMgdm9pZAorSlBFR0RlZmF1bHRUaWxlU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiogdHcsIHVpbnQzMiogdGgpCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCSgqc3AtPmRlZnRwYXJlbnQpKHRpZiwgdHcsIHRoKTsKKwkqdHcgPSBUSUZGcm91bmR1cF8zMigqdHcsIHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdICogRENUU0laRSk7CisJKnRoID0gVElGRnJvdW5kdXBfMzIoKnRoLCB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXSAqIERDVFNJWkUpOworfQorCisvKgorICogVGhlIEpQRUcgbGlicmFyeSBpbml0aWFsaXplZCB1c2VkIHRvIGJlIGRvbmUgaW4gVElGRkluaXRKUEVHKCksIGJ1dAorICogbm93IHRoYXQgd2UgYWxsb3cgYSBUSUZGIGZpbGUgdG8gYmUgb3BlbmVkIGluIHVwZGF0ZSBtb2RlIGl0IGlzIG5lY2Vzc2FyeQorICogdG8gaGF2ZSBzb21lIHdheSBvZiBkZWNpZGluZyB3aGV0aGVyIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gaXMKKyAqIGRlc2lyZWQgb3RoZXIgdGhhbiBsb29raW5nIGF0IHRpZi0+dGlmX21vZGUuICBXZSBhY2NvbXBsaXNoIHRoaXMgYnkgCisgKiBleGFtaW5pbmcge1RJTEUvU1RSSVB9QllURUNPVU5UUyB0byBzZWUgaWYgdGhlcmUgaXMgYSBub24temVybyBlbnRyeS4KKyAqIElmIHNvLCB3ZSBhc3N1bWUgZGVjb21wcmVzc2lvbiBpcyBkZXNpcmVkLiAKKyAqCisgKiBUaGlzIGlzIHRyaWNreSwgYmVjYXVzZSBUSUZGSW5pdEpQRUcoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGRpcmVjdG9yeSBpcworICogYmVpbmcgcmVhZCwgYW5kIGdlbmVyYWxseSBzcGVha2luZyB0aGUgQllURUNPVU5UUyB0YWcgd29uJ3QgaGF2ZSBiZWVuIHJlYWQKKyAqIGF0IHRoYXQgcG9pbnQuICBTbyB3ZSB0cnkgdG8gZGVmZXIganBlZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbGwgd2UKKyAqIGRvIGhhdmUgdGhhdCB0YWcgLi4uIGJhc2ljYWxseSBhbnkgYWNjZXNzIHRoYXQgbWlnaHQgcmVxdWlyZSB0aGUgY29tcHJlc3NvcgorICogb3IgZGVjb21wcmVzc29yIHRoYXQgb2NjdXJzIGFmdGVyIHRoZSByZWFkaW5nIG9mIHRoZSBkaXJlY3RvcnkuIAorICoKKyAqIEluIGFuIGlkZWFsIHdvcmxkIGNvbXByZXNzb3JzIG9yIGRlY29tcHJlc3NvcnMgd291bGQgYmUgc2V0dXAKKyAqIGF0IHRoZSBwb2ludCB3aGVyZSBhIHNpbmdsZSB0aWxlIG9yIHN0cmlwIHdhcyBhY2Nlc3NlZCAoZm9yIHJlYWQgb3Igd3JpdGUpCisgKiBzbyB0aGF0IHN0dWZmIGxpa2UgdXBkYXRlIG9mIG1pc3NpbmcgdGlsZXMsIG9yIHJlcGxhY2VtZW50IG9mIHRpbGVzIGNvdWxkCisgKiBiZSBkb25lLiBIb3dldmVyLCB3ZSBhcmVuJ3QgdHJ5aW5nIHRvIGNyYWNrIHRoYXQgbnV0IGp1c3QgeWV0IC4uLgorICoKKyAqIE5GVywgRmViIDNyZCwgMjAwMy4KKyAqLworCitzdGF0aWMgaW50IEpQRUdJbml0aWFsaXplTGliSlBFRyggVElGRiAqIHRpZiwgaW50IGRlY29tcHJlc3MgKQoreworICAgIEpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKKworICAgIGlmKHNwLT5jaW5mb19pbml0aWFsaXplZCkKKyAgICB7CisgICAgICAgIGlmKCAhZGVjb21wcmVzcyAmJiBzcC0+Y2luZm8uY29tbS5pc19kZWNvbXByZXNzb3IgKQorICAgICAgICAgICAgVElGRmpwZWdfZGVzdHJveSggc3AgKTsKKyAgICAgICAgZWxzZSBpZiggZGVjb21wcmVzcyAmJiAhc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yICkKKyAgICAgICAgICAgIFRJRkZqcGVnX2Rlc3Ryb3koIHNwICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIHNwLT5jaW5mb19pbml0aWFsaXplZCA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIGxpYmpwZWcuCisgICAgICovCisgICAgaWYgKCBkZWNvbXByZXNzICkgeworICAgICAgICBpZiAoIVRJRkZqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKHNwKSkKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFUSUZGanBlZ19jcmVhdGVfY29tcHJlc3Moc3ApKQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBzcC0+Y2luZm9faW5pdGlhbGl6ZWQgPSBUUlVFOworCisgICAgcmV0dXJuIDE7Cit9CisKK2ludAorVElGRkluaXRKUEVHKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwlKUEVHU3RhdGUqIHNwOworCisJYXNzZXJ0KHNjaGVtZSA9PSBDT01QUkVTU0lPTl9KUEVHKTsKKworCS8qCisJICogTWVyZ2UgY29kZWMtc3BlY2lmaWMgdGFnIGluZm9ybWF0aW9uLgorCSAqLworCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIGpwZWdGaWVsZHMsIFRJRkZBcnJheUNvdW50KGpwZWdGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwKKwkJCSAgICAgIlRJRkZJbml0SlBFRyIsCisJCQkgICAgICJNZXJnaW5nIEpQRUcgY29kZWMtc3BlY2lmaWMgdGFncyBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBzdGF0ZSBibG9jayBzbyB0YWcgbWV0aG9kcyBoYXZlIHN0b3JhZ2UgdG8gcmVjb3JkIHZhbHVlcy4KKwkgKi8KKwl0aWYtPnRpZl9kYXRhID0gKHVpbnQ4KikgX1RJRkZtYWxsb2Moc2l6ZW9mIChKUEVHU3RhdGUpKTsKKworCWlmICh0aWYtPnRpZl9kYXRhID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsCisJCQkgICAgICJUSUZGSW5pdEpQRUciLCAiTm8gc3BhY2UgZm9yIEpQRUcgc3RhdGUgYmxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorICAgICAgICBfVElGRm1lbXNldCh0aWYtPnRpZl9kYXRhLCAwLCBzaXplb2YoSlBFR1N0YXRlKSk7CisKKwlzcCA9IEpTdGF0ZSh0aWYpOworCXNwLT50aWYgPSB0aWY7CQkJCS8qIGJhY2sgbGluayAqLworCisJLyoKKwkgKiBPdmVycmlkZSBwYXJlbnQgZ2V0L3NldCBmaWVsZCBtZXRob2RzLgorCSAqLworCXNwLT52Z2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBKUEVHVkdldEZpZWxkOyAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisJc3AtPnZzZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IEpQRUdWU2V0RmllbGQ7IC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKwlzcC0+cHJpbnRkaXIgPSB0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyOworCXRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXIgPSBKUEVHUHJpbnREaXI7ICAgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCisJLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGNvZGVjLXNwZWNpZmljIGZpZWxkcyAqLworCXNwLT5qcGVndGFibGVzID0gTlVMTDsKKwlzcC0+anBlZ3RhYmxlc19sZW5ndGggPSAwOworCXNwLT5qcGVncXVhbGl0eSA9IDc1OwkJCS8qIERlZmF1bHQgSUpHIHF1YWxpdHkgKi8KKwlzcC0+anBlZ2NvbG9ybW9kZSA9IEpQRUdDT0xPUk1PREVfUkFXOworCXNwLT5qcGVndGFibGVzbW9kZSA9IEpQRUdUQUJMRVNNT0RFX1FVQU5UIHwgSlBFR1RBQkxFU01PREVfSFVGRjsKKyAgICAgICAgc3AtPnljYmNyc2FtcGxpbmdfZmV0Y2hlZCA9IDA7CisKKwkvKgorCSAqIEluc3RhbGwgY29kZWMgbWV0aG9kcy4KKwkgKi8KKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBKUEVHRml4dXBUYWdzOworCXRpZi0+dGlmX3NldHVwZGVjb2RlID0gSlBFR1NldHVwRGVjb2RlOworCXRpZi0+dGlmX3ByZWRlY29kZSA9IEpQRUdQcmVEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gSlBFR0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEpQRUdEZWNvZGU7CisJdGlmLT50aWZfZGVjb2RldGlsZSA9IEpQRUdEZWNvZGU7CisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBKUEVHU2V0dXBFbmNvZGU7CisJdGlmLT50aWZfcHJlZW5jb2RlID0gSlBFR1ByZUVuY29kZTsKKwl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gSlBFR1Bvc3RFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93ID0gSlBFR0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IEpQRUdFbmNvZGU7CisJdGlmLT50aWZfZW5jb2RldGlsZSA9IEpQRUdFbmNvZGU7ICAKKwl0aWYtPnRpZl9jbGVhbnVwID0gSlBFR0NsZWFudXA7CisJc3AtPmRlZnNwYXJlbnQgPSB0aWYtPnRpZl9kZWZzdHJpcHNpemU7CisJdGlmLT50aWZfZGVmc3RyaXBzaXplID0gSlBFR0RlZmF1bHRTdHJpcFNpemU7CisJc3AtPmRlZnRwYXJlbnQgPSB0aWYtPnRpZl9kZWZ0aWxlc2l6ZTsKKwl0aWYtPnRpZl9kZWZ0aWxlc2l6ZSA9IEpQRUdEZWZhdWx0VGlsZVNpemU7CisJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9OT0JJVFJFVjsJLyogbm8gYml0IHJldmVyc2FsLCBwbGVhc2UgKi8KKworICAgICAgICBzcC0+Y2luZm9faW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworCS8qCisgICAgICAgICoqIENyZWF0ZSBhIEpQRUdUYWJsZXMgZmllbGQgaWYgbm8gZGlyZWN0b3J5IGhhcyB5ZXQgYmVlbiBjcmVhdGVkLiAKKyAgICAgICAgKiogV2UgZG8gdGhpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHN1ZmZpY2llbnQgc3BhY2UgaXMgcmVzZXJ2ZWQgZm9yCisgICAgICAgICoqIHRoZSBKUEVHVGFibGVzIGZpZWxkLiAgSXQgd2lsbCBiZSBwcm9wZXJseSBjcmVhdGVkIHRoZSByaWdodAorICAgICAgICAqKiBzaXplIGxhdGVyLiAKKyAgICAgICAgKi8KKyAgICAgICAgaWYoIHRpZi0+dGlmX2Rpcm9mZiA9PSAwICkKKyAgICAgICAgeworI2RlZmluZSBTSVpFX09GX0pQRUdUQUJMRVMgMjAwMAorLyoKK1RoZSBmb2xsb3dpbmcgbGluZSBhc3N1bWVzIGluY29ycmVjdGx5IHRoYXQgYWxsIEpQRUctaW4tVElGRiBmaWxlcyB3aWxsIGhhdmUKK2EgSlBFR1RBQkxFUyB0YWcgZ2VuZXJhdGVkIGFuZCBjYXVzZXMgbnVsbC1maWxsZWQgSlBFR1RBQkxFUyB0YWdzIHRvIGJlIHdyaXR0ZW4KK3doZW4gdGhlIEpQRUcgZGF0YSBpcyBwbGFjZWQgd2l0aCBUSUZGV3JpdGVSYXdTdHJpcC4gIFRoZSBmaWVsZCBiaXQgc2hvdWxkIGJlIAorc2V0LCBhbnl3YXksIGxhdGVyIHdoZW4gYWN0dWFsIEpQRUdUQUJMRVMgaGVhZGVyIGlzIGdlbmVyYXRlZCwgc28gcmVtb3ZpbmcgaXQgCitoZXJlIGhvcGVmdWxseSBpcyBoYXJtbGVzcy4KKyAgICAgICAgICAgIFRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX0pQRUdUQUJMRVMpOworKi8KKyAgICAgICAgICAgIHNwLT5qcGVndGFibGVzX2xlbmd0aCA9IFNJWkVfT0ZfSlBFR1RBQkxFUzsKKyAgICAgICAgICAgIHNwLT5qcGVndGFibGVzID0gKHZvaWQgKikgX1RJRkZtYWxsb2Moc3AtPmpwZWd0YWJsZXNfbGVuZ3RoKTsKKwkgICAgLy8gRklYTUU6IE5VTEwtZGVyZWYgYWZ0ZXIgbWFsbG9jIGZhaWx1cmUKKwkgICAgX1RJRkZtZW1zZXQoc3AtPmpwZWd0YWJsZXMsIDAsIFNJWkVfT0ZfSlBFR1RBQkxFUyk7CisjdW5kZWYgU0laRV9PRl9KUEVHVEFCTEVTCisgICAgICAgIH0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIEpQRUdfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2x1di5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfbHV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyMjk4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX2x1di5jCkBAIC0wLDAgKzEsMTY4NyBAQAorLyogJElkOiB0aWZfbHV2LmMsdiAxLjM1IDIwMTEtMDQtMDIgMjA6NTQ6MDkgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBHcmVnIFdhcmQgTGFyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciwgR3JlZyBMYXJzb24gYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueQorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywKKyAqIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciwgR3JlZyBMYXJzb24gYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIsIEdSRUcgTEFSU09OIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFCisgKiBGT1IgQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIExPR0xVVl9TVVBQT1JUCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKiBMb2dMdXYgY29tcHJlc3Npb24gc3VwcG9ydCBmb3IgaGlnaCBkeW5hbWljIHJhbmdlIGltYWdlcy4KKyAqCisgKiBDb250cmlidXRlZCBieSBHcmVnIExhcnNvbi4KKyAqCisgKiBMb2dMdXYgaW1hZ2Ugc3VwcG9ydCB1c2VzIHRoZSBUSUZGIGxpYnJhcnkgdG8gc3RvcmUgMTYgb3IgMTAtYml0CisgKiBsb2cgbHVtaW5hbmNlIHZhbHVlcyB3aXRoIDggYml0cyBlYWNoIG9mIHUgYW5kIHYgb3IgYSAxNC1iaXQgaW5kZXguCisgKgorICogVGhlIGNvZGVjIGNhbiB0YWtlIGFzIGlucHV0IGFuZCBwcm9kdWNlIGFzIG91dHB1dCAzMi1iaXQgSUVFRSBmbG9hdCB2YWx1ZXMgCisgKiBhcyB3ZWxsIGFzIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcy4gIEEgMTYtYml0IGx1bWluYW5jZSBpcyBpbnRlcnByZXRlZAorICogYXMgYSBzaWduIGJpdCBmb2xsb3dlZCBieSBhIDE1LWJpdCBpbnRlZ2VyIHRoYXQgaXMgY29udmVydGVkCisgKiB0byBhbmQgZnJvbSBhIGxpbmVhciBtYWduaXR1ZGUgdXNpbmcgdGhlIHRyYW5zZm9ybWF0aW9uOgorICoKKyAqCUwgPSAyXiggKExlKy41KS8yNTYgLSA2NCApCQkjIHJlYWwgZnJvbSAxNS1iaXQKKyAqCisgKglMZSA9IGZsb29yKCAyNTYqKGxvZzIoTCkgKyA2NCkgKQkjIDE1LWJpdCBmcm9tIHJlYWwKKyAqCisgKiBUaGUgYWN0dWFsIGNvbnZlcnNpb24gdG8gd29ybGQgbHVtaW5hbmNlIHVuaXRzIGluIGNhbmRlbGFzIHBlciBzcS4gbWV0ZXIKKyAqIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgbXVsdGlwbGllciwgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBUSUZGVEFHX1NUT05JVFMuCisgKiBUaGlzIHZhbHVlIGlzIHVzdWFsbHkgc2V0IHN1Y2ggdGhhdCBhIHJlYXNvbmFibGUgZXhwb3N1cmUgY29tZXMgZnJvbQorICogY2xhbXBpbmcgZGVjb2RlZCBsdW1pbmFuY2VzIGFib3ZlIDEgdG8gMSBpbiB0aGUgZGlzcGxheWVkIGltYWdlLgorICoKKyAqIFRoZSAxNi1iaXQgdmFsdWVzIGZvciB1IGFuZCB2IG1heSBiZSBjb252ZXJ0ZWQgdG8gcmVhbCB2YWx1ZXMgYnkgZGl2aWRpbmcKKyAqIGVhY2ggYnkgMzI3NjguICAoVGhpcyBhbGxvd3MgZm9yIG5lZ2F0aXZlIHZhbHVlcywgd2hpY2ggYXJlbid0IHVzZWZ1bCBhcworICogZmFyIGFzIHdlIGtub3csIGJ1dCBhcmUgbGVmdCBpbiBjYXNlIG9mIGZ1dHVyZSBpbXByb3ZlbWVudHMgaW4gaHVtYW4KKyAqIGNvbG9yIHZpc2lvbi4pCisgKgorICogQ29udmVyc2lvbiBmcm9tICh1LHYpLCB3aGljaCBpcyBhY3R1YWxseSB0aGUgQ0lFICh1Jyx2Jykgc3lzdGVtIGZvcgorICogeW91IGNvbG9yIHNjaWVudGlzdHMsIGlzIGFjY29tcGxpc2hlZCBieSB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9uOgorICoKKyAqCXUgPSA0KnggLyAoLTIqeCArIDEyKnkgKyAzKQorICoJdiA9IDkqeSAvICgtMip4ICsgMTIqeSArIDMpCisgKgorICoJeCA9IDkqdSAvICg2KnUgLSAxNip2ICsgMTIpCisgKgl5ID0gNCp2IC8gKDYqdSAtIDE2KnYgKyAxMikKKyAqCisgKiBUaGlzIHByb2Nlc3MgaXMgZ3JlYXRseSBzaW1wbGlmaWVkIGJ5IHBhc3NpbmcgMzItYml0IElFRUUgZmxvYXRzCisgKiBmb3IgZWFjaCBvZiB0aHJlZSBDSUUgWFlaIGNvb3JkaW5hdGVzLiAgVGhlIGNvZGVjIHRoZW4gdGFrZXMgY2FyZQorICogb2YgY29udmVyc2lvbiB0byBhbmQgZnJvbSBMb2dMdXYsIHRob3VnaCB0aGUgYXBwbGljYXRpb24gaXMgc3RpbGwKKyAqIHJlc3BvbnNpYmxlIGZvciBpbnRlcnByZXRpbmcgdGhlIFRJRkZUQUdfU1RPTklUUyBjYWxpYnJhdGlvbiBmYWN0b3IuCisgKgorICogQnkgZGVmaW5pdGlvbiwgYSBDSUUgWFlaIHZlY3RvciBvZiBbMSAxIDFdIGNvcnJlc3BvbmRzIHRvIGEgbmV1dHJhbCB3aGl0ZQorICogcG9pbnQgb2YgKHgseSk9KDEvMywxLzMpLiAgSG93ZXZlciwgbW9zdCBjb2xvciBzeXN0ZW1zIGFzc3VtZSBzb21lIG90aGVyCisgKiB3aGl0ZSBwb2ludCwgc3VjaCBhcyBENjUsIGFuZCBhbiBhYnNvbHV0ZSBjb2xvciBjb252ZXJzaW9uIHRvIFhZWiB0aGVuCisgKiB0byBhbm90aGVyIGNvbG9yIHNwYWNlIHdpdGggYSBkaWZmZXJlbnQgd2hpdGUgcG9pbnQgbWF5IGludHJvZHVjZSBhbgorICogdW53YW50ZWQgY29sb3IgY2FzdCB0byB0aGUgaW1hZ2UuICBJdCBpcyBvZnRlbiBkZXNpcmFibGUsIHRoZXJlZm9yZSwgdG8KKyAqIHBlcmZvcm0gYSB3aGl0ZSBwb2ludCBjb252ZXJzaW9uIHRoYXQgbWFwcyB0aGUgaW5wdXQgd2hpdGUgdG8gWzEgMSAxXQorICogaW4gWFlaLCB0aGVuIHJlY29yZCB0aGUgb3JpZ2luYWwgd2hpdGUgcG9pbnQgdXNpbmcgdGhlIFRJRkZUQUdfV0hJVEVQT0lOVAorICogdGFnIHZhbHVlLiAgQSBkZWNvZGVyIHRoYXQgZGVtYW5kcyBhYnNvbHV0ZSBjb2xvciBjYWxpYnJhdGlvbiBtYXkgdXNlCisgKiB0aGlzIHdoaXRlIHBvaW50IHRhZyB0byBnZXQgYmFjayB0aGUgb3JpZ2luYWwgY29sb3JzLCBidXQgdXN1YWxseSBpdAorICogd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgbmV3IHdoaXRlIHBvaW50IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIHRoYXQKKyAqIG1hdGNoZXMgdGhlIG91dHB1dCBjb2xvciBzcGFjZS4KKyAqCisgKiBQaXhlbCBpbmZvcm1hdGlvbiBpcyBjb21wcmVzc2VkIGludG8gb25lIG9mIHR3byBiYXNpYyBlbmNvZGluZ3MsIGRlcGVuZGluZworICogb24gdGhlIHNldHRpbmcgb2YgdGhlIGNvbXByZXNzaW9uIHRhZywgd2hpY2ggaXMgb25lIG9mIENPTVBSRVNTSU9OX1NHSUxPRworICogb3IgQ09NUFJFU1NJT05fU0dJTE9HMjQuICBGb3IgQ09NUFJFU1NJT05fU0dJTE9HLCBncmV5c2NhbGUgZGF0YSBpcworICogc3RvcmVkIGFzOgorICoKKyAqCSAxICAgICAgIDE1CisgKgl8LSstLS0tLS0tLS0tLS0tLS18CisgKgorICogQ09NUFJFU1NJT05fU0dJTE9HIGNvbG9yIGRhdGEgaXMgc3RvcmVkIGFzOgorICoKKyAqCSAxICAgICAgIDE1ICAgICAgICAgICA4ICAgICAgICA4CisgKgl8LSstLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0rLS0tLS0tLS18CisgKgkgUyAgICAgICBMZSAgICAgICAgICAgdWUgICAgICAgdmUKKyAqCisgKiBGb3IgdGhlIDI0LWJpdCBDT01QUkVTU0lPTl9TR0lMT0cyNCBjb2xvciBmb3JtYXQsIHRoZSBkYXRhIGlzIHN0b3JlZCBhczoKKyAqCisgKgkgICAgIDEwICAgICAgICAgICAxNAorICoJfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18CisgKgkgICAgIExlJyAgICAgICAgICBDZQorICoKKyAqIFRoZXJlIGlzIG5vIHNpZ24gYml0IGluIHRoZSAyNC1iaXQgY2FzZSwgYW5kIHRoZSAodSx2KSBjaHJvbWF0aWNpdHkgaXMKKyAqIGVuY29kZWQgYXMgYW4gaW5kZXggZm9yIG9wdGltYWwgY29sb3IgcmVzb2x1dGlvbi4gIFRoZSAxMCBsb2cgYml0cyBhcmUKKyAqIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9uczoKKyAqCisgKglMID0gMl4oKExlJysuNSkvNjQgLSAxMikJCSMgcmVhbCBmcm9tIDEwLWJpdAorICoKKyAqCUxlJyA9IGZsb29yKCA2NCoobG9nMihMKSArIDEyKSApCSMgMTAtYml0IGZyb20gcmVhbAorICoKKyAqIFRoZSAxMCBiaXRzIG9mIHRoZSBzbWFsbGVyIGZvcm1hdCBtYXkgYmUgY29udmVydGVkIGludG8gdGhlIDE1IGJpdHMgb2YKKyAqIHRoZSBsYXJnZXIgZm9ybWF0IGJ5IG11bHRpcGx5aW5nIGJ5IDQgYW5kIGFkZGluZyAxMzMxNC4gIE9idmlvdXNseSwKKyAqIGEgc21hbGxlciByYW5nZSBvZiBtYWduaXR1ZGVzIGlzIGNvdmVyZWQgKGFib3V0IDUgb3JkZXJzIG9mIG1hZ25pdHVkZQorICogaW5zdGVhZCBvZiAzOCksIGFuZCB0aGUgbGFjayBvZiBhIHNpZ24gYml0IG1lYW5zIHRoYXQgbmVnYXRpdmUgbHVtaW5hbmNlcworICogYXJlIG5vdCBhbGxvd2VkLiAgKFdlbGwsIHRoZXkgYXJlbid0IGFsbG93ZWQgaW4gdGhlIHJlYWwgd29ybGQsIGVpdGhlciwKKyAqIGJ1dCB0aGV5IGFyZSB1c2VmdWwgZm9yIGNlcnRhaW4gdHlwZXMgb2YgaW1hZ2UgcHJvY2Vzc2luZy4pCisgKgorICogVGhlIGRlc2lyZWQgdXNlciBmb3JtYXQgaXMgY29udHJvbGxlZCBieSB0aGUgc2V0dGluZyB0aGUgaW50ZXJuYWwKKyAqIHBzZXVkbyB0YWcgVElGRlRBR19TR0lMT0dEQVRBRk1UIHRvIG9uZSBvZjoKKyAqICBTR0lMT0dEQVRBRk1UX0ZMT0FUICAgICAgID0gSUVFRSAzMi1iaXQgZmxvYXQgWFlaIHZhbHVlcworICogIFNHSUxPR0RBVEFGTVRfMTZCSVQJICAgICAgPSAxNi1iaXQgaW50ZWdlciBlbmNvZGluZ3Mgb2YgbG9nTCwgdSBhbmQgdgorICogUmF3IGRhdGEgaS9vIGlzIGFsc28gcG9zc2libGUgdXNpbmc6CisgKiAgU0dJTE9HREFUQUZNVF9SQVcgICAgICAgICA9IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggZW5jb2RlZCBwaXhlbAorICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgZGVjb2RpbmcgaXMgcHJvdmlkZWQgZm9yIGVhc2Ugb2YgZGlzcGxheToKKyAqICBTR0lMT0dEQVRBRk1UXzhCSVQgICAgICAgID0gOC1iaXQgZGVmYXVsdCBSR0IgZ2FtbWEtY29ycmVjdGVkIHZhbHVlcworICoKKyAqIEZvciBncmF5c2NhbGUgaW1hZ2VzLCB3ZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgZGF0YSBmb3JtYXRzOgorICogIFNHSUxPR0RBVEFGTVRfRkxPQVQgICAgICAgPSBJRUVFIDMyLWJpdCBmbG9hdCBZIHZhbHVlcworICogIFNHSUxPR0RBVEFGTVRfMTZCSVQgICAgICAgPSAxNi1iaXQgaW50ZWdlciB3LyBlbmNvZGVkIGx1bWluYW5jZQorICogIFNHSUxPR0RBVEFGTVRfOEJJVCAgICAgICAgPSA4LWJpdCBncmF5IG1vbml0b3IgdmFsdWVzCisgKgorICogTm90ZSB0aGF0IHRoZSBDT01QUkVTU0lPTl9TR0lMT0cgYXBwbGllcyBhIHNpbXBsZSBydW4tbGVuZ3RoIGVuY29kaW5nCisgKiBzY2hlbWUgYnkgc2VwYXJhdGluZyB0aGUgbG9nTCwgdSBhbmQgdiBieXRlcyBmb3IgZWFjaCByb3cgYW5kIGFwcGx5aW5nCisgKiBhIFBhY2tCaXRzIHR5cGUgb2YgY29tcHJlc3Npb24uICBTaW5jZSB0aGUgMjQtYml0IGVuY29kaW5nIGlzIG5vdAorICogYWRhcHRpdmUsIHRoZSAzMi1iaXQgY29sb3IgZm9ybWF0IHRha2VzIGxlc3Mgc3BhY2UgaW4gbWFueSBjYXNlcy4KKyAqCisgKiBGdXJ0aGVyIGNvbnRyb2wgaXMgcHJvdmlkZWQgb3ZlciB0aGUgY29udmVyc2lvbiBmcm9tIGhpZ2hlci1yZXNvbHV0aW9uCisgKiBmb3JtYXRzIHRvIGZpbmFsIGVuY29kZWQgdmFsdWVzIHRocm91Z2ggdGhlIHBzZXVkbyB0YWcKKyAqIFRJRkZUQUdfU0dJTE9HRU5DT0RFOgorICogIFNHSUxPR0VOQ09ERV9OT0RJVEhFUiAgICAgPSBkbyBub3QgZGl0aGVyIGVuY29kZWQgdmFsdWVzCisgKiAgU0dJTE9HRU5DT0RFX1JBTkRJVEhFUiAgICA9IGFwcGx5IHJhbmRvbSBkaXRoZXJpbmcgZHVyaW5nIGVuY29kaW5nCisgKgorICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyB0YWcgaXMgU0dJTE9HRU5DT0RFX05PRElUSEVSIGZvcgorICogQ09NUFJFU1NJT05fU0dJTE9HIHRvIG1heGltaXplIHJ1bi1sZW5ndGggZW5jb2RpbmcgYW5kCisgKiBTR0lMT0dFTkNPREVfUkFORElUSEVSIGZvciBDT01QUkVTU0lPTl9TR0lMT0cyNCB0byB0dXJuCisgKiBxdWFudGl6YXRpb24gZXJyb3JzIGludG8gbm9pc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogU3RhdGUgYmxvY2sgZm9yIGVhY2ggb3BlbiBUSUZGCisgKiBmaWxlIHVzaW5nIExvZ0x1diBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBsb2dMdXZTdGF0ZSBMb2dMdXZTdGF0ZTsKKworc3RydWN0IGxvZ0x1dlN0YXRlIHsKKwlpbnQgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGFmbXQ7ICAgLyogdXNlciBkYXRhIGZvcm1hdCAqLworCWludCAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9tZXRoOyAgICAvKiBlbmNvZGluZyBtZXRob2QgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBwaXhlbF9zaXplOyAgICAgLyogYnl0ZXMgcGVyIHBpeGVsICovCisKKwl1aW50OCogICAgICAgICAgICAgICAgICB0YnVmOyAgICAgICAgICAgLyogdHJhbnNsYXRpb24gYnVmZmVyICovCisJdG1zaXplX3QgICAgICAgICAgICAgICAgdGJ1ZmxlbjsgICAgICAgIC8qIGJ1ZmZlciBsZW5ndGggKi8KKwl2b2lkICgqdGZ1bmMpKExvZ0x1dlN0YXRlKiwgdWludDgqLCB0bXNpemVfdCk7CisKKwlUSUZGVlNldE1ldGhvZCAgICAgICAgICB2Z2V0cGFyZW50OyAgICAgLyogc3VwZXItY2xhc3MgbWV0aG9kICovCisJVElGRlZTZXRNZXRob2QgICAgICAgICAgdnNldHBhcmVudDsgICAgIC8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworfTsKKworI2RlZmluZSBEZWNvZGVyU3RhdGUodGlmKQkoKExvZ0x1dlN0YXRlKikgKHRpZiktPnRpZl9kYXRhKQorI2RlZmluZSBFbmNvZGVyU3RhdGUodGlmKQkoKExvZ0x1dlN0YXRlKikgKHRpZiktPnRpZl9kYXRhKQorCisjZGVmaW5lIFNHSUxPR0RBVEFGTVRfVU5LTk9XTiAtMQorCisjZGVmaW5lIE1JTlJVTiA0IC8qIG1pbmltdW0gcnVuIGxlbmd0aCAqLworCisvKgorICogRGVjb2RlIGEgc3RyaW5nIG9mIDE2LWJpdCBncmF5IHBpeGVscy4KKyAqLworc3RhdGljIGludAorTG9nTDE2RGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxvZ0wxNkRlY29kZSI7CisJTG9nTHV2U3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJaW50IHNoZnQ7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBucGl4ZWxzOworCXVuc2lnbmVkIGNoYXIqIGJwOworCWludDE2KiB0cDsKKwlpbnQxNiBiOworCXRtc2l6ZV90IGNjOworCWludCByYzsKKworCWFzc2VydChzID09IDApOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCW5waXhlbHMgPSBvY2MgLyBzcC0+cGl4ZWxfc2l6ZTsKKworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfMTZCSVQpCisJCXRwID0gKGludDE2Kikgb3A7CisJZWxzZSB7CisJCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKKwkJdHAgPSAoaW50MTYqKSBzcC0+dGJ1ZjsKKwl9CisJX1RJRkZtZW1zZXQoKHZvaWQqKSB0cCwgMCwgbnBpeGVscypzaXplb2YgKHRwWzBdKSk7CisKKwlicCA9ICh1bnNpZ25lZCBjaGFyKikgdGlmLT50aWZfcmF3Y3A7CisJY2MgPSB0aWYtPnRpZl9yYXdjYzsKKwkvKiBnZXQgZWFjaCBieXRlIHN0cmluZyAqLworCWZvciAoc2hmdCA9IDIqODsgKHNoZnQgLT0gOCkgPj0gMDsgKSB7CisJCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzICYmIGNjID4gMDsgKQorCQkJaWYgKCpicCA+PSAxMjgpIHsJCS8qIHJ1biAqLworCQkJCXJjID0gKmJwKysgKyAoMi0xMjgpOyAgIC8qIFRPRE86IHBvdGVudGlhbCBpbnB1dCBidWZmZXIgb3ZlcnJ1biB3aGVuIGRlY29kaW5nIGNvcnJ1cHQgb3IgdHJ1bmNhdGVkIGRhdGEgKi8KKwkJCQliID0gKGludDE2KSgqYnArKyA8PCBzaGZ0KTsKKwkJCQljYyAtPSAyOworCQkJCXdoaWxlIChyYy0tICYmIGkgPCBucGl4ZWxzKQorCQkJCQl0cFtpKytdIHw9IGI7CisJCQl9IGVsc2UgewkJCS8qIG5vbi1ydW4gKi8KKwkJCQlyYyA9ICpicCsrOwkJLyogbnVsIGlzIG5vb3AgKi8KKwkJCQl3aGlsZSAoLS1jYyAmJiByYy0tICYmIGkgPCBucGl4ZWxzKQorCQkJCQl0cFtpKytdIHw9IChpbnQxNikqYnArKyA8PCBzaGZ0OworCQkJfQorCQlpZiAoaSAhPSBucGl4ZWxzKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIk5vdCBlbm91Z2ggZGF0YSBhdCByb3cgJWx1IChzaG9ydCAlSTY0ZCBwaXhlbHMpIiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgKG5waXhlbHMgLSBpKSk7CisjZWxzZQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiTm90IGVub3VnaCBkYXRhIGF0IHJvdyAlbHUgKHNob3J0ICVsbHUgcGl4ZWxzKSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgKG5waXhlbHMgLSBpKSk7CisjZW5kaWYKKwkJCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJCQl0aWYtPnRpZl9yYXdjYyA9IGNjOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKwkoKnNwLT50ZnVuYykoc3AsIG9wLCBucGl4ZWxzKTsKKwl0aWYtPnRpZl9yYXdjcCA9ICh1aW50OCopIGJwOworCXRpZi0+dGlmX3Jhd2NjID0gY2M7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIERlY29kZSBhIHN0cmluZyBvZiAyNC1iaXQgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitMb2dMdXZEZWNvZGUyNChUSUZGKiB0aWYsIHVpbnQ4KiBvcCwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMb2dMdXZEZWNvZGUyNCI7CisJTG9nTHV2U3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJdG1zaXplX3QgY2M7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBucGl4ZWxzOworCXVuc2lnbmVkIGNoYXIqIGJwOworCXVpbnQzMiogdHA7CisKKwlhc3NlcnQocyA9PSAwKTsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwlucGl4ZWxzID0gb2NjIC8gc3AtPnBpeGVsX3NpemU7CisKKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBTR0lMT0dEQVRBRk1UX1JBVykKKwkJdHAgPSAodWludDMyICopb3A7CisJZWxzZSB7CisJCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKKwkJdHAgPSAodWludDMyICopIHNwLT50YnVmOworCX0KKwkvKiBjb3B5IHRvIGFycmF5IG9mIHVpbnQzMiAqLworCWJwID0gKHVuc2lnbmVkIGNoYXIqKSB0aWYtPnRpZl9yYXdjcDsKKwljYyA9IHRpZi0+dGlmX3Jhd2NjOworCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzICYmIGNjID4gMDsgaSsrKSB7CisJCXRwW2ldID0gYnBbMF0gPDwgMTYgfCBicFsxXSA8PCA4IHwgYnBbMl07CisJCWJwICs9IDM7CisJCWNjIC09IDM7CisJfQorCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlpZiAoaSAhPSBucGl4ZWxzKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJOb3QgZW5vdWdoIGRhdGEgYXQgcm93ICVsdSAoc2hvcnQgJUk2NGQgcGl4ZWxzKSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSAobnBpeGVscyAtIGkpKTsKKyNlbHNlCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiTm90IGVub3VnaCBkYXRhIGF0IHJvdyAlbHUgKHNob3J0ICVsbHUgcGl4ZWxzKSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIChucGl4ZWxzIC0gaSkpOworI2VuZGlmCisJCXJldHVybiAoMCk7CisJfQorCSgqc3AtPnRmdW5jKShzcCwgb3AsIG5waXhlbHMpOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBzdHJpbmcgb2YgMzItYml0IHBpeGVscy4KKyAqLworc3RhdGljIGludAorTG9nTHV2RGVjb2RlMzIoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTHV2RGVjb2RlMzIiOworCUxvZ0x1dlN0YXRlKiBzcDsKKwlpbnQgc2hmdDsKKwl0bXNpemVfdCBpOworCXRtc2l6ZV90IG5waXhlbHM7CisJdW5zaWduZWQgY2hhciogYnA7CisJdWludDMyKiB0cDsKKwl1aW50MzIgYjsKKwl0bXNpemVfdCBjYzsKKwlpbnQgcmM7CisKKwlhc3NlcnQocyA9PSAwKTsKKwlzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCW5waXhlbHMgPSBvY2MgLyBzcC0+cGl4ZWxfc2l6ZTsKKworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfUkFXKQorCQl0cCA9ICh1aW50MzIqKSBvcDsKKwllbHNlIHsKKwkJYXNzZXJ0KHNwLT50YnVmbGVuID49IG5waXhlbHMpOworCQl0cCA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsKKwl9CisJX1RJRkZtZW1zZXQoKHZvaWQqKSB0cCwgMCwgbnBpeGVscypzaXplb2YgKHRwWzBdKSk7CisKKwlicCA9ICh1bnNpZ25lZCBjaGFyKikgdGlmLT50aWZfcmF3Y3A7CisJY2MgPSB0aWYtPnRpZl9yYXdjYzsKKwkvKiBnZXQgZWFjaCBieXRlIHN0cmluZyAqLworCWZvciAoc2hmdCA9IDQqODsgKHNoZnQgLT0gOCkgPj0gMDsgKSB7CisJCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzICYmIGNjID4gMDsgKQorCQkJaWYgKCpicCA+PSAxMjgpIHsJCS8qIHJ1biAqLworCQkJCXJjID0gKmJwKysgKyAoMi0xMjgpOworCQkJCWIgPSAodWludDMyKSpicCsrIDw8IHNoZnQ7CisJCQkJY2MgLT0gMjsgICAgICAgICAgICAgICAgLyogVE9ETzogcG90ZW50aWFsIGlucHV0IGJ1ZmZlciBvdmVycnVuIHdoZW4gZGVjb2RpbmcgY29ycnVwdCBvciB0cnVuY2F0ZWQgZGF0YSAqLworCQkJCXdoaWxlIChyYy0tICYmIGkgPCBucGl4ZWxzKQorCQkJCQl0cFtpKytdIHw9IGI7CisJCQl9IGVsc2UgewkJCS8qIG5vbi1ydW4gKi8KKwkJCQlyYyA9ICpicCsrOwkJLyogbnVsIGlzIG5vb3AgKi8KKwkJCQl3aGlsZSAoLS1jYyAmJiByYy0tICYmIGkgPCBucGl4ZWxzKQorCQkJCQl0cFtpKytdIHw9ICh1aW50MzIpKmJwKysgPDwgc2hmdDsKKwkJCX0KKwkJaWYgKGkgIT0gbnBpeGVscykgeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIk5vdCBlbm91Z2ggZGF0YSBhdCByb3cgJWx1IChzaG9ydCAlSTY0ZCBwaXhlbHMpIiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgKG5waXhlbHMgLSBpKSk7CisjZWxzZQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJOb3QgZW5vdWdoIGRhdGEgYXQgcm93ICVsdSAoc2hvcnQgJWxsdSBwaXhlbHMpIiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSAobnBpeGVscyAtIGkpKTsKKyNlbmRpZgorCQkJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBicDsKKwkJCXRpZi0+dGlmX3Jhd2NjID0gY2M7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCSgqc3AtPnRmdW5jKShzcCwgb3AsIG5waXhlbHMpOworCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgc3RyaXAgb2YgcGl4ZWxzLiAgV2UgYnJlYWsgaXQgaW50byByb3dzIHRvCisgKiBtYWludGFpbiBzeW5jaHJvbnkgd2l0aCB0aGUgZW5jb2RlIGFsZ29yaXRobSwgd2hpY2gKKyAqIGlzIHJvdyBieSByb3cuCisgKi8KK3N0YXRpYyBpbnQKK0xvZ0x1dkRlY29kZVN0cmlwKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJdG1zaXplX3Qgcm93bGVuID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCisJYXNzZXJ0KGNjJXJvd2xlbiA9PSAwKTsKKwl3aGlsZSAoY2MgJiYgKCp0aWYtPnRpZl9kZWNvZGVyb3cpKHRpZiwgYnAsIHJvd2xlbiwgcykpCisJCWJwICs9IHJvd2xlbiwgY2MgLT0gcm93bGVuOworCXJldHVybiAoY2MgPT0gMCk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSB0aWxlIG9mIHBpeGVscy4gIFdlIGJyZWFrIGl0IGludG8gcm93cyB0bworICogbWFpbnRhaW4gc3luY2hyb255IHdpdGggdGhlIGVuY29kZSBhbGdvcml0aG0sIHdoaWNoCisgKiBpcyByb3cgYnkgcm93LgorICovCitzdGF0aWMgaW50CitMb2dMdXZEZWNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJdG1zaXplX3Qgcm93bGVuID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisKKwlhc3NlcnQoY2Mlcm93bGVuID09IDApOworCXdoaWxlIChjYyAmJiAoKnRpZi0+dGlmX2RlY29kZXJvdykodGlmLCBicCwgcm93bGVuLCBzKSkKKwkJYnAgKz0gcm93bGVuLCBjYyAtPSByb3dsZW47CisJcmV0dXJuIChjYyA9PSAwKTsKK30KKworLyoKKyAqIEVuY29kZSBhIHJvdyBvZiAxNi1iaXQgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitMb2dMMTZFbmNvZGUoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlMb2dMdXZTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwlpbnQgc2hmdDsKKwl0bXNpemVfdCBpOworCXRtc2l6ZV90IGo7CisJdG1zaXplX3QgbnBpeGVsczsKKwl1aW50OCogb3A7CisJaW50MTYqIHRwOworCWludDE2IGI7CisJdG1zaXplX3Qgb2NjOworCWludCByYz0wLCBtYXNrOworCXRtc2l6ZV90IGJlZzsKKworCWFzc2VydChzID09IDApOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlucGl4ZWxzID0gY2MgLyBzcC0+cGl4ZWxfc2l6ZTsKKworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfMTZCSVQpCisJCXRwID0gKGludDE2KikgYnA7CisJZWxzZSB7CisJCXRwID0gKGludDE2Kikgc3AtPnRidWY7CisJCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKKwkJKCpzcC0+dGZ1bmMpKHNwLCBicCwgbnBpeGVscyk7CisJfQorCS8qIGNvbXByZXNzIGVhY2ggYnl0ZSBzdHJpbmcgKi8KKwlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCW9jYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdGlmLT50aWZfcmF3Y2M7CisJZm9yIChzaGZ0ID0gMio4OyAoc2hmdCAtPSA4KSA+PSAwOyApCisJCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzOyBpICs9IHJjKSB7CisJCQlpZiAob2NjIDwgNCkgeworCQkJCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKKwkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJCXJldHVybiAoLTEpOworCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwkJCX0KKwkJCW1hc2sgPSAweGZmIDw8IHNoZnQ7CQkvKiBmaW5kIG5leHQgcnVuICovCisJCQlmb3IgKGJlZyA9IGk7IGJlZyA8IG5waXhlbHM7IGJlZyArPSByYykgeworCQkJCWIgPSAoaW50MTYpICh0cFtiZWddICYgbWFzayk7CisJCQkJcmMgPSAxOworCQkJCXdoaWxlIChyYyA8IDEyNysyICYmIGJlZytyYyA8IG5waXhlbHMgJiYKKwkJCQkgICAgKHRwW2JlZytyY10gJiBtYXNrKSA9PSBiKQorCQkJCQlyYysrOworCQkJCWlmIChyYyA+PSBNSU5SVU4pCisJCQkJCWJyZWFrOwkJLyogbG9uZyBlbm91Z2ggKi8KKwkJCX0KKwkJCWlmIChiZWctaSA+IDEgJiYgYmVnLWkgPCBNSU5SVU4pIHsKKwkJCQliID0gKGludDE2KSAodHBbaV0gJiBtYXNrKTsvKmNoZWNrIHNob3J0IHJ1biAqLworCQkJCWogPSBpKzE7CisJCQkJd2hpbGUgKCh0cFtqKytdICYgbWFzaykgPT0gYikKKwkJCQkJaWYgKGogPT0gYmVnKSB7CisJCQkJCQkqb3ArKyA9ICh1aW50OCkoMTI4LTIrai1pKTsKKwkJCQkJCSpvcCsrID0gKHVpbnQ4KShiID4+IHNoZnQpOworCQkJCQkJb2NjIC09IDI7CisJCQkJCQlpID0gYmVnOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCX0KKwkJCXdoaWxlIChpIDwgYmVnKSB7CQkvKiB3cml0ZSBvdXQgbm9uLXJ1biAqLworCQkJCWlmICgoaiA9IGJlZy1pKSA+IDEyNykgaiA9IDEyNzsKKwkJCQlpZiAob2NjIDwgaiszKSB7CisJCQkJCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJCQkJCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisJCQkJCWlmICghVElGRkZsdXNoRGF0YTEodGlmKSkKKwkJCQkJCXJldHVybiAoLTEpOworCQkJCQlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCQkJCQlvY2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCQkJCX0KKwkJCQkqb3ArKyA9ICh1aW50OCkgajsgb2NjLS07CisJCQkJd2hpbGUgKGotLSkgeworCQkJCQkqb3ArKyA9ICh1aW50OCkgKHRwW2krK10gPj4gc2hmdCAmIDB4ZmYpOworCQkJCQlvY2MtLTsKKwkJCQl9CisJCQl9CisJCQlpZiAocmMgPj0gTUlOUlVOKSB7CQkvKiB3cml0ZSBvdXQgcnVuICovCisJCQkJKm9wKysgPSAodWludDgpICgxMjgtMityYyk7CisJCQkJKm9wKysgPSAodWludDgpICh0cFtiZWddID4+IHNoZnQgJiAweGZmKTsKKwkJCQlvY2MgLT0gMjsKKwkJCX0gZWxzZQorCQkJCXJjID0gMDsKKwkJfQorCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSByb3cgb2YgMjQtYml0IHBpeGVscy4KKyAqLworc3RhdGljIGludAorTG9nTHV2RW5jb2RlMjQoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlMb2dMdXZTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwl0bXNpemVfdCBpOworCXRtc2l6ZV90IG5waXhlbHM7CisJdG1zaXplX3Qgb2NjOworCXVpbnQ4KiBvcDsKKwl1aW50MzIqIHRwOworCisJYXNzZXJ0KHMgPT0gMCk7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCW5waXhlbHMgPSBjYyAvIHNwLT5waXhlbF9zaXplOworCisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF9SQVcpCisJCXRwID0gKHVpbnQzMiopIGJwOworCWVsc2UgeworCQl0cCA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsKKwkJYXNzZXJ0KHNwLT50YnVmbGVuID49IG5waXhlbHMpOworCQkoKnNwLT50ZnVuYykoc3AsIGJwLCBucGl4ZWxzKTsKKwl9CisJLyogd3JpdGUgb3V0IGVuY29kZWQgcGl4ZWxzICovCisJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwlvY2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCWZvciAoaSA9IG5waXhlbHM7IGktLTsgKSB7CisJCWlmIChvY2MgPCAzKSB7CisJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOworCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKKwkJCWlmICghVElGRkZsdXNoRGF0YTEodGlmKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJCQlvY2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCQl9CisJCSpvcCsrID0gKHVpbnQ4KSgqdHAgPj4gMTYpOworCQkqb3ArKyA9ICh1aW50OCkoKnRwID4+IDggJiAweGZmKTsKKwkJKm9wKysgPSAodWludDgpKCp0cCsrICYgMHhmZik7CisJCW9jYyAtPSAzOworCX0KKwl0aWYtPnRpZl9yYXdjcCA9IG9wOworCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRW5jb2RlIGEgcm93IG9mIDMyLWJpdCBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK0xvZ0x1dkVuY29kZTMyKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJTG9nTHV2U3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJaW50IHNoZnQ7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBqOworCXRtc2l6ZV90IG5waXhlbHM7CisJdWludDgqIG9wOworCXVpbnQzMiogdHA7CisJdWludDMyIGI7CisJdG1zaXplX3Qgb2NjOworCWludCByYz0wLCBtYXNrOworCXRtc2l6ZV90IGJlZzsKKworCWFzc2VydChzID09IDApOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCW5waXhlbHMgPSBjYyAvIHNwLT5waXhlbF9zaXplOworCisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF9SQVcpCisJCXRwID0gKHVpbnQzMiopIGJwOworCWVsc2UgeworCQl0cCA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsKKwkJYXNzZXJ0KHNwLT50YnVmbGVuID49IG5waXhlbHMpOworCQkoKnNwLT50ZnVuYykoc3AsIGJwLCBucGl4ZWxzKTsKKwl9CisJLyogY29tcHJlc3MgZWFjaCBieXRlIHN0cmluZyAqLworCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwlmb3IgKHNoZnQgPSA0Kjg7IChzaGZ0IC09IDgpID49IDA7ICkKKwkJZm9yIChpID0gMDsgaSA8IG5waXhlbHM7IGkgKz0gcmMpIHsKKwkJCWlmIChvY2MgPCA0KSB7CisJCQkJdGlmLT50aWZfcmF3Y3AgPSBvcDsKKwkJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOworCQkJCWlmICghVElGRkZsdXNoRGF0YTEodGlmKSkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwkJCQlvY2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCQkJfQorCQkJbWFzayA9IDB4ZmYgPDwgc2hmdDsJCS8qIGZpbmQgbmV4dCBydW4gKi8KKwkJCWZvciAoYmVnID0gaTsgYmVnIDwgbnBpeGVsczsgYmVnICs9IHJjKSB7CisJCQkJYiA9IHRwW2JlZ10gJiBtYXNrOworCQkJCXJjID0gMTsKKwkJCQl3aGlsZSAocmMgPCAxMjcrMiAmJiBiZWcrcmMgPCBucGl4ZWxzICYmCisJCQkJCQkodHBbYmVnK3JjXSAmIG1hc2spID09IGIpCisJCQkJCXJjKys7CisJCQkJaWYgKHJjID49IE1JTlJVTikKKwkJCQkJYnJlYWs7CQkvKiBsb25nIGVub3VnaCAqLworCQkJfQorCQkJaWYgKGJlZy1pID4gMSAmJiBiZWctaSA8IE1JTlJVTikgeworCQkJCWIgPSB0cFtpXSAmIG1hc2s7CS8qIGNoZWNrIHNob3J0IHJ1biAqLworCQkJCWogPSBpKzE7CisJCQkJd2hpbGUgKCh0cFtqKytdICYgbWFzaykgPT0gYikKKwkJCQkJaWYgKGogPT0gYmVnKSB7CisJCQkJCQkqb3ArKyA9ICh1aW50OCkoMTI4LTIrai1pKTsKKwkJCQkJCSpvcCsrID0gKHVpbnQ4KShiID4+IHNoZnQpOworCQkJCQkJb2NjIC09IDI7CisJCQkJCQlpID0gYmVnOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCX0KKwkJCXdoaWxlIChpIDwgYmVnKSB7CQkvKiB3cml0ZSBvdXQgbm9uLXJ1biAqLworCQkJCWlmICgoaiA9IGJlZy1pKSA+IDEyNykgaiA9IDEyNzsKKwkJCQlpZiAob2NjIDwgaiszKSB7CisJCQkJCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJCQkJCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisJCQkJCWlmICghVElGRkZsdXNoRGF0YTEodGlmKSkKKwkJCQkJCXJldHVybiAoLTEpOworCQkJCQlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCQkJCQlvY2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCQkJCX0KKwkJCQkqb3ArKyA9ICh1aW50OCkgajsgb2NjLS07CisJCQkJd2hpbGUgKGotLSkgeworCQkJCQkqb3ArKyA9ICh1aW50OCkodHBbaSsrXSA+PiBzaGZ0ICYgMHhmZik7CisJCQkJCW9jYy0tOworCQkJCX0KKwkJCX0KKwkJCWlmIChyYyA+PSBNSU5SVU4pIHsJCS8qIHdyaXRlIG91dCBydW4gKi8KKwkJCQkqb3ArKyA9ICh1aW50OCkgKDEyOC0yK3JjKTsKKwkJCQkqb3ArKyA9ICh1aW50OCkodHBbYmVnXSA+PiBzaGZ0ICYgMHhmZik7CisJCQkJb2NjIC09IDI7CisJCQl9IGVsc2UKKwkJCQlyYyA9IDA7CisJCX0KKwl0aWYtPnRpZl9yYXdjcCA9IG9wOworCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRW5jb2RlIGEgc3RyaXAgb2YgcGl4ZWxzLiAgV2UgYnJlYWsgaXQgaW50byByb3dzIHRvCisgKiBhdm9pZCBlbmNvZGluZyBydW5zIGFjcm9zcyByb3cgYm91bmRhcmllcy4KKyAqLworc3RhdGljIGludAorTG9nTHV2RW5jb2RlU3RyaXAoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwl0bXNpemVfdCByb3dsZW4gPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisKKwlhc3NlcnQoY2Mlcm93bGVuID09IDApOworCXdoaWxlIChjYyAmJiAoKnRpZi0+dGlmX2VuY29kZXJvdykodGlmLCBicCwgcm93bGVuLCBzKSA9PSAxKQorCQlicCArPSByb3dsZW4sIGNjIC09IHJvd2xlbjsKKwlyZXR1cm4gKGNjID09IDApOworfQorCisvKgorICogRW5jb2RlIGEgdGlsZSBvZiBwaXhlbHMuICBXZSBicmVhayBpdCBpbnRvIHJvd3MgdG8KKyAqIGF2b2lkIGVuY29kaW5nIHJ1bnMgYWNyb3NzIHJvdyBib3VuZGFyaWVzLgorICovCitzdGF0aWMgaW50CitMb2dMdXZFbmNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJdG1zaXplX3Qgcm93bGVuID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisKKwlhc3NlcnQoY2Mlcm93bGVuID09IDApOworCXdoaWxlIChjYyAmJiAoKnRpZi0+dGlmX2VuY29kZXJvdykodGlmLCBicCwgcm93bGVuLCBzKSA9PSAxKQorCQlicCArPSByb3dsZW4sIGNjIC09IHJvd2xlbjsKKwlyZXR1cm4gKGNjID09IDApOworfQorCisvKgorICogRW5jb2RlL0RlY29kZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gdXNlciBmb3JtYXRzLgorICovCisKKyNpbmNsdWRlICJ1dmNvZGUuaCIKKworI2lmbmRlZiBVVlNDQUxFCisjZGVmaW5lIFVfTkVVCQkwLjIxMDUyNjMxNgorI2RlZmluZSBWX05FVQkJMC40NzM2ODQyMTEKKyNkZWZpbmUgVVZTQ0FMRQkJNDEwLgorI2VuZGlmCisKKyNpZm5kZWYJTV9MTjIKKyNkZWZpbmUgTV9MTjIJCTAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIKKyNlbmRpZgorI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkJCTMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorI2lmbmRlZiBsb2cyCisjZGVmaW5lIGxvZzIoeCkJCSgoMS4vTV9MTjIpKmxvZyh4KSkKKyNlbmRpZgorI2RlZmluZSBleHAyKHgpCQlleHAoTV9MTjIqKHgpKQorCisjZGVmaW5lIGl0cnVuYyh4LG0pCSgobSk9PVNHSUxPR0VOQ09ERV9OT0RJVEhFUiA/IFwKKwkJCQkoaW50KSh4KSA6IFwKKwkJCQkoaW50KSgoeCkgKyByYW5kKCkqKDEuL1JBTkRfTUFYKSAtIC41KSkKKworI2lmICFMT0dMVVZfUFVCTElDCitzdGF0aWMKKyNlbmRpZgorZG91YmxlCitMb2dMMTZ0b1koaW50IHAxNikJCS8qIGNvbXB1dGUgbHVtaW5hbmNlIGZyb20gMTYtYml0IExvZ0wgKi8KK3sKKwlpbnQJTGUgPSBwMTYgJiAweDdmZmY7CisJZG91YmxlCVk7CisKKwlpZiAoIUxlKQorCQlyZXR1cm4gKDAuKTsKKwlZID0gZXhwKE1fTE4yLzI1Ni4qKExlKy41KSAtIE1fTE4yKjY0Lik7CisJcmV0dXJuICghKHAxNiAmIDB4ODAwMCkgPyBZIDogLVkpOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCitpbnQKK0xvZ0wxNmZyb21ZKGRvdWJsZSBZLCBpbnQgZW0pCS8qIGdldCAxNi1iaXQgTG9nTCBmcm9tIFkgKi8KK3sKKwlpZiAoWSA+PSAxLjgzNzE5NzZlMTkpCisJCXJldHVybiAoMHg3ZmZmKTsKKwlpZiAoWSA8PSAtMS44MzcxOTc2ZTE5KQorCQlyZXR1cm4gKDB4ZmZmZik7CisJaWYgKFkgPiA1LjQxMzY3NjllLTIwKQorCQlyZXR1cm4gaXRydW5jKDI1Ni4qKGxvZzIoWSkgKyA2NC4pLCBlbSk7CisJaWYgKFkgPCAtNS40MTM2NzY5ZS0yMCkKKwkJcmV0dXJuICh+MHg3ZmZmIHwgaXRydW5jKDI1Ni4qKGxvZzIoLVkpICsgNjQuKSwgZW0pKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorTDE2dG9ZKExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCWludDE2KiBsMTYgPSAoaW50MTYqKSBzcC0+dGJ1ZjsKKwlmbG9hdCogeXAgPSAoZmxvYXQqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKQorCQkqeXArKyA9IChmbG9hdClMb2dMMTZ0b1koKmwxNisrKTsKK30KKworc3RhdGljIHZvaWQKK0wxNnRvR3J5KExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCWludDE2KiBsMTYgPSAoaW50MTYqKSBzcC0+dGJ1ZjsKKwl1aW50OCogZ3AgPSAodWludDgqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCWRvdWJsZSBZID0gTG9nTDE2dG9ZKCpsMTYrKyk7CisJCSpncCsrID0gKHVpbnQ4KSAoKFkgPD0gMC4pID8gMCA6IChZID49IDEuKSA/IDI1NSA6IChpbnQpKDI1Ni4qc3FydChZKSkpOworCX0KK30KKworc3RhdGljIHZvaWQKK0wxNmZyb21ZKExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCWludDE2KiBsMTYgPSAoaW50MTYqKSBzcC0+dGJ1ZjsKKwlmbG9hdCogeXAgPSAoZmxvYXQqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKQorCQkqbDE2KysgPSAoaW50MTYpIChMb2dMMTZmcm9tWSgqeXArKywgc3AtPmVuY29kZV9tZXRoKSk7Cit9CisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK3ZvaWQKK1hZWnRvUkdCMjQoZmxvYXQgeHl6WzNdLCB1aW50OCByZ2JbM10pCit7CisJZG91YmxlCXIsIGcsIGI7CisJCQkJCS8qIGFzc3VtZSBDQ0lSLTcwOSBwcmltYXJpZXMgKi8KKwlyID0gIDIuNjkwKnh5elswXSArIC0xLjI3Nip4eXpbMV0gKyAtMC40MTQqeHl6WzJdOworCWcgPSAtMS4wMjIqeHl6WzBdICsgIDEuOTc4Knh5elsxXSArICAwLjA0NCp4eXpbMl07CisJYiA9ICAwLjA2MSp4eXpbMF0gKyAtMC4yMjQqeHl6WzFdICsgIDEuMTYzKnh5elsyXTsKKwkJCQkJLyogYXNzdW1lIDIuMCBnYW1tYSBmb3Igc3BlZWQgKi8KKwkvKiBjb3VsZCB1c2UgaW50ZWdlciBzcXJ0IGFwcHJveC4sIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGZhc3RlciAqLworCXJnYlswXSA9ICh1aW50OCkoKHI8PTAuKSA/IDAgOiAociA+PSAxLikgPyAyNTUgOiAoaW50KSgyNTYuKnNxcnQocikpKTsKKwlyZ2JbMV0gPSAodWludDgpKChnPD0wLikgPyAwIDogKGcgPj0gMS4pID8gMjU1IDogKGludCkoMjU2LipzcXJ0KGcpKSk7CisJcmdiWzJdID0gKHVpbnQ4KSgoYjw9MC4pID8gMCA6IChiID49IDEuKSA/IDI1NSA6IChpbnQpKDI1Ni4qc3FydChiKSkpOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCitkb3VibGUKK0xvZ0wxMHRvWShpbnQgcDEwKQkJLyogY29tcHV0ZSBsdW1pbmFuY2UgZnJvbSAxMC1iaXQgTG9nTCAqLworeworCWlmIChwMTAgPT0gMCkKKwkJcmV0dXJuICgwLik7CisJcmV0dXJuIChleHAoTV9MTjIvNjQuKihwMTArLjUpIC0gTV9MTjIqMTIuKSk7Cit9CisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK2ludAorTG9nTDEwZnJvbVkoZG91YmxlIFksIGludCBlbSkJLyogZ2V0IDEwLWJpdCBMb2dMIGZyb20gWSAqLworeworCWlmIChZID49IDE1Ljc0MikKKwkJcmV0dXJuICgweDNmZik7CisJZWxzZSBpZiAoWSA8PSAuMDAwMjQyODMpCisJCXJldHVybiAoMCk7CisJZWxzZQorCQlyZXR1cm4gaXRydW5jKDY0LioobG9nMihZKSArIDEyLiksIGVtKTsKK30KKworI2RlZmluZSBOQU5HTEVTCQkxMDAKKyNkZWZpbmUgdXYyYW5nKHUsIHYpCSggKE5BTkdMRVMqLjQ5OTk5OTk5OS9NX1BJKSBcCisJCQkJKiBhdGFuMigodiktVl9ORVUsKHUpLVVfTkVVKSArIC41Kk5BTkdMRVMgKQorCitzdGF0aWMgaW50Citvb2dfZW5jb2RlKGRvdWJsZSB1LCBkb3VibGUgdikJCS8qIGVuY29kZSBvdXQtb2YtZ2FtdXQgY2hyb21hICovCit7CisJc3RhdGljIGludAlvb2dfdGFibGVbTkFOR0xFU107CisJc3RhdGljIGludAlpbml0aWFsaXplZCA9IDA7CisJcmVnaXN0ZXIgaW50CWk7CisKKwlpZiAoIWluaXRpYWxpemVkKSB7CQkvKiBzZXQgdXAgcGVyaW1ldGVyIHRhYmxlICovCisJCWRvdWJsZQllcHNbTkFOR0xFU10sIHVhLCB2YSwgYW5nLCBlcHNhOworCQlpbnQJdWksIHZpLCB1c3RlcDsKKwkJZm9yIChpID0gTkFOR0xFUzsgaS0tOyApCisJCQllcHNbaV0gPSAyLjsKKwkJZm9yICh2aSA9IFVWX05WUzsgdmktLTsgKSB7CisJCQl2YSA9IFVWX1ZTVEFSVCArICh2aSsuNSkqVVZfU1FTSVo7CisJCQl1c3RlcCA9IHV2X3Jvd1t2aV0ubnVzLTE7CisJCQlpZiAodmkgPT0gVVZfTlZTLTEgfHwgdmkgPT0gMCB8fCB1c3RlcCA8PSAwKQorCQkJCXVzdGVwID0gMTsKKwkJCWZvciAodWkgPSB1dl9yb3dbdmldLm51cy0xOyB1aSA+PSAwOyB1aSAtPSB1c3RlcCkgeworCQkJCXVhID0gdXZfcm93W3ZpXS51c3RhcnQgKyAodWkrLjUpKlVWX1NRU0laOworCQkJCWFuZyA9IHV2MmFuZyh1YSwgdmEpOworCQkJCWkgPSAoaW50KSBhbmc7CisJCQkJZXBzYSA9IGZhYnMoYW5nIC0gKGkrLjUpKTsKKwkJCQlpZiAoZXBzYSA8IGVwc1tpXSkgeworCQkJCQlvb2dfdGFibGVbaV0gPSB1dl9yb3dbdmldLm5jdW0gKyB1aTsKKwkJCQkJZXBzW2ldID0gZXBzYTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChpID0gTkFOR0xFUzsgaS0tOyApCS8qIGZpbGwgYW55IGhvbGVzICovCisJCQlpZiAoZXBzW2ldID4gMS41KSB7CisJCQkJaW50CWkxLCBpMjsKKwkJCQlmb3IgKGkxID0gMTsgaTEgPCBOQU5HTEVTLzI7IGkxKyspCisJCQkJCWlmIChlcHNbKGkraTEpJU5BTkdMRVNdIDwgMS41KQorCQkJCQkJYnJlYWs7CisJCQkJZm9yIChpMiA9IDE7IGkyIDwgTkFOR0xFUy8yOyBpMisrKQorCQkJCQlpZiAoZXBzWyhpK05BTkdMRVMtaTIpJU5BTkdMRVNdIDwgMS41KQorCQkJCQkJYnJlYWs7CisJCQkJaWYgKGkxIDwgaTIpCisJCQkJCW9vZ190YWJsZVtpXSA9CisJCQkJCQlvb2dfdGFibGVbKGkraTEpJU5BTkdMRVNdOworCQkJCWVsc2UKKwkJCQkJb29nX3RhYmxlW2ldID0KKwkJCQkJCW9vZ190YWJsZVsoaStOQU5HTEVTLWkyKSVOQU5HTEVTXTsKKwkJCX0KKwkJaW5pdGlhbGl6ZWQgPSAxOworCX0KKwlpID0gKGludCkgdXYyYW5nKHUsIHYpOwkJLyogbG9vayB1cCBodWUgYW5nbGUgKi8KKwlyZXR1cm4gKG9vZ190YWJsZVtpXSk7Cit9CisKKyN1bmRlZiB1djJhbmcKKyN1bmRlZiBOQU5HTEVTCisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK2ludAordXZfZW5jb2RlKGRvdWJsZSB1LCBkb3VibGUgdiwgaW50IGVtKQkvKiBlbmNvZGUgKHUnLHYnKSBjb29yZGluYXRlcyAqLworeworCXJlZ2lzdGVyIGludAl2aSwgdWk7CisKKwlpZiAodiA8IFVWX1ZTVEFSVCkKKwkJcmV0dXJuIG9vZ19lbmNvZGUodSwgdik7CisJdmkgPSBpdHJ1bmMoKHYgLSBVVl9WU1RBUlQpKigxLi9VVl9TUVNJWiksIGVtKTsKKwlpZiAodmkgPj0gVVZfTlZTKQorCQlyZXR1cm4gb29nX2VuY29kZSh1LCB2KTsKKwlpZiAodSA8IHV2X3Jvd1t2aV0udXN0YXJ0KQorCQlyZXR1cm4gb29nX2VuY29kZSh1LCB2KTsKKwl1aSA9IGl0cnVuYygodSAtIHV2X3Jvd1t2aV0udXN0YXJ0KSooMS4vVVZfU1FTSVopLCBlbSk7CisJaWYgKHVpID49IHV2X3Jvd1t2aV0ubnVzKQorCQlyZXR1cm4gb29nX2VuY29kZSh1LCB2KTsKKworCXJldHVybiAodXZfcm93W3ZpXS5uY3VtICsgdWkpOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCitpbnQKK3V2X2RlY29kZShkb3VibGUgKnVwLCBkb3VibGUgKnZwLCBpbnQgYykJLyogZGVjb2RlICh1Jyx2JykgaW5kZXggKi8KK3sKKwlpbnQJdXBwZXIsIGxvd2VyOworCXJlZ2lzdGVyIGludAl1aSwgdmk7CisKKwlpZiAoYyA8IDAgfHwgYyA+PSBVVl9ORElWUykKKwkJcmV0dXJuICgtMSk7CisJbG93ZXIgPSAwOwkJCQkvKiBiaW5hcnkgc2VhcmNoICovCisJdXBwZXIgPSBVVl9OVlM7CisJd2hpbGUgKHVwcGVyIC0gbG93ZXIgPiAxKSB7CisJCXZpID0gKGxvd2VyICsgdXBwZXIpID4+IDE7CisJCXVpID0gYyAtIHV2X3Jvd1t2aV0ubmN1bTsKKwkJaWYgKHVpID4gMCkKKwkJCWxvd2VyID0gdmk7CisJCWVsc2UgaWYgKHVpIDwgMCkKKwkJCXVwcGVyID0gdmk7CisJCWVsc2UgeworCQkJbG93ZXIgPSB2aTsKKwkJCWJyZWFrOworCQl9CisJfQorCXZpID0gbG93ZXI7CisJdWkgPSBjIC0gdXZfcm93W3ZpXS5uY3VtOworCSp1cCA9IHV2X3Jvd1t2aV0udXN0YXJ0ICsgKHVpKy41KSpVVl9TUVNJWjsKKwkqdnAgPSBVVl9WU1RBUlQgKyAodmkrLjUpKlVWX1NRU0laOworCXJldHVybiAoMCk7Cit9CisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK3ZvaWQKK0xvZ0x1djI0dG9YWVoodWludDMyIHAsIGZsb2F0IFhZWlszXSkKK3sKKwlpbnQJQ2U7CisJZG91YmxlCUwsIHUsIHYsIHMsIHgsIHk7CisJCQkJCS8qIGRlY29kZSBsdW1pbmFuY2UgKi8KKwlMID0gTG9nTDEwdG9ZKHA+PjE0ICYgMHgzZmYpOworCWlmIChMIDw9IDAuKSB7CisJCVhZWlswXSA9IFhZWlsxXSA9IFhZWlsyXSA9IDAuOworCQlyZXR1cm47CisJfQorCQkJCQkvKiBkZWNvZGUgY29sb3IgKi8KKwlDZSA9IHAgJiAweDNmZmY7CisJaWYgKHV2X2RlY29kZSgmdSwgJnYsIENlKSA8IDApIHsKKwkJdSA9IFVfTkVVOyB2ID0gVl9ORVU7CisJfQorCXMgPSAxLi8oNi4qdSAtIDE2Lip2ICsgMTIuKTsKKwl4ID0gOS4qdSAqIHM7CisJeSA9IDQuKnYgKiBzOworCQkJCQkvKiBjb252ZXJ0IHRvIFhZWiAqLworCVhZWlswXSA9IChmbG9hdCkoeC95ICogTCk7CisJWFlaWzFdID0gKGZsb2F0KUw7CisJWFlaWzJdID0gKGZsb2F0KSgoMS4teC15KS95ICogTCk7Cit9CisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK3VpbnQzMgorTG9nTHV2MjRmcm9tWFlaKGZsb2F0IFhZWlszXSwgaW50IGVtKQoreworCWludAlMZSwgQ2U7CisJZG91YmxlCXUsIHYsIHM7CisJCQkJCS8qIGVuY29kZSBsdW1pbmFuY2UgKi8KKwlMZSA9IExvZ0wxMGZyb21ZKFhZWlsxXSwgZW0pOworCQkJCQkvKiBlbmNvZGUgY29sb3IgKi8KKwlzID0gWFlaWzBdICsgMTUuKlhZWlsxXSArIDMuKlhZWlsyXTsKKwlpZiAoIUxlIHx8IHMgPD0gMC4pIHsKKwkJdSA9IFVfTkVVOworCQl2ID0gVl9ORVU7CisJfSBlbHNlIHsKKwkJdSA9IDQuKlhZWlswXSAvIHM7CisJCXYgPSA5LipYWVpbMV0gLyBzOworCX0KKwlDZSA9IHV2X2VuY29kZSh1LCB2LCBlbSk7CisJaWYgKENlIDwgMCkJCQkvKiBuZXZlciBoYXBwZW5zICovCisJCUNlID0gdXZfZW5jb2RlKFVfTkVVLCBWX05FVSwgU0dJTE9HRU5DT0RFX05PRElUSEVSKTsKKwkJCQkJLyogY29tYmluZSBlbmNvZGluZ3MgKi8KKwlyZXR1cm4gKExlIDw8IDE0IHwgQ2UpOworfQorCitzdGF0aWMgdm9pZAorTHV2MjR0b1hZWihMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwl1aW50MzIqIGx1diA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsgIAorCWZsb2F0KiB4eXogPSAoZmxvYXQqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCUxvZ0x1djI0dG9YWVooKmx1diwgeHl6KTsKKwkJeHl6ICs9IDM7CisJCWx1disrOworCX0KK30KKworc3RhdGljIHZvaWQKK0x1djI0dG9MdXY0OChMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwl1aW50MzIqIGx1diA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsgIAorCWludDE2KiBsdXYzID0gKGludDE2Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlkb3VibGUgdSwgdjsKKworCQkqbHV2MysrID0gKGludDE2KSgoKmx1diA+PiAxMiAmIDB4ZmZkKSArIDEzMzE0KTsKKwkJaWYgKHV2X2RlY29kZSgmdSwgJnYsICpsdXYmMHgzZmZmKSA8IDApIHsKKwkJCXUgPSBVX05FVTsKKwkJCXYgPSBWX05FVTsKKwkJfQorCQkqbHV2MysrID0gKGludDE2KSh1ICogKDFMPDwxNSkpOworCQkqbHV2MysrID0gKGludDE2KSh2ICogKDFMPDwxNSkpOworCQlsdXYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMdXYyNHRvUkdCKExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCXVpbnQzMiogbHV2ID0gKHVpbnQzMiopIHNwLT50YnVmOyAgCisJdWludDgqIHJnYiA9ICh1aW50OCopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJZmxvYXQgeHl6WzNdOworCisJCUxvZ0x1djI0dG9YWVooKmx1disrLCB4eXopOworCQlYWVp0b1JHQjI0KHh5eiwgcmdiKTsKKwkJcmdiICs9IDM7CisJfQorfQorCitzdGF0aWMgdm9pZAorTHV2MjRmcm9tWFlaKExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCXVpbnQzMiogbHV2ID0gKHVpbnQzMiopIHNwLT50YnVmOyAgCisJZmxvYXQqIHh5eiA9IChmbG9hdCopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJKmx1disrID0gTG9nTHV2MjRmcm9tWFlaKHh5eiwgc3AtPmVuY29kZV9tZXRoKTsKKwkJeHl6ICs9IDM7CisJfQorfQorCitzdGF0aWMgdm9pZAorTHV2MjRmcm9tTHV2NDgoTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwlpbnQxNiogbHV2MyA9IChpbnQxNiopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJaW50IExlLCBDZTsKKworCQlpZiAobHV2M1swXSA8PSAwKQorCQkJTGUgPSAwOworCQllbHNlIGlmIChsdXYzWzBdID49ICgxPDwxMikrMzMxNCkKKwkJCUxlID0gKDE8PDEwKSAtIDE7CisJCWVsc2UgaWYgKHNwLT5lbmNvZGVfbWV0aCA9PSBTR0lMT0dFTkNPREVfTk9ESVRIRVIpCisJCQlMZSA9IChsdXYzWzBdLTMzMTQpID4+IDI7CisJCWVsc2UKKwkJCUxlID0gaXRydW5jKC4yNSoobHV2M1swXS0zMzE0LiksIHNwLT5lbmNvZGVfbWV0aCk7CisKKwkJQ2UgPSB1dl9lbmNvZGUoKGx1djNbMV0rLjUpLygxPDwxNSksIChsdXYzWzJdKy41KS8oMTw8MTUpLAorCQkJCQlzcC0+ZW5jb2RlX21ldGgpOworCQlpZiAoQ2UgPCAwKQkvKiBuZXZlciBoYXBwZW5zICovCisJCQlDZSA9IHV2X2VuY29kZShVX05FVSwgVl9ORVUsIFNHSUxPR0VOQ09ERV9OT0RJVEhFUik7CisJCSpsdXYrKyA9ICh1aW50MzIpTGUgPDwgMTQgfCBDZTsKKwkJbHV2MyArPSAzOworCX0KK30KKworI2lmICFMT0dMVVZfUFVCTElDCitzdGF0aWMKKyNlbmRpZgordm9pZAorTG9nTHV2MzJ0b1hZWih1aW50MzIgcCwgZmxvYXQgWFlaWzNdKQoreworCWRvdWJsZQlMLCB1LCB2LCBzLCB4LCB5OworCQkJCQkvKiBkZWNvZGUgbHVtaW5hbmNlICovCisJTCA9IExvZ0wxNnRvWSgoaW50KXAgPj4gMTYpOworCWlmIChMIDw9IDAuKSB7CisJCVhZWlswXSA9IFhZWlsxXSA9IFhZWlsyXSA9IDAuOworCQlyZXR1cm47CisJfQorCQkJCQkvKiBkZWNvZGUgY29sb3IgKi8KKwl1ID0gMS4vVVZTQ0FMRSAqICgocD4+OCAmIDB4ZmYpICsgLjUpOworCXYgPSAxLi9VVlNDQUxFICogKChwICYgMHhmZikgKyAuNSk7CisJcyA9IDEuLyg2Lip1IC0gMTYuKnYgKyAxMi4pOworCXggPSA5Lip1ICogczsKKwl5ID0gNC4qdiAqIHM7CisJCQkJCS8qIGNvbnZlcnQgdG8gWFlaICovCisJWFlaWzBdID0gKGZsb2F0KSh4L3kgKiBMKTsKKwlYWVpbMV0gPSAoZmxvYXQpTDsKKwlYWVpbMl0gPSAoZmxvYXQpKCgxLi14LXkpL3kgKiBMKTsKK30KKworI2lmICFMT0dMVVZfUFVCTElDCitzdGF0aWMKKyNlbmRpZgordWludDMyCitMb2dMdXYzMmZyb21YWVooZmxvYXQgWFlaWzNdLCBpbnQgZW0pCit7CisJdW5zaWduZWQgaW50CUxlLCB1ZSwgdmU7CisJZG91YmxlCXUsIHYsIHM7CisJCQkJCS8qIGVuY29kZSBsdW1pbmFuY2UgKi8KKwlMZSA9ICh1bnNpZ25lZCBpbnQpTG9nTDE2ZnJvbVkoWFlaWzFdLCBlbSk7CisJCQkJCS8qIGVuY29kZSBjb2xvciAqLworCXMgPSBYWVpbMF0gKyAxNS4qWFlaWzFdICsgMy4qWFlaWzJdOworCWlmICghTGUgfHwgcyA8PSAwLikgeworCQl1ID0gVV9ORVU7CisJCXYgPSBWX05FVTsKKwl9IGVsc2UgeworCQl1ID0gNC4qWFlaWzBdIC8gczsKKwkJdiA9IDkuKlhZWlsxXSAvIHM7CisJfQorCWlmICh1IDw9IDAuKSB1ZSA9IDA7CisJZWxzZSB1ZSA9IGl0cnVuYyhVVlNDQUxFKnUsIGVtKTsKKwlpZiAodWUgPiAyNTUpIHVlID0gMjU1OworCWlmICh2IDw9IDAuKSB2ZSA9IDA7CisJZWxzZSB2ZSA9IGl0cnVuYyhVVlNDQUxFKnYsIGVtKTsKKwlpZiAodmUgPiAyNTUpIHZlID0gMjU1OworCQkJCQkvKiBjb21iaW5lIGVuY29kaW5ncyAqLworCXJldHVybiAoTGUgPDwgMTYgfCB1ZSA8PCA4IHwgdmUpOworfQorCitzdGF0aWMgdm9pZAorTHV2MzJ0b1hZWihMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwl1aW50MzIqIGx1diA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsgIAorCWZsb2F0KiB4eXogPSAoZmxvYXQqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCUxvZ0x1djMydG9YWVooKmx1disrLCB4eXopOworCQl4eXogKz0gMzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMdXYzMnRvTHV2NDgoTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwlpbnQxNiogbHV2MyA9IChpbnQxNiopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJZG91YmxlIHUsIHY7CisKKwkJKmx1djMrKyA9IChpbnQxNikoKmx1diA+PiAxNik7CisJCXUgPSAxLi9VVlNDQUxFICogKCgqbHV2Pj44ICYgMHhmZikgKyAuNSk7CisJCXYgPSAxLi9VVlNDQUxFICogKCgqbHV2ICYgMHhmZikgKyAuNSk7CisJCSpsdXYzKysgPSAoaW50MTYpKHUgKiAoMUw8PDE1KSk7CisJCSpsdXYzKysgPSAoaW50MTYpKHYgKiAoMUw8PDE1KSk7CisJCWx1disrOworCX0KK30KKworc3RhdGljIHZvaWQKK0x1djMydG9SR0IoTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwl1aW50OCogcmdiID0gKHVpbnQ4Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlmbG9hdCB4eXpbM107CisKKwkJTG9nTHV2MzJ0b1hZWigqbHV2KyssIHh5eik7CisJCVhZWnRvUkdCMjQoeHl6LCByZ2IpOworCQlyZ2IgKz0gMzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMdXYzMmZyb21YWVooTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwlmbG9hdCogeHl6ID0gKGZsb2F0Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQkqbHV2KysgPSBMb2dMdXYzMmZyb21YWVooeHl6LCBzcC0+ZW5jb2RlX21ldGgpOworCQl4eXogKz0gMzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMdXYzMmZyb21MdXY0OChMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwl1aW50MzIqIGx1diA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsKKwlpbnQxNiogbHV2MyA9IChpbnQxNiopIG9wOworCisJaWYgKHNwLT5lbmNvZGVfbWV0aCA9PSBTR0lMT0dFTkNPREVfTk9ESVRIRVIpIHsKKwkJd2hpbGUgKG4tLSA+IDApIHsKKwkJCSpsdXYrKyA9ICh1aW50MzIpbHV2M1swXSA8PCAxNiB8CisJCQkJKGx1djNbMV0qKHVpbnQzMikoVVZTQ0FMRSsuNSkgPj4gNyAmIDB4ZmYwMCkgfAorCQkJCShsdXYzWzJdKih1aW50MzIpKFVWU0NBTEUrLjUpID4+IDE1ICYgMHhmZik7CisJCQlsdXYzICs9IDM7CisJCX0KKwkJcmV0dXJuOworCX0KKwl3aGlsZSAobi0tID4gMCkgeworCQkqbHV2KysgPSAodWludDMyKWx1djNbMF0gPDwgMTYgfAorCShpdHJ1bmMobHV2M1sxXSooVVZTQ0FMRS8oMTw8MTUpKSwgc3AtPmVuY29kZV9tZXRoKSA8PCA4ICYgMHhmZjAwKSB8CisJCShpdHJ1bmMobHV2M1syXSooVVZTQ0FMRS8oMTw8MTUpKSwgc3AtPmVuY29kZV9tZXRoKSAmIDB4ZmYpOworCQlsdXYzICs9IDM7CisJfQorfQorCitzdGF0aWMgdm9pZAorX2xvZ0x1dk5vcChMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwkodm9pZCkgc3A7ICh2b2lkKSBvcDsgKHZvaWQpIG47Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0wxNkd1ZXNzRGF0YUZtdChUSUZGRGlyZWN0b3J5ICp0ZCkKK3sKKyNkZWZpbmUJUEFDSyhzLGIsZikJKCgoYik8PDYpfCgocyk8PDMpfChmKSkKKwlzd2l0Y2ggKFBBQ0sodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwgdGQtPnRkX2JpdHNwZXJzYW1wbGUsIHRkLT50ZF9zYW1wbGVmb3JtYXQpKSB7CisJY2FzZSBQQUNLKDEsIDMyLCBTQU1QTEVGT1JNQVRfSUVFRUZQKToKKwkJcmV0dXJuIChTR0lMT0dEQVRBRk1UX0ZMT0FUKTsKKwljYXNlIFBBQ0soMSwgMTYsIFNBTVBMRUZPUk1BVF9WT0lEKToKKwljYXNlIFBBQ0soMSwgMTYsIFNBTVBMRUZPUk1BVF9JTlQpOgorCWNhc2UgUEFDSygxLCAxNiwgU0FNUExFRk9STUFUX1VJTlQpOgorCQlyZXR1cm4gKFNHSUxPR0RBVEFGTVRfMTZCSVQpOworCWNhc2UgUEFDSygxLCAgOCwgU0FNUExFRk9STUFUX1ZPSUQpOgorCWNhc2UgUEFDSygxLCAgOCwgU0FNUExFRk9STUFUX1VJTlQpOgorCQlyZXR1cm4gKFNHSUxPR0RBVEFGTVRfOEJJVCk7CisJfQorI3VuZGVmIFBBQ0sKKwlyZXR1cm4gKFNHSUxPR0RBVEFGTVRfVU5LTk9XTik7Cit9CisKK3N0YXRpYyB0bXNpemVfdAorbXVsdGlwbHlfbXModG1zaXplX3QgbTEsIHRtc2l6ZV90IG0yKQoreworCXRtc2l6ZV90IGJ5dGVzID0gbTEgKiBtMjsKKworCWlmIChtMSAmJiBieXRlcyAvIG0xICE9IG0yKQorCQlieXRlcyA9IDA7CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0wxNkluaXRTdGF0ZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTDE2SW5pdFN0YXRlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJTG9nTHV2U3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJYXNzZXJ0KHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19MT0dMKTsKKworCS8qIGZvciBzb21lIHJlYXNvbiwgd2UgY2FuJ3QgZG8gdGhpcyBpbiBUSUZGSW5pdExvZ0wxNiAqLworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfVU5LTk9XTikKKwkJc3AtPnVzZXJfZGF0YWZtdCA9IExvZ0wxNkd1ZXNzRGF0YUZtdCh0ZCk7CisJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJY2FzZSBTR0lMT0dEQVRBRk1UX0ZMT0FUOgorCQlzcC0+cGl4ZWxfc2l6ZSA9IHNpemVvZiAoZmxvYXQpOworCQlicmVhazsKKwljYXNlIFNHSUxPR0RBVEFGTVRfMTZCSVQ6CisJCXNwLT5waXhlbF9zaXplID0gc2l6ZW9mIChpbnQxNik7CisJCWJyZWFrOworCWNhc2UgU0dJTE9HREFUQUZNVF84QklUOgorCQlzcC0+cGl4ZWxfc2l6ZSA9IHNpemVvZiAodWludDgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk5vIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgdXNlciBkYXRhIGZvcm1hdCB0byBMb2dMIik7CisJCXJldHVybiAoMCk7CisJfQorICAgICAgICBpZiggaXNUaWxlZCh0aWYpICkKKyAgICAgICAgICAgIHNwLT50YnVmbGVuID0gbXVsdGlwbHlfbXModGQtPnRkX3RpbGV3aWR0aCwgdGQtPnRkX3RpbGVsZW5ndGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcC0+dGJ1ZmxlbiA9IG11bHRpcGx5X21zKHRkLT50ZF9pbWFnZXdpZHRoLCB0ZC0+dGRfcm93c3BlcnN0cmlwKTsKKwlpZiAobXVsdGlwbHlfbXMoc3AtPnRidWZsZW4sIHNpemVvZiAoaW50MTYpKSA9PSAwIHx8CisJICAgIChzcC0+dGJ1ZiA9ICh1aW50OCopIF9USUZGbWFsbG9jKHNwLT50YnVmbGVuICogc2l6ZW9mIChpbnQxNikpKSA9PSBOVUxMKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJObyBzcGFjZSBmb3IgU0dJTG9nIHRyYW5zbGF0aW9uIGJ1ZmZlciIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitMb2dMdXZHdWVzc0RhdGFGbXQoVElGRkRpcmVjdG9yeSAqdGQpCit7CisJaW50IGd1ZXNzOworCisJLyoKKwkgKiBJZiB0aGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB0aGVpciBkYXRhZm10LAorCSAqIHRha2Ugb3VyIGJlc3QgZ3Vlc3MgZnJvbSB0aGUgYml0c3BlcnNhbXBsZS4KKwkgKi8KKyNkZWZpbmUJUEFDSyhhLGIpCSgoKGEpPDwzKXwoYikpCisJc3dpdGNoIChQQUNLKHRkLT50ZF9iaXRzcGVyc2FtcGxlLCB0ZC0+dGRfc2FtcGxlZm9ybWF0KSkgeworCWNhc2UgUEFDSygzMiwgU0FNUExFRk9STUFUX0lFRUVGUCk6CisJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF9GTE9BVDsKKwkJYnJlYWs7CisJY2FzZSBQQUNLKDMyLCBTQU1QTEVGT1JNQVRfVk9JRCk6CisJY2FzZSBQQUNLKDMyLCBTQU1QTEVGT1JNQVRfVUlOVCk6CisJY2FzZSBQQUNLKDMyLCBTQU1QTEVGT1JNQVRfSU5UKToKKwkJZ3Vlc3MgPSBTR0lMT0dEQVRBRk1UX1JBVzsKKwkJYnJlYWs7CisJY2FzZSBQQUNLKDE2LCBTQU1QTEVGT1JNQVRfVk9JRCk6CisJY2FzZSBQQUNLKDE2LCBTQU1QTEVGT1JNQVRfSU5UKToKKwljYXNlIFBBQ0soMTYsIFNBTVBMRUZPUk1BVF9VSU5UKToKKwkJZ3Vlc3MgPSBTR0lMT0dEQVRBRk1UXzE2QklUOworCQlicmVhazsKKwljYXNlIFBBQ0soIDgsIFNBTVBMRUZPUk1BVF9WT0lEKToKKwljYXNlIFBBQ0soIDgsIFNBTVBMRUZPUk1BVF9VSU5UKToKKwkJZ3Vlc3MgPSBTR0lMT0dEQVRBRk1UXzhCSVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF9VTktOT1dOOworCQlicmVhazsKKyN1bmRlZiBQQUNLCisJfQorCS8qCisJICogRG91YmxlLWNoZWNrIHNhbXBsZXMgcGVyIHBpeGVsLgorCSAqLworCXN3aXRjaCAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCkgeworCWNhc2UgMToKKwkJaWYgKGd1ZXNzICE9IFNHSUxPR0RBVEFGTVRfUkFXKQorCQkJZ3Vlc3MgPSBTR0lMT0dEQVRBRk1UX1VOS05PV047CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKGd1ZXNzID09IFNHSUxPR0RBVEFGTVRfUkFXKQorCQkJZ3Vlc3MgPSBTR0lMT0dEQVRBRk1UX1VOS05PV047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF9VTktOT1dOOworCQlicmVhazsKKwl9CisJcmV0dXJuIChndWVzcyk7Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0x1dkluaXRTdGF0ZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTHV2SW5pdFN0YXRlIjsKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJTG9nTHV2U3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJYXNzZXJ0KHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19MT0dMVVYpOworCisJLyogZm9yIHNvbWUgcmVhc29uLCB3ZSBjYW4ndCBkbyB0aGlzIGluIFRJRkZJbml0TG9nTHV2ICovCisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgIT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIlNHSUxvZyBjb21wcmVzc2lvbiBjYW5ub3QgaGFuZGxlIG5vbi1jb250aWd1b3VzIGRhdGEiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF9VTktOT1dOKQorCQlzcC0+dXNlcl9kYXRhZm10ID0gTG9nTHV2R3Vlc3NEYXRhRm10KHRkKTsKKwlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwljYXNlIFNHSUxPR0RBVEFGTVRfRkxPQVQ6CisJCXNwLT5waXhlbF9zaXplID0gMypzaXplb2YgKGZsb2F0KTsKKwkJYnJlYWs7CisJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQlzcC0+cGl4ZWxfc2l6ZSA9IDMqc2l6ZW9mIChpbnQxNik7CisJCWJyZWFrOworCWNhc2UgU0dJTE9HREFUQUZNVF9SQVc6CisJCXNwLT5waXhlbF9zaXplID0gc2l6ZW9mICh1aW50MzIpOworCQlicmVhazsKKwljYXNlIFNHSUxPR0RBVEFGTVRfOEJJVDoKKwkJc3AtPnBpeGVsX3NpemUgPSAzKnNpemVvZiAodWludDgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk5vIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgdXNlciBkYXRhIGZvcm1hdCB0byBMb2dMdXYiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisgICAgICAgIGlmKCBpc1RpbGVkKHRpZikgKQorICAgICAgICAgICAgc3AtPnRidWZsZW4gPSBtdWx0aXBseV9tcyh0ZC0+dGRfdGlsZXdpZHRoLCB0ZC0+dGRfdGlsZWxlbmd0aCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNwLT50YnVmbGVuID0gbXVsdGlwbHlfbXModGQtPnRkX2ltYWdld2lkdGgsIHRkLT50ZF9yb3dzcGVyc3RyaXApOworCWlmIChtdWx0aXBseV9tcyhzcC0+dGJ1Zmxlbiwgc2l6ZW9mICh1aW50MzIpKSA9PSAwIHx8CisJICAgIChzcC0+dGJ1ZiA9ICh1aW50OCopIF9USUZGbWFsbG9jKHNwLT50YnVmbGVuICogc2l6ZW9mICh1aW50MzIpKSkgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIFNHSUxvZyB0cmFuc2xhdGlvbiBidWZmZXIiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorTG9nTHV2Rml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0x1dlNldHVwRGVjb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMb2dMdXZTZXR1cERlY29kZSI7CisJTG9nTHV2U3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCisJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOworCXN3aXRjaCAodGQtPnRkX3Bob3RvbWV0cmljKSB7CisJY2FzZSBQSE9UT01FVFJJQ19MT0dMVVY6CisJCWlmICghTG9nTHV2SW5pdFN0YXRlKHRpZikpCisJCQlicmVhazsKKwkJaWYgKHRkLT50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9TR0lMT0cyNCkgeworCQkJdGlmLT50aWZfZGVjb2Rlcm93ID0gTG9nTHV2RGVjb2RlMjQ7CisJCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYyNHRvWFlaOyAgCisJCQkJYnJlYWs7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfMTZCSVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MjR0b0x1djQ4OyAgCisJCQkJYnJlYWs7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfOEJJVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYyNHRvUkdCOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdGlmLT50aWZfZGVjb2Rlcm93ID0gTG9nTHV2RGVjb2RlMzI7CisJCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYzMnRvWFlaOworCQkJCWJyZWFrOworCQkJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQkJCXNwLT50ZnVuYyA9IEx1djMydG9MdXY0ODsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF84QklUOgorCQkJCXNwLT50ZnVuYyA9IEx1djMydG9SR0I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuICgxKTsKKwljYXNlIFBIT1RPTUVUUklDX0xPR0w6CisJCWlmICghTG9nTDE2SW5pdFN0YXRlKHRpZikpCisJCQlicmVhazsKKwkJdGlmLT50aWZfZGVjb2Rlcm93ID0gTG9nTDE2RGVjb2RlOworCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UX0ZMT0FUOgorCQkJc3AtPnRmdW5jID0gTDE2dG9ZOworCQkJYnJlYWs7CisJCWNhc2UgU0dJTE9HREFUQUZNVF84QklUOgorCQkJc3AtPnRmdW5jID0gTDE2dG9Hcnk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gKDEpOworCWRlZmF1bHQ6CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiSW5hcHByb3ByaWF0ZSBwaG90b21ldHJpYyBpbnRlcnByZXRhdGlvbiAlZCBmb3IgU0dJTG9nIGNvbXByZXNzaW9uOyAlcyIsCisJCSAgICB0ZC0+dGRfcGhvdG9tZXRyaWMsICJtdXN0IGJlIGVpdGhlciBMb2dMVVYgb3IgTG9nTCIpOworCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorTG9nTHV2U2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxvZ0x1dlNldHVwRW5jb2RlIjsKKwlMb2dMdXZTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwlzd2l0Y2ggKHRkLT50ZF9waG90b21ldHJpYykgeworCWNhc2UgUEhPVE9NRVRSSUNfTE9HTFVWOgorCQlpZiAoIUxvZ0x1dkluaXRTdGF0ZSh0aWYpKQorCQkJYnJlYWs7CisJCWlmICh0ZC0+dGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fU0dJTE9HMjQpIHsKKwkJCXRpZi0+dGlmX2VuY29kZXJvdyA9IExvZ0x1dkVuY29kZTI0OworCQkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfRkxPQVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MjRmcm9tWFlaOworCQkJCWJyZWFrOworCQkJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQkJCXNwLT50ZnVuYyA9IEx1djI0ZnJvbUx1djQ4OyAgCisJCQkJYnJlYWs7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfUkFXOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIG5vdHN1cHBvcnRlZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRpZi0+dGlmX2VuY29kZXJvdyA9IExvZ0x1dkVuY29kZTMyOyAgCisJCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYzMmZyb21YWVo7ICAKKwkJCQlicmVhazsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYzMmZyb21MdXY0ODsgIAorCQkJCWJyZWFrOworCQkJY2FzZSBTR0lMT0dEQVRBRk1UX1JBVzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBub3RzdXBwb3J0ZWQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQSE9UT01FVFJJQ19MT0dMOgorCQlpZiAoIUxvZ0wxNkluaXRTdGF0ZSh0aWYpKQorCQkJYnJlYWs7CisJCXRpZi0+dGlmX2VuY29kZXJvdyA9IExvZ0wxNkVuY29kZTsgIAorCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UX0ZMT0FUOgorCQkJc3AtPnRmdW5jID0gTDE2ZnJvbVk7CisJCQlicmVhazsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG5vdHN1cHBvcnRlZDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIkluYXBwcm9wcmlhdGUgcGhvdG9tZXRyaWMgaW50ZXJwcmV0YXRpb24gJWQgZm9yIFNHSUxvZyBjb21wcmVzc2lvbjsgJXMiLAorCQkgICAgdGQtPnRkX3Bob3RvbWV0cmljLCAibXVzdCBiZSBlaXRoZXIgTG9nTFVWIG9yIExvZ0wiKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoMSk7Citub3RzdXBwb3J0ZWQ6CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkgICAgIlNHSUxvZyBjb21wcmVzc2lvbiBzdXBwb3J0ZWQgb25seSBmb3IgJXMsIG9yIHJhdyBkYXRhIiwKKwkgICAgdGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX0xPR0wgPyAiWSwgTCIgOiAiWFlaLCBMdXYiKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorTG9nTHV2Q2xvc2UoVElGRiogdGlmKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCS8qCisJICogRm9yIGNvbnNpc3RlbmN5LCB3ZSBhbHdheXMgd2FudCB0byB3cml0ZSBvdXQgdGhlIHNhbWUKKwkgKiBiaXRzcGVyc2FtcGxlIGFuZCBzYW1wbGVmb3JtYXQgZm9yIG91ciBUSUZGIGZpbGUsCisJICogcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSBmb3JtYXQgYmVpbmcgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisJICogU2luY2UgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciB0YWdzIGhhdmUgYmVlbiBzZXQgYnV0CisJICogYmVmb3JlIHRoZXkgaGF2ZSBiZWVuIHJlY29yZGVkIGluIHRoZSBmaWxlLCB3ZSByZXNldCB0aGVtIGhlcmUuCisJICovCisJdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA9CisJICAgICh0ZC0+dGRfcGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTCkgPyAxIDogMzsKKwl0ZC0+dGRfYml0c3BlcnNhbXBsZSA9IDE2OworCXRkLT50ZF9zYW1wbGVmb3JtYXQgPSBTQU1QTEVGT1JNQVRfSU5UOworfQorCitzdGF0aWMgdm9pZAorTG9nTHV2Q2xlYW51cChUSUZGKiB0aWYpCit7CisJTG9nTHV2U3RhdGUqIHNwID0gKExvZ0x1dlN0YXRlICopdGlmLT50aWZfZGF0YTsKKworCWFzc2VydChzcCAhPSAwKTsKKworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gc3AtPnZnZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBzcC0+dnNldHBhcmVudDsKKworCWlmIChzcC0+dGJ1ZikKKwkJX1RJRkZmcmVlKHNwLT50YnVmKTsKKwlfVElGRmZyZWUoc3ApOworCXRpZi0+dGlmX2RhdGEgPSBOVUxMOworCisJX1RJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZSh0aWYpOworfQorCitzdGF0aWMgaW50CitMb2dMdXZWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxvZ0x1dlZTZXRGaWVsZCI7CisJTG9nTHV2U3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJaW50IGJwcywgZm10OworCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfU0dJTE9HREFUQUZNVDoKKwkJc3AtPnVzZXJfZGF0YWZtdCA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJLyoKKwkJICogVHdlYWsgdGhlIFRJRkYgaGVhZGVyIHNvIHRoYXQgdGhlIHJlc3Qgb2YgbGlidGlmZiBrbm93cyB3aGF0CisJCSAqIHNpemUgb2YgZGF0YSB3aWxsIGJlIHBhc3NlZCBiZXR3ZWVuIGFwcCBhbmQgbGlicmFyeSwgYW5kCisJCSAqIGFzc3VtZSB0aGF0IHRoZSBhcHAga25vd3Mgd2hhdCBpdCBpcyBkb2luZyBhbmQgaXMgbm90CisJCSAqIGNvbmZ1c2VkIGJ5IHRoZXNlIGhlYWRlciBtYW5pcHVsYXRpb25zLi4uCisJCSAqLworCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UX0ZMT0FUOgorCQkJYnBzID0gMzIsIGZtdCA9IFNBTVBMRUZPUk1BVF9JRUVFRlA7CisJCQlicmVhazsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQkJYnBzID0gMTYsIGZtdCA9IFNBTVBMRUZPUk1BVF9JTlQ7CisJCQlicmVhazsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UX1JBVzoKKwkJCWJwcyA9IDMyLCBmbXQgPSBTQU1QTEVGT1JNQVRfVUlOVDsKKwkJCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIFNHSUxPR0RBVEFGTVRfOEJJVDoKKwkJCWJwcyA9IDgsIGZtdCA9IFNBTVBMRUZPUk1BVF9VSU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAiVW5rbm93biBkYXRhIGZvcm1hdCAlZCBmb3IgTG9nTHV2IGNvbXByZXNzaW9uIiwKKwkJCSAgICBzcC0+dXNlcl9kYXRhZm10KTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCBicHMpOworCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgZm10KTsKKwkJLyoKKwkJICogTXVzdCByZWNhbGN1bGF0ZSBzaXplcyBzaG91bGQgYml0cy9zYW1wbGUgY2hhbmdlLgorCQkgKi8KKwkJdGlmLT50aWZfdGlsZXNpemUgPSBpc1RpbGVkKHRpZikgPyBUSUZGVGlsZVNpemUodGlmKSA6ICh0bXNpemVfdCkgLTE7CisJCXRpZi0+dGlmX3NjYW5saW5lc2l6ZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfU0dJTE9HRU5DT0RFOgorCQlzcC0+ZW5jb2RlX21ldGggPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCWlmIChzcC0+ZW5jb2RlX21ldGggIT0gU0dJTE9HRU5DT0RFX05PRElUSEVSICYmCisJCSAgICBzcC0+ZW5jb2RlX21ldGggIT0gU0dJTE9HRU5DT0RFX1JBTkRJVEhFUikgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiVW5rbm93biBlbmNvZGluZyAlZCBmb3IgTG9nTHV2IGNvbXByZXNzaW9uIiwKKwkJCSAgICBzcC0+ZW5jb2RlX21ldGgpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlyZXR1cm4gKDEpOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KK30KKworc3RhdGljIGludAorTG9nTHV2VkdldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCkKK3sKKwlMb2dMdXZTdGF0ZSAqc3AgPSAoTG9nTHV2U3RhdGUgKil0aWYtPnRpZl9kYXRhOworCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfU0dJTE9HREFUQUZNVDoKKwkJKnZhX2FyZyhhcCwgaW50KikgPSBzcC0+dXNlcl9kYXRhZm10OworCQlyZXR1cm4gKDEpOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52Z2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KK30KKworc3RhdGljIGNvbnN0IFRJRkZGaWVsZCBMb2dMdXZGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfU0dJTE9HREFUQUZNVCwgMCwgMCwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfSU5ULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BTRVVETywgVFJVRSwgRkFMU0UsICJTR0lMb2dEYXRhRm10IiwgTlVMTH0sCisgICAgeyBUSUZGVEFHX1NHSUxPR0VOQ09ERSwgMCwgMCwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfSU5ULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BTRVVETywgVFJVRSwgRkFMU0UsICJTR0lMb2dFbmNvZGUiLCBOVUxMfQorfTsKKworaW50CitUSUZGSW5pdFNHSUxvZyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkluaXRTR0lMb2ciOworCUxvZ0x1dlN0YXRlKiBzcDsKKworCWFzc2VydChzY2hlbWUgPT0gQ09NUFJFU1NJT05fU0dJTE9HMjQgfHwgc2NoZW1lID09IENPTVBSRVNTSU9OX1NHSUxPRyk7CisKKwkvKgorCSAqIE1lcmdlIGNvZGVjLXNwZWNpZmljIHRhZyBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBMb2dMdXZGaWVsZHMsCisJCQkgICAgICBUSUZGQXJyYXlDb3VudChMb2dMdXZGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk1lcmdpbmcgU0dJTG9nIGNvZGVjLXNwZWNpZmljIHRhZ3MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWxsb2NhdGUgc3RhdGUgYmxvY2sgc28gdGFnIG1ldGhvZHMgaGF2ZSBzdG9yYWdlIHRvIHJlY29yZCB2YWx1ZXMuCisJICovCisJdGlmLT50aWZfZGF0YSA9ICh1aW50OCopIF9USUZGbWFsbG9jKHNpemVvZiAoTG9nTHV2U3RhdGUpKTsKKwlpZiAodGlmLT50aWZfZGF0YSA9PSBOVUxMKQorCQlnb3RvIGJhZDsKKwlzcCA9IChMb2dMdXZTdGF0ZSopIHRpZi0+dGlmX2RhdGE7CisJX1RJRkZtZW1zZXQoKHZvaWQqKXNwLCAwLCBzaXplb2YgKCpzcCkpOworCXNwLT51c2VyX2RhdGFmbXQgPSBTR0lMT0dEQVRBRk1UX1VOS05PV047CisJc3AtPmVuY29kZV9tZXRoID0gKHNjaGVtZSA9PSBDT01QUkVTU0lPTl9TR0lMT0cyNCkgPworCSAgICBTR0lMT0dFTkNPREVfUkFORElUSEVSIDogU0dJTE9HRU5DT0RFX05PRElUSEVSOworCXNwLT50ZnVuYyA9IF9sb2dMdXZOb3A7CisKKwkvKgorCSAqIEluc3RhbGwgY29kZWMgbWV0aG9kcy4KKwkgKiBOQjogdGlmX2RlY29kZXJvdyAmIHRpZl9lbmNvZGVyb3cgYXJlIGZpbGxlZAorCSAqICAgICBpbiBhdCBzZXR1cCB0aW1lLgorCSAqLworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IExvZ0x1dkZpeHVwVGFnczsgIAorCXRpZi0+dGlmX3NldHVwZGVjb2RlID0gTG9nTHV2U2V0dXBEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBMb2dMdXZEZWNvZGVTdHJpcDsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gTG9nTHV2RGVjb2RlVGlsZTsKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IExvZ0x1dlNldHVwRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gTG9nTHV2RW5jb2RlU3RyaXA7ICAKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gTG9nTHV2RW5jb2RlVGlsZTsKKwl0aWYtPnRpZl9jbG9zZSA9IExvZ0x1dkNsb3NlOworCXRpZi0+dGlmX2NsZWFudXAgPSBMb2dMdXZDbGVhbnVwOworCisJLyoKKwkgKiBPdmVycmlkZSBwYXJlbnQgZ2V0L3NldCBmaWVsZCBtZXRob2RzLgorCSAqLworCXNwLT52Z2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBMb2dMdXZWR2V0RmllbGQ7ICAgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCXNwLT52c2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBMb2dMdXZWU2V0RmllbGQ7ICAgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCisJcmV0dXJuICgxKTsKK2JhZDoKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgICIlczogTm8gc3BhY2UgZm9yIExvZ0x1diBzdGF0ZSBibG9jayIsIHRpZi0+dGlmX25hbWUpOworCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogTE9HTFVWX1NVUFBPUlQgKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfbHp3LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9sencuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzlhYjBiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfbHp3LmMKQEAgLTAsMCArMSwxMTY5IEBACisvKiAkSWQ6IHRpZl9sencuYyx2IDEuNDUgMjAxMS0wNC0wMiAyMDo1NDowOSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpZmRlZiBMWldfU1VQUE9SVAorLyoKKyAqIFRJRkYgTGlicmFyeS4gIAorICogUmV2IDUuMCBMZW1wZWwtWml2ICYgV2VsY2ggQ29tcHJlc3Npb24gU3VwcG9ydAorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbXByZXNzIHByb2dyYW0gd2hvc2UgY29kZSBpcworICogZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5IEphbWVzIEEuIFdvb2RzLAorICogZGVyaXZlZCBmcm9tIG9yaWdpbmFsIHdvcmsgYnkgU3BlbmNlciBUaG9tYXMgYW5kIEpvc2VwaCBPcm9zdC4KKyAqCisgKiBUaGUgb3JpZ2luYWwgQmVya2VsZXkgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGJlbG93IGluIGl0cyBlbnRpcmV0eS4KKyAqLworI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICogTkI6IFRoZSA1LjAgc3BlYyBkZXNjcmliZXMgYSBkaWZmZXJlbnQgYWxnb3JpdGhtIHRoYW4gQWxkdXMKKyAqICAgICBpbXBsZW1lbnRzLiAgU3BlY2lmaWNhbGx5LCBBbGR1cyBkb2VzIGNvZGUgbGVuZ3RoIHRyYW5zaXRpb25zCisgKiAgICAgb25lIGNvZGUgZWFybGllciB0aGFuIHNob3VsZCBiZSBkb25lIChmb3IgcmVhbCBMWlcpLgorICogICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5IGltcGxlbWVudGVkIHRoZSBjb3JyZWN0CisgKiAgICAgTFpXIGFsZ29yaXRobSwgYnV0IGVtaXR0ZWQgY29kZXMgaW4gYSBiaXQgb3JkZXIgb3Bwb3NpdGUKKyAqICAgICB0byB0aGUgVElGRiBzcGVjLiAgVGh1cywgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3LyBBbGR1cworICogICAgIHdlIGludGVycHJldCBNU0ItTFNCIG9yZGVyZWQgY29kZXMgdG8gYmUgaW1hZ2VzIHdyaXR0ZW4gdy8KKyAqICAgICBvbGQgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5LCBidXQgb3RoZXJ3aXNlIGFkaGVyZSB0byB0aGUKKyAqICAgICBBbGR1cyAib2ZmIGJ5IG9uZSIgYWxnb3JpdGhtLgorICoKKyAqIEZ1dHVyZSByZXZpc2lvbnMgdG8gdGhlIFRJRkYgc3BlYyBhcmUgZXhwZWN0ZWQgdG8gImNsYXJpZnkgdGhpcyBpc3N1ZSIuCisgKi8KKyNkZWZpbmUgTFpXX0NPTVBBVCAgICAgICAgICAgICAgLyogaW5jbHVkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb2RlICovCisvKgorICogRWFjaCBzdHJpcCBvZiBkYXRhIGlzIHN1cHBvc2VkIHRvIGJlIHRlcm1pbmF0ZWQgYnkgYSBDT0RFX0VPSS4KKyAqIElmIHRoZSBmb2xsb3dpbmcgI2RlZmluZSBpcyBpbmNsdWRlZCwgdGhlIGRlY29kZXIgd2lsbCBhbHNvCisgKiBjaGVjayBmb3IgZW5kLW9mLXN0cmlwIHcvbyBzZWVpbmcgdGhpcyBjb2RlLiAgVGhpcyBtYWtlcyB0aGUKKyAqIGxpYnJhcnkgbW9yZSByb2J1c3QsIGJ1dCBhbHNvIHNsb3dlci4KKyAqLworI2RlZmluZSBMWldfQ0hFQ0tFT1MgICAgICAgICAgICAvKiBpbmNsdWRlIGNoZWNrcyBmb3Igc3RyaXBzIHcvbyBFT0kgY29kZSAqLworCisjZGVmaW5lIE1BWENPREUobikJKCgxTDw8KG4pKS0xKQorLyoKKyAqIFRoZSBUSUZGIHNwZWMgc3BlY2lmaWVzIHRoYXQgZW5jb2RlZCBiaXQKKyAqIHN0cmluZ3MgcmFuZ2UgZnJvbSA5IHRvIDEyIGJpdHMuCisgKi8KKyNkZWZpbmUgQklUU19NSU4gICAgICAgIDkgICAgICAgICAgICAgICAvKiBzdGFydCB3aXRoIDkgYml0cyAqLworI2RlZmluZSBCSVRTX01BWCAgICAgICAgMTIgICAgICAgICAgICAgIC8qIG1heCBvZiAxMiBiaXQgc3RyaW5ncyAqLworLyogcHJlZGVmaW5lZCBjb2RlcyAqLworI2RlZmluZSBDT0RFX0NMRUFSICAgICAgMjU2ICAgICAgICAgICAgIC8qIGNvZGUgdG8gY2xlYXIgc3RyaW5nIHRhYmxlICovCisjZGVmaW5lIENPREVfRU9JICAgICAgICAyNTcgICAgICAgICAgICAgLyogZW5kLW9mLWluZm9ybWF0aW9uIGNvZGUgKi8KKyNkZWZpbmUgQ09ERV9GSVJTVCAgICAgIDI1OCAgICAgICAgICAgICAvKiBmaXJzdCBmcmVlIGNvZGUgZW50cnkgKi8KKyNkZWZpbmUgQ09ERV9NQVggICAgICAgIE1BWENPREUoQklUU19NQVgpCisjZGVmaW5lIEhTSVpFICAgICAgICAgICA5MDAxTCAgICAgICAgICAgLyogOTElIG9jY3VwYW5jeSAqLworI2RlZmluZSBIU0hJRlQgICAgICAgICAgKDEzLTgpCisjaWZkZWYgTFpXX0NPTVBBVAorLyogTkI6ICsxMDI0IGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpbGVzICovCisjZGVmaW5lIENTSVpFICAgICAgICAgICAoTUFYQ09ERShCSVRTX01BWCkrMTAyNEwpCisjZWxzZQorI2RlZmluZSBDU0laRSAgICAgICAgICAgKE1BWENPREUoQklUU19NQVgpKzFMKQorI2VuZGlmCisKKy8qCisgKiBTdGF0ZSBibG9jayBmb3IgZWFjaCBvcGVuIFRJRkYgZmlsZSB1c2luZyBMWlcKKyAqIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uICBOb3RlIHRoYXQgdGhlIHByZWRpY3RvcgorICogc3RhdGUgYmxvY2sgbXVzdCBiZSBmaXJzdCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVElGRlByZWRpY3RvclN0YXRlIHByZWRpY3Q7ICAgICAvKiBwcmVkaWN0b3Igc3VwZXIgY2xhc3MgKi8KKworCXVuc2lnbmVkIHNob3J0ICBuYml0czsgICAgICAgICAgLyogIyBvZiBiaXRzL2NvZGUgKi8KKwl1bnNpZ25lZCBzaG9ydCAgbWF4Y29kZTsgICAgICAgIC8qIG1heGltdW0gY29kZSBmb3IgbHp3X25iaXRzICovCisJdW5zaWduZWQgc2hvcnQgIGZyZWVfZW50OyAgICAgICAvKiBuZXh0IGZyZWUgZW50cnkgaW4gaGFzaCB0YWJsZSAqLworCWxvbmcgICAgICAgICAgICBuZXh0ZGF0YTsgICAgICAgLyogbmV4dCBiaXRzIG9mIGkvbyAqLworCWxvbmcgICAgICAgICAgICBuZXh0Yml0czsgICAgICAgLyogIyBvZiB2YWxpZCBiaXRzIGluIGx6d19uZXh0ZGF0YSAqLworCisJaW50ICAgICAgICAgICAgIHJ3X21vZGU7ICAgICAgICAvKiBwcmVzZXJ2ZSByd19tb2RlIGZyb20gaW5pdCAqLworfSBMWldCYXNlU3RhdGU7CisKKyNkZWZpbmUgbHp3X25iaXRzICAgICAgIGJhc2UubmJpdHMKKyNkZWZpbmUgbHp3X21heGNvZGUgICAgIGJhc2UubWF4Y29kZQorI2RlZmluZSBsendfZnJlZV9lbnQgICAgYmFzZS5mcmVlX2VudAorI2RlZmluZSBsendfbmV4dGRhdGEgICAgYmFzZS5uZXh0ZGF0YQorI2RlZmluZSBsendfbmV4dGJpdHMgICAgYmFzZS5uZXh0Yml0cworCisvKgorICogRW5jb2Rpbmctc3BlY2lmaWMgc3RhdGUuCisgKi8KK3R5cGVkZWYgdWludDE2IGhjb2RlX3Q7CQkJLyogY29kZXMgZml0IGluIDE2IGJpdHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsb25nCWhhc2g7CisJaGNvZGVfdAljb2RlOworfSBoYXNoX3Q7CisKKy8qCisgKiBEZWNvZGluZy1zcGVjaWZpYyBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29kZV9lbnQgeworCXN0cnVjdCBjb2RlX2VudCAqbmV4dDsKKwl1bnNpZ25lZCBzaG9ydAlsZW5ndGg7CQkvKiBzdHJpbmcgbGVuLCBpbmNsdWRpbmcgdGhpcyB0b2tlbiAqLworCXVuc2lnbmVkIGNoYXIJdmFsdWU7CQkvKiBkYXRhIHZhbHVlICovCisJdW5zaWduZWQgY2hhcglmaXJzdGNoYXI7CS8qIGZpcnN0IHRva2VuIG9mIHN0cmluZyAqLworfSBjb2RlX3Q7CisKK3R5cGVkZWYgaW50ICgqZGVjb2RlRnVuYykoVElGRiosIHVpbnQ4KiwgdG1zaXplX3QsIHVpbnQxNik7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlMWldCYXNlU3RhdGUgYmFzZTsKKworCS8qIERlY29kaW5nIHNwZWNpZmljIGRhdGEgKi8KKwlsb25nICAgIGRlY19uYml0c21hc2s7CQkvKiBsendfbmJpdHMgMSBiaXRzLCByaWdodCBhZGp1c3RlZCAqLworCWxvbmcgICAgZGVjX3Jlc3RhcnQ7CQkvKiByZXN0YXJ0IGNvdW50ICovCisjaWZkZWYgTFpXX0NIRUNLRU9TCisJdWludDY0ICBkZWNfYml0c2xlZnQ7CQkvKiBhdmFpbGFibGUgYml0cyBpbiByYXcgZGF0YSAqLworI2VuZGlmCisJZGVjb2RlRnVuYyBkZWNfZGVjb2RlOwkJLyogcmVndWxhciBvciBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCWNvZGVfdCogZGVjX2NvZGVwOwkJLyogY3VycmVudCByZWNvZ25pemVkIGNvZGUgKi8KKwljb2RlX3QqIGRlY19vbGRjb2RlcDsJCS8qIHByZXZpb3VzbHkgcmVjb2duaXplZCBjb2RlICovCisJY29kZV90KiBkZWNfZnJlZV9lbnRwOwkJLyogbmV4dCBmcmVlIGVudHJ5ICovCisJY29kZV90KiBkZWNfbWF4Y29kZXA7CQkvKiBtYXggYXZhaWxhYmxlIGVudHJ5ICovCisJY29kZV90KiBkZWNfY29kZXRhYjsJCS8qIGtlcHQgc2VwYXJhdGUgZm9yIHNtYWxsIG1hY2hpbmVzICovCisKKwkvKiBFbmNvZGluZyBzcGVjaWZpYyBkYXRhICovCisJaW50ICAgICBlbmNfb2xkY29kZTsJCS8qIGxhc3QgY29kZSBlbmNvdW50ZXJlZCAqLworCWxvbmcgICAgZW5jX2NoZWNrcG9pbnQ7CQkvKiBwb2ludCBhdCB3aGljaCB0byBjbGVhciB0YWJsZSAqLworI2RlZmluZSBDSEVDS19HQVAJMTAwMDAJCS8qIGVuY19yYXRpbyBjaGVjayBpbnRlcnZhbCAqLworCWxvbmcgICAgZW5jX3JhdGlvOwkJLyogY3VycmVudCBjb21wcmVzc2lvbiByYXRpbyAqLworCWxvbmcgICAgZW5jX2luY291bnQ7CQkvKiAoaW5wdXQpIGRhdGEgYnl0ZXMgZW5jb2RlZCAqLworCWxvbmcgICAgZW5jX291dGNvdW50OwkJLyogZW5jb2RlZCAob3V0cHV0KSBieXRlcyAqLworCXVpbnQ4KiAgZW5jX3Jhd2xpbWl0OwkJLyogYm91bmQgb24gdGlmX3Jhd2RhdGEgYnVmZmVyICovCisJaGFzaF90KiBlbmNfaGFzaHRhYjsJCS8qIGtlcHQgc2VwYXJhdGUgZm9yIHNtYWxsIG1hY2hpbmVzICovCit9IExaV0NvZGVjU3RhdGU7CisKKyNkZWZpbmUgTFpXU3RhdGUodGlmKQkJKChMWldCYXNlU3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisjZGVmaW5lIERlY29kZXJTdGF0ZSh0aWYpCSgoTFpXQ29kZWNTdGF0ZSopIExaV1N0YXRlKHRpZikpCisjZGVmaW5lIEVuY29kZXJTdGF0ZSh0aWYpCSgoTFpXQ29kZWNTdGF0ZSopIExaV1N0YXRlKHRpZikpCisKK3N0YXRpYyBpbnQgTFpXRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpOworI2lmZGVmIExaV19DT01QQVQKK3N0YXRpYyBpbnQgTFpXRGVjb2RlQ29tcGF0KFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpOworI2VuZGlmCitzdGF0aWMgdm9pZCBjbF9oYXNoKExaV0NvZGVjU3RhdGUqKTsKKworLyoKKyAqIExaVyBEZWNvZGVyLgorICovCisKKyNpZmRlZiBMWldfQ0hFQ0tFT1MKKy8qCisgKiBUaGlzIGNoZWNrIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoCisgKiBzdHJpcCBpcyBzdXBwb3NlIHRvIGJlIHRlcm1pbmF0ZWQgd2l0aCBDT0RFX0VPSS4KKyAqLworI2RlZmluZQlOZXh0Q29kZShfdGlmLCBfc3AsIF9icCwgX2NvZGUsIF9nZXQpIHsJCQkJXAorCWlmICgoX3NwKS0+ZGVjX2JpdHNsZWZ0IDwgKHVpbnQ2NCluYml0cykgewkJCVwKKwkJVElGRldhcm5pbmdFeHQoX3RpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwJCVwKKwkJICAgICJMWldEZWNvZGU6IFN0cmlwICVkIG5vdCB0ZXJtaW5hdGVkIHdpdGggRU9JIGNvZGUiLCBcCisJCSAgICBfdGlmLT50aWZfY3Vyc3RyaXApOwkJCQlcCisJCV9jb2RlID0gQ09ERV9FT0k7CQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfZ2V0KF9zcCxfYnAsX2NvZGUpOwkJCQkJXAorCQkoX3NwKS0+ZGVjX2JpdHNsZWZ0IC09IG5iaXRzOwkJCQlcCisJfQkJCQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUJTmV4dENvZGUodGlmLCBzcCwgYnAsIGNvZGUsIGdldCkgZ2V0KHNwLCBicCwgY29kZSkKKyNlbmRpZgorCitzdGF0aWMgaW50CitMWldGaXh1cFRhZ3MoVElGRiogdGlmKQoreworCSh2b2lkKSB0aWY7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorTFpXU2V0dXBEZWNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxaV1NldHVwRGVjb2RlIjsKKwlMWldDb2RlY1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCWludCBjb2RlOworCisJaWYoIHNwID09IE5VTEwgKQorCXsKKwkJLyoKKwkJICogQWxsb2NhdGUgc3RhdGUgYmxvY2sgc28gdGFnIG1ldGhvZHMgaGF2ZSBzdG9yYWdlIHRvIHJlY29yZAorCQkgKiB2YWx1ZXMuCisJCSovCisJCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YoTFpXQ29kZWNTdGF0ZSkpOworCQlpZiAodGlmLT50aWZfZGF0YSA9PSBOVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIExaVyBzdGF0ZSBibG9jayIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCURlY29kZXJTdGF0ZSh0aWYpLT5kZWNfY29kZXRhYiA9IE5VTEw7CisJCURlY29kZXJTdGF0ZSh0aWYpLT5kZWNfZGVjb2RlID0gTlVMTDsKKworCQkvKgorCQkgKiBTZXR1cCBwcmVkaWN0b3Igc2V0dXAuCisJCSAqLworCQkodm9pZCkgVElGRlByZWRpY3RvckluaXQodGlmKTsKKworCQlzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCX0KKworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCWlmIChzcC0+ZGVjX2NvZGV0YWIgPT0gTlVMTCkgeworCQlzcC0+ZGVjX2NvZGV0YWIgPSAoY29kZV90KilfVElGRm1hbGxvYyhDU0laRSpzaXplb2YgKGNvZGVfdCkpOworCQlpZiAoc3AtPmRlY19jb2RldGFiID09IE5VTEwpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICAiTm8gc3BhY2UgZm9yIExaVyBjb2RlIHRhYmxlIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCS8qCisJCSAqIFByZS1sb2FkIHRoZSB0YWJsZS4KKwkJICovCisJCWNvZGUgPSAyNTU7CisJCWRvIHsKKwkJCXNwLT5kZWNfY29kZXRhYltjb2RlXS52YWx1ZSA9IGNvZGU7CisJCQlzcC0+ZGVjX2NvZGV0YWJbY29kZV0uZmlyc3RjaGFyID0gY29kZTsKKwkJCXNwLT5kZWNfY29kZXRhYltjb2RlXS5sZW5ndGggPSAxOworCQkJc3AtPmRlY19jb2RldGFiW2NvZGVdLm5leHQgPSBOVUxMOworCQl9IHdoaWxlIChjb2RlLS0pOworCQkvKgorCQkgKiBaZXJvLW91dCB0aGUgdW51c2VkIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgX1RJRkZtZW1zZXQoJnNwLT5kZWNfY29kZXRhYltDT0RFX0NMRUFSXSwgMCwKKwkJCSAgICAgKENPREVfRklSU1QgLSBDT0RFX0NMRUFSKSAqIHNpemVvZiAoY29kZV90KSk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXR1cCBzdGF0ZSBmb3IgZGVjb2RpbmcgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorTFpXUHJlRGVjb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTFpXUHJlRGVjb2RlIjsKKwlMWldDb2RlY1N0YXRlICpzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWlmKCBzcC0+ZGVjX2NvZGV0YWIgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZi0+dGlmX3NldHVwZGVjb2RlKCB0aWYgKTsKKyAgICAgICAgfQorCisJLyoKKwkgKiBDaGVjayBmb3Igb2xkIGJpdC1yZXZlcnNlZCBjb2Rlcy4KKwkgKi8KKwlpZiAodGlmLT50aWZfcmF3ZGF0YVswXSA9PSAwICYmICh0aWYtPnRpZl9yYXdkYXRhWzFdICYgMHgxKSkgeworI2lmZGVmIExaV19DT01QQVQKKwkJaWYgKCFzcC0+ZGVjX2RlY29kZSkgeworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJPbGQtc3R5bGUgTFpXIGNvZGVzLCBjb252ZXJ0IGZpbGUiKTsKKwkJCS8qCisJCQkgKiBPdmVycmlkZSBkZWZhdWx0IGRlY29kaW5nIG1ldGhvZHMgd2l0aAorCQkJICogb25lcyB0aGF0IGRlYWwgd2l0aCB0aGUgb2xkIGNvZGluZy4KKwkJCSAqIE90aGVyd2lzZSB0aGUgcHJlZGljdG9yIHZlcnNpb25zIHNldAorCQkJICogYWJvdmUgd2lsbCBjYWxsIHRoZSBjb21wYXRpYmlsaXR5IHJvdXRpbmVzCisJCQkgKiB0aHJvdWdoIHRoZSBkZWNfZGVjb2RlIG1ldGhvZC4KKwkJCSAqLworCQkJdGlmLT50aWZfZGVjb2Rlcm93ID0gTFpXRGVjb2RlQ29tcGF0OworCQkJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBMWldEZWNvZGVDb21wYXQ7CisJCQl0aWYtPnRpZl9kZWNvZGV0aWxlID0gTFpXRGVjb2RlQ29tcGF0OworCQkJLyoKKwkJCSAqIElmIGRvaW5nIGhvcml6b250YWwgZGlmZmVyZW5jaW5nLCBtdXN0CisJCQkgKiByZS1zZXR1cCB0aGUgcHJlZGljdG9yIGxvZ2ljIHNpbmNlIHdlCisJCQkgKiBzd2l0Y2hlZCB0aGUgYmFzaWMgZGVjb2RlciBtZXRob2RzLi4uCisJCQkgKi8KKwkJCSgqdGlmLT50aWZfc2V0dXBkZWNvZGUpKHRpZik7CisJCQlzcC0+ZGVjX2RlY29kZSA9IExaV0RlY29kZUNvbXBhdDsKKwkJfQorCQlzcC0+bHp3X21heGNvZGUgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKyNlbHNlIC8qICFMWldfQ09NUEFUICovCisJCWlmICghc3AtPmRlY19kZWNvZGUpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIk9sZC1zdHlsZSBMWlcgY29kZXMgbm90IHN1cHBvcnRlZCIpOworCQkJc3AtPmRlY19kZWNvZGUgPSBMWldEZWNvZGU7CisJCX0KKwkJcmV0dXJuICgwKTsKKyNlbmRpZi8qICFMWldfQ09NUEFUICovCisJfSBlbHNlIHsKKwkJc3AtPmx6d19tYXhjb2RlID0gTUFYQ09ERShCSVRTX01JTiktMTsKKwkJc3AtPmRlY19kZWNvZGUgPSBMWldEZWNvZGU7CisJfQorCXNwLT5sendfbmJpdHMgPSBCSVRTX01JTjsKKwlzcC0+bHp3X25leHRiaXRzID0gMDsKKwlzcC0+bHp3X25leHRkYXRhID0gMDsKKworCXNwLT5kZWNfcmVzdGFydCA9IDA7CisJc3AtPmRlY19uYml0c21hc2sgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKyNpZmRlZiBMWldfQ0hFQ0tFT1MKKwlzcC0+ZGVjX2JpdHNsZWZ0ID0gKCh1aW50NjQpdGlmLT50aWZfcmF3Y2MpIDw8IDM7CisjZW5kaWYKKwlzcC0+ZGVjX2ZyZWVfZW50cCA9IHNwLT5kZWNfY29kZXRhYiArIENPREVfRklSU1Q7CisJLyoKKwkgKiBaZXJvIGVudHJpZXMgdGhhdCBhcmUgbm90IHlldCBmaWxsZWQgaW4uICBXZSBkbworCSAqIHRoaXMgdG8gZ3VhcmQgYWdhaW5zdCBib2d1cyBpbnB1dCBkYXRhIHRoYXQgY2F1c2VzCisJICogdXMgdG8gaW5kZXggaW50byB1bmRlZmluZWQgZW50cmllcy4gIElmIHlvdSBjYW4KKwkgKiBjb21lIHVwIHdpdGggYSB3YXkgdG8gc2FmZWx5IGJvdW5kcy1jaGVjayBpbnB1dCBjb2RlcworCSAqIHdoaWxlIGRlY29kaW5nIHRoZW4geW91IGNhbiByZW1vdmUgdGhpcyBvcGVyYXRpb24uCisJICovCisJX1RJRkZtZW1zZXQoc3AtPmRlY19mcmVlX2VudHAsIDAsIChDU0laRS1DT0RFX0ZJUlNUKSpzaXplb2YgKGNvZGVfdCkpOworCXNwLT5kZWNfb2xkY29kZXAgPSAmc3AtPmRlY19jb2RldGFiWy0xXTsKKwlzcC0+ZGVjX21heGNvZGVwID0gJnNwLT5kZWNfY29kZXRhYltzcC0+ZGVjX25iaXRzbWFzay0xXTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgImh1bmsgb2YgZGF0YSIuCisgKi8KKyNkZWZpbmUJR2V0TmV4dENvZGUoc3AsIGJwLCBjb2RlKSB7CQkJCVwKKwluZXh0ZGF0YSA9IChuZXh0ZGF0YTw8OCkgfCAqKGJwKSsrOwkJCVwKKwluZXh0Yml0cyArPSA4OwkJCQkJCVwKKwlpZiAobmV4dGJpdHMgPCBuYml0cykgewkJCQkJXAorCQluZXh0ZGF0YSA9IChuZXh0ZGF0YTw8OCkgfCAqKGJwKSsrOwkJXAorCQluZXh0Yml0cyArPSA4OwkJCQkJXAorCX0JCQkJCQkJXAorCWNvZGUgPSAoaGNvZGVfdCkoKG5leHRkYXRhID4+IChuZXh0Yml0cy1uYml0cykpICYgbmJpdHNtYXNrKTsJXAorCW5leHRiaXRzIC09IG5iaXRzOwkJCQkJXAorfQorCitzdGF0aWMgdm9pZAorY29kZUxvb3AoVElGRiogdGlmLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkgICAgIkJvZ3VzIGVuY29kaW5nLCBsb29wIGluIHRoZSBjb2RlIHRhYmxlOyBzY2FubGluZSAlZCIsCisJICAgIHRpZi0+dGlmX3Jvdyk7Cit9CisKK3N0YXRpYyBpbnQKK0xaV0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBvcDAsIHRtc2l6ZV90IG9jYzAsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxaV0RlY29kZSI7CisJTFpXQ29kZWNTdGF0ZSAqc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKwljaGFyICpvcCA9IChjaGFyKikgb3AwOworCWxvbmcgb2NjID0gKGxvbmcpIG9jYzA7CisJY2hhciAqdHA7CisJdW5zaWduZWQgY2hhciAqYnA7CisJaGNvZGVfdCBjb2RlOworCWludCBsZW47CisJbG9uZyBuYml0cywgbmV4dGJpdHMsIG5leHRkYXRhLCBuYml0c21hc2s7CisJY29kZV90ICpjb2RlcCwgKmZyZWVfZW50cCwgKm1heGNvZGVwLCAqb2xkY29kZXA7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisgICAgICAgIGFzc2VydChzcC0+ZGVjX2NvZGV0YWIgIT0gTlVMTCk7CisKKwkvKgorCSAgRmFpbCBpZiB2YWx1ZSBkb2VzIG5vdCBmaXQgaW4gbG9uZy4KKwkqLworCWlmICgodG1zaXplX3QpIG9jYyAhPSBvY2MwKQorCSAgICAgICAgcmV0dXJuICgwKTsKKwkvKgorCSAqIFJlc3RhcnQgaW50ZXJydXB0ZWQgb3V0cHV0IG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoc3AtPmRlY19yZXN0YXJ0KSB7CisJCWxvbmcgcmVzaWR1ZTsKKworCQljb2RlcCA9IHNwLT5kZWNfY29kZXA7CisJCXJlc2lkdWUgPSBjb2RlcC0+bGVuZ3RoIC0gc3AtPmRlY19yZXN0YXJ0OworCQlpZiAocmVzaWR1ZSA+IG9jYykgeworCQkJLyoKKwkJCSAqIFJlc2lkdWUgZnJvbSBwcmV2aW91cyBkZWNvZGUgaXMgc3VmZmljaWVudAorCQkJICogdG8gc2F0aXNmeSBkZWNvZGUgcmVxdWVzdC4gIFNraXAgdG8gdGhlCisJCQkgKiBzdGFydCBvZiB0aGUgZGVjb2RlZCBzdHJpbmcsIHBsYWNlIGRlY29kZWQKKwkJCSAqIHZhbHVlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIHJldHVybi4KKwkJCSAqLworCQkJc3AtPmRlY19yZXN0YXJ0ICs9IG9jYzsKKwkJCWRvIHsKKwkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJfSB3aGlsZSAoLS1yZXNpZHVlID4gb2NjICYmIGNvZGVwKTsKKwkJCWlmIChjb2RlcCkgeworCQkJCXRwID0gb3AgKyBvY2M7CisJCQkJZG8geworCQkJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKKwkJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCQl9IHdoaWxlICgtLW9jYyAmJiBjb2RlcCk7CisJCQl9CisJCQlyZXR1cm4gKDEpOworCQl9CisJCS8qCisJCSAqIFJlc2lkdWUgc2F0aXNmaWVzIG9ubHkgcGFydCBvZiB0aGUgZGVjb2RlIHJlcXVlc3QuCisJCSAqLworCQlvcCArPSByZXNpZHVlLCBvY2MgLT0gcmVzaWR1ZTsKKwkJdHAgPSBvcDsKKwkJZG8geworCQkJaW50IHQ7CisJCQktLXRwOworCQkJdCA9IGNvZGVwLT52YWx1ZTsKKwkJCWNvZGVwID0gY29kZXAtPm5leHQ7CisJCQkqdHAgPSB0OworCQl9IHdoaWxlICgtLXJlc2lkdWUgJiYgY29kZXApOworCQlzcC0+ZGVjX3Jlc3RhcnQgPSAwOworCX0KKworCWJwID0gKHVuc2lnbmVkIGNoYXIgKil0aWYtPnRpZl9yYXdjcDsKKwluYml0cyA9IHNwLT5sendfbmJpdHM7CisJbmV4dGRhdGEgPSBzcC0+bHp3X25leHRkYXRhOworCW5leHRiaXRzID0gc3AtPmx6d19uZXh0Yml0czsKKwluYml0c21hc2sgPSBzcC0+ZGVjX25iaXRzbWFzazsKKwlvbGRjb2RlcCA9IHNwLT5kZWNfb2xkY29kZXA7CisJZnJlZV9lbnRwID0gc3AtPmRlY19mcmVlX2VudHA7CisJbWF4Y29kZXAgPSBzcC0+ZGVjX21heGNvZGVwOworCisJd2hpbGUgKG9jYyA+IDApIHsKKwkJTmV4dENvZGUodGlmLCBzcCwgYnAsIGNvZGUsIEdldE5leHRDb2RlKTsKKwkJaWYgKGNvZGUgPT0gQ09ERV9FT0kpCisJCQlicmVhazsKKwkJaWYgKGNvZGUgPT0gQ09ERV9DTEVBUikgeworCQkJZnJlZV9lbnRwID0gc3AtPmRlY19jb2RldGFiICsgQ09ERV9GSVJTVDsKKwkJCV9USUZGbWVtc2V0KGZyZWVfZW50cCwgMCwKKwkJCQkgICAgKENTSVpFIC0gQ09ERV9GSVJTVCkgKiBzaXplb2YgKGNvZGVfdCkpOworCQkJbmJpdHMgPSBCSVRTX01JTjsKKwkJCW5iaXRzbWFzayA9IE1BWENPREUoQklUU19NSU4pOworCQkJbWF4Y29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBuYml0c21hc2stMTsKKwkJCU5leHRDb2RlKHRpZiwgc3AsIGJwLCBjb2RlLCBHZXROZXh0Q29kZSk7CisJCQlpZiAoY29kZSA9PSBDT0RFX0VPSSkKKwkJCQlicmVhazsKKwkJCWlmIChjb2RlID49IENPREVfQ0xFQVIpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkiTFpXRGVjb2RlOiBDb3JydXB0ZWQgTFpXIHRhYmxlIGF0IHNjYW5saW5lICVkIiwKKwkJCQkJICAgICB0aWYtPnRpZl9yb3cpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQkqb3ArKyA9IChjaGFyKWNvZGUsIG9jYy0tOworCQkJb2xkY29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBjb2RlOworCQkJY29udGludWU7CisJCX0KKwkJY29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBjb2RlOworCisJCS8qCisJCSAqIEFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBjb2RlIHRhYmxlLgorCQkgKi8KKwkJaWYgKGZyZWVfZW50cCA8ICZzcC0+ZGVjX2NvZGV0YWJbMF0gfHwKKwkJICAgIGZyZWVfZW50cCA+PSAmc3AtPmRlY19jb2RldGFiW0NTSVpFXSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ29ycnVwdGVkIExaVyB0YWJsZSBhdCBzY2FubGluZSAlZCIsCisJCQkgICAgdGlmLT50aWZfcm93KTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQlmcmVlX2VudHAtPm5leHQgPSBvbGRjb2RlcDsKKwkJaWYgKGZyZWVfZW50cC0+bmV4dCA8ICZzcC0+ZGVjX2NvZGV0YWJbMF0gfHwKKwkJICAgIGZyZWVfZW50cC0+bmV4dCA+PSAmc3AtPmRlY19jb2RldGFiW0NTSVpFXSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ29ycnVwdGVkIExaVyB0YWJsZSBhdCBzY2FubGluZSAlZCIsCisJCQkgICAgdGlmLT50aWZfcm93KTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJZnJlZV9lbnRwLT5maXJzdGNoYXIgPSBmcmVlX2VudHAtPm5leHQtPmZpcnN0Y2hhcjsKKwkJZnJlZV9lbnRwLT5sZW5ndGggPSBmcmVlX2VudHAtPm5leHQtPmxlbmd0aCsxOworCQlmcmVlX2VudHAtPnZhbHVlID0gKGNvZGVwIDwgZnJlZV9lbnRwKSA/CisJCSAgICBjb2RlcC0+Zmlyc3RjaGFyIDogZnJlZV9lbnRwLT5maXJzdGNoYXI7CisJCWlmICgrK2ZyZWVfZW50cCA+IG1heGNvZGVwKSB7CisJCQlpZiAoKytuYml0cyA+IEJJVFNfTUFYKQkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCQluYml0cyA9IEJJVFNfTUFYOworCQkJbmJpdHNtYXNrID0gTUFYQ09ERShuYml0cyk7CisJCQltYXhjb2RlcCA9IHNwLT5kZWNfY29kZXRhYiArIG5iaXRzbWFzay0xOworCQl9CisJCW9sZGNvZGVwID0gY29kZXA7CisJCWlmIChjb2RlID49IDI1NikgeworCQkJLyoKKwkJCSAqIENvZGUgbWFwcyB0byBhIHN0cmluZywgY29weSBzdHJpbmcKKwkJCSAqIHZhbHVlIHRvIG91dHB1dCAod3JpdHRlbiBpbiByZXZlcnNlKS4KKwkJCSAqLworCQkJaWYoY29kZXAtPmxlbmd0aCA9PSAwKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIldyb25nIGxlbmd0aCBvZiBkZWNvZGVkIHN0cmluZzogIgorCQkJCSAgICAiZGF0YSBwcm9iYWJseSBjb3JydXB0ZWQgYXQgc2NhbmxpbmUgJWQiLAorCQkJCSAgICB0aWYtPnRpZl9yb3cpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAoY29kZXAtPmxlbmd0aCA+IG9jYykgeworCQkJCS8qCisJCQkJICogU3RyaW5nIGlzIHRvbyBsb25nIGZvciBkZWNvZGUgYnVmZmVyLAorCQkJCSAqIGxvY2F0ZSBwb3J0aW9uIHRoYXQgd2lsbCBmaXQsIGNvcHkgdG8KKwkJCQkgKiB0aGUgZGVjb2RlIGJ1ZmZlciwgYW5kIHNldHVwIHJlc3RhcnQKKwkJCQkgKiBsb2dpYyBmb3IgdGhlIG5leHQgZGVjb2RpbmcgY2FsbC4KKwkJCQkgKi8KKwkJCQlzcC0+ZGVjX2NvZGVwID0gY29kZXA7CisJCQkJZG8geworCQkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJCX0gd2hpbGUgKGNvZGVwICYmIGNvZGVwLT5sZW5ndGggPiBvY2MpOworCQkJCWlmIChjb2RlcCkgeworCQkJCQlzcC0+ZGVjX3Jlc3RhcnQgPSAobG9uZylvY2M7CisJCQkJCXRwID0gb3AgKyBvY2M7CisJCQkJCWRvICB7CisJCQkJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKKwkJCQkJCWNvZGVwID0gY29kZXAtPm5leHQ7CisJCQkJCX0gIHdoaWxlICgtLW9jYyAmJiBjb2RlcCk7CisJCQkJCWlmIChjb2RlcCkKKwkJCQkJCWNvZGVMb29wKHRpZiwgbW9kdWxlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlsZW4gPSBjb2RlcC0+bGVuZ3RoOworCQkJdHAgPSBvcCArIGxlbjsKKwkJCWRvIHsKKwkJCQlpbnQgdDsKKwkJCQktLXRwOworCQkJCXQgPSBjb2RlcC0+dmFsdWU7CisJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCQkqdHAgPSB0OworCQkJfSB3aGlsZSAoY29kZXAgJiYgdHAgPiBvcCk7CisJCQlpZiAoY29kZXApIHsKKwkJCSAgICBjb2RlTG9vcCh0aWYsIG1vZHVsZSk7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQlhc3NlcnQob2NjID49IGxlbik7CisJCQlvcCArPSBsZW4sIG9jYyAtPSBsZW47CisJCX0gZWxzZQorCQkJKm9wKysgPSAoY2hhciljb2RlLCBvY2MtLTsKKwl9CisKKwl0aWYtPnRpZl9yYXdjcCA9ICh1aW50OCopIGJwOworCXNwLT5sendfbmJpdHMgPSAodW5zaWduZWQgc2hvcnQpIG5iaXRzOworCXNwLT5sendfbmV4dGRhdGEgPSBuZXh0ZGF0YTsKKwlzcC0+bHp3X25leHRiaXRzID0gbmV4dGJpdHM7CisJc3AtPmRlY19uYml0c21hc2sgPSBuYml0c21hc2s7CisJc3AtPmRlY19vbGRjb2RlcCA9IG9sZGNvZGVwOworCXNwLT5kZWNfZnJlZV9lbnRwID0gZnJlZV9lbnRwOworCXNwLT5kZWNfbWF4Y29kZXAgPSBtYXhjb2RlcDsKKworCWlmIChvY2MgPiAwKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJOb3QgZW5vdWdoIGRhdGEgYXQgc2NhbmxpbmUgJWQgKHNob3J0ICVJNjRkIGJ5dGVzKSIsCisJCQkgICAgIHRpZi0+dGlmX3JvdywgKHVuc2lnbmVkIF9faW50NjQpIG9jYyk7CisjZWxzZQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIk5vdCBlbm91Z2ggZGF0YSBhdCBzY2FubGluZSAlZCAoc2hvcnQgJWxsdSBieXRlcykiLAorCQkJICAgICB0aWYtPnRpZl9yb3csICh1bnNpZ25lZCBsb25nIGxvbmcpIG9jYyk7CisjZW5kaWYKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworI2lmZGVmIExaV19DT01QQVQKKy8qCisgKiBEZWNvZGUgYSAiaHVuayBvZiBkYXRhIiBmb3Igb2xkIGltYWdlcy4KKyAqLworI2RlZmluZQlHZXROZXh0Q29kZUNvbXBhdChzcCwgYnAsIGNvZGUpIHsJCQlcCisJbmV4dGRhdGEgfD0gKHVuc2lnbmVkIGxvbmcpICooYnApKysgPDwgbmV4dGJpdHM7CVwKKwluZXh0Yml0cyArPSA4OwkJCQkJCVwKKwlpZiAobmV4dGJpdHMgPCBuYml0cykgewkJCQkJXAorCQluZXh0ZGF0YSB8PSAodW5zaWduZWQgbG9uZykgKihicCkrKyA8PCBuZXh0Yml0cztcCisJCW5leHRiaXRzICs9IDg7CQkJCQlcCisJfQkJCQkJCQlcCisJY29kZSA9IChoY29kZV90KShuZXh0ZGF0YSAmIG5iaXRzbWFzayk7CQkJXAorCW5leHRkYXRhID4+PSBuYml0czsJCQkJCVwKKwluZXh0Yml0cyAtPSBuYml0czsJCQkJCVwKK30KKworc3RhdGljIGludAorTFpXRGVjb2RlQ29tcGF0KFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTFpXRGVjb2RlQ29tcGF0IjsKKwlMWldDb2RlY1N0YXRlICpzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCWNoYXIgKm9wID0gKGNoYXIqKSBvcDA7CisJbG9uZyBvY2MgPSAobG9uZykgb2NjMDsKKwljaGFyICp0cDsKKwl1bnNpZ25lZCBjaGFyICpicDsKKwlpbnQgY29kZSwgbmJpdHM7CisJbG9uZyBuZXh0Yml0cywgbmV4dGRhdGEsIG5iaXRzbWFzazsKKwljb2RlX3QgKmNvZGVwLCAqZnJlZV9lbnRwLCAqbWF4Y29kZXAsICpvbGRjb2RlcDsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCS8qCisJICBGYWlsIGlmIHZhbHVlIGRvZXMgbm90IGZpdCBpbiBsb25nLgorCSovCisJaWYgKCh0bXNpemVfdCkgb2NjICE9IG9jYzApCisJICAgICAgICByZXR1cm4gKDApOworCisJLyoKKwkgKiBSZXN0YXJ0IGludGVycnVwdGVkIG91dHB1dCBvcGVyYXRpb24uCisJICovCisJaWYgKHNwLT5kZWNfcmVzdGFydCkgeworCQlsb25nIHJlc2lkdWU7CisKKwkJY29kZXAgPSBzcC0+ZGVjX2NvZGVwOworCQlyZXNpZHVlID0gY29kZXAtPmxlbmd0aCAtIHNwLT5kZWNfcmVzdGFydDsKKwkJaWYgKHJlc2lkdWUgPiBvY2MpIHsKKwkJCS8qCisJCQkgKiBSZXNpZHVlIGZyb20gcHJldmlvdXMgZGVjb2RlIGlzIHN1ZmZpY2llbnQKKwkJCSAqIHRvIHNhdGlzZnkgZGVjb2RlIHJlcXVlc3QuICBTa2lwIHRvIHRoZQorCQkJICogc3RhcnQgb2YgdGhlIGRlY29kZWQgc3RyaW5nLCBwbGFjZSBkZWNvZGVkCisJCQkgKiB2YWx1ZXMgaW4gdGhlIG91dHB1dCBidWZmZXIsIGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXNwLT5kZWNfcmVzdGFydCArPSBvY2M7CisJCQlkbyB7CisJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCX0gd2hpbGUgKC0tcmVzaWR1ZSA+IG9jYyk7CisJCQl0cCA9IG9wICsgb2NjOworCQkJZG8geworCQkJCSotLXRwID0gY29kZXAtPnZhbHVlOworCQkJCWNvZGVwID0gY29kZXAtPm5leHQ7CisJCQl9IHdoaWxlICgtLW9jYyk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCS8qCisJCSAqIFJlc2lkdWUgc2F0aXNmaWVzIG9ubHkgcGFydCBvZiB0aGUgZGVjb2RlIHJlcXVlc3QuCisJCSAqLworCQlvcCArPSByZXNpZHVlLCBvY2MgLT0gcmVzaWR1ZTsKKwkJdHAgPSBvcDsKKwkJZG8geworCQkJKi0tdHAgPSBjb2RlcC0+dmFsdWU7CisJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQl9IHdoaWxlICgtLXJlc2lkdWUpOworCQlzcC0+ZGVjX3Jlc3RhcnQgPSAwOworCX0KKworCWJwID0gKHVuc2lnbmVkIGNoYXIgKil0aWYtPnRpZl9yYXdjcDsKKwluYml0cyA9IHNwLT5sendfbmJpdHM7CisJbmV4dGRhdGEgPSBzcC0+bHp3X25leHRkYXRhOworCW5leHRiaXRzID0gc3AtPmx6d19uZXh0Yml0czsKKwluYml0c21hc2sgPSBzcC0+ZGVjX25iaXRzbWFzazsKKwlvbGRjb2RlcCA9IHNwLT5kZWNfb2xkY29kZXA7CisJZnJlZV9lbnRwID0gc3AtPmRlY19mcmVlX2VudHA7CisJbWF4Y29kZXAgPSBzcC0+ZGVjX21heGNvZGVwOworCisJd2hpbGUgKG9jYyA+IDApIHsKKwkJTmV4dENvZGUodGlmLCBzcCwgYnAsIGNvZGUsIEdldE5leHRDb2RlQ29tcGF0KTsKKwkJaWYgKGNvZGUgPT0gQ09ERV9FT0kpCisJCQlicmVhazsKKwkJaWYgKGNvZGUgPT0gQ09ERV9DTEVBUikgeworCQkJZnJlZV9lbnRwID0gc3AtPmRlY19jb2RldGFiICsgQ09ERV9GSVJTVDsKKwkJCV9USUZGbWVtc2V0KGZyZWVfZW50cCwgMCwKKwkJCQkgICAgKENTSVpFIC0gQ09ERV9GSVJTVCkgKiBzaXplb2YgKGNvZGVfdCkpOworCQkJbmJpdHMgPSBCSVRTX01JTjsKKwkJCW5iaXRzbWFzayA9IE1BWENPREUoQklUU19NSU4pOworCQkJbWF4Y29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBuYml0c21hc2s7CisJCQlOZXh0Q29kZSh0aWYsIHNwLCBicCwgY29kZSwgR2V0TmV4dENvZGVDb21wYXQpOworCQkJaWYgKGNvZGUgPT0gQ09ERV9FT0kpCisJCQkJYnJlYWs7CisJCQlpZiAoY29kZSA+PSBDT0RFX0NMRUFSKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkJIkxaV0RlY29kZTogQ29ycnVwdGVkIExaVyB0YWJsZSBhdCBzY2FubGluZSAlZCIsCisJCQkJCSAgICAgdGlmLT50aWZfcm93KTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJKm9wKysgPSBjb2RlLCBvY2MtLTsKKwkJCW9sZGNvZGVwID0gc3AtPmRlY19jb2RldGFiICsgY29kZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvZGVwID0gc3AtPmRlY19jb2RldGFiICsgY29kZTsKKworCQkvKgorCQkgKiBBZGQgdGhlIG5ldyBlbnRyeSB0byB0aGUgY29kZSB0YWJsZS4KKwkJICovCisJCWlmIChmcmVlX2VudHAgPCAmc3AtPmRlY19jb2RldGFiWzBdIHx8CisJCSAgICBmcmVlX2VudHAgPj0gJnNwLT5kZWNfY29kZXRhYltDU0laRV0pIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkNvcnJ1cHRlZCBMWlcgdGFibGUgYXQgc2NhbmxpbmUgJWQiLCB0aWYtPnRpZl9yb3cpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCWZyZWVfZW50cC0+bmV4dCA9IG9sZGNvZGVwOworCQlpZiAoZnJlZV9lbnRwLT5uZXh0IDwgJnNwLT5kZWNfY29kZXRhYlswXSB8fAorCQkgICAgZnJlZV9lbnRwLT5uZXh0ID49ICZzcC0+ZGVjX2NvZGV0YWJbQ1NJWkVdKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJDb3JydXB0ZWQgTFpXIHRhYmxlIGF0IHNjYW5saW5lICVkIiwgdGlmLT50aWZfcm93KTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJZnJlZV9lbnRwLT5maXJzdGNoYXIgPSBmcmVlX2VudHAtPm5leHQtPmZpcnN0Y2hhcjsKKwkJZnJlZV9lbnRwLT5sZW5ndGggPSBmcmVlX2VudHAtPm5leHQtPmxlbmd0aCsxOworCQlmcmVlX2VudHAtPnZhbHVlID0gKGNvZGVwIDwgZnJlZV9lbnRwKSA/CisJCSAgICBjb2RlcC0+Zmlyc3RjaGFyIDogZnJlZV9lbnRwLT5maXJzdGNoYXI7CisJCWlmICgrK2ZyZWVfZW50cCA+IG1heGNvZGVwKSB7CisJCQlpZiAoKytuYml0cyA+IEJJVFNfTUFYKQkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCQluYml0cyA9IEJJVFNfTUFYOworCQkJbmJpdHNtYXNrID0gTUFYQ09ERShuYml0cyk7CisJCQltYXhjb2RlcCA9IHNwLT5kZWNfY29kZXRhYiArIG5iaXRzbWFzazsKKwkJfQorCQlvbGRjb2RlcCA9IGNvZGVwOworCQlpZiAoY29kZSA+PSAyNTYpIHsKKwkJCS8qCisJCQkgKiBDb2RlIG1hcHMgdG8gYSBzdHJpbmcsIGNvcHkgc3RyaW5nCisJCQkgKiB2YWx1ZSB0byBvdXRwdXQgKHdyaXR0ZW4gaW4gcmV2ZXJzZSkuCisJCQkgKi8KKwkJCWlmKGNvZGVwLT5sZW5ndGggPT0gMCkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICJXcm9uZyBsZW5ndGggb2YgZGVjb2RlZCAiCisJCQkJICAgICJzdHJpbmc6IGRhdGEgcHJvYmFibHkgY29ycnVwdGVkIGF0IHNjYW5saW5lICVkIiwKKwkJCQkgICAgdGlmLT50aWZfcm93KTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKGNvZGVwLT5sZW5ndGggPiBvY2MpIHsKKwkJCQkvKgorCQkJCSAqIFN0cmluZyBpcyB0b28gbG9uZyBmb3IgZGVjb2RlIGJ1ZmZlciwKKwkJCQkgKiBsb2NhdGUgcG9ydGlvbiB0aGF0IHdpbGwgZml0LCBjb3B5IHRvCisJCQkJICogdGhlIGRlY29kZSBidWZmZXIsIGFuZCBzZXR1cCByZXN0YXJ0CisJCQkJICogbG9naWMgZm9yIHRoZSBuZXh0IGRlY29kaW5nIGNhbGwuCisJCQkJICovCisJCQkJc3AtPmRlY19jb2RlcCA9IGNvZGVwOworCQkJCWRvIHsKKwkJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCQl9IHdoaWxlIChjb2RlcC0+bGVuZ3RoID4gb2NjKTsKKwkJCQlzcC0+ZGVjX3Jlc3RhcnQgPSBvY2M7CisJCQkJdHAgPSBvcCArIG9jYzsKKwkJCQlkbyAgeworCQkJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKKwkJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCQl9ICB3aGlsZSAoLS1vY2MpOworCQkJCWJyZWFrOworCQkJfQorCQkJYXNzZXJ0KG9jYyA+PSBjb2RlcC0+bGVuZ3RoKTsKKwkJCW9wICs9IGNvZGVwLT5sZW5ndGgsIG9jYyAtPSBjb2RlcC0+bGVuZ3RoOworCQkJdHAgPSBvcDsKKwkJCWRvIHsKKwkJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKKwkJCX0gd2hpbGUoIChjb2RlcCA9IGNvZGVwLT5uZXh0KSAhPSBOVUxMICk7CisJCX0gZWxzZQorCQkJKm9wKysgPSBjb2RlLCBvY2MtLTsKKwl9CisKKwl0aWYtPnRpZl9yYXdjcCA9ICh1aW50OCopIGJwOworCXNwLT5sendfbmJpdHMgPSBuYml0czsKKwlzcC0+bHp3X25leHRkYXRhID0gbmV4dGRhdGE7CisJc3AtPmx6d19uZXh0Yml0cyA9IG5leHRiaXRzOworCXNwLT5kZWNfbmJpdHNtYXNrID0gbmJpdHNtYXNrOworCXNwLT5kZWNfb2xkY29kZXAgPSBvbGRjb2RlcDsKKwlzcC0+ZGVjX2ZyZWVfZW50cCA9IGZyZWVfZW50cDsKKwlzcC0+ZGVjX21heGNvZGVwID0gbWF4Y29kZXA7CisKKwlpZiAob2NjID4gMCkgeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiTm90IGVub3VnaCBkYXRhIGF0IHNjYW5saW5lICVkIChzaG9ydCAlSTY0ZCBieXRlcykiLAorCQkJICAgICB0aWYtPnRpZl9yb3csICh1bnNpZ25lZCBfX2ludDY0KSBvY2MpOworI2Vsc2UKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJOb3QgZW5vdWdoIGRhdGEgYXQgc2NhbmxpbmUgJWQgKHNob3J0ICVsbHUgYnl0ZXMpIiwKKwkJCSAgICAgdGlmLT50aWZfcm93LCAodW5zaWduZWQgbG9uZyBsb25nKSBvY2MpOworI2VuZGlmCisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisjZW5kaWYgLyogTFpXX0NPTVBBVCAqLworCisvKgorICogTFpXIEVuY29kaW5nLgorICovCisKK3N0YXRpYyBpbnQKK0xaV1NldHVwRW5jb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMWldTZXR1cEVuY29kZSI7CisJTFpXQ29kZWNTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlzcC0+ZW5jX2hhc2h0YWIgPSAoaGFzaF90KikgX1RJRkZtYWxsb2MoSFNJWkUqc2l6ZW9mIChoYXNoX3QpKTsKKwlpZiAoc3AtPmVuY19oYXNodGFiID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIk5vIHNwYWNlIGZvciBMWlcgaGFzaCB0YWJsZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogUmVzZXQgZW5jb2Rpbmcgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK0xaV1ByZUVuY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUxaV0NvZGVjU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwlpZiggc3AtPmVuY19oYXNodGFiID09IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICB0aWYtPnRpZl9zZXR1cGVuY29kZSggdGlmICk7CisgICAgICAgIH0KKworCXNwLT5sendfbmJpdHMgPSBCSVRTX01JTjsKKwlzcC0+bHp3X21heGNvZGUgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKwlzcC0+bHp3X2ZyZWVfZW50ID0gQ09ERV9GSVJTVDsKKwlzcC0+bHp3X25leHRiaXRzID0gMDsKKwlzcC0+bHp3X25leHRkYXRhID0gMDsKKwlzcC0+ZW5jX2NoZWNrcG9pbnQgPSBDSEVDS19HQVA7CisJc3AtPmVuY19yYXRpbyA9IDA7CisJc3AtPmVuY19pbmNvdW50ID0gMDsKKwlzcC0+ZW5jX291dGNvdW50ID0gMDsKKwkvKgorCSAqIFRoZSA0IGhlcmUgaW5zdXJlcyB0aGVyZSBpcyBzcGFjZSBmb3IgMiBtYXgtc2l6ZWQKKwkgKiBjb2RlcyBpbiBMWldFbmNvZGUgYW5kIExaV1Bvc3REZWNvZGUuCisJICovCisJc3AtPmVuY19yYXdsaW1pdCA9IHRpZi0+dGlmX3Jhd2RhdGEgKyB0aWYtPnRpZl9yYXdkYXRhc2l6ZS0xIC0gNDsKKwljbF9oYXNoKHNwKTsJCS8qIGNsZWFyIGhhc2ggdGFibGUgKi8KKwlzcC0+ZW5jX29sZGNvZGUgPSAoaGNvZGVfdCkgLTE7CS8qIGdlbmVyYXRlcyBDT0RFX0NMRUFSIGluIExaV0VuY29kZSAqLworCXJldHVybiAoMSk7Cit9CisKKyNkZWZpbmUJQ0FMQ1JBVElPKHNwLCByYXQpIHsJCQkJCVwKKwlpZiAoaW5jb3VudCA+IDB4MDA3ZmZmZmYpIHsgLyogTkI6IHNoaWZ0IHdpbGwgb3ZlcmZsb3cgKi9cCisJCXJhdCA9IG91dGNvdW50ID4+IDg7CQkJCVwKKwkJcmF0ID0gKHJhdCA9PSAwID8gMHg3ZmZmZmZmZiA6IGluY291bnQvcmF0KTsJXAorCX0gZWxzZQkJCQkJCQlcCisJCXJhdCA9IChpbmNvdW50PDw4KSAvIG91dGNvdW50OwkJCVwKK30KKyNkZWZpbmUJUHV0TmV4dENvZGUob3AsIGMpIHsJCQkJCVwKKwluZXh0ZGF0YSA9IChuZXh0ZGF0YSA8PCBuYml0cykgfCBjOwkJCVwKKwluZXh0Yml0cyArPSBuYml0czsJCQkJCVwKKwkqb3ArKyA9ICh1bnNpZ25lZCBjaGFyKShuZXh0ZGF0YSA+PiAobmV4dGJpdHMtOCkpOwkJXAorCW5leHRiaXRzIC09IDg7CQkJCQkJXAorCWlmIChuZXh0Yml0cyA+PSA4KSB7CQkJCQlcCisJCSpvcCsrID0gKHVuc2lnbmVkIGNoYXIpKG5leHRkYXRhID4+IChuZXh0Yml0cy04KSk7CVwKKwkJbmV4dGJpdHMgLT0gODsJCQkJCVwKKwl9CQkJCQkJCVwKKwlvdXRjb3VudCArPSBuYml0czsJCQkJCVwKK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqCisgKiBVc2VzIGFuIG9wZW4gYWRkcmVzc2luZyBkb3VibGUgaGFzaGluZyAobm8gY2hhaW5pbmcpIG9uIHRoZSAKKyAqIHByZWZpeCBjb2RlL25leHQgY2hhcmFjdGVyIGNvbWJpbmF0aW9uLiAgV2UgZG8gYSB2YXJpYW50IG9mCisgKiBLbnV0aCdzIGFsZ29yaXRobSBEICh2b2wuIDMsIHNlYy4gNi40KSBhbG9uZyB3aXRoIEcuIEtub3R0J3MKKyAqIHJlbGF0aXZlbHktcHJpbWUgc2Vjb25kYXJ5IHByb2JlLiAgSGVyZSwgdGhlIG1vZHVsYXIgZGl2aXNpb24KKyAqIGZpcnN0IHByb2JlIGlzIGdpdmVzIHdheSB0byBhIGZhc3RlciBleGNsdXNpdmUtb3IgbWFuaXB1bGF0aW9uLiAKKyAqIEFsc28gZG8gYmxvY2sgY29tcHJlc3Npb24gd2l0aCBhbiBhZGFwdGl2ZSByZXNldCwgd2hlcmVieSB0aGUKKyAqIGNvZGUgdGFibGUgaXMgY2xlYXJlZCB3aGVuIHRoZSBjb21wcmVzc2lvbiByYXRpbyBkZWNyZWFzZXMsCisgKiBidXQgYWZ0ZXIgdGhlIHRhYmxlIGZpbGxzLiAgVGhlIHZhcmlhYmxlLWxlbmd0aCBvdXRwdXQgY29kZXMKKyAqIGFyZSByZS1zaXplZCBhdCB0aGlzIHBvaW50LCBhbmQgYSBDT0RFX0NMRUFSIGlzIGdlbmVyYXRlZAorICogZm9yIHRoZSBkZWNvZGVyLiAKKyAqLworc3RhdGljIGludAorTFpXRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJcmVnaXN0ZXIgTFpXQ29kZWNTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwlyZWdpc3RlciBsb25nIGZjb2RlOworCXJlZ2lzdGVyIGhhc2hfdCAqaHA7CisJcmVnaXN0ZXIgaW50IGgsIGM7CisJaGNvZGVfdCBlbnQ7CisJbG9uZyBkaXNwOworCWxvbmcgaW5jb3VudCwgb3V0Y291bnQsIGNoZWNrcG9pbnQ7CisJbG9uZyBuZXh0ZGF0YSwgbmV4dGJpdHM7CisJaW50IGZyZWVfZW50LCBtYXhjb2RlLCBuYml0czsKKwl1aW50OCogb3A7CisJdWludDgqIGxpbWl0OworCisJKHZvaWQpIHM7CisJaWYgKHNwID09IE5VTEwpCisJCXJldHVybiAoMCk7CisKKyAgICAgICAgYXNzZXJ0KHNwLT5lbmNfaGFzaHRhYiAhPSBOVUxMKTsKKworCS8qCisJICogTG9hZCBsb2NhbCBzdGF0ZS4KKwkgKi8KKwlpbmNvdW50ID0gc3AtPmVuY19pbmNvdW50OworCW91dGNvdW50ID0gc3AtPmVuY19vdXRjb3VudDsKKwljaGVja3BvaW50ID0gc3AtPmVuY19jaGVja3BvaW50OworCW5leHRkYXRhID0gc3AtPmx6d19uZXh0ZGF0YTsKKwluZXh0Yml0cyA9IHNwLT5sendfbmV4dGJpdHM7CisJZnJlZV9lbnQgPSBzcC0+bHp3X2ZyZWVfZW50OworCW1heGNvZGUgPSBzcC0+bHp3X21heGNvZGU7CisJbmJpdHMgPSBzcC0+bHp3X25iaXRzOworCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJbGltaXQgPSBzcC0+ZW5jX3Jhd2xpbWl0OworCWVudCA9IHNwLT5lbmNfb2xkY29kZTsKKworCWlmIChlbnQgPT0gKGhjb2RlX3QpIC0xICYmIGNjID4gMCkgeworCQkvKgorCQkgKiBOQjogVGhpcyBpcyBzYWZlIGJlY2F1c2UgaXQgY2FuIG9ubHkgaGFwcGVuCisJCSAqICAgICBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpcCB3aGVyZSB3ZSBrbm93IHRoZXJlCisJCSAqICAgICBpcyBzcGFjZSBpbiB0aGUgZGF0YSBidWZmZXIuCisJCSAqLworCQlQdXROZXh0Q29kZShvcCwgQ09ERV9DTEVBUik7CisJCWVudCA9ICpicCsrOyBjYy0tOyBpbmNvdW50Kys7CisJfQorCXdoaWxlIChjYyA+IDApIHsKKwkJYyA9ICpicCsrOyBjYy0tOyBpbmNvdW50Kys7CisJCWZjb2RlID0gKChsb25nKWMgPDwgQklUU19NQVgpICsgZW50OworCQloID0gKGMgPDwgSFNISUZUKSBeIGVudDsJLyogeG9yIGhhc2hpbmcgKi8KKyNpZmRlZiBfV0lORE9XUworCQkvKgorCQkgKiBDaGVjayBoYXNoIGluZGV4IGZvciBhbiBvdmVyZmxvdy4KKwkJICovCisJCWlmIChoID49IEhTSVpFKQorCQkJaCAtPSBIU0laRTsKKyNlbmRpZgorCQlocCA9ICZzcC0+ZW5jX2hhc2h0YWJbaF07CisJCWlmIChocC0+aGFzaCA9PSBmY29kZSkgeworCQkJZW50ID0gaHAtPmNvZGU7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaHAtPmhhc2ggPj0gMCkgeworCQkJLyoKKwkJCSAqIFByaW1hcnkgaGFzaCBmYWlsZWQsIGNoZWNrIHNlY29uZGFyeSBoYXNoLgorCQkJICovCisJCQlkaXNwID0gSFNJWkUgLSBoOworCQkJaWYgKGggPT0gMCkKKwkJCQlkaXNwID0gMTsKKwkJCWRvIHsKKwkJCQkvKgorCQkJCSAqIEF2b2lkIHBvaW50ZXIgYXJpdGhtZXRpYyAnY3V6IG9mCisJCQkJICogd3JhcGFyb3VuZCBwcm9ibGVtcyB3aXRoIHNlZ21lbnRzLgorCQkJCSAqLworCQkJCWlmICgoaCAtPSBkaXNwKSA8IDApCisJCQkJCWggKz0gSFNJWkU7CisJCQkJaHAgPSAmc3AtPmVuY19oYXNodGFiW2hdOworCQkJCWlmIChocC0+aGFzaCA9PSBmY29kZSkgeworCQkJCQllbnQgPSBocC0+Y29kZTsKKwkJCQkJZ290byBoaXQ7CisJCQkJfQorCQkJfSB3aGlsZSAoaHAtPmhhc2ggPj0gMCk7CisJCX0KKwkJLyoKKwkJICogTmV3IGVudHJ5LCBlbWl0IGNvZGUgYW5kIGFkZCB0byB0YWJsZS4KKwkJICovCisJCS8qCisJCSAqIFZlcmlmeSB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvciB0aGUgY29kZQorCQkgKiBhbmQgYW55IHBvdGVudGlhbCBDbGVhciBjb2RlIHRoYXQgbWlnaHQgYmUgZW1pdHRlZAorCQkgKiBiZWxvdy4gIFRoZSB2YWx1ZSBvZiBsaW1pdCBpcyBzZXR1cCBzbyB0aGF0IHRoZXJlCisJCSAqIGFyZSBhdCBsZWFzdCA0IGJ5dGVzIGZyZWUtLXJvb20gZm9yIDIgY29kZXMuCisJCSAqLworCQlpZiAob3AgPiBsaW1pdCkgeworCQkJdGlmLT50aWZfcmF3Y2MgPSAodG1zaXplX3QpKG9wIC0gdGlmLT50aWZfcmF3ZGF0YSk7CisJCQlUSUZGRmx1c2hEYXRhMSh0aWYpOworCQkJb3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCQl9CisJCVB1dE5leHRDb2RlKG9wLCBlbnQpOworCQllbnQgPSBjOworCQlocC0+Y29kZSA9IGZyZWVfZW50Kys7CisJCWhwLT5oYXNoID0gZmNvZGU7CisJCWlmIChmcmVlX2VudCA9PSBDT0RFX01BWC0xKSB7CisJCQkvKiB0YWJsZSBpcyBmdWxsLCBlbWl0IGNsZWFyIGNvZGUgYW5kIHJlc2V0ICovCisJCQljbF9oYXNoKHNwKTsKKwkJCXNwLT5lbmNfcmF0aW8gPSAwOworCQkJaW5jb3VudCA9IDA7CisJCQlvdXRjb3VudCA9IDA7CisJCQlmcmVlX2VudCA9IENPREVfRklSU1Q7CisJCQlQdXROZXh0Q29kZShvcCwgQ09ERV9DTEVBUik7CisJCQluYml0cyA9IEJJVFNfTUlOOworCQkJbWF4Y29kZSA9IE1BWENPREUoQklUU19NSU4pOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IGVudHJ5IGlzIGdvaW5nIHRvIGJlIHRvbyBiaWcgZm9yCisJCQkgKiB0aGUgY29kZSBzaXplLCB0aGVuIGluY3JlYXNlIGl0LCBpZiBwb3NzaWJsZS4KKwkJCSAqLworCQkJaWYgKGZyZWVfZW50ID4gbWF4Y29kZSkgeworCQkJCW5iaXRzKys7CisJCQkJYXNzZXJ0KG5iaXRzIDw9IEJJVFNfTUFYKTsKKwkJCQltYXhjb2RlID0gKGludCkgTUFYQ09ERShuYml0cyk7CisJCQl9IGVsc2UgaWYgKGluY291bnQgPj0gY2hlY2twb2ludCkgeworCQkJCWxvbmcgcmF0OworCQkJCS8qCisJCQkJICogQ2hlY2sgY29tcHJlc3Npb24gcmF0aW8gYW5kLCBpZiB0aGluZ3Mgc2VlbQorCQkJCSAqIHRvIGJlIHNsaXBwaW5nLCBjbGVhciB0aGUgaGFzaCB0YWJsZSBhbmQKKwkJCQkgKiByZXNldCBzdGF0ZS4gIFRoZSBjb21wcmVzc2lvbiByYXRpbyBpcyBhCisJCQkJICogMjQrOC1iaXQgZnJhY3Rpb25hbCBudW1iZXIuCisJCQkJICovCisJCQkJY2hlY2twb2ludCA9IGluY291bnQrQ0hFQ0tfR0FQOworCQkJCUNBTENSQVRJTyhzcCwgcmF0KTsKKwkJCQlpZiAocmF0IDw9IHNwLT5lbmNfcmF0aW8pIHsKKwkJCQkJY2xfaGFzaChzcCk7CisJCQkJCXNwLT5lbmNfcmF0aW8gPSAwOworCQkJCQlpbmNvdW50ID0gMDsKKwkJCQkJb3V0Y291bnQgPSAwOworCQkJCQlmcmVlX2VudCA9IENPREVfRklSU1Q7CisJCQkJCVB1dE5leHRDb2RlKG9wLCBDT0RFX0NMRUFSKTsKKwkJCQkJbmJpdHMgPSBCSVRTX01JTjsKKwkJCQkJbWF4Y29kZSA9IE1BWENPREUoQklUU19NSU4pOworCQkJCX0gZWxzZQorCQkJCQlzcC0+ZW5jX3JhdGlvID0gcmF0OworCQkJfQorCQl9CisJaGl0OgorCQk7CisJfQorCisJLyoKKwkgKiBSZXN0b3JlIGdsb2JhbCBzdGF0ZS4KKwkgKi8KKwlzcC0+ZW5jX2luY291bnQgPSBpbmNvdW50OworCXNwLT5lbmNfb3V0Y291bnQgPSBvdXRjb3VudDsKKwlzcC0+ZW5jX2NoZWNrcG9pbnQgPSBjaGVja3BvaW50OworCXNwLT5lbmNfb2xkY29kZSA9IGVudDsKKwlzcC0+bHp3X25leHRkYXRhID0gbmV4dGRhdGE7CisJc3AtPmx6d19uZXh0Yml0cyA9IG5leHRiaXRzOworCXNwLT5sendfZnJlZV9lbnQgPSBmcmVlX2VudDsKKwlzcC0+bHp3X21heGNvZGUgPSBtYXhjb2RlOworCXNwLT5sendfbmJpdHMgPSBuYml0czsKKwl0aWYtPnRpZl9yYXdjcCA9IG9wOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBGaW5pc2ggb2ZmIGFuIGVuY29kZWQgc3RyaXAgYnkgZmx1c2hpbmcgdGhlIGxhc3QKKyAqIHN0cmluZyBhbmQgdGFja2luZyBvbiBhbiBFbmQgT2YgSW5mb3JtYXRpb24gY29kZS4KKyAqLworc3RhdGljIGludAorTFpXUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJcmVnaXN0ZXIgTFpXQ29kZWNTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwl1aW50OCogb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwlsb25nIG5leHRiaXRzID0gc3AtPmx6d19uZXh0Yml0czsKKwlsb25nIG5leHRkYXRhID0gc3AtPmx6d19uZXh0ZGF0YTsKKwlsb25nIG91dGNvdW50ID0gc3AtPmVuY19vdXRjb3VudDsKKwlpbnQgbmJpdHMgPSBzcC0+bHp3X25iaXRzOworCisJaWYgKG9wID4gc3AtPmVuY19yYXdsaW1pdCkgeworCQl0aWYtPnRpZl9yYXdjYyA9ICh0bXNpemVfdCkob3AgLSB0aWYtPnRpZl9yYXdkYXRhKTsKKwkJVElGRkZsdXNoRGF0YTEodGlmKTsKKwkJb3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCX0KKwlpZiAoc3AtPmVuY19vbGRjb2RlICE9IChoY29kZV90KSAtMSkgeworCQlQdXROZXh0Q29kZShvcCwgc3AtPmVuY19vbGRjb2RlKTsKKwkJc3AtPmVuY19vbGRjb2RlID0gKGhjb2RlX3QpIC0xOworCX0KKwlQdXROZXh0Q29kZShvcCwgQ09ERV9FT0kpOworCWlmIChuZXh0Yml0cyA+IDApIAorCQkqb3ArKyA9ICh1bnNpZ25lZCBjaGFyKShuZXh0ZGF0YSA8PCAoOC1uZXh0Yml0cykpOworCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KShvcCAtIHRpZi0+dGlmX3Jhd2RhdGEpOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBSZXNldCBlbmNvZGluZyBoYXNoIHRhYmxlLgorICovCitzdGF0aWMgdm9pZAorY2xfaGFzaChMWldDb2RlY1N0YXRlKiBzcCkKK3sKKwlyZWdpc3RlciBoYXNoX3QgKmhwID0gJnNwLT5lbmNfaGFzaHRhYltIU0laRS0xXTsKKwlyZWdpc3RlciBsb25nIGkgPSBIU0laRS04OworCisJZG8geworCQlpIC09IDg7CisJCWhwWy03XS5oYXNoID0gLTE7CisJCWhwWy02XS5oYXNoID0gLTE7CisJCWhwWy01XS5oYXNoID0gLTE7CisJCWhwWy00XS5oYXNoID0gLTE7CisJCWhwWy0zXS5oYXNoID0gLTE7CisJCWhwWy0yXS5oYXNoID0gLTE7CisJCWhwWy0xXS5oYXNoID0gLTE7CisJCWhwWyAwXS5oYXNoID0gLTE7CisJCWhwIC09IDg7CisJfSB3aGlsZSAoaSA+PSAwKTsKKwlmb3IgKGkgKz0gODsgaSA+IDA7IGktLSwgaHAtLSkKKwkJaHAtPmhhc2ggPSAtMTsKK30KKworc3RhdGljIHZvaWQKK0xaV0NsZWFudXAoVElGRiogdGlmKQoreworCSh2b2lkKVRJRkZQcmVkaWN0b3JDbGVhbnVwKHRpZik7CisKKwlhc3NlcnQodGlmLT50aWZfZGF0YSAhPSAwKTsKKworCWlmIChEZWNvZGVyU3RhdGUodGlmKS0+ZGVjX2NvZGV0YWIpCisJCV9USUZGZnJlZShEZWNvZGVyU3RhdGUodGlmKS0+ZGVjX2NvZGV0YWIpOworCisJaWYgKEVuY29kZXJTdGF0ZSh0aWYpLT5lbmNfaGFzaHRhYikKKwkJX1RJRkZmcmVlKEVuY29kZXJTdGF0ZSh0aWYpLT5lbmNfaGFzaHRhYik7CisKKwlfVElGRmZyZWUodGlmLT50aWZfZGF0YSk7CisJdGlmLT50aWZfZGF0YSA9IE5VTEw7CisKKwlfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKHRpZik7Cit9CisKK2ludAorVElGRkluaXRMWlcoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZJbml0TFpXIjsKKwlhc3NlcnQoc2NoZW1lID09IENPTVBSRVNTSU9OX0xaVyk7CisJLyoKKwkgKiBBbGxvY2F0ZSBzdGF0ZSBibG9jayBzbyB0YWcgbWV0aG9kcyBoYXZlIHN0b3JhZ2UgdG8gcmVjb3JkIHZhbHVlcy4KKwkgKi8KKwl0aWYtPnRpZl9kYXRhID0gKHVpbnQ4KikgX1RJRkZtYWxsb2Moc2l6ZW9mIChMWldDb2RlY1N0YXRlKSk7CisJaWYgKHRpZi0+dGlmX2RhdGEgPT0gTlVMTCkKKwkJZ290byBiYWQ7CisJRGVjb2RlclN0YXRlKHRpZiktPmRlY19jb2RldGFiID0gTlVMTDsKKwlEZWNvZGVyU3RhdGUodGlmKS0+ZGVjX2RlY29kZSA9IE5VTEw7CisJRW5jb2RlclN0YXRlKHRpZiktPmVuY19oYXNodGFiID0gTlVMTDsKKyAgICAgICAgTFpXU3RhdGUodGlmKS0+cndfbW9kZSA9IHRpZi0+dGlmX21vZGU7CisKKwkvKgorCSAqIEluc3RhbGwgY29kZWMgbWV0aG9kcy4KKwkgKi8KKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBMWldGaXh1cFRhZ3M7IAorCXRpZi0+dGlmX3NldHVwZGVjb2RlID0gTFpXU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfcHJlZGVjb2RlID0gTFpXUHJlRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXJvdyA9IExaV0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IExaV0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gTFpXRGVjb2RlOworCXRpZi0+dGlmX3NldHVwZW5jb2RlID0gTFpXU2V0dXBFbmNvZGU7CisJdGlmLT50aWZfcHJlZW5jb2RlID0gTFpXUHJlRW5jb2RlOworCXRpZi0+dGlmX3Bvc3RlbmNvZGUgPSBMWldQb3N0RW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXJvdyA9IExaV0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IExaV0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gTFpXRW5jb2RlOworCXRpZi0+dGlmX2NsZWFudXAgPSBMWldDbGVhbnVwOworCS8qCisJICogU2V0dXAgcHJlZGljdG9yIHNldHVwLgorCSAqLworCSh2b2lkKSBUSUZGUHJlZGljdG9ySW5pdCh0aWYpOworCXJldHVybiAoMSk7CitiYWQ6CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgCisJCSAgICAgIk5vIHNwYWNlIGZvciBMWlcgc3RhdGUgYmxvY2siKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg1LCAxOTg2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEphbWVzIEEuIFdvb2RzLCBkZXJpdmVkIGZyb20gb3JpZ2luYWwgd29yayBieSBTcGVuY2VyIFRob21hcworICogYW5kIEpvc2VwaCBPcm9zdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNlbmRpZiAvKiBMWldfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9uZXh0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9uZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0ZmVjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX25leHQuYwpAQCAtMCwwICsxLDE2MiBAQAorLyogJElkOiB0aWZfbmV4dC5jLHYgMS4xMyAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIE5FWFRfU1VQUE9SVAorLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBOZVhUIDItYml0IEdyZXkgU2NhbGUgQ29tcHJlc3Npb24gQWxnb3JpdGhtIFN1cHBvcnQKKyAqLworCisjZGVmaW5lIFNFVFBJWEVMKG9wLCB2KSB7CQkJXAorCXN3aXRjaCAobnBpeGVscysrICYgMykgewkJXAorCWNhc2UgMDoJb3BbMF0gID0gKHVuc2lnbmVkIGNoYXIpICgodikgPDwgNik7IGJyZWFrOwlcCisJY2FzZSAxOglvcFswXSB8PSAodikgPDwgNDsgYnJlYWs7CVwKKwljYXNlIDI6CW9wWzBdIHw9ICh2KSA8PCAyOyBicmVhazsJXAorCWNhc2UgMzoJKm9wKysgfD0gKHYpOwkgICBicmVhazsJXAorCX0JCQkJCVwKK30KKworI2RlZmluZSBMSVRFUkFMUk9XCTB4MDAKKyNkZWZpbmUgTElURVJBTFNQQU4JMHg0MAorI2RlZmluZSBXSElURSAgIAkoKDE8PDIpLTEpCisKK3N0YXRpYyBpbnQKK05lWFREZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIk5lWFREZWNvZGUiOworCXVuc2lnbmVkIGNoYXIgKmJwLCAqb3A7CisJdG1zaXplX3QgY2M7CisJdWludDgqIHJvdzsKKwl0bXNpemVfdCBzY2FubGluZSwgbjsKKworCSh2b2lkKSBzOworCS8qCisJICogRWFjaCBzY2FubGluZSBpcyBhc3N1bWVkIHRvIHN0YXJ0IG9mZiBhcyBhbGwKKwkgKiB3aGl0ZSAod2UgYXNzdW1lIGEgUGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbgorCSAqIG9mIGBgbWluLWlzLWJsYWNrJycpLgorCSAqLworCWZvciAob3AgPSAodW5zaWduZWQgY2hhciopIGJ1ZiwgY2MgPSBvY2M7IGNjLS0gPiAwOykKKwkJKm9wKysgPSAweGZmOworCisJYnAgPSAodW5zaWduZWQgY2hhciAqKXRpZi0+dGlmX3Jhd2NwOworCWNjID0gdGlmLT50aWZfcmF3Y2M7CisJc2NhbmxpbmUgPSB0aWYtPnRpZl9zY2FubGluZXNpemU7CisJaWYgKG9jYyAlIHNjYW5saW5lKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoMCk7CisJfQorCWZvciAocm93ID0gYnVmOyBvY2MgPiAwOyBvY2MgLT0gc2NhbmxpbmUsIHJvdyArPSBzY2FubGluZSkgeworCQluID0gKmJwKyssIGNjLS07CisJCXN3aXRjaCAobikgeworCQljYXNlIExJVEVSQUxST1c6CisJCQkvKgorCQkJICogVGhlIGVudGlyZSBzY2FubGluZSBpcyBnaXZlbiBhcyBsaXRlcmFsIHZhbHVlcy4KKwkJCSAqLworCQkJaWYgKGNjIDwgc2NhbmxpbmUpCisJCQkJZ290byBiYWQ7CisJCQlfVElGRm1lbWNweShyb3csIGJwLCBzY2FubGluZSk7CisJCQlicCArPSBzY2FubGluZTsKKwkJCWNjIC09IHNjYW5saW5lOworCQkJYnJlYWs7CisJCWNhc2UgTElURVJBTFNQQU46IHsKKwkJCXRtc2l6ZV90IG9mZjsKKwkJCS8qCisJCQkgKiBUaGUgc2NhbmxpbmUgaGFzIGEgbGl0ZXJhbCBzcGFuIHRoYXQgYmVnaW5zIGF0IHNvbWUKKwkJCSAqIG9mZnNldC4KKwkJCSAqLworCQkJb2ZmID0gKGJwWzBdICogMjU2KSArIGJwWzFdOworCQkJbiA9IChicFsyXSAqIDI1NikgKyBicFszXTsKKwkJCWlmIChjYyA8IDQrbiB8fCBvZmYrbiA+IHNjYW5saW5lKQorCQkJCWdvdG8gYmFkOworCQkJX1RJRkZtZW1jcHkocm93K29mZiwgYnArNCwgbik7CisJCQlicCArPSA0K247CisJCQljYyAtPSA0K247CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQl1aW50MzIgbnBpeGVscyA9IDAsIGdyZXk7CisJCQl1aW50MzIgaW1hZ2V3aWR0aCA9IHRpZi0+dGlmX2Rpci50ZF9pbWFnZXdpZHRoOworCisJCQkvKgorCQkJICogVGhlIHNjYW5saW5lIGlzIGNvbXBvc2VkIG9mIGEgc2VxdWVuY2Ugb2YgY29uc3RhbnQKKwkJCSAqIGNvbG9yIGBgcnVucycnLiAgV2Ugc2hpZnQgaW50byBgYHJ1biBtb2RlJycgYW5kCisJCQkgKiBpbnRlcnByZXQgYnl0ZXMgYXMgY29kZXMgb2YgdGhlIGZvcm0KKwkJCSAqIDxjb2xvcj48bnBpeGVscz4gdW50aWwgd2UndmUgZmlsbGVkIHRoZSBzY2FubGluZS4KKwkJCSAqLworCQkJb3AgPSByb3c7CisJCQlmb3IgKDs7KSB7CisJCQkJZ3JleSA9ICh1aW50MzIpKChuPj42KSAmIDB4Myk7CisJCQkJbiAmPSAweDNmOworCQkJCS8qCisJCQkJICogRW5zdXJlIHRoZSBydW4gZG9lcyBub3QgZXhjZWVkIHRoZSBzY2FubGluZQorCQkJCSAqIGJvdW5kcywgcG90ZW50aWFsbHkgcmVzdWx0aW5nIGluIGEgc2VjdXJpdHkKKwkJCQkgKiBpc3N1ZS4KKwkJCQkgKi8KKwkJCQl3aGlsZSAobi0tID4gMCAmJiBucGl4ZWxzIDwgaW1hZ2V3aWR0aCkKKwkJCQkJU0VUUElYRUwob3AsIGdyZXkpOworCQkJCWlmIChucGl4ZWxzID49IGltYWdld2lkdGgpCisJCQkJCWJyZWFrOworCQkJCWlmIChjYyA9PSAwKQorCQkJCQlnb3RvIGJhZDsKKwkJCQluID0gKmJwKyssIGNjLS07CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl9CisJfQorCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlyZXR1cm4gKDEpOworYmFkOgorCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJOb3QgZW5vdWdoIGRhdGEgZm9yIHNjYW5saW5lICVsZCIsCisJICAgIChsb25nKSB0aWYtPnRpZl9yb3cpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorVElGRkluaXROZVhUKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwkodm9pZCkgc2NoZW1lOworCXRpZi0+dGlmX2RlY29kZXJvdyA9IE5lWFREZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IE5lWFREZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gTmVYVERlY29kZTsKKwlyZXR1cm4gKDEpOworfQorI2VuZGlmIC8qIE5FWFRfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9vanBlZy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfb2pwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQ0ZjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfb2pwZWcuYwpAQCAtMCwwICsxLDI1MDYgQEAKKy8qICRJZDogdGlmX29qcGVnLmMsdiAxLjU2IDIwMTItMDUtMjQgMDM6MTU6MTggZndhcm1lcmRhbSBFeHAgJCAqLworCisvKiBXQVJOSU5HOiBUaGUgdHlwZSBvZiBKUEVHIGVuY2Fwc3VsYXRpb24gZGVmaW5lZCBieSB0aGUgVElGRiBWZXJzaW9uIDYuMAorICAgc3BlY2lmaWNhdGlvbiBpcyBub3cgdG90YWxseSBvYnNvbGV0ZSBhbmQgZGVwcmVjYXRlZCBmb3IgbmV3IGFwcGxpY2F0aW9ucyBhbmQKKyAgIGltYWdlcy4gVGhpcyBmaWxlIHdhcyB3YXMgY3JlYXRlZCBzb2xlbHkgaW4gb3JkZXIgdG8gcmVhZCB1bmNvbnZlcnRlZCBpbWFnZXMKKyAgIHN0aWxsIHByZXNlbnQgb24gc29tZSB1c2VycycgY29tcHV0ZXIgc3lzdGVtcy4gSXQgd2lsbCBuZXZlciBiZSBleHRlbmRlZAorICAgdG8gd3JpdGUgc3VjaCBmaWxlcy4gV3JpdGluZyBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2VkIFRJRkZzIGlzIGltcGxlbWVudGVkCisgICBpbiB0aWZfanBlZy5jLgorCisgICBUaGUgY29kZSBpcyBjYXJlZnVsbHkgY3JhZnRlZCB0byByb2J1c3RseSByZWFkIGFsbCBnYXRoZXJlZCBKUEVHLWluLVRJRkYKKyAgIHRlc3RmaWxlcywgYW5kIGFudGljaXBhdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhbGwgb3RoZXIuLi4gQnV0IHN0aWxsLCBpdCBtYXkKKyAgIGZhaWwgb24gc29tZS4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcywgcGxlYXNlIHJlcG9ydCB0aGVtIG9uIHRoZSBUSUZGCisgICBtYWlsaW5nIGxpc3QgYW5kL29yIHRvIEpvcmlzIFZhbiBEYW1tZSA8aW5mb0Bhd2FyZXN5c3RlbXMuYmU+LgorCisgICBQbGVhc2UgcmVhZCB0aGUgZmlsZSBjYWxsZWQgIlRJRkYgVGVjaG5pY2FsIE5vdGUgIzIiIGlmIHlvdSBuZWVkIHRvIGJlCisgICBjb252aW5jZWQgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUgaXMgYmFkIGFuZCBicmVha3MgVElGRi4gVGhhdCBkb2N1bWVudAorICAgaXMgbGlua2VkIHRvIGZyb20gdGhlIExpYlRpZmYgc2l0ZSA8aHR0cDovL3d3dy5yZW1vdGVzZW5zaW5nLm9yZy9saWJ0aWZmLz4KKyAgIGFuZCBmcm9tIEFXYXJlIFN5c3RlbXMnIFRJRkYgc2VjdGlvbgorICAgPGh0dHA6Ly93d3cuYXdhcmVzeXN0ZW1zLmJlL2ltYWdpbmcvdGlmZi5odG1sPi4gSXQgaXMgYWxzbyBhYnNvcmJlZAorICAgaW4gQWRvYmUncyBzcGVjaWZpY2F0aW9uIHN1cHBsZW1lbnRzLCBtYXJrZWQgImRyYWZ0IiB1cCB0byB0aGlzIGRheSwgYnV0CisgICBzdXBwb3J0ZWQgYnkgdGhlIFRJRkYgY29tbXVuaXR5LgorCisgICBUaGlzIGZpbGUgaW50ZXJmYWNlcyB3aXRoIFJlbGVhc2UgNkIgb2YgdGhlIEpQRUcgTGlicmFyeSB3cml0dGVuIGJ5IHRoZQorICAgSW5kZXBlbmRlbnQgSlBFRyBHcm91cC4gUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIHJlcXVpcmVkIGEgaGFjayBpbnNpZGUKKyAgIHRoZSBMaWJKcGVnIGxpYnJhcnkuIFRoaXMgdmVyc2lvbiBubyBsb25nZXIgcmVxdWlyZXMgdGhhdC4gUmVtZW1iZXIgdG8KKyAgIHJlbW92ZSB0aGUgaGFjayBpZiB5b3UgdXBkYXRlIGZyb20gdGhlIG9sZCB2ZXJzaW9uLgorCisgICBDb3B5cmlnaHQgKGMpIEpvcmlzIFZhbiBEYW1tZSA8aW5mb0Bhd2FyZXN5c3RlbXMuYmU+CisgICBDb3B5cmlnaHQgKGMpIEFXYXJlIFN5c3RlbXMgPGh0dHA6Ly93d3cuYXdhcmVzeXN0ZW1zLmJlLz4KKworICAgVGhlIGxpY2VuY2UgYWdyZWVtZW50IGZvciB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIExpYlRpZmYKKyAgIGxpYnJhcnkuCisKKyAgIElOIE5PIEVWRU5UIFNIQUxMIEpPUklTIFZBTiBEQU1NRSBPUiBBV0FSRSBTWVNURU1TIEJFIExJQUJMRSBGT1IKKyAgIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgICBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgICBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgICBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisgICBPRiBUSElTIFNPRlRXQVJFLgorCisgICBKb3JpcyBWYW4gRGFtbWUgYW5kL29yIEFXYXJlIFN5c3RlbXMgbWF5IGJlIGF2YWlsYWJsZSBmb3IgY3VzdG9tCisgICBkZXZlbG9wZW1lbnQuIElmIHlvdSBsaWtlIHdoYXQgeW91IHNlZSwgYW5kIG5lZWQgYW55dGhpbmcgc2ltaWxhciBvciByZWxhdGVkLAorICAgY29udGFjdCA8aW5mb0Bhd2FyZXN5c3RlbXMuYmU+LgorKi8KKworLyogV2hhdCBpcyB3aGF0LCBhbmQgd2hhdCBpcyBub3Q/CisKKyAgIFRoaXMgZGVjb2RlciBzdGFydHMgd2l0aCBhbiBpbnB1dCBzdHJlYW0sIHRoYXQgaXMgZXNzZW50aWFsbHkgdGhlIEpwZWdJbnRlcmNoYW5nZUZvcm1hdAorICAgc3RyZWFtLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbGUgZGF0YSwgaWYgYW55LiBUaGlzIHN0cmVhbSBpcyByZWFkIGluCisgICBPSlBFR1JlYWRCeXRlIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKworICAgSXQgYW5hbHl6ZXMgdGhlIHN0YXJ0IG9mIHRoaXMgc3RyZWFtLCB1bnRpbCBpdCBlbmNvdW50ZXJzIG5vbi1tYXJrZXIgZGF0YSwgaS5lLgorICAgY29tcHJlc3NlZCBpbWFnZSBkYXRhLiBTb21lIG9mIHRoZSBoZWFkZXIgbWFya2VycyBpdCBzZWVzIGhhdmUgbm8gYWN0dWFsIGNvbnRlbnQsCisgICBsaWtlIHRoZSBTT0kgbWFya2VyLCBhbmQgQVBQL0NPTSBtYXJrZXJzIHRoYXQgcmVhbGx5IHNob3VsZG4ndCBldmVuIGJlIHRoZXJlLiBTb21lCisgICBvdGhlciBtYXJrZXJzIGRvIGhhdmUgY29udGVudCwgYW5kIHRoZSB2YWx1YWJsZSBiaXRzIGFuZCBwaWVjZXMgb2YgaW5mb3JtYXRpb24KKyAgIGluIHRoZXNlIG1hcmtlcnMgYXJlIHNhdmVkLCBjaGVja2luZyBhbGwgdG8gdmVyaWZ5IHRoYXQgdGhlIHN0cmVhbSBpcyBtb3JlIG9yCisgICBsZXNzIHdpdGhpbiBleHBlY3RlZCBib3VuZHMuIFRoaXMgaGFwcGVucyBpbnNpZGUgdGhlIE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1YeHgKKyAgIGZ1bmN0aW9ucy4KKworICAgU29tZSBPSlBFRyBpbWFnZXJ5IGNvbnRhaW5zIG5vIHZhbGlkIEpQRUcgaGVhZGVyIG1hcmtlcnMuIFRoaXMgc2l0dWF0aW9uIGlzIHBpY2tlZAorICAgdXAgb24gaWYgd2UndmUgc2VlbiBubyBTT0YgbWFya2VyIHdoZW4gd2UncmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb21wcmVzc2VkIGltYWdlCisgICBkYXRhLiBJbiB0aGlzIGNhc2UsIHRoZSB0YWJsZXMgYXJlIHJlYWQgZnJvbSBKcGVnWHh4VGFibGVzIHRhZ3MsIGFuZCB0aGUgb3RoZXIKKyAgIGJpdHMgYW5kIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpcyBpbml0aWFsaXplZCB0byBpdHMgbW9zdCBiYXNpYyB2YWx1ZS4gVGhpcyBpcworICAgaW1wbGVtZW50ZWQgaW4gdGhlIE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNYeHggZnVuY3Rpb25zLgorCisgICBXaGVuIHRoaXMgaXMgY29tcGxldGUsIGEgZ29vZCBhbmQgdmFsaWQgSlBFRyBoZWFkZXIgY2FuIGJlIGFzc2VtYmxlZCwgYW5kIHRoaXMgaXMKKyAgIHBhc3NlZCB0aHJvdWdoIHRvIExpYkpwZWcuIFdoZW4gdGhhdCdzIGRvbmUsIHRoZSByZW1haW5kZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgaS5lLgorICAgdGhlIGNvbXByZXNzZWQgaW1hZ2UgZGF0YSwgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZC4gVGhpcyBpcyBkb25lIGluCisgICBPSlBFR1dyaXRlU3RyZWFtIGZ1bmN0aW9ucy4KKworICAgTGliVGlmZiByaWdodGx5IGV4cGVjdHMgdG8ga25vdyB0aGUgc3Vic2FtcGxpbmcgdmFsdWVzIGJlZm9yZSBkZWNvbXByZXNzaW9uLiBKdXN0IGxpa2UKKyAgIGluIG5ldy1zdHlsZSBKUEVHLWluLVRJRkYsIHRob3VnaCwgb3IgZXZlbiBtb3JlIHNvLCBhY3R1YWxseSwgdGhlIFlDYkNyc3Vic2FtcGxpbmcKKyAgIHRhZyBpcyBub3RvcmlvdXNseSB1bnJlbGlhYmxlLiBUbyBjb3JyZWN0IHRoZXNlIHRhZyB2YWx1ZXMgd2l0aCB0aGUgb25lcyBpbnNpZGUKKyAgIHRoZSBKUEVHIHN0cmVhbSwgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbSBpcyBwcmUtc2Nhbm5lZCBpbgorICAgT0pQRUdTdWJzYW1wbGluZ0NvcnJlY3QsIG1ha2luZyBubyBub3RlIG9mIGFueSBvdGhlciBkYXRhLCByZXBvcnRpbmcgbm8gd2FybmluZ3MKKyAgIG9yIGVycm9ycywgdXAgdG8gdGhlIHBvaW50IHdoZXJlIGVpdGhlciB0aGVzZSB2YWx1ZXMgYXJlIHJlYWQsIG9yIGl0J3MgY2xlYXIgdGhleQorICAgYXJlbid0IHRoZXJlLiBUaGlzIG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgZGF0YSBpcyByZWFkIHR3aWNlLCBidXQgd2UgZmVlbCBzcGVlZAorICAgaW4gY29ycmVjdGluZyB0aGVzZSB2YWx1ZXMgaXMgaW1wb3J0YW50IGVub3VnaCB0byB3YXJyYW50IHRoaXMgc2FjcmlmaWNlLiBBbGx0aG91Z2gKKyAgIHRoZXJlIGlzIGN1cnJlbnRseSBubyBkZWZpbmUgb3Igb3RoZXIgY29uZmlndXJhdGlvbiBtZWNoYW5pc20gdG8gZGlzYWJsZSB0aGlzIGJlaGF2aW91ciwKKyAgIHRoZSBhY3R1YWwgaGVhZGVyIHNjYW5uaW5nIGlzIGJ1aWxkIHRvIHJvYnVzdGx5IHJlc3BvbmQgd2l0aCBlcnJvciByZXBvcnQgaWYgaXQKKyAgIHNob3VsZCBlbmNvdW50ZXIgYW4gdW5jb3JyZWN0ZWQgbWlzbWF0Y2ggb2Ygc3Vic2FtcGxpbmcgdmFsdWVzLiBTZWUKKyAgIE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1Tb2YuCisKKyAgIFRoZSByZXN0YXJ0IGludGVydmFsIGFuZCByZXN0YXJ0IG1hcmtlcnMgYXJlIHRoZSBtb3N0IHRyaWNreSBwYXJ0Li4uIFRoZSByZXN0YXJ0CisgICBpbnRlcnZhbCBjYW4gYmUgc3BlY2lmaWVkIGluIGEgdGFnLiBJdCBjYW4gYWxzbyBiZSBzZXQgaW5zaWRlIHRoZSBpbnB1dCBKUEVHIHN0cmVhbS4KKyAgIEl0IGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgaW5wdXQgSlBFRyBzdHJlYW0uIElmIHJlYWRpbmcgZnJvbSBzdHJpbGUgZGF0YSwgd2UndmUKKyAgIGNvbnNpc3Rlbmx5IGRpc2NvdmVyZWQgdGhlIG5lZWQgdG8gaW5zZXJ0IHJlc3RhcnQgbWFya2VycyBpbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQKKyAgIHN0cmlsZXMsIGFzIGlzIGFsc28gcHJvYmFibHkgdGhlIG1vc3QgbGlrZWx5IGludGVycHJldGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBUSUZGIDYuMAorICAgc3BlY2lmaWNhdGlvbi4gV2l0aCBhbGwgdGhpcyBzZXR0aW5nIG9mIGludGVydmFsLCBhbmQgYWN0dWFsIHVzZSBvZiBtYXJrZXJzIHRoYXQgaXMgbm90CisgICBwcmVkaWN0YWJsZSBhdCB0aGUgdGltZSBvZiB2YWxpZCBKUEVHIGhlYWRlciBhc3NlbWJseSwgdGhlIHJlc3RhcnQgdGhpbmcgbWF5IHR1cm4KKyAgIG91dCB0aGUgQWNoaWxsZXMgaGVlbCBvZiB0aGlzIGltcGxlbWVudGF0aW9uLiBGb3J0dW5hdGVseSwgbW9zdCBPSlBFRyB3cml0ZXIgdmVuZG9ycworICAgc3VjY2VlZCBpbiByZWFkaW5nIGJhY2sgd2hhdCB0aGV5IHdyaXRlLCB3aGljaCBtYXkgYmUgdGhlIHJlYXNvbiB3aHkgd2UndmUgYmVlbiBhYmxlCisgICB0byBkaXNjb3ZlciB3YXlzIHRoYXQgc2VlbSB0byB3b3JrLgorCisgICBTb21lIHNwZWNpYWwgcHJvdmlzaW9uIGlzIG1hZGUgZm9yIHBsYW5hcmNvbmZpZyBzZXBhcmF0ZSBPSlBFRyBmaWxlcy4gVGhlc2Ugc2VlbQorICAgdG8gY29uc2lzdGVudGx5IGNvbnRhaW4gaGVhZGVyIGluZm8sIGEgU09TIG1hcmtlciwgYSBwbGFuZSwgU09TIG1hcmtlciwgcGxhbmUsIFNPUywKKyAgIGFuZCBwbGFuZS4gVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBhIHZhbGlkIEpQRUcgY29uZmlndXJhdGlvbiwgd2UgZG9uJ3Qga25vdyBhbmQgZG9uJ3QKKyAgIGNhcmUuIFdlIHdhbnQgTGliVGlmZiB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgcGxhbmVzIGluZGl2aWR1YWxseSwgd2l0aG91dCBodWdlCisgICBidWZmZXJpbmcgaW5zaWRlIExpYkpwZWcsIGFueXdheS4gU28gd2UgY29tcG9zZSBoZWFkZXJzIHRvIGZlZWQgdG8gTGliSnBlZywgaW4gdGhpcworICAgY2FzZSwgdGhhdCBhbGxvdyB1cyB0byBwYXNzIGEgc2luZ2xlIHBsYW5lIHN1Y2ggdGhhdCBMaWJKcGVnIHNlZXMgYSB2YWxpZAorICAgc2luZ2xlLWNoYW5uZWwgSlBFRyBzdHJlYW0uIExvY2F0aW5nIHN1YnNlcXVlbnQgU09TIG1hcmtlcnMsIGFuZCB0aHVzIHN1YnNlcXVlbnQKKyAgIHBsYW5lcywgaXMgZG9uZSBpbnNpZGUgT0pQRUdSZWFkU2Vjb25kYXJ5U29zLgorCisgICBUaGUgYmVuZWZpdCBvZiB0aGUgc2NoZW1lIGlzLi4uIHRoYXQgaXQgd29ya3MsIGJhc2ljYWxseS4gV2Uga25vdyBvZiBubyBvdGhlciB0aGF0CisgICBkb2VzLiBJdCB3b3JrcyB3aXRob3V0IGNoZWNraW5nIHNvZnR3YXJlIHRhZywgb3Igb3RoZXJ3aXNlIGdvaW5nIGFib3V0IHRoaW5ncyBpbiBhbgorICAgT0pQRUcgZmxhdm9yIHNwZWNpZmljIG1hbm5lci4gSW5zdGVhZCwgaXQgaXMgYSBzaW5nbGUgc2NoZW1lLCB0aGF0IGNvdmVycyB0aGUgY2FzZXMKKyAgIHdpdGggYW5kIHdpdGhvdXQgSnBlZ0ludGVyY2hhbmdlRm9ybWF0LCB3aXRoIGFuZCB3aXRob3V0IHN0cmlsZXMsIHdpdGggcGFydCBvZgorICAgdGhlIGhlYWRlciBpbiBKcGVnSW50ZXJjaGFuZ2VGb3JtYXQgYW5kIHJlbWFpbmRlciBpbiBmaXJzdCBzdHJpbGUsIGV0Yy4gSXQgaXMgZm9yZ2l2aW5nCisgICBhbmQgcm9idXN0LCBtYXkgbGlrZWx5IHdvcmsgd2l0aCBPSlBFRyBmbGF2b3JzIHdlJ3ZlIG5vdCBzZWVuIHlldCwgYW5kIG1ha2VzIG1vc3Qgb3V0CisgICBvZiB0aGUgZGF0YS4KKworICAgQW5vdGhlciBuaWNlIHNpZGUtZWZmZWN0IGlzIHRoYXQgYSBjb21wbGV0ZSBKUEVHIHNpbmdsZSB2YWxpZCBzdHJlYW0gaXMgYnVpbGQgaWYKKyAgIHBsYW5hcmNvbmZpZyBpcyBub3Qgc2VwYXJhdGUgKHZhc3QgbWFqb3JpdHkpLiBXZSBtYXkgb25lIGRheSB1c2UgdGhhdCB0byBidWlsZAorICAgY29udmVydGVycyB0byBKUEVHLCBhbmQvb3IgdG8gbmV3LXN0eWxlIEpQRUcgY29tcHJlc3Npb24gaW5zaWRlIFRJRkYuCisKKyAgIEEgZGlzc2FkdmFudGFnZSBpcyB0aGUgbGFjayBvZiByYW5kb20gYWNjZXNzIHRvIHRoZSBpbmRpdmlkdWFsIHN0cmlsZXMuIFRoaXMgaXMgdGhlCisgICByZWFzb24gZm9yIG11Y2ggb2YgdGhlIGNvbXBsaWNhdGVkIHJlc3RhcnQtYW5kLXBvc2l0aW9uIHN0dWZmIGluc2lkZSBPSlBFR1ByZURlY29kZS4KKyAgIEFwcGxpY2F0aW9ucyB3b3VsZCBkbyB3ZWxsIGFjY2Vzc2luZyBhbGwgc3RyaWxlcyBpbiBvcmRlciwgYXMgdGhpcyB3aWxsIHJlc3VsdCBpbgorICAgYSBzaW5nbGUgc2VxdWVudGlhbCBzY2FuIG9mIHRoZSBpbnB1dCBzdHJlYW0sIGFuZCBubyByZXN0YXJ0aW5nIG9mIExpYkpwZWcgZGVjb2RpbmcKKyAgIHNlc3Npb24uCisqLworCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFZDX0VYVFJBTEVBTgorCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIE9KUEVHX1NVUFBPUlQKKworLyogQ29uZmlndXJhdGlvbiBkZWZpbmVzIGhlcmUgYXJlOgorICogSlBFR19FTkNBUF9FWFRFUk5BTDogVGhlIG5vcm1hbCB3YXkgdG8gY2FsbCBsaWJqcGVnLCB1c2VzIGxvbmdqdW1wLiBJbiBzb21lIGVudmlyb25tZW50cywKKyAqIAlsaWtlIGVnIExpYlRpZmZEZWxwaGksIHRoaXMgaXMgbm90IHBvc3NpYmxlLiBGb3IgdGhpcyByZWFzb24sIHRoZSBhY3R1YWwgY2FsbHMgdG8KKyAqIAlsaWJqcGVnLCB3aXRoIGxvbmdqdW1wIHN0dWZmLCBhcmUgZW5jYXBzdWxhdGVkIGluIGRlZGljYXRlZCBmdW5jdGlvbnMuIFdoZW4KKyAqIAlKUEVHX0VOQ0FQX0VYVEVSTkFMIGlzIGRlZmluZWQsIHRoZXNlIGVuY2Fwc3VsYXRpbmcgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBleHRlcm5hbAorICogCXRvIHRoaXMgdW5pdCwgYW5kIGNhbiBiZSBkZWZpbmVkIGVsc2V3aGVyZSB0byB1c2Ugc3R1ZmYgb3RoZXIgdGhlbiBsb25nanVtcC4KKyAqIAlUaGUgZGVmYXVsdCBtb2RlLCB3aXRob3V0IEpQRUdfRU5DQVBfRVhURVJOQUwsIGltcGxlbWVudHMgdGhlIGNhbGwgZW5jYXBzdWxhdG9ycworICogCWhlcmUsIGludGVybmFsbHksIHdpdGggbm9ybWFsIGxvbmdqdW1wLgorICogU0VUSk1QLCBMT05HSk1QLCBKTVBfQlVGOiBPbiBzb21lIG1hY2hpbmVzL2Vudmlyb25tZW50cyBhIGxvbmdqdW1wIGVxdWl2YWxlbnQgaXMKKyAqIAljb252aW5pZW50bHkgYXZhaWxhYmxlLCBidXQgc3RpbGwgaXQgbWF5IGJlIHdvcnRod2hpbGUgdG8gdXNlIF9zZXRqbXAgb3Igc2lnc2V0am1wCisgKiAJaW4gcGxhY2Ugb2YgcGxhaW4gc2V0am1wLiBUaGVzZSBtYWNyb3Mgd2lsbCBtYWtlIGl0IGVhc2llci4gSXQgaXMgdXNlbGVzcworICogCXRvIGZpZGRsZSB3aXRoIHRoZXNlIGlmIHlvdSBkZWZpbmUgSlBFR19FTkNBUF9FWFRFUk5BTC4KKyAqIE9KUEVHX0JVRkZFUjogRGVmaW5lIHRoZSBzaXplIG9mIHRoZSBkZXNpcmVkIGJ1ZmZlciBoZXJlLiBTaG91bGQgYmUgc21hbGwgZW5vdWdoIHNvIGFzIHRvIGd1YXJhbnRlZQorICogCWluc3RhbnQgcHJvY2Vzc2luZywgb3B0aW1hbCBzdHJlYW1pbmcgYW5kIG9wdGltYWwgdXNlIG9mIHByb2Nlc3NvciBjYWNoZSwgYnV0IGFsc28gYmlnCisgKiAJZW5vdWdoIHNvIGFzIHRvIG5vdCByZXN1bHQgaW4gc2lnbmlmaWNhbnQgY2FsbCBvdmVyaGVhZC4gSXQgc2hvdWxkIGJlIGF0IGxlYXN0IGEgZmV3CisgKiAJYnl0ZXMgdG8gYWNjb21vZGF0ZSBzb21lIHN0cnVjdHVyZXMgKHRoaXMgaXMgdmVyaWZpZWQgaW4gYXNzZXJ0cyksIGJ1dCBpdCB3b3VsZCBub3QgYmUKKyAqIAlzZW5zaWJsZSB0byBtYWtlIGl0IHRoaXMgc21hbGwgYW55d2F5LCBhbmQgaXQgc2hvdWxkIGJlIGF0IG1vc3QgNjRLIHNpbmNlIGl0IGlzIGluZGV4ZWQKKyAqIAl3aXRoIHVpbnQxNi4gV2UgcmVjb21tZW5kIDJLLgorICogRUdZUFRJQU5XQUxLOiBZb3UgY291bGQgYWxzbyBkZWZpbmUgRUdZUFRJQU5XQUxLIGhlcmUsIGJ1dCBpdCBpcyBub3QgdXNlZCBhbnl3aGVyZSBhbmQgaGFzCisgKiAJYWJzb2x1dGVseSBubyBlZmZlY3QuIFRoYXQgaXMgd2h5IG1vc3QgcGVvcGxlIGluc2lzdCB0aGUgRUdZUFRJQU5XQUxLIGlzIGEgYml0IHNpbGx5LgorICovCisKKy8qIGRlZmluZSBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMICovCisjZGVmaW5lIFNFVEpNUChqYnVmKSBzZXRqbXAoamJ1ZikKKyNkZWZpbmUgTE9OR0pNUChqYnVmLGNvZGUpIGxvbmdqbXAoamJ1Zixjb2RlKQorI2RlZmluZSBKTVBfQlVGIGptcF9idWYKKyNkZWZpbmUgT0pQRUdfQlVGRkVSIDIwNDgKKy8qIGRlZmluZSBFR1lQVElBTldBTEsgKi8KKworI2RlZmluZSBKUEVHX01BUktFUl9TT0YwIDB4QzAKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09GMSAweEMxCisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPRjMgMHhDMworI2RlZmluZSBKUEVHX01BUktFUl9ESFQgMHhDNAorI2RlZmluZSBKUEVHX01BUktFUl9SU1QwIDBYRDAKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09JIDB4RDgKKyNkZWZpbmUgSlBFR19NQVJLRVJfRU9JIDB4RDkKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09TIDB4REEKKyNkZWZpbmUgSlBFR19NQVJLRVJfRFFUIDB4REIKKyNkZWZpbmUgSlBFR19NQVJLRVJfRFJJIDB4REQKKyNkZWZpbmUgSlBFR19NQVJLRVJfQVBQMCAweEUwCisjZGVmaW5lIEpQRUdfTUFSS0VSX0NPTSAweEZFCisKKyNkZWZpbmUgRklFTERfT0pQRUdfSlBFR0lOVEVSQ0hBTkdFRk9STUFUIChGSUVMRF9DT0RFQyswKQorI2RlZmluZSBGSUVMRF9PSlBFR19KUEVHSU5URVJDSEFOR0VGT1JNQVRMRU5HVEggKEZJRUxEX0NPREVDKzEpCisjZGVmaW5lIEZJRUxEX09KUEVHX0pQRUdRVEFCTEVTIChGSUVMRF9DT0RFQysyKQorI2RlZmluZSBGSUVMRF9PSlBFR19KUEVHRENUQUJMRVMgKEZJRUxEX0NPREVDKzMpCisjZGVmaW5lIEZJRUxEX09KUEVHX0pQRUdBQ1RBQkxFUyAoRklFTERfQ09ERUMrNCkKKyNkZWZpbmUgRklFTERfT0pQRUdfSlBFR1BST0MgKEZJRUxEX0NPREVDKzUpCisjZGVmaW5lIEZJRUxEX09KUEVHX0pQRUdSRVNUQVJUSU5URVJWQUwgKEZJRUxEX0NPREVDKzYpCisKK3N0YXRpYyBjb25zdCBUSUZGRmllbGQgb2pwZWdGaWVsZHNbXSA9IHsKKwl7VElGRlRBR19KUEVHSUZPRkZTRVQsMSwxLFRJRkZfTE9ORzgsMCxUSUZGX1NFVEdFVF9VSU5UNjQsVElGRl9TRVRHRVRfVU5ERUZJTkVELEZJRUxEX09KUEVHX0pQRUdJTlRFUkNIQU5HRUZPUk1BVCxUUlVFLEZBTFNFLCJKcGVnSW50ZXJjaGFuZ2VGb3JtYXQiLE5VTEx9LAorCXtUSUZGVEFHX0pQRUdJRkJZVEVDT1VOVCwxLDEsVElGRl9MT05HOCwwLFRJRkZfU0VUR0VUX1VJTlQ2NCxUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR0lOVEVSQ0hBTkdFRk9STUFUTEVOR1RILFRSVUUsRkFMU0UsIkpwZWdJbnRlcmNoYW5nZUZvcm1hdExlbmd0aCIsTlVMTH0sCisJe1RJRkZUQUdfSlBFR1FUQUJMRVMsVElGRl9WQVJJQUJMRTIsVElGRl9WQVJJQUJMRTIsVElGRl9MT05HOCwwLFRJRkZfU0VUR0VUX0MzMl9VSU5UNjQsVElGRl9TRVRHRVRfVU5ERUZJTkVELEZJRUxEX09KUEVHX0pQRUdRVEFCTEVTLEZBTFNFLFRSVUUsIkpwZWdRVGFibGVzIixOVUxMfSwKKwl7VElGRlRBR19KUEVHRENUQUJMRVMsVElGRl9WQVJJQUJMRTIsVElGRl9WQVJJQUJMRTIsVElGRl9MT05HOCwwLFRJRkZfU0VUR0VUX0MzMl9VSU5UNjQsVElGRl9TRVRHRVRfVU5ERUZJTkVELEZJRUxEX09KUEVHX0pQRUdEQ1RBQkxFUyxGQUxTRSxUUlVFLCJKcGVnRGNUYWJsZXMiLE5VTEx9LAorCXtUSUZGVEFHX0pQRUdBQ1RBQkxFUyxUSUZGX1ZBUklBQkxFMixUSUZGX1ZBUklBQkxFMixUSUZGX0xPTkc4LDAsVElGRl9TRVRHRVRfQzMyX1VJTlQ2NCxUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR0FDVEFCTEVTLEZBTFNFLFRSVUUsIkpwZWdBY1RhYmxlcyIsTlVMTH0sCisJe1RJRkZUQUdfSlBFR1BST0MsMSwxLFRJRkZfU0hPUlQsMCxUSUZGX1NFVEdFVF9VSU5UMTYsVElGRl9TRVRHRVRfVU5ERUZJTkVELEZJRUxEX09KUEVHX0pQRUdQUk9DLEZBTFNFLEZBTFNFLCJKcGVnUHJvYyIsTlVMTH0sCisJe1RJRkZUQUdfSlBFR1JFU1RBUlRJTlRFUlZBTCwxLDEsVElGRl9TSE9SVCwwLFRJRkZfU0VUR0VUX1VJTlQxNixUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR1JFU1RBUlRJTlRFUlZBTCxGQUxTRSxGQUxTRSwiSnBlZ1Jlc3RhcnRJbnRlcnZhbCIsTlVMTH0sCit9OworCisjaWZuZGVmIExJQkpQRUdfRU5DQVBfRVhURVJOQUwKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZgorCisvKiBXZSB1bmRlZmluZSBGQVIgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBKUEVHIGRlZmluaXRpb24gKi8KKworI2lmZGVmIEZBUgorI3VuZGVmIEZBUgorI2VuZGlmCisKKy8qCisgIExpYmpwZWcncyBqbW9yZWNmZy5oIGRlZmluZXMgSU5UMTYgYW5kIElOVDMyLCBidXQgb25seSBpZiBYTURfSCBpcworICBub3QgZGVmaW5lZC4gIFVuZm9ydHVuYXRlbHksIHRoZSBNaW5HVyBhbmQgQm9ybGFuZCBjb21waWxlcnMgaW5jbHVkZQorICBhIHR5cGVkZWYgZm9yIElOVDMyLCB3aGljaCBjYXVzZXMgYSBjb25mbGljdC4gIE1TVkMgZG9lcyBub3QgaW5jbHVkZQorICBhIGNvbmZpY3RpbmcgdHlwZWRlZiBnaXZlbiB0aGUgaGVhZGVycyB3aGljaCBhcmUgaW5jbHVkZWQuCisqLworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBkZWZpbmUgWE1EX0ggMQorI2VuZGlmCisKKy8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tLiAqLworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaWZuZGVmIF9fUlBDTkRSX0hfXyAgICAgICAgICAgIC8qIGRvbid0IGNvbmZsaWN0IGlmIHJwY25kci5oIGFscmVhZHkgcmVhZCAqLworICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJvb2xlYW47CisjIGVuZGlmCisjIGRlZmluZSBIQVZFX0JPT0xFQU4gICAgICAgICAgICAvKiBwcmV2ZW50IGptb3JlY2ZnLmggZnJvbSByZWRlZmluaW5nIGl0ICovCisjZW5kaWYKKworI2lmbmRlZiBfRlhfSlBFR19UVVJCT18KKwkjaW5jbHVkZSAiLi4vLi4vbGlianBlZy9qcGVnbGliLmgiCisJI2luY2x1ZGUgIi4uLy4uL2xpYmpwZWcvamVycm9yLmgiCisjZWxzZQorCSNpbmNsdWRlICIuLi8uLi9saWJqcGVnLXR1cmJvL2pwZWdsaWIuaCIKKwkjaW5jbHVkZSAiLi4vLi4vbGlianBlZy10dXJiby9qZXJyb3IuaCIKKyNlbmRpZi8vX0ZYX0pQRUdfVFVSQk9fCisKK3R5cGVkZWYgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGpwZWdfZXJyb3JfbWdyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IGpwZWdfc291cmNlX21nciBqcGVnX3NvdXJjZV9tZ3I7CisKK3R5cGVkZWYgZW51bSB7CisJb3NpYnNOb3RTZXRZZXQsCisJb3NpYnNKcGVnSW50ZXJjaGFuZ2VGb3JtYXQsCisJb3NpYnNTdHJpbGUsCisJb3NpYnNFb2YKK30gT0pQRUdTdGF0ZUluQnVmZmVyU291cmNlOworCit0eXBlZGVmIGVudW0geworCW9zb3NTb2ksCisJb3Nvc1FUYWJsZTAsb3Nvc1FUYWJsZTEsb3Nvc1FUYWJsZTIsb3Nvc1FUYWJsZTMsCisJb3Nvc0RjVGFibGUwLG9zb3NEY1RhYmxlMSxvc29zRGNUYWJsZTIsb3Nvc0RjVGFibGUzLAorCW9zb3NBY1RhYmxlMCxvc29zQWNUYWJsZTEsb3Nvc0FjVGFibGUyLG9zb3NBY1RhYmxlMywKKwlvc29zRHJpLAorCW9zb3NTb2YsCisJb3Nvc1NvcywKKwlvc29zQ29tcHJlc3NlZCwKKwlvc29zUnN0LAorCW9zb3NFb2kKK30gT0pQRUdTdGF0ZU91dFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisJVElGRiogdGlmOworCSNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorCUpNUF9CVUYgZXhpdF9qbXBidWY7CisJI2VuZGlmCisJVElGRlZHZXRNZXRob2QgdmdldHBhcmVudDsKKwlUSUZGVlNldE1ldGhvZCB2c2V0cGFyZW50OworCVRJRkZQcmludE1ldGhvZCBwcmludGRpcjsKKwl1aW50NjQgZmlsZV9zaXplOworCXVpbnQzMiBpbWFnZV93aWR0aDsKKwl1aW50MzIgaW1hZ2VfbGVuZ3RoOworCXVpbnQzMiBzdHJpbGVfd2lkdGg7CisJdWludDMyIHN0cmlsZV9sZW5ndGg7CisJdWludDMyIHN0cmlsZV9sZW5ndGhfdG90YWw7CisJdWludDggc2FtcGxlc19wZXJfcGl4ZWw7CisJdWludDggcGxhbmVfc2FtcGxlX29mZnNldDsKKwl1aW50OCBzYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmU7CisJdWludDY0IGpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0OworCXVpbnQ2NCBqcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg7CisJdWludDgganBlZ19wcm9jOworCXVpbnQ4IHN1YnNhbXBsaW5nY29ycmVjdDsKKwl1aW50OCBzdWJzYW1wbGluZ2NvcnJlY3RfZG9uZTsKKwl1aW50OCBzdWJzYW1wbGluZ190YWc7CisJdWludDggc3Vic2FtcGxpbmdfaG9yOworCXVpbnQ4IHN1YnNhbXBsaW5nX3ZlcjsKKwl1aW50OCBzdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uOworCXVpbnQ4IHF0YWJsZV9vZmZzZXRfY291bnQ7CisJdWludDggZGN0YWJsZV9vZmZzZXRfY291bnQ7CisJdWludDggYWN0YWJsZV9vZmZzZXRfY291bnQ7CisJdWludDY0IHF0YWJsZV9vZmZzZXRbM107CisJdWludDY0IGRjdGFibGVfb2Zmc2V0WzNdOworCXVpbnQ2NCBhY3RhYmxlX29mZnNldFszXTsKKwl1aW50OCogcXRhYmxlWzRdOworCXVpbnQ4KiBkY3RhYmxlWzRdOworCXVpbnQ4KiBhY3RhYmxlWzRdOworCXVpbnQxNiByZXN0YXJ0X2ludGVydmFsOworCXVpbnQ4IHJlc3RhcnRfaW5kZXg7CisJdWludDggc29mX2xvZzsKKwl1aW50OCBzb2ZfbWFya2VyX2lkOworCXVpbnQzMiBzb2ZfeDsKKwl1aW50MzIgc29mX3k7CisJdWludDggc29mX2NbM107CisJdWludDggc29mX2h2WzNdOworCXVpbnQ4IHNvZl90cVszXTsKKwl1aW50OCBzb3NfY3NbM107CisJdWludDggc29zX3RkYVszXTsKKwlzdHJ1Y3QgeworCQl1aW50OCBsb2c7CisJCU9KUEVHU3RhdGVJbkJ1ZmZlclNvdXJjZSBpbl9idWZmZXJfc291cmNlOworCQl1aW50MzIgaW5fYnVmZmVyX25leHRfc3RyaWxlOworCQl1aW50NjQgaW5fYnVmZmVyX2ZpbGVfcG9zOworCQl1aW50NjQgaW5fYnVmZmVyX2ZpbGVfdG9nbzsKKwl9IHNvc19lbmRbM107CisJdWludDggcmVhZGhlYWRlcl9kb25lOworCXVpbnQ4IHdyaXRlaGVhZGVyX2RvbmU7CisJdWludDE2IHdyaXRlX2N1cnNhbXBsZTsKKwl1aW50MzIgd3JpdGVfY3Vyc3RyaWxlOworCXVpbnQ4IGxpYmpwZWdfc2Vzc2lvbl9hY3RpdmU7CisJdWludDggbGlianBlZ19qcGVnX3F1ZXJ5X3N0eWxlOworCWpwZWdfZXJyb3JfbWdyIGxpYmpwZWdfanBlZ19lcnJvcl9tZ3I7CisJanBlZ19kZWNvbXByZXNzX3N0cnVjdCBsaWJqcGVnX2pwZWdfZGVjb21wcmVzc19zdHJ1Y3Q7CisJanBlZ19zb3VyY2VfbWdyIGxpYmpwZWdfanBlZ19zb3VyY2VfbWdyOworCXVpbnQ4IHN1YnNhbXBsaW5nX2NvbnZlcnRfbG9nOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X3lsaW5lbGVuOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X3lsaW5lczsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbjsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7CisJdWludDMyIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWJ1ZmxlbjsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF9jYnVmbGVuOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyYnVmbGVuOworCXVpbnQ4KiBzdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyYnVmOworCXVpbnQ4KiBzdWJzYW1wbGluZ19jb252ZXJ0X3lidWY7CisJdWludDgqIHN1YnNhbXBsaW5nX2NvbnZlcnRfY2JidWY7CisJdWludDgqIHN1YnNhbXBsaW5nX2NvbnZlcnRfY3JidWY7CisJdWludDMyIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZWxlbjsKKwl1aW50OCoqIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZTsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbm91dDsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZTsKKwl1aW50MzIgYnl0ZXNfcGVyX2xpbmU7ICAgLyogaWYgdGhlIGNvZGVjIG91dHB1dHMgc3Vic2FtcGxlZCBkYXRhLCBhICdsaW5lJyBpbiBieXRlc19wZXJfbGluZSAqLworCXVpbnQzMiBsaW5lc19wZXJfc3RyaWxlOyAvKiBhbmQgbGluZXNfcGVyX3N0cmlsZSBtZWFucyBzdWJzYW1wbGluZ192ZXIgZGVzdWJzYW1wbGVkIHJvd3MgICAgICovCisJT0pQRUdTdGF0ZUluQnVmZmVyU291cmNlIGluX2J1ZmZlcl9zb3VyY2U7CisJdWludDMyIGluX2J1ZmZlcl9uZXh0X3N0cmlsZTsKKwl1aW50MzIgaW5fYnVmZmVyX3N0cmlsZV9jb3VudDsKKwl1aW50NjQgaW5fYnVmZmVyX2ZpbGVfcG9zOworCXVpbnQ4IGluX2J1ZmZlcl9maWxlX3Bvc19sb2c7CisJdWludDY0IGluX2J1ZmZlcl9maWxlX3RvZ287CisJdWludDE2IGluX2J1ZmZlcl90b2dvOworCXVpbnQ4KiBpbl9idWZmZXJfY3VyOworCXVpbnQ4IGluX2J1ZmZlcltPSlBFR19CVUZGRVJdOworCU9KUEVHU3RhdGVPdXRTdGF0ZSBvdXRfc3RhdGU7CisJdWludDggb3V0X2J1ZmZlcltPSlBFR19CVUZGRVJdOworCXVpbnQ4KiBza2lwX2J1ZmZlcjsKK30gT0pQRUdTdGF0ZTsKKworc3RhdGljIGludCBPSlBFR1ZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApOworc3RhdGljIGludCBPSlBFR1ZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApOworc3RhdGljIHZvaWQgT0pQRUdQcmludERpcihUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKTsKKworc3RhdGljIGludCBPSlBFR0ZpeHVwVGFncyhUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1NldHVwRGVjb2RlKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUHJlRGVjb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpOworc3RhdGljIGludCBPSlBFR1ByZURlY29kZVNraXBSYXcoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdQcmVEZWNvZGVTa2lwU2NhbmxpbmVzKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgT0pQRUdEZWNvZGVSYXcoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IE9KUEVHRGVjb2RlU2NhbmxpbmVzKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgT0pQRUdQb3N0RGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworc3RhdGljIGludCBPSlBFR1NldHVwRW5jb2RlKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUHJlRW5jb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpOworc3RhdGljIGludCBPSlBFR0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IE9KUEVHUG9zdEVuY29kZShUSUZGKiB0aWYpOworc3RhdGljIHZvaWQgT0pQRUdDbGVhbnVwKFRJRkYqIHRpZik7CisKK3N0YXRpYyB2b2lkIE9KUEVHU3Vic2FtcGxpbmdDb3JyZWN0KFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm8oVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkU2Vjb25kYXJ5U29zKFRJRkYqIHRpZiwgdWludDE2IHMpOworc3RhdGljIGludCBPSlBFR1dyaXRlSGVhZGVySW5mbyhUSUZGKiB0aWYpOworc3RhdGljIHZvaWQgT0pQRUdMaWJqcGVnU2Vzc2lvbkFib3J0KFRJRkYqIHRpZik7CisKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mb1NlYyhUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHJpKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1EcXQoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURodChUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29mKFRJRkYqIHRpZiwgdWludDggbWFya2VyX2lkKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvcyhUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzUVRhYmxlKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNEY1RhYmxlKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNBY1RhYmxlKFRJRkYqIHRpZik7CisKK3N0YXRpYyBpbnQgT0pQRUdSZWFkQnVmZmVyRmlsbChPSlBFR1N0YXRlKiBzcCk7CitzdGF0aWMgaW50IE9KUEVHUmVhZEJ5dGUoT0pQRUdTdGF0ZSogc3AsIHVpbnQ4KiBieXRlKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkQnl0ZVBlZWsoT0pQRUdTdGF0ZSogc3AsIHVpbnQ4KiBieXRlKTsKK3N0YXRpYyB2b2lkIE9KUEVHUmVhZEJ5dGVBZHZhbmNlKE9KUEVHU3RhdGUqIHNwKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkV29yZChPSlBFR1N0YXRlKiBzcCwgdWludDE2KiB3b3JkKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkQmxvY2soT0pQRUdTdGF0ZSogc3AsIHVpbnQxNiBsZW4sIHZvaWQqIG1lbSk7CitzdGF0aWMgdm9pZCBPSlBFR1JlYWRTa2lwKE9KUEVHU3RhdGUqIHNwLCB1aW50MTYgbGVuKTsKKworc3RhdGljIGludCBPSlBFR1dyaXRlU3RyZWFtKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbVNvaShUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKTsKK3N0YXRpYyB2b2lkIE9KUEVHV3JpdGVTdHJlYW1RVGFibGUoVElGRiogdGlmLCB1aW50OCB0YWJsZV9pbmRleCwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbURjVGFibGUoVElGRiogdGlmLCB1aW50OCB0YWJsZV9pbmRleCwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbUFjVGFibGUoVElGRiogdGlmLCB1aW50OCB0YWJsZV9pbmRleCwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbURyaShUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKTsKK3N0YXRpYyB2b2lkIE9KUEVHV3JpdGVTdHJlYW1Tb2YoVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgdm9pZCBPSlBFR1dyaXRlU3RyZWFtU29zKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIGludCBPSlBFR1dyaXRlU3RyZWFtQ29tcHJlc3NlZChUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKTsKK3N0YXRpYyB2b2lkIE9KUEVHV3JpdGVTdHJlYW1Sc3QoVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgdm9pZCBPSlBFR1dyaXRlU3RyZWFtRW9pKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworCisjaWZkZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorZXh0ZXJuIGludCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbyk7CitleHRlcm4gaW50IGpwZWdfcmVhZF9oZWFkZXJfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB1aW50OCByZXF1aXJlX2ltYWdlKTsKK2V4dGVybiBpbnQganBlZ19zdGFydF9kZWNvbXByZXNzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbyk7CitleHRlcm4gaW50IGpwZWdfcmVhZF9zY2FubGluZXNfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB2b2lkKiBzY2FubGluZXMsIHVpbnQzMiBtYXhfbGluZXMpOworZXh0ZXJuIGludCBqcGVnX3JlYWRfcmF3X2RhdGFfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB2b2lkKiBkYXRhLCB1aW50MzIgbWF4X2xpbmVzKTsKK2V4dGVybiB2b2lkIGpwZWdfZW5jYXBfdW53aW5kKFRJRkYqIHRpZik7CisjZWxzZQorc3RhdGljIGludCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBqKTsKK3N0YXRpYyBpbnQganBlZ19yZWFkX2hlYWRlcl9lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHVpbnQ4IHJlcXVpcmVfaW1hZ2UpOworc3RhdGljIGludCBqcGVnX3N0YXJ0X2RlY29tcHJlc3NfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvKTsKK3N0YXRpYyBpbnQganBlZ19yZWFkX3NjYW5saW5lc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHZvaWQqIHNjYW5saW5lcywgdWludDMyIG1heF9saW5lcyk7CitzdGF0aWMgaW50IGpwZWdfcmVhZF9yYXdfZGF0YV9lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHZvaWQqIGRhdGEsIHVpbnQzMiBtYXhfbGluZXMpOworc3RhdGljIHZvaWQganBlZ19lbmNhcF91bndpbmQoVElGRiogdGlmKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBPSlBFR0xpYmpwZWdKcGVnRXJyb3JNZ3JPdXRwdXRNZXNzYWdlKGpwZWdfY29tbW9uX3N0cnVjdCogY2luZm8pOworc3RhdGljIHZvaWQgT0pQRUdMaWJqcGVnSnBlZ0Vycm9yTWdyRXJyb3JFeGl0KGpwZWdfY29tbW9uX3N0cnVjdCogY2luZm8pOworc3RhdGljIHZvaWQgT0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nckluaXRTb3VyY2UoanBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pOworc3RhdGljIGJvb2xlYW4gT0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nckZpbGxJbnB1dEJ1ZmZlcihqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbyk7CitzdGF0aWMgdm9pZCBPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyU2tpcElucHV0RGF0YShqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgbG9uZyBudW1fYnl0ZXMpOworc3RhdGljIGJvb2xlYW4gT0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclJlc3luY1RvUmVzdGFydChqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgaW50IGRlc2lyZWQpOworc3RhdGljIHZvaWQgT0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclRlcm1Tb3VyY2UoanBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pOworCitpbnQKK1RJRkZJbml0T0pQRUcoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJUSUZGSW5pdE9KUEVHIjsKKwlPSlBFR1N0YXRlKiBzcDsKKworCWFzc2VydChzY2hlbWU9PUNPTVBSRVNTSU9OX09KUEVHKTsKKworICAgICAgICAvKgorCSAqIE1lcmdlIGNvZGVjLXNwZWNpZmljIHRhZyBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBvanBlZ0ZpZWxkcywgVElGRkFycmF5Q291bnQob2pwZWdGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk1lcmdpbmcgT2xkIEpQRUcgY29kZWMtc3BlY2lmaWMgdGFncyBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc3RhdGUgYmxvY2sgKi8KKwlzcCA9IChPSlBFR1N0YXRlKilfVElGRm1hbGxvYyhzaXplb2YoT0pQRUdTdGF0ZSkpOwkJLy8gLy8gYWRkIChPSlBFR1N0YXRlKikgY2FzdAorCWlmIChzcCA9PSBOVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJObyBzcGFjZSBmb3IgT0pQRUcgc3RhdGUgYmxvY2siKTsKKwkJcmV0dXJuKDApOworCX0KKwlfVElGRm1lbXNldChzcCwwLHNpemVvZihPSlBFR1N0YXRlKSk7CisJc3AtPnRpZj10aWY7CisJc3AtPmpwZWdfcHJvYz0xOworCXNwLT5zdWJzYW1wbGluZ19ob3I9MjsKKwlzcC0+c3Vic2FtcGxpbmdfdmVyPTI7CisJVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkcsMiwyKTsKKwkvKiB0aWYgY29kZWMgbWV0aG9kcyAqLworCXRpZi0+dGlmX2ZpeHVwdGFncz1PSlBFR0ZpeHVwVGFnczsgIAorCXRpZi0+dGlmX3NldHVwZGVjb2RlPU9KUEVHU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfcHJlZGVjb2RlPU9KUEVHUHJlRGVjb2RlOworCXRpZi0+dGlmX3Bvc3RkZWNvZGU9T0pQRUdQb3N0RGVjb2RlOyAgCisJdGlmLT50aWZfZGVjb2Rlcm93PU9KUEVHRGVjb2RlOyAgCisJdGlmLT50aWZfZGVjb2Rlc3RyaXA9T0pQRUdEZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGV0aWxlPU9KUEVHRGVjb2RlOyAgCisJdGlmLT50aWZfc2V0dXBlbmNvZGU9T0pQRUdTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGU9T0pQRUdQcmVFbmNvZGU7CisJdGlmLT50aWZfcG9zdGVuY29kZT1PSlBFR1Bvc3RFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93PU9KUEVHRW5jb2RlOyAgCisJdGlmLT50aWZfZW5jb2Rlc3RyaXA9T0pQRUdFbmNvZGU7ICAKKwl0aWYtPnRpZl9lbmNvZGV0aWxlPU9KUEVHRW5jb2RlOyAgCisJdGlmLT50aWZfY2xlYW51cD1PSlBFR0NsZWFudXA7CisJdGlmLT50aWZfZGF0YT0odWludDgqKXNwOworCS8qIHRpZiB0YWcgbWV0aG9kcyAqLworCXNwLT52Z2V0cGFyZW50PXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkPU9KUEVHVkdldEZpZWxkOworCXNwLT52c2V0cGFyZW50PXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkPU9KUEVHVlNldEZpZWxkOworCXNwLT5wcmludGRpcj10aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyOworCXRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXI9T0pQRUdQcmludERpcjsKKwkvKiBTb21lIE9KUEVHIGZpbGVzIGRvbid0IGhhdmUgc3RyaXAgb3IgdGlsZSBvZmZzZXRzIG9yIGJ5dGVjb3VudHMgdGFncy4KKwkgICBTb21lIG90aGVycyBkbywgYnV0IGhhdmUgdG90YWxseSBtZWFuaW5nbGVzcyBvciBjb3JydXB0IHZhbHVlcworCSAgIGluIHRoZXNlIHRhZ3MuIEluIHRoZXNlIGNhc2VzLCB0aGUgSnBlZ0ludGVyY2hhbmdlRm9ybWF0IHN0cmVhbSBpcworCSAgIHJlbGlhYmxlLiBJbiBhbnkgY2FzZSwgdGhpcyBkZWNvZGVyIHJlYWRzIHRoZSBjb21wcmVzc2VkIGRhdGEgaXRzZWxmLAorCSAgIGZyb20gdGhlIG1vc3QgcmVsaWFibGUgbG9jYXRpb25zLCBhbmQgd2UgbmVlZCB0byBub3RpZnkgZW5jYXBzdWxhdGluZworCSAgIExpYlRpZmYgbm90IHRvIHJlYWQgcmF3IHN0cmlwcyBvciB0aWxlcyBmb3IgdXMuICovCisJdGlmLT50aWZfZmxhZ3N8PVRJRkZfTk9SRUFEUkFXOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXN3aXRjaCh0YWcpCisJeworCQljYXNlIFRJRkZUQUdfSlBFR0lGT0ZGU0VUOgorCQkJKnZhX2FyZyhhcCx1aW50NjQqKT0odWludDY0KXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0lGQllURUNPVU5UOgorCQkJKnZhX2FyZyhhcCx1aW50NjQqKT0odWludDY0KXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkc6CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdF9kb25lPT0wKQorCQkJCU9KUEVHU3Vic2FtcGxpbmdDb3JyZWN0KHRpZik7CisJCQkqdmFfYXJnKGFwLHVpbnQxNiopPSh1aW50MTYpc3AtPnN1YnNhbXBsaW5nX2hvcjsKKwkJCSp2YV9hcmcoYXAsdWludDE2Kik9KHVpbnQxNilzcC0+c3Vic2FtcGxpbmdfdmVyOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUVRBQkxFUzoKKwkJCSp2YV9hcmcoYXAsdWludDMyKik9KHVpbnQzMilzcC0+cXRhYmxlX29mZnNldF9jb3VudDsKKwkJCSp2YV9hcmcoYXAsdm9pZCoqKT0odm9pZCopc3AtPnF0YWJsZV9vZmZzZXQ7IAorCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHRENUQUJMRVM6CisJCQkqdmFfYXJnKGFwLHVpbnQzMiopPSh1aW50MzIpc3AtPmRjdGFibGVfb2Zmc2V0X2NvdW50OworCQkJKnZhX2FyZyhhcCx2b2lkKiopPSh2b2lkKilzcC0+ZGN0YWJsZV9vZmZzZXQ7ICAKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0FDVEFCTEVTOgorCQkJKnZhX2FyZyhhcCx1aW50MzIqKT0odWludDMyKXNwLT5hY3RhYmxlX29mZnNldF9jb3VudDsKKwkJCSp2YV9hcmcoYXAsdm9pZCoqKT0odm9pZCopc3AtPmFjdGFibGVfb2Zmc2V0OworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUFJPQzoKKwkJCSp2YV9hcmcoYXAsdWludDE2Kik9KHVpbnQxNilzcC0+anBlZ19wcm9jOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUkVTVEFSVElOVEVSVkFMOgorCQkJKnZhX2FyZyhhcCx1aW50MTYqKT1zcC0+cmVzdGFydF9pbnRlcnZhbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICgqc3AtPnZnZXRwYXJlbnQpKHRpZix0YWcsYXApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1ZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHVlNldEZpZWxkIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MzIgbWE7CisJdWludDY0KiBtYjsKKwl1aW50MzIgbjsKKwlzd2l0Y2godGFnKQorCXsKKwkJY2FzZSBUSUZGVEFHX0pQRUdJRk9GRlNFVDoKKwkJCXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdD0odWludDY0KXZhX2FyZyhhcCx1aW50NjQpOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHSUZCWVRFQ09VTlQ6CisJCQlzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXRfbGVuZ3RoPSh1aW50NjQpdmFfYXJnKGFwLHVpbnQ2NCk7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkc6CisJCQlzcC0+c3Vic2FtcGxpbmdfdGFnPTE7CisJCQlzcC0+c3Vic2FtcGxpbmdfaG9yPSh1aW50OCl2YV9hcmcoYXAsdWludDE2X3ZhcCk7CisJCQlzcC0+c3Vic2FtcGxpbmdfdmVyPSh1aW50OCl2YV9hcmcoYXAsdWludDE2X3ZhcCk7CisJCQl0aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1swXT1zcC0+c3Vic2FtcGxpbmdfaG9yOworCQkJdGlmLT50aWZfZGlyLnRkX3ljYmNyc3Vic2FtcGxpbmdbMV09c3AtPnN1YnNhbXBsaW5nX3ZlcjsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR1FUQUJMRVM6CisJCQltYT0odWludDMyKXZhX2FyZyhhcCx1aW50MzIpOworCQkJaWYgKG1hIT0wKQorCQkJeworCQkJCWlmIChtYT4zKQorCQkJCXsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJKcGVnUVRhYmxlcyB0YWcgaGFzIGluY29ycmVjdCBjb3VudCIpOworCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJCXNwLT5xdGFibGVfb2Zmc2V0X2NvdW50PSh1aW50OCltYTsKKwkJCQltYj0odWludDY0Kil2YV9hcmcoYXAsdWludDY0Kik7CisJCQkJZm9yIChuPTA7IG48bWE7IG4rKykKKwkJCQkJc3AtPnF0YWJsZV9vZmZzZXRbbl09bWJbbl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0pQRUdEQ1RBQkxFUzoKKwkJCW1hPSh1aW50MzIpdmFfYXJnKGFwLHVpbnQzMik7CisJCQlpZiAobWEhPTApCisJCQl7CisJCQkJaWYgKG1hPjMpCisJCQkJeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpwZWdEY1RhYmxlcyB0YWcgaGFzIGluY29ycmVjdCBjb3VudCIpOworCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJCXNwLT5kY3RhYmxlX29mZnNldF9jb3VudD0odWludDgpbWE7CisJCQkJbWI9KHVpbnQ2NCopdmFfYXJnKGFwLHVpbnQ2NCopOworCQkJCWZvciAobj0wOyBuPG1hOyBuKyspCisJCQkJCXNwLT5kY3RhYmxlX29mZnNldFtuXT1tYltuXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0FDVEFCTEVTOgorCQkJbWE9KHVpbnQzMil2YV9hcmcoYXAsdWludDMyKTsKKwkJCWlmIChtYSE9MCkKKwkJCXsKKwkJCQlpZiAobWE+MykKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSnBlZ0FjVGFibGVzIHRhZyBoYXMgaW5jb3JyZWN0IGNvdW50Iik7CisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQkJc3AtPmFjdGFibGVfb2Zmc2V0X2NvdW50PSh1aW50OCltYTsKKwkJCQltYj0odWludDY0Kil2YV9hcmcoYXAsdWludDY0Kik7CisJCQkJZm9yIChuPTA7IG48bWE7IG4rKykKKwkJCQkJc3AtPmFjdGFibGVfb2Zmc2V0W25dPW1iW25dOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUFJPQzoKKwkJCXNwLT5qcGVnX3Byb2M9KHVpbnQ4KXZhX2FyZyhhcCx1aW50MTZfdmFwKTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR1JFU1RBUlRJTlRFUlZBTDoKKwkJCXNwLT5yZXN0YXJ0X2ludGVydmFsPSh1aW50MTYpdmFfYXJnKGFwLHVpbnQxNl92YXApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLHRhZyxhcCk7CisJfQorCVRJRkZTZXRGaWVsZEJpdCh0aWYsVElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKS0+ZmllbGRfYml0KTsKKwl0aWYtPnRpZl9mbGFnc3w9VElGRl9ESVJUWURJUkVDVDsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1ByaW50RGlyKFRJRkYqIHRpZiwgRklMRSogZmQsIGxvbmcgZmxhZ3MpCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDggbTsKKwkodm9pZClmbGFnczsKKwlhc3NlcnQoc3AhPU5VTEwpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdJTlRFUkNIQU5HRUZPUk1BVCkpCisJCWZwcmludGYoZmQsIiAgSnBlZ0ludGVyY2hhbmdlRm9ybWF0OiAiIFRJRkZfVUlOVDY0X0ZPUk1BVCAiXG4iLChUSUZGX1VJTlQ2NF9UKXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdCk7ICAKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PSlBFR19KUEVHSU5URVJDSEFOR0VGT1JNQVRMRU5HVEgpKQorCQlmcHJpbnRmKGZkLCIgIEpwZWdJbnRlcmNoYW5nZUZvcm1hdExlbmd0aDogIiBUSUZGX1VJTlQ2NF9GT1JNQVQgIlxuIiwoVElGRl9VSU5UNjRfVClzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXRfbGVuZ3RoKTsgIAorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdRVEFCTEVTKSkKKwl7CisJCWZwcmludGYoZmQsIiAgSnBlZ1FUYWJsZXM6Iik7CisJCWZvciAobT0wOyBtPHNwLT5xdGFibGVfb2Zmc2V0X2NvdW50OyBtKyspCisJCQlmcHJpbnRmKGZkLCIgIiBUSUZGX1VJTlQ2NF9GT1JNQVQsKFRJRkZfVUlOVDY0X1Qpc3AtPnF0YWJsZV9vZmZzZXRbbV0pOworCQlmcHJpbnRmKGZkLCJcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PSlBFR19KUEVHRENUQUJMRVMpKQorCXsKKwkJZnByaW50ZihmZCwiICBKcGVnRGNUYWJsZXM6Iik7CisJCWZvciAobT0wOyBtPHNwLT5kY3RhYmxlX29mZnNldF9jb3VudDsgbSsrKQorCQkJZnByaW50ZihmZCwiICIgVElGRl9VSU5UNjRfRk9STUFULChUSUZGX1VJTlQ2NF9UKXNwLT5kY3RhYmxlX29mZnNldFttXSk7CisJCWZwcmludGYoZmQsIlxuIik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdBQ1RBQkxFUykpCisJeworCQlmcHJpbnRmKGZkLCIgIEpwZWdBY1RhYmxlczoiKTsKKwkJZm9yIChtPTA7IG08c3AtPmFjdGFibGVfb2Zmc2V0X2NvdW50OyBtKyspCisJCQlmcHJpbnRmKGZkLCIgIiBUSUZGX1VJTlQ2NF9GT1JNQVQsKFRJRkZfVUlOVDY0X1Qpc3AtPmFjdGFibGVfb2Zmc2V0W21dKTsKKwkJZnByaW50ZihmZCwiXG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfT0pQRUdfSlBFR1BST0MpKQorCQlmcHJpbnRmKGZkLCIgIEpwZWdQcm9jOiAldVxuIiwodW5zaWduZWQgaW50KXNwLT5qcGVnX3Byb2MpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdSRVNUQVJUSU5URVJWQUwpKQorCQlmcHJpbnRmKGZkLCIgIEpwZWdSZXN0YXJ0SW50ZXJ2YWw6ICV1XG4iLCh1bnNpZ25lZCBpbnQpc3AtPnJlc3RhcnRfaW50ZXJ2YWwpOworCWlmIChzcC0+cHJpbnRkaXIpCisJCSgqc3AtPnByaW50ZGlyKSh0aWYsIGZkLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdTZXR1cERlY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHU2V0dXBEZWNvZGUiOworCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJEZXByZWNpYXRlZCBhbmQgdHJvdWJsZXNvbWUgb2xkLXN0eWxlIEpQRUcgY29tcHJlc3Npb24gbW9kZSwgcGxlYXNlIGNvbnZlcnQgdG8gbmV3LXN0eWxlIEpQRUcgY29tcHJlc3Npb24gYW5kIG5vdGlmeSB2ZW5kb3Igb2Ygd3JpdGluZyBzb2Z0d2FyZSIpOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdQcmVEZWNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MzIgbTsKKwlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdF9kb25lPT0wKQorCQlPSlBFR1N1YnNhbXBsaW5nQ29ycmVjdCh0aWYpOworCWlmIChzcC0+cmVhZGhlYWRlcl9kb25lPT0wKQorCXsKKwkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm8odGlmKT09MCkKKwkJCXJldHVybigwKTsKKwl9CisJaWYgKHNwLT5zb3NfZW5kW3NdLmxvZz09MCkKKwl7CisJCWlmIChPSlBFR1JlYWRTZWNvbmRhcnlTb3ModGlmLHMpPT0wKQorCQkJcmV0dXJuKDApOworCX0KKwlpZiBpc1RpbGVkKHRpZikKKwkJbT10aWYtPnRpZl9jdXJ0aWxlOworCWVsc2UKKwkJbT10aWYtPnRpZl9jdXJzdHJpcDsKKwlpZiAoKHNwLT53cml0ZWhlYWRlcl9kb25lIT0wKSAmJiAoKHNwLT53cml0ZV9jdXJzYW1wbGUhPXMpIHx8IChzcC0+d3JpdGVfY3Vyc3RyaWxlPm0pKSkKKwl7CisJCWlmIChzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZSE9MCkKKwkJCU9KUEVHTGlianBlZ1Nlc3Npb25BYm9ydCh0aWYpOworCQlzcC0+d3JpdGVoZWFkZXJfZG9uZT0wOworCX0KKwlpZiAoc3AtPndyaXRlaGVhZGVyX2RvbmU9PTApCisJeworCQlzcC0+cGxhbmVfc2FtcGxlX29mZnNldD0odWludDgpczsKKwkJc3AtPndyaXRlX2N1cnNhbXBsZT1zOworCQlzcC0+d3JpdGVfY3Vyc3RyaWxlPXMqdGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlOworCQlpZiAoKHNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPT0wKSB8fAorCQkgICAgKHNwLT5pbl9idWZmZXJfZmlsZV9wb3Mtc3AtPmluX2J1ZmZlcl90b2dvIT1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfZmlsZV9wb3MpKQorCQl7CisJCQlzcC0+aW5fYnVmZmVyX3NvdXJjZT1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfc291cmNlOworCQkJc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZT1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfbmV4dF9zdHJpbGU7CisJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPXNwLT5zb3NfZW5kW3NdLmluX2J1ZmZlcl9maWxlX3BvczsKKwkJCXNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPTA7CisJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfZmlsZV90b2dvOworCQkJc3AtPmluX2J1ZmZlcl90b2dvPTA7CisJCQlzcC0+aW5fYnVmZmVyX2N1cj0wOworCQl9CisJCWlmIChPSlBFR1dyaXRlSGVhZGVySW5mbyh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCX0KKwl3aGlsZSAoc3AtPndyaXRlX2N1cnN0cmlsZTxtKSAgICAgICAgICAKKwl7CisJCWlmIChzcC0+bGlianBlZ19qcGVnX3F1ZXJ5X3N0eWxlPT0wKQorCQl7CisJCQlpZiAoT0pQRUdQcmVEZWNvZGVTa2lwUmF3KHRpZik9PTApCisJCQkJcmV0dXJuKDApOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKE9KUEVHUHJlRGVjb2RlU2tpcFNjYW5saW5lcyh0aWYpPT0wKQorCQkJCXJldHVybigwKTsKKwkJfQorCQlzcC0+d3JpdGVfY3Vyc3RyaWxlKys7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdQcmVEZWNvZGVTa2lwUmF3KFRJRkYqIHRpZikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MzIgbTsKKwltPXNwLT5saW5lc19wZXJfc3RyaWxlOworCWlmIChzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZSE9MCkKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMtc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU+PW0pCisJCXsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlKz1tOworCQkJaWYgKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMpCisJCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU9MDsKKwkJCXJldHVybigxKTsKKwkJfQorCQltLT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMtc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU7CisJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPTA7CisJfQorCXdoaWxlIChtPj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMpCisJeworCQlpZiAoanBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSxzcC0+c3Vic2FtcGxpbmdfdmVyKjgpPT0wKQorCQkJcmV0dXJuKDApOworCQltLT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7CisJfQorCWlmIChtPjApCisJeworCQlpZiAoanBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSxzcC0+c3Vic2FtcGxpbmdfdmVyKjgpPT0wKQorCQkJcmV0dXJuKDApOworCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZT1tOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUHJlRGVjb2RlU2tpcFNjYW5saW5lcyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUHJlRGVjb2RlU2tpcFNjYW5saW5lcyI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDMyIG07CisJaWYgKHNwLT5za2lwX2J1ZmZlcj09TlVMTCkKKwl7CisJCS8vIGFkZCAodWludDgqKSBjYXN0CisJCXNwLT5za2lwX2J1ZmZlciA9ICh1aW50OCopX1RJRkZtYWxsb2Moc3AtPmJ5dGVzX3Blcl9saW5lKTsKKwkJaWYgKHNwLT5za2lwX2J1ZmZlciA9PSBOVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKwlmb3IgKG09MDsgbTxzcC0+bGluZXNfcGVyX3N0cmlsZTsgbSsrKQorCXsKKwkJaWYgKGpwZWdfcmVhZF9zY2FubGluZXNfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwmc3AtPnNraXBfYnVmZmVyLDEpPT0wKQorCQkJcmV0dXJuKDApOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCSh2b2lkKXM7CisJaWYgKHNwLT5saWJqcGVnX2pwZWdfcXVlcnlfc3R5bGU9PTApCisJeworCQlpZiAoT0pQRUdEZWNvZGVSYXcodGlmLGJ1ZixjYyk9PTApCisJCQlyZXR1cm4oMCk7CisJfQorCWVsc2UKKwl7CisJCWlmIChPSlBFR0RlY29kZVNjYW5saW5lcyh0aWYsYnVmLGNjKT09MCkKKwkJCXJldHVybigwKTsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR0RlY29kZVJhdyhUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR0RlY29kZVJhdyI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDgqIG07CisJdG1zaXplX3QgbjsKKwl1aW50OCogb3k7CisJdWludDgqIG9jYjsKKwl1aW50OCogb2NyOworCXVpbnQ4KiBwOworCXVpbnQzMiBxOworCXVpbnQ4KiByOworCXVpbnQ4IHN4LHN5OworCWlmIChjYyVzcC0+Ynl0ZXNfcGVyX2xpbmUhPTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkZyYWN0aW9uYWwgc2NhbmxpbmUgbm90IHJlYWQiKTsKKwkJcmV0dXJuKDApOworCX0KKwlhc3NlcnQoY2M+MCk7CisJbT1idWY7CisJbj1jYzsKKwlkbworCXsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPT0wKQorCQl7CisJCQlpZiAoanBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSxzcC0+c3Vic2FtcGxpbmdfdmVyKjgpPT0wKQorCQkJCXJldHVybigwKTsKKwkJfQorCQlveT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlKnNwLT5zdWJzYW1wbGluZ192ZXIqc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW47CisJCW9jYj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jYmJ1ZitzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZSpzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbjsKKwkJb2NyPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NyYnVmK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlKnNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVuOworCQlwPW07CisJCWZvciAocT0wOyBxPHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVub3V0OyBxKyspCisJCXsKKwkJCXI9b3k7CisJCQlmb3IgKHN5PTA7IHN5PHNwLT5zdWJzYW1wbGluZ192ZXI7IHN5KyspCisJCQl7CisJCQkJZm9yIChzeD0wOyBzeDxzcC0+c3Vic2FtcGxpbmdfaG9yOyBzeCsrKQorCQkJCQkqcCsrPSpyKys7CisJCQkJcis9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW4tc3AtPnN1YnNhbXBsaW5nX2hvcjsKKwkJCX0KKwkJCW95Kz1zcC0+c3Vic2FtcGxpbmdfaG9yOworCQkJKnArKz0qb2NiKys7CisJCQkqcCsrPSpvY3IrKzsKKwkJfQorCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZSsrOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU9PXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lcykKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPTA7CisJCW0rPXNwLT5ieXRlc19wZXJfbGluZTsKKwkJbi09c3AtPmJ5dGVzX3Blcl9saW5lOworCX0gd2hpbGUobj4wKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHRGVjb2RlU2NhbmxpbmVzKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHRGVjb2RlU2NhbmxpbmVzIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCogbTsKKwl0bXNpemVfdCBuOworCWlmIChjYyVzcC0+Ynl0ZXNfcGVyX2xpbmUhPTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkZyYWN0aW9uYWwgc2NhbmxpbmUgbm90IHJlYWQiKTsKKwkJcmV0dXJuKDApOworCX0KKwlhc3NlcnQoY2M+MCk7CisJbT1idWY7CisJbj1jYzsKKwlkbworCXsKKwkJaWYgKGpwZWdfcmVhZF9zY2FubGluZXNfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwmbSwxKT09MCkKKwkJCXJldHVybigwKTsKKwkJbSs9c3AtPmJ5dGVzX3Blcl9saW5lOworCQluLT1zcC0+Ynl0ZXNfcGVyX2xpbmU7CisJfSB3aGlsZShuPjApOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHUG9zdERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCSh2b2lkKWJ1ZjsKKwkodm9pZCljYzsKKwlzcC0+d3JpdGVfY3Vyc3RyaWxlKys7CisJaWYgKHNwLT53cml0ZV9jdXJzdHJpbGUldGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlPT0wKSAgCisJeworCQlhc3NlcnQoc3AtPmxpYmpwZWdfc2Vzc2lvbl9hY3RpdmUhPTApOworCQlPSlBFR0xpYmpwZWdTZXNzaW9uQWJvcnQodGlmKTsKKwkJc3AtPndyaXRlaGVhZGVyX2RvbmU9MDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHU2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1NldHVwRW5jb2RlIjsKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk9KUEVHIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQ7IHVzZSBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2lvbiBpbnN0ZWFkIik7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CitPSlBFR1ByZUVuY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1ByZUVuY29kZSI7CisJKHZvaWQpczsKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk9KUEVHIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQ7IHVzZSBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2lvbiBpbnN0ZWFkIik7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CitPSlBFR0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdFbmNvZGUiOworCSh2b2lkKWJ1ZjsKKwkodm9pZCljYzsKKwkodm9pZClzOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT0pQRUcgZW5jb2Rpbmcgbm90IHN1cHBvcnRlZDsgdXNlIG5ldy1zdHlsZSBKUEVHIGNvbXByZXNzaW9uIGluc3RlYWQiKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUG9zdEVuY29kZSI7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPSlBFRyBlbmNvZGluZyBub3Qgc3VwcG9ydGVkOyB1c2UgbmV3LXN0eWxlIEpQRUcgY29tcHJlc3Npb24gaW5zdGVhZCIpOworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHQ2xlYW51cChUSUZGKiB0aWYpCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJaWYgKHNwIT0wKQorCXsKKwkJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQ9c3AtPnZnZXRwYXJlbnQ7CisJCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkPXNwLT52c2V0cGFyZW50OworCQl0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyPXNwLT5wcmludGRpcjsKKwkJaWYgKHNwLT5xdGFibGVbMF0hPTApCisJCQlfVElGRmZyZWUoc3AtPnF0YWJsZVswXSk7CisJCWlmIChzcC0+cXRhYmxlWzFdIT0wKQorCQkJX1RJRkZmcmVlKHNwLT5xdGFibGVbMV0pOworCQlpZiAoc3AtPnF0YWJsZVsyXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+cXRhYmxlWzJdKTsKKwkJaWYgKHNwLT5xdGFibGVbM10hPTApCisJCQlfVElGRmZyZWUoc3AtPnF0YWJsZVszXSk7CisJCWlmIChzcC0+ZGN0YWJsZVswXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVswXSk7CisJCWlmIChzcC0+ZGN0YWJsZVsxXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVsxXSk7CisJCWlmIChzcC0+ZGN0YWJsZVsyXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVsyXSk7CisJCWlmIChzcC0+ZGN0YWJsZVszXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVszXSk7CisJCWlmIChzcC0+YWN0YWJsZVswXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVswXSk7CisJCWlmIChzcC0+YWN0YWJsZVsxXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVsxXSk7CisJCWlmIChzcC0+YWN0YWJsZVsyXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVsyXSk7CisJCWlmIChzcC0+YWN0YWJsZVszXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVszXSk7CisJCWlmIChzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZSE9MCkKKwkJCU9KUEVHTGlianBlZ1Nlc3Npb25BYm9ydCh0aWYpOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWYhPTApCisJCQlfVElGRmZyZWUoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWYpOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSE9MCkKKwkJCV9USUZGZnJlZShzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlKTsKKwkJaWYgKHNwLT5za2lwX2J1ZmZlciE9MCkKKwkJCV9USUZGZnJlZShzcC0+c2tpcF9idWZmZXIpOworCQlfVElGRmZyZWUoc3ApOworCQl0aWYtPnRpZl9kYXRhPU5VTEw7CisJCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1N1YnNhbXBsaW5nQ29ycmVjdChUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHU3Vic2FtcGxpbmdDb3JyZWN0IjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCBtaDsKKwl1aW50OCBtdjsKKyAgICAgICAgX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisgICAgICAgIAorCWFzc2VydChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0X2RvbmU9PTApOworCWlmICgodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCE9MykgfHwgKCh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWMhPVBIT1RPTUVUUklDX1lDQkNSKSAmJgorCSAgICAodGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljIT1QSE9UT01FVFJJQ19JVFVMQUIpKSkKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdfdGFnIT0wKQorCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlN1YnNhbXBsaW5nIHRhZyBub3QgYXBwcm9wcmlhdGUgZm9yIHRoaXMgUGhvdG9tZXRyaWMgYW5kL29yIFNhbXBsZXNQZXJQaXhlbCIpOworCQlzcC0+c3Vic2FtcGxpbmdfaG9yPTE7CisJCXNwLT5zdWJzYW1wbGluZ192ZXI9MTsKKwkJc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb249MDsKKwl9CisJZWxzZQorCXsKKwkJc3AtPnN1YnNhbXBsaW5nY29ycmVjdF9kb25lPTE7CisJCW1oPXNwLT5zdWJzYW1wbGluZ19ob3I7CisJCW12PXNwLT5zdWJzYW1wbGluZ192ZXI7CisJCXNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9MTsKKwkJT0pQRUdSZWFkSGVhZGVySW5mb1NlYyh0aWYpOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb24hPTApCisJCXsKKwkJCXNwLT5zdWJzYW1wbGluZ19ob3I9MTsKKwkJCXNwLT5zdWJzYW1wbGluZ192ZXI9MTsKKwkJfQorCQlzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PTA7CisJCWlmICgoKHNwLT5zdWJzYW1wbGluZ19ob3IhPW1oKSB8fCAoc3AtPnN1YnNhbXBsaW5nX3ZlciE9bXYpKSAmJiAoc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb249PTApKQorCQl7CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nX3RhZz09MCkKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU3Vic2FtcGxpbmcgdGFnIGlzIG5vdCBzZXQsIHlldCBzdWJzYW1wbGluZyBpbnNpZGUgSlBFRyBkYXRhIFslZCwlZF0gZG9lcyBub3QgbWF0Y2ggZGVmYXVsdCB2YWx1ZXMgWzIsMl07IGFzc3VtaW5nIHN1YnNhbXBsaW5nIGluc2lkZSBKUEVHIGRhdGEgaXMgY29ycmVjdCIsc3AtPnN1YnNhbXBsaW5nX2hvcixzcC0+c3Vic2FtcGxpbmdfdmVyKTsKKwkJCWVsc2UKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBbJWQsJWRdIGRvZXMgbm90IG1hdGNoIHN1YnNhbXBsaW5nIHRhZyB2YWx1ZXMgWyVkLCVkXTsgYXNzdW1pbmcgc3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBpcyBjb3JyZWN0IixzcC0+c3Vic2FtcGxpbmdfaG9yLHNwLT5zdWJzYW1wbGluZ192ZXIsbWgsbXYpOworCQl9CisJCWlmIChzcC0+c3Vic2FtcGxpbmdfZm9yY2VfZGVzdWJzYW1wbGluZ19pbnNpZGVfZGVjb21wcmVzc2lvbiE9MCkKKwkJeworCQkJaWYgKHNwLT5zdWJzYW1wbGluZ190YWc9PTApCisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlN1YnNhbXBsaW5nIHRhZyBpcyBub3Qgc2V0LCB5ZXQgc3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBkb2VzIG5vdCBtYXRjaCBkZWZhdWx0IHZhbHVlcyBbMiwyXSAobm9yIGFueSBvdGhlciB2YWx1ZXMgYWxsb3dlZCBpbiBUSUZGKTsgYXNzdW1pbmcgc3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBpcyBjb3JyZWN0IGFuZCBkZXN1YnNhbXBsaW5nIGluc2lkZSBKUEVHIGRlY29tcHJlc3Npb24iKTsKKwkJCWVsc2UKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBkb2VzIG5vdCBtYXRjaCBzdWJzYW1wbGluZyB0YWcgdmFsdWVzIFslZCwlZF0gKG5vciBhbnkgb3RoZXIgdmFsdWVzIGFsbG93ZWQgaW4gVElGRik7IGFzc3VtaW5nIHN1YnNhbXBsaW5nIGluc2lkZSBKUEVHIGRhdGEgaXMgY29ycmVjdCBhbmQgZGVzdWJzYW1wbGluZyBpbnNpZGUgSlBFRyBkZWNvbXByZXNzaW9uIixtaCxtdik7CisJCX0KKwkJaWYgKHNwLT5zdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uPT0wKQorCQl7CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2hvcjxzcC0+c3Vic2FtcGxpbmdfdmVyKQorCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJTdWJzYW1wbGluZyB2YWx1ZXMgWyVkLCVkXSBhcmUgbm90IGFsbG93ZWQgaW4gVElGRiIsc3AtPnN1YnNhbXBsaW5nX2hvcixzcC0+c3Vic2FtcGxpbmdfdmVyKTsKKwkJfQorCX0KKwlzcC0+c3Vic2FtcGxpbmdjb3JyZWN0X2RvbmU9MTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mbyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm8iOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCWFzc2VydChzcC0+cmVhZGhlYWRlcl9kb25lPT0wKTsKKwlzcC0+aW1hZ2Vfd2lkdGg9dGlmLT50aWZfZGlyLnRkX2ltYWdld2lkdGg7CisJc3AtPmltYWdlX2xlbmd0aD10aWYtPnRpZl9kaXIudGRfaW1hZ2VsZW5ndGg7CisJaWYgaXNUaWxlZCh0aWYpCisJeworCQlzcC0+c3RyaWxlX3dpZHRoPXRpZi0+dGlmX2Rpci50ZF90aWxld2lkdGg7CisJCXNwLT5zdHJpbGVfbGVuZ3RoPXRpZi0+dGlmX2Rpci50ZF90aWxlbGVuZ3RoOworCQlzcC0+c3RyaWxlX2xlbmd0aF90b3RhbD0oKHNwLT5pbWFnZV9sZW5ndGgrc3AtPnN0cmlsZV9sZW5ndGgtMSkvc3AtPnN0cmlsZV9sZW5ndGgpKnNwLT5zdHJpbGVfbGVuZ3RoOworCX0KKwllbHNlCisJeworCQlzcC0+c3RyaWxlX3dpZHRoPXNwLT5pbWFnZV93aWR0aDsKKwkJc3AtPnN0cmlsZV9sZW5ndGg9dGlmLT50aWZfZGlyLnRkX3Jvd3NwZXJzdHJpcDsKKwkJc3AtPnN0cmlsZV9sZW5ndGhfdG90YWw9c3AtPmltYWdlX2xlbmd0aDsKKwl9CisJaWYgKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw9PTEpCisJeworCQlzcC0+c2FtcGxlc19wZXJfcGl4ZWw9MTsKKwkJc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ9MDsKKwkJc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZT1zcC0+c2FtcGxlc19wZXJfcGl4ZWw7CisJCXNwLT5zdWJzYW1wbGluZ19ob3I9MTsKKwkJc3AtPnN1YnNhbXBsaW5nX3Zlcj0xOworCX0KKwllbHNlCisJeworCQlpZiAodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCE9MykKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJTYW1wbGVzUGVyUGl4ZWwgJWQgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUiLHNwLT5zYW1wbGVzX3Blcl9waXhlbCk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJc3AtPnNhbXBsZXNfcGVyX3BpeGVsPTM7CisJCXNwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0PTA7CisJCWlmICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnPT1QTEFOQVJDT05GSUdfQ09OVElHKQorCQkJc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZT0zOworCQllbHNlCisJCQlzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lPTE7CisJfQorCWlmIChzcC0+c3RyaWxlX2xlbmd0aDxzcC0+aW1hZ2VfbGVuZ3RoKQorCXsKKwkJaWYgKHNwLT5zdHJpbGVfbGVuZ3RoJShzcC0+c3Vic2FtcGxpbmdfdmVyKjgpIT0wKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkluY29tcGF0aWJsZSB2ZXJ0aWNhbCBzdWJzYW1wbGluZyBhbmQgaW1hZ2Ugc3RyaXAvdGlsZSBsZW5ndGgiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlzcC0+cmVzdGFydF9pbnRlcnZhbD0oKHNwLT5zdHJpbGVfd2lkdGgrc3AtPnN1YnNhbXBsaW5nX2hvcio4LTEpLyhzcC0+c3Vic2FtcGxpbmdfaG9yKjgpKSooc3AtPnN0cmlsZV9sZW5ndGgvKHNwLT5zdWJzYW1wbGluZ192ZXIqOCkpOworCX0KKwlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlYyh0aWYpPT0wKQorCQlyZXR1cm4oMCk7CisJc3AtPnNvc19lbmRbMF0ubG9nPTE7CisJc3AtPnNvc19lbmRbMF0uaW5fYnVmZmVyX3NvdXJjZT1zcC0+aW5fYnVmZmVyX3NvdXJjZTsKKwlzcC0+c29zX2VuZFswXS5pbl9idWZmZXJfbmV4dF9zdHJpbGU9c3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZTsKKwlzcC0+c29zX2VuZFswXS5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPmluX2J1ZmZlcl9maWxlX3Bvcy1zcC0+aW5fYnVmZmVyX3RvZ287CisJc3AtPnNvc19lbmRbMF0uaW5fYnVmZmVyX2ZpbGVfdG9nbz1zcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbytzcC0+aW5fYnVmZmVyX3RvZ287IAorCXNwLT5yZWFkaGVhZGVyX2RvbmU9MTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZFNlY29uZGFyeVNvcyhUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQ4IG07CisJYXNzZXJ0KHM+MCk7CisJYXNzZXJ0KHM8Myk7CisJYXNzZXJ0KHNwLT5zb3NfZW5kWzBdLmxvZyE9MCk7CisJYXNzZXJ0KHNwLT5zb3NfZW5kW3NdLmxvZz09MCk7CisJc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ9cy0xOworCXdoaWxlKHNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5sb2c9PTApCisJCXNwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0LS07CisJc3AtPmluX2J1ZmZlcl9zb3VyY2U9c3AtPnNvc19lbmRbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXRdLmluX2J1ZmZlcl9zb3VyY2U7CisJc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZT1zcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0uaW5fYnVmZmVyX25leHRfc3RyaWxlOworCXNwLT5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPnNvc19lbmRbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXRdLmluX2J1ZmZlcl9maWxlX3BvczsKKwlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zX2xvZz0wOworCXNwLT5pbl9idWZmZXJfZmlsZV90b2dvPXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfZmlsZV90b2dvOworCXNwLT5pbl9idWZmZXJfdG9nbz0wOworCXNwLT5pbl9idWZmZXJfY3VyPTA7CisJd2hpbGUoc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ8cykKKwl7CisJCWRvCisJCXsKKwkJCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZtKT09MCkKKwkJCQlyZXR1cm4oMCk7CisJCQlpZiAobT09MjU1KQorCQkJeworCQkJCWRvCisJCQkJeworCQkJCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbSk9PTApCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCWlmIChtIT0yNTUpCisJCQkJCQlicmVhazsKKwkJCQl9IHdoaWxlKDEpOworCQkJCWlmIChtPT1KUEVHX01BUktFUl9TT1MpCisJCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlKDEpOworCQlzcC0+cGxhbmVfc2FtcGxlX29mZnNldCsrOworCQlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvcyh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCQlzcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0ubG9nPTE7CisJCXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfc291cmNlPXNwLT5pbl9idWZmZXJfc291cmNlOworCQlzcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0uaW5fYnVmZmVyX25leHRfc3RyaWxlPXNwLT5pbl9idWZmZXJfbmV4dF9zdHJpbGU7CisJCXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPmluX2J1ZmZlcl9maWxlX3Bvcy1zcC0+aW5fYnVmZmVyX3RvZ287CisJCXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfZmlsZV90b2dvPXNwLT5pbl9idWZmZXJfZmlsZV90b2dvK3NwLT5pbl9idWZmZXJfdG9nbzsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1dyaXRlSGVhZGVySW5mbyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHV3JpdGVIZWFkZXJJbmZvIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCoqIG07CisJdWludDMyIG47CisJLyogaWYgYSBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZCwgZG9uJ3QgdHJ5IGFnYWluICovCisJaWYgKHNwLT5saWJqcGVnX3Nlc3Npb25fYWN0aXZlICE9IDApIAorCQlyZXR1cm4gMDsKKwlzcC0+b3V0X3N0YXRlPW9zb3NTb2k7CisJc3AtPnJlc3RhcnRfaW5kZXg9MDsKKwlqcGVnX3N0ZF9lcnJvcigmKHNwLT5saWJqcGVnX2pwZWdfZXJyb3JfbWdyKSk7CisJc3AtPmxpYmpwZWdfanBlZ19lcnJvcl9tZ3Iub3V0cHV0X21lc3NhZ2U9T0pQRUdMaWJqcGVnSnBlZ0Vycm9yTWdyT3V0cHV0TWVzc2FnZTsKKwlzcC0+bGlianBlZ19qcGVnX2Vycm9yX21nci5lcnJvcl9leGl0PU9KUEVHTGlianBlZ0pwZWdFcnJvck1nckVycm9yRXhpdDsKKwlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0LmVycj0mKHNwLT5saWJqcGVnX2pwZWdfZXJyb3JfbWdyKTsKKwlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0LmNsaWVudF9kYXRhPSh2b2lkKil0aWY7CisJaWYgKGpwZWdfY3JlYXRlX2RlY29tcHJlc3NfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSk9PTApCisJCXJldHVybigwKTsKKwlzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZT0xOworCXNwLT5saWJqcGVnX2pwZWdfc291cmNlX21nci5ieXRlc19pbl9idWZmZXI9MDsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IuaW5pdF9zb3VyY2U9T0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nckluaXRTb3VyY2U7CisJc3AtPmxpYmpwZWdfanBlZ19zb3VyY2VfbWdyLmZpbGxfaW5wdXRfYnVmZmVyPU9KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JGaWxsSW5wdXRCdWZmZXI7CisJc3AtPmxpYmpwZWdfanBlZ19zb3VyY2VfbWdyLnNraXBfaW5wdXRfZGF0YT1PSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyU2tpcElucHV0RGF0YTsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IucmVzeW5jX3RvX3Jlc3RhcnQ9T0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclJlc3luY1RvUmVzdGFydDsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IudGVybV9zb3VyY2U9T0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclRlcm1Tb3VyY2U7CisJc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdC5zcmM9JihzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IpOworCWlmIChqcGVnX3JlYWRfaGVhZGVyX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksMSk9PTApCisJCXJldHVybigwKTsKKwlpZiAoKHNwLT5zdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uPT0wKSAmJiAoc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZT4xKSkKKwl7CisJCXNwLT5saWJqcGVnX2pwZWdfZGVjb21wcmVzc19zdHJ1Y3QucmF3X2RhdGFfb3V0PTE7CisjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA3MAorCQlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0LmRvX2ZhbmN5X3Vwc2FtcGxpbmc9RkFMU0U7CisjZW5kaWYKKwkJc3AtPmxpYmpwZWdfanBlZ19xdWVyeV9zdHlsZT0wOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfbG9nPT0wKQorCQl7CisJCQlhc3NlcnQoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWY9PTApOworCQkJYXNzZXJ0KHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2U9PTApOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW49KChzcC0+c3RyaWxlX3dpZHRoK3NwLT5zdWJzYW1wbGluZ19ob3IqOC0xKS8oc3AtPnN1YnNhbXBsaW5nX2hvcio4KSpzcC0+c3Vic2FtcGxpbmdfaG9yKjgpOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzPXNwLT5zdWJzYW1wbGluZ192ZXIqODsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVuPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lsaW5lbGVuL3NwLT5zdWJzYW1wbGluZ19ob3I7CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM9ODsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lidWZsZW49c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW4qc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2J1Zmxlbj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbipzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmJ1Zmxlbj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmbGVuKzIqc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2J1ZmxlbjsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyYnVmID0gKHVpbnQ4KilfVElGRm1hbGxvYyhzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmJ1Zmxlbik7CS8vIGFkZCAodWludDgqKSBjYXN0CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWY9PTApCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWJ1Zj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmJ1ZjsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NiYnVmPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lidWYrc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWJ1ZmxlbjsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NyYnVmPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NiYnVmK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NidWZsZW47CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlbGVuPTMrc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzKzIqc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2xpbmVzOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSA9ICh1aW50OCoqKV9USUZGbWFsbG9jKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2VsZW4gKiBzaXplb2YodWludDgqKSk7Ly8gYWRkICh1aW50OCoqKSBjYXN0CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZT09MCkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQltPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2U7CisJCQkqbSsrPSh1aW50OCopKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2UrMyk7CisJCQkqbSsrPSh1aW50OCopKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2UrMytzcC0+c3Vic2FtcGxpbmdfY29udmVydF95bGluZXMpOworCQkJKm0rKz0odWludDgqKShzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlKzMrc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lcyk7CisJCQlmb3IgKG49MDsgbjxzcC0+c3Vic2FtcGxpbmdfY29udmVydF95bGluZXM7IG4rKykKKwkJCQkqbSsrPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lidWYrbipzcC0+c3Vic2FtcGxpbmdfY29udmVydF95bGluZWxlbjsKKwkJCWZvciAobj0wOyBuPHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lczsgbisrKQorCQkJCSptKys9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2JidWYrbipzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbjsKKwkJCWZvciAobj0wOyBuPHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lczsgbisrKQorCQkJCSptKys9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY3JidWYrbipzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbjsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVub3V0PSgoc3AtPnN0cmlsZV93aWR0aCtzcC0+c3Vic2FtcGxpbmdfaG9yLTEpL3NwLT5zdWJzYW1wbGluZ19ob3IpOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU9MDsKKwkJCXNwLT5ieXRlc19wZXJfbGluZT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbm91dCooc3AtPnN1YnNhbXBsaW5nX3ZlcipzcC0+c3Vic2FtcGxpbmdfaG9yKzIpOworCQkJc3AtPmxpbmVzX3Blcl9zdHJpbGU9KChzcC0+c3RyaWxlX2xlbmd0aCtzcC0+c3Vic2FtcGxpbmdfdmVyLTEpL3NwLT5zdWJzYW1wbGluZ192ZXIpOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfbG9nPTE7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdC5qcGVnX2NvbG9yX3NwYWNlPUpDU19VTktOT1dOOworCQlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0Lm91dF9jb2xvcl9zcGFjZT1KQ1NfVU5LTk9XTjsKKwkJc3AtPmxpYmpwZWdfanBlZ19xdWVyeV9zdHlsZT0xOworCQlzcC0+Ynl0ZXNfcGVyX2xpbmU9c3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSpzcC0+c3RyaWxlX3dpZHRoOworCQlzcC0+bGluZXNfcGVyX3N0cmlsZT1zcC0+c3RyaWxlX2xlbmd0aDsKKwl9CisJaWYgKGpwZWdfc3RhcnRfZGVjb21wcmVzc19lbmNhcChzcCwmKHNwLT5saWJqcGVnX2pwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKT09MCkKKwkJcmV0dXJuKDApOworCXNwLT53cml0ZWhlYWRlcl9kb25lPTE7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdMaWJqcGVnU2Vzc2lvbkFib3J0KFRJRkYqIHRpZikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlhc3NlcnQoc3AtPmxpYmpwZWdfc2Vzc2lvbl9hY3RpdmUhPTApOworCWpwZWdfZGVzdHJveSgoanBlZ19jb21tb25fc3RydWN0KikoJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkpOworCXNwLT5saWJqcGVnX3Nlc3Npb25fYWN0aXZlPTA7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEhlYWRlckluZm9TZWMoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCBtOworCXVpbnQxNiBuOworCXVpbnQ4IG87CisJaWYgKHNwLT5maWxlX3NpemU9PTApCisJCXNwLT5maWxlX3NpemU9VElGRkdldEZpbGVTaXplKHRpZik7CisJaWYgKHNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdCE9MCkKKwl7CisJCWlmIChzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXQ+PXNwLT5maWxlX3NpemUpCisJCXsKKwkJCXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdD0wOworCQkJc3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0X2xlbmd0aD0wOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKChzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXRfbGVuZ3RoPT0wKSB8fCAoc3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0K3NwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg+c3AtPmZpbGVfc2l6ZSkpCisJCQkJc3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0X2xlbmd0aD1zcC0+ZmlsZV9zaXplLXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdDsKKwkJfQorCX0KKwlzcC0+aW5fYnVmZmVyX3NvdXJjZT1vc2lic05vdFNldFlldDsKKwlzcC0+aW5fYnVmZmVyX25leHRfc3RyaWxlPTA7CisJc3AtPmluX2J1ZmZlcl9zdHJpbGVfY291bnQ9dGlmLT50aWZfZGlyLnRkX25zdHJpcHM7CisJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ289MDsKKwlzcC0+aW5fYnVmZmVyX3RvZ289MDsKKwlkbworCXsKKwkJaWYgKE9KUEVHUmVhZEJ5dGVQZWVrKHNwLCZtKT09MCkKKwkJCXJldHVybigwKTsKKwkJaWYgKG0hPTI1NSkKKwkJCWJyZWFrOworCQlPSlBFR1JlYWRCeXRlQWR2YW5jZShzcCk7CisJCWRvCisJCXsKKwkJCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZtKT09MCkKKwkJCQlyZXR1cm4oMCk7CisJCX0gd2hpbGUobT09MjU1KTsKKwkJc3dpdGNoKG0pCisJCXsKKwkJCWNhc2UgSlBFR19NQVJLRVJfU09JOgorCQkJCS8qIHRoaXMgdHlwZSBvZiBtYXJrZXIgaGFzIG5vIGRhdGEsIGFuZCBzaG91bGQgYmUgc2tpcHBlZCAqLworCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9DT006CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDA6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMToKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCsyOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzM6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArNDoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs1OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzY6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArNzoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs4OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzk6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMTA6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMTE6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMTI6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMTM6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMTQ6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMTU6CisJCQkJLyogdGhpcyB0eXBlIG9mIG1hcmtlciBoYXMgZGF0YSwgYnV0IGl0IGhhcyBubyB1c2UgdG8gdXMgKGFuZCBubyBwbGFjZSBoZXJlKSBhbmQgc2hvdWxkIGJlIHNraXBwZWQgKi8KKwkJCQlpZiAoT0pQRUdSZWFkV29yZChzcCwmbik9PTApCisJCQkJCXJldHVybigwKTsKKwkJCQlpZiAobjwyKQorCQkJCXsKKwkJCQkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgSlBFRyBkYXRhIik7CisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQkJaWYgKG4+MikKKwkJCQkJT0pQRUdSZWFkU2tpcChzcCxuLTIpOworCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9EUkk6CisJCQkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1EcmkodGlmKT09MCkKKwkJCQkJcmV0dXJuKDApOworCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9EUVQ6CisJCQkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1EcXQodGlmKT09MCkKKwkJCQkJcmV0dXJuKDApOworCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9ESFQ6CisJCQkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1EaHQodGlmKT09MCkKKwkJCQkJcmV0dXJuKDApOworCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9TT0YwOgorCQkJY2FzZSBKUEVHX01BUktFUl9TT0YxOgorCQkJY2FzZSBKUEVHX01BUktFUl9TT0YzOgorCQkJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29mKHRpZixtKT09MCkKKwkJCQkJcmV0dXJuKDApOworCQkJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0IT0wKQorCQkJCQlyZXR1cm4oMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpQRUdfTUFSS0VSX1NPUzoKKwkJCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdCE9MCkKKwkJCQkJcmV0dXJuKDEpOworCQkJCWFzc2VydChzcC0+cGxhbmVfc2FtcGxlX29mZnNldD09MCk7CisJCQkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1Tb3ModGlmKT09MCkKKwkJCQkJcmV0dXJuKDApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlVua25vd24gbWFya2VyIHR5cGUgJWQgaW4gSlBFRyBkYXRhIixtKTsKKwkJCQlyZXR1cm4oMCk7CisJCX0KKwl9IHdoaWxlKG0hPUpQRUdfTUFSS0VSX1NPUyk7CisJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3QpCisJCXJldHVybigxKTsKKwlpZiAoc3AtPnNvZl9sb2c9PTApCisJeworCQlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc1FUYWJsZSh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCQlzcC0+c29mX21hcmtlcl9pZD1KUEVHX01BUktFUl9TT0YwOworCQlmb3IgKG89MDsgbzxzcC0+c2FtcGxlc19wZXJfcGl4ZWw7IG8rKykKKwkJCXNwLT5zb2ZfY1tvXT1vOworCQlzcC0+c29mX2h2WzBdPSgoc3AtPnN1YnNhbXBsaW5nX2hvcjw8NCl8c3AtPnN1YnNhbXBsaW5nX3Zlcik7CisJCWZvciAobz0xOyBvPHNwLT5zYW1wbGVzX3Blcl9waXhlbDsgbysrKQorCQkJc3AtPnNvZl9odltvXT0xNzsKKwkJc3AtPnNvZl94PXNwLT5zdHJpbGVfd2lkdGg7CisJCXNwLT5zb2ZfeT1zcC0+c3RyaWxlX2xlbmd0aF90b3RhbDsKKwkJc3AtPnNvZl9sb2c9MTsKKwkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNEY1RhYmxlKHRpZik9PTApCisJCQlyZXR1cm4oMCk7CisJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzQWNUYWJsZSh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCQlmb3IgKG89MTsgbzxzcC0+c2FtcGxlc19wZXJfcGl4ZWw7IG8rKykKKwkJCXNwLT5zb3NfY3Nbb109bzsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHJpKFRJRkYqIHRpZikKK3sKKwkvKiB0aGlzIGNvdWxkIGVhc2lsbHkgY2F1c2UgdHJvdWJsZSBpbiBzb21lIGNhc2VzLi4uIGJ1dCBubyBzdWNoIGNhc2VzIGhhdmUgb2NjdXJlZCBzb2ZhciAqLworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHJpIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MTYgbTsKKwlpZiAoT0pQRUdSZWFkV29yZChzcCwmbSk9PTApCisJCXJldHVybigwKTsKKwlpZiAobSE9NCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBEUkkgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCWlmIChPSlBFR1JlYWRXb3JkKHNwLCZtKT09MCkKKwkJcmV0dXJuKDApOworCXNwLT5yZXN0YXJ0X2ludGVydmFsPW07CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHF0KFRJRkYqIHRpZikKK3sKKwkvKiB0aGlzIGlzIGEgdGFibGUgbWFya2VyLCBhbmQgaXQgaXMgdG8gYmUgc2F2ZWQgYXMgYSB3aG9sZSBmb3IgZXhhY3QgcHVzaGluZyBvbiB0aGUganBlZyBzdHJlYW0gbGF0ZXIgb24gKi8KKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURxdCI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDE2IG07CisJdWludDMyIG5hOworCXVpbnQ4KiBuYjsKKwl1aW50OCBvOworCWlmIChPSlBFR1JlYWRXb3JkKHNwLCZtKT09MCkKKwkJcmV0dXJuKDApOworCWlmIChtPD0yKQorCXsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgRFFUIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKwkJcmV0dXJuKDApOworCX0KKwlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdCE9MCkKKwkJT0pQRUdSZWFkU2tpcChzcCxtLTIpOworCWVsc2UKKwl7CisJCW0tPTI7CisJCWRvCisJCXsKKwkJCWlmIChtPDY1KQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBEUVQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCW5hID0gc2l6ZW9mKHVpbnQzMikgKyA2OTsKKwkJCW5iID0gKHVpbnQ4KilfVElGRm1hbGxvYyhuYSk7CS8vIGFkZCAodWludDgqKSBjYXN0CisJCQlpZiAobmIgPT0gMCkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQkqKHVpbnQzMiopbmI9bmE7CisJCQluYltzaXplb2YodWludDMyKV09MjU1OworCQkJbmJbc2l6ZW9mKHVpbnQzMikrMV09SlBFR19NQVJLRVJfRFFUOworCQkJbmJbc2l6ZW9mKHVpbnQzMikrMl09MDsKKwkJCW5iW3NpemVvZih1aW50MzIpKzNdPTY3OworCQkJaWYgKE9KUEVHUmVhZEJsb2NrKHNwLDY1LCZuYltzaXplb2YodWludDMyKSs0XSk9PTApIHsKKwkJCQlfVElGRmZyZWUobmIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCW89bmJbc2l6ZW9mKHVpbnQzMikrNF0mMTU7CisJCQlpZiAoMzxvKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBEUVQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQkJCV9USUZGZnJlZShuYik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJaWYgKHNwLT5xdGFibGVbb10hPTApCisJCQkJX1RJRkZmcmVlKHNwLT5xdGFibGVbb10pOworCQkJc3AtPnF0YWJsZVtvXT1uYjsKKwkJCW0tPTY1OworCQl9IHdoaWxlKG0+MCk7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURodChUSUZGKiB0aWYpCit7CisJLyogdGhpcyBpcyBhIHRhYmxlIG1hcmtlciwgYW5kIGl0IGlzIHRvIGJlIHNhdmVkIGFzIGEgd2hvbGUgZm9yIGV4YWN0IHB1c2hpbmcgb24gdGhlIGpwZWcgc3RyZWFtIGxhdGVyIG9uICovCisJLyogVE9ETzogdGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIHRhYmxlIGluIHRoaXMgbWFya2VyLi4uIGJ1dCBpJ20gbm90IHF1aXRlIHN1cmUgdGhhdCBhc3N1bXB0aW9uIGlzIGd1YXJhbnRlZWQgY29ycmVjdCAqLworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRGh0IjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MTYgbTsKKwl1aW50MzIgbmE7CisJdWludDgqIG5iOworCXVpbnQ4IG87CisJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJm0pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG08PTIpCisJeworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBESFQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0IT0wKQorCXsKKwkJT0pQRUdSZWFkU2tpcChzcCxtLTIpOworCX0KKwllbHNlCisJeworCQluYSA9IHNpemVvZih1aW50MzIpICsgMiArIG07CisJCW5iID0gKHVpbnQ4KilfVElGRm1hbGxvYyhuYSk7CS8vIGFkZCAodWludDgqKSBjYXN0CisJCWlmIChuYiA9PSAwKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQkqKHVpbnQzMiopbmI9bmE7CisJCW5iW3NpemVvZih1aW50MzIpXT0yNTU7CisJCW5iW3NpemVvZih1aW50MzIpKzFdPUpQRUdfTUFSS0VSX0RIVDsKKwkJbmJbc2l6ZW9mKHVpbnQzMikrMl09KG0+PjgpOworCQluYltzaXplb2YodWludDMyKSszXT0obSYyNTUpOworCQlpZiAoT0pQRUdSZWFkQmxvY2soc3AsbS0yLCZuYltzaXplb2YodWludDMyKSs0XSk9PTApCisJCQlyZXR1cm4oMCk7CisJCW89bmJbc2l6ZW9mKHVpbnQzMikrNF07CisJCWlmICgobyYyNDApPT0wKQorCQl7CisJCQlpZiAoMzxvKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBESFQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCWlmIChzcC0+ZGN0YWJsZVtvXSE9MCkKKwkJCQlfVElGRmZyZWUoc3AtPmRjdGFibGVbb10pOworCQkJc3AtPmRjdGFibGVbb109bmI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKG8mMjQwKSE9MTYpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IERIVCBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJbyY9MTU7CisJCQlpZiAoMzxvKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBESFQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCWlmIChzcC0+YWN0YWJsZVtvXSE9MCkKKwkJCQlfVElGRmZyZWUoc3AtPmFjdGFibGVbb10pOworCQkJc3AtPmFjdGFibGVbb109bmI7CisJCX0KKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29mKFRJRkYqIHRpZiwgdWludDggbWFya2VyX2lkKQoreworCS8qIHRoaXMgbWFya2VyIG5lZWRzIHRvIGJlIGNoZWNrZWQsIGFuZCBwYXJ0IG9mIGl0cyBkYXRhIG5lZWRzIHRvIGJlIHNhdmVkIGZvciByZWdlbmVyYXRpb24gbGF0ZXIgb24gKi8KKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvZiI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDE2IG07CisJdWludDE2IG47CisJdWludDggbzsKKwl1aW50MTYgcDsKKwl1aW50MTYgcTsKKwlpZiAoc3AtPnNvZl9sb2chPTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCXNwLT5zb2ZfbWFya2VyX2lkPW1hcmtlcl9pZDsKKwkvKiBMZjogZGF0YSBsZW5ndGggKi8KKwlpZiAoT0pQRUdSZWFkV29yZChzcCwmbSk9PTApCisJCXJldHVybigwKTsKKwlpZiAobTwxMSkKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IFNPRiBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJbS09ODsKKwlpZiAobSUzIT0wKQorCXsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgU09GIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKwkJcmV0dXJuKDApOworCX0KKwluPW0vMzsKKwlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwl7CisJCWlmIChuIT1zcC0+c2FtcGxlc19wZXJfcGl4ZWwpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSlBFRyBjb21wcmVzc2VkIGRhdGEgaW5kaWNhdGVzIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIHNhbXBsZXMiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKwkvKiBQOiBTYW1wbGUgcHJlY2lzaW9uICovCisJaWYgKE9KUEVHUmVhZEJ5dGUoc3AsJm8pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG8hPTgpCisJeworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSlBFRyBjb21wcmVzc2VkIGRhdGEgaW5kaWNhdGVzIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSIpOworCQlyZXR1cm4oMCk7CisJfQorCS8qIFk6IE51bWJlciBvZiBsaW5lcywgWDogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGxpbmUgKi8KKwlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdCkKKwkJT0pQRUdSZWFkU2tpcChzcCw0KTsKKwllbHNlCisJeworCQkvKiBZOiBOdW1iZXIgb2YgbGluZXMgKi8KKwkJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJnApPT0wKQorCQkJcmV0dXJuKDApOworCQlpZiAoKCh1aW50MzIpcDxzcC0+aW1hZ2VfbGVuZ3RoKSAmJiAoKHVpbnQzMilwPHNwLT5zdHJpbGVfbGVuZ3RoX3RvdGFsKSkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJKUEVHIGNvbXByZXNzZWQgZGF0YSBpbmRpY2F0ZXMgdW5leHBlY3RlZCBoZWlnaHQiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlzcC0+c29mX3k9cDsKKwkJLyogWDogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGxpbmUgKi8KKwkJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJnApPT0wKQorCQkJcmV0dXJuKDApOworCQlpZiAoKCh1aW50MzIpcDxzcC0+aW1hZ2Vfd2lkdGgpICYmICgodWludDMyKXA8c3AtPnN0cmlsZV93aWR0aCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSlBFRyBjb21wcmVzc2VkIGRhdGEgaW5kaWNhdGVzIHVuZXhwZWN0ZWQgd2lkdGgiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlpZiAoKHVpbnQzMilwPnNwLT5zdHJpbGVfd2lkdGgpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSlBFRyBjb21wcmVzc2VkIGRhdGEgaW1hZ2Ugd2lkdGggZXhjZWVkcyBleHBlY3RlZCBpbWFnZSB3aWR0aCIpOworCQkJcmV0dXJuKDApOworCQl9CisJCXNwLT5zb2ZfeD1wOworCX0KKwkvKiBOZjogTnVtYmVyIG9mIGltYWdlIGNvbXBvbmVudHMgaW4gZnJhbWUgKi8KKwlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbyk9PTApCisJCXJldHVybigwKTsKKwlpZiAobyE9bikKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IFNPRiBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJLyogcGVyIGNvbXBvbmVudCBzdHVmZiAqLworCS8qIFRPRE86IGRvdWJsZS1jaGVjayB0aGF0IGZsb3cgaW1wbGllcyB0aGF0IG4gY2Fubm90IGJlIGFzIGJpZyBhcyB0byBtYWtlIHVzIG92ZXJmbG93IHNvZl9jLCBzb2ZfaHYgYW5kIHNvZl90cSBhcnJheXMgKi8KKwlmb3IgKHE9MDsgcTxuOyBxKyspCisJeworCQkvKiBDOiBDb21wb25lbnQgaWRlbnRpZmllciAqLworCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbyk9PTApCisJCQlyZXR1cm4oMCk7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQkJc3AtPnNvZl9jW3FdPW87CisJCS8qIEg6IEhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yLCBhbmQgVjogVmVydGljYWwgc2FtcGxpbmcgZmFjdG9yICovCisJCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZvKT09MCkKKwkJCXJldHVybigwKTsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3QhPTApCisJCXsKKwkJCWlmIChxPT0wKQorCQkJeworCQkJCXNwLT5zdWJzYW1wbGluZ19ob3I9KG8+PjQpOworCQkJCXNwLT5zdWJzYW1wbGluZ192ZXI9KG8mMTUpOworCQkJCWlmICgoKHNwLT5zdWJzYW1wbGluZ19ob3IhPTEpICYmIChzcC0+c3Vic2FtcGxpbmdfaG9yIT0yKSAmJiAoc3AtPnN1YnNhbXBsaW5nX2hvciE9NCkpIHx8CisJCQkJCSgoc3AtPnN1YnNhbXBsaW5nX3ZlciE9MSkgJiYgKHNwLT5zdWJzYW1wbGluZ192ZXIhPTIpICYmIChzcC0+c3Vic2FtcGxpbmdfdmVyIT00KSkpCisJCQkJCXNwLT5zdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uPTE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKG8hPTE3KQorCQkJCQlzcC0+c3Vic2FtcGxpbmdfZm9yY2VfZGVzdWJzYW1wbGluZ19pbnNpZGVfZGVjb21wcmVzc2lvbj0xOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3AtPnNvZl9odltxXT1vOworCQkJaWYgKHNwLT5zdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uPT0wKQorCQkJeworCQkJCWlmIChxPT0wKQorCQkJCXsKKwkJCQkJaWYgKG8hPSgoc3AtPnN1YnNhbXBsaW5nX2hvcjw8NCl8c3AtPnN1YnNhbXBsaW5nX3ZlcikpCisJCQkJCXsKKwkJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSlBFRyBjb21wcmVzc2VkIGRhdGEgaW5kaWNhdGVzIHVuZXhwZWN0ZWQgc3Vic2FtcGxpbmcgdmFsdWVzIik7CisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKG8hPTE3KQorCQkJCQl7CisJCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpQRUcgY29tcHJlc3NlZCBkYXRhIGluZGljYXRlcyB1bmV4cGVjdGVkIHN1YnNhbXBsaW5nIHZhbHVlcyIpOworCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFRxOiBRdWFudGl6YXRpb24gdGFibGUgZGVzdGluYXRpb24gc2VsZWN0b3IgKi8KKwkJaWYgKE9KUEVHUmVhZEJ5dGUoc3AsJm8pPT0wKQorCQkJcmV0dXJuKDApOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCXNwLT5zb2ZfdHFbcV09bzsKKwl9CisJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCXNwLT5zb2ZfbG9nPTE7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29zKFRJRkYqIHRpZikKK3sKKwkvKiB0aGlzIG1hcmtlciBuZWVkcyB0byBiZSBjaGVja2VkLCBhbmQgcGFydCBvZiBpdHMgZGF0YSBuZWVkcyB0byBiZSBzYXZlZCBmb3IgcmVnZW5lcmF0aW9uIGxhdGVyIG9uICovCisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1Tb3MiOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQxNiBtOworCXVpbnQ4IG47CisJdWludDggbzsKKwlhc3NlcnQoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCk7CisJaWYgKHNwLT5zb2ZfbG9nPT0wKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IFNPUyBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJLyogTHMgKi8KKwlpZiAoT0pQRUdSZWFkV29yZChzcCwmbSk9PTApCisJCXJldHVybigwKTsKKwlpZiAobSE9NitzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjIpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgU09TIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKwkJcmV0dXJuKDApOworCX0KKwkvKiBOcyAqLworCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZuKT09MCkKKwkJcmV0dXJuKDApOworCWlmIChuIT1zcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IFNPUyBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJLyogQ3MsIFRkLCBhbmQgVGEgKi8KKwlmb3IgKG89MDsgbzxzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lOyBvKyspCisJeworCQkvKiBDcyAqLworCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbik9PTApCisJCQlyZXR1cm4oMCk7CisJCXNwLT5zb3NfY3Nbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQrb109bjsKKwkJLyogVGQgYW5kIFRhICovCisJCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZuKT09MCkKKwkJCXJldHVybigwKTsKKwkJc3AtPnNvc190ZGFbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQrb109bjsKKwl9CisJLyogc2tpcCBTcywgU2UsIEFoLCBlbiBBbCAtPiBubyBjaGVjaywgYXMgcGVyIFRvbSBMYW5lIHJlY29tbWVuZGF0aW9uLCBhcyBwZXIgTGliSnBlZyBzb3VyY2UgKi8KKwlPSlBFR1JlYWRTa2lwKHNwLDMpOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc1FUYWJsZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNRVGFibGUiOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQ4IG07CisJdWludDggbjsKKwl1aW50MzIgb2E7CisJdWludDgqIG9iOworCXVpbnQzMiBwOworCWlmIChzcC0+cXRhYmxlX29mZnNldFswXT09MCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiTWlzc2luZyBKUEVHIHRhYmxlcyIpOworCQlyZXR1cm4oMCk7CisJfQorCXNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPTA7CisJZm9yIChtPTA7IG08c3AtPnNhbXBsZXNfcGVyX3BpeGVsOyBtKyspCisJeworCQlpZiAoKHNwLT5xdGFibGVfb2Zmc2V0W21dIT0wKSAmJiAoKG09PTApIHx8IChzcC0+cXRhYmxlX29mZnNldFttXSE9c3AtPnF0YWJsZV9vZmZzZXRbbS0xXSkpKQorCQl7CisJCQlmb3IgKG49MDsgbjxtLTE7IG4rKykKKwkJCXsKKwkJCQlpZiAoc3AtPnF0YWJsZV9vZmZzZXRbbV09PXNwLT5xdGFibGVfb2Zmc2V0W25dKQorCQkJCXsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IEpwZWdRVGFibGVzIHRhZyB2YWx1ZSIpOworCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJb2E9c2l6ZW9mKHVpbnQzMikrNjk7CisJCQlvYiA9ICh1aW50OCopX1RJRkZtYWxsb2Mob2EpOwkvLyBhZGQgKHVpbnQ4KikgY2FzdAorCQkJaWYgKG9iPT0wKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCSoodWludDMyKilvYj1vYTsKKwkJCW9iW3NpemVvZih1aW50MzIpXT0yNTU7CisJCQlvYltzaXplb2YodWludDMyKSsxXT1KUEVHX01BUktFUl9EUVQ7CisJCQlvYltzaXplb2YodWludDMyKSsyXT0wOworCQkJb2Jbc2l6ZW9mKHVpbnQzMikrM109Njc7CisJCQlvYltzaXplb2YodWludDMyKSs0XT1tOworCQkJVElGRlNlZWtGaWxlKHRpZixzcC0+cXRhYmxlX29mZnNldFttXSxTRUVLX1NFVCk7IAorCQkJcD0odWludDMyKVRJRkZSZWFkRmlsZSh0aWYsJm9iW3NpemVvZih1aW50MzIpKzVdLDY0KTsKKwkJCWlmIChwIT02NCkKKwkJCQlyZXR1cm4oMCk7CisJCQlzcC0+cXRhYmxlW21dPW9iOworCQkJc3AtPnNvZl90cVttXT1tOworCQl9CisJCWVsc2UKKwkJCXNwLT5zb2ZfdHFbbV09c3AtPnNvZl90cVttLTFdOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNEY1RhYmxlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc0RjVGFibGUiOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQ4IG07CisJdWludDggbjsKKwl1aW50OCBvWzE2XTsKKwl1aW50MzIgcDsKKwl1aW50MzIgcTsKKwl1aW50MzIgcmE7CisJdWludDgqIHJiOworCWlmIChzcC0+ZGN0YWJsZV9vZmZzZXRbMF09PTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk1pc3NpbmcgSlBFRyB0YWJsZXMiKTsKKwkJcmV0dXJuKDApOworCX0KKwlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zX2xvZz0wOworCWZvciAobT0wOyBtPHNwLT5zYW1wbGVzX3Blcl9waXhlbDsgbSsrKQorCXsKKwkJaWYgKChzcC0+ZGN0YWJsZV9vZmZzZXRbbV0hPTApICYmICgobT09MCkgfHwgKHNwLT5kY3RhYmxlX29mZnNldFttXSE9c3AtPmRjdGFibGVfb2Zmc2V0W20tMV0pKSkKKwkJeworCQkJZm9yIChuPTA7IG48bS0xOyBuKyspCisJCQl7CisJCQkJaWYgKHNwLT5kY3RhYmxlX29mZnNldFttXT09c3AtPmRjdGFibGVfb2Zmc2V0W25dKQorCQkJCXsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IEpwZWdEY1RhYmxlcyB0YWcgdmFsdWUiKTsKKwkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCVRJRkZTZWVrRmlsZSh0aWYsc3AtPmRjdGFibGVfb2Zmc2V0W21dLFNFRUtfU0VUKTsKKwkJCXA9KHVpbnQzMilUSUZGUmVhZEZpbGUodGlmLG8sMTYpOworCQkJaWYgKHAhPTE2KQorCQkJCXJldHVybigwKTsKKwkJCXE9MDsKKwkJCWZvciAobj0wOyBuPDE2OyBuKyspCisJCQkJcSs9b1tuXTsKKwkJCXJhPXNpemVvZih1aW50MzIpKzIxK3E7CisJCQlyYiA9ICh1aW50OCopX1RJRkZtYWxsb2MocmEpOwkvLyBhZGQgKHVpbnQ4KikgY2FzdAorCQkJaWYgKHJiPT0wKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCSoodWludDMyKilyYj1yYTsKKwkJCXJiW3NpemVvZih1aW50MzIpXT0yNTU7CisJCQlyYltzaXplb2YodWludDMyKSsxXT1KUEVHX01BUktFUl9ESFQ7CisJCQlyYltzaXplb2YodWludDMyKSsyXT0oKDE5K3EpPj44KTsKKwkJCXJiW3NpemVvZih1aW50MzIpKzNdPSgoMTkrcSkmMjU1KTsKKwkJCXJiW3NpemVvZih1aW50MzIpKzRdPW07CisJCQlmb3IgKG49MDsgbjwxNjsgbisrKQorCQkJCXJiW3NpemVvZih1aW50MzIpKzUrbl09b1tuXTsKKwkJCXA9KHVpbnQzMilUSUZGUmVhZEZpbGUodGlmLCYocmJbc2l6ZW9mKHVpbnQzMikrMjFdKSxxKTsKKwkJCWlmIChwIT1xKQorCQkJCXJldHVybigwKTsKKwkJCXNwLT5kY3RhYmxlW21dPXJiOworCQkJc3AtPnNvc190ZGFbbV09KG08PDQpOworCQl9CisJCWVsc2UKKwkJCXNwLT5zb3NfdGRhW21dPXNwLT5zb3NfdGRhW20tMV07CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc0FjVGFibGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzQWNUYWJsZSI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDggbTsKKwl1aW50OCBuOworCXVpbnQ4IG9bMTZdOworCXVpbnQzMiBwOworCXVpbnQzMiBxOworCXVpbnQzMiByYTsKKwl1aW50OCogcmI7CisJaWYgKHNwLT5hY3RhYmxlX29mZnNldFswXT09MCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiTWlzc2luZyBKUEVHIHRhYmxlcyIpOworCQlyZXR1cm4oMCk7CisJfQorCXNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPTA7CisJZm9yIChtPTA7IG08c3AtPnNhbXBsZXNfcGVyX3BpeGVsOyBtKyspCisJeworCQlpZiAoKHNwLT5hY3RhYmxlX29mZnNldFttXSE9MCkgJiYgKChtPT0wKSB8fCAoc3AtPmFjdGFibGVfb2Zmc2V0W21dIT1zcC0+YWN0YWJsZV9vZmZzZXRbbS0xXSkpKQorCQl7CisJCQlmb3IgKG49MDsgbjxtLTE7IG4rKykKKwkJCXsKKwkJCQlpZiAoc3AtPmFjdGFibGVfb2Zmc2V0W21dPT1zcC0+YWN0YWJsZV9vZmZzZXRbbl0pCisJCQkJeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgSnBlZ0FjVGFibGVzIHRhZyB2YWx1ZSIpOworCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJVElGRlNlZWtGaWxlKHRpZixzcC0+YWN0YWJsZV9vZmZzZXRbbV0sU0VFS19TRVQpOyAgCisJCQlwPSh1aW50MzIpVElGRlJlYWRGaWxlKHRpZixvLDE2KTsKKwkJCWlmIChwIT0xNikKKwkJCQlyZXR1cm4oMCk7CisJCQlxPTA7CisJCQlmb3IgKG49MDsgbjwxNjsgbisrKQorCQkJCXErPW9bbl07CisJCQlyYT1zaXplb2YodWludDMyKSsyMStxOworCQkJcmIgPSAodWludDgqKV9USUZGbWFsbG9jKHJhKTsJLy8gYWRkICh1aW50OCopIGNhc3QKKwkJCWlmIChyYj09MCkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQkqKHVpbnQzMiopcmI9cmE7CisJCQlyYltzaXplb2YodWludDMyKV09MjU1OworCQkJcmJbc2l6ZW9mKHVpbnQzMikrMV09SlBFR19NQVJLRVJfREhUOworCQkJcmJbc2l6ZW9mKHVpbnQzMikrMl09KCgxOStxKT4+OCk7CisJCQlyYltzaXplb2YodWludDMyKSszXT0oKDE5K3EpJjI1NSk7CisJCQlyYltzaXplb2YodWludDMyKSs0XT0oMTZ8bSk7CisJCQlmb3IgKG49MDsgbjwxNjsgbisrKQorCQkJCXJiW3NpemVvZih1aW50MzIpKzUrbl09b1tuXTsKKwkJCXA9KHVpbnQzMilUSUZGUmVhZEZpbGUodGlmLCYocmJbc2l6ZW9mKHVpbnQzMikrMjFdKSxxKTsKKwkJCWlmIChwIT1xKQorCQkJCXJldHVybigwKTsKKwkJCXNwLT5hY3RhYmxlW21dPXJiOworCQkJc3AtPnNvc190ZGFbbV09KHNwLT5zb3NfdGRhW21dfG0pOworCQl9CisJCWVsc2UKKwkJCXNwLT5zb3NfdGRhW21dPShzcC0+c29zX3RkYVttXXwoc3AtPnNvc190ZGFbbS0xXSYxNSkpOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEJ1ZmZlckZpbGwoT0pQRUdTdGF0ZSogc3ApCit7CisJdWludDE2IG07CisJdG1zaXplX3QgbjsKKwkvKiBUT0RPOiBkb3VibGUtY2hlY2s6IHdoZW4gc3Vic2FtcGxpbmdjb3JyZWN0IGlzIHNldCwgbm8gY2FsbCB0byBUSUZGRXJyb3JFeHQgb3IgVElGRldhcm5pbmdFeHQgc2hvdWxkIGJlIG1hZGUKKwkgKiBpbiBhbnkgb3RoZXIgY2FzZSwgc2VlayBvciByZWFkIGVycm9ycyBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggKi8KKwlkbworCXsKKwkJaWYgKHNwLT5pbl9idWZmZXJfZmlsZV90b2dvIT0wKQorCQl7CisJCQlpZiAoc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9PTApCisJCQl7CisJCQkJVElGRlNlZWtGaWxlKHNwLT50aWYsc3AtPmluX2J1ZmZlcl9maWxlX3BvcyxTRUVLX1NFVCk7CisJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9MTsKKwkJCX0KKwkJCW09T0pQRUdfQlVGRkVSOworCQkJaWYgKCh1aW50NjQpbT5zcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbykKKwkJCQltPSh1aW50MTYpc3AtPmluX2J1ZmZlcl9maWxlX3RvZ287CisJCQluPVRJRkZSZWFkRmlsZShzcC0+dGlmLHNwLT5pbl9idWZmZXIsKHRtc2l6ZV90KW0pOworCQkJaWYgKG49PTApCisJCQkJcmV0dXJuKDApOworCQkJYXNzZXJ0KG4+MCk7CisJCQlhc3NlcnQobjw9T0pQRUdfQlVGRkVSKTsKKwkJCWFzc2VydChuPDY1NTM2KTsKKwkJCWFzc2VydCgodWludDY0KW48PXNwLT5pbl9idWZmZXJfZmlsZV90b2dvKTsKKwkJCW09KHVpbnQxNiluOworCQkJc3AtPmluX2J1ZmZlcl90b2dvPW07CisJCQlzcC0+aW5fYnVmZmVyX2N1cj1zcC0+aW5fYnVmZmVyOworCQkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ28tPW07CisJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zKz1tOworCQkJYnJlYWs7CisJCX0KKwkJc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9MDsKKwkJc3dpdGNoKHNwLT5pbl9idWZmZXJfc291cmNlKQorCQl7CisJCQljYXNlIG9zaWJzTm90U2V0WWV0OgorCQkJCWlmIChzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXQhPTApCisJCQkJeworCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdDsKKwkJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ289c3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0X2xlbmd0aDsKKwkJCQl9CisJCQkJc3AtPmluX2J1ZmZlcl9zb3VyY2U9b3NpYnNKcGVnSW50ZXJjaGFuZ2VGb3JtYXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zaWJzSnBlZ0ludGVyY2hhbmdlRm9ybWF0OgorCQkJCXNwLT5pbl9idWZmZXJfc291cmNlPW9zaWJzU3RyaWxlOworCQkJY2FzZSBvc2lic1N0cmlsZToKKwkJCQlpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHNwLT50aWYgKSAKKwkJCQkgICAgfHwgc3AtPnRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldCA9PSBOVUxMCisJCQkJICAgIHx8IHNwLT50aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIDA7CisKKwkJCQlpZiAoc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZT09c3AtPmluX2J1ZmZlcl9zdHJpbGVfY291bnQpCisJCQkJCXNwLT5pbl9idWZmZXJfc291cmNlPW9zaWJzRW9mOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXNwLT5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPnRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldFtzcC0+aW5fYnVmZmVyX25leHRfc3RyaWxlXTsKKwkJCQkJaWYgKHNwLT5pbl9idWZmZXJfZmlsZV9wb3MhPTApCisJCQkJCXsKKwkJCQkJCWlmIChzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPj1zcC0+ZmlsZV9zaXplKQorCQkJCQkJCXNwLT5pbl9idWZmZXJfZmlsZV9wb3M9MDsKKwkJCQkJCWVsc2UgaWYgKHNwLT50aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQ9PU5VTEwpCisJCQkJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ289c3AtPmZpbGVfc2l6ZS1zcC0+aW5fYnVmZmVyX2ZpbGVfcG9zOworCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWlmIChzcC0+dGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50ID09IDApIHsKKwkJCQkJCQkJVElGRkVycm9yRXh0KHNwLT50aWYtPnRpZl9jbGllbnRkYXRhLHNwLT50aWYtPnRpZl9uYW1lLCJTdHJpcCBieXRlIGNvdW50cyBhcmUgbWlzc2luZyIpOworCQkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCQkJfQorCQkJCQkJCXNwLT5pbl9idWZmZXJfZmlsZV90b2dvPXNwLT50aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZV07CisJCQkJCQkJaWYgKHNwLT5pbl9idWZmZXJfZmlsZV90b2dvPT0wKQorCQkJCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPTA7CisJCQkJCQkJZWxzZSBpZiAoc3AtPmluX2J1ZmZlcl9maWxlX3BvcytzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz5zcC0+ZmlsZV9zaXplKQorCQkJCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz1zcC0+ZmlsZV9zaXplLXNwLT5pbl9idWZmZXJfZmlsZV9wb3M7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZSsrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKDApOworCQl9CisJfSB3aGlsZSAoMSk7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRCeXRlKE9KUEVHU3RhdGUqIHNwLCB1aW50OCogYnl0ZSkKK3sKKwlpZiAoc3AtPmluX2J1ZmZlcl90b2dvPT0wKQorCXsKKwkJaWYgKE9KUEVHUmVhZEJ1ZmZlckZpbGwoc3ApPT0wKQorCQkJcmV0dXJuKDApOworCQlhc3NlcnQoc3AtPmluX2J1ZmZlcl90b2dvPjApOworCX0KKwkqYnl0ZT0qKHNwLT5pbl9idWZmZXJfY3VyKTsKKwlzcC0+aW5fYnVmZmVyX2N1cisrOworCXNwLT5pbl9idWZmZXJfdG9nby0tOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkQnl0ZVBlZWsoT0pQRUdTdGF0ZSogc3AsIHVpbnQ4KiBieXRlKQoreworCWlmIChzcC0+aW5fYnVmZmVyX3RvZ289PTApCisJeworCQlpZiAoT0pQRUdSZWFkQnVmZmVyRmlsbChzcCk9PTApCisJCQlyZXR1cm4oMCk7CisJCWFzc2VydChzcC0+aW5fYnVmZmVyX3RvZ28+MCk7CisJfQorCSpieXRlPSooc3AtPmluX2J1ZmZlcl9jdXIpOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHUmVhZEJ5dGVBZHZhbmNlKE9KUEVHU3RhdGUqIHNwKQoreworCWFzc2VydChzcC0+aW5fYnVmZmVyX3RvZ28+MCk7CisJc3AtPmluX2J1ZmZlcl9jdXIrKzsKKwlzcC0+aW5fYnVmZmVyX3RvZ28tLTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkV29yZChPSlBFR1N0YXRlKiBzcCwgdWludDE2KiB3b3JkKQoreworCXVpbnQ4IG07CisJaWYgKE9KUEVHUmVhZEJ5dGUoc3AsJm0pPT0wKQorCQlyZXR1cm4oMCk7CisJKndvcmQ9KG08PDgpOworCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZtKT09MCkKKwkJcmV0dXJuKDApOworCSp3b3JkfD1tOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkQmxvY2soT0pQRUdTdGF0ZSogc3AsIHVpbnQxNiBsZW4sIHZvaWQqIG1lbSkKK3sKKwl1aW50MTYgbWxlbjsKKwl1aW50OCogbW1lbTsKKwl1aW50MTYgbjsKKwlhc3NlcnQobGVuPjApOworCW1sZW49bGVuOworCW1tZW0gPSAodWludDgqKW1lbTsJCS8vIGFkZCAodWludDgqKSBjYXN0CisJZG8KKwl7CisJCWlmIChzcC0+aW5fYnVmZmVyX3RvZ289PTApCisJCXsKKwkJCWlmIChPSlBFR1JlYWRCdWZmZXJGaWxsKHNwKT09MCkKKwkJCQlyZXR1cm4oMCk7CisJCQlhc3NlcnQoc3AtPmluX2J1ZmZlcl90b2dvPjApOworCQl9CisJCW49bWxlbjsKKwkJaWYgKG4+c3AtPmluX2J1ZmZlcl90b2dvKQorCQkJbj1zcC0+aW5fYnVmZmVyX3RvZ287CisJCV9USUZGbWVtY3B5KG1tZW0sc3AtPmluX2J1ZmZlcl9jdXIsbik7CisJCXNwLT5pbl9idWZmZXJfY3VyKz1uOworCQlzcC0+aW5fYnVmZmVyX3RvZ28tPW47CisJCW1sZW4tPW47CisJCW1tZW0rPW47CisJfSB3aGlsZShtbGVuPjApOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHUmVhZFNraXAoT0pQRUdTdGF0ZSogc3AsIHVpbnQxNiBsZW4pCit7CisJdWludDE2IG07CisJdWludDE2IG47CisJbT1sZW47CisJbj1tOworCWlmIChuPnNwLT5pbl9idWZmZXJfdG9nbykKKwkJbj1zcC0+aW5fYnVmZmVyX3RvZ287CisJc3AtPmluX2J1ZmZlcl9jdXIrPW47CisJc3AtPmluX2J1ZmZlcl90b2dvLT1uOworCW0tPW47CisJaWYgKG0+MCkKKwl7CisJCWFzc2VydChzcC0+aW5fYnVmZmVyX3RvZ289PTApOworCQluPW07CisJCWlmICgodWludDY0KW4+c3AtPmluX2J1ZmZlcl9maWxlX3RvZ28pCisJCQluPSh1aW50MTYpc3AtPmluX2J1ZmZlcl9maWxlX3RvZ287CisJCXNwLT5pbl9idWZmZXJfZmlsZV9wb3MrPW47CisJCXNwLT5pbl9idWZmZXJfZmlsZV90b2dvLT1uOworCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zX2xvZz0wOworCQkvKiB3ZSBkb24ndCBza2lwIHBhc3QganBlZ2ludGVyY2hhbmdlZm9ybWF0L3N0cmlsZSBibG9jay4uLgorCQkgKiBpZiB0aGF0IGlzIGFza2VkIGZyb20gdXMsIHdlJ3JlIGRlYWxpbmcgd2l0aCB0b3RhbGx5IGJhenVyaworCQkgKiBkYXRhIGFueXdheSwgYW5kIHdlJ3ZlIG5vdCBzZWVuIHRoaXMgaGFwcGVuaW5nIG9uIGFueQorCQkgKiB0ZXN0ZmlsZSwgc28gd2UgbWlnaHQgYXMgd2VsbCBsaWtlbHkgY2F1c2Ugc29tZSBvdGhlcgorCQkgKiBtZWFuaW5nbGVzcyBlcnJvciB0byBiZSBwYXNzZWQgYXQgc29tZSBsYXRlciB0aW1lCisJCSAqLworCX0KK30KKworc3RhdGljIGludAorT0pQRUdXcml0ZVN0cmVhbShUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCSpsZW49MDsKKwlkbworCXsKKwkJYXNzZXJ0KHNwLT5vdXRfc3RhdGU8PW9zb3NFb2kpOworCQlzd2l0Y2goc3AtPm91dF9zdGF0ZSkKKwkJeworCQkJY2FzZSBvc29zU29pOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1Tb2kodGlmLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zUVRhYmxlMDoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtUVRhYmxlKHRpZiwwLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zUVRhYmxlMToKKwkJCQlPSlBFR1dyaXRlU3RyZWFtUVRhYmxlKHRpZiwxLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zUVRhYmxlMjoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtUVRhYmxlKHRpZiwyLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zUVRhYmxlMzoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtUVRhYmxlKHRpZiwzLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zRGNUYWJsZTA6CisJCQkJT0pQRUdXcml0ZVN0cmVhbURjVGFibGUodGlmLDAsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NEY1RhYmxlMToKKwkJCQlPSlBFR1dyaXRlU3RyZWFtRGNUYWJsZSh0aWYsMSxtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0RjVGFibGUyOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1EY1RhYmxlKHRpZiwyLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zRGNUYWJsZTM6CisJCQkJT0pQRUdXcml0ZVN0cmVhbURjVGFibGUodGlmLDMsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NBY1RhYmxlMDoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtQWNUYWJsZSh0aWYsMCxtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0FjVGFibGUxOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1BY1RhYmxlKHRpZiwxLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zQWNUYWJsZTI6CisJCQkJT0pQRUdXcml0ZVN0cmVhbUFjVGFibGUodGlmLDIsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NBY1RhYmxlMzoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtQWNUYWJsZSh0aWYsMyxtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0RyaToKKwkJCQlPSlBFR1dyaXRlU3RyZWFtRHJpKHRpZixtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc1NvZjoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtU29mKHRpZixtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc1NvczoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtU29zKHRpZixtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0NvbXByZXNzZWQ6CisJCQkJaWYgKE9KUEVHV3JpdGVTdHJlYW1Db21wcmVzc2VkKHRpZixtZW0sbGVuKT09MCkKKwkJCQkJcmV0dXJuKDApOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zUnN0OgorCQkJCU9KUEVHV3JpdGVTdHJlYW1Sc3QodGlmLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zRW9pOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1Fb2kodGlmLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoKmxlbj09MCk7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbVNvaShUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCWFzc2VydChPSlBFR19CVUZGRVI+PTIpOworCXNwLT5vdXRfYnVmZmVyWzBdPTI1NTsKKwlzcC0+b3V0X2J1ZmZlclsxXT1KUEVHX01BUktFUl9TT0k7CisJKmxlbj0yOworCSptZW09KHZvaWQqKXNwLT5vdXRfYnVmZmVyOworCXNwLT5vdXRfc3RhdGUrKzsKK30KKworc3RhdGljIHZvaWQKK09KUEVHV3JpdGVTdHJlYW1RVGFibGUoVElGRiogdGlmLCB1aW50OCB0YWJsZV9pbmRleCwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJaWYgKHNwLT5xdGFibGVbdGFibGVfaW5kZXhdIT0wKQorCXsKKwkJKm1lbT0odm9pZCopKHNwLT5xdGFibGVbdGFibGVfaW5kZXhdK3NpemVvZih1aW50MzIpKTsKKwkJKmxlbj0qKCh1aW50MzIqKXNwLT5xdGFibGVbdGFibGVfaW5kZXhdKS1zaXplb2YodWludDMyKTsKKwl9CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbURjVGFibGUoVElGRiogdGlmLCB1aW50OCB0YWJsZV9pbmRleCwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJaWYgKHNwLT5kY3RhYmxlW3RhYmxlX2luZGV4XSE9MCkKKwl7CisJCSptZW09KHZvaWQqKShzcC0+ZGN0YWJsZVt0YWJsZV9pbmRleF0rc2l6ZW9mKHVpbnQzMikpOworCQkqbGVuPSooKHVpbnQzMiopc3AtPmRjdGFibGVbdGFibGVfaW5kZXhdKS1zaXplb2YodWludDMyKTsKKwl9CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbUFjVGFibGUoVElGRiogdGlmLCB1aW50OCB0YWJsZV9pbmRleCwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJaWYgKHNwLT5hY3RhYmxlW3RhYmxlX2luZGV4XSE9MCkKKwl7CisJCSptZW09KHZvaWQqKShzcC0+YWN0YWJsZVt0YWJsZV9pbmRleF0rc2l6ZW9mKHVpbnQzMikpOworCQkqbGVuPSooKHVpbnQzMiopc3AtPmFjdGFibGVbdGFibGVfaW5kZXhdKS1zaXplb2YodWludDMyKTsKKwl9CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbURyaShUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCWFzc2VydChPSlBFR19CVUZGRVI+PTYpOworCWlmIChzcC0+cmVzdGFydF9pbnRlcnZhbCE9MCkKKwl7CisJCXNwLT5vdXRfYnVmZmVyWzBdPTI1NTsKKwkJc3AtPm91dF9idWZmZXJbMV09SlBFR19NQVJLRVJfRFJJOworCQlzcC0+b3V0X2J1ZmZlclsyXT0wOworCQlzcC0+b3V0X2J1ZmZlclszXT00OworCQlzcC0+b3V0X2J1ZmZlcls0XT0oc3AtPnJlc3RhcnRfaW50ZXJ2YWw+PjgpOworCQlzcC0+b3V0X2J1ZmZlcls1XT0oc3AtPnJlc3RhcnRfaW50ZXJ2YWwmMjU1KTsKKwkJKmxlbj02OworCQkqbWVtPSh2b2lkKilzcC0+b3V0X2J1ZmZlcjsKKwl9CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbVNvZihUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQ4IG07CisJYXNzZXJ0KE9KUEVHX0JVRkZFUj49Mis4K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMyk7CisJYXNzZXJ0KDI1NT49OCtzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjMpOworCXNwLT5vdXRfYnVmZmVyWzBdPTI1NTsKKwlzcC0+b3V0X2J1ZmZlclsxXT1zcC0+c29mX21hcmtlcl9pZDsKKwkvKiBMZiAqLworCXNwLT5vdXRfYnVmZmVyWzJdPTA7CisJc3AtPm91dF9idWZmZXJbM109OCtzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjM7CisJLyogUCAqLworCXNwLT5vdXRfYnVmZmVyWzRdPTg7CisJLyogWSAqLworCXNwLT5vdXRfYnVmZmVyWzVdPShzcC0+c29mX3k+PjgpOworCXNwLT5vdXRfYnVmZmVyWzZdPShzcC0+c29mX3kmMjU1KTsKKwkvKiBYICovCisJc3AtPm91dF9idWZmZXJbN109KHNwLT5zb2ZfeD4+OCk7CisJc3AtPm91dF9idWZmZXJbOF09KHNwLT5zb2ZfeCYyNTUpOworCS8qIE5mICovCisJc3AtPm91dF9idWZmZXJbOV09c3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZTsKKwlmb3IgKG09MDsgbTxzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lOyBtKyspCisJeworCQkvKiBDICovCisJCXNwLT5vdXRfYnVmZmVyWzEwK20qM109c3AtPnNvZl9jW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K21dOworCQkvKiBIIGFuZCBWICovCisJCXNwLT5vdXRfYnVmZmVyWzEwK20qMysxXT1zcC0+c29mX2h2W3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K21dOworCQkvKiBUcSAqLworCQlzcC0+b3V0X2J1ZmZlclsxMCttKjMrMl09c3AtPnNvZl90cVtzcC0+cGxhbmVfc2FtcGxlX29mZnNldCttXTsKKwl9CisJKmxlbj0xMCtzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjM7CisJKm1lbT0odm9pZCopc3AtPm91dF9idWZmZXI7CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbVNvcyhUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQ4IG07CisJYXNzZXJ0KE9KUEVHX0JVRkZFUj49Mis2K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMik7CisJYXNzZXJ0KDI1NT49NitzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjIpOworCXNwLT5vdXRfYnVmZmVyWzBdPTI1NTsKKwlzcC0+b3V0X2J1ZmZlclsxXT1KUEVHX01BUktFUl9TT1M7CisJLyogTHMgKi8KKwlzcC0+b3V0X2J1ZmZlclsyXT0wOworCXNwLT5vdXRfYnVmZmVyWzNdPTYrc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSoyOworCS8qIE5zICovCisJc3AtPm91dF9idWZmZXJbNF09c3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZTsKKwlmb3IgKG09MDsgbTxzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lOyBtKyspCisJeworCQkvKiBDcyAqLworCQlzcC0+b3V0X2J1ZmZlcls1K20qMl09c3AtPnNvc19jc1tzcC0+cGxhbmVfc2FtcGxlX29mZnNldCttXTsKKwkJLyogVGQgYW5kIFRhICovCisJCXNwLT5vdXRfYnVmZmVyWzUrbSoyKzFdPXNwLT5zb3NfdGRhW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K21dOworCX0KKwkvKiBTcyAqLworCXNwLT5vdXRfYnVmZmVyWzUrc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSoyXT0wOworCS8qIFNlICovCisJc3AtPm91dF9idWZmZXJbNStzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjIrMV09NjM7CisJLyogQWggYW5kIEFsICovCisJc3AtPm91dF9idWZmZXJbNStzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjIrMl09MDsKKwkqbGVuPTgrc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSoyOworCSptZW09KHZvaWQqKXNwLT5vdXRfYnVmZmVyOworCXNwLT5vdXRfc3RhdGUrKzsKK30KKworc3RhdGljIGludAorT0pQRUdXcml0ZVN0cmVhbUNvbXByZXNzZWQoVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlpZiAoc3AtPmluX2J1ZmZlcl90b2dvPT0wKQorCXsKKwkJaWYgKE9KUEVHUmVhZEJ1ZmZlckZpbGwoc3ApPT0wKQorCQkJcmV0dXJuKDApOworCQlhc3NlcnQoc3AtPmluX2J1ZmZlcl90b2dvPjApOworCX0KKwkqbGVuPXNwLT5pbl9idWZmZXJfdG9nbzsKKwkqbWVtPSh2b2lkKilzcC0+aW5fYnVmZmVyX2N1cjsKKwlzcC0+aW5fYnVmZmVyX3RvZ289MDsKKwlpZiAoc3AtPmluX2J1ZmZlcl9maWxlX3RvZ289PTApCisJeworCQlzd2l0Y2goc3AtPmluX2J1ZmZlcl9zb3VyY2UpCisJCXsKKwkJCWNhc2Ugb3NpYnNTdHJpbGU6CisJCQkJaWYgKHNwLT5pbl9idWZmZXJfbmV4dF9zdHJpbGU8c3AtPmluX2J1ZmZlcl9zdHJpbGVfY291bnQpCisJCQkJCXNwLT5vdXRfc3RhdGU9b3Nvc1JzdDsKKwkJCQllbHNlCisJCQkJCXNwLT5vdXRfc3RhdGU9b3Nvc0VvaTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3NpYnNFb2Y6CisJCQkJc3AtPm91dF9zdGF0ZT1vc29zRW9pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtUnN0KFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJYXNzZXJ0KE9KUEVHX0JVRkZFUj49Mik7CisJc3AtPm91dF9idWZmZXJbMF09MjU1OworCXNwLT5vdXRfYnVmZmVyWzFdPUpQRUdfTUFSS0VSX1JTVDArc3AtPnJlc3RhcnRfaW5kZXg7CisJc3AtPnJlc3RhcnRfaW5kZXgrKzsKKwlpZiAoc3AtPnJlc3RhcnRfaW5kZXg9PTgpCisJCXNwLT5yZXN0YXJ0X2luZGV4PTA7CisJKmxlbj0yOworCSptZW09KHZvaWQqKXNwLT5vdXRfYnVmZmVyOworCXNwLT5vdXRfc3RhdGU9b3Nvc0NvbXByZXNzZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtRW9pKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJYXNzZXJ0KE9KUEVHX0JVRkZFUj49Mik7CisJc3AtPm91dF9idWZmZXJbMF09MjU1OworCXNwLT5vdXRfYnVmZmVyWzFdPUpQRUdfTUFSS0VSX0VPSTsKKwkqbGVuPTI7CisJKm1lbT0odm9pZCopc3AtPm91dF9idWZmZXI7Cit9CisKKyNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorc3RhdGljIGludAoranBlZ19jcmVhdGVfZGVjb21wcmVzc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pCit7CisJcmV0dXJuKFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpPzA6KGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoY2luZm8pLDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIExJQkpQRUdfRU5DQVBfRVhURVJOQUwKK3N0YXRpYyBpbnQKK2pwZWdfcmVhZF9oZWFkZXJfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB1aW50OCByZXF1aXJlX2ltYWdlKQoreworCXJldHVybihTRVRKTVAoc3AtPmV4aXRfam1wYnVmKT8wOihqcGVnX3JlYWRfaGVhZGVyKGNpbmZvLHJlcXVpcmVfaW1hZ2UpLDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIExJQkpQRUdfRU5DQVBfRVhURVJOQUwKK3N0YXRpYyBpbnQKK2pwZWdfc3RhcnRfZGVjb21wcmVzc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pCit7CisJcmV0dXJuKFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpPzA6KGpwZWdfc3RhcnRfZGVjb21wcmVzcyhjaW5mbyksMSkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorc3RhdGljIGludAoranBlZ19yZWFkX3NjYW5saW5lc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHZvaWQqIHNjYW5saW5lcywgdWludDMyIG1heF9saW5lcykKK3sKKwlyZXR1cm4oU0VUSk1QKHNwLT5leGl0X2ptcGJ1Zik/MDooanBlZ19yZWFkX3NjYW5saW5lcyhjaW5mbyxzY2FubGluZXMsbWF4X2xpbmVzKSwxKSk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMCitzdGF0aWMgaW50CitqcGVnX3JlYWRfcmF3X2RhdGFfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB2b2lkKiBkYXRhLCB1aW50MzIgbWF4X2xpbmVzKQoreworCXJldHVybihTRVRKTVAoc3AtPmV4aXRfam1wYnVmKT8wOihqcGVnX3JlYWRfcmF3X2RhdGEoY2luZm8sZGF0YSxtYXhfbGluZXMpLDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIExJQkpQRUdfRU5DQVBfRVhURVJOQUwKK3N0YXRpYyB2b2lkCitqcGVnX2VuY2FwX3Vud2luZChUSUZGKiB0aWYpCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJTE9OR0pNUChzcC0+ZXhpdF9qbXBidWYsMSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK09KUEVHTGlianBlZ0pwZWdFcnJvck1nck91dHB1dE1lc3NhZ2UoanBlZ19jb21tb25fc3RydWN0KiBjaW5mbykKK3sKKwljaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOworCSgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLGJ1ZmZlcik7CisJVElGRldhcm5pbmdFeHQoKChUSUZGKikoY2luZm8tPmNsaWVudF9kYXRhKSktPnRpZl9jbGllbnRkYXRhLCJMaWJKcGVnIiwiJXMiLGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR0xpYmpwZWdKcGVnRXJyb3JNZ3JFcnJvckV4aXQoanBlZ19jb21tb25fc3RydWN0KiBjaW5mbykKK3sKKwljaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOworCSgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLGJ1ZmZlcik7CisJVElGRkVycm9yRXh0KCgoVElGRiopKGNpbmZvLT5jbGllbnRfZGF0YSkpLT50aWZfY2xpZW50ZGF0YSwiTGliSnBlZyIsIiVzIixidWZmZXIpOworCWpwZWdfZW5jYXBfdW53aW5kKChUSUZGKikoY2luZm8tPmNsaWVudF9kYXRhKSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdySW5pdFNvdXJjZShqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykKK3sKKwkodm9pZCljaW5mbzsKK30KKworc3RhdGljIGJvb2xlYW4KK09KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JGaWxsSW5wdXRCdWZmZXIoanBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pCit7CisJVElGRiogdGlmPShUSUZGKiljaW5mby0+Y2xpZW50X2RhdGE7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdm9pZCogbWVtPTA7CisJdWludDMyIGxlbj0wVTsKKwlpZiAoT0pQRUdXcml0ZVN0cmVhbSh0aWYsJm1lbSwmbGVuKT09MCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCJMaWJKcGVnIiwiUHJlbWF0dXJlIGVuZCBvZiBKUEVHIGRhdGEiKTsKKwkJanBlZ19lbmNhcF91bndpbmQodGlmKTsKKwl9CisJc3AtPmxpYmpwZWdfanBlZ19zb3VyY2VfbWdyLmJ5dGVzX2luX2J1ZmZlciA9IGxlbjsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IubmV4dF9pbnB1dF9ieXRlID0gKGNvbnN0IEpPQ1RFVCAqICltZW07CQkvLyBhZGQgKGNvbnN0IEpPQ1RFVCAqICkgY2FzdAorCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JTa2lwSW5wdXREYXRhKGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBsb25nIG51bV9ieXRlcykKK3sKKwlUSUZGKiB0aWY9KFRJRkYqKWNpbmZvLT5jbGllbnRfZGF0YTsKKwkodm9pZCludW1fYnl0ZXM7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIkxpYkpwZWciLCJVbmV4cGVjdGVkIGVycm9yIik7CisJanBlZ19lbmNhcF91bndpbmQodGlmKTsKK30KKworc3RhdGljIGJvb2xlYW4KK09KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JSZXN5bmNUb1Jlc3RhcnQoanBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIGludCBkZXNpcmVkKQoreworCVRJRkYqIHRpZj0oVElGRiopY2luZm8tPmNsaWVudF9kYXRhOworCSh2b2lkKWRlc2lyZWQ7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIkxpYkpwZWciLCJVbmV4cGVjdGVkIGVycm9yIik7CisJanBlZ19lbmNhcF91bndpbmQodGlmKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyVGVybVNvdXJjZShqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykKK3sKKwkodm9pZCljaW5mbzsKK30KKworI2VuZGlmCisKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmLy8jaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfb3Blbi5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZThkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9vcGVuLmMKQEAgLTAsMCArMSw3MjggQEAKKy8qICRJZDogdGlmX29wZW4uYyx2IDEuNDYgMjAxMC0xMi0wNiAxNjo1NDo1NCBmYXhndXkgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIER1bW15IGZ1bmN0aW9ucyB0byBmaWxsIHRoZSBvbWl0dGVkIGNsaWVudCBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgaW50CitfdGlmZkR1bW15TWFwUHJvYyh0aGFuZGxlX3QgZmQsIHZvaWQqKiBwYmFzZSwgdG9mZl90KiBwc2l6ZSkKK3sKKwkodm9pZCkgZmQ7ICh2b2lkKSBwYmFzZTsgKHZvaWQpIHBzaXplOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitfdGlmZkR1bW15VW5tYXBQcm9jKHRoYW5kbGVfdCBmZCwgdm9pZCogYmFzZSwgdG9mZl90IHNpemUpCit7CisJKHZvaWQpIGZkOyAodm9pZCkgYmFzZTsgKHZvaWQpIHNpemU7Cit9CisKK2ludAorX1RJRkZnZXRNb2RlKGNvbnN0IGNoYXIqIG1vZGUsIGNvbnN0IGNoYXIqIG1vZHVsZSkKK3sKKwlpbnQgbSA9IC0xOworCisJc3dpdGNoIChtb2RlWzBdKSB7CisJY2FzZSAncic6CisJCW0gPSBPX1JET05MWTsKKwkJaWYgKG1vZGVbMV0gPT0gJysnKQorCQkJbSA9IE9fUkRXUjsKKwkJYnJlYWs7CisJY2FzZSAndyc6CisJY2FzZSAnYSc6CisJCW0gPSBPX1JEV1J8T19DUkVBVDsKKwkJaWYgKG1vZGVbMF0gPT0gJ3cnKQorCQkJbSB8PSBPX1RSVU5DOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQoMCwgbW9kdWxlLCAiXCIlc1wiOiBCYWQgbW9kZSIsIG1vZGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIChtKTsKK30KKworVElGRioKK1RJRkZDbGllbnRPcGVuKAorCWNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIG1vZGUsCisJdGhhbmRsZV90IGNsaWVudGRhdGEsCisJVElGRlJlYWRXcml0ZVByb2MgcmVhZHByb2MsCisJVElGRlJlYWRXcml0ZVByb2Mgd3JpdGVwcm9jLAorCVRJRkZTZWVrUHJvYyBzZWVrcHJvYywKKwlUSUZGQ2xvc2VQcm9jIGNsb3NlcHJvYywKKwlUSUZGU2l6ZVByb2Mgc2l6ZXByb2MsCisJVElGRk1hcEZpbGVQcm9jIG1hcHByb2MsCisJVElGRlVubWFwRmlsZVByb2MgdW5tYXBwcm9jCispCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkNsaWVudE9wZW4iOworCVRJRkYgKnRpZjsKKwlpbnQgbTsKKwljb25zdCBjaGFyKiBjcDsKKworCS8qIFRoZSBmb2xsb3dpbmcgYXJlIGNvbmZpZ3VyYXRpb24gY2hlY2tzLiBUaGV5IHNob3VsZCBiZSByZWR1bmRhbnQsIGJ1dCBzaG91bGQgbm90CisJICogY29tcGlsZSB0byBhbnkgYWN0dWFsIGNvZGUgaW4gYW4gb3B0aW1pc2VkIHJlbGVhc2UgYnVpbGQgYW55d2F5LiBJZiBhbnkgb2YgdGhlbQorCSAqIGZhaWwsIChtYWtlZmlsZS1iYXNlZCBvciBvdGhlcikgY29uZmlndXJhdGlvbiBpcyBub3QgY29ycmVjdCAqLworCWFzc2VydChzaXplb2YodWludDgpPT0xKTsKKwlhc3NlcnQoc2l6ZW9mKGludDgpPT0xKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQxNik9PTIpOworCWFzc2VydChzaXplb2YoaW50MTYpPT0yKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWFzc2VydChzaXplb2YoaW50MzIpPT00KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydChzaXplb2YoaW50NjQpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHRtc2l6ZV90KT09c2l6ZW9mKHZvaWQqKSk7CisJeworCQl1bmlvbnsKKwkJCXVpbnQ4IGE4WzJdOworCQkJdWludDE2IGExNjsKKwkJfSBuOworCQluLmE4WzBdPTE7CisJCW4uYThbMV09MDsKKwkJI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCQlhc3NlcnQobi5hMTY9PTI1Nik7CisJCSNlbHNlCisJCWFzc2VydChuLmExNj09MSk7CisJCSNlbmRpZgorCX0KKworCW0gPSBfVElGRmdldE1vZGUobW9kZSwgbW9kdWxlKTsKKwlpZiAobSA9PSAtMSkKKwkJZ290byBiYWQyOworCXRpZiA9IChUSUZGICopX1RJRkZtYWxsb2MoKHRtc2l6ZV90KShzaXplb2YgKFRJRkYpICsgc3RybGVuKG5hbWUpICsgMSkpOworCWlmICh0aWYgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQoY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXM6IE91dCBvZiBtZW1vcnkgKFRJRkYgc3RydWN0dXJlKSIsIG5hbWUpOworCQlnb3RvIGJhZDI7CisJfQorCV9USUZGbWVtc2V0KHRpZiwgMCwgc2l6ZW9mICgqdGlmKSk7CisJdGlmLT50aWZfbmFtZSA9IChjaGFyICopdGlmICsgc2l6ZW9mIChUSUZGKTsKKwlzdHJjcHkodGlmLT50aWZfbmFtZSwgbmFtZSk7CisJdGlmLT50aWZfbW9kZSA9IG0gJn4gKE9fQ1JFQVR8T19UUlVOQyk7CisJdGlmLT50aWZfY3VyZGlyID0gKHVpbnQxNikgLTE7CQkvKiBub24tZXhpc3RlbnQgZGlyZWN0b3J5ICovCisJdGlmLT50aWZfY3Vyb2ZmID0gMDsKKwl0aWYtPnRpZl9jdXJzdHJpcCA9ICh1aW50MzIpIC0xOwkvKiBpbnZhbGlkIHN0cmlwICovCisJdGlmLT50aWZfcm93ID0gKHVpbnQzMikgLTE7CQkvKiByZWFkL3dyaXRlIHByZS1pbmNyZW1lbnQgKi8KKwl0aWYtPnRpZl9jbGllbnRkYXRhID0gY2xpZW50ZGF0YTsKKwlpZiAoIXJlYWRwcm9jIHx8ICF3cml0ZXByb2MgfHwgIXNlZWtwcm9jIHx8ICFjbG9zZXByb2MgfHwgIXNpemVwcm9jKSB7CisJCVRJRkZFcnJvckV4dChjbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiT25lIG9mIHRoZSBjbGllbnQgcHJvY2VkdXJlcyBpcyBOVUxMIHBvaW50ZXIuIik7CisJCWdvdG8gYmFkMjsKKwl9CisJdGlmLT50aWZfcmVhZHByb2MgPSByZWFkcHJvYzsKKwl0aWYtPnRpZl93cml0ZXByb2MgPSB3cml0ZXByb2M7CisJdGlmLT50aWZfc2Vla3Byb2MgPSBzZWVrcHJvYzsKKwl0aWYtPnRpZl9jbG9zZXByb2MgPSBjbG9zZXByb2M7CisJdGlmLT50aWZfc2l6ZXByb2MgPSBzaXplcHJvYzsKKwlpZiAobWFwcHJvYykKKwkJdGlmLT50aWZfbWFwcHJvYyA9IG1hcHByb2M7CisJZWxzZQorCQl0aWYtPnRpZl9tYXBwcm9jID0gX3RpZmZEdW1teU1hcFByb2M7CisJaWYgKHVubWFwcHJvYykKKwkJdGlmLT50aWZfdW5tYXBwcm9jID0gdW5tYXBwcm9jOworCWVsc2UKKwkJdGlmLT50aWZfdW5tYXBwcm9jID0gX3RpZmZEdW1teVVubWFwUHJvYzsKKwlfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKHRpZik7ICAgIC8qIHNldHVwIGRlZmF1bHQgc3RhdGUgKi8KKwkvKgorCSAqIERlZmF1bHQgaXMgdG8gcmV0dXJuIGRhdGEgTVNCMkxTQiBhbmQgZW5hYmxlIHRoZQorCSAqIHVzZSBvZiBtZW1vcnktbWFwcGVkIGZpbGVzIGFuZCBzdHJpcCBjaG9wcGluZyB3aGVuCisJICogYSBmaWxlIGlzIG9wZW5lZCByZWFkLW9ubHkuCisJICovCisJdGlmLT50aWZfZmxhZ3MgPSBGSUxMT1JERVJfTVNCMkxTQjsKKwlpZiAobSA9PSBPX1JET05MWSApCisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTUFQUEVEOworCisJI2lmZGVmIFNUUklQQ0hPUF9ERUZBVUxUCisJaWYgKG0gPT0gT19SRE9OTFkgfHwgbSA9PSBPX1JEV1IpCisJCXRpZi0+dGlmX2ZsYWdzIHw9IFNUUklQQ0hPUF9ERUZBVUxUOworCSNlbmRpZgorCisJLyoKKwkgKiBQcm9jZXNzIGxpYnJhcnktc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIG9wZW4gbW9kZSBzdHJpbmcuCisJICogVGhlIGZvbGxvd2luZyBmbGFncyBtYXkgYmUgdXNlZCB0byBjb250cm9sIGludHJpbnNpYyBsaWJyYXJ5CisJICogYmVoYXZpb3VyIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgZGVzaXJhYmxlICh1c3VhbGx5IGZvcgorCSAqIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIGFwcGxpY2F0aW9uIHRoYXQgY2xhaW1zIHRvIHN1cHBvcnQKKwkgKiBUSUZGIGJ1dCBvbmx5IHN1cHBvcnRzIHNvbWUgYnJhaW5kZWFkIGlkZWEgb2Ygd2hhdCB0aGUKKwkgKiB2ZW5kb3IgdGhpbmtzIFRJRkYgaXMpOgorCSAqCisJICogJ2wnIHVzZSBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIgZm9yIGNyZWF0aW5nIGEgZmlsZQorCSAqICdiJyB1c2UgYmlnLWVuZGlhbiBieXRlIG9yZGVyIGZvciBjcmVhdGluZyBhIGZpbGUKKwkgKiAnTCcgcmVhZC93cml0ZSBpbmZvcm1hdGlvbiB1c2luZyBMU0IyTVNCIGJpdCBvcmRlcgorCSAqICdCJyByZWFkL3dyaXRlIGluZm9ybWF0aW9uIHVzaW5nIE1TQjJMU0IgYml0IG9yZGVyCisJICogJ0gnIHJlYWQvd3JpdGUgaW5mb3JtYXRpb24gdXNpbmcgaG9zdCBiaXQgb3JkZXIKKwkgKiAnTScgZW5hYmxlIHVzZSBvZiBtZW1vcnktbWFwcGVkIGZpbGVzIHdoZW4gc3VwcG9ydGVkCisJICogJ20nIGRpc2FibGUgdXNlIG9mIG1lbW9yeS1tYXBwZWQgZmlsZXMKKwkgKiAnQycgZW5hYmxlIHN0cmlwIGNob3BwaW5nIHN1cHBvcnQgd2hlbiByZWFkaW5nCisJICogJ2MnIGRpc2FibGUgc3RyaXAgY2hvcHBpbmcgc3VwcG9ydAorCSAqICdoJyByZWFkIFRJRkYgaGVhZGVyIG9ubHksIGRvIG5vdCBsb2FkIHRoZSBmaXJzdCBJRkQKKwkgKiAnNCcgQ2xhc3NpY1RJRkYgZm9yIGNyZWF0aW5nIGEgZmlsZSAoZGVmYXVsdCkKKwkgKiAnOCcgQmlnVElGRiBmb3IgY3JlYXRpbmcgYSBmaWxlCisJICoKKwkgKiBUaGUgdXNlIG9mIHRoZSAnbCcgYW5kICdiJyBmbGFncyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZC4KKwkgKiBUaGVzZSBmbGFncyBhcmUgcHJvdmlkZWQgc29sZWx5IGJlY2F1c2UgbnVtZXJvdXMgdmVuZG9ycywKKwkgKiB0eXBpY2FsbHkgb24gdGhlIFBDLCBkbyBub3QgY29ycmVjdGx5IHN1cHBvcnQgVElGRjsgdGhleQorCSAqIG9ubHkgc3VwcG9ydCB0aGUgSW50ZWwgbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLiAgVGhpcworCSAqIHN1cHBvcnQgaXMgbm90IGNvbmZpZ3VyZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IHN1cHBvcnRzCisJICogdGhlIHZpb2xhdGlvbiBvZiB0aGUgVElGRiBzcGVjIHRoYXQgc2F5cyB0aGF0IHJlYWRlcnMgKk1VU1QqCisJICogc3VwcG9ydCBib3RoIGJ5dGUgb3JkZXJzLiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdAorCSAqIHlvdSBub3QgdXNlIHRoaXMgZmVhdHVyZSBleGNlcHQgdG8gZGVhbCB3aXRoIGJ1c3RlZCBhcHBzCisJICogdGhhdCB3cml0ZSBpbnZhbGlkIFRJRkYuICBBbmQgZXZlbiBpbiB0aG9zZSBjYXNlcyB5b3Ugc2hvdWxkCisJICogYmFuZyBvbiB0aGUgdmVuZG9ycyB0byBmaXggdGhlaXIgc29mdHdhcmUuCisJICoKKwkgKiBUaGUgJ0wnLCAnQicsIGFuZCAnSCcgZmxhZ3MgYXJlIGludGVuZGVkIGZvciBhcHBsaWNhdGlvbnMKKwkgKiB0aGF0IGNhbiBvcHRpbWl6ZSBvcGVyYXRpb25zIG9uIGRhdGEgYnkgdXNpbmcgYSBwYXJ0aWN1bGFyCisJICogYml0IG9yZGVyLiAgQnkgZGVmYXVsdCB0aGUgbGlicmFyeSByZXR1cm5zIGRhdGEgaW4gTVNCMkxTQgorCSAqIGJpdCBvcmRlciBmb3IgY29tcGF0aWJpbHRpeSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMKKwkgKiBsaWJyYXJ5LiAgUmV0dXJuaW5nIGRhdGEgaW4gdGhlIGJpdCBvcmRlciBvZiB0aGUgbmF0aXZlIGNwdQorCSAqIG1ha2VzIHRoZSBtb3N0IHNlbnNlIGJ1dCBhbHNvIHJlcXVpcmVzIGFwcGxpY2F0aW9ucyB0byBjaGVjaworCSAqIHRoZSB2YWx1ZSBvZiB0aGUgRmlsbE9yZGVyIHRhZzsgc29tZXRoaW5nIHRoZXkgcHJvYmFibHkgZG8KKwkgKiBub3QgZG8gcmlnaHQgbm93LgorCSAqCisJICogVGhlICdNJyBhbmQgJ20nIGZsYWdzIGFyZSBwcm92aWRlZCBiZWNhdXNlIHNvbWUgdmlydHVhbCBtZW1vcnkKKwkgKiBzeXN0ZW1zIGV4aGliaXQgcG9vciBiZWhhdmlvdXIgd2hlbiBsYXJnZSBpbWFnZXMgYXJlIG1hcHBlZC4KKwkgKiBUaGVzZSBvcHRpb25zIHBlcm1pdCBjbGllbnRzIHRvIGNvbnRyb2wgdGhlIHVzZSBvZiBtZW1vcnktbWFwcGVkCisJICogZmlsZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KKwkgKgorCSAqIFRoZSAnQycgYW5kICdjJyBmbGFncyBhcmUgcHJvdmlkZWQgYmVjYXVzZSB0aGUgbGlicmFyeSBzdXBwb3J0CisJICogZm9yIGNob3BwaW5nIHVwIGxhcmdlIHN0cmlwcyBpbnRvIG11bHRpcGxlIHNtYWxsZXIgc3RyaXBzIGlzIG5vdAorCSAqIGFwcGxpY2F0aW9uLXRyYW5zcGFyZW50IGFuZCBhcyBzdWNoIGNhbiBjYXVzZSBwcm9ibGVtcy4gIFRoZSAnYycKKwkgKiBvcHRpb24gcGVybWl0cyBhcHBsaWNhdGlvbnMgdGhhdCBvbmx5IHdhbnQgdG8gbG9vayBhdCB0aGUgdGFncywKKwkgKiBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSB1bmFkdWx0ZXJhdGVkIFRJRkYgdGFnIGluZm9ybWF0aW9uLgorCSAqLworCWZvciAoY3AgPSBtb2RlOyAqY3A7IGNwKyspCisJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlICdiJzoKKwkJCQkjaWZuZGVmIFdPUkRTX0JJR0VORElBTgorCQkJCWlmIChtJk9fQ1JFQVQpCisJCQkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfU1dBQjsKKwkJCQkjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCSNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJCQlpZiAoKG0mT19DUkVBVCkpCisJCQkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfU1dBQjsKKwkJCQkjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0InOgorCQkJCXRpZi0+dGlmX2ZsYWdzID0gKHRpZi0+dGlmX2ZsYWdzICZ+IFRJRkZfRklMTE9SREVSKSB8CisJCQkJICAgIEZJTExPUkRFUl9NU0IyTFNCOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJdGlmLT50aWZfZmxhZ3MgPSAodGlmLT50aWZfZmxhZ3MgJn4gVElGRl9GSUxMT1JERVIpIHwKKwkJCQkgICAgRklMTE9SREVSX0xTQjJNU0I7CisJCQkJYnJlYWs7CisJCQljYXNlICdIJzoKKwkJCQl0aWYtPnRpZl9mbGFncyA9ICh0aWYtPnRpZl9mbGFncyAmfiBUSUZGX0ZJTExPUkRFUikgfAorCQkJCSAgICBIT1NUX0ZJTExPUkRFUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ00nOgorCQkJCWlmIChtID09IE9fUkRPTkxZKQorCQkJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX01BUFBFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJCWlmIChtID09IE9fUkRPTkxZKQorCQkJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9NQVBQRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdDJzoKKwkJCQlpZiAobSA9PSBPX1JET05MWSkKKwkJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9TVFJJUENIT1A7CisJCQkJYnJlYWs7CisJCQljYXNlICdjJzoKKwkJCQlpZiAobSA9PSBPX1JET05MWSkKKwkJCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfU1RSSVBDSE9QOworCQkJCWJyZWFrOworCQkJY2FzZSAnaCc6CisJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9IRUFERVJPTkxZOworCQkJCWJyZWFrOworCQkJY2FzZSAnOCc6CisJCQkJaWYgKG0mT19DUkVBVCkKKwkJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CSUdUSUZGOworCQkJCWJyZWFrOworCQl9CisJLyoKKwkgKiBSZWFkIGluIFRJRkYgaGVhZGVyLgorCSAqLworCWlmICgobSAmIE9fVFJVTkMpIHx8CisJICAgICFSZWFkT0sodGlmLCAmdGlmLT50aWZfaGVhZGVyLCBzaXplb2YgKFRJRkZIZWFkZXJDbGFzc2ljKSkpIHsKKwkJaWYgKHRpZi0+dGlmX21vZGUgPT0gT19SRE9OTFkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBuYW1lLAorCQkJICAgICJDYW5ub3QgcmVhZCBUSUZGIGhlYWRlciIpOworCQkJZ290byBiYWQ7CisJCX0KKwkJLyoKKwkJICogU2V0dXAgaGVhZGVyIGFuZCB3cml0ZS4KKwkJICovCisJCSNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljID0gdGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIKKwkJICAgID8gVElGRl9MSVRUTEVFTkRJQU4gOiBUSUZGX0JJR0VORElBTjsKKwkJI2Vsc2UKKwkJdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljID0gdGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIKKwkJICAgID8gVElGRl9CSUdFTkRJQU4gOiBUSUZGX0xJVFRMRUVORElBTjsKKwkJI2VuZGlmCisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCXRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl92ZXJzaW9uID0gVElGRl9WRVJTSU9OX0NMQVNTSUM7CisJCQl0aWYtPnRpZl9oZWFkZXIuY2xhc3NpYy50aWZmX2Rpcm9mZiA9IDA7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgmdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24pOworCQkJdGlmLT50aWZfaGVhZGVyX3NpemUgPSBzaXplb2YoVElGRkhlYWRlckNsYXNzaWMpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24gPSBUSUZGX1ZFUlNJT05fQklHOworCQkJdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX29mZnNldHNpemUgPSA4OworCQkJdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX3VudXNlZCA9IDA7CisJCQl0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmID0gMDsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCXsKKwkJCQlUSUZGU3dhYlNob3J0KCZ0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbik7CisJCQkJVElGRlN3YWJTaG9ydCgmdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX29mZnNldHNpemUpOworCQkJfQorCQkJdGlmLT50aWZfaGVhZGVyX3NpemUgPSBzaXplb2YgKFRJRkZIZWFkZXJCaWcpOworCQl9CisJCS8qCisJCSAqIFRoZSBkb2MgZm9yICJmb3BlbiIgZm9yIHNvbWUgU1REX0NfTElCcyBzYXlzIHRoYXQgaWYgeW91CisJCSAqIG9wZW4gYSBmaWxlIGZvciBtb2RpZnkgKCIrIiksIHRoZW4geW91IG11c3QgZnNlZWsgKG9yCisJCSAqIGZmbHVzaD8pIGJldHdlZW4gYW55IGZyZWFkcyBhbmQgZndyaXRlcy4gIFRoaXMgaXMgbm90CisJCSAqIG5lY2Vzc2FyeSBvbiBtb3N0IHN5c3RlbXMsIGJ1dCBoYXMgYmVlbiBzaG93biB0byBiZSBuZWVkZWQKKwkJICogb24gU29sYXJpcy4KKwkJICovCisJCVRJRkZTZWVrRmlsZSggdGlmLCAwLCBTRUVLX1NFVCApOworCQlpZiAoIVdyaXRlT0sodGlmLCAmdGlmLT50aWZfaGVhZGVyLCAodG1zaXplX3QpKHRpZi0+dGlmX2hlYWRlcl9zaXplKSkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBuYW1lLAorCQkJICAgICJFcnJvciB3cml0aW5nIFRJRkYgaGVhZGVyIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQkvKgorCQkgKiBTZXR1cCB0aGUgYnl0ZSBvcmRlciBoYW5kbGluZy4KKwkJICovCisJCWlmICh0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMgPT0gVElGRl9CSUdFTkRJQU4pIHsKKwkJCSNpZm5kZWYgV09SRFNfQklHRU5ESUFOCisJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX1NXQUI7CisJCQkjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCSNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfU1dBQjsKKwkJCSNlbmRpZgorCQl9CisJCS8qCisJCSAqIFNldHVwIGRlZmF1bHQgZGlyZWN0b3J5LgorCQkgKi8KKwkJaWYgKCFUSUZGRGVmYXVsdERpcmVjdG9yeSh0aWYpKQorCQkJZ290byBiYWQ7CisJCXRpZi0+dGlmX2Rpcm9mZiA9IDA7CisJCXRpZi0+dGlmX2Rpcmxpc3QgPSBOVUxMOworCQl0aWYtPnRpZl9kaXJsaXN0c2l6ZSA9IDA7CisJCXRpZi0+dGlmX2Rpcm51bWJlciA9IDA7CisJCXJldHVybiAodGlmKTsKKwl9CisJLyoKKwkgKiBTZXR1cCB0aGUgYnl0ZSBvcmRlciBoYW5kbGluZy4KKwkgKi8KKwlpZiAodGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljICE9IFRJRkZfQklHRU5ESUFOICYmCisJICAgIHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyAhPSBUSUZGX0xJVFRMRUVORElBTgorCSAgICAjaWYgTURJX1NVUFBPUlQKKwkgICAgJiYKKwkgICAgI2lmIEhPU1RfQklHRU5ESUFOCisJICAgIHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyAhPSBNRElfQklHRU5ESUFOCisJICAgICNlbHNlCisJICAgIHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyAhPSBNRElfTElUVExFRU5ESUFOCisJICAgICNlbmRpZgorCSAgICApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG5hbWUsCisJCSAgICAiTm90IGEgVElGRiBvciBNREkgZmlsZSwgYmFkIG1hZ2ljIG51bWJlciAlZCAoMHgleCkiLAorCSAgICAjZWxzZQorCSAgICApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG5hbWUsCisJCSAgICAiTm90IGEgVElGRiBmaWxlLCBiYWQgbWFnaWMgbnVtYmVyICVkICgweCV4KSIsCisJICAgICNlbmRpZgorCQkgICAgdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljLAorCQkgICAgdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljKTsKKwkJZ290byBiYWQ7CisJfQorCWlmICh0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMgPT0gVElGRl9CSUdFTkRJQU4pIHsKKwkJI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9TV0FCOworCQkjZW5kaWYKKwl9IGVsc2UgeworCQkjaWZkZWYgV09SRFNfQklHRU5ESUFOCisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfU1dBQjsKKwkJI2VuZGlmCisJfQorCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikgCisJCVRJRkZTd2FiU2hvcnQoJnRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl92ZXJzaW9uKTsKKwlpZiAoKHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl92ZXJzaW9uICE9IFRJRkZfVkVSU0lPTl9DTEFTU0lDKSYmCisJICAgICh0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbiAhPSBUSUZGX1ZFUlNJT05fQklHKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbmFtZSwKKwkJICAgICJOb3QgYSBUSUZGIGZpbGUsIGJhZCB2ZXJzaW9uIG51bWJlciAlZCAoMHgleCkiLAorCQkgICAgdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24sCisJCSAgICB0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbik7CisJCWdvdG8gYmFkOworCX0KKwlpZiAodGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24gPT0gVElGRl9WRVJTSU9OX0NMQVNTSUMpCisJeworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJnRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmKTsKKwkJdGlmLT50aWZfaGVhZGVyX3NpemUgPSBzaXplb2YoVElGRkhlYWRlckNsYXNzaWMpOworCX0KKwllbHNlCisJeworCQlpZiAoIVJlYWRPSyh0aWYsICgodWludDgqKSgmdGlmLT50aWZfaGVhZGVyKSArIHNpemVvZihUSUZGSGVhZGVyQ2xhc3NpYykpLCAoc2l6ZW9mKFRJRkZIZWFkZXJCaWcpLXNpemVvZihUSUZGSGVhZGVyQ2xhc3NpYykpKSkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG5hbWUsCisJCQkgICAgIkNhbm5vdCByZWFkIFRJRkYgaGVhZGVyIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCXsKKwkJCVRJRkZTd2FiU2hvcnQoJnRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9vZmZzZXRzaXplKTsKKwkJCVRJRkZTd2FiTG9uZzgoJnRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmYpOworCQl9CisJCWlmICh0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfb2Zmc2V0c2l6ZSAhPSA4KQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbmFtZSwKKwkJCSAgICAiTm90IGEgVElGRiBmaWxlLCBiYWQgQmlnVElGRiBvZmZzZXRzaXplICVkICgweCV4KSIsCisJCQkgICAgdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX29mZnNldHNpemUsCisJCQkgICAgdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX29mZnNldHNpemUpOworCQkJZ290byBiYWQ7CisJCX0KKwkJaWYgKHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl91bnVzZWQgIT0gMCkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG5hbWUsCisJCQkgICAgIk5vdCBhIFRJRkYgZmlsZSwgYmFkIEJpZ1RJRkYgdW51c2VkICVkICgweCV4KSIsCisJCQkgICAgdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX3VudXNlZCwKKwkJCSAgICB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfdW51c2VkKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCXRpZi0+dGlmX2hlYWRlcl9zaXplID0gc2l6ZW9mKFRJRkZIZWFkZXJCaWcpOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0JJR1RJRkY7CisJfQorCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTVlCVUZGRVI7CisJdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhID0gMDsKKwl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IDA7CisgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOworICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID0gMDsKKworCXN3aXRjaCAobW9kZVswXSkgeworCQljYXNlICdyJzoKKwkJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCQkJdGlmLT50aWZfbmV4dGRpcm9mZiA9IHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmOworCQkJZWxzZQorCQkJCXRpZi0+dGlmX25leHRkaXJvZmYgPSB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmOworCQkJLyoKKwkJCSAqIFRyeSB0byB1c2UgYSBtZW1vcnktbWFwcGVkIGZpbGUgaWYgdGhlIGNsaWVudAorCQkJICogaGFzIG5vdCBleHBsaWNpdGx5IHN1cHByZXNzZWQgdXNhZ2Ugd2l0aCB0aGUKKwkJCSAqICdtJyBmbGFnIGluIHRoZSBvcGVuIG1vZGUgKHNlZSBhYm92ZSkuCisJCQkgKi8KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTUFQUEVEKQorCQkJeworCQkJCXRvZmZfdCBuOworCQkJCWlmIChUSUZGTWFwRmlsZUNvbnRlbnRzKHRpZiwodm9pZCoqKSgmdGlmLT50aWZfYmFzZSksJm4pKQorCQkJCXsKKwkJCQkJdGlmLT50aWZfc2l6ZT0odG1zaXplX3QpbjsKKwkJCQkJYXNzZXJ0KCh0b2ZmX3QpdGlmLT50aWZfc2l6ZT09bik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfTUFQUEVEOworCQkJfQorCQkJLyoKKwkJCSAqIFNvbWV0aW1lcyB3ZSBkbyBub3Qgd2FudCB0byByZWFkIHRoZSBmaXJzdCBkaXJlY3RvcnkgKGZvciBleGFtcGxlLAorCQkJICogaXQgbWF5IGJlIGJyb2tlbikgYW5kIHdhbnQgdG8gcHJvY2VlZCB0byBvdGhlciBkaXJlY3Rvcmllcy4gSSB0aGlzCisJCQkgKiBjYXNlIHdlIHVzZSB0aGUgVElGRl9IRUFERVJPTkxZIGZsYWcgdG8gb3BlbiBmaWxlIGFuZCByZXR1cm4KKwkJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHJlYWRpbmcgVElGRiBoZWFkZXIuCisJCQkgKi8KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfSEVBREVST05MWSkKKwkJCQlyZXR1cm4gKHRpZik7CisKKwkJCS8qCisJCQkgKiBTZXR1cCBpbml0aWFsIGRpcmVjdG9yeS4KKwkJCSAqLworCQkJaWYgKFRJRkZSZWFkRGlyZWN0b3J5KHRpZikpIHsKKwkJCQl0aWYtPnRpZl9yYXdjYyA9ICh0bXNpemVfdCktMTsKKwkJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0JVRkZFUlNFVFVQOworCQkJCXJldHVybiAodGlmKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCS8qCisJCQkgKiBOZXcgZGlyZWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kCisJCQkgKiB0byB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkgY2hhaW4gd2hlbiB0aGV5CisJCQkgKiBhcmUgd3JpdHRlbiBvdXQgKHNlZSBUSUZGV3JpdGVEaXJlY3RvcnkpLgorCQkJICovCisJCQlpZiAoIVRJRkZEZWZhdWx0RGlyZWN0b3J5KHRpZikpCisJCQkJZ290byBiYWQ7CisJCQlyZXR1cm4gKHRpZik7CisJfQorYmFkOgorCXRpZi0+dGlmX21vZGUgPSBPX1JET05MWTsJLyogWFhYIGF2b2lkIGZsdXNoICovCisgICAgICAgIFRJRkZDbGVhbnVwKHRpZik7CitiYWQyOgorCXJldHVybiAoKFRJRkYqKTApOworfQorCisvKgorICogUXVlcnkgZnVuY3Rpb25zIHRvIGFjY2VzcyBwcml2YXRlIGRhdGEuCisgKi8KKworLyoKKyAqIFJldHVybiBvcGVuIGZpbGUncyBuYW1lLgorICovCitjb25zdCBjaGFyICoKK1RJRkZGaWxlTmFtZShUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9uYW1lKTsKK30KKworLyoKKyAqIFNldCB0aGUgZmlsZSBuYW1lLgorICovCitjb25zdCBjaGFyICoKK1RJRkZTZXRGaWxlTmFtZShUSUZGKiB0aWYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciogb2xkX25hbWUgPSB0aWYtPnRpZl9uYW1lOworCXRpZi0+dGlmX25hbWUgPSAoY2hhciAqKW5hbWU7CisJcmV0dXJuIChvbGRfbmFtZSk7Cit9CisKKy8qCisgKiBSZXR1cm4gb3BlbiBmaWxlJ3MgSS9PIGRlc2NyaXB0b3IuCisgKi8KK2ludAorVElGRkZpbGVubyhUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9mZCk7Cit9CisKKy8qCisgKiBTZXQgb3BlbiBmaWxlJ3MgSS9PIGRlc2NyaXB0b3IsIGFuZCByZXR1cm4gcHJldmlvdXMgdmFsdWUuCisgKi8KK2ludAorVElGRlNldEZpbGVubyhUSUZGKiB0aWYsIGludCBmZCkKK3sKKyAgICAgICAgaW50IG9sZF9mZCA9IHRpZi0+dGlmX2ZkOworCXRpZi0+dGlmX2ZkID0gZmQ7CisJcmV0dXJuIG9sZF9mZDsKK30KKworLyoKKyAqIFJldHVybiBvcGVuIGZpbGUncyBjbGllbnRkYXRhLgorICovCit0aGFuZGxlX3QKK1RJRkZDbGllbnRkYXRhKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2NsaWVudGRhdGEpOworfQorCisvKgorICogU2V0IG9wZW4gZmlsZSdzIGNsaWVudGRhdGEsIGFuZCByZXR1cm4gcHJldmlvdXMgdmFsdWUuCisgKi8KK3RoYW5kbGVfdAorVElGRlNldENsaWVudGRhdGEoVElGRiogdGlmLCB0aGFuZGxlX3QgbmV3dmFsdWUpCit7CisJdGhhbmRsZV90IG0gPSB0aWYtPnRpZl9jbGllbnRkYXRhOworCXRpZi0+dGlmX2NsaWVudGRhdGEgPSBuZXd2YWx1ZTsKKwlyZXR1cm4gbTsKK30KKworLyoKKyAqIFJldHVybiByZWFkL3dyaXRlIG1vZGUuCisgKi8KK2ludAorVElGRkdldE1vZGUoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfbW9kZSk7Cit9CisKKy8qCisgKiBSZXR1cm4gcmVhZC93cml0ZSBtb2RlLgorICovCitpbnQKK1RJRkZTZXRNb2RlKFRJRkYqIHRpZiwgaW50IG1vZGUpCit7CisJaW50IG9sZF9tb2RlID0gdGlmLT50aWZfbW9kZTsKKwl0aWYtPnRpZl9tb2RlID0gbW9kZTsKKwlyZXR1cm4gKG9sZF9tb2RlKTsKK30KKworLyoKKyAqIFJldHVybiBub256ZXJvIGlmIGZpbGUgaXMgb3JnYW5pemVkIGluCisgKiB0aWxlczsgemVybyBpZiBvcmdhbml6ZWQgYXMgc3RyaXBzLgorICovCitpbnQKK1RJRkZJc1RpbGVkKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKGlzVGlsZWQodGlmKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gY3VycmVudCByb3cgYmVpbmcgcmVhZC93cml0dGVuLgorICovCit1aW50MzIKK1RJRkZDdXJyZW50Um93KFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX3Jvdyk7Cit9CisKKy8qCisgKiBSZXR1cm4gaW5kZXggb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICovCit1aW50MTYKK1RJRkZDdXJyZW50RGlyZWN0b3J5KFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2N1cmRpcik7Cit9CisKKy8qCisgKiBSZXR1cm4gY3VycmVudCBzdHJpcC4KKyAqLwordWludDMyCitUSUZGQ3VycmVudFN0cmlwKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2N1cnN0cmlwKTsKK30KKworLyoKKyAqIFJldHVybiBjdXJyZW50IHRpbGUuCisgKi8KK3VpbnQzMgorVElGRkN1cnJlbnRUaWxlKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2N1cnRpbGUpOworfQorCisvKgorICogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGZpbGUgaGFzIGJ5dGUtc3dhcHBlZCBkYXRhLgorICovCitpbnQKK1RJRkZJc0J5dGVTd2FwcGVkKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikgIT0gMCk7Cit9CisKKy8qCisgKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZGF0YSBpcyByZXR1cm5lZCB1cC1zYW1wbGVkLgorICovCitpbnQKK1RJRkZJc1VwU2FtcGxlZChUSUZGKiB0aWYpCit7CisJcmV0dXJuIChpc1VwU2FtcGxlZCh0aWYpKTsKK30KKworLyoKKyAqIFJldHVybiBub256ZXJvIGlmIHRoZSBkYXRhIGlzIHJldHVybmVkIGluIE1TQi10by1MU0IgYml0IG9yZGVyLgorICovCitpbnQKK1RJRkZJc01TQjJMU0IoVElGRiogdGlmKQoreworCXJldHVybiAoaXNGaWxsT3JkZXIodGlmLCBGSUxMT1JERVJfTVNCMkxTQikpOworfQorCisvKgorICogUmV0dXJuIG5vbnplcm8gaWYgZ2l2ZW4gZmlsZSB3YXMgd3JpdHRlbiBpbiBiaWctZW5kaWFuIG9yZGVyLgorICovCitpbnQKK1RJRkZJc0JpZ0VuZGlhbihUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMgPT0gVElGRl9CSUdFTkRJQU4pOworfQorCisvKgorICogUmV0dXJuIHBvaW50ZXIgdG8gZmlsZSByZWFkIG1ldGhvZC4KKyAqLworVElGRlJlYWRXcml0ZVByb2MKK1RJRkZHZXRSZWFkUHJvYyhUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9yZWFkcHJvYyk7Cit9CisKKy8qCisgKiBSZXR1cm4gcG9pbnRlciB0byBmaWxlIHdyaXRlIG1ldGhvZC4KKyAqLworVElGRlJlYWRXcml0ZVByb2MKK1RJRkZHZXRXcml0ZVByb2MoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfd3JpdGVwcm9jKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVyIHRvIGZpbGUgc2VlayBtZXRob2QuCisgKi8KK1RJRkZTZWVrUHJvYworVElGRkdldFNlZWtQcm9jKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX3NlZWtwcm9jKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVyIHRvIGZpbGUgY2xvc2UgbWV0aG9kLgorICovCitUSUZGQ2xvc2VQcm9jCitUSUZGR2V0Q2xvc2VQcm9jKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2Nsb3NlcHJvYyk7Cit9CisKKy8qCisgKiBSZXR1cm4gcG9pbnRlciB0byBmaWxlIHNpemUgcmVxdWVzdGluZyBtZXRob2QuCisgKi8KK1RJRkZTaXplUHJvYworVElGRkdldFNpemVQcm9jKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX3NpemVwcm9jKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVyIHRvIG1lbW9yeSBtYXBwaW5nIG1ldGhvZC4KKyAqLworVElGRk1hcEZpbGVQcm9jCitUSUZGR2V0TWFwRmlsZVByb2MoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfbWFwcHJvYyk7Cit9CisKKy8qCisgKiBSZXR1cm4gcG9pbnRlciB0byBtZW1vcnkgdW5tYXBwaW5nIG1ldGhvZC4KKyAqLworVElGRlVubWFwRmlsZVByb2MKK1RJRkZHZXRVbm1hcEZpbGVQcm9jKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX3VubWFwcHJvYyk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3BhY2tiaXRzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wYWNrYml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjUxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wYWNrYml0cy5jCkBAIC0wLDAgKzEsMzAyIEBACisvKiAkSWQ6IHRpZl9wYWNrYml0cy5jLHYgMS4yMiAyMDEyLTA2LTIwIDA1OjI1OjMzIGZ3YXJtZXJkYW0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaWZkZWYgUEFDS0JJVFNfU1VQUE9SVAorLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBQYWNrQml0cyBDb21wcmVzc2lvbiBBbGdvcml0aG0gU3VwcG9ydAorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludAorUGFja0JpdHNQcmVFbmNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwkodm9pZCkgczsKKworCWlmICghKHRpZi0+dGlmX2RhdGEgPSAodWludDgqKV9USUZGbWFsbG9jKHNpemVvZih0bXNpemVfdCkpKSkKKwkJcmV0dXJuICgwKTsKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgc2NhbmxpbmUvdGlsZS13aWR0aCBzaXplIGluIGJ5dGVzLgorCSAqLworCWlmIChpc1RpbGVkKHRpZikpCisJCSoodG1zaXplX3QqKXRpZi0+dGlmX2RhdGEgPSBUSUZGVGlsZVJvd1NpemUodGlmKTsKKwllbHNlCisJCSoodG1zaXplX3QqKXRpZi0+dGlmX2RhdGEgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorUGFja0JpdHNQb3N0RW5jb2RlKFRJRkYqIHRpZikKK3sKKyAgICAgICAgaWYgKHRpZi0+dGlmX2RhdGEpCisgICAgICAgICAgICBfVElGRmZyZWUodGlmLT50aWZfZGF0YSk7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIHJ1biBvZiBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK1BhY2tCaXRzRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXVuc2lnbmVkIGNoYXIqIGJwID0gKHVuc2lnbmVkIGNoYXIqKSBidWY7CisJdWludDgqIG9wOworCXVpbnQ4KiBlcDsKKwl1aW50OCogbGFzdGxpdGVyYWw7CisJbG9uZyBuLCBzbG9wOworCWludCBiOworCWVudW0geyBCQVNFLCBMSVRFUkFMLCBSVU4sIExJVEVSQUxfUlVOIH0gc3RhdGU7CisKKwkodm9pZCkgczsKKwlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCWVwID0gdGlmLT50aWZfcmF3ZGF0YSArIHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCXN0YXRlID0gQkFTRTsKKwlsYXN0bGl0ZXJhbCA9IDA7CisJd2hpbGUgKGNjID4gMCkgeworCQkvKgorCQkgKiBGaW5kIHRoZSBsb25nZXN0IHN0cmluZyBvZiBpZGVudGljYWwgYnl0ZXMuCisJCSAqLworCQliID0gKmJwKyssIGNjLS0sIG4gPSAxOworCQlmb3IgKDsgY2MgPiAwICYmIGIgPT0gKmJwOyBjYy0tLCBicCsrKQorCQkJbisrOworCWFnYWluOgorCQlpZiAob3AgKyAyID49IGVwKSB7CQkvKiBpbnN1cmUgc3BhY2UgZm9yIG5ldyBkYXRhICovCisJCQkvKgorCQkJICogQmUgY2FyZWZ1bCBhYm91dCB3cml0aW5nIHRoZSBsYXN0CisJCQkgKiBsaXRlcmFsLiAgTXVzdCB3cml0ZSB1cCB0byB0aGF0IHBvaW50CisJCQkgKiBhbmQgdGhlbiBjb3B5IHRoZSByZW1haW5kZXIgdG8gdGhlCisJCQkgKiBmcm9udCBvZiB0aGUgYnVmZmVyLgorCQkJICovCisJCQlpZiAoc3RhdGUgPT0gTElURVJBTCB8fCBzdGF0ZSA9PSBMSVRFUkFMX1JVTikgeworCQkJCXNsb3AgPSAobG9uZykob3AgLSBsYXN0bGl0ZXJhbCk7CisJCQkJdGlmLT50aWZfcmF3Y2MgKz0gKHRtc2l6ZV90KShsYXN0bGl0ZXJhbCAtIHRpZi0+dGlmX3Jhd2NwKTsKKwkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJCXJldHVybiAoLTEpOworCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJCQkJd2hpbGUgKHNsb3AtLSA+IDApCisJCQkJCSpvcCsrID0gKmxhc3RsaXRlcmFsKys7CisJCQkJbGFzdGxpdGVyYWwgPSB0aWYtPnRpZl9yYXdjcDsKKwkJCX0gZWxzZSB7CisJCQkJdGlmLT50aWZfcmF3Y2MgKz0gKHRtc2l6ZV90KShvcCAtIHRpZi0+dGlmX3Jhd2NwKTsKKwkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJCXJldHVybiAoLTEpOworCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJCQl9CisJCX0KKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEJBU0U6CQkvKiBpbml0aWFsIHN0YXRlLCBzZXQgcnVuL2xpdGVyYWwgKi8KKwkJCWlmIChuID4gMSkgeworCQkJCXN0YXRlID0gUlVOOworCQkJCWlmIChuID4gMTI4KSB7CisJCQkJCSpvcCsrID0gKHVpbnQ4KSAtMTI3OworCQkJCQkqb3ArKyA9ICh1aW50OCkgYjsKKwkJCQkJbiAtPSAxMjg7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJCSpvcCsrID0gKHVpbnQ4KSgtKG4tMSkpOworCQkJCSpvcCsrID0gKHVpbnQ4KSBiOworCQkJfSBlbHNlIHsKKwkJCQlsYXN0bGl0ZXJhbCA9IG9wOworCQkJCSpvcCsrID0gMDsKKwkJCQkqb3ArKyA9ICh1aW50OCkgYjsKKwkJCQlzdGF0ZSA9IExJVEVSQUw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBMSVRFUkFMOgkJLyogbGFzdCBvYmplY3Qgd2FzIGxpdGVyYWwgc3RyaW5nICovCisJCQlpZiAobiA+IDEpIHsKKwkJCQlzdGF0ZSA9IExJVEVSQUxfUlVOOworCQkJCWlmIChuID4gMTI4KSB7CisJCQkJCSpvcCsrID0gKHVpbnQ4KSAtMTI3OworCQkJCQkqb3ArKyA9ICh1aW50OCkgYjsKKwkJCQkJbiAtPSAxMjg7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJCSpvcCsrID0gKHVpbnQ4KSgtKG4tMSkpOwkvKiBlbmNvZGUgcnVuICovCisJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQl9IGVsc2UgewkJCS8qIGV4dGVuZCBsaXRlcmFsICovCisJCQkJaWYgKCsrKCpsYXN0bGl0ZXJhbCkgPT0gMTI3KQorCQkJCQlzdGF0ZSA9IEJBU0U7CisJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVU46CQkvKiBsYXN0IG9iamVjdCB3YXMgcnVuICovCisJCQlpZiAobiA+IDEpIHsKKwkJCQlpZiAobiA+IDEyOCkgeworCQkJCQkqb3ArKyA9ICh1aW50OCkgLTEyNzsKKwkJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQkJCW4gLT0gMTI4OworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCQkqb3ArKyA9ICh1aW50OCkoLShuLTEpKTsKKwkJCQkqb3ArKyA9ICh1aW50OCkgYjsKKwkJCX0gZWxzZSB7CisJCQkJbGFzdGxpdGVyYWwgPSBvcDsKKwkJCQkqb3ArKyA9IDA7CisJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQkJc3RhdGUgPSBMSVRFUkFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTElURVJBTF9SVU46CS8qIGxpdGVyYWwgZm9sbG93ZWQgYnkgYSBydW4gKi8KKwkJCS8qCisJCQkgKiBDaGVjayB0byBzZWUgaWYgcHJldmlvdXMgcnVuIHNob3VsZAorCQkJICogYmUgY29udmVydGVkIHRvIGEgbGl0ZXJhbCwgaW4gd2hpY2gKKwkJCSAqIGNhc2Ugd2UgY29udmVydCBsaXRlcmFsLXJ1bi1saXRlcmFsCisJCQkgKiB0byBhIHNpbmdsZSBsaXRlcmFsLgorCQkJICovCisJCQlpZiAobiA9PSAxICYmIG9wWy0yXSA9PSAodWludDgpIC0xICYmCisJCQkgICAgKmxhc3RsaXRlcmFsIDwgMTI2KSB7CisJCQkJc3RhdGUgPSAoKCgqbGFzdGxpdGVyYWwpICs9IDIpID09IDEyNyA/CisJCQkJICAgIEJBU0UgOiBMSVRFUkFMKTsKKwkJCQlvcFstMl0gPSBvcFstMV07CS8qIHJlcGxpY2F0ZSAqLworCQkJfSBlbHNlCisJCQkJc3RhdGUgPSBSVU47CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCXRpZi0+dGlmX3Jhd2NjICs9ICh0bXNpemVfdCkob3AgLSB0aWYtPnRpZl9yYXdjcCk7CisJdGlmLT50aWZfcmF3Y3AgPSBvcDsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRW5jb2RlIGEgcmVjdGFuZ3VsYXIgY2h1bmsgb2YgcGl4ZWxzLiAgV2UgYnJlYWsgaXQgdXAKKyAqIGludG8gcm93LXNpemVkIHBpZWNlcyB0byBpbnN1cmUgdGhhdCBlbmNvZGVkIHJ1bnMgZG8KKyAqIG5vdCBzcGFuIHJvd3MuICBPdGhlcndpc2UsIHRoZXJlIGNhbiBiZSBwcm9ibGVtcyB3aXRoCisgKiB0aGUgZGVjb2RlciBpZiBkYXRhIGlzIHJlYWQsIGZvciBleGFtcGxlLCBieSBzY2FubGluZXMKKyAqIHdoZW4gaXQgd2FzIGVuY29kZWQgYnkgc3RyaXBzLgorICovCitzdGF0aWMgaW50CitQYWNrQml0c0VuY29kZUNodW5rKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJdG1zaXplX3Qgcm93c2l6ZSA9ICoodG1zaXplX3QqKXRpZi0+dGlmX2RhdGE7CisKKwl3aGlsZSAoY2MgPiAwKSB7CisJCXRtc2l6ZV90IGNodW5rID0gcm93c2l6ZTsKKwkJCisJCWlmKCBjYyA8IGNodW5rICkKKwkJICAgIGNodW5rID0gY2M7CisKKwkJaWYgKFBhY2tCaXRzRW5jb2RlKHRpZiwgYnAsIGNodW5rLCBzKSA8IDApCisJCSAgICByZXR1cm4gKC0xKTsKKwkJYnAgKz0gY2h1bms7CisJCWNjIC09IGNodW5rOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitQYWNrQml0c0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBvcCwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQYWNrQml0c0RlY29kZSI7CisJY2hhciAqYnA7CisJdG1zaXplX3QgY2M7CisJbG9uZyBuOworCWludCBiOworCisJKHZvaWQpIHM7CisJYnAgPSAoY2hhciopIHRpZi0+dGlmX3Jhd2NwOworCWNjID0gdGlmLT50aWZfcmF3Y2M7CisJd2hpbGUgKGNjID4gMCAmJiBvY2MgPiAwKSB7CisJCW4gPSAobG9uZykgKmJwKyssIGNjLS07CisJCS8qCisJCSAqIFdhdGNoIG91dCBmb3IgY29tcGlsZXJzIHRoYXQKKwkJICogZG9uJ3Qgc2lnbiBleHRlbmQgY2hhcnMuLi4KKwkJICovCisJCWlmIChuID49IDEyOCkKKwkJCW4gLT0gMjU2OworCQlpZiAobiA8IDApIHsJCS8qIHJlcGxpY2F0ZSBuZXh0IGJ5dGUgLW4rMSB0aW1lcyAqLworCQkJaWYgKG4gPT0gLTEyOCkJLyogbm9wICovCisJCQkJY29udGludWU7CisJCQluID0gLW4gKyAxOworCQkJaWYoIG9jYyA8ICh0bXNpemVfdCluICkKKwkJCXsKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICJEaXNjYXJkaW5nICVsdSBieXRlcyB0byBhdm9pZCBidWZmZXIgb3ZlcnJ1biIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nKSAoKHRtc2l6ZV90KW4gLSBvY2MpKTsKKwkJCQluID0gKGxvbmcpb2NjOworCQkJfQorCQkJb2NjIC09IG47CisJCQliID0gKmJwKyssIGNjLS07CisJCQl3aGlsZSAobi0tID4gMCkKKwkJCQkqb3ArKyA9ICh1aW50OCkgYjsKKwkJfSBlbHNlIHsJCS8qIGNvcHkgbmV4dCBuKzEgYnl0ZXMgbGl0ZXJhbGx5ICovCisJCQlpZiAob2NjIDwgKHRtc2l6ZV90KShuICsgMSkpCisJCQl7CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiRGlzY2FyZGluZyAlbHUgYnl0ZXMgdG8gYXZvaWQgYnVmZmVyIG92ZXJydW4iLAorCQkJCSAgICAodW5zaWduZWQgbG9uZykgKCh0bXNpemVfdCluIC0gb2NjICsgMSkpOworCQkJCW4gPSAobG9uZylvY2MgLSAxOworCQkJfQorCQkJaWYgKGNjIDwgKHRtc2l6ZV90KSAobisxKSkgCisJCQl7CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICAgIlRlcm1pbmF0aW5nIFBhY2tCaXRzRGVjb2RlIGR1ZSB0byBsYWNrIG9mIGRhdGEuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlfVElGRm1lbWNweShvcCwgYnAsICsrbik7CisJCQlvcCArPSBuOyBvY2MgLT0gbjsKKwkJCWJwICs9IG47IGNjIC09IG47CisJCX0KKwl9CisJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBicDsKKwl0aWYtPnRpZl9yYXdjYyA9IGNjOworCWlmIChvY2MgPiAwKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiTm90IGVub3VnaCBkYXRhIGZvciBzY2FubGluZSAlbHUiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3Jvdyk7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKK2ludAorVElGRkluaXRQYWNrQml0cyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJKHZvaWQpIHNjaGVtZTsKKwl0aWYtPnRpZl9kZWNvZGVyb3cgPSBQYWNrQml0c0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IFBhY2tCaXRzRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBQYWNrQml0c0RlY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBQYWNrQml0c1ByZUVuY29kZTsKKwl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gUGFja0JpdHNQb3N0RW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXJvdyA9IFBhY2tCaXRzRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gUGFja0JpdHNFbmNvZGVDaHVuazsKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gUGFja0JpdHNFbmNvZGVDaHVuazsKKwlyZXR1cm4gKDEpOworfQorI2VuZGlmIC8qIFBBQ0tCSVRTX1NVUFBPUlQgKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfcGl4YXJsb2cuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3BpeGFybG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhZjhiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3BpeGFybG9nLmMKQEAgLTAsMCArMSwxNDI4IEBACisvKiAkSWQ6IHRpZl9waXhhcmxvZy5jLHYgMS4zOCAyMDEyLTA2LTIxIDAxOjAxOjUzIGZ3YXJtZXJkYW0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgUGl4YXIKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogUGl4YXIsIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgUGl4YXIsIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFBJWEFSLCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpZmRlZiBQSVhBUkxPR19TVVBQT1JUCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKiBQaXhhckxvZyBDb21wcmVzc2lvbiBTdXBwb3J0CisgKgorICogQ29udHJpYnV0ZWQgYnkgRGFuIE1jQ295LgorICoKKyAqIFBpeGFyTG9nIGZpbG0gc3VwcG9ydCB1c2VzIHRoZSBUSUZGIGxpYnJhcnkgdG8gc3RvcmUgY29tcGFuZGVkCisgKiAxMSBiaXQgdmFsdWVzIGludG8gYSB0aWZmIGZpbGUsIHdoaWNoIGFyZSBjb21wcmVzc2VkIHVzaW5nIHRoZSAKKyAqIHppcCBjb21wcmVzc29yLiAgCisgKgorICogVGhlIGNvZGVjIGNhbiB0YWtlIGFzIGlucHV0IGFuZCBwcm9kdWNlIGFzIG91dHB1dCAzMi1iaXQgSUVFRSBmbG9hdCB2YWx1ZXMgCisgKiBhcyB3ZWxsIGFzIDE2LWJpdCBvciA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4KKyAqCisgKiBPbiB3cml0aW5nIGFueSBvZiB0aGUgYWJvdmUgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZSBpbnRlcm5hbAorICogMTEtYml0IGxvZyBmb3JtYXQuICAgSW4gdGhlIGNhc2Ugb2YgIDggYW5kIDE2IGJpdCB2YWx1ZXMsIHRoZQorICogaW5wdXQgaXMgYXNzdW1lZCB0byBiZSB1bnNpZ25lZCBsaW5lYXIgY29sb3IgdmFsdWVzIHRoYXQgcmVwcmVzZW50CisgKiB0aGUgcmFuZ2UgMC0xLiAgSW4gdGhlIGNhc2Ugb2YgSUVFRSB2YWx1ZXMsIHRoZSAwLTEgcmFuZ2UgaXMgYXNzdW1lZCB0bworICogYmUgdGhlIG5vcm1hbCBsaW5lYXIgY29sb3IgcmFuZ2UsIGluIGFkZGl0aW9uIG92ZXIgMSB2YWx1ZXMgYXJlCisgKiBhY2NlcHRlZCB1cCB0byBhIHZhbHVlIG9mIGFib3V0IDI1LjAgdG8gZW5jb2RlICJob3QiIGhpZ2h0bGlnaHRzIGFuZCBzdWNoLgorICogVGhlIGVuY29kaW5nIGlzIGxvc3NsZXNzIGZvciA4LWJpdCB2YWx1ZXMsIHNsaWdodGx5IGxvc3N5IGZvciB0aGUKKyAqIG90aGVyIGJpdCBkZXB0aHMuICBUaGUgYWN0dWFsIGNvbG9yIHByZWNpc2lvbiBzaG91bGQgYmUgYmV0dGVyCisgKiB0aGFuIHRoZSBodW1hbiBleWUgY2FuIHBlcmNlaXZlIHdpdGggZXh0cmEgcm9vbSB0byBhbGxvdyBmb3IKKyAqIGVycm9yIGludHJvZHVjZWQgYnkgZnVydGhlciBpbWFnZSBjb21wdXRhdGlvbi4gIEFzIHdpdGggYW55IHF1YW50aXplZAorICogY29sb3IgZm9ybWF0LCBpdCBpcyBwb3NzaWJsZSB0byBwZXJmb3JtIGltYWdlIGNhbGN1bGF0aW9ucyB3aGljaAorICogZXhwb3NlIHRoZSBxdWFudGl6YXRpb24gZXJyb3IuIFRoaXMgZm9ybWF0IHNob3VsZCBjZXJ0YWlubHkgYmUgbGVzcyAKKyAqIHN1c2NlcHRhYmxlIHRvIHN1Y2ggZXJyb3JzIHRoYW4gc3RhbmRhcmQgOC1iaXQgZW5jb2RpbmdzLCBidXQgbW9yZQorICogc3VzY2VwdGFibGUgdGhhbiBzdHJhaWdodCAxNi1iaXQgb3IgMzItYml0IGVuY29kaW5ncy4KKyAqCisgKiBPbiByZWFkaW5nIHRoZSBpbnRlcm5hbCBmb3JtYXQgaXMgY29udmVydGVkIHRvIHRoZSBkZXNpcmVkIG91dHB1dCBmb3JtYXQuCisgKiBUaGUgcHJvZ3JhbSBjYW4gcmVxdWVzdCB3aGljaCBmb3JtYXQgaXQgZGVzaXJlcyBieSBzZXR0aW5nIHRoZSBpbnRlcm5hbAorICogcHNldWRvIHRhZyBUSUZGVEFHX1BJWEFSTE9HREFUQUZNVCB0byBvbmUgb2YgdGhlc2UgcG9zc2libGUgdmFsdWVzOgorICogIFBJWEFSTE9HREFUQUZNVF9GTE9BVCAgICAgPSBwcm92aWRlIElFRUUgZmxvYXQgdmFsdWVzLgorICogIFBJWEFSTE9HREFUQUZNVF8xNkJJVCAgICAgPSBwcm92aWRlIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcworICogIFBJWEFSTE9HREFUQUZNVF84QklUICAgICAgPSBwcm92aWRlIHVuc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWVzCisgKgorICogYWx0ZXJuYXRlbHkgUElYQVJMT0dEQVRBRk1UXzhCSVRBQkdSIHByb3ZpZGVzIHVuc2lnbmVkIDgtYml0IGludGVnZXIKKyAqIHZhbHVlcyB3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgaWYgdGhlcmUgYXJlIGV4YWN0bHkgdGhyZWUgb3IgZm91ciBjaGFubmVscworICogKHJnYiBvciByZ2JhKSBpdCBzd2FwcyB0aGUgY2hhbm5lbCBvcmRlciAoYmdyIG9yIGFiZ3IpLgorICoKKyAqIFBJWEFSTE9HREFUQUZNVF8xMUJJVExPRyBwcm92aWRlcyB0aGUgaW50ZXJuYWwgZW5jb2RpbmcgZGlyZWN0bHkKKyAqIHBhY2tlZCBpbiAxNi1iaXQgdmFsdWVzLiAgIEhvd2V2ZXIgbm8gdG9vbHMgYXJlIHN1cHBsaWVkIGZvciBpbnRlcnByZXRpbmcKKyAqIHRoZXNlIHZhbHVlcy4KKyAqCisgKiAiaG90IiAob3ZlciAxLjApIGFyZWFzIHdyaXR0ZW4gaW4gZmxvYXRpbmcgcG9pbnQgZ2V0IGNsYW1wZWQgdG8KKyAqIDEuMCBpbiB0aGUgaW50ZWdlciBkYXRhIHR5cGVzLgorICoKKyAqIFdoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIGFmdGVyIHdyaXRpbmcsIHRoZSBiaXQgZGVwdGggYW5kIHNhbXBsZSBmb3JtYXQKKyAqIGFyZSBzZXQgYWx3YXlzIHRvIGFwcGVhciBhcyBpZiA4LWJpdCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW50byBpdC4KKyAqIFRoYXQgd2F5IGEgbmFpdmUgcHJvZ3JhbSB1bmF3YXJlIG9mIHRoZSBwYXJ0aWN1bGFycyBvZiB0aGUgZW5jb2RpbmcKKyAqIGdldHMgdGhlIGZvcm1hdCBpdCBpcyBtb3N0IGxpa2VseSBhYmxlIHRvIGhhbmRsZS4KKyAqCisgKiBUaGUgY29kZWMgZG9lcyBpdCdzIG93biBob3Jpem9udGFsIGRpZmZlcmVuY2luZyBzdGVwIG9uIHRoZSBjb2RlZAorICogdmFsdWVzIHNvIHRoZSBsaWJyYXJpZXMgcHJlZGljdG9yIHN0dWZmIHNob3VsZCBiZSB0dXJuZWQgb2ZmLgorICogVGhlIGNvZGVjIGFsc28gaGFuZGxlIGJ5dGUgc3dhcHBpbmcgdGhlIGVuY29kZWQgdmFsdWVzIGFzIG5lY2Vzc2FyeQorICogc2luY2UgdGhlIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5CisgKiB0byBrbm93IHRoZSBiaXQgZGVwdGggb2YgdGhlIHJhdyB1bmVuY29kZWQgYnVmZmVyLgorICoKKyAqIE5PVEU6IFRoaXMgZGVjb2RlciBkb2VzIG5vdCBhcHBlYXIgdG8gdXBkYXRlIHRpZl9yYXdjcCwgYW5kIHRpZl9yYXdjYy4KKyAqIFRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIENIVU5LWV9TVFJJUF9SRUFEX1NVUFBPUlQKKyAqIGFzIG5vdGVkIGluIGh0dHA6Ly90cmFjLm9zZ2VvLm9yZy9nZGFsL3RpY2tldC8zODk0LiAgIEZyYW5rVyAtIEphbicxMQorICovCisKKyNpbmNsdWRlICJ0aWZfcHJlZGljdC5oIgorI2luY2x1ZGUgIi4uLy4uL2Z4X3psaWIvaW5jbHVkZS9meF96bGliLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogVGFibGVzIGZvciBjb252ZXJ0aW5nIHRvL2Zyb20gMTEgYml0IGNvZGVkIHZhbHVlcyAqLworCisjZGVmaW5lICBUU0laRQkgMjA0OAkJLyogZGVjb2RlIHRhYmxlIHNpemUgKDExLWJpdCB0b2tlbnMpICovCisjZGVmaW5lICBUU0laRVAxIDIwNDkJCS8qIFBsdXMgb25lIGZvciBzbG9wICovCisjZGVmaW5lICBPTkUJIDEyNTAJCS8qIHRva2VuIHZhbHVlIG9mIDEuMCBleGFjdGx5ICovCisjZGVmaW5lICBSQVRJTwkgMS4wMDQJCS8qIG5vbWluYWwgcmF0aW8gZm9yIGxvZyBwYXJ0ICovCisKKyNkZWZpbmUgQ09ERV9NQVNLIDB4N2ZmICAgICAgICAgLyogMTEgYml0cy4gKi8KKworc3RhdGljIGZsb2F0ICBGbHRzaXplOworc3RhdGljIGZsb2F0ICBMb2dLMSwgTG9nSzI7CisKKyNkZWZpbmUgUkVQRUFUKG4sIG9wKSAgIHsgaW50IGk7IGk9bjsgZG8geyBpLS07IG9wOyB9IHdoaWxlIChpPjApOyB9CisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsQWNjdW11bGF0ZUYodWludDE2ICp3cCwgaW50IG4sIGludCBzdHJpZGUsIGZsb2F0ICpvcCwKKwlmbG9hdCAqVG9MaW5lYXJGKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCAgY3IsIGNnLCBjYiwgY2EsIG1hc2s7CisgICAgcmVnaXN0ZXIgZmxvYXQgIHQwLCB0MSwgdDIsIHQzOworCisgICAgaWYgKG4gPj0gc3RyaWRlKSB7CisJbWFzayA9IENPREVfTUFTSzsKKwlpZiAoc3RyaWRlID09IDMpIHsKKwkgICAgdDAgPSBUb0xpbmVhckZbY3IgPSAod3BbMF0gJiBtYXNrKV07CisJICAgIHQxID0gVG9MaW5lYXJGW2NnID0gKHdwWzFdICYgbWFzayldOworCSAgICB0MiA9IFRvTGluZWFyRltjYiA9ICh3cFsyXSAmIG1hc2spXTsKKwkgICAgb3BbMF0gPSB0MDsKKwkgICAgb3BbMV0gPSB0MTsKKwkgICAgb3BbMl0gPSB0MjsKKwkgICAgbiAtPSAzOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gMzsKKwkJb3AgKz0gMzsKKwkJbiAtPSAzOworCQl0MCA9IFRvTGluZWFyRlsoY3IgKz0gd3BbMF0pICYgbWFza107CisJCXQxID0gVG9MaW5lYXJGWyhjZyArPSB3cFsxXSkgJiBtYXNrXTsKKwkJdDIgPSBUb0xpbmVhckZbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCQlvcFswXSA9IHQwOworCQlvcFsxXSA9IHQxOworCQlvcFsyXSA9IHQyOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgeworCSAgICB0MCA9IFRvTGluZWFyRltjciA9ICh3cFswXSAmIG1hc2spXTsKKwkgICAgdDEgPSBUb0xpbmVhckZbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIHQyID0gVG9MaW5lYXJGW2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICB0MyA9IFRvTGluZWFyRltjYSA9ICh3cFszXSAmIG1hc2spXTsKKwkgICAgb3BbMF0gPSB0MDsKKwkgICAgb3BbMV0gPSB0MTsKKwkgICAgb3BbMl0gPSB0MjsKKwkgICAgb3BbM10gPSB0MzsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gNDsKKwkJb3AgKz0gNDsKKwkJbiAtPSA0OworCQl0MCA9IFRvTGluZWFyRlsoY3IgKz0gd3BbMF0pICYgbWFza107CisJCXQxID0gVG9MaW5lYXJGWyhjZyArPSB3cFsxXSkgJiBtYXNrXTsKKwkJdDIgPSBUb0xpbmVhckZbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCQl0MyA9IFRvTGluZWFyRlsoY2EgKz0gd3BbM10pICYgbWFza107CisJCW9wWzBdID0gdDA7CisJCW9wWzFdID0gdDE7CisJCW9wWzJdID0gdDI7CisJCW9wWzNdID0gdDM7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBSRVBFQVQoc3RyaWRlLCAqb3AgPSBUb0xpbmVhckZbKndwJm1hc2tdOyB3cCsrOyBvcCsrKQorCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsCisJCSAgICB3cFtzdHJpZGVdICs9ICp3cDsgKm9wID0gVG9MaW5lYXJGWyp3cCZtYXNrXTsgd3ArKzsgb3ArKykKKwkJbiAtPSBzdHJpZGU7CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraG9yaXpvbnRhbEFjY3VtdWxhdGUxMih1aW50MTYgKndwLCBpbnQgbiwgaW50IHN0cmlkZSwgaW50MTYgKm9wLAorCWZsb2F0ICpUb0xpbmVhckYpCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICBjciwgY2csIGNiLCBjYSwgbWFzazsKKyAgICByZWdpc3RlciBmbG9hdCAgdDAsIHQxLCB0MiwgdDM7CisKKyNkZWZpbmUgU0NBTEUxMiAyMDQ4LjBGCisjZGVmaW5lIENMQU1QMTIodCkgKCgodCkgPCAzMDcxKSA/ICh1aW50MTYpICh0KSA6IDMwNzEpCisKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwltYXNrID0gQ09ERV9NQVNLOworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICB0MCA9IFRvTGluZWFyRltjciA9ICh3cFswXSAmIG1hc2spXSAqIFNDQUxFMTI7CisJICAgIHQxID0gVG9MaW5lYXJGW2NnID0gKHdwWzFdICYgbWFzayldICogU0NBTEUxMjsKKwkgICAgdDIgPSBUb0xpbmVhckZbY2IgPSAod3BbMl0gJiBtYXNrKV0gKiBTQ0FMRTEyOworCSAgICBvcFswXSA9IENMQU1QMTIodDApOworCSAgICBvcFsxXSA9IENMQU1QMTIodDEpOworCSAgICBvcFsyXSA9IENMQU1QMTIodDIpOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQl3cCArPSAzOworCQlvcCArPSAzOworCQluIC09IDM7CisJCXQwID0gVG9MaW5lYXJGWyhjciArPSB3cFswXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCXQxID0gVG9MaW5lYXJGWyhjZyArPSB3cFsxXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCXQyID0gVG9MaW5lYXJGWyhjYiArPSB3cFsyXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCW9wWzBdID0gQ0xBTVAxMih0MCk7CisJCW9wWzFdID0gQ0xBTVAxMih0MSk7CisJCW9wWzJdID0gQ0xBTVAxMih0Mik7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIHQwID0gVG9MaW5lYXJGW2NyID0gKHdwWzBdICYgbWFzayldICogU0NBTEUxMjsKKwkgICAgdDEgPSBUb0xpbmVhckZbY2cgPSAod3BbMV0gJiBtYXNrKV0gKiBTQ0FMRTEyOworCSAgICB0MiA9IFRvTGluZWFyRltjYiA9ICh3cFsyXSAmIG1hc2spXSAqIFNDQUxFMTI7CisJICAgIHQzID0gVG9MaW5lYXJGW2NhID0gKHdwWzNdICYgbWFzayldICogU0NBTEUxMjsKKwkgICAgb3BbMF0gPSBDTEFNUDEyKHQwKTsKKwkgICAgb3BbMV0gPSBDTEFNUDEyKHQxKTsKKwkgICAgb3BbMl0gPSBDTEFNUDEyKHQyKTsKKwkgICAgb3BbM10gPSBDTEFNUDEyKHQzKTsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gNDsKKwkJb3AgKz0gNDsKKwkJbiAtPSA0OworCQl0MCA9IFRvTGluZWFyRlsoY3IgKz0gd3BbMF0pICYgbWFza10gKiBTQ0FMRTEyOworCQl0MSA9IFRvTGluZWFyRlsoY2cgKz0gd3BbMV0pICYgbWFza10gKiBTQ0FMRTEyOworCQl0MiA9IFRvTGluZWFyRlsoY2IgKz0gd3BbMl0pICYgbWFza10gKiBTQ0FMRTEyOworCQl0MyA9IFRvTGluZWFyRlsoY2EgKz0gd3BbM10pICYgbWFza10gKiBTQ0FMRTEyOworCQlvcFswXSA9IENMQU1QMTIodDApOworCQlvcFsxXSA9IENMQU1QMTIodDEpOworCQlvcFsyXSA9IENMQU1QMTIodDIpOworCQlvcFszXSA9IENMQU1QMTIodDMpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgUkVQRUFUKHN0cmlkZSwgdDAgPSBUb0xpbmVhckZbKndwJm1hc2tdICogU0NBTEUxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpvcCA9IENMQU1QMTIodDApOyB3cCsrOyBvcCsrKQorCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsCisJCSAgICB3cFtzdHJpZGVdICs9ICp3cDsgdDAgPSBUb0xpbmVhckZbd3Bbc3RyaWRlXSZtYXNrXSpTQ0FMRTEyOworCQkgICAgKm9wID0gQ0xBTVAxMih0MCk7ICB3cCsrOyBvcCsrKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsQWNjdW11bGF0ZTE2KHVpbnQxNiAqd3AsIGludCBuLCBpbnQgc3RyaWRlLCB1aW50MTYgKm9wLAorCXVpbnQxNiAqVG9MaW5lYXIxNikKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgIGNyLCBjZywgY2IsIGNhLCBtYXNrOworCisgICAgaWYgKG4gPj0gc3RyaWRlKSB7CisJbWFzayA9IENPREVfTUFTSzsKKwlpZiAoc3RyaWRlID09IDMpIHsKKwkgICAgb3BbMF0gPSBUb0xpbmVhcjE2W2NyID0gKHdwWzBdICYgbWFzayldOworCSAgICBvcFsxXSA9IFRvTGluZWFyMTZbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIG9wWzJdID0gVG9MaW5lYXIxNltjYiA9ICh3cFsyXSAmIG1hc2spXTsKKwkgICAgbiAtPSAzOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gMzsKKwkJb3AgKz0gMzsKKwkJbiAtPSAzOworCQlvcFswXSA9IFRvTGluZWFyMTZbKGNyICs9IHdwWzBdKSAmIG1hc2tdOworCQlvcFsxXSA9IFRvTGluZWFyMTZbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQlvcFsyXSA9IFRvTGluZWFyMTZbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgeworCSAgICBvcFswXSA9IFRvTGluZWFyMTZbY3IgPSAod3BbMF0gJiBtYXNrKV07CisJICAgIG9wWzFdID0gVG9MaW5lYXIxNltjZyA9ICh3cFsxXSAmIG1hc2spXTsKKwkgICAgb3BbMl0gPSBUb0xpbmVhcjE2W2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICBvcFszXSA9IFRvTGluZWFyMTZbY2EgPSAod3BbM10gJiBtYXNrKV07CisJICAgIG4gLT0gNDsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCXdwICs9IDQ7CisJCW9wICs9IDQ7CisJCW4gLT0gNDsKKwkJb3BbMF0gPSBUb0xpbmVhcjE2WyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJb3BbMV0gPSBUb0xpbmVhcjE2WyhjZyArPSB3cFsxXSkgJiBtYXNrXTsKKwkJb3BbMl0gPSBUb0xpbmVhcjE2WyhjYiArPSB3cFsyXSkgJiBtYXNrXTsKKwkJb3BbM10gPSBUb0xpbmVhcjE2WyhjYSArPSB3cFszXSkgJiBtYXNrXTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIFJFUEVBVChzdHJpZGUsICpvcCA9IFRvTGluZWFyMTZbKndwJm1hc2tdOyB3cCsrOyBvcCsrKQorCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsCisJCSAgICB3cFtzdHJpZGVdICs9ICp3cDsgKm9wID0gVG9MaW5lYXIxNlsqd3AmbWFza107IHdwKys7IG9wKyspCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogCisgKiBSZXR1cm5zIHRoZSBsb2cgZW5jb2RlZCAxMS1iaXQgdmFsdWVzIHdpdGggdGhlIGhvcml6b250YWwKKyAqIGRpZmZlcmVuY2luZyB1bmRvbmUuCisgKi8KK3N0YXRpYyB2b2lkCitob3Jpem9udGFsQWNjdW11bGF0ZTExKHVpbnQxNiAqd3AsIGludCBuLCBpbnQgc3RyaWRlLCB1aW50MTYgKm9wKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCAgY3IsIGNnLCBjYiwgY2EsIG1hc2s7CisKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwltYXNrID0gQ09ERV9NQVNLOworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICBvcFswXSA9IGNyID0gd3BbMF07ICBvcFsxXSA9IGNnID0gd3BbMV07ICBvcFsyXSA9IGNiID0gd3BbMl07CisJICAgIG4gLT0gMzsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCXdwICs9IDM7CisJCW9wICs9IDM7CisJCW4gLT0gMzsKKwkJb3BbMF0gPSAoY3IgKz0gd3BbMF0pICYgbWFzazsKKwkJb3BbMV0gPSAoY2cgKz0gd3BbMV0pICYgbWFzazsKKwkJb3BbMl0gPSAoY2IgKz0gd3BbMl0pICYgbWFzazsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RyaWRlID09IDQpIHsKKwkgICAgb3BbMF0gPSBjciA9IHdwWzBdOyAgb3BbMV0gPSBjZyA9IHdwWzFdOworCSAgICBvcFsyXSA9IGNiID0gd3BbMl07ICBvcFszXSA9IGNhID0gd3BbM107CisJICAgIG4gLT0gNDsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCXdwICs9IDQ7CisJCW9wICs9IDQ7CisJCW4gLT0gNDsKKwkJb3BbMF0gPSAoY3IgKz0gd3BbMF0pICYgbWFzazsKKwkJb3BbMV0gPSAoY2cgKz0gd3BbMV0pICYgbWFzazsKKwkJb3BbMl0gPSAoY2IgKz0gd3BbMl0pICYgbWFzazsKKwkJb3BbM10gPSAoY2EgKz0gd3BbM10pICYgbWFzazsKKwkgICAgfSAKKwl9IGVsc2UgeworCSAgICBSRVBFQVQoc3RyaWRlLCAqb3AgPSAqd3AmbWFzazsgd3ArKzsgb3ArKykKKwkgICAgbiAtPSBzdHJpZGU7CisJICAgIHdoaWxlIChuID4gMCkgeworCQlSRVBFQVQoc3RyaWRlLAorCQkgICAgd3Bbc3RyaWRlXSArPSAqd3A7ICpvcCA9ICp3cCZtYXNrOyB3cCsrOyBvcCsrKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsQWNjdW11bGF0ZTgodWludDE2ICp3cCwgaW50IG4sIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgKm9wLAorCXVuc2lnbmVkIGNoYXIgKlRvTGluZWFyOCkKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgIGNyLCBjZywgY2IsIGNhLCBtYXNrOworCisgICAgaWYgKG4gPj0gc3RyaWRlKSB7CisJbWFzayA9IENPREVfTUFTSzsKKwlpZiAoc3RyaWRlID09IDMpIHsKKwkgICAgb3BbMF0gPSBUb0xpbmVhcjhbY3IgPSAod3BbMF0gJiBtYXNrKV07CisJICAgIG9wWzFdID0gVG9MaW5lYXI4W2NnID0gKHdwWzFdICYgbWFzayldOworCSAgICBvcFsyXSA9IFRvTGluZWFyOFtjYiA9ICh3cFsyXSAmIG1hc2spXTsKKwkgICAgbiAtPSAzOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJbiAtPSAzOworCQl3cCArPSAzOworCQlvcCArPSAzOworCQlvcFswXSA9IFRvTGluZWFyOFsoY3IgKz0gd3BbMF0pICYgbWFza107CisJCW9wWzFdID0gVG9MaW5lYXI4WyhjZyArPSB3cFsxXSkgJiBtYXNrXTsKKwkJb3BbMl0gPSBUb0xpbmVhcjhbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgeworCSAgICBvcFswXSA9IFRvTGluZWFyOFtjciA9ICh3cFswXSAmIG1hc2spXTsKKwkgICAgb3BbMV0gPSBUb0xpbmVhcjhbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIG9wWzJdID0gVG9MaW5lYXI4W2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICBvcFszXSA9IFRvTGluZWFyOFtjYSA9ICh3cFszXSAmIG1hc2spXTsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJbiAtPSA0OworCQl3cCArPSA0OworCQlvcCArPSA0OworCQlvcFswXSA9IFRvTGluZWFyOFsoY3IgKz0gd3BbMF0pICYgbWFza107CisJCW9wWzFdID0gVG9MaW5lYXI4WyhjZyArPSB3cFsxXSkgJiBtYXNrXTsKKwkJb3BbMl0gPSBUb0xpbmVhcjhbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCQlvcFszXSA9IFRvTGluZWFyOFsoY2EgKz0gd3BbM10pICYgbWFza107CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBSRVBFQVQoc3RyaWRlLCAqb3AgPSBUb0xpbmVhcjhbKndwJm1hc2tdOyB3cCsrOyBvcCsrKQorCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsCisJCSAgICB3cFtzdHJpZGVdICs9ICp3cDsgKm9wID0gVG9MaW5lYXI4Wyp3cCZtYXNrXTsgd3ArKzsgb3ArKykKKwkJbiAtPSBzdHJpZGU7CisJICAgIH0KKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsQWNjdW11bGF0ZThhYmdyKHVpbnQxNiAqd3AsIGludCBuLCBpbnQgc3RyaWRlLCB1bnNpZ25lZCBjaGFyICpvcCwKKwl1bnNpZ25lZCBjaGFyICpUb0xpbmVhcjgpCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICBjciwgY2csIGNiLCBjYSwgbWFzazsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICB0MCwgdDEsIHQyLCB0MzsKKworICAgIGlmIChuID49IHN0cmlkZSkgeworCW1hc2sgPSBDT0RFX01BU0s7CisJaWYgKHN0cmlkZSA9PSAzKSB7CisJICAgIG9wWzBdID0gMDsKKwkgICAgdDEgPSBUb0xpbmVhcjhbY2IgPSAod3BbMl0gJiBtYXNrKV07CisJICAgIHQyID0gVG9MaW5lYXI4W2NnID0gKHdwWzFdICYgbWFzayldOworCSAgICB0MyA9IFRvTGluZWFyOFtjciA9ICh3cFswXSAmIG1hc2spXTsKKwkgICAgb3BbMV0gPSB0MTsKKwkgICAgb3BbMl0gPSB0MjsKKwkgICAgb3BbM10gPSB0MzsKKwkgICAgbiAtPSAzOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJbiAtPSAzOworCQl3cCArPSAzOworCQlvcCArPSA0OworCQlvcFswXSA9IDA7CisJCXQxID0gVG9MaW5lYXI4WyhjYiArPSB3cFsyXSkgJiBtYXNrXTsKKwkJdDIgPSBUb0xpbmVhcjhbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQl0MyA9IFRvTGluZWFyOFsoY3IgKz0gd3BbMF0pICYgbWFza107CisJCW9wWzFdID0gdDE7CisJCW9wWzJdID0gdDI7CisJCW9wWzNdID0gdDM7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIHQwID0gVG9MaW5lYXI4W2NhID0gKHdwWzNdICYgbWFzayldOworCSAgICB0MSA9IFRvTGluZWFyOFtjYiA9ICh3cFsyXSAmIG1hc2spXTsKKwkgICAgdDIgPSBUb0xpbmVhcjhbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIHQzID0gVG9MaW5lYXI4W2NyID0gKHdwWzBdICYgbWFzayldOworCSAgICBvcFswXSA9IHQwOworCSAgICBvcFsxXSA9IHQxOworCSAgICBvcFsyXSA9IHQyOworCSAgICBvcFszXSA9IHQzOworCSAgICBuIC09IDQ7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDQ7CisJCXdwICs9IDQ7CisJCW9wICs9IDQ7CisJCXQwID0gVG9MaW5lYXI4WyhjYSArPSB3cFszXSkgJiBtYXNrXTsKKwkJdDEgPSBUb0xpbmVhcjhbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCQl0MiA9IFRvTGluZWFyOFsoY2cgKz0gd3BbMV0pICYgbWFza107CisJCXQzID0gVG9MaW5lYXI4WyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJb3BbMF0gPSB0MDsKKwkJb3BbMV0gPSB0MTsKKwkJb3BbMl0gPSB0MjsKKwkJb3BbM10gPSB0MzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIFJFUEVBVChzdHJpZGUsICpvcCA9IFRvTGluZWFyOFsqd3AmbWFza107IHdwKys7IG9wKyspCisJICAgIG4gLT0gc3RyaWRlOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJUkVQRUFUKHN0cmlkZSwKKwkJICAgIHdwW3N0cmlkZV0gKz0gKndwOyAqb3AgPSBUb0xpbmVhcjhbKndwJm1hc2tdOyB3cCsrOyBvcCsrKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBTdGF0ZSBibG9jayBmb3IgZWFjaCBvcGVuIFRJRkYKKyAqIGZpbGUgdXNpbmcgUGl4YXJMb2cgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KKyAqLwordHlwZWRlZglzdHJ1Y3QgeworCVRJRkZQcmVkaWN0b3JTdGF0ZQlwcmVkaWN0OworCXpfc3RyZWFtCQlzdHJlYW07CisJdWludDE2CQkJKnRidWY7IAorCXVpbnQxNgkJCXN0cmlkZTsKKwlpbnQJCQlzdGF0ZTsKKwlpbnQJCQl1c2VyX2RhdGFmbXQ7CisJaW50CQkJcXVhbGl0eTsKKyNkZWZpbmUgUExTVEFURV9JTklUIDEKKworCVRJRkZWU2V0TWV0aG9kCQl2Z2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZAkJdnNldHBhcmVudDsJLyogc3VwZXItY2xhc3MgbWV0aG9kICovCisKKwlmbG9hdCAqVG9MaW5lYXJGOworCXVpbnQxNiAqVG9MaW5lYXIxNjsKKwl1bnNpZ25lZCBjaGFyICpUb0xpbmVhcjg7CisJdWludDE2ICAqRnJvbUxUMjsKKwl1aW50MTYgICpGcm9tMTQ7IC8qIFJlYWxseSBmb3IgMTYtYml0IGRhdGEsIGJ1dCB3ZSBzaGlmdCBkb3duIDIgKi8KKwl1aW50MTYgICpGcm9tODsKKwkKK30gUGl4YXJMb2dTdGF0ZTsKKworc3RhdGljIGludAorUGl4YXJMb2dNYWtlVGFibGVzKFBpeGFyTG9nU3RhdGUgKnNwKQoreworCisvKgorICogICAgV2UgbWFrZSBzZXZlcmFsIHRhYmxlcyBoZXJlIHRvIGNvbnZlcnQgYmV0d2VlbiB2YXJpb3VzIGV4dGVybmFsCisgKiAgICByZXByZXNlbnRhdGlvbnMgKGZsb2F0LCAxNi1iaXQsIGFuZCA4LWJpdCkgYW5kIHRoZSBpbnRlcm5hbAorICogICAgMTEtYml0IGNvbXBhbmRlZCByZXByZXNlbnRhdGlvbi4gIFRoZSAxMS1iaXQgcmVwcmVzZW50YXRpb24gaGFzIHR3bworICogICAgZGlzdGluY3QgcmVnaW9ucy4gIEEgbGluZWFyIGJvdHRvbSBlbmQgdXAgdGhyb3VnaCAuMDE4MzE2IGluIHN0ZXBzCisgKiAgICBvZiBhYm91dCAuMDAwMDczLCBhbmQgYSByZWdpb24gb2YgY29uc3RhbnQgcmF0aW8gdXAgdG8gYWJvdXQgMjUuCisgKiAgICBUaGVzZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBzdG9yZWQgaW4gdGhlIG1haW4gdGFibGUgVG9MaW5lYXJGLiAKKyAqICAgIEFsbCBvdGhlciB0YWJsZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGlzIG9uZS4gIFRoZSB0YWJsZXMgKGFuZCB0aGUKKyAqICAgIHJhdGlvcykgYXJlIGNvbnRpbnVvdXMgYXQgdGhlIGludGVybmFsIHNlYW0uCisgKi8KKworICAgIGludCAgbmxpbiwgbHQyc2l6ZTsKKyAgICBpbnQgIGksIGo7CisgICAgZG91YmxlICBiLCBjLCBsaW5zdGVwLCB2OworICAgIGZsb2F0ICpUb0xpbmVhckY7CisgICAgdWludDE2ICpUb0xpbmVhcjE2OworICAgIHVuc2lnbmVkIGNoYXIgKlRvTGluZWFyODsKKyAgICB1aW50MTYgICpGcm9tTFQyOworICAgIHVpbnQxNiAgKkZyb20xNDsgLyogUmVhbGx5IGZvciAxNi1iaXQgZGF0YSwgYnV0IHdlIHNoaWZ0IGRvd24gMiAqLworICAgIHVpbnQxNiAgKkZyb204OworCisgICAgYyA9IGxvZyhSQVRJTyk7CQorICAgIG5saW4gPSAoaW50KSgxLi9jKTsJLyogbmxpbiBtdXN0IGJlIGFuIGludGVnZXIgKi8KKyAgICBjID0gMS4vbmxpbjsKKyAgICBiID0gZXhwKC1jKk9ORSk7CS8qIG11bHRpcGxpY2F0aXZlIHNjYWxlIGZhY3RvciBbYipleHAoYypPTkUpID0gMV0gKi8KKyAgICBsaW5zdGVwID0gYipjKmV4cCgxLik7CisKKyAgICBMb2dLMSA9IChmbG9hdCkoMS4vYyk7CS8qIGlmICh2ID49IDIpICB0b2tlbiA9IGsxKmxvZyh2KmsyKSAqLworICAgIExvZ0syID0gKGZsb2F0KSgxLi9iKTsKKyAgICBsdDJzaXplID0gKGludCkoMi4vbGluc3RlcCkgKyAxOworICAgIEZyb21MVDIgPSAodWludDE2ICopX1RJRkZtYWxsb2MobHQyc2l6ZSpzaXplb2YodWludDE2KSk7CisgICAgRnJvbTE0ID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKDE2Mzg0KnNpemVvZih1aW50MTYpKTsKKyAgICBGcm9tOCA9ICh1aW50MTYgKilfVElGRm1hbGxvYygyNTYqc2l6ZW9mKHVpbnQxNikpOworICAgIFRvTGluZWFyRiA9IChmbG9hdCAqKV9USUZGbWFsbG9jKFRTSVpFUDEgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBUb0xpbmVhcjE2ID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKFRTSVpFUDEgKiBzaXplb2YodWludDE2KSk7CisgICAgVG9MaW5lYXI4ID0gKHVuc2lnbmVkIGNoYXIgKilfVElGRm1hbGxvYyhUU0laRVAxICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKyAgICBpZiAoRnJvbUxUMiA9PSBOVUxMIHx8IEZyb20xNCAgPT0gTlVMTCB8fCBGcm9tOCAgID09IE5VTEwgfHwKKwkgVG9MaW5lYXJGID09IE5VTEwgfHwgVG9MaW5lYXIxNiA9PSBOVUxMIHx8IFRvTGluZWFyOCA9PSBOVUxMKSB7CisJaWYgKEZyb21MVDIpIF9USUZGZnJlZShGcm9tTFQyKTsKKwlpZiAoRnJvbTE0KSBfVElGRmZyZWUoRnJvbTE0KTsKKwlpZiAoRnJvbTgpIF9USUZGZnJlZShGcm9tOCk7CisJaWYgKFRvTGluZWFyRikgX1RJRkZmcmVlKFRvTGluZWFyRik7CisJaWYgKFRvTGluZWFyMTYpIF9USUZGZnJlZShUb0xpbmVhcjE2KTsKKwlpZiAoVG9MaW5lYXI4KSBfVElGRmZyZWUoVG9MaW5lYXI4KTsKKwlzcC0+RnJvbUxUMiA9IE5VTEw7CisJc3AtPkZyb20xNCA9IE5VTEw7CisJc3AtPkZyb204ID0gTlVMTDsKKwlzcC0+VG9MaW5lYXJGID0gTlVMTDsKKwlzcC0+VG9MaW5lYXIxNiA9IE5VTEw7CisJc3AtPlRvTGluZWFyOCA9IE5VTEw7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaiA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmxpbjsgaSsrKSAgeworCXYgPSBpICogbGluc3RlcDsKKwlUb0xpbmVhckZbaisrXSA9IChmbG9hdCl2OworICAgIH0KKworICAgIGZvciAoaSA9IG5saW47IGkgPCBUU0laRTsgaSsrKQorCVRvTGluZWFyRltqKytdID0gKGZsb2F0KShiKmV4cChjKmkpKTsKKworICAgIFRvTGluZWFyRlsyMDQ4XSA9IFRvTGluZWFyRlsyMDQ3XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBUU0laRVAxOyBpKyspICB7CisJdiA9IFRvTGluZWFyRltpXSo2NTUzNS4wICsgMC41OworCVRvTGluZWFyMTZbaV0gPSAodiA+IDY1NTM1LjApID8gNjU1MzUgOiAodWludDE2KXY7CisJdiA9IFRvTGluZWFyRltpXSoyNTUuMCAgKyAwLjU7CisJVG9MaW5lYXI4W2ldICA9ICh2ID4gMjU1LjApID8gMjU1IDogKHVuc2lnbmVkIGNoYXIpdjsKKyAgICB9CisKKyAgICBqID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbHQyc2l6ZTsgaSsrKSAgeworCWlmICgoaSpsaW5zdGVwKSooaSpsaW5zdGVwKSA+IFRvTGluZWFyRltqXSpUb0xpbmVhckZbaisxXSkKKwkgICAgaisrOworCUZyb21MVDJbaV0gPSBqOworICAgIH0KKworICAgIC8qCisgICAgICogU2luY2Ugd2UgbG9zZSBpbmZvIGFueXdheSBvbiAxNi1iaXQgZGF0YSwgd2Ugc2V0IHVwIGEgMTQtYml0CisgICAgICogdGFibGUgYW5kIHNoaWZ0IDE2LWJpdCB2YWx1ZXMgZG93biB0d28gYml0cyBvbiBpbnB1dC4KKyAgICAgKiBzYXZlcyBhIGxpdHRsZSB0YWJsZSBzcGFjZS4KKyAgICAgKi8KKyAgICBqID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTYzODQ7IGkrKykgIHsKKwl3aGlsZSAoKGkvMTYzODMuKSooaS8xNjM4My4pID4gVG9MaW5lYXJGW2pdKlRvTGluZWFyRltqKzFdKQorCSAgICBqKys7CisJRnJvbTE0W2ldID0gajsKKyAgICB9CisKKyAgICBqID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspICB7CisJd2hpbGUgKChpLzI1NS4pKihpLzI1NS4pID4gVG9MaW5lYXJGW2pdKlRvTGluZWFyRltqKzFdKQorCSAgICBqKys7CisJRnJvbThbaV0gPSBqOworICAgIH0KKworICAgIEZsdHNpemUgPSAoZmxvYXQpKGx0MnNpemUvMik7CisKKyAgICBzcC0+VG9MaW5lYXJGID0gVG9MaW5lYXJGOworICAgIHNwLT5Ub0xpbmVhcjE2ID0gVG9MaW5lYXIxNjsKKyAgICBzcC0+VG9MaW5lYXI4ID0gVG9MaW5lYXI4OworICAgIHNwLT5Gcm9tTFQyID0gRnJvbUxUMjsKKyAgICBzcC0+RnJvbTE0ID0gRnJvbTE0OworICAgIHNwLT5Gcm9tOCA9IEZyb204OworCisgICAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgRGVjb2RlclN0YXRlKHRpZikJKChQaXhhckxvZ1N0YXRlKikgKHRpZiktPnRpZl9kYXRhKQorI2RlZmluZSBFbmNvZGVyU3RhdGUodGlmKQkoKFBpeGFyTG9nU3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisKK3N0YXRpYyBpbnQgUGl4YXJMb2dFbmNvZGUoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IFBpeGFyTG9nRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKTsKKworI2RlZmluZSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTgktMQorCitzdGF0aWMgaW50CitQaXhhckxvZ0d1ZXNzRGF0YUZtdChUSUZGRGlyZWN0b3J5ICp0ZCkKK3sKKwlpbnQgZ3Vlc3MgPSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTjsKKwlpbnQgZm9ybWF0ID0gdGQtPnRkX3NhbXBsZWZvcm1hdDsKKworCS8qIElmIHRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIGhpcyBkYXRhZm10LAorCSAqIHRha2Ugb3VyIGJlc3QgZ3Vlc3MgZnJvbSB0aGUgYml0c3BlcnNhbXBsZS4KKwkgKi8KKwlzd2l0Y2ggKHRkLT50ZF9iaXRzcGVyc2FtcGxlKSB7CisJIGNhc2UgMzI6CisJCWlmIChmb3JtYXQgPT0gU0FNUExFRk9STUFUX0lFRUVGUCkKKwkJCWd1ZXNzID0gUElYQVJMT0dEQVRBRk1UX0ZMT0FUOworCQlicmVhazsKKwkgY2FzZSAxNjoKKwkJaWYgKGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVk9JRCB8fCBmb3JtYXQgPT0gU0FNUExFRk9STUFUX1VJTlQpCisJCQlndWVzcyA9IFBJWEFSTE9HREFUQUZNVF8xNkJJVDsKKwkJYnJlYWs7CisJIGNhc2UgMTI6CisJCWlmIChmb3JtYXQgPT0gU0FNUExFRk9STUFUX1ZPSUQgfHwgZm9ybWF0ID09IFNBTVBMRUZPUk1BVF9JTlQpCisJCQlndWVzcyA9IFBJWEFSTE9HREFUQUZNVF8xMkJJVFBJQ0lPOworCQlicmVhazsKKwkgY2FzZSAxMToKKwkJaWYgKGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVk9JRCB8fCBmb3JtYXQgPT0gU0FNUExFRk9STUFUX1VJTlQpCisJCQlndWVzcyA9IFBJWEFSTE9HREFUQUZNVF8xMUJJVExPRzsKKwkJYnJlYWs7CisJIGNhc2UgODoKKwkJaWYgKGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVk9JRCB8fCBmb3JtYXQgPT0gU0FNUExFRk9STUFUX1VJTlQpCisJCQlndWVzcyA9IFBJWEFSTE9HREFUQUZNVF84QklUOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZ3Vlc3M7Cit9CisKK3N0YXRpYyB0bXNpemVfdAorbXVsdGlwbHlfbXModG1zaXplX3QgbTEsIHRtc2l6ZV90IG0yKQoreworCXRtc2l6ZV90IGJ5dGVzID0gbTEgKiBtMjsKKworCWlmIChtMSAmJiBieXRlcyAvIG0xICE9IG0yKQorCQlieXRlcyA9IDA7CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQKK1BpeGFyTG9nRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1BpeGFyTG9nU2V0dXBEZWNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlBpeGFyTG9nU2V0dXBEZWNvZGUiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlQaXhhckxvZ1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCXRtc2l6ZV90IHRidWZfc2l6ZTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCS8qIE1ha2Ugc3VyZSBubyBieXRlIHN3YXBwaW5nIGhhcHBlbnMgb24gdGhlIGRhdGEKKwkgKiBhZnRlciBkZWNvbXByZXNzaW9uLiAqLworCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsgIAorCisJLyogZm9yIHNvbWUgcmVhc29uLCB3ZSBjYW4ndCBkbyB0aGlzIGluIFRJRkZJbml0UGl4YXJMb2cgKi8KKworCXNwLT5zdHJpZGUgPSAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHID8KKwkgICAgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA6IDEpOworCXRidWZfc2l6ZSA9IG11bHRpcGx5X21zKG11bHRpcGx5X21zKG11bHRpcGx5X21zKHNwLT5zdHJpZGUsIHRkLT50ZF9pbWFnZXdpZHRoKSwKKwkJCQkgICAgICB0ZC0+dGRfcm93c3BlcnN0cmlwKSwgc2l6ZW9mKHVpbnQxNikpOworCWlmICh0YnVmX3NpemUgPT0gMCkKKwkJcmV0dXJuICgwKTsgICAvKiBUT0RPOiB0aGlzIGlzIGFuIGVycm9yIHJldHVybiB3aXRob3V0IGVycm9yIHJlcG9ydCB0aHJvdWdoIFRJRkZFcnJvckV4dCAqLworCXNwLT50YnVmID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyh0YnVmX3NpemUrc2l6ZW9mKHVpbnQxNikqc3AtPnN0cmlkZSk7CisJaWYgKHNwLT50YnVmID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gUElYQVJMT0dEQVRBRk1UX1VOS05PV04pCisJCXNwLT51c2VyX2RhdGFmbXQgPSBQaXhhckxvZ0d1ZXNzRGF0YUZtdCh0ZCk7CisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gUElYQVJMT0dEQVRBRk1UX1VOS05PV04pIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJQaXhhckxvZyBjb21wcmVzc2lvbiBjYW4ndCBoYW5kbGUgYml0cyBkZXB0aC9kYXRhIGZvcm1hdCBjb21iaW5hdGlvbiAoZGVwdGg6ICVkKSIsIAorCQkJdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChpbmZsYXRlSW5pdCgmc3AtPnN0cmVhbSkgIT0gWl9PSykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXMiLCBzcC0+c3RyZWFtLm1zZyk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJc3AtPnN0YXRlIHw9IFBMU1RBVEVfSU5JVDsKKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qCisgKiBTZXR1cCBzdGF0ZSBmb3IgZGVjb2RpbmcgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorUGl4YXJMb2dQcmVEZWNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ1ByZURlY29kZSI7CisJUGl4YXJMb2dTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlzcC0+c3RyZWFtLm5leHRfaW4gPSB0aWYtPnRpZl9yYXdkYXRhOworCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9pbik9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCisJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKKwkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKKwkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KSB0aWYtPnRpZl9yYXdjYzsKKwlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfaW4gIT0gdGlmLT50aWZfcmF3Y2MpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoaW5mbGF0ZVJlc2V0KCZzcC0+c3RyZWFtKSA9PSBaX09LKTsKK30KKworc3RhdGljIGludAorUGl4YXJMb2dEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUGl4YXJMb2dEZWNvZGUiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlQaXhhckxvZ1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCXRtc2l6ZV90IGk7CisJdG1zaXplX3QgbnNhbXBsZXM7CisJaW50IGxsZW47CisJdWludDE2ICp1cDsKKworCXN3aXRjaCAoc3AtPnVzZXJfZGF0YWZtdCkgeworCWNhc2UgUElYQVJMT0dEQVRBRk1UX0ZMT0FUOgorCQluc2FtcGxlcyA9IG9jYyAvIHNpemVvZihmbG9hdCk7CS8qIFhYWCBmbG9hdCA9PSAzMiBiaXRzICovCisJCWJyZWFrOworCWNhc2UgUElYQVJMT0dEQVRBRk1UXzE2QklUOgorCWNhc2UgUElYQVJMT0dEQVRBRk1UXzEyQklUUElDSU86CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTFCSVRMT0c6CisJCW5zYW1wbGVzID0gb2NjIC8gc2l6ZW9mKHVpbnQxNik7IC8qIFhYWCB1aW50MTYgPT0gMTYgYml0cyAqLworCQlicmVhazsKKwljYXNlIFBJWEFSTE9HREFUQUZNVF84QklUOgorCWNhc2UgUElYQVJMT0dEQVRBRk1UXzhCSVRBQkdSOgorCQluc2FtcGxlcyA9IG9jYzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSIlZCBiaXQgaW5wdXQgbm90IHN1cHBvcnRlZCBpbiBQaXhhckxvZyIsCisJCQl0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCXJldHVybiAwOworCX0KKworCWxsZW4gPSBzcC0+c3RyaWRlICogdGQtPnRkX2ltYWdld2lkdGg7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJc3AtPnN0cmVhbS5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopIHNwLT50YnVmOworCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9vdXQpPT00KTsgIC8qIGlmIHRoaXMgYXNzZXJ0IGdldHMgcmFpc2VkLAorCSAgICB3ZSBuZWVkIHRvIHNpbXBsaWZ5IHRoaXMgY29kZSB0byByZWZsZWN0IGEgWkxpYiB0aGF0IGlzIGxpa2VseSB1cGRhdGVkCisJICAgIHRvIGRlYWwgd2l0aCA4Ynl0ZSBtZW1vcnkgc2l6ZXMsIHRob3VnaCB0aGlzIGNvZGUgd2lsbCByZXNwb25kCisJICAgIGFwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLworCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpIChuc2FtcGxlcyAqIHNpemVvZih1aW50MTYpKTsKKwlpZiAoc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gbnNhbXBsZXMgKiBzaXplb2YodWludDE2KSkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGNhbm5vdCBkZWFsIHdpdGggYnVmZmVycyB0aGlzIHNpemUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZG8geworCQlpbnQgc3RhdGUgPSBpbmZsYXRlKCZzcC0+c3RyZWFtLCBaX1BBUlRJQUxfRkxVU0gpOworCQlpZiAoc3RhdGUgPT0gWl9TVFJFQU1fRU5EKSB7CisJCQlicmVhazsJCQkvKiBYWFggKi8KKwkJfQorCQlpZiAoc3RhdGUgPT0gWl9EQVRBX0VSUk9SKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJEZWNvZGluZyBlcnJvciBhdCBzY2FubGluZSAlbHUsICVzIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LCBzcC0+c3RyZWFtLm1zZyk7CisJCQlpZiAoaW5mbGF0ZVN5bmMoJnNwLT5zdHJlYW0pICE9IFpfT0spCisJCQkJcmV0dXJuICgwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGF0ZSAhPSBaX09LKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBlcnJvcjogJXMiLAorCQkJICAgIHNwLT5zdHJlYW0ubXNnKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9IHdoaWxlIChzcC0+c3RyZWFtLmF2YWlsX291dCA+IDApOworCisJLyogaG9wZWZ1bGx5LCB3ZSBnb3QgYWxsIHRoZSBieXRlcyB3ZSBuZWVkZWQgKi8KKwlpZiAoc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk5vdCBlbm91Z2ggZGF0YSBhdCBzY2FubGluZSAlbHUgKHNob3J0ICIgVElGRl9VSU5UNjRfRk9STUFUICIgYnl0ZXMpIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csIChUSUZGX1VJTlQ2NF9UKSBzcC0+c3RyZWFtLmF2YWlsX291dCk7CisJCXJldHVybiAoMCk7CisJfQorCisJdXAgPSBzcC0+dGJ1ZjsKKwkvKiBTd2FwIGJ5dGVzIGluIHRoZSBkYXRhIGlmIGZyb20gYSBkaWZmZXJlbnQgZW5kaWFuIG1hY2hpbmUuICovCisJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZTaG9ydCh1cCwgbnNhbXBsZXMpOworCisJLyoKKwkgKiBpZiBsbGVuIGlzIG5vdCBhbiBleGFjdCBtdWx0aXBsZSBvZiBuc2FtcGxlcywgdGhlIGRlY29kZSBvcGVyYXRpb24KKwkgKiBtYXkgb3ZlcmZsb3cgdGhlIG91dHB1dCBidWZmZXIsIHNvIHRydW5jYXRlIGl0IGVub3VnaCB0byBwcmV2ZW50CisJICogdGhhdCBidXQgc3RpbGwgc2FsdmFnZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUuCisJICovCisJaWYgKG5zYW1wbGVzICUgbGxlbikgeyAKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJInN0cmlkZSAlbHUgaXMgbm90IGEgbXVsdGlwbGUgb2Ygc2FtcGxlIGNvdW50LCAiCisJCQkiJWx1LCBkYXRhIHRydW5jYXRlZC4iLCAodW5zaWduZWQgbG9uZykgbGxlbiwgKHVuc2lnbmVkIGxvbmcpIG5zYW1wbGVzKTsKKwkJbnNhbXBsZXMgLT0gbnNhbXBsZXMgJSBsbGVuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuc2FtcGxlczsgaSArPSBsbGVuLCB1cCArPSBsbGVuKSB7CisJCXN3aXRjaCAoc3AtPnVzZXJfZGF0YWZtdCkgIHsKKwkJY2FzZSBQSVhBUkxPR0RBVEFGTVRfRkxPQVQ6CisJCQlob3Jpem9udGFsQWNjdW11bGF0ZUYodXAsIGxsZW4sIHNwLT5zdHJpZGUsCisJCQkJCShmbG9hdCAqKW9wLCBzcC0+VG9MaW5lYXJGKTsKKwkJCW9wICs9IGxsZW4gKiBzaXplb2YoZmxvYXQpOworCQkJYnJlYWs7CisJCWNhc2UgUElYQVJMT0dEQVRBRk1UXzE2QklUOgorCQkJaG9yaXpvbnRhbEFjY3VtdWxhdGUxNih1cCwgbGxlbiwgc3AtPnN0cmlkZSwKKwkJCQkJKHVpbnQxNiAqKW9wLCBzcC0+VG9MaW5lYXIxNik7CisJCQlvcCArPSBsbGVuICogc2l6ZW9mKHVpbnQxNik7CisJCQlicmVhazsKKwkJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTJCSVRQSUNJTzoKKwkJCWhvcml6b250YWxBY2N1bXVsYXRlMTIodXAsIGxsZW4sIHNwLT5zdHJpZGUsCisJCQkJCShpbnQxNiAqKW9wLCBzcC0+VG9MaW5lYXJGKTsKKwkJCW9wICs9IGxsZW4gKiBzaXplb2YoaW50MTYpOworCQkJYnJlYWs7CisJCWNhc2UgUElYQVJMT0dEQVRBRk1UXzExQklUTE9HOgorCQkJaG9yaXpvbnRhbEFjY3VtdWxhdGUxMSh1cCwgbGxlbiwgc3AtPnN0cmlkZSwKKwkJCQkJKHVpbnQxNiAqKW9wKTsKKwkJCW9wICs9IGxsZW4gKiBzaXplb2YodWludDE2KTsKKwkJCWJyZWFrOworCQljYXNlIFBJWEFSTE9HREFUQUZNVF84QklUOgorCQkJaG9yaXpvbnRhbEFjY3VtdWxhdGU4KHVwLCBsbGVuLCBzcC0+c3RyaWRlLAorCQkJCQkodW5zaWduZWQgY2hhciAqKW9wLCBzcC0+VG9MaW5lYXI4KTsKKwkJCW9wICs9IGxsZW4gKiBzaXplb2YodW5zaWduZWQgY2hhcik7CisJCQlicmVhazsKKwkJY2FzZSBQSVhBUkxPR0RBVEFGTVRfOEJJVEFCR1I6CisJCQlob3Jpem9udGFsQWNjdW11bGF0ZThhYmdyKHVwLCBsbGVuLCBzcC0+c3RyaWRlLAorCQkJCQkodW5zaWduZWQgY2hhciAqKW9wLCBzcC0+VG9MaW5lYXI4KTsKKwkJCW9wICs9IGxsZW4gKiBzaXplb2YodW5zaWduZWQgY2hhcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAiVW5zdXBwb3J0ZWQgYml0cy9zYW1wbGU6ICVkIiwKKwkJCQkgIHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitQaXhhckxvZ1NldHVwRW5jb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ1NldHVwRW5jb2RlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJUGl4YXJMb2dTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwl0bXNpemVfdCB0YnVmX3NpemU7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwkvKiBmb3Igc29tZSByZWFzb24sIHdlIGNhbid0IGRvIHRoaXMgaW4gVElGRkluaXRQaXhhckxvZyAqLworCisJc3AtPnN0cmlkZSA9ICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgPworCSAgICB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogMSk7CisJdGJ1Zl9zaXplID0gbXVsdGlwbHlfbXMobXVsdGlwbHlfbXMobXVsdGlwbHlfbXMoc3AtPnN0cmlkZSwgdGQtPnRkX2ltYWdld2lkdGgpLAorCQkJCSAgICAgIHRkLT50ZF9yb3dzcGVyc3RyaXApLCBzaXplb2YodWludDE2KSk7CisJaWYgKHRidWZfc2l6ZSA9PSAwKQorCQlyZXR1cm4gKDApOyAgLyogVE9ETzogdGhpcyBpcyBhbiBlcnJvciByZXR1cm4gd2l0aG91dCBlcnJvciByZXBvcnQgdGhyb3VnaCBUSUZGRXJyb3JFeHQgKi8KKwlzcC0+dGJ1ZiA9ICh1aW50MTYgKikgX1RJRkZtYWxsb2ModGJ1Zl9zaXplKTsKKwlpZiAoc3AtPnRidWYgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikKKwkJc3AtPnVzZXJfZGF0YWZtdCA9IFBpeGFyTG9nR3Vlc3NEYXRhRm10KHRkKTsKKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiUGl4YXJMb2cgY29tcHJlc3Npb24gY2FuJ3QgaGFuZGxlICVkIGJpdCBsaW5lYXIgZW5jb2RpbmdzIiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChkZWZsYXRlSW5pdCgmc3AtPnN0cmVhbSwgc3AtPnF1YWxpdHkpICE9IFpfT0spIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzIiwgc3AtPnN0cmVhbS5tc2cpOworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCXNwLT5zdGF0ZSB8PSBQTFNUQVRFX0lOSVQ7CisJCXJldHVybiAoMSk7CisJfQorfQorCisvKgorICogUmVzZXQgZW5jb2Rpbmcgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK1BpeGFyTG9nUHJlRW5jb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUGl4YXJMb2dQcmVFbmNvZGUiOworCVBpeGFyTG9nU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJc3AtPnN0cmVhbS5uZXh0X291dCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX291dCk9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCisJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKKwkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKKwkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCl0aWYtPnRpZl9yYXdkYXRhc2l6ZTsKKwlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IHRpZi0+dGlmX3Jhd2RhdGFzaXplKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgY2Fubm90IGRlYWwgd2l0aCBidWZmZXJzIHRoaXMgc2l6ZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKGRlZmxhdGVSZXNldCgmc3AtPnN0cmVhbSkgPT0gWl9PSyk7Cit9CisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsRGlmZmVyZW5jZUYoZmxvYXQgKmlwLCBpbnQgbiwgaW50IHN0cmlkZSwgdWludDE2ICp3cCwgdWludDE2ICpGcm9tTFQyKQoreworICAgIGludDMyIHIxLCBnMSwgYjEsIGExLCByMiwgZzIsIGIyLCBhMiwgbWFzazsKKyAgICBmbG9hdCBmbHRzaXplID0gRmx0c2l6ZTsKKworI2RlZmluZSAgQ0xBTVAodikgKCAodjwoZmxvYXQpMC4pICAgPyAwCQkJCVwKKwkJICA6ICh2PChmbG9hdCkyLikgICA/IEZyb21MVDJbKGludCkodipmbHRzaXplKV0JXAorCQkgIDogKHY+KGZsb2F0KTI0LjIpID8gMjA0NwkJCVwKKwkJICA6IExvZ0sxKmxvZyh2KkxvZ0syKSArIDAuNSApCisKKyAgICBtYXNrID0gQ09ERV9NQVNLOworICAgIGlmIChuID49IHN0cmlkZSkgeworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICByMiA9IHdwWzBdID0gKHVpbnQxNikgQ0xBTVAoaXBbMF0pOworCSAgICBnMiA9IHdwWzFdID0gKHVpbnQxNikgQ0xBTVAoaXBbMV0pOworCSAgICBiMiA9IHdwWzJdID0gKHVpbnQxNikgQ0xBTVAoaXBbMl0pOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDM7CisJCXdwICs9IDM7CisJCWlwICs9IDM7CisJCXIxID0gKGludDMyKSBDTEFNUChpcFswXSk7IHdwWzBdID0gKHIxLXIyKSAmIG1hc2s7IHIyID0gcjE7CisJCWcxID0gKGludDMyKSBDTEFNUChpcFsxXSk7IHdwWzFdID0gKGcxLWcyKSAmIG1hc2s7IGcyID0gZzE7CisJCWIxID0gKGludDMyKSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIHIyID0gd3BbMF0gPSAodWludDE2KSBDTEFNUChpcFswXSk7CisJICAgIGcyID0gd3BbMV0gPSAodWludDE2KSBDTEFNUChpcFsxXSk7CisJICAgIGIyID0gd3BbMl0gPSAodWludDE2KSBDTEFNUChpcFsyXSk7CisJICAgIGEyID0gd3BbM10gPSAodWludDE2KSBDTEFNUChpcFszXSk7CisJICAgIG4gLT0gNDsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCW4gLT0gNDsKKwkJd3AgKz0gNDsKKwkJaXAgKz0gNDsKKwkJcjEgPSAoaW50MzIpIENMQU1QKGlwWzBdKTsgd3BbMF0gPSAocjEtcjIpICYgbWFzazsgcjIgPSByMTsKKwkJZzEgPSAoaW50MzIpIENMQU1QKGlwWzFdKTsgd3BbMV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKKwkJYjEgPSAoaW50MzIpIENMQU1QKGlwWzJdKTsgd3BbMl0gPSAoYjEtYjIpICYgbWFzazsgYjIgPSBiMTsKKwkJYTEgPSAoaW50MzIpIENMQU1QKGlwWzNdKTsgd3BbM10gPSAoYTEtYTIpICYgbWFzazsgYTIgPSBhMTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlwICs9IG4gLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLworCSAgICB3cCArPSBuIC0gMTsJLyogcG9pbnQgdG8gbGFzdCBvbmUgKi8KKwkgICAgbiAtPSBzdHJpZGU7CisJICAgIHdoaWxlIChuID4gMCkgeworCQlSRVBFQVQoc3RyaWRlLCB3cFswXSA9ICh1aW50MTYpIENMQU1QKGlwWzBdKTsKKwkJCQl3cFtzdHJpZGVdIC09IHdwWzBdOworCQkJCXdwW3N0cmlkZV0gJj0gbWFzazsKKwkJCQl3cC0tOyBpcC0tKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCSAgICBSRVBFQVQoc3RyaWRlLCB3cFswXSA9ICh1aW50MTYpIENMQU1QKGlwWzBdKTsgd3AtLTsgaXAtLSkKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraG9yaXpvbnRhbERpZmZlcmVuY2UxNih1bnNpZ25lZCBzaG9ydCAqaXAsIGludCBuLCBpbnQgc3RyaWRlLCAKKwl1bnNpZ25lZCBzaG9ydCAqd3AsIHVpbnQxNiAqRnJvbTE0KQoreworICAgIHJlZ2lzdGVyIGludCAgcjEsIGcxLCBiMSwgYTEsIHIyLCBnMiwgYjIsIGEyLCBtYXNrOworCisvKiBhc3N1bXB0aW9uIGlzIHVuc2lnbmVkIHBpeGVsIHZhbHVlcyAqLworI3VuZGVmICAgQ0xBTVAKKyNkZWZpbmUgIENMQU1QKHYpIEZyb20xNFsodikgPj4gMl0KKworICAgIG1hc2sgPSBDT0RFX01BU0s7CisgICAgaWYgKG4gPj0gc3RyaWRlKSB7CisJaWYgKHN0cmlkZSA9PSAzKSB7CisJICAgIHIyID0gd3BbMF0gPSBDTEFNUChpcFswXSk7ICBnMiA9IHdwWzFdID0gQ0xBTVAoaXBbMV0pOworCSAgICBiMiA9IHdwWzJdID0gQ0xBTVAoaXBbMl0pOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDM7CisJCXdwICs9IDM7CisJCWlwICs9IDM7CisJCXIxID0gQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOworCQlnMSA9IENMQU1QKGlwWzFdKTsgd3BbMV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKKwkJYjEgPSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIHIyID0gd3BbMF0gPSBDTEFNUChpcFswXSk7ICBnMiA9IHdwWzFdID0gQ0xBTVAoaXBbMV0pOworCSAgICBiMiA9IHdwWzJdID0gQ0xBTVAoaXBbMl0pOyAgYTIgPSB3cFszXSA9IENMQU1QKGlwWzNdKTsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJbiAtPSA0OworCQl3cCArPSA0OworCQlpcCArPSA0OworCQlyMSA9IENMQU1QKGlwWzBdKTsgd3BbMF0gPSAocjEtcjIpICYgbWFzazsgcjIgPSByMTsKKwkJZzEgPSBDTEFNUChpcFsxXSk7IHdwWzFdID0gKGcxLWcyKSAmIG1hc2s7IGcyID0gZzE7CisJCWIxID0gQ0xBTVAoaXBbMl0pOyB3cFsyXSA9IChiMS1iMikgJiBtYXNrOyBiMiA9IGIxOworCQlhMSA9IENMQU1QKGlwWzNdKTsgd3BbM10gPSAoYTEtYTIpICYgbWFzazsgYTIgPSBhMTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlwICs9IG4gLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLworCSAgICB3cCArPSBuIC0gMTsJLyogcG9pbnQgdG8gbGFzdCBvbmUgKi8KKwkgICAgbiAtPSBzdHJpZGU7CisJICAgIHdoaWxlIChuID4gMCkgeworCQlSRVBFQVQoc3RyaWRlLCB3cFswXSA9IENMQU1QKGlwWzBdKTsKKwkJCQl3cFtzdHJpZGVdIC09IHdwWzBdOworCQkJCXdwW3N0cmlkZV0gJj0gbWFzazsKKwkJCQl3cC0tOyBpcC0tKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCSAgICBSRVBFQVQoc3RyaWRlLCB3cFswXSA9IENMQU1QKGlwWzBdKTsgd3AtLTsgaXAtLSkKKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsRGlmZmVyZW5jZTgodW5zaWduZWQgY2hhciAqaXAsIGludCBuLCBpbnQgc3RyaWRlLCAKKwl1bnNpZ25lZCBzaG9ydCAqd3AsIHVpbnQxNiAqRnJvbTgpCit7CisgICAgcmVnaXN0ZXIgaW50ICByMSwgZzEsIGIxLCBhMSwgcjIsIGcyLCBiMiwgYTIsIG1hc2s7CisKKyN1bmRlZgkgQ0xBTVAKKyNkZWZpbmUgIENMQU1QKHYpIChGcm9tOFsodildKQorCisgICAgbWFzayA9IENPREVfTUFTSzsKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwlpZiAoc3RyaWRlID09IDMpIHsKKwkgICAgcjIgPSB3cFswXSA9IENMQU1QKGlwWzBdKTsgIGcyID0gd3BbMV0gPSBDTEFNUChpcFsxXSk7CisJICAgIGIyID0gd3BbMl0gPSBDTEFNUChpcFsyXSk7CisJICAgIG4gLT0gMzsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCW4gLT0gMzsKKwkJcjEgPSBDTEFNUChpcFszXSk7IHdwWzNdID0gKHIxLXIyKSAmIG1hc2s7IHIyID0gcjE7CisJCWcxID0gQ0xBTVAoaXBbNF0pOyB3cFs0XSA9IChnMS1nMikgJiBtYXNrOyBnMiA9IGcxOworCQliMSA9IENMQU1QKGlwWzVdKTsgd3BbNV0gPSAoYjEtYjIpICYgbWFzazsgYjIgPSBiMTsKKwkJd3AgKz0gMzsKKwkJaXAgKz0gMzsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RyaWRlID09IDQpIHsKKwkgICAgcjIgPSB3cFswXSA9IENMQU1QKGlwWzBdKTsgIGcyID0gd3BbMV0gPSBDTEFNUChpcFsxXSk7CisJICAgIGIyID0gd3BbMl0gPSBDTEFNUChpcFsyXSk7ICBhMiA9IHdwWzNdID0gQ0xBTVAoaXBbM10pOworCSAgICBuIC09IDQ7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDQ7CisJCXIxID0gQ0xBTVAoaXBbNF0pOyB3cFs0XSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOworCQlnMSA9IENMQU1QKGlwWzVdKTsgd3BbNV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKKwkJYjEgPSBDTEFNUChpcFs2XSk7IHdwWzZdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7CisJCWExID0gQ0xBTVAoaXBbN10pOyB3cFs3XSA9IChhMS1hMikgJiBtYXNrOyBhMiA9IGExOworCQl3cCArPSA0OworCQlpcCArPSA0OworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgd3AgKz0gbiArIHN0cmlkZSAtIDE7CS8qIHBvaW50IHRvIGxhc3Qgb25lICovCisJICAgIGlwICs9IG4gKyBzdHJpZGUgLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLworCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOworCQkJCXdwW3N0cmlkZV0gLT0gd3BbMF07CisJCQkJd3Bbc3RyaWRlXSAmPSBtYXNrOworCQkJCXdwLS07IGlwLS0pCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJICAgIFJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOyB3cC0tOyBpcC0tKQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBFbmNvZGUgYSBjaHVuayBvZiBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK1BpeGFyTG9nRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUGl4YXJMb2dFbmNvZGUiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlQaXhhckxvZ1N0YXRlICpzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCXRtc2l6ZV90IGk7CisJdG1zaXplX3QgbjsKKwlpbnQgbGxlbjsKKwl1bnNpZ25lZCBzaG9ydCAqIHVwOworCisJKHZvaWQpIHM7CisKKwlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwljYXNlIFBJWEFSTE9HREFUQUZNVF9GTE9BVDoKKwkJbiA9IGNjIC8gc2l6ZW9mKGZsb2F0KTsJCS8qIFhYWCBmbG9hdCA9PSAzMiBiaXRzICovCisJCWJyZWFrOworCWNhc2UgUElYQVJMT0dEQVRBRk1UXzE2QklUOgorCWNhc2UgUElYQVJMT0dEQVRBRk1UXzEyQklUUElDSU86CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTFCSVRMT0c6CisJCW4gPSBjYyAvIHNpemVvZih1aW50MTYpOwkvKiBYWFggdWludDE2ID09IDE2IGJpdHMgKi8KKwkJYnJlYWs7CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfOEJJVDoKKwljYXNlIFBJWEFSTE9HREFUQUZNVF84QklUQUJHUjoKKwkJbiA9IGNjOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIiVkIGJpdCBpbnB1dCBub3Qgc3VwcG9ydGVkIGluIFBpeGFyTG9nIiwKKwkJCXRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGxlbiA9IHNwLT5zdHJpZGUgKiB0ZC0+dGRfaW1hZ2V3aWR0aDsKKworCWZvciAoaSA9IDAsIHVwID0gc3AtPnRidWY7IGkgPCBuOyBpICs9IGxsZW4sIHVwICs9IGxsZW4pIHsKKwkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSAgeworCQljYXNlIFBJWEFSTE9HREFUQUZNVF9GTE9BVDoKKwkJCWhvcml6b250YWxEaWZmZXJlbmNlRigoZmxvYXQgKilicCwgbGxlbiwgCisJCQkJc3AtPnN0cmlkZSwgdXAsIHNwLT5Gcm9tTFQyKTsKKwkJCWJwICs9IGxsZW4gKiBzaXplb2YoZmxvYXQpOworCQkJYnJlYWs7CisJCWNhc2UgUElYQVJMT0dEQVRBRk1UXzE2QklUOgorCQkJaG9yaXpvbnRhbERpZmZlcmVuY2UxNigodWludDE2ICopYnAsIGxsZW4sIAorCQkJCXNwLT5zdHJpZGUsIHVwLCBzcC0+RnJvbTE0KTsKKwkJCWJwICs9IGxsZW4gKiBzaXplb2YodWludDE2KTsKKwkJCWJyZWFrOworCQljYXNlIFBJWEFSTE9HREFUQUZNVF84QklUOgorCQkJaG9yaXpvbnRhbERpZmZlcmVuY2U4KCh1bnNpZ25lZCBjaGFyICopYnAsIGxsZW4sIAorCQkJCXNwLT5zdHJpZGUsIHVwLCBzcC0+RnJvbTgpOworCQkJYnAgKz0gbGxlbiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiJWQgYml0IGlucHV0IG5vdCBzdXBwb3J0ZWQgaW4gUGl4YXJMb2ciLAorCQkJCXRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorIAorCXNwLT5zdHJlYW0ubmV4dF9pbiA9ICh1bnNpZ25lZCBjaGFyICopIHNwLT50YnVmOworCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9pbik9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCisJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKKwkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKKwkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KSAobiAqIHNpemVvZih1aW50MTYpKTsKKwlpZiAoKHNwLT5zdHJlYW0uYXZhaWxfaW4gLyBzaXplb2YodWludDE2KSkgIT0gKHVJbnQpIG4pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCisJZG8geworCQlpZiAoZGVmbGF0ZSgmc3AtPnN0cmVhbSwgWl9OT19GTFVTSCkgIT0gWl9PSykgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkVuY29kZXIgZXJyb3I6ICVzIiwKKwkJCSAgICBzcC0+c3RyZWFtLm1zZyk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmIChzcC0+c3RyZWFtLmF2YWlsX291dCA9PSAwKSB7CisJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCQkJVElGRkZsdXNoRGF0YTEodGlmKTsKKwkJCXNwLT5zdHJlYW0ubmV4dF9vdXQgPSB0aWYtPnRpZl9yYXdkYXRhOworCQkJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkgdGlmLT50aWZfcmF3ZGF0YXNpemU7ICAvKiB0aGlzIGlzIGEgc2FmZSB0eXBlY2FzdCwgYXMgY2hlY2sgaXMgbWFkZSBhbHJlYWR5IGluIFBpeGFyTG9nUHJlRW5jb2RlICovCisJCX0KKwl9IHdoaWxlIChzcC0+c3RyZWFtLmF2YWlsX2luID4gMCk7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEZpbmlzaCBvZmYgYW4gZW5jb2RlZCBzdHJpcCBieSBmbHVzaGluZyB0aGUgbGFzdAorICogc3RyaW5nIGFuZCB0YWNraW5nIG9uIGFuIEVuZCBPZiBJbmZvcm1hdGlvbiBjb2RlLgorICovCisKK3N0YXRpYyBpbnQKK1BpeGFyTG9nUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUGl4YXJMb2dQb3N0RW5jb2RlIjsKKwlQaXhhckxvZ1N0YXRlICpzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCWludCBzdGF0ZTsKKworCXNwLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworCisJZG8geworCQlzdGF0ZSA9IGRlZmxhdGUoJnNwLT5zdHJlYW0sIFpfRklOSVNIKTsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFpfU1RSRUFNX0VORDoKKwkJY2FzZSBaX09LOgorCQkgICAgaWYgKCh0bXNpemVfdClzcC0+c3RyZWFtLmF2YWlsX291dCAhPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkgeworCQkJICAgIHRpZi0+dGlmX3Jhd2NjID0KKwkJCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHNwLT5zdHJlYW0uYXZhaWxfb3V0OworCQkJICAgIFRJRkZGbHVzaERhdGExKHRpZik7CisJCQkgICAgc3AtPnN0cmVhbS5uZXh0X291dCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJCQkgICAgc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkgdGlmLT50aWZfcmF3ZGF0YXNpemU7ICAvKiB0aGlzIGlzIGEgc2FmZSB0eXBlY2FzdCwgYXMgY2hlY2sgaXMgbWFkZSBhbHJlYWR5IGluIFBpeGFyTG9nUHJlRW5jb2RlICovCisJCSAgICB9CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCisJCQlzcC0+c3RyZWFtLm1zZyk7CisJCSAgICByZXR1cm4gKDApOworCQl9CisJfSB3aGlsZSAoc3RhdGUgIT0gWl9TVFJFQU1fRU5EKTsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorUGl4YXJMb2dDbG9zZShUSUZGKiB0aWYpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisJLyogSW4gYSByZWFsbHkgc25lYWt5IChhbmQgcmVhbGx5IGluY29ycmVjdCwgYW5kIHVudHJ1dGhmdWxsLCBhbmQKKwkgKiB0cm91Ymxlc29tZSwgYW5kIGVycm9yLXByb25lKSBtYW5ldXZlciB0aGF0IGNvbXBsZXRlbHkgZ29lcyBhZ2FpbnN0CisJICogdGhlIHNwaXJpdCBvZiBUSUZGLCBhbmQgYnJlYWtzIFRJRkYsIG9uIGNsb3NlLCB3ZSBjb3ZlcnRseQorCSAqIG1vZGlmeSBib3RoIGJpdHNwZXJzYW1wbGUgYW5kIHNhbXBsZWZvcm1hdCBpbiB0aGUgZGlyZWN0b3J5IHRvCisJICogaW5kaWNhdGUgOC1iaXQgbGluZWFyLiAgVGhpcyB3YXksIHRoZSBkZWNvZGUgImp1c3Qgd29ya3MiIGV2ZW4gZm9yCisJICogcmVhZGVycyB0aGF0IGRvbid0IGtub3cgYWJvdXQgUGl4YXJMb2csIG9yIGhvdyB0byBzZXQKKwkgKiB0aGUgUElYQVJMT0dEQVRGTVQgcHNldWRvLXRhZy4KKwkgKi8KKwl0ZC0+dGRfYml0c3BlcnNhbXBsZSA9IDg7CisJdGQtPnRkX3NhbXBsZWZvcm1hdCA9IFNBTVBMRUZPUk1BVF9VSU5UOworfQorCitzdGF0aWMgdm9pZAorUGl4YXJMb2dDbGVhbnVwKFRJRkYqIHRpZikKK3sKKwlQaXhhckxvZ1N0YXRlKiBzcCA9IChQaXhhckxvZ1N0YXRlKikgdGlmLT50aWZfZGF0YTsKKworCWFzc2VydChzcCAhPSAwKTsKKworCSh2b2lkKVRJRkZQcmVkaWN0b3JDbGVhbnVwKHRpZik7CisKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IHNwLT52Z2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gc3AtPnZzZXRwYXJlbnQ7CisKKwlpZiAoc3AtPkZyb21MVDIpIF9USUZGZnJlZShzcC0+RnJvbUxUMik7CisJaWYgKHNwLT5Gcm9tMTQpIF9USUZGZnJlZShzcC0+RnJvbTE0KTsKKwlpZiAoc3AtPkZyb204KSBfVElGRmZyZWUoc3AtPkZyb204KTsKKwlpZiAoc3AtPlRvTGluZWFyRikgX1RJRkZmcmVlKHNwLT5Ub0xpbmVhckYpOworCWlmIChzcC0+VG9MaW5lYXIxNikgX1RJRkZmcmVlKHNwLT5Ub0xpbmVhcjE2KTsKKwlpZiAoc3AtPlRvTGluZWFyOCkgX1RJRkZmcmVlKHNwLT5Ub0xpbmVhcjgpOworCWlmIChzcC0+c3RhdGUmUExTVEFURV9JTklUKSB7CisJCWlmICh0aWYtPnRpZl9tb2RlID09IE9fUkRPTkxZKQorCQkJaW5mbGF0ZUVuZCgmc3AtPnN0cmVhbSk7CisJCWVsc2UKKwkJCWRlZmxhdGVFbmQoJnNwLT5zdHJlYW0pOworCX0KKwlpZiAoc3AtPnRidWYpCisJCV9USUZGZnJlZShzcC0+dGJ1Zik7CisJX1RJRkZmcmVlKHNwKTsKKwl0aWYtPnRpZl9kYXRhID0gTlVMTDsKKworCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKK30KKworc3RhdGljIGludAorUGl4YXJMb2dWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlBpeGFyTG9nVlNldEZpZWxkIjsKKyAgICBQaXhhckxvZ1N0YXRlICpzcCA9IChQaXhhckxvZ1N0YXRlICopdGlmLT50aWZfZGF0YTsKKyAgICBpbnQgcmVzdWx0OworCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgY2FzZSBUSUZGVEFHX1BJWEFSTE9HUVVBTElUWToKKwkJc3AtPnF1YWxpdHkgPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCWlmICh0aWYtPnRpZl9tb2RlICE9IE9fUkRPTkxZICYmIChzcC0+c3RhdGUmUExTVEFURV9JTklUKSkgeworCQkJaWYgKGRlZmxhdGVQYXJhbXMoJnNwLT5zdHJlYW0sCisJCQkgICAgc3AtPnF1YWxpdHksIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCisJCQkJCXNwLT5zdHJlYW0ubXNnKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQl9CisJCXJldHVybiAoMSk7CisgICAgIGNhc2UgVElGRlRBR19QSVhBUkxPR0RBVEFGTVQ6CisJc3AtPnVzZXJfZGF0YWZtdCA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkvKiBUd2VhayB0aGUgVElGRiBoZWFkZXIgc28gdGhhdCB0aGUgcmVzdCBvZiBsaWJ0aWZmIGtub3dzIHdoYXQKKwkgKiBzaXplIG9mIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmV0d2VlbiBhcHAgYW5kIGxpYnJhcnksIGFuZAorCSAqIGFzc3VtZSB0aGF0IHRoZSBhcHAga25vd3Mgd2hhdCBpdCBpcyBkb2luZyBhbmQgaXMgbm90CisJICogY29uZnVzZWQgYnkgdGhlc2UgaGVhZGVyIG1hbmlwdWxhdGlvbnMuLi4KKwkgKi8KKwlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpIHsKKwkgY2FzZSBQSVhBUkxPR0RBVEFGTVRfOEJJVDoKKwkgY2FzZSBQSVhBUkxPR0RBVEFGTVRfOEJJVEFCR1I6CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgOCk7CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0FNUExFRk9STUFULCBTQU1QTEVGT1JNQVRfVUlOVCk7CisJICAgIGJyZWFrOworCSBjYXNlIFBJWEFSTE9HREFUQUZNVF8xMUJJVExPRzoKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAxNik7CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0FNUExFRk9STUFULCBTQU1QTEVGT1JNQVRfVUlOVCk7CisJICAgIGJyZWFrOworCSBjYXNlIFBJWEFSTE9HREFUQUZNVF8xMkJJVFBJQ0lPOgorCSAgICBUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsIDE2KTsKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19TQU1QTEVGT1JNQVQsIFNBTVBMRUZPUk1BVF9JTlQpOworCSAgICBicmVhazsKKwkgY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTZCSVQ6CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgMTYpOworCSAgICBUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgU0FNUExFRk9STUFUX1VJTlQpOworCSAgICBicmVhazsKKwkgY2FzZSBQSVhBUkxPR0RBVEFGTVRfRkxPQVQ6CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgMzIpOworCSAgICBUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgU0FNUExFRk9STUFUX0lFRUVGUCk7CisJICAgIGJyZWFrOworCX0KKwkvKgorCSAqIE11c3QgcmVjYWxjdWxhdGUgc2l6ZXMgc2hvdWxkIGJpdHMvc2FtcGxlIGNoYW5nZS4KKwkgKi8KKwl0aWYtPnRpZl90aWxlc2l6ZSA9IGlzVGlsZWQodGlmKSA/IFRJRkZUaWxlU2l6ZSh0aWYpIDogKHRtc2l6ZV90KSgtMSk7CisJdGlmLT50aWZfc2NhbmxpbmVzaXplID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCXJlc3VsdCA9IDE7CQkvKiBOQjogcHNldWRvIHRhZyAqLworCWJyZWFrOworICAgICBkZWZhdWx0OgorCXJlc3VsdCA9ICgqc3AtPnZzZXRwYXJlbnQpKHRpZiwgdGFnLCBhcCk7CisgICAgfQorICAgIHJldHVybiAocmVzdWx0KTsKK30KKworc3RhdGljIGludAorUGl4YXJMb2dWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworICAgIFBpeGFyTG9nU3RhdGUgKnNwID0gKFBpeGFyTG9nU3RhdGUgKil0aWYtPnRpZl9kYXRhOworCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgY2FzZSBUSUZGVEFHX1BJWEFSTE9HUVVBTElUWToKKwkqdmFfYXJnKGFwLCBpbnQqKSA9IHNwLT5xdWFsaXR5OworCWJyZWFrOworICAgICBjYXNlIFRJRkZUQUdfUElYQVJMT0dEQVRBRk1UOgorCSp2YV9hcmcoYXAsIGludCopID0gc3AtPnVzZXJfZGF0YWZtdDsKKwlicmVhazsKKyAgICAgZGVmYXVsdDoKKwlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworc3RhdGljIGNvbnN0IFRJRkZGaWVsZCBwaXhhcmxvZ0ZpZWxkc1tdID0geworICAgIHtUSUZGVEFHX1BJWEFSTE9HREFUQUZNVCwgMCwgMCwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIEZBTFNFLCBGQUxTRSwgIiIsIE5VTEx9LAorICAgIHtUSUZGVEFHX1BJWEFSTE9HUVVBTElUWSwgMCwgMCwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIEZBTFNFLCBGQUxTRSwgIiIsIE5VTEx9Cit9OworCitpbnQKK1RJRkZJbml0UGl4YXJMb2coVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZJbml0UGl4YXJMb2ciOworCisJUGl4YXJMb2dTdGF0ZSogc3A7CisKKwlhc3NlcnQoc2NoZW1lID09IENPTVBSRVNTSU9OX1BJWEFSTE9HKTsKKworCS8qCisJICogTWVyZ2UgY29kZWMtc3BlY2lmaWMgdGFnIGluZm9ybWF0aW9uLgorCSAqLworCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIHBpeGFybG9nRmllbGRzLAorCQkJICAgICAgVElGRkFycmF5Q291bnQocGl4YXJsb2dGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiTWVyZ2luZyBQaXhhckxvZyBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHN0YXRlIGJsb2NrIHNvIHRhZyBtZXRob2RzIGhhdmUgc3RvcmFnZSB0byByZWNvcmQgdmFsdWVzLgorCSAqLworCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YgKFBpeGFyTG9nU3RhdGUpKTsKKwlpZiAodGlmLT50aWZfZGF0YSA9PSBOVUxMKQorCQlnb3RvIGJhZDsKKwlzcCA9IChQaXhhckxvZ1N0YXRlKikgdGlmLT50aWZfZGF0YTsKKwlfVElGRm1lbXNldChzcCwgMCwgc2l6ZW9mICgqc3ApKTsKKwlzcC0+c3RyZWFtLmRhdGFfdHlwZSA9IFpfQklOQVJZOworCXNwLT51c2VyX2RhdGFmbXQgPSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTjsKKworCS8qCisJICogSW5zdGFsbCBjb2RlYyBtZXRob2RzLgorCSAqLworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IFBpeGFyTG9nRml4dXBUYWdzOyAKKwl0aWYtPnRpZl9zZXR1cGRlY29kZSA9IFBpeGFyTG9nU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfcHJlZGVjb2RlID0gUGl4YXJMb2dQcmVEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gUGl4YXJMb2dEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBQaXhhckxvZ0RlY29kZTsgIAorCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBQaXhhckxvZ0RlY29kZTsKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IFBpeGFyTG9nU2V0dXBFbmNvZGU7CisJdGlmLT50aWZfcHJlZW5jb2RlID0gUGl4YXJMb2dQcmVFbmNvZGU7CisJdGlmLT50aWZfcG9zdGVuY29kZSA9IFBpeGFyTG9nUG9zdEVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVyb3cgPSBQaXhhckxvZ0VuY29kZTsgIAorCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gUGl4YXJMb2dFbmNvZGU7CisJdGlmLT50aWZfZW5jb2RldGlsZSA9IFBpeGFyTG9nRW5jb2RlOyAgCisJdGlmLT50aWZfY2xvc2UgPSBQaXhhckxvZ0Nsb3NlOworCXRpZi0+dGlmX2NsZWFudXAgPSBQaXhhckxvZ0NsZWFudXA7CisKKwkvKiBPdmVycmlkZSBTZXRGaWVsZCBzbyB3ZSBjYW4gaGFuZGxlIG91ciBwcml2YXRlIHBzZXVkby10YWcgKi8KKwlzcC0+dmdldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gUGl4YXJMb2dWR2V0RmllbGQ7ICAgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCXNwLT52c2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBQaXhhckxvZ1ZTZXRGaWVsZDsgICAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisKKwkvKiBEZWZhdWx0IHZhbHVlcyBmb3IgY29kZWMtc3BlY2lmaWMgZmllbGRzICovCisJc3AtPnF1YWxpdHkgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047IC8qIGRlZmF1bHQgY29tcC4gbGV2ZWwgKi8KKwlzcC0+c3RhdGUgPSAwOworCisJLyogd2UgZG9uJ3Qgd2lzaCB0byB1c2UgdGhlIHByZWRpY3RvciwgCisJICogdGhlIGRlZmF1bHQgaXMgbm9uZSwgd2hpY2ggcHJlZGljdG9yIHZhbHVlIDEKKwkgKi8KKwkodm9pZCkgVElGRlByZWRpY3RvckluaXQodGlmKTsKKworCS8qCisJICogYnVpbGQgdGhlIGNvbXBhbmRpbmcgdGFibGVzIAorCSAqLworCVBpeGFyTG9nTWFrZVRhYmxlcyhzcCk7CisKKwlyZXR1cm4gKDEpOworYmFkOgorCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAgIk5vIHNwYWNlIGZvciBQaXhhckxvZyBzdGF0ZSBibG9jayIpOworCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogUElYQVJMT0dfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wcmVkaWN0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wcmVkaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwZDAxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3ByZWRpY3QuYwpAQCAtMCwwICsxLDgxMyBAQAorLyogJElkOiB0aWZfcHJlZGljdC5jLHYgMS4zMiAyMDEwLTAzLTEwIDE4OjU2OjQ5IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIFByZWRpY3RvciBUYWcgU3VwcG9ydCAodXNlZCBieSBtdWx0aXBsZSBjb2RlY3MpLgorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSAidGlmX3ByZWRpY3QuaCIKKworI2RlZmluZQlQcmVkaWN0b3JTdGF0ZSh0aWYpCSgoVElGRlByZWRpY3RvclN0YXRlKikgKHRpZiktPnRpZl9kYXRhKQorCitzdGF0aWMgdm9pZCBob3JBY2M4KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgaG9yQWNjMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBob3JBY2MzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyB2b2lkIHN3YWJIb3JBY2MxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyB2b2lkIHN3YWJIb3JBY2MzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyB2b2lkIGhvckRpZmY4KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgaG9yRGlmZjE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgaG9yRGlmZjMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgZnBBY2MoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBmcERpZmYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IFByZWRpY3RvckRlY29kZVJvdyhUSUZGKiB0aWYsIHVpbnQ4KiBvcDAsIHRtc2l6ZV90IG9jYzAsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgUHJlZGljdG9yRGVjb2RlVGlsZShUSUZGKiB0aWYsIHVpbnQ4KiBvcDAsIHRtc2l6ZV90IG9jYzAsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgUHJlZGljdG9yRW5jb2RlUm93KFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworc3RhdGljIGludCBQcmVkaWN0b3JFbmNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIGJwMCwgdG1zaXplX3QgY2MwLCB1aW50MTYgcyk7CisKK3N0YXRpYyBpbnQKK1ByZWRpY3RvclNldHVwKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQcmVkaWN0b3JTZXR1cCI7CisKKwlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwlzd2l0Y2ggKHNwLT5wcmVkaWN0b3IpCQkvKiBubyBkaWZmZXJlbmNpbmcgKi8KKwl7CisJCWNhc2UgUFJFRElDVE9SX05PTkU6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBQUkVESUNUT1JfSE9SSVpPTlRBTDoKKwkJCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSA4CisJCQkgICAgJiYgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gMTYKKwkJCSAgICAmJiB0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSAzMikgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICJIb3Jpem9udGFsIGRpZmZlcmVuY2luZyBcIlByZWRpY3RvclwiIG5vdCBzdXBwb3J0ZWQgd2l0aCAlZC1iaXQgc2FtcGxlcyIsCisJCQkJICAgIHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBSRURJQ1RPUl9GTE9BVElOR1BPSU5UOgorCQkJaWYgKHRkLT50ZF9zYW1wbGVmb3JtYXQgIT0gU0FNUExFRk9STUFUX0lFRUVGUCkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICJGbG9hdGluZyBwb2ludCBcIlByZWRpY3RvclwiIG5vdCBzdXBwb3J0ZWQgd2l0aCAlZCBkYXRhIGZvcm1hdCIsCisJCQkJICAgIHRkLT50ZF9zYW1wbGVmb3JtYXQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJcIlByZWRpY3RvclwiIHZhbHVlICVkIG5vdCBzdXBwb3J0ZWQiLAorCQkJICAgIHNwLT5wcmVkaWN0b3IpOworCQkJcmV0dXJuIDA7CisJfQorCXNwLT5zdHJpZGUgPSAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHID8KKwkgICAgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA6IDEpOworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBzY2FubGluZS90aWxlLXdpZHRoIHNpemUgaW4gYnl0ZXMuCisJICovCisJaWYgKGlzVGlsZWQodGlmKSkKKwkJc3AtPnJvd3NpemUgPSBUSUZGVGlsZVJvd1NpemUodGlmKTsKKwllbHNlCisJCXNwLT5yb3dzaXplID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCWlmIChzcC0+cm93c2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitQcmVkaWN0b3JTZXR1cERlY29kZShUSUZGKiB0aWYpCit7CisJVElGRlByZWRpY3RvclN0YXRlKiBzcCA9IFByZWRpY3RvclN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCisJaWYgKCEoKnNwLT5zZXR1cGRlY29kZSkodGlmKSB8fCAhUHJlZGljdG9yU2V0dXAodGlmKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3AtPnByZWRpY3RvciA9PSAyKSB7CisJCXN3aXRjaCAodGQtPnRkX2JpdHNwZXJzYW1wbGUpIHsKKwkJCWNhc2UgODogIHNwLT5kZWNvZGVwZnVuYyA9IGhvckFjYzg7IGJyZWFrOworCQkJY2FzZSAxNjogc3AtPmRlY29kZXBmdW5jID0gaG9yQWNjMTY7IGJyZWFrOworCQkJY2FzZSAzMjogc3AtPmRlY29kZXBmdW5jID0gaG9yQWNjMzI7IGJyZWFrOworCQl9CisJCS8qCisJCSAqIE92ZXJyaWRlIGRlZmF1bHQgZGVjb2RpbmcgbWV0aG9kIHdpdGggb25lIHRoYXQgZG9lcyB0aGUKKwkJICogcHJlZGljdG9yIHN0dWZmLgorCQkgKi8KKyAgICAgICAgICAgICAgICBpZiggdGlmLT50aWZfZGVjb2Rlcm93ICE9IFByZWRpY3RvckRlY29kZVJvdyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcC0+ZGVjb2Rlcm93ID0gdGlmLT50aWZfZGVjb2Rlcm93OworICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9kZWNvZGVyb3cgPSBQcmVkaWN0b3JEZWNvZGVSb3c7CisgICAgICAgICAgICAgICAgICAgIHNwLT5kZWNvZGVzdHJpcCA9IHRpZi0+dGlmX2RlY29kZXN0cmlwOworICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IFByZWRpY3RvckRlY29kZVRpbGU7CisgICAgICAgICAgICAgICAgICAgIHNwLT5kZWNvZGV0aWxlID0gdGlmLT50aWZfZGVjb2RldGlsZTsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGVjb2RldGlsZSA9IFByZWRpY3RvckRlY29kZVRpbGU7CisgICAgICAgICAgICAgICAgfQorCisJCS8qCisJCSAqIElmIHRoZSBkYXRhIGlzIGhvcml6b250YWxseSBkaWZmZXJlbmNlZCAxNi1iaXQgZGF0YSB0aGF0CisJCSAqIHJlcXVpcmVzIGJ5dGUtc3dhcHBpbmcsIHRoZW4gaXQgbXVzdCBiZSBieXRlIHN3YXBwZWQgYmVmb3JlCisJCSAqIHRoZSBhY2N1bXVsYXRpb24gc3RlcC4gIFdlIGRvIHRoaXMgd2l0aCBhIHNwZWNpYWwtcHVycG9zZQorCQkgKiByb3V0aW5lIGFuZCBvdmVycmlkZSB0aGUgbm9ybWFsIHBvc3QgZGVjb2RpbmcgbG9naWMgdGhhdAorCQkgKiB0aGUgbGlicmFyeSBzZXR1cCB3aGVuIHRoZSBkaXJlY3Rvcnkgd2FzIHJlYWQuCisJCSAqLworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpIHsKKwkJCWlmIChzcC0+ZGVjb2RlcGZ1bmMgPT0gaG9yQWNjMTYpIHsKKwkJCQlzcC0+ZGVjb2RlcGZ1bmMgPSBzd2FiSG9yQWNjMTY7CisJCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcC0+ZGVjb2RlcGZ1bmMgPT0gaG9yQWNjMzIpIHsKKwkJCQlzcC0+ZGVjb2RlcGZ1bmMgPSBzd2FiSG9yQWNjMzI7CisJCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOworICAgICAgICAgICAgfQorCQl9CisJfQorCisJZWxzZSBpZiAoc3AtPnByZWRpY3RvciA9PSAzKSB7CisJCXNwLT5kZWNvZGVwZnVuYyA9IGZwQWNjOworCQkvKgorCQkgKiBPdmVycmlkZSBkZWZhdWx0IGRlY29kaW5nIG1ldGhvZCB3aXRoIG9uZSB0aGF0IGRvZXMgdGhlCisJCSAqIHByZWRpY3RvciBzdHVmZi4KKwkJICovCisgICAgICAgICAgICAgICAgaWYoIHRpZi0+dGlmX2RlY29kZXJvdyAhPSBQcmVkaWN0b3JEZWNvZGVSb3cgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmRlY29kZXJvdyA9IHRpZi0+dGlmX2RlY29kZXJvdzsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGVjb2Rlcm93ID0gUHJlZGljdG9yRGVjb2RlUm93OworICAgICAgICAgICAgICAgICAgICBzcC0+ZGVjb2Rlc3RyaXAgPSB0aWYtPnRpZl9kZWNvZGVzdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBQcmVkaWN0b3JEZWNvZGVUaWxlOworICAgICAgICAgICAgICAgICAgICBzcC0+ZGVjb2RldGlsZSA9IHRpZi0+dGlmX2RlY29kZXRpbGU7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2RlY29kZXRpbGUgPSBQcmVkaWN0b3JEZWNvZGVUaWxlOworICAgICAgICAgICAgICAgIH0KKwkJLyoKKwkJICogVGhlIGRhdGEgc2hvdWxkIG5vdCBiZSBzd2FwcGVkIG91dHNpZGUgb2YgdGhlIGZsb2F0aW5nCisJCSAqIHBvaW50IHByZWRpY3RvciwgdGhlIGFjY3VtdWxhdGlvbiByb3V0aW5lIHNob3VsZCByZXR1cm4KKwkJICogYnlyZXMgaW4gdGhlIG5hdGl2ZSBvcmRlci4KKwkJICovCisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikgeworCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOworCQl9CisJCS8qCisJCSAqIEFsbG9jYXRlIGJ1ZmZlciB0byBrZWVwIHRoZSBkZWNvZGVkIGJ5dGVzIGJlZm9yZQorCQkgKiByZWFycmFuZ2luZyBpbiB0aGUgaWdodCBvcmRlcgorCQkgKi8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorUHJlZGljdG9yU2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmICghKCpzcC0+c2V0dXBlbmNvZGUpKHRpZikgfHwgIVByZWRpY3RvclNldHVwKHRpZikpCisJCXJldHVybiAwOworCisJaWYgKHNwLT5wcmVkaWN0b3IgPT0gMikgeworCQlzd2l0Y2ggKHRkLT50ZF9iaXRzcGVyc2FtcGxlKSB7CisJCQljYXNlIDg6ICBzcC0+ZW5jb2RlcGZ1bmMgPSBob3JEaWZmODsgYnJlYWs7CisJCQljYXNlIDE2OiBzcC0+ZW5jb2RlcGZ1bmMgPSBob3JEaWZmMTY7IGJyZWFrOworCQkJY2FzZSAzMjogc3AtPmVuY29kZXBmdW5jID0gaG9yRGlmZjMyOyBicmVhazsKKwkJfQorCQkvKgorCQkgKiBPdmVycmlkZSBkZWZhdWx0IGVuY29kaW5nIG1ldGhvZCB3aXRoIG9uZSB0aGF0IGRvZXMgdGhlCisJCSAqIHByZWRpY3RvciBzdHVmZi4KKwkJICovCisgICAgICAgICAgICAgICAgaWYoIHRpZi0+dGlmX2VuY29kZXJvdyAhPSBQcmVkaWN0b3JFbmNvZGVSb3cgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmVuY29kZXJvdyA9IHRpZi0+dGlmX2VuY29kZXJvdzsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZW5jb2Rlcm93ID0gUHJlZGljdG9yRW5jb2RlUm93OworICAgICAgICAgICAgICAgICAgICBzcC0+ZW5jb2Rlc3RyaXAgPSB0aWYtPnRpZl9lbmNvZGVzdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBQcmVkaWN0b3JFbmNvZGVUaWxlOworICAgICAgICAgICAgICAgICAgICBzcC0+ZW5jb2RldGlsZSA9IHRpZi0+dGlmX2VuY29kZXRpbGU7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2VuY29kZXRpbGUgPSBQcmVkaWN0b3JFbmNvZGVUaWxlOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwllbHNlIGlmIChzcC0+cHJlZGljdG9yID09IDMpIHsKKwkJc3AtPmVuY29kZXBmdW5jID0gZnBEaWZmOworCQkvKgorCQkgKiBPdmVycmlkZSBkZWZhdWx0IGVuY29kaW5nIG1ldGhvZCB3aXRoIG9uZSB0aGF0IGRvZXMgdGhlCisJCSAqIHByZWRpY3RvciBzdHVmZi4KKwkJICovCisgICAgICAgICAgICAgICAgaWYoIHRpZi0+dGlmX2VuY29kZXJvdyAhPSBQcmVkaWN0b3JFbmNvZGVSb3cgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmVuY29kZXJvdyA9IHRpZi0+dGlmX2VuY29kZXJvdzsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZW5jb2Rlcm93ID0gUHJlZGljdG9yRW5jb2RlUm93OworICAgICAgICAgICAgICAgICAgICBzcC0+ZW5jb2Rlc3RyaXAgPSB0aWYtPnRpZl9lbmNvZGVzdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBQcmVkaWN0b3JFbmNvZGVUaWxlOworICAgICAgICAgICAgICAgICAgICBzcC0+ZW5jb2RldGlsZSA9IHRpZi0+dGlmX2VuY29kZXRpbGU7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2VuY29kZXRpbGUgPSBQcmVkaWN0b3JFbmNvZGVUaWxlOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBSRVBFQVQ0KG4sIG9wKQkJXAorICAgIHN3aXRjaCAobikgewkJXAorICAgIGRlZmF1bHQ6IHsgdG1zaXplX3QgaTsgZm9yIChpID0gbi00OyBpID4gMDsgaS0tKSB7IG9wOyB9IH0gXAorICAgIGNhc2UgNDogIG9wOwkJXAorICAgIGNhc2UgMzogIG9wOwkJXAorICAgIGNhc2UgMjogIG9wOwkJXAorICAgIGNhc2UgMTogIG9wOwkJXAorICAgIGNhc2UgMDogIDsJCQlcCisgICAgfQorCitzdGF0aWMgdm9pZAoraG9yQWNjOChUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworCS8qCisJICogY29tcGFyZSB2NC4wLjMgd2l0aCB2My45LjUsIAorCSAqIHdlIGZpbmQgdGhhdCBob3JBY2M4IHVzZXMgd2hpbGUgbG9vcCBpbiB0aGUgdjQuMC4zIGFuZCB1c2VzIGRvIHdoaWxlIGxvb3AgaW4gdGhlIHYzLjkuNS4KKwkgKiB0aW1lcyBvZiBkbyB3aGlsZSBsb29wIGFyZSBsZXNzIHRoYW4gd2hpbGUgbG9vcCwgc28gd2UgdXNlIHYzLjkuNSBpbnN0ZWFkIG9mIHY0LjAuMy4KKwkgKi8KKyNpZiAwCisJdG1zaXplX3Qgc3RyaWRlID0gUHJlZGljdG9yU3RhdGUodGlmKS0+c3RyaWRlOworCisJY2hhciogY3AgPSAoY2hhciopIGNwMDsKKwlhc3NlcnQoKGNjJXN0cmlkZSk9PTApOworCWlmIChjYyA+IHN0cmlkZSkgeworCQkvKgorCQkgKiBQaXBlbGluZSB0aGUgbW9zdCBjb21tb24gY2FzZXMuCisJCSAqLworCQlpZiAoc3RyaWRlID09IDMpICB7CisJCQl1bnNpZ25lZCBpbnQgY3IgPSBjcFswXTsKKwkJCXVuc2lnbmVkIGludCBjZyA9IGNwWzFdOworCQkJdW5zaWduZWQgaW50IGNiID0gY3BbMl07CisJCQljYyAtPSAzOworCQkJY3AgKz0gMzsKKwkJCXdoaWxlIChjYz4wKSB7CisJCQkJY3BbMF0gPSAoY2hhcikgKGNyICs9IGNwWzBdKTsKKwkJCQljcFsxXSA9IChjaGFyKSAoY2cgKz0gY3BbMV0pOworCQkJCWNwWzJdID0gKGNoYXIpIChjYiArPSBjcFsyXSk7CisJCQkJY2MgLT0gMzsKKwkJCQljcCArPSAzOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSAgeworCQkJdW5zaWduZWQgaW50IGNyID0gY3BbMF07CisJCQl1bnNpZ25lZCBpbnQgY2cgPSBjcFsxXTsKKwkJCXVuc2lnbmVkIGludCBjYiA9IGNwWzJdOworCQkJdW5zaWduZWQgaW50IGNhID0gY3BbM107CisJCQljYyAtPSA0OworCQkJY3AgKz0gNDsKKwkJCXdoaWxlIChjYz4wKSB7CisJCQkJY3BbMF0gPSAoY2hhcikgKGNyICs9IGNwWzBdKTsKKwkJCQljcFsxXSA9IChjaGFyKSAoY2cgKz0gY3BbMV0pOworCQkJCWNwWzJdID0gKGNoYXIpIChjYiArPSBjcFsyXSk7CisJCQkJY3BbM10gPSAoY2hhcikgKGNhICs9IGNwWzNdKTsKKwkJCQljYyAtPSA0OworCQkJCWNwICs9IDQ7CisJCQl9CisJCX0gZWxzZSAgeworCQkJY2MgLT0gc3RyaWRlOworCQkJZG8geworCQkJCVJFUEVBVDQoc3RyaWRlLCBjcFtzdHJpZGVdID0KKwkJCQkJKGNoYXIpIChjcFtzdHJpZGVdICsgKmNwKTsgY3ArKykKKwkJCQljYyAtPSBzdHJpZGU7CisJCQl9IHdoaWxlIChjYz4wKTsKKwkJfQorCX0KKyNlbHNlCisJdHNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisKKwljaGFyKiBjcCA9IChjaGFyKikgY3AwOworCWlmIChjYyA+IHN0cmlkZSkgeworCQljYyAtPSBzdHJpZGU7CisJCS8qCisJCSAqIFBpcGVsaW5lIHRoZSBtb3N0IGNvbW1vbiBjYXNlcy4KKwkJICovCisJCWlmIChzdHJpZGUgPT0gMykgIHsKKwkJCXVuc2lnbmVkIGludCBjciA9IGNwWzBdOworCQkJdW5zaWduZWQgaW50IGNnID0gY3BbMV07CisJCQl1bnNpZ25lZCBpbnQgY2IgPSBjcFsyXTsKKwkJCWRvIHsKKwkJCQljYyAtPSAzLCBjcCArPSAzOworCQkJCWNwWzBdID0gKGNoYXIpIChjciArPSBjcFswXSk7CisJCQkJY3BbMV0gPSAoY2hhcikgKGNnICs9IGNwWzFdKTsKKwkJCQljcFsyXSA9IChjaGFyKSAoY2IgKz0gY3BbMl0pOworCQkJfSB3aGlsZSAoKGludDMyKSBjYyA+IDApOworCQl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSAgeworCQkJdW5zaWduZWQgaW50IGNyID0gY3BbMF07CisJCQl1bnNpZ25lZCBpbnQgY2cgPSBjcFsxXTsKKwkJCXVuc2lnbmVkIGludCBjYiA9IGNwWzJdOworCQkJdW5zaWduZWQgaW50IGNhID0gY3BbM107CisJCQlkbyB7CisJCQkJY2MgLT0gNCwgY3AgKz0gNDsKKwkJCQljcFswXSA9IChjaGFyKSAoY3IgKz0gY3BbMF0pOworCQkJCWNwWzFdID0gKGNoYXIpIChjZyArPSBjcFsxXSk7CisJCQkJY3BbMl0gPSAoY2hhcikgKGNiICs9IGNwWzJdKTsKKwkJCQljcFszXSA9IChjaGFyKSAoY2EgKz0gY3BbM10pOworCQkJfSB3aGlsZSAoKGludDMyKSBjYyA+IDApOworCQl9IGVsc2UgIHsKKwkJCWRvIHsKKwkJCQlSRVBFQVQ0KHN0cmlkZSwgY3Bbc3RyaWRlXSA9CisJCQkJCShjaGFyKSAoY3Bbc3RyaWRlXSArICpjcCk7IGNwKyspCisJCQkJY2MgLT0gc3RyaWRlOworCQkJfSB3aGlsZSAoKGludDMyKSBjYyA+IDApOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitzd2FiSG9yQWNjMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisJdWludDE2KiB3cCA9ICh1aW50MTYqKSBjcDA7CisJdG1zaXplX3Qgd2MgPSBjYyAvIDI7CisKKwlhc3NlcnQoKGNjJSgyKnN0cmlkZSkpPT0wKTsKKworCWlmICh3YyA+IHN0cmlkZSkgeworCQlUSUZGU3dhYkFycmF5T2ZTaG9ydCh3cCwgd2MpOworCQl3YyAtPSBzdHJpZGU7CisJCWRvIHsKKwkJCVJFUEVBVDQoc3RyaWRlLCB3cFtzdHJpZGVdICs9IHdwWzBdOyB3cCsrKQorCQkJd2MgLT0gc3RyaWRlOworCQl9IHdoaWxlICh3YyA+IDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2hvckFjYzE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCit7CisJdG1zaXplX3Qgc3RyaWRlID0gUHJlZGljdG9yU3RhdGUodGlmKS0+c3RyaWRlOworCXVpbnQxNiogd3AgPSAodWludDE2KikgY3AwOworCXRtc2l6ZV90IHdjID0gY2MgLyAyOworCisJYXNzZXJ0KChjYyUoMipzdHJpZGUpKT09MCk7CisKKwlpZiAod2MgPiBzdHJpZGUpIHsKKwkJd2MgLT0gc3RyaWRlOworCQlkbyB7CisJCQlSRVBFQVQ0KHN0cmlkZSwgd3Bbc3RyaWRlXSArPSB3cFswXTsgd3ArKykKKwkJCXdjIC09IHN0cmlkZTsKKwkJfSB3aGlsZSAod2MgPiAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzd2FiSG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisJdWludDMyKiB3cCA9ICh1aW50MzIqKSBjcDA7CisJdG1zaXplX3Qgd2MgPSBjYyAvIDQ7CisKKwlhc3NlcnQoKGNjJSg0KnN0cmlkZSkpPT0wKTsKKworCWlmICh3YyA+IHN0cmlkZSkgeworCQlUSUZGU3dhYkFycmF5T2ZMb25nKHdwLCB3Yyk7CisJCXdjIC09IHN0cmlkZTsKKwkJZG8geworCQkJUkVQRUFUNChzdHJpZGUsIHdwW3N0cmlkZV0gKz0gd3BbMF07IHdwKyspCisJCQl3YyAtPSBzdHJpZGU7CisJCX0gd2hpbGUgKHdjID4gMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisJdWludDMyKiB3cCA9ICh1aW50MzIqKSBjcDA7CisJdG1zaXplX3Qgd2MgPSBjYyAvIDQ7CisKKwlhc3NlcnQoKGNjJSg0KnN0cmlkZSkpPT0wKTsKKworCWlmICh3YyA+IHN0cmlkZSkgeworCQl3YyAtPSBzdHJpZGU7CisJCWRvIHsKKwkJCVJFUEVBVDQoc3RyaWRlLCB3cFtzdHJpZGVdICs9IHdwWzBdOyB3cCsrKQorCQkJd2MgLT0gc3RyaWRlOworCQl9IHdoaWxlICh3YyA+IDApOworCX0KK30KKworLyoKKyAqIEZsb2F0aW5nIHBvaW50IHByZWRpY3RvciBhY2N1bXVsYXRpb24gcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQKK2ZwQWNjKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCit7CisJdG1zaXplX3Qgc3RyaWRlID0gUHJlZGljdG9yU3RhdGUodGlmKS0+c3RyaWRlOworCXVpbnQzMiBicHMgPSB0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSAvIDg7CisJdG1zaXplX3Qgd2MgPSBjYyAvIGJwczsKKwl0bXNpemVfdCBjb3VudCA9IGNjOworCXVpbnQ4ICpjcCA9ICh1aW50OCAqKSBjcDA7CisJdWludDggKnRtcCA9ICh1aW50OCAqKV9USUZGbWFsbG9jKGNjKTsKKworCWFzc2VydCgoY2MlKGJwcypzdHJpZGUpKT09MCk7CisKKwlpZiAoIXRtcCkKKwkJcmV0dXJuOworCisJd2hpbGUgKGNvdW50ID4gc3RyaWRlKSB7CisJCVJFUEVBVDQoc3RyaWRlLCBjcFtzdHJpZGVdICs9IGNwWzBdOyBjcCsrKQorCQljb3VudCAtPSBzdHJpZGU7CisJfQorCisJX1RJRkZtZW1jcHkodG1wLCBjcDAsIGNjKTsKKwljcCA9ICh1aW50OCAqKSBjcDA7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgd2M7IGNvdW50KyspIHsKKwkJdWludDMyIGJ5dGU7CisJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBicHM7IGJ5dGUrKykgeworCQkJI2lmIFdPUkRTX0JJR0VORElBTgorCQkJY3BbYnBzICogY291bnQgKyBieXRlXSA9IHRtcFtieXRlICogd2MgKyBjb3VudF07CisJCQkjZWxzZQorCQkJY3BbYnBzICogY291bnQgKyBieXRlXSA9CisJCQkJdG1wWyhicHMgLSBieXRlIC0gMSkgKiB3YyArIGNvdW50XTsKKwkJCSNlbmRpZgorCQl9CisJfQorCV9USUZGZnJlZSh0bXApOworfQorCisvKgorICogRGVjb2RlIGEgc2NhbmxpbmUgYW5kIGFwcGx5IHRoZSBwcmVkaWN0b3Igcm91dGluZS4KKyAqLworc3RhdGljIGludAorUHJlZGljdG9yRGVjb2RlUm93KFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpCit7CisJVElGRlByZWRpY3RvclN0YXRlICpzcCA9IFByZWRpY3RvclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5kZWNvZGVyb3cgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5kZWNvZGVwZnVuYyAhPSBOVUxMKTsgIAorCisJaWYgKCgqc3AtPmRlY29kZXJvdykodGlmLCBvcDAsIG9jYzAsIHMpKSB7CisJCSgqc3AtPmRlY29kZXBmdW5jKSh0aWYsIG9wMCwgb2NjMCk7CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBhIHRpbGUvc3RyaXAgYW5kIGFwcGx5IHRoZSBwcmVkaWN0b3Igcm91dGluZS4KKyAqIE5vdGUgdGhhdCBob3Jpem9udGFsIGRpZmZlcmVuY2luZyBtdXN0IGJlIGRvbmUgb24gYQorICogcm93LWJ5LXJvdyBiYXNpcy4gIFRoZSB3aWR0aCBvZiBhICJyb3ciIGhhcyBhbHJlYWR5CisgKiBiZWVuIGNhbGN1bGF0ZWQgYXQgcHJlLWRlY29kZSB0aW1lIGFjY29yZGluZyB0byB0aGUKKyAqIHN0cmlwL3RpbGUgZGltZW5zaW9ucy4KKyAqLworc3RhdGljIGludAorUHJlZGljdG9yRGVjb2RlVGlsZShUSUZGKiB0aWYsIHVpbnQ4KiBvcDAsIHRtc2l6ZV90IG9jYzAsIHVpbnQxNiBzKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+ZGVjb2RldGlsZSAhPSBOVUxMKTsKKworCWlmICgoKnNwLT5kZWNvZGV0aWxlKSh0aWYsIG9wMCwgb2NjMCwgcykpIHsKKwkJdG1zaXplX3Qgcm93c2l6ZSA9IHNwLT5yb3dzaXplOworCQlhc3NlcnQocm93c2l6ZSA+IDApOworCQlhc3NlcnQoKG9jYzAlcm93c2l6ZSk9PTApOworCQlhc3NlcnQoc3AtPmRlY29kZXBmdW5jICE9IE5VTEwpOworCQl3aGlsZSAob2NjMCA+IDApIHsKKwkJCSgqc3AtPmRlY29kZXBmdW5jKSh0aWYsIG9wMCwgcm93c2l6ZSk7CisJCQlvY2MwIC09IHJvd3NpemU7CisJCQlvcDAgKz0gcm93c2l6ZTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitob3JEaWZmOChUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCXRtc2l6ZV90IHN0cmlkZSA9IHNwLT5zdHJpZGU7CisJY2hhciogY3AgPSAoY2hhciopIGNwMDsKKworCWFzc2VydCgoY2Mlc3RyaWRlKT09MCk7CisKKwlpZiAoY2MgPiBzdHJpZGUpIHsKKwkJY2MgLT0gc3RyaWRlOworCQkvKgorCQkgKiBQaXBlbGluZSB0aGUgbW9zdCBjb21tb24gY2FzZXMuCisJCSAqLworCQlpZiAoc3RyaWRlID09IDMpIHsKKwkJCWludCByMSwgZzEsIGIxOworCQkJaW50IHIyID0gY3BbMF07CisJCQlpbnQgZzIgPSBjcFsxXTsKKwkJCWludCBiMiA9IGNwWzJdOworCQkJZG8geworCQkJCXIxID0gY3BbM107IGNwWzNdID0gcjEtcjI7IHIyID0gcjE7CisJCQkJZzEgPSBjcFs0XTsgY3BbNF0gPSBnMS1nMjsgZzIgPSBnMTsKKwkJCQliMSA9IGNwWzVdOyBjcFs1XSA9IGIxLWIyOyBiMiA9IGIxOworCQkJCWNwICs9IDM7CisJCQl9IHdoaWxlICgoY2MgLT0gMykgPiAwKTsKKwkJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgeworCQkJaW50IHIxLCBnMSwgYjEsIGExOworCQkJaW50IHIyID0gY3BbMF07CisJCQlpbnQgZzIgPSBjcFsxXTsKKwkJCWludCBiMiA9IGNwWzJdOworCQkJaW50IGEyID0gY3BbM107CisJCQlkbyB7CisJCQkJcjEgPSBjcFs0XTsgY3BbNF0gPSByMS1yMjsgcjIgPSByMTsKKwkJCQlnMSA9IGNwWzVdOyBjcFs1XSA9IGcxLWcyOyBnMiA9IGcxOworCQkJCWIxID0gY3BbNl07IGNwWzZdID0gYjEtYjI7IGIyID0gYjE7CisJCQkJYTEgPSBjcFs3XTsgY3BbN10gPSBhMS1hMjsgYTIgPSBhMTsKKwkJCQljcCArPSA0OworCQkJfSB3aGlsZSAoKGNjIC09IDQpID4gMCk7CisJCX0gZWxzZSB7CisJCQljcCArPSBjYyAtIDE7CisJCQlkbyB7CisJCQkJUkVQRUFUNChzdHJpZGUsIGNwW3N0cmlkZV0gLT0gY3BbMF07IGNwLS0pCisJCQl9IHdoaWxlICgoY2MgLT0gc3RyaWRlKSA+IDApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoraG9yRGlmZjE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCit7CisJVElGRlByZWRpY3RvclN0YXRlKiBzcCA9IFByZWRpY3RvclN0YXRlKHRpZik7CisJdG1zaXplX3Qgc3RyaWRlID0gc3AtPnN0cmlkZTsKKwlpbnQxNiAqd3AgPSAoaW50MTYqKSBjcDA7CisJdG1zaXplX3Qgd2MgPSBjYy8yOworCisJYXNzZXJ0KChjYyUoMipzdHJpZGUpKT09MCk7CisKKwlpZiAod2MgPiBzdHJpZGUpIHsKKwkJd2MgLT0gc3RyaWRlOworCQl3cCArPSB3YyAtIDE7CisJCWRvIHsKKwkJCVJFUEVBVDQoc3RyaWRlLCB3cFtzdHJpZGVdIC09IHdwWzBdOyB3cC0tKQorCQkJd2MgLT0gc3RyaWRlOworCQl9IHdoaWxlICh3YyA+IDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2hvckRpZmYzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCXRtc2l6ZV90IHN0cmlkZSA9IHNwLT5zdHJpZGU7CisJaW50MzIgKndwID0gKGludDMyKikgY3AwOworCXRtc2l6ZV90IHdjID0gY2MvNDsKKworCWFzc2VydCgoY2MlKDQqc3RyaWRlKSk9PTApOworCisJaWYgKHdjID4gc3RyaWRlKSB7CisJCXdjIC09IHN0cmlkZTsKKwkJd3AgKz0gd2MgLSAxOworCQlkbyB7CisJCQlSRVBFQVQ0KHN0cmlkZSwgd3Bbc3RyaWRlXSAtPSB3cFswXTsgd3AtLSkKKwkJCXdjIC09IHN0cmlkZTsKKwkJfSB3aGlsZSAod2MgPiAwKTsKKwl9Cit9CisKKy8qCisgKiBGbG9hdGluZyBwb2ludCBwcmVkaWN0b3IgZGlmZmVyZW5jaW5nIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkCitmcERpZmYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisJdWludDMyIGJwcyA9IHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlIC8gODsKKwl0bXNpemVfdCB3YyA9IGNjIC8gYnBzOworCXRtc2l6ZV90IGNvdW50OworCXVpbnQ4ICpjcCA9ICh1aW50OCAqKSBjcDA7CisJdWludDggKnRtcCA9ICh1aW50OCAqKV9USUZGbWFsbG9jKGNjKTsKKworCWFzc2VydCgoY2MlKGJwcypzdHJpZGUpKT09MCk7CisKKwlpZiAoIXRtcCkKKwkJcmV0dXJuOworCisJX1RJRkZtZW1jcHkodG1wLCBjcDAsIGNjKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB3YzsgY291bnQrKykgeworCQl1aW50MzIgYnl0ZTsKKwkJZm9yIChieXRlID0gMDsgYnl0ZSA8IGJwczsgYnl0ZSsrKSB7CisJCQkjaWYgV09SRFNfQklHRU5ESUFOCisJCQljcFtieXRlICogd2MgKyBjb3VudF0gPSB0bXBbYnBzICogY291bnQgKyBieXRlXTsKKwkJCSNlbHNlCisJCQljcFsoYnBzIC0gYnl0ZSAtIDEpICogd2MgKyBjb3VudF0gPQorCQkJCXRtcFticHMgKiBjb3VudCArIGJ5dGVdOworCQkJI2VuZGlmCisJCX0KKwl9CisJX1RJRkZmcmVlKHRtcCk7CisKKwljcCA9ICh1aW50OCAqKSBjcDA7CisJY3AgKz0gY2MgLSBzdHJpZGUgLSAxOworCWZvciAoY291bnQgPSBjYzsgY291bnQgPiBzdHJpZGU7IGNvdW50IC09IHN0cmlkZSkKKwkJUkVQRUFUNChzdHJpZGUsIGNwW3N0cmlkZV0gLT0gY3BbMF07IGNwLS0pCit9CisKK3N0YXRpYyBpbnQKK1ByZWRpY3RvckVuY29kZVJvdyhUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+ZW5jb2RlcGZ1bmMgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5lbmNvZGVyb3cgIT0gTlVMTCk7CisKKwkvKiBYWFggaG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgYWx0ZXJzIHVzZXIncyBkYXRhIFhYWCAqLworCSgqc3AtPmVuY29kZXBmdW5jKSh0aWYsIGJwLCBjYyk7CisJcmV0dXJuICgqc3AtPmVuY29kZXJvdykodGlmLCBicCwgY2MsIHMpOworfQorCitzdGF0aWMgaW50CitQcmVkaWN0b3JFbmNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIGJwMCwgdG1zaXplX3QgY2MwLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQcmVkaWN0b3JFbmNvZGVUaWxlIjsKKwlUSUZGUHJlZGljdG9yU3RhdGUgKnNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKyAgICAgICAgdWludDggKndvcmtpbmdfY29weTsKKwl0bXNpemVfdCBjYyA9IGNjMCwgcm93c2l6ZTsKKwl1bnNpZ25lZCBjaGFyKiBicDsKKyAgICAgICAgaW50IHJlc3VsdF9jb2RlOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+ZW5jb2RlcGZ1bmMgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5lbmNvZGV0aWxlICE9IE5VTEwpOworCisgICAgICAgIC8qIAorICAgICAgICAgKiBEbyBwcmVkaWN0b3IgbWFuaXB1bGF0aW9uIGluIGEgd29ya2luZyBidWZmZXIgdG8gYXZvaWQgYWx0ZXJpbmcKKyAgICAgICAgICogdGhlIGNhbGxlcnMgYnVmZmVyLiBodHRwOi8vdHJhYy5vc2dlby5vcmcvZ2RhbC90aWNrZXQvMTk2NQorICAgICAgICAgKi8KKyAgICAgICAgd29ya2luZ19jb3B5ID0gKHVpbnQ4KikgX1RJRkZtYWxsb2MoY2MwKTsKKyAgICAgICAgaWYoIHdvcmtpbmdfY29weSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyAiIFRJRkZfU1NJWkVfRk9STUFUICIgYnl0ZSB0ZW1wIGJ1ZmZlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNjMCApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCB3b3JraW5nX2NvcHksIGJwMCwgY2MwICk7CisgICAgICAgIGJwID0gd29ya2luZ19jb3B5OworCisJcm93c2l6ZSA9IHNwLT5yb3dzaXplOworCWFzc2VydChyb3dzaXplID4gMCk7CisJYXNzZXJ0KChjYzAlcm93c2l6ZSk9PTApOworCXdoaWxlIChjYyA+IDApIHsKKwkJKCpzcC0+ZW5jb2RlcGZ1bmMpKHRpZiwgYnAsIHJvd3NpemUpOworCQljYyAtPSByb3dzaXplOworCQlicCArPSByb3dzaXplOworCX0KKwlyZXN1bHRfY29kZSA9ICgqc3AtPmVuY29kZXRpbGUpKHRpZiwgd29ya2luZ19jb3B5LCBjYzAsIHMpOworCisgICAgICAgIF9USUZGZnJlZSggd29ya2luZ19jb3B5ICk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdF9jb2RlOworfQorCisjZGVmaW5lCUZJRUxEX1BSRURJQ1RPUgkoRklFTERfQ09ERUMrMCkJCS8qIFhYWCAqLworCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIHByZWRpY3RGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfUFJFRElDVE9SLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VJTlQxNiwgRklFTERfUFJFRElDVE9SLCBGQUxTRSwgRkFMU0UsICJQcmVkaWN0b3IiLCBOVUxMIH0sCit9OworCitzdGF0aWMgaW50CitQcmVkaWN0b3JWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+dnNldHBhcmVudCAhPSBOVUxMKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKKwkJc3AtPnByZWRpY3RvciA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1BSRURJQ1RPUik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKwl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitQcmVkaWN0b3JWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+dmdldHBhcmVudCAhPSBOVUxMKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKKwkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBzcC0+cHJlZGljdG9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitQcmVkaWN0b3JQcmludERpcihUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJKHZvaWQpIGZsYWdzOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1BSRURJQ1RPUikpIHsKKwkJZnByaW50ZihmZCwgIiAgUHJlZGljdG9yOiAiKTsKKwkJc3dpdGNoIChzcC0+cHJlZGljdG9yKSB7CisJCQljYXNlIDE6IGZwcmludGYoZmQsICJub25lICIpOyBicmVhazsKKwkJCWNhc2UgMjogZnByaW50ZihmZCwgImhvcml6b250YWwgZGlmZmVyZW5jaW5nICIpOyBicmVhazsKKwkJCWNhc2UgMzogZnByaW50ZihmZCwgImZsb2F0aW5nIHBvaW50IHByZWRpY3RvciAiKTsgYnJlYWs7CisJCX0KKwkJZnByaW50ZihmZCwgIiV1ICgweCV4KVxuIiwgc3AtPnByZWRpY3Rvciwgc3AtPnByZWRpY3Rvcik7CisJfQorCWlmIChzcC0+cHJpbnRkaXIpCisJCSgqc3AtPnByaW50ZGlyKSh0aWYsIGZkLCBmbGFncyk7Cit9CisKK2ludAorVElGRlByZWRpY3RvckluaXQoVElGRiogdGlmKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IDApOworCisJLyoKKwkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJICovCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgcHJlZGljdEZpZWxkcywKKwkJCSAgICAgIFRJRkZBcnJheUNvdW50KHByZWRpY3RGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZQcmVkaWN0b3JJbml0IiwKKwkJICAgICJNZXJnaW5nIFByZWRpY3RvciBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE92ZXJyaWRlIHBhcmVudCBnZXQvc2V0IGZpZWxkIG1ldGhvZHMuCisJICovCisJc3AtPnZnZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9CisgICAgICAgICAgICBQcmVkaWN0b3JWR2V0RmllbGQ7LyogaG9vayBmb3IgcHJlZGljdG9yIHRhZyAqLworCXNwLT52c2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPQorCSAgICBQcmVkaWN0b3JWU2V0RmllbGQ7LyogaG9vayBmb3IgcHJlZGljdG9yIHRhZyAqLworCXNwLT5wcmludGRpciA9IHRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXI7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9CisgICAgICAgICAgICBQcmVkaWN0b3JQcmludERpcjsJLyogaG9vayBmb3IgcHJlZGljdG9yIHRhZyAqLworCisJc3AtPnNldHVwZGVjb2RlID0gdGlmLT50aWZfc2V0dXBkZWNvZGU7CisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBQcmVkaWN0b3JTZXR1cERlY29kZTsKKwlzcC0+c2V0dXBlbmNvZGUgPSB0aWYtPnRpZl9zZXR1cGVuY29kZTsKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IFByZWRpY3RvclNldHVwRW5jb2RlOworCisJc3AtPnByZWRpY3RvciA9IDE7CQkJLyogZGVmYXVsdCB2YWx1ZSAqLworCXNwLT5lbmNvZGVwZnVuYyA9IE5VTEw7CQkJLyogbm8gcHJlZGljdG9yIHJvdXRpbmUgKi8KKwlzcC0+ZGVjb2RlcGZ1bmMgPSBOVUxMOwkJCS8qIG5vIHByZWRpY3RvciByb3V0aW5lICovCisJcmV0dXJuIDE7Cit9CisKK2ludAorVElGRlByZWRpY3RvckNsZWFudXAoVElGRiogdGlmKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IDApOworCisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBzcC0+dmdldHBhcmVudDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IHNwLT52c2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXIgPSBzcC0+cHJpbnRkaXI7CisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBzcC0+c2V0dXBkZWNvZGU7CisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBzcC0+c2V0dXBlbmNvZGU7CisKKwlyZXR1cm4gMTsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfcHJlZGljdC5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfcHJlZGljdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzE0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wcmVkaWN0LmgKQEAgLTAsMCArMSw3NyBAQAorLyogJElkOiB0aWZfcHJlZGljdC5oLHYgMS44IDIwMTAtMDMtMTAgMTg6NTY6NDkgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1RJRkZQUkVESUNUXworI2RlZmluZQlfVElGRlBSRURJQ1RfCisvKgorICogYGBMaWJyYXJ5LXByaXZhdGUnJyBTdXBwb3J0IGZvciB0aGUgUHJlZGljdG9yIFRhZworICovCisKKy8qCisgKiBDb2RlY3MgdGhhdCB3YW50IHRvIHN1cHBvcnQgdGhlIFByZWRpY3RvciB0YWcgbXVzdCBwbGFjZQorICogdGhpcyBzdHJ1Y3R1cmUgZmlyc3QgaW4gdGhlaXIgcHJpdmF0ZSBzdGF0ZSBibG9jayBzbyB0aGF0CisgKiB0aGUgcHJlZGljdG9yIGNvZGUgY2FuIGNhc3QgdGlmX2RhdGEgdG8gZmluZCBpdHMgc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgICAgICAgICAgICAgcHJlZGljdG9yOwkvKiBwcmVkaWN0b3IgdGFnIHZhbHVlICovCisJdG1zaXplX3QgICAgICAgIHN0cmlkZTsJCS8qIHNhbXBsZSBzdHJpZGUgb3ZlciBkYXRhICovCisJdG1zaXplX3QgICAgICAgIHJvd3NpemU7CS8qIHRpbGUvc3RyaXAgcm93IHNpemUgKi8KKworCVRJRkZDb2RlTWV0aG9kICBlbmNvZGVyb3c7CS8qIHBhcmVudCBjb2RlYyBlbmNvZGUvZGVjb2RlIHJvdyAqLworCVRJRkZDb2RlTWV0aG9kICBlbmNvZGVzdHJpcDsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgc3RyaXAgKi8KKwlUSUZGQ29kZU1ldGhvZCAgZW5jb2RldGlsZTsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgdGlsZSAqLyAKKwlUSUZGUG9zdE1ldGhvZCAgZW5jb2RlcGZ1bmM7CS8qIGhvcml6b250YWwgZGlmZmVyZW5jZXIgKi8KKworCVRJRkZDb2RlTWV0aG9kICBkZWNvZGVyb3c7CS8qIHBhcmVudCBjb2RlYyBlbmNvZGUvZGVjb2RlIHJvdyAqLworCVRJRkZDb2RlTWV0aG9kICBkZWNvZGVzdHJpcDsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgc3RyaXAgKi8KKwlUSUZGQ29kZU1ldGhvZCAgZGVjb2RldGlsZTsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgdGlsZSAqLyAKKwlUSUZGUG9zdE1ldGhvZCAgZGVjb2RlcGZ1bmM7CS8qIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KKworCVRJRkZWR2V0TWV0aG9kICB2Z2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZCAgdnNldHBhcmVudDsJLyogc3VwZXItY2xhc3MgbWV0aG9kICovCisJVElGRlByaW50TWV0aG9kIHByaW50ZGlyOwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGQm9vbE1ldGhvZCAgc2V0dXBkZWNvZGU7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZCb29sTWV0aG9kICBzZXR1cGVuY29kZTsJLyogc3VwZXItY2xhc3MgbWV0aG9kICovCit9IFRJRkZQcmVkaWN0b3JTdGF0ZTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorZXh0ZXJuIGludCBUSUZGUHJlZGljdG9ySW5pdChUSUZGKik7CitleHRlcm4gaW50IFRJRkZQcmVkaWN0b3JDbGVhbnVwKFRJRkYqKTsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYgLyogX1RJRkZQUkVESUNUXyAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3ByaW50LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTQzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9wcmludC5jCkBAIC0wLDAgKzEsNzE5IEBACisvKiAkSWQ6IHRpZl9wcmludC5jLHYgMS42MCAyMDEyLTA4LTE5IDE2OjU2OjM1IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIERpcmVjdG9yeSBQcmludGluZyBTdXBwb3J0CisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIHZvaWQKK19USUZGcHJpbnRBc2NpaUJvdW5kZWQoRklMRSogZmQsIGNvbnN0IGNoYXIqIGNwLCBpbnQgbWF4X2NoYXJzKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBob3RvTmFtZXNbXSA9IHsKKyAgICAibWluLWlzLXdoaXRlIiwJCQkJLyogUEhPVE9NRVRSSUNfTUlOSVNXSElURSAqLworICAgICJtaW4taXMtYmxhY2siLAkJCQkvKiBQSE9UT01FVFJJQ19NSU5JU0JMQUNLICovCisgICAgIlJHQiBjb2xvciIsCQkJCS8qIFBIT1RPTUVUUklDX1JHQiAqLworICAgICJwYWxldHRlIGNvbG9yIChSR0IgZnJvbSBjb2xvcm1hcCkiLAkvKiBQSE9UT01FVFJJQ19QQUxFVFRFICovCisgICAgInRyYW5zcGFyZW5jeSBtYXNrIiwJCQkvKiBQSE9UT01FVFJJQ19NQVNLICovCisgICAgInNlcGFyYXRlZCIsCQkJCS8qIFBIT1RPTUVUUklDX1NFUEFSQVRFRCAqLworICAgICJZQ2JDciIsCQkJCQkvKiBQSE9UT01FVFJJQ19ZQ0JDUiAqLworICAgICI3ICgweDcpIiwKKyAgICAiQ0lFIEwqYSpiKiIsCQkJCS8qIFBIT1RPTUVUUklDX0NJRUxBQiAqLworICAgICJJQ0MgTCphKmIqIiwJCQkJLyogUEhPVE9NRVRSSUNfSUNDTEFCICovCisgICAgIklUVSBMKmEqYioiIAkJCQkvKiBQSE9UT01FVFJJQ19JVFVMQUIgKi8KK307CisjZGVmaW5lCU5QSE9UT05BTUVTCShzaXplb2YgKHBob3RvTmFtZXMpIC8gc2l6ZW9mIChwaG90b05hbWVzWzBdKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKm9yaWVudE5hbWVzW10gPSB7CisgICAgIjAgKDB4MCkiLAorICAgICJyb3cgMCB0b3AsIGNvbCAwIGxocyIsCQkJLyogT1JJRU5UQVRJT05fVE9QTEVGVCAqLworICAgICJyb3cgMCB0b3AsIGNvbCAwIHJocyIsCQkJLyogT1JJRU5UQVRJT05fVE9QUklHSFQgKi8KKyAgICAicm93IDAgYm90dG9tLCBjb2wgMCByaHMiLAkJCS8qIE9SSUVOVEFUSU9OX0JPVFJJR0hUICovCisgICAgInJvdyAwIGJvdHRvbSwgY29sIDAgbGhzIiwJCQkvKiBPUklFTlRBVElPTl9CT1RMRUZUICovCisgICAgInJvdyAwIGxocywgY29sIDAgdG9wIiwJCQkvKiBPUklFTlRBVElPTl9MRUZUVE9QICovCisgICAgInJvdyAwIHJocywgY29sIDAgdG9wIiwJCQkvKiBPUklFTlRBVElPTl9SSUdIVFRPUCAqLworICAgICJyb3cgMCByaHMsIGNvbCAwIGJvdHRvbSIsCQkJLyogT1JJRU5UQVRJT05fUklHSFRCT1QgKi8KKyAgICAicm93IDAgbGhzLCBjb2wgMCBib3R0b20iLAkJCS8qIE9SSUVOVEFUSU9OX0xFRlRCT1QgKi8KK307CisjZGVmaW5lCU5PUklFTlROQU1FUwkoc2l6ZW9mIChvcmllbnROYW1lcykgLyBzaXplb2YgKG9yaWVudE5hbWVzWzBdKSkKKworc3RhdGljIHZvaWQKK19USUZGUHJpbnRGaWVsZChGSUxFKiBmZCwgY29uc3QgVElGRkZpZWxkICpmaXAsCisJCXVpbnQzMiB2YWx1ZV9jb3VudCwgdm9pZCAqcmF3X2RhdGEpCit7CisJdWludDMyIGo7CisJCQorCWZwcmludGYoZmQsICIgICVzOiAiLCBmaXAtPmZpZWxkX25hbWUpOworCisJZm9yKGogPSAwOyBqIDwgdmFsdWVfY291bnQ7IGorKykgeworCQlpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9CWVRFKQorCQkJZnByaW50ZihmZCwgIiV1IiwgKCh1aW50OCAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1VOREVGSU5FRCkKKwkJCWZwcmludGYoZmQsICIweCV4IiwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9TQllURSkKKwkJCWZwcmludGYoZmQsICIlZCIsICgoaW50OCAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1NIT1JUKQorCQkJZnByaW50ZihmZCwgIiV1IiwgKCh1aW50MTYgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9TU0hPUlQpCisJCQlmcHJpbnRmKGZkLCAiJWQiLCAoKGludDE2ICopIHJhd19kYXRhKVtqXSk7CisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfTE9ORykKKwkJCWZwcmludGYoZmQsICIlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSgodWludDMyICopIHJhd19kYXRhKVtqXSk7CisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfU0xPTkcpCisJCQlmcHJpbnRmKGZkLCAiJWxkIiwgKGxvbmcpKChpbnQzMiAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX0lGRCkKKwkJCWZwcmludGYoZmQsICIweCVseCIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKCh1aW50MzIgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9SQVRJT05BTAorCQkJfHwgZmlwLT5maWVsZF90eXBlID09IFRJRkZfU1JBVElPTkFMCisJCQl8fCBmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9GTE9BVCkKKwkJCWZwcmludGYoZmQsICIlZiIsICgoZmxvYXQgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9MT05HOCkKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJZnByaW50ZihmZCwgIiVJNjR1IiwKKwkJCSAgICAodW5zaWduZWQgX19pbnQ2NCkoKHVpbnQ2NCAqKSByYXdfZGF0YSlbal0pOworI2Vsc2UKKwkJCWZwcmludGYoZmQsICIlbGx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSgodWludDY0ICopIHJhd19kYXRhKVtqXSk7CisjZW5kaWYKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9TTE9ORzgpCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCWZwcmludGYoZmQsICIlSTY0ZCIsIChfX2ludDY0KSgoaW50NjQgKikgcmF3X2RhdGEpW2pdKTsKKyNlbHNlCisJCQlmcHJpbnRmKGZkLCAiJWxsZCIsIChsb25nIGxvbmcpKChpbnQ2NCAqKSByYXdfZGF0YSlbal0pOworI2VuZGlmCisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfSUZEOCkKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJZnByaW50ZihmZCwgIjB4JUk2NHgiLAorCQkJCSh1bnNpZ25lZCBfX2ludDY0KSgodWludDY0ICopIHJhd19kYXRhKVtqXSk7CisjZWxzZQorCQkJZnByaW50ZihmZCwgIjB4JWxseCIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoKHVpbnQ2NCAqKSByYXdfZGF0YSlbal0pOworI2VuZGlmCisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfRkxPQVQpCisJCQlmcHJpbnRmKGZkLCAiJWYiLCAoKGZsb2F0ICopcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9ET1VCTEUpCisJCQlmcHJpbnRmKGZkLCAiJWYiLCAoKGRvdWJsZSAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX0FTQ0lJKSB7CisJCQlmcHJpbnRmKGZkLCAiJXMiLCAoY2hhciAqKSByYXdfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQllbHNlIHsKKwkJCWZwcmludGYoZmQsICI8dW5zdXBwb3J0ZWQgZGF0YSB0eXBlIGluIFRJRkZQcmludD4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYoaiA8IHZhbHVlX2NvdW50IC0gMSkKKwkJCWZwcmludGYoZmQsICIsIik7CisJfQorCisJZnByaW50ZihmZCwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK19USUZGUHJldHR5UHJpbnRGaWVsZChUSUZGKiB0aWYsIGNvbnN0IFRJRkZGaWVsZCAqZmlwLCBGSUxFKiBmZCwgdWludDMyIHRhZywKKwkJICAgICAgdWludDMyIHZhbHVlX2NvdW50LCB2b2lkICpyYXdfZGF0YSkKK3sKKyAgICAgICAgKHZvaWQpIHRpZjsKKworCS8qIGRvIG5vdCB0cnkgdG8gcHJldHR5IHByaW50IGF1dG8tZGVmaW5lZCBmaWVsZHMgKi8KKwlpZiAoc3RybmNtcChmaXAtPmZpZWxkX25hbWUsIlRhZyAiLCA0KSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJc3dpdGNoICh0YWcpCisJeworCQljYXNlIFRJRkZUQUdfSU5LU0VUOgorCQkJaWYgKHZhbHVlX2NvdW50ID09IDIgJiYgZmlwLT5maWVsZF90eXBlID09IFRJRkZfU0hPUlQpIHsKKwkJCQlmcHJpbnRmKGZkLCAiICBJbmsgU2V0OiAiKTsKKwkJCQlzd2l0Y2ggKCooKHVpbnQxNiopcmF3X2RhdGEpKSB7CisJCQkJY2FzZSBJTktTRVRfQ01ZSzoKKwkJCQkJZnByaW50ZihmZCwgIkNNWUtcbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJCQkJKigodWludDE2KilyYXdfZGF0YSksCisJCQkJCQkqKCh1aW50MTYqKXJhd19kYXRhKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCisJCWNhc2UgVElGRlRBR19ET1RSQU5HRToKKwkJCWlmICh2YWx1ZV9jb3VudCA9PSAyICYmIGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1NIT1JUKSB7CisJCQkJZnByaW50ZihmZCwgIiAgRG90IFJhbmdlOiAldS0ldVxuIiwKKwkJCQkJKCh1aW50MTYqKXJhd19kYXRhKVswXSwgKCh1aW50MTYqKXJhd19kYXRhKVsxXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJRkZUQUdfV0hJVEVQT0lOVDoKKwkJCWlmICh2YWx1ZV9jb3VudCA9PSAyICYmIGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1JBVElPTkFMKSB7CisJCQkJZnByaW50ZihmZCwgIiAgV2hpdGUgUG9pbnQ6ICVnLSVnXG4iLAorCQkJCQkoKGZsb2F0ICopcmF3X2RhdGEpWzBdLCAoKGZsb2F0ICopcmF3X2RhdGEpWzFdKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJRkZUQUdfWE1MUEFDS0VUOgorCQl7CisJCQl1aW50MzIgaTsKKworCQkJZnByaW50ZihmZCwgIiAgWE1MUGFja2V0IChYTVAgTWV0YWRhdGEpOlxuIiApOworCQkJZm9yKGkgPSAwOyBpIDwgdmFsdWVfY291bnQ7IGkrKykKKwkJCQlmcHV0YygoKGNoYXIgKilyYXdfZGF0YSlbaV0sIGZkKTsKKwkJCWZwcmludGYoIGZkLCAiXG4iICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljYXNlIFRJRkZUQUdfUklDSFRJRkZJUFRDOgorCQkJLyoKKwkJCSAqIFhYWDogZm9yIHNvbWUgd2VpcmQgcmVhc29uIFJpY2hUSUZGSVBUQyB0YWcKKwkJCSAqIGRlZmluZWQgYXMgYXJyYXkgb2YgTE9ORyB2YWx1ZXMuCisJCQkgKi8KKwkJCWZwcmludGYoZmQsCisJCQkgICAgIiAgUmljaFRJRkZJUFRDIERhdGE6IDxwcmVzZW50PiwgJWx1IGJ5dGVzXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSB2YWx1ZV9jb3VudCAqIDQpOworCQkJcmV0dXJuIDE7CisKKwkJY2FzZSBUSUZGVEFHX1BIT1RPU0hPUDoKKwkJCWZwcmludGYoZmQsICIgIFBob3Rvc2hvcCBEYXRhOiA8cHJlc2VudD4sICVsdSBieXRlc1xuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdmFsdWVfY291bnQpOworCQkJcmV0dXJuIDE7CisKKwkJY2FzZSBUSUZGVEFHX0lDQ1BST0ZJTEU6CisJCQlmcHJpbnRmKGZkLCAiICBJQ0MgUHJvZmlsZTogPHByZXNlbnQ+LCAlbHUgYnl0ZXNcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHZhbHVlX2NvdW50KTsKKwkJCXJldHVybiAxOworCisJCWNhc2UgVElGRlRBR19TVE9OSVRTOgorCQkJaWYgKHZhbHVlX2NvdW50ID09IDEgJiYgZmlwLT5maWVsZF90eXBlID09IFRJRkZfRE9VQkxFKSB7IAorCQkJCWZwcmludGYoZmQsCisJCQkJCSIgIFNhbXBsZSB0byBOaXRzIGNvbnZlcnNpb24gZmFjdG9yOiAlLjRlXG4iLAorCQkJCQkqKChkb3VibGUqKXJhd19kYXRhKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAqIHRvIHRoZSBzcGVjaWZpZWQgc3RkaW8gZmlsZSBzdHJlYW0uCisgKi8KK3ZvaWQKK1RJRkZQcmludERpcmVjdG9yeShUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwljaGFyICpzZXA7CisJdWludDE2IGk7CisJbG9uZyBsLCBuOworCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwlmcHJpbnRmKGZkLCAiVElGRiBEaXJlY3RvcnkgYXQgb2Zmc2V0IDB4JUk2NHggKCVJNjR1KVxuIiwKKwkJKHVuc2lnbmVkIF9faW50NjQpIHRpZi0+dGlmX2Rpcm9mZiwKKwkJKHVuc2lnbmVkIF9faW50NjQpIHRpZi0+dGlmX2Rpcm9mZik7CisjZWxzZQorCWZwcmludGYoZmQsICJUSUZGIERpcmVjdG9yeSBhdCBvZmZzZXQgMHglbGx4ICglbGx1KVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGlmLT50aWZfZGlyb2ZmLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSB0aWYtPnRpZl9kaXJvZmYpOworI2VuZGlmCisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU1VCRklMRVRZUEUpKSB7CisJCWZwcmludGYoZmQsICIgIFN1YmZpbGUgVHlwZToiKTsKKwkJc2VwID0gIiAiOworCQlpZiAodGQtPnRkX3N1YmZpbGV0eXBlICYgRklMRVRZUEVfUkVEVUNFRElNQUdFKSB7CisJCQlmcHJpbnRmKGZkLCAiJXNyZWR1Y2VkLXJlc29sdXRpb24gaW1hZ2UiLCBzZXApOworCQkJc2VwID0gIi8iOworCQl9CisJCWlmICh0ZC0+dGRfc3ViZmlsZXR5cGUgJiBGSUxFVFlQRV9QQUdFKSB7CisJCQlmcHJpbnRmKGZkLCAiJXNtdWx0aS1wYWdlIGRvY3VtZW50Iiwgc2VwKTsKKwkJCXNlcCA9ICIvIjsKKwkJfQorCQlpZiAodGQtPnRkX3N1YmZpbGV0eXBlICYgRklMRVRZUEVfTUFTSykKKwkJCWZwcmludGYoZmQsICIlc3RyYW5zcGFyZW5jeSBtYXNrIiwgc2VwKTsKKwkJZnByaW50ZihmZCwgIiAoJWx1ID0gMHglbHgpXG4iLAorCQkgICAgKGxvbmcpIHRkLT50ZF9zdWJmaWxldHlwZSwgKGxvbmcpIHRkLT50ZF9zdWJmaWxldHlwZSk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0lNQUdFRElNRU5TSU9OUykpIHsKKwkJZnByaW50ZihmZCwgIiAgSW1hZ2UgV2lkdGg6ICVsdSBJbWFnZSBMZW5ndGg6ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX2ltYWdld2lkdGgsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfaW1hZ2VsZW5ndGgpOworCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9JTUFHRURFUFRIKSkKKwkJCWZwcmludGYoZmQsICIgSW1hZ2UgRGVwdGg6ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9pbWFnZWRlcHRoKTsKKwkJZnByaW50ZihmZCwgIlxuIik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RJTEVESU1FTlNJT05TKSkgeworCQlmcHJpbnRmKGZkLCAiICBUaWxlIFdpZHRoOiAlbHUgVGlsZSBMZW5ndGg6ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX3RpbGV3aWR0aCwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF90aWxlbGVuZ3RoKTsKKwkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfVElMRURFUFRIKSkKKwkJCWZwcmludGYoZmQsICIgVGlsZSBEZXB0aDogJWx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX3RpbGVkZXB0aCk7CisJCWZwcmludGYoZmQsICJcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9SRVNPTFVUSU9OKSkgeworCQlmcHJpbnRmKGZkLCAiICBSZXNvbHV0aW9uOiAlZywgJWciLAorCQkgICAgdGQtPnRkX3hyZXNvbHV0aW9uLCB0ZC0+dGRfeXJlc29sdXRpb24pOworCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9SRVNPTFVUSU9OVU5JVCkpIHsKKwkJCXN3aXRjaCAodGQtPnRkX3Jlc29sdXRpb251bml0KSB7CisJCQljYXNlIFJFU1VOSVRfTk9ORToKKwkJCQlmcHJpbnRmKGZkLCAiICh1bml0bGVzcykiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVTVU5JVF9JTkNIOgorCQkJCWZwcmludGYoZmQsICIgcGl4ZWxzL2luY2giKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVTVU5JVF9DRU5USU1FVEVSOgorCQkJCWZwcmludGYoZmQsICIgcGl4ZWxzL2NtIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWZwcmludGYoZmQsICIgKHVuaXQgJXUgPSAweCV4KSIsCisJCQkJICAgIHRkLT50ZF9yZXNvbHV0aW9udW5pdCwKKwkJCQkgICAgdGQtPnRkX3Jlc29sdXRpb251bml0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmcHJpbnRmKGZkLCAiXG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUE9TSVRJT04pKQorCQlmcHJpbnRmKGZkLCAiICBQb3NpdGlvbjogJWcsICVnXG4iLAorCQkgICAgdGQtPnRkX3hwb3NpdGlvbiwgdGQtPnRkX3lwb3NpdGlvbik7CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQklUU1BFUlNBTVBMRSkpCisJCWZwcmludGYoZmQsICIgIEJpdHMvU2FtcGxlOiAldVxuIiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NBTVBMRUZPUk1BVCkpIHsKKwkJZnByaW50ZihmZCwgIiAgU2FtcGxlIEZvcm1hdDogIik7CisJCXN3aXRjaCAodGQtPnRkX3NhbXBsZWZvcm1hdCkgeworCQljYXNlIFNBTVBMRUZPUk1BVF9WT0lEOgorCQkJZnByaW50ZihmZCwgInZvaWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU0FNUExFRk9STUFUX0lOVDoKKwkJCWZwcmludGYoZmQsICJzaWduZWQgaW50ZWdlclxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTQU1QTEVGT1JNQVRfVUlOVDoKKwkJCWZwcmludGYoZmQsICJ1bnNpZ25lZCBpbnRlZ2VyXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNBTVBMRUZPUk1BVF9JRUVFRlA6CisJCQlmcHJpbnRmKGZkLCAiSUVFRSBmbG9hdGluZyBwb2ludFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTQU1QTEVGT1JNQVRfQ09NUExFWElOVDoKKwkJCWZwcmludGYoZmQsICJjb21wbGV4IHNpZ25lZCBpbnRlZ2VyXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNBTVBMRUZPUk1BVF9DT01QTEVYSUVFRUZQOgorCQkJZnByaW50ZihmZCwgImNvbXBsZXggSUVFRSBmbG9hdGluZyBwb2ludFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoZmQsICIldSAoMHgleClcbiIsCisJCQkgICAgdGQtPnRkX3NhbXBsZWZvcm1hdCwgdGQtPnRkX3NhbXBsZWZvcm1hdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9DT01QUkVTU0lPTikpIHsKKwkJY29uc3QgVElGRkNvZGVjKiBjID0gVElGRkZpbmRDT0RFQyh0ZC0+dGRfY29tcHJlc3Npb24pOworCQlmcHJpbnRmKGZkLCAiICBDb21wcmVzc2lvbiBTY2hlbWU6ICIpOworCQlpZiAoYykKKwkJCWZwcmludGYoZmQsICIlc1xuIiwgYy0+bmFtZSk7CisJCWVsc2UKKwkJCWZwcmludGYoZmQsICIldSAoMHgleClcbiIsCisJCQkgICAgdGQtPnRkX2NvbXByZXNzaW9uLCB0ZC0+dGRfY29tcHJlc3Npb24pOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QSE9UT01FVFJJQykpIHsKKwkJZnByaW50ZihmZCwgIiAgUGhvdG9tZXRyaWMgSW50ZXJwcmV0YXRpb246ICIpOworCQlpZiAodGQtPnRkX3Bob3RvbWV0cmljIDwgTlBIT1RPTkFNRVMpCisJCQlmcHJpbnRmKGZkLCAiJXNcbiIsIHBob3RvTmFtZXNbdGQtPnRkX3Bob3RvbWV0cmljXSk7CisJCWVsc2UgeworCQkJc3dpdGNoICh0ZC0+dGRfcGhvdG9tZXRyaWMpIHsKKwkJCWNhc2UgUEhPVE9NRVRSSUNfTE9HTDoKKwkJCQlmcHJpbnRmKGZkLCAiQ0lFIExvZzIoTClcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBQSE9UT01FVFJJQ19MT0dMVVY6CisJCQkJZnByaW50ZihmZCwgIkNJRSBMb2cyKEwpICh1Jyx2JylcbiIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJCSAgICB0ZC0+dGRfcGhvdG9tZXRyaWMsIHRkLT50ZF9waG90b21ldHJpYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfRVhUUkFTQU1QTEVTKSAmJiB0ZC0+dGRfZXh0cmFzYW1wbGVzKSB7CisJCWZwcmludGYoZmQsICIgIEV4dHJhIFNhbXBsZXM6ICV1PCIsIHRkLT50ZF9leHRyYXNhbXBsZXMpOworCQlzZXAgPSAiIjsKKwkJZm9yIChpID0gMDsgaSA8IHRkLT50ZF9leHRyYXNhbXBsZXM7IGkrKykgeworCQkJc3dpdGNoICh0ZC0+dGRfc2FtcGxlaW5mb1tpXSkgeworCQkJY2FzZSBFWFRSQVNBTVBMRV9VTlNQRUNJRklFRDoKKwkJCQlmcHJpbnRmKGZkLCAiJXN1bnNwZWNpZmllZCIsIHNlcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEVYVFJBU0FNUExFX0FTU09DQUxQSEE6CisJCQkJZnByaW50ZihmZCwgIiVzYXNzb2MtYWxwaGEiLCBzZXApOworCQkJCWJyZWFrOworCQkJY2FzZSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOgorCQkJCWZwcmludGYoZmQsICIlc3VuYXNzb2MtYWxwaGEiLCBzZXApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKGZkLCAiJXMldSAoMHgleCkiLCBzZXAsCisJCQkJICAgIHRkLT50ZF9zYW1wbGVpbmZvW2ldLCB0ZC0+dGRfc2FtcGxlaW5mb1tpXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXAgPSAiLCAiOworCQl9CisJCWZwcmludGYoZmQsICI+XG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSU5LTkFNRVMpKSB7CisJCWNoYXIqIGNwOworCQlmcHJpbnRmKGZkLCAiICBJbmsgTmFtZXM6ICIpOworCQlpID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJc2VwID0gIiI7CisJCWZvciAoY3AgPSB0ZC0+dGRfaW5rbmFtZXM7IAorCQkgICAgIGkgPiAwICYmIGNwIDwgdGQtPnRkX2lua25hbWVzICsgdGQtPnRkX2lua25hbWVzbGVuOyAKKwkJICAgICBjcCA9IHN0cmNocihjcCwnXDAnKSsxLCBpLS0pIHsKKwkJCWludCBtYXhfY2hhcnMgPSAKKwkJCQkoaW50KSh0ZC0+dGRfaW5rbmFtZXNsZW4gLSAoY3AgLSB0ZC0+dGRfaW5rbmFtZXMpKTsKKwkJCWZwdXRzKHNlcCwgZmQpOworCQkJX1RJRkZwcmludEFzY2lpQm91bmRlZChmZCwgY3AsIG1heF9jaGFycyk7CisJCQlzZXAgPSAiLCAiOworCQl9CisgICAgICAgICAgICAgICAgZnB1dHMoIlxuIiwgZmQpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9USFJFU0hIT0xESU5HKSkgeworCQlmcHJpbnRmKGZkLCAiICBUaHJlc2hvbGRpbmc6ICIpOworCQlzd2l0Y2ggKHRkLT50ZF90aHJlc2hob2xkaW5nKSB7CisJCWNhc2UgVEhSRVNISE9MRF9CSUxFVkVMOgorCQkJZnByaW50ZihmZCwgImJpbGV2ZWwgYXJ0IHNjYW5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVEhSRVNISE9MRF9IQUxGVE9ORToKKwkJCWZwcmludGYoZmQsICJoYWxmdG9uZSBvciBkaXRoZXJlZCBzY2FuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFRIUkVTSEhPTERfRVJST1JESUZGVVNFOgorCQkJZnByaW50ZihmZCwgImVycm9yIGRpZmZ1c2VkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihmZCwgIiV1ICgweCV4KVxuIiwKKwkJCSAgICB0ZC0+dGRfdGhyZXNoaG9sZGluZywgdGQtPnRkX3RocmVzaGhvbGRpbmcpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfRklMTE9SREVSKSkgeworCQlmcHJpbnRmKGZkLCAiICBGaWxsT3JkZXI6ICIpOworCQlzd2l0Y2ggKHRkLT50ZF9maWxsb3JkZXIpIHsKKwkJY2FzZSBGSUxMT1JERVJfTVNCMkxTQjoKKwkJCWZwcmludGYoZmQsICJtc2ItdG8tbHNiXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIEZJTExPUkRFUl9MU0IyTVNCOgorCQkJZnByaW50ZihmZCwgImxzYi10by1tc2JcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJICAgIHRkLT50ZF9maWxsb3JkZXIsIHRkLT50ZF9maWxsb3JkZXIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfWUNCQ1JTVUJTQU1QTElORykpCisgICAgICAgIHsKKwkJZnByaW50ZihmZCwgIiAgWUNiQ3IgU3Vic2FtcGxpbmc6ICV1LCAldVxuIiwKKwkJCXRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdLCB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXSApOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9ZQ0JDUlBPU0lUSU9OSU5HKSkgeworCQlmcHJpbnRmKGZkLCAiICBZQ2JDciBQb3NpdGlvbmluZzogIik7CisJCXN3aXRjaCAodGQtPnRkX3ljYmNycG9zaXRpb25pbmcpIHsKKwkJY2FzZSBZQ0JDUlBPU0lUSU9OX0NFTlRFUkVEOgorCQkJZnByaW50ZihmZCwgImNlbnRlcmVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFlDQkNSUE9TSVRJT05fQ09TSVRFRDoKKwkJCWZwcmludGYoZmQsICJjb3NpdGVkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihmZCwgIiV1ICgweCV4KVxuIiwKKwkJCSAgICB0ZC0+dGRfeWNiY3Jwb3NpdGlvbmluZywgdGQtPnRkX3ljYmNycG9zaXRpb25pbmcpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSEFMRlRPTkVISU5UUykpCisJCWZwcmludGYoZmQsICIgIEhhbGZ0b25lIEhpbnRzOiBsaWdodCAldSBkYXJrICV1XG4iLAorCQkgICAgdGQtPnRkX2hhbGZ0b25laGludHNbMF0sIHRkLT50ZF9oYWxmdG9uZWhpbnRzWzFdKTsKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PUklFTlRBVElPTikpIHsKKwkJZnByaW50ZihmZCwgIiAgT3JpZW50YXRpb246ICIpOworCQlpZiAodGQtPnRkX29yaWVudGF0aW9uIDwgTk9SSUVOVE5BTUVTKQorCQkJZnByaW50ZihmZCwgIiVzXG4iLCBvcmllbnROYW1lc1t0ZC0+dGRfb3JpZW50YXRpb25dKTsKKwkJZWxzZQorCQkJZnByaW50ZihmZCwgIiV1ICgweCV4KVxuIiwKKwkJCSAgICB0ZC0+dGRfb3JpZW50YXRpb24sIHRkLT50ZF9vcmllbnRhdGlvbik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NBTVBMRVNQRVJQSVhFTCkpCisJCWZwcmludGYoZmQsICIgIFNhbXBsZXMvUGl4ZWw6ICV1XG4iLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9ST1dTUEVSU1RSSVApKSB7CisJCWZwcmludGYoZmQsICIgIFJvd3MvU3RyaXA6ICIpOworCQlpZiAodGQtPnRkX3Jvd3NwZXJzdHJpcCA9PSAodWludDMyKSAtMSkKKwkJCWZwcmludGYoZmQsICIoaW5maW5pdGUpXG4iKTsKKwkJZWxzZQorCQkJZnByaW50ZihmZCwgIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9yb3dzcGVyc3RyaXApOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9NSU5TQU1QTEVWQUxVRSkpCisJCWZwcmludGYoZmQsICIgIE1pbiBTYW1wbGUgVmFsdWU6ICV1XG4iLCB0ZC0+dGRfbWluc2FtcGxldmFsdWUpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX01BWFNBTVBMRVZBTFVFKSkKKwkJZnByaW50ZihmZCwgIiAgTWF4IFNhbXBsZSBWYWx1ZTogJXVcbiIsIHRkLT50ZF9tYXhzYW1wbGV2YWx1ZSk7CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU01JTlNBTVBMRVZBTFVFKSkgeworCQlpbnQgY291bnQgPSAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkgPyB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogMTsKKwkJZnByaW50ZihmZCwgIiAgU01pbiBTYW1wbGUgVmFsdWU6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJZnByaW50ZihmZCwgIiAlZyIsIHRkLT50ZF9zbWluc2FtcGxldmFsdWVbaV0pOworCQlmcHJpbnRmKGZkLCAiXG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU01BWFNBTVBMRVZBTFVFKSkgeworCQlpbnQgY291bnQgPSAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkgPyB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogMTsKKwkJZnByaW50ZihmZCwgIiAgU01heCBTYW1wbGUgVmFsdWU6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJZnByaW50ZihmZCwgIiAlZyIsIHRkLT50ZF9zbWF4c2FtcGxldmFsdWVbaV0pOworCQlmcHJpbnRmKGZkLCAiXG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUExBTkFSQ09ORklHKSkgeworCQlmcHJpbnRmKGZkLCAiICBQbGFuYXIgQ29uZmlndXJhdGlvbjogIik7CisJCXN3aXRjaCAodGQtPnRkX3BsYW5hcmNvbmZpZykgeworCQljYXNlIFBMQU5BUkNPTkZJR19DT05USUc6CisJCQlmcHJpbnRmKGZkLCAic2luZ2xlIGltYWdlIHBsYW5lXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFBMQU5BUkNPTkZJR19TRVBBUkFURToKKwkJCWZwcmludGYoZmQsICJzZXBhcmF0ZSBpbWFnZSBwbGFuZXNcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJICAgIHRkLT50ZF9wbGFuYXJjb25maWcsIHRkLT50ZF9wbGFuYXJjb25maWcpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUEFHRU5VTUJFUikpCisJCWZwcmludGYoZmQsICIgIFBhZ2UgTnVtYmVyOiAldS0ldVxuIiwKKwkJICAgIHRkLT50ZF9wYWdlbnVtYmVyWzBdLCB0ZC0+dGRfcGFnZW51bWJlclsxXSk7CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQ09MT1JNQVApKSB7CisJCWZwcmludGYoZmQsICIgIENvbG9yIE1hcDogIik7CisJCWlmIChmbGFncyAmIFRJRkZQUklOVF9DT0xPUk1BUCkgeworCQkJZnByaW50ZihmZCwgIlxuIik7CisJCQluID0gMUw8PHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCQkJZm9yIChsID0gMDsgbCA8IG47IGwrKykKKwkJCQlmcHJpbnRmKGZkLCAiICAgJTVsdTogJTV1ICU1dSAlNXVcbiIsCisJCQkJICAgIGwsCisJCQkJICAgIHRkLT50ZF9jb2xvcm1hcFswXVtsXSwKKwkJCQkgICAgdGQtPnRkX2NvbG9ybWFwWzFdW2xdLAorCQkJCSAgICB0ZC0+dGRfY29sb3JtYXBbMl1bbF0pOworCQl9IGVsc2UKKwkJCWZwcmludGYoZmQsICIocHJlc2VudClcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9SRUZCTEFDS1dISVRFKSkgeworCQlmcHJpbnRmKGZkLCAiICBSZWZlcmVuY2UgQmxhY2svV2hpdGU6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJZnByaW50ZihmZCwgIiAgICAlMmQ6ICU1ZyAlNWdcbiIsIGksCisJCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsyKmkrMF0sCisJCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsyKmkrMV0pOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9UUkFOU0ZFUkZVTkNUSU9OKSkgeworCQlmcHJpbnRmKGZkLCAiICBUcmFuc2ZlciBGdW5jdGlvbjogIik7CisJCWlmIChmbGFncyAmIFRJRkZQUklOVF9DVVJWRVMpIHsKKwkJCWZwcmludGYoZmQsICJcbiIpOworCQkJbiA9IDFMPDx0ZC0+dGRfYml0c3BlcnNhbXBsZTsKKwkJCWZvciAobCA9IDA7IGwgPCBuOyBsKyspIHsKKwkJCQlmcHJpbnRmKGZkLCAiICAgICUybHU6ICU1dSIsCisJCQkJICAgIGwsIHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdW2xdKTsKKwkJCQlmb3IgKGkgPSAxOyBpIDwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsgaSsrKQorCQkJCQlmcHJpbnRmKGZkLCAiICU1dSIsCisJCQkJCSAgICB0ZC0+dGRfdHJhbnNmZXJmdW5jdGlvbltpXVtsXSk7CisJCQkJZnB1dGMoJ1xuJywgZmQpOworCQkJfQorCQl9IGVsc2UKKwkJCWZwcmludGYoZmQsICIocHJlc2VudClcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZiwgRklFTERfU1VCSUZEKSAmJiAodGQtPnRkX3N1YmlmZCkpIHsKKwkJZnByaW50ZihmZCwgIiAgU3ViSUZEIE9mZnNldHM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCB0ZC0+dGRfbnN1YmlmZDsgaSsrKQorI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQlmcHJpbnRmKGZkLCAiICU1STY0dSIsCisJCQkJKHVuc2lnbmVkIF9faW50NjQpIHRkLT50ZF9zdWJpZmRbaV0pOworI2Vsc2UKKwkJCWZwcmludGYoZmQsICIgJTVsbHUiLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHRkLT50ZF9zdWJpZmRbaV0pOworI2VuZGlmCisJCWZwdXRjKCdcbicsIGZkKTsKKwl9CisKKwkvKgorCSoqIEN1c3RvbSB0YWcgc3VwcG9ydC4KKwkqLworCXsKKwkJaW50ICBpOworCQlzaG9ydCBjb3VudDsKKworCQljb3VudCA9IChzaG9ydCkgVElGRkdldFRhZ0xpc3RDb3VudCh0aWYpOworCQlmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQl1aW50MzIgdGFnID0gVElGRkdldFRhZ0xpc3RFbnRyeSh0aWYsIGkpOworCQkJY29uc3QgVElGRkZpZWxkICpmaXA7CisJCQl1aW50MzIgdmFsdWVfY291bnQ7CisJCQlpbnQgbWVtX2FsbG9jID0gMDsKKwkJCXZvaWQgKnJhd19kYXRhOworCisJCQlmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZiwgdGFnKTsKKwkJCWlmKGZpcCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlpZihmaXAtPmZpZWxkX3Bhc3Njb3VudCkgeworCQkJCWlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFICkgeworCQkJCQlpZihUSUZGR2V0RmllbGQodGlmLCB0YWcsICZ2YWx1ZV9jb3VudCwgJnJhd19kYXRhKSAhPSAxKQorCQkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFMiApIHsKKwkJCQkJdWludDE2IHNtYWxsX3ZhbHVlX2NvdW50OworCQkJCQlpZihUSUZGR2V0RmllbGQodGlmLCB0YWcsICZzbWFsbF92YWx1ZV9jb3VudCwgJnJhd19kYXRhKSAhPSAxKQorCQkJCQkJY29udGludWU7CisJCQkJCXZhbHVlX2NvdW50ID0gc21hbGxfdmFsdWVfY291bnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXNzZXJ0IChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFCisJCQkJCQl8fCBmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFMik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gCisJCQl9IGVsc2UgeworCQkJCWlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFCisJCQkJICAgIHx8IGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUyKQorCQkJCQl2YWx1ZV9jb3VudCA9IDE7CisJCQkJZWxzZSBpZiAoZmlwLT5maWVsZF9yZWFkY291bnQgPT0gVElGRl9TUFApCisJCQkJCXZhbHVlX2NvdW50ID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJCQllbHNlCisJCQkJCXZhbHVlX2NvdW50ID0gZmlwLT5maWVsZF9yZWFkY291bnQ7CisJCQkJaWYgKGZpcC0+ZmllbGRfdGFnID09IFRJRkZUQUdfRE9UUkFOR0UKKwkJCQkgICAgJiYgc3RyY21wKGZpcC0+ZmllbGRfbmFtZSwiRG90UmFuZ2UiKSA9PSAwKSB7CisJCQkJCS8qIFRPRE86IFRoaXMgaXMgYW4gZXZpbCBleGNlcHRpb24gYW5kIHNob3VsZCBub3QgaGF2ZSBiZWVuCisJCQkJCSAgIGhhbmRsZWQgdGhpcyB3YXkgLi4uIGxpa2VseSBiZXN0IGlmIHdlIG1vdmUgaXQgaW50bworCQkJCQkgICB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aXRoIGFuIGV4cGxpY2l0IGZpZWxkIGluIAorCQkJCQkgICBsaWJ0aWZmIDQuMSBhbmQgYXNzaWduIGl0IGEgRklFTERfIHZhbHVlICovCisJCQkJCXN0YXRpYyB1aW50MTYgZG90cmFuZ2VbMl07CisJCQkJCXJhd19kYXRhID0gZG90cmFuZ2U7CisJCQkJCVRJRkZHZXRGaWVsZCh0aWYsIHRhZywgZG90cmFuZ2UrMCwgZG90cmFuZ2UrMSk7CisJCQkJfSBlbHNlIGlmIChmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9BU0NJSQorCQkJCQkgICB8fCBmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFCisJCQkJCSAgIHx8IGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUyCisJCQkJCSAgIHx8IGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfU1BQCisJCQkJCSAgIHx8IHZhbHVlX2NvdW50ID4gMSkgeworCQkJCQlpZihUSUZGR2V0RmllbGQodGlmLCB0YWcsICZyYXdfZGF0YSkgIT0gMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCXJhd19kYXRhID0gX1RJRkZtYWxsb2MoCisJCQkJCSAgICBfVElGRkRhdGFTaXplKGZpcC0+ZmllbGRfdHlwZSkKKwkJCQkJICAgICogdmFsdWVfY291bnQpOworCQkJCQltZW1fYWxsb2MgPSAxOworCQkJCQlpZihUSUZGR2V0RmllbGQodGlmLCB0YWcsIHJhd19kYXRhKSAhPSAxKSB7CisJCQkJCQlfVElGRmZyZWUocmF3X2RhdGEpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBDYXRjaCB0aGUgdGFncyB3aGljaCBuZWVkcyB0byBiZSBzcGVjaWFsbHkgaGFuZGxlZAorCQkJICogYW5kIHByZXR0eSBwcmludCB0aGVtLiBJZiB0YWcgbm90IGhhbmRsZWQgaW4KKwkJCSAqIF9USUZGUHJldHR5UHJpbnRGaWVsZCgpIGZhbGwgZG93biBhbmQgcHJpbnQgaXQgYXMKKwkJCSAqIGFueSBvdGhlciB0YWcuCisJCQkgKi8KKwkJCWlmICghX1RJRkZQcmV0dHlQcmludEZpZWxkKHRpZiwgZmlwLCBmZCwgdGFnLCB2YWx1ZV9jb3VudCwgcmF3X2RhdGEpKQorCQkJCV9USUZGUHJpbnRGaWVsZChmZCwgZmlwLCB2YWx1ZV9jb3VudCwgcmF3X2RhdGEpOworCisJCQlpZihtZW1fYWxsb2MpCisJCQkJX1RJRkZmcmVlKHJhd19kYXRhKTsKKwkJfQorCX0KKyAgICAgICAgCisJaWYgKHRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXIpCisJCSgqdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpcikodGlmLCBmZCwgZmxhZ3MpOworCisgICAgICAgIF9USUZGRmlsbFN0cmlsZXMoIHRpZiApOworICAgICAgICAKKwlpZiAoKGZsYWdzICYgVElGRlBSSU5UX1NUUklQUykgJiYKKwkgICAgVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TVFJJUE9GRlNFVFMpKSB7CisJCXVpbnQzMiBzOworCisJCWZwcmludGYoZmQsICIgICVsdSAlczpcbiIsCisJCSAgICAobG9uZykgdGQtPnRkX25zdHJpcHMsCisJCSAgICBpc1RpbGVkKHRpZikgPyAiVGlsZXMiIDogIlN0cmlwcyIpOworCQlmb3IgKHMgPSAwOyBzIDwgdGQtPnRkX25zdHJpcHM7IHMrKykKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJZnByaW50ZihmZCwgIiAgICAlM2x1OiBbJThJNjR1LCAlOEk2NHVdXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBzLAorCQkJICAgICh1bnNpZ25lZCBfX2ludDY0KSB0ZC0+dGRfc3RyaXBvZmZzZXRbc10sCisJCQkgICAgKHVuc2lnbmVkIF9faW50NjQpIHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzXSk7CisjZWxzZQorCQkJZnByaW50ZihmZCwgIiAgICAlM2x1OiBbJThsbHUsICU4bGx1XVxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgcywKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0ZC0+dGRfc3RyaXBvZmZzZXRbc10sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3NdKTsKKyNlbmRpZgorCX0KK30KKwordm9pZAorX1RJRkZwcmludEFzY2lpKEZJTEUqIGZkLCBjb25zdCBjaGFyKiBjcCkKK3sKKwlfVElGRnByaW50QXNjaWlCb3VuZGVkKCBmZCwgY3AsIChpbnQpc3RybGVuKGNwKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfVElGRnByaW50QXNjaWlCb3VuZGVkKEZJTEUqIGZkLCBjb25zdCBjaGFyKiBjcCwgaW50IG1heF9jaGFycykKK3sKKwlmb3IgKDsgbWF4X2NoYXJzID4gMCAmJiAqY3AgIT0gJ1wwJzsgY3ArKywgbWF4X2NoYXJzLS0pIHsKKwkJY29uc3QgY2hhciogdHA7CisKKwkJaWYgKGlzcHJpbnQoKGludCkqY3ApKSB7CisJCQlmcHV0YygqY3AsIGZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAodHAgPSAiXHR0XGJiXHJyXG5uXHZ2IjsgKnRwOyB0cCsrKQorCQkJaWYgKCp0cCsrID09ICpjcCkKKwkJCQlicmVhazsKKwkJaWYgKCp0cCkKKwkJCWZwcmludGYoZmQsICJcXCVjIiwgKnRwKTsKKwkJZWxzZQorCQkJZnByaW50ZihmZCwgIlxcJTAzbyIsICpjcCAmIDB4ZmYpOworCX0KK30KKwordm9pZAorX1RJRkZwcmludEFzY2lpVGFnKEZJTEUqIGZkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlmcHJpbnRmKGZkLCAiICAlczogXCIiLCBuYW1lKTsKKwlfVElGRnByaW50QXNjaWkoZmQsIHZhbHVlKTsKKwlmcHJpbnRmKGZkLCAiXCJcbiIpOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9yZWFkLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1YTVhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3JlYWQuYwpAQCAtMCwwICsxLDExMTYgQEAKKy8qICRJZDogdGlmX3JlYWQuYyx2IDEuNDEgMjAxMi0wNy0wNiAxOToyMjo1OCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqIFNjYW5saW5lLW9yaWVudGVkIFJlYWQgU3VwcG9ydAorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IFRJRkZGaWxsU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApOworaW50IFRJRkZGaWxsVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlKTsKK3N0YXRpYyBpbnQgVElGRlN0YXJ0U3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApOworc3RhdGljIGludCBUSUZGU3RhcnRUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUpOworc3RhdGljIGludCBUSUZGQ2hlY2tSZWFkKFRJRkYqLCBpbnQpOworc3RhdGljIHRtc2l6ZV90CitUSUZGUmVhZFJhd1N0cmlwMShUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplLGNvbnN0IGNoYXIqIG1vZHVsZSk7CisKKyNkZWZpbmUgTk9TVFJJUCAoKHVpbnQzMikoLTEpKSAgICAgICAvKiB1bmRlZmluZWQgc3RhdGUgKi8KKyNkZWZpbmUgTk9USUxFICgodWludDMyKSgtMSkpICAgICAgICAgLyogdW5kZWZpbmVkIHN0YXRlICovCisKK3N0YXRpYyBpbnQKK1RJRkZGaWxsU3RyaXBQYXJ0aWFsKCBUSUZGICp0aWYsIGludCBzdHJpcCwgdG1zaXplX3QgcmVhZF9haGVhZCwgaW50IHJlc3RhcnQgKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGaWxsU3RyaXBQYXJ0aWFsIjsKKwlyZWdpc3RlciBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgICAgIHVpbnQ2NCB1bnVzZWRfZGF0YTsKKyAgICAgICAgdWludDY0IHJlYWRfb2Zmc2V0OworICAgICAgICB0bXNpemVfdCBjYywgdG9fcmVhZDsKKyAgICAgICAgLyogdG1zaXplX3QgYnl0ZWNvdW50bTsgKi8KKyAgICAgICAgCisgICAgICAgIGlmICghX1RJRkZGaWxsU3RyaWxlcyggdGlmICkgfHwgIXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogRXhwYW5kIHJhdyBkYXRhIGJ1ZmZlciwgaWYgbmVlZGVkLCB0byBob2xkIGRhdGEKKyAgICAgICAgICogc3RyaXAgY29taW5nIGZyb20gZmlsZSAocGVyaGFwcyBzaG91bGQgc2V0IHVwcGVyCisgICAgICAgICAqIGJvdW5kIG9uIHRoZSBzaXplIG9mIGEgYnVmZmVyIHdlJ2xsIHVzZT8pLgorICAgICAgICAgKi8KKworICAgICAgICAvKiBieXRlY291bnRtPSh0bXNpemVfdCkgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsgKi8KKyAgICAgICAgaWYgKHJlYWRfYWhlYWQqMiA+IHRpZi0+dGlmX3Jhd2RhdGFzaXplKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCByZXN0YXJ0ICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGlmLT50aWZfY3Vyc3RyaXAgPSBOT1NUUklQOworICAgICAgICAgICAgICAgIGlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX01ZQlVGRkVSKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIGJ1ZmZlciB0b28gc21hbGwgdG8gaG9sZCBwYXJ0IG9mIHN0cmlwICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghVElGRlJlYWRCdWZmZXJTZXR1cCh0aWYsIDAsIHJlYWRfYWhlYWQqMikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHJlc3RhcnQgKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IDA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAqKiBJZiB3ZSBhcmUgcmVhZGluZyBtb3JlIGRhdGEsIG1vdmUgYW55IHVudXNlZCBkYXRhIHRvIHRoZQorICAgICAgICAqKiBzdGFydCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAqLworICAgICAgICBpZiggdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA+IDAgKQorICAgICAgICAgICAgICAgIHVudXNlZF9kYXRhID0gdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCAtICh0aWYtPnRpZl9yYXdjcCAtIHRpZi0+dGlmX3Jhd2RhdGEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdW51c2VkX2RhdGEgPSAwOworICAgICAgICAKKyAgICAgICAgaWYoIHVudXNlZF9kYXRhID4gMCApCisgICAgICAgIHsKKwkJYXNzZXJ0KCh0aWYtPnRpZl9mbGFncyZUSUZGX0JVRkZFUk1NQVApPT0wKTsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKCB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjcCwgKHNpemVfdCl1bnVzZWRfZGF0YSApOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogU2VlayB0byB0aGUgcG9pbnQgaW4gdGhlIGZpbGUgd2hlcmUgbW9yZSBkYXRhIHNob3VsZCBiZSByZWFkLgorICAgICAgICAqLworICAgICAgICByZWFkX29mZnNldCA9IHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0KKyAgICAgICAgICAgICAgICArIHRpZi0+dGlmX3Jhd2RhdGFvZmYgKyB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkOworCisgICAgICAgIGlmICghU2Vla09LKHRpZiwgcmVhZF9vZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlZWsgZXJyb3IgYXQgc2NhbmxpbmUgJWx1LCBzdHJpcCAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LCAodW5zaWduZWQgbG9uZykgc3RyaXApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogSG93IG11Y2ggZG8gd2Ugd2FudCB0byByZWFkPworICAgICAgICAqLworICAgICAgICB0b19yZWFkID0gKHRtc2l6ZV90KSh0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHVudXNlZF9kYXRhKTsKKyAgICAgICAgaWYoICh1aW50NjQpIHRvX3JlYWQgPiB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdIAorICAgICAgICAgICAgLSB0aWYtPnRpZl9yYXdkYXRhb2ZmIC0gdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b19yZWFkID0gKHRtc2l6ZV90KSh0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdCisgICAgICAgICAgICAgICAgICAgICAgICAtIHRpZi0+dGlmX3Jhd2RhdGFvZmYgLSB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkKTsKKyAgICAgICAgfQorCisJYXNzZXJ0KCh0aWYtPnRpZl9mbGFncyZUSUZGX0JVRkZFUk1NQVApPT0wKTsKKyAgICAgICAgY2MgPSBUSUZGUmVhZEZpbGUodGlmLCB0aWYtPnRpZl9yYXdkYXRhICsgdW51c2VkX2RhdGEsIHRvX3JlYWQpOworCisgICAgICAgIGlmIChjYyAhPSB0b19yZWFkKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHU7IGdvdCAlSTY0dSBieXRlcywgZXhwZWN0ZWQgJUk2NHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgX19pbnQ2NCkgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBfX2ludDY0KSB0b19yZWFkKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWQgZXJyb3IgYXQgc2NhbmxpbmUgJWx1OyBnb3QgJWxsdSBieXRlcywgZXhwZWN0ZWQgJWxsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0b19yZWFkKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0aWYtPnRpZl9yYXdkYXRhb2ZmID0gKHRtc2l6ZV90KSh0aWYtPnRpZl9yYXdkYXRhb2ZmICsgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCAtIHVudXNlZF9kYXRhKSA7CisgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgPSAodG1zaXplX3QpdW51c2VkX2RhdGEgKyB0b19yZWFkOworCisgICAgICAgIHRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGQtPnRkX2ZpbGxvcmRlcikgJiYKKyAgICAgICAgICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApIHsKKwkJYXNzZXJ0KCh0aWYtPnRpZl9mbGFncyZUSUZGX0JVRkZFUk1NQVApPT0wKTsKKyAgICAgICAgICAgICAgICBUSUZGUmV2ZXJzZUJpdHModGlmLT50aWZfcmF3ZGF0YSArIHVudXNlZF9kYXRhLCB0b19yZWFkICk7CisJfQorCisgICAgICAgIC8qCisgICAgICAgICoqIFdoZW4gc3RhcnRpbmcgYSBzdHJpcCBmcm9tIHRoZSBiZWdpbm5pbmcgd2UgbmVlZCB0bworICAgICAgICAqKiByZXN0YXJ0IHRoZSBkZWNvZGVyLgorICAgICAgICAqLworICAgICAgICBpZiggcmVzdGFydCApCisgICAgICAgICAgICAgICAgcmV0dXJuIFRJRkZTdGFydFN0cmlwKHRpZiwgc3RyaXApOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTZWVrIHRvIGEgcmFuZG9tIHJvdytzYW1wbGUgaW4gYSBmaWxlLgorICoKKyAqIE9ubHkgdXNlZCBieSBUSUZGUmVhZFNjYW5saW5lLCBhbmQgaXMgb25seSB1c2VkIG9uCisgKiBzdHJpcCBvcmdhbml6ZWQgZmlsZXMuICBXZSBkbyBzb21lIHRyaWNreSBzdHVmZiB0byB0cnkKKyAqIGFuZCBhdm9pZCByZWFkaW5nIHRoZSB3aG9sZSBjb21wcmVzc2VkIHJhdyBkYXRhIGZvciBiaWcKKyAqIHN0cmlwcy4KKyAqLworc3RhdGljIGludAorVElGRlNlZWsoVElGRiogdGlmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlICkKK3sKKwlyZWdpc3RlciBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIHN0cmlwOworICAgICAgICBpbnQgICAgd2hvbGVfc3RyaXA7CisJdG1zaXplX3QgcmVhZF9haGVhZCA9IDA7CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogRXN0YWJsaXNoIHdoYXQgc3RyaXAgd2UgYXJlIHdvcmtpbmcgZnJvbS4KKyAgICAgICAgKi8KKwlpZiAocm93ID49IHRkLT50ZF9pbWFnZWxlbmd0aCkgewkvKiBvdXQgb2YgcmFuZ2UgKi8KKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCSAgICAiJWx1OiBSb3cgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSByb3csCisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX2ltYWdlbGVuZ3RoKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKSB7CisJCWlmIChzYW1wbGUgPj0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgIiVsdTogU2FtcGxlIG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNhbXBsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlzdHJpcCA9ICh1aW50MzIpc2FtcGxlKnRkLT50ZF9zdHJpcHNwZXJpbWFnZSArIHJvdy90ZC0+dGRfcm93c3BlcnN0cmlwOworCX0gZWxzZQorCQlzdHJpcCA9IHJvdyAvIHRkLT50ZF9yb3dzcGVyc3RyaXA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRG8gd2Ugd2FudCB0byB0cmVhdCB0aGlzIHN0cmlwIGFzIG9uZSB3aG9sZSBjaHVuayBvcgorICAgICAgICAgKiByZWFkIGl0IGEgZmV3IGxpbmVzIGF0IGEgdGltZT8KKyAgICAgICAgICovCisjaWYgZGVmaW5lZChDSFVOS1lfU1RSSVBfUkVBRF9TVVBQT1JUKQorICAgICAgICBpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHRpZiApIHx8ICF0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgd2hvbGVfc3RyaXAgPSB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbc3RyaXBdIDwgMTAKKyAgICAgICAgICAgICAgICB8fCBpc01hcHBlZCh0aWYpOworI2Vsc2UKKyAgICAgICAgd2hvbGVfc3RyaXAgPSAxOworI2VuZGlmCisgICAgICAgIAorICAgICAgICBpZiggIXdob2xlX3N0cmlwICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRfYWhlYWQgPSB0aWYtPnRpZl9zY2FubGluZXNpemUgKiAxNiArIDUwMDA7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB3ZSBoYXZlbid0IGxvYWRlZCB0aGlzIHN0cmlwLCBkbyBzbyBub3csIHBvc3NpYmx5CisgICAgICAgICAqIG9ubHkgcmVhZGluZyB0aGUgZmlyc3QgcGFydC4KKyAgICAgICAgICovCisJaWYgKHN0cmlwICE9IHRpZi0+dGlmX2N1cnN0cmlwKSB7CS8qIGRpZmZlcmVudCBzdHJpcCwgcmVmaWxsICovCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIHdob2xlX3N0cmlwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRJRkZGaWxsU3RyaXAodGlmLCBzdHJpcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIVRJRkZGaWxsU3RyaXBQYXJ0aWFsKHRpZixzdHJpcCxyZWFkX2FoZWFkLDEpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCX0KKworICAgICAgICAvKgorICAgICAgICAqKiBJZiB3ZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIGxvYWRlZCwgZG8gd2UgbmVlZCB0byByZWFkIHNvbWUgbW9yZT8KKyAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiggIXdob2xlX3N0cmlwICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAoKHRpZi0+dGlmX3Jhd2RhdGEgKyB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkKSAtIHRpZi0+dGlmX3Jhd2NwKSA8IHJlYWRfYWhlYWQgCisgICAgICAgICAgICAgICAgICAgICYmICh1aW50NjQpIHRpZi0+dGlmX3Jhd2RhdGFvZmYrdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA8IHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhVElGRkZpbGxTdHJpcFBhcnRpYWwodGlmLHN0cmlwLHJlYWRfYWhlYWQsMCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocm93IDwgdGlmLT50aWZfcm93KSB7CisJCS8qCisJCSAqIE1vdmluZyBiYWNrd2FyZHMgd2l0aGluIHRoZSBzYW1lIHN0cmlwOiBiYWNrdXAKKwkJICogdG8gdGhlIHN0YXJ0IGFuZCB0aGVuIGRlY29kZSBmb3J3YXJkIChiZWxvdykuCisJCSAqCisJCSAqIE5COiBJZiB5b3UncmUgcGxhbm5pbmcgb24gbG90cyBvZiByYW5kb20gYWNjZXNzIHdpdGhpbiBhCisJCSAqIHN0cmlwLCBpdCdzIGJldHRlciB0byBqdXN0IHJlYWQgYW5kIGRlY29kZSB0aGUgZW50aXJlCisJCSAqIHN0cmlwLCBhbmQgdGhlbiBhY2Nlc3MgdGhlIGRlY29kZWQgZGF0YSBpbiBhIHJhbmRvbSBmYXNoaW9uLgorCQkgKi8KKworICAgICAgICAgICAgICAgIGlmKCB0aWYtPnRpZl9yYXdkYXRhb2ZmICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhVElGRkZpbGxTdHJpcFBhcnRpYWwodGlmLHN0cmlwLHJlYWRfYWhlYWQsMSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVElGRlN0YXJ0U3RyaXAodGlmLCBzdHJpcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorCX0KKyAgICAgICAgCisJaWYgKHJvdyAhPSB0aWYtPnRpZl9yb3cpIHsKKwkJLyoKKwkJICogU2VlayBmb3J3YXJkIHRvIHRoZSBkZXNpcmVkIHJvdy4KKwkJICovCisKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBXaWxsIHRoaXMgcmVhbGx5IHdvcmsgd2l0aCBwYXJ0aWFsIGJ1ZmZlcnM/ICovCisgICAgICAgICAgICAgICAgCisJCWlmICghKCp0aWYtPnRpZl9zZWVrKSh0aWYsIHJvdyAtIHRpZi0+dGlmX3JvdykpCisJCQlyZXR1cm4gKDApOworCQl0aWYtPnRpZl9yb3cgPSByb3c7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworaW50CitUSUZGUmVhZFNjYW5saW5lKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlKQoreworCWludCBlOworCisJaWYgKCFUSUZGQ2hlY2tSZWFkKHRpZiwgMCkpCisJCXJldHVybiAoLTEpOworCWlmKCAoZSA9IFRJRkZTZWVrKHRpZiwgcm93LCBzYW1wbGUpKSAhPSAwKSB7CisJCS8qCisJCSAqIERlY29tcHJlc3MgZGVzaXJlZCByb3cgaW50byB1c2VyIGJ1ZmZlci4KKwkJICovCisJCWUgPSAoKnRpZi0+dGlmX2RlY29kZXJvdykKKwkJICAgICh0aWYsICh1aW50OCopIGJ1ZiwgdGlmLT50aWZfc2NhbmxpbmVzaXplLCBzYW1wbGUpOyAgCisKKwkJLyogd2UgYXJlIG5vdyBwb2lzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByb3cgKi8KKwkJdGlmLT50aWZfcm93ID0gcm93ICsgMTsKKworCQlpZiAoZSkKKwkJCSgqdGlmLT50aWZfcG9zdGRlY29kZSkodGlmLCAodWludDgqKSBidWYsCisJCQkgICAgdGlmLT50aWZfc2NhbmxpbmVzaXplKTsgIAorCX0KKwlyZXR1cm4gKGUgPiAwID8gMSA6IC0xKTsKK30KKworLyoKKyAqIFJlYWQgYSBzdHJpcCBvZiBkYXRhIGFuZCBkZWNvbXByZXNzIHRoZSBzcGVjaWZpZWQKKyAqIGFtb3VudCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlci4KKyAqLwordG1zaXplX3QKK1RJRkZSZWFkRW5jb2RlZFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRFbmNvZGVkU3RyaXAiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50MzIgcm93c3BlcnN0cmlwOworCXVpbnQzMiBzdHJpcHNwZXJwbGFuZTsKKwl1aW50MzIgc3RyaXBpbnBsYW5lOworCXVpbnQxNiBwbGFuZSwgY29tcDsKKwl1aW50MzIgcm93czsKKwl0bXNpemVfdCBzdHJpcHNpemU7CisJaWYgKCFUSUZGQ2hlY2tSZWFkKHRpZiwwKSkKKwkJcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAoc3RyaXA+PXRkLT50ZF9uc3RyaXBzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkgICAgIiVsdTogU3RyaXAgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwodW5zaWduZWQgbG9uZylzdHJpcCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXRkLT50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHN0cmlwIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YKKwkgKiByb3dzIGluIHRoZSBzdHJpcCAoY2hlY2sgZm9yIHRydW5jYXRlZCBsYXN0IHN0cmlwIG9uIGFueQorCSAqIG9mIHRoZSBzZXBhcmF0aW9ucykuCisJICovCisJcm93c3BlcnN0cmlwPXRkLT50ZF9yb3dzcGVyc3RyaXA7CisJaWYgKHJvd3NwZXJzdHJpcD50ZC0+dGRfaW1hZ2VsZW5ndGgpCisJCXJvd3NwZXJzdHJpcD10ZC0+dGRfaW1hZ2VsZW5ndGg7CisJc3RyaXBzcGVycGxhbmU9KCh0ZC0+dGRfaW1hZ2VsZW5ndGgrcm93c3BlcnN0cmlwLTEpL3Jvd3NwZXJzdHJpcCk7CisJc3RyaXBpbnBsYW5lPShzdHJpcCVzdHJpcHNwZXJwbGFuZSk7CisJcGxhbmU9KHN0cmlwL3N0cmlwc3BlcnBsYW5lKTsKKwlyb3dzPXRkLT50ZF9pbWFnZWxlbmd0aC1zdHJpcGlucGxhbmUqcm93c3BlcnN0cmlwOworCWlmIChyb3dzPnJvd3NwZXJzdHJpcCkKKwkJcm93cz1yb3dzcGVyc3RyaXA7CisJc3RyaXBzaXplPVRJRkZWU3RyaXBTaXplKHRpZixyb3dzKTsKKwlpZiAoc3RyaXBzaXplPT0wKQorCQlyZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworCWlmICgoc2l6ZSE9KHRtc2l6ZV90KSgtMSkpJiYoc2l6ZTxzdHJpcHNpemUpKQorCQlzdHJpcHNpemU9c2l6ZTsKKworCS8qCisJICogZGlzY2FyZCB0aG9zZS4KKwkgKiBrZWVwIGNvZGUgbW9kaWZpZWQgYnkgQ2hhbmdqaW4gR2FvLgorCSAqIFhpYW9jaHVhbiBMaXUgMjAxMDA4MjguCisJICovCisJLyppZiAoIVRJRkZGaWxsU3RyaXAodGlmLHN0cmlwKSkKKwkJcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAoKCp0aWYtPnRpZl9kZWNvZGVzdHJpcCkodGlmLGJ1ZixzdHJpcHNpemUscGxhbmUpPD0wKQorCQlyZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworCSgqdGlmLT50aWZfcG9zdGRlY29kZSkodGlmLGJ1ZixzdHJpcHNpemUpOworCXJldHVybihzdHJpcHNpemUpOyovCisJCisJLyoKKwkqIENoYW5namluIEdhbyAyMDExMDcyNiBmaXhlZCBkZWNvZGUgZXJyb3IgaXNzdWUuCisJKiBUZXN0IGZpbGU6IG1hbnRpcyAjMjczMDggMDIwNTExLTExNTg0NTAudGlmZi4KKwkqLworCWNvbXAgPSBDT01QUkVTU0lPTl9OT05FOworU3RyaXBEZWNvZGU6CisJaWYgKFRJRkZGaWxsU3RyaXAodGlmLCBzdHJpcCkgJiYgKCp0aWYtPnRpZl9kZWNvZGVzdHJpcCkodGlmLCBidWYsIHN0cmlwc2l6ZSwgcGxhbmUpID4gMCkKKwl7CisJCSgqdGlmLT50aWZfcG9zdGRlY29kZSkodGlmLCBidWYsIHN0cmlwc2l6ZSk7CisJCXJldHVybiAoc3RyaXBzaXplKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGNvbXAgPCA5KQorCQl7CisJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX0NPTVBSRVNTSU9OLCBjb21wKTsKKwkJCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfRkFYTU9ERSxGQVhNT0RFX0NMQVNTSUMpOworCQkJY29tcCsrOworCQkJZ290byBTdHJpcERlY29kZTsKKwkJfQorCisJCXJldHVybiAoKHRzaXplX3QpIC0xKTsKKwl9Cit9CisKK3N0YXRpYyB0bXNpemVfdAorVElGRlJlYWRSYXdTdHJpcDEoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSwKKyAgICBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSkKKyAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgICAgIAorCWFzc2VydCgodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpPT0wKTsKKwlpZiAoIWlzTWFwcGVkKHRpZikpIHsKKwkJdG1zaXplX3QgY2M7CisKKwkJaWYgKCFTZWVrT0sodGlmLCB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiU2VlayBlcnJvciBhdCBzY2FubGluZSAlbHUsIHN0cmlwICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKwkJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCQl9CisJCWNjID0gVElGRlJlYWRGaWxlKHRpZiwgYnVmLCBzaXplKTsKKwkJaWYgKGNjICE9IHNpemUpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJIlJlYWQgZXJyb3IgYXQgc2NhbmxpbmUgJWx1OyBnb3QgJUk2NHUgYnl0ZXMsIGV4cGVjdGVkICVJNjR1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgY2MsCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgc2l6ZSk7CisjZWxzZQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJIlJlYWQgZXJyb3IgYXQgc2NhbmxpbmUgJWx1OyBnb3QgJWxsdSBieXRlcywgZXhwZWN0ZWQgJWxsdSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2MsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKyNlbmRpZgorCQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJCX0KKwl9IGVsc2UgeworCQl0bXNpemVfdCBtYSxtYjsKKwkJdG1zaXplX3QgbjsKKwkJbWE9KHRtc2l6ZV90KXRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF07CisJCW1iPW1hK3NpemU7CisJCWlmICgoKHVpbnQ2NCltYSE9dGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSl8fChtYT50aWYtPnRpZl9zaXplKSkKKwkJCW49MDsKKwkJZWxzZSBpZiAoKG1iPG1hKXx8KG1iPHNpemUpfHwobWI+dGlmLT50aWZfc2l6ZSkpCisJCQluPXRpZi0+dGlmX3NpemUtbWE7CisJCWVsc2UKKwkJCW49c2l6ZTsKKwkJaWYgKG4hPXNpemUpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHUsIHN0cmlwICVsdTsgZ290ICVJNjR1IGJ5dGVzLCBleHBlY3RlZCAlSTY0dSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwLAorCQkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIG4sCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgc2l6ZSk7CisjZWxzZQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHUsIHN0cmlwICVsdTsgZ290ICVsbHUgYnl0ZXMsIGV4cGVjdGVkICVsbHUiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG4sCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKyNlbmRpZgorCQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJCX0KKwkJX1RJRkZtZW1jcHkoYnVmLCB0aWYtPnRpZl9iYXNlICsgbWEsCisJCQkgICAgc2l6ZSk7CisJfQorCXJldHVybiAoc2l6ZSk7Cit9CisKKy8qCisgKiBSZWFkIGEgc3RyaXAgb2YgZGF0YSBmcm9tIHRoZSBmaWxlLgorICovCit0bXNpemVfdAorVElGRlJlYWRSYXdTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZWFkUmF3U3RyaXAiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgYnl0ZWNvdW50OworCXRtc2l6ZV90IGJ5dGVjb3VudG07CisKKwlpZiAoIVRJRkZDaGVja1JlYWQodGlmLCAwKSkKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJaWYgKHN0cmlwID49IHRkLT50ZF9uc3RyaXBzKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAgIiVsdTogU3RyaXAgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJICAgICAodW5zaWduZWQgbG9uZykgc3RyaXAsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiQ29tcHJlc3Npb24gc2NoZW1lIGRvZXMgbm90IHN1cHBvcnQgYWNjZXNzIHRvIHJhdyB1bmNvbXByZXNzZWQgZGF0YSIpOworCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsKKwlpZiAoYnl0ZWNvdW50IDw9IDApIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiJUk2NHU6IEludmFsaWQgc3RyaXAgYnl0ZSBjb3VudCwgc3RyaXAgJWx1IiwKKwkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIGJ5dGVjb3VudCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyNlbHNlCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICIlbGx1OiBJbnZhbGlkIHN0cmlwIGJ5dGUgY291bnQsIHN0cmlwICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJ5dGVjb3VudCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyNlbmRpZgorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJYnl0ZWNvdW50bSA9ICh0bXNpemVfdClieXRlY291bnQ7CisJaWYgKCh1aW50NjQpYnl0ZWNvdW50bSE9Ynl0ZWNvdW50KSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCX0KKwlpZiAoc2l6ZSAhPSAodG1zaXplX3QpKC0xKSAmJiBzaXplIDwgYnl0ZWNvdW50bSkKKwkJYnl0ZWNvdW50bSA9IHNpemU7CisJcmV0dXJuIChUSUZGUmVhZFJhd1N0cmlwMSh0aWYsIHN0cmlwLCBidWYsIGJ5dGVjb3VudG0sIG1vZHVsZSkpOworfQorCisvKgorICogUmVhZCB0aGUgc3BlY2lmaWVkIHN0cmlwIGFuZCBzZXR1cCBmb3IgZGVjb2RpbmcuIFRoZSBkYXRhIGJ1ZmZlciBpcworICogZXhwYW5kZWQsIGFzIG5lY2Vzc2FyeSwgdG8gaG9sZCB0aGUgc3RyaXAncyBkYXRhLgorICovCitpbnQKK1RJRkZGaWxsU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZpbGxTdHJpcCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisJaWYgKCh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVyk9PTApCisJeworCQl1aW50NjQgYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsKKwkJaWYgKGJ5dGVjb3VudCA8PSAwKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIkludmFsaWQgc3RyaXAgYnl0ZSBjb3VudCAlSTY0dSwgc3RyaXAgJWx1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBieXRlY291bnQsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgc3RyaXApOworI2Vsc2UKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIkludmFsaWQgc3RyaXAgYnl0ZSBjb3VudCAlbGx1LCBzdHJpcCAlbHUiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYnl0ZWNvdW50LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyNlbmRpZgorCQkJcmV0dXJuICgwKTsKKwkJfQorCQlpZiAoaXNNYXBwZWQodGlmKSAmJgorCQkgICAgKGlzRmlsbE9yZGVyKHRpZiwgdGQtPnRkX2ZpbGxvcmRlcikKKwkJICAgIHx8ICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpKSkgeworCQkJLyoKKwkJCSAqIFRoZSBpbWFnZSBpcyBtYXBwZWQgaW50byBtZW1vcnkgYW5kIHdlIGVpdGhlciBkb24ndAorCQkJICogbmVlZCB0byBmbGlwIGJpdHMgb3IgdGhlIGNvbXByZXNzaW9uIHJvdXRpbmUgaXMKKwkJCSAqIGdvaW5nIHRvIGhhbmRsZSB0aGlzIG9wZXJhdGlvbiBpdHNlbGYuICBJbiB0aGlzCisJCQkgKiBjYXNlLCBhdm9pZCBjb3B5aW5nIHRoZSByYXcgZGF0YSBhbmQgaW5zdGVhZCBqdXN0CisJCQkgKiByZWZlcmVuY2UgdGhlIGRhdGEgZnJvbSB0aGUgbWVtb3J5IG1hcHBlZCBmaWxlCisJCQkgKiBpbWFnZS4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBkZWNvbXByZXNzaW9uCisJCQkgKiByb3V0aW5lcyBkbyBub3QgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgcmF3IGRhdGEKKwkJCSAqIGJ1ZmZlciAoaWYgdGhleSB0cnkgdG8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGdldCBhCisJCQkgKiBmYXVsdCBzaW5jZSB0aGUgZmlsZSBpcyBtYXBwZWQgcmVhZC1vbmx5KS4KKwkJCSAqLworCQkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpICYmIHRpZi0+dGlmX3Jhd2RhdGEpIHsKKwkJCQlfVElGRmZyZWUodGlmLT50aWZfcmF3ZGF0YSk7CisJCQkJdGlmLT50aWZfcmF3ZGF0YSA9IE5VTEw7CisJCQkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAwOworCQkJfQorCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfTVlCVUZGRVI7CisJCQkvKgorCQkJICogV2UgbXVzdCBjaGVjayBmb3Igb3ZlcmZsb3csIHBvdGVudGlhbGx5IGNhdXNpbmcKKwkJCSAqIGFuIE9PQiByZWFkLiBJbnN0ZWFkIG9mIHNpbXBsZQorCQkJICoKKwkJCSAqICB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdK2J5dGVjb3VudCA+IHRpZi0+dGlmX3NpemUKKwkJCSAqCisJCQkgKiBjb21wYXJpc29uICh3aGljaCBjYW4gb3ZlcmZsb3cpIHdlIGRvIHRoZSBmb2xsb3dpbmcKKwkJCSAqIHR3byBjb21wYXJpc29uczoKKwkJCSAqLworCQkJaWYgKGJ5dGVjb3VudCA+ICh1aW50NjQpdGlmLT50aWZfc2l6ZSB8fAorCQkJICAgIHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0gPiAodWludDY0KXRpZi0+dGlmX3NpemUgLSBieXRlY291bnQpIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgZXJyb3IgbWVzc2FnZSBtaWdodCBzZWVtIHN0cmFuZ2UsIGJ1dAorCQkJCSAqIGl0J3Mgd2hhdCB3b3VsZCBoYXBwZW4gaWYgYSByZWFkIHdlcmUgZG9uZQorCQkJCSAqIGluc3RlYWQuCisJCQkJICovCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCisJCQkJCSJSZWFkIGVycm9yIG9uIHN0cmlwICVsdTsgIgorCQkJCQkiZ290ICVJNjR1IGJ5dGVzLCBleHBlY3RlZCAlSTY0dSIsCisJCQkJCSh1bnNpZ25lZCBsb25nKSBzdHJpcCwKKwkJCQkJKHVuc2lnbmVkIF9faW50NjQpIHRpZi0+dGlmX3NpemUgLSB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdLAorCQkJCQkodW5zaWduZWQgX19pbnQ2NCkgYnl0ZWNvdW50KTsKKyNlbHNlCisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKworCQkJCQkiUmVhZCBlcnJvciBvbiBzdHJpcCAlbHU7ICIKKwkJCQkJImdvdCAlbGx1IGJ5dGVzLCBleHBlY3RlZCAlbGx1IiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIHN0cmlwLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSB0aWYtPnRpZl9zaXplIC0gdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgYnl0ZWNvdW50KTsKKyNlbmRpZgorCQkJCXRpZi0+dGlmX2N1cnN0cmlwID0gTk9TVFJJUDsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAodG1zaXplX3QpYnl0ZWNvdW50OworCQkJdGlmLT50aWZfcmF3ZGF0YSA9IHRpZi0+dGlmX2Jhc2UgKyAodG1zaXplX3QpdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9ICh0bXNpemVfdCkgYnl0ZWNvdW50OworCisJCQkvKiAKKwkJCSAqIFdoZW4gd2UgaGF2ZSB0aWZfcmF3ZGF0YSByZWZlcmVuY2UgZGlyZWN0bHkgaW50byB0aGUgbWVtb3J5IG1hcHBlZCBmaWxlCisJCQkgKiB3ZSBuZWVkIHRvIGJlIHByZXR0eSBjYXJlZnVsIGFib3V0IGhvdyB3ZSB1c2UgdGhlIHJhd2RhdGEuICBJdCBpcyBub3QKKwkJCSAqIGEgZ2VuZXJhbCBwdXJwb3NlIHdvcmtpbmcgYnVmZmVyIGFzIGl0IG5vcm1hbGx5IG90aGVyd2lzZSBpcy4gIFNvIHdlCisJCQkgKiBrZWVwIHRyYWNrIG9mIHRoaXMgZmFjdCB0byBhdm9pZCB1c2luZyBpdCBpbXByb3Blcmx5LgorCQkJICovCisJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0JVRkZFUk1NQVA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRXhwYW5kIHJhdyBkYXRhIGJ1ZmZlciwgaWYgbmVlZGVkLCB0byBob2xkIGRhdGEKKwkJCSAqIHN0cmlwIGNvbWluZyBmcm9tIGZpbGUgKHBlcmhhcHMgc2hvdWxkIHNldCB1cHBlcgorCQkJICogYm91bmQgb24gdGhlIHNpemUgb2YgYSBidWZmZXIgd2UnbGwgdXNlPykuCisJCQkgKi8KKwkJCXRtc2l6ZV90IGJ5dGVjb3VudG07CisJCQlieXRlY291bnRtPSh0bXNpemVfdClieXRlY291bnQ7CisJCQlpZiAoKHVpbnQ2NClieXRlY291bnRtIT1ieXRlY291bnQpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJaWYgKGJ5dGVjb3VudG0gPiB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkgeworCQkJCXRpZi0+dGlmX2N1cnN0cmlwID0gTk9TVFJJUDsKKwkJCQlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikgPT0gMCkgeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgIkRhdGEgYnVmZmVyIHRvbyBzbWFsbCB0byBob2xkIHN0cmlwICVsdSIsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZykgc3RyaXApOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlpZiAoIVRJRkZSZWFkQnVmZmVyU2V0dXAodGlmLCAwLCBieXRlY291bnRtKSkKKwkJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX0JVRkZFUk1NQVApIHsKKwkJCQl0aWYtPnRpZl9jdXJzdHJpcCA9IE5PU1RSSVA7CisJCQkJaWYgKCFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCisJCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAoVElGRlJlYWRSYXdTdHJpcDEodGlmLCBzdHJpcCwgdGlmLT50aWZfcmF3ZGF0YSwKKwkJCQlieXRlY291bnRtLCBtb2R1bGUpICE9IGJ5dGVjb3VudG0pCisJCQkJcmV0dXJuICgwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID0gYnl0ZWNvdW50bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisJCQkgICAgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9OT0JJVFJFVikgPT0gMCkKKwkJCQlUSUZGUmV2ZXJzZUJpdHModGlmLT50aWZfcmF3ZGF0YSwgYnl0ZWNvdW50bSk7CisgICAgICAgICAgICAgICAgfQorCX0KKwlyZXR1cm4gKFRJRkZTdGFydFN0cmlwKHRpZiwgc3RyaXApKTsKK30KKworLyoKKyAqIFRpbGUtb3JpZW50ZWQgUmVhZCBTdXBwb3J0CisgKiBDb250cmlidXRlZCBieSBOYW5jeSBDYW0gKFNpbGljb24gR3JhcGhpY3MpLgorICovCisKKy8qCisgKiBSZWFkIGFuZCBkZWNvbXByZXNzIGEgdGlsZSBvZiBkYXRhLiAgVGhlCisgKiB0aWxlIGlzIHNlbGVjdGVkIGJ5IHRoZSAoeCx5LHoscykgY29vcmRpbmF0ZXMuCisgKi8KK3Rtc2l6ZV90CitUSUZGUmVhZFRpbGUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiB4LCB1aW50MzIgeSwgdWludDMyIHosIHVpbnQxNiBzKQoreworCWlmICghVElGRkNoZWNrUmVhZCh0aWYsIDEpIHx8ICFUSUZGQ2hlY2tUaWxlKHRpZiwgeCwgeSwgeiwgcykpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCXJldHVybiAoVElGRlJlYWRFbmNvZGVkVGlsZSh0aWYsCisJICAgIFRJRkZDb21wdXRlVGlsZSh0aWYsIHgsIHksIHosIHMpLCBidWYsICh0bXNpemVfdCkoLTEpKSk7Cit9CisKKy8qCisgKiBSZWFkIGEgdGlsZSBvZiBkYXRhIGFuZCBkZWNvbXByZXNzIHRoZSBzcGVjaWZpZWQKKyAqIGFtb3VudCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlci4KKyAqLwordG1zaXplX3QKK1RJRkZSZWFkRW5jb2RlZFRpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZWFkRW5jb2RlZFRpbGUiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl0bXNpemVfdCB0aWxlc2l6ZSA9IHRpZi0+dGlmX3RpbGVzaXplOworCisJaWYgKCFUSUZGQ2hlY2tSZWFkKHRpZiwgMSkpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCWlmICh0aWxlID49IHRkLT50ZF9uc3RyaXBzKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiJWx1OiBUaWxlIG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCWlmIChzaXplID09ICh0bXNpemVfdCkoLTEpKQorCQlzaXplID0gdGlsZXNpemU7CisJZWxzZSBpZiAoc2l6ZSA+IHRpbGVzaXplKQorCQlzaXplID0gdGlsZXNpemU7CisJaWYgKFRJRkZGaWxsVGlsZSh0aWYsIHRpbGUpICYmICgqdGlmLT50aWZfZGVjb2RldGlsZSkodGlmLAorCSAgICAodWludDgqKSBidWYsIHNpemUsICh1aW50MTYpKHRpbGUvdGQtPnRkX3N0cmlwc3BlcmltYWdlKSkpIHsKKwkJKCp0aWYtPnRpZl9wb3N0ZGVjb2RlKSh0aWYsICh1aW50OCopIGJ1Ziwgc2l6ZSk7CisJCXJldHVybiAoc2l6ZSk7CisJfSBlbHNlCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworfQorCitzdGF0aWMgdG1zaXplX3QKK1RJRkZSZWFkUmF3VGlsZTEoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSkKKyAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisKKwlhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKT09MCk7CisJaWYgKCFpc01hcHBlZCh0aWYpKSB7CisJCXRtc2l6ZV90IGNjOworCisJCWlmICghU2Vla09LKHRpZiwgdGQtPnRkX3N0cmlwb2Zmc2V0W3RpbGVdKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiU2VlayBlcnJvciBhdCByb3cgJWx1LCBjb2wgJWx1LCB0aWxlICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfY29sLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSB0aWxlKTsKKwkJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCQl9CisJCWNjID0gVElGRlJlYWRGaWxlKHRpZiwgYnVmLCBzaXplKTsKKwkJaWYgKGNjICE9IHNpemUpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkiUmVhZCBlcnJvciBhdCByb3cgJWx1LCBjb2wgJWx1OyBnb3QgJUk2NHUgYnl0ZXMsIGV4cGVjdGVkICVJNjR1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfY29sLAorCQkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIGNjLAorCQkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIHNpemUpOworI2Vsc2UKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJIlJlYWQgZXJyb3IgYXQgcm93ICVsdSwgY29sICVsdTsgZ290ICVsbHUgYnl0ZXMsIGV4cGVjdGVkICVsbHUiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9jb2wsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBjYywKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworI2VuZGlmCisJCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtc2l6ZV90IG1hLG1iOworCQl0bXNpemVfdCBuOworCQltYT0odG1zaXplX3QpdGQtPnRkX3N0cmlwb2Zmc2V0W3RpbGVdOworCQltYj1tYStzaXplOworCQlpZiAoKCh1aW50NjQpbWEhPXRkLT50ZF9zdHJpcG9mZnNldFt0aWxlXSl8fChtYT50aWYtPnRpZl9zaXplKSkKKwkJCW49MDsKKwkJZWxzZSBpZiAoKG1iPG1hKXx8KG1iPHNpemUpfHwobWI+dGlmLT50aWZfc2l6ZSkpCisJCQluPXRpZi0+dGlmX3NpemUtbWE7CisJCWVsc2UKKwkJCW49c2l6ZTsKKwkJaWYgKG4hPXNpemUpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyJSZWFkIGVycm9yIGF0IHJvdyAlbHUsIGNvbCAlbHUsIHRpbGUgJWx1OyBnb3QgJUk2NHUgYnl0ZXMsIGV4cGVjdGVkICVJNjR1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfY29sLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGUsCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgbiwKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBzaXplKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorIlJlYWQgZXJyb3IgYXQgcm93ICVsdSwgY29sICVsdSwgdGlsZSAlbHU7IGdvdCAlbGx1IGJ5dGVzLCBleHBlY3RlZCAlbGx1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfY29sLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGUsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBuLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2l6ZSk7CisjZW5kaWYKKwkJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCQl9CisJCV9USUZGbWVtY3B5KGJ1ZiwgdGlmLT50aWZfYmFzZSArIG1hLCBzaXplKTsKKwl9CisJcmV0dXJuIChzaXplKTsKK30KKworLyoKKyAqIFJlYWQgYSB0aWxlIG9mIGRhdGEgZnJvbSB0aGUgZmlsZS4KKyAqLwordG1zaXplX3QKK1RJRkZSZWFkUmF3VGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRSYXdUaWxlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDY0IGJ5dGVjb3VudDY0OworCXRtc2l6ZV90IGJ5dGVjb3VudG07CisKKwlpZiAoIVRJRkZDaGVja1JlYWQodGlmLCAxKSkKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJaWYgKHRpbGUgPj0gdGQtPnRkX25zdHJpcHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICIlbHU6IFRpbGUgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWxlLCAodW5zaWduZWQgbG9uZykgdGQtPnRkX25zdHJpcHMpOworCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJIkNvbXByZXNzaW9uIHNjaGVtZSBkb2VzIG5vdCBzdXBwb3J0IGFjY2VzcyB0byByYXcgdW5jb21wcmVzc2VkIGRhdGEiKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCWJ5dGVjb3VudDY0ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3RpbGVdOworCWlmIChzaXplICE9ICh0bXNpemVfdCkoLTEpICYmICh1aW50NjQpc2l6ZSA8IGJ5dGVjb3VudDY0KQorCQlieXRlY291bnQ2NCA9ICh1aW50NjQpc2l6ZTsKKwlieXRlY291bnRtID0gKHRtc2l6ZV90KWJ5dGVjb3VudDY0OworCWlmICgodWludDY0KWJ5dGVjb3VudG0hPWJ5dGVjb3VudDY0KQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCX0KKwlyZXR1cm4gKFRJRkZSZWFkUmF3VGlsZTEodGlmLCB0aWxlLCBidWYsIGJ5dGVjb3VudG0sIG1vZHVsZSkpOworfQorCisvKgorICogUmVhZCB0aGUgc3BlY2lmaWVkIHRpbGUgYW5kIHNldHVwIGZvciBkZWNvZGluZy4gVGhlIGRhdGEgYnVmZmVyIGlzCisgKiBleHBhbmRlZCwgYXMgbmVjZXNzYXJ5LCB0byBob2xkIHRoZSB0aWxlJ3MgZGF0YS4KKyAqLworaW50CitUSUZGRmlsbFRpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGRmlsbFRpbGUiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworICAgIGlmICghX1RJRkZGaWxsU3RyaWxlcyggdGlmICkgfHwgIXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIAorCWlmICgodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpPT0wKQorCXsKKwkJdWludDY0IGJ5dGVjb3VudCA9IHRkLT50ZF9zdHJpcGJ5dGVjb3VudFt0aWxlXTsKKwkJaWYgKGJ5dGVjb3VudCA8PSAwKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIiVJNjR1OiBJbnZhbGlkIHRpbGUgYnl0ZSBjb3VudCwgdGlsZSAlbHUiLAorCQkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIGJ5dGVjb3VudCwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSIlbGx1OiBJbnZhbGlkIHRpbGUgYnl0ZSBjb3VudCwgdGlsZSAlbHUiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYnl0ZWNvdW50LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGUpOworI2VuZGlmCisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmIChpc01hcHBlZCh0aWYpICYmCisJCSAgICAoaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKQorCQkgICAgIHx8ICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpKSkgeworCQkJLyoKKwkJCSAqIFRoZSBpbWFnZSBpcyBtYXBwZWQgaW50byBtZW1vcnkgYW5kIHdlIGVpdGhlciBkb24ndAorCQkJICogbmVlZCB0byBmbGlwIGJpdHMgb3IgdGhlIGNvbXByZXNzaW9uIHJvdXRpbmUgaXMKKwkJCSAqIGdvaW5nIHRvIGhhbmRsZSB0aGlzIG9wZXJhdGlvbiBpdHNlbGYuICBJbiB0aGlzCisJCQkgKiBjYXNlLCBhdm9pZCBjb3B5aW5nIHRoZSByYXcgZGF0YSBhbmQgaW5zdGVhZCBqdXN0CisJCQkgKiByZWZlcmVuY2UgdGhlIGRhdGEgZnJvbSB0aGUgbWVtb3J5IG1hcHBlZCBmaWxlCisJCQkgKiBpbWFnZS4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBkZWNvbXByZXNzaW9uCisJCQkgKiByb3V0aW5lcyBkbyBub3QgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgcmF3IGRhdGEKKwkJCSAqIGJ1ZmZlciAoaWYgdGhleSB0cnkgdG8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGdldCBhCisJCQkgKiBmYXVsdCBzaW5jZSB0aGUgZmlsZSBpcyBtYXBwZWQgcmVhZC1vbmx5KS4KKwkJCSAqLworCQkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpICYmIHRpZi0+dGlmX3Jhd2RhdGEpIHsKKwkJCQlfVElGRmZyZWUodGlmLT50aWZfcmF3ZGF0YSk7CisJCQkJdGlmLT50aWZfcmF3ZGF0YSA9IE5VTEw7CisJCQkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAwOworCQkJfQorCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfTVlCVUZGRVI7CisJCQkvKgorCQkJICogV2UgbXVzdCBjaGVjayBmb3Igb3ZlcmZsb3csIHBvdGVudGlhbGx5IGNhdXNpbmcKKwkJCSAqIGFuIE9PQiByZWFkLiBJbnN0ZWFkIG9mIHNpbXBsZQorCQkJICoKKwkJCSAqICB0ZC0+dGRfc3RyaXBvZmZzZXRbdGlsZV0rYnl0ZWNvdW50ID4gdGlmLT50aWZfc2l6ZQorCQkJICoKKwkJCSAqIGNvbXBhcmlzb24gKHdoaWNoIGNhbiBvdmVyZmxvdykgd2UgZG8gdGhlIGZvbGxvd2luZworCQkJICogdHdvIGNvbXBhcmlzb25zOgorCQkJICovCisJCQlpZiAoYnl0ZWNvdW50ID4gKHVpbnQ2NCl0aWYtPnRpZl9zaXplIHx8CisJCQkgICAgdGQtPnRkX3N0cmlwb2Zmc2V0W3RpbGVdID4gKHVpbnQ2NCl0aWYtPnRpZl9zaXplIC0gYnl0ZWNvdW50KSB7CisJCQkJdGlmLT50aWZfY3VydGlsZSA9IE5PVElMRTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAodG1zaXplX3QpYnl0ZWNvdW50OworCQkJdGlmLT50aWZfcmF3ZGF0YSA9CisJCQkJdGlmLT50aWZfYmFzZSArICh0bXNpemVfdCl0ZC0+dGRfc3RyaXBvZmZzZXRbdGlsZV07CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhb2ZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgPSAodG1zaXplX3QpIGJ5dGVjb3VudDsKKwkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQlVGRkVSTU1BUDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBFeHBhbmQgcmF3IGRhdGEgYnVmZmVyLCBpZiBuZWVkZWQsIHRvIGhvbGQgZGF0YQorCQkJICogdGlsZSBjb21pbmcgZnJvbSBmaWxlIChwZXJoYXBzIHNob3VsZCBzZXQgdXBwZXIKKwkJCSAqIGJvdW5kIG9uIHRoZSBzaXplIG9mIGEgYnVmZmVyIHdlJ2xsIHVzZT8pLgorCQkJICovCisJCQl0bXNpemVfdCBieXRlY291bnRtOworCQkJYnl0ZWNvdW50bT0odG1zaXplX3QpYnl0ZWNvdW50OworCQkJaWYgKCh1aW50NjQpYnl0ZWNvdW50bSE9Ynl0ZWNvdW50KQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW50ZWdlciBvdmVyZmxvdyIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCWlmIChieXRlY291bnRtID4gdGlmLT50aWZfcmF3ZGF0YXNpemUpIHsKKwkJCQl0aWYtPnRpZl9jdXJ0aWxlID0gTk9USUxFOworCQkJCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX01ZQlVGRkVSKSA9PSAwKSB7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAiRGF0YSBidWZmZXIgdG9vIHNtYWxsIHRvIGhvbGQgdGlsZSAlbHUiLAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGUpOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlpZiAoIVRJRkZSZWFkQnVmZmVyU2V0dXAodGlmLCAwLCBieXRlY291bnRtKSkKKwkJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX0JVRkZFUk1NQVApIHsKKwkJCQl0aWYtPnRpZl9jdXJ0aWxlID0gTk9USUxFOworCQkJCWlmICghVElGRlJlYWRCdWZmZXJTZXR1cCh0aWYsIDAsIGJ5dGVjb3VudG0pKQorCQkJCQlyZXR1cm4gKDApOworCQkJfQorCisJCQlpZiAoVElGRlJlYWRSYXdUaWxlMSh0aWYsIHRpbGUsIHRpZi0+dGlmX3Jhd2RhdGEsCisJCQkgICAgYnl0ZWNvdW50bSwgbW9kdWxlKSAhPSBieXRlY291bnRtKQorCQkJCXJldHVybiAoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IGJ5dGVjb3VudG07CisgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWlmICghaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKSAmJgorCQkJICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApCisJCQkJVElGRlJldmVyc2VCaXRzKHRpZi0+dGlmX3Jhd2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkKTsKKwkJfQorCX0KKwlyZXR1cm4gKFRJRkZTdGFydFRpbGUodGlmLCB0aWxlKSk7Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgcmF3IGRhdGEgYnVmZmVyIGluIHByZXBhcmF0aW9uIGZvcgorICogcmVhZGluZyBhIHN0cmlwIG9mIHJhdyBkYXRhLiAgSWYgdGhlIGJ1ZmZlcgorICogaXMgc3BlY2lmaWVkIGFzIHplcm8sIHRoZW4gYSBidWZmZXIgb2YgYXBwcm9wcmlhdGUKKyAqIHNpemUgaXMgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5LiAgT3RoZXJ3aXNlLAorICogdGhlIGNsaWVudCBtdXN0IGd1YXJhbnRlZSB0aGF0IHRoZSBidWZmZXIgaXMKKyAqIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbmRpdmlkdWFsIHN0cmlwIG9mCisgKiByYXcgZGF0YS4KKyAqLworaW50CitUSUZGUmVhZEJ1ZmZlclNldHVwKFRJRkYqIHRpZiwgdm9pZCogYnAsIHRtc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRCdWZmZXJTZXR1cCI7CisKKwlhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKT09MCk7CisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfQlVGRkVSTU1BUDsKKworCWlmICh0aWYtPnRpZl9yYXdkYXRhKSB7CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpCisJCQlfVElGRmZyZWUodGlmLT50aWZfcmF3ZGF0YSk7CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IDA7CisJfQorCWlmIChicCkgeworCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IHNpemU7CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSAodWludDgqKSBicDsKKwkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfTVlCVUZGRVI7CisJfSBlbHNlIHsKKwkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAodG1zaXplX3QpVElGRnJvdW5kdXBfNjQoKHVpbnQ2NClzaXplLCAxMDI0KTsKKwkJaWYgKHRpZi0+dGlmX3Jhd2RhdGFzaXplPT0wKQorCQkJdGlmLT50aWZfcmF3ZGF0YXNpemU9KHRtc2l6ZV90KSgtMSk7CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyh0aWYtPnRpZl9yYXdkYXRhc2l6ZSk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTVlCVUZGRVI7CisJfQorCWlmICh0aWYtPnRpZl9yYXdkYXRhID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJObyBzcGFjZSBmb3IgZGF0YSBidWZmZXIgYXQgc2NhbmxpbmUgJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3cpOworCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IDA7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXQgc3RhdGUgdG8gYXBwZWFyIGFzIGlmIGEKKyAqIHN0cmlwIGhhcyBqdXN0IGJlZW4gcmVhZCBpbi4KKyAqLworc3RhdGljIGludAorVElGRlN0YXJ0U3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICByZXR1cm4gMDsKKworCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0NPREVSU0VUVVApID09IDApIHsKKwkJaWYgKCEoKnRpZi0+dGlmX3NldHVwZGVjb2RlKSh0aWYpKQorCQkJcmV0dXJuICgwKTsKKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9DT0RFUlNFVFVQOworCX0KKwl0aWYtPnRpZl9jdXJzdHJpcCA9IHN0cmlwOworCXRpZi0+dGlmX3JvdyA9IChzdHJpcCAlIHRkLT50ZF9zdHJpcHNwZXJpbWFnZSkgKiB0ZC0+dGRfcm93c3BlcnN0cmlwOworICAgICAgICB0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUY0V1JJVEU7CisKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpCisJeworCQl0aWYtPnRpZl9yYXdjcCA9IE5VTEw7CisJCXRpZi0+dGlmX3Jhd2NjID0gMDsgIAorCX0KKwllbHNlCisJeworCQl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF07CisJfQorCXJldHVybiAoKCp0aWYtPnRpZl9wcmVkZWNvZGUpKHRpZiwKKwkJCSh1aW50MTYpKHN0cmlwIC8gdGQtPnRkX3N0cmlwc3BlcmltYWdlKSkpOworfQorCisvKgorICogU2V0IHN0YXRlIHRvIGFwcGVhciBhcyBpZiBhCisgKiB0aWxlIGhhcyBqdXN0IGJlZW4gcmVhZCBpbi4KKyAqLworc3RhdGljIGludAorVElGRlN0YXJ0VGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworICAgIGlmICghX1RJRkZGaWxsU3RyaWxlcyggdGlmICkgfHwgIXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKwlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9DT0RFUlNFVFVQKSA9PSAwKSB7CisJCWlmICghKCp0aWYtPnRpZl9zZXR1cGRlY29kZSkodGlmKSkKKwkJCXJldHVybiAoMCk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQ09ERVJTRVRVUDsKKwl9CisJdGlmLT50aWZfY3VydGlsZSA9IHRpbGU7CisJdGlmLT50aWZfcm93ID0KKwkgICAgKHRpbGUgJSBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2V3aWR0aCwgdGQtPnRkX3RpbGV3aWR0aCkpICoKKwkJdGQtPnRkX3RpbGVsZW5ndGg7CisJdGlmLT50aWZfY29sID0KKwkgICAgKHRpbGUgJSBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2VsZW5ndGgsIHRkLT50ZF90aWxlbGVuZ3RoKSkgKgorCQl0ZC0+dGRfdGlsZXdpZHRoOworICAgICAgICB0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUY0V1JJVEU7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKQorCXsKKwkJdGlmLT50aWZfcmF3Y3AgPSBOVUxMOworCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisJfQorCWVsc2UKKwl7CisJCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKwkJdGlmLT50aWZfcmF3Y2MgPSAodG1zaXplX3QpdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3RpbGVdOworCX0KKwlyZXR1cm4gKCgqdGlmLT50aWZfcHJlZGVjb2RlKSh0aWYsCisJCQkodWludDE2KSh0aWxlL3RkLT50ZF9zdHJpcHNwZXJpbWFnZSkpKTsKK30KKworc3RhdGljIGludAorVElGRkNoZWNrUmVhZChUSUZGKiB0aWYsIGludCB0aWxlcykKK3sKKwlpZiAodGlmLT50aWZfbW9kZSA9PSBPX1dST05MWSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwgIkZpbGUgbm90IG9wZW4gZm9yIHJlYWRpbmciKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHRpbGVzIF4gaXNUaWxlZCh0aWYpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLCB0aWxlcyA/CisJCSAgICAiQ2FuIG5vdCByZWFkIHRpbGVzIGZyb20gYSBzdHJpcHBlZCBpbWFnZSIgOgorCQkgICAgIkNhbiBub3QgcmVhZCBzY2FubGluZXMgZnJvbSBhIHRpbGVkIGltYWdlIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK19USUZGTm9Qb3N0RGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpCit7CisgICAgKHZvaWQpIHRpZjsgKHZvaWQpIGJ1ZjsgKHZvaWQpIGNjOworfQorCit2b2lkCitfVElGRlN3YWIxNkJpdERhdGEoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYykKK3sKKyAgICAodm9pZCkgdGlmOworICAgIGFzc2VydCgoY2MgJiAxKSA9PSAwKTsKKyAgICBUSUZGU3dhYkFycmF5T2ZTaG9ydCgodWludDE2KikgYnVmLCBjYy8yKTsKK30KKwordm9pZAorX1RJRkZTd2FiMjRCaXREYXRhKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpCit7CisgICAgKHZvaWQpIHRpZjsKKyAgICBhc3NlcnQoKGNjICUgMykgPT0gMCk7CisgICAgVElGRlN3YWJBcnJheU9mVHJpcGxlcygodWludDgqKSBidWYsIGNjLzMpOworfQorCit2b2lkCitfVElGRlN3YWIzMkJpdERhdGEoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYykKK3sKKyAgICAodm9pZCkgdGlmOworICAgIGFzc2VydCgoY2MgJiAzKSA9PSAwKTsKKyAgICBUSUZGU3dhYkFycmF5T2ZMb25nKCh1aW50MzIqKSBidWYsIGNjLzQpOworfQorCit2b2lkCitfVElGRlN3YWI2NEJpdERhdGEoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYykKK3sKKyAgICAodm9pZCkgdGlmOworICAgIGFzc2VydCgoY2MgJiA3KSA9PSAwKTsKKyAgICBUSUZGU3dhYkFycmF5T2ZEb3VibGUoKGRvdWJsZSopIGJ1ZiwgY2MvOCk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3N0cmlwLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9zdHJpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0N2M1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl9zdHJpcC5jCkBAIC0wLDAgKzEsMzg2IEBACisvKiAkSWQ6IHRpZl9zdHJpcC5jLHYgMS4zNSAyMDEyLTA2LTA2IDA1OjMzOjU1IGZ3YXJtZXJkYW0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogU3RyaXAtb3JnYW5pemVkIEltYWdlIFN1cHBvcnQgUm91dGluZXMuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIENvbXB1dGUgd2hpY2ggc3RyaXAgYSAocm93LHNhbXBsZSkgdmFsdWUgaXMgaW4uCisgKi8KK3VpbnQzMgorVElGRkNvbXB1dGVTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkNvbXB1dGVTdHJpcCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQzMiBzdHJpcDsKKworCXN0cmlwID0gcm93IC8gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJaWYgKHNhbXBsZSA+PSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICIlbHU6IFNhbXBsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBzYW1wbGUsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJc3RyaXAgKz0gKHVpbnQzMilzYW1wbGUqdGQtPnRkX3N0cmlwc3BlcmltYWdlOworCX0KKwlyZXR1cm4gKHN0cmlwKTsKK30KKworLyoKKyAqIENvbXB1dGUgaG93IG1hbnkgc3RyaXBzIGFyZSBpbiBhbiBpbWFnZS4KKyAqLwordWludDMyCitUSUZGTnVtYmVyT2ZTdHJpcHMoVElGRiogdGlmKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50MzIgbnN0cmlwczsKKworCW5zdHJpcHMgPSAodGQtPnRkX3Jvd3NwZXJzdHJpcCA9PSAodWludDMyKSAtMSA/IDEgOgorCSAgICAgVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlbGVuZ3RoLCB0ZC0+dGRfcm93c3BlcnN0cmlwKSk7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorCQluc3RyaXBzID0gX1RJRkZNdWx0aXBseTMyKHRpZiwgbnN0cmlwcywgKHVpbnQzMil0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAorCQkgICAgIlRJRkZOdW1iZXJPZlN0cmlwcyIpOworCXJldHVybiAobnN0cmlwcyk7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSAjIGJ5dGVzIGluIGEgdmFyaWFibGUgaGVpZ2h0LCByb3ctYWxpZ25lZCBzdHJpcC4KKyAqLwordWludDY0CitUSUZGVlN0cmlwU2l6ZTY0KFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZWU3RyaXBTaXplNjQiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlpZiAobnJvd3M9PSh1aW50MzIpKC0xKSkKKwkJbnJvd3M9dGQtPnRkX2ltYWdlbGVuZ3RoOworCWlmICgodGQtPnRkX3BsYW5hcmNvbmZpZz09UExBTkFSQ09ORklHX0NPTlRJRykmJgorCSAgICAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSKSYmCisJICAgICghaXNVcFNhbXBsZWQodGlmKSkpCisJeworCQkvKgorCQkgKiBQYWNrZWQgWUNiQ3IgZGF0YSBjb250YWluIG9uZSBDYitDciBmb3IgZXZlcnkKKwkJICogSG9yaXpvbnRhbFNhbXBsaW5nKlZlcnRpY2FsU2FtcGxpbmcgWSB2YWx1ZXMuCisJCSAqIE11c3QgYWxzbyByb3VuZHVwIHdpZHRoIGFuZCBoZWlnaHQgd2hlbiBjYWxjdWxhdGluZworCQkgKiBzaW5jZSBpbWFnZXMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisJCSAqIGhvcml6b250YWwvdmVydGljYWwgc3Vic2FtcGxpbmcgYXJlYSBpbmNsdWRlCisJCSAqIFlDYkNyIGRhdGEgZm9yIHRoZSBleHRlbmRlZCBpbWFnZS4KKwkJICovCisJCXVpbnQxNiB5Y2JjcnN1YnNhbXBsaW5nWzJdOworCQl1aW50MTYgc2FtcGxpbmdibG9ja19zYW1wbGVzOworCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfaG9yOworCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfdmVyOworCQl1aW50NjQgc2FtcGxpbmdyb3dfc2FtcGxlczsKKwkJdWludDY0IHNhbXBsaW5ncm93X3NpemU7CisJCWlmKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwhPTMpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCSAgICAiSW52YWxpZCB0ZF9zYW1wbGVzcGVycGl4ZWwgdmFsdWUiKTsKKwkJCXJldHVybiAwOworCQl9CisJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLHljYmNyc3Vic2FtcGxpbmcrMCwKKwkJICAgIHljYmNyc3Vic2FtcGxpbmcrMSk7CisJCWlmICgoeWNiY3JzdWJzYW1wbGluZ1swXSAhPSAxICYmIHljYmNyc3Vic2FtcGxpbmdbMF0gIT0gMiAmJiB5Y2JjcnN1YnNhbXBsaW5nWzBdICE9IDQpCisJCSAgICB8fCh5Y2JjcnN1YnNhbXBsaW5nWzFdICE9IDEgJiYgeWNiY3JzdWJzYW1wbGluZ1sxXSAhPSAyICYmIHljYmNyc3Vic2FtcGxpbmdbMV0gIT0gNCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkgICAgICJJbnZhbGlkIFlDYkNyIHN1YnNhbXBsaW5nICglZHglZCkiLCAKKwkJCQkgICAgIHljYmNyc3Vic2FtcGxpbmdbMF0sIAorCQkJCSAgICAgeWNiY3JzdWJzYW1wbGluZ1sxXSApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2FtcGxpbmdibG9ja19zYW1wbGVzPXljYmNyc3Vic2FtcGxpbmdbMF0qeWNiY3JzdWJzYW1wbGluZ1sxXSsyOworCQlzYW1wbGluZ2Jsb2Nrc19ob3I9VElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdld2lkdGgseWNiY3JzdWJzYW1wbGluZ1swXSk7CisJCXNhbXBsaW5nYmxvY2tzX3Zlcj1USUZGaG93bWFueV8zMihucm93cyx5Y2JjcnN1YnNhbXBsaW5nWzFdKTsKKwkJc2FtcGxpbmdyb3dfc2FtcGxlcz1fVElGRk11bHRpcGx5NjQodGlmLHNhbXBsaW5nYmxvY2tzX2hvcixzYW1wbGluZ2Jsb2NrX3NhbXBsZXMsbW9kdWxlKTsKKwkJc2FtcGxpbmdyb3dfc2l6ZT1USUZGaG93bWFueThfNjQoX1RJRkZNdWx0aXBseTY0KHRpZixzYW1wbGluZ3Jvd19zYW1wbGVzLHRkLT50ZF9iaXRzcGVyc2FtcGxlLG1vZHVsZSkpOworCQlyZXR1cm4oX1RJRkZNdWx0aXBseTY0KHRpZixzYW1wbGluZ3Jvd19zaXplLHNhbXBsaW5nYmxvY2tzX3Zlcixtb2R1bGUpKTsKKwl9CisJZWxzZQorCQlyZXR1cm4oX1RJRkZNdWx0aXBseTY0KHRpZixucm93cyxUSUZGU2NhbmxpbmVTaXplNjQodGlmKSxtb2R1bGUpKTsKK30KK3Rtc2l6ZV90CitUSUZGVlN0cmlwU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiBucm93cykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGVlN0cmlwU2l6ZSI7CisJdWludDY0IG07CisJdG1zaXplX3QgbjsKKwltPVRJRkZWU3RyaXBTaXplNjQodGlmLG5yb3dzKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSAjIGJ5dGVzIGluIGEgcmF3IHN0cmlwLgorICovCit1aW50NjQKK1RJRkZSYXdTdHJpcFNpemU2NChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmF3U3RyaXBTaXplNjQiOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsKKworCWlmIChieXRlY291bnQgPT0gMCkKKwl7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIiVJNjR1OiBJbnZhbGlkIHN0cmlwIGJ5dGUgY291bnQsIHN0cmlwICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBieXRlY291bnQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCk7CisjZWxzZQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiJWxsdTogSW52YWxpZCBzdHJpcCBieXRlIGNvdW50LCBzdHJpcCAlbHUiLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBieXRlY291bnQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCk7CisjZW5kaWYKKwkJYnl0ZWNvdW50ID0gKHVpbnQ2NCkgLTE7CisJfQorCisJcmV0dXJuIGJ5dGVjb3VudDsKK30KK3Rtc2l6ZV90CitUSUZGUmF3U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSYXdTdHJpcFNpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGUmF3U3RyaXBTaXplNjQodGlmLHN0cmlwKTsKKwlpZiAobT09KHVpbnQ2NCkoLTEpKQorCQluPSh0bXNpemVfdCkoLTEpOworCWVsc2UKKwl7CisJCW49KHRtc2l6ZV90KW07CisJCWlmICgodWludDY0KW4hPW0pCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW50ZWdlciBvdmVyZmxvdyIpOworCQkJbj0wOworCQl9CisJfQorCXJldHVybihuKTsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlICMgYnl0ZXMgaW4gYSAocm93LWFsaWduZWQpIHN0cmlwLgorICoKKyAqIE5vdGUgdGhhdCBpZiBSb3dzUGVyU3RyaXAgaXMgbGFyZ2VyIHRoYW4gdGhlCisgKiByZWNvcmRlZCBJbWFnZUxlbmd0aCwgdGhlbiB0aGUgc3RyaXAgc2l6ZSBpcworICogdHJ1bmNhdGVkIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBzcGFjZSByZXF1aXJlZAorICogdG8gaG9sZCB0aGUgc3RyaXAuCisgKi8KK3VpbnQ2NAorVElGRlN0cmlwU2l6ZTY0KFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIHJwcyA9IHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJaWYgKHJwcyA+IHRkLT50ZF9pbWFnZWxlbmd0aCkKKwkJcnBzID0gdGQtPnRkX2ltYWdlbGVuZ3RoOworCXJldHVybiAoVElGRlZTdHJpcFNpemU2NCh0aWYsIHJwcykpOworfQordG1zaXplX3QKK1RJRkZTdHJpcFNpemUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZTdHJpcFNpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGU3RyaXBTaXplNjQodGlmKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBDb21wdXRlIGEgZGVmYXVsdCBzdHJpcCBzaXplIGJhc2VkIG9uIHRoZSBpbWFnZQorICogY2hhcmFjdGVyaXN0aWNzIGFuZCBhIHJlcXVlc3RlZCB2YWx1ZS4gIElmIHRoZQorICogcmVxdWVzdCBpcyA8MSB0aGVuIHdlIGNob29zZSBhIHN0cmlwIHNpemUgYWNjb3JkaW5nCisgKiB0byBjZXJ0YWluIGhldXJpc3RpY3MuCisgKi8KK3VpbnQzMgorVElGRkRlZmF1bHRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgcmVxdWVzdCkKK3sKKwlyZXR1cm4gKCp0aWYtPnRpZl9kZWZzdHJpcHNpemUpKHRpZiwgcmVxdWVzdCk7Cit9CisKK3VpbnQzMgorX1RJRkZEZWZhdWx0U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHMpCit7CisJaWYgKChpbnQzMikgcyA8IDEpIHsKKwkJLyoKKwkJICogSWYgUm93c1BlclN0cmlwIGlzIHVuc3BlY2lmaWVkLCB0cnkgdG8gYnJlYWsgdGhlCisJCSAqIGltYWdlIHVwIGludG8gc3RyaXBzIHRoYXQgYXJlIGFwcHJveGltYXRlbHkKKwkJICogU1RSSVBfU0laRV9ERUZBVUxUIGJ5dGVzIGxvbmcuCisJCSAqLworCQl1aW50NjQgc2NhbmxpbmVzaXplOworCQl1aW50NjQgcm93czsKKwkJc2NhbmxpbmVzaXplPVRJRkZTY2FubGluZVNpemU2NCh0aWYpOworCQlpZiAoc2NhbmxpbmVzaXplPT0wKQorCQkJc2NhbmxpbmVzaXplPTE7CisJCXJvd3M9KHVpbnQ2NClTVFJJUF9TSVpFX0RFRkFVTFQvc2NhbmxpbmVzaXplOworCQlpZiAocm93cz09MCkKKwkJCXJvd3M9MTsKKwkJZWxzZSBpZiAocm93cz4weEZGRkZGRkZGKQorCQkJcm93cz0weEZGRkZGRkZGOworCQlzPSh1aW50MzIpcm93czsKKwl9CisJcmV0dXJuIChzKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQvd3JpdGUgaW4gYSBjYWxsIHRvCisgKiBvbmUgb2YgdGhlIHNjYW5saW5lLW9yaWVudGVkIGkvbyByb3V0aW5lcy4gIE5vdGUgdGhhdAorICogdGhpcyBudW1iZXIgbWF5IGJlIDEvc2FtcGxlcy1wZXItcGl4ZWwgaWYgZGF0YSBpcworICogc3RvcmVkIGFzIHNlcGFyYXRlIHBsYW5lcy4KKyAqIFRoZSBTY2FubGluZVNpemUgaW4gY2FzZSBvZiBZQ2JDclN1YnNhbXBsaW5nIGlzIGRlZmluZWQgYXMgdGhlCisgKiBzdHJpcCBzaXplIGRpdmlkZWQgYnkgdGhlIHN0cmlwIGhlaWdodCwgaS5lLiB0aGUgc2l6ZSBvZiBhIHBhY2sgb2YgdmVydGljYWwKKyAqIHN1YnNhbXBsaW5nIGxpbmVzIGRpdmlkZWQgYnkgdmVydGljYWwgc3Vic2FtcGxpbmcuIEl0IHNob3VsZCB0aHVzIG1ha2UKKyAqIHNlbnNlIHdoZW4gbXVsdGlwbGllZCBieSBhIG11bHRpcGxlIG9mIHZlcnRpY2FsIHN1YnNhbXBsaW5nLgorICovCit1aW50NjQKK1RJRkZTY2FubGluZVNpemU2NChUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlNjYW5saW5lU2l6ZTY0IjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDY0IHNjYW5saW5lX3NpemU7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWc9PVBMQU5BUkNPTkZJR19DT05USUcpCisJeworCQlpZiAoKHRkLT50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfWUNCQ1IpJiYKKwkJICAgICh0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsPT0zKSYmCisJCSAgICAoIWlzVXBTYW1wbGVkKHRpZikpKQorCQl7CisJCQl1aW50MTYgeWNiY3JzdWJzYW1wbGluZ1syXTsKKwkJCXVpbnQxNiBzYW1wbGluZ2Jsb2NrX3NhbXBsZXM7CisJCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfaG9yOworCQkJdWludDY0IHNhbXBsaW5ncm93X3NhbXBsZXM7CisJCQl1aW50NjQgc2FtcGxpbmdyb3dfc2l6ZTsKKwkJCWlmKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwhPTMpCisJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB0ZF9zYW1wbGVzcGVycGl4ZWwgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJCX0KKwkJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljYmNyc3Vic2FtcGxpbmcrMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjcnN1YnNhbXBsaW5nKzEpOworCQkJaWYgKCgoeWNiY3JzdWJzYW1wbGluZ1swXSE9MSkmJih5Y2JjcnN1YnNhbXBsaW5nWzBdIT0yKSYmKHljYmNyc3Vic2FtcGxpbmdbMF0hPTQpKSB8fAorCQkJICAgICgoeWNiY3JzdWJzYW1wbGluZ1sxXSE9MSkmJih5Y2JjcnN1YnNhbXBsaW5nWzFdIT0yKSYmKHljYmNyc3Vic2FtcGxpbmdbMV0hPTQpKSkKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFlDYkNyIHN1YnNhbXBsaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCQl9CisJCQlzYW1wbGluZ2Jsb2NrX3NhbXBsZXMgPSB5Y2JjcnN1YnNhbXBsaW5nWzBdKnljYmNyc3Vic2FtcGxpbmdbMV0rMjsKKwkJCXNhbXBsaW5nYmxvY2tzX2hvciA9IFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZXdpZHRoLHljYmNyc3Vic2FtcGxpbmdbMF0pOworCQkJc2FtcGxpbmdyb3dfc2FtcGxlcyA9IF9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdibG9ja3NfaG9yLHNhbXBsaW5nYmxvY2tfc2FtcGxlcyxtb2R1bGUpOworCQkJc2FtcGxpbmdyb3dfc2l6ZSA9IFRJRkZob3dtYW55XzY0KF9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdyb3dfc2FtcGxlcyx0ZC0+dGRfYml0c3BlcnNhbXBsZSxtb2R1bGUpLDgpOworCQkJc2NhbmxpbmVfc2l6ZSA9IChzYW1wbGluZ3Jvd19zaXplL3ljYmNyc3Vic2FtcGxpbmdbMV0pOworCQl9CisJCWVsc2UKKwkJeworCQkJdWludDY0IHNjYW5saW5lX3NhbXBsZXM7CisJCQlzY2FubGluZV9zYW1wbGVzPV9USUZGTXVsdGlwbHk2NCh0aWYsdGQtPnRkX2ltYWdld2lkdGgsdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCxtb2R1bGUpOworCQkJc2NhbmxpbmVfc2l6ZT1USUZGaG93bWFueV82NChfVElGRk11bHRpcGx5NjQodGlmLHNjYW5saW5lX3NhbXBsZXMsdGQtPnRkX2JpdHNwZXJzYW1wbGUsbW9kdWxlKSw4KTsKKwkJfQorCX0KKwllbHNlCisJCXNjYW5saW5lX3NpemU9VElGRmhvd21hbnlfNjQoX1RJRkZNdWx0aXBseTY0KHRpZix0ZC0+dGRfaW1hZ2V3aWR0aCx0ZC0+dGRfYml0c3BlcnNhbXBsZSxtb2R1bGUpLDgpOworCXJldHVybihzY2FubGluZV9zaXplKTsKK30KK3Rtc2l6ZV90CitUSUZGU2NhbmxpbmVTaXplKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGU2NhbmxpbmVTaXplIjsKKwl1aW50NjQgbTsKKwl0bXNpemVfdCBuOworCW09VElGRlNjYW5saW5lU2l6ZTY0KHRpZik7CisJbj0odG1zaXplX3QpbTsKKwlpZiAoKHVpbnQ2NCluIT1tKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIGFyaXRobWV0aWMgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIGNvbXBsZXRlCisgKiBkZWNvZGVkIGFuZCBwYWNrZWQgcmFzdGVyIHNjYW5saW5lIChhcyBvcHBvc2VkIHRvIHRoZQorICogSS9PIHNpemUgcmV0dXJuZWQgYnkgVElGRlNjYW5saW5lU2l6ZSB3aGljaCBtYXkgYmUgbGVzcworICogaWYgZGF0YSBpcyBzdG9yZSBhcyBzZXBhcmF0ZSBwbGFuZXMpLgorICovCit1aW50NjQKK1RJRkZSYXN0ZXJTY2FubGluZVNpemU2NChUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJhc3RlclNjYW5saW5lU2l6ZTY0IjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDY0IHNjYW5saW5lOworCisJc2NhbmxpbmUgPSBfVElGRk11bHRpcGx5NjQodGlmLCB0ZC0+dGRfYml0c3BlcnNhbXBsZSwgdGQtPnRkX2ltYWdld2lkdGgsIG1vZHVsZSk7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQlzY2FubGluZSA9IF9USUZGTXVsdGlwbHk2NCh0aWYsIHNjYW5saW5lLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLCBtb2R1bGUpOworCQlyZXR1cm4gKFRJRkZob3dtYW55OF82NChzY2FubGluZSkpOworCX0gZWxzZQorCQlyZXR1cm4gKF9USUZGTXVsdGlwbHk2NCh0aWYsIFRJRkZob3dtYW55OF82NChzY2FubGluZSksCisJCSAgICB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLCBtb2R1bGUpKTsKK30KK3Rtc2l6ZV90CitUSUZGUmFzdGVyU2NhbmxpbmVTaXplKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmFzdGVyU2NhbmxpbmVTaXplIjsKKwl1aW50NjQgbTsKKwl0bXNpemVfdCBuOworCW09VElGRlJhc3RlclNjYW5saW5lU2l6ZTY0KHRpZik7CisJbj0odG1zaXplX3QpbTsKKwlpZiAoKHVpbnQ2NCluIT1tKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIGFyaXRobWV0aWMgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3N3YWIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3N3YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA4MTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfc3dhYi5jCkBAIC0wLDAgKzEsMzEzIEBACisvKiAkSWQ6IHRpZl9zd2FiLmMsdiAxLjEzIDIwMTAtMDMtMTAgMTg6NTY6NDkgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkgQml0ICYgQnl0ZSBTd2FwcGluZyBTdXBwb3J0LgorICoKKyAqIFhYWCBXZSBhc3N1bWUgc2hvcnQgPSAxNi1iaXRzIGFuZCBsb25nID0gMzItYml0cyBYWFgKKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCisjaWZuZGVmIFRJRkZTd2FiU2hvcnQKK3ZvaWQKK1RJRkZTd2FiU2hvcnQodWludDE2KiB3cCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyKiBjcCA9ICh1bnNpZ25lZCBjaGFyKikgd3A7CisJdW5zaWduZWQgY2hhciB0OworCWFzc2VydChzaXplb2YodWludDE2KT09Mik7CisJdCA9IGNwWzFdOyBjcFsxXSA9IGNwWzBdOyBjcFswXSA9IHQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBUSUZGU3dhYkxvbmcKK3ZvaWQKK1RJRkZTd2FiTG9uZyh1aW50MzIqIGxwKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSBscDsKKwl1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZih1aW50MzIpPT00KTsKKwl0ID0gY3BbM107IGNwWzNdID0gY3BbMF07IGNwWzBdID0gdDsKKwl0ID0gY3BbMl07IGNwWzJdID0gY3BbMV07IGNwWzFdID0gdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiTG9uZzgKK3ZvaWQKK1RJRkZTd2FiTG9uZzgodWludDY0KiBscCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyKiBjcCA9ICh1bnNpZ25lZCBjaGFyKikgbHA7CisJdW5zaWduZWQgY2hhciB0OworCWFzc2VydChzaXplb2YodWludDY0KT09OCk7CisJdCA9IGNwWzddOyBjcFs3XSA9IGNwWzBdOyBjcFswXSA9IHQ7CisJdCA9IGNwWzZdOyBjcFs2XSA9IGNwWzFdOyBjcFsxXSA9IHQ7CisJdCA9IGNwWzVdOyBjcFs1XSA9IGNwWzJdOyBjcFsyXSA9IHQ7CisJdCA9IGNwWzRdOyBjcFs0XSA9IGNwWzNdOyBjcFszXSA9IHQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBUSUZGU3dhYkFycmF5T2ZTaG9ydAordm9pZAorVElGRlN3YWJBcnJheU9mU2hvcnQocmVnaXN0ZXIgdWludDE2KiB3cCwgdG1zaXplX3QgbikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyKiBjcDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZih1aW50MTYpPT0yKTsKKwkvKiBYWFggdW5yb2xsIGxvb3Agc29tZSAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCWNwID0gKHVuc2lnbmVkIGNoYXIqKSB3cDsKKwkJdCA9IGNwWzFdOyBjcFsxXSA9IGNwWzBdOyBjcFswXSA9IHQ7CisJCXdwKys7CisJfQorfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJBcnJheU9mVHJpcGxlcwordm9pZAorVElGRlN3YWJBcnJheU9mVHJpcGxlcyhyZWdpc3RlciB1aW50OCogdHAsIHRtc2l6ZV90IG4pCit7CisJdW5zaWduZWQgY2hhciogY3A7CisJdW5zaWduZWQgY2hhciB0OworCisJLyogWFhYIHVucm9sbCBsb29wIHNvbWUgKi8KKwl3aGlsZSAobi0tID4gMCkgeworCQljcCA9ICh1bnNpZ25lZCBjaGFyKikgdHA7CisJCXQgPSBjcFsyXTsgY3BbMl0gPSBjcFswXTsgY3BbMF0gPSB0OworCQl0cCArPSAzOworCX0KK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiQXJyYXlPZkxvbmcKK3ZvaWQKK1RJRkZTd2FiQXJyYXlPZkxvbmcocmVnaXN0ZXIgdWludDMyKiBscCwgdG1zaXplX3QgbikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpjcDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZih1aW50MzIpPT00KTsKKwkvKiBYWFggdW5yb2xsIGxvb3Agc29tZSAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCWNwID0gKHVuc2lnbmVkIGNoYXIgKilscDsKKwkJdCA9IGNwWzNdOyBjcFszXSA9IGNwWzBdOyBjcFswXSA9IHQ7CisJCXQgPSBjcFsyXTsgY3BbMl0gPSBjcFsxXTsgY3BbMV0gPSB0OworCQlscCsrOworCX0KK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiQXJyYXlPZkxvbmc4Cit2b2lkCitUSUZGU3dhYkFycmF5T2ZMb25nOChyZWdpc3RlciB1aW50NjQqIGxwLCB0bXNpemVfdCBuKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmNwOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdDsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCS8qIFhYWCB1bnJvbGwgbG9vcCBzb21lICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJY3AgPSAodW5zaWduZWQgY2hhciAqKWxwOworCQl0ID0gY3BbN107IGNwWzddID0gY3BbMF07IGNwWzBdID0gdDsKKwkJdCA9IGNwWzZdOyBjcFs2XSA9IGNwWzFdOyBjcFsxXSA9IHQ7CisJCXQgPSBjcFs1XTsgY3BbNV0gPSBjcFsyXTsgY3BbMl0gPSB0OworCQl0ID0gY3BbNF07IGNwWzRdID0gY3BbM107IGNwWzNdID0gdDsKKwkJbHArKzsKKwl9Cit9CisjZW5kaWYKKworI2lmbmRlZiBUSUZGU3dhYkZsb2F0Cit2b2lkCitUSUZGU3dhYkZsb2F0KGZsb2F0KiBmcCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyKiBjcCA9ICh1bnNpZ25lZCBjaGFyKikgZnA7CisJdW5zaWduZWQgY2hhciB0OworCWFzc2VydChzaXplb2YoZmxvYXQpPT00KTsKKwl0ID0gY3BbM107IGNwWzNdID0gY3BbMF07IGNwWzBdID0gdDsKKwl0ID0gY3BbMl07IGNwWzJdID0gY3BbMV07IGNwWzFdID0gdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiQXJyYXlPZkZsb2F0Cit2b2lkCitUSUZGU3dhYkFycmF5T2ZGbG9hdChyZWdpc3RlciBmbG9hdCogZnAsIHRtc2l6ZV90IG4pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqY3A7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB0OworCWFzc2VydChzaXplb2YoZmxvYXQpPT00KTsKKwkvKiBYWFggdW5yb2xsIGxvb3Agc29tZSAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCWNwID0gKHVuc2lnbmVkIGNoYXIgKilmcDsKKwkJdCA9IGNwWzNdOyBjcFszXSA9IGNwWzBdOyBjcFswXSA9IHQ7CisJCXQgPSBjcFsyXTsgY3BbMl0gPSBjcFsxXTsgY3BbMV0gPSB0OworCQlmcCsrOworCX0KK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiRG91YmxlCit2b2lkCitUSUZGU3dhYkRvdWJsZShkb3VibGUgKmRwKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSBkcDsKKwl1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZihkb3VibGUpPT04KTsKKwl0ID0gY3BbN107IGNwWzddID0gY3BbMF07IGNwWzBdID0gdDsKKwl0ID0gY3BbNl07IGNwWzZdID0gY3BbMV07IGNwWzFdID0gdDsKKwl0ID0gY3BbNV07IGNwWzVdID0gY3BbMl07IGNwWzJdID0gdDsKKwl0ID0gY3BbNF07IGNwWzRdID0gY3BbM107IGNwWzNdID0gdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiQXJyYXlPZkRvdWJsZQordm9pZAorVElGRlN3YWJBcnJheU9mRG91YmxlKGRvdWJsZSogZHAsIHRtc2l6ZV90IG4pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqY3A7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB0OworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJLyogWFhYIHVucm9sbCBsb29wIHNvbWUgKi8KKwl3aGlsZSAobi0tID4gMCkgeworCQljcCA9ICh1bnNpZ25lZCBjaGFyICopZHA7CisJCXQgPSBjcFs3XTsgY3BbN10gPSBjcFswXTsgY3BbMF0gPSB0OworCQl0ID0gY3BbNl07IGNwWzZdID0gY3BbMV07IGNwWzFdID0gdDsKKwkJdCA9IGNwWzVdOyBjcFs1XSA9IGNwWzJdOyBjcFsyXSA9IHQ7CisJCXQgPSBjcFs0XTsgY3BbNF0gPSBjcFszXTsgY3BbM10gPSB0OworCQlkcCsrOworCX0KK30KKyNlbmRpZgorCisvKgorICogQml0IHJldmVyc2FsIHRhYmxlcy4gIFRJRkZCaXRSZXZUYWJsZVs8Ynl0ZT5dIGdpdmVzCisgKiB0aGUgYml0IHJldmVyc2VkIHZhbHVlIG9mIDxieXRlPi4gIFVzZWQgaW4gdmFyaW91cworICogcGxhY2VzIGluIHRoZSBsaWJyYXJ5IHdoZW4gdGhlIEZpbGxPcmRlciByZXF1aXJlcworICogYml0IHJldmVyc2FsIG9mIGJ5dGUgdmFsdWVzIChlLmcuIENDSVRUIEZheCAzCisgKiBlbmNvZGluZy9kZWNvZGluZykuICBUSUZGTm9CaXRSZXZUYWJsZSBpcyBwcm92aWRlZAorICogZm9yIGFsZ29yaXRobXMgdGhhdCB3YW50IGFuIGVxdWl2YWxlbnQgdGFibGUgdGhhdAorICogZG8gbm90IHJldmVyc2UgYml0IHZhbHVlcy4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVElGRkJpdFJldlRhYmxlWzI1Nl0gPSB7CisgICAgMHgwMCwgMHg4MCwgMHg0MCwgMHhjMCwgMHgyMCwgMHhhMCwgMHg2MCwgMHhlMCwKKyAgICAweDEwLCAweDkwLCAweDUwLCAweGQwLCAweDMwLCAweGIwLCAweDcwLCAweGYwLAorICAgIDB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCisgICAgMHgxOCwgMHg5OCwgMHg1OCwgMHhkOCwgMHgzOCwgMHhiOCwgMHg3OCwgMHhmOCwKKyAgICAweDA0LCAweDg0LCAweDQ0LCAweGM0LCAweDI0LCAweGE0LCAweDY0LCAweGU0LAorICAgIDB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCisgICAgMHgwYywgMHg4YywgMHg0YywgMHhjYywgMHgyYywgMHhhYywgMHg2YywgMHhlYywKKyAgICAweDFjLCAweDljLCAweDVjLCAweGRjLCAweDNjLCAweGJjLCAweDdjLCAweGZjLAorICAgIDB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCisgICAgMHgxMiwgMHg5MiwgMHg1MiwgMHhkMiwgMHgzMiwgMHhiMiwgMHg3MiwgMHhmMiwKKyAgICAweDBhLCAweDhhLCAweDRhLCAweGNhLCAweDJhLCAweGFhLCAweDZhLCAweGVhLAorICAgIDB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCisgICAgMHgwNiwgMHg4NiwgMHg0NiwgMHhjNiwgMHgyNiwgMHhhNiwgMHg2NiwgMHhlNiwKKyAgICAweDE2LCAweDk2LCAweDU2LCAweGQ2LCAweDM2LCAweGI2LCAweDc2LCAweGY2LAorICAgIDB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCisgICAgMHgxZSwgMHg5ZSwgMHg1ZSwgMHhkZSwgMHgzZSwgMHhiZSwgMHg3ZSwgMHhmZSwKKyAgICAweDAxLCAweDgxLCAweDQxLCAweGMxLCAweDIxLCAweGExLCAweDYxLCAweGUxLAorICAgIDB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCisgICAgMHgwOSwgMHg4OSwgMHg0OSwgMHhjOSwgMHgyOSwgMHhhOSwgMHg2OSwgMHhlOSwKKyAgICAweDE5LCAweDk5LCAweDU5LCAweGQ5LCAweDM5LCAweGI5LCAweDc5LCAweGY5LAorICAgIDB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCisgICAgMHgxNSwgMHg5NSwgMHg1NSwgMHhkNSwgMHgzNSwgMHhiNSwgMHg3NSwgMHhmNSwKKyAgICAweDBkLCAweDhkLCAweDRkLCAweGNkLCAweDJkLCAweGFkLCAweDZkLCAweGVkLAorICAgIDB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCisgICAgMHgwMywgMHg4MywgMHg0MywgMHhjMywgMHgyMywgMHhhMywgMHg2MywgMHhlMywKKyAgICAweDEzLCAweDkzLCAweDUzLCAweGQzLCAweDMzLCAweGIzLCAweDczLCAweGYzLAorICAgIDB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCisgICAgMHgxYiwgMHg5YiwgMHg1YiwgMHhkYiwgMHgzYiwgMHhiYiwgMHg3YiwgMHhmYiwKKyAgICAweDA3LCAweDg3LCAweDQ3LCAweGM3LCAweDI3LCAweGE3LCAweDY3LCAweGU3LAorICAgIDB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCisgICAgMHgwZiwgMHg4ZiwgMHg0ZiwgMHhjZiwgMHgyZiwgMHhhZiwgMHg2ZiwgMHhlZiwKKyAgICAweDFmLCAweDlmLCAweDVmLCAweGRmLCAweDNmLCAweGJmLCAweDdmLCAweGZmCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVElGRk5vQml0UmV2VGFibGVbMjU2XSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAKKyAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAKKyAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAKKyAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAKKyAgICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAKKyAgICAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAKKyAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAKKyAgICAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAKKyAgICAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAKKyAgICAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAKKyAgICAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAKKyAgICAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAKKyAgICAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAKKyAgICAweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAKKyAgICAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAKKyAgICAweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAKKyAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAKKyAgICAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAKKyAgICAweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAKKyAgICAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAKKyAgICAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAKKyAgICAweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAKKyAgICAweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAKKyAgICAweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAKKyAgICAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAKKyAgICAweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAKKyAgICAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAKKyAgICAweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAKKyAgICAweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAKKyAgICAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAKKyAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAKKyAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAKK307CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIqCitUSUZGR2V0Qml0UmV2VGFibGUoaW50IHJldmVyc2VkKQoreworCXJldHVybiAocmV2ZXJzZWQgPyBUSUZGQml0UmV2VGFibGUgOiBUSUZGTm9CaXRSZXZUYWJsZSk7Cit9CisKK3ZvaWQKK1RJRkZSZXZlcnNlQml0cyh1aW50OCogY3AsIHRtc2l6ZV90IG4pICAKK3sKKwlmb3IgKDsgbiA+IDg7IG4gLT0gOCkgeworCQljcFswXSA9IFRJRkZCaXRSZXZUYWJsZVtjcFswXV07CisJCWNwWzFdID0gVElGRkJpdFJldlRhYmxlW2NwWzFdXTsKKwkJY3BbMl0gPSBUSUZGQml0UmV2VGFibGVbY3BbMl1dOworCQljcFszXSA9IFRJRkZCaXRSZXZUYWJsZVtjcFszXV07CisJCWNwWzRdID0gVElGRkJpdFJldlRhYmxlW2NwWzRdXTsKKwkJY3BbNV0gPSBUSUZGQml0UmV2VGFibGVbY3BbNV1dOworCQljcFs2XSA9IFRJRkZCaXRSZXZUYWJsZVtjcFs2XV07CisJCWNwWzddID0gVElGRkJpdFJldlRhYmxlW2NwWzddXTsKKwkJY3AgKz0gODsKKwl9CisJd2hpbGUgKG4tLSA+IDApCisJCSpjcCA9IFRJRkZCaXRSZXZUYWJsZVsqY3BdLCBjcCsrOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl90aHVuZGVyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl90aHVuZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjYjBkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3RodW5kZXIuYwpAQCAtMCwwICsxLDIxMCBAQAorLyogJElkOiB0aWZfdGh1bmRlci5jLHYgMS4xMiAyMDExLTA0LTAyIDIwOjU0OjA5IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmZGVmIFRIVU5ERVJfU1VQUE9SVAorLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBUaHVuZGVyU2NhbiA0LWJpdCBDb21wcmVzc2lvbiBBbGdvcml0aG0gU3VwcG9ydAorICovCisKKy8qCisgKiBUaHVuZGVyU2NhbiB1c2VzIGFuIGVuY29kaW5nIHNjaGVtZSBkZXNpZ25lZCBmb3IKKyAqIDQtYml0IHBpeGVsIHZhbHVlcy4gIERhdGEgaXMgZW5jb2RlZCBpbiBieXRlcywgd2l0aAorICogZWFjaCBieXRlIHNwbGl0IGludG8gYSAyLWJpdCBjb2RlIHdvcmQgYW5kIGEgNi1iaXQKKyAqIGRhdGEgdmFsdWUuICBUaGUgZW5jb2RpbmcgZ2l2ZXMgcmF3IGRhdGEsIHJ1bnMgb2YKKyAqIHBpeGVscywgb3IgcGl4ZWwgdmFsdWVzIGVuY29kZWQgYXMgYSBkZWx0YSBmcm9tIHRoZQorICogcHJldmlvdXMgcGl4ZWwgdmFsdWUuICBGb3IgdGhlIGxhdHRlciwgZWl0aGVyIDItYml0CisgKiBvciAzLWJpdCBkZWx0YSB2YWx1ZXMgYXJlIHVzZWQsIHdpdGggdGhlIGRlbHRhcyBwYWNrZWQKKyAqIGludG8gYSBzaW5nbGUgYnl0ZS4KKyAqLworI2RlZmluZQlUSFVOREVSX0RBVEEJCTB4M2YJLyogbWFzayBmb3IgNi1iaXQgZGF0YSAqLworI2RlZmluZQlUSFVOREVSX0NPREUJCTB4YzAJLyogbWFzayBmb3IgMi1iaXQgY29kZSB3b3JkICovCisvKiBjb2RlIHZhbHVlcyAqLworI2RlZmluZQlUSFVOREVSX1JVTgkJMHgwMAkvKiBydW4gb2YgcGl4ZWxzIHcvIGVuY29kZWQgY291bnQgKi8KKyNkZWZpbmUJVEhVTkRFUl8yQklUREVMVEFTCTB4NDAJLyogMyBwaXhlbHMgdy8gZW5jb2RlZCAyLWJpdCBkZWx0YXMgKi8KKyNkZWZpbmUJICAgIERFTFRBMl9TS0lQCQkyCS8qIHNraXAgY29kZSBmb3IgMi1iaXQgZGVsdGFzICovCisjZGVmaW5lCVRIVU5ERVJfM0JJVERFTFRBUwkweDgwCS8qIDIgcGl4ZWxzIHcvIGVuY29kZWQgMy1iaXQgZGVsdGFzICovCisjZGVmaW5lCSAgICBERUxUQTNfU0tJUAkJNAkvKiBza2lwIGNvZGUgZm9yIDMtYml0IGRlbHRhcyAqLworI2RlZmluZQlUSFVOREVSX1JBVwkJMHhjMAkvKiByYXcgZGF0YSBlbmNvZGVkICovCisKK3N0YXRpYyBjb25zdCBpbnQgdHdvYml0ZGVsdGFzWzRdID0geyAwLCAxLCAwLCAtMSB9Oworc3RhdGljIGNvbnN0IGludCB0aHJlZWJpdGRlbHRhc1s4XSA9IHsgMCwgMSwgMiwgMywgMCwgLTMsIC0yLCAtMSB9OworCisjZGVmaW5lCVNFVFBJWEVMKG9wLCB2KSB7ICAgICAgICAgICAgICAgICAgICAgXAorCWxhc3RwaXhlbCA9ICh2KSAmIDB4ZjsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIG5waXhlbHMgPCBtYXhwaXhlbHMgKSAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICBpZiAobnBpeGVscysrICYgMSkgICAgICAgICAgICAgICAgICBcCisJICAgICpvcCsrIHw9IGxhc3RwaXhlbDsgICAgICAgICAgICAgICBcCisJICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIG9wWzBdID0gKHVpbnQ4KSAobGFzdHBpeGVsIDw8IDQpOyBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdGF0aWMgaW50CitUaHVuZGVyU2V0dXBEZWNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRodW5kZXJTZXR1cERlY29kZSI7CisKKyAgICAgICAgaWYoIHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlICE9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIGJpdHNwZXJzYW1wbGUgdmFsdWUgKCVkKSwgVGh1bmRlciBkZWNvZGVyIG9ubHkgc3VwcG9ydHMgNGJpdHMgcGVyIHNhbXBsZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIAorCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorVGh1bmRlckRlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbWF4cGl4ZWxzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRodW5kZXJEZWNvZGUiOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmJwOworCXJlZ2lzdGVyIHRtc2l6ZV90IGNjOworCXVuc2lnbmVkIGludCBsYXN0cGl4ZWw7CisJdG1zaXplX3QgbnBpeGVsczsKKworCWJwID0gKHVuc2lnbmVkIGNoYXIgKil0aWYtPnRpZl9yYXdjcDsKKwljYyA9IHRpZi0+dGlmX3Jhd2NjOworCWxhc3RwaXhlbCA9IDA7CisJbnBpeGVscyA9IDA7CisJd2hpbGUgKGNjID4gMCAmJiBucGl4ZWxzIDwgbWF4cGl4ZWxzKSB7CisJCWludCBuLCBkZWx0YTsKKworCQluID0gKmJwKyssIGNjLS07CisJCXN3aXRjaCAobiAmIFRIVU5ERVJfQ09ERSkgeworCQljYXNlIFRIVU5ERVJfUlVOOgkJLyogcGl4ZWwgcnVuICovCisJCQkvKgorCQkJICogUmVwbGljYXRlIHRoZSBsYXN0IHBpeGVsIG4gdGltZXMsCisJCQkgKiB3aGVyZSBuIGlzIHRoZSBsb3dlci1vcmRlciA2IGJpdHMuCisJCQkgKi8KKwkJCWlmIChucGl4ZWxzICYgMSkgeworCQkJCW9wWzBdIHw9IGxhc3RwaXhlbDsKKwkJCQlsYXN0cGl4ZWwgPSAqb3ArKzsgbnBpeGVscysrOyBuLS07CisJCQl9IGVsc2UKKwkJCQlsYXN0cGl4ZWwgfD0gbGFzdHBpeGVsIDw8IDQ7CisJCQlucGl4ZWxzICs9IG47CisJCQlpZiAobnBpeGVscyA8IG1heHBpeGVscykgeworCQkJCWZvciAoOyBuID4gMDsgbiAtPSAyKQorCQkJCQkqb3ArKyA9ICh1aW50OCkgbGFzdHBpeGVsOworCQkJfQorCQkJaWYgKG4gPT0gLTEpCisJCQkJKi0tb3AgJj0gMHhmMDsKKwkJCWxhc3RwaXhlbCAmPSAweGY7CisJCQlicmVhazsKKwkJY2FzZSBUSFVOREVSXzJCSVRERUxUQVM6CS8qIDItYml0IGRlbHRhcyAqLworCQkJaWYgKChkZWx0YSA9ICgobiA+PiA0KSAmIDMpKSAhPSBERUxUQTJfU0tJUCkKKwkJCQlTRVRQSVhFTChvcCwgbGFzdHBpeGVsICsgdHdvYml0ZGVsdGFzW2RlbHRhXSk7CisJCQlpZiAoKGRlbHRhID0gKChuID4+IDIpICYgMykpICE9IERFTFRBMl9TS0lQKQorCQkJCVNFVFBJWEVMKG9wLCBsYXN0cGl4ZWwgKyB0d29iaXRkZWx0YXNbZGVsdGFdKTsKKwkJCWlmICgoZGVsdGEgPSAobiAmIDMpKSAhPSBERUxUQTJfU0tJUCkKKwkJCQlTRVRQSVhFTChvcCwgbGFzdHBpeGVsICsgdHdvYml0ZGVsdGFzW2RlbHRhXSk7CisJCQlicmVhazsKKwkJY2FzZSBUSFVOREVSXzNCSVRERUxUQVM6CS8qIDMtYml0IGRlbHRhcyAqLworCQkJaWYgKChkZWx0YSA9ICgobiA+PiAzKSAmIDcpKSAhPSBERUxUQTNfU0tJUCkKKwkJCQlTRVRQSVhFTChvcCwgbGFzdHBpeGVsICsgdGhyZWViaXRkZWx0YXNbZGVsdGFdKTsKKwkJCWlmICgoZGVsdGEgPSAobiAmIDcpKSAhPSBERUxUQTNfU0tJUCkKKwkJCQlTRVRQSVhFTChvcCwgbGFzdHBpeGVsICsgdGhyZWViaXRkZWx0YXNbZGVsdGFdKTsKKwkJCWJyZWFrOworCQljYXNlIFRIVU5ERVJfUkFXOgkJLyogcmF3IGRhdGEgKi8KKwkJCVNFVFBJWEVMKG9wLCBuKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlpZiAobnBpeGVscyAhPSBtYXhwaXhlbHMpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiJXMgZGF0YSBhdCBzY2FubGluZSAlbHUgKCVJNjR1ICE9ICVJNjR1KSIsCisJCQkgICAgIG5waXhlbHMgPCBtYXhwaXhlbHMgPyAiTm90IGVub3VnaCIgOiAiVG9vIG11Y2giLAorCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgbnBpeGVscywKKwkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIG1heHBpeGVscyk7CisjZWxzZQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiJXMgZGF0YSBhdCBzY2FubGluZSAlbHUgKCVsbHUgIT0gJWxsdSkiLAorCQkJICAgICBucGl4ZWxzIDwgbWF4cGl4ZWxzID8gIk5vdCBlbm91Z2giIDogIlRvbyBtdWNoIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbnBpeGVscywKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWF4cGl4ZWxzKTsKKyNlbmRpZgorCQlyZXR1cm4gKDApOworCX0KKworICAgICAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitUaHVuZGVyRGVjb2RlUm93KFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUaHVuZGVyRGVjb2RlUm93IjsKKwl1aW50OCogcm93ID0gYnVmOworCQorCSh2b2lkKSBzOworCWlmIChvY2MgJSB0aWYtPnRpZl9zY2FubGluZXNpemUpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiRnJhY3Rpb25hbCBzY2FubGluZXMgY2Fubm90IGJlIHJlYWQiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJaWYgKCFUaHVuZGVyRGVjb2RlKHRpZiwgcm93LCB0aWYtPnRpZl9kaXIudGRfaW1hZ2V3aWR0aCkpCisJCQlyZXR1cm4gKDApOworCQlvY2MgLT0gdGlmLT50aWZfc2NhbmxpbmVzaXplOworCQlyb3cgKz0gdGlmLT50aWZfc2NhbmxpbmVzaXplOworCX0KKwlyZXR1cm4gKDEpOworfQorCitpbnQKK1RJRkZJbml0VGh1bmRlclNjYW4oVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisKKyAgICAgICAgdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBUaHVuZGVyU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gVGh1bmRlckRlY29kZVJvdzsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IFRodW5kZXJEZWNvZGVSb3c7IAorCXJldHVybiAoMSk7Cit9CisjZW5kaWYgLyogVEhVTkRFUl9TVVBQT1JUICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfdGlsZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfdGlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YmE4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl90aWxlLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qICRJZDogdGlmX3RpbGUuYyx2IDEuMjMgMjAxMi0wNi0wNiAwNTozMzo1NSBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIFRpbGVkIEltYWdlIFN1cHBvcnQgUm91dGluZXMuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIENvbXB1dGUgd2hpY2ggdGlsZSBhbiAoeCx5LHoscykgdmFsdWUgaXMgaW4uCisgKi8KK3VpbnQzMgorVElGRkNvbXB1dGVUaWxlKFRJRkYqIHRpZiwgdWludDMyIHgsIHVpbnQzMiB5LCB1aW50MzIgeiwgdWludDE2IHMpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQzMiBkeCA9IHRkLT50ZF90aWxld2lkdGg7CisJdWludDMyIGR5ID0gdGQtPnRkX3RpbGVsZW5ndGg7CisJdWludDMyIGR6ID0gdGQtPnRkX3RpbGVkZXB0aDsKKwl1aW50MzIgdGlsZSA9IDE7CisKKwlpZiAodGQtPnRkX2ltYWdlZGVwdGggPT0gMSkKKwkJeiA9IDA7CisJaWYgKGR4ID09ICh1aW50MzIpIC0xKQorCQlkeCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCWlmIChkeSA9PSAodWludDMyKSAtMSkKKwkJZHkgPSB0ZC0+dGRfaW1hZ2VsZW5ndGg7CisJaWYgKGR6ID09ICh1aW50MzIpIC0xKQorCQlkeiA9IHRkLT50ZF9pbWFnZWRlcHRoOworCWlmIChkeCAhPSAwICYmIGR5ICE9IDAgJiYgZHogIT0gMCkgeworCQl1aW50MzIgeHB0ID0gVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdld2lkdGgsIGR4KTsKKwkJdWludDMyIHlwdCA9IFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWxlbmd0aCwgZHkpOworCQl1aW50MzIgenB0ID0gVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlZGVwdGgsIGR6KTsKKworCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIAorCQkJdGlsZSA9ICh4cHQqeXB0KnpwdCkqcyArCisJCQkgICAgICh4cHQqeXB0KSooei9keikgKworCQkJICAgICB4cHQqKHkvZHkpICsKKwkJCSAgICAgeC9keDsKKwkJZWxzZQorCQkJdGlsZSA9ICh4cHQqeXB0KSooei9keikgKyB4cHQqKHkvZHkpICsgeC9keDsKKwl9CisJcmV0dXJuICh0aWxlKTsKK30KKworLyoKKyAqIENoZWNrIGFuICh4LHkseixzKSBjb29yZGluYXRlCisgKiBhZ2FpbnN0IHRoZSBpbWFnZSBib3VuZHMuCisgKi8KK2ludAorVElGRkNoZWNrVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB4LCB1aW50MzIgeSwgdWludDMyIHosIHVpbnQxNiBzKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmICh4ID49IHRkLT50ZF9pbWFnZXdpZHRoKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJICAgICAiJWx1OiBDb2wgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHgsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSAodGQtPnRkX2ltYWdld2lkdGggLSAxKSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmICh5ID49IHRkLT50ZF9pbWFnZWxlbmd0aCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAgIiVsdTogUm93IG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB5LAorCQkJICAgICAodW5zaWduZWQgbG9uZykgKHRkLT50ZF9pbWFnZWxlbmd0aCAtIDEpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHogPj0gdGQtPnRkX2ltYWdlZGVwdGgpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICIlbHU6IERlcHRoIG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB6LAorCQkJICAgICAodW5zaWduZWQgbG9uZykgKHRkLT50ZF9pbWFnZWRlcHRoIC0gMSkpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUgJiYKKwkgICAgcyA+PSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJICAgICAiJWx1OiBTYW1wbGUgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHMsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIDEpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIENvbXB1dGUgaG93IG1hbnkgdGlsZXMgYXJlIGluIGFuIGltYWdlLgorICovCit1aW50MzIKK1RJRkZOdW1iZXJPZlRpbGVzKFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIGR4ID0gdGQtPnRkX3RpbGV3aWR0aDsKKwl1aW50MzIgZHkgPSB0ZC0+dGRfdGlsZWxlbmd0aDsKKwl1aW50MzIgZHogPSB0ZC0+dGRfdGlsZWRlcHRoOworCXVpbnQzMiBudGlsZXM7CisKKwlpZiAoZHggPT0gKHVpbnQzMikgLTEpCisJCWR4ID0gdGQtPnRkX2ltYWdld2lkdGg7CisJaWYgKGR5ID09ICh1aW50MzIpIC0xKQorCQlkeSA9IHRkLT50ZF9pbWFnZWxlbmd0aDsKKwlpZiAoZHogPT0gKHVpbnQzMikgLTEpCisJCWR6ID0gdGQtPnRkX2ltYWdlZGVwdGg7CisJbnRpbGVzID0gKGR4ID09IDAgfHwgZHkgPT0gMCB8fCBkeiA9PSAwKSA/IDAgOgorCSAgICBfVElGRk11bHRpcGx5MzIodGlmLCBfVElGRk11bHRpcGx5MzIodGlmLCBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2V3aWR0aCwgZHgpLAorCSAgICBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2VsZW5ndGgsIGR5KSwKKwkgICAgIlRJRkZOdW1iZXJPZlRpbGVzIiksCisJICAgIFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWRlcHRoLCBkeiksICJUSUZGTnVtYmVyT2ZUaWxlcyIpOworCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkKKwkJbnRpbGVzID0gX1RJRkZNdWx0aXBseTMyKHRpZiwgbnRpbGVzLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAorCQkgICAgIlRJRkZOdW1iZXJPZlRpbGVzIik7CisJcmV0dXJuIChudGlsZXMpOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgIyBieXRlcyBpbiBlYWNoIHJvdyBvZiBhIHRpbGUuCisgKi8KK3VpbnQ2NAorVElGRlRpbGVSb3dTaXplNjQoVElGRiogdGlmKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgcm93c2l6ZTsKKworCWlmICh0ZC0+dGRfdGlsZWxlbmd0aCA9PSAwIHx8IHRkLT50ZF90aWxld2lkdGggPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlyb3dzaXplID0gX1RJRkZNdWx0aXBseTY0KHRpZiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUsIHRkLT50ZF90aWxld2lkdGgsCisJICAgICJUSUZGVGlsZVJvd1NpemUiKTsKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKQorCQlyb3dzaXplID0gX1RJRkZNdWx0aXBseTY0KHRpZiwgcm93c2l6ZSwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwKKwkJICAgICJUSUZGVGlsZVJvd1NpemUiKTsKKwlyZXR1cm4gKFRJRkZob3dtYW55OF82NChyb3dzaXplKSk7Cit9Cit0bXNpemVfdAorVElGRlRpbGVSb3dTaXplKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGVGlsZVJvd1NpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGVGlsZVJvd1NpemU2NCh0aWYpOworCW49KHRtc2l6ZV90KW07CisJaWYgKCh1aW50NjQpbiE9bSkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW50ZWdlciBvdmVyZmxvdyIpOworCQluPTA7CisJfQorCXJldHVybihuKTsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlICMgYnl0ZXMgaW4gYSB2YXJpYWJsZSBsZW5ndGgsIHJvdy1hbGlnbmVkIHRpbGUuCisgKi8KK3VpbnQ2NAorVElGRlZUaWxlU2l6ZTY0KFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZWVGlsZVNpemU2NCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCWlmICh0ZC0+dGRfdGlsZWxlbmd0aCA9PSAwIHx8IHRkLT50ZF90aWxld2lkdGggPT0gMCB8fAorCSAgICB0ZC0+dGRfdGlsZWRlcHRoID09IDApCisJCXJldHVybiAoMCk7CisJaWYgKCh0ZC0+dGRfcGxhbmFyY29uZmlnPT1QTEFOQVJDT05GSUdfQ09OVElHKSYmCisJICAgICh0ZC0+dGRfcGhvdG9tZXRyaWM9PVBIT1RPTUVUUklDX1lDQkNSKSYmCisJICAgICh0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsPT0zKSYmCisJICAgICghaXNVcFNhbXBsZWQodGlmKSkpCisJeworCQkvKgorCQkgKiBQYWNrZWQgWUNiQ3IgZGF0YSBjb250YWluIG9uZSBDYitDciBmb3IgZXZlcnkKKwkJICogSG9yaXpvbnRhbFNhbXBsaW5nKlZlcnRpY2FsU2FtcGxpbmcgWSB2YWx1ZXMuCisJCSAqIE11c3QgYWxzbyByb3VuZHVwIHdpZHRoIGFuZCBoZWlnaHQgd2hlbiBjYWxjdWxhdGluZworCQkgKiBzaW5jZSBpbWFnZXMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisJCSAqIGhvcml6b250YWwvdmVydGljYWwgc3Vic2FtcGxpbmcgYXJlYSBpbmNsdWRlCisJCSAqIFlDYkNyIGRhdGEgZm9yIHRoZSBleHRlbmRlZCBpbWFnZS4KKwkJICovCisJCXVpbnQxNiB5Y2JjcnN1YnNhbXBsaW5nWzJdOworCQl1aW50MTYgc2FtcGxpbmdibG9ja19zYW1wbGVzOworCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfaG9yOworCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfdmVyOworCQl1aW50NjQgc2FtcGxpbmdyb3dfc2FtcGxlczsKKwkJdWludDY0IHNhbXBsaW5ncm93X3NpemU7CisJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLHljYmNyc3Vic2FtcGxpbmcrMCwKKwkJICAgIHljYmNyc3Vic2FtcGxpbmcrMSk7CisJCWlmICgoeWNiY3JzdWJzYW1wbGluZ1swXSAhPSAxICYmIHljYmNyc3Vic2FtcGxpbmdbMF0gIT0gMiAmJiB5Y2JjcnN1YnNhbXBsaW5nWzBdICE9IDQpCisJCSAgICB8fCh5Y2JjcnN1YnNhbXBsaW5nWzFdICE9IDEgJiYgeWNiY3JzdWJzYW1wbGluZ1sxXSAhPSAyICYmIHljYmNyc3Vic2FtcGxpbmdbMV0gIT0gNCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkgICAgICJJbnZhbGlkIFlDYkNyIHN1YnNhbXBsaW5nICglZHglZCkiLCAKKwkJCQkgICAgIHljYmNyc3Vic2FtcGxpbmdbMF0sIAorCQkJCSAgICAgeWNiY3JzdWJzYW1wbGluZ1sxXSApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2FtcGxpbmdibG9ja19zYW1wbGVzPXljYmNyc3Vic2FtcGxpbmdbMF0qeWNiY3JzdWJzYW1wbGluZ1sxXSsyOworCQlzYW1wbGluZ2Jsb2Nrc19ob3I9VElGRmhvd21hbnlfMzIodGQtPnRkX3RpbGV3aWR0aCx5Y2JjcnN1YnNhbXBsaW5nWzBdKTsKKwkJc2FtcGxpbmdibG9ja3NfdmVyPVRJRkZob3dtYW55XzMyKG5yb3dzLHljYmNyc3Vic2FtcGxpbmdbMV0pOworCQlzYW1wbGluZ3Jvd19zYW1wbGVzPV9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdibG9ja3NfaG9yLHNhbXBsaW5nYmxvY2tfc2FtcGxlcyxtb2R1bGUpOworCQlzYW1wbGluZ3Jvd19zaXplPVRJRkZob3dtYW55OF82NChfVElGRk11bHRpcGx5NjQodGlmLHNhbXBsaW5ncm93X3NhbXBsZXMsdGQtPnRkX2JpdHNwZXJzYW1wbGUsbW9kdWxlKSk7CisJCXJldHVybihfVElGRk11bHRpcGx5NjQodGlmLHNhbXBsaW5ncm93X3NpemUsc2FtcGxpbmdibG9ja3NfdmVyLG1vZHVsZSkpOworCX0KKwllbHNlCisJCXJldHVybihfVElGRk11bHRpcGx5NjQodGlmLG5yb3dzLFRJRkZUaWxlUm93U2l6ZTY0KHRpZiksbW9kdWxlKSk7Cit9Cit0bXNpemVfdAorVElGRlZUaWxlU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiBucm93cykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGVlRpbGVTaXplIjsKKwl1aW50NjQgbTsKKwl0bXNpemVfdCBuOworCW09VElGRlZUaWxlU2l6ZTY0KHRpZixucm93cyk7CisJbj0odG1zaXplX3QpbTsKKwlpZiAoKHVpbnQ2NCluIT1tKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCW49MDsKKwl9CisJcmV0dXJuKG4pOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgIyBieXRlcyBpbiBhIHJvdy1hbGlnbmVkIHRpbGUuCisgKi8KK3VpbnQ2NAorVElGRlRpbGVTaXplNjQoVElGRiogdGlmKQoreworCXJldHVybiAoVElGRlZUaWxlU2l6ZTY0KHRpZiwgdGlmLT50aWZfZGlyLnRkX3RpbGVsZW5ndGgpKTsKK30KK3Rtc2l6ZV90CitUSUZGVGlsZVNpemUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZUaWxlU2l6ZSI7CisJdWludDY0IG07CisJdG1zaXplX3QgbjsKKwltPVRJRkZUaWxlU2l6ZTY0KHRpZik7CisJbj0odG1zaXplX3QpbTsKKwlpZiAoKHVpbnQ2NCluIT1tKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCW49MDsKKwl9CisJcmV0dXJuKG4pOworfQorCisvKgorICogQ29tcHV0ZSBhIGRlZmF1bHQgdGlsZSBzaXplIGJhc2VkIG9uIHRoZSBpbWFnZQorICogY2hhcmFjdGVyaXN0aWNzIGFuZCBhIHJlcXVlc3RlZCB2YWx1ZS4gIElmIGEKKyAqIHJlcXVlc3QgaXMgPDEgdGhlbiB3ZSBjaG9vc2UgYSBzaXplIGFjY29yZGluZworICogdG8gY2VydGFpbiBoZXVyaXN0aWNzLgorICovCit2b2lkCitUSUZGRGVmYXVsdFRpbGVTaXplKFRJRkYqIHRpZiwgdWludDMyKiB0dywgdWludDMyKiB0aCkKK3sKKwkoKnRpZi0+dGlmX2RlZnRpbGVzaXplKSh0aWYsIHR3LCB0aCk7Cit9CisKK3ZvaWQKK19USUZGRGVmYXVsdFRpbGVTaXplKFRJRkYqIHRpZiwgdWludDMyKiB0dywgdWludDMyKiB0aCkKK3sKKwkodm9pZCkgdGlmOworCWlmICgqKGludDMyKikgdHcgPCAxKQorCQkqdHcgPSAyNTY7CisJaWYgKCooaW50MzIqKSB0aCA8IDEpCisJCSp0aCA9IDI1NjsKKwkvKiByb3VuZHVwIHRvIGEgbXVsdGlwbGUgb2YgMTYgcGVyIHRoZSBzcGVjICovCisJaWYgKCp0dyAmIDB4ZikKKwkJKnR3ID0gVElGRnJvdW5kdXBfMzIoKnR3LCAxNik7CisJaWYgKCp0aCAmIDB4ZikKKwkJKnRoID0gVElGRnJvdW5kdXBfMzIoKnRoLCAxNik7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3ZlcnNpb24uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFhOGIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfdmVyc2lvbi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qICRIZWFkZXI6IC9jdnMvbWFwdG9vbHMvY3Zzcm9vdC9saWJ0aWZmL2xpYnRpZmYvdGlmX3ZlcnNpb24uYyx2IDEuMyAyMDEwLTAzLTEwIDE4OjU2OjQ5IGJmcmllc2VuIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5Mi0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpZiAoIWRlZmluZWQoX0ZQREZBUElfTUlOSV8pIHx8IGRlZmluZWQoX1RJRkZfREVDT0RFUl8pKSAmJiAhZGVmaW5lZChfVVNFX0FERElOXykgJiYgIWRlZmluZWQgX0ZYX05PX0FOU0lDXyAmJiAhZGVmaW5lZChfRlhfRU1CX05PVVNFX0RFQ09ERVJfKQorI2luY2x1ZGUgInRpZmZpb3AuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgVElGRlZlcnNpb25bXSA9IFRJRkZMSUJfVkVSU0lPTl9TVFI7CisKK2NvbnN0IGNoYXIqCitUSUZGR2V0VmVyc2lvbih2b2lkKQoreworCXJldHVybiAoVElGRlZlcnNpb24pOworfQorLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3dhcm5pbmcuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmX3dhcm5pbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZiM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfd2FybmluZy5jCkBAIC0wLDAgKzEsODcgQEAKKy8qICRIZWFkZXI6IC9jdnMvbWFwdG9vbHMvY3Zzcm9vdC9saWJ0aWZmL2xpYnRpZmYvdGlmX3dhcm5pbmcuYyx2IDEuMyAyMDEwLTAzLTEwIDE4OjU2OjQ5IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisKKy8qVElGRkVycm9ySGFuZGxlckV4dCBfVElGRndhcm5pbmdIYW5kbGVyRXh0ID0gTlVMTDsqLworLyogTW9kaWZ5IGhlcmUgZm9yIHVzZSBfVElGRndhcm5pbmdIYW5kbGVyRXh0IGJ5IFN1bmxpYW5nLkxpdSAyMDA5MDcxNSAqLworVElGRkVycm9ySGFuZGxlciBfVElGRndhcm5pbmdIYW5kbGVyID0gTlVMTDsKKworVElGRkVycm9ySGFuZGxlcgorVElGRlNldFdhcm5pbmdIYW5kbGVyKFRJRkZFcnJvckhhbmRsZXIgaGFuZGxlcikKK3sKKwlUSUZGRXJyb3JIYW5kbGVyIHByZXYgPSBfVElGRndhcm5pbmdIYW5kbGVyOworCV9USUZGd2FybmluZ0hhbmRsZXIgPSBoYW5kbGVyOworCXJldHVybiAocHJldik7Cit9CisKK1RJRkZFcnJvckhhbmRsZXJFeHQKK1RJRkZTZXRXYXJuaW5nSGFuZGxlckV4dChUSUZGRXJyb3JIYW5kbGVyRXh0IGhhbmRsZXIpCit7CisJVElGRkVycm9ySGFuZGxlckV4dCBwcmV2ID0gX1RJRkZ3YXJuaW5nSGFuZGxlckV4dDsKKwlfVElGRndhcm5pbmdIYW5kbGVyRXh0ID0gaGFuZGxlcjsKKwlyZXR1cm4gKHByZXYpOworfQorCit2b2lkCitUSUZGV2FybmluZyhjb25zdCBjaGFyKiBtb2R1bGUsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKF9USUZGd2FybmluZ0hhbmRsZXIpCisJCSgqX1RJRkZ3YXJuaW5nSGFuZGxlcikobW9kdWxlLCBmbXQsIGFwKTsKKwlpZiAoX1RJRkZ3YXJuaW5nSGFuZGxlckV4dCkKKwkJKCpfVElGRndhcm5pbmdIYW5kbGVyRXh0KSgwLCBtb2R1bGUsIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQKK1RJRkZXYXJuaW5nRXh0KHRoYW5kbGVfdCBmZCwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWlmIChfVElGRndhcm5pbmdIYW5kbGVyKQorCQkoKl9USUZGd2FybmluZ0hhbmRsZXIpKG1vZHVsZSwgZm10LCBhcCk7CisJaWYgKF9USUZGd2FybmluZ0hhbmRsZXJFeHQpCisJCSgqX1RJRkZ3YXJuaW5nSGFuZGxlckV4dCkoZmQsIG1vZHVsZSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl93cml0ZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE1MzdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfd3JpdGUuYwpAQCAtMCwwICsxLDc3NCBAQAorLyogJElkOiB0aWZfd3JpdGUuYyx2IDEuMzcgMjAxMi0wOC0xMyAyMjoxMDoxNyBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIFNjYW5saW5lLW9yaWVudGVkIFdyaXRlIFN1cHBvcnQKKyAqLworI2lmICghZGVmaW5lZChfRlBERkFQSV9NSU5JXykgfHwgZGVmaW5lZChfVElGRl9ERUNPREVSXykpICYmICFkZWZpbmVkKF9VU0VfQURESU5fKSAmJiAhZGVmaW5lZCBfRlhfTk9fQU5TSUNfICYmICFkZWZpbmVkKF9GWF9FTUJfTk9VU0VfREVDT0RFUl8pCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgU1RSSVBJTkNSCTIwCQkvKiBleHBhbnNpb24gZmFjdG9yIG9uIHN0cmlwIGFycmF5ICovCisKKyNkZWZpbmUgV1JJVEVDSEVDS1NUUklQUyh0aWYsIG1vZHVsZSkJCQkJXAorCSgoKHRpZiktPnRpZl9mbGFncyZUSUZGX0JFRU5XUklUSU5HKSB8fCBUSUZGV3JpdGVDaGVjaygodGlmKSwwLG1vZHVsZSkpCisjZGVmaW5lIFdSSVRFQ0hFQ0tUSUxFUyh0aWYsIG1vZHVsZSkJCQkJXAorCSgoKHRpZiktPnRpZl9mbGFncyZUSUZGX0JFRU5XUklUSU5HKSB8fCBUSUZGV3JpdGVDaGVjaygodGlmKSwxLG1vZHVsZSkpCisjZGVmaW5lIEJVRkZFUkNIRUNLKHRpZikJCQkJCVwKKwkoKCgodGlmKS0+dGlmX2ZsYWdzICYgVElGRl9CVUZGRVJTRVRVUCkgJiYgdGlmLT50aWZfcmF3ZGF0YSkgfHwJXAorCSAgICBUSUZGV3JpdGVCdWZmZXJTZXR1cCgodGlmKSwgTlVMTCwgKHRtc2l6ZV90KSAtMSkpCisKK3N0YXRpYyBpbnQgVElGRkdyb3dTdHJpcHMoVElGRiogdGlmLCB1aW50MzIgZGVsdGEsIGNvbnN0IGNoYXIqIG1vZHVsZSk7CitzdGF0aWMgaW50IFRJRkZBcHBlbmRUb1N0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB1aW50OCogZGF0YSwgdG1zaXplX3QgY2MpOworCitpbnQKK1RJRkZXcml0ZVNjYW5saW5lKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZVNjYW5saW5lIjsKKwlyZWdpc3RlciBUSUZGRGlyZWN0b3J5ICp0ZDsKKwlpbnQgc3RhdHVzLCBpbWFnZWdyZXcgPSAwOworCXVpbnQzMiBzdHJpcDsKKworCWlmICghV1JJVEVDSEVDS1NUUklQUyh0aWYsIG1vZHVsZSkpCisJCXJldHVybiAoLTEpOworCS8qCisJICogSGFuZGxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvZiBkYXRhIGJ1ZmZlci4gIFRoaXMKKwkgKiBwZXJtaXRzIGl0IHRvIGJlIHNpemVkIG1vcmUgaW50ZWxsaWdlbnRseSAodXNpbmcKKwkgKiBkaXJlY3RvcnkgaW5mb3JtYXRpb24pLgorCSAqLworCWlmICghQlVGRkVSQ0hFQ0sodGlmKSkKKwkJcmV0dXJuICgtMSk7CisgICAgICAgIHRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQlVGNFdSSVRFOyAvKiBub3Qgc3RyaWN0bHkgc3VyZSB0aGlzIGlzIHJpZ2h0Ki8KKworCXRkID0gJnRpZi0+dGlmX2RpcjsKKwkvKgorCSAqIEV4dGVuZCBpbWFnZSBsZW5ndGggaWYgbmVlZGVkCisJICogKGJ1dCBvbmx5IGZvciBQbGFuYXJDb25maWc9MSkuCisJICovCisJaWYgKHJvdyA+PSB0ZC0+dGRfaW1hZ2VsZW5ndGgpIHsJLyogZXh0ZW5kIGltYWdlICovCisJCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ2FuIG5vdCBjaGFuZ2UgXCJJbWFnZUxlbmd0aFwiIHdoZW4gdXNpbmcgc2VwYXJhdGUgcGxhbmVzIik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQl0ZC0+dGRfaW1hZ2VsZW5ndGggPSByb3crMTsKKwkJaW1hZ2VncmV3ID0gMTsKKwl9CisJLyoKKwkgKiBDYWxjdWxhdGUgc3RyaXAgYW5kIGNoZWNrIGZvciBjcm9zc2luZ3MuCisJICovCisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKSB7CisJCWlmIChzYW1wbGUgPj0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiJWx1OiBTYW1wbGUgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgc2FtcGxlLCAodW5zaWduZWQgbG9uZykgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlzdHJpcCA9IHNhbXBsZSp0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgKyByb3cvdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwl9IGVsc2UKKwkJc3RyaXAgPSByb3cgLyB0ZC0+dGRfcm93c3BlcnN0cmlwOworCS8qCisJICogQ2hlY2sgc3RyaXAgYXJyYXkgdG8gbWFrZSBzdXJlIHRoZXJlJ3Mgc3BhY2UuIFdlIGRvbid0IHN1cHBvcnQKKwkgKiBkeW5hbWljYWxseSBncm93aW5nIGZpbGVzIHRoYXQgaGF2ZSBkYXRhIG9yZ2FuaXplZCBpbiBzZXBhcmF0ZQorCSAqIGJpdHBsYW5lcyBiZWNhdXNlIGl0J3MgdG9vIHBhaW5mdWwuICBJbiB0aGF0IGNhc2Ugd2UgcmVxdWlyZSB0aGF0CisJICogdGhlIGltYWdlbGVuZ3RoIGJlIHNldCBwcm9wZXJseSBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIChzbyB0aGF0IHRoZQorCSAqIHN0cmlwcyBhcnJheSB3aWxsIGJlIGZ1bGx5IGFsbG9jYXRlZCBhYm92ZSkuCisJICovCisJaWYgKHN0cmlwID49IHRkLT50ZF9uc3RyaXBzICYmICFUSUZGR3Jvd1N0cmlwcyh0aWYsIDEsIG1vZHVsZSkpCisJCXJldHVybiAoLTEpOworCWlmIChzdHJpcCAhPSB0aWYtPnRpZl9jdXJzdHJpcCkgeworCQkvKgorCQkgKiBDaGFuZ2luZyBzdHJpcHMgLS0gZmx1c2ggYW55IGRhdGEgcHJlc2VudC4KKwkJICovCisJCWlmICghVElGRkZsdXNoRGF0YSh0aWYpKQorCQkJcmV0dXJuICgtMSk7CisJCXRpZi0+dGlmX2N1cnN0cmlwID0gc3RyaXA7CisJCS8qCisJCSAqIFdhdGNoIG91dCBmb3IgYSBncm93aW5nIGltYWdlLiAgVGhlIHZhbHVlIG9mIHN0cmlwcy9pbWFnZQorCQkgKiB3aWxsIGluaXRpYWxseSBiZSAxIChzaW5jZSBpdCBjYW4ndCBiZSBkZWR1Y2VkIHVudGlsIHRoZQorCQkgKiBpbWFnZWxlbmd0aCBpcyBrbm93bikuCisJCSAqLworCQlpZiAoc3RyaXAgPj0gdGQtPnRkX3N0cmlwc3BlcmltYWdlICYmIGltYWdlZ3JldykKKwkJCXRkLT50ZF9zdHJpcHNwZXJpbWFnZSA9CisJCQkgICAgVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlbGVuZ3RoLHRkLT50ZF9yb3dzcGVyc3RyaXApOworCQl0aWYtPnRpZl9yb3cgPQorCQkgICAgKHN0cmlwICUgdGQtPnRkX3N0cmlwc3BlcmltYWdlKSAqIHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0NPREVSU0VUVVApID09IDApIHsKKwkJCWlmICghKCp0aWYtPnRpZl9zZXR1cGVuY29kZSkodGlmKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQ09ERVJTRVRVUDsKKwkJfQorICAgICAgICAKKwkJdGlmLT50aWZfcmF3Y2MgPSAwOworCQl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisKKwkJaWYoIHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gPiAwICkKKwkJeworCQkJLyogaWYgd2UgYXJlIHdyaXRpbmcgb3ZlciBleGlzdGluZyB0aWxlcywgemVybyBsZW5ndGggKi8KKwkJCXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gPSAwOworCisJCQkvKiB0aGlzIGZvcmNlcyBUSUZGQXBwZW5kVG9TdHJpcCgpIHRvIGRvIGEgc2VlayAqLworCQkJdGlmLT50aWZfY3Vyb2ZmID0gMDsKKwkJfQorCisJCWlmICghKCp0aWYtPnRpZl9wcmVlbmNvZGUpKHRpZiwgc2FtcGxlKSkKKwkJCXJldHVybiAoLTEpOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX1BPU1RFTkNPREU7CisJfQorCS8qCisJICogRW5zdXJlIHRoZSB3cml0ZSBpcyBlaXRoZXIgc2VxdWVudGlhbCBvciBhdCB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgYSBzdHJpcCAob3IgdGhhdCB3ZSBjYW4gcmFuZG9tbHkKKwkgKiBhY2Nlc3MgdGhlIGRhdGEgLS0gaS5lLiBubyBlbmNvZGluZykuCisJICovCisJaWYgKHJvdyAhPSB0aWYtPnRpZl9yb3cpIHsKKwkJaWYgKHJvdyA8IHRpZi0+dGlmX3JvdykgeworCQkJLyoKKwkJCSAqIE1vdmluZyBiYWNrd2FyZHMgd2l0aGluIHRoZSBzYW1lIHN0cmlwOgorCQkJICogYmFja3VwIHRvIHRoZSBzdGFydCBhbmQgdGhlbiBkZWNvZGUKKwkJCSAqIGZvcndhcmQgKGJlbG93KS4KKwkJCSAqLworCQkJdGlmLT50aWZfcm93ID0gKHN0cmlwICUgdGQtPnRkX3N0cmlwc3BlcmltYWdlKSAqCisJCQkgICAgdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKwkJfQorCQkvKgorCQkgKiBTZWVrIGZvcndhcmQgdG8gdGhlIGRlc2lyZWQgcm93LgorCQkgKi8KKwkJaWYgKCEoKnRpZi0+dGlmX3NlZWspKHRpZiwgcm93IC0gdGlmLT50aWZfcm93KSkKKwkJCXJldHVybiAoLTEpOworCQl0aWYtPnRpZl9yb3cgPSByb3c7CisJfQorCisJLyogc3dhYiBpZiBuZWVkZWQgLSBub3RlIHRoYXQgc291cmNlIGJ1ZmZlciB3aWxsIGJlIGFsdGVyZWQgKi8KKwl0aWYtPnRpZl9wb3N0ZGVjb2RlKCB0aWYsICh1aW50OCopIGJ1ZiwgdGlmLT50aWZfc2NhbmxpbmVzaXplICk7CisKKwlzdGF0dXMgPSAoKnRpZi0+dGlmX2VuY29kZXJvdykodGlmLCAodWludDgqKSBidWYsCisJICAgIHRpZi0+dGlmX3NjYW5saW5lc2l6ZSwgc2FtcGxlKTsKKworICAgICAgICAvKiB3ZSBhcmUgbm93IHBvaXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdyAqLworCXRpZi0+dGlmX3JvdyA9IHJvdyArIDE7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogRW5jb2RlIHRoZSBzdXBwbGllZCBkYXRhIGFuZCB3cml0ZSBpdCB0byB0aGUKKyAqIHNwZWNpZmllZCBzdHJpcC4KKyAqCisgKiBOQjogSW1hZ2UgbGVuZ3RoIG11c3QgYmUgc2V0dXAgYmVmb3JlIHdyaXRpbmcuCisgKi8KK3Rtc2l6ZV90CitUSUZGV3JpdGVFbmNvZGVkU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZUVuY29kZWRTdHJpcCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQxNiBzYW1wbGU7CisKKwlpZiAoIVdSSVRFQ0hFQ0tTVFJJUFModGlmLCBtb2R1bGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCS8qCisJICogQ2hlY2sgc3RyaXAgYXJyYXkgdG8gbWFrZSBzdXJlIHRoZXJlJ3Mgc3BhY2UuCisJICogV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljYWxseSBncm93aW5nIGZpbGVzIHRoYXQKKwkgKiBoYXZlIGRhdGEgb3JnYW5pemVkIGluIHNlcGFyYXRlIGJpdHBsYW5lcyBiZWNhdXNlCisJICogaXQncyB0b28gcGFpbmZ1bC4gIEluIHRoYXQgY2FzZSB3ZSByZXF1aXJlIHRoYXQKKwkgKiB0aGUgaW1hZ2VsZW5ndGggYmUgc2V0IHByb3Blcmx5IGJlZm9yZSB0aGUgZmlyc3QKKwkgKiB3cml0ZSAoc28gdGhhdCB0aGUgc3RyaXBzIGFycmF5IHdpbGwgYmUgZnVsbHkKKwkgKiBhbGxvY2F0ZWQgYWJvdmUpLgorCSAqLworCWlmIChzdHJpcCA+PSB0ZC0+dGRfbnN0cmlwcykgeworCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkNhbiBub3QgZ3JvdyBpbWFnZSBieSBzdHJpcHMgd2hlbiB1c2luZyBzZXBhcmF0ZSBwbGFuZXMiKTsKKwkJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJCX0KKwkJaWYgKCFUSUZGR3Jvd1N0cmlwcyh0aWYsIDEsIG1vZHVsZSkpCisJCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCQl0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgPQorCQkgICAgVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlbGVuZ3RoLCB0ZC0+dGRfcm93c3BlcnN0cmlwKTsgIAorCX0KKwkvKgorCSAqIEhhbmRsZSBkZWxheWVkIGFsbG9jYXRpb24gb2YgZGF0YSBidWZmZXIuICBUaGlzCisJICogcGVybWl0cyBpdCB0byBiZSBzaXplZCBhY2NvcmRpbmcgdG8gdGhlIGRpcmVjdG9yeQorCSAqIGluZm8uCisJICovCisJaWYgKCFCVUZGRVJDSEVDSyh0aWYpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCisgICAgICAgIHRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQlVGNFdSSVRFOworCXRpZi0+dGlmX2N1cnN0cmlwID0gc3RyaXA7CisKKwl0aWYtPnRpZl9yb3cgPSAoc3RyaXAgJSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpICogdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9DT0RFUlNFVFVQKSA9PSAwKSB7CisJCWlmICghKCp0aWYtPnRpZl9zZXR1cGVuY29kZSkodGlmKSkKKwkJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQ09ERVJTRVRVUDsKKwl9CisKKwlpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBhdCB0aGUgZmlyc3QgYXR0ZW1wdCBvZiByZXdyaXRpbmcgdGhlIHRpbGUsIHdlIHdpbGwgaGF2ZSAqLworICAgICAgICAgICAgLyogbW9yZSBieXRlcyBhdmFpbGFibGUgaW4gdGhlIG91dHB1dCBidWZmZXIgdGhhbiB0aGUgcHJldmlvdXMgYnl0ZSBjb3VudCwgKi8KKyAgICAgICAgICAgIC8qIHNvIHRoYXQgVElGRkFwcGVuZFRvU3RyaXAoKSB3aWxsIGRldGVjdCB0aGUgb3ZlcmZsb3cgd2hlbiBpdCBpcyBjYWxsZWQgdGhlIGZpcnN0ICovCisgICAgICAgICAgICAvKiB0aW1lIGlmIHRoZSBuZXcgY29tcHJlc3NlZCB0aWxlIGlzIGJpZ2dlciB0aGFuIHRoZSBvbGRlciBvbmUuIChHREFMICM0NzcxKSAqLworICAgICAgICAgICAgaWYoIHRpZi0+dGlmX3Jhd2RhdGFzaXplIDw9ICh0bXNpemVfdCl0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIShUSUZGV3JpdGVCdWZmZXJTZXR1cCh0aWYsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICh0bXNpemVfdClUSUZGcm91bmR1cF82NCgodWludDY0KSh0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdICsgMSksIDEwMjQpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKyAgICAgICAgICAgIH0KKworCSAgICAvKiBGb3JjZSBUSUZGQXBwZW5kVG9TdHJpcCgpIHRvIGNvbnNpZGVyIHBsYWNpbmcgZGF0YSBhdCBlbmQKKyAgICAgICAgICAgICAgIG9mIGZpbGUuICovCisgICAgICAgICAgICB0aWYtPnRpZl9jdXJvZmYgPSAwOworICAgICAgICB9CisKKyAgICB0aWYtPnRpZl9yYXdjYyA9IDA7CisgICAgdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfUE9TVEVOQ09ERTsKKwlzYW1wbGUgPSAodWludDE2KShzdHJpcCAvIHRkLT50ZF9zdHJpcHNwZXJpbWFnZSk7CisJaWYgKCEoKnRpZi0+dGlmX3ByZWVuY29kZSkodGlmLCBzYW1wbGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCisgICAgICAgIC8qIHN3YWIgaWYgbmVlZGVkIC0gbm90ZSB0aGF0IHNvdXJjZSBidWZmZXIgd2lsbCBiZSBhbHRlcmVkICovCisJdGlmLT50aWZfcG9zdGRlY29kZSggdGlmLCAodWludDgqKSBkYXRhLCBjYyApOworCisJaWYgKCEoKnRpZi0+dGlmX2VuY29kZXN0cmlwKSh0aWYsICh1aW50OCopIGRhdGEsIGNjLCBzYW1wbGUpKQorCQlyZXR1cm4gKDApOworCWlmICghKCp0aWYtPnRpZl9wb3N0ZW5jb2RlKSh0aWYpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCWlmICghaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKSAmJgorCSAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKQorCQlUSUZGUmV2ZXJzZUJpdHModGlmLT50aWZfcmF3ZGF0YSwgdGlmLT50aWZfcmF3Y2MpOworCWlmICh0aWYtPnRpZl9yYXdjYyA+IDAgJiYKKwkgICAgIVRJRkZBcHBlbmRUb1N0cmlwKHRpZiwgc3RyaXAsIHRpZi0+dGlmX3Jhd2RhdGEsIHRpZi0+dGlmX3Jhd2NjKSkKKwkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKwl0aWYtPnRpZl9yYXdjYyA9IDA7CisJdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCXJldHVybiAoY2MpOworfQorCisvKgorICogV3JpdGUgdGhlIHN1cHBsaWVkIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBzdHJpcC4KKyAqCisgKiBOQjogSW1hZ2UgbGVuZ3RoIG11c3QgYmUgc2V0dXAgYmVmb3JlIHdyaXRpbmcuCisgKi8KK3Rtc2l6ZV90CitUSUZGV3JpdGVSYXdTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogZGF0YSwgdG1zaXplX3QgY2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlUmF3U3RyaXAiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmICghV1JJVEVDSEVDS1NUUklQUyh0aWYsIG1vZHVsZSkpCisJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJLyoKKwkgKiBDaGVjayBzdHJpcCBhcnJheSB0byBtYWtlIHN1cmUgdGhlcmUncyBzcGFjZS4KKwkgKiBXZSBkb24ndCBzdXBwb3J0IGR5bmFtaWNhbGx5IGdyb3dpbmcgZmlsZXMgdGhhdAorCSAqIGhhdmUgZGF0YSBvcmdhbml6ZWQgaW4gc2VwYXJhdGUgYml0cGxhbmVzIGJlY2F1c2UKKwkgKiBpdCdzIHRvbyBwYWluZnVsLiAgSW4gdGhhdCBjYXNlIHdlIHJlcXVpcmUgdGhhdAorCSAqIHRoZSBpbWFnZWxlbmd0aCBiZSBzZXQgcHJvcGVybHkgYmVmb3JlIHRoZSBmaXJzdAorCSAqIHdyaXRlIChzbyB0aGF0IHRoZSBzdHJpcHMgYXJyYXkgd2lsbCBiZSBmdWxseQorCSAqIGFsbG9jYXRlZCBhYm92ZSkuCisJICovCisJaWYgKHN0cmlwID49IHRkLT50ZF9uc3RyaXBzKSB7CisJCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ2FuIG5vdCBncm93IGltYWdlIGJ5IHN0cmlwcyB3aGVuIHVzaW5nIHNlcGFyYXRlIHBsYW5lcyIpOworCQkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKwkJfQorCQkvKgorCQkgKiBXYXRjaCBvdXQgZm9yIGEgZ3Jvd2luZyBpbWFnZS4gIFRoZSB2YWx1ZSBvZgorCQkgKiBzdHJpcHMvaW1hZ2Ugd2lsbCBpbml0aWFsbHkgYmUgMSAoc2luY2UgaXQKKwkJICogY2FuJ3QgYmUgZGVkdWNlZCB1bnRpbCB0aGUgaW1hZ2VsZW5ndGggaXMga25vd24pLgorCQkgKi8KKwkJaWYgKHN0cmlwID49IHRkLT50ZF9zdHJpcHNwZXJpbWFnZSkKKwkJCXRkLT50ZF9zdHJpcHNwZXJpbWFnZSA9CisJCQkgICAgVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlbGVuZ3RoLHRkLT50ZF9yb3dzcGVyc3RyaXApOworCQlpZiAoIVRJRkZHcm93U3RyaXBzKHRpZiwgMSwgbW9kdWxlKSkKKwkJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJfQorCXRpZi0+dGlmX2N1cnN0cmlwID0gc3RyaXA7CisJdGlmLT50aWZfcm93ID0gKHN0cmlwICUgdGQtPnRkX3N0cmlwc3BlcmltYWdlKSAqIHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJcmV0dXJuIChUSUZGQXBwZW5kVG9TdHJpcCh0aWYsIHN0cmlwLCAodWludDgqKSBkYXRhLCBjYykgPworCSAgICBjYyA6ICh0bXNpemVfdCkgLTEpOworfQorCisvKgorICogV3JpdGUgYW5kIGNvbXByZXNzIGEgdGlsZSBvZiBkYXRhLiAgVGhlCisgKiB0aWxlIGlzIHNlbGVjdGVkIGJ5IHRoZSAoeCx5LHoscykgY29vcmRpbmF0ZXMuCisgKi8KK3Rtc2l6ZV90CitUSUZGV3JpdGVUaWxlKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcykKK3sKKwlpZiAoIVRJRkZDaGVja1RpbGUodGlmLCB4LCB5LCB6LCBzKSkKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJLyoKKwkgKiBOQjogQSB0aWxlIHNpemUgb2YgLTEgaXMgdXNlZCBpbnN0ZWFkIG9mIHRpZl90aWxlc2l6ZSBrbm93aW5nCisJICogICAgIHRoYXQgVElGRldyaXRlRW5jb2RlZFRpbGUgd2lsbCBjbGFtcCB0aGlzIHRvIHRoZSB0aWxlIHNpemUuCisJICogICAgIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSB0aWxlIHNpemUgbWF5IG5vdCBiZSBkZWZpbmVkIHVudGlsCisJICogICAgIGFmdGVyIHRoZSBvdXRwdXQgYnVmZmVyIGlzIHNldHVwIGluIFRJRkZXcml0ZUJ1ZmZlclNldHVwLgorCSAqLworCXJldHVybiAoVElGRldyaXRlRW5jb2RlZFRpbGUodGlmLAorCSAgICBUSUZGQ29tcHV0ZVRpbGUodGlmLCB4LCB5LCB6LCBzKSwgYnVmLCAodG1zaXplX3QpKC0xKSkpOworfQorCisvKgorICogRW5jb2RlIHRoZSBzdXBwbGllZCBkYXRhIGFuZCB3cml0ZSBpdCB0byB0aGUKKyAqIHNwZWNpZmllZCB0aWxlLiAgVGhlcmUgbXVzdCBiZSBzcGFjZSBmb3IgdGhlCisgKiBkYXRhLiAgVGhlIGZ1bmN0aW9uIGNsYW1wcyBpbmRpdmlkdWFsIHdyaXRlcworICogdG8gYSB0aWxlIHRvIHRoZSB0aWxlIHNpemUsIGJ1dCBkb2VzIG5vdCAoYW5kCisgKiBjYW4gbm90KSBjaGVjayB0aGF0IG11bHRpcGxlIHdyaXRlcyB0byB0aGUgc2FtZQorICogdGlsZSBkbyBub3Qgd3JpdGUgbW9yZSB0aGFuIHRpbGUgc2l6ZSBkYXRhLgorICoKKyAqIE5COiBJbWFnZSBsZW5ndGggbXVzdCBiZSBzZXR1cCBiZWZvcmUgd3JpdGluZzsgdGhpcworICogICAgIGludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IGF1dG9tYXRpY2FsbHkgZ3Jvd2luZworICogICAgIHRoZSBpbWFnZSBvbiBlYWNoIHdyaXRlIChhcyBUSUZGV3JpdGVTY2FubGluZSBkb2VzKS4KKyAqLwordG1zaXplX3QKK1RJRkZXcml0ZUVuY29kZWRUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZUVuY29kZWRUaWxlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZDsKKwl1aW50MTYgc2FtcGxlOworCisJaWYgKCFXUklURUNIRUNLVElMRVModGlmLCBtb2R1bGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJaWYgKHRpbGUgPj0gdGQtPnRkX25zdHJpcHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlRpbGUgJWx1IG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCS8qCisJICogSGFuZGxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvZiBkYXRhIGJ1ZmZlci4gIFRoaXMKKwkgKiBwZXJtaXRzIGl0IHRvIGJlIHNpemVkIG1vcmUgaW50ZWxsaWdlbnRseSAodXNpbmcKKwkgKiBkaXJlY3RvcnkgaW5mb3JtYXRpb24pLgorCSAqLworCWlmICghQlVGRkVSQ0hFQ0sodGlmKSkKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisKKyAgICAgICAgdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CVUY0V1JJVEU7CisJdGlmLT50aWZfY3VydGlsZSA9IHRpbGU7CisKKwlpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3RpbGVdID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGF0IHRoZSBmaXJzdCBhdHRlbXB0IG9mIHJld3JpdGluZyB0aGUgdGlsZSwgd2Ugd2lsbCBoYXZlICovCisgICAgICAgICAgICAvKiBtb3JlIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0aGFuIHRoZSBwcmV2aW91cyBieXRlIGNvdW50LCAqLworICAgICAgICAgICAgLyogc28gdGhhdCBUSUZGQXBwZW5kVG9TdHJpcCgpIHdpbGwgZGV0ZWN0IHRoZSBvdmVyZmxvdyB3aGVuIGl0IGlzIGNhbGxlZCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICAgIC8qIHRpbWUgaWYgdGhlIG5ldyBjb21wcmVzc2VkIHRpbGUgaXMgYmlnZ2VyIHRoYW4gdGhlIG9sZGVyIG9uZS4gKEdEQUwgIzQ3NzEpICovCisgICAgICAgICAgICBpZiggdGlmLT50aWZfcmF3ZGF0YXNpemUgPD0gKHRtc2l6ZV90KXRkLT50ZF9zdHJpcGJ5dGVjb3VudFt0aWxlXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICEoVElGRldyaXRlQnVmZmVyU2V0dXAodGlmLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAodG1zaXplX3QpVElGRnJvdW5kdXBfNjQoKHVpbnQ2NCkodGQtPnRkX3N0cmlwYnl0ZWNvdW50W3RpbGVdICsgMSksIDEwMjQpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKyAgICAgICAgICAgIH0KKworCSAgICAvKiBGb3JjZSBUSUZGQXBwZW5kVG9TdHJpcCgpIHRvIGNvbnNpZGVyIHBsYWNpbmcgZGF0YSBhdCBlbmQKKyAgICAgICAgICAgICAgIG9mIGZpbGUuICovCisgICAgICAgICAgICB0aWYtPnRpZl9jdXJvZmYgPSAwOworICAgICAgICB9CisKKyAgICB0aWYtPnRpZl9yYXdjYyA9IDA7CisgICAgdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCisJLyogCisJICogQ29tcHV0ZSB0aWxlcyBwZXIgcm93ICYgcGVyIGNvbHVtbiB0byBjb21wdXRlCisJICogY3VycmVudCByb3cgYW5kIGNvbHVtbgorCSAqLworCXRpZi0+dGlmX3JvdyA9ICh0aWxlICUgVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlbGVuZ3RoLCB0ZC0+dGRfdGlsZWxlbmd0aCkpCisJCSogdGQtPnRkX3RpbGVsZW5ndGg7CisJdGlmLT50aWZfY29sID0gKHRpbGUgJSBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2V3aWR0aCwgdGQtPnRkX3RpbGV3aWR0aCkpCisJCSogdGQtPnRkX3RpbGV3aWR0aDsKKworCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0NPREVSU0VUVVApID09IDApIHsKKwkJaWYgKCEoKnRpZi0+dGlmX3NldHVwZW5jb2RlKSh0aWYpKQorCQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQ09ERVJTRVRVUDsKKwl9CisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfUE9TVEVOQ09ERTsKKwlzYW1wbGUgPSAodWludDE2KSh0aWxlL3RkLT50ZF9zdHJpcHNwZXJpbWFnZSk7CisJaWYgKCEoKnRpZi0+dGlmX3ByZWVuY29kZSkodGlmLCBzYW1wbGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkvKgorCSAqIENsYW1wIHdyaXRlIGFtb3VudCB0byB0aGUgdGlsZSBzaXplLiAgVGhpcyBpcyBtb3N0bHkKKwkgKiBkb25lIHNvIHRoYXQgY2FsbGVycyBjYW4gcGFzcyBpbiBzb21lIGxhcmdlIG51bWJlcgorCSAqIChlLmcuIC0xKSBhbmQgaGF2ZSB0aGUgdGlsZSBzaXplIHVzZWQgaW5zdGVhZC4KKwkgKi8KKwlpZiAoIGNjIDwgMSB8fCBjYyA+IHRpZi0+dGlmX3RpbGVzaXplKQorCQljYyA9IHRpZi0+dGlmX3RpbGVzaXplOworCisgICAgICAgIC8qIHN3YWIgaWYgbmVlZGVkIC0gbm90ZSB0aGF0IHNvdXJjZSBidWZmZXIgd2lsbCBiZSBhbHRlcmVkICovCisJdGlmLT50aWZfcG9zdGRlY29kZSggdGlmLCAodWludDgqKSBkYXRhLCBjYyApOworCisJaWYgKCEoKnRpZi0+dGlmX2VuY29kZXRpbGUpKHRpZiwgKHVpbnQ4KikgZGF0YSwgY2MsIHNhbXBsZSkpCisJCXJldHVybiAoMCk7CisJaWYgKCEoKnRpZi0+dGlmX3Bvc3RlbmNvZGUpKHRpZikpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCWlmICghaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKSAmJgorCSAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKQorCQlUSUZGUmV2ZXJzZUJpdHMoKHVpbnQ4Kil0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYyk7CisJaWYgKHRpZi0+dGlmX3Jhd2NjID4gMCAmJiAhVElGRkFwcGVuZFRvU3RyaXAodGlmLCB0aWxlLAorCSAgICB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYykpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCXRpZi0+dGlmX3Jhd2NjID0gMDsKKwl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJcmV0dXJuIChjYyk7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgc3VwcGxpZWQgZGF0YSB0byB0aGUgc3BlY2lmaWVkIHN0cmlwLgorICogVGhlcmUgbXVzdCBiZSBzcGFjZSBmb3IgdGhlIGRhdGE7IHdlIGRvbid0IGNoZWNrCisgKiBpZiBzdHJpcHMgb3ZlcmxhcCEKKyAqCisgKiBOQjogSW1hZ2UgbGVuZ3RoIG11c3QgYmUgc2V0dXAgYmVmb3JlIHdyaXRpbmc7IHRoaXMKKyAqICAgICBpbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBhdXRvbWF0aWNhbGx5IGdyb3dpbmcKKyAqICAgICB0aGUgaW1hZ2Ugb24gZWFjaCB3cml0ZSAoYXMgVElGRldyaXRlU2NhbmxpbmUgZG9lcykuCisgKi8KK3Rtc2l6ZV90CitUSUZGV3JpdGVSYXdUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZVJhd1RpbGUiOworCisJaWYgKCFXUklURUNIRUNLVElMRVModGlmLCBtb2R1bGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAodGlsZSA+PSB0aWYtPnRpZl9kaXIudGRfbnN0cmlwcykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiVGlsZSAlbHUgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWxlLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCXJldHVybiAoVElGRkFwcGVuZFRvU3RyaXAodGlmLCB0aWxlLCAodWludDgqKSBkYXRhLCBjYykgPworCSAgICBjYyA6ICh0bXNpemVfdCkoLTEpKTsKK30KKworI2RlZmluZQlpc1Vuc3BlY2lmaWVkKHRpZiwgZikgXAorICAgIChUSUZGRmllbGRTZXQodGlmLGYpICYmICh0aWYpLT50aWZfZGlyLnRkX2ltYWdlbGVuZ3RoID09IDApCisKK2ludAorVElGRlNldHVwU3RyaXBzKFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwlpZiAoaXNUaWxlZCh0aWYpKQorCQl0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgPQorCQkgICAgaXNVbnNwZWNpZmllZCh0aWYsIEZJRUxEX1RJTEVESU1FTlNJT05TKSA/CisJCQl0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogVElGRk51bWJlck9mVGlsZXModGlmKTsKKwllbHNlCisJCXRkLT50ZF9zdHJpcHNwZXJpbWFnZSA9CisJCSAgICBpc1Vuc3BlY2lmaWVkKHRpZiwgRklFTERfUk9XU1BFUlNUUklQKSA/CisJCQl0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogVElGRk51bWJlck9mU3RyaXBzKHRpZik7CisJdGQtPnRkX25zdHJpcHMgPSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2U7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorCQl0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgLz0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwl0ZC0+dGRfc3RyaXBvZmZzZXQgPSAodWludDY0ICopCisJICAgIF9USUZGbWFsbG9jKHRkLT50ZF9uc3RyaXBzICogc2l6ZW9mICh1aW50NjQpKTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnQgPSAodWludDY0ICopCisJICAgIF9USUZGbWFsbG9jKHRkLT50ZF9uc3RyaXBzICogc2l6ZW9mICh1aW50NjQpKTsKKwlpZiAodGQtPnRkX3N0cmlwb2Zmc2V0ID09IE5VTEwgfHwgdGQtPnRkX3N0cmlwYnl0ZWNvdW50ID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJLyoKKwkgKiBQbGFjZSBkYXRhIGF0IHRoZSBlbmQtb2YtZmlsZQorCSAqIChieSBzZXR0aW5nIG9mZnNldHMgdG8gemVybykuCisJICovCisJX1RJRkZtZW1zZXQodGQtPnRkX3N0cmlwb2Zmc2V0LCAwLCB0ZC0+dGRfbnN0cmlwcypzaXplb2YgKHVpbnQ2NCkpOworCV9USUZGbWVtc2V0KHRkLT50ZF9zdHJpcGJ5dGVjb3VudCwgMCwgdGQtPnRkX25zdHJpcHMqc2l6ZW9mICh1aW50NjQpKTsKKwlUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9TVFJJUE9GRlNFVFMpOworCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1NUUklQQllURUNPVU5UUyk7CisJcmV0dXJuICgxKTsKK30KKyN1bmRlZiBpc1Vuc3BlY2lmaWVkCisKKy8qCisgKiBWZXJpZnkgZmlsZSBpcyB3cml0YWJsZSBhbmQgdGhhdCB0aGUgZGlyZWN0b3J5CisgKiBpbmZvcm1hdGlvbiBpcyBzZXR1cCBwcm9wZXJseS4gIEluIGRvaW5nIHRoZSBsYXR0ZXIKKyAqIHdlIGFsc28gImZyZWV6ZSIgdGhlIHN0YXRlIG9mIHRoZSBkaXJlY3Rvcnkgc28KKyAqIHRoYXQgaW1wb3J0YW50IGluZm9ybWF0aW9uIGlzIG5vdCBjaGFuZ2VkLgorICovCitpbnQKK1RJRkZXcml0ZUNoZWNrKFRJRkYqIHRpZiwgaW50IHRpbGVzLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJaWYgKHRpZi0+dGlmX21vZGUgPT0gT19SRE9OTFkpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZpbGUgbm90IG9wZW4gZm9yIHdyaXRpbmciKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHRpbGVzIF4gaXNUaWxlZCh0aWYpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsIHRpbGVzID8KKwkJICAgICJDYW4gbm90IHdyaXRlIHRpbGVzIHRvIGEgc3RyaXBwZWQgaW1hZ2UiIDoKKwkJICAgICJDYW4gbm90IHdyaXRlIHNjYW5saW5lcyB0byBhIHRpbGVkIGltYWdlIik7CisJCXJldHVybiAoMCk7CisJfQorCisgICAgICAgIF9USUZGRmlsbFN0cmlsZXMoIHRpZiApOworICAgICAgICAKKwkvKgorCSAqIE9uIHRoZSBmaXJzdCB3cml0ZSB2ZXJpZnkgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbgorCSAqIGhhcyBiZWVuIHNldHVwIGFuZCBpbml0aWFsaXplIGFueSBkYXRhIHN0cnVjdHVyZXMgdGhhdAorCSAqIGhhZCB0byB3YWl0IHVudGlsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiB3YXMgc2V0LgorCSAqIE5vdGUgdGhhdCBhIGxvdCBvZiBvdXIgd29yayBpcyBhc3N1bWVkIHRvIHJlbWFpbiB2YWxpZAorCSAqIGJlY2F1c2Ugd2UgZGlzYWxsb3cgYW55IG9mIHRoZSBpbXBvcnRhbnQgcGFyYW1ldGVycworCSAqIGZyb20gY2hhbmdpbmcgYWZ0ZXIgd2Ugc3RhcnQgd3JpdGluZyAoaS5lLiBvbmNlCisJICogVElGRl9CRUVOV1JJVElORyBpcyBzZXQsIFRJRkZTZXRGaWVsZCB3aWxsIG9ubHkgYWxsb3cKKwkgKiB0aGUgaW1hZ2UncyBsZW5ndGggdG8gYmUgY2hhbmdlZCkuCisJICovCisJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9JTUFHRURJTUVOU0lPTlMpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiTXVzdCBzZXQgXCJJbWFnZVdpZHRoXCIgYmVmb3JlIHdyaXRpbmcgZGF0YSIpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCA9PSAxKSB7CisJCS8qIAorCQkgKiBQbGFuYXJjb25maWd1cmF0aW9uIGlzIGlycmVsZXZhbnQgaW4gY2FzZSBvZiBzaW5nbGUgYmFuZAorCQkgKiBpbWFnZXMgYW5kIG5lZWQgbm90IGJlIGluY2x1ZGVkLiBXZSB3aWxsIHNldCBpdCBhbnl3YXksCisJCSAqIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyB1c2VkIGluIG90aGVyIHBhcnRzIG9mIGxpYnJhcnkgZXZlbgorCQkgKiBpbiB0aGUgc2luZ2xlIGJhbmQgY2FzZS4KKwkJICovCisJCWlmICghVElGRkZpZWxkU2V0KHRpZiwgRklFTERfUExBTkFSQ09ORklHKSkKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZyA9IFBMQU5BUkNPTkZJR19DT05USUc7CisJfSBlbHNlIHsKKwkJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9QTEFOQVJDT05GSUcpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJNdXN0IHNldCBcIlBsYW5hckNvbmZpZ3VyYXRpb25cIiBiZWZvcmUgd3JpdGluZyBkYXRhIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCWlmICh0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQgPT0gTlVMTCAmJiAhVElGRlNldHVwU3RyaXBzKHRpZikpIHsKKwkJdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPSAwOworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yICVzIGFycmF5cyIsCisJCSAgICBpc1RpbGVkKHRpZikgPyAidGlsZSIgOiAic3RyaXAiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGlzVGlsZWQodGlmKSkKKwl7CisJCXRpZi0+dGlmX3RpbGVzaXplID0gVElGRlRpbGVTaXplKHRpZik7CisJCWlmICh0aWYtPnRpZl90aWxlc2l6ZSA9PSAwKQorCQkJcmV0dXJuICgwKTsKKwl9CisJZWxzZQorCQl0aWYtPnRpZl90aWxlc2l6ZSA9ICh0bXNpemVfdCkoLTEpOworCXRpZi0+dGlmX3NjYW5saW5lc2l6ZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwlpZiAodGlmLT50aWZfc2NhbmxpbmVzaXplID09IDApCisJCXJldHVybiAoMCk7CisJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CRUVOV1JJVElORzsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogU2V0dXAgdGhlIHJhdyBkYXRhIGJ1ZmZlciB1c2VkIGZvciBlbmNvZGluZy4KKyAqLworaW50CitUSUZGV3JpdGVCdWZmZXJTZXR1cChUSUZGKiB0aWYsIHZvaWQqIGJwLCB0bXNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZUJ1ZmZlclNldHVwIjsKKworCWlmICh0aWYtPnRpZl9yYXdkYXRhKSB7CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpIHsKKwkJCV9USUZGZnJlZSh0aWYtPnRpZl9yYXdkYXRhKTsKKwkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX01ZQlVGRkVSOworCQl9CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCX0KKwlpZiAoc2l6ZSA9PSAodG1zaXplX3QpKC0xKSkgeworCQlzaXplID0gKGlzVGlsZWQodGlmKSA/CisJCSAgICB0aWYtPnRpZl90aWxlc2l6ZSA6IFRJRkZTdHJpcFNpemUodGlmKSk7CisJCS8qCisJCSAqIE1ha2UgcmF3IGRhdGEgYnVmZmVyIGF0IGxlYXN0IDhLCisJCSAqLworCQlpZiAoc2l6ZSA8IDgqMTAyNCkKKwkJCXNpemUgPSA4KjEwMjQ7CisJCWJwID0gTlVMTDsJCQkvKiBOQjogZm9yY2UgbWFsbG9jICovCisJfQorCWlmIChicCA9PSBOVUxMKSB7CisJCWJwID0gX1RJRkZtYWxsb2Moc2l6ZSk7CisJCWlmIChicCA9PSBOVUxMKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIG91dHB1dCBidWZmZXIiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9NWUJVRkZFUjsKKwl9IGVsc2UKKwkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfTVlCVUZGRVI7CisJdGlmLT50aWZfcmF3ZGF0YSA9ICh1aW50OCopIGJwOworCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gc2l6ZTsKKwl0aWYtPnRpZl9yYXdjYyA9IDA7CisJdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQlVGRkVSU0VUVVA7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEdyb3cgdGhlIHN0cmlwIGRhdGEgc3RydWN0dXJlcyBieSBkZWx0YSBzdHJpcHMuCisgKi8KK3N0YXRpYyBpbnQKK1RJRkZHcm93U3RyaXBzKFRJRkYqIHRpZiwgdWludDMyIGRlbHRhLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQ2NCogbmV3X3N0cmlwb2Zmc2V0OworCXVpbnQ2NCogbmV3X3N0cmlwYnl0ZWNvdW50OworCisJYXNzZXJ0KHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyk7CisJbmV3X3N0cmlwb2Zmc2V0ID0gKHVpbnQ2NCopX1RJRkZyZWFsbG9jKHRkLT50ZF9zdHJpcG9mZnNldCwKKwkJKHRkLT50ZF9uc3RyaXBzICsgZGVsdGEpICogc2l6ZW9mICh1aW50NjQpKTsKKwluZXdfc3RyaXBieXRlY291bnQgPSAodWludDY0KilfVElGRnJlYWxsb2ModGQtPnRkX3N0cmlwYnl0ZWNvdW50LAorCQkodGQtPnRkX25zdHJpcHMgKyBkZWx0YSkgKiBzaXplb2YgKHVpbnQ2NCkpOworCWlmIChuZXdfc3RyaXBvZmZzZXQgPT0gTlVMTCB8fCBuZXdfc3RyaXBieXRlY291bnQgPT0gTlVMTCkgeworCQlpZiAobmV3X3N0cmlwb2Zmc2V0KQorCQkJX1RJRkZmcmVlKG5ld19zdHJpcG9mZnNldCk7CisJCWlmIChuZXdfc3RyaXBieXRlY291bnQpCisJCQlfVElGRmZyZWUobmV3X3N0cmlwYnl0ZWNvdW50KTsKKwkJdGQtPnRkX25zdHJpcHMgPSAwOworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgdG8gZXhwYW5kIHN0cmlwIGFycmF5cyIpOworCQlyZXR1cm4gKDApOworCX0KKwl0ZC0+dGRfc3RyaXBvZmZzZXQgPSBuZXdfc3RyaXBvZmZzZXQ7CisJdGQtPnRkX3N0cmlwYnl0ZWNvdW50ID0gbmV3X3N0cmlwYnl0ZWNvdW50OworCV9USUZGbWVtc2V0KHRkLT50ZF9zdHJpcG9mZnNldCArIHRkLT50ZF9uc3RyaXBzLAorCQkgICAgMCwgZGVsdGEqc2l6ZW9mICh1aW50NjQpKTsKKwlfVElGRm1lbXNldCh0ZC0+dGRfc3RyaXBieXRlY291bnQgKyB0ZC0+dGRfbnN0cmlwcywKKwkJICAgIDAsIGRlbHRhKnNpemVvZiAodWludDY0KSk7CisJdGQtPnRkX25zdHJpcHMgKz0gZGVsdGE7CisgICAgICAgIHRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfRElSVFlESVJFQ1Q7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogQXBwZW5kIHRoZSBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK1RJRkZBcHBlbmRUb1N0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB1aW50OCogZGF0YSwgdG1zaXplX3QgY2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkFwcGVuZFRvU3RyaXAiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgbTsKKyAgICAgICAgaW50NjQgb2xkX2J5dGVfY291bnQgPSAtMTsKKworCWlmICh0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdID09IDAgfHwgdGlmLT50aWZfY3Vyb2ZmID09IDApIHsKKyAgICAgICAgICAgIGFzc2VydCh0ZC0+dGRfbnN0cmlwcyA+IDApOworCisgICAgICAgICAgICBpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSAhPSAwIAorICAgICAgICAgICAgICAgICYmIHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0gIT0gMCAKKyAgICAgICAgICAgICAgICAmJiB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdID49ICh1aW50NjQpIGNjICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgKiBUaGVyZSBpcyBhbHJlYWR5IHRpbGUgZGF0YSBvbiBkaXNrLCBhbmQgdGhlIG5ldyB0aWxlCisgICAgICAgICAgICAgICAgICogZGF0YSB3ZSBoYXZlIHdpbGwgZml0IGluIHRoZSBzYW1lIHNwYWNlLiAgVGhlIG9ubHkgCisgICAgICAgICAgICAgICAgICogYXNwZWN0IG9mIHRoaXMgdGhhdCBpcyByaXNreSBpcyB0aGF0IHRoZXJlIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICogbW9yZSBkYXRhIHRvIGFwcGVuZCB0byB0aGlzIHN0cmlwIGJlZm9yZSB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgICAgICAqIGRlcGVuZGluZyBvbiBob3cgd2UgYXJlIGdldHRpbmcgY2FsbGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghU2Vla09LKHRpZiwgdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWVrIGVycm9yIGF0IHNjYW5saW5lICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0aWYtPnRpZl9yb3cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgKiBTZWVrIHRvIGVuZCBvZiBmaWxlLCBhbmQgc2V0IHRoYXQgYXMgb3VyIGxvY2F0aW9uIHRvIAorICAgICAgICAgICAgICAgICAqIHdyaXRlIHRoaXMgc3RyaXAuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSA9IFRJRkZTZWVrRmlsZSh0aWYsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZU1RSSVA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpZi0+dGlmX2N1cm9mZiA9IHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF07CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXZSBhcmUgc3RhcnRpbmcgYSBmcmVzaCBzdHJpcC90aWxlLCBzbyBzZXQgdGhlIHNpemUgdG8gemVyby4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb2xkX2J5dGVfY291bnQgPSB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdOworICAgICAgICAgICAgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IDA7CisJfQorCisJbSA9IHRpZi0+dGlmX2N1cm9mZitjYzsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQltID0gKHVpbnQzMiltOworCWlmICgobTx0aWYtPnRpZl9jdXJvZmYpfHwobTwodWludDY0KWNjKSkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJNYXhpbXVtIFRJRkYgZmlsZSBzaXplIGV4Y2VlZGVkIik7CisJCXJldHVybiAoMCk7CisJfQorCWlmICghV3JpdGVPSyh0aWYsIGRhdGEsIGNjKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiV3JpdGUgZXJyb3IgYXQgc2NhbmxpbmUgJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3cpOworCQkgICAgcmV0dXJuICgwKTsKKwl9CisJdGlmLT50aWZfY3Vyb2ZmID0gbTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdICs9IGNjOworCisgICAgICAgIGlmKCAoaW50NjQpIHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gIT0gb2xkX2J5dGVfY291bnQgKQorICAgICAgICAgICAgdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9ESVJUWVNUUklQOworICAgICAgICAgICAgCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEludGVybmFsIHZlcnNpb24gb2YgVElGRkZsdXNoRGF0YSB0aGF0IGNhbiBiZQorICogY2FsbGVkIGJ5IGBgZW5jb2Rlc3RyaXAgcm91dGluZXMnJyB3L28gY29uY2VybgorICogZm9yIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAqLworaW50CitUSUZGRmx1c2hEYXRhMShUSUZGKiB0aWYpCit7CisJaWYgKHRpZi0+dGlmX3Jhd2NjID4gMCAmJiB0aWYtPnRpZl9mbGFncyAmIFRJRkZfQlVGNFdSSVRFICkgeworCQlpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGlmLT50aWZfZGlyLnRkX2ZpbGxvcmRlcikgJiYKKwkJICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApCisJCQlUSUZGUmV2ZXJzZUJpdHMoKHVpbnQ4Kil0aWYtPnRpZl9yYXdkYXRhLAorCQkJICAgIHRpZi0+dGlmX3Jhd2NjKTsKKwkJaWYgKCFUSUZGQXBwZW5kVG9TdHJpcCh0aWYsCisJCSAgICBpc1RpbGVkKHRpZikgPyB0aWYtPnRpZl9jdXJ0aWxlIDogdGlmLT50aWZfY3Vyc3RyaXAsCisJCSAgICB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYykpCisJCQlyZXR1cm4gKDApOworCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisJCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB3cml0ZSBvZmZzZXQuICBUaGlzIHNob3VsZCBvbmx5IGJlCisgKiB1c2VkIHRvIHNldCB0aGUgb2Zmc2V0IHRvIGEga25vd24gcHJldmlvdXMgbG9jYXRpb24KKyAqICh2ZXJ5IGNhcmVmdWxseSksIG9yIHRvIDAgc28gdGhhdCB0aGUgbmV4dCB3cml0ZSBnZXRzCisgKiBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCit2b2lkCitUSUZGU2V0V3JpdGVPZmZzZXQoVElGRiogdGlmLCB0b2ZmX3Qgb2ZmKQoreworCXRpZi0+dGlmX2N1cm9mZiA9IG9mZjsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfemlwLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZl96aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmIyYThjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZfemlwLmMKQEAgLTAsMCArMSw0NzEgQEAKKy8qICRJZDogdGlmX3ppcC5jLHYgMS4zMSAyMDExLTAxLTA2IDE2OjAwOjIzIGZ3YXJtZXJkYW0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWYgKCFkZWZpbmVkKF9GUERGQVBJX01JTklfKSB8fCBkZWZpbmVkKF9USUZGX0RFQ09ERVJfKSkgJiYgIWRlZmluZWQoX1VTRV9BRERJTl8pICYmICFkZWZpbmVkIF9GWF9OT19BTlNJQ18gJiYgIWRlZmluZWQoX0ZYX0VNQl9OT1VTRV9ERUNPREVSXykKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaWZkZWYgWklQX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogWklQIChha2EgRGVmbGF0ZSkgQ29tcHJlc3Npb24gU3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBzaW1wbHkgYW4gaW50ZXJmYWNlIHRvIHRoZSB6bGliIGxpYnJhcnkgd3JpdHRlbiBieQorICogSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4gIFlvdSBtdXN0IHVzZSB2ZXJzaW9uIDEuMCBvciBsYXRlcgorICogb2YgdGhlIGxpYnJhcnk6IHRoaXMgY29kZSBhc3N1bWVzIHRoZSAxLjAgQVBJIGFuZCBhbHNvIGRlcGVuZHMgb24KKyAqIHRoZSBhYmlsaXR5IHRvIHdyaXRlIHRoZSB6bGliIGhlYWRlciBtdWx0aXBsZSB0aW1lcyAob25lIHBlciBzdHJpcCkKKyAqIHdoaWNoIHdhcyBub3QgcG9zc2libGUgd2l0aCB2ZXJzaW9ucyBwcmlvciB0byAwLjk1LiAgTm90ZSBhbHNvIHRoYXQKKyAqIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgY29kZWMgYXZvaWRlZCB0aGlzIGJ1ZyBieSBzdXByZXNzaW5nIHRoZSBoZWFkZXIKKyAqIGVudGlyZWx5LiAgVGhpcyBtZWFucyB0aGF0IGZpbGVzIHdyaXR0ZW4gd2l0aCB0aGUgb2xkIGxpYnJhcnkgY2Fubm90CisgKiBiZSByZWFkOyB0aGV5IHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gYSBkaWZmZXJlbnQgY29tcHJlc3Npb24gc2NoZW1lCisgKiBhbmQgdGhlbiByZWNvbnZlcnRlZC4KKyAqCisgKiBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZXMKKyAqIHpsaWItMy4xLmRvYywgZGVmbGF0ZS0xLjEuZG9jIGFuZCBnemlwLTQuMS5kb2MsIGF2YWlsYWJsZSBpbiB0aGUKKyAqIGRpcmVjdG9yeSBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy4gIFRoZSBsaWJyYXJ5IHdhcworICogbGFzdCBmb3VuZCBhdCBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL3psaWIvemxpYi0wLjk5LnRhci5nei4KKyAqLworI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCisjaW5jbHVkZSAiLi4vLi4vZnhfemxpYi9pbmNsdWRlL2Z4X3psaWIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBTaWdoLCBaTElCX1ZFUlNJT04gaXMgZGVmaW5lZCBhcyBhIHN0cmluZyBzbyB0aGVyZSdzIG5vCisgKiB3YXkgdG8gZG8gYSBwcm9wZXIgY2hlY2sgaGVyZS4gIEluc3RlYWQgd2UgZ3Vlc3MgYmFzZWQKKyAqIG9uIHRoZSBwcmVzZW5jZSBvZiAjZGVmaW5lcyB0aGF0IHdlcmUgYWRkZWQgYmV0d2VlbiB0aGUKKyAqIDAuOTUgYW5kIDEuMCBkaXN0cmlidXRpb25zLgorICovCisjaWYgIWRlZmluZWQoWl9OT19DT01QUkVTU0lPTikgfHwgIWRlZmluZWQoWl9ERUZMQVRFRCkKKyNlcnJvciAiQW50aXF1YXRlZCBaTElCIHNvZnR3YXJlOyB5b3UgbXVzdCB1c2UgdmVyc2lvbiAxLjAgb3IgbGF0ZXIiCisjZW5kaWYKKworLyoKKyAqIFN0YXRlIGJsb2NrIGZvciBlYWNoIG9wZW4gVElGRgorICogZmlsZSB1c2luZyBaSVAgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVRJRkZQcmVkaWN0b3JTdGF0ZSBwcmVkaWN0OworICAgICAgICB6X3N0cmVhbSAgICAgICAgc3RyZWFtOworCWludCAgICAgICAgICAgICB6aXBxdWFsaXR5OyAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCisJaW50ICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAgICAgICAgLyogc3RhdGUgZmxhZ3MgKi8KKyNkZWZpbmUgWlNUQVRFX0lOSVRfREVDT0RFIDB4MDEKKyNkZWZpbmUgWlNUQVRFX0lOSVRfRU5DT0RFIDB4MDIKKworCVRJRkZWR2V0TWV0aG9kICB2Z2V0cGFyZW50OyAgICAgICAgICAgIC8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZWU2V0TWV0aG9kICB2c2V0cGFyZW50OyAgICAgICAgICAgIC8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworfSBaSVBTdGF0ZTsKKworI2RlZmluZSBaU3RhdGUodGlmKSAgICAgICAgICAgICAoKFpJUFN0YXRlKikgKHRpZiktPnRpZl9kYXRhKQorI2RlZmluZSBEZWNvZGVyU3RhdGUodGlmKSAgICAgICBaU3RhdGUodGlmKQorI2RlZmluZSBFbmNvZGVyU3RhdGUodGlmKSAgICAgICBaU3RhdGUodGlmKQorCitzdGF0aWMgaW50IFpJUEVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgWklQRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKTsKKworc3RhdGljIGludAorWklQRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1pJUFNldHVwRGVjb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJaSVBTZXR1cERlY29kZSI7CisJWklQU3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisgICAgICAgIAorICAgICAgICAvKiBpZiB3ZSB3ZXJlIGxhc3QgZW5jb2RpbmcsIHRlcm1pbmF0ZSB0aGlzIG1vZGUgKi8KKwlpZiAoc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfRU5DT0RFKSB7CisJICAgIGRlZmxhdGVFbmQoJnNwLT5zdHJlYW0pOworCSAgICBzcC0+c3RhdGUgPSAwOworCX0KKworCWlmIChpbmZsYXRlSW5pdCgmc3AtPnN0cmVhbSkgIT0gWl9PSykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXMiLCBzcC0+c3RyZWFtLm1zZyk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJc3AtPnN0YXRlIHw9IFpTVEFURV9JTklUX0RFQ09ERTsKKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qCisgKiBTZXR1cCBzdGF0ZSBmb3IgZGVjb2RpbmcgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorWklQUHJlRGVjb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiWklQUHJlRGVjb2RlIjsKKwlaSVBTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCWlmKCAoc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfREVDT0RFKSA9PSAwICkKKyAgICAgICAgICAgIHRpZi0+dGlmX3NldHVwZGVjb2RlKCB0aWYgKTsKKworCXNwLT5zdHJlYW0ubmV4dF9pbiA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX2luKT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpIHRpZi0+dGlmX3Jhd2NjOworCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9pbiAhPSB0aWYtPnRpZl9yYXdjYykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGNhbm5vdCBkZWFsIHdpdGggYnVmZmVycyB0aGlzIHNpemUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuIChpbmZsYXRlUmVzZXQoJnNwLT5zdHJlYW0pID09IFpfT0spOworfQorCitzdGF0aWMgaW50CitaSVBEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiWklQRGVjb2RlIjsKKwlaSVBTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlhc3NlcnQoc3AtPnN0YXRlID09IFpTVEFURV9JTklUX0RFQ09ERSk7CisKKyAgICAgICAgc3AtPnN0cmVhbS5uZXh0X2luID0gdGlmLT50aWZfcmF3Y3A7CisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KSB0aWYtPnRpZl9yYXdjYzsKKyAgICAgICAgCisJc3AtPnN0cmVhbS5uZXh0X291dCA9IG9wOworCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9vdXQpPT00KTsgIC8qIGlmIHRoaXMgYXNzZXJ0IGdldHMgcmFpc2VkLAorCSAgICB3ZSBuZWVkIHRvIHNpbXBsaWZ5IHRoaXMgY29kZSB0byByZWZsZWN0IGEgWkxpYiB0aGF0IGlzIGxpa2VseSB1cGRhdGVkCisJICAgIHRvIGRlYWwgd2l0aCA4Ynl0ZSBtZW1vcnkgc2l6ZXMsIHRob3VnaCB0aGlzIGNvZGUgd2lsbCByZXNwb25kCisJICAgIGFwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLworCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpIG9jYzsKKwlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IG9jYykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGNhbm5vdCBkZWFsIHdpdGggYnVmZmVycyB0aGlzIHNpemUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZG8geworCQlpbnQgc3RhdGUgPSBpbmZsYXRlKCZzcC0+c3RyZWFtLCBaX1BBUlRJQUxfRkxVU0gpOworCQlpZiAoc3RhdGUgPT0gWl9TVFJFQU1fRU5EKQorCQkJYnJlYWs7CisJCWlmIChzdGF0ZSA9PSBaX0RBVEFfRVJST1IpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkRlY29kaW5nIGVycm9yIGF0IHNjYW5saW5lICVsdSwgJXMiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csIHNwLT5zdHJlYW0ubXNnKTsKKwkJCWlmIChpbmZsYXRlU3luYygmc3AtPnN0cmVhbSkgIT0gWl9PSykKKwkJCQlyZXR1cm4gKDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXRlICE9IFpfT0spIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCisJCQkgICAgc3AtPnN0cmVhbS5tc2cpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gd2hpbGUgKHNwLT5zdHJlYW0uYXZhaWxfb3V0ID4gMCk7CisJaWYgKHNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJOb3QgZW5vdWdoIGRhdGEgYXQgc2NhbmxpbmUgJWx1IChzaG9ydCAiIFRJRkZfVUlOVDY0X0ZPUk1BVCAiIGJ5dGVzKSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LCAoVElGRl9VSU5UNjRfVCkgc3AtPnN0cmVhbS5hdmFpbF9vdXQpOworCQlyZXR1cm4gKDApOworCX0KKworICAgICAgICB0aWYtPnRpZl9yYXdjcCA9IHNwLT5zdHJlYW0ubmV4dF9pbjsKKyAgICAgICAgdGlmLT50aWZfcmF3Y2MgPSBzcC0+c3RyZWFtLmF2YWlsX2luOworCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorWklQU2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUFNldHVwRW5jb2RlIjsKKwlaSVBTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlpZiAoc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfREVDT0RFKSB7CisJCWluZmxhdGVFbmQoJnNwLT5zdHJlYW0pOworCQlzcC0+c3RhdGUgPSAwOworCX0KKworCWlmIChkZWZsYXRlSW5pdCgmc3AtPnN0cmVhbSwgc3AtPnppcHF1YWxpdHkpICE9IFpfT0spIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzIiwgc3AtPnN0cmVhbS5tc2cpOworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCXNwLT5zdGF0ZSB8PSBaU1RBVEVfSU5JVF9FTkNPREU7CisJCXJldHVybiAoMSk7CisJfQorfQorCisvKgorICogUmVzZXQgZW5jb2Rpbmcgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK1pJUFByZUVuY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUFByZUVuY29kZSI7CisJWklQU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJaWYoIHNwLT5zdGF0ZSAhPSBaU1RBVEVfSU5JVF9FTkNPREUgKQorICAgICAgICAgICAgdGlmLT50aWZfc2V0dXBlbmNvZGUoIHRpZiApOworCisJc3AtPnN0cmVhbS5uZXh0X291dCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX291dCk9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCisJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKKwkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKKwkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCl0aWYtPnRpZl9yYXdkYXRhc2l6ZTsKKwlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IHRpZi0+dGlmX3Jhd2RhdGFzaXplKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgY2Fubm90IGRlYWwgd2l0aCBidWZmZXJzIHRoaXMgc2l6ZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKGRlZmxhdGVSZXNldCgmc3AtPnN0cmVhbSkgPT0gWl9PSyk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBjaHVuayBvZiBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK1pJUEVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUEVuY29kZSI7CisJWklQU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5zdGF0ZSA9PSBaU1RBVEVfSU5JVF9FTkNPREUpOworCisJKHZvaWQpIHM7CisJc3AtPnN0cmVhbS5uZXh0X2luID0gYnA7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX2luKT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpIGNjOworCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9pbiAhPSBjYykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGNhbm5vdCBkZWFsIHdpdGggYnVmZmVycyB0aGlzIHNpemUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZG8geworCQlpZiAoZGVmbGF0ZSgmc3AtPnN0cmVhbSwgWl9OT19GTFVTSCkgIT0gWl9PSykgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkVuY29kZXIgZXJyb3I6ICVzIiwKKwkJCSAgICBzcC0+c3RyZWFtLm1zZyk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmIChzcC0+c3RyZWFtLmF2YWlsX291dCA9PSAwKSB7CisJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCQkJVElGRkZsdXNoRGF0YTEodGlmKTsKKwkJCXNwLT5zdHJlYW0ubmV4dF9vdXQgPSB0aWYtPnRpZl9yYXdkYXRhOworCQkJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkgdGlmLT50aWZfcmF3ZGF0YXNpemU7ICAvKiB0aGlzIGlzIGEgc2FmZSB0eXBlY2FzdCwgYXMgY2hlY2sgaXMgbWFkZSBhbHJlYWR5IGluIFpJUFByZUVuY29kZSAqLworCQl9CisJfSB3aGlsZSAoc3AtPnN0cmVhbS5hdmFpbF9pbiA+IDApOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBGaW5pc2ggb2ZmIGFuIGVuY29kZWQgc3RyaXAgYnkgZmx1c2hpbmcgdGhlIGxhc3QKKyAqIHN0cmluZyBhbmQgdGFja2luZyBvbiBhbiBFbmQgT2YgSW5mb3JtYXRpb24gY29kZS4KKyAqLworc3RhdGljIGludAorWklQUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiWklQUG9zdEVuY29kZSI7CisJWklQU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJaW50IHN0YXRlOworCisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisJZG8geworCQlzdGF0ZSA9IGRlZmxhdGUoJnNwLT5zdHJlYW0sIFpfRklOSVNIKTsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFpfU1RSRUFNX0VORDoKKwkJY2FzZSBaX09LOgorCQkJaWYgKCh0bXNpemVfdClzcC0+c3RyZWFtLmF2YWlsX291dCAhPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkKKwkJCXsKKwkJCQl0aWYtPnRpZl9yYXdjYyA9ICB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHNwLT5zdHJlYW0uYXZhaWxfb3V0OworCQkJCVRJRkZGbHVzaERhdGExKHRpZik7CisJCQkJc3AtPnN0cmVhbS5uZXh0X291dCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJCQkJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkgdGlmLT50aWZfcmF3ZGF0YXNpemU7ICAvKiB0aGlzIGlzIGEgc2FmZSB0eXBlY2FzdCwgYXMgY2hlY2sgaXMgbWFkZSBhbHJlYWR5IGluIFpJUFByZUVuY29kZSAqLworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBlcnJvcjogJXMiLAorCQkJICAgIHNwLT5zdHJlYW0ubXNnKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9IHdoaWxlIChzdGF0ZSAhPSBaX1NUUkVBTV9FTkQpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitaSVBDbGVhbnVwKFRJRkYqIHRpZikKK3sKKwlaSVBTdGF0ZSogc3AgPSBaU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSAwKTsKKworCSh2b2lkKVRJRkZQcmVkaWN0b3JDbGVhbnVwKHRpZik7CisKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IHNwLT52Z2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gc3AtPnZzZXRwYXJlbnQ7CisKKwlpZiAoc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfRU5DT0RFKSB7CisJCWRlZmxhdGVFbmQoJnNwLT5zdHJlYW0pOworCQlzcC0+c3RhdGUgPSAwOworCX0gZWxzZSBpZiggc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfREVDT0RFKSB7CisJCWluZmxhdGVFbmQoJnNwLT5zdHJlYW0pOworCQlzcC0+c3RhdGUgPSAwOworCX0KKwlfVElGRmZyZWUoc3ApOworCXRpZi0+dGlmX2RhdGEgPSBOVUxMOworCisJX1RJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZSh0aWYpOworfQorCitzdGF0aWMgaW50CitaSVBWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUFZTZXRGaWVsZCI7CisJWklQU3RhdGUqIHNwID0gWlN0YXRlKHRpZik7CisKKwlzd2l0Y2ggKHRhZykgeworCWNhc2UgVElGRlRBR19aSVBRVUFMSVRZOgorCQlzcC0+emlwcXVhbGl0eSA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJaWYgKCBzcC0+c3RhdGUmWlNUQVRFX0lOSVRfRU5DT0RFICkgeworCQkJaWYgKGRlZmxhdGVQYXJhbXMoJnNwLT5zdHJlYW0sCisJCQkgICAgc3AtPnppcHF1YWxpdHksIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCisJCQkJICAgIHNwLT5zdHJlYW0ubXNnKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQl9CisJCXJldHVybiAoMSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgqc3AtPnZzZXRwYXJlbnQpKHRpZiwgdGFnLCBhcCk7CisJfQorCS8qTk9UUkVBQ0hFRCovCit9CisKK3N0YXRpYyBpbnQKK1pJUFZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJWklQU3RhdGUqIHNwID0gWlN0YXRlKHRpZik7CisKKwlzd2l0Y2ggKHRhZykgeworCWNhc2UgVElGRlRBR19aSVBRVUFMSVRZOgorCQkqdmFfYXJnKGFwLCBpbnQqKSA9IHNwLT56aXBxdWFsaXR5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGNvbnN0IFRJRkZGaWVsZCB6aXBGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfWklQUVVBTElUWSwgMCwgMCwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIFRSVUUsIEZBTFNFLCAiIiwgTlVMTCB9LAorfTsKKworaW50CitUSUZGSW5pdFpJUChUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkluaXRaSVAiOworCVpJUFN0YXRlKiBzcDsKKworCWFzc2VydCggKHNjaGVtZSA9PSBDT01QUkVTU0lPTl9ERUZMQVRFKQorCQl8fCAoc2NoZW1lID09IENPTVBSRVNTSU9OX0FET0JFX0RFRkxBVEUpKTsKKworCS8qCisJICogTWVyZ2UgY29kZWMtc3BlY2lmaWMgdGFnIGluZm9ybWF0aW9uLgorCSAqLworCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIHppcEZpZWxkcywgVElGRkFycmF5Q291bnQoemlwRmllbGRzKSkpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIk1lcmdpbmcgRGVmbGF0ZSBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHN0YXRlIGJsb2NrIHNvIHRhZyBtZXRob2RzIGhhdmUgc3RvcmFnZSB0byByZWNvcmQgdmFsdWVzLgorCSAqLworCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YgKFpJUFN0YXRlKSk7CisJaWYgKHRpZi0+dGlmX2RhdGEgPT0gTlVMTCkKKwkJZ290byBiYWQ7CisJc3AgPSBaU3RhdGUodGlmKTsKKwlzcC0+c3RyZWFtLnphbGxvYyA9IE5VTEw7CisJc3AtPnN0cmVhbS56ZnJlZSA9IE5VTEw7CisJc3AtPnN0cmVhbS5vcGFxdWUgPSBOVUxMOworCXNwLT5zdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7CisKKwkvKgorCSAqIE92ZXJyaWRlIHBhcmVudCBnZXQvc2V0IGZpZWxkIG1ldGhvZHMuCisJICovCisJc3AtPnZnZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IFpJUFZHZXRGaWVsZDsgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCXNwLT52c2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBaSVBWU2V0RmllbGQ7IC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKworCS8qIERlZmF1bHQgdmFsdWVzIGZvciBjb2RlYy1zcGVjaWZpYyBmaWVsZHMgKi8KKwlzcC0+emlwcXVhbGl0eSA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsJLyogZGVmYXVsdCBjb21wLiBsZXZlbCAqLworCXNwLT5zdGF0ZSA9IDA7CisKKwkvKgorCSAqIEluc3RhbGwgY29kZWMgbWV0aG9kcy4KKwkgKi8KKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBaSVBGaXh1cFRhZ3M7IAorCXRpZi0+dGlmX3NldHVwZGVjb2RlID0gWklQU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfcHJlZGVjb2RlID0gWklQUHJlRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXJvdyA9IFpJUERlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IFpJUERlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gWklQRGVjb2RlOyAgCisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBaSVBTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBaSVBQcmVFbmNvZGU7CisJdGlmLT50aWZfcG9zdGVuY29kZSA9IFpJUFBvc3RFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93ID0gWklQRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gWklQRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBaSVBFbmNvZGU7CisJdGlmLT50aWZfY2xlYW51cCA9IFpJUENsZWFudXA7CisJLyoKKwkgKiBTZXR1cCBwcmVkaWN0b3Igc2V0dXAuCisJICovCisJKHZvaWQpIFRJRkZQcmVkaWN0b3JJbml0KHRpZik7CisJcmV0dXJuICgxKTsKK2JhZDoKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgICJObyBzcGFjZSBmb3IgWklQIHN0YXRlIGJsb2NrIik7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBaSVBfU1VQT1JUICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmZi5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliNGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmZi5oCkBAIC0wLDAgKzEsNjc4IEBACisvKiAkSWQ6IHRpZmYuaCx2IDEuNjggMjAxMi0wOC0xOSAxNjo1NjozNSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfVElGRl8KKyNkZWZpbmUJX1RJRkZfCisKKyNpbmNsdWRlICJ0aWZmY29uZi5oIgorCisvKgorICogVGFnIEltYWdlIEZpbGUgRm9ybWF0IChUSUZGKQorICoKKyAqIEJhc2VkIG9uIFJldiA2LjAgZnJvbToKKyAqICAgIERldmVsb3BlcidzIERlc2sKKyAqICAgIEFsZHVzIENvcnBvcmF0aW9uCisgKiAgICA0MTEgRmlyc3QgQXZlLiBTb3V0aAorICogICAgU3VpdGUgMjAwCisgKiAgICBTZWF0dGxlLCBXQSAgOTgxMDQKKyAqICAgIDIwNi02MjItNTUwMAorICoKKyAqICAgIChodHRwOi8vcGFydG5lcnMuYWRvYmUuY29tL2Fzbi9kZXZlbG9wZXIvUERGUy9UTi9USUZGNi5wZGYpCisgKgorICogRm9yIEJpZ1RJRkYgZGVzaWduIG5vdGVzIHNlZSB0aGUgZm9sbG93aW5nIGxpbmtzCisgKiAgICBodHRwOi8vd3d3LnJlbW90ZXNlbnNpbmcub3JnL2xpYnRpZmYvYmlndGlmZmRlc2lnbi5odG1sCisgKiAgICBodHRwOi8vd3d3LmF3YXJlc3lzdGVtcy5iZS9pbWFnaW5nL3RpZmYvYmlndGlmZi5odG1sCisgKi8KKworI2RlZmluZSBUSUZGX1ZFUlNJT05fQ0xBU1NJQyA0MgorI2RlZmluZSBUSUZGX1ZFUlNJT05fQklHIDQzCisKKyNkZWZpbmUgVElGRl9CSUdFTkRJQU4gICAgICAweDRkNGQKKyNkZWZpbmUgVElGRl9MSVRUTEVFTkRJQU4gICAweDQ5NDkKKyNkZWZpbmUgTURJX0xJVFRMRUVORElBTiAgICAweDUwNDUKKyNkZWZpbmUgTURJX0JJR0VORElBTiAgICAgICAweDQ1NTAKKworLyoKKyAqIEludHJpbnNpYyBkYXRhIHR5cGVzIHJlcXVpcmVkIGJ5IHRoZSBmaWxlIGZvcm1hdDoKKyAqCisgKiA4LWJpdCBxdWFudGl0aWVzICAgICBpbnQ4L3VpbnQ4CisgKiAxNi1iaXQgcXVhbnRpdGllcyAgICBpbnQxNi91aW50MTYKKyAqIDMyLWJpdCBxdWFudGl0aWVzICAgIGludDMyL3VpbnQzMgorICogNjQtYml0IHF1YW50aXRpZXMgICAgaW50NjQvdWludDY0CisgKiBzdHJpbmdzICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKgorICovCisKK3R5cGVkZWYgVElGRl9JTlQ4X1QgICBpbnQ4OwordHlwZWRlZiBUSUZGX1VJTlQ4X1QgIHVpbnQ4OworCit0eXBlZGVmIFRJRkZfSU5UMTZfVCAgaW50MTY7Cit0eXBlZGVmIFRJRkZfVUlOVDE2X1QgdWludDE2OworCit0eXBlZGVmIFRJRkZfSU5UMzJfVCAgaW50MzI7Cit0eXBlZGVmIFRJRkZfVUlOVDMyX1QgdWludDMyOworCit0eXBlZGVmIFRJRkZfSU5UNjRfVCAgaW50NjQ7Cit0eXBlZGVmIFRJRkZfVUlOVDY0X1QgdWludDY0OworCisvKgorICogU29tZSB0eXBlcyBhcyBwcm9tb3RlZCBpbiBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QKKyAqIFdlIHVzZSB1aW50MTZfdmFwIHJhdGhlciB0aGVuIGRpcmVjdGx5IHVzaW5nIGludCwgYmVjYXVzZSB0aGlzIHdheQorICogd2UgZG9jdW1lbnQgdGhlIHR5cGUgd2UgYWN0dWFsbHkgd2FudCB0byBwYXNzIHRocm91Z2gsIGNvbmNlcHR1YWxseSwKKyAqIHJhdGhlciB0aGVuIGNvbmZ1c2luZyB0aGUgaXNzdWUgYnkgbWVyZWx5IHN0YXRpbmcgdGhlIHR5cGUgaXQgZ2V0cworICogcHJvbW90ZWQgdG8KKyAqLworCit0eXBlZGVmIGludCB1aW50MTZfdmFwOworCisvKgorICogVElGRiBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTYgdGlmZl9tYWdpYzsgICAgICAvKiBtYWdpYyBudW1iZXIgKGRlZmluZXMgYnl0ZSBvcmRlcikgKi8KKwl1aW50MTYgdGlmZl92ZXJzaW9uOyAgICAvKiBUSUZGIHZlcnNpb24gbnVtYmVyICovCit9IFRJRkZIZWFkZXJDb21tb247Cit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2IHRpZmZfbWFnaWM7ICAgICAgLyogbWFnaWMgbnVtYmVyIChkZWZpbmVzIGJ5dGUgb3JkZXIpICovCisJdWludDE2IHRpZmZfdmVyc2lvbjsgICAgLyogVElGRiB2ZXJzaW9uIG51bWJlciAqLworCXVpbnQzMiB0aWZmX2Rpcm9mZjsgICAgIC8qIGJ5dGUgb2Zmc2V0IHRvIGZpcnN0IGRpcmVjdG9yeSAqLworfSBUSUZGSGVhZGVyQ2xhc3NpYzsKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTYgdGlmZl9tYWdpYzsgICAgICAvKiBtYWdpYyBudW1iZXIgKGRlZmluZXMgYnl0ZSBvcmRlcikgKi8KKwl1aW50MTYgdGlmZl92ZXJzaW9uOyAgICAvKiBUSUZGIHZlcnNpb24gbnVtYmVyICovCisJdWludDE2IHRpZmZfb2Zmc2V0c2l6ZTsgLyogc2l6ZSBvZiBvZmZzZXRzLCBzaG91bGQgYmUgOCAqLworCXVpbnQxNiB0aWZmX3VudXNlZDsgICAgIC8qIHVudXNlZCB3b3JkLCBzaG91bGQgYmUgMCAqLworCXVpbnQ2NCB0aWZmX2Rpcm9mZjsgICAgIC8qIGJ5dGUgb2Zmc2V0IHRvIGZpcnN0IGRpcmVjdG9yeSAqLworfSBUSUZGSGVhZGVyQmlnOworCisKKy8qCisgKiBOQjogSW4gdGhlIGNvbW1lbnRzIGJlbG93LAorICogIC0gaXRlbXMgbWFya2VkIHdpdGggYSArIGFyZSBvYnNvbGV0ZWQgYnkgcmV2aXNpb24gNS4wLAorICogIC0gaXRlbXMgbWFya2VkIHdpdGggYSAhIGFyZSBpbnRyb2R1Y2VkIGluIHJldmlzaW9uIDYuMC4KKyAqICAtIGl0ZW1zIG1hcmtlZCB3aXRoIGEgJSBhcmUgaW50cm9kdWNlZCBwb3N0IHJldmlzaW9uIDYuMC4KKyAqICAtIGl0ZW1zIG1hcmtlZCB3aXRoIGEgJCBhcmUgb2Jzb2xldGVkIGJ5IHJldmlzaW9uIDYuMC4KKyAqICAtIGl0ZW1zIG1hcmtlZCB3aXRoIGEgJiBhcmUgaW50cm9kdWNlZCBieSBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbi4KKyAqLworCisvKgorICogVGFnIGRhdGEgdHlwZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBSQVRJT05BTHMgYXJlIHRoZSByYXRpbyBvZiB0d28gMzItYml0IGludGVnZXIgdmFsdWVzLgorICovCit0eXBlZGVmIGVudW0geworCVRJRkZfTk9UWVBFID0gMCwgICAgICAvKiBwbGFjZWhvbGRlciAqLworCVRJRkZfQllURSA9IDEsICAgICAgICAvKiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9BU0NJSSA9IDIsICAgICAgIC8qIDgtYml0IGJ5dGVzIHcvIGxhc3QgYnl0ZSBudWxsICovCisJVElGRl9TSE9SVCA9IDMsICAgICAgIC8qIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9MT05HID0gNCwgICAgICAgIC8qIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9SQVRJT05BTCA9IDUsICAgIC8qIDY0LWJpdCB1bnNpZ25lZCBmcmFjdGlvbiAqLworCVRJRkZfU0JZVEUgPSA2LCAgICAgICAvKiAhOC1iaXQgc2lnbmVkIGludGVnZXIgKi8KKwlUSUZGX1VOREVGSU5FRCA9IDcsICAgLyogITgtYml0IHVudHlwZWQgZGF0YSAqLworCVRJRkZfU1NIT1JUID0gOCwgICAgICAvKiAhMTYtYml0IHNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9TTE9ORyA9IDksICAgICAgIC8qICEzMi1iaXQgc2lnbmVkIGludGVnZXIgKi8KKwlUSUZGX1NSQVRJT05BTCA9IDEwLCAgLyogITY0LWJpdCBzaWduZWQgZnJhY3Rpb24gKi8KKwlUSUZGX0ZMT0FUID0gMTEsICAgICAgLyogITMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50ICovCisJVElGRl9ET1VCTEUgPSAxMiwgICAgIC8qICE2NC1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCAqLworCVRJRkZfSUZEID0gMTMsICAgICAgICAvKiAlMzItYml0IHVuc2lnbmVkIGludGVnZXIgKG9mZnNldCkgKi8KKwlUSUZGX0xPTkc4ID0gMTYsICAgICAgLyogQmlnVElGRiA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworCVRJRkZfU0xPTkc4ID0gMTcsICAgICAvKiBCaWdUSUZGIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworCVRJRkZfSUZEOCA9IDE4ICAgICAgICAvKiBCaWdUSUZGIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpICovCit9IFRJRkZEYXRhVHlwZTsKKworLyoKKyAqIFRJRkYgVGFnIERlZmluaXRpb25zLgorICovCisjZGVmaW5lCVRJRkZUQUdfU1VCRklMRVRZUEUJCTI1NAkvKiBzdWJmaWxlIGRhdGEgZGVzY3JpcHRvciAqLworI2RlZmluZQkgICAgRklMRVRZUEVfUkVEVUNFRElNQUdFCTB4MQkvKiByZWR1Y2VkIHJlc29sdXRpb24gdmVyc2lvbiAqLworI2RlZmluZQkgICAgRklMRVRZUEVfUEFHRQkJMHgyCS8qIG9uZSBwYWdlIG9mIG1hbnkgKi8KKyNkZWZpbmUJICAgIEZJTEVUWVBFX01BU0sJCTB4NAkvKiB0cmFuc3BhcmVuY3kgbWFzayAqLworI2RlZmluZQlUSUZGVEFHX09TVUJGSUxFVFlQRQkJMjU1CS8qICtraW5kIG9mIGRhdGEgaW4gc3ViZmlsZSAqLworI2RlZmluZQkgICAgT0ZJTEVUWVBFX0lNQUdFCQkxCS8qIGZ1bGwgcmVzb2x1dGlvbiBpbWFnZSBkYXRhICovCisjZGVmaW5lCSAgICBPRklMRVRZUEVfUkVEVUNFRElNQUdFCTIJLyogcmVkdWNlZCBzaXplIGltYWdlIGRhdGEgKi8KKyNkZWZpbmUJICAgIE9GSUxFVFlQRV9QQUdFCQkzCS8qIG9uZSBwYWdlIG9mIG1hbnkgKi8KKyNkZWZpbmUJVElGRlRBR19JTUFHRVdJRFRICQkyNTYJLyogaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzICovCisjZGVmaW5lCVRJRkZUQUdfSU1BR0VMRU5HVEgJCTI1NwkvKiBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCisjZGVmaW5lCVRJRkZUQUdfQklUU1BFUlNBTVBMRQkJMjU4CS8qIGJpdHMgcGVyIGNoYW5uZWwgKHNhbXBsZSkgKi8KKyNkZWZpbmUJVElGRlRBR19DT01QUkVTU0lPTgkJMjU5CS8qIGRhdGEgY29tcHJlc3Npb24gdGVjaG5pcXVlICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9OT05FCQkxCS8qIGR1bXAgbW9kZSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fQ0NJVFRSTEUJMgkvKiBDQ0lUVCBtb2RpZmllZCBIdWZmbWFuIFJMRSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fQ0NJVFRGQVgzCTMJLyogQ0NJVFQgR3JvdXAgMyBmYXggZW5jb2RpbmcgKi8KKyNkZWZpbmUgICAgIENPTVBSRVNTSU9OX0NDSVRUX1Q0ICAgICAgICAzICAgICAgIC8qIENDSVRUIFQuNCAoVElGRiA2IG5hbWUpICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9DQ0lUVEZBWDQJNAkvKiBDQ0lUVCBHcm91cCA0IGZheCBlbmNvZGluZyAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fQ0NJVFRfVDYgICAgICAgIDQgICAgICAgLyogQ0NJVFQgVC42IChUSUZGIDYgbmFtZSkgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0xaVwkJNSAgICAgICAvKiBMZW1wZWwtWml2ICAmIFdlbGNoICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9PSlBFRwkJNgkvKiAhNi4wIEpQRUcgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0pQRUcJCTcJLyogJUpQRUcgRENUIGNvbXByZXNzaW9uICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9UODUJCQk5CS8qICFUSUZGL0ZYIFQuODUgSkJJRyBjb21wcmVzc2lvbiAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fVDQzCQkJMTAJLyogIVRJRkYvRlggVC40MyBjb2xvdXIgYnkgbGF5ZXJlZCBKQklHIGNvbXByZXNzaW9uICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9ORVhUCQkzMjc2NgkvKiBOZVhUIDItYml0IFJMRSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fQ0NJVFRSTEVXCTMyNzcxCS8qICMxIHcvIHdvcmQgYWxpZ25tZW50ICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9QQUNLQklUUwkzMjc3MwkvKiBNYWNpbnRvc2ggUkxFICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9USFVOREVSU0NBTgkzMjgwOQkvKiBUaHVuZGVyU2NhbiBSTEUgKi8KKy8qIGNvZGVzIDMyODk1LTMyODk4IGFyZSByZXNlcnZlZCBmb3IgQU5TSSBJVDggVElGRi9JVCA8ZGtlbGx5QGFwYWdvLmNvbSkgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0lUOENUUEFECTMyODk1ICAgLyogSVQ4IENUIHcvcGFkZGluZyAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fSVQ4TFcJCTMyODk2ICAgLyogSVQ4IExpbmV3b3JrIFJMRSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fSVQ4TVAJCTMyODk3ICAgLyogSVQ4IE1vbm9jaHJvbWUgcGljdHVyZSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fSVQ4QkwJCTMyODk4ICAgLyogSVQ4IEJpbmFyeSBsaW5lIGFydCAqLworLyogY29tcHJlc3Npb24gY29kZXMgMzI5MDgtMzI5MTEgYXJlIHJlc2VydmVkIGZvciBQaXhhciAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fUElYQVJGSUxNCTMyOTA4ICAgLyogUGl4YXIgY29tcGFuZGVkIDEwYml0IExaVyAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fUElYQVJMT0cJMzI5MDkgICAvKiBQaXhhciBjb21wYW5kZWQgMTFiaXQgWklQICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9ERUZMQVRFCQkzMjk0NgkvKiBEZWZsYXRlIGNvbXByZXNzaW9uICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9BRE9CRV9ERUZMQVRFICAgOCAgICAgICAvKiBEZWZsYXRlIGNvbXByZXNzaW9uLAorCQkJCQkJICAgYXMgcmVjb2duaXplZCBieSBBZG9iZSAqLworLyogY29tcHJlc3Npb24gY29kZSAzMjk0NyBpcyByZXNlcnZlZCBmb3IgT2NlYW5hIE1hdHJpeCA8ZGV2QG9jZWFuYS5jb20+ICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9EQ1MgICAgICAgICAgICAgMzI5NDcgICAvKiBLb2RhayBEQ1MgZW5jb2RpbmcgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0pCSUcJCTM0NjYxCS8qIElTTyBKQklHICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9TR0lMT0cJCTM0Njc2CS8qIFNHSSBMb2cgTHVtaW5hbmNlIFJMRSAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fU0dJTE9HMjQJMzQ2NzcJLyogU0dJIExvZyAyNC1iaXQgcGFja2VkICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9KUDIwMDAgICAgICAgICAgMzQ3MTIgICAvKiBMZWFkdG9vbHMgSlBFRzIwMDAgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0xaTUEJCTM0OTI1CS8qIExaTUEyICovCisjZGVmaW5lCVRJRkZUQUdfUEhPVE9NRVRSSUMJCTI2MgkvKiBwaG90b21ldHJpYyBpbnRlcnByZXRhdGlvbiAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfTUlOSVNXSElURQkwCS8qIG1pbiB2YWx1ZSBpcyB3aGl0ZSAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSwkxCS8qIG1pbiB2YWx1ZSBpcyBibGFjayAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfUkdCCQkyCS8qIFJHQiBjb2xvciBtb2RlbCAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfUEFMRVRURQkJMwkvKiBjb2xvciBtYXAgaW5kZXhlZCAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfTUFTSwkJNAkvKiAkaG9sZG91dCBtYXNrICovCisjZGVmaW5lCSAgICBQSE9UT01FVFJJQ19TRVBBUkFURUQJNQkvKiAhY29sb3Igc2VwYXJhdGlvbnMgKi8KKyNkZWZpbmUJICAgIFBIT1RPTUVUUklDX1lDQkNSCQk2CS8qICFDQ0lSIDYwMSAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfQ0lFTEFCCQk4CS8qICExOTc2IENJRSBMKmEqYiogKi8KKyNkZWZpbmUJICAgIFBIT1RPTUVUUklDX0lDQ0xBQgkJOQkvKiBJQ0MgTCphKmIqIFtBZG9iZSBUSUZGIFRlY2hub3RlIDRdICovCisjZGVmaW5lCSAgICBQSE9UT01FVFJJQ19JVFVMQUIJCTEwCS8qIElUVSBMKmEqYiogKi8KKyNkZWZpbmUgICAgIFBIT1RPTUVUUklDX0xPR0wJCTMyODQ0CS8qIENJRSBMb2cyKEwpICovCisjZGVmaW5lICAgICBQSE9UT01FVFJJQ19MT0dMVVYJCTMyODQ1CS8qIENJRSBMb2cyKEwpICh1Jyx2JykgKi8KKyNkZWZpbmUJVElGRlRBR19USFJFU0hIT0xESU5HCQkyNjMJLyogK3RocmVzaG9sZGluZyB1c2VkIG9uIGRhdGEgKi8KKyNkZWZpbmUJICAgIFRIUkVTSEhPTERfQklMRVZFTAkJMQkvKiBiJncgYXJ0IHNjYW4gKi8KKyNkZWZpbmUJICAgIFRIUkVTSEhPTERfSEFMRlRPTkUJCTIJLyogb3IgZGl0aGVyZWQgc2NhbiAqLworI2RlZmluZQkgICAgVEhSRVNISE9MRF9FUlJPUkRJRkZVU0UJMwkvKiB1c3VhbGx5IGZsb3lkLXN0ZWluYmVyZyAqLworI2RlZmluZQlUSUZGVEFHX0NFTExXSURUSAkJMjY0CS8qICtkaXRoZXJpbmcgbWF0cml4IHdpZHRoICovCisjZGVmaW5lCVRJRkZUQUdfQ0VMTExFTkdUSAkJMjY1CS8qICtkaXRoZXJpbmcgbWF0cml4IGhlaWdodCAqLworI2RlZmluZQlUSUZGVEFHX0ZJTExPUkRFUgkJMjY2CS8qIGRhdGEgb3JkZXIgd2l0aGluIGEgYnl0ZSAqLworI2RlZmluZQkgICAgRklMTE9SREVSX01TQjJMU0IJCTEJLyogbW9zdCBzaWduaWZpY2FudCAtPiBsZWFzdCAqLworI2RlZmluZQkgICAgRklMTE9SREVSX0xTQjJNU0IJCTIJLyogbGVhc3Qgc2lnbmlmaWNhbnQgLT4gbW9zdCAqLworI2RlZmluZQlUSUZGVEFHX0RPQ1VNRU5UTkFNRQkJMjY5CS8qIG5hbWUgb2YgZG9jLiBpbWFnZSBpcyBmcm9tICovCisjZGVmaW5lCVRJRkZUQUdfSU1BR0VERVNDUklQVElPTgkyNzAJLyogaW5mbyBhYm91dCBpbWFnZSAqLworI2RlZmluZQlUSUZGVEFHX01BS0UJCQkyNzEJLyogc2Nhbm5lciBtYW51ZmFjdHVyZXIgbmFtZSAqLworI2RlZmluZQlUSUZGVEFHX01PREVMCQkJMjcyCS8qIHNjYW5uZXIgbW9kZWwgbmFtZS9udW1iZXIgKi8KKyNkZWZpbmUJVElGRlRBR19TVFJJUE9GRlNFVFMJCTI3MwkvKiBvZmZzZXRzIHRvIGRhdGEgc3RyaXBzICovCisjZGVmaW5lCVRJRkZUQUdfT1JJRU5UQVRJT04JCTI3NAkvKiAraW1hZ2Ugb3JpZW50YXRpb24gKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX1RPUExFRlQJCTEJLyogcm93IDAgdG9wLCBjb2wgMCBsaHMgKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX1RPUFJJR0hUCTIJLyogcm93IDAgdG9wLCBjb2wgMCByaHMgKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX0JPVFJJR0hUCTMJLyogcm93IDAgYm90dG9tLCBjb2wgMCByaHMgKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX0JPVExFRlQJCTQJLyogcm93IDAgYm90dG9tLCBjb2wgMCBsaHMgKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX0xFRlRUT1AJCTUJLyogcm93IDAgbGhzLCBjb2wgMCB0b3AgKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX1JJR0hUVE9QCTYJLyogcm93IDAgcmhzLCBjb2wgMCB0b3AgKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX1JJR0hUQk9UCTcJLyogcm93IDAgcmhzLCBjb2wgMCBib3R0b20gKi8KKyNkZWZpbmUJICAgIE9SSUVOVEFUSU9OX0xFRlRCT1QJCTgJLyogcm93IDAgbGhzLCBjb2wgMCBib3R0b20gKi8KKyNkZWZpbmUJVElGRlRBR19TQU1QTEVTUEVSUElYRUwJCTI3NwkvKiBzYW1wbGVzIHBlciBwaXhlbCAqLworI2RlZmluZQlUSUZGVEFHX1JPV1NQRVJTVFJJUAkJMjc4CS8qIHJvd3MgcGVyIHN0cmlwIG9mIGRhdGEgKi8KKyNkZWZpbmUJVElGRlRBR19TVFJJUEJZVEVDT1VOVFMJCTI3OQkvKiBieXRlcyBjb3VudHMgZm9yIHN0cmlwcyAqLworI2RlZmluZQlUSUZGVEFHX01JTlNBTVBMRVZBTFVFCQkyODAJLyogK21pbmltdW0gc2FtcGxlIHZhbHVlICovCisjZGVmaW5lCVRJRkZUQUdfTUFYU0FNUExFVkFMVUUJCTI4MQkvKiArbWF4aW11bSBzYW1wbGUgdmFsdWUgKi8KKyNkZWZpbmUJVElGRlRBR19YUkVTT0xVVElPTgkJMjgyCS8qIHBpeGVscy9yZXNvbHV0aW9uIGluIHggKi8KKyNkZWZpbmUJVElGRlRBR19ZUkVTT0xVVElPTgkJMjgzCS8qIHBpeGVscy9yZXNvbHV0aW9uIGluIHkgKi8KKyNkZWZpbmUJVElGRlRBR19QTEFOQVJDT05GSUcJCTI4NAkvKiBzdG9yYWdlIG9yZ2FuaXphdGlvbiAqLworI2RlZmluZQkgICAgUExBTkFSQ09ORklHX0NPTlRJRwkJMQkvKiBzaW5nbGUgaW1hZ2UgcGxhbmUgKi8KKyNkZWZpbmUJICAgIFBMQU5BUkNPTkZJR19TRVBBUkFURQkyCS8qIHNlcGFyYXRlIHBsYW5lcyBvZiBkYXRhICovCisjZGVmaW5lCVRJRkZUQUdfUEFHRU5BTUUJCTI4NQkvKiBwYWdlIG5hbWUgaW1hZ2UgaXMgZnJvbSAqLworI2RlZmluZQlUSUZGVEFHX1hQT1NJVElPTgkJMjg2CS8qIHggcGFnZSBvZmZzZXQgb2YgaW1hZ2UgbGhzICovCisjZGVmaW5lCVRJRkZUQUdfWVBPU0lUSU9OCQkyODcJLyogeSBwYWdlIG9mZnNldCBvZiBpbWFnZSBsaHMgKi8KKyNkZWZpbmUJVElGRlRBR19GUkVFT0ZGU0VUUwkJMjg4CS8qICtieXRlIG9mZnNldCB0byBmcmVlIGJsb2NrICovCisjZGVmaW5lCVRJRkZUQUdfRlJFRUJZVEVDT1VOVFMJCTI4OQkvKiArc2l6ZXMgb2YgZnJlZSBibG9ja3MgKi8KKyNkZWZpbmUJVElGRlRBR19HUkFZUkVTUE9OU0VVTklUCTI5MAkvKiAkZ3JheSBzY2FsZSBjdXJ2ZSBhY2N1cmFjeSAqLworI2RlZmluZQkgICAgR1JBWVJFU1BPTlNFVU5JVF8xMFMJMQkvKiB0ZW50aHMgb2YgYSB1bml0ICovCisjZGVmaW5lCSAgICBHUkFZUkVTUE9OU0VVTklUXzEwMFMJMgkvKiBodW5kcmVkdGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgR1JBWVJFU1BPTlNFVU5JVF8xMDAwUwkzCS8qIHRob3VzYW5kdGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgR1JBWVJFU1BPTlNFVU5JVF8xMDAwMFMJNAkvKiB0ZW4tdGhvdXNhbmR0aHMgb2YgYSB1bml0ICovCisjZGVmaW5lCSAgICBHUkFZUkVTUE9OU0VVTklUXzEwMDAwMFMJNQkvKiBodW5kcmVkLXRob3VzYW5kdGhzICovCisjZGVmaW5lCVRJRkZUQUdfR1JBWVJFU1BPTlNFQ1VSVkUJMjkxCS8qICRncmF5IHNjYWxlIHJlc3BvbnNlIGN1cnZlICovCisjZGVmaW5lCVRJRkZUQUdfR1JPVVAzT1BUSU9OUwkJMjkyCS8qIDMyIGZsYWcgYml0cyAqLworI2RlZmluZQlUSUZGVEFHX1Q0T1BUSU9OUwkJMjkyCS8qIFRJRkYgNi4wIHByb3BlciBuYW1lIGFsaWFzICovCisjZGVmaW5lCSAgICBHUk9VUDNPUFRfMkRFTkNPRElORwkweDEJLyogMi1kaW1lbnNpb25hbCBjb2RpbmcgKi8KKyNkZWZpbmUJICAgIEdST1VQM09QVF9VTkNPTVBSRVNTRUQJMHgyCS8qIGRhdGEgbm90IGNvbXByZXNzZWQgKi8KKyNkZWZpbmUJICAgIEdST1VQM09QVF9GSUxMQklUUwkJMHg0CS8qIGZpbGwgdG8gYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZQlUSUZGVEFHX0dST1VQNE9QVElPTlMJCTI5MwkvKiAzMiBmbGFnIGJpdHMgKi8KKyNkZWZpbmUgVElGRlRBR19UNk9QVElPTlMgICAgICAgICAgICAgICAyOTMgICAgIC8qIFRJRkYgNi4wIHByb3BlciBuYW1lICovCisjZGVmaW5lCSAgICBHUk9VUDRPUFRfVU5DT01QUkVTU0VECTB4MgkvKiBkYXRhIG5vdCBjb21wcmVzc2VkICovCisjZGVmaW5lCVRJRkZUQUdfUkVTT0xVVElPTlVOSVQJCTI5NgkvKiB1bml0cyBvZiByZXNvbHV0aW9ucyAqLworI2RlZmluZQkgICAgUkVTVU5JVF9OT05FCQkxCS8qIG5vIG1lYW5pbmdmdWwgdW5pdHMgKi8KKyNkZWZpbmUJICAgIFJFU1VOSVRfSU5DSAkJMgkvKiBlbmdsaXNoICovCisjZGVmaW5lCSAgICBSRVNVTklUX0NFTlRJTUVURVIJCTMJLyogbWV0cmljICovCisjZGVmaW5lCVRJRkZUQUdfUEFHRU5VTUJFUgkJMjk3CS8qIHBhZ2UgbnVtYmVycyBvZiBtdWx0aS1wYWdlICovCisjZGVmaW5lCVRJRkZUQUdfQ09MT1JSRVNQT05TRVVOSVQJMzAwCS8qICRjb2xvciBjdXJ2ZSBhY2N1cmFjeSAqLworI2RlZmluZQkgICAgQ09MT1JSRVNQT05TRVVOSVRfMTBTCTEJLyogdGVudGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgQ09MT1JSRVNQT05TRVVOSVRfMTAwUwkyCS8qIGh1bmRyZWR0aHMgb2YgYSB1bml0ICovCisjZGVmaW5lCSAgICBDT0xPUlJFU1BPTlNFVU5JVF8xMDAwUwkzCS8qIHRob3VzYW5kdGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgQ09MT1JSRVNQT05TRVVOSVRfMTAwMDBTCTQJLyogdGVuLXRob3VzYW5kdGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgQ09MT1JSRVNQT05TRVVOSVRfMTAwMDAwUwk1CS8qIGh1bmRyZWQtdGhvdXNhbmR0aHMgKi8KKyNkZWZpbmUJVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OCTMwMQkvKiAhY29sb3JpbWV0cnkgaW5mbyAqLworI2RlZmluZQlUSUZGVEFHX1NPRlRXQVJFCQkzMDUJLyogbmFtZSAmIHJlbGVhc2UgKi8KKyNkZWZpbmUJVElGRlRBR19EQVRFVElNRQkJMzA2CS8qIGNyZWF0aW9uIGRhdGUgYW5kIHRpbWUgKi8KKyNkZWZpbmUJVElGRlRBR19BUlRJU1QJCQkzMTUJLyogY3JlYXRvciBvZiBpbWFnZSAqLworI2RlZmluZQlUSUZGVEFHX0hPU1RDT01QVVRFUgkJMzE2CS8qIG1hY2hpbmUgd2hlcmUgY3JlYXRlZCAqLworI2RlZmluZQlUSUZGVEFHX1BSRURJQ1RPUgkJMzE3CS8qIHByZWRpY3Rpb24gc2NoZW1lIHcvIExaVyAqLworI2RlZmluZSAgICAgUFJFRElDVE9SX05PTkUJCTEJLyogbm8gcHJlZGljdGlvbiBzY2hlbWUgdXNlZCAqLworI2RlZmluZSAgICAgUFJFRElDVE9SX0hPUklaT05UQUwJMgkvKiBob3Jpem9udGFsIGRpZmZlcmVuY2luZyAqLworI2RlZmluZSAgICAgUFJFRElDVE9SX0ZMT0FUSU5HUE9JTlQJMwkvKiBmbG9hdGluZyBwb2ludCBwcmVkaWN0b3IgKi8KKyNkZWZpbmUJVElGRlRBR19XSElURVBPSU5UCQkzMTgJLyogaW1hZ2Ugd2hpdGUgcG9pbnQgKi8KKyNkZWZpbmUJVElGRlRBR19QUklNQVJZQ0hST01BVElDSVRJRVMJMzE5CS8qICFwcmltYXJ5IGNocm9tYXRpY2l0aWVzICovCisjZGVmaW5lCVRJRkZUQUdfQ09MT1JNQVAJCTMyMAkvKiBSR0IgbWFwIGZvciBwYWxsZXR0ZSBpbWFnZSAqLworI2RlZmluZQlUSUZGVEFHX0hBTEZUT05FSElOVFMJCTMyMQkvKiAhaGlnaGxpZ2h0K3NoYWRvdyBpbmZvICovCisjZGVmaW5lCVRJRkZUQUdfVElMRVdJRFRICQkzMjIJLyogIXRpbGUgd2lkdGggaW4gcGl4ZWxzICovCisjZGVmaW5lCVRJRkZUQUdfVElMRUxFTkdUSAkJMzIzCS8qICF0aWxlIGhlaWdodCBpbiBwaXhlbHMgKi8KKyNkZWZpbmUgVElGRlRBR19USUxFT0ZGU0VUUwkJMzI0CS8qICFvZmZzZXRzIHRvIGRhdGEgdGlsZXMgKi8KKyNkZWZpbmUgVElGRlRBR19USUxFQllURUNPVU5UUwkJMzI1CS8qICFieXRlIGNvdW50cyBmb3IgdGlsZXMgKi8KKyNkZWZpbmUJVElGRlRBR19CQURGQVhMSU5FUwkJMzI2CS8qIGxpbmVzIHcvIHdyb25nIHBpeGVsIGNvdW50ICovCisjZGVmaW5lCVRJRkZUQUdfQ0xFQU5GQVhEQVRBCQkzMjcJLyogcmVnZW5lcmF0ZWQgbGluZSBpbmZvICovCisjZGVmaW5lCSAgICBDTEVBTkZBWERBVEFfQ0xFQU4JCTAJLyogbm8gZXJyb3JzIGRldGVjdGVkICovCisjZGVmaW5lCSAgICBDTEVBTkZBWERBVEFfUkVHRU5FUkFURUQJMQkvKiByZWNlaXZlciByZWdlbmVyYXRlZCBsaW5lcyAqLworI2RlZmluZQkgICAgQ0xFQU5GQVhEQVRBX1VOQ0xFQU4JMgkvKiB1bmNvcnJlY3RlZCBlcnJvcnMgZXhpc3QgKi8KKyNkZWZpbmUJVElGRlRBR19DT05TRUNVVElWRUJBREZBWExJTkVTCTMyOAkvKiBtYXggY29uc2VjdXRpdmUgYmFkIGxpbmVzICovCisjZGVmaW5lCVRJRkZUQUdfU1VCSUZECQkJMzMwCS8qIHN1YmltYWdlIGRlc2NyaXB0b3JzICovCisjZGVmaW5lCVRJRkZUQUdfSU5LU0VUCQkJMzMyCS8qICFpbmtzIGluIHNlcGFyYXRlZCBpbWFnZSAqLworI2RlZmluZQkgICAgSU5LU0VUX0NNWUsJCQkxCS8qICFjeWFuLW1hZ2VudGEteWVsbG93LWJsYWNrIGNvbG9yICovCisjZGVmaW5lCSAgICBJTktTRVRfTVVMVElJTksJCTIJLyogIW11bHRpLWluayBvciBoaS1maSBjb2xvciAqLworI2RlZmluZQlUSUZGVEFHX0lOS05BTUVTCQkzMzMJLyogIWFzY2lpIG5hbWVzIG9mIGlua3MgKi8KKyNkZWZpbmUJVElGRlRBR19OVU1CRVJPRklOS1MJCTMzNAkvKiAhbnVtYmVyIG9mIGlua3MgKi8KKyNkZWZpbmUJVElGRlRBR19ET1RSQU5HRQkJMzM2CS8qICEwJSBhbmQgMTAwJSBkb3QgY29kZXMgKi8KKyNkZWZpbmUJVElGRlRBR19UQVJHRVRQUklOVEVSCQkzMzcJLyogIXNlcGFyYXRpb24gdGFyZ2V0ICovCisjZGVmaW5lCVRJRkZUQUdfRVhUUkFTQU1QTEVTCQkzMzgJLyogIWluZm8gYWJvdXQgZXh0cmEgc2FtcGxlcyAqLworI2RlZmluZQkgICAgRVhUUkFTQU1QTEVfVU5TUEVDSUZJRUQJMAkvKiAhdW5zcGVjaWZpZWQgZGF0YSAqLworI2RlZmluZQkgICAgRVhUUkFTQU1QTEVfQVNTT0NBTFBIQQkxCS8qICFhc3NvY2lhdGVkIGFscGhhIGRhdGEgKi8KKyNkZWZpbmUJICAgIEVYVFJBU0FNUExFX1VOQVNTQUxQSEEJMgkvKiAhdW5hc3NvY2lhdGVkIGFscGhhIGRhdGEgKi8KKyNkZWZpbmUJVElGRlRBR19TQU1QTEVGT1JNQVQJCTMzOQkvKiAhZGF0YSBzYW1wbGUgZm9ybWF0ICovCisjZGVmaW5lCSAgICBTQU1QTEVGT1JNQVRfVUlOVAkJMQkvKiAhdW5zaWduZWQgaW50ZWdlciBkYXRhICovCisjZGVmaW5lCSAgICBTQU1QTEVGT1JNQVRfSU5UCQkyCS8qICFzaWduZWQgaW50ZWdlciBkYXRhICovCisjZGVmaW5lCSAgICBTQU1QTEVGT1JNQVRfSUVFRUZQCQkzCS8qICFJRUVFIGZsb2F0aW5nIHBvaW50IGRhdGEgKi8KKyNkZWZpbmUJICAgIFNBTVBMRUZPUk1BVF9WT0lECQk0CS8qICF1bnR5cGVkIGRhdGEgKi8KKyNkZWZpbmUJICAgIFNBTVBMRUZPUk1BVF9DT01QTEVYSU5UCTUJLyogIWNvbXBsZXggc2lnbmVkIGludCAqLworI2RlZmluZQkgICAgU0FNUExFRk9STUFUX0NPTVBMRVhJRUVFRlAJNgkvKiAhY29tcGxleCBpZWVlIGZsb2F0aW5nICovCisjZGVmaW5lCVRJRkZUQUdfU01JTlNBTVBMRVZBTFVFCQkzNDAJLyogIXZhcmlhYmxlIE1pblNhbXBsZVZhbHVlICovCisjZGVmaW5lCVRJRkZUQUdfU01BWFNBTVBMRVZBTFVFCQkzNDEJLyogIXZhcmlhYmxlIE1heFNhbXBsZVZhbHVlICovCisjZGVmaW5lCVRJRkZUQUdfQ0xJUFBBVEgJCTM0MwkvKiAlQ2xpcFBhdGgKKwkJCQkJCSAgIFtBZG9iZSBUSUZGIHRlY2hub3RlIDJdICovCisjZGVmaW5lCVRJRkZUQUdfWENMSVBQQVRIVU5JVFMJCTM0NAkvKiAlWENsaXBQYXRoVW5pdHMKKwkJCQkJCSAgIFtBZG9iZSBUSUZGIHRlY2hub3RlIDJdICovCisjZGVmaW5lCVRJRkZUQUdfWUNMSVBQQVRIVU5JVFMJCTM0NQkvKiAlWUNsaXBQYXRoVW5pdHMKKwkJCQkJCSAgIFtBZG9iZSBUSUZGIHRlY2hub3RlIDJdICovCisjZGVmaW5lCVRJRkZUQUdfSU5ERVhFRAkJCTM0NgkvKiAlSW5kZXhlZAorCQkJCQkJICAgW0Fkb2JlIFRJRkYgVGVjaG5vdGUgM10gKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHVEFCTEVTCQkzNDcJLyogJUpQRUcgdGFibGUgc3RyZWFtICovCisjZGVmaW5lCVRJRkZUQUdfT1BJUFJPWFkJCTM1MQkvKiAlT1BJIFByb3h5IFtBZG9iZSBUSUZGIHRlY2hub3RlXSAqLworLyogVGFncyA0MDAtNDM1IGFyZSBmcm9tIHRoZSBUSUZGL0ZYIHNwZWMgKi8KKyNkZWZpbmUgVElGRlRBR19HTE9CQUxQQVJBTUVURVJTSUZECTQwMAkvKiAhICovCisjZGVmaW5lIFRJRkZUQUdfUFJPRklMRVRZUEUJCQk0MDEJLyogISAqLworI2RlZmluZSAgICAgUFJPRklMRVRZUEVfVU5TUEVDSUZJRUQJMAkvKiAhICovCisjZGVmaW5lICAgICBQUk9GSUxFVFlQRV9HM19GQVgJCTEJLyogISAqLworI2RlZmluZSBUSUZGVEFHX0ZBWFBST0ZJTEUJCQk0MDIJLyogISAqLworI2RlZmluZSAgICAgRkFYUFJPRklMRV9TCQkJMQkvKiAhVElGRi9GWCBGQVggcHJvZmlsZSBTICovCisjZGVmaW5lICAgICBGQVhQUk9GSUxFX0YJCQkyCS8qICFUSUZGL0ZYIEZBWCBwcm9maWxlIEYgKi8KKyNkZWZpbmUgICAgIEZBWFBST0ZJTEVfSgkJCTMJLyogIVRJRkYvRlggRkFYIHByb2ZpbGUgSiAqLworI2RlZmluZSAgICAgRkFYUFJPRklMRV9DCQkJNAkvKiAhVElGRi9GWCBGQVggcHJvZmlsZSBDICovCisjZGVmaW5lICAgICBGQVhQUk9GSUxFX0wJCQk1CS8qICFUSUZGL0ZYIEZBWCBwcm9maWxlIEwgKi8KKyNkZWZpbmUgICAgIEZBWFBST0ZJTEVfTQkJCTYJLyogIVRJRkYvRlggRkFYIHByb2ZpbGUgTE0gKi8KKyNkZWZpbmUgVElGRlRBR19DT0RJTkdNRVRIT0RTCQk0MDMJLyogIVRJRkYvRlggY29kaW5nIG1ldGhvZHMgKi8KKyNkZWZpbmUgICAgIENPRElOR01FVEhPRFNfVDRfMUQJCSgxIDw8IDEpCS8qICFULjQgMUQgKi8KKyNkZWZpbmUgICAgIENPRElOR01FVEhPRFNfVDRfMkQJCSgxIDw8IDIpCS8qICFULjQgMkQgKi8KKyNkZWZpbmUgICAgIENPRElOR01FVEhPRFNfVDYJCSgxIDw8IDMpCS8qICFULjYgKi8KKyNkZWZpbmUgICAgIENPRElOR01FVEhPRFNfVDg1IAkJKDEgPDwgNCkJLyogIVQuODUgSkJJRyAqLworI2RlZmluZSAgICAgQ09ESU5HTUVUSE9EU19UNDIgCQkoMSA8PCA1KQkvKiAhVC40MiBKUEVHICovCisjZGVmaW5lICAgICBDT0RJTkdNRVRIT0RTX1Q0MwkJKDEgPDwgNikJLyogIVQuNDMgY29sb3VyIGJ5IGxheWVyZWQgSkJJRyAqLworI2RlZmluZSBUSUZGVEFHX1ZFUlNJT05ZRUFSCQkJNDA0CS8qICFUSUZGL0ZYIHZlcnNpb24geWVhciAqLworI2RlZmluZSBUSUZGVEFHX01PREVOVU1CRVIJCQk0MDUJLyogIVRJRkYvRlggbW9kZSBudW1iZXIgKi8KKyNkZWZpbmUgVElGRlRBR19ERUNPREUJCQkJNDMzCS8qICFUSUZGL0ZYIGRlY29kZSAqLworI2RlZmluZSBUSUZGVEFHX0lNQUdFQkFTRUNPTE9SCQk0MzQJLyogIVRJRkYvRlggaW1hZ2UgYmFzZSBjb2xvdXIgKi8KKyNkZWZpbmUgVElGRlRBR19UODJPUFRJT05TCQkJNDM1CS8qICFUSUZGL0ZYIFQuODIgb3B0aW9ucyAqLworLyoKKyAqIFRhZ3MgNTEyLTUyMSBhcmUgb2Jzb2xldGVkIGJ5IFRlY2huaWNhbCBOb3RlICMyIHdoaWNoIHNwZWNpZmllcyBhCisgKiByZXZpc2VkIEpQRUctaW4tVElGRiBzY2hlbWUuCisgKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHUFJPQwkJNTEyCS8qICFKUEVHIHByb2Nlc3NpbmcgYWxnb3JpdGhtICovCisjZGVmaW5lCSAgICBKUEVHUFJPQ19CQVNFTElORQkJMQkvKiAhYmFzZWxpbmUgc2VxdWVudGlhbCAqLworI2RlZmluZQkgICAgSlBFR1BST0NfTE9TU0xFU1MJCTE0CS8qICFIdWZmbWFuIGNvZGVkIGxvc3NsZXNzICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR0lGT0ZGU0VUCQk1MTMJLyogIXBvaW50ZXIgdG8gU09JIG1hcmtlciAqLworI2RlZmluZQlUSUZGVEFHX0pQRUdJRkJZVEVDT1VOVAkJNTE0CS8qICFKRklGIHN0cmVhbSBsZW5ndGggKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHUkVTVEFSVElOVEVSVkFMCTUxNQkvKiAhcmVzdGFydCBpbnRlcnZhbCBsZW5ndGggKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHTE9TU0xFU1NQUkVESUNUT1JTCTUxNwkvKiAhbG9zc2xlc3MgcHJvYyBwcmVkaWN0b3IgKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHUE9JTlRUUkFOU0ZPUk0JNTE4CS8qICFsb3NzbGVzcyBwb2ludCB0cmFuc2Zvcm0gKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHUVRBQkxFUwkJNTE5CS8qICFRIG1hdHJpY2Ugb2Zmc2V0cyAqLworI2RlZmluZQlUSUZGVEFHX0pQRUdEQ1RBQkxFUwkJNTIwCS8qICFEQ1QgdGFibGUgb2Zmc2V0cyAqLworI2RlZmluZQlUSUZGVEFHX0pQRUdBQ1RBQkxFUwkJNTIxCS8qICFBQyBjb2VmZmljaWVudCBvZmZzZXRzICovCisjZGVmaW5lCVRJRkZUQUdfWUNCQ1JDT0VGRklDSUVOVFMJNTI5CS8qICFSR0IgLT4gWUNiQ3IgdHJhbnNmb3JtICovCisjZGVmaW5lCVRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORwk1MzAJLyogIVlDYkNyIHN1YnNhbXBsaW5nIGZhY3RvcnMgKi8KKyNkZWZpbmUJVElGRlRBR19ZQ0JDUlBPU0lUSU9OSU5HCTUzMQkvKiAhc3Vic2FtcGxlIHBvc2l0aW9uaW5nICovCisjZGVmaW5lCSAgICBZQ0JDUlBPU0lUSU9OX0NFTlRFUkVECTEJLyogIWFzIGluIFBvc3RTY3JpcHQgTGV2ZWwgMiAqLworI2RlZmluZQkgICAgWUNCQ1JQT1NJVElPTl9DT1NJVEVECTIJLyogIWFzIGluIENDSVIgNjAxLTEgKi8KKyNkZWZpbmUJVElGRlRBR19SRUZFUkVOQ0VCTEFDS1dISVRFCTUzMgkvKiAhY29sb3JpbWV0cnkgaW5mbyAqLworI2RlZmluZSBUSUZGVEFHX1NUUklQUk9XQ09VTlRTCQk1NTkgLyogIVRJRkYvRlggc3RyaXAgcm93IGNvdW50cyAqLworI2RlZmluZQlUSUZGVEFHX1hNTFBBQ0tFVAkJNzAwCS8qICVYTUwgcGFja2V0CisJCQkJCQkgICBbQWRvYmUgWE1QIFNwZWNpZmljYXRpb24sCisJCQkJCQkgICBKYW51YXJ5IDIwMDQgKi8KKyNkZWZpbmUgVElGRlRBR19PUElJTUFHRUlECQkzMjc4MQkvKiAlT1BJIEltYWdlSUQKKwkJCQkJCSAgIFtBZG9iZSBUSUZGIHRlY2hub3RlXSAqLworLyogdGFncyAzMjk1Mi0zMjk1NiBhcmUgcHJpdmF0ZSB0YWdzIHJlZ2lzdGVyZWQgdG8gSXNsYW5kIEdyYXBoaWNzICovCisjZGVmaW5lIFRJRkZUQUdfUkVGUFRTCQkJMzI5NTMJLyogaW1hZ2UgcmVmZXJlbmNlIHBvaW50cyAqLworI2RlZmluZSBUSUZGVEFHX1JFR0lPTlRBQ0tQT0lOVAkJMzI5NTQJLyogcmVnaW9uLXhmb3JtIHRhY2sgcG9pbnQgKi8KKyNkZWZpbmUgVElGRlRBR19SRUdJT05XQVJQQ09STkVSUwkzMjk1NQkvKiB3YXJwIHF1YWRyaWxhdGVyYWwgKi8KKyNkZWZpbmUgVElGRlRBR19SRUdJT05BRkZJTkUJCTMyOTU2CS8qIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXQgKi8KKy8qIHRhZ3MgMzI5OTUtMzI5OTkgYXJlIHByaXZhdGUgdGFncyByZWdpc3RlcmVkIHRvIFNHSSAqLworI2RlZmluZQlUSUZGVEFHX01BVFRFSU5HCQkzMjk5NQkvKiAkdXNlIEV4dHJhU2FtcGxlcyAqLworI2RlZmluZQlUSUZGVEFHX0RBVEFUWVBFCQkzMjk5NgkvKiAkdXNlIFNhbXBsZUZvcm1hdCAqLworI2RlZmluZQlUSUZGVEFHX0lNQUdFREVQVEgJCTMyOTk3CS8qIHogZGVwdGggb2YgaW1hZ2UgKi8KKyNkZWZpbmUJVElGRlRBR19USUxFREVQVEgJCTMyOTk4CS8qIHogZGVwdGgvZGF0YSB0aWxlICovCisvKiB0YWdzIDMzMzAwLTMzMzA5IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBQaXhhciAqLworLyoKKyAqIFRJRkZUQUdfUElYQVJfSU1BR0VGVUxMV0lEVEggYW5kIFRJRkZUQUdfUElYQVJfSU1BR0VGVUxMTEVOR1RICisgKiBhcmUgc2V0IHdoZW4gYW4gaW1hZ2UgaGFzIGJlZW4gY3JvcHBlZCBvdXQgb2YgYSBsYXJnZXIgaW1hZ2UuICAKKyAqIFRoZXkgcmVmbGVjdCB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgdW5jcm9wcGVkIGltYWdlLgorICogVGhlIFRJRkZUQUdfWFBPU0lUSU9OIGFuZCBUSUZGVEFHX1lQT1NJVElPTiBjYW4gYmUgdXNlZAorICogdG8gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgc21hbGxlciBpbWFnZSBpbiB0aGUgbGFyZ2VyIG9uZS4KKyAqLworI2RlZmluZSBUSUZGVEFHX1BJWEFSX0lNQUdFRlVMTFdJRFRIICAgIDMzMzAwICAgLyogZnVsbCBpbWFnZSBzaXplIGluIHggKi8KKyNkZWZpbmUgVElGRlRBR19QSVhBUl9JTUFHRUZVTExMRU5HVEggICAzMzMwMSAgIC8qIGZ1bGwgaW1hZ2Ugc2l6ZSBpbiB5ICovCisgLyogVGFncyAzMzMwMi0zMzMwNiBhcmUgdXNlZCB0byBpZGVudGlmeSBzcGVjaWFsIGltYWdlIG1vZGVzIGFuZCBkYXRhCisgICogdXNlZCBieSBQaXhhcidzIHRleHR1cmUgZm9ybWF0cy4KKyAgKi8KKyNkZWZpbmUgVElGRlRBR19QSVhBUl9URVhUVVJFRk9STUFUCTMzMzAyCS8qIHRleHR1cmUgbWFwIGZvcm1hdCAqLworI2RlZmluZSBUSUZGVEFHX1BJWEFSX1dSQVBNT0RFUwkJMzMzMDMJLyogcyAmIHQgd3JhcCBtb2RlcyAqLworI2RlZmluZSBUSUZGVEFHX1BJWEFSX0ZPVkNPVAkJMzMzMDQJLyogY290YW4oZm92KSBmb3IgZW52LiBtYXBzICovCisjZGVmaW5lIFRJRkZUQUdfUElYQVJfTUFUUklYX1dPUkxEVE9TQ1JFRU4gMzMzMDUKKyNkZWZpbmUgVElGRlRBR19QSVhBUl9NQVRSSVhfV09STERUT0NBTUVSQSAzMzMwNgorLyogdGFnIDMzNDA1IGlzIGEgcHJpdmF0ZSB0YWcgcmVnaXN0ZXJlZCB0byBFYXN0bWFuIEtvZGFrICovCisjZGVmaW5lIFRJRkZUQUdfV1JJVEVSU0VSSUFMTlVNQkVSICAgICAgMzM0MDUgICAvKiBkZXZpY2Ugc2VyaWFsIG51bWJlciAqLworLyogdGFnIDMzNDMyIGlzIGxpc3RlZCBpbiB0aGUgNi4wIHNwZWMgdy8gdW5rbm93biBvd25lcnNoaXAgKi8KKyNkZWZpbmUJVElGRlRBR19DT1BZUklHSFQJCTMzNDMyCS8qIGNvcHlyaWdodCBzdHJpbmcgKi8KKy8qIElQVEMgVEFHIGZyb20gUmljaFRJRkYgc3BlY2lmaWNhdGlvbnMgKi8KKyNkZWZpbmUgVElGRlRBR19SSUNIVElGRklQVEMJCTMzNzIzCisvKiAzNDAxNi0zNDAyOSBhcmUgcmVzZXJ2ZWQgZm9yIEFOU0kgSVQ4IFRJRkYvSVQgPGRrZWxseUBhcGFnby5jb20pICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4U0lURQkJCTM0MDE2CS8qIHNpdGUgbmFtZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOENPTE9SU0VRVUVOQ0UJMzQwMTcJLyogY29sb3Igc2VxLiBbUkdCLENNWUssZXRjXSAqLworI2RlZmluZSBUSUZGVEFHX0lUOEhFQURFUgkJMzQwMTgJLyogRERFUyBIZWFkZXIgKi8KKyNkZWZpbmUgVElGRlRBR19JVDhSQVNURVJQQURESU5HCTM0MDE5CS8qIHJhc3RlciBzY2FubGluZSBwYWRkaW5nICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QklUU1BFUlJVTkxFTkdUSAkzNDAyMAkvKiAjIG9mIGJpdHMgaW4gc2hvcnQgcnVuICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QklUU1BFUkVYVEVOREVEUlVOTEVOR1RIIDM0MDIxLyogIyBvZiBiaXRzIGluIGxvbmcgcnVuICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4Q09MT1JUQUJMRQkJMzQwMjIJLyogTFcgY29sb3J0YWJsZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOElNQUdFQ09MT1JJTkRJQ0FUT1IJMzQwMjMJLyogQlAvQkwgaW1hZ2UgY29sb3Igc3dpdGNoICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QktHQ09MT1JJTkRJQ0FUT1IJMzQwMjQJLyogQlAvQkwgYmcgY29sb3Igc3dpdGNoICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4SU1BR0VDT0xPUlZBTFVFCTM0MDI1CS8qIEJQL0JMIGltYWdlIGNvbG9yIHZhbHVlICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QktHQ09MT1JWQUxVRQkzNDAyNgkvKiBCUC9CTCBiZyBjb2xvciB2YWx1ZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOFBJWEVMSU5URU5TSVRZUkFOR0UJMzQwMjcJLyogTVAgcGl4ZWwgaW50ZW5zaXR5IHZhbHVlICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4VFJBTlNQQVJFTkNZSU5ESUNBVE9SIDM0MDI4CS8qIEhDIHRyYW5zcGFyZW5jeSBzd2l0Y2ggKi8KKyNkZWZpbmUgVElGRlRBR19JVDhDT0xPUkNIQVJBQ1RFUklaQVRJT04gMzQwMjkJLyogY29sb3IgY2hhcmFjdGVyLiB0YWJsZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOEhDVVNBR0UJCTM0MDMwCS8qIEhDIHVzYWdlIGluZGljYXRvciAqLworI2RlZmluZSBUSUZGVEFHX0lUOFRSQVBJTkRJQ0FUT1IJMzQwMzEJLyogVHJhcHBpbmcgaW5kaWNhdG9yCisJCQkJCQkgICAodW50cmFwcGVkPTAsIHRyYXBwZWQ9MSkgKi8KKyNkZWZpbmUgVElGRlRBR19JVDhDTVlLRVFVSVZBTEVOVAkzNDAzMgkvKiBDTVlLIGNvbG9yIGVxdWl2YWxlbnRzICovCisvKiB0YWdzIDM0MjMyLTM0MjM2IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBUZXhhcyBJbnN0cnVtZW50cyAqLworI2RlZmluZSBUSUZGVEFHX0ZSQU1FQ09VTlQgICAgICAgICAgICAgIDM0MjMyICAgLyogU2VxdWVuY2UgRnJhbWUgQ291bnQgKi8KKy8qIHRhZyAzNDM3NyBpcyBwcml2YXRlIHRhZyByZWdpc3RlcmVkIHRvIEFkb2JlIGZvciBQaG90b1Nob3AgKi8KKyNkZWZpbmUgVElGRlRBR19QSE9UT1NIT1AJCTM0Mzc3IAorLyogdGFncyAzNDY2NSwgMzQ4NTMgYW5kIDQwOTY1IGFyZSBkb2N1bWVudGVkIGluIEVYSUYgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBUSUZGVEFHX0VYSUZJRkQJCQkzNDY2NQkvKiBQb2ludGVyIHRvIEVYSUYgcHJpdmF0ZSBkaXJlY3RvcnkgKi8KKy8qIHRhZyAzNDc1MCBpcyBhIHByaXZhdGUgdGFnIHJlZ2lzdGVyZWQgdG8gQWRvYmU/ICovCisjZGVmaW5lIFRJRkZUQUdfSUNDUFJPRklMRQkJMzQ2NzUJLyogSUNDIHByb2ZpbGUgZGF0YSAqLworI2RlZmluZSBUSUZGVEFHX0lNQUdFTEFZRVIJCTM0NzMyCS8qICFUSUZGL0ZYIGltYWdlIGxheWVyIGluZm9ybWF0aW9uICovCisvKiB0YWcgMzQ3NTAgaXMgYSBwcml2YXRlIHRhZyByZWdpc3RlcmVkIHRvIFBpeGVsIE1hZ2ljICovCisjZGVmaW5lCVRJRkZUQUdfSkJJR09QVElPTlMJCTM0NzUwCS8qIEpCSUcgb3B0aW9ucyAqLworI2RlZmluZSBUSUZGVEFHX0dQU0lGRAkJCTM0ODUzCS8qIFBvaW50ZXIgdG8gR1BTIHByaXZhdGUgZGlyZWN0b3J5ICovCisvKiB0YWdzIDM0OTA4LTM0OTE0IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBTR0kgKi8KKyNkZWZpbmUJVElGRlRBR19GQVhSRUNWUEFSQU1TCQkzNDkwOAkvKiBlbmNvZGVkIENsYXNzIDIgc2VzLiBwYXJtcyAqLworI2RlZmluZQlUSUZGVEFHX0ZBWFNVQkFERFJFU1MJCTM0OTA5CS8qIHJlY2VpdmVkIFN1YkFkZHIgc3RyaW5nICovCisjZGVmaW5lCVRJRkZUQUdfRkFYUkVDVlRJTUUJCTM0OTEwCS8qIHJlY2VpdmUgdGltZSAoc2VjcykgKi8KKyNkZWZpbmUJVElGRlRBR19GQVhEQ1MJCQkzNDkxMQkvKiBlbmNvZGVkIGZheCBzZXMuIHBhcmFtcywgVGFibGUgMi9ULjMwICovCisvKiB0YWdzIDM3NDM5LTM3NDQzIGFyZSByZWdpc3RlcmVkIHRvIFNHSSA8Z3JlZ2xAc2dpLmNvbT4gKi8KKyNkZWZpbmUgVElGRlRBR19TVE9OSVRTCQkJMzc0MzkJLyogU2FtcGxlIHZhbHVlIHRvIE5pdHMgKi8KKy8qIHRhZyAzNDkyOSBpcyBhIHByaXZhdGUgdGFnIHJlZ2lzdGVyZWQgdG8gRmVkRXggKi8KKyNkZWZpbmUJVElGRlRBR19GRURFWF9FRFIJCTM0OTI5CS8qIHVua25vd24gdXNlICovCisjZGVmaW5lIFRJRkZUQUdfSU5URVJPUEVSQUJJTElUWUlGRAk0MDk2NQkvKiBQb2ludGVyIHRvIEludGVyb3BlcmFiaWxpdHkgcHJpdmF0ZSBkaXJlY3RvcnkgKi8KKy8qIEFkb2JlIERpZ2l0YWwgTmVnYXRpdmUgKERORykgZm9ybWF0IHRhZ3MgKi8KKyNkZWZpbmUgVElGRlRBR19ETkdWRVJTSU9OCQk1MDcwNgkvKiAmRE5HIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFRJRkZUQUdfRE5HQkFDS1dBUkRWRVJTSU9OCTUwNzA3CS8qICZETkcgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCisjZGVmaW5lIFRJRkZUQUdfVU5JUVVFQ0FNRVJBTU9ERUwJNTA3MDgJLyogJm5hbWUgZm9yIHRoZSBjYW1lcmEgbW9kZWwgKi8KKyNkZWZpbmUgVElGRlRBR19MT0NBTElaRURDQU1FUkFNT0RFTAk1MDcwOQkvKiAmbG9jYWxpemVkIGNhbWVyYSBtb2RlbAorCQkJCQkJICAgbmFtZSAqLworI2RlZmluZSBUSUZGVEFHX0NGQVBMQU5FQ09MT1IJCTUwNzEwCS8qICZDRkFQYXR0ZXJuLT5MaW5lYXJSYXcgc3BhY2UKKwkJCQkJCSAgIG1hcHBpbmcgKi8KKyNkZWZpbmUgVElGRlRBR19DRkFMQVlPVVQJCTUwNzExCS8qICZzcGF0aWFsIGxheW91dCBvZiB0aGUgQ0ZBICovCisjZGVmaW5lIFRJRkZUQUdfTElORUFSSVpBVElPTlRBQkxFCTUwNzEyCS8qICZsb29rdXAgdGFibGUgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgVElGRlRBR19CTEFDS0xFVkVMUkVQRUFURElNCTUwNzEzCS8qICZyZXBlYXQgcGF0dGVybiBzaXplIGZvcgorCQkJCQkJICAgdGhlIEJsYWNrTGV2ZWwgdGFnICovCisjZGVmaW5lIFRJRkZUQUdfQkxBQ0tMRVZFTAkJNTA3MTQJLyogJnplcm8gbGlnaHQgZW5jb2RpbmcgbGV2ZWwgKi8KKyNkZWZpbmUgVElGRlRBR19CTEFDS0xFVkVMREVMVEFICTUwNzE1CS8qICZ6ZXJvIGxpZ2h0IGVuY29kaW5nIGxldmVsCisJCQkJCQkgICBkaWZmZXJlbmNlcyAoY29sdW1ucykgKi8KKyNkZWZpbmUgVElGRlRBR19CTEFDS0xFVkVMREVMVEFWCTUwNzE2CS8qICZ6ZXJvIGxpZ2h0IGVuY29kaW5nIGxldmVsCisJCQkJCQkgICBkaWZmZXJlbmNlcyAocm93cykgKi8KKyNkZWZpbmUgVElGRlRBR19XSElURUxFVkVMCQk1MDcxNwkvKiAmZnVsbHkgc2F0dXJhdGVkIGVuY29kaW5nCisJCQkJCQkgICBsZXZlbCAqLworI2RlZmluZSBUSUZGVEFHX0RFRkFVTFRTQ0FMRQkJNTA3MTgJLyogJmRlZmF1bHQgc2NhbGUgZmFjdG9ycyAqLworI2RlZmluZSBUSUZGVEFHX0RFRkFVTFRDUk9QT1JJR0lOCTUwNzE5CS8qICZvcmlnaW4gb2YgdGhlIGZpbmFsIGltYWdlCisJCQkJCQkgICBhcmVhICovCisjZGVmaW5lIFRJRkZUQUdfREVGQVVMVENST1BTSVpFCQk1MDcyMAkvKiAmc2l6ZSBvZiB0aGUgZmluYWwgaW1hZ2UgCisJCQkJCQkgICBhcmVhICovCisjZGVmaW5lIFRJRkZUQUdfQ09MT1JNQVRSSVgxCQk1MDcyMQkvKiAmWFlaLT5yZWZlcmVuY2UgY29sb3Igc3BhY2UKKwkJCQkJCSAgIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAxICovCisjZGVmaW5lIFRJRkZUQUdfQ09MT1JNQVRSSVgyCQk1MDcyMgkvKiAmWFlaLT5yZWZlcmVuY2UgY29sb3Igc3BhY2UKKwkJCQkJCSAgIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAyICovCisjZGVmaW5lIFRJRkZUQUdfQ0FNRVJBQ0FMSUJSQVRJT04xCTUwNzIzCS8qICZjYWxpYnJhdGlvbiBtYXRyaXggMSAqLworI2RlZmluZSBUSUZGVEFHX0NBTUVSQUNBTElCUkFUSU9OMgk1MDcyNAkvKiAmY2FsaWJyYXRpb24gbWF0cml4IDIgKi8KKyNkZWZpbmUgVElGRlRBR19SRURVQ1RJT05NQVRSSVgxCTUwNzI1CS8qICZkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24KKwkJCQkJCSAgIG1hdHJpeCAxICovCisjZGVmaW5lIFRJRkZUQUdfUkVEVUNUSU9OTUFUUklYMgk1MDcyNgkvKiAmZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCisJCQkJCQkgICBtYXRyaXggMiAqLworI2RlZmluZSBUSUZGVEFHX0FOQUxPR0JBTEFOQ0UJCTUwNzI3CS8qICZnYWluIGFwcGxpZWQgdGhlIHN0b3JlZCByYXcKKwkJCQkJCSAgIHZhbHVlcyovCisjZGVmaW5lIFRJRkZUQUdfQVNTSE9UTkVVVFJBTAkJNTA3MjgJLyogJnNlbGVjdGVkIHdoaXRlIGJhbGFuY2UgaW4KKwkJCQkJCSAgIGxpbmVhciByZWZlcmVuY2Ugc3BhY2UgKi8KKyNkZWZpbmUgVElGRlRBR19BU1NIT1RXSElURVhZCQk1MDcyOQkvKiAmc2VsZWN0ZWQgd2hpdGUgYmFsYW5jZSBpbgorCQkJCQkJICAgeC15IGNocm9tYXRpY2l0eQorCQkJCQkJICAgY29vcmRpbmF0ZXMgKi8KKyNkZWZpbmUgVElGRlRBR19CQVNFTElORUVYUE9TVVJFCTUwNzMwCS8qICZob3cgbXVjaCB0byBtb3ZlIHRoZSB6ZXJvCisJCQkJCQkgICBwb2ludCAqLworI2RlZmluZSBUSUZGVEFHX0JBU0VMSU5FTk9JU0UJCTUwNzMxCS8qICZyZWxhdGl2ZSBub2lzZSBsZXZlbCAqLworI2RlZmluZSBUSUZGVEFHX0JBU0VMSU5FU0hBUlBORVNTCTUwNzMyCS8qICZyZWxhdGl2ZSBhbW91bnQgb2YKKwkJCQkJCSAgIHNoYXJwZW5pbmcgKi8KKyNkZWZpbmUgVElGRlRBR19CQVlFUkdSRUVOU1BMSVQJCTUwNzMzCS8qICZob3cgY2xvc2VseSB0aGUgdmFsdWVzIG9mCisJCQkJCQkgICB0aGUgZ3JlZW4gcGl4ZWxzIGluIHRoZQorCQkJCQkJICAgYmx1ZS9ncmVlbiByb3dzIHRyYWNrIHRoZQorCQkJCQkJICAgdmFsdWVzIG9mIHRoZSBncmVlbiBwaXhlbHMKKwkJCQkJCSAgIGluIHRoZSByZWQvZ3JlZW4gcm93cyAqLworI2RlZmluZSBUSUZGVEFHX0xJTkVBUlJFU1BPTlNFTElNSVQJNTA3MzQJLyogJm5vbi1saW5lYXIgZW5jb2RpbmcgcmFuZ2UgKi8KKyNkZWZpbmUgVElGRlRBR19DQU1FUkFTRVJJQUxOVU1CRVIJNTA3MzUJLyogJmNhbWVyYSdzIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgVElGRlRBR19MRU5TSU5GTwkJNTA3MzYJLyogaW5mbyBhYm91dCB0aGUgbGVucyAqLworI2RlZmluZSBUSUZGVEFHX0NIUk9NQUJMVVJSQURJVVMJNTA3MzcJLyogJmNocm9tYSBibHVyIHJhZGl1cyAqLworI2RlZmluZSBUSUZGVEFHX0FOVElBTElBU1NUUkVOR1RICTUwNzM4CS8qICZyZWxhdGl2ZSBzdHJlbmd0aCBvZiB0aGUKKwkJCQkJCSAgIGNhbWVyYSdzIGFudGktYWxpYXMgZmlsdGVyICovCisjZGVmaW5lIFRJRkZUQUdfU0hBRE9XU0NBTEUJCTUwNzM5CS8qICZ1c2VkIGJ5IEFkb2JlIENhbWVyYSBSYXcgKi8KKyNkZWZpbmUgVElGRlRBR19ETkdQUklWQVRFREFUQQkJNTA3NDAJLyogJm1hbnVmYWN0dXJlcidzIHByaXZhdGUgZGF0YSAqLworI2RlZmluZSBUSUZGVEFHX01BS0VSTk9URVNBRkVUWQkJNTA3NDEJLyogJndoZXRoZXIgdGhlIEVYSUYgTWFrZXJOb3RlCisJCQkJCQkgICB0YWcgaXMgc2FmZSB0byBwcmVzZXJ2ZQorCQkJCQkJICAgYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUKKwkJCQkJCSAgIEVYSUYgZGF0YSAqLworI2RlZmluZQlUSUZGVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDEJNTA3NzgJLyogJmlsbHVtaW5hbnQgMSAqLworI2RlZmluZSBUSUZGVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDIJNTA3NzkJLyogJmlsbHVtaW5hbnQgMiAqLworI2RlZmluZSBUSUZGVEFHX0JFU1RRVUFMSVRZU0NBTEUJNTA3ODAJLyogJmJlc3QgcXVhbGl0eSBtdWx0aXBsaWVyICovCisjZGVmaW5lIFRJRkZUQUdfUkFXREFUQVVOSVFVRUlECQk1MDc4MQkvKiAmdW5pcXVlIGlkZW50aWZpZXIgZm9yCisJCQkJCQkgICB0aGUgcmF3IGltYWdlIGRhdGEgKi8KKyNkZWZpbmUgVElGRlRBR19PUklHSU5BTFJBV0ZJTEVOQU1FCTUwODI3CS8qICZmaWxlIG5hbWUgb2YgdGhlIG9yaWdpbmFsCisJCQkJCQkgICByYXcgZmlsZSAqLworI2RlZmluZSBUSUZGVEFHX09SSUdJTkFMUkFXRklMRURBVEEJNTA4MjgJLyogJmNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbAorCQkJCQkJICAgcmF3IGZpbGUgKi8KKyNkZWZpbmUgVElGRlRBR19BQ1RJVkVBUkVBCQk1MDgyOQkvKiAmYWN0aXZlIChub24tbWFza2VkKSBwaXhlbHMKKwkJCQkJCSAgIG9mIHRoZSBzZW5zb3IgKi8KKyNkZWZpbmUgVElGRlRBR19NQVNLRURBUkVBUwkJNTA4MzAJLyogJmxpc3Qgb2YgY29vcmRpbmF0ZXMKKwkJCQkJCSAgIG9mIGZ1bGx5IG1hc2tlZCBwaXhlbHMgKi8KKyNkZWZpbmUgVElGRlRBR19BU1NIT1RJQ0NQUk9GSUxFCTUwODMxCS8qICZ0aGVzZSB0d28gdGFncyB1c2VkIHRvICovCisjZGVmaW5lIFRJRkZUQUdfQVNTSE9UUFJFUFJPRklMRU1BVFJJWAk1MDgzMgkvKiBtYXAgY2FtZXJhcydzIGNvbG9yIHNwYWNlCisJCQkJCQkgICBpbnRvIElDQyBwcm9maWxlIHNwYWNlICovCisjZGVmaW5lIFRJRkZUQUdfQ1VSUkVOVElDQ1BST0ZJTEUJNTA4MzMJLyogJiAqLworI2RlZmluZSBUSUZGVEFHX0NVUlJFTlRQUkVQUk9GSUxFTUFUUklYCTUwODM0CS8qICYgKi8KKy8qIHRhZyA2NTUzNSBpcyBhbiB1bmRlZmluZWQgdGFnIHVzZWQgYnkgRWFzdG1hbiBLb2RhayAqLworI2RlZmluZSBUSUZGVEFHX0RDU0hVRVNISUZUVkFMVUVTICAgICAgIDY1NTM1ICAgLyogaHVlIHNoaWZ0IGNvcnJlY3Rpb24gZGF0YSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgYGBwc2V1ZG8gdGFncycnIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbAorICogY29kZWMtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eS4gIFRoZXNlIHRhZ3MgYXJlIG5vdCB3cml0dGVuIHRvIGZpbGUuCisgKiBOb3RlIHRoYXQgdGhlc2UgdmFsdWVzIHN0YXJ0IGF0IDB4ZmZmZisxIHNvIHRoYXQgdGhleSdsbCBuZXZlcgorICogY29sbGlkZSB3aXRoIEFsZHVzLWFzc2lnbmVkIHRhZ3MuCisgKgorICogSWYgeW91IHdhbnQgeW91ciBwcml2YXRlIHBzZXVkbyB0YWdzIGBgcmVnaXN0ZXJlZCcnIChpLmUuIGFkZGVkIHRvCisgKiB0aGlzIGZpbGUpLCBwbGVhc2UgcG9zdCBhIGJ1ZyByZXBvcnQgdmlhIHRoZSB0cmFja2luZyBzeXN0ZW0gYXQKKyAqIGh0dHA6Ly93d3cucmVtb3Rlc2Vuc2luZy5vcmcvbGlidGlmZi9idWdzLmh0bWwgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKyAqIEMgZGVmaW5pdGlvbnMgdG8gYWRkLgorICovCisjZGVmaW5lCVRJRkZUQUdfRkFYTU9ERQkJCTY1NTM2CS8qIEdyb3VwIDMvNCBmb3JtYXQgY29udHJvbCAqLworI2RlZmluZQkgICAgRkFYTU9ERV9DTEFTU0lDCTB4MDAwMAkJLyogZGVmYXVsdCwgaW5jbHVkZSBSVEMgKi8KKyNkZWZpbmUJICAgIEZBWE1PREVfTk9SVEMJMHgwMDAxCQkvKiBubyBSVEMgYXQgZW5kIG9mIGRhdGEgKi8KKyNkZWZpbmUJICAgIEZBWE1PREVfTk9FT0wJMHgwMDAyCQkvKiBubyBFT0wgY29kZSBhdCBlbmQgb2Ygcm93ICovCisjZGVmaW5lCSAgICBGQVhNT0RFX0JZVEVBTElHTgkweDAwMDQJCS8qIGJ5dGUgYWxpZ24gcm93ICovCisjZGVmaW5lCSAgICBGQVhNT0RFX1dPUkRBTElHTgkweDAwMDgJCS8qIHdvcmQgYWxpZ24gcm93ICovCisjZGVmaW5lCSAgICBGQVhNT0RFX0NMQVNTRglGQVhNT0RFX05PUlRDCS8qIFRJRkYgQ2xhc3MgRiAqLworI2RlZmluZQlUSUZGVEFHX0pQRUdRVUFMSVRZCQk2NTUzNwkvKiBDb21wcmVzc2lvbiBxdWFsaXR5IGxldmVsICovCisvKiBOb3RlOiBxdWFsaXR5IGxldmVsIGlzIG9uIHRoZSBJSkcgMC0xMDAgc2NhbGUuICBEZWZhdWx0IHZhbHVlIGlzIDc1ICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR0NPTE9STU9ERQkJNjU1MzgJLyogQXV0byBSR0I8PT5ZQ2JDciBjb252ZXJ0PyAqLworI2RlZmluZQkgICAgSlBFR0NPTE9STU9ERV9SQVcJMHgwMDAwCQkvKiBubyBjb252ZXJzaW9uIChkZWZhdWx0KSAqLworI2RlZmluZQkgICAgSlBFR0NPTE9STU9ERV9SR0IJMHgwMDAxCQkvKiBkbyBhdXRvIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHVEFCTEVTTU9ERQkJNjU1MzkJLyogV2hhdCB0byBwdXQgaW4gSlBFR1RhYmxlcyAqLworI2RlZmluZQkgICAgSlBFR1RBQkxFU01PREVfUVVBTlQgMHgwMDAxCQkvKiBpbmNsdWRlIHF1YW50aXphdGlvbiB0YmxzICovCisjZGVmaW5lCSAgICBKUEVHVEFCTEVTTU9ERV9IVUZGCTB4MDAwMgkJLyogaW5jbHVkZSBIdWZmbWFuIHRibHMgKi8KKy8qIE5vdGU6IGRlZmF1bHQgaXMgSlBFR1RBQkxFU01PREVfUVVBTlQgfCBKUEVHVEFCTEVTTU9ERV9IVUZGICovCisjZGVmaW5lCVRJRkZUQUdfRkFYRklMTEZVTkMJCTY1NTQwCS8qIEczL0c0IGZpbGwgZnVuY3Rpb24gKi8KKyNkZWZpbmUJVElGRlRBR19QSVhBUkxPR0RBVEFGTVQJCTY1NTQ5CS8qIFBpeGFyTG9nQ29kZWMgSS9PIGRhdGEgc3ogKi8KKyNkZWZpbmUJICAgIFBJWEFSTE9HREFUQUZNVF84QklUCTAJLyogcmVndWxhciB1X2NoYXIgc2FtcGxlcyAqLworI2RlZmluZQkgICAgUElYQVJMT0dEQVRBRk1UXzhCSVRBQkdSCTEJLyogQUJHUi1vcmRlciB1X2NoYXJzICovCisjZGVmaW5lCSAgICBQSVhBUkxPR0RBVEFGTVRfMTFCSVRMT0cJMgkvKiAxMS1iaXQgbG9nLWVuY29kZWQgKHJhdykgKi8KKyNkZWZpbmUJICAgIFBJWEFSTE9HREFUQUZNVF8xMkJJVFBJQ0lPCTMJLyogYXMgcGVyIFBJQ0lPICgxLjA9PTIwNDgpICovCisjZGVmaW5lCSAgICBQSVhBUkxPR0RBVEFGTVRfMTZCSVQJNAkvKiBzaWduZWQgc2hvcnQgc2FtcGxlcyAqLworI2RlZmluZQkgICAgUElYQVJMT0dEQVRBRk1UX0ZMT0FUCTUJLyogSUVFRSBmbG9hdCBzYW1wbGVzICovCisvKiA2NTU1MC02NTU1NiBhcmUgYWxsb2NhdGVkIHRvIE9jZWFuYSBNYXRyaXggPGRldkBvY2VhbmEuY29tPiAqLworI2RlZmluZSBUSUZGVEFHX0RDU0lNQUdFUlRZUEUgICAgICAgICAgIDY1NTUwICAgLyogaW1hZ2VyIG1vZGVsICYgZmlsdGVyICovCisjZGVmaW5lICAgICBEQ1NJTUFHRVJNT0RFTF9NMyAgICAgICAgICAgMCAgICAgICAvKiBNMyBjaGlwICgxMjgwIHggMTAyNCkgKi8KKyNkZWZpbmUgICAgIERDU0lNQUdFUk1PREVMX001ICAgICAgICAgICAxICAgICAgIC8qIE01IGNoaXAgKDE1MzYgeCAxMDI0KSAqLworI2RlZmluZSAgICAgRENTSU1BR0VSTU9ERUxfTTYgICAgICAgICAgIDIgICAgICAgLyogTTYgY2hpcCAoMzA3MiB4IDIwNDgpICovCisjZGVmaW5lICAgICBEQ1NJTUFHRVJGSUxURVJfSVIgICAgICAgICAgMCAgICAgICAvKiBpbmZyYXJlZCBmaWx0ZXIgKi8KKyNkZWZpbmUgICAgIERDU0lNQUdFUkZJTFRFUl9NT05PICAgICAgICAxICAgICAgIC8qIG1vbm9jaHJvbWUgZmlsdGVyICovCisjZGVmaW5lICAgICBEQ1NJTUFHRVJGSUxURVJfQ0ZBICAgICAgICAgMiAgICAgICAvKiBjb2xvciBmaWx0ZXIgYXJyYXkgKi8KKyNkZWZpbmUgICAgIERDU0lNQUdFUkZJTFRFUl9PVEhFUiAgICAgICAzICAgICAgIC8qIG90aGVyIGZpbHRlciAqLworI2RlZmluZSBUSUZGVEFHX0RDU0lOVEVSUE1PREUgICAgICAgICAgIDY1NTUxICAgLyogaW50ZXJwb2xhdGlvbiBtb2RlICovCisjZGVmaW5lICAgICBEQ1NJTlRFUlBNT0RFX05PUk1BTCAgICAgICAgMHgwICAgICAvKiB3aG9sZSBpbWFnZSwgZGVmYXVsdCAqLworI2RlZmluZSAgICAgRENTSU5URVJQTU9ERV9QUkVWSUVXICAgICAgIDB4MSAgICAgLyogcHJldmlldyBvZiBpbWFnZSAoMzg0eDI1NikgKi8KKyNkZWZpbmUgVElGRlRBR19EQ1NCQUxBTkNFQVJSQVkgICAgICAgICA2NTU1MiAgIC8qIGNvbG9yIGJhbGFuY2UgdmFsdWVzICovCisjZGVmaW5lIFRJRkZUQUdfRENTQ09SUkVDVE1BVFJJWCAgICAgICAgNjU1NTMgICAvKiBjb2xvciBjb3JyZWN0aW9uIHZhbHVlcyAqLworI2RlZmluZSBUSUZGVEFHX0RDU0dBTU1BICAgICAgICAgICAgICAgIDY1NTU0ICAgLyogZ2FtbWEgdmFsdWUgKi8KKyNkZWZpbmUgVElGRlRBR19EQ1NUT0VTSE9VTERFUlBUUyAgICAgICA2NTU1NSAgIC8qIHRvZSAmIHNob3VsZGVyIHBvaW50cyAqLworI2RlZmluZSBUSUZGVEFHX0RDU0NBTElCUkFUSU9ORkQgICAgICAgIDY1NTU2ICAgLyogY2FsaWJyYXRpb24gZmlsZSBkZXNjICovCisvKiBOb3RlOiBxdWFsaXR5IGxldmVsIGlzIG9uIHRoZSBaTElCIDEtOSBzY2FsZS4gRGVmYXVsdCB2YWx1ZSBpcyAtMSAqLworI2RlZmluZQlUSUZGVEFHX1pJUFFVQUxJVFkJCTY1NTU3CS8qIGNvbXByZXNzaW9uIHF1YWxpdHkgbGV2ZWwgKi8KKyNkZWZpbmUJVElGRlRBR19QSVhBUkxPR1FVQUxJVFkJCTY1NTU4CS8qIFBpeGFyTG9nIHVzZXMgc2FtZSBzY2FsZSAqLworLyogNjU1NTkgaXMgYWxsb2NhdGVkIHRvIE9jZWFuYSBNYXRyaXggPGRldkBvY2VhbmEuY29tPiAqLworI2RlZmluZSBUSUZGVEFHX0RDU0NMSVBSRUNUQU5HTEUJNjU1NTkJLyogYXJlYSBvZiBpbWFnZSB0byBhY3F1aXJlICovCisjZGVmaW5lIFRJRkZUQUdfU0dJTE9HREFUQUZNVAkJNjU1NjAJLyogU0dJTG9nIHVzZXIgZGF0YSBmb3JtYXQgKi8KKyNkZWZpbmUgICAgIFNHSUxPR0RBVEFGTVRfRkxPQVQJCTAJLyogSUVFRSBmbG9hdCBzYW1wbGVzICovCisjZGVmaW5lICAgICBTR0lMT0dEQVRBRk1UXzE2QklUCQkxCS8qIDE2LWJpdCBzYW1wbGVzICovCisjZGVmaW5lICAgICBTR0lMT0dEQVRBRk1UX1JBVwkJMgkvKiB1bmludGVycHJldGVkIGRhdGEgKi8KKyNkZWZpbmUgICAgIFNHSUxPR0RBVEFGTVRfOEJJVAkJMwkvKiA4LWJpdCBSR0IgbW9uaXRvciB2YWx1ZXMgKi8KKyNkZWZpbmUgVElGRlRBR19TR0lMT0dFTkNPREUJCTY1NTYxIC8qIFNHSUxvZyBkYXRhIGVuY29kaW5nIGNvbnRyb2wqLworI2RlZmluZSAgICAgU0dJTE9HRU5DT0RFX05PRElUSEVSCTAgICAgIC8qIGRvIG5vdCBkaXRoZXIgZW5jb2RlZCB2YWx1ZXMqLworI2RlZmluZSAgICAgU0dJTE9HRU5DT0RFX1JBTkRJVEhFUgkxICAgICAvKiByYW5kb21seSBkaXRoZXIgZW5jZCB2YWx1ZXMgKi8KKyNkZWZpbmUJVElGRlRBR19MWk1BUFJFU0VUCQk2NTU2MgkvKiBMWk1BMiBwcmVzZXQgKGNvbXByZXNzaW9uIGxldmVsKSAqLworI2RlZmluZSBUSUZGVEFHX1BFUlNBTVBMRSAgICAgICA2NTU2MwkvKiBpbnRlcmZhY2UgZm9yIHBlciBzYW1wbGUgdGFncyAqLworI2RlZmluZSAgICAgUEVSU0FNUExFX01FUkdFRCAgICAgICAgMAkvKiBwcmVzZW50IGFzIGEgc2luZ2xlIHZhbHVlICovCisjZGVmaW5lICAgICBQRVJTQU1QTEVfTVVMVEkgICAgICAgICAxCS8qIHByZXNlbnQgYXMgbXVsdGlwbGUgdmFsdWVzICovCisKKy8qCisgKiBFWElGIHRhZ3MKKyAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFVElNRQkJMzM0MzQJLyogRXhwb3N1cmUgdGltZSAqLworI2RlZmluZSBFWElGVEFHX0ZOVU1CRVIJCQkzMzQzNwkvKiBGIG51bWJlciAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFUFJPR1JBTQkJMzQ4NTAJLyogRXhwb3N1cmUgcHJvZ3JhbSAqLworI2RlZmluZSBFWElGVEFHX1NQRUNUUkFMU0VOU0lUSVZJVFkJMzQ4NTIJLyogU3BlY3RyYWwgc2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgRVhJRlRBR19JU09TUEVFRFJBVElOR1MJCTM0ODU1CS8qIElTTyBzcGVlZCByYXRpbmcgKi8KKyNkZWZpbmUgRVhJRlRBR19PRUNGCQkJMzQ4NTYJLyogT3B0b2VsZWN0cmljIGNvbnZlcnNpb24KKwkJCQkJCSAgIGZhY3RvciAqLworI2RlZmluZSBFWElGVEFHX0VYSUZWRVJTSU9OCQkzNjg2NAkvKiBFeGlmIHZlcnNpb24gKi8KKyNkZWZpbmUgRVhJRlRBR19EQVRFVElNRU9SSUdJTkFMCTM2ODY3CS8qIERhdGUgYW5kIHRpbWUgb2Ygb3JpZ2luYWwKKwkJCQkJCSAgIGRhdGEgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBFWElGVEFHX0RBVEVUSU1FRElHSVRJWkVECTM2ODY4CS8qIERhdGUgYW5kIHRpbWUgb2YgZGlnaXRhbAorCQkJCQkJICAgZGF0YSBnZW5lcmF0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfQ09NUE9ORU5UU0NPTkZJR1VSQVRJT04JMzcxMjEJLyogTWVhbmluZyBvZiBlYWNoIGNvbXBvbmVudCAqLworI2RlZmluZSBFWElGVEFHX0NPTVBSRVNTRURCSVRTUEVSUElYRUwJMzcxMjIJLyogSW1hZ2UgY29tcHJlc3Npb24gbW9kZSAqLworI2RlZmluZSBFWElGVEFHX1NIVVRURVJTUEVFRFZBTFVFCTM3Mzc3CS8qIFNodXR0ZXIgc3BlZWQgKi8KKyNkZWZpbmUgRVhJRlRBR19BUEVSVFVSRVZBTFVFCQkzNzM3OAkvKiBBcGVydHVyZSAqLworI2RlZmluZSBFWElGVEFHX0JSSUdIVE5FU1NWQUxVRQkJMzczNzkJLyogQnJpZ2h0bmVzcyAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFQklBU1ZBTFVFCTM3MzgwCS8qIEV4cG9zdXJlIGJpYXMgKi8KKyNkZWZpbmUgRVhJRlRBR19NQVhBUEVSVFVSRVZBTFVFCTM3MzgxCS8qIE1heGltdW0gbGVucyBhcGVydHVyZSAqLworI2RlZmluZSBFWElGVEFHX1NVQkpFQ1RESVNUQU5DRQkJMzczODIJLyogU3ViamVjdCBkaXN0YW5jZSAqLworI2RlZmluZSBFWElGVEFHX01FVEVSSU5HTU9ERQkJMzczODMJLyogTWV0ZXJpbmcgbW9kZSAqLworI2RlZmluZSBFWElGVEFHX0xJR0hUU09VUkNFCQkzNzM4NAkvKiBMaWdodCBzb3VyY2UgKi8KKyNkZWZpbmUgRVhJRlRBR19GTEFTSAkJCTM3Mzg1CS8qIEZsYXNoICovCisjZGVmaW5lIEVYSUZUQUdfRk9DQUxMRU5HVEgJCTM3Mzg2CS8qIExlbnMgZm9jYWwgbGVuZ3RoICovCisjZGVmaW5lIEVYSUZUQUdfU1VCSkVDVEFSRUEJCTM3Mzk2CS8qIFN1YmplY3QgYXJlYSAqLworI2RlZmluZSBFWElGVEFHX01BS0VSTk9URQkJMzc1MDAJLyogTWFudWZhY3R1cmVyIG5vdGVzICovCisjZGVmaW5lIEVYSUZUQUdfVVNFUkNPTU1FTlQJCTM3NTEwCS8qIFVzZXIgY29tbWVudHMgKi8KKyNkZWZpbmUgRVhJRlRBR19TVUJTRUNUSU1FCQkzNzUyMAkvKiBEYXRlVGltZSBzdWJzZWNvbmRzICovCisjZGVmaW5lIEVYSUZUQUdfU1VCU0VDVElNRU9SSUdJTkFMCTM3NTIxCS8qIERhdGVUaW1lT3JpZ2luYWwgc3Vic2Vjb25kcyAqLworI2RlZmluZSBFWElGVEFHX1NVQlNFQ1RJTUVESUdJVElaRUQJMzc1MjIJLyogRGF0ZVRpbWVEaWdpdGl6ZWQgc3Vic2Vjb25kcyAqLworI2RlZmluZSBFWElGVEFHX0ZMQVNIUElYVkVSU0lPTgkJNDA5NjAJLyogU3VwcG9ydGVkIEZsYXNocGl4IHZlcnNpb24gKi8KKyNkZWZpbmUgRVhJRlRBR19DT0xPUlNQQUNFCQk0MDk2MQkvKiBDb2xvciBzcGFjZSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBFWElGVEFHX1BJWEVMWERJTUVOU0lPTgkJNDA5NjIJLyogVmFsaWQgaW1hZ2Ugd2lkdGggKi8KKyNkZWZpbmUgRVhJRlRBR19QSVhFTFlESU1FTlNJT04JCTQwOTYzCS8qIFZhbGlkIGltYWdlIGhlaWdodCAqLworI2RlZmluZSBFWElGVEFHX1JFTEFURURTT1VOREZJTEUJNDA5NjQJLyogUmVsYXRlZCBhdWRpbyBmaWxlICovCisjZGVmaW5lIEVYSUZUQUdfRkxBU0hFTkVSR1kJCTQxNDgzCS8qIEZsYXNoIGVuZXJneSAqLworI2RlZmluZSBFWElGVEFHX1NQQVRJQUxGUkVRVUVOQ1lSRVNQT05TRSA0MTQ4NAkvKiBTcGF0aWFsIGZyZXF1ZW5jeSByZXNwb25zZSAqLworI2RlZmluZSBFWElGVEFHX0ZPQ0FMUExBTkVYUkVTT0xVVElPTgk0MTQ4NgkvKiBGb2NhbCBwbGFuZSBYIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgRVhJRlRBR19GT0NBTFBMQU5FWVJFU09MVVRJT04JNDE0ODcJLyogRm9jYWwgcGxhbmUgWSByZXNvbHV0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfRk9DQUxQTEFORVJFU09MVVRJT05VTklUIDQxNDg4CS8qIEZvY2FsIHBsYW5lIHJlc29sdXRpb24gdW5pdCAqLworI2RlZmluZSBFWElGVEFHX1NVQkpFQ1RMT0NBVElPTgkJNDE0OTIJLyogU3ViamVjdCBsb2NhdGlvbiAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFSU5ERVgJCTQxNDkzCS8qIEV4cG9zdXJlIGluZGV4ICovCisjZGVmaW5lIEVYSUZUQUdfU0VOU0lOR01FVEhPRAkJNDE0OTUJLyogU2Vuc2luZyBtZXRob2QgKi8KKyNkZWZpbmUgRVhJRlRBR19GSUxFU09VUkNFCQk0MTcyOAkvKiBGaWxlIHNvdXJjZSAqLworI2RlZmluZSBFWElGVEFHX1NDRU5FVFlQRQkJNDE3MjkJLyogU2NlbmUgdHlwZSAqLworI2RlZmluZSBFWElGVEFHX0NGQVBBVFRFUk4JCTQxNzMwCS8qIENGQSBwYXR0ZXJuICovCisjZGVmaW5lIEVYSUZUQUdfQ1VTVE9NUkVOREVSRUQJCTQxOTg1CS8qIEN1c3RvbSBpbWFnZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIEVYSUZUQUdfRVhQT1NVUkVNT0RFCQk0MTk4NgkvKiBFeHBvc3VyZSBtb2RlICovCisjZGVmaW5lIEVYSUZUQUdfV0hJVEVCQUxBTkNFCQk0MTk4NwkvKiBXaGl0ZSBiYWxhbmNlICovCisjZGVmaW5lIEVYSUZUQUdfRElHSVRBTFpPT01SQVRJTwk0MTk4OAkvKiBEaWdpdGFsIHpvb20gcmF0aW8gKi8KKyNkZWZpbmUgRVhJRlRBR19GT0NBTExFTkdUSElOMzVNTUZJTE0JNDE5ODkJLyogRm9jYWwgbGVuZ3RoIGluIDM1IG1tIGZpbG0gKi8KKyNkZWZpbmUgRVhJRlRBR19TQ0VORUNBUFRVUkVUWVBFCTQxOTkwCS8qIFNjZW5lIGNhcHR1cmUgdHlwZSAqLworI2RlZmluZSBFWElGVEFHX0dBSU5DT05UUk9MCQk0MTk5MQkvKiBHYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhJRlRBR19DT05UUkFTVAkJNDE5OTIJLyogQ29udHJhc3QgKi8KKyNkZWZpbmUgRVhJRlRBR19TQVRVUkFUSU9OCQk0MTk5MwkvKiBTYXR1cmF0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfU0hBUlBORVNTCQk0MTk5NAkvKiBTaGFycG5lc3MgKi8KKyNkZWZpbmUgRVhJRlRBR19ERVZJQ0VTRVRUSU5HREVTQ1JJUFRJT04gNDE5OTUJLyogRGV2aWNlIHNldHRpbmdzIGRlc2NyaXB0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfU1VCSkVDVERJU1RBTkNFUkFOR0UJNDE5OTYJLyogU3ViamVjdCBkaXN0YW5jZSByYW5nZSAqLworI2RlZmluZSBFWElGVEFHX0dBSU5DT05UUk9MCQk0MTk5MQkvKiBHYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhJRlRBR19HQUlOQ09OVFJPTAkJNDE5OTEJLyogR2FpbiBjb250cm9sICovCisjZGVmaW5lIEVYSUZUQUdfSU1BR0VVTklRVUVJRAkJNDIwMTYJLyogVW5pcXVlIGltYWdlIElEICovCisKKyNlbmRpZiAvKiBfVElGRl8gKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZmZjb25mLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZmZjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhNDI1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmZmNvbmYuaApAQCAtMCwwICsxLDI1MCBAQAorLyogbGlidGlmZi90aWZmY29uZi5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovCisvKgorICBDb25maWd1cmF0aW9uIGRlZmluZXMgZm9yIGluc3RhbGxlZCBsaWJ0aWZmLgorICBUaGlzIGZpbGUgbWFpbnRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gRG8gbm90IHVzZSBkZWZpbml0aW9ucworICBmcm9tIHRoaXMgZmlsZSBpbiB5b3VyIHByb2dyYW1zLgorKi8KKyNpZm5kZWYgX1RJRkZDT05GXworI2RlZmluZSBfVElGRkNPTkZfCisKKyNpZm5kZWYgX0ZYX1NZU1RFTV9IXworIyBpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2VuZGlmCisKKy8vTk9URTogVGhlIHRpZmYgY29kZWMgcmVxdWlyZXMgYW4gQU5TSSBDIGNvbXBpbGVyIGVudmlyb25tZW50IGZvciBidWlsZGluZyBhbmQgCisvLwkJcHJlc3VtZXMgYW4gQU5TSSBDIGVudmlyb25tZW50IGZvciB1c2UuCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfCisjIGRlZmluZSBPX1JET05MWSAgICAgICAweDAwMDAgIC8qIG9wZW4gZm9yIHJlYWRpbmcgb25seSAqLworIyBkZWZpbmUgT19XUk9OTFkgICAgICAgMHgwMDAxICAvKiBvcGVuIGZvciB3cml0aW5nIG9ubHkgKi8KKyMgZGVmaW5lIE9fUkRXUiAgICAgICAgIDB4MDAwMiAgLyogb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLworIyBkZWZpbmUgT19DUkVBVCAgICAgICAgMHgwMTAwICAvKiBjcmVhdGUgYW5kIG9wZW4gZmlsZSAqLworIyBkZWZpbmUgT19UUlVOQyAgICAgICAgMHgwMjAwICAvKiBvcGVuIGFuZCB0cnVuY2F0ZSAqLworI2Vsc2UKKyMgZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorIyBkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKyNlbmRpZgorCisvKiBDb21wYXRpYmlsaXR5IHN0dWZmLiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFzc2VydC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9BU1NFUlRfSCAxCisKKy8qIERlZmluZSBhcyAwIG9yIDEgYWNjb3JkaW5nIHRvIHRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXQgc3Vwb3J0ZWQgYnkgdGhlCisgICBtYWNoaW5lICovCisjZGVmaW5lIEhBVkVfSUVFRUZQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisvLyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisvL2Z4X3N5c3RlbS5oIGFscmVhZHkgaW5jbHVkZSB0aGUgc3RyaW5nLmggaW4gQU5TSUMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzZWFyY2guaD4gaGVhZGVyIGZpbGUuICovCisvKiNkZWZpbmUgSEFWRV9TRUFSQ0hfSCAxICovCisKKy8qIFRoZSBzaXplIG9mIGEgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qIEFjY29yZGluZyB0eXBlZGVmIGludAlGWF9JTlQzMjsgaW4gdGhlIGZ4X3N5c3RlbS5oKi8KKyNkZWZpbmUgU0laRU9GX0lOVCA0CisKKy8qIFN1bmxpYW5nLkxpdSAyMDExMDMyNS4gV2Ugc2hvdWxkIGNvbmZpZyB0aGUgY29ycmVjdCBsb25nIHNpemUgZm9yIHRpZiAKKyAgIGZheDRkZWNvZGUgb3B0aW1pemUgaW4gdGlmX2ZheDMuYyAgLS0gTGludXg2NCBkZWNvZGUgaXNzdWUuIAorICAgVEVTVERPQzogQnVnICMyMzY2MSAtIHoxLnRpZi4gKi8KKyNpZiBfRlhfQ1BVXyA9PSBfRlhfV0lONjRfIHx8IF9GWF9DUFVfID09IF9GWF9YNjRfIHx8IF9GWF9DUFVfID09IF9GWF9JQTY0XworLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HIDgKKyNlbHNlCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HIDQKKyNlbmRpZgorCisvKiBTaWduZWQgOC1iaXQgdHlwZSAqLworI2RlZmluZSBUSUZGX0lOVDhfVCBzaWduZWQgY2hhcgorCisvKiBVbnNpZ25lZCA4LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfVUlOVDhfVCB1bnNpZ25lZCBjaGFyCisKKy8qIFNpZ25lZCAxNi1iaXQgdHlwZSAqLworI2RlZmluZSBUSUZGX0lOVDE2X1Qgc2lnbmVkIHNob3J0CisKKy8qIFVuc2lnbmVkIDE2LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfVUlOVDE2X1QgdW5zaWduZWQgc2hvcnQKKworLyogU2lnbmVkIDMyLWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfSU5UMzJfVCBzaWduZWQgaW50CisKKy8qIFVuc2lnbmVkIDMyLWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfVUlOVDMyX1QgdW5zaWduZWQgaW50CisKKy8qIFNpZ25lZCAzMi1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKyNkZWZpbmUgVElGRl9JTlQzMl9GT1JNQVQgIiVkIgorCisvKiBVbnNpZ25lZCAzMi1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKyNkZWZpbmUgVElGRl9VSU5UMzJfRk9STUFUICIldSIKKworI2lmZGVmIF9NU0NfVkVSCQkvLyB3aW5kb3dzCisKKy8qIFNpZ25lZCA2NC1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKyNkZWZpbmUgVElGRl9JTlQ2NF9GT1JNQVQgIiVJNjRkIgorCisvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKyNkZWZpbmUgVElGRl9VSU5UNjRfRk9STUFUICIlSTY0dSIKKworLyogU2lnbmVkIDY0LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfSU5UNjRfVCBzaWduZWQgX19pbnQ2NAorCisvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSAqLworI2RlZmluZSBUSUZGX1VJTlQ2NF9UIHVuc2lnbmVkIF9faW50NjQKKworI2Vsc2UJCQkJCQkvLyBsaW51eC91bml4CisKKyNpZiAwIC8vX0ZYX0NQVV8gPT0gX0ZYX1g2NF8JLy8gbGludXgvdW5peCA2NAorCisvKiBTaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCisjZGVmaW5lIFRJRkZfSU5UNjRfRk9STUFUICIlbGQiCisKKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworI2RlZmluZSBUSUZGX1VJTlQ2NF9GT1JNQVQgIiVsdSIKKworLyogU2lnbmVkIDY0LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfSU5UNjRfVCBzaWduZWQgbG9uZworCisjZWxzZQkJCQkJCS8vIGxpbnV4L3VuaXggMzIKKworLyogU2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworI2RlZmluZSBUSUZGX0lOVDY0X0ZPUk1BVCAiJWxsZCIKKworLyogVW5zaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCisjZGVmaW5lIFRJRkZfVUlOVDY0X0ZPUk1BVCAiJWxsdSIKKworLyogU2lnbmVkIDY0LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfSU5UNjRfVCBzaWduZWQgbG9uZyBsb25nCisKKyNlbmRpZgkJCQkJCS8vIGVuZCBfRlhfQ1BVXworCisvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSAqLworI2RlZmluZSBUSUZGX1VJTlQ2NF9UIHVuc2lnbmVkIGxvbmcgbG9uZworCisjZW5kaWYKKworCisvKiBTaWduZWQgc2l6ZSB0eXBlICovCisjaWZkZWYgX01TQ19WRVIKKworI2lmIGRlZmluZWQoX1dJTjY0KQorI2RlZmluZSBUSUZGX1NTSVpFX1Qgc2lnbmVkIF9faW50NjQKKyNlbHNlCisjZGVmaW5lIFRJRkZfU1NJWkVfVCBzaWduZWQgaW50CisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBUSUZGX1NTSVpFX1Qgc2lnbmVkIGxvbmcKKworI2VuZGlmCisKKy8qIFNpZ25lZCBzaXplIHR5cGUgZm9ybWF0dGVyICovCisjaWYgZGVmaW5lZChfV0lONjQpCisjZGVmaW5lIFRJRkZfU1NJWkVfRk9STUFUICIlSTY0ZCIKKyNlbHNlCisjZGVmaW5lIFRJRkZfU1NJWkVfRk9STUFUICIlbGQiCisjZW5kaWYKKworLyogUG9pbnRlciBkaWZmZXJlbmNlIHR5cGUgKi8KKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBUSUZGX1BUUkRJRkZfVCBsb25nCisjZWxzZQorI2RlZmluZSBUSUZGX1BUUkRJRkZfVCBwdHJkaWZmX3QKKyNlbmRpZgorCisvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKy8qI2RlZmluZSBUSUZGX0lOVDY0X1Qgc2lnbmVkIF9faW50NjQqLworCisvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSAqLworLyojZGVmaW5lIFRJRkZfVUlOVDY0X1QgdW5zaWduZWQgX19pbnQ2NCovCisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjIGlmbmRlZiBpbmxpbmUKKyMgIGRlZmluZSBpbmxpbmUgX19pbmxpbmUKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIGxmaW5kIF9sZmluZAorCisjZGVmaW5lIEJTRFRZUEVTCisKKy8qIFNldCB0aGUgbmF0aXZlIGNwdSBiaXQgb3JkZXIgKEZJTExPUkRFUl9MU0IyTVNCIG9yIEZJTExPUkRFUl9NU0IyTFNCKSAqLworI2RlZmluZSBIT1NUX0ZJTExPUkRFUiBGSUxMT1JERVJfTFNCMk1TQgorCisvKiBOYXRpdmUgY3B1IGJ5dGUgb3JkZXI6IDEgaWYgYmlnLWVuZGlhbiAoTW90b3JvbGEpIG9yIDAgaWYgbGl0dGxlLWVuZGlhbgorICAgKEludGVsKSAqLworI2lmIF9GWF9FTkRJQU5fID09IF9GWF9CSUdfRU5ESUFOXworIyBkZWZpbmUgSE9TVF9CSUdFTkRJQU4gMQorI2Vsc2UKKyMgZGVmaW5lIEhPU1RfQklHRU5ESUFOIDAKKyNlbmRpZgorCisvKiBTdXBwb3J0IENDSVRUIEdyb3VwIDMgJiA0IGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgQ0NJVFRfU1VQUE9SVCAxCisKKy8qIFN1cHBvcnQgSlBFRyBjb21wcmVzc2lvbiAocmVxdWlyZXMgSUpHIEpQRUcgbGlicmFyeSkgKi8KKyNkZWZpbmUgSlBFR19TVVBQT1JUIDEKKworLyogU3VwcG9ydCBMb2dMdXYgaGlnaCBkeW5hbWljIHJhbmdlIGVuY29kaW5nICovCisjZGVmaW5lIExPR0xVVl9TVVBQT1JUIDEKKworLyogU3VwcG9ydCBMWlcgYWxnb3JpdGhtICovCisjZGVmaW5lIExaV19TVVBQT1JUIDEKKworLyogU3VwcG9ydCBOZVhUIDItYml0IFJMRSBhbGdvcml0aG0gKi8KKyNkZWZpbmUgTkVYVF9TVVBQT1JUIDEKKworLyogU3VwcG9ydCBPbGQgSlBFRyBjb21wcmVzc29uIChyZWFkIGNvbnRyaWIvb2pwZWcvUkVBRE1FIGZpcnN0ISBDb21waWxhdGlvbgorICAgZmFpbHMgd2l0aCB1bnBhdGNoZWQgSUpHIEpQRUcgbGlicmFyeSkgKi8KKyNkZWZpbmUgIE9KUEVHX1NVUFBPUlQJMQorCisvKiBTdXBwb3J0IE1hY2ludG9zaCBQYWNrQml0cyBhbGdvcml0aG0gKi8KKyNkZWZpbmUgUEFDS0JJVFNfU1VQUE9SVCAxCisKKy8qIFN1cHBvcnQgUGl4YXIgbG9nLWZvcm1hdCBhbGdvcml0aG0gKHJlcXVpcmVzIFpsaWIpICovCisjZGVmaW5lIFBJWEFSTE9HX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IFRodW5kZXJTY2FuIDQtYml0IFJMRSBhbGdvcml0aG0gKi8KKyNkZWZpbmUgVEhVTkRFUl9TVVBQT1JUIDEKKworLyogU3VwcG9ydCBEZWZsYXRlIGNvbXByZXNzaW9uICovCisjZGVmaW5lIFpJUF9TVVBQT1JUIDEKKworLyogU3VwcG9ydCBzdHJpcCBjaG9wcGluZyAod2hldGhlciBvciBub3QgdG8gY29udmVydCBzaW5nbGUtc3RyaXAgdW5jb21wcmVzc2VkCisgICBpbWFnZXMgdG8gbXV0aXBsZSBzdHJpcHMgb2YgfjhLYiB0byByZWR1Y2UgbWVtb3J5IHVzYWdlKSAqLworI2RlZmluZSBTVFJJUENIT1BfREVGQVVMVCBUSUZGX1NUUklQQ0hPUAorCisvKiBFbmFibGUgU3ViSUZEIHRhZyAoMzMwKSBzdXBwb3J0ICovCisjZGVmaW5lIFNVQklGRF9TVVBQT1JUIDEKKworLyogVHJlYXQgZXh0cmEgc2FtcGxlIGFzIGFscGhhIChkZWZhdWx0IGVuYWJsZWQpLiBUaGUgUkdCQSBpbnRlcmZhY2Ugd2lsbAorICAgdHJlYXQgYSBmb3VydGggc2FtcGxlIHdpdGggbm8gRVhUUkFTQU1QTEVfIHZhbHVlIGFzIGJlaW5nIEFTU09DQUxQSEEuIE1hbnkKKyAgIHBhY2thZ2VzIHByb2R1Y2UgUkdCQSBmaWxlcyBidXQgZG9uJ3QgbWFyayB0aGUgYWxwaGEgcHJvcGVybHkuICovCisjZGVmaW5lIERFRkFVTFRfRVhUUkFTQU1QTEVfQVNfQUxQSEEgMQorCisvKiBQaWNrIHVwIFlDYkNyIHN1YnNhbXBsaW5nIGluZm8gZnJvbSB0aGUgSlBFRyBkYXRhIHN0cmVhbSB0byBzdXBwb3J0IGZpbGVzCisgICBsYWNraW5nIHRoZSB0YWcgKGRlZmF1bHQgZW5hYmxlZCkuICovCisjZGVmaW5lIENIRUNLX0pQRUdfWUNCQ1JfU1VCU0FNUExJTkcgMQorCisvKiBTdXBwb3J0IE1TIE1ESSBtYWdpYyBudW1iZXIgZmlsZXMgYXMgVElGRiAqLworI2RlZmluZSBNRElfU1VQUE9SVCAxCisKKy8qCisgKiBGZWF0dXJlIHN1cHBvcnQgZGVmaW5pdGlvbnMuCisgKiBYWFg6IFRoZXNlIG1hY3JvcyBhcmUgb2Jzb2xldGVkLiBEb24ndCB1c2UgdGhlbSBpbiB5b3VyIGFwcHMhCisgKiBNYWNyb3Mgc3RheXMgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgc2hvdWxkIGJlIGFsd2F5cyBkZWZpbmVkLgorICovCisjZGVmaW5lIENPTE9SSU1FVFJZX1NVUFBPUlQKKyNkZWZpbmUgWUNCQ1JfU1VQUE9SVAorI2RlZmluZSBDTVlLX1NVUFBPUlQKKyNkZWZpbmUgSUNDX1NVUFBPUlQKKyNkZWZpbmUgUEhPVE9TSE9QX1NVUFBPUlQKKyNkZWZpbmUgSVBUQ19TVVBQT1JUCisKKyNlbmRpZiAvKiBfVElGRkNPTkZfICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZmZpby5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZmaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzc0OWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZmaW8uaApAQCAtMCwwICsxLDU1OSBAQAorLyogJElkOiB0aWZmaW8uaCx2IDEuOTEgMjAxMi0wNy0yOSAxNTo0NToyOSB0Z2wgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1RJRkZJT18KKyNkZWZpbmUJX1RJRkZJT18KKworLyoKKyAqIFRJRkYgSS9PIExpYnJhcnkgRGVmaW5pdGlvbnMuCisgKi8KKyNpbmNsdWRlICJ0aWZmLmgiCisjaW5jbHVkZSAidGlmZnZlcnMuaCIKKworLyoKKyAqIFRJRkYgaXMgZGVmaW5lZCBhcyBhbiBpbmNvbXBsZXRlIHR5cGUgdG8gaGlkZSB0aGUKKyAqIGxpYnJhcnkncyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZnJvbSBjbGllbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCB0aWZmIFRJRkY7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGRlZmluZSB0aGUgaW50cmluc2ljIHNpemUgb2YKKyAqIGRhdGEgdHlwZXMgdXNlZCBpbiB0aGUgKmV4cG9ydGVkKiBpbnRlcmZhY2VzLiAgVGhlc2UKKyAqIGRlZmluaXRpb25zIGRlcGVuZCBvbiB0aGUgcHJvcGVyIGRlZmluaXRpb24gb2YgdHlwZXMKKyAqIGluIHRpZmYuaC4gIE5vdGUgYWxzbyB0aGF0IHRoZSB2YXJhcmdzIGludGVyZmFjZSB1c2VkCisgKiB0byBwYXNzIHRhZyB0eXBlcyBhbmQgdmFsdWVzIHVzZXMgdGhlIHR5cGVzIGRlZmluZWQgaW4KKyAqIHRpZmYuaCBkaXJlY3RseS4KKyAqCisgKiBOQjogdHRhZ190IGlzIHVuc2lnbmVkIGludCBhbmQgbm90IHVuc2lnbmVkIHNob3J0IGJlY2F1c2UKKyAqICAgICBBTlNJIEMgcmVxdWlyZXMgdGhhdCB0aGUgdHlwZSBiZWZvcmUgdGhlIGVsbGlwc2lzIGJlIGEKKyAqICAgICBwcm9tb3RlZCB0eXBlIChpLmUuIG9uZSBvZiBpbnQsIHVuc2lnbmVkIGludCwgcG9pbnRlciwKKyAqICAgICBvciBkb3VibGUpIGFuZCBiZWNhdXNlIHdlIGRlZmluZWQgcHNldWRvLXRhZ3MgdGhhdCBhcmUKKyAqICAgICBvdXRzaWRlIHRoZSByYW5nZSBvZiBsZWdhbCBBbGR1cy1hc3NpZ25lZCB0YWdzLgorICogTkI6IHRzaXplX3QgaXMgaW50MzIgYW5kIG5vdCB1aW50MzIgYmVjYXVzZSBzb21lIGZ1bmN0aW9ucworICogICAgIHJldHVybiAtMS4KKyAqIE5COiB0b2ZmX3QgaXMgbm90IG9mZl90IGZvciBtYW55IHJlYXNvbnM7IFRJRkZzIG1heCBvdXQgYXQKKyAqICAgICAzMi1iaXQgZmlsZSBvZmZzZXRzLCBhbmQgQmlnVElGRiBtYXhlcyBvdXQgYXQgNjQtYml0CisgKiAgICAgb2Zmc2V0cyBiZWluZyB0aGUgbW9zdCBpbXBvcnRhbnQsIGFuZCB0byBlbnN1cmUgdXNlIG9mCisgKiAgICAgYSBjb25zaXN0ZW50bHkgdW5zaWduZWQgdHlwZSBhY3Jvc3MgYXJjaGl0ZWN0dXJlcy4KKyAqICAgICBQcmlvciB0byBsaWJ0aWZmIDQuMCwgdGhpcyB3YXMgYW4gdW5zaWduZWQgMzIgYml0IHR5cGUuCisgKi8KKy8qCisgKiB0aGlzIGlzIHRoZSBtYWNoaW5lIGFkZHJlc3Npbmcgc2l6ZSB0eXBlLCBvbmx5IGl0J3Mgc2lnbmVkLCBzbyBtYWtlIGl0CisgKiBpbnQzMiBvbiAzMmJpdCBtYWNoaW5lcywgaW50NjQgb24gNjRiaXQgbWFjaGluZXMKKyAqLwordHlwZWRlZiBUSUZGX1NTSVpFX1QgdG1zaXplX3Q7Cit0eXBlZGVmIHVpbnQ2NCB0b2ZmX3Q7ICAgICAgICAgIC8qIGZpbGUgb2Zmc2V0ICovCisvKiB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlaXIgZGVmaW5pbmcKKyAgIGNvdW50ZXJwYXJ0cyAqLwordHlwZWRlZiB1aW50MzIgdHRhZ190OyAgICAgICAgICAvKiBkaXJlY3RvcnkgdGFnICovCit0eXBlZGVmIHVpbnQxNiB0ZGlyX3Q7ICAgICAgICAgIC8qIGRpcmVjdG9yeSBpbmRleCAqLwordHlwZWRlZiB1aW50MTYgdHNhbXBsZV90OyAgICAgICAvKiBzYW1wbGUgbnVtYmVyICovCit0eXBlZGVmIHVpbnQzMiB0c3RyaWxlX3Q7ICAgICAgIC8qIHN0cmlwIG9yIHRpbGUgbnVtYmVyICovCit0eXBlZGVmIHRzdHJpbGVfdCB0c3RyaXBfdDsgICAgIC8qIHN0cmlwIG51bWJlciAqLwordHlwZWRlZiB0c3RyaWxlX3QgdHRpbGVfdDsgICAgICAvKiB0aWxlIG51bWJlciAqLwordHlwZWRlZiB0bXNpemVfdCB0c2l6ZV90OyAgICAgICAvKiBpL28gc2l6ZSBpbiBieXRlcyAqLwordHlwZWRlZiB2b2lkKiB0ZGF0YV90OyAgICAgICAgICAvKiBpbWFnZSBkYXRhIHJlZiAqLworCisjaWYgIWRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoV0lOMzIpKQorI2RlZmluZSBfX1dJTjMyX18KKyNlbmRpZgorCisvKgorICogT24gd2luZG93cyB5b3Ugc2hvdWxkIGRlZmluZSBVU0VfV0lOMzJfRklMRUlPIGlmIHlvdSBhcmUgdXNpbmcgdGlmX3dpbjMyLmMKKyAqIG9yIEFWT0lEX1dJTjMyX0ZJTEVJTyBpZiB5b3UgYXJlIHVzaW5nIHNvbWV0aGluZyBlbHNlIChsaWtlIHRpZl91bml4LmMpLgorICoKKyAqIEJ5IGRlZmF1bHQgdGlmX3VuaXguYyBpcyBhc3N1bWVkLgorICovCisKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV2luZG93cykKKyMgIGlmICFkZWZpbmVkKF9fQ1lHV0lOKSAmJiAhZGVmaW5lZChBVk9JRF9XSU4zMl9GSUxFSU8pICYmICFkZWZpbmVkKFVTRV9XSU4zMl9GSUxFSU8pCisjICAgIGRlZmluZSBBVk9JRF9XSU4zMl9GSUxFSU8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX1dJTjMyX0ZJTEVJTykKKyMgZGVmaW5lIFZDX0VYVFJBTEVBTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGlmZGVmIF9fV0lOMzJfXworREVDTEFSRV9IQU5ETEUodGhhbmRsZV90KTsgICAgIC8qIFdpbjMyIGZpbGUgaGFuZGxlICovCisjIGVsc2UKK3R5cGVkZWYgSEZJTEUgdGhhbmRsZV90OyAgICAgICAvKiBjbGllbnQgZGF0YSBoYW5kbGUgKi8KKyMgZW5kaWYgLyogX19XSU4zMl9fICovCisjZWxzZQordHlwZWRlZiB2b2lkKiB0aGFuZGxlX3Q7ICAgICAgIC8qIGNsaWVudCBkYXRhIGhhbmRsZSAqLworI2VuZGlmIC8qIFVTRV9XSU4zMl9GSUxFSU8gKi8KKworLyoKKyAqIEZsYWdzIHRvIHBhc3MgdG8gVElGRlByaW50RGlyZWN0b3J5IHRvIGNvbnRyb2wKKyAqIHByaW50aW5nIG9mIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSBwb3RlbnRpYWxseQorICogdmVyeSBsYXJnZS4gICBCaXQtb3IgdGhlc2UgZmxhZ3MgdG8gZW5hYmxlIHByaW50aW5nCisgKiBtdWx0aXBsZSBpdGVtcy4KKyAqLworI2RlZmluZSBUSUZGUFJJTlRfTk9ORQkgICAgICAgMHgwICAgIC8qIG5vIGV4dHJhIGluZm8gKi8KKyNkZWZpbmUgVElGRlBSSU5UX1NUUklQUyAgICAgICAweDEgICAgLyogc3RyaXBzL3RpbGVzIGluZm8gKi8KKyNkZWZpbmUgVElGRlBSSU5UX0NVUlZFUyAgICAgICAweDIgICAgLyogY29sb3IvZ3JheSByZXNwb25zZSBjdXJ2ZXMgKi8KKyNkZWZpbmUgVElGRlBSSU5UX0NPTE9STUFQICAgICAweDQgICAgLyogY29sb3JtYXAgKi8KKyNkZWZpbmUgVElGRlBSSU5UX0pQRUdRVEFCTEVTICAweDEwMCAgLyogSlBFRyBRIG1hdHJpY2VzICovCisjZGVmaW5lIFRJRkZQUklOVF9KUEVHQUNUQUJMRVMgMHgyMDAgIC8qIEpQRUcgQUMgdGFibGVzICovCisjZGVmaW5lIFRJRkZQUklOVF9KUEVHRENUQUJMRVMgMHgyMDAgIC8qIEpQRUcgREMgdGFibGVzICovCisKKy8qIAorICogQ29sb3VyIGNvbnZlcnNpb24gc3R1ZmYKKyAqLworCisvKiByZWZlcmVuY2Ugd2hpdGUgKi8KKyNkZWZpbmUgRDY1X1gwICg5NS4wNDcwRikKKyNkZWZpbmUgRDY1X1kwICgxMDAuMEYpCisjZGVmaW5lIEQ2NV9aMCAoMTA4Ljg4MjdGKQorCisjZGVmaW5lIEQ1MF9YMCAoOTYuNDI1MEYpCisjZGVmaW5lIEQ1MF9ZMCAoMTAwLjBGKQorI2RlZmluZSBENTBfWjAgKDgyLjQ2ODBGKQorCisvKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBkaXNwbGF5IGRldmljZS4gKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFRJRkZSR0JWYWx1ZTsgICAgICAgICAgICAgICAvKiA4LWJpdCBzYW1wbGVzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlmbG9hdCBkX21hdFszXVszXTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWVogLT4gbHVtaW5hbmNlIG1hdHJpeCAqLworCWZsb2F0IGRfWUNSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpZ2h0IG8vcCBmb3IgcmVmZXJlbmNlIHdoaXRlICovCisJZmxvYXQgZF9ZQ0c7CisJZmxvYXQgZF9ZQ0I7CisJdWludDMyIGRfVnJ3cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGl4ZWwgdmFsdWVzIGZvciByZWYuIHdoaXRlICovCisJdWludDMyIGRfVnJ3ZzsKKwl1aW50MzIgZF9WcndiOworCWZsb2F0IGRfWTBSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2lkdWFsIGxpZ2h0IGZvciBibGFjayBwaXhlbCAqLworCWZsb2F0IGRfWTBHOworCWZsb2F0IGRfWTBCOworCWZsb2F0IGRfZ2FtbWFSOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhbW1hIHZhbHVlcyBmb3IgdGhlIHRocmVlIGd1bnMgKi8KKwlmbG9hdCBkX2dhbW1hRzsKKwlmbG9hdCBkX2dhbW1hQjsKK30gVElGRkRpc3BsYXk7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWUNiQ3ItPlJHQiBzdXBwb3J0ICovCisJVElGRlJHQlZhbHVlKiBjbGFtcHRhYjsgICAgICAgICAgICAgICAgICAgLyogcmFuZ2UgY2xhbXBpbmcgdGFibGUgKi8KKwlpbnQqIENyX3JfdGFiOworCWludCogQ2JfYl90YWI7CisJaW50MzIqIENyX2dfdGFiOworCWludDMyKiBDYl9nX3RhYjsKKwlpbnQzMiogWV90YWI7Cit9IFRJRkZZQ2JDclRvUkdCOworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENJRSBMYWIgMTk3Ni0+UkdCIHN1cHBvcnQgKi8KKwlpbnQgcmFuZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaXplIG9mIGNvbnZlcnNpb24gdGFibGUgKi8KKyNkZWZpbmUgQ0lFTEFCVE9SR0JfVEFCTEVfUkFOR0UgMTUwMAorCWZsb2F0IHJzdGVwLCBnc3RlcCwgYnN0ZXA7CisJZmxvYXQgWDAsIFkwLCBaMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVmZXJlbmNlIHdoaXRlIHBvaW50ICovCisJVElGRkRpc3BsYXkgZGlzcGxheTsKKwlmbG9hdCBZcjJyW0NJRUxBQlRPUkdCX1RBQkxFX1JBTkdFICsgMV07ICAvKiBDb252ZXJzaW9uIG9mIFlyIHRvIHIgKi8KKwlmbG9hdCBZZzJnW0NJRUxBQlRPUkdCX1RBQkxFX1JBTkdFICsgMV07ICAvKiBDb252ZXJzaW9uIG9mIFlnIHRvIGcgKi8KKwlmbG9hdCBZYjJiW0NJRUxBQlRPUkdCX1RBQkxFX1JBTkdFICsgMV07ICAvKiBDb252ZXJzaW9uIG9mIFliIHRvIGIgKi8KK30gVElGRkNJRUxhYlRvUkdCOworCisvKgorICogUkdCQS1zdHlsZSBpbWFnZSBzdXBwb3J0LgorICovCit0eXBlZGVmIHN0cnVjdCBfVElGRlJHQkFJbWFnZSBUSUZGUkdCQUltYWdlOworLyoKKyAqIFRoZSBpbWFnZSByZWFkaW5nIGFuZCBjb252ZXJzaW9uIHJvdXRpbmVzIGludm9rZQorICogYGBwdXQgcm91dGluZXMnJyB0byBjb3B5L2ltYWdlL3doYXRldmVyIHRpbGVzIG9mCisgKiByYXcgaW1hZ2UgZGF0YS4gIEEgZGVmYXVsdCBzZXQgb2Ygcm91dGluZXMgYXJlIAorICogcHJvdmlkZWQgdG8gY29udmVydC9jb3B5IHJhdyBpbWFnZSBkYXRhIHRvIDgtYml0CisgKiBwYWNrZWQgQUJHUiBmb3JtYXQgcmFzdGVycy4gIEFwcGxpY2F0aW9ucyBjYW4gc3VwcGx5CisgKiBhbHRlcm5hdGUgcm91dGluZXMgdGhhdCB1bnBhY2sgdGhlIGRhdGEgaW50byBhCisgKiBkaWZmZXJlbnQgZm9ybWF0IG9yLCBmb3IgZXhhbXBsZSwgdW5wYWNrIHRoZSBkYXRhCisgKiBhbmQgZHJhdyB0aGUgdW5wYWNrZWQgcmFzdGVyIG9uIHRoZSBkaXNwbGF5LgorICovCit0eXBlZGVmIHZvaWQgKCp0aWxlQ29udGlnUm91dGluZSkKKyAgICAoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiwgaW50MzIsIGludDMyLAorCXVuc2lnbmVkIGNoYXIqKTsKK3R5cGVkZWYgdm9pZCAoKnRpbGVTZXBhcmF0ZVJvdXRpbmUpCisgICAgKFRJRkZSR0JBSW1hZ2UqLCB1aW50MzIqLCB1aW50MzIsIHVpbnQzMiwgdWludDMyLCB1aW50MzIsIGludDMyLCBpbnQzMiwKKwl1bnNpZ25lZCBjaGFyKiwgdW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGNoYXIqLCB1bnNpZ25lZCBjaGFyKik7CisvKgorICogUkdCQS1yZWFkZXIgc3RhdGUuCisgKi8KK3N0cnVjdCBfVElGRlJHQkFJbWFnZSB7CisJVElGRiogdGlmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIGhhbmRsZSAqLworCWludCBzdG9wb25lcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9wIG9uIHJlYWQgZXJyb3IgKi8KKwlpbnQgaXNDb250aWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGF0YSBpcyBwYWNrZWQvc2VwYXJhdGUgKi8KKwlpbnQgYWxwaGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiBhbHBoYSBkYXRhIHByZXNlbnQgKi8KKwl1aW50MzIgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2Ugd2lkdGggKi8KKwl1aW50MzIgaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2UgaGVpZ2h0ICovCisJdWludDE2IGJpdHNwZXJzYW1wbGU7ICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIGJpdHMvc2FtcGxlICovCisJdWludDE2IHNhbXBsZXNwZXJwaXhlbDsgICAgICAgICAgICAgICAgIC8qIGltYWdlIHNhbXBsZXMvcGl4ZWwgKi8KKwl1aW50MTYgb3JpZW50YXRpb247ICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2Ugb3JpZW50YXRpb24gKi8KKwl1aW50MTYgcmVxX29yaWVudGF0aW9uOyAgICAgICAgICAgICAgICAgLyogcmVxdWVzdGVkIG9yaWVudGF0aW9uICovCisJdWludDE2IHBob3RvbWV0cmljOyAgICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIHBob3RvbWV0cmljIGludGVycCAqLworCXVpbnQxNiogcmVkY21hcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xvcm1hcCBwYWxsZXRlICovCisJdWludDE2KiBncmVlbmNtYXA7CisJdWludDE2KiBibHVlY21hcDsKKwkvKiBnZXQgaW1hZ2UgZGF0YSByb3V0aW5lICovCisJaW50ICgqZ2V0KShUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOworCS8qIHB1dCBkZWNvZGVkIHN0cmlwL3RpbGUgKi8KKwl1bmlvbiB7CisJICAgIHZvaWQgKCphbnkpKFRJRkZSR0JBSW1hZ2UqKTsKKwkgICAgdGlsZUNvbnRpZ1JvdXRpbmUgY29udGlnOworCSAgICB0aWxlU2VwYXJhdGVSb3V0aW5lIHNlcGFyYXRlOworCX0gcHV0OworCVRJRkZSR0JWYWx1ZSogTWFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBzYW1wbGUgbWFwcGluZyBhcnJheSAqLworCXVpbnQzMioqIEJXbWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFjayZ3aGl0ZSBtYXAgKi8KKwl1aW50MzIqKiBQQUxtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFsZXR0ZSBpbWFnZSBtYXAgKi8KKwlUSUZGWUNiQ3JUb1JHQiogeWNiY3I7ICAgICAgICAgICAgICAgICAgLyogWUNiQ3IgY29udmVyc2lvbiBzdGF0ZSAqLworCVRJRkZDSUVMYWJUb1JHQiogY2llbGFiOyAgICAgICAgICAgICAgICAvKiBDSUUgTCphKmIgY29udmVyc2lvbiBzdGF0ZSAqLworCisJdWludDgqIFVhVG9BYTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuYXNzb2NpYXRlZCBhbHBoYSB0byBhc3NvY2lhdGVkIGFscGhhIGNvbnZlcnRpb24gTFVUICovCisJdWludDgqIEJpdGRlcHRoMTZUbzg7ICAgICAgICAgICAgICAgICAgIC8qIExVVCBmb3IgY29udmVyc2lvbiBmcm9tIDE2Yml0IHRvIDhiaXQgdmFsdWVzICovCisKKwlpbnQgcm93X29mZnNldDsKKwlpbnQgY29sX29mZnNldDsKK307CisKKy8qCisgKiBNYWNyb3MgZm9yIGV4dHJhY3RpbmcgY29tcG9uZW50cyBmcm9tIHRoZQorICogcGFja2VkIEFCR1IgZm9ybSByZXR1cm5lZCBieSBUSUZGUmVhZFJHQkFJbWFnZS4KKyAqLworI2RlZmluZSBUSUZGR2V0UihhYmdyKSAoKGFiZ3IpICYgMHhmZikKKyNkZWZpbmUgVElGRkdldEcoYWJncikgKCgoYWJncikgPj4gOCkgJiAweGZmKQorI2RlZmluZSBUSUZGR2V0QihhYmdyKSAoKChhYmdyKSA+PiAxNikgJiAweGZmKQorI2RlZmluZSBUSUZGR2V0QShhYmdyKSAoKChhYmdyKSA+PiAyNCkgJiAweGZmKQorCisvKgorICogQSBDT0RFQyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgdGhhdCBpbXBsZW1lbnRzIGRlY29kaW5nLAorICogZW5jb2RpbmcsIG9yIGRlY29kaW5nK2VuY29kaW5nIG9mIGEgY29tcHJlc3Npb24gYWxnb3JpdGhtLgorICogVGhlIGxpYnJhcnkgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIGJ1aWx0aW4gY29kZWNzLgorICogTW9yZSBjb2RlY3MgbWF5IGJlIHJlZ2lzdGVyZWQgdGhyb3VnaCBjYWxscyB0byB0aGUgbGlicmFyeQorICogYW5kL29yIHRoZSBidWlsdGluIGltcGxlbWVudGF0aW9ucyBtYXkgYmUgb3ZlcnJpZGRlbi4KKyAqLwordHlwZWRlZiBpbnQgKCpUSUZGSW5pdE1ldGhvZCkoVElGRiosIGludCk7Cit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciogbmFtZTsKKwl1aW50MTYgc2NoZW1lOworCVRJRkZJbml0TWV0aG9kIGluaXQ7Cit9IFRJRkZDb2RlYzsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIHNoYXJlIGludGVybmFsIExvZ0x1diBjb252ZXJzaW9uIHJvdXRpbmVzPyAqLworI2lmbmRlZiBMT0dMVVZfUFVCTElDCisjZGVmaW5lIExPR0xVVl9QVUJMSUMgMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19hdHRyaWJ1dGVfXykKKyMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHgpIC8qbm90aGluZyovCisjZW5kaWYKKworI2lmIGRlZmluZWQoY19wbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCit0eXBlZGVmIHZvaWQgKCpUSUZGRXJyb3JIYW5kbGVyKShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHZhX2xpc3QpOwordHlwZWRlZiB2b2lkICgqVElGRkVycm9ySGFuZGxlckV4dCkodGhhbmRsZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHZhX2xpc3QpOwordHlwZWRlZiB0bXNpemVfdCAoKlRJRkZSZWFkV3JpdGVQcm9jKSh0aGFuZGxlX3QsIHZvaWQqLCB0bXNpemVfdCk7Cit0eXBlZGVmIHRvZmZfdCAoKlRJRkZTZWVrUHJvYykodGhhbmRsZV90LCB0b2ZmX3QsIGludCk7Cit0eXBlZGVmIGludCAoKlRJRkZDbG9zZVByb2MpKHRoYW5kbGVfdCk7Cit0eXBlZGVmIHRvZmZfdCAoKlRJRkZTaXplUHJvYykodGhhbmRsZV90KTsKK3R5cGVkZWYgaW50ICgqVElGRk1hcEZpbGVQcm9jKSh0aGFuZGxlX3QsIHZvaWQqKiBiYXNlLCB0b2ZmX3QqIHNpemUpOwordHlwZWRlZiB2b2lkICgqVElGRlVubWFwRmlsZVByb2MpKHRoYW5kbGVfdCwgdm9pZCogYmFzZSwgdG9mZl90IHNpemUpOwordHlwZWRlZiB2b2lkICgqVElGRkV4dGVuZFByb2MpKFRJRkYqKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIFRJRkZHZXRWZXJzaW9uKHZvaWQpOworCitleHRlcm4gY29uc3QgVElGRkNvZGVjKiBUSUZGRmluZENPREVDKHVpbnQxNik7CitleHRlcm4gVElGRkNvZGVjKiBUSUZGUmVnaXN0ZXJDT0RFQyh1aW50MTYsIGNvbnN0IGNoYXIqLCBUSUZGSW5pdE1ldGhvZCk7CitleHRlcm4gdm9pZCBUSUZGVW5SZWdpc3RlckNPREVDKFRJRkZDb2RlYyopOworZXh0ZXJuIGludCBUSUZGSXNDT0RFQ0NvbmZpZ3VyZWQodWludDE2KTsKK2V4dGVybiBUSUZGQ29kZWMqIFRJRkZHZXRDb25maWd1cmVkQ09ERUNzKHZvaWQpOworCisvKgorICogQXV4aWxpYXJ5IGZ1bmN0aW9ucy4KKyAqLworCitleHRlcm4gdm9pZCogX1RJRkZtYWxsb2ModG1zaXplX3Qgcyk7CitleHRlcm4gdm9pZCogX1RJRkZyZWFsbG9jKHZvaWQqIHAsIHRtc2l6ZV90IHMpOworZXh0ZXJuIHZvaWQgX1RJRkZtZW1zZXQodm9pZCogcCwgaW50IHYsIHRtc2l6ZV90IGMpOworZXh0ZXJuIHZvaWQgX1RJRkZtZW1jcHkodm9pZCogZCwgY29uc3Qgdm9pZCogcywgdG1zaXplX3QgYyk7CitleHRlcm4gaW50IF9USUZGbWVtY21wKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMiwgdG1zaXplX3QgYyk7CitleHRlcm4gdm9pZCBfVElGRmZyZWUodm9pZCogcCk7CisvKiBEbyBjbXlrIHRvIHJnYiBjb252ZXJ0LCBhZGQgYnkgU3VubGlhbmcuTGl1IDIwMDkwNzIzLiAqLworZXh0ZXJuCWludCBUSUZGQ215azJSZ2IodGhhbmRsZV90IGNvbnRleHQsIHVpbnQ4IGMsIHVpbnQ4IG0sIHVpbnQ4IHksIHVpbnQ4IGssIHVpbnQ4KiByLCB1aW50OCogZywgdWludDgqIGIpOworCisvKgorKiogU3R1ZmYsIHJlbGF0ZWQgdG8gdGFnIGhhbmRsaW5nIGFuZCBjcmVhdGluZyBjdXN0b20gdGFncy4KKyovCitleHRlcm4gaW50IFRJRkZHZXRUYWdMaXN0Q291bnQoIFRJRkYgKiApOworZXh0ZXJuIHVpbnQzMiBUSUZGR2V0VGFnTGlzdEVudHJ5KCBUSUZGICosIGludCB0YWdfaW5kZXggKTsKKyAgICAKKyNkZWZpbmUgVElGRl9BTlkgICAgICAgVElGRl9OT1RZUEUgICAgIC8qIGZvciBmaWVsZCBkZXNjcmlwdG9yIHNlYXJjaGluZyAqLworI2RlZmluZSBUSUZGX1ZBUklBQkxFICAtMSAgICAgICAgICAgICAgLyogbWFya2VyIGZvciB2YXJpYWJsZSBsZW5ndGggdGFncyAqLworI2RlZmluZSBUSUZGX1NQUCAgICAgICAtMiAgICAgICAgICAgICAgLyogbWFya2VyIGZvciBTYW1wbGVzUGVyUGl4ZWwgdGFncyAqLworI2RlZmluZSBUSUZGX1ZBUklBQkxFMiAtMyAgICAgICAgICAgICAgLyogbWFya2VyIGZvciB1aW50MzIgdmFyLWxlbmd0aCB0YWdzICovCisKKyNkZWZpbmUgRklFTERfQ1VTVE9NICAgIDY1CisKK3R5cGVkZWYgc3RydWN0IF9USUZGRmllbGQgVElGRkZpZWxkOwordHlwZWRlZiBzdHJ1Y3QgX1RJRkZGaWVsZEFycmF5IFRJRkZGaWVsZEFycmF5OworCitleHRlcm4gY29uc3QgVElGRkZpZWxkKiBUSUZGRmluZEZpZWxkKFRJRkYgKiwgdWludDMyLCBUSUZGRGF0YVR5cGUpOworZXh0ZXJuIGNvbnN0IFRJRkZGaWVsZCogVElGRkZpZWxkV2l0aFRhZyhUSUZGKiwgdWludDMyKTsKK2V4dGVybiBjb25zdCBUSUZGRmllbGQqIFRJRkZGaWVsZFdpdGhOYW1lKFRJRkYqLCBjb25zdCBjaGFyICopOworCitleHRlcm4gdWludDMyIFRJRkZGaWVsZFRhZyhjb25zdCBUSUZGRmllbGQqKTsKK2V4dGVybiBjb25zdCBjaGFyKiBUSUZGRmllbGROYW1lKGNvbnN0IFRJRkZGaWVsZCopOworZXh0ZXJuIFRJRkZEYXRhVHlwZSBUSUZGRmllbGREYXRhVHlwZShjb25zdCBUSUZGRmllbGQqKTsKK2V4dGVybiBpbnQgVElGRkZpZWxkUGFzc0NvdW50KGNvbnN0IFRJRkZGaWVsZCopOworZXh0ZXJuIGludCBUSUZGRmllbGRSZWFkQ291bnQoY29uc3QgVElGRkZpZWxkKik7CitleHRlcm4gaW50IFRJRkZGaWVsZFdyaXRlQ291bnQoY29uc3QgVElGRkZpZWxkKik7CisKK3R5cGVkZWYgaW50ICgqVElGRlZTZXRNZXRob2QpKFRJRkYqLCB1aW50MzIsIHZhX2xpc3QpOwordHlwZWRlZiBpbnQgKCpUSUZGVkdldE1ldGhvZCkoVElGRiosIHVpbnQzMiwgdmFfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCpUSUZGUHJpbnRNZXRob2QpKFRJRkYqLCBGSUxFKiwgbG9uZyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUSUZGVlNldE1ldGhvZCB2c2V0ZmllbGQ7IC8qIHRhZyBzZXQgcm91dGluZSAqLworICAgIFRJRkZWR2V0TWV0aG9kIHZnZXRmaWVsZDsgLyogdGFnIGdldCByb3V0aW5lICovCisgICAgVElGRlByaW50TWV0aG9kIHByaW50ZGlyOyAvKiBkaXJlY3RvcnkgcHJpbnQgcm91dGluZSAqLworfSBUSUZGVGFnTWV0aG9kczsKKworZXh0ZXJuICBUSUZGVGFnTWV0aG9kcyAqVElGRkFjY2Vzc1RhZ01ldGhvZHMoVElGRiAqKTsKK2V4dGVybiAgdm9pZCAqVElGRkdldENsaWVudEluZm8oVElGRiAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuICB2b2lkIFRJRkZTZXRDbGllbnRJbmZvKFRJRkYgKiwgdm9pZCAqLCBjb25zdCBjaGFyICopOworCitleHRlcm4gdm9pZCBUSUZGQ2xlYW51cChUSUZGKiB0aWYpOworZXh0ZXJuIHZvaWQgVElGRkNsb3NlKFRJRkYqIHRpZik7CitleHRlcm4gaW50IFRJRkZGbHVzaChUSUZGKiB0aWYpOworZXh0ZXJuIGludCBUSUZGRmx1c2hEYXRhKFRJRkYqIHRpZik7CitleHRlcm4gaW50IFRJRkZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLik7CitleHRlcm4gaW50IFRJRkZWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKTsKK2V4dGVybiBpbnQgVElGRkdldEZpZWxkRGVmYXVsdGVkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgLi4uKTsKK2V4dGVybiBpbnQgVElGRlZHZXRGaWVsZERlZmF1bHRlZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApOworZXh0ZXJuIGludCBUSUZGUmVhZERpcmVjdG9yeShUSUZGKiB0aWYpOworZXh0ZXJuIGludCBUSUZGUmVhZEN1c3RvbURpcmVjdG9yeShUSUZGKiB0aWYsIHRvZmZfdCBkaXJvZmYsIGNvbnN0IFRJRkZGaWVsZEFycmF5KiBpbmZvYXJyYXkpOworZXh0ZXJuIGludCBUSUZGUmVhZEVYSUZEaXJlY3RvcnkoVElGRiogdGlmLCB0b2ZmX3QgZGlyb2ZmKTsKK2V4dGVybiB1aW50NjQgVElGRlNjYW5saW5lU2l6ZTY0KFRJRkYqIHRpZik7CitleHRlcm4gdG1zaXplX3QgVElGRlNjYW5saW5lU2l6ZShUSUZGKiB0aWYpOworZXh0ZXJuIHVpbnQ2NCBUSUZGUmFzdGVyU2NhbmxpbmVTaXplNjQoVElGRiogdGlmKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGUmFzdGVyU2NhbmxpbmVTaXplKFRJRkYqIHRpZik7CitleHRlcm4gdWludDY0IFRJRkZTdHJpcFNpemU2NChUSUZGKiB0aWYpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZTdHJpcFNpemUoVElGRiogdGlmKTsKK2V4dGVybiB1aW50NjQgVElGRlJhd1N0cmlwU2l6ZTY0KFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGUmF3U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKTsKK2V4dGVybiB1aW50NjQgVElGRlZTdHJpcFNpemU2NChUSUZGKiB0aWYsIHVpbnQzMiBucm93cyk7CitleHRlcm4gdG1zaXplX3QgVElGRlZTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgbnJvd3MpOworZXh0ZXJuIHVpbnQ2NCBUSUZGVGlsZVJvd1NpemU2NChUSUZGKiB0aWYpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZUaWxlUm93U2l6ZShUSUZGKiB0aWYpOworZXh0ZXJuIHVpbnQ2NCBUSUZGVGlsZVNpemU2NChUSUZGKiB0aWYpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZUaWxlU2l6ZShUSUZGKiB0aWYpOworZXh0ZXJuIHVpbnQ2NCBUSUZGVlRpbGVTaXplNjQoVElGRiogdGlmLCB1aW50MzIgbnJvd3MpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZWVGlsZVNpemUoVElGRiogdGlmLCB1aW50MzIgbnJvd3MpOworZXh0ZXJuIHVpbnQzMiBUSUZGRGVmYXVsdFN0cmlwU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiByZXF1ZXN0KTsKK2V4dGVybiB2b2lkIFRJRkZEZWZhdWx0VGlsZVNpemUoVElGRiosIHVpbnQzMiosIHVpbnQzMiopOworZXh0ZXJuIGludCBUSUZGRmlsZW5vKFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRlNldEZpbGVubyhUSUZGKiwgaW50KTsKK2V4dGVybiB0aGFuZGxlX3QgVElGRkNsaWVudGRhdGEoVElGRiopOworZXh0ZXJuIHRoYW5kbGVfdCBUSUZGU2V0Q2xpZW50ZGF0YShUSUZGKiwgdGhhbmRsZV90KTsKK2V4dGVybiBpbnQgVElGRkdldE1vZGUoVElGRiopOworZXh0ZXJuIGludCBUSUZGU2V0TW9kZShUSUZGKiwgaW50KTsKK2V4dGVybiBpbnQgVElGRklzVGlsZWQoVElGRiopOworZXh0ZXJuIGludCBUSUZGSXNCeXRlU3dhcHBlZChUSUZGKik7CitleHRlcm4gaW50IFRJRkZJc1VwU2FtcGxlZChUSUZGKik7CitleHRlcm4gaW50IFRJRkZJc01TQjJMU0IoVElGRiopOworZXh0ZXJuIGludCBUSUZGSXNCaWdFbmRpYW4oVElGRiopOworZXh0ZXJuIFRJRkZSZWFkV3JpdGVQcm9jIFRJRkZHZXRSZWFkUHJvYyhUSUZGKik7CitleHRlcm4gVElGRlJlYWRXcml0ZVByb2MgVElGRkdldFdyaXRlUHJvYyhUSUZGKik7CitleHRlcm4gVElGRlNlZWtQcm9jIFRJRkZHZXRTZWVrUHJvYyhUSUZGKik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorZXh0ZXJuIFRJRkZDbG9zZVByb2MgVElGRkdldENsb3NlUHJvYyhUSUZGKik7CitleHRlcm4gVElGRlNpemVQcm9jIFRJRkZHZXRTaXplUHJvYyhUSUZGKik7CitleHRlcm4gVElGRk1hcEZpbGVQcm9jIFRJRkZHZXRNYXBGaWxlUHJvYyhUSUZGKik7CitleHRlcm4gVElGRlVubWFwRmlsZVByb2MgVElGRkdldFVubWFwRmlsZVByb2MoVElGRiopOworZXh0ZXJuIHVpbnQzMiBUSUZGQ3VycmVudFJvdyhUSUZGKik7CitleHRlcm4gdWludDE2IFRJRkZDdXJyZW50RGlyZWN0b3J5KFRJRkYqKTsKK2V4dGVybiB1aW50MTYgVElGRk51bWJlck9mRGlyZWN0b3JpZXMoVElGRiopOworZXh0ZXJuIHVpbnQ2NCBUSUZGQ3VycmVudERpck9mZnNldChUSUZGKik7CitleHRlcm4gdWludDMyIFRJRkZDdXJyZW50U3RyaXAoVElGRiopOworZXh0ZXJuIHVpbnQzMiBUSUZGQ3VycmVudFRpbGUoVElGRiogdGlmKTsKK2V4dGVybiBpbnQgVElGRlJlYWRCdWZmZXJTZXR1cChUSUZGKiB0aWYsIHZvaWQqIGJwLCB0bXNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgVElGRldyaXRlQnVmZmVyU2V0dXAoVElGRiogdGlmLCB2b2lkKiBicCwgdG1zaXplX3Qgc2l6ZSk7ICAKK2V4dGVybiBpbnQgVElGRlNldHVwU3RyaXBzKFRJRkYgKik7CitleHRlcm4gaW50IFRJRkZXcml0ZUNoZWNrKFRJRkYqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBUSUZGRnJlZURpcmVjdG9yeShUSUZGKik7CitleHRlcm4gaW50IFRJRkZDcmVhdGVEaXJlY3RvcnkoVElGRiopOworZXh0ZXJuIGludCBUSUZGQ3JlYXRlQ3VzdG9tRGlyZWN0b3J5KFRJRkYqLGNvbnN0IFRJRkZGaWVsZEFycmF5Kik7CitleHRlcm4gaW50IFRJRkZDcmVhdGVFWElGRGlyZWN0b3J5KFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRkxhc3REaXJlY3RvcnkoVElGRiopOworZXh0ZXJuIGludCBUSUZGU2V0RGlyZWN0b3J5KFRJRkYqLCB1aW50MTYpOworZXh0ZXJuIGludCBUSUZGU2V0U3ViRGlyZWN0b3J5KFRJRkYqLCB1aW50NjQpOworZXh0ZXJuIGludCBUSUZGVW5saW5rRGlyZWN0b3J5KFRJRkYqLCB1aW50MTYpOworZXh0ZXJuIGludCBUSUZGU2V0RmllbGQoVElGRiosIHVpbnQzMiwgLi4uKTsKK2V4dGVybiBpbnQgVElGRlZTZXRGaWVsZChUSUZGKiwgdWludDMyLCB2YV9saXN0KTsKK2V4dGVybiBpbnQgVElGRlVuc2V0RmllbGQoVElGRiosIHVpbnQzMik7CitleHRlcm4gaW50IFRJRkZXcml0ZURpcmVjdG9yeShUSUZGICopOworZXh0ZXJuIGludCBUSUZGV3JpdGVDdXN0b21EaXJlY3RvcnkoVElGRiAqLCB1aW50NjQgKik7CitleHRlcm4gaW50IFRJRkZDaGVja3BvaW50RGlyZWN0b3J5KFRJRkYgKik7CitleHRlcm4gaW50IFRJRkZSZXdyaXRlRGlyZWN0b3J5KFRJRkYgKik7CisKKyNpZiBkZWZpbmVkKGNfcGx1c3BsdXMpIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gdm9pZCBUSUZGUHJpbnREaXJlY3RvcnkoVElGRiosIEZJTEUqLCBsb25nID0gMCk7CitleHRlcm4gaW50IFRJRkZSZWFkU2NhbmxpbmUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUgPSAwKTsKK2V4dGVybiBpbnQgVElGRldyaXRlU2NhbmxpbmUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUgPSAwKTsKK2V4dGVybiBpbnQgVElGRlJlYWRSR0JBSW1hZ2UoVElGRiosIHVpbnQzMiwgdWludDMyLCB1aW50MzIqLCBpbnQgPSAwKTsKK2V4dGVybiBpbnQgVElGRlJlYWRSR0JBSW1hZ2VPcmllbnRlZChUSUZGKiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiosCisgICAgaW50ID0gT1JJRU5UQVRJT05fQk9UTEVGVCwgaW50ID0gMCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgVElGRlByaW50RGlyZWN0b3J5KFRJRkYqLCBGSUxFKiwgbG9uZyk7CitleHRlcm4gaW50IFRJRkZSZWFkU2NhbmxpbmUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUpOworZXh0ZXJuIGludCBUSUZGV3JpdGVTY2FubGluZShUSUZGKiB0aWYsIHZvaWQqIGJ1ZiwgdWludDMyIHJvdywgdWludDE2IHNhbXBsZSk7CitleHRlcm4gaW50IFRJRkZSZWFkUkdCQUltYWdlKFRJRkYqLCB1aW50MzIsIHVpbnQzMiwgdWludDMyKiwgaW50KTsKK2V4dGVybiBpbnQgVElGRlJlYWRSR0JBSW1hZ2VPcmllbnRlZChUSUZGKiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiosIGludCwgaW50KTsKKyNlbmRpZgorCitleHRlcm4gaW50IFRJRkZSZWFkUkdCQVN0cmlwKFRJRkYqLCB1aW50MzIsIHVpbnQzMiAqICk7CitleHRlcm4gaW50IFRJRkZSZWFkUkdCQVRpbGUoVElGRiosIHVpbnQzMiwgdWludDMyLCB1aW50MzIgKiApOworZXh0ZXJuIGludCBUSUZGUkdCQUltYWdlT0soVElGRiosIGNoYXIgWzEwMjRdKTsKK2V4dGVybiBpbnQgVElGRlJHQkFJbWFnZUJlZ2luKFRJRkZSR0JBSW1hZ2UqLCBUSUZGKiwgaW50LCBjaGFyIFsxMDI0XSk7CitleHRlcm4gaW50IFRJRkZSR0JBSW1hZ2VHZXQoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyKTsKK2V4dGVybiB2b2lkIFRJRkZSR0JBSW1hZ2VFbmQoVElGRlJHQkFJbWFnZSopOworZXh0ZXJuIFRJRkYqIFRJRkZPcGVuKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjIGlmZGVmIF9fV0lOMzJfXworZXh0ZXJuIFRJRkYqIFRJRkZPcGVuVyhjb25zdCB3Y2hhcl90KiwgY29uc3QgY2hhciopOworIyBlbmRpZiAvKiBfX1dJTjMyX18gKi8KK2V4dGVybiBUSUZGKiBUSUZGRmRPcGVuKGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK2V4dGVybiBUSUZGKiBUSUZGQ2xpZW50T3Blbihjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisJICAgIHRoYW5kbGVfdCwKKwkgICAgVElGRlJlYWRXcml0ZVByb2MsIFRJRkZSZWFkV3JpdGVQcm9jLAorCSAgICBUSUZGU2Vla1Byb2MsIFRJRkZDbG9zZVByb2MsCisJICAgIFRJRkZTaXplUHJvYywKKwkgICAgVElGRk1hcEZpbGVQcm9jLCBUSUZGVW5tYXBGaWxlUHJvYyk7CitleHRlcm4gY29uc3QgY2hhciogVElGRkZpbGVOYW1lKFRJRkYqKTsKK2V4dGVybiBjb25zdCBjaGFyKiBUSUZGU2V0RmlsZU5hbWUoVElGRiosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBUSUZGRXJyb3IoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sMiwzKSkpOworZXh0ZXJuIHZvaWQgVElGRkVycm9yRXh0KHRoYW5kbGVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sMyw0KSkpOworZXh0ZXJuIHZvaWQgVElGRldhcm5pbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sMiwzKSkpOworZXh0ZXJuIHZvaWQgVElGRldhcm5pbmdFeHQodGhhbmRsZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIC4uLikgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyAoX19wcmludGZfXywzLDQpKSk7CitleHRlcm4gVElGRkVycm9ySGFuZGxlciBUSUZGU2V0RXJyb3JIYW5kbGVyKFRJRkZFcnJvckhhbmRsZXIpOworZXh0ZXJuIFRJRkZFcnJvckhhbmRsZXJFeHQgVElGRlNldEVycm9ySGFuZGxlckV4dChUSUZGRXJyb3JIYW5kbGVyRXh0KTsKK2V4dGVybiBUSUZGRXJyb3JIYW5kbGVyIFRJRkZTZXRXYXJuaW5nSGFuZGxlcihUSUZGRXJyb3JIYW5kbGVyKTsKK2V4dGVybiBUSUZGRXJyb3JIYW5kbGVyRXh0IFRJRkZTZXRXYXJuaW5nSGFuZGxlckV4dChUSUZGRXJyb3JIYW5kbGVyRXh0KTsKK2V4dGVybiBUSUZGRXh0ZW5kUHJvYyBUSUZGU2V0VGFnRXh0ZW5kZXIoVElGRkV4dGVuZFByb2MpOworZXh0ZXJuIHVpbnQzMiBUSUZGQ29tcHV0ZVRpbGUoVElGRiogdGlmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcyk7CitleHRlcm4gaW50IFRJRkZDaGVja1RpbGUoVElGRiogdGlmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcyk7CitleHRlcm4gdWludDMyIFRJRkZOdW1iZXJPZlRpbGVzKFRJRkYqKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGUmVhZFRpbGUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiB4LCB1aW50MzIgeSwgdWludDMyIHosIHVpbnQxNiBzKTsgIAorZXh0ZXJuIHRtc2l6ZV90IFRJRkZXcml0ZVRpbGUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiB4LCB1aW50MzIgeSwgdWludDMyIHosIHVpbnQxNiBzKTsKK2V4dGVybiB1aW50MzIgVElGRkNvbXB1dGVTdHJpcChUSUZGKiwgdWludDMyLCB1aW50MTYpOworZXh0ZXJuIHVpbnQzMiBUSUZGTnVtYmVyT2ZTdHJpcHMoVElGRiopOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZSZWFkRW5jb2RlZFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZSZWFkUmF3U3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSk7ICAKK2V4dGVybiB0bXNpemVfdCBUSUZGUmVhZEVuY29kZWRUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSk7ICAKK2V4dGVybiB0bXNpemVfdCBUSUZGUmVhZFJhd1RpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKTsgIAorZXh0ZXJuIHRtc2l6ZV90IFRJRkZXcml0ZUVuY29kZWRTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogZGF0YSwgdG1zaXplX3QgY2MpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZXcml0ZVJhd1N0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBkYXRhLCB0bXNpemVfdCBjYyk7ICAKK2V4dGVybiB0bXNpemVfdCBUSUZGV3JpdGVFbmNvZGVkVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlLCB2b2lkKiBkYXRhLCB0bXNpemVfdCBjYyk7ICAKK2V4dGVybiB0bXNpemVfdCBUSUZGV3JpdGVSYXdUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKTsgIAorZXh0ZXJuIGludCBUSUZGRGF0YVdpZHRoKFRJRkZEYXRhVHlwZSk7ICAgIC8qIHRhYmxlIG9mIHRhZyBkYXRhdHlwZSB3aWR0aHMgKi8KK2V4dGVybiB2b2lkIFRJRkZTZXRXcml0ZU9mZnNldChUSUZGKiB0aWYsIHRvZmZfdCBvZmYpOworZXh0ZXJuIHZvaWQgVElGRlN3YWJTaG9ydCh1aW50MTYqKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiTG9uZyh1aW50MzIqKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiTG9uZzgodWludDY0Kik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkZsb2F0KGZsb2F0Kik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkRvdWJsZShkb3VibGUqKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiQXJyYXlPZlNob3J0KHVpbnQxNiogd3AsIHRtc2l6ZV90IG4pOworZXh0ZXJuIHZvaWQgVElGRlN3YWJBcnJheU9mVHJpcGxlcyh1aW50OCogdHAsIHRtc2l6ZV90IG4pOworZXh0ZXJuIHZvaWQgVElGRlN3YWJBcnJheU9mTG9uZyh1aW50MzIqIGxwLCB0bXNpemVfdCBuKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiQXJyYXlPZkxvbmc4KHVpbnQ2NCogbHAsIHRtc2l6ZV90IG4pOworZXh0ZXJuIHZvaWQgVElGRlN3YWJBcnJheU9mRmxvYXQoZmxvYXQqIGZwLCB0bXNpemVfdCBuKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiQXJyYXlPZkRvdWJsZShkb3VibGUqIGRwLCB0bXNpemVfdCBuKTsKK2V4dGVybiB2b2lkIFRJRkZSZXZlcnNlQml0cyh1aW50OCogY3AsIHRtc2l6ZV90IG4pOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIqIFRJRkZHZXRCaXRSZXZUYWJsZShpbnQpOworCisjaWZkZWYgTE9HTFVWX1BVQkxJQworI2RlZmluZSBVX05FVQkJMC4yMTA1MjYzMTYKKyNkZWZpbmUgVl9ORVUJCTAuNDczNjg0MjExCisjZGVmaW5lIFVWU0NBTEUJCTQxMC4KK2V4dGVybiBkb3VibGUgTG9nTDE2dG9ZKGludCk7CitleHRlcm4gZG91YmxlIExvZ0wxMHRvWShpbnQpOworZXh0ZXJuIHZvaWQgWFladG9SR0IyNChmbG9hdCosIHVpbnQ4Kik7CitleHRlcm4gaW50IHV2X2RlY29kZShkb3VibGUqLCBkb3VibGUqLCBpbnQpOworZXh0ZXJuIHZvaWQgTG9nTHV2MjR0b1hZWih1aW50MzIsIGZsb2F0Kik7CitleHRlcm4gdm9pZCBMb2dMdXYzMnRvWFlaKHVpbnQzMiwgZmxvYXQqKTsKKyNpZiBkZWZpbmVkKGNfcGx1c3BsdXMpIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gaW50IExvZ0wxNmZyb21ZKGRvdWJsZSwgaW50ID0gU0dJTE9HRU5DT0RFX05PRElUSEVSKTsKK2V4dGVybiBpbnQgTG9nTDEwZnJvbVkoZG91YmxlLCBpbnQgPSBTR0lMT0dFTkNPREVfTk9ESVRIRVIpOworZXh0ZXJuIGludCB1dl9lbmNvZGUoZG91YmxlLCBkb3VibGUsIGludCA9IFNHSUxPR0VOQ09ERV9OT0RJVEhFUik7CitleHRlcm4gdWludDMyIExvZ0x1djI0ZnJvbVhZWihmbG9hdCosIGludCA9IFNHSUxPR0VOQ09ERV9OT0RJVEhFUik7CitleHRlcm4gdWludDMyIExvZ0x1djMyZnJvbVhZWihmbG9hdCosIGludCA9IFNHSUxPR0VOQ09ERV9OT0RJVEhFUik7CisjZWxzZQorZXh0ZXJuIGludCBMb2dMMTZmcm9tWShkb3VibGUsIGludCk7CitleHRlcm4gaW50IExvZ0wxMGZyb21ZKGRvdWJsZSwgaW50KTsKK2V4dGVybiBpbnQgdXZfZW5jb2RlKGRvdWJsZSwgZG91YmxlLCBpbnQpOworZXh0ZXJuIHVpbnQzMiBMb2dMdXYyNGZyb21YWVooZmxvYXQqLCBpbnQpOworZXh0ZXJuIHVpbnQzMiBMb2dMdXYzMmZyb21YWVooZmxvYXQqLCBpbnQpOworI2VuZGlmCisjZW5kaWYgLyogTE9HTFVWX1BVQkxJQyAqLworCitleHRlcm4gaW50IFRJRkZDSUVMYWJUb1JHQkluaXQoVElGRkNJRUxhYlRvUkdCKiwgY29uc3QgVElGRkRpc3BsYXkgKiwgZmxvYXQqKTsKK2V4dGVybiB2b2lkIFRJRkZDSUVMYWJUb1hZWihUSUZGQ0lFTGFiVG9SR0IgKiwgdWludDMyLCBpbnQzMiwgaW50MzIsCisgICAgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKik7CitleHRlcm4gdm9pZCBUSUZGWFlaVG9SR0IoVElGRkNJRUxhYlRvUkdCICosIGZsb2F0LCBmbG9hdCwgZmxvYXQsCisgICAgdWludDMyICosIHVpbnQzMiAqLCB1aW50MzIgKik7CisKK2V4dGVybiBpbnQgVElGRllDYkNyVG9SR0JJbml0KFRJRkZZQ2JDclRvUkdCKiwgZmxvYXQqLCBmbG9hdCopOworZXh0ZXJuIHZvaWQgVElGRllDYkNydG9SR0IoVElGRllDYkNyVG9SR0IgKiwgdWludDMyLCBpbnQzMiwgaW50MzIsCisgICAgdWludDMyICosIHVpbnQzMiAqLCB1aW50MzIgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIE8gQiBTIE8gTCBFIFQgRSBEICAgIEkgTiBUIEUgUiBGIEEgQyBFIFMKKyAqCisgKiBEb24ndCB1c2UgdGhpcyBzdHVmZiBpbiB5b3VyIGFwcGxpY2F0aW9ucywgaXQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQorICogbGlidGlmZiB2ZXJzaW9ucy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZglzdHJ1Y3QgeworCXR0YWdfdAlmaWVsZF90YWc7CQkvKiBmaWVsZCdzIHRhZyAqLworCXNob3J0CWZpZWxkX3JlYWRjb3VudDsJLyogcmVhZCBjb3VudC9USUZGX1ZBUklBQkxFL1RJRkZfU1BQICovCisJc2hvcnQJZmllbGRfd3JpdGVjb3VudDsJLyogd3JpdGUgY291bnQvVElGRl9WQVJJQUJMRSAqLworCVRJRkZEYXRhVHlwZSBmaWVsZF90eXBlOwkvKiB0eXBlIG9mIGFzc29jaWF0ZWQgZGF0YSAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmaWVsZF9iaXQ7CS8qIGJpdCBpbiBmaWVsZHNzZXQgYml0IHZlY3RvciAqLworCXVuc2lnbmVkIGNoYXIgZmllbGRfb2t0b2NoYW5nZTsJLyogaWYgdHJ1ZSwgY2FuIGNoYW5nZSB3aGlsZSB3cml0aW5nICovCisJdW5zaWduZWQgY2hhciBmaWVsZF9wYXNzY291bnQ7CS8qIGlmIHRydWUsIHBhc3MgZGlyIGNvdW50IG9uIHNldCAqLworCWNoYXIJKmZpZWxkX25hbWU7CQkvKiBBU0NJSSBuYW1lICovCit9IFRJRkZGaWVsZEluZm87CisKK2V4dGVybiBpbnQgVElGRk1lcmdlRmllbGRJbmZvKFRJRkYqLCBjb25zdCBUSUZGRmllbGRJbmZvW10sIHVpbnQzMik7CisgICAgICAgIAorI2lmIGRlZmluZWQoY19wbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1RJRkZJT18gKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZmZpb3AuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmZmlvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGRjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3RpZmZpb3AuaApAQCAtMCwwICsxLDM2NyBAQAorLyogJElkOiB0aWZmaW9wLmgsdiAxLjg0IDIwMTItMDUtMzAgMDE6NTA6MTcgZndhcm1lcmRhbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfVElGRklPUF8KKyNkZWZpbmUJX1RJRkZJT1BfCisvKgorICogYGBMaWJyYXJ5LXByaXZhdGUnJyBkZWZpbml0aW9ucy4KKyAqLworCisjaW5jbHVkZSAidGlmZmNvbmYuaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0FTU0VSVF9ICisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2Vsc2UKKyMgZGVmaW5lIGFzc2VydCh4KSAKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TRUFSQ0hfSAorIyBpbmNsdWRlIDxzZWFyY2guaD4KKyNlbHNlCitleHRlcm4gdm9pZCAqbGZpbmQoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCAqLCBzaXplX3QsCisJCSAgIGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKKyNlbmRpZgorCisjaW5jbHVkZSAidGlmZmlvLmgiCisKKyNpbmNsdWRlICJ0aWZfZGlyLmgiCisKKyNpZm5kZWYgU1RSSVBfU0laRV9ERUZBVUxUCisjIGRlZmluZSBTVFJJUF9TSVpFX0RFRkFVTFQgODE5MgorI2VuZGlmCisKKyNkZWZpbmUgICAgc3RyZXEoYSxiKSAgICAgIChzdHJjbXAoYSxiKSA9PSAwKQorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUJVFJVRQkxCisjZGVmaW5lCUZBTFNFCTAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBjbGllbnRfaW5mbyB7CisgICAgc3RydWN0IGNsaWVudF9pbmZvICpuZXh0OworICAgIHZvaWQgKmRhdGE7CisgICAgY2hhciAqbmFtZTsKK30gVElGRkNsaWVudEluZm9MaW5rOworCisvKgorICogVHlwZWRlZnMgZm9yIGBgbWV0aG9kIHBvaW50ZXJzJycgdXNlZCBpbnRlcm5hbGx5LgorICogdGhlc2UgYXJlIGRlcHJpY2lhdGVkIGFuZCBwcm92aWRlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdGlkYXRhdmFsX3Q7ICAgIC8qIGludGVybmFsIGltYWdlIGRhdGEgdmFsdWUgdHlwZSAqLwordHlwZWRlZiB0aWRhdGF2YWxfdCogdGlkYXRhX3Q7ICAgICAgICAvKiByZWZlcmVuY2UgdG8gaW50ZXJuYWwgaW1hZ2UgZGF0YSAqLworCit0eXBlZGVmIHZvaWQgKCpUSUZGVm9pZE1ldGhvZCkoVElGRiopOwordHlwZWRlZiBpbnQgKCpUSUZGQm9vbE1ldGhvZCkoVElGRiopOwordHlwZWRlZiBpbnQgKCpUSUZGUHJlTWV0aG9kKShUSUZGKiwgdWludDE2KTsKK3R5cGVkZWYgaW50ICgqVElGRkNvZGVNZXRob2QpKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSwgdWludDE2IHNhbXBsZSk7Cit0eXBlZGVmIGludCAoKlRJRkZTZWVrTWV0aG9kKShUSUZGKiwgdWludDMyKTsKK3R5cGVkZWYgdm9pZCAoKlRJRkZQb3N0TWV0aG9kKShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IHNpemUpOwordHlwZWRlZiB1aW50MzIgKCpUSUZGU3RyaXBNZXRob2QpKFRJRkYqLCB1aW50MzIpOwordHlwZWRlZiB2b2lkICgqVElGRlRpbGVNZXRob2QpKFRJRkYqLCB1aW50MzIqLCB1aW50MzIqKTsKKworc3RydWN0IHRpZmYgeworCWNoYXIqICAgICAgICAgICAgICAgIHRpZl9uYW1lOyAgICAgICAgIC8qIG5hbWUgb2Ygb3BlbiBmaWxlICovCisJaW50ICAgICAgICAgICAgICAgICAgdGlmX2ZkOyAgICAgICAgICAgLyogb3BlbiBmaWxlIGRlc2NyaXB0b3IgKi8KKwlpbnQgICAgICAgICAgICAgICAgICB0aWZfbW9kZTsgICAgICAgICAvKiBvcGVuIG1vZGUgKE9fKikgKi8KKwl1aW50MzIgICAgICAgICAgICAgICB0aWZfZmxhZ3M7CisJI2RlZmluZSBUSUZGX0ZJTExPUkRFUiAgIDB4MDAwMDMgLyogbmF0dXJhbCBiaXQgZmlsbCBvcmRlciBmb3IgbWFjaGluZSAqLworCSNkZWZpbmUgVElGRl9ESVJUWUhFQURFUiAweDAwMDA0IC8qIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gb24gY2xvc2UgKi8KKwkjZGVmaW5lIFRJRkZfRElSVFlESVJFQ1QgMHgwMDAwOCAvKiBjdXJyZW50IGRpcmVjdG9yeSBtdXN0IGJlIHdyaXR0ZW4gKi8KKwkjZGVmaW5lIFRJRkZfQlVGRkVSU0VUVVAgMHgwMDAxMCAvKiBkYXRhIGJ1ZmZlcnMgc2V0dXAgKi8KKwkjZGVmaW5lIFRJRkZfQ09ERVJTRVRVUCAgMHgwMDAyMCAvKiBlbmNvZGVyL2RlY29kZXIgc2V0dXAgZG9uZSAqLworCSNkZWZpbmUgVElGRl9CRUVOV1JJVElORyAweDAwMDQwIC8qIHdyaXR0ZW4gMSsgc2NhbmxpbmVzIHRvIGZpbGUgKi8KKwkjZGVmaW5lIFRJRkZfU1dBQiAgICAgICAgMHgwMDA4MCAvKiBieXRlIHN3YXAgZmlsZSBpbmZvcm1hdGlvbiAqLworCSNkZWZpbmUgVElGRl9OT0JJVFJFViAgICAweDAwMTAwIC8qIGluaGliaXQgYml0IHJldmVyc2FsIGxvZ2ljICovCisJI2RlZmluZSBUSUZGX01ZQlVGRkVSICAgIDB4MDAyMDAgLyogbXkgcmF3IGRhdGEgYnVmZmVyOyBmcmVlIG9uIGNsb3NlICovCisJI2RlZmluZSBUSUZGX0lTVElMRUQgICAgIDB4MDA0MDAgLyogZmlsZSBpcyB0aWxlLCBub3Qgc3RyaXAtIGJhc2VkICovCisJI2RlZmluZSBUSUZGX01BUFBFRCAgICAgIDB4MDA4MDAgLyogZmlsZSBpcyBtYXBwZWQgaW50byBtZW1vcnkgKi8KKwkjZGVmaW5lIFRJRkZfUE9TVEVOQ09ERSAgMHgwMTAwMCAvKiBuZWVkIGNhbGwgdG8gcG9zdGVuY29kZSByb3V0aW5lICovCisJI2RlZmluZSBUSUZGX0lOU1VCSUZEICAgIDB4MDIwMDAgLyogY3VycmVudGx5IHdyaXRpbmcgYSBzdWJpZmQgKi8KKwkjZGVmaW5lIFRJRkZfVVBTQU1QTEVEICAgMHgwNDAwMCAvKiBsaWJyYXJ5IGlzIGRvaW5nIGRhdGEgdXAtc2FtcGxpbmcgKi8KKwkjZGVmaW5lIFRJRkZfU1RSSVBDSE9QICAgMHgwODAwMCAvKiBlbmFibGUgc3RyaXAgY2hvcHBpbmcgc3VwcG9ydCAqLworCSNkZWZpbmUgVElGRl9IRUFERVJPTkxZICAweDEwMDAwIC8qIHJlYWQgaGVhZGVyIG9ubHksIGRvIG5vdCBwcm9jZXNzIHRoZSBmaXJzdCBkaXJlY3RvcnkgKi8KKwkjZGVmaW5lIFRJRkZfTk9SRUFEUkFXICAgMHgyMDAwMCAvKiBza2lwIHJlYWRpbmcgb2YgcmF3IHVuY29tcHJlc3NlZCBpbWFnZSBkYXRhICovCisJI2RlZmluZSBUSUZGX0lOQ1VTVE9NSUZEIDB4NDAwMDAgLyogY3VycmVudGx5IHdyaXRpbmcgYSBjdXN0b20gSUZEICovCisJI2RlZmluZSBUSUZGX0JJR1RJRkYgICAgIDB4ODAwMDAgLyogcmVhZC93cml0ZSBiaWd0aWZmICovCisgICAgICAgICNkZWZpbmUgVElGRl9CVUY0V1JJVEUgIDB4MTAwMDAwIC8qIHJhd2NjIGJ5dGVzIGFyZSBmb3Igd3JpdGluZyAqLworICAgICAgICAjZGVmaW5lIFRJRkZfRElSVFlTVFJJUCAweDIwMDAwMCAvKiBzdHJpcG9mZnNldHMvc3RyaXBieXRlY291bnQgZGlydHkqLworICAgICAgICAjZGVmaW5lIFRJRkZfUEVSU0FNUExFICAweDQwMDAwMCAvKiBnZXQvc2V0IHBlciBzYW1wbGUgdGFncyBhcyBhcnJheXMgKi8KKyAgICAgICAgI2RlZmluZSBUSUZGX0JVRkZFUk1NQVAgMHg4MDAwMDAgLyogcmVhZCBidWZmZXIgKHRpZl9yYXdkYXRhKSBwb2ludHMgaW50byBtbWFwKCkgbWVtb3J5ICovCisJdWludDY0ICAgICAgICAgICAgICAgdGlmX2Rpcm9mZjsgICAgICAgLyogZmlsZSBvZmZzZXQgb2YgY3VycmVudCBkaXJlY3RvcnkgKi8KKwl1aW50NjQgICAgICAgICAgICAgICB0aWZfbmV4dGRpcm9mZjsgICAvKiBmaWxlIG9mZnNldCBvZiBmb2xsb3dpbmcgZGlyZWN0b3J5ICovCisJdWludDY0KiAgICAgICAgICAgICAgdGlmX2Rpcmxpc3Q7ICAgICAgLyogbGlzdCBvZiBvZmZzZXRzIHRvIGFscmVhZHkgc2VlbiBkaXJlY3RvcmllcyB0byBwcmV2ZW50IElGRCBsb29waW5nICovCisJdWludDE2ICAgICAgICAgICAgICAgdGlmX2Rpcmxpc3RzaXplOyAgLyogbnVtYmVyIG9mIGVudGlyZXMgaW4gb2Zmc2V0IGxpc3QgKi8KKwl1aW50MTYgICAgICAgICAgICAgICB0aWZfZGlybnVtYmVyOyAgICAvKiBudW1iZXIgb2YgYWxyZWFkeSBzZWVuIGRpcmVjdG9yaWVzICovCisJVElGRkRpcmVjdG9yeSAgICAgICAgdGlmX2RpcjsgICAgICAgICAgLyogaW50ZXJuYWwgcmVwIG9mIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJVElGRkRpcmVjdG9yeSAgICAgICAgdGlmX2N1c3RvbWRpcjsgICAgLyogY3VzdG9tIElGRHMgYXJlIHNlcGFyYXRlZCBmcm9tIHRoZSBtYWluIG9uZXMgKi8KKwl1bmlvbiB7CisJCVRJRkZIZWFkZXJDb21tb24gY29tbW9uOworCQlUSUZGSGVhZGVyQ2xhc3NpYyBjbGFzc2ljOworCQlUSUZGSGVhZGVyQmlnIGJpZzsKKwl9IHRpZl9oZWFkZXI7CisJdWludDE2ICAgICAgICAgICAgICAgdGlmX2hlYWRlcl9zaXplOyAgLyogZmlsZSdzIGhlYWRlciBibG9jayBhbmQgaXRzIGxlbmd0aCAqLworCXVpbnQzMiAgICAgICAgICAgICAgIHRpZl9yb3c7ICAgICAgICAgIC8qIGN1cnJlbnQgc2NhbmxpbmUgKi8KKwl1aW50MTYgICAgICAgICAgICAgICB0aWZfY3VyZGlyOyAgICAgICAvKiBjdXJyZW50IGRpcmVjdG9yeSAoaW5kZXgpICovCisJdWludDMyICAgICAgICAgICAgICAgdGlmX2N1cnN0cmlwOyAgICAgLyogY3VycmVudCBzdHJpcCBmb3IgcmVhZC93cml0ZSAqLworCXVpbnQ2NCAgICAgICAgICAgICAgIHRpZl9jdXJvZmY7ICAgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGZvciByZWFkL3dyaXRlICovCisJdWludDY0ICAgICAgICAgICAgICAgdGlmX2RhdGFvZmY7ICAgICAgLyogY3VycmVudCBvZmZzZXQgZm9yIHdyaXRpbmcgZGlyICovCisJLyogU3ViSUZEIHN1cHBvcnQgKi8KKwl1aW50MTYgICAgICAgICAgICAgICB0aWZfbnN1YmlmZDsgICAgICAvKiByZW1haW5pbmcgc3ViaWZkcyB0byB3cml0ZSAqLworCXVpbnQ2NCAgICAgICAgICAgICAgIHRpZl9zdWJpZmRvZmY7ICAgIC8qIG9mZnNldCBmb3IgcGF0Y2hpbmcgU3ViSUZEIGxpbmsgKi8KKwkvKiB0aWxpbmcgc3VwcG9ydCAqLworCXVpbnQzMiAgICAgICAgICAgICAgIHRpZl9jb2w7ICAgICAgICAgIC8qIGN1cnJlbnQgY29sdW1uIChvZmZzZXQgYnkgcm93IHRvbykgKi8KKwl1aW50MzIgICAgICAgICAgICAgICB0aWZfY3VydGlsZTsgICAgICAvKiBjdXJyZW50IHRpbGUgZm9yIHJlYWQvd3JpdGUgKi8KKwl0bXNpemVfdCAgICAgICAgICAgICB0aWZfdGlsZXNpemU7ICAgICAvKiAjIG9mIGJ5dGVzIGluIGEgdGlsZSAqLworCS8qIGNvbXByZXNzaW9uIHNjaGVtZSBob29rcyAqLworCWludCAgICAgICAgICAgICAgICAgIHRpZl9kZWNvZGVzdGF0dXM7CisJVElGRkJvb2xNZXRob2QgICAgICAgdGlmX2ZpeHVwdGFnczsgICAgLyogY2FsbGVkIGluIFRJRkZSZWFkRGlyZWN0b3J5ICovCisJVElGRkJvb2xNZXRob2QgICAgICAgdGlmX3NldHVwZGVjb2RlOyAgLyogY2FsbGVkIG9uY2UgYmVmb3JlIHByZWRlY29kZSAqLworCVRJRkZQcmVNZXRob2QgICAgICAgIHRpZl9wcmVkZWNvZGU7ICAgIC8qIHByZS0gcm93L3N0cmlwL3RpbGUgZGVjb2RpbmcgKi8KKwlUSUZGQm9vbE1ldGhvZCAgICAgICB0aWZfc2V0dXBlbmNvZGU7ICAvKiBjYWxsZWQgb25jZSBiZWZvcmUgcHJlZW5jb2RlICovCisJaW50ICAgICAgICAgICAgICAgICAgdGlmX2VuY29kZXN0YXR1czsKKwlUSUZGUHJlTWV0aG9kICAgICAgICB0aWZfcHJlZW5jb2RlOyAgICAvKiBwcmUtIHJvdy9zdHJpcC90aWxlIGVuY29kaW5nICovCisJVElGRkJvb2xNZXRob2QgICAgICAgdGlmX3Bvc3RlbmNvZGU7ICAgLyogcG9zdC0gcm93L3N0cmlwL3RpbGUgZW5jb2RpbmcgKi8KKwlUSUZGQ29kZU1ldGhvZCAgICAgICB0aWZfZGVjb2Rlcm93OyAgICAvKiBzY2FubGluZSBkZWNvZGluZyByb3V0aW5lICovCisJVElGRkNvZGVNZXRob2QgICAgICAgdGlmX2VuY29kZXJvdzsgICAgLyogc2NhbmxpbmUgZW5jb2Rpbmcgcm91dGluZSAqLworCVRJRkZDb2RlTWV0aG9kICAgICAgIHRpZl9kZWNvZGVzdHJpcDsgIC8qIHN0cmlwIGRlY29kaW5nIHJvdXRpbmUgKi8KKwlUSUZGQ29kZU1ldGhvZCAgICAgICB0aWZfZW5jb2Rlc3RyaXA7ICAvKiBzdHJpcCBlbmNvZGluZyByb3V0aW5lICovCisJVElGRkNvZGVNZXRob2QgICAgICAgdGlmX2RlY29kZXRpbGU7ICAgLyogdGlsZSBkZWNvZGluZyByb3V0aW5lICovCisJVElGRkNvZGVNZXRob2QgICAgICAgdGlmX2VuY29kZXRpbGU7ICAgLyogdGlsZSBlbmNvZGluZyByb3V0aW5lICovCisJVElGRlZvaWRNZXRob2QgICAgICAgdGlmX2Nsb3NlOyAgICAgICAgLyogY2xlYW51cC1vbi1jbG9zZSByb3V0aW5lICovCisJVElGRlNlZWtNZXRob2QgICAgICAgdGlmX3NlZWs7ICAgICAgICAgLyogcG9zaXRpb24gd2l0aGluIGEgc3RyaXAgcm91dGluZSAqLworCVRJRkZWb2lkTWV0aG9kICAgICAgIHRpZl9jbGVhbnVwOyAgICAgIC8qIGNsZWFudXAgc3RhdGUgcm91dGluZSAqLworCVRJRkZTdHJpcE1ldGhvZCAgICAgIHRpZl9kZWZzdHJpcHNpemU7IC8qIGNhbGN1bGF0ZS9jb25zdHJhaW4gc3RyaXAgc2l6ZSAqLworCVRJRkZUaWxlTWV0aG9kICAgICAgIHRpZl9kZWZ0aWxlc2l6ZTsgIC8qIGNhbGN1bGF0ZS9jb25zdHJhaW4gdGlsZSBzaXplICovCisJdWludDgqICAgICAgICAgICAgICAgdGlmX2RhdGE7ICAgICAgICAgLyogY29tcHJlc3Npb24gc2NoZW1lIHByaXZhdGUgZGF0YSAqLworCS8qIGlucHV0L291dHB1dCBidWZmZXJpbmcgKi8KKwl0bXNpemVfdCAgICAgICAgICAgICB0aWZfc2NhbmxpbmVzaXplOyAvKiAjIG9mIGJ5dGVzIGluIGEgc2NhbmxpbmUgKi8KKwl0bXNpemVfdCAgICAgICAgICAgICB0aWZfc2NhbmxpbmVza2V3OyAvKiBzY2FubGluZSBza2V3IGZvciByZWFkaW5nIHN0cmlwcyAqLworCXVpbnQ4KiAgICAgICAgICAgICAgIHRpZl9yYXdkYXRhOyAgICAgIC8qIHJhdyBkYXRhIGJ1ZmZlciAqLworCXRtc2l6ZV90ICAgICAgICAgICAgIHRpZl9yYXdkYXRhc2l6ZTsgIC8qICMgb2YgYnl0ZXMgaW4gcmF3IGRhdGEgYnVmZmVyICovCisgICAgICAgIHRtc2l6ZV90ICAgICAgICAgICAgIHRpZl9yYXdkYXRhb2ZmOyAgIC8qIHJhd2RhdGEgb2Zmc2V0IHdpdGhpbiBzdHJpcCAqLworICAgICAgICB0bXNpemVfdCAgICAgICAgICAgICB0aWZfcmF3ZGF0YWxvYWRlZDsvKiBhbW91bnQgb2YgZGF0YSBpbiByYXdkYXRhICovCisJdWludDgqICAgICAgICAgICAgICAgdGlmX3Jhd2NwOyAgICAgICAgLyogY3VycmVudCBzcG90IGluIHJhdyBidWZmZXIgKi8KKwl0bXNpemVfdCAgICAgICAgICAgICB0aWZfcmF3Y2M7ICAgICAgICAvKiBieXRlcyB1bnJlYWQgZnJvbSByYXcgYnVmZmVyICovCisJLyogbWVtb3J5LW1hcHBlZCBmaWxlIHN1cHBvcnQgKi8KKwl1aW50OCogICAgICAgICAgICAgICB0aWZfYmFzZTsgICAgICAgICAvKiBiYXNlIG9mIG1hcHBlZCBmaWxlICovCisJdG1zaXplX3QgICAgICAgICAgICAgdGlmX3NpemU7ICAgICAgICAgLyogc2l6ZSBvZiBtYXBwZWQgZmlsZSByZWdpb24gKGJ5dGVzLCB0aHVzIHRtc2l6ZV90KSAqLworCVRJRkZNYXBGaWxlUHJvYyAgICAgIHRpZl9tYXBwcm9jOyAgICAgIC8qIG1hcCBmaWxlIG1ldGhvZCAqLworCVRJRkZVbm1hcEZpbGVQcm9jICAgIHRpZl91bm1hcHByb2M7ICAgIC8qIHVubWFwIGZpbGUgbWV0aG9kICovCisJLyogaW5wdXQvb3V0cHV0IGNhbGxiYWNrIG1ldGhvZHMgKi8KKwl0aGFuZGxlX3QgICAgICAgICAgICB0aWZfY2xpZW50ZGF0YTsgICAvKiBjYWxsYmFjayBwYXJhbWV0ZXIgKi8KKwlUSUZGUmVhZFdyaXRlUHJvYyAgICB0aWZfcmVhZHByb2M7ICAgICAvKiByZWFkIG1ldGhvZCAqLworCVRJRkZSZWFkV3JpdGVQcm9jICAgIHRpZl93cml0ZXByb2M7ICAgIC8qIHdyaXRlIG1ldGhvZCAqLworCVRJRkZTZWVrUHJvYyAgICAgICAgIHRpZl9zZWVrcHJvYzsgICAgIC8qIGxzZWVrIG1ldGhvZCAqLworCVRJRkZDbG9zZVByb2MgICAgICAgIHRpZl9jbG9zZXByb2M7ICAgIC8qIGNsb3NlIG1ldGhvZCAqLworCVRJRkZTaXplUHJvYyAgICAgICAgIHRpZl9zaXplcHJvYzsgICAgIC8qIGZpbGVzaXplIG1ldGhvZCAqLworCS8qIHBvc3QtZGVjb2Rpbmcgc3VwcG9ydCAqLworCVRJRkZQb3N0TWV0aG9kICAgICAgIHRpZl9wb3N0ZGVjb2RlOyAgIC8qIHBvc3QgZGVjb2Rpbmcgcm91dGluZSAqLworCS8qIHRhZyBzdXBwb3J0ICovCisJVElGRkZpZWxkKiogICAgICAgICAgdGlmX2ZpZWxkczsgICAgICAgLyogc29ydGVkIHRhYmxlIG9mIHJlZ2lzdGVyZWQgdGFncyAqLworCXNpemVfdCAgICAgICAgICAgICAgIHRpZl9uZmllbGRzOyAgICAgIC8qICMgZW50cmllcyBpbiByZWdpc3RlcmVkIHRhZyB0YWJsZSAqLworCWNvbnN0IFRJRkZGaWVsZCogICAgIHRpZl9mb3VuZGZpZWxkOyAgIC8qIGNhY2hlZCBwb2ludGVyIHRvIGFscmVhZHkgZm91bmQgdGFnICovCisJVElGRlRhZ01ldGhvZHMgICAgICAgdGlmX3RhZ21ldGhvZHM7ICAgLyogdGFnIGdldC9zZXQvcHJpbnQgcm91dGluZXMgKi8KKwlUSUZGQ2xpZW50SW5mb0xpbmsqICB0aWZfY2xpZW50aW5mbzsgICAvKiBleHRyYSBjbGllbnQgaW5mb3JtYXRpb24uICovCisJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBzdHVmZi4gV2UgbmVlZCB0aGVzZSB0d28gZmllbGRzIGZvcgorCSAqIHNldHRpbmcgdXAgYW4gb2xkIHRhZyBleHRlbnNpb24gc2NoZW1lLiAqLworCVRJRkZGaWVsZEFycmF5KiAgICAgIHRpZl9maWVsZHNjb21wYXQ7CisJc2l6ZV90ICAgICAgICAgICAgICAgdGlmX25maWVsZHNjb21wYXQ7Cit9OworCisjZGVmaW5lIGlzUHNldWRvVGFnKHQpICh0ID4gMHhmZmZmKSAgICAgICAgICAgIC8qIGlzIHRhZyB2YWx1ZSBub3JtYWwgb3IgcHNldWRvICovCisKKyNkZWZpbmUgaXNUaWxlZCh0aWYpICgoKHRpZiktPnRpZl9mbGFncyAmIFRJRkZfSVNUSUxFRCkgIT0gMCkKKyNkZWZpbmUgaXNNYXBwZWQodGlmKSAoKCh0aWYpLT50aWZfZmxhZ3MgJiBUSUZGX01BUFBFRCkgIT0gMCkKKyNkZWZpbmUgaXNGaWxsT3JkZXIodGlmLCBvKSAoKCh0aWYpLT50aWZfZmxhZ3MgJiAobykpICE9IDApCisjZGVmaW5lIGlzVXBTYW1wbGVkKHRpZikgKCgodGlmKS0+dGlmX2ZsYWdzICYgVElGRl9VUFNBTVBMRUQpICE9IDApCisjZGVmaW5lIFRJRkZSZWFkRmlsZSh0aWYsIGJ1Ziwgc2l6ZSkgXAorCSgoKih0aWYpLT50aWZfcmVhZHByb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSwoYnVmKSwoc2l6ZSkpKQorI2RlZmluZSBUSUZGV3JpdGVGaWxlKHRpZiwgYnVmLCBzaXplKSBcCisJKCgqKHRpZiktPnRpZl93cml0ZXByb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSwoYnVmKSwoc2l6ZSkpKQorI2RlZmluZSBUSUZGU2Vla0ZpbGUodGlmLCBvZmYsIHdoZW5jZSkgXAorCSgoKih0aWYpLT50aWZfc2Vla3Byb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSwob2ZmKSwod2hlbmNlKSkpCisjZGVmaW5lIFRJRkZDbG9zZUZpbGUodGlmKSBcCisJKCgqKHRpZiktPnRpZl9jbG9zZXByb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSkpCisjZGVmaW5lIFRJRkZHZXRGaWxlU2l6ZSh0aWYpIFwKKwkoKCoodGlmKS0+dGlmX3NpemVwcm9jKSgodGlmKS0+dGlmX2NsaWVudGRhdGEpKQorI2RlZmluZSBUSUZGTWFwRmlsZUNvbnRlbnRzKHRpZiwgcGFkZHIsIHBzaXplKSBcCisJKCgqKHRpZiktPnRpZl9tYXBwcm9jKSgodGlmKS0+dGlmX2NsaWVudGRhdGEsKHBhZGRyKSwocHNpemUpKSkKKyNkZWZpbmUgVElGRlVubWFwRmlsZUNvbnRlbnRzKHRpZiwgYWRkciwgc2l6ZSkgXAorCSgoKih0aWYpLT50aWZfdW5tYXBwcm9jKSgodGlmKS0+dGlmX2NsaWVudGRhdGEsKGFkZHIpLChzaXplKSkpCisKKy8qCisgKiBEZWZhdWx0IFJlYWQvU2Vlay9Xcml0ZSBkZWZpbml0aW9ucy4KKyAqLworI2lmbmRlZiBSZWFkT0sKKyNkZWZpbmUgUmVhZE9LKHRpZiwgYnVmLCBzaXplKSBcCisJKFRJRkZSZWFkRmlsZSgodGlmKSwoYnVmKSwoc2l6ZSkpPT0oc2l6ZSkpCisjZW5kaWYKKyNpZm5kZWYgU2Vla09LCisjZGVmaW5lIFNlZWtPSyh0aWYsIG9mZikgXAorCShUSUZGU2Vla0ZpbGUoKHRpZiksKG9mZiksU0VFS19TRVQpPT0ob2ZmKSkKKyNlbmRpZgorI2lmbmRlZiBXcml0ZU9LCisjZGVmaW5lIFdyaXRlT0sodGlmLCBidWYsIHNpemUpIFwKKwkoVElGRldyaXRlRmlsZSgodGlmKSwoYnVmKSwoc2l6ZSkpPT0oc2l6ZSkpCisjZW5kaWYKKworLyogTkI6IHRoZSB1aW50MzIgY2FzdHMgYXJlIHRvIHNpbGVuY2UgY2VydGFpbiBBTlNJLUMgY29tcGlsZXJzICovCisjZGVmaW5lIFRJRkZob3dtYW55XzMyKHgsIHkpICgoKHVpbnQzMil4IDwgKDB4ZmZmZmZmZmYgLSAodWludDMyKSh5LTEpKSkgPyBcCisJCQkgICAoKCgodWludDMyKSh4KSkrKCgodWludDMyKSh5KSktMSkpLygodWludDMyKSh5KSkpIDogXAorCQkJICAgMFUpCisjZGVmaW5lIFRJRkZob3dtYW55OF8zMih4KSAoKCh4KSYweDA3KT8oKHVpbnQzMikoeCk+PjMpKzE6KHVpbnQzMikoeCk+PjMpCisjZGVmaW5lIFRJRkZyb3VuZHVwXzMyKHgsIHkpIChUSUZGaG93bWFueV8zMih4LHkpKih5KSkKKyNkZWZpbmUgVElGRmhvd21hbnlfNjQoeCwgeSkgKCgoKHVpbnQ2NCkoeCkpKygoKHVpbnQ2NCkoeSkpLTEpKS8oKHVpbnQ2NCkoeSkpKQorI2RlZmluZSBUSUZGaG93bWFueThfNjQoeCkgKCgoeCkmMHgwNyk/KCh1aW50NjQpKHgpPj4zKSsxOih1aW50NjQpKHgpPj4zKQorI2RlZmluZSBUSUZGcm91bmR1cF82NCh4LCB5KSAoVElGRmhvd21hbnlfNjQoeCx5KSooeSkpCisKKy8qIFNhZmUgbXVsdGlwbHkgd2hpY2ggcmV0dXJucyB6ZXJvIGlmIHRoZXJlIGlzIGFuIGludGVnZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgVElGRlNhZmVNdWx0aXBseSh0LHYsbSkgKCgoKHQpKG0pICE9ICh0KTApICYmICgoKHQpKCgodikqKG0pKS8obSkpKSA9PSAodCkodikpKSA/ICh0KSgodikqKG0pKSA6ICh0KTApCisKKyNkZWZpbmUgVElGRm1heChBLEIpICgoQSk+KEIpPyhBKTooQikpCisjZGVmaW5lIFRJRkZtaW4oQSxCKSAoKEEpPChCKT8oQSk6KEIpKQorCisjZGVmaW5lIFRJRkZBcnJheUNvdW50KGEpIChzaXplb2YgKGEpIC8gc2l6ZW9mICgoYSlbMF0pKQorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gaW50IF9USUZGZ2V0TW9kZShjb25zdCBjaGFyKiBtb2RlLCBjb25zdCBjaGFyKiBtb2R1bGUpOworZXh0ZXJuIGludCBfVElGRk5vUm93RW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworZXh0ZXJuIGludCBfVElGRk5vU3RyaXBFbmNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitleHRlcm4gaW50IF9USUZGTm9UaWxlRW5jb2RlKFRJRkYqLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitleHRlcm4gaW50IF9USUZGTm9Sb3dEZWNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitleHRlcm4gaW50IF9USUZGTm9TdHJpcERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK2V4dGVybiBpbnQgX1RJRkZOb1RpbGVEZWNvZGUoVElGRiosIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK2V4dGVybiB2b2lkIF9USUZGTm9Qb3N0RGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworZXh0ZXJuIGludCBfVElGRk5vUHJlQ29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKTsKK2V4dGVybiBpbnQgX1RJRkZOb1NlZWsoVElGRiogdGlmLCB1aW50MzIgb2ZmKTsKK2V4dGVybiB2b2lkIF9USUZGU3dhYjE2Qml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKTsKK2V4dGVybiB2b2lkIF9USUZGU3dhYjI0Qml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKTsKK2V4dGVybiB2b2lkIF9USUZGU3dhYjMyQml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKTsKK2V4dGVybiB2b2lkIF9USUZGU3dhYjY0Qml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKTsKK2V4dGVybiBpbnQgVElGRkZsdXNoRGF0YTEoVElGRiogdGlmKTsKK2V4dGVybiBpbnQgVElGRkRlZmF1bHREaXJlY3RvcnkoVElGRiogdGlmKTsKK2V4dGVybiB2b2lkIF9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUoVElGRiogdGlmKTsKK2V4dGVybiBpbnQgX1RJRkZSZXdyaXRlRmllbGQoVElGRiAqLCB1aW50MTYsIFRJRkZEYXRhVHlwZSwgdG1zaXplX3QsIHZvaWQgKik7CitleHRlcm4gaW50IFRJRkZTZXRDb21wcmVzc2lvblNjaGVtZShUSUZGKiB0aWYsIGludCBzY2hlbWUpOworZXh0ZXJuIGludCBUSUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUoVElGRiogdGlmKTsKK2V4dGVybiB1aW50MzIgX1RJRkZEZWZhdWx0U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHMpOworZXh0ZXJuIHZvaWQgX1RJRkZEZWZhdWx0VGlsZVNpemUoVElGRiogdGlmLCB1aW50MzIqIHR3LCB1aW50MzIqIHRoKTsKK2V4dGVybiBpbnQgX1RJRkZEYXRhU2l6ZShUSUZGRGF0YVR5cGUgdHlwZSk7CisKK2V4dGVybiB2b2lkIF9USUZGc2V0Qnl0ZUFycmF5KHZvaWQqKiwgdm9pZCosIHVpbnQzMik7CitleHRlcm4gdm9pZCBfVElGRnNldFN0cmluZyhjaGFyKiosIGNoYXIqKTsKK2V4dGVybiB2b2lkIF9USUZGc2V0U2hvcnRBcnJheSh1aW50MTYqKiwgdWludDE2KiwgdWludDMyKTsKK2V4dGVybiB2b2lkIF9USUZGc2V0TG9uZ0FycmF5KHVpbnQzMioqLCB1aW50MzIqLCB1aW50MzIpOworZXh0ZXJuIHZvaWQgX1RJRkZzZXRGbG9hdEFycmF5KGZsb2F0KiosIGZsb2F0KiwgdWludDMyKTsKK2V4dGVybiB2b2lkIF9USUZGc2V0RG91YmxlQXJyYXkoZG91YmxlKiosIGRvdWJsZSosIHVpbnQzMik7CisKK2V4dGVybiB2b2lkIF9USUZGcHJpbnRBc2NpaShGSUxFKiwgY29uc3QgY2hhciopOworZXh0ZXJuIHZvaWQgX1RJRkZwcmludEFzY2lpVGFnKEZJTEUqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitleHRlcm4gVElGRkVycm9ySGFuZGxlciBfVElGRndhcm5pbmdIYW5kbGVyOworZXh0ZXJuIFRJRkZFcnJvckhhbmRsZXIgX1RJRkZlcnJvckhhbmRsZXI7CitleHRlcm4gVElGRkVycm9ySGFuZGxlckV4dCBfVElGRndhcm5pbmdIYW5kbGVyRXh0OworZXh0ZXJuIFRJRkZFcnJvckhhbmRsZXJFeHQgX1RJRkZlcnJvckhhbmRsZXJFeHQ7CisKK2V4dGVybiB1aW50MzIgX1RJRkZNdWx0aXBseTMyKFRJRkYqLCB1aW50MzIsIHVpbnQzMiwgY29uc3QgY2hhciopOworZXh0ZXJuIHVpbnQ2NCBfVElGRk11bHRpcGx5NjQoVElGRiosIHVpbnQ2NCwgdWludDY0LCBjb25zdCBjaGFyKik7CitleHRlcm4gdm9pZCogX1RJRkZDaGVja01hbGxvYyhUSUZGKiwgdG1zaXplX3QsIHRtc2l6ZV90LCBjb25zdCBjaGFyKik7CitleHRlcm4gdm9pZCogX1RJRkZDaGVja1JlYWxsb2MoVElGRiosIHZvaWQqLCB0bXNpemVfdCwgdG1zaXplX3QsIGNvbnN0IGNoYXIqKTsKKworZXh0ZXJuIGRvdWJsZSBfVElGRlVJbnQ2NFRvRG91YmxlKHVpbnQ2NCk7CitleHRlcm4gZmxvYXQgX1RJRkZVSW50NjRUb0Zsb2F0KHVpbnQ2NCk7CisKK2V4dGVybiBpbnQgVElGRkluaXREdW1wTW9kZShUSUZGKiwgaW50KTsKKyNpZmRlZiBQQUNLQklUU19TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0UGFja0JpdHMoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBDQ0lUVF9TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0Q0NJVFRSTEUoVElGRiosIGludCksIFRJRkZJbml0Q0NJVFRSTEVXKFRJRkYqLCBpbnQpOworZXh0ZXJuIGludCBUSUZGSW5pdENDSVRURmF4MyhUSUZGKiwgaW50KSwgVElGRkluaXRDQ0lUVEZheDQoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBUSFVOREVSX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRUaHVuZGVyU2NhbihUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIE5FWFRfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdE5lWFQoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBMWldfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdExaVyhUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIE9KUEVHX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRPSlBFRyhUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIEpQRUdfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdEpQRUcoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBKQklHX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRKQklHKFRJRkYqLCBpbnQpOworI2VuZGlmCisjaWZkZWYgWklQX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRaSVAoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBQSVhBUkxPR19TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0UGl4YXJMb2coVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBMT0dMVVZfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdFNHSUxvZyhUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIExaTUFfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdExaTUEoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBWTVMKK2V4dGVybiBjb25zdCBUSUZGQ29kZWMgX1RJRkZCdWlsdGluQ09ERUNTW107CisjZWxzZQorZXh0ZXJuIFRJRkZDb2RlYyBfVElGRkJ1aWx0aW5DT0RFQ1NbXTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9USUZGSU9QXyAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmZnZlcnMuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi90aWZmX3Y0MDMvdGlmZnZlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVkYzgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy90aWZmdmVycy5oCkBAIC0wLDAgKzEsOSBAQAorI2RlZmluZSBUSUZGTElCX1ZFUlNJT05fU1RSICJMSUJUSUZGLCBWZXJzaW9uIDQuMC4zXG5Db3B5cmlnaHQgKGMpIDE5ODgtMTk5NiBTYW0gTGVmZmxlclxuQ29weXJpZ2h0IChjKSAxOTkxLTE5OTYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiIKKy8qCisgKiBUaGlzIGRlZmluZSBjYW4gYmUgdXNlZCBpbiBjb2RlIHRoYXQgcmVxdWlyZXMKKyAqIGNvbXBpbGF0aW9uLXJlbGF0ZWQgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gYQorICogdmVyc2lvbiBvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gIFJ1bnRpbWUKKyAqIHZlcnNpb24gY2hlY2tpbmcgc2hvdWxkIGJlIGRvbmUgYmFzZWQgb24gdGhlCisgKiBzdHJpbmcgcmV0dXJuZWQgYnkgVElGRkdldFZlcnNpb24uCisgKi8KKyNkZWZpbmUgVElGRkxJQl9WRVJTSU9OIDIwMTIwOTIyCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvdGlmZl92NDAzL3V2Y29kZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy91dmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYxMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3RpZmZfdjQwMy91dmNvZGUuaApAQCAtMCwwICsxLDE4MCBAQAorLyogVmVyc2lvbiAxLjAgZ2VuZXJhdGVkIEFwcmlsIDcsIDE5OTcgYnkgR3JlZyBXYXJkIExhcnNvbiwgU0dJICovCisjZGVmaW5lIFVWX1NRU0laCShmbG9hdCkwLjAwMzUwMAorI2RlZmluZSBVVl9ORElWUwkxNjI4OQorI2RlZmluZSBVVl9WU1RBUlQJKGZsb2F0KTAuMDE2OTQwCisjZGVmaW5lIFVWX05WUwkJMTYzCitzdGF0aWMgc3RydWN0IHsKKwlmbG9hdAl1c3RhcnQ7CisJc2hvcnQJbnVzLCBuY3VtOworfQl1dl9yb3dbVVZfTlZTXSA9IHsKKwl7IChmbG9hdCkwLjI0NzY2MywJNCwJMCB9LAorCXsgKGZsb2F0KTAuMjQzNzc5LAk2LAk0IH0sCisJeyAoZmxvYXQpMC4yNDE2ODQsCTcsCTEwIH0sCisJeyAoZmxvYXQpMC4yMzc4NzQsCTksCTE3IH0sCisJeyAoZmxvYXQpMC4yMzU5MDYsCTEwLAkyNiB9LAorCXsgKGZsb2F0KTAuMjMyMTUzLAkxMiwJMzYgfSwKKwl7IChmbG9hdCkwLjIyODM1MiwJMTQsCTQ4IH0sCisJeyAoZmxvYXQpMC4yMjYyNTksCTE1LAk2MiB9LAorCXsgKGZsb2F0KTAuMjIyMzcxLAkxNywJNzcgfSwKKwl7IChmbG9hdCkwLjIyMDQxMCwJMTgsCTk0IH0sCisJeyAoZmxvYXQpMC4yMTQ3MTAsCTIxLAkxMTIgfSwKKwl7IChmbG9hdCkwLjIxMjcxNCwJMjIsCTEzMyB9LAorCXsgKGZsb2F0KTAuMjEwNzIxLAkyMywJMTU1IH0sCisJeyAoZmxvYXQpMC4yMDQ5NzYsCTI2LAkxNzggfSwKKwl7IChmbG9hdCkwLjIwMjk4NiwJMjcsCTIwNCB9LAorCXsgKGZsb2F0KTAuMTk5MjQ1LAkyOSwJMjMxIH0sCisJeyAoZmxvYXQpMC4xOTU1MjUsCTMxLAkyNjAgfSwKKwl7IChmbG9hdCkwLjE5MzU2MCwJMzIsCTI5MSB9LAorCXsgKGZsb2F0KTAuMTg5ODc4LAkzNCwJMzIzIH0sCisJeyAoZmxvYXQpMC4xODYyMTYsCTM2LAkzNTcgfSwKKwl7IChmbG9hdCkwLjE4NjIxNiwJMzYsCTM5MyB9LAorCXsgKGZsb2F0KTAuMTgyNTkyLAkzOCwJNDI5IH0sCisJeyAoZmxvYXQpMC4xNzkwMDMsCTQwLAk0NjcgfSwKKwl7IChmbG9hdCkwLjE3NTQ2NiwJNDIsCTUwNyB9LAorCXsgKGZsb2F0KTAuMTcyMDAxLAk0NCwJNTQ5IH0sCisJeyAoZmxvYXQpMC4xNzIwMDEsCTQ0LAk1OTMgfSwKKwl7IChmbG9hdCkwLjE2ODYxMiwJNDYsCTYzNyB9LAorCXsgKGZsb2F0KTAuMTY4NjEyLAk0NiwJNjgzIH0sCisJeyAoZmxvYXQpMC4xNjM1NzUsCTQ5LAk3MjkgfSwKKwl7IChmbG9hdCkwLjE1ODY0MiwJNTIsCTc3OCB9LAorCXsgKGZsb2F0KTAuMTU4NjQyLAk1MiwJODMwIH0sCisJeyAoZmxvYXQpMC4xNTg2NDIsCTUyLAk4ODIgfSwKKwl7IChmbG9hdCkwLjE1MzgxNSwJNTUsCTkzNCB9LAorCXsgKGZsb2F0KTAuMTUzODE1LAk1NSwJOTg5IH0sCisJeyAoZmxvYXQpMC4xNDkwOTcsCTU4LAkxMDQ0IH0sCisJeyAoZmxvYXQpMC4xNDkwOTcsCTU4LAkxMTAyIH0sCisJeyAoZmxvYXQpMC4xNDI3NDYsCTYyLAkxMTYwIH0sCisJeyAoZmxvYXQpMC4xNDI3NDYsCTYyLAkxMjIyIH0sCisJeyAoZmxvYXQpMC4xNDI3NDYsCTYyLAkxMjg0IH0sCisJeyAoZmxvYXQpMC4xMzgyNzAsCTY1LAkxMzQ2IH0sCisJeyAoZmxvYXQpMC4xMzgyNzAsCTY1LAkxNDExIH0sCisJeyAoZmxvYXQpMC4xMzgyNzAsCTY1LAkxNDc2IH0sCisJeyAoZmxvYXQpMC4xMzIxNjYsCTY5LAkxNTQxIH0sCisJeyAoZmxvYXQpMC4xMzIxNjYsCTY5LAkxNjEwIH0sCisJeyAoZmxvYXQpMC4xMjYyMDQsCTczLAkxNjc5IH0sCisJeyAoZmxvYXQpMC4xMjYyMDQsCTczLAkxNzUyIH0sCisJeyAoZmxvYXQpMC4xMjYyMDQsCTczLAkxODI1IH0sCisJeyAoZmxvYXQpMC4xMjAzODEsCTc3LAkxODk4IH0sCisJeyAoZmxvYXQpMC4xMjAzODEsCTc3LAkxOTc1IH0sCisJeyAoZmxvYXQpMC4xMjAzODEsCTc3LAkyMDUyIH0sCisJeyAoZmxvYXQpMC4xMjAzODEsCTc3LAkyMTI5IH0sCisJeyAoZmxvYXQpMC4xMTI5NjIsCTgyLAkyMjA2IH0sCisJeyAoZmxvYXQpMC4xMTI5NjIsCTgyLAkyMjg4IH0sCisJeyAoZmxvYXQpMC4xMTI5NjIsCTgyLAkyMzcwIH0sCisJeyAoZmxvYXQpMC4xMDc0NTAsCTg2LAkyNDUyIH0sCisJeyAoZmxvYXQpMC4xMDc0NTAsCTg2LAkyNTM4IH0sCisJeyAoZmxvYXQpMC4xMDc0NTAsCTg2LAkyNjI0IH0sCisJeyAoZmxvYXQpMC4xMDc0NTAsCTg2LAkyNzEwIH0sCisJeyAoZmxvYXQpMC4xMDAzNDMsCTkxLAkyNzk2IH0sCisJeyAoZmxvYXQpMC4xMDAzNDMsCTkxLAkyODg3IH0sCisJeyAoZmxvYXQpMC4xMDAzNDMsCTkxLAkyOTc4IH0sCisJeyAoZmxvYXQpMC4wOTUxMjYsCTk1LAkzMDY5IH0sCisJeyAoZmxvYXQpMC4wOTUxMjYsCTk1LAkzMTY0IH0sCisJeyAoZmxvYXQpMC4wOTUxMjYsCTk1LAkzMjU5IH0sCisJeyAoZmxvYXQpMC4wOTUxMjYsCTk1LAkzMzU0IH0sCisJeyAoZmxvYXQpMC4wODgyNzYsCTEwMCwJMzQ0OSB9LAorCXsgKGZsb2F0KTAuMDg4Mjc2LAkxMDAsCTM1NDkgfSwKKwl7IChmbG9hdCkwLjA4ODI3NiwJMTAwLAkzNjQ5IH0sCisJeyAoZmxvYXQpMC4wODgyNzYsCTEwMCwJMzc0OSB9LAorCXsgKGZsb2F0KTAuMDgxNTIzLAkxMDUsCTM4NDkgfSwKKwl7IChmbG9hdCkwLjA4MTUyMywJMTA1LAkzOTU0IH0sCisJeyAoZmxvYXQpMC4wODE1MjMsCTEwNSwJNDA1OSB9LAorCXsgKGZsb2F0KTAuMDgxNTIzLAkxMDUsCTQxNjQgfSwKKwl7IChmbG9hdCkwLjA3NDg2MSwJMTEwLAk0MjY5IH0sCisJeyAoZmxvYXQpMC4wNzQ4NjEsCTExMCwJNDM3OSB9LAorCXsgKGZsb2F0KTAuMDc0ODYxLAkxMTAsCTQ0ODkgfSwKKwl7IChmbG9hdCkwLjA3NDg2MSwJMTEwLAk0NTk5IH0sCisJeyAoZmxvYXQpMC4wNjgyOTAsCTExNSwJNDcwOSB9LAorCXsgKGZsb2F0KTAuMDY4MjkwLAkxMTUsCTQ4MjQgfSwKKwl7IChmbG9hdCkwLjA2ODI5MCwJMTE1LAk0OTM5IH0sCisJeyAoZmxvYXQpMC4wNjgyOTAsCTExNSwJNTA1NCB9LAorCXsgKGZsb2F0KTAuMDYzNTczLAkxMTksCTUxNjkgfSwKKwl7IChmbG9hdCkwLjA2MzU3MywJMTE5LAk1Mjg4IH0sCisJeyAoZmxvYXQpMC4wNjM1NzMsCTExOSwJNTQwNyB9LAorCXsgKGZsb2F0KTAuMDYzNTczLAkxMTksCTU1MjYgfSwKKwl7IChmbG9hdCkwLjA1NzIxOSwJMTI0LAk1NjQ1IH0sCisJeyAoZmxvYXQpMC4wNTcyMTksCTEyNCwJNTc2OSB9LAorCXsgKGZsb2F0KTAuMDU3MjE5LAkxMjQsCTU4OTMgfSwKKwl7IChmbG9hdCkwLjA1NzIxOSwJMTI0LAk2MDE3IH0sCisJeyAoZmxvYXQpMC4wNTA5ODUsCTEyOSwJNjE0MSB9LAorCXsgKGZsb2F0KTAuMDUwOTg1LAkxMjksCTYyNzAgfSwKKwl7IChmbG9hdCkwLjA1MDk4NSwJMTI5LAk2Mzk5IH0sCisJeyAoZmxvYXQpMC4wNTA5ODUsCTEyOSwJNjUyOCB9LAorCXsgKGZsb2F0KTAuMDUwOTg1LAkxMjksCTY2NTcgfSwKKwl7IChmbG9hdCkwLjA0NDg1OSwJMTM0LAk2Nzg2IH0sCisJeyAoZmxvYXQpMC4wNDQ4NTksCTEzNCwJNjkyMCB9LAorCXsgKGZsb2F0KTAuMDQ0ODU5LAkxMzQsCTcwNTQgfSwKKwl7IChmbG9hdCkwLjA0NDg1OSwJMTM0LAk3MTg4IH0sCisJeyAoZmxvYXQpMC4wNDA1NzEsCTEzOCwJNzMyMiB9LAorCXsgKGZsb2F0KTAuMDQwNTcxLAkxMzgsCTc0NjAgfSwKKwl7IChmbG9hdCkwLjA0MDU3MSwJMTM4LAk3NTk4IH0sCisJeyAoZmxvYXQpMC4wNDA1NzEsCTEzOCwJNzczNiB9LAorCXsgKGZsb2F0KTAuMDM2MzM5LAkxNDIsCTc4NzQgfSwKKwl7IChmbG9hdCkwLjAzNjMzOSwJMTQyLAk4MDE2IH0sCisJeyAoZmxvYXQpMC4wMzYzMzksCTE0MiwJODE1OCB9LAorCXsgKGZsb2F0KTAuMDM2MzM5LAkxNDIsCTgzMDAgfSwKKwl7IChmbG9hdCkwLjAzMjEzOSwJMTQ2LAk4NDQyIH0sCisJeyAoZmxvYXQpMC4wMzIxMzksCTE0NiwJODU4OCB9LAorCXsgKGZsb2F0KTAuMDMyMTM5LAkxNDYsCTg3MzQgfSwKKwl7IChmbG9hdCkwLjAzMjEzOSwJMTQ2LAk4ODgwIH0sCisJeyAoZmxvYXQpMC4wMjc5NDcsCTE1MCwJOTAyNiB9LAorCXsgKGZsb2F0KTAuMDI3OTQ3LAkxNTAsCTkxNzYgfSwKKwl7IChmbG9hdCkwLjAyNzk0NywJMTUwLAk5MzI2IH0sCisJeyAoZmxvYXQpMC4wMjM3MzksCTE1NCwJOTQ3NiB9LAorCXsgKGZsb2F0KTAuMDIzNzM5LAkxNTQsCTk2MzAgfSwKKwl7IChmbG9hdCkwLjAyMzczOSwJMTU0LAk5Nzg0IH0sCisJeyAoZmxvYXQpMC4wMjM3MzksCTE1NCwJOTkzOCB9LAorCXsgKGZsb2F0KTAuMDE5NTA0LAkxNTgsCTEwMDkyIH0sCisJeyAoZmxvYXQpMC4wMTk1MDQsCTE1OCwJMTAyNTAgfSwKKwl7IChmbG9hdCkwLjAxOTUwNCwJMTU4LAkxMDQwOCB9LAorCXsgKGZsb2F0KTAuMDE2OTc2LAkxNjEsCTEwNTY2IH0sCisJeyAoZmxvYXQpMC4wMTY5NzYsCTE2MSwJMTA3MjcgfSwKKwl7IChmbG9hdCkwLjAxNjk3NiwJMTYxLAkxMDg4OCB9LAorCXsgKGZsb2F0KTAuMDE2OTc2LAkxNjEsCTExMDQ5IH0sCisJeyAoZmxvYXQpMC4wMTI2MzksCTE2NSwJMTEyMTAgfSwKKwl7IChmbG9hdCkwLjAxMjYzOSwJMTY1LAkxMTM3NSB9LAorCXsgKGZsb2F0KTAuMDEyNjM5LAkxNjUsCTExNTQwIH0sCisJeyAoZmxvYXQpMC4wMDk5OTEsCTE2OCwJMTE3MDUgfSwKKwl7IChmbG9hdCkwLjAwOTk5MSwJMTY4LAkxMTg3MyB9LAorCXsgKGZsb2F0KTAuMDA5OTkxLAkxNjgsCTEyMDQxIH0sCisJeyAoZmxvYXQpMC4wMDkwMTYsCTE3MCwJMTIyMDkgfSwKKwl7IChmbG9hdCkwLjAwOTAxNiwJMTcwLAkxMjM3OSB9LAorCXsgKGZsb2F0KTAuMDA5MDE2LAkxNzAsCTEyNTQ5IH0sCisJeyAoZmxvYXQpMC4wMDYyMTcsCTE3MywJMTI3MTkgfSwKKwl7IChmbG9hdCkwLjAwNjIxNywJMTczLAkxMjg5MiB9LAorCXsgKGZsb2F0KTAuMDA1MDk3LAkxNzUsCTEzMDY1IH0sCisJeyAoZmxvYXQpMC4wMDUwOTcsCTE3NSwJMTMyNDAgfSwKKwl7IChmbG9hdCkwLjAwNTA5NywJMTc1LAkxMzQxNSB9LAorCXsgKGZsb2F0KTAuMDAzOTA5LAkxNzcsCTEzNTkwIH0sCisJeyAoZmxvYXQpMC4wMDM5MDksCTE3NywJMTM3NjcgfSwKKwl7IChmbG9hdCkwLjAwMjM0MCwJMTc3LAkxMzk0NCB9LAorCXsgKGZsb2F0KTAuMDAyMzg5LAkxNzAsCTE0MTIxIH0sCisJeyAoZmxvYXQpMC4wMDEwNjgsCTE2NCwJMTQyOTEgfSwKKwl7IChmbG9hdCkwLjAwMTY1MywJMTU3LAkxNDQ1NSB9LAorCXsgKGZsb2F0KTAuMDAwNzE3LAkxNTAsCTE0NjEyIH0sCisJeyAoZmxvYXQpMC4wMDE2MTQsCTE0MywJMTQ3NjIgfSwKKwl7IChmbG9hdCkwLjAwMDI3MCwJMTM2LAkxNDkwNSB9LAorCXsgKGZsb2F0KTAuMDAwNDg0LAkxMjksCTE1MDQxIH0sCisJeyAoZmxvYXQpMC4wMDExMDMsCTEyMywJMTUxNzAgfSwKKwl7IChmbG9hdCkwLjAwMTI0MiwJMTE1LAkxNTI5MyB9LAorCXsgKGZsb2F0KTAuMDAxMTg4LAkxMDksCTE1NDA4IH0sCisJeyAoZmxvYXQpMC4wMDEwMTEsCTEwMywJMTU1MTcgfSwKKwl7IChmbG9hdCkwLjAwMDcwOSwJOTcsCTE1NjIwIH0sCisJeyAoZmxvYXQpMC4wMDAzMDEsCTg5LAkxNTcxNyB9LAorCXsgKGZsb2F0KTAuMDAyNDE2LAk4MiwJMTU4MDYgfSwKKwl7IChmbG9hdCkwLjAwMzI1MSwJNzYsCTE1ODg4IH0sCisJeyAoZmxvYXQpMC4wMDMyNDYsCTY5LAkxNTk2NCB9LAorCXsgKGZsb2F0KTAuMDA0MTQxLAk2MiwJMTYwMzMgfSwKKwl7IChmbG9hdCkwLjAwNTk2MywJNTUsCTE2MDk1IH0sCisJeyAoZmxvYXQpMC4wMDg4MzksCTQ3LAkxNjE1MCB9LAorCXsgKGZsb2F0KTAuMDEwNDkwLAk0MCwJMTYxOTcgfSwKKwl7IChmbG9hdCkwLjAxNjk5NCwJMzEsCTE2MjM3IH0sCisJeyAoZmxvYXQpMC4wMjM2NTksCTIxLAkxNjI2OCB9LAorfTsKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2ZWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuY3BwCkBAIC0wLDAgKzEsOTE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJmeF9ibXAuaCINCitGWF9EV09SRCBfR2V0RFdvcmRfTFNCRmlyc3QoRlhfTFBCWVRFIHApDQorew0KKyAgICByZXR1cm4gcFswXSB8IChwWzFdIDw8IDgpIHwgKHBbMl0gPDwgMTYpIHwgKHBbM10gPDwgMjQpOw0KK30NCitGWF9XT1JEIF9HZXRXb3JkX0xTQkZpcnN0KEZYX0xQQllURSBwKQ0KK3sNCisgICAgcmV0dXJuIHBbMF0gfCAocFsxXSA8PCA4KTsNCit9DQordm9pZCBfU2V0RFdvcmRfTFNCRmlyc3QoRlhfTFBCWVRFIHAsIEZYX0RXT1JEIHYpDQorew0KKyAgICBwWzBdID0gKEZYX0JZVEUpdjsNCisgICAgcFsxXSA9IChGWF9CWVRFKSh2ID4+IDgpOw0KKyAgICBwWzJdID0gKEZYX0JZVEUpKHYgPj4gMTYpOw0KKyAgICBwWzNdID0gKEZYX0JZVEUpKHYgPj4gMjQpOw0KK30NCit2b2lkIF9TZXRXb3JkX0xTQkZpcnN0KEZYX0xQQllURSBwLCBGWF9XT1JEIHYpDQorew0KKyAgICBwWzBdID0gKEZYX0JZVEUpdjsNCisgICAgcFsxXSA9IChGWF9CWVRFKSh2ID4+IDgpOw0KK30NCit2b2lkIF9ibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfTFBDU1RSIGVycl9tc2cpDQorew0KKyAgICBpZihibXBfcHRyICE9IE5VTEwgJiYgYm1wX3B0ci0+X2JtcF9lcnJvcl9mbiAhPSBOVUxMKSB7DQorICAgICAgICBibXBfcHRyLT5fYm1wX2Vycm9yX2ZuKGJtcF9wdHIsIGVycl9tc2cpOw0KKyAgICB9DQorfQ0KK2JtcF9kZWNvbXByZXNzX3N0cnVjdF9wIF9ibXBfY3JlYXRlX2RlY29tcHJlc3MoKQ0KK3sNCisgICAgYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciA9IEZYX0FsbG9jKGJtcF9kZWNvbXByZXNzX3N0cnVjdCwgMSk7DQorICAgIGlmKGJtcF9wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIoYm1wX3B0ciwgMCwgc2l6ZW9mKGJtcF9kZWNvbXByZXNzX3N0cnVjdCkpOw0KKyAgICBibXBfcHRyLT5kZWNvZGVfc3RhdHVzID0gQk1QX0RfU1RBVFVTX0hFQURFUjsNCisgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHIgPSBGWF9BbGxvYyhCbXBGaWxlSGVhZGVyLCAxKTsNCisgICAgcmV0dXJuIGJtcF9wdHI7DQorfQ0KK3ZvaWQgX2JtcF9kZXN0cm95X2RlY29tcHJlc3MoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3BwIGJtcF9wdHJfcHRyKQ0KK3sNCisgICAgaWYoYm1wX3B0cl9wdHIgPT0gTlVMTCB8fCAqYm1wX3B0cl9wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIgPSAqYm1wX3B0cl9wdHI7DQorICAgICpibXBfcHRyX3B0ciA9IE5VTEw7DQorICAgIGlmKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICB9DQorICAgIGlmKGJtcF9wdHItPnBhbF9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShibXBfcHRyLT5wYWxfcHRyKTsNCisgICAgfQ0KKyAgICBpZihibXBfcHRyLT5ibXBfaGVhZGVyX3B0ciAhPSBOVUxMKQl7DQorICAgICAgICBGWF9GcmVlKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyKTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKGJtcF9wdHIpOw0KK30NCitGWF9JTlQzMiBfYm1wX3JlYWRfaGVhZGVyKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpDQorew0KKyAgICBpZihibXBfcHRyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQorICAgIGlmKGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX0hFQURFUikgew0KKyAgICAgICAgQVNTRVJUKHNpemVvZihCbXBGaWxlSGVhZGVyKSA9PSAxNCk7DQorICAgICAgICBCbXBGaWxlSGVhZGVyKiBibXBfaGVhZGVyX3B0ciA9IE5VTEw7DQorICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAoRlhfTFBCWVRFKikmYm1wX2hlYWRlcl9wdHIsIDE0KSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZUeXBlID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2hlYWRlcl9wdHItPmJmVHlwZSk7DQorICAgICAgICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzID0gX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMpOw0KKyAgICAgICAgYm1wX3B0ci0+ZGF0YV9zaXplID0gX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmJtcF9oZWFkZXJfcHRyLT5iZlNpemUpOw0KKyAgICAgICAgaWYoYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmVHlwZSAhPSBCTVBfU0lHTkFUVVJFKSB7DQorICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiTm90IEEgQm1wIEltYWdlIik7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgICBpZihibXBfcHRyLT5hdmFpbF9pbiA8IHNpemVvZihGWF9EV09SRCkpIHsNCisgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYm1wX3B0ci0+aW1nX2lmaF9zaXplID0gX0dldERXb3JkX0xTQkZpcnN0KGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemUpOw0KKyAgICAgICAgYm1wX3B0ci0+cGFsX3R5cGUgPSAwOw0KKyAgICAgICAgQVNTRVJUKHNpemVvZihCbXBDb3JlSGVhZGVyKSA9PSAxMik7DQorICAgICAgICBBU1NFUlQoc2l6ZW9mKEJtcEluZm9IZWFkZXIpID09IDQwKTsNCisgICAgICAgIHN3aXRjaChibXBfcHRyLT5pbWdfaWZoX3NpemUpIHsNCisgICAgICAgICAgICBjYXNlIEZYX01JTigxMiwgc2l6ZW9mKEJtcENvcmVIZWFkZXIpKTogew0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+cGFsX3R5cGUgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgQm1wQ29yZUhlYWRlclB0ciBibXBfY29yZV9oZWFkZXJfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsIChGWF9MUEJZVEUqKSZibXBfY29yZV9oZWFkZXJfcHRyLCBibXBfcHRyLT5pbWdfaWZoX3NpemUpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+d2lkdGggPSAoRlhfRFdPUkQpX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNXaWR0aCk7DQorICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAoRlhfRFdPUkQpX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNIZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Yml0Q291bnRzID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNCaXRDb3VudCk7DQorICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0gQk1QX1JHQjsNCisgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZYX01JTig0MCwgc2l6ZW9mKEJtcEluZm9IZWFkZXIpKTogew0KKyAgICAgICAgICAgICAgICAgICAgQm1wSW5mb0hlYWRlclB0ciBibXBfaW5mb19oZWFkZXJfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsIChGWF9MUEJZVEUqKSZibXBfaW5mb19oZWFkZXJfcHRyLCBibXBfcHRyLT5pbWdfaWZoX3NpemUpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+d2lkdGggPSBfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7DQorICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlIZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Yml0Q291bnRzID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlCaXRDb3VudCk7DQorICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0gX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOw0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sb3JfdXNlZCA9IF9HZXREV29yZF9MU0JGaXJzdCgoRlhfTFBCWVRFKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUNsclVzZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+ZHBpX3ggPSAoRlhfSU5UMzIpX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWFBlbHNQZXJNZXRlcik7DQorICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5kcGlfeSA9IChGWF9JTlQzMilfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPmhlaWdodCA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAtYm1wX3B0ci0+aGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPmltZ19pZmhfc2l6ZSA+IEZYX01JTig0MCwgc2l6ZW9mKEJtcEluZm9IZWFkZXIpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEJtcEluZm9IZWFkZXJQdHIgYm1wX2luZm9faGVhZGVyX3B0ciA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKEZYX0xQQllURSopJmJtcF9pbmZvX2hlYWRlcl9wdHIsIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBiaVBsYW5lczsNCisgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT53aWR0aCA9IF9HZXREV29yZF9MU0JGaXJzdCgoRlhfTFBCWVRFKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaVdpZHRoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlIZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmJpdENvdW50cyA9IF9HZXRXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQml0Q291bnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlDb21wcmVzc2lvbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sb3JfdXNlZCA9IF9HZXREV29yZF9MU0JGaXJzdCgoRlhfTFBCWVRFKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUNsclVzZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJpUGxhbmVzID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlQbGFuZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmRwaV94ID0gX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWFBlbHNQZXJNZXRlcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+ZHBpX3kgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5oZWlnaHQgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9IC1ibXBfcHRyLT5oZWlnaHQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5jb21wcmVzc19mbGFnID09IEJNUF9SR0IgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpUGxhbmVzID09IDEgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJVbnN1cHBvcnRlZCBCbXAgRmlsZSIpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEFTU0VSVChibXBfcHRyLT53aWR0aCA+IDApOw0KKyAgICAgICAgQVNTRVJUKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPD0gQk1QX0JJVEZJRUxEUyk7DQorICAgICAgICBzd2l0Y2goYm1wX3B0ci0+Yml0Q291bnRzKSB7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgY2FzZSAxNjoNCisgICAgICAgICAgICBjYXNlIDI0OiB7DQorICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5jb2xvcl91c2VkID4gKChGWF9EV09SRCkxKSA8PCBibXBfcHRyLT5iaXRDb3VudHMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAzMjogew0KKyAgICAgICAgICAgICAgICAgICAgaWYoYm1wX3B0ci0+d2lkdGggPD0gMCB8fCBibXBfcHRyLT5jb21wcmVzc19mbGFnID4gQk1QX0JJVEZJRUxEUykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgICBibXBfcHRyLT5zcmNfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIGJtcF9wdHItPmJpdENvdW50cyk7DQorICAgICAgICBzd2l0Y2goYm1wX3B0ci0+Yml0Q291bnRzKSB7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBCTVBfV0lEVEhCWVRFUyhibXBfcHRyLT53aWR0aCwgOCk7DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSAxOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDE2Og0KKyAgICAgICAgICAgIGNhc2UgMjQ6DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBCTVBfV0lEVEhCWVRFUyhibXBfcHRyLT53aWR0aCwgMjQpOw0KKyAgICAgICAgICAgICAgICBibXBfcHRyLT5jb21wb25lbnRzID0gMzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAzMjoNCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyA9IGJtcF9wdHItPnNyY19yb3dfYnl0ZXM7DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSA0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IEZYX0FsbG9jKEZYX0JZVEUsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICAgICAgQk1QX1BUUl9OT1RfTlVMTChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgYm1wX3B0cik7DQorICAgICAgICBGWFNZU19tZW1zZXQzMihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19QQUwpOw0KKyAgICB9DQorICAgIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19QQUwpIHsNCisgICAgICAgIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorICAgICAgICBpZihibXBfcHRyLT5jb21wcmVzc19mbGFnID09IEJNUF9CSVRGSUVMRFMpIHsNCisgICAgICAgICAgICBpZihibXBfcHRyLT5iaXRDb3VudHMgIT0gMTYgJiYgYm1wX3B0ci0+Yml0Q291bnRzICE9IDMyKSB7DQorICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9EV09SRCogbWFzazsNCisgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAoRlhfTFBCWVRFKikmbWFzaywgMyAqIHNpemVvZihGWF9EV09SRCkpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJtcF9wdHItPm1hc2tfcmVkCT0gX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJm1hc2tbMF0pOw0KKyAgICAgICAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4JPSBfR2V0RFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmbWFza1sxXSk7DQorICAgICAgICAgICAgYm1wX3B0ci0+bWFza19ibHVlCT0gX0dldERXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJm1hc2tbMl0pOw0KKyAgICAgICAgICAgIGlmKGJtcF9wdHItPm1hc2tfcmVkICYgYm1wX3B0ci0+bWFza19ncmVlbiB8fA0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+bWFza19yZWQgJiBibXBfcHRyLT5tYXNrX2JsdWUgfHwNCisgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4gJiBibXBfcHRyLT5tYXNrX2JsdWUpIHsNCisgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJpdGZpZWxkIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMgPCAyNiArIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgew0KKyAgICAgICAgICAgICAgICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzID0gMjYgKyBibXBfcHRyLT5pbWdfaWZoX3NpemU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEFfUFJFKTsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIH0gZWxzZSBpZihibXBfcHRyLT5iaXRDb3VudHMgPT0gMTYpIHsNCisgICAgICAgICAgICBibXBfcHRyLT5tYXNrX3JlZAk9IDB4N0MwMDsNCisgICAgICAgICAgICBibXBfcHRyLT5tYXNrX2dyZWVuID0gMHgwM0UwOw0KKyAgICAgICAgICAgIGJtcF9wdHItPm1hc2tfYmx1ZQk9IDB4MDAxRjsNCisgICAgICAgIH0NCisjZWxzZQ0KKyAgICAgICAgaWYoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9PSBCTVBfQklURklFTERTIHx8IGJtcF9wdHItPmJpdENvdW50cyA9PSAxNikgew0KKyAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlVuc3VwcG9ydGVkIEJpdGZpZWxkIEJtcCBGaWxlIik7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICBibXBfcHRyLT5wYWxfbnVtID0gMDsNCisgICAgICAgIGlmKGJtcF9wdHItPmJpdENvdW50cyA8IDE2KSB7DQorICAgICAgICAgICAgYm1wX3B0ci0+cGFsX251bSA9IDEgPDwgYm1wX3B0ci0+Yml0Q291bnRzOw0KKyAgICAgICAgICAgIGlmKGJtcF9wdHItPmNvbG9yX3VzZWQgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBibXBfcHRyLT5wYWxfbnVtID0gYm1wX3B0ci0+Y29sb3JfdXNlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfTFBCWVRFIHNyY19wYWxfcHRyID0gTlVMTDsNCisgICAgICAgICAgICBGWF9EV09SRCBzcmNfcGFsX3NpemUgPSBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpOw0KKyAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsIChGWF9MUEJZVEUqKSZzcmNfcGFsX3B0ciwgc3JjX3BhbF9zaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihibXBfcHRyLT5wYWxfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgRlhfRnJlZShibXBfcHRyLT5wYWxfcHRyKTsNCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+cGFsX3B0ciA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJtcF9wdHItPnBhbF9wdHIgPSBGWF9BbGxvYyhGWF9EV09SRCwgYm1wX3B0ci0+cGFsX251bSk7DQorICAgICAgICAgICAgQk1QX1BUUl9OT1RfTlVMTChibXBfcHRyLT5wYWxfcHRyLCBibXBfcHRyKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBzcmNfcGFsX2luZGV4ID0gMDsNCisgICAgICAgICAgICBpZihibXBfcHRyLT5wYWxfdHlwZSA9PSBCTVBfUEFMX09MRCkgew0KKyAgICAgICAgICAgICAgICB3aGlsZShzcmNfcGFsX2luZGV4IDwgYm1wX3B0ci0+cGFsX251bSkgew0KKyAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+cGFsX3B0cltzcmNfcGFsX2luZGV4KytdID0gQk1QX1BBTF9FTkNPREUoMHgwMCwgc3JjX3BhbF9wdHJbMl0sIHNyY19wYWxfcHRyWzFdLCBzcmNfcGFsX3B0clswXSk7DQorICAgICAgICAgICAgICAgICAgICBzcmNfcGFsX3B0ciArPSAzOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgd2hpbGUoc3JjX3BhbF9pbmRleCA8IGJtcF9wdHItPnBhbF9udW0pIHsNCisgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPnBhbF9wdHJbc3JjX3BhbF9pbmRleCsrXSA9IEJNUF9QQUxfRU5DT0RFKHNyY19wYWxfcHRyWzNdLCBzcmNfcGFsX3B0clsyXSwgc3JjX3BhbF9wdHJbMV0sIHNyY19wYWxfcHRyWzBdKTsNCisgICAgICAgICAgICAgICAgICAgIHNyY19wYWxfcHRyICs9IDQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZihibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzIDwgMTQgKyBibXBfcHRyLT5pbWdfaWZoX3NpemUgKyBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpKSB7DQorICAgICAgICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9IDE0ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplICsgYm1wX3B0ci0+cGFsX251bSAqIChibXBfcHRyLT5wYWxfdHlwZSA/IDMgOiA0KTsNCisgICAgICAgIH0NCisgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEFfUFJFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQorRlhfSU5UMzIgX2JtcF9kZWNvZGVfaW1hZ2UoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikNCit7DQorICAgIGlmKGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX0RBVEFfUFJFKSB7DQorICAgICAgICBibXBfcHRyLT5hdmFpbF9pbiA9IDA7DQorICAgICAgICBpZighYm1wX3B0ci0+X2JtcF9nZXRfZGF0YV9wb3NpdGlvbl9mbihibXBfcHRyLCBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzKSkgew0KKyAgICAgICAgICAgIGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPSBCTVBfRF9TVEFUVVNfVEFJTDsNCisgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCwgVW5leHBlY3RlZCBTdHJlYW0gT2Zmc2V0Iik7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgICBibXBfcHRyLT5yb3dfbnVtID0gMDsNCisgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEEpOw0KKyAgICB9DQorICAgIGlmKGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX0RBVEEpIHsNCisgICAgICAgIHN3aXRjaChibXBfcHRyLT5jb21wcmVzc19mbGFnKSB7DQorICAgICAgICAgICAgY2FzZSBCTVBfUkdCOg0KKyAgICAgICAgICAgIGNhc2UgQk1QX0JJVEZJRUxEUzoNCisgICAgICAgICAgICAgICAgcmV0dXJuIF9ibXBfZGVjb2RlX3JnYihibXBfcHRyKTsNCisgICAgICAgICAgICBjYXNlIEJNUF9STEU4Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2JtcF9kZWNvZGVfcmxlOChibXBfcHRyKTsNCisgICAgICAgICAgICBjYXNlIEJNUF9STEU0Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2JtcF9kZWNvZGVfcmxlNChibXBfcHRyKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJBbnkgVW5jb250cm9sIEVycm9yIik7DQorICAgIHJldHVybiAwOw0KK30NCitGWF9JTlQzMiBfYm1wX2RlY29kZV9yZ2IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikNCit7DQorICAgIEZYX0xQQllURSByb3dfYnVmID0gYm1wX3B0ci0+b3V0X3Jvd19idWZmZXI7DQorICAgIEZYX0xQQllURSBkZXNfYnVmID0gTlVMTDsNCisgICAgd2hpbGUgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZXNfYnVmLCBibXBfcHRyLT5zcmNfcm93X2J5dGVzKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsNCisgICAgICAgIHN3aXRjaChibXBfcHRyLT5iaXRDb3VudHMpIHsNCisgICAgICAgICAgICBjYXNlIDE6IHsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgY29sID0gMDsgY29sIDwgYm1wX3B0ci0+d2lkdGg7IGNvbCsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKnJvd19idWYrKyA9IGRlc19idWZbY29sID4+IDNdICYgKDB4ODAgPj4gKGNvbCAlIDgpKSA/IDB4MDEgOiAweDAwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgNDogew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBjb2wgPSAwOyBjb2wgPCBibXBfcHRyLT53aWR0aDsgY29sKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcm93X2J1ZisrID0gKGNvbCAmIDB4MDEpID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc19idWZbY29sID4+IDFdICYgMHgwRikgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRlc19idWZbY29sID4+IDFdICYgMHhGMCkgPj4gNCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorICAgICAgICAgICAgY2FzZSAxNjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfV09SRCogYnVmID0gKEZYX1dPUkQqKWRlc19idWY7DQorICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJsdWVfYml0cyA9IDA7DQorICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGdyZWVuX2JpdHMgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfQllURSByZWRfYml0cyA9IDA7DQorICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGJtcF9wdHItPm1hc2tfYmx1ZSA+PiBpKSAmIDB4MDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZV9iaXRzKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKChibXBfcHRyLT5tYXNrX2dyZWVuID4+IGkpICYgMHgwMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbl9iaXRzKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKChibXBfcHRyLT5tYXNrX3JlZCA+PiBpKSAmIDB4MDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkX2JpdHMrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBncmVlbl9iaXRzICs9IGJsdWVfYml0czsNCisgICAgICAgICAgICAgICAgICAgIHJlZF9iaXRzICs9IGdyZWVuX2JpdHM7DQorICAgICAgICAgICAgICAgICAgICBibHVlX2JpdHMgPSA4IC0gYmx1ZV9iaXRzOw0KKyAgICAgICAgICAgICAgICAgICAgZ3JlZW5fYml0cyAtPSA4Ow0KKyAgICAgICAgICAgICAgICAgICAgcmVkX2JpdHMgLT0gODsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgY29sID0gMDsgY29sIDwgYm1wX3B0ci0+d2lkdGg7IGNvbCsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiA9IF9HZXRXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpYnVmKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcm93X2J1ZisrID0gKEZYX0JZVEUpKCgqYnVmICYgYm1wX3B0ci0+bWFza19ibHVlKSA8PCBibHVlX2JpdHMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICpyb3dfYnVmKysgPSAoRlhfQllURSkoKCpidWYgJiBibXBfcHRyLT5tYXNrX2dyZWVuKSA+PiBncmVlbl9iaXRzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAqcm93X2J1ZisrID0gKEZYX0JZVEUpKCgqYnVmKysgJiBibXBfcHRyLT5tYXNrX3JlZCkgPj4gcmVkX2JpdHMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgICBjYXNlIDI0Og0KKyAgICAgICAgICAgIGNhc2UgMzI6DQorICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCBkZXNfYnVmLCBibXBfcHRyLT5zcmNfcm93X2J5dGVzKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByb3dfYnVmID0gYm1wX3B0ci0+b3V0X3Jvd19idWZmZXI7DQorICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgfQ0KKyAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19UQUlMKTsNCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZYX0lOVDMyIF9ibXBfZGVjb2RlX3JsZTgoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikNCit7DQorICAgIEZYX0xQQllURSBmaXJzdF9ieXRlX3B0ciA9IE5VTEw7DQorICAgIEZYX0xQQllURSBzZWNvbmRfYnl0ZV9wdHIgPSBOVUxMOw0KKyAgICBibXBfcHRyLT5jb2xfbnVtID0gMDsNCisgICAgd2hpbGUoVFJVRSkgew0KKyAgICAgICAgRlhfRFdPUkQgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsNCisgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZmaXJzdF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoKCpmaXJzdF9ieXRlX3B0cikgew0KKyAgICAgICAgICAgIGNhc2UgUkxFX01BUktFUjogew0KKyAgICAgICAgICAgICAgICAgICAgaWYoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCgqZmlyc3RfYnl0ZV9wdHIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJMRV9FT0w6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPnJvd19udW0gPj0gYm1wX3B0ci0+aGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbihibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPyBibXBfcHRyLT5yb3dfbnVtKysgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRU9JOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5yb3dfbnVtIDwgYm1wX3B0ci0+aGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPyBibXBfcHRyLT5yb3dfbnVtKysgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJMRV9ERUxUQTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlbHRhX3B0cjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZWx0YV9wdHIsIDIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoRlhfSU5UMzIpZGVsdGFfcHRyWzBdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgYm1wX3Jvd19udW1fbmV4dCA9IGJtcF9wdHItPnJvd19udW0gKyAoRlhfSU5UMzIpZGVsdGFfcHRyWzFdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm1wX3B0ci0+Y29sX251bSA+PSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIHx8IGJtcF9yb3dfbnVtX25leHQgPj0gYm1wX3B0ci0+aGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQgT3IgTm90IFN1cHBvcnRlZCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoYm1wX3B0ci0+cm93X251bSA8IGJtcF9yb3dfbnVtX25leHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPyBibXBfcHRyLT5yb3dfbnVtKysgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoRlhfSU5UMzIpKCpmaXJzdF9ieXRlX3B0cikgPiBibXBfcHRyLT5zcmNfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyICYgMSA/ICpmaXJzdF9ieXRlX3B0ciArIDEgOiAqZmlyc3RfYnl0ZV9wdHIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtLCBzZWNvbmRfYnl0ZV9wdHIsICpmaXJzdF9ieXRlX3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5jb2xfbnVtICs9IChGWF9JTlQzMikoKmZpcnN0X2J5dGVfcHRyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYoKEZYX0lOVDMyKSgqZmlyc3RfYnl0ZV9wdHIpID4gYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0sICpzZWNvbmRfYnl0ZV9wdHIsICpmaXJzdF9ieXRlX3B0cik7DQorICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5jb2xfbnVtICs9IChGWF9JTlQzMikoKmZpcnN0X2J5dGVfcHRyKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0lOVDMyIF9ibXBfZGVjb2RlX3JsZTQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikNCit7DQorICAgIEZYX0xQQllURSBmaXJzdF9ieXRlX3B0ciA9IE5VTEw7DQorICAgIEZYX0xQQllURSBzZWNvbmRfYnl0ZV9wdHIgPSBOVUxMOw0KKyAgICBibXBfcHRyLT5jb2xfbnVtID0gMDsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQorICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZmlyc3RfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCgqZmlyc3RfYnl0ZV9wdHIpIHsNCisgICAgICAgICAgICBjYXNlIFJMRV9NQVJLRVI6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZmaXJzdF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKmZpcnN0X2J5dGVfcHRyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRU9MOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5yb3dfbnVtID49IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkxFX0VPSTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm1wX3B0ci0+cm93X251bSA8IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbihibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19UQUlMKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfREVMVEE6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZWx0YV9wdHI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZGVsdGFfcHRyLCAyKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gKz0gKEZYX0lOVDMyKWRlbHRhX3B0clswXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGJtcF9yb3dfbnVtX25leHQgPSBibXBfcHRyLT5yb3dfbnVtICsgKEZYX0lOVDMyKWRlbHRhX3B0clsxXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPmNvbF9udW0gPj0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyB8fCBibXBfcm93X251bV9uZXh0ID49IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0IE9yIE5vdCBTdXBwb3J0ZWQiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGJtcF9wdHItPnJvd19udW0gPCBibXBfcm93X251bV9uZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbihibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBzaXplID0gKEZYX0JZVEUpKCgoRlhfV09SRCkoKmZpcnN0X2J5dGVfcHRyKSArIDEpID4+IDEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKEZYX0lOVDMyKSpmaXJzdF9ieXRlX3B0ciA+PSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNpemUgKyAoYm1wX3B0ci0+Y29sX251bSA+PiAxKSA+IGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaXJzdF9ieXRlX3B0ciA9IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsIHNpemUgJiAxID8gc2l6ZSArIDEgOiBzaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfQllURSBpID0gMDsgaSA8ICpmaXJzdF9ieXRlX3B0cjsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSAmIDB4MDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPSAoKnNlY29uZF9ieXRlX3B0cisrICYgMHgwRik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPSAoKCpzZWNvbmRfYnl0ZV9wdHIgJiAweEYwKSA+PiA0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKChGWF9JTlQzMikqZmlyc3RfYnl0ZV9wdHIgPiBibXBfcHRyLT5vdXRfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgc2l6ZSA9IChGWF9CWVRFKSgoKEZYX1dPUkQpKCpmaXJzdF9ieXRlX3B0cikgKyAxKSA+PiAxKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihzaXplICsgKGJtcF9wdHItPmNvbF9udW0gPj4gMSkgPiBibXBfcHRyLT5zcmNfcm93X2J5dGVzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAqZmlyc3RfYnl0ZV9wdHIgPSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSAtIDE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0JZVEUgaSA9IDA7IGkgPCAqZmlyc3RfYnl0ZV9wdHI7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgJiAweDAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0gKCpzZWNvbmRfYnl0ZV9wdHIgJiAweDBGKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSsrKSA9ICgoKnNlY29uZF9ieXRlX3B0ciAmIDB4RjApID4+IDQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0xQQllURSBfYm1wX3JlYWRfZGF0YShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9MUEJZVEUqIGRlc19idWZfcHAsIEZYX0RXT1JEIGRhdGFfc2l6ZSkNCit7DQorICAgIGlmKGJtcF9wdHIgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIGJtcF9wdHItPmF2YWlsX2luIDwgYm1wX3B0ci0+c2tpcF9zaXplICsgZGF0YV9zaXplKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICAqZGVzX2J1Zl9wcCA9IGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemU7DQorICAgIGJtcF9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7DQorICAgIHJldHVybiAqZGVzX2J1Zl9wcDsNCit9DQordm9pZCBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0lOVDMyIHN0YXR1cykNCit7DQorICAgIGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPSBzdGF0dXM7DQorICAgIGJtcF9wdHItPm5leHRfaW4gKz0gYm1wX3B0ci0+c2tpcF9zaXplOw0KKyAgICBibXBfcHRyLT5hdmFpbF9pbiAtPSBibXBfcHRyLT5za2lwX3NpemU7DQorICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IDA7DQorfQ0KK3ZvaWQgX2JtcF9pbnB1dF9idWZmZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfTFBCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KK3sNCisgICAgYm1wX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7DQorICAgIGJtcF9wdHItPmF2YWlsX2luID0gc3JjX3NpemU7DQorICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IDA7DQorfQ0KK0ZYX0RXT1JEIF9ibXBfZ2V0X2F2YWlsX2lucHV0KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0xQQllURSogYXZpYWxfYnVmX3B0cikNCit7DQorICAgIGlmKGF2aWFsX2J1Zl9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgKmF2aWFsX2J1Zl9wdHIgPSBOVUxMOw0KKyAgICAgICAgaWYoYm1wX3B0ci0+YXZhaWxfaW4gPiAwKSB7DQorICAgICAgICAgICAgKmF2aWFsX2J1Zl9wdHIgPSBibXBfcHRyLT5uZXh0X2luOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBibXBfcHRyLT5hdmFpbF9pbjsNCit9DQorYm1wX2NvbXByZXNzX3N0cnVjdF9wIF9ibXBfY3JlYXRlX2NvbXByZXNzKCkNCit7DQorICAgIGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyOw0KKyAgICBibXBfcHRyID0gRlhfQWxsb2MoYm1wX2NvbXByZXNzX3N0cnVjdCwgMSk7DQorICAgIGlmIChibXBfcHRyKSB7DQorICAgICAgICBGWFNZU19tZW1zZXQzMihibXBfcHRyLCAwLCBzaXplb2YoYm1wX2NvbXByZXNzX3N0cnVjdCkpOw0KKyAgICB9DQorICAgIHJldHVybiBibXBfcHRyOw0KK30NCit2b2lkIF9ibXBfZGVzdHJveV9jb21wcmVzcyhibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikNCit7DQorICAgIGlmIChibXBfcHRyKSB7DQorICAgICAgICBpZiAoYm1wX3B0ci0+c3JjX2ZyZWUgJiYgYm1wX3B0ci0+c3JjX2J1Zikgew0KKyAgICAgICAgICAgIEZYX0ZyZWUoYm1wX3B0ci0+c3JjX2J1Zik7DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKGJtcF9wdHIpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIFdyaXRlRmlsZUhlYWRlcihCbXBGaWxlSGVhZGVyUHRyIGhlYWRfcHRyLCBGWF9MUEJZVEUgZHN0X2J1ZikNCit7DQorICAgIEZYX0RXT1JEIG9mZnNldDsNCisgICAgb2Zmc2V0ID0gMDsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmVHlwZSk7DQorICAgIG9mZnNldCArPSAyOw0KKyAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmU2l6ZSk7DQorICAgIG9mZnNldCArPSA0Ow0KKyAgICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZSZXNlcnZlZDEpOw0KKyAgICBvZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmUmVzZXJ2ZWQyKTsNCisgICAgb2Zmc2V0ICs9IDI7DQorICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZPZmZCaXRzKTsNCisgICAgb2Zmc2V0ICs9IDQ7DQorfQ0KK3N0YXRpYyB2b2lkIFdyaXRlSW5mb0hlYWRlcihCbXBJbmZvSGVhZGVyUHRyIGluZm9faGVhZF9wdHIsIEZYX0xQQllURSBkc3RfYnVmKQ0KK3sNCisgICAgRlhfRFdPUkQgb2Zmc2V0Ow0KKyAgICBvZmZzZXQgPSBzaXplb2YoQm1wRmlsZUhlYWRlcik7DQorICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVNpemUpOw0KKyAgICBvZmZzZXQgKz0gNDsNCisgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIChGWF9EV09SRClpbmZvX2hlYWRfcHRyLT5iaVdpZHRoKTsNCisgICAgb2Zmc2V0ICs9IDQ7DQorICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCAoRlhfRFdPUkQpaW5mb19oZWFkX3B0ci0+YmlIZWlnaHQpOw0KKyAgICBvZmZzZXQgKz0gNDsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlQbGFuZXMpOw0KKyAgICBvZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlCaXRDb3VudCk7DQorICAgIG9mZnNldCArPSAyOw0KKyAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlDb21wcmVzc2lvbik7DQorICAgIG9mZnNldCArPSA0Ow0KKyAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlTaXplSW1hZ2UpOw0KKyAgICBvZmZzZXQgKz0gNDsNCisgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIChGWF9EV09SRClpbmZvX2hlYWRfcHRyLT5iaVhQZWxzUGVyTWV0ZXIpOw0KKyAgICBvZmZzZXQgKz0gNDsNCisgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIChGWF9EV09SRClpbmZvX2hlYWRfcHRyLT5iaVlQZWxzUGVyTWV0ZXIpOw0KKyAgICBvZmZzZXQgKz0gNDsNCisgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpQ2xyVXNlZCk7DQorICAgIG9mZnNldCArPSA0Ow0KKyAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlDbHJJbXBvcnRhbnQpOw0KKyAgICBvZmZzZXQgKz0gNDsNCit9DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfYml0ZmllbGRzKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3Rfc2l6ZSkNCit7DQorICAgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ICE9IDE2ICYmIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgIT0gMzIpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBzaXplLCBkc3RfcG9zLCBpOw0KKyAgICBzaXplID0gYm1wX3B0ci0+c3JjX3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdyAqIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgLyAxNjsNCisgICAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsNCisgICAgZHN0X3NpemUgKz0gc2l6ZTsNCisgICAgZHN0X2J1ZiA9IEZYX1JlYWxsb2MoRlhfQllURSwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KKyAgICBGWF9EV09SRAkJbWFza19yZWQ7DQorICAgIEZYX0RXT1JECQltYXNrX2dyZWVuOw0KKyAgICBGWF9EV09SRAkJbWFza19ibHVlOw0KKyAgICBtYXNrX3JlZAk9IDB4N0MwMDsNCisgICAgbWFza19ncmVlbiA9IDB4MDNFMDsNCisgICAgbWFza19ibHVlCT0gMHgwMDFGOw0KKyAgICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlDb21wcmVzc2lvbiA9PSBCTVBfQklURklFTERTKSB7DQorICAgICAgICBpZiAoYm1wX3B0ci0+Yml0X3R5cGUgPT0gQk1QX0JJVF81NjUpIHsNCisgICAgICAgICAgICBtYXNrX3JlZAk9IDB4RjgwMDsNCisgICAgICAgICAgICBtYXNrX2dyZWVuID0gMHgwN0UwOw0KKyAgICAgICAgICAgIG1hc2tfYmx1ZQk9IDB4MDAxRjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ID09IDMyKSB7DQorICAgICAgICAgICAgbWFza19yZWQJPSAweEZGMDAwMDsNCisgICAgICAgICAgICBtYXNrX2dyZWVuID0gMHgwMEZGMDA7DQorICAgICAgICAgICAgbWFza19ibHVlCT0gMHgwMDAwRkY7DQorICAgICAgICB9DQorICAgICAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIG1hc2tfcmVkKTsNCisgICAgICAgIGRzdF9wb3MgKz0gNDsNCisgICAgICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19ncmVlbik7DQorICAgICAgICBkc3RfcG9zICs9IDQ7DQorICAgICAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIG1hc2tfYmx1ZSk7DQorICAgICAgICBkc3RfcG9zICs9IDQ7DQorICAgICAgICBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHMgPSBkc3RfcG9zOw0KKyAgICB9DQorICAgIEZYX0JZVEUgYmx1ZV9iaXRzID0gMDsNCisgICAgRlhfQllURSBncmVlbl9iaXRzID0gMDsNCisgICAgRlhfQllURSByZWRfYml0cyA9IDA7DQorICAgIGZvcihpID0gMDsgaSA8IGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQ7IGkrKykgew0KKyAgICAgICAgaWYoKG1hc2tfYmx1ZSA+PiBpKSAmIDB4MDEpIHsNCisgICAgICAgICAgICBibHVlX2JpdHMrKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmKChtYXNrX2dyZWVuID4+IGkpICYgMHgwMSkgew0KKyAgICAgICAgICAgIGdyZWVuX2JpdHMrKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmKChtYXNrX3JlZCA+PiBpKSAmIDB4MDEpIHsNCisgICAgICAgICAgICByZWRfYml0cysrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGdyZWVuX2JpdHMgKz0gYmx1ZV9iaXRzOw0KKyAgICByZWRfYml0cyArPSBncmVlbl9iaXRzOw0KKyAgICBibHVlX2JpdHMgPSA4IC0gYmx1ZV9iaXRzOw0KKyAgICBncmVlbl9iaXRzIC09IDg7DQorICAgIHJlZF9iaXRzIC09IDg7DQorICAgIGkgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIHJvd19udW0gPSBibXBfcHRyLT5zcmNfcm93IC0gMTsgcm93X251bSA+IC0xOyByb3dfbnVtLS0sIGkgPSAwKSB7DQorICAgICAgICB3aGlsZSAoaSA8IGJtcF9wdHItPnNyY193aWR0aCAqIGJtcF9wdHItPnNyY19icHAgLyA4KSB7DQorICAgICAgICAgICAgRlhfQllURSBiID0gYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoICsgaSsrXTsNCisgICAgICAgICAgICBGWF9CWVRFIGcgPSBibXBfcHRyLT5zcmNfYnVmW3Jvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2ggKyBpKytdOw0KKyAgICAgICAgICAgIEZYX0JZVEUgciA9IGJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaCArIGkrK107DQorICAgICAgICAgICAgaWYgKGJtcF9wdHItPnNyY19icHAgPT0gMzIpIHsNCisgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9EV09SRCBwaXhfdmFsID0gMDsNCisgICAgICAgICAgICBwaXhfdmFsIHw9IChiID4+IGJsdWVfYml0cykgJiBtYXNrX2JsdWU7DQorICAgICAgICAgICAgcGl4X3ZhbCB8PSAoZyA8PCBncmVlbl9iaXRzKSAmIG1hc2tfZ3JlZW47DQorICAgICAgICAgICAgcGl4X3ZhbCB8PSAociA8PCByZWRfYml0cykgJiBtYXNrX3JlZDsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCA9PSAxNikgew0KKyAgICAgICAgICAgICAgICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgKEZYX1dPUkQpcGl4X3ZhbCk7DQorICAgICAgICAgICAgICAgIGRzdF9wb3MgKz0gMjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIHBpeF92YWwpOw0KKyAgICAgICAgICAgICAgICBkc3RfcG9zICs9IDQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGRzdF9zaXplID0gZHN0X3BvczsNCit9DQorI2VuZGlmDQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmdiKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3Rfc2l6ZSkNCit7DQorICAgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ID09IDE2KSB7DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorICAgICAgICBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyNlbmRpZg0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIHNpemUsIGRzdF9wb3M7DQorICAgIEZYX0RXT1JEIGRzdF9waXRjaCA9IChibXBfcHRyLT5zcmNfd2lkdGggKiBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ICsgMzEpIC8gMzIgKiA0Ow0KKyAgICBzaXplID0gZHN0X3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdzsNCisgICAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsNCisgICAgZHN0X3NpemUgKz0gc2l6ZTsNCisgICAgZHN0X2J1ZiA9IEZYX1JlYWxsb2MoRlhfQllURSwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KKyAgICBmb3IgKEZYX0lOVDMyIHJvd19udW0gPSBibXBfcHRyLT5zcmNfcm93IC0gMTsgcm93X251bSA+IC0xOyByb3dfbnVtLS0pIHsNCisgICAgICAgIEZYU1lTX21lbWNweTMyKCZkc3RfYnVmW2RzdF9wb3NdLCAmYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoXSwgYm1wX3B0ci0+c3JjX3BpdGNoKTsNCisgICAgICAgIGRzdF9wb3MgKz0gZHN0X3BpdGNoOw0KKyAgICB9DQorICAgIGRzdF9zaXplID0gZHN0X3BvczsNCit9DQorc3RhdGljIEZYX0JZVEUgX2JtcF9ybGU4X3NlYXJjaChGWF9MUENCWVRFIGJ1ZiwgRlhfSU5UMzIgbGVuKQ0KK3sNCisgICAgRlhfQllURSBudW07DQorICAgIG51bSA9IDE7DQorICAgIHdoaWxlIChudW0gPCBsZW4pIHsNCisgICAgICAgIGlmIChidWZbbnVtIC0gMV0gIT0gYnVmW251bV0gfHwgbnVtID09IDB4RkYpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG51bSsrOw0KKyAgICB9DQorICAgIHJldHVybiBudW07DQorfQ0KK3N0YXRpYyB2b2lkIF9ibXBfZW5jb2RlX3JsZTgoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9zaXplKQ0KK3sNCisgICAgRlhfRFdPUkQgc2l6ZSwgZHN0X3BvcywgaW5kZXg7DQorICAgIEZYX0JZVEUgcmxlWzJdID0gezB9Ow0KKyAgICBzaXplID0gYm1wX3B0ci0+c3JjX3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdyAqIDI7DQorICAgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQorICAgIGRzdF9zaXplICs9IHNpemU7DQorICAgIGRzdF9idWYgPSBGWF9SZWFsbG9jKEZYX0JZVEUsIGRzdF9idWYsIGRzdF9zaXplKTsNCisgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDMyKCZkc3RfYnVmW2RzdF9wb3NdLCAwLCBzaXplKTsNCisgICAgZm9yIChGWF9JTlQzMiByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDEsIGkgPSAwOyByb3dfbnVtID4gLTE7ICkgew0KKyAgICAgICAgaW5kZXggPSByb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoOw0KKyAgICAgICAgcmxlWzBdID0gX2JtcF9ybGU4X3NlYXJjaCgmYm1wX3B0ci0+c3JjX2J1ZltpbmRleCArIGldLCBzaXplIC0gaW5kZXggLSBpKTsNCisgICAgICAgIHJsZVsxXSA9IGJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXTsNCisgICAgICAgIGlmIChpICsgcmxlWzBdID49IChGWF9JTlQzMilibXBfcHRyLT5zcmNfcGl0Y2gpIHsNCisgICAgICAgICAgICBybGVbMF0gPSBGWF9CWVRFKGJtcF9wdHItPnNyY19waXRjaCAtIGkpOw0KKyAgICAgICAgICAgIGlmIChybGVbMF0pIHsNCisgICAgICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KKyAgICAgICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7DQorICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPTDsNCisgICAgICAgICAgICBpID0gMDsNCisgICAgICAgICAgICByb3dfbnVtLS07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGkgKz0gcmxlWzBdOw0KKyAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVswXTsNCisgICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQorICAgICAgICB9DQorICAgIH0NCisgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCisgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPSTsNCisgICAgZHN0X3NpemUgPSBkc3RfcG9zOw0KK30NCitzdGF0aWMgRlhfQllURSBfYm1wX3JsZTRfc2VhcmNoKEZYX0xQQ0JZVEUgYnVmLCBGWF9JTlQzMiBsZW4pDQorew0KKyAgICBGWF9CWVRFIG51bTsNCisgICAgbnVtID0gMjsNCisgICAgd2hpbGUgKG51bSA8IGxlbikgew0KKyAgICAgICAgaWYgKGJ1ZltudW0gLSAyXSAhPSBidWZbbnVtXSB8fCBudW0gPT0gMHhGRikgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbnVtKys7DQorICAgIH0NCisgICAgcmV0dXJuIG51bTsNCit9DQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmxlNChibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X3NpemUpDQorew0KKyAgICBGWF9EV09SRCBzaXplLCBkc3RfcG9zLCBpbmRleDsNCisgICAgRlhfQllURSBybGVbMl0gPSB7MH07DQorICAgIHNpemUgPSBibXBfcHRyLT5zcmNfcGl0Y2ggKiBibXBfcHRyLT5zcmNfcm93Ow0KKyAgICBkc3RfcG9zID0gYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzOw0KKyAgICBkc3Rfc2l6ZSArPSBzaXplOw0KKyAgICBkc3RfYnVmID0gRlhfUmVhbGxvYyhGWF9CWVRFLCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQorICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMigmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7DQorICAgIGZvciAoRlhfSU5UMzIgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxLCBpID0gMDsgcm93X251bSA+IC0xOyBybGVbMV0gPSAwKSB7DQorICAgICAgICBpbmRleCA9IHJvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2g7DQorICAgICAgICBybGVbMF0gPSBfYm1wX3JsZTRfc2VhcmNoKCZibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV0sIHNpemUgLSBpbmRleCAtIGkpOw0KKyAgICAgICAgcmxlWzFdIHw9IChibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV0gJiAweDBmKSA8PCA0Ow0KKyAgICAgICAgcmxlWzFdIHw9IGJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpICsgMV0gJiAweDBmOw0KKyAgICAgICAgaWYgKGkgKyBybGVbMF0gPj0gKEZYX0lOVDMyKWJtcF9wdHItPnNyY19waXRjaCkgew0KKyAgICAgICAgICAgIHJsZVswXSA9IEZYX0JZVEUoYm1wX3B0ci0+c3JjX3BpdGNoIC0gaSk7DQorICAgICAgICAgICAgaWYgKHJsZVswXSkgew0KKyAgICAgICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMF07DQorICAgICAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCisgICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfRU9MOw0KKyAgICAgICAgICAgIGkgPSAwOw0KKyAgICAgICAgICAgIHJvd19udW0tLTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaSArPSBybGVbMF07DQorICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KKyAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfTUFSS0VSOw0KKyAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfRU9JOw0KKyAgICBkc3Rfc2l6ZSA9IGRzdF9wb3M7DQorfQ0KK0ZYX0JPT0wgX2JtcF9lbmNvZGVfaW1hZ2UoIGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3Rfc2l6ZSApDQorew0KKyAgICBGWF9EV09SRCBoZWFkX3NpemUgPSBzaXplb2YoQm1wRmlsZUhlYWRlcikgKyBzaXplb2YoQm1wSW5mb0hlYWRlcik7DQorICAgIEZYX0RXT1JEIHBhbF9zaXplID0gc2l6ZW9mKEZYX0RXT1JEKSAqIGJtcF9wdHItPnBhbF9udW07DQorICAgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNsclVzZWQgPiAwICYmIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZCA8IGJtcF9wdHItPnBhbF9udW0pIHsNCisgICAgICAgIHBhbF9zaXplID0gc2l6ZW9mKEZYX0RXT1JEKSAqIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZDsNCisgICAgfQ0KKyAgICBkc3Rfc2l6ZSA9IGhlYWRfc2l6ZSArIHNpemVvZihGWF9EV09SRCkgKiBibXBfcHRyLT5wYWxfbnVtOw0KKyAgICBkc3RfYnVmID0gRlhfQWxsb2NOTChGWF9CWVRFLCBkc3Rfc2l6ZSk7DQorICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihkc3RfYnVmLCAwLCBkc3Rfc2l6ZSk7DQorICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyA9IGhlYWRfc2l6ZTsNCisgICAgaWYgKGJtcF9wdHItPnBhbF9wdHIgJiYgcGFsX3NpemUpIHsNCisgICAgICAgIEZYU1lTX21lbWNweTMyKCZkc3RfYnVmW2hlYWRfc2l6ZV0sIGJtcF9wdHItPnBhbF9wdHIsIHBhbF9zaXplKTsNCisgICAgICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyArPSBwYWxfc2l6ZTsNCisgICAgfQ0KKyAgICBXcml0ZUluZm9IZWFkZXIoJmJtcF9wdHItPmluZm9faGVhZGVyLCBkc3RfYnVmKTsNCisgICAgc3dpdGNoKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ29tcHJlc3Npb24pIHsNCisgICAgICAgIGNhc2UgQk1QX1JHQjoNCisgICAgICAgICAgICBfYm1wX2VuY29kZV9yZ2IoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCTVBfQklURklFTERTOg0KKyNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KKyAgICAgICAgICAgIF9ibXBfZW5jb2RlX2JpdGZpZWxkcyhibXBfcHRyLCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQorI2VuZGlmDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEJNUF9STEU4Og0KKyAgICAgICAgICAgIF9ibXBfZW5jb2RlX3JsZTgoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCTVBfUkxFNDoNCisgICAgICAgICAgICBfYm1wX2VuY29kZV9ybGU0KGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgOw0KKyAgICB9DQorICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmU2l6ZSA9IGRzdF9zaXplOw0KKyAgICBXcml0ZUZpbGVIZWFkZXIoJmJtcF9wdHItPmZpbGVfaGVhZGVyLCBkc3RfYnVmKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjAzNzcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5oCkBAIC0wLDAgKzEsMTQyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0JBU0lDX0hfDQorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCINCisjZW5kaWYNCisjZGVmaW5lIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorI2RlZmluZSBCTVBfV0lEVEhCWVRFUyh3aWR0aCxiaXRDb3VudCkJKCh3aWR0aCpiaXRDb3VudCkgKyAzMSkvMzIqNA0KKyNkZWZpbmUgQk1QX1BBTF9FTkNPREUoYSxyLGcsYikgKCgoRlhfRFdPUkQpKGEpIDw8IDI0KSB8ICgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkNCisjZGVmaW5lIEJNUF9EX1NUQVRVU19IRUFERVIJCTB4MDENCisjZGVmaW5lIEJNUF9EX1NUQVRVU19QQUwJCTB4MDINCisjZGVmaW5lIEJNUF9EX1NUQVRVU19EQVRBX1BSRQkweDAzDQorI2RlZmluZSBCTVBfRF9TVEFUVVNfREFUQQkJMHgwNA0KKyNkZWZpbmUgQk1QX0RfU1RBVFVTX1RBSUwJCTB4MDANCisjZGVmaW5lIEJNUF9TSUdOQVRVUkUJMHg0RDQyDQorI2RlZmluZSBCTVBfUEFMX05FVwkJMA0KKyNkZWZpbmUgQk1QX1BBTF9PTEQJCTENCisjZGVmaW5lIFJMRV9NQVJLRVIJCTANCisjZGVmaW5lIFJMRV9FT0wJCQkwDQorI2RlZmluZSBSTEVfRU9JCQkJMQ0KKyNkZWZpbmUgUkxFX0RFTFRBCQkyDQorI2RlZmluZSBCTVBfUkdCCQkJMEwNCisjZGVmaW5lIEJNUF9STEU4CQkxTA0KKyNkZWZpbmUgQk1QX1JMRTQJCTJMDQorI2RlZmluZSBCTVBfQklURklFTERTCTNMDQorI2RlZmluZSBCTVBfQklUXzU1NQkJMA0KKyNkZWZpbmUgQk1QX0JJVF81NjUJCTENCisjZGVmaW5lIEJNUF9NQVhfRVJST1JfU0laRQkyNTYNCisjcHJhZ21hIHBhY2soMSkNCit0eXBlZGVmIHN0cnVjdCB0YWdCbXBGaWxlSGVhZGVyIHsNCisgICAgRlhfV09SRAkJYmZUeXBlOw0KKyAgICBGWF9EV09SRAliZlNpemU7DQorICAgIEZYX1dPUkQJCWJmUmVzZXJ2ZWQxOw0KKyAgICBGWF9XT1JECQliZlJlc2VydmVkMjsNCisgICAgRlhfRFdPUkQJYmZPZmZCaXRzOw0KK30gQm1wRmlsZUhlYWRlciwgKkJtcEZpbGVIZWFkZXJQdHI7DQordHlwZWRlZiBzdHJ1Y3QgdGFnQm1wQ29yZUhlYWRlciB7DQorICAgIEZYX0RXT1JEICAgYmNTaXplOw0KKyAgICBGWF9XT1JEICAgIGJjV2lkdGg7DQorICAgIEZYX1dPUkQgICAgYmNIZWlnaHQ7DQorICAgIEZYX1dPUkQgICAgYmNQbGFuZXM7DQorICAgIEZYX1dPUkQgICAgYmNCaXRDb3VudDsNCit9IEJtcENvcmVIZWFkZXIsICpCbXBDb3JlSGVhZGVyUHRyOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0JtcEluZm9IZWFkZXIgew0KKyAgICBGWF9EV09SRAliaVNpemU7DQorICAgIEZYX0lOVDMyCWJpV2lkdGg7DQorICAgIEZYX0lOVDMyCWJpSGVpZ2h0Ow0KKyAgICBGWF9XT1JECQliaVBsYW5lczsNCisgICAgRlhfV09SRAkJYmlCaXRDb3VudDsNCisgICAgRlhfRFdPUkQJYmlDb21wcmVzc2lvbjsNCisgICAgRlhfRFdPUkQJYmlTaXplSW1hZ2U7DQorICAgIEZYX0lOVDMyCWJpWFBlbHNQZXJNZXRlcjsNCisgICAgRlhfSU5UMzIJYmlZUGVsc1Blck1ldGVyOw0KKyAgICBGWF9EV09SRAliaUNsclVzZWQ7DQorICAgIEZYX0RXT1JECWJpQ2xySW1wb3J0YW50Ow0KK30gQm1wSW5mb0hlYWRlciwgKkJtcEluZm9IZWFkZXJQdHI7DQorI3ByYWdtYSBwYWNrKCkNCit0eXBlZGVmIHN0cnVjdCB0YWdfYm1wX2RlY29tcHJlc3Nfc3RydWN0IGJtcF9kZWNvbXByZXNzX3N0cnVjdDsNCit0eXBlZGVmIGJtcF9kZWNvbXByZXNzX3N0cnVjdCAqYm1wX2RlY29tcHJlc3Nfc3RydWN0X3A7DQordHlwZWRlZiBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCAqYm1wX2RlY29tcHJlc3Nfc3RydWN0X3BwOw0KK3N0cnVjdCB0YWdfYm1wX2RlY29tcHJlc3Nfc3RydWN0IHsNCisgICAgam1wX2J1ZgkJCWptcGJ1ZjsNCisgICAgRlhfTFBTVFIJCWVycl9wdHI7DQorICAgIHZvaWQJCQkoKl9ibXBfZXJyb3JfZm4pKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQ1NUUiBlcnJfbXNnKTsNCisNCisgICAgdm9pZCoJCQljb250ZXh0X3B0cjsNCisNCisgICAgQm1wRmlsZUhlYWRlclB0cglibXBfaGVhZGVyX3B0cjsNCisgICAgQm1wSW5mb0hlYWRlclB0cglibXBfaW5mb2hlYWRlcl9wdHI7DQorICAgIEZYX0lOVDMyCQl3aWR0aDsNCisgICAgRlhfSU5UMzIJCWhlaWdodDsNCisgICAgRlhfRFdPUkQJCWNvbXByZXNzX2ZsYWc7DQorICAgIEZYX0lOVDMyCQljb21wb25lbnRzOw0KKyAgICBGWF9JTlQzMgkJc3JjX3Jvd19ieXRlczsNCisgICAgRlhfSU5UMzIJCW91dF9yb3dfYnl0ZXM7DQorICAgIEZYX0xQQllURQkJb3V0X3Jvd19idWZmZXI7DQorICAgIEZYX1dPUkQJCQliaXRDb3VudHM7DQorICAgIEZYX0RXT1JECQljb2xvcl91c2VkOw0KKyAgICBGWF9CT09MCQkJaW1nVEJfZmxhZzsNCisgICAgRlhfSU5UMzIJCXBhbF9udW07DQorICAgIEZYX0lOVDMyCQlwYWxfdHlwZTsNCisgICAgRlhfRFdPUkQqCQlwYWxfcHRyOw0KKyAgICBGWF9EV09SRAkJZGF0YV9zaXplOw0KKyAgICBGWF9EV09SRAkJaW1nX2RhdGFfb2Zmc2V0Ow0KKyAgICBGWF9EV09SRAkJaW1nX2lmaF9zaXplOw0KKyAgICBGWF9JTlQzMgkJcm93X251bTsNCisgICAgRlhfSU5UMzIJCWNvbF9udW07DQorICAgIEZYX0lOVDMyCQlkcGlfeDsNCisgICAgRlhfSU5UMzIJCWRwaV95Ow0KKyNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KKyAgICBGWF9EV09SRAkJbWFza19yZWQ7DQorICAgIEZYX0RXT1JECQltYXNrX2dyZWVuOw0KKyAgICBGWF9EV09SRAkJbWFza19ibHVlOw0KKyNlbmRpZg0KKw0KKyAgICBGWF9CT09MCQkJKCpfYm1wX2dldF9kYXRhX3Bvc2l0aW9uX2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9EV09SRCBjdXJfcG9zKTsNCisgICAgdm9pZAkJCSgqX2JtcF9nZXRfcm93X2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9JTlQzMiByb3dfbnVtLCBGWF9MUEJZVEUgcm93X2J1Zik7DQorICAgIEZYX0xQQllURQkJbmV4dF9pbjsNCisgICAgRlhfRFdPUkQJCWF2YWlsX2luOw0KKyAgICBGWF9EV09SRAkJc2tpcF9zaXplOw0KKyAgICBGWF9JTlQzMgkJZGVjb2RlX3N0YXR1czsNCit9Ow0KK3ZvaWQgX2JtcF9lcnJvcihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9MUENTVFIgZXJyX21zZyk7DQorYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpOw0KK3ZvaWQgX2JtcF9kZXN0cm95X2RlY29tcHJlc3MoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3BwIGJtcF9wdHJfcHRyKTsNCitGWF9JTlQzMiBfYm1wX3JlYWRfaGVhZGVyKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KK0ZYX0lOVDMyIF9ibXBfZGVjb2RlX2ltYWdlKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KK0ZYX0lOVDMyIF9ibXBfZGVjb2RlX3JnYihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKTsNCitGWF9JTlQzMiBfYm1wX2RlY29kZV9ybGU4KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KK0ZYX0lOVDMyIF9ibXBfZGVjb2RlX3JsZTQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cik7DQorRlhfTFBCWVRFIF9ibXBfcmVhZF9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0xQQllURSogZGVzX2J1Zl9wcCwgRlhfRFdPUkQgZGF0YV9zaXplKTsNCit2b2lkIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfSU5UMzIgc3RhdHVzKTsNCit2b2lkIF9ibXBfaW5wdXRfYnVmZmVyKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIEZYX0xQQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7DQorRlhfRFdPUkQgX2JtcF9nZXRfYXZhaWxfaW5wdXQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfTFBCWVRFKiBhdmlhbF9idWZfcHRyKTsNCisjZGVmaW5lIEJNUF9QVFJfTk9UX05VTEwocHRyLGJtcF9wdHIpCWlmKHB0ciA9PSBOVUxMKXsJCQkJCQlcDQorICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsIk91dCBPZiBNZW1vcnkiKTtcDQorICAgICAgICByZXR1cm4gMDsJCQkJCQkJXA0KKyAgICB9DQordHlwZWRlZiBzdHJ1Y3QgdGFnX2JtcF9jb21wcmVzc19zdHJ1Y3QgYm1wX2NvbXByZXNzX3N0cnVjdDsNCit0eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3QgKmJtcF9jb21wcmVzc19zdHJ1Y3RfcDsNCit0eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3RfcCAqYm1wX2NvbXByZXNzX3N0cnVjdF9wcDsNCitzdHJ1Y3QgdGFnX2JtcF9jb21wcmVzc19zdHJ1Y3Qgew0KKyAgICBCbXBGaWxlSGVhZGVyCWZpbGVfaGVhZGVyOw0KKyAgICBCbXBJbmZvSGVhZGVyCWluZm9faGVhZGVyOw0KKyAgICBGWF9MUEJZVEUJCXNyY19idWY7DQorICAgIEZYX0RXT1JECQlzcmNfcGl0Y2g7DQorICAgIEZYX0RXT1JECQlzcmNfcm93Ow0KKyAgICBGWF9CWVRFCQkJc3JjX2JwcDsNCisgICAgRlhfRFdPUkQJCXNyY193aWR0aDsNCisgICAgRlhfQk9PTAkJCXNyY19mcmVlOw0KKyAgICBGWF9EV09SRCoJCXBhbF9wdHI7DQorICAgIEZYX1dPUkQJCQlwYWxfbnVtOw0KKyNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KKyAgICBGWF9CWVRFCQkJYml0X3R5cGU7DQorI2VuZGlmDQorfTsNCitibXBfY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfY29tcHJlc3MoKTsNCit2b2lkIF9ibXBfZGVzdHJveV9jb21wcmVzcyhibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cik7DQorRlhfQk9PTCBfYm1wX2VuY29kZV9pbWFnZShibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X3NpemUpOw0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1Nzk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuY3BwCkBAIC0wLDAgKzEsMTM2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiZnhfZ2lmLmgiDQordm9pZCBDR2lmTFpXRGVjb2Rlcjo6SW5wdXQoRlhfTFBCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KK3sNCisgICAgbmV4dF9pbiA9IHNyY19idWY7DQorICAgIGF2YWlsX2luID0gc3JjX3NpemU7DQorfQ0KK0ZYX0RXT1JEIENHaWZMWldEZWNvZGVyOjpHZXRBdmFpbElucHV0KCkNCit7DQorICAgIHJldHVybiBhdmFpbF9pbjsNCit9DQordm9pZCBDR2lmTFpXRGVjb2Rlcjo6SW5pdFRhYmxlKEZYX0JZVEUgY29kZV9sZW4pDQorew0KKyAgICBjb2RlX3NpemUgPSBjb2RlX2xlbjsNCisgICAgY29kZV9jbGVhciA9IDEgPDwgY29kZV9zaXplOw0KKyAgICBjb2RlX2VuZCA9IGNvZGVfY2xlYXIgKyAxOw0KKyAgICBiaXRzX2xlZnQgPSAwOw0KKyAgICBjb2RlX3N0b3JlID0gMDsNCisgICAgbmV4dF9pbiA9IE5VTEw7DQorICAgIGF2YWlsX2luID0gMDsNCisgICAgc3RhY2tfc2l6ZSA9IDA7DQorICAgIGNvZGVfZmlyc3QgPSAwOw0KKyAgICBDbGVhclRhYmxlKCk7DQorfQ0KK3ZvaWQgQ0dpZkxaV0RlY29kZXI6OkNsZWFyVGFibGUoKQ0KK3sNCisgICAgY29kZV9zaXplX2N1ciA9IGNvZGVfc2l6ZSArIDE7DQorICAgIGNvZGVfbmV4dCA9IGNvZGVfZW5kICsgMTsNCisgICAgY29kZV9vbGQgPSAoRlhfV09SRCkgLSAxOw0KKyAgICBGWFNZU19tZW1zZXQzMihjb2RlX3RhYmxlLCAwLCBzaXplb2YodGFnX1RhYmxlKSpHSUZfTUFYX0xaV19DT0RFKTsNCisgICAgRlhTWVNfbWVtc2V0MzIoc3RhY2ssIDAsIEdJRl9NQVhfTFpXX0NPREUpOw0KKyAgICBmb3IgKEZYX1dPUkQgaSA9IDA7IGkgPCBjb2RlX2NsZWFyOyBpKyspIHsNCisgICAgICAgIGNvZGVfdGFibGVbaV0uc3VmZml4ID0gKEZYX0JZVEUpaTsNCisgICAgfQ0KK30NCit2b2lkIENHaWZMWldEZWNvZGVyOjpEZWNvZGVTdHJpbmcoRlhfV09SRCBjb2RlKQ0KK3sNCisgICAgc3RhY2tfc2l6ZSA9IDA7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBBU1NFUlQoY29kZSA8PSBjb2RlX25leHQpOw0KKyAgICAgICAgaWYoY29kZSA8IGNvZGVfY2xlYXIgfHwgY29kZSA+IGNvZGVfbmV4dCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIDEgLSBzdGFja19zaXplKytdID0gY29kZV90YWJsZVtjb2RlXS5zdWZmaXg7DQorICAgICAgICBjb2RlID0gY29kZV90YWJsZVtjb2RlXS5wcmVmaXg7DQorICAgIH0NCisgICAgc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIDEgLSBzdGFja19zaXplKytdID0gKEZYX0JZVEUpY29kZTsNCisgICAgY29kZV9maXJzdCA9IChGWF9CWVRFKWNvZGU7DQorfQ0KK3ZvaWQgQ0dpZkxaV0RlY29kZXI6OkFkZENvZGUoRlhfV09SRCBwcmVmaXhfY29kZSwgRlhfQllURSBhcHBlbmRfY2hhcikNCit7DQorICAgIGlmKGNvZGVfbmV4dCA9PSBHSUZfTUFYX0xaV19DT0RFKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgY29kZV90YWJsZVtjb2RlX25leHRdLnByZWZpeCA9IHByZWZpeF9jb2RlOw0KKyAgICBjb2RlX3RhYmxlW2NvZGVfbmV4dF0uc3VmZml4ID0gYXBwZW5kX2NoYXI7DQorICAgIGlmKCsrY29kZV9uZXh0IDwgR0lGX01BWF9MWldfQ09ERSkgew0KKyAgICAgICAgaWYoY29kZV9uZXh0ID4+IGNvZGVfc2l6ZV9jdXIpIHsNCisgICAgICAgICAgICBjb2RlX3NpemVfY3VyKys7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0dpZkxaV0RlY29kZXI6OkRlY29kZShGWF9MUEJZVEUgZGVzX2J1ZiwgRlhfRFdPUkQmIGRlc19zaXplKQ0KK3sNCisgICAgaWYoZGVzX3NpemUgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDM7DQorICAgIH0NCisgICAgRlhfRFdPUkQgaSA9IDA7DQorICAgIGlmKHN0YWNrX3NpemUgIT0gMCkgew0KKyAgICAgICAgaWYoZGVzX3NpemUgPCBzdGFja19zaXplKSB7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgZGVzX3NpemUpOw0KKyAgICAgICAgICAgIHN0YWNrX3NpemUgLT0gKEZYX1dPUkQpZGVzX3NpemU7DQorICAgICAgICAgICAgcmV0dXJuIDM7DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19tZW1jcHkzMihkZXNfYnVmLCAmc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdLCBzdGFja19zaXplKTsNCisgICAgICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsNCisgICAgICAgIGkgKz0gc3RhY2tfc2l6ZTsNCisgICAgICAgIHN0YWNrX3NpemUgPSAwOw0KKyAgICB9DQorICAgIEZYX1dPUkQgY29kZSA9IDA7DQorICAgIHdoaWxlKGkgPD0gZGVzX3NpemUgJiYgKGF2YWlsX2luID4gMCB8fCBiaXRzX2xlZnQgPj0gY29kZV9zaXplX2N1cikpIHsNCisgICAgICAgIGlmKGNvZGVfc2l6ZV9jdXIgPiAxMikgew0KKyAgICAgICAgICAgIGlmKGVycl9tc2dfcHRyKQl7DQorICAgICAgICAgICAgICAgIEZYU1lTX3N0cm5jcHkoZXJyX21zZ19wdHIsICJDb2RlIExlbmd0aCBPdXQgT2YgUmFuZ2UiLCBHSUZfTUFYX0VSUk9SX1NJWkUgLSAxKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXZhaWxfaW4gPiAwKSB7DQorICAgICAgICAgICAgY29kZV9zdG9yZSB8PSAoKm5leHRfaW4rKykgPDwgYml0c19sZWZ0Ow0KKyAgICAgICAgICAgIGF2YWlsX2luLS07DQorICAgICAgICAgICAgYml0c19sZWZ0ICs9IDg7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoYml0c19sZWZ0ID49IGNvZGVfc2l6ZV9jdXIpIHsNCisgICAgICAgICAgICBjb2RlID0gKEZYX1dPUkQpY29kZV9zdG9yZSAmICgoMSA8PCBjb2RlX3NpemVfY3VyKSAtIDEpOw0KKyAgICAgICAgICAgIGNvZGVfc3RvcmUgPj49IGNvZGVfc2l6ZV9jdXI7DQorICAgICAgICAgICAgYml0c19sZWZ0IC09IGNvZGVfc2l6ZV9jdXI7DQorICAgICAgICAgICAgaWYoY29kZSA9PSBjb2RlX2NsZWFyKSB7DQorICAgICAgICAgICAgICAgIENsZWFyVGFibGUoKTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IGNvZGVfZW5kKSB7DQorICAgICAgICAgICAgICAgIGRlc19zaXplID0gaTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYoY29kZV9vbGQgIT0gKEZYX1dPUkQpIC0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYoY29kZV9uZXh0IDwgR0lGX01BWF9MWldfQ09ERSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvZGUgPT0gY29kZV9uZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZENvZGUoY29kZV9vbGQsIGNvZGVfZmlyc3QpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGNvZGUgPiBjb2RlX25leHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyX21zZ19wdHIpCXsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3N0cm5jcHkoZXJyX21zZ19wdHIsICJEZWNvZGUgRXJyb3IsIE91dCBPZiBSYW5nZSIsIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZVN0cmluZyhjb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBhcHBlbmRfY2hhciA9IHN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ29kZShjb2RlX29sZCwgYXBwZW5kX2NoYXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIERlY29kZVN0cmluZyhjb2RlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb2RlX29sZCA9IGNvZGU7DQorICAgICAgICAgICAgICAgIGlmKGkgKyBzdGFja19zaXplID4gZGVzX3NpemUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc19idWYsICZzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gc3RhY2tfc2l6ZV0sIGRlc19zaXplIC0gaSk7DQorICAgICAgICAgICAgICAgICAgICBzdGFja19zaXplIC09IChGWF9XT1JEKShkZXNfc2l6ZSAtIGkpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgc3RhY2tfc2l6ZSk7DQorICAgICAgICAgICAgICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsNCisgICAgICAgICAgICAgICAgaSArPSBzdGFja19zaXplOw0KKyAgICAgICAgICAgICAgICBzdGFja19zaXplID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYoYXZhaWxfaW4gPT0gMCkgew0KKyAgICAgICAgZGVzX3NpemUgPSBpOw0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK3N0YXRpYyBGWF9CT09MIF9naWZfZ3Jvd19idWYoRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQgc2l6ZSkNCit7DQorICAgIGlmIChkc3RfbGVuIDwgc2l6ZSkgew0KKyAgICAgICAgRlhfRFdPUkQgbGVuX29yZyA9IGRzdF9sZW47DQorICAgICAgICB3aGlsZSAoZHN0X2J1ZiAmJiBkc3RfbGVuIDwgc2l6ZSkgew0KKyAgICAgICAgICAgIGRzdF9sZW4gPDw9IDE7DQorICAgICAgICAgICAgZHN0X2J1ZiA9IEZYX1JlYWxsb2MoRlhfQllURSwgZHN0X2J1ZiwgZHN0X2xlbik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgICAgICAgICAgZHN0X2xlbiA9IHNpemU7DQorICAgICAgICAgICAgZHN0X2J1ZiA9IEZYX1JlYWxsb2MoRlhfQllURSwgZHN0X2J1ZiwgZHN0X2xlbik7DQorICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhTWVNfbWVtc2V0MzIoZHN0X2J1ZiArIGxlbl9vcmcsIDAsIGRzdF9sZW4gLSBsZW5fb3JnKTsNCisgICAgICAgIHJldHVybiBkc3RfYnVmICE9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfZ2lmX2N1dF9pbmRleChGWF9CWVRFJiB2YWwsIEZYX0RXT1JEIGluZGV4LCBGWF9CWVRFIGluZGV4X2JpdCwgRlhfQllURSBpbmRleF9iaXRfdXNlLCBGWF9CWVRFIGJpdF91c2UpDQorew0KKyAgICBGWF9EV09SRCBjdXQgPSAoKDEgPDwgKGluZGV4X2JpdCAtIGluZGV4X2JpdF91c2UpKSAtIDEpIDw8IGluZGV4X2JpdF91c2U7DQorICAgIHZhbCB8PSAoKGluZGV4ICYgY3V0KSA+PiBpbmRleF9iaXRfdXNlKSA8PCBiaXRfdXNlOw0KK30NCitzdGF0aWMgaW5saW5lIEZYX0JZVEUgX2dpZl9jdXRfYnVmKEZYX0xQQ0JZVEUgYnVmLCBGWF9EV09SRCYgb2Zmc2V0LCBGWF9CWVRFIGJpdF9jdXQsIEZYX0JZVEUmIGJpdF9vZmZzZXQsIEZYX0RXT1JEJiBiaXRfbnVtKQ0KK3sNCisgICAgaWYgKGJpdF9jdXQgIT0gOCkgew0KKyAgICAgICAgRlhfV09SRCBpbmRleCA9IDA7DQorICAgICAgICBpbmRleCB8PSAoKDEgPDwgYml0X2N1dCkgLSAxKSA8PCAoNyAtIGJpdF9vZmZzZXQpOw0KKyAgICAgICAgRlhfQllURSByZXQgPSAoKGluZGV4ICYgYnVmW29mZnNldF0pID4+ICg3IC0gYml0X29mZnNldCkpOw0KKyAgICAgICAgYml0X29mZnNldCArPSBiaXRfY3V0Ow0KKyAgICAgICAgaWYgKGJpdF9vZmZzZXQgPj0gOCkgew0KKyAgICAgICAgICAgIGlmIChiaXRfb2Zmc2V0ID4gOCkgew0KKyAgICAgICAgICAgICAgICByZXQgfD0gKChpbmRleCAmIChidWZbb2Zmc2V0ICsgMV0gPDwgOCkpID4+IDgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiaXRfb2Zmc2V0IC09IDg7DQorICAgICAgICAgICAgb2Zmc2V0ICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYml0X251bSArPSBiaXRfY3V0Ow0KKyAgICAgICAgcmV0dXJuIHJldDsNCisgICAgfQ0KKyAgICBiaXRfbnVtICs9IGJpdF9jdXQ7DQorICAgIHJldHVybiBidWZbb2Zmc2V0KytdOw0KK30NCitDR2lmTFpXRW5jb2Rlcjo6Q0dpZkxaV0VuY29kZXIoKQ0KK3sNCisgICAgRlhTWVNfbWVtc2V0MzIodGhpcywgMCwgc2l6ZW9mKENHaWZMWldFbmNvZGVyKSk7DQorfQ0KK0NHaWZMWldFbmNvZGVyOjp+Q0dpZkxaV0VuY29kZXIoKQ0KK3sNCit9DQordm9pZCBDR2lmTFpXRW5jb2Rlcjo6Q2xlYXJUYWJsZSgpDQorew0KKyAgICBpbmRleF9iaXRfY3VyID0gY29kZV9zaXplICsgMTsNCisgICAgaW5kZXhfbnVtID0gY29kZV9lbmQgKyAxOw0KKyAgICB0YWJsZV9jdXIgPSBjb2RlX2VuZCArIDE7DQorICAgIGZvciAoRlhfV09SRCBpID0gMDsgaSA8IEdJRl9NQVhfTFpXX0NPREU7IGkrKykgew0KKyAgICAgICAgY29kZV90YWJsZVtpXS5wcmVmaXggPSAwOw0KKyAgICAgICAgY29kZV90YWJsZVtpXS5zdWZmaXggPSAwOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0dpZkxaV0VuY29kZXI6OlN0YXJ0KCBGWF9CWVRFIGNvZGVfbGVuLCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIG9mZnNldCkNCit7DQorICAgIGNvZGVfc2l6ZSA9IGNvZGVfbGVuICsgMTsNCisgICAgc3JjX2JpdF9jdXQgPSBjb2RlX3NpemU7DQorICAgIGlmIChjb2RlX2xlbiA9PSAwKSB7DQorICAgICAgICBzcmNfYml0X2N1dCA9IDE7DQorICAgICAgICBjb2RlX3NpemUgPSAyOw0KKyAgICB9DQorICAgIGNvZGVfY2xlYXIgPSAxIDw8IGNvZGVfc2l6ZTsNCisgICAgY29kZV9lbmQgPSBjb2RlX2NsZWFyICsgMTsNCisgICAgZHN0X2J1ZltvZmZzZXQrK10gPSBjb2RlX3NpemU7DQorICAgIGJpdF9vZmZzZXQgPSAwOw0KKyAgICBDbGVhclRhYmxlKCk7DQorICAgIHNyY19vZmZzZXQgPSAwOw0KKyAgICBzcmNfYml0X29mZnNldCA9IDA7DQorICAgIHNyY19iaXRfbnVtID0gMDsNCisgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IF9naWZfY3V0X2J1ZihzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCisgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZihzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCit9DQordm9pZCBDR2lmTFpXRW5jb2Rlcjo6V3JpdGVCbG9jayhGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KQ0KK3sNCisgICAgaWYgKCFfZ2lmX2dyb3dfYnVmKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCArIEdJRl9EQVRBX0JMT0NLICsgMSkpIHsNCisgICAgICAgIGxvbmdqbXAoam1wLCAxKTsNCisgICAgfQ0KKyAgICBkc3RfYnVmW29mZnNldCsrXSA9IGluZGV4X2J1Zl9sZW47DQorICAgIEZYU1lTX21lbWNweTMyKCZkc3RfYnVmW29mZnNldF0sIGluZGV4X2J1ZiwgaW5kZXhfYnVmX2xlbik7DQorICAgIG9mZnNldCArPSBpbmRleF9idWZfbGVuOw0KKyAgICBGWFNZU19tZW1zZXQzMihpbmRleF9idWYsIDAsIEdJRl9EQVRBX0JMT0NLKTsNCisgICAgaW5kZXhfYnVmX2xlbiA9IDA7DQorfQ0KK3ZvaWQgQ0dpZkxaV0VuY29kZXI6OkVuY29kZVN0cmluZyggRlhfRFdPUkQgaW5kZXgsIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4sIEZYX0RXT1JEJiBvZmZzZXQgKQ0KK3sNCisgICAgRlhfQllURSBpbmRleF9iaXRfdXNlOw0KKyAgICBpbmRleF9iaXRfdXNlID0gMDsNCisgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgfQ0KKyAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLCBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgaWYgKGluZGV4X2JpdF9jdXIgPD0gKDggLSBiaXRfb2Zmc2V0KSkgew0KKyAgICAgICAgYml0X29mZnNldCArPSBpbmRleF9iaXRfY3VyOw0KKyAgICB9IGVsc2UgaWYgKGluZGV4X2JpdF9jdXIgPD0gKDE2IC0gYml0X29mZnNldCkpIHsNCisgICAgICAgIGluZGV4X2JpdF91c2UgKz0gKDggLSBiaXRfb2Zmc2V0KTsNCisgICAgICAgIGJpdF9vZmZzZXQgPSAwOw0KKyAgICAgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICAgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICAgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgICAgICB9DQorICAgICAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLCBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgICAgIGJpdF9vZmZzZXQgPSBpbmRleF9iaXRfY3VyIC0gaW5kZXhfYml0X3VzZTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGluZGV4X2JpdF91c2UgKz0gKDggLSBiaXRfb2Zmc2V0KTsNCisgICAgICAgIGJpdF9vZmZzZXQgPSAwOw0KKyAgICAgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICAgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICAgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgICAgICB9DQorICAgICAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLCBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgICAgIGluZGV4X2JpdF91c2UgKz0gODsNCisgICAgICAgIGJpdF9vZmZzZXQgPSAwOw0KKyAgICAgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICAgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICAgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgICAgICB9DQorICAgICAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLCBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgICAgIGJpdF9vZmZzZXQgPSBpbmRleF9iaXRfY3VyIC0gaW5kZXhfYml0X3VzZTsNCisgICAgfQ0KKyAgICBpZiAoYml0X29mZnNldCA9PSA4KSB7DQorICAgICAgICBiaXRfb2Zmc2V0ID0gMDsNCisgICAgICAgIGluZGV4X2J1Zl9sZW4rKzsNCisgICAgICAgIGlmIChpbmRleF9idWZfbGVuID09IEdJRl9EQVRBX0JMT0NLKSB7DQorICAgICAgICAgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpbmRleCA9PSBjb2RlX2VuZCkJew0KKyAgICAgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICAgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgICB9DQorICAgIGlmIChpbmRleF9udW0rKyA+PiBpbmRleF9iaXRfY3VyKSB7DQorICAgICAgICBpbmRleF9iaXRfY3VyKys7DQorICAgIH0NCit9DQorRlhfQk9PTCBDR2lmTFpXRW5jb2Rlcjo6RW5jb2RlKCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19sZW4sIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4sIEZYX0RXT1JEJiBvZmZzZXQgKQ0KK3sNCisgICAgRlhfQllURQkJc3VmZml4Ow0KKyAgICBpZiAoc2V0am1wKGptcCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3aGlsZShzcmNfYml0X251bSA8IHNyY19sZW4pIHsNCisgICAgICAgIGlmICghTG9va1VwSW5UYWJsZShzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X29mZnNldCkpIHsNCisgICAgICAgICAgICBFbmNvZGVTdHJpbmcoY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCwgZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgICAgICAgICBpZiAoaW5kZXhfbnVtID09IEdJRl9NQVhfTFpXX0NPREUpIHsNCisgICAgICAgICAgICAgICAgc3VmZml4ID0gY29kZV90YWJsZVtpbmRleF9udW0gLSAxXS5zdWZmaXg7DQorICAgICAgICAgICAgICAgIEVuY29kZVN0cmluZyhjb2RlX2NsZWFyLCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgICAgICAgICAgICAgICBDbGVhclRhYmxlKCk7DQorICAgICAgICAgICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXggPSBzdWZmaXg7DQorICAgICAgICAgICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXggPSBfZ2lmX2N1dF9idWYoc3JjX2J1Ziwgc3JjX29mZnNldCwgc3JjX2JpdF9jdXQsIHNyY19iaXRfb2Zmc2V0LCBzcmNfYml0X251bSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGNvZGVfdGFibGVbaW5kZXhfbnVtIC0gMV0uc3VmZml4Ow0KKyAgICAgICAgICAgICAgICBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4ID0gX2dpZl9jdXRfYnVmKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LCBzcmNfYml0X29mZnNldCwgc3JjX2JpdF9udW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBzcmNfb2Zmc2V0ID0gMDsNCisgICAgc3JjX2JpdF9vZmZzZXQgPSAwOw0KKyAgICBzcmNfYml0X251bSA9IDA7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENHaWZMWldFbmNvZGVyOjpMb29rVXBJblRhYmxlKCBGWF9MUENCWVRFIGJ1ZiwgRlhfRFdPUkQmIG9mZnNldCwgRlhfQllURSYgYml0X29mZnNldCApDQorew0KKyAgICBmb3IgKEZYX1dPUkQgaSA9IHRhYmxlX2N1cjsgaSA8IGluZGV4X251bTsgaSsrKSB7DQorICAgICAgICBpZiAoY29kZV90YWJsZVtpXS5wcmVmaXggPT0gY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCAmJg0KKyAgICAgICAgICAgICAgICBjb2RlX3RhYmxlW2ldLnN1ZmZpeCA9PSBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4KSB7DQorICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGk7DQorICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZihidWYsIG9mZnNldCwgc3JjX2JpdF9jdXQsIGJpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCisgICAgICAgICAgICB0YWJsZV9jdXIgPSBpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHRhYmxlX2N1ciA9IGNvZGVfZW5kICsgMTsNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENHaWZMWldFbmNvZGVyOjpGaW5pc2goRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCkNCit7DQorICAgIEVuY29kZVN0cmluZyhjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4LCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgICBFbmNvZGVTdHJpbmcoY29kZV9lbmQsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgIGJpdF9vZmZzZXQgPSAwOw0KKyAgICBDbGVhclRhYmxlKCk7DQorfQ0KK2dpZl9kZWNvbXByZXNzX3N0cnVjdF9wIF9naWZfY3JlYXRlX2RlY29tcHJlc3MoKQ0KK3sNCisgICAgZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciA9IChnaWZfZGVjb21wcmVzc19zdHJ1Y3QqKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihnaWZfZGVjb21wcmVzc19zdHJ1Y3QpKTsNCisgICAgaWYoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihnaWZfcHRyLCAwLCBzaXplb2YoZ2lmX2RlY29tcHJlc3Nfc3RydWN0KSk7DQorICAgIGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPSBHSUZfRF9TVEFUVVNfU0lHOw0KKyAgICBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIgPSBGWF9ORVcgQ0ZYX0FycmF5VGVtcGxhdGU8R2lmSW1hZ2UqPjsNCisgICAgaWYoZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyID09IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgICBnaWZfcHRyLT5jbXRfZGF0YV9wdHIgPSBGWF9ORVcgQ0ZYX0J5dGVTdHJpbmc7DQorICAgIGlmKGdpZl9wdHItPmNtdF9kYXRhX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyOw0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorICAgIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyID0gRlhfTkVXIENGWF9BcnJheVRlbXBsYXRlPEdpZlBsYWluVGV4dCo+Ow0KKyAgICBpZihnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICBkZWxldGUoZ2lmX3B0ci0+Y210X2RhdGFfcHRyKTsNCisgICAgICAgIGRlbGV0ZSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHI7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHIpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisjZW5kaWYNCisgICAgcmV0dXJuIGdpZl9wdHI7DQorfQ0KK3ZvaWQgX2dpZl9kZXN0cm95X2RlY29tcHJlc3MoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3BwIGdpZl9wdHJfcHRyKQ0KK3sNCisgICAgaWYoZ2lmX3B0cl9wdHIgPT0gTlVMTCB8fCAqZ2lmX3B0cl9wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIgPSAqZ2lmX3B0cl9wdHI7DQorICAgICpnaWZfcHRyX3B0ciA9IE5VTEw7DQorICAgIGlmKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIpOw0KKyAgICB9DQorICAgIGlmKGdpZl9wdHItPmltZ19kZWNvZGVyX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyOw0KKyAgICB9DQorICAgIGlmKGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9JTlQzMiBzaXplX2ltZ19hcnIgPSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldFNpemUoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaXplX2ltZ19hcnI7IGkrKykgew0KKyAgICAgICAgICAgIEdpZkltYWdlKiBwID0gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRBdChpKTsNCisgICAgICAgICAgICBpZihwLT5pbWFnZV9pbmZvX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocC0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihwLT5pbWFnZV9nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgRlhfRnJlZShwLT5pbWFnZV9nY2VfcHRyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocC0+aW1hZ2Vfcm93X2J1ZiAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocC0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHAtPmxvY2FsX3BhbF9wdHIgIT0gTlVMTCAmJiBwLT5sb2NhbF9wYWxfcHRyICE9IGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocC0+bG9jYWxfcGFsX3B0cik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0ZyZWUocCk7DQorICAgICAgICB9DQorICAgICAgICBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0cjsNCisgICAgfQ0KKyNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCisgICAgaWYoZ2lmX3B0ci0+YXBwX2RhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5hcHBfZGF0YSk7DQorICAgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCisgICAgaWYoZ2lmX3B0ci0+Y210X2RhdGFfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBnaWZfcHRyLT5jbXRfZGF0YV9wdHI7DQorICAgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgICBpZihnaWZfcHRyLT5nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICAgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgaWYoZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfSU5UMzIgc2l6ZV9wdF9hcnIgPSBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ci0+R2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHNpemVfcHRfYXJyOyBpKyspIHsNCisgICAgICAgICAgICBHaWZQbGFpblRleHQqIHAgPSBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ci0+R2V0QXQoaSk7DQorICAgICAgICAgICAgaWYocC0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocC0+Z2NlX3B0cik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHAtPnB0ZV9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKHAtPnB0ZV9wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihwLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHAtPnN0cmluZ19wdHI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyOw0KKyAgICB9DQorI2VuZGlmDQorICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorfQ0KK2dpZl9jb21wcmVzc19zdHJ1Y3RfcCBfZ2lmX2NyZWF0ZV9jb21wcmVzcygpDQorew0KKyAgICBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciA9IChnaWZfY29tcHJlc3Nfc3RydWN0KilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoZ2lmX2NvbXByZXNzX3N0cnVjdCkpOw0KKyAgICBpZiAoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihnaWZfcHRyLCAwLCBzaXplb2YoZ2lmX2NvbXByZXNzX3N0cnVjdCkpOw0KKyAgICBnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIgPSBGWF9ORVcgQ0dpZkxaV0VuY29kZXI7DQorICAgIGlmIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGdpZl9wdHItPmhlYWRlcl9wdHIgPSAoR2lmSGVhZGVyKilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoR2lmSGVhZGVyKSk7DQorICAgIGlmIChnaWZfcHRyLT5oZWFkZXJfcHRyID09IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZShnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYU1lTX21lbWNweTMyKGdpZl9wdHItPmhlYWRlcl9wdHItPnNpZ25hdHVyZSwgR0lGX1NJR05BVFVSRSwgMyk7DQorICAgIEZYU1lTX21lbWNweTMyKGdpZl9wdHItPmhlYWRlcl9wdHItPnZlcnNpb24sICI4OWEiLCAzKTsNCisgICAgZ2lmX3B0ci0+bHNkX3B0ciA9IChHaWZMU0QqKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihHaWZMU0QpKTsNCisgICAgaWYgKGdpZl9wdHItPmxzZF9wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgICAgICAgIGRlbGV0ZShnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDMyKGdpZl9wdHItPmxzZF9wdHIsIDAsIHNpemVvZihHaWZMU0QpKTsNCisgICAgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIgPSAoR2lmSW1hZ2VJbmZvKilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoR2lmSW1hZ2VJbmZvKSk7DQorICAgIGlmIChnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOw0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgICAgICAgIGRlbGV0ZShnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDMyKGdpZl9wdHItPmltYWdlX2luZm9fcHRyLCAwLCBzaXplb2YoR2lmSW1hZ2VJbmZvKSk7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KKyAgICBGWFNZU19tZW1jcHkzMihnaWZfcHRyLT5hcHBfaWRlbnRpZnksICJuZXRzY2FwZSIsIDgpOw0KKyAgICBGWFNZU19tZW1jcHkzMihnaWZfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sICIyLjAiLCAzKTsNCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgICBnaWZfcHRyLT5nY2VfcHRyID0gKEdpZkdDRSopRlhfQWxsb2MoRlhfQllURSwgc2l6ZW9mKEdpZkdDRSkpOw0KKyAgICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KKyAgICAgICAgZGVsZXRlKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHIpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgZ2lmX3B0ci0+cHRlX3B0ciA9IChHaWZQVEUqKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihHaWZQVEUpKTsNCisgICAgaWYgKGdpZl9wdHItPnB0ZV9wdHIgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5nY2VfcHRyKTsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5sc2RfcHRyKTsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aGVhZGVyX3B0cik7DQorICAgICAgICBkZWxldGUoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyKTsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihnaWZfcHRyLT5wdGVfcHRyLCAwLCBzaXplb2YoR2lmUFRFKSk7DQorICAgIGdpZl9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemUgPSAxMjsNCisjZW5kaWYNCisgICAgcmV0dXJuIGdpZl9wdHI7DQorfQ0KK3ZvaWQgX2dpZl9kZXN0cm95X2NvbXByZXNzKGdpZl9jb21wcmVzc19zdHJ1Y3RfcHAgZ2lmX3B0cl9wdHIpDQorew0KKyAgICBpZihnaWZfcHRyX3B0ciA9PSBOVUxMIHx8ICpnaWZfcHRyX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgZ2lmX2NvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIgPSAqZ2lmX3B0cl9wdHI7DQorICAgICpnaWZfcHRyX3B0ciA9IE5VTEw7DQorICAgIGlmKGdpZl9wdHItPmhlYWRlcl9wdHIgIT0gTlVMTCkJew0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgICAgfQ0KKyAgICBpZihnaWZfcHRyLT5sc2RfcHRyICE9IE5VTEwpCXsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7DQorICAgIH0NCisgICAgaWYoZ2lmX3B0ci0+Z2xvYmFsX3BhbCAhPSBOVUxMKQl7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmdsb2JhbF9wYWwpOw0KKyAgICB9DQorICAgIGlmKGdpZl9wdHItPmltYWdlX2luZm9fcHRyICE9IE5VTEwpCXsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICB9DQorICAgIGlmKGdpZl9wdHItPmxvY2FsX3BhbCAhPSBOVUxMKQl7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmxvY2FsX3BhbCk7DQorICAgIH0NCisgICAgaWYoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHI7DQorICAgIH0NCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICAgIGlmKGdpZl9wdHItPmFwcF9kYXRhICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+YXBwX2RhdGEpOw0KKyAgICB9DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisgICAgaWYoZ2lmX3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmdjZV9wdHIpOw0KKyAgICB9DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQorICAgIGlmKGdpZl9wdHItPmNtdF9kYXRhX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmNtdF9kYXRhX3B0cik7DQorICAgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgaWYoZ2lmX3B0ci0+cHRlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPnB0ZV9wdHIpOw0KKyAgICB9DQorI2VuZGlmDQorICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorfQ0KK3ZvaWQgX2dpZl9lcnJvcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9MUENTVFIgZXJyX21zZykNCit7DQorICAgIGlmKGdpZl9wdHIgIT0gTlVMTCAmJiBnaWZfcHRyLT5fZ2lmX2Vycm9yX2ZuICE9IE5VTEwpIHsNCisgICAgICAgIGdpZl9wdHItPl9naWZfZXJyb3JfZm4oZ2lmX3B0ciwgZXJyX21zZyk7DQorICAgIH0NCit9DQordm9pZCBfZ2lmX3dhcm4oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfTFBDU1RSIGVycl9tc2cpIHt9DQorRlhfSU5UMzIgX2dpZl9yZWFkX2hlYWRlcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKQ0KK3sNCisgICAgaWYoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICBBU1NFUlQoc2l6ZW9mKEdpZkhlYWRlcikgPT0gNik7DQorICAgIEdpZkhlYWRlciogZ2lmX2hlYWRlcl9wdHIgPSBOVUxMOw0KKyAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAoRlhfTFBCWVRFKikmZ2lmX2hlYWRlcl9wdHIsIDYpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGlmKEZYU1lTX3N0cm5jbXAoZ2lmX2hlYWRlcl9wdHItPnNpZ25hdHVyZSwgR0lGX1NJR05BVFVSRSwgMykgIT0gMCB8fA0KKyAgICAgICAgICAgIGdpZl9oZWFkZXJfcHRyLT52ZXJzaW9uWzBdICE9ICc4JyB8fA0KKyAgICAgICAgICAgIGdpZl9oZWFkZXJfcHRyLT52ZXJzaW9uWzJdICE9ICdhJykgew0KKyAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiTm90IEEgR2lmIEltYWdlIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBBU1NFUlQoc2l6ZW9mKEdpZkxTRCkgPT0gNyk7DQorICAgIEdpZkxTRCogZ2lmX2xzZF9wdHIgPSBOVUxMOw0KKyAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAoRlhfTFBCWVRFKikmZ2lmX2xzZF9wdHIsIDcpID09IE5VTEwpIHsNCisgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBpZigoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+Z2xvYmFsX3BhbCkgew0KKyAgICAgICAgZ2lmX3B0ci0+Z2xvYmFsX3BhbF9udW0gPSAyIDw8ICgoR2lmR0YqKSZnaWZfbHNkX3B0ci0+Z2xvYmFsX2ZsYWcpLT5wYWxfYml0czsNCisgICAgICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7DQorICAgICAgICBGWF9JTlQzMiBnbG9iYWxfcGFsX3NpemUgPSBnaWZfcHRyLT5nbG9iYWxfcGFsX251bSAqIDM7DQorICAgICAgICBGWF9MUEJZVEUgZ2xvYmFsX3BhbF9wdHIgPSBOVUxMOw0KKyAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZnbG9iYWxfcGFsX3B0ciwgZ2xvYmFsX3BhbF9zaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIGdpZl9wdHItPmdsb2JhbF9zb3J0X2ZsYWcgPSAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+c29ydF9mbGFnOw0KKyAgICAgICAgZ2lmX3B0ci0+Z2xvYmFsX2NvbG9yX3Jlc29sdXRpb24gPSAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+Y29sb3JfcmVzb2x1dGlvbjsNCisgICAgICAgIGlmKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyKTsNCisgICAgICAgIH0NCisgICAgICAgIGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyID0gTlVMTDsNCisgICAgICAgIGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyID0gKEdpZlBhbGV0dGUqKUZYX0FsbG9jKEZYX0JZVEUsIGdsb2JhbF9wYWxfc2l6ZSk7DQorICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyLCBnaWZfcHRyKTsNCisgICAgICAgIEZYU1lTX21lbWNweTMyKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3B0ciwgZ2xvYmFsX3BhbF9zaXplKTsNCisgICAgfQ0KKyAgICBnaWZfcHRyLT53aWR0aCA9IChpbnQpX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX2xzZF9wdHItPndpZHRoKTsNCisgICAgZ2lmX3B0ci0+aGVpZ2h0ID0gKGludClfR2V0V29yZF9MU0JGaXJzdCgoRlhfTFBCWVRFKSZnaWZfbHNkX3B0ci0+aGVpZ2h0KTsNCisgICAgZ2lmX3B0ci0+YmNfaW5kZXggPSBnaWZfbHNkX3B0ci0+YmNfaW5kZXg7DQorICAgIGdpZl9wdHItPnBpeGVsX2FzcGVjdCA9IGdpZl9sc2RfcHRyLT5waXhlbF9hc3BlY3Q7DQorICAgIHJldHVybiAxOw0KK30NCitGWF9JTlQzMiBfZ2lmX2dldF9mcmFtZShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKQ0KK3sNCisgICAgaWYoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiByZXQgPSAxOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgc3dpdGNoKGdpZl9wdHItPmRlY29kZV9zdGF0dXMpIHsNCisgICAgICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19UQUlMOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19TSUc6IHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBzaWdfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZzaWdfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKnNpZ19wdHIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdJRl9TSUdfRVhURU5TSU9OOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdJRl9TSUdfSU1BR0U6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19JTkZPKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHSUZfU0lHX1RSQUlMRVI6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2lmX3B0ci0+YXZhaWxfaW4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIGhhcyBub25fc3RhbmRhcmQgVGFnISIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIERvZXNuJ3QgaGF2ZSBUcmFpbGVyIFRhZyEiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFQ6IHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBleHRfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZleHRfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKmV4dF9wdHIpIHsNCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHSUZfQkxPQ0tfQUU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0VYVF9BRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0NFOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfQ0UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0dDRToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX0dDRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX1BURToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX1BURSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHN0YXR1cyA9IEdJRl9EX1NUQVRVU19FWFRfVU5FOw0KKyNpZm5kZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCpleHRfcHRyID09IEdJRl9CTE9DS19QVEUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBHSUZfRF9TVEFUVVNfRVhUX1BURTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgc3RhdHVzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19JTUdfSU5GTzogew0KKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gX2dpZl9kZWNvZGVfaW1hZ2VfaW5mbyhnaWZfcHRyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKHJldCAhPSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEE6IHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkYXRhX3NpemVfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkYXRhX3B0ciA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19EQVRBKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1NJRyk7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIHJldCA9IF9naWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfcHRyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKHJldCAhPSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDE7DQorfQ0KK3ZvaWQgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEdpZkdDRSoqIGdjZV9wdHJfcHRyKQ0KK3sNCisgICAgKmdjZV9wdHJfcHRyID0gTlVMTDsNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgICBpZihnaWZfcHRyLT5nY2VfcHRyICE9IE5VTEwgJiYgZ2NlX3B0cl9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgKmdjZV9wdHJfcHRyID0gZ2lmX3B0ci0+Z2NlX3B0cjsNCisgICAgICAgIGdpZl9wdHItPmdjZV9wdHIgPSBOVUxMOw0KKyAgICB9DQorI2VuZGlmDQorfQ0KK0ZYX0lOVDMyIF9naWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKQ0KK3sNCisgICAgRlhfTFBCWVRFIGRhdGFfc2l6ZV9wdHIgPSBOVUxMOw0KKyAgICBGWF9MUEJZVEUgZGF0YV9wdHIgPSBOVUxMOw0KKyAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICBzd2l0Y2goZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cykgew0KKyNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCisgICAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9BRTogew0KKyAgICAgICAgICAgICAgICBBU1NFUlQoc2l6ZW9mKEdpZkFFKSA9PSAxMik7DQorICAgICAgICAgICAgICAgIEdpZkFFKiBnaWZfYWVfcHRyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKEZYX0xQQllURSopJmdpZl9hZV9wdHIsIDEyKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBnaWZfYWVfZGF0YV9zdHI7DQorICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd2hpbGUoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRhdGFfc2l6ZSA9ICpkYXRhX3NpemVfcHRyOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBnaWZfYWVfZGF0YV9zdHIgKz0gQ0ZYX0J5dGVTdHJpbmcoKEZYX0xQQ0JZVEUpZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCBnaWZfYWVfcHRyLT5hcHBfaWRlbnRpZnksIDgpOw0KKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihnaWZfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sIGdpZl9hZV9wdHItPmFwcF9hdXRoZW50aWNhdGlvbiwgMyk7DQorICAgICAgICAgICAgICAgIGdpZl9wdHItPmFwcF9kYXRhX3NpemUgPSBnaWZfYWVfZGF0YV9zdHIuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgIGlmKGdpZl9wdHItPmFwcF9kYXRhICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+YXBwX2RhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+YXBwX2RhdGEgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGdpZl9wdHItPmFwcF9kYXRhID0gRlhfQWxsb2MoRlhfQllURSwgZ2lmX3B0ci0+YXBwX2RhdGFfc2l6ZSk7DQorICAgICAgICAgICAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+YXBwX2RhdGEsIGdpZl9wdHIpOw0KKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihnaWZfcHRyLT5hcHBfZGF0YSwgRlhfTFBDQllURShnaWZfYWVfZGF0YV9zdHIpLCBnaWZfcHRyLT5hcHBfZGF0YV9zaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQorICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFRfQ0U6IHsNCisgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBnaWZfcHRyLT5jbXRfZGF0YV9wdHItPkVtcHR5KCk7DQorICAgICAgICAgICAgICAgIHdoaWxlKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQllURSBkYXRhX3NpemUgPSAqZGF0YV9zaXplX3B0cjsNCisgICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpID09IE5VTEwgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKihnaWZfcHRyLT5jbXRfZGF0YV9wdHIpICs9IENGWF9CeXRlU3RyaW5nKChGWF9MUENTVFIpZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFRfUFRFOiB7DQorICAgICAgICAgICAgICAgIEFTU0VSVChzaXplb2YoR2lmUFRFKSA9PSAxMyk7DQorICAgICAgICAgICAgICAgIEdpZlBURSogZ2lmX3B0ZV9wdHIgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAoRlhfTFBCWVRFKikmZ2lmX3B0ZV9wdHIsIDEzKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBHaWZQbGFpblRleHQqIGdpZl9wdF9wdHIgPSBGWF9BbGxvYyhHaWZQbGFpblRleHQsIDEpOw0KKyAgICAgICAgICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdF9wdHIsIGdpZl9wdHIpOw0KKyAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihnaWZfcHRfcHRyLCAwLCBzaXplb2YoR2lmUGxhaW5UZXh0KSk7DQorICAgICAgICAgICAgICAgIF9naWZfdGFrZW92ZXJfZ2NlX3B0cihnaWZfcHRyLCAmZ2lmX3B0X3B0ci0+Z2NlX3B0cik7DQorICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHIgPSAoR2lmUFRFKilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoR2lmUFRFKSk7DQorICAgICAgICAgICAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0X3B0ci0+cHRlX3B0ciwgZ2lmX3B0cik7DQorICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnN0cmluZ19wdHIgPSBGWF9ORVcgQ0ZYX0J5dGVTdHJpbmc7DQorICAgICAgICAgICAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0X3B0ci0+c3RyaW5nX3B0ciwgZ2lmX3B0cik7DQorICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemUgPSBnaWZfcHRlX3B0ci0+YmxvY2tfc2l6ZTsNCisgICAgICAgICAgICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF9sZWZ0ID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX3B0ZV9wdHItPmdyaWRfbGVmdCk7DQorICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfdG9wID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX3B0ZV9wdHItPmdyaWRfdG9wKTsNCisgICAgICAgICAgICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCA9IF9HZXRXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmdpZl9wdGVfcHRyLT5ncmlkX3dpZHRoKTsNCisgICAgICAgICAgICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF9oZWlnaHQgPSBfR2V0V29yZF9MU0JGaXJzdCgoRlhfTFBCWVRFKSZnaWZfcHRlX3B0ci0+Z3JpZF9oZWlnaHQpOw0KKyAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5jaGFyX3dpZHRoID0gZ2lmX3B0ZV9wdHItPmNoYXJfd2lkdGg7DQorICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmNoYXJfaGVpZ2h0ID0gZ2lmX3B0ZV9wdHItPmNoYXJfaGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5mY19pbmRleCA9IGdpZl9wdGVfcHRyLT5mY19pbmRleDsNCisgICAgICAgICAgICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+YmNfaW5kZXggPSBnaWZfcHRlX3B0ci0+YmNfaW5kZXg7DQorICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoZ2lmX3B0X3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZ2lmX3B0X3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0ci0+Z2NlX3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdpZl9wdF9wdHItPnB0ZV9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPnB0ZV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdpZl9wdF9wdHItPnN0cmluZ19wdHI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0cik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3aGlsZSgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgZGF0YV9zaXplID0gKmRhdGFfc2l6ZV9wdHI7DQorICAgICAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfcHRfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZ2lmX3B0X3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdpZl9wdF9wdHItPnB0ZV9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyLT5wdGVfcHRyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBnaWZfcHRfcHRyLT5zdHJpbmdfcHRyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgKihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyKSArPSBDRlhfQnl0ZVN0cmluZygoRlhfTFBDU1RSKWRhdGFfcHRyLCBkYXRhX3NpemUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5BZGQoZ2lmX3B0X3B0cik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFRfR0NFOiB7DQorICAgICAgICAgICAgICAgIEFTU0VSVChzaXplb2YoR2lmR0NFKSA9PSA1KTsNCisgICAgICAgICAgICAgICAgR2lmR0NFKiBnaWZfZ2NlX3B0ciA9IE5VTEw7DQorICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsIChGWF9MUEJZVEUqKSZnaWZfZ2NlX3B0ciwgNikgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoZ2lmX3B0ci0+Z2NlX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5nY2VfcHRyID0gKEdpZkdDRSopRlhfQWxsb2MoRlhfQllURSwgc2l6ZW9mKEdpZkdDRSkpOw0KKyAgICAgICAgICAgICAgICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRyLT5nY2VfcHRyLCBnaWZfcHRyKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT5ibG9ja19zaXplID0gZ2lmX2djZV9wdHItPmJsb2NrX3NpemU7DQorICAgICAgICAgICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gZ2lmX2djZV9wdHItPmdjZV9mbGFnOw0KKyAgICAgICAgICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT5kZWxheV90aW1lID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX2djZV9wdHItPmRlbGF5X3RpbWUpOw0KKyAgICAgICAgICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleCA9IGdpZl9nY2VfcHRyLT50cmFuc19pbmRleDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorI2VuZGlmDQorICAgICAgICBkZWZhdWx0OiB7DQorI2lmbmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KKyAgICAgICAgICAgICAgICBpZihnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID09IEdJRl9EX1NUQVRVU19FWFRfUFRFKSB7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisgICAgICAgICAgICAgICAgICAgIGlmKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ciA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdoaWxlKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1NJRyk7DQorICAgIHJldHVybiAxOw0KK30NCitGWF9JTlQzMiBfZ2lmX2RlY29kZV9pbWFnZV9pbmZvKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpDQorew0KKyAgICBpZihnaWZfcHRyLT53aWR0aCA9PSAwIHx8IGdpZl9wdHItPmhlaWdodCA9PSAwKSB7DQorICAgICAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJObyBJbWFnZSBIZWFkZXIgSW5mbyIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfRFdPUkQgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgICAgQVNTRVJUKHNpemVvZihHaWZJbWFnZUluZm8pID09IDkpOw0KKyAgICBHaWZJbWFnZUluZm8qIGdpZl9pbWdfaW5mb19wdHIgPSBOVUxMOw0KKyAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAoRlhfTFBCWVRFKikmZ2lmX2ltZ19pbmZvX3B0ciwgOSkgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIgPSAoR2lmSW1hZ2UqKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihHaWZJbWFnZSkpOw0KKyAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9pbWFnZV9wdHIsIGdpZl9wdHIpOw0KKyAgICBGWFNZU19tZW1zZXQzMihnaWZfaW1hZ2VfcHRyLCAwLCBzaXplb2YoR2lmSW1hZ2UpKTsNCisgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIgPSAoR2lmSW1hZ2VJbmZvKilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoR2lmSW1hZ2VJbmZvKSk7DQorICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIsIGdpZl9wdHIpOw0KKyAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCA9IF9HZXRXb3JkX0xTQkZpcnN0KChGWF9MUEJZVEUpJmdpZl9pbWdfaW5mb19wdHItPmxlZnQpOw0KKyAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX2ltZ19pbmZvX3B0ci0+dG9wKTsNCisgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX2ltZ19pbmZvX3B0ci0+d2lkdGgpOw0KKyAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0ID0gX0dldFdvcmRfTFNCRmlyc3QoKEZYX0xQQllURSkmZ2lmX2ltZ19pbmZvX3B0ci0+aGVpZ2h0KTsNCisgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcgPSBnaWZfaW1nX2luZm9fcHRyLT5sb2NhbF9mbGFnOw0KKyAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCArIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT53aWR0aCA+IGdpZl9wdHItPndpZHRoIHx8DQorICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCArIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQgPiBnaWZfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHIpOw0KKyAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiSW1hZ2UgRGF0YSBPdXQgT2YgTFNELCBUaGUgRmlsZSBNYXkgQmUgQ29ycnVwdCIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgR2lmTEYqIGdpZl9pbWdfaW5mb19sZl9wdHIgPSAoR2lmTEYqKSZnaWZfaW1nX2luZm9fcHRyLT5sb2NhbF9mbGFnOw0KKyAgICBpZihnaWZfaW1nX2luZm9fbGZfcHRyLT5sb2NhbF9wYWwpIHsNCisgICAgICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7DQorICAgICAgICBGWF9JTlQzMiBsb2NfcGFsX3NpemUgPSAoMiA8PCBnaWZfaW1nX2luZm9fbGZfcHRyLT5wYWxfYml0cykgKiAzOw0KKyAgICAgICAgRlhfTFBCWVRFIGxvY19wYWxfcHRyID0gTlVMTDsNCisgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZsb2NfcGFsX3B0ciwgbG9jX3BhbF9zaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyKTsNCisgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIGdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIgPSAoR2lmUGFsZXR0ZSopZ2lmX3B0ci0+X2dpZl9hc2tfYnVmX2Zvcl9wYWxfZm4oZ2lmX3B0ciwgbG9jX3BhbF9zaXplKTsNCisgICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKChGWF9MUEJZVEUpZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciwgbG9jX3BhbF9wdHIsIGxvY19wYWxfc2l6ZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfTFBCWVRFIGNvZGVfc2l6ZV9wdHIgPSBOVUxMOw0KKyAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmY29kZV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0cik7DQorICAgICAgICB9DQorICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyKTsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2NvZGVfc2l6ZSA9ICpjb2RlX3NpemVfcHRyOw0KKyAgICBnaWZfcHRyLT5fZ2lmX3JlY29yZF9jdXJyZW50X3Bvc2l0aW9uX2ZuKGdpZl9wdHIsICZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9kYXRhX3Bvcyk7DQorICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zICs9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgICAgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9wdHIsICZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyKTsNCisgICAgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5BZGQoZ2lmX2ltYWdlX3B0cik7DQorICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19EQVRBKTsNCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZYX0lOVDMyIF9naWZfbG9hZF9mcmFtZShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9JTlQzMiBmcmFtZV9udW0pDQorew0KKyAgICBpZihnaWZfcHRyID09IE5VTEwgfHwNCisgICAgICAgICAgICBmcmFtZV9udW0gPCAwIHx8DQorICAgICAgICAgICAgZnJhbWVfbnVtID49IGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0U2l6ZSgpDQorICAgICAgKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9MUEJZVEUgZGF0YV9zaXplX3B0ciA9IE5VTEw7DQorICAgIEZYX0xQQllURSBkYXRhX3B0ciA9IE5VTEw7DQorICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICAgIEdpZkltYWdlKiBnaWZfaW1hZ2VfcHRyID0gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRBdChmcmFtZV9udW0pOw0KKyAgICBGWF9EV09SRCBnaWZfaW1nX3Jvd19ieXRlcyA9IGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT53aWR0aDsNCisgICAgaWYoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBHSUZfRF9TVEFUVVNfVEFJTCkgew0KKyAgICAgICAgaWYoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zikgew0KKyAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gRlhfQWxsb2MoRlhfQllURSwgZ2lmX2ltZ19yb3dfYnl0ZXMpOw0KKyAgICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmLCBnaWZfcHRyKTsNCisgICAgICAgIEdpZkdDRSogZ2lmX2ltZ19nY2VfcHRyID0gZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0cjsNCisgICAgICAgIEZYX0lOVDMyIGxvY19wYWxfbnVtID0gKChHaWZMRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnKS0+bG9jYWxfcGFsID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPDwgKChHaWZMRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnKS0+cGFsX2JpdHMpIDogMDsNCisgICAgICAgIGdpZl9wdHItPmF2YWlsX2luID0gMDsNCisgICAgICAgIGlmKGdpZl9pbWdfZ2NlX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgRlhfQk9PTCBiUmVzID0gZ2lmX3B0ci0+X2dpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uX2ZuKGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jX3BhbF9udW0sIGdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgLTEsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0JPT0wpKChHaWZMRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnKS0+aW50ZXJsYWNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICBpZighYlJlcykgew0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgICAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiRXJyb3IgUmVhZCBSZWNvcmQgUG9zaXRpb24gRGF0YSIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0JPT0wgYlJlcyA9IGdpZl9wdHItPl9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbl9mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9kYXRhX3BvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19wYWxfbnVtLCBnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9JTlQzMilnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5kZWxheV90aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9CT09MKSgoR2lmQ0VGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+Z2NlX2ZsYWcpLT51c2VyX2lucHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR2lmQ0VGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+Z2NlX2ZsYWcpLT50cmFuc3BhcmVuY3kgPw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9JTlQzMilnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT50cmFuc19pbmRleCA6IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9JTlQzMikoKEdpZkNFRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2djZV9wdHItPmdjZV9mbGFnKS0+ZGlzcG9zYWxfbWV0aG9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9CT09MKSgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZyktPmludGVybGFjZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQorICAgICAgICAgICAgaWYoIWJSZXMpIHsNCisgICAgICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQorICAgICAgICAgICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkVycm9yIFJlYWQgUmVjb3JkIFBvc2l0aW9uIERhdGEiKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyID09IE5VTEwpIHsNCisgICAgICAgICAgICBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHIgPSBGWF9ORVcgQ0dpZkxaV0RlY29kZXIoZ2lmX3B0ci0+ZXJyX3B0cik7DQorICAgICAgICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHIsIGdpZl9wdHIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyLT5Jbml0VGFibGUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfY29kZV9zaXplKTsNCisgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ID0gMDsNCisgICAgICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9IDA7DQorICAgICAgICBnaWZfcHRyLT5pbWdfcGFzc19udW0gPSAwOw0KKyAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSA9IDA7DQorICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQorICAgIH0NCisgICAgQ0dpZkxaV0RlY29kZXIqIGltZ19kZWNvZGVyX3B0ciA9IGdpZl9wdHItPmltZ19kZWNvZGVyX3B0cjsNCisgICAgaWYoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpIHsNCisgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBpZigqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCisgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbWdfZGVjb2Rlcl9wdHItPklucHV0KGRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cik7DQorICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KKyAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ICs9IGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZTsNCisgICAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUgPSBnaWZfaW1nX3Jvd19ieXRlcyAtIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0Ow0KKyAgICAgICAgICAgIEZYX0lOVDMyIHJldCA9IGltZ19kZWNvZGVyX3B0ci0+RGVjb2RlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgKyBnaWZfcHRyLT5pbWdfcm93X29mZnNldCwgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsNCisgICAgICAgICAgICBpZihyZXQgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAocmV0ICE9IDApIHsNCisgICAgICAgICAgICAgICAgaWYocmV0ID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYocmV0ID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChpbWdfZGVjb2Rlcl9wdHItPkdldEF2YWlsSW5wdXQoKSA9PSAwKTsNCisgICAgICAgICAgICAgICAgICAgIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICAgICAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltZ19kZWNvZGVyX3B0ci0+SW5wdXQoZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQgKz0gZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9IGdpZl9pbWdfcm93X2J5dGVzIC0gZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW1nX2RlY29kZXJfcHRyLT5EZWNvZGUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LCBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKHJldCA9PSAzKSB7DQorICAgICAgICAgICAgICAgICAgICBpZigoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpLT5pbnRlcmxhY2UpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5fZ2lmX2dldF9yb3dfZm4oZ2lmX3B0ciwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSArPSBzX2dpZl9pbnRlcmxhY2Vfc3RlcFtnaWZfcHRyLT5pbWdfcGFzc19udW1dOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPj0gKEZYX0lOVDMyKWdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPSBzX2dpZl9pbnRlcmxhY2Vfc3RlcFtnaWZfcHRyLT5pbWdfcGFzc19udW1dIC8gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtKyssIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gZ2lmX2ltZ19yb3dfYnl0ZXM7DQorICAgICAgICAgICAgICAgICAgICByZXQgPSBpbWdfZGVjb2Rlcl9wdHItPkRlY29kZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmICsgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQsIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYocmV0ID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiRGVjb2RlIEltYWdlIERhdGEgRXJyb3IiKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfVEFJTCk7DQorICAgIH0NCisgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiRGVjb2RlIEltYWdlIERhdGEgRXJyb3IiKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9JTlQzMiBzdGF0dXMpDQorew0KKyAgICBnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID0gc3RhdHVzOw0KKyAgICBnaWZfcHRyLT5uZXh0X2luICs9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgICAgZ2lmX3B0ci0+YXZhaWxfaW4gLT0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICBnaWZfcHRyLT5za2lwX3NpemUgPSAwOw0KK30NCitGWF9MUEJZVEUgX2dpZl9yZWFkX2RhdGEoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfTFBCWVRFKiBkZXNfYnVmX3BwLCBGWF9EV09SRCBkYXRhX3NpemUpDQorew0KKyAgICBpZihnaWZfcHRyID09IE5VTEwgfHwNCisgICAgICAgICAgICBnaWZfcHRyLT5hdmFpbF9pbiA8IGdpZl9wdHItPnNraXBfc2l6ZSArIGRhdGFfc2l6ZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgKmRlc19idWZfcHAgPSBnaWZfcHRyLT5uZXh0X2luICsgZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICBnaWZfcHRyLT5za2lwX3NpemUgKz0gZGF0YV9zaXplOw0KKyAgICByZXR1cm4gKmRlc19idWZfcHA7DQorfQ0KK3ZvaWQgX2dpZl9pbnB1dF9idWZmZXIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfTFBCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KK3sNCisgICAgZ2lmX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7DQorICAgIGdpZl9wdHItPmF2YWlsX2luID0gc3JjX3NpemU7DQorICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IDA7DQorfQ0KK0ZYX0RXT1JEIF9naWZfZ2V0X2F2YWlsX2lucHV0KGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQllURSogYXZpYWxfYnVmX3B0cikNCit7DQorICAgIGlmKGF2aWFsX2J1Zl9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgKmF2aWFsX2J1Zl9wdHIgPSBOVUxMOw0KKyAgICAgICAgaWYoZ2lmX3B0ci0+YXZhaWxfaW4gPiAwKSB7DQorICAgICAgICAgICAgKmF2aWFsX2J1Zl9wdHIgPSBnaWZfcHRyLT5uZXh0X2luOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBnaWZfcHRyLT5hdmFpbF9pbjsNCit9DQorRlhfSU5UMzIgX2dpZl9nZXRfZnJhbWVfbnVtKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpDQorew0KKyAgICByZXR1cm4gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRTaXplKCk7DQorfQ0KK3N0YXRpYyBGWF9CT09MIF9naWZfd3JpdGVfaGVhZGVyKCBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiApDQorew0KKyAgICBpZiAoZ2lmX3B0ci0+Y3VyX29mZnNldCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgZHN0X2xlbiA9IHNpemVvZihHaWZIZWFkZXIpICsgc2l6ZW9mKEdpZkxTRCkgKyBzaXplb2YoR2lmR0YpOw0KKyAgICBkc3RfYnVmID0gRlhfQWxsb2NOTChGWF9CWVRFLCBkc3RfbGVuKTsNCisgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkJew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldDMyKGRzdF9idWYsIDAsIGRzdF9sZW4pOw0KKyAgICBGWFNZU19tZW1jcHkzMihkc3RfYnVmLCBnaWZfcHRyLT5oZWFkZXJfcHRyLCBzaXplb2YoR2lmSGVhZGVyKSk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gc2l6ZW9mKEdpZkhlYWRlcik7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5sc2RfcHRyLT53aWR0aCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPmxzZF9wdHItPmhlaWdodCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+bHNkX3B0ci0+Z2xvYmFsX2ZsYWc7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmxzZF9wdHItPmJjX2luZGV4Ow0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5sc2RfcHRyLT5waXhlbF9hc3BlY3Q7DQorICAgIGlmIChnaWZfcHRyLT5nbG9iYWxfcGFsKSB7DQorICAgICAgICBGWF9XT1JEIHNpemUgPSBzaXplb2YoR2lmUGFsZXR0ZSkgKiBnaWZfcHRyLT5ncGFsX251bTsNCisgICAgICAgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0ICsgc2l6ZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19tZW1jcHkzMigmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+Z2xvYmFsX3BhbCwgc2l6ZSk7DQorICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IHNpemU7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgaW50ZXJsYWNlX2J1ZihGWF9MUENCWVRFIGJ1ZiwgRlhfRFdPUkQgcGl0Y2gsIEZYX0RXT1JEIGhlaWdodCkNCit7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0xQQllURT4gcGFzc1s0XTsNCisgICAgaW50IGksIGo7DQorICAgIEZYX0RXT1JEIHJvdzsNCisgICAgcm93ID0gMDsNCisgICAgRlhfTFBCWVRFIHRlbXA7DQorICAgIHdoaWxlIChyb3cgPCBoZWlnaHQpIHsNCisgICAgICAgIGlmIChyb3cgJSA4ID09IDApIHsNCisgICAgICAgICAgICBqID0gMDsNCisgICAgICAgIH0gZWxzZSBpZiAocm93ICUgNCA9PSAwKSB7DQorICAgICAgICAgICAgaiA9IDE7DQorICAgICAgICB9IGVsc2UgaWYgKHJvdyAlIDIgPT0gMCkgew0KKyAgICAgICAgICAgIGogPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBqID0gMzsNCisgICAgICAgIH0NCisgICAgICAgIHRlbXAgPSBGWF9BbGxvYyhGWF9CWVRFLCBwaXRjaCk7DQorICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhTWVNfbWVtY3B5MzIodGVtcCwgJmJ1ZltwaXRjaCAqIHJvd10sIHBpdGNoKTsNCisgICAgICAgIHBhc3Nbal0uQWRkKHRlbXApOw0KKyAgICAgICAgcm93ICsrOw0KKyAgICB9DQorICAgIGZvciAoaSA9IDAsIHJvdyA9IDA7IGkgPCA0OyBpKyspIHsNCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXNzW2ldLkdldFNpemUoKTsgaisrLCByb3crKykgew0KKyAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKChGWF9MUEJZVEUpJmJ1ZltwaXRjaCAqIHJvd10sIHBhc3NbaV0uR2V0QXQoaiksIHBpdGNoKTsNCisgICAgICAgICAgICBGWF9GcmVlKHBhc3NbaV0uR2V0QXQoaikpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIF9naWZfd3JpdGVfYmxvY2tfZGF0YShGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19sZW4sIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4sIEZYX0RXT1JEJiBkc3Rfb2Zmc2V0KQ0KK3sNCisgICAgRlhfRFdPUkQgc3JjX29mZnNldCA9IDA7DQorICAgIHdoaWxlIChzcmNfbGVuID4gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICAgIGRzdF9idWZbZHN0X29mZnNldCsrXSA9IEdJRl9EQVRBX0JMT0NLOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5MzIoJmRzdF9idWZbZHN0X29mZnNldF0sICZzcmNfYnVmW3NyY19vZmZzZXRdLCBHSUZfREFUQV9CTE9DSyk7DQorICAgICAgICBkc3Rfb2Zmc2V0ICs9IEdJRl9EQVRBX0JMT0NLOw0KKyAgICAgICAgc3JjX29mZnNldCArPSBHSUZfREFUQV9CTE9DSzsNCisgICAgICAgIHNyY19sZW4gLT0gR0lGX0RBVEFfQkxPQ0s7DQorICAgIH0NCisgICAgZHN0X2J1Zltkc3Rfb2Zmc2V0KytdID0gKEZYX0JZVEUpc3JjX2xlbjsNCisgICAgRlhTWVNfbWVtY3B5MzIoJmRzdF9idWZbZHN0X29mZnNldF0sICZzcmNfYnVmW3NyY19vZmZzZXRdLCBzcmNfbGVuKTsNCisgICAgZHN0X29mZnNldCArPSBzcmNfbGVuOw0KK30NCitzdGF0aWMgRlhfQk9PTCBfZ2lmX3dyaXRlX2RhdGEoIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuICkNCit7DQorICAgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0ICsgR0lGX0RBVEFfQkxPQ0spKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgICBpZiAoRlhTWVNfbWVtY21wMzIoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpID09IDApIHsNCisgICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOw0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0dDRTsNCisgICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmJsb2NrX3NpemUgPSA0Ow0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+Z2NlX3B0ci0+YmxvY2tfc2l6ZTsNCisgICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gMDsNCisgICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnOw0KKyAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+ZGVsYXlfdGltZSA9IDEwOw0KKyAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUpOw0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+dHJhbnNfaW5kZXggPSAwOw0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+Z2NlX3B0ci0+dHJhbnNfaW5kZXg7DQorICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOw0KKyAgICB9DQorI2VuZGlmDQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfSU1BR0U7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPmltYWdlX2luZm9fcHRyLT50b3ApOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGgpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0KTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICBHaWZMRiYgbGYgPSAoR2lmTEYmKWdpZl9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnOw0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZzsNCisgICAgaWYgKGdpZl9wdHItPmxvY2FsX3BhbCkgew0KKyAgICAgICAgRlhfRFdPUkQgcGFsX3NpemUgPSBzaXplb2YoR2lmUGFsZXR0ZSkgKiBnaWZfcHRyLT5scGFsX251bTsNCisgICAgICAgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBwYWxfc2l6ZSArIGdpZl9wdHItPmN1cl9vZmZzZXQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhTWVNfbWVtY3B5MzIoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmxvY2FsX3BhbCwgcGFsX3NpemUpOw0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBwYWxfc2l6ZTsNCisgICAgfQ0KKyAgICBpZiAobGYuaW50ZXJsYWNlKSB7DQorICAgICAgICBpbnRlcmxhY2VfYnVmKGdpZl9wdHItPnNyY19idWYsIGdpZl9wdHItPnNyY19waXRjaCwgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCk7DQorICAgIH0NCisgICAgRlhfQllURSBjb2RlX2JpdCA9IGxmLnBhbF9iaXRzOw0KKyAgICBpZiAobGYubG9jYWxfcGFsID09IDApIHsNCisgICAgICAgIEdpZkdGJiBnZiA9IChHaWZHRiYpZ2lmX3B0ci0+bHNkX3B0ci0+Z2xvYmFsX2ZsYWc7DQorICAgICAgICBjb2RlX2JpdCA9IGdmLnBhbF9iaXRzOw0KKyAgICB9DQorICAgIGdpZl9wdHItPmltZ19lbmNvZGVyX3B0ci0+U3RhcnQoY29kZV9iaXQsIGdpZl9wdHItPnNyY19idWYsIGRzdF9idWYsIGdpZl9wdHItPmN1cl9vZmZzZXQpOw0KKyAgICBGWF9EV09SRCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2lmX3B0ci0+c3JjX3JvdzsgaSsrKSB7DQorICAgICAgICBpZiAoIWdpZl9wdHItPmltZ19lbmNvZGVyX3B0ci0+RW5jb2RlKCZnaWZfcHRyLT5zcmNfYnVmW2kgKiBnaWZfcHRyLT5zcmNfcGl0Y2hdLCBnaWZfcHRyLT5zcmNfd2lkdGggKiAoY29kZV9iaXQgKyAxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5GaW5pc2goZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCk7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQorICAgIGlmIChGWFNZU19tZW1jbXAzMihnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJiBnaWZfcHRyLT5jbXRfZGF0YV9wdHIpIHsNCisgICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOw0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0NFOw0KKyAgICAgICAgX2dpZl93cml0ZV9ibG9ja19kYXRhKGdpZl9wdHItPmNtdF9kYXRhX3B0ciwgZ2lmX3B0ci0+Y210X2RhdGFfbGVuLCBkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsNCisgICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7DQorICAgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgaWYgKEZYU1lTX21lbWNtcDMyKGdpZl9wdHItPmhlYWRlcl9wdHItPnZlcnNpb24sICI4OWEiLCAzKSA9PSAwICYmIGdpZl9wdHItPnB0ZV9kYXRhX3B0cikgew0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19FWFRFTlNJT047DQorICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfQkxPQ0tfUFRFOw0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+cHRlX3B0ci0+YmxvY2tfc2l6ZTsNCisgICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX2xlZnQpOw0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPnB0ZV9wdHItPmdyaWRfdG9wKTsNCisgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX3dpZHRoKTsNCisgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX2hlaWdodCk7DQorICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgICAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+Y2hhcl93aWR0aCk7DQorICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgICAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+Y2hhcl9oZWlnaHQpOw0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPnB0ZV9wdHItPmZjX2luZGV4KTsNCisgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5iY19pbmRleCk7DQorICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgICAgICBfZ2lmX3dyaXRlX2Jsb2NrX2RhdGEoZ2lmX3B0ci0+cHRlX2RhdGFfcHRyLCBnaWZfcHRyLT5wdGVfZGF0YV9sZW4sIGRzdF9idWYsIGRzdF9sZW4sIGdpZl9wdHItPmN1cl9vZmZzZXQpOw0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBnaWZfcHRyLT5wdGVfZGF0YV9sZW47DQorICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOw0KKyAgICB9DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KKyAgICBpZiAoRlhTWVNfbWVtY21wMzIoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpID09IDAgJiYgZ2lmX3B0ci0+YXBwX2RhdGEpIHsNCisgICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOw0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0FFOw0KKyAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMTE7DQorICAgICAgICBGWFNZU19tZW1jcHkzMigmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCA4KTsNCisgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gODsNCisgICAgICAgIEZYU1lTX21lbWNweTMyKCZkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXRdLCBnaWZfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sIDgpOw0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAzOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5MzIoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmFwcF9kYXRhLCBnaWZfcHRyLT5hcHBfZGF0YV9zaXplKTsNCisgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gZ2lmX3B0ci0+YXBwX2RhdGFfc2l6ZTsNCisgICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7DQorICAgIH0NCisjZW5kaWYNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19UUkFJTEVSOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBfZ2lmX2VuY29kZSggZ2lmX2NvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4gKQ0KK3sNCisgICAgaWYgKCFfZ2lmX3dyaXRlX2hlYWRlcihnaWZfcHRyLCBkc3RfYnVmLCBkc3RfbGVuKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGN1cl9vZmZzZXQgPSBnaWZfcHRyLT5jdXJfb2Zmc2V0Ow0KKyAgICBGWF9CT09MIHJlcyA9IFRSVUU7DQorICAgIGlmIChnaWZfcHRyLT5mcmFtZXMpIHsNCisgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQtLTsNCisgICAgfQ0KKyAgICBpZiAoIV9naWZfd3JpdGVfZGF0YShnaWZfcHRyLCBkc3RfYnVmLCBkc3RfbGVuKSkgew0KKyAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCA9IGN1cl9vZmZzZXQ7DQorICAgICAgICByZXMgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBkc3RfbGVuID0gZ2lmX3B0ci0+Y3VyX29mZnNldDsNCisgICAgZHN0X2J1Zltkc3RfbGVuIC0gMV0gPSBHSUZfU0lHX1RSQUlMRVI7DQorICAgIGlmIChyZXMpIHsNCisgICAgICAgIGdpZl9wdHItPmZyYW1lcysrOw0KKyAgICB9DQorICAgIHJldHVybiByZXM7DQorfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDk5YTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oCkBAIC0wLDAgKzEsMzA3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0JBU0lDX0hfDQorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCINCisjZW5kaWYNCitleHRlcm4gRlhfV09SRCBfR2V0V29yZF9MU0JGaXJzdChGWF9MUEJZVEUgcCk7DQorZXh0ZXJuIHZvaWQgX1NldFdvcmRfTFNCRmlyc3QoRlhfTFBCWVRFIHAsIEZYX1dPUkQgdik7DQorZXh0ZXJuIHZvaWQgX0JwY0NvbnZlcnQoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfbGVuLCBGWF9JTlQzMiBzcmNfYnBjLCBGWF9JTlQzMiBkc3RfYnBjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4pOw0KKyNkZWZpbmUgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCisjZGVmaW5lIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisjZGVmaW5lIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorI2RlZmluZSBHSUZfU0lHTkFUVVJFCQkiR0lGIg0KKyNkZWZpbmUgR0lGX1NJR19FWFRFTlNJT04JMHgyMQ0KKyNkZWZpbmUgR0lGX1NJR19JTUFHRQkJMHgyQw0KKyNkZWZpbmUgR0lGX1NJR19UUkFJTEVSCQkweDNCDQorI2RlZmluZSBHSUZfQkxPQ0tfR0NFCQkweEY5DQorI2RlZmluZSBHSUZfQkxPQ0tfUFRFCQkweDAxDQorI2RlZmluZSBHSUZfQkxPQ0tfQ0UJCTB4RkUNCisjZGVmaW5lIEdJRl9CTE9DS19BRQkJMHhGRg0KKyNkZWZpbmUgR0lGX0JMT0NLX1RFUk1JTkFMCTB4MDANCisjZGVmaW5lIEdJRl9NQVhfTFpXX0NPREUJNDA5Ng0KKyNkZWZpbmUgR0lGX0RBVEFfQkxPQ0sJCTI1NQ0KKyNkZWZpbmUgR0lGX01BWF9FUlJPUl9TSVpFCTI1Ng0KKyNkZWZpbmUgR0lGX0RfU1RBVFVTX1NJRwkJMHgwMQ0KKyNkZWZpbmUgR0lGX0RfU1RBVFVTX1RBSUwJCTB4MDINCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFQJCTB4MDMNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfQUUJCTB4MDQNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfQ0UJCTB4MDUNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfR0NFCTB4MDYNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfUFRFCTB4MDcNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfVU5FCTB4MDgNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19JTUdfSU5GTwkweDA5DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEJMHgwQQ0KKyNwcmFnbWEgcGFjaygxKQ0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZkdGIHsNCisgICAgRlhfQllURSBwYWxfYml0cyA6IDM7DQorICAgIEZYX0JZVEUgc29ydF9mbGFnIDogMTsNCisgICAgRlhfQllURSBjb2xvcl9yZXNvbHV0aW9uIDogMzsNCisgICAgRlhfQllURSBnbG9iYWxfcGFsIDogMTsNCit9IEdpZkdGOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZkxGIHsNCisgICAgRlhfQllURSBwYWxfYml0cyA6IDM7DQorICAgIEZYX0JZVEUgcmVzZXJ2ZWQgOiAyOw0KKyAgICBGWF9CWVRFIHNvcnRfZmxhZyA6IDE7DQorICAgIEZYX0JZVEUgaW50ZXJsYWNlIDogMTsNCisgICAgRlhfQllURSBsb2NhbF9wYWwgOiAxOw0KK30gR2lmTEY7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSGVhZGVyIHsNCisgICAgY2hhciBzaWduYXR1cmVbM107DQorICAgIGNoYXIgdmVyc2lvblszXTsNCit9IEdpZkhlYWRlcjsNCit0eXBlZGVmIHN0cnVjdCB0YWdHaWZMU0Qgew0KKyAgICBGWF9XT1JECXdpZHRoOw0KKyAgICBGWF9XT1JEIGhlaWdodDsNCisgICAgRlhfQllURQlnbG9iYWxfZmxhZzsNCisgICAgRlhfQllURSBiY19pbmRleDsNCisgICAgRlhfQllURQlwaXhlbF9hc3BlY3Q7DQorfSBHaWZMU0Q7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSW1hZ2VJbmZvIHsNCisgICAgRlhfV09SRCBsZWZ0Ow0KKyAgICBGWF9XT1JEIHRvcDsNCisgICAgRlhfV09SRCB3aWR0aDsNCisgICAgRlhfV09SRCBoZWlnaHQ7DQorDQorICAgIEZYX0JZVEUJbG9jYWxfZmxhZzsNCit9IEdpZkltYWdlSW5mbzsNCit0eXBlZGVmIHN0cnVjdCB0YWdHaWZDRUYgew0KKyAgICBGWF9CWVRFIHRyYW5zcGFyZW5jeSA6IDE7DQorICAgIEZYX0JZVEUgdXNlcl9pbnB1dCA6IDE7DQorICAgIEZYX0JZVEUgZGlzcG9zYWxfbWV0aG9kIDogMzsNCisgICAgRlhfQllURSByZXNlcnZlZCA6IDM7DQorfSBHaWZDRUY7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmR0NFIHsNCisgICAgRlhfQllURSBibG9ja19zaXplOw0KKyAgICBGWF9CWVRFCWdjZV9mbGFnOw0KKyAgICBGWF9XT1JEIGRlbGF5X3RpbWU7DQorICAgIEZYX0JZVEUJdHJhbnNfaW5kZXg7DQorfSBHaWZHQ0U7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUFRFIHsNCisgICAgRlhfQllURSBibG9ja19zaXplOw0KKyAgICBGWF9XT1JECWdyaWRfbGVmdDsNCisgICAgRlhfV09SRAlncmlkX3RvcDsNCisgICAgRlhfV09SRCBncmlkX3dpZHRoOw0KKyAgICBGWF9XT1JECWdyaWRfaGVpZ2h0Ow0KKw0KKyAgICBGWF9CWVRFIGNoYXJfd2lkdGg7DQorICAgIEZYX0JZVEUgY2hhcl9oZWlnaHQ7DQorDQorICAgIEZYX0JZVEUgZmNfaW5kZXg7DQorICAgIEZYX0JZVEUgYmNfaW5kZXg7DQorfSBHaWZQVEU7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmQUUgew0KKyAgICBGWF9CWVRFIGJsb2NrX3NpemU7DQorICAgIEZYX0JZVEUgYXBwX2lkZW50aWZ5WzhdOw0KKyAgICBGWF9CWVRFCWFwcF9hdXRoZW50aWNhdGlvblszXTsNCit9IEdpZkFFOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZlBhbGV0dGUgew0KKyAgICBGWF9CWVRFIHIsIGcsIGI7DQorfSBHaWZQYWxldHRlOw0KKyNwcmFnbWEgcGFjaygpDQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSW1hZ2Ugew0KKyAgICBHaWZHQ0UqCQkJaW1hZ2VfZ2NlX3B0cjsNCisgICAgR2lmUGFsZXR0ZSoJCWxvY2FsX3BhbF9wdHI7DQorICAgIEdpZkltYWdlSW5mbyoJaW1hZ2VfaW5mb19wdHI7DQorICAgIEZYX0JZVEUJCQlpbWFnZV9jb2RlX3NpemU7DQorICAgIEZYX0RXT1JECQlpbWFnZV9kYXRhX3BvczsNCisgICAgRlhfTFBCWVRFCQlpbWFnZV9yb3dfYnVmOw0KKyAgICBGWF9JTlQzMgkJaW1hZ2Vfcm93X251bTsNCit9IEdpZkltYWdlOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZlBsYWluVGV4dCB7DQorICAgIEdpZkdDRSoJCQlnY2VfcHRyOw0KKyAgICBHaWZQVEUqCQkJcHRlX3B0cjsNCisgICAgQ0ZYX0J5dGVTdHJpbmcqIHN0cmluZ19wdHI7DQorfSBHaWZQbGFpblRleHQ7DQorY2xhc3MgQ0dpZkxaV0RlY29kZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHN0cnVjdCB0YWdfVGFibGUgew0KKyAgICAgICAgRlhfV09SRCBwcmVmaXg7DQorICAgICAgICBGWF9CWVRFIHN1ZmZpeDsNCisgICAgfTsNCisgICAgQ0dpZkxaV0RlY29kZXIoRlhfTFBTVFIgZXJyb3JfcHRyID0gTlVMTCkNCisgICAgew0KKyAgICAgICAgZXJyX21zZ19wdHIgPSBlcnJvcl9wdHI7DQorICAgIH0NCisgICAgdm9pZAkJSW5pdFRhYmxlKEZYX0JZVEUgY29kZV9sZW4pOw0KKw0KKyAgICBGWF9JTlQzMglEZWNvZGUoRlhfTFBCWVRFIGRlc19idWYsIEZYX0RXT1JEJiBkZXNfc2l6ZSk7DQorDQorICAgIHZvaWQJCUlucHV0KEZYX0xQQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7DQorICAgIEZYX0RXT1JECUdldEF2YWlsSW5wdXQoKTsNCisNCitwcml2YXRlOg0KKyAgICB2b2lkCQlDbGVhclRhYmxlKCk7DQorICAgIHZvaWQJCUFkZENvZGUoRlhfV09SRCBwcmVmaXhfY29kZSwgRlhfQllURSBhcHBlbmRfY2hhcik7DQorICAgIHZvaWQJCURlY29kZVN0cmluZyhGWF9XT1JEIGNvZGUpOw0KKyAgICBGWF9CWVRFCQljb2RlX3NpemU7DQorICAgIEZYX0JZVEUJCWNvZGVfc2l6ZV9jdXI7DQorICAgIEZYX1dPUkQJCWNvZGVfY2xlYXI7DQorICAgIEZYX1dPUkQJCWNvZGVfZW5kOw0KKyAgICBGWF9XT1JECQljb2RlX25leHQ7DQorICAgIEZYX0JZVEUJCWNvZGVfZmlyc3Q7DQorICAgIEZYX0JZVEUJCXN0YWNrW0dJRl9NQVhfTFpXX0NPREVdOw0KKyAgICBGWF9XT1JECQlzdGFja19zaXplOw0KKyAgICB0YWdfVGFibGUJY29kZV90YWJsZVtHSUZfTUFYX0xaV19DT0RFXTsNCisgICAgRlhfV09SRAkJY29kZV9vbGQ7DQorDQorICAgIEZYX0xQQllURQluZXh0X2luOw0KKyAgICBGWF9EV09SRAlhdmFpbF9pbjsNCisNCisgICAgRlhfQllURQkJYml0c19sZWZ0Ow0KKyAgICBGWF9EV09SRAljb2RlX3N0b3JlOw0KKw0KKyAgICBGWF9MUFNUUgllcnJfbXNnX3B0cjsNCit9Ow0KK2NsYXNzIENHaWZMWldFbmNvZGVyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBzdHJ1Y3QgdGFnX1RhYmxlIHsNCisgICAgICAgIEZYX1dPUkQJCXByZWZpeDsNCisgICAgICAgIEZYX0JZVEUJCXN1ZmZpeDsNCisgICAgfTsNCisgICAgQ0dpZkxaV0VuY29kZXIoKTsNCisgICAgfkNHaWZMWldFbmNvZGVyKCk7DQorICAgIHZvaWQJCVN0YXJ0KEZYX0JZVEUgY29kZV9sZW4sIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgb2Zmc2V0KTsNCisgICAgRlhfQk9PTAkJRW5jb2RlKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX2xlbiwgRlhfTFBCWVRFJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCk7DQorICAgIHZvaWQJCUZpbmlzaChGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KTsNCitwcml2YXRlOg0KKyAgICB2b2lkCQlDbGVhclRhYmxlKCk7DQorICAgIEZYX0JPT0wJCUxvb2tVcEluVGFibGUoRlhfTFBDQllURSBidWYsIEZYX0RXT1JEJiBvZmZzZXQsIEZYX0JZVEUmIGJpdF9vZmZzZXQpOw0KKyAgICB2b2lkCQlFbmNvZGVTdHJpbmcoRlhfRFdPUkQgaW5kZXgsIEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4sIEZYX0RXT1JEJiBvZmZzZXQpOw0KKyAgICB2b2lkCQlXcml0ZUJsb2NrKEZYX0xQQllURSYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4sIEZYX0RXT1JEJiBvZmZzZXQpOw0KKyAgICBqbXBfYnVmCQlqbXA7DQorICAgIEZYX0RXT1JECXNyY19vZmZzZXQ7DQorICAgIEZYX0JZVEUJCXNyY19iaXRfb2Zmc2V0Ow0KKyAgICBGWF9CWVRFCQlzcmNfYml0X2N1dDsNCisgICAgRlhfRFdPUkQJc3JjX2JpdF9udW07DQorICAgIEZYX0JZVEUJCWNvZGVfc2l6ZTsNCisgICAgRlhfV09SRAkJY29kZV9jbGVhcjsNCisgICAgRlhfV09SRAkJY29kZV9lbmQ7DQorICAgIEZYX1dPUkQJCWluZGV4X251bTsNCisgICAgRlhfQllURQkJYml0X29mZnNldDsNCisgICAgRlhfQllURQkJaW5kZXhfYml0X2N1cjsNCisgICAgRlhfQllURQkJaW5kZXhfYnVmW0dJRl9EQVRBX0JMT0NLXTsNCisgICAgRlhfQllURQkJaW5kZXhfYnVmX2xlbjsNCisgICAgdGFnX1RhYmxlCWNvZGVfdGFibGVbR0lGX01BWF9MWldfQ09ERV07DQorICAgIEZYX1dPUkQJCXRhYmxlX2N1cjsNCit9Ow0KK3R5cGVkZWYgc3RydWN0IHRhZ19naWZfZGVjb21wcmVzc19zdHJ1Y3QgZ2lmX2RlY29tcHJlc3Nfc3RydWN0Ow0KK3R5cGVkZWYgZ2lmX2RlY29tcHJlc3Nfc3RydWN0ICpnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcDsNCit0eXBlZGVmIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wICpnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcHA7DQorc3RhdGljIEZYX0lOVDMyIHNfZ2lmX2ludGVybGFjZV9zdGVwWzRdID0gezgsIDgsIDQsIDJ9Ow0KK3N0cnVjdCB0YWdfZ2lmX2RlY29tcHJlc3Nfc3RydWN0IHsNCisgICAgam1wX2J1ZgkJCWptcGJ1ZjsNCisgICAgRlhfTFBTVFIJCWVycl9wdHI7DQorICAgIHZvaWQJCQkoKl9naWZfZXJyb3JfZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQ1NUUiBlcnJfbXNnKTsNCisgICAgdm9pZCoJCQljb250ZXh0X3B0cjsNCisgICAgaW50CQkJCXdpZHRoOw0KKyAgICBpbnQJCQkJaGVpZ2h0Ow0KKyAgICBHaWZQYWxldHRlKgkJZ2xvYmFsX3BhbF9wdHI7DQorICAgIEZYX0lOVDMyCQlnbG9iYWxfcGFsX251bTsNCisgICAgRlhfQllURQkJCWdsb2JhbF9zb3J0X2ZsYWc7DQorICAgIEZYX0JZVEUJCQlnbG9iYWxfY29sb3JfcmVzb2x1dGlvbjsNCisNCisgICAgRlhfQllURQkJCWJjX2luZGV4Ow0KKyAgICBGWF9CWVRFCQkJcGl4ZWxfYXNwZWN0Ow0KKyAgICBDR2lmTFpXRGVjb2RlcioJaW1nX2RlY29kZXJfcHRyOw0KKyAgICBGWF9EV09SRAkJaW1nX3Jvd19vZmZzZXQ7DQorICAgIEZYX0RXT1JECQlpbWdfcm93X2F2YWlsX3NpemU7DQorICAgIEZYX0JZVEUJCQlpbWdfcGFzc19udW07DQorICAgIENGWF9BcnJheVRlbXBsYXRlPEdpZkltYWdlKj4qIGltZ19wdHJfYXJyX3B0cjsNCisgICAgRlhfTFBCWVRFCQkoKl9naWZfYXNrX2J1Zl9mb3JfcGFsX2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9JTlQzMiBwYWxfc2l6ZSk7DQorICAgIEZYX0xQQllURQkJbmV4dF9pbjsNCisgICAgRlhfRFdPUkQJCWF2YWlsX2luOw0KKyAgICBGWF9JTlQzMgkJZGVjb2RlX3N0YXR1czsNCisgICAgRlhfRFdPUkQJCXNraXBfc2l6ZTsNCisgICAgdm9pZAkJCSgqX2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfRFdPUkQqIGN1cl9wb3NfcHRyKTsNCisgICAgdm9pZAkJCSgqX2dpZl9nZXRfcm93X2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9JTlQzMiByb3dfbnVtLCBGWF9MUEJZVEUgcm93X2J1Zik7DQorICAgIEZYX0JPT0wJCQkoKl9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbl9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfRFdPUkQgY3VyX3BvcywNCisgICAgICAgICAgICBGWF9JTlQzMiBsZWZ0LCBGWF9JTlQzMiB0b3AsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsDQorICAgICAgICAgICAgRlhfSU5UMzIgcGFsX251bSwgdm9pZCogcGFsX3B0ciwNCisgICAgICAgICAgICBGWF9JTlQzMiBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQorICAgICAgICAgICAgRlhfSU5UMzIgdHJhbnNfaW5kZXgsIEZYX0lOVDMyIGRpc3Bvc2FsX21ldGhvZCwgRlhfQk9PTCBpbnRlcmxhY2UpOw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCisgICAgRlhfQllURQkJCWFwcF9pZGVudGlmeVs4XTsNCisgICAgRlhfQllURQkJCWFwcF9hdXRoZW50aWNhdGlvblszXTsNCisgICAgRlhfRFdPUkQJCWFwcF9kYXRhX3NpemU7DQorICAgIEZYX0xQQllURQkJYXBwX2RhdGE7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQorICAgIENGWF9CeXRlU3RyaW5nKgljbXRfZGF0YV9wdHI7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisgICAgR2lmR0NFKgkJCWdjZV9wdHI7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorICAgIENGWF9BcnJheVRlbXBsYXRlPEdpZlBsYWluVGV4dCo+KiBwdF9wdHJfYXJyX3B0cjsNCisjZW5kaWYNCit9Ow0KK3R5cGVkZWYgc3RydWN0IHRhZ19naWZfY29tcHJlc3Nfc3RydWN0IGdpZl9jb21wcmVzc19zdHJ1Y3Q7DQordHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0ICpnaWZfY29tcHJlc3Nfc3RydWN0X3A7DQordHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0X3AgKmdpZl9jb21wcmVzc19zdHJ1Y3RfcHA7DQorc3RydWN0IHRhZ19naWZfY29tcHJlc3Nfc3RydWN0IHsNCisgICAgRlhfTFBDQllURQkJc3JjX2J1ZjsNCisgICAgRlhfRFdPUkQJCXNyY19waXRjaDsNCisgICAgRlhfRFdPUkQJCXNyY193aWR0aDsNCisgICAgRlhfRFdPUkQJCXNyY19yb3c7DQorICAgIEZYX0RXT1JECQljdXJfb2Zmc2V0Ow0KKyAgICBGWF9EV09SRAkJZnJhbWVzOw0KKyAgICBHaWZIZWFkZXIqCQloZWFkZXJfcHRyOw0KKyAgICBHaWZMU0QqCQkJbHNkX3B0cjsNCisgICAgR2lmUGFsZXR0ZSoJCWdsb2JhbF9wYWw7DQorICAgIEZYX1dPUkQJCQlncGFsX251bTsNCisgICAgR2lmUGFsZXR0ZSoJCWxvY2FsX3BhbDsNCisgICAgRlhfV09SRAkJCWxwYWxfbnVtOw0KKyAgICBHaWZJbWFnZUluZm8qCWltYWdlX2luZm9fcHRyOw0KKyAgICBDR2lmTFpXRW5jb2RlciogaW1nX2VuY29kZXJfcHRyOw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCisgICAgRlhfQllURQkJCWFwcF9pZGVudGlmeVs4XTsNCisgICAgRlhfQllURQkJCWFwcF9hdXRoZW50aWNhdGlvblszXTsNCisgICAgRlhfRFdPUkQJCWFwcF9kYXRhX3NpemU7DQorICAgIEZYX0xQQllURQkJYXBwX2RhdGE7DQorI2VuZGlmDQorDQorI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQorICAgIEZYX0xQQllURQkJY210X2RhdGFfcHRyOw0KKyAgICBGWF9EV09SRAkJY210X2RhdGFfbGVuOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICAgIEdpZkdDRSoJCQlnY2VfcHRyOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KKyAgICBHaWZQVEUqCQkJcHRlX3B0cjsNCisgICAgRlhfTFBDQllURQkJcHRlX2RhdGFfcHRyOw0KKyAgICBGWF9EV09SRAkJcHRlX2RhdGFfbGVuOw0KKyNlbmRpZg0KK307DQordm9pZCBfZ2lmX2Vycm9yKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQ1NUUiBlcnJfbXNnKTsNCit2b2lkIF9naWZfd2FybihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9MUENTVFIgZXJyX21zZyk7DQorZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgX2dpZl9jcmVhdGVfZGVjb21wcmVzcygpOw0KK3ZvaWQgX2dpZl9kZXN0cm95X2RlY29tcHJlc3MoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3BwIGdpZl9wdHJfcHRyKTsNCitnaWZfY29tcHJlc3Nfc3RydWN0X3AgX2dpZl9jcmVhdGVfY29tcHJlc3MoKTsNCit2b2lkIF9naWZfZGVzdHJveV9jb21wcmVzcyhnaWZfY29tcHJlc3Nfc3RydWN0X3BwIGdpZl9wdHJfcHRyKTsNCitGWF9JTlQzMiBfZ2lmX3JlYWRfaGVhZGVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpOw0KK0ZYX0lOVDMyIF9naWZfZ2V0X2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpOw0KK0ZYX0lOVDMyIF9naWZfZ2V0X2ZyYW1lX251bShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKTsNCitGWF9JTlQzMiBfZ2lmX2RlY29kZV9leHRlbnNpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7DQorRlhfSU5UMzIgX2dpZl9kZWNvZGVfaW1hZ2VfaW5mbyhnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKTsNCit2b2lkIF9naWZfdGFrZW92ZXJfZ2NlX3B0cihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBHaWZHQ0UqKiBnY2VfcHRyX3B0cik7DQorRlhfSU5UMzIgX2dpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0lOVDMyIGZyYW1lX251bSk7DQorRlhfTFBCWVRFIF9naWZfcmVhZF9kYXRhKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQllURSogZGVzX2J1Zl9wcCwgRlhfRFdPUkQgZGF0YV9zaXplKTsNCit2b2lkIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfSU5UMzIgc3RhdHVzKTsNCit2b2lkIF9naWZfaW5wdXRfYnVmZmVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0xQQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7DQorRlhfRFdPUkQgX2dpZl9nZXRfYXZhaWxfaW5wdXQoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfTFBCWVRFKiBhdmlhbF9idWZfcHRyKTsNCit2b2lkIGludGVybGFjZV9idWYoRlhfTFBDQllURSBidWYsIEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQpOw0KK0ZYX0JPT0wgX2dpZl9lbmNvZGUoIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBGWF9MUEJZVEUmIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuICk7DQorI2RlZmluZSBHSUZfUFRSX05PVF9OVUxMKHB0cixnaWZfcHRyKQlpZihwdHIgPT0gTlVMTCl7CQkJCQkJXA0KKyAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCJPdXQgT2YgTWVtb3J5Iik7XA0KKyAgICAgICAgcmV0dXJuIDA7CQkJCQkJCVwNCisgICAgfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2V4dGVuc2lvbi5oIGIvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKaW5kZXggYzIzYTJlMy4uMDVhYWQ2NyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgKQEAgLTI2LDYgKzI2LDQ0IEBACiAgICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpID0gMDsKIH07CiBJRlhDUlRfRmlsZUFjY2VzcyoJRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKK2NsYXNzIENGWF9DUlRGaWxlQWNjZXNzIDogcHVibGljIElGWF9GaWxlQWNjZXNzLCBwdWJsaWMgQ0ZYX09iamVjdAoreworcHVibGljOgorCUNGWF9DUlRGaWxlQWNjZXNzKCkgOiBtX1JlZkNvdW50KDApIHt9CisKKwl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpIAorCXsKKwkJaWYgKC0tbV9SZWZDb3VudCA9PSAwKQorCQkJZGVsZXRlIHRoaXM7CisJfQorCisJSUZYX0ZpbGVBY2Nlc3MqCQkJCVJldGFpbigpCisJeworCQltX1JlZkNvdW50Kys7CisJCXJldHVybiAoSUZYX0ZpbGVBY2Nlc3MqKXRoaXM7CisJfQorCisJdmlydHVhbCBGWF9CT09MCQkJCUluaXQoRlhfV1NUUiB3c1BhdGgpIAorCXsKKwkJbV9wYXRoID0gd3NQYXRoOworCQltX1JlZkNvdW50ID0gMTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJdmlydHVhbCB2b2lkCQkJCUdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkKKwl7CisJCXdzUGF0aCA9IG1fcGF0aDsKKwl9CisKKwl2aXJ0dWFsIElGWF9GaWxlU3RyZWFtKgkJQ3JlYXRlRmlsZVN0cmVhbShGWF9EV09SRCBkd01vZGVzKQorCXsKKwkJcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0obV9wYXRoLCBkd01vZGVzKTsKKwl9CisKK3Byb3RlY3RlZDoKKwlDRlhfV2lkZVN0cmluZwkJbV9wYXRoOworCUZYX0RXT1JECQkJbV9SZWZDb3VudDsKK307CiBjbGFzcyBDRlhfQ1JURmlsZVN0cmVhbSBGWF9GSU5BTCA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbSwgcHVibGljIENGWF9PYmplY3QKIHsKIHB1YmxpYzoKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwCmluZGV4IDU4M2NlODEuLmRkNWQxZDggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcApAQCAtNyw2ICs3LDEwODQgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgogI2luY2x1ZGUgImZ4X2FyYWJpYy5oIgogZXh0ZXJuIGNvbnN0IEZYX0RXT1JEIGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbNjU1MzZdOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorc3RhdGljIGNvbnN0IEZYX0FSQkZPUk1UQUJMRSBnX0ZYX0FyYWJpY0Zvcm1UYWJsZXNbXSA9IHsKKyAgICB7MHhGRTgxLAkweEZFODIsCTB4RkU4MSwJMHhGRTgyfSwKKyAgICB7MHhGRTgzLAkweEZFODQsCTB4RkU4MywJMHhGRTg0fSwKKyAgICB7MHhGRTg1LAkweEZFODYsCTB4RkU4NSwJMHhGRTg2fSwKKyAgICB7MHhGRTg3LAkweEZFODgsCTB4RkU4NywJMHhGRTg4fSwKKyAgICB7MHhGRTg5LAkweEZFOEEsCTB4RkU4QiwJMHhGRThDfSwKKyAgICB7MHhGRThELAkweEZFOEUsCTB4RkU4RCwJMHhGRThFfSwKKyAgICB7MHhGRThGLAkweEZFOTAsCTB4RkU5MSwJMHhGRTkyfSwKKyAgICB7MHhGRTkzLAkweEZFOTQsCTB4RkU5MywJMHhGRTk0fSwKKyAgICB7MHhGRTk1LAkweEZFOTYsCTB4RkU5NywJMHhGRTk4fSwKKyAgICB7MHhGRTk5LAkweEZFOUEsCTB4RkU5QiwJMHhGRTlDfSwKKyAgICB7MHhGRTlELAkweEZFOUUsCTB4RkU5RiwJMHhGRUEwfSwKKyAgICB7MHhGRUExLAkweEZFQTIsCTB4RkVBMywJMHhGRUE0fSwKKyAgICB7MHhGRUE1LAkweEZFQTYsCTB4RkVBNywJMHhGRUE4fSwKKyAgICB7MHhGRUE5LAkweEZFQUEsCTB4RkVBOSwJMHhGRUFBfSwKKyAgICB7MHhGRUFCLAkweEZFQUMsCTB4RkVBQiwJMHhGRUFDfSwKKyAgICB7MHhGRUFELAkweEZFQUUsCTB4RkVBRCwJMHhGRUFFfSwKKyAgICB7MHhGRUFGLAkweEZFQjAsCTB4RkVBRiwJMHhGRUIwfSwKKyAgICB7MHhGRUIxLAkweEZFQjIsCTB4RkVCMywJMHhGRUI0fSwKKyAgICB7MHhGRUI1LAkweEZFQjYsCTB4RkVCNywJMHhGRUI4fSwKKyAgICB7MHhGRUI5LAkweEZFQkEsCTB4RkVCQiwJMHhGRUJDfSwKKyAgICB7MHhGRUJELAkweEZFQkUsCTB4RkVCRiwJMHhGRUMwfSwKKyAgICB7MHhGRUMxLAkweEZFQzIsCTB4RkVDMywJMHhGRUM0fSwKKyAgICB7MHhGRUM1LAkweEZFQzYsCTB4RkVDNywJMHhGRUM4fSwKKyAgICB7MHhGRUM5LAkweEZFQ0EsCTB4RkVDQiwJMHhGRUNDfSwKKyAgICB7MHhGRUNELAkweEZFQ0UsCTB4RkVDRiwJMHhGRUQwfSwKKyAgICB7MHgwNjNCLAkweDA2M0IsCTB4MDYzQiwJMHgwNjNCfSwKKyAgICB7MHgwNjNDLAkweDA2M0MsCTB4MDYzQywJMHgwNjNDfSwKKyAgICB7MHgwNjNELAkweDA2M0QsCTB4MDYzRCwJMHgwNjNEfSwKKyAgICB7MHgwNjNFLAkweDA2M0UsCTB4MDYzRSwJMHgwNjNFfSwKKyAgICB7MHgwNjNGLAkweDA2M0YsCTB4MDYzRiwJMHgwNjNGfSwKKyAgICB7MHgwNjQwLAkweDA2NDAsCTB4MDY0MCwJMHgwNjQwfSwKKyAgICB7MHhGRUQxLAkweEZFRDIsCTB4RkVEMywJMHhGRUQ0fSwKKyAgICB7MHhGRUQ1LAkweEZFRDYsCTB4RkVENywJMHhGRUQ4fSwKKyAgICB7MHhGRUQ5LAkweEZFREEsCTB4RkVEQiwJMHhGRURDfSwKKyAgICB7MHhGRURELAkweEZFREUsCTB4RkVERiwJMHhGRUUwfSwKKyAgICB7MHhGRUUxLAkweEZFRTIsCTB4RkVFMywJMHhGRUU0fSwKKyAgICB7MHhGRUU1LAkweEZFRTYsCTB4RkVFNywJMHhGRUU4fSwKKyAgICB7MHhGRUU5LAkweEZFRUEsCTB4RkVFQiwJMHhGRUVDfSwKKyAgICB7MHhGRUVELAkweEZFRUUsCTB4RkVFRCwJMHhGRUVFfSwKKyAgICB7MHhGRUVGLAkweEZFRjAsCTB4RkJGRSwJMHhGQkZGfSwKKyAgICB7MHhGRUYxLAkweEZFRjIsCTB4RkVGMywJMHhGRUY0fSwKKyAgICB7MHgwNjRCLAkweDA2NEIsCTB4MDY0QiwJMHgwNjRCfSwKKyAgICB7MHgwNjRDLAkweDA2NEMsCTB4MDY0QywJMHgwNjRDfSwKKyAgICB7MHgwNjRELAkweDA2NEQsCTB4MDY0RCwJMHgwNjREfSwKKyAgICB7MHgwNjRFLAkweDA2NEUsCTB4MDY0RSwJMHgwNjRFfSwKKyAgICB7MHgwNjRGLAkweDA2NEYsCTB4MDY0RiwJMHgwNjRGfSwKKyAgICB7MHgwNjUwLAkweDA2NTAsCTB4MDY1MCwJMHgwNjUwfSwKKyAgICB7MHgwNjUxLAkweDA2NTEsCTB4MDY1MSwJMHgwNjUxfSwKKyAgICB7MHgwNjUyLAkweDA2NTIsCTB4MDY1MiwJMHgwNjUyfSwKKyAgICB7MHgwNjUzLAkweDA2NTMsCTB4MDY1MywJMHgwNjUzfSwKKyAgICB7MHgwNjU0LAkweDA2NTQsCTB4MDY1NCwJMHgwNjU0fSwKKyAgICB7MHgwNjU1LAkweDA2NTUsCTB4MDY1NSwJMHgwNjU1fSwKKyAgICB7MHgwNjU2LAkweDA2NTYsCTB4MDY1NiwJMHgwNjU2fSwKKyAgICB7MHgwNjU3LAkweDA2NTcsCTB4MDY1NywJMHgwNjU3fSwKKyAgICB7MHgwNjU4LAkweDA2NTgsCTB4MDY1OCwJMHgwNjU4fSwKKyAgICB7MHgwNjU5LAkweDA2NTksCTB4MDY1OSwJMHgwNjU5fSwKKyAgICB7MHgwNjVBLAkweDA2NUEsCTB4MDY1QSwJMHgwNjVBfSwKKyAgICB7MHgwNjVCLAkweDA2NUIsCTB4MDY1QiwJMHgwNjVCfSwKKyAgICB7MHgwNjVDLAkweDA2NUMsCTB4MDY1QywJMHgwNjVDfSwKKyAgICB7MHgwNjVELAkweDA2NUQsCTB4MDY1RCwJMHgwNjVEfSwKKyAgICB7MHgwNjVFLAkweDA2NUUsCTB4MDY1RSwJMHgwNjVFfSwKKyAgICB7MHgwNjVGLAkweDA2NUYsCTB4MDY1RiwJMHgwNjVGfSwKKyAgICB7MHgwNjYwLAkweDA2NjAsCTB4MDY2MCwJMHgwNjYwfSwKKyAgICB7MHgwNjYxLAkweDA2NjEsCTB4MDY2MSwJMHgwNjYxfSwKKyAgICB7MHgwNjYyLAkweDA2NjIsCTB4MDY2MiwJMHgwNjYyfSwKKyAgICB7MHgwNjYzLAkweDA2NjMsCTB4MDY2MywJMHgwNjYzfSwKKyAgICB7MHgwNjY0LAkweDA2NjQsCTB4MDY2NCwJMHgwNjY0fSwKKyAgICB7MHgwNjY1LAkweDA2NjUsCTB4MDY2NSwJMHgwNjY1fSwKKyAgICB7MHgwNjY2LAkweDA2NjYsCTB4MDY2NiwJMHgwNjY2fSwKKyAgICB7MHgwNjY3LAkweDA2NjcsCTB4MDY2NywJMHgwNjY3fSwKKyAgICB7MHgwNjY4LAkweDA2NjgsCTB4MDY2OCwJMHgwNjY4fSwKKyAgICB7MHgwNjY5LAkweDA2NjksCTB4MDY2OSwJMHgwNjY5fSwKKyAgICB7MHgwNjZBLAkweDA2NkEsCTB4MDY2QSwJMHgwNjZBfSwKKyAgICB7MHgwNjZCLAkweDA2NkIsCTB4MDY2QiwJMHgwNjZCfSwKKyAgICB7MHgwNjZDLAkweDA2NkMsCTB4MDY2QywJMHgwNjZDfSwKKyAgICB7MHgwNjZELAkweDA2NkQsCTB4MDY2RCwJMHgwNjZEfSwKKyAgICB7MHgwNjZFLAkweDA2NkUsCTB4MDY2RSwJMHgwNjZFfSwKKyAgICB7MHgwNjZGLAkweDA2NkYsCTB4MDY2RiwJMHgwNjZGfSwKKyAgICB7MHgwNjcwLAkweDA2NzAsCTB4MDY3MCwJMHgwNjcwfSwKKyAgICB7MHhGQjUwLAkweEZCNTEsCTB4RkI1MCwJMHhGQjUxfSwKKyAgICB7MHgwNjcyLAkweDA2NzIsCTB4MDY3MiwJMHgwNjcyfSwKKyAgICB7MHgwNjczLAkweDA2NzMsCTB4MDY3MywJMHgwNjczfSwKKyAgICB7MHgwNjc0LAkweDA2NzQsCTB4MDY3NCwJMHgwNjc0fSwKKyAgICB7MHgwNjc1LAkweDA2NzUsCTB4MDY3NSwJMHgwNjc1fSwKKyAgICB7MHgwNjc2LAkweDA2NzYsCTB4MDY3NiwJMHgwNjc2fSwKKyAgICB7MHgwNjc3LAkweDA2NzcsCTB4MDY3NywJMHgwNjc3fSwKKyAgICB7MHgwNjc4LAkweDA2NzgsCTB4MDY3OCwJMHgwNjc4fSwKKyAgICB7MHhGQjY2LAkweEZCNjcsCTB4RkI2OCwJMHhGQjY5fSwKKyAgICB7MHhGQjVFLAkweEZCNUYsCTB4RkI2MCwJMHhGQjYxfSwKKyAgICB7MHhGQjUyLAkweEZCNTMsCTB4RkI1NCwJMHhGQjU1fSwKKyAgICB7MHgwNjdDLAkweDA2N0MsCTB4MDY3QywJMHgwNjdDfSwKKyAgICB7MHgwNjdELAkweDA2N0QsCTB4MDY3RCwJMHgwNjdEfSwKKyAgICB7MHhGQjU2LAkweEZCNTcsCTB4RkI1OCwJMHhGQjU5fSwKKyAgICB7MHhGQjYyLAkweEZCNjMsCTB4RkI2NCwJMHhGQjY1fSwKKyAgICB7MHhGQjVBLAkweEZCNUIsCTB4RkI1QywJMHhGQjVEfSwKKyAgICB7MHgwNjgxLAkweDA2ODEsCTB4MDY4MSwJMHgwNjgxfSwKKyAgICB7MHgwNjgyLAkweDA2ODIsCTB4MDY4MiwJMHgwNjgyfSwKKyAgICB7MHhGQjc2LAkweEZCNzcsCTB4RkI3OCwJMHhGQjc5fSwKKyAgICB7MHhGQjcyLAkweEZCNzMsCTB4RkI3NCwJMHhGQjc1fSwKKyAgICB7MHgwNjg1LAkweDA2ODUsCTB4MDY4NSwJMHgwNjg1fSwKKyAgICB7MHhGQjdBLAkweEZCN0IsCTB4RkI3QywJMHhGQjdEfSwKKyAgICB7MHhGQjdFLAkweEZCN0YsCTB4RkI4MCwJMHhGQjgxfSwKKyAgICB7MHhGQjg4LAkweEZCODksCTB4RkI4OCwJMHhGQjg5fSwKKyAgICB7MHgwNjg5LAkweDA2ODksCTB4MDY4OSwJMHgwNjg5fSwKKyAgICB7MHgwNjhBLAkweDA2OEEsCTB4MDY4QSwJMHgwNjhBfSwKKyAgICB7MHgwNjhCLAkweDA2OEIsCTB4MDY4QiwJMHgwNjhCfSwKKyAgICB7MHhGQjg0LAkweEZCODUsCTB4RkI4NCwJMHhGQjg1fSwKKyAgICB7MHhGQjgyLAkweEZCODMsCTB4RkI4MiwJMHhGQjgzfSwKKyAgICB7MHhGQjg2LAkweEZCODcsCTB4RkI4NiwJMHhGQjg3fSwKKyAgICB7MHgwNjhGLAkweDA2OEYsCTB4MDY4RiwJMHgwNjhGfSwKKyAgICB7MHgwNjkwLAkweDA2OTAsCTB4MDY5MCwJMHgwNjkwfSwKKyAgICB7MHhGQjhDLAkweEZCOEQsCTB4RkI4QywJMHhGQjhEfSwKKyAgICB7MHgwNjkyLAkweDA2OTIsCTB4MDY5MiwJMHgwNjkyfSwKKyAgICB7MHgwNjkzLAkweDA2OTMsCTB4MDY5MywJMHgwNjkzfSwKKyAgICB7MHgwNjk0LAkweDA2OTQsCTB4MDY5NCwJMHgwNjk0fSwKKyAgICB7MHgwNjk1LAkweDA2OTUsCTB4MDY5NSwJMHgwNjk1fSwKKyAgICB7MHgwNjk2LAkweDA2OTYsCTB4MDY5NiwJMHgwNjk2fSwKKyAgICB7MHgwNjk3LAkweDA2OTcsCTB4MDY5NywJMHgwNjk3fSwKKyAgICB7MHhGQjhBLAkweEZCOEIsCTB4RkI4QSwJMHhGQjhCfSwKKyAgICB7MHgwNjk5LAkweDA2OTksCTB4MDY5OSwJMHgwNjk5fSwKKyAgICB7MHgwNjlBLAkweDA2OUEsCTB4MDY5QSwJMHgwNjlBfSwKKyAgICB7MHgwNjlCLAkweDA2OUIsCTB4MDY5QiwJMHgwNjlCfSwKKyAgICB7MHgwNjlDLAkweDA2OUMsCTB4MDY5QywJMHgwNjlDfSwKKyAgICB7MHgwNjlELAkweDA2OUQsCTB4MDY5RCwJMHgwNjlEfSwKKyAgICB7MHgwNjlFLAkweDA2OUUsCTB4MDY5RSwJMHgwNjlFfSwKKyAgICB7MHgwNjlGLAkweDA2OUYsCTB4MDY5RiwJMHgwNjlGfSwKKyAgICB7MHgwNkEwLAkweDA2QTAsCTB4MDZBMCwJMHgwNkEwfSwKKyAgICB7MHgwNkExLAkweDA2QTEsCTB4MDZBMSwJMHgwNkExfSwKKyAgICB7MHgwNkEyLAkweDA2QTIsCTB4MDZBMiwJMHgwNkEyfSwKKyAgICB7MHgwNkEzLAkweDA2QTMsCTB4MDZBMywJMHgwNkEzfSwKKyAgICB7MHhGQjZBLAkweEZCNkIsCTB4RkI2QywJMHhGQjZEfSwKKyAgICB7MHgwNkE1LAkweDA2QTUsCTB4MDZBNSwJMHgwNkE1fSwKKyAgICB7MHhGQjZFLAkweEZCNkYsCTB4RkI3MCwJMHhGQjcxfSwKKyAgICB7MHgwNkE3LAkweDA2QTcsCTB4MDZBNywJMHgwNkE3fSwKKyAgICB7MHgwNkE4LAkweDA2QTgsCTB4MDZBOCwJMHgwNkE4fSwKKyAgICB7MHhGQjhFLAkweEZCOEYsCTB4RkI5MCwJMHhGQjkxfSwKKyAgICB7MHgwNkFBLAkweDA2QUEsCTB4MDZBQSwJMHgwNkFBfSwKKyAgICB7MHgwNkFCLAkweDA2QUIsCTB4MDZBQiwJMHgwNkFCfSwKKyAgICB7MHgwNkFDLAkweDA2QUMsCTB4MDZBQywJMHgwNkFDfSwKKyAgICB7MHhGQkQzLAkweEZCRDQsCTB4RkJENSwJMHhGQkQ2fSwKKyAgICB7MHgwNkFFLAkweDA2QUUsCTB4MDZBRSwJMHgwNkFFfSwKKyAgICB7MHhGQjkyLAkweEZCOTMsCTB4RkI5NCwJMHhGQjk1fSwKKyAgICB7MHgwNkIwLAkweDA2QjAsCTB4MDZCMCwJMHgwNkIwfSwKKyAgICB7MHhGQjlBLAkweEZCOUIsCTB4RkI5QywJMHhGQjlEfSwKKyAgICB7MHgwNkIyLAkweDA2QjIsCTB4MDZCMiwJMHgwNkIyfSwKKyAgICB7MHhGQjk2LAkweEZCOTcsCTB4RkI5OCwJMHhGQjk5fSwKKyAgICB7MHgwNkI0LAkweDA2QjQsCTB4MDZCNCwJMHgwNkI0fSwKKyAgICB7MHgwNkI1LAkweDA2QjUsCTB4MDZCNSwJMHgwNkI1fSwKKyAgICB7MHgwNkI2LAkweDA2QjYsCTB4MDZCNiwJMHgwNkI2fSwKKyAgICB7MHgwNkI3LAkweDA2QjcsCTB4MDZCNywJMHgwNkI3fSwKKyAgICB7MHgwNkI4LAkweDA2QjgsCTB4MDZCOCwJMHgwNkI4fSwKKyAgICB7MHgwNkI5LAkweDA2QjksCTB4MDZCOSwJMHgwNkI5fSwKKyAgICB7MHhGQjlFLAkweEZCOUYsCTB4RkJFOCwJMHhGQkU5fSwKKyAgICB7MHhGQkEwLAkweEZCQTEsCTB4RkJBMiwJMHhGQkEzfSwKKyAgICB7MHgwNkJDLAkweDA2QkMsCTB4MDZCQywJMHgwNkJDfSwKKyAgICB7MHgwNkJELAkweDA2QkQsCTB4MDZCRCwJMHgwNkJEfSwKKyAgICB7MHhGQkFBLAkweEZCQUIsCTB4RkJBQywJMHhGQkFEfSwKKyAgICB7MHgwNkJGLAkweDA2QkYsCTB4MDZCRiwJMHgwNkJGfSwKKyAgICB7MHhGQkE0LAkweEZCQTUsCTB4RkJBNCwJMHhGQkE1fSwKKyAgICB7MHhGQkE2LAkweEZCQTcsCTB4RkJBOCwJMHhGQkE5fSwKKyAgICB7MHgwNkMyLAkweDA2QzIsCTB4MDZDMiwJMHgwNkMyfSwKKyAgICB7MHgwNkMzLAkweDA2QzMsCTB4MDZDMywJMHgwNkMzfSwKKyAgICB7MHgwNkM0LAkweDA2QzQsCTB4MDZDNCwJMHgwNkM0fSwKKyAgICB7MHhGQkUwLAkweEZCRTEsCTB4RkJFMCwJMHhGQkUxfSwKKyAgICB7MHhGQkQ5LAkweEZCREEsCTB4RkJEOSwJMHhGQkRBfSwKKyAgICB7MHhGQkQ3LAkweEZCRDgsCTB4RkJENywJMHhGQkQ4fSwKKyAgICB7MHhGQkRCLAkweEZCREMsCTB4RkJEQiwJMHhGQkRDfSwKKyAgICB7MHhGQkUyLAkweEZCRTMsCTB4RkJFMiwJMHhGQkUzfSwKKyAgICB7MHgwNkNBLAkweDA2Q0EsCTB4MDZDQSwJMHgwNkNBfSwKKyAgICB7MHhGQkRFLAkweEZCREYsCTB4RkJERSwJMHhGQkRGfSwKKyAgICB7MHhGQkZDLAkweEZCRkQsCTB4RkJGRSwJMHhGQkZGfSwKKyAgICB7MHgwNkNELAkweDA2Q0QsCTB4MDZDRCwJMHgwNkNEfSwKKyAgICB7MHgwNkNFLAkweDA2Q0UsCTB4MDZDRSwJMHgwNkNFfSwKKyAgICB7MHgwNkNGLAkweDA2Q0YsCTB4MDZDRiwJMHgwNkNGfSwKKyAgICB7MHhGQkU0LAkweEZCRTUsCTB4RkJFNiwJMHhGQkU3fSwKKyAgICB7MHgwNkQxLAkweDA2RDEsCTB4MDZEMSwJMHgwNkQxfSwKKyAgICB7MHhGQkFFLAkweEZCQUYsCTB4RkJBRSwJMHhGQkFGfSwKKyAgICB7MHhGQkIwLAkweEZCQjEsCTB4RkJCMCwJMHhGQkIxfSwKKyAgICB7MHgwNkQ0LAkweDA2RDQsCTB4MDZENCwJMHgwNkQ0fSwKKyAgICB7MHgwNkQ1LAkweDA2RDUsCTB4MDZENSwJMHgwNkQ1fSwKK307CitzdGF0aWMgY29uc3QgRlhfQVJBQUxFRiBnc19GWF9BbGVmVGFibGVbXSA9IHsKKyAgICB7MHgwNjIyLCAweEZFRjV9LAorICAgIHsweDA2MjMsIDB4RkVGN30sCisgICAgezB4MDYyNSwgMHhGRUY5fSwKKyAgICB7MHgwNjI3LCAweEZFRkJ9LAorfTsKK3N0YXRpYyBjb25zdCBGWF9BUkFTSEFEREEgZ3NfRlhfU2hhZGRhVGFibGVbXSA9IHsKKyAgICB7MHgwNjRDLAkweEZDNUV9LAorICAgIHsweDA2NEQsCTB4RkM1Rn0sCisgICAgezB4MDY0RSwJMHhGQzYwfSwKKyAgICB7MHgwNjRGLAkweEZDNjF9LAorICAgIHsweDA2NTAsCTB4RkM2Mn0sCit9OworRlhfTFBDQVJCRk9STVRBQkxFIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKQoreworICAgIGlmICh1bmljb2RlIDwgMHg2MjIgfHwgdW5pY29kZSA+IDB4NmQ1KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZ19GWF9BcmFiaWNGb3JtVGFibGVzICsgdW5pY29kZSAtIDB4NjIyOworfQorRlhfV0NIQVIgRlhfR2V0QXJhYmljRnJvbUFsZWZUYWJsZShGWF9XQ0hBUiBhbGVmKQoreworICAgIHN0YXRpYyBjb25zdCBGWF9JTlQzMiBzX2lBbGVmQ291bnQgPSBzaXplb2YoZ3NfRlhfQWxlZlRhYmxlKSAvIHNpemVvZihGWF9BUkFBTEVGKTsKKyAgICBmb3IgKEZYX0lOVDMyIGlTdGFydCA9IDA7IGlTdGFydCA8IHNfaUFsZWZDb3VudDsgaVN0YXJ0ICsrKSB7CisgICAgICAgIGNvbnN0IEZYX0FSQUFMRUYgJnYgPSBnc19GWF9BbGVmVGFibGVbaVN0YXJ0XTsKKyAgICAgICAgaWYgKHYud0FsZWYgPT0gYWxlZikgeworICAgICAgICAgICAgcmV0dXJuIHYud0lzb2xhdGVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbGVmOworfQorRlhfV0NIQVIgRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKEZYX1dDSEFSIHNoYWRkYSkKK3sKKyAgICBzdGF0aWMgY29uc3QgRlhfSU5UMzIgc19pU2hhZGRhQ291bnQgPSBzaXplb2YoZ3NfRlhfU2hhZGRhVGFibGUpIC8gc2l6ZW9mKEZYX0FSQVNIQUREQSk7CisgICAgZm9yIChGWF9JTlQzMiBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lTaGFkZGFDb3VudDsgaVN0YXJ0ICsrKSB7CisgICAgICAgIGNvbnN0IEZYX0FSQVNIQUREQSAmdiA9IGdzX0ZYX1NoYWRkYVRhYmxlW2lTdGFydF07CisgICAgICAgIGlmICh2LndTaGFkZGEgPT0gc2hhZGRhKSB7CisgICAgICAgICAgICByZXR1cm4gdi53SXNvbGF0ZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNoYWRkYTsKK30KKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorSUZYX0FyYWJpY0NoYXIqIElGWF9BcmFiaWNDaGFyOjpDcmVhdGUoKQoreworICAgIHJldHVybiBGWF9ORVcgQ0ZYX0FyYWJpY0NoYXI7Cit9CitGWF9CT09MIENGWF9BcmFiaWNDaGFyOjpJc0FyYWJpY0NoYXIoRlhfV0NIQVIgd2NoKSBjb25zdAoreworICAgIEZYX0RXT1JEIGR3UmV0ID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spOworICAgIHJldHVybiBkd1JldCA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmOworfQorRlhfQk9PTCBDRlhfQXJhYmljQ2hhcjo6SXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0Cit7CisgICAgcmV0dXJuIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNGb3JtOworfQorRlhfV0NIQVIgQ0ZYX0FyYWJpY0NoYXI6OkdldEZvcm1DaGFyKEZYX1dDSEFSIHdjaCwgRlhfV0NIQVIgcHJldiwgRlhfV0NIQVIgbmV4dCkgY29uc3QKK3sKKyAgICBDRlhfQ2hhciBjKHdjaCwgZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdKTsKKyAgICBDRlhfQ2hhciBwKHByZXYsIGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpcHJldl0pOworICAgIENGWF9DaGFyIG4obmV4dCwgZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCluZXh0XSk7CisgICAgcmV0dXJuIEdldEZvcm1DaGFyKCZjLCAmcCwgJm4pOworfQorRlhfV0NIQVIgQ0ZYX0FyYWJpY0NoYXI6OkdldEZvcm1DaGFyKGNvbnN0IENGWF9DaGFyICpjdXIsIGNvbnN0IENGWF9DaGFyICpwcmV2LCBjb25zdCBDRlhfQ2hhciAqbmV4dCkgY29uc3QKK3sKKyAgICBGWF9DSEFSVFlQRSBlQ3VyOworICAgIEZYX1dDSEFSIHdDdXI7CisgICAgRlhfTFBDQVJCRk9STVRBQkxFIGZ0ID0gUGFyc2VDaGFyKGN1ciwgd0N1ciwgZUN1cik7CisgICAgaWYgKGVDdXIgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmIHx8IGVDdXIgPj0gRlhfQ0hBUlRZUEVfQXJhYmljTm9ybWFsKSB7CisgICAgICAgIHJldHVybiB3Q3VyOworICAgIH0KKyAgICBGWF9DSEFSVFlQRSBlUHJldjsKKyAgICBGWF9XQ0hBUiB3UHJldjsKKyAgICBQYXJzZUNoYXIocHJldiwgd1ByZXYsIGVQcmV2KTsKKyAgICBpZiAod1ByZXYgPT0gMHgwNjQ0ICYmIGVDdXIgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgeworICAgICAgICByZXR1cm4gMHhGRUZGOworICAgIH0KKyAgICBGWF9DSEFSVFlQRSBlTmV4dDsKKyAgICBGWF9XQ0hBUiB3TmV4dDsKKyAgICBQYXJzZUNoYXIobmV4dCwgd05leHQsIGVOZXh0KTsKKyAgICBGWF9CT09MIGJBbGVmID0gKGVOZXh0ID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgd0N1ciA9PSAweDY0NCk7CisgICAgaWYgKGVQcmV2IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgeworICAgICAgICBpZiAoYkFsZWYpIHsKKyAgICAgICAgICAgIHJldHVybiBGWF9HZXRBcmFiaWNGcm9tQWxlZlRhYmxlKHdOZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoZU5leHQgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSA/IGZ0LT53SXNvbGF0ZWQgOiBmdC0+d0luaXRpYWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYkFsZWYpIHsKKyAgICAgICAgICAgIHdDdXIgPSBGWF9HZXRBcmFiaWNGcm9tQWxlZlRhYmxlKHdOZXh0KTsKKyAgICAgICAgICAgIHJldHVybiAoZVByZXYgIT0gRlhfQ0hBUlRZUEVfQXJhYmljRGlzdG9ydGlvbikgPyB3Q3VyIDogKysgd0N1cjsKKyAgICAgICAgfSBlbHNlIGlmIChlUHJldiA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmIHx8IGVQcmV2ID09IEZYX0NIQVJUWVBFX0FyYWJpY1NwZWNpYWwpIHsKKyAgICAgICAgICAgIHJldHVybiAoZU5leHQgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSA/IGZ0LT53SXNvbGF0ZWQgOiBmdC0+d0luaXRpYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKGVOZXh0IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgPyBmdC0+d0ZpbmFsIDogZnQtPndNZWRpYWw7CisgICAgICAgIH0KKyAgICB9Cit9CitGWF9MUENBUkJGT1JNVEFCTEUgQ0ZYX0FyYWJpY0NoYXI6OlBhcnNlQ2hhcihjb25zdCBDRlhfQ2hhciAqcFRDLCBGWF9XQ0hBUiAmd0NoYXIsIEZYX0NIQVJUWVBFICZlVHlwZSkgY29uc3QKK3sKKyAgICBpZiAocFRDID09IE5VTEwpIHsKKyAgICAgICAgZVR5cGUgPSBGWF9DSEFSVFlQRV9Vbmtub3duOworICAgICAgICB3Q2hhciA9IDB4RkVGRjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVUeXBlID0gKEZYX0NIQVJUWVBFKXBUQy0+R2V0Q2hhclR5cGUoKTsKKyAgICB3Q2hhciA9IChGWF9XQ0hBUilwVEMtPm1fd0NoYXJDb2RlOworICAgIEZYX0xQQ0FSQkZPUk1UQUJMRSBwRlQgPSBGWF9HZXRBcmFiaWNGb3JtVGFibGUod0NoYXIpOworICAgIGlmIChwRlQgPT0gTlVMTCB8fCBlVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwpIHsKKyAgICAgICAgZVR5cGUgPSBGWF9DSEFSVFlQRV9Vbmtub3duOworICAgIH0KKyAgICByZXR1cm4gcEZUOworfQordm9pZCBGWF9CaWRpUmV2ZXJzZVN0cmluZyhDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBpU3RhcnQsIEZYX0lOVDMyIGlDb3VudCkKK3sKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgd3NUZXh0LkdldExlbmd0aCgpKTsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID49IDAgJiYgaVN0YXJ0ICsgaUNvdW50IDw9IHdzVGV4dC5HZXRMZW5ndGgoKSk7CisgICAgRlhfV0NIQVIgd2NoOworICAgIEZYX0xQV1NUUiBwU3RhcnQgPSAoRlhfTFBXU1RSKShGWF9MUENXU1RSKXdzVGV4dDsKKyAgICBwU3RhcnQgKz0gaVN0YXJ0OworICAgIEZYX0xQV1NUUiBwRW5kID0gcFN0YXJ0ICsgaUNvdW50IC0gMTsKKyAgICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgeworICAgICAgICB3Y2ggPSAqcFN0YXJ0OworICAgICAgICAqcFN0YXJ0ICsrID0gKnBFbmQ7CisgICAgICAgICpwRW5kIC0tID0gd2NoOworICAgIH0KK30KK3ZvaWQgRlhfQmlkaVNldERlZmVycmVkUnVuKENGWF9JbnQzMkFycmF5ICZ2YWx1ZXMsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50LCBGWF9JTlQzMiBpVmFsdWUpCit7CisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8PSB2YWx1ZXMuR2V0U2l6ZSgpKTsKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0IC0gaUNvdW50ID4gLTEpOworICAgIGZvciAoRlhfSU5UMzIgaSA9IGlTdGFydCAtIDE7IGkgPj0gaVN0YXJ0IC0gaUNvdW50OyBpIC0tKSB7CisgICAgICAgIHZhbHVlcy5TZXRBdChpLCBpVmFsdWUpOworICAgIH0KK30KK2NvbnN0IEZYX0lOVDMyIGdjX0ZYX0JpZGlOVHlwZXNbXSA9IHsKKyAgICBGWF9CSURJQ0xBU1NfTiwKKyAgICBGWF9CSURJQ0xBU1NfTCwKKyAgICBGWF9CSURJQ0xBU1NfUiwKKyAgICBGWF9CSURJQ0xBU1NfQU4sCisgICAgRlhfQklESUNMQVNTX0VOLAorICAgIEZYX0JJRElDTEFTU19BTCwKKyAgICBGWF9CSURJQ0xBU1NfTlNNLAorICAgIEZYX0JJRElDTEFTU19DUywKKyAgICBGWF9CSURJQ0xBU1NfRVMsCisgICAgRlhfQklESUNMQVNTX0VULAorICAgIEZYX0JJRElDTEFTU19CTiwKKyAgICBGWF9CSURJQ0xBU1NfQk4sCisgICAgRlhfQklESUNMQVNTX04sCisgICAgRlhfQklESUNMQVNTX0IsCisgICAgRlhfQklESUNMQVNTX1JMTywKKyAgICBGWF9CSURJQ0xBU1NfUkxFLAorICAgIEZYX0JJRElDTEFTU19MUk8sCisgICAgRlhfQklESUNMQVNTX0xSRSwKKyAgICBGWF9CSURJQ0xBU1NfUERGLAorICAgIEZYX0JJRElDTEFTU19PTiwKK307Cit2b2lkIEZYX0JpZGlDbGFzc2lmeShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgRlhfQk9PTCBiV1MpCit7CisgICAgRlhTWVNfYXNzZXJ0KHdzVGV4dC5HZXRMZW5ndGgoKSA9PSBjbGFzc2VzLkdldFNpemUoKSk7CisgICAgRlhfSU5UMzIgaUNvdW50ID0gd3NUZXh0LkdldExlbmd0aCgpOworICAgIEZYX0xQQ1dTVFIgcHdzU3RhcnQgPSAoRlhfTFBDV1NUUil3c1RleHQ7CisgICAgRlhfV0NIQVIgd2NoOworICAgIEZYX0lOVDMyIGlDbHM7CisgICAgaWYgKGJXUykgeworICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7CisgICAgICAgICAgICB3Y2ggPSAqcHdzU3RhcnQgKys7CisgICAgICAgICAgICBpQ2xzID0gKChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUyk7CisgICAgICAgICAgICBjbGFzc2VzLlNldEF0KGksIGlDbHMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgeworICAgICAgICAgICAgd2NoID0gKnB3c1N0YXJ0ICsrOworICAgICAgICAgICAgaUNscyA9ICgoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFMpOworICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBnY19GWF9CaWRpTlR5cGVzW2lDbHNdKTsKKyAgICAgICAgfQorICAgIH0KK30KK0ZYX0lOVDMyIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoRlhfSU5UMzIgaUJhc2VMZXZlbCwgRlhfSU5UMzIgaURpcmVjdGlvbiwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50LCBGWF9JTlQzMiBpTmVzdCkKK3sKKyAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMICYmIGlOZXN0ID49IDApOworICAgIEZYU1lTX2Fzc2VydChjbGFzc2VzLkdldFNpemUoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID49IDAgJiYgaVN0YXJ0IDwgY2xhc3Nlcy5HZXRTaXplKCkpOworICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gY2xhc3Nlcy5HZXRTaXplKCkpOworICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNpZiAwCisgICAgRlhfSU5UMzIgaUxhc3ROZXN0ID0gaU5lc3Q7CisjZW5kaWYKKyAgICBGWF9JTlQzMiBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOworICAgIEZYX0lOVDMyIGkgPSBpU3RhcnQsIGlDdXIsIGlDbHM7CisgICAgZm9yICg7IGkgPCBpU2l6ZSAmJiBpQ291bnQgPiAwOyBpICsrLCBpQ291bnQgLS0pIHsKKyAgICAgICAgaUN1ciA9IGlDbHMgPSBjbGFzc2VzLkdldEF0KGkpOworI2lmIDAKKyAgICAgICAgc3dpdGNoIChpQ2xzKSB7CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUk86CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUkU6CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgICAgICAgICAgIGlDbHMgPSBGWF9CSURJQ0xBU1NfQk47CisgICAgICAgICAgICAgICAgaU5lc3QgKys7CisgICAgICAgICAgICAgICAgaWYgKEZYX0JpZGlHcmVhdGVyRXZlbihpQmFzZUxldmVsKSA8PSBNQVhfTEVWRUwpIHsKKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxldmVsID0gRlhfQmlkaUdyZWF0ZXJFdmVuKGlCYXNlTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpQ2xzID09IEZYX0JJRElDTEFTU19MUkUgPyBGWF9CSURJQ0xBU1NfTiA6IEZYX0JJRElDTEFTU19MKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTmVzdCk7CisgICAgICAgICAgICAgICAgICAgIGlOZXN0IC0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19STE86CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19STEU6CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgICAgICAgICAgIGlDbHMgPSBGWF9CSURJQ0xBU1NfQk47CisgICAgICAgICAgICAgICAgaU5lc3QgKys7CisgICAgICAgICAgICAgICAgaWYgKEZYX0JpZGlHcmVhdGVyT2RkKGlCYXNlTGV2ZWwpIDw9IE1BWF9MRVZFTCkgeworICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGV2ZWwgPSBGWF9CaWRpR3JlYXRlck9kZChpQmFzZUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLlNldEF0KGksIGlMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaUNscyA9PSBGWF9CSURJQ0xBU1NfUkxFID8gRlhfQklESUNMQVNTX04gOiBGWF9CSURJQ0xBU1NfUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU5lc3QpOworICAgICAgICAgICAgICAgICAgICBpTmVzdCAtLTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgICAgICAgICAgIGNsYXNzZXMuU2V0QXQoaSwgRlhfQklESUNMQVNTX0JOKTsKKyAgICAgICAgICAgICAgICBpQ2xzID0gRlhfQklESUNMQVNTX0JOOworICAgICAgICAgICAgICAgIGlmIChpTmVzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaUxhc3ROZXN0IDwgaU5lc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlOZXN0IC0tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaVNpemUgPSBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlDdXIgPSBpQ2xzOworI2VuZGlmCisgICAgICAgIGlmIChpRGlyZWN0aW9uICE9IEZYX0JJRElDTEFTU19OKSB7CisgICAgICAgICAgICBpQ2xzID0gaURpcmVjdGlvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaUN1ciAhPSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNscyk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ZWxzLlNldEF0KGksIGlCYXNlTGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gaSAtIGlTdGFydDsKK30KK2NvbnN0IEZYX0lOVDMyIGdjX0ZYX0JpZGlXZWFrU3RhdGVzW11bMTBdID0geworICAgIHtGWF9CV1NhbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NjbiwJRlhfQldTY24sCUZYX0JXU3hhLAlGWF9CV1N4YSwJRlhfQldTYW8sCUZYX0JXU2FvLAlGWF9CV1Nhb30sCisgICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3hyLAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTbGEsCUZYX0JXU2xlLAlGWF9CV1N4YSwJRlhfQldTeGwsCUZYX0JXU2xvLAlGWF9CV1NsbywJRlhfQldTbHR9LAorICAgIHtGWF9CV1NhbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NjbiwJRlhfQldTY24sCUZYX0JXU3hhLAlGWF9CV1NhbywJRlhfQldTYW8sCUZYX0JXU2FvLAlGWF9CV1Nhb30sCisgICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3JvLAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTbGEsCUZYX0JXU2xlLAlGWF9CV1N4YSwJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsbywJRlhfQldTbHR9LAorICAgIHtGWF9CV1NybywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NyYSwJRlhfQldTcmUsCUZYX0JXU3hhLAlGWF9CV1NydCwJRlhfQldTcm8sCUZYX0JXU3JvLAlGWF9CV1NydH0sCisgICAge0ZYX0JXU2xvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU2xhLAlGWF9CV1NsZSwJRlhfQldTeGEsCUZYX0JXU2x0LAlGWF9CV1NsbywJRlhfQldTbG8sCUZYX0JXU2x0fSwKKyAgICB7RlhfQldTYW8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTY24sCUZYX0JXU2NuLAlGWF9CV1N4YSwJRlhfQldTY24sCUZYX0JXU2FjLAlGWF9CV1NhbywJRlhfQldTYW99LAorICAgIHtGWF9CV1NybywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NyYSwJRlhfQldTcmUsCUZYX0JXU3hhLAlGWF9CV1NyYSwJRlhfQldTcmMsCUZYX0JXU3JvLAlGWF9CV1NydH0sCisgICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3JlLAlGWF9CV1NycywJRlhfQldTcnMsCUZYX0JXU3JldH0sCisgICAge0ZYX0JXU2xvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU2xhLAlGWF9CV1NsZSwJRlhfQldTeGEsCUZYX0JXU2xhLAlGWF9CV1NsYywJRlhfQldTbG8sCUZYX0JXU2x0fSwKKyAgICB7RlhfQldTbG8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTbGEsCUZYX0JXU2xlLAlGWF9CV1N4YSwJRlhfQldTbGUsCUZYX0JXU2xzLAlGWF9CV1NscywJRlhfQldTbGV0fSwKKyAgICB7RlhfQldTYW8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTY24sCUZYX0JXU2NuLAlGWF9CV1N4YSwJRlhfQldTYW8sCUZYX0JXU2FvLAlGWF9CV1NhbywJRlhfQldTYW99LAorICAgIHtGWF9CV1NybywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NyYSwJRlhfQldTcmUsCUZYX0JXU3hhLAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3JvLAlGWF9CV1NydH0sCisgICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3JvLAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTbGEsCUZYX0JXU2xlLAlGWF9CV1N4YSwJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsbywJRlhfQldTbHR9LAorICAgIHtGWF9CV1NsbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NsYSwJRlhfQldTbGUsCUZYX0JXU3hhLAlGWF9CV1NsbywJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsdH0sCisgICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3JldCwJRlhfQldTcm8sCUZYX0JXU3JvLAlGWF9CV1NyZXR9LAorICAgIHtGWF9CV1NsbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NsYSwJRlhfQldTbGUsCUZYX0JXU3hhLAlGWF9CV1NsZXQsCUZYX0JXU2xvLAlGWF9CV1NsbywJRlhfQldTbGV0fSwKK307Citjb25zdCBGWF9JTlQzMiBnY19GWF9CaWRpV2Vha0FjdGlvbnNbXVsxMF0gPSB7CisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsIEZYX0JXQXh4TCwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBRXhFLCBGWF9CV0FOeFIsIEZYX0JXQXhJeCwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTHhMLCBGWF9CV0FOeFIsIEZYX0JXQXhJeCwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsIEZYX0JXQXh4RSwgRlhfQldBeEl4LCBGWF9CV0F4SXgsIEZYX0JXQXh4RX0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsIEZYX0JXQXh4TCwgRlhfQldBeEl4LCBGWF9CV0F4SXgsIEZYX0JXQXh4TH0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBQXhBLCBGWF9CV0FOeFIsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54Tn0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBTnhFLCBGWF9CV0FOeFIsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBRXhFLCBGWF9CV0FOeFIsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBTnhMLCBGWF9CV0FOeFIsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQU54eCwJRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTHhMLCBGWF9CV0FOeFIsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsIEZYX0JXQXh4RSwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4RX0sCisgICAge0ZYX0JXQXh4eCwJRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsIEZYX0JXQXh4TCwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TH0sCit9Owordm9pZCBGWF9CaWRpUmVzb2x2ZVdlYWsoRlhfSU5UMzIgaUJhc2VMZXZlbCwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpCit7CisgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgICAgRlhTWVNfYXNzZXJ0KGNsYXNzZXMuR2V0U2l6ZSgpID09IGxldmVscy5HZXRTaXplKCkpOworICAgIEZYX0lOVDMyIGlTaXplID0gY2xhc3Nlcy5HZXRTaXplKCk7CisgICAgaWYgKGlTaXplIDwgMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlTaXplIC0tOworICAgIEZYX0lOVDMyIGlMZXZlbEN1ciA9IGlCYXNlTGV2ZWw7CisgICAgRlhfSU5UMzIgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CV1N4ciA6IEZYX0JXU3hsOworICAgIEZYX0lOVDMyIGkgPSAwLCBpQ291bnQgPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICAgIGZvciAoOyBpIDw9IGlTaXplOyBpICsrKSB7CisgICAgICAgIGlDbHNDdXIgPSBjbGFzc2VzLkdldEF0KGkpOworI2lmIDAKKyAgICAgICAgaWYgKGlDbHNDdXIgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUxldmVsQ3VyKTsKKyAgICAgICAgICAgIGlmIChpID09IGlTaXplICYmIGlMZXZlbEN1ciAhPSBpQmFzZUxldmVsKSB7CisgICAgICAgICAgICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsQ3VyKTsKKyAgICAgICAgICAgICAgICBjbGFzc2VzLlNldEF0KGksIGlDbHNDdXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgaVNpemUpIHsKKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGV2ZWxOZXh0LCBpTGV2ZWxOZXc7CisgICAgICAgICAgICAgICAgaUNsc05ldyA9IGNsYXNzZXMuR2V0QXQoaSArIDEpOworICAgICAgICAgICAgICAgIGlMZXZlbE5leHQgPSBsZXZlbHMuR2V0QXQoaSArIDEpOworICAgICAgICAgICAgICAgIGlmIChpQ2xzTmV3ICE9IEZYX0JJRElDTEFTU19CTiAmJiBpTGV2ZWxDdXIgIT0gaUxldmVsTmV4dCkgeworICAgICAgICAgICAgICAgICAgICBpTGV2ZWxOZXcgPSBpTGV2ZWxOZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAoaUxldmVsQ3VyID4gaUxldmVsTmV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpTGV2ZWxOZXcgPSBpTGV2ZWxDdXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLlNldEF0KGksIGlMZXZlbE5ldyk7CisgICAgICAgICAgICAgICAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbE5ldyk7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNsc0N1cik7CisgICAgICAgICAgICAgICAgICAgIGlMZXZlbEN1ciA9IGlMZXZlbE5leHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50ICsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBpQ291bnQgKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgRlhTWVNfYXNzZXJ0KGlDbHNDdXIgPD0gRlhfQklESUNMQVNTX0JOKTsKKyAgICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkVHlwZShpQWN0aW9uKTsKKyAgICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFggJiYgaUNvdW50ID4gMCkgeworICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7CisgICAgICAgICAgICBpQ291bnQgPSAwOworICAgICAgICB9CisgICAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGlBY3Rpb24pOworICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCkgeworICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBpQ2xzTmV3KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRlhfQklESVdFQUtBQ1RJT05fSVggJiBpQWN0aW9uKSB7CisgICAgICAgICAgICBpQ291bnQgKys7CisgICAgICAgIH0KKyAgICAgICAgaVN0YXRlID0gZ2NfRlhfQmlkaVdlYWtTdGF0ZXNbaVN0YXRlXVtpQ2xzQ3VyXTsKKyAgICB9CisgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsQ3VyKTsKKyAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkVHlwZShnY19GWF9CaWRpV2Vha0FjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSk7CisgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFggJiYgaUNvdW50ID4gMCkgeworICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2xhc3NlcywgaSwgaUNvdW50LCBpQ2xzUnVuKTsKKyAgICB9Cit9Citjb25zdCBGWF9JTlQzMiBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tdWzVdID0geworICAgIHtGWF9CTlNybiwJRlhfQk5TbCwJRlhfQk5TciwJRlhfQk5TciwJRlhfQk5Tcn0sCisgICAge0ZYX0JOU2xuLAlGWF9CTlNsLAlGWF9CTlNyLAlGWF9CTlNhLAlGWF9CTlNsfSwKKyAgICB7RlhfQk5Tcm4sCUZYX0JOU2wsCUZYX0JOU3IsCUZYX0JOU3IsCUZYX0JOU3J9LAorICAgIHtGWF9CTlNsbiwJRlhfQk5TbCwJRlhfQk5TciwJRlhfQk5TYSwJRlhfQk5TbH0sCisgICAge0ZYX0JOU25hLAlGWF9CTlNsLAlGWF9CTlNyLAlGWF9CTlNhLAlGWF9CTlNsfSwKKyAgICB7RlhfQk5TbmEsCUZYX0JOU2wsCUZYX0JOU3IsCUZYX0JOU2EsCUZYX0JOU2x9LAorfTsKK2NvbnN0IEZYX0lOVDMyIGdjX0ZYX0JpZGlOZXV0cmFsQWN0aW9uc1tdWzVdID0geworICAgIHtGWF9CTkFJbiwgIDAsCQkJMCwJCQkwLAkJCTAJCQl9LAorICAgIHtGWF9CTkFJbiwgIDAsCQkJMCwJCQkwLAkJCUZYX0JDTAkJfSwKKyAgICB7RlhfQk5BSW4sCUZYX0JOQUVuLAlGWF9CTkFSbiwJRlhfQk5BUm4sCUZYX0JOQVJuCX0sCisgICAge0ZYX0JOQUluLAlGWF9CTkFMbiwJRlhfQk5BRW4sCUZYX0JOQUVuLAlGWF9CTkFMbkwJfSwKKyAgICB7RlhfQk5BSW4sICAwLAkJCTAsCQkJMCwJCQlGWF9CQ0wJCX0sCisgICAge0ZYX0JOQUluLAlGWF9CTkFFbiwJRlhfQk5BUm4sCUZYX0JOQVJuLAlGWF9CTkFFbgl9LAorfTsKK0ZYX0lOVDMyIEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKEZYX0lOVDMyIGlBY3Rpb24sIEZYX0lOVDMyIGlMZXZlbCkKK3sKKyAgICBpQWN0aW9uID0gKGlBY3Rpb24gPj4gNCkgJiAweEY7CisgICAgaWYgKGlBY3Rpb24gPT0gKEZYX0JJRElORVVUUkFMQUNUSU9OX0VuID4+IDQpKSB7CisgICAgICAgIHJldHVybiBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGlBY3Rpb247CisgICAgfQorfQorRlhfSU5UMzIgRlhfQmlkaUdldFJlc29sdmVkTmV1dHJhbHMoRlhfSU5UMzIgaUFjdGlvbikKK3sKKyAgICBpQWN0aW9uID0gKGlBY3Rpb24gJiAweEYpOworICAgIGlmIChpQWN0aW9uID09IEZYX0JJRElORVVUUkFMQUNUSU9OX0luKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpQWN0aW9uOworICAgIH0KK30KK3ZvaWQgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhGWF9JTlQzMiBpQmFzZUxldmVsLCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmxldmVscykKK3sKKyAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKKyAgICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgICAgRlhfSU5UMzIgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKKyAgICBpZiAoaVNpemUgPCAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaVNpemUgLS07CisgICAgRlhfSU5UMzIgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICBGWF9JTlQzMiBpU3RhdGUgPSBGWF9Jc09kZChpQmFzZUxldmVsKSA/IEZYX0JOU3IgOiBGWF9CTlNsOworICAgIEZYX0lOVDMyIGkgPSAwLCBpQ291bnQgPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICAgIGZvciAoOyBpIDw9IGlTaXplOyBpICsrKSB7CisgICAgICAgIGlDbHNDdXIgPSBjbGFzc2VzLkdldEF0KGkpOworICAgICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgICAgIGlmIChpQ291bnQpIHsKKyAgICAgICAgICAgICAgICBpQ291bnQgKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBGWFNZU19hc3NlcnQoaUNsc0N1ciA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgICAgIGlBY3Rpb24gPSBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXTsKKyAgICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKGlBY3Rpb24sIGlMZXZlbCk7CisgICAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OICYmIGlDb3VudCA+IDApIHsKKyAgICAgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjbGFzc2VzLCBpLCBpQ291bnQsIGlDbHNSdW4pOworICAgICAgICAgICAgaUNvdW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpQ2xzTmV3ID0gRlhfQmlkaUdldFJlc29sdmVkTmV1dHJhbHMoaUFjdGlvbik7CisgICAgICAgIGlmIChpQ2xzTmV3ICE9IEZYX0JJRElDTEFTU19OKSB7CisgICAgICAgICAgICBjbGFzc2VzLlNldEF0KGksIGlDbHNOZXcpOworICAgICAgICB9CisgICAgICAgIGlmIChGWF9CSURJTkVVVFJBTEFDVElPTl9JbiAmIGlBY3Rpb24pIHsKKyAgICAgICAgICAgIGlDb3VudCArKzsKKyAgICAgICAgfQorICAgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgICBpTGV2ZWwgPSBsZXZlbHMuR2V0QXQoaSk7CisgICAgfQorICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbCk7CisgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKGdjX0ZYX0JpZGlOZXV0cmFsQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdLCBpTGV2ZWwpOworICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OICYmIGlDb3VudCA+IDApIHsKKyAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7CisgICAgfQorfQorY29uc3QgRlhfSU5UMzIgZ2NfRlhfQmlkaUFkZExldmVsW11bNF0gPSB7CisgICAgezAsICAxLCAgMiwgIDJ9LAorICAgIHsxLCAgMCwgIDEsICAxfSwKK307Cit2b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpCit7CisgICAgRlhTWVNfYXNzZXJ0KGNsYXNzZXMuR2V0U2l6ZSgpID09IGxldmVscy5HZXRTaXplKCkpOworICAgIEZYX0lOVDMyIGlTaXplID0gY2xhc3Nlcy5HZXRTaXplKCk7CisgICAgaWYgKGlTaXplIDwgMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlTaXplIC0tOworICAgIEZYX0lOVDMyIGlDbHMsIGlMZXZlbDsKKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDw9IGlTaXplOyBpICsrKSB7CisgICAgICAgIGlDbHMgPSBjbGFzc2VzLkdldEF0KGkpOworICAgICAgICBpZiAoaUNscyA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEZYU1lTX2Fzc2VydChpQ2xzID4gRlhfQklESUNMQVNTX09OICYmIGlDbHMgPCBGWF9CSURJQ0xBU1NfQUwpOworICAgICAgICBpTGV2ZWwgPSBsZXZlbHMuR2V0QXQoaSk7CisgICAgICAgIGlMZXZlbCArPSBnY19GWF9CaWRpQWRkTGV2ZWxbRlhfSXNPZGQoaUxldmVsKV1baUNscyAtIDFdOworICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUxldmVsKTsKKyAgICB9Cit9Cit2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShGWF9JTlQzMiBpQmFzZUxldmVsLCBjb25zdCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgQ0ZYX0ludDMyQXJyYXkgJmxldmVscykKK3sKKyAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKKyAgICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgICAgRlhfSU5UMzIgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKKyAgICBpZiAoaVNpemUgPCAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaVNpemUgLS07CisgICAgRlhfSU5UMzIgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICBGWF9JTlQzMiBpID0gMCwgaUNvdW50ID0gMDsKKyAgICBmb3IgKDsgaSA8PSBpU2l6ZTsgaSArKykgeworICAgICAgICBzd2l0Y2goY2xhc3Nlcy5HZXRBdChpKSkgeworICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfV1M6CisgICAgICAgICAgICAgICAgaUNvdW50ICsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUkxFOgorICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJPOgorICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUkxPOgorICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQk46CisgICAgICAgICAgICAgICAgbGV2ZWxzLlNldEF0KGksIGlMZXZlbCk7CisgICAgICAgICAgICAgICAgaUNvdW50ICsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUzoKKyAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0I6CisgICAgICAgICAgICAgICAgaWYgKGlDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGxldmVscywgaSwgaUNvdW50LCBpQmFzZUxldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGV2ZWxzLlNldEF0KGksIGlCYXNlTGV2ZWwpOworICAgICAgICAgICAgICAgIGlDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaUxldmVsID0gbGV2ZWxzLkdldEF0KGkpOworICAgIH0KKyAgICBpZiAoaUNvdW50ID4gMCkgeworICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4obGV2ZWxzLCBpLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgIH0KK30KK0ZYX0lOVDMyIEZYX0JpZGlSZW9yZGVyTGV2ZWwoRlhfSU5UMzIgaUJhc2VMZXZlbCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmxldmVscywgRlhfSU5UMzIgaVN0YXJ0LCBGWF9CT09MIGJSZXZlcnNlKQoreworICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgIEZYU1lTX2Fzc2VydCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+PSAwICYmIGlTdGFydCA8IHdzVGV4dC5HZXRMZW5ndGgoKSk7CisgICAgRlhfSU5UMzIgaVNpemUgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgICAgaWYgKGlTaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYlJldmVyc2UgPSBiUmV2ZXJzZSB8fCBGWF9Jc09kZChpQmFzZUxldmVsKTsKKyAgICBGWF9JTlQzMiBpID0gaVN0YXJ0LCBpTGV2ZWw7CisgICAgZm9yICg7IGkgPCBpU2l6ZTsgaSArKykgeworICAgICAgICBpZiAoKGlMZXZlbCA9IGxldmVscy5HZXRBdChpKSkgPT0gaUJhc2VMZXZlbCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChpQmFzZUxldmVsICsgMSwgd3NUZXh0LCBsZXZlbHMsIGksIGJSZXZlcnNlKSAtIDE7CisgICAgfQorICAgIEZYX0lOVDMyIGlDb3VudCA9IGkgLSBpU3RhcnQ7CisgICAgaWYgKGJSZXZlcnNlICYmIGlDb3VudCA+IDEpIHsKKyAgICAgICAgRlhfQmlkaVJldmVyc2VTdHJpbmcod3NUZXh0LCBpU3RhcnQsIGlDb3VudCk7CisgICAgfQorICAgIHJldHVybiBpQ291bnQ7Cit9Cit2b2lkIEZYX0JpZGlSZW9yZGVyKEZYX0lOVDMyIGlCYXNlTGV2ZWwsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZsZXZlbHMpCit7CisgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgICAgRlhTWVNfYXNzZXJ0KHdzVGV4dC5HZXRMZW5ndGgoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKKyAgICBGWF9JTlQzMiBpU2l6ZSA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgICBpZiAoaVNpemUgPCAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfSU5UMzIgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBpU2l6ZSkgeworICAgICAgICBpICs9IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaUJhc2VMZXZlbCwgd3NUZXh0LCBsZXZlbHMsIGksIEZBTFNFKTsKKyAgICB9Cit9Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwpCit7CisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgICBpZiAoaUxlbmd0aCA8IDIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDRlhfSW50MzJBcnJheSBjbGFzc2VzLCBsZXZlbHM7CisgICAgY2xhc3Nlcy5TZXRBdEdyb3coaUxlbmd0aCAtIDEsIDApOworICAgIGxldmVscy5TZXRBdEdyb3coaUxlbmd0aCAtIDEsIDApOworICAgIEZYX0JpZGlDbGFzc2lmeSh3c1RleHQsIGNsYXNzZXMsIEZBTFNFKTsKKyAgICBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGlCYXNlTGV2ZWwsIEZYX0JJRElDTEFTU19OLCBjbGFzc2VzLCBsZXZlbHMsIDAsIGlMZW5ndGgsIDApOworICAgIEZYX0JpZGlSZXNvbHZlV2VhayhpQmFzZUxldmVsLCBjbGFzc2VzLCBsZXZlbHMpOworICAgIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoaUJhc2VMZXZlbCwgY2xhc3NlcywgbGV2ZWxzKTsKKyAgICBGWF9CaWRpUmVzb2x2ZUltcGxpY2l0KGNsYXNzZXMsIGxldmVscyk7CisgICAgRlhfQmlkaUNsYXNzaWZ5KHdzVGV4dCwgY2xhc3NlcywgVFJVRSk7CisgICAgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKGlCYXNlTGV2ZWwsIGNsYXNzZXMsIGxldmVscyk7CisgICAgRlhfQmlkaVJlb3JkZXIoaUJhc2VMZXZlbCwgd3NUZXh0LCBsZXZlbHMpOworICAgIGNsYXNzZXMuUmVtb3ZlQWxsKCk7CisgICAgbGV2ZWxzLlJlbW92ZUFsbCgpOworfQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfQmlkaUxpbmVUZW1wbGF0ZQoreworcHVibGljOgorICAgIHZvaWQgRlhfQmlkaVJldmVyc2VTdHJpbmcoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpQ291bnQpCisgICAgeworICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICAgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+PSAwICYmIGlTdGFydCArIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgICAgICBiYXNlVHlwZSAqcFN0YXJ0LCAqcEVuZDsKKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IGlTdGFydCArIGlDb3VudCAtIDEsIGlUZW1wOworICAgICAgICB3aGlsZSAoaVN0YXJ0IDwgaUVuZCkgeworICAgICAgICAgICAgcFN0YXJ0ID0gY2hhcnMuR2V0RGF0YVB0cihpU3RhcnQgKyspOworICAgICAgICAgICAgcEVuZCA9IGNoYXJzLkdldERhdGFQdHIoaUVuZCAtLSk7CisgICAgICAgICAgICBpVGVtcCA9IHBTdGFydC0+bV9pQmlkaVBvczsKKyAgICAgICAgICAgIHBTdGFydC0+bV9pQmlkaVBvcyA9IHBFbmQtPm1faUJpZGlQb3M7CisgICAgICAgICAgICBwRW5kLT5tX2lCaWRpUG9zID0gaVRlbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgRlhfQk9PTCBiQ2xhc3MsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50LCBGWF9JTlQzMiBpVmFsdWUpCisgICAgeworICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgLSBpQ291bnQgPiAtMSk7CisgICAgICAgIGJhc2VUeXBlICpwVEM7CisgICAgICAgIEZYX0lOVDMyIGlMYXN0ID0gaVN0YXJ0IC0gaUNvdW50OworICAgICAgICBpZiAoYkNsYXNzKSB7CisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpIC0tKSB7CisgICAgICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChGWF9JTlQxNilpVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpIC0tKSB7CisgICAgICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChGWF9JTlQxNilpVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBGWF9CaWRpQ2xhc3NpZnkoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgRlhfSU5UMzIgaUNvdW50LCBGWF9CT09MIGJXUykKKyAgICB7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICAgICAgYmFzZVR5cGUgKnBUQzsKKyAgICAgICAgaWYgKGJXUykgeworICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgeworICAgICAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoRlhfSU5UMTYpKHBUQy0+bV9kd0NoYXJQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgeworICAgICAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoRlhfSU5UMTYpZ2NfRlhfQmlkaU5UeXBlc1socFRDLT5tX2R3Q2hhclByb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFNdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwpCisgICAgeworICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgICAgICBpZiAoaUNvdW50IDwgMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJhc2VUeXBlICpwVEM7CisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChGWF9JTlQxNilpQmFzZUxldmVsOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIEZYX0lOVDMyIGlDb3VudCwgRlhfSU5UMzIgaUJhc2VMZXZlbCkKKyAgICB7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICAgICAgaUNvdW50IC0tOworICAgICAgICBpZiAoaUNvdW50IDwgMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJhc2VUeXBlICpwVEMsICpwVENOZXh0OworICAgICAgICBGWF9JTlQzMiBpTGV2ZWxDdXIgPSBpQmFzZUxldmVsOworICAgICAgICBGWF9JTlQzMiBpU3RhdGUgPSBGWF9Jc09kZChpQmFzZUxldmVsKSA/IEZYX0JXU3hyIDogRlhfQldTeGw7CisgICAgICAgIEZYX0lOVDMyIGkgPSAwLCBpTnVtID0gMCwgaUNsc0N1ciwgaUNsc1J1biwgaUNsc05ldywgaUFjdGlvbjsKKyAgICAgICAgZm9yICg7IGkgPD0gaUNvdW50OyBpICsrKSB7CisgICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgICAgICAgaUNsc0N1ciA9IHBUQy0+bV9pQmlkaUNsYXNzOworICAgICAgICAgICAgaWYgKGlDbHNDdXIgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoRlhfSU5UMTYpaUxldmVsQ3VyOworICAgICAgICAgICAgICAgIGlmIChpID09IGlDb3VudCAmJiBpTGV2ZWxDdXIgIT0gaUJhc2VMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWxDdXIpOworICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChGWF9JTlQxNilpQ2xzQ3VyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBwVENOZXh0ID0gY2hhcnMuR2V0RGF0YVB0cihpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMZXZlbE5leHQsIGlMZXZlbE5ldzsKKyAgICAgICAgICAgICAgICAgICAgaUNsc05ldyA9IHBUQ05leHQtPm1faUJpZGlDbGFzczsKKyAgICAgICAgICAgICAgICAgICAgaUxldmVsTmV4dCA9IHBUQ05leHQtPm1faUJpZGlMZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX0JOICYmIGlMZXZlbEN1ciAhPSBpTGV2ZWxOZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpTGV2ZWxOZXcgPSBpTGV2ZWxOZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlMZXZlbEN1ciA+IGlMZXZlbE5ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbEN1cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKEZYX0lOVDE2KWlMZXZlbE5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbE5ldyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChGWF9JTlQxNilpQ2xzQ3VyOworICAgICAgICAgICAgICAgICAgICAgICAgaUxldmVsQ3VyID0gaUxldmVsTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTnVtID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlOdW0gKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpTnVtID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaU51bSArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGWFNZU19hc3NlcnQoaUNsc0N1ciA8PSBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7CisgICAgICAgICAgICBpZiAoaUNsc1J1biAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCAmJiBpTnVtID4gMCkgeworICAgICAgICAgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgVFJVRSwgaSwgaU51bSwgaUNsc1J1bik7CisgICAgICAgICAgICAgICAgaU51bSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpQ2xzTmV3ID0gRlhfQmlkaUdldFJlc29sdmVkVHlwZShpQWN0aW9uKTsKKyAgICAgICAgICAgIGlmIChpQ2xzTmV3ICE9IEZYX0JJRElXRUFLQUNUSU9OX1hYKSB7CisgICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoRlhfSU5UMTYpaUNsc05ldzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChGWF9CSURJV0VBS0FDVElPTl9JWCAmIGlBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBpTnVtICsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaVN0YXRlID0gZ2NfRlhfQmlkaVdlYWtTdGF0ZXNbaVN0YXRlXVtpQ2xzQ3VyXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaU51bSA+IDApIHsKKyAgICAgICAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlCYXNlTGV2ZWwpOworICAgICAgICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0pOworICAgICAgICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKKyAgICAgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIFRSVUUsIGksIGlOdW0sIGlDbHNSdW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwpCisgICAgeworICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgICAgICBpQ291bnQgLS07CisgICAgICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYmFzZVR5cGUgKnBUQzsKKyAgICAgICAgRlhfSU5UMzIgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICAgICAgRlhfSU5UMzIgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CTlNyIDogRlhfQk5TbDsKKyAgICAgICAgRlhfSU5UMzIgaSA9IDAsIGlOdW0gPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICAgICAgICBmb3IgKDsgaSA8PSBpQ291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgICAgICBpQ2xzQ3VyID0gcFRDLT5tX2lCaWRpQ2xhc3M7CisgICAgICAgICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgICAgICAgICBpZiAoaU51bSkgeworICAgICAgICAgICAgICAgICAgICBpTnVtICsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChpQ2xzQ3VyIDwgRlhfQklESUNMQVNTX0FMKTsKKyAgICAgICAgICAgIGlBY3Rpb24gPSBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXTsKKyAgICAgICAgICAgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscyhpQWN0aW9uLCBpTGV2ZWwpOworICAgICAgICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04gJiYgaU51bSA+IDApIHsKKyAgICAgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIFRSVUUsIGksIGlOdW0sIGlDbHNSdW4pOworICAgICAgICAgICAgICAgIGlOdW0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaUNsc05ldyA9IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGlBY3Rpb24pOworICAgICAgICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChGWF9JTlQxNilpQ2xzTmV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEZYX0JJRElORVVUUkFMQUNUSU9OX0luICYgaUFjdGlvbikgeworICAgICAgICAgICAgICAgIGlOdW0gKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWwpOworICAgICAgICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKGdjX0ZYX0JpZGlOZXV0cmFsQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdLCBpTGV2ZWwpOworICAgICAgICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIFRSVUUsIGksIGlOdW0sIGlDbHNSdW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgRlhfQmlkaVJlc29sdmVJbXBsaWNpdChDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQpCisgICAgeworICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgICAgIGJhc2VUeXBlICpwVEM7CisgICAgICAgIEZYX0lOVDMyIGlDbHMsIGlMZXZlbDsKKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgeworICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgICAgICAgIGlDbHMgPSBwVEMtPm1faUJpZGlDbGFzczsKKyAgICAgICAgICAgIGlmIChpQ2xzID09IEZYX0JJRElDTEFTU19CTikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGlDbHMgPiBGWF9CSURJQ0xBU1NfT04gJiYgaUNscyA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgICAgICAgICBpTGV2ZWwgPSBwVEMtPm1faUJpZGlMZXZlbDsKKyAgICAgICAgICAgIGlMZXZlbCArPSBnY19GWF9CaWRpQWRkTGV2ZWxbRlhfSXNPZGQoaUxldmVsKV1baUNscyAtIDFdOworICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoRlhfSU5UMTYpaUxldmVsOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIEZYX0lOVDMyIGlDb3VudCwgRlhfSU5UMzIgaUJhc2VMZXZlbCkKKyAgICB7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICAgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgICAgICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaUNvdW50IC0tOworICAgICAgICBGWF9JTlQzMiBpTGV2ZWwgPSBpQmFzZUxldmVsOworICAgICAgICBGWF9JTlQzMiBpID0gMCwgaU51bSA9IDA7CisgICAgICAgIGJhc2VUeXBlICpwVEM7CisgICAgICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSArKykgeworICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgICAgICAgIHN3aXRjaChwVEMtPm1faUJpZGlDbGFzcykgeworICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1dTOgorICAgICAgICAgICAgICAgICAgICBpTnVtICsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19STEU6CisgICAgICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0xSTzoKKyAgICAgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19STE86CisgICAgICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0JOOgorICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChGWF9JTlQxNilpTGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGlOdW0gKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1M6CisgICAgICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIEZBTFNFLCBpLCBpTnVtLCBpQmFzZUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChGWF9JTlQxNilpQmFzZUxldmVsOworICAgICAgICAgICAgICAgICAgICBpTnVtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaU51bSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIEZBTFNFLCBpLCBpTnVtLCBpQmFzZUxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGWF9JTlQzMiBGWF9CaWRpUmVvcmRlckxldmVsKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIEZYX0lOVDMyIGlDb3VudCwgRlhfSU5UMzIgaUJhc2VMZXZlbCwgRlhfSU5UMzIgaVN0YXJ0LCBGWF9CT09MIGJSZXZlcnNlKQorICAgIHsKKyAgICAgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgICAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKKyAgICAgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+PSAwICYmIGlTdGFydCA8IGlDb3VudCk7CisgICAgICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBiYXNlVHlwZSAqcFRDOworICAgICAgICBiUmV2ZXJzZSA9IGJSZXZlcnNlIHx8IEZYX0lzT2RkKGlCYXNlTGV2ZWwpOworICAgICAgICBGWF9JTlQzMiBpID0gaVN0YXJ0LCBpTGV2ZWw7CisgICAgICAgIGZvciAoOyBpIDwgaUNvdW50OyBpICsrKSB7CisgICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgICAgICAgaWYgKChpTGV2ZWwgPSBwVEMtPm1faUJpZGlMZXZlbCkgPT0gaUJhc2VMZXZlbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsICsgMSwgaSwgYlJldmVyc2UpIC0gMTsKKyAgICAgICAgfQorICAgICAgICBGWF9JTlQzMiBpTnVtID0gaSAtIGlTdGFydDsKKyAgICAgICAgaWYgKGJSZXZlcnNlICYmIGlOdW0gPiAxKSB7CisgICAgICAgICAgICBGWF9CaWRpUmV2ZXJzZVN0cmluZyhjaGFycywgaVN0YXJ0LCBpTnVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaU51bTsKKyAgICB9CisgICAgdm9pZCBGWF9CaWRpUmVvcmRlcihDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwpCisgICAgeworICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgICAgICBGWF9JTlQzMiBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgICAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsLCBpLCBGQUxTRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBGWF9CaWRpUG9zaXRpb24oQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgRlhfSU5UMzIgaUNvdW50KQorICAgIHsKKyAgICAgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgICAgICBiYXNlVHlwZSAqcFRDOworICAgICAgICBGWF9JTlQzMiBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKHBUQy0+bV9pQmlkaVBvcyk7CisgICAgICAgICAgICBwVEMtPm1faUJpZGlPcmRlciA9IGkgKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEZYX0JpZGlMaW5lKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIEZYX0lOVDMyIGlDb3VudCwgRlhfSU5UMzIgaUJhc2VMZXZlbCkKKyAgICB7CisgICAgICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICAgICAgaWYgKGlDb3VudCA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGWF9CaWRpQ2xhc3NpZnkoY2hhcnMsIGlDb3VudCwgRkFMU0UpOworICAgICAgICBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgICAgICBGWF9CaWRpUmVzb2x2ZVdlYWsoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7CisgICAgICAgIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7CisgICAgICAgIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY2hhcnMsIGlDb3VudCk7CisgICAgICAgIEZYX0JpZGlDbGFzc2lmeShjaGFycywgaUNvdW50LCBUUlVFKTsKKyAgICAgICAgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgICAgICBGWF9CaWRpUmVvcmRlcihjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKKyAgICAgICAgRlhfQmlkaVBvc2l0aW9uKGNoYXJzLCBpQ291bnQpOworICAgIH0KK307Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9UeHRDaGFyQXJyYXkgJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwpCit7CisgICAgQ0ZYX0JpZGlMaW5lVGVtcGxhdGU8Q0ZYX1R4dENoYXI+IGJsdDsKKyAgICBibHQuRlhfQmlkaUxpbmUoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7Cit9Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9SVEZDaGFyQXJyYXkgJmNoYXJzLCBGWF9JTlQzMiBpQ291bnQsIEZYX0lOVDMyIGlCYXNlTGV2ZWwpCit7CisgICAgQ0ZYX0JpZGlMaW5lVGVtcGxhdGU8Q0ZYX1JURkNoYXI+IGJsdDsKKyAgICBibHQuRlhfQmlkaUxpbmUoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7Cit9CiBJRlhfQmlkaUNoYXIqIElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCkKIHsKICAgICByZXR1cm4gRlhfTkVXIENGWF9CaWRpQ2hhcjsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5oIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKaW5kZXggYzQwNDQ0OS4uZTQ0YmZiOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKQEAgLTYsNyArNiwxODAgQEAKIAogI2lmbmRlZiBfRlhfQVJBQklDX0lNUAogI2RlZmluZSBfRlhfQVJBQklDX0lNUAotY2xhc3MgQ0ZYX0JpZGlDaGFyIEZYX0ZJTkFMIDogcHVibGljIElGWF9CaWRpQ2hhciwgcHVibGljIENGWF9PYmplY3QKK3R5cGVkZWYgc3RydWN0IF9GWF9BUkFCSUNDSEFSUkFOR0UgeworICAgIEZYX1dDSEFSIHdTdGFydDsKKyAgICBGWF9XQ0hBUiB3RW5kOworfSBGWF9BUkFCSUNDSEFSUkFOR0U7CitjbGFzcyBDRlhfQXJhYmljQ2hhciA6IHB1YmxpYyBJRlhfQXJhYmljQ2hhciwgcHVibGljIENGWF9PYmplY3QKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKQorICAgIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNBcmFiaWNDaGFyKEZYX1dDSEFSIHdjaCkgY29uc3Q7CisgICAgdmlydHVhbCBGWF9CT09MCQlJc0FyYWJpY0Zvcm1DaGFyKEZYX1dDSEFSIHdjaCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldEZvcm1DaGFyKEZYX1dDSEFSIHdjaCwgRlhfV0NIQVIgcHJldiA9IDAsIEZYX1dDSEFSIG5leHQgPSAwKSBjb25zdDsKKyAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldEZvcm1DaGFyKGNvbnN0IENGWF9DaGFyICpjdXIsIGNvbnN0IENGWF9DaGFyICpwcmV2LCBjb25zdCBDRlhfQ2hhciAqbmV4dCkgY29uc3Q7Citwcm90ZWN0ZWQ6CisgICAgRlhfTFBDQVJCRk9STVRBQkxFIFBhcnNlQ2hhcihjb25zdCBDRlhfQ2hhciAqcFRDLCBGWF9XQ0hBUiAmd0NoYXIsIEZYX0NIQVJUWVBFICZlVHlwZSkgY29uc3Q7Cit9Owordm9pZCBGWF9CaWRpUmV2ZXJzZVN0cmluZyhDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBpU3RhcnQsIEZYX0lOVDMyIGlDb3VudCk7Cit2b2lkIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihDRlhfSW50MzJBcnJheSAmdmFsdWVzLCBGWF9JTlQzMiBpU3RhcnQsIEZYX0lOVDMyIGlDb3VudCwgRlhfSU5UMzIgaVZhbHVlKTsKKyNkZWZpbmUgRlhfQkNPTgkJRlhfQklESUNMQVNTX09OCisjZGVmaW5lIEZYX0JDTAkJRlhfQklESUNMQVNTX0wKKyNkZWZpbmUgRlhfQkNSCQlGWF9CSURJQ0xBU1NfUgorI2RlZmluZSBGWF9CQ0FOCQlGWF9CSURJQ0xBU1NfQU4KKyNkZWZpbmUgRlhfQkNFTgkJRlhfQklESUNMQVNTX0VOCisjZGVmaW5lIEZYX0JDQUwJCUZYX0JJRElDTEFTU19BTAorI2RlZmluZSBGWF9CQ05TTQlGWF9CSURJQ0xBU1NfTlNNCisjZGVmaW5lIEZYX0JDQ1MJCUZYX0JJRElDTEFTU19DUworI2RlZmluZSBGWF9CQ0VTCQlGWF9CSURJQ0xBU1NfRVMKKyNkZWZpbmUgRlhfQkNFVAkJRlhfQklESUNMQVNTX0VUCisjZGVmaW5lIEZYX0JDQk4JCUZYX0JJRElDTEFTU19CTgorI2RlZmluZSBGWF9CQ1MJCUZYX0JJRElDTEFTU19TCisjZGVmaW5lIEZYX0JDV1MJCUZYX0JJRElDTEFTU19XUworI2RlZmluZSBGWF9CQ0IJCUZYX0JJRElDTEFTU19CCisjZGVmaW5lIEZYX0JDUkxPCUZYX0JJRElDTEFTU19STE8KKyNkZWZpbmUgRlhfQkNSTEUJRlhfQklESUNMQVNTX1JMRQorI2RlZmluZSBGWF9CQ0xSTwlGWF9CSURJQ0xBU1NfTFJPCisjZGVmaW5lIEZYX0JDTFJFCUZYX0JJRElDTEFTU19MUkUKKyNkZWZpbmUgRlhfQkNQREYJRlhfQklESUNMQVNTX1BERgorI2RlZmluZSBGWF9CQ04JCUZYX0JJRElDTEFTU19OCit2b2lkIEZYX0JpZGlDbGFzc2lmeShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgRlhfQk9PTCBiV1MgPSBGQUxTRSk7CisjZGVmaW5lIEZYX0JJRElNQVhMRVZFTAkJCTYxCisjZGVmaW5lIEZYX0JpZGlHcmVhdGVyRXZlbihhKQkoRlhfSXNPZGQoYSkgPyAoKGEpICsgMSkgOiAoKGEpICsgMikpCisjZGVmaW5lIEZYX0JpZGlHcmVhdGVyT2RkKGEpCShGWF9Jc09kZChhKSA/ICgoYSkgKyAyKSA6ICgoYSkgKyAxKSkKK0ZYX0lOVDMyIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoRlhfSU5UMzIgaUJhc2VMZXZlbCwgRlhfSU5UMzIgaURpcmVjdGlvbiwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50LCBGWF9JTlQzMiBpTmVzdCA9IDApOworI2RlZmluZSBGWF9CaWRpRGlyZWN0aW9uKGEpCShGWF9Jc09kZChhKSA/IEZYX0JJRElDTEFTU19SIDogRlhfQklESUNMQVNTX0wpCitlbnVtIEZYX0JJRElXRUFLU1RBVEUgeworICAgIEZYX0JJRElXRUFLU1RBVEVfeGEgPSAwLAorICAgIEZYX0JJRElXRUFLU1RBVEVfeHIsCisgICAgRlhfQklESVdFQUtTVEFURV94bCwKKyAgICBGWF9CSURJV0VBS1NUQVRFX2FvLAorICAgIEZYX0JJRElXRUFLU1RBVEVfcm8sCisgICAgRlhfQklESVdFQUtTVEFURV9sbywKKyAgICBGWF9CSURJV0VBS1NUQVRFX3J0LAorICAgIEZYX0JJRElXRUFLU1RBVEVfbHQsCisgICAgRlhfQklESVdFQUtTVEFURV9jbiwKKyAgICBGWF9CSURJV0VBS1NUQVRFX3JhLAorICAgIEZYX0JJRElXRUFLU1RBVEVfcmUsCisgICAgRlhfQklESVdFQUtTVEFURV9sYSwKKyAgICBGWF9CSURJV0VBS1NUQVRFX2xlLAorICAgIEZYX0JJRElXRUFLU1RBVEVfYWMsCisgICAgRlhfQklESVdFQUtTVEFURV9yYywKKyAgICBGWF9CSURJV0VBS1NUQVRFX3JzLAorICAgIEZYX0JJRElXRUFLU1RBVEVfbGMsCisgICAgRlhfQklESVdFQUtTVEFURV9scywKKyAgICBGWF9CSURJV0VBS1NUQVRFX3JldCwKKyAgICBGWF9CSURJV0VBS1NUQVRFX2xldCwKK307CisjZGVmaW5lIEZYX0JXU3hhCUZYX0JJRElXRUFLU1RBVEVfeGEKKyNkZWZpbmUgRlhfQldTeHIJRlhfQklESVdFQUtTVEFURV94cgorI2RlZmluZSBGWF9CV1N4bAlGWF9CSURJV0VBS1NUQVRFX3hsCisjZGVmaW5lIEZYX0JXU2FvCUZYX0JJRElXRUFLU1RBVEVfYW8KKyNkZWZpbmUgRlhfQldTcm8JRlhfQklESVdFQUtTVEFURV9ybworI2RlZmluZSBGWF9CV1NsbwlGWF9CSURJV0VBS1NUQVRFX2xvCisjZGVmaW5lIEZYX0JXU3J0CUZYX0JJRElXRUFLU1RBVEVfcnQKKyNkZWZpbmUgRlhfQldTbHQJRlhfQklESVdFQUtTVEFURV9sdAorI2RlZmluZSBGWF9CV1NjbglGWF9CSURJV0VBS1NUQVRFX2NuCisjZGVmaW5lIEZYX0JXU3JhCUZYX0JJRElXRUFLU1RBVEVfcmEKKyNkZWZpbmUgRlhfQldTcmUJRlhfQklESVdFQUtTVEFURV9yZQorI2RlZmluZSBGWF9CV1NsYQlGWF9CSURJV0VBS1NUQVRFX2xhCisjZGVmaW5lIEZYX0JXU2xlCUZYX0JJRElXRUFLU1RBVEVfbGUKKyNkZWZpbmUgRlhfQldTYWMJRlhfQklESVdFQUtTVEFURV9hYworI2RlZmluZSBGWF9CV1NyYwlGWF9CSURJV0VBS1NUQVRFX3JjCisjZGVmaW5lIEZYX0JXU3JzCUZYX0JJRElXRUFLU1RBVEVfcnMKKyNkZWZpbmUgRlhfQldTbGMJRlhfQklESVdFQUtTVEFURV9sYworI2RlZmluZSBGWF9CV1NscwlGWF9CSURJV0VBS1NUQVRFX2xzCisjZGVmaW5lIEZYX0JXU3JldAlGWF9CSURJV0VBS1NUQVRFX3JldAorI2RlZmluZSBGWF9CV1NsZXQJRlhfQklESVdFQUtTVEFURV9sZXQKK2VudW0gRlhfQklESVdFQUtBQ1RJT04geworICAgIEZYX0JJRElXRUFLQUNUSU9OX0lYID0gMHgxMDAsCisgICAgRlhfQklESVdFQUtBQ1RJT05fWFggPSAweDBGLAorICAgIEZYX0JJRElXRUFLQUNUSU9OX3h4eCA9ICgweDBGIDw8IDQpICsgMHgwRiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl94SXggPSAweDEwMCArIEZYX0JJRElXRUFLQUNUSU9OX3h4eCwKKyAgICBGWF9CSURJV0VBS0FDVElPTl94eE4gPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19PTiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl94eEUgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl94eEEgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19BTiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl94eFIgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAorICAgIEZYX0JJRElXRUFLQUNUSU9OX3h4TCA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgICAgRlhfQklESVdFQUtBQ1RJT05fTnh4ID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIDB4MEYsCisgICAgRlhfQklESVdFQUtBQ1RJT05fQXh4ID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIDB4MEYsCisgICAgRlhfQklESVdFQUtBQ1RJT05fRXhFID0gKEZYX0JJRElDTEFTU19FTiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl9OSXggPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgMHgwRiArIDB4MTAwLAorICAgIEZYX0JJRElXRUFLQUNUSU9OX054TiA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfT04sCisgICAgRlhfQklESVdFQUtBQ1RJT05fTnhSID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAorICAgIEZYX0JJRElXRUFLQUNUSU9OX054RSA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfRU4sCisgICAgRlhfQklESVdFQUtBQ1RJT05fQXhBID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIEZYX0JJRElDTEFTU19BTiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl9OeEwgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgICAgRlhfQklESVdFQUtBQ1RJT05fTHhMID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgICAgRlhfQklESVdFQUtBQ1RJT05feElMID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCArIDB4MTAwLAorICAgIEZYX0JJRElXRUFLQUNUSU9OX0F4UiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCkgKyBGWF9CSURJQ0xBU1NfUiwKKyAgICBGWF9CSURJV0VBS0FDVElPTl9MeHggPSAoRlhfQklESUNMQVNTX0wgPDwgNCkgKyAweDBGLAorfTsKKyNkZWZpbmUgRlhfQldBSVgJRlhfQklESVdFQUtBQ1RJT05fSVgKKyNkZWZpbmUgRlhfQldBWFgJRlhfQklESVdFQUtBQ1RJT05fWFgKKyNkZWZpbmUgRlhfQldBeHh4CUZYX0JJRElXRUFLQUNUSU9OX3h4eAorI2RlZmluZSBGWF9CV0F4SXgJRlhfQklESVdFQUtBQ1RJT05feEl4CisjZGVmaW5lIEZYX0JXQXh4TglGWF9CSURJV0VBS0FDVElPTl94eE4KKyNkZWZpbmUgRlhfQldBeHhFCUZYX0JJRElXRUFLQUNUSU9OX3h4RQorI2RlZmluZSBGWF9CV0F4eEEJRlhfQklESVdFQUtBQ1RJT05feHhBCisjZGVmaW5lIEZYX0JXQXh4UglGWF9CSURJV0VBS0FDVElPTl94eFIKKyNkZWZpbmUgRlhfQldBeHhMCUZYX0JJRElXRUFLQUNUSU9OX3h4TAorI2RlZmluZSBGWF9CV0FOeHgJRlhfQklESVdFQUtBQ1RJT05fTnh4CisjZGVmaW5lIEZYX0JXQUF4eAlGWF9CSURJV0VBS0FDVElPTl9BeHgKKyNkZWZpbmUgRlhfQldBRXhFCUZYX0JJRElXRUFLQUNUSU9OX0V4RQorI2RlZmluZSBGWF9CV0FOSXgJRlhfQklESVdFQUtBQ1RJT05fTkl4CisjZGVmaW5lIEZYX0JXQU54TglGWF9CSURJV0VBS0FDVElPTl9OeE4KKyNkZWZpbmUgRlhfQldBTnhSCUZYX0JJRElXRUFLQUNUSU9OX054UgorI2RlZmluZSBGWF9CV0FOeEUJRlhfQklESVdFQUtBQ1RJT05fTnhFCisjZGVmaW5lIEZYX0JXQUF4QQlGWF9CSURJV0VBS0FDVElPTl9BeEEKKyNkZWZpbmUgRlhfQldBTnhMCUZYX0JJRElXRUFLQUNUSU9OX054TAorI2RlZmluZSBGWF9CV0FMeEwJRlhfQklESVdFQUtBQ1RJT05fTHhMCisjZGVmaW5lIEZYX0JXQXhJTAlGWF9CSURJV0VBS0FDVElPTl94SUwKKyNkZWZpbmUgRlhfQldBQXhSCUZYX0JJRElXRUFLQUNUSU9OX0F4UgorI2RlZmluZSBGWF9CV0FMeHgJRlhfQklESVdFQUtBQ1RJT05fTHh4CisjZGVmaW5lIEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoYSkJKCgoYSkgPj4gNCkgJiAweDBGKQorI2RlZmluZSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGEpCSgoYSkgJiAweDBGKQordm9pZCBGWF9CaWRpUmVzb2x2ZVdlYWsoRlhfSU5UMzIgaUJhc2VMZXZlbCwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpOworZW51bSBGWF9CSURJTkVVVFJBTFNUQVRFIHsKKyAgICBGWF9CSURJTkVVVFJBTFNUQVRFX3IgPSAwLAorICAgIEZYX0JJRElORVVUUkFMU1RBVEVfbCwKKyAgICBGWF9CSURJTkVVVFJBTFNUQVRFX3JuLAorICAgIEZYX0JJRElORVVUUkFMU1RBVEVfbG4sCisgICAgRlhfQklESU5FVVRSQUxTVEFURV9hLAorICAgIEZYX0JJRElORVVUUkFMU1RBVEVfbmEsCit9OworI2RlZmluZSBGWF9CTlNyCQlGWF9CSURJTkVVVFJBTFNUQVRFX3IKKyNkZWZpbmUgRlhfQk5TbAkJRlhfQklESU5FVVRSQUxTVEFURV9sCisjZGVmaW5lIEZYX0JOU3JuCUZYX0JJRElORVVUUkFMU1RBVEVfcm4KKyNkZWZpbmUgRlhfQk5TbG4JRlhfQklESU5FVVRSQUxTVEFURV9sbgorI2RlZmluZSBGWF9CTlNhCQlGWF9CSURJTkVVVFJBTFNUQVRFX2EKKyNkZWZpbmUgRlhfQk5TbmEJRlhfQklESU5FVVRSQUxTVEFURV9uYQorZW51bSBGWF9CSURJTkVVVFJBTEFDVElPTiB7CisgICAgRlhfQklESU5FVVRSQUxBQ1RJT05fbkwgPSBGWF9CSURJQ0xBU1NfTCwKKyAgICBGWF9CSURJTkVVVFJBTEFDVElPTl9FbiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCksCisgICAgRlhfQklESU5FVVRSQUxBQ1RJT05fUm4gPSAoRlhfQklESUNMQVNTX1IgPDwgNCksCisgICAgRlhfQklESU5FVVRSQUxBQ1RJT05fTG4gPSAoRlhfQklESUNMQVNTX0wgPDwgNCksCisgICAgRlhfQklESU5FVVRSQUxBQ1RJT05fSW4gPSBGWF9CSURJV0VBS0FDVElPTl9JWCwKKyAgICBGWF9CSURJTkVVVFJBTEFDVElPTl9MbkwgPSAoRlhfQklESUNMQVNTX0wgPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCwKK307CisjZGVmaW5lIEZYX0JOQW5MCUZYX0JJRElORVVUUkFMQUNUSU9OX25MCisjZGVmaW5lIEZYX0JOQUVuCUZYX0JJRElORVVUUkFMQUNUSU9OX0VuCisjZGVmaW5lIEZYX0JOQVJuCUZYX0JJRElORVVUUkFMQUNUSU9OX1JuCisjZGVmaW5lIEZYX0JOQUxuCUZYX0JJRElORVVUUkFMQUNUSU9OX0xuCisjZGVmaW5lIEZYX0JOQUluCUZYX0JJRElORVVUUkFMQUNUSU9OX0luCisjZGVmaW5lIEZYX0JOQUxuTAlGWF9CSURJTkVVVFJBTEFDVElPTl9MbkwKK0ZYX0lOVDMyIEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKEZYX0lOVDMyIGlBY3Rpb24sIEZYX0lOVDMyIGlMZXZlbCk7CitGWF9JTlQzMiBGWF9CaWRpR2V0UmVzb2x2ZWROZXV0cmFscyhGWF9JTlQzMiBpQWN0aW9uKTsKK3ZvaWQgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhGWF9JTlQzMiBpQmFzZUxldmVsLCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmxldmVscyk7Cit2b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpOwordm9pZCBGWF9CaWRpUmVzb2x2ZVdoaXRlc3BhY2UoRlhfSU5UMzIgaUJhc2VMZXZlbCwgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpOworRlhfSU5UMzIgRlhfQmlkaVJlb3JkZXJMZXZlbChGWF9JTlQzMiBpQmFzZUxldmVsLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmbGV2ZWxzLCBGWF9JTlQzMiBpU3RhcnQsIEZYX0JPT0wgYlJldmVyc2UgPSBGQUxTRSk7Cit2b2lkIEZYX0JpZGlSZW9yZGVyKEZYX0lOVDMyIGlCYXNlTGV2ZWwsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZsZXZlbHMpOworY2xhc3MgQ0ZYX0JpZGlDaGFyIDogcHVibGljIElGWF9CaWRpQ2hhciwgcHVibGljIENGWF9PYmplY3QKIHsKIHB1YmxpYzoKICAgICBDRlhfQmlkaUNoYXIoKTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwCmluZGV4IDdmZjZiMDYuLjMzMGM2NzUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcApAQCAtODAsNiArODAsMTggQEAKICAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7CiAgICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+VHJ1bmNhdGUoc3pGaWxlKTsKIH0KK0lGWF9GaWxlQWNjZXNzKiBGWF9DcmVhdGVEZWZhdWx0RmlsZUFjY2VzcyhGWF9XU1RSIHdzUGF0aCkNCit7DQorCWlmICh3c1BhdGguR2V0TGVuZ3RoKCkgPT0gMCkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlDRlhfQ1JURmlsZUFjY2VzcyogcEZBID0gTlVMTDsNCisJcEZBID0gRlhfTkVXIENGWF9DUlRGaWxlQWNjZXNzOw0KKwlpZiAoTlVMTCA9PSBwRkEpIHJldHVybiBOVUxMOw0KKw0KKwlwRkEtPkluaXQod3NQYXRoKTsNCisJcmV0dXJuIHBGQTsNCit9DQogSUZYX0ZpbGVTdHJlYW0qIEZYX0NyZWF0ZUZpbGVTdHJlYW0oRlhfTFBDU1RSIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKQogewogICAgIElGWENSVF9GaWxlQWNjZXNzKiBwRkEgPSBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpOwpAQCAtMzgzLDMgKzM5NSw0MCBAQAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KK3ZvaWQgRlhfR1VJRF9DcmVhdGVWNChGWF9MUEdVSUQgcEdVSUQpDQorew0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0RFU0tUT1BfDQorICAgIGlmICghRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oKEZYX0xQRFdPUkQpcEdVSUQsIDQpKSB7DQorICAgICAgICBGWF9SYW5kb21fR2VuZXJhdGVNVCgoRlhfTFBEV09SRClwR1VJRCwgNCk7DQorICAgIH0NCisjZWxzZQ0KKyAgICBGWF9SYW5kb21fR2VuZXJhdGVNVCgoRlhfTFBEV09SRClwR1VJRCwgNCk7DQorI2VuZGlmDQorI2Vsc2UNCisgICAgRlhfUmFuZG9tX0dlbmVyYXRlTVQoKEZYX0xQRFdPUkQpcEdVSUQsIDQpOw0KKyNlbmRpZg0KKyAgICBGWF9CWVRFICZiID0gKChGWF9MUEJZVEUpcEdVSUQpWzZdOw0KKyAgICBiID0gKGIgJiAweDBGKSB8IDB4NDA7DQorfQ0KK0ZYX0xQQ1NUUiBnc19GWF9wSGV4Q2hhcnMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7DQordm9pZCBGWF9HVUlEX1RvU3RyaW5nKEZYX0xQQ0dVSUQgcEdVSUQsIENGWF9CeXRlU3RyaW5nICZic1N0ciwgRlhfQk9PTCBiU2VwYXJhdG9yKQ0KK3sNCisgICAgRlhfTFBTVFIgcEJ1ZiA9IGJzU3RyLkdldEJ1ZmZlcig0MCk7DQorICAgIEZYX0JZVEUgYjsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDE2OyBpICsrKSB7DQorICAgICAgICBiID0gKChGWF9MUENCWVRFKXBHVUlEKVtpXTsNCisgICAgICAgICpwQnVmICsrID0gZ3NfRlhfcEhleENoYXJzW2IgPj4gNF07DQorICAgICAgICAqcEJ1ZiArKyA9IGdzX0ZYX3BIZXhDaGFyc1tiICYgMHgwRl07DQorICAgICAgICBpZiAoYlNlcGFyYXRvciAmJiAoaSA9PSAzIHx8IGkgPT0gNSB8fCBpID09IDcgfHwgaSA9PSA5KSkgew0KKyAgICAgICAgICAgICpwQnVmICsrID0gTCctJzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBic1N0ci5SZWxlYXNlQnVmZmVyKGJTZXBhcmF0b3IgPyAzNiA6IDMyKTsNCit9DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAKaW5kZXggMDVmYzdkNS4uYmQ0MThiMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAKQEAgLTY3Miw3ICs2NzIsNyBAQAogICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChic1NwYWNlLCBic05hbWUpOwogICAgIGlmIChwVmFsdWUpIHsKLSAgICAgICAgYXR0cmlidXRlID0gQ0ZYX1dpZGVTdHJpbmcoKEZYX0xQQ1dTVFIpcFZhbHVlLCBwVmFsdWUtPkdldExlbmd0aCgpKTsKKyAgICAgICAgYXR0cmlidXRlID0gQ0ZYX1dpZGVTdHJpbmcoKEZYX0xQQ1dTVFIpKnBWYWx1ZSwgcFZhbHVlLT5HZXRMZW5ndGgoKSk7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CkBAIC02ODEsNyArNjgxLDcgQEAKIHsKICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7CiAgICAgaWYgKHBWYWx1ZSkgewotICAgICAgICBhdHRyaWJ1dGUgPSBDRlhfV2lkZVN0cmluZygoRlhfTFBDV1NUUilwVmFsdWUsIHBWYWx1ZS0+R2V0TGVuZ3RoKCkpOworICAgICAgICBhdHRyaWJ1dGUgPSBDRlhfV2lkZVN0cmluZygoRlhfTFBDV1NUUikqcFZhbHVlLCBwVmFsdWUtPkdldExlbmd0aCgpKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwCmluZGV4IDgxN2YzNzEuLmUzYzY4ZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcApAQCAtMjUsNiArMjUsNTIgQEAKICAgICBtX3BEd0ZvbnQgPSBOVUxMOwogICAgIG1faEhhbmRsZSA9IE5VTEw7CiAgICAgbV9iRHdMb2FkZWQgPSBGQUxTRTsKKyAgICBtX2JMb2dpYyA9IEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9Gb250OjpMb2FkQ2xvbmUoY29uc3QgQ0ZYX0ZvbnQqIHBGb250KQ0KK3sNCisgICAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2JMb2dpYyA9IFRSVUU7DQorICAgIGlmIChwRm9udC0+bV9wU3Vic3RGb250KSB7DQorICAgICAgICBtX3BTdWJzdEZvbnQgPSBGWF9ORVcgQ0ZYX1N1YnN0Rm9udDsNCisgICAgICAgIGlmICghbV9wU3Vic3RGb250KSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0NoYXJzZXQ7DQorICAgICAgICBtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGU7DQorICAgICAgICBtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFnczsNCisgICAgICAgIG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX1dlaWdodDsNCisgICAgICAgIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0ZhbWlseTsNCisgICAgICAgIG1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7DQorICAgIH0NCisgICAgaWYgKHBGb250LT5tX090ZkZvbnREYXRhLkdldFNpemUoKSkgew0KKyAgICAgICAgbV9PdGZGb250RGF0YS5BdHRhY2hEYXRhKHBGb250LT5tX090ZkZvbnREYXRhLkdldEJ1ZmZlcigpLCBwRm9udC0+bV9PdGZGb250RGF0YS5HZXRTaXplKCkpOw0KKyAgICB9DQorICAgIG1fRmFjZSA9IHBGb250LT5tX0ZhY2U7DQorICAgIG1fYkVtYmVkZGVkID0gcEZvbnQtPm1fYkVtYmVkZGVkOw0KKyAgICBtX2JWZXJ0aWNhbCA9IHBGb250LT5tX2JWZXJ0aWNhbDsNCisgICAgbV9kd1NpemUgPSBwRm9udC0+bV9kd1NpemU7DQorICAgIG1fcEZvbnREYXRhID0gcEZvbnQtPm1fcEZvbnREYXRhOw0KKyAgICBtX3BHc3ViRGF0YSA9IHBGb250LT5tX3BHc3ViRGF0YTsNCisjaWZkZWYgRk9YSVRfQ0hST01FX0JVSUxEDQorICAgIGlmIChwRm9udC0+bV9wRm9udERhdGFBbGxvY2F0aW9uKSB7DQorICAgICAgICBtX3BGb250RGF0YUFsbG9jYXRpb24gPSBGWF9BbGxvYyhGWF9CWVRFLCBtX2R3U2l6ZSk7DQorICAgICAgICBpZiAoIW1fcEZvbnREYXRhQWxsb2NhdGlvbikgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEZvbnREYXRhID0gbV9wRm9udERhdGFBbGxvY2F0aW9uOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRm9udERhdGFBbGxvY2F0aW9uLCBwRm9udC0+bV9wRm9udERhdGFBbGxvY2F0aW9uLCBtX2R3U2l6ZSk7DQorICAgIH0NCisjZW5kaWYNCisgICAgbV9wUGxhdGZvcm1Gb250ID0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udDsNCisgICAgbV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbiA9IHBGb250LT5tX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uOw0KKyAgICBtX3BEd0ZvbnQgPSBwRm9udC0+bV9wRHdGb250Ow0KKyAgICBtX2hIYW5kbGUgPSBwRm9udC0+bV9oSGFuZGxlOw0KKyAgICBtX2JEd0xvYWRlZCA9IHBGb250LT5tX2JEd0xvYWRlZDsNCisgICAgbV9wT3duZWRTdHJlYW0gPSBwRm9udC0+bV9wT3duZWRTdHJlYW07DQorICAgIHJldHVybiBUUlVFOw0KIH0KIENGWF9Gb250Ojp+Q0ZYX0ZvbnQoKQogewpAQCAtMzgsNiArODQsMTAgQEAKICAgICAgICAgbV9wRm9udERhdGFBbGxvY2F0aW9uID0gTlVMTDsKICAgICB9CiAjZW5kaWYKKyAgICBpZiAobV9iTG9naWMpIHsNCisgICAgICAgIG1fT3RmRm9udERhdGEuRGV0YWNoQnVmZmVyKCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCiAgICAgaWYgKG1fRmFjZSkgewogI2lmZGVmIEZPWElUX0NIUk9NRV9CVUlMRAogICAgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0obV9GYWNlKSkgewpAQCAtMTA4LDcgKzE1OCw3IEBACiAgICAgewogICAgIH0KIH07Ci1GWF9CT09MIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwgRlhGVF9GYWNlKiBGYWNlLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWEZUX1N0cmVhbSogc3RyZWFtKQorRlhfQk9PTCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSwgRlhfSU5UMzIgZmFjZUluZGV4ID0gMCkNCiB7CiAgICAgRlhGVF9TdHJlYW0gc3RyZWFtMSA9IChGWEZUX1N0cmVhbSlGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YgKEZYRlRfU3RyZWFtUmVjKSk7CiAgICAgaWYgKCFzdHJlYW0xKSB7CkBAIC0xMjMsNyArMTczLDcgQEAKICAgICBGWEZUX09wZW5fQXJncyBhcmdzOwogICAgIGFyZ3MuZmxhZ3MgPSBGVF9PUEVOX1NUUkVBTTsKICAgICBhcmdzLnN0cmVhbSA9IHN0cmVhbTE7Ci0gICAgaWYgKEZYRlRfT3Blbl9GYWNlKGxpYnJhcnksICZhcmdzLCAwLCBGYWNlKSkgeworICAgIGlmIChGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCAmYXJncywgZmFjZUluZGV4LCBGYWNlKSkgew0KICAgICAgICAgRlhfRnJlZShzdHJlYW0xKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KQEAgLTEzMiwxOSArMTgyLDIxIEBACiAgICAgfQogICAgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSkKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUsIGludCBuRmFjZUluZGV4LCBpbnQqIHBGYWNlQ291bnQpDQogewogICAgIG1fYkVtYmVkZGVkID0gRkFMU0U7CiAgICAgRlhGVF9MaWJyYXJ5IGxpYnJhcnk7Ci0gICAgaWYgKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnkgPT0gTlVMTCkgeworICAgIGlmIChDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5ID09IE5VTEwpDQogICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJkNGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnkpOwotICAgIH0KICAgICBsaWJyYXJ5ID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeTsKICAgICBGWEZUX1N0cmVhbSBzdHJlYW0gPSBOVUxMOwotICAgIGlmICghX0xvYWRGaWxlKGxpYnJhcnksICZtX0ZhY2UsIHBGaWxlLCAmc3RyZWFtKSkgeworICAgIGlmICghX0xvYWRGaWxlKGxpYnJhcnksICZtX0ZhY2UsIHBGaWxlLCAmc3RyZWFtLCBuRmFjZUluZGV4KSkNCiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgICAgaWYgKHBGYWNlQ291bnQpDQorICAgICAgICAqcEZhY2VDb3VudCA9IChpbnQpbV9GYWNlLT5udW1fZmFjZXM7DQorI2lmbmRlZiBGT1hJVF9DSFJPTUVfQlVJTEQNCiAgICAgbV9wT3duZWRTdHJlYW0gPSBzdHJlYW07CisjZW5kaWYNCiAgICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC00NTUsMyArNTA3LDE2OCBAQAogICAgIHBFbmNvZGluZyA9IEZYX05FVyBDRlhfVW5pY29kZUVuY29kaW5nKHBGb250KTsKICAgICByZXR1cm4gcEVuY29kaW5nOwogfQorQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpDRlhfRm9udEVuY29kaW5nRVgoKQ0KK3sNCisgICAgbV9wRm9udCA9IE5VTEw7DQorICAgIG1fbkVuY29kaW5nSUQgPSBGWEZNX0VOQ09ESU5HX05PTkU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpJbml0KENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgRW5jb2RpbmdJRCkNCit7DQorICAgIGlmICghcEZvbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BGb250ID0gcEZvbnQ7DQorICAgIG1fbkVuY29kaW5nSUQgPSBFbmNvZGluZ0lEOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfRFdPUkQgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkNCit7DQorICAgIEZYRlRfRmFjZSBmYWNlID0gbV9wRm9udC0+bV9GYWNlOw0KKyAgICBGVF9VSW50IG5JbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOw0KKyAgICBpZiAobkluZGV4ID4gMCkgew0KKyAgICAgICAgcmV0dXJuIG5JbmRleDsNCisgICAgfQ0KKyAgICBpbnQgbm1hcHMgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsNCisgICAgaW50IG0gPSAwOw0KKyAgICB3aGlsZSAobSA8IG5tYXBzKSB7DQorICAgICAgICBpbnQgbkVuY29kaW5nSUQgPSBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbbSsrXSk7DQorICAgICAgICBpZiAobV9uRW5jb2RpbmdJRCA9PSBuRW5jb2RpbmdJRCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50IGVycm9yID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBuRW5jb2RpbmdJRCk7DQorICAgICAgICBpZiAoZXJyb3IpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIG5JbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOw0KKyAgICAgICAgaWYgKG5JbmRleCA+IDApIHsNCisgICAgICAgICAgICBtX25FbmNvZGluZ0lEID0gbkVuY29kaW5nSUQ7DQorICAgICAgICAgICAgcmV0dXJuIG5JbmRleDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIG1fbkVuY29kaW5nSUQpOw0KKyAgICByZXR1cm4gMDsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpVbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdA0KK3sNCisgICAgaWYgKG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19VTklDT0RFKSB7DQorICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKEZYX1dDSEFSKWNoYXJjb2RlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKEZYX1dDSEFSKTApOw0KK30NCitGWF9EV09SRCBDRlhfRm9udEVuY29kaW5nRVg6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3QNCit7DQorICAgIGlmIChtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfVU5JQ09ERSB8fCBtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MKSB7DQorICAgICAgICByZXR1cm4gVW5pY29kZTsNCisgICAgfQ0KKyAgICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPm1fRmFjZTsNCisgICAgaW50IG5tYXBzID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSk7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm1hcHM7IGkrKykgew0KKyAgICAgICAgaW50IG5FbmNvZGluZ0lEID0gRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKTsNCisgICAgICAgIGlmIChuRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUgfHwgbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsNCisgICAgICAgICAgICByZXR1cm4gVW5pY29kZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gLTE7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfVU5JQ09ERTsNCit9DQorRlhfRFdPUkQgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpHbHlwaEluZGV4RnJvbU5hbWUoRlhfTFBDU1RSIHBTdHJOYW1lKQ0KK3sNCisgICAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5tX0ZhY2U7DQorICAgIHJldHVybiBGVF9HZXRfTmFtZV9JbmRleChmYWNlLCAoRlRfU3RyaW5nKilwU3RyTmFtZSk7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENGWF9Gb250RW5jb2RpbmdFWDo6TmFtZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkNCit7DQorICAgIEZYRlRfRmFjZSBmYWNlID0gbV9wRm9udC0+bV9GYWNlOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBnbHlwaE5hbWUoIiAgICAgICAgICAgICAgICAiKTsNCisgICAgaWYgKEZUX0hBU19HTFlQSF9OQU1FUygoKEZUX0ZhY2UpZmFjZSkpKSB7DQorICAgICAgICBpZiAoRlRfR2V0X0dseXBoX05hbWUoKEZUX0ZhY2UpZmFjZSwgZHdHbHlwaEluZGV4LCAoRlRfUG9pbnRlcikoRlhfTFBDU1RSKWdseXBoTmFtZSwgMTYpKSB7DQorICAgICAgICAgICAgZ2x5cGhOYW1lLkVtcHR5KCk7DQorICAgICAgICAgICAgcmV0dXJuIGdseXBoTmFtZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBnbHlwaE5hbWU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gZ2x5cGhOYW1lOw0KKyAgICB9DQorfQ0KK0ZYX0RXT1JEIENGWF9Gb250RW5jb2RpbmdFWDo6Q2hhckNvZGVGcm9tR2x5cGhJbmRleChGWF9EV09SRCBkd0dseXBoSW5kZXgpDQorew0KKyAgICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPkdldEZhY2UoKTsNCisgICAgRlhfRFdPUkQgIGNoYXJjb2RlOw0KKyAgICBGVF9VSW50ICBnaWQ7DQorICAgIGNoYXJjb2RlID0gRlRfR2V0X0ZpcnN0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgJmdpZCk7DQorICAgIHdoaWxlIChnaWQgIT0gMCkgew0KKyAgICAgICAgaWYgKGR3R2x5cGhJbmRleCA9PSBnaWQpIHsNCisgICAgICAgICAgICByZXR1cm4gY2hhcmNvZGU7DQorICAgICAgICB9DQorICAgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgY2hhcmNvZGUsICZnaWQpOw0KKyAgICB9DQorICAgIGludCBubWFwcyA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOw0KKyAgICBpbnQgbSA9IDA7DQorICAgIHdoaWxlIChtIDwgbm1hcHMpIHsNCisgICAgICAgIGludCBuRW5jb2RpbmdJRCA9IEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVttKytdKTsNCisgICAgICAgIGlmIChtX25FbmNvZGluZ0lEID09IG5FbmNvZGluZ0lEKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIG5FbmNvZGluZ0lEKTsNCisgICAgICAgIGlmIChlcnJvcikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfRmlyc3RfQ2hhcigoRlRfRmFjZSlmYWNlLCAmZ2lkKTsNCisgICAgICAgIHdoaWxlIChnaWQgIT0gMCkgew0KKyAgICAgICAgICAgIGlmIChkd0dseXBoSW5kZXggPT0gZ2lkKSB7DQorICAgICAgICAgICAgICAgIG1fbkVuY29kaW5nSUQgPSBuRW5jb2RpbmdJRDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgY2hhcmNvZGUsICZnaWQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsNCit9DQorc3RhdGljIGNvbnN0IEZYX0RXT1JEIGdzX0VuY29kaW5nSURbXSA9IHsNCisgICAgRlhGTV9FTkNPRElOR19NU19TWU1CT0wsDQorICAgIEZYRk1fRU5DT0RJTkdfVU5JQ09ERSwNCisgICAgRlhGTV9FTkNPRElOR19NU19TSklTLA0KKyAgICBGWEZNX0VOQ09ESU5HX01TX0dCMjMxMiwNCisgICAgRlhGTV9FTkNPRElOR19NU19CSUc1LA0KKyAgICBGWEZNX0VOQ09ESU5HX01TX1dBTlNVTkcsDQorICAgIEZYRk1fRU5DT0RJTkdfTVNfSk9IQUIsDQorICAgIEZYRk1fRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQsDQorICAgIEZYRk1fRU5DT0RJTkdfQURPQkVfRVhQRVJULA0KKyAgICBGWEZNX0VOQ09ESU5HX0FET0JFX0NVU1RPTSwNCisgICAgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xLA0KKyAgICBGWEZNX0VOQ09ESU5HX09MRF9MQVRJTl8yLA0KKyAgICBGWEZNX0VOQ09ESU5HX0FQUExFX1JPTUFODQorfTsNCitzdGF0aWMgSUZYX0ZvbnRFbmNvZGluZ0V4KiBfRlhGTV9DcmVhdGVGb250RW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBuRW5jb2RpbmdJRCkNCit7DQorICAgIGludCBlcnJvciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAocEZvbnQtPm1fRmFjZSwgbkVuY29kaW5nSUQpOw0KKyAgICBpZiAoZXJyb3IpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9Gb250RW5jb2RpbmdFWCogcEZvbnRFbmNvZGluZyA9IEZYX05FVyBDRlhfRm9udEVuY29kaW5nRVg7DQorICAgIGlmIChwRm9udEVuY29kaW5nICYmICFwRm9udEVuY29kaW5nLT5Jbml0KHBGb250LCBuRW5jb2RpbmdJRCkpIHsNCisgICAgICAgIGRlbGV0ZSBwRm9udEVuY29kaW5nOw0KKyAgICAgICAgcEZvbnRFbmNvZGluZyA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBGb250RW5jb2Rpbmc7DQorfQ0KK0lGWF9Gb250RW5jb2RpbmdFeCogRlhfQ3JlYXRlRm9udEVuY29kaW5nRXgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBuRW5jb2RpbmdJRCkNCit7DQorICAgIGlmICghcEZvbnQgfHwgIXBGb250LT5tX0ZhY2UpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChuRW5jb2RpbmdJRCAhPSBGWEZNX0VOQ09ESU5HX05PTkUpIHsNCisgICAgICAgIHJldHVybiBfRlhGTV9DcmVhdGVGb250RW5jb2RpbmcocEZvbnQsIG5FbmNvZGluZ0lEKTsNCisgICAgfQ0KKyAgICBzdGF0aWMgaW50IHNfY291bnQgPSBzaXplb2YoZ3NfRW5jb2RpbmdJRCkgLyBzaXplb2YoRlhfRFdPUkQpOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNfY291bnQ7IGkrKykgew0KKyAgICAgICAgSUZYX0ZvbnRFbmNvZGluZ0V4KiBwRm9udEVuY29kaW5nID0gX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBnc19FbmNvZGluZ0lEW2ldKTsNCisgICAgICAgIGlmIChwRm9udEVuY29kaW5nKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBGb250RW5jb2Rpbmc7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCmluZGV4IGE1ZmE2NDQuLmZlNzkwZDggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcApAQCAtMTE1Niw2ICsxMTU2LDkgQEAKICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9FWEFDVDsKICAgICB9CiAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgRlhGT05UX0VYQUNUTUFUQ0gpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCiAgICAgICAgIGlmIChiQ0pLKSB7CiAgICAgICAgICAgICBpZiAoaXRhbGljX2FuZ2xlICE9IDApIHsKICAgICAgICAgICAgICAgICBiSXRhbGljID0gVFJVRTsKQEAgLTEyODQsNiArMTI4Nyw2OCBAQAogICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKICAgICByZXR1cm4gZmFjZTsKIH0KK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsIEZYX0RXT1JEIGZsYWdzLCBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlKQ0KK3sNCisgICAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkl0YWxpYyA9IChmbGFncyAmIEZYRk9OVF9JVEFMSUMpICE9IDA7DQorICAgIGludCBQaXRjaEZhbWlseSA9IDA7DQorICAgIGlmIChmbGFncyAmIEZYRk9OVF9TRVJJRikgew0KKyAgICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOw0KKyAgICB9DQorICAgIGlmIChmbGFncyAmIEZYRk9OVF9TQ1JJUFQpIHsNCisgICAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9TQ1JJUFQ7DQorICAgIH0NCisgICAgaWYgKGZsYWdzICYgRlhGT05UX0ZJWEVEX1BJVENIKSB7DQorICAgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsNCisgICAgfQ0KKyAgICB2b2lkKiBoRm9udCA9IG1fcEZvbnRJbmZvLT5NYXBGb250QnlVbmljb2RlKGR3VW5pY29kZSwgd2VpZ2h0LCBiSXRhbGljLCBQaXRjaEZhbWlseSk7DQorICAgIGlmIChoRm9udCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9EV09SRCB0dGNfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgTlVMTCwgMCk7DQorICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7DQorICAgIGlmKGZvbnRfc2l6ZSA9PSAwICYmIHR0Y19zaXplID09IDApIHsNCisgICAgICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYRlRfRmFjZSBmYWNlID0gTlVMTDsNCisgICAgaWYgKHR0Y19zaXplKSB7DQorICAgICAgICBGWF9CWVRFIHRlbXBbMTAyNF07DQorICAgICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIHRlbXAsIDEwMjQpOw0KKyAgICAgICAgRlhfRFdPUkQgY2hlY2tzdW0gPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsNCisgICAgICAgICAgICBjaGVja3N1bSArPSAoKEZYX0RXT1JEKil0ZW1wKVtpXTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0xQQllURSBwRm9udERhdGE7DQorICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sIHR0Y19zaXplIC0gZm9udF9zaXplLCBwRm9udERhdGEpOw0KKyAgICAgICAgaWYgKGZhY2UgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIHR0Y19zaXplKTsNCisgICAgICAgICAgICBpZiAocEZvbnREYXRhKSB7DQorICAgICAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgcEZvbnREYXRhLCB0dGNfc2l6ZSk7DQorICAgICAgICAgICAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwgcEZvbnREYXRhLCB0dGNfc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjX3NpemUgLSBmb250X3NpemUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIFN1YnN0TmFtZTsNCisgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGYWNlTmFtZShoRm9udCwgU3Vic3ROYW1lKTsNCisgICAgICAgIEZYX0xQQllURSBwRm9udERhdGE7DQorICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsNCisgICAgICAgIGlmIChmYWNlID09IE5VTEwpIHsNCisgICAgICAgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyhGWF9CWVRFLCBmb250X3NpemUpOw0KKyAgICAgICAgICAgIGlmICghcEZvbnREYXRhKSB7DQorICAgICAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgcEZvbnREYXRhLCBmb250X3NpemUpOw0KKyAgICAgICAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRGYWNlKFN1YnN0TmFtZSwgd2VpZ2h0LCBiSXRhbGljLCBwRm9udERhdGEsIGZvbnRfc2l6ZSwgbV9wRm9udEluZm8tPkdldEZhY2VJbmRleChoRm9udCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsNCisgICAgcmV0dXJuIGZhY2U7DQorfQ0KIGV4dGVybiAiQyIgewogICAgIHVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwpAQCAtMTQ4Myw2ICsxNTQ4LDEwIEBACiB7CiAgICAgcmV0dXJuIE5VTEw7CiB9Cit2b2lkKiBDRlhfRm9sZGVyRm9udEluZm86Ok1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLCBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBwaXRjaF9mYW1pbHkpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQogdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250KEZYX0xQQ1NUUiBmYWNlKQogewogICAgIEZYX0xQVk9JRCBwOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oIGIvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oCmluZGV4IGM4ZDU1OTYuLmU1MTk3NmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgKQEAgLTEwMSw1ICsxMDEsMjQgQEAKICAgICBpbnQJCQkJCW1fUGl0Y2hGYW1pbHk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRm9udFRhYmxlczsKIH07Ci0KK2NsYXNzIENGWF9Gb250RW5jb2RpbmdFWCA6IHB1YmxpYyBJRlhfRm9udEVuY29kaW5nRXgNCit7DQorcHVibGljOg0KKyAgICBDRlhfRm9udEVuY29kaW5nRVgoKTsNCisgICAgRlhfQk9PTAkJCUluaXQoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBFbmNvZGluZ0lEKTsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2x5cGhJbmRleEZyb21OYW1lKEZYX0xQQ1NUUiBwU3RyTmFtZSk7DQorICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJTmFtZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUNoYXJDb2RlRnJvbUdseXBoSW5kZXgoRlhfRFdPUkQgZHdHbHlwaEluZGV4KTsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCVVuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdseXBoRnJvbUNoYXJDb2RlRXgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBlbmNvZGluZyA9IEVOQ09ESU5HX1VOSUNPREUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7DQorICAgIH0NCitwcml2YXRlOg0KKyAgICBDRlhfRm9udCogbV9wRm9udDsNCisgICAgRlhfRFdPUkQgbV9uRW5jb2RpbmdJRDsNCit9Ow0KICNlbmRpZiAgLy8gX1RFWFRfSU5UX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oCmluZGV4IDZkZjgzNDcuLmUzYWQ4YjEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oCkBAIC00MCw2ICs0MCw4IEBACiAJdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CiAJdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpOwogCQorCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCQogcHVibGljOgogCXZpcnR1YWwgdm9pZAkJCQlPblNldEZvY3VzKENQV0xfV25kKiBwV25kKTsKIAl2aXJ0dWFsIHZvaWQJCQkJT25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgKaW5kZXggN2EzNDAyYS4uMTg0MjZhOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oCkBAIC0xMjAsNiArMTIwLDcgQEAKIAl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAogCXZpcnR1YWwgdm9pZAkJCQlHZXRLZXlTdHJva2VEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRkZMX0tleVN0cm9rZURhdGEmIGRhdGEpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCiBwdWJsaWM6CiAJQ1BXTF9XbmQqCQkJCQlHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaAppbmRleCAzOTNmMGJlLi4xYjMzZWRkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaApAQCAtNzYsNiArNzYsOCBAQAogCXZpcnR1YWwgdm9pZAkJCQlPblNldFdpbmRvd1JlY3Qodm9pZCogcFByaXZhdGVEYXRhLCBjb25zdCBDUERGX1JlY3QgJiByY1dpbmRvdyk7CiAJdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfSU5UMzIgbktleUNvZGUsIENGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLCAKIAkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJSQywgRlhfQk9PTCAmIGJFeGl0KTsKKwl2aXJ0dWFsIHZvaWQJCQkJT25Qb3B1cFByZU9wZW4odm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworCXZpcnR1YWwgdm9pZAkJCQlPblBvcHVwUG9zdE9wZW4odm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwogCiBwdWJsaWM6CiAJdmlydHVhbCB2b2lkCQkJCUJlZm9yZVVuZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKQEAgLTExNiw2ICsxMTgsMTAgQEAKIAlzdGF0aWMgaW50CQkJCQlHZXRDb21taXRLZXkoKTsKIAlzdGF0aWMgRlhfQk9PTAkJCQlHZXRLZXlEb3duKCk7CiAKKwl2b2lkCQkJCQkJT25DbGljayhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LCBGWF9VSU5UIG5GbGFnKTsKKwl2b2lkCQkJCQkJT25GdWxsKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpOworCXZvaWQJCQkJCQlPblByZU9wZW4oQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCwgRlhfVUlOVCBuRmxhZyk7CisJdm9pZAkJCQkJCU9uUG9zdE9wZW4oQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCwgRlhfVUlOVCBuRmxhZyk7CiAKIHB1YmxpYzoKIC8vIAlzdGF0aWMgTVNHCQkJCQlnX01zZzsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaAppbmRleCBjYWJjMWFhLi5jNzI5Yjc0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oCkBAIC00NSw2ICs0NSw3IEBACiAgCUZYX0JPT0wJCQkJCQkJCQlFeGVjdXRlQWN0aW9uVHJlZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIENQREZfQWN0aW9uICYgYWN0aW9uLCBGWF9CT09MJiBiRXhpdCk7CiAgCUZYX0JPT0wJCQkJCQkJCQlFeGVjdXRlQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbixGWF9CT09MJiBiRXhpdCk7CiAKKwlDRkZMX0Zvcm1GaWxsZXIgKgkJCQkJCW1fcEZvcm1GaWxsZXI7CiAJRlhfQk9PTAkJCQkJCQkJCW1fYkRvQWN0aW9uaW5nOwogCUZYX0lOVDMyCQkJCQkJCQltX25Ob3RpZnlGbGFnOwogfTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaAppbmRleCAzYTVmZDY4Li41M2RkZmI3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oCkBAIC02MCw2ICs2MCw4IEBACiAJCiAJdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CiAJCisJdmlydHVhbCBGWF9CT09MCQkJCUlzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJCiBwdWJsaWM6CiAJdmlydHVhbCB2b2lkCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwogCXZpcnR1YWwgdm9pZAkJCQlPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZl9kYXRhYXZhaWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX2RhdGFhdmFpbC5oCmluZGV4IDk3MWFiMjUuLmZiMDYxYjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX2RhdGFhdmFpbC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX2RhdGFhdmFpbC5oCkBAIC02NCw2ICs2NCw4IEBACiAqCQkJQSBoYW5kbGUgdG8gdGhlIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlci4gTlVMTCBmb3IgZXJyb3IuCiAqIENvbW1lbnRzOgogKgkJCUFwcGxpY2F0aW9uIG11c3QgY2FsbCBGUERGQXZhaWxfRGVzdHJveSB3aGVuIGRvbmUgd2l0aCB0aGUgYXZhaWxhYmlsaXR5IHByb3ZpZGVyLgorKiBOb3RlczoKKyoJCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBsb2FkIGEgZG9jdW1lbnQgd2hpY2ggY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzIG5vdy4KICovCiBETExFWFBPUlQgRlBERl9BVkFJTCBTVERDQUxMIEZQREZBdmFpbF9DcmVhdGUoRlhfRklMRUFWQUlMKiBmaWxlX2F2YWlsLCBGUERGX0ZJTEVBQ0NFU1MqIGZpbGUpOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZl9mbGF0dGVuLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZl9mbGF0dGVuLmgKaW5kZXggMmU5ZTUwOS4uMGM1NTUxMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZfZmxhdHRlbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX2ZsYXR0ZW4uaApAQCAtMjksOSArMjksMTIgQEAKIAkvL1JldHVybiB2YWx1ZToKIAkvLwkJCVRoZSByZXN1bHQgZmxhZyBvZiB0aGUgZnVuY3Rpb24sIFNlZSBmbGFncyBhYm92ZSAoIEZMQVRURU5fRkFJTCwgRkxBVFRFTl9TVUNDRVNTLCBGTEFUVEVOX05PVElOR1RPRE8gKS4KIAkvLwotCS8vIENvbW1lbnRzOiBDdXJyZW50IHZlcnNpb24gYWxsIGZhaWxzIHJldHVybiB6ZXJvLiBJZiBuZWNlc3Nhcnkgd2Ugd2lsbCBhc3NpZ24gZGlmZmVyZW50IHZhbHVlCisJLy9Db21tZW50czogQ3VycmVudCB2ZXJzaW9uIGFsbCBmYWlscyByZXR1cm4gemVyby4gSWYgbmVjZXNzYXJ5IHdlIHdpbGwgYXNzaWduIGRpZmZlcmVudCB2YWx1ZQogCS8vCQkJdG8gaW5kaWNhdGUgZGlmZmVyZW50IGZhaWwgcmVhc29uLgogCS8vIAorCS8vTm90ZXM6IAorCS8vCQkJVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZmxhdHRlbiB0aGUgcGFnZSB3aGljaCB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorCS8vCiAJRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZQYWdlX0ZsYXR0ZW4oIEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpOwogCQkKIAkJCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZl9wcm9ncmVzc2l2ZS5oIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZfcHJvZ3Jlc3NpdmUuaAppbmRleCAwMjkyNjRlLi42OWJiZmJhIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnBkZl9wcm9ncmVzc2l2ZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX3Byb2dyZXNzaXZlLmgKQEAgLTY0LDYgKzY0LDggQEAKIC8vCQkJcGF1c2UJCS0JVGhlIElGU0RLX1BBVVNFIGludGVyZmFjZS5BIGNhbGxiYWNrIG1lY2hhbmlzbSBhbGxvd2luZyB0aGUgcGFnZSByZW5kZXJpbmcgcHJvY2VzcwogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlSZW5kZXJpbmcgU3RhdHVzLiBTZWUgZmxhZ3MgZm9yIHByb2dyZXNzaXZlIHByb2Nlc3Mgc3RhdHVzIGZvciB0aGUgZGV0YWlscy4KKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbm5vdCBub3Qgc3VwcG9ydCB0byByZW5kZXIgcGFnZSB3aGljaCB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQoRlBERl9CSVRNQVAgYml0bWFwLCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LAogCQkJCQkJCQkJCQkJICAgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGZsYWdzLElGU0RLX1BBVVNFICogcGF1c2UpOwpAQCAtNzYsNiArNzgsOSBAQAogLy8JCQkJCQkJdG8gYmUgcGF1c2VkIGJlZm9yZSBpdCdzIGZpbmlzaGVkLiBUaGlzIGNhbiBiZSBOVUxMIGlmIHlvdSBkb24ndCB3YW50IHRvIHBhdXNlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlUaGUgcmVuZGVyaW5nIHN0YXR1cy4gU2VlIGZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cyBmb3IgdGhlIGRldGFpbHMuCisvLyBOb3RlczoKKy8vCQkJVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLElGU0RLX1BBVVNFICogcGF1c2UpOwogCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlX0Nsb3NlCkBAIC04NSw2ICs5MCw5IEBACiAvLwkJCXBhZ2UJCS0JSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlOVUxMCisvLyBOb3RlczoKKy8vCQkJVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZV9DbG9zZShGUERGX1BBR0UgcGFnZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZfdHJhbnNmb3JtcGFnZS5oIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZfdHJhbnNmb3JtcGFnZS5oCmluZGV4IDY5ZmZlMjQuLjMyYjBlYTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX3RyYW5zZm9ybXBhZ2UuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnBkZl90cmFuc2Zvcm1wYWdlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICogQHBhcmFtW2luXSByaWdodAktIFRoZSByaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcGFyYW1baW5dIHRvcAktIFRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZS4KICogQHJldHZhbCBOb25lLgorKiBAbm90ZSBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBzZXQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgd2hpY2ggY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0IGxlZnQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgcmlnaHQsIGZsb2F0IHRvcCk7CiAKQEAgLTMyLDYgKzMzLDcgQEAKICogQHBhcmFtW2luXSByaWdodAktIFRoZSByaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcGFyYW1baW5dIHRvcAktIFRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZS4KICogQHJldHZhbCBOb25lLgorKiBAbm90ZSBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBzZXQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgd2hpY2ggY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQgbGVmdCwgZmxvYXQgYm90dG9tLCBmbG9hdCByaWdodCwgZmxvYXQgdG9wKTsKIApAQCAtNDMsNiArNDUsNyBAQAogKiBAcGFyYW1baW5dIHJpZ2h0CS0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAqIEBwYXJhbVtpbl0gdG9wCS0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIFRydWUgaWYgc3VjY2VzcyxlbHNlIGZhaWwuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKTsKIApAQCAtNTMsNiArNTYsNyBAQAogKiBAcGFyYW1baW5dIHJpZ2h0CS0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAqIEBwYXJhbVtpbl0gdG9wCS0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIFRydWUgaWYgc3VjY2VzcyxlbHNlIGZhaWwuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApOwogCkBAIC02Myw2ICs2Nyw3IEBACiAqIEBwYXJhbVtpbl0gbWF0cml4CQkgLSBUaGUgdHJhbnNmb3JtIG1hdHJpeC4KICogQHBhcmFtW2luXSBjbGlwUmVjdAkgLSBBIHJlY3RhbmdsZSBwYWdlIGFyZWEgdG8gYmUgY2xpcHBlZC4KICogQE5vdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCB0cmFuc2Zvcm0gdGhlIHdob2xlIHBhZ2UsIGFuZCB3b3VsZCB0YWtlIGVmZmVjdCB0byBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHBhZ2UuCisqCQkgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KICovCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfVHJhbnNGb3JtV2l0aENsaXAoRlBERl9QQUdFIHBhZ2UsIEZTX01BVFJJWCogbWF0cml4LCBGU19SRUNURiogY2xpcFJlY3QpOwogCkBAIC0xMDUsNyArMTEwLDcgQEAKICogQHBhcmFtW2luXSBwYWdlCQkgLSBBIHBhZ2UgaGFuZGxlLgogKiBAcGFyYW1baW5dIGNsaXBQYXRoCSAtIEEgaGFuZGxlIHRvIHRoZSBjbGlwIHBhdGguCiAqIEBOb3RlLiBBIGNsaXAgcGF0aCB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFnZSBjb250ZW50IHN0cmVhbSBvciBjb250ZW50IGFycmF5LiBJbiB0aGlzIHdheSwgdGhlIHBhZ2UgY29udGVudCB3aWxsIGJlIGNsaXBwZWQKLSogYnkgdGhpcyBjbGlwIHBhdGguIAorKiBieSB0aGlzIGNsaXAgcGF0aC4gVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0Q2xpcFBhdGgoRlBERl9QQUdFIHBhZ2UsRlBERl9DTElQUEFUSCBjbGlwUGF0aCk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZG9jLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZmRvYy5oCmluZGV4IDU0ZWRlNDAuLmRhNDliYTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZG9jLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZkb2MuaApAQCAtMTE2LDYgKzExNiw4IEBACiAvLyBDb21tZW50czoKIC8vCQkJVGhlIHBvaW50IGNvb3JkaW5hdGVzIGFyZSBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4gWW91IGNhbiBjb252ZXJ0IGNvb3JkaW5hdGVzIAogLy8JCQlmcm9tIHNjcmVlbiBzeXN0ZW0gdG8gcGFnZSBzeXN0ZW0gdXNpbmcgRlBERl9EZXZpY2VUb1BhZ2UgZnVuY3Rpb25zLgorLy8gTm90ZXM6CisvLwkJCVRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgRlBERl9MSU5LIFNURENBTEwgRlBERkxpbmtfR2V0TGlua0F0UG9pbnQoRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSB4LCBkb3VibGUgeSk7CiAKQEAgLTE0OCw2ICsxNTAsOCBAQAogLy8JCQlsaW5rQW5ub3Rbb3V0XQkJLQlSZWNlaXZlIHRoZSBsaW5rIGhhbmRsZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vCQkJVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0VudW1lcmF0ZShGUERGX1BBR0UgcGFnZSwgaW50KiBzdGFydFBvcywgRlBERl9MSU5LKiBsaW5rQW5ub3QpOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZmVkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZWRpdC5oCmluZGV4IDE4YjgxNjguLjNiZTJmZDMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZWRpdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZWRpdC5oCkBAIC0zNCw2ICszNCw3IEBACiAvLwkJCU5vbmUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLwkJCUEgaGFuZGxlIHRvIGEgZG9jdW1lbnQuIElmIGZhaWxlZCwgTlVMTCBpcyByZXR1cm5lZC4KKy8vCiBETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTMsNiArNTQsOSBAQAogLy8JCQlUaGUgaGFuZGxlIHRvIHRoZSBwYWdlLgogLy8gQ29tbWVudHM6CiAvLwkJCUxvYWRlZCBwYWdlIGNhbiBiZSBkZWxldGVkIGJ5IEZQREZQYWdlX0RlbGV0ZS4KKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBjcmVhdGUgYSBuZXcgcGFnZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vCiBETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERlBhZ2VfTmV3KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfRGVsZXRlCkBAIC02Miw2ICs2Niw5IEBACiAvLwkJCXBhZ2VfaW5kZXgJLQlUaGUgaW5kZXggb2YgYSBwYWdlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlOb25lLgorLy8gTm90ZXM6CisvLwkJCVRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGRlbGV0ZSBwYWdlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfRGVsZXRlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0dldFJvdGF0aW9uCkBAIC03Miw2ICs3OSw5IEBACiAvLwkJCVRoZSBQREYgcGFnZSByb3RhdGlvbi4KIC8vIENvbW1lbnQ6CiAvLwkJCVRoZSBQREYgcGFnZSByb3RhdGlvbiBpcyByb3RhdGVkIGNsb2Nrd2lzZS4KKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBnZXQgdGhlIHBhZ2Ugcm90YXRlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9HZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9TZXRSb3RhdGlvbgpAQCAtODMsNiArOTMsOCBAQAogLy8JCQlOb25lLgogLy8gQ29tbWVudDoKIC8vCQkJVGhlIFBERiBwYWdlIHJvdGF0aW9uIGlzIHJvdGF0ZWQgY2xvY2t3aXNlLgorLy8gTm90ZXM6CisvLwkJCVRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLyAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UsIGludCByb3RhdGUpOwogCkBAIC05NCw2ICsxMDYsOSBAQAogLy8JCQkJCQkJRlBERlBhZ2VPYmpfTmV3UGF0aE9iai4KIC8vIFJldHVybiB2YWx1ZToKIC8vCQkJTm9uZS4KKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9Db3VudE9iamVjdApAQCAtMTAyLDYgKzExNyw5IEBACiAvLwkJCXBhZ2UJCS0JSGFuZGxlIHRvIGEgcGFnZS4gUmV0dXJuZWQgYnkgRlBERlBhZ2VfTmV3IG9yIEZQREZfTG9hZFBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLwkJCVRoZSBudW1iZXIgb2YgdGhlIHBhZ2Ugb2JqZWN0LgorLy8gTm90ZXM6CisvLwkJCVRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfR2V0T2JqZWN0CkBAIC0xMTEsNiArMTI5LDkgQEAKIC8vCQkJaW5kZXgJCS0JVGhlIGluZGV4IG9mIGEgcGFnZSBvYmplY3QuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLwkJCVRoZSBoYW5kbGUgb2YgdGhlIHBhZ2Ugb2JqZWN0LiBOdWxsIGZvciBmYWlsZWQuCisvLyBOb3RlczoKKy8vCQkJVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8KIERMTEVYUE9SVCBGUERGX1BBR0VPQkpFQ1QgU1REQ0FMTCBGUERGUGFnZV9HZXRPYmplY3QoRlBERl9QQUdFIHBhZ2UsIGludCBpbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3kKQEAgLTEyMCw2ICsxNDEsOSBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlUUlVFIG1lYW5zIHRoYXQgdGhlIFBERiBwYWdlIGRvZXMgY29udGFpbnMgdHJhbnNwYXJlbmN5LgogLy8JCQlPdGhlcndpc2UsIHJldHVybnMgRkFMU0UuCisvLyBOb3RlczoKKy8vCQkJVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50CkBAIC0xMzEsNiArMTU1LDkgQEAKIC8vIENvbW1lbnQ6CiAvLwkJCUJlZm9yZSB5b3Ugc2F2ZSB0aGUgcGFnZSB0byBhIGZpbGUsIG9yIHJlbG9hZCB0aGUgcGFnZSwgeW91IG11c3QgY2FsbCB0aGUgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50IGZ1bmN0aW9uLgogLy8JCQlPciB0aGUgY2hhbmdlZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3QuCisvLyBOb3RlczoKKy8vCQkJVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNzUsNiArMjAyLDggQEAKIC8vCQkJZgkJCS0JVGhlIGNvZWZmaWNpZW50ICJmIiBvZiB0aGUgbWF0cml4LgogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlOb25lLgorLy8gTm90ZXM6CisvLwkJCVRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfVHJhbnNmb3JtQW5ub3RzKEZQREZfUEFHRSBwYWdlLAogCQkJCQkJCQkJCQkgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZik7CiAKQEAgLTIxMiw2ICsyNDEsOCBAQAogLy8gIE5vdGU6IAogLy8JCQlUaGUgaW1hZ2Ugb2JqZWN0IG1pZ2h0IGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgaW1hZ2UsIHdoaWNoIGlzIHNoYXJlZCBhbmQgY2FjaGVkIGJ5IHRoZSBsb2FkZWQgcGFnZXMsIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjbGVhciB0aGUgY2FjaGUgb2YgaW1hZ2UgZm9yIGFsbCB0aGUgbG9hZGVkIHBhZ2VzLgogLy8JCQlQYXNzIHBhZ2VzIGFuZCBjb3VudCB0byB0aGlzIEFQSSB0byBjbGVhciB0aGUgaW1hZ2UgY2FjaGUuIAorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUoRlBERl9QQUdFKiBwYWdlcywgaW50IG5Db3VudCxGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LCBGUERGX0ZJTEVBQ0NFU1MqIGZpbGVBY2Nlc3MpOwogCiAKQEAgLTIzOSw2ICsyNzAsOSBAQAogLy8JCQliaXRtYXAJCQktCVRoZSBoYW5kbGUgb2YgdGhlIGJpdG1hcCB3aGljaCB5b3Ugd2FudCB0byBzZXQgaXQgdG8gdGhlIGltYWdlIG9iamVjdC4KIC8vIFJldHVybiB2YWx1ZToKIC8vCQkJVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuIAorLy8gTm90ZXM7CisvLwkJCVRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwgRlBERl9CSVRNQVAgYml0bWFwKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZmZvcm1maWxsLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZmZvcm1maWxsLmgKaW5kZXggYjY5YThmNi4uYTA4YmZkMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZmb3JtZmlsbC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZm9ybWZpbGwuaApAQCAtNDQsNiArNDQsOCBAQAogCSoJCQkJCQkJMS1XYXJuaW5nOwogCSoJCQkJCQkJMi1RdWVzdGlvbjsKIAkqCQkJCQkJCTMtU3RhdHVzLgorCSoJCQkJCQkJNC1Bc3RlcmlzaworCiAJKiBSZXR1cm4gVmFsdWU6CiAJKgkJCVRoZSByZXR1cm4gdmFsdWUgY291bGQgYmUgdGhlIGZvbG93aW5nIHR5cGU6CiAJKgkJCQkJCQkxLU9LOwpAQCAtMjE2LDcgKzIxOCw3IEBACiAJKiBDb21tZW50czoKIAkqCQlUaGUgZmlsZVBhdGggc2hvdWxlIGJlIGFsd2F5cyBpbnB1dCBpbiBsb2NhbCBlbmNvZGluZy4KIAkqLwotCWludCAgKCpGaWVsZF9icm93c2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcyx2b2lkKiBmaWxlUGF0aCwgaW50IGxlbmd0aCk7CisJaW50ICAoKkZpZWxkX2Jyb3dzZSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCB2b2lkKiBmaWxlUGF0aCwgaW50IGxlbmd0aCk7CiAKIAkvKioKIAkqCXBvaW50ZXIgdG8gRlBERl9GT1JNRklMTElORk8gaW50ZXJmYWNlLgpAQCAtMjU2LDYgKzI1OCwzOCBAQAogICAgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7CS8qIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgc2Vjb25kIC0gWzAsOTk5XSAqLwogfUZQREZfU1lTVEVNVElNRTsKIAorLy9YRkEKKy8qKgorICogQG5hbWUgUGFnZXZpZXcgIGV2ZW50IGZsYWdzCisgKi8KKy8qQHsqLworLyoqIEBicmllZiBBZnRlciBhIG5ldyBwYWdldmlldyBpcyBhZGRlZC4gKi8KKyNkZWZpbmUgIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUQURERUQJCTEKKy8qKiBAYnJpZWYgQWZ0ZXIgYSBwYWdldmlldyBpcyByZW1vdmVkLiAqLworI2RlZmluZSAgRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RSRU1PVkVEIAkzCisvKkB9Ki8KKworLy8gbWVudQorLyoqCisgKiBAbmFtZSBNYWNybyBEZWZpbml0aW9ucyBmb3IgUmlnaHQgQ29udGV4dCBNZW51IEZlYXR1cmVzIE9mIFhGQSBGaWVsZHMKKyAqLworLypAeyovCisjZGVmaW5lCSBGWEZBX01FTVVfQ09QWQkJCTEKKyNkZWZpbmUgIEZYRkFfTUVNVV9DVVQJCQkyCisjZGVmaW5lICBGWEZBX01FTVVfU0VMRUNUQUxMCTQKKyNkZWZpbmUgIEZYRkFfTUVNVV9VTkRPCQkJOAorI2RlZmluZSAgRlhGQV9NRU1VX1JFRE8JCQkxNgorI2RlZmluZSAgRlhGQV9NRU1VX1BBU1RFCQkzMgorLypAfSovCisKKy8vIGZpbGUgdHlwZQorLyoqCisgKiBAbmFtZSBNYWNybyBEZWZpbml0aW9ucyBmb3IgRmlsZSBUeXBlLgorICovCisvKkB7Ki8KKyNkZWZpbmUgRlhGQV9TQVZFQVNfWE1MCQkxCisjZGVmaW5lIEZYRkFfU0FWRUFTX1hEUAkJMgorLypAfSovCiAKIHR5cGVkZWYgc3RydWN0ICBfRlBERl9GT1JNRklMTElORk8KIHsKQEAgLTUyNiw4ICs1NjAsMjM1IEBACiAJKiovCiAJdm9pZAkoKkZGSV9Eb0dvVG9BY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgblBhZ2VJbmRleCwgaW50IHpvb21Nb2RlLCBmbG9hdCogZlBvc0FycmF5LCBpbnQgc2l6ZW9mQXJyYXkpOwogCS8qKgotCSoJcG9pbnRlciB0byBJUERGX0pTUExBVEZPUk0gaW50ZXJmYWNlCisJKiBNZXRob2Q6IEZGSV9EaXNwbGF5Q2FyZXQKKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBzaG93IHRoZSBjYXJldCBhdCBzcGVjaWZpZWQgcG9zaXRpb24uCisJKiBJbnRlcmZhY2UgVmVyc2lvbjoKKwkqCQkJMQorCSogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJcGFnZQkJCS0JSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisJKgkJbGVmdAkJCS0JTGVmdCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4gCisJKgkJdG9wCQkJCS0JVG9wIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorCSoJCXJpZ2h0CQkJLQlSaWdodCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KKwkqCQlib3R0b20JCQktCUJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KKwkqIFJldHVybiB2YWx1ZToKKwkqIAkJTm9uZS4KIAkqKi8KKwl2b2lkCSgqRkZJX0Rpc3BsYXlDYXJldCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlLCBGUERGX0JPT0wgYlZpc2libGUsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgKKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSBpbmRleC4KKwkqIEludGVyZmFjZSBWZXJzaW9uOgorCSoJCQkxCisJKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKwkqCQkJeWVzCisJKiBQYXJhbWV0ZXJzOgorCSoJCXBUaGlzCQkJLQlQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKwkqCQlkb2N1bWVudAkJLQlIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorCSogUmV0dXJuIHZhbHVlOgorCSogCQlUaGUgaW5kZXggb2YgY3VycmVudCBwYWdlLgorCSoqLworCWludAkJKCpGRklfR2V0Q3VycmVudFBhZ2VJbmRleCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX1NldEN1cnJlbnRQYWdlCisJKgkJCVRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBhZ2UuCisJKiBJbnRlcmZhY2UgVmVyc2lvbjoKKwkqCQkJMQorCSogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJZG9jdW1lbnQJCS0JSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKwkqCQlpQ3VyUGFnZQkJLQlUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgorCSogUmV0dXJuIHZhbHVlOgorCSogCQlOb25lLgorCSoqLworCXZvaWQJKCpGRklfU2V0Q3VycmVudFBhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgaUN1clBhZ2UpOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX0dvdG9VUkwKKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBsaW5rIHRvIHRoZSBzcGVjaWZpZWQgVVJMLgorCSogSW50ZXJmYWNlIFZlcnNpb246CisJKgkJCTEKKwkqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorCSoJCQlubworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJZG9jdW1lbnQJCS0JSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKwkqCQl3c1VSTAkJCS0JVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgVVJMLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisJKiBSZXR1cm4gdmFsdWU6CisJKiAJCU5vbmUuCisJKiovCisJdm9pZAkoKkZGSV9Hb3RvVVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHdzVVJMKTsKKwkvKiogCisJKiBNZXRob2Q6IEZGSV9HZXRQYWdlVmlld1JlY3QKKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSB2aWV3IHJlY3RhbmdsZS4KKwkqIEludGVyZmFjZSBWZXJzaW9uOgorCSoJCQkxCisJKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKwkqCQkJeWVzCisJKiBQYXJhbWV0ZXJzOgorCSoJCXBUaGlzCQkJLQlQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKwkqCQlwYWdlCQkJLQlIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKwkqCQlsZWZ0CQkJLQlUaGUgcG9pbnRlciB0byByZWNlaXZlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHBhZ2UgdmlldyBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuIAorCSoJCXRvcAkJCQktCVRoZSBwb2ludGVyIHRvIHJlY2VpdmUgdG9wIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorCSoJCXJpZ2h0CQkJLQlUaGUgcG9pbnRlciB0byByZWNlaXZlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorCSoJCWJvdHRvbQkJCS0JVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisJKiBSZXR1cm4gdmFsdWU6CisJKiAJCU5vbmUuCisJKiovCisJdm9pZAkoKkZGSV9HZXRQYWdlVmlld1JlY3QpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgZG91YmxlKiBsZWZ0LCBkb3VibGUqIHRvcCwgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX1BvcHVwTWVudQorCSoJCQlUaGlzIG1ldGhvZCB3aWxsIHRyYWNrIHRoZSByaWdodCBjb250ZXh0IG1lbnUgZm9yIFhGQSBmaWVsZHMuCisJKiBJbnRlcmZhY2UgVmVyc2lvbjoKKwkqCQkJMQorCSogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJcGFnZQkJCS0JSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisJKgkJaFdpZGdldAkJCS0JSGFuZGxlIHRvIFhGQSBmaWVsZHMuCisJKgkJbWVudUZsYWcJCS0JVGhlIG1lbnUgZmxhZ3MuIFBsZWFzZSByZWZlciB0byBtYWNybyBkZWZpbml0aW9uIG9mIEZYRkFfTUVNVV9YWFggYW5kIHRoaXMgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZXNlIG1hY3Jvcy4KKwkqCQl4CQkJCS0JWCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KKwkqCQl5CQkJCS0JWSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KKwkqIFJldHVybiB2YWx1ZToKKwkqIAkJVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgorCSoqLworCUZQREZfQk9PTCAoKkZGSV9Qb3B1cE1lbnUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgRlBERl9XSURHRVQgaFdpZGdldCwgaW50IG1lbnVGbGFnLCBmbG9hdCB4LCBmbG9hdCB5KTsKKwkvKiogCisJKiBNZXRob2Q6IEZGSV9PcGVuRmlsZQorCSoJCQlUaGlzIG1ldGhvZCB3aWxsIG9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlLgorCSogSW50ZXJmYWNlIFZlcnNpb24KKwkqCQkJMQorCSogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJZmlsZUZsYWcJCS0JVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZiBGWEZBX1NBVkVBU19YWFggYW5kIHRoaXMgY2FuIGJlIG9uZSBvZiB0aGVzZSBtYWNyb3MuCisJKgkJd3NVUkwJCQktCVRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpbGUgVVJMLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisJKgkJbW9kZQkJCS0JVGhlIG1vZGUgZm9yIG9wZW4gZmlsZS4KKwkqIFJldHVybiB2YWx1ZToKKwkqIAkJVGhlIGhhbmRsZSB0byBGUERGX0ZJTEVIQU5ETEVSLgorCSoqLworCUZQREZfRklMRUhBTkRMRVIqICgqRkZJX09wZW5GaWxlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IGZpbGVGbGFnLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIGNvbnN0IGNoYXIqIG1vZGUpOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX0VtYWlsVG8KKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBlbWFpbCB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgY29udGFjdGVyLgorCSogSW50ZXJmYWNlIFZlcnNpb246CisJKgkJCTEKKwkqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorCSoJCQl5ZXMKKwkqIFBhcmFtZXRlcnM6CisJKgkJcFRoaXMJCQktCVBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorCSoJCXBGaWxlSGFuZGxlcgktCUhhbmRsZSB0byB0aGUgRlBERl9GSUxFSEFORExFUi4KKwkqCQlwVG8JCQkJLQlBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisJKgkJcFN1YmplY3QJCS0gICBUaGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuIAorCSoJCXBDQwkJCQktCUEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIENDIHJlY2lwaWVudHMgZm9yIHRoZSBtZXNzYWdlLGluIFVURi0xNkxFIGZvcm1hdC4KKwkqCQlwQmNjCQkJLQlBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBCQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LiAKKwkqCQlwTXNnCQkJLQlQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LkNhbiBiZSBOVUxMLGluIFVURi0xNkxFIGZvcm1hdC4KKwkqIFJldHVybiB2YWx1ZToKKwkqIAkJTm9uZS4KKwkqKi8KKwl2b2lkCSgqRkZJX0VtYWlsVG8pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwgRlBERl9XSURFU1RSSU5HIHBUbywgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0LCBGUERGX1dJREVTVFJJTkcgcENDLCBGUERGX1dJREVTVFJJTkcgcEJjYywgRlBERl9XSURFU1RSSU5HIHBNc2cpOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX1VwbG9hZFRvCisJKgkJCVRoaXMgbWV0aG9kIHdpbGwgZ2V0IHVwbG9hZCB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgVVJMLgorCSogSW50ZXJmYWNlIFZlcnNpb246CisJKgkJCTEKKwkqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOiAKKwkqCQkJeWVzCisJKiBQYXJhbWV0ZXJzOgorCSoJCXBUaGlzCQkJLQlQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKwkqCQlwRmlsZUhhbmRsZXIJLQlIYW5kbGUgdG8gdGhlIEZQREZfRklMRUhBTkRMRVIuCisJKgkJZmlsZUZsYWcJCS0JVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZiBGWEZBX1NBVkVBU19YWFggYW5kIHRoaXMgY2FuIGJlIG9uZSBvZiB0aGVzZSBtYWNyb3MuCisJKgkJdXBsb2FkVG8JCS0JUG9pbnRlciB0byB0aGUgVVJMIHBhdGgsIGluIFVURi0xNkxFIGZvcm1hdC4KKwkqIFJldHVybiB2YWx1ZToKKwkqIAkJTm9uZS4KKwkqKi8KKwl2b2lkCSgqRkZJX1VwbG9hZFRvKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsIGludCBmaWxlRmxhZywgRlBERl9XSURFU1RSSU5HIHVwbG9hZFRvKTsKKwkKKwkvKiogCisJKiBNZXRob2Q6IEZGSV9HZXRQbGF0Zm9ybQorCSoJCQlUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKwkqIEludGVyZmFjZSBWZXJzaW9uOgorCSoJCQkxCisJKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDogCisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJcGxhdGZvcm0JCS0JUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcGxhdGZvcm0uQ2FuIGJlIE5VTEwsaW4gVVRGLTE2TEUgZm9ybWF0LgorCSoJCWxlbmd0aAkJCS0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCisJKiBSZXR1cm4gdmFsdWU6CisJKiAJCVRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLgorCSoqLworCWludAkJKCpGRklfR2V0UGxhdGZvcm0pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCB2b2lkKiBwbGF0Zm9ybSwgaW50IGxlbmd0aCk7CisJLyoqIAorCSogTWV0aG9kOiBGRklfR2V0TGFuZ3VhZ2UKKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCisJKiBJbnRlcmZhY2UgVmVyc2lvbjoKKwkqCQkJMQorCSogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6IAorCSoJCQl5ZXMKKwkqIFBhcmFtZXRlcnM6CisJKgkJcFRoaXMJCQktCVBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorCSoJCWxhbmd1YWdlCQktCVBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuQ2FuIGJlIE5VTEwuCisJKgkJbGVuZ3RoCQkJLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KKwkqIFJldHVybiB2YWx1ZToKKwkqIAkJVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuCisJKiovCisJaW50CQkoKkZGSV9HZXRMYW5ndWFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIHZvaWQqIGxhbmd1YWdlLCBpbnQgbGVuZ3RoKTsKKwkvKiogCisJKiBNZXRob2Q6IEZGSV9Eb3dubG9hZEZyb21VUkwKKwkqCQkJVGhpcyBtZXRob2Qgd2lsbCBkb3dubG9hZCB0aGUgc3BlY2lmaWVkIGZpbGUgZnJvbSB0aGUgVVJMLgorCSogSW50ZXJmYWNlIFZlcnNpb246CisJKgkJCTEKKwkqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOiAKKwkqCQkJeWVzCisJKiBQYXJhbWV0ZXJzOgorCSoJCXBUaGlzCQkJLQlQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKwkqCQlVUkwJCQkJLQlUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaWxlIFVSTCwgaW4gVVRGLTE2TEUgZm9ybWF0LgorCSogUmV0dXJuIHZhbHVlOgorCSogCQlUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCisJKiovCisJRlBERl9MUEZJTEVIQU5ETEVSCSgqRkZJX0Rvd25sb2FkRnJvbVVSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyBVUkwpOworCS8qKiAKKwkqIE1ldGhvZDogRkZJX1Bvc3RSZXF1ZXN0VVJMCisJKgkJCVRoaXMgbWV0aG9kIHdpbGwgcG9zdCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIFVSTC4KKwkqIEludGVyZmFjZSBWZXJzaW9uOgorCSoJCQkxCisJKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDogCisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJd3NVUkwJCQktCVRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KKwkqCQl3c0RhdGEJCQktCVRoZSBwb3N0IGRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgorCSoJCXdzQ29udGVudFR5cGUJLQlUaGUgY29udGVudCB0eXBlIG9mIHRoZSByZXF1ZXN0IGRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgorCSoJCXdzRW5jb2RlCQktCVRoZSBlbmNvZGUgdHlwZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisJKgkJd3NIZWFkZXIJCS0JVGhlIHJlcXVlc3QgaGVhZGVyLGluIFVURi0xNkxFIGZvcm1hdC4KKwkqCQlyZXNwb25zZQkJLQlQb2ludGVyIHRvIHRoZSBGUERGX0JTVFIgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2UgZGF0YSBmcm9tIHNlcnZlciwsaW4gVVRGLTE2TEUgZm9ybWF0LgorCSogUmV0dXJuIHZhbHVlOgorCSogCQlUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisJKiovCisJRlBERl9CT09MCSgqRkZJX1Bvc3RSZXF1ZXN0VVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIHdzVVJMLCBGUERGX1dJREVTVFJJTkcgd3NEYXRhLCBGUERGX1dJREVTVFJJTkcgd3NDb250ZW50VHlwZSwgRlBERl9XSURFU1RSSU5HIHdzRW5jb2RlLCBGUERGX1dJREVTVFJJTkcgd3NIZWFkZXIsIEZQREZfQlNUUiogcmVzcG9uZSk7CisJLyoqIAorCSogTWV0aG9kOiBGRklfUHV0UmVxdWVzdFVSTAorCSoJCQlUaGlzIG1ldGhvZCB3aWxsIHB1dCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIFVSTC4KKwkqIEludGVyZmFjZSBWZXJzaW9uOgorCSoJCQkxCisJKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDogCisJKgkJCXllcworCSogUGFyYW1ldGVyczoKKwkqCQlwVGhpcwkJCS0JUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisJKgkJd3NVUkwJCQktCVRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KKwkqCQl3c0RhdGEJCQktCVRoZSBwdXQgZGF0YSwgaW4gVVRGLTE2TEUgZm9ybWF0LgorCSoJCXdzRW5jb2RlCQktCVRoZSBlbmNvZGUgdHlwZSwgaW4gVVRSLTE2TEUgZm9ybWF0LgorCSogUmV0dXJuIHZhbHVlOgorCSogCQlUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisJKiovCisJRlBERl9CT09MCSgqRkZJX1B1dFJlcXVlc3RVUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSk7CisJCQogCUlQREZfSlNQTEFURk9STSoJbV9wSnNQbGF0Zm9ybTsKIAogfSBGUERGX0ZPUk1GSUxMSU5GTzsKQEAgLTY4OCw2ICs5NDksOSBAQAogICoqLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25MQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSk7CiAKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uS2V5RG93bgogICoJCQlZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiBhIG5vbnN5c3RlbSBrZXkgaXMgcHJlc3NlZC4gCkBAIC03NDYsNyArMTAxMCw3IEBACiAjZGVmaW5lIEZQREZfRk9STUZJRUxEX0NPTUJPQk9YCQk0CQkvLyBjb21ibyBib3ggdHlwZS4KICNkZWZpbmUgRlBERl9GT1JNRklFTERfTElTVEJPWAkJNQkJLy8gbGlzdCBib3ggdHlwZS4KICNkZWZpbmUgRlBERl9GT1JNRklFTERfVEVYVEZJRUxECTYJCS8vIHRleHQgZmllbGQgdHlwZS4KLQorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9YRkEJCQk3CQkvLyB0ZXh0IGZpZWxkIHR5cGUuCiAvKioKICAqIEZ1bmN0aW9uOiBGUERQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQKICAqCQkJQ2hlY2sgdGhlIGZvcm0gZmlsZWQgcG9zaXRpb24gYnkgcG9pbnQuCkBAIC04MjcsNyArMTA5MSwxNDkgQEAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9GRkxEcmF3KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgCiAJCQkJCQlpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LCBpbnQgcm90YXRlLCBpbnQgZmxhZ3MpOwogCisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX0xvYWRYRkEKKyAqCQkJSWYgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIFhGQSBmaWVsZHMsIHRoZXJlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIGxvYWQgWEZBIGZpZWxkcy4KKyAqIFBhcmFtZXRlcnM6CisgKgkJCWRvY3VtZW50CQktCUhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCVRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3Msb3RoZXJ3aXNlIEZBTFNFLgorICoqLworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfTG9hZFhGQShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAorLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfVW5kbworICoJCQlUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgdW5kbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKgkJCWRvY3VtZW50CQktCUhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKgkJCWhXaWRnZXQJCQktCUhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogUmV0dXJuIFZhbHVlOgorICoJCQlOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfUmVkbworICoJCQlUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgcmVkbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKgkJCWRvY3VtZW50CQktCUhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKgkJCWhXaWRnZXQJCQktCUhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogUmV0dXJuIFZhbHVlOgorICoJCQlOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfU2VsZWN0QWxsCisgKgkJCVRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzZWxlY3QgYWxsIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogUGFyYW1ldGVyczoKKyAqCQkJZG9jdW1lbnQJCS0JSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqCQkJaFdpZGdldAkJCS0JSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCU5vbmUuCisgKiovCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1NlbGVjdEFsbChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KTsKKy8qKgorICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0NvcHkKKyAqCQkJVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIGNvcHkgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEgZmllbGQuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlkb2N1bWVudAkJLQlIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICoJCQloV2lkZ2V0CQkJLQlIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KKyAqCQkJd3NUZXh0CQkJLQlQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGNvcGllZCBkYXRhLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKgkJCXNpemUJCQktCVRoZSBkYXRhIGJ1ZmZlciBzaXplLgorICogUmV0dXJuIFZhbHVlOgorICoJCQlOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9Db3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfQ3V0CisgKgkJCVRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBjdXQgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEgZmllbGQuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlkb2N1bWVudAkJLQlIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICoJCQloV2lkZ2V0CQkJLQlIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KKyAqCQkJd3NUZXh0CQkJLQlQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGN1dCBkYXRhLGluIFVURi0xNkxFIGZvcm1hdC4KKyAqCQkJc2l6ZQkJCS0JVGhlIGRhdGEgYnVmZmVyIHNpemUsbm90IHRoZSBieXRlIG51bWJlci4KKyAqIFJldHVybiBWYWx1ZToKKyAqCQkJTm9uZS4KKyAqKi8KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfUGFzdGUKKyAqCQkJVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHBhc3RlIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogUGFyYW1ldGVyczoKKyAqCQkJZG9jdW1lbnQJCS0JSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqCQkJaFdpZGdldAkJCS0JSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCisgKgkJCXdzVGV4dAkJCS0JVGhlIHBhc3RlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKgkJCXNpemUJCQktCVRoZSBkYXRhIGJ1ZmZlciBzaXplLG5vdCB0aGUgYnl0ZSBudW1iZXIuCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCU5vbmUuCisgKiovCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1Bhc3RlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQgc2l6ZSk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9SZXBsYWNlU3BlbGxDaGVja1dvcmQKKyAqCQkJVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogUGFyYW1ldGVyczoKKyAqCQkJZG9jdW1lbnQJCS0JSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqCQkJaFdpZGdldAkJCS0JSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCisgKgkJCXgJCQkJLQlUaGUgeCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgorICoJCQl5CQkJCS0JVGhlIHkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludC4KKyAqCQkJYnNUZXh0CQkJLQlUaGUgdGV4dCBidWZmZXIgbmVlZGVkIHRvIGJlIHNwZWNrIGNoZWNrLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCU5vbmUuCisgKiovCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1JlcGxhY2VTcGVsbENoZWNrV29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBmbG9hdCB4LCBmbG9hdCB5LCBGUERGX0JZVEVTVFJJTkcgYnNUZXh0KTsKKy8qKgorICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcworICoJCQlUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgc3BlbGwgY2hlY2sgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEgZmllbGQuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlkb2N1bWVudAkJLQlIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICoJCQloV2lkZ2V0CQkJLQlIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KKyAqCQkJeAkJCQktCVRoZSB4IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgKgkJCXkJCQkJLQlUaGUgeSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgorICoJCQlzdHJpbmdIYW5kbGUJLQlQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFIHRvIHJlY2VpdmUgdGhlIHNwZWNrIGNoZWNrIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCU5vbmUuCisgKiovCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBmbG9hdCB4LCBmbG9hdCB5LCBGUERGX1NUUklOR0hBTkRMRSogc3RyaW5nSGFuZGxlKTsKKy8qKgorICogRnVuY3Rpb246IEZQREZfU3RyaW5nSGFuZGxlQ291bnRzCisgKgkJCVRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjb3VudCBvZiB0aGUgdGV4dCBidWZmZXIuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlzdHJpbmdIYW5kbGUJLQlQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgorICogUmV0dXJuIFZhbHVlOgorICoJCQlOb25lLgorICoqLworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlQ291bnRzKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgKKyAqCQkJVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgdGV4dCBidWZmZXIuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlzdHJpbmdIYW5kbGUJLQlQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgorICoJCQlpbmRleAkJCS0JVGhlIHNwZWNpZmllZCBpbmRleCBvZiB0ZXh0IGJ1ZmZlci4KKyAqCQkJYnNUZXh0CQkJLQlQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKgkJCXNpemUJCQktCVRoZSBieXRlIHNpemUgb2YgZGF0YSBidWZmZXIuCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCVRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3MsIG90aGVyd2lzZSBGQUxTRS4KKyAqKi8KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLCBpbnQgaW5kZXgsIEZQREZfQllURVNUUklORyBic1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVSZWxlYXNlCisgKgkJCVRoaXMgbWV0aG9kIHdpbGwgcmVsZWFzZSB0aGUgRlBERl9TVFJJTkdIQU5ETEUuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlzdHJpbmdIYW5kbGUJLQlQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgorICogUmV0dXJuIFZhbHVlOgorICoJCQlOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZVJlbGVhc2UoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKTsKKy8qKgorICogRnVuY3Rpb246IEZQREZfU3RyaW5nSGFuZGxlQWRkU3RyaW5nCisgKgkJCVRoaXMgbWV0aG9kIHdpbGwgYWRkIHRoZSBzcGVjaWZpZWQgdGV4dCBidWZmZXIuCisgKiBQYXJhbWV0ZXJzOgorICoJCQlzdHJpbmdIYW5kbGUJLQlQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgorICoJCQlic1RleHQJCQktCVBvaW50ZXIgdG8gZGF0YSBidWZmZXIgb2YgdGhlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKgkJCXNpemUJCQktCVRoZSBieXRlIHNpemUgb2YgZGF0YSBidWZmZXIuCisgKiBSZXR1cm4gVmFsdWU6CisgKgkJCVRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3MsIG90aGVyd2lzZSBGQUxTRS4KKyAqKi8KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsIEZQREZfQllURVNUUklORyBic1RleHQsIEZQREZfRFdPUkQgc2l6ZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmcHBvLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnBwby5oCmluZGV4IDNlN2U1YzkuLmRiNzhhMTkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmcHBvLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZwcG8uaApAQCAtMjMsNiArMjMsOSBAQAogLy8JCQlpbmRleAkJLQlUaGUgcGFnZSBpbmRleCB3YW50ZWQgdG8gaW5zZXJ0IGZyb20uCQogLy8gUmV0dXJuIHZhbHVlOgogLy8JCQlUUlVFIGZvciBzdWNjZWVkLCBGQUxTRSBmb3IgRmFpbGVkLgkKKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLEZQREZfRE9DVU1FTlQgc3JjX2RvYywgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwgaW50IGluZGV4KTsKIAogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnRleHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdGV4dC5oCmluZGV4IDhiODk3NzkuLjE0M2E2YzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdGV4dC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdGV4dC5oCkBAIC0yNCw2ICsyNCw4IEBACiAvLyBDb21tZW50czoKIC8vCQkJQXBwbGljYXRpb24gbXVzdCBjYWxsIEZQREZUZXh0X0Nsb3NlUGFnZSB0byByZWxlYXNlIHRoZSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24uCiAvLwkJCUlmIHlvdSBkb24ndCBwdXJjaGFzZSBUZXh0IE1vZHVsZSAsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC4KKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBsb2FkIG91dCBGUERGX1RFWFRQQUdFIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBmaWVsZHMuCiAvLwkKIERMTEVYUE9SVCBGUERGX1RFWFRQQUdFCVNURENBTEwgRlBERlRleHRfTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnZpZXcuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdmlldy5oCmluZGV4IDRkY2RjZjYuLjE2MWJjYTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdmlldy5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdmlldy5oCkBAIC0xOCw2ICsxOCw4IEBACiAvLyBQREYgdHlwZXMKIHR5cGVkZWYgdm9pZCoJRlBERl9ET0NVTUVOVDsJCQogdHlwZWRlZiB2b2lkKglGUERGX1BBR0U7CQkJCit0eXBlZGVmIHZvaWQqCUZQREZfV0lER0VUOwkKK3R5cGVkZWYgdm9pZCoJRlBERl9TVFJJTkdIQU5ETEU7CiB0eXBlZGVmIHZvaWQqCUZQREZfUEFHRU9CSkVDVDsJLy8gUGFnZSBvYmplY3QodGV4dCwgcGF0aCwgZXRjKQogdHlwZWRlZiB2b2lkKglGUERGX1BBVEg7CiB0eXBlZGVmIHZvaWQqCUZQREZfQ0xJUFBBVEg7CQpAQCAtMzcsNiArMzksOSBAQAogdHlwZWRlZiB2b2lkKiAgIEZQREZfUEFHRVJBTkdFOwogCiAvLyBCYXNpYyBkYXRhIHR5cGVzCit0eXBlZGVmIHZvaWQqCQkJRlBERl9MUFZPSUQ7Cit0eXBlZGVmIHZvaWQgY29uc3QqCQlGUERGX0xQQ1ZPSUQ7Cit0eXBlZGVmIGludAkJCQlGUERGX1JFU1VMVDsKIHR5cGVkZWYgaW50CQkJCUZQREZfQk9PTDsKIHR5cGVkZWYgaW50CQkJCUZQREZfRVJST1I7CQogdHlwZWRlZiB1bnNpZ25lZCBsb25nCUZQREZfRFdPUkQ7CkBAIC01NCw2ICs1OSw3IEBACiAvLyBTdHJpbmcgdHlwZXMKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCQlGUERGX1dDSEFSOwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGNvbnN0KglGUERGX0xQQ0JZVEU7Cit0eXBlZGVmIGNoYXIgY29uc3QqCQkJCUZQREZfTFBDU1RSOwogCiAvLyBGUERGU0RLIG1heSB1c2UgdGhyZWUgdHlwZXMgb2Ygc3RyaW5nczogYnl0ZSBzdHJpbmcsIHdpZGUgc3RyaW5nIChVVEYtMTZMRSBlbmNvZGVkKSwgYW5kIHBsYXRmb3JtIGRlcGVuZGVudCBzdHJpbmcKIHR5cGVkZWYgY29uc3QgY2hhcioJCQkJRlBERl9CWVRFU1RSSU5HOwpAQCAtNjEsNiArNjcsMjYgQEAKIHR5cGVkZWYgY29uc3QgdW5zaWduZWQgc2hvcnQqCUZQREZfV0lERVNUUklORzsJCS8vIEZveGl0IFBERiBTREsgYWx3YXlzIHVzZSBVVEYtMTZMRSBlbmNvZGluZyB3aWRlIHN0cmluZywKIAkJCQkJCQkJCQkJCQkJLy8gZWFjaCBjaGFyYWN0ZXIgdXNlIDIgYnl0ZXMgKGV4Y2VwdCBzdXJyb2dhdGlvbiksIHdpdGggbG93IGJ5dGUgZmlyc3QuCiAKKyNpZm5kZWYgX0ZQREZfREVGX1NUUl8KKyNkZWZpbmUgX0ZQREZfREVGX1NUUl8KKy8qKiBAYnJpZWYgU3RydWN0dXJlIGZvciBieXRlIHN0cmluZy4KKyAgKgorICAqIEBub3RlIEluIFNESywgYSBieXRlIHN0cmluZyBjb21tb25seSBtZWFucyBhIFVURi0xNkxFIGZvcm1hdCBzdHJpbmcuCisgICovCit0eXBlZGVmIHN0cnVjdCBfRlBERl9CU1RSCit7CisJLyoqIAorCSAqIEBicmllZiBTdHJpbmcgYnVmZmVyLgorCSAqLworCWNoYXIqCXN0cjsKKwkvKioKKwkgKiBAYnJpZWYJTGVuZ3RoIG9mIGEgc3RyaW5nLCBpbiBieXRlcy4KKwkgKi8KKwlpbnQJbGVuOworfSBGUERGX0JTVFI7CisKKyNlbmRpZgorCiAvLyBGb3IgV2luZG93cyBwcm9ncmFtbWVyczogZm9yIG1vc3QgY2FzZSBpdCdzIE9LIHRvIHRyZWF0IEZQREZfV0lERVNUUklORyBhcyBXaW5kb3dzIHVuaWNvZGUgc3RyaW5nLAogLy8JCSBob3dldmVyLCBzcGVjaWFsIGNhcmUgbmVlZHMgdG8gYmUgdGFrZW4gaWYgeW91IGV4cGVjdCB0byBwcm9jZXNzIFVuaWNvZGUgbGFyZ2VyIHRoYW4gMHhmZmZmLgogLy8gRm9yIExpbnV4L1VuaXggcHJvZ3JhbW1lcnM6IG1vc3QgY29tcGlsZXIvbGlicmFyeSBlbnZpcm9ubWVudCB1c2VzIDQgYnl0ZXMgZm9yIGEgVW5pY29kZSBjaGFyYWN0ZXIsCkBAIC0xNjYsNiArMTkyLDkgQEAKICogQG5vdGUJCUxvYWRlZCBkb2N1bWVudCBjYW4gYmUgY2xvc2VkIGJ5IEZQREZfQ2xvc2VEb2N1bWVudC4KICoJCQlJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB5b3UgY2FuIHVzZSBGUERGX0dldExhc3RFcnJvcigpIHRvIHJldHJpZXZlCiAqCQkJdGhlIHJlYXNvbiB3aHkgaXQgZmFpbHMuCisqCQkJVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDo6RlBERl9Mb2FkWEZBIGZ1bmN0aW9uIGFmdGVyIFBERiBkb2N1bWVudCBsb2FkZWQgCisqCQkJdG8gc3VwcG9ydCBYRkEgZmllbGRzIGluIGZwZGZmb3JtZmlsbC5oIGZpbGUuCisqCiAqIEByZXR2YWwJQSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4gSWYgZmFpbGVkLCBOVUxMIGlzIHJldHVybmVkLgogKi8KIERMTEVYUE9SVCBGUERGX0RPQ1VNRU5UCVNURENBTEwgRlBERl9Mb2FkRG9jdW1lbnQoRlBERl9TVFJJTkcgZmlsZV9wYXRoLCAKQEAgLTE4NSw2ICsyMTQsOSBAQAogLy8JCQlMb2FkZWQgZG9jdW1lbnQgY2FuIGJlIGNsb3NlZCBieSBGUERGX0Nsb3NlRG9jdW1lbnQuCiAvLwkJCUlmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHlvdSBjYW4gdXNlIEZQREZfR2V0TGFzdEVycm9yKCkgdG8gcmV0cmlldmUKIC8vCQkJdGhlIHJlYXNvbiB3aHkgaXQgZmFpbHMuCisvLyBOb3RlczoKKy8vCQkJVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDo6RlBERl9Mb2FkWEZBIGZ1bmN0aW9uIGFmdGVyIFBERiBkb2N1bWVudCBsb2FkZWQgCisvLwkJCXRvIHN1cHBvcnQgWEZBIGZpZWxkcyBpbiBmcGRmZm9ybWZpbGwuaCBmaWxlLgogLy8KIERMTEVYUE9SVCBGUERGX0RPQ1VNRU5UCVNURENBTEwgRlBERl9Mb2FkTWVtRG9jdW1lbnQoY29uc3Qgdm9pZCogZGF0YV9idWYsIAogCQkJCQkJCQkJCQlpbnQgc2l6ZSwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKQEAgLTIwNiw2ICsyMzgsNzggQEAKIAl2b2lkKgkJCW1fUGFyYW07CiB9IEZQREZfRklMRUFDQ0VTUzsKIAorLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGZvciBmaWxlIHJlYWRpbmcgb3Igd3JpdGluZyAoSS9PKS4KKyAqCisgKiBAbm90ZSBUaGlzIGlzIGEgaGFuZGxlciBhbmQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNhbGxlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9GUERGX0ZJTEVIQU5ETEVSCit7CisJLyoqCisJICogQGJyaWVmIFVzZXItZGVmaW5lZCBkYXRhLgorCSAqIEBub3RlIENhbGxlcnMgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHRyYWNrIGNvbnRyb2xzLgorCSAqLworCUZQREZfTFBWT0lECWNsaWVudERhdGE7CisJLyoqCisJICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gb2JqZWN0LgorCSAqCisJICogQHBhcmFtW2luXSBjbGllbnREYXRhCVBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisJICoKKwkgKiBAcmV0dXJuIE5vbmUuCisJICovCisJdm9pZAkJKCpSZWxlYXNlKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKKwkvKioKKwkgKiBAYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gc2l6ZS4KKwkgKgorCSAqIEBwYXJhbVtpbl0gY2xpZW50RGF0YQlQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgorCSAqCisJICogQHJldHVybiBTaXplIG9mIGZpbGUgc3RyZWFtLgorCSAqLworCUZQREZfRFdPUkQJKCpHZXRTaXplKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKKwkvKioKKwkgKiBAYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVhZCBkYXRhIGZyb20gdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0uCisJICoKKwkgKiBAcGFyYW1baW5dCWNsaWVudERhdGEJUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKwkgKiBAcGFyYW1baW5dCW9mZnNldAkJT2Zmc2V0IHBvc2l0aW9uIHN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyByZWFkaW5nIHBvc2l0aW9uLgorCSAqIEBwYXJhbVtpbl0JYnVmZmVyCQlNZW1vcnkgYnVmZmVyIHRvIHN0b3JlIGRhdGEgd2hpY2ggYXJlIHJlYWQgZnJvbSBmaWxlIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSA8Yj5OVUxMPC9iPi4KKwkgKiBAcGFyYW1baW5dCXNpemUJCVNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4gVGhlIGJ1ZmZlciBpbmRpY2F0ZWQgYnkgdGhlIHBhcmFtZXRlciA8aT5idWZmZXI8L2k+IHNob3VsZCBiZSBlbm91Z2ggdG8gc3RvcmUgc3BlY2lmaWVkIGRhdGEuCisJICogCisJICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKwkgKi8KKwlGUERGX1JFU1VMVAkoKlJlYWRCbG9jaykoRlBERl9MUFZPSUQgY2xpZW50RGF0YSwgRlBERl9EV09SRCBvZmZzZXQsIEZQREZfTFBWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKTsKKwkvKioKKwkgKiBAYnJpZWYJQ2FsbGJhY2sgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBpbnRvIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgorCSAqCisJICogQHBhcmFtW2luXQljbGllbnREYXRhCVBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisJICogQHBhcmFtW2luXQlvZmZzZXQJCU9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd3JpdGluZyBwb3NpdGlvbi4KKwkgKiBAcGFyYW1baW5dCWJ1ZmZlcgkJTWVtb3J5IGJ1ZmZlciBjb250YWlucyBkYXRhIHdoaWNoIGlzIHdyaXR0ZW4gaW50byBmaWxlIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSA8Yj5OVUxMPC9iPi4KKwkgKiBAcGFyYW1baW5dCXNpemUJCVNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4KKwkgKgorCSAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCisJICovCisJRlBERl9SRVNVTFQJKCpXcml0ZUJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUENWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKTsKKwkvKioKKwkgKiBAYnJpZWYJQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZmx1c2ggYWxsIGludGVybmFsIGFjY2Vzc2luZyBidWZmZXJzLgorCSAqCisJICogQHBhcmFtW2luXQljbGllbnREYXRhCVBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisJICoKKwkgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgorCSAqLworCUZQREZfUkVTVUxUCSgqRmx1c2gpKEZQREZfTFBWT0lEIGNsaWVudERhdGEpOworCS8qKgorCSAqIEBicmllZglDYWxsYmFjayBmdW5jdGlvbiB0byBjaGFuZ2UgZmlsZSBzaXplLgorCSAqCisJICogQGRldGFpbHMJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgd3JpdGluZyBtb2RlIHVzdWFsbHkuIEltcGxlbWVudGVyIGNhbiBkZXRlcm1pbmUgd2hldGhlciB0byByZWFsaXplIGl0IGJhc2VkIG9uIGFwcGxpY2F0aW9uIHJlcXVlc3RzLgorCSAqCisJICogQHBhcmFtW2luXQljbGllbnREYXRhCVBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisJICogQHBhcmFtW2luXQlzaXplCQlOZXcgc2l6ZSBvZiBmaWxlIHN0cmVhbSwgaW4gYnl0ZXMuCisJICoKKwkgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgorCSAqLworCUZQREZfUkVTVUxUCSgqVHJ1bmNhdGUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgc2l6ZSk7CisKK30gRlBERl9GSUxFSEFORExFUiwgKkZQREZfTFBGSUxFSEFORExFUjsKKwogLy8gRnVuY3Rpb246IEZQREZfTG9hZEN1c3RvbURvY3VtZW50CiAvLwkJCUxvYWQgUERGIGRvY3VtZW50IGZyb20gYSBjdXN0b20gYWNjZXNzIGRlc2NyaXB0b3IuCiAvLyBQYXJhbWV0ZXJzOgpAQCAtMjE2LDYgKzMyMCwxMCBAQAogLy8gQ29tbWVudHM6CiAvLwkJCVRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbWFpbnRhaW4gdGhlIGZpbGUgcmVzb3VyY2VzIGJlaW5nIHZhbGlkIHVudGlsIHRoZSBQREYgZG9jdW1lbnQgY2xvc2UuCiAvLwkJCUxvYWRlZCBkb2N1bWVudCBjYW4gYmUgY2xvc2VkIGJ5IEZQREZfQ2xvc2VEb2N1bWVudC4KKy8vIE5vdGVzOgorLy8JCQlUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgOjpGUERGX0xvYWRYRkEgZnVuY3Rpb24gYWZ0ZXIgUERGIGRvY3VtZW50IGxvYWRlZCAKKy8vCQkJdG8gc3VwcG9ydCBYRkEgZmllbGRzIGluIGZwZGZmb3JtZmlsbC5oIGZpbGUuCisvLwogRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWRDdXN0b21Eb2N1bWVudChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzLCAKIAkJCQkJCQkJCQkJCQkJRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKIApAQCAtMjI4LDYgKzMzNiw3IEBACiAvLwkJCVRSVUUgaWYgdGhpcyBjYWxsIHN1Y2NlZWQsIElmIGZhaWxlZCwgRkFMU0UgaXMgcmV0dXJuZWQuCiAvLyBDb21tZW50czoKIC8vCQkJSWYgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgYnkgZnVuY3Rpb24gOjpGUERGX0NyZWF0ZU5ld0RvY3VtZW50LCB0aGVuIHRoaXMgZnVuY3Rpb24gd291bGQgYWx3YXlzIGZhaWwuCisvLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfR2V0RmlsZVZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2MsIGludCogZmlsZVZlcnNpb24pOwogCiAjZGVmaW5lIEZQREZfRVJSX1NVQ0NFU1MJCTAJCS8vIE5vIGVycm9yLgpAQCAtMjM3LDYgKzM0Niw4IEBACiAjZGVmaW5lIEZQREZfRVJSX1BBU1NXT1JECQk0CQkvLyBQYXNzd29yZCByZXF1aXJlZCBvciBpbmNvcnJlY3QgcGFzc3dvcmQuCiAjZGVmaW5lIEZQREZfRVJSX1NFQ1VSSVRZCQk1CQkvLyBVbnN1cHBvcnRlZCBzZWN1cml0eSBzY2hlbWUuCiAjZGVmaW5lIEZQREZfRVJSX1BBR0UJCQk2CQkvLyBQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yLgorI2RlZmluZSBGUERGX0VSUl9YRkFMT0FECQk3CQkvLyBMb2FkIFhGQSBlcnJvci4KKyNkZWZpbmUgRlBERl9FUlJfWEZBTEFZT1VUCQk4ICAgICAgIC8vIExheW91dCBYRkEgZXJyb3IuCiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldExhc3RFcnJvcgogLy8JCQlHZXQgbGFzdCBlcnJvciBjb2RlIHdoZW4gYW4gU0RLIGZ1bmN0aW9uIGZhaWxlZC4KQEAgLTM1NCw2ICs0NjUsOCBAQAogLy8JCQlmbGFncwkJLQkwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vCQkJTm9uZS4KKy8vIE5vdGVzOgorLy8JCQlUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byByZW5kZXIgdGhlIHBhZ2UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuIAogLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlKEhEQyBkYywgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKIAkJCQkJCWludCByb3RhdGUsIGludCBmbGFncyk7CkBAIC0zNzQsNiArNDg3LDggQEAKIC8vCQkJZmxhZ3MJCS0JMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGRlZmluZWQgYWJvdmUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLwkJCU5vbmUuCisvLyBOb3RlczoKKy8vCQkJVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gcmVuZGVyIHRoZSBwYWdlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLiAKIC8vCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIAogCQkJCQkJaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGZsYWdzKTsKQEAgLTYxMiw2ICs3MjcsMTggQEAKIC8vCiBETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCxGUERGX0JZVEVTVFJJTkcgbmFtZSk7CiAKKy8vIEZ1bmN0aW9uOiBGUERGX0JTdHJfSW5pdAkKKy8vCQkJSGVscGVyIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSBieXRlIHN0cmluZy4KK0RMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9Jbml0KEZQREZfQlNUUiogc3RyKTsKKworLy8gRnVuY3Rpb246IEZQREZfQlN0cl9TZXQJCisvLwkJCUhlbHBlciBmdW5jdGlvbiB0byBzZXQgc3RyaW5nIGRhdGEuCitETExFWFBPUlQgRlBERl9SRVNVTFQgU1REQ0FMTCBGUERGX0JTdHJfU2V0KEZQREZfQlNUUiogc3RyLCBGUERGX0xQQ1NUUiBic3RyLCBpbnQgbGVuZ3RoKTsKKworLy8gRnVuY3Rpb246IEZQREZfQlN0cl9DbGVhcgkKKy8vCQkJSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFyIGEgYnl0ZSBzdHJpbmcuCitETExFWFBPUlQgRlBERl9SRVNVTFQgU1REQ0FMTCBGUERGX0JTdHJfQ2xlYXIoRlBERl9CU1RSKiBzdHIpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2FhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisgDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GUERGWEZBX0FQUF9IXw0KKyNkZWZpbmUgX0ZQREZYRkFfQVBQX0hfDQorDQorY2xhc3MgQ1BERlhGQV9BcHA7DQorY2xhc3MgSUZYSlNfUnVudGltZTsNCitjbGFzcyBDSlNfUnVudGltZUZhY3Rvcnk7DQorDQorY2xhc3MgQ1BERlhGQV9BcHAgOiBwdWJsaWMgSVhGQV9BcHBQcm92aWRlciwgcHVibGljIENGWF9PYmplY3QgDQorew0KK3B1YmxpYzoNCisJQ1BERlhGQV9BcHAoKTsNCisJfkNQREZYRkFfQXBwKCk7DQorDQorCUZYX0JPT0wJCQkJSW5pdGlhbGl6ZSgpOw0KKw0KKwlJWEZBX0FwcCoJCQlHZXRYRkFBcHAoKSB7IHJldHVybiBtX3BYRkFBcHA7IH0NCisNCisJCQkJCQkNCisJLypDUERGRG9jX0Vudmlyb25tZW50KkdldEZvcm1GaWxsRW52KCl7IHJldHVybiBtX3BFbnY7IH0qLw0KKwlGWF9CT09MCQkJCUFkZEZvcm1GaWxsRW52KENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOw0KKwlGWF9CT09MCQkJCVJlbW92ZUZvcm1GaWxsRW52KENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOw0KKw0KKwlGWEpTRV9IUlVOVElNRQkJR2V0SlNFUnVudGltZSgpIHsgcmV0dXJuIG1faEpTRVJ1bnRpbWU7IH0NCisNCisJdm9pZAkJCQlSZWxlYXNlUnVudGltZSgpOw0KKw0KKwlGWF9CT09MCQkJCUluaXRSdW50aW1lKEZYX0JPT0wgYlJlc2V0ID0gRkFMU0UpIHsNCisJCWlmIChiUmVzZXQpIHsNCisJCQltX2JJbml0UnVudGltZSA9IEZBTFNFOw0KKwkJCXJldHVybiBUUlVFOw0KKwkJfQ0KKwkJaWYgKG1fYkluaXRSdW50aW1lKQ0KKwkJCXJldHVybiBUUlVFOw0KKwkJbV9iSW5pdFJ1bnRpbWUgPSBUUlVFOw0KKwkJcmV0dXJuIEZBTFNFOw0KKwl9DQorDQorCS8vSUZYSlNfUnVudGltZSoJCUdldEpTUnVudGltZSgpOw0KKw0KKwlDSlNfUnVudGltZUZhY3RvcnkqIEdldFJ1bnRpbWVGYWN0b3J5KCkge3JldHVybiBtX3BKU1J1bnRpbWVGYWN0b3J5O30NCisNCitwdWJsaWM6DQorCS8qKg0KKwkgKlNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIGluIHdoaWNoIGEgZm9ybSBjdXJyZW50bHkgZXhpc3RzLiBTdWNoIGFzIEV4Y2hhbmdlLVByby4NCisJICovDQorCXZpcnR1YWwgdm9pZAkJR2V0QXBwVHlwZShDRlhfV2lkZVN0cmluZyAmd3NBcHBUeXBlKTsNCisJdmlydHVhbCB2b2lkCQlTZXRBcHBUeXBlKEZYX1dTVFIgd3NBcHBUeXBlKSA7DQorCXZpcnR1YWwgdm9pZAkJU2V0Rm94aXRBcHBUeXBlKEZYX1dTVFIgd3NGb3hpdEFwcFR5cGUpIHsgcmV0dXJuOyB9DQorCXZpcnR1YWwgdm9pZAkJR2V0Rm94aXRBcHBUeXBlKENGWF9XaWRlU3RyaW5nICZ3c0ZveGl0QXBwVHlwZSkgeyByZXR1cm47IH0NCisJdmlydHVhbCB2b2lkCQlHZXRGb3hpdEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRm94aXROYW1lKSB7d3NGb3hpdE5hbWUgPSBMIkZveGl0Ijt9DQorCXZpcnR1YWwgdm9pZAkJR2V0Rm94aXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nICZ3c0ZveGl0VmVyc2lvbikge3dzRm94aXRWZXJzaW9uID0gTCI3LjAiO30NCisJLyoqDQorCSAqUmV0dXJucyB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIHJ1bm5pbmcgaG9zdCBhcHBsaWNhdGlvbi4gU3VjaCBhcyB6aF9DTg0KKwkgKi8NCisJdmlydHVhbCB2b2lkCQlHZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyAmd3NMYW5ndWFnZSk7DQorCS8qKiANCisJCSpSZXR1cm5zIHRoZSBwbGF0Zm9ybSBvZiB0aGUgbWFjaGluZSBydW5uaW5nIHRoZSBzY3JpcHQuIFN1Y2ggYXMgV0lODQorCSAqLw0KKwl2aXJ0dWFsIHZvaWQJCUdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nICZ3c1BsYXRmb3JtKTsNCisJLyoqIA0KKwkgKiBJbmRpY2F0ZXMgdGhlIHBhY2thZ2luZyBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBpcyBydW5uaW5nIHRoZSBzY3JpcHQuIFN1Y2ggYXMgRnVsbA0KKwkgKi8NCisJdmlydHVhbCB2b2lkCQlHZXRWYXJpYXRpb24oQ0ZYX1dpZGVTdHJpbmcgJndzVmFyaWF0aW9uKTsNCisJLyoqIA0KKwkgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBTdWNoIGFzIDkNCisJICovDQorCXZpcnR1YWwgdm9pZAkJR2V0VmVyc2lvbihDRlhfV2lkZVN0cmluZyAmd3NWZXJzaW9uKTsNCisJLy9HZXQgYXBwbGljYXRpb24gbmFtZSwgc3VjaCBhcyBQaGFudG9tDQorCXZpcnR1YWwgdm9pZAkJR2V0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKTsNCisJLyoqIA0KKwkgKkNhdXNlcyB0aGUgc3lzdGVtIHRvIHBsYXkgYSBzb3VuZC4JDQorCSAqIEBwYXJhbVtpbl0gZHdUeXBlIFRoZSBzeXN0ZW0gY29kZSBmb3IgdGhlIGFwcHJvcHJpYXRlIHNvdW5kLjAgKEVycm9yKTEgKFdhcm5pbmcpMiAoUXVlc3Rpb24pMyAoU3RhdHVzKTQgKERlZmF1bHQpDQorCSAqLw0KKwl2aXJ0dWFsIHZvaWQJCUJlZXAoRlhfRFdPUkQgZHdUeXBlKTsNCisJLyoqDQorCSAqIERpc3BsYXlzIGEgbWVzc2FnZSBib3guDQorCSAqIEBwYXJhbVtpbl0gZHdJY29uVHlwZQlJY29uIHR5cGUsIHJlZmVyIHRvIFhGQV9NQklDT04uDQorCSAqIEBwYXJhbVtpbl0gZHdCdXR0b25UeXBlCUJ1dHRvbiB0eXBlLCByZWZlciB0byBYRkFfTUVTU0FHRUJVVFRPTi4NCisJICogQHJldHVybiBBIHZhbGlkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgYnV0dG9uIHByZXNzZWQgYnkgdGhlIHVzZXIsIHJlZmVyIHRvIFhGQV9JRC4NCisJICovDQorCXZpcnR1YWwgRlhfSU5UMzIJTXNnQm94KEZYX1dTVFIgd3NNZXNzYWdlLCBGWF9XU1RSIHdzVGl0bGUgPSBGWF9XU1RSQyhMIiIpLCBGWF9EV09SRCBkd0ljb25UeXBlID0gMCwgRlhfRFdPUkQgZHdCdXR0b25UeXBlID0gMCk7DQorCS8vYk1hcmsgVHJ1ZSAoZGVmYXVsdCkgTWFza3MgdGhlIHVzZXKhr3MgYW5zd2VyIHdpdGggKiAoYXN0ZXJpc2tzKS4gRmFsc2UgRG9lcyBub3QgbWFzayB0aGUgdXNlcqGvcyBhbnN3ZXIuIA0KKwl2aXJ0dWFsIHZvaWQJCVJlc3BvbnNlKENGWF9XaWRlU3RyaW5nICZ3c0Fuc3dlciwgRlhfV1NUUiB3c1F1ZXN0aW9uLCBGWF9XU1RSIHdzVGl0bGUgPSBGWF9XU1RSQyhMIiIpLCBGWF9XU1RSIHdzRGVmYXVsdEFuc3dlciA9IEZYX1dTVFJDKEwiIiksIEZYX0JPT0wgYk1hcmsgPSBUUlVFKTsNCisJdmlydHVhbCBGWF9JTlQzMglHZXREb2N1bWVudENvdW50SW5CYXRjaCgpOw0KKwl2aXJ0dWFsIEZYX0lOVDMyCUdldEN1ckRvY3VtZW50SW5CYXRjaCgpOw0KKwkvL3dzVVJMIGh0dHAsIGZ0cCwgc3VjaCBhcyAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iLg0KKwl2aXJ0dWFsIElGWF9GaWxlUmVhZCogRG93bmxvYWRVUkwoRlhfV1NUUiB3c1VSTCk7DQorCS8qDQorCSogUG9zdCBkYXRhIHRvIHRoZSBnaXZlbiB1cmwuDQorCSogQHBhcmFtW2luXSB3c1VSTAkJCXRoZSBVUkwgYmVpbmcgdXBsb2FkZWQuDQorCSogQHBhcmFtW2luXSB3c0RhdGEJCQl0aGUgZGF0YSBiZWluZyB1cGxvYWRlZC4NCisJKiBAcGFyYW1baW5dIHdzQ29udGVudFR5cGUJdGhlIGNvbnRlbnQgdHlwZSBvZiBkYXRhIGluY2x1ZGluZyB0ZXh0L2h0bWwsIHRleHQveG1sLCB0ZXh0L3BsYWluLCBtdWx0aXBhcnQvZm9ybS1kYXRhLCANCisJKgkJCQkJCQlhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQsIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSwgYW55IHZhbGlkIE1JTUUgdHlwZS4NCisJKiBAcGFyYW1baW5dIHdzRW5jb2RlCQl0aGUgZW5jb2RlIG9mIGRhdGEgaW5jbHVkaW5nIFVURi04LCBVVEYtMTYsIElTTzg4NTktMSwgYW55IHJlY29nbml6ZWQgW0lBTkFdY2hhcmFjdGVyIGVuY29kaW5nDQorCSogQHBhcmFtW2luXSB3c0hlYWRlcgkJYW55IGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwb3N0Lg0KKwkqIEBwYXJhbVtvdXRdIHdzUmVzcG9uc2UJZGVjb2RlZCByZXNwb25zZSBmcm9tIHNlcnZlci4NCisJKiBAcmV0dXJuIFRSVUUgU2VydmVyIHBlcm1pdHRlZCB0aGUgcG9zdCByZXF1ZXN0LCBGQUxTRSBvdGhlcndpc2UuDQorCSovDQorCXZpcnR1YWwgRlhfQk9PTAkJUG9zdFJlcXVlc3RVUkwoRlhfV1NUUiB3c1VSTCwgRlhfV1NUUiB3c0RhdGEsIEZYX1dTVFIgd3NDb250ZW50VHlwZSwgDQorCQkJCQkJCQkJICAgIEZYX1dTVFIgd3NFbmNvZGUsIEZYX1dTVFIgd3NIZWFkZXIsIENGWF9XaWRlU3RyaW5nICZ3c1Jlc3BvbnNlKTsNCisNCisJLyoNCisJKiBQdXQgZGF0YSB0byB0aGUgZ2l2ZW4gdXJsLg0KKwkqIEBwYXJhbVtpbl0gd3NVUkwJCQl0aGUgVVJMIGJlaW5nIHVwbG9hZGVkLg0KKwkqIEBwYXJhbVtpbl0gd3NEYXRhCQkJdGhlIGRhdGEgYmVpbmcgdXBsb2FkZWQuDQorCSogQHBhcmFtW2luXSB3c0VuY29kZQkJdGhlIGVuY29kZSBvZiBkYXRhIGluY2x1ZGluZyBVVEYtOCwgVVRGLTE2LCBJU084ODU5LTEsIGFueSByZWNvZ25pemVkIFtJQU5BXWNoYXJhY3RlciBlbmNvZGluZw0KKwkqIEByZXR1cm4gVFJVRSBTZXJ2ZXIgcGVybWl0dGVkIHRoZSBwb3N0IHJlcXVlc3QsIEZBTFNFIG90aGVyd2lzZS4NCisJKi8NCisJdmlydHVhbCBGWF9CT09MCQlQdXRSZXF1ZXN0VVJMKEZYX1dTVFIgd3NVUkwsIEZYX1dTVFIgd3NEYXRhLCBGWF9XU1RSIHdzRW5jb2RlKTsNCisNCisJdmlydHVhbCB2b2lkCQlMb2FkU3RyaW5nKEZYX0lOVDMyIGlTdHJpbmdJRCwgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyaW5nKTsNCisJdmlydHVhbAlGWF9CT09MCQlTaG93RmlsZURpYWxvZyhGWF9XU1RSIHdzVGl0bGUsIEZYX1dTVFIgd3NGaWx0ZXIsIENGWF9XaWRlU3RyaW5nQXJyYXkgJndzUGF0aEFyciwgRlhfQk9PTCBiT3BlbiA9IFRSVUUpOw0KKwl2aXJ0dWFsIElGV0xfQWRhcHRlclRpbWVyTWdyKiBHZXRUaW1lck1ncigpOw0KKw0KKwlDRlhfQXJyYXlUZW1wbGF0ZTxDUERGRG9jX0Vudmlyb25tZW50Kj4gbV9wRW52TGlzdDsNCisNCitwdWJsaWM6DQorCXN0YXRpYyBDUERGWEZBX0FwcCogbV9wQXBwOw0KKw0KK3ByaXZhdGU6DQorCUlYRkFfQXBwKiAgbV9wWEZBQXBwOw0KKwlJWEZBX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7DQorCUZYSlNFX0hSVU5USU1FIG1faEpTRVJ1bnRpbWU7DQorCUlGWEpTX1J1bnRpbWUqIG1fcEpTUnVudGltZTsNCisJQ0pTX1J1bnRpbWVGYWN0b3J5KiAgbV9wSlNSdW50aW1lRmFjdG9yeTsNCisNCisJQ0ZYX1dpZGVTdHJpbmcJbV9jc0FwcFR5cGU7DQorCUZYX0JPT0wJCQltX2JJbml0UnVudGltZTsNCit9Ow0KKw0KK0NQREZYRkFfQXBwKiBGUERGWEZBX0dldEFwcCgpOw0KK3ZvaWQgRlBERlhGQV9SZWxlYXNlQXBwKCk7DQorDQorI2VuZGlmIA0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGRlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisgDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GUERGWEZBX0RPQ19IXw0KKyNkZWZpbmUgX0ZQREZYRkFfRE9DX0hfDQorDQorY2xhc3MgQ1BERlhGQV9BcHA7DQorY2xhc3MgQ1BERlhGQV9Eb2N1bWVudDsNCitjbGFzcyBDUERGWEZBX1BhZ2U7DQorY2xhc3MgQ1BERlNES19Eb2N1bWVudDsNCitjbGFzcyBDUERGRG9jX0Vudmlyb25tZW50Ow0KK2NsYXNzIElGWEpTX1J1bnRpbWU7DQorY2xhc3MgSUZYSlNfQ29udGV4dDsNCisNCitjbGFzcyBDUERGWEZBX0RvY3VtZW50IDogcHVibGljIElYRkFfRG9jUHJvdmlkZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisJQ1BERlhGQV9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwUERGRG9jLCBDUERGWEZBX0FwcCogcFByb3ZpZGVyKTsNCisJfkNQREZYRkFfRG9jdW1lbnQoKTsNCisNCisJRlhfQk9PTAkJCQlMb2FkWEZBRG9jKCk7DQorCXZvaWQJCQkJQ2xvc2VYRkFEb2MoKTsNCisJQ1BERlhGQV9BcHAqCQlHZXRBcHAoKSB7cmV0dXJuIG1fcEFwcDt9DQorCUNQREZfRG9jdW1lbnQqCQlHZXRQREZEb2MoKSB7IHJldHVybiBtX3BQREZEb2M7IH0NCisJWEZBX0hET0MJCQlHZXRYRkFEb2MoKSB7IHJldHVybiBtX3BYRkFEb2M7IH0NCisJSVhGQV9Eb2NWaWV3KgkgICAgR2V0WEZBRG9jVmlldygpIHsgcmV0dXJuIG1fcFhGQURvY1ZpZXc7IH0NCisNCisJaW50CQkJCQlHZXRQYWdlQ291bnQoKTsNCisJQ1BERlhGQV9QYWdlKgkJR2V0UGFnZShpbnQgcGFnZV9pbmRleCk7DQorCUNQREZYRkFfUGFnZSoJCUdldFBhZ2UoSVhGQV9QYWdlVmlldyogcFBhZ2UpOw0KKwl2b2lkCQkJCVJlbW92ZVBhZ2UoQ1BERlhGQV9QYWdlKiBwYWdlKTsNCisJaW50CQkJCQlHZXREb2NUeXBlKCl7IHJldHVybiBtX2lEb2NUeXBlOyB9DQorDQorCUNQREZTREtfRG9jdW1lbnQqCUdldFNES0RvY3VtZW50KENQREZEb2NfRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7DQorCXZvaWQJCQkJUmVsZWFzZVNES0RvYygpOw0KKw0KKwl2b2lkCQkJCUZYUmVjdDJQREZSZWN0KGNvbnN0IENGWF9SZWN0RiYgZnhSZWN0RiwgQ1BERl9SZWN0JiBwZGZSZWN0KTsNCisNCitwdWJsaWM6DQorCXZpcnR1YWwgdm9pZAkJU2V0Q2hhbmdlTWFyayhYRkFfSERPQyBoRG9jKTsNCisJdmlydHVhbCBGWF9CT09MCQlHZXRDaGFuZ2VNYXJrKFhGQV9IRE9DIGhEb2MpOw0KKwkvL3VzZWQgaW4gZHluYW1pYyB4ZmEsIGR3RmxhZ3MgcmVmZXIgdG8gWEZBX0lOVkFMSURBVEVfWFhYIG1hY3Jvcy4NCisJdmlydHVhbCB2b2lkCQlJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENGWF9SZWN0RiYgcnQsIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCisJLy91c2VkIGluIHN0YXRpYyB4ZmEsIGR3RmxhZ3MgcmVmZXIgdG8gWEZBX0lOVkFMSURBVEVfWFhYIG1hY3Jvcy4NCisJdmlydHVhbCB2b2lkCQlJbnZhbGlkYXRlUmVjdChYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzID0gMCk7DQorCS8vc2hvdyBvciBoaWRlIGNhcmV0DQorCXZpcnR1YWwgdm9pZAkJRGlzcGxheUNhcmV0KFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKTsNCisJLy9kd1BvczogKDA6Ym90dG9tIDE6dG9wKQ0KKwl2aXJ0dWFsIEZYX0JPT0wJCUdldFBvcHVwUG9zKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0ZMT0FUIGZNaW5Qb3B1cCwgRlhfRkxPQVQgZk1heFBvcHVwLCANCisJCQkJCQkJY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKTsNCisJdmlydHVhbCBGWF9CT09MCQlQb3B1cE1lbnUoWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1BvaW50RiBwdFBvcHVwLCBjb25zdCBDRlhfUmVjdEYqIHBSZWN0RXhjbHVkZSA9IE5VTEwpOw0KKw0KKwkvL2R3RmxhZ3MgWEZBX1BBR0VWSUVXRVZFTlRfQWRkZWQsIFhGQV9QQUdFVklFV0VWRU5UX1JlbW92aW5nDQorCXZpcnR1YWwgdm9pZAkJUGFnZVZpZXdFdmVudChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKwkvL2R3RXZlbnQgcmVmZXIgdG8gWEZBX1dJREdFVEVWRU5UX1hYWA0KKwl2aXJ0dWFsIHZvaWQJCVdpZGdldEV2ZW50KFhGQV9IV0lER0VUIGhXaWRnZXQsIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSwgRlhfRFdPUkQgZHdFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSA9IE5VTEwsIEZYX0xQVk9JRCBwQWRkaXRpb25hbCA9IE5VTEwpOw0KKwkNCisJLy9yZXR1cm4gdHJ1ZSBpZiByZW5kZXIgaXQuDQorCXZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyQ3VzdG9tV2lkZ2V0KFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4LCBjb25zdCBDRlhfUmVjdEYmIHJ0VUkpe3JldHVybiBGQUxTRTt9DQorDQorCS8vaG9zdCBtZXRob2QNCisJdmlydHVhbAlGWF9JTlQzMglDb3VudFBhZ2VzKFhGQV9IRE9DIGhEb2MpOw0KKwl2aXJ0dWFsCUZYX0lOVDMyCUdldEN1cnJlbnRQYWdlKFhGQV9IRE9DIGhEb2MpOw0KKwl2aXJ0dWFsIHZvaWQJCVNldEN1cnJlbnRQYWdlKFhGQV9IRE9DIGhEb2MsIEZYX0lOVDMyIGlDdXJQYWdlKTsNCisJdmlydHVhbCBGWF9CT09MCQlJc0NhbGN1bGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYyk7DQorCXZpcnR1YWwgdm9pZAkJU2V0Q2FsY3VsYXRpb25zRW5hYmxlZChYRkFfSERPQyBoRG9jLCBGWF9CT09MIGJFbmFibGVkKTsNCisJdmlydHVhbCB2b2lkCQlHZXRUaXRsZShYRkFfSERPQyBoRG9jLCBDRlhfV2lkZVN0cmluZyAmd3NUaXRsZSk7DQorCXZpcnR1YWwgdm9pZAkJU2V0VGl0bGUoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c1RpdGxlKTsNCisJdmlydHVhbCB2b2lkCQlFeHBvcnREYXRhKFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NGaWxlUGF0aCwgRlhfQk9PTCBiWERQID0gVFJVRSk7DQorCXZpcnR1YWwgdm9pZAkJSW1wb3J0RGF0YShYRkFfSERPQyBoRG9jLCBGWF9XU1RSIHdzRmlsZVBhdGgpOw0KKwl2aXJ0dWFsIHZvaWQJCUdvdG9VUkwoWEZBX0hET0MgaERvYywgRlhfV1NUUiBic1VSTCwgRlhfQk9PTCBiQXBwZW5kID0gVFJVRSk7DQorCXZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYyk7DQorCXZpcnR1YWwgdm9pZAkJU2V0VmFsaWRhdGlvbnNFbmFibGVkKFhGQV9IRE9DIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpOw0KKwl2aXJ0dWFsIHZvaWQJCVNldEZvY3VzV2lkZ2V0KFhGQV9IRE9DIGhEb2MsIFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKwl2aXJ0dWFsIHZvaWQJCVByaW50KFhGQV9IRE9DIGhEb2MsIEZYX0lOVDMyIG5TdGFydFBhZ2UsIEZYX0lOVDMyIG5FbmRQYWdlLCBGWF9EV09SRCBkd09wdGlvbnMpOw0KKw0KKwkvL0xheW91dFBzZXVkbyBtZXRob2QNCisJdmlydHVhbCBGWF9JTlQzMgkJCUFic1BhZ2VDb3VudEluQmF0Y2goWEZBX0hET0MgaERvYyl7cmV0dXJuIDA7fQ0KKwl2aXJ0dWFsIEZYX0lOVDMyCQkJQWJzUGFnZUluQmF0Y2goWEZBX0hET0MgaERvYywgWEZBX0hXSURHRVQgaFdpZGdldCl7cmV0dXJuIDA7fQ0KKwl2aXJ0dWFsIEZYX0lOVDMyCQkJU2hlZXRDb3VudEluQmF0Y2goWEZBX0hET0MgaERvYyl7cmV0dXJuIDA7fQ0KKwl2aXJ0dWFsIEZYX0lOVDMyCQkJU2hlZXRJbkJhdGNoKFhGQV9IRE9DIGhEb2MsIFhGQV9IV0lER0VUIGhXaWRnZXQpe3JldHVybiAwO30NCisNCisJLy9TaWduYXR1cmVQc2V1ZG9Nb2RlbCBtZXRob2QNCisJLy9UT0RPOg0KKwl2aXJ0dWFsIEZYX0lOVDMyCQkJVmVyaWZ5KFhGQV9IRE9DIGhEb2MsIENYRkFfTm9kZSogcFNpZ05vZGUsIEZYX0JPT0wgYlVzZWQgPSBUUlVFLyosIFNlY3VyaXR5SGFuZGxlciogcEhhbmRsZXIsIFNpZ25hdHVyZUluZm8gJmluZm8qLykge3JldHVybiAwO30NCisJdmlydHVhbCBGWF9CT09MCQkJCVNpZ24oWEZBX0hET0MgaERvYywgQ1hGQV9Ob2RlTGlzdCogcE5vZGVMaXN0LCBGWF9XU1RSIHdzRXhwcmVzc2lvbiwgRlhfV1NUUiB3c1hNTElkZW50LCBGWF9XU1RSIHdzVmFsdWUgPSBGWF9XU1RSQyhMIm9wZW4iKSwgRlhfQk9PTCBiVXNlZCA9IFRSVUUvKiwgU2VjdXJpdHlIYW5kbGVyKiBwSGFuZGxlciA9IE5VTEwsIFNpZ25hdHVyZUluZm8gJmluZm8qLykge3JldHVybiAwO30NCisJdmlydHVhbCBDWEZBX05vZGVMaXN0KgkJRW51bWVyYXRlKFhGQV9IRE9DIGhEb2MpIHtyZXR1cm4gMDt9DQorCXZpcnR1YWwgRlhfQk9PTAkJCQlDbGVhcihYRkFfSERPQyBoRG9jLCBDWEZBX05vZGUqIHBTaWdOb2RlLCBGWF9CT09MIGJDbGVhcmVkID0gVFJVRSkge3JldHVybiAwO30NCisNCisJLy9HZXQgZG9jdW1lbnQgcGF0aA0KKwl2aXJ0dWFsIHZvaWQJCUdldFVSTChYRkFfSERPQyBoRG9jLCBDRlhfV2lkZVN0cmluZyAmd3NEb2NVUkwpOw0KKwl2aXJ0dWFsIEZYX0FSR0IJCUdldEhpZ2hsaWdodENvbG9yKFhGQV9IRE9DIGhEb2MpOw0KKwl2aXJ0dWFsIHZvaWQJCUFkZERvUmVjb3JkKFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKwkvKiogDQorCSAqU3VibWl0IGRhdGEgdG8gZW1haWwsIGh0dHAsIGZ0cC4JDQorCSAqIEBwYXJhbVtpbl0gaERvYyBUaGUgZG9jdW1lbnQgaGFuZGxlci4NCisJICogQHBhcmFtW2luXSBlRm9ybWF0IERldGVybWluZXMgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHN1Ym1pdHRlZC4gWEZBX0FUVFJJQlVURUVOVU1fWGRwLCBYRkFfQVRUUklCVVRFRU5VTV9YbWwuLi4NCisJICogQHBhcmFtW2luXSB3c1RhcmdldCBUaGUgVVJMIHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc3VibWl0dGVkLg0KKwkgKiBAcGFyYW1baW5dIGVFbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGV4dCBjb250ZW50Lg0KKwkgKiBAcGFyYW1baW5dIHBYRFBDb250ZW50IENvbnRyb2xzIHdoYXQgc3Vic2V0IG9mIHRoZSBkYXRhIGlzIHN1Ym1pdHRlZCwgdXNlZCBvbmx5IHdoZW4gdGhlIGZvcm1hdCBwcm9wZXJ0eSBpcyB4ZHAuDQorCSAqIEBwYXJhbVtpbl0gYkVtYmVkUERGLCBzcGVjaWZpZXMgd2hldGhlciBQREYgaXMgZW1iZWRkZWQgaW4gdGhlIHN1Ym1pdHRlZCBjb250ZW50IG9yIG5vdC4NCisJICovDQorCXZpcnR1YWwgRlhfQk9PTAkJU3VibWl0RGF0YShYRkFfSERPQyBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpOw0KKw0KKwl2aXJ0dWFsIEZYX0JPT0wJCUNoZWNrV29yZChYRkFfSERPQyBoRG9jLCBGWF9CU1RSIHNXb3JkKXtyZXR1cm4gRkFMU0U7fQ0KKwl2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3JkcyhYRkFfSERPQyBoRG9jLCBGWF9CU1RSIHNXb3JkLCBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCl7cmV0dXJuIEZBTFNFO30NCisNCisJLy9HZXQgUERGIGphdmFzY3JpcHQgb2JqZWN0LCBzZXQgdGhlIG9iamVjdCB0byBoVmFsdWUuDQorCXZpcnR1YWwgRlhfQk9PTAkJR2V0UERGU2NyaXB0T2JqZWN0KFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKw0KKwl2aXJ0dWFsIEZYX0JPT0wJCUdldEdsb2JhbFByb3BlcnR5KFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorCXZpcnR1YWwgRlhfQk9PTAkJU2V0R2xvYmFsUHJvcGVydHkoWEZBX0hET0MgaERvYywgRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisJdmlydHVhbCBDUERGX0RvY3VtZW50KiAgT3BlblBERihYRkFfSERPQyBoRG9jLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJUYWtlT3ZlckZpbGUpe3JldHVybiBOVUxMO30NCisNCisJdmlydHVhbCBJRlhfRmlsZVJlYWQqCU9wZW5MaW5rZWRGaWxlKFhGQV9IRE9DIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xpbmspOw0KKw0KKwlGWF9CT09MCQlfR2V0SFZhbHVlQnlOYW1lKEZYX0JTVFIgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUsIElGWEpTX1J1bnRpbWUqIHJ1blRpbWUpOw0KKwlGWF9CT09MCQlfT25CZWZvcmVOb3RpZnlTdW1iaXQoKTsNCisJdm9pZAkJX09uQWZ0ZXJOb3RpZnlTdW1iaXQoKTsNCisJRlhfQk9PTAkJX05vdGlmeVN1Ym1pdChGWF9CT09MIGJQcmV2T3JQb3N0KTsNCisJRlhfQk9PTAkJX1N1Ym1pdERhdGEoWEZBX0hET0MgaERvYywgQ1hGQV9TdWJtaXQgc3VibWl0KTsNCisJRlhfQk9PTAkJX01haWxUb0luZm8oQ0ZYX1dpZGVTdHJpbmcmIGNzVVJMLCBDRlhfV2lkZVN0cmluZyYgY3NUb0FkZHJlc3MsIENGWF9XaWRlU3RyaW5nJiBjc0NDQWRkcmVzcywgQ0ZYX1dpZGVTdHJpbmcmIGNzQkNDQWRkcmVzcywgQ0ZYX1dpZGVTdHJpbmcmIGNzU3ViamVjdCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTXNnKTsNCisJRlhfQk9PTAkJX0V4cG9ydFN1Ym1pdEZpbGUoRlBERl9GSUxFSEFORExFUiogcHBGaWxlSGFuZGxlciwgaW50IGZpbGVUeXBlLCBGUERGX0RXT1JEIGVuY29kZVR5cGUsIEZQREZfRFdPUkQgZmxhZyA9IDB4MDExMTExMTEpOw0KKwl2b2lkCQlfVG9YRkFDb250ZW50RmxhZ3MoQ0ZYX1dpZGVTdHJpbmcgY3NTcmNDb250ZW50LCBGUERGX0RXT1JEJiBmbGFnKTsNCisJdm9pZAkJX0NsZWFyQ2hhbmdlTWFyaygpOw0KKw0KK3ByaXZhdGU6DQorCUNQREZfRG9jdW1lbnQqIG1fcFBERkRvYzsNCisJWEZBX0hET0MgIG1fcFhGQURvYzsNCisJSVhGQV9Eb2NWaWV3KiBtX3BYRkFEb2NWaWV3Ow0KKwlDRlhfQXJyYXlUZW1wbGF0ZTxDUERGWEZBX1BhZ2UqPiBtX1hGQVBhZ2VMaXN0Ow0KKw0KKwlDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7DQorCUNQREZYRkFfQXBwKiBtX3BBcHA7DQorDQorCUNGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9YZmFHbG9iYWxQcm9wZXJ0eTsNCisNCisJQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX1ZhbHVlTWFwOw0KKw0KKwlJRlhKU19Db250ZXh0KgkJCW1fcEpTQ29udGV4dDsNCisNCisJaW50CQkJbV9pRG9jVHlwZTsNCit9Ow0KKw0KKyNlbmRpZiANCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjBjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisgDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GUERGWEZBX1BBR0VWSUVXX0hfDQorI2RlZmluZSBfRlBERlhGQV9QQUdFVklFV19IXw0KKw0KK2NsYXNzIENQREZYRkFfUGFnZTsNCisNCitjbGFzcyBDUERGWEZBX1BhZ2UgOiBwdWJsaWMgQ0ZYX09iamVjdCANCit7DQorcHVibGljOg0KKwlDUERGWEZBX1BhZ2UoQ1BERlhGQV9Eb2N1bWVudCogcERvYywgaW50IHBhZ2VfaW5kZXgpOw0KKwl+Q1BERlhGQV9QYWdlKCk7DQorDQorCXZvaWQJCVJlbGVhc2UoKTsNCisJdm9pZAkJQWRkUmVmKCl7IG1faVJlZiArKzsgfQ0KKwlGWF9CT09MCQlMb2FkUGFnZSgpOw0KKwlGWF9CT09MCQlMb2FkUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBhZ2VEaWN0KTsNCisJQ1BERlhGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSB7IHJldHVybiBtX3BEb2N1bWVudDsgfQ0KKwlpbnQJCQlHZXRQYWdlSW5kZXgoKSB7IHJldHVybiBtX2lQYWdlSW5kZXg7IH0NCisJQ1BERl9QYWdlKglHZXRQREZQYWdlKCkgeyByZXR1cm4gbV9wUERGUGFnZTsgfQ0KKwlJWEZBX1BhZ2VWaWV3KiBHZXRYRkFQYWdlVmlldygpIHsgcmV0dXJuIG1fcFhGQVBhZ2VWaWV3OyB9DQorDQorCUZYX0ZMT0FUCUdldFBhZ2VXaWR0aCgpOw0KKwlGWF9GTE9BVAlHZXRQYWdlSGVpZ2h0KCk7DQorDQorCXZvaWQJCURldmljZVRvUGFnZShpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksIA0KKwkJCQkJCQkgaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSk7DQorCXZvaWQJCVBhZ2VUb0RldmljZShpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksDQorCQkJCQkJCSBpbnQgcm90YXRlLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KTsNCisNCisJdm9pZAkJR2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsIGludCB4UG9zLCBpbnQgeVBvcywgDQorCQkJCQkJCQkgaW50IHhTaXplLCBpbnQgeVNpemUsIGludCBpUm90YXRlKSBjb25zdDsNCisNCitwcm90ZWN0ZWQ6DQorCUZYX0JPT0wJCUxvYWRQREZQYWdlKCk7DQorCUZYX0JPT0wJCUxvYWRYRkFQYWdlVmlldygpOw0KKw0KK3ByaXZhdGU6DQorCUNQREZfUGFnZSoJbV9wUERGUGFnZTsNCisJSVhGQV9QYWdlVmlldyogbV9wWEZBUGFnZVZpZXc7DQorCWludCBtX2lQYWdlSW5kZXg7DQorCUNQREZYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KKwlpbnQgbV9pUmVmOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmggYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VhNjVmCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorIA0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlBERlhGQV9VVElMX0hfDQorI2RlZmluZSBfRlBERlhGQV9VVElMX0hfDQorDQorI2RlZmluZSBET0NUWVBFX1BERgkJCSAwDQorI2RlZmluZSBET0NUWVBFX0RZTklNSUNfWEZBICAxIC8vRHluaW1pYyB4ZmEgRG9jdW1lbnQgVHlwZQ0KKyNkZWZpbmUgRE9DVFlQRV9TVEFUSUNfWEZBICAgMiAvL1N0YXRpYyB4ZmEgRG9jdW1lbnQgVHlwZQ0KKw0KKyNkZWZpbmUgSlNfU1RSX1ZJRVdFUlRZUEVfU1RBTkRBUkQJCUwiRXhjaGFuZ2UiDQorI2RlZmluZSBKU19TVFJfTEFOR1VBTkdFCQkJCUwiRU5VIg0KKyNkZWZpbmUgSlNfU1RSX1ZJRVdFUlZBUklBVElPTgkJCUwiRnVsbCINCisjZGVmaW5lIEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQQkJTCIxMSINCisNCitGWF9CT09MIEZQREZfSGFzWEZBRmllbGQoQ1BERl9Eb2N1bWVudCogcFBERkRvYywgaW50JiBkb2NUeXBlKTsNCisNCitjbGFzcyBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1nciA6IHB1YmxpYyBJRldMX0FkYXB0ZXJUaW1lck1nciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKwlDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KSA6IG1fcEVudihwRW52KQ0KKwl7DQorDQorCX0NCisJdmlydHVhbCBGV0xfRVJSCQlTdGFydChJRldMX1RpbWVyICpwVGltZXIsIEZYX0RXT1JEIGR3RWxhcHNlLCBGV0xfSFRJTUVSICZoVGltZXIsIEZYX0JPT0wgYkltbWVkaWF0ZWx5ID0gVFJVRSk7DQorCXZpcnR1YWwgRldMX0VSUgkJU3RvcChGV0xfSFRJTUVSIGhUaW1lcik7DQorDQorcHJvdGVjdGVkOg0KKwlzdGF0aWMgdm9pZCBUaW1lclByb2MoRlhfSU5UMzIgaWRFdmVudCk7DQorDQorCXN0YXRpYyBDRlhfUHRyQXJyYXkJbXNfdGltZXJBcnJheTsNCisJQ1BERkRvY19FbnZpcm9ubWVudCogbV9wRW52Ow0KK307DQorDQorY2xhc3MgQ0ZXTF9UaW1lckluZm8gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorCUNGV0xfVGltZXJJbmZvKCkNCisJCTogcFRpbWVyKE5VTEwpDQorCXsNCisNCisJfQ0KKwlGWF9VSU5UMzIgdUlERXZlbnQ7DQorCUlGV0xfVGltZXIgKnBUaW1lcjsNCit9Ow0KKw0KKyNlbmRpZiANCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCmluZGV4IDlmOTdjNTIuLjZhYTk0MTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oCkBAIC03LDYgKzcsNyBAQAogI2lmbmRlZiBfRlNES19BTk5PVEhBTkRMRVJfSF8KICNkZWZpbmUgX0ZTREtfQU5OT1RIQU5ETEVSX0hfCiAKKyNkZWZpbmUgRlNES19YRkFXSURHRVRfVFlQRU5BTUUgIlhGQVdpZGdldCIKIAogY2xhc3MgQ1BERkRvY19FbnZpcm9ubWVudDsKIGNsYXNzIENGRkxfSUZvcm1GaWxsZXI7CkBAIC0yNiw2ICsyNyw4IEBACiAKIAl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSA9IDA7CiAKKwl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSkgPSAwOworCiAJdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAogCXZpcnR1YWwgdm9pZAkJCQlEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKQEAgLTc4LDYgKzgxLDcgQEAKIAogCXZpcnR1YWwgRlhfQk9PTAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIAl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPblhGQUNoYW5nZWRGb2N1cyhDUERGU0RLX0Fubm90KiBwT2xkQW5ub3QsIENQREZTREtfQW5ub3QqIHBOZXdBbm5vdCkgPSAwOwogCiB9OwogCkBAIC05Nyw2ICsxMDEsOCBAQAogCiAJdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CiAKKwl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CisKIAl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgIDsKIAogCXZpcnR1YWwgdm9pZAkJCQlEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CkBAIC0xNDgsNiArMTU0LDcgQEAKIAogCXZpcnR1YWwgRlhfQk9PTAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOwogCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25YRkFDaGFuZ2VkRm9jdXMoQ1BERlNES19Bbm5vdCogcE9sZEFubm90LCBDUERGU0RLX0Fubm90KiBwTmV3QW5ub3QpeyByZXR1cm4gVFJVRTsgfQogCiAJdm9pZAkJCQkJCVNldEZvcm1GaWxsZXIoQ0ZGTF9JRm9ybUZpbGxlciogcEZpbGxlcil7bV9wRm9ybUZpbGxlciA9IHBGaWxsZXI7fQogCUNGRkxfSUZvcm1GaWxsZXIqCQkJR2V0Rm9ybUZpbGxlcigpIHtyZXR1cm4gbV9wRm9ybUZpbGxlcjt9CkBAIC0xNTcsNiArMTY0LDg2IEBACiAJQ0ZGTF9JRm9ybUZpbGxlcioJCQltX3BGb3JtRmlsbGVyOwogfTsKIAorY2xhc3MgQ1BERlNES19YRkFBbm5vdEhhbmRsZXIgOiBwdWJsaWMgSVBERlNES19Bbm5vdEhhbmRsZXIKK3sKK3B1YmxpYzoKKwlDUERGU0RLX1hGQUFubm90SGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKKwl+Q1BERlNES19YRkFBbm5vdEhhbmRsZXIoKXt9CisKK3B1YmxpYzoKKwl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRUeXBlKCkgeyByZXR1cm4gRlNES19YRkFXSURHRVRfVFlQRU5BTUU7IH0KKworCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoKSB7IHJldHVybiAiWEZBV2lkZ2V0SGFuZGxlciI7IH0KKworCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKworCisJdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSkgeyByZXR1cm4gTlVMTDsgfQorCisJdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoWEZBX0hXSURHRVQgcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CisKKwl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisKKwl2aXJ0dWFsIHZvaWQJCQkJRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCisKKwl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCisKKwl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCAKKwkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKwkJRlhfRFdPUkQgZHdGbGFncyk7CisKKwl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3U2xlZXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIAorCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorCQljb25zdCBDUERGX1JlY3QmIHJjV2luZG93LCBGWF9EV09SRCBkd0ZsYWdzKSB7fQorCisKKworCisJdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KKworCXZpcnR1YWwgdm9pZAkJCQlPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCisJdmlydHVhbCB2b2lkCQkJCU9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KKworCXZpcnR1YWwgdm9pZAkJCQlPblJlbGVhc2UoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCisKKwl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisKKworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOworCS8vYnkgd2ptLgorCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworCisJdmlydHVhbAl2b2lkCQkJCU9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisJdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCisJdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIDsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJT25YRkFDaGFuZ2VkRm9jdXMoQ1BERlNES19Bbm5vdCogcE9sZEFubm90LCBDUERGU0RLX0Fubm90KiBwTmV3QW5ub3QpOworCitwcml2YXRlOgorCUlYRkFfV2lkZ2V0SGFuZGxlcioJCQlHZXRYRkFXaWRnZXRIYW5kbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisJRlhfRFdPUkQJCQkJCUdldEZXTEZsYWdzKEZYX0RXT1JEIGR3RmxhZyk7CisKK3ByaXZhdGU6CisJQ1BERkRvY19FbnZpcm9ubWVudCoJCW1fcEFwcDsKK307CisKICNkZWZpbmUgQ0JBX0Fubm90SGFuZGxlckFycmF5IENGWF9BcnJheVRlbXBsYXRlPElQREZTREtfQW5ub3RIYW5kbGVyKj4KIGNsYXNzIENQREZTREtfQW5ub3RIYW5kbGVyTWdyCiB7CkBAIC0xNzAsNiArMjU3LDcgQEAKIAl2b2lkCQkJCQkJVW5SZWdpc3RlckFubm90SGFuZGxlcihJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlcik7CiAKIAl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90ICogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcpOworCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KFhGQV9IV0lER0VUIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZUFubm90KENQREZTREtfQW5ub3QgKiBwQW5ub3QpOwogCQogCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOwpAQCAtMTk4LDYgKzI4Niw3IEBACiAKIAl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKIAl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisJdmlydHVhbAlGWF9CT09MCQkJCUFubm90X09uQ2hhbmdlRm9jdXMoQ1BERlNES19Bbm5vdCogcFNldEFubm90LENQREZTREtfQW5ub3QqIHBLaWxsQW5ub3QpOwogCiAJdmlydHVhbCBDUERGX1JlY3QJCQlBbm5vdF9PbkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlYW5ub3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCmluZGV4IDc5N2MzZjEuLjVmNTZmYzcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oCkBAIC02MSwyMCArNjEsMzMgQEAKIGNsYXNzIENQREZTREtfQW5ub3QKIHsKIHB1YmxpYzoKLQlDUERGU0RLX0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIH5DUERGU0RLX0Fubm90KCk7CisJQ1BERlNES19Bbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICAgIHZpcnR1YWwgfkNQREZTREtfQW5ub3QoKSB7fTsKIHB1YmxpYzoKKwl2aXJ0dWFsCUZYX0JPT0wJCQkJSXNYRkFGaWVsZCgpIHsgcmV0dXJuIEZBTFNFOyB9CisKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWluV2lkdGgoKSBjb25zdDsKIAl2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWluSGVpZ2h0KCkgY29uc3Q7CiAJLy9kZWZpbmUgbGF5b3V0IG9yZGVyIHRvIDUuCiAJdmlydHVhbCBpbnQJCQkJCUdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gNTsgfQogCi1wdWJsaWM6Ci0JQ1BERl9Bbm5vdCoJCQkJCUdldFBERkFubm90KCk7CisJdmlydHVhbCBDUERGX0Fubm90KgkJCUdldFBERkFubm90KCkgeyByZXR1cm4gTlVMTDsgfQorCXZpcnR1YWwgWEZBX0hXSURHRVQJCQlHZXRYRkFXaWRnZXQoKSB7IHJldHVybiBOVUxMOyB9CiAJCi0Jdm9pZAkJCQkJCVNldFBhZ2UoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQlDUERGU0RLX1BhZ2VWaWV3KgkJCUdldFBhZ2VWaWV3KCk7CQotCUZYX0RXT1JECQkJCQlHZXRGbGFncygpOworCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFR5cGUoKSBjb25zdCB7IHJldHVybiAiIjsgfQorCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFN1YlR5cGUoKSBjb25zdCB7IHJldHVybiAiIjsgfQorCisJdmlydHVhbCB2b2lkCQkJCVNldFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7fQorCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0UmVjdCgpIGNvbnN0IHsgcmV0dXJuIENQREZfUmVjdCgpOyB9CisKKwl2aXJ0dWFsIHZvaWQJCQkJQW5ub3RfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykge30KKworcHVibGljOgorCUNQREZfUGFnZSoJCQkJCUdldFBERlBhZ2UoKTsKKwlDUERGWEZBX1BhZ2UqCQkJCUdldFBERlhGQVBhZ2UoKTsKKwkKKwl2b2lkCQkJCQkJU2V0UGFnZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7IH0KKwlDUERGU0RLX1BhZ2VWaWV3KgkJCUdldFBhZ2VWaWV3KCkgeyByZXR1cm4gbV9wUGFnZVZpZXc7IH0KIAkKIAkvLyBUYWIgT3JkZXIJCiAJaW50CQkJCQkJCUdldFRhYk9yZGVyKCk7CkBAIC04NCwxNyArOTcsMzUgQEAKIAlGWF9CT09MCQkJCQkJSXNTZWxlY3RlZCgpOwogCXZvaWQJCQkJCQlTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCk7CiAJCi0JQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0VHlwZSgpIGNvbnN0OwotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFN1YlR5cGUoKSBjb25zdDsKK3Byb3RlY3RlZDoKKwlDUERGX0Fubm90KgkJCW1fcEFubm90OworCUNQREZTREtfUGFnZVZpZXcqCW1fcFBhZ2VWaWV3OworCUZYX0JPT0wJCQkJbV9iU2VsZWN0ZWQ7CisJaW50CQkJCQltX25UYWJPcmRlcjsKKwkKK307CiAKLQlDUERGX1BhZ2UqCQkJCQlHZXRQREZQYWdlKCk7CitjbGFzcyBDUERGU0RLX0JBQW5ub3QgOiBwdWJsaWMgQ1BERlNES19Bbm5vdAoreworcHVibGljOgorCUNQREZTREtfQkFBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisJdmlydHVhbCB+Q1BERlNES19CQUFubm90KCk7CiAKIHB1YmxpYzoKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNYRkFGaWVsZCgpOworCisJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0VHlwZSgpIGNvbnN0OworCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFN1YlR5cGUoKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZAkJCQlTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisJdmlydHVhbCBDUERGX1JlY3QJCQlHZXRSZWN0KCkgY29uc3Q7CisKKwl2aXJ0dWFsIENQREZfQW5ub3QqCQkJR2V0UERGQW5ub3QoKTsKKworCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKK3B1YmxpYzoKIAlDUERGX0RpY3Rpb25hcnkqCQkJR2V0QW5ub3REaWN0KCkgY29uc3Q7CiAJCi0Jdm9pZAkJCQkJCVNldFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKLQlDUERGX1JlY3QJCQkJCUdldFJlY3QoKSBjb25zdDsKLQkKIAl2b2lkCQkJCQkJU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cyk7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0Q29udGVudHMoKSBjb25zdDsKIAkKQEAgLTE1MSwzMiArMTgyLDI0IEBACiAJdmlydHVhbCBDUERGX0FjdGlvbgkJCUdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKTsKIAkKIHB1YmxpYzoKLQlGWF9CT09MCQkJCQkJSXNBcHBlYXJhbmNlVmFsaWQoKTsKLQlGWF9CT09MCQkJCQkJSXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Ci0Jdm9pZAkJCQkJCURyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisJdmlydHVhbCBGWF9CT09MCQkJCUlzQXBwZWFyYW5jZVZhbGlkKCk7CisJdmlydHVhbCBGWF9CT09MCQkJCUlzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOworCXZpcnR1YWwgdm9pZAkJCQlEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQlDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIAl2b2lkCQkJCQkJRHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAogCQljb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIAkKIAl2b2lkCQkJCQkJQ2xlYXJDYWNoZWRBUCgpOwogCQorCXZpcnR1YWwgdm9pZAkJCQlSZXNldEFwcGVhcmFuY2UoKTsKIAl2b2lkCQkJCQkJV3JpdGVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLCBjb25zdCBDUERGX1JlY3QmIHJjQkJveCwgCiAJCWNvbnN0IENQREZfTWF0cml4JiBtYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQ29udGVudHMsCiAJCWNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBTdGF0ZSA9ICIiKTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCUFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwotcHVibGljOgotCi0KIHByaXZhdGU6CiAJRlhfQk9PTCBDcmVhdGVGb3JtRmlsbGVyKCk7CiBwcm90ZWN0ZWQ6CiAJQ1BERl9Bbm5vdCoJCQltX3BBbm5vdDsKLQlDUERGU0RLX1BhZ2VWaWV3KgltX3BQYWdlVmlldzsKLQlGWF9CT09MCQkJCW1fYlNlbGVjdGVkOwotCWludAkJCQkJbV9uVGFiT3JkZXI7Ci0JCiB9OwogCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oCmluZGV4IDA3M2M5OWYuLjBlMTk5YzEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaApAQCAtMjAsNiArMjAsMTMgQEAKIGNsYXNzIENQREZTREtfUGFnZVZpZXc7CiBjbGFzcyBDUERGU0RLX0ludGVyRm9ybTsKIAordHlwZWRlZiBlbnVtIF9QREZTREtfWEZBQUFjdGlvblR5cGUKK3sKKwlQREZTREtfWEZBX0NsaWNrID0gMCwKKwlQREZTREtfWEZBX0Z1bGwsCisJUERGU0RLX1hGQV9QcmVPcGVuLAorCVBERlNES19YRkFfUG9zdE9wZW4KK31QREZTREtfWEZBQUFjdGlvblR5cGU7CiAKIHR5cGVkZWYgc3RydWN0IF9QREZTREtfRmllbGRBY3Rpb24KIHsKQEAgLTQ4LDkgKzU1LDI2IEBACiAJRlhfQk9PTAkJCQkJYkZpZWxkRnVsbDsJCS8vaW4KIAlGWF9CT09MCQkJCQliUkM7CQkJLy9pbltvdXRdCiB9UERGU0RLX0ZpZWxkQWN0aW9uOwotY2xhc3MgQ1BERlNES19XaWRnZXQ6cHVibGljIENQREZTREtfQW5ub3QKK2NsYXNzIENQREZTREtfV2lkZ2V0OnB1YmxpYyBDUERGU0RLX0JBQW5ub3QKIHsKIHB1YmxpYzoKKwlYRkFfSFdJREdFVAkJCQkJCUdldE1peFhGQVdpZGdldCgpOworCVhGQV9IV0lER0VUCQkJCQkJR2V0R3JvdXBNaXhYRkFXaWRnZXQoKTsKKwlJWEZBX1dpZGdldEhhbmRsZXIqCQkJCUdldFhGQVdpZGdldEhhbmRsZXIoKTsKKworCUZYX0JPT0wJCQkJCQkJSGFzWEZBQUFjdGlvbihQREZTREtfWEZBQUFjdGlvblR5cGUgZVhGQUFBVCk7CisJRlhfQk9PTAkJCQkJCQlPblhGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKworCXZvaWQJCQkJCQkJU3luY2hyb25pemUoRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKTsKKwl2b2lkCQkJCQkJCVN5bmNocm9uaXplWEZBVmFsdWUoKTsKKwl2b2lkCQkJCQkJCVN5bmNocm9uaXplWEZBSXRlbXMoKTsKKworCXN0YXRpYyB2b2lkCQkJCQkJU3luY2hyb25pemVYRkFWYWx1ZShJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3LCBYRkFfSFdJREdFVCBoV2lkZ2V0LCAKKwkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7CisJc3RhdGljIHZvaWQJCQkJCQlTeW5jaHJvbml6ZVhGQUl0ZW1zKElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcsIFhGQV9IV0lER0VUIGhXaWRnZXQsIAorCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKTsKKworcHVibGljOgogCUNQREZTREtfV2lkZ2V0KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSk7CiAJdmlydHVhbCB+Q1BERlNES19XaWRnZXQoKTsKIApAQCAtNjEsNiArODUsNyBAQAogCWludAkJCQkJCQkJR2V0RmllbGRUeXBlKCkgY29uc3Q7CiAJLy9kZWZpbmUgbGF5b3V0IG9yZGVyIHRvIDIuCiAJdmlydHVhbCBpbnQJCQkJCQlHZXRMYXlvdXRPcmRlcigpIGNvbnN0IHtyZXR1cm4gMjt9CisJdmlydHVhbCBGWF9CT09MCQkJCQlJc0FwcGVhcmFuY2VWYWxpZCgpOwogCS8qCiAJRklFTERGTEFHX1JFQURPTkxZCiAJRklFTERGTEFHX1JFUVVJUkVECkBAIC03NSwxNCArMTAwLDE0IEBACiAJRlhfQk9PTAkJCQkJCQlHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKIAlGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CiAKLQlpbnQJCQkJCQkJCUdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFZhbHVlKCkgY29uc3Q7CisJaW50CQkJCQkJCQlHZXRTZWxlY3RlZEluZGV4KGludCBuSW5kZXgpOworCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRWYWx1ZShGWF9CT09MIGJEaXNwbGF5ID0gVFJVRSk7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldERlZmF1bHRWYWx1ZSgpIGNvbnN0OwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRPcHRpb25MYWJlbChpbnQgbkluZGV4KSBjb25zdDsKIAlpbnQJCQkJCQkJCUNvdW50T3B0aW9ucygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKKwlGWF9CT09MCQkJCQkJCUlzT3B0aW9uU2VsZWN0ZWQoaW50IG5JbmRleCk7CiAJaW50CQkJCQkJCQlHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQ2hlY2tlZCgpIGNvbnN0OworCUZYX0JPT0wJCQkJCQkJSXNDaGVja2VkKCk7CiAJLyoKIAlCRl9BTElHTl9MRUZUCiAJQkZfQUxJR05fTUlEREwKQEAgLTkwLDYgKzExNSw3IEBACiAJKi8KIAlpbnQJCQkJCQkJCUdldEFsaWdubWVudCgpIGNvbnN0OwogCWludAkJCQkJCQkJR2V0TWF4TGVuKCkgY29uc3Q7CisJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldE5hbWUoKTsKIAlDRlhfV2lkZVN0cmluZwkJCQkJR2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0OwogCiAvL1NldCBQcm9wZXJ0aWVzLgpAQCAtMTAwLDYgKzEyNiw3IEBACiAJdm9pZAkJCQkJCQlDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpOwogCXZvaWQJCQkJCQkJU2V0VG9wVmlzaWJsZUluZGV4KGludCBpbmRleCk7CiAKKwl2b2lkCQkJCQkJCVJlc2V0QXBwZWFyYW5jZShGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOwogCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlKEZYX0xQQ1dTVFIgc1ZhbHVlLCBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOwogCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKIAl2b2lkCQkJCQkJCVVwZGF0ZUZpZWxkKCk7CkBAIC0xNTUsOSArMTgyLDM3IEBACiAJRlhfQk9PTAkJCQkJCQltX2JBcHBNb2RpZmllZDsKIAlGWF9JTlQzMgkJCQkJCW1fbkFwcEFnZTsKIAlGWF9JTlQzMgkJCQkJCW1fblZhbHVlQWdlOworCisJWEZBX0hXSURHRVQJCQkJCQltX2hNaXhYRkFXaWRnZXQ7CisJSVhGQV9XaWRnZXRIYW5kbGVyKgkJCQltX3BXaWRnZXRIYW5kbGVyOworfTsKKworY2xhc3MgQ1BERlNES19YRkFXaWRnZXQgOiBwdWJsaWMgQ1BERlNES19Bbm5vdAoreworcHVibGljOgorCUNQREZTREtfWEZBV2lkZ2V0KFhGQV9IV0lER0VUIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSk7CisJdmlydHVhbCB+Q1BERlNES19YRkFXaWRnZXQoKXt9CisKK3B1YmxpYzoKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNYRkFGaWVsZCgpOworCXZpcnR1YWwgWEZBX0hXSURHRVQJCQlHZXRYRkFXaWRnZXQoKSB7IHJldHVybiBtX2hYRkFXaWRnZXQ7IH0KKworCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFR5cGUoKSBjb25zdCA7CisJdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0U3ViVHlwZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisKKwl2aXJ0dWFsIENGWF9GbG9hdFJlY3QJCUdldFJlY3QoKTsKKworcHVibGljOgorCUNQREZTREtfSW50ZXJGb3JtKgkJCUdldEludGVyRm9ybSgpIHsgcmV0dXJuIG1fcEludGVyRm9ybTsgfQorCitwcml2YXRlOgorCUNQREZTREtfSW50ZXJGb3JtKgkJCQltX3BJbnRlckZvcm07CisJWEZBX0hXSURHRVQJCQkJCQltX2hYRkFXaWRnZXQ7CiB9OwogCiAjZGVmaW5lIENQREZTREtfV2lkZ2V0TWFwCQkJCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGX0Zvcm1Db250cm9sKiwgQ1BERlNES19XaWRnZXQqPgorI2RlZmluZSBDUERGU0RLX1hGQVdpZGdldE1hcAkJCUNGWF9NYXBQdHJUZW1wbGF0ZTxYRkFfSFdJREdFVCwgQ1BERlNES19YRkFXaWRnZXQqPgorI2RlZmluZSBDUERGU0RLX0ZpZWxkU3luY2hyb25pemVNYXAJCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGX0Zvcm1GaWVsZCosIGludD4KIAogY2xhc3MgQ1BERlNES19JbnRlckZvcm0gOiBwdWJsaWMgQ1BERl9Gb3JtTm90aWZ5CiB7CkBAIC0xODAsOSArMjM1LDE5IEBACiAJdm9pZAkJCQkJCQlBZGRNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKIAl2b2lkCQkJCQkJCVJlbW92ZU1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7CiAJCisJdm9pZAkJCQkJCQlBZGRYRkFNYXAoWEZBX0hXSURHRVQgaFdpZGdldCwgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQpOworCXZvaWQJCQkJCQkJUmVtb3ZlWEZBTWFwKFhGQV9IV0lER0VUIGhXaWRnZXQpOworCUNQREZTREtfWEZBV2lkZ2V0KgkJCQlHZXRYRkFXaWRnZXQoWEZBX0hXSURHRVQgaFdpZGdldCk7CisJCiAJdm9pZAkJCQkJCQlFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCk7CiAJRlhfQk9PTAkJCQkJCQlJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdDsKIAorCXZvaWQJCQkJCQkJWGZhRW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpOworCUZYX0JPT0wJCQkJCQkJSXNYZmFDYWxjdWxhdGVFbmFibGVkKCkgY29uc3Q7CisKKwlGWF9CT09MCQkJCQkJCUlzWGZhVmFsaWRhdGlvbnNFbmFibGVkKCk7CisJdm9pZAkJCQkJCQlYZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoRlhfQk9PTCBiRW5hYmxlZCk7CisKICNpZmRlZiBfV0lOMzIKIAlDUERGX1N0cmVhbSoJCQkJCUxvYWRJbWFnZUZyb21GaWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZSk7CiAjZW5kaWYKQEAgLTIxNiw2ICsyODEsOCBAQAogCUZYX0JPT0wJCQkJCQkJSW1wb3J0Rm9ybUZyb21UeHRGaWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVHh0RmlsZU5hbWUpOwogCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZW1wb3JhcnlGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGVFeHQpOwogCQorCXZvaWQJCQkJCQkJU3luY2hyb25pemVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKTsKKwkKIHByaXZhdGU6CiAJdmlydHVhbCBpbnQJCQkJCQlCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSk7CiAJdmlydHVhbCBpbnQJCQkJCQlBZnRlclZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpOwpAQCAtMjM3LDcgKzMwNCwxMSBAQAogCUNQREZTREtfRG9jdW1lbnQqCQkJCW1fcERvY3VtZW50OwogCUNQREZfSW50ZXJGb3JtKgkJCQkJbV9wSW50ZXJGb3JtOwogCUNQREZTREtfV2lkZ2V0TWFwCQkJCW1fTWFwOworCUNQREZTREtfWEZBV2lkZ2V0TWFwCQkJbV9YRkFNYXA7CisJQ1BERlNES19GaWVsZFN5bmNocm9uaXplTWFwCQltX0ZpZWxkU3luY2hyb25pemVNYXA7CiAJRlhfQk9PTAkJCQkJCQltX2JDYWxjdWxhdGU7CisJRlhfQk9PTAkJCQkJCQltX2JYZmFDYWxjdWxhdGU7CisJRlhfQk9PTAkJCQkJCQltX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQ7CiAJRlhfQk9PTAkJCQkJCQltX2JCdXN5OwogCiBwdWJsaWM6CkBAIC0yNDgsOSArMzE5LDkgQEAKIAl2b2lkICAgIFNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwgaW50IG5GaWVsZFR5cGUpOwogCUZYX0NPTE9SUkVGIEdldEhpZ2hsaWdodENvbG9yKGludCBuRmllbGRUeXBlKTsKIHByaXZhdGU6Ci0JRlhfQ09MT1JSRUYgbV9hSGlnaGxpZ2h0Q29sb3JbNl07CisJRlhfQ09MT1JSRUYgbV9hSGlnaGxpZ2h0Q29sb3JbN107CiAJRlhfQllURSBtX2lIaWdobGlnaHRBbHBoYTsKLQlGWF9CT09MCW1fYk5lZWRIaWdodGxpZ2h0WzZdOworCUZYX0JPT0wJbV9iTmVlZEhpZ2h0bGlnaHRbN107CiB9OwogCiAjZGVmaW5lIEJBSV9TVFJVQ1RVUkUJCTAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgKaW5kZXggZDI0OWYwOC4uYjk1ZDYzZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgKQEAgLTU5LDcgKzU5LDE0IEBACiAJCSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiIAogCiAJCSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiIAotCS8vCSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIgorCQkjaW5jbHVkZSAiLi4vLi4veGZhL2luY2x1ZGUvZnhiYXJjb2RlL0JDX0JhckNvZGUuaCIKKwkJI2luY2x1ZGUgIi4uLy4uL3hmYS9pbmNsdWRlL2Z4anNlL2Z4anNlLmgiCisJCSNpbmNsdWRlICIuLi8uLi94ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgiCisJCSNpbmNsdWRlICIuLi8uLi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaCIKKworCQkjaW5jbHVkZSAiLi4vLi4veGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Vycm9yLmgiCisJCSNpbmNsdWRlICIuLi8uLi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGltZXIuaCIKKwkJI2luY2x1ZGUgIi4uLy4uL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaCIKIAkJI2lmZGVmIF9MSUNFTlNFRF9CVUlMRF8KIAkJCSNpbmNsdWRlICIuLi8uLi9jcnlwdG9wcC9DcnlwdGxpYi5oIgogCQkjZW5kaWYKQEAgLTEwNywxNCArMTE0LDQxIEBACiAJQ1BERl9DdXN0b21BY2Nlc3MoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2Vzcyk7CiAJfkNQREZfQ3VzdG9tQWNjZXNzKCkge30KIAorCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0RnVsbFBhdGgoKSB7IHJldHVybiAiIjsgfQogCXZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIEZYX09WRVJSSURFIHsgcmV0dXJuIG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW47IH0KIAorCXZpcnR1YWwgRlhfQk9PTAkJR2V0Qnl0ZShGWF9EV09SRCBwb3MsIEZYX0JZVEUmIGNoKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCUdldEJsb2NrKEZYX0RXT1JEIHBvcywgRlhfTFBCWVRFIHBCdWYsIEZYX0RXT1JEIHNpemUpOwogCXZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpIEZYX09WRVJSSURFIHsgZGVsZXRlIHRoaXM7IH0KIAogCXZpcnR1YWwgRlhfQk9PTAkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgRlhfT1ZFUlJJREU7CiAKLXByaXZhdGU6CiAJRlBERl9GSUxFQUNDRVNTCQltX0ZpbGVBY2Nlc3M7CisJRlhfQllURQkJCQltX0J1ZmZlcls1MTJdOworCUZYX0RXT1JECQkJbV9CdWZmZXJPZmZzZXQ7Cit9OworCitjbGFzcyBDRlBERl9GaWxlU3RyZWFtIDogcHVibGljIElGWF9GaWxlU3RyZWFtLCBwdWJsaWMgQ0ZYX09iamVjdAoreworcHVibGljOgorCUNGUERGX0ZpbGVTdHJlYW0oRlBERl9GSUxFSEFORExFUiogcEZTKTsKKwl2aXJ0dWFsIH5DRlBERl9GaWxlU3RyZWFtKCkge30KKworCXZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qCQlSZXRhaW4oKTsKKwl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpOworCisJdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFNpemUoKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKTsKKwl2aXJ0dWFsIEZYX0ZJTEVTSVpFCQkJR2V0UG9zaXRpb24oKSB7cmV0dXJuIG1fbkN1clBvczt9CisJdmlydHVhbCB2b2lkCQkJCVNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykge21fbkN1clBvcyA9IHBvczsgfQorCXZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKTsKKwl2aXJ0dWFsIHNpemVfdAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisJdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKTsKKwl2aXJ0dWFsIEZYX0JPT0wJCQkJRmx1c2goKTsKKworcHJvdGVjdGVkOgorCUZQREZfRklMRUhBTkRMRVIqCW1fcEZTOworCUZYX0ZJTEVTSVpFCQltX25DdXJQb3M7CiB9OwogCiB2b2lkCQlGU0RLX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksIEZQREZfQk9PTCBlbmFibGUpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaAppbmRleCBhNmY5OTBjLi41ZjgyOTE5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaApAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgImZzZGtfY29tbW9uLmgiCiAjaW5jbHVkZSAiZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICJmeF9zeXN0ZW1oYW5kbGVyLmgiCisjaW5jbHVkZSAiZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgImZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiCiAjaW5jbHVkZSAiZnNka19iYXNlYW5ub3QuaCIKICNpbmNsdWRlICJmc2RrX2Jhc2Vmb3JtLmgiCiAjaW5jbHVkZSAiZnBkZmZvcm1maWxsLmgiCkBAIC0zNCwxMSArMzYsMTcgQEAKIGNsYXNzIENQREZEb2NfRW52aXJvbm1lbnQgRlhfRklOQUwKIHsKIHB1YmxpYzoKLQlDUERGRG9jX0Vudmlyb25tZW50KENQREZfRG9jdW1lbnQgKiBwRG9jKTsKKwlDUERGRG9jX0Vudmlyb25tZW50KENQREZYRkFfRG9jdW1lbnQgKiBwRG9jKTsKIAl+Q1BERkRvY19FbnZpcm9ubWVudCgpOwogCiAJaW50IFJlZ0FwcEhhbmRsZShGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbyk7Ly97IG1fcEluZm8gID0gcEZGaW5mbzsgcmV0dXJuIFRSVUU7fQogCisJdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkKKwl7CisJCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPlJlbGVhc2UpCisJCQltX3BJbmZvLT5SZWxlYXNlKG1fcEluZm8pOworCQlkZWxldGUgdGhpczsKKwl9CiAJdm9pZCBGRklfSW52YWxpZGF0ZShGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKIAl7CiAJCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9JbnZhbGlkYXRlKSAKQEAgLTM0NSwxOSArMzUzLDM1OSBAQAogCQl9CiAJfQogCisJdm9pZAlGRklfRGlzcGxheUNhcmV0KEZQREZfUEFHRSBwYWdlLCBGUERGX0JPT0wgYlZpc2libGUsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pCisJeworCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRGlzcGxheUNhcmV0KQorCQl7CisJCQltX3BJbmZvLT5GRklfRGlzcGxheUNhcmV0KG1fcEluZm8sIHBhZ2UsIGJWaXNpYmxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworCQl9CisJfQorCWludAlGRklfR2V0Q3VycmVudFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQorCXsKKwkJaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgpCisJCXsKKwkJCW1fcEluZm8tPkZGSV9HZXRDdXJyZW50UGFnZUluZGV4KG1fcEluZm8sIGRvY3VtZW50KTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCWludAlGRklfU2V0Q3VycmVudFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGlDdXJQYWdlKQorCXsKKwkJaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldEN1cnJlbnRQYWdlKQorCQl7CisJCQltX3BJbmZvLT5GRklfU2V0Q3VycmVudFBhZ2UobV9wSW5mbywgZG9jdW1lbnQsIGlDdXJQYWdlKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJQ0ZYX1dpZGVTdHJpbmcJRkZJX0dldEFwcE5hbWUoKQorCXsKKwkJcmV0dXJuIENGWF9XaWRlU3RyaW5nKEwiQWNyb2JhdCIpOworCisJCS8vaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEFwcE5hbWUpCisJCS8veworCQkvLwlpbnQgbkxlbiA9IG1fcEluZm8tPkZGSV9HZXRBcHBOYW1lKG1fcEluZm8sIE5VTEwsIDApOworCQkvLwlpZihuTGVuIDw9IDApCisJCS8vCQlyZXR1cm4gTCIiOworCQkvLwljaGFyKiBwYnVmZiA9IG5ldyBjaGFyW25MZW5dOworCQkvLwlpZihwYnVmZikKKwkJLy8JCW1lbXNldChwYnVmZiwgMCwgbkxlbik7CisJCS8vCWVsc2UJCisJCS8vCQlyZXR1cm4gTCIiOworCQkvLwluTGVuID0gbV9wSW5mby0+RkZJX0dldEFwcE5hbWUobV9wSW5mbywgcGJ1ZmYsIG5MZW4pOworCQkvLwlDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBidWZmLCBuTGVuKTsKKwkJLy8JQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGJzUmV0KTsKKwkJLy8JZGVsZXRlW10gcGJ1ZmY7CisJCS8vCXJldHVybiB3c1JldDsKKwkJLy99CisKKwkJLy9yZXR1cm4gTCIiOworCX0KKworCUNGWF9XaWRlU3RyaW5nCUZGSV9HZXRQbGF0Zm9ybSgpCisJeworCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0UGxhdGZvcm0pCisJCXsKKwkJCWludCBuUmVxdWlyZWRMZW4gPSBtX3BJbmZvLT5GRklfR2V0UGxhdGZvcm0obV9wSW5mbywgTlVMTCwgMCk7CisJCQlpZiAoblJlcXVpcmVkTGVuIDw9IDApCisJCQkJcmV0dXJuIEwiIjsKKworCQkJY2hhciogcGJ1ZmYgPSBuZXcgY2hhcltuUmVxdWlyZWRMZW5dOworCQkJaWYgKCFwYnVmZikKKwkJCQlyZXR1cm4gTCIiOworCisJCQltZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7CisJCQlpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRQbGF0Zm9ybShtX3BJbmZvLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKKwkJCWlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikKKwkJCXsKKwkJCQlkZWxldGVbXSBwYnVmZjsKKwkJCQlyZXR1cm4gTCIiOworCQkJfQorCQkJQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwYnVmZiwgbkFjdHVhbExlbik7CisJCQlDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgodW5zaWduZWQgc2hvcnQqKWJzUmV0LkdldEJ1ZmZlcihic1JldC5HZXRMZW5ndGgoKSksIGJzUmV0LkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCQkJZGVsZXRlW10gcGJ1ZmY7CisJCQlyZXR1cm4gd3NSZXQ7CisJCX0KKwkJcmV0dXJuIEwiIjsKKwl9CisKKwl2b2lkIEZGSV9Hb3RvVVJMKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZYX1dTVFIgd3NVUkwsIEZYX0JPT0wgYkFwcGVuZCkKKwl7CisJCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Hb3RvVVJMKQorCQl7CisJCQlDRlhfQnl0ZVN0cmluZyBic1RvID0gQ0ZYX1dpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7CisJCQlGUERGX1dJREVTVFJJTkcgcFRvID0gKEZQREZfV0lERVNUUklORylic1RvLkdldEJ1ZmZlcih3c1VSTC5HZXRMZW5ndGgoKSk7CisJCQltX3BJbmZvLT5GRklfR290b1VSTChtX3BJbmZvLCBkb2N1bWVudCwgcFRvKTsKKwkJCWJzVG8uUmVsZWFzZUJ1ZmZlcigpOworCQl9CisJfQorCXZvaWQgRkZJX0dldFVSTChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBDRlhfV2lkZVN0cmluZyYgd3NVUkwpCisJeworCQl3c1VSTCA9IENGWF9XaWRlU3RyaW5nKCk7CisJCXJldHVybjsKKwkJLy9pZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0VVJMKQorCQkvL3sKKwkJLy8JRlBERl9XSURFU1RSSU5HIHVybCA9IG1fcEluZm8tPkZGSV9HZXRVUkwobV9wSW5mbywgZG9jdW1lbnQpOworCQkvLwlDRlhfV2lkZVN0cmluZyB0bXA7CisJCS8vCXRtcC5Gcm9tVVRGMTZMRSh1cmwpOworCQkvLwl3c1VSTCA9IHRtcDsKKwkJLy99CisJfQorCisJdm9pZCBGRklfQWRkRG9SZWNvcmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCkKKwl7CisJCS8vaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0FkZERvUmVjb3JkKQorCQkvL3sKKwkJLy8JbV9wSW5mby0+RkZJX0FkZERvUmVjb3JkKG1fcEluZm8sIGRvY3VtZW50LCBoV2lkZ2V0KTsKKwkJLy99CisJfQorCXZvaWQgRkZJX1BhZ2VFdmVudChGUERGX1BBR0UgcGFnZSwgRlBERl9EV09SRCBmbGFnKQorCXsKKwkJLy9pZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfUGFnZUV2ZW50KQorCQkvL3sKKwkJLy8JbV9wSW5mby0+RkZJX1BhZ2VFdmVudChtX3BJbmZvLCBwYWdlLCBmbGFnKTsKKwkJLy99CisJfQorCisJdm9pZCBGRklfR2V0UGFnZVZpZXdSZWN0KEZQREZfUEFHRSBwYWdlLCBGU19SRUNURiYgZHN0UmVjdCkKKwl7CisJCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRQYWdlVmlld1JlY3QpCisJCXsKKwkJCWRvdWJsZSBsZWZ0OyAKKwkJCWRvdWJsZSB0b3A7CisJCQlkb3VibGUgcmlnaHQ7CisJCQlkb3VibGUgYm90dG9tOworCQkJbV9wSW5mby0+RkZJX0dldFBhZ2VWaWV3UmVjdChtX3BJbmZvLCBwYWdlLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKworCQkJZHN0UmVjdC5sZWZ0ID0gbGVmdDsKKwkJCWRzdFJlY3QudG9wID0gdG9wIDwgYm90dG9tPyBib3R0b206dG9wOworCQkJZHN0UmVjdC5ib3R0b20gPSB0b3AgPCBib3R0b20/IHRvcDpib3R0b207CisJCQlkc3RSZWN0LnJpZ2h0ID0gcmlnaHQ7CisJCX0KKwl9CisKKworCUZYX0JPT0wgIEZGSV9Qb3B1cE1lbnUoRlBERl9QQUdFIHBhZ2UsIEZQREZfV0lER0VUIGhXaWRnZXQsIGludCBtZW51RmxhZywgQ0ZYX1BvaW50RiBwdFBvcHVwLCBjb25zdCBDRlhfUG9pbnRGKiBwUmVjdEV4Y2x1ZGUpCisJeworCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfUG9wdXBNZW51KQorCQl7CisJCQlyZXR1cm4gbV9wSW5mby0+RkZJX1BvcHVwTWVudShtX3BJbmZvLCBwYWdlLCBoV2lkZ2V0LCBtZW51RmxhZywgcHRQb3B1cC54LCBwdFBvcHVwLnkpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisJCisJdm9pZAlGRklfQWxlcnQoRlBERl9XSURFU1RSSU5HIE1zZywgRlBERl9XSURFU1RSSU5HIFRpdGxlLCBpbnQgVHlwZSwgaW50IEljb24pCisJeworCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KQorCQl7CisJCQltX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYWxlcnQobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgTXNnLCBUaXRsZSwgVHlwZSwgSWNvbik7CisJCX0KKwl9CisJdm9pZAlGRklfRW1haWxUbyhGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwgRlBERl9XSURFU1RSSU5HIHBUbywgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0LCBGUERGX1dJREVTVFJJTkcgcENDLCBGUERGX1dJREVTVFJJTkcgcEJjYywgRlBERl9XSURFU1RSSU5HIHBNc2cpCisJeworCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9FbWFpbFRvKQorCQl7CisJCQltX3BJbmZvLT5GRklfRW1haWxUbyhtX3BJbmZvLCBmaWxlSGFuZGxlciwgcFRvLCBwU3ViamVjdCwgcENDLCBwQmNjLCBwTXNnKTsKKwkJfQorCX0KKwl2b2lkCUZGSV9VcGxvYWRUbyhGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwgaW50IGZpbGVGbGFnLCBGUERGX1dJREVTVFJJTkcgdXBsb2FkVG8pCisJeworCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9VcGxvYWRUbykKKwkJeworCQkJbV9wSW5mby0+RkZJX1VwbG9hZFRvKG1fcEluZm8sIGZpbGVIYW5kbGVyLCBmaWxlRmxhZywgdXBsb2FkVG8pOworCQl9CisJfQorCUZQREZfRklMRUhBTkRMRVIqIEZGSV9PcGVuRmlsZShpbnQgZmlsZVR5cGUsIEZQREZfV0lERVNUUklORyB3c1VSTCwgY29uc3QgY2hhciogbW9kZSkKKwl7CisJCWlmKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX09wZW5GaWxlKQorCQl7CisJCQlyZXR1cm4gbV9wSW5mby0+RkZJX09wZW5GaWxlKG1fcEluZm8sIGZpbGVUeXBlLCB3c1VSTCwgbW9kZSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCUNGWF9XaWRlU3RyaW5nIEZGSV9HZXRGaWxlUGF0aChGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIpCisJeworI2lmIDAKKwkJaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEZpbGVQYXRoKQorCQl7CisJCQlpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldEZpbGVQYXRoKG1fcEluZm8sIHBGaWxlSGFuZGxlciwgTlVMTCwgMCk7CisJCQlpZiAoblJlcXVpcmVkTGVuIDw9IDApCisJCQkJcmV0dXJuIEwiIjsKKworCQkJY2hhciogcGJ1ZmYgPSBuZXcgY2hhcltuUmVxdWlyZWRMZW5dOworCQkJaWYgKCFwYnVmZikKKwkJCQlyZXR1cm4gTCIiOworCisJCQltZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7CisJCQlpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRGaWxlUGF0aChtX3BJbmZvLCBwRmlsZUhhbmRsZXIsIHBidWZmLCBuUmVxdWlyZWRMZW4pOworCQkJaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQorCQkJeworCQkJCWRlbGV0ZVtdIHBidWZmOworCQkJCXJldHVybiBMIiI7CisJCQl9CisJCQlDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBidWZmLCBuQWN0dWFsTGVuKTsKKwkJCUNGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKCh1bnNpZ25lZCBzaG9ydCopYnNSZXQuR2V0QnVmZmVyKGJzUmV0LkdldExlbmd0aCgpKSwgYnNSZXQuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJCQlkZWxldGVbXSBwYnVmZjsKKwkJCXJldHVybiB3c1JldDsKKwkJfQorCQlyZXR1cm4gTCIiOworI2Vsc2UKKwkJcmV0dXJuIEwiIjsKKyNlbmRpZgorCX0KKwlpbnQJCUZGSV9HZXREb2N1bWVudENvdW50KCkKKwl7CisJCS8vaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldERvY3VtZW50Q291bnQpCisJCS8veworCQkJLy9yZXR1cm4gbV9wSW5mby0+RkZJX0dldERvY3VtZW50Q291bnQobV9wSW5mbyk7CisJCS8vfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpbnQJCUZGSV9HZXRDdXJEb2N1bWVudCgpCisJeworCQkvL2lmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRDdXJEb2N1bWVudEluZGV4KQorCQkvL3sKKwkJLy8JcmV0dXJuIG1fcEluZm8tPkZGSV9HZXRDdXJEb2N1bWVudEluZGV4KG1fcEluZm8pOworCQkvL30KKwkJcmV0dXJuIDA7CisJfQorCisJSUZYX0ZpbGVSZWFkKglGRklfRG93bmxvYWRGcm9tVVJMKEZYX0xQQ1dTVFIgdXJsKQorCXsKKwkJaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0Rvd25sb2FkRnJvbVVSTCkKKwkJeworCQkJQ0ZYX0J5dGVTdHJpbmcgYnN0clVSTCA9IENGWF9XaWRlU3RyaW5nKHVybCkuVVRGMTZMRV9FbmNvZGUoKTsKKwkJCUZQREZfV0lERVNUUklORyB3c1VSTCA9IChGUERGX1dJREVTVFJJTkcpYnN0clVSTC5HZXRCdWZmZXIoYnN0clVSTC5HZXRMZW5ndGgoKSk7CisKKwkJCUZQREZfTFBGSUxFSEFORExFUiBmaWxlSGFuZGxlciA9IG1fcEluZm8tPkZGSV9Eb3dubG9hZEZyb21VUkwobV9wSW5mbywgd3NVUkwpOworCisJCQlDRlBERl9GaWxlU3RyZWFtKiBmaWxlU3RyZWFtID0gRlhfTkVXIENGUERGX0ZpbGVTdHJlYW0oZmlsZUhhbmRsZXIpOworCQkJcmV0dXJuIGZpbGVTdHJlYW07CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJQ0ZYX1dpZGVTdHJpbmcJRkZJX1Bvc3RSZXF1ZXN0VVJMKEZYX0xQQ1dTVFIgd3NVUkwsIEZYX0xQQ1dTVFIgd3NEYXRhLCBGWF9MUENXU1RSIHdzQ29udGVudFR5cGUsIEZYX0xQQ1dTVFIgd3NFbmNvZGUsIEZYX0xQQ1dTVFIgd3NIZWFkZXIpCisJeworCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfUG9zdFJlcXVlc3RVUkwpCisJCXsKKwkJCUNGWF9CeXRlU3RyaW5nIGJzVVJMID0gQ0ZYX1dpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7CisJCQlGUERGX1dJREVTVFJJTkcgVVJMID0gKEZQREZfV0lERVNUUklORylic1VSTC5HZXRCdWZmZXIoYnNVUkwuR2V0TGVuZ3RoKCkpOworCisJCQlDRlhfQnl0ZVN0cmluZyBic0RhdGEgPSBDRlhfV2lkZVN0cmluZyh3c0RhdGEpLlVURjE2TEVfRW5jb2RlKCk7CisJCQlGUERGX1dJREVTVFJJTkcgZGF0YSA9IChGUERGX1dJREVTVFJJTkcpYnNEYXRhLkdldEJ1ZmZlcihic0RhdGEuR2V0TGVuZ3RoKCkpOworCisJCQlDRlhfQnl0ZVN0cmluZyBic0NvbnRlbnRUeXBlID0gQ0ZYX1dpZGVTdHJpbmcod3NDb250ZW50VHlwZSkuVVRGMTZMRV9FbmNvZGUoKTsKKwkJCUZQREZfV0lERVNUUklORyBjb250ZW50VHlwZSA9IChGUERGX1dJREVTVFJJTkcpYnNDb250ZW50VHlwZS5HZXRCdWZmZXIoYnNDb250ZW50VHlwZS5HZXRMZW5ndGgoKSk7CisKKwkJCUNGWF9CeXRlU3RyaW5nIGJzRW5jb2RlID0gQ0ZYX1dpZGVTdHJpbmcod3NFbmNvZGUpLlVURjE2TEVfRW5jb2RlKCk7CisJCQlGUERGX1dJREVTVFJJTkcgZW5jb2RlID0gKEZQREZfV0lERVNUUklORylic0VuY29kZS5HZXRCdWZmZXIoYnNFbmNvZGUuR2V0TGVuZ3RoKCkpOworCisJCQlDRlhfQnl0ZVN0cmluZyBic0hlYWRlciA9IENGWF9XaWRlU3RyaW5nKHdzSGVhZGVyKS5VVEYxNkxFX0VuY29kZSgpOworCQkJRlBERl9XSURFU1RSSU5HIGhlYWRlciA9IChGUERGX1dJREVTVFJJTkcpYnNIZWFkZXIuR2V0QnVmZmVyKGJzSGVhZGVyLkdldExlbmd0aCgpKTsKKworCQkJRlBERl9CU1RSIHJlc3BvbmU7CisJCQlGUERGX0JTdHJfSW5pdCgmcmVzcG9uZSk7CisJCQlGUERGX0JPT0wgYlJldCA9IG1fcEluZm8tPkZGSV9Qb3N0UmVxdWVzdFVSTChtX3BJbmZvLCBVUkwsIGRhdGEsIGNvbnRlbnRUeXBlLCBlbmNvZGUsIGhlYWRlciwgJnJlc3BvbmUpOworCisJCQlDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgodW5zaWduZWQgc2hvcnQqKXJlc3BvbmUuc3RyLCByZXNwb25lLmxlbi9zaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKwkJCUZQREZfQlN0cl9DbGVhcigmcmVzcG9uZSk7CisKKwkJCXJldHVybiB3c1JldDsKKwkJfQorCQlyZXR1cm4gTCIiOworCX0KKworCUZQREZfQk9PTAlGRklfUHV0UmVxdWVzdFVSTChGWF9MUENXU1RSIHdzVVJMLCBGWF9MUENXU1RSIHdzRGF0YSwgRlhfTFBDV1NUUiB3c0VuY29kZSkKKwl7CisJCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9QdXRSZXF1ZXN0VVJMKQorCQl7CisJCQlDRlhfQnl0ZVN0cmluZyBic1VSTCA9IENGWF9XaWRlU3RyaW5nKHdzVVJMKS5VVEYxNkxFX0VuY29kZSgpOworCQkJRlBERl9XSURFU1RSSU5HIFVSTCA9IChGUERGX1dJREVTVFJJTkcpYnNVUkwuR2V0QnVmZmVyKGJzVVJMLkdldExlbmd0aCgpKTsKKworCQkJQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhID0gQ0ZYX1dpZGVTdHJpbmcod3NEYXRhKS5VVEYxNkxFX0VuY29kZSgpOworCQkJRlBERl9XSURFU1RSSU5HIGRhdGEgPSAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKKworCQkJQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGUgPSBDRlhfV2lkZVN0cmluZyh3c0VuY29kZSkuVVRGMTZMRV9FbmNvZGUoKTsKKwkJCUZQREZfV0lERVNUUklORyBlbmNvZGUgPSAoRlBERl9XSURFU1RSSU5HKWJzRW5jb2RlLkdldEJ1ZmZlcihic0VuY29kZS5HZXRMZW5ndGgoKSk7CisKKwkJCXJldHVybiBtX3BJbmZvLT5GRklfUHV0UmVxdWVzdFVSTChtX3BJbmZvLCBVUkwsIGRhdGEsIGVuY29kZSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUZQREZfQk9PTAlGRklfU2hvd0ZpbGVEaWFsb2coRlhfTFBDV1NUUiB3c1RpdGxlLCBGWF9MUENXU1RSIHdzRmlsdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1BhdGhBcnIsIEZYX0JPT0wgYk9wZW4pCisJeworCQkvKkNGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyh3c1RpdGxlKS5VVEYxNkxFX0VuY29kZSgpOworCQlGUERGX1dJREVTVFJJTkcgdGl0bGUgPSAoRlBERl9XSURFU1RSSU5HKWJzVGl0bGUuR2V0QnVmZmVyKGJzVGl0bGUuR2V0TGVuZ3RoKCkpOworCisJCUNGWF9CeXRlU3RyaW5nIGJzRmlsdGVyID0gQ0ZYX1dpZGVTdHJpbmcod3NGaWx0ZXIpLlVURjE2TEVfRW5jb2RlKCk7CisJCUZQREZfV0lERVNUUklORyBmaWx0ZXIgPSAoRlBERl9XSURFU1RSSU5HKWJzRmlsdGVyLkdldEJ1ZmZlcihic0ZpbHRlci5HZXRMZW5ndGgoKSk7CisKKwkJQ0ZYX0J5dGVTdHJpbmdBcnJheSogc3RyUGF0aEFyciA9IEZYX05FVyBDRlhfQnl0ZVN0cmluZ0FycmF5KCk7CisJCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9TaG93RmlsZURpYWxvZykKKwkJeworCQkJRlBERl9CT09MIGJSZXQgPSBtX3BJbmZvLT5GRklfU2hvd0ZpbGVEaWFsb2cobV9wSW5mbywgdGl0bGUsIGZpbHRlciwgYk9wZW4sIChGUERGX1NUUklOR0hBTkRMRSlzdHJQYXRoQXJyKTsKKwkJCWlmIChiUmV0KSAKKwkJCXsKKwkJCQlpbnQgY291bnQgPSBzdHJQYXRoQXJyLT5HZXRTaXplKCk7CisJCQkJZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspCisJCQkJeworCQkJCQlDRlhfQnl0ZVN0cmluZyBic1BhdGggPSAqc3RyUGF0aEFyci0+R2V0RGF0YVB0cihpKTsKKwkJCQkJQ0ZYX1dpZGVTdHJpbmcgd3NQYXRoID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKCh1bnNpZ25lZCBzaG9ydCopYnNQYXRoLkdldEJ1ZmZlcihic1BhdGguR2V0TGVuZ3RoKCkpLCBic1BhdGguR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJCQkJCWlmICghd3NQYXRoLklzRW1wdHkoKSkKKwkJCQkJCXdzUGF0aEFyci5BZGQod3NQYXRoKTsKKwkJCQkJd3NQYXRoID0gTCIiOworCQkJCX0KKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCSovCisKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlDRlhfV2lkZVN0cmluZyBGRklfR2V0TGFuZ3VhZ2UoKQorCXsKKwkJaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKQorCQl7CisJCQlpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKG1fcEluZm8sIE5VTEwsIDApOworCQkJaWYgKG5SZXF1aXJlZExlbiA8PSAwKQorCQkJCXJldHVybiBMIiI7CisKKwkJCWNoYXIqIHBidWZmID0gbmV3IGNoYXJbblJlcXVpcmVkTGVuXTsKKwkJCWlmICghcGJ1ZmYpCisJCQkJcmV0dXJuIEwiIjsKKworCQkJbWVtc2V0KHBidWZmLCAwLCBuUmVxdWlyZWRMZW4pOworCQkJaW50IG5BY3R1YWxMZW4gPSBtX3BJbmZvLT5GRklfR2V0TGFuZ3VhZ2UobV9wSW5mbywgcGJ1ZmYsIG5SZXF1aXJlZExlbik7CisJCQlpZiAobkFjdHVhbExlbiA8PSAwIHx8IG5BY3R1YWxMZW4gPiBuUmVxdWlyZWRMZW4pCisJCQl7CisJCQkJZGVsZXRlW10gcGJ1ZmY7CisJCQkJcmV0dXJuIEwiIjsKKwkJCX0KKwkJCUNGWF9CeXRlU3RyaW5nIGJzUmV0ID0gQ0ZYX0J5dGVTdHJpbmcocGJ1ZmYsIG5BY3R1YWxMZW4pOworCQkJQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0Kilic1JldC5HZXRCdWZmZXIoYnNSZXQuR2V0TGVuZ3RoKCkpLCBic1JldC5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKwkJCWRlbGV0ZVtdIHBidWZmOworCQkJcmV0dXJuIHdzUmV0OworCQl9CisJCXJldHVybiBMIiI7CisJfQorCiBwdWJsaWM6CiAJRlhfQk9PTAkJCQlJc0pTSW5pdGlhdGVkKCk7CiAKIHB1YmxpYzoJCiAJdm9pZAkJCQlTZXRDdXJyZW50RG9jKENQREZTREtfRG9jdW1lbnQqIHBGWERvYykge21fcFNES0RvYyA9IHBGWERvYzt9CiAJQ1BERlNES19Eb2N1bWVudCoJR2V0Q3VycmVudERvYygpOwotCUNQREZfRG9jdW1lbnQqCQlHZXRQREZEb2N1bWVudCgpIHtyZXR1cm4gbV9wUERGRG9jO30KKwlDUERGWEZBX0RvY3VtZW50KglHZXRQREZYRkFEb2N1bWVudCgpIHtyZXR1cm4gbV9wRG9jO30KIC8vIAlDUERGU0RLX0RvY3VtZW50KiAgIEdldERvY3VtZW50KGludCBuSW5kZXgpOwogLy8gCWludAkJCQkJQ291bnREb2N1bWVudHMoKSB7cmV0dXJuIG1fZG9jTWFwLkdldENvdW50KCk7fQogCi0JQ1BERlNES19Eb2N1bWVudCoJCU9wZW5Eb2N1bWVudChDRlhfV2lkZVN0cmluZyAmZmlsZU5hbWUpOwotCUNQREZTREtfRG9jdW1lbnQqCQlPcGVuTWVtUERGRG9jKENQREZfRG9jdW1lbnQqIHBOZXdEb2MsIENGWF9XaWRlU3RyaW5nICZmaWxlTmFtZSk7Ci0JRlhfQk9PTAkJCQkJT3BlblVSTChDRlhfV2lkZVN0cmluZyAmZmlsZVBhdGgpOworCUNQREZTREtfRG9jdW1lbnQqCQlPcGVuRG9jdW1lbnQoQ0ZYX1dpZGVTdHJpbmcgJmZpbGVOYW1lKXtyZXR1cm4gTlVMTDt9CisJQ1BERlNES19Eb2N1bWVudCoJCU9wZW5NZW1QREZEb2MoQ1BERl9Eb2N1bWVudCogcE5ld0RvYywgQ0ZYX1dpZGVTdHJpbmcgJmZpbGVOYW1lKXtyZXR1cm4gTlVMTDt9CisJRlhfQk9PTAkJCQkJT3BlblVSTChDRlhfV2lkZVN0cmluZyAmZmlsZVBhdGgpe3JldHVybiBGQUxTRTt9CiAJCiAKIAlDRlhfQnl0ZVN0cmluZwkJR2V0QXBwTmFtZSgpIHtyZXR1cm4gIiI7fQpAQCAtMzc5LDEzICs3MjcsMTMgQEAKIAlGUERGX0ZPUk1GSUxMSU5GTyoJbV9wSW5mbzsKIC8vCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGX0RvY3VtZW50KiwgQ1BERlNES19Eb2N1bWVudCo+IG1fZG9jTWFwOwogCUNQREZTREtfRG9jdW1lbnQqIG1fcFNES0RvYzsKLQlDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7CisJQ1BERlhGQV9Eb2N1bWVudCogbV9wRG9jOwogCiAJQ0ZGTF9JRm9ybUZpbGxlciogbV9wSUZvcm1GaWxsZXI7CiAJSUZYX1N5c3RlbUhhbmRsZXIqIG1fcFN5c0hhbmRsZXI7CiAKIHB1YmxpYzoKLQlDSlNfUnVudGltZUZhY3RvcnkqICBtX3BKU1J1bnRpbWVGYWN0b3J5OworCS8vQ0pTX1J1bnRpbWVGYWN0b3J5KiAgbV9wSlNSdW50aW1lRmFjdG9yeTsKIH07CiAKIApAQCAtNDA3LDE5ICs3NTUsMjAgQEAKIGNsYXNzIENQREZTREtfRG9jdW1lbnQKIHsKIHB1YmxpYzoKLQlDUERGU0RLX0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOworCUNQREZTREtfRG9jdW1lbnQoQ1BERlhGQV9Eb2N1bWVudCogcERvYywgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudik7CiAJfkNQREZTREtfRG9jdW1lbnQoKTsKIHB1YmxpYzoKIAlDUERGU0RLX0ludGVyRm9ybSoJCUdldEludGVyRm9ybSgpIDsKLQlDUERGX0RvY3VtZW50KgkJCUdldERvY3VtZW50KCkge3JldHVybiBtX3BEb2M7fQorCUNQREZYRkFfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIHtyZXR1cm4gbV9wRG9jO30KIAogcHVibGljOgogCXZvaWQJCQkJCUluaXRQYWdlVmlldygpOwotCXZvaWQJCQkJCUFkZFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JQ1BERlNES19QYWdlVmlldyoJCUdldFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIEZYX0JPT0wgUmVOZXcgPSBUUlVFKTsKKwlpbnQJCQkJCQlHZXRQYWdlVmlld0NvdW50KCl7cmV0dXJuIG1fcGFnZU1hcC5HZXRDb3VudCgpO30KKwl2b2lkCQkJCQlBZGRQYWdlVmlldyhDUERGWEZBX1BhZ2UqIHBQREZYRkFQYWdlLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCUNQREZTREtfUGFnZVZpZXcqCQlHZXRQYWdlVmlldyhDUERGWEZBX1BhZ2UqIHBQREZYRkFQYWdlLCBGWF9CT09MIFJlTmV3ID0gVFJVRSk7CiAJQ1BERlNES19QYWdlVmlldyoJCUdldFBhZ2VWaWV3KGludCBuSW5kZXgpOwogCUNQREZTREtfUGFnZVZpZXcqCQlHZXRDdXJyZW50VmlldygpOwotCXZvaWQJCQkJCVJlTW92ZVBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UpOworCXZvaWQJCQkJCVJlTW92ZVBhZ2VWaWV3KENQREZYRkFfUGFnZSogcFBERlBhZ2UpOwogCXZvaWQJCQkJCVVwZGF0ZUFsbFZpZXdzKENQREZTREtfUGFnZVZpZXcqIHBTZW5kZXIsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKIAlDUERGU0RLX0Fubm90KgkJCUdldEZvY3VzQW5ub3QoKTsvL3tyZXR1cm4gTlVMTDt9CkBAIC00NDQsMTUgKzc5MywxNSBAQAogLy8JRlhfQk9PTAkJCQkJR2V0Q2hhbmdlTWFyaygpe3JldHVybiBGQUxTRTt9Ly9Jc0Fubm90TW9kaWZpZWQoKXx8SXNGb3JtTW9kaWZpZWQoKSB8fCBJc1dpZGdldE1vZGlmaWVkKCl8fCBtX25DaGFuZ2VNYXJrPjAgO30JCiAvLwl2b2lkICAgICAgICAgICAgICAgICAgICBDbGVhckNoYW5nZU1hcmsoKXt9CiAJQ0ZYX1dpZGVTdHJpbmcJCQlHZXRQYXRoKCkgOwotCUNQREZfUGFnZSoJCQkJR2V0UGFnZShpbnQgbkluZGV4KTsKKwlDUERGWEZBX1BhZ2UqCQkJR2V0UGFnZShpbnQgbkluZGV4KTsKIAlDUERGRG9jX0Vudmlyb25tZW50ICoJR2V0RW52KCkge3JldHVybiBtX3BFbnY7IH0KIAl2b2lkCQkJCSAgICBQcm9jSmF2YXNjcmlwdEZ1bigpOwogCUZYX0JPT0wJCQkJCVByb2NPcGVuQWN0aW9uKCk7CiAJQ1BERl9PQ0NvbnRleHQqCQkJR2V0T0NDb250ZXh0KCk7CiBwcml2YXRlOgogCS8vQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERlNES19QYWdlVmlldyo+IG1fcGFnZUFycmF5OwotCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGX1BhZ2UqLCBDUERGU0RLX1BhZ2VWaWV3Kj4gbV9wYWdlTWFwOwotCUNQREZfRG9jdW1lbnQqCQkJbV9wRG9jOworCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGWEZBX1BhZ2UqLCBDUERGU0RLX1BhZ2VWaWV3Kj4gbV9wYWdlTWFwOworCUNQREZYRkFfRG9jdW1lbnQqCQkJbV9wRG9jOwogCiAJQ1BERlNES19JbnRlckZvcm0qCQltX3BJbnRlckZvcm07CiAJQ1BERlNES19Bbm5vdCoJCQltX3BGb2N1c0Fubm90OwpAQCAtNDYwLDEyICs4MDksMTMgQEAKIAlDUERGX09DQ29udGV4dCAqCQltX3BPY2NvbnRlbnQ7CiAJRlhfQk9PTAkJCQkJbV9iQ2hhbmdlTWFzazsKIH07CisKIGNsYXNzIENQREZTREtfUGFnZVZpZXcgRlhfRklOQUwKIHsKIHB1YmxpYzoKLQlDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsQ1BERl9QYWdlKiBwYWdlKTsKKwlDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsQ1BERlhGQV9QYWdlKiBwYWdlKTsKIAl+Q1BERlNES19QYWdlVmlldygpOwotCXZvaWQgUGFnZVZpZXdfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgOworCXZvaWQgUGFnZVZpZXdfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogcENsaXAgPSBOVUxMKSA7CiAJQ1BERl9Bbm5vdCoJCQkJCQlHZXRQREZBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKIAlDUERGU0RLX0Fubm90KgkJCQkJR2V0RlhBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKIAlDUERGX0Fubm90KgkJCQkJCUdldFBERldpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKQEAgLTQ3OCwxNiArODI4LDIxIEBACiAJQ1BERlNES19Bbm5vdCoJCQkJCUFkZEFubm90KENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKIAlDUERGU0RLX0Fubm90KgkJCQkJQWRkQW5ub3QoRlhfTFBDU1RSIGxwU3ViVHlwZSxDUERGX0RpY3Rpb25hcnkgKiBwRGljdCk7CiAJQ1BERlNES19Bbm5vdCoJCQkJCUFkZEFubm90KENQREZfQW5ub3QgKiBwUERGQW5ub3QpOworCUNQREZTREtfQW5ub3QqCQkJCQlBZGRBbm5vdChYRkFfSFdJREdFVCBwUERGQW5ub3QpOwogCUZYX0JPT0wJCQkJCQkJRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsJCQkJCQkJCiAJCiAJaW50CQkJCQkJCQlDb3VudEFubm90cygpOwogCUNQREZTREtfQW5ub3QqCQkJCQlHZXRBbm5vdChpbnQgbkluZGV4KTsKIAlDUERGU0RLX0Fubm90KgkJCQkgICAgR2V0QW5ub3RCeURpY3QoQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwotCUNQREZfUGFnZSoJCQkJCQlHZXRQREZQYWdlKCl7cmV0dXJuIG1fcGFnZTt9CisJQ1BERlNES19Bbm5vdCoJCQkJCUdldEFubm90QnlYRkFXaWRnZXQoWEZBX0hXSURHRVQgaFdpZGdldCk7CisJQ1BERlhGQV9QYWdlKgkJCQkJR2V0UERGWEZBUGFnZSgpe3JldHVybiBtX3BhZ2U7fQorCUNQREZfUGFnZSoJCQkJCQlHZXRQREZQYWdlKCk7CiAJQ1BERl9Eb2N1bWVudCoJCQkJCUdldFBERkRvY3VtZW50KCk7CiAJQ1BERlNES19Eb2N1bWVudCoJCQkJR2V0U0RLRG9jdW1lbnQoKSB7cmV0dXJuIG1fcFNES0RvYzt9CQogCUZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKIAlGWF9CT09MCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOworCUZYX0JPT0wJCQkJCU9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKKwlGWF9CT09MCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOwogCUZYX0JPT0wJCQkJCU9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpOwogCUZYX0JPT0wJCQkJCU9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CiAJRlhfQk9PTAkJCQkJT25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CkBAIC01MDIsMjcgKzg1NywyNiBAQAogCiAJaW50CQkJCQkJR2V0UGFnZUluZGV4KCk7CiAJdm9pZAkJCQkJCQlMb2FkRlhBbm5vdHMoKTsKLQotICAgICAgICB2b2lkIFNldFZhbGlkKEZYX0JPT0wgYlZhbGlkKSB7bV9iVmFsaWQgPSBiVmFsaWQ7fQotICAgICAgICBGWF9CT09MIElzVmFsaWQoKSB7cmV0dXJuIG1fYlZhbGlkO30KLSAgICAgICAgdm9pZCBTZXRMb2NrKEZYX0JPT0wgYkxvY2tlZCkge21fYkxvY2tlZD0gYkxvY2tlZDt9Ci0gICAgICAgIEZYX0JPT0wgSXNMb2NrZWQoKSB7cmV0dXJuIG1fYkxvY2tlZDt9Ci0gICAgICAgIHZvaWQgVGFrZU92ZXJQYWdlKCkge21fYlRha2VPdmVyUGFnZSA9IFRSVUU7fQorCXZvaWQgU2V0VmFsaWQoRlhfQk9PTCBiVmFsaWQpIHttX2JWYWxpZCA9IGJWYWxpZDt9CisgICAgRlhfQk9PTCBJc1ZhbGlkKCkge3JldHVybiBtX2JWYWxpZDt9CisgICAgdm9pZCBTZXRMb2NrKEZYX0JPT0wgYkxvY2tlZCkge21fYkxvY2tlZD0gYkxvY2tlZDt9CisgICAgRlhfQk9PTCBJc0xvY2tlZCgpIHtyZXR1cm4gbV9iTG9ja2VkO30KKyAgICB2b2lkIFRha2VPdmVyUGFnZSgpIHttX2JUYWtlT3ZlclBhZ2UgPSBUUlVFO30KIHByaXZhdGU6CiAJdm9pZCBQYWdlVmlld19PbkhpZ2hsaWdodEZvcm1GaWVsZHMoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotICAgICAgICBDUERGX01hdHJpeCBtX2N1ck1hdHJpeDsKLQlDUERGX1BhZ2UqIG1fcGFnZTsKKwlDUERGX01hdHJpeCBtX2N1ck1hdHJpeDsKKwlDUERGWEZBX1BhZ2UqIG1fcGFnZTsKIAlDUERGX0Fubm90TGlzdCogbV9wQW5ub3RMaXN0OwogCS8vQ1BERlNES19Bbm5vdCogbV9wRm9jdXNBbm5vdDsKIAlDRlhfUHRyQXJyYXkgIG1fZnhBbm5vdEFycmF5OwogCUNQREZTREtfRG9jdW1lbnQqIG1fcFNES0RvYzsKLQlDUERGU0RLX1dpZGdldCogbV9DYXB0dXJlV2lkZ2V0OworCUNQREZTREtfQW5ub3QqIG1fQ2FwdHVyZVdpZGdldDsKIAlGWF9CT09MIG1fYkVudGVyV2lkZ2V0OwogCUZYX0JPT0wgbV9iRXhpdFdpZGdldDsKIAlGWF9CT09MIG1fYk9uV2lkZ2V0OwogCUZYX0JPT0wgbV9iVmFsaWQ7Ci0gICAgICAgIEZYX0JPT0wgbV9iTG9ja2VkOwotICAgICAgICBGWF9CT09MIG1fYlRha2VPdmVyUGFnZTsKKyAgICBGWF9CT09MIG1fYkxvY2tlZDsKKyAgICBGWF9CT09MIG1fYlRha2VPdmVyUGFnZTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgKaW5kZXggNzYzM2JiYi4uNzc1NDUzNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oCkBAIC04OCw2ICs4OCw4IEBACiAJdmlydHVhbCB2b2lkCQkJCUV4aXQoKSA9IDA7CiAJdmlydHVhbCB2b2lkCQkJCUVudGVyKCkgPSAwOwogCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0VudGVyZWQoKSA9IDA7CisJdmlydHVhbAlGWF9CT09MCQkJCUdldEhWYWx1ZUJ5TmFtZShGWF9CU1RSIHV0ZjhOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKSA9IDA7CisJdmlydHVhbAlGWF9CT09MCQkJCVNldEhWYWx1ZUJ5TmFtZShGWF9CU1RSIHV0ZjhOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKSA9IDA7CiB9OwogCiBjbGFzcyBDUERGRG9jX0Vudmlyb25tZW50OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oCmluZGV4IDgwNjgwODYuLmFkYjI4Y2QgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgKQEAgLTc0LDcgKzc0LDcgQEAKIAlGWF9CT09MCQkJCQkJSXNNc2dCb3hFbmFibGVkKCkgY29uc3Qge3JldHVybiBtX2JNc2dCb3hFbmFibGU7fQogCiBwdWJsaWM6Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCQlHZXRSZWFkZXJBcHAoKTsKKwlDUERGRG9jX0Vudmlyb25tZW50KgkJR2V0UmVhZGVyQXBwKCk7CiAJQ0pTX1J1bnRpbWUqCQkJCUdldEpTUnVudGltZSgpe3JldHVybiBtX3BSdW50aW1lO30KIAogCUZYX0JPT0wJCQkJCQlEb0pvYihpbnQgbk1vZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKaW5kZXggMTA4YzFlMi4uMTc5OGUwMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKQEAgLTkzLDExICs5Myw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAlDSlNfUHJvcFZhbHVlIHZhbHVlKGlzb2xhdGUpO1wKIAl2YWx1ZS5TdGFydEdldHRpbmcoKTtcCkBAIC0xMjksMTEgKzEyNiw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAlDSlNfUHJvcFZhbHVlIHByb3BWYWx1ZShDSlNfVmFsdWUoaXNvbGF0ZSx2YWx1ZSxWVF91bmtub3duKSk7XAogCXByb3BWYWx1ZS5TdGFydFNldHRpbmcoKTtcCkBAIC0xNzAsMTEgKzE2NCw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAlDSlNfUGFyYW1ldGVycyBwYXJhbWV0ZXJzO1wKIAlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaTwodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKylcCkBAIC0zNTksMTEgKzM1MCw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7XAogCUNGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTtcCkBAIC0zOTcsMTEgKzM4NSw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7XAogCUNGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTtcCkBAIC00MzQsMTEgKzQxOSw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7XAogCUNGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTtcCkBAIC01MjUsMTEgKzUwNyw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAlDSlNfUGFyYW1ldGVycyBwYXJhbWV0ZXJzO1wKIAlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaTwodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKylcCkBAIC01NjgsMTEgKzU0Nyw4IEBACiB7XAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7XAogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7XAotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7XAotCUFTU0VSVCghdi5Jc0VtcHR5KCkpO1wKLQlpZih2LklzRW1wdHkoKSkgcmV0dXJuO1wKLQl2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6SGFuZGxlPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7XAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpO1wKKwlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpO1wKKwlpZiAocFJ1bnRpbWUgPT0gTlVMTCkgcmV0dXJuO1wKIAlJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpO1wKIAlDSlNfUGFyYW1ldGVycyBwYXJhbWV0ZXJzO1wKIAlmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaTwodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKylcCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKaW5kZXggOGVlZTE1OC4uYzU0ZDdiNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaApAQCAtOTEsNiArOTEsNyBAQAogcHJpdmF0ZToKIAlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfR2xvYmFsRGF0YV9FbGVtZW50Kj4JbV9hcnJheUdsb2JhbERhdGE7CiAJQ0ZYX1dpZGVTdHJpbmcJCQkJCQkJCW1fc0ZpbGVQYXRoOworCUNQREZEb2NfRW52aXJvbm1lbnQqCQkJCQkJbV9wQXBwOwogfTsKIAogI2VuZGlmIC8vX0pTX0dMT0JBTERBVEFfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKaW5kZXggYTZkYWM1ZC4uY2E2ZjRhMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKQEAgLTI2LDcgKzI2LDcgQEAKIAlvcGVyYXRvcgkJCQkJQ0pTX09iamVjdCogKCl7cmV0dXJuIG1fcEpTT2JqZWN0O307CiAKIAlDUERGU0RLX1BhZ2VWaWV3ICoJCQlKU0dldFBhZ2VWaWV3KElGWEpTX0NvbnRleHQqIGNjKTsKLQlpbnQJCQkJCQkJTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfTFBDV1NUUiBzd01zZywgRlhfTFBDV1NUUiBzd1RpdGxlID0gTlVMTCwgRlhfVUlOVCBuVHlwZSA9IDAsIEZYX1VJTlQgbkljb24gPSAwKTsKKwlpbnQJCQkJCQkJTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0xQQ1dTVFIgc3dNc2csIEZYX0xQQ1dTVFIgc3dUaXRsZSA9IE5VTEwsIEZYX1VJTlQgblR5cGUgPSAwLCBGWF9VSU5UIG5JY29uID0gMCk7CiAJdm9pZAkJCQkJCUFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfTFBDV1NUUiBzd01zZyk7CiAJRlhfQk9PTAkJCQkJCUlzU2FmZU1vZGUoSUZYSlNfQ29udGV4dCogY2MpOwogCkBAIC01Niw3ICs1Niw3IEBACiAJQ0pTX0VtYmVkT2JqICoJCQkJR2V0RW1iZWRPYmplY3QoKXtyZXR1cm4gbV9wRW1iZWRPYmo7fTsKIAogCXN0YXRpYyBDUERGU0RLX1BhZ2VWaWV3ICoJSlNHZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYyk7Ci0Jc3RhdGljIGludAkJCQkJTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfTFBDV1NUUiBzd01zZywgRlhfTFBDV1NUUiBzd1RpdGxlID0gTlVMTCwgRlhfVUlOVCBuVHlwZSA9IDAsRlhfVUlOVCBuSWNvbiA9IDApOworCXN0YXRpYyBpbnQJCQkJCU1zZ0JveChDUERGRG9jX0Vudmlyb25tZW50ICogcEFwcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9MUENXU1RSIHN3TXNnLCBGWF9MUENXU1RSIHN3VGl0bGUgPSBOVUxMLCBGWF9VSU5UIG5UeXBlID0gMCxGWF9VSU5UIG5JY29uID0gMCk7CiAJc3RhdGljIHZvaWQJCQkJCUFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfTFBDV1NUUiBzd01zZyk7CiAKIAl2ODo6SXNvbGF0ZSoJCQkJCUdldElzb2xhdGUoKSB7cmV0dXJuIG1fcElzb2xhdGU7fQpAQCAtMTY0LDcgKzE2NCw3IEBACiBjbGFzcyBDSlNfVGltZXIKIHsKIHB1YmxpYzoKLQlDSlNfVGltZXIoQ0pTX0VtYmVkT2JqICogcE9iaixDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKToKKwlDSlNfVGltZXIoQ0pTX0VtYmVkT2JqICogcE9iaiwgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk6CiAJCW1fblRpbWVySUQoMCksIAogCQltX3BFbWJlZE9iaihwT2JqKSwgCiAJCW1fYlByb2Nlc3NpbmcoRkFMU0UpLApAQCAtMTk3LDYgKzE5NywxMSBAQAogCXsKIAkJaWYgKG1fblRpbWVySUQpCiAJCXsKKwkJCWlmIChtX3BBcHAgPT0gTlVMTCkgeworCQkJCW1fc1RpbWVNYXAuUmVtb3ZlQXQobV9uVGltZXJJRCk7CisJCQkJbV9uVGltZXJJRCA9IDA7CisJCQkJcmV0dXJuOworCQkJfQogCQkJSUZYX1N5c3RlbUhhbmRsZXIqIHBIYW5kbGVyID0gbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCk7CiAJCQlwSGFuZGxlci0+S2lsbFRpbWVyKG1fblRpbWVySUQpOwogCQkJbV9zVGltZU1hcC5SZW1vdmVBdChtX25UaW1lcklEKTsKQEAgLTI3Nyw4ICsyODIsOCBAQAogCUZYX0JPT0wJCQkJCQkJbV9iUHJvY2Vzc2luZzsKIAogCS8vZGF0YQotCUZYX0RXT1JECQkJCQkJCW1fZHdTdGFydFRpbWU7Ci0JRlhfRFdPUkQJCQkJCQkJbV9kd1RpbWVPdXQ7CisJRlhfRFdPUkQJCQkJCQltX2R3U3RhcnRUaW1lOworCUZYX0RXT1JECQkJCQkJbV9kd1RpbWVPdXQ7CiAJRlhfRFdPUkQJCQkJCQltX2R3RWxhcHNlOwogCUNKU19SdW50aW1lKgkJCQkJbV9wUnVudGltZTsKIAlDRlhfV2lkZVN0cmluZwkJCQkJbV9zd0pTY3JpcHQ7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgKaW5kZXggMGExOTVmMS4uMjE3YTk4NSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaApAQCAtMzcsNyArMzcsNyBAQAogCXZpcnR1YWwgdm9pZAkJCQkJCQlFbnRlcigpOwogCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc0VudGVyZWQoKTsKIAotCUNQREZEb2NfRW52aXJvbm1lbnQgKgkJCQkJCQlHZXRSZWFkZXJBcHAoKXtyZXR1cm4gbV9wQXBwO30KKwlDUERGRG9jX0Vudmlyb25tZW50ICoJCQkJCUdldFJlYWRlckFwcCgpe3JldHVybiBtX3BBcHA7fQogCiAJRlhfQk9PTAkJCQkJCQkJCUluaXRKU09iamVjdHMoKTsKIApAQCAtNTAsMTkgKzUwLDIzIEBACiAJRlhfQk9PTAkJCQkJCQkJCUlzQmxvY2tpbmcoKXtyZXR1cm4gbV9iQmxvY2tpbmc7fQogCiAJb3BlcmF0b3IJCQkJCQkJCUlKU19SdW50aW1lKigpIHtyZXR1cm4gKElKU19SdW50aW1lKiltX2lzb2xhdGU7fQotCXY4OjpJc29sYXRlKgkJCQkJCQkJR2V0SXNvbGF0ZSgpe3JldHVybiBtX2lzb2xhdGU7fTsKKwl2ODo6SXNvbGF0ZSoJCQkJCQkJR2V0SXNvbGF0ZSgpe3JldHVybiBtX2lzb2xhdGU7fTsKIAl2b2lkCQkJCQkJCQkJU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSl7bV9pc29sYXRlID0gaXNvbGF0ZTt9CiAKLQl2ODo6SGFuZGxlPHY4OjpDb250ZXh0PgkJCQkJCQlOZXdKU0NvbnRleHQoKTsKKwl2ODo6SGFuZGxlPHY4OjpDb250ZXh0PgkJCQkJTmV3SlNDb250ZXh0KCk7CisKKworCXZpcnR1YWwJRlhfQk9PTAkJCQkJCQlHZXRIVmFsdWVCeU5hbWUoRlhfQlNUUiB1dGY4TmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7CisJdmlydHVhbAlGWF9CT09MCQkJCQkJCVNldEhWYWx1ZUJ5TmFtZShGWF9CU1RSIHV0ZjhOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsKIHByb3RlY3RlZDoKIAlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfQ29udGV4dCAqPgkJbV9Db250ZXh0QXJyYXk7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCAqCQkJCQkJCW1fcEFwcDsKKwlDUERGRG9jX0Vudmlyb25tZW50ICoJCQkJCW1fcEFwcDsKIAlDUERGU0RLX0RvY3VtZW50ICoJCQkJCQltX3BEb2N1bWVudDsKIAlGWF9CT09MCQkJCQkJCQkJbV9iQmxvY2tpbmc7CiAJQ0pTX0ZpZWxkRXZlbnQqCQkJCQkJCW1fcEZpZWxkRXZlbnRQYXRoOwogCi0Jdjg6Oklzb2xhdGUqCQkJCQkJCQltX2lzb2xhdGU7Ci0Jdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+CQkJCQkJbV9jb250ZXh0OworCXY4OjpJc29sYXRlKgkJCQkJCQltX2lzb2xhdGU7CisJdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+CQkJCW1fY29udGV4dDsKIAlGWF9CT09MCQkJCQkJCQkJbV9iUmVnaXN0ZXJlZDsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaAppbmRleCAxNjY0NzJiLi5jYTU5MjJlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiLi4vZnhlZGl0L2Z4X2VkaXQuaCIKICNpbmNsdWRlICIuLi9wZGZ3aW5kb3cvSVBERldpbmRvdy5oIgogI2luY2x1ZGUgIi4uL2ZzZGtfbWdyLmgiCisjaW5jbHVkZSAiLi4vZnBkZnhmYS9mcGRmeGZhX2FwcC5oIgogCiAKICNpbmNsdWRlIDxzdHJpbmc+CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgKaW5kZXggZDg2Y2I3Ny4uNmFmMzI0ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaApAQCAtMjEsNiArMjEsOSBAQAogCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAogCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIAl2aXJ0dWFsIHZvaWQJCQkJCU9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQJCQkJCU9uUG9wdXBQcmVPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisJdmlydHVhbCB2b2lkCQkJCQlPblBvcHVwUG9zdE9wZW4odm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKIH07CiAKIGNsYXNzIFBXTF9DTEFTUyBDUFdMX0VkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Q3RybCwgcHVibGljIElGWF9FZGl0X09wck5vdGlmeQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCmluZGV4IGVlNmI3YmQuLjFjNWI0OTggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKQEAgLTM0OCw2ICszNDgsMTkgQEAKIAl9CiB9CiAKK0ZYX0JPT0wJQ0ZGTF9Db21ib0JveDo6SXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQoreworCWlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorCXsKKwkJaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KQorCQl7CisJCQlyZXR1cm4gcEVkaXQtPklzVGV4dEZ1bGwoKTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKwogdm9pZCBDRkZMX0NvbWJvQm94OjpPblNldEZvY3VzKENQV0xfV25kKiBwV25kKQogewogCUFTU0VSVChtX3BBcHAgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwCmluZGV4IDUzMGI4MGMuLmM5ZGQ2NjggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwCkBAIC0yOTIsNyArMjkyLDcgQEAKIHsKIAlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogCi0JQ1BERl9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CisJQ1BERlhGQV9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZYRkFQYWdlKCk7CiAgCUNQREZTREtfRG9jdW1lbnQgKiBwRG9jID0gbV9wQXBwLT5HZXRDdXJyZW50RG9jKCk7CiAJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcERvYy0+R2V0UGFnZVZpZXcocFBhZ2UpOwogIAlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiBDUERGU0RLX1BhZ2VWaWV3KiBDRkZMX0Zvcm1GaWxsZXI6OkdldEN1clBhZ2VWaWV3KCkKIHsKIAotCUNQREZfUGFnZSogcFBhZ2UgPSBtX3BBbm5vdC0+R2V0UERGUGFnZSgpOworCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBtX3BBbm5vdC0+R2V0UERGWEZBUGFnZSgpOwogCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BBcHAtPkdldEN1cnJlbnREb2MoKTsKIAlpZihwU0RLRG9jKQogCXsKQEAgLTcxMyw2ICs3MTMsMTEgQEAKIHsKIH0KIAorRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKK3sKKwlyZXR1cm4gRkFMU0U7Cit9CisKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRDaGFuZ2VNYXJrKCkKIHsKIAltX3BBcHAtPkZGSV9PbkNoYW5nZSgpOwpAQCAtODAzLDcgKzgwOCw3IEBACiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpJbnZhbGlkYXRlUmVjdChkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKQogewotCUNQREZfUGFnZSAqIHBQYWdlID0gbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CisJQ1BERlhGQV9QYWdlICogcFBhZ2UgPSBtX3BXaWRnZXQtPkdldFBERlhGQVBhZ2UoKTsKIAltX3BBcHAtPkZGSV9JbnZhbGlkYXRlKHBQYWdlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAKaW5kZXggMmIyMWUxMy4uNjFjYjU1ZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcApAQCAtMzM1LDYgKzMzNSw5IEBACiAJCUZYX0JPT0wgYlJlc2V0ID0gRkFMU0U7CiAJCU9uQnV0dG9uVXAocFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LG5GbGFncyk7CiAJCWlmIChiRXhpdCkgcmV0dXJuIFRSVUU7CisKKwkJT25DbGljayhwV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisJCWlmIChiRXhpdCkgcmV0dXJuIFRSVUU7CiAJfQogCXJldHVybiBiUmV0OwogfQpAQCAtODMwLDcgKzgzMyw3IEBACiAJCXVuUmVjdC5yaWdodCA9IChGWF9GTE9BVCkodW5SZWN0LnJpZ2h0ICsgMC41KTsKIAkJdW5SZWN0LnRvcCA9IChGWF9GTE9BVCkodW5SZWN0LnRvcCArIDAuNSk7CiAJCXVuUmVjdC5ib3R0b20gPSAoRlhfRkxPQVQpKHVuUmVjdC5ib3R0b20gLTAuNSk7Ci0JCW1fcEFwcC0+RkZJX0ludmFsaWRhdGUocERhdGEtPnBXaWRnZXQtPkdldFBERlBhZ2UoKSwgdW5SZWN0LmxlZnQsIHVuUmVjdC50b3AsIHVuUmVjdC5yaWdodCwgdW5SZWN0LmJvdHRvbSk7CisJCW1fcEFwcC0+RkZJX0ludmFsaWRhdGUocERhdGEtPnBXaWRnZXQtPkdldFBERlhGQVBhZ2UoKSwgdW5SZWN0LmxlZnQsIHVuUmVjdC50b3AsIHVuUmVjdC5yaWdodCwgdW5SZWN0LmJvdHRvbSk7CiAJfQogfQogCkBAIC0xMDM3LDYgKzEwNDAsMTkwIEBACiAvLyAJcmV0dXJuIG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04gfHwgbXNnLm1lc3NhZ2UgPT0gV01fQ0hBUjsKIH0KIAordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNsaWNrKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpCit7CisJQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisKKwlpZiAoIW1fYk5vdGlmeWluZykKKwl7CisJCWlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfQ2xpY2spKQorCQl7CisJCQltX2JOb3RpZnlpbmcgPSBUUlVFOworCQkJaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisJCQlpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworCQkJUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworCQkJZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisJCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKwkJCXBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrLCBmYSwgcFBhZ2VWaWV3KTsKKwkJCW1fYk5vdGlmeWluZyA9IEZBTFNFOworCisJCQlpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQorCQkJeworCQkJCWJFeGl0ID0gVFJVRTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkKKwkJCXsKKwkJCQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQorCQkJCXsKKwkJCQkJcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworCQkJCX0KKworCQkJCWJSZXNldCA9IFRSVUU7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25GdWxsKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpCit7CisJQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisKKwlpZiAoIW1fYk5vdGlmeWluZykKKwl7CisJCWlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfRnVsbCkpCisJCXsKKwkJCW1fYk5vdGlmeWluZyA9IFRSVUU7CisJCQlpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKwkJCWludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworCisJCQlQREZTREtfRmllbGRBY3Rpb24gZmE7CisJCQlmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKwkJCWZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKworCQkJcFdpZGdldC0+T25YRkFBQWN0aW9uKFBERlNES19YRkFfRnVsbCwgZmEsIHBQYWdlVmlldyk7CisJCQltX2JOb3RpZnlpbmcgPSBGQUxTRTsKKworCQkJaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwV2lkZ2V0KSkKKwkJCXsKKwkJCQliRXhpdCA9IFRSVUU7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCisJCQl7CisJCQkJaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKKwkJCQl7CisJCQkJCXBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKwkJCQl9CisKKwkJCQliUmVzZXQgPSBUUlVFOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uUG9wdXBQcmVPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQoreworCUFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CisJQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworCUFTU0VSVChwRGF0YS0+cFdpZGdldCAhPSBOVUxMKTsKKworCUZYX0JPT0wgYlRlbXBSZXNldCA9IEZBTFNFOworCUZYX0JPT0wgYlRlbXBFeGl0ID0gRkFMU0U7CisJdGhpcy0+T25QcmVPcGVuKHBEYXRhLT5wV2lkZ2V0LCBwRGF0YS0+cFBhZ2VWaWV3LCBiVGVtcFJlc2V0LCBiVGVtcEV4aXQsIG5GbGFnKTsKKworCWlmIChiVGVtcFJlc2V0IHx8IGJUZW1wRXhpdCkKKwl7CisJCWJFeGl0ID0gVFJVRTsKKwl9Cit9CisKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQoreworCUFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CisJQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworCUFTU0VSVChwRGF0YS0+cFdpZGdldCAhPSBOVUxMKTsKKworCUZYX0JPT0wgYlRlbXBSZXNldCA9IEZBTFNFOworCUZYX0JPT0wgYlRlbXBFeGl0ID0gRkFMU0U7CisJdGhpcy0+T25Qb3N0T3BlbihwRGF0YS0+cFdpZGdldCwgcERhdGEtPnBQYWdlVmlldywgYlRlbXBSZXNldCwgYlRlbXBFeGl0LCBuRmxhZyk7CisKKwlpZiAoYlRlbXBSZXNldCB8fCBiVGVtcEV4aXQpCisJeworCQliRXhpdCA9IFRSVUU7CisJfQorfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uUHJlT3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LCBGWF9VSU5UIG5GbGFnKQoreworCUFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworCisJaWYgKCFtX2JOb3RpZnlpbmcpCisJeworCQlpZiAocFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4pKQorCQl7CisJCQltX2JOb3RpZnlpbmcgPSBUUlVFOworCQkJaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisJCQlpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworCQkJUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworCQkJZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisJCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKwkJCXBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4sIGZhLCBwUGFnZVZpZXcpOworCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7CisKKwkJCWlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpCisJCQl7CisJCQkJYkV4aXQgPSBUUlVFOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQorCQkJeworCQkJCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCisJCQkJeworCQkJCQlwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CisJCQkJfQorCisJCQkJYlJlc2V0ID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblBvc3RPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpCit7CisJQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisKKwlpZiAoIW1fYk5vdGlmeWluZykKKwl7CisJCWlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfUG9zdE9wZW4pKQorCQl7CisJCQltX2JOb3RpZnlpbmcgPSBUUlVFOworCQkJaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisJCQlpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworCQkJUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworCQkJZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisJCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKwkJCXBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1Bvc3RPcGVuLCBmYSwgcFBhZ2VWaWV3KTsKKwkJCW1fYk5vdGlmeWluZyA9IEZBTFNFOworCisJCQlpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQorCQkJeworCQkJCWJFeGl0ID0gVFJVRTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkKKwkJCXsKKwkJCQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQorCQkJCXsKKwkJCQkJcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworCQkJCX0KKworCQkJCWJSZXNldCA9IFRSVUU7CisJCQl9CisJCX0KKwl9Cit9CisKIEZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQogewogCkBAIC0xMTA5LDYgKzEyOTYsMTkgQEAKIAlDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOwogCUFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAkKKwlpZiAocEZvcm1GaWxsZXItPklzRmllbGRGdWxsKHBEYXRhLT5wUGFnZVZpZXcpKQorCXsKKwkJRlhfQk9PTCBiRnVsbEV4aXQgPSBGQUxTRTsKKwkJRlhfQk9PTCBiRnVsbFJlc2V0ID0gRkFMU0U7CisJCU9uRnVsbChwRGF0YS0+cFdpZGdldCwgcERhdGEtPnBQYWdlVmlldywgYkZ1bGxSZXNldCwgYkZ1bGxFeGl0LCBuRmxhZyk7CisKKwkJaWYgKGJGdWxsUmVzZXQgfHwgYkZ1bGxFeGl0KQorCQl7CisJCQliRXhpdCA9IFRSVUU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJCiAJaWYgKCFtX2JOb3RpZnlpbmcpCiAJewogCQlpZiAocERhdGEtPnBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKaW5kZXggNDVjNzE2Mi4uZjljOTM5MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCkBAIC0xNzYsNyArMTc2LDcgQEAKICAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogIAkJCW1fYlZhbGlkID0gIW1fYlZhbGlkOwogCQkJQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKLQkJCW1fcEFwcC0+RkZJX0ludmFsaWRhdGUocEFubm90LT5HZXRQREZQYWdlKCksIHJjQW5ub3QubGVmdCwgcmNBbm5vdC50b3AsIHJjQW5ub3QucmlnaHQsIHJjQW5ub3QuYm90dG9tKTsKKwkJCW1fcEFwcC0+RkZJX0ludmFsaWRhdGUocEFubm90LT5HZXRQREZYRkFQYWdlKCksIHJjQW5ub3QubGVmdCwgcmNBbm5vdC50b3AsIHJjQW5ub3QucmlnaHQsIHJjQW5ub3QuYm90dG9tKTsKICAKICAJCQlpZiAobV9iVmFsaWQpCiAgCQkJewpAQCAtMzQ4LDYgKzM0OCwxNiBAQAogCXJldHVybiBwUmV0OwogfQogCitGWF9CT09MCUNGRkxfVGV4dEZpZWxkOjpJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCit7CisJaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwl7CisJCXJldHVybiBwV25kLT5Jc1RleHRGdWxsKCk7CQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKwogdm9pZCBDRkZMX1RleHRGaWVsZDo6T25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkKIHsKIAlBU1NFUlQobV9wQXBwICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwCmluZGV4IGI1NDgzZjkuLmVmZDEyMDcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAKQEAgLTYsNiArNiw5IEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmX2RhdGFhdmFpbC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZmZvcm1maWxsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiCiAKIGV4dGVybiB2b2lkIFByb2Nlc3NQYXJzZUVycm9yKEZYX0RXT1JEIGVycl9jb2RlKTsKIGNsYXNzIENGUERGX0ZpbGVBdmFpbFdyYXAgOiBwdWJsaWMgSUZYX0ZpbGVBdmFpbApAQCAtMTMzLDEzICsxMzYsMTkgQEAKIAl9CiAJKChDRlBERl9EYXRhQXZhaWwqKWF2YWlsKS0+bV9wRGF0YUF2YWlsLT5TZXREb2N1bWVudChwUGFyc2VyLT5HZXREb2N1bWVudCgpKTsKIAlDaGVja1VuU3VwcG9ydEVycm9yKHBQYXJzZXItPkdldERvY3VtZW50KCksIEZQREZfRVJSX1NVQ0NFU1MpOwotCXJldHVybiBwUGFyc2VyLT5HZXREb2N1bWVudCgpOworCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwUGFyc2VyLT5HZXREb2N1bWVudCgpOworCisJQ1BERlhGQV9BcHAqIHBBcHAgPSBGUERGWEZBX0dldEFwcCgpOworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEZYX05FVyBDUERGWEZBX0RvY3VtZW50KHBQREZEb2MsIHBBcHApOworCS8vcERvY3VtZW50LT5Mb2FkWEZBRG9jKCk7CisKKwlyZXR1cm4gcERvY3VtZW50OwogfQogCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShGUERGX0RPQ1VNRU5UIGRvYykKIHsKIAlpZiAoZG9jID09IE5VTEwpIHJldHVybiAwOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jOworCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvYyktPkdldFBERkRvYygpOwogCXJldHVybiAoKENQREZfUGFyc2VyKilwRG9jLT5HZXRQYXJzZXIoKSktPkdldEZpcnN0UGFnZU5vKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcAppbmRleCA5M2Y2ZTE4Li41MTJhNjE3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZl9leHQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKIAogI2RlZmluZSAgRlBERlNES19VTlNVUFBPUlRfQ0FMTCAxMDAKIApAQCAtMjIwLDcgKzIyMSw3IEBACiBETExFWFBPUlQgaW50IEZQREZEb2NfR2V0UGFnZU1vZGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKIHsKIAlpZiAoIWRvY3VtZW50KSByZXR1cm4gUEFHRU1PREVfVU5LTk9XTjsKLQlDUERGX0RpY3Rpb25hcnkgKnBSb290ID0gKChDUERGX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFJvb3QoKTsKKwlDUERGX0RpY3Rpb25hcnkgKnBSb290ID0gKCgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKSktPkdldFJvb3QoKTsKIAlpZiAoIXBSb290KQogCQlyZXR1cm4gUEFHRU1PREVfVU5LTk9XTjsKIAlDUERGX09iamVjdCogcE5hbWUgPSBwUm9vdC0+R2V0RWxlbWVudCgiUGFnZU1vZGUiKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwCmluZGV4IDZkMzQ0MGYuLmUwN2NjYzkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9mbGF0dGVuLmNwcApAQCAtNiw2ICs2LDggQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZfZmxhdHRlbi5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCIKIAogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX0RpY3Rpb25hcnkqPiBDUERGX09iamVjdEFycmF5OwogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1JlY3Q+IENQREZfUmVjdEFycmF5OwpAQCAtMzMyLDcgKzMzNCwxMCBAQAogCQlyZXR1cm4gRkxBVFRFTl9GQUlMOwogCX0KIAotCUNQREZfUGFnZSAqIHBQYWdlID0gKENQREZfUGFnZSopKCBwYWdlICk7CisJQ1BERl9QYWdlICogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopKCBwYWdlICkpLT5HZXRQREZQYWdlKCk7CisJaWYgKCFwUGFnZSkKKwkJcmV0dXJuIEZMQVRURU5fRkFJTDsKKwogCUNQREZfRG9jdW1lbnQgKiBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CiAJQ1BERl9EaWN0aW9uYXJ5ICogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwogCQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9wcm9ncmVzc2l2ZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcAppbmRleCAyNDkwZGY4Li41MjI2NzcwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcApAQCAtOCw2ICs4LDggQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmdmlldy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgogCiBleHRlcm4gdm9pZCAoKkZ1bmNfUmVuZGVyUGFnZSkoIENSZW5kZXJDb250ZXh0KiwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKIAkJCQkJCWludCByb3RhdGUsIGludCBmbGFncyxGWF9CT09MIGJOZWVkVG9SZXN0b3JlLCBJRlNES19QQVVTRV9BZGFwdGVyICogcGF1c2UgKTsKQEAgLTI4LDcgKzMwLDkgQEAKIAlpZiAocGF1c2UtPnZlcnNpb24gIT0xKQogCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpCisJCXJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiAJCiAvLwlGWE1UX0NTTE9DS19PQkooJnBQYWdlLT5tX1BhZ2VMb2NrKTsKIAkKQEAgLTcxLDcgKzc1LDkgQEAKIAlpZiAocGF1c2UtPnZlcnNpb24gIT0xKQogCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpCisJCXJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiAKIC8vCUZYTVRfQ1NMT0NLX09CSigmcFBhZ2UtPm1fUGFnZUxvY2spOwogCkBAIC05Miw3ICs5OCw4IEBACiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZV9DbG9zZShGUERGX1BBR0UgcGFnZSkKIHsKIAlpZiAocGFnZSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpIHJldHVybjsKIAogLy8JRlhNVF9DU0xPQ0tfT0JKKCZwUGFnZS0+bV9QYWdlTG9jayk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCmluZGV4IGE2NjY2NjYuLjA0M2MwMmMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcApAQCAtNiwxMiArNiwxNSBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZl90cmFuc2Zvcm1wYWdlLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgogCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApCiB7CiAJaWYoIXBhZ2UpCiAJCXJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisJaWYgKCFwUGFnZSkgcmV0dXJuOwogCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwogCUNQREZfQXJyYXkqIHBNZWRpYUJveEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXk7CiAJcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIobGVmdCkpOwpAQCAtMjcsNyArMzAsOCBAQAogewogCWlmKCFwYWdlKQogCQlyZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpIHJldHVybjsKIAlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX0FycmF5KiBwQ3JvcEJveEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXk7CiAJcENyb3BCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcihsZWZ0KSk7CkBAIC00NCw3ICs0OCw4IEBACiB7CiAJaWYoIXBhZ2UpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisJaWYgKCFwUGFnZSkgcmV0dXJuIEZBTFNFOwogCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwogCUNQREZfQXJyYXkqIHBBcnJheSA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIk1lZGlhQm94Iik7CiAJaWYocEFycmF5KQpAQCAtNjIsNyArNjcsOCBAQAogewogCWlmKCFwYWdlKQogCQlyZXR1cm4gRkFMU0U7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpIHJldHVybiBGQUxTRTsKIAlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJDcm9wQm94Iik7CiAJaWYocEFycmF5KQpAQCAtODEsNiArODcsMTAgQEAKIAlpZighcGFnZSkKIAkJcmV0dXJuIEZBTFNFOwogCisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpCisJCXJldHVybiBGQUxTRTsKKwogCUNGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOwogCXRleHRCdWY8PCJxICI7CiAJQ0ZYX0Zsb2F0UmVjdCByZWN0KGNsaXBSZWN0LT5sZWZ0LCBjbGlwUmVjdC0+Ym90dG9tLCBjbGlwUmVjdC0+cmlnaHQsIGNsaXBSZWN0LT50b3ApOwpAQCAtOTQsNyArMTA0LDYgQEAKIAl0ZXh0QnVmPDxic01hdGl4OwogCQogCi0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CiAJQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX09iamVjdCogcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRFbGVtZW50KCJDb250ZW50cyIpIDogTlVMTDsKIAlpZighcENvbnRlbnRPYmopCkBAIC0yNTgsNyArMjY3LDggQEAKIHsKIAlpZighcGFnZSkKIAkJcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKwlpZiAoIXBQYWdlKSByZXR1cm47CiAJQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAlDUERGX09iamVjdCogcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRFbGVtZW50KCJDb250ZW50cyIpIDogTlVMTDsKIAlpZighcENvbnRlbnRPYmopCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZG9jLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZkb2MuY3BwCmluZGV4IGU5NzRmZmIuLjY0M2UzOTggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZkb2MuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZkb2MuY3BwCkBAIC02LDYgKzYsOCBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZmRvYy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCIKIAogc3RhdGljIGludCB0aGlzX21vZHVsZSA9IDA7CiAKQEAgLTMzLDcgKzM1LDcgQEAKIAlpZiAoZG9jdW1lbnQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAJaWYgKHRpdGxlID09IE5VTEwgfHwgdGl0bGVbMF0gPT0gMCkgcmV0dXJuIE5VTEw7CiAKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CiAJQ1BERl9Cb29rbWFya1RyZWUgdHJlZShwRG9jKTsKIAogCUZYX1NUUlNJWkUgbGVuID0gQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgodGl0bGUpOwpAQCAtNDcsNyArNDksNyBAQAogCWlmIChib29rbWFyayA9PSBOVUxMKSByZXR1cm4gTlVMTDsKIAogCUNQREZfQm9va21hcmsgQm9va21hcmsgPSAoQ1BERl9EaWN0aW9uYXJ5Kilib29rbWFyazsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CiAJQ1BERl9EZXN0IGRlc3QgPSBCb29rbWFyay5HZXREZXN0KHBEb2MpOwogCWlmIChkZXN0ICE9IE5VTEwpIHJldHVybiBkZXN0OwogCkBAIC05MCw3ICs5Miw3IEBACiB7CiAJaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiBOVUxMOwogCWlmIChhY3Rpb24gPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKKwlDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOwogCUNQREZfQWN0aW9uIEFjdGlvbiA9IChDUERGX0RpY3Rpb25hcnkqKWFjdGlvbjsKIAogCXJldHVybiBBY3Rpb24uR2V0RGVzdChwRG9jKTsKQEAgLTEwMSw3ICsxMDMsNyBAQAogewogCWlmIChkb2N1bWVudCA9PSBOVUxMKSByZXR1cm4gMDsKIAlpZiAoYWN0aW9uID09IE5VTEwpIHJldHVybiAwOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CisJQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKIAlDUERGX0FjdGlvbiBBY3Rpb24gPSAoQ1BERl9EaWN0aW9uYXJ5KilhY3Rpb247CiAKIAlDRlhfQnl0ZVN0cmluZyBwYXRoID0gQWN0aW9uLkdldFVSSShwRG9jKTsKQEAgLTExNSw3ICsxMTcsNyBAQAogewogCWlmIChkb2N1bWVudCA9PSBOVUxMKSByZXR1cm4gMDsKIAlpZiAoZGVzdCA9PSBOVUxMKSByZXR1cm4gMDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CiAJQ1BERl9EZXN0IERlc3QgPSAoQ1BERl9BcnJheSopZGVzdDsKIAogCXJldHVybiBEZXN0LkdldFBhZ2VJbmRleChwRG9jKTsKQEAgLTEyOSw3ICsxMzEsOCBAQAogRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpCiB7CiAJaWYgKHBhZ2UgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpIHJldHVybiBOVUxMOwogCiAJLy8gTGluayBsaXN0IGlzIHN0b3JlZCB3aXRoIHRoZSBkb2N1bWVudAogCUNQREZfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CkBAIC0xNDUsNyArMTQ4LDcgQEAKIERMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGTGlua19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfTElOSyBsaW5rKQogewogCWlmIChkb2N1bWVudCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CiAJaWYgKGxpbmsgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAJQ1BERl9MaW5rIExpbmsgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rOwogCkBAIC0xNzAsNyArMTczLDggQEAKIHsKIAlpZighcGFnZSB8fCAhc3RhcnRQb3MgfHwgIWxpbmtBbm5vdCkKIAkJcmV0dXJuIEZBTFNFOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKwlpZiAoIXBQYWdlKSByZXR1cm4gRkFMU0U7CiAJaWYoIXBQYWdlLT5tX3BGb3JtRGljdCkgcmV0dXJuIEZBTFNFOwogCUNQREZfQXJyYXkqIHBBbm5vdHMgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKIAlpZighcEFubm90cykgcmV0dXJuIEZBTFNFOwpAQCAtMjQwLDcgKzI0NCw3IEBACiB7CiAJaWYgKGRvYyA9PSBOVUxMIHx8IHRhZyA9PSBOVUxMKSByZXR1cm4gMDsKIAotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jOworCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvYyktPkdldFBERkRvYygpOwogCS8vIEdldCBpbmZvIGRpY3Rpb25hcnkKIAlDUERGX0RpY3Rpb25hcnkqIHBJbmZvID0gcERvYy0+R2V0SW5mbygpOwogCWlmIChwSW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcAppbmRleCBjMjlkMmI3Li4xODhiNWYwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRpbWcuY3BwCkBAIC02LDYgKzYsOCBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZmVkaXQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiCiAKIAogRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlT2JqX05ld0ltZ2VPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKQEAgLTEzLDE0ICsxNSwxNCBAQAogCWlmICghZG9jdW1lbnQpCiAJCXJldHVybiBOVUxMOwogCUNQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiA9IEZYX05FVyBDUERGX0ltYWdlT2JqZWN0OwotCUNQREZfSW1hZ2UqIHBJbWcgPSBGWF9ORVcgQ1BERl9JbWFnZSgoQ1BERl9Eb2N1bWVudCAqKWRvY3VtZW50KTsKKwlDUERGX0ltYWdlKiBwSW1nID0gRlhfTkVXIENQREZfSW1hZ2UoKChDUERGWEZBX0RvY3VtZW50ICopZG9jdW1lbnQpLT5HZXRQREZEb2MoKSk7CiAJcEltYWdlT2JqLT5tX3BJbWFnZSA9IHBJbWc7CiAJcmV0dXJuIHBJbWFnZU9iajsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUoRlBERl9QQUdFKiBwYWdlcywgaW50IG5Db3VudCxGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LCBGUERGX0ZJTEVBQ0NFU1MqIGZpbGVBY2Nlc3MpCiB7Ci0JaWYgKCFpbWFnZV9vYmplY3QgfHwgIWZpbGVBY2Nlc3MpCisJaWYgKCFpbWFnZV9vYmplY3QgfHwgIWZpbGVBY2Nlc3MgfHwgIXBhZ2VzKQogCQlyZXR1cm4gRkFMU0U7CiAKIAlJRlhfRmlsZVJlYWQqIHBGaWxlID0gRlhfTkVXIENQREZfQ3VzdG9tQWNjZXNzKGZpbGVBY2Nlc3MpOwpAQCAtMjksNyArMzEsOSBAQAogCXBJbWdPYmotPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwogCWZvciAoaW50IGluZGV4PTA7aW5kZXg8bkNvdW50O2luZGV4KyspCiAJewotCQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZXNbaW5kZXhdOyAKKwkJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlc1tpbmRleF0pLT5HZXRQREZQYWdlKCk7IAorCQlpZiAoIXBQYWdlKQorCQkJY29udGludWU7CiAJCXBJbWdPYmotPm1fcEltYWdlLT5SZXNldENhY2hlKHBQYWdlLE5VTEwpOwogCX0KIAlwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SnBlZ0ltYWdlKHBGaWxlKTsKQEAgLTU2LDcgKzYwLDcgQEAKIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRCaXRtYXAoRlBERl9QQUdFKiBwYWdlcyxpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsRlBERl9CSVRNQVAgYml0bWFwKQogewotCWlmICghaW1hZ2Vfb2JqZWN0IHx8ICFiaXRtYXApCisJaWYgKCFpbWFnZV9vYmplY3QgfHwgIWJpdG1hcCB8fCAhcGFnZXMpCiAJCXJldHVybiBGQUxTRTsKIAlDRlhfRElCaXRtYXAqIHBCbXAgPSBOVUxMOwogCXBCbXAgPSAoQ0ZYX0RJQml0bWFwKiliaXRtYXA7CkBAIC02NCw3ICs2OCw4IEBACiAJcEltZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCk7CiAJZm9yIChpbnQgaW5kZXg9MDtpbmRleDxuQ291bnQ7aW5kZXgrKykKIAl7Ci0JCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlc1tpbmRleF07IAorCQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2VzW2luZGV4XSktPkdldFBERlBhZ2UoKTsKKwkJaWYgKCFwUGFnZSkgY29udGludWU7CiAJCXBJbWdPYmotPm1fcEltYWdlLT5SZXNldENhY2hlKHBQYWdlLE5VTEwpOwogCX0KIAlwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SW1hZ2UocEJtcCxGQUxTRSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcAppbmRleCA1YzQzZDRkLi42OGRhZDlkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKQEAgLTcsNiArNywxMCBAQAogLy8gI2luY2x1ZGUgIng6L3BkZi9mcGRmYXBpNS9pbmNsdWRlL2ZwZGZhcGkuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmZWRpdC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZmZvcm1maWxsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgogCiAKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwpAQCAtNTEsMTIgKzU1LDE1IEBACiAjZW5kaWYKIAl9CiAKLQlyZXR1cm4gcERvYzsKKwlDUERGWEZBX0FwcCogcEFwcCA9IEZQREZYRkFfR2V0QXBwKCk7CisJQ1BERlhGQV9Eb2N1bWVudCogZG9jdW1lbnQgPSBGWF9ORVcgQ1BERlhGQV9Eb2N1bWVudChwRG9jLCBwQXBwKTsKKworCXJldHVybiBkb2N1bWVudDsKIH0KIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9EZWxldGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgpCiB7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKKwlDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOwogCWlmIChwRG9jID09IE5VTEwpIAogCQlyZXR1cm47CiAJaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gcERvYy0+R2V0UGFnZUNvdW50KCkpIApAQCAtNzEsNyArNzgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogLy8JQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKWRvY3VtZW50OwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CisJQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKIAlpZihwYWdlX2luZGV4IDwgMCkKIAkJcGFnZV9pbmRleCA9IDA7CiAJaWYocERvYy0+R2V0UGFnZUNvdW50KCk8cGFnZV9pbmRleCkKQEAgLTkyLDE2ICs5OSwxOSBAQAogCXBQYWdlRGljdC0+U2V0QXQoIlJvdGF0ZSIsIEZYX05FVyBDUERGX051bWJlcigwKSk7CiAJcFBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgRlhfTkVXIENQREZfRGljdGlvbmFyeSk7CiAKLQlDUERGX1BhZ2UqIHBQYWdlID0gRlhfTkVXIENQREZfUGFnZTsKLQlwUGFnZS0+TG9hZChwRG9jLHBQYWdlRGljdCk7Ci0JcFBhZ2UtPlBhcnNlQ29udGVudCgpOworLy8gCUNQREZfUGFnZSogcFBhZ2UgPSBGWF9ORVcgQ1BERl9QYWdlOworLy8gCXBQYWdlLT5Mb2FkKHBEb2MscFBhZ2VEaWN0KTsKKy8vIAlwUGFnZS0+UGFyc2VDb250ZW50KCk7CisKKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gRlhfTkVXIENQREZYRkFfUGFnZSgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQsIHBhZ2VfaW5kZXgpOworCXBQYWdlLT5Mb2FkUERGUGFnZShwUGFnZURpY3QpOwogCiAJcmV0dXJuIHBQYWdlOwogfQogCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpCiB7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwogCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKIAkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCiAJewpAQCAtMTQzLDcgKzE1Myw3IEBACiAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KEZQREZfUEFHRSBwYWdlLCBGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmopCiB7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwogCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKIAkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCiAJewpAQCAtMTk4LDcgKzIwOCw3IEBACiAKIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Db3VudE9iamVjdChGUERGX1BBR0UgcGFnZSkKIHsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CiAJaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPktleUV4aXN0KCJUeXBlIikgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKQogCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKIAl7CkBAIC0yMTAsNyArMjIwLDcgQEAKIAogRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KQogewotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKIAlpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKQogCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKIAl7CkBAIC0yMjMsNyArMjMzLDggQEAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFIHBhZ2UpCiB7CiAJaWYoIXBhZ2UpIHJldHVybiBGQUxTRTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisJaWYgKCFwUGFnZSkgcmV0dXJuIEZBTFNFOwogCiAJcmV0dXJuIHBQYWdlLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKTsKIH0KQEAgLTI2Miw3ICsyNzMsNyBAQAogCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KEZQREZfUEFHRSBwYWdlKQogewotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKIAlpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpCiAJCXx8IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgiUGFnZSIpKQogCXsKQEAgLTI4OSw3ICszMDAsOCBAQAogewogCWlmKHBhZ2UgPT0gTlVMTCkKIAkJcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKwlpZiAoIXBQYWdlKSByZXR1cm47CiAJQ1BERl9Bbm5vdExpc3QgQW5ub3RMaXN0KHBQYWdlKTsKIAlmb3IgKGludCBpPTA7IGk8QW5ub3RMaXN0LkNvdW50KCk7aSsrKQogCXsKQEAgLTMxNyw3ICszMjksMTEgQEAKIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSwgaW50IHJvdGF0ZSkKIHsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlpZiAocGFnZSA9PSBOVUxMKQorCQlyZXR1cm47CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpIHJldHVybjsKKwogCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKIAkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCiAJewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAKaW5kZXggMmRlNzYwMy4uMzhhNzFmYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwCkBAIC03LDcgKzcsMTAgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmZm9ybWZpbGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKIAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCkBAIC0xNyw2MCArMjAsMTA5IEBACiB7CiAJaWYoIXBhZ2UgfHwgIWhIYW5kbGUpCiAJCXJldHVybiAtMTsKLQlDUERGX1BhZ2UgKiBwUGFnZSA9IChDUERGX1BhZ2UqKSBwYWdlOworCUNQREZfUGFnZSAqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKSBwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmIChwUGFnZSkKKwl7CisJCUNQREZfSW50ZXJGb3JtICogcEludGVyRm9ybSA9IE5VTEw7CisJCXBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocFBhZ2UtPm1fcERvY3VtZW50LEZBTFNFKTsKKwkJaWYgKCFwSW50ZXJGb3JtKQorCQkJcmV0dXJuIC0xOworCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwSW50ZXJGb3JtLT5HZXRDb250cm9sQXRQb2ludChwUGFnZSwgKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CisJCWlmKCFwRm9ybUN0cmwpCisJCXsKKwkJCWRlbGV0ZSBwSW50ZXJGb3JtOworCQkJcmV0dXJuIC0xOworCQl9CisJCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEZvcm1DdHJsLT5HZXRGaWVsZCgpOworCQlpZighcEZvcm1GaWVsZCkKKwkJeworCQkJZGVsZXRlIHBJbnRlckZvcm07CisJCQlyZXR1cm4gLTE7CisJCX0KIAotCUNQREZfSW50ZXJGb3JtICogcEludGVyRm9ybSA9IE5VTEw7Ci0JcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShwUGFnZS0+bV9wRG9jdW1lbnQsRkFMU0UpOwotCWlmICghcEludGVyRm9ybSkKLQkJcmV0dXJuIC0xOwotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBJbnRlckZvcm0tPkdldENvbnRyb2xBdFBvaW50KHBQYWdlLCAoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKLQlpZighcEZvcm1DdHJsKQotCXsKKwkJaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CiAJCWRlbGV0ZSBwSW50ZXJGb3JtOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBuVHlwZTsKIAl9Ci0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwRm9ybUN0cmwtPkdldEZpZWxkKCk7Ci0JaWYoIXBGb3JtRmllbGQpCisKKwlJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFhGQVBhZ2VWaWV3KCk7CisJaWYgKHBQYWdlVmlldykgCiAJewotCQlkZWxldGUgcEludGVyRm9ybTsKLQkJcmV0dXJuIC0xOworCQlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gTlVMTDsKKwkJSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOworCQlpZiAoIXBEb2NWaWV3KQorCQkJcmV0dXJuIC0xOworCisJCXBXaWRnZXRIYW5kbGVyID0gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKwkJaWYgKCFwV2lkZ2V0SGFuZGxlcikKKwkJCXJldHVybiAtMTsKKworCQlYRkFfSFdJREdFVCBwWEZBQW5ub3QgPSBOVUxMOworCQlJWEZBX1dpZGdldEl0ZXJhdG9yKiBwV2lkZ2V0SXRlcmF0b3IgPSBwUGFnZVZpZXctPkNyZWF0ZVdpZGdldEl0ZXJhdG9yKFhGQV9UUkFWRVJTRVdBWV9Gb3JtLCBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlfFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSk7CisJCWlmICghcFdpZGdldEl0ZXJhdG9yKQorCQkJcmV0dXJuIC0xOworCQlwWEZBQW5ub3QgPSBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKwkJd2hpbGUgKHBYRkFBbm5vdCkgeworCQkJQ0ZYX1JlY3RGIHJjQkJveDsKKwkJCXBXaWRnZXRIYW5kbGVyLT5HZXRCQm94IChwWEZBQW5ub3QsIHJjQkJveCwgMCk7CisJCQlDRlhfRmxvYXRSZWN0IHJjV2lkZ2V0KHJjQkJveC5sZWZ0LCByY0JCb3gudG9wLCByY0JCb3gubGVmdCArIHJjQkJveC53aWR0aCwgcmNCQm94LnRvcCtyY0JCb3guaGVpZ2h0KTsKKwkJCXJjV2lkZ2V0LmxlZnQgLT0gMS4wZjsKKwkJCXJjV2lkZ2V0LnJpZ2h0ICs9IDEuMGY7CisJCQlyY1dpZGdldC5ib3R0b20gLT0gMS4wZjsKKwkJCXJjV2lkZ2V0LnRvcCArPSAxLjBmOworCisJCQlpZiAocmNXaWRnZXQuQ29udGFpbnMocGFnZV94LCBwYWdlX3kpKSB7CisJCQkJcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7CisJCQkJcmV0dXJuIEZQREZfRk9STUZJRUxEX1hGQTsKKwkJCX0KKwkJCXBYRkFBbm5vdCA9IHBXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworCQl9CisKKwkJcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7CiAJfQogCQotCWludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotCWRlbGV0ZSBwSW50ZXJGb3JtOwotCXJldHVybiBuVHlwZTsKKwlyZXR1cm4gLTE7CiB9CiAKIERMTEVYUE9SVCBGUERGX0ZPUk1IQU5ETEUgU1REQ0FMTCBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb3VtZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfRk9STUZJTExJTkZPKiBmb3JtSW5mbykKIHsKIAlpZighZG9jdW1lbnQgfHwgIWZvcm1JbmZvIHx8IGZvcm1JbmZvLT52ZXJzaW9uIT0xKQogCQlyZXR1cm4gTlVMTDsKLQlDUERGX0RvY3VtZW50ICogcERvY3VtZW50ID0gKENQREZfRG9jdW1lbnQqKSBkb2N1bWVudDsKKwlDUERGWEZBX0RvY3VtZW50ICogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKSBkb2N1bWVudDsKICAJQ1BERkRvY19FbnZpcm9ubWVudCAqIHBFbnYgPSBOVUxMOwogCXBFbnYgPSBuZXcgQ1BERkRvY19FbnZpcm9ubWVudChwRG9jdW1lbnQpOwogCWlmICghcEVudikKIAkJcmV0dXJuIE5VTEw7CiAJcEVudi0+UmVnQXBwSGFuZGxlKGZvcm1JbmZvKTsKIAotCWlmKHBFbnYtPkdldFBERkRvY3VtZW50KCkpCisJQ1BERlhGQV9BcHAqIHBBcHAgPSBGUERGWEZBX0dldEFwcCgpOworCXBBcHAtPkFkZEZvcm1GaWxsRW52KHBFbnYpOworCisJaWYocEVudi0+R2V0UERGWEZBRG9jdW1lbnQoKSkKIAl7Ci0JCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBuZXcgQ1BERlNES19Eb2N1bWVudChwRW52LT5HZXRQREZEb2N1bWVudCgpLCBwRW52KTsKLQkJaWYocFNES0RvYykKKwkJLy9DUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbmV3IENQREZTREtfRG9jdW1lbnQocEVudi0+R2V0UERGWEZBRG9jdW1lbnQoKSwgcEVudik7CisJCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwRG9jdW1lbnQtPkdldFNES0RvY3VtZW50KHBFbnYpOworCQlpZihwU0RLRG9jKSB7CiAJCQlwRW52LT5TZXRDdXJyZW50RG9jKHBTREtEb2MpOworCQl9CiAJfQogCXJldHVybiBwRW52OwogfQogCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvdW1lbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpCiB7Ci0JaWYoIWhIYW5kbGUpCisJaWYgKCFoSGFuZGxlKQogCQlyZXR1cm47IAotCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYocFNES0RvYykKLQl7Ci0JCSgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPlNldEN1cnJlbnREb2MoTlVMTCk7Ci0JCWRlbGV0ZSBwU0RLRG9jOwotCX0KKwkvL0NQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7CisJLy9pZihwU0RLRG9jKQorCS8veworCQkvLygoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPlNldEN1cnJlbnREb2MoTlVMTCk7CisJCS8vQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldFBERlhGQURvY3VtZW50KCk7CisJCS8vaWYgKHBEb2MpCisJCS8vCXBEb2MtPlJlbGVhc2VTREtEb2MoKTsKKwkvL30KKwlDUERGWEZBX0FwcCogcEFwcCA9IEZQREZYRkFfR2V0QXBwKCk7CisJcEFwcC0+UmVtb3ZlRm9ybUZpbGxFbnYoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpOwogCWRlbGV0ZSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKIAloSGFuZGxlID0gTlVMTDsKIH0KQEAgLTg1LDcgKzEzNyw3IEBACiAJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKCFwRlhEb2MpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CiAJaWYoIXBQYWdlVmlldykKIAkJcmV0dXJuIEZBTFNFOwogCQpAQCAtMTAzLDcgKzE1NSw3IEBACiAJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKCFwRlhEb2MpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CiAJaWYoIXBQYWdlVmlldykKIAkJcmV0dXJuIEZBTFNFOwogLy8gCWRvdWJsZSBwYWdlX3ggPSAwOwpAQCAtMTIwLDcgKzE3Miw3IEBACiAJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKCFwRlhEb2MpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CiAJaWYoIXBQYWdlVmlldykKIAkJcmV0dXJuIEZBTFNFOwogLy8gCWRvdWJsZSBwYWdlX3ggPSAwOwpAQCAtMTMwLDYgKzE4MiwzOCBAQAogCXJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvblVwKHB0LCBtb2RpZmllcik7CiB9CiAKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpCit7CisJaWYgKCFoSGFuZGxlIHx8ICFwYWdlKQorCQlyZXR1cm4gRkFMU0U7CisKKwlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7CisJaWYoIXBGWERvYykKKwkJcmV0dXJuIEZBTFNFOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CisJaWYoIXBQYWdlVmlldykKKwkJcmV0dXJuIEZBTFNFOworCisJQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKKwlyZXR1cm4gcFBhZ2VWaWV3LT5PblJCdXR0b25Eb3duKHB0LCBtb2RpZmllcik7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KQoreworCWlmICghaEhhbmRsZSB8fCAhcGFnZSkKKwkJcmV0dXJuIEZBTFNFOworCisJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOworCWlmKCFwRlhEb2MpCisJCXJldHVybiBGQUxTRTsKKwlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGWEZBX1BhZ2UqKXBhZ2UpOworCWlmKCFwUGFnZVZpZXcpCisJCXJldHVybiBGQUxTRTsKKworCUNQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CisJcmV0dXJuIHBQYWdlVmlldy0+T25SQnV0dG9uVXAocHQsIG1vZGlmaWVyKTsKK30KKwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlEb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG5LZXlDb2RlLCBpbnQgbW9kaWZpZXIpCiB7CiAJaWYgKCFoSGFuZGxlIHx8ICFwYWdlKQpAQCAtMTM3LDcgKzIyMSw3IEBACiAJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKCFwRlhEb2MpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CiAJaWYoIXBQYWdlVmlldykKIAkJcmV0dXJuIEZBTFNFOwogCQpAQCAtMTUyLDcgKzIzNiw3IEBACiAJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKCFwRlhEb2MpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CiAJaWYoIXBQYWdlVmlldykKIAkJcmV0dXJuIEZBTFNFOwogCQpAQCAtMTY4LDcgKzI1Miw3IEBACiAJQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKCFwRlhEb2MpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSk7CiAJaWYoIXBQYWdlVmlldykKIAkJcmV0dXJuIEZBTFNFOwogCXJldHVybiBwUGFnZVZpZXctPk9uQ2hhcihuQ2hhciwgbW9kaWZpZXIpOwpAQCAtMTkxLDI3ICsyNzUsMTkgQEAKIHsKIAlpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCiAJCXJldHVybiA7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CiAJCi0JQ1BERl9SZW5kZXJPcHRpb25zIG9wdGlvbnM7Ci0JaWYgKGZsYWdzICYgRlBERl9MQ0RfVEVYVCkKLQkJb3B0aW9ucy5tX0ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7Ci0JZWxzZQotCQlvcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9DTEVBUlRZUEU7Ci0JCi0JLy9HcmF5c2NhbGUgb3V0cHV0Ci0JaWYgKGZsYWdzICYgRlBERl9HUkFZU0NBTEUpCi0JewotCQlvcHRpb25zLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7Ci0JCW9wdGlvbnMubV9Gb3JlQ29sb3IgPSAwOwotCQlvcHRpb25zLm1fQmFja0NvbG9yID0gMHhmZmZmZmY7Ci0JfQotCQotCW9wdGlvbnMubV9BZGRGbGFncyA9IGZsYWdzID4+IDg7CisJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7CisJQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPkdldERvY3VtZW50KCk7CisJaWYgKCFwRG9jdW1lbnQpCisJCXJldHVybjsKKwlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvY3VtZW50LT5HZXRQREZEb2MoKTsKKwlpZiAoIXBQREZEb2MpCisJCXJldHVybjsKIAotCW9wdGlvbnMubV9wT0NDb250ZXh0ID0gRlhfTkVXIENQREZfT0NDb250ZXh0KHBQYWdlLT5tX3BEb2N1bWVudCk7Ci0KLQkvL0ZYTVRfQ1NMT0NLX09CSigmcFBhZ2UtPm1fUGFnZUxvY2spOworCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKKwlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSBwRW52LT5HZXRDdXJyZW50RG9jKCk7CisJaWYgKCFwRlhEb2MpCisJCXJldHVybjsKIAkKIAlDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKIAlwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtYXRyaXgsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOyAKQEAgLTIzNSwzMSArMzExLDI2IEBACiAJcERldmljZS0+U2F2ZVN0YXRlKCk7CiAJcERldmljZS0+U2V0Q2xpcF9SZWN0KCZjbGlwKTsKIAkKKwlDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKKwlpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQorCQlvcHRpb25zLm1fRmxhZ3MgfD0gUkVOREVSX0NMRUFSVFlQRTsKKwllbHNlCisJCW9wdGlvbnMubV9GbGFncyAmPSB+UkVOREVSX0NMRUFSVFlQRTsKIAotCUNQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBOVUxMOwotCXBDb250ZXh0ID0gRlhfTkVXIENQREZfUmVuZGVyQ29udGV4dDsKLQlpZiAoIXBDb250ZXh0KQorCS8vR3JheXNjYWxlIG91dHB1dAorCWlmIChmbGFncyAmIEZQREZfR1JBWVNDQUxFKQogCXsKLQkJZGVsZXRlIHBEZXZpY2U7Ci0JCXBEZXZpY2UgPSBOVUxMOwotCQlyZXR1cm47CisJCW9wdGlvbnMubV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfR1JBWTsKKwkJb3B0aW9ucy5tX0ZvcmVDb2xvciA9IDA7CisJCW9wdGlvbnMubV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKIAl9CisJb3B0aW9ucy5tX0FkZEZsYWdzID0gZmxhZ3MgPj4gODsKIAorCW9wdGlvbnMubV9wT0NDb250ZXh0ID0gRlhfTkVXIENQREZfT0NDb250ZXh0KHBQREZEb2MpOwogCi0vLwlDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OwotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSBwRW52LT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYoIXBGWERvYykKKwlpZihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGWEZBX1BhZ2UqKXBhZ2UpKQogCXsKLQkJZGVsZXRlIHBDb250ZXh0OwotCQlkZWxldGUgcERldmljZTsKLQkJcENvbnRleHQgPSBOVUxMOwotCQlwRGV2aWNlID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQlpZihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KHBQYWdlKSkKLQl7Ci0JCXBQYWdlVmlldy0+UGFnZVZpZXdfT25EcmF3KHBEZXZpY2UsICZtYXRyaXgsICZvcHRpb25zKTsKKwkJcFBhZ2VWaWV3LT5QYWdlVmlld19PbkRyYXcocERldmljZSwgJm1hdHJpeCwgJm9wdGlvbnMsICZjbGlwKTsKIAl9CiAJcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiAKQEAgLTI2OCwxMSArMzM5LDYgQEAKIAkJZGVsZXRlIG9wdGlvbnMubV9wT0NDb250ZXh0OwogCQlvcHRpb25zLm1fcE9DQ29udGV4dCA9IE5VTEw7CiAJfQotCWlmKHBDb250ZXh0KQotCXsKLQkJZGVsZXRlIHBDb250ZXh0OwotCQlwQ29udGV4dCA9IE5VTEw7Ci0JfQogCWlmKHBEZXZpY2UpCiAJewogCQlkZWxldGUgcERldmljZTsKQEAgLTI4MCw2ICszNDYsMjM1IEBACiAJfQogCiB9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1VuZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCkKK3sKKwlpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisJCXJldHVybjsKKwkKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CQorCisJaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorCQlyZXR1cm47CisKKwlJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9IEZQREZYRkFfR2V0QXBwKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworCisJaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisJCXJldHVybjsKKworCXBYRkFNZW51SGFuZGVyLT5VbmRvKChYRkFfSFdJREdFVCloV2lkZ2V0KTsKKworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpCit7CisJaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorCQlyZXR1cm47CisJCisJQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwkKKwlpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisJCXJldHVybjsKKworCUlYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gRlBERlhGQV9HZXRBcHAoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisKKwlpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcFhGQU1lbnVIYW5kZXItPlJlZG8oKFhGQV9IV0lER0VUKWhXaWRnZXQpOworfQorCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1NlbGVjdEFsbChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KQoreworCWlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKwkJcmV0dXJuOworCQorCUNQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsJCisJaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorCQlyZXR1cm47CisKKwlJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9IEZQREZYRkFfR2V0QXBwKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworCisJaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisJCXJldHVybjsKKworCXBYRkFNZW51SGFuZGVyLT5TZWxlY3RBbGwoKFhGQV9IV0lER0VUKWhXaWRnZXQpOworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9Db3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpCit7CisJaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorCQlyZXR1cm47CisJCisJQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwkKKwlpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisJCXJldHVybjsKKworCUlYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gRlBERlhGQV9HZXRBcHAoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisKKwlpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ0ZYX1dpZGVTdHJpbmcgd3NDcFRleHQ7CisJcFhGQU1lbnVIYW5kZXItPkNvcHkoKFhGQV9IV0lER0VUKWhXaWRnZXQsIHdzQ3BUZXh0KTsKKworCUNGWF9CeXRlU3RyaW5nIGJzQ3BUZXh0ID0gd3NDcFRleHQuVVRGMTZMRV9FbmNvZGUoKTsKKworCWludCBsZW4gPSBic0NwVGV4dC5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOworCQorCWlmICh3c1RleHQgPT0gTlVMTCkgeworCQkqc2l6ZSA9IGxlbjsKKwkJcmV0dXJuOworCX0KKworCWludCByZWFsX3NpemUgPSBsZW4gPCAqc2l6ZSA/IGxlbiA6ICpzaXplOworCWlmIChyZWFsX3NpemUgPiAwKQorCXsKKwkJRlhTWVNfbWVtY3B5KCh2b2lkKil3c1RleHQsYnNDcFRleHQuR2V0QnVmZmVyKHJlYWxfc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKSxyZWFsX3NpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJCWJzQ3BUZXh0LlJlbGVhc2VCdWZmZXIocmVhbF9zaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCX0KKwkqc2l6ZSA9IHJlYWxfc2l6ZTsKK30KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpCit7CisJaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorCQlyZXR1cm47CisJCisJQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwkKKwlpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisJCXJldHVybjsKKworCUlYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gRlBERlhGQV9HZXRBcHAoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisKKwlpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ0ZYX1dpZGVTdHJpbmcgd3NDcFRleHQ7CisJcFhGQU1lbnVIYW5kZXItPkN1dCgoWEZBX0hXSURHRVQpaFdpZGdldCwgd3NDcFRleHQpOworCisJQ0ZYX0J5dGVTdHJpbmcgYnNDcFRleHQgPSB3c0NwVGV4dC5VVEYxNkxFX0VuY29kZSgpOworCisJaW50IGxlbiA9IGJzQ3BUZXh0LkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJCisJaWYgKHdzVGV4dCA9PSBOVUxMKSB7CisJCSpzaXplID0gbGVuOworCQlyZXR1cm47CisJfQorCisJaW50IHJlYWxfc2l6ZSA9IGxlbiA8ICpzaXplID8gbGVuIDogKnNpemU7CisJaWYgKHJlYWxfc2l6ZSA+IDApCisJeworCQlGWFNZU19tZW1jcHkoKHZvaWQqKXdzVGV4dCxic0NwVGV4dC5HZXRCdWZmZXIocmVhbF9zaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLHJlYWxfc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKwkJYnNDcFRleHQuUmVsZWFzZUJ1ZmZlcihyZWFsX3NpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJfQorCSpzaXplID0gcmVhbF9zaXplOworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9QYXN0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBGUERGX1dJREVTVFJJTkcgd3NUZXh0LCBGUERGX0RXT1JEIHNpemUpCit7CisJaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorCQlyZXR1cm47CisJCisJQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwkKKwlpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisJCXJldHVybjsKKworCUlYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gRlBERlhGQV9HZXRBcHAoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisKKwlpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSh3c1RleHQsIHNpemUpOworCisJcFhGQU1lbnVIYW5kZXItPlBhc3RlKChYRkFfSFdJREdFVCloV2lkZ2V0LCB3c3RyKTsKKworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZXBsYWNlU3BlbGxDaGVja1dvcmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCwgZmxvYXQgeCwgZmxvYXQgeSwgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCkKK3sKKwlpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisJCXJldHVybjsKKwkKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CQorCWlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKwkJcmV0dXJuOworCisJSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPSBGUERGWEZBX0dldEFwcCgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKworCWlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDRlhfUG9pbnRGIHB0UG9wdXA7CisJcHRQb3B1cC54ID0geDsKKwlwdFBvcHVwLnkgPSB5OworCUNGWF9CeXRlU3RyaW5nQyBicyhic1RleHQpOyAKKwlwWEZBTWVudUhhbmRlci0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKChYRkFfSFdJREdFVCloV2lkZ2V0LHB0UG9wdXAsYnMpOworCit9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBmbG9hdCB4LCBmbG9hdCB5LCBGUERGX1NUUklOR0hBTkRMRSogc3RyaW5nSGFuZGxlKQoreworCWlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKwkJcmV0dXJuOworCQorCUNQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsJCisJaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorCQlyZXR1cm47CisKKwlJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9IEZQREZYRkFfR2V0QXBwKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworCisJaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisJCXJldHVybjsKKworCUNGWF9CeXRlU3RyaW5nQXJyYXkqIHNTdWdnZXN0V29yZHMgPSBGWF9ORVcgQ0ZYX0J5dGVTdHJpbmdBcnJheTsKKwlDRlhfUG9pbnRGIHB0UG9wdXA7CisJcHRQb3B1cC54ID0geDsKKwlwdFBvcHVwLnkgPSB5OworCXBYRkFNZW51SGFuZGVyLT5HZXRTdWdnZXN0V29yZHMoKFhGQV9IV0lER0VUKWhXaWRnZXQsIHB0UG9wdXAsICpzU3VnZ2VzdFdvcmRzKTsKKwkqc3RyaW5nSGFuZGxlID0gKEZQREZfU1RSSU5HSEFORExFKXNTdWdnZXN0V29yZHM7Cit9CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9TdHJpbmdIYW5kbGVDb3VudHMoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKQoreworCWlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCUNGWF9CeXRlU3RyaW5nQXJyYXkqIHNTdWdnZXN0V29yZHMgPSAoQ0ZYX0J5dGVTdHJpbmdBcnJheSopc3RyaW5nSGFuZGxlOworCXJldHVybiBzU3VnZ2VzdFdvcmRzLT5HZXRTaXplKCk7Cit9CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TdHJpbmdIYW5kbGVHZXRTdHJpbmdCeUluZGV4KEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSwgaW50IGluZGV4LCBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LCBGUERGX0RXT1JEKiBzaXplKQoreworCWlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCB8fCBzaXplID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKwlpbnQgY291bnQgPSBGUERGX1N0cmluZ0hhbmRsZUNvdW50cyhzdHJpbmdIYW5kbGUpOworCWlmIChpbmRleCA8IDB8fCBpbmRleCA+PSBjb3VudCkKKwkJcmV0dXJuIEZBTFNFOworCisJQ0ZYX0J5dGVTdHJpbmdBcnJheSBzU3VnZ2VzdFdvcmRzID0gKihDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7CisJaW50IGxlbiA9IHNTdWdnZXN0V29yZHNbaW5kZXhdLkdldExlbmd0aCgpOworCisJaWYgKGJzVGV4dCA9PSBOVUxMKSB7CisJCSpzaXplID0gbGVuOworCQlyZXR1cm4gVFJVRTsKKwl9CisJCisJaW50IHJlYWxfc2l6ZSA9IGxlbiA8ICpzaXplID8gbGVuIDogKnNpemU7CisJaWYgKHJlYWxfc2l6ZSA+IDApCisJCUZYU1lTX21lbWNweSgodm9pZCopYnNUZXh0LCAoRlhfTFBDU1RSKShzU3VnZ2VzdFdvcmRzW2luZGV4XSksIHJlYWxfc2l6ZSk7CisJKnNpemUgPSByZWFsX3NpemU7CisKKwlyZXR1cm4gVFJVRTsKK30KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TdHJpbmdIYW5kbGVSZWxlYXNlKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSkKK3sKKwlpZiAoc3RyaW5nSGFuZGxlID09IE5VTEwpCisJCXJldHVybjsKKwlDRlhfQnl0ZVN0cmluZ0FycmF5KiBzU3VnZ2VzdFdvcmRzID0gKENGWF9CeXRlU3RyaW5nQXJyYXkqKXN0cmluZ0hhbmRsZTsKKwlkZWxldGUgc1N1Z2dlc3RXb3JkczsKK30KKworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlQWRkU3RyaW5nKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSwgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCwgRlBERl9EV09SRCBzaXplKQoreworCWlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCB8fCBic1RleHQgPT0gTlVMTCB8fCBzaXplIDw9IDApCisJCXJldHVybiBGQUxTRTsKKwkKKwlDRlhfQnl0ZVN0cmluZ0FycmF5KiBzdHJpbmdBcnIgPSAoQ0ZYX0J5dGVTdHJpbmdBcnJheSopc3RyaW5nSGFuZGxlOworCUNGWF9CeXRlU3RyaW5nIGJzU3RyKGJzVGV4dCwgc2l6ZSk7CisKKwlzdHJpbmdBcnItPkFkZChic1N0cik7CisJcmV0dXJuIFRSVUU7Cit9CiAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgaW50IGZpZWxkVHlwZSwgdW5zaWduZWQgbG9uZyBjb2xvcikKIHsKQEAgLTMyOSw3ICs2MjQsNyBAQAogCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7CiAJaWYoIXBTREtEb2MpCiAJCXJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKIAlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgVFJVRSk7CiAJaWYocFBhZ2VWaWV3KQogCXsKQEAgLTM0Miw3ICs2MzcsNyBAQAogCWlmKCFoSGFuZGxlIHx8ICFwYWdlKQogCQlyZXR1cm47CiAJQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKIAlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwogCWlmKHBQYWdlVmlldykKIAl7CkBAIC0zODAsNyArNjc1LDcgQEAKIAlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwogCWlmKHBTREtEb2MpCiAJewotCQlDUERGX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKwkJQ1BERl9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOwogCQlDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBwRG9jLT5HZXRSb290KCk7CiAJCWlmICghcERpYykKIAkJCXJldHVybjsKQEAgLTQwMCw3ICs2OTUsNyBAQAogCWlmKCFoSGFuZGxlIHx8ICFwYWdlKQogCQlyZXR1cm47CiAJQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKIAlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwogCWlmKHBQYWdlVmlldykKIAl7CkBAIC00MTAsNyArNzA1LDkgQEAKIAkJQ1BERlNES19BY3Rpb25IYW5kbGVyICpwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOwogCQlBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7CiAJCQotCQlDUERGX0RpY3Rpb25hcnkgKnBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKwkJaWYgKCFwUGFnZS0+R2V0UERGUGFnZSgpKQorCQkJcmV0dXJuOworCQlDUERGX0RpY3Rpb25hcnkgKnBQYWdlRGljdCA9IHBQYWdlLT5HZXRQREZQYWdlKCktPm1fcEZvcm1EaWN0OwogCQlBU1NFUlQocFBhZ2VEaWN0ICE9IE5VTEwpOwogCQkgCiAJCUNQREZfQUFjdGlvbiBhYSA9IHBQYWdlRGljdC0+R2V0RGljdChGWF9CU1RSQygiQUEiKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCmluZGV4IGE1YzQyNzUuLmVkMGM4NTYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmcHBvLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgogCiBjbGFzcyBDUERGX1BhZ2VPcmdhbml6ZXIKIHsKQEAgLTQyOCw4ICs0MjksOSBAQAogCWlmKGRlc3RfZG9jID09IE5VTEwgfHwgc3JjX2RvYyA9PSBOVUxMICkKIAkJcmV0dXJuIEZBTFNFOwogCUNGWF9Xb3JkQXJyYXkgcGFnZUFycmF5OwotCUNQREZfRG9jdW1lbnQqIHBTcmNEb2MgPSAoQ1BERl9Eb2N1bWVudCopc3JjX2RvYzsKLQlpbnQgbkNvdW50ID0gcFNyY0RvYy0+R2V0UGFnZUNvdW50KCk7CisJQ1BERlhGQV9Eb2N1bWVudCogcFNyY0RvYyA9IChDUERGWEZBX0RvY3VtZW50KilzcmNfZG9jOworCUNQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MgPSBwU3JjRG9jLT5HZXRQREZEb2MoKTsKKwlpbnQgbkNvdW50ID0gcFNyY1BERkRvYy0+R2V0UGFnZUNvdW50KCk7CiAJaWYocGFnZXJhbmdlKQogCXsKIAkJaWYoUGFyc2VyUGFnZVJhbmdlU3RyaW5nKHBhZ2VyYW5nZSwmcGFnZUFycmF5LG5Db3VudCkgPT0gRkFMU0UpCkBAIC00NDMsMTIgKzQ0NSwxMyBAQAogCQl9CiAJfQogCQotCUNQREZfRG9jdW1lbnQqIHBEZXN0RG9jID0gKENQREZfRG9jdW1lbnQqKWRlc3RfZG9jOworCUNQREZYRkFfRG9jdW1lbnQqIHBEZXN0RG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRlc3RfZG9jOworCUNQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jID0gcERlc3REb2MtPkdldFBERkRvYygpOwogCUNQREZfUGFnZU9yZ2FuaXplciBwYWdlT3JnOwogCi0JcGFnZU9yZy5QREZEb2NJbml0KHBEZXN0RG9jLHBTcmNEb2MpOworCXBhZ2VPcmcuUERGRG9jSW5pdChwRGVzdFBERkRvYyxwU3JjUERGRG9jKTsKIAotCWlmKHBhZ2VPcmcuRXhwb3J0UGFnZShwU3JjRG9jLCZwYWdlQXJyYXkscERlc3REb2MsaW5kZXgpKQorCWlmKHBhZ2VPcmcuRXhwb3J0UGFnZShwU3JjUERGRG9jLCZwYWdlQXJyYXkscERlc3RQREZEb2MsaW5kZXgpKQogCQlyZXR1cm4gVFJVRTsKIAlyZXR1cm4gRkFMU0U7CiB9CkBAIC00NTcsMTMgKzQ2MCwxNSBAQAogewogCWlmKHNyY19kb2MgPT0gTlVMTCB8fCBkZXN0X2RvYyA9PSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7Ci0JQ1BERl9Eb2N1bWVudCogcFNyY0RvYyA9IChDUERGX0RvY3VtZW50KilzcmNfZG9jOwotCUNQREZfRGljdGlvbmFyeSogcFNyY0RpY3QgPSBwU3JjRG9jLT5HZXRSb290KCk7Ci0JcFNyY0RpY3QgPSBwU3JjRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7OworCUNQREZYRkFfRG9jdW1lbnQqIHBTcmNEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopc3JjX2RvYzsKKwlDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jID0gcFNyY0RvYy0+R2V0UERGRG9jKCk7CisJQ1BERl9EaWN0aW9uYXJ5KiBwU3JjRGljdCA9IHBTcmNQREZEb2MtPkdldFJvb3QoKTsKKwlwU3JjRGljdCA9IHBTcmNEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKIAlpZighcFNyY0RpY3QpCiAJCXJldHVybiBGQUxTRTsKLQlDUERGX0RvY3VtZW50KiBwRHN0RG9jID0gKENQREZfRG9jdW1lbnQqKWRlc3RfZG9jOwotCUNQREZfRGljdGlvbmFyeSogcERzdERpY3QgPSBwRHN0RG9jLT5HZXRSb290KCk7CisJQ1BERlhGQV9Eb2N1bWVudCogcERzdERvYyA9IChDUERGWEZBX0RvY3VtZW50KilkZXN0X2RvYzsKKwlDUERGX0RvY3VtZW50KiBwRHN0UERGRG9jID0gcERzdERvYy0+R2V0UERGRG9jKCk7CisJQ1BERl9EaWN0aW9uYXJ5KiBwRHN0RGljdCA9IHBEc3RQREZEb2MtPkdldFJvb3QoKTsKIAlpZighcERzdERpY3QpCiAJCXJldHVybiBGQUxTRTsKIAlwRHN0RGljdC0+U2V0QXQoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIiksIHBTcmNEaWN0LT5DbG9uZShUUlVFKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAKaW5kZXggNDVkZmJmNy4uMjI5ZTU4MCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcApAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmc2F2ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZmVkaXQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KICNpbmNsdWRlICJ0aW1lLmgiCiAjZWxzZQpAQCAtNTMsMTEgKzU2LDI1OCBAQAogCQlyZXR1cm4gRkFMU0U7CiB9CiAKLUZQREZfQk9PTCBfRlBERl9Eb2NfU2F2ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSxGUERGX0RXT1JEIGZsYWdzLCBGUERGX0JPT0wgYlNldFZlcnNpb24sCisjZGVmaW5lICBYRkFfREFUQVNFVFMgMAorI2RlZmluZSAgWEZBX0ZPUk1TICAgIDEKKworRlhfQk9PTCBfU2F2ZVhGQURvY3VtZW50RGF0YShDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9QdHJBcnJheSYgZmlsZUxpc3QpCit7CisJaWYgKCFwRG9jdW1lbnQpCisJCXJldHVybiBGQUxTRTsKKwlpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpCisJCXJldHVybiBUUlVFOworCWlmICghRlBERlhGQV9HZXRBcHAoKS0+R2V0WEZBQXBwKCkpCisJCXJldHVybiBUUlVFOworCisJSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0WEZBRG9jVmlldygpOworCWlmIChOVUxMID09IHBYRkFEb2NWaWV3KQorCQlyZXR1cm4gVFJVRTsKKwlJWEZBX0RvY0hhbmRsZXIgKnBYRkFEb2NIYW5kbGVyID0gRlBERlhGQV9HZXRBcHAoKS0+R2V0WEZBQXBwKCktPkdldERvY0hhbmRsZXIoKTsKKwkKKwlDUERGX0RvY3VtZW50ICogcFBERkRvY3VtZW50ID0gcERvY3VtZW50LT5HZXRQREZEb2MoKTsKKwlpZiAocERvY3VtZW50ID09IE5VTEwpIAorCQlyZXR1cm4gRkFMU0U7CisJQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBQREZEb2N1bWVudC0+R2V0Um9vdCgpOworCWlmIChwUm9vdCA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CisJQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKwlpZiAoTlVMTCA9PSBwQWNyb0Zvcm0pCisJCXJldHVybiBGQUxTRTsKKwlDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7CisJaWYgKHBYRkEgPT0gTlVMTCkgCisJCXJldHVybiBUUlVFOworCWlmKHBYRkEtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpCisJCXJldHVybiBGQUxTRTsKKwlDUERGX0FycmF5KiBwQXJyYXkgPSBwWEZBLT5HZXRBcnJheSgpOworCWlmIChOVUxMID09IHBBcnJheSkKKwkJcmV0dXJuIEZBTFNFOworCWludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOworCWludCBpRm9ybUluZGV4ID0gLTE7CisJaW50IGlEYXRhU2V0c0luZGV4ID0gLTE7CisJaW50IGlUZW1wbGF0ZSA9IC0xOworCWludCBpTGFzdCA9IHNpemUgLSAyOworCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykKKwl7CisJCUNQREZfT2JqZWN0KiBwUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOworCQlpZiAocFBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJJTkcpCisJCQljb250aW51ZTsKKwkJaWYgKHBQREZPYmotPkdldFN0cmluZygpID09ICJmb3JtIikKKwkJCWlGb3JtSW5kZXggPSBpKzE7CisJCWVsc2UgaWYgKHBQREZPYmotPkdldFN0cmluZygpID09ICJkYXRhc2V0cyIpCisJCQlpRGF0YVNldHNJbmRleCA9IGkrMTsKKwkJZWxzZSBpZiAocFBERk9iai0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoInRlbXBsYXRlIikpCisJCQlpVGVtcGxhdGUgPSBpICsgMTsKKwl9CisJSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKKyNkZWZpbmUgWEZBX1VTRUNLU1VNCisjaWZkZWYgWEZBX1VTRUNLU1VNCisJLy9DaGVja3N1bQorCXBDb250ZXh0ID0gWEZBX0NoZWNrc3VtX0NyZWF0ZSgpOworCUZYU1lTX2Fzc2VydChwQ29udGV4dCk7CisJcENvbnRleHQtPlN0YXJ0Q2hlY2tzdW0oKTsKKwkJCisJLy90ZW1wbGF0ZQorCWlmIChpVGVtcGxhdGUgPiAtMSkKKwl7CisJCUNQREZfU3RyZWFtICpwVGVtcGxhdGVTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbShpVGVtcGxhdGUpOworCQlDUERGX1N0cmVhbUFjYyBzdHJlYW1BY2M7CisJCXN0cmVhbUFjYy5Mb2FkQWxsRGF0YShwVGVtcGxhdGVTdHJlYW0pOworCQlGWF9MUEJZVEUgcERhdGEgPSAoRlhfTFBCWVRFKXN0cmVhbUFjYy5HZXREYXRhKCk7CisJCUZYX0RXT1JEIGR3U2l6ZTIgPSBzdHJlYW1BY2MuR2V0U2l6ZSgpOworCQlJRlhfRmlsZVN0cmVhbSAqcFRlbXBsYXRlID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBEYXRhLCBkd1NpemUyKTsKKwkJcENvbnRleHQtPlVwZGF0ZUNoZWNrc3VtKChJRlhfRmlsZVJlYWQqKXBUZW1wbGF0ZSk7CisJCXBUZW1wbGF0ZS0+UmVsZWFzZSgpOworCX0KKyNlbmRpZgorCUNQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSA9IE5VTEw7CisJQ1BERl9TdHJlYW0qIHBEYXRhU2V0c1N0cmVhbSA9IE5VTEw7CisJaWYgKGlGb3JtSW5kZXggIT0gLTEpCisJewkKKwkJLy9HZXQgZm9ybSBDUERGX1N0cmVhbQorCQlDUERGX09iamVjdCogcEZvcm1QREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaUZvcm1JbmRleCk7CisJCWlmIChwRm9ybVBERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCisJCXsJCQkgCisJCQlDUERGX1JlZmVyZW5jZSogcEZvcm1SZWZPYmogPSAoQ1BERl9SZWZlcmVuY2UqKXBGb3JtUERGT2JqOworCQkJQ1BERl9PYmplY3QqIHBGb3JtRGlyY2V0T2JqID0gcEZvcm1QREZPYmotPkdldERpcmVjdCgpOworCQkJaWYgKE5VTEwgIT0gcEZvcm1EaXJjZXRPYmogJiYgcEZvcm1EaXJjZXRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKQorCQkJeworCQkJCXBGb3JtU3RyZWFtID0gKENQREZfU3RyZWFtKilwRm9ybURpcmNldE9iajsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChwRm9ybVBERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pCisJCXsKKwkJCXBGb3JtU3RyZWFtID0gKENQREZfU3RyZWFtKilwRm9ybVBERk9iajsKKwkJfQorCX0KKwkKKwlpZiAoaURhdGFTZXRzSW5kZXggIT0gLTEpCisJeworCQkvL0dldCBkYXRhc2V0cyBDUERGX1N0cmVhbQorCQlDUERGX09iamVjdCogcERhdGFTZXRzUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGlEYXRhU2V0c0luZGV4KTsKKwkJaWYgKHBEYXRhU2V0c1BERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCisJCXsJCQkgCisJCQlDUERGX1JlZmVyZW5jZSogcERhdGFTZXRzUmVmT2JqID0gKENQREZfUmVmZXJlbmNlKilwRGF0YVNldHNQREZPYmo7CisJCQlDUERGX09iamVjdCogcERhdGFTZXRzRGlyY2V0T2JqID0gcERhdGFTZXRzUmVmT2JqLT5HZXREaXJlY3QoKTsKKwkJCWlmIChOVUxMICE9IHBEYXRhU2V0c0RpcmNldE9iaiAmJiBwRGF0YVNldHNEaXJjZXRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKQorCQkJeworCQkJCXBEYXRhU2V0c1N0cmVhbSA9IChDUERGX1N0cmVhbSopcERhdGFTZXRzRGlyY2V0T2JqOworCQkJfQorCQl9CisJCWVsc2UgaWYgKHBEYXRhU2V0c1BERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pCisJCXsKKwkJCXBEYXRhU2V0c1N0cmVhbSA9IChDUERGX1N0cmVhbSopcERhdGFTZXRzUERGT2JqOworCQl9CisJfSAKKwkvL2VuZAorCS8vTCJkYXRhc2V0cyIKKwl7CisJCUlGWF9GaWxlU3RyZWFtKiBwRHNmaWxlV3JpdGUgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKTsKKwkJaWYgKCBOVUxMID09IHBEc2ZpbGVXcml0ZSApCisJCXsKKwkJCXBDb250ZXh0LT5SZWxlYXNlKCk7CisJCQlwRHNmaWxlV3JpdGUtPlJlbGVhc2UoKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAocFhGQURvY0hhbmRsZXItPlNhdmVQYWNrYWdlKHBYRkFEb2NWaWV3LT5HZXREb2MoKSwgQ0ZYX1dpZGVTdHJpbmdDKEwiZGF0YXNldHMiKSwgcERzZmlsZVdyaXRlKSAmJiBwRHNmaWxlV3JpdGUtPkdldFNpemUoKT4wKQorCQl7CisjaWZkZWYgWEZBX1VTRUNLU1VNCisJCS8vRGF0YXNldHMKKwkJcENvbnRleHQtPlVwZGF0ZUNoZWNrc3VtKChJRlhfRmlsZVJlYWQqKXBEc2ZpbGVXcml0ZSk7CisJCXBDb250ZXh0LT5GaW5pc2hDaGVja3N1bSgpOworI2VuZGlmCisJCQlDUERGX0RpY3Rpb25hcnkqIHBEYXRhRGljdCA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnk7CisJCQlpZiAoaURhdGFTZXRzSW5kZXggIT0gLTEpCisJCQl7CisJCQkJaWYgKHBEYXRhU2V0c1N0cmVhbSkKKwkJCQkJcERhdGFTZXRzU3RyZWFtLT5Jbml0U3RyZWFtKHBEc2ZpbGVXcml0ZSwgcERhdGFEaWN0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlDUERGX1N0cmVhbSogcERhdGEgPSBGWF9ORVcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7CisJCQkJcERhdGEtPkluaXRTdHJlYW0ocERzZmlsZVdyaXRlLCBwRGF0YURpY3QpOworCQkJCUZYX0RXT1JEIEFwcFN0cmVhbW9iam51bSA9IHBQREZEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocERhdGEpOworCQkJCUNQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKilwUERGRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KEFwcFN0cmVhbW9iam51bSk7CisJCQkJeworCQkJCQlpTGFzdCA9IHBBcnJheS0+R2V0Q291bnQoKSAtMjsKKwkJCQkJcEFycmF5LT5JbnNlcnRBdChpTGFzdCxDUERGX1N0cmluZzo6Q3JlYXRlKCJkYXRhc2V0cyIpKTsKKwkJCQkJcEFycmF5LT5JbnNlcnRBdChpTGFzdCsxLCBwRGF0YSwgcFBERkRvY3VtZW50KTsKKwkJCQl9CisJCQl9CisJCQlmaWxlTGlzdC5BZGQocERzZmlsZVdyaXRlKTsKKwkJfQorCX0KKyAKKworCS8vTCJmb3JtIgorCXsKKwkKKwkJSUZYX0ZpbGVTdHJlYW0qIHBmaWxlV3JpdGUgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKTsKKwkJaWYgKE5VTEwgPT0gcGZpbGVXcml0ZSkKKwkJeworCQkJcENvbnRleHQtPlJlbGVhc2UoKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZihwWEZBRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UocFhGQURvY1ZpZXctPkdldERvYygpLCBDRlhfV2lkZVN0cmluZ0MoTCJmb3JtIiksIHBmaWxlV3JpdGUsIHBDb250ZXh0KSAmJiBwZmlsZVdyaXRlID4gMCkKKwkJeworCQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGF0YURpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OworCQkJaWYgKGlGb3JtSW5kZXggIT0gLTEpCisJCQl7CisJCQkJaWYgKHBGb3JtU3RyZWFtKQorCQkJCQlwRm9ybVN0cmVhbS0+SW5pdFN0cmVhbShwZmlsZVdyaXRlLCBwRGF0YURpY3QpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUNQREZfU3RyZWFtKiBwRGF0YSA9IEZYX05FVyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKKwkJCQlwRGF0YS0+SW5pdFN0cmVhbShwZmlsZVdyaXRlLCBwRGF0YURpY3QpOworCQkJCUZYX0RXT1JEIEFwcFN0cmVhbW9iam51bSA9IHBQREZEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocERhdGEpOworCQkJCUNQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKilwUERGRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KEFwcFN0cmVhbW9iam51bSk7CisJCQkJeworCQkJCQlpTGFzdCA9IHBBcnJheS0+R2V0Q291bnQoKSAtMjsKKwkJCQkJcEFycmF5LT5JbnNlcnRBdChpTGFzdCwgQ1BERl9TdHJpbmc6OkNyZWF0ZSgiZm9ybSIpKTsKKwkJCQkJcEFycmF5LT5JbnNlcnRBdChpTGFzdCsxLCBwRGF0YSwgcFBERkRvY3VtZW50KTsKKwkJCQl9CisJCQl9CisJCQlmaWxlTGlzdC5BZGQocGZpbGVXcml0ZSk7CisJCX0KKwl9CisJcENvbnRleHQtPlJlbGVhc2UoKTsKKwlyZXR1cm4gVFJVRTsKK30KKworCitGWF9CT09MIF9TZW5kUG9zdFNhdmVUb1hGQURvYyhDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCit7CisJaWYgKCFwRG9jdW1lbnQpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKKwkJcmV0dXJuIFRSVUU7CisJCisJSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0WEZBRG9jVmlldygpOworCWlmIChOVUxMID09IHBYRkFEb2NWaWV3KQorCQlyZXR1cm4gRkFMU0U7CisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGVyID0gIHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisKKwlDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEw7CisJSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogcFdpZGdldEFjY0l0ZXJhdG9yID0gcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7CisJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworCXdoaWxlKHBXaWRnZXRBY2MpCisJeworCQlDWEZBX0V2ZW50UGFyYW0gcHJlUGFyYW07CisJCXByZVBhcmFtLm1fZVR5cGUgPSAgWEZBX0VWRU5UX1Bvc3RTYXZlOwkKKwkJcFdpZGdldEhhbmRlci0+UHJvY2Vzc0V2ZW50KHBXaWRnZXRBY2MsJnByZVBhcmFtKTsKKwkJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworCX0KKwlwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsKKwlwWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworCXBEb2N1bWVudC0+X0NsZWFyQ2hhbmdlTWFyaygpOworCXJldHVybiBUUlVFOworfQorCisKK0ZYX0JPT0wgX1NlbmRQcmVTYXZlVG9YRkFEb2MoQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfUHRyQXJyYXkmIGZpbGVMaXN0KQoreworCWlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKKwkJcmV0dXJuIFRSVUU7CisJSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0WEZBRG9jVmlldygpOworCWlmIChOVUxMID09IHBYRkFEb2NWaWV3KQorCQlyZXR1cm4gVFJVRTsKKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kZXIgPSAgcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKwlDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEw7CisJSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogcFdpZGdldEFjY0l0ZXJhdG9yID0gcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7CisJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworCXdoaWxlKHBXaWRnZXRBY2MpCisJeworCQlDWEZBX0V2ZW50UGFyYW0gcHJlUGFyYW07CisJCXByZVBhcmFtLm1fZVR5cGUgPSAgWEZBX0VWRU5UX1ByZVNhdmU7CQorCQlwV2lkZ2V0SGFuZGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJnByZVBhcmFtKTsKKwkJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworCX0KKwlwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsJCisJcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKwlyZXR1cm4gX1NhdmVYRkFEb2N1bWVudERhdGEocERvY3VtZW50LCBmaWxlTGlzdCk7Cit9CisKK0ZQREZfQk9PTCBfRlBERl9Eb2NfU2F2ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGUsRlBERl9EV09SRCBmbGFncywgRlBERl9CT09MIGJTZXRWZXJzaW9uLAogCQkJCQkJIGludCBmaWxlVmVyaW9uKQogewotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JaWYgKCFwRG9jKSAKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworCisJQ0ZYX1B0ckFycmF5IGZpbGVMaXN0OworCisJX1NlbmRQcmVTYXZlVG9YRkFEb2MocERvYywgZmlsZUxpc3QpOworCisJQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBEb2MtPkdldFBERkRvYygpOworCWlmICghcFBERkRvYykgCiAJCXJldHVybiAwOwogCQogCWlmICggZmxhZ3MgPCBGUERGX0lOQ1JFTUVOVEFMIHx8IGZsYWdzID4gRlBERl9SRU1PVkVfU0VDVVJJVFkgKQpAQCAtNjUsMTAgKzMxNSwxMCBAQAogCQlmbGFncyA9IDA7CiAJfQogCQotCUNQREZfQ3JlYXRvciBGaWxlTWFrZXIocERvYyk7Ci0JaWYoYlNldFZlcnNpb24pCisJQ1BERl9DcmVhdG9yIEZpbGVNYWtlcihwUERGRG9jKTsKKwlpZiAoYlNldFZlcnNpb24pCiAJCUZpbGVNYWtlci5TZXRGaWxlVmVyc2lvbihmaWxlVmVyaW9uKTsKLQlpZihmbGFncyA9PSBGUERGX1JFTU9WRV9TRUNVUklUWSkKKwlpZiAoZmxhZ3MgPT0gRlBERl9SRU1PVkVfU0VDVVJJVFkpCiAJewogCQlmbGFncyA9ICAwOwogCQlGaWxlTWFrZXIuUmVtb3ZlU2VjdXJpdHkoKTsKQEAgLTc4LDYgKzMyOCwxNyBAQAogCXBTdHJlYW1Xcml0ZSA9IG5ldyBDRlhfSUZpbGVXcml0ZTsKIAlwU3RyZWFtV3JpdGUtPkluaXQoIHBGaWxlV3JpdGUgKTsKIAliUmV0ID0gRmlsZU1ha2VyLkNyZWF0ZShwU3RyZWFtV3JpdGUsIGZsYWdzKTsKKworCV9TZW5kUG9zdFNhdmVUb1hGQURvYyhwRG9jKTsKKwkvL3BEb2MtPl9DbGVhckNoYW5nZU1hcmsoKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QuR2V0U2l6ZSgpOyBpKyspCisJeworCQlJRlhfRmlsZVN0cmVhbSogcEZpbGUgPSAoSUZYX0ZpbGVTdHJlYW0qKWZpbGVMaXN0LkdldEF0KGkpOworCQlwRmlsZS0+UmVsZWFzZSgpOworCX0KKwlmaWxlTGlzdC5SZW1vdmVBbGwoKTsKKwogCWRlbGV0ZSBwU3RyZWFtV3JpdGU7CiAJcmV0dXJuIGJSZXQ7CiB9CkBAIC04OCw5ICszNDksOSBAQAogCXJldHVybiBfRlBERl9Eb2NfU2F2ZShkb2N1bWVudCwgcEZpbGVXcml0ZSwgZmxhZ3MsIEZBTFNFICwgMCk7CiB9CiAKLQogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZVdpdGhWZXJzaW9uKAlGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKIAlGUERGX0RXT1JEIGZsYWdzLCBpbnQgZmlsZVZlcnNpb24pCiB7CiAJcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgVFJVRSAsIGZpbGVWZXJzaW9uKTsKIH0KKwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwCmluZGV4IDI2NDYzMWIuLjAwMjYzNzQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAKQEAgLTYsNiArNiw4IEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmdGV4dC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCIKIAogI2lmZGVmIF9XSU4zMgogI2luY2x1ZGUgPHRjaGFyLmg+CkBAIC0xOCw5ICsyMCwxMyBAQAogewogCWlmICghcGFnZSkgcmV0dXJuIE5VTEw7CiAJSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9TlVMTDsKLQlDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYoKChDUERGX1BhZ2UqKXBhZ2UpLT5tX3BEb2N1bWVudCk7Ci0JdGV4dHBhZ2U9SVBERl9UZXh0UGFnZTo6Q3JlYXRlVGV4dFBhZ2UoKENQREZfUGFnZSopcGFnZSx2aWV3UmVmLklzRGlyZWN0aW9uUjJMKCkpOworCUNQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOworCWlmICghcFBhZ2UtPkdldFBERlBhZ2UoKSkgcmV0dXJuIE5VTEw7CisJQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5HZXREb2N1bWVudCgpOworCUNQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jLT5HZXRQREZEb2MoKSk7CisJdGV4dHBhZ2U9SVBERl9UZXh0UGFnZTo6Q3JlYXRlVGV4dFBhZ2UoKENQREZfUGFnZSopcFBhZ2UtPkdldFBERlBhZ2UoKSx2aWV3UmVmLklzRGlyZWN0aW9uUjJMKCkpOwogCXRleHRwYWdlLT5QYXJzZVRleHRQYWdlKCk7CisKIAlyZXR1cm4gdGV4dHBhZ2U7CiB9CiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0Nsb3NlUGFnZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcAppbmRleCBiZDQ5ODYyLi5hZThmM2NjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwCkBAIC0xMSwxMSArMTEsMTE2IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmX3Byb2dyZXNzaXZlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmX2V4dC5oIgogI2luY2x1ZGUgIi4uLy4uL3RoaXJkX3BhcnR5L251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZmZvcm1maWxsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCIKKworQ0ZQREZfRmlsZVN0cmVhbTo6Q0ZQREZfRmlsZVN0cmVhbShGUERGX0ZJTEVIQU5ETEVSKiBwRlMpCit7CisJbV9wRlMJCQk9CXBGUzsKKwltX25DdXJQb3MJCT0JMDsKK30KKworSUZYX0ZpbGVTdHJlYW0qIENGUERGX0ZpbGVTdHJlYW06OlJldGFpbigpCit7CisJcmV0dXJuIHRoaXM7Cit9CisKK3ZvaWQgQ0ZQREZfRmlsZVN0cmVhbTo6UmVsZWFzZSgpCit7CisJaWYgKG1fcEZTICYmIG1fcEZTLT5SZWxlYXNlKQorCQltX3BGUy0+UmVsZWFzZShtX3BGUy0+Y2xpZW50RGF0YSk7CisJZGVsZXRlIHRoaXM7Cit9CisKK0ZYX0ZJTEVTSVpFIENGUERGX0ZpbGVTdHJlYW06OkdldFNpemUoKQoreworCWlmIChtX3BGUyAmJiBtX3BGUy0+R2V0U2l6ZSkKKwkJcmV0dXJuIChGWF9GSUxFU0laRSltX3BGUy0+R2V0U2l6ZShtX3BGUy0+Y2xpZW50RGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK0ZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6SXNFT0YoKQoreworCXJldHVybiBtX25DdXJQb3MgPj0gR2V0U2l6ZSgpOworfQorCitGWF9CT09MIENGUERGX0ZpbGVTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisJaWYgKCFidWZmZXIgfHwgIXNpemUgfHwgIW1fcEZTLT5SZWFkQmxvY2spIHJldHVybiBGQUxTRTsKKworCWlmIChtX3BGUy0+UmVhZEJsb2NrKG1fcEZTLT5jbGllbnREYXRhLCAoRlBERl9EV09SRClvZmZzZXQsIGJ1ZmZlciwgKEZQREZfRFdPUkQpc2l6ZSkgPT0gMCkKKwl7CisJCW1fbkN1clBvcyA9IG9mZnNldCArIHNpemU7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK3NpemVfdCBDRlBERl9GaWxlU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSB8fCAhbV9wRlMtPlJlYWRCbG9jaykgcmV0dXJuIDA7CisJCisJRlhfRklMRVNJWkUgblNpemUgPSBHZXRTaXplKCk7CisJaWYgKG1fbkN1clBvcyA+PSBuU2l6ZSkgcmV0dXJuIDA7CisJRlhfRklMRVNJWkUgZHdBdmFpbCA9IG5TaXplIC0gbV9uQ3VyUG9zOworCWlmIChkd0F2YWlsIDwgKEZYX0ZJTEVTSVpFKXNpemUpIHNpemUgPSAoc2l6ZV90KWR3QXZhaWw7CisJaWYgKG1fcEZTLT5SZWFkQmxvY2sobV9wRlMtPmNsaWVudERhdGEsIChGUERGX0RXT1JEKW1fbkN1clBvcywgYnVmZmVyLCAoRlBERl9EV09SRClzaXplKSA9PSAwKQorCXsKKwkJbV9uQ3VyUG9zICs9IHNpemU7CisJCXJldHVybiBzaXplOworCX0KKworCXJldHVybiAwOworfQorCitGWF9CT09MIENGUERGX0ZpbGVTdHJlYW06OldyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQoreworCWlmICghbV9wRlMgfHwgIW1fcEZTLT5Xcml0ZUJsb2NrKSByZXR1cm4gRkFMU0U7CisKKwlpZihtX3BGUy0+V3JpdGVCbG9jayhtX3BGUy0+Y2xpZW50RGF0YSwgKEZQREZfRFdPUkQpb2Zmc2V0LCBidWZmZXIsIChGUERGX0RXT1JEKXNpemUpID09IDApCisJeworCQltX25DdXJQb3MgPSBvZmZzZXQgKyBzaXplOworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGUERGX0ZpbGVTdHJlYW06OkZsdXNoKCkKK3sKKwlpZiAoIW1fcEZTIHx8ICFtX3BGUy0+Rmx1c2gpIHJldHVybiBUUlVFOworCisJcmV0dXJuIG1fcEZTLT5GbHVzaChtX3BGUy0+Y2xpZW50RGF0YSkgPT0gMDsKK30KIAogQ1BERl9DdXN0b21BY2Nlc3M6OkNQREZfQ3VzdG9tQWNjZXNzKEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MpCiB7Ci0JaWYgKHBGaWxlQWNjZXNzKQotCQltX0ZpbGVBY2Nlc3MgPSAqcEZpbGVBY2Nlc3M7CisJbV9GaWxlQWNjZXNzID0gKnBGaWxlQWNjZXNzOworCW1fQnVmZmVyT2Zmc2V0ID0gKEZYX0RXT1JEKS0xOworfQorCitGWF9CT09MIENQREZfQ3VzdG9tQWNjZXNzOjpHZXRCeXRlKEZYX0RXT1JEIHBvcywgRlhfQllURSYgY2gpCit7CisJaWYgKHBvcyA+PSBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuKSByZXR1cm4gRkFMU0U7CisJaWYgKG1fQnVmZmVyT2Zmc2V0ID09IChGWF9EV09SRCktMSB8fCBwb3MgPCBtX0J1ZmZlck9mZnNldCB8fCBwb3MgPj0gbV9CdWZmZXJPZmZzZXQgKyA1MTIpIHsKKwkJLy8gTmVlZCB0byByZWFkIGZyb20gZmlsZSBhY2Nlc3MKKwkJbV9CdWZmZXJPZmZzZXQgPSBwb3M7CisJCWludCBzaXplID0gNTEyOworCQlpZiAocG9zICsgNTEyID4gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbikKKwkJCXNpemUgPSBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuIC0gcG9zOworCQlpZiAoIW1fRmlsZUFjY2Vzcy5tX0dldEJsb2NrKG1fRmlsZUFjY2Vzcy5tX1BhcmFtLCBtX0J1ZmZlck9mZnNldCwgbV9CdWZmZXIsIHNpemUpKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwljaCA9IG1fQnVmZmVyW3BvcyAtIG1fQnVmZmVyT2Zmc2V0XTsKKwlyZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDUERGX0N1c3RvbUFjY2Vzczo6R2V0QmxvY2soRlhfRFdPUkQgcG9zLCBGWF9MUEJZVEUgcEJ1ZiwgRlhfRFdPUkQgc2l6ZSkKK3sKKwlpZiAocG9zICsgc2l6ZSA+IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pIHJldHVybiBGQUxTRTsKKwlyZXR1cm4gbV9GaWxlQWNjZXNzLm1fR2V0QmxvY2sobV9GaWxlQWNjZXNzLm1fUGFyYW0sIHBvcywgcEJ1Ziwgc2l6ZSk7CiB9CiAKIEZYX0JPT0wgQ1BERl9DdXN0b21BY2Nlc3M6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCkBAIC0xNjEsNiArMjY2LDkgQEAKICNlbmRpZiAKICNlbmRpZgogCisJQ1BERlhGQV9BcHAqIHBBcHBQcm92aWRlciA9IEZQREZYRkFfR2V0QXBwKCk7CisJcEFwcFByb3ZpZGVyLT5Jbml0aWFsaXplKCk7CisKICNpZmRlZiBfV0lOMzIKIAkvLyBHZXQgbW9kdWxlIHBhdGgKIAlUQ0hBUiBhcHBfcGF0aFtNQVhfUEFUSF07CkBAIC0xODcsNiArMjk1LDcgQEAKIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCkKIHsKKwlGUERGWEZBX1JlbGVhc2VBcHAoKTsKIAogI2lmIF9GWF9PU18gPT0gX0ZYX0xJTlVYX0VNQkVEREVEXwogCWlmIChnX3BGb250TWFwcGVyKSBkZWxldGUgZ19wRm9udE1hcHBlcjsKQEAgLTI1NCw4ICszNjMsMjYgQEAKIAkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcmV0dXJuIHBQYXJzZXItPkdldERvY3VtZW50KCk7CisJQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7CisJaWYgKCFwUERGRG9jKQorCQlyZXR1cm4gTlVMTDsKKworCUNQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBGUERGWEZBX0dldEFwcCgpOworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEZYX05FVyBDUERGWEZBX0RvY3VtZW50KHBQREZEb2MsIHBQcm92aWRlcik7CisJcmV0dXJuIHBEb2N1bWVudDsKIH0KK0RMTEVYUE9SVCAgRlBERl9CT09MIFNURENBTEwgRlBERl9Mb2FkWEZBKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCit7CisJaWYgKCFkb2N1bWVudHx8ISgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKSkgCisJCXJldHVybiBGQUxTRTsKKworCWludCBpRG9jVHlwZSA9IERPQ1RZUEVfUERGOworCUZYX0JPT0wgaGFzWEZBRmllbGQgPSBGUERGX0hhc1hGQUZpZWxkKCgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKSwgaURvY1R5cGUpOworCWlmICghaGFzWEZBRmllbGQpCisJCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkxvYWRYRkFEb2MoKTsKK30KKwogCiBleHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQgKiBwRG9jLCBGWF9EV09SRCBlcnJfY29kZSk7CiAKQEAgLTI5Nyw3ICs0MjQsMTUgQEAKIAlDUERGX0RvY3VtZW50ICogcERvYyA9IE5VTEw7CiAJcERvYyA9IHBQYXJzZXI/cFBhcnNlci0+R2V0RG9jdW1lbnQoKTpOVUxMOwogCUNoZWNrVW5TdXBwb3J0RXJyb3IocERvYywgZXJyX2NvZGUpOwotCXJldHVybiBwUGFyc2VyLT5HZXREb2N1bWVudCgpOworCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwUGFyc2VyLT5HZXREb2N1bWVudCgpOworCWlmICghcFBERkRvYykKKwkJcmV0dXJuIE5VTEw7CisKKwlDUERGWEZBX0FwcCogcFByb3ZpZGVyID0gRlBERlhGQV9HZXRBcHAoKTsKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBGWF9ORVcgQ1BERlhGQV9Eb2N1bWVudChwUERGRG9jLCBwUHJvdmlkZXIpOworCS8vcERvY3VtZW50LT5Mb2FkWEZBRG9jKCk7CisKKwlyZXR1cm4gcERvY3VtZW50OwogfQogCiBETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsIEZQREZfQllURVNUUklORyBwYXNzd29yZCkKQEAgLTMxNCwxNSArNDQ5LDI2IEBACiAJQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSBOVUxMOwogCXBEb2MgPSBwUGFyc2VyP3BQYXJzZXItPkdldERvY3VtZW50KCk6TlVMTDsKIAlDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIGVycl9jb2RlKTsKLQlyZXR1cm4gcFBhcnNlci0+R2V0RG9jdW1lbnQoKTsKKwlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcFBhcnNlci0+R2V0RG9jdW1lbnQoKTsKKwlpZiAoIXBQREZEb2MpCisJCXJldHVybiBOVUxMOworCisJQ1BERlhGQV9BcHAqIHBQcm92aWRlciA9IEZQREZYRkFfR2V0QXBwKCk7CisJQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gRlhfTkVXIENQREZYRkFfRG9jdW1lbnQocFBERkRvYywgcFByb3ZpZGVyKTsKKwkvL3BEb2N1bWVudC0+TG9hZFhGQURvYygpOworCisJcmV0dXJuIHBEb2N1bWVudDsKIH0KIAogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfR2V0RmlsZVZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2MsIGludCogZmlsZVZlcnNpb24pCiB7CiAJaWYoIWRvY3x8IWZpbGVWZXJzaW9uKSByZXR1cm4gRkFMU0U7CiAJKmZpbGVWZXJzaW9uID0gMDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvYzsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+R2V0UGFyc2VyKCk7CisJQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2M7CisJQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBEb2MtPkdldFBERkRvYygpOworCWlmICghcFBERkRvYykgcmV0dXJuIChGWF9EV09SRCktMTsKKwlDUERGX1BhcnNlciogcFBhcnNlciA9IAkoQ1BERl9QYXJzZXIqKXBQREZEb2MtPkdldFBhcnNlcigpOworCiAJaWYoIXBQYXJzZXIpCiAJCXJldHVybiBGQUxTRTsKIAkqZmlsZVZlcnNpb24gPSBwUGFyc2VyLT5HZXRGaWxlVmVyc2lvbigpOwpAQCAtMzMzLDggKzQ3OSwxMCBAQAogRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCiB7CiAJaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiAwOwotCUNQREZfRG9jdW1lbnQqcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IAkoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpOworCUNQREZYRkFfRG9jdW1lbnQqcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKwlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvYy0+R2V0UERGRG9jKCk7CisJaWYgKCFwUERGRG9jKSByZXR1cm4gKEZYX0RXT1JEKS0xOworCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gCShDUERGX1BhcnNlciopcFBERkRvYy0+R2V0UGFyc2VyKCk7CiAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYXJzZXItPkdldEVuY3J5cHREaWN0KCk7CiAJaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiAoRlhfRFdPUkQpLTE7CiAKQEAgLTM1NSwzOCArNTAzLDMzIEBACiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlQ291bnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKIHsKIAlpZiAoZG9jdW1lbnQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JcmV0dXJuICgoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQYWdlQ291bnQoKTsKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworCXJldHVybiBwRG9jLT5HZXRQYWdlQ291bnQoKTsKKy8vCXJldHVybiAoKENQREZfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UGFnZUNvdW50KCk7CiB9CiAKIERMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGX0xvYWRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4KQogewogCWlmIChkb2N1bWVudCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBGUERGX0dldFBhZ2VDb3VudChkb2N1bWVudCkpIHJldHVybiBOVUxMOworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisJaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gcERvYy0+R2V0UGFnZUNvdW50KCkpIHJldHVybiBOVUxMOwogLy8JQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKWRvY3VtZW50OwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JaWYgKHBEb2MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7Ci0JaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCUNQREZfUGFnZSogcFBhZ2UgPSBGWF9ORVcgQ1BERl9QYWdlOwotCXBQYWdlLT5Mb2FkKHBEb2MsIHBEaWN0KTsKLQlwUGFnZS0+UGFyc2VDb250ZW50KCk7Ci0JCi0vLwlDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIDApOwotCi0JcmV0dXJuIHBQYWdlOworCXJldHVybiBwRG9jLT5HZXRQYWdlKHBhZ2VfaW5kZXgpOwogfQogCiBETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlV2lkdGgoRlBERl9QQUdFIHBhZ2UpCiB7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gMC4wOwotCXJldHVybiAoKENQREZfUGFnZSopcGFnZSktPkdldFBhZ2VXaWR0aCgpOworCXJldHVybiAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBhZ2VXaWR0aCgpOworLy8JcmV0dXJuICgoQ1BERl9QYWdlKilwYWdlKS0+R2V0UGFnZVdpZHRoKCk7CiB9CiAKIERMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGX0dldFBhZ2VIZWlnaHQoRlBERl9QQUdFIHBhZ2UpCiB7CiAJaWYgKCFwYWdlKSByZXR1cm4gMC4wOwotCXJldHVybiAoKENQREZfUGFnZSopcGFnZSktPkdldFBhZ2VIZWlnaHQoKTsKKy8vCXJldHVybiAoKENQREZfUGFnZSopcGFnZSktPkdldFBhZ2VIZWlnaHQoKTsKKwlyZXR1cm4gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQYWdlSGVpZ2h0KCk7CiB9CiAKIHZvaWQgRHJvcENvbnRleHQodm9pZCogZGF0YSkKQEAgLTQwOCw3ICs1NTEsOCBAQAogCQkJCQkJaW50IHJvdGF0ZSwgaW50IGZsYWdzKQogewogCWlmIChwYWdlPT1OVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworCWlmICghcFBhZ2UpIHJldHVybjsKIAogCUNSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IEZYX05FVyBDUmVuZGVyQ29udGV4dDsKIAlwUGFnZS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEsIHBDb250ZXh0LCBEcm9wQ29udGV4dCk7CkBAIC01NjIsOCArNzA2LDggQEAKIAkJCQkJCWludCBzaXplX3gsIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncykKIHsKIAlpZiAoYml0bWFwID09IE5VTEwgfHwgcGFnZSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0KKwlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisJaWYgKCFwUGFnZSkgcmV0dXJuOwogCiAJQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gRlhfTkVXIENSZW5kZXJDb250ZXh0OwogCXBQYWdlLT5TZXRQcml2YXRlRGF0YSgodm9pZCopMSwgcENvbnRleHQsIERyb3BDb250ZXh0KTsKQEAgLTU5MiwxMiArNzM2LDE0IEBACiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlKQogewogCWlmICghcGFnZSkgcmV0dXJuOwotICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSAoQ1BERlNES19QYWdlVmlldyopKCgoQ1BERl9QYWdlKilwYWdlKSktPkdldFByaXZhdGVEYXRhKChGWF9MUFZPSUQpcGFnZSk7Ci0gICAgICAgIGlmIChwUGFnZVZpZXcgJiYgcFBhZ2VWaWV3LT5Jc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICBwUGFnZVZpZXctPlRha2VPdmVyUGFnZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0JZGVsZXRlIChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7CisJCisJcFBhZ2UtPlJlbGVhc2UoKTsKKy8vIAlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPkdldERvY3VtZW50KCk7CisvLyAJaWYgKHBEb2MpIHsKKy8vIAkJcERvYy0+UmVtb3ZlUGFnZShwUGFnZSk7CisvLyAJfQorLy8gCWRlbGV0ZSAoQ1BERlhGQV9QYWdlKilwYWdlOwogCiB9CiAKQEAgLTYwNSwxNCArNzUxLDE2IEBACiB7CiAJaWYgKCFkb2N1bWVudCkKIAkJcmV0dXJuOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CQotCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jLT5HZXRQYXJzZXIoKTsKLQlpZiAocFBhcnNlciA9PSBOVUxMKSAKLQl7Ci0JCWRlbGV0ZSBwRG9jOwotCQlyZXR1cm47Ci0JfQotCWRlbGV0ZSBwUGFyc2VyOworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CQorCWRlbGV0ZSBwRG9jOworCisvLyAJQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpOworLy8gCWlmIChwUGFyc2VyID09IE5VTEwpIAorLy8gCXsKKy8vIAkJZGVsZXRlIHBEb2M7CisvLyAJCXJldHVybjsKKy8vIAl9CisvLyAJZGVsZXRlIHBQYXJzZXI7CiAvLwlkZWxldGUgcERvYzsKIH0KIApAQCAtNjI1LDM0ICs3NzMsMTcgQEAKIAkJCQkJCWludCByb3RhdGUsIGludCBkZXZpY2VfeCwgaW50IGRldmljZV95LCBkb3VibGUqIHBhZ2VfeCwgZG91YmxlKiBwYWdlX3kpCiB7CiAJaWYgKHBhZ2UgPT0gTlVMTCB8fCBwYWdlX3ggPT0gTlVMTCB8fCBwYWdlX3kgPT0gTlVMTCkgcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworCUNQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOwogCi0JQ1BERl9NYXRyaXggcGFnZTJkZXZpY2U7Ci0JcFBhZ2UtPkdldERpc3BsYXlNYXRyaXgocGFnZTJkZXZpY2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOwotCUNQREZfTWF0cml4IGRldmljZTJwYWdlOwotCWRldmljZTJwYWdlLlNldFJldmVyc2UocGFnZTJkZXZpY2UpOwotCi0JRlhfRkxPQVQgcGFnZV94X2YsIHBhZ2VfeV9mOwotCWRldmljZTJwYWdlLlRyYW5zZm9ybSgoRlhfRkxPQVQpKGRldmljZV94KSwgKEZYX0ZMT0FUKShkZXZpY2VfeSksIHBhZ2VfeF9mLCBwYWdlX3lfZik7Ci0KLQkqcGFnZV94ID0gKHBhZ2VfeF9mKTsKLQkqcGFnZV95ID0gKHBhZ2VfeV9mKTsKKwlwUGFnZS0+RGV2aWNlVG9QYWdlKHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGRldmljZV94LCBkZXZpY2VfeSwgcGFnZV94LCBwYWdlX3kpOwogfQogCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUGFnZVRvRGV2aWNlKEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCiAJCQkJCQlpbnQgcm90YXRlLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KQogewogCWlmIChwYWdlID09IE5VTEwgfHwgZGV2aWNlX3ggPT0gTlVMTCB8fCBkZXZpY2VfeSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0KLQlDUERGX01hdHJpeCBwYWdlMmRldmljZTsKLQlwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChwYWdlMmRldmljZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7Ci0KLQlGWF9GTE9BVCBkZXZpY2VfeF9mLCBkZXZpY2VfeV9mOwotCXBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXBhZ2VfeCksICgoRlhfRkxPQVQpcGFnZV95KSwgZGV2aWNlX3hfZiwgZGV2aWNlX3lfZik7Ci0KLQkqZGV2aWNlX3ggPSBGWFNZU19yb3VuZChkZXZpY2VfeF9mKTsKLQkqZGV2aWNlX3kgPSBGWFNZU19yb3VuZChkZXZpY2VfeV9mKTsKKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKKwlwUGFnZS0+UGFnZVRvRGV2aWNlKHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIHBhZ2VfeCwgcGFnZV95LCBkZXZpY2VfeCwgZGV2aWNlX3kpOwogfQogCiBETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhbHBoYSkKQEAgLTczNCw3ICs4NjUsNyBAQAogCQkJCQkJaW50IHJvdGF0ZSwgaW50IGZsYWdzLEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSApCiB7CiAvLyNpZmRlZiBfTElDRU5TRURfQlVJTERfCi0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CisJQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwogCWlmIChwUGFnZSA9PSBOVUxMKSByZXR1cm47CiAKIAlpZiAoIXBDb250ZXh0LT5tX3BPcHRpb25zKQpAQCAtNzk3LDI2ICs5MjgsNDMgQEAKIAogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4LCBkb3VibGUqIHdpZHRoLCBkb3VibGUqIGhlaWdodCkKIHsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotCWlmKHBEb2MgPT0gTlVMTCkKKy8vIAlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworLy8gCWlmKHBEb2MgPT0gTlVMTCkKKy8vIAkJcmV0dXJuIEZBTFNFOworLy8gCisvLyAJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7CisvLyAJaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKy8vIAorLy8gCUNQREZfUGFnZSBwYWdlOworLy8gCXBhZ2UuTG9hZChwRG9jLCBwRGljdCk7CisvLyAJKndpZHRoID0gcGFnZS5HZXRQYWdlV2lkdGgoKTsKKy8vIAkqaGVpZ2h0ID0gcGFnZS5HZXRQYWdlSGVpZ2h0KCk7CisKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworCWlmIChwRG9jID09IE5VTEwpCiAJCXJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRG9jLT5HZXRQYWdlKHBhZ2VfaW5kZXgpOwotCWlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisJaW50IGNvdW50ID0gcERvYy0+R2V0UGFnZUNvdW50KCk7CisJaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gY291bnQpCisJCXJldHVybiBGQUxTRTsKIAotCUNQREZfUGFnZSBwYWdlOwotCXBhZ2UuTG9hZChwRG9jLCBwRGljdCk7Ci0JKndpZHRoID0gcGFnZS5HZXRQYWdlV2lkdGgoKTsKLQkqaGVpZ2h0ID0gcGFnZS5HZXRQYWdlSGVpZ2h0KCk7CisJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7CisJaWYgKCFwUGFnZSkKKwkJcmV0dXJuIEZBTFNFOworCisJKndpZHRoID0gcFBhZ2UtPkdldFBhZ2VXaWR0aCgpOworCSpoZWlnaHQgPSBwUGFnZS0+R2V0UGFnZUhlaWdodCgpOwogCiAJcmV0dXJuIFRSVUU7CiB9CiAKIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFNjYWxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKIHsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CiAJaWYgKCFwRG9jKSByZXR1cm4gVFJVRTsKLQlDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7CisJQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBEb2MtPkdldFBERkRvYygpOworCWlmICghcFBERkRvYykgcmV0dXJuIFRSVUU7CisJQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBQREZEb2MpOwogCXJldHVybiB2aWV3UmVmLlByaW50U2NhbGluZygpOwogfQogCkBAIC04NTgsNyArMTAwNiw2NyBAQAogCWlmIChuYW1lID09IE5VTEwgfHwgbmFtZVswXSA9PSAwKSAKIAkJcmV0dXJuIE5VTEw7CiAKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotCUNQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKLQlyZXR1cm4gbmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKTsKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwRG9jLT5HZXRQREZEb2MoKTsKKwlpZiAoIXBQREZEb2MpIAorCQlyZXR1cm4gTlVMTDsKKwlDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwUERGRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7CisJcmV0dXJuIG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocFBERkRvYywgbmFtZSk7Cit9CisKK0ZQREZfUkVTVUxUCUZQREZfQlN0cl9Jbml0KEZQREZfQlNUUiogc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gLTE7CisKKwlGWFNZU19tZW1zZXQzMihzdHIsIDAsIHNpemVvZihGUERGX0JTVFIpKTsKKwlyZXR1cm4gMDsKK30KKworRlBERl9SRVNVTFQgRlBERl9CU3RyX1NldChGUERGX0JTVFIqIHN0ciwgRlBERl9MUENTVFIgYnN0ciwgaW50IGxlbmd0aCkKK3sKKwlpZiAoIXN0cikgcmV0dXJuIC0xOworCWlmICghYnN0ciB8fCAhbGVuZ3RoKQorCQlyZXR1cm4gLTE7CisJaWYgKGxlbmd0aCA9PSAtMSkKKwkJbGVuZ3RoID0gRlhTWVNfc3RybGVuKGJzdHIpOworCisJaWYgKGxlbmd0aCA9PSAwKQorCXsKKwkJaWYgKHN0ci0+c3RyKQorCQl7CisJCQlGWF9GcmVlKHN0ci0+c3RyKTsKKwkJCXN0ci0+c3RyID0gTlVMTDsKKwkJfQorCQlzdHItPmxlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHItPnN0ciAmJiBzdHItPmxlbiA8IGxlbmd0aCkKKwkJc3RyLT5zdHIgPSBGWF9SZWFsbG9jKGNoYXIsIHN0ci0+c3RyLCBsZW5ndGgrMSk7CisJZWxzZSBpZiAoIXN0ci0+c3RyKQorCQlzdHItPnN0ciA9IEZYX0FsbG9jKGNoYXIsIGxlbmd0aCsxKTsKKworCXN0ci0+c3RyW2xlbmd0aF0gPSAwOworCWlmIChzdHItPnN0ciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlGWFNZU19tZW1jcHkoc3RyLT5zdHIsIGJzdHIsIGxlbmd0aCk7CisJc3RyLT5sZW4gPSBsZW5ndGg7CisKKwlyZXR1cm4gMDsKK30KKworRlBERl9SRVNVTFQJRlBERl9CU3RyX0NsZWFyKEZQREZfQlNUUiogc3RyKQoreworCWlmKCFzdHIpCisJCXJldHVybiAtMTsKKworCWlmIChzdHItPnN0cikKKwl7CisJCUZYX0ZyZWUoc3RyLT5zdHIpOworCQlzdHItPnN0ciA9IE5VTEw7CisJfQorCXN0ci0+bGVuID0gMDsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2FwcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiZDI3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuY3BwCkBAIC0wLDAgKzEsNjQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisgDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZmb3JtZmlsbC5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZzZGtfbWdyLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvanNhcGkvZnhqc192OC5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiDQorQ1BERlhGQV9BcHAqIENQREZYRkFfQXBwOjptX3BBcHAgPSBOVUxMOw0KKw0KK0NQREZYRkFfQXBwKiBGUERGWEZBX0dldEFwcCgpDQorew0KKwlpZiAoIUNQREZYRkFfQXBwOjptX3BBcHApDQorCQlDUERGWEZBX0FwcDo6bV9wQXBwID0gRlhfTkVXIENQREZYRkFfQXBwKCk7DQorDQorCXJldHVybiBDUERGWEZBX0FwcDo6bV9wQXBwOw0KK30NCisNCit2b2lkIEZQREZYRkFfUmVsZWFzZUFwcCgpDQorew0KKwlpZiAoQ1BERlhGQV9BcHA6Om1fcEFwcCkNCisJCWRlbGV0ZSBDUERGWEZBX0FwcDo6bV9wQXBwOw0KKwlDUERGWEZBX0FwcDo6bV9wQXBwID0gTlVMTDsNCit9DQorDQorQ0pTX1J1bnRpbWVGYWN0b3J5KiBnX0dldEpTUnVudGltZUZhY3RvcnkoKQ0KK3sNCisJc3RhdGljIENKU19SdW50aW1lRmFjdG9yeSBnX0pTUnVudGltZUZhY3Rvcnk7DQorCXJldHVybiAmZ19KU1J1bnRpbWVGYWN0b3J5Ow0KK30NCisNCitDUERGWEZBX0FwcDo6Q1BERlhGQV9BcHAoKSA6IA0KKwltX3BYRkFBcHAoTlVMTCksIA0KKwltX3BGb250TWdyKE5VTEwpLA0KKwltX2hKU0VSdW50aW1lKE5VTEwpLA0KKwkvL21fcEpTUnVudGltZShOVUxMKSwNCisJLy9tX3BFbnYoTlVMTCksDQorCW1fY3NBcHBUeXBlKEpTX1NUUl9WSUVXRVJUWVBFX1NUQU5EQVJEKQ0KK3sNCisJbV9wSlNSdW50aW1lRmFjdG9yeSA9IE5VTEw7DQorCW1fcEpTUnVudGltZUZhY3RvcnkgPSBnX0dldEpTUnVudGltZUZhY3RvcnkoKTsNCisJbV9wSlNSdW50aW1lRmFjdG9yeS0+QWRkUmVmKCk7DQorCW1fcEVudkxpc3QuUmVtb3ZlQWxsKCk7CQ0KKwltX2JJbml0UnVudGltZSA9IEZBTFNFOw0KK30NCisvL0lGWEpTX1J1bnRpbWUqIENQREZYRkFfQXBwOjpHZXRKU1J1bnRpbWUoKQ0KKy8vew0KKy8vCUZYU1lTX2Fzc2VydChtX3BKU1J1bnRpbWVGYWN0b3J5KTsNCisvLwlpZighbV9wSlNSdW50aW1lKQ0KKy8vCQltX3BKU1J1bnRpbWUgPSBtX3BKU1J1bnRpbWVGYWN0b3J5LT5OZXdKU1J1bnRpbWUodGhpcyk7DQorLy8JcmV0dXJuIG1fcEpTUnVudGltZTsNCisvL30NCisNCitDUERGWEZBX0FwcDo6fkNQREZYRkFfQXBwKCkNCit7DQorCWlmIChtX3BGb250TWdyKQ0KKwl7DQorCQltX3BGb250TWdyLT5SZWxlYXNlKCk7DQorCQltX3BGb250TWdyID0gTlVMTDsNCisJfQ0KKw0KKwlpZiAobV9wWEZBQXBwKQ0KKwl7DQorCQltX3BYRkFBcHAtPlJlbGVhc2UoKTsNCisJCW1fcFhGQUFwcCA9IE5VTEw7DQorCX0NCisNCisJLy9pZiAobV9wSlNSdW50aW1lICYmIG1fcEpTUnVudGltZUZhY3RvcnkpDQorCS8vCW1fcEpTUnVudGltZUZhY3RvcnktPkRlbGV0ZUpTUnVudGltZShtX3BKU1J1bnRpbWUpOw0KKwltX3BKU1J1bnRpbWVGYWN0b3J5LT5SZWxlYXNlKCk7DQorDQorDQorCWlmIChtX2hKU0VSdW50aW1lKQ0KKwl7DQorCQlGWEpTRV9SdW50aW1lX1JlbGVhc2UobV9oSlNFUnVudGltZSk7DQorCQltX2hKU0VSdW50aW1lID0gTlVMTDsNCisJfQ0KKw0KKwlGWEpTRV9GaW5hbGl6ZSgpOw0KKw0KKwlCQ19MaWJyYXJ5X0Rlc3RvcnkoKTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0FwcDo6SW5pdGlhbGl6ZSgpDQorew0KKwlCQ19MaWJyYXJ5X0luaXQoKTsNCisNCisJRlhKU0VfSW5pdGlhbGl6ZSgpOw0KKwltX2hKU0VSdW50aW1lID0gRlhKU0VfUnVudGltZV9DcmVhdGUoKTsNCisNCisJaWYgKCFtX2hKU0VSdW50aW1lKSANCisJCXJldHVybiBGQUxTRTsNCisNCisJLy9tX3BKU1J1bnRpbWUgPSBtX3BKU1J1bnRpbWVGYWN0b3J5LT5OZXdKU1J1bnRpbWUodGhpcyk7DQorCQ0KKwltX3BYRkFBcHAgPSBJWEZBX0FwcDo6Q3JlYXRlKHRoaXMpOw0KKwlpZiAoIW1fcFhGQUFwcCkNCisJCXJldHVybiBGQUxTRTsNCisNCisJbV9wRm9udE1nciA9IFhGQV9HZXREZWZhdWx0Rm9udE1ncigpOw0KKwlpZiAoIW1fcEZvbnRNZ3IpDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCW1fcFhGQUFwcC0+U2V0RGVmYXVsdEZvbnRNZ3IobV9wRm9udE1ncik7DQorDQorCXJldHVybiBUUlVFOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfQXBwOjpBZGRGb3JtRmlsbEVudihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KQ0KK3sNCisJaWYgKCFwRW52KSByZXR1cm4gRkFMU0U7DQorDQorCW1fcEVudkxpc3QuQWRkKHBFbnYpOw0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0FwcDo6UmVtb3ZlRm9ybUZpbGxFbnYoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudikNCit7DQorCWlmICghcEVudikgcmV0dXJuIEZBTFNFOw0KKw0KKwlpbnQgbkZpbmQgPSBtX3BFbnZMaXN0LkZpbmQocEVudik7DQorCWlmIChuRmluZCAhPSAtMSkgew0KKwkJbV9wRW52TGlzdC5SZW1vdmVBdChuRmluZCk7DQorCQlyZXR1cm4gVFJVRTsNCisJfQ0KKw0KKwlyZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1BERlhGQV9BcHA6OlJlbGVhc2VSdW50aW1lKCkgDQorew0KKwl2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gY29udGV4dDsNCisJSlNfUmVsZWFzZVJ1bnRpbWUoKElKU19SdW50aW1lKiltX2hKU0VSdW50aW1lLCBjb250ZXh0KTsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6R2V0QXBwVHlwZShDRlhfV2lkZVN0cmluZyAmd3NBcHBUeXBlKQ0KK3sNCisJd3NBcHBUeXBlID0gbV9jc0FwcFR5cGU7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9BcHA6OkdldEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkNCit7DQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKwlpZiAocEVudikNCisJew0KKwkJd3NOYW1lID0gcEVudi0+RkZJX0dldEFwcE5hbWUoKTsNCisJfQ0KK30NCisNCit2b2lkIENQREZYRkFfQXBwOjpTZXRBcHBUeXBlKEZYX1dTVFIgd3NBcHBUeXBlKQ0KK3sNCisJbV9jc0FwcFR5cGUgPSB3c0FwcFR5cGU7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9BcHA6OkdldExhbmd1YWdlKENGWF9XaWRlU3RyaW5nICZ3c0xhbmd1YWdlKQ0KK3sNCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorCWlmIChwRW52KQ0KKwl7DQorCQl3c0xhbmd1YWdlID0gcEVudi0+RkZJX0dldExhbmd1YWdlKCk7DQorCX0NCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6R2V0UGxhdGZvcm0oQ0ZYX1dpZGVTdHJpbmcgJndzUGxhdGZvcm0pDQorew0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKHBFbnYpDQorCXsNCisJCXdzUGxhdGZvcm0gPSBwRW52LT5GRklfR2V0UGxhdGZvcm0oKTsNCisJfQ0KK30NCisNCit2b2lkIENQREZYRkFfQXBwOjpHZXRWYXJpYXRpb24oQ0ZYX1dpZGVTdHJpbmcgJndzVmFyaWF0aW9uKQ0KK3sNCisJd3NWYXJpYXRpb24gPSBKU19TVFJfVklFV0VSVkFSSUFUSU9OOw0KK30NCisNCit2b2lkIENQREZYRkFfQXBwOjpHZXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nICZ3c1ZlcnNpb24pDQorew0KKwl3c1ZlcnNpb24gPSBKU19TVFJfVklFV0VSVkVSU0lPTl9YRkE7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9BcHA6OkJlZXAoRlhfRFdPUkQgZHdUeXBlKQ0KK3sNCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorCWlmIChwRW52KQ0KKwl7DQorCQlwRW52LT5KU19hcHBCZWVwKGR3VHlwZSk7DQorCX0NCit9DQorDQorRlhfSU5UMzIgQ1BERlhGQV9BcHA6Ok1zZ0JveChGWF9XU1RSIHdzTWVzc2FnZSwgRlhfV1NUUiB3c1RpdGxlLCBGWF9EV09SRCBkd0ljb25UeXBlLCBGWF9EV09SRCBkd0J1dHRvblR5cGUpDQorew0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKCFwRW52KSANCisJCXJldHVybiAtMTsNCisNCisJRlhfRFdPUkQgaWNvblR5cGUgPSAwOw0KKwlpbnQgaUJ1dHRvblR5cGUgPSAwOw0KKwlzd2l0Y2ggKGR3SWNvblR5cGUpDQorCXsNCisJY2FzZSBYRkFfTUJJQ09OX0Vycm9yOg0KKwkJaWNvblR5cGUgfD0gMDsNCisJCWJyZWFrOw0KKwljYXNlIFhGQV9NQklDT05fV2FybmluZzoNCisJCWljb25UeXBlIHw9IDE7DQorCQlicmVhazsNCisJY2FzZSBYRkFfTUJJQ09OX1F1ZXN0aW9uOg0KKwkJaWNvblR5cGUgfD0gMjsNCisJCWJyZWFrOw0KKwljYXNlIFhGQV9NQklDT05fU3RhdHVzOg0KKwkJaWNvblR5cGUgfD0gMzsNCisJCWJyZWFrOw0KKwl9DQorCXN3aXRjaCAoZHdCdXR0b25UeXBlKQ0KKwl7DQorCWNhc2UgIFhGQV9NQl9PSzoNCisJCWlCdXR0b25UeXBlIHw9IDA7DQorCQlicmVhazsNCisJY2FzZSBYRkFfTUJfT0tDYW5jZWw6DQorCQlpQnV0dG9uVHlwZSB8PSAxOw0KKwkJYnJlYWs7DQorCWNhc2UgWEZBX01CX1llc05vOg0KKwkJaUJ1dHRvblR5cGUgfD0gMjsNCisJCWJyZWFrOw0KKwljYXNlIFhGQV9NQl9ZZXNOb0NhbmNlbDoNCisJCWlCdXR0b25UeXBlIHw9IDM7DQorCQlicmVhazsNCisJfQ0KKwlGWF9JTlQzMiBpUmV0ID0gcEVudi0+SlNfYXBwQWxlcnQod3NNZXNzYWdlLkdldFB0cigpLCB3c1RpdGxlLkdldFB0cigpLCBpQnV0dG9uVHlwZSwgaWNvblR5cGUpOw0KKwlzd2l0Y2ggKGlSZXQpDQorCXsNCisJY2FzZSAxOg0KKwkJcmV0dXJuIFhGQV9JRE9LOw0KKwljYXNlIDI6DQorCQlyZXR1cm4gWEZBX0lEQ2FuY2VsOw0KKwljYXNlIDM6DQorCQlyZXR1cm4gWEZBX0lETm87DQorCWNhc2UgNDoNCisJCXJldHVybiBYRkFfSURZZXM7DQorCX0NCisJcmV0dXJuIFhGQV9JRFllczsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6UmVzcG9uc2UoQ0ZYX1dpZGVTdHJpbmcgJndzQW5zd2VyLCBGWF9XU1RSIHdzUXVlc3Rpb24sIEZYX1dTVFIgd3NUaXRsZSwgRlhfV1NUUiB3c0RlZmF1bHRBbnN3ZXIsIEZYX0JPT0wgYk1hcmspDQorew0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKHBFbnYpDQorCXsNCisJCWludCBuTGVuZ3RoID0gMjA0ODsNCisJCWNoYXIqIHBCdWZmID0gbmV3IGNoYXJbbkxlbmd0aF07DQorCQluTGVuZ3RoID0gcEVudi0+SlNfYXBwUmVzcG9uc2Uod3NRdWVzdGlvbi5HZXRQdHIoKSwgd3NUaXRsZS5HZXRQdHIoKSwgd3NEZWZhdWx0QW5zd2VyLkdldFB0cigpLCBOVUxMLCBiTWFyaywgcEJ1ZmYsIG5MZW5ndGgpOw0KKwkJaWYobkxlbmd0aCA+IDApDQorCQl7DQorCQkJbkxlbmd0aCA9IG5MZW5ndGg+MjA0Nj8yMDQ2Om5MZW5ndGg7DQorCQkJcEJ1ZmZbbkxlbmd0aF0gPSAwOw0KKwkJCXBCdWZmW25MZW5ndGgrMV0gPSAwOw0KKwkJCXdzQW5zd2VyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKCh1bnNpZ25lZCBzaG9ydCopcEJ1ZmYsIG5MZW5ndGgpOw0KKwkJfQ0KKwkJZGVsZXRlW10gcEJ1ZmY7DQorCX0NCit9DQorDQorRlhfSU5UMzIgQ1BERlhGQV9BcHA6OkdldEN1ckRvY3VtZW50SW5CYXRjaCgpDQorew0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKHBFbnYpDQorCXsNCisJCXJldHVybiBwRW52LT5GRklfR2V0Q3VyRG9jdW1lbnQoKTsNCisJfQ0KKwlyZXR1cm4gMDsNCit9DQorDQorRlhfSU5UMzIgQ1BERlhGQV9BcHA6OkdldERvY3VtZW50Q291bnRJbkJhdGNoKCkNCit7DQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKwlpZiAocEVudikNCisJew0KKwkJcmV0dXJuIHBFbnYtPkZGSV9HZXREb2N1bWVudENvdW50KCk7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK0lGWF9GaWxlUmVhZCogQ1BERlhGQV9BcHA6OkRvd25sb2FkVVJMKEZYX1dTVFIgd3NVUkwpDQorew0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKHBFbnYpDQorCXsNCisJCXJldHVybiBwRW52LT5GRklfRG93bmxvYWRGcm9tVVJMKHdzVVJMLkdldFB0cigpKTsNCisJfQ0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0FwcDo6UG9zdFJlcXVlc3RVUkwoRlhfV1NUUiB3c1VSTCwgRlhfV1NUUiB3c0RhdGEsIEZYX1dTVFIgd3NDb250ZW50VHlwZSwgDQorCUZYX1dTVFIgd3NFbmNvZGUsIEZYX1dTVFIgd3NIZWFkZXIsIENGWF9XaWRlU3RyaW5nICZ3c1Jlc3BvbnNlKQ0KK3sNCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorCWlmIChwRW52KQ0KKwl7DQorCQl3c1Jlc3BvbnNlID0gcEVudi0+RkZJX1Bvc3RSZXF1ZXN0VVJMKHdzVVJMLkdldFB0cigpLCB3c0RhdGEuR2V0UHRyKCksIHdzQ29udGVudFR5cGUuR2V0UHRyKCksIHdzRW5jb2RlLkdldFB0cigpLCB3c0hlYWRlci5HZXRQdHIoKSk7DQorCQlyZXR1cm4gVFJVRTsNCisJfQ0KKwlyZXR1cm4gRkFMU0U7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OlB1dFJlcXVlc3RVUkwoRlhfV1NUUiB3c1VSTCwgRlhfV1NUUiB3c0RhdGEsIEZYX1dTVFIgd3NFbmNvZGUpDQorew0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKHBFbnYpDQorCXsNCisJCXJldHVybiBwRW52LT5GRklfUHV0UmVxdWVzdFVSTCh3c1VSTC5HZXRQdHIoKSwgd3NEYXRhLkdldFB0cigpLCB3c0VuY29kZS5HZXRQdHIoKSk7DQorCX0NCisJcmV0dXJuIEZBTFNFOw0KK30NCisNCit2b2lkIENQREZYRkFfQXBwOjpMb2FkU3RyaW5nKEZYX0lOVDMyIGlTdHJpbmdJRCwgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyaW5nKQ0KK3sNCisJc3dpdGNoIChpU3RyaW5nSUQpDQorCXsNCisJY2FzZSBYRkFfSURTX1ZhbGlkYXRlRmFpbGVkOg0KKwkJd3NTdHJpbmcgPSBMIiVzIHZhbGlkYXRlIGZhaWxlZCI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19DYWxjT3ZlcnJpZGU6DQorCQl3c1N0cmluZyA9IEwiQ2FsY3VsYXRlIE92ZXJyaWRlIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX01vZGlmeUZpZWxkOg0KKwkJd3NTdHJpbmcgPSBMIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBtb2RpZnkgdGhpcyBmaWVsZD8iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfTm90TW9kaWZ5RmllbGQ6DQorCQl3c1N0cmluZyA9IEwiWW91IGFyZSBub3QgYWxsb3dlZCB0byBtb2RpZnkgdGhpcyBmaWVsZC4iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfQXBwTmFtZToNCisJCXdzU3RyaW5nID0gTCJGb3hpdCI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19JbWFnZUZpbHRlcjoNCisJCXdzU3RyaW5nID0gTCJJbWFnZSBGaWxlcygqLmJtcDsqLmpwZzsqLnBuZzsqLmdpZjsqLnRpZil8Ki5ibXA7Ki5qcGc7Ki5wbmc7Ki5naWY7Ki50aWZ8QWxsIEZpbGVzKCouKil8Ki4qfHwiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfVU5LTk9XX0NBVENIRUQ6DQorCQl3c1N0cmluZyA9IEwidW5rbm93biBlcnJvciBpcyBjYXRjaGVkISI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VbmFibGVfVE9fU0VUOg0KKwkJd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1ZBTFVFX0VYQ0FMTUFUT1JZOg0KKwkJd3NTdHJpbmcgPSBMIiB2YWx1ZSEiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5WQUxJRF9FTlVNX1ZBTFVFOg0KKwkJd3NTdHJpbmcgPSBMIkludmFsaWQgZW51bWVyYXRlZCB2YWx1ZTogIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1VOU1VQUE9SVF9NRVRIT0Q6DQorCQl3c1N0cmluZyA9IEwidW5zdXBwb3J0ICVzIG1ldGhvZC4iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfVU5TVVBQT1JUX1BST1A6DQorCQl3c1N0cmluZyA9IEwidW5zdXBwb3J0ICVzIHByb3BlcnR5LiI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19JTlZBbElEX1BST1BfU0VUOg0KKwkJd3NTdHJpbmcgPSBMIkludmFsaWQgcHJvcGVydHkgc2V0IG9wZXJhdGlvbjsiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRToNCisJCXdzU3RyaW5nID0gTCIgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBwcm9wZXJ0eSI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX0xBTkdVQUdFOg0KKwkJd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGFuZ3VhZ2UgdmFsdWUhIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfTlVNUEFHRVM6DQorCQl3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCBudW1QYWdlcyB2YWx1ZSEiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfVU5BQkxFX1NFVF9QTEFURk9STToNCisJCXdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IHBsYXRmb3JtIHZhbHVlISI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX1ZBTElEQVRJT05FTkFCTEU6DQorCQl3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2YWxpZGF0aW9uc0VuYWJsZWQgdmFsdWUhIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfVkFSSUFUSU9OOg0KKwkJd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgdmFyaWF0aW9uIHZhbHVlISI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX1ZFUlNJT046DQorCQl3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2ZXJzaW9uIHZhbHVlISI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX1JFQURZOg0KKwkJd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgcmVhZHkgdmFsdWUhIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05VTUJFUl9PRl9PQ0NVUjoNCisJCXdzU3RyaW5nID0gTCJUaGUgZWxlbWVudCBbJXNdIGhhcyB2aW9sYXRlZCBpdHMgYWxsb3dhYmxlIG51bWJlciBvZiBvY2N1cnJlbmNlcyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX0NMQVNTX05BTUU6DQorCQl3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCBjbGFzc05hbWUgdmFsdWUhIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfTEVOR1RIX1ZBTFVFOg0KKwkJd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGVuZ3RoIHZhbHVlISI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTlNVUFBPUlRfQ0hBUjoNCisJCXdzU3RyaW5nID0gTCJ1bnN1cHBvcnRlZCBjaGFyICclYyciOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfQkFEX1NVRkZJWDoNCisJCXdzU3RyaW5nID0gTCJiYWQgc3VmZml4IG9uIG51bWJlciI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19FWFBFQ1RFRF9JREVOVDoNCisJCXdzU3RyaW5nID0gTCJleHBlY3RlZCBpZGVudGlmaWVyIGluc3RlYWQgb2YgJyVzJyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19FWFBFQ1RFRF9TVFJJTkc6DQorCQl3c1N0cmluZyA9IEwiZXhwZWN0ZWQgJyVzJyBpbnN0ZWFkIG9mICclcyciOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5WQUxJREFURV9DSEFSOg0KKwkJd3NTdHJpbmcgPSBMImludmFsaWRhdGUgY2hhciAnJWMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1JFREVGSU5JVElPTjoNCisJCXdzU3RyaW5nID0gTCInJXMnIHJlZGVmaW5pdGlvbiAiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5WQUxJREFURV9UT0tFTjoNCisJCXdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIHRva2VuICclcyciOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5WQUxJREFURV9FWFBSRVNTSU9OOg0KKwkJd3NTdHJpbmcgPSBMImludmFsaWRhdGUgZXhwcmVzc2lvbiAnJXMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1VOREVGSU5FX0lERU5USUZJRVI6DQorCQl3c1N0cmluZyA9IEwidW5kZWZpbmVkIGlkZW50aWZpZXIgJyVzJyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19JTlZBTElEQVRFX0xFRlRWQUxVRToNCisJCXdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIGxlZnQtdmFsdWUgJyVzJyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19DT01QSUxFUl9FUlJPUjoNCisJCXdzU3RyaW5nID0gTCJjb21waWxlciBlcnJvciI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19DQU5OT1RfTU9ESUZZX1ZBTFVFOg0KKwkJd3NTdHJpbmcgPSBMImNhbid0IG1vZGlmeSB0aGUgJyVzJyB2YWx1ZSI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19FUlJPUl9QQVJBTUVURVJTOg0KKwkJd3NTdHJpbmcgPSBMImZ1bmN0aW9uICclcycgaGFzIG5vdCAlZCBwYXJhbWV0ZXJzIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX0VYUEVDVF9FTkRJRjoNCisJCXdzU3RyaW5nID0gTCJleHBlY3RlZCAnZW5kaWYnIGluc3RlYWQgb2YgJyVzJyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19VTkVYUEVDVEVEX0VYUFJFU1NJT046DQorCQl3c1N0cmluZyA9IEwidW5leHBlY3RlZCBleHByZXNzaW9uICclcyciOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfQ09ORElUSU9OX0lTX05VTEw6DQorCQl3c1N0cmluZyA9IEwiY29uZGl0aW9uIGlzIG51bGwiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSUxMRUdBTEJSRUFLOg0KKwkJd3NTdHJpbmcgPSBMImlsbGVnYWwgYnJlYWsiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSUxMRUdBTENPTlRJTlVFOg0KKwkJd3NTdHJpbmcgPSBMImlsbGVnYWwgY29udGludWUiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfRVhQRUNURURfT1BFUkFUT1I6DQorCQl3c1N0cmluZyA9IEwiZXhwZWN0ZWQgb3BlcmF0b3IgJyVzJyBpbnN0ZWFkIG9mICclcyciOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfRElWSURFX1pFUk86DQorCQl3c1N0cmluZyA9IEwiZGl2aWRlIGJ5IHplcm8iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfQ0FOTk9UX0NPVkVSVF9PQkpFQ1Q6DQorCQl3c1N0cmluZyA9IEwiJXMuJXMgY2FuIG5vdCBjb3ZlcnQgdG8gb2JqZWN0IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05PVF9GT1VORF9DT05UQUlORVI6DQorCQl3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBjb250YWluZXIgJyVzJyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19OT1RfRk9VTkRfUFJPUEVSVFk6DQorCQl3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBwcm9wZXJ0eSAnJXMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05PVF9GT1VORF9NRVRIT0Q6DQorCQl3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBtZXRob2QgJyVzJyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19OT1RfRk9VTkRfQ09OU1Q6DQorCQl3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBjb25zdCAnJXMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05PVF9BU1NJR05fT0JKRUNUOg0KKwkJd3NTdHJpbmcgPSBMImNhbiBub3QgZGlyZWN0IGFzc2lnbiB2YWx1ZSB0byBvYmplY3QiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSVZBTElEQVRFX0lOU1RSVUNUSU9OOg0KKwkJd3NTdHJpbmcgPSBMImludmFsaWRhdGUgaW5zdHJ1Y3Rpb24iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfRVhQRUNUX05VTUJFUjoNCisJCXdzU3RyaW5nID0gTCJleHBlY3RlZCBudW1iZXIgaW5zdGVhZCBvZiAnJXMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1ZBTElEQVRFX09VVF9BUlJBWToNCisJCXdzU3RyaW5nID0gTCJ2YWxpZGF0ZSBhY2Nlc3MgaW5kZXggJyVzJyBvdXQgb2YgYXJyYXkiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfQ0FOTk9UX0FTU0lHTl9JREVOVDoNCisJCXdzU3RyaW5nID0gTCJjYW4gbm90IGFzc2lnbiB0byAlcyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19OT1RfRk9VTlRfRlVOQ1RJT046DQorCQl3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCAnJXMnIGZ1bmN0aW9uIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05PVF9BUlJBWToNCisJCXdzU3RyaW5nID0gTCInJXMnIGRvZXNuJ3QgYW4gYXJyYXkiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfT1VUX0FSUkFZOg0KKwkJd3NTdHJpbmcgPSBMIm91dCBvZiByYW5nZSBvZiAnJXMnIGFycmF5IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05PVF9TVVBQT1JUX0NBTEM6DQorCQl3c1N0cmluZyA9IEwiJyVzJyBvcGVyYXRvciBjYW4gbm90IHN1cHBvcnQgYXJyYXkgY2FsY3VsYXRlIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX0FSR1VNRU5UX05PVF9BUlJBWToNCisJCXdzU3RyaW5nID0gTCInJXMnIGZ1bmN0aW9uJ3MgJWQgYXJndW1lbnQgY2FuIG5vdCBiZSBhcnJheSI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19BUkdVTUVOVF9FWFBFQ1RfQ09OVEFJTkVSOg0KKwkJd3NTdHJpbmcgPSBMIiclcycgYXJndW1lbnQgZXhwZWN0ZWQgYSBjb250YWluZXIiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfQUNDRVNTX1BST1BFUlRZX0lOX05PVF9PQkpFQ1Q6DQorCQl3c1N0cmluZyA9IEwiYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byByZWZlcmVuY2UgcHJvcGVydHkgJyVzJyBvZiBhIG5vbi1vYmplY3QgaW4gU09NIGV4cHJlc3Npb24gJXMiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfRlVOQ1RJT05fSVNfQlVJTERJTjoNCisJCXdzU3RyaW5nID0gTCJmdW5jdGlvbiAnJXMnIGlzIGJ1aWxkaW4iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfRVJST1JfTVNHOg0KKwkJd3NTdHJpbmcgPSBMIiVzIDogJXMiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUzoNCisJCXdzU3RyaW5nID0gTCJJbmRleCB2YWx1ZSBpcyBvdXQgb2YgYm91bmRzIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9EOg0KKwkJd3NTdHJpbmcgPSBMIkluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBjYWxsaW5nIG1ldGhvZCAnJXMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX0FSR1VNRU5UX01JU01BVENIOg0KKwkJd3NTdHJpbmcgPSBMIkFyZ3VtZW50IG1pc21hdGNoIGluIHByb3BlcnR5IG9yIGZ1bmN0aW9uIGFyZ3VtZW50IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX0lOVkFMSURfRU5VTUVSQVRFOg0KKwkJd3NTdHJpbmcgPSBMIkludmFsaWQgZW51bWVyYXRlZCB2YWx1ZTogJXMiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5WQUxJRF9BUFBFTkQ6DQorCQl3c1N0cmluZyA9IEwiSW52YWxpZCBhcHBlbmQgb3BlcmF0aW9uOiAlcyBjYW5ub3QgaGF2ZSBhIGNoaWxkIGVsZW1lbnQgb2YgJXMiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfU09NX0VYUEVDVEVEX0xJU1Q6DQorCQl3c1N0cmluZyA9IEwiU09NIGV4cHJlc3Npb24gcmV0dXJuZWQgbGlzdCB3aGVuIHNpbmdsZSByZXN1bHQgd2FzIGV4cGVjdGVkIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX05PVF9IQVZFX1BST1BFUlRZOg0KKwkJd3NTdHJpbmcgPSBMIiclcycgZG9lc24ndCBoYXZlIHByb3BlcnR5ICclcyciOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfSU5WQUxJRF9OT0RFX1RZUEU6DQorCQl3c1N0cmluZyA9IEwiSW52YWxpZCBub2RlIHR5cGUgOiAnJXMnIjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlk6DQorCQl3c1N0cmluZyA9IEwiVGhlIGVsZW1lbnQgWyVzXSBoYXMgdmlvbGF0ZWQgaXRzIGFsbG93YWJsZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfU0VSVkVSX0RFTlk6DQorCQl3c1N0cmluZyA9IEwiU2VydmVyIGRvZXMgbm90IHBlcm1pdCI7DQorCQlyZXR1cm47DQorCS8qY2FzZSBYRkFfSURTX1N0cmluZ1dlZWtEYXlfU3VuOg0KKwkJd3NTdHJpbmcgPSBMIj+ouaioPyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19TdHJpbmdXZWVrRGF5X01vbjoNCisJCXdzU3RyaW5nID0gTCI/qLmosD8iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfU3RyaW5nV2Vla0RheV9UdWU6DQorCQl3c1N0cmluZyA9IEwiP6i5P3QiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfU3RyaW5nV2Vla0RheV9XZWQ6DQorCQl3c1N0cmluZyA9IEwiP6i5qKh5IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ1dlZWtEYXlfVGh1Og0KKwkJd3NTdHJpbmcgPSBMIj+ouT8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ1dlZWtEYXlfRnJpOg0KKwkJd3NTdHJpbmcgPSBMIj+ouT8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ1dlZWtEYXlfU2F0Og0KKwkJd3NTdHJpbmcgPSBMIj+ouaiiqLQiOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfU3RyaW5nTW9udGhfSmFuOg0KKwkJd3NTdHJpbmcgPSBMIjE/PyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19TdHJpbmdNb250aF9GZWI6DQorCQl3c1N0cmluZyA9IEwiMj8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ01vbnRoX01hcmNoOg0KKwkJd3NTdHJpbmcgPSBMIjM/PyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19TdHJpbmdNb250aF9BcHJpbDoNCisJCXdzU3RyaW5nID0gTCI0Pz8iOw0KKwkJcmV0dXJuOw0KKwljYXNlIFhGQV9JRFNfU3RyaW5nTW9udGhfTWF5Og0KKwkJd3NTdHJpbmcgPSBMIjU/PyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19TdHJpbmdNb250aF9KdW5lOg0KKwkJd3NTdHJpbmcgPSBMIjY/PyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19TdHJpbmdNb250aF9KdWx5Og0KKwkJd3NTdHJpbmcgPSBMIjc/PyI7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19TdHJpbmdNb250aF9BdWc6DQorCQl3c1N0cmluZyA9IEwiOD8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ01vbnRoX1NlcHQ6DQorCQl3c1N0cmluZyA9IEwiOT8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ01vbnRoX09jdDoNCisJCXdzU3RyaW5nID0gTCIxMD8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ01vbnRoX05vdjoNCisJCXdzU3RyaW5nID0gTCIxMT8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ01vbnRoX0RlYzoNCisJCXdzU3RyaW5nID0gTCIxMj8/IjsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1N0cmluZ19Ub2RheToNCisJCXdzU3RyaW5nID0gTCI/P6isqKwiOw0KKwkJcmV0dXJuOyovDQorCWNhc2UgWEZBX0lEU19WYWxpZGF0ZUxpbWl0Og0KKwkJd3NTdHJpbmcgPSBGWF9XU1RSQyhMIk1lc3NhZ2UgbGltaXQgZXhjZWVkZWQuIFJlbWFpbmluZyAlZCB2YWxpZGF0aW9uIGVycm9ycyBub3QgcmVwb3J0ZWQuIik7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19WYWxpZGF0ZU51bGxXYXJuaW5nOg0KKwkJd3NTdHJpbmcgPSBGWF9XU1RSQyhMIiVzIGNhbm5vdCBiZSBsZWZ0IGJsYW5rLiBUbyBpZ25vcmUgdmFsaWRhdGlvbnMgZm9yICVzLCBjbGljayBJZ25vcmUuIik7DQorCQlyZXR1cm47DQorCWNhc2UgWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvcjoNCisJCXdzU3RyaW5nID0gRlhfV1NUUkMoTCIlcyBjYW5ub3QgYmUgbGVmdCBibGFuay4iKTsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1ZhbGlkYXRlV2FybmluZzoNCisJCXdzU3RyaW5nID0gRlhfV1NUUkMoTCJUaGUgdmFsdWUgeW91IGVudGVyZWQgZm9yICVzIGlzIGludmFsaWQuIFRvIGlnbm9yZSB2YWxpZGF0aW9ucyBmb3IgJXMsIGNsaWNrIElnbm9yZS4iKTsNCisJCXJldHVybjsNCisJY2FzZSBYRkFfSURTX1ZhbGlkYXRlRXJyb3I6DQorCQl3c1N0cmluZyA9IEZYX1dTVFJDKEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlcyBpcyBpbnZhbGlkLiIpOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OlNob3dGaWxlRGlhbG9nKEZYX1dTVFIgd3NUaXRsZSwgRlhfV1NUUiB3c0ZpbHRlciwgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmd3NQYXRoQXJyLCBGWF9CT09MIGJPcGVuKQ0KK3sNCisJLy9pZiAobV9wRW52KQ0KKwkvL3sNCisJLy8JcmV0dXJuIG1fcEVudi0+RkZJX1Nob3dGaWxlRGlhbG9nKHdzVGl0bGUuR2V0UHRyKCksIHdzRmlsdGVyLkdldFB0cigpLCB3c1BhdGhBcnIsIGJPcGVuKTsNCisJLy99DQorCXJldHVybiBGQUxTRTsNCit9DQorDQorSUZXTF9BZGFwdGVyVGltZXJNZ3IqIENQREZYRkFfQXBwOjpHZXRUaW1lck1ncigpDQorew0KKwlDWEZBX0ZXTEFkYXB0ZXJUaW1lck1nciogcEFkYXB0ZXIgPSBOVUxMOw0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisJaWYgKHBFbnYpDQorCQlwQWRhcHRlciA9IEZYX05FVyBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncihwRW52KTsNCisJcmV0dXJuIHBBZGFwdGVyOw0KK30NCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTZkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmNwcApAQCAtMCwwICsxLDE0NzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKyANCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZmb3JtZmlsbC5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZzZGtfbWdyLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiDQorDQorDQorDQorI2RlZmluZSBJRFNfWEZBX1N0cmluZ01vbnRoX0FwcmlsICJBcHJpbCINCisjZGVmaW5lIElEU19YRkFfU3RyaW5nTW9udGhfTWF5ICJNYXkiDQorI2RlZmluZSBJRFNfWEZBX1N0cmluZ01vbnRoX0p1bmUgIkp1bmUiDQorI2RlZmluZSBJRFNfWEZBX1N0cmluZ01vbnRoX0p1bHkgIkp1bHkiDQorI2RlZmluZSBJRFNfWEZBX1N0cmluZ01vbnRoX0F1ZyAiQXVndXN0Ig0KKyNkZWZpbmUgSURTX1hGQV9TdHJpbmdNb250aF9TZXB0ICJTZXB0ZW1iZXIiDQorI2RlZmluZSBJRFNfWEZBX1N0cmluZ01vbnRoX09jdCAiT2N0b2JlciINCisjZGVmaW5lIElEU19YRkFfU3RyaW5nTW9udGhfTm92ICJOb3ZlbWJlciINCisjZGVmaW5lIElEU19YRkFfU3RyaW5nTW9udGhfRGVjICJEZWNlbWJlciINCisjZGVmaW5lIElEU19YRkFfU3RyaW5nX1RvZGF5ICAgICJUb2RheSINCisjZGVmaW5lIElEU19YRkFfVmFsaWRhdGVMaW1pdCAgICJNZXNzYWdlIGxpbWl0IGV4Y2VlZGVkLiBSZW1haW5pbmcgJWQgdmFsaWRhdGlvbiBlcnJvcnMgbm90IHJlcG9ydGVkLiINCisjZGVmaW5lIElEU19YRkFfVmFsaWRhdGVfSW5wdXQgICJBdCBsZWFzdCBvbmUgcmVxdWlyZWQgZmllbGQgd2FzIGVtcHR5LiBQbGVhc2UgZmlsbCBpbiB0aGUgcmVxdWlyZWQgZmllbGRzXHJcbihoaWdobGlnaHRlZCkgYmVmb3JlIGNvbnRpbnVpbmcuIg0KKw0KKy8vIHN1Ym1pdA0KKyNkZWZpbmUgRlhGQV9DT05GSUcJCQkJMHgwMDAwMDAwMQ0KKyNkZWZpbmUgRlhGQV9URU1QTEFURQkJCTB4MDAwMDAwMTANCisjZGVmaW5lIEZYRkFfTE9DQUxFU0VUCQkJMHgwMDAwMDEwMA0KKyNkZWZpbmUgRlhGQV9EQVRBU0VUUwkJCTB4MDAwMDEwMDANCisjZGVmaW5lIEZYRkFfWE1QTUVUQQkJCTB4MDAwMTAwMDANCisjZGVmaW5lIEZYRkFfWEZERgkJCQkweDAwMTAwMDAwDQorI2RlZmluZSBGWEZBX0ZPUk0JCQkJMHgwMTAwMDAwMA0KKyNkZWZpbmUgRlhGQV9QREYJCQkJMHgxMDAwMDAwMA0KKw0KKyNpZm5kZWYgX1dJTjMyDQorZXh0ZXJuIHZvaWQgU2V0TGFzdEVycm9yKGludCBlcnIpOw0KKw0KK2V4dGVybiBpbnQgR2V0TGFzdEVycm9yKCk7DQorI2VuZGlmDQorDQorQ1BERlhGQV9Eb2N1bWVudDo6Q1BERlhGQV9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwUERGRG9jLCBDUERGWEZBX0FwcCogcFByb3ZpZGVyKSA6DQorCW1fcFBERkRvYyhwUERGRG9jKSwNCisJbV9wQXBwKHBQcm92aWRlciksDQorCW1fcFhGQURvYyhOVUxMKSwNCisJbV9wWEZBRG9jVmlldyhOVUxMKSwNCisJbV9pRG9jVHlwZShET0NUWVBFX1BERiksDQorCW1fcEpTQ29udGV4dChOVUxMKSwNCisJbV9wU0RLRG9jKE5VTEwpDQorew0KKwltX1hGQVBhZ2VMaXN0LlJlbW92ZUFsbCgpOw0KK30NCisNCitDUERGWEZBX0RvY3VtZW50Ojp+Q1BERlhGQV9Eb2N1bWVudCgpDQorew0KKwlpZiAobV9wUERGRG9jKQ0KKwl7DQorCQlDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopbV9wUERGRG9jLT5HZXRQYXJzZXIoKTsNCisJCWlmIChwUGFyc2VyID09IE5VTEwpIA0KKwkJew0KKwkJIAlkZWxldGUgbV9wUERGRG9jOw0KKwkgCX1lbHNlIA0KKwkJew0KKwkgCQlkZWxldGUgcFBhcnNlcjsNCisJCX0NCisJCW1fcFBERkRvYyA9IE5VTEw7DQorCX0NCisJaWYgKG1fcFhGQURvYykNCisJew0KKwkJSVhGQV9BcHAqIHBBcHAgPSBtX3BBcHAtPkdldFhGQUFwcCgpOw0KKwkJaWYgKHBBcHApIA0KKwkJew0KKwkJCUlYRkFfRG9jSGFuZGxlciogcERvY0hhbmRsZXIgPSBwQXBwLT5HZXREb2NIYW5kbGVyKCk7DQorCQkJaWYgKHBEb2NIYW5kbGVyKQ0KKwkJCXsNCisJCQkJcERvY0hhbmRsZXItPkNsb3NlRG9jKG1fcFhGQURvYyk7DQorCQkJCXBEb2NIYW5kbGVyLT5SZWxlYXNlRG9jKG1fcFhGQURvYyk7DQorCQkJCW1fcFhGQURvYyA9IE5VTEw7DQorCQkJfQkNCisJCX0NCisJfQ0KKw0KKwlpZiAobV9wSlNDb250ZXh0KQ0KKwl7DQorCQlpZiAobV9wU0RLRG9jICYmIG1fcFNES0RvYy0+R2V0RW52KCkpDQorCQl7DQorCQkJbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlJlbGVhc2VDb250ZXh0KG1fcEpTQ29udGV4dCk7DQorCQkJbV9wSlNDb250ZXh0ID0gTlVMTDsNCisJCX0NCisJfQ0KKw0KKwkNCisJaWYgKG1fcFNES0RvYykNCisJCWRlbGV0ZSBtX3BTREtEb2M7DQorCW1fcFNES0RvYyA9IE5VTEw7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6TG9hZFhGQURvYygpDQorew0KKwlpZiAoIW1fcFBERkRvYykgDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCW1fWEZBUGFnZUxpc3QuUmVtb3ZlQWxsKCk7DQorDQorCWludCBpRG9jVHlwZSA9IERPQ1RZUEVfUERGOw0KKwlGWF9CT09MIGhhc1hGQUZpZWxkID0gRlBERl9IYXNYRkFGaWVsZChtX3BQREZEb2MsIGlEb2NUeXBlKTsNCisNCisJaWYgKGhhc1hGQUZpZWxkKQ0KKwl7DQorCQlJWEZBX0FwcCogcEFwcCA9IG1fcEFwcC0+R2V0WEZBQXBwKCk7DQorCQlpZiAocEFwcCkNCisJCXsNCisJCQltX3BYRkFEb2MgPSBwQXBwLT5DcmVhdGVEb2ModGhpcywgbV9wUERGRG9jKTsNCisJCQlpZiAoIW1fcFhGQURvYykNCisJCQl7DQorCQkJCVNldExhc3RFcnJvcihGUERGX0VSUl9YRkFMT0FEKTsNCisJCQkJcmV0dXJuIEZBTFNFOw0KKwkJCX0NCisNCisJCQlJWEZBX0RvY0hhbmRsZXIqIHBEb2NIYW5kbGVyID0gcEFwcC0+R2V0RG9jSGFuZGxlcigpOw0KKwkJCWlmIChwRG9jSGFuZGxlcikNCisJCQl7DQorCQkJCWludCBpU3RhdHVzID0gcERvY0hhbmRsZXItPlN0YXJ0TG9hZChtX3BYRkFEb2MpOw0KKwkJCQlpU3RhdHVzID0gcERvY0hhbmRsZXItPkRvTG9hZChtX3BYRkFEb2MsIE5VTEwpOw0KKwkJCQlpZiAoaVN0YXR1cyAhPSAxMDApIA0KKwkJCQl7DQorCQkJCQlwRG9jSGFuZGxlci0+Q2xvc2VEb2MobV9wWEZBRG9jKTsNCisJCQkJCXBEb2NIYW5kbGVyLT5SZWxlYXNlRG9jKG1fcFhGQURvYyk7DQorCQkJCQltX3BYRkFEb2MgPSBOVUxMOw0KKw0KKwkJCQkJU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOw0KKwkJCQkJcmV0dXJuIEZBTFNFOw0KKwkJCQl9DQorCQkJCXBEb2NIYW5kbGVyLT5TdG9wTG9hZChtX3BYRkFEb2MpOw0KKwkJCQlwRG9jSGFuZGxlci0+U2V0SlNFUnVudGltZShtX3BYRkFEb2MsIG1fcEFwcC0+R2V0SlNFUnVudGltZSgpKTsNCisNCisJCQkJaWYgKHBEb2NIYW5kbGVyLT5HZXREb2NUeXBlKG1fcFhGQURvYykgPT0gWEZBX0RPQ1RZUEVfRHluYW1pYykNCisJCQkJCW1faURvY1R5cGUgPSBET0NUWVBFX0RZTklNSUNfWEZBOw0KKwkJCQllbHNlDQorCQkJCQltX2lEb2NUeXBlID0gRE9DVFlQRV9TVEFUSUNfWEZBOw0KKw0KKwkJCQltX3BYRkFEb2NWaWV3ID0gcERvY0hhbmRsZXItPkNyZWF0ZURvY1ZpZXcobV9wWEZBRG9jLCBYRkFfRE9DVklFV19WaWV3KTsNCisJCQkJRlhTWVNfYXNzZXJ0KG1fcFhGQURvY1ZpZXcpOw0KKw0KKwkJCQlpZiAobV9wWEZBRG9jVmlldy0+U3RhcnRMYXlvdXQoKSA8IDApIA0KKwkJCQl7DQorCQkJCQlwRG9jSGFuZGxlci0+Q2xvc2VEb2MobV9wWEZBRG9jKTsNCisJCQkJCXBEb2NIYW5kbGVyLT5SZWxlYXNlRG9jKG1fcFhGQURvYyk7DQorCQkJCQltX3BYRkFEb2MgPSBOVUxMOw0KKw0KKwkJCQkJU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxBWU9VVCk7DQorCQkJCQlyZXR1cm4gRkFMU0U7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQltX3BYRkFEb2NWaWV3LT5Eb0xheW91dChOVUxMKTsNCisJCQkJCW1fcFhGQURvY1ZpZXctPlN0b3BMYXlvdXQoKTsNCisNCisJCQkJCXJldHVybiBUUlVFOw0KKwkJCQl9CQkJCQ0KKwkJCX0NCisNCisJCQlyZXR1cm4gRkFMU0U7DQorCQl9DQorDQorCQlyZXR1cm4gRkFMU0U7DQorCX0NCisJDQorCXJldHVybiBUUlVFOw0KK30NCisNCitpbnQgQ1BERlhGQV9Eb2N1bWVudDo6R2V0UGFnZUNvdW50KCkNCit7DQorCWlmICghbV9wUERGRG9jICYmICFtX3BYRkFEb2MpDQorCQlyZXR1cm4gMDsNCisNCisJc3dpdGNoIChtX2lEb2NUeXBlKQ0KKwl7DQorCWNhc2UgRE9DVFlQRV9QREY6DQorCWNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOg0KKwkJaWYgKG1fcFBERkRvYykNCisJCQlyZXR1cm4gbV9wUERGRG9jLT5HZXRQYWdlQ291bnQoKTsNCisJY2FzZSBET0NUWVBFX0RZTklNSUNfWEZBOg0KKwkJaWYgKG1fcFhGQURvYykNCisJCQlyZXR1cm4gbV9wWEZBRG9jVmlldy0+Q291bnRQYWdlVmlld3MoKTsNCisJZGVmYXVsdDoNCisJCXJldHVybiAwOw0KKwl9DQorDQorCXJldHVybiAwOw0KK30NCisNCitDUERGWEZBX1BhZ2UqIENQREZYRkFfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IHBhZ2VfaW5kZXgpDQorew0KKwlpZiAoIW1fcFBERkRvYyAmJiAhbV9wWEZBRG9jKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBOVUxMOw0KKwlpZiAobV9YRkFQYWdlTGlzdC5HZXRTaXplKCkpDQorCXsNCisJCXBQYWdlID0gbV9YRkFQYWdlTGlzdC5HZXRBdChwYWdlX2luZGV4KTsNCisJCWlmIChwUGFnZSkNCisJCQlwUGFnZS0+QWRkUmVmKCk7DQorCX0NCisJZWxzZSANCisJew0KKwkJbV9YRkFQYWdlTGlzdC5TZXRTaXplKEdldFBhZ2VDb3VudCgpKTsNCisJfQ0KKw0KKwlpZiAoIXBQYWdlKSANCisJew0KKwkJcFBhZ2UgPSBGWF9ORVcgQ1BERlhGQV9QYWdlKHRoaXMsIHBhZ2VfaW5kZXgpOw0KKwkJRlhfQk9PTCBiUmV0ID0gcFBhZ2UtPkxvYWRQYWdlKCk7DQorCQlpZiAoIWJSZXQpIHsNCisJCQlkZWxldGUgcFBhZ2U7DQorCQkJcmV0dXJuIE5VTEw7DQorCQl9DQorDQorCQltX1hGQVBhZ2VMaXN0LlNldEF0KHBhZ2VfaW5kZXgsIHBQYWdlKTsNCisJfQ0KKw0KKwlyZXR1cm4gcFBhZ2U7DQorfQ0KKw0KK0NQREZYRkFfUGFnZSogQ1BERlhGQV9Eb2N1bWVudDo6R2V0UGFnZShJWEZBX1BhZ2VWaWV3KiBwUGFnZSkNCit7DQorCWlmICghcFBhZ2UpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKCFtX3BYRkFEb2MpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpbnQgblNpemUgPSBtX1hGQVBhZ2VMaXN0LkdldFNpemUoKTsNCisJZm9yIChpbnQgaT0wOyBpPG5TaXplOyBpKyspDQorCXsNCisJCUNQREZYRkFfUGFnZSogcFRlbXBQYWdlID0gbV9YRkFQYWdlTGlzdC5HZXRBdChpKTsNCisJCWlmICghcFRlbXBQYWdlKSBjb250aW51ZTsNCisJCWlmIChwVGVtcFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCkgJiYgcFRlbXBQYWdlLT5HZXRYRkFQYWdlVmlldygpID09IHBQYWdlKQ0KKwkJCXJldHVybiBwVGVtcFBhZ2U7DQorCX0NCisNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6UmVtb3ZlUGFnZShDUERGWEZBX1BhZ2UqIHBhZ2UpDQorew0KKwltX1hGQVBhZ2VMaXN0LlNldEF0KHBhZ2UtPkdldFBhZ2VJbmRleCgpLCBOVUxMKTsNCit9DQorDQorQ1BERlNES19Eb2N1bWVudCogQ1BERlhGQV9Eb2N1bWVudDo6R2V0U0RLRG9jdW1lbnQoQ1BERkRvY19FbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KQ0KK3sNCisJaWYgKCFwRm9ybUZpbGxFbnYpDQorCQlyZXR1cm4gbV9wU0RLRG9jOw0KKw0KKwlpZiAobV9wU0RLRG9jKQ0KKwkJcmV0dXJuIG1fcFNES0RvYzsNCisNCisJbV9wU0RLRG9jID0gbmV3IENQREZTREtfRG9jdW1lbnQodGhpcywgcEZvcm1GaWxsRW52KTsNCisJaWYgKCFtX3BTREtEb2MpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJcmV0dXJuIG1fcFNES0RvYzsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpSZWxlYXNlU0RLRG9jKCkNCit7DQorCWlmIChtX3BTREtEb2MpDQorCQlkZWxldGUgbV9wU0RLRG9jOw0KKw0KKwltX3BTREtEb2MgPSBOVUxMOw0KK30NCisNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkZYUmVjdDJQREZSZWN0KGNvbnN0IENGWF9SZWN0RiYgZnhSZWN0RiwgQ1BERl9SZWN0JiBwZGZSZWN0KQ0KK3sNCisJcGRmUmVjdC5sZWZ0ID0gZnhSZWN0Ri5sZWZ0Ow0KKwlwZGZSZWN0LnRvcCA9IGZ4UmVjdEYuYm90dG9tKCk7DQorCXBkZlJlY3QucmlnaHQgPSBmeFJlY3RGLnJpZ2h0KCk7DQorCXBkZlJlY3QuYm90dG9tID0gZnhSZWN0Ri50b3A7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRDaGFuZ2VNYXJrKFhGQV9IRE9DIGhEb2MpDQorew0KKwlpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKQ0KKwl7DQorCQltX3BTREtEb2MtPlNldENoYW5nZU1hcmsoKTsNCisJfQ0KK30NCisNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldENoYW5nZU1hcmsoWEZBX0hET0MgaERvYykNCit7DQorCWlmIChoRG9jID09IG1fcFhGQURvYyAmJiBtX3BTREtEb2MpDQorCQlyZXR1cm4gbV9wU0RLRG9jLT5HZXRDaGFuZ2VNYXJrKCk7DQorCXJldHVybiBGQUxTRTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENGWF9SZWN0RiYgcnQsIEZYX0RXT1JEIGR3RmxhZ3MgLyogPSAwICovKQ0KK3sNCisJaWYgKCFtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisJCXJldHVybjsNCisNCisJaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkNCisJCXJldHVybjsNCisNCisJQ1BERl9SZWN0IHJjUGFnZTsNCisJRlhSZWN0MlBERlJlY3QocnQsIHJjUGFnZSk7DQorDQorCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBQYWdlVmlldyk7DQorDQorCWlmIChwUGFnZSA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKw0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisJaWYgKCFwRW52KQ0KKwkJcmV0dXJuOw0KKw0KKwlwRW52LT5GRklfSW52YWxpZGF0ZSgoRlBERl9QQUdFKXBQYWdlLCByY1BhZ2UubGVmdCwgcmNQYWdlLmJvdHRvbSwgcmNQYWdlLnJpZ2h0LCByY1BhZ2UudG9wKTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzIC8qID0gMCAqLykNCit7DQorCWlmICghaFdpZGdldCkNCisJCXJldHVybjsNCisNCisJaWYgKCFtX3BYRkFEb2MgfHwgIW1fcFNES0RvYyB8fCAhbV9wWEZBRG9jVmlldykNCisJCXJldHVybjsNCisJDQorCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQorCQlyZXR1cm47DQorDQorCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQorCWlmICghcFdpZGdldEhhbmRsZXIpDQorCQlyZXR1cm47DQorDQorCUlYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXRIYW5kbGVyLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCisJaWYgKCFwUGFnZVZpZXcpDQorCQlyZXR1cm47DQorDQorCUNGWF9SZWN0RiByZWN0Ow0KKwlwV2lkZ2V0SGFuZGxlci0+R2V0UmVjdChoV2lkZ2V0LCByZWN0KTsNCisJSW52YWxpZGF0ZVJlY3QocFBhZ2VWaWV3LCByZWN0LCBkd0ZsYWdzKTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpEaXNwbGF5Q2FyZXQoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ0ZYX1JlY3RGKiBwUnRBbmNob3IpDQorew0KKwlpZiAoIWhXaWRnZXQgfHwgcFJ0QW5jaG9yID09IE5VTEwpIA0KKwkJcmV0dXJuOw0KKw0KKwlpZiAoIW1fcFhGQURvYyB8fCAhbV9wU0RLRG9jIHx8ICFtX3BYRkFEb2NWaWV3KQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKwkJcmV0dXJuOw0KKw0KKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOw0KKwlpZiAoIXBXaWRnZXRIYW5kbGVyKQ0KKwkJcmV0dXJuOw0KKw0KKwlJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0SGFuZGxlci0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorCWlmICghcFBhZ2VWaWV3KQ0KKwkJcmV0dXJuOw0KKw0KKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UGFnZShwUGFnZVZpZXcpOw0KKw0KKwlpZiAocFBhZ2UgPT0gTlVMTCkNCisJCXJldHVybjsNCisNCisJQ1BERl9SZWN0IHJjQ2FyZXQ7DQorCUZYUmVjdDJQREZSZWN0KCpwUnRBbmNob3IsIHJjQ2FyZXQpOw0KKw0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisJaWYgKCFwRW52KQ0KKwkJcmV0dXJuOw0KKw0KKwlwRW52LT5GRklfRGlzcGxheUNhcmV0KChGUERGX1BBR0UpcFBhZ2UsIGJWaXNpYmxlLCByY0NhcmV0LmxlZnQsIHJjQ2FyZXQudG9wLCByY0NhcmV0LnJpZ2h0LCByY0NhcmV0LmJvdHRvbSk7DQorDQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6R2V0UG9wdXBQb3MoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRkxPQVQgZk1pblBvcHVwLCBGWF9GTE9BVCBmTWF4UG9wdXAsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkNCit7DQorCWlmIChOVUxMID09IGhXaWRnZXQpDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwlJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCktPkdldFBhZ2VWaWV3KGhXaWRnZXQpOw0KKwlpZiAoTlVMTCA9PSBwWEZBUGFnZVZpZXcpDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UGFnZShwWEZBUGFnZVZpZXcpOw0KKwlpZiAocFBhZ2UgPT0gTlVMTCkNCisJCXJldHVybiBGQUxTRTsNCisNCisJQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCktPkdldERhdGFBY2MoaFdpZGdldCk7DQorDQorCWludCBuUm90YXRlID0gcFdpZGdldEFjYy0+R2V0Um90YXRlKCk7DQorCQ0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisJaWYgKHBFbnYgPT0gTlVMTCkNCisJCXJldHVybiBGQUxTRTsNCisJRlNfUkVDVEYgcGFnZVZpZXdSZWN0Ow0KKwlwRW52LT5GRklfR2V0UGFnZVZpZXdSZWN0KHBQYWdlLCBwYWdlVmlld1JlY3QpOw0KKw0KKwlDUERGX1JlY3QgcmNBbmNob3I7DQorDQorCXJjQW5jaG9yLmxlZnQgPSBydEFuY2hvci5sZWZ0Ow0KKwlyY0FuY2hvci50b3AgPSBydEFuY2hvci5ib3R0b20oKTsNCisJcmNBbmNob3IucmlnaHQgPSBydEFuY2hvci5yaWdodCgpOw0KKwlyY0FuY2hvci5ib3R0b20gPSBydEFuY2hvci50b3A7DQorCQ0KKwlpbnQgdDEsdDIsdDsNCisJRlhfRFdPUkQgZHdQb3M7IEZYX0ZMT0FUIGZQb3VwSGVpZ2h0Ow0KKwlzd2l0Y2goblJvdGF0ZSkNCisJew0KKwkJDQorCWNhc2UgOTA6DQorCQl7DQorCQkJdDEgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7DQorIAkJCXQyID0gKGludCkocmNBbmNob3IubGVmdCAgLSBwYWdlVmlld1JlY3QubGVmdCk7DQorCQkJaWYgKHJjQW5jaG9yLmJvdHRvbSA8IHBhZ2VWaWV3UmVjdC5ib3R0b20pIA0KKwkJCXsNCisJCQkJcnRQb3B1cC5sZWZ0ICs9IHJjQW5jaG9yLmJvdHRvbSAtIHBhZ2VWaWV3UmVjdC5ib3R0b207DQorCQkJfQ0KKwkJIA0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJDQorCWNhc2UgMTgwOg0KKwkJew0KKwkJCXQyID0gKGludCkocGFnZVZpZXdSZWN0LnRvcCAtIHJjQW5jaG9yLnRvcCk7DQorCQkJdDEgPSAoaW50KShyY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tKTsgDQorCQkJaWYgKHJjQW5jaG9yLmxlZnQgPCBwYWdlVmlld1JlY3QubGVmdCkgDQorCQkJew0KKwkJCQlydFBvcHVwLmxlZnQgKz0gcmNBbmNob3IubGVmdCAtIHBhZ2VWaWV3UmVjdC5sZWZ0OyANCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCWNhc2UgMjcwOg0KKwkJew0KKwkJCXQxID0gKGludCkocmNBbmNob3IubGVmdCAgLSBwYWdlVmlld1JlY3QubGVmdCk7DQorCQkJdDIgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7DQorIAkJDQorCQkJaWYgKHJjQW5jaG9yLnRvcCA+IHBhZ2VWaWV3UmVjdC50b3ApIA0KKwkJCXsNCisJCQkJcnRQb3B1cC5sZWZ0IC09IHJjQW5jaG9yLnRvcCAtIHBhZ2VWaWV3UmVjdC50b3A7IA0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJY2FzZSAwOg0KKwlkZWZhdWx0Og0KKwkJew0KKwkJCXQxID0gKGludCkocGFnZVZpZXdSZWN0LnRvcCAtIHJjQW5jaG9yLnRvcCk7DQorCQkJdDIgPSAoaW50KShyY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tKTsgDQorCQkJaWYgKHJjQW5jaG9yLnJpZ2h0ID4gcGFnZVZpZXdSZWN0LnJpZ2h0KSANCisJCQl7DQorCQkJCXJ0UG9wdXAubGVmdCAtPSByY0FuY2hvci5yaWdodCAtIHBhZ2VWaWV3UmVjdC5yaWdodDsgDQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJDQorCX0NCisNCisJaWYgKHQxIDw9IDAgJiYgdDIgPD0gMCkNCisJew0KKwkJcmV0dXJuIEZBTFNFOw0KKwl9DQorCWlmICh0MSA8PSAwKQ0KKwl7DQorCQl0ID0gdDI7DQorCQlkd1BvcyA9IDE7DQorCX0NCisJZWxzZSBpZih0MiA8PSAwKQ0KKwl7DQorCQl0ID0gdDE7DQorCQlkd1BvcyA9IDA7DQorCX0NCisJZWxzZSBpZiAodDEgPiB0MiApDQorCXsNCisJCXQgPSB0MTsNCisJCWR3UG9zID0gMDsNCisJfQ0KKwllbHNlIA0KKwl7DQorCQl0ID0gdDI7DQorCQlkd1BvcyA9IDE7DQorCX0NCisJaWYgKHQ8Zk1pblBvcHVwKQ0KKwl7DQorCQlmUG91cEhlaWdodCA9IGZNaW5Qb3B1cDsNCisJfQ0KKwllbHNlIGlmICh0ID4gZk1heFBvcHVwKQ0KKwl7DQorCQlmUG91cEhlaWdodCA9IGZNYXhQb3B1cDsNCisJfQ0KKwllbHNlDQorCXsNCisJCWZQb3VwSGVpZ2h0ID0gKEZYX0ZMT0FUKXQ7DQorCX0NCisNCisJc3dpdGNoKG5Sb3RhdGUpDQorCXsNCisJCQ0KKwljYXNlIDA6DQorCWNhc2UgMTgwOg0KKwkJew0KKwkJCWlmIChkd1BvcyA9PSAwKQ0KKwkJCXsNCisJCQkJcnRQb3B1cC50b3AgPSBydEFuY2hvci5oZWlnaHQ7DQorCQkJCXJ0UG9wdXAuaGVpZ2h0ID0gZlBvdXBIZWlnaHQ7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJ0UG9wdXAudG9wID0gLSBmUG91cEhlaWdodDsNCisJCQkJcnRQb3B1cC5oZWlnaHQgPSBmUG91cEhlaWdodDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCWNhc2UgIDkwOg0KKwljYXNlICAyNzA6DQorCQl7DQorCQkJaWYgKGR3UG9zID09IDApDQorCQkJew0KKwkJCQlydFBvcHVwLnRvcCA9IHJ0QW5jaG9yLndpZHRoOw0KKwkJCQlydFBvcHVwLmhlaWdodCA9IGZQb3VwSGVpZ2h0Ow0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlydFBvcHVwLnRvcCA9IC0gZlBvdXBIZWlnaHQ7DQorCQkJCXJ0UG9wdXAuaGVpZ2h0ID0gZlBvdXBIZWlnaHQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwlkZWZhdWx0Og0KKwkJCWJyZWFrOw0KKwl9DQorCQ0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorRlhfQk9PTAlDUERGWEZBX0RvY3VtZW50OjpQb3B1cE1lbnUoWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1BvaW50RiBwdFBvcHVwLCBjb25zdCBDRlhfUmVjdEYqIHBSZWN0RXhjbHVkZSkNCit7DQorCWlmIChOVUxMID09IGhXaWRnZXQpDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwlJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCktPkdldFBhZ2VWaWV3KGhXaWRnZXQpOw0KKwlpZiAocFhGQVBhZ2VWaWV3ID09IE5VTEwpDQorCQlyZXR1cm4gRkFMU0U7DQorCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBYRkFQYWdlVmlldyk7DQorDQorCWlmIChwUGFnZSA9PSBOVUxMKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKw0KKwlpbnQgbWVudUZsYWcgPSAwOw0KKw0KKwlJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9IG1fcEFwcC0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7DQorCWlmIChwWEZBTWVudUhhbmRlci0+Q2FuVW5kbyhoV2lkZ2V0KSkNCisJCW1lbnVGbGFnIHw9IEZYRkFfTUVNVV9VTkRPOw0KKwlpZiAocFhGQU1lbnVIYW5kZXItPkNhblJlZG8oaFdpZGdldCkpDQorCQltZW51RmxhZyB8PSBGWEZBX01FTVVfUkVETzsNCisJaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5QYXN0ZShoV2lkZ2V0KSkNCisJCW1lbnVGbGFnIHw9IEZYRkFfTUVNVV9QQVNURTsNCisJaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5Db3B5KGhXaWRnZXQpKQ0KKwkJbWVudUZsYWcgfD0gRlhGQV9NRU1VX0NPUFk7DQorCWlmIChwWEZBTWVudUhhbmRlci0+Q2FuQ3V0KGhXaWRnZXQpKQ0KKwkJbWVudUZsYWcgfD0gRlhGQV9NRU1VX0NVVDsNCisJaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5TZWxlY3RBbGwoaFdpZGdldCkpDQorCQltZW51RmxhZyB8PSBGWEZBX01FTVVfU0VMRUNUQUxMOw0KKw0KKw0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisJaWYgKHBFbnYgPT0gTlVMTCkNCisJCXJldHVybiBGQUxTRTsNCisNCisJcmV0dXJuIHBFbnYtPkZGSV9Qb3B1cE1lbnUocFBhZ2UsIGhXaWRnZXQsIG1lbnVGbGFnLCBwdFBvcHVwLCBOVUxMKTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpQYWdlVmlld0V2ZW50KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfRFdPUkQgZHdGbGFncykNCit7DQorCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQorCQlyZXR1cm47DQorDQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKw0KKwlDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UGFnZShwUGFnZVZpZXcpOw0KKwlpZiAocFBhZ2UgPT0gTlVMTCkNCisJCXJldHVybjsNCisNCisJaWYgKGR3RmxhZ3MgPT0gRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RBRERFRCkNCisJew0KKwkJLy9wRW52LT5GRklfUGFnZUV2ZW50KHBQYWdlLCBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVEFEREVEKTsNCisJfQ0KKwllbHNlIGlmIChkd0ZsYWdzID09IEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUUkVNT1ZFRCkNCisJew0KKwkJLy9wRW52LT5GRklfUGFnZUV2ZW50KHBQYWdlLCBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVFJFTU9WRUQpOw0KKwkJLy9SZW1vdmVQYWdlKHBQYWdlKTsNCisJCS8vZGVsZXRlIHBQYWdlOw0KKwl9DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6V2lkZ2V0RXZlbnQoWEZBX0hXSURHRVQgaFdpZGdldCwgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXREYXRhLCBGWF9EV09SRCBkd0V2ZW50LCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcEFkZGl0aW9uYWwpDQorew0KKwlpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBIHx8IE5VTEwgPT0gaFdpZGdldCkNCisJCXJldHVybjsNCisJDQorCWludCBwYWdlVmlld0NvdW50ID0gbV9wU0RLRG9jLT5HZXRQYWdlVmlld0NvdW50KCk7DQorDQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAoTlVMTCA9PSBoV2lkZ2V0KSByZXR1cm47DQorDQorCUlYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKS0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorDQorCWlmIChwUGFnZVZpZXcgPT0gTlVMTCkNCisJCXJldHVybjsNCisJQ1BERlhGQV9QYWdlKiBwWEZBUGFnZSA9IEdldFBhZ2UocFBhZ2VWaWV3KTsNCisJaWYgKHBYRkFQYWdlID09IE5VTEwpDQorCQlyZXR1cm47DQorDQorCUNQREZTREtfUGFnZVZpZXcqIHBTZGtQYWdlVmlldyA9IG1fcFNES0RvYy0+R2V0UGFnZVZpZXcocFhGQVBhZ2UpOw0KKw0KKwlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOw0KKw0KKw0KKwlpZiAoZHdFdmVudCA9PSBYRkFfV0lER0VURVZFTlRfUG9zdEFkZGVkKQ0KKwl7DQorLy8gCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gcEFubm90SGFuZGxlck1nci0+TmV3QW5ub3QoaFdpZGdldCwgcFNka1BhZ2VWaWV3KTsNCisvLyAJCQlwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxvYWQocEFubm90KTsNCisNCisJCQkvL3BFbnYtPkZGSV9XaWRnZXRFdmVudChoV2lkZ2V0LCBYRkFfV0lER0VURVZFTlRfUG9zdEFkZGVkKTsNCisvLyAJCUlYRkFfUGFnZVZpZXcqIHBPbGRQYWdlVmlldyA9IChJWEZBX1BhZ2VWaWV3KilwQWRkaXRpb25hbDsNCisvLyAJCWlmIChwT2xkUGFnZVZpZXcpDQorLy8gCQl7DQorLy8gCQkJQ1BERlhGQV9QYWdlKiBwRGVzdFBhZ2UgPSBtX3BTREtEb2MtPkdldFBhZ2VWaWV3KChJWEZBX1BhZ2VWaWV3KilwT2xkUGFnZVZpZXcpOw0KKy8vIAkJCUFTU0VSVChwRGVzdFBhZ2UpOw0KKy8vIAkJCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBEZXN0UGFnZS0+R2V0QW5ub3RCeVhGQVdpZGdldChoV2lkZ2V0KTsNCisvLyAJCQlpZiAocEFubm90KQ0KKy8vIAkJCXsNCisvLyAJCQkJaWYgKG1fcFNES0RvYy0+R2V0Rm9jdXNBbm5vdCgpID09IHBBbm5vdCkNCisvLyAJCQkJew0KKy8vIAkJCQkJbV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KE5VTEwpOw0KKy8vIAkJCQl9DQorLy8gCQkJCXBEZXN0UGFnZS0+RGVsZXRlQW5ub3QocEFubm90KTsNCisvLyAJCQl9DQorLy8gCQl9DQorCQlwU2RrUGFnZVZpZXctPkFkZEFubm90KGhXaWRnZXQpOw0KKw0KKwl9DQorCWVsc2UgaWYgKGR3RXZlbnQgPT0gWEZBX1dJREdFVEVWRU5UX1ByZVJlbW92ZWQpDQorCXsJDQorCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwU2RrUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaFdpZGdldCk7DQorCQlpZiAocEFubm90KSB7DQorCQkJcFNka1BhZ2VWaWV3LT5EZWxldGVBbm5vdChwQW5ub3QpOw0KKwkJCS8vcEVudi0+RkZJX1dpZGdldEV2ZW50KGhXaWRnZXQsIFhGQV9XSURHRVRFVkVOVF9QcmVSZW1vdmVkKTsNCisJCX0NCisJfQ0KK30NCisNCitGWF9JTlQzMiBDUERGWEZBX0RvY3VtZW50OjpDb3VudFBhZ2VzKFhGQV9IRE9DIGhEb2MpDQorew0KKwlpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKQ0KKwl7DQorCQlyZXR1cm4gR2V0UGFnZUNvdW50KCk7DQorCX0NCisJcmV0dXJuIDA7DQorfQ0KK0ZYX0lOVDMyIENQREZYRkFfRG9jdW1lbnQ6OkdldEN1cnJlbnRQYWdlKFhGQV9IRE9DIGhEb2MpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisJCXJldHVybiAtMTsNCisJaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkNCisJCXJldHVybiAtMTsNCisNCisJDQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuIC0xOw0KKw0KKwlyZXR1cm4gcEVudi0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgodGhpcyk7DQorfQ0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0Q3VycmVudFBhZ2UoWEZBX0hET0MgaERvYywgRlhfSU5UMzIgaUN1clBhZ2UpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisJCXJldHVybjsNCisJaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkNCisJCXJldHVybjsNCisJCQ0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisJaWYgKHBFbnYgPT0gTlVMTCkNCisJCXJldHVybjsNCisNCisJcEVudi0+RkZJX1NldEN1cnJlbnRQYWdlKHRoaXMsIGlDdXJQYWdlKTsNCit9DQorRlhfQk9PTAlDUERGWEZBX0RvY3VtZW50OjpJc0NhbGN1bGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYykNCit7DQorCWlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKwlpZiAobV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkNCisJCXJldHVybiBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5Jc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKTsNCisNCisJcmV0dXJuIEZBTFNFOw0KKw0KK30NCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlNldENhbGN1bGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYywgRlhfQk9PTCBiRW5hYmxlZCkNCit7DQorCWlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KKwkJcmV0dXJuOw0KKwlpZiAobV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkNCisJCW1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCktPlhmYUVuYWJsZUNhbGN1bGF0ZShiRW5hYmxlZCk7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6R2V0VGl0bGUoWEZBX0hET0MgaERvYywgQ0ZYX1dpZGVTdHJpbmcgJndzVGl0bGUpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorCQlyZXR1cm47DQorCWlmIChtX3BQREZEb2MgPT0gTlVMTCkNCisJCXJldHVybjsNCisJQ1BERl9EaWN0aW9uYXJ5KiBwSW5mb0RpY3QgPSBtX3BQREZEb2MtPkdldEluZm8oKTsNCisNCisJaWYgKHBJbmZvRGljdCA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKwkNCisJQ0ZYX0J5dGVTdHJpbmcgY3NUaXRsZSA9IHBJbmZvRGljdC0+R2V0U3RyaW5nKCJUaXRsZSIpOw0KKyAgICB3c1RpdGxlID0gd3NUaXRsZS5Gcm9tTG9jYWwoY3NUaXRsZS5HZXRCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSkpOw0KKwljc1RpdGxlLlJlbGVhc2VCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0VGl0bGUoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c1RpdGxlKQ0KK3sNCisJaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKwkJcmV0dXJuOw0KKwlpZiAobV9wUERGRG9jID09IE5VTEwpDQorCQlyZXR1cm47DQorCUNQREZfRGljdGlvbmFyeSogcEluZm9EaWN0ID0gbV9wUERGRG9jLT5HZXRJbmZvKCk7DQorDQorCWlmIChwSW5mb0RpY3QgPT0gTlVMTCkNCisJCXJldHVybjsNCisJcEluZm9EaWN0LT5TZXRBdCgiVGl0bGUiLCBGWF9ORVcgQ1BERl9TdHJpbmcod3NUaXRsZSkpOw0KK30NCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkV4cG9ydERhdGEoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c0ZpbGVQYXRoLCBGWF9CT09MIGJYRFApDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorCQlyZXR1cm47DQorCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEgJiYgbV9pRG9jVHlwZSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpDQorCQlyZXR1cm47DQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKwlpbnQgZmlsZVR5cGUgPSBiWERQP0ZYRkFfU0FWRUFTX1hEUDpGWEZBX1NBVkVBU19YTUw7DQorCUNGWF9CeXRlU3RyaW5nIGJzID0gQ0ZYX1dpZGVTdHJpbmcod3NGaWxlUGF0aCkuVVRGMTZMRV9FbmNvZGUoKTsNCisNCisJaWYgKHdzRmlsZVBhdGguSXNFbXB0eSgpKSB7DQorCQlpZiAoIXBFbnYtPkdldEZvcm1GaWxsSW5mbygpIHx8IHBFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtID09IE5VTEwpDQorCQkJcmV0dXJuOw0KKwkJQ0ZYX1dpZGVTdHJpbmcgZmlsZXBhdGggPSBwRW52LT5KU19maWVsZEJyb3dzZSgpOw0KKwkJYnMgPSBmaWxlcGF0aC5VVEYxNkxFX0VuY29kZSgpOw0KKwl9DQorCWludCBsZW4gPSBicy5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOw0KKwlGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoYlhEUD9GWEZBX1NBVkVBU19YRFA6RlhGQV9TQVZFQVNfWE1MLCAoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksICJ3YiIpOw0KKwlicy5SZWxlYXNlQnVmZmVyKGxlbipzaXplb2YodW5zaWduZWQgc2hvcnQpKTsNCisNCisJaWYgKHBGaWxlSGFuZGxlciA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKw0KKwlDRlBERl9GaWxlU3RyZWFtIGZpbGVXcml0ZShwRmlsZUhhbmRsZXIpOw0KKw0KKwlJWEZBX0RvY0hhbmRsZXIgKnBYRkFEb2NIYW5kZXIgPSBtX3BBcHAtPkdldFhGQUFwcCgpLT5HZXREb2NIYW5kbGVyKCk7DQorCUNGWF9CeXRlU3RyaW5nIGNvbnRlbnQ7DQorCWlmIChmaWxlVHlwZSA9PSBGWEZBX1NBVkVBU19YTUwpDQorCXsNCisJCWNvbnRlbnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XHJcbiI7DQorCQlmaWxlV3JpdGUuV3JpdGVCbG9jaygoRlhfTFBDU1RSKWNvbnRlbnQsIGZpbGVXcml0ZS5HZXRTaXplKCksIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KKwkJQ0ZYX1dpZGVTdHJpbmdDIGRhdGEoTCJkYXRhIik7DQorCQlpZiggcFhGQURvY0hhbmRlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jVmlldy0+R2V0RG9jKCksZGF0YSwgJmZpbGVXcml0ZSkpDQorCQl7DQorCQkJTlVMTDsNCisJCX0NCisJfQ0KKwkvKmVsc2UgaWYgKGZpbGVUeXBlID09IEZYRkFfRklMRV9TVEFUSUNfWERQKQ0KKwl7DQorCQljb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxyXG4iOw0KKwkJZmlsZVdyaXRlLldyaXRlQmxvY2soKEZYX0xQQ1NUUiljb250ZW50LCBmaWxlV3JpdGUuR2V0U2l6ZSgpLCBjb250ZW50LkdldExlbmd0aCgpKTsNCisJCUNGWF9XaWRlU3RyaW5nQyBkYXRhKEwiZGF0YSIpOw0KKwkJaWYoIHBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBkYXRhLCAmZmlsZVdyaXRlKSkNCisJCXsNCisJCQlOVUxMOw0KKwkJfQ0KKwkJQ0ZYX1dpZGVTdHJpbmcgd1BhdGggPSBwRW52LT5GRklfR2V0RmlsZVBhdGgocEZpbGVIYW5kbGVyKTsNCisvLyAJCUNGWF9XaWRlU3RyaW5nIHdQYXRoOw0KKy8vIAkJd1BhdGguRnJvbVVURjE2TEUoZmlsZVBhdGgpOw0KKwkJQ0ZYX0J5dGVTdHJpbmcgYlBhdGggPSB3UGF0aC5VVEY4RW5jb2RlKCk7DQorCQlDRlhfQnl0ZVN0cmluZyBzekZvcm1hdCA9ICJcbjxwZGYgaHJlZj1cIiVzXCIgeG1sbnM9XCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvXCIvPiI7DQorCQljb250ZW50LkZvcm1hdChzekZvcm1hdCwoY2hhciopKEZYX0xQQ1NUUiliUGF0aCk7DQorCQlmaWxlV3JpdGUuV3JpdGVCbG9jaygoRlhfTFBDU1RSKWNvbnRlbnQsZmlsZVdyaXRlLkdldFNpemUoKSwgY29udGVudC5HZXRMZW5ndGgoKSk7DQorCX0NCisJKi8NCisJZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWERQKQ0KKwl7CQ0KKwkJaWYgKG1fcFBERkRvYyA9PSBOVUxMKQ0KKwkJCXJldHVybjsNCisJCUNQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsNCisJCWlmIChwUm9vdCA9PSBOVUxMKQ0KKwkJCXJldHVybjsNCisJCUNQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7DQorCQlpZiAoTlVMTCA9PSBwQWNyb0Zvcm0pDQorCQkJcmV0dXJuOw0KKwkJQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOw0KKwkJaWYgKHBYRkEgPT0gTlVMTCkNCisJCQlyZXR1cm47DQorCQlpZiAocFhGQS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkNCisJCQlyZXR1cm47DQorCQlDUERGX0FycmF5KiBwQXJyYXkgPSBwWEZBLT5HZXRBcnJheSgpOw0KKwkJaWYgKE5VTEwgPT0gcEFycmF5KQ0KKwkJCXJldHVybjsNCisJCWludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOw0KKwkJaW50IGlGb3JtSW5kZXggPSAtMTsNCisJCWludCBpRGF0YVNldHNJbmRleCA9IC0xOw0KKwkJZm9yIChpbnQgaT0xOyBpPHNpemU7aSs9MikNCisJCXsNCisJCQlDUERGX09iamVjdCogcFBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsNCisJCQlDUERGX09iamVjdCogcFByZVBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpLTEpOw0KKwkJCWlmKHBQcmVQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpDQorCQkJCWNvbnRpbnVlOw0KKwkJCUNQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFBERk9iai0+R2V0RGlyZWN0KCk7DQorCQkJaWYocERpcmVjdE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pDQorCQkJCWNvbnRpbnVlOw0KKwkJCWlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKT09ImZvcm0iKQ0KKwkJCXsNCisJCQkJQ0ZYX1dpZGVTdHJpbmdDIGZvcm0oTCJmb3JtIik7DQorCQkJCXBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBmb3JtLCAmZmlsZVdyaXRlKTsNCisJCQl9DQorCQkJZWxzZSBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJkYXRhc2V0cyIpDQorCQkJew0KKwkJCQlDRlhfV2lkZVN0cmluZ0MgZGF0YXNldHMoTCJkYXRhc2V0cyIpOw0KKwkJCQlwWEZBRG9jSGFuZGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2NWaWV3LT5HZXREb2MoKSwgZGF0YXNldHMsICZmaWxlV3JpdGUpOw0KKwkJCX0NCisJCQllbHNlIA0KKwkJCXsJDQorCQkJCWlmIChpID09IHNpemUtMSkNCisJCQkJew0KKwkJCQkJLy9DRlhfV2lkZVN0cmluZyB3UGF0aCA9IHBFbnYtPkZGSV9HZXRGaWxlUGF0aChwRmlsZUhhbmRsZXIpOw0KKwkJCQkJQ0ZYX1dpZGVTdHJpbmcgd1BhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KikoRlhfTFBDU1RSKWJzLCBicy5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpKTsNCisJCQkJCUNGWF9CeXRlU3RyaW5nIGJQYXRoID0gd1BhdGguVVRGOEVuY29kZSgpOw0KKwkJCQkJQ0ZYX0J5dGVTdHJpbmcgc3pGb3JtYXQgPSAiXG48cGRmIGhyZWY9XCIlc1wiIHhtbG5zPVwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvcGRmL1wiLz4iOw0KKwkJCQkJY29udGVudC5Gb3JtYXQoc3pGb3JtYXQsKGNoYXIqKShGWF9MUENTVFIpYlBhdGgpOw0KKwkJCQkJZmlsZVdyaXRlLldyaXRlQmxvY2soKEZYX0xQQ1NUUiljb250ZW50LGZpbGVXcml0ZS5HZXRTaXplKCksIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KKwkJCQl9DQorDQorCQkJCUNQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwRGlyZWN0T2JqOw0KKwkJCQlDUERGX1N0cmVhbUFjYyogcEFjYyA9IEZYX05FVyBDUERGX1N0cmVhbUFjYzsNCisJCQkJcEFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSk7DQorCQkJCWZpbGVXcml0ZS5Xcml0ZUJsb2NrKHBBY2MtPkdldERhdGEoKSwgZmlsZVdyaXRlLkdldFNpemUoKSwgcEFjYy0+R2V0U2l6ZSgpKTsNCisJCQkJZGVsZXRlIHBBY2M7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCUZYX0JPT0wgYkVycm9yPSBmaWxlV3JpdGUuRmx1c2goKTsNCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbXBvcnREYXRhKFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NGaWxlUGF0aCkNCit7DQorCS8vVE9ETy4uLg0KK30NCisNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdvdG9VUkwoWEZBX0hET0MgaERvYywgRlhfV1NUUiBic1VSTCwgRlhfQk9PTCBiQXBwZW5kKQ0KK3sNCisJaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKwkJcmV0dXJuOw0KKwkJDQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKwkNCisJQ0ZYX1dpZGVTdHJpbmdDIHN0cihic1VSTC5HZXRQdHIoKSk7DQorCQ0KKwlwRW52LT5GRklfR290b1VSTCh0aGlzLCBzdHIsIGJBcHBlbmQpOw0KKw0KK30NCisNCitGWF9CT09MCUNQREZYRkFfRG9jdW1lbnQ6OklzVmFsaWRhdGlvbnNFbmFibGVkKFhGQV9IRE9DIGhEb2MpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisJCXJldHVybiBGQUxTRTsNCisJaWYgKG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQorCQlyZXR1cm4gbV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKS0+SXNYZmFWYWxpZGF0aW9uc0VuYWJsZWQoKTsNCisNCisJcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0VmFsaWRhdGlvbnNFbmFibGVkKFhGQV9IRE9DIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisJCXJldHVybjsNCisJaWYgKG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQorCQltX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5YZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoYkVuYWJsZWQpOw0KK30NCit2b2lkICBDUERGWEZBX0RvY3VtZW50OjpTZXRGb2N1c1dpZGdldChYRkFfSERPQyBoRG9jLCBYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisJaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAoTlVMTCA9PSBoV2lkZ2V0KSB7DQorCQltX3BTREtEb2MtPlNldEZvY3VzQW5ub3QoTlVMTCk7DQorCQlyZXR1cm47DQorCX0NCisNCisJaW50IHBhZ2VWaWV3Q291bnQgPSBtX3BTREtEb2MtPkdldFBhZ2VWaWV3Q291bnQoKTsNCisJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlVmlld0NvdW50OyBpKyspDQorCXsNCisJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcFNES0RvYy0+R2V0UGFnZVZpZXcoaSk7DQorCQlpZiAocFBhZ2VWaWV3ID09IE5VTEwpDQorCQkJY29udGludWU7DQorCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaFdpZGdldCk7DQorCQlpZiAocEFubm90KSB7DQorCQkJbV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KHBBbm5vdCk7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpQcmludChYRkFfSERPQyBoRG9jLCBGWF9JTlQzMiBuU3RhcnRQYWdlLCBGWF9JTlQzMiBuRW5kUGFnZSwgRlhfRFdPUkQgZHdPcHRpb25zKQ0KK3sNCisJaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKwkJcmV0dXJuOw0KKwkJDQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAoIXBFbnYtPkdldEZvcm1GaWxsSW5mbygpIHx8IHBFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtID09IE5VTEwpDQorCQlyZXR1cm47DQorCWlmIChwRW52LT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybS0+RG9jX3ByaW50ID09IE5VTEwpDQorCQlyZXR1cm47DQorCXBFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQocEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0sZHdPcHRpb25zJlhGQV9QUklOVE9QVF9TaG93RGlhbG9nLA0KKwkJblN0YXJ0UGFnZSxuRW5kUGFnZSxkd09wdGlvbnMmWEZBX1BSSU5UT1BUX0NhbkNhbmNlbCxkd09wdGlvbnMmWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2UsZHdPcHRpb25zJlhGQV9QUklOVE9QVF9Bc0ltYWdlLA0KKwkJZHdPcHRpb25zJlhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXIsZHdPcHRpb25zJlhGQV9QUklOVE9QVF9QcmludEFubm90KTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpHZXRVUkwoWEZBX0hET0MgaERvYywgQ0ZYX1dpZGVTdHJpbmcgJndzRG9jVVJMKQ0KK3sNCisJaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKwkJcmV0dXJuOw0KKw0KKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisJaWYgKHBFbnYgPT0gTlVMTCkNCisJCXJldHVybjsNCisNCisJcEVudi0+RkZJX0dldFVSTCh0aGlzLCB3c0RvY1VSTCk7DQorfQ0KKw0KK0ZYX0FSR0IJQ1BERlhGQV9Eb2N1bWVudDo6R2V0SGlnaGxpZ2h0Q29sb3IoWEZBX0hET0MgaERvYykNCit7DQorCWlmIChoRG9jICE9IG1fcFhGQURvYykNCisJCXJldHVybiAwOw0KKwlpZiAobV9wU0RLRG9jKQ0KKwl7DQorCQlpZihDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQorCQl7DQorCQkJRlhfQ09MT1JSRUYgY29sb3IgPSBwSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRDb2xvcihGUERGX0ZPUk1GSUVMRF9YRkEpOw0KKwkJCUZYX0JZVEUgYWxwaGEgPSBwSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRBbHBoYSgpOw0KKwkJCUZYX0FSR0IgYXJnYiA9IEFyZ2JFbmNvZGUoKGludClhbHBoYSwgY29sb3IpOw0KKwkJCXJldHVybiBhcmdiOw0KKwkJfQkNCisJfQ0KKwlyZXR1cm4gMDsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpBZGREb1JlY29yZChYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorCWlmIChwRW52ID09IE5VTEwpDQorCQlyZXR1cm47DQorCXJldHVybjsNCisJLy9wRW52LT5GRklfQWRkRG9SZWNvcmQodGhpcywgaFdpZGdldCk7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X05vdGlmeVN1Ym1pdChGWF9CT09MIGJQcmV2T3JQb3N0KQ0KK3sNCisJaWYgKGJQcmV2T3JQb3N0KQ0KKwkJcmV0dXJuIF9PbkJlZm9yZU5vdGlmeVN1bWJpdCgpOw0KKwllbHNlDQorCQlfT25BZnRlck5vdGlmeVN1bWJpdCgpOw0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpfT25CZWZvcmVOb3RpZnlTdW1iaXQoKQ0KK3sNCisJaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSAmJiBtX2lEb2NUeXBlICE9IERPQ1RZUEVfU1RBVElDX1hGQSkNCisJCXJldHVybiBUUlVFOw0KKwlpZiAobV9wWEZBRG9jVmlldyA9PSBOVUxMKQ0KKwkJcmV0dXJuIFRSVUU7DQorCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQorCWlmIChwV2lkZ2V0SGFuZGxlciA9PSBOVUxMKQ0KKwkJcmV0dXJuIFRSVUU7DQorCUlYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIHBXaWRnZXRBY2NJdGVyYXRvciA9IG1fcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7DQorCWlmIChwV2lkZ2V0QWNjSXRlcmF0b3IpDQorCXsNCisJCUNYRkFfRXZlbnRQYXJhbSBQYXJhbTsNCisJCVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlU3VibWl0Ow0KKwkJQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisJCXdoaWxlIChwV2lkZ2V0QWNjKQ0KKwkJew0KKwkJCXBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJlBhcmFtKTsNCisJCQlwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorCQl9DQorCQlwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisJfQ0KKwlwV2lkZ2V0QWNjSXRlcmF0b3IgPSBtX3BYRkFEb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOw0KKwlpZiAocFdpZGdldEFjY0l0ZXJhdG9yKQ0KKwl7DQorCQlDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKwkJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKwkJd2hpbGUgKHBXaWRnZXRBY2MpDQorCQl7DQorCQkJaW50IGZSZXQgPSBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoLTEpOw0KKwkJCWlmIChmUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKQ0KKwkJCXsNCisJCQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorCQkJCWlmIChwRW52ID09IE5VTEwpDQorCQkJCQlyZXR1cm4gRkFMU0U7DQorCQkJCUNGWF9XaWRlU3RyaW5nIHdzOw0KKwkJCQl3cy5Gcm9tTG9jYWwoSURTX1hGQV9WYWxpZGF0ZV9JbnB1dCk7DQorCQkJCUNGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGMTZMRV9FbmNvZGUoKTsNCisJCQkJaW50IGxlbiA9IGJzLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7DQorCQkJCXBFbnYtPkZGSV9BbGVydCgoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksIChGUERGX1dJREVTVFJJTkcpTCIiLCAwLCAxKTsNCisJCQkJYnMuUmVsZWFzZUJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorCQkJCXBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOw0KKwkJCQlyZXR1cm4gRkFMU0U7DQorCQkJfQ0KKwkJCXBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisJCX0NCisJCXBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOw0KKwkJbV9wWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKwl9DQorCQ0KKwlyZXR1cm4gVFJVRTsNCisNCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpfT25BZnRlck5vdGlmeVN1bWJpdCgpDQorew0KKwlpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmIG1faURvY1R5cGUgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQ0KKwkJcmV0dXJuOw0KKwlpZiAobV9wWEZBRG9jVmlldyA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOw0KKwlpZiAocFdpZGdldEhhbmRsZXIgPT0gTlVMTCkNCisJCXJldHVybjsNCisJSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogcFdpZGdldEFjY0l0ZXJhdG9yID0gbV9wWEZBRG9jVmlldy0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsNCisJaWYgKHBXaWRnZXRBY2NJdGVyYXRvciA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKwlDWEZBX0V2ZW50UGFyYW0gUGFyYW07IA0KKwlQYXJhbS5tX2VUeXBlID0gIFhGQV9FVkVOVF9Qb3N0U3VibWl0Ow0KKw0KKwlDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKwl3aGlsZSAocFdpZGdldEFjYykNCisJew0KKwkJcFdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCAmUGFyYW0pOw0KKwkJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKwl9DQorCXBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOw0KKwltX3BYRkFEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6U3VibWl0RGF0YShYRkFfSERPQyBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpDQorew0KKwlpZiAoIV9Ob3RpZnlTdWJtaXQoVFJVRSkpDQorCQlyZXR1cm4gRkFMU0U7DQorCWlmIChOVUxMID09IG1fcFhGQURvY1ZpZXcpDQorCQlyZXR1cm4gRkFMU0U7DQorCW1fcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisNCisJRlhfQk9PTCByZXQgPSBfU3VibWl0RGF0YShoRG9jLCBzdWJtaXQpOw0KKwlfTm90aWZ5U3VibWl0KEZBTFNFKTsNCisJcmV0dXJuIHJldDsNCit9DQorDQorSUZYX0ZpbGVSZWFkKiBDUERGWEZBX0RvY3VtZW50OjpPcGVuTGlua2VkRmlsZShYRkFfSERPQyBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKQ0KK3sNCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorCWlmIChwRW52ID09IE5VTEwpDQorCQlyZXR1cm4gRkFMU0U7DQorCUNGWF9CeXRlU3RyaW5nIGJzID0gd3NMaW5rLlVURjE2TEVfRW5jb2RlKCk7DQorCWludCBsZW4gPSBicy5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOw0KKwlGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoMCwgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLCAicmIiKTsNCisJYnMuUmVsZWFzZUJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorDQorCWlmIChwRmlsZUhhbmRsZXIgPT0gTlVMTCkNCisJCXJldHVybiBOVUxMOw0KKwlDRlBERl9GaWxlU3RyZWFtKiBwRmlsZVJlYWQgPSBGWF9ORVcgQ0ZQREZfRmlsZVN0cmVhbShwRmlsZUhhbmRsZXIpOw0KKwlyZXR1cm4gcEZpbGVSZWFkOw0KK30NCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9FeHBvcnRTdWJtaXRGaWxlKEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciwgaW50IGZpbGVUeXBlLCBGUERGX0RXT1JEIGVuY29kZVR5cGUsIEZQREZfRFdPUkQgZmxhZykNCit7DQorCWlmIChOVUxMID09IG1fcFhGQURvY1ZpZXcpDQorCQlyZXR1cm4gRkFMU0U7DQorCUlYRkFfRG9jSGFuZGxlciogcERvY0hhbmRsZXIgPSBtX3BBcHAtPkdldFhGQUFwcCgpLT5HZXREb2NIYW5kbGVyKCk7DQorCUNGWF9CeXRlU3RyaW5nIGNvbnRlbnQ7DQorDQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKwlpZiAocEVudiA9PSBOVUxMKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKwkNCisJQ0ZQREZfRmlsZVN0cmVhbSBmaWxlU3RyZWFtKHBGaWxlSGFuZGxlcik7DQorDQorCWlmIChmaWxlVHlwZSA9PSBGWEZBX1NBVkVBU19YTUwpDQorCXsNCisJCUNGWF9XaWRlU3RyaW5nIHdzOw0KKwkJd3MuRnJvbUxvY2FsKCJkYXRhIik7DQorCQlDRlhfQnl0ZVN0cmluZyBjb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxyXG4iOw0KKwkJZmlsZVN0cmVhbS5Xcml0ZUJsb2NrKChGWF9MUENTVFIpY29udGVudCwwLGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KKwkJcERvY0hhbmRsZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvYywgd3MsICZmaWxlU3RyZWFtKTsNCisJfQ0KKwllbHNlIGlmIChmaWxlVHlwZSA9PSBGWEZBX1NBVkVBU19YRFApDQorCXsJDQorCQlpZiAoZmxhZyA9PSAwKQ0KKwkJCWZsYWcgPSBGWEZBX0NPTkZJR3xGWEZBX1RFTVBMQVRFfEZYRkFfTE9DQUxFU0VUfEZYRkFfREFUQVNFVFN8RlhGQV9YTVBNRVRBfEZYRkFfWEZERnxGWEZBX0ZPUk07DQorCQlpZiAobV9wUERGRG9jID09IE5VTEwpIA0KKwkJew0KKwkJCWZpbGVTdHJlYW0uRmx1c2goKTsNCisJCQlyZXR1cm4gRkFMU0U7DQorCQl9CQ0KKwkJQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcFBERkRvYy0+R2V0Um9vdCgpOw0KKwkJaWYgKHBSb290ID09IE5VTEwpIA0KKwkJew0KKwkJCWZpbGVTdHJlYW0uRmx1c2goKTsNCisJCQlyZXR1cm4gRkFMU0U7DQorCQl9DQorCQlDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOw0KKwkJaWYgKE5VTEwgPT0gcEFjcm9Gb3JtKQ0KKwkJew0KKwkJCWZpbGVTdHJlYW0uRmx1c2goKTsNCisJCQlyZXR1cm4gRkFMU0U7DQorCQl9DQorCQlDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7DQorCQlpZiAocFhGQSA9PSBOVUxMKSANCisJCXsNCisJCQlmaWxlU3RyZWFtLkZsdXNoKCk7DQorCQkJcmV0dXJuIEZBTFNFOw0KKwkJfQ0KKwkJaWYgKHBYRkEtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpDQorCQl7DQorCQkJZmlsZVN0cmVhbS5GbHVzaCgpOw0KKwkJCXJldHVybiBGQUxTRTsNCisJCX0NCisJCUNQREZfQXJyYXkqIHBBcnJheSA9IHBYRkEtPkdldEFycmF5KCk7DQorCQlpZiAoTlVMTCA9PSBwQXJyYXkpDQorCQl7DQorCQkJZmlsZVN0cmVhbS5GbHVzaCgpOw0KKwkJCXJldHVybiBGQUxTRTsNCisJCX0NCisJCWludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOw0KKwkJaW50IGlGb3JtSW5kZXggPSAtMTsNCisJCWludCBpRGF0YVNldHNJbmRleCA9IC0xOw0KKwkJZm9yIChpbnQgaT0xOyBpPHNpemU7aSs9MikNCisJCXsNCisJCQlDUERGX09iamVjdCogcFBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsNCisJCQlDUERGX09iamVjdCogcFByZVBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpLTEpOw0KKwkJCWlmKHBQcmVQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpDQorCQkJCWNvbnRpbnVlOw0KKwkJCUNQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFBERk9iai0+R2V0RGlyZWN0KCk7DQorCQkJaWYgKHBEaXJlY3RPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJjb25maWciICYmICEoZmxhZyAmIEZYRkFfQ09ORklHKSkNCisJCQkJY29udGludWU7DQorCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0idGVtcGxhdGUiICYmICEoZmxhZyAmIEZYRkFfVEVNUExBVEUpKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJsb2NhbGVTZXQiICYmICEoZmxhZyAmIEZYRkFfTE9DQUxFU0VUKSkNCisJCQkJY29udGludWU7DQorCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0iZGF0YXNldHMiICYmICEoZmxhZyAmIEZYRkFfREFUQVNFVFMpKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJ4bXBtZXRhIiAmJiAhKGZsYWcgJiBGWEZBX1hNUE1FVEEpKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJ4ZmRmIiAmJiAhKGZsYWcgJiBGWEZBX1hGREYpKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJmb3JtIiAmJiAhKGZsYWcgJiBGWEZBX0ZPUk0pKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJmb3JtIikNCisJCQl7DQorCQkJCUNGWF9XaWRlU3RyaW5nIHdzOw0KKwkJCQl3cy5Gcm9tTG9jYWwoImZvcm0iKTsNCisJCQkJcERvY0hhbmRsZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvYywgd3MsICZmaWxlU3RyZWFtKTsNCisJCQl9DQorCQkJZWxzZSBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJkYXRhc2V0cyIpDQorCQkJew0KKwkJCQlDRlhfV2lkZVN0cmluZyB3czsNCisJCQkJd3MuRnJvbUxvY2FsKCJkYXRhc2V0cyIpOw0KKwkJCQlwRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jLCB3cywgJmZpbGVTdHJlYW0pOw0KKwkJCX0NCisJCQllbHNlIA0KKwkJCXsJDQorCQkJCS8vUERGLGNyZWF0b3IuDQorCQkJCS8vVE9ETzoNCisJCQl9DQorCQl9DQorCX0NCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6X0NsZWFyQ2hhbmdlTWFyaygpDQorew0KKwlpZiAobV9wU0RLRG9jKQ0KKwkJbV9wU0RLRG9jLT5DbGVhckNoYW5nZU1hcmsoKTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpfVG9YRkFDb250ZW50RmxhZ3MoQ0ZYX1dpZGVTdHJpbmcgY3NTcmNDb250ZW50LCBGUERGX0RXT1JEJiBmbGFnKQ0KK3sNCisJaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGNvbmZpZyAiLCAwKSAhPSAtMSkNCisJCWZsYWcgfD0gRlhGQV9DT05GSUc7DQorCWlmIChjc1NyY0NvbnRlbnQuRmluZChMIiB0ZW1wbGF0ZSAiLCAwKSAhPSAtMSkNCisJCWZsYWcgIHw9IEZYRkFfVEVNUExBVEU7DQorCWlmIChjc1NyY0NvbnRlbnQuRmluZChMIiBsb2NhbGVTZXQgIiwgMCkgIT0gLTEpDQorCQlmbGFnICB8PSBGWEZBX0xPQ0FMRVNFVDsNCisJaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGRhdGFzZXRzICIsIDApICE9IC0xKQ0KKwkJZmxhZyAgfD0gRlhGQV9EQVRBU0VUUzsNCisJaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIHhtcG1ldGEgIiwgMCkgIT0gLTEpDQorCQlmbGFnICB8PSBGWEZBX1hNUE1FVEE7DQorCWlmIChjc1NyY0NvbnRlbnQuRmluZChMIiB4ZmRmICIsIDApICE9IC0xKQ0KKwkJZmxhZyAgfD0gRlhGQV9YRkRGOw0KKwlpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgZm9ybSAiLCAwKSAhPSAtMSkNCisJCWZsYWcgIHw9IEZYRkFfRk9STTsNCisJaWYgKGZsYWcgPT0gMCkNCisJCWZsYWcgPSBGWEZBX0NPTkZJR3xGWEZBX1RFTVBMQVRFfEZYRkFfTE9DQUxFU0VUfEZYRkFfREFUQVNFVFN8RlhGQV9YTVBNRVRBfEZYRkFfWEZERnxGWEZBX0ZPUk07DQorfQ0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X01haWxUb0luZm8oQ0ZYX1dpZGVTdHJpbmcmIGNzVVJMLCBDRlhfV2lkZVN0cmluZyYgY3NUb0FkZHJlc3MsIENGWF9XaWRlU3RyaW5nJiBjc0NDQWRkcmVzcywgQ0ZYX1dpZGVTdHJpbmcmIGNzQkNDQWRkcmVzcywgQ0ZYX1dpZGVTdHJpbmcmIGNzU3ViamVjdCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTXNnKQ0KK3sNCisJQ0ZYX1dpZGVTdHJpbmcgc3JjVVJMID0gY3NVUkw7DQorCXNyY1VSTC5UcmltTGVmdCgpOw0KKwlpZiAoMCAhPSBzcmNVUkwuTGVmdCg3KS5Db21wYXJlTm9DYXNlKEwibWFpbHRvOiIpKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKwlpbnQgcG9zID0gc3JjVVJMLkZpbmQoTCc/JywwKTsNCisJQ0ZYX1dpZGVTdHJpbmcgdG1wOw0KKwlpZiAocG9zID09IC0xKSB7DQorCQlwb3MgPSBzcmNVUkwuRmluZChMJ0AnLDApOw0KKwkJaWYgKHBvcyA9PSAtMSkNCisJCQlyZXR1cm4gRkFMU0U7DQorCQllbHNlDQorCQl7DQorCQkJdG1wID0gc3JjVVJMLlJpZ2h0KGNzVVJMLkdldExlbmd0aCgpLTcpOw0KKwkJCXRtcC5UcmltTGVmdCgpOw0KKwkJCXRtcC5UcmltUmlnaHQoKTsNCisJCX0NCisJfSBlbHNlIHsNCisJCXRtcCA9IHNyY1VSTC5MZWZ0KHBvcyk7DQorCQl0bXAgPSB0bXAuUmlnaHQodG1wLkdldExlbmd0aCgpLTcpOw0KKwkJdG1wLlRyaW1MZWZ0KCk7DQorCQl0bXAuVHJpbVJpZ2h0KCk7DQorCX0NCisJDQorCWNzVG9BZGRyZXNzID0gdG1wOw0KKwkNCisJc3JjVVJMID0gc3JjVVJMLlJpZ2h0KHNyY1VSTC5HZXRMZW5ndGgoKS0ocG9zKzEpKTsNCisJd2hpbGUgKAkhc3JjVVJMLklzRW1wdHkoKSApDQorCXsNCisJCXNyY1VSTC5UcmltTGVmdCgpOw0KKwkJc3JjVVJMLlRyaW1SaWdodCgpOw0KKwkJcG9zID0gc3JjVVJMLkZpbmQoTCcmJywwKTsNCisJCWlmIChwb3MgPT0gLTEpDQorCQkJdG1wID0gc3JjVVJMOw0KKwkJZWxzZQ0KKwkJCXRtcCA9IHNyY1VSTC5MZWZ0KHBvcyk7DQorCQkNCisJCXRtcC5UcmltTGVmdCgpOw0KKwkJdG1wLlRyaW1SaWdodCgpOw0KKwkJaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSAzICYmIDAgPT0gdG1wLkxlZnQoMykuQ29tcGFyZU5vQ2FzZShMImNjPSIpICkNCisJCXsNCisJCQl0bXAgPSB0bXAuUmlnaHQodG1wLkdldExlbmd0aCgpLTMpOw0KKwkJCWlmICghY3NDQ0FkZHJlc3MuSXNFbXB0eSgpKQ0KKwkJCQljc0NDQWRkcmVzcyArPSBMJzsnOw0KKwkJCWNzQ0NBZGRyZXNzICs9IHRtcDsNCisJCQkNCisJCX0gDQorCQllbHNlIGlmICh0bXAuR2V0TGVuZ3RoKCkgPj0gNCAmJiAwID09IHRtcC5MZWZ0KDQpLkNvbXBhcmVOb0Nhc2UoTCJiY2M9IikpDQorCQl7DQorCQkJdG1wID0gdG1wLlJpZ2h0KHRtcC5HZXRMZW5ndGgoKSAtIDQpOw0KKwkJCWlmICghY3NCQ0NBZGRyZXNzLklzRW1wdHkoKSkNCisJCQkJY3NCQ0NBZGRyZXNzICs9IEwnOyc7DQorCQkJY3NCQ0NBZGRyZXNzICs9IHRtcDsNCisJCX0NCisJCWVsc2UgaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSA4ICYmIDAgPT10bXAuTGVmdCg4KS5Db21wYXJlTm9DYXNlKEwic3ViamVjdD0iKSApDQorCQl7DQorCQkJdG1wPXRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCktOCk7DQorCQkJY3NTdWJqZWN0ICs9IHRtcDsNCisJCX0NCisJCWVsc2UgaWYodG1wLkdldExlbmd0aCgpID49IDUgJiYgMCA9PXRtcC5MZWZ0KDUpLkNvbXBhcmVOb0Nhc2UoTCJib2R5PSIpICkNCisJCXsNCisJCQl0bXA9dG1wLlJpZ2h0KHRtcC5HZXRMZW5ndGgoKSAtIDUpOw0KKwkJCWNzTXNnICs9IHRtcDsNCisJCX0NCisJCWlmIChwb3MgPT0gLTEpDQorCQkJc3JjVVJMID0gTCIiOw0KKwkJZWxzZQ0KKwkJCXNyY1VSTCA9IHNyY1VSTC5SaWdodChjc1VSTC5HZXRMZW5ndGgoKS0ocG9zKzEpKTsNCisJfQ0KKwljc1RvQWRkcmVzcy5SZXBsYWNlKChGWF9MUENXU1RSKUwiLCIsIChGWF9MUENXU1RSKUwiOyIpOw0KKwljc0NDQWRkcmVzcy5SZXBsYWNlKChGWF9MUENXU1RSKUwiLCIsIChGWF9MUENXU1RSKUwiOyIpOw0KKwljc0JDQ0FkZHJlc3MuUmVwbGFjZSgoRlhfTFBDV1NUUilMIiwiLCAoRlhfTFBDV1NUUilMIjsiKTsNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X1N1Ym1pdERhdGEoWEZBX0hET0MgaERvYywgQ1hGQV9TdWJtaXQgc3VibWl0KQ0KK3sNCisJQ0ZYX1dpZGVTdHJpbmdDIGNzVVJMQzsNCisJc3VibWl0LkdldFN1Ym1pdFRhcmdldChjc1VSTEMpOw0KKwlDRlhfV2lkZVN0cmluZyBjc1VSTCA9IGNzVVJMQzsNCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorCWlmIChwRW52ID09IE5VTEwpDQorCQlyZXR1cm4gRkFMU0U7DQorCWlmIChjc1VSTC5Jc0VtcHR5KCkpewkgDQorCQlDRlhfV2lkZVN0cmluZyB3czsNCisJCXdzLkZyb21Mb2NhbCgiU3VibWl0IGNhbmNlbGxlZC4iKTsNCisJCUNGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGMTZMRV9FbmNvZGUoKTsNCisJCWludCBsZW4gPSBicy5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOw0KKwkJcEVudi0+RkZJX0FsZXJ0KChGUERGX1dJREVTVFJJTkcpYnMuR2V0QnVmZmVyKGxlbipzaXplb2YodW5zaWduZWQgc2hvcnQpKSwgKEZQREZfV0lERVNUUklORylMIiIsIDAsIDQpOw0KKwkJYnMuUmVsZWFzZUJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorCQlyZXR1cm4gRkFMU0U7DQorCX0NCisNCisJRlBERl9CT09MIGJSZXQgPSBUUlVFOw0KKwlGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPSBOVUxMOw0KKwlpbnQgZmlsZUZsYWcgPSAtMTsNCisNCisJaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9YZHApDQorCXsNCisJCUNGWF9XaWRlU3RyaW5nQyBjc0NvbnRlbnRDOw0KKwkJc3VibWl0LkdldFN1Ym1pdFhEUENvbnRlbnQoY3NDb250ZW50Qyk7DQorCQlDRlhfV2lkZVN0cmluZyBjc0NvbnRlbnQ7DQorCQljc0NvbnRlbnQgPSBjc0NvbnRlbnRDLkdldFB0cigpOw0KKwkJY3NDb250ZW50LlRyaW1MZWZ0KCk7DQorCQljc0NvbnRlbnQuVHJpbVJpZ2h0KCk7DQorCQlDRlhfV2lkZVN0cmluZyBzcGFjZTsNCisJCXNwYWNlLkZyb21Mb2NhbCgiICIpOw0KKwkJY3NDb250ZW50ID0gc3BhY2UgKyBjc0NvbnRlbnQgKyBzcGFjZTsNCisJCUZQREZfRFdPUkQgZmxhZyA9IDA7DQorCQlpZiAoc3VibWl0LklzU3VibWl0RW1iZWRQREYoKSkNCisJCQlmbGFnIHw9IEZYRkFfUERGOw0KKwkJX1RvWEZBQ29udGVudEZsYWdzKGNzQ29udGVudCwgZmxhZyk7DQorCQlwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoRlhGQV9TQVZFQVNfWERQLCBOVUxMLCAid2IiKTsNCisJCWZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWERQOw0KKwkJX0V4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YRFAsIDAsIGZsYWcpOw0KKwl9DQorCWVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9YbWwgKQ0KKwl7DQorCQlwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoRlhGQV9TQVZFQVNfWE1MLCBOVUxMLCAid2IiKTsNCisJCWZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWE1MOw0KKwkJX0V4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YTUwsIDApOw0KKwl9DQorCWVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9QZGYgKQ0KKwl7DQorCQkJLy9jc2ZpbGVuYW1lID0gY3NEb2NOYW1lOw0KKwl9DQorCWVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Gb3JtZGF0YSApDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwllbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVXJsZW5jb2RlZCApDQorCXsNCisJCXBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZShGWEZBX1NBVkVBU19YTUwsIE5VTEwsICJ3YiIpOw0KKwkJZmlsZUZsYWcgPSBGWEZBX1NBVkVBU19YTUw7DQorCQlfRXhwb3J0U3VibWl0RmlsZShwRmlsZUhhbmRsZXIsIEZYRkFfU0FWRUFTX1hNTCwgMCk7DQorCX0NCisJZWxzZSBpZiAoc3VibWl0LkdldFN1Ym1pdEZvcm1hdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1hmZCApDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwlpZiAocEZpbGVIYW5kbGVyID09IE5VTEwpDQorCQlyZXR1cm4gRkFMU0U7DQorCWlmICgwID09IGNzVVJMLkxlZnQoNykuQ29tcGFyZU5vQ2FzZShMIm1haWx0bzoiKSkNCisJew0KKwkJQ0ZYX1dpZGVTdHJpbmcgY3NUb0FkZHJlc3M7IA0KKwkJQ0ZYX1dpZGVTdHJpbmcgY3NDQ0FkZHJlc3M7DQorCQlDRlhfV2lkZVN0cmluZyBjc0JDQ0FkZHJlc3M7DQorCQlDRlhfV2lkZVN0cmluZyBjc1N1YmplY3Q7DQorCQlDRlhfV2lkZVN0cmluZyBjc01zZzsNCisNCisJCWJSZXQgPSBfTWFpbFRvSW5mbyhjc1VSTCwgY3NUb0FkZHJlc3MsIGNzQ0NBZGRyZXNzLCBjc0JDQ0FkZHJlc3MsIGNzU3ViamVjdCwgY3NNc2cpOw0KKwkJaWYgKEZBTFNFID09IGJSZXQpDQorCQkJcmV0dXJuIEZBTFNFOw0KKw0KKwkJQ0ZYX0J5dGVTdHJpbmcgYnNUbyA9IENGWF9XaWRlU3RyaW5nKGNzVG9BZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOw0KKwkJQ0ZYX0J5dGVTdHJpbmcgYnNDQyA9IENGWF9XaWRlU3RyaW5nKGNzQ0NBZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOw0KKwkJQ0ZYX0J5dGVTdHJpbmcgYnNCY2MgPSBDRlhfV2lkZVN0cmluZyhjc0JDQ0FkZHJlc3MpLlVURjE2TEVfRW5jb2RlKCk7DQorCQlDRlhfQnl0ZVN0cmluZyBic1N1YmplY3QgPSBDRlhfV2lkZVN0cmluZyhjc1N1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7DQorCQlDRlhfQnl0ZVN0cmluZyBic01zZyA9IENGWF9XaWRlU3RyaW5nKGNzTXNnKS5VVEYxNkxFX0VuY29kZSgpOw0KKw0KKwkJRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIoYnNUby5HZXRMZW5ndGgoKSk7DQorCQlGUERGX1dJREVTVFJJTkcgcENDID0gKEZQREZfV0lERVNUUklORylic0NDLkdldEJ1ZmZlcihic0NDLkdldExlbmd0aCgpKTsNCisJCUZQREZfV0lERVNUUklORyBwQmNjID0gKEZQREZfV0lERVNUUklORylic0JjYy5HZXRCdWZmZXIoYnNCY2MuR2V0TGVuZ3RoKCkpOw0KKwkJRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0ID0gKEZQREZfV0lERVNUUklORylic1N1YmplY3QuR2V0QnVmZmVyKGJzU3ViamVjdC5HZXRMZW5ndGgoKSk7DQorCQlGUERGX1dJREVTVFJJTkcgcE1zZyA9IChGUERGX1dJREVTVFJJTkcpYnNNc2cuR2V0QnVmZmVyKGJzTXNnLkdldExlbmd0aCgpKTsNCisNCisJCXBFbnYtPkZGSV9FbWFpbFRvKHBGaWxlSGFuZGxlciwgcFRvLCBwU3ViamVjdCwgcENDLCBwQmNjLCBwTXNnKTsNCisJCWJzVG8uUmVsZWFzZUJ1ZmZlcigpOw0KKwkJYnNDQy5SZWxlYXNlQnVmZmVyKCk7DQorCQlic0JjYy5SZWxlYXNlQnVmZmVyKCk7DQorCQlic1N1YmplY3QuUmVsZWFzZUJ1ZmZlcigpOw0KKwkJYnNNc2cuUmVsZWFzZUJ1ZmZlcigpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJLy9odHRwoaJmdHANCisJCUNGWF9XaWRlU3RyaW5nIHdzOw0KKwkJQ0ZYX0J5dGVTdHJpbmcgYnMgPSBjc1VSTC5VVEYxNkxFX0VuY29kZSgpOw0KKwkJaW50IGxlbiA9IGJzLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7DQorCQlwRW52LT5GRklfVXBsb2FkVG8ocEZpbGVIYW5kbGVyLCBmaWxlRmxhZywgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpKTsNCisJCWJzLlJlbGVhc2VCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKwl9DQorDQorCXJldHVybiBiUmV0Ow0KK30NCisNCitGWF9CT09MCUNQREZYRkFfRG9jdW1lbnQ6OlNldEdsb2JhbFByb3BlcnR5KFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorCWlmIChoRG9jICE9IG1fcFhGQURvYykNCisJCXJldHVybiBGQUxTRTsNCisNCisJaWYgKG1fcFNES0RvYyAmJiBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkgDQorCQlyZXR1cm4gbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlNldEhWYWx1ZUJ5TmFtZShzelByb3BOYW1lLCBoVmFsdWUpOw0KKwlyZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1BERlhGQV9Eb2N1bWVudDo6R2V0UERGU2NyaXB0T2JqZWN0KFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCWlmICghbV9wU0RLRG9jIHx8ICFtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkNCisJCXJldHVybiBGQUxTRTsNCisNCisJaWYgKCFtX3BKU0NvbnRleHQpDQorCXsNCisJCW1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5TZXRSZWFkZXJEb2N1bWVudChtX3BTREtEb2MpOw0KKwkJbV9wSlNDb250ZXh0ID1tX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKS0+TmV3Q29udGV4dCgpOw0KKwl9DQorDQorCXJldHVybiBfR2V0SFZhbHVlQnlOYW1lKHV0ZjhOYW1lLCBoVmFsdWUsIG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpKTsNCisNCit9DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpHZXRHbG9iYWxQcm9wZXJ0eShYRkFfSERPQyBoRG9jLCBGWF9CU1RSIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKwlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorCQlyZXR1cm4gRkFMU0U7DQorCWlmICghbV9wU0RLRG9jIHx8ICFtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkNCisJCXJldHVybiBGQUxTRTsNCisNCisJaWYgKCFtX3BKU0NvbnRleHQpDQorCXsNCisJCW1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5TZXRSZWFkZXJEb2N1bWVudChtX3BTREtEb2MpOw0KKwkJbV9wSlNDb250ZXh0ID0gbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPk5ld0NvbnRleHQoKTsNCisJfQ0KKw0KKwlyZXR1cm4gX0dldEhWYWx1ZUJ5TmFtZShzelByb3BOYW1lLCBoVmFsdWUsIG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpKTsNCisNCit9DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpfR2V0SFZhbHVlQnlOYW1lKEZYX0JTVFIgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUsIElGWEpTX1J1bnRpbWUqIHJ1blRpbWUpDQorew0KKwlyZXR1cm4gcnVuVGltZS0+R2V0SFZhbHVlQnlOYW1lKHV0ZjhOYW1lLCBoVmFsdWUpOw0KK30NCisNCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwNWQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmNwcApAQCAtMCwwICsxLDI3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorIA0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mc2RrX21nci5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiDQorDQorQ1BERlhGQV9QYWdlOjpDUERGWEZBX1BhZ2UoQ1BERlhGQV9Eb2N1bWVudCogcERvYywgaW50IHBhZ2VfaW5kZXgpIDoNCisJbV9wUERGUGFnZShOVUxMKSwNCisJbV9wWEZBUGFnZVZpZXcoTlVMTCksDQorCW1faVBhZ2VJbmRleChwYWdlX2luZGV4KSwNCisJbV9wRG9jdW1lbnQocERvYyksDQorCW1faVJlZigxKQ0KK3sNCisNCit9DQorDQorQ1BERlhGQV9QYWdlOjp+Q1BERlhGQV9QYWdlKCkNCit7DQorCWlmIChtX3BQREZQYWdlKQ0KKwkJZGVsZXRlIG1fcFBERlBhZ2U7DQorCW1fcFBERlBhZ2UgPSBOVUxMOw0KKwltX3BYRkFQYWdlVmlldyA9IE5VTEw7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9QYWdlOjpSZWxlYXNlKCkNCit7DQorCW1faVJlZi0tOw0KKwlpZiAobV9pUmVmID4gMCkNCisJCXJldHVybjsNCisJDQorCWlmIChtX3BEb2N1bWVudCkNCisJCW1fcERvY3VtZW50LT5SZW1vdmVQYWdlKHRoaXMpOw0KKw0KKwlkZWxldGUgdGhpczsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX1BhZ2U6OkxvYWRQREZQYWdlKCkNCit7DQorCWlmICghbV9wRG9jdW1lbnQpIHJldHVybiBGQUxTRTsNCisJQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IG1fcERvY3VtZW50LT5HZXRQREZEb2MoKTsNCisJaWYgKHBQREZEb2MpDQorCXsNCisJCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUERGRG9jLT5HZXRQYWdlKG1faVBhZ2VJbmRleCk7DQorCQlpZiAocERpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOw0KKwkJaWYgKG1fcFBERlBhZ2UpIHsNCisJCQlpZiAobV9wUERGUGFnZS0+bV9wRm9ybURpY3QgPT0gcERpY3QpDQorCQkJCXJldHVybiBUUlVFOw0KKw0KKwkJCWRlbGV0ZSBtX3BQREZQYWdlOw0KKwkJCW1fcFBERlBhZ2UgPSBOVUxMOw0KKwkJfQ0KKw0KKwkJbV9wUERGUGFnZSA9IEZYX05FVyBDUERGX1BhZ2U7DQorCQltX3BQREZQYWdlLT5Mb2FkKHBQREZEb2MsIHBEaWN0KTsNCisJCW1fcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOw0KKwkJcmV0dXJuIFRSVUU7DQorCX0NCisNCisJcmV0dXJuIEZBTFNFOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfUGFnZTo6TG9hZFhGQVBhZ2VWaWV3KCkNCit7DQorCWlmICghbV9wRG9jdW1lbnQpDQorCQlyZXR1cm4gRkFMU0U7DQorCVhGQV9IRE9DIHBYRkFEb2MgPSBtX3BEb2N1bWVudC0+R2V0WEZBRG9jKCk7DQorCWlmIChwWEZBRG9jKQ0KKwl7DQorCQlJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFhGQURvY1ZpZXcoKTsNCisJCWlmICghcFhGQURvY1ZpZXcpIA0KKwkJCXJldHVybiBGQUxTRTsNCisNCisJCUlYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBYRkFEb2NWaWV3LT5HZXRQYWdlVmlldyhtX2lQYWdlSW5kZXgpOw0KKwkJaWYgKCFwUGFnZVZpZXcpDQorCQkJcmV0dXJuIEZBTFNFOw0KKw0KKwkJaWYgKG1fcFhGQVBhZ2VWaWV3KQ0KKwkJCWlmIChtX3BYRkFQYWdlVmlldyA9PSBwUGFnZVZpZXcpDQorCQkJCXJldHVybiBUUlVFOw0KKw0KKwkJbV9wWEZBUGFnZVZpZXcgPSBwUGFnZVZpZXc7DQorCQlpbnQgaVN0YXR1cyA9IG1fcFhGQVBhZ2VWaWV3LT5Mb2FkUGFnZVZpZXcoTlVMTCk7DQorDQorCQlyZXR1cm4gVFJVRTsNCisJfQ0KKw0KKwlyZXR1cm4gRkFMU0U7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9QYWdlOjpMb2FkUGFnZSgpDQorew0KKwlpZiAoIW1fcERvY3VtZW50IHx8IG1faVBhZ2VJbmRleCA8IDApDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCWludCBpRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQorCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBtX3BEb2N1bWVudC0+R2V0UERGRG9jKCk7DQorCVhGQV9IRE9DIHBYRkFEb2MgPSBtX3BEb2N1bWVudC0+R2V0WEZBRG9jKCk7DQorDQorCXN3aXRjaCAoaURvY1R5cGUpDQorCXsNCisJY2FzZSBET0NUWVBFX1BERjoNCisJY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorCQl7DQorCQkJcmV0dXJuIExvYWRQREZQYWdlKCk7DQorCQl9DQorCWNhc2UgRE9DVFlQRV9EWU5JTUlDX1hGQToNCisJCXsNCisJCQlyZXR1cm4gTG9hZFhGQVBhZ2VWaWV3KCk7DQorCQl9DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gRkFMU0U7DQorCX0NCisNCisJcmV0dXJuIEZBTFNFOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfUGFnZTo6TG9hZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwYWdlRGljdCkNCit7DQorCWlmICghbV9wRG9jdW1lbnQgfHwgbV9pUGFnZUluZGV4IDwgMCB8fCAhcGFnZURpY3QpDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCWlmIChtX3BQREZQYWdlKQ0KKwkJZGVsZXRlIG1fcFBERlBhZ2U7DQorDQorCW1fcFBERlBhZ2UgPSBGWF9ORVcgQ1BERl9QYWdlKCk7DQorCW1fcFBERlBhZ2UtPkxvYWQobV9wRG9jdW1lbnQtPkdldFBERkRvYygpLCBwYWdlRGljdCk7DQorCW1fcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOw0KKw0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorRlhfRkxPQVQgQ1BERlhGQV9QYWdlOjpHZXRQYWdlV2lkdGgoKQ0KK3sNCisJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KKw0KKwlpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KKwkJcmV0dXJuIDAuMGY7DQorDQorCWludCBuRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQorCXN3aXRjaCAobkRvY1R5cGUpDQorCXsNCisJY2FzZSBET0NUWVBFX0RZTklNSUNfWEZBOg0KKwkJew0KKwkJCWlmIChtX3BYRkFQYWdlVmlldykNCisJCQl7DQorCQkJCUNGWF9SZWN0RiByZWN0Ow0KKwkJCQltX3BYRkFQYWdlVmlldy0+R2V0UGFnZVZpZXdSZWN0KHJlY3QpOw0KKwkJCQlyZXR1cm4gcmVjdC53aWR0aDsNCisJCQl9DQorCQl9DQorCQlicmVhazsNCisJY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorCWNhc2UgRE9DVFlQRV9QREY6DQorCQl7DQorCQkJaWYgKG1fcFBERlBhZ2UpDQorCQkJCXJldHVybiBtX3BQREZQYWdlLT5HZXRQYWdlV2lkdGgoKTsNCisJCX0NCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuIDAuMGY7DQorCX0NCisNCisJcmV0dXJuIDAuMGY7DQorfQ0KKw0KK0ZYX0ZMT0FUIENQREZYRkFfUGFnZTo6R2V0UGFnZUhlaWdodCgpDQorew0KKwlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQorDQorCWlmICghbV9wUERGUGFnZSAmJiAhbV9wWEZBUGFnZVZpZXcpDQorCQlyZXR1cm4gMC4wZjsNCisNCisJaW50IG5Eb2NUeXBlID0gbV9wRG9jdW1lbnQtPkdldERvY1R5cGUoKTsNCisJc3dpdGNoIChuRG9jVHlwZSkNCisJew0KKwljYXNlIERPQ1RZUEVfUERGOg0KKwljYXNlIERPQ1RZUEVfU1RBVElDX1hGQToNCisJCXsNCisJCQlpZiAobV9wUERGUGFnZSkNCisJCQkJcmV0dXJuIG1fcFBERlBhZ2UtPkdldFBhZ2VIZWlnaHQoKTsNCisJCX0NCisJCWJyZWFrOw0KKwljYXNlIERPQ1RZUEVfRFlOSU1JQ19YRkE6DQorCQl7DQorCQkJaWYgKG1fcFhGQVBhZ2VWaWV3KQ0KKwkJCXsNCisJCQkJQ0ZYX1JlY3RGIHJlY3Q7DQorCQkJCW1fcFhGQVBhZ2VWaWV3LT5HZXRQYWdlVmlld1JlY3QocmVjdCk7DQorCQkJCXJldHVybiByZWN0LmhlaWdodDsNCisJCQl9DQorCQl9DQorCQlicmVhazsNCisJZGVmYXVsdDoNCisJCXJldHVybiAwLjBmOw0KKwl9DQorDQorCXJldHVybiAwLjBmOw0KK30NCisNCit2b2lkIENQREZYRkFfUGFnZTo6RGV2aWNlVG9QYWdlKGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSkNCit7DQorCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCisNCisJaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisJCXJldHVybjsNCisNCisJQ1BERl9NYXRyaXggcGFnZTJkZXZpY2U7DQorCUNQREZfTWF0cml4IGRldmljZTJwYWdlOw0KKwlGWF9GTE9BVCBwYWdlX3hfZiwgcGFnZV95X2Y7DQorDQorCUdldERpc3BsYXlNYXRyaXgocGFnZTJkZXZpY2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOw0KKw0KKwlkZXZpY2UycGFnZS5TZXRSZXZlcnNlKHBhZ2UyZGV2aWNlKTsNCisJZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVCkoZGV2aWNlX3gpLCAoRlhfRkxPQVQpKGRldmljZV95KSwgcGFnZV94X2YsIHBhZ2VfeV9mKTsNCisNCisJKnBhZ2VfeCA9IChwYWdlX3hfZik7DQorCSpwYWdlX3kgPSAocGFnZV95X2YpOw0KK30NCisNCit2b2lkIENQREZYRkFfUGFnZTo6UGFnZVRvRGV2aWNlKGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSwgaW50KiBkZXZpY2VfeCwgaW50KiBkZXZpY2VfeSkNCit7DQorCWlmICghbV9wUERGUGFnZSAmJiAhbV9wWEZBUGFnZVZpZXcpDQorCQlyZXR1cm47DQorDQorCUNQREZfTWF0cml4IHBhZ2UyZGV2aWNlOw0KKwlGWF9GTE9BVCBkZXZpY2VfeF9mLCBkZXZpY2VfeV9mOw0KKw0KKwlHZXREaXNwbGF5TWF0cml4KHBhZ2UyZGV2aWNlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsNCisNCisJcGFnZTJkZXZpY2UuVHJhbnNmb3JtKCgoRlhfRkxPQVQpcGFnZV94KSwgKChGWF9GTE9BVClwYWdlX3kpLCBkZXZpY2VfeF9mLCBkZXZpY2VfeV9mKTsNCisNCisJKmRldmljZV94ID0gRlhTWVNfcm91bmQoZGV2aWNlX3hfZik7DQorCSpkZXZpY2VfeSA9IEZYU1lTX3JvdW5kKGRldmljZV95X2YpOw0KK30NCisNCit2b2lkIENQREZYRkFfUGFnZTo6R2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsIGludCB4UG9zLCBpbnQgeVBvcywgDQorCWludCB4U2l6ZSwgaW50IHlTaXplLCBpbnQgaVJvdGF0ZSkgY29uc3QNCit7DQorCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCisNCisJaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisJCXJldHVybjsNCisNCisJaW50IG5Eb2NUeXBlID0gbV9wRG9jdW1lbnQtPkdldERvY1R5cGUoKTsNCisJc3dpdGNoIChuRG9jVHlwZSkNCisJew0KKwljYXNlIERPQ1RZUEVfRFlOSU1JQ19YRkE6DQorCQl7DQorCQkJaWYgKG1fcFhGQVBhZ2VWaWV3KQ0KKwkJCXsNCisJCQkJQ0ZYX1JlY3QgcmVjdDsNCisJCQkJcmVjdC5TZXQoeFBvcywgeVBvcywgeFNpemUsIHlTaXplKTsNCisJCQkJbV9wWEZBUGFnZVZpZXctPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCByZWN0LCBpUm90YXRlKTsNCisJCQl9DQorCQl9DQorCQlicmVhazsNCisJY2FzZSBET0NUWVBFX1BERjoNCisJY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorCQl7DQorCQkJaWYgKG1fcFBERlBhZ2UpIA0KKwkJCXsNCisJCQkJbV9wUERGUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtYXRyaXgsIHhQb3MsIHlQb3MsIHhTaXplLCB5U2l6ZSwgaVJvdGF0ZSk7DQorCQkJfQ0KKwkJfQ0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm47DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3V0aWwuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjFiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5jcHAKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorIA0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mc2RrX21nci5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiDQorDQorRlhfQk9PTCBGUERGX0hhc1hGQUZpZWxkKENQREZfRG9jdW1lbnQqIHBQREZEb2MsIGludCYgZG9jVHlwZSkNCit7DQorCWlmICghcFBERkRvYykNCisJCXJldHVybiBGQUxTRTsNCisNCisJQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBQREZEb2MtPkdldFJvb3QoKTsNCisJaWYgKCFwUm9vdCkNCisJCXJldHVybiBGQUxTRTsNCisNCisJQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsNCisJaWYgKCFwQWNyb0Zvcm0pIA0KKwkJcmV0dXJuIEZBTFNFOw0KKw0KKwlDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7DQorCWlmICghcFhGQSkgDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCUZYX0JPT0wgYkR5bWFzdGljWEZBID0gRkFMU0U7DQorCWJEeW1hc3RpY1hGQSA9IHBSb290LT5HZXRCb29sZWFuKCJOZWVkc1JlbmRlcmluZyIsIEZBTFNFKTsNCisNCisJaWYoYkR5bWFzdGljWEZBKQ0KKwkJZG9jVHlwZSA9IERPQ1RZUEVfRFlOSU1JQ19YRkE7DQorCWVsc2UNCisJCWRvY1R5cGUgPSBET0NUWVBFX1NUQVRJQ19YRkE7DQorDQorCXJldHVybiBUUlVFOw0KK30NCisNCitDRlhfUHRyQXJyYXkgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3I6Om1zX3RpbWVyQXJyYXk7DQorDQorRldMX0VSUiBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6U3RhcnQoSUZXTF9UaW1lciAqcFRpbWVyLCBGWF9EV09SRCBkd0VsYXBzZSwgRldMX0hUSU1FUiAmaFRpbWVyLCBGWF9CT09MIGJJbW1lZGlhdGVseSAvKiA9IFRSVUUgKi8pDQorew0KKwlpZiAobV9wRW52KQ0KKwl7DQorCQlGWF9VSU5UMzIgdUlERXZlbnQgPSBtX3BFbnYtPkZGSV9TZXRUaW1lcihkd0VsYXBzZSwgVGltZXJQcm9jKTsNCisJCUNGV0xfVGltZXJJbmZvICpwSW5mbyA9IEZYX05FVyBDRldMX1RpbWVySW5mbzsNCisJCXBJbmZvLT51SURFdmVudCA9IHVJREV2ZW50Ow0KKwkJcEluZm8tPnBUaW1lciA9IHBUaW1lcjsNCisJCW1zX3RpbWVyQXJyYXkuQWRkKHBJbmZvKTsNCisNCisJCWhUaW1lciA9IChGV0xfSFRJTUVSKXBJbmZvOw0KKwkJcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKwl9DQorCQ0KKwlyZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCisNCitGV0xfRVJSIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpTdG9wKEZXTF9IVElNRVIgaFRpbWVyKQ0KK3sNCisJaWYgKCFoVGltZXIpIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorDQorCWlmIChtX3BFbnYpDQorCXsNCisJCUNGV0xfVGltZXJJbmZvICpwSW5mbyA9IChDRldMX1RpbWVySW5mbyopaFRpbWVyOw0KKw0KKwkJbV9wRW52LT5GRklfS2lsbFRpbWVyKHBJbmZvLT51SURFdmVudCk7DQorDQorCQlGWF9JTlQzMiBpbmRleCA9IG1zX3RpbWVyQXJyYXkuRmluZChwSW5mbyk7DQorCQlpZiAoaW5kZXggPj0gMCkNCisJCXsNCisJCQltc190aW1lckFycmF5LlJlbW92ZUF0KGluZGV4KTsNCisJCQlkZWxldGUgcEluZm87DQorCQl9DQorCQlyZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorCX0NCisNCisJcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorDQordm9pZCBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6VGltZXJQcm9jKEZYX0lOVDMyIGlkRXZlbnQpDQorew0KKwlDRldMX1RpbWVySW5mbyAqcEluZm8gPSBOVUxMOw0KKwlGWF9JTlQzMiBpQ291bnQgPSBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6bXNfdGltZXJBcnJheS5HZXRTaXplKCk7DQorCWZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykNCisJew0KKwkJQ0ZXTF9UaW1lckluZm8gKnBUZW1wID0gKENGV0xfVGltZXJJbmZvKilDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6bXNfdGltZXJBcnJheS5HZXRBdChpKTsNCisJCWlmIChwVGVtcC0+dUlERXZlbnQgPT0gaWRFdmVudCkNCisJCXsNCisJCQlwSW5mbyA9IHBUZW1wOyBicmVhazsNCisJCX0NCisJfQ0KKwlpZiAocEluZm8pDQorCXsNCisJCXBJbmZvLT5wVGltZXItPlJ1bigoRldMX0hUSU1FUilwSW5mbyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKaW5kZXggNTE4YWJkMi4uNDk0YjUyOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCkBAIC01LDYgKzUsNyBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfbWdyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKQEAgLTU2Niw3ICs1NjcsNyBAQAogLy8JQVNTRVJUKHBEb2NWaWV3ICE9IE5VTEwpOwogCUFTU0VSVChhY3Rpb24gIT0gTlVMTCk7CiAKLQlDUERGX0RvY3VtZW50KiBwUERGRG9jdW1lbnQgPSBwRG9jdW1lbnQtPkdldERvY3VtZW50KCk7CisJQ1BERl9Eb2N1bWVudCogcFBERkRvY3VtZW50ID0gcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKIAlBU1NFUlQocFBERkRvY3VtZW50ICE9IE5VTEwpOwogCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwRG9jdW1lbnQtPkdldEVudigpOwogCUFTU0VSVChwQXBwICE9IE5VTEwpOwpAQCAtNjEwLDcgKzYxMSw3IEBACiAgCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwRG9jdW1lbnQtPkdldEVudigpOwogIAlBU1NFUlQocEFwcCAhPSBOVUxMKTsKICAKLSAJQ0ZYX0J5dGVTdHJpbmcgc1VSSSA9IGFjdGlvbi5HZXRVUkkocERvY3VtZW50LT5HZXREb2N1bWVudCgpKTsKKyAJQ0ZYX0J5dGVTdHJpbmcgc1VSSSA9IGFjdGlvbi5HZXRVUkkocERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKSk7CiAgCXBBcHAtPkZGSV9Eb1VSSUFjdGlvbihGWF9MUENTVFIoc1VSSSkpOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKaW5kZXggOWYyMDhkMy4uZmZmMDM4YiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcApAQCAtNSw2ICs1LDggQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19tZ3IuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfYW5ub3RoYW5kbGVyLmgiCkBAIC0xNyw2ICsxOSw5IEBACiAJQ1BERlNES19CRkFubm90SGFuZGxlciogcEhhbmRsZXIgPSBuZXcgQ1BERlNES19CRkFubm90SGFuZGxlcihtX3BBcHApOwogCXBIYW5kbGVyLT5TZXRGb3JtRmlsbGVyKG1fcEFwcC0+R2V0SUZvcm1GaWxsZXIoKSk7CiAJUmVnaXN0ZXJBbm5vdEhhbmRsZXIocEhhbmRsZXIpOworCisJQ1BERlNES19YRkFBbm5vdEhhbmRsZXIqIHBYRkFBbm5vdEhhbmRsZXIgPSBuZXcgQ1BERlNES19YRkFBbm5vdEhhbmRsZXIobV9wQXBwKTsKKwlSZWdpc3RlckFubm90SGFuZGxlcihwWEZBQW5ub3RIYW5kbGVyKTsKIH0KIAogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6On5DUERGU0RLX0Fubm90SGFuZGxlck1ncigpCkBAIC02Niw3ICs3MSwyMCBAQAogCQlyZXR1cm4gcEFubm90SGFuZGxlci0+TmV3QW5ub3QocEFubm90LCBwUGFnZVZpZXcpOwogCX0KIAkKLQlyZXR1cm4gbmV3IENQREZTREtfQW5ub3QocEFubm90LCBwUGFnZVZpZXcpOworCXJldHVybiBuZXcgQ1BERlNES19CQUFubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKK30KKworQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6Ok5ld0Fubm90KFhGQV9IV0lER0VUIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQoreworCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihGU0RLX1hGQVdJREdFVF9UWVBFTkFNRSkpCisJeworCQlyZXR1cm4gcEFubm90SGFuZGxlci0+TmV3QW5ub3QocEFubm90LCBwUGFnZVZpZXcpOworCX0KKworCXJldHVybiBOVUxMOwogfQogCiB2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQpAQCAtMTE5LDkgKzEzNywxMSBAQAogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJCiAJQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOwotCUFTU0VSVChwUERGQW5ub3QgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIEdldEFubm90SGFuZGxlcihwUERGQW5ub3QtPkdldFN1YlR5cGUoKSk7CisJaWYgKHBQREZBbm5vdCkKKwkJcmV0dXJuIEdldEFubm90SGFuZGxlcihwUERGQW5ub3QtPkdldFN1YlR5cGUoKSk7CisJZWxzZSBpZiAocEFubm90LT5HZXRYRkFXaWRnZXQoKSkKKwkJcmV0dXJuIEdldEFubm90SGFuZGxlcihGU0RLX1hGQVdJREdFVF9UWVBFTkFNRSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIElQREZTREtfQW5ub3RIYW5kbGVyKiBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6R2V0QW5ub3RIYW5kbGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzVHlwZSkgY29uc3QKQEAgLTE0MSw3ICsxNjEsOCBAQAogCX0KIAllbHNlCiAJewotCQlwQW5ub3QtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKKwkJaWYgKCFwQW5ub3QtPklzWEZBRmllbGQoKSkKKwkJCSgoQ1BERlNES19CQUFubm90KilwQW5ub3QpLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7CiAJfQogfQogCkBAIC0zMjMsNiArMzQ0LDIwIEBACiAJcmV0dXJuIEZBTFNFOwogfQogCitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNoYW5nZUZvY3VzKENQREZTREtfQW5ub3QqIHBTZXRBbm5vdCxDUERGU0RLX0Fubm90KiBwS2lsbEFubm90KQoreworCUZYX0JPT0wgYlhGQSA9IChwU2V0QW5ub3QgJiYgcFNldEFubm90LT5HZXRYRkFXaWRnZXQoKSkgfHwKKwkJKHBLaWxsQW5ub3QgJiYgcEtpbGxBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOworCisJaWYgKGJYRkEpCisJeworCQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBYRkFBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpKQorCQkJcmV0dXJuIHBYRkFBbm5vdEhhbmRsZXItPk9uWEZBQ2hhbmdlZEZvY3VzKHBLaWxsQW5ub3QsIHBTZXRBbm5vdCk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKIENQREZfUmVjdAlDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKIAlBU1NFUlQocEFubm90KTsKQEAgLTM0NiwxMyArMzgxLDMwIEBACiAKIENQREZTREtfQW5ub3QqCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX0JPT0wgYk5leHQpCiB7Ci0JIENCQV9Bbm5vdEl0ZXJhdG9yIGFpKHBTREtBbm5vdC0+R2V0UGFnZVZpZXcoKSwgIldpZGdldCIsICIiKTsKLQotCSBDUERGU0RLX0Fubm90KiBwTmV4dCA9IGJOZXh0ID8gCi0JCSBhaS5HZXROZXh0QW5ub3QocFNES0Fubm90KSA6IAorCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9ICBwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBQYWdlVmlldy0+R2V0UERGWEZBUGFnZSgpOworCWlmIChwUGFnZSA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHBQYWdlLT5HZXRQREZQYWdlKCkpIHsgLy8gZm9yIHBkZiBhbm5vdHMuIAorCQlDQkFfQW5ub3RJdGVyYXRvciBhaShwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCksIHBTREtBbm5vdC0+R2V0VHlwZSgpLCAiIik7CisJCUNQREZTREtfQW5ub3QqIHBOZXh0ID0gYk5leHQgPyAKKwkJYWkuR2V0TmV4dEFubm90KHBTREtBbm5vdCkgOiAKIAkJYWkuR2V0UHJldkFubm90KHBTREtBbm5vdCk7Ci0JCiAJCXJldHVybiBwTmV4dDsKKwl9CisJLy8gZm9yIHhmYSBhbm5vdHMKKwlJWEZBX1dpZGdldEl0ZXJhdG9yKiBwV2lkZ2V0SXRlcmF0b3IgPSBwUGFnZS0+R2V0WEZBUGFnZVZpZXcoKS0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZSwgWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8IFhGQV9XSURHRVRGSUxURVJfRmllbGQpOworCWlmIChwV2lkZ2V0SXRlcmF0b3IgPT0gTlVMTCkKKwkJcmV0dXJuICBOVUxMOworCWlmIChwV2lkZ2V0SXRlcmF0b3ItPkdldEN1cnJlbnRXaWRnZXQoKSAhPSBwU0RLQW5ub3QtPkdldFhGQVdpZGdldCgpKQkKKwkJcFdpZGdldEl0ZXJhdG9yLT5TZXRDdXJyZW50V2lkZ2V0KHBTREtBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOworCVhGQV9IV0lER0VUIGhOZXh0Rm9jdXMgPSBOVUxMOworCWhOZXh0Rm9jdXMgPSBiTmV4dD9wV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTpwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb1ByZXZpb3VzKCk7CisJaWYgKGhOZXh0Rm9jdXMgPT0gTlVMTCAmJiBwU0RLQW5ub3QgIT0gTlVMTCkKKwkJaE5leHRGb2N1cyA9IHBXaWRnZXRJdGVyYXRvci0+TW92ZVRvRmlyc3QoKTsKKworCXBXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOworCXJldHVybiBwUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaE5leHRGb2N1cyk7CiB9CiAKIEZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6Q2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKQEAgLTQxNCw2ICs0NjYsMTEgQEAKIAlyZXR1cm4gcFdpZGdldDsKIH0KIAorQ1BERlNES19Bbm5vdCoJCUNQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok5ld0Fubm90KFhGQV9IV0lER0VUIGhXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKQoreworCXJldHVybiBOVUxMOworfQorCiB2b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OlJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKQEAgLTQ0MCw3ICs0OTcsNyBAQAogCQogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7Ci0JCXBBbm5vdC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOworCQkoKENQREZTREtfQkFBbm5vdCopcEFubm90KS0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwogCX0KIAllbHNlCiAJewpAQCAtNjYwLDYgKzcxNywxNSBAQAogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJCisJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOworCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisKKwlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworCUFTU0VSVChwU0RLRG9jICE9IE5VTEwpOworCisJQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisJCiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKIAkKIAlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCkBAIC02ODUsNiArNzUxLDEyIEBACiAJCQl9CiAJCX0KIAkJCisJCWlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKSAKKwkJeworCQkJaWYgKCFwV2lkZ2V0LT5Jc0FwcGVhcmFuY2VWYWxpZCgpICYmICFwV2lkZ2V0LT5HZXRWYWx1ZSgpLklzRW1wdHkoKSkKKwkJCQlwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoRkFMU0UpOworCQl9CisJCQogCiAJCWlmIChtX3BGb3JtRmlsbGVyKQogCQkJbV9wRm9ybUZpbGxlci0+T25Mb2FkKHBBbm5vdCk7CkBAIC03NTIsNiArODI0LDQwNiBAQAogCXJldHVybiByZWN0LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpOwogfQogCisvL0NQREZTREtfWEZBQW5ub3RIYW5kbGVyCisKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVW5rbm93bgkJCTAKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQ2xpZW50CQkJMSAvL2Fycm93CisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyCQkJMTEgLy9jYXB0aW9uCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0hTY3JvbGxCYXIJCTE1CisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1ZTY3JvbGxCYXIJCTE2CisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0JvcmRlcgkJCTE3CisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0VkaXQJCQkJMTkKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfSHlwZXJMaW5rICAgICAgICAyMAorCitDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6Q1BERlNES19YRkFBbm5vdEhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOgorCW1fcEFwcChwQXBwKQoreworCit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChYRkFfSFdJREdFVCBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKQoreworCUFTU0VSVChwUGFnZSAhPSBOVUxMKTsKKwlBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisJQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyAgPSBtX3BBcHAtPkdldEN1cnJlbnREb2MoKTsKKwlBU1NFUlQocFNES0RvYyk7CisJQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBTREtEb2MtPkdldEludGVyRm9ybSgpOworCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisJQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQgPSBOVUxMOworCXBXaWRnZXQgPSBuZXcgQ1BERlNES19YRkFXaWRnZXQocEFubm90LCBwUGFnZSwgcEludGVyRm9ybSk7CisJQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisJcEludGVyRm9ybS0+QWRkWEZBTWFwKHBBbm5vdCwgcFdpZGdldCk7CisKKwlyZXR1cm4gcFdpZGdldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6Q2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKK3sKKwlBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisJcmV0dXJuIHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkgIT0gTlVMTDsKK30KKwordm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBGWF9EV09SRCBkd0ZsYWdzKQoreworCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisJQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworCUFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworCUNGWF9HcmFwaGljcyBnczsKKwlncy5DcmVhdGUocERldmljZSk7CisKKwlDRlhfTWF0cml4IG10OworCW10ID0gKihDRlhfTWF0cml4KilwVXNlcjJEZXZpY2U7CisKKwlYRkFfSFdJREdFVCBoV2lkZ2V0ID0gcEFubm90LT5HZXRYRkFXaWRnZXQoKTsKKwlBU1NFUlQoaFdpZGdldCAhPSBOVUxMKTsKKworCUZYX0JPT0wgYklzSGlnaGxpZ2h0ID0gRkFMU0U7CisJaWYgKHBTREtEb2MtPkdldEZvY3VzQW5ub3QoKSAhPSBwQW5ub3QpCisJCWJJc0hpZ2hsaWdodCA9IFRSVUU7CisKKwlwV2lkZ2V0SGFuZGxlci0+UmVuZGVyV2lkZ2V0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksICZncywgJm10LCBiSXNIaWdobGlnaHQpOworCisJLy8gdG8gZG8gaGlnaGxpZ2h0IGFuZCBzaGFkb3cKKworfQorCit2b2lkIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQoreworCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisKKwlDUERGU0RLX1hGQVdpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1hGQVdpZGdldCopcEFubm90OworCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7CisJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKwlwSW50ZXJGb3JtLT5SZW1vdmVYRkFNYXAocFdpZGdldC0+R2V0WEZBV2lkZ2V0KCkpOworCisJZGVsZXRlIHBXaWRnZXQ7Cit9CisKK0NQREZfUmVjdCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCit7CisJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisJQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisJWEZBX0VMRU1FTlQgZVR5cGUgPSBwV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhwQW5ub3QtPkdldFhGQVdpZGdldCgpKS0+R2V0VUlUeXBlKCk7CisJQ0ZYX1JlY3RGIHJjQkJveDsKKwlpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlKQorCQlwV2lkZ2V0SGFuZGxlci0+R2V0QkJveCAocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgcmNCQm94LCBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUsIFRSVUUpOworCWVsc2UgCisJCXBXaWRnZXRIYW5kbGVyLT5HZXRCQm94IChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCByY0JCb3gsIDApOworCisJQ0ZYX0Zsb2F0UmVjdCByY1dpZGdldChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsIHJjQkJveC50b3ArcmNCQm94LmhlaWdodCk7CisJcmNXaWRnZXQubGVmdCAtPSAxLjBmOworCXJjV2lkZ2V0LnJpZ2h0ICs9IDEuMGY7CisJcmNXaWRnZXQuYm90dG9tIC09IDEuMGY7CisJcmNXaWRnZXQudG9wICs9IDEuMGY7CisKKwlyZXR1cm4gcmNXaWRnZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQoreworCWlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisJCXJldHVybiBGQUxTRTsKKworCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisJaWYgKCFwU0RLRG9jKQorCQlyZXR1cm4gRkFMU0U7CisKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKwlpZiAoIXBEb2MpCisJCXJldHVybiBGQUxTRTsKKworCUlYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7CisJaWYgKCFwRG9jVmlldykKKwkJcmV0dXJuIEZBTFNFOworCisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisJaWYgKCFwV2lkZ2V0SGFuZGxlcikKKwkJcmV0dXJuIEZBTFNFOworCisJRlhfRFdPUkQgZHdIaXRUZXN0ID0gcFdpZGdldEhhbmRsZXItPk9uSGl0VGVzdChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBwb2ludC54LCBwb2ludC55KTsKKwlyZXR1cm4gKGR3SGl0VGVzdCAhPSBGV0xfV0dUSElUVEVTVF9Vbmtub3duKTsKK30KKwordm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKK3sKKwlpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KSAKKwkJcmV0dXJuOworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisJQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisJcFdpZGdldEhhbmRsZXItPk9uTW91c2VFbnRlcihwQW5ub3QtPkdldFhGQVdpZGdldCgpKTsKK30KKwordm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQoreworCWlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisJCXJldHVybjsKKworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisJQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisJcFdpZGdldEhhbmRsZXItPk9uTW91c2VFeGl0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQoreworCWlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisJCXJldHVybiBGQUxTRTsKKworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisJQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisJRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisJYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkxCdXR0b25Eb3duKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisJcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQoreworCWlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisJCXJldHVybiBGQUxTRTsKKworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisJQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisJRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisJYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkxCdXR0b25VcChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworCXJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCit7CisJaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKwkJcmV0dXJuIEZBTFNFOworCisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKwlBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsKKwliUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTEJ1dHRvbkRibENsayhwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworCXJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK3sKKwlpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorCQlyZXR1cm4gRkFMU0U7CisKKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworCUFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworCUZYX0JPT0wgYlJldCA9IEZBTFNFOworCWJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZU1vdmUocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisKKwlyZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCit7CisJaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKwkJcmV0dXJuIEZBTFNFOworCisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKwlBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsKKwliUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTW91c2VXaGVlbChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBHZXRGV0xGbGFncyhuRmxhZ3MpLCB6RGVsdGEsIHBvaW50LngsIHBvaW50LnkpOworCisJcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCit7CisJaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKwkJcmV0dXJuIEZBTFNFOworCisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKwlBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsKKwliUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uUkJ1dHRvbkRvd24ocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisKKwlyZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCit7CisJaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKwkJcmV0dXJuIEZBTFNFOworCisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKwlBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsKKwliUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uUkJ1dHRvblVwKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisJcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKK3sKKwlpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorCQlyZXR1cm4gRkFMU0U7CisKKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworCUFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworCUZYX0JPT0wgYlJldCA9IEZBTFNFOworCWJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25SQnV0dG9uRGJsQ2xrKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisJcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpCit7CisJaWYgKCFwQW5ub3QpCisJCXJldHVybiBGQUxTRTsKKworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisJQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisJRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisJYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkNoYXIocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgbkNoYXIsIEdldEZXTEZsYWdzKG5GbGFncykpOworCisJcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQoreworCWlmICghcEFubm90KQorCQlyZXR1cm4gRkFMU0U7CisKKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworCUFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworCUZYX0JPT0wgYlJldCA9IEZBTFNFOworCWJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25LZXlEb3duKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIG5LZXlDb2RlLCBHZXRGV0xGbGFncyhuRmxhZykpOworCisJcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKK3sKKwlpZiAoIXBBbm5vdCkKKwkJcmV0dXJuIEZBTFNFOworCisJSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKwlBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKwlGWF9CT09MIGJSZXQgPSBGQUxTRTsKKwliUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uS2V5VXAocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgbktleUNvZGUsIEdldEZXTEZsYWdzKG5GbGFnKSk7CisKKwlyZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQoreworCXJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQoreworCXJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblhGQUNoYW5nZWRGb2N1cyhDUERGU0RLX0Fubm90KiBwT2xkQW5ub3QsIENQREZTREtfQW5ub3QqIHBOZXdBbm5vdCkKK3sKKwlJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gTlVMTDsKKworCWlmIChwT2xkQW5ub3QpCisJCXBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwT2xkQW5ub3QpOworCWVsc2UgaWYgKHBOZXdBbm5vdCkKKwkJcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBOZXdBbm5vdCk7CisKKwlpZiAocFdpZGdldEhhbmRsZXIpCisJeworCQlGWF9CT09MIGJSZXQgPSBUUlVFOyAvKnBXaWRnZXRIYW5kbGVyLT5PbkZvY3VzQ2hhbmdlKHBOZXdBbm5vdCA/IHBOZXdBbm5vdC0+R2V0WEZBV2lkZ2V0KCkgOiBOVUxMLAorCQkJcE9sZEFubm90ID8gcE9sZEFubm90LT5HZXRYRkFXaWRnZXQoKSA6IE5VTEwpOyAqLworCisJCVhGQV9IV0lER0VUIGhXaWRnZXQgPSBwTmV3QW5ub3QgPyBwTmV3QW5ub3QtPkdldFhGQVdpZGdldCgpIDogTlVMTDsKKwkJaWYgKGhXaWRnZXQpCisJCXsKKwkJCUlYRkFfUGFnZVZpZXcqIHBYRkFQYWdlVmlldyA9IHBXaWRnZXRIYW5kbGVyLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsKKwkJCWlmIChwWEZBUGFnZVZpZXcpCisJCQl7CisJCQkJYlJldCA9IHBYRkFQYWdlVmlldy0+R2V0RG9jVmlldygpLT5TZXRGb2N1cyhoV2lkZ2V0KTsKKwkJCQlpZiAocFhGQVBhZ2VWaWV3LT5HZXREb2NWaWV3KCktPkdldEZvY3VzV2lkZ2V0KCkgPT0gaFdpZGdldCkKKwkJCQkJYlJldCA9IFRSVUU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJSZXQ7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0lYRkFfV2lkZ2V0SGFuZGxlciogQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkdldFhGQVdpZGdldEhhbmRsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KQoreworCWlmICghcEFubm90KQorCQlyZXR1cm4gTlVMTDsKKworCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKwlpZiAoIXBQYWdlVmlldykKKwkJcmV0dXJuIE5VTEw7CisKKwlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworCWlmICghcFNES0RvYykKKwkJcmV0dXJuIE5VTEw7CisKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKwlpZiAoIXBEb2MpCisJCXJldHVybiBOVUxMOworCisJSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKwlpZiAoIXBEb2NWaWV3KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworfQorCisjZGVmaW5lIEZXTF9LRVlGTEFHX0N0cmwJCQkJCSgxIDw8IDApCisjZGVmaW5lIEZXTF9LRVlGTEFHX0FsdAkJCQkJCSgxIDw8IDEpCisjZGVmaW5lIEZXTF9LRVlGTEFHX1NoaWZ0CQkJCQkoMSA8PCAyKQorI2RlZmluZSBGV0xfS0VZRkxBR19MQnV0dG9uCQkJCQkoMSA8PCAzKQorI2RlZmluZSBGV0xfS0VZRkxBR19SQnV0dG9uCQkJCQkoMSA8PCA0KQorI2RlZmluZSBGV0xfS0VZRkxBR19NQnV0dG9uCQkJCQkoMSA8PCA1KQorCitGWF9EV09SRCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6R2V0RldMRmxhZ3MoRlhfRFdPUkQgZHdGbGFnKQoreworCUZYX0RXT1JEIGR3RldMRmxhZyA9IDA7CisKKwlpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19Db250cm9sS2V5KQorCQlkd0ZXTEZsYWcgfD0gRldMX0tFWUZMQUdfQ3RybDsKKwlpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19MZWZ0QnV0dG9uRG93bikKKwkJZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0xCdXR0b247CisJaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93bikKKwkJZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX01CdXR0b247CisJaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfUmlnaHRCdXR0b25Eb3duKQorCQlkd0ZXTEZsYWcgfD0gRldMX0tFWUZMQUdfUkJ1dHRvbjsKKwlpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19TaGlmdEtleSkKKwkJZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX1NoaWZ0OworCWlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX0FsdEtleSkKKwkJZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0FsdDsKKworCXJldHVybiBkd0ZXTEZsYWc7Cit9CisKIC8vQ1JlYWRlcl9Bbm5vdEl0ZXJhdG9yRXgKIAogQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxGWF9CT09MIGJSZXZlcnNlLApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwIGIvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwCmluZGV4IGZmMDU0YzguLjkwZTIyZDMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAKQEAgLTUsNiArNSw3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19tZ3IuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgiCiAKQEAgLTUwMCw0MiArNTAxLDMyIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8JCQkJCQkJCUNQREZTREtfQW5ub3QJCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ1BERlNES19Bbm5vdDo6Q1BERlNES19Bbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgOgotbV9wQW5ub3QocEFubm90KSwKK0NQREZTREtfQW5ub3Q6OkNQREZTREtfQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA6CiBtX3BQYWdlVmlldyhwUGFnZVZpZXcpLAogbV9iU2VsZWN0ZWQoRkFMU0UpLAogbV9uVGFiT3JkZXIoLTEpCiB7CiB9CiAKLUNQREZTREtfQW5ub3Q6On5DUERGU0RLX0Fubm90KCkKKworLy9DUERGU0RLX0JBQW5ub3QKK0NQREZTREtfQkFBbm5vdDo6Q1BERlNES19CQUFubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA6CisJQ1BERlNES19Bbm5vdChwUGFnZVZpZXcpLAorCQltX3BBbm5vdChwQW5ub3QpCit7CisKK30KKworQ1BERlNES19CQUFubm90Ojp+Q1BERlNES19CQUFubm90KCkKIHsKIAltX3BBbm5vdCA9IE5VTEw7Ci0JbV9wUGFnZVZpZXcgPSBOVUxMOwogfQogCi1DUERGX0Fubm90KglDUERGU0RLX0Fubm90OjpHZXRQREZBbm5vdCgpCitDUERGX0Fubm90KglDUERGU0RLX0JBQW5ub3Q6OkdldFBERkFubm90KCkKIHsKIAlyZXR1cm4gbV9wQW5ub3Q7CiB9CiAKLUZYX0RXT1JEIENQREZTREtfQW5ub3Q6OkdldEZsYWdzKCkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIG1fcEFubm90LT5HZXRGbGFncygpOwotfQotCi12b2lkIENQREZTREtfQW5ub3Q6OlNldFBhZ2UoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCW1fcFBhZ2VWaWV3ID0gcFBhZ2VWaWV3OwotfQotCi1DUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0Fubm90OjpHZXRQYWdlVmlldygpCi17Ci0JcmV0dXJuIG1fcFBhZ2VWaWV3OwotfQotCiBGWF9CT09MIENQREZTREtfQW5ub3Q6OklzU2VsZWN0ZWQoKQogewogCXJldHVybiBtX2JTZWxlY3RlZDsKQEAgLTU1NywxNCArNTQ4LDE0IEBACiAJbV9uVGFiT3JkZXIgPSBpVGFiT3JkZXI7CiB9CiAKLUNQREZfRGljdGlvbmFyeSogQ1BERlNES19Bbm5vdDo6R2V0QW5ub3REaWN0KCkgY29uc3QKK0NQREZfRGljdGlvbmFyeSogQ1BERlNES19CQUFubm90OjpHZXRBbm5vdERpY3QoKSBjb25zdAogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAkKIAlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdDsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC01NzQsNyArNTY1LDcgQEAKIAltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdFJlY3QoIlJlY3QiLCByZWN0KTsKIH0KIAotQ1BERl9SZWN0IENQREZTREtfQW5ub3Q6OkdldFJlY3QoKSBjb25zdAorQ1BERl9SZWN0IENQREZTREtfQkFBbm5vdDo6R2V0UmVjdCgpIGNvbnN0CiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCQpAQCAtNTg0LDE5ICs1NzUsMjQgQEAKIAlyZXR1cm4gcmVjdDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0VHlwZSgpIGNvbnN0CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldFR5cGUoKSBjb25zdAogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAkKIAlyZXR1cm4gbV9wQW5ub3QtPkdldFN1YlR5cGUoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0U3ViVHlwZSgpIGNvbnN0CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldFN1YlR5cGUoKSBjb25zdAogewogCXJldHVybiAiIjsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlJlc2V0QXBwZWFyYW5jZSgpCit7CisJQVNTRVJUKEZBTFNFKTsKK30KKwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAJCQkJCQkJCSAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCQogewogCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKQEAgLTYwNSw3ICs2MDEsNyBAQAogCW1fcEFubm90LT5EcmF3QXBwZWFyYW5jZShtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZCgpCitGWF9CT09MCUNQREZTREtfQkFBbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKQogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTYxMyw3ICs2MDksNyBAQAogCXJldHVybiBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpICE9IE5VTEw7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19Bbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKK0ZYX0JPT0wJQ1BERlNES19CQUFubm90OjpJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTYzNywyMCArNjMzLDIwIEBACiAJcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAordm9pZCBDUERGU0RLX0JBQW5ub3Q6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKIAkJCQkJCSAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCW1fcEFubm90LT5EcmF3Qm9yZGVyKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcE9wdGlvbnMpOyAKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpDbGVhckNhY2hlZEFQKCkKK3ZvaWQgQ1BERlNES19CQUFubm90OjpDbGVhckNhY2hlZEFQKCkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKIH0gICAgCiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cykKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc0NvbnRlbnRzKQogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTY2MSw3ICs2NTcsNyBAQAogCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdFN0cmluZygiQ29udGVudHMiLCBQREZfRW5jb2RlVGV4dChzQ29udGVudHMpKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0Q29udGVudHMoKSBjb25zdAorQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRDb250ZW50cygpIGNvbnN0CiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtNjY5LDcgKzY2NSw3IEBACiAJcmV0dXJuIG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldFVuaWNvZGVUZXh0KCJDb250ZW50cyIpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldEFubm90TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpCit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0QW5ub3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC02ODAsNyArNjc2LDcgQEAKIAkJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXRTdHJpbmcoIk5NIiwgUERGX0VuY29kZVRleHQoc05hbWUpKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0QW5ub3ROYW1lKCkgY29uc3QKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfQkFBbm5vdDo6R2V0QW5ub3ROYW1lKCkgY29uc3QKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC02ODgsNyArNjg0LDcgQEAKIAlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0VW5pY29kZVRleHQoIk5NIik7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0TW9kaWZpZWREYXRlKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldE1vZGlmaWVkRGF0ZShjb25zdCBGWF9TWVNURU1USU1FJiBzdCkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC03MDIsNyArNjk4LDcgQEAKIAkJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXRTdHJpbmcoIk0iLCBzdHIpOwogfQogCi1GWF9TWVNURU1USU1FIENQREZTREtfQW5ub3Q6OkdldE1vZGlmaWVkRGF0ZSgpIGNvbnN0CitGWF9TWVNURU1USU1FIENQREZTREtfQkFBbm5vdDo6R2V0TW9kaWZpZWREYXRlKCkgY29uc3QKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC03MTYsNyArNzEyLDcgQEAKIAlyZXR1cm4gc3lzdGltZTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRGbGFncyhpbnQgbkZsYWdzKQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEZsYWdzKGludCBuRmxhZ3MpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtNzI0LDcgKzcyMCw3IEBACiAJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXRJbnRlZ2VyKCJGIiwgbkZsYWdzKTsKIH0KIAotaW50IENQREZTREtfQW5ub3Q6OkdldEZsYWdzKCkgY29uc3QKK2ludCBDUERGU0RLX0JBQW5ub3Q6OkdldEZsYWdzKCkgY29uc3QKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC03MzIsNyArNzI4LDcgQEAKIAlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0SW50ZWdlcigiRiIpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldEFwcFN0YXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0QXBwU3RhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC03NDMsNyArNzM5LDcgQEAKIAkJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXRTdHJpbmcoIkFTIiwgc3RyKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0QXBwU3RhdGUoKSBjb25zdAorQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRBcHBTdGF0ZSgpIGNvbnN0CiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtNzUxLDcgKzc0Nyw3IEBACiAJcmV0dXJuIG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldFN0cmluZygiQVMiKTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRTdHJ1Y3RQYXJlbnQoaW50IGtleSkKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRTdHJ1Y3RQYXJlbnQoaW50IGtleSkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC03NTksNyArNzU1LDcgQEAKIAltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdEludGVnZXIoIlN0cnVjdFBhcmVudCIsIGtleSk7CiB9CiAKLWludAlDUERGU0RLX0Fubm90OjpHZXRTdHJ1Y3RQYXJlbnQoKSBjb25zdAoraW50CUNQREZTREtfQkFBbm5vdDo6R2V0U3RydWN0UGFyZW50KCkgY29uc3QKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC03NjgsNyArNzY0LDcgQEAKIH0KIAogLy9ib3JkZXIKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0Qm9yZGVyV2lkdGgoaW50IG5XaWR0aCkKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRCb3JkZXJXaWR0aChpbnQgbldpZHRoKQogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTc5Myw3ICs3ODksNyBAQAogCX0KIH0KIAotaW50CUNQREZTREtfQW5ub3Q6OkdldEJvcmRlcldpZHRoKCkgY29uc3QKK2ludAlDUERGU0RLX0JBQW5ub3Q6OkdldEJvcmRlcldpZHRoKCkgY29uc3QKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC04MTYsNyArODEyLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRCb3JkZXJTdHlsZShpbnQgblN0eWxlKQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEJvcmRlclN0eWxlKGludCBuU3R5bGUpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtODQ4LDcgKzg0NCw3IEBACiAJfQogfQogCi1pbnQJQ1BERlNES19Bbm5vdDo6R2V0Qm9yZGVyU3R5bGUoKSBjb25zdAoraW50CUNQREZTREtfQkFBbm5vdDo6R2V0Qm9yZGVyU3R5bGUoKSBjb25zdAogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTg3OCw3ICs4NzQsNyBAQAogCXJldHVybiBCQlNfU09MSUQ7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0Qm9yZGVyRGFzaChjb25zdCBDRlhfSW50QXJyYXkmIGFycmF5KQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEJvcmRlckRhc2goY29uc3QgQ0ZYX0ludEFycmF5JiBhcnJheSkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC04OTksNyArODk1LDcgQEAKIAlwQlNEaWN0LT5TZXRBdCgiRCIsIHBBcnJheSk7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6R2V0Qm9yZGVyRGFzaChDRlhfSW50QXJyYXkmIGFycmF5KSBjb25zdAordm9pZCBDUERGU0RLX0JBQW5ub3Q6OkdldEJvcmRlckRhc2goQ0ZYX0ludEFycmF5JiBhcnJheSkgY29uc3QKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC05MjksNyArOTI1LDcgQEAKIAl9CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0Q29sb3IoRlhfQ09MT1JSRUYgY29sb3IpCit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0Q29sb3IoRlhfQ09MT1JSRUYgY29sb3IpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtOTQxLDcgKzkzNyw3IEBACiAJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXQoIkMiLCBwQXJyYXkpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlJlbW92ZUNvbG9yKCkKK3ZvaWQgQ1BERlNES19CQUFubm90OjpSZW1vdmVDb2xvcigpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtOTQ5LDcgKzk0NSw3IEBACiAJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+UmVtb3ZlQXQoIkMiKSA7IAogfQogCi1GWF9CT09MIENQREZTREtfQW5ub3Q6OkdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QKK0ZYX0JPT0wgQ1BERlNES19CQUFubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtOTk2LDcgKzk5Miw3IEBACiB9CiAKIAotdm9pZCBDUERGU0RLX0Fubm90OjpXcml0ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmNCQm94LCAKK3ZvaWQgQ1BERlNES19CQUFubm90OjpXcml0ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmNCQm94LCAKIAkJCQkJCQkJY29uc3QgQ1BERl9NYXRyaXgmIG1hdHJpeCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNDb250ZW50cywKIAkJCQkJCQkJY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFN0YXRlKQogewpAQCAtMTA3OCwxNyArMTA3NCwxNyBAQAogCXJldHVybiBCQV9BTk5PVF9NSU5IRUlHSFQ7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdDo6Q3JlYXRlRm9ybUZpbGxlcigpCitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6Q3JlYXRlRm9ybUZpbGxlcigpCiB7CiAJcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MCUNQREZTREtfQW5ub3Q6OklzVmlzaWJsZSgpIGNvbnN0CitGWF9CT09MCUNQREZTREtfQkFBbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QKIHsKIAlpbnQgbkZsYWdzID0gR2V0RmxhZ3MoKTsKIAlyZXR1cm4gISgobkZsYWdzICYgQU5OT1RGTEFHX0lOVklTSUJMRSkgfHwgKG5GbGFncyAmIEFOTk9URkxBR19ISURERU4pIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfTk9WSUVXKSk7CiB9CiAKLUNQREZfQWN0aW9uIENQREZTREtfQW5ub3Q6OkdldEFjdGlvbigpIGNvbnN0CitDUERGX0FjdGlvbiBDUERGU0RLX0JBQW5ub3Q6OkdldEFjdGlvbigpIGNvbnN0CiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtMTA5Niw3ICsxMDkyLDcgQEAKIAlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0RGljdCgiQSIpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTExMTQsNyArMTExMCw3IEBACiAJfQogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlJlbW92ZUFjdGlvbigpCit2b2lkIENQREZTREtfQkFBbm5vdDo6UmVtb3ZlQWN0aW9uKCkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC0xMTIyLDcgKzExMTgsNyBAQAogCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlJlbW92ZUF0KCJBIik7CiB9CiAKLUNQREZfQUFjdGlvbiBDUERGU0RLX0Fubm90OjpHZXRBQWN0aW9uKCkgY29uc3QKK0NQREZfQUFjdGlvbiBDUERGU0RLX0JBQW5ub3Q6OkdldEFBY3Rpb24oKSBjb25zdAogewogCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKQEAgLTExMzAsNyArMTEyNiw3IEBACiAJcmV0dXJuIG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkFBIik7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0QUFjdGlvbihjb25zdCBDUERGX0FBY3Rpb24mIGFhKQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFBY3Rpb24oY29uc3QgQ1BERl9BQWN0aW9uJiBhYSkKIHsKIAlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CiAJQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CkBAIC0xMTQwLDcgKzExMzYsNyBAQAogCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdCgiQUEiLCAoQ1BERl9BQWN0aW9uJilhYSk7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6UmVtb3ZlQUFjdGlvbigpCit2b2lkIENQREZTREtfQkFBbm5vdDo6UmVtb3ZlQUFjdGlvbigpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwpAQCAtMTE0OCw3ICsxMTQ0LDcgQEAKIAltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5SZW1vdmVBdCgiQUEiKTsKIH0KIAotQ1BERl9BY3Rpb24JQ1BERlNES19Bbm5vdDo6R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpCitDUERGX0FjdGlvbglDUERGU0RLX0JBQW5ub3Q6OkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKQogewogCUNQREZfQUFjdGlvbiBBQWN0aW9uID0gR2V0QUFjdGlvbigpOwogCQpAQCAtMTE2NCw3ICsxMTYwLDEyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgIENQREZTREtfQW5ub3Q6OkFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQorRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OklzWEZBRmllbGQoKQoreworCXJldHVybiBGQUxTRTsKK30KKwordm9pZCAgQ1BERlNES19CQUFubm90OjpBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKIHsKIAkKIAltX3BBbm5vdC0+R2V0QVBGb3JtKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIENQREZfQW5ub3Q6Ok5vcm1hbCk7CkBAIC0xMTgwLDMgKzExODEsMTAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorQ1BERlhGQV9QYWdlKiBDUERGU0RLX0Fubm90OjpHZXRQREZYRkFQYWdlKCkKK3sKKwlpZiAobV9wUGFnZVZpZXcpCisJCXJldHVybiBtX3BQYWdlVmlldy0+R2V0UERGWEZBUGFnZSgpOworCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCmluZGV4IGFhODdkZDUuLmMzMDFhODcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCkBAIC01LDYgKzUsOCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19iYXNlYW5ub3QuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaCIKQEAgLTIzLDEwICsyNSwxMiBAQAogI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCiAKIENQREZTREtfV2lkZ2V0OjpDUERGU0RLX1dpZGdldChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0pIDoKLQkJCQkJQ1BERlNES19Bbm5vdChwQW5ub3QsIHBQYWdlVmlldyksCisJCQkJCUNQREZTREtfQkFBbm5vdChwQW5ub3QsIHBQYWdlVmlldyksCiAJCQkJCW1fcEludGVyRm9ybShwSW50ZXJGb3JtKSwKIAkJCQkJbV9uQXBwQWdlKDApLAotCQkJCQltX25WYWx1ZUFnZSgwKQorCQkJCQltX25WYWx1ZUFnZSgwKSwKKwkJCQkJbV9oTWl4WEZBV2lkZ2V0KE5VTEwpLAorCQkJCQltX3BXaWRnZXRIYW5kbGVyKE5VTEwpCiB7CiAJQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKIH0KQEAgLTM2LDYgKzQwLDUyNyBAQAogCiB9CiAKK1hGQV9IV0lER0VUCUNQREZTREtfV2lkZ2V0OjpHZXRNaXhYRkFXaWRnZXQoKQoreworCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKKworCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKwlBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKKworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworCUFTU0VSVChwRG9jICE9IE5VTEwpOworCisJaWYgKHBEb2MtPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX1NUQVRJQ19YRkEpCisJeworCQlpZiAoIW1faE1peFhGQVdpZGdldCkKKwkJeworCQkJaWYgKElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCkpCisJCQl7CisJCQkJQ0ZYX1dpZGVTdHJpbmcgc05hbWU7CisJCQkJaWYgKHRoaXMtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKKwkJCQl7CisJCQkJCXNOYW1lID0gdGhpcy0+R2V0QW5ub3ROYW1lKCk7CisJCQkJCWlmIChzTmFtZS5Jc0VtcHR5KCkpCisJCQkJCQlzTmFtZSA9IEdldE5hbWUoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlzTmFtZSA9IEdldE5hbWUoKTsKKworCQkJCWlmICghc05hbWUuSXNFbXB0eSgpKQorCQkJCQltX2hNaXhYRkFXaWRnZXQgPSBwRG9jVmlldy0+R2V0V2lkZ2V0QnlOYW1lKHNOYW1lKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbV9oTWl4WEZBV2lkZ2V0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitYRkFfSFdJREdFVAlDUERGU0RLX1dpZGdldDo6R2V0R3JvdXBNaXhYRkFXaWRnZXQoKQoreworCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKKworCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKwlBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKKworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworCUFTU0VSVChwRG9jICE9IE5VTEwpOworCisJaWYgKHBEb2MtPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX1NUQVRJQ19YRkEpCisJeworCQlpZiAoSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKSkKKwkJeworCQkJQ0ZYX1dpZGVTdHJpbmcgc05hbWUgPSBHZXROYW1lKCk7CisKKwkJCWlmICghc05hbWUuSXNFbXB0eSgpKQorCQkJCXJldHVybiBwRG9jVmlldy0+R2V0V2lkZ2V0QnlOYW1lKHNOYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitJWEZBX1dpZGdldEhhbmRsZXIqIENQREZTREtfV2lkZ2V0OjpHZXRYRkFXaWRnZXRIYW5kbGVyKCkKK3sKKwlBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7CisKKwlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisJQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKwlBU1NFUlQocERvYyAhPSBOVUxMKTsKKworCWlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKQorCXsKKwkJaWYgKCFtX3BXaWRnZXRIYW5kbGVyKQorCQl7CisJCQlpZiAoSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKSkKKwkJCXsKKwkJCQltX3BXaWRnZXRIYW5kbGVyID0gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbV9wV2lkZ2V0SGFuZGxlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFhGQV9FVkVOVFRZUEUgR2V0WEZBRXZlbnRUeXBlKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFUKQoreworCVhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOworCisJc3dpdGNoIChlWEZBQUFUKQorCXsKKwljYXNlIFBERlNES19YRkFfQ2xpY2s6CisJCWVFdmVudFR5cGUgPSBYRkFfRVZFTlRfQ2xpY2s7CisJCWJyZWFrOworCWNhc2UgUERGU0RLX1hGQV9GdWxsOgorCQllRXZlbnRUeXBlID0gWEZBX0VWRU5UX0Z1bGw7CisJCWJyZWFrOworCWNhc2UgUERGU0RLX1hGQV9QcmVPcGVuOgorCQllRXZlbnRUeXBlID0gWEZBX0VWRU5UX1ByZU9wZW47CisJCWJyZWFrOworCWNhc2UgUERGU0RLX1hGQV9Qb3N0T3BlbjoKKwkJZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Qb3N0T3BlbjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVFdmVudFR5cGU7Cit9CisKK3N0YXRpYyBYRkFfRVZFTlRUWVBFIEdldFhGQUV2ZW50VHlwZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wgYldpbGxDb21taXQpCit7CisJWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX1Vua25vd247CisKKwlzd2l0Y2ggKGVBQVQpCisJeworCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlcjoKKwkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfTW91c2VFbnRlcjsJCisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgorCQllRXZlbnRUeXBlID0gIFhGQV9FVkVOVF9Nb3VzZUV4aXQ7CisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duOgorCQllRXZlbnRUeXBlID0gIFhGQV9FVkVOVF9Nb3VzZURvd247CisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKKwkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfTW91c2VVcDsJCisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKKwkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfRW50ZXI7CisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CisJCWVFdmVudFR5cGUgPSAgWEZBX0VWRU5UX0V4aXQ7CisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlT3BlbjoKKwkJYnJlYWs7CisJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VDbG9zZToKKwkJYnJlYWs7CisJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgorCQlicmVhazsKKwljYXNlIENQREZfQUFjdGlvbjo6UGFnZUludmlzaWJsZToKKwkJYnJlYWs7CisJY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKKwkJaWYgKCFiV2lsbENvbW1pdCkKKwkJeworCQkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfQ2hhbmdlOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKKwkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfVmFsaWRhdGU7CisJCWJyZWFrOworCWNhc2UgQ1BERl9BQWN0aW9uOjpPcGVuUGFnZToKKwljYXNlIENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlOgorCWNhc2UgQ1BERl9BQWN0aW9uOjpGb3JtYXQ6CisJY2FzZSBDUERGX0FBY3Rpb246OkNhbGN1bGF0ZToKKwljYXNlIENQREZfQUFjdGlvbjo6Q2xvc2VEb2N1bWVudDoKKwljYXNlIENQREZfQUFjdGlvbjo6U2F2ZURvY3VtZW50OgorCWNhc2UgQ1BERl9BQWN0aW9uOjpEb2N1bWVudFNhdmVkOgorCWNhc2UgQ1BERl9BQWN0aW9uOjpQcmludERvY3VtZW50OgorCWNhc2UgQ1BERl9BQWN0aW9uOjpEb2N1bWVudFByaW50ZWQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBlRXZlbnRUeXBlOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpIYXNYRkFBQWN0aW9uKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFUKQoreworCWlmIChYRkFfSFdJREdFVCBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpCisJeworCQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkKKwkJeworCQkJWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gR2V0WEZBRXZlbnRUeXBlKGVYRkFBQVQpOworCisJCQlpZiAoKGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0NsaWNrIHx8CisJCQkJZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2hhbmdlKSAmJiAKKwkJCQlHZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCisJCQl7CisJCQkJaWYgKFhGQV9IV0lER0VUIGhHcm91cFdpZGdldCA9IEdldEdyb3VwTWl4WEZBV2lkZ2V0KCkpCisJCQkJeworCQkJCQlDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhHcm91cFdpZGdldCk7CisJCQkJCWlmIChwWEZBV2lkZ2V0SGFuZGxlci0+SGFzRXZlbnQocEFjYywgZUV2ZW50VHlwZSkpCisJCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQl9CisKKwkJCXsKKwkJCQlDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpOworCQkJCXJldHVybiBwWEZBV2lkZ2V0SGFuZGxlci0+SGFzRXZlbnQocEFjYywgZUV2ZW50VHlwZSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wJQ1BERlNES19XaWRnZXQ6Ok9uWEZBQUFjdGlvbihQREZTREtfWEZBQUFjdGlvblR5cGUgZVhGQUFBVCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCit7CisJQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworCisJQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworCUFTU0VSVChwU0RLRG9jICE9IE5VTEwpOworCisJQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKwlpZiAoWEZBX0hXSURHRVQgaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQorCXsKKwkJWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gR2V0WEZBRXZlbnRUeXBlKGVYRkFBQVQpOworCisJCWlmIChlRXZlbnRUeXBlICE9IFhGQV9FVkVOVF9Vbmtub3duKQorCQl7CisJCQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkKKwkJCXsKKwkJCQlDWEZBX0V2ZW50UGFyYW0gcGFyYW07CisJCQkJcGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7CisJCQkJcGFyYW0ubV93c0NoYW5nZSA9IGRhdGEuc0NoYW5nZTsKKwkJCQlwYXJhbS5tX2lDb21taXRLZXkgPSBkYXRhLm5Db21taXRLZXk7CisJCQkJcGFyYW0ubV9iU2hpZnQgPSBkYXRhLmJTaGlmdDsKKwkJCQlwYXJhbS5tX2lTZWxTdGFydCA9IGRhdGEublNlbFN0YXJ0OworCQkJCXBhcmFtLm1faVNlbEVuZCA9IGRhdGEublNlbEVuZDsKKwkJCQlwYXJhbS5tX3dzRnVsbFRleHQgPSBkYXRhLnNWYWx1ZTsKKwkJCQlwYXJhbS5tX2JLZXlEb3duID0gZGF0YS5iS2V5RG93bjsKKwkJCQlwYXJhbS5tX2JNb2RpZmllciA9IGRhdGEuYk1vZGlmaWVyOworCQkJCXBhcmFtLm1fd3NOZXdUZXh0ID0gZGF0YS5zVmFsdWU7CisJCQkJaWYgKGRhdGEublNlbEVuZCA+IGRhdGEublNlbFN0YXJ0KQorCQkJCQlwYXJhbS5tX3dzTmV3VGV4dC5EZWxldGUoZGF0YS5uU2VsU3RhcnQsIGRhdGEublNlbEVuZCAtIGRhdGEublNlbFN0YXJ0KTsKKwkJCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5zQ2hhbmdlLkdldExlbmd0aCgpOyBpKyspCisJCQkJCXBhcmFtLm1fd3NOZXdUZXh0Lkluc2VydChkYXRhLm5TZWxTdGFydCwgZGF0YS5zQ2hhbmdlW2ldKTsKKwkJCQlwYXJhbS5tX3dzUHJldlRleHQgPSBkYXRhLnNWYWx1ZTsKKworCQkJCWlmICgoZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2xpY2sgfHwKKwkJCQkJZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2hhbmdlKSAmJiAKKwkJCQkJR2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQorCQkJCXsKKwkJCQkJaWYgKFhGQV9IV0lER0VUIGhHcm91cFdpZGdldCA9IEdldEdyb3VwTWl4WEZBV2lkZ2V0KCkpCisJCQkJCXsKKwkJCQkJCUNYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaEdyb3VwV2lkZ2V0KTsKKwkJCQkJCXBhcmFtLm1fcFRhcmdldCA9IHBBY2M7CisJCQkJCQlwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CQorCQkJCQl9CisKKwkJCQkJeworCQkJCQkJQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KTsKKwkJCQkJCXBhcmFtLm1fcFRhcmdldCA9IHBBY2M7CisJCQkJCQlGWF9JTlQzMiBuUmV0ID0gcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOwkKKwkJCQkJCXJldHVybiBuUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpOworCQkJCQlwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOworCQkJCQlGWF9JTlQzMiBuUmV0ID0gcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOwkKKwkJCQkJcmV0dXJuIG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzOworCQkJCX0KKworCQkJCWlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKQorCQkJCXsKKwkJCQkJcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplKEZYX0JPT0wgYlN5bmNocm9uaXplRWxzZSkKK3sKKwlpZiAoWEZBX0hXSURHRVQgaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQorCXsKKwkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCisJCXsKKwkJCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisJCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworCQkJaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpCisJCQl7CisJCQkJc3dpdGNoIChHZXRGaWVsZFR5cGUoKSkKKwkJCQl7CisJCQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisJCQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisJCQkJCXsJCQkKKwkJCQkJCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisJCQkJCQlBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOworCisJCQkJCQlYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IHBGb3JtQ3RybC0+SXNDaGVja2VkKCkgPyBYRkFfQ0hFQ0tTVEFURV9PbiA6IFhGQV9DSEVDS1NUQVRFX09mZjsKKwkJCQkJCXBXaWRnZXRBY2MtPlNldENoZWNrU3RhdGUoZUNoZWNrU3RhdGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKKwkJCQkJcFdpZGdldEFjYy0+U2V0VmFsdWUocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKKwkJCQkJeworCQkJCQkJcFdpZGdldEFjYy0+Q2xlYXJBbGxTZWxlY3Rpb25zKCk7CisKKwkJCQkJCWZvciAoaW50IGk9MCxzej1wRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaTxzejsgaSsrKQorCQkJCQkJeworCQkJCQkJCWludCBuSW5kZXggPSBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCQkJCWlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpKQorCQkJCQkJCQlwV2lkZ2V0QWNjLT5TZXRJdGVtU3RhdGUobkluZGV4LCBUUlVFLCBGQUxTRSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CisJCQkJCXsKKwkJCQkJCXBXaWRnZXRBY2MtPkNsZWFyQWxsU2VsZWN0aW9ucygpOworCisJCQkJCQlmb3IgKGludCBpPTAsc3o9cEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGk8c3o7IGkrKykKKwkJCQkJCXsKKwkJCQkJCQlpbnQgbkluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKTsKKwkJCQkJCQlpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKSkKKwkJCQkJCQkJcFdpZGdldEFjYy0+U2V0SXRlbVN0YXRlKG5JbmRleCwgVFJVRSwgRkFMU0UpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcFdpZGdldEFjYy0+U2V0VmFsdWUocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKGJTeW5jaHJvbml6ZUVsc2UpCisJCQkJCXBXaWRnZXRBY2MtPlByb2Nlc3NWYWx1ZUNoYW5nZWQoKTsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemVYRkFWYWx1ZSgpCit7CisJQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworCisJQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworCUFTU0VSVChwU0RLRG9jICE9IE5VTEwpOworCisJQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKwlJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpOworCWlmICghcFhGQURvY1ZpZXcpIHJldHVybjsKKworCWlmIChYRkFfSFdJREdFVCBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpCisJeworCQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkKKwkJeworCQkJQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKwkJCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisJCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworCQkJQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworCQkJQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBVmFsdWUocFhGQURvY1ZpZXcsIGhXaWRnZXQsIHBGb3JtRmllbGQsIHBGb3JtQ3RybCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBSXRlbXMoKQoreworCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKKworCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKwlBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKKworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworCUFTU0VSVChwRG9jICE9IE5VTEwpOworCisJSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKwlpZiAoIXBYRkFEb2NWaWV3KSByZXR1cm47CisKKwlpZiAoWEZBX0hXSURHRVQgaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQorCXsKKwkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCisJCXsKKwkJCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisJCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworCQkJU3luY2hyb25pemVYRkFJdGVtcyhwWEZBRG9jVmlldywgaFdpZGdldCwgcEZvcm1GaWVsZCwgTlVMTCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBVmFsdWUoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywgWEZBX0hXSURHRVQgaFdpZGdldCwgCisJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCkKK3sKKwlBU1NFUlQocFhGQURvY1ZpZXcgIT0gTlVMTCk7CisJQVNTRVJUKGhXaWRnZXQgIT0gTlVMTCk7CisKKwlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkpCisJeworCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKwkJQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKKworCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQorCQl7CisJCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorCQkJeworCQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQorCQkJCXsKKwkJCQkJRlhfQk9PTCBiQ2hlY2tlZCA9IHBXaWRnZXRBY2MtPkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbjsKKworCQkJCQlwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wocEZvcm1GaWVsZC0+R2V0Q29udHJvbEluZGV4KHBGb3JtQ29udHJvbCksIAorCQkJCQkJYkNoZWNrZWQsIFRSVUUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKKwkJCXsKKwkJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKKwkJCQl7CisJCQkJCUZYX0JPT0wgYkNoZWNrZWQgPSBwV2lkZ2V0QWNjLT5HZXRDaGVja1N0YXRlKCkgPT0gWEZBX0NIRUNLU1RBVEVfT247CisKKwkJCQkJcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUNvbnRyb2wpLCAKKwkJCQkJCWJDaGVja2VkLCBUUlVFKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorCQkJeworCQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQorCQkJCXsKKwkJCQkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworCQkJCQlwV2lkZ2V0QWNjLT5HZXRWYWx1ZShzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7CisJCQkJCXBGb3JtRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgVFJVRSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CisJCQl7CisJCQkJcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworCisJCQkJaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpCisJCQkJeworCQkJCQlmb3IgKGludCBpPTAsc3o9cFdpZGdldEFjYy0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGk8c3o7IGkrKykKKwkJCQkJeworCQkJCQkJaW50IG5JbmRleCA9IHBXaWRnZXRBY2MtPkdldFNlbGVjdGVkSXRlbShpKTsKKworCQkJCQkJaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpKQorCQkJCQkJeworCQkJCQkJCXBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24obkluZGV4LCBUUlVFLCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKKwkJCXsKKwkJCQlwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihGQUxTRSk7CisKKwkJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKKwkJCQl7CisJCQkJCWZvciAoaW50IGk9MCxzej1wV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaTxzejsgaSsrKQorCQkJCQl7CisJCQkJCQlpbnQgbkluZGV4ID0gcFdpZGdldEFjYy0+R2V0U2VsZWN0ZWRJdGVtKGkpOworCisJCQkJCQlpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkpCisJCQkJCQl7CisJCQkJCQkJcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihuSW5kZXgsIFRSVUUsIFRSVUUpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworCQkJCQlwV2lkZ2V0QWNjLT5HZXRWYWx1ZShzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7CisJCQkJCXBGb3JtRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgVFJVRSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBSXRlbXMoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywgWEZBX0hXSURHRVQgaFdpZGdldCwgCisJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCkKK3sKKwlBU1NFUlQocFhGQURvY1ZpZXcgIT0gTlVMTCk7CisJQVNTRVJUKGhXaWRnZXQgIT0gTlVMTCk7CisKKwlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkpCisJeworCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQorCQl7CisJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CisJCQl7CisJCQkJcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworCQkJCXBGb3JtRmllbGQtPkNsZWFyT3B0aW9ucyhUUlVFKTsKKworCQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQorCQkJCXsKKwkJCQkJZm9yIChpbnQgaT0wLHN6PXBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCk7IGk8c3o7IGkrKykKKwkJCQkJeworCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0OworCQkJCQkJcFdpZGdldEFjYy0+R2V0Q2hvaWNlTGlzdEl0ZW0oc3dUZXh0LCBpKTsKKworCQkJCQkJcEZvcm1GaWVsZC0+SW5zZXJ0T3B0aW9uKHN3VGV4dCwgaSwgVFJVRSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CisJCQl7CisJCQkJcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworCQkJCXBGb3JtRmllbGQtPkNsZWFyT3B0aW9ucyhGQUxTRSk7CisKKwkJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKKwkJCQl7CisJCQkJCWZvciAoaW50IGk9MCxzej1wV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpOyBpPHN6OyBpKyspCisJCQkJCXsKKwkJCQkJCUNGWF9XaWRlU3RyaW5nIHN3VGV4dDsKKwkJCQkJCXBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKHN3VGV4dCwgaSk7CisKKwkJCQkJCXBGb3JtRmllbGQtPkluc2VydE9wdGlvbihzd1RleHQsIGksIEZBTFNFKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXBGb3JtRmllbGQtPlNldFZhbHVlKEwiIiwgVFJVRSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogRlhfQk9PTAkJQ1BERlNES19XaWRnZXQ6OklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpCiB7CiAJQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwpAQCAtOTAsNiArNjE1LDIzIEBACiAJcmV0dXJuIHBGaWVsZC0+R2V0RmllbGRUeXBlKCk7CiB9CiAKK0ZYX0JPT0wJQ1BERlNES19XaWRnZXQ6OklzQXBwZWFyYW5jZVZhbGlkKCkKK3sKKwlBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7CisKKwlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisJQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKwlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKwlBU1NFUlQocERvYyAhPSBOVUxMKTsKKworCWludCBuRG9jVHlwZSA9IHBEb2MtPkdldERvY1R5cGUoKTsKKwlpZiAobkRvY1R5cGUgPT0gRE9DVFlQRV9QREYgfHwgbkRvY1R5cGUgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKQorCQlyZXR1cm4gQ1BERlNES19CQUFubm90OjpJc0FwcGVhcmFuY2VWYWxpZCgpOworCisJcmV0dXJuIFRSVUU7Cit9CisKIGludCBDUERGU0RLX1dpZGdldDo6R2V0RmllbGRGbGFncygpIGNvbnN0CiB7CiAJQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBtX3BJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwpAQCAtMTYwLDYgKzcwMiwxNiBAQAogCXJldHVybiBwQ3RybC0+R2V0Um90YXRpb24oKSAlIDM2MDsKIH0KIAorQ0ZYX1dpZGVTdHJpbmcJQ1BERlNES19XaWRnZXQ6OkdldE5hbWUoKQoreworCUFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisKKwlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisJcmV0dXJuIHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCk7Cit9CisKIEZYX0JPT0wJQ1BERlNES19XaWRnZXQ6OkdldEZpbGxDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0CiB7CiAJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKQEAgLTIxNCwxNiArNzY2LDQxIEBACiAJcmV0dXJuIGZGb250U2l6ZTsKIH0KIAotaW50CUNQREZTREtfV2lkZ2V0OjpHZXRTZWxlY3RlZEluZGV4KGludCBuSW5kZXgpIGNvbnN0CitpbnQJQ1BERlNES19XaWRnZXQ6OkdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCkKIHsKKwlpZiAoWEZBX0hXSURHRVQgaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQorCXsKKwkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCisJCXsKKwkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQorCQkJeworCQkJCWlmIChuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKSkKKwkJCQkJcmV0dXJuIHBXaWRnZXRBY2MtPkdldFNlbGVjdGVkSXRlbShuSW5kZXgpOworCQkJfQorCQl9CisJfQorCiAJQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKIAlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAkKIAlyZXR1cm4gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChuSW5kZXgpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWUoKSBjb25zdAorQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldFZhbHVlKEZYX0JPT0wgYkRpc3BsYXkpCiB7CisJaWYgKFhGQV9IV0lER0VUIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkKKwl7CisJCWlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKQorCQl7CisJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKKwkJCXsKKwkJCQlDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisJCQkJcFdpZGdldEFjYy0+R2V0VmFsdWUoc1ZhbHVlLCBiRGlzcGxheSA/IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSA6IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisJCQkJcmV0dXJuIHNWYWx1ZTsKKwkJCX0KKwkJfQorCX0KKwogCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAJCkBAIC0yNTQsOCArODMxLDIyIEBACiAJcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogfQogCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0CitGWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpCiB7CisJaWYgKFhGQV9IV0lER0VUIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkKKwl7CisJCWlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKQorCQl7CisJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKKwkJCXsKKwkJCQlpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKSkKKwkJCQkJcmV0dXJuIHBXaWRnZXRBY2MtPkdldEl0ZW1TdGF0ZShuSW5kZXgpOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisJfQorCiAJQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKIAlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAkKQEAgLTI3MCw4ICs4NjEsMjAgQEAKIAlyZXR1cm4gcEZvcm1GaWVsZC0+R2V0VG9wVmlzaWJsZUluZGV4KCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19XaWRnZXQ6OklzQ2hlY2tlZCgpIGNvbnN0CitGWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc0NoZWNrZWQoKQogeworCWlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKQorCXsKKwkJaWYgKFhGQV9IV0lER0VUIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkKKwkJeworCQkJaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpCisJCQl7CisJCQkJRlhfQk9PTCBiQ2hlY2tlZCA9IHBXaWRnZXRBY2MtPkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbjsKKwkJCQlyZXR1cm4gYkNoZWNrZWQ7CisJCQl9CisJCX0KKwl9CisKIAlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwogCUFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CiAJCkBAIC0zMDMsNiArOTA2LDEwIEBACiAJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAJCiAJcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUN0cmwpLCBiQ2hlY2tlZCwgYk5vdGlmeSk7CisJaWYgKCFJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpOb3JtYWwpKQorCQlSZXNldEFwcGVhcmFuY2UoVFJVRSk7CisJaWYgKCFiTm90aWZ5KQorCQlTeW5jaHJvbml6ZShUUlVFKTsKIH0KIAogdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQpAQCAtMzExLDYgKzkxOCw5IEBACiAJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAJCiAJcEZvcm1GaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBiTm90aWZ5KTsKKworCWlmICghYk5vdGlmeSkKKwkJU3luY2hyb25pemUoVFJVRSk7CiB9CiAKIHZvaWQgQ1BERlNES19XaWRnZXQ6OlNldERlZmF1bHRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlKQpAQCAtMzIyLDYgKzkzMiw5IEBACiAJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAJCiAJcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihpbmRleCwgYlNlbGVjdGVkLCBiTm90aWZ5KTsKKworCWlmICghYk5vdGlmeSkKKwkJU3luY2hyb25pemUoVFJVRSk7CiB9CiAKIHZvaWQgQ1BERlNES19XaWRnZXQ6OkNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSkKQEAgLTMzMCw2ICs5NDMsOSBAQAogCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCQogCXBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKGJOb3RpZnkpOworCisJaWYgKCFiTm90aWZ5KQorCQlTeW5jaHJvbml6ZShUUlVFKTsKIH0KIAogdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VG9wVmlzaWJsZUluZGV4KGludCBpbmRleCkKQEAgLTM1MSw2ICs5NjcsMjcgQEAKIAlyZXR1cm4gbV9iQXBwTW9kaWZpZWQ7CiB9CiAKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZShGWF9CT09MIGJWYWx1ZUNoYW5nZWQpCit7CisJc3dpdGNoIChHZXRGaWVsZFR5cGUoKSkKKwl7CisJY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorCWNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgorCQl7CisJCQlGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworCQkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gdGhpcy0+T25Gb3JtYXQoMCwgYkZvcm1hdGVkKTsKKwkJCWlmIChiRm9ybWF0ZWQpCisJCQkJdGhpcy0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZSwgVFJVRSk7CisJCQllbHNlCisJCQkJdGhpcy0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIFRSVUUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRoaXMtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisJCWJyZWFrOworCX0KK30KKwogdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKEZYX0xQQ1dTVFIgc1ZhbHVlLCBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpCiB7CiAJU2V0QXBwTW9kaWZpZWQoKTsKQEAgLTQzMyw3ICsxMDcwLDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJQ1BERlNES19Bbm5vdDo6RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBtb2RlLCBwT3B0aW9ucyk7CisJCUNQREZTREtfQkFBbm5vdDo6RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBtb2RlLCBwT3B0aW9ucyk7CiAJfQogfQogCkBAIC0xMjUxLDYgKzE4ODgsMTMgQEAKIAkJRlhfQk9PTCBiQ2hhckFycmF5ID0gKGR3RmllbGRGbGFncyA+PiAyNCkgJiAxOwogCQlGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZSgpOwkKIAorCQlDRlhfV2lkZVN0cmluZyBzVmFsdWVUbXA7CisJCWlmICghc1ZhbHVlICYmIChOVUxMICE9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSkKKwkJeworCQkJc1ZhbHVlVG1wID0gR2V0VmFsdWUoVFJVRSk7CisJCQlzVmFsdWUgPSBzVmFsdWVUbXA7CisJCX0KKwogCQlpZiAobk1heExlbiA+IDApCiAJCXsKIAkJCWlmIChiQ2hhckFycmF5KQpAQCAtMTU4OSwxNiArMjIzMyw1OSBAQAogCiBGWF9CT09MIENQREZTREtfV2lkZ2V0OjpPbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKIHsKKwlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwRG9jdW1lbnQtPkdldERvY3VtZW50KCk7CisJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKwlBU1NFUlQocEVudiAhPSBOVUxMKTsKKworCWlmIChYRkFfSFdJREdFVCBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpCisJeworCQlYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBHZXRYRkFFdmVudFR5cGUodHlwZSwgZGF0YS5iV2lsbENvbW1pdCk7CisgCisJCWlmIChlRXZlbnRUeXBlICE9IFhGQV9FVkVOVF9Vbmtub3duKQorCQl7CisJCQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkKKwkJCXsKKwkJCQlDWEZBX0V2ZW50UGFyYW0gcGFyYW07CisJCQkJcGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7CisJCQkJcGFyYW0ubV93c0NoYW5nZSA9IGRhdGEuc0NoYW5nZTsKKwkJCQlwYXJhbS5tX2lDb21taXRLZXkgPSBkYXRhLm5Db21taXRLZXk7CisJCQkJcGFyYW0ubV9iU2hpZnQgPSBkYXRhLmJTaGlmdDsKKwkJCQlwYXJhbS5tX2lTZWxTdGFydCA9IGRhdGEublNlbFN0YXJ0OworCQkJCXBhcmFtLm1faVNlbEVuZCA9IGRhdGEublNlbEVuZDsKKwkJCQlwYXJhbS5tX3dzRnVsbFRleHQgPSBkYXRhLnNWYWx1ZTsKKwkJCQlwYXJhbS5tX2JLZXlEb3duID0gZGF0YS5iS2V5RG93bjsKKwkJCQlwYXJhbS5tX2JNb2RpZmllciA9IGRhdGEuYk1vZGlmaWVyOworCQkJCXBhcmFtLm1fd3NOZXdUZXh0ID0gZGF0YS5zVmFsdWU7CisJCQkJaWYgKGRhdGEublNlbEVuZCA+IGRhdGEublNlbFN0YXJ0KQorCQkJCQlwYXJhbS5tX3dzTmV3VGV4dC5EZWxldGUoZGF0YS5uU2VsU3RhcnQsIGRhdGEublNlbEVuZCAtIGRhdGEublNlbFN0YXJ0KTsKKwkJCQlmb3IgKGludCBpPWRhdGEuc0NoYW5nZS5HZXRMZW5ndGgoKSAtIDE7IGk+PTA7IGktLSkKKwkJCQkJcGFyYW0ubV93c05ld1RleHQuSW5zZXJ0KGRhdGEublNlbFN0YXJ0LCBkYXRhLnNDaGFuZ2VbaV0pOworCQkJCXBhcmFtLm1fd3NQcmV2VGV4dCA9IGRhdGEuc1ZhbHVlOworCisJCQkJQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KTsKKwkJCQlwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOworCQkJCUZYX0lOVDMyIG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CisKKwkJCQlpZiAoSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKSkKKwkJCQl7CisJCQkJCXBEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7CisJCQkJfQorCisJCQkJaWYgKG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKQorCQkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKwkJfQorCX0KKwogCUNQREZfQWN0aW9uIGFjdGlvbiA9IEdldEFBY3Rpb24odHlwZSk7CiAKIAlpZiAoYWN0aW9uICYmIGFjdGlvbi5HZXRUeXBlKCkgIT0gQ1BERl9BY3Rpb246OlVua25vd24pCiAJewotIAkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOwotIAkJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLSAKLSAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotIAkJQVNTRVJUKHBFbnYgIT0gTlVMTCk7Ci0KIAkJQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOy8qKENQREZTREtfQWN0aW9uSGFuZGxlciopcEFwcC0+R2V0QWN0aW9uSGFuZGxlcigpOyovCiAgCQlBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7CiAgCkBAIC0xNjIyLDcgKzIzMDksNyBAQAogCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlQ2xvc2U6CiAJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgogCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlSW52aXNpYmxlOgotCQlyZXR1cm4gQ1BERlNES19Bbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKKwkJcmV0dXJuIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKIAljYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgogCWNhc2UgQ1BERl9BQWN0aW9uOjpGb3JtYXQ6CiAJY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgpAQCAtMTYzNCw3ICsyMzIxLDcgQEAKIAkJCWlmIChDUERGX0FBY3Rpb24gYWEgPSBwRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKSkKIAkJCQlyZXR1cm4gYWEuR2V0QWN0aW9uKGVBQVQpOwogCQkJZWxzZSAKLQkJCQlyZXR1cm4gQ1BERlNES19Bbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKKwkJCQlyZXR1cm4gQ1BERlNES19CQUFubm90OjpHZXRBQWN0aW9uKGVBQVQpOwogCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNjgxLDE0ICsyMzY4LDU5IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCisvL0NQREZTREtfWEZBV2lkZ2V0CitDUERGU0RLX1hGQVdpZGdldDo6Q1BERlNES19YRkFXaWRnZXQoWEZBX0hXSURHRVQgcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtKSA6CisJQ1BERlNES19Bbm5vdChwUGFnZVZpZXcpLAorCW1faFhGQVdpZGdldChwQW5ub3QpLAorCW1fcEludGVyRm9ybShwSW50ZXJGb3JtKQoreworCit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFXaWRnZXQ6OklzWEZBRmllbGQoKQoreworCXJldHVybiBUUlVFOworfQorCitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX1hGQVdpZGdldDo6R2V0VHlwZSgpIGNvbnN0Cit7CisJcmV0dXJuIEZTREtfWEZBV0lER0VUX1RZUEVOQU1FOworfQorCitDRlhfRmxvYXRSZWN0IENQREZTREtfWEZBV2lkZ2V0OjpHZXRSZWN0KCkKK3sKKwlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRQYWdlVmlldygpOworCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisKKwlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKworCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwRG9jdW1lbnQtPkdldERvY3VtZW50KCk7CisJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKwlJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpOworCUFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKKworCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworCUFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworCUNGWF9SZWN0RiByY0JCb3g7CisJcFdpZGdldEhhbmRsZXItPkdldFJlY3QoR2V0WEZBV2lkZ2V0KCksIHJjQkJveCk7CisKKwlyZXR1cm4gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsIHJjQkJveC50b3ArcmNCQm94LmhlaWdodCk7Cit9CisKKy8vQ1BERlNES19JbnRlckZvcm0KIENQREZTREtfSW50ZXJGb3JtOjpDUERGU0RLX0ludGVyRm9ybShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCiAJOm1fcERvY3VtZW50KHBEb2N1bWVudCksCiAJbV9wSW50ZXJGb3JtKE5VTEwpLAogCW1fYkNhbGN1bGF0ZShUUlVFKSwKKwltX2JYZmFDYWxjdWxhdGUoVFJVRSksCisJbV9iWGZhVmFsaWRhdGlvbnNFbmFibGVkKFRSVUUpLAogCW1fYkJ1c3koRkFMU0UpCiB7CiAJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCW1fcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKSwgRkFMU0UpOworCW1fcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCksIEZBTFNFKTsKIAlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwogCW1fcEludGVyRm9ybS0+U2V0Rm9ybU5vdGlmeSh0aGlzKTsKIApAQCAtMTcwNCw2ICsyNDM2LDcgQEAKIAltX3BJbnRlckZvcm0gPSBOVUxMOwogCiAJbV9NYXAuUmVtb3ZlQWxsKCk7CisJbV9YRkFNYXAuUmVtb3ZlQWxsKCk7CiB9CiAKIHZvaWQgQ1BERlNES19JbnRlckZvcm06OkRlc3Ryb3koKQpAQCAtMTczMCw3ICsyNDYzLDcgQEAKIHsKIAlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIAotCUNCQV9Bbm5vdEl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBuZXcgQ0JBX0Fubm90SXRlcmF0b3IocFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgIldpZGdldCIsICIiKTsKKwlDQkFfQW5ub3RJdGVyYXRvciogcEl0ZXJhdG9yID0gbmV3IENCQV9Bbm5vdEl0ZXJhdG9yKHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksICJXaWRnZXQiLCAiIik7Ly9YZkE/CiAJQVNTRVJUKHBJdGVyYXRvciAhPSBOVUxMKTsKIAogCUNQREZTREtfV2lkZ2V0KiBwUmV0ID0gTlVMTDsKQEAgLTE3NTksNyArMjQ5Miw3IEBACiAJQVNTRVJUKHBDb250cm9sRGljdCAhPSBOVUxMKTsKIAogCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKTsKKwlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7CiAKIAlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IE5VTEw7CiAKQEAgLTE4NTIsNiArMjU4NSwyNCBAQAogCW1fTWFwLlJlbW92ZUtleShwQ29udHJvbCk7CiB9CiAKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OkFkZFhGQU1hcChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDUERGU0RLX1hGQVdpZGdldCogcFdpZGdldCkKK3sKKwltX1hGQU1hcC5TZXRBdChoV2lkZ2V0LCBwV2lkZ2V0KTsKK30KKwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlWEZBTWFwKFhGQV9IV0lER0VUIGhXaWRnZXQpCit7CisJbV9YRkFNYXAuUmVtb3ZlS2V5KGhXaWRnZXQpOworfQorCitDUERGU0RLX1hGQVdpZGdldCogQ1BERlNES19JbnRlckZvcm06OkdldFhGQVdpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0KQoreworCUNQREZTREtfWEZBV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKKwltX1hGQU1hcC5Mb29rdXAoaFdpZGdldCwgcFdpZGdldCk7CisKKwlyZXR1cm4gcFdpZGdldDsKK30KKwogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpCiB7CiAJbV9iQ2FsY3VsYXRlID0gYkVuYWJsZWQ7CkBAIC0xODYyLDExICsyNjEzLDI5IEBACiAJcmV0dXJuIG1fYkNhbGN1bGF0ZTsKIH0KIAordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6WGZhRW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpCit7CisJbV9iWGZhQ2FsY3VsYXRlID0gYkVuYWJsZWQ7Cit9CitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdAoreworCXJldHVybiBtX2JYZmFDYWxjdWxhdGU7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzWGZhVmFsaWRhdGlvbnNFbmFibGVkKCkKK3sKKwlyZXR1cm4gbV9iWGZhVmFsaWRhdGlvbnNFbmFibGVkOworfQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6WGZhU2V0VmFsaWRhdGlvbnNFbmFibGVkKEZYX0JPT0wgYkVuYWJsZWQpCit7CisJbV9iWGZhVmFsaWRhdGlvbnNFbmFibGVkID0gYkVuYWJsZWQ7Cit9CisKICNpZmRlZiBfV0lOMzIKIENQREZfU3RyZWFtKiBDUERGU0RLX0ludGVyRm9ybTo6TG9hZEltYWdlRnJvbUZpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWxlKQogewogCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKTsKKwlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7CiAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAogCUNQREZfU3RyZWFtKiBwUmV0U3RyZWFtID0gTlVMTDsKQEAgLTIwODksNyArMjg1OCw3IEBACiAJCQlDUERGRG9jX0Vudmlyb25tZW50ICogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKIAkJCUNGRkxfSUZvcm1GaWxsZXIqIHBJRm9ybUZpbGxlciA9IHBFbnYtPkdldElGb3JtRmlsbGVyKCk7CiAJCQkKLQkJCUNQREZfUGFnZSAqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworCQkJQ1BERlhGQV9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZYRkFQYWdlKCk7CiAJCQlDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlLEZBTFNFKTsKIAogCQkJRlhfUkVDVCByY0JCb3ggPSBwSUZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcFdpZGdldCk7CkBAIC0yMzk5LDYgKzMxNjgsMjcgQEAKIAlyZXR1cm4gYlJldDsKIH0KIAordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6U3luY2hyb25pemVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKQoreworCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisJaW50IHggPSAwOworCWlmIChtX0ZpZWxkU3luY2hyb25pemVNYXAuTG9va3VwKHBGb3JtRmllbGQsIHgpKQorCQlyZXR1cm47CisKKwlmb3IgKGludCBpPTAsc3o9cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpPHN6OyBpKyspCisJeworCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworCQlBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOworCisJCUFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKQorCQl7CisJCQlwV2lkZ2V0LT5TeW5jaHJvbml6ZShiU3luY2hyb25pemVFbHNlKTsKKwkJfQorCX0KK30KKwogQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19JbnRlckZvcm06OkdldFRlbXBvcmFyeUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCkKIHsKIAlDRlhfV2lkZVN0cmluZyBzRmlsZU5hbWU7CkBAIC0yNjIxLDYgKzM0MTEsOSBAQAogCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7CiAKIAlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopcEZpZWxkOworCisJU3luY2hyb25pemVGaWVsZChwRm9ybUZpZWxkLCBGQUxTRSk7CisKIAlpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKIAogCWlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKQEAgLTI3MjQsMjMgKzM1MTcsMjMgQEAKIAogRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNOZWVkSGlnaExpZ2h0KGludCBuRmllbGRUeXBlKQogewotCWlmKG5GaWVsZFR5cGUgPDEgfHwgbkZpZWxkVHlwZSA+IDYpCisJaWYobkZpZWxkVHlwZSA8MSB8fCBuRmllbGRUeXBlID4gNykKIAkJcmV0dXJuIEZBTFNFOwogCXJldHVybiBtX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlLTFdOwogfQogCiB2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZW1vdmVBbGxIaWdoTGlnaHQoKQogewotCW1lbXNldCgodm9pZCopbV9iTmVlZEhpZ2h0bGlnaHQsIDAsIDYqc2l6ZW9mKEZYX0JPT0wpKTsKKwltZW1zZXQoKHZvaWQqKW1fYk5lZWRIaWdodGxpZ2h0LCAwLCA3KnNpemVvZihGWF9CT09MKSk7CiB9CiB2b2lkICAgQ1BERlNES19JbnRlckZvcm06OlNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwgaW50IG5GaWVsZFR5cGUpCiB7Ci0JaWYobkZpZWxkVHlwZSA8MCB8fCBuRmllbGRUeXBlID4gNikgcmV0dXJuOworCWlmKG5GaWVsZFR5cGUgPDAgfHwgbkZpZWxkVHlwZSA+IDcpIHJldHVybjsKIAlzd2l0Y2gobkZpZWxkVHlwZSkKIAl7CiAJY2FzZSAwOgogCQl7Ci0JCQlmb3IoaW50IGk9MDsgaTw2OyBpKyspCisJCQlmb3IoaW50IGk9MDsgaTw3OyBpKyspCiAJCQl7CiAJCQkJbV9hSGlnaGxpZ2h0Q29sb3JbaV0gPSBjbHI7CiAJCQkJbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBUUlVFOwpAQCAtMjc1OSw3ICszNTUyLDcgQEAKIAogRlhfQ09MT1JSRUYgQ1BERlNES19JbnRlckZvcm06OkdldEhpZ2hsaWdodENvbG9yKGludCBuRmllbGRUeXBlKQogewotCWlmKG5GaWVsZFR5cGUgPDAgfHwgbkZpZWxkVHlwZSA+NikgcmV0dXJuIEZYU1lTX1JHQigyNTUsMjU1LDI1NSk7CisJaWYobkZpZWxkVHlwZSA8MCB8fCBuRmllbGRUeXBlID43KSByZXR1cm4gRlhTWVNfUkdCKDI1NSwyNTUsMjU1KTsKIAlpZihuRmllbGRUeXBlID09IDApCiAJCXJldHVybiBtX2FIaWdobGlnaHRDb2xvclswXTsKIAllbHNlCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKaW5kZXggZWZiMjFhNy4uMjM0MGZmYSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcApAQCAtNSwxMCArNSwxNCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19tZ3IuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZfZXh0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiCiAKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwogI2luY2x1ZGUgInRpbWUuaCIKQEAgLTgxLDEwICs4NSwxMCBAQAogewogCS8vZ19wRm9ybUZpbGxBcHAtPkZGSV9JbnZhbGlkYXRlKCk7CiAJQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gKENQREZTREtfQW5ub3QqKWhXbmQ7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IE5VTEw7CisJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IE5VTEw7CiAJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsKIAlwUGFnZVZpZXcgPSBwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0JcFBhZ2UgPSBwU0RLQW5ub3QtPkdldFBERlBhZ2UoKTsKKwlwUGFnZSA9IHBTREtBbm5vdC0+R2V0UERGWEZBUGFnZSgpOwogCWlmKCFwUGFnZSB8fCAhcFBhZ2VWaWV3KQogCQlyZXR1cm47CiAJQ1BERl9NYXRyaXggcGFnZTJkZXZpY2U7CkBAIC0xMTQsNyArMTE4LDcgQEAKIAogCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgID0gcEZGTC0+R2V0U0RLQW5ub3QoKTsKIAkJQVNTRVJUKHBBbm5vdCk7Ci0JCUNQREZfUGFnZSogcFBhZ2UgPSBwQW5ub3QtPkdldFBERlBhZ2UoKTsKKwkJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGWEZBUGFnZSgpOwogCQlBU1NFUlQocFBhZ2UpOwogCQltX3BFbnYtPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QocFBhZ2UsIHB0QS54LCBwdEIueSwgcHRCLngsIHB0QS55KTsKIAl9CkBAIC0yMTIsMjkgKzIxNiwyMiBAQAogfQogCiAKLUNKU19SdW50aW1lRmFjdG9yeSogR2V0SlNSdW50aW1lRmFjdG9yeSgpCi17Ci0Jc3RhdGljIENKU19SdW50aW1lRmFjdG9yeSBzX0pTUnVudGltZUZhY3Rvcnk7Ci0JcmV0dXJuICZzX0pTUnVudGltZUZhY3Rvcnk7Ci19CiAKLUNQREZEb2NfRW52aXJvbm1lbnQ6OkNQREZEb2NfRW52aXJvbm1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgOgorQ1BERkRvY19FbnZpcm9ubWVudDo6Q1BERkRvY19FbnZpcm9ubWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jKSA6CiAJbV9wQW5ub3RIYW5kbGVyTWdyKE5VTEwpLAogCW1fcEFjdGlvbkhhbmRsZXIoTlVMTCksCiAJbV9wSlNSdW50aW1lKE5VTEwpLAogCW1fcEluZm8oTlVMTCksCiAJbV9wU0RLRG9jKE5VTEwpLAotCW1fcFBERkRvYyhwRG9jKSwKKwltX3BEb2MocERvYyksCiAJbV9wSUZvcm1GaWxsZXIoTlVMTCkKIHsKIAogCW1fcFN5c0hhbmRsZXIgPSBOVUxMOwogCW1fcFN5c0hhbmRsZXIgPSBuZXcgQ0ZYX1N5c3RlbUhhbmRsZXIodGhpcyk7CiAKKwkvL21fcEpTUnVudGltZUZhY3RvcnkgPSBwRG9jLT5HZXRBcHAoKS0+R2V0UnVudGltZUZhY3RvcnkoKTsKIAkKLQltX3BKU1J1bnRpbWVGYWN0b3J5ID0gTlVMTDsKLQltX3BKU1J1bnRpbWVGYWN0b3J5ID0gR2V0SlNSdW50aW1lRmFjdG9yeSgpOwotCW1fcEpTUnVudGltZUZhY3RvcnktPkFkZFJlZigpOwogfQogCiBDUERGRG9jX0Vudmlyb25tZW50Ojp+Q1BERkRvY19FbnZpcm9ubWVudCgpCkBAIC0yNDUsOSArMjQyLDE1IEBACiAJCWRlbGV0ZSBtX3BJRm9ybUZpbGxlcjsKIAkJbV9wSUZvcm1GaWxsZXIgPSBOVUxMOwogCX0KLQlpZihtX3BKU1J1bnRpbWUgJiYgbV9wSlNSdW50aW1lRmFjdG9yeSkKLQkJbV9wSlNSdW50aW1lRmFjdG9yeS0+RGVsZXRlSlNSdW50aW1lKG1fcEpTUnVudGltZSk7Ci0JbV9wSlNSdW50aW1lRmFjdG9yeS0+UmVsZWFzZSgpOworCisJaWYgKG1fcEpTUnVudGltZSAmJiBGUERGWEZBX0dldEFwcCgpLT5HZXRSdW50aW1lRmFjdG9yeSgpKQorCQlGUERGWEZBX0dldEFwcCgpLT5HZXRSdW50aW1lRmFjdG9yeSgpLT5EZWxldGVKU1J1bnRpbWUobV9wSlNSdW50aW1lKTsKKworCWlmIChGUERGWEZBX0dldEFwcCgpLT5tX3BFbnZMaXN0LkdldFNpemUoKSA9PSAwKQorCXsKKwkJRlBERlhGQV9HZXRBcHAoKS0+UmVsZWFzZVJ1bnRpbWUoKTsKKwkJRlBERlhGQV9HZXRBcHAoKS0+SW5pdFJ1bnRpbWUoVFJVRSk7CisJfQogCiAJaWYobV9wU3lzSGFuZGxlcikKIAl7CkBAIC0yNzQsOSArMjc3LDggQEAKIHsKIAlpZighSXNKU0luaXRpYXRlZCgpKQogCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQobV9wSlNSdW50aW1lRmFjdG9yeSk7CiAJaWYoIW1fcEpTUnVudGltZSkKLQkJbV9wSlNSdW50aW1lID0gbV9wSlNSdW50aW1lRmFjdG9yeS0+TmV3SlNSdW50aW1lKHRoaXMpOworCQltX3BKU1J1bnRpbWUgPSBGUERGWEZBX0dldEFwcCgpLT5HZXRSdW50aW1lRmFjdG9yeSgpLT5OZXdKU1J1bnRpbWUodGhpcyk7CiAJcmV0dXJuIG1fcEpTUnVudGltZTsKIH0KIApAQCAtMzI0LDcgKzMyNiw3IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCi1DUERGU0RLX0RvY3VtZW50OjpDUERGU0RLX0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsQ1BERkRvY19FbnZpcm9ubWVudCogcEVudik6bV9wRG9jKHBEb2MpLAorQ1BERlNES19Eb2N1bWVudDo6Q1BERlNES19Eb2N1bWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jLENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOm1fcERvYyhwRG9jKSwKIAkJCQkJCW1fcEludGVyRm9ybShOVUxMKSxtX3BFbnYocEVudiksbV9wT2Njb250ZW50KE5VTEwpLG1fYkNoYW5nZU1hc2soRkFMU0UpCiB7CiAJbV9wRm9jdXNBbm5vdCA9IE5VTEw7CkBAIC0zMzIsMTQgKzMzNCw3IEBACiAKIENQREZTREtfRG9jdW1lbnQ6On5DUERGU0RLX0RvY3VtZW50KCkKIHsKLQlGWF9QT1NJVElPTiBwb3MgPSBtX3BhZ2VNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotCXdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIENQREZfUGFnZSogcFBhZ2UgPSBOVUxMOwotICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsKLSAgICAgICAgICAgIG1fcGFnZU1hcC5HZXROZXh0QXNzb2MocG9zLCBwUGFnZSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgICAgIGRlbGV0ZSBwUGFnZVZpZXc7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wYWdlTWFwLlJlbW92ZUFsbCgpOworCW1fcGFnZU1hcC5SZW1vdmVBbGwoKTsKIAlpZihtX3BJbnRlckZvcm0pCiAJewogCQltX3BJbnRlckZvcm0tPkRlc3Ryb3koKTsKQEAgLTM2MywyMCArMzU4LDIwIEBACiAJfQogfQogCi12b2lkIENQREZTREtfRG9jdW1lbnQ6OkFkZFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKK3ZvaWQgQ1BERlNES19Eb2N1bWVudDo6QWRkUGFnZVZpZXcoQ1BERlhGQV9QYWdlKiBwUERGWEZBUGFnZSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotCW1fcGFnZU1hcC5TZXRBdChwUERGUGFnZSwgcFBhZ2VWaWV3KTsKKwltX3BhZ2VNYXAuU2V0QXQocFBERlhGQVBhZ2UsIHBQYWdlVmlldyk7CiB9CiAKLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIEZYX0JPT0wgUmVOZXcpCitDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlVmlldyhDUERGWEZBX1BhZ2UqIHBQREZYRkFQYWdlLCBGWF9CT09MIFJlTmV3KQogewotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IChDUERGU0RLX1BhZ2VWaWV3KiltX3BhZ2VNYXAuR2V0VmFsdWVBdChwUERGUGFnZSk7CisJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gKENQREZTREtfUGFnZVZpZXcqKW1fcGFnZU1hcC5HZXRWYWx1ZUF0KHBQREZYRkFQYWdlKTsKIAlpZihwUGFnZVZpZXcgIT0gTlVMTCkKIAkJcmV0dXJuIHBQYWdlVmlldzsKIAlpZihSZU5ldykKIAl7Ci0JCXBQYWdlVmlldyA9IG5ldyBDUERGU0RLX1BhZ2VWaWV3KHRoaXMscFBERlBhZ2UpOwotCQltX3BhZ2VNYXAuU2V0QXQocFBERlBhZ2UsIHBQYWdlVmlldyk7CisJCXBQYWdlVmlldyA9IG5ldyBDUERGU0RLX1BhZ2VWaWV3KHRoaXMscFBERlhGQVBhZ2UpOworCQltX3BhZ2VNYXAuU2V0QXQocFBERlhGQVBhZ2UsIHBQYWdlVmlldyk7CiAJCS8vRGVsYXkgdG8gbG9hZCBhbGwgdGhlIGFubm90YXRpb25zLCB0byBhdm9pZCBlbmRsZXNzIGxvb3AuCiAJCXBQYWdlVmlldy0+TG9hZEZYQW5ub3RzKCk7CiAJfQpAQCAtMzg2LDcgKzM4MSw3IEBACiAKIENQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldEN1cnJlbnRWaWV3KCkKIHsKLQlDUERGX1BhZ2UgKiBwUGFnZSA9IChDUERGX1BhZ2UgKiltX3BFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2MpOworCUNQREZYRkFfUGFnZSAqIHBQYWdlID0gKENQREZYRkFfUGFnZSAqKW1fcEVudi0+RkZJX0dldEN1cnJlbnRQYWdlKG1fcERvYyk7CiAJaWYocFBhZ2UpCiAJCXJldHVybiB0aGlzLT5HZXRQYWdlVmlldyhwUGFnZSwgVFJVRSk7CiAJcmV0dXJuIE5VTEw7CkBAIC0zOTUsNyArMzkwLDcgQEAKIENQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KGludCBuSW5kZXgpCiB7CiAJQ1BERlNES19QYWdlVmlldyAqIHBUZW1wUGFnZVZpZXcgPSBOVUxMOwotCUNQREZfUGFnZSAqIHBUZW1wUGFnZSA9IChDUERGX1BhZ2UqKW1fcEVudi0+RkZJX0dldFBhZ2UobV9wRG9jLG5JbmRleCk7CisJQ1BERlhGQV9QYWdlICogcFRlbXBQYWdlID0gKENQREZYRkFfUGFnZSopbV9wRW52LT5GRklfR2V0UGFnZShtX3BEb2MsbkluZGV4KTsKIAlpZighcFRlbXBQYWdlKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNDA4LDggKzQwMyw4IEBACiAKIHZvaWQgQ1BERlNES19Eb2N1bWVudDo6IFByb2NKYXZhc2NyaXB0RnVuKCkKIHsKLQlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gdGhpcy0+R2V0RG9jdW1lbnQoKTsKLQlDUERGX0RvY0pTQWN0aW9ucyBkb2NKUyhwUERGRG9jKTsKKwlDUERGWEZBX0RvY3VtZW50KiBwUERGRG9jID0gdGhpcy0+R2V0RG9jdW1lbnQoKTsKKwlDUERGX0RvY0pTQWN0aW9ucyBkb2NKUyhwUERGRG9jLT5HZXRQREZEb2MoKSk7CiAJaW50IGlDb3VudCA9IGRvY0pTLkNvdW50SlNBY3Rpb25zKCk7CiAJaWYgKGlDb3VudCA8IDEpIHJldHVybjsKIAlmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykKQEAgLTQyNiw3ICs0MjEsNyBAQAogewogCWlmKCFtX3BEb2MpIHJldHVybiBGQUxTRTsKIAkKLQlDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jLT5HZXRSb290KCk7CQorCUNQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2MtPkdldFBERkRvYygpLT5HZXRSb290KCk7CQogCWlmICghcFJvb3QpCXJldHVybiBGQUxTRTsKIAlDUERGX09iamVjdCogcE9wZW5BY3Rpb24gPSBwUm9vdC0+R2V0RGljdCgiT3BlbkFjdGlvbiIpOy8vCiAJaWYoIXBPcGVuQWN0aW9uKSBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXRBcnJheSgiT3BlbkFjdGlvbiIpOy8vCkBAIC00NTMsMjMgKzQ0OCwyMyBAQAogQ1BERl9PQ0NvbnRleHQqCUNQREZTREtfRG9jdW1lbnQ6OkdldE9DQ29udGV4dCgpCiB7CiAJaWYoIW1fcE9jY29udGVudCkKLQkJbV9wT2Njb250ZW50ID0gbmV3IENQREZfT0NDb250ZXh0KG1fcERvYyk7CisJCW1fcE9jY29udGVudCA9IG5ldyBDUERGX09DQ29udGV4dChtX3BEb2MtPkdldFBERkRvYygpKTsKIAlyZXR1cm4gbV9wT2Njb250ZW50OwogfQogCi12b2lkIENQREZTREtfRG9jdW1lbnQ6OlJlTW92ZVBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UpCit2b2lkIENQREZTREtfRG9jdW1lbnQ6OlJlTW92ZVBhZ2VWaWV3KENQREZYRkFfUGFnZSogcFBERlhGQVBhZ2UpCiB7Ci0JQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gKENQREZTREtfUGFnZVZpZXcqKW1fcGFnZU1hcC5HZXRWYWx1ZUF0KHBQREZQYWdlKTsKLQlpZihwUGFnZVZpZXcgJiYgIXBQYWdlVmlldy0+SXNMb2NrZWQoKSkKKwlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSAoQ1BERlNES19QYWdlVmlldyopbV9wYWdlTWFwLkdldFZhbHVlQXQocFBERlhGQVBhZ2UpOworCWlmKHBQYWdlVmlldykKIAl7CiAJCWRlbGV0ZSBwUGFnZVZpZXc7Ci0JCW1fcGFnZU1hcC5SZW1vdmVLZXkocFBERlBhZ2UpOworCQltX3BhZ2VNYXAuUmVtb3ZlS2V5KHBQREZYRkFQYWdlKTsKIAl9CiB9CiAKLUNQREZfUGFnZSAqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IG5JbmRleCkKK0NQREZYRkFfUGFnZSAqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IG5JbmRleCkKIHsKLQlDUERGX1BhZ2UgKiBwVGVtcFBhZ2UgPSAoQ1BERl9QYWdlKiltX3BFbnYtPkZGSV9HZXRQYWdlKG1fcERvYyxuSW5kZXgpOworCUNQREZYRkFfUGFnZSAqIHBUZW1wUGFnZSA9IChDUERGWEZBX1BhZ2UqKW1fcEVudi0+RkZJX0dldFBhZ2UobV9wRG9jLG5JbmRleCk7CiAJaWYoIXBUZW1wUGFnZSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIHBUZW1wUGFnZTsKQEAgLTQ4Niw3ICs0ODEsNyBAQAogewogCQogCUZYX1BPU0lUSU9OIHBvcyA9IG1fcGFnZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0JQ1BERl9QYWdlICogcFBhZ2UgPSBOVUxMOworCUNQREZYRkFfUGFnZSAqIHBQYWdlID0gTlVMTDsKIAlDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gTlVMTDsKIAl3aGlsZShwb3MpCiAJewpAQCAtNTA5LDE3ICs1MDQsMjQgQEAKIAogCWlmKG1fcEZvY3VzQW5ub3Q9PXBBbm5vdCkgcmV0dXJuIFRSVUU7CiAJCisJQ1BERlNES19Bbm5vdCogcExhc3RGb2N1c0Fubm90ID0gbV9wRm9jdXNBbm5vdDsKKwkKIAlpZihtX3BGb2N1c0Fubm90KQogCXsKIAkJaWYoIXRoaXMtPktpbGxGb2N1c0Fubm90KG5GbGFnKSApIHJldHVybiBGQUxTRTsJCiAJfQotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKwlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBOVUxMOworCWlmIChwQW5ub3QpCisJCXBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKIAlpZihwQW5ub3QgJiYgcFBhZ2VWaWV3LT5Jc1ZhbGlkKCkpCiAJewogCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciAqcEFubm90SGFuZGxlcj1tX3BFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwogCiAJCWlmKHBBbm5vdEhhbmRsZXImJiFtX3BGb2N1c0Fubm90KQogCQl7CisJCQlpZiAoIXBBbm5vdEhhbmRsZXItPkFubm90X09uQ2hhbmdlRm9jdXMocEFubm90LHBMYXN0Rm9jdXNBbm5vdCkpCisJCQkJcmV0dXJuIEZBTFNFOworCiAJCQlpZiAoIXBBbm5vdEhhbmRsZXItPkFubm90X09uU2V0Rm9jdXMocEFubm90LG5GbGFnKSkKIAkJCQlyZXR1cm4gRkFMU0U7CiAJCQlpZighbV9wRm9jdXNBbm5vdCkKQEAgLTU0MSw2ICs1NDMsMTAgQEAKIAkJewogCQkJQ1BERlNES19Bbm5vdCogcEZvY3VzQW5ub3QgPSBtX3BGb2N1c0Fubm90OwogCQkJbV9wRm9jdXNBbm5vdCA9IE5VTEw7CisKKwkJCWlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25DaGFuZ2VGb2N1cyhOVUxMLCBwRm9jdXNBbm5vdCkpCisJCQkJcmV0dXJuIEZBTFNFOworCiAJCQlpZihwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbktpbGxGb2N1cyhwRm9jdXNBbm5vdCwgbkZsYWcpKQogCQkJewogCQkJCQpAQCAtNTcxLDcgKzU3Nyw3IEBACiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlDUERGX1BhZ2UgKiBwVGVtcFBhZ2UgPSBOVUxMOworCUNQREZYRkFfUGFnZSAqIHBUZW1wUGFnZSA9IE5VTEw7CiAJZm9yICggaW50IGkgPSBuQ291bnQtMTsgaSA+PSAwOyBpLS0gKQogCXsKIAkJcFRlbXBQYWdlID0gR2V0UGFnZShuU3RhcnQraSk7CkBAIC01OTAsNyArNTk2LDcgQEAKIAogRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpCiB7Ci0JRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IG1fcERvYy0+R2V0VXNlclBlcm1pc3Npb25zKCk7CisJRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IG1fcERvYy0+R2V0UERGRG9jKCktPkdldFVzZXJQZXJtaXNzaW9ucygpOwogCXJldHVybiBkd1Blcm1pc3Npb25zJm5GbGFnOwogfQogCkBAIC02MDcsMTUgKzYxMywxNiBAQAogfQogCiAKLUNQREZTREtfUGFnZVZpZXc6OkNQREZTREtfUGFnZVZpZXcoQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyxDUERGX1BhZ2UqIHBhZ2UpOm1fcGFnZShwYWdlKSxtX3BTREtEb2MocFNES0RvYykKK0NQREZTREtfUGFnZVZpZXc6OkNQREZTREtfUGFnZVZpZXcoQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyxDUERGWEZBX1BhZ2UqIHBhZ2UpOm1fcGFnZShwYWdlKSxtX3BTREtEb2MocFNES0RvYykKIHsKIAlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBTREtEb2MtPkdldEludGVyRm9ybSgpOwogCWlmKHBJbnRlckZvcm0pCiAJewogCQlDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotCQlwUERGSW50ZXJGb3JtLT5GaXhQYWdlRmllbGRzKHBhZ2UpOworCQlpZiAocGFnZS0+R2V0UERGUGFnZSgpKQorCQkJcFBERkludGVyRm9ybS0+Rml4UGFnZUZpZWxkcyhwYWdlLT5HZXRQREZQYWdlKCkpOwogCX0KLSAgICAgICAgbV9wYWdlLT5TZXRQcml2YXRlRGF0YSgoRlhfTFBWT0lEKW1fcGFnZSwgKEZYX0xQVk9JRCl0aGlzLCBOVUxMKTsKKwogCW1fZnhBbm5vdEFycmF5LlJlbW92ZUFsbCgpOwogCiAJbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKQEAgLTYyMywxNSArNjMwLDEzIEBACiAJbV9iT25XaWRnZXQgPSBGQUxTRTsKIAltX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwogCW1fYlZhbGlkID0gRkFMU0U7Ci0gICAgICAgIG1fYkxvY2tlZCA9IEZBTFNFOwotICAgICAgICBtX2JUYWtlT3ZlclBhZ2UgPSBGQUxTRTsKKwltX3BBbm5vdExpc3QgPSBOVUxMOwogfQogCiBDUERGU0RLX1BhZ2VWaWV3Ojp+Q1BERlNES19QYWdlVmlldygpCiB7CiAJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CQogCWludCBuQW5ub3RDb3VudCA9IG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsKLQogCWZvciAoaW50IGk9MDsgaTxuQW5ub3RDb3VudDsgaSsrKQogCXsKIAkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KGkpOwpAQCAtNjQ4LDMwICs2NTMsNDkgQEAKIAkJZGVsZXRlIG1fcEFubm90TGlzdDsKIAkJbV9wQW5ub3RMaXN0ID0gTlVMTDsKIAl9Ci0gICAgICAgIG1fcGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKEZYX0xQVk9JRCltX3BhZ2UpOwotICAgICAgICBpZihtX2JUYWtlT3ZlclBhZ2UpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BhZ2U7Ci0gICAgICAgIH0KIH0KIAotdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQordm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBwQ2xpcCkKIHsKIAltX2N1ck1hdHJpeCA9ICpwVXNlcjJEZXZpY2U7Ci0JCiAJLy8JbV9wQW5ub3RMaXN0LT5EaXNwbGF5QW5ub3RzKG1fcGFnZSwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBGQUxTRSwgcE9wdGlvbnMpOwogCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQREZYRkFQYWdlKCk7CisKKwlpZiAocFBhZ2UgPT0gTlVMTCkgcmV0dXJuOworCisJaWYgKHBQYWdlLT5HZXREb2N1bWVudCgpLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkgeworCQlDRlhfR3JhcGhpY3MgZ3M7CisJCWdzLkNyZWF0ZShwRGV2aWNlKTsKKwkJaWYgKHBDbGlwKSB7CisJCQlDRlhfUmVjdEYgcmVjdENsaXA7CisJCQlyZWN0Q2xpcC5TZXQocENsaXAtPmxlZnQsIHBDbGlwLT50b3AsIHBDbGlwLT5XaWR0aCgpLCBwQ2xpcC0+SGVpZ2h0KCkpOworCQkJZ3MuU2V0Q2xpcFJlY3QocmVjdENsaXApOworCQl9CQorCQlJWEZBX1JlbmRlckNvbnRleHQqIHBSZW5kZXJDb250ZXh0ID0gWEZBX1JlbmRlckNvbnRleHRfQ3JlYXRlKCk7CisJCWlmICghcFJlbmRlckNvbnRleHQpIAorCQkJcmV0dXJuOworCQlDWEZBX1JlbmRlck9wdGlvbnMgcmVuZGVyT3B0aW9uczsKKwkJcmVuZGVyT3B0aW9ucy5tX2JIaWdobGlnaHQgPSBUUlVFOworCQlwUmVuZGVyQ29udGV4dC0+U3RhcnRSZW5kZXIocFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCksICZncywgKnBVc2VyMkRldmljZSwgcmVuZGVyT3B0aW9ucyk7CisJCXBSZW5kZXJDb250ZXh0LT5Eb1JlbmRlcigpOworCQlwUmVuZGVyQ29udGV4dC0+U3RvcFJlbmRlcigpOworCQlwUmVuZGVyQ29udGV4dC0+UmVsZWFzZSgpOworCQlyZXR1cm47CisJfQorCS8vIGZvciBwZGYvc3RhdGljIHhmYS4KIAlDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBUUlVFKTsKIAlDUERGU0RLX0Fubm90ICogcFNES0Fubm90PU5VTEw7CiAJaW50IGluZGV4PS0xOwotCXdoaWxlKChwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpKSkKKwlwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOworCXdoaWxlKHBTREtBbm5vdCkKIAl7CiAJCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CiAJCUFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKIAkJcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25EcmF3KHRoaXMsIHBTREtBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCAwKTsKKwkJcFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KTsKIAl9Ci0KIH0KLQogQ1BERl9Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0UERGQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKIHsKIAkKQEAgLTcxMywxMSArNzM3LDEzIEBACiAJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdE1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwogCUNQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IE5VTEw7CiAJaW50IGluZGV4ID0gLTE7Ci0Jd2hpbGUoKHBTREtBbm5vdCA9IGFubm90SXRlcmF0b3IuTmV4dChpbmRleCkpKQorCXBTREtBbm5vdCA9IGFubm90SXRlcmF0b3IuTmV4dChpbmRleCk7CisJd2hpbGUocFNES0Fubm90KQogCXsKIAkJQ1BERl9SZWN0IHJjID0gcEFubm90TWdyLT5Bbm5vdF9PbkdldFZpZXdCQm94KHRoaXMsIHBTREtBbm5vdCk7CiAJCWlmKHJjLkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCiAJCQlyZXR1cm4gcFNES0Fubm90OworCQlwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtNzMxLDkgKzc1NywxMCBAQAogCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKIAlDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOwogCWludCBpbmRleCA9IC0xOwotCXdoaWxlKChwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpKSkKKwlwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOworCXdoaWxlKHBTREtBbm5vdCkKIAl7Ci0JCWlmKHBTREtBbm5vdC0+R2V0VHlwZSgpID09ICJXaWRnZXQiKQorCQlpZihwU0RLQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0IiB8fCBwU0RLQW5ub3QtPkdldFR5cGUoKSA9PSBGU0RLX1hGQVdJREdFVF9UWVBFTkFNRSkKIAkJewkKIAkJCXBBbm5vdE1nci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLCBwU0RLQW5ub3QpOwogCQkJQ1BERl9Qb2ludCBwb2ludChwYWdlWCwgcGFnZVkpOwpAQCAtNzQxLDYgKzc2OCw3IEBACiAvLwkJCWlmKHJjLkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCiAJCQkJcmV0dXJuIHBTREtBbm5vdDsKIAkJfQorCQlwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOwogCX0KIAkKIAlyZXR1cm4gTlVMTDsKQEAgLTc4MSw2ICs4MDksMzIgQEAKIAkgcmV0dXJuIHBTREtBbm5vdDsKIH0KIAorQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6QWRkQW5ub3QoWEZBX0hXSURHRVQgcFBERkFubm90KQoreworCWlmICghcFBERkFubm90KSByZXR1cm4gTlVMTDsKKworCUNQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IEdldEFubm90QnlYRkFXaWRnZXQocFBERkFubm90KTsKKwlpZiAocFNES0Fubm90KQorCQlyZXR1cm4gcFNES0Fubm90OworCisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisJQVNTRVJUKHBFbnYpOworCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyICogcEFubm90SGFuZGxlcj0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CQorCisJcFNES0Fubm90ID1OVUxMOworCisJaWYocEFubm90SGFuZGxlcikKKwl7CisJCXBTREtBbm5vdCA9IHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7CisJfQorCWlmKCFwU0RLQW5ub3QpCSAKKwkJcmV0dXJuIE5VTEw7CisKKwltX2Z4QW5ub3RBcnJheS5BZGQocFNES0Fubm90KTsJCisKKwlyZXR1cm4gcFNES0Fubm90OworfQorCiBDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCkKIHsKIAlpZihwRGljdCkgIApAQCAtNzk1LDIxICs4NDksNDIgQEAKIAogRlhfQk9PTCAgQ1BERlNES19QYWdlVmlldzo6RGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQogewotCXJldHVybiBGQUxTRTsKKwlpZiAoIXBBbm5vdCkKKwkJcmV0dXJuIEZBTFNFOworCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBwQW5ub3QtPkdldFBERlhGQVBhZ2UoKTsKKwlpZiAoIXBQYWdlIHx8IChwUGFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSAmJiBwUGFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpbnQgaW5kZXggPSBtX2Z4QW5ub3RBcnJheS5GaW5kKHBBbm5vdCk7CisJbV9meEFubm90QXJyYXkuUmVtb3ZlQXQoaW5kZXgpOworCWlmIChtX0NhcHR1cmVXaWRnZXQgPT0gcEFubm90KQorCQltX0NhcHR1cmVXaWRnZXQgPSBOVUxMOworCisJcmV0dXJuIFRSVUU7CQogfQogCiBDUERGX0RvY3VtZW50KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZEb2N1bWVudCgpCiB7CiAJaWYobV9wYWdlKQogCXsKLQkJcmV0dXJuIG1fcGFnZS0+bV9wRG9jdW1lbnQ7CisJCXJldHVybiBtX3BhZ2UtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAorQ1BERl9QYWdlKiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZQYWdlKCkKK3sKKwlpZiAobV9wYWdlKQorCXsKKwkJcmV0dXJuIG1fcGFnZS0+R2V0UERGUGFnZSgpOworCX0KKworCXJldHVybiBOVUxMOworfQorCiBpbnQJQ1BERlNES19QYWdlVmlldzo6Q291bnRBbm5vdHMoKQogewotCXJldHVybiBtX3BBbm5vdExpc3QtPkNvdW50KCk7CisJcmV0dXJuIG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsKIH0KIAogQ1BERlNES19Bbm5vdCoJQ1BERlNES19QYWdlVmlldzo6R2V0QW5ub3QoaW50IG5JbmRleCkKQEAgLTgzNCw2ICs5MDksMjAgQEAKICAJfQogCXJldHVybiBOVUxMOwogfQorQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0QW5ub3RCeVhGQVdpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0KQoreworCWlmIChoV2lkZ2V0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWludCBhbm5vdENvdW50ID0gbV9meEFubm90QXJyYXkuR2V0U2l6ZSgpOworCisJZm9yKGludCBpID0gMDsgaSA8IGFubm90Q291bnQ7IGkrKykKKwl7CisJCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX2Z4QW5ub3RBcnJheS5HZXRBdChpKTsKKwkJaWYocEFubm90LT5HZXRYRkFXaWRnZXQoKSA9PSBoV2lkZ2V0KQorCQkJcmV0dXJuIHBBbm5vdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CiAKIEZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCiB7CkBAIC04NTksNiArOTQ4LDQ1IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKQoreworCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworCUFTU0VSVChwRW52KTsKKwlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworCUFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKKworCUNQREZTREtfQW5ub3QqIHBGWEFubm90ID0gR2V0RlhXaWRnZXRBdFBvaW50KHBvaW50LngsIHBvaW50LnkpOworCisJaWYgKHBGWEFubm90ID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCUZYX0JPT0wgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uUkJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLHBvaW50KTsKKwlpZiAoYlJldCkKKwl7CisJCVNldEZvY3VzQW5ub3QocEZYQW5ub3QpOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCit7CisJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisJQVNTRVJUKHBFbnYpOworCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisJQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOworCisJQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisKKwlpZiAocEZYQW5ub3QgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJRlhfQk9PTCBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25SQnV0dG9uVXAodGhpcywgcEZYQW5ub3QsIG5GbGFnLHBvaW50KTsKKwlpZiAoYlJldCkKKwl7CisJCVNldEZvY3VzQW5ub3QocEZYQW5ub3QpOworCX0KKwlyZXR1cm4gVFJVRTsKK30KIAogRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCiB7CkBAIC05NzgsMjcgKzExMDYsNjEgQEAKIAogdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpMb2FkRlhBbm5vdHMoKQogeworCUFTU0VSVChtX3BhZ2UgIT0gTlVMTCk7CisKIAlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKwlBU1NFUlQocEVudiAhPSBOVUxMKTsKIAotCUZYX0JPT0wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKLQkvL0Rpc2FibGUgdGhlIGRlZmF1bHQgQVAgY29uc3RydWN0aW9uLgotCUNQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChGQUxTRSk7Ci0JbV9wQW5ub3RMaXN0ID0gbmV3IENQREZfQW5ub3RMaXN0KG1fcGFnZSk7Ci0JQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGVuYWJsZUFQVXBkYXRlKTsKLQlpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwotICAgICAgICBTZXRMb2NrKFRSVUUpOwotCWZvcihpbnQgaT0wOyBpPG5Db3VudDsgaSsrKQorCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisJQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IgIT0gTlVMTCk7CisKKwlpZiAobV9wU0RLRG9jLT5HZXREb2N1bWVudCgpLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkKIAl7Ci0JCUNQREZfQW5ub3QqIHBQREZBbm5vdCA9IG1fcEFubm90TGlzdC0+R2V0QXQoaSk7Ci0JCUNQREZfRG9jdW1lbnQgKiBwRG9jID0gdGhpcy0+R2V0UERGRG9jdW1lbnQoKTsKKwkJSVhGQV9QYWdlVmlldyogcGFnZVZpZXcgPSBOVUxMOworCQlwYWdlVmlldyA9IG1fcGFnZS0+R2V0WEZBUGFnZVZpZXcoKTsKKwkJQVNTRVJUKHBhZ2VWaWV3ICE9IE5VTEwpOworCisJCVhGQV9IV0lER0VUIHBYRkFBbm5vdCA9IE5VTEw7CisJCUlYRkFfV2lkZ2V0SXRlcmF0b3IqIHBXaWRnZXRIYW5kZXIgPSBwYWdlVmlldy0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoWEZBX1RSQVZFUlNFV0FZX0Zvcm0sIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZXxYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlfFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSk7CisJCWlmICghcFdpZGdldEhhbmRlcikKKwkJCXJldHVybjsKKworCQlwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCk7CisJCXdoaWxlIChwWEZBQW5ub3QpIHsKKwkJCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBYRkFBbm5vdCwgdGhpcyk7CisJCQlpZighcEFubm90KSB7CisJCQkJcFhGQUFubm90ID0gcFdpZGdldEhhbmRlci0+TW92ZVRvTmV4dCgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbV9meEFubm90QXJyYXkuQWRkKHBBbm5vdCk7CiAJCQotCQlDaGVja1VuU3VwcG9ydEFubm90KHBEb2MsIHBQREZBbm5vdCk7CisJCQlwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxvYWQocEFubm90KTsKIAotCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotCQlBU1NFUlQocEFubm90SGFuZGxlck1nciAhPSBOVUxMKTsKKwkJCXBYRkFBbm5vdCA9IHBXaWRnZXRIYW5kZXItPk1vdmVUb05leHQoKTsKIAotCQlpZihwQW5ub3RIYW5kbGVyTWdyKQorCQl9CisKKwkJcFdpZGdldEhhbmRlci0+UmVsZWFzZSgpOworCX0gCisJZWxzZSAKKwl7CisJCUNQREZfUGFnZSogcFBhZ2UgPSBtX3BhZ2UtPkdldFBERlBhZ2UoKTsKKwkJQVNTRVJUKHBQYWdlICE9IE5VTEwpOworCisJCUZYX0JPT0wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKKwkJLy9EaXNhYmxlIHRoZSBkZWZhdWx0IEFQIGNvbnN0cnVjdGlvbi4KKwkJQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZBTFNFKTsKKwkJbV9wQW5ub3RMaXN0ID0gbmV3IENQREZfQW5ub3RMaXN0KHBQYWdlKTsKKwkJQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGVuYWJsZUFQVXBkYXRlKTsKKworCQlpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOworCQlmb3IoaW50IGk9MDsgaTxuQ291bnQ7IGkrKykKIAkJeworCQkJQ1BERl9Bbm5vdCogcFBERkFubm90ID0gbV9wQW5ub3RMaXN0LT5HZXRBdChpKTsKKwkJCUNQREZfRG9jdW1lbnQgKiBwRG9jID0gdGhpcy0+R2V0UERGRG9jdW1lbnQoKTsKKworCQkJQ2hlY2tVblN1cHBvcnRBbm5vdChwRG9jLCBwUERGQW5ub3QpOworCiAJCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwQW5ub3RIYW5kbGVyTWdyLT5OZXdBbm5vdChwUERGQW5ub3QsIHRoaXMpOwogCQkJaWYoIXBBbm5vdCkKIAkJCQljb250aW51ZTsKQEAgLTEwMDgsNyArMTE3MCw2IEBACiAJCX0KIAogCX0KLSAgICAgICAgU2V0TG9jayhGQUxTRSk7CiB9CiAKIHZvaWQJQ1BERlNES19QYWdlVmlldzo6VXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpCkBAIC0xMDM3LDExICsxMTk4LDExIEBACiB7CiAJaWYobV9wYWdlKQogCXsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbV9wYWdlLT5tX3BGb3JtRGljdDsKLQkJQ1BERl9Eb2N1bWVudCogcERvYyA9IG1fcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKwkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbV9wYWdlLT5HZXRQREZQYWdlKCktPm1fcEZvcm1EaWN0OworCQlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gbV9wU0RLRG9jLT5HZXREb2N1bWVudCgpOwogCQlpZihwRG9jICYmIHBEaWMpCiAJCXsKLQkJCXJldHVybiBwRG9jLT5HZXRQYWdlSW5kZXgocERpYy0+R2V0T2JqTnVtKCkpOworCQkJcmV0dXJuIHBEb2MtPkdldFBERkRvYygpLT5HZXRQYWdlSW5kZXgocERpYy0+R2V0T2JqTnVtKCkpOwogCQl9CiAJfQogCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKaW5kZXggMjI5ZDk3Ny4uZmEzYjlkZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKQEAgLTYwNSw3ICs2MDUsNyBAQAogCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAogCXBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0JcEVudi0+SlNfZG9jbWFpbEZvcm0odGV4dEJ1Zi5HZXRCdWZmZXIoKSwgdGV4dEJ1Zi5HZXRMZW5ndGgoKSwgYlVJLCAoRlhfTFBDV1NUUiljVG8sIChGWF9MUENXU1RSKWNTdWJqZWN0LCAoRlhfTFBDV1NUUiljQ2MsIChGWF9MUENXU1RSKWNCY2MsIChGWF9MUENXU1RSKWNNc2cpOworICAgIHBFbnYtPkpTX2RvY21haWxGb3JtKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0TGVuZ3RoKCksIGJVSSwgKEZYX0xQQ1dTVFIpY1RvLCAoRlhfTFBDV1NUUiljU3ViamVjdCwgKEZYX0xQQ1dTVFIpY0NjLCAoRlhfTFBDV1NUUiljQmNjLCAoRlhfTFBDV1NUUiljTXNnKTsKIAlwUnVudGltZS0+RW5kQmxvY2soKTsKIAlyZXR1cm4gVFJVRTsKIH0KQEAgLTcyMyw3ICs3MjMsNyBAQAogCQkJQ0ZYX1JlY3RBcnJheSBhUmVmcmVzaDsKIAkJCWFSZWZyZXNoLkFkZChyY0Fubm90KTsKIAotCQkJQ1BERl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKKwkJCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZYRkFQYWdlKCk7CiAJCQlBU1NFUlQocFBhZ2UgIT0gTlVMTCk7CiAJCQkKIAkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSk7CkBAIC0xMDA5LDcgKzEwMDksNyBAQAogewogCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOworCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKIAlpZiAoIXBEaWN0aW9uYXJ5KXJldHVybiBGQUxTRTsKIAogCWlmICh2cC5Jc0dldHRpbmcoKSkKQEAgLTEwMzMsNyArMTAzMyw3IEBACiB7CiAJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CisJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOwogCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOwogCiAJQ0ZYX1dpZGVTdHJpbmcgY3dBdXRob3IJCQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQXV0aG9yIik7CkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogewogCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOworCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKIAlpZiAoIXBEaWN0aW9uYXJ5KXJldHVybiBGQUxTRTsKIAogCWlmICh2cC5Jc0dldHRpbmcoKSkKQEAgLTExMTcsNyArMTExNyw3IEBACiB7CiAJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CisJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOwogCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOwogCiAJaWYgKHZwLklzR2V0dGluZygpKQpAQCAtMTE4Myw3ICsxMTgzLDcgQEAKIHsKIAlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKKwlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7CiAJaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CiAKIAlpZiAodnAuSXNHZXR0aW5nKCkpCkBAIC0xMjA3LDcgKzEyMDcsNyBAQAogewogCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOworCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKIAlpZiAoIXBEaWN0aW9uYXJ5KXJldHVybiBGQUxTRTsKIAogCWlmICh2cC5Jc0dldHRpbmcoKSkKQEAgLTEyMzEsNyArMTIzMSw3IEBACiB7CiAJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7CisJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOwogCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOwogCiAJaWYgKHZwLklzR2V0dGluZygpKQpAQCAtMTI1NSw3ICsxMjU1LDcgQEAKIHsKIAlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKKwlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7CiAJaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CiAKIAlpZiAodnAuSXNHZXR0aW5nKCkpCkBAIC0xMjgyLDcgKzEyODIsNyBAQAogCWlmIChtX3BEb2N1bWVudCA9PSBOVUxMIHx8IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpID09IE5VTEwpCiAJCXJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOworCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKIAlpZiAoIXBEaWN0aW9uYXJ5KXJldHVybiBGQUxTRTsKIAogCWlmICh2cC5Jc0dldHRpbmcoKSkKQEAgLTE4NzQsNyArMTg3NCw3IEBACiAJaW50IG5Xb3JkTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMSA/IChpbnQpcGFyYW1zWzFdIDogMDsKIAlib29sIGJTdHJpcCA9IHBhcmFtcy5HZXRTaXplKCkgPiAyID8gKGJvb2wpcGFyYW1zWzJdIDogdHJ1ZTsKIAotCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpOworCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKIAlpZiAoIXBEb2N1bWVudCkgcmV0dXJuIEZBTFNFOwogCiAJaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKQEAgLTE5NDUsNyArMTk0NSw3IEBACiAKIAlpbnQgblBhZ2VObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAwID8gKGludClwYXJhbXNbMF0gOiAwOwogCi0JQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCk7CisJQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOwogCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKIAlpZiAoblBhZ2VObyA8IDAgfHwgblBhZ2VObyA+PSBwRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAppbmRleCBmNWY5YmYwLi5jNDg0Y2JiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcApAQCAtMzgyMCw3ICszODIwLDcgQEAKIAl7CiAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CiAJCUFTU0VSVChwRW52KTsKLQkJQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKSk7CisJCUNQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkpOwogCQlpZighcFBhZ2UpCiAJCQlyZXR1cm4gRkFMU0U7CiAJCWlmIChDUERGU0RLX1BhZ2VWaWV3KiBwQ3VyUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UpKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAKaW5kZXggYTgzZTFlMC4uMzE5NjllNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwCkBAIC0xMDcsNiArMTA3LDcgQEAKIEZYX0JPT0wgQ0pTX0NvbnRleHQ6OlJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykKIHsKIAl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOworCXY4OjpMb2NrZXIgbG9ja2VyKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwogCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1fcFJ1bnRpbWUtPk5ld0pTQ29udGV4dCgpOwogCXY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAKaW5kZXggODM3NzFkZi4uMjIwNzcyNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCkBAIC0xMTcsNyArMTE3LDcgQEAKIAkJCQkJCQkweDU1LDB4OGIsMHg2ZSwweDZiLDB4MTksMHhhMCwweGY4LDB4NzcsMHhkNSwweGEzCiAJCQkJCQkJfTsKIAotQ0pTX0dsb2JhbERhdGE6OkNKU19HbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApCitDSlNfR2xvYmFsRGF0YTo6Q0pTX0dsb2JhbERhdGEoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOiBtX3BBcHAocEFwcCkKIHsKIC8vIAlJQmFzZUFubm90KiBwQmFzZUFubm90ID0gSUJhc2VBbm5vdDo6R2V0QmFzZUFubm90KG1fcEFwcCk7CiAvLyAJQVNTRVJUKHBCYXNlQW5ub3QgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAKaW5kZXggM2I3Nzc0ZC4uMDkxNTBlNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19PYmplY3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmNwcApAQCAtMTYsNyArMTYsNyBAQAogewogCWludCBuUmV0ID0gMDsKIAotCWlmKHBBcHApCisJaWYgKHBBcHApCiAJewogCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0Q3VycmVudERvYygpOwogCQlpZihwRG9jKQpAQCAtNjUsNyArNjUsNyBAQAogCUNKU19PYmplY3Q6OkFsZXJ0KHBDb250ZXh0LCBzd01zZyk7CiB9CiAKLUNKU19UaW1lciogQ0pTX0VtYmVkT2JqOjpCZWdpblRpbWVyKENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwLEZYX1VJTlQgbkVsYXBzZSkKK0NKU19UaW1lciogQ0pTX0VtYmVkT2JqOjpCZWdpblRpbWVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIEZYX1VJTlQgbkVsYXBzZSkKIHsKIAlDSlNfVGltZXIqIHBUaW1lciA9IG5ldyBDSlNfVGltZXIodGhpcyxwQXBwKTsKIAlwVGltZXItPlNldEpTVGltZXIobkVsYXBzZSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lLmNwcAppbmRleCBkNzgwMmI1Li4yNjlmMjNiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAKQEAgLTI2LDYgKzI2LDEyIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvZ2xvYmFsLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKKyNpZm5kZWYgRk9YSVRfQ0hST01FX0JVSUxECisjaW5jbHVkZSAiLi4vLi4vLi4vZnhqc2UvdmFsdWUuaCIKKyNlbHNlCisjaW5jbHVkZSAiLi4vLi4vLi4veGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuaCIKKyNlbmRpZgogCiAjaW5jbHVkZSA8bGlicGxhdGZvcm0vbGlicGxhdGZvcm0uaD4KIApAQCAtMTAxLDE2ICsxMDcsMjYgQEAKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19SdW50aW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DSlNfUnVudGltZTo6Q0pTX1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCAqIHBBcHApIDogCitleHRlcm4gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdFRlbXBsYXRlPiYgX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKTsKK0NKU19SdW50aW1lOjpDSlNfUnVudGltZShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSA6CiAJbV9wQXBwKHBBcHApLAogCW1fcERvY3VtZW50KE5VTEwpLAogCW1fYkJsb2NraW5nKEZBTFNFKSwKIAltX3BGaWVsZEV2ZW50UGF0aChOVUxMKSwKIAltX2JSZWdpc3RlcmVkKEZBTFNFKQogewotCW1faXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpOZXcoKTsKKwltX2lzb2xhdGUgPSBGUERGWEZBX0dldEFwcCgpLT5HZXRKU0VSdW50aW1lKCk/KHY4OjpJc29sYXRlKilGUERGWEZBX0dldEFwcCgpLT5HZXRKU0VSdW50aW1lKCk6djg6Oklzb2xhdGU6Ok5ldygpOwogCS8vbV9pc29sYXRlLT5FbnRlcigpOworCXY4OjpJc29sYXRlKiBpc29sYXRlID0gbV9pc29sYXRlOworCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOworCXY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUpOworCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CisJaWYgKEZQREZYRkFfR2V0QXBwKCktPkluaXRSdW50aW1lKEZBTFNFKSkgeworCQlDSlNfQ29udGV4dCAqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KilOZXdDb250ZXh0KCk7CisJCUpTX0luaXRpYWxSdW50aW1lKCp0aGlzLCB0aGlzLCBwQ29udGV4dCwgbV9jb250ZXh0KTsKKwkJUmVsZWFzZUNvbnRleHQocENvbnRleHQpOworCQlyZXR1cm47CisJfQogCiAJSW5pdEpTT2JqZWN0cygpOwogCkBAIC0xMjEsMTIgKzEzNywxMyBAQAogCiBDSlNfUnVudGltZTo6fkNKU19SdW50aW1lKCkKIHsKLQlmb3IgKGludCBpPTAsIHN6PW1fQ29udGV4dEFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQorCWludCBzaXplID0gbV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpOworCWZvciAoaW50IGk9MDtpIDwgc2l6ZTsgaSsrKQogCQlkZWxldGUgbV9Db250ZXh0QXJyYXkuR2V0QXQoaSk7CiAKIAltX0NvbnRleHRBcnJheS5SZW1vdmVBbGwoKTsKIAotCUpTX1JlbGVhc2VSdW50aW1lKCp0aGlzLCBtX2NvbnRleHQpOworCS8vSlNfUmVsZWFzZVJ1bnRpbWUoKnRoaXMsIG1fY29udGV4dCk7CiAKIAlSZW1vdmVFdmVudHNJbkxvb3AobV9wRmllbGRFdmVudFBhdGgpOwogCkBAIC0xMzYsMTIgKzE1MywxNCBAQAogCW1fY29udGV4dC5SZXNldCgpOwogCiAJLy9tX2lzb2xhdGUtPkV4aXQoKTsKLQltX2lzb2xhdGUtPkRpc3Bvc2UoKTsKKwkvL21faXNvbGF0ZS0+RGlzcG9zZSgpOworCW1faXNvbGF0ZSA9IE5VTEw7CiB9CiAKIEZYX0JPT0wgQ0pTX1J1bnRpbWU6OkluaXRKU09iamVjdHMoKQogewogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisJdjg6OkxvY2tlciBsb2NrZXIoR2V0SXNvbGF0ZSgpKTsKIAl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKEdldElzb2xhdGUoKSk7CiAJdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoR2V0SXNvbGF0ZSgpKTsKIAl2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKQEAgLTIxNSw2ICsyMzQsNyBAQAogCWlmIChtX3BEb2N1bWVudCAhPSBwUmVhZGVyRG9jKQogCXsKIAkJdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9pc29sYXRlKTsKKwkJdjg6OkxvY2tlciBsb2NrZXIobV9pc29sYXRlKTsKIAkJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX2lzb2xhdGUpOwogCQl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPXY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2lzb2xhdGUsIG1fY29udGV4dCk7CiAJCXY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwpAQCAtNDc2LDMgKzQ5Niw0NSBAQAogewogCWlmKG1faXNvbGF0ZSkgbV9pc29sYXRlLT5FbnRlcigpOwogfQorRlhfQk9PTAlDSlNfUnVudGltZTo6R2V0SFZhbHVlQnlOYW1lKEZYX0JTVFIgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpCit7CisJRlhfTFBDU1RSIG5hbWUgPSB1dGY4TmFtZS5HZXRDU3RyKCk7CisKKwl2ODo6TG9ja2VyIGxvY2soR2V0SXNvbGF0ZSgpKTsKKyAgICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPQorICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtX2NvbnRleHQpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOworCisKKwkvL3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4gdG1wQ290ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KEdldElzb2xhdGUoKSwgbV9jb250ZXh0KTsKKwl2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wdmFsdWUgPSBjb250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgbmFtZSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpKTsKKwkgCisJaWYgKHByb3B2YWx1ZS5Jc0VtcHR5KCkpIHsKKwkJRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKGhWYWx1ZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJKChDRlhKU0VfVmFsdWUqKWhWYWx1ZSktPkZvcmNlU2V0VmFsdWUocHJvcHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorRlhfQk9PTAlDSlNfUnVudGltZTo6U2V0SFZhbHVlQnlOYW1lKEZYX0JTVFIgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpCit7CisJaWYgKHV0ZjhOYW1lLklzRW1wdHkoKSB8fCBoVmFsdWUgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCUZYX0xQQ1NUUiBuYW1lID0gdXRmOE5hbWUuR2V0Q1N0cigpOworCXY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IEdldElzb2xhdGUoKTsKKwl2ODo6TG9ja2VyIGxvY2socElzb2xhdGUpOworICAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPQorICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcocElzb2xhdGUsIG1fY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CisKKwkvL3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4gdG1wQ290ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KEdldElzb2xhdGUoKSwgbV9jb250ZXh0KTsKKwl2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wdmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KEdldElzb2xhdGUoKSwoKENGWEpTRV9WYWx1ZSopaFZhbHVlKS0+RGlyZWN0R2V0VmFsdWUoKSk7CisJY29udGV4dC0+R2xvYmFsKCktPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbmFtZSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpLCBwcm9wdmFsdWUpOworCSAKKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcAppbmRleCAxYzRkYTA4Li40MjY5MjM4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwCkBAIC02OCw2ICs2OCw3IEBACiAjZGVmaW5lIEpTX1NUUl9QTEFURk9STQkJCQkJTCJXSU4iCiAjZGVmaW5lIEpTX1NUUl9MQU5HVUFOR0UJCQkJTCJFTlUiCiAjZGVmaW5lIEpTX1NUUl9WSUVXRVJWRVJTSU9OCQkJOAorI2RlZmluZSBKU19TVFJfVklFV0VSVkVSU0lPTl9YRkEJCTExCiAjZGVmaW5lIEpTX05VTV9GT1JNU1ZFUlNJT04JCQkJNwogCiAjZGVmaW5lIEpTX0ZJTEVQQVRIX01BWExFTgkJCQkyMDAwCkBAIC0xNTIsOCArMTUzLDggQEAKIAkJQ0pTX0FycmF5IGFEb2NzKHBSdW50aW1lLT5HZXRJc29sYXRlKCkpOwogLy8JCWludCBpTnVtRG9jcyA9IHBBcHAtPkNvdW50RG9jdW1lbnRzKCk7CiAJCQotLy8JCWZvcihpbnQgaUluZGV4ID0gMDsgaUluZGV4PGlOdW1Eb2NzOyBpSW5kZXgrKykKLS8vCQl7CisvLyAJCWZvcihpbnQgaUluZGV4ID0gMDsgaUluZGV4PGlOdW1Eb2NzOyBpSW5kZXgrKykKKy8vIAkJewogCQkJQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBBcHAtPkdldEN1cnJlbnREb2MoKTsKIAkJCWlmIChwRG9jKQogCQkJewpAQCAtMjA5LDEwICsyMTAsMTAgQEAKIAkJQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwogCiAJCUNKU19BcnJheSBhRG9jcyhwUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKLS8vCQlpbnQgaU51bURvY3MgPSBwQXBwLT5Db3VudERvY3VtZW50cygpOworLy8gCQlpbnQgaU51bURvY3MgPSBwQXBwLT5Db3VudERvY3VtZW50cygpOwogLy8JCQotLy8JCWZvciAoaW50IGlJbmRleCA9IDA7aUluZGV4IDwgaU51bURvY3M7IGlJbmRleCsrKQotLy8JCXsKKy8vIAkJZm9yIChpbnQgaUluZGV4ID0gMDtpSW5kZXggPCBpTnVtRG9jczsgaUluZGV4KyspCisvLyAJCXsKIAkJCWlmIChDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0Q3VycmVudERvYygpKQogCQkJewogCQkJCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jLT5HZXRJbnRlckZvcm0oKTsKQEAgLTI3OCw3ICsyNzksMTkgQEAKIHsKIAlpZiAodnAuSXNHZXR0aW5nKCkpCiAJewotCQl2cCA8PCBKU19TVFJfVklFV0VSVkVSU0lPTjsKKwkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CisJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKwkJCisJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CisJCUFTU0VSVChwQXBwICE9IE5VTEwpOworCQkKKwkJQ1BERlNES19Eb2N1bWVudCogcEN1ckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOworCisJCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ3VyRG9jLT5HZXREb2N1bWVudCgpOworCQlpZiAocERvYy0+R2V0RG9jVHlwZSgpID09IDEgfHwgcERvYy0+R2V0RG9jVHlwZSgpID09IDIpCisJCQl2cCA8PCBKU19TVFJfVklFV0VSVkVSU0lPTl9YRkE7CisJCWVsc2UKKwkJCXZwIDw8IEpTX1NUUl9WSUVXRVJWRVJTSU9OOwogCQlyZXR1cm4gVFJVRTsKIAl9CiAJCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKaW5kZXggMjk1YThkNC4uNmJmMDg2MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcApAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbG9iYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC01NCw3ICs1NSw3IEBACiAvLwlDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwogCURlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwogCi0JQ0pTX1J1bnRpbWVGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcEFwcC0+bV9wSlNSdW50aW1lRmFjdG9yeTsKKwlDSlNfUnVudGltZUZhY3RvcnkqIHBGYWN0b3J5ID0gRlBERlhGQV9HZXRBcHAoKS0+R2V0UnVudGltZUZhY3RvcnkoKTsKIAlBU1NFUlQocEZhY3RvcnkpOwogCiAJcEZhY3RvcnktPlJlbGVhc2VHbG9iYWxEYXRhKCk7CkBAIC02NCw3ICs2NSw3IEBACiB7CiAJbV9wQXBwID0gcEFwcDsKIAotCUNKU19SdW50aW1lRmFjdG9yeSogcEZhY3RvcnkgPSBwQXBwLT5tX3BKU1J1bnRpbWVGYWN0b3J5OworCUNKU19SdW50aW1lRmFjdG9yeSogcEZhY3RvcnkgPSBGUERGWEZBX0dldEFwcCgpLT5HZXRSdW50aW1lRmFjdG9yeSgpOwogCUFTU0VSVChwRmFjdG9yeSk7CiAJbV9wR2xvYmFsRGF0YSA9IHBGYWN0b3J5LT5OZXdHbG9iYWxEYXRhKHBBcHApOwogCVVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwIGIvZnBkZnNkay9zcmMvanNhcGkvZnhqc192OC5jcHAKaW5kZXggNWViOTg3My4uZGNhZDMwZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvanNhcGkvZnhqc192OC5jcHAKKysrIGIvZnBkZnNkay9zcmMvanNhcGkvZnhqc192OC5jcHAKQEAgLTc2LDExICs3NiwxMSBAQAogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwogCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7Ci0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOworCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgxKTsKIAlpZighcEFycmF5KSAKIAl7CiAJCXBBcnJheSA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsKLQkJaXNvbGF0ZS0+U2V0RGF0YSgwLCBwQXJyYXkpOworCQlpc29sYXRlLT5TZXREYXRhKDEsIHBBcnJheSk7CiAJfQogCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSBGWF9ORVcgQ0pTX09iakRlZmludGlvbihpc29sYXRlLCBzT2JqTmFtZSwgZU9ialR5cGUsIHBDb25zdHJ1Y3RvciwgcERlc3RydWN0b3IsIGJBcHBseU5ldyk7CiAJcEFycmF5LT5BZGQocE9iakRlZik7CkBAIC05Niw3ICs5Niw3IEBACiAJQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZygoRlhfTFBDV1NUUilzTWV0aG9kTmFtZSk7CiAJQ0ZYX0J5dGVTdHJpbmcgYnNNZXRob2ROYW1lID0gd3MuVVRGOEVuY29kZSgpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOworCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgxKTsKIAlpZighcEFycmF5KSByZXR1cm4gMDsKIAogCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiAwOwpAQCAtMTE2LDcgKzExNiw3IEBACiAJQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZygoRlhfTFBDV1NUUilzUHJvcE5hbWUpOwogCUNGWF9CeXRlU3RyaW5nIGJzUHJvcGVydHlOYW1lID0gd3MuVVRGOEVuY29kZSgpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOworCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgxKTsKIAlpZighcEFycmF5KSByZXR1cm4gMDsKIAogCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiAwOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKIAotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKKwlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMSk7CiAJaWYoIXBBcnJheSkgcmV0dXJuIDA7CiAKIAlpZihuT2JqRGVmbklEPDAgfHwgbk9iakRlZm5JRD49IHBBcnJheS0+R2V0U2l6ZSgpKSByZXR1cm4gMDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwogCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7CisJQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDEpOwogCWlmKCFwQXJyYXkpIHJldHVybiAwOwogCiAJQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZygoRlhfTFBDV1NUUilzQ29uc3ROYW1lKTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwogCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7CisJQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDEpOwogCUFTU0VSVChwQXJyYXkgIT0gTlVMTCk7CiAJZm9yKGludCBpPTA7IGk8cEFycmF5LT5HZXRTaXplKCk7IGkrKykKIAl7CkBAIC0yMzQsMTYgKzIzNCwxOCBAQAogewogCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwogCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOworCXY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUpOwogCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CiAKIAl2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBnbG9iYWxPYmpUZW1wID0gX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKHBKU1J1bnRpbWUpOwogCXY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IHY4Q29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoaXNvbGF0ZSwgTlVMTCwgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBnbG9iYWxPYmpUZW1wKSk7CiAJdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUodjhDb250ZXh0KTsKIAotCXY4OjpIYW5kbGU8djg6OkV4dGVybmFsPiBwdHIgPSB2ODo6RXh0ZXJuYWw6Ok5ldyhpc29sYXRlLCBwRlhSdW50aW1lKTsKLQl2OENvbnRleHQtPlNldEVtYmVkZGVyRGF0YSgxLCBwdHIpOworCS8vdjg6OkhhbmRsZTxFeHRlcm5hbD4gcHRyID0gRXh0ZXJuYWw6Ok5ldyhpc29sYXRlLCBwRlhSdW50aW1lKTsKKwkvL3Y4Q29udGV4dC0+U2V0RW1iZWRkZXJEYXRhKDEsIHB0cik7CisJaXNvbGF0ZS0+U2V0RGF0YSgyLCBwRlhSdW50aW1lKTsKIAotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKKwlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMSk7CiAJaWYoIXBBcnJheSkgcmV0dXJuOwogCiAJZm9yKGludCBpPTA7IGk8cEFycmF5LT5HZXRTaXplKCk7IGkrKykKQEAgLTI1Nyw3ICsyNTksOCBAQAogCQlpZihwT2JqRGVmLT5vYmpUeXBlID09IEpTX0RZTkFNSUMpCiAJCXsKIAkJCS8vRG9jdW1lbnQgaXMgc2V0IGFzIGdsb2JhbCBvYmplY3QsIG5lZWQgdG8gY29uc3RydWN0IGl0IGZpcnN0LgotCQkJaWYod3MuRXF1YWwoTCJEb2N1bWVudCIpKQorCQkJQ0ZYX1dpZGVTdHJpbmcgd3NTdHJpbmcoTCJEb2N1bWVudCIpOworCQkJaWYod3MuRXF1YWwod3NTdHJpbmcpKQogCQkJewogCiAJCQkJQ0pTX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSBGWF9ORVcgQ0pTX1ByaXZhdGVEYXRhOwpAQCAtMjg0LDExICsyODcsMTAgQEAKIHsKIAl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKIAl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKwl2ODo6TG9ja2VyIGxvY2tlcihpc29sYXRlKTsKIAl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhpc29sYXRlLCB2OFBlcnNpc3RlbnRDb250ZXh0KTsKLQl2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKIAotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKKwlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMSk7CiAJaWYoIXBBcnJheSkgcmV0dXJuIDsKIAogCWZvcihpbnQgaT0wOyBpPHBBcnJheS0+R2V0U2l6ZSgpOyBpKyspCkBAIC0zMDQsMTQgKzMwNiwxNSBAQAogCQlkZWxldGUgcE9iakRlZjsKIAl9CiAJZGVsZXRlIHBBcnJheTsKLQlpc29sYXRlLT5TZXREYXRhKDAsTlVMTCk7CisJaXNvbGF0ZS0+U2V0RGF0YSgxLE5VTEwpOworCWlzb2xhdGUtPlNldERhdGEoMixOVUxMKTsKIH0KIAogdm9pZCBKU19Jbml0aWFsKCkgCiB7Ci0jaWZuZGVmIEZPWElUX0NIUk9NRV9CVUlMRAotCXY4OjpWODo6SW5pdGlhbGl6ZUlDVSgpOwotI2VuZGlmCisvLyNpZm5kZWYgRk9YSVRfQ0hST01FX0JVSUxECisvLwl2ODo6Vjg6OkluaXRpYWxpemVJQ1UoKTsKKy8vI2VuZGlmCiB9CiB2b2lkIEpTX1JlbGVhc2UoKQogewpAQCAtMzY4LDcgKzM3MSw3IEBACiAJCXJldHVybiBvYmpUZW1wbC0+TmV3SW5zdGFuY2UoKTsKIAl9CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7CisJQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDEpOwogCWlmKCFwQXJyYXkpIHJldHVybiB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KCk7CiAKIApAQCAtMzk2LDcgKzM5OSw3IEBACiAJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CiAJdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7CisJQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDEpOwogCWlmKCFwQXJyYXkpIHJldHVybiB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KCk7CiAKIAlpZihuT2JqRGVmbklEPDAgfHwgbk9iakRlZm5JRD49IHBBcnJheS0+R2V0U2l6ZSgpKSByZXR1cm4gdjg6OkhhbmRsZTx2ODo6T2JqZWN0PigpOwpAQCAtNDE1LDcgKzQxOCw3IEBACiAJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CiAJdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7CisJQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDEpOwogCWlmKCFwQXJyYXkpIHJldHVybiB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+KCk7CiAKIAl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwpAQCAtNDQ1LDcgKzQ0OCw3IEBACiAJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CiAJdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7CisJQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDEpOwogCWlmKCFwQXJyYXkpIHJldHVybiAtMTsKIAogCWZvcihpbnQgaT0wOyBpPHBBcnJheS0+R2V0U2l6ZSgpOyBpKyspCkBAIC00NjQsMTIgKzQ2NywxMiBAQAogCiB1bnNpZ25lZCBKU19DYWxjSGFzaChjb25zdCB3Y2hhcl90KiBtYWluLCB1bnNpZ25lZCBuTGVuKQogewotCXJldHVybiAodW5zaWduZWQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcobWFpbiwgbkxlbik7CisJcmV0dXJuICh1bnNpZ25lZClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoRlhfTFBDV1NUUiltYWluLCBuTGVuKTsKIH0KIAogdW5zaWduZWQgSlNfQ2FsY0hhc2goY29uc3Qgd2NoYXJfdCogbWFpbikKIHsKLQlyZXR1cm4gKHVuc2lnbmVkKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKG1haW4sIEZYU1lTX3djc2xlbihtYWluKSk7CisJcmV0dXJuICh1bnNpZ25lZClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoRlhfTFBDV1NUUiltYWluLCBGWFNZU193Y3NsZW4obWFpbikpOwogfQogY29uc3Qgd2NoYXJfdCoJSlNfR2V0VHlwZW9mKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBwT2JqKQogewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcAppbmRleCAwMTgxMGZmLi43NDQxMThmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcApAQCAtNTAyLDYgKzUwMiwxMCBAQAogCXsKIAkJaWYgKG1fcEZpbGxlck5vdGlmeSkKIAkJeworCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIDApOworCQkJaWYgKGJFeGl0KSByZXR1cm47CisKIAkJCUZYX0lOVDMyIG5XaGVyZSA9IDA7CiAJCQlGWF9GTE9BVCBmUG9wdXBSZXQgPSAwLjBmOwogCQkJRlhfRkxPQVQgZlBvcHVwTWluID0gMC4wZjsKQEAgLTUyOSw2ICs1MzMsMTAgQEAKIAkJCQkKIAkJCQltX25Qb3B1cFdoZXJlID0gbldoZXJlOwogCQkJCU1vdmUocmNXaW5kb3csIFRSVUUsIFRSVUUpOworCisJCQkJYkV4aXQgPSBGQUxTRTsKKwkJCQltX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIDApOworCQkJCWlmIChiRXhpdCkgcmV0dXJuOwogCQkJfQogCQl9CiAJfQpAQCAtNTUyLDYgKzU2MCwxNSBAQAogCQlpZiAobV9wTGlzdC0+R2V0Q3VyU2VsKCkgPiAwKQogCQl7CiAJCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisKKwkJCWlmIChtX3BGaWxsZXJOb3RpZnkpCisJCQl7CisJCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKwkJCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKwkJCQliRXhpdCA9IEZBTFNFOworCQkJCW1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworCQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCQkJfQogCQkJaWYgKG1fcExpc3QtPk9uS2V5RG93bldpdGhFeGl0KG5DaGFyLGJFeGl0LG5GbGFnKSkKIAkJCXsKIAkJCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKQEAgLTU2Myw2ICs1ODAsMTUgQEAKIAkJaWYgKG1fcExpc3QtPkdldEN1clNlbCgpIDwgbV9wTGlzdC0+R2V0Q291bnQoKSAtIDEpCiAJCXsKIAkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKworCQkJaWYgKG1fcEZpbGxlck5vdGlmeSkKKwkJCXsKKwkJCQltX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworCQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCQkJCWJFeGl0ID0gRkFMU0U7CisJCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7CisJCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7CisJCQl9CiAJCQlpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQogCQkJewogCQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwpAQCAtNTkyLDYgKzYxOCwxNiBAQAogCX0KIAllbHNlCiAJeworCQlpZiAobV9wRmlsbGVyTm90aWZ5KQorCQl7CisJCQliRXhpdCA9IEZBTFNFOworCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKwkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworCisJCQliRXhpdCA9IEZBTFNFOworCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7CisJCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKwkJfQogCQlpZiAobV9wTGlzdC0+T25DaGFyV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQogCQl7CiAJCQlyZXR1cm4gYkV4aXQ7CmRpZmYgLS1naXQgYS9wZGZpdW0uZ3lwIGIvcGRmaXVtLmd5cAppbmRleCA2MDY5MjVjLi44ZjBmZjg5IDEwMDY0NAotLS0gYS9wZGZpdW0uZ3lwCisrKyBiL3BkZml1bS5neXAKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgICAgICAgJ2phdmFzY3JpcHQnLAogICAgICAgICAnanNhcGknLAogICAgICAgICAncGRmd2luZG93JywKKyAgICAgICAgJ2ZwZGZ4ZmEnLAogICAgICAgXSwKICAgICAgICdsZGZsYWdzJzogWyAnLUw8KFBST0RVQ1RfRElSKScsXSwKICAgICAgICdzb3VyY2VzJzogWwpAQCAtMzI2LDEzICszMjcsMTkgQEAKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2JtcC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZ2lmLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWdfZW5jLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wbmcuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuaCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvaW5jbHVkZS9meF9vcGVuanBlZy5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2Jpby5jJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2Npby5jJywKQEAgLTM1Niw2ICszNjMsNTggQEAKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3QyLmMnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdGNkLmMnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdGd0LmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL2luY2x1ZGUvZnhfcG5nLmgnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmcuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ2Vycm9yLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdnZXQuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ21lbS5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ncHJlYWQuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3Jpby5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5ncnRyYW4uYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3J1dGlsLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmdzZXQuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3RyYW5zLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmd3aW8uYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xwbmcvc3JjL2Z4X3BuZ3dyaXRlLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9scG5nL3NyYy9meF9wbmd3dHJhbi5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvaW5jbHVkZS9meF90aWZmaW9wLmgnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfYXV4LmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY2xvc2UuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9jb2RlYy5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2NvbG9yLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfY29tcHJlc3MuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXIuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9kaXJpbmZvLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZGlycmVhZC5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2RpcndyaXRlLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfZHVtcG1vZGUuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9lcnJvci5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2V4dGVuc2lvbi5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2ZheDMuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9mYXgzc20uYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9mbHVzaC5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2dldGltYWdlLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfanBlZy5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2x1di5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX2x6dy5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX25leHQuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9vanBlZy5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX29wZW4uYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl9wYWNrYml0cy5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3BpeGFybG9nLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfcHJlZGljdC5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ByaW50LmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfcmVhZC5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3N0cmlwLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfc3dhYi5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3RodW5kZXIuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl90aWxlLmMnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF90aWZmL3NyYy9meF90aWZfdmVyc2lvbi5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3dhcm5pbmcuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3RpZmYvc3JjL2Z4X3RpZl93cml0ZS5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfdGlmZi9zcmMvZnhfdGlmX3ppcC5jJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9pbmNsdWRlL2Z4X3psaWIuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfYWRsZXIzMi5jJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9jb21wcmVzcy5jJywKQEAgLTQwMCw2ICs0NTksOCBAQAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2FtMDIuYycsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjZ2F0cy5jJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NudnJ0LmMnLApAQCAtNDI1LDYgKzQ4Niw4IEBACiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN2aXJ0LmMnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zd3RwbnQuYycsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN4Zm9ybS5jJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvY2RlcnJvci5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9jZGpwZWcuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2FwaW1pbi5jJywKQEAgLTczMyw2ICs3OTYsMjQgQEAKICAgICAgIF0sCiAgICAgfSwKICAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZnBkZnhmYScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnbGRmbGFncyc6IFsgJy1MPChQUk9EVUNUX0RJUiknLF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAneGZhLmd5cDp4ZmEnLAorICAgICAgXSwKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2FwcC5jcHAnLAorICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2RvYy5jcHAnLAorICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuY3BwJywKKyAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmNwcCcsCisgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oJywKKyAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgnLAorICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgnLAorICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MgYi9zYW1wbGVzL3BkZml1bV90ZXN0LmNjCmluZGV4IDBmMGM4NzUuLmE5OTA0YWIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MKKysrIGIvc2FtcGxlcy9wZGZpdW1fdGVzdC5jYwpAQCAtMjkwLDYgKzI5MCw3IEBACiAgICh2b2lkKSBGUERGQXZhaWxfSXNGb3JtQXZhaWwocGRmX2F2YWlsLCAmaGludHMpOwogCiAgIEZQREZfRk9STUhBTkRMRSBmb3JtID0gRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm91bWVudChkb2MsICZmb3JtX2NhbGxiYWNrcyk7CisgIEZQREZfTG9hZFhGQShkb2MpOwogICBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKGZvcm0sIDAsIDB4RkZFNEREKTsKICAgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShmb3JtLCAxMDApOwogCmRpZmYgLS1naXQgYS94ZmEuZ3lwIGIveGZhLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQ1NTY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhLmd5cApAQCAtMCwwICsxLDcxNSBAQAoreworICAidGFyZ2V0cyI6WworICAgIHsKKyAgICAgICJ0YXJnZXRfbmFtZSI6InhmYSIsCisgICAgICAidHlwZSI6InN0YXRpY19saWJyYXJ5IiwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4JywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoREVQVEgpL3Y4L3Rvb2xzL2d5cC92OC5neXA6djgnLAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICc8KERFUFRIKS92OCcsCisgICAgICAgICc8KERFUFRIKS92OC9pbmNsdWRlJywKKyAgICAgIF0sCisgICAgICAic291cmNlcyI6WworICAgICAgICAieGZhL2luY2x1ZGUvZm94aXR4ZmEuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmNsaXBib2FyZG1nci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY3Vyc29ybWdyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJtb25pdG9ybWdyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJuYXRpdmUuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRocmVhZG1nci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jYXJldC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9lZGl0LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3guaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbWVudS5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9jb250ZW50LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Vycm9yLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZ3JpZC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ub3RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3BhbmVsLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RhcmdldC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aGVtZS5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGltZXIuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldGRlZi5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvZndsLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2FwcC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9iYXJjb2RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NhcmV0LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvbGlzdGJveC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9waWN0dXJlYm94LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3RoZW1lLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3dpZGdldC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9iYXJjb2RldHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2FyZXR0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9jaGVja2JveHRwLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2NvbWJvYm94dHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZm9ybXRwLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9tb250aGNhbGVuZGFydHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvcGljdHVyZWJveHRwLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS93aWRnZXR0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhX2Jhc2ljLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhX29iamVjdGFjYy5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z4ZmEvZnhmYV93aWRnZXQuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Nzcy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2ltZy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Blbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3B0aC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9pdGVyYXRvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX29iamVjdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL3htbC9mZGVfeG1sLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgiLAorICAgICAgICAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmgiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0a21wbWF0Y2guY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGttcG1hdGNoLmgiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrZGF0YS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2ZnYXMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9hbGcuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9jcGcuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9kYXRldGltZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2ZudC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xnZy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X21lbS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N0bS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N5cy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3VjZC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3V0bC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2FsZ29yaXRobS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY29kZXBhZ2UuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NvZGVwYWdlLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfZW5jb2RlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X21lbW9yeS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3lzdGVtLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF91dGlscy5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9kYXRldGltZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZveGl0bGliLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2JhcmNvZGVpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jYXJldGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY29tYm9ib3hpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlcmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2VkaXRpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9mb3JtcHJveHlpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbW9udGhjYWxlbmRhcmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9wdXNoYnV0dG9uaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZWltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfYmFyY29kZWltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2hlY2tib3hpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2RhdGV0aW1lcGlja2VyaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2xpc3Rib3hpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfcGljdHVyZWJveGltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3B1c2hidXR0b25pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zcGluYnV0dG9uaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfdG9vbHRpcGN0cmxpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z4bWF0aF9iYXJjb2RlaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2NvbnRlbnRpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9mb3JtaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZ3JpZGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX25vdGVpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9wYW5lbGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3NkYWRhcHRlcmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RhcmdldGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RocmVhZGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfd2lkZ2V0aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfd2lkZ2V0bWdyaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9jb250ZW50aW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2dyaWRpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYXBwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYmFyY29kZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NhcmV0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2hlY2tib3guY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jb21ib2JveC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZWRpdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2xpc3Rib3guY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9waWN0dXJlYm94LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3RoZW1lLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC93aWRnZXQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9iYXJjb2RldHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9jYXJldHRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2hlY2tib3h0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2NvbWJvYm94dHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9kYXRldGltZXBpY2tlcnRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZWRpdHRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvbGlzdGJveHRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvbW9udGhjYWxlbmRhcnRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcGljdHVyZWJveHRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcHVzaGJ1dHRvbnRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvc2Nyb2xsYmFydHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS93aWRnZXR0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2JhcmNvZGUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQVNDSUlFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQmFyQ29kZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQmluYXJpemVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQmluYXJ5Qml0bWFwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0M0MEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25CaXRBcnJheS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJpdE1hdHJpeC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJpdFNvdXJjZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJ5dGVNYXRyaXguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uRUNJLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERlY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4VmVyc2lvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGltZW5zaW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRWRpZmFjdEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19FbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRW5jb2RlckNvbnRleHQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19FcnJvckNvcnJlY3Rpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19GaW5kZXJQYXR0ZXJuSW5mby5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19MaWJyYXJ5LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfTHVtaW5hbmNlU291cmNlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZENvZGFCYXJSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kYUJhcldyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RlMTI4UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kZTM5UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZENvZGUzOVdyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU4xM1JlYWRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU4xM1dyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU44UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZEVBTjhXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVEaW1SZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVEaW1Xcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVEUmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZFVQQ0FSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkVVBDQVdyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxNy5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3QmFyY29kZVZhbHVlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Qm91bmRpbmdCb3guY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdDb2Rld29yZC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvbW1vbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGV0ZWN0b3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RpbWVuc2lvbnMuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDTW9kdWx1c0dGLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN1dyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQml0TWF0cml4UGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2Rlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckRlY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRUNCLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVDQmxvY2tzLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyTWFza1V0aWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJNb2RlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlclZlcnNpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkRhdGFCbG9jay5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGF0YU1hc2suY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkRldGVjdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRmluZGVyUGF0dGVybi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSR3JpZFNhbXBsZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWVkU29sb21vbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1JlZWRTb2xvbW9uR0YyNTYuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1Jlc3VsdFBvaW50LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfU3ltYm9sSW5mby5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1N5bWJvbFNoYXBlSGludC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1RleHRFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVHdvRGltV3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19VdGlsUlNTLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVXRpbHMuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfV3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfWDEyRW5jb2Rlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQVNDSUlFbmNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQmFzZTI1NkVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CaW5hcml6ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQzQwRW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQml0U291cmNlLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQnl0ZUFycmF5LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25FQ0kuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGVjb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhWZXJzaW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeFdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RlY29kZXJSZXN1bHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EZWZhdWx0UGxhY2VtZW50LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGltZW5zaW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRWRpZmFjdEVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19FbmNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19FcnJvckNvcnJlY3Rpb24uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0hpZ2hMZXZlbEVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kYUJhclJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RhQmFyV3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZENvZGUxMjhSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMzlSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kZTM5V3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjEzUmVhZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjEzV3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjhSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkRUFOOFdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURpbVJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkVVBDQVJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRVUENBV3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVSb3cuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCb3VuZGluZ0JveC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0NvZGV3b3JkLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3Q29tbW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3Q29tcGFjdGlvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGltZW5zaW9ucy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN1JlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3V3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRGVjb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZVJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJFQ0IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRUNCbG9ja3MuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyVmVyc2lvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZVdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGF0YUJsb2NrLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJEYXRhTWFzay5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGV0ZWN0b3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJHcmlkU2FtcGxlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlZWRTb2xvbW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb25EZWNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfU3ltYm9sU2hhcGVIaW50LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfVGV4dEVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Ud29EaW1Xcml0ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1V0aWxSU1MuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfV3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfWDEyRW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL3V0aWxzLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2NoZWNrc3VtLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzaWduYXR1cmUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bGFkYXB0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3JlbmRlcmNvbnRleHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi9meGZhX2xvY2FsZXZhbHVlLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kZWJ1Zy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNhcGkuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZGVidWdfcGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZGVidWdfcGFyc2VyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX29iamVjdGFjY19pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfZ3JhcGhpY3MuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL3ByZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9keW5wcm9wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmgiLAorICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvc2NvcGVfaW5saW5lLmgiLAorICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvdXRpbF9pbmxpbmUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuaCIKKyAgICAgIF0sCisgICAgICAiY29uZGl0aW9ucyI6WworICAgICAgICBbCisgICAgICAgICAgIk9TID09ICd3aW4nIiwKKyAgICAgICAgICB7CisgICAgICAgICAgICAiY29uZmlndXJhdGlvbnMiOnsKKyAgICAgICAgICAgICAgIkRlYnVnIjp7CisgICAgICAgICAgICAgICAgIm1zdnNfY29uZmlndXJhdGlvbl9hdHRyaWJ1dGVzIjp7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAibXN2c19zZXR0aW5ncyI6eworICAgICAgICAgICAgICAgICAgIlZDQ0xDb21waWxlclRvb2wiOnsKKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAiVkNMaWJyYXJpYW5Ub29sIjp7CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgIlZDTGlua2VyVG9vbCI6eworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgIlJlbGVhc2UiOnsKKyAgICAgICAgICAgICAgICAibXN2c19jb25maWd1cmF0aW9uX2F0dHJpYnV0ZXMiOnsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJtc3ZzX3NldHRpbmdzIjp7CisgICAgICAgICAgICAgICAgICAiVkNDTENvbXBpbGVyVG9vbCI6eworICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICJWQ0xpYnJhcmlhblRvb2wiOnsKKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAiVkNMaW5rZXJUb29sIjp7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInNvdXJjZXMiOlsKKyAgICAgICAgICAgIF0KKyAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgIFsKKyAgICAgICAgICAiT1MgPT0gJ21hYyciLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJjb25maWd1cmF0aW9ucyI6eworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJzb3VyY2VzIjpbCisgICAgICAgICAgICBdCisgICAgICAgICAgfQorICAgICAgICBdCisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9mb3hpdHhmYS5oIGIveGZhL2luY2x1ZGUvZm94aXR4ZmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFiNmNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZm94aXR4ZmEuaApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYJX0ZPWElUX1hGQV9IXw0KKyNkZWZpbmUgX0ZPWElUX1hGQV9IXw0KKyNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiDQorI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiDQorI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZhcGkuaCINCisjaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaCINCisjaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCINCisjaW5jbHVkZSAiLi9meGJhcmNvZGUvQkNfQmFyQ29kZS5oIg0KKyNpbmNsdWRlICIuL2Z4Z3JhcGhpY3MvZnhfZ3JhcGhpY3MuaCINCisjaW5jbHVkZSAiLi9md2wvZndsLmgiDQorI2luY2x1ZGUgIi4vZnhqc2UvZnhqc2UuaCINCisjaW5jbHVkZSAiLi9meGZhL2Z4ZmEuaCINCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmNsaXBib2FyZG1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjbGlwYm9hcmRtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmEwOThlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjbGlwYm9hcmRtZ3IuaApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9BREFQVEVSX0NMSVBCT0FSRE1HUl9IDQorI2RlZmluZSBfRldMX0FEQVBURVJfQ0xJUEJPQVJETUdSX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3I7DQorZW51bSBGV0xfQ0xJUEJPQVJERk9STUFUIHsNCisgICAgRldMX0NMSVBCT0FSREZPUk1BVF9EaWIsDQorICAgIEZXTF9DTElQQk9BUkRGT1JNQVRfVGV4dCwNCisgICAgRldMX0NMSVBCT0FSREZPUk1BVF9VbmNvZGVUZXh0LA0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IQ0xJUEJPQVJEREFUQSB7DQorICAgIEZYX0xQVk9JRCBwRGF0YTsNCit9ICogRldMX0hDTElQQk9BUkREQVRBOw0KK2NsYXNzIElGV0xfQWRhcHRlckNsaXBib2FyZE1ncg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRW1wdHkoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNEYXRhQXZhaWxhYmxlKEZYX0RXT1JEIGR3Rm9ybWF0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0hDTElQQk9BUkREQVRBCUdldERhdGEoRlhfRFdPUkQgZHdGb3JtYXQpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXREYXRhKEZYX0RXT1JEIGR3Rm9ybWF0LCBGWF9CWVRFICpwQnVmLCBGWF9JTlQzMiBpU2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldERhdGFTaXplKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0xQVk9JRAlMb2NrRGF0YUJ1ZmZlcihGV0xfSENMSVBCT0FSRERBVEEgaERhdGEpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlVbkxvY2tEYXRhQnVmZmVyKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFN0cmluZ0RhdGEoRlhfV1NUUiB3cykgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFN0cmluZ0RhdGEoRlhfQlNUUiBicykgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFN0cmluZ0RhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0U3RyaW5nRGF0YShDRlhfQnl0ZVN0cmluZyAmYnMpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlFbnVtRm9ybWF0cyhDRlhfRFdvcmRBcnJheSAmZm9ybWF0cykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVJlZ2lzdGVyRm9ybWF0KEZYX1dTVFIgd3NGb3JtYXQpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY3Vyc29ybWdyLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmN1cnNvcm1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWEyMmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmN1cnNvcm1nci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0FEQVBURVJfQ1VSU09STUdSX0gNCisjZGVmaW5lIF9GV0xfQURBUFRFUl9DVVJTT1JNR1JfSA0KK2NsYXNzIENGWF9ESUJpdG1hcDsNCitjbGFzcyBJRldMX0FkYXB0ZXJDdXJzb3JNZ3I7DQorZW51bSBGV0xfQ1VSU09SVFlQRSB7DQorICAgIEZXTF9DVVJTT1JUWVBFX0Fycm93ID0gMCwNCisgICAgRldMX0NVUlNPUlRZUEVfQ3Jvc3MsDQorICAgIEZXTF9DVVJTT1JUWVBFX0hhbmQsDQorICAgIEZXTF9DVVJTT1JUWVBFX0lucHV0QmVhbSwNCisgICAgRldMX0NVUlNPUlRZUEVfV2FpdCwNCisgICAgRldMX0NVUlNPUlRZUEVfU2l6ZUFsbCwNCisgICAgRldMX0NVUlNPUlRZUEVfU2l6ZU5XU0UsDQorICAgIEZXTF9DVVJTT1JUWVBFX1NpemVORVNXLA0KKyAgICBGV0xfQ1VSU09SVFlQRV9TaXplV0UsDQorICAgIEZXTF9DVVJTT1JUWVBFX1NpemVOUywNCisgICAgRldMX0NVUlNPUlRZUEVfUHJvaGliaXRpb24sDQorICAgIEZXTF9DVVJTT1JUWVBFX0hlbHANCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GV0xfSENVUlNPUiB7DQorICAgIEZYX0xQVk9JRCBwRGF0YTsNCit9ICpGV0xfSENVUlNPUjsNCitjbGFzcyBJRldMX0FkYXB0ZXJDdXJzb3JNZ3INCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsCUZXTF9IQ1VSU09SCUdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRSBlQ3Vyc29yVHlwZSkgPSAwOw0KKyAgICB2aXJ0dWFsCUZXTF9IQ1VSU09SCUdldEN1c3RvbUN1cnNvcihjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0ZMT0FUIHhIb3RzcG90ID0gMCwgRlhfRkxPQVQgeUhvdHNwb3QgPSAwKSA9IDA7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJU2V0Q3Vyc29yKEZXTF9IQ1VSU09SIGhDdXJzb3IpID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlTaG93Q3Vyc29yKEZYX0JPT0wgYlNob3cpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDdXJzb3JQb3MoQ0ZYX1BvaW50RiAmcHQpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJtb25pdG9ybWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxOTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0FEQVBURVJfTU9OSVRPUk1HUl9IDQorI2RlZmluZSBfRldMX0FEQVBURVJfTU9OSVRPUk1HUl9IDQorY2xhc3MgSUZXTF9BZGFwdGVyTW9uaXRvck1ncjsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hNT05JVE9SIHsNCisgICAgRlhfTFBWT0lEIHBEYXRhOw0KK30gKkZXTF9ITU9OSVRPUjsNCitjbGFzcyBJRldMX0FkYXB0ZXJNb25pdG9yTWdyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJQ291bnRNb25pdG9ycygpID0gMDsNCisgICAgdmlydHVhbCBGV0xfSE1PTklUT1IJR2V0TW9uaXRvcihGWF9JTlQzMiBuSW5kZXgpID0gMDsNCisgICAgdmlydHVhbCBGV0xfSE1PTklUT1IJR2V0Q3VycmVudE1vbml0b3IoKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0hNT05JVE9SCUdldE1vbml0b3JCeVJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0hNT05JVE9SCUdldE1vbml0b3JCeVBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCQlHZXRNb25pdG9yU2l6ZShGV0xfSE1PTklUT1IgaE1vbml0b3IsIEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm5hdGl2ZS5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJuYXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUzMjk0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJuYXRpdmUuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9BREFQVEVSX05BVElWRV9IDQorI2RlZmluZSBfRldMX0FEQVBURVJfTkFUSVZFX0gNCitjbGFzcyBJRldMX1dpZGdldE1nckRlbGVnYXRlOw0KK2NsYXNzIElGV0xfQWRhcHRlcldpZGdldE1ncjsNCitjbGFzcyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyVGltZXJNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlck1vbml0b3JNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlck5hdGl2ZTsNCitjbGFzcyBJRldMX0FkYXB0ZXJOYXRpdmUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlcldpZGdldE1ncioJR2V0V2lkZ2V0TWdyKElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUgKnBEZWxlZ2F0ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlclRocmVhZE1ncioJR2V0VGhyZWFkTWdyKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlclRpbWVyTWdyKglHZXRUaW1lck1ncigpID0gMDsNCisgICAgdmlydHVhbCBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqCUdldEN1cnNvck1ncigpID0gMDsNCisgICAgdmlydHVhbCBJRldMX0FkYXB0ZXJNb25pdG9yTWdyKiBHZXRNb25pdG9yTWdyKCkgPSAwOw0KKyAgICB2aXJ0dWFsCUlGV0xfQWRhcHRlckNsaXBib2FyZE1nciogR2V0Q2xpcGJvYXJkTWdyKCkgPSAwOw0KK307DQorSUZXTF9BZGFwdGVyTmF0aXZlKiBGV0xfQ3JlYXRlRnVlbEFkYXB0ZXJOYXRpdmUoKTsNCit2b2lkIEZXTF9SZWxlYXNlRnVlbEFkYXB0ZXJOYXRpdmUoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlck5hdGl2ZSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aHJlYWRtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2Y2Q1OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQURBUFRFUl9USFJFQURfSA0KKyNkZWZpbmUgX0ZXTF9BREFQVEVSX1RIUkVBRF9IDQorY2xhc3MgSUZXTF9UaHJlYWQ7DQorY2xhc3MgSUZXTF9BZGFwdGVyVGhyZWFkTWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlck11dGV4Ow0KK2NsYXNzIElGV0xfQWRhcHRlclNlbWFwaG9yZTsNCitjbGFzcyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3INCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVN0YXJ0KElGV0xfVGhyZWFkICpwVGhyZWFkLCBGV0xfSFRIUkVBRCAmaFRocmVhZCwgRlhfQk9PTCBiU3VzcGVuZGVkID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlSZXN1bWUoRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVN1c3BlbmQoRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUtpbGwoRldMX0hUSFJFQUQgaFRocmVhZCwgRlhfSU5UMzIgaUV4aXRDb2RlKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU3RvcChGV0xfSFRIUkVBRCBoVGhyZWFkLCBGWF9JTlQzMiBpRXhpdENvZGUpID0gMDsNCisgICAgdmlydHVhbCBJRldMX1RocmVhZCogR2V0Q3VycmVudFRocmVhZCgpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfQWRhcHRlclNlbWFwaG9yZQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX0FkYXB0ZXJTZW1hcGhvcmUgKiBDcmVhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIERlc3Ryb3koKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBXYWl0KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgUG9zdCgpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFZhbHVlKEZYX0RXT1JEICZ2YWwpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFJlc2V0KEZYX0lOVDMyIGluaXQpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdmN2U3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aW1lcm1nci5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0FEQVBURVJfVElNRVJNR1JfSA0KKyNkZWZpbmUgX0ZXTF9BREFQVEVSX1RJTUVSTUdSX0gNCitjbGFzcyBJRldMX1RpbWVyOw0KK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTdGFydChJRldMX1RpbWVyICpwVGltZXIsIEZYX0RXT1JEIGR3RWxhcHNlLCBGV0xfSFRJTUVSICZoVGltZXIsIEZYX0JPT0wgYkltbWVkaWF0ZWx5ID0gVFJVRSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVN0b3AoRldMX0hUSU1FUiBoVGltZXIpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyd2lkZ2V0bWdyLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzI5NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0FEQVBURVJfV0lER0VUTUdSX0gNCisjZGVmaW5lIF9GV0xfQURBUFRFUl9XSURHRVRNR1JfSA0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfTWVudTsNCitjbGFzcyBJRldMX01lbnVEUDsNCitjbGFzcyBDRlhfUGF0aDsNCitjbGFzcyBDRlhfRElCaXRtYXA7DQorY2xhc3MgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlck1lc3NhZ2VIb29rOw0KK2NsYXNzIElGV0xfQXBwRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGV0xfRVJSIENyZWF0ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBEZXN0cm95V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UG9zaXRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0UGFyZW50V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRldMX1dpZGdldCAqcFBhcmVudCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0SWNvbihJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX0RJQml0bWFwICpwSWNvbiwgRlhfQk9PTCBiQmlnKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9XU1RSIHdzQ2FwdGlvbikgPSAwOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJU2V0Qm9yZGVyUmVnaW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUGF0aCAqcFBhdGgpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldFRyYW5zcGFyZW50KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd0FscGhhKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTaG93V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBIaWRlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXROb3JtYWwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldE1heGltaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRNaW5pbWl6ZShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tNZXNzYWdlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgSXNJZGxlTWVzc2FnZSgpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIERpc3BhdGNoTWVzc2FnZSgpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QpID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSIEV4aXQoRlhfSU5UMzIgaUV4aXRDb2RlKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBDcmVhdGVXaWRnZXRXaXRoTmF0aXZlSWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQVk9JRCBVc2VyRGF0YSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0REMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQVk9JRCAmcERDKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiBSZWxlYXNlV2lkZ2V0REMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQVk9JRCBwREMsIENGWF9SZWN0RiAqcENsaXAgPSAwKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lEIEdldFdpbmRvdyhJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0RXT1JEIEdldEtleVN0YXRlKEZYX0RXT1JEIGR3VmlydEtleSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgIFJ1bkxvb3AoSUZXTF9XaWRnZXQgKndpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgIEVuZExvb3AoKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiAgSW5pdE1lbnUoSUZXTF9NZW51ICpwTWVudSwgSUZXTF9NZW51RFAgKnBNZW51RGF0YSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgIFVwZGF0ZU1lbnUoSUZXTF9NZW51ICpwTWVudSwgRlhfTFBDVk9JRCBoSXRlbSwgRlhfSU5UMzIgaVR5cGUpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMiBUcmFja1BvcHVwTWVudShJRldMX01lbnUgKnBNZW51LCBJRldMX01lbnVEUCAqcE1lbnVEYXRhKSA9IDA7DQorICAgIHZpcnR1YWwJRldMX0VSUiAgU2V0TWVzc2FnZUhvb2soSUZXTF9BZGFwdGVyTWVzc2FnZUhvb2sgKmhvb2spID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSICBHZXRTeXN0ZW1Cb3JkZXIoRlhfRkxPQVQgJmwsIEZYX0ZMT0FUICZ0LCBGWF9GTE9BVCAmciwgRlhfRkxPQVQgJmIpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCSBHZXRQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfc2RhZGFwdGVyaW1wLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfc2RhZGFwdGVyaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiMmVjYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9TREFQQVRFUl9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9TREFQQVRFUl9JTVBfSA0KK2NsYXNzIElGV0xfQWRhcHRlck5hdGl2ZTsNCitjbGFzcyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyVGhyZWFkTWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyOw0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9TREFkYXRwZXJOYXRpdmU7DQorY2xhc3MgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I7DQorY2xhc3MgQ0ZXTF9TREFkYXB0ZXJUaW1lck1ncjsNCitjbGFzcyBDRldMX1NEQWRhcHRlcldpZGdldE1nciA6IHB1YmxpYyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3IoKTsNCisgICAgfkNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBDcmVhdGVXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIElGV0xfV2lkZ2V0ICpwUGFyZW50ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBEZXN0cm95V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRQb3NpdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldFBhcmVudFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgSUZXTF9XaWRnZXQgKnBQYXJlbnQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2hvd1dpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBIaWRlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldE5vcm1hbChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRNYXhpbWl6ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRNaW5pbWl6ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBSdW5XaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgUmVwYWludFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCk7DQorICAgIHZpcnR1YWwJRldMX0VSUiBFeGl0KEZYX0lOVDMyIGlFeGl0Q29kZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBDcmVhdGVXaWRnZXRXaXRoTmF0aXZlSWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIHZvaWQgKnZwKTsNCisgICAgdmlydHVhbCBGWF9CT09MCUdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfV1NUUiB3c0NhcHRpb24pOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJU2V0Qm9yZGVyUmVnaW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUGF0aCAqcFBhdGgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3QWxwaGEpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBDaGVja01lc3NhZ2UoKTsNCisgICAgdmlydHVhbCBGWF9CT09MIElzSWRsZU1lc3NhZ2UoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIERpc3BhdGNoTWVzc2FnZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0REMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQVk9JRCAmcERDKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfTFBWT0lEIHBEQywgQ0ZYX1JlY3RGICpwQ2xpcCA9IDApOw0KKyAgICB2aXJ0dWFsIEZYX0xQVk9JRCBHZXRXaW5kb3coSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsCUZYX0RXT1JEIEdldEtleVN0YXRlKEZYX0RXT1JEIGR3VmlydEtleSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiAgUnVuTG9vcChJRldMX1dpZGdldCAqd2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSICBFbmRMb29wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiAgSW5pdE1lbnUoSUZXTF9NZW51ICpwTWVudSwgSUZXTF9NZW51RFAgKnBNZW51RGF0YSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiAgVXBkYXRlTWVudShJRldMX01lbnUgKnBNZW51LCBGWF9MUENWT0lEIGhJdGVtLCBGWF9JTlQzMiBpVHlwZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIgVHJhY2tQb3B1cE1lbnUoSUZXTF9NZW51ICpwTWVudSwgSUZXTF9NZW51RFAgKnBNZW51RGF0YSk7DQorICAgIHZpcnR1YWwJRldMX0VSUiAgU2V0TWVzc2FnZUhvb2soSUZXTF9BZGFwdGVyTWVzc2FnZUhvb2sgKmhvb2spOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgIEdldFN5c3RlbUJvcmRlcihGWF9GTE9BVCAmbCwgRlhfRkxPQVQgJnQsIEZYX0ZMT0FUICZyLCBGWF9GTE9BVCAmYik7DQorfTsNCitjbGFzcyBDRldMX1NEQWRhcHRlclRocmVhZE1nciA6IHB1YmxpYyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3IoKTsNCisgICAgfkNGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKCk7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVN0YXJ0KElGV0xfVGhyZWFkICpwVGhyZWFkLCBGV0xfSFRIUkVBRCAmaFRocmVhZCwgRlhfQk9PTCBiU3VzcGVuZGVkID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVJlc3VtZShGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTdXNwZW5kKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUtpbGwoRldMX0hUSFJFQUQgaFRocmVhZCwgRlhfSU5UMzIgaUV4aXRDb2RlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTdG9wKEZXTF9IVEhSRUFEIGhUaHJlYWQsIEZYX0lOVDMyIGlFeGl0Q29kZSk7DQorICAgIHZpcnR1YWwgSUZXTF9UaHJlYWQqIEdldEN1cnJlbnRUaHJlYWQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNmU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0JBUkNPREVfSA0KKyNkZWZpbmUgX0ZXTF9CQVJDT0RFX0gNCisjaW5jbHVkZSAiZndsX2VkaXQuaCINCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9CYXJjb2RlRFA7DQorY2xhc3MgSUZXTF9CYXJjb2RlOw0KKyNkZWZpbmUgRldMX0NMQVNTX0JhcmNvZGUJCQkJTCJGV0xfQkFSQ09ERSINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfQmFyY29kZQkJCTM2Njg4Njk2OA0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9DSEFSRU5DT0RJTkcJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9NT0RVTEVIRUlHSFQJCSgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSAkJKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX0RBVEFMRU5HVEgJCQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfQ0FMQ0hFQ0tTVU0JCSgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9QUklOVENIRUNLU1VNCQkoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfVEVYVExPQ0FUSU9OCQkoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfV0lERU5BUlJPV1JBVElPCSgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVIJCQkoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfRU5EQ0hBUgkJCSgxTCA8PCA5KQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9WRVJTSU9OCQkJKDFMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9FQ0xFVkVMCQkJKDFMIDw8IDExKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9UUlVOQ0FURUQJCQkoMUwgPDwgMTIpDQorI2RlZmluZSBGV0xfUEFSVF9CQ0RfQm9yZGVyCQkJCTENCisjZGVmaW5lIEZXTF9QQVJUX0JDRF9FZGdlCQkJCTINCisjZGVmaW5lIEZXTF9QQVJUX0JDRF9CYWNrZ3JvdW5kCQkJMw0KKyNkZWZpbmUgRldMX0JDVVBEQVRFQ01EX0RhdGEJCQlGV0xfV0dUVVBEQVRFQ01EX1VzZXINCitjbGFzcyBJRldMX0JhcmNvZGVEUCA6IHB1YmxpYyBJRldMX0VkaXREUA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgQkNfQ0hBUl9FTkNPRElORwlHZXRDaGFyRW5jb2RpbmcoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRNb2R1bGVIZWlnaHQoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRNb2R1bGVXaWR0aCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldERhdGFMZW5ndGgoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRDYWxDaGVja3N1bSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUdldFByaW50Q2hlY2tzdW0oKSA9IDA7DQorICAgIHZpcnR1YWwgQkNfVEVYVF9MT0MJCQlHZXRUZXh0TG9jYXRpb24oKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRXaWRlTmFycm93UmF0aW8oKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQ0hBUgkJCQlHZXRTdGFydENoYXIoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQ0hBUgkJCQlHZXRFbmRDaGFyKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0VmVyc2lvbigpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0VHJ1bmNhdGVkKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJR2V0QmFyY29kZUF0dHJpYnV0ZU1hc2soKSA9IDA7DQorfTsNCitjbGFzcyBJRldMX0JhcmNvZGUgOiBwdWJsaWMgSUZXTF9FZGl0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGV0xfQmFyY29kZSogQ3JlYXRlKCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2b2lkCQlTZXRUeXBlKEJDX1RZUEUgdHlwZSk7DQorICAgIEZYX0JPT0wJCUlzUHJvdGVjdGVkVHlwZSgpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9CYXJjb2RlKCk7DQorICAgIHZpcnR1YWwgfklGV0xfQmFyY29kZSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NhcmV0LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2FyZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI5ZmNhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NhcmV0LmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0FSRVRfSA0KKyNkZWZpbmUgX0ZXTF9DQVJFVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfQ2FyZXQ7DQorI2RlZmluZSBGV0xfQ0xBU1NfQ2FyZXQJCQkJTCJGV0xfQ0FSRVQiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0NhcmV0CQkJNjcxMTgxODc5DQorI2RlZmluZSBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQJCQkxDQorI2RlZmluZSBGV0xfUEFSVF9DQVRfQmFja2dyb3VuZAkJCQkxDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NBVF9IaWdodExpZ2h0CQkxDQorY2xhc3MgSUZXTF9DYXJldCA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX0NhcmV0KiBDcmVhdGUoKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorDQorICAgIEZXTF9FUlIJCVNob3dDYXJldChGWF9CT09MIGJGbGFnID0gVFJVRSk7DQorICAgIEZXTF9FUlIJCUdldEZyZXF1ZW5jeShGWF9EV09SRCAmZWxhcHNlKTsNCisgICAgRldMX0VSUgkJU2V0RnJlcXVlbmN5KEZYX0RXT1JEIGVsYXBzZSk7DQorICAgIEZXTF9FUlIJCVNldENvbG9yKENGWF9Db2xvciBjckZpbGwpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9DYXJldCgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX0NhcmV0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2hlY2tib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNWFkNDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2hlY2tib3guaApAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DSEVDS0JPWF9IDQorI2RlZmluZSBfRldMX0NIRUNLQk9YX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9DaGVja0JveERQOw0KK2NsYXNzIElGV0xfQ2hlY2tCb3g7DQorI2RlZmluZSBGV0xfQ0xBU1NfQ2hlY2tCb3gJCQkJCUwiRldMX0NIRUNLQk9YIg0KKyNkZWZpbmUgRldMX0NMQVNTX1JhZGlvQnV0dG9uCQkJCUwiRldMX1JBRElPQlVUVE9OIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9DaGVja0JveAkJCQk0MTA3MTgzODIzDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uCQkJMzgxMTMwNDY5MQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9MZWZ0CQkJCSgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIJCQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0CQkJCSgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9Ub3AJCQkJKDBMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXIJCQkoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tCQkJCSgyTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9MZWZ0VGV4dAkJCSgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9NdWx0aUxpbmUJCQkoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlCQkJCSgxTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbgkJKDFMIDw8IDcpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRTcXVhcmUJKDBMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlCSgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkQ2lyY2xlCSgyTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlbkNpcmNsZQkoM0wgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2sJCSgwTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlCSgxTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ3Jvc3MJCSgyTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZAkoM0wgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVNxdWFyZQkoNEwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXIJCSg1TCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2sJCSgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzawkJKDNMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzawkJCSgzTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVNYXNrCQkoN0wgPDwgMTApDQorI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQJCQkJKDEgPDwgRldMX1dHVFNUQVRFX01BWCkNCisjZGVmaW5lIEZXTF9TVEFURV9DS0JfUHJlc3NlZAkJCQkoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDEpKQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NLQl9VbmNoZWNrZWQJCQkJKDAgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9TVEFURV9DS0JfQ2hlY2tlZAkJCQkoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NLQl9OZXV0cmFsCQkJCSgyIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpDQorI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzawkJCQkoM0wgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9Cb3JkZXIJCQkJCTENCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9FZGdlCQkJCQkyDQorI2RlZmluZSBGV0xfUEFSVF9DS0JfQmFja2dyb3VuZAkJCQkzDQorI2RlZmluZSBGV0xfUEFSVF9DS0JfQ2hlY2tCb3gJCQkJNA0KKyNkZWZpbmUgRldMX1BBUlRfQ0tCX0NhcHRpb24JCQkJNQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfTm9ybWFsCQkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkCQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkCQkJKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZAkJCSgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfVW5DaGVja2VkCQkJKDBMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkCQkJKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsCQkJKDJMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Gb2N1c2VkCQkJKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMQkJCQkoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syCQkJCSgzTCA8PCAyKQ0KKyNkZWZpbmUgRldMX0VWVF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQJCUwiRldMX0VWRU5UX0NLQl9DaGVja1N0YXRlQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NLQl9DaGVja1N0YXRlQ2hhbmdlZAkyNTAzMjUyOTYzDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENrYkNoZWNrU3RhdGVDaGFuZ2VkLCBGV0xfRVZUSEFTSF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQpDQorRU5EX0ZXTF9FVkVOVF9ERUYNCitjbGFzcyBJRldMX0NoZWNrQm94RFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEJveFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfQ2hlY2tCb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZXTF9DaGVja0JveCogQ3JlYXRlKCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGWF9JTlQzMglHZXRDaGVja1N0YXRlKCk7DQorICAgIEZXTF9FUlIJCVNldENoZWNrU3RhdGUoRlhfSU5UMzIgaUNoZWNrKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfQ2hlY2tCb3goKTsNCisgICAgdmlydHVhbCB+SUZXTF9DaGVja0JveCgpOw0KK307DQorY2xhc3MgSUZXTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX1JhZGlvQnV0dG9uKiBDcmVhdGUoKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZYX0lOVDMyCUdldENoZWNrU3RhdGUoKTsNCisgICAgRldMX0VSUgkJU2V0Q2hlY2tTdGF0ZShGWF9JTlQzMiBpQ2hlY2spOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9SYWRpb0J1dHRvbigpOw0KKyAgICB2aXJ0dWFsIH5JRldMX1JhZGlvQnV0dG9uKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDZiZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaApAQCAtMCwwICsxLDEzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ09NQk9CT1hfSA0KKyNkZWZpbmUgX0ZXTF9DT01CT0JPWF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfTGlzdEJveDsNCitjbGFzcyBJRldMX0NvbWJvQm94RFA7DQorY2xhc3MgSUZXTF9Db21ib0JveDsNCisjZGVmaW5lIEZXTF9DTEFTU19Db21ib0JveAkJCQkJTCJGV0xfQ09NQk9CT1giDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0NvbWJvQm94CQkJCTYwMjM1MzY5Nw0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9Ecm9wTGlzdAkJCSgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bgkJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9Tb3J0CQkJCSgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0RHJhZwkJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9Pd25lckRyYXcJCQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhOZWFyCQkJKDBMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyCQkoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhGYXIJCQkoMkwJPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZOZWFyCQkJKDBMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQ2VudGVyCQkoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXIJCQkoMkwJPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEp1c3RpZmllZAkJKDFMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXREaXN0cmlidXRlZAkoMkwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhBbGlnbk1hc2sJCSgzTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkFsaWduTWFzawkJKDNMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQWxpZ25Nb2RlTWFzawkoM0wgPDwgOCkNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1MZWZ0QWxpZ24JCSgwTCA8PCAxMCkNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1DZW50ZXJBbGlnbgkoMUwgPDwgMTApDQorI2RlZmluZQlGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtUmlnaHRBbGlnbgkJKDJMIDw8IDEwKQ0KKyNkZWZpbmUJRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbVRleHQgICAgICAgICAgICgwTCA8PCAxMikNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1JY29uVGV4dAkJKDFMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUFsaWduTWFzawkJKDNMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9SZWFkT25seQkJCQkoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfUEFSVF9DTUJfQm9yZGVyCQkJCQkxDQorI2RlZmluZSBGV0xfUEFSVF9DTUJfRWRnZQkJCQkJMg0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX0JhY2tncm91bmQJCQkJMw0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX0Ryb3BEb3duQnV0dG9uCQkJNA0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX0NhcHRpb24JCQkJNQ0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX1N0cmV0Y2dIYW5kbGVyCQkJNg0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsCQkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkCQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NNQl9QcmVzc2VkCQkJKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NNQl9EaXNhYmxlZAkJCSgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfU2VsZWN0ZWQJCQkoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9DTUJfQ29tYm9Gb3JtSGFuZGxlcgkoRldMX1dHVENBUEFDSVRZX01BWCArIDcpDQorZW51bSBGV0xfQ01CX1RFWFRDSEFOR0VEIHsNCisgICAgRldMX0NNQl9URVhUQ0hBTkdFRF9JbnNlcnQJPSAwCSwNCisgICAgRldMX0NNQl9URVhUQ0hBTkdFRF9EZWxldGUJCSwNCisgICAgRldMX0NNQl9URVhUQ0hBTkdFRF9SZXBsYWNlCQksDQorfTsNCisjZGVmaW5lIEZXTF9FVlRfQ01CX0Ryb3BEb3duCQkJCUwiRldMX0VWRU5UX0NNQl9QcmVEcm9wRG93biINCisjZGVmaW5lIEZXTF9FVlRfQ01CX1Bvc3REcm9wRG93bgkJCUwiRldMX0VWRU5UX0NNQl9Qb3N0RHJvcERvd24iDQorI2RlZmluZSBGV0xfRVZUX0NNQl9DbG9zZVVwCQkJCQlMIkZXTF9FVkVOVF9DTUJfQ2xvc2VVcCINCisjZGVmaW5lIEZXTF9FVlRfQ01CX0VkaXRDaGFuZ2VkCQkJCUwiRldMX0VWRU5UX0NNQl9FZGl0Q2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfQ01CX1NlbENoYW5nZWQJCQkJTCJGV0xfRVZFTlRfQ01CX1NlbENoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUX0NNQl9Ib3ZlckNoYW5nZWQJCQlMIkZXTF9FVkVOVF9DTUJfSG92ZXJDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVF9DTUJfRHJhd0l0ZW0JCQkJTCJGV0xfRVZFTlRfQ01CX0RyYXdJdGVtIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1ByZURyb3BEb3duCQkJMTM1NzY0Njc5OA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1Bvc3REcm9wRG93bgkJMzY3NzAxMDI4NQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0Nsb3NlVXAJCQkJMjg3MTI3MTE5MA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkCQkJMTUyNzAzNDc2Mg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1NlbENoYW5nZWQJCQkyOTIzMjI3Nzg0DQorI2RlZmluZSBGV0xfRVZUSEFTSF9DTUJfSG92ZXJDaGFuZ2VkCQk5NDQzMjU0NDgNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9EcmF3SXRlbQkJCTkxNzM1NDU1MQ0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biwgRldMX0VWVEhBU0hfQ01CX1ByZURyb3BEb3duKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYlBvc3REcm9wRG93biwgRldMX0VWVEhBU0hfQ01CX1Bvc3REcm9wRG93bikNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJDbG9zZVVwLCBGV0xfRVZUSEFTSF9DTUJfQ2xvc2VVcCkNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJFZGl0Q2hhbmdlZCwgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkKQ0KK0ZYX0lOVDMyIG5DaGFuZ2VUeXBlOw0KK0NGWF9XaWRlU3RyaW5nIHdzSW5zZXJ0Ow0KK0NGWF9XaWRlU3RyaW5nIHdzRGVsZXRlOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYlNlbENoYW5nZWQsIEZXTF9FVlRIQVNIX0NNQl9TZWxDaGFuZ2VkKQ0KK0NGWF9JbnQzMkFycmF5IGlBcnJheVNlbHM7DQorRlhfQk9PTAliTEJ1dHRvblVwOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYkhvdmVyQ2hhbmdlZCwgRldMX0VWVEhBU0hfQ01CX0hvdmVyQ2hhbmdlZCkNCitGWF9JTlQzMiBtX2lDdXJIb3ZlcjsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJEcmF3SXRlbSwgRldMX0VWVEhBU0hfQ01CX0RyYXdJdGVtKQ0KK0NGWF9HcmFwaGljcyAqbV9wR3JhcGhpY3M7DQorQ0ZYX01hdHJpeCBtX21hdHJpeDsNCitGWF9JTlQzMiBtX2luZGV4Ow0KK0NGWF9SZWN0RiBtX3J0SXRlbTsNCitFTkRfRldMX0VWRU5UX0RFRg0KK2NsYXNzIElGV0xfQ29tYm9Cb3hEUCA6IHB1YmxpYyBJRldMX0xpc3RCb3hEUA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfQ29tYm9Cb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZXTF9Db21ib0JveCogQ3JlYXRlKCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGWF9JTlQzMglHZXRDdXJTZWwoKTsNCisgICAgRldMX0VSUgkJU2V0Q3VyU2VsKEZYX0lOVDMyIGlTZWwpOw0KKyAgICBGV0xfRVJSCQlTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgRlhfSU5UMzIJR2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdDsNCisgICAgRldMX0VSUgkJR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgblN0YXJ0ID0gMCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgICBGV0xfRVJSCQlTZXRFZGl0U2VsUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgPSAtMSk7DQorICAgIEZYX0lOVDMyCUdldEVkaXRTZWxSYW5nZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyICZuU3RhcnQpOw0KKyAgICBGWF9JTlQzMglHZXRFZGl0TGltaXQoKTsNCisgICAgRldMX0VSUgkJU2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIEZXTF9FUlIJCUVkaXREb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKTsNCisgICAgRlhfQk9PTAkJRWRpdFJlZG8oRlhfQlNUUiBic1JlY29yZCk7DQorICAgIEZYX0JPT0wJCUVkaXRVbmRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICBJRldMX0xpc3RCb3gqCUdldExpc3RCb3h0KCk7DQorICAgIEZYX0JPT0wJCUFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCisgICAgRlhfRVJSCQlPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgICAgRlhfQk9PTAkJRWRpdENhblVuZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdENhblJlZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdFVuZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdFJlZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdENhbkNvcHkoKTsNCisgICAgRlhfQk9PTAkJRWRpdENhbkN1dCgpOw0KKyAgICBGWF9CT09MCQlFZGl0Q2FuU2VsZWN0QWxsKCk7DQorICAgIEZYX0JPT0wJCUVkaXRDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KKyAgICBGWF9CT09MCQlFZGl0Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQorICAgIEZYX0JPT0wJCUVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQorICAgIEZYX0JPT0wJCUVkaXRTZWxlY3RBbGwoKTsNCisgICAgRlhfQk9PTAkJRWRpdERlbGV0ZSgpOw0KKyAgICBGWF9CT09MCQlFZGl0RGVTZWxlY3QoKTsNCisgICAgRldMX0VSUgkJR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICBGV0xfRVJSCQlFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX0NvbWJvQm94KCk7DQorICAgIHZpcnR1YWwgfklGV0xfQ29tYm9Cb3goKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4MjY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9EQVRFVElNRVBJQ0tFUl9IDQorI2RlZmluZSBfRldMX0RBVEVUSU1FUElDS0VSX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9EYXRlVGltZVBpY2tlckRQOw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXI7DQorI2RlZmluZSBGV0xfQ0xBU1NfRGF0ZVRpbWVQaWNrZXIJCQlMIkZXTF9EQVRFVElNRVBJQ0tFUiINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfRGF0ZVRpbWVQaWNrZXIJCTM4NTExNzYyNTcNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfQWxsb3dFZGl0CQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0xvbmdEYXRlRm9ybWF0CQkoMEwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0CSgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9UaW1lRm9ybWF0CQkJKDJMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX1NwaW4JCQkJKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRITmVhcgkJCSgwTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SENlbnRlcgkJKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyCQkJKDJMCTw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWTmVhcgkJCSgwTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkNlbnRlcgkJKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyCQkJKDJMCTw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQJCSgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0RGlzdHJpYnV0ZWQJKDJMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIQWxpZ25NYXNrCQkoM0wgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZBbGlnbk1hc2sJCSgzTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEFsaWduTW9kZU1hc2sJKDNMCTw8IDgpDQorI2RlZmluZSBGV0xfUEFSVF9EVFBfQm9yZGVyCQkJCQkxDQorI2RlZmluZSBGV0xfUEFSVF9EVFBfRWRnZQkJCQkJMg0KKyNkZWZpbmUgRldMX1BBUlRfRFRQX0JhY2tncm91bmQJCQkJMw0KKyNkZWZpbmUgRldMX1BBUlRfRFRQX0Ryb3BEb3duQnV0dG9uCQkJNA0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsCQkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkCQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0RUUF9QcmVzc2VkCQkJKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0RUUF9EaXNhYmxlZAkJCSgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0VWVF9EVFBfRHJvcERvd24JCQkJTCJGV0xfRVZFTlRfRFRQX0Ryb3BEb3duIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRFRQX0Ryb3BEb3duCQkJMjY0NzI4NzMzDQorI2RlZmluZSBGV0xfRVZUX0RUUF9DbG9zZVVwCQkJCQlMIkZXTF9FVkVOVF9EVFBfQ2xvc2VVcCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9DbG9zZVVwCQkJCTQyODA5NzM4MDMNCisjZGVmaW5lCUZXTF9FVlRfRFRQX0VkaXRDaGFuZ2VkCQkJCUwiRldMX0VWRU5UX0RUUF9FZGl0Q2hhbmdlZCINCisjZGVmaW5lCUZXTF9FVlRIQVNIX0RUUF9FZGl0Q2hhbmdlZAkJCTQwMDk2MTA5NDQNCisjZGVmaW5lIEZXTF9FVlRfRFRQX0hvdmVyQ2hhbmdlZAkJCUwiRldMX0VWRU5UX0RUUF9Ib3ZlckNoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9EVFBfSG92ZXJDaGFuZ2VkCQk2ODY2NzQ3NTANCisjZGVmaW5lIEZXTF9FVlRfRFRQX1NlbGVjdENoYW5nZWQJCQlMIkZXTF9FVkVOVF9EVFBfU2VsZWN0Q2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9TZWxlY3RDaGFuZ2VkCQkxNTg5NjE2ODU4DQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50X0R0cERyb3BEb3duLCBGV0xfRVZUSEFTSF9EVFBfRHJvcERvd24pDQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfRHRwQ2xvc2VVcCwgRldMX0VWVEhBU0hfRFRQX0Nsb3NlVXApDQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfRHRwRWRpdENoYW5nZWQsIEZXTF9FVlRIQVNIX0RUUF9FZGl0Q2hhbmdlZCkNCitDRlhfV2lkZVN0cmluZyBtX3dzVGV4dDsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdmVudF9EdHBIb3ZlckNoYW5nZWQsIEZXTF9FVlRIQVNIX0RUUF9Ib3ZlckNoYW5nZWQpDQorRlhfSU5UMzIgaG92ZXJkYXk7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfRHRwU2VsZWN0Q2hhbmdlZCwgRldMX0VWVEhBU0hfRFRQX1NlbGVjdENoYW5nZWQpDQorRlhfSU5UMzIgaVllYXI7DQorRlhfSU5UMzIgaU1vbnRoOw0KK0ZYX0lOVDMyIGlEYXk7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitjbGFzcyBJRldMX0RhdGVUaW1lUGlja2VyRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0VG9kYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyICZpWWVhciwgRlhfSU5UMzIgJmlNb250aCwgRlhfSU5UMzIgJmlEYXkpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXIgOiBwdWJsaWMgSUZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZXTF9EYXRlVGltZVBpY2tlciogQ3JlYXRlKCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlHZXRDdXJTZWwoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSk7DQorICAgIEZXTF9FUlIJCVNldEN1clNlbChGWF9JTlQzMiBpWWVhciwgRlhfSU5UMzIgaU1vbnRoLCBGWF9JTlQzMiBpRGF5KTsNCisgICAgRldMX0VSUgkJU2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIEZXTF9FUlIJCUdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5TdGFydCA9IDAsIEZYX0lOVDMyIG5Db3VudCA9IC0xKSBjb25zdDsNCisgICAgRlhfSU5UMzIJQ291bnRTZWxSYW5nZXMoKTsNCisgICAgRlhfSU5UMzIJR2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KTsNCisgICAgRlhfQk9PTAkJQ2FuVW5kbygpOw0KKyAgICBGWF9CT09MCQlDYW5SZWRvKCk7DQorICAgIEZYX0JPT0wJCVVuZG8oKTsNCisgICAgRlhfQk9PTAkJUmVkbygpOw0KKyAgICBGWF9CT09MCQlDYW5Db3B5KCk7DQorICAgIEZYX0JPT0wJCUNhbkN1dCgpOw0KKyAgICBGWF9CT09MCQlDYW5TZWxlY3RBbGwoKTsNCisgICAgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCisgICAgRlhfQk9PTAkJQ3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQorICAgIEZYX0JPT0wJCVBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCisgICAgRlhfQk9PTAkJU2VsZWN0QWxsKCk7DQorICAgIEZYX0JPT0wJCURlbGV0ZSgpOw0KKyAgICBGWF9CT09MCQlEZVNlbGVjdCgpOw0KKyAgICBGV0xfRVJSCQlHZXRCQm94KENGWF9SZWN0RiAmcmVjdCk7DQorICAgIEZXTF9FUlIJCVNldEVkaXRMaW1pdChGWF9JTlQzMiBuTGltaXQpOw0KKyAgICBGV0xfRVJSCQlNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX0RhdGVUaW1lUGlja2VyKCk7DQorICAgIHZpcnR1YWwgfklGV0xfRGF0ZVRpbWVQaWNrZXIoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9lZGl0LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmRlZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfZWRpdC5oCkBAIC0wLDAgKzEsMTY1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9FRElUX0gNCisjZGVmaW5lIF9GV0xfRURJVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfRWRpdERQOw0KK2NsYXNzIElGV0xfRWRpdDsNCisjZGVmaW5lIEZXTF9DTEFTU19FZGl0CQkJCQkJTCJGV0xfRURJVCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfRWRpdAkJCQkJMjg5Mzk4NzgyMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seQkJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUJCQkoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybgkJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9Ob0hpZGVTZWwJCQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGwJCSgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9BdXRvVlNjcm9sbAkJKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX05vUmVkb1VuZG8JCQkoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVmFsaWRhdGUJCQkoMUwgPDwgNykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQJCQkoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTnVtYmVyCQkJCSgxTCA8PCA5KQ0KKyNkZWZpbmUJRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uICAgICAgKDFMIDw8IDEwKQ0KKyNkZWZpbmUJRldMX1NUWUxFRVhUX0VEVF9WU2VsZkFkYXB0aW9uICAgICAgKDFMIDw8IDExKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WZXJ0aWNhbExheW91dAkJKDFMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WZXJ0aWNhbENoYXJzCQkoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1JldmVyc2VMaW5lCQkoMUwgPDwgMTQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0FyYWJpY1NoYXBlcwkJKDFMIDw8IDE1KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9FeHBhbmRUYWIJCQkoMUwgPDwgMTYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0CQkJKDFMIDw8IDE3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9ITmVhcgkJCQkoMEwgPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXIJCQkoMUwgPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0hGYXIJCQkJKDJMCTw8IDE4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WTmVhcgkJCQkoMEwgPDwgMjApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXIJCQkoMUwgPDwgMjApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZGYXIJCQkJKDJMIDw8IDIwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQJCQkoMUwgPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkCQkoMkwgPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0hBbGlnbk1hc2sJCQkoM0wJPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2sJCQkoM0wJPDwgMjApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0hBbGlnbk1vZGVNYXNrCQkoM0wJPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQJCQkoMUwJPDwgMjQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1Nob3dTY3JvbGxiYXJGb2N1cwkoMUwJPDwgMjUpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyCQkoMUwJPDwgMjYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0CQkoMUwgPDwgMjcpDQorI2RlZmluZSBGV0xfU1RBVEVfRURUX0VkaXRpbmcgICAgICAgICAgICAgICAoMSA8PCBGV0xfV0dUU1RBVEVfTUFYKQ0KKyNkZWZpbmUgRldMX1BBUlRfRURUX0JvcmRlcgkJCTENCisjZGVmaW5lIEZXTF9QQVJUX0VEVF9FZGdlCQkJMg0KKyNkZWZpbmUgRldMX1BBUlRfRURUX0JhY2tncm91bmQJCTMNCisjZGVmaW5lIEZXTF9QQVJUX0VEVF9Db21iVGV4dExpbmUJNA0KKyNkZWZpbmUgRldMX1BBUlREQVRBX0VEVF9CYWNrZ3JvdW5kCQkJMA0KKyNkZWZpbmUgRldMX1BBUlREQVRBX0VEVF9TdGF0aWNCYWNrZ3JvdW5kCTENCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRURUX05vcm1hbAkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0VEVF9SZWFkT25seQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0VEVF9EaXNhYmxlCQkoMkwgPDwgMCkNCitlbnVtIEZXTF9FRFRfVEVYVENIQU5HRUQgew0KKyAgICBGV0xfRURUX1RFWFRDSEFOR0VEX0luc2VydAk9IDAJLA0KKyAgICBGV0xfRURUX1RFWFRDSEFOR0VEX0RlbGV0ZQkJLA0KKyAgICBGV0xfRURUX1RFWFRDSEFOR0VEX1JlcGxhY2UJCSwNCit9Ow0KKyNkZWZpbmUgRldMX0VWVF9FRFRfQWRkRG9SZWNvcmQJCQkJCUwiRldMX0VWRU5UX0VEVF9BZGREb1JlY29yZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9BZGREb1JlY29yZAkJCQkzNzAxNjcyMjI0DQorI2RlZmluZSBGV0xfRVZUX0VEVF9UZXh0Q2hhbmdlZAkJCQkJTCJGV0xfRVZFTlRfRURUX1RleHRDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1RleHRDaGFuZ2VkCQkJCTEwNjQwMjIxMzINCisjZGVmaW5lIEZXTF9FVlRfRURUX1ByZVNlbGZBZGFwdGlvbgkJCQlMIkZXTF9FVkVOVF9QcmVTZWxmQWRhcHRpb24iDQorI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfUHJlU2VsZkFkYXB0aW9uCQkJMTAwMTk3OTE3OA0KKyNkZWZpbmUgRldMX0VWVF9FRFRfVmFsaWRhdGUJCQkJCUwiRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlCQkJCTMzNzMzMDg2MDgNCisjZGVmaW5lIEZXTF9FVlRfRURUX0NoZWNrV29yZAkJCQkJTCJGV0xfRVZUSEFTSF9FRFRfQ2hlY2tXb3JkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX0NoZWNrV29yZAkJCQkyODk3MTgxNTIwDQorI2RlZmluZSBGV0xfRVZUX0VEVF9HZXRTdWdnZXN0V29yZHMJCQkJTCJGV0xfRVZUSEFTSF9FRFRfR2V0U3VnZ2VzdFdvcmRzIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX0dldFN1Z2dlc3RXb3JkcwkJCTMxNTc4Mjc5MQ0KKyNkZWZpbmUgRldMX0VWVF9FRFRfVGV4dEZ1bGwJCQkJCUwiRldMX0VWVEhBU0hfRURUX1RleHRGdWxsIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1RleHRGdWxsCQkJCTIxNTg1ODAxNzQNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0QWRkRG9SZWNvcmQsIEZXTF9FVlRIQVNIX0VEVF9BZGREb1JlY29yZCkNCitDRlhfQnl0ZVN0cmluZyBtX3dzRG9SZWNvcmQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQsIEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZCkNCitGWF9JTlQzMiBuQ2hhbmdlVHlwZTsNCitDRlhfV2lkZVN0cmluZyB3c0luc2VydDsNCitDRlhfV2lkZVN0cmluZyB3c0RlbGV0ZTsNCitDRlhfV2lkZVN0cmluZyB3c1ByZXZUZXh0Ow0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEVkdFRleHRGdWxsLCBGV0xfRVZUSEFTSF9FRFRfVGV4dEZ1bGwpDQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0UHJlU2VsZkFkYXB0aW9uLCBGV0xfRVZUSEFTSF9FRFRfUHJlU2VsZkFkYXB0aW9uKQ0KK0ZYX0JPT0wgYkhTZWxmQWRhcHRpb247DQorRlhfQk9PTCBiVlNlbGZBZGFwdGlvbjsNCitDRlhfUmVjdEYgcnRBZnRlckNoYW5nZTsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRFZHRWYWxpZGF0ZSwgRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlKQ0KK0lGV0xfV2lkZ2V0KiBwRHN0V2lkZ2V0Ow0KK0NGWF9XaWRlU3RyaW5nIHdzSW5zZXJ0Ow0KK0ZYX0JPT0wJYlZhbGlkYXRlOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEVkdENoZWNrV29yZCwgRldMX0VWVEhBU0hfRURUX0NoZWNrV29yZCkNCitDRlhfQnl0ZVN0cmluZyBic1dvcmQ7DQorRlhfQk9PTCBiQ2hlY2tXb3JkOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEVkdEdldFN1Z2dlc3RXb3JkcywgRldMX0VWVEhBU0hfRURUX0dldFN1Z2dlc3RXb3JkcykNCitGWF9CT09MIGJTdWdnZXN0V29yZHM7DQorQ0ZYX0J5dGVTdHJpbmcgYnNXb3JkOw0KK0NGWF9CeXRlU3RyaW5nQXJyYXkgYnNBcnJheVN1Z2dlc3RXb3JkczsNCitFTkRfRldMX0VWRU5UX0RFRg0KK2NsYXNzIElGV0xfRWRpdERQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQorew0KK307DQorI2RlZmluZSBGV0xfRURUX0ZJTkRfRkxBR1NfUHJldgkJCSgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0VEVF9GSU5EX0ZMQUdTX05leHQJCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9FRFRfRklORF9GTEFHU19XaG9sZVdvcmQJKDFMIDw8IDEpDQorI2RlZmluZSBGV0xfRURUX0ZJTkRfRkxBR1NfTm9DYXNlCQkoMUwgPDwgMikNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hFRFRGSU5EIHsNCisgICAgRlhfTFBWT0lEIHBEYXRhOw0KK30qIEZXTF9IRURURklORDsNCitjbGFzcyBJRldMX0VkaXQgOiBwdWJsaWMgSUZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZXTF9FZGl0KiBDcmVhdGUoKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIEZYX0lOVDMyCUdldFRleHRMZW5ndGgoKSBjb25zdDsNCisgICAgRldMX0VSUgkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQgPSAwLCBGWF9JTlQzMiBuQ291bnQgPSAtMSkgY29uc3Q7DQorICAgIEZXTF9FUlIJCUNsZWFyVGV4dCgpOw0KKyAgICBGWF9JTlQzMglHZXRDYXJldFBvcygpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMglTZXRDYXJldFBvcyhGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpOw0KKyAgICBGV0xfRVJSCQlBZGRTZWxSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCA9IC0xKTsNCisgICAgRlhfSU5UMzIJQ291bnRTZWxSYW5nZXMoKTsNCisgICAgRlhfSU5UMzIJR2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KTsNCisgICAgRldMX0VSUgkJQ2xlYXJTZWxlY3Rpb25zKCk7DQorICAgIEZYX0lOVDMyCUdldExpbWl0KCk7DQorICAgIEZXTF9FUlIJCVNldExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIEZXTF9FUlIJCVNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KKyAgICBGV0xfRVJSCQlTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0KTsNCisgICAgRldMX0VSUiBJbnNlcnQoRlhfSU5UMzIgblN0YXJ0LCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbik7DQorICAgIEZXTF9FUlIgRGVsZXRlU2VsZWN0aW9ucygpOw0KKyAgICBGV0xfRVJSIERlbGV0ZVJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpOw0KKyAgICBGV0xfRVJSIFJlcGxhY2VTZWxlY3Rpb25zKGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZXBsYWNlKTsNCisgICAgRldMX0VSUiBSZXBsYWNlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkxlbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KKyAgICBGV0xfRVJSCURvQ2xpcGJvYXJkKEZYX0lOVDMyIGlDbWQpOw0KKyAgICBGWF9CT09MCUNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSk7DQorICAgIEZYX0JPT0wJQ3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQorICAgIEZYX0JPT0wJUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpOw0KKyAgICBGWF9CT09MCURlbGV0ZSgpOw0KKyAgICBGWF9CT09MCVJlZG8oRlhfQlNUUiBic1JlY29yZCk7DQorICAgIEZYX0JPT0wJVW5kbyhGWF9CU1RSIGJzUmVjb3JkKTsNCisgICAgRlhfQk9PTAlVbmRvKCk7DQorICAgIEZYX0JPT0wJUmVkbygpOw0KKyAgICBGWF9CT09MCUNhblVuZG8oKTsNCisgICAgRlhfQk9PTAlDYW5SZWRvKCk7DQorICAgIEZXTF9FUlIgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCk7DQorICAgIEZXTF9FUlIJU2V0T3V0ZXIoSUZXTF9XaWRnZXQgKnBPdXRlcik7DQorICAgIEZXTF9FUlIJU2V0TnVtYmVyUmFuZ2UoRlhfSU5UMzIgaU1pbiwgRlhfSU5UMzIgaU1heCk7DQorICAgIEZXTF9FUlIgU2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpOw0KKyAgICBGV0xfRVJSIFNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9udCwgRlhfRkxPQVQgZlNpemUpOw0KKyAgICB2b2lkCVNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsNCisgICAgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCisgICAgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsIEZYX0JTVFIgYnNSZXBsYWNlKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfRWRpdCgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX0VkaXQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbGlzdGJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmYyNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbGlzdGJveC5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9MSVNUQk9YX0gNCisjZGVmaW5lIF9GV0xfTElTVEJPWF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfTGlzdEJveERQOw0KK2NsYXNzIElGV0xfTGlzdEJveDsNCisjZGVmaW5lIEZXTF9DTEFTU19MaXN0Qm94CQkJTCJGV0xfTElTVEJPWCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfTGlzdEJveAkJMTc3NzM1ODMxNw0KKyNkZWZpbmUJRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbgkJCSgxTCA8PCAwKQ0KKyNkZWZpbmUJRldMX1NUWUxFRVhUX0xUQl9Tb3J0CQkJCQkoMUwgPDwgMSkNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckFsYXdheXMJKDFMIDw8IDIpDQorI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX011bHRpQ29sdW1uCQkJKDFMIDw8IDMpDQorI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbgkJCQkoMEwgPDwgNCkNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ24JCQkoMUwgPDwgNCkNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbgkJCQkoMkwgPDwgNCkNCisjZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfTXVsdGlMaW5lCQkJCSgxTCA8PCA2KQ0KKyNkZWZpbmUJRldMX1NUWUxFRVhUX0xUQl9Pd25lckRyYXcJCQkJKDFMIDw8IDcpDQorI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX0ljb24gICAgICAgICAgICAgICAgICAgKDFMIDw8IDgpDQorI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX0NoZWNrICAgICAgICAgICAgICAgICAgKDFMIDw8IDkpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX0FsaWduTWFzawkJCQkoM0wgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzCQkoMUwgPDwgMTApDQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZAkJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZAkJCSgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfQ2hlY2tlZAkJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0JvcmRlcgkJCQkJMQ0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0VkZ2UJCQkJCTINCisjZGVmaW5lIEZXTF9QQVJUX0xUQl9CYWNrZ3JvdW5kCQkJCTMNCisjZGVmaW5lIEZXTF9QQVJUX0xUQl9MaXN0SXRlbQkJCQk0DQorI2RlZmluZSBGV0xfUEFSVF9MVEJfQ2hlY2sgICAJCQkJNQ0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0ljb24gICAJCQkJNg0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfTm9ybWFsCQkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9TZWxlY3RlZAkJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfRGlzYWJsZWQJCQkoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX0ZvY3VzZWQJCQkoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZAkJCSgwTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfQ2hlY2tlZAkJCSgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfTWFzawkJCQkoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0xUQl9JdGVtCQkJCUZXTF9XR1RISVRURVNUX01BWCArIDENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0xUQl9IU2Nyb2xsQmFyCQlGV0xfV0dUSElUVEVTVF9NQVggKyAyDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9MVEJfVlNjcm9sbEJhcgkJRldMX1dHVEhJVFRFU1RfTUFYICsgMw0KKyNkZWZpbmUgRldMX0VWVF9MVEJfU2VsQ2hhbmdlZAkJCQlMIkZXTF9FVkVOVF9MVEJfU2VsQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfTFRCX0RyYXdJdGVtCQkJCUwiRldMX0VWRU5UX0xUQl9EcmF3SXRlbSINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkCQkJMTcwMTc4MTY4OA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfTFRCX0RyYXdJdGVtCQkJMTA1MDg1Mzk5MQ0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRMdGJTZWxDaGFuZ2VkLCBGV0xfRVZUSEFTSF9MVEJfU2VsQ2hhbmdlZCkNCitDRlhfSW50MzJBcnJheSBpYXJyYXlTZWxzOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEx0YkRyYXdJdGVtLCBGV0xfRVZUSEFTSF9MVEJfRHJhd0l0ZW0pDQorQ0ZYX0dyYXBoaWNzICptX3BHcmFwaGljczsNCitDRlhfTWF0cml4IG1fbWF0cml4Ow0KK0ZYX0lOVDMyIG1faW5kZXg7DQorQ0ZYX1JlY3RGIG1fcmVjdDsNCitFTkRfRldMX0VWRU5UX0RFRg0KK3R5cGVkZWYgc3RydWN0IF9GV0xfSExJU1RJVEVNIHsNCisgICAgRlhfTFBWT0lEIHBEYXRhOw0KK30qIEZXTF9ITElTVElURU07DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9MaXN0Qm94SXRlbURhdGEgew0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGFQcm92aWRlcjsNCisgICAgRlhfSU5UMzIgaUluZGV4Ow0KK30gRldMX0xpc3RCb3hJdGVtRGF0YTsNCitjbGFzcyBJRldMX0xpc3RCb3hEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwJRlhfSU5UMzIJCQlDb3VudEl0ZW1zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwJRldMX0hMSVNUSVRFTQkJR2V0SXRlbShJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgbkluZGV4KSA9IDA7DQorICAgIHZpcnR1YWwJRlhfSU5UMzIJCQlHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEl0ZW1JbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfSU5UMzIgbkluZGV4KSA9IDA7DQorICAgIHZpcnR1YWwJRlhfRFdPUkQJCQlHZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKSA9IDA7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJCQlHZXRJdGVtVGV4dChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJR2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiAmcnRJdGVtKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lECQkJR2V0SXRlbURhdGEoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSCQkJCVNldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3U3R5bGUpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9MUENXU1RSIHBzelRleHQpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldEl0ZW1SZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0SXRlbUhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJCUdldEl0ZW1JY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlHZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYmIHJ0Q2hlY2spID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiYgcnRDaGVjaykgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0RXT1JECQkJR2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSCQkJCVNldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd0NoZWNrU3RhdGUpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfTGlzdEJveENvbXBhcmUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyIENvbXBhcmUoRldMX0hMSVNUSVRFTSBoTGVmdCwgRldMX0hMSVNUSVRFTSBoUmlnaHQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfTGlzdEJveCA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX0xpc3RCb3gqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGWF9JTlQzMgkJQ291bnRTZWxJdGVtcygpOw0KKyAgICBGV0xfSExJU1RJVEVNCUdldFNlbEl0ZW0oRlhfSU5UMzIgbkluZGV4U2VsKTsNCisgICAgRlhfSU5UMzIJCUdldFNlbEluZGV4KEZYX0lOVDMyIG5JbmRleCk7DQorICAgIEZXTF9FUlIJCQlTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCA9IFRSVUUpOw0KKyAgICBGV0xfRVJSCQkJR2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIEZXTF9FUlIJCQlHZXRTY3JvbGxQb3MoRlhfRkxPQVQgJmZQb3MsIEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCisgICAgRldMX0VSUioJCVNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX0xpc3RCb3goKTsNCisgICAgdmlydHVhbCB+SUZXTF9MaXN0Qm94KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbWVudS5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21lbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYyNzQzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21lbnUuaApAQCAtMCwwICsxLDE1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9NRU5VX0gNCisjZGVmaW5lIF9GV0xfTUVOVV9IDQorI2RlZmluZSBGV0xfQ0xBU1NfTWVudQkJCQkJCUwiRldMX01FTlUiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX01lbnUJCQkJCTM5NTc5NDk2NTUNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9NTlVfSG9yegkJCQkoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9NTlVfVmVydAkJCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9NTlVfRG9jawkJCQkoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9NTlVfT3duZXJEcmF3CQkJKDFMIDw8IDIpDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkOGY4YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX01PTlRIQ0FMRU5EQVJfSA0KKyNkZWZpbmUgX0ZXTF9NT05USENBTEVOREFSX0gNCitjbGFzcyBJRldMX01vbnRoQ2FsZW5kYXJEUDsNCitjbGFzcyBJRldMX01vbnRoQ2FsZW5kYXI7DQorI2RlZmluZSBGV0xfQ0xBU1NfTW9udGhDYWxlbmRhcgkJCUwiRldMX01PTlRIQ0FMRU5EQVIiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXIJCTI3MzM5MzEzNzQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5CQkJKDFMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXlDaXJjbGUJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01DRF9XZWVrTnVtYmVycwkJKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRICQkJMTINCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfSGVpZ2h0CQkxMw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fV0lEVEgJCTE0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQJMTUNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hNQVJHSU4JMTYNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1ZNQVJHSU4JMTcNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUCQkxOA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUCTE5DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfSE1BUkdJTgkyMA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX1ZNQVJHSU4JMjENCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX1dJRFRICQkJMjINCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVAkJCTIzDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVlNFUF9XSURUSAkJCTI0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVlNFUF9IRUlHSFQJCSAgICAyNQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fV0lEVEgJCTI2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQJCQk0MA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1NFUF9YCQkJCTI3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX1kJCQkJMjgNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVAkJMjkNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX1dJRFRICQkJMzANCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVAkJCTMxDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSAkJMzINCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVAkzMw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX1dJREhUCQkJMzQNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQJCQkzNQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQJCTM2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0lEVEgJCQkJMzcNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUlHSFQJCQkJMzgNCisjZGVmaW5lIEZXTF9JVEVNU1RBVEVfTUNEX05vbWFsCQkJCSgwTCA8PCAwKQ0KKyNkZWZpbmUJRldMX0lURU1TVEFURV9NQ0RfRmxhZwkJCQkoMUwgPDwgMCkNCisjZGVmaW5lCUZXTF9JVEVNU1RBVEVfTUNEX1NlbGVjdGVkCQkJKDFMIDw8IDEpDQorI2RlZmluZQlGV0xfSVRFTVNUQVRFX01DRF9Gb2N1c2VkCQkJKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfQm9yZGVyCQkJCTENCisjZGVmaW5lIEZXTF9QQVJUX01DRF9FZGdlCQkJCTINCisjZGVmaW5lIEZXTF9QQVJUX01DRF9CYWNrZ3JvdW5kCQkJMw0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0xCdG4JCQkJNA0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX1JCdG4JCQkJNQ0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0hTZXBhcmF0b3IJCQk2DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfVlNlcGFyYXRvcgkJCTcNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9Ub2RheUNpcmNsZQkJOA0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0RhdGVJbkNpcmNsZQkJOQ0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0RhdGVJbkJLCQkgICAgMTANCisjZGVmaW5lIEZXTF9QQVJUX01DRF9DYXB0aW9uCQkJOQ0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0RhdGVzSW4JCQkxMA0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0RhdGVzT3V0CQkJMTENCisjZGVmaW5lIEZXTF9QQVJUX01DRF9XZWVrCQkJCTEyDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfVG9kYXkJCQkJMTMNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9IZWFkZXIJCQkJMTQNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9XZWVrTnVtCQkJMTUNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9XZWVrTnVtU2VwCQkJMTYNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbAkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQJCSgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfU2VsZWN0ZWQJCSgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfTFNlbGVjdGVkCQkoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX1JTZWxlY3RlZAkJKDJMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9GbGFnZ2VkCQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0ZvY3VzZWQJCSgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfU3VuCQkJRldMX1dHVENBUEFDSVRZX01BWCArIDUNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX01vbgkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyA2DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9UdWUJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNw0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfV2VkCQkJRldMX1dHVENBUEFDSVRZX01BWCArIDgNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1RodQkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyA5DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9GcmkJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTANCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1NhdAkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxMQ0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfSmFudWFyeQkJRldMX1dHVENBUEFDSVRZX01BWCArIDEyDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9GZWJydWFyeQkJRldMX1dHVENBUEFDSVRZX01BWCArIDEzDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9NYXJjaAkJRldMX1dHVENBUEFDSVRZX01BWCArIDE0DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9BcHJpbAkJRldMX1dHVENBUEFDSVRZX01BWCArIDE1DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9NYXkJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTYNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0p1bmUJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTcNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0p1bHkJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTgNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0F1Z3VzdAkJRldMX1dHVENBUEFDSVRZX01BWCArIDE5DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9TZXB0ZW1iZXIJRldMX1dHVENBUEFDSVRZX01BWCArIDIwDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9PY3RvYmVyCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjENCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX05vdmVtYmVyCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjINCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0RlY2VtYmVyCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjMNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1RvZGF5CQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjQNCisjZGVmaW5lIEZXTF9FVkVOVF9NQ0RfREFURVNFTEVDVEVEICAgICAgICAgICAgTCJGV0xfRVZFTlRfTUNEX0RhdGVTZWxlY3RlZCINCisjZGVmaW5lIEZXTF9FVlRfTUNEX0RhdGVDaGFuZ2VkCQkJCSAgTCJGV0xfRVZFTlRfTUNEX0RhdGVDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX05PVEVIQVNIX01DRF9EQVRBU0VMRUNURUQgICAgICAgICAxMDg1NTk2OTMyDQorI2RlZmluZSBGV0xfRVZUSEFTSF9NQ0RfRGF0ZUNoYW5nZWQJCQkgIDU0MjEyMjI3DQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50X01jZERhdGVTZWxlY3RlZCwgRldMX05PVEVIQVNIX01DRF9EQVRBU0VMRUNURUQpDQorRlhfSU5UMzIgbV9pU3RhcnREYXk7DQorRlhfSU5UMzIgbV9pRW5kRGF5Ow0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50TWNkRGF0ZUNoYW5nZWQsIEZXTF9FVlRIQVNIX01DRF9EYXRlQ2hhbmdlZCkNCitGWF9JTlQzMiBtX2lPbGRZZWFyOw0KK0ZYX0lOVDMyIG1faU9sZE1vbnRoOw0KK0ZYX0lOVDMyIG1faVN0YXJ0RGF5Ow0KK0ZYX0lOVDMyIG1faUVuZERheTsNCitFTkRfRldMX0VWRU5UX0RFRg0KK2NsYXNzIElGV0xfTW9udGhDYWxlbmRhckRQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9JTlQzMiAgICAJR2V0Q3VyRGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEN1ck1vbnRoKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEN1clllYXIoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfTW9udGhDYWxlbmRhciA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX01vbnRoQ2FsZW5kYXIqIENyZWF0ZSgpOw0KKw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRlhfSU5UMzIJQ291bnRTZWxlY3QoKTsNCisgICAgRlhfQk9PTAkJR2V0U2VsZWN0KEZYX0lOVDMyICZpWWVhciwgRlhfSU5UMzIgJmlNb250aCwgRlhfSU5UMzIgJmlEYXksIEZYX0lOVDMyIG5JbmRleCA9IDApOw0KKyAgICBGWF9CT09MCQlTZXRTZWxlY3QoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX01vbnRoQ2FsZW5kYXIoKTsNCisgICAgdmlydHVhbCB+SUZXTF9Nb250aENhbGVuZGFyKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcGljdHVyZWJveC5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTlmZDRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QSUNUVVJFQk9YX0gNCisjZGVmaW5lIF9GV0xfUElDVFVSRUJPWF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfUGljdHVyZUJveERQOw0KK2NsYXNzIElGV0xfUGljdHVyZUJveDsNCisjZGVmaW5lIEZXTF9DTEFTU19QaWN0dXJlQm94CQkJTCJGV0xfUElDVFVSRUJPWCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveAkJMjk3NDcyMTc0MQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9MZWZ0CQkJCTBMIDw8IDANCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfQ2VudGVyCQkJCTFMIDw8IDANCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfUmlnaHQJCQkJMkwgPDwgMA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Ub3AJCQkJMEwgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9WY2VudGVyCQkJMUwgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Cb3R0b20JCQkJMkwgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Ob3JtYWwJCQkJMEwgPDwgNA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9BdXRvU2l6ZQkJCTFMIDw8IDQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfU3RyZXRjaEltYWdlCQkyTCA8PCA0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1N0cmV0Y2hISW1hZ2UJCTNMIDw8IDQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfU3RyZXRjaFZJbWFnZQkJNEwgPDwgNA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9IQWxpZ25NYXNrCQkJM0wgPDwgMA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9WQWxpZ25NYXNrCQkJM0wgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9TdHJldGNoQWxpZ25NYXNrICAgN0wgPDwgNA0KKyNkZWZpbmUgRldMX1BBUlRfUFRCX0JvcmRlcgkJCQkxDQorI2RlZmluZSBGV0xfUEFSVF9QVEJfRWRnZQkJCQkyDQorI2RlZmluZSBGV0xfUEFSVF9QVEJfSW1hZ2UJCQkJMw0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QVEJfTm9ybWFsCQkoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFRCX0Rpc2FibGVkCQkoMUwgPDwgMCkNCitjbGFzcyBJRldMX1BpY3R1cmVCb3hEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRFcnJvclBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEluaXRpYWxQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIgR2V0T3BhY2l0eShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyIEdldEZsaXBNb2RlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUiAgR2V0TWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfTWF0cml4ICZtYXRyaXgpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfUGljdHVyZUJveCA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX1BpY3R1cmVCb3gqIENyZWF0ZSgpOw0KKw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfUGljdHVyZUJveCgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX1BpY3R1cmVCb3goKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9wdXNoYnV0dG9uLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MDY4OWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BVU0hCVVRUT05fSA0KKyNkZWZpbmUgX0ZXTF9QVVNIQlVUVE9OX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9QdXNoQnV0dG9uRFA7DQorY2xhc3MgSUZXTF9QdXNoQnV0dG9uOw0KKyNkZWZpbmUgRldMX0NMQVNTX1B1c2hCdXR0b24JCUwiRldMX1BVU0hCVVRUT04iDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX1B1c2hCdXR0b24JMzUyMTYxNDI0NA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9MZWZ0CQkoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfQ2VudGVyCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfUmlnaHQJCSgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9Ub3AJCSgwTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9WQ2VudGVyCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9Cb3R0b20JCSgyTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9UZXh0T25seQkoMEwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfSWNvbk9ubHkJKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1RleHRJY29uCSgyTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9ITGF5b3V0TWFzayAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfVkxheW91dE1hc2sgKDNMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX01vZGVNYXNrCSAoM0wgPDwgNCkNCisjZGVmaW5lIEZXTF9TVEFURV9QU0JfSG92ZXJlZAkJKDEgPDwgRldMX1dHVFNUQVRFX01BWCkNCisjZGVmaW5lIEZXTF9TVEFURV9QU0JfUHJlc3NlZAkJKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAxKSkNCisjZGVmaW5lIEZXTF9TVEFURV9QU0JfRGVmYXVsdAkJKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9QU0JfTWFyZ2luCQkoRldMX1dHVENBUEFDSVRZX01BWCArIDEpDQorI2RlZmluZSBGV0xfUEFSVF9QU0JfQm9yZGVyCQkJMQ0KKyNkZWZpbmUgRldMX1BBUlRfUFNCX0VkZ2UJCQkyDQorI2RlZmluZSBGV0xfUEFSVF9QU0JfQmFja2dyb3VuZAkJMw0KKyNkZWZpbmUgRldMX1BBUlRfUFNCX0NhcHRpb24JCTQNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX05vcm1hbAkoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX1ByZXNzZWQJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9Ib3ZlcmVkCSgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfRGVmYXVsdAkoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX0Rpc2FibGVkCSg0TCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfRm9jdXNlZAkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX01hc2sJCSg3TCA8PCAwKQ0KK2NsYXNzIElGV0xfUHVzaEJ1dHRvbkRQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfUHVzaEJ1dHRvbiA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX1B1c2hCdXR0b24qIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfUHVzaEJ1dHRvbigpOw0KKyAgICB2aXJ0dWFsIH5JRldMX1B1c2hCdXR0b24oKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM3NmY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NDUk9MTEJBUl9IDQorI2RlZmluZSBfRldMX1NDUk9MTEJBUl9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfU2Nyb2xsQmFyRFA7DQorY2xhc3MgSUZXTF9TY3JvbGxCYXI7DQorI2RlZmluZSBGV0xfQ0xBU1NfU2Nyb2xsQmFyCQkJCUwiRldMX1NDUk9MTEJBUiINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfU2Nyb2xsQmFyCQkJMjgyNjU4NDg0NA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1NDQl9Ib3J6CQkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfU0NCX1ZlcnQJCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9Cb3JkZXIJCQkJMQ0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX0VkZ2UJCQkJMg0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX0JhY2tncm91bmQJCQkzDQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfRm9yZUFycm93CQkJNA0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX0JhY2tBcnJvdwkJCTUNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9UaHVtYgkJCQk2DQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfTG93ZXJUcmFjawkJCTcNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrCQkJOA0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsCQkoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZAkJKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZAkJKDNMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TQ0JfRm9yZUFycm93CUZXTF9XR1RISVRURVNUX01BWCArIDENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1NDQl9CYWNrQXJyb3cJRldMX1dHVEhJVFRFU1RfTUFYICsgMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX0xvd2VyVHJhY2sJRldMX1dHVEhJVFRFU1RfTUFYICsgMw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX1VwcGVyVHJhY2sJRldMX1dHVEhJVFRFU1RfTUFYICsgNA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX1RodW1iCQlGV0xfV0dUSElUVEVTVF9NQVggKyA1DQorI2RlZmluZSBGV0xfQ0FQQUNJVFlfU0NCX1NpemUJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYDQorZW51bSBGV0xfU0NCQ09ERSB7DQorICAgIEZXTF9TQ0JDT0RFX05vbmUJCQkgPSAxLA0KKyAgICBGV0xfU0NCQ09ERV9NaW4JCQkJCSwNCisgICAgRldMX1NDQkNPREVfTWF4CQkJCQksDQorICAgIEZXTF9TQ0JDT0RFX1BhZ2VCYWNrd2FyZAkJLA0KKyAgICBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZAkJCSwNCisgICAgRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkCQksDQorICAgIEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkCQkJLA0KKyAgICBGV0xfU0NCQ09ERV9Qb3MJCQkJCSwNCisgICAgRldMX1NDQkNPREVfVHJhY2tQb3MJCQksDQorICAgIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbAkJCSwNCit9Ow0KK2NsYXNzIElGV0xfU2Nyb2xsQmFyRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXINCit7DQorfTsNCitjbGFzcyBJRldMX1Njcm9sbEJhciA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX1Njcm9sbEJhciogQ3JlYXRlKCk7DQorDQorICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCQlJc1ZlcnRpY2FsKCk7DQorICAgIEZXTF9FUlIJCQlHZXRSYW5nZShGWF9GTE9BVCAmZk1pbiwgRlhfRkxPQVQgJmZNYXgpOw0KKyAgICBGV0xfRVJSCQkJU2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCk7DQorICAgIEZYX0ZMT0FUCQlHZXRQYWdlU2l6ZSgpOw0KKyAgICBGV0xfRVJSCQkJU2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKTsNCisgICAgRlhfRkxPQVQJCUdldFN0ZXBTaXplKCk7DQorICAgIEZXTF9FUlIJCQlTZXRTdGVwU2l6ZShGWF9GTE9BVCBmU3RlcFNpemUpOw0KKyAgICBGWF9GTE9BVAkJR2V0UG9zKCk7DQorICAgIEZXTF9FUlIJCQlTZXRQb3MoRlhfRkxPQVQgZlBvcyk7DQorICAgIEZYX0ZMT0FUCQlHZXRUcmFja1BvcygpOw0KKyAgICBGV0xfRVJSCQkJU2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKTsNCisgICAgRlhfQk9PTAkJCURvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyA9IDAuMGYpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9TY3JvbGxCYXIoKTsNCisgICAgdmlydHVhbCB+SUZXTF9TY3JvbGxCYXIoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zcGluYnV0dG9uLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDE3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NQSU5CVVRUT05fSA0KKyNkZWZpbmUgX0ZXTF9TUElOQlVUVE9OX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9TcGluQnV0dG9uOw0KKyNkZWZpbmUJCUZXTF9DTEFTU19TcGluQnV0dG9uCQkJTCJGV0xfU1BJTkJVVFRPTiINCisjZGVmaW5lCQlGV0xfQ0xBU1NIQVNIX1NwaW5CdXR0b24JCTM3OTMwNDM2NDYNCisjZGVmaW5lCQlGV0xfU1RZTEVFWEVfU1BCX1ZlcnQJCQkoMUwgPDwgMCkNCisjZGVmaW5lCQlGV0xfUEFSVF9TUEJfQm9yZGVyCQkJCTENCisjZGVmaW5lCQlGV0xfUEFSVF9TUEJfRWRnZQkJCQkyDQorI2RlZmluZQkJRldMX1BBUlRfU1BCX1VwQnV0dG9uCQkJMw0KKyNkZWZpbmUJCUZXTF9QQVJUX1NQQl9Eb3duQnV0dG9uCQkJNA0KKyNkZWZpbmUJCUZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbAkJKDBMIDw8IDApDQorI2RlZmluZQkJRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZAkJKDFMIDw8IDApDQorI2RlZmluZQkJRldMX1BBUlRTVEFURV9TUEJfUHJlc3NlZAkJKDJMIDw8IDApDQorI2RlZmluZQkJRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQJCSgzTCA8PCAwKQ0KKyNkZWZpbmUJCUZXTF9XR1RISVRURVNUX1NQQl9VcEJ1dHRvbgkJKEZXTF9XR1RISVRURVNUX01BWCArIDEpDQorI2RlZmluZQkJRldMX1dHVEhJVFRFU1RfU1BCX0Rvd25CdXR0b24JKEZXTF9XR1RISVRURVNUX01BWCArIDIpDQorI2RlZmluZSBGV0xfRVZUX1NQQl9DbGljawkJCQkJTCJGV0xfRVZFTlRfU1BCX0NsaWNrIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfU1BCX0NsaWNrCQkJCTI5Mjc2NTExODcNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0U3BiQ2xpY2ssIEZXTF9FVlRIQVNIX1NQQl9DbGljaykNCitGWF9CT09MIG1fYlVwOw0KK0VORF9GV0xfRVZFTlRfREVGDQorY2xhc3MgSUZXTF9TcGluQnV0dG9uIDogcHVibGljIElGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGV0xfU3BpbkJ1dHRvbiogQ3JlYXRlKCk7DQorDQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlFbmFibGVCdXR0b24oRlhfQk9PTCBiRW5hYmxlLCBGWF9CT09MIGJVcCA9IFRSVUUpOw0KKyAgICBGWF9CT09MCQlJc0J1dHRvbkVuYWJsZShGWF9CT09MIGJVcCA9IFRSVUUpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9TcGluQnV0dG9uKCk7DQorICAgIHZpcnR1YWwgfklGV0xfU3BpbkJ1dHRvbigpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdiOWEyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfVE9PTFRJUF9IDQorI2RlZmluZSBfRldMX1RPT0xUSVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBJRldMX0Zvcm07DQorY2xhc3MgSUZXTF9Ub29sVGlwRFA7DQorY2xhc3MgSUZXTF9Ub29sVGlwOw0KKyNkZWZpbmUgRldMX0NMQVNTX1Rvb2xUaXAJCUwiRldMX1RPT0xUSVAiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX1Rvb2xUaXAJMTExMTk4NDc1NQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1RUUF9SZWN0YW5nbGUJCSgwTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1RUUF9Sb3VuZENvcm5lcgkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfQmFsbG9vbgkJKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX011bHRpbGluZQkJKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX05vQW5jaG9yCQkoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9QQVJUX1RUUF9Cb3JkZXIJCQkxDQorI2RlZmluZSBGV0xfUEFSVF9UVFBfQmFja2dyb3VuZAkJMg0KKyNkZWZpbmUgRldMX1BBUlRfVFRQX0NhcHRpb24JCTMNCitjbGFzcyBJRldMX1Rvb2xUaXBEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJIAlHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkgCUdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBDRlhfU2l6ZUYJCUdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KK307DQorY2xhc3MgSUZXTF9Ub29sVGlwIDogcHVibGljIElGV0xfRm9ybQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX1Rvb2xUaXAqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJU2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IpOw0KKyAgICBGV0xfRVJSCQlTaG93KCk7DQorICAgIEZXTF9FUlIJCUhpZGUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfVG9vbFRpcCgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX1Rvb2xUaXAoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODVhYzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhNQVRIX0JBUkNPREVfSF8NCisjZGVmaW5lIF9GWE1BVEhfQkFSQ09ERV9IXw0KK2NsYXNzIElGWF9CYXJjb2RlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsNCisgICAgdmlydHVhbCBCQ19UWVBFCQkJR2V0VHlwZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJRW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKSA9IDA7DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgJmVycm9yQ29kZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlcnJvckNvZGUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Q2hhckVuY29kaW5nKEJDX0NIQVJfRU5DT0RJTkcgZW5jb2RpbmcpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TW9kdWxlSGVpZ2h0KEZYX0lOVDMyIG1vZHVsZUhlaWdodCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRNb2R1bGVXaWR0aChGWF9JTlQzMiBtb2R1bGVXaWR0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRIZWlnaHQoRlhfSU5UMzIgaGVpZ2h0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFdpZHRoKEZYX0lOVDMyIHdpZHRoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldENhbENoZWNrc3VtKEZYX0lOVDMyIHN0YXRlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udFN0eWxlKEZYX0lOVDMyIHN0eWxlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWRlTmFycm93UmF0aW8oRlhfSU5UMzIgcmF0aW8pID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRWZXJzaW9uKEZYX0lOVDMyIHZlcnNpb24pID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwgKEZYX0lOVDMyIGxldmVsKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkgPSAwOw0KK307DQorSUZYX0JhcmNvZGUqCQkJCUZYX0JhcmNvZGVfQ3JlYXRlKEJDX1RZUEUgdHlwZSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjYzMDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfYXBwLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQVBQX0gNCisjZGVmaW5lIF9GV0xfQVBQX0gNCitjbGFzcyBJRldMX05vdGVUaHJlYWQ7DQorY2xhc3MgSUZXTF9BZGFwdGVyTmF0aXZlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3I7DQorY2xhc3MgSUZXTF9BcHA7DQorY2xhc3MgSUZXTF9BcHAgOiBwdWJsaWMgSUZXTF9Ob3RlVGhyZWFkDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGV0xfQXBwKiBDcmVhdGUoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlcik7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlJbml0aWFsaXplKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJRmluYWxpemUoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyTmF0aXZlKglHZXRBZGFwdGVyTmF0aXZlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGV0xfV2lkZ2V0TWdyKgkJR2V0V2lkZ2V0TWdyKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlFeGl0KEZYX0lOVDMyIGlFeGl0Q29kZSA9IDApID0gMDsNCit9Ow0KK0lGV0xfQXBwKiBGV0xfR2V0QXBwKCk7DQordm9pZCBGV0xfU2V0QXBwKElGV0xfQXBwICpwQXBwKTsNCitJRldMX0FkYXB0ZXJOYXRpdmUqCUZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBGV0xfR2V0QWRhcHRlcldpZGdldE1ncigpOw0KK0lGV0xfVGhlbWVQcm92aWRlcioJRldMX0dldFRoZW1lUHJvdmlkZXIoKTsNCitleHRlcm4gRldMX0VSUiBGV0xfRXhlY3V0ZShGWF9XU1RSIHdzRXhlY3V0YWJsZSwgRlhfV1NUUiB3c1BhcmFtZXRlcnMpOw0KK0ZXTF9FUlIgRldMX1NldEZ1bGxTY3JlZW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYkZ1bGxTY3JlZW4pOw0KK0ZYX0JPT0wgRldMX0FwcElzQWN0aXZlZCgpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9jb250ZW50LmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfY29udGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDVlOWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfY29udGVudC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0NPTlRFTlRfSA0KKyNkZWZpbmUgX0ZXTF9DT05URU5UX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX0NvbnRlbnQ7DQorY2xhc3MgSUZXTF9Db250ZW50IDogcHVibGljIElGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGV0xfQ29udGVudCogQ3JlYXRlKCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgRldMX0VSUgkJSW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwQ2hpbGQsIEZYX0lOVDMyIG5JbmRleCA9IC0xKTsNCisgICAgRldMX0VSUgkJUmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgRldMX0VSUgkJUmVtb3ZlQWxsV2lkZ2V0cygpOw0KKyAgICBGV0xfRVJSCQlHZXRNaW5TaXplKEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCisgICAgRldMX0VSUgkJU2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgICBGV0xfRVJSCQlHZXRNYXhTaXplKEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCisgICAgRldMX0VSUgkJU2V0TWF4U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9Db250ZW50KCk7DQorICAgIHZpcnR1YWwgfklGV0xfQ29udGVudCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Vycm9yLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQyYWU0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Vycm9yLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfRVJST1JfSA0KKyNkZWZpbmUgX0ZXTF9FUlJPUl9IDQordHlwZWRlZiBGWF9JTlQzMglGV0xfRVJSOw0KKyNkZWZpbmUgRldMX0VSUl9TdWNjZWVkZWQJCQkJCQkwDQorI2RlZmluZSBGV0xfRVJSX0luZGVmaW5pdGUJCQkJCQktMQ0KKyNkZWZpbmUgRldMX0VSUl9QYXJhbWV0ZXJfSW52YWxpZAkJCQktMTAwDQorI2RlZmluZSBGV0xfRVJSX1Byb3BlcnR5X0ludmFsaWQJCQkJLTIwMA0KKyNkZWZpbmUgRldMX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfX0ludmFsaWQJCS0zMDANCisjZGVmaW5lIEZXTF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQJCQktNDAwDQorI2RlZmluZSBGV0xfRVJSX091dF9PZl9NZW1vcnkJCQkJCS01MDANCisjaWYgZGVmaW5lZCAoX19XSU4zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpDQorI2RlZmluZQlfRldMX0FMQVJNX0lGX0ZBSUwoYXJnLCBhbGFybSkgeyBpZiAoIShhcmcpKSA6Ok91dHB1dERlYnVnU3RyaW5nKGFsYXJtKTsgfQ0KKyNlbGlmIGRlZmluZWQgKF9fbGludXgpIHx8IGRlZmluZWQgKGxpbnV4KSB8fCBkZWZpbmVkIChfX0FQUExFX18pIHx8IGRlZmluZWQgKF9fTUFDT1NYX18pDQorI2RlZmluZSBfRldMX0FMQVJNX0lGX0ZBSUwoYXJnLCBhbGFybSkgeyBpZiAoIShhcmcpKSBwcmludGYoYWxhcm0pOyB9DQorI2Vsc2UNCisjZW5kaWYNCisjZGVmaW5lIF9GV0xfUkVUVVJOX0lGX0ZBSUwoYXJnKSB7IGlmICghKGFyZykpIHJldHVybjsgfQ0KKyNkZWZpbmUgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChhcmcsIHZhbCkgeyBpZiAoIShhcmcpKSByZXR1cm4gdmFsOyB9DQorI2RlZmluZSBfRldMX0dPVE9fUE9TSVRJT05fSUZfRkFJTChhcmcsIHBvcykgeyBpZiAoIShhcmcpKSBnb3RvIHBvczsgfQ0KKyNpZiBkZWZpbmVkIChfX1dJTjMyX18pIHx8IGRlZmluZWQgKF9XSU4zMikNCisjZGVmaW5lCVwNCisgICAgX0ZXTF9FUlJfQ0hFQ0tfQUxBUk1fSUZfRkFJTChhcmcpIFwNCisgICAgeyBcDQorICAgICAgICBpZiAoKGFyZykgIT0gRldMX0VSUl9TdWNjZWVkZWQpIFwNCisgICAgICAgIHsgXA0KKyAgICAgICAgICAgIGNoYXIgYnVmWzE2XTsgXA0KKyAgICAgICAgICAgIHNwcmludGYoYnVmLCAiRXJyb3IgY29kZSBpcyAlZFxuIiwgYXJnKTsgXA0KKyAgICAgICAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmcoYnVmKTsgXA0KKyAgICAgICAgfSBcDQorICAgIH0NCisjZWxpZiBkZWZpbmVkIChfX2xpbnV4KSB8fCBkZWZpbmVkIChsaW51eCkgfHwgZGVmaW5lZCAoX19BUFBMRV9fKSB8fCBkZWZpbmVkIChfX01BQ09TWF9fKQ0KKyNkZWZpbmUgXA0KKyAgICBfRldMX0VSUl9DSEVDS19BTEFSTV9JRl9GQUlMKGFyZykgXA0KKyAgICB7IFwNCisgICAgICAgIGlmICgoYXJnKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkgXA0KKyAgICAgICAgICAgIHByaW50ZigiJWRcbiIsIGFyZyk7IFwNCisgICAgfQ0KKyNlbHNlDQorI2VuZGlmDQorI2RlZmluZSBfRldMX0VSUl9DSEVDS19SRVRVUk5fSUZfRkFJTChhcmcpIHsgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSByZXR1cm47IH0NCisjZGVmaW5lIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGFyZywgdmFsKSB7IGlmICgoYXJnKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkgcmV0dXJuIHZhbDsgfQ0KKyNkZWZpbmUgX0ZXTF9FUlJfQ0hFQ0tfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSB7IGlmICgoYXJnKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkgZ290byBwb3M7IH0NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZm9ybS5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBiMDgzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaApAQCAtMCwwICsxLDgzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9GT1JNX0gNCisjZGVmaW5lIF9GV0xfRk9STV9IDQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9QYW5lbDsNCitjbGFzcyBJRldMX0Zvcm07DQorI2RlZmluZSBGV0xfQ0xBU1NfRm9ybQkJCQkJTCJGV0xfRk9STSINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfRm9ybQkJCQk4ODE1NjcyOTINCisjZGVmaW5lIEZXTF9DTEFTU19Gb3JtUHJveHkJCQkJTCJGV0xfRk9STVBST1hZIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9Gb3JtUHJveHkJCQk4ODE1NjcyOTENCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplCQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX05hdGl2ZUJvcmRlcgkoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fUm91bmRDb3JuZXIJKDJMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX1JvdW5kQ29ybmVyNAkoM0wgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fTm9EcmF3Q2xpZW50ICAgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX0JvcmRlckNvcm5lck1hc2sgKDNMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX01heAkJCSgzKQ0KKyNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQorI2RlZmluZSBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorI2VuZGlmDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbgkJKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0ZSTV9DWU5hcnJvd0NhcHRpb24JKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAyKQ0KKyNkZWZpbmUJRldMX1dHVENBUEFDSVRZX0ZSTV9CaWdJY29uCQkJKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAzKQ0KKyNkZWZpbmUJRldMX1dHVENBUEFDSVRZX0ZSTV9TbWFsbEljb24JCShGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNCkNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9Cb3JkZXIJCQkJMQ0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0VkZ2UJCQkJMg0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0JhY2tncm91bmQJCQkzDQorI2RlZmluZSBGV0xfUEFSVF9GUk1fQ2FwdGlvbgkJCTQNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9OYXJyb3dDYXB0aW9uCQk1DQorI2RlZmluZSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3gJCQk2DQorI2RlZmluZSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3gJCTcNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveAkJOA0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0hlYWRUZXh0CQkJOQ0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0ljb24JCQkJMTANCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbAkJMQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9GUk1fSG92ZXIJCQkyDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9QcmVzc2VkCQkzDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9JbmFjdGl2ZQkJNA0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9GUk1fRGlzYWJsZWQJCTUNCitjbGFzcyBJRldMX0Zvcm1EUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJCaWcpID0gMDsNCit9Ow0KK2VudW0gRldMX0ZPUk1TSVpFIHsNCisgICAgRldMX0ZPUk1TSVpFX01hbnVhbCA9IDAsDQorICAgIEZXTF9GT1JNU0laRV9XaWR0aCwNCisgICAgRldMX0ZPUk1TSVpFX0hlaWdodCwNCisgICAgRldMX0ZPUk1TSVpFX0FsbCwNCit9Ow0KK2VudW0gRldMX0NPTU1BTkRJRCB7DQorICAgIEZXTF9DT01NQU5ESURfQ2xvc2UgPSAwLA0KKyAgICBGV0xfQ09NTUFORElEX09rLA0KKyAgICBGV0xfQ09NTUFORElEX0NhbmNlbCwNCisgICAgRldMX0NPTU1BTkRJRF9BYm9ydCwNCisgICAgRldMX0NPTU1BTkRJRF9SZXRyeSwNCisgICAgRldMX0NPTU1BTkRJRF9JZ25vcmUsDQorICAgIEZXTF9DT01NQU5ESURfWWVzLA0KKyAgICBGV0xfQ09NTUFORElEX05vLA0KK307DQorY2xhc3MgSUZXTF9Gb3JtIDogcHVibGljIElGV0xfUGFuZWwNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZXTF9Gb3JtKglDcmVhdGUoKTsNCisgICAgRldMX0VSUgkJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJCUluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBDRlhfV2lkZVN0cmluZyAqY2xhc3NuYW1lLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9GT1JNU0laRQlHZXRGb3JtU2l6ZSgpOw0KKyAgICBGV0xfRVJSCQkJU2V0Rm9ybVNpemUoRldMX0ZPUk1TSVpFIGVGb3JtU2l6ZSk7DQorICAgIElGV0xfV2lkZ2V0KglEb01vZGFsKCk7DQorICAgIElGV0xfV2lkZ2V0KglEb01vZGFsKEZYX0RXT1JEICZkd0NvbW1hbmRJRCk7DQorICAgIEZXTF9FUlIJCQlFbmREb01vZGFsKCk7DQorICAgIEZXTF9FUlIJCQlTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGggKnBQYXRoKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfRm9ybSgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX0Zvcm0oKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ncmlkLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZ3JpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODNmZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZ3JpZC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0dSSURfSA0KKyNkZWZpbmUgX0ZXTF9HUklEX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX0NvbnRlbnQ7DQorY2xhc3MgSUZXTF9HcmlkOw0KKyNkZWZpbmUgRldMX0NMQVNTX0dyaWQJCQlMIkZXTF9HUklEIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9HcmlkCQkzMTUwMjk4NjcwDQorI2RlZmluZSBGV0xfR1JJRFNUWUxFRVhUX1Nob3dHcmlkTGluZXMgKDFMIDw8IDApDQorc3RydWN0IEZXTF9MQVlPVVREQVRBIDogcHVibGljIENGWF9PYmplY3Qgew0KKyAgICBGWF9GTE9BVCBmV2lkdGg7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQ7DQorfTsNCitlbnVtIEZXTF9HUklEVU5JVCB7DQorICAgIEZXTF9HUklEVU5JVF9BdXRvID0gMCwNCisgICAgRldMX0dSSURVTklUX0ZpeGVkLA0KKyAgICBGV0xfR1JJRFVOSVRfU2NhbGVkLA0KKyAgICBGV0xfR1JJRFVOSVRfSW5maW5pdHksDQorfTsNCitlbnVtIEZXTF9HUklETUFSR0lOIHsNCisgICAgRldMX0dSSURNQVJHSU5fTGVmdCA9IDAsDQorICAgIEZXTF9HUklETUFSR0lOX1RvcCwNCisgICAgRldMX0dSSURNQVJHSU5fUmlnaHQsDQorICAgIEZXTF9HUklETUFSR0lOX0JvdHRvbSwNCit9Ow0KK2VudW0gRldMX0dSSURTSVpFIHsNCisgICAgRldMX0dSSURTSVpFX1dpZHRoID0gMCwNCisgICAgRldMX0dSSURTSVpFX0hlaWdodCwNCisgICAgRldMX0dSSURTSVpFX01pbldpZHRoLA0KKyAgICBGV0xfR1JJRFNJWkVfTWluSGVpZ2h0LA0KKyAgICBGV0xfR1JJRFNJWkVfTWF4V2lkdGgsDQorICAgIEZXTF9HUklEU0laRV9NYXhIZWlnaHQsDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hHUklEQ09MUk9XIHsNCisgICAgRlhfTFBWT0lEIHBEYXRhOw0KK30gKiBGV0xfSEdSSURDT0xST1c7DQorY2xhc3MgSUZXTF9HcmlkIDogcHVibGljIElGV0xfQ29udGVudA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX0dyaWQqCUNyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQkJCUluaXRpYWxpemUoKTsNCisgICAgRldMX0VSUgkJCQlJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcyk7DQorDQorICAgIEZXTF9IR1JJRENPTFJPVwkJSW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgRlhfSU5UMzIgbkluZGV4ID0gLTEpOw0KKyAgICBGWF9JTlQzMgkJCUNvdW50Q29sUm93cyhGWF9CT09MIGJDb2x1bW4pOw0KKyAgICBGV0xfSEdSSURDT0xST1cJCUdldENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIEZYX0lOVDMyIG5JbmRleCk7DQorICAgIEZYX0lOVDMyCQkJR2V0SW5kZXgoRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KKyAgICBGWF9GTE9BVAkJCUdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KKyAgICBGV0xfRVJSCQkJCVNldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgICBGWF9GTE9BVAkJCUdldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KKyAgICBGV0xfRVJSCQkJCVNldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgICBGWF9GTE9BVAkJCUdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KKyAgICBGV0xfRVJSCQkJCVNldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgICBGWF9CT09MCQkJCURlbGV0ZUNvbFJvdyhGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQorICAgIEZYX0JPT0wJCQkJSXNDb2x1bW4oRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KKyAgICBGWF9JTlQzMgkJCUdldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKTsNCisgICAgRldMX0VSUgkJCQlTZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyIGlQb3MsIEZYX0JPT0wgYkNvbHVtbik7DQorICAgIEZYX0lOVDMyCQkJR2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKTsNCisgICAgRldMX0VSUgkJCQlTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9JTlQzMiBpU3BhbiwgRlhfQk9PTCBiQ29sdW1uKTsNCisgICAgRlhfRkxPQVQJCQlHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KKyAgICBGV0xfRVJSCQkJCVNldFdpZGdldFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklEU0laRSBlU2l6ZSwgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVWl0KTsNCisgICAgRlhfQk9PTAkJCQlHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUICZmTWFyZ2luKTsNCisgICAgRldMX0VSUgkJCQlTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUIGZNYXJnaW4pOw0KKyAgICBGV0xfRVJSCQkJCVJlbW92ZVdpZGdldE1hcmdpbihJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbik7DQorICAgIEZYX0ZMT0FUCQkJR2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQgJmVVbml0KTsNCisgICAgRldMX0VSUgkJCQlTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX0dyaWQoKTsNCisgICAgdmlydHVhbCB+SUZXTF9HcmlkKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfbm90ZS5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX25vdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQ3YWU0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX25vdGUuaApAQCAtMCwwICsxLDM4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTk9URV9IDQorI2RlZmluZSBfRldMX05PVEVfSA0KK2NsYXNzIElGV0xfVGFyZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfTm90ZVRocmVhZDsNCitjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQorY2xhc3MgQ0ZXTF9Ob3RlOw0KK2NsYXNzIENGV0xfTWVzc2FnZTsNCitjbGFzcyBDRldMX01zZ0FjdGl2YXRlOw0KK2NsYXNzIENGV0xfTXNnRGVhY3RpdmF0ZTsNCitjbGFzcyBDRldMX01zZ01vdXNlOw0KK2NsYXNzIENGV0xfTXNnTW91c2VXaGVlbDsNCitjbGFzcyBDRldMX01zZ0tleTsNCitjbGFzcyBDRldMX01zZ1NldEZvY3VzOw0KK2NsYXNzIENGV0xfTXNnS2lsbEZvY3VzOw0KK2NsYXNzIENGV0xfTXNnQ3Vyc29yOw0KK2NsYXNzIENGV0xfTXNnU2l6ZTsNCitjbGFzcyBDRldMX01zZ1dpbmRvd01vdmU7DQorY2xhc3MgQ0ZXTF9Nc2dEcm9wRmlsZXM7DQorY2xhc3MgQ0ZXTF9Nc2dUYXNrQ2xpY2tlZDsNCitjbGFzcyBDRldMX01zZ0Nsb3NlOw0KK2NsYXNzIENGV0xfTXNnV2luZG93V2lsbE1vdmU7DQorY2xhc3MgQ0ZXTF9FdmVudDsNCitjbGFzcyBDRldMX0V2dE1vdXNlOw0KK2NsYXNzIENGV0xfRXZ0TW91c2VXaGVlbDsNCitjbGFzcyBDRldMX0V2dEtleTsNCitjbGFzcyBDRldMX0V2dFNldEZvY3VzOw0KK2NsYXNzIENGV0xfRXZ0S2lsbEZvY3VzOw0KK2NsYXNzIENGV0xfRXZ0RHJhdzsNCitjbGFzcyBDRldMX0V2dENsaWNrOw0KK2NsYXNzIENGV0xfRXZ0U2Nyb2xsOw0KK2NsYXNzIENGV0xfRXZ0Q2xvc2U7DQorY2xhc3MgQ0ZXTF9FdnRDb250ZXh0TWVudTsNCitjbGFzcyBDRldMX0V2dE1lbnVDb21tYW5kOw0KK2NsYXNzIENGV0xfRXZ0U2l6ZUNoYW5nZWQ7DQorY2xhc3MgQ0ZXTF9FdnRJZGxlOw0KK2NsYXNzIElGV0xfTm90ZURyaXZlcjsNCitjbGFzcyBJRldMX05vdGVMb29wOw0KKyNkZWZpbmUgRldMX01TR19BY3RpdmF0ZQkJCQkJTCJGV0xfTUVTU0FHRV9BY3RpdmF0ZSINCisjZGVmaW5lIEZXTF9NU0dfRGVhY3RpdmF0ZQkJCQkJTCJGV0xfTUVTU0FHRV9EZWFjdGl2YXRlIg0KKyNkZWZpbmUgRldMX01TR19TZXRGb2N1cwkJCQkJTCJGV0xfTUVTU0FHRV9TZXRGb2N1cyINCisjZGVmaW5lIEZXTF9NU0dfS2lsbEZvY3VzCQkJCQlMIkZXTF9NRVNTQUdFX0tpbGxGb2N1cyINCisjZGVmaW5lIEZXTF9NU0dfTW91c2UJCQkJCQlMIkZXTF9NRVNTQUdFX01vdXNlIg0KKyNkZWZpbmUgRldMX01TR19Nb3VzZVdoZWVsCQkJCQlMIkZXTF9NRVNTQUdFX01vdXNlV2hlZWwiDQorI2RlZmluZSBGV0xfTVNHX0tleQkJCQkJCQlMIkZXTF9NRVNTQUdFX0tleSINCisjZGVmaW5lIEZXTF9NU0dfQ3Vyc29yCQkJCQkJTCJGV0xfTUVTU0FHRV9DdXJzb3IiDQorI2RlZmluZSBGV0xfTVNHX1NpemUJCQkJCQlMIkZXTF9NRVNTQUdFX1NpemUiDQorI2RlZmluZQlGV0xfTVNHX1dpbmRvd01vdmUJCQkJCUwiRldMX01FU1NBR0VfV2luZG93TW92ZSINCisjZGVmaW5lIEZXTF9NU0dfRHJvcEZpbGVzCQkJCQlMIkZXTF9NRVNTQUdFX0Ryb3BGaWxlcyINCisjZGVmaW5lIEZXTF9NU0dfVGFza0NsaWNrZWQJCQkJCUwiRldMX01FU1NBR0VfVGFza0NsaWNrZWQiDQorI2RlZmluZSBGV0xfTVNHX0Nsb3NlCQkJCQkJTCJGV0xfTUVTU0FHRV9DbG9zZSINCisjZGVmaW5lIEZXTF9NU0dfUG9zdAkJCQkJCUwiRldMX01FU1NBR0VfUG9zdCINCisjZGVmaW5lIEZXTF9NU0dfV2luZG93V2lsbE1vdmUJCQkJTCJGV0xfTUVTU0FHRV9XaW5kb3dXaWxsTW92ZSINCisjZGVmaW5lIEZXTF9NU0dIQVNIX0FjdGl2YXRlCQkJCTI0MTAzNjk0NjkNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGUJCQkJMTE4NDIxNDc5MA0KKyNkZWZpbmUJRldMX01TR0hBU0hfU2V0Rm9jdXMJCQkJNDE3NDUxMjUwNA0KKyNkZWZpbmUJRldMX01TR0hBU0hfS2lsbEZvY3VzCQkJCTE1NTc5MDM4MzINCisjZGVmaW5lCUZXTF9NU0dIQVNIX01vdXNlCQkJCQk3MDYxMjgzMDkNCisjZGVmaW5lCUZXTF9NU0dIQVNIX01vdXNlV2hlZWwJCQkJODkzNzAzNDY2DQorI2RlZmluZQlGV0xfTVNHSEFTSF9LZXkJCQkJCQkzNzUxMzcyNDA1DQorI2RlZmluZQlGV0xfTVNHSEFTSF9DdXJzb3IJCQkJCTMxODI2MjYyMTgNCisjZGVmaW5lCUZXTF9NU0dIQVNIX1NpemUJCQkJCTE2MDA3NzczNQ0KKyNkZWZpbmUJRldMX01TR0hBU0hfV2luZG93TW92ZQkJCQkxMDMyMjY5Mzc3DQorI2RlZmluZQlGV0xfTVNHSEFTSF9Ecm9wRmlsZXMJCQkJMjAwNDE2NTIzNg0KKyNkZWZpbmUgRldMX01TR0hBU0hfVGFza0NsaWNrZWQJCQkJMzEyODIzMTA4Ng0KKyNkZWZpbmUgRldMX01TR0hBU0hfQ2xvc2UJCQkJCTI5Nzc1NjM5MDYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1Bvc3QJCQkJCTE5Njk2MzMwNzQNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1dpbmRvd1dpbGxNb3ZlCQkJMjIyOTE3NTc2Mw0KKyNkZWZpbmUgRldMX0VWVF9Nb3VzZQkJCQkJCUwiRldMX0VWRU5UX01vdXNlIg0KKyNkZWZpbmUgRldMX0VWVF9Nb3VzZVdoZWVsCQkJCQlMIkZXTF9FVkVOVF9Nb3VzZVdoZWVsIg0KKyNkZWZpbmUgRldMX0VWVF9LZXkJCQkJCQkJTCJGV0xfRVZFTlRfS2V5Ig0KKyNkZWZpbmUgRldMX0VWVF9TZXRGb2N1cwkJCQkJTCJGV0xfRVZFTlRfU2V0Rm9jdXMiDQorI2RlZmluZSBGV0xfRVZUX0tpbGxGb2N1cwkJCQkJTCJGV0xfRVZFTlRfS2lsbEZvY3VzIg0KKyNkZWZpbmUgRldMX0VWVF9DbGljawkJCQkJCUwiRldMX0VWRU5UX0NsaWNrIg0KKyNkZWZpbmUgRldMX0VWVF9EcmF3CQkJCQkJTCJGV0xfRVZFTlRfRHJhdyINCisjZGVmaW5lIEZXTF9FVlRfU2Nyb2xsCQkJCQkJTCJGV0xfRVZFTlRfU2Nyb2xsIg0KKyNkZWZpbmUgRldMX0VWVF9DbG9zZQkJCQkJCUwiRldMX0VWRU5UX0Nsb3NlIg0KKyNkZWZpbmUgRldMX0VWVF9Db250ZXh0TWVudQkJCQkJTCJGV0xfRVZFTlRfQ29udGV4dE1lbnUiDQorI2RlZmluZQlGV0xfRVZUX01lbnVDb21tYW5kCQkJCQlMIkZXTF9FVkVOVF9NZW51Q29tbWFuZCINCisjZGVmaW5lIEZXTF9FVlRfU2l6ZUNoYW5nZWQJCQkJCUwiRldMX0VWRU5UX1NpemVDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfTW91c2UJCQkJCTE3NjUyNTgwMDINCisjZGVmaW5lIEZXTF9FVlRIQVNIX01vdXNlV2hlZWwJCQkJMzkwNzExNDQwNw0KKyNkZWZpbmUgRldMX0VWVEhBU0hfS2V5CQkJCQkJMjQwODM1NDQ1MA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfU2V0Rm9jdXMJCQkJMzkwOTcyMTI2OQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfS2lsbEZvY3VzCQkJCTE3NzkzNjMyNTMNCisjZGVmaW5lCUZXTF9FVlRIQVNIX0RyYXcJCQkJCTI0MzA3MTMzMDMNCisjZGVmaW5lCUZXTF9FVlRIQVNIX0NsaWNrCQkJCQk0MDI2MzI4NzgzDQorI2RlZmluZQlGV0xfRVZUSEFTSF9TY3JvbGwJCQkJCTI5NjUxNTg5NjgNCisjZGVmaW5lCUZXTF9FVlRIQVNIX0Nsb3NlCQkJCQk0MDM2NjkzNTk5DQorI2RlZmluZQlGV0xfRVZUSEFTSF9Db250ZXh0TWVudQkJCQkyNzE3MzA3NzE1DQorI2RlZmluZSBGV0xfRVZUSEFTSF9NZW51Q29tbWFuZAkJCQk0OTc3NjM3NDENCisjZGVmaW5lCUZXTF9FVlRIQVNIX1NpemVDaGFuZ2VkCQkJCTMwODM5NTg1MTANCisjZGVmaW5lCUZXTF9FVlRIQVNIX0lkbGUJCQkJCTgzOTU0Njc1OQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duCQkJMQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcAkJCTINCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrCQkzDQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRvd24JCQk0DQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvblVwCQkJNQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX1JCdXR0b25EYmxDbGsJCTYNCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9NQnV0dG9uRG93bgkJCTcNCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9NQnV0dG9uVXAJCQk4DQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTUJ1dHRvbkRibENsawkJOQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZQkJCTEwDQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTW91c2VFbnRlcgkJCTExDQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZQkJCTEyDQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlcgkJCTEzDQorI2RlZmluZSBGV0xfTVNHS0VZQ01EX0tleURvd24JCQkJMQ0KKyNkZWZpbmUgRldMX01TR0tFWUNNRF9LZXlVcAkJCQkJMg0KKyNkZWZpbmUgRldMX01TR0tFWUNNRF9DaGFyCQkJCQkzDQorI2RlZmluZSBGV0xfS0VZRkxBR19DdHJsCQkJCQkoMSA8PCAwKQ0KKyNkZWZpbmUgRldMX0tFWUZMQUdfQWx0CQkJCQkJKDEgPDwgMSkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX1NoaWZ0CQkJCQkoMSA8PCAyKQ0KKyNkZWZpbmUgRldMX0tFWUZMQUdfQ29tbWFuZAkJCQkJKDEgPDwgMykNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0xCdXR0b24JCQkJCSgxIDw8IDQpDQorI2RlZmluZSBGV0xfS0VZRkxBR19SQnV0dG9uCQkJCQkoMSA8PCA1KQ0KKyNkZWZpbmUgRldMX0tFWUZMQUdfTUJ1dHRvbgkJCQkJKDEgPDwgNikNCitjbGFzcyBDRldMX05vdGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBtX2R3UmVmQ291bnQgLS07DQorICAgICAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gbV9kd1JlZkNvdW50Ow0KKyAgICAgICAgaWYgKCFtX2R3UmVmQ291bnQpIHsNCisgICAgICAgICAgICBkZWxldGUgdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBkd1JlZkNvdW50Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZXTF9UYXJnZXQqCVJldGFpbigpDQorICAgIHsNCisgICAgICAgIG1fZHdSZWZDb3VudCArKzsNCisgICAgICAgIHJldHVybiAoSUZXTF9UYXJnZXQqKXRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KKyAgICB7DQorICAgICAgICB3c0NsYXNzID0gTCJDRldMX05vdGUiOw0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENsYXNzSUQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgdmlydHVhbAlDRldMX05vdGUqCQlDbG9uZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJCUlzRXZlbnQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9iSXNFdmVudDsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldAkqbV9wU3JjVGFyZ2V0Ow0KKyAgICBJRldMX1dpZGdldAkqbV9wRHN0VGFyZ2V0Ow0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9Ob3RlKEZYX0JPT0wgYklzRXZlbnQpDQorICAgICAgICA6IG1fcFNyY1RhcmdldChOVUxMKQ0KKyAgICAgICAgLCBtX3BEc3RUYXJnZXQoTlVMTCkNCisgICAgICAgICwgbV9kd1JlZkNvdW50KDEpDQorICAgICAgICAsIG1fYklzRXZlbnQoYklzRXZlbnQpDQorICAgICAgICAsIG1fZHdFeHRlbmQoMCkNCisgICAgew0KKyAgICB9DQorICAgIHZpcnR1YWwgfkNGV0xfTm90ZSgpIHt9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUluaXRpYWxpemUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlGaW5hbGl6ZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYX0RXT1JECQltX2R3UmVmQ291bnQ7DQorICAgIEZYX0JPT0wJCQltX2JJc0V2ZW50Ow0KK3B1YmxpYzoNCisgICAgRlhfRFdPUkQgICAgICAgIG1fZHdFeHRlbmQ7DQorfTsNCitjbGFzcyBDRldMX01lc3NhZ2UgOiBwdWJsaWMgQ0ZXTF9Ob3RlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9NZXNzYWdlKCkgOiBDRldMX05vdGUoRkFMU0UpIHt9DQorICAgIHZpcnR1YWwgfkNGV0xfTWVzc2FnZSgpIHt9DQorICAgIHZpcnR1YWwgQ0ZXTF9FdmVudCogQ2xvbmVUb0V2ZW50KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCit9Ow0KKyNkZWZpbmUgQkVHSU5fRldMX01FU1NBR0VfREVGKGNsYXNzbmFtZSwgbXNnaGFzaGNvZGUpIFwNCisgICAgY2xhc3MgY2xhc3NuYW1lIDogcHVibGljIENGV0xfTWVzc2FnZSBcDQorICAgIHsgXA0KKyAgICBwdWJsaWM6IFwNCisgICAgICAgIGNsYXNzbmFtZSgpIDogQ0ZXTF9NZXNzYWdlKCkge30gXA0KKyAgICAgICAgdmlydHVhbAlDRldMX05vdGUqCUNsb25lKCkge3JldHVybiBGWF9ORVcgY2xhc3NuYW1lKCp0aGlzKTt9IFwNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUglHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0IHt3c0NsYXNzID0gTCIgIyMgY2xhc3NuYW1lICMjICI7IHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDt9IFwNCisgICAgICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0IHtyZXR1cm4gbXNnaGFzaGNvZGU7fSBcDQorICAgICAgICB2aXJ0dWFsIENGV0xfRXZlbnQqIENsb25lVG9FdmVudCgpIHtjbGFzc25hbWUgKnBFdmVudCA9IEZYX05FVyBjbGFzc25hbWU7IHBFdmVudC0+bV9iSXNFdmVudCA9IFRSVUU7IHJldHVybiAoQ0ZXTF9FdmVudCopcEV2ZW50O30NCisjZGVmaW5lIEVORF9GV0xfTUVTU0FHRV9ERUYgXA0KKyAgICB9Ow0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ0FjdGl2YXRlLCBGV0xfTVNHSEFTSF9BY3RpdmF0ZSkNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnRGVhY3RpdmF0ZSwgRldMX01TR0hBU0hfRGVhY3RpdmF0ZSkNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnTW91c2UsIEZXTF9NU0dIQVNIX01vdXNlKQ0KK0ZYX0ZMT0FUCW1fZng7DQorRlhfRkxPQVQJbV9meTsNCitGWF9EV09SRAltX2R3RmxhZ3M7DQorRlhfRFdPUkQJbV9kd0NtZDsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnTW91c2VXaGVlbCwgRldMX01TR0hBU0hfTW91c2VXaGVlbCkNCitGWF9GTE9BVAltX2Z4Ow0KK0ZYX0ZMT0FUCW1fZnk7DQorRlhfRkxPQVQJbV9mRGVsdGFYOw0KK0ZYX0ZMT0FUCW1fZkRlbHRhWTsNCitGWF9EV09SRAltX2R3RmxhZ3M7DQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ1NldEZvY3VzLCBGV0xfTVNHSEFTSF9TZXRGb2N1cykNCitJRldMX1dpZGdldCAqbV9wS2lsbEZvY3VzOw0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dLaWxsRm9jdXMsIEZXTF9NU0dIQVNIX0tpbGxGb2N1cykNCitJRldMX1dpZGdldCAqbV9wU2V0Rm9jdXM7DQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ0tleSwgRldMX01TR0hBU0hfS2V5KQ0KK0ZYX0RXT1JECW1fZHdLZXlDb2RlOw0KK0ZYX0RXT1JECW1fZHdGbGFnczsNCitGWF9EV09SRAltX2R3Q21kOw0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dDdXJzb3IsIEZXTF9NU0dIQVNIX0N1cnNvcikNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnU2l6ZSwgRldMX01TR0hBU0hfU2l6ZSkNCitGWF9JTlQzMgltX2lXaWR0aDsNCitGWF9JTlQzMgltX2lIZWlnaHQ7DQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ1dpbmRvd01vdmUsIEZXTF9NU0dIQVNIX1dpbmRvd01vdmUpDQorRlhfRkxPQVQJbV9meDsNCitGWF9GTE9BVAltX2Z5Ow0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dEcm9wRmlsZXMsIEZXTF9NU0dIQVNIX0Ryb3BGaWxlcykNCitDRldMX01zZ0Ryb3BGaWxlcyhjb25zdCBDRldMX01zZ0Ryb3BGaWxlcyYgY29weSkNCit7DQorICAgIG1fcERzdFRhcmdldCA9IGNvcHkubV9wRHN0VGFyZ2V0Ow0KKyAgICBtX3BTcmNUYXJnZXQgPSBjb3B5Lm1fcFNyY1RhcmdldDsNCisgICAgbV9meCA9IGNvcHkubV9meDsNCisgICAgbV9meSA9IGNvcHkubV9meTsNCisgICAgbV9maWxlcy5BcHBlbmQoY29weS5tX2ZpbGVzKTsNCit9DQorRlhfRkxPQVQJbV9meDsNCitGWF9GTE9BVAltX2Z5Ow0KK0NGWF9XaWRlU3RyaW5nQXJyYXkJbV9maWxlczsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnVGFza0NsaWNrZWQsIEZXTF9NU0dIQVNIX1Rhc2tDbGlja2VkKQ0KK0ZYX0ZMT0FUCW1fZng7DQorRlhfRkxPQVQJbV9meTsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnQ2xvc2UsIEZXTF9NU0dIQVNIX0Nsb3NlKQ0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dXaW5kb3dXaWxsTW92ZSwgRldMX01TR0hBU0hfV2luZG93V2lsbE1vdmUpDQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK2NsYXNzIENGV0xfRXZlbnQgOiBwdWJsaWMgQ0ZXTF9Ob3RlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9FdmVudCgpIDogQ0ZXTF9Ob3RlKFRSVUUpIHt9DQorICAgIHZpcnR1YWwgfkNGV0xfRXZlbnQoKSB7fQ0KK307DQorI2RlZmluZSBCRUdJTl9GV0xfRVZFTlRfREVGKGNsYXNzbmFtZSwgZXZlbnRoYXNoY29kZSkJXA0KKyAgICBjbGFzcyBjbGFzc25hbWUgOiBwdWJsaWMgQ0ZXTF9FdmVudCBcDQorICAgIHsgXA0KKyAgICBwdWJsaWM6IFwNCisgICAgICAgIGNsYXNzbmFtZSgpIDogQ0ZXTF9FdmVudCgpIHt9IFwNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdCB7d3NDbGFzcyA9IEwiICMjIGNsYXNzbmFtZSAjIyAiOyByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7fSBcDQorICAgICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdCB7cmV0dXJuIGV2ZW50aGFzaGNvZGU7fQ0KKyNkZWZpbmUgRU5EX0ZXTF9FVkVOVF9ERUYgXA0KKyAgICB9Ow0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRNb3VzZSwgRldMX0VWVEhBU0hfTW91c2UpDQorRlhfRkxPQVQJbV9meDsNCitGWF9GTE9BVAltX2Z5Ow0KK0ZYX0RXT1JECW1fZHdGbGFnczsNCitGWF9EV09SRAltX2R3Q21kOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dE1vdXNlV2hlZWwsIEZXTF9FVlRIQVNIX01vdXNlV2hlZWwpDQorRlhfRkxPQVQJbV9meDsNCitGWF9GTE9BVAltX2Z5Ow0KK0ZYX0ZMT0FUCW1fZkRlbHRhWDsNCitGWF9GTE9BVAltX2ZEZWx0YVk7DQorRlhfRFdPUkQJbV9kd0ZsYWdzOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEtleSwgRldMX0VWVEhBU0hfS2V5KQ0KK0ZYX0RXT1JECW1fZHdLZXlDb2RlOw0KK0ZYX0RXT1JECW1fZHdGbGFnczsNCitGWF9EV09SRAltX2R3Q21kOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNldEZvY3VzLCBGV0xfRVZUSEFTSF9TZXRGb2N1cykNCitJRldMX1dpZGdldCAqbV9wU2V0Rm9jdXM7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0S2lsbEZvY3VzLCBGV0xfRVZUSEFTSF9LaWxsRm9jdXMpDQorSUZXTF9XaWRnZXQgKm1fcEtpbGxGb2N1czsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnREcmF3LCBGV0xfRVZUSEFTSF9EcmF3KQ0KK0NGWF9HcmFwaGljcwkqbV9wR3JhcGhpY3M7DQorSUZXTF9XaWRnZXQJCSptX3BXaWRnZXQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q2xpY2ssIEZXTF9FVlRIQVNIX0NsaWNrKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNjcm9sbCwgRldMX0VWVEhBU0hfU2Nyb2xsKQ0KK0ZYX0RXT1JEIG1faVNjcm9sbENvZGU7DQorRlhfRkxPQVQgbV9mUG9zOw0KK0ZYX0JPT0wgKm1fcFJldDsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbG9zZSwgRldMX0VWVEhBU0hfQ2xvc2UpDQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q29udGV4dE1lbnUsIEZXTF9FVlRIQVNIX0NvbnRleHRNZW51KQ0KK0ZYX0ZMT0FUICAgbV9mUG9zWDsNCitGWF9GTE9BVCAgIG1fZlBvc1k7DQorSUZXTF9XaWRnZXQgKm1fcE93bmVyOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dE1lbnVDb21tYW5kLCBGV0xfRVZUSEFTSF9NZW51Q29tbWFuZCkNCitGWF9JTlQzMiBtX2lDb21tYW5kOw0KK0ZYX0xQVk9JRCBtX3BEYXRhOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNpemVDaGFuZ2VkLCBGV0xfRVZUSEFTSF9TaXplQ2hhbmdlZCkNCitJRldMX1dpZGdldCAqbV9wV2lkZ2V0Ow0KK0NGWF9SZWN0RgltX3J0T2xkOw0KK0NGWF9SZWN0RgltX3J0TmV3Ow0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0SWRsZSwgRldMX0VWVEhBU0hfSWRsZSkNCitFTkRfRldMX0VWRU5UX0RFRg0KK3R5cGVkZWYgZW51bSB7DQorICAgIEZXTF9FVkVOVF9NT1VTRV9NQVNLCQkJPSAxIDw8IDAsDQorICAgIEZXTF9FVkVOVF9NT1VTRVdIRUVMX01BU0sJCT0gMSA8PCAxLA0KKyAgICBGV0xfRVZFTlRfS0VZX01BU0sJCQkJPSAxIDw8IDIsDQorICAgIEZXTF9FVkVOVF9GT0NVU0NIQU5HRURfTUFTSwkJPSAxIDw8IDMsDQorICAgIEZXTF9FVkVOVF9EUkFXX01BU0sJCQkJPSAxIDw8IDQsDQorICAgIEZXTF9FVkVOVF9DTE9TRV9NQVNLCQkJPSAxIDw8IDUsDQorICAgIEZXTF9FVkVOVF9TSVpFQ0hBTkdFRF9NQVNLCQk9IDEgPDwgNiwNCisgICAgRldMX0VWRU5UX0lETEVfTUFTSyAgICAgICAgICAgICA9IDEgPDwgNywNCisgICAgRldMX0VWRU5UX0NPTlRST0xfTUFTSyAgICAgICAgICA9IDEgPDwgOCwNCisgICAgRldMX0VWRU5UX0FMTF9NQVNLCQkJCT0gMHhGRg0KK30gRldMRXZlbnRNYXNrOw0KK2NsYXNzIElGV0xfTm90ZURyaXZlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VuZE5vdGUoQ0ZXTF9Ob3RlICpwTm90ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVBvc3RNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlSZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0ICpwTGlzdGVuZXIsIElGV0xfV2lkZ2V0ICpwRXZlbnRTb3VyY2UgPSBOVUxMLCBGWF9EV09SRCBkd0ZpbHRlciA9IEZXTF9FVkVOVF9BTExfTUFTSykgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVVucmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcExpc3RlbmVyKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJQ2xlYXJFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0UXVldWVNYXhTaXplKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFF1ZXVlTWF4U2l6ZShjb25zdCBGWF9JTlQzMiBzaXplKSA9IDA7DQorICAgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlQdXNoTm90ZUxvb3AoSUZXTF9Ob3RlTG9vcCAqcE5vdGVMb29wKSA9IDA7DQorICAgIHZpcnR1YWwgSUZXTF9Ob3RlTG9vcCoJUG9wTm90ZUxvb3AoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Rm9jdXMoSUZXTF9XaWRnZXQgKnBGb2N1cywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlSdW4oKSA9IDA7DQorfTsNCitJRldMX1dpZGdldCogRldMX0dldEN1cnJlbnRUaHJlYWRNb2RhbFdpZGdldChJRldMX05vdGVUaHJlYWQgKnBOb3RlVGhyZWFkKTsNCitjbGFzcyBJRldMX05vdGVMb29wDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9CT09MIFByZVByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCUlkbGUoRlhfSU5UMzIgY291bnQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfVG9vbFRpcFRhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCUdldFdpZGdldCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNTaG93ZWQoKSA9IDA7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJCURyYXdUb29sVGlwKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4LCBJRldMX1dpZGdldCAqcFRvb2xUaXApID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJVXNlRGVmYXVsdFRoZW1lKCkgPSAwOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCQlHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSCQkJR2V0VG9vbFRpcFNpemUoQ0ZYX1NpemVGICZzeikgPSAwOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCQlHZXRUb29sVGlwUG9zKENGWF9Qb2ludEYgJnB0KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorfTsNCitGV0xfRVJSIEZXTF9BZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCk7DQorRldMX0VSUiBGV0xfUmVtb3ZlVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQgKnBUYXJnZXQpOw0KK0ZXTF9FUlIJRldMX1NldFRvb2xUaXBJbml0aWFsRGVsYXkoRlhfSU5UMzIgaURlbGF5VGltZSk7DQorRldMX0VSUglGV0xfU2V0VG9vbFRpcEF1dG9Qb3BEZWxheShGWF9JTlQzMiBpRGVsYXlUaW1lKTsNCit0eXBlZGVmIEZYX0JPT0wgKCpGV0xNZXNzYWdlSG9va0NhbGxiYWNrKShDRldMX01lc3NhZ2UgKm1zZywgRlhfTFBWT0lEIGluZm8pOw0KK0ZXTF9FUlIgRldMX1NldEhvb2soSUZXTF9Ob3RlRHJpdmVyICpkcml2ZXIsIEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssIEZYX0xQVk9JRCBpbmZvKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfcGFuZWwuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9wYW5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzM1NGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfcGFuZWwuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QQU5FTF9IDQorI2RlZmluZSBfRldMX1BBTkVMX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX0NvbnRlbnQ7DQorY2xhc3MgSUZXTF9QYW5lbDsNCitjbGFzcyBJRldMX0N1c3RvbVBhbmVsOw0KKyNkZWZpbmUgRldMX0NMQVNTX1BhbmVsCQkJCQlMIkZXTF9QYW5lbCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfUGFuZWwJCQkJODgxNTY3MjkyDQorY2xhc3MgSUZXTF9QYW5lbCA6IHB1YmxpYyBJRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX1BhbmVsKiBDcmVhdGUoKTsNCisgICAgRldMX0VSUgkJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgSUZXTF9Db250ZW50KglHZXRDb250ZW50KCk7DQorICAgIEZXTF9FUlIJCQlTZXRDb250ZW50KElGV0xfQ29udGVudCAqcENvbnRlbnQpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9QYW5lbCgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX1BhbmVsKCk7DQorfTsNCitjbGFzcyBJRldMX0N1c3RvbVBhbmVsIDogcHVibGljIElGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGV0xfQ3VzdG9tUGFuZWwqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBJRldMX0NvbnRlbnQqCUdldENvbnRlbnQoKTsNCisgICAgRldMX0VSUgkJCVNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCk7DQorICAgIEZXTF9FUlIJCQlTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9DdXN0b21QYW5lbCgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX0N1c3RvbVBhbmVsKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGFyZ2V0LmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4YjUzMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90YXJnZXQuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9UQVJHRVRfSA0KKyNkZWZpbmUgX0ZXTF9UQVJHRVRfSA0KK2NsYXNzIElGV0xfVGFyZ2V0Ow0KK2NsYXNzIElGV0xfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgRlhfRFdPUkQJCVJlbGVhc2UoKTsNCisgICAgSUZXTF9UYXJnZXQqCVJldGFpbigpOw0KKyAgICBGWF9EV09SRAkJR2V0UmVmQ291bnQoKSBjb25zdDsNCisgICAgRldMX0VSUgkJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQorICAgIEZYX0RXT1JECQlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIEZYX0JPT0wJCQlJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3Q7DQorICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKCk7DQorICAgIEZXTF9FUlIJCQlGaW5hbGl6ZSgpOw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCB+SUZXTF9UYXJnZXQoKTsNCisgICAgRlhfTFBWT0lECW1fcERhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhlbWUuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aGVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWYyODgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhlbWUuaApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9USEVNRV9IDQorI2RlZmluZSBfRldMX1RIRU1FX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1RoZW1lUGFydDsNCitjbGFzcyBDRldMX1RoZW1lQmFja2dyb3VuZDsNCitjbGFzcyBDRldMX1RoZW1lVGV4dDsNCitjbGFzcyBDRldMX1RoZW1lRWxlbWVudDsNCitjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIJCQkxDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIJCQkyDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgJCTMNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9FZGdlRmxhdAkJCTQNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9FZGdlUmFpc2VkCQkJNQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0VkZ2VTdW5rZW4JCQk2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udAkJCQk3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUJCQk4DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yCQkJOQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1RleHRTZWxDb2xvcgkJMTANCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9MaW5lSGVpZ2h0CQkJMTENCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbgkJCTEyDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93CQkxMw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01BWAkJCQkJNjU1MzUNCitjbGFzcyBDRldMX1RoZW1lUGFydCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9UaGVtZVBhcnQoKQ0KKyAgICAgICAgOiBtX3BXaWRnZXQoTlVMTCkNCisgICAgICAgICwgbV9pUGFydCgwKQ0KKyAgICAgICAgLCBtX2R3U3RhdGVzKDApDQorICAgICAgICAsIG1fZHdEYXRhKDApDQorICAgICAgICAsIG1fcERhdGEoTlVMTCkNCisgICAgew0KKyAgICAgICAgbV9ydFBhcnQuUmVzZXQoKTsNCisgICAgICAgIG1fbWF0cml4LlJlc2V0KCk7DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeAkJCQkgbV9tYXRyaXg7DQorICAgIENGWF9SZWN0RgkJCQkgbV9ydFBhcnQ7DQorICAgIElGV0xfV2lkZ2V0CQkJCSptX3BXaWRnZXQ7DQorICAgIEZYX0lOVDMyCQkJCSBtX2lQYXJ0Ow0KKyAgICBGWF9EV09SRAkJCQkgbV9kd1N0YXRlczsNCisgICAgRlhfRFdPUkQJCQkJIG1fZHdEYXRhOw0KKyAgICBGWF9MUFZPSUQJCQkJIG1fcERhdGE7DQorfTsNCitjbGFzcyBDRldMX1RoZW1lQmFja2dyb3VuZCA6IHB1YmxpYyBDRldMX1RoZW1lUGFydA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kKCkNCisgICAgICAgIDogbV9wR3JhcGhpY3MoTlVMTCkNCisgICAgICAgICwgbV9wSW1hZ2UoTlVMTCkNCisgICAgICAgICwgbV9wUGF0aChOVUxMKQ0KKyAgICB7DQorICAgIH0NCisgICAgQ0ZYX0dyYXBoaWNzCQkJKm1fcEdyYXBoaWNzOw0KKyAgICBDRlhfRElCaXRtYXAJCQkqbV9wSW1hZ2U7DQorICAgIENGWF9QYXRoCQkJCSptX3BQYXRoOw0KK307DQorY2xhc3MgQ0ZXTF9UaGVtZVRleHQgOiBwdWJsaWMgQ0ZXTF9UaGVtZVBhcnQNCit7DQorcHVibGljOg0KKyAgICBDRldMX1RoZW1lVGV4dCgpDQorICAgICAgICA6IG1fcEdyYXBoaWNzKE5VTEwpDQorICAgIHsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZwkJCSBtX3dzVGV4dDsNCisgICAgRlhfRFdPUkQJCQkJIG1fZHdUVE9TdHlsZXM7DQorICAgIEZYX0lOVDMyCQkJCSBtX2lUVE9BbGlnbjsNCisgICAgQ0ZYX0dyYXBoaWNzCQkgICAgKm1fcEdyYXBoaWNzOw0KK307DQorY2xhc3MgSUZXTF9UaGVtZVByb3ZpZGVyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggJm1hdHJpeCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lEICAgR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgQ0ZYX1JlY3RGICZydFBhcnQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0luUGFydChDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICAgIHZpcnR1YWwJRlhfQk9PTAkJQ2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zLCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U3NDJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RocmVhZC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1RIUkVBRF9IDQorI2RlZmluZSBfRldMX1RIUkVBRF9IDQorY2xhc3MgSUZXTF9Ob3RlRHJpdmVyOw0KK2NsYXNzIElGV0xfVGhyZWFkOw0KK2NsYXNzIElGV0xfTm90ZVRocmVhZDsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hUSFJFQUQgew0KKyAgICBGWF9MUFZPSUQgcERhdGE7DQorfSAqRldMX0hUSFJFQUQ7DQorY2xhc3MgSUZXTF9UaHJlYWQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZXTF9UaHJlYWQgKiBDcmVhdGUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZpcnR1YWwgfklGV0xfVGhyZWFkKCkge30NCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpID0gMDsNCit9Ow0KK0ZXTF9IVEhSRUFEIEZXTF9TdGFydFRocmVhZChJRldMX1RocmVhZCAqcFRocmVhZCwgRlhfQk9PTCBiU3VzcGVuZGVkID0gRkFMU0UpOw0KK0ZXTF9FUlIgRldMX1Jlc3VtZVRocmVhZChGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCitGV0xfRVJSIEZXTF9TdXNwZW5kVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KK0ZXTF9FUlIgRldMX0tpbGxUaHJlYWQoRldMX0hUSFJFQUQgaFRocmVhZCwgRlhfSU5UMzIgaUV4aXRDb2RlKTsNCitGV0xfRVJSIEZXTF9TdG9wVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIEZYX0lOVDMyIGlFeGl0Q29kZSk7DQorRldMX0VSUiBGV0xfU2xlZXAoRlhfRFdPUkQgZHdNaWxsaXNlY29uZHMpOw0KK2NsYXNzIElGV0xfTm90ZVRocmVhZCA6IHB1YmxpYyBJRldMX1RocmVhZA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRldMX05vdGVUaHJlYWQqIENyZWF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpID0gMDsNCisgICAgdmlydHVhbCBJRldMX05vdGVEcml2ZXIqIEdldE5vdGVEcml2ZXIoKSA9IDA7DQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hNVVRFWCB7DQorICAgIEZYX0xQVk9JRCBwRGF0YTsNCit9ICpGV0xfSE1VVEVYOw0KK0ZXTF9ITVVURVgJRldMX0NyZWF0ZU11dGV4KCk7DQorRldMX0VSUgkJRldMX0Rlc3Ryb3lNdXRleChGV0xfSE1VVEVYIGhNdXRleCk7DQorRldMX0VSUgkJRldMX0xvY2tNdXRleChGV0xfSE1VVEVYIGhNdXRleCk7DQorRldMX0VSUgkJRldMX1RyeUxvY2tNdXRleChGV0xfSE1VVEVYIGhNdXRleCk7DQorRldMX0VSUgkJRldMX1VubG9ja011dGV4KEZXTF9ITVVURVggaE11dGV4KTsNCitGV0xfRVJSCQlGV0xfSXNMb2NrZWRNdXRleChGV0xfSE1VVEVYIGhNdXRleCwgRlhfQk9PTCAmYkxvY2tlZCk7DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IU0VNQVBIT1JFIHsNCisgICAgRlhfTFBWT0lEIHBEYXRhOw0KK30gKkZXTF9IU0VNQVBIT1JFOw0KK0ZXTF9IU0VNQVBIT1JFCUZXTF9DcmVhdGVTZW1hcGhvcmUoKTsNCitGV0xfRVJSCQlGV0xfRGVzdHJveVNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlKTsNCitGV0xfRVJSCQlGV0xfV2FpdFNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlKTsNCitGV0xfRVJSCQlGV0xfUG9zdFNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlLCBGWF9JTlQzMiBkb3duID0gMSk7DQorRldMX0VSUgkJRldMX0dldFNlbWFwaG9yZVZhbHVlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUsIEZYX0lOVDMyICZ2YWx1ZSk7DQorRldMX0VSUgkJRldMX1Jlc2V0U2VtYXBob3JlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUsIEZYX0lOVDMyIGluaXQpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4M2MyOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1RJTUVSX0gNCisjZGVmaW5lIF9GV0xfVElNRVJfSA0KK2NsYXNzIElGV0xfVGltZXI7DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IVElNRVIgew0KKyAgICBGWF9MUFZPSUQgcERhdGE7DQorfSAqRldMX0hUSU1FUjsNCitjbGFzcyBJRldMX1RpbWVyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9JTlQzMiBSdW4oRldMX0hUSU1FUiBoVGltZXIpID0gMDsNCit9Ow0KK0ZXTF9IVElNRVIgRldMX1N0YXJ0VGltZXIoSUZXTF9UaW1lciAqcFRpbWVyLCBGWF9EV09SRCBkd0VsYXBzZSwgRlhfQk9PTCBiSW1tZWRpYXRlbHkgPSBUUlVFKTsNCitGWF9JTlQzMiBGV0xfU3RvcFRpbWVyKEZXTF9IVElNRVIgaFRpbWVyKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0LmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5OTMyZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaApAQCAtMCwwICsxLDEyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfV0lER0VUX0gNCisjZGVmaW5lIF9GV0xfV0lER0VUX0gNCitjbGFzcyBJRldMX1RhcmdldDsNCitjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfRGF0YVByb3ZpZGVyOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0RGVsZWdhdGU7DQorY2xhc3MgSUZXTF9DdXN0b207DQorY2xhc3MgSUZXTF9Qcm94eTsNCitjbGFzcyBJRldMX0Zvcm07DQorY2xhc3MgSUZXTF9EYXRhUHJvdmlkZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfV2lkZ2V0IDogcHVibGljIElGV0xfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgRldMX0VSUgkJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgICAgRldMX0VSUgkJCUdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgRldMX0VSUgkJCVNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgRldMX0VSUgkJCUdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgSUZXTF9XaWRnZXQqCUdldFBhcmVudCgpOw0KKyAgICBGV0xfRVJSCQkJU2V0UGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCisgICAgSUZXTF9XaWRnZXQqCUdldE93bmVyKCk7DQorICAgIEZXTF9FUlIJCQlTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyKTsNCisgICAgSUZXTF9XaWRnZXQqCUdldE91dGVyKCk7DQorICAgIEZYX0RXT1JECQlHZXRTdHlsZXMoKTsNCisgICAgRldMX0VSUgkJCU1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLCBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpOw0KKyAgICBGWF9EV09SRAkJR2V0U3R5bGVzRXgoKTsNCisgICAgRldMX0VSUgkJCU1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgICBGWF9EV09SRAkJR2V0U3RhdGVzKCk7DQorICAgIEZXTF9FUlIJCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgICBGV0xfRVJSCQkJU2V0UHJpdmF0ZURhdGEoRlhfTFBWT0lEIG1vZHVsZV9pZCwgRlhfTFBWT0lEIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQorICAgIEZYX0xQVk9JRAkJR2V0UHJpdmF0ZURhdGEoRlhfTFBWT0lEIG1vZHVsZV9pZCk7DQorICAgIEZXTF9FUlIJCQlVcGRhdGUoKTsNCisgICAgRldMX0VSUgkJCUxvY2tVcGRhdGUoKTsNCisgICAgRldMX0VSUgkJCVVubG9ja1VwZGF0ZSgpOw0KKyAgICBGWF9EV09SRAkJSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICBGV0xfRVJSCQkJVHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCisgICAgRldMX0VSUgkJCVRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KTsNCisgICAgRldMX0VSUgkJCUdldE1hdHJpeChDRlhfTWF0cml4ICZtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCA9IEZBTFNFKTsNCisgICAgRldMX0VSUgkJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KKyAgICBGV0xfRVJSCQkJRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIqCQlHZXRUaGVtZVByb3ZpZGVyKCk7DQorICAgIEZXTF9FUlIJCQkJCVNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcik7DQorICAgIEZXTF9FUlIJCQkJCVNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciAqcERhdGFQcm92aWRlcik7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqCVNldERlbGVnYXRlKElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSk7DQorICAgIElGV0xfTm90ZVRocmVhZCoJCUdldE93bmVyVGhyZWFkKCkgY29uc3Q7DQorICAgIENGWF9TaXplRgkJCQlHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCit9Ow0KK2NsYXNzIElGV0xfV2lkZ2V0RGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCit9Ow0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzKCkNCisgICAgew0KKyAgICAgICAgbV9jdG1PblBhcmVudC5SZXNldCgpOw0KKyAgICAgICAgbV9ydFdpZGdldC5TZXQoMCwgMCwgMCwgMCk7DQorICAgICAgICBtX2R3U3R5bGVzCQk9IEZXTF9XR1RTVFlMRV9DaGlsZDsNCisgICAgICAgIG1fZHdTdHlsZUV4ZXMJPSAwOw0KKyAgICAgICAgbV9kd1N0YXRlcwkJPSAwOw0KKyAgICAgICAgbV9wVGhlbWVQcm92aWRlciA9IE5VTEw7DQorICAgICAgICBtX3BEYXRhUHJvdmlkZXIgPSBOVUxMOw0KKyAgICAgICAgbV9wUGFyZW50CQk9IE5VTEw7DQorICAgICAgICBtX3BPd25lcgkJPSBOVUxMOw0KKyAgICB9DQorICAgIENGWF9NYXRyaXgJCQkJCW1fY3RtT25QYXJlbnQ7DQorICAgIENGWF9SZWN0RgkJCQkJbV9ydFdpZGdldDsNCisgICAgRlhfRFdPUkQJCQkJCW1fZHdTdHlsZXM7DQorICAgIEZYX0RXT1JECQkJCQltX2R3U3R5bGVFeGVzOw0KKyAgICBGWF9EV09SRAkJCQkJbV9kd1N0YXRlczsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyCQkgICAqbV9wVGhlbWVQcm92aWRlcjsNCisgICAgSUZXTF9EYXRhUHJvdmlkZXIJCSAgICptX3BEYXRhUHJvdmlkZXI7DQorICAgIElGV0xfV2lkZ2V0CQkJCSAgICptX3BQYXJlbnQ7DQorICAgIElGV0xfV2lkZ2V0CQkJCSAgICptX3BPd25lcjsNCit9Ow0KK2NsYXNzIElGV0xfQ3VzdG9tIDogcHVibGljIElGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGV0xfQ3VzdG9tKiBDcmVhdGUoKTsNCisNCisgICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCVNldFByb3h5KElGV0xfUHJveHkgKnBQcm94eSk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX0N1c3RvbSgpOw0KKyAgICB2aXJ0dWFsIH5JRldMX0N1c3RvbSgpOw0KK307DQorY2xhc3MgSUZXTF9Qcm94eQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwJRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKSA9IDA7DQorfTsNCisjZGVmaW5lIEZXTF9BQ0NFTF9Db250cm9sCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0FDQ0VMX0FsdAkJKDFMIDw8IDEpDQorI2RlZmluZSBGV0xfQUNDRUxfU2hpZnQJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX0FDQ0VMX1ZpcnRLZXkJKDFMIDw8IDMpDQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9BQ0NFTCB7DQorICAgIEZYX0RXT1JEIGR3S2V5Ow0KKyAgICBGWF9EV09SRCBkd0NtZDsNCit9IEZXTF9BQ0NFTDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZSA8RlhfRFdPUkQsIEZYX0RXT1JEPiBDRlhfTWFwQWNjZWxlcmF0b3JzOw0KK0ZXTF9FUlIgRldMX0FjY2VsZXJhdG9yX1NldEFwcChDRlhfTWFwQWNjZWxlcmF0b3JzICpwTWFwQWNjZWwpOw0KK0ZXTF9FUlIgRldMX0FjY2VsZXJhdG9yX1NldFRocmVhZChDRlhfTWFwQWNjZWxlcmF0b3JzICpwTWFwQWNjZWwpOw0KK0ZXTF9FUlIgRldMX0FjY2VsZXJhdG9yX1NldEZvcm0oSUZXTF9Gb3JtICpwRnJvbSwgQ0ZYX01hcEFjY2VsZXJhdG9ycyAqcE1hcEFjY2VsKTsNCitGV0xfRVJSIEZXTF9FbmFiZWxXaWRnZXQoSUZXTF9XaWRnZXQgKndpZGdldCwgRlhfQk9PTCBiRW5hYmxlKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0ZGVmLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0ZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjM2I1NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRkZWYuaApAQCAtMCwwICsxLDI0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfV0lER0VUREVGX0gNCisjZGVmaW5lIF9GV0xfV0lER0VUREVGX0gNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9PdmVyTGFwcGVyCQkJKDBMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfUG9wdXAJCQkJKDFMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQ2hpbGQJCQkJKDJMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQm9yZGVyCQkJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0NhcHRpb24JCQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9OYXJyb3dDYXB0aW9uCQkoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9JY29uCQkJCSgxTCA8PCA1KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX01pbmltaXplQm94CQkoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9NYXhpbWl6ZUJveAkJKDFMIDw8IDcpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQ2xvc2VCb3gJCQkoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9IU2Nyb2xsCQkJKDFMIDw8IDkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfVlNjcm9sbAkJCSgxTCA8PCAxMSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9MZWZ0U2Nyb2xsYmFyCQkoMUwgPDwgMTIpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfTGVmdEFsaWdubWVudAkJKDBMIDw8IDEzKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0NlbnRlckFsaWdubWVudAkoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfUmlnaHRBbGlnbm1lbnQJCSgyTCA8PCAxMykNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9Ub3BBbGlnbm1lbnQJCSgwTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9WQ2VudGVyQWxpZ25tZW50CSgxTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9Cb3R0b21BbGlnbm1lbnQJKDJMIDw8IDE1KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1JUTFJlYWRpbmcJCQkoMUwgPDwgMTcpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfUlRMTGF5b3V0CQkJKDFMIDw8IDE4KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0VkZ2VOb25lCQkJKDBMIDw8IDE5KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0VkZ2VGbGF0CQkJKDFMIDw8IDE5KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0VkZ2VSYWlzZWQJCQkoMkwgPDwgMTkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZVN1bmtlbgkJCSgzTCA8PCAxOSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9FZGdlTWFzawkJCSgzTCA8PCAxOSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9TaGFkb3cJCQkJKDNMIDw8IDIxKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0dyb3VwCQkJCSgxTCA8PCAyMikNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9UYWJTdG9wCQkJKDFMIDw8IDIzKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX09mZnNjcmVlbgkJCSgxTCA8PCAyNCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9EcmFnQWNjZXB0RmlsZXMJKDFMIDw8IDI1KQ0KKyNkZWZpbmUJRldMX1dHVFNUWUxFX1RvcE1vc3QJCQkoMUwgPDwgMjYpDQorI2RlZmluZQlGV0xfV0dUU1RZTEVfVHJhbnNQYXJlbnQJCSgxTCA8PCAyNykNCisjZGVmaW5lCUZXTF9XR1RTVFlMRV9Ob0JhY2tncm91bmQJCSgxTCA8PCAyOCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9XaW5kb3dUeXBlTWFzawkJKDNMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfUmVzdG9yZWQJCQkoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9NaW5pbWl6ZWQJCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9NYXhpbWl6ZWQJCQkoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9EaXNhYmxlZAkJCSgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkCQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9Gb2N1c2VkCQkJKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlCQkJKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfTUFYCQkJCSg2KQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVW5rbm93bgkJCTANCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0NsaWVudAkJCTENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0xlZnQJCQkJMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVG9wCQkJCTMNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1JpZ2h0CQkJNA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQm90dG9tCQkJNQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTGVmdFRvcAkJCTYNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1JpZ2h0VG9wCQkJNw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbQkJOA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfUmlnaHRCb3R0b20JCTkNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0ljb24JCQkJMTANCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyCQkJMTENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX01pbkJveAkJCTEyDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9NYXhCb3gJCQkxMw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQ2xvc2VCb3gJCQkxNA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfSFNjcm9sbEJhcgkJMTUNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1ZTY3JvbGxCYXIJCTE2DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Cb3JkZXIJCQkxNw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfRWRnZQkJCQkxOA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfRWRpdAkJCQkxOQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVHJhbnNwYXJlbnQJCTIwDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9NQVgJCQkJMjENCisjZGVmaW5lIEZXTF9WS0VZX0xCdXR0b24JCTB4MDENCisjZGVmaW5lIEZXTF9WS0VZX1JCdXR0b24JCTB4MDINCisjZGVmaW5lIEZXTF9WS0VZX01CdXR0b24JCTB4MDQNCisjZGVmaW5lIEZXTF9WS0VZX0JhY2sgICAgICAgICAgIDB4MDgNCisjZGVmaW5lIEZXTF9WS0VZX1RhYiAgICAgICAgICAgIDB4MDkNCisjZGVmaW5lIEZXTF9WS0VZX0NsZWFyICAgICAgICAgIDB4MEMNCisjZGVmaW5lIEZXTF9WS0VZX1JldHVybgkJCTB4MEQNCisjZGVmaW5lIEZXTF9WS0VZX1NoaWZ0CQkJMHgxMA0KKyNkZWZpbmUgRldMX1ZLRVlfQ29udHJvbAkJMHgxMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTWVudQkJCTB4MTINCisjZGVmaW5lIEZXTF9WS0VZX1BhdXNlCQkJMHgxMw0KKyNkZWZpbmUgRldMX1ZLRVlfQ2FwaXRhbAkJMHgxNA0KKyNkZWZpbmUgRldMX1ZLRVlfS2FuYQkJCTB4MTUNCisjZGVmaW5lIEZXTF9WS0VZX0hhbmd1bAkJCTB4MTUNCisjZGVmaW5lIEZXTF9WS0VZX0p1bmphCQkJMHgxNw0KKyNkZWZpbmUgRldMX1ZLRVlfRmluYWwJCQkweDE4DQorI2RlZmluZSBGV0xfVktFWV9IYW5qYQkJCTB4MTkNCisjZGVmaW5lIEZXTF9WS0VZX0thbmppCQkJMHgxOQ0KKyNkZWZpbmUgRldMX1ZLRVlfRXNjYXBlCQkJMHgxQg0KKyNkZWZpbmUgRldMX1ZLRVlfQ29udmVydAkJMHgxQw0KKyNkZWZpbmUgRldMX1ZLRVlfTm9uQ29udmVydAkJMHgxRA0KKyNkZWZpbmUgRldMX1ZLRVlfQWNjZXB0CQkJMHgxRQ0KKyNkZWZpbmUgRldMX1ZLRVlfTW9kZUNoYW5nZQkJMHgxRg0KKyNkZWZpbmUgRldMX1ZLRVlfU3BhY2UgICAgICAgICAgMHgyMA0KKyNkZWZpbmUgRldMX1ZLRVlfUHJpb3IgICAgICAgICAgMHgyMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTmV4dCAgICAgICAgICAgMHgyMg0KKyNkZWZpbmUgRldMX1ZLRVlfRW5kICAgICAgICAgICAgMHgyMw0KKyNkZWZpbmUgRldMX1ZLRVlfSG9tZSAgICAgICAgICAgMHgyNA0KKyNkZWZpbmUgRldMX1ZLRVlfTGVmdCAgICAgICAgICAgMHgyNQ0KKyNkZWZpbmUgRldMX1ZLRVlfVXAgICAgICAgICAgICAgMHgyNg0KKyNkZWZpbmUgRldMX1ZLRVlfUmlnaHQgICAgICAgICAgMHgyNw0KKyNkZWZpbmUgRldMX1ZLRVlfRG93biAgICAgICAgICAgMHgyOA0KKyNkZWZpbmUgRldMX1ZLRVlfU2VsZWN0ICAgICAgICAgMHgyOQ0KKyNkZWZpbmUgRldMX1ZLRVlfUHJpbnQgICAgICAgICAgMHgyQQ0KKyNkZWZpbmUgRldMX1ZLRVlfRXhlY3V0ZSAgICAgICAgMHgyQg0KKyNkZWZpbmUgRldMX1ZLRVlfU25hcHNob3QgICAgICAgMHgyQw0KKyNkZWZpbmUgRldMX1ZLRVlfSW5zZXJ0ICAgICAgICAgMHgyRA0KKyNkZWZpbmUgRldMX1ZLRVlfRGVsZXRlICAgICAgICAgMHgyRQ0KKyNkZWZpbmUgRldMX1ZLRVlfSGVscCAgICAgICAgICAgMHgyRg0KKyNkZWZpbmUgRldMX1ZLRVlfMAkJCQkweDMwDQorI2RlZmluZSBGV0xfVktFWV8xCQkJCTB4MzENCisjZGVmaW5lIEZXTF9WS0VZXzIJCQkJMHgzMg0KKyNkZWZpbmUgRldMX1ZLRVlfMwkJCQkweDMzDQorI2RlZmluZSBGV0xfVktFWV80CQkJCTB4MzQNCisjZGVmaW5lIEZXTF9WS0VZXzUJCQkJMHgzNQ0KKyNkZWZpbmUgRldMX1ZLRVlfNgkJCQkweDM2DQorI2RlZmluZSBGV0xfVktFWV83CQkJCTB4MzcNCisjZGVmaW5lIEZXTF9WS0VZXzgJCQkJMHgzOA0KKyNkZWZpbmUgRldMX1ZLRVlfOQkJCQkweDM5DQorI2RlZmluZSBGV0xfVktFWV9BCQkJCTB4NDENCisjZGVmaW5lIEZXTF9WS0VZX0IJCQkJMHg0Mg0KKyNkZWZpbmUgRldMX1ZLRVlfQwkJCQkweDQzDQorI2RlZmluZSBGV0xfVktFWV9ECQkJCTB4NDQNCisjZGVmaW5lIEZXTF9WS0VZX0UJCQkJMHg0NQ0KKyNkZWZpbmUgRldMX1ZLRVlfRgkJCQkweDQ2DQorI2RlZmluZSBGV0xfVktFWV9HCQkJCTB4NDcNCisjZGVmaW5lIEZXTF9WS0VZX0gJCQkJMHg0OA0KKyNkZWZpbmUgRldMX1ZLRVlfSQkJCQkweDQ5DQorI2RlZmluZSBGV0xfVktFWV9KCQkJCTB4NEENCisjZGVmaW5lIEZXTF9WS0VZX0sJCQkJMHg0Qg0KKyNkZWZpbmUgRldMX1ZLRVlfTAkJCQkweDRDDQorI2RlZmluZSBGV0xfVktFWV9NCQkJCTB4NEQNCisjZGVmaW5lIEZXTF9WS0VZX04JCQkJMHg0RQ0KKyNkZWZpbmUgRldMX1ZLRVlfTwkJCQkweDRGDQorI2RlZmluZSBGV0xfVktFWV9QCQkJCTB4NTANCisjZGVmaW5lIEZXTF9WS0VZX1EJCQkJMHg1MQ0KKyNkZWZpbmUgRldMX1ZLRVlfUgkJCQkweDUyDQorI2RlZmluZSBGV0xfVktFWV9TCQkJCTB4NTMNCisjZGVmaW5lIEZXTF9WS0VZX1QJCQkJMHg1NA0KKyNkZWZpbmUgRldMX1ZLRVlfVQkJCQkweDU1DQorI2RlZmluZSBGV0xfVktFWV9WCQkJCTB4NTYNCisjZGVmaW5lIEZXTF9WS0VZX1cJCQkJMHg1Nw0KKyNkZWZpbmUgRldMX1ZLRVlfWAkJCQkweDU4DQorI2RlZmluZSBGV0xfVktFWV9ZCQkJCTB4NTkNCisjZGVmaW5lIEZXTF9WS0VZX1oJCQkJMHg1QQ0KKyNkZWZpbmUgRldMX1ZLRVlfTFdpbgkJCTB4NUINCisjZGVmaW5lIEZXTF9WS0VZX0NvbW1hbmQJCTB4NUINCisjZGVmaW5lIEZXTF9WS0VZX1JXaW4JCQkweDVDDQorI2RlZmluZSBGV0xfVktFWV9BcHBzCQkJMHg1RA0KKyNkZWZpbmUgRldMX1ZLRVlfU2xlZXAJCQkweDVGDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQwCQkweDYwDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQxCQkweDYxDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQyCQkweDYyDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQzCQkweDYzDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ0CQkweDY0DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ1CQkweDY1DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ2CQkweDY2DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ3CQkweDY3DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ4CQkweDY4DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ5CQkweDY5DQorI2RlZmluZSBGV0xfVktFWV9NdWx0aXBseQkJMHg2QQ0KKyNkZWZpbmUgRldMX1ZLRVlfQWRkCQkJMHg2Qg0KKyNkZWZpbmUgRldMX1ZLRVlfU2VwYXJhdG9yCQkweDZDDQorI2RlZmluZSBGV0xfVktFWV9TdWJ0cmFjdAkJMHg2RA0KKyNkZWZpbmUgRldMX1ZLRVlfRGVjaW1hbAkJMHg2RQ0KKyNkZWZpbmUgRldMX1ZLRVlfRGl2aWRlCQkJMHg2Rg0KKyNkZWZpbmUgRldMX1ZLRVlfRjEgICAgICAgICAgICAgMHg3MA0KKyNkZWZpbmUgRldMX1ZLRVlfRjIgICAgICAgICAgICAgMHg3MQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjMgICAgICAgICAgICAgMHg3Mg0KKyNkZWZpbmUgRldMX1ZLRVlfRjQgICAgICAgICAgICAgMHg3Mw0KKyNkZWZpbmUgRldMX1ZLRVlfRjUgICAgICAgICAgICAgMHg3NA0KKyNkZWZpbmUgRldMX1ZLRVlfRjYgICAgICAgICAgICAgMHg3NQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjcgICAgICAgICAgICAgMHg3Ng0KKyNkZWZpbmUgRldMX1ZLRVlfRjggICAgICAgICAgICAgMHg3Nw0KKyNkZWZpbmUgRldMX1ZLRVlfRjkgICAgICAgICAgICAgMHg3OA0KKyNkZWZpbmUgRldMX1ZLRVlfRjEwICAgICAgICAgICAgMHg3OQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjExICAgICAgICAgICAgMHg3QQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjEyICAgICAgICAgICAgMHg3Qg0KKyNkZWZpbmUgRldMX1ZLRVlfRjEzICAgICAgICAgICAgMHg3Qw0KKyNkZWZpbmUgRldMX1ZLRVlfRjE0ICAgICAgICAgICAgMHg3RA0KKyNkZWZpbmUgRldMX1ZLRVlfRjE1ICAgICAgICAgICAgMHg3RQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjE2ICAgICAgICAgICAgMHg3Rg0KKyNkZWZpbmUgRldMX1ZLRVlfRjE3ICAgICAgICAgICAgMHg4MA0KKyNkZWZpbmUgRldMX1ZLRVlfRjE4ICAgICAgICAgICAgMHg4MQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjE5ICAgICAgICAgICAgMHg4Mg0KKyNkZWZpbmUgRldMX1ZLRVlfRjIwICAgICAgICAgICAgMHg4Mw0KKyNkZWZpbmUgRldMX1ZLRVlfRjIxICAgICAgICAgICAgMHg4NA0KKyNkZWZpbmUgRldMX1ZLRVlfRjIyICAgICAgICAgICAgMHg4NQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjIzICAgICAgICAgICAgMHg4Ng0KKyNkZWZpbmUgRldMX1ZLRVlfRjI0ICAgICAgICAgICAgMHg4Nw0KKyNkZWZpbmUgRldMX1ZLRVlfTnVuTG9jawkJMHg5MA0KKyNkZWZpbmUgRldMX1ZLRVlfU2Nyb2xsCQkJMHg5MQ0KKyNkZWZpbmUgRldMX1ZLRVlfTFNoaWZ0CQkJMHhBMA0KKyNkZWZpbmUgRldMX1ZLRVlfUlNoaWZ0CQkJMHhBMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTENvbnRyb2wJCTB4QTINCisjZGVmaW5lIEZXTF9WS0VZX1JDb250cm9sCQkweEEzDQorI2RlZmluZSBGV0xfVktFWV9MTWVudQkJCTB4QTQNCisjZGVmaW5lIEZXTF9WS0VZX1JNZW51CQkJMHhBNQ0KKyNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9CYWNrCQkJMHhBNg0KKyNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9Gb3J3YXJkCQkweEE3DQorI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX1JlZnJlc2gJCTB4QTgNCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfU3RvcAkJCTB4QTkNCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfU2VhcmNoCQkJMHhBQQ0KKyNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9GYXZvcml0ZXMJCTB4QUINCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfSG9tZQkJCTB4QUMNCisjZGVmaW5lIEZXTF9WS0VZX1ZPTFVNRV9NdXRlCQkJMHhBRA0KKyNkZWZpbmUgRldMX1ZLRVlfVk9MVU1FX0Rvd24JCQkweEFFDQorI2RlZmluZSBGV0xfVktFWV9WT0xVTUVfVXAJCQkJMHhBRg0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTkVYVF9UcmFjawkJMHhCMA0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfUFJFVl9UcmFjawkJMHhCMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfU3RvcAkJCQkweEIyDQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9QTEFZX1BhdXNlCQkweEIzDQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfTWFpbAkJMHhCNA0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTEFVTkNIX01FRElBX1NlbGVjdAkJMHhCNQ0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTEFVTkNIX0FQUDEJCQkJMHhCNg0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTEFVTkNIX0FQUDIJCQkJMHhCNw0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzEJCQkJCTB4QkENCisjZGVmaW5lIEZXTF9WS0VZX09FTV9QbHVzCQkJCTB4QkINCisjZGVmaW5lIEZXTF9WS0VZX09FTV9Db21tYQkJCQkweEJDDQorI2RlZmluZSBGV0xfVktFWV9PRU1fTWludXMJCQkJMHhCRA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNX1BlcmlvZAkJCQkweEJFDQorI2RlZmluZSBGV0xfVktFWV9PRU1fMgkJCTB4QkYNCisjZGVmaW5lIEZXTF9WS0VZX09FTV8zCQkJMHhDMA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzQJCQkweERCDQorI2RlZmluZSBGV0xfVktFWV9PRU1fNQkJCTB4REMNCisjZGVmaW5lIEZXTF9WS0VZX09FTV82CQkJMHhERA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzcJCQkweERFDQorI2RlZmluZSBGV0xfVktFWV9PRU1fOAkJCTB4REYNCisjZGVmaW5lIEZXTF9WS0VZX09FTV8xMDIJCTB4RTINCisjZGVmaW5lIEZXTF9WS0VZX1Byb2Nlc3NLZXkgICAgIDB4RTUNCisjZGVmaW5lIEZXTF9WS0VZX1BhY2tldAkJCTB4RTcNCisjZGVmaW5lIEZXTF9WS0VZX0F0dG4JCQkweEY2DQorI2RlZmluZSBGV0xfVktFWV9DcnNlbAkJCTB4RjcNCisjZGVmaW5lIEZXTF9WS0VZX0V4c2VsCQkJMHhGOA0KKyNkZWZpbmUgRldMX1ZLRVlfRXJlb2YJCQkweEY5DQorI2RlZmluZSBGV0xfVktFWV9QbGF5CQkJMHhGQQ0KKyNkZWZpbmUgRldMX1ZLRVlfWm9vbQkJCTB4RkINCisjZGVmaW5lIEZXTF9WS0VZX05vTmFtZQkJCTB4RkMNCisjZGVmaW5lIEZXTF9WS0VZX1BBMQkJCTB4RkQNCisjZGVmaW5lIEZXTF9WS0VZX09FTV9DbGVhcgkJMHhGRQ0KKyNkZWZpbmUgRldMX1ZLRVlfVW5rbm93bgkJMA0KKyNkZWZpbmUgRldMX1ZLRVlTVEFURV9Ub2dnbGVkCTB4MDAwMQ0KKyNkZWZpbmUgRldMX1ZLRVlTVEFURV9Eb3duCQkweDAxMDANCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0bWdyLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0bWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNGYzNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9XSURHRVRNR1JfSA0KKyNkZWZpbmUgX0ZXTF9XSURHRVRNR1JfSA0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGU7DQorZW51bSBGV0xfV0dUUkVMQVRJT04gew0KKyAgICBGV0xfV0dUUkVMQVRJT05fUGFyZW50ID0gMCwNCisgICAgRldMX1dHVFJFTEFUSU9OX093bmVyLA0KKyAgICBGV0xfV0dUUkVMQVRJT05fRmlyc3RTaWJsaW5nLA0KKyAgICBGV0xfV0dUUkVMQVRJT05fUHJpb3JTaWJsaW5nLA0KKyAgICBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcsDQorICAgIEZXTF9XR1RSRUxBVElPTl9MYXN0U2libGluZywNCisgICAgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQsDQorICAgIEZXTF9XR1RSRUxBVElPTl9MYXN0Q2hpbGQsDQorICAgIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtDQorfTsNCitjbGFzcyBJRldMX1dpZGdldE1ncg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUNvdW50V2lkZ2V0cyhJRldMX1dpZGdldCAqcFBhcmVudCA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRldMX1dpZGdldCoJR2V0V2lkZ2V0KEZYX0lOVDMyIG5JbmRleCwgSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCUdldFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX1dHVFJFTEFUSU9OIGVSZWxhdGlvbikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgbkluZGV4KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzV2lkZ2V0KEZYX0xQVk9JRCBwT2JqKSA9IDA7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCVJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENhcGFiaWxpdHkoKSA9IDA7DQorfTsNCitJRldMX1dpZGdldE1ncioJCUZXTF9HZXRXaWRnZXRNZ3IoKTsNCitGWF9CT09MIEZXTF9XaWRnZXRJc0NoaWxkKElGV0xfV2lkZ2V0ICpwYXJlbnQsIElGV0xfV2lkZ2V0ICpmaW5kKTsNCisjZGVmaW5lIEZXTF9XR1RNR1JfRGlzYWJsZVRocmVhZAkweDAwMDAwMDAxDQorI2RlZmluZSBGV0xfV0dUTUdSX0Rpc2FibGVGb3JtCQkweDAwMDAwMDAyDQorY2xhc3MgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25TZXRDYXBhYmlsaXR5KEZYX0RXT1JEIGR3Q2FwYWJpbGl0eSA9IEZXTF9XR1RNR1JfRGlzYWJsZVRocmVhZCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyIE9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkgPSAwOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIgIE9uRHJhd1dpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQorfTsNCitGV0xfRVJSIEZXTF9XaWRnZXRNZ3JTbmFwc2hvdChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgKnNhdmVGaWxlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Z3bC5oIGIveGZhL2luY2x1ZGUvZndsL2Z3bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzYzYTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvZndsLmgKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfSA0KKyNkZWZpbmUgX0ZXTF9IDQorI2luY2x1ZGUgImNvcmUvZndsX2Vycm9yLmgiDQorI2luY2x1ZGUgImNvcmUvZndsX3RhcmdldC5oIg0KKyNpbmNsdWRlICJjb3JlL2Z3bF90aHJlYWQuaCINCisjaW5jbHVkZSAiY29yZS9md2xfbm90ZS5oIg0KKyNpbmNsdWRlICJjb3JlL2Z3bF93aWRnZXRkZWYuaCINCisjaW5jbHVkZSAiY29yZS9md2xfdGhlbWUuaCINCisjaW5jbHVkZSAiY29yZS9md2xfd2lkZ2V0LmgiDQorI2luY2x1ZGUgImNvcmUvZndsX2NvbnRlbnQuaCINCisjaW5jbHVkZSAiY29yZS9md2xfcGFuZWwuaCINCisjaW5jbHVkZSAiY29yZS9md2xfZm9ybS5oIg0KKyNpbmNsdWRlICJjb3JlL2Z3bF93aWRnZXRtZ3IuaCINCisjaW5jbHVkZSAiY29yZS9md2xfdGltZXIuaCINCisjaW5jbHVkZSAiY29yZS9md2xfYXBwLmgiDQorI2luY2x1ZGUgImNvcmUvZndsX2dyaWQuaCINCisjaW5jbHVkZSAiYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJiYXNld2lkZ2V0L2Z3bF9jaGVja2JveC5oIg0KKyNpbmNsdWRlICJiYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaCINCisjaW5jbHVkZSAiYmFzZXdpZGdldC9md2xfbGlzdGJveC5oIg0KKyNpbmNsdWRlICJiYXNld2lkZ2V0L2Z3bF9lZGl0LmgiDQorI2luY2x1ZGUgImJhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaCINCisjaW5jbHVkZSAiYmFzZXdpZGdldC9md2xfY29tYm9ib3guaCINCisjaW5jbHVkZSAiYmFzZXdpZGdldC9md2xfbWVudS5oIg0KKyNpbmNsdWRlICJiYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgiDQorI2luY2x1ZGUgImJhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyLmgiDQorI2luY2x1ZGUgImJhc2V3aWRnZXQvZndsX3NwaW5idXR0b24uaCINCisjaW5jbHVkZSAiYmFzZXdpZGdldC9md2xfYmFyY29kZS5oIg0KKyNpbmNsdWRlICJiYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlLmgiDQorI2luY2x1ZGUgImJhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsLmgiDQorI2luY2x1ZGUgImJhc2V3aWRnZXQvZndsX2NhcmV0LmgiDQorI2luY2x1ZGUgImxpZ2h0d2lkZ2V0L2FwcC5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC93aWRnZXQuaCINCisjaW5jbHVkZSAibGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC9jaGVja2JveC5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC9zY3JvbGxiYXIuaCINCisjaW5jbHVkZSAibGlnaHR3aWRnZXQvbGlzdGJveC5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC9waWN0dXJlYm94LmgiDQorI2luY2x1ZGUgImxpZ2h0d2lkZ2V0L2VkaXQuaCINCisjaW5jbHVkZSAibGlnaHR3aWRnZXQvY29tYm9ib3guaCINCisjaW5jbHVkZSAibGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuaCINCisjaW5jbHVkZSAibGlnaHR3aWRnZXQvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC90aGVtZS5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC90b29sdGlwY3RybC5oIg0KKyNpbmNsdWRlICJsaWdodHdpZGdldC9jYXJldC5oIg0KKyNpbmNsdWRlICJ0aGVtZS91dGlscy5oIg0KKyNpbmNsdWRlICJ0aGVtZS93aWRnZXR0cC5oIg0KKyNpbmNsdWRlICJ0aGVtZS9iYXJjb2RldHAuaCINCisjaW5jbHVkZSAidGhlbWUvY2hlY2tib3h0cC5oIg0KKyNpbmNsdWRlICJ0aGVtZS9jb21ib2JveHRwLmgiDQorI2luY2x1ZGUgInRoZW1lL2RhdGV0aW1lcGlja2VydHAuaCINCisjaW5jbHVkZSAidGhlbWUvZWRpdHRwLmgiDQorI2luY2x1ZGUgInRoZW1lL2Zvcm10cC5oIg0KKyNpbmNsdWRlICJ0aGVtZS9saXN0Ym94dHAuaCINCisjaW5jbHVkZSAidGhlbWUvbW9udGhjYWxlbmRhcnRwLmgiDQorI2luY2x1ZGUgInRoZW1lL3BpY3R1cmVib3h0cC5oIg0KKyNpbmNsdWRlICJ0aGVtZS9wdXNoYnV0dG9udHAuaCINCisjaW5jbHVkZSAidGhlbWUvc2Nyb2xsYmFydHAuaCINCisjaW5jbHVkZSAidGhlbWUvd2lkZ2V0dHAuaCINCisjaW5jbHVkZSAidGhlbWUvYmFyY29kZXRwLmgiDQorI2luY2x1ZGUgInRoZW1lL2NhcmV0dHAuaCINCisjaW5jbHVkZSAiYWRhcHRlci9md2xfYWRhcHRlcm5hdGl2ZS5oIg0KKyNpbmNsdWRlICJhZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmgiDQorI2luY2x1ZGUgImFkYXB0ZXIvZndsX2FkYXB0ZXJ0aW1lcm1nci5oIg0KKyNpbmNsdWRlICJhZGFwdGVyL2Z3bF9hZGFwdGVyd2lkZ2V0bWdyLmgiDQorI2luY2x1ZGUgImFkYXB0ZXIvZndsX2FkYXB0ZXJjdXJzb3JtZ3IuaCINCisjaW5jbHVkZSAiYWRhcHRlci9md2xfYWRhcHRlcm1vbml0b3JtZ3IuaCINCisjaW5jbHVkZSAiYWRhcHRlci9md2xfYWRhcHRlcmNsaXBib2FyZG1nci5oIg0KKyNpbmNsdWRlICJhZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaCINCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYXBwLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5MTk1MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9hcHAuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9BUFBfTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9BUFBfTElHSFRfSA0KK2NsYXNzIENGV0xfVGhlbWU7DQorY2xhc3MgSUZXTF9BcHA7DQorY2xhc3MgQ0ZXTF9BcHA7DQorY2xhc3MgQ0ZXTF9BcHAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQXBwKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQXBwKCk7DQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgQ0ZXTF9UaGVtZSoJCUdldFRoZW1lKCk7DQorICAgIEZXTF9FUlIJCUV4aXQoRlhfSU5UMzIgaUV4aXRDb2RlID0gMCk7DQorICAgIElGV0xfQXBwKglHZXRBcHAoKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfQXBwCSptX3BBcHBJbXA7DQorICAgIENGV0xfVGhlbWUJKm1fcFRoZW1lUHJvdmlkZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYmFyY29kZS5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZjZmVhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuaApAQCAtMCwwICsxLDE3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQkFSQ09ERV9MSUdIVF9IDQorI2RlZmluZSBfRldMX0JBUkNPREVfTElHSFRfSA0KK2NsYXNzIENGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllczsNCitjbGFzcyBJRldMX0JhcmNvZGVEUDsNCitjbGFzcyBDRldMX0VkaXQ7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlOw0KK2NsYXNzIENGV0xfQmFyY29kZURQOw0KK2NsYXNzIENGV0xfQmFyY29kZSA6IHB1YmxpYyBDRldMX0VkaXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZXTF9CYXJjb2RlKiBDcmVhdGUoKTsNCisgICAgRldMX0VSUglJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgICAgdm9pZAkJU2V0VHlwZShCQ19UWVBFIHR5cGUpOw0KKyAgICBGWF9CT09MCQlJc1Byb3RlY3RlZFR5cGUoKTsNCitwdWJsaWM6DQorICAgIHZvaWQJCVNldENoYXJFbmNvZGluZyhCQ19DSEFSX0VOQ09ESU5HIGVuY29kaW5nKQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfQ0hBUkVOQ09ESU5HOw0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2VDaGFyRW5jb2RpbmcgPSBlbmNvZGluZzsNCisgICAgfQ0KKyAgICB2b2lkCQlTZXRNb2R1bGVIZWlnaHQoRlhfSU5UMzIgaGVpZ2h0KQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFSEVJR0hUOw0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX25Nb2R1bGVIZWlnaHQgPSBoZWlnaHQ7DQorICAgIH0NCisgICAgdm9pZAkJU2V0TW9kdWxlV2lkdGgoRlhfSU5UMzIgd2lkdGgpDQorICAgIHsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSDsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9uTW9kdWxlV2lkdGggPSB3aWR0aDsNCisgICAgfQ0KKyAgICB2b2lkCQlTZXREYXRhTGVuZ3RoKEZYX0lOVDMyIGRhdGFMZW5ndGgpDQorICAgIHsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9EQVRBTEVOR1RIOw0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX25EYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsNCisgICAgICAgICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5TZXRMaW1pdChkYXRhTGVuZ3RoKTsNCisgICAgfQ0KKyAgICB2b2lkCQlTZXRDYWxDaGVja3N1bShGWF9JTlQzMiBjYWxDaGVja3N1bSkNCisgICAgew0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0NBTENIRUNLU1VNOw0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX25DYWxDaGVja3N1bSA9IGNhbENoZWNrc3VtOw0KKyAgICB9DQorICAgIHZvaWQJCVNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBwcmludENoZWNrc3VtKQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTTsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9iUHJpbnRDaGVja3N1bSA9IHByaW50Q2hlY2tzdW07DQorICAgIH0NCisgICAgdm9pZAkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfVEVYVExPQ0FUSU9OOw0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2VUZXh0TG9jYXRpb24gPSBsb2NhdGlvbjsNCisgICAgfQ0KKyAgICB2b2lkCQlTZXRXaWRlTmFycm93UmF0aW8oRlhfSU5UMzIgcmF0aW8pDQorICAgIHsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9XSURFTkFSUk9XUkFUSU87DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fbldpZGVOYXJyb3dSYXRpbyA9IHJhdGlvOw0KKyAgICB9DQorICAgIHZvaWQJCVNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0Q2hhcikNCisgICAgew0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX1NUQVJUQ0hBUjsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9jU3RhcnRDaGFyID0gc3RhcnRDaGFyOw0KKyAgICB9DQorICAgIHZvaWQJCVNldEVuZENoYXIoRlhfQ0hBUiBlbmRDaGFyKQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfRU5EQ0hBUjsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9jRW5kQ2hhciA9IGVuZENoYXI7DQorICAgIH0NCisgICAgdm9pZAkJU2V0VmVyc2lvbihGWF9JTlQzMiB2ZXJzaW9uKQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfVkVSU0lPTjsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9uVmVyc2lvbiA9IHZlcnNpb247DQorICAgIH0NCisgICAgdm9pZAkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoRlhfSU5UMzIgZWNMZXZlbCkNCisgICAgew0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0VDTEVWRUw7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fbkVDTGV2ZWwgPSBlY0xldmVsOw0KKyAgICB9DQorICAgIHZvaWQJCVNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkNCisgICAgew0KKyAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX1RSVU5DQVRFRDsNCisgICAgICAgIG1fYmFyY29kZURhdGEubV9iVHJ1bmNhdGVkID0gdHJ1bmNhdGVkOw0KKyAgICB9DQorICAgIHZvaWQJCVJlc2V0QmFyY29kZUF0dHJpYnV0ZXMoKQ0KKyAgICB7DQorICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrID0gMDsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9CYXJjb2RlKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQmFyY29kZSgpOw0KKyAgICBjbGFzcyBDRldMX0JhcmNvZGVEUCA6IHB1YmxpYyBJRldMX0JhcmNvZGVEUA0KKyAgICB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCQlHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCisgICAgICAgIEJDX0NIQVJfRU5DT0RJTkcJCQltX2VDaGFyRW5jb2Rpbmc7DQorICAgICAgICB2aXJ0dWFsIEJDX0NIQVJfRU5DT0RJTkcJR2V0Q2hhckVuY29kaW5nKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9lQ2hhckVuY29kaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIJCQkJCW1fbk1vZHVsZUhlaWdodCwgbV9uTW9kdWxlV2lkdGg7DQorICAgICAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0TW9kdWxlSGVpZ2h0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9uTW9kdWxlSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldE1vZHVsZVdpZHRoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9uTW9kdWxlV2lkdGg7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMgkJCQkJbV9uRGF0YUxlbmd0aDsNCisgICAgICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXREYXRhTGVuZ3RoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9uRGF0YUxlbmd0aDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyCQkJCQltX25DYWxDaGVja3N1bTsNCisgICAgICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRDYWxDaGVja3N1bSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG1fbkNhbENoZWNrc3VtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTAkJCQkJCW1fYlByaW50Q2hlY2tzdW07DQorICAgICAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0UHJpbnRDaGVja3N1bSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG1fYlByaW50Q2hlY2tzdW07DQorICAgICAgICB9DQorDQorICAgICAgICBCQ19URVhUX0xPQwkJCQkJbV9lVGV4dExvY2F0aW9uOw0KKyAgICAgICAgdmlydHVhbCBCQ19URVhUX0xPQwkJCUdldFRleHRMb2NhdGlvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG1fZVRleHRMb2NhdGlvbjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyCQkJCQltX25XaWRlTmFycm93UmF0aW87DQorICAgICAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0V2lkZU5hcnJvd1JhdGlvKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9uV2lkZU5hcnJvd1JhdGlvOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQ0hBUgkJCQkJCW1fY1N0YXJ0Q2hhciwgbV9jRW5kQ2hhcjsNCisgICAgICAgIHZpcnR1YWwgRlhfQ0hBUgkJCQlHZXRTdGFydENoYXIoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBtX2NTdGFydENoYXI7DQorICAgICAgICB9DQorICAgICAgICB2aXJ0dWFsIEZYX0NIQVIJCQkJR2V0RW5kQ2hhcigpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG1fY0VuZENoYXI7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMgkJCQkJbV9uVmVyc2lvbjsNCisgICAgICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRWZXJzaW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9uVmVyc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyCQkJCQltX25FQ0xldmVsOw0KKyAgICAgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9uRUNMZXZlbDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wJCQkJCQltX2JUcnVuY2F0ZWQ7DQorICAgICAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0VHJ1bmNhdGVkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9iVHJ1bmNhdGVkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRFdPUkQJCQkJCW1fZHdBdHRyaWJ1dGVNYXNrOw0KKyAgICAgICAgdmlydHVhbCBGWF9EV09SRAkJCUdldEJhcmNvZGVBdHRyaWJ1dGVNYXNrKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9kd0F0dHJpYnV0ZU1hc2s7DQorICAgICAgICB9DQorICAgIHB1YmxpYzoNCisgICAgICAgIENGV0xfQmFyY29kZURQKCkNCisgICAgICAgICAgICA6IG1fZHdBdHRyaWJ1dGVNYXNrKDApDQorICAgICAgICB7DQorICAgICAgICB9DQorICAgIH07DQorICAgIENGV0xfQmFyY29kZURQIG1fYmFyY29kZURhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jYXJldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzJlNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DQVJFVF9MSUdIVF9IDQorI2RlZmluZSBfRldMX0NBUkVUX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9DYXJldDsNCitjbGFzcyBDRldMX0NhcmV0IDogcHVibGljIENGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIENGV0xfQ2FyZXQqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCVNob3dDYXJldChGWF9CT09MIGJGbGFnID0gVFJVRSk7DQorICAgIEZXTF9FUlIJR2V0RnJlcXVlbmN5KEZYX0RXT1JEICZlbGFwc2UpOw0KKyAgICBGV0xfRVJSCVNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpOw0KKyAgICBGV0xfRVJSCVNldENvbG9yKENGWF9Db2xvciBjckZpbGwpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9DYXJldCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0NhcmV0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jaGVja2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2IyYmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DSEVDS0JPWF9MSUdIVF9IDQorI2RlZmluZSBfRldMX0NIRUNLQk9YX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9DaGVja0JveERQOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3g7DQorY2xhc3MgQ0ZXTF9DaGVja0JveERQOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZXTF9DaGVja0JveCogQ3JlYXRlKCk7DQorDQorICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQlHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KKyAgICBGV0xfRVJSCQlTZXRDYXB0aW9uKEZYX1dTVFIgd3NDYXB0aW9uKTsNCisgICAgRldMX0VSUgkJU2V0Qm94U2l6ZShGWF9GTE9BVCBmSGVpZ2h0KTsNCisgICAgRlhfSU5UMzIJR2V0Q2hlY2tTdGF0ZSgpOw0KKyAgICBGV0xfRVJSCQlTZXRDaGVja1N0YXRlKEZYX0lOVDMyIGlDaGVjayk7DQorICAgIENGV0xfQ2hlY2tCb3goKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9DaGVja0JveCgpOw0KK3Byb3RlY3RlZDoNCisgICAgY2xhc3MgQ0ZXTF9DaGVja0JveERQIDogcHVibGljIElGV0xfQ2hlY2tCb3hEUA0KKyAgICB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIENGV0xfQ2hlY2tCb3hEUCgpOw0KKyAgICAgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KKyAgICAgICAgdmlydHVhbCBGWF9GTE9BVCBHZXRCb3hTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgICAgIEZYX0ZMT0FUCSAgIG1fZkJveEhlaWdodDsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgICB9Ow0KKyAgICBDRldMX0NoZWNrQm94RFAgbV9jaGVja2JveERhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY29tYm9ib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jb21ib2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzU4NTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY29tYm9ib3guaApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ09NQk9CT1hfTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9DT01CT0JPWF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfQ29tYm9Cb3hEUDsNCitjbGFzcyBDRldMX0NvbWJvQm94Ow0KK2NsYXNzIENGV0xfQ29tYm9Cb3hEUDsNCitjbGFzcyBDRldMX0NvbWJvQm94SXRlbTsNCitjbGFzcyBDRldMX0NvbWJvQm94IDogcHVibGljIENGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIENGV0xfQ29tYm9Cb3gqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgICAgRlhfSU5UMzIJQWRkU3RyaW5nKEZYX1dTVFIgd3NUZXh0KTsNCisgICAgRlhfSU5UMzIJQWRkU3RyaW5nKEZYX1dTVFIgd3NUZXh0LCBDRlhfRElCaXRtYXAgKnBJY29uKTsNCisgICAgRlhfSU5UMzIJUmVtb3ZlQXQoRlhfSU5UMzIgaUluZGV4KTsNCisgICAgRlhfSU5UMzIgICAgUmVtb3ZlQWxsKCk7DQorICAgIEZYX0lOVDMyCUNvdW50SXRlbXMoKTsNCisgICAgRldMX0VSUgkJR2V0VGV4dEJ5SW5kZXgoRlhfSU5UMzIgaUluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgRlhfSU5UMzIJR2V0Q3VyU2VsKCk7DQorICAgIEZXTF9FUlIJCVNldEN1clNlbChGWF9JTlQzMiBpU2VsKTsNCisgICAgRldMX0VSUgkJU2V0RWRpdFRleHQoRlhfV1NUUiB3c1RleHQpOw0KKyAgICBGWF9JTlQzMglHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgICBGV0xfRVJSCQlHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQgPSAwLCBGWF9JTlQzMiBuQ291bnQgPSAtMSkgY29uc3QgOw0KKyAgICBGV0xfRVJSCQlTZXRFZGl0U2VsUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgPSAtMSk7DQorICAgIEZYX0lOVDMyCUdldEVkaXRTZWxSYW5nZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyICZuU3RhcnQpOw0KKyAgICBGWF9JTlQzMglHZXRFZGl0TGltaXQoKTsNCisgICAgRldMX0VSUgkJU2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIEZXTF9FUlIJCUVkaXREb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKTsNCisgICAgRlhfQk9PTAkJRWRpdFJlZG8oRlhfQlNUUiBic1JlY29yZCk7DQorICAgIEZYX0JPT0wJCUVkaXRVbmRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICBGV0xfRVJSCQlTZXRNYXhMaXN0SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpOw0KKyAgICBGV0xfRVJSCQlTZXRJdGVtRGF0YShGWF9JTlQzMiBpSW5kZXgsIEZYX0xQVk9JRCBwRGF0YSk7DQorICAgIEZYX0xQVk9JRAlHZXRJdGVtRGF0YShGWF9JTlQzMiBpSW5kZXgpOw0KKyAgICBGV0xfRVJSCQlTZXRMaXN0VGhlbWUoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUpOw0KKyAgICBGWF9CT09MCQlBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCk7DQorICAgIEZXTF9FUlIJCU9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KK3B1YmxpYzoNCisgICAgRlhfQk9PTAkJRWRpdENhblVuZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdENhblJlZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdFVuZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdFJlZG8oKTsNCisgICAgRlhfQk9PTAkJRWRpdENhbkNvcHkoKTsNCisgICAgRlhfQk9PTAkJRWRpdENhbkN1dCgpOw0KKyAgICBGWF9CT09MCQlFZGl0Q2FuU2VsZWN0QWxsKCk7DQorICAgIEZYX0JPT0wJCUVkaXRDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KKyAgICBGWF9CT09MCQlFZGl0Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQorICAgIEZYX0JPT0wJCUVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQorICAgIEZYX0JPT0wJCUVkaXRTZWxlY3RBbGwoKTsNCisgICAgRlhfQk9PTAkJRWRpdERlbGV0ZSgpOw0KKyAgICBGWF9CT09MCQlFZGl0RGVTZWxlY3QoKTsNCisgICAgRldMX0VSUgkJR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICBGV0xfRVJSCQlFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorICAgIENGV0xfQ29tYm9Cb3goKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9Db21ib0JveCgpOw0KK3Byb3RlY3RlZDoNCisgICAgY2xhc3MgQ0ZXTF9Db21ib0JveERQIDogcHVibGljIElGV0xfQ29tYm9Cb3hEUA0KKyAgICB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIENGV0xfQ29tYm9Cb3hEUCgpOw0KKyAgICAgICAgfkNGV0xfQ29tYm9Cb3hEUCgpOw0KKyAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbikNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICB9DQorDQorICAgICAgICB2aXJ0dWFsCUZYX0lOVDMyCQlDb3VudEl0ZW1zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgICAgIHZpcnR1YWwJRldMX0hMSVNUSVRFTQlHZXRJdGVtKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICAgICAgdmlydHVhbAlGWF9JTlQzMgkJR2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEl0ZW1JbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfSU5UMzIgbkluZGV4KTsNCisNCisgICAgICAgIHZpcnR1YWwJRlhfRFdPUkQJCUdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICAgICAgdmlydHVhbAlGV0xfRVJSCQkJR2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiYgcnRJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRlhfTFBWT0lECQlHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgICAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd1N0eWxlKTsNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9MUENXU1RSIHBzelRleHQpOw0KKyAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJU2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldEl0ZW1IZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldEl0ZW1JY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiYgcnRDaGVjayk7DQorICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlTZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgICAgICAgdmlydHVhbAlGWF9EV09SRAkJR2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICAgICAgdmlydHVhbAlGV0xfRVJSCQkJU2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSk7DQorICAgICAgICB2aXJ0dWFsIEZYX0ZMT0FUCQlHZXRMaXN0SGVpZ2h0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisNCisgICAgICAgIENGWF9QdHJBcnJheQltX2Fyckl0ZW07DQorICAgICAgICBGWF9GTE9BVAkJbV9mTWF4TGlzdEhlaWdodDsNCisgICAgICAgIEZYX0ZMT0FUCQltX2ZJdGVtSGVpZ2h0Ow0KKyAgICB9Ow0KKyAgICBDRldMX0NvbWJvQm94RFAgbV9jb21ib0JveERhdGE7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvQm94SXRlbSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9Db21ib0JveEl0ZW0oKQ0KKyAgICB7DQorICAgICAgICBtX3BESUIgPSBOVUxMOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGCQltX3J0SXRlbTsNCisgICAgRlhfRFdPUkQJCW1fZHdTdHlsZXM7DQorICAgIENGWF9XaWRlU3RyaW5nCW1fd3NUZXh0Ow0KKyAgICBDRlhfRElCaXRtYXAJKm1fcERJQjsNCisgICAgRlhfRFdPUkQJCW1fZHdDaGVja1N0YXRlOw0KKyAgICBDRlhfUmVjdEYJCW1fcnRDaGVja0JveDsNCisgICAgRlhfTFBWT0lECQltX3BEYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2EzODJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfREFURVRJTUVQSUNLRVJfTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9EQVRFVElNRVBJQ0tFUl9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXJEUDsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJEUDsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyIDogcHVibGljIENGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIENGV0xfRGF0ZVRpbWVQaWNrZXIqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgICBGV0xfRVJSIFNldFRvZGF5KEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpOw0KKyAgICBGV0xfRVJSCUdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICBGV0xfRVJSCVNldEVkaXRUZXh0KEZYX1dTVFIgd3NUZXh0KTsNCisgICAgRlhfSU5UMzIgQ291bnRTZWxSYW5nZXMoKTsNCisgICAgRlhfSU5UMzIgR2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KTsNCisgICAgRldMX0VSUiBHZXRDdXJTZWwoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSk7DQorICAgIEZXTF9FUlIJU2V0Q3VyU2VsKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpOw0KKyAgICBGWF9CT09MCQlDYW5VbmRvKCk7DQorICAgIEZYX0JPT0wJCUNhblJlZG8oKTsNCisgICAgRlhfQk9PTAkJVW5kbygpOw0KKyAgICBGWF9CT09MCQlSZWRvKCk7DQorICAgIEZYX0JPT0wJCUNhbkNvcHkoKTsNCisgICAgRlhfQk9PTAkJQ2FuQ3V0KCk7DQorICAgIEZYX0JPT0wJCUNhblNlbGVjdEFsbCgpOw0KKyAgICBGWF9CT09MCQlDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KKyAgICBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCisgICAgRlhfQk9PTAkJUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpOw0KKyAgICBGWF9CT09MCQlTZWxlY3RBbGwoKTsNCisgICAgRlhfQk9PTAkJRGVsZXRlKCk7DQorICAgIEZYX0JPT0wJCURlU2VsZWN0KCk7DQorICAgIEZXTF9FUlIJCUdldEJCb3goQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgRldMX0VSUgkJU2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIEZXTF9FUlIJCU1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXIoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9EYXRlVGltZVBpY2tlcigpOw0KKyAgICBjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyRFAgOiBwdWJsaWMgSUZXTF9EYXRlVGltZVBpY2tlckRQDQorICAgIHsNCisgICAgcHVibGljOg0KKyAgICAgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckRQKCk7DQorICAgICAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbik7DQorICAgICAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0VG9kYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyICZpWWVhciwgRlhfSU5UMzIgJmlNb250aCwgRlhfSU5UMzIgJmlEYXkpOw0KKyAgICAgICAgRlhfSU5UMzIgbV9pWWVhcjsNCisgICAgICAgIEZYX0lOVDMyIG1faU1vbnRoOw0KKyAgICAgICAgRlhfSU5UMzIgbV9pRGF5Ow0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c0RhdGE7DQorICAgIH07DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJEUCBtX0RhdGVUaW1lUGlja2VyRFA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZWRpdC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk5YTIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9FRElUX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfRURJVF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfRWRpdDsNCitjbGFzcyBDRldMX0VkaXQgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZXTF9FZGl0KiBDcmVhdGUoKTsNCisgICAgRldMX0VSUiAgICAgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIEZYX0lOVDMyCUdldFRleHRMZW5ndGgoKSBjb25zdDsNCisgICAgRldMX0VSUgkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQgPSAwLCBGWF9JTlQzMiBuQ291bnQgPSAtMSkgY29uc3Q7DQorICAgIEZXTF9FUlIJCUNsZWFyVGV4dCgpOw0KKyAgICBGWF9JTlQzMglHZXRDYXJldFBvcygpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMglTZXRDYXJldFBvcyhGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpOw0KKyAgICBGV0xfRVJSCQlBZGRTZWxSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCA9IC0xKTsNCisgICAgRlhfSU5UMzIJQ291bnRTZWxSYW5nZXMoKTsNCisgICAgRlhfSU5UMzIJR2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KTsNCisgICAgRldMX0VSUgkJQ2xlYXJTZWxlY3Rpb25zKCk7DQorICAgIEZYX0lOVDMyCUdldExpbWl0KCk7DQorICAgIEZXTF9FUlIJCVNldExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIEZXTF9FUlIJCVNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KKyAgICBGV0xfRVJSCQlTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0KTsNCisgICAgRldMX0VSUgkJSW5zZXJ0KEZYX0lOVDMyIG5TdGFydCwgRlhfTFBDV1NUUiBscFRleHQsIEZYX0lOVDMyIG5MZW4pOw0KKyAgICBGV0xfRVJSCQlEZWxldGVTZWxlY3Rpb25zKCk7DQorICAgIEZXTF9FUlIJCURlbGV0ZVJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpOw0KKyAgICBGV0xfRVJSCQlSZXBsYWNlU2VsZWN0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSk7DQorICAgIEZXTF9FUlIJCVJlcGxhY2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuTGVuLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSk7DQorICAgIEZXTF9FUlIJCURvQ2xpcGJvYXJkKEZYX0lOVDMyIGlDbWQpOw0KKyAgICBGWF9CT09MCQlSZWRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICBGWF9CT09MCQlVbmRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICBGV0xfRVJSCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KTsNCisgICAgRldMX0VSUgkJU2V0TnVtYmVyUmFuZ2UoRlhfSU5UMzIgaU1pbiwgRlhfSU5UMzIgaU1heCk7DQorICAgIEZXTF9FUlIgICAgIFNldEJhY2tDb2xvcihGWF9EV09SRCBkd0NvbG9yKTsNCisgICAgRldMX0VSUiAgICAgU2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb250LCBGWF9GTE9BVCBmU2l6ZSk7DQorICAgIEZYX0JPT0wJCUNhblVuZG8oKTsNCisgICAgRlhfQk9PTAkJQ2FuUmVkbygpOw0KKyAgICBGWF9CT09MCQlVbmRvKCk7DQorICAgIEZYX0JPT0wJCVJlZG8oKTsNCisgICAgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCisgICAgRlhfQk9PTAkJQ3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQorICAgIEZYX0JPT0wJCVBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCisgICAgRlhfQk9PTAkJRGVsZXRlKCk7DQorICAgIHZvaWQJCVNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsNCisgICAgRlhfQk9PTAkJR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCk7DQorICAgIEZYX0JPT0wJCVJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwgRlhfQlNUUiBic1JlcGxhY2UpOw0KKyAgICBDRldMX0VkaXQoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9FZGl0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvbGlzdGJveC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2xpc3Rib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2IxMTMxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2xpc3Rib3guaApAQCAtMCwwICsxLDk4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9MSVNUQk9YX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfTElTVEJPWF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfTGlzdEJveERQOw0KK2NsYXNzIENGV0xfTGlzdEJveDsNCitjbGFzcyBDRldMX0xpc3RJdGVtOw0KK2NsYXNzIENGV0xfTGlzdEJveCA6IHB1YmxpYyBDRldMX1dpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBDRldMX0xpc3RCb3gqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJQWRkRElCaXRtYXAoQ0ZYX0RJQml0bWFwICogcERJQiwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIEZXTF9ITElTVElURU0JQWRkU3RyaW5nKEZYX1dTVFIgd3NBZGQsIEZYX0JPT0wgYlNlbGVjdCA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJRGVsZXRlU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICBGWF9CT09MCQlEZWxldGVBbGwoKTsNCisgICAgRlhfSU5UMzIJQ291bnRTZWxJdGVtcygpOw0KKyAgICBGV0xfSExJU1RJVEVNCUdldFNlbEl0ZW0oRlhfSU5UMzIgbkluZGV4U2VsKTsNCisgICAgRlhfSU5UMzIJR2V0U2VsSW5kZXgoRlhfSU5UMzIgbkluZGV4KTsNCisgICAgRldMX0VSUgkJU2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QgPSBUUlVFKTsNCisgICAgRldMX0VSUgkJR2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIEZXTF9FUlIJCUdldFNjcm9sbFBvcyhGWF9GTE9BVCAmZlBvcywgRlhfQk9PTCBiVmVydCA9IFRSVUUpOw0KKyAgICBGV0xfRVJSCQlTZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZJdGVtSGVpZ2h0KTsNCisgICAgRldMX0hMSVNUSVRFTQlHZXRGb2N1c0l0ZW0oKTsNCisgICAgRldMX0VSUgkJU2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICBGV0xfRVJSKglTb3J0KElGV0xfTGlzdEJveENvbXBhcmUgKnBDb20pOw0KKyAgICBGWF9JTlQzMglDb3VudEl0ZW1zKCk7DQorICAgIEZXTF9ITElTVElURU0JR2V0SXRlbShGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICBGV0xfRVJSCQlTZXRJdGVtU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX1dTVFIgd3NUZXh0KTsNCisgICAgRldMX0VSUgkJR2V0SXRlbVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgRldMX0VSUgkJU2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfTFBWT0lEIHBEYXRhKTsNCisgICAgRlhfTFBWT0lECUdldEl0ZW1EYXRhKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICBGV0xfSExJU1RJVEVNCUdldEl0ZW1BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIEZYX0RXT1JECQlHZXRJdGVtU3RhdGVzKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICBDRldMX0xpc3RCb3goKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9MaXN0Qm94KCk7DQorcHJvdGVjdGVkOg0KKyAgICBjbGFzcyBDRldMX0xpc3RCb3hEUCA6IHB1YmxpYyBJRldMX0xpc3RCb3hEUCwgcHVibGljIENGWF9PYmplY3QNCisgICAgew0KKyAgICBwdWJsaWM6DQorICAgICAgICBDRldMX0xpc3RCb3hEUCgpOw0KKyAgICAgICAgfkNGV0xfTGlzdEJveERQKCk7DQorICAgICAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbik7DQorDQorICAgICAgICB2aXJ0dWFsCUZYX0lOVDMyCQlDb3VudEl0ZW1zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgICAgIHZpcnR1YWwJRldMX0hMSVNUSVRFTQlHZXRJdGVtKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICAgICAgdmlydHVhbAlGWF9JTlQzMgkJR2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEl0ZW1JbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfSU5UMzIgbkluZGV4KTsNCisNCisgICAgICAgIHZpcnR1YWwJRlhfRFdPUkQJCUdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICAgICAgdmlydHVhbAlGV0xfRVJSCQkJR2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiAmcnRJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRlhfTFBWT0lECQlHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorDQorICAgICAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd1N0eWxlKTsNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9MUENXU1RSIHBzelRleHQpOw0KKyAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJU2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldEl0ZW1IZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldEl0ZW1JY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiYgcnRDaGVjayk7DQorICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlTZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgICAgICAgdmlydHVhbAlGWF9EV09SRAkJR2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICAgICAgdmlydHVhbAlGV0xfRVJSCQkJU2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSk7DQorDQorICAgICAgICBDRlhfUHRyQXJyYXkJbV9hcnJJdGVtOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c0RhdGE7DQorICAgICAgICBGWF9GTE9BVAkJbV9mSXRlbUhlaWdodDsNCisgICAgfTsNCisgICAgQ0ZXTF9MaXN0Qm94RFAgbV9MaXN0Qm94RFA7DQorfTsNCitjbGFzcyBDRldMX0xpc3RJdGVtIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX0xpc3RJdGVtKCkNCisgICAgew0KKyAgICAgICAgbV9ydEl0ZW0uUmVzZXQoKTsNCisgICAgICAgIG1fZHdTdGF0ZXMgPSAwOw0KKyAgICAgICAgbV93c1RleHQgPSBMIiI7DQorICAgICAgICBtX3BESUIgPSBOVUxMOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgICAgICBtX2R3Q2hlY2tTdGF0ZSA9IDA7DQorICAgICAgICBtX3J0Q2hlY2tCb3guUmVzZXQoKTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYJCW1fcnRJdGVtOw0KKyAgICBGWF9EV09SRAkJbV9kd1N0YXRlczsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c1RleHQ7DQorICAgIENGWF9ESUJpdG1hcAkqbV9wRElCOw0KKyAgICBGWF9MUFZPSUQJCW1fcERhdGE7DQorICAgIEZYX0RXT1JECQltX2R3Q2hlY2tTdGF0ZTsNCisgICAgQ0ZYX1JlY3RGCQltX3J0Q2hlY2tCb3g7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3BpY3R1cmVib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg3ZDY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3BpY3R1cmVib3guaApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QSUNUVVJFQk9YX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfUElDVFVSRUJPWF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfUGljdHVyZUJveERQOw0KK2NsYXNzIENGV0xfUGljdHVyZUJveDsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hEUDsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZXTF9QaWN0dXJlQm94KiBDcmVhdGUoKTsNCisgICAgRldMX0VSUgkJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgICBDRlhfRElCaXRtYXAqCUdldFBpY3R1cmUoKTsNCisgICAgRldMX0VSUgkJCVNldFBpY3R1cmUoQ0ZYX0RJQml0bWFwICpwQml0bWFwKTsNCisgICAgRlhfRkxPQVQJCUdldFJvdGF0aW9uKCk7DQorICAgIEZXTF9FUlIJCQlTZXRSb3RhdGlvbihGWF9GTE9BVCBmUm90YXRpb24pOw0KKyAgICBGWF9JTlQzMgkJR2V0RmxpcE1vZGUoKTsNCisgICAgRldMX0VSUgkJCVNldEZsaXBNb2RlKEZYX0lOVDMyIGlGbGlwTW9kZSk7DQorICAgIEZYX0lOVDMyCQlHZXRPcGFjaXR5KCk7DQorICAgIEZXTF9FUlIJCQlTZXRPcGFjaXR5KEZYX0lOVDMyIGlPcGFjaXR5KTsNCisgICAgRldMX0VSUgkJCUdldFNjYWxlKEZYX0ZMT0FUICZmU2NhbGVYLCBGWF9GTE9BVCAmZlNjYWxlWSk7DQorICAgIEZXTF9FUlIJCQlTZXRTY2FsZShGWF9GTE9BVCBmU2NhbGVYLCBGWF9GTE9BVCBmU2NhbGVZKTsNCisgICAgRldMX0VSUgkJCUdldE9mZnNldChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQorICAgIEZXTF9FUlIJCQlTZXRPZmZzZXQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgQ0ZXTF9QaWN0dXJlQm94KCk7DQorICAgIHZpcnR1YWwgfkNGV0xfUGljdHVyZUJveCgpOw0KK3Byb3RlY3RlZDoNCisgICAgY2xhc3MgQ0ZXTF9QaWN0dXJlQm94RFAgOiBwdWJsaWMgSUZXTF9QaWN0dXJlQm94RFANCisgICAgew0KKyAgICBwdWJsaWM6DQorICAgICAgICBDRldMX1BpY3R1cmVCb3hEUCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgbV9mUm90YXRpb24gPSAwLjBmOw0KKyAgICAgICAgICAgIG1fZlNjYWxlWCA9IDEuMGY7DQorICAgICAgICAgICAgbV9mU2NhbGVZID0gMS4wZjsNCisgICAgICAgICAgICBtX2ZPZmZTZXRYID0gMC4wZjsNCisgICAgICAgICAgICBtX2ZPZmZTZXRZID0gMC4wZjsNCisgICAgICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgfTsNCisgICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KKyAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldEVycm9yUGljdHVyZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgICAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJR2V0SW5pdGlhbFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0T3BhY2l0eShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgICAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRGbGlwTW9kZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlHZXRNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggJm1hdHJpeCk7DQorICAgICAgICBDRlhfRElCaXRtYXAJKm1fcEJpdG1hcDsNCisgICAgICAgIEZYX0lOVDMyCQltX2lPcGFjaXR5Ow0KKyAgICAgICAgRlhfSU5UMzIJCW1faUZsaXBNb2RlOw0KKyAgICAgICAgRlhfRkxPQVQJCW1fZlJvdGF0aW9uOw0KKyAgICAgICAgRlhfRkxPQVQJCW1fZlNjYWxlWDsNCisgICAgICAgIEZYX0ZMT0FUCQltX2ZTY2FsZVk7DQorICAgICAgICBGWF9GTE9BVAkJbV9mT2ZmU2V0WDsNCisgICAgICAgIEZYX0ZMT0FUCQltX2ZPZmZTZXRZOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c0RhdGE7DQorICAgIH07DQorICAgIENGV0xfUGljdHVyZUJveERQIG1fUGljdHVyZUJveERQOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9wdXNoYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMmExMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9wdXNoYnV0dG9uLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfUFVTSEJVVFRPTl9MSUdIVF9IDQorI2RlZmluZSBfRldMX1BVU0hCVVRUT05fTElHSFRfSA0KK2NsYXNzIENGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllczsNCitjbGFzcyBJRldMX1B1c2hCdXR0b25EUDsNCitjbGFzcyBDRldMX1B1c2hCdXR0b247DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uRFA7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uIDogcHVibGljIENGV0xfV2lkZ2V0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIENGV0xfUHVzaEJ1dHRvbiogQ3JlYXRlKCk7DQorICAgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICAgIEZXTF9FUlIJR2V0Q2FwdGlvbihDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCisgICAgRldMX0VSUiBTZXRDYXB0aW9uKEZYX1dTVFIgd3NDYXB0aW9uKTsNCisgICAgQ0ZYX0RJQml0bWFwKglHZXRQaWN0dXJlKCk7DQorICAgIEZXTF9FUlIJCQlTZXRQaWN0dXJlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCk7DQorICAgIENGV0xfUHVzaEJ1dHRvbigpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b24oKTsNCitwcm90ZWN0ZWQ6DQorICAgIGNsYXNzIENGV0xfUHVzaEJ1dHRvbkRQIDogcHVibGljIElGV0xfUHVzaEJ1dHRvbkRQDQorICAgIHsNCisgICAgcHVibGljOg0KKyAgICAgICAgQ0ZXTF9QdXNoQnV0dG9uRFAoKTogbV9wQml0bWFwKE5VTEwpIHt9DQorICAgICAgICBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KKyAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NhcHRpb247DQorICAgICAgICBDRlhfRElCaXRtYXAJKm1fcEJpdG1hcDsNCisgICAgfTsNCisgICAgQ0ZXTF9QdXNoQnV0dG9uRFAgbV9idXR0b25EYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfU0NST0xMQkFSX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfU0NST0xMQkFSX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXI7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXIgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZXTF9TY3JvbGxCYXIqIENyZWF0ZSgpOw0KKyAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgICAgRlhfQk9PTAkJSXNWZXJ0aWNhbCgpOw0KKyAgICBGV0xfRVJSCQlHZXRSYW5nZShGWF9GTE9BVCAmZk1pbiwgRlhfRkxPQVQgJmZNYXgpOw0KKyAgICBGV0xfRVJSCQlTZXRSYW5nZShGWF9GTE9BVCBmTWluLCBGWF9GTE9BVCBmTWF4KTsNCisgICAgRlhfRkxPQVQJR2V0UGFnZVNpemUoKTsNCisgICAgRldMX0VSUgkJU2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKTsNCisgICAgRlhfRkxPQVQJR2V0U3RlcFNpemUoKTsNCisgICAgRldMX0VSUgkJU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKTsNCisgICAgRlhfRkxPQVQJR2V0UG9zKCk7DQorICAgIEZXTF9FUlIJCVNldFBvcyhGWF9GTE9BVCBmUG9zKTsNCisgICAgRlhfRkxPQVQJR2V0VHJhY2tQb3MoKTsNCisgICAgRldMX0VSUgkJU2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKTsNCisgICAgRlhfQk9PTAkJRG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zID0gMC4wZik7DQorICAgIENGV0xfU2Nyb2xsQmFyKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfU2Nyb2xsQmFyKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdGhlbWUuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC90aGVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTRlZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdGhlbWUuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9USEVNRV9MSUdIVF9IDQorI2RlZmluZSBfRldMX1RIRU1FX0xJR0hUX0gNCitjbGFzcyBDRldMX1RoZW1lQmFja2dyb3VuZDsNCitjbGFzcyBDRldMX1RoZW1lVGV4dDsNCitjbGFzcyBDRldMX1RoZW1lUGFydDsNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfVGhlbWU7DQorY2xhc3MgQ0ZXTF9UaGVtZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9EV09SRAlTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuID0gVFJVRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggJm1hdHJpeCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKTsNCisgICAgdmlydHVhbCBGWF9MUFZPSUQgICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgQ0ZYX1JlY3RGICZydFBhcnQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCUNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcywgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisgICAgQ0ZXTF9UaGVtZSgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1RoZW1lKCk7DQorICAgIEZXTF9FUlIJCVNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQQ1dTVFIgc3RyRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpOw0KKyAgICBDRldMX1dpZGdldFRQKiBHZXRUaGVtZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhfUHRyQXJyYXkJbV9hcnJUaGVtZXM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC90b29sdGlwY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDY5NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9Ub29sVGlwX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfVG9vbFRpcF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfVG9vbFRpcERQOw0KK2NsYXNzIENGV0xfVG9vbFRpcDsNCitjbGFzcyBDRldMX1Rvb2xUaXBEUDsNCitjbGFzcyBDRldMX1Rvb2xUaXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZXTF9Ub29sVGlwKiBDcmVhdGUoKTsNCisgICAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgICAgRldMX0VSUgkJCUdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbik7DQorICAgIEZXTF9FUlIJCQlTZXRDYXB0aW9uKEZYX1dTVFIgd3NDYXB0aW9uKTsNCisgICAgRlhfSU5UMzIJIAlHZXRJbml0aWFsRGVsYXkoKTsNCisgICAgRlhfSU5UMzIJIAlTZXRJbml0aWFsRGVsYXkoRlhfSU5UMzIgbkRlbGF5VGltZSk7DQorICAgIEZYX0lOVDMyCSAJR2V0QXV0b1BvcERlbGF5KCk7DQorICAgIEZYX0lOVDMyCSAJU2V0QXV0b1BvcERlbGF5KEZYX0lOVDMyIG5EZWxheVRpbWUpOw0KKyAgICBDRlhfRElCaXRtYXAqCUdldFRvb2xUaXBJY29uKCk7DQorICAgIEZXTF9FUlIJCQlTZXRUb29sVGlwSWNvbihDRlhfRElCaXRtYXAqIHBCaXRtYXApOw0KKyAgICBDRlhfU2l6ZUYJCUdldFRvb2xUaXBJY29uU2l6ZSgpOw0KKyAgICBGV0xfRVJSCQkJU2V0VG9vbFRpcEljb25TaXplKCBDRlhfU2l6ZUYgZlNpemUpOw0KKyAgICBGV0xfRVJSCQlTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvcik7DQorICAgIEZXTF9FUlIJCVNob3coKTsNCisgICAgRldMX0VSUgkJSGlkZSgpOw0KKyAgICBDRldMX1Rvb2xUaXAoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9Ub29sVGlwKCk7DQorcHJvdGVjdGVkOg0KKyAgICBjbGFzcyBDRldMX1Rvb2xUaXBEUCA6IHB1YmxpYyBJRldMX1Rvb2xUaXBEUA0KKyAgICB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIENGV0xfVG9vbFRpcERQKCk7DQorICAgICAgICBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KKyAgICAgICAgRlhfSU5UMzIJIAlHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgRlhfSU5UMzIJIAlHZXRBdXRvUG9wRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKglHZXRUb29sVGlwSWNvbihJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgICAgICBDRlhfU2l6ZUYJCUdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgICAgICBDRlhfUmVjdEYJCUdldEFuY2hvcigpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c0NhcHRpb247DQorICAgICAgICBGWF9JTlQzMgkJbV9uSW5pdERlbGF5VGltZTsNCisgICAgICAgIEZYX0lOVDMyCQltX25BdXRvUG9wRGVsYXlUaW1lOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKgltX3BCaXRtYXA7DQorICAgICAgICBDRlhfU2l6ZUYJCW1fZkljb25TaXplOw0KKyAgICAgICAgQ0ZYX1JlY3RGCQltX2ZBbmNob3I7DQorICAgIH07DQorICAgIENGV0xfVG9vbFRpcERQIG1fdG9vbHRpcERhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvd2lkZ2V0LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1YmRkYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC93aWRnZXQuaApAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfV0lER0VUX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfV0lER0VUX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldE1ncjsNCitjbGFzcyBDRldMX01lc3NhZ2U7DQorY2xhc3MgQ0ZXTF9FdmVudDsNCitjbGFzcyBJRldMX1dpZGdldERlbGVnYXRlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0RGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX1dpZGdldFByb3BlcnRpZXMoKQ0KKyAgICB7DQorICAgICAgICBtX2N0bU9uUGFyZW50LlJlc2V0KCk7DQorICAgICAgICBtX3J0V2lkZ2V0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgICAgIG1fZHdTdHlsZXMJCT0gRldMX1dHVFNUWUxFX0NoaWxkOw0KKyAgICAgICAgbV9kd1N0eWxlRXhlcwk9IDA7DQorICAgICAgICBtX2R3U3RhdGVzCQk9IDA7DQorICAgICAgICBtX3BQYXJlbnQJCT0gTlVMTDsNCisgICAgICAgIG1fcE93bmVyCQk9IE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcJCW1fd3NXaW5kb3djbGFzczsNCisgICAgQ0ZYX01hdHJpeAkJCW1fY3RtT25QYXJlbnQ7DQorICAgIENGWF9SZWN0RgkJCW1fcnRXaWRnZXQ7DQorICAgIEZYX0RXT1JECQkJbV9kd1N0eWxlczsNCisgICAgRlhfRFdPUkQJCQltX2R3U3R5bGVFeGVzOw0KKyAgICBGWF9EV09SRAkJCW1fZHdTdGF0ZXM7DQorICAgIENGV0xfV2lkZ2V0CQkJKm1fcFBhcmVudDsNCisgICAgQ0ZXTF9XaWRnZXQJCQkqbV9wT3duZXI7DQorfTsNCitjbGFzcyBDRldMX1dpZGdldCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgSUZXTF9XaWRnZXQqCUdldFdpZGdldCgpOw0KKyAgICBGWF9EV09SRAkJUmVsZWFzZSgpOw0KKyAgICBDRldMX1dpZGdldCoJUmV0YWluKCk7DQorICAgIEZYX0RXT1JECQlHZXRSZWZDb3VudCgpIGNvbnN0Ow0KKyAgICBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgRlhfRFdPUkQJCUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CT09MCUlzSW5zdGFuY2UoRlhfV1NUUiB3c0NsYXNzKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCitwdWJsaWM6DQorICAgIEZXTF9FUlIJCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIEZXTF9FUlIJCQlHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiAmcmVjdCk7DQorICAgIEZXTF9FUlIJCQlTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIEZXTF9FUlIJCQlHZXRDbGllbnRSZWN0KENGWF9SZWN0RiAmcnRDbGllbnQpOw0KKyAgICBDRldMX1dpZGdldCoJR2V0UGFyZW50KCk7DQorICAgIEZXTF9FUlIJCQlTZXRQYXJlbnQoQ0ZXTF9XaWRnZXQgKnBQYXJlbnQpOw0KKyAgICBDRldMX1dpZGdldCoJR2V0T3duZXIoKTsNCisgICAgRldMX0VSUgkJCVNldE93bmVyKENGV0xfV2lkZ2V0ICpwT3duZXIpOw0KKyAgICBGWF9EV09SRAkJR2V0U3R5bGVzKCk7DQorICAgIEZXTF9FUlIJCQlNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKTsNCisgICAgRlhfRFdPUkQJCUdldFN0eWxlc0V4KCk7DQorICAgIEZXTF9FUlIJCQlNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgICAgRlhfRFdPUkQJCUdldFN0YXRlcygpOw0KKyAgICBGV0xfRVJSCQkJU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgRldMX0VSUgkJCVNldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQsIEZYX0xQVk9JRCBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOw0KKyAgICBGWF9MUFZPSUQJCUdldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQpOw0KKyAgICBGV0xfRVJSCQkJVXBkYXRlKCk7DQorICAgIEZXTF9FUlIJCQlMb2NrVXBkYXRlKCk7DQorICAgIEZXTF9FUlIJCQlVbmxvY2tVcGRhdGUoKTsNCisgICAgRlhfRFdPUkQJCUhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgRldMX0VSUgkJCVRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQorICAgIEZXTF9FUlIJCQlUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZydCk7DQorICAgIEZXTF9FUlIJCQlHZXRNYXRyaXgoQ0ZYX01hdHJpeCAmbWF0cml4LCBGWF9CT09MIGJHbG9iYWwgPSBGQUxTRSk7DQorICAgIEZXTF9FUlIJCQlTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCisgICAgRldMX0VSUgkJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgRldMX0VSUgkJCUdldFByb3BlcnRpZXMoQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCisgICAgRldMX0VSUgkJCVNldFByb3BlcnRpZXMoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKTsNCisgICAgRldMX0VSUgkJCVJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCA9IE5VTEwpOw0KKyAgICBGV0xfRVJSCQkJU2V0Rm9jdXMoRlhfQk9PTCBiRm9jdXMpOw0KKyAgICBGV0xfRVJSCQkJU2V0R3JhYihGWF9CT09MIGJTZXQpOw0KKyAgICBDRldMX1dpZGdldCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1dpZGdldCgpOw0KKyAgICB2b2lkCQlSZWdpc3RlckV2ZW50VGFyZ2V0KENGV0xfV2lkZ2V0ICpwRXZlbnRTb3VyY2UgPSBOVUxMLCBGWF9EV09SRCBkd0ZpbHRlciA9IEZXTF9FVkVOVF9BTExfTUFTSyk7DQorICAgIHZvaWQJCURpc3BhdGNoRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgQ0ZYX1NpemVGCUNhbGNUZXh0U2l6ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9CT09MIGJNdWx0aUxpbmUgPSBGQUxTRSwgRlhfSU5UMzIgaUxpbmVXaWR0aCA9IC0xKTsNCisgICAgSUZXTF9XaWRnZXQJCQkqbV9wSW1wOw0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlICptX3BEZWxlZ2F0ZTsNCisgICAgQ0ZXTF9XaWRnZXRNZ3IJCSptX3BXaWRnZXRNZ3I7DQorICAgIENGV0xfV2lkZ2V0UHJvcGVydGllcyAqbV9wUHJvcGVydGllczsNCit9Ow0KK2NsYXNzIENGV0xfV2lkZ2V0RGVsZWdhdGUgOiBwdWJsaWMgQ0ZYX09iamVjdCwgcHVibGljIElGV0xfV2lkZ2V0RGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX1dpZGdldERlbGVnYXRlKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfV2lkZ2V0RGVsZWdhdGUoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvYmFyY29kZXRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvYmFyY29kZXRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZTA2YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9iYXJjb2RldHAuaApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9CQVJDT0RFVFBfSA0KKyNkZWZpbmUgX0ZXTF9CQVJDT0RFVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlVFA7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQmFyY29kZVRQKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQmFyY29kZVRQKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NhcmV0dHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jYXJldHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlYTg1YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jYXJldHRwLmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0FSRVRUUF9IDQorI2RlZmluZSBfRldMX0NBUkVUVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9DYXJldFRQOw0KK2NsYXNzIENGV0xfQ2FyZXRUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9DYXJldFRQKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQ2FyZXRUUCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJRHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0RXT1JEIGR3U3RhdGVzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfQ29sb3IgKmNyRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NoZWNrYm94dHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jaGVja2JveHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ZWZmZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jaGVja2JveHRwLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0hFQ0tCT1hUUF9IDQorI2RlZmluZSBfRldMX0NIRUNLQk9YVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9DaGVja0JveFRQOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3hUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9DaGVja0JveFRQKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQ2hlY2tCb3hUUCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlEcmF3Qm94QmsoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9EV09SRCBkd1N0YXRlcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdTaWduKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRCb3gsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd1NpZ25OZXV0cmFsKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3U2lnbkNoZWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3U2lnbkNpcmNsZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd1NpZ25Dcm9zcyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd1NpZ25EaWFtb25kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3U2lnblNxdWFyZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd1NpZ25TdGFyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3U2lnbkJvcmRlcihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0Qm94LCBGWF9CT09MIGJEaXNhYmxlID0gRkFMU0UsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCk7DQorICAgIHZvaWQJaW5pdENoZWNrUGF0aChGWF9GTE9BVCBmQ2hlY2tMZW4pOw0KKyAgICBzdHJ1Y3QgQ0tCVGhlbWVEYXRhIDogcHVibGljIENGWF9PYmplY3Qgew0KKyAgICBwdWJsaWM6DQorICAgICAgICBGWF9BUkdCIGNsckJveEJrWzEzXVsyXTsNCisgICAgICAgIEZYX0FSR0IJY2xyU2lnbkJvcmRlck5vcm1hbDsNCisgICAgICAgIEZYX0FSR0IJY2xyU2lnbkJvcmRlckRpc2FibGU7DQorICAgICAgICBGWF9BUkdCCWNsclNpZ25DaGVjazsNCisgICAgICAgIEZYX0FSR0IJY2xyU2lnbk5ldXRyYWw7DQorICAgICAgICBGWF9BUkdCCWNsclNpZ25OZXV0cmFsTm9ybWFsOw0KKyAgICAgICAgRlhfQVJHQgljbHJTaWduTmV1dHJhbEhvdmVyOw0KKyAgICAgICAgRlhfQVJHQgljbHJTaWduTmV1dHJhbFByZXNzZWQ7DQorICAgIH0gKm1fcFRoZW1lRGF0YTsNCisgICAgQ0ZYX1BhdGggKm1fcENoZWNrUGF0aDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jb21ib2JveHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDM5NzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0NPTUJPQk9YVFBfSA0KKyNkZWZpbmUgX0ZXTF9DT01CT0JPWFRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfQ29tYm9Cb3hUUDsNCitjbGFzcyBDRldMX0NvbWJvQm94VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQ29tYm9Cb3hUUCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0NvbWJvQm94VFAoKTsNCisgICAgdmlydHVhbAlGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lEICAgR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAlEcmF3U3RyZXRoSGFuZGxlcihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgRlhfRFdPUkQgZHdTdGF0ZXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2RhdGV0aW1lcGlja2VydHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9kYXRldGltZXBpY2tlcnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNzc1YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9kYXRldGltZXBpY2tlcnRwLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfREFURVRJTUVQSUNLRVJUUF9IDQorI2RlZmluZSBfRldMX0RBVEVUSU1FUElDS0VSVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlclRQOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlclRQKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQgRHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAlpbml0VGhlbWVEYXRhKCk7DQorICAgIHN0cnVjdCBEVFBUaGVtZURhdGEgOiBwdWJsaWMgQ0ZYX09iamVjdCB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIEZYX0FSR0IgQm94QmtDb2xvclsxM11bMl07DQorICAgIH0gKm1fcFRoZW1lRGF0YTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDczODJlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2VkaXR0cC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0VESVRUUF9IDQorI2RlZmluZSBfRldMX0VESVRUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0VkaXRUUDsNCitjbGFzcyBDRldMX0VkaXRUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9FZGl0VFAoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9FZGl0VFAoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZm9ybXRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZm9ybXRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlNjhlMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9mb3JtdHAuaApAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9GT1JNX1RIRU1FUFJPVklERVJfSA0KKyNkZWZpbmUgX0ZXTF9GT1JNX1RIRU1FUFJPVklERVJfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9Gb3JtVFA7DQorY2xhc3MgQ0ZXTF9Gb3JtVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRm9ybVRQKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfRm9ybVRQKCk7DQorDQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwJRlhfRFdPUkQJU2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lEICAgR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYmIHJ0UGFydCk7DQorcHJvdGVjdGVkOg0KKw0KKyAgICB2b2lkIENhbENsb3NlQm94KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2b2lkIENhbE1heEJveChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZCBDYWxNaW5Cb3goSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZvaWQgQ2FsQ2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZCBDYWxJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpOw0KKw0KKyAgICB2b2lkIERyYXdGb3JtQm9yZGVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBGWF9JTlQzMiBpQWN0aXZlID0gMCk7DQorICAgIHZvaWQgRHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIEZYX0lOVDMyIGlBY3RpdmUgPSAwKTsNCisgICAgdm9pZCBEcmF3TmFycm93Q2FwdGlvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgRlhfSU5UMzIgaUFjdGl2ZSA9IDApOw0KKyAgICB2b2lkIERyYXdDbG9zZUJveChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgRlhfSU5UMzIgaUFjdGl2ZSA9IDApOw0KKyAgICB2b2lkIERyYXdNaW5NYXhCb3hDb21tb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIEZYX0lOVDMyIGlBY3RpdmUgPSAwKTsNCisgICAgdm9pZCBEcmF3TWluaW1pemVCb3goQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIEZYX0lOVDMyIGlBY3RpdmUgPSAwKTsNCisgICAgdm9pZCBEcmF3TWF4aW1pemVCb3goQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYk1heCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgRlhfSU5UMzIgaUFjdGl2ZSA9IDApOw0KKyAgICB2b2lkIERyYXdJY29uSW1hZ2UoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIENGWF9ESUJpdG1hcCAqcERJQml0bWFwLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBGWF9JTlQzMiBpQWN0aXZlID0gMCk7DQorICAgIHZvaWQgU2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpOw0KKyAgICB2b2lkIFRyYW5zTW9kZUNvbG9yKEZYX0FSR0IgY2xyRm9yZSwgRlhfQVJHQiAmY2xyQmFjayk7DQorICAgIHZvaWQgRGVhY3RpdmVGb3JtKCk7DQorICAgIHZvaWQgSW5pdENhcHRpb24oRlhfQk9PTCBiQWN0aXZlKTsNCisgICAgQ0ZYX0RJQml0bWFwCSptX3BBY3RpdmVCaXRtYXA7DQorICAgIENGWF9ESUJpdG1hcAkqbV9wRGVhY3RpdmViaXRtYXA7DQorICAgIENGWF9SZWN0RgkJbV9ydERpc0NhcHRpb247DQorICAgIENGWF9SZWN0RgkJbV9ydERpc0xCb3JkZXI7DQorICAgIENGWF9SZWN0RgkJbV9ydERpc1JCb3JkZXI7DQorICAgIENGWF9SZWN0RgkJbV9ydERpc0JCb3JkZXI7DQorICAgIHN0cnVjdCBTQlRoZW1lRGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgcHVibGljOg0KKyAgICAgICAgRlhfQVJHQiBjbHJIZWFkQktbMl1bNF07DQorICAgICAgICBGWF9BUkdCIGNsckhlYWRFZGdlTGVmdFsyXVszXTsNCisgICAgICAgIEZYX0FSR0IgY2xySGVhZEVkZ2VSaWdodFsyXVszXTsNCisgICAgICAgIEZYX0FSR0IgY2xySGVhZEVkZ2VUb3BbMl1bM107DQorICAgICAgICBGWF9BUkdCIGNsckhlYWRFZGdlQm90dG9tWzJdWzNdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJDbG9zZUJ0QktTdGFydFsyXVszXTsNCisgICAgICAgIEZYX0FSR0IgY2xyQ2xvc2VCdEJLRW5kWzJdWzNdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJDbG9zZUJ0RWRnZUxpZ2h0WzJdWzNdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJDbG9zZUJ0RWRnZURhcmtbMl1bM107DQorICAgICAgICBGWF9BUkdCIGNsck5vcm1hbEJ0QktTdGFydFsyXVszXTsNCisgICAgICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRCS0VuZFsyXVszXTsNCisgICAgICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRFZGdlTGlnaHRbMl1bM107DQorICAgICAgICBGWF9BUkdCIGNsck5vcm1hbEJ0RWRnZURhcmtbMl1bM107DQorICAgICAgICBGWF9BUkdCIGNsckJ0bkVkZ2VPdXRbMl07DQorICAgICAgICBGWF9BUkdCIGNsckJ0bkNvcm5lckxpZ2h0WzJdWzNdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJIZWFkVGV4dFsyXTsNCisgICAgICAgIEZYX0FSR0IgY2xyRm9ybUJvcmRlclsyXVs1XTsNCisgICAgICAgIEZYX0FSR0IgY2xyRm9ybUJvcmRlckxpZ2h0WzJdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJUcmFuc1doaXRlOw0KKyAgICB9ICptX3BUaGVtZURhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvbGlzdGJveHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvbGlzdGJveHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhZTJlYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9saXN0Ym94dHAuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9MSVNUQk9YVFBfSA0KKyNkZWZpbmUgX0ZXTF9MSVNUQk9YVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJUUDsNCitjbGFzcyBDRldMX0xpc3RCb3hUUDsNCitjbGFzcyBDRldMX0xpc3RCb3hUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9MaXN0Qm94VFAoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9MaXN0Qm94VFAoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkIERyYXdMaXN0Qm94SXRlbShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdGF0ZXMsIGNvbnN0IENGWF9SZWN0RiAqcHJ0SXRlbSwgRlhfTFBWT0lEIHBEYXRhID0gTlVMTCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDk5MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvbW9udGhjYWxlbmRhcnRwLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTU9OVEhDQUxFTkRBUlRQX0gNCisjZGVmaW5lIF9GV0xfTU9OVEhDQUxFTkRBUlRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfTW9udGhDYWxlbmRhclRQOw0KK2NsYXNzIENGV0xfTW9udGhDYWxlbmRhclRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCit7DQorcHVibGljOg0KKyAgICBDRldMX01vbnRoQ2FsZW5kYXJUUCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX01vbnRoQ2FsZW5kYXJUUCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsCUZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpOw0KKyAgICB2aXJ0dWFsIEZYX0xQVk9JRCAgIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0JPT0wJCURyYXdUb3RhbEJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRlhfQk9PTAkJRHJhd0hlYWRCayhDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0JPT0wJCURyYXdMQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRlhfQk9PTAkJRHJhd1JCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICBGWF9CT09MCQlEcmF3RGF0ZXNJbkJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRlhfQk9PTAkJRHJhd0RhdGVzSW5DaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICBGWF9CT09MCQlEcmF3VG9kYXlDaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICBGWF9CT09MCQlEcmF3SFNlcGVyYXRvcihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0JPT0wJCURyYXdXZWVrTnVtU2VwKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRldMVEhFTUVfU1RBVEUgR2V0U3RhdGUoRlhfRFdPUkQgZHdGV0xTdGF0ZXMpOw0KKyAgICB2b2lkCVNldFRoZW1lRGF0YShGWF9EV09SRCBkd1RoZW1lSUQpOw0KKyAgICBjbGFzcyBNQ1RoZW1lRGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorICAgIHsNCisgICAgcHVibGljOg0KKyAgICAgICAgRlhfQVJHQiBjbHJDYXB0aW9uOw0KKyAgICAgICAgRlhfQVJHQiBjbHJTZXBlcmF0b3I7DQorICAgICAgICBGWF9BUkdCIGNsckRhdGVzSG92ZXJCSzsNCisgICAgICAgIEZYX0FSR0IgY2xyRGF0ZXNTZWxlY3RlZEJLOw0KKyAgICAgICAgRlhfQVJHQiBjbHJEYXRlc0NpcmNsZTsNCisgICAgICAgIEZYX0FSR0IgY2xyVG9kYXk7DQorICAgICAgICBGWF9BUkdCIGNsckJLOw0KKyAgICB9ICptX3BUaGVtZURhdGE7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUmVzb3VyY2U7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcGljdHVyZWJveHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcGljdHVyZWJveHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4YWMwNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9waWN0dXJlYm94dHAuaApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QSUNUVVJFQk9YVFBfSA0KKyNkZWZpbmUgX0ZXTF9QSUNUVVJFQk9YVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94VFA7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfUGljdHVyZUJveFRQKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfUGljdHVyZUJveFRQKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NmE1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcHVzaGJ1dHRvbnRwLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfUFVTSEJVVFRPTlRQX0gNCisjZGVmaW5lIF9GV0xfUFVTSEJVVFRPTlRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvblRQOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvblRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCit7DQorcHVibGljOg0KKyAgICBDRldMX1B1c2hCdXR0b25UUCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b25UUCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lEICAgR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCk7DQorICAgIHZvaWQJU2V0VG9wTGluZUNvbG9yKEZYX0RXT1JEICpwRGF0YSk7DQorICAgIHZvaWQJU2V0TGVmdExpbmVDb2xvcihGWF9EV09SRCAqcERhdGEpOw0KKyAgICB2b2lkCVNldFJpZ2h0TGluZUNvbG9yKEZYX0RXT1JEICpwRGF0YSk7DQorICAgIHZvaWQJU2V0Qm90dG9tTGluZUNvbG9yKEZYX0RXT1JEICpwRGF0YSk7DQorICAgIHZvaWQJU2V0QmFja2dyb3VkQ29sb3IoRlhfRFdPUkQgKnBEYXRhKTsNCisgICAgdm9pZAlTZXRDYXB0aW9uQ29sb3IoRlhfRFdPUkQgKnBEYXRhKTsNCisgICAgdm9pZAlTZXRDb3JuZXJDb2xvcihGWF9EV09SRCAqcERhdGEpOw0KKyAgICBGWF9JTlQzMglHZXRDb2xvcklEKEZYX0RXT1JEIGR3U3RhdGVzKTsNCisNCisgICAgc3RydWN0IFBCVGhlbWVEYXRhIDogQ0ZYX09iamVjdCB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIEZYX0FSR0IgY2xyQm9yZGVyWzVdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJTdGFydFs1XTsNCisgICAgICAgIEZYX0FSR0IgY2xyRW5kWzVdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJGaWxsWzVdOw0KKyAgICB9ICptX3BUaGVtZURhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjE5MjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9TQ1JPTExCQVJUUF9IDQorI2RlZmluZSBfRldMX1NDUk9MTEJBUlRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFyVFA7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9TY3JvbGxCYXJUUCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1Njcm9sbEJhclRQKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJU2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCisgICAgdmlydHVhbCBGWF9MUFZPSUQJR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlEcmF3VGh1bWJCdG4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0JPT0wgYlZlcnQsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgRlhfQk9PTCBiUGF3QnV0dG9uID0gVFJVRSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdUcmFjayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfQk9PTCBiVmVydCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBGWF9CT09MIGJMb3dlclRyYWNrLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd01heE1pbkJ0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZCAgICBEcmF3UGF3KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCk7DQorICAgIHN0cnVjdCBTQlRoZW1lRGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgcHVibGljOg0KKyAgICAgICAgRlhfQVJHQiBjbHJQYXdDb2xvckxpZ2h0WzRdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJQYXdDb2xvckRhcmtbNF07DQorICAgICAgICBGWF9BUkdCIGNsckJ0bkJLWzRdWzJdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJCdG5Cb3JkZXJbNF07DQorICAgICAgICBGWF9BUkdCIGNsclRyYWNrQktTdGFydDsNCisgICAgICAgIEZYX0FSR0IgY2xyVHJhY2tCS0VuZDsNCisgICAgfSAqbV9wVGhlbWVEYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL3V0aWxzLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWI2YjU1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3V0aWxzLmgKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmCV9GV0xfVEhFTUVfVVRJTFNfSA0KKyNkZWZpbmUJX0ZXTF9USEVNRV9VVElMU19IDQorI2RlZmluZSBUSEVNRV9YUFNpbWlsYXINCitlbnVtIEZXTFRIRU1FX0VER0Ugew0KKyAgICBGV0xUSEVNRV9FREdFX0ZsYXQgPSAwLA0KKyAgICBGV0xUSEVNRV9FREdFX1JhaXNlZCwNCisgICAgRldMVEhFTUVfRURHRV9TdW5rZW4NCit9Ow0KK2VudW0gRldMVEhFTUVfU1RBVEUgew0KKyAgICBGV0xUSEVNRV9TVEFURV9Ob3JtYWwgPSAxLA0KKyAgICBGV0xUSEVNRV9TVEFURV9Ib3ZlciwNCisgICAgRldMVEhFTUVfU1RBVEVfUHJlc3NlZCwNCisgICAgRldMVEhFTUVfU1RBVEVfRGlzYWJhbGUNCit9Ow0KK2VudW0gRldMVEhFTUVfRElSRUNUSU9OIHsNCisgICAgRldMVEhFTUVfRElSRUNUSU9OX1VwID0gMCwNCisgICAgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sDQorICAgIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LA0KKyAgICBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GV0xDT0xPUiB7DQorICAgIHVuaW9uIHsNCisgICAgICAgIEZYX0RXT1JEIGNvbG9yOw0KKyAgICAgICAgc3RydWN0IHsNCisgICAgICAgICAgICBGWF9CWVRFIGI7DQorICAgICAgICAgICAgRlhfQllURSBnOw0KKyAgICAgICAgICAgIEZYX0JZVEUgcjsNCisgICAgICAgICAgICBGWF9CWVRFIGE7DQorICAgICAgICB9Ow0KKyAgICB9Ow0KKw0KKyAgICBfRldMQ09MT1IoKQ0KKyAgICB7DQorICAgICAgICBjb2xvciA9IDA7DQorICAgIH0NCisgICAgX0ZXTENPTE9SKEZYX0RXT1JEIGMpDQorICAgIHsNCisgICAgICAgIGNvbG9yID0gYzsNCisgICAgfQ0KKyAgICBfRldMQ09MT1IoY29uc3QgX0ZXTENPTE9SICZjKQ0KKyAgICB7DQorICAgICAgICBjb2xvciA9IGMuY29sb3I7DQorICAgIH0NCisNCisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgX0ZXTENPTE9SICZmckNvbG9yKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gY29sb3IgPT0gZnJDb2xvci5jb2xvcjsNCisgICAgfQ0KKw0KKyAgICBvcGVyYXRvciBGWF9EV09SRCgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBjb2xvcjsNCisgICAgfQ0KK30gRldMQ09MT1I7DQorI2RlZmluZQkJRldMVEhFTUVfQkVaSUVSCQkJCQkwLjU1MjI4NDc0OTgzMDhmDQorI2RlZmluZQkJRldMVEhFTUVfUEkJCQkJCQkzLjE0MTU5MmYNCisjZGVmaW5lCQlGV0xUSEVNRV9QSV8yXzEJCQkJCTEuNTcwNzk2Zg0KKyNkZWZpbmUJCUZXTFRIRU1FX1BJXzJfMwkJCQkJNC43MTIzODhmDQorI2RlZmluZQkJRldMVEhFTUVfQ09MT1JfRURHRUxUMQkJCShBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1MykpDQorI2RlZmluZQkJRldMVEhFTUVfQ09MT1JfRURHRUxUMgkJCShBcmdiRW5jb2RlKDI1NSwgMTEzLCAxMTEsIDEwMCkpDQorI2RlZmluZQkJRldMVEhFTUVfQ09MT1JfRURHRVJCMQkJCShBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIyNikpDQorI2RlZmluZQkJRldMVEhFTUVfQ09MT1JfRURHRVJCMgkJCShBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpDQorI2RlZmluZQkJRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZAkJKEFyZ2JFbmNvZGUoMjU1LCAyMzYsIDIzMywgMjE2KSkNCisjZGVmaW5lCQlGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkCQkoQXJnYkVuY29kZSgyNTUsIDE1MywgMTkzLCAyMTgpKQ0KKyNkZWZpbmUJCUZXTFRIRU1FX0NPTE9SX0dyZWVuX0JLU2VsZWN0ZWQJKEFyZ2JFbmNvZGUoMjU1LCAxNDcsIDE2MCwgMTEyKSkNCisjaWZkZWYgVEhFTUVfWFBTaW1pbGFyDQorI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfRWRnZUZsYXQJCTIuMGYNCisjZWxzZQ0KKyNkZWZpbmUJCUZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VGbGF0CQkwLjBmDQorI2VuZGlmDQorI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVJhaXNlZAkyLjBmDQorI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVN1bmtlbgkyLjBmDQorI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemUJCTEyLjBmDQorI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfTGluZUhlaWdodAkxMi4wZg0KKyNkZWZpbmUgICAgIEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvciAgICAgKEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSkNCisjZGVmaW5lICAgICBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0U2VsQ29sb3IgIChBcmdiRW5jb2RlKDI1NSwgMTUzLCAxOTMsIDIxOCkpDQorI2RlZmluZSAgICAgRldMVEhFTUVfQ0FQQUNJVFlfVGV4dERpc0NvbG9yICAoQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpKQ0KKyNkZWZpbmUgICAgIEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoCTE3LjBmDQorI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfQ1hCb3JkZXIJCTEuMGYNCisjZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9DWUJvcmRlcgkJMS4wZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS93aWRnZXR0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3dpZGdldHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS93aWRnZXR0cC5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9XSURHRVRUUF9IDQorI2RlZmluZSBfRldMX1dJREdFVFRQX0gNCitjbGFzcyBDRlhfT2JqZWN0Ow0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRkRFX1RleHRPdXQ7DQorY2xhc3MgSUZYX0ZvbnQ7DQorY2xhc3MgSUZYX0ZvbnRNZ3I7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCitjbGFzcyBJRlhfRm9udFNvdXJjZUVudW07DQorI2VuZGlmDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0Fycm93RGF0YTsNCitjbGFzcyBDRldMX1dpZGdldFRQIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpOw0KKyAgICB2aXJ0dWFsIEZYX0xQVk9JRCAgIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYgJnJ0UGFydCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwJRlhfQk9PTAkJQ2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zLCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1dpZGdldFRQKCk7DQorICAgIEZXTF9FUlIJCVNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQQ1dTVFIgc3RyRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpOw0KKyAgICBGV0xfRVJSCQlTZXRGb250KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRlhfRm9udCAqcEZvbnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQVJHQiByZ2JGb250KTsNCisgICAgSUZYX0ZvbnQqCUdldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9XaWRnZXRUUCgpOw0KKyAgICBGWF9FUlIJSW5pdFRUTygpOw0KKyAgICBGWF9FUlIJRmluYWxpemVUVE8oKTsNCisgICAgdm9pZAlEcmF3RWRnZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdHlsZXMsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3M0RSZWN0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFIGVUeXBlLCBGWF9GTE9BVCBmV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0FSR0IgY3IxLCBGWF9BUkdCIGNyMiwgRlhfQVJHQiBjcjMsIEZYX0FSR0IgY3I0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhdzNEQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFIGVUeXBlLCBGWF9GTE9BVCBmV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0FSR0IgY3IxLCBGWF9BUkdCIGNyMiwgRlhfQVJHQiBjcjMsIEZYX0FSR0IgY3I0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCUZpbGxCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRmlsbFNvaWxkUmVjdChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfQVJHQiBmaWxsQ29sb3IsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3QXhpYWxTaGFkaW5nKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9GTE9BVCBmeDEsIEZYX0ZMT0FUIGZ5MSwgRlhfRkxPQVQgZngyLCBGWF9GTE9BVCBmeTIsIEZYX0FSR0IgYmVnaW5Db2xvciwgRlhfQVJHQiBlbmRDb2xvciwgQ0ZYX1BhdGggKnBhdGgsIEZYX0lOVDMyIGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkcsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAlEcmF3QW5udWx1c1JlY3QoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0FSR0IgZmlsbENvbG9yLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9GTE9BVCBmUmluZ1dpZHRoID0gMSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdBbm51bHVzQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9BUkdCIGZpbGxDb2xvciwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfRkxPQVQgZldpZHRoID0gMSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdGb2N1cyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdBcnJvdyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGWF9BUkdCIGFyZ2JGaWxsLCBGWF9CT09MIGJQcmVzc2VkLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJRHJhd0Fycm93KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZYX0FSR0IgYXJnU2lnbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdCdG4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCURyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgRldMQ09MT1IgQmxlbmRDb2xvcihGV0xDT0xPUiBzcmNDb2xvciwgRldMQ09MT1IgcmVuZGVyQ29sb3IsIEZYX0JZVEUgc2NhbGUpOw0KKyAgICBGWF9EV09SRAkJbV9kd1JlZkNvdW50Ow0KKyAgICBJRkRFX1RleHRPdXQgICAqbV9wVGV4dE91dDsNCisgICAgSUZYX0ZvbnQJICAgKm1fcEZERUZvbnQ7DQorICAgIEZYX0ZMT0FUCQltX2ZWYWx1ZTsNCisgICAgRlhfRFdPUkQJCW1fZHdWYWx1ZTsNCisgICAgQ0ZYX1JlY3RGCQltX3J0TWFyZ2luOw0KKyAgICBGWF9EV09SRAkJbV9kd1RoZW1lSUQ7DQorICAgIENGWF9NYXRyaXgJCV9jdG07DQorfTsNCitGWF9CT09MCUZXTFRIRU1FX0luaXQoKTsNCit2b2lkCUZXTFRIRU1FX1JlbGVhc2UoKTsNCitGWF9EV09SRCBGV0xfR2V0VGhlbWVMYXlvdXQoRlhfRFdPUkQgZHdUaGVtZUlEKTsNCitGWF9EV09SRCBGV0xfR2V0VGhlbWVDb2xvcihGWF9EV09SRCBkd1RoZW1lSUQpOw0KK0ZYX0RXT1JEIEZXTF9NYWtlVGhlbWVJRChGWF9EV09SRCBkd0xheW91dCwgRlhfRFdPUkQgZHdDb2xvcik7DQorY2xhc3MgQ0ZXTF9BcnJvd0RhdGEgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBDRldMX0Fycm93RGF0YSogR2V0SW5zdGFuY2UoKTsNCisgICAgc3RhdGljIEZYX0JPT0wgSXNJbnN0YW5jZSgpOw0KKyAgICBzdGF0aWMgdm9pZCBEZXN0cm95SW5zdGFuY2UoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9BcnJvd0RhdGEoKTsNCisgICAgdm9pZCBTZXRDb2xvckRhdGEoRlhfRFdPUkQJZHdJRCk7DQorDQorICAgIGNsYXNzIENDb2xvckRhdGEgOiBwdWJsaWMgQ0ZYX09iamVjdA0KKyAgICB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIEZYX0FSR0IgY2xyQm9yZGVyWzRdOw0KKyAgICAgICAgRlhfQVJHQiBjbHJTdGFydFs0XTsNCisgICAgICAgIEZYX0FSR0IgY2xyRW5kWzRdOw0KKyAgICAgICAgRlhfQVJHQgljbHJTaWduWzRdOw0KKyAgICB9ICptX3BDb2xvckRhdGE7DQorcHJvdGVjdGVkOg0KKyAgICBDRldMX0Fycm93RGF0YSgpOw0KKyAgICBzdGF0aWMgQ0ZXTF9BcnJvd0RhdGEgKm1fcEluc3RhbmNlOw0KK307DQorY2xhc3MgQ0ZXTF9Gb250RGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9Gb250RGF0YSgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0ZvbnREYXRhKCk7DQorICAgIEZYX0JPT0wgRXF1YWwoRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgICBGWF9CT09MIExvYWRGb250KEZYX1dTVFIgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgICAgSUZYX0ZvbnQqICBHZXRGb250KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEZvbnQ7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c0ZhbWlseTsNCisgICAgRlhfRFdPUkQJCQkJbV9kd1N0eWxlczsNCisgICAgRlhfRFdPUkQJCQkJbV9kd0NvZGVQYWdlOw0KKyAgICBJRlhfRm9udAkJCQkqbV9wRm9udDsNCisgICAgSUZYX0ZvbnRNZ3IJCQkJKm1fcEZvbnRNZ3I7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgSUZYX0ZvbnRTb3VyY2VFbnVtCQkqbV9wRm9udFNvdXJjZTsNCisjZW5kaWYNCit9Ow0KK2NsYXNzIENGV0xfRm9udE1hbmFnZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRm9udE1hbmFnZXIoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9Gb250TWFuYWdlcigpOw0KKyAgICBJRlhfRm9udCogRmluZEZvbnQoRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCBkd0NvZGVQYWdlKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9QdHJBcnJheSAgICBtX2FyckZvbnRzOw0KK307DQorQ0ZXTF9Gb250TWFuYWdlciAqRldMX0dldEZvbnRNYW5hZ2VyKCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhiYXJjb2RlL0JDX0JhckNvZGUuaCBiL3hmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjZTVlMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09ERUJBU0VfSF8NCisjZGVmaW5lIF9CQ19DT0RFQkFTRV9IXw0KK3ZvaWQgQkNfTGlicmFyeV9Jbml0KCk7DQordm9pZCBCQ19MaWJyYXJ5X0Rlc3RvcnkoKTsNCitjbGFzcyBDQkNfQ29kZUJhc2U7DQorY2xhc3MgQ0JDX1dyaXRlcjsNCitjbGFzcyBDQkNfUmVhZGVyOw0KK2VudW0gQkNfVEVYVF9MT0Mgew0KKyAgICBCQ19URVhUX0xPQ19OT05FCQk9IDAsDQorICAgIEJDX1RFWFRfTE9DX0FCT1ZFLA0KKyAgICBCQ19URVhUX0xPQ19CRUxPVywNCisgICAgQkNfVEVYVF9MT0NfQUJPVkVFTUJFRCwNCisgICAgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRA0KK307DQorZW51bSBCQ19DSEFSX0VOQ09ESU5HIHsNCisgICAgQ0hBUl9FTkNPRElOR19VVEY4CQk9IDAsDQorICAgIENIQVJfRU5DT0RJTkdfVU5JQ09ERQ0KK307DQorZW51bSBCQ19UWVBFIHsNCisgICAgQkNfVU5LTk9XTgkJCQk9IC0xLA0KKyAgICBCQ19DT0RFMzkJCQkJPSAwLA0KKyAgICBCQ19DT0RBQkFSLA0KKyAgICBCQ19DT0RFMTI4LA0KKyAgICBCQ19DT0RFMTI4X0IsDQorICAgIEJDX0NPREUxMjhfQywNCisgICAgQkNfRUFOOCwNCisgICAgQkNfVVBDQSwNCisgICAgQkNfRUFOMTMsDQorICAgIEJDX1FSX0NPREUsDQorICAgIEJDX1BERjQxNywNCisgICAgQkNfREFUQU1BVFJJWA0KK307DQorY2xhc3MgQ0JDX0NvZGVCYXNlIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfQ29kZUJhc2UoKTsNCisgICAgdmlydHVhbCB+Q0JDX0NvZGVCYXNlKCk7DQorICAgIHZpcnR1YWwgQkNfVFlQRQkgR2V0VHlwZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MICBFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCSBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKSA9IDA7DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhpZ2h0LCBGWF9JTlQzMiAmZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTCAgU2V0Q2hhckVuY29kaW5nKEZYX0lOVDMyIGVuY29kaW5nKTsNCisgICAgdmlydHVhbCBGWF9CT09MICBTZXRNb2R1bGVIZWlnaHQoRlhfSU5UMzIgbW9kdWxlSGVpZ2h0KTsNCisgICAgdmlydHVhbCBGWF9CT09MICBTZXRNb2R1bGVXaWR0aChGWF9JTlQzMiBtb2R1bGVXaWR0aCk7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTCAgU2V0SGVpZ2h0KEZYX0lOVDMyIGhlaWdodCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCAgU2V0V2lkdGgoRlhfSU5UMzIgd2lkdGgpOw0KKyAgICB2aXJ0dWFsIHZvaWQgICAgIFNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQorICAgIHZpcnR1YWwgdm9pZCAgICAgU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCitwcm90ZWN0ZWQ6DQorICAgIENCQ19Xcml0ZXIgKgltX3BCQ1dyaXRlcjsNCisgICAgQ0JDX1JlYWRlciAqCW1fcEJDUmVhZGVyOw0KK307DQorY2xhc3MgQ0JDX09uZUNvZGUgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZUNvZGUoKTsNCisgICAgdmlydHVhbCB+Q0JDX09uZUNvZGUoKTsNCisgICAgdmlydHVhbCBCQ19UWVBFCSBHZXRUeXBlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgIEVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCSBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpID0gMDsNCisgICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKSA9IDA7DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfSU5UMzIgJmUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJRmlsdGVyQ29udGVudHMoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Q2FsQ2hlY2tzdW0oRlhfQk9PTCBjYWxjKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udChDRlhfRm9udCAqIGNGb250KTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRTdHlsZShGWF9JTlQzMiBzdHlsZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCit9Ow0KK2NsYXNzIENCQ19Db2RlMzkgOiBwdWJsaWMgQ0JDX09uZUNvZGUNCit7DQorcHVibGljOg0KKyAgICBDQkNfQ29kZTM5KCk7DQorICAgIENCQ19Db2RlMzkoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQpOw0KKyAgICBDQkNfQ29kZTM5KEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSk7DQorICAgIHZpcnR1YWwgfkNCQ19Db2RlMzkoKTsNCisgICAgRlhfQk9PTCAJCUVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIEJDX1RZUEUJCQlHZXRUeXBlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDX0NPREUzOTsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsNCisgICAgRlhfQk9PTAkJCVNldFdpZGVOYXJyb3dSYXRpbyhGWF9JTlQzMiByYXRpbyk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX1dpZGVTdHJpbmcgIG1fcmVuZGVyQ29udGVudHM7DQorfTsNCitjbGFzcyBDQkNfQ29kYWJhciA6IHB1YmxpYyBDQkNfT25lQ29kZQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Db2RhYmFyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19Db2RhYmFyKCk7DQorICAgIEZYX0JPT0wJCSAgICBFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICBCQ19UWVBFCQkJR2V0VHlwZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBCQ19DT0RBQkFSOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQlTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCk7DQorICAgIEZYX0JPT0wJCQlTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKTsNCisgICAgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICAgIEZYX0JPT0wJCQlTZXRXaWRlTmFycm93UmF0aW8oRlhfSU5UMzIgcmF0aW8pOw0KK3ByaXZhdGU6DQorICAgIENGWF9XaWRlU3RyaW5nICBtX3JlbmRlckNvbnRlbnRzOw0KK307DQorY2xhc3MgQ0JDX0NvZGUxMjggOiBwdWJsaWMgQ0JDX09uZUNvZGUNCit7DQorcHJpdmF0ZToNCisgICAgQkNfVFlQRSAgbV90eXBlOw0KK3B1YmxpYzoNCisgICAgQ0JDX0NvZGUxMjgoQkNfVFlQRSB0eXBlKTsNCisgICAgdmlydHVhbCB+Q0JDX0NvZGUxMjgoKTsNCisgICAgRlhfQk9PTAkJCUVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIEJDX1RZUEUJCQlHZXRUeXBlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDX0NPREUxMjg7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2N0aW9uKTsNCitwcml2YXRlOg0KKyAgICBDRlhfV2lkZVN0cmluZyAgbV9yZW5kZXJDb250ZW50czsNCit9Ow0KK2NsYXNzIENCQ19FQU44IDogcHVibGljIENCQ19PbmVDb2RlDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0VBTjgoKTsNCisgICAgdmlydHVhbCB+Q0JDX0VBTjgoKTsNCisgICAgRlhfQk9PTAkJCUVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIEJDX1RZUEUJCQlHZXRUeXBlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDX0VBTjg7DQorICAgIH0NCitwcml2YXRlOg0KKyAgICBDRlhfV2lkZVN0cmluZwlQcmVwcm9jZXNzKEZYX1dTVFIgY29udGVudHMpOw0KKyAgICBDRlhfV2lkZVN0cmluZyAgbV9yZW5kZXJDb250ZW50czsNCit9Ow0KK2NsYXNzIENCQ19FQU4xMyA6IHB1YmxpYyBDQkNfT25lQ29kZQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19FQU4xMygpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRUFOMTMoKTsNCisgICAgRlhfQk9PTCAJCUVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiAmZSk7DQorICAgIEJDX1RZUEUJCQlHZXRUeXBlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDX0VBTjEzOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgQ0ZYX1dpZGVTdHJpbmcJUHJlcHJvY2VzcyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgIG1fcmVuZGVyQ29udGVudHM7DQorfTsNCitjbGFzcyBDQkNfVVBDQSA6IHB1YmxpYyBDQkNfT25lQ29kZQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19VUENBKCk7DQorICAgIHZpcnR1YWwgfkNCQ19VUENBKCk7DQorICAgIEZYX0JPT0wgCQlFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICBCQ19UWVBFCQkJR2V0VHlwZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBCQ19VUENBOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgQ0ZYX1dpZGVTdHJpbmcJUHJlcHJvY2VzcyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgIG1fcmVuZGVyQ29udGVudHM7DQorfTsNCitjbGFzcyBDQkNfUVJDb2RlIDogcHVibGljIENCQ19Db2RlQmFzZQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19RUkNvZGUoKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSQ29kZSgpOw0KKyAgICBGWF9CT09MIAkJRW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhpZ2h0LCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKTsNCisgICAgQkNfVFlQRQkJR2V0VHlwZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBCQ19RUl9DT0RFOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCVNldFZlcnNpb24oRlhfSU5UMzIgdmVyc2lvbik7DQorICAgIEZYX0JPT0wJCVNldEVycm9yQ29ycmVjdGlvbkxldmVsIChGWF9JTlQzMiBsZXZlbCk7DQorfTsNCitjbGFzcyBDQkNfUERGNDE3SSA6IHB1YmxpYyBDQkNfQ29kZUJhc2UNCit7DQorcHVibGljOg0KKyAgICBDQkNfUERGNDE3SSgpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3SSgpOw0KKyAgICBGWF9CT09MCQkJRW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhpZ2h0LCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKTsNCisgICAgQkNfVFlQRQkJR2V0VHlwZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBCQ19QREY0MTc7DQorICAgIH0NCisgICAgRlhfQk9PTAkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwgKEZYX0lOVDMyIGxldmVsKTsNCisgICAgdm9pZAkJU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKTsNCit9Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4IDogcHVibGljIENCQ19Db2RlQmFzZQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EYXRhTWF0cml4KCk7DQorICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4KCk7DQorICAgIEZYX0JPT0wgCQlFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICBCQ19UWVBFCQlHZXRUeXBlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDX0RBVEFNQVRSSVg7DQorICAgIH0NCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYS5oIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjM2E3MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYS5oCkBAIC0wLDAgKzEsNjIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkENCisjZGVmaW5lIF9GWEZBDQorY2xhc3MgSUZERV9YTUxFbGVtZW50Ow0KK2NsYXNzIENYRkFfTm9kZTsNCitjbGFzcyBDWEZBX05vZGVMaXN0Ow0KK2NsYXNzIENYRkFfV2lkZ2V0QWNjOw0KK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyOw0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIENGWF9HcmFwaGljczsNCitjbGFzcyBJWEZBX0FwcFByb3ZpZGVyOw0KK2NsYXNzIElYRkFfQXBwOw0KK2NsYXNzIElYRkFfRm9udE1ncjsNCitjbGFzcyBJWEZBX0RvY1Byb3ZpZGVyOw0KK2NsYXNzIElYRkFfRG9jSGFuZGxlcjsNCitjbGFzcyBJWEZBX0RvY1ZpZXc7DQorY2xhc3MgSVhGQV9QYWdlVmlld1JlbmRlcjsNCitjbGFzcyBJWEZBX1BhZ2VWaWV3Ow0KK2NsYXNzIElYRkFfV2lkZ2V0SGFuZGxlcjsNCitjbGFzcyBJWEZBX1dpZGdldEl0ZXJhdG9yOw0KK2NsYXNzIElYRkFfTWVudUhhbmRsZXI7DQorY2xhc3MgSVhGQV9DaGVja3N1bUNvbnRleHQ7DQorY2xhc3MgSVhGQV9XaWRnZXRBY2NJdGVyYXRvcjsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX0hET0Mgew0KKyAgICBGWF9MUFZPSUQgcERhdGE7DQorfSogWEZBX0hET0M7DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9IV0lER0VUIHsNCisgICAgRlhfTFBWT0lEIHBEYXRhOw0KK30qIFhGQV9IV0lER0VUOw0KKyNpbmNsdWRlICJmeGZhX2Jhc2ljLmgiDQorI2luY2x1ZGUgImZ4ZmFfd2lkZ2V0LmgiDQorI2RlZmluZSBYRkFfTUJJQ09OX0Vycm9yCTANCisjZGVmaW5lCVhGQV9NQklDT05fV2FybmluZwkxDQorI2RlZmluZQlYRkFfTUJJQ09OX1F1ZXN0aW9uCTINCisjZGVmaW5lCVhGQV9NQklDT05fU3RhdHVzCTMNCisjZGVmaW5lIFhGQV9NQl9PSwkJCTANCisjZGVmaW5lCVhGQV9NQl9PS0NhbmNlbAkJMQ0KKyNkZWZpbmUJWEZBX01CX1llc05vCQkyDQorI2RlZmluZSBYRkFfTUJfWWVzTm9DYW5jZWwJMw0KKyNkZWZpbmUgWEZBX0lET0sJCQkxDQorI2RlZmluZSBYRkFfSURDYW5jZWwJCTINCisjZGVmaW5lIFhGQV9JRE5vCQkJMw0KKyNkZWZpbmUgWEZBX0lEWWVzCQkJNA0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZUZhaWxlZAkJCQkJMQ0KKyNkZWZpbmUgWEZBX0lEU19DYWxjT3ZlcnJpZGUJCQkJCTINCisjZGVmaW5lIFhGQV9JRFNfTW9kaWZ5RmllbGQJCQkJCQkzDQorI2RlZmluZSBYRkFfSURTX05vdE1vZGlmeUZpZWxkCQkJCQk0DQorI2RlZmluZSBYRkFfSURTX0FwcE5hbWUJCQkJCQkJNQ0KKyNkZWZpbmUgWEZBX0lEU19JbWFnZUZpbHRlcgkJCQkJCTYNCisjZGVmaW5lIFhGQV9JRFNfVU5LTk9XX0NBVENIRUQJCQkJCTcNCisjZGVmaW5lIFhGQV9JRFNfVW5hYmxlX1RPX1NFVAkJCQkJOA0KKyNkZWZpbmUgWEZBX0lEU19WQUxVRV9FWENBTE1BVE9SWQkJCQk5DQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURfRU5VTV9WQUxVRQkJCQkxMA0KKyNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfTUVUSE9ECQkJCTExDQorI2RlZmluZSBYRkFfSURTX1VOU1VQUE9SVF9QUk9QCQkJCQkxMg0KKyNkZWZpbmUgWEZBX0lEU19JTlZBbElEX1BST1BfU0VUCQkJCTEzDQorI2RlZmluZSBYRkFfSURTX05PVF9ERUZBVUxfVkFMVUUJCQkJMTQNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9MQU5HVUFHRQkJCQkxNQ0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX05VTVBBR0VTCQkJCTE2DQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfUExBVEZPUk0JCQkJMTcNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9WQUxJREFUSU9ORU5BQkxFCQkxOA0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX1ZBUklBVElPTgkJCTE5DQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfVkVSU0lPTgkJCQkyMA0KKyNkZWZpbmUJWEZBX0lEU19VTkFCTEVfU0VUX1JFQURZCQkJCTIxDQorI2RlZmluZSBYRkFfSURTX05VTUJFUl9PRl9PQ0NVUgkJCQkJMjINCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9DTEFTU19OQU1FCQkJMjMNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9MRU5HVEhfVkFMVUUJCQkyNA0KKyNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfQ0hBUgkJCQkgICAgMjUNCisjZGVmaW5lIFhGQV9JRFNfQkFEX1NVRkZJWAkJCQkJCTI2DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX0lERU5UCQkJCQkyNw0KKyNkZWZpbmUgWEZBX0lEU19FWFBFQ1RFRF9TVFJJTkcJCQkJCTI4DQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURBVEVfQ0hBUgkJCQkJMjkNCisjZGVmaW5lIFhGQV9JRFNfUkVERUZJTklUSU9OCQkJCQkzMA0KKyNkZWZpbmUgWEZBX0lEU19JTlZBTElEQVRFX1RPS0VOCQkJCTMxDQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURBVEVfRVhQUkVTU0lPTgkJCTMyDQorI2RlZmluZSBYRkFfSURTX1VOREVGSU5FX0lERU5USUZJRVIJCQkJMzMNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJREFURV9MRUZUVkFMVUUJCQkzNA0KKyNkZWZpbmUgWEZBX0lEU19DT01QSUxFUl9FUlJPUgkJCQkJMzUNCisjZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX01PRElGWV9WQUxVRQkJCQkzNg0KKyNkZWZpbmUgWEZBX0lEU19FUlJPUl9QQVJBTUVURVJTCQkJCTM3DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVF9FTkRJRgkJCQkJMzgNCisjZGVmaW5lIFhGQV9JRFNfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OCQkJMzkNCisjZGVmaW5lIFhGQV9JRFNfQ09ORElUSU9OX0lTX05VTEwJCQkJNDANCisjZGVmaW5lIFhGQV9JRFNfSUxMRUdBTEJSRUFLCQkJCQk0MQ0KKyNkZWZpbmUgWEZBX0lEU19JTExFR0FMQ09OVElOVUUJCQkJCTQyDQorI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX09QRVJBVE9SCQkJCTQzDQorI2RlZmluZSBYRkFfSURTX0RJVklERV9aRVJPCQkJCQkJNDQNCisjZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX0NPVkVSVF9PQkpFQ1QJCQk0NQ0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfQ09OVEFJTkVSCQkJCTQ2DQorI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9QUk9QRVJUWQkJCQk0Nw0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfTUVUSE9ECQkJCTQ4DQorI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9DT05TVAkJCQkJNDkNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0FTU0lHTl9PQkpFQ1QJCQkJNTANCisjZGVmaW5lIFhGQV9JRFNfSVZBTElEQVRFX0lOU1RSVUNUSU9OCQkJNTENCisjZGVmaW5lIFhGQV9JRFNfRVhQRUNUX05VTUJFUgkJCQkJNTINCisjZGVmaW5lIFhGQV9JRFNfVkFMSURBVEVfT1VUX0FSUkFZCQkJCTUzDQorI2RlZmluZSBYRkFfSURTX0NBTk5PVF9BU1NJR05fSURFTlQJCQkJNTQNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0ZPVU5UX0ZVTkNUSU9OCQkJCTU1DQorI2RlZmluZSBYRkFfSURTX05PVF9BUlJBWQkJCQkJCTU2DQorI2RlZmluZSBYRkFfSURTX09VVF9BUlJBWQkJCQkJCTU3DQorI2RlZmluZSBYRkFfSURTX05PVF9TVVBQT1JUX0NBTEMJCQkJNTgNCisjZGVmaW5lIFhGQV9JRFNfQVJHVU1FTlRfTk9UX0FSUkFZCQkJCTU5DQorI2RlZmluZSBYRkFfSURTX0FSR1VNRU5UX0VYUEVDVF9DT05UQUlORVIJCTYwDQorI2RlZmluZSBYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNUCTYxDQorI2RlZmluZSBYRkFfSURTX0ZVTkNUSU9OX0lTX0JVSUxESU4JCQkJNjINCisjZGVmaW5lIFhGQV9JRFNfRVJST1JfTVNHCQkJCQkJNjMNCisjZGVmaW5lIFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUwkJCQk2NA0KKyNkZWZpbmUgWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRAkJNjUNCisjZGVmaW5lIFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gJCQkJNjYNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9FTlVNRVJBVEUJCQkJNjcNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9BUFBFTkQJCQkJCTY4DQorI2RlZmluZSBYRkFfSURTX1NPTV9FWFBFQ1RFRF9MSVNUCQkJCTY5DQorI2RlZmluZSBYRkFfSURTX05PVF9IQVZFX1BST1BFUlRZCQkJCTcwDQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURfTk9ERV9UWVBFCQkJCTcxDQorI2RlZmluZSBYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlkJCQkJNzINCisjZGVmaW5lIFhGQV9JRFNfU0VSVkVSX0RFTlkJCQkJCQk3Mw0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1bgkJCQk3NA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X01vbgkJCQk3NQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1R1ZQkJCQk3Ng0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1dlZAkJCQk3Nw0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1RodQkJCQk3OA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X0ZyaQkJCQk3OQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1NhdAkJCQk4MA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KYW4JCQkJCTgxDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0ZlYgkJCQkJODINCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfTWFyY2gJCQkJODMNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfQXByaWwJCQkJODQNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfTWF5CQkJCQk4NQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KdW5lCQkJCTg2DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0p1bHkJCQkJODcNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfQXVnCQkJCQk4OA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9TZXB0CQkJCTg5DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX09jdAkJCQkJOTANCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfTm92CQkJCQk5MQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9EZWMJCQkJCTkyDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ19Ub2RheQkJCQkJOTMNCisjZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVMaW1pdAkJCQkJOTQNCisjZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZwkJCQk5NQ0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvcgkJCQk5Ng0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZVdhcm5pbmcJCQkJCTk3DQorI2RlZmluZSBYRkFfSURTX1ZhbGlkYXRlRXJyb3IJCQkJCTk4DQorY2xhc3MgSVhGQV9BcHBQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorDQorICAgIHZpcnR1YWwgdm9pZAkJU2V0QXBwVHlwZShGWF9XU1RSIHdzQXBwVHlwZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEFwcFR5cGUoQ0ZYX1dpZGVTdHJpbmcgJndzQXBwVHlwZSkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEZveGl0QXBwVHlwZShGWF9XU1RSIHdzRm94aXRBcHBUeXBlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQlHZXRGb3hpdEFwcFR5cGUoQ0ZYX1dpZGVTdHJpbmcgJndzRm94aXRBcHBUeXBlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQlHZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyAmd3NMYW5ndWFnZSkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nICZ3c1BsYXRmb3JtKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJR2V0VmFyaWF0aW9uKENGWF9XaWRlU3RyaW5nICZ3c1ZhcmlhdGlvbikgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcgJndzVmVyc2lvbikgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEZveGl0VmVyc2lvbihDRlhfV2lkZVN0cmluZyAmd3NGb3hpdFZlcnNpb24pDQorICAgIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEZveGl0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NGb3hpdE5hbWUpDQorICAgIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUJlZXAoRlhfRFdPUkQgZHdUeXBlKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJTXNnQm94KEZYX1dTVFIgd3NNZXNzYWdlLCBGWF9XU1RSIHdzVGl0bGUgPSBGWF9XU1RSQyhMIiIpLCBGWF9EV09SRCBkd0ljb25UeXBlID0gMCwgRlhfRFdPUkQgZHdCdXR0b25UeXBlID0gMCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlc3BvbnNlKENGWF9XaWRlU3RyaW5nICZ3c0Fuc3dlciwgRlhfV1NUUiB3c1F1ZXN0aW9uLCBGWF9XU1RSIHdzVGl0bGUgPSBGWF9XU1RSQyhMIiIpLCBGWF9XU1RSIHdzRGVmYXVsdEFuc3dlciA9IEZYX1dTVFJDKEwiIiksIEZYX0JPT0wgYk1hcmsgPSBUUlVFKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0RG9jdW1lbnRDb3VudEluQmF0Y2goKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9GaWxlUmVhZCogRG93bmxvYWRVUkwoRlhfV1NUUiB3c1VSTCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVBvc3RSZXF1ZXN0VVJMKEZYX1dTVFIgd3NVUkwsIEZYX1dTVFIgd3NEYXRhLCBGWF9XU1RSIHdzQ29udGVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV1NUUiB3c0VuY29kZSwgRlhfV1NUUiB3c0hlYWRlciwgQ0ZYX1dpZGVTdHJpbmcgJndzUmVzcG9uc2UpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQlQdXRSZXF1ZXN0VVJMKEZYX1dTVFIgd3NVUkwsIEZYX1dTVFIgd3NEYXRhLCBGWF9XU1RSIHdzRW5jb2RlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJTG9hZFN0cmluZyhGWF9JTlQzMiBpU3RyaW5nSUQsIENGWF9XaWRlU3RyaW5nICZ3c1N0cmluZykgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCVNob3dGaWxlRGlhbG9nKEZYX1dTVFIgd3NUaXRsZSwgRlhfV1NUUiB3c0ZpbHRlciwgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmd3NQYXRoQXJyLCBGWF9CT09MIGJPcGVuID0gVFJVRSkgPSAwOw0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlclRpbWVyTWdyKiBHZXRUaW1lck1ncigpID0gMDs7DQorfTsNCitjbGFzcyBJWEZBX0ZvbnRNZ3INCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCUdldEZvbnQoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJR2V0RGVmYXVsdEZvbnQoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpID0gMDsNCit9Ow0KK0lYRkFfRm9udE1ncioJWEZBX0dldERlZmF1bHRGb250TWdyKCk7DQorY2xhc3MgSVhGQV9BcHANCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSVhGQV9BcHAqCUNyZWF0ZShJWEZBX0FwcFByb3ZpZGVyKiBwUHJvdmlkZXIpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9Eb2NIYW5kbGVyKglHZXREb2NIYW5kbGVyKCkgPSAwOw0KKyAgICB2aXJ0dWFsIFhGQV9IRE9DCQkJQ3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJUYWtlT3ZlckZpbGUgPSBUUlVFKSA9IDA7DQorICAgIHZpcnR1YWwgWEZBX0hET0MJCQlDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLCBDUERGX0RvY3VtZW50KiBwUERGRG9jKSA9IDA7DQorICAgIHZpcnR1YWwJSVhGQV9BcHBQcm92aWRlcioJR2V0QXBwUHJvdmlkZXIoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9NZW51SGFuZGxlcioJR2V0TWVudUhhbmRsZXIoKSA9IDA7DQorfTsNCitjbGFzcyBJWEZBX01lbnVIYW5kbGVyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5Db3B5KFhGQV9IV0lER0VUIGhXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5DdXQoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblBhc3RlKFhGQV9IV0lER0VUIGhXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5TZWxlY3RBbGwoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkRlbGV0ZShYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuRGVTZWxlY3QoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvcHkoWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUN1dChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJUGFzdGUoWEZBX0hXSURHRVQgaFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNlbGVjdEFsbChYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKFhGQV9IV0lER0VUIGhXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEZVNlbGVjdChYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuVW5kbyhYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUmVkbyhYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbyhYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVkbyhYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0U3VnZ2VzdFdvcmRzKFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlcGxhY2VTcGVsbENoZWNrV29yZChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUG9pbnRGIHBvaW50ZiwgRlhfQlNUUiBic1JlcGxhY2UpID0gMDsNCit9Ow0KKyNkZWZpbmUgWEZBX0lOVkFMSURBVEVfQWxsUGFnZXMJCTB4MDAwMDAwMDANCisjZGVmaW5lIFhGQV9JTlZBTElEQVRFX0N1cnJlbnRQYWdlCTB4MDAwMDAwMDENCisjZGVmaW5lIFhGQV9QUklOVE9QVF9TaG93RGlhbG9nCQkweDAwMDAwMDAxDQorI2RlZmluZSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsCQkweDAwMDAwMDAyDQorI2RlZmluZSBYRkFfUFJJTlRPUFRfU2hyaW5rUGFnZQkJMHgwMDAwMDAwNA0KKyNkZWZpbmUgWEZBX1BSSU5UT1BUX0FzSW1hZ2UJCTB4MDAwMDAwMDgNCisjZGVmaW5lIFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXIJMHgwMDAwMDAxMA0KKyNkZWZpbmUgWEZBX1BSSU5UT1BUX1ByaW50QW5ub3QJCTB4MDAwMDAwMjANCisjZGVmaW5lICBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0QWRkZWQJCTENCisjZGVmaW5lICBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0UmVtb3ZlZAkJMw0KKyNkZWZpbmUgIFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQJCQkyDQorI2RlZmluZSAgWEZBX1dJREdFVEVWRU5UX1ByZVJlbW92ZWQJCQkzDQorI2RlZmluZSAgWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZAk2DQorI2RlZmluZSAgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtUmVtb3ZlZAk3DQorI2RlZmluZSAgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtQWRkZWQgIAk4DQorI2RlZmluZSAgWEZBX1dJREdFVEVWRU5UX0FjY2Vzc0NoYW5nZWQgIAk5DQorY2xhc3MgSVhGQV9Eb2NQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0Q2hhbmdlTWFyayhYRkFfSERPQyBoRG9jKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJSW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDRlhfUmVjdEYmIHJ0LCBGWF9EV09SRCBkd0ZsYWdzID0gMCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURpc3BsYXlDYXJldChYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFBvcHVwUG9zKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0ZMT0FUIGZNaW5Qb3B1cCwgRlhfRkxPQVQgZk1heFBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVBvcHVwTWVudShYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUG9pbnRGIHB0UG9wdXAsIGNvbnN0IENGWF9SZWN0RiogcFJlY3RFeGNsdWRlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVBhZ2VWaWV3RXZlbnQoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJV2lkZ2V0RXZlbnQoWEZBX0hXSURHRVQgaFdpZGdldCwgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXREYXRhLCBGWF9EV09SRCBkd0V2ZW50LCBGWF9MUFZPSUQgcFBhcmFtID0gTlVMTCwgRlhfTFBWT0lEIHBBZGRpdGlvbmFsID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlbmRlckN1c3RvbVdpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCwgY29uc3QgQ0ZYX1JlY3RGJiBydFVJKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbAlGWF9JTlQzMglDb3VudFBhZ2VzKFhGQV9IRE9DIGhEb2MpID0gMDsNCisgICAgdmlydHVhbAlGWF9JTlQzMglHZXRDdXJyZW50UGFnZShYRkFfSERPQyBoRG9jKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0Q3VycmVudFBhZ2UoWEZBX0hET0MgaERvYywgRlhfSU5UMzIgaUN1clBhZ2UpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0NhbGN1bGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldENhbGN1bGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYywgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFRpdGxlKFhGQV9IRE9DIGhEb2MsIENGWF9XaWRlU3RyaW5nICZ3c1RpdGxlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0VGl0bGUoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c1RpdGxlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJRXhwb3J0RGF0YShYRkFfSERPQyBoRG9jLCBGWF9XU1RSIHdzRmlsZVBhdGgsIEZYX0JPT0wgYlhEUCA9IFRSVUUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlJbXBvcnREYXRhKFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NGaWxlUGF0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdvdG9VUkwoWEZBX0hET0MgaERvYywgRlhfV1NUUiBic1VSTCwgRlhfQk9PTCBiQXBwZW5kID0gVFJVRSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRhdGlvbnNFbmFibGVkKFhGQV9IRE9DIGhEb2MpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRWYWxpZGF0aW9uc0VuYWJsZWQoWEZBX0hET0MgaERvYywgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEZvY3VzV2lkZ2V0KFhGQV9IRE9DIGhEb2MsIFhGQV9IV0lER0VUIGhXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlQcmludChYRkFfSERPQyBoRG9jLCBGWF9JTlQzMiBuU3RhcnRQYWdlLCBGWF9JTlQzMiBuRW5kUGFnZSwgRlhfRFdPUkQgZHdPcHRpb25zKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlBYnNQYWdlQ291bnRJbkJhdGNoKFhGQV9IRE9DIGhEb2MpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUFic1BhZ2VJbkJhdGNoKFhGQV9IRE9DIGhEb2MsIFhGQV9IV0lER0VUIGhXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVNoZWV0Q291bnRJbkJhdGNoKFhGQV9IRE9DIGhEb2MpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVNoZWV0SW5CYXRjaChYRkFfSERPQyBoRG9jLCBYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlWZXJpZnkoWEZBX0hET0MgaERvYywgQ1hGQV9Ob2RlKiBwU2lnTm9kZSwgRlhfQk9PTCBiVXNlZCA9IFRSVUUpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTaWduKFhGQV9IRE9DIGhEb2MsIENYRkFfTm9kZUxpc3QqIHBOb2RlTGlzdCwgRlhfV1NUUiB3c0V4cHJlc3Npb24sIEZYX1dTVFIgd3NYTUxJZGVudCwgRlhfV1NUUiB3c1ZhbHVlID0gRlhfV1NUUkMoTCJvcGVuIiksIEZYX0JPT0wgYlVzZWQgPSBUUlVFKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZUxpc3QqCQlFbnVtZXJhdGUoWEZBX0hET0MgaERvYykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUNsZWFyKFhGQV9IRE9DIGhEb2MsIENYRkFfTm9kZSogcFNpZ05vZGUsIEZYX0JPT0wgYkNsZWFyZWQgPSBUUlVFKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFVSTChYRkFfSERPQyBoRG9jLCBDRlhfV2lkZVN0cmluZyAmd3NEb2NVUkwpID0gMDsNCisgICAgdmlydHVhbCBGWF9BUkdCCQlHZXRIaWdobGlnaHRDb2xvcihYRkFfSERPQyBoRG9jKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJQWRkRG9SZWNvcmQoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVN1Ym1pdERhdGEoWEZBX0hET0MgaERvYywgQ1hGQV9TdWJtaXQgc3VibWl0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2hlY2tXb3JkKFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgc1dvcmQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoWEZBX0hET0MgaERvYywgRlhfQlNUUiBzV29yZCwgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRQREZTY3JpcHRPYmplY3QoWEZBX0hET0MgaERvYywgRlhfQlNUUiB1dGY4TmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEdsb2JhbFByb3BlcnR5KFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEdsb2JhbFByb3BlcnR5KFhGQV9IRE9DIGhEb2MsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENQREZfRG9jdW1lbnQqICBPcGVuUERGKFhGQV9IRE9DIGhEb2MsIElGWF9GaWxlUmVhZCogcEZpbGUsIEZYX0JPT0wgYlRha2VPdmVyRmlsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9GaWxlUmVhZCoJT3BlbkxpbmtlZEZpbGUoWEZBX0hET0MgaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGluaykgPSAwOw0KK307DQorI2RlZmluZSBYRkFfRE9DVklFV19WaWV3CQkweDAwMDAwMDAwDQorI2RlZmluZSBYRkFfRE9DVklFV19NYXN0ZXJQYWdlCTB4MDAwMDAwMDENCisjZGVmaW5lIFhGQV9ET0NWSUVXX0Rlc2lnbgkJMHgwMDAwMDAwMg0KKyNkZWZpbmUgWEZBX0RPQ1RZUEVfRHluYW1pYwkJMA0KKyNkZWZpbmUgWEZBX0RPQ1RZUEVfU3RhdGljCQkxDQorI2RlZmluZSBYRkFfRE9DVFlQRV9YRFAJCQkyDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyCS0zDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RyZWFtRXJyCS0yDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyCS0xDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfUmVhZHkJCTANCisjZGVmaW5lIFhGQV9QQVJTRVNUQVRVU19Eb25lCQkxMDANCitjbGFzcyBJWEZBX0RvY0hhbmRsZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZURvYyhYRkFfSERPQyBoRG9jKSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlcioJR2V0RG9jUHJvdmlkZXIoWEZBX0hET0MgaERvYykgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJR2V0RG9jVHlwZShYRkFfSERPQyBoRG9jKSA9IDA7DQorICAgIHZpcnR1YWwJRlhfSU5UMzIJCQlTdGFydExvYWQoWEZBX0hET0MgaERvYykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJRG9Mb2FkKFhGQV9IRE9DIGhEb2MsIElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU3RvcExvYWQoWEZBX0hET0MgaERvYykgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIElYRkFfRG9jVmlldyoJCUNyZWF0ZURvY1ZpZXcoWEZBX0hET0MgaERvYywgRlhfRFdPUkQgZHdWaWV3ID0gMCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJQ291bnRQYWNrYWdlcyhYRkFfSERPQyBoRG9jKSA9IDA7DQorICAgIHZpcnR1YWwJdm9pZAkJCQlHZXRQYWNrYWdlTmFtZShYRkFfSERPQyBoRG9jLCBGWF9JTlQzMiBpUGFja2FnZSwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1BhY2thZ2UpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNhdmVQYWNrYWdlKFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NQYWNrYWdlLCBJRlhfRmlsZVdyaXRlKiBwRmlsZSwgSVhGQV9DaGVja3N1bUNvbnRleHQgKnBDU0NvbnRleHQgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlDbG9zZURvYyhYRkFfSERPQyBoRG9jKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJbXBvcnREYXRhKFhGQV9IRE9DIGhEb2MsIElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiWERQID0gVFJVRSkgPSAwOw0KKyAgICB2aXJ0dWFsCXZvaWQJCQkJU2V0SlNFUnVudGltZShYRkFfSERPQyBoRG9jLCBGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYSlNFX0hWQUxVRQkJR2V0WEZBU2NyaXB0T2JqZWN0KFhGQV9IRE9DIGhEb2MpID0gMDsNCisgICAgdmlydHVhbCBYRkFfQVRUUklCVVRFRU5VTQlHZXRSZXN0b3JlU3RhdGUoWEZBX0hET0MgaERvYykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuRG9jU2NyaXB0KFhGQV9IRE9DIGhEb2MsIFhGQV9TQ1JJUFRUWVBFIGVTY3JpcHRUeXBlLCBGWF9XU1RSIHdzU2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWEpTRV9IVkFMVUUgaFRoaXNPYmplY3QpID0gMDsNCit9Ow0KK2VudW0gWEZBX0VWRU5UVFlQRSB7DQorICAgIFhGQV9FVkVOVF9DbGljaywNCisgICAgWEZBX0VWRU5UX0NoYW5nZSwNCisgICAgWEZBX0VWRU5UX0RvY0Nsb3NlLA0KKyAgICBYRkFfRVZFTlRfRG9jUmVhZHksDQorICAgIFhGQV9FVkVOVF9FbnRlciwNCisgICAgWEZBX0VWRU5UX0V4aXQsDQorICAgIFhGQV9FVkVOVF9GdWxsLA0KKyAgICBYRkFfRVZFTlRfSW5kZXhDaGFuZ2UsDQorICAgIFhGQV9FVkVOVF9Jbml0aWFsaXplLA0KKyAgICBYRkFfRVZFTlRfTW91c2VEb3duLA0KKyAgICBYRkFfRVZFTlRfTW91c2VFbnRlciwNCisgICAgWEZBX0VWRU5UX01vdXNlRXhpdCwNCisgICAgWEZBX0VWRU5UX01vdXNlVXAsDQorICAgIFhGQV9FVkVOVF9Qb3N0RXhlY3V0ZSwNCisgICAgWEZBX0VWRU5UX1Bvc3RPcGVuLA0KKyAgICBYRkFfRVZFTlRfUG9zdFByaW50LA0KKyAgICBYRkFfRVZFTlRfUG9zdFNhdmUsDQorICAgIFhGQV9FVkVOVF9Qb3N0U2lnbiwNCisgICAgWEZBX0VWRU5UX1Bvc3RTdWJtaXQsDQorICAgIFhGQV9FVkVOVF9QcmVFeGVjdXRlLA0KKyAgICBYRkFfRVZFTlRfUHJlT3BlbiwNCisgICAgWEZBX0VWRU5UX1ByZVByaW50LA0KKyAgICBYRkFfRVZFTlRfUHJlU2F2ZSwNCisgICAgWEZBX0VWRU5UX1ByZVNpZ24sDQorICAgIFhGQV9FVkVOVF9QcmVTdWJtaXQsDQorICAgIFhGQV9FVkVOVF9SZWFkeSwNCisgICAgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUsDQorICAgIFhGQV9FVkVOVF9Jbml0VmFyaWFibGVzLA0KKyAgICBYRkFfRVZFTlRfQ2FsY3VsYXRlLA0KKyAgICBYRkFfRVZFTlRfVmFsaWRhdGUsDQorICAgIFhGQV9FVkVOVF9Vbmtub3duLA0KK307DQorI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlU3VibWl0CQkxDQorI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlUHJpbnQJCTINCisjZGVmaW5lIFhGQV9WQUxJREFURV9wcmVFeGVjdXRlCQkzDQorI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlU2F2ZQkJNA0KK2NsYXNzIENYRkFfRXZlbnRQYXJhbSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9FdmVudFBhcmFtKCkNCisgICAgew0KKyAgICAgICAgbV9wVGFyZ2V0ID0gTlVMTDsNCisgICAgICAgIG1fZVR5cGUgPSBYRkFfRVZFTlRfVW5rbm93bjsNCisgICAgICAgIG1fd3NSZXN1bHQuRW1wdHkoKTsNCisgICAgICAgIFJlc2V0KCk7DQorICAgIH0NCisgICAgdm9pZCBSZXNldCgpDQorICAgIHsNCisgICAgICAgIG1fd3NDaGFuZ2UuRW1wdHkoKTsNCisgICAgICAgIG1faUNvbW1pdEtleSA9IDA7DQorICAgICAgICBtX3dzRnVsbFRleHQuRW1wdHkoKTsNCisgICAgICAgIG1fYktleURvd24gPSBGQUxTRTsNCisgICAgICAgIG1fYk1vZGlmaWVyID0gRkFMU0U7DQorICAgICAgICBtX3dzTmV3Q29udGVudFR5cGUuRW1wdHkoKTsNCisgICAgICAgIG1fd3NOZXdUZXh0LkVtcHR5KCk7DQorICAgICAgICBtX3dzUHJldkNvbnRlbnRUeXBlLkVtcHR5KCk7DQorICAgICAgICBtX3dzUHJldlRleHQuRW1wdHkoKTsNCisgICAgICAgIG1fYlJlZW50ZXIgPSBGQUxTRTsNCisgICAgICAgIG1faVNlbEVuZCA9IDA7DQorICAgICAgICBtX2lTZWxTdGFydCA9IDA7DQorICAgICAgICBtX2JTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgbV93c1NvYXBGYXVsdENvZGUuRW1wdHkoKTsNCisgICAgICAgIG1fd3NTb2FwRmF1bHRTdHJpbmcuRW1wdHkoKTsNCisgICAgICAgIG1fYklzRm9ybVJlYWR5ID0gRkFMU0U7DQorICAgICAgICBtX2lWYWxpZGF0ZUFjdGl2aXRpZXMgPSBYRkFfVkFMSURBVEVfcHJlU3VibWl0Ow0KKyAgICB9DQorICAgIENYRkFfV2lkZ2V0QWNjKgltX3BUYXJnZXQ7DQorICAgIFhGQV9FVkVOVFRZUEUJbV9lVHlwZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c1Jlc3VsdDsNCisgICAgRlhfQk9PTAkJCW1fYkNhbmNlbEFjdGlvbjsNCisgICAgRlhfSU5UMzIJCW1faUNvbW1pdEtleTsNCisgICAgRlhfQk9PTAkJCW1fYktleURvd247DQorICAgIEZYX0JPT0wJCQltX2JNb2RpZmllcjsNCisgICAgRlhfQk9PTAkJCW1fYlJlZW50ZXI7DQorICAgIEZYX0lOVDMyCQltX2lTZWxFbmQ7DQorICAgIEZYX0lOVDMyCQltX2lTZWxTdGFydDsNCisgICAgRlhfQk9PTAkJCW1fYlNoaWZ0Ow0KKyAgICBDRlhfV2lkZVN0cmluZwltX3dzQ2hhbmdlOw0KKyAgICBDRlhfV2lkZVN0cmluZwltX3dzRnVsbFRleHQ7DQorICAgIENGWF9XaWRlU3RyaW5nCW1fd3NOZXdDb250ZW50VHlwZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c05ld1RleHQ7DQorICAgIENGWF9XaWRlU3RyaW5nCW1fd3NQcmV2Q29udGVudFR5cGU7DQorICAgIENGWF9XaWRlU3RyaW5nCW1fd3NQcmV2VGV4dDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c1NvYXBGYXVsdENvZGU7DQorICAgIENGWF9XaWRlU3RyaW5nCW1fd3NTb2FwRmF1bHRTdHJpbmc7DQorICAgIEZYX0JPT0wJCQltX2JJc0Zvcm1SZWFkeTsNCisgICAgRlhfSU5UMzIJCW1faVZhbGlkYXRlQWN0aXZpdGllczsNCit9Ow0KKyNkZWZpbmUgWEZBX0VWRU5URVJST1JfU3VjZXNzCQkxDQorI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9FcnJvcgkJLTENCisjZGVmaW5lIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0CQkwDQorI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZAkJMg0KK2VudW0gWEZBX1dJREdFVE9SREVSIHsNCisgICAgWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyLA0KK307DQorY2xhc3MgSVhGQV9Eb2NWaWV3DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBYRkFfSERPQwkJCUdldERvYygpID0gMDsNCisgICAgdmlydHVhbAlGWF9JTlQzMgkJCVN0YXJ0TGF5b3V0KEZYX0lOVDMyIGlTdGFydFBhZ2UgPSAwKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlEb0xheW91dChJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVN0b3BMYXlvdXQoKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRMYXlvdXRTdGF0dXMoKSA9IDA7DQorICAgIHZpcnR1YWwJdm9pZAkJCQlVcGRhdGVEb2NWaWV3KCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJQ291bnRQYWdlVmlld3MoKSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9QYWdlVmlldyoJCUdldFBhZ2VWaWV3KEZYX0lOVDMyIG5JbmRleCkgPSAwOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJR2V0V2lkZ2V0QnlOYW1lKEZYX1dTVFIgd3NOYW1lKSA9IDA7DQorICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlHZXRXaWRnZXRBY2NCeU5hbWUoRlhfV1NUUiB3c05hbWUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0V2lkZ2V0RGF0YShDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVByb2Nlc3NXaWRnZXRFdmVudChDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSwgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9XaWRnZXRIYW5kbGVyKglHZXRXaWRnZXRIYW5kbGVyKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0SXRlcmF0b3IqCUNyZWF0ZVdpZGdldEl0ZXJhdG9yKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIENyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKFhGQV9XSURHRVRPUkRFUiBlT3JkZXIgPSBYRkFfV0lER0VUT1JERVJfUHJlT3JkZXIpID0gMDsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVAkJCUdldEZvY3VzV2lkZ2V0KCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJS2lsbEZvY3VzKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Rm9jdXMoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KK307DQorI2RlZmluZSBYRkFfVFJBVkVSU0VXQVlfVHJhbnZhbHNlCQkweDAwMDENCisjZGVmaW5lIFhGQV9UUkFWRVJTRVdBWV9Gb3JtCQkJMHgwMDAyDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX1Zpc2libGUJCTB4MDAwMQ0KKyNkZWZpbmUgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZQkJMHgwMDEwDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX1ByaW50YWJsZQkJMHgwMDIwDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX0ZpZWxkCQkJMHgwMTAwDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX0FsbFR5cGUJCTB4MEYwMA0KK2NsYXNzIElYRkFfUGFnZVZpZXcNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIElYRkFfRG9jVmlldyoJR2V0RG9jVmlldygpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0UGFnZVZpZXdJbmRleCgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiAmcnRQYWdlKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCUdldERpc3BsYXlNYXRyaXgoQ0ZYX01hdHJpeCAmbXQsIGNvbnN0IENGWF9SZWN0ICZydERpc3AsIEZYX0lOVDMyIGlSb3RhdGUpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJTG9hZFBhZ2VWaWV3KElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlVbmxvYWRQYWdlVmlldygpID0gMDsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVAkJR2V0V2lkZ2V0QnlQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9XaWRnZXRJdGVyYXRvciogQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoRlhfRFdPUkQgZHdUcmF2ZXJzZVdheSA9IFhGQV9UUkFWRVJTRVdBWV9Gb3JtLCBGWF9EV09SRCBkd1dpZGdldEZpbHRlciA9IFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8IFhGQV9XSURHRVRGSUxURVJfVmlld2FibGUgfCBYRkFfV0lER0VURklMVEVSX0FsbFR5cGUpID0gMDsNCit9Ow0KK2NsYXNzIENYRkFfUmVuZGVyT3B0aW9ucyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9SZW5kZXJPcHRpb25zKCkNCisgICAgICAgIDogbV9iUHJpbnQoRkFMU0UpDQorICAgICAgICAsIG1fYkhpZ2hsaWdodChUUlVFKQ0KKyAgICB7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCW1fYlByaW50Ow0KKyAgICBGWF9CT09MCQkJbV9iSGlnaGxpZ2h0Ow0KK307DQorI2RlZmluZSBYRkFfUkVOREVSU1RBVFVTX1JlYWR5CQkJMQ0KKyNkZWZpbmUgWEZBX1JFTkRFUlNUQVRVU19Ub0JlQ29udGludWVkCTINCisjZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfRG9uZQkJCTMNCisjZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfRmFpbGVkCQkJLTENCitjbGFzcyBJWEZBX1JlbmRlckNvbnRleHQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX01hdHJpeCYgcE1hdHJpeCwgY29uc3QgQ1hGQV9SZW5kZXJPcHRpb25zJiBvcHRpb25zKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJRG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwJdm9pZAkJU3RvcFJlbmRlcigpID0gMDsNCit9Ow0KK0lYRkFfUmVuZGVyQ29udGV4dCoJWEZBX1JlbmRlckNvbnRleHRfQ3JlYXRlKCk7DQorZW51bSBYRkFfV0lER0VUVFlQRSB7DQorICAgIFhGQV9XSURHRVRUWVBFX0JhcmNvZGUsDQorICAgIFhGQV9XSURHRVRUWVBFX1B1c2hCdXR0b24sDQorICAgIFhGQV9XSURHRVRUWVBFX0NoZWNrQnV0dG9uLA0KKyAgICBYRkFfV0lER0VUVFlQRV9SYWRpb0J1dHRvbiwNCisgICAgWEZBX1dJREdFVFRZUEVfRGF0ZXRpbWVFZGl0LA0KKyAgICBYRkFfV0lER0VUVFlQRV9EZWNpbWFsRmllbGQsDQorICAgIFhGQV9XSURHRVRUWVBFX051bWVyaWNGaWVsZCwNCisgICAgWEZBX1dJREdFVFRZUEVfU2lnbmF0dXJlLA0KKyAgICBYRkFfV0lER0VUVFlQRV9UZXh0RWRpdCwNCisgICAgWEZBX1dJREdFVFRZUEVfRHJvcGRvd25MaXN0LA0KKyAgICBYRkFfV0lER0VUVFlQRV9MaXN0Qm94LA0KKyAgICBYRkFfV0lER0VUVFlQRV9JbWFnZUZpZWxkLA0KKyAgICBYRkFfV0lER0VUVFlQRV9QYXNzd29yZEVkaXQsDQorICAgIFhGQV9XSURHRVRUWVBFX0FyYywNCisgICAgWEZBX1dJREdFVFRZUEVfUmVjdGFuZ2xlLA0KKyAgICBYRkFfV0lER0VUVFlQRV9JbWFnZSwNCisgICAgWEZBX1dJREdFVFRZUEVfTGluZSwNCisgICAgWEZBX1dJREdFVFRZUEVfVGV4dCwNCisgICAgWEZBX1dJREdFVFRZUEVfRXhjbHVkZUdyb3VwLA0KKyAgICBYRkFfV0lER0VUVFlQRV9TdWJmb3JtLA0KKyAgICBYRkFfV0lER0VUVFlQRV9Vbmtub3duLA0KK307DQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUJMHgwMDAwMDAwMQ0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19JbnZpc2libGUJMHgwMDAwMDAwMg0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19IaWRkZW4JCTB4MDAwMDAwMDQNCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUJMHgwMDAwMDAxMA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19QcmludGFibGUJMHgwMDAwMDAyMA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkCTB4MDAwMDAxMDANCitjbGFzcyBJWEZBX1dpZGdldEhhbmRsZXINCit7DQorcHVibGljOg0KKw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQlDcmVhdGVXaWRnZXQoWEZBX0hXSURHRVQgaFBhcmVudCwgWEZBX1dJREdFVFRZUEUgZVR5cGUsIFhGQV9IV0lER0VUIGhCZWZvcmUgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9QYWdlVmlldyoJR2V0UGFnZVZpZXcoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRSZWN0KFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9SZWN0RiAmcnQpID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0U3RhdHVzKFhGQV9IV0lER0VUIGhXaWRnZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJR2V0RGF0YUFjYyhYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCUdldE5hbWUoWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgRlhfSU5UMzIgaU5hbWVUeXBlID0gMCkgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQlHZXRUb29sVGlwKFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c1Rvb2xUaXApID0gMDsNCisgICAgdmlydHVhbAl2b2lkCQkJU2V0UHJpdmF0ZURhdGEoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfTFBWT0lEIG1vZHVsZV9pZCwgRlhfTFBWT0lEIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0xQVk9JRAkJR2V0UHJpdmF0ZURhdGEoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfTFBWT0lEIG1vZHVsZV9pZCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbk1vdXNlRW50ZXIoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbk1vdXNlRXhpdChYRkFfSFdJREdFVCBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCU9uTEJ1dHRvbkRvd24oWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCU9uTEJ1dHRvblVwKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbkxCdXR0b25EYmxDbGsoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCU9uTW91c2VNb3ZlKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbk1vdXNlV2hlZWwoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfU0hPUlQgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJT25SQnV0dG9uRG93bihYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJT25SQnV0dG9uVXAoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCU9uUkJ1dHRvbkRibENsayhYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJT25LZXlEb3duKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbktleVVwKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbkNoYXIoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7DQorICAgIHZpcnR1YWwJRlhfRFdPUkQJCU9uSGl0VGVzdChYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJT25TZXRDdXJzb3IoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbmRlcldpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0JPT0wgYkhpZ2hsaWdodCA9IEZBTFNFKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUHJvY2Vzc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgPSAwOw0KK307DQorY2xhc3MgSVhGQV9XaWRnZXRJdGVyYXRvcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXQoKSA9IDA7DQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQJCQlNb3ZlVG9GaXJzdCgpID0gMDsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVAkJCU1vdmVUb0xhc3QoKSA9IDA7DQorICAgIHZpcnR1YWwJWEZBX0hXSURHRVQJCQlNb3ZlVG9OZXh0KCkgPSAwOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvUHJldmlvdXMoKSA9IDA7DQorICAgIHZpcnR1YWwJWEZBX0hXSURHRVQJCQlHZXRDdXJyZW50V2lkZ2V0KCkgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJU2V0Q3VycmVudFdpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0KSAgPSAwOw0KK307DQorY2xhc3MgSVhGQV9XaWRnZXRBY2NJdGVyYXRvcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXQoKSA9IDA7DQorICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlNb3ZlVG9GaXJzdCgpID0gMDsNCisgICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJCU1vdmVUb0xhc3QoKSA9IDA7DQorICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlNb3ZlVG9OZXh0KCkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvUHJldmlvdXMoKSA9IDA7DQorICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlHZXRDdXJyZW50V2lkZ2V0QWNjKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q3VycmVudFdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2tpcFRyZWUoKSA9IDA7DQorfTsNCitJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBYRkFfV2lkZ2V0QWNjSXRlcmF0b3JfQ3JlYXRlKENYRkFfV2lkZ2V0QWNjKiBwVHJhdmVsUm9vdCwgWEZBX1dJREdFVE9SREVSIGVPcmRlciA9IFhGQV9XSURHRVRPUkRFUl9QcmVPcmRlcik7DQorY2xhc3MgSVhGQV9DaGVja3N1bUNvbnRleHQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVN0YXJ0Q2hlY2tzdW0oKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlVcGRhdGVDaGVja3N1bShJRlhfRmlsZVJlYWQqIHBTcmNGaWxlLCBGWF9GSUxFU0laRSBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IDApID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCUZpbmlzaENoZWNrc3VtKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0Q2hlY2tzdW0oQ0ZYX0J5dGVTdHJpbmcgJmJzQ2hlY2tzdW0pID0gMDsNCit9Ow0KK0lYRkFfQ2hlY2tzdW1Db250ZXh0KglYRkFfQ2hlY2tzdW1fQ3JlYXRlKCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhmYS9meGZhX2Jhc2ljLmggYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfYmFzaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ1MDYwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhX2Jhc2ljLmgKQEAgLTAsMCArMSwxMDczIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfQkFTSUNfSA0KKyNkZWZpbmUgX0ZYRkFfQkFTSUNfSA0KK2NsYXNzIENYRkFfTWVhc3VyZW1lbnQ7DQorI2RlZmluZSBYRkFfSEFTSENPREVfWGZhCQkJCQkweGM1NmI5ZmYNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Db25maWcJCQkJCTB4NGUxZTM5YjYNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9UZW1wbGF0ZQkJCQkweDgwMzU1MGZjDQorI2RlZmluZSBYRkFfSEFTSENPREVfRGF0YXNldHMJCQkJMHg5OWI5NTA3OQ0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0RhdGEJCQkJCTB4YmRlOWFiZGENCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Gb3JtCQkJCQkweGNkMzA5ZmY0DQorI2RlZmluZSBYRkFfSEFTSENPREVfTG9jYWxlU2V0CQkJCTB4NTQ3M2I2ZGMNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Db25uZWN0aW9uU2V0CQkJMHhlMTRjODAxYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1NvdXJjZVNldAkJCQkweDgxMTkyOWQNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9YZGMJCQkJCTB4YzU2YWZiZg0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1BkZgkJCQkJMHhiODQzZGJhDQorI2RlZmluZSBYRkFfSEFTSENPREVfWGZkZgkJCQkJMHg0OGQwMDRhOA0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1htcG1ldGEJCQkJMHgxMzJhOGZiYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1NpZ25hdHVyZQkJCQkweDhiMDM2ZjMyDQorI2RlZmluZSBYRkFfSEFTSENPREVfU3R5bGVzaGVldAkJCQkweDYwMzg1ODBhDQorI2RlZmluZSBYRkFfSEFTSENPREVfWERQCQkJCQkweGM1NmFmY2MNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9SZWNvcmQJCQkJCTB4NTc3OWQ2NWYNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9EYXRhV2luZG93CQkJCTB4ODNhNTUwZDINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Ib3N0CQkJCQkweGRiMDc1YmRlDQorI2RlZmluZSBYRkFfSEFTSENPREVfTG9nCQkJCQkweDBiMWIzZDIyDQorI2RlZmluZSBYRkFfSEFTSENPREVfRXZlbnQJCQkJCTB4MTg1ZTQxZTINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9MYXlvdXQJCQkJCTB4N2U3ZTg0NWUNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9PY2N1cgkJCQkJMHhmN2VlYmUxYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1RoaXMJCQkJCTB4MmQ1NzRkNTgNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9EYXRhRGVzY3JpcHRpb24JCTB4MmI1ZGY1MWUNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9OYW1lCQkJCQkweDMxYjE5YzENCitlbnVtIFhGQV9QQUNLRVQgew0KKyAgICBYRkFfUEFDS0VUX1VTRVIsDQorICAgIFhGQV9QQUNLRVRfU291cmNlU2V0LA0KKyAgICBYRkFfUEFDS0VUX1BkZiwNCisgICAgWEZBX1BBQ0tFVF9YZGMsDQorICAgIFhGQV9QQUNLRVRfWERQLA0KKyAgICBYRkFfUEFDS0VUX1htcG1ldGEsDQorICAgIFhGQV9QQUNLRVRfWGZkZiwNCisgICAgWEZBX1BBQ0tFVF9Db25maWcsDQorICAgIFhGQV9QQUNLRVRfTG9jYWxlU2V0LA0KKyAgICBYRkFfUEFDS0VUX1N0eWxlc2hlZXQsDQorICAgIFhGQV9QQUNLRVRfVGVtcGxhdGUsDQorICAgIFhGQV9QQUNLRVRfU2lnbmF0dXJlLA0KKyAgICBYRkFfUEFDS0VUX0RhdGFzZXRzLA0KKyAgICBYRkFfUEFDS0VUX0Zvcm0sDQorICAgIFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCwNCit9Ow0KK2VudW0gWEZBX1hEUFBBQ0tFVCB7DQorICAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTgkJCT0gMCwNCisgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcJCQk9IDEgPDwgWEZBX1BBQ0tFVF9Db25maWcJCSwNCisgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZQkJCT0gMSA8PCBYRkFfUEFDS0VUX1RlbXBsYXRlCQksDQorICAgIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMJCQk9IDEgPDwgWEZBX1BBQ0tFVF9EYXRhc2V0cwkJLA0KKyAgICBYRkFfWERQUEFDS0VUX0Zvcm0JCQkJPSAxIDw8IFhGQV9QQUNLRVRfRm9ybQkJCSwNCisgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQJCQk9IDEgPDwgWEZBX1BBQ0tFVF9Mb2NhbGVTZXQJCSwNCisgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0CQk9IDEgPDwgWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0CSwNCisgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQJCQk9IDEgPDwgWEZBX1BBQ0tFVF9Tb3VyY2VTZXQJCSwNCisgICAgWEZBX1hEUFBBQ0tFVF9YZGMJCQkJPSAxIDw8IFhGQV9QQUNLRVRfWGRjCQkJLA0KKyAgICBYRkFfWERQUEFDS0VUX1BkZgkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9QZGYJCQksDQorICAgIFhGQV9YRFBQQUNLRVRfWGZkZgkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9YZmRmCQkJLA0KKyAgICBYRkFfWERQUEFDS0VUX1htcG1ldGEJCQk9IDEgPDwgWEZBX1BBQ0tFVF9YbXBtZXRhCQksDQorICAgIFhGQV9YRFBQQUNLRVRfU2lnbmF0dXJlCQkJPSAxIDw8IFhGQV9QQUNLRVRfU2lnbmF0dXJlCQksDQorICAgIFhGQV9YRFBQQUNLRVRfU3R5bGVzaGVldAkJPSAxIDw8IFhGQV9QQUNLRVRfU3R5bGVzaGVldAksDQorICAgIFhGQV9YRFBQQUNLRVRfVVNFUgkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9VU0VSCQkJLA0KKyAgICBYRkFfWERQUEFDS0VUX1hEUAkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9YRFAJCQksDQorfTsNCitlbnVtIFhGQV9YRFBQQUNLRVRfRkxBR1Mgew0KKyAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX0NPTVBMRVRFTUFUQ0gJPQkxLA0KKyAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENICQk9CTIsDQorICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSAkJCT0JNCwNCisgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FCQk9CTgsDQorICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTlkJCT0JMTYsDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX1BBQ0tFVElORk8gew0KKyAgICBGWF9VSU5UMzIJCQkJCXVIYXNoOw0KKyAgICBGWF9MUENXU1RSCQkJCQlwTmFtZTsNCisgICAgWEZBX1hEUFBBQ0tFVAkJCQllTmFtZTsNCisgICAgRlhfTFBDV1NUUgkJCQkJcFVSSTsNCisgICAgRlhfRFdPUkQJCQkJCWVGbGFnczsNCit9IFhGQV9QQUNLRVRJTkZPLCAqIFhGQV9MUFBBQ0tFVElORk87DQordHlwZWRlZiBYRkFfUEFDS0VUSU5GTyBjb25zdCAqIFhGQV9MUENQQUNLRVRJTkZPOw0KK1hGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeU5hbWUoRlhfV1NUUiB3c05hbWUpOw0KK1hGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeUlEKEZYX0RXT1JEIGR3UGFja2V0KTsNCitleHRlcm4gY29uc3QgWEZBX1BBQ0tFVElORk8gZ19YRkFQYWNrZXREYXRhW107DQoraW5saW5lIFhGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVQgZVBhY2tldCkNCit7DQorICAgIHJldHVybiBnX1hGQVBhY2tldERhdGEgKyBlUGFja2V0Ow0KK30NCitlbnVtIFhGQV9BVFRSSUJVVEVFTlVNIHsNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQXN0ZXJpc2ssDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NsYXNoLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9CYWNrc2xhc2gsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX09uLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9UYiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVXAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9EZWxlZ2F0ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFN1Ym1pdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3MsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX05leHQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Nob3J0RWRnZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSGVpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0RpYWdvbmFsLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9BbGwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0FueSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTWF0Y2hUZW1wbGF0ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRHBsLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9JbnZpc2libGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ZpdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fV2lkdGgsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVN1Ym1pdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSXBsLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9GbGF0ZUNvbXByZXNzLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9NZWQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX09kZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fT2ZmLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QZGYsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JvdywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVG9wLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9YZHAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1hmZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fWG1sLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9aaXAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1pwbCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRXhjbHVkZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUGFpciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRmlsdGVyLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlTGFzdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0QW5kSW1wb3J0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QdXNoLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3J0cmFpdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRGVmYXVsdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3RvcmVkUHJvYywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3RheUJPRiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3RheUVPRiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFByaW50LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Vc0NhcnJpZXIsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVPcGVuLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Jlc3QsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3RhbmRhcmRTeW1ib2wsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luaXRpYWxpemUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTGFuZHNjYXBlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Ob25JbnRlcmFjdGl2ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9NaW51cywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRGlhZ29uYWxMZWZ0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Eb2N1bWVudCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQXV0bywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3csDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUNlbnRlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVGNwbCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVGV4dCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fR3JvdXBpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NlY3VyZVN5bWJvbCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlRXhlY3V0ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jQ2xvc2UsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0tleXNldCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVmVydGljYWwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNhdmUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVG9Ub3AsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcmlmeSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRmlyc3QsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUGVzc2ltaXN0aWMsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JlbWVyZ2UsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1BlcmNlbnQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V2ZW4sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Rvb2xUaXAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9SZWFkT25seSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ3VycmVuY3ksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NvbmNhdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVGhhaSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Zvcm1kYXRhLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9HcmVlaywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRGVjaW1hbCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU2VsZWN0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Mb25nRWRnZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUHJvdGVjdGVkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fWmVybywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRm9yd2FyZE9ubHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RvY1JlYWR5LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW4sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luYWN0aXZlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9FbWJlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3RhdGljLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9PbkVudHJ5LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9DeXJpbGxpYywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTm9uQmxhbmssDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcFJpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9IZWJyZXcsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcExlZnQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9EaWFtb25kLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlT2RkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV8xbW9kMTAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0tvcmVhbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmVFbWJlZGRlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fWmlwQ29tcHJlc3MsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWMsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NpcmNsZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVG9Cb3R0b20sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9VcGRhdGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0lzb25hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NlcnZlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1VzZVByaW50ZXJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9PdXRsaW5lLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fT25jZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fT25seSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fT3BlbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ2FwdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9SZWZBbmREZXNjZW5kYW50cywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VGcm9udCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW9ub3NwYWNlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVByaW50LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9BbHdheXMsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvTGVmdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3QsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWdvcmlhbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUm9tYW4sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRG93biwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3ltYm9sLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRXZlbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU2lnbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQWRkTmV3LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9TdGFyLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9PcHRpbWlzdGljLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9SbF90YiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01haW50YWluLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QYWNrYWdlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGlmaWVkQ2hpbmVzZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVG9DZW50ZXIsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JhY2ssDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Vuc3BlY2lmaWVkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9CYXRjaE9wdGltaXN0aWMsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JvbGQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdGgsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fMm1vZDEwLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0hvcml6b250YWwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RvdHRlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2wsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsUmlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnN1bWVEYXRhLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9DaGVjaywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRGF0YSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRG93biwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU2Fuc1NlcmlmLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9JbmxpbmUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RyYWRpdGlvbmFsQ2hpbmVzZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fV2FybiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJhY3RpdmVGb3JtcywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fV29yZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9SZXF1aXJlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0T25seSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3dFbWJlZGRlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSmFwYW5lc2UsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3JvdywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVmlldG5hbWVzZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRWFzdEV1cm9wZWFuUm9tYW4sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlVXAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydE9ubHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NsZWFyLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9DbGljaywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9DbG9zZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSG9zdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9CbGFuaywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVGFibGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ3VzdG9tLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVMZWZ0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0RXhlY3V0ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXgsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RPcGVuLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9FbnRlciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSWdub3JlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRmFudGFzeSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSXRhbGljLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9BdXRob3IsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NIYXRjaCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRGFzaERvdERvdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9EeW5hbWljLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9NYW51YWwsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fVmFsaWRhdGlvblN0YXRlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9DdXJzaXZlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9MYXN0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9MaW5rLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Mb25nLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcm5hdGlvbmFsQ2FycmllciwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUERGMV8zLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QREYxXzYsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NlcmlmLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2F2ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUmVhZHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTaWduLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9BcmFiaWMsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9VcmxlbmNvZGVkLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkLA0KK307DQorZW51bSBYRkFfQVRUUklCVVRFIHsNCisgICAgWEZBX0FUVFJJQlVURV9ILA0KKyAgICBYRkFfQVRUUklCVVRFX1csDQorICAgIFhGQV9BVFRSSUJVVEVfWCwNCisgICAgWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1RvLA0KKyAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLA0KKyAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwNCisgICAgWEZBX0FUVFJJQlVURV9CZWZvcmVUYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9OZXh0LA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGFSb3dDb3VudCwNCisgICAgWEZBX0FUVFJJQlVURV9CcmVhaywNCisgICAgWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX0ZvbnRIb3Jpem9udGFsU2NhbGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwNCisgICAgWEZBX0FUVFJJQlVURV9Db250ZXh0LA0KKyAgICBYRkFfQVRUUklCVVRFX1RyYXlPdXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ2FwLA0KKyAgICBYRkFfQVRUUklCVVRFX01heCwNCisgICAgWEZBX0FUVFJJQlVURV9NaW4sDQorICAgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1JpZCwNCisgICAgWEZBX0FUVFJJQlVURV9VcmwsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwNCisgICAgWEZBX0FUVFJJQlVURV9XaWRvd3MsDQorICAgIFhGQV9BVFRSSUJVVEVfTGV2ZWwsDQorICAgIFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywNCisgICAgWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sdW1uV2lkdGhzLA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9Ob25SZXB1ZGlhdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9SYXRlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsDQorICAgIFhGQV9BVFRSSUJVVEVfUm9sZSwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1RpbWVvdXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Zvcm1hdCwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhUHJlcCwNCisgICAgWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhLA0KKyAgICBYRkFfQVRUUklCVVRFX0FiYnIsDQorICAgIFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwNCisgICAgWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwNCisgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsDQorICAgIFhGQV9BVFRSSUJVVEVfV29yZENoYXJhY3RlckNvdW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwNCisgICAgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfUHJpb3JpdHksDQorICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLA0KKyAgICBYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLA0KKyAgICBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9MaXN0ZW4sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LA0KKyAgICBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJsaW5lUGVyaW9kLA0KKyAgICBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsDQorICAgIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LA0KKyAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwNCisgICAgWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2FnZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZXJ2ZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbGlhc05vZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZlcnNpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLA0KKyAgICBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwNCisgICAgWEZBX0FUVFJJQlVURV9DdXJzb3JUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0RpZ2l0YWxTaWduYXR1cmUsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29kZVR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfT3V0cHV0LA0KKyAgICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LA0KKyAgICBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVJbml0aWFsQ2FwLA0KKyAgICBYRkFfQVRUUklCVVRFX0ZvcmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NybFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfUHJldmlvdXMsDQorICAgIFhGQV9BVFRSSUJVVEVfUHVzaENoYXJhY3RlckNvdW50LA0KKyAgICBYRkFfQVRUUklCVVRFX051bGxUZXN0LA0KKyAgICBYRkFfQVRUUklCVVRFX1J1bkF0LA0KKyAgICBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQorICAgIFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwNCisgICAgWEZBX0FUVFJJQlVURV9OdW1iZXJPZkNlbGxzLA0KKyAgICBYRkFfQVRUUklCVVRFX0xldHRlclNwYWNpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwNCisgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywNCisgICAgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXJrLA0KKyAgICBYRkFfQVRUUklCVVRFX01heEgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4VywNCisgICAgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9NaW5ILA0KKyAgICBYRkFfQVRUUklCVVRFX01pblcsDQorICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwNCisgICAgWEZBX0FUVFJJQlVURV9Nb2RlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xheW91dCwNCisgICAgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsDQorICAgIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsDQorICAgIFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhDaGFycywNCisgICAgWEZBX0FUVFJJQlVURV9PcGVuLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywNCisgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwNCisgICAgWEZBX0FUVFJJQlVURV9TaWduYXR1cmVUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgICBYRkFfQVRUUklCVVRFX1NoYXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhYlN0b3BzLA0KKyAgICBYRkFfQVRUUklCVVRFX091dHB1dEJlbG93LA0KKyAgICBYRkFfQVRUUklCVVRFX1Nob3J0LA0KKyAgICBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywNCisgICAgWEZBX0FUVFJJQlVURV9Db21taXRPbiwNCisgICAgWEZBX0FUVFJJQlVURV9SZW1haW5DaGFyYWN0ZXJDb3VudCwNCisgICAgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfRXJyb3JDb3JyZWN0aW9uTGV2ZWwsDQorICAgIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwNCisgICAgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQ2lyY3VsYXIsDQorICAgIFhGQV9BVFRSSUJVVEVfUHNOYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLA0KKyAgICBYRkFfQVRUUklCVVRFX0V4ZWN1dGVUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0R1cGxleEltcG9zaXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVHJheUluLA0KKyAgICBYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLA0KKyAgICBYRkFfQVRUUklCVVRFX0JvZkFjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9TYXZlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfU2l6ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Jbml0aWFsTnVtYmVyLA0KKyAgICBYRkFfQVRUUklCVVRFX1Nsb3BlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NTcGFjZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLA0KKyAgICBYRkFfQVRUUklCVVRFX0JpbmRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sDQorICAgIFhGQV9BVFRSSUJVVEVfQ2hhckVuY29kaW5nLA0KKyAgICBYRkFfQVRUUklCVVRFX0JpbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LA0KKyAgICBYRkFfQVRUUklCVVRFX0FyY2hpdmUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXVpZCwNCisgICAgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FmdGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX09ycGhhbnMsDQorICAgIFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwNCisgICAgWEZBX0FUVFJJQlVURV9XZWlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGEsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhQ29sdW1uQ291bnQsDQorICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgsDQorICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LA0KKyAgICBYRkFfQVRUUklCVVRFX0N1cnNvckxvY2F0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9QaWNrZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfRnJvbSwNCisgICAgWEZBX0FUVFJJQlVURV9CYXNlUHJvZmlsZSwNCisgICAgWEZBX0FUVFJJQlVURV9Bc3BlY3QsDQorICAgIFhGQV9BVFRSSUJVVEVfUm93Q29sdW1uUmF0aW8sDQorICAgIFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwNCisgICAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfVmFsdWVSZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4RW50cmllcywNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LA0KKyAgICBYRkFfQVRUUklCVVRFX0lucHV0LA0KKyAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgICBYRkFfQVRUUklCVVRFX0JsYW5rT3JOb3RCbGFuaywNCisgICAgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywNCisgICAgWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LA0KKyAgICBYRkFfQVRUUklCVVRFX0hhbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywNCisgICAgWEZBX0FUVFJJQlVURV9QZXJtaXNzaW9ucywNCisgICAgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1N0b2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lzTnVsbCwNCisgICAgWEZBX0FUVFJJQlVURV9SZXN0b3JlU3RhdGUsDQorICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUFsbENhcHMsDQorICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwNCisgICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX0pvaW4sDQorICAgIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfUmFkaXVzLA0KKyAgICBYRkFfQVRUUklCVVRFX1NvdXJjZUFib3ZlLA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NsYXNzSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGlzYWJsZSwNCisgICAgWEZBX0FUVFJJQlVURV9TY29wZSwNCisgICAgWEZBX0FUVFJJQlVURV9NYXRjaCwNCisgICAgWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlLA0KKyAgICBYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsDQorICAgIFhGQV9BVFRSSUJVVEVfRW5kQ2hhciwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfSW50YWN0LA0KKyAgICBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVjaXBoZXJPbmx5LA0KK307DQorZW51bSBYRkFfRUxFTUVOVCB7DQorICAgIFhGQV9FTEVNRU5UX1BzLA0KKyAgICBYRkFfRUxFTUVOVF9UbywNCisgICAgWEZBX0VMRU1FTlRfVWksDQorICAgIFhGQV9FTEVNRU5UX1JlY29yZFNldCwNCisgICAgWEZBX0VMRU1FTlRfU3Vic2V0QmVsb3csDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsDQorICAgIFhGQV9FTEVNRU5UX0Fkb2JlRXh0ZW5zaW9uTGV2ZWwsDQorICAgIFhGQV9FTEVNRU5UX1R5cGVmYWNlLA0KKyAgICBYRkFfRUxFTUVOVF9CcmVhaywNCisgICAgWEZBX0VMRU1FTlRfRm9udEluZm8sDQorICAgIFhGQV9FTEVNRU5UX051bWJlclBhdHRlcm4sDQorICAgIFhGQV9FTEVNRU5UX0R5bmFtaWNSZW5kZXIsDQorICAgIFhGQV9FTEVNRU5UX1ByaW50U2NhbGluZywNCisgICAgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sDQorICAgIFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywNCisgICAgWEZBX0VMRU1FTlRfU291cmNlU2V0LA0KKyAgICBYRkFfRUxFTUVOVF9BbWQsDQorICAgIFhGQV9FTEVNRU5UX0FyYywNCisgICAgWEZBX0VMRU1FTlRfRGF5LA0KKyAgICBYRkFfRUxFTUVOVF9FcmEsDQorICAgIFhGQV9FTEVNRU5UX0pvZywNCisgICAgWEZBX0VMRU1FTlRfTG9nLA0KKyAgICBYRkFfRUxFTUVOVF9NYXAsDQorICAgIFhGQV9FTEVNRU5UX01kcCwNCisgICAgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsDQorICAgIFhGQV9FTEVNRU5UX09pZCwNCisgICAgWEZBX0VMRU1FTlRfUGNsLA0KKyAgICBYRkFfRUxFTUVOVF9QZGYsDQorICAgIFhGQV9FTEVNRU5UX1JlZiwNCisgICAgWEZBX0VMRU1FTlRfVXJpLA0KKyAgICBYRkFfRUxFTUVOVF9YZGMsDQorICAgIFhGQV9FTEVNRU5UX1hkcCwNCisgICAgWEZBX0VMRU1FTlRfWGZhLA0KKyAgICBYRkFfRUxFTUVOVF9Yc2wsDQorICAgIFhGQV9FTEVNRU5UX1pwbCwNCisgICAgWEZBX0VMRU1FTlRfQ2FjaGUsDQorICAgIFhGQV9FTEVNRU5UX01hcmdpbiwNCisgICAgWEZBX0VMRU1FTlRfS2V5VXNhZ2UsDQorICAgIFhGQV9FTEVNRU5UX0V4Y2x1ZGUsDQorICAgIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsDQorICAgIFhGQV9FTEVNRU5UX0xldmVsLA0KKyAgICBYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsDQorICAgIFhGQV9FTEVNRU5UX0NhbGVuZGFyU3ltYm9scywNCisgICAgWEZBX0VMRU1FTlRfUGFyYSwNCisgICAgWEZBX0VMRU1FTlRfUGFydCwNCisgICAgWEZBX0VMRU1FTlRfUGRmYSwNCisgICAgWEZBX0VMRU1FTlRfRmlsdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9QcmVzZW50LA0KKyAgICBYRkFfRUxFTUVOVF9QYWdpbmF0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9FbmNvZGluZywNCisgICAgWEZBX0VMRU1FTlRfRXZlbnQsDQorICAgIFhGQV9FTEVNRU5UX1doaXRlc3BhY2UsDQorICAgIFhGQV9FTEVNRU5UX0RlZmF1bHRVaSwNCisgICAgWEZBX0VMRU1FTlRfRGF0YU1vZGVsLA0KKyAgICBYRkFfRUxFTUVOVF9CYXJjb2RlLA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwNCisgICAgWEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsDQorICAgIFhGQV9FTEVNRU5UX0VuZm9yY2UsDQorICAgIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywNCisgICAgWEZBX0VMRU1FTlRfQWRkU2lsZW50UHJpbnQsDQorICAgIFhGQV9FTEVNRU5UX1JlbmFtZSwNCisgICAgWEZBX0VMRU1FTlRfT3BlcmF0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9UeXBlZmFjZXMsDQorICAgIFhGQV9FTEVNRU5UX1N1YmplY3RETnMsDQorICAgIFhGQV9FTEVNRU5UX0lzc3VlcnMsDQorICAgIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVBzZXVkb01vZGVsLA0KKyAgICBYRkFfRUxFTUVOVF9Xc2RsQ29ubmVjdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfRGVidWcsDQorICAgIFhGQV9FTEVNRU5UX0RlbHRhLA0KKyAgICBYRkFfRUxFTUVOVF9FcmFOYW1lcywNCisgICAgWEZBX0VMRU1FTlRfTW9kaWZ5QW5ub3RzLA0KKyAgICBYRkFfRUxFTUVOVF9TdGFydE5vZGUsDQorICAgIFhGQV9FTEVNRU5UX0J1dHRvbiwNCisgICAgWEZBX0VMRU1FTlRfRm9ybWF0LA0KKyAgICBYRkFfRUxFTUVOVF9Cb3JkZXIsDQorICAgIFhGQV9FTEVNRU5UX0FyZWEsDQorICAgIFhGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9UeXBlLA0KKyAgICBYRkFfRUxFTUVOVF9PdmVycHJpbnQsDQorICAgIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywNCisgICAgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsDQorICAgIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LA0KKyAgICBYRkFfRUxFTUVOVF9QcmludGVyTmFtZSwNCisgICAgWEZBX0VMRU1FTlRfU3RhcnRQYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9QYWdlT2Zmc2V0LA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZSwNCisgICAgWEZBX0VMRU1FTlRfQ29tYiwNCisgICAgWEZBX0VMRU1FTlRfUGF0dGVybiwNCisgICAgWEZBX0VMRU1FTlRfSWZFbXB0eSwNCisgICAgWEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsDQorICAgIFhGQV9FTEVNRU5UX091dHB1dEJpbiwNCisgICAgWEZBX0VMRU1FTlRfRmllbGQsDQorICAgIFhGQV9FTEVNRU5UX0FnZW50LA0KKyAgICBYRkFfRUxFTUVOVF9PdXRwdXRYU0wsDQorICAgIFhGQV9FTEVNRU5UX0FkanVzdERhdGEsDQorICAgIFhGQV9FTEVNRU5UX0F1dG9TYXZlLA0KKyAgICBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSwNCisgICAgWEZBX0VMRU1FTlRfRXZlbnRQc2V1ZG9Nb2RlbCwNCisgICAgWEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsDQorICAgIFhGQV9FTEVNRU5UX1NvbGlkLA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZVN5bWJvbHMsDQorICAgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25MZXZlbCwNCisgICAgWEZBX0VMRU1FTlRfRWRnZSwNCisgICAgWEZBX0VMRU1FTlRfU3RpcHBsZSwNCisgICAgWEZBX0VMRU1FTlRfQXR0cmlidXRlcywNCisgICAgWEZBX0VMRU1FTlRfVmVyc2lvbkNvbnRyb2wsDQorICAgIFhGQV9FTEVNRU5UX01lcmlkaWVtLA0KKyAgICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICAgIFhGQV9FTEVNRU5UX1Rvb2xUaXAsDQorICAgIFhGQV9FTEVNRU5UX0NvbXByZXNzLA0KKyAgICBYRkFfRUxFTUVOVF9SZWFzb24sDQorICAgIFhGQV9FTEVNRU5UX0V4ZWN1dGUsDQorICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRDb3B5LA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsDQorICAgIFhGQV9FTEVNRU5UX0NvbmZpZywNCisgICAgWEZBX0VMRU1FTlRfSW1hZ2UsDQorICAgIFhGQV9FTEVNRU5UX1NoYXJweEhUTUwsDQorICAgIFhGQV9FTEVNRU5UX051bWJlck9mQ29waWVzLA0KKyAgICBYRkFfRUxFTUVOVF9CZWhhdmlvck92ZXJyaWRlLA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lU3RhbXAsDQorICAgIFhGQV9FTEVNRU5UX01vbnRoLA0KKyAgICBYRkFfRUxFTUVOVF9WaWV3ZXJQcmVmZXJlbmNlcywNCisgICAgWEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsDQorICAgIFhGQV9FTEVNRU5UX0RlY2ltYWwsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgIFhGQV9FTEVNRU5UX1NlbGVjdCwNCisgICAgWEZBX0VMRU1FTlRfV2luZG93LA0KKyAgICBYRkFfRUxFTUVOVF9Mb2NhbGVTZXQsDQorICAgIFhGQV9FTEVNRU5UX0hhbmRsZXIsDQorICAgIFhGQV9FTEVNRU5UX0hvc3RQc2V1ZG9Nb2RlbCwNCisgICAgWEZBX0VMRU1FTlRfUHJlc2VuY2UsDQorICAgIFhGQV9FTEVNRU5UX1JlY29yZCwNCisgICAgWEZBX0VMRU1FTlRfRW1iZWQsDQorICAgIFhGQV9FTEVNRU5UX1ZlcnNpb24sDQorICAgIFhGQV9FTEVNRU5UX0NvbW1hbmQsDQorICAgIFhGQV9FTEVNRU5UX0NvcGllcywNCisgICAgWEZBX0VMRU1FTlRfU3RhcGxlLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsDQorICAgIFhGQV9FTEVNRU5UX0Jvb2xlYW4sDQorICAgIFhGQV9FTEVNRU5UX01lc3NhZ2UsDQorICAgIFhGQV9FTEVNRU5UX091dHB1dCwNCisgICAgWEZBX0VMRU1FTlRfUHNNYXAsDQorICAgIFhGQV9FTEVNRU5UX0V4Y2x1ZGVOUywNCisgICAgWEZBX0VMRU1FTlRfQXNzaXN0LA0KKyAgICBYRkFfRUxFTUVOVF9QaWN0dXJlLA0KKyAgICBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsDQorICAgIFhGQV9FTEVNRU5UX1NpbGVudFByaW50LA0KKyAgICBYRkFfRUxFTUVOVF9XZWJDbGllbnQsDQorICAgIFhGQV9FTEVNRU5UX0xheW91dFBzZXVkb01vZGVsLA0KKyAgICBYRkFfRUxFTUVOVF9Qcm9kdWNlciwNCisgICAgWEZBX0VMRU1FTlRfQ29ybmVyLA0KKyAgICBYRkFfRUxFTUVOVF9Nc2dJZCwNCisgICAgWEZBX0VMRU1FTlRfQ29sb3IsDQorICAgIFhGQV9FTEVNRU5UX0tlZXAsDQorICAgIFhGQV9FTEVNRU5UX1F1ZXJ5LA0KKyAgICBYRkFfRUxFTUVOVF9JbnNlcnQsDQorICAgIFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwNCisgICAgWEZBX0VMRU1FTlRfVmFsaWRhdGUsDQorICAgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsDQorICAgIFhGQV9FTEVNRU5UX051bWJlclBhdHRlcm5zLA0KKyAgICBYRkFfRUxFTUVOVF9QYWdlU2V0LA0KKyAgICBYRkFfRUxFTUVOVF9JbnRlZ2VyLA0KKyAgICBYRkFfRUxFTUVOVF9Tb2FwQWRkcmVzcywNCisgICAgWEZBX0VMRU1FTlRfRXF1YXRlLA0KKyAgICBYRkFfRUxFTUVOVF9Gb3JtRmllbGRGaWxsaW5nLA0KKyAgICBYRkFfRUxFTUVOVF9QYWdlUmFuZ2UsDQorICAgIFhGQV9FTEVNRU5UX1VwZGF0ZSwNCisgICAgWEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywNCisgICAgWEZBX0VMRU1FTlRfTW9kZSwNCisgICAgWEZBX0VMRU1FTlRfTGF5b3V0LA0KKyAgICBYRkFfRUxFTUVOVF9TaGFycHhtbCwNCisgICAgWEZBX0VMRU1FTlRfWHNkQ29ubmVjdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfVHJhdmVyc2UsDQorICAgIFhGQV9FTEVNRU5UX0VuY29kaW5ncywNCisgICAgWEZBX0VMRU1FTlRfVGVtcGxhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Fjcm9iYXQsDQorICAgIFhGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsDQorICAgIFhGQV9FTEVNRU5UX1NpZ25pbmcsDQorICAgIFhGQV9FTEVNRU5UX0RhdGFXaW5kb3csDQorICAgIFhGQV9FTEVNRU5UX1NjcmlwdCwNCisgICAgWEZBX0VMRU1FTlRfQWRkVmlld2VyUHJlZmVyZW5jZXMsDQorICAgIFhGQV9FTEVNRU5UX0Fsd2F5c0VtYmVkLA0KKyAgICBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsDQorICAgIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kLA0KKyAgICBYRkFfRUxFTUVOVF9DaGFuZ2UsDQorICAgIFhGQV9FTEVNRU5UX1BhZ2VBcmVhLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJtaXRVcmwsDQorICAgIFhGQV9FTEVNRU5UX09pZHMsDQorICAgIFhGQV9FTEVNRU5UX1NpZ25hdHVyZSwNCisgICAgWEZBX0VMRU1FTlRfQURCRV9KU0NvbnNvbGUsDQorICAgIFhGQV9FTEVNRU5UX0NhcHRpb24sDQorICAgIFhGQV9FTEVNRU5UX1JlbGV2YW50LA0KKyAgICBYRkFfRUxFTUVOVF9GbGlwTGFiZWwsDQorICAgIFhGQV9FTEVNRU5UX0V4RGF0YSwNCisgICAgWEZBX0VMRU1FTlRfRGF5TmFtZXMsDQorICAgIFhGQV9FTEVNRU5UX1NvYXBBY3Rpb24sDQorICAgIFhGQV9FTEVNRU5UX0RlZmF1bHRUeXBlZmFjZSwNCisgICAgWEZBX0VMRU1FTlRfTWFuaWZlc3QsDQorICAgIFhGQV9FTEVNRU5UX092ZXJmbG93LA0KKyAgICBYRkFfRUxFTUVOVF9MaW5lYXIsDQorICAgIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9sLA0KKyAgICBYRkFfRUxFTUVOVF9EZWxldGUsDQorICAgIFhGQV9FTEVNRU5UX0RlbHRhcywNCisgICAgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kLA0KKyAgICBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIsDQorICAgIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLA0KKyAgICBYRkFfRUxFTUVOVF9NZWRpdW0sDQorICAgIFhGQV9FTEVNRU5UX1RleHRFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9UZW1wbGF0ZUNhY2hlLA0KKyAgICBYRkFfRUxFTUVOVF9Db21wcmVzc09iamVjdFN0cmVhbSwNCisgICAgWEZBX0VMRU1FTlRfRGF0YVZhbHVlLA0KKyAgICBYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwNCisgICAgWEZBX0VMRU1FTlRfTm9kZUxpc3QsDQorICAgIFhGQV9FTEVNRU5UX0luY2x1ZGVYRFBDb250ZW50LA0KKyAgICBYRkFfRUxFTUVOVF9YbWxDb25uZWN0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9WYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcywNCisgICAgWEZBX0VMRU1FTlRfU2lnbkRhdGEsDQorICAgIFhGQV9FTEVNRU5UX1BhY2tldHMsDQorICAgIFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJuLA0KKyAgICBYRkFfRUxFTUVOVF9EdXBsZXhPcHRpb24sDQorICAgIFhGQV9FTEVNRU5UX0Jhc2UsDQorICAgIFhGQV9FTEVNRU5UX0JpbmQsDQorICAgIFhGQV9FTEVNRU5UX0NvbXByZXNzaW9uLA0KKyAgICBYRkFfRUxFTUVOVF9Vc2VyLA0KKyAgICBYRkFfRUxFTUVOVF9SZWN0YW5nbGUsDQorICAgIFhGQV9FTEVNRU5UX0VmZmVjdGl2ZU91dHB1dFBvbGljeSwNCisgICAgWEZBX0VMRU1FTlRfQURCRV9KU0RlYnVnZ2VyLA0KKyAgICBYRkFfRUxFTUVOVF9BY3JvYmF0NywNCisgICAgWEZBX0VMRU1FTlRfSW50ZXJhY3RpdmUsDQorICAgIFhGQV9FTEVNRU5UX0xvY2FsZSwNCisgICAgWEZBX0VMRU1FTlRfQ3VycmVudFBhZ2UsDQorICAgIFhGQV9FTEVNRU5UX0RhdGEsDQorICAgIFhGQV9FTEVNRU5UX0RhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Rlc2MsDQorICAgIFhGQV9FTEVNRU5UX0VuY3J5cHQsDQorICAgIFhGQV9FTEVNRU5UX0RyYXcsDQorICAgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb24sDQorICAgIFhGQV9FTEVNRU5UX01lcmlkaWVtTmFtZXMsDQorICAgIFhGQV9FTEVNRU5UX01lc3NhZ2luZywNCisgICAgWEZBX0VMRU1FTlRfU3BlYWssDQorICAgIFhGQV9FTEVNRU5UX0RhdGFHcm91cCwNCisgICAgWEZBX0VMRU1FTlRfQ29tbW9uLA0KKyAgICBYRkFfRUxFTUVOVF9TaGFycHRleHQsDQorICAgIFhGQV9FTEVNRU5UX1BhZ2luYXRpb25PdmVycmlkZSwNCisgICAgWEZBX0VMRU1FTlRfUmVhc29ucywNCisgICAgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHJvcGVydGllcywNCisgICAgWEZBX0VMRU1FTlRfVGhyZXNob2xkLA0KKyAgICBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9GaWxsLA0KKyAgICBYRkFfRUxFTUVOVF9Gb250LA0KKyAgICBYRkFfRUxFTUVOVF9Gb3JtLA0KKyAgICBYRkFfRUxFTUVOVF9NZWRpdW1JbmZvLA0KKyAgICBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwNCisgICAgWEZBX0VMRU1FTlRfUGFzc3dvcmQsDQorICAgIFhGQV9FTEVNRU5UX1J1blNjcmlwdHMsDQorICAgIFhGQV9FTEVNRU5UX1RyYWNlLA0KKyAgICBYRkFfRUxFTUVOVF9GbG9hdCwNCisgICAgWEZBX0VMRU1FTlRfUmVuZGVyUG9saWN5LA0KKyAgICBYRkFfRUxFTUVOVF9Mb2dQc2V1ZG9Nb2RlbCwNCisgICAgWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sDQorICAgIFhGQV9FTEVNRU5UX1ZhbHVlLA0KKyAgICBYRkFfRUxFTUVOVF9Cb29rZW5kLA0KKyAgICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgICAgWEZBX0VMRU1FTlRfT3BlbkFjdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfTmV2ZXJFbWJlZCwNCisgICAgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLA0KKyAgICBYRkFfRUxFTUVOVF9DYWxjdWxhdGUsDQorICAgIFhGQV9FTEVNRU5UX1ByaW50LA0KKyAgICBYRkFfRUxFTUVOVF9FeHRyYXMsDQorICAgIFhGQV9FTEVNRU5UX1Byb3RvLA0KKyAgICBYRkFfRUxFTUVOVF9EU2lnRGF0YSwNCisgICAgWEZBX0VMRU1FTlRfQ3JlYXRvciwNCisgICAgWEZBX0VMRU1FTlRfQ29ubmVjdCwNCisgICAgWEZBX0VMRU1FTlRfUGVybWlzc2lvbnMsDQorICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3Rpb25TZXQsDQorICAgIFhGQV9FTEVNRU5UX1N1Ym1pdCwNCisgICAgWEZBX0VMRU1FTlRfUmFuZ2UsDQorICAgIFhGQV9FTEVNRU5UX0xpbmVhcml6ZWQsDQorICAgIFhGQV9FTEVNRU5UX1BhY2tldCwNCisgICAgWEZBX0VMRU1FTlRfUm9vdEVsZW1lbnQsDQorICAgIFhGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLA0KKyAgICBYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLA0KKyAgICBYRkFfRUxFTUVOVF9QcmludEhpZ2hRdWFsaXR5LA0KKyAgICBYRkFfRUxFTUVOVF9Ecml2ZXIsDQorICAgIFhGQV9FTEVNRU5UX0luY3JlbWVudGFsTG9hZCwNCisgICAgWEZBX0VMRU1FTlRfU3ViamVjdEROLA0KKyAgICBYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsDQorICAgIFhGQV9FTEVNRU5UX0luY3JlbWVudGFsTWVyZ2UsDQorICAgIFhGQV9FTEVNRU5UX1JhZGlhbCwNCisgICAgWEZBX0VMRU1FTlRfVmFyaWFibGVzLA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsDQorICAgIFhGQV9FTEVNRU5UX0VmZmVjdGl2ZUlucHV0UG9saWN5LA0KKyAgICBYRkFfRUxFTUVOVF9OYW1lQXR0ciwNCisgICAgWEZBX0VMRU1FTlRfQ29uZm9ybWFuY2UsDQorICAgIFhGQV9FTEVNRU5UX1RyYW5zZm9ybSwNCisgICAgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50LA0KKyAgICBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9MaW5lLA0KKyAgICBYRkFfRUxFTUVOVF9MaXN0LA0KKyAgICBYRkFfRUxFTUVOVF9Tb3VyY2UsDQorICAgIFhGQV9FTEVNRU5UX09jY3VyLA0KKyAgICBYRkFfRUxFTUVOVF9QaWNrVHJheUJ5UERGU2l6ZSwNCisgICAgWEZBX0VMRU1FTlRfTW9udGhOYW1lcywNCisgICAgWEZBX0VMRU1FTlRfU2V2ZXJpdHksDQorICAgIFhGQV9FTEVNRU5UX0dyb3VwUGFyZW50LA0KKyAgICBYRkFfRUxFTUVOVF9Eb2N1bWVudEFzc2VtYmx5LA0KKyAgICBYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2wsDQorICAgIFhGQV9FTEVNRU5UX1RhZ2dlZCwNCisgICAgWEZBX0VMRU1FTlRfSXRlbXMsDQorfTsNCisjZGVmaW5lIFhGQV9FTEVNRU5UX1VOS05PV04gKChYRkFfRUxFTUVOVCktMSkNCit0eXBlZGVmIHN0cnVjdCBfWEZBX0VMRU1FTlRJTkZPIHsNCisgICAgRlhfVUlOVDMyCQkJCQl1SGFzaDsNCisgICAgRlhfTFBDV1NUUgkJCQkJcE5hbWU7DQorICAgIFhGQV9FTEVNRU5UCQkJCQllTmFtZTsNCisgICAgRlhfRFdPUkQJCQkJCWR3UGFja2V0czsNCisgICAgRlhfRFdPUkQJCQkJCWVPYmplY3RUeXBlOw0KK30gWEZBX0VMRU1FTlRJTkZPLCAqIFhGQV9MUEVMRU1FTlRJTkZPOw0KK3R5cGVkZWYgWEZBX0VMRU1FTlRJTkZPIGNvbnN0ICogWEZBX0xQQ0VMRU1FTlRJTkZPOw0KK0ZYX0lOVDMyIFhGQV9HZXRFbGVtZW50Q291bnQoKTsNCitYRkFfTFBDRUxFTUVOVElORk8gWEZBX0dldEVsZW1lbnRCeU5hbWUoRlhfV1NUUiB3c05hbWUpOw0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0RWxlbWVudEJ5SUQoWEZBX0VMRU1FTlQgZU5hbWUpOw0KK2VudW0gWEZBX0FUVFJJQlVURVRZUEUgew0KKyAgICBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwNCisgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9YRkFfQVRUUklCVVRFSU5GTyB7DQorICAgIEZYX1VJTlQzMgkJCQkJdUhhc2g7DQorICAgIEZYX0xQQ1dTVFIJCQkJCXBOYW1lOw0KKyAgICBYRkFfQVRUUklCVVRFCQkJCWVOYW1lOw0KKyAgICBYRkFfQVRUUklCVVRFVFlQRQkJCWVUeXBlOw0KKyAgICBGWF9EV09SRAkJCQkJZHdQYWNrZXRzOw0KKyAgICBGWF9MUFZPSUQJCQkJCXBEZWZWYWx1ZTsNCit9IFhGQV9BVFRSSUJVVEVJTkZPLCAqIFhGQV9MUEFUVFJJQlVURUlORk87DQordHlwZWRlZiBYRkFfQVRUUklCVVRFSU5GTyBjb25zdCAqIFhGQV9MUENBVFRSSUJVVEVJTkZPOw0KK0ZYX0lOVDMyIFhGQV9HZXRBdHRyaWJ1dGVDb3VudCgpOw0KK1hGQV9MUENBVFRSSUJVVEVJTkZPIFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUoRlhfV1NUUiB3c05hbWUpOw0KK1hGQV9MUENBVFRSSUJVVEVJTkZPIFhGQV9HZXRBdHRyaWJ1dGVCeUlEKFhGQV9BVFRSSUJVVEUgZU5hbWUpOw0KK0ZYX0JPT0wgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShGWF9MUFZPSUQgJnBWYWx1ZSwgWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIEZYX0RXT1JEIGR3UGFja2V0KTsNCitYRkFfQVRUUklCVVRFRU5VTQlYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpOw0KK0NGWF9XaWRlU3RyaW5nQwkJWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCk7DQorRlhfQk9PTAkJCQlYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0Jvb2xlYW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpOw0KK0ZYX0lOVDMyCQkJWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9JbnRlZ2VyKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIEZYX0RXT1JEIGR3UGFja2V0KTsNCitDWEZBX01lYXN1cmVtZW50CVhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfTWVhc3VyZShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCk7DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9FTEVNRU5USElFUkFSQ0hZIHsNCisgICAgRlhfV09SRAkJCQkJCXdTdGFydDsNCisgICAgRlhfV09SRAkJCQkJCXdDb3VudDsNCisgICAgRlhfV09SRAkJCQkJCXdQYXJlbnRJbmRleDsNCit9IFhGQV9FTEVNRU5USElFUkFSQ0hZLCAqIFhGQV9MUEVMRU1FTlRISUVSQVJDSFk7DQordHlwZWRlZiBYRkFfRUxFTUVOVEhJRVJBUkNIWSBjb25zdCAqIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfU0NSSVBUSElFUkFSQ0hZIHsNCisgICAgRlhfV09SRAkJCQkJCXdNZXRob2RTdGFydDsNCisgICAgRlhfV09SRAkJCQkJCXdNZXRob2RDb3VudDsNCisgICAgRlhfV09SRAkJCQkJCXdBdHRyaWJ1dGVTdGFydDsNCisgICAgRlhfV09SRAkJCQkJCXdBdHRyaWJ1dGVDb3VudDsNCisgICAgRlhfU0hPUlQJCQkJCXdQYXJlbnRJbmRleDsNCit9IFhGQV9TQ1JJUFRISUVSQVJDSFksICogWEZBX0xQU0NSSVBUSElFUkFSQ0hZOw0KK3R5cGVkZWYgWEZBX1NDUklQVEhJRVJBUkNIWSBjb25zdCAqIFhGQV9MUENTQ1JJUFRISUVSQVJDSFk7DQorRlhfTFBDV09SRCBYRkFfR2V0RWxlbWVudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9JTlQzMiAmaUNvdW50KTsNCitGWF9MUENCWVRFIFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfSU5UMzIgJmlDb3VudCk7DQorWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRDaGlsZE9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0VMRU1FTlQgZUNoaWxkLCBGWF9EV09SRCBkd1BhY2tldCk7DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZU9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCk7DQorI2RlZmluZSBYRkFfUFJPUEVSVFlGTEFHX09uZU9mCQkJMHgwMQ0KKyNkZWZpbmUgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2YJMHgwMg0KK3R5cGVkZWYgc3RydWN0IF9YRkFfUFJPUEVSVFkgew0KKyAgICBGWF9XT1JECQkJCQkJZU5hbWU7DQorICAgIEZYX0JZVEUJCQkJCQl1T2NjdXI7DQorICAgIEZYX0JZVEUJCQkJCQl1RmxhZ3M7DQorfSBYRkFfUFJPUEVSVFksICogWEZBX0xQUFJPUEVSVFk7DQordHlwZWRlZiBYRkFfUFJPUEVSVFkgY29uc3QgKiBYRkFfTFBDUFJPUEVSVFk7DQorWEZBX0xQQ1BST1BFUlRZIFhGQV9HZXRFbGVtZW50UHJvcGVydGllcyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfSU5UMzIgJmlDb3VudCk7DQorWEZBX0xQQ1BST1BFUlRZIFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0VMRU1FTlQgZVByb3BlcnR5LCBGWF9EV09SRCBkd1BhY2tldCk7DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9BVFRSSUJVVEVFTlVNSU5GTyB7DQorICAgIEZYX1VJTlQzMgkJCQkJdUhhc2g7DQorICAgIEZYX0xQQ1dTVFIJCQkJCXBOYW1lOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJCWVOYW1lOw0KK30gWEZBX0FUVFJJQlVURUVOVU1JTkZPLCAqIFhGQV9MUEFUVFJJQlVURUVOVU1JTkZPOw0KK3R5cGVkZWYgWEZBX0FUVFJJQlVURUVOVU1JTkZPIGNvbnN0ICogWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPOw0KK1hGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZShGWF9XU1RSIHdzTmFtZSk7DQorWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlJRChYRkFfQVRUUklCVVRFRU5VTSBlTmFtZSk7DQorZW51bSBYRkFfVU5JVCB7DQorICAgIFhGQV9VTklUX1Vua25vd24sDQorICAgIFhGQV9VTklUX1BlcmNlbnQsDQorICAgIFhGQV9VTklUX0FuZ2xlLA0KKyAgICBYRkFfVU5JVF9FbSwNCisgICAgWEZBX1VOSVRfUHQsDQorICAgIFhGQV9VTklUX0luLA0KKyAgICBYRkFfVU5JVF9QYywNCisgICAgWEZBX1VOSVRfQ20sDQorICAgIFhGQV9VTklUX01tLA0KKyAgICBYRkFfVU5JVF9NcCwNCit9Ow0KK2NsYXNzIENYRkFfTWVhc3VyZW1lbnQNCit7DQorcHVibGljOg0KKyAgICB2b2lkCQkJCQkJU2V0KEZYX1dTVFIgd3NNZWFzdXJlKTsNCisgICAgdm9pZAkJCQkJCVNldChGWF9GTE9BVCBmVmFsdWUsIFhGQV9VTklUIGVVbml0KQ0KKyAgICB7DQorICAgICAgICBtX2ZWYWx1ZSA9IGZWYWx1ZTsNCisgICAgICAgIG1fZVVuaXQgPSBlVW5pdDsNCisgICAgfQ0KKw0KKyAgICBYRkFfVU5JVAkJCQkJR2V0VW5pdCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2VVbml0Ow0KKyAgICB9DQorICAgIEZYX0ZMT0FUCQkJCQlHZXRWYWx1ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2ZWYWx1ZTsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCQkJVG9TdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgJndzTWVhc3VyZSkgY29uc3Q7DQorICAgIEZYX0JPT0wJCQkJCQlUb1VuaXQoWEZBX1VOSVQgZVVuaXQsIEZYX0ZMT0FUICZmVmFsdWUpIGNvbnN0Ow0KKyAgICBGWF9GTE9BVAkJCQkJVG9Vbml0KFhGQV9VTklUIGVVbml0KSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWF9GTE9BVCBmOw0KKyAgICAgICAgcmV0dXJuIFRvVW5pdChlVW5pdCwgZikgPyBmIDogMDsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50KCkNCisgICAgew0KKyAgICAgICAgU2V0KC0xLCBYRkFfVU5JVF9Vbmtub3duKTsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50KEZYX1dTVFIgd3NNZWFzdXJlKQ0KKyAgICB7DQorICAgICAgICBTZXQod3NNZWFzdXJlKTsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpDQorICAgIHsNCisgICAgICAgIFNldChmVmFsdWUsIGVVbml0KTsNCisgICAgfQ0KKyAgICBzdGF0aWMgWEZBX1VOSVQJCQkJR2V0VW5pdChGWF9XU1RSIHdzVW5pdCk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9GTE9BVAkJCQkJbV9mVmFsdWU7DQorICAgIFhGQV9VTklUCQkJCQltX2VVbml0Ow0KK307DQorY2xhc3MgQ0ZYSlNFX0FyZ3VtZW50czsNCitjbGFzcyBDWEZBX09iamVjdDsNCit0eXBlZGVmIHZvaWQgKENYRkFfT2JqZWN0OjoqWEZBX01FVEhPRF9DQUxMQkFDSykgKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfTUVUSE9ESU5GTyB7DQorICAgIEZYX1VJTlQzMgkJCQkJdUhhc2g7DQorICAgIEZYX0xQQ1dTVFIJCQkJCXBOYW1lOw0KKyAgICBYRkFfTUVUSE9EX0NBTExCQUNLCQkJbHBmbkNhbGxiYWNrOw0KK30gWEZBX01FVEhPRElORk8sICogWEZBX0xQTUVUSE9ESU5GTzsNCit0eXBlZGVmIFhGQV9NRVRIT0RJTkZPIGNvbnN0ICogWEZBX0xQQ01FVEhPRElORk87DQorRlhfSU5UMzIgWEZBX0dldE1ldGhvZENvdW50KCk7DQorWEZBX0xQQ01FVEhPRElORk8gWEZBX0dldE1ldGhvZEJ5TmFtZShYRkFfRUxFTUVOVCBlRWxlbWVudCwJRlhfV1NUUiB3c01ldGhvZE5hbWUpOw0KK3R5cGVkZWYgdm9pZCAoQ1hGQV9PYmplY3Q6OipYRkFfQVRUUklCVVRFX0NBTExCQUNLKSAoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCitlbnVtIFhGQV9TQ1JJUFRfVFlQRSB7DQorICAgIFhGQV9TQ1JJUFRfQmFzaWMsDQorICAgIFhGQV9TQ1JJUFRfT2JqZWN0LA0KK307DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIHsNCisgICAgRlhfVUlOVDMyCQkJCQkJdUhhc2g7DQorICAgIEZYX0xQQ1dTVFIJCQkJCQlwTmFtZTsNCisgICAgWEZBX0FUVFJJQlVURV9DQUxMQkFDSwkJCWxwZm5DYWxsYmFjazsNCisgICAgRlhfSU5UMzIJCQkJCQllQXR0cmlidXRlOw0KKyAgICBGWF9XT1JECQkJCQkJCWVWYWx1ZVR5cGU7DQorfSBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTywgKiBYRkFfTFBTQ1JJUFRBVFRSSUJVVEVJTkZPOw0KK3R5cGVkZWYgWEZBX1NDUklQVEFUVFJJQlVURUlORk8gY29uc3QgKiBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTzsNCitYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9XU1RSIHdzQXR0cmlidXRlTmFtZSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhmYS9meGZhX29iamVjdGFjYy5oIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhX29iamVjdGFjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmQxZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfb2JqZWN0YWNjLmgKQEAgLTAsMCArMSw5MzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9OT0RFQUNDX0gNCisjZGVmaW5lIF9GWEZBX05PREVBQ0NfSA0KK2NsYXNzIENYRkFfTm9kZTsNCitjbGFzcyBJRlhfTG9jYWxlOw0KK2NsYXNzIENYRkFfRGF0YTsNCitjbGFzcyBDWEZBX0ZvbnQ7DQorY2xhc3MgQ1hGQV9GaWxsOw0KK2NsYXNzIENYRkFfTWFyZ2luOw0KK2NsYXNzIENYRkFfQ2FwdGlvbjsNCitjbGFzcyBDWEZBX1BhcmE7DQorY2xhc3MgQ1hGQV9FdmVudDsNCitjbGFzcyBDWEZBX1NjcmlwdDsNCitjbGFzcyBDWEZBX1ZhbHVlOw0KK2NsYXNzIENYRkFfQ2FsY3VsYXRlOw0KK2NsYXNzIENYRkFfTGluZTsNCitjbGFzcyBDWEZBX1RleHQ7DQorY2xhc3MgQ1hGQV9FeERhdGE7DQorY2xhc3MgQ1hGQV9JbWFnZTsNCitjbGFzcyBDWEZBX1ZhbGlkYXRlOw0KK2NsYXNzIENYRkFfVmFyaWFibGVzOw0KK2NsYXNzIENYRkFfQmluZDsNCitjbGFzcyBDWEZBX0Fzc2lzdDsNCitjbGFzcyBDWEZBX1Rvb2xUaXA7DQorY2xhc3MgQ1hGQV9LZWVwOw0KK2NsYXNzIENYRkFfU3VibWl0Ow0KK2NsYXNzIENYRkFfQmluZEl0ZW1zOw0KK2NsYXNzIENYRkFfU3Ryb2tlOw0KK2NsYXNzIENYRkFfQ29ybmVyOw0KK2NsYXNzIENYRkFfRWRnZTsNCitjbGFzcyBDWEZBX0JveDsNCitjbGFzcyBDWEZBX0FyYzsNCitjbGFzcyBDWEZBX0JvcmRlcjsNCitjbGFzcyBDWEZBX1JlY3RhbmdsZTsNCitjbGFzcyBDWEZBX1dpZGdldERhdGE7DQorY2xhc3MgQ1hGQV9PY2N1cjsNCitjbGFzcyBDWEZBX0ZpbHRlcjsNCitjbGFzcyBDWEZBX0NlcnRpZmljYXRlOw0KK2NsYXNzIENYRkFfV3JhcENlcnRpZmljYXRlOw0KK2NsYXNzIENYRkFfT2lkczsNCitjbGFzcyBDWEZBX1N1YmplY3RETnM7DQorY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2RzOw0KK2NsYXNzIENYRkFfRW5jb2RpbmdzOw0KK2NsYXNzIENYRkFfRW5jcnlwdGlvbk1ldGhvZHM7DQorY2xhc3MgQ1hGQV9SZWFzb25zOw0KK2NsYXNzIENYRkFfTWFuaWZlc3Q7DQoraW5saW5lIEZYX0JPT0wgWEZBX0lzU3BhY2UoRlhfV0NIQVIgYykNCit7DQorICAgIHJldHVybiAoYyA9PSAweDIwKSB8fCAoYyA9PSAweDBkKSB8fCAoYyA9PSAweDBhKSB8fCAoYyA9PSAweDA5KTsNCit9DQoraW5saW5lIEZYX0JPT0wgWEZBX0lzRGlnaXQoRlhfV0NIQVIgYykNCit7DQorICAgIHJldHVybiBjID49ICcwJyAmJiBjIDw9ICc5JzsNCit9DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX05vZGUqPiBDWEZBX05vZGVBcnJheTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfT2JqZWN0Kj4gQ1hGQV9PYmpBcnJheTsNCitjbGFzcyBDWEZBX0RhdGEgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRGF0YShDWEZBX05vZGUqIHBOb2RlKSA6IG1fcE5vZGUocE5vZGUpIHt9DQorICAgIG9wZXJhdG9yIENYRkFfTm9kZSooKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wTm9kZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqCUdldE5vZGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wTm9kZTsNCisgICAgfQ0KKw0KKyAgICBGWF9CT09MCQkJSXNFeGlzdEluWE1MKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcE5vZGUgIT0gTlVMTDsNCisgICAgfQ0KKw0KKyAgICBYRkFfRUxFTUVOVAkJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KK3Byb3RlY3RlZDoNCisgICAgRlhfQk9PTCBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0ZMT0FUICZmVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBGQUxTRSkgY29uc3Q7DQorICAgIEZYX0JPT0wJU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9GTE9BVCBmVmFsdWUpOw0KKyAgICBDWEZBX05vZGUqCQkJCW1fcE5vZGU7DQorfTsNCitjbGFzcyBDWEZBX0ZpbGwgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GaWxsKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB+Q1hGQV9GaWxsKCk7DQorDQorICAgIEZYX0lOVDMyCQlHZXRQcmVzZW5jZSgpOw0KKw0KKyAgICBGWF9BUkdCCQkJR2V0Q29sb3IoRlhfQk9PTCBiVGV4dCA9IEZBTFNFKTsNCisNCisgICAgdm9pZAkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0RmlsbFR5cGUoKTsNCisNCisgICAgRlhfSU5UMzIJCUdldFBhdHRlcm4oRlhfQVJHQiYgZm9yZUNvbG9yKTsNCisNCisgICAgRlhfSU5UMzIJCUdldFN0aXBwbGUoRlhfQVJHQiYgc3RpcHBsZUNvbG9yKTsNCisNCisgICAgRlhfSU5UMzIJCUdldExpbmVhcihGWF9BUkdCJiBlbmRDb2xvcik7DQorDQorICAgIEZYX0lOVDMyCQlHZXRSYWRpYWwoRlhfQVJHQiYgZW5kQ29sb3IpOw0KKyAgICBGWF9CT09MCQkJU2V0UHJlc2VuY2UoRlhfSU5UMzIgaVByZXNlbmNlKTsNCisgICAgRlhfQk9PTAkJCVNldEZpbGxUeXBlKEZYX0lOVDMyIGlUeXBlKTsNCisgICAgRlhfQk9PTAkJCVNldFBhdHRlcm4oRlhfSU5UMzIgaVBhdHRlcm4sIEZYX0FSR0IgZm9yZUNvbG9yKTsNCisgICAgRlhfQk9PTAkJCVNldFN0aXBwbGUoRlhfSU5UMzIgaVN0aXBwbGUsIEZYX0FSR0Igc3RpcHBsZUNvbG9yKTsNCisgICAgRlhfQk9PTAkJCVNldExpbmVhcihGWF9JTlQzMiBpTGluZWFyLCBGWF9BUkdCIGVuZENvbG9yKTsNCisgICAgRlhfQk9PTAkJCVNldFJhZGlhbChGWF9JTlQzMiBpUmFkaWFsLCBGWF9BUkdCIGVuZENvbG9yKTsNCit9Ow0KK2NsYXNzIENYRkFfTWFyZ2luIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfTWFyZ2luKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICBGWF9CT09MCQlHZXRMZWZ0SW5zZXQoRlhfRkxPQVQgJmZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ID0gMCkgY29uc3Q7DQorICAgIEZYX0JPT0wJCUdldFRvcEluc2V0KEZYX0ZMT0FUICZmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0Ow0KKyAgICBGWF9CT09MCQlHZXRSaWdodEluc2V0KEZYX0ZMT0FUICZmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0Ow0KKyAgICBGWF9CT09MCQlHZXRCb3R0b21JbnNldChGWF9GTE9BVCAmZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsNCisgICAgRlhfQk9PTAkJU2V0TGVmdEluc2V0KEZYX0ZMT0FUIGZJbnNldCk7DQorICAgIEZYX0JPT0wJCVNldFRvcEluc2V0KEZYX0ZMT0FUIGZJbnNldCk7DQorICAgIEZYX0JPT0wJCVNldFJpZ2h0SW5zZXQoRlhfRkxPQVQgZkluc2V0KTsNCisgICAgRlhfQk9PTAkJU2V0Qm90dG9tSW5zZXQoRlhfRkxPQVQgZkluc2V0KTsNCit9Ow0KK2NsYXNzIENYRkFfRm9udCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZvbnQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorICAgIEZYX0ZMT0FUCQlHZXRCYXNlbGluZVNoaWZ0KCk7DQorDQorICAgIEZYX0ZMT0FUCQlHZXRIb3Jpem9udGFsU2NhbGUoKTsNCisNCisgICAgRlhfRkxPQVQJCUdldFZlcnRpY2FsU2NhbGUoKTsNCisNCisgICAgRlhfRkxPQVQJCUdldExldHRlclNwYWNpbmcoKTsNCisNCisgICAgRlhfSU5UMzIJCUdldExpbmVUaHJvdWdoKCk7DQorDQorICAgIEZYX0lOVDMyCQlHZXRMaW5lVGhyb3VnaFBlcmlvZCgpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0T3ZlcmxpbmUoKTsNCisNCisgICAgRlhfSU5UMzIJCUdldE92ZXJsaW5lUGVyaW9kKCk7DQorDQorICAgIEZYX0lOVDMyCQlHZXRVbmRlcmxpbmUoKTsNCisNCisgICAgRlhfSU5UMzIJCUdldFVuZGVybGluZVBlcmlvZCgpOw0KKw0KKyAgICBGWF9GTE9BVAkJR2V0Rm9udFNpemUoKTsNCisNCisgICAgdm9pZAkJCUdldFR5cGVmYWNlKENGWF9XaWRlU3RyaW5nQyAmd3NUeXBlRmFjZSk7DQorDQorICAgIEZYX0JPT0wJCQlJc0JvbGQoKTsNCisNCisgICAgRlhfQk9PTAkJCUlzSXRhbGljKCk7DQorDQorICAgIEZYX0JPT0wJCQlJc1VzZUtlcm5pbmcoKTsNCisNCisgICAgRlhfQVJHQgkJCUdldENvbG9yKCk7DQorDQorICAgIHZvaWQJCQlTZXRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCisgICAgRlhfQk9PTAkJCVNldEJhc2VsaW5lU2hpZnQoRlhfRkxPQVQgZkJhc2VsaW5lU2hpZnQpOw0KKyAgICBGWF9CT09MCQkJU2V0SG9yaXpvbnRhbFNjYWxlKEZYX0ZMT0FUIGZIb3Jpem9udGFsU2NhbGUpOw0KKyAgICBGWF9CT09MCQkJU2V0VmVydGljYWxTY2FsZShGWF9GTE9BVCBmVmVydGljYWxTY2FsZSk7DQorICAgIEZYX0JPT0wJCQlTZXRMZXR0ZXJTcGFjaW5nKEZYX0ZMT0FUIGZMZXR0ZXJTcGFjaW5nLCBYRkFfVU5JVCBlVW5pdCk7DQorICAgIEZYX0JPT0wJCQlTZXRMaW5lVGhyb3VnaChGWF9JTlQzMiBpTGluZVRocm91Z2gpOw0KKyAgICBGWF9CT09MCQkJU2V0TGluZVRocm91Z2hQZXJpb2QoRlhfSU5UMzIgaUxpbmVUaHJvdWdoUGVyaW9kKTsNCisgICAgRlhfQk9PTAkJCVNldE92ZXJsaW5lKEZYX0lOVDMyIGlPdmVybGluZSk7DQorICAgIEZYX0JPT0wJCQlTZXRPdmVybGluZVBlcmlvZChGWF9JTlQzMiBpT3ZlcmxpbmVQZXJpb2QpOw0KKyAgICBGWF9CT09MCQkJU2V0VW5kZXJsaW5lKEZYX0lOVDMyIGlVbmRlcmxpbmUpOw0KKyAgICBGWF9CT09MCQkJU2V0VW5kZXJsaW5lUGVyaW9kKEZYX0lOVDMyIGlVbmRlcmxpbmVQZXJpb2QpOw0KK307DQorY2xhc3MgQ1hGQV9DYXB0aW9uIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfQ2FwdGlvbihDWEZBX05vZGUqIHBOb2RlKTsNCisNCisgICAgRlhfSU5UMzIJCUdldFByZXNlbmNlKCk7DQorDQorICAgIEZYX0lOVDMyCQlHZXRQbGFjZW1lbnRUeXBlKCk7DQorDQorICAgIEZYX0ZMT0FUCQlHZXRSZXNlcnZlKCk7DQorDQorICAgIENYRkFfTWFyZ2luCQlHZXRNYXJnaW4oKTsNCisNCisgICAgQ1hGQV9Gb250CQlHZXRGb250KCk7DQorDQorICAgIENYRkFfVmFsdWUJCUdldFZhbHVlKCk7DQorDQorICAgIENYRkFfUGFyYQkJR2V0UGFyYSgpOw0KKyAgICBGWF9CT09MCQkJU2V0UHJlc2VuY2UoRlhfSU5UMzIgaVByZXNlbmNlKTsNCisgICAgRlhfQk9PTAkJCVNldFBsYWNlbWVudFR5cGUoRlhfSU5UMzIgaVR5cGUpOw0KKyAgICBGWF9CT09MCQkJU2V0UmVzZXJ2ZShGWF9GTE9BVCBmUmVzZXJ2ZSk7DQorfTsNCitjbGFzcyBDWEZBX1BhcmEgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9QYXJhKENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorDQorICAgIEZYX0lOVDMyCQlHZXRWZXJ0aWNhbEFsaWduKCk7DQorDQorICAgIEZYX0ZMT0FUCQlHZXRMaW5lSGVpZ2h0KCk7DQorICAgIEZYX0ZMT0FUCQlHZXRNYXJnaW5MZWZ0KCk7DQorICAgIEZYX0ZMT0FUCQlHZXRNYXJnaW5SaWdodCgpOw0KKyAgICBGWF9JTlQzMgkJR2V0T3JwaGFucygpOw0KKyAgICBGWF9GTE9BVAkJR2V0UmFkaXhPZmZzZXQoKTsNCisgICAgRlhfRkxPQVQJCUdldFNwYWNlQWJvdmUoKTsNCisgICAgRlhfRkxPQVQJCUdldFNwYWNlQmVsb3coKTsNCisgICAgRlhfRkxPQVQJCUdldFRleHRJbmRlbnQoKTsNCisgICAgRlhfSU5UMzIJCUdldFdpZG93cygpOw0KKyAgICBGWF9CT09MCQkJU2V0SG9yaXpvbnRhbEFsaWduKEZYX0lOVDMyIGlIb3Jpem9udGFsQWxpZ24pOw0KKyAgICBGWF9CT09MCQkJU2V0VmVydGljYWxBbGlnbihGWF9JTlQzMiBpVmVydGljYWxBbGlnbik7DQorICAgIEZYX0JPT0wJCQlTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KTsNCisgICAgRlhfQk9PTAkJCVNldE1hcmdpbkxlZnQoRlhfRkxPQVQgZk1hcmdpbkxlZnQpOw0KKyAgICBGWF9CT09MCQkJU2V0TWFyZ2luUmlnaHQoRlhfRkxPQVQgZk1hcmdpblJpZ2h0KTsNCisgICAgRlhfQk9PTAkJCVNldE9ycGhhbnMoRlhfSU5UMzIgaU9ycGhhbnMpOw0KKyAgICBGWF9CT09MCQkJU2V0UmFkaXhPZmZzZXQoRlhfRkxPQVQgZlJhZGl4T2Zmc2V0KTsNCisgICAgRlhfQk9PTAkJCVNldFNwYWNlQWJvdmUoRlhfRkxPQVQgZlNwYWNlQWJvdmUpOw0KKyAgICBGWF9CT09MCQkJU2V0U3BhY2VCZWxvdyhGWF9GTE9BVCBmU3BhY2VCZWxvdyk7DQorICAgIEZYX0JPT0wJCQlTZXRUZXh0SW5kZW50KEZYX0ZMT0FUIGZUZXh0SW5kZW50KTsNCisgICAgRlhfQk9PTAkJCVNldFdpZG93cyhGWF9JTlQzMiBpV2lkb3dzKTsNCit9Ow0KK2NsYXNzIENYRkFfS2VlcCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0tlZXAoQ1hGQV9Ob2RlICpwTm9kZSwgQ1hGQV9Ob2RlICpwUGFyZW50KTsNCisNCisgICAgRlhfSU5UMzIJCUdldEludGFjdCgpOw0KKyAgICBGWF9JTlQzMgkJR2V0TmV4dCgpOw0KKyAgICBGWF9JTlQzMgkJR2V0UHJldmlvdXMoKTsNCisgICAgRlhfQk9PTAkJCVNldEludGFjdChGWF9JTlQzMiBpSW50YWN0KTsNCisgICAgRlhfQk9PTAkJCVNldE5leHQoRlhfSU5UMzIgaU5leHQpOw0KKyAgICBGWF9CT09MCQkJU2V0UHJldmlvdXMoRlhfSU5UMzIgaVByZXZpb3VzKTsNCitwcml2YXRlOg0KKyAgICBDWEZBX05vZGUJCSptX3BQYXJlbnQ7DQorfTsNCitlbnVtIFhGQV9URVhURU5DT0RJTkcgew0KKyAgICBYRkFfVEVYVEVOQ09ESU5HX05vbmUsDQorICAgIFhGQV9URVhURU5DT0RJTkdfQmlnNSwNCisgICAgWEZBX1RFWFRFTkNPRElOR19Gb250U3BlY2lmaWMsDQorICAgIFhGQV9URVhURU5DT0RJTkdfR0JLLA0KKyAgICBYRkFfVEVYVEVOQ09ESU5HX0dCMTgwMzAsDQorICAgIFhGQV9URVhURU5DT0RJTkdfR0IyMzEyLA0KKyAgICBYRkFfVEVYVEVOQ09ESU5HX0lTTzg4NTlOTiwNCisgICAgWEZBX1RFWFRFTkNPRElOR19LU0M1NjAxLA0KKyAgICBYRkFfVEVYVEVOQ09ESU5HX1NoaWZ0SklTLA0KKyAgICBYRkFfVEVYVEVOQ09ESU5HX1VDUzIsDQorICAgIFhGQV9URVhURU5DT0RJTkdfVVRGMTYsDQorICAgIFhGQV9URVhURU5DT0RJTkdfVVRGOA0KK307DQorY2xhc3MgQ1hGQV9FdmVudCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0V2ZW50KENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKw0KKyAgICBGWF9JTlQzMgkJCUdldEFjdGl2aXR5KCk7DQorDQorICAgIEZYX0lOVDMyCQkJR2V0RXZlbnRUeXBlKCk7DQorICAgIHZvaWQJCQkJR2V0UmVmKENGWF9XaWRlU3RyaW5nQyAmd3NSZWYpOw0KKw0KKyAgICBGWF9JTlQzMgkJCUdldEV4ZWN1dGVSdW5BdCgpOw0KKyAgICBGWF9JTlQzMgkJCUdldEV4ZWN1dGVUeXBlKCk7DQorICAgIHZvaWQJCQkJR2V0RXhlY3V0ZUNvbm5lY3Rpb24oQ0ZYX1dpZGVTdHJpbmcgJndzQ29ubmVjdGlvbik7DQorDQorDQorICAgIENYRkFfU2NyaXB0CQkJR2V0U2NyaXB0KCk7DQorDQorDQorICAgIENYRkFfU3VibWl0CQkJR2V0U3VibWl0KCk7DQorDQorDQorICAgIEZYX0lOVDMyCQkJR2V0U2lnbkRhdGFPcGVyYXRpb24oKTsNCisgICAgdm9pZAkJCQlHZXRTaWduRGF0YVRhcmdldChDRlhfV2lkZVN0cmluZyAmd3NUYXJnZXQpOw0KKyAgICBGWF9CT09MCQkJCVNldEFjdGl2aXR5KEZYX0lOVDMyIGlBY3Rpdml0eSk7DQorICAgIEZYX0JPT0wJCQkJU2V0RXZlbnRUeXBlKEZYX0lOVDMyIGlFdmVudFR5cGUpOw0KKyAgICBGWF9CT09MCQkJCVNldEV4ZWN1dGVSdW5BdChGWF9JTlQzMiBpRXhlY3V0ZVJ1bkF0KTsNCisgICAgRlhfQk9PTAkJCQlTZXRFeGVjdXRlVHlwZShGWF9JTlQzMiBpRXhlY3V0ZVR5cGUpOw0KKyAgICBGWF9CT09MCQkJCVNldEV4ZWN1dGVDb25uZWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pOw0KKyAgICBGWF9CT09MCQkJCVNldFNpZ25EYXRhT3BlcmF0aW9uKEZYX0lOVDMyIGlPcGVyYXRpb24pOw0KKyAgICBGWF9CT09MCQkJCVNldFNpZ25EYXRhVGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQorfTsNCitlbnVtIFhGQV9TQ1JJUFRUWVBFIHsNCisgICAgWEZBX1NDUklQVFRZUEVfRm9ybWNhbGMgPSAwLA0KKyAgICBYRkFfU0NSSVBUVFlQRV9KYXZhc2NyaXB0LA0KKyAgICBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sDQorfTsNCitjbGFzcyBDWEZBX1NjcmlwdCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX1NjcmlwdChDWEZBX05vZGUqIHBOb2RlKTsNCisgICAgdm9pZAkJCQlHZXRCaW5kaW5nKENGWF9XaWRlU3RyaW5nICZ3c0JpbmRpbmcpOw0KKw0KKyAgICBYRkFfU0NSSVBUVFlQRQkJR2V0Q29udGVudFR5cGUoKTsNCisgICAgRlhfSU5UMzIJCQlHZXRSdW5BdCgpOw0KKyAgICB2b2lkCQkJCUdldEV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcgJndzRXhwcmVzc2lvbik7DQorICAgIEZYX0JPT0wJCQkJU2V0QmluZGluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NCaW5kaW5nKTsNCisgICAgRlhfQk9PTAkJCQlTZXRDb250ZW50VHlwZShYRkFfU0NSSVBUVFlQRSBlVHlwZSk7DQorICAgIEZYX0JPT0wJCQkJU2V0UnVuQXQoRlhfSU5UMzIgaVJ1bkF0KTsNCisgICAgRlhfQk9PTAkJCQlTZXRFeHByZXNzaW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0V4cHJlc3Npb24pOw0KK307DQorY2xhc3MgQ1hGQV9TdWJtaXQgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9TdWJtaXQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIEZYX0JPT0wJCQkJSXNTdWJtaXRFbWJlZFBERigpOw0KKyAgICBGWF9JTlQzMgkJCUdldFN1Ym1pdEZvcm1hdCgpOw0KKyAgICB2b2lkCQkJCUdldFN1Ym1pdFRhcmdldChDRlhfV2lkZVN0cmluZ0MgJndzVGFyZ2V0KTsNCisgICAgWEZBX1RFWFRFTkNPRElORwlHZXRTdWJtaXRUZXh0RW5jb2RpbmcoKTsNCisgICAgdm9pZAkJCQlHZXRTdWJtaXRYRFBDb250ZW50KENGWF9XaWRlU3RyaW5nQyAmd3NDb250ZW50KTsNCisgICAgRlhfQk9PTAkJCQlTZXRTdWJtaXRGb3JtYXQoRlhfSU5UMzIgaVN1Ym1pdEZvcm1hdCk7DQorICAgIEZYX0JPT0wJCQkJU2V0U3VibWl0VGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQorICAgIEZYX0JPT0wJCQkJU2V0U3VibWl0VGV4dEVuY29kaW5nKFhGQV9URVhURU5DT0RJTkcgZVRleHRFbmNvZGluZyk7DQorICAgIEZYX0JPT0wJCQkJU2V0U3VibWl0WERQQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50KTsNCit9Ow0KK2NsYXNzIENYRkFfVmFsdWUgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9WYWx1ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisNCisgICAgWEZBX0VMRU1FTlQJCUdldENoaWxkVmFsdWVDbGFzc0lEKCk7DQorDQorICAgIEZYX0JPT0wJCQlHZXRDaGlsZFZhbHVlQ29udGVudChDRlhfV2lkZVN0cmluZyAmd3NDb250ZW50KTsNCisgICAgQ1hGQV9BcmMJCUdldEFyYygpOw0KKyAgICBDWEZBX0xpbmUJCUdldExpbmUoKTsNCisgICAgQ1hGQV9SZWN0YW5nbGUJR2V0UmVjdGFuZ2xlKCk7DQorICAgIENYRkFfVGV4dAkJR2V0VGV4dCgpOw0KKyAgICBDWEZBX0V4RGF0YQkJR2V0RXhEYXRhKCk7DQorICAgIENYRkFfSW1hZ2UJCUdldEltYWdlKCk7DQorICAgIEZYX0JPT0wJCQlTZXRDaGlsZFZhbHVlQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgWEZBX0VMRU1FTlQgaVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOKTsNCit9Ow0KK2NsYXNzIENYRkFfTGluZSA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0xpbmUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICAgIEZYX0lOVDMyCQlHZXRIYW5kKCk7DQorICAgIEZYX0JPT0wJCQlHZXRTbG9wKCk7DQorICAgIENYRkFfRWRnZQkJR2V0RWRnZSgpOw0KKyAgICBGWF9CT09MCQkJU2V0SGFuZChGWF9JTlQzMiBpSGFuZCk7DQorICAgIEZYX0JPT0wJCQlTZXRTbG9wKEZYX0lOVDMyIGlTbG9wKTsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX1RleHQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIHZvaWQJCUdldE5hbWUoQ0ZYX1dpZGVTdHJpbmdDICZ3c05hbWUpOw0KKyAgICBGWF9JTlQzMglHZXRNYXhDaGFycygpOw0KKyAgICB2b2lkCQlHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JpZCk7DQorICAgIHZvaWQJCUdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZvaWQJCVNldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgICAgRlhfQk9PTAkJU2V0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKTsNCisgICAgRlhfQk9PTAkJU2V0TWF4Q2hhcnMoRlhfSU5UMzIgaU1heENoYXJzKTsNCisgICAgRlhfQk9PTAkJU2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCk7DQorfTsNCitjbGFzcyBDWEZBX0V4RGF0YSA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0V4RGF0YShDWEZBX05vZGUqIHBOb2RlKTsNCisgICAgdm9pZAkJR2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmdDICZ3c0NvbnRlbnRUeXBlKTsNCisgICAgdm9pZAkJR2V0SHJlZihDRlhfV2lkZVN0cmluZ0MgJndzSHJlZik7DQorICAgIEZYX0lOVDMyCUdldE1heExlbmd0aCgpOw0KKyAgICB2b2lkCQlHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JpZCk7DQorICAgIEZYX0lOVDMyCUdldFRyYW5zZmVyRW5jb2RpbmcoKTsNCisgICAgdm9pZAkJR2V0Q29udGVudChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgRlhfQk9PTAkJU2V0Q29udGVudFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpOw0KKyAgICBGWF9CT09MCQlTZXRIcmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0hyZWYpOw0KKyAgICBGWF9CT09MCQlTZXRNYXhMZW5ndGgoRlhfSU5UMzIgaU1heExlbmd0aCk7DQorICAgIEZYX0JPT0wJCVNldFJpZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSaWQpOw0KKyAgICBGWF9CT09MCQlTZXRUcmFuc2ZlckVuY29kaW5nKEZYX0lOVDMyIGlUcmFuc2ZlckVuY29kaW5nKTsNCisgICAgRlhfQk9PTAkJU2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLCBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KK307DQorY2xhc3MgQ1hGQV9JbWFnZSA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ltYWdlKENYRkFfTm9kZSogcE5vZGUsIEZYX0JPT0wgYkRlZlZhbHVlKTsNCisgICAgRlhfSU5UMzIJR2V0QXNwZWN0KCk7DQorICAgIEZYX0JPT0wJCUdldENvbnRlbnRUeXBlKENGWF9XaWRlU3RyaW5nICZ3c0NvbnRlbnRUeXBlKTsNCisgICAgRlhfQk9PTAkJR2V0SHJlZihDRlhfV2lkZVN0cmluZyAmd3NIcmVmKTsNCisgICAgRlhfSU5UMzIJR2V0VHJhbnNmZXJFbmNvZGluZygpOw0KKyAgICBGWF9CT09MCQlHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICBGWF9CT09MCQlTZXRBc3BlY3QoRlhfSU5UMzIgaUFzcGVjdCk7DQorICAgIEZYX0JPT0wJCVNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKTsNCisgICAgRlhfQk9PTAkJU2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKTsNCisgICAgRlhfQk9PTAkJU2V0VHJhbnNmZXJFbmNvZGluZyhGWF9JTlQzMiBpVHJhbnNmZXJFbmNvZGluZyk7DQorICAgIEZYX0JPT0wJCVNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9CT09MCQltX2JEZWZWYWx1ZTsNCit9Ow0KK2NsYXNzIENYRkFfQ2FsY3VsYXRlIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfQ2FsY3VsYXRlKENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0T3ZlcnJpZGUoKTsNCisgICAgQ1hGQV9TY3JpcHQJCUdldFNjcmlwdCgpOw0KKyAgICB2b2lkCQkJR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSk7DQorICAgIEZYX0JPT0wJCQlTZXRPdmVycmlkZShGWF9JTlQzMiBpT3ZlcnJpZGUpOw0KKyAgICBGWF9CT09MCQkJU2V0TWVzc2FnZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSk7DQorfTsNCitjbGFzcyBDWEZBX1ZhbGlkYXRlIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIEZYX0lOVDMyCUdldEZvcm1hdFRlc3QoKTsNCisgICAgRlhfQk9PTAkJU2V0Rm9ybWF0VGVzdChDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKTsNCisgICAgRlhfSU5UMzIJR2V0TnVsbFRlc3QoKTsNCisgICAgRlhfQk9PTAkJU2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSk7DQorICAgIEZYX0lOVDMyCUdldFNjcmlwdFRlc3QoKTsNCisgICAgdm9pZAkJCUdldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nICZ3c01lc3NhZ2UpOw0KKyAgICB2b2lkCQkJU2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlKTsNCisgICAgdm9pZAkJCUdldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKTsNCisgICAgdm9pZAkJCVNldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpOw0KKyAgICB2b2lkCQkJR2V0U2NyaXB0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSk7DQorICAgIHZvaWQJCQlTZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpOw0KKyAgICB2b2lkCQkJR2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyAmd3NQaWN0dXJlKTsNCisgICAgQ1hGQV9TY3JpcHQJCUdldFNjcmlwdCgpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSwgRlhfV1NUUiB3c01lc3NhZ2VUeXBlKTsNCisgICAgdm9pZAkJU2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSwgRlhfV1NUUiB3c01lc3NhZ2VUeXBlKTsNCisgICAgRlhfQk9PTAkJU2V0VGVzdFZhbHVlKEZYX0lOVDMyIGlUeXBlLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgWEZBX0FUVFJJQlVURUVOVU0gZU5hbWUpOw0KK307DQorY2xhc3MgQ1hGQV9WYXJpYWJsZXMgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9WYXJpYWJsZXMoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorICAgIEZYX0lOVDMyCUNvdW50U2NyaXB0cygpOw0KKyAgICBDWEZBX1NjcmlwdAlHZXRTY3JpcHQoRlhfSU5UMzIgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfQmluZCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0JpbmQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIEZYX0lOVDMyCUdldE1hdGNoKCk7DQorICAgIHZvaWQJCUdldFJlZihDRlhfV2lkZVN0cmluZ0MgJndzUmVmKTsNCisgICAgdm9pZAkJR2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyAmd3NQaWN0dXJlKTsNCisgICAgRlhfQk9PTAkJU2V0TWF0Y2goRlhfSU5UMzIgaU1hdGNoKTsNCisgICAgRlhfQk9PTAkJU2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZik7DQorICAgIEZYX0JPT0wJCVNldFBpY3R1cmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSk7DQorfTsNCitjbGFzcyBDWEZBX0Fzc2lzdCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKTsNCisNCisgICAgQ1hGQV9Ub29sVGlwCUdldFRvb2xUaXAoKTsNCit9Ow0KK2NsYXNzIENYRkFfVG9vbFRpcCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX1Rvb2xUaXAoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIEZYX0JPT0wgR2V0VGlwKENGWF9XaWRlU3RyaW5nICZ3c1RpcCk7DQorICAgIEZYX0JPT0wJU2V0VGlwKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpcCk7DQorfTsNCitjbGFzcyBDWEZBX0JpbmRJdGVtcyA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0JpbmRJdGVtcyhDWEZBX05vZGUqIHBOb2RlKTsNCisgICAgdm9pZCBHZXRDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nQyAmd3NDb25uZWN0aW9uKTsNCisgICAgdm9pZCBHZXRMYWJlbFJlZihDRlhfV2lkZVN0cmluZ0MgJndzTGFiZWxSZWYpOw0KKyAgICB2b2lkIEdldFZhbHVlUmVmKENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZVJlZik7DQorICAgIHZvaWQgR2V0UmVmKENGWF9XaWRlU3RyaW5nQyAmd3NSZWYpOw0KKyAgICBGWF9CT09MIFNldENvbm5lY3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29ubmVjdGlvbik7DQorICAgIEZYX0JPT0wgU2V0TGFiZWxSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWxSZWYpOw0KKyAgICBGWF9CT09MIFNldFZhbHVlUmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlUmVmKTsNCisgICAgRlhfQk9PTCBTZXRSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVmKTsNCit9Ow0KKyNkZWZpbmUgWEZBX1NUUk9LRV9TQU1FU1RZTEVfTm9QcmVzZW5jZQkxDQorI2RlZmluZSBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIJCTINCitjbGFzcyBDWEZBX1N0cm9rZSA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKw0KKyAgICBDWEZBX1N0cm9rZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisNCisgICAgRlhfQk9PTAkJCUlzQ29ybmVyKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Db3JuZXI7DQorICAgIH0NCisNCisgICAgRlhfQk9PTAkJCUlzRWRnZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRWRnZTsNCisgICAgfQ0KKw0KKyAgICBGWF9JTlQzMgkJR2V0UHJlc2VuY2UoKSBjb25zdDsNCisgICAgRlhfQk9PTAkJCUlzVmlzaWJsZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBHZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU7DQorICAgIH0NCisNCisgICAgRlhfSU5UMzIJCUdldENhcFR5cGUoKSBjb25zdDsNCisNCisgICAgRlhfSU5UMzIJCUdldFN0cm9rZVR5cGUoKSBjb25zdDsNCisNCisgICAgRlhfRkxPQVQJCUdldFRoaWNrbmVzcygpIGNvbnN0Ow0KKyAgICBDWEZBX01lYXN1cmVtZW50IEdldE1TVGhpY2tuZXNzKCkgY29uc3Q7DQorDQorICAgIHZvaWQJCQlTZXRUaGlja25lc3MoRlhfRkxPQVQgZlRoaWNrbmVzcyk7DQorICAgIHZvaWQJCQlTZXRNU1RoaWNrbmVzcyhDWEZBX01lYXN1cmVtZW50IG1zVGhpbmtuZXNzKTsNCisNCisgICAgRlhfQVJHQgkJCUdldENvbG9yKCkgY29uc3Q7DQorDQorICAgIHZvaWQJCQlTZXRDb2xvcihGWF9BUkdCIGFyZ2IpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0Sm9pblR5cGUoKSBjb25zdDsNCisNCisgICAgRlhfQk9PTAkJCUlzSW52ZXJ0ZWQoKSBjb25zdDsNCisNCisgICAgRlhfRkxPQVQJCUdldFJhZGl1cygpIGNvbnN0Ow0KKw0KKyAgICBGWF9CT09MCQkJU2FtZVN0eWxlcyhDWEZBX1N0cm9rZSBzdHJva2UsIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKSBjb25zdDsNCit9Ow0KK2NsYXNzIENYRkFfQ29ybmVyIDogcHVibGljIENYRkFfU3Ryb2tlDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Db3JuZXIoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX1N0cm9rZShwTm9kZSkge30NCit9Ow0KK2NsYXNzIENYRkFfRWRnZSA6IHB1YmxpYyBDWEZBX1N0cm9rZQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRWRnZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfU3Ryb2tlKHBOb2RlKSB7fQ0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX1N0cm9rZT4JQ1hGQV9TdHJva2VBcnJheTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfRWRnZT4JQ1hGQV9FZGdlQXJyYXk7DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0Nvcm5lcj4JQ1hGQV9Db3JuZXJBcnJheTsNCitjbGFzcyBDWEZBX0JveCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKw0KKyAgICBDWEZBX0JveChDWEZBX05vZGUgKnBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisNCisgICAgRlhfQk9PTAkJCUlzQXJjKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9BcmM7DQorICAgIH0NCisNCisgICAgRlhfQk9PTAkJCUlzQm9yZGVyKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Cb3JkZXI7DQorICAgIH0NCisNCisgICAgRlhfQk9PTAkJCUlzUmVjdGFuZ2xlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9SZWN0YW5nbGU7DQorICAgIH0NCisNCisgICAgRlhfSU5UMzIJCUdldEJyZWFrKCkgY29uc3Q7DQorDQorICAgIEZYX0lOVDMyCQlHZXRIYW5kKCkgY29uc3Q7DQorDQorICAgIEZYX0lOVDMyCQlHZXRQcmVzZW5jZSgpIGNvbnN0Ow0KKw0KKyAgICBGWF9JTlQzMgkJQ291bnRDb3JuZXJzKCkgY29uc3Q7DQorDQorICAgIENYRkFfQ29ybmVyCQlHZXRDb3JuZXIoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsNCisNCisgICAgRlhfSU5UMzIJCUNvdW50RWRnZXMoKSBjb25zdDsNCisNCisgICAgQ1hGQV9FZGdlCQlHZXRFZGdlKEZYX0lOVDMyIG5JbmRleCA9IDApIGNvbnN0Ow0KKw0KKyAgICB2b2lkCQkJR2V0U3Ryb2tlcyhDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzKSBjb25zdDsNCisNCisgICAgRlhfQk9PTAkJCUlzQ2lyY3VsYXIoKSBjb25zdDsNCisNCisgICAgRlhfQk9PTAkJCUdldFN0YXJ0QW5nbGUoRlhfRkxPQVQgJmZTdGFydEFuZ2xlKSBjb25zdDsNCisgICAgRlhfRkxPQVQJCUdldFN0YXJ0QW5nbGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWF9GTE9BVCBmU3RhcnRBbmdsZTsNCisgICAgICAgIEdldFN0YXJ0QW5nbGUoZlN0YXJ0QW5nbGUpOw0KKyAgICAgICAgcmV0dXJuIGZTdGFydEFuZ2xlOw0KKyAgICB9DQorDQorICAgIEZYX0JPT0wJCQlHZXRTd2VlcEFuZ2xlKEZYX0ZMT0FUICZmU3dlZXBBbmdsZSkgY29uc3Q7DQorICAgIEZYX0ZMT0FUCQlHZXRTd2VlcEFuZ2xlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhfRkxPQVQgZlN3ZWVwQW5nbGU7DQorICAgICAgICBHZXRTd2VlcEFuZ2xlKGZTd2VlcEFuZ2xlKTsNCisgICAgICAgIHJldHVybiBmU3dlZXBBbmdsZTsNCisgICAgfQ0KKw0KKyAgICBDWEZBX0ZpbGwJCUdldEZpbGwoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSkgY29uc3Q7DQorDQorICAgIENYRkFfTWFyZ2luCQlHZXRNYXJnaW4oKSBjb25zdDsNCisNCisgICAgRlhfQk9PTAkJCVNhbWVTdHlsZXMoKSBjb25zdDsNCisNCisgICAgRlhfSU5UMzIJCUdldDNEU3R5bGUoRlhfQk9PTCAmYlZpc2libGUsIEZYX0ZMT0FUICZmVGhpY2tuZXNzKSBjb25zdDsNCit9Ow0KK2NsYXNzIENYRkFfQXJjIDogcHVibGljIENYRkFfQm94DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9BcmMoQ1hGQV9Ob2RlICpwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCit9Ow0KK2NsYXNzIENYRkFfQm9yZGVyIDogcHVibGljIENYRkFfQm94DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Cb3JkZXIoQ1hGQV9Ob2RlICpwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCit9Ow0KK2NsYXNzIENYRkFfUmVjdGFuZ2xlIDogcHVibGljIENYRkFfQm94DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9SZWN0YW5nbGUoQ1hGQV9Ob2RlICpwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCit9Ow0KK2VudW0gWEZBX0NIRUNLU1RBVEUgew0KKyAgICBYRkFfQ0hFQ0tTVEFURV9PbiA9IDAsDQorICAgIFhGQV9DSEVDS1NUQVRFX09mZiA9IDEsDQorICAgIFhGQV9DSEVDS1NUQVRFX05ldXRyYWwgPSAyLA0KK307DQorZW51bSBYRkFfVkFMVUVQSUNUVVJFIHsNCisgICAgWEZBX1ZBTFVFUElDVFVSRV9SYXcgPSAwLA0KKyAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXksDQorICAgIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCwNCisgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCwNCit9Ow0KK2NsYXNzIENYRkFfV2lkZ2V0RGF0YSA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX1dpZGdldERhdGEoQ1hGQV9Ob2RlICpwTm9kZSk7DQorICAgIENYRkFfTm9kZSoJCUdldFVJQ2hpbGQoKTsNCisNCisgICAgWEZBX0VMRU1FTlQJCUdldFVJVHlwZSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlHZXRSYXdWYWx1ZSgpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0QWNjZXNzKEZYX0JPT0wgYlRlbXBsYXRlID0gRkFMU0UpOw0KKw0KKyAgICBGWF9CT09MCQkJR2V0QWNjZXNzS2V5KENGWF9XaWRlU3RyaW5nQyAmd3NBY2Nlc3NLZXkpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0QW5jaG9yVHlwZSgpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0Q29sU3BhbigpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0UHJlc2VuY2UoKTsNCisNCisgICAgRlhfSU5UMzIJCUdldFJvdGF0ZSgpOw0KKw0KKyAgICBDWEZBX0JvcmRlcgkJR2V0Qm9yZGVyKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKw0KKyAgICBDWEZBX0NhcHRpb24JR2V0Q2FwdGlvbihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisNCisgICAgQ1hGQV9Gb250CQlHZXRGb250KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKw0KKyAgICBDWEZBX01hcmdpbgkJR2V0TWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKw0KKyAgICBDWEZBX1BhcmEJCUdldFBhcmEoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorDQorICAgIENYRkFfS2VlcAkJR2V0S2VlcChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisNCisgICAgdm9pZAkJCUdldEV2ZW50TGlzdChDWEZBX05vZGVBcnJheSAmZXZlbnRzKTsNCisgICAgRlhfSU5UMzIJCUdldEV2ZW50QnlBY3Rpdml0eShGWF9JTlQzMiBpQWN0aXZpdHksIENYRkFfTm9kZUFycmF5ICZldmVudHMsIEZYX0JPT0wgYklzRm9ybVJlYWR5ID0gRkFMU0UpOw0KKw0KKyAgICBDWEZBX1ZhbHVlCQlHZXREZWZhdWx0VmFsdWUoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorDQorICAgIENYRkFfVmFsdWUJCUdldEZvcm1WYWx1ZShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisNCisgICAgQ1hGQV9DYWxjdWxhdGUJR2V0Q2FsY3VsYXRlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKw0KKyAgICBDWEZBX1ZhbGlkYXRlCUdldFZhbGlkYXRlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKw0KKyAgICBDWEZBX1ZhcmlhYmxlcwlHZXRWYXJpYWJsZXMoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorDQorICAgIENYRkFfQmluZAkJR2V0QmluZChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisNCisgICAgQ1hGQV9Bc3Npc3QJCUdldEFzc2lzdChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisNCisgICAgdm9pZAkJCUdldFJlbGV2YW50KENGWF9XaWRlU3RyaW5nQyAmd3NSZWxldmFudCk7DQorICAgIEZYX0RXT1JECQlHZXRSZWxldmFudFN0YXR1cygpOw0KKw0KKyAgICBGWF9CT09MCQkJR2V0V2lkdGgoRlhfRkxPQVQgJmZXaWR0aCk7DQorICAgIEZYX0JPT0wJCQlHZXRIZWlnaHQoRlhfRkxPQVQgJmZIZWlnaHQpOw0KKw0KKyAgICBGWF9CT09MCQkJR2V0TWluV2lkdGgoRlhfRkxPQVQgJmZNaW5XaWR0aCk7DQorICAgIEZYX0JPT0wJCQlHZXRNaW5IZWlnaHQoRlhfRkxPQVQgJmZNaW5IZWlnaHQpOw0KKw0KKyAgICBGWF9CT09MCQkJR2V0TWF4V2lkdGgoRlhfRkxPQVQgJmZNYXhXaWR0aCk7DQorICAgIEZYX0JPT0wJCQlHZXRNYXhIZWlnaHQoRlhfRkxPQVQgJmZNYXhIZWlnaHQpOw0KKw0KKyAgICBDWEZBX0JpbmRJdGVtcwlHZXRCaW5kSXRlbXMoKTsNCisgICAgRlhfQk9PTAkJCVNldEFjY2VzcyhGWF9JTlQzMiBpQWNjZXNzLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgICAgRlhfQk9PTAkJCVNldEFjY2Vzc0tleShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBY2Nlc3NLZXkpOw0KKyAgICBGWF9CT09MCQkJU2V0QW5jaG9yVHlwZShGWF9JTlQzMiBpVHlwZSk7DQorICAgIEZYX0JPT0wJCQlTZXRDb2xTcGFuKEZYX0lOVDMyIGlDb2xTcGFuKTsNCisgICAgRlhfQk9PTAkJCVNldFByZXNlbmNlKEZYX0lOVDMyIGlQcmVzZW5jZSk7DQorICAgIEZYX0JPT0wJCQlTZXRSb3RhdGUoRlhfSU5UMzIgaVJvdGF0ZSk7DQorICAgIEZYX0JPT0wJCQlTZXRSZWxldmFudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWxldmFudCk7DQorICAgIEZYX0JPT0wJCQlTZXRTdGF0dXMoRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgICBGWF9CT09MCQkJU2V0V2lkdGgoRlhfRkxPQVQgZldpZHRoKTsNCisgICAgRlhfQk9PTAkJCVNldEhlaWdodChGWF9GTE9BVCBmSGVpZ2h0KTsNCisgICAgRlhfQk9PTAkJCVNldE1pbldpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCk7DQorICAgIEZYX0JPT0wJCQlTZXRNaW5IZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCk7DQorICAgIEZYX0JPT0wJCQlTZXRNYXhXaWR0aChGWF9GTE9BVCBmTWF4V2lkdGgpOw0KKyAgICBGWF9CT09MCQkJU2V0TWF4SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpOw0KKyAgICBGWF9CT09MCQkJU2V0UG9zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKyAgICBGWF9CT09MCQkJU2V0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKTsNCisgICAgRlhfQk9PTAkJCVNldEJ1dHRvbkhpZ2hsaWdodChGWF9JTlQzMiBpQnV0dG9uSGlnaGxpZ2h0KTsNCisgICAgRlhfQk9PTAkJCVNldEJ1dHRvblJvbGxvdmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JvbGxvdmVyLCBGWF9CT09MIGJSaWNoVGV4dCk7DQorICAgIEZYX0JPT0wJCQlTZXRCdXR0b25Eb3duKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Rvd24sIEZYX0JPT0wgYlJpY2hUZXh0KTsNCisgICAgRlhfQk9PTAkJCVNldENoZWNrQnV0dG9uU2hhcGUoRlhfSU5UMzIgaUNoZWNrQnV0dG9uU2hhcGUpOw0KKyAgICBGWF9CT09MCQkJU2V0Q2hlY2tCdXR0b25NYXJrKEZYX0lOVDMyIGlDaGVja0J1dHRvbk1hcmspOw0KKyAgICBGWF9CT09MCQkJU2V0Q2hlY2tCdXR0b25TaXplKEZYX0ZMT0FUIGZDaGVja0J1dHRvbk1hcmspOw0KKw0KKyAgICBDWEZBX0JvcmRlcgkJR2V0VUlCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorDQorICAgIENYRkFfTWFyZ2luCQlHZXRVSU1hcmdpbihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgICAgdm9pZAkJCUdldFVJTWFyZ2luKENGWF9SZWN0RiAmcnRVSU1hcmdpbik7DQorDQorICAgIEZYX0lOVDMyCQlHZXRCdXR0b25IaWdobGlnaHQoKTsNCisgICAgRlhfQk9PTAkJCUdldEJ1dHRvblJvbGxvdmVyKENGWF9XaWRlU3RyaW5nICZ3c1JvbGxvdmVyLCBGWF9CT09MICZiUmljaFRleHQpOw0KKyAgICBGWF9CT09MCQkJR2V0QnV0dG9uRG93bihDRlhfV2lkZVN0cmluZyAmd3NEb3duLCBGWF9CT09MICZiUmljaFRleHQpOw0KKw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0Q2hlY2tCdXR0b25TaGFwZSgpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0Q2hlY2tCdXR0b25NYXJrKCk7DQorDQorICAgIEZYX0ZMT0FUCQlHZXRDaGVja0J1dHRvblNpemUoKTsNCisNCisgICAgRlhfQk9PTAkJCUlzQWxsb3dOZXV0cmFsKCk7DQorICAgIEZYX0JPT0wJCQlJc1JhZGlvQnV0dG9uKCk7DQorICAgIFhGQV9DSEVDS1NUQVRFCUdldENoZWNrU3RhdGUoKTsNCisgICAgdm9pZAkJCVNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KKw0KKyAgICBDWEZBX05vZGUqCQlHZXRFeGNsR3JvdXBOb2RlKCk7DQorDQorICAgIENYRkFfTm9kZSoJCUdldFNlbGVjdGVkTWVtYmVyKCk7DQorDQorICAgIENYRkFfTm9kZSoJCVNldFNlbGVjdGVkTWVtYmVyKEZYX1dTVFIgd3NOYW1lLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisNCisgICAgdm9pZAkJCVNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZShGWF9XU1RSIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLCBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KKyAgICBDWEZBX05vZGUqCQlHZXRFeGNsR3JvdXBGaXJzdE1lbWJlcigpOw0KKyAgICBDWEZBX05vZGUqCQlHZXRFeGNsR3JvdXBOZXh0TWVtYmVyKENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0Q2hvaWNlTGlzdENvbW1pdE9uKCk7DQorDQorICAgIEZYX0JPT0wJCQlJc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0Q2hvaWNlTGlzdE9wZW4oKTsNCisgICAgRlhfQk9PTAkJCUlzTGlzdEJveCgpOw0KKyAgICBGWF9JTlQzMgkJQ291bnRDaG9pY2VMaXN0SXRlbXMoRlhfQk9PTCBiU2F2ZVZhbHVlID0gRkFMU0UpOw0KKw0KKyAgICBGWF9CT09MCQkJR2V0Q2hvaWNlTGlzdEl0ZW0oQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJTYXZlVmFsdWUgPSBGQUxTRSk7DQorICAgIHZvaWQJCQlHZXRDaG9pY2VMaXN0SXRlbXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSAmd3NUZXh0QXJyYXksIEZYX0JPT0wgYlNhdmVWYWx1ZSA9IEZBTFNFKTsNCisNCisgICAgRlhfSU5UMzIJCUNvdW50U2VsZWN0ZWRJdGVtcygpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0U2VsZWN0ZWRJdGVtKEZYX0lOVDMyIG5JbmRleCA9IDApOw0KKyAgICB2b2lkCQkJR2V0U2VsZWN0ZWRJdGVtcyhDRlhfSW50MzJBcnJheSAmaVNlbEFycmF5KTsNCisgICAgdm9pZAkJCUdldFNlbGVjdGVkSXRlbXNWYWx1ZShDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1NlbFRleHRBcnJheSk7DQorDQorICAgIEZYX0JPT0wJCQlHZXRJdGVtU3RhdGUoRlhfSU5UMzIgbkluZGV4KTsNCisNCisgICAgdm9pZAkJCVNldEl0ZW1TdGF0ZShGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICAgIHZvaWQJCQlTZXRTZWxlY3RkSXRlbXMoQ0ZYX0ludDMyQXJyYXkgJmlTZWxBcnJheSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLCBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KKyAgICB2b2lkCQkJQ2xlYXJBbGxTZWxlY3Rpb25zKCk7DQorICAgIHZvaWQJCQlJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0xhYmVsLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgRlhfSU5UMzIgbkluZGV4ID0gLTEsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCisgICAgdm9pZAkJCUdldEl0ZW1MYWJlbChGWF9XU1RSIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nICZ3c0xhYmVsKTsNCisgICAgdm9pZAkJCUdldEl0ZW1WYWx1ZShGWF9XU1RSIHdzTGFiZWwsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKTsNCisgICAgRlhfQk9PTAkJCURlbGV0ZUl0ZW0oRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorDQorICAgIEZYX0lOVDMyCQlHZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCk7DQorDQorICAgIEZYX0lOVDMyCQlHZXROdW1iZXJPZkNlbGxzKCk7DQorDQorICAgIEZYX0JPT0wJCQlJc0RhdGVUaW1lRWRpdFVzZVBpY2tlcigpOw0KKw0KKyAgICBGWF9CT09MCQlTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKTsNCisgICAgRlhfQk9PTAkJR2V0UGljdHVyZUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRSBlUGljdHVyZSk7DQorICAgIElGWF9Mb2NhbGUqIEdldExvY2FsKCk7DQorICAgIEZYX0JPT0wJCUdldFZhbHVlKENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpOw0KKyAgICBGWF9CT09MCQlHZXROb3JtYWxpemVEYXRhVmFsdWUoRlhfV1NUUiB3c1ZhbHVlLCBDRlhfV2lkZVN0cmluZyAmd3NOb3JtYWxpemVWYWx1ZSk7DQorICAgIEZYX0JPT0wJCUdldEZvcm1hdERhdGFWYWx1ZShGWF9XU1RSIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICB2b2lkCQlOb3JtYWxpemVOdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorDQorICAgIENGWF9XaWRlU3RyaW5nCUdldEJhcmNvZGVUeXBlKCk7DQorICAgIEZYX0JPT0wJCQlHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhGWF9JTlQzMiYgdmFsKTsNCisgICAgRlhfQk9PTAkJCUdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oRlhfSU5UMzImIHZhbCk7DQorICAgIEZYX0JPT0wJCQlHZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoRlhfSU5UMzImIHZhbCk7DQorICAgIEZYX0JPT0wJCQlHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihGWF9DSEFSJiB2YWwpOw0KKyAgICBGWF9CT09MCQkJR2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKEZYX0NIQVImIHZhbCk7DQorICAgIEZYX0JPT0wJCQlHZXRCYXJjb2RlQXR0cmlidXRlX0VDTGV2ZWwoRlhfSU5UMzImIHZhbCk7DQorICAgIEZYX0JPT0wJCQlHZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZVdpZHRoKEZYX0lOVDMyJiB2YWwpOw0KKyAgICBGWF9CT09MCQkJR2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoRlhfSU5UMzImIHZhbCk7DQorICAgIEZYX0JPT0wJCQlHZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oRlhfQk9PTCYgdmFsKTsNCisgICAgRlhfQk9PTAkJCUdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKEZYX0lOVDMyJiB2YWwpOw0KKyAgICBGWF9CT09MCQkJR2V0QmFyY29kZUF0dHJpYnV0ZV9UcnVuY2F0ZShGWF9CT09MJiB2YWwpOw0KKyAgICBGWF9CT09MCQkJR2V0QmFyY29kZUF0dHJpYnV0ZV9XaWRlTmFycm93UmF0aW8oRlhfRkxPQVQmIHZhbCk7DQorDQorICAgIHZvaWQJCQlHZXRQYXNzd29yZENoYXIoQ0ZYX1dpZGVTdHJpbmcgJndzUGFzc1dvcmQpOw0KKw0KKyAgICBGWF9CT09MCQkJSXNBbGxvd1JpY2hUZXh0KCk7DQorDQorICAgIEZYX0JPT0wJCQlJc011bHRpTGluZSgpOw0KKw0KKyAgICBGWF9JTlQzMgkJR2V0VmVydGljYWxTY3JvbGxQb2xpY3koKTsNCisNCisgICAgRlhfSU5UMzIJCUdldE1heENoYXJzKFhGQV9FTEVNRU5UJiBlVHlwZSk7DQorDQorICAgIEZYX0JPT0wJCQlHZXRGcmFjRGlnaXRzKEZYX0lOVDMyICZpRnJhY0RpZ2l0cyk7DQorDQorICAgIEZYX0JPT0wJCQlHZXRMZWFkRGlnaXRzKEZYX0lOVDMyICZpTGVhZERpZ2l0cyk7DQorDQorICAgIENYRkFfRmlsdGVyCQlHZXRGaWx0ZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICAgIENYRkFfTWFuaWZlc3QJR2V0TWFuaWZlc3QoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICAgIEZYX0JPT0wJCQltX2JJc051bGw7DQorICAgIEZYX0JPT0wJCQltX2JQcmVOdWxsOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJCVN5bmNWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KTsNCisgICAgdm9pZAkJCUluc2VydExpc3RUZXh0SXRlbShDWEZBX05vZGUqIHBJdGVtcywgRlhfV1NUUiB3c1RleHQsIEZYX0lOVDMyIG5JbmRleCA9IC0xKTsNCisgICAgdm9pZAkJCUZvcm1hdE51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgSUZYX0xvY2FsZSogcExvY2FsZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgICAgQ1hGQV9Ob2RlKgkJbV9wVWlDaGlsZE5vZGU7DQorICAgIFhGQV9FTEVNRU5UCQltX2VVSVR5cGU7DQorfTsNCitjbGFzcyBDWEZBX09jY3VyIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfT2NjdXIoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIEZYX0lOVDMyCUdldE1heCgpOw0KKyAgICBGWF9JTlQzMglHZXRNaW4oKTsNCisgICAgRlhfSU5UMzIJR2V0SW5pdGlhbCgpOw0KKyAgICBGWF9CT09MCQlHZXRPY2N1ckluZm8oRlhfSU5UMzImIGlNaW4sIEZYX0lOVDMyJiBpTWF4LCBGWF9JTlQzMiYgaUluaXQpOw0KKyAgICB2b2lkCQlTZXRNYXgoRlhfSU5UMzIgaU1heCk7DQorICAgIHZvaWQJCVNldE1pbihGWF9JTlQzMiBpTWluKTsNCit9Ow0KK2NsYXNzIENYRkFfRmlsdGVyIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRmlsdGVyKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldEZpbHRlclN0cmluZyhYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0QXBwZWFyYW5jZUZpbHRlclR5cGUoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRBcHBlYXJhbmNlRmlsdGVyQ29udGVudCgpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0Q2VydGlmaWNhdGVzQ3JlZGVudGlhbFNlcnZlclBvbGljeSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldENlcnRpZmljYXRlc1VSTCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldENlcnRpZmljYXRlc1VSTFBvbGljeSgpOw0KKyAgICBDWEZBX1dyYXBDZXJ0aWZpY2F0ZQlHZXRDZXJ0aWZpY2F0ZXNFbmNyeXB0aW9uKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgICBDWEZBX1dyYXBDZXJ0aWZpY2F0ZQlHZXRDZXJ0aWZpY2F0ZXNJc3N1ZXJzKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldENlcnRpZmljYXRlc0tleVVzYWdlU3RyaW5nKFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIENYRkFfT2lkcwkJCQlHZXRDZXJ0aWZpY2F0ZXNPaWRzKCk7DQorICAgIENYRkFfV3JhcENlcnRpZmljYXRlCUdldENlcnRpZmljYXRlc1NpZ25pbmcoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICAgIENYRkFfRGlnZXN0TWV0aG9kcwkJR2V0RGlnZXN0TWV0aG9kcyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgICAgQ1hGQV9FbmNvZGluZ3MJCQlHZXRFbmNvZGluZ3MoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICAgIENYRkFfRW5jcnlwdGlvbk1ldGhvZHMJR2V0RW5jcnlwdGlvbk1ldGhvZHMoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNCQlHZXRIYW5kbGVyVHlwZSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldEhhbmRsZXJDb250ZW50KCk7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNCQlHZXRsb2NrRG9jdW1lbnRUeXBlKCk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0bG9ja0RvY3VtZW50Q29udGVudCgpOw0KKyAgICBGWF9JTlQzMgkJCQlHZXRNRFBQZXJtaXNzaW9ucygpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0TURQU2lnbmF0dXJlVHlwZSgpOw0KKw0KKyAgICBDWEZBX1JlYXNvbnMJCQlHZXRSZWFzb25zKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldFRpbWVTdGFtcFNlcnZlcigpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0VGltZVN0YW1wVHlwZSgpOw0KK307DQorY2xhc3MgQ1hGQV9DZXJ0aWZpY2F0ZSA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0NlcnRpZmljYXRlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgICBDRlhfV2lkZVN0cmluZwkJR2V0Q2VydGlmaWNhdGVOYW1lKCk7DQorICAgIENGWF9XaWRlU3RyaW5nCQlHZXRDZXJ0aWZpY2F0ZUNvbnRlbnQoKTsNCit9Ow0KK2NsYXNzIENYRkFfV3JhcENlcnRpZmljYXRlIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfV3JhcENlcnRpZmljYXRlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQlHZXRUeXBlKCk7DQorICAgIEZYX0lOVDMyCQkJQ291bnRDZXJ0aWZpY2F0ZXMoKTsNCisgICAgQ1hGQV9DZXJ0aWZpY2F0ZQlHZXRDZXJ0aWZpY2F0ZShGWF9JTlQzMiBuSW5kZXgpOw0KK307DQorY2xhc3MgQ1hGQV9PaWRzIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfT2lkcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgICAgWEZBX0FUVFJJQlVURUVOVU0JR2V0T2lkc1R5cGUoKTsNCisgICAgRlhfSU5UMzIJCQlDb3VudE9pZHMoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCUdldE9pZENvbnRlbnQoRlhfSU5UMzIgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfU3ViamVjdEROcyA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX1N1YmplY3RETnMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNCUdldFN1YmplY3RETnNUeXBlKCk7DQorICAgIEZYX0lOVDMyCQkJCUNvdW50U3ViamVjdEROcygpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldFN1YmplY3RETlN0cmluZyhGWF9JTlQzMiBuSW5kZXgsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0U3ViamVjdEROQ29udGVudChGWF9JTlQzMiBuSW5kZXgpOw0KK307DQorY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2RzIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRGlnZXN0TWV0aG9kcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgICAgWEZBX0FUVFJJQlVURUVOVU0JR2V0RGlnZXN0TWV0aG9kc1R5cGUoKTsNCisgICAgRlhfSU5UMzIJCQkJQ291bnREaWdlc3RNZXRob2RzKCk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RGlnZXN0TWV0aG9kQ29udGVudChGWF9JTlQzMiBuSW5kZXgpOw0KK307DQorY2xhc3MgQ1hGQV9FbmNvZGluZ3MgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9FbmNvZGluZ3MoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNCQlHZXRFbmNvZGluZ3NUeXBlKCk7DQorICAgIEZYX0lOVDMyCQkJCUNvdW50RW5jb2RpbmdzKCk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RW5jb2RpbmdDb250ZW50KEZYX0lOVDMyIG5JbmRleCk7DQorfTsNCitjbGFzcyBDWEZBX0VuY3J5cHRpb25NZXRob2RzIDogcHVibGljIENYRkFfRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRW5jcnlwdGlvbk1ldGhvZHMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNCQlHZXRFbmNyeXB0aW9uTWV0aG9kc1R5cGUoKTsNCisgICAgRlhfSU5UMzIJCQkJQ291bnRFbmNyeXB0aW9uTWV0aG9kcygpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCUdldEVuY3J5cHRpb25NZXRob2RDb250ZW50KEZYX0lOVDMyIG5JbmRleCk7DQorfTsNCitjbGFzcyBDWEZBX1JlYXNvbnMgOiBwdWJsaWMgQ1hGQV9EYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9SZWFzb25zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0UmVhc29uc1R5cGUoKTsNCisgICAgRlhfSU5UMzIJCQkJQ291bnRSZWFzb25zKCk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0UmVhc29uQ29udGVudChGWF9JTlQzMiBuSW5kZXgpOw0KK307DQorY2xhc3MgQ1hGQV9NYW5pZmVzdCA6IHB1YmxpYyBDWEZBX0RhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX01hbmlmZXN0KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQlHZXRBY3Rpb24oKTsNCisgICAgRlhfSU5UMzIJCQlDb3VudFJlaXZlcygpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJR2V0UmVmQ29udGVudChGWF9JTlQzMiBuSW5kZXgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhmYS9meGZhX3dpZGdldC5oIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhX3dpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODg1MDIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfd2lkZ2V0LmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9XSURHRVRfSA0KKyNkZWZpbmUgX0ZYRkFfV0lER0VUX0gNCitjbGFzcyBDWEZBX05vZGU7DQorY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7DQorY2xhc3MgQ1hGQV9GRkRvYzsNCitjbGFzcyBDWEZBX0ZGQXBwOw0KK2NsYXNzIENYRkFfTm9kZTsNCitjbGFzcyBDWEZBX0V2ZW50UGFyYW07DQorY2xhc3MgQ1hGQV9GRldpZGdldDsNCitjbGFzcyBDWEZBX1RleHRMYXlvdXQ7DQorY2xhc3MgQ1hGQV9UZXh0UHJvdmlkZXI7DQorY2xhc3MgQ1hGQV9XaWRnZXRMYXlvdXREYXRhOw0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIENYRkFfV2lkZ2V0QWNjOw0KKyNpbmNsdWRlICJmeGZhX29iamVjdGFjYy5oIg0KK2NsYXNzIENYRkFfV2lkZ2V0QWNjIDogcHVibGljIENYRkFfV2lkZ2V0RGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfV2lkZ2V0QWNjKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIH5DWEZBX1dpZGdldEFjYygpOw0KKw0KKyAgICBGWF9CT09MCQkJR2V0TmFtZShDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBGWF9JTlQzMiBpTmFtZVR5cGUgPSAwKTsNCisgICAgRlhfQk9PTAkJCVByb2Nlc3NWYWx1ZUNoYW5nZWQoKTsNCisNCitwdWJsaWM6DQorDQorICAgIHZvaWQJCQlSZXNldERhdGEoKTsNCisNCisNCisgICAgdm9pZAkJCVNldEltYWdlRWRpdChGWF9XU1RSIHdzQ29udGVudFR5cGUsIEZYX1dTVFIgd3NIcmVmLCBGWF9XU1RSIHdzRGF0YSk7DQorDQorICAgIENYRkFfV2lkZ2V0QWNjKglHZXRFeGNsR3JvdXAoKTsNCisgICAgQ1hGQV9GRkRvY1ZpZXcqCQlHZXREb2NWaWV3KCk7DQorICAgIENYRkFfRkZEb2MqCQkJR2V0RG9jKCk7DQorICAgIENYRkFfRkZBcHAqCQkJR2V0QXBwKCk7DQorICAgIElYRkFfQXBwUHJvdmlkZXIqCUdldEFwcFByb3ZpZGVyKCk7DQorDQorICAgIEZYX0lOVDMyCQlQcm9jZXNzRXZlbnQoRlhfSU5UMzIgaUFjdGl2aXR5LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKTsNCisgICAgRlhfSU5UMzIJCVByb2Nlc3NFdmVudChDWEZBX0V2ZW50JiBldmVudCwgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSk7DQorICAgIEZYX0lOVDMyCQlQcm9jZXNzQ2FsY3VsYXRlKCk7DQorICAgIEZYX0lOVDMyCQlQcm9jZXNzVmFsaWRhdGUoRlhfSU5UMzIgaUZsYWdzID0gMCk7DQorICAgIEZYX0lOVDMyCQlFeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0IHNjcmlwdCwgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSwgRlhKU0VfSFZBTFVFKiBwUmV0VmFsdWUgPSBOVUxMKTsNCisNCisgICAgQ1hGQV9GRldpZGdldCoJR2V0TmV4dFdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdm9pZAkJCVN0YXJ0V2lkZ2V0TGF5b3V0KEZYX0ZMT0FUICZmQ2FsY1dpZHRoLCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpOw0KKyAgICBGWF9CT09MCQkJRmluZFNwbGl0UG9zKEZYX0lOVDMyIGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHQpOw0KKyAgICBGWF9CT09MCQkJCUxvYWRDYXB0aW9uKCk7DQorICAgIEZYX0JPT0wJCQkJTG9hZFRleHQoKTsNCisgICAgRlhfQk9PTAkJCQlMb2FkSW1hZ2VJbWFnZSgpOw0KKyAgICBGWF9CT09MCQkJCUxvYWRJbWFnZUVkaXRJbWFnZSgpOw0KKyAgICB2b2lkCQkJCUdldEltYWdlRHBpKEZYX0lOVDMyICZpSW1hZ2VYRHBpLCBGWF9JTlQzMiAmaUltYWdlWURwaSk7DQorICAgIHZvaWQJCQkJR2V0SW1hZ2VFZGl0RHBpKEZYX0lOVDMyICZpSW1hZ2VYRHBpLCBGWF9JTlQzMiAmaUltYWdlWURwaSk7DQorICAgIENYRkFfVGV4dExheW91dCoJR2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgICAgQ1hGQV9UZXh0TGF5b3V0KglHZXRUZXh0TGF5b3V0KCk7DQorICAgIENGWF9ESUJpdG1hcCoJCUdldEltYWdlSW1hZ2UoKTsNCisgICAgQ0ZYX0RJQml0bWFwKgkJR2V0SW1hZ2VFZGl0SW1hZ2UoKTsNCisgICAgdm9pZAkJCQlTZXRJbWFnZUltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOw0KKyAgICB2b2lkCQkJCVNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOw0KKyAgICB2b2lkCQkJVXBkYXRlVUlEaXNwbGF5KENYRkFfRkZXaWRnZXQqIHBFeGNlcHQgPSBOVUxMKTsNCisgICAgdm9pZAkJCU5vdGlmeUV2ZW50KEZYX0RXT1JEIGR3RXZlbnQsIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMLCBGWF9MUFZPSUQgcFBhcmFtID0gTlVMTCwgRlhfTFBWT0lEIHBBZGRpdGlvbmFsID0gTlVMTCk7DQorDQorDQorICAgIENYRkFfTm9kZSoJCUdldERhdGFzZXRzKCk7DQorICAgIElGWF9Gb250KgkJR2V0RkRFRm9udCgpOw0KKyAgICBGWF9GTE9BVAkJR2V0Rm9udFNpemUoKTsNCisgICAgRlhfQVJHQgkJCUdldFRleHRDb2xvcigpOw0KKyAgICBGWF9GTE9BVAkJR2V0TGluZUhlaWdodCgpOw0KKyAgICBDWEZBX1dpZGdldExheW91dERhdGEqIEdldFdpZGdldExheW91dERhdGEoKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQlQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsIEZYX0lOVDMyIGlSZXQsIEZYSlNFX0hWQUxVRSBwUmV0VmFsdWUsIEZYX0JPT0wgYlZlcnNpb25GbGFnKTsNCisgICAgRlhfSU5UMzIJCVByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KKyAgICBGWF9JTlQzMgkJUHJvY2Vzc051bGxUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwgRlhfSU5UMzIgaUZsYWdzLCBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICAgIHZvaWQJCQlHZXRWYWxpZGF0ZUNhcHRpb25OYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb25OYW1lLCBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICAgIHZvaWQJCQlHZXRWYWxpZGF0ZU1lc3NhZ2UoSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyLCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlLCBGWF9CT09MIGJFcnJvciwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KKyAgICB2b2lkCQkJQ2FsY0NhcHRpb25TaXplKENGWF9TaXplRiAmc3pDYXApOw0KKyAgICBGWF9CT09MCQkJQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KKyAgICBGWF9CT09MCQkJQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCisgICAgRlhfQk9PTAkJCUNhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCisgICAgRlhfQk9PTAkJCUNhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCisgICAgRlhfQk9PTAkJCUNhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KKyAgICBGWF9CT09MCQkJQ2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCisgICAgRlhfQk9PTAkJCUNhbGN1bGF0ZUltYWdlQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCisgICAgRlhfQk9PTAkJCUNhbGN1bGF0ZVRleHRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KKyAgICBGWF9GTE9BVAkJQ2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChGWF9GTE9BVCBmSGVpZ2h0Q2FsYyk7DQorICAgIEZYX0ZMT0FUCQlDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQorICAgIEZYX0ZMT0FUCQlHZXRXaWR0aFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQorICAgIEZYX0ZMT0FUCQlHZXRIZWlnaHRXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZIZWlnaHRDYWxjKTsNCisgICAgdm9pZAkJCUNhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KKyAgICB2b2lkCQkJQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoWEZBX0VMRU1FTlQgZVVJVHlwZSwgRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KTsNCisgICAgdm9pZAkJCUluaXRMYXlvdXREYXRhKCk7DQorICAgIHZvaWQJCQlTdGFydFRleHRMYXlvdXQoRlhfRkxPQVQmIGZDYWxjV2lkdGgsIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICAgIENYRkFfRkZEb2NWaWV3KgkJbV9wRG9jVmlldzsNCisgICAgQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBtX3BMYXlvdXREYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhncmFwaGljcy9meF9ncmFwaGljcy5oIGIveGZhL2luY2x1ZGUvZnhncmFwaGljcy9meF9ncmFwaGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWM5NjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgKQEAgLTAsMCArMSw1MTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfX0hfRlhfR1JBUEhJQ1NfXw0KKyNkZWZpbmUgX19IX0ZYX0dSQVBISUNTX18NCisjZGVmaW5lIEZYX0VSUl9TdWNjZWVkZWQJCQkJCTANCisjZGVmaW5lIEZYX0VSUl9JbmRlZmluaXRlCQkJCQktMQ0KKyNkZWZpbmUgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkCQkJLTEwMA0KKyNkZWZpbmUgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQJCQkJLTIwMA0KKyNkZWZpbmUgRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkCS0zMDANCisjZGVmaW5lIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZAkJCS00MDANCisjZGVmaW5lIEZYX0VSUl9PdXRfT2ZfTWVtb3J5CQkJCS01MDANCisjZGVmaW5lIF9GWF9SRVRVUk5fSUZfRkFJTChhcmcpIHtpZiAoIShhcmcpKSByZXR1cm47fQ0KKyNkZWZpbmUgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGFyZywgdmFsKSB7aWYgKCEoYXJnKSkgcmV0dXJuIHZhbDt9DQorI2RlZmluZSBfRlhfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSB7aWYgKCEoYXJnKSkgZ290byBwb3M7fQ0KKyNkZWZpbmUgX0ZYX0VSUl9DSEVDS19SRVRVUk5fSUZfRkFJTChhcmcpIHtpZiAoKGFyZykgIT0gRlhfRVJSX1N1Y2NlZWRlZCkgcmV0dXJuO30NCisjZGVmaW5lIF9GWF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYXJnLCB2YWwpIHtpZiAoKGFyZykgIT0gRlhfRVJSX1N1Y2NlZWRlZCkgcmV0dXJuIHZhbDt9DQorI2RlZmluZSBfRlhfRVJSX0NIRUNLX0dPVE9fUE9TSVRJT05fSUZfRkFJTChhcmcsIHBvcykge2lmICgoYXJnKSAhPSBGWF9FUlJfU3VjY2VlZGVkKSBnb3RvIHBvczt9DQorI2RlZmluZSBGWF9TSEFESU5HX1N0ZXBzCTI1Ng0KK3R5cGVkZWYgRlhfSU5UMzIgRlhfRGFzaFN0eWxlOw0KK2VudW0gew0KKyAgICBGWF9EQVNIU1RZTEVfU29saWQJCQkJCQk9IDAsDQorICAgIEZYX0RBU0hTVFlMRV9EYXNoCQkJCQkJPSAxLA0KKyAgICBGWF9EQVNIU1RZTEVfRG90CQkJCQkJPSAyLA0KKyAgICBGWF9EQVNIU1RZTEVfRGFzaERvdAkJCQkJPSAzLA0KKyAgICBGWF9EQVNIU1RZTEVfRGFzaERvdERvdAkJCQkJPSA0DQorfTsNCit0eXBlZGVmIEZYX0lOVDMyIEZYX1N0cm9rZUFsaWdubWVudDsNCitlbnVtIHsNCisgICAgRlhfU1RST0tFQUxJR05NRU5UX0NlbnRlcgkJCQk9IDAsDQorICAgIEZYX1NUUk9LRUFMSUdOTUVOVF9JbnNldAkJCQk9IDEsDQorICAgIEZYX1NUUk9LRUFMSUdOTUVOVF9PdXRzZXQJCQkJPSAyLA0KKyAgICBGWF9TVFJPS0VBTElHTk1FTlRfTGVmdAkJCQkJPSAzLA0KKyAgICBGWF9TVFJPS0VBTElHTk1FTlRfUmlnaHQJCQkJPSA0DQorfTsNCit0eXBlZGVmIEZYX0lOVDMyIEZYX0hhdGNoU3R5bGU7DQorZW51bSB7DQorICAgIEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbAkJCQk9IDAsDQorICAgIEZYX0hBVENIU1RZTEVfVmVydGljYWwJCQkJCT0gMSwNCisgICAgRlhfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWwJCQk9IDIsDQorICAgIEZYX0hBVENIU1RZTEVfQmFja3dhcmREaWFnb25hbAkJCT0gMywNCisgICAgRlhfSEFUQ0hTVFlMRV9Dcm9zcwkJCQkJCT0gNCwNCisgICAgRlhfSEFUQ0hTVFlMRV9EaWFnb25hbENyb3NzCQkJCT0gNSwNCisgICAgRlhfSEFUQ0hTVFlMRV8wNVBlcmNlbnQJCQkJCT0gNiwNCisgICAgRlhfSEFUQ0hTVFlMRV8xMFBlcmNlbnQJCQkJCT0gNywNCisgICAgRlhfSEFUQ0hTVFlMRV8yMFBlcmNlbnQJCQkJCT0gOCwNCisgICAgRlhfSEFUQ0hTVFlMRV8yNVBlcmNlbnQJCQkJCT0gOSwNCisgICAgRlhfSEFUQ0hTVFlMRV8zMFBlcmNlbnQJCQkJCT0gMTAsDQorICAgIEZYX0hBVENIU1RZTEVfNDBQZXJjZW50CQkJCQk9IDExLA0KKyAgICBGWF9IQVRDSFNUWUxFXzUwUGVyY2VudAkJCQkJPSAxMiwNCisgICAgRlhfSEFUQ0hTVFlMRV82MFBlcmNlbnQJCQkJCT0gMTMsDQorICAgIEZYX0hBVENIU1RZTEVfNzBQZXJjZW50CQkJCQk9IDE0LA0KKyAgICBGWF9IQVRDSFNUWUxFXzc1UGVyY2VudAkJCQkJPSAxNSwNCisgICAgRlhfSEFUQ0hTVFlMRV84MFBlcmNlbnQJCQkJCT0gMTYsDQorICAgIEZYX0hBVENIU1RZTEVfOTBQZXJjZW50CQkJCQk9IDE3LA0KKyAgICBGWF9IQVRDSFNUWUxFX0xpZ2h0RG93bndhcmREaWFnb25hbAkJPSAxOCwNCisgICAgRlhfSEFUQ0hTVFlMRV9MaWdodFVwd2FyZERpYWdvbmFsCQk9IDE5LA0KKyAgICBGWF9IQVRDSFNUWUxFX0RhcmtEb3dud2FyZERpYWdvbmFsCQk9IDIwLA0KKyAgICBGWF9IQVRDSFNUWUxFX0RhcmtVcHdhcmREaWFnb25hbAkJPSAyMSwNCisgICAgRlhfSEFUQ0hTVFlMRV9XaWRlRG93bndhcmREaWFnb25hbAkJPSAyMiwNCisgICAgRlhfSEFUQ0hTVFlMRV9XaWRlVXB3YXJkRGlhZ29uYWwJCT0gMjMsDQorICAgIEZYX0hBVENIU1RZTEVfTGlnaHRWZXJ0aWNhbAkJCQk9IDI0LA0KKyAgICBGWF9IQVRDSFNUWUxFX0xpZ2h0SG9yaXpvbnRhbAkJCT0gMjUsDQorICAgIEZYX0hBVENIU1RZTEVfTmFycm93VmVydGljYWwJCQk9IDI2LA0KKyAgICBGWF9IQVRDSFNUWUxFX05hcnJvd0hvcml6b250YWwJCQk9IDI3LA0KKyAgICBGWF9IQVRDSFNUWUxFX0RhcmtWZXJ0aWNhbAkJCQk9IDI4LA0KKyAgICBGWF9IQVRDSFNUWUxFX0RhcmtIb3Jpem9udGFsCQkJPSAyOSwNCisgICAgRlhfSEFUQ0hTVFlMRV9EYXNoZWREb3dud2FyZERpYWdvbmFsCT0gMzAsDQorICAgIEZYX0hBVENIU1RZTEVfRGFzaGVkVXB3YXJkRGlhZ29uYWwJCT0gMzEsDQorICAgIEZYX0hBVENIU1RZTEVfRGFzaGVkSG9yaXpvbnRhbAkJCT0gMzIsDQorICAgIEZYX0hBVENIU1RZTEVfRGFzaGVkVmVydGljYWwJCQk9IDMzLA0KKyAgICBGWF9IQVRDSFNUWUxFX1NtYWxsQ29uZmV0dGkJCQkJPSAzNCwNCisgICAgRlhfSEFUQ0hTVFlMRV9MYXJnZUNvbmZldHRpCQkJCT0gMzUsDQorICAgIEZYX0hBVENIU1RZTEVfWmlnWmFnCQkJCQk9IDM2LA0KKyAgICBGWF9IQVRDSFNUWUxFX1dhdmUJCQkJCQk9IDM3LA0KKyAgICBGWF9IQVRDSFNUWUxFX0RpYWdvbmFsQnJpY2sJCQkJPSAzOCwNCisgICAgRlhfSEFUQ0hTVFlMRV9Ib3Jpem9udGFsQnJpY2sJCQk9IDM5LA0KKyAgICBGWF9IQVRDSFNUWUxFX1dlYXZlCQkJCQkJPSA0MCwNCisgICAgRlhfSEFUQ0hTVFlMRV9QbGFpZAkJCQkJCT0gNDEsDQorICAgIEZYX0hBVENIU1RZTEVfRGl2b3QJCQkJCQk9IDQyLA0KKyAgICBGWF9IQVRDSFNUWUxFX0RvdHRlZEdyaWQJCQkJPSA0MywNCisgICAgRlhfSEFUQ0hTVFlMRV9Eb3R0ZWREaWFtb25kCQkJCT0gNDQsDQorICAgIEZYX0hBVENIU1RZTEVfU2hpbmdsZQkJCQkJPSA0NSwNCisgICAgRlhfSEFUQ0hTVFlMRV9UcmVsbGlzCQkJCQk9IDQ2LA0KKyAgICBGWF9IQVRDSFNUWUxFX1NwaGVyZQkJCQkJPSA0NywNCisgICAgRlhfSEFUQ0hTVFlMRV9TbWFsbEdyaWQJCQkJCT0gNDgsDQorICAgIEZYX0hBVENIU1RZTEVfU21hbGxDaGVja2VyQm9hcmQJCQk9IDQ5LA0KKyAgICBGWF9IQVRDSFNUWUxFX0xhcmdlQ2hlY2tlckJvYXJkCQkJPSA1MCwNCisgICAgRlhfSEFUQ0hTVFlMRV9PdXRsaW5lZERpYW1vbmQJCQk9IDUxLA0KKyAgICBGWF9IQVRDSFNUWUxFX1NvbGlkRGlhbW9uZAkJCQk9IDUyDQorfTsNCit0eXBlZGVmIEZYX0lOVDMyIEZYX0RldmljZUNhcDsNCit0eXBlZGVmIEZYX0lOVDMyIEZYX0ZpbGxNb2RlOw0KK2NsYXNzIENGWF9PYmplY3Q7DQorY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsNCitjbGFzcyBDRlhfR3JhcGhTdGF0ZURhdGE7DQorY2xhc3MgQ0ZYX01hdHJpeDsNCitjbGFzcyBDRlhfRElCU291cmNlOw0KK2NsYXNzIENGWF9ESUJpdG1hcDsNCitjbGFzcyBDRlhfRm9udDsNCitjbGFzcyBDRlhfV2lkZVN0cmluZzsNCitjbGFzcyBJRlhfRmlsZVJlYWQ7DQorY2xhc3MgQ0ZYX1BhdGhHZW5lcmF0b3I7DQorY2xhc3MgQ0FHR19HcmFwaGljczsNCitjbGFzcyBDRlhfR3JhcGhpY3M7DQorY2xhc3MgQ0ZYX0NvbG9yOw0KK2NsYXNzIENGWF9QYXRoOw0KK2NsYXNzIENGWF9QYXR0ZXJuOw0KK2NsYXNzIENGWF9TaGFkaW5nOw0KK2NsYXNzIENGWF9HcmFwaGljcyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisNCisNCisgICAgQ0ZYX0dyYXBoaWNzKCk7DQorDQorICAgIEZYX0VSUiBDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSAqIHJlbmRlckRldmljZSwgRlhfQk9PTCBpc0FudGlhbGlhc2luZyA9IFRSVUUpOw0KKw0KKyAgICBGWF9FUlIgQ3JlYXRlKEZYX0lOVDMyCSAgIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIEZYX0lOVDMyCSAgIGhlaWdodCwNCisgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wgICAgICBpc05hdGl2ZSAgICAgICA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgRlhfQk9PTAkgICBpc0FudGlhbGlhc2luZyA9IFRSVUUpOw0KKw0KKw0KKyAgICB2aXJ0dWFsIH5DRlhfR3JhcGhpY3MoKTsNCisNCisNCisNCisgICAgRlhfRVJSIEdldERldmljZUNhcChjb25zdCBGWF9JTlQzMiBjYXBJRCwgRlhfRGV2aWNlQ2FwICYgY2FwVmFsKTsNCisgICAgRlhfRVJSIElzUHJpbnRlckRldmljZShGWF9CT09MICYgaXNQcmludGVyKTsNCisgICAgRlhfRVJSIEVuYWJsZUFudGlhbGlhc2luZyhGWF9CT09MIGlzQW50aWFsaWFzaW5nKTsNCisNCisNCisNCisgICAgRlhfRVJSIFNhdmVHcmFwaFN0YXRlKCk7DQorDQorICAgIEZYX0VSUiBSZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKw0KKw0KKw0KKyAgICBGWF9FUlIgR2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgJiBsaW5lQ2FwKTsNCisNCisgICAgRlhfRVJSIFNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApOw0KKw0KKyAgICBGWF9FUlIgR2V0RGFzaENvdW50KEZYX0lOVDMyICYgZGFzaENvdW50KTsNCisNCisgICAgRlhfRVJSIEdldExpbmVEYXNoKEZYX0ZMT0FUICYgZGFzaFBoYXNlLCBGWF9GTE9BVCAqIGRhc2hBcnJheSk7DQorDQorICAgIEZYX0VSUiBTZXRMaW5lRGFzaChGWF9GTE9BVCBkYXNoUGhhc2UsIEZYX0ZMT0FUICogZGFzaEFycmF5LCBGWF9JTlQzMiBkYXNoQ291bnQpOw0KKw0KKyAgICBGWF9FUlIgU2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSk7DQorDQorICAgIEZYX0VSUiBHZXRMaW5lSm9pbihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luICYgbGluZUpvaW4pOw0KKw0KKyAgICBGWF9FUlIgU2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiBsaW5lSm9pbik7DQorDQorICAgIEZYX0VSUiBHZXRNaXRlckxpbWl0KEZYX0ZMT0FUICYgbWl0ZXJMaW1pdCk7DQorDQorICAgIEZYX0VSUiBTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIG1pdGVyTGltaXQpOw0KKw0KKyAgICBGWF9FUlIgR2V0TGluZVdpZHRoKEZYX0ZMT0FUICYgbGluZVdpZHRoKTsNCisNCisgICAgRlhfRVJSIFNldExpbmVXaWR0aChGWF9GTE9BVCBsaW5lV2lkdGgsIEZYX0JPT0wgaXNBY3RPbkRhc2ggPSBGQUxTRSk7DQorDQorICAgIEZYX0VSUiBHZXRTdHJva2VBbGlnbm1lbnQoRlhfU3Ryb2tlQWxpZ25tZW50ICYgc3Ryb2tlQWxpZ25tZW50KTsNCisNCisgICAgRlhfRVJSIFNldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQgc3Ryb2tlQWxpZ25tZW50KTsNCisNCisNCisNCisgICAgRlhfRVJSIFNldFN0cm9rZUNvbG9yKENGWF9Db2xvciAqIGNvbG9yKTsNCisNCisgICAgRlhfRVJSIFNldEZpbGxDb2xvcihDRlhfQ29sb3IgKiBjb2xvcik7DQorDQorDQorDQorICAgIEZYX0VSUiBTdHJva2VQYXRoKENGWF9QYXRoICogcGF0aCwgQ0ZYX01hdHJpeCAqIG1hdHJpeCA9IE5VTEwpOw0KKw0KKyAgICBGWF9FUlIgRmlsbFBhdGgoQ0ZYX1BhdGggKgkgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlCSBmaWxsTW9kZSA9IEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqIG1hdHJpeAkgID0gTlVMTCk7DQorDQorICAgIEZYX0VSUiBDbGlwUGF0aChDRlhfUGF0aCAqCSBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUJIGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkcsDQorICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICogbWF0cml4CSAgPSBOVUxMKTsNCisNCisNCisNCisgICAgRlhfRVJSIERyYXdJbWFnZShDRlhfRElCU291cmNlICoJc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYgJglwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCW1hdHJpeCA9IE5VTEwpOw0KKw0KKyAgICBGWF9FUlIgU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UgKgkgIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkgIG1hdHJpeCA9IE5VTEwpOw0KKw0KKw0KKw0KKyAgICBGWF9FUlIgQ29uY2F0TWF0cml4KENGWF9NYXRyaXggKiBtYXRyaXgpOw0KKw0KKyAgICBDRlhfTWF0cml4ICogR2V0TWF0cml4KCk7DQorDQorDQorDQorICAgIEZYX0VSUiBHZXRDbGlwUmVjdChDRlhfUmVjdEYgJiByZWN0KTsNCisNCisgICAgRlhfRVJSIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiAmIHJlY3QpOw0KKw0KKyAgICBGWF9FUlIgQ2xlYXJDbGlwKCk7DQorDQorDQorDQorICAgIEZYX0VSUiBTZXRGb250KENGWF9Gb250ICogZm9udCk7DQorDQorICAgIEZYX0VSUiBTZXRGb250U2l6ZShjb25zdCBGWF9GTE9BVCBzaXplKTsNCisNCisgICAgRlhfRVJSIFNldEZvbnRIU2NhbGUoY29uc3QgRlhfRkxPQVQgc2NhbGUpOw0KKw0KKyAgICBGWF9FUlIgU2V0Q2hhclNwYWNpbmcoY29uc3QgRlhfRkxPQVQgc3BhY2luZyk7DQorDQorICAgIEZYX0VSUiBTZXRUZXh0RHJhd2luZ01vZGUoY29uc3QgRlhfSU5UMzIgbW9kZSk7DQorDQorDQorICAgIEZYX0VSUiBTaG93VGV4dChjb25zdCBDRlhfUG9pbnRGICYJICAgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCSAgIG1hdHJpeCA9IE5VTEwpOw0KKw0KKw0KKyAgICBGWF9FUlIgQ2FsY1RleHRSZWN0KENGWF9SZWN0RiAmCQkJICAgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCQkgICBpc011bHRpbGluZSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJICAgbWF0cml4CSAgID0gTlVMTCk7DQorDQorDQorDQorICAgIEZYX0VSUiBUcmFuc2ZlcihDRlhfR3JhcGhpY3MgKiBncmFwaGljcywgQ0ZYX01hdHJpeCAqIG1hdHJpeCA9IE5VTEwpOw0KKw0KKw0KKyAgICBGWF9FUlIgVHJhbnNmZXIoQ0ZYX0dyYXBoaWNzICoJICBncmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUCQkgIHNyY0xlZnQsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVAkJICBzcmNUb3AsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSAgbWF0cml4ICA9IE5VTEwpOw0KKw0KKw0KKw0KKw0KKyAgICBDRlhfUmVuZGVyRGV2aWNlICogR2V0UmVuZGVyRGV2aWNlKCk7DQorDQorICAgIEZYX0VSUglJbnZlcnNlUmVjdChjb25zdCBDRlhfUmVjdEYgJiByZWN0KTsNCisgICAgRlhfRVJSCVhvckRJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCAqIHNyY0JpdG1hcCwgY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCk7DQorICAgIEZYX0VSUglFcXZESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAgKiBzcmNCaXRtYXAsIGNvbnN0IENGWF9SZWN0RiAmIHJlY3QpOw0KK3ByaXZhdGU6DQorDQorICAgIEZYX0VSUiBSZW5kZXJEZXZpY2VTZXRMaW5lRGFzaChGWF9EYXNoU3R5bGUgZGFzaFN0eWxlKTsNCisNCisgICAgRlhfRVJSIFJlbmRlckRldmljZVN0cm9rZVBhdGgoQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4KTsNCisNCisgICAgRlhfRVJSIFJlbmRlckRldmljZUZpbGxQYXRoKENGWF9QYXRoICoJIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZQkgZmlsbE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICogbWF0cml4KTsNCisNCisNCisgICAgRlhfRVJSIFJlbmRlckRldmljZURyYXdJbWFnZShDRlhfRElCU291cmNlICoJc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYgJglwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCW1hdHJpeCk7DQorDQorICAgIEZYX0VSUiBSZW5kZXJEZXZpY2VTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqCSAgc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiAmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSAgbWF0cml4KTsNCisNCisgICAgRlhfRVJSIFJlbmRlckRldmljZVNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYgJgkgICBwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJICAgbWF0cml4KTsNCisNCisgICAgRlhfRVJSIFN0cm9rZVBhdGhXaXRoUGF0dGVybihDRlhfUGF0aCAqIHBhdGgsIENGWF9NYXRyaXggKiBtYXRyaXgpOw0KKw0KKyAgICBGWF9FUlIgU3Ryb2tlUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoICogcGF0aCwgQ0ZYX01hdHJpeCAqIG1hdHJpeCk7DQorDQorICAgIEZYX0VSUiBGaWxsUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoICoJcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUJZmlsbE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgltYXRyaXgpOw0KKw0KKyAgICBGWF9FUlIgRmlsbFBhdGhXaXRoU2hhZGluZyhDRlhfUGF0aCAqCXBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlCWZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJbWF0cml4KTsNCisgICAgRlhfRVJSIFNldERJQml0c1dpdGhNYXRyaXgoQ0ZYX0RJQlNvdXJjZSAqIHNvdXJjZSwgQ0ZYX01hdHJpeCAqIG1hdHJpeCk7DQorICAgIEZYX0VSUiBDYWxjVGV4dEluZm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB0ZXh0LCBGWF9EV09SRCAqIGNoYXJDb2RlcywgRlhURVhUX0NIQVJQT1MgKiBjaGFyUG9zLCBDRlhfUmVjdEYgJiByZWN0KTsNCisNCisNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0lOVDMyCQlfdHlwZTsNCitwcml2YXRlOg0KKyAgICBzdHJ1Y3QgVEluZm8gOiBwdWJsaWMgQ0ZYX09iamVjdCB7DQorICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEJX2dyYXBoU3RhdGU7DQorICAgICAgICBGWF9CT09MCQkJCV9pc0FudGlhbGlhc2luZzsNCisgICAgICAgIEZYX1N0cm9rZUFsaWdubWVudAlfc3Ryb2tlQWxpZ25tZW50Ow0KKyAgICAgICAgQ0ZYX01hdHJpeAkJCV9DVE07DQorICAgICAgICBGWF9CT09MCQkJCV9pc0FjdE9uRGFzaDsNCisgICAgICAgIENGWF9Db2xvciAqCQkJX3N0cm9rZUNvbG9yOw0KKyAgICAgICAgQ0ZYX0NvbG9yICoJCQlfZmlsbENvbG9yOw0KKyAgICAgICAgQ0ZYX0ZvbnQgKgkJCV9mb250Ow0KKyAgICAgICAgRlhfRkxPQVQJCQlfZm9udFNpemU7DQorICAgICAgICBGWF9GTE9BVAkJCV9mb250SFNjYWxlOw0KKyAgICAgICAgRlhfRkxPQVQJCQlfZm9udFNwYWNpbmc7DQorICAgIH0gX2luZm87DQorICAgIENGWF9SZW5kZXJEZXZpY2UgKglfcmVuZGVyRGV2aWNlOw0KKyAgICBDRlhfUHRyQXJyYXkJCV9pbmZvU3RhY2s7DQorICAgIENBR0dfR3JhcGhpY3MgKiAgICAgX2FnZ0dyYXBoaWNzOw0KKyAgICBmcmllbmQgY2xhc3MgQ0FHR19HcmFwaGljczsNCisNCit9Ow0KK2NsYXNzIENGWF9QYXRoIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKw0KKw0KKyAgICBDRlhfUGF0aCgpOw0KKw0KKyAgICBGWF9FUlIgQ3JlYXRlKCk7DQorDQorICAgIHZpcnR1YWwgfkNGWF9QYXRoKCk7DQorDQorDQorICAgIEZYX0VSUiBNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQorDQorICAgIEZYX0VSUiBMaW5lVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQorDQorICAgIEZYX0VSUiBCZXppZXJUbyhGWF9GTE9BVCBjdHJsWDEsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWTEsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWDIsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWTIsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b1gsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b1kpOw0KKw0KKyAgICBGWF9FUlIgQXJjVG8oRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUpOw0KKw0KKyAgICBGWF9FUlIgQ2xvc2UoKTsNCisNCisNCisgICAgRlhfRVJSIEFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOw0KKw0KKyAgICBGWF9FUlIgQWRkQmV6aWVyKEZYX0ZMT0FUIHN0YXJ0WCwNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydFksDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgxLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWDIsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkyLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZFgsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kWSk7DQorDQorICAgIEZYX0VSUiBBZGRSZWN0YW5nbGUoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCB3aWR0aCwgRlhfRkxPQVQgaGVpZ2h0KTsNCisNCisgICAgRlhfRVJSIEFkZEVsbGlwc2UoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCB3aWR0aCwgRlhfRkxPQVQgaGVpZ2h0KTsNCisNCisgICAgRlhfRVJSIEFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCk7DQorDQorICAgIEZYX0VSUiBBZGRBcmMoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSk7DQorDQorICAgIEZYX0VSUiBBZGRQaWUoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSk7DQorDQorICAgIEZYX0VSUiBBZGRTdWJwYXRoKENGWF9QYXRoICogcGF0aCk7DQorDQorICAgIEZYX0VSUiBDbGVhcigpOw0KKw0KKyAgICBGWF9CT09MIElzRW1wdHkoKTsNCisNCisgICAgQ0ZYX1BhdGhEYXRhICogR2V0UGF0aERhdGEoKTsNCitwcml2YXRlOg0KKyAgICBDRlhfUGF0aEdlbmVyYXRvciAqCV9nZW5lcmF0b3I7DQorfTsNCitjbGFzcyBDRlhfQ29sb3IgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorDQorICAgIENGWF9Db2xvcigpOw0KKw0KKyAgICBDRlhfQ29sb3IoY29uc3QgRlhfQVJHQiBhcmdiKTsNCisNCisNCisgICAgQ0ZYX0NvbG9yKENGWF9QYXR0ZXJuICogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiID0gMHgwKTsNCisNCisNCisgICAgQ0ZYX0NvbG9yKENGWF9TaGFkaW5nICogc2hhZGluZyk7DQorDQorDQorICAgIHZpcnR1YWwgfkNGWF9Db2xvcigpOw0KKw0KKw0KKyAgICBGWF9FUlIgU2V0KGNvbnN0IEZYX0FSR0IgYXJnYik7DQorDQorDQorICAgIEZYX0VSUiBTZXQoQ0ZYX1BhdHRlcm4gKiBwYXR0ZXJuLCBjb25zdCBGWF9BUkdCIGFyZ2IgPSAweDApOw0KKw0KKw0KKyAgICBGWF9FUlIgU2V0KENGWF9TaGFkaW5nICogc2hhZGluZyk7DQorDQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIJCQkJX3R5cGU7DQorICAgIHVuaW9uIHsNCisgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgICAgRlhfQVJHQgkJCV9hcmdiOw0KKyAgICAgICAgICAgIENGWF9QYXR0ZXJuICoJX3BhdHRlcm47DQorICAgICAgICB9Ow0KKyAgICAgICAgQ0ZYX1NoYWRpbmcgKgkJX3NoYWRpbmc7DQorICAgIH07DQorDQorICAgIGZyaWVuZCBjbGFzcyBDRlhfR3JhcGhpY3M7DQorfTsNCitjbGFzcyBDRlhfUGF0dGVybiA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisNCisNCisgICAgQ0ZYX1BhdHRlcm4oKTsNCisNCisgICAgRlhfRVJSIENyZWF0ZShDRlhfRElCaXRtYXAgKiBiaXRtYXAsDQorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgeFN0ZXAsDQorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgeVN0ZXAsDQorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSBtYXRyaXggPSBOVUxMKTsNCisNCisgICAgRlhfRVJSIENyZWF0ZShGWF9IYXRjaFN0eWxlCWhhdGNoU3R5bGUsDQorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQglmb3JlQXJnYiwNCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCWJhY2tBcmdiLA0KKyAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgltYXRyaXggPSBOVUxMKTsNCisNCisgICAgdmlydHVhbCB+Q0ZYX1BhdHRlcm4oKTsNCisNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMgkJCQlfdHlwZTsNCisgICAgQ0ZYX01hdHJpeAkJCQlfbWF0cml4Ow0KKyAgICB1bmlvbiB7DQorICAgICAgICBzdHJ1Y3Qgew0KKyAgICAgICAgICAgIENGWF9SZWN0RgkJX3JlY3Q7DQorICAgICAgICAgICAgRlhfRkxPQVQJCV94U3RlcDsNCisgICAgICAgICAgICBGWF9GTE9BVAkJX3lTdGVwOw0KKyAgICAgICAgICAgIEZYX0JPT0wJCQlfaXNDb2xvcmVkOw0KKyAgICAgICAgfTsNCisgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICoJX2JpdG1hcDsNCisgICAgICAgICAgICBGWF9GTE9BVAkJX3gxU3RlcDsNCisgICAgICAgICAgICBGWF9GTE9BVAkJX3kxU3RlcDsNCisgICAgICAgIH07DQorICAgICAgICBzdHJ1Y3Qgew0KKyAgICAgICAgICAgIEZYX0hhdGNoU3R5bGUJX2hhdGNoU3R5bGU7DQorICAgICAgICAgICAgRlhfQVJHQgkJCV9mb3JlQXJnYjsNCisgICAgICAgICAgICBGWF9BUkdCCQkJX2JhY2tBcmdiOw0KKyAgICAgICAgfTsNCisgICAgfTsNCisgICAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsNCit9Ow0KK2NsYXNzIENGWF9TaGFkaW5nIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKw0KKw0KKyAgICBDRlhfU2hhZGluZygpOw0KKw0KKyAgICBGWF9FUlIgQ3JlYXRlQXhpYWwoY29uc3QgQ0ZYX1BvaW50RiAmIGJlZ2luUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJICBpc0V4dGVuZGVkQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJICBpc0V4dGVuZGVkRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQgkgIGJlZ2luQXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IJICBlbmRBcmdiKTsNCisNCisgICAgRlhfRVJSIENyZWF0ZVJhZGlhbChjb25zdCBDRlhfUG9pbnRGICYgYmVnaW5Qb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQJICAgYmVnaW5SYWRpdXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQJICAgZW5kUmFkaXVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJCQkgICBpc0V4dGVuZGVkQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCSAgIGlzRXh0ZW5kZWRFbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQgkgICBiZWdpbkFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQgkgICBlbmRBcmdiKTsNCisNCisgICAgdmlydHVhbCB+Q0ZYX1NoYWRpbmcoKTsNCisNCitwcml2YXRlOg0KKyAgICBGWF9FUlIgSW5pdEFyZ2JBcnJheSgpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyCV90eXBlOw0KKyAgICBDRlhfUG9pbnRGCV9iZWdpblBvaW50Ow0KKyAgICBDRlhfUG9pbnRGCV9lbmRQb2ludDsNCisgICAgRlhfRkxPQVQJX2JlZ2luUmFkaXVzOw0KKyAgICBGWF9GTE9BVAlfZW5kUmFkaXVzOw0KKyAgICBGWF9CT09MCQlfaXNFeHRlbmRlZEJlZ2luOw0KKyAgICBGWF9CT09MCQlfaXNFeHRlbmRlZEVuZDsNCisgICAgRlhfQVJHQgkJX2JlZ2luQXJnYjsNCisgICAgRlhfQVJHQgkJX2VuZEFyZ2I7DQorICAgIEZYX0FSR0IJCV9hcmdiQXJyYXlbRlhfU0hBRElOR19TdGVwc107DQorICAgIGZyaWVuZCBjbGFzcyBDRlhfR3JhcGhpY3M7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGpzZS9meGpzZS5oIGIveGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQ0NDM0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaApAQCAtMCwwICsxLDEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEpTRV9IXw0KKyNkZWZpbmUgX0ZYSlNFX0hfDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorI2RlZmluZSBGWEpTRV9ERUZJTkVJTkhFUklUSEFORExFKG5hbWUsIHN1YnR5cGVuYW1lKSB0eXBlZGVmIHN0cnVjdCBfIyNzdWJ0eXBlbmFtZSA6IHB1YmxpYyBfIyNuYW1lIHt9ICogc3VidHlwZW5hbWU7DQorI2Vsc2UNCisjZGVmaW5lIEZYSlNFX0RFRklORUlOSEVSSVRIQU5ETEUobmFtZSwgc3VidHlwZW5hbWUpIHR5cGVkZWYgbmFtZSBzdWJ0eXBlbmFtZTsNCisjZW5kaWYNCitGWF9ERUZJTkVIQU5ETEUoRlhKU0VfSFJVTlRJTUUpOw0KK0ZYX0RFRklORUhBTkRMRShGWEpTRV9IQ09OVEVYVCk7DQorRlhfREVGSU5FSEFORExFKEZYSlNFX0hDTEFTUyk7DQorRlhfREVGSU5FSEFORExFKEZYSlNFX0hWQUxVRSk7DQorRlhKU0VfREVGSU5FSU5IRVJJVEhBTkRMRShGWEpTRV9IVkFMVUUsIEZYSlNFX0hPQkpFQ1QpOw0KK3R5cGVkZWYgZG91YmxlIEZYSlNFX0RPVUJMRTsNCit2b2lkIEZYSlNFX0luaXRpYWxpemUoKTsNCit2b2lkIEZYSlNFX0ZpbmFsaXplKCk7DQorRlhKU0VfSFJVTlRJTUUJRlhKU0VfUnVudGltZV9DcmVhdGUoKTsNCit2b2lkCQkJRlhKU0VfUnVudGltZV9SZWxlYXNlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKTsNCit0eXBlZGVmIHN0cnVjdCBfRlhKU0VfQ0xBU1MgRlhKU0VfQ0xBU1M7DQorRlhKU0VfSENPTlRFWFQJRlhKU0VfQ29udGV4dF9DcmVhdGUJKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lLCBjb25zdCBGWEpTRV9DTEFTUyogbHBHbG9iYWxDbGFzcyA9IE5VTEwsIEZYX0xQVk9JRCBscEdsb2JhbE9iamVjdCA9IE5VTEwpOw0KK3ZvaWQJCQlGWEpTRV9Db250ZXh0X1JlbGVhc2UJKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KTsNCitGWEpTRV9IVkFMVUUJRlhKU0VfQ29udGV4dF9HZXRHbG9iYWxPYmplY3QoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpOw0KK0ZYSlNFX0hSVU5USU1FICBGWEpTRV9Db250ZXh0X0dldFJ1bnRpbWUoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpOw0KK2VudW0gRlhKU0VfQ29tcGF0aWJsZU1vZGVGbGFncyB7DQorICAgIEZYSlNFX0NPTVBBVElCTEVNT0RFRkxBR19DT05TVFJVQ1RPUkVYVFJBTUVUSE9EUyA9ICgxIDw8IDApLA0KKyAgICBGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdDT1VOVCA9IDEsDQorfTsNCit2b2lkCQkJRlhKU0VfQ29udGV4dF9FbmFibGVDb21wYXRpYmxlTW9kZShGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgRlhfRFdPUkQgZHdDb21wYXRpYmxlRmxhZ3MpOw0KK2NsYXNzIENGWEpTRV9Bcmd1bWVudHMNCit7DQorcHVibGljOg0KKyAgICBGWEpTRV9IUlVOVElNRQlHZXRSdW50aW1lKCkgY29uc3Q7DQorICAgIEZYX0lOVDMyCQlHZXRMZW5ndGgoKSBjb25zdDsNCisgICAgRlhKU0VfSFZBTFVFCUdldFZhbHVlKEZYX0lOVDMyIGluZGV4KSBjb25zdDsNCisgICAgRlhfQk9PTAkJCUdldEJvb2xlYW4oRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMgkJR2V0SW50MzIoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICBGWF9GTE9BVAkJR2V0RmxvYXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICBDRlhfQnl0ZVN0cmluZwlHZXRVVEY4U3RyaW5nKEZYX0lOVDMyIGluZGV4KSBjb25zdDsNCisgICAgRlhfTFBWT0lECQlHZXRPYmplY3QoRlhfSU5UMzIgaW5kZXgsIEZYSlNFX0hDTEFTUyBoQ2xhc3MgPSBOVUxMKSBjb25zdDsNCisgICAgRlhKU0VfSFZBTFVFCUdldFJldHVyblZhbHVlKCk7DQorfTsNCit0eXBlZGVmIHZvaWQJKCpGWEpTRV9GdW5jQ2FsbGJhY2spCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KK3R5cGVkZWYgdm9pZAkoKkZYSlNFX1Byb3BBY2Nlc3NvcikJKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCit0eXBlZGVmIEZYX0lOVDMyKCpGWEpTRV9Qcm9wVHlwZUdldHRlcikJKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWF9CT09MIGJRdWVyeUluKTsNCit0eXBlZGVmIEZYX0JPT0wgKCpGWEpTRV9Qcm9wRGVsZXRlcikJKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lKTsNCit0eXBlZGVmIHN0cnVjdCBfRlhKU0VfRlVOQ1RJT04gew0KKyAgICBGWF9MUENTVFIJCQkJbmFtZTsNCisgICAgRlhKU0VfRnVuY0NhbGxiYWNrCQljYWxsYmFja1Byb2M7DQorfSBGWEpTRV9GVU5DVElPTjsNCisjZGVmaW5lIEZYSlNFX0RFRl9GVU5DVElPTihmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ2FsbGJhY2spIHtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ2FsbGJhY2t9DQordm9pZAlGWEpTRV9EZWZpbmVGdW5jdGlvbnMoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIGNvbnN0IEZYSlNFX0ZVTkNUSU9OKiBscEZ1bmN0aW9ucywgaW50IG5OdW0pOw0KK3R5cGVkZWYgc3RydWN0IF9GWEpTRV9QUk9QRVJUWSB7DQorICAgIEZYX0xQQ1NUUgkJCQluYW1lOw0KKyAgICBGWEpTRV9Qcm9wQWNjZXNzb3IJCWdldFByb2M7DQorICAgIEZYSlNFX1Byb3BBY2Nlc3NvcgkJc2V0UHJvYzsNCit9IEZYSlNFX1BST1BFUlRZOw0KK2VudW0gRlhKU0VfQ2xhc3NQcm9wVHlwZXMgew0KKyAgICBGWEpTRV9DbGFzc1Byb3BUeXBlX05vbmUsDQorICAgIEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHksDQorICAgIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRlhKU0VfQ0xBU1Mgew0KKyAgICBGWF9MUENTVFIJCQkJbmFtZTsNCisgICAgRlhKU0VfRnVuY0NhbGxiYWNrCQljb25zdHJ1Y3RvcjsNCisgICAgRlhKU0VfUFJPUEVSVFkqCQkJcHJvcGVydGllczsNCisgICAgRlhKU0VfRlVOQ1RJT04qCQkJbWV0aG9kczsNCisgICAgRlhfSU5UMzIJCQkJcHJvcE51bTsNCisgICAgRlhfSU5UMzIJCQkJbWV0aE51bTsNCisgICAgRlhKU0VfUHJvcFR5cGVHZXR0ZXIJZHluUHJvcFR5cGVHZXR0ZXI7DQorICAgIEZYSlNFX1Byb3BBY2Nlc3NvcgkJZHluUHJvcEdldHRlcjsNCisgICAgRlhKU0VfUHJvcEFjY2Vzc29yCQlkeW5Qcm9wU2V0dGVyOw0KKyAgICBGWEpTRV9Qcm9wRGVsZXRlcgkJZHluUHJvcERlbGV0ZXI7DQorICAgIEZYSlNFX0Z1bmNDYWxsYmFjawkJZHluTWV0aG9kQ2FsbDsNCit9IEZYSlNFX0NMQVNTOw0KK0ZYSlNFX0hDTEFTUwlGWEpTRV9EZWZpbmVDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MpOw0KK0ZYSlNFX0hDTEFTUwlGWEpTRV9HZXRDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgRlhfQlNUUiBzek5hbWUpOw0KK0ZYSlNFX0hWQUxVRQlGWEpTRV9WYWx1ZV9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9SZWxlYXNlKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYSlNFX0hSVU5USU1FCUZYSlNFX1ZhbHVlX0dldFJ1bnRpbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzTnVsbAkJCShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MCQkJRlhKU0VfVmFsdWVfSXNCb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZwkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzTnVtYmVyCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzSW50ZWdlcgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9Jc09iamVjdAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9Jc0FycmF5CQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9Jc0Z1bmN0aW9uCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzRGF0ZQkJCShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MCQkJRlhKU0VfVmFsdWVfVG9Cb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfRkxPQVQJCUZYSlNFX1ZhbHVlX1RvRmxvYXQJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhKU0VfRE9VQkxFCUZYSlNFX1ZhbHVlX1RvRG91YmxlCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfSU5UMzIJCUZYSlNFX1ZhbHVlX1RvSW50ZWdlcgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIENGWF9CeXRlU3RyaW5nJiBzelN0ck91dHB1dCk7DQorRlhfTFBWT0lECQlGWEpTRV9WYWx1ZV9Ub09iamVjdAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXROdWxsCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRCb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTAkgICBiQm9vbGVhbik7DQordm9pZAkJCUZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JTVFIJICAgc3pTdHJpbmcpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfSU5UMzIgICAgIG5JbnRlZ2VyKTsNCit2b2lkCQkJRlhKU0VfVmFsdWVfU2V0RmxvYXQJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9GTE9BVCAgICAgZkZsb2F0KTsNCit2b2lkCQkJRlhKU0VfVmFsdWVfU2V0RG91YmxlCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRPYmplY3QJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9MUFZPSUQgbHBPYmplY3QsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRBcnJheQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX1VJTlQzMiB1VmFsdWVDb3VudCwgRlhKU0VfSFZBTFVFKiByZ1ZhbHVlcyk7DQordm9pZAkJCUZYSlNFX1ZhbHVlX1NldERhdGUJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpOw0KK3ZvaWQJCQlGWEpTRV9WYWx1ZV9TZXQJCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hWQUxVRSBoT3JpZ2luYWxWYWx1ZSk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CU1RSCXN6UHJvcE5hbWUsCUZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCitGWF9CT09MCQkJRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JTVFIJc3pQcm9wTmFtZSwJRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX1VJTlQzMgl1UHJvcElkeCwJRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9TZXRPYmplY3RQcm9wQnlJZHgJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX1VJTlQzMgl1UHJvcElkeCwJRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9EZWxldGVPYmplY3RQcm9wCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CU1RSCXN6UHJvcE5hbWUpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9PYmplY3RIYXNPd25Qcm9wCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CU1RSCXN6UHJvcE5hbWUsIEZYX0JPT0wJYlVzZVR5cGVHZXR0ZXIpOw0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9TZXRPYmplY3RPd25Qcm9wCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CU1RSCXN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCitGWF9CT09MCQkJRlhKU0VfVmFsdWVfQ2FsbEZ1bmN0aW9uCQkoRlhKU0VfSFZBTFVFIGhGdW5jdGlvbiwgRlhKU0VfSFZBTFVFIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWF9VSU5UMzIgbkFyZ0NvdW50LCBGWEpTRV9IVkFMVUUqIGxwQXJncyk7DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX1NldEZ1bmN0aW9uQmluZAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfSFZBTFVFIGhPbGRGdW5jdGlvbiwgRlhKU0VfSFZBTFVFIGhOZXdUaGlzKTsNCitGWF9CT09MCQkJRlhKU0VfRXhlY3V0ZVNjcmlwdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgRlhfTFBDU1RSIHN6U2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWEpTRV9IVkFMVUUgaE5ld1RoaXNPYmplY3QgPSBOVUxMKTsNCit2b2lkCQkJRlhKU0VfVGhyb3dNZXNzYWdlKEZYX0JTVFIgdXRmOE5hbWUsIEZYX0JTVFIgdXRmOE1lc3NhZ2UpOw0KK0ZYX0JPT0wJCQlGWEpTRV9SZXR1cm5WYWx1ZV9HZXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIENGWF9CeXRlU3RyaW5nJiB1dGY4TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIHV0ZjhNZXNzYWdlKTsNCitGWF9CT09MCQkJRlhKU0VfUmV0dXJuVmFsdWVfR2V0TGluZUluZm8oRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgRlhfSU5UMzImIG5MaW5lLCBGWF9JTlQzMiYgbkNvbCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGUuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyYzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREUNCisjZGVmaW5lIF9GREUNCisjaW5jbHVkZSAiZmRlX21lbS5oIg0KKyNpbmNsdWRlICJmZGVfeG1sLmgiDQorI2luY2x1ZGUgImZkZV9pbWcuaCINCisjaW5jbHVkZSAiZmRlX2Jycy5oIg0KKyNpbmNsdWRlICJmZGVfcGVuLmgiDQorI2luY2x1ZGUgImZkZV9wdGguaCINCisjaW5jbHVkZSAiZmRlX3R0by5oIg0KKyNpbmNsdWRlICJmZGVfcHNyLmgiDQorI2luY2x1ZGUgImZkZV9jc3MuaCINCisjaW5jbHVkZSAiZmRlX3Jkdi5oIg0KKyNpbmNsdWRlICJmZGVfcmRyLmgiDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfYnJzLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9icnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE0ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfYnJzLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0JSVVNIDQorI2RlZmluZSBfRkRFX0JSVVNIDQorY2xhc3MgSUZERV9JbWFnZTsNCitjbGFzcyBJRkRFX1BhdGg7DQorY2xhc3MgSUZERV9CcnVzaDsNCitjbGFzcyBJRkRFX1NvbGlkQnJ1c2g7DQorY2xhc3MgSUZERV9IYXRjaEJydXNoOw0KK2NsYXNzIElGREVfVGV4dHVyZUJydXNoOw0KK2NsYXNzIElGREVfTGluZWFyR3JhZGllbnRCcnVzaDsNCisjZGVmaW5lIEZERV9CUlVTSFRZUEVfVW5rbm93bgkJCS0xDQorI2RlZmluZSBGREVfQlJVU0hUWVBFX1NvbGlkCQkJCTANCisjZGVmaW5lIEZERV9CUlVTSFRZUEVfSGF0Y2gJCQkJMQ0KKyNkZWZpbmUgRkRFX0JSVVNIVFlQRV9UZXh0dXJlCQkJMg0KKyNkZWZpbmUgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudAkzDQorI2RlZmluZSBGREVfQlJVU0hUWVBFX01BWAkJCQkzDQorI2RlZmluZSBGREVfV1JBUE1PREVfVGlsZQkJCTANCisjZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFgJCTENCisjZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFkJCTINCisjZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFhZCQkzDQorI2RlZmluZSBGREVfV1JBUE1PREVfQ2xhbXAJCQk0DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9HUkFESUVOVENPTE9SIHsNCisgICAgRlhfRkxPQVQJcG9zOw0KKyAgICBGWF9BUkdCCQljb2xvcjsNCit9IEZERV9HUkFESUVOVENPTE9SLCAqIEZERV9MUEdSQURJRU5UQ09MT1I7DQordHlwZWRlZiBGREVfR1JBRElFTlRDT0xPUiBjb25zdCAqCQkJCUZERV9MUENHUkFESUVOVENPTE9SOw0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0dSQURJRU5UQ09MT1I+CUNGREVfR3JhZGllbnRDb2xvcnM7DQorY2xhc3MgSUZERV9CcnVzaA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX0JydXNoKgkJCUNyZWF0ZShGWF9JTlQzMiBpVHlwZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0VHlwZSgpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElGREVfU29saWRCcnVzaCA6IHB1YmxpYyBJRkRFX0JydXNoDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgPSAwOw0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmCUdldE1hdHJpeCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0TWF0cml4KCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJVHJhbnNsYXRlTWF0cml4KEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkgPSAwOw0KK307DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Ib3Jpem9udGFsCQkJCTANCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1ZlcnRpY2FsCQkJCQkxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWwJCQkyDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9CYWNrd2FyZERpYWdvbmFsCQkJMw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfQ3Jvc3MJCQkJCTQNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RpYWdvbmFsQ3Jvc3MJCQk1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8wNVBlcmNlbnQJCQkJNg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMTBQZXJjZW50CQkJCTcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzIwUGVyY2VudAkJCQk4DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8yNVBlcmNlbnQJCQkJOQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMzBQZXJjZW50CQkJCTEwDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV80MFBlcmNlbnQJCQkJMTENCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzUwUGVyY2VudAkJCQkxMg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfNjBQZXJjZW50CQkJCTEzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV83MFBlcmNlbnQJCQkJMTQNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzc1UGVyY2VudAkJCQkxNQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfODBQZXJjZW50CQkJCTE2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV85MFBlcmNlbnQJCQkJMTcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xpZ2h0RG93bndhcmREaWFnb25hbAkxOA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGlnaHRVcHdhcmREaWFnb25hbAkJMTkNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RhcmtEb3dud2FyZERpYWdvbmFsCQkyMA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya1Vwd2FyZERpYWdvbmFsCQkyMQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfV2lkZURvd253YXJkRGlhZ29uYWwJCTIyDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9XaWRlVXB3YXJkRGlhZ29uYWwJCTIzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MaWdodFZlcnRpY2FsCQkJMjQNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xpZ2h0SG9yaXpvbnRhbAkJCTI1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9OYXJyb3dWZXJ0aWNhbAkJCTI2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9OYXJyb3dIb3Jpem9udGFsCQkJMjcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RhcmtWZXJ0aWNhbAkJCQkyOA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya0hvcml6b250YWwJCQkyOQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkRG93bndhcmREaWFnb25hbAkzMA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkVXB3YXJkRGlhZ29uYWwJCTMxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXNoZWRIb3Jpem9udGFsCQkJMzINCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0Rhc2hlZFZlcnRpY2FsCQkJMzMNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsQ29uZmV0dGkJCQkzNA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGFyZ2VDb25mZXR0aQkJCTM1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9aaWdaYWcJCQkJCTM2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9XYXZlCQkJCQkJMzcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RpYWdvbmFsQnJpY2sJCQkzOA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfSG9yaXpvbnRhbEJyaWNrCQkJMzkNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1dlYXZlCQkJCQk0MA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfUGxhaWQJCQkJCTQxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EaXZvdAkJCQkJNDINCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RvdHRlZEdyaWQJCQkJNDMNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RvdHRlZERpYW1vbmQJCQk0NA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU2hpbmdsZQkJCQkJNDUNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1RyZWxsaXMJCQkJCTQ2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TcGhlcmUJCQkJCTQ3DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TbWFsbEdyaWQJCQkJNDgNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsQ2hlY2tlckJvYXJkCQk0OQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGFyZ2VDaGVja2VyQm9hcmQJCTUwDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9PdXRsaW5lZERpYW1vbmQJCQk1MQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU29saWREaWFtb25kCQkJCTUyDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Ub3RhbAkJCQkJNTMNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xhcmdlR3JpZAkJCQlGREVfSEFUQ0hTVFlMRV9Dcm9zcw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTWluCQkJCQkJRkRFX0hBVENIU1RZTEVfSG9yaXpvbnRhbA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTWF4CQkJCQkJKEZERV9IQVRDSFNUWUxFX1RvdGFsIC0gMSkNCitjbGFzcyBJRkRFX0hhdGNoQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCUdldENvbG9yKEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDb2xvcihGWF9BUkdCIGNvbG9yLCBGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SGF0Y2hTdHlsZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0SGF0Y2hTdHlsZShGWF9JTlQzMiBpSGF0Y2hTdHlsZSkgPSAwOw0KK307DQorY2xhc3MgSUZERV9UZXh0dXJlQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgSUZERV9JbWFnZSoJCQlHZXRJbWFnZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldEltYWdlKElGREVfSW1hZ2UgKnBJbWFnZSwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFdyYXBNb2RlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0V3JhcE1vZGUoRlhfSU5UMzIgaVdyYXBNb2RlKSA9IDA7DQorfTsNCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfSG9yaXpvbnRhbAkJCTANCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfVmVydGljYWwJCQkJMQ0KKyNkZWZpbmUgRkRFX0xJTkVBUkdSQURJRU5UTU9ERV9Gb3J3YXJkRGlhZ29uYWwJCTINCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfQmFja3dhcmREaWFnb25hbAkJMw0KK2NsYXNzIElGREVfTGluZWFyR3JhZGllbnRCcnVzaCA6IHB1YmxpYyBJRkRFX0JydXNoDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCQkJCUdldExpbmVhclBvaW50cyhDRlhfUG9pbnRGICZzdGFydGluZ1BvaW50LCBDRlhfUG9pbnRGICZlbmRpbmdQb2ludCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TGluZWFyUG9pbnRzKGNvbnN0IENGWF9Qb2ludEYgJnN0YXJ0aW5nUG9pbnQsIGNvbnN0IENGWF9Qb2ludEYgJmVuZGluZ1BvaW50KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRMaW5lYXJDb2xvcnMoRlhfQVJHQiAmc3RhcnRpbmdDb2xvciwgRlhfQVJHQiAmZW5kaW5nQ29sb3IpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldExpbmVhckNvbG9ycyhjb25zdCBGWF9BUkdCICZzdGFydGluZ0NvbG9yLCBjb25zdCBGWF9BUkdCICZlbmRpbmdDb2xvcikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJQ291bnRHcmFkaWVudENvbG9ycygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUdldEdyYWRpZW50Q29sb3JzKENGREVfR3JhZGllbnRDb2xvcnMgJmNvbG9ycykgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0R3JhZGllbnRDb2xvcnMoY29uc3QgQ0ZERV9HcmFkaWVudENvbG9ycyAmY29sb3JzKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRXcmFwTW9kZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldFdyYXBNb2RlKEZYX0lOVDMyIGlXcmFwTW9kZSkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfY3NzLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODcwYzhkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfY3NzLmgKQEAgLTAsMCArMSwxMDgyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9DU1MNCisjZGVmaW5lIF9GREVfQ1NTDQorY2xhc3MgSUZERV9IVE1Ob3RpZnk7DQorY2xhc3MgSUZERV9DU1NWYWx1ZTsNCitjbGFzcyBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlOw0KK2NsYXNzIElGREVfQ1NTVmFsdWVMaXN0Ow0KK2NsYXNzIElGREVfQ1NTRGVjbGFyYXRpb247DQorY2xhc3MgSUZERV9DU1NTZWxlY3RvcjsNCitjbGFzcyBJRkRFX0NTU1J1bGU7DQorY2xhc3MgSUZERV9DU1NTdHlsZVJ1bGU7DQorY2xhc3MgSUZERV9DU1NNZWRpYVJ1bGU7DQorY2xhc3MgSUZERV9DU1NGb250RmFjZVJ1bGU7DQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0Ow0KK2NsYXNzIElGREVfQ1NTU3R5bGVTaGVldENhY2hlOw0KK2NsYXNzIElGREVfQ1NTU3ludGF4UGFyc2VyOw0KK2NsYXNzIElGREVfQ1NTUnVieVN0eWxlOw0KK2NsYXNzIElGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZTsNCitjbGFzcyBJRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZTsNCitjbGFzcyBJRkRFX0NTU0ZvbnRTdHlsZTsNCitjbGFzcyBJRkRFX0NTU0JvdW5kYXJ5U3R5bGU7DQorY2xhc3MgSUZERV9DU1NQb3NpdGlvblN0eWxlOw0KK2NsYXNzIElGREVfQ1NTUGFyYWdyYXBoU3R5bGU7DQorY2xhc3MgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGU7DQorY2xhc3MgSUZERV9DU1NMaXN0U3R5bGU7DQorY2xhc3MgSUZERV9DU1NUYWJsZVN0eWxlOw0KK2NsYXNzIElGREVfQ1NTVmlzdWFsU3R5bGU7DQorY2xhc3MgSUZERV9DU1NDb21wdXRlZFN0eWxlOw0KK2NsYXNzIElGREVfQ1NTVGFnUHJvdmlkZXI7DQorY2xhc3MgSUZERV9DU1NBY2NlbGVyYXRvcjsNCitjbGFzcyBJRkRFX0NTU1N0eWxlU2VsZWN0b3I7DQorY2xhc3MgSUZERV9DU1NDb3VudGVyQ29udGV4dDsNCitjbGFzcyBJRkRFX0NTU0NvdW50ZXJNYW5hZ2VyOw0KK2NsYXNzIElGREVfQ1NTUXVvdGVDb250ZXh0Ow0KK2NsYXNzIElGREVfQ1NTQ29udGVudENvbnRleHQ7DQorY2xhc3MgSUZERV9DU1NNdWx0aUNvbHVtbkNvbnRleHQ7DQorY2xhc3MgSUZERV9DU1NGbG9hdENvbnRleHQ7DQorZW51bSBGREVfQ1NTVkFMVUVUWVBFIHsNCisgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUJCT0gMSwNCisgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0CQkJPSAyLA0KKyAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZCwNCit9Ow0KK2VudW0gRkRFX0NTU1BSSU1JVElWRVRZUEUgew0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9Vbmtub3duCT0gMCwNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyCQk9IDEsDQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQJPSAyLA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FTVMJCT0gMywNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfRVhTCQk9IDQsDQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1BYCQkJPSA1LA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9DTQkJCT0gNiwNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfTU0JCQk9IDcsDQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX0lOCQkJPSA4LA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QVAkJCT0gOSwNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMJCQk9IDEwLA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcJCT0gMTksDQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSQkJPSAyMCwNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCCQk9IDI1LA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtLA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbiwNCit9Ow0KK2VudW0gRkRFX0NTU1BST1BFUlRZVkFMVUUgew0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXIsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyTGF0aW4sDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyY2FzZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJHcmVlaywNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2VzYW1lLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Od1Jlc2l6ZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfV1Jlc2l6ZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0x0ciwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdGwsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N1YiwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WaXNpYmxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaWxsZWQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N3UmVzaXplLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob1JlcGVhdCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVmYXVsdCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZGdlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbFRiLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlTGV0dGVyLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGVDaXJjbGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnksDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NvbGxhcHNlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F2b2lkLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YU21hbGwsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaW4sDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGwsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05lUmVzaXplLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0NvbnRlbnQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VSZXNpemUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b20sDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VuZGVybGluZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2prSWRlb2dyYXBoaWMsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NlUmVzaXplLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Tb2xpZCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2VHcm91cCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3BlblF1b3RlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaWdodGVyLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlclJvbWFuLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdHJpY3QsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ2FwdGlvbiwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfT2JsaXF1ZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG9vc2UsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hlYnJldywNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VtYmVkLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvd0dyb3VwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbiwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhdGljLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWxMZWFkaW5nWmVybywNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcFdvcmRzLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYUlyb2hhLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdXBlciwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUhlYWRlckdyb3VwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNpZGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4TGFyZ2UsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyaWFuZ2xlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5VGV4dEdyb3VwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DaXJjbGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpcmFnYW5hLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRYLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRZLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Nb3ZlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaXJhZ2FuYUlyb2hhLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUZvb3Rlckdyb3VwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CYXNlbGluZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2VwYXJhdGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FybWVuaWFuLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZWxhdGl2ZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpY2ssDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0p1c3RpZnksDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01pZGRsZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWx3YXlzLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlU3BhY2UsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVFZGdlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmVXcmFwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0sDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05SZXNpemUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpc3RJdGVtLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TaG93LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DdXJyZW50Y29sb3IsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ2xvc2VRdW90ZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxMciwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxSbCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUG9pbnRlciwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhTbWFsbCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90aCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxDYXBzLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWZ0ZXIsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWwsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzYywNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfR2VvcmdpYW4sDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3ZlcmxpbmUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1dhaXQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JyZWFrQWxsLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckFscGhhLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DYXBpdGFsaXplLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3dyYXAsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRCb3R0b20sDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vT3BlblF1b3RlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Hcm9vdmUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Byb2dyZXNzLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZXIsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Nsb3NlUXVvdGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ2VsbCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlTGluZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWJzb2x1dGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZVRhYmxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CaWRpT3ZlcnJpZGUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZUJsb2NrLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNldCwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3Jvc3NoYWlyLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWxwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2UsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NSZXNpemUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbGluaywNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmxvY2ssDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXJ0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbkdyb3VwLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWMsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVUaHJvdWdoLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwQWxsLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckFscGhhLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdW5JbiwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YTGFyZ2UsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CZWZvcmUsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRUb3AsDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Rpc3BsYXksDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01BWA0KK307DQorY2xhc3MgSUZERV9DU1NWYWx1ZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRQkJR2V0VHlwZSgpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgOiBwdWJsaWMgSUZERV9DU1NWYWx1ZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRQkJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NQUklNSVRJVkVUWVBFCUdldFByaW1pdGl2ZVR5cGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0UkdCQ29sb3IoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0RmxvYXQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBDV1NUUgkJCQlHZXRTdHJpbmcoRlhfSU5UMzIgJmlMZW5ndGgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTUFJPUEVSVFlWQUxVRQlHZXRFbnVtKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0xQQ1dTVFIJCQkJR2V0RnVuY05hbWUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRBcmdzKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0QXJncyhGWF9JTlQzMiBpbmRleCkgY29uc3QgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NWYWx1ZUxpc3QgOiBwdWJsaWMgSUZERV9DU1NWYWx1ZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRQkJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGREVfQ1NTVkFMVUVUWVBFX0xpc3Q7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudFZhbHVlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKgkJCUdldFZhbHVlKEZYX0lOVDMyIGluZGV4KSBjb25zdCA9IDA7DQorfTsNCitlbnVtIEZERV9DU1NQUk9QRVJUWSB7DQorICAgIEZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVXaWR0aCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQ291bnRlclJlc2V0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQ29udGVudCwNCisgICAgRkRFX0NTU1BST1BFUlRZX1J1YnlQb3NpdGlvbiwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRDb2xvciwNCisgICAgRkRFX0NTU1BST1BFUlRZX1dpZHRoLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfU3JjLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfVG9wLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3IsDQorICAgIEZERV9DU1NQUk9QRVJUWV9XaWRvd3MsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvciwNCisgICAgRkRFX0NTU1BST1BFUlRZX1RleHRJbmRlbnQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9SaWdodCwNCisgICAgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5XaWR0aCwNCisgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXIsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3AsDQorICAgIEZERV9DU1NQUk9QRVJUWV9SdWJ5T3ZlcmhhbmcsDQorICAgIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtCZWZvcmUsDQorICAgIEZERV9DU1NQUk9QRVJUWV9NYXhIZWlnaHQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9NaW5XaWR0aCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvdHRvbSwNCisgICAgRkRFX0NTU1BST1BFUlRZX1F1b3RlcywNCisgICAgRkRFX0NTU1BST1BFUlRZX01heFdpZHRoLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlSW1hZ2UsDQorICAgIEZERV9DU1NQUk9QRVJUWV9XaGl0ZVNwYWNlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZSwNCisgICAgRkRFX0NTU1BST1BFUlRZX1dvcmRCcmVhaywNCisgICAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WCwNCisgICAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0N1cnNvciwNCisgICAgRkRFX0NTU1BST1BFUlRZX1J1YnlBbGlnbiwNCisgICAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVDb2xvciwNCisgICAgRkRFX0NTU1BST1BFUlRZX0ZvbnRXZWlnaHQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfTWluSGVpZ2h0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQ29sb3IsDQorICAgIEZERV9DU1NQUk9QRVJUWV9MZXR0ZXJTcGFjaW5nLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfRW1wdHlDZWxscywNCisgICAgRkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbiwNCisgICAgRkRFX0NTU1BST1BFUlRZX1J1YnlTcGFuLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfUG9zaXRpb24sDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sbGFwc2UsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Vbmljb2RlQmlkaSwNCisgICAgRkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ24sDQorICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1ucywNCisgICAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfVGFibGVMYXlvdXQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRQb3NpdGlvbiwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlcldpZHRoLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsDQorICAgIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtJbnNpZGUsDQorICAgIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXMsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkdhcCwNCisgICAgRkRFX0NTU1BST1BFUlRZX09ycGhhbnMsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQWZ0ZXIsDQorICAgIEZERV9DU1NQUk9QRVJUWV9DYXB0aW9uU2lkZSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclNwYWNpbmcsDQorICAgIEZERV9DU1NQUk9QRVJUWV9UZXh0VHJhbnNmb3JtLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfRm9udCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0xpbmVIZWlnaHQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0Zsb2F0LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFdpZHRoLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfRGlzcGxheSwNCisgICAgRkRFX0NTU1BST1BFUlRZX0NsZWFyLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfVGV4dENvbWJpbmUsDQorICAgIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVQb3NpdGlvbiwNCisgICAgRkRFX0NTU1BST1BFUlRZX1Zpc2liaWxpdHksDQorICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nQm90dG9tLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEF0dGFjaG1lbnQsDQorICAgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kSW1hZ2UsDQorICAgIEZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWssDQorICAgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wV2lkdGgsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Xb3JkU3BhY2luZywNCisgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsDQorICAgIEZERV9DU1NQUk9QRVJUWV9Db3VudGVySW5jcmVtZW50LA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfTGVmdCwNCisgICAgRkRFX0NTU1BST1BFUlRZX1RleHREZWNvcmF0aW9uLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZywNCisgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbSwNCisgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpblRvcCwNCisgICAgRkRFX0NTU1BST1BFUlRZX0RpcmVjdGlvbiwNCisgICAgRkRFX0NTU1BST1BFUlRZX01BWA0KK307DQorY2xhc3MgSUZERV9DU1NEZWNsYXJhdGlvbg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSoJCQlHZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBGWF9CT09MICZiSW1wb3J0YW50KSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlHZXROZXh0UHJvcGVydHkoRlhfUE9TSVRJT04gJnBvcywgRkRFX0NTU1BST1BFUlRZICZlUHJvcGVydHksIElGREVfQ1NTVmFsdWUgKiZwVmFsdWUsIEZYX0JPT0wgJmJJbXBvcnRhbnQpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9QT1NJVElPTgkJCQlHZXRTdGFydEN1c3RvbSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlHZXROZXh0Q3VzdG9tKEZYX1BPU0lUSU9OICZwb3MsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSBjb25zdCA9IDA7DQorfTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPElGREVfQ1NTRGVjbGFyYXRpb24qPiBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXk7DQorZW51bSBGREVfQ1NTUEVSU1VETyB7DQorICAgIEZERV9DU1NQRVJTVURPX0FmdGVyLA0KKyAgICBGREVfQ1NTUEVSU1VET19CZWZvcmUsDQorICAgIEZERV9DU1NQRVJTVURPX05PTkUNCit9Ow0KK2VudW0gRkRFX0NTU1NFTEVDVE9SVFlQRSB7DQorICAgIEZERV9DU1NTRUxFQ1RPUlRZUEVfRWxlbWVudCwNCisgICAgRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50LA0KKyAgICBGREVfQ1NTU0VMRUNUT1JUWVBFX0NsYXNzLA0KKyAgICBGREVfQ1NTU0VMRUNUT1JUWVBFX1BlcnN1ZG8sDQorICAgIEZERV9DU1NTRUxFQ1RPUlRZUEVfSUQsDQorfTsNCitjbGFzcyBJRkRFX0NTU1NlbGVjdG9yDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGREVfQ1NTU0VMRUNUT1JUWVBFCQlHZXRUeXBlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCUdldE5hbWVIYXNoKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTU2VsZWN0b3IqCQlHZXROZXh0U2VsZWN0b3IoKSBjb25zdCA9IDA7DQorfTsNCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfQnJhaWxsZQkweDAxDQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX0VtYm9zcwkJMHgwMg0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9IYW5kaGVsZAkweDA0DQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1ByaW50CQkweDA4DQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1Byb2plY3Rpb24JMHgxMA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9TY3JlZW4JCTB4MjANCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfVFRZCQkweDQwDQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1RWCQkJMHg4MA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9BTEwJCTB4RkYNCitlbnVtIEZERV9DU1NSVUxFVFlQRSB7DQorICAgIEZERV9DU1NSVUxFVFlQRV9Vbmtub3duCQkJPSAwLA0KKyAgICBGREVfQ1NTUlVMRVRZUEVfU3R5bGUJCQk9IDEsDQorICAgIEZERV9DU1NSVUxFVFlQRV9NZWRpYQkJCT0gNCwNCisgICAgRkRFX0NTU1JVTEVUWVBFX0ZvbnRGYWNlCQk9IDUsDQorfTsNCitjbGFzcyBJRkRFX0NTU1J1bGUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZERV9DU1NSVUxFVFlQRQkJCUdldFR5cGUoKSBjb25zdCA9IDA7DQorfTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1J1bGUqPiBDRkRFX0NTU1J1bGVBcnJheTsNCitjbGFzcyBJRkRFX0NTU1N0eWxlUnVsZSA6IHB1YmxpYyBJRkRFX0NTU1J1bGUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZERV9DU1NSVUxFVFlQRQkJCUdldFR5cGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkRFX0NTU1JVTEVUWVBFX1N0eWxlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRTZWxlY3Rvckxpc3RzKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTU2VsZWN0b3IqCQlHZXRTZWxlY3Rvckxpc3QoRlhfSU5UMzIgaW5kZXgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU0RlY2xhcmF0aW9uKglHZXREZWNsYXJhdGlvbigpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTTWVkaWFSdWxlIDogcHVibGljIElGREVfQ1NTUnVsZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFCQkJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGREVfQ1NTUlVMRVRZUEVfTWVkaWE7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRNZWRpYUxpc3QoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRSdWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU1J1bGUqCQkJR2V0UnVsZShGWF9JTlQzMiBpbmRleCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NGb250RmFjZVJ1bGUgOiBwdWJsaWMgSUZERV9DU1NSdWxlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGREVfQ1NTUlVMRVRZUEUJCQlHZXRUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZERV9DU1NSVUxFVFlQRV9Gb250RmFjZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsCUlGREVfQ1NTRGVjbGFyYXRpb24qCUdldERlY2xhcmF0aW9uKCkgY29uc3QgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0IDogcHVibGljIElGWF9Vbmtub3duDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCoJCUxvYWRIVE1MU3RhbmRhcmRTdHlsZVNoZWV0KCk7DQorICAgIHN0YXRpYyBJRkRFX0NTU1N0eWxlU2hlZXQqCQlMb2FkRnJvbVN0cmVhbShjb25zdCBDRlhfV2lkZVN0cmluZyAmc3pVcmwsIElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd01lZGlhTGlzdCA9IEZERV9DU1NNRURJQVRZUEVfQUxMKTsNCisgICAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCoJCUxvYWRGcm9tQnVmZmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZzelVybCwgRlhfTFBDV1NUUiBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmU2l6ZSwgRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3TWVkaWFMaXN0ID0gRkRFX0NTU01FRElBVFlQRV9BTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldFVybChDRlhfV2lkZVN0cmluZyAmc3pVcmwpID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRNZWRpYUxpc3QoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCQkJR2V0Q29kZVBhZ2UoKSBjb25zdCA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRSdWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU1J1bGUqCQkJR2V0UnVsZShGWF9JTlQzMiBpbmRleCkgPSAwOw0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1N0eWxlU2hlZXQqPiBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheTsNCisjZGVmaW5lIEZERV9DU1NVU0VSU1RZTEVTSEVFVAkJKEZYX0JTVFJDKCIjVVNFUlNIRUVUIikpDQorI2RlZmluZSBGREVfQ1NTVUFHRU5UU1RZTEVTSEVFVAkJKEZYX0JTVFJDKCIjQUdFTlRTSEVFVCIpKQ0KK2NsYXNzIElGREVfQ1NTU3R5bGVTaGVldENhY2hlDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldENhY2hlKglDcmVhdGUoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldE1heEl0ZW1zKEZYX0lOVDMyIGlNYXhDb3VudCA9IDUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlBZGRTdHlsZVNoZWV0KEZYX0JTVFIgc3pLZXksIElGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQpID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU1N0eWxlU2hlZXQqCQlHZXRTdHlsZVNoZWV0KEZYX0JTVFIgc3pLZXkpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlSZW1vdmVTdHlsZVNoZWV0KEZYX0JTVFIgc3pLZXkpID0gMDsNCit9Ow0KK2VudW0gRkRFX0NTU1NZTlRBWFNUQVRVUyB7DQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3IsDQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TLA0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUsDQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfQ2hhcnNldCwNCisgICAgRkRFX0NTU1NZTlRBWFNUQVRVU19JbXBvcnRSdWxlLA0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydENsb3NlLA0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX1BhZ2VSdWxlLA0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX1N0eWxlUnVsZSwNCisgICAgRkRFX0NTU1NZTlRBWFNUQVRVU19Gb250RmFjZVJ1bGUsDQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFSdWxlLA0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZSwNCisgICAgRkRFX0NTU1NZTlRBWFNUQVRVU19VUkksDQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3IsDQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbE9wZW4sDQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlLA0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZSwNCisgICAgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlLA0KK307DQorY2xhc3MgSUZERV9DU1NTeW50YXhQYXJzZXINCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9DU1NTeW50YXhQYXJzZXIqCUNyZWF0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJSW5pdChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9JTlQzMiBpQ1NTUGxhbmVTaXplLCBGWF9JTlQzMiBpVGV4dERhdGFTaXplID0gMzIsIEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbiA9IEZBTFNFKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJSW5pdChGWF9MUENXU1RSIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplLCBGWF9JTlQzMiBpVGV4dERhdFNpemUgPSAzMiwgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpID0gMDsNCisNCisgICAgdmlydHVhbCBGREVfQ1NTU1lOVEFYU1RBVFVTCQlEb1N5bnRheFBhcnNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIJCQkJR2V0Q3VycmVudFN0cmluZyhGWF9JTlQzMiAmaUxlbmd0aCkgY29uc3QgPSAwOw0KK307DQorZW51bSBGREVfQ1NTTEVOR1RIVU5JVCB7DQorICAgIEZERV9DU1NMRU5HVEhVTklUX0F1dG8sDQorICAgIEZERV9DU1NMRU5HVEhVTklUX05vbmUsDQorICAgIEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCwNCisgICAgRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsDQorICAgIEZERV9DU1NMRU5HVEhVTklUX1BlcmNlbnQsDQorfTsNCisjZGVmaW5lIEZERV9DU1NVTklUQklUUwkJCQkoMykNCisjZGVmaW5lIEZERV9DU1NVTklUTUFTSwkJCQkoKDEgPDwgRkRFX0NTU1VOSVRCSVRTKSAtIDEpDQorc3RydWN0IEZERV9DU1NMRU5HVEggew0KKyAgICBGREVfQ1NTTEVOR1RIJgkJCQkJU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KQ0KKyAgICB7DQorICAgICAgICBtX2lEYXRhID0gZVVuaXQ7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgRkRFX0NTU0xFTkdUSCYJCQkJCVNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKQ0KKyAgICB7DQorICAgICAgICBtX2lEYXRhID0gKChGWF9JTlRQVFIpKGZWYWx1ZSAqIDEwMjQuMGYpIDw8IEZERV9DU1NVTklUQklUUykgfCBlVW5pdDsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBGREVfQ1NTTEVOR1RIVU5JVAkJCQlHZXRVbml0KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTTEVOR1RIVU5JVCkobV9pRGF0YSAmIEZERV9DU1NVTklUTUFTSyk7DQorICAgIH0NCisgICAgRlhfRkxPQVQJCQkJCQlHZXRWYWx1ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAobV9pRGF0YSA+PiBGREVfQ1NTVU5JVEJJVFMpIC8gMTAyNC4wZjsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCQkJCU5vblplcm8oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKG1faURhdGEgPj4gRkRFX0NTU1VOSVRCSVRTKSAhPSAwOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgRlhfSU5UUFRSCQkJCQkJbV9pRGF0YTsNCit9Ow0KK3N0cnVjdCBGREVfQ1NTUE9JTlQgew0KKyAgICBGREVfQ1NTUE9JTlQmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQpDQorICAgIHsNCisgICAgICAgIHguU2V0KGVVbml0KTsNCisgICAgICAgIHkuU2V0KGVVbml0KTsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBGREVfQ1NTUE9JTlQmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkNCisgICAgew0KKyAgICAgICAgeC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgICAgICB5LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBGREVfQ1NTTEVOR1RICQkJCQl4LCB5Ow0KK307DQorc3RydWN0IEZERV9DU1NTSVpFIHsNCisgICAgRkRFX0NTU1NJWkUmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQpDQorICAgIHsNCisgICAgICAgIGN4LlNldChlVW5pdCk7DQorICAgICAgICBjeS5TZXQoZVVuaXQpOw0KKyAgICAgICAgcmV0dXJuICp0aGlzOw0KKyAgICB9DQorICAgIEZERV9DU1NTSVpFJgkJCQkJU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpDQorICAgIHsNCisgICAgICAgIGN4LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgICAgIGN5LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBGREVfQ1NTTEVOR1RICQkJCQljeCwgY3k7DQorfTsNCitzdHJ1Y3QgRkRFX0NTU1JFQ1Qgew0KKyAgICBGREVfQ1NTUkVDVCYJCQkJCVNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCkNCisgICAgew0KKyAgICAgICAgbGVmdC5TZXQoZVVuaXQpOw0KKyAgICAgICAgdG9wLlNldChlVW5pdCk7DQorICAgICAgICByaWdodC5TZXQoZVVuaXQpOw0KKyAgICAgICAgYm90dG9tLlNldChlVW5pdCk7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgRkRFX0NTU1JFQ1QmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkNCisgICAgew0KKyAgICAgICAgbGVmdC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgICAgICB0b3AuU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICAgICAgcmlnaHQuU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICAgICAgYm90dG9tLlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKw0KKyAgICBGREVfQ1NTTEVOR1RICQkJbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOw0KK307DQorZW51bSBGREVfQ1NTQktHQVRUQUNITUVOVCB7DQorICAgIEZERV9DU1NCS0dBVFRBQ0hNRU5UX1Njcm9sbCwNCisgICAgRkRFX0NTU0JLR0FUVEFDSE1FTlRfRml4ZWQsDQorfTsNCitlbnVtIEZERV9DU1NCS0dSRVBFQVQgew0KKyAgICBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdCwNCisgICAgRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRYLA0KKyAgICBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdFksDQorICAgIEZERV9DU1NCS0dSRVBFQVRfTm9SZXBlYXQsDQorfTsNCitlbnVtIEZERV9DU1NCT1JERVJTVFlMRSB7DQorICAgIEZERV9DU1NCT1JERVJTVFlMRV9Ob25lLA0KKyAgICBGREVfQ1NTQk9SREVSU1RZTEVfSGlkZGVuLA0KKyAgICBGREVfQ1NTQk9SREVSU1RZTEVfRG90dGVkLA0KKyAgICBGREVfQ1NTQk9SREVSU1RZTEVfRGFzaGVkLA0KKyAgICBGREVfQ1NTQk9SREVSU1RZTEVfU29saWQsDQorICAgIEZERV9DU1NCT1JERVJTVFlMRV9Eb3VibGUsDQorICAgIEZERV9DU1NCT1JERVJTVFlMRV9Hcm9vdmUsDQorICAgIEZERV9DU1NCT1JERVJTVFlMRV9SaWRnZSwNCisgICAgRkRFX0NTU0JPUkRFUlNUWUxFX0luc2V0LA0KKyAgICBGREVfQ1NTQk9SREVSU1RZTEVfb3V0c2V0LA0KK307DQorZW51bSBGREVfQ1NTQ0xFQVIgew0KKyAgICBGREVfQ1NTQ0xFQVJfTm9uZSwNCisgICAgRkRFX0NTU0NMRUFSX0xlZnQsDQorICAgIEZERV9DU1NDTEVBUl9SaWdodCwNCisgICAgRkRFX0NTU0NMRUFSX0JvdGgsDQorfTsNCitlbnVtIEZERV9DU1NESVNQTEFZIHsNCisgICAgRkRFX0NTU0RJU1BMQVlfTm9uZSwNCisgICAgRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0sDQorICAgIEZERV9DU1NESVNQTEFZX1J1bkluLA0KKyAgICBGREVfQ1NTRElTUExBWV9CbG9jaywNCisgICAgRkRFX0NTU0RJU1BMQVlfSW5saW5lLA0KKyAgICBGREVfQ1NTRElTUExBWV9JbmxpbmVCbG9jaywNCisgICAgRkRFX0NTU0RJU1BMQVlfSW5saW5lVGFibGUsDQorICAgIEZERV9DU1NESVNQTEFZX1RhYmxlLA0KKyAgICBGREVfQ1NTRElTUExBWV9UYWJsZVJvdywNCisgICAgRkRFX0NTU0RJU1BMQVlfVGFibGVDZWxsLA0KKyAgICBGREVfQ1NTRElTUExBWV9UYWJsZUNhcHRpb24sDQorICAgIEZERV9DU1NESVNQTEFZX1RhYmxlQ29sdW1uLA0KKyAgICBGREVfQ1NTRElTUExBWV9UYWJsZVJvd0dyb3VwLA0KKyAgICBGREVfQ1NTRElTUExBWV9UYWJsZUNvbHVtbkdyb3VwLA0KKyAgICBGREVfQ1NTRElTUExBWV9UYWJsZUhlYWRlckdyb3VwLA0KKyAgICBGREVfQ1NTRElTUExBWV9UYWJsZUZvb3Rlckdyb3VwLA0KKyAgICBGREVfQ1NTRElTUExBWV9SdWJ5LA0KKyAgICBGREVfQ1NTRElTUExBWV9SdWJ5QmFzZSwNCisgICAgRkRFX0NTU0RJU1BMQVlfUnVieVRleHQsDQorICAgIEZERV9DU1NESVNQTFNZX1J1YnlCYXNlR3JvdXAsDQorICAgIEZERV9DU1NESVNQTEFZX1J1YnlUZXh0R3JvdXAsDQorfTsNCitlbnVtIEZERV9DU1NWSVNJQklMSVRZIHsNCisgICAgRkRFX0NTU1ZJU0lCSUxJVFlfVmlzaWJsZSwNCisgICAgRkRFX0NTU1ZJU0lCSUxJVFlfSGlkZGVuLA0KKyAgICBGREVfQ1NTVklTSUJJTElUWV9Db2xsYXBzZSwNCit9Ow0KK2VudW0gRkRFX0NTU0ZPTlRTVFlMRSB7DQorICAgIEZERV9DU1NGT05UU1RZTEVfTm9ybWFsLA0KKyAgICBGREVfQ1NTRk9OVFNUWUxFX0l0YWxpYywNCit9Ow0KK2VudW0gRkRFX0NTU0ZMT0FUIHsNCisgICAgRkRFX0NTU0ZMT0FUX05vbmUsDQorICAgIEZERV9DU1NGTE9BVF9MZWZ0LA0KKyAgICBGREVfQ1NTRkxPQVRfUmlnaHQsDQorfTsNCitlbnVtIEZERV9DU1NXUklUSU5HTU9ERSB7DQorICAgIEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGIsDQorICAgIEZERV9DU1NXUklUSU5HTU9ERV9WZXJ0aWNhbFJsLA0KKyAgICBGREVfQ1NTV1JJVElOR01PREVfVmVydGljYWxMciwNCit9Ow0KK2VudW0gRkRFX0NTU1dPUkRCUkVBSyB7DQorICAgIEZERV9DU1NXT1JEQlJFQUtfTm9ybWFsLA0KKyAgICBGREVfQ1NTV09SREJSRUFLX0tlZXBBbGwsDQorICAgIEZERV9DU1NXT1JEQlJFQUtfQnJlYWtBbGwsDQorICAgIEZERV9DU1NXT1JEQlJFQUtfS2VlcFdvcmRzLA0KK307DQorZW51bSBGREVfQ1NTUEFHRUJSRUFLIHsNCisgICAgRkRFX0NTU1BBR0VCUkVBS19BdXRvLA0KKyAgICBGREVfQ1NTUEFHRUJSRUFLX0Fsd2F5cywNCisgICAgRkRFX0NTU1BBR0VCUkVBS19Bdm9pZCwNCisgICAgRkRFX0NTU1BBR0VCUkVBS19MZWZ0LA0KKyAgICBGREVfQ1NTUEFHRUJSRUFLX1JpZ2h0LA0KK307DQorZW51bSBGREVfQ1NTT1ZFUkZMT1cgew0KKyAgICBGREVfQ1NTT1ZFUkZMT1dfVmlzaWJsZSwNCisgICAgRkRFX0NTU09WRVJGTE9XX0hpZGRlbiwNCisgICAgRkRFX0NTU09WRVJGTE9XX1Njcm9sbCwNCisgICAgRkRFX0NTU09WRVJGTE9XX0F1dG8sDQorICAgIEZERV9DU1NPVkVSRkxPV19Ob0Rpc3BsYXksDQorICAgIEZERV9DU1NPVkVSRkxPV19Ob0NvbnRlbnQsDQorfTsNCitlbnVtIEZERV9DU1NMSU5FQlJFQUsgew0KKyAgICBGREVfQ1NTTElORUJSRUFLX0F1dG8sDQorICAgIEZERV9DU1NMSU5FQlJFQUtfTG9vc2UsDQorICAgIEZERV9DU1NMSU5FQlJFQUtfTm9ybWFsLA0KKyAgICBGREVfQ1NTTElORUJSRUFLX1N0cmljdCwNCit9Ow0KK2VudW0gRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwgew0KKyAgICBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9GaWxsZWQsDQorICAgIEZERV9DU1NURVhURU1QSEFTSVNGSUxMX09wZW4sDQorfTsNCitlbnVtIEZERV9DU1NURVhURU1QSEFTSVNNQVJLIHsNCisgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfTm9uZSwNCisgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQXV0bywNCisgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG90LA0KKyAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DaXJjbGUsDQorICAgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdWJsZUNpcmNsZSwNCisgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfVHJpYW5nbGUsDQorICAgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX1Nlc2FtZSwNCisgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ3VzdG9tLA0KK307DQorZW51bSBGREVfQ1NTVEVYVENPTUJJTkUgew0KKyAgICBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbCwNCisgICAgRkRFX0NTU1RFWFRDT01CSU5FX05vbmUsDQorfTsNCitlbnVtIEZERV9DU1NDVVJTT1Igew0KKyAgICBGREVfQ1NTQ1VSU09SX0F1dG8sDQorICAgIEZERV9DU1NDVVJTT1JfQ3Jvc3NoYWlyLA0KKyAgICBGREVfQ1NTQ1VSU09SX0RlZmF1bHQsDQorICAgIEZERV9DU1NDVVJTT1JfUG9pbnRlciwNCisgICAgRkRFX0NTU0NVUlNPUl9Nb3ZlLA0KKyAgICBGREVfQ1NTQ1VSU09SX0VSZXNpemUsDQorICAgIEZERV9DU1NDVVJTT1JfTmVSZXNpemUsDQorICAgIEZERV9DU1NDVVJTT1JfTndSZXNpemUsDQorICAgIEZERV9DU1NDVVJTT1JfTlJlc2l6ZSwNCisgICAgRkRFX0NTU0NVUlNPUl9TZVJlc2l6ZSwNCisgICAgRkRFX0NTU0NVUlNPUl9Td1Jlc2l6ZSwNCisgICAgRkRFX0NTU0NVUlNPUl9TUmVzaXplLA0KKyAgICBGREVfQ1NTQ1VSU09SX1dSZXNpemUsDQorICAgIEZERV9DU1NDVVJTT1JfVGV4dCwNCisgICAgRkRFX0NTU0NVUlNPUl9XYWl0LA0KKyAgICBGREVfQ1NTQ1VSU09SX0hlbHAsDQorICAgIEZERV9DU1NDVVJTT1JfUHJvZ3Jlc3MsDQorfTsNCitlbnVtIEZERV9DU1NQT1NJVElPTiB7DQorICAgIEZERV9DU1NQT1NJVElPTl9TdGF0aWMsDQorICAgIEZERV9DU1NQT1NJVElPTl9SZWxhdGl2ZSwNCisgICAgRkRFX0NTU1BPU0lUSU9OX0Fic29sdXRlLA0KKyAgICBGREVfQ1NTUE9TSVRJT05fRml4ZWQsDQorfTsNCitlbnVtIEZERV9DU1NDQVBUSU9OU0lERSB7DQorICAgIEZERV9DU1NDQVBUSU9OU0lERV9Ub3AsDQorICAgIEZERV9DU1NDQVBUSU9OU0lERV9Cb3R0b20sDQorICAgIEZERV9DU1NDQVBUSU9OU0lERV9MZWZ0LA0KKyAgICBGREVfQ1NTQ0FQVElPTlNJREVfUmlnaHQsDQorICAgIEZERV9DU1NDQVBUSU9OU0lERV9CZWZvcmUsDQorICAgIEZERV9DU1NDQVBUSU9OU0lERV9BZnRlciwNCit9Ow0KK2VudW0gRkRFX0NTU1JVQllBTElHTiB7DQorICAgIEZERV9DU1NSVUJZQUxJR05fQXV0bywNCisgICAgRkRFX0NTU1JVQllBTElHTl9TdGFydCwNCisgICAgRkRFX0NTU1JVQllBTElHTl9MZWZ0LA0KKyAgICBGREVfQ1NTUlVCWUFMSUdOX0NlbnRlciwNCisgICAgRkRFX0NTU1JVQllBTElHTl9FbmQsDQorICAgIEZERV9DU1NSVUJZQUxJR05fUmlnaHQsDQorICAgIEZERV9DU1NSVUJZQUxJR05fRGlzdHJpYnV0ZUxldHRlciwNCisgICAgRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlU3BhY2UsDQorICAgIEZERV9DU1NSVUJZQUxJR05fTGluZUVkZ2UsDQorfTsNCitlbnVtIEZERV9DU1NSVUJZT1ZFUkhBTkcgew0KKyAgICBGREVfQ1NTUlVCWU9WRVJIQU5HX0F1dG8sDQorICAgIEZERV9DU1NSVUJZT1ZFUkhBTkdfU3RhcnQsDQorICAgIEZERV9DU1NSVUJZT1ZFUkhBTkdfRW5kLA0KKyAgICBGREVfQ1NTUlVCWU9WRVJIQU5HX05vbmUsDQorfTsNCitlbnVtIEZERV9DU1NSVUJZUE9TSVRJT04gew0KKyAgICBGREVfQ1NTUlVCWVBPU0lUSU9OX0JlZm9yZSwNCisgICAgRkRFX0NTU1JVQllQT1NJVElPTl9BZnRlciwNCisgICAgRkRFX0NTU1JVQllQT1NJVElPTl9SaWdodCwNCisgICAgRkRFX0NTU1JVQllQT1NJVElPTl9JbmxpbmUsDQorfTsNCitlbnVtIEZERV9DU1NSVUJZU1BBTiB7DQorICAgIEZERV9DU1NSVUJZU1BBTl9Ob25lLA0KKyAgICBGREVfQ1NTUlVCWVNQQU5fQXR0ciwNCit9Ow0KK2VudW0gRkRFX0NTU1RFWFRBTElHTiB7DQorICAgIEZERV9DU1NURVhUQUxJR05fTGVmdCwNCisgICAgRkRFX0NTU1RFWFRBTElHTl9SaWdodCwNCisgICAgRkRFX0NTU1RFWFRBTElHTl9DZW50ZXIsDQorICAgIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeSwNCisgICAgRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsLA0KK307DQorZW51bSBGREVfQ1NTVkVSVElDQUxBTElHTiB7DQorICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX0Jhc2VsaW5lLA0KKyAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9TdWIsDQorICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1N1cGVyLA0KKyAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9Ub3AsDQorICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RleHRUb3AsDQorICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX01pZGRsZSwNCisgICAgRkRFX0NTU1ZFUlRJQ0FMQUxJR05fQm90dG9tLA0KKyAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9UZXh0Qm90dG9tLA0KKyAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXIsDQorfTsNCitlbnVtIEZERV9DU1NMSVNUU1RZTEVUWVBFIHsNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGlzYywNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2lyY2xlLA0KKyAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9TcXVhcmUsDQorICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWwsDQorICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWxMZWFkaW5nWmVybywNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJSb21hbiwNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfVXBwZXJSb21hbiwNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJHcmVlaywNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJMYXRpbiwNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfVXBwZXJMYXRpbiwNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQXJtZW5pYW4sDQorICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0dlb3JnaWFuLA0KKyAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckFscGhhLA0KKyAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckFscGhhLA0KKyAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9Ob25lLA0KKyAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9DamtJZGVvZ3JhcGhpYywNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGVicmV3LA0KKyAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYSwNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmFJcm9oYSwNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmEsDQorICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0thdGFrYW5hSXJvaGEsDQorfTsNCitlbnVtIEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiB7DQorICAgIEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTl9PdXRzaWRlLA0KKyAgICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT05fSW5zaWRlLA0KK307DQorZW51bSBGREVfQ1NTV0hJVEVTUEFDRSB7DQorICAgIEZERV9DU1NXSElURVNQQUNFX05vcm1hbCwNCisgICAgRkRFX0NTU1dISVRFU1BBQ0VfUHJlLA0KKyAgICBGREVfQ1NTV0hJVEVTUEFDRV9Ob3dyYXAsDQorICAgIEZERV9DU1NXSElURVNQQUNFX1ByZVdyYXAsDQorICAgIEZERV9DU1NXSElURVNQQUNFX1ByZUxpbmUsDQorfTsNCitlbnVtIEZERV9DU1NGT05UVkFSSUFOVCB7DQorICAgIEZERV9DU1NGT05UVkFSSUFOVF9Ob3JtYWwsDQorICAgIEZERV9DU1NGT05UVkFSSUFOVF9TbWFsbENhcHMsDQorfTsNCitlbnVtIEZERV9DU1NURVhUVFJBTlNGT1JNIHsNCisgICAgRkRFX0NTU1RFWFRUUkFOU0ZPUk1fTm9uZSwNCisgICAgRkRFX0NTU1RFWFRUUkFOU0ZPUk1fQ2FwaXRhbGl6ZSwNCisgICAgRkRFX0NTU1RFWFRUUkFOU0ZPUk1fVXBwZXJDYXNlLA0KKyAgICBGREVfQ1NTVEVYVFRSQU5TRk9STV9Mb3dlckNhc2UsDQorfTsNCitlbnVtIEZERV9DU1NURVhUREVDT1JBVElPTiB7DQorICAgIEZERV9DU1NURVhUREVDT1JBVElPTl9Ob25lCQkJCT0gMCwNCisgICAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX1VuZGVybGluZQkJCT0gMSwNCisgICAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX092ZXJsaW5lCQkJPSAyLA0KKyAgICBGREVfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2gJCT0gNCwNCisgICAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0JsaW5rCQkJCT0gOCwNCisgICAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZQkJCT0gMTYsDQorfTsNCitjbGFzcyBJRkRFX0NTU1J1YnlTdHlsZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU1JVQllBTElHTgkJR2V0UnVieUFsaWduKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NSVUJZT1ZFUkhBTkcJCUdldFJ1YnlPdmVyaGFuZygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTUlVCWVBPU0lUSU9OCQlHZXRSdWJ5UG9zaXRpb24oKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU1JVQllTUEFOCQkJR2V0UnVieVNwYW5UeXBlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0UnVieVNwYW5BdHRyKCkgY29uc3QgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5Db3VudCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5HYXAoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Q29sdW1uUnVsZUNvbG9yKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Q29sdW1uUnVsZVN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldENvbHVtblJ1bGVXaWR0aCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5XaWR0aCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5Db3VudChjb25zdCBGREVfQ1NTTEVOR1RIICZjb2x1bW5Db3VudCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbHVtbkdhcChjb25zdCBGREVfQ1NTTEVOR1RIICZjb2x1bW5HYXApID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5SdWxlQ29sb3IoRlhfQVJHQiBkd0NvbHVtblJ1bGVDb2xvcikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbHVtblJ1bGVTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUNvbHVtblJ1bGVTdHlsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbHVtblJ1bGVXaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIICZjb2x1bW5SdWxlV2lkdGgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5XaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIICZjb2x1bW5XaWR0aCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUNvdW50Q291bnRlcnMoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBDV1NUUgkJCQlHZXRDb3VudGVySWRlbnRpZmllcihGWF9JTlQzMiBpbmRleCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldENvdW50ZXJSZXNldChGWF9JTlQzMiBpbmRleCwgRlhfSU5UMzIgJmlWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldENvdW50ZXJJbmNyZW1lbnQoRlhfSU5UMzIgaW5kZXgsIEZYX0lOVDMyICZpVmFsdWUpID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlTGlzdCoJCUdldENvbnRlbnQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRRdW90ZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBDV1NUUgkJCQlHZXRRdW90ZXMoRlhfSU5UMzIgaW5kZXgpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTRm9udFN0eWxlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudEZvbnRGYW1pbGllcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9MUENXU1RSCQkJCUdldEZvbnRGYW1pbHkoRlhfSU5UMzIgaW5kZXgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9XT1JECQkJCQlHZXRGb250V2VpZ2h0KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NGT05UVkFSSUFOVAkJR2V0Rm9udFZhcmlhbnQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU0ZPTlRTVFlMRQkJR2V0Rm9udFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldENvbG9yKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRXZWlnaHQoRlhfV09SRCB3Rm9udFdlaWdodCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRWYXJpYW50KEZERV9DU1NGT05UVkFSSUFOVCBlRm9udFZhcmlhbnQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGb250U3R5bGUoRkRFX0NTU0ZPTlRTVFlMRSBlRm9udFN0eWxlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sb3IoRlhfQVJHQiBkd0ZvbnRDb2xvcikgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NCb3VuZGFyeVN0eWxlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJMZWZ0Q29sb3IoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyVG9wQ29sb3IoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyUmlnaHRDb2xvcigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJCb3R0b21Db2xvcigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlckxlZnRTdHlsZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlclRvcFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyUmlnaHRTdHlsZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlckJvdHRvbVN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NSRUNUKgkJR2V0Qm9yZGVyV2lkdGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqCQlHZXRNYXJnaW5XaWR0aCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCoJCUdldFBhZGRpbmdXaWR0aCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJMZWZ0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyVG9wQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyUmlnaHRDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJCb3R0b21Db2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJMZWZ0U3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJvcmRlclRvcFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJSaWdodFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJCb3R0b21TdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QgJnJlY3QpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNYXJnaW5XaWR0aChjb25zdCBGREVfQ1NTUkVDVCAmcmVjdCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFBhZGRpbmdXaWR0aChjb25zdCBGREVfQ1NTUkVDVCAmcmVjdCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NQb3NpdGlvblN0eWxlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGREVfQ1NTRElTUExBWQkJCUdldERpc3BsYXkoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmCQlHZXRCb3hTaXplKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJgkJR2V0TWluQm94U2l6ZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYJCUdldE1heEJveFNpemUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU0ZMT0FUCQkJR2V0RmxvYXQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU0NMRUFSCQkJR2V0Q2xlYXIoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU1BPU0lUSU9OCQkJR2V0UG9zaXRpb24oKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSAkJCUdldFRvcCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTTEVOR1RICQkJR2V0Qm90dG9tKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NMRU5HVEgJCQlHZXRMZWZ0KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NMRU5HVEgJCQlHZXRSaWdodCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXREaXNwbGF5KEZERV9DU1NESVNQTEFZIGVEaXNwbGF5KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSAmYm94U2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldE1pbkJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUgJm1pbkJveFNpemUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNYXhCb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFICZtYXhCb3hTaXplKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RmxvYXQoRkRFX0NTU0ZMT0FUIGVGbG9hdCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENsZWFyKEZERV9DU1NDTEVBUiBlQ2xlYXIpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldExpbmVIZWlnaHQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU1dISVRFU1BBQ0UJCUdldFdoaXRlU3BhY2UoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0VGV4dEluZGVudCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTVEVYVEFMSUdOCQlHZXRUZXh0QWxpZ24oKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU1ZFUlRJQ0FMQUxJR04JR2V0VmVydGljYWxBbGlnbigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCQlHZXROdW1iZXJWZXJ0aWNhbEFsaWduKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NURVhUVFJBTlNGT1JNCUdldFRleHRUcmFuc2Zvcm0oKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJR2V0VGV4dERlY29yYXRpb24oKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0TGV0dGVyU3BhY2luZygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRXb3JkU3BhY2luZygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTV1JJVElOR01PREUJCUdldFdyaXRpbmdNb2RlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NXT1JEQlJFQUsJCUdldFdvcmRCcmVhaygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRXaWRvd3MoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0VGV4dEVtcGhhc2lzQ29sb3IoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSwkJR2V0UGFnZUJyZWFrQmVmb3JlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsJCUdldFBhZ2VCcmVha0FmdGVyKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsJCUdldFBhZ2VCcmVha0luc2lkZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRPcnBoYW5zKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NMSU5FQlJFQUsJCUdldExpbmVCcmVhaygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSwlHZXRUZXh0RW1waGFzaXNNYXJrKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNGSUxMCUdldFRleHRFbXBoYXNpc0ZpbGwoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBDV1NUUgkJCQlHZXRUZXh0RW1waGFzaXNDdXN0b20oKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU1RFWFRDT01CSU5FCQlHZXRUZXh0Q29tYmluZVR5cGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJSGFzVGV4dENvbWJpbmVOdW1iZXIoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0VGV4dENvbWJpbmVOdW1iZXIoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TGluZUhlaWdodChGWF9GTE9BVCBmTGluZUhlaWdodCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdoaXRlU3BhY2UoRkRFX0NTU1dISVRFU1BBQ0UgZVdoaXRlU3BhY2UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0SW5kZW50KGNvbnN0IEZERV9DU1NMRU5HVEggJnRleHRJbmRlbnQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0QWxpZ24oRkRFX0NTU1RFWFRBTElHTiBlVGV4dEFsaWduKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VmVydGljYWxBbGlnbihGREVfQ1NTVkVSVElDQUxBTElHTiBlVmVydGljYWxBbGlnbikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldE51bWJlclZlcnRpY2FsQWxpZ24oRlhfRkxPQVQgZkFsaWduKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dFRyYW5zZm9ybShGREVfQ1NTVEVYVFRSQU5TRk9STSBlVGV4dFRyYW5zZm9ybSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHREZWNvcmF0aW9uKEZYX0RXT1JEIGR3VGV4dERlY29yYXRpb24pID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMZXR0ZXJTcGFjaW5nKGNvbnN0IEZERV9DU1NMRU5HVEggJmxldHRlclNwYWNpbmcpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCSAJU2V0V29yZFNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCAmd29yZFNwYWNpbmcpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRXcml0aW5nTW9kZShGREVfQ1NTV1JJVElOR01PREUgZVdyaXRpbmdNb2RlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0V29yZEJyZWFrKEZERV9DU1NXT1JEQlJFQUsgZVdvcmRCcmVhaykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdpZG93cyhGWF9JTlQzMiBpV2lkb3dzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dEVtcGhhc2lzQ29sb3IoRlhfQVJHQiBkd1RleHRFbXBoYXNpc0NvbG9yKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFnZUJyZWFrQmVmb3JlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0JlZm9yZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFBhZ2VCcmVha0FmdGVyKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0FmdGVyKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFnZUJyZWFrSW5zaWRlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0luc2lkZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldE9ycGhhbnMoRlhfSU5UMzIgaU9ycGhhbnMpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMaW5lQnJlYWsoRkRFX0NTU0xJTkVCUkVBSyBlTGluZUJyZWFrKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU0JhY2tncm91bmRTdHlsZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0QktHQ29sb3IoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfTFBDV1NUUgkJCQlHZXRCS0dJbWFnZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTQktHUkVQRUFUCQlHZXRCS0dSZXBlYXQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU0JLR0FUVEFDSE1FTlQJR2V0QktHQXR0YWNobWVudCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUE9JTlQmCQlHZXRCS0dQb3NpdGlvbigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCS0dDb2xvcihGWF9BUkdCIGR3QktHQ29sb3IpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCS0dQb3NpdGlvbihjb25zdCBGREVfQ1NTUE9JTlQgJmJrZ1Bvc2l0aW9uKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU0xpc3RTdHlsZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVRZUEUJCUdldExpc3RTdHlsZVR5cGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OCUdldExpc3RTdHlsZVBvc2l0aW9uKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIJCQkJCUdldExpc3RTdHlsZUltYWdlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQlTZXRMaXN0U3R5bGVUeXBlKEZERV9DU1NMSVNUU1RZTEVUWVBFIGVMaXN0U3R5bGVUeXBlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJCVNldExpc3RTdHlsZVBvc2l0aW9uKEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBlTGlzdFN0eWxlUG9zaXRpb24pID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTVGFibGVTdHlsZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRkRFX0NTU0NBUFRJT05TSURFCQkJR2V0Q2FwdGlvblNpZGUoKSBjb25zdCA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU1Zpc3VhbFN0eWxlDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGREVfQ1NTVklTSUJJTElUWQkJR2V0VmlzaWJpbGl0eSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfQ1NTT1ZFUkZMT1cJCQlHZXRPdmVyZmxvd1goKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0NTU09WRVJGTE9XCQkJR2V0T3ZlcmZsb3dZKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFZpc2liaWxpdHkoRkRFX0NTU1ZJU0lCSUxJVFkgZVZpc2liaWxpdHkpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSA6IHB1YmxpYyBJRlhfVW5rbm93bg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlSZXNldCgpID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU0ZvbnRTdHlsZSoJCQkJR2V0Rm9udFN0eWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUqCQkJR2V0Qm91bmRhcnlTdHlsZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9DU1NQb3NpdGlvblN0eWxlKgkJCUdldFBvc2l0aW9uU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUqCQkJR2V0UGFyYWdyYXBoU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlKgkJR2V0QmFja2dyb3VuZFN0eWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU1Zpc3VhbFN0eWxlKgkJCUdldFZpc3VhbFN0eWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU0xpc3RTdHlsZSoJCQkJR2V0TGlzdFN0eWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUqCQlHZXRNdWx0aUNvbHVtblN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTVGFibGVTdHlsZSoJCQkJR2V0VGFibGVTdHlsZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSoJR2V0R2VuZXJhdGVkQ29udGVudFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTUnVieVN0eWxlKgkJCQlHZXRSdWJ5U3R5bGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRDdXN0b21TdHlsZShGWF9XU1RSIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0ID0gMDsNCit9Ow0KK2VudW0gRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCB7DQorICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfVXNlckFnZW50LA0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXIsDQorICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfQXV0aG9yLA0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWCwNCit9Ow0KK2VudW0gRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWSB7DQorICAgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfSGlnaCwNCisgICAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9NaWQsDQorICAgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTG93LA0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX01BWCwNCit9Ow0KK2NsYXNzIElGREVfQ1NTVGFnUHJvdmlkZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nQwkJCUdldFRhZ05hbWUoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJR2V0Rmlyc3RBdHRyaWJ1dGUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0TmV4dEF0dHJpYnV0ZShGWF9QT1NJVElPTiAmcG9zLCBDRlhfV2lkZVN0cmluZ0MgJndzQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU0FjY2VsZXJhdG9yDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCQkJCQlPbkVudGVyVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTU3R5bGVTZWxlY3Rvcg0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX0NTU1N0eWxlU2VsZWN0b3IqCUNyZWF0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udE1ncihJRlhfRm9udE1nciAqcEZvbnRNZ3IpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXREZWZGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCQlTZXRTdHlsZVNoZWV0KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIElGREVfQ1NTU3R5bGVTaGVldCAqcFNoZWV0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJU2V0U3R5bGVTaGVldHMoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwgY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkgKnBBcnJheSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFN0eWxlUHJpb3JpdHkoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWSBlUHJpb3JpdHkpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlVcGRhdGVTdHlsZUluZGV4KEZYX0RXT1JEIGR3TWVkaWFMaXN0KSA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9DU1NBY2NlbGVyYXRvcioJSW5pdEFjY2VsZXJhdG9yKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSoJQ3JlYXRlQ29tcHV0ZWRTdHlsZShJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCU1hdGNoRGVjbGFyYXRpb25zKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcsIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSAmbWF0Y2hlZERlY2xzLCBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUgPSBGREVfQ1NTUEVSU1VET19OT05FKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJQ29tcHV0ZVN0eWxlKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcsIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcERlY2xBcnJheSwgRlhfSU5UMzIgaURlY2xDb3VudCwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwRGVzdFN0eWxlKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9pbWcuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2ltZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGJjNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9pbWcuaApAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9JTUFHRQ0KKyNkZWZpbmUgX0ZERV9JTUFHRQ0KK2NsYXNzIElGREVfSW1hZ2U7DQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfVW5rbm93bgkJLTENCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9CTVAJCQkwDQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfR0lGCQkJMQ0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0pQRUcJCTINCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9QTkcJCQkzDQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfVElGRgkJNA0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0pQRUcyMDAwCTUNCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9KQmlnMgkJNg0KK2NsYXNzIElGREVfSW1hZ2UNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9JbWFnZSoJCUNyZWF0ZShJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9JTlQzMiBpRm9ybWF0ID0gRkRFX0lNQUdFRk9STUFUX1Vua25vd24pOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlMb2FkSW1hZ2UoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUZyZWVJbWFnZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJQ291bnRGcmFtZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRGcmFtZShGWF9JTlQzMiBpbmRleCkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJR2V0RnJhbWVJbWFnZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SW1hZ2VGb3JtYXQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEltYWdlV2lkdGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEltYWdlSGVpZ2h0KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXREZWxheVRpbWUoRlhfSU5UMzIgaUZyYW1lSW5kZXgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0TG9vcENvdW50KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTdGFydExvYWRJbWFnZShDRlhfRElCaXRtYXAgKnBESUJpdG1hcCwgRlhfSU5UMzIgZGliWCwgRlhfSU5UMzIgZGliWSwgRlhfSU5UMzIgZGliQ1gsIEZYX0lOVDMyIGRpYkNZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpbWdYLCBGWF9JTlQzMiBpbWdZLCBGWF9JTlQzMiBpbWdDWCwgRlhfSU5UMzIgaW1nQ1ksIEZYX0lOVDMyIGlGcmFtZUluZGV4ID0gMCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlEb0xvYWRJbWFnZShJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU3RvcExvYWRJbWFnZSgpID0gMDsNCit9Ow0KKyNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX1Vua25vd24JCQkJLTENCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9PcGFjaXR5CQkJCTANCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9HcmF5U2NhbGUJCQkxDQorI2RlZmluZSBGREVfSU1BR0VGSUxURVJfQmxhY2tXaGl0ZQkJCTINCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9JbnZlcnRDb2xvcgkJCTMNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9UcmFuc3BhcmVudENvbG9yCTQNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9NYXNrQ29sb3IJCQk1DQorI2RlZmluZSBGREVfSU1BR0VGSUxURVJfQnJpZ2h0bmVzcwkJCTYNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9Db250cmFzdAkJCTcNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0lNQUdFRklMVEVSUEFSQU1TIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgICBGWF9JTlQzMglpRmlsdGVyVHlwZTsNCit9IEZERV9JTUFHRUZJTFRFUlBBUkFNUywgKiBGREVfTFBJTUFHRUZJTFRFUlBBUkFNUzsNCit0eXBlZGVmIEZERV9JTUFHRUZJTFRFUlBBUkFNUyBjb25zdCAqIEZERV9MUENJTUFHRUZJTFRFUlBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX09QQUNJVFlQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCisgICAgRlhfSU5UMzIJaU9wYWNpdHk7DQorfSBGREVfT1BBQ0lUWVBBUkFNUywgKiBGREVfTFBPUEFDSVRZUEFSQU1TOw0KK3R5cGVkZWYgRkRFX09QQUNJVFlQQVJBTVMgY29uc3QgKiBGREVfTFBDT1BBQ0lUWVBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0JMQUNLV0hJVEVQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCisgICAgRlhfQVJHQgkJZHdCbGFja0NvbG9yOw0KKyAgICBGWF9BUkdCCQlkd1doaXRlQ29sb3I7DQorfSBGREVfQkxBQ0tXSElURVBBUkFNUywgKiBGREVfTFBCTEFDS1dISVRFUEFSQU1TOw0KK3R5cGVkZWYgRkRFX0JMQUNLV0hJVEVQQVJBTVMgY29uc3QgKiBGREVfTFBDQkxBQ0tXSElURVBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX1RSQU5TUEFSRU5UUEFSQU1TIDogcHVibGljIEZERV9JTUFHRUZJTFRFUlBBUkFNUyB7DQorICAgIEZYX0FSR0IJCWNvbG9yOw0KK30gRkRFX1RSQU5TUEFSRU5UUEFSQU1TLCAqIEZERV9MUFRSQU5TUEFSRU5UUEFSQU1TOw0KK3R5cGVkZWYgRkRFX1RSQU5TUEFSRU5UUEFSQU1TIGNvbnN0ICogRkRFX0xQQ1RSQU5TUEFSRU5UUEFSQU1TOw0KK3R5cGVkZWYgc3RydWN0IF9GREVfTUFTS0NPTE9SUEFSQU1TIDogcHVibGljIEZERV9JTUFHRUZJTFRFUlBBUkFNUyB7DQorICAgIEZYX0FSR0IJCWNvbG9yOw0KK30gRkRFX01BU0tDT0xPUlBBUkFNUywgKiBGREVfTFBNQVNLQ09MT1JQQVJBTVM7DQordHlwZWRlZiBGREVfTUFTS0NPTE9SUEFSQU1TIGNvbnN0ICogRkRFX0xQQ01BU0tDT0xPUlBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0JSSUdIVE5FU1NQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCisgICAgRlhfSU5UMzIJaUJyaWdodG5lc3M7DQorfSBGREVfQlJJR0hUTkVTU1BBUkFNUywgKiBGREVfTFBCUklHSFRORVNTUEFSQU1TOw0KK3R5cGVkZWYgRkRFX0JSSUdIVE5FU1NQQVJBTVMgY29uc3QgKiBGREVfTFBDQlJJR0hUTkVTU1BBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0NPTlRSQVNUUEFSQU1TIDogcHVibGljIEZERV9JTUFHRUZJTFRFUlBBUkFNUyB7DQorICAgIEZYX0lOVDMyCWlDb250cmFzdDsNCit9IEZERV9DT05UUkFTVFBBUkFNUywgKiBGREVfTFBDT05UUkFTVFBBUkFNUzsNCit0eXBlZGVmIEZERV9DT05UUkFTVFBBUkFNUyBjb25zdCAqIEZERV9MUENDT05UUkFTVFBBUkFNUzsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9tZW0uaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmU2N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9tZW0uaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9NRU0NCisjZGVmaW5lIF9GREVfTUVNDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorI2RlZmluZSBGREVfQWxsb2Moc2l6ZSkJCQkJRlhfQWxsb2MoRlhfQllURSwgc2l6ZSkNCisjZGVmaW5lIEZERV9SZWFsbG9jKHB0ciwgbmV3U2l6ZSkJRlhfUmVhbGxvYyhGWF9CWVRFLCBwdHIsIG5ld1NpemUpDQorI2RlZmluZSBGREVfRnJlZShwdHIpCQkJCUZYX0ZyZWUocHRyKQ0KKyNkZWZpbmUgRkRFX05ldwkJCUZYVEFSR0VUX05ldw0KKyNkZWZpbmUgRkRFX0RlbGV0ZQkJRlhUQVJHRVRfRGVsZXRlDQorI2RlZmluZSBGREVfTmV3V2l0aAkJRlhUQVJHRVRfTmV3V2l0aA0KKyNkZWZpbmUgRkRFX0RlbGV0ZVdpdGgJRlhUQVJHRVRfRGVsZXRlV2l0aA0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK307DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcGVuLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMwYjZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcGVuLmgKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfUEVODQorI2RlZmluZSBfRkRFX1BFTg0KK2NsYXNzIElGREVfUGVuOw0KKyNkZWZpbmUgRkRFX1BFTlRZUEVfVW5rbm93bgkJCQlGREVfQlJVU0hUWVBFX1Vua25vd24NCisjZGVmaW5lIEZERV9QRU5UWVBFX1NvbGlkQ29sb3IJCQlGREVfQlJVU0hUWVBFX1NvbGlkDQorI2RlZmluZSBGREVfUEVOVFlQRV9IYXRjaEJydXNoCQkJRkRFX0JSVVNIVFlQRV9IYXRjaA0KKyNkZWZpbmUgRkRFX1BFTlRZUEVfVGV4dHVyZUJydXNoCQlGREVfQlJVU0hUWVBFX1RleHR1cmUNCisjZGVmaW5lIEZERV9QRU5UWVBFX0xpbmVhckdyYWRpZW50CQlGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50DQorI2RlZmluZSBGREVfUEVOVFlQRV9NQVgJCQkJCUZERV9CUlVTSFRZUEVfTUFYDQorI2RlZmluZSBGREVfREFTSFNUWUxFX1NvbGlkCQkJMA0KKyNkZWZpbmUgRkRFX0RBU0hTVFlMRV9EYXNoCQkJMQ0KKyNkZWZpbmUgRkRFX0RBU0hTVFlMRV9Eb3QJCQkyDQorI2RlZmluZSBGREVfREFTSFNUWUxFX0Rhc2hEb3QJCTMNCisjZGVmaW5lIEZERV9EQVNIU1RZTEVfRGFzaERvdERvdAk0DQorI2RlZmluZSBGREVfREFTSFNUWUxFX0N1c3RvbWl6ZWQJNQ0KKyNkZWZpbmUgRkRFX0xJTkVKT0lOX01pdGVyCQkJMA0KKyNkZWZpbmUgRkRFX0xJTkVKT0lOX1JvdW5kCQkJMQ0KKyNkZWZpbmUgRkRFX0xJTkVKT0lOX0JldmVsCQkJMg0KKyNkZWZpbmUgRkRFX0xJTkVDQVBfRmxhdAkJCTANCisjZGVmaW5lIEZERV9MSU5FQ0FQX1JvdW5kCQkJMQ0KKyNkZWZpbmUgRkRFX0xJTkVDQVBfU3F1YXJlCQkJMg0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ09NUE9VTkRQQVRURVJOIHsNCisgICAgRlhfRkxPQVQJcG9zOw0KKyAgICBGWF9GTE9BVAl3aWR0aDsNCit9IEZERV9DT01QT1VORFBBVFRFUk4sICogRkRFX0xQQ09NUE9VTkRQQVRURVJOOw0KK3R5cGVkZWYgRkRFX0NPTVBPVU5EUEFUVEVSTiBjb25zdCAqCQkJCUZERV9MUENDT01QT1VORFBBVFRFUk47DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfQ09NUE9VTkRQQVRURVJOPglDRkRFX0NvbXBvdW5kUGF0dGVybnM7DQorY2xhc3MgSUZERV9QZW4NCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9QZW4qCQkJQ3JlYXRlKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0VHlwZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgPSAwOw0KKyAgICB2aXJ0dWFsIElGREVfQnJ1c2gqCQkJR2V0QnJ1c2goKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRCcnVzaChJRkRFX0JydXNoICpwQnJ1c2gsIEZYX0JPT0wgYkF1dG9SZWxlYXNlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRMaW5lQ2FwKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TGluZUNhcChGWF9JTlQzMiBpTGluZUNhcCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0RGFzaFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0RGFzaFN0eWxlKEZYX0lOVDMyIGlEYXNoU3R5bGUpID0gMDsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldERhc2hQaGFzZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldERhc2hQaGFzZShGWF9GTE9BVCBmUGhhc2UpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50RGFzaEFycmF5KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0RGFzaEFycmF5KENGWF9GbG9hdEFycmF5ICZkYXNoQXJyYXkpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldERhc2hBcnJheShjb25zdCBDRlhfRmxvYXRBcnJheSAmZGFzaEFycmF5KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRMaW5lSm9pbigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldExpbmVKb2luKEZYX0lOVDMyIGlMaW5lSm9pbikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWl0ZXJMaW1pdCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldE1pdGVyTGltaXQoRlhfRkxPQVQgZk1pdGVyTGltaXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50Q29tcG91bmRQYXR0ZXJucygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUdldENvbXBvdW5kUGF0dGVybnMoQ0ZERV9Db21wb3VuZFBhdHRlcm5zICZjb21wb3VuZFBhdHRlcm5zKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDb21wb3VuZFBhdHRlcm5zKGNvbnN0IENGREVfQ29tcG91bmRQYXR0ZXJucyAmY29tcG91bmRQYXR0ZXJucykgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHNyLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA3MGU2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHNyLmgKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfUEFSU0VSDQorI2RlZmluZSBfRkRFX1BBUlNFUg0KK2VudW0gRkRFX1ZJU1VBTE9CSlRZUEUgew0KKyAgICBGREVfVklTVUFMT0JKX0NhbnZhcwk9ICAweDAwLA0KKyAgICBGREVfVklTVUFMT0JKX1RleHQJCT0gIDB4MDEJLA0KKyAgICBGREVfVklTVUFMT0JKX0ltYWdlCQk9ICAweDAyCSwNCisgICAgRkRFX1ZJU1VBTE9CSl9QYXRoCQk9ICAweDA0CSwNCisgICAgRkRFX1ZJU1VBTE9CSl9XaWRnZXQJPSAgMHgwOAksDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0hWSVNVQUxPQkogew0KKyAgICBGWF9MUFZPSUQgcERhdGE7DQorfSBjb25zdCAqIEZERV9IVklTVUFMT0JKOw0KK2NsYXNzIElGREVfVmlzdWFsU2V0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGREVfVklTVUFMT0JKVFlQRQlHZXRUeXBlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZiYm94KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9NYXRyaXggJm1hdHJpeCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFJlY3QoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZydCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZydCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DYW52YXNTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX1BPU0lUSU9OCQkJR2V0Rmlyc3RQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoQ2FudmFzKSA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJCUdldE5leHQoRkRFX0hWSVNVQUxPQkogaENhbnZhcywgRlhfUE9TSVRJT04gJnBvcywgSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJCUdldFBhcmVudENhbnZhcyhGREVfSFZJU1VBTE9CSiBoQ2FudmFzLCBJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfVGV4dFNldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRTdHJpbmcoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCQlHZXRGb250KEZERV9IVklTVUFMT0JKIGhUZXh0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXRGb250U2l6ZShGREVfSFZJU1VBTE9CSiBoVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Rm9udENvbG9yKEZERV9IVklTVUFMT0JKIGhUZXh0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXREaXNwbGF5UG9zKEZERV9IVklTVUFMT0JKIGhUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldENoYXJSZWN0cyhGREVfSFZJU1VBTE9CSiBoVGV4dCwgQ0ZYX1JlY3RGQXJyYXkgJnJ0QXJyYXkpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfSW1hZ2VTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIElGREVfSW1hZ2UqCQkJCQlHZXRJbWFnZShGREVfSFZJU1VBTE9CSiBoSW1hZ2UpID0gMDsNCisgICAgdmlydHVhbCBGWF9QT1NJVElPTgkJCQkJR2V0Rmlyc3RGaWx0ZXJQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoSW1hZ2UpID0gMDsNCisgICAgdmlydHVhbCBGREVfTFBDSU1BR0VGSUxURVJQQVJBTVMJR2V0TmV4dEZpbHRlcihGREVfSFZJU1VBTE9CSiBoSW1hZ2UsIEZYX1BPU0lUSU9OICZwb3MpID0gMDsNCit9Ow0KKyNkZWZpbmUgRkRFX0ZJTExNT0RFX0FsdGVybmF0ZQkJMQ0KKyNkZWZpbmUgRkRFX0ZJTExNT0RFX1dpbmRpbmcJCTINCisjZGVmaW5lIEZERV9QQVRIUkVOREVSX1N0cm9rZQkJMQ0KKyNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfRmlsbAkJCTINCisjZGVmaW5lIEZERV9QQVRIUkVOREVSX0ZpbGxTdHJva2UJMw0KK2NsYXNzIElGREVfUGF0aFNldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldA0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgSUZERV9QYXRoKgkJR2V0UGF0aChGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRGaWxsTW9kZShGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRSZW5kZXJNb2RlKEZERV9IVklTVUFMT0JKIGhQYXRoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9QZW4qCQlHZXRQZW4oRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0UGVuV2lkdGgoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisgICAgdmlydHVhbCBJRkRFX0JydXNoKgkJR2V0QnJ1c2goRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCit9Ow0KK2VudW0gRkRFX1dJREdFVE9CSiB7DQorICAgIEZERV9XSURHRVRPQkpfVW5rbm93bgkJPQkweDAwMDAsDQorICAgIEZERV9XSURHRVRPQkpfQW5jaG9yCQk9CTB4MDEwMCwNCisgICAgRkRFX1dJREdFVE9CSl9OYW1lZERlc3QJCT0JMHgwMjAwLA0KKyAgICBGREVfV0lER0VUT0JKX0h5cGVyTGluawkJPQkweDA0MDAsDQorfTsNCisjZGVmaW5lIEZERV9XSURHRVRQQVJBTV9VcmkJCTENCisjZGVmaW5lIEZERV9XSURHRVRQQVJBTV9SZWN0cwkyDQorY2xhc3MgSUZERV9XaWRnZXRTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZERV9XSURHRVRPQkoJR2V0V2lkZ2V0VHlwZShGREVfSFZJU1VBTE9CSiBoV2lkZ2V0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldEZsb2F0KEZERV9IVklTVUFMT0JKIGhXaWRnZXQsIEZYX0lOVDMyIGlQYXJhbWV0ZXIsIEZYX0ZMT0FUIGZEZWZWYWwgPSAwLjBmKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEludGVnZXIoRkRFX0hWSVNVQUxPQkogaFdpZGdldCwgRlhfSU5UMzIgaVBhcmFtZXRlciwgRlhfSU5UMzIgaURlZlZhbCA9IDApID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0U3RyaW5nKEZERV9IVklTVUFMT0JKIGhXaWRnZXQsIEZYX0lOVDMyIGlQYXJhbWV0ZXIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldFJlY3RzKEZERV9IVklTVUFMT0JKIGhXaWRnZXQsIEZYX0lOVDMyIGlQYXJhbWV0ZXIsIENGWF9SZWN0RkFycmF5ICZyZWN0cykgPSAwOw0KK307DQorY2xhc3MgSUZERV9WaXN1YWxTZXRJdGVyYXRvcg0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKglDcmVhdGUoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUF0dGFjaENhbnZhcyhJRkRFX0NhbnZhc1NldCAqcENhbnZhcykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzID0gMHhGRkZGRkZGRikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlc2V0KCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKCQkJR2V0TmV4dChJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQsIEZERV9IVklTVUFMT0JKICpwaENhbnZhc09iaiA9IE5VTEwsIElGREVfQ2FudmFzU2V0ICoqcHBDYW52YXNTZXQgPSBOVUxMKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wdGguaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3B0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlM2NjOGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wdGguaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9QQVRIDQorI2RlZmluZSBfRkRFX1BBVEgNCitjbGFzcyBJRkRFX1BhdGg7DQorY2xhc3MgSUZERV9QYXRoDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGREVfUGF0aCoJCUNyZWF0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTdGFydEZpZ3VyZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJQ2xvc2VGaWd1cmUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZEJlemllcihjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZEJlemllcnMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBZGRDdXJ2ZShjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9CT09MIGJDbG9zZWQsIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBZGRFbGxpcHNlKGNvbnN0IENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBZGRMaW5lcyhjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkUGF0aChjb25zdCBJRkRFX1BhdGggKnBTcmMsIEZYX0JPT0wgYkNvbm5lY3QpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkUG9seWdvbihjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0QkJveChDRlhfUmVjdEYgJmJib3gpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0QkJveChDRlhfUmVjdEYgJmJib3gsIEZYX0ZMT0FUIGZMaW5lV2lkdGgsIEZYX0ZMT0FUIGZNaXRlckxpbWl0KSBjb25zdCA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHIuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzVkMjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHIuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9SRU5ERVJDT05URVhUDQorI2RlZmluZSBfRkRFX1JFTkRFUkNPTlRFWFQNCitjbGFzcyBJRkRFX1BhZ2U7DQorY2xhc3MgSUZERV9SZW5kZXJEZXZpY2U7DQorY2xhc3MgSUZERV9SZW5kZXJDb250ZXh0Ow0KK3ZvaWQJRkRFX0dldFBhZ2VNYXRyaXgoQ0ZYX01hdHJpeCAmcGFnZU1hdHJpeCwgY29uc3QgQ0ZYX1JlY3RGICZkb2NQYWdlUmVjdCwgY29uc3QgQ0ZYX1JlY3QgJmRldmljZVBhZ2VSZWN0LCBGWF9JTlQzMiBpUm90YXRlLCBGWF9EV09SRCBkd0Nvb3JkaW5hdGVzVHlwZSA9IDApOw0KK2VudW0gRkRFX1JFTkRFUlNUQVRVUyB7DQorICAgIEZERV9SRU5ERVJTVEFUVVNfUmVzZXQJCT0gIDAsDQorICAgIEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkCQkJLA0KKyAgICBGREVfUkVOREVSU1RBVFVTX0RvbmUJCQksDQorICAgIEZERV9SRU5ERVJTVEFUVVNfRmFpbGVkCQkJLA0KK307DQorY2xhc3MgSUZERV9SZW5kZXJDb250ZXh0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGREVfUmVuZGVyQ29udGV4dCoJQ3JlYXRlKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU3RhcnRSZW5kZXIoSUZERV9SZW5kZXJEZXZpY2UgKnBSZW5kZXJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCAqcENhbnZhc1NldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXggJnRtRG9jMkRldmljZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gMDsNCisgICAgdmlydHVhbCBGREVfUkVOREVSU1RBVFVTCUdldFN0YXR1cygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGREVfUkVOREVSU1RBVFVTCURvUmVuZGVyKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU3RvcFJlbmRlcigpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcmR2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxZTkyMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1JFTkRFUkRFVklDRQ0KKyNkZWZpbmUgX0ZERV9SRU5ERVJERVZJQ0UNCitjbGFzcyBJRkRFX1BlbjsNCitjbGFzcyBJRkRFX0JydXNoOw0KK2NsYXNzIElGREVfSW1hZ2U7DQorY2xhc3MgQ0ZYX0RJQml0bWFwOw0KK2NsYXNzIENGWF9ESUJTb3VyY2U7DQorY2xhc3MgSUZERV9SZW5kZXJEZXZpY2U7DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9IREVWSUNFU1RBVEUgew0KKyAgICBGWF9MUFZPSUQgcERhdGE7DQorfSAqIEZERV9IREVWSUNFU1RBVEU7DQorY2xhc3MgSUZERV9SZW5kZXJEZXZpY2UNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9SZW5kZXJEZXZpY2UqCUNyZWF0ZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFKTsNCisgICAgc3RhdGljIElGREVfUmVuZGVyRGV2aWNlKglDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0V2lkdGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRIZWlnaHQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRkRFX0hERVZJQ0VTVEFURQlTYXZlU3RhdGUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldENsaXBQYXRoKGNvbnN0IElGREVfUGF0aCAqcENsaXApID0gMDsNCisgICAgdmlydHVhbCBJRkRFX1BhdGgqCQkJR2V0Q2xpcFBhdGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkgPSAwOw0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9SZWN0RiYJR2V0Q2xpcFJlY3QoKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXREcGlYKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0RHBpWSgpIGNvbnN0ID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXggPSBOVUxMLCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1N0cmluZyhJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9JTlQzMiBpQ291bnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdCZXppZXIoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9Qb2ludEYgJnB0MywgY29uc3QgQ0ZYX1BvaW50RiAmcHQ0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0N1cnZlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0VsbGlwc2UoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0xpbmVzKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3TGluZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdQYXRoKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IElGREVfUGF0aCAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UG9seWdvbihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1JlY3RhbmdsZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsQ2xvc2VkQ3VydmUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxQb2x5Z29uKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV90dG8uaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGVhZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV90dG8uaApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9URVhUT1VUDQorI2RlZmluZSBfRkRFX1RFWFRPVVQNCitjbGFzcyBJRkRFX1RleHRPdXQ7DQorI2RlZmluZSBGREVfVFRPU1RZTEVfVW5kZXJsaW5lCQkJMHgwMDAxDQorI2RlZmluZSBGREVfVFRPU1RZTEVfU3RyaWtlb3V0CQkJMHgwMDAyDQorI2RlZmluZSBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQJCTB4MDAwNA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUJCQkweDAwMTANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9FeHBhbmRUYWIJCQkweDAwMjANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9Ib3RLZXkJCQkJMHgwMDQwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfRWxsaXBzaXMJCQkweDAwODANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9MaW5lV3JhcAkJCTB4MDEwMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0FyYWJpY1NoYXBlcwkJMHgwMjAwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfUlRMCQkJCTB4MDQwMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQJCTB4MDgwMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0xhc3RMaW5lSGVpZ2h0CQkweDEwMDANCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdAkJMA0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXIJCTENCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQJCTINCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wQXV0bwkJMw0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0CQk0DQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcgkJCTUNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQJNg0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJBdXRvCQk3DQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQJCTgNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tQ2VudGVyCTkNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQJMTANCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tQXV0bwkJMTENCitjbGFzcyBJRkRFX1RleHRPdXQNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9UZXh0T3V0KglDcmVhdGUoKTsNCisgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0VGV4dENvbG9yKEZYX0FSR0IgY29sb3IpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXMpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRFbGxpcHNpc1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NFbGxpcHNpcykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRBbGlnbm1lbnQoRlhfSU5UMzIgaUFsaWdubWVudCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldExpbmVTcGFjZShGWF9GTE9BVCBmTGluZVNwYWNlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0RElCaXRtYXAoQ0ZYX0RJQml0bWFwICpwRElCKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UgKnBEZXZpY2UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdCAmcnRDbGlwKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1NpemUgJnNpemUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1NpemVGICZzaXplKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJQ2FsY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9SZWN0ICZyZWN0KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJQ2FsY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURyYXdUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJRHJhd1RleHQoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3QgJnJlY3QpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0TG9naWNDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUNhbGNMb2dpY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUNhbGNMb2dpY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURyYXdMb2dpY1RleHQoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlEcmF3TG9naWNUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRUb3RhbExpbmVzKCkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfeG1sLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV94bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGIxMzZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfeG1sLmgKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1hNTA0KKyNkZWZpbmUgX0ZERV9YTUwNCitjbGFzcyBJRkRFX1hNTE5vZGU7DQorY2xhc3MgSUZERV9YTUxJbnN0cnVjdGlvbjsNCitjbGFzcyBJRkRFX1hNTERlY2xhcmF0aW9uOw0KK2NsYXNzIElGREVfWE1MRGVjbENvbW1lbnQ7DQorY2xhc3MgSUZERV9YTUxEZWNsQ2hhckRhdGE7DQorY2xhc3MgSUZERV9YTUxEZWNsRG9jVHlwZTsNCitjbGFzcyBJRkRFX1hNTERlY2xFbGVtZW50Ow0KK2NsYXNzIElGREVfWE1MRGVjbEF0dHJpTGlzdDsNCitjbGFzcyBJRkRFX1hNTERlY2xOb3RpdGlvbjsNCitjbGFzcyBJRkRFX1hNTERlY2xFbnRpdHk7DQorY2xhc3MgSUZERV9YTUxFbGVtZW50Ow0KK2NsYXNzIElGREVfWE1MVGV4dDsNCitjbGFzcyBJRkRFX1hNTERvYzsNCitjbGFzcyBJRkRFX1hNTFBhcnNlcjsNCitjbGFzcyBJRkRFX1hNTFN5bnRheFBhcnNlcjsNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCitlbnVtIEZERV9YTUxOT0RFVFlQRSB7DQorICAgIEZERV9YTUxOT0RFX1Vua25vd24JCQk9ICAwLA0KKyAgICBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbgkJCSwNCisgICAgRkRFX1hNTE5PREVfRWxlbWVudAkJCQksDQorICAgIEZERV9YTUxOT0RFX1RleHQJCQkJLA0KKyAgICBGREVfWE1MTk9ERV9DaGFyRGF0YQkJCSwNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GREVfWE1MTk9ERSB7DQorICAgIEZYX0lOVDMyCQlpTm9kZU51bTsNCisgICAgRkRFX1hNTE5PREVUWVBFCWVOb2RlVHlwZTsNCit9IEZERV9YTUxOT0RFLCAqIEZERV9MUFhNTE5PREU7DQordHlwZWRlZiBGREVfWE1MTk9ERSBjb25zdCAqIEZERV9MUENYTUxOT0RFOw0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8RkRFX1hNTE5PREU+IENGREVfWE1MTm9kZVN0YWNrOw0KK0ZYX0JPT0wJCUZERV9Jc1hNTFZhbGlkQ2hhcihGWF9XQ0hBUiBjaCk7DQorRlhfQk9PTAkJRkRFX0lzWE1MV2hpdGVTcGFjZShGWF9XQ0hBUiBjaCk7DQorRlhfQk9PTAkJRkRFX0lzWE1MTmFtZUNoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgYkZpcnN0Q2hhcik7DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KK2NsYXNzIElGREVfWE1MTm9kZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFCUdldFR5cGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUNvdW50Q2hpbGROb2RlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBJRkRFX1hNTE5vZGUqCUdldENoaWxkTm9kZShGWF9JTlQzMiBpbmRleCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRDaGlsZE5vZGVJbmRleChJRkRFX1hNTE5vZGUgKnBOb2RlKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9YTUxOb2RlKglHZXRQYXRoKEZYX0xQQ1dTVFIgcFBhdGgsIEZYX0lOVDMyIGlMZW5ndGggPSAtMSwgRlhfQk9PTCBiUXVhbGlmaWVkTmFtZSA9IFRSVUUpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJSW5zZXJ0Q2hpbGROb2RlKElGREVfWE1MTm9kZSAqcE5vZGUsIEZYX0lOVDMyIGluZGV4ID0gLTEpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlQ2hpbGROb2RlKElGREVfWE1MTm9kZSAqcE5vZGUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJRGVsZXRlQ2hpbGRyZW4oKSA9IDA7DQorICAgIGVudW0gTm9kZUl0ZW0ge1Jvb3QgPSAwLCBQYXJlbnQsIEZpcnN0U2libGluZywgUHJpb3JTaWJsaW5nLCBOZXh0U2libGluZywgTGFzdFNpYmxpbmcsIEZpcnN0TmVpZ2hib3IsIFByaW9yTmVpZ2hib3IsIE5leHROZWlnaGJvciwgTGFzdE5laWdoYm9yLCBGaXJzdENoaWxkLCBMYXN0Q2hpbGR9Ow0KKyAgICB2aXJ0dWFsIElGREVfWE1MTm9kZSoJR2V0Tm9kZUl0ZW0oTm9kZUl0ZW0gZUl0ZW0pIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0Tm9kZUxldmVsKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJbnNlcnROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtLCBJRkRFX1hNTE5vZGUgKnBOb2RlKSA9IDA7DQorICAgIHZpcnR1YWwJSUZERV9YTUxOb2RlKglSZW1vdmVOb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9YTUxOb2RlKglDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpID0gMDsNCisgICAgdmlydHVhbAl2b2lkCQkJU2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSkgPSAwOw0KK307DQorY2xhc3MgSUZERV9YTUxJbnN0cnVjdGlvbiA6IHB1YmxpYyBJRkRFX1hNTE5vZGUNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9YTUxJbnN0cnVjdGlvbioJQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlDb3VudEF0dHJpYnV0ZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEF0dHJpYnV0ZShGWF9JTlQzMiBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0F0dHJpYnV0ZShGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRTdHJpbmcoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUsIEZYX0xQQ1dTVFIgcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SW50ZWdlcihGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfSU5UMzIgaURlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRJbnRlZ2VyKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBGWF9JTlQzMiBpQXR0cmlWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQlHZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkRlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlQXR0cmlidXRlKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUNvdW50RGF0YSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0RGF0YShGWF9JTlQzMiBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBcHBlbmREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlRGF0YShGWF9JTlQzMiBpbmRleCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9YTUxFbGVtZW50IDogcHVibGljIElGREVfWE1MTm9kZQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX1hNTEVsZW1lbnQqCUNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUYWcpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhZykgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRMb2NhbFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyAmd3NQcmVmaXgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0TmFtZXNwYWNlVVJJKENGWF9XaWRlU3RyaW5nICZ3c05hbWVzcGFjZSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlDb3VudEF0dHJpYnV0ZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEF0dHJpYnV0ZShGWF9JTlQzMiBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0F0dHJpYnV0ZShGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRTdHJpbmcoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUsIEZYX0xQQ1dTVFIgcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SW50ZWdlcihGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfSU5UMzIgaURlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRJbnRlZ2VyKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBGWF9JTlQzMiBpQXR0cmlWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQlHZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkRlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlQXR0cmlidXRlKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VGV4dERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9YTUxUZXh0IDogcHVibGljIElGREVfWE1MTm9kZQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX1hNTFRleHQqCUNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9YTUxEZWNsYXJhdGlvbiA6IHB1YmxpYyBJRkRFX1hNTE5vZGUNCit7DQorcHVibGljOg0KK307DQorY2xhc3MgSUZERV9YTUxDaGFyRGF0YSA6IHB1YmxpYyBJRkRFX1hNTERlY2xhcmF0aW9uDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGREVfWE1MQ2hhckRhdGEqCUNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDRGF0YSk7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRDaGFyRGF0YShDRlhfV2lkZVN0cmluZyAmd3NDRGF0YSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Q2hhckRhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQ0RhdGEpID0gMDsNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GREVfWE1MUkVBREVSSEFORExFUiB7DQorICAgIEZYX0xQVk9JRCBwRGF0YTsNCisNCisgICAgdm9pZAkoKk9uVGFnRW50ZXIpKF9GREVfWE1MUkVBREVSSEFORExFUiAqcFRoaXMsIEZERV9YTUxOT0RFVFlQRSBlVHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFnTmFtZSk7DQorICAgIHZvaWQJKCpPblRhZ0JyZWFrKShfRkRFX1hNTFJFQURFUkhBTkRMRVIgKnBUaGlzLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUYWdOYW1lKTsNCisgICAgdm9pZAkoKk9uVGFnQ2xvc2UpKF9GREVfWE1MUkVBREVSSEFORExFUiAqcFRoaXMsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhZ05hbWUpOw0KKyAgICB2b2lkCSgqT25BdHRyaWJ1dGUpKF9GREVfWE1MUkVBREVSSEFORExFUiAqcFRoaXMsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKTsNCisgICAgdm9pZAkoKk9uRGF0YSkoX0ZERV9YTUxSRUFERVJIQU5ETEVSICpwVGhpcywgRkRFX1hNTE5PREVUWVBFIGVUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSk7DQorfSBGREVfWE1MUkVBREVSSEFORExFUiwgKiBGREVfTFBYTUxSRUFERVJIQU5ETEVSOw0KK2NsYXNzIElGREVfWE1MRG9jDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGREVfWE1MRG9jKgkJQ3JlYXRlKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRYTUwoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSwgRlhfSU5UMzIgaVhNTFBsYW5lU2l6ZSA9IDgxOTIsIEZYX0lOVDMyIGlUZXh0RGF0YVNpemUgPSAyNTYsIEZERV9MUFhNTFJFQURFUkhBTkRMRVIgcEhhbmRsZXIgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRYTUwoSUZERV9YTUxQYXJzZXIgKnBYTUxQYXJzZXIpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJRG9Mb2FkKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlDbG9zZVhNTCgpID0gMDsNCisgICAgdmlydHVhbCBJRkRFX1hNTE5vZGUqCUdldFJvb3QoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNhdmVYTUwoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSA9IE5VTEwsIEZYX0JPT0wgYlNhdmVCT00gPSBUUlVFKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSAqcE5vZGUpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfWE1MUGFyc2VyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbAl2b2lkCQkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlEb1BhcnNlcihJRlhfUGF1c2UgKnBQYXVzZSkgPSAwOw0KK307DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUJCQkJMHgwMA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbk9wZW4JCTB4MDENCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZQkweDAyDQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuCQkJMHgwMw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWsJCTB4MDQNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlCQkweDA1DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWUJCQkweDA2DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWUJCQkJMHgwNw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWUJCQkweDA4DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWUJCQkweDA5DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RleHQJCQkJMHgwQQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YQkJCQkweDBCDQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGEJCQkweDBDDQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yCQkJCTB4RkUNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TCQkJCQkweEZGDQorY2xhc3MgSUZERV9YTUxTeW50YXhQYXJzZXINCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9YTUxTeW50YXhQYXJzZXIqCUNyZWF0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlJbml0KElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0lOVDMyIGlYTUxQbGFuZVNpemUsIEZYX0lOVDMyIGlUZXh0RGF0YVNpemUgPSAyNTYpID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJRG9TeW50YXhQYXJzZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0U3RhdHVzKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRDdXJyZW50UG9zKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRDdXJyZW50QmluYXJ5UG9zKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRDdXJyZW50Tm9kZU51bWJlcigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0TGFzdE5vZGVOdW1iZXIoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhcmdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFyZ2V0KSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldEF0dHJpYnV0ZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldEF0dHJpYnV0ZVZhbHVlKENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXREYXRhKENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpIGNvbnN0ID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZmMjdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzY2FjaGUuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmZGVfY3NzY2FjaGUuaCINCitfRkRFX0NTU0NBQ0hFSVRFTTo6X0ZERV9DU1NDQUNIRUlURU0oSUZERV9DU1NTdHlsZVNoZWV0ICpwKQ0KKyAgICA6IHBTdHlsZXNoZWV0KHApDQorICAgICwgZHdBY3Rpdml0eSgwKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHlsZXNoZWV0KTsNCisgICAgcFN0eWxlc2hlZXQtPkFkZFJlZigpOw0KK30NCitfRkRFX0NTU0NBQ0hFSVRFTTo6fl9GREVfQ1NTQ0FDSEVJVEVNKCkNCit7DQorICAgIHBTdHlsZXNoZWV0LT5SZWxlYXNlKCk7DQorfQ0KK0lGREVfQ1NTU3R5bGVTaGVldENhY2hlKiBJRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGREVfTmV3IENGREVfQ1NTU3R5bGVTaGVldENhY2hlOw0KK30NCitDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6Q0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKQ0KKyAgICA6IG1fcEZpeGVkU3RvcmUoTlVMTCkNCisgICAgLCBtX2lNYXhJdGVtcyg1KQ0KK3sNCit9DQorQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGU6On5DRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSgpDQorew0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1N0eWxlc2hlZXRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgaWYgKHBvcyAhPSBOVUxMKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzektleTsNCisgICAgICAgIEZYX0xQVk9JRCBwVmFsdWU7DQorICAgICAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgICAgICAgICBtX1N0eWxlc2hlZXRzLkdldE5leHRBc3NvYyhwb3MsIHN6S2V5LCBwVmFsdWUpOw0KKyAgICAgICAgICAgIEZERV9EZWxldGVXaXRoKEZERV9DU1NDQUNIRUlURU0sIG1fcEZpeGVkU3RvcmUsIChGREVfTFBDU1NDQUNIRUlURU0pcFZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fU3R5bGVzaGVldHMuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEZpeGVkU3RvcmUgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wRml4ZWRTdG9yZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGU6OkFkZFN0eWxlU2hlZXQoRlhfQlNUUiBzektleSwgSUZERV9DU1NTdHlsZVNoZWV0ICpwU3R5bGVTaGVldCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwU3R5bGVTaGVldCAhPSBOVUxMKTsNCisgICAgaWYgKG1fcEZpeGVkU3RvcmUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRml4ZWRTdG9yZSA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfRml4ZWQsIEZYX01BWCgxMCwgbV9pTWF4SXRlbXMpLCBzaXplb2YoRkRFX0NTU0NBQ0hFSVRFTSkpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcEZpeGVkU3RvcmUgIT0gTlVMTCk7DQorICAgIH0NCisgICAgRlhfTFBWT0lEIHBWYWx1ZSA9IE5VTEw7DQorICAgIGlmIChtX1N0eWxlc2hlZXRzLkxvb2t1cChzektleSwgcFZhbHVlKSkgew0KKyAgICAgICAgRkRFX0xQQ1NTQ0FDSEVJVEVNIHBJdGVtID0gKEZERV9MUENTU0NBQ0hFSVRFTSlwVmFsdWU7DQorICAgICAgICBpZiAocEl0ZW0tPnBTdHlsZXNoZWV0ICE9IHBTdHlsZVNoZWV0KSB7DQorICAgICAgICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0ID0gcFN0eWxlU2hlZXQ7DQorICAgICAgICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5BZGRSZWYoKTsNCisgICAgICAgICAgICBwSXRlbS0+ZHdBY3Rpdml0eSA9IDA7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAobV9TdHlsZXNoZWV0cy5HZXRDb3VudCgpID49IG1faU1heEl0ZW1zKSB7DQorICAgICAgICAgICAgUmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCk7DQorICAgICAgICB9DQorICAgICAgICBGREVfTFBDU1NDQUNIRUlURU0gcEl0ZW0gPSBGREVfTmV3V2l0aChtX3BGaXhlZFN0b3JlKSBGREVfQ1NTQ0FDSEVJVEVNKHBTdHlsZVNoZWV0KTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwSXRlbSAhPSBOVUxMKTsNCisgICAgICAgIG1fU3R5bGVzaGVldHMuU2V0QXQoc3pLZXksIHBJdGVtKTsNCisgICAgfQ0KK30NCitJRkRFX0NTU1N0eWxlU2hlZXQqIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpHZXRTdHlsZVNoZWV0KEZYX0JTVFIgc3pLZXkpIGNvbnN0DQorew0KKyAgICBGWF9MUFZPSUQgcFZhbHVlID0gTlVMTDsNCisgICAgaWYgKG1fU3R5bGVzaGVldHMuTG9va3VwKHN6S2V5LCBwVmFsdWUpKSB7DQorICAgICAgICBGREVfTFBDU1NDQUNIRUlURU0gcEl0ZW0gPSAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZTsNCisgICAgICAgIHBJdGVtLT5kd0FjdGl2aXR5Kys7DQorICAgICAgICBwSXRlbS0+cFN0eWxlc2hlZXQtPkFkZFJlZigpOw0KKyAgICAgICAgcmV0dXJuIHBJdGVtLT5wU3R5bGVzaGVldDsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6UmVtb3ZlU3R5bGVTaGVldChGWF9CU1RSIHN6S2V5KQ0KK3sNCisgICAgRlhfTFBWT0lEIHBWYWx1ZSA9IE5VTEw7DQorICAgIGlmICghbV9TdHlsZXNoZWV0cy5Mb29rdXAoc3pLZXksIHBWYWx1ZSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGREVfRGVsZXRlV2l0aChGREVfQ1NTQ0FDSEVJVEVNLCBtX3BGaXhlZFN0b3JlLCAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZSk7DQorICAgIG1fU3R5bGVzaGVldHMuUmVtb3ZlS2V5KHN6S2V5KTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6UmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCkNCit7DQorICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fU3R5bGVzaGVldHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzektleTsNCisgICAgRlhfTFBWT0lEIHBWYWx1ZTsNCisgICAgRkRFX0xQQ1NTQ0FDSEVJVEVNIHBJdGVtID0gTlVMTDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pJdGVtOw0KKyAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgICAgIG1fU3R5bGVzaGVldHMuR2V0TmV4dEFzc29jKHBvcywgc3pLZXksIHBWYWx1ZSk7DQorICAgICAgICBzd2l0Y2ggKHN6S2V5LkdldElEKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnIycsICdVJywgJ1MnLCAnRScpOg0KKyAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCcjJywgJ0EnLCAnRycsICdFJyk6DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRkRFX0xQQ1NTQ0FDSEVJVEVNIHAgPSAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZTsNCisgICAgICAgIGlmIChwSXRlbSA9PSBOVUxMIHx8IHBJdGVtLT5kd0FjdGl2aXR5ID4gcC0+ZHdBY3Rpdml0eSkgew0KKyAgICAgICAgICAgIHN6SXRlbSA9IHN6S2V5Ow0KKyAgICAgICAgICAgIHBJdGVtID0gcDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEl0ZW0gIT0gTlVMTCkgew0KKyAgICAgICAgRkRFX0RlbGV0ZVdpdGgoRkRFX0NTU0NBQ0hFSVRFTSwgbV9wRml4ZWRTdG9yZSwgcEl0ZW0pOw0KKyAgICAgICAgbV9TdHlsZXNoZWV0cy5SZW1vdmVLZXkoc3pJdGVtKTsNCisgICAgfQ0KK30NCitfRkRFX0NTU1RBR0NBQ0hFOjpfRkRFX0NTU1RBR0NBQ0hFKF9GREVfQ1NTVEFHQ0FDSEUgKnBhcmVudCwgSUZERV9DU1NUYWdQcm92aWRlciAqdGFnKQ0KKyAgICA6IHBUYWcodGFnKQ0KKyAgICAsIHBQYXJlbnQocGFyZW50KQ0KKyAgICAsIGR3SURIYXNoKDApDQorICAgICwgZHdUYWdIYXNoKDApDQorICAgICwgaUNsYXNzSW5kZXgoMCkNCisgICAgLCBkd0NsYXNzSGFzaHMoMSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwVGFnICE9IE5VTEwpOw0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSwgd3NOYW1lID0gcFRhZy0+R2V0VGFnTmFtZSgpOw0KKyAgICBkd1RhZ0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBUYWctPkdldEZpcnN0QXR0cmlidXRlKCk7DQorICAgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KKyAgICAgICAgcFRhZy0+R2V0TmV4dEF0dHJpYnV0ZShwb3MsIHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgICAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIHNfZHdJREhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoRlhfTFBDV1NUUilMImlkIiwgMiwgVFJVRSk7DQorICAgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd0NsYXNzSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKChGWF9MUENXU1RSKUwiY2xhc3MiLCA1LCBUUlVFKTsNCisgICAgICAgIGlmIChkd05hbWVIYXNoID09IHNfZHdDbGFzc0hhc2gpIHsNCisgICAgICAgICAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1ZhbHVlLkdldFB0cigpLCB3c1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICBkd0NsYXNzSGFzaHMuQWRkKGR3SGFzaCk7DQorICAgICAgICB9IGVsc2UgaWYgKGR3TmFtZUhhc2ggPT0gc19kd0lESGFzaCkgew0KKyAgICAgICAgICAgIGR3SURIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorX0ZERV9DU1NUQUdDQUNIRTo6X0ZERV9DU1NUQUdDQUNIRShjb25zdCBfRkRFX0NTU1RBR0NBQ0hFICZpdCkNCisgICAgOiBwVGFnKGl0LnBUYWcpDQorICAgICwgcFBhcmVudChpdC5wUGFyZW50KQ0KKyAgICAsIGR3SURIYXNoKGl0LmR3SURIYXNoKQ0KKyAgICAsIGR3VGFnSGFzaChpdC5kd1RhZ0hhc2gpDQorICAgICwgaUNsYXNzSW5kZXgoMCkNCisgICAgLCBkd0NsYXNzSGFzaHMoMSkNCit7DQorICAgIGlmIChpdC5kd0NsYXNzSGFzaHMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgZHdDbGFzc0hhc2hzLkNvcHkoaXQuZHdDbGFzc0hhc2hzKTsNCisgICAgfQ0KK30NCit2b2lkIENGREVfQ1NTQWNjZWxlcmF0b3I6Ok9uRW50ZXJUYWcoSUZERV9DU1NUYWdQcm92aWRlciAqcFRhZykNCit7DQorICAgIEZERV9DU1NUQUdDQUNIRSAqcFRvcCA9IEdldFRvcEVsZW1lbnQoKTsNCisgICAgRkRFX0NTU1RBR0NBQ0hFIGl0ZW0ocFRvcCwgcFRhZyk7DQorICAgIG1fU3RhY2suUHVzaChpdGVtKTsNCit9DQordm9pZCBDRkRFX0NTU0FjY2VsZXJhdG9yOjpPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpDQorew0KKyAgICBGREVfQ1NTVEFHQ0FDSEUgKnBJdGVtID0gbV9TdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgIEZYU1lTX2Fzc2VydChwSXRlbSAmJiBwSXRlbS0+R2V0VGFnKCkgPT0gcFRhZyk7DQorICAgIG1fU3RhY2suUG9wKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjhjZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0NTU0NBQ0hFDQorI2RlZmluZSBfRkRFX0NTU0NBQ0hFDQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NDQUNIRUlURU0gOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorICAgIF9GREVfQ1NTQ0FDSEVJVEVNKElGREVfQ1NTU3R5bGVTaGVldCAqcCk7DQorICAgIH5fRkRFX0NTU0NBQ0hFSVRFTSgpOw0KKyAgICBJRkRFX0NTU1N0eWxlU2hlZXQJCQkJKnBTdHlsZXNoZWV0Ow0KKyAgICBGWF9EV09SRAkJCQkJCWR3QWN0aXZpdHk7DQorfSBGREVfQ1NTQ0FDSEVJVEVNLCAqIEZERV9MUENTU0NBQ0hFSVRFTTsNCitjbGFzcyBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSA6IHB1YmxpYyBJRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSwgcHVibGljIENGWF9UaHJlYWRMb2NrLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTU3R5bGVTaGVldENhY2hlKCk7DQorICAgIH5DRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNYXhJdGVtcyhGWF9JTlQzMiBpTWF4Q291bnQgPSA1KQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQoaU1heENvdW50ID49IDMpOw0KKyAgICAgICAgbV9pTWF4SXRlbXMgPSBpTWF4Q291bnQ7DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQkJCQlBZGRTdHlsZVNoZWV0KEZYX0JTVFIgc3pLZXksIElGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQpOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTU3R5bGVTaGVldCoJCUdldFN0eWxlU2hlZXQoRlhfQlNUUiBzektleSkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJUmVtb3ZlU3R5bGVTaGVldChGWF9CU1RSIHN6S2V5KTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJCQkJUmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCk7DQorICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJCQltX1N0eWxlc2hlZXRzOw0KKyAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BGaXhlZFN0b3JlOw0KKyAgICBGWF9JTlQzMgkJCQkJCW1faU1heEl0ZW1zOw0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NUQUdDQUNIRSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCitwdWJsaWM6DQorICAgIF9GREVfQ1NTVEFHQ0FDSEUoX0ZERV9DU1NUQUdDQUNIRSAqcGFyZW50LCBJRkRFX0NTU1RhZ1Byb3ZpZGVyICp0YWcpOw0KKyAgICBfRkRFX0NTU1RBR0NBQ0hFKGNvbnN0IF9GREVfQ1NTVEFHQ0FDSEUgJml0KTsNCisgICAgX0ZERV9DU1NUQUdDQUNIRSoJCQkJR2V0UGFyZW50KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBQYXJlbnQ7DQorICAgIH0NCisgICAgSUZERV9DU1NUYWdQcm92aWRlcioJCQlHZXRUYWcoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gcFRhZzsNCisgICAgfQ0KKyAgICBGWF9EV09SRAkJCQkJCUhhc2hJRCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBkd0lESGFzaDsNCisgICAgfQ0KKyAgICBGWF9EV09SRAkJCQkJCUhhc2hUYWcoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gZHdUYWdIYXNoOw0KKyAgICB9DQorICAgIEZYX0lOVDMyCQkJCQkJQ291bnRIYXNoQ2xhc3MoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gZHdDbGFzc0hhc2hzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICB2b2lkCQkJCQkJCVNldENsYXNzSW5kZXgoRlhfSU5UMzIgaW5kZXgpDQorICAgIHsNCisgICAgICAgIGlDbGFzc0luZGV4ID0gaW5kZXg7DQorICAgIH0NCisgICAgRlhfRFdPUkQJCQkJCQlIYXNoQ2xhc3MoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gaUNsYXNzSW5kZXggPCBkd0NsYXNzSGFzaHMuR2V0U2l6ZSgpID8gZHdDbGFzc0hhc2hzLkdldEF0KGlDbGFzc0luZGV4KSA6IDA7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIElGREVfQ1NTVGFnUHJvdmlkZXIJCQkJKnBUYWc7DQorICAgIF9GREVfQ1NTVEFHQ0FDSEUJCQkJKnBQYXJlbnQ7DQorICAgIEZYX0RXT1JECQkJCQkJZHdJREhhc2g7DQorICAgIEZYX0RXT1JECQkJCQkJZHdUYWdIYXNoOw0KKyAgICBGWF9JTlQzMgkJCQkJCWlDbGFzc0luZGV4Ow0KKyAgICBDRkRFX0RXb3JkQXJyYXkJCQkJCWR3Q2xhc3NIYXNoczsNCit9IEZERV9DU1NUQUdDQUNIRSwgKiBGREVfTFBDU1NUQUdDQUNIRTsNCit0eXBlZGVmIENGWF9PYmplY3RTdGFja1RlbXBsYXRlPEZERV9DU1NUQUdDQUNIRT4gQ0ZERV9DU1NUYWdTdGFjazsNCitjbGFzcyBDRkRFX0NTU0FjY2VsZXJhdG9yIDogcHVibGljIElGREVfQ1NTQWNjZWxlcmF0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCQkJCQlPbkVudGVyVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCU9uTGVhdmVUYWcoSUZERV9DU1NUYWdQcm92aWRlciAqcFRhZyk7DQorICAgIHZvaWQJCQkJCQkJQ2xlYXIoKQ0KKyAgICB7DQorICAgICAgICBtX1N0YWNrLlJlbW92ZUFsbCgpOw0KKyAgICB9DQorICAgIEZERV9MUENTU1RBR0NBQ0hFCQkJCUdldFRvcEVsZW1lbnQoKQljb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9TdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIENGREVfQ1NTVGFnU3RhY2sJCQkJbV9TdGFjazsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDliMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwCkBAIC0wLDAgKzEsNzI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmZGVfY3NzZGF0YXRhYmxlLmgiDQorI2lmZGVmIF9jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisgICAgRlhfQk9PTCBGREVfQ1NTTGVuZ3RoVG9GbG9hdChjb25zdCBGREVfQ1NTTEVOR1RIICZsZW4sIEZYX0ZMT0FUIGZQZXJjZW50QmFzZSwgRlhfRkxPQVQgJmZSZXN1bHQpDQorICAgIHsNCisgICAgICAgIHN3aXRjaCAobGVuLkdldFVuaXQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQ6DQorICAgICAgICAgICAgICAgIGZSZXN1bHQgPSBsZW4uR2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTTEVOR1RIVU5JVF9QZXJjZW50Og0KKyAgICAgICAgICAgICAgICBmUmVzdWx0ID0gbGVuLkdldFZhbHVlKCkgKiBmUGVyY2VudEJhc2U7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfRmxvYXRSZWN0IEZERV9DU1NCb3VuZGFyeVRvUmVjdChJRkRFX0NTU0JvdW5kYXJ5U3R5bGUgKnBCb3VuZFN0eWxlLCBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGgsIEZYX0JPT0wgYlBhZGRpbmcsIEZYX0JPT0wgYkJvcmRlciwgRlhfQk9PTCBiTWFyZ2luKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocEJvdW5kU3R5bGUgIT0gTlVMTCk7DQorICAgICAgICBGWF9GTE9BVCBmUmVzdWx0Ow0KKyAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QgKnBSZWN0Ow0KKyAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgaWYgKGJQYWRkaW5nKSB7DQorICAgICAgICAgICAgcFJlY3QgPSBwQm91bmRTdHlsZS0+R2V0UGFkZGluZ1dpZHRoKCk7DQorICAgICAgICAgICAgaWYgKHBSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5sZWZ0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gZlJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnRvcCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gZlJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnJpZ2h0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ICs9IGZSZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5ib3R0b20sIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tICs9IGZSZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkJvcmRlcikgew0KKyAgICAgICAgICAgIHBSZWN0ID0gcEJvdW5kU3R5bGUtPkdldEJvcmRlcldpZHRoKCk7DQorICAgICAgICAgICAgaWYgKHBSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5sZWZ0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gZlJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnRvcCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gZlJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnJpZ2h0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ICs9IGZSZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5ib3R0b20sIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tICs9IGZSZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYk1hcmdpbikgew0KKyAgICAgICAgICAgIHBSZWN0ID0gcEJvdW5kU3R5bGUtPkdldE1hcmdpbldpZHRoKCk7DQorICAgICAgICAgICAgaWYgKHBSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5sZWZ0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gZlJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnRvcCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gZlJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnJpZ2h0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ICs9IGZSZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5ib3R0b20sIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tICs9IGZSZXN1bHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVjdDsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBGREVfQ1NTRm9udFN0eWxlVG9GREUoSUZERV9DU1NGb250U3R5bGUgKnBGb250U3R5bGUpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwRm9udFN0eWxlICE9IE5VTEwpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGUgPSBGWF9GT05UU1RZTEVfTm9ybWFsOw0KKyAgICAgICAgaWYgKHBGb250U3R5bGUtPkdldEZvbnRTdHlsZSgpID09IEZERV9DU1NGT05UU1RZTEVfSXRhbGljKSB7DQorICAgICAgICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRm9udFN0eWxlLT5HZXRGb250V2VpZ2h0KCkgPj0gNzAwKSB7DQorICAgICAgICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZHdGb250U3R5bGU7DQorICAgIH0NCisgICAgc3RhdGljIGNvbnN0IEZERV9DU1NQUk9QRVJUWVRBQkxFIGdfRkRFX0NTU1Byb3BlcnRpZXNbXSA9IHsNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfV3JpdGluZ01vZGUsCShGWF9MUENXU1RSKUwid3JpdGluZy1tb2RlIiwJMHgwMTg3ODA3NiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVXaWR0aCwJKEZYX0xQQ1dTVFIpTCJjb2x1bW4tcnVsZS13aWR0aCIsCTB4MDIwMEZCMDAsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdCwJKEZYX0xQQ1dTVFIpTCJib3JkZXItbGVmdCIsCTB4MDQwODAwMzYsCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZSwJKEZYX0xQQ1dTVFIpTCJjb2x1bW4tcnVsZSIsCTB4MDRDODNERjMsCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0LAkoRlhfTFBDV1NUUilMImhlaWdodCIsCTB4MDVBNUM1MTksCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ291bnRlclJlc2V0LAkoRlhfTFBDV1NUUilMImNvdW50ZXItcmVzZXQiLAkweDA4OTRGOUIwLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29udGVudCwJKEZYX0xQQ1dTVFIpTCJjb250ZW50IiwJMHgwOTdCRTkxQiwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZ30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1J1YnlQb3NpdGlvbiwJKEZYX0xQQ1dTVFIpTCJydWJ5LXBvc2l0aW9uIiwJMHgwOUFDRDAyNCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRDb2xvciwJKEZYX0xQQ1dTVFIpTCJiYWNrZ3JvdW5kLWNvbG9yIiwJMHgwOUU4RThBQywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1dpZHRoLAkoRlhfTFBDV1NUUilMIndpZHRoIiwJMHgwQThBOEY4MCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9TcmMsCShGWF9MUENXU1RSKUwic3JjIiwJMHgwQkQzNzA0OCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVG9wLAkoRlhfTFBDV1NUUilMInRvcCIsCTB4MEJFREFGMzMsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luLAkoRlhfTFBDV1NUUilMIm1hcmdpbiIsCTB4MENCMDE2QkUsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckNvbG9yLAkoRlhfTFBDV1NUUilMImJvcmRlci1jb2xvciIsCTB4MENCQjUyOEEsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfV2lkb3dzLAkoRlhfTFBDV1NUUilMIndpZG93cyIsCTB4MTAyNkM1OUQsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLAkoRlhfTFBDV1NUUilMImJvcmRlci1ib3R0b20tY29sb3IiLAkweDEyMUUyMkVDLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dEluZGVudCwJKEZYX0xQQ1dTVFIpTCJ0ZXh0LWluZGVudCIsCTB4MTY5QURCNzQsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1JpZ2h0LAkoRlhfTFBDV1NUUilMInJpZ2h0IiwJMHgxOTNBREUzRSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXNTdHlsZSwJKEZYX0xQQ1dTVFIpTCJ0ZXh0LWVtcGhhc2lzLXN0eWxlIiwJMHgyMERCQUY0QSwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsCShGWF9MUENXU1RSKUwicGFkZGluZy1sZWZ0IiwJMHgyMjhDRjAyRiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uV2lkdGgsCShGWF9MUENXU1RSKUwiY29sdW1uLXdpZHRoIiwJMHgyNEM5QUM5QiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5MZWZ0LAkoRlhfTFBDV1NUUilMIm1hcmdpbi1sZWZ0IiwJMHgyOTdDNTY1NiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXIsCShGWF9MUENXU1RSKUwiYm9yZGVyIiwJMHgyQTIzMzQ5RSwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3AsCShGWF9MUENXU1RSKUwiYm9yZGVyLXRvcCIsCTB4MkI4NjZBREUsCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieU92ZXJoYW5nLAkoRlhfTFBDV1NUUilMInJ1Ynktb3ZlcmhhbmciLAkweDJDQ0EwRDg5LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQmVmb3JlLAkoRlhfTFBDV1NUUilMInBhZ2UtYnJlYWstYmVmb3JlIiwJMHgzMTE5QjM2RiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX01heEhlaWdodCwJKEZYX0xQQ1dTVFIpTCJtYXgtaGVpZ2h0IiwJMHgzNDM1OTdFQywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTWluV2lkdGgsCShGWF9MUENXU1RSKUwibWluLXdpZHRoIiwJMHgzNTgzMjg3MSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdENvbG9yLAkoRlhfTFBDV1NUUilMImJvcmRlci1sZWZ0LWNvbG9yIiwJMHgzNUM2NDAyMiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvdHRvbSwJKEZYX0xQQ1dTVFIpTCJib3R0b20iLAkweDM5OUYwMkI1LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1F1b3RlcywJKEZYX0xQQ1dTVFIpTCJxdW90ZXMiLAkweDNEOEM2QTAxLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTWF4V2lkdGgsCShGWF9MUENXU1RSKUwibWF4LXdpZHRoIiwJMHgzRUEyNzRGMywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LAkoRlhfTFBDV1NUUilMInBhZGRpbmctcmlnaHQiLAkweDNGNjE2QUMyLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVJbWFnZSwJKEZYX0xQQ1dTVFIpTCJsaXN0LXN0eWxlLWltYWdlIiwJMHg0MkE4QTg2QSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkl9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9XaGl0ZVNwYWNlLAkoRlhfTFBDV1NUUilMIndoaXRlLXNwYWNlIiwJMHg0MkYwNDI5QSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbSwJKEZYX0xQQ1dTVFIpTCJib3JkZXItYm90dG9tIiwJMHg0NTJDRTc4MCwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVUeXBlLAkoRlhfTFBDV1NUUilMImxpc3Qtc3R5bGUtdHlwZSIsCTB4NDgwOTQ3ODksCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Xb3JkQnJlYWssCShGWF9MUENXU1RSKUwid29yZC1icmVhayIsCTB4NEQ3NEEzQ0UsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1gsCShGWF9MUENXU1RSKUwib3ZlcmZsb3cteCIsCTB4NEVDRUJGOTksCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1ksCShGWF9MUENXU1RSKUwib3ZlcmZsb3cteSIsCTB4NEVDRUJGOUEsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwJKEZYX0xQQ1dTVFIpTCJib3JkZXItdG9wLWNvbG9yIiwJMHg1MTA5QjhDQSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnRGYW1pbHksCShGWF9MUENXU1RSKUwiZm9udC1mYW1pbHkiLAkweDU3NDY4NkU2LAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ3Vyc29yLAkoRlhfTFBDV1NUUilMImN1cnNvciIsCTB4NTlERkNBNUUsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZ30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1J1YnlBbGlnbiwJKEZYX0xQQ1dTVFIpTCJydWJ5LWFsaWduIiwJMHg2MDc3QkRGQSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVDb2xvciwJKEZYX0xQQ1dTVFIpTCJjb2x1bW4tcnVsZS1jb2xvciIsCTB4NjVEREZEOUYsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Gb250V2VpZ2h0LAkoRlhfTFBDV1NUUilMImZvbnQtd2VpZ2h0IiwJMHg2NjkyRjYwQywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLAkoRlhfTFBDV1NUUilMImJvcmRlci1yaWdodC1zdHlsZSIsCTB4NjkyMEREQTcsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NaW5IZWlnaHQsCShGWF9MUENXU1RSKUwibWluLWhlaWdodCIsCTB4NkFBRTMxMkEsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NvbG9yLAkoRlhfTFBDV1NUUilMImNvbG9yIiwJMHg2RTY3OTIxRiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0xldHRlclNwYWNpbmcsCShGWF9MUENXU1RSKUwibGV0dGVyLXNwYWNpbmciLAkweDcwNTM2MTAyLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0VtcHR5Q2VsbHMsCShGWF9MUENXU1RSKUwiZW1wdHktY2VsbHMiLAkweDc1MzE1MjhGLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dEFsaWduLAkoRlhfTFBDV1NUUilMInRleHQtYWxpZ24iLAkweDc1NTNGMUJELAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieVNwYW4sCShGWF9MUENXU1RSKUwicnVieS1zcGFuIiwJMHg3NkZDRkNFMSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVGdW5jdGlvbn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1Bvc2l0aW9uLAkoRlhfTFBDV1NUUilMInBvc2l0aW9uIiwJMHg4MTRGODJCNSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclN0eWxlLAkoRlhfTFBDV1NUUilMImJvcmRlci1zdHlsZSIsCTB4ODJBNENENUMsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tU3R5bGUsCShGWF9MUENXU1RSKUwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsCTB4ODgwNzlEQkUsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJDb2xsYXBzZSwJKEZYX0xQQ1dTVFIpTCJib3JkZXItY29sbGFwc2UiLAkweDg4ODNDN0ZFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uQ291bnQsCShGWF9MUENXU1RSKUwiY29sdW1uLWNvdW50IiwJMHg4OTkzNkE2NCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFdpZHRoLAkoRlhfTFBDV1NUUilMImJvcmRlci1yaWdodC13aWR0aCIsCTB4OEY1QTYwMzYsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVW5pY29kZUJpZGksCShGWF9MUENXU1RSKUwidW5pY29kZS1iaWRpIiwJMHg5MTY3MEY2QywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ24sCShGWF9MUENXU1RSKUwidmVydGljYWwtYWxpZ24iLAkweDkzNEE4N0QyLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmdUb3AsCShGWF9MUENXU1RSKUwicGFkZGluZy10b3AiLAkweDk1OUQyMkI3LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5zLAkoRlhfTFBDV1NUUilMImNvbHVtbnMiLAkweDk2RkE1RDgxLAlGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX092ZXJmbG93LAkoRlhfTFBDV1NUUilMIm92ZXJmbG93IiwJMHg5N0I3NkI1NCwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UYWJsZUxheW91dCwJKEZYX0xQQ1dTVFIpTCJ0YWJsZS1sYXlvdXQiLAkweDlCMUNCNEIzLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFZhcmlhbnQsCShGWF9MUENXU1RSKUwiZm9udC12YXJpYW50IiwJMHg5Qzc4NTc3OSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZSwJKEZYX0xQQ1dTVFIpTCJsaXN0LXN0eWxlIiwJMHg5RTZDNDcxQSwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUG9zaXRpb24sCShGWF9MUENXU1RSKUwiYmFja2dyb3VuZC1wb3NpdGlvbiIsCTB4QTg4NDZEMjIsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlcldpZHRoLAkoRlhfTFBDV1NUUilMImJvcmRlci13aWR0aCIsCTB4QThERTRGRUIsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc0NvbG9yLAkoRlhfTFBDV1NUUilMInRleHQtZW1waGFzaXMtY29sb3IiLAkweEFBRjIzNDc4LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlLAkoRlhfTFBDV1NUUilMImJvcmRlci1sZWZ0LXN0eWxlIiwJMHhBQkFGQkFGNCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0luc2lkZSwJKEZYX0xQQ1dTVFIpTCJwYWdlLWJyZWFrLWluc2lkZSIsCTB4QUNCNjk1RjgsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXMsCShGWF9MUENXU1RSKUwidGV4dC1lbXBoYXNpcyIsCTB4QUQwRTU4MEMsCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgsCShGWF9MUENXU1RSKUwiYm9yZGVyLWJvdHRvbS13aWR0aCIsCTB4QUU0MTIwNEQsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uR2FwLAkoRlhfTFBDV1NUUilMImNvbHVtbi1nYXAiLAkweEI1QzFCQTczLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX09ycGhhbnMsCShGWF9MUENXU1RSKUwib3JwaGFucyIsCTB4QjcxNjQ2N0IsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0LAkoRlhfTFBDV1NUUilMImJvcmRlci1yaWdodCIsCTB4Qjc4RTlFQTksCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsCShGWF9MUENXU1RSKUwiZm9udC1zaXplIiwJMHhCOTM5NTZERiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtBZnRlciwJKEZYX0xQQ1dTVFIpTCJwYWdlLWJyZWFrLWFmdGVyIiwJMHhCQzM1OEFFRSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NhcHRpb25TaWRlLAkoRlhfTFBDV1NUUilMImNhcHRpb24tc2lkZSIsCTB4QzAzRjM1NjAsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0LAkoRlhfTFBDV1NUUilMImJhY2tncm91bmQtcmVwZWF0IiwJMHhDMkMyRkRDRSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLAkoRlhfTFBDV1NUUilMImJvcmRlci10b3Atc3R5bGUiLAkweEM2RjMzMzlDLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyU3BhY2luZywJKEZYX0xQQ1dTVFIpTCJib3JkZXItc3BhY2luZyIsCTB4QzcyMDMwRjAsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0VHJhbnNmb3JtLAkoRlhfTFBDV1NUUilMInRleHQtdHJhbnNmb3JtIiwJMHhDODhFRUE2RSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnRTdHlsZSwJKEZYX0xQQ1dTVFIpTCJmb250LXN0eWxlIiwJMHhDQjE5NTBGNSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnQsCShGWF9MUENXU1RSKUwiZm9udCIsCTB4Q0QzMDhCNzcsCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodCwJKEZYX0xQQ1dTVFIpTCJsaW5lLWhlaWdodCIsCTB4Q0ZDQUNFMkUsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luUmlnaHQsCShGWF9MUENXU1RSKUwibWFyZ2luLXJpZ2h0IiwJMHhEMTNDNThDOSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9GbG9hdCwJKEZYX0xQQ1dTVFIpTCJmbG9hdCIsCTB4RDE1MzI4NzYsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGgsCShGWF9MUENXU1RSKUwiYm9yZGVyLWxlZnQtd2lkdGgiLAkweEQxRTkzRDgzLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0Rpc3BsYXksCShGWF9MUENXU1RSKUwiZGlzcGxheSIsCTB4RDQyMjRDMzYsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9DbGVhciwJKEZYX0xQQ1dTVFIpTCJjbGVhciIsCTB4RDhFRDE0NjcsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlU3R5bGUsCShGWF9MUENXU1RSKUwiY29sdW1uLXJ1bGUtc3R5bGUiLAkweERCQzc3ODcxLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dENvbWJpbmUsCShGWF9MUENXU1RSKUwidGV4dC1jb21iaW5lIiwJMHhEQzUyMDdDRiwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlUG9zaXRpb24sCShGWF9MUENXU1RSKUwibGlzdC1zdHlsZS1wb3NpdGlvbiIsCTB4RTFBMURFM0MsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9WaXNpYmlsaXR5LAkoRlhfTFBDV1NUUilMInZpc2liaWxpdHkiLAkweEUyOUY1MTY4LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbSwJKEZYX0xQQ1dTVFIpTCJwYWRkaW5nLWJvdHRvbSIsCTB4RTU1NUIzQjksCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRBdHRhY2htZW50LAkoRlhfTFBDV1NUUilMImJhY2tncm91bmQtYXR0YWNobWVudCIsCTB4RTc3OTgxRjYsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kSW1hZ2UsCShGWF9MUENXU1RSKUwiYmFja2dyb3VuZC1pbWFnZSIsCTB4RTlBRUI3MTAsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTGluZUJyZWFrLAkoRlhfTFBDV1NUUilMImxpbmUtYnJlYWsiLAkweEVBMkQxRDlBLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZCwJKEZYX0xQQ1dTVFIpTCJiYWNrZ3JvdW5kIiwJMHhFQjQ5REQ0MCwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCwJKEZYX0xQQ1dTVFIpTCJib3JkZXItdG9wLXdpZHRoIiwJMHhFRDJDQjYyQiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Xb3JkU3BhY2luZywJKEZYX0xQQ1dTVFIpTCJ3b3JkLXNwYWNpbmciLAkweEVEQTYzQkFFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsCShGWF9MUENXU1RSKUwiYm9yZGVyLXJpZ2h0LWNvbG9yIiwJMHhGMzM3NjJENSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQsCShGWF9MUENXU1RSKUwiY291bnRlci1pbmNyZW1lbnQiLAkweEY0Q0ZCMUIyLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTGVmdCwJKEZYX0xQQ1dTVFIpTCJsZWZ0IiwJMHhGNUFENzgyQiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0RGVjb3JhdGlvbiwJKEZYX0xQQ1dTVFIpTCJ0ZXh0LWRlY29yYXRpb24iLAkweEY3QzYzNEJBLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmcsCShGWF9MUENXU1RSKUwicGFkZGluZyIsCTB4RjhDMzczRjcsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5Cb3R0b20sCShGWF9MUENXU1RSKUwibWFyZ2luLWJvdHRvbSIsCTB4RjkzNDg1QTAsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luVG9wLAkoRlhfTFBDV1NUUilMIm1hcmdpbi10b3AiLAkweEZFNTFEQ0ZFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0RpcmVjdGlvbiwJKEZYX0xQQ1dTVFIpTCJkaXJlY3Rpb24iLAkweEZFNzQ2RTYxLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAgfTsNCisgICAgc3RhdGljIGNvbnN0IEZERV9DU1NQUk9QRVJUWVZBTFVFVEFCTEUgZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXNbXSA9IHsNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXIsCShGWF9MUENXU1RSKUwiYm9sZGVyIiwJMHgwMDlGMTA1OH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJMYXRpbiwJKEZYX0xQQ1dTVFIpTCJsb3dlci1sYXRpbiIsCTB4MDE2MDE0Q0V9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyY2FzZSwJKEZYX0xQQ1dTVFIpTCJsb3dlcmNhc2UiLAkweDAyQUNCODA1fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckdyZWVrLAkoRlhfTFBDV1NUUilMImxvd2VyLWdyZWVrIiwJMHgwM0Q4MUQ2NH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU2VzYW1lLAkoRlhfTFBDV1NUUilMInNlc2FtZSIsCTB4MDQzMkVDREV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUsCShGWF9MUENXU1RSKUwibm9uZSIsCTB4MDQ4QjY2NzB9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX053UmVzaXplLAkoRlhfTFBDV1NUUilMIm53LXJlc2l6ZSIsCTB4MDU0QjRCRTR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1dSZXNpemUsCShGWF9MUENXU1RSKUwidy1yZXNpemUiLAkweDBBMkY4RDc2fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3QsCShGWF9MUENXU1RSKUwiZG90IiwJMHgwQTQ4Q0IyN30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRW5kLAkoRlhfTFBDV1NUUilMImVuZCIsCTB4MEE2MzE0Mzd9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0x0ciwJKEZYX0xQQ1dTVFIpTCJsdHIiLAkweDBCMUI1NkQyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmUsCShGWF9MUENXU1RSKUwicHJlIiwJMHgwQjg0ODU4N30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnRsLAkoRlhfTFBDV1NUUilMInJ0bCIsCTB4MEJCOTJDNTJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N1YiwJKEZYX0xQQ1dTVFIpTCJzdWIiLAkweDBCRDM3RkFBfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3AsCShGWF9MUENXU1RSKUwidG9wIiwJMHgwQkVEQUYzM30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVmlzaWJsZSwJKEZYX0xQQ1dTVFIpTCJ2aXNpYmxlIiwJMHgwRjU1RDdFRX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRmlsbGVkLAkoRlhfTFBDV1NUUilMImZpbGxlZCIsCTB4MTA4MjdERDB9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N3UmVzaXplLAkoRlhfTFBDV1NUUilMInN3LXJlc2l6ZSIsCTB4MTBCNTQ4RTl9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vUmVwZWF0LAkoRlhfTFBDV1NUUilMIm5vLXJlcGVhdCIsCTB4MTIzNUMxOEJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RlZmF1bHQsCShGWF9MUENXU1RSKUwiZGVmYXVsdCIsCTB4MTREQTIxMjV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RyYW5zcGFyZW50LAkoRlhfTFBDV1NUUilMInRyYW5zcGFyZW50IiwJMHgxN0I2NERCMn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmlkZ2UsCShGWF9MUENXU1RSKUwicmlkZ2UiLAkweDE4RUJFRTRCfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodCwJKEZYX0xQQ1dTVFIpTCJyaWdodCIsCTB4MTkzQURFM0V9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWxUYiwJKEZYX0xQQ1dTVFIpTCJob3Jpem9udGFsLXRiIiwJMHgxQTY2QTg2RH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZUxldHRlciwJKEZYX0xQQ1dTVFIpTCJkaXN0cmlidXRlLWxldHRlciIsCTB4MUVEQkQ3NUN9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZUNpcmNsZSwJKEZYX0xQQ1dTVFIpTCJkb3VibGUtY2lyY2xlIiwJMHgxRkYwODJCQX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieSwJKEZYX0xQQ1dTVFIpTCJydWJ5IiwJMHgyMEQ2NkMwMn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ29sbGFwc2UsCShGWF9MUENXU1RSKUwiY29sbGFwc2UiLAkweDIxMjhENjczfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwsCShGWF9MUENXU1RSKUwibm9ybWFsIiwJMHgyNDdDRjNFOX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQXZvaWQsCShGWF9MUENXU1RSKUwiYXZvaWQiLAkweDI0RTY4NEIzfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuLAkoRlhfTFBDV1NUUilMInVwcGVyLXJvbWFuIiwJMHgyOEJBQzJCNn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bywJKEZYX0xQQ1dTVFIpTCJhdXRvIiwJMHgyQjM1QjZEOX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dCwJKEZYX0xQQ1dTVFIpTCJ0ZXh0IiwJMHgyRDA4QUY4NX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsLAkoRlhfTFBDV1NUUilMIngtc21hbGwiLAkweDJEMkZDQUZFfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGluLAkoRlhfTFBDV1NUUilMInRoaW4iLAkweDJENTc0RDUzfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXQsCShGWF9MUENXU1RSKUwicmVwZWF0IiwJMHgzMDY2MTRBMX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGwsCShGWF9MUENXU1RSKUwic21hbGwiLAkweDMxNkEzNzM5fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9OZVJlc2l6ZSwJKEZYX0xQQ1dTVFIpTCJuZS1yZXNpemUiLAkweDMxRkQ1RTEyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0NvbnRlbnQsCShGWF9MUENXU1RSKUwibm8tY29udGVudCIsCTB4MzNBMUM1NDV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUsCShGWF9MUENXU1RSKUwib3V0c2lkZSIsCTB4MzZERjY5M0R9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0VSZXNpemUsCShGWF9MUENXU1RSKUwiZS1yZXNpemUiLAkweDM2RTE5RkE0fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvdywJKEZYX0xQQ1dTVFIpTCJ0YWJsZS1yb3ciLAkweDM5MTJBMDJEfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b20sCShGWF9MUENXU1RSKUwiYm90dG9tIiwJMHgzOTlGMDJCNX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVW5kZXJsaW5lLAkoRlhfTFBDV1NUUilMInVuZGVybGluZSIsCTB4M0EwMjczQTZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Nqa0lkZW9ncmFwaGljLAkoRlhfTFBDV1NUUilMImNqay1pZGVvZ3JhcGhpYyIsCTB4M0E2NDFDQzR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NlUmVzaXplLAkoRlhfTFBDV1NUUilMInNlLXJlc2l6ZSIsCTB4M0Q2NzVCMTd9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpeGVkLAkoRlhfTFBDV1NUUilMImZpeGVkIiwJMHgzRDdERUIxMH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlLAkoRlhfTFBDV1NUUilMImRvdWJsZSIsCTB4M0Q5ODUxNUJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkLAkoRlhfTFBDV1NUUilMInNvbGlkIiwJMHg0MDYyM0I1Qn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2VHcm91cCwJKEZYX0xQQ1dTVFIpTCJydWJ5LWJhc2UtZ3JvdXAiLAkweDQxMDE0RTg0fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuUXVvdGUsCShGWF9MUENXU1RSKUwib3Blbi1xdW90ZSIsCTB4NDRBNDFFOER9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xpZ2h0ZXIsCShGWF9MUENXU1RSKUwibGlnaHRlciIsCTB4NDVCRUI3QUZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyUm9tYW4sCShGWF9MUENXU1RSKUwibG93ZXItcm9tYW4iLAkweDUwNDREMjUzfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdHJpY3QsCShGWF9MUENXU1RSKUwic3RyaWN0IiwJMHg1MkY0RUJEOX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDYXB0aW9uLAkoRlhfTFBDV1NUUilMInRhYmxlLWNhcHRpb24iLAkweDUzMjVDRDYzfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9PYmxpcXVlLAkoRlhfTFBDV1NUUilMIm9ibGlxdWUiLAkweDUzRUJEREIxfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsLAkoRlhfTFBDV1NUUilMImRlY2ltYWwiLAkweDU0MDM0QzJGfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb29zZSwJKEZYX0xQQ1dTVFIpTCJsb29zZSIsCTB4NTREM0ExRTJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hlYnJldywJKEZYX0xQQ1dTVFIpTCJoZWJyZXciLAkweDU2NTc5MkREfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW4sCShGWF9MUENXU1RSKUwiaGlkZGVuIiwJMHg1NzNDQjQwQ30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGFzaGVkLAkoRlhfTFBDV1NUUilMImRhc2hlZCIsCTB4NThBM0REMjl9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0VtYmVkLAkoRlhfTFBDV1NUUilMImVtYmVkIiwJMHg1OUM4RjI3RH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3dHcm91cCwJKEZYX0xQQ1dTVFIpTCJ0YWJsZS1yb3ctZ3JvdXAiLAkweDVBNDNCRDA3fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbiwJKEZYX0xQQ1dTVFIpTCJ0YWJsZS1jb2x1bW4iLAkweDVFNzA1REEzfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdGF0aWMsCShGWF9MUENXU1RSKUwic3RhdGljIiwJMHg1RTc1NTVFOH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2V0LAkoRlhfTFBDV1NUUilMIm91dHNldCIsCTB4NjEyMzYxNjR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWxMZWFkaW5nWmVybywJKEZYX0xQQ1dTVFIpTCJkZWNpbWFsLWxlYWRpbmctemVybyIsCTB4NjFERkM1NUR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBXb3JkcywJKEZYX0xQQ1dTVFIpTCJrZWVwLXdvcmRzIiwJMHg2Mzk2NDgwMX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfS2F0YWthbmFJcm9oYSwJKEZYX0xQQ1dTVFIpTCJrYXRha2FuYS1pcm9oYSIsCTB4NjVEN0M5MUN9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N1cGVyLAkoRlhfTFBDV1NUUilMInN1cGVyIiwJMHg2QTRGODQyRn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyLAkoRlhfTFBDV1NUUilMImNlbnRlciIsCTB4NkM1MUFGQzF9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlSGVhZGVyR3JvdXAsCShGWF9MUENXU1RSKUwidGFibGUtaGVhZGVyLWdyb3VwIiwJMHg3MDYxMDNEOH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zaWRlLAkoRlhfTFBDV1NUUilMImluc2lkZSIsCTB4NzA5Q0IwRkN9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1h4TGFyZ2UsCShGWF9MUENXU1RSKUwieHgtbGFyZ2UiLAkweDcwQkIxNTA4fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmlhbmdsZSwJKEZYX0xQQ1dTVFIpTCJ0cmlhbmdsZSIsCTB4NzUyNEVERjZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0R3JvdXAsCShGWF9MUENXU1RSKUwicnVieS10ZXh0LWdyb3VwIiwJMHg3OEMyQjk4RX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlLAkoRlhfTFBDV1NUUilMImNpcmNsZSIsCTB4N0FCRUMwRDJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hpcmFnYW5hLAkoRlhfTFBDV1NUUilMImhpcmFnYW5hIiwJMHg3QkY1RTI1Qn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WCwJKEZYX0xQQ1dTVFIpTCJyZXBlYXQteCIsCTB4N0M4RjMyMjZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFksCShGWF9MUENXU1RSKUwicmVwZWF0LXkiLAkweDdDOEYzMjI3fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Nb3ZlLAkoRlhfTFBDV1NUUilMIm1vdmUiLAkweDdEQTAzNDE3fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaXJhZ2FuYUlyb2hhLAkoRlhfTFBDV1NUUilMImhpcmFnYW5hLWlyb2hhIiwJMHg3RUU4NjNGQn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2UsCShGWF9MUENXU1RSKUwicnVieS1iYXNlIiwJMHg3RkQxQjFFQX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsLAkoRlhfTFBDV1NUUilMInNjcm9sbCIsCTB4ODQ3ODdBRUZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsZXIsCShGWF9MUENXU1RSKUwic21hbGxlciIsCTB4ODQ5NzY5RjB9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlRm9vdGVyR3JvdXAsCShGWF9MUENXU1RSKUwidGFibGUtZm9vdGVyLWdyb3VwIiwJMHg4NUJERDk3RX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQmFzZWxpbmUsCShGWF9MUENXU1RSKUwiYmFzZWxpbmUiLAkweDg3NDM2QkEzfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXBhcmF0ZSwJKEZYX0xQQ1dTVFIpTCJzZXBhcmF0ZSIsCTB4ODc3QzY2QjV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0FybWVuaWFuLAkoRlhfTFBDV1NUUilMImFybWVuaWFuIiwJMHg4ODlCRTRFQn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3BlbiwJKEZYX0xQQ1dTVFIpTCJvcGVuIiwJMHg4QjkwRTFGMn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVsYXRpdmUsCShGWF9MUENXU1RSKUwicmVsYXRpdmUiLAkweDhDOTk1QjVDfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljaywJKEZYX0xQQ1dTVFIpTCJ0aGljayIsCTB4OENDMzVFQjN9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0p1c3RpZnksCShGWF9MUENXU1RSKUwianVzdGlmeSIsCTB4OEQyNjlDQUV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX01pZGRsZSwJKEZYX0xQQ1dTVFIpTCJtaWRkbGUiLAkweDk0N0ZBMDBGfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9BbHdheXMsCShGWF9MUENXU1RSKUwiYWx3YXlzIiwJMHg5NTlBQjIzMX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZVNwYWNlLAkoRlhfTFBDV1NUUilMImRpc3RyaWJ1dGUtc3BhY2UiLAkweDk3QTIwRTU4fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lRWRnZSwJKEZYX0xQQ1dTVFIpTCJsaW5lLWVkZ2UiLAkweDlBODQ1RDJBfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmVXcmFwLAkoRlhfTFBDV1NUUilMInByZS13cmFwIiwJMHg5RDU5NTg4RX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTWVkaXVtLAkoRlhfTFBDV1NUUilMIm1lZGl1bSIsCTB4QTA4NEEzODF9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05SZXNpemUsCShGWF9MUENXU1RSKUwibi1yZXNpemUiLAkweEEwODg5NjhEfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaXN0SXRlbSwJKEZYX0xQQ1dTVFIpTCJsaXN0LWl0ZW0iLAkweEEzMjM4MkI4fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TaG93LAkoRlhfTFBDV1NUUilMInNob3ciLAkweEE2NkMxMEMxfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DdXJyZW50Y29sb3IsCShGWF9MUENXU1RSKUwiY3VycmVudENvbG9yIiwJMHhBNzg4MzkyMn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9DbG9zZVF1b3RlLAkoRlhfTFBDV1NUUilMIm5vLWNsb3NlLXF1b3RlIiwJMHhBNzlDQkZGQn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxMciwJKEZYX0xQQ1dTVFIpTCJ2ZXJ0aWNhbC1sciIsCTB4QTg2NzNGNjV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsUmwsCShGWF9MUENXU1RSKUwidmVydGljYWwtcmwiLAkweEE4Njc1RTI1fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qb2ludGVyLAkoRlhfTFBDV1NUUilMInBvaW50ZXIiLAkweEE5MDkyOUMxfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeFNtYWxsLAkoRlhfTFBDV1NUUilMInh4LXNtYWxsIiwJMHhBREUxRkM3Nn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZCwJKEZYX0xQQ1dTVFIpTCJib2xkIiwJMHhCMTgzMTNBMX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQm90aCwJKEZYX0xQQ1dTVFIpTCJib3RoIiwJMHhCMTgzM0NBRH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxDYXBzLAkoRlhfTFBDV1NUUilMInNtYWxsLWNhcHMiLAkweEIyOTk0MjhEfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYSwJKEZYX0xQQ1dTVFIpTCJrYXRha2FuYSIsCTB4QjQyMUE0QkN9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyLAkoRlhfTFBDV1NUUilMImFmdGVyIiwJMHhCNkI0NDE3Mn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbCwJKEZYX0xQQ1dTVFIpTCJob3Jpem9udGFsIiwJMHhCNzczMkRFQX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkLAkoRlhfTFBDV1NUUilMImRvdHRlZCIsCTB4Qjg4NjUyQTR9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc2MsCShGWF9MUENXU1RSKUwiZGlzYyIsCTB4QkVCQzE4QzN9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0dlb3JnaWFuLAkoRlhfTFBDV1NUUilMImdlb3JnaWFuIiwJMHhCRUY5OUU4Q30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lLAkoRlhfTFBDV1NUUilMImlubGluZSIsCTB4QzAyRDY0OUZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX092ZXJsaW5lLAkoRlhfTFBDV1NUUilMIm92ZXJsaW5lIiwJMHhDMEVDOUZBNH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfV2FpdCwJKEZYX0xQQ1dTVFIpTCJ3YWl0IiwJMHhDMTYxM0JCNX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQnJlYWtBbGwsCShGWF9MUENXU1RSKUwiYnJlYWstYWxsIiwJMHhDMzE0NUJBQn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJBbHBoYSwJKEZYX0xQQ1dTVFIpTCJ1cHBlci1hbHBoYSIsCTB4QzUyRDRBOUZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0NhcGl0YWxpemUsCShGWF9MUENXU1RSKUwiY2FwaXRhbGl6ZSIsCTB4QzUzMjFENDZ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vd3JhcCwJKEZYX0xQQ1dTVFIpTCJub3dyYXAiLAkweEM3OTk0NDE3fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0Qm90dG9tLAkoRlhfTFBDV1NUUilMInRleHQtYm90dG9tIiwJMHhDN0QwOEQ4N30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9PcGVuUXVvdGUsCShGWF9MUENXU1RSKUwibm8tb3Blbi1xdW90ZSIsCTB4QzhDRDc4Nzd9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0dyb292ZSwJKEZYX0xQQ1dTVFIpTCJncm9vdmUiLAkweENCMjRBNDEyfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qcm9ncmVzcywJKEZYX0xQQ1dTVFIpTCJwcm9ncmVzcyIsCTB4Q0QxRDk4MzV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlciwJKEZYX0xQQ1dTVFIpTCJsYXJnZXIiLAkweENEM0M0MDlEfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DbG9zZVF1b3RlLAkoRlhfTFBDV1NUUilMImNsb3NlLXF1b3RlIiwJMHhDRjg2OTZEMX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDZWxsLAkoRlhfTFBDV1NUUilMInRhYmxlLWNlbGwiLAkweENGQjVFNTk1fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmVMaW5lLAkoRlhfTFBDV1NUUilMInByZS1saW5lIiwJMHhEMDRGRURCQ30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQWJzb2x1dGUsCShGWF9MUENXU1RSKUwiYWJzb2x1dGUiLAkweEQwQjJENTVGfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVUYWJsZSwJKEZYX0xQQ1dTVFIpTCJpbmxpbmUtdGFibGUiLAkweEQxMzFGNDk0fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CaWRpT3ZlcnJpZGUsCShGWF9MUENXU1RSKUwiYmlkaS1vdmVycmlkZSIsCTB4RDE2MUZERTV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZUJsb2NrLAkoRlhfTFBDV1NUUilMImlubGluZS1ibG9jayIsCTB4RDI2QThCRDd9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0LAkoRlhfTFBDV1NUUilMImluc2V0IiwJMHhENkYyMzI0M30sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ3Jvc3NoYWlyLAkoRlhfTFBDV1NUUilMImNyb3NzaGFpciIsCTB4RDZGODAxOEV9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyTGF0aW4sCShGWF9MUENXU1RSKUwidXBwZXItbGF0aW4iLAkweEQ5RDYwNTMxfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWxwLAkoRlhfTFBDV1NUUilMImhlbHAiLAkweERBMDAyOTY5fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRlLAkoRlhfTFBDV1NUUilMImhpZGUiLAkweERBNjkzOTVBfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2UsCShGWF9MUENXU1RSKUwidXBwZXJjYXNlIiwJMHhEQUQ1OTVBOH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU1Jlc2l6ZSwJKEZYX0xQQ1dTVFIpTCJzLXJlc2l6ZSIsCTB4REIzQUFERjJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlLAkoRlhfTFBDV1NUUilMInRhYmxlIiwJMHhEQjlCRTk2OH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQmxpbmssCShGWF9MUENXU1RSKUwiYmxpbmsiLAkweERDMzZFMzkwfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbG9jaywJKEZYX0xQQ1dTVFIpTCJibG9jayIsCTB4RENENDgwQUJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXJ0LAkoRlhfTFBDV1NUUilMInN0YXJ0IiwJMHhFMUQ5RDVBRX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW5Hcm91cCwJKEZYX0xQQ1dTVFIpTCJ0YWJsZS1jb2x1bW4tZ3JvdXAiLAkweEUyMjU4RUZEfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWMsCShGWF9MUENXU1RSKUwiaXRhbGljIiwJMHhFMzFENTM5Nn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZVRocm91Z2gsCShGWF9MUENXU1RSKUwibGluZS10aHJvdWdoIiwJMHhFNEM1QTI3Nn0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcEFsbCwJKEZYX0xQQ1dTVFIpTCJrZWVwLWFsbCIsCTB4RTcwNEE3MkJ9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyQWxwaGEsCShGWF9MUENXU1RSKUwibG93ZXItYWxwaGEiLAkweEVDQjc1QTNDfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdW5JbiwJKEZYX0xQQ1dTVFIpTCJydW4taW4iLAkweEVFQzkzMEI5fSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TcXVhcmUsCShGWF9MUENXU1RSKUwic3F1YXJlIiwJMHhFRjg1RDM1MX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWExhcmdlLAkoRlhfTFBDV1NUUilMIngtbGFyZ2UiLAkweEYwMDhFMzkwfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZSwJKEZYX0xQQ1dTVFIpTCJsYXJnZSIsCTB4RjQ0MzRGQ0J9LA0KKyAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JlZm9yZSwJKEZYX0xQQ1dTVFIpTCJiZWZvcmUiLAkweEY0RkZDRTczfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0LAkoRlhfTFBDV1NUUilMImxlZnQiLAkweEY1QUQ3ODJCfSwNCisgICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0VG9wLAkoRlhfTFBDV1NUUilMInRleHQtdG9wIiwJMHhGQ0I1OEQ0NX0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHQsCShGWF9MUENXU1RSKUwicnVieS10ZXh0IiwJMHhGQ0M3NzE3NH0sDQorICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9EaXNwbGF5LAkoRlhfTFBDV1NUUilMIm5vLWRpc3BsYXkiLAkweEZFNDgyODYwfSwNCisgICAgfTsNCisgICAgc3RhdGljIGNvbnN0IEZERV9DU1NNRURJQVRZUEVUQUJMRSBnX0ZERV9DU1NNZWRpYVR5cGVzW10gPSB7DQorICAgICAgICB7MHhGMDksIDB4MDJ9LA0KKyAgICAgICAgezB4NDg4MCwgMHgyMH0sDQorICAgICAgICB7MHg1MzZBLCAweDgwfSwNCisgICAgICAgIHsweDc0MUQsIDB4MTB9LA0KKyAgICAgICAgezB4NzZFRCwgMHgwOH0sDQorICAgICAgICB7MHg3Q0ZCLCAweDAxfSwNCisgICAgICAgIHsweDk1NzgsIDB4MDR9LA0KKyAgICAgICAgezB4QzhFMSwgMHg0MH0sDQorICAgICAgICB7MHhEMEY5LCAweEZGfSwNCisgICAgfTsNCisgICAgc3RhdGljIGNvbnN0IEZERV9DU1NMRU5HVEhVTklUVEFCTEUgZ19GREVfQ1NTTGVuZ3RoVW5pdHNbXSA9IHsNCisgICAgICAgIHsweDA2NzIsIDN9LA0KKyAgICAgICAgezB4MDY3RCwgNH0sDQorICAgICAgICB7MHgxQUY3LCA4fSwNCisgICAgICAgIHsweDJGN0EsIDd9LA0KKyAgICAgICAgezB4M0VEMywgMTB9LA0KKyAgICAgICAgezB4M0VFNCwgOX0sDQorICAgICAgICB7MHgzRUU4LCA1fSwNCisgICAgICAgIHsweEZDMzAsIDZ9LA0KKyAgICB9Ow0KKyAgICBzdGF0aWMgY29uc3QgRkRFX0NTU0NPTE9SVEFCTEUgZ19GREVfQ1NTQ29sb3JzW10gPSB7DQorICAgICAgICB7MHgwMzFCNDdGRSwgMHhmZjAwMDA4MH0sDQorICAgICAgICB7MHgwQkI4REY1QiwgMHhmZmZmMDAwMH0sDQorICAgICAgICB7MHgwRDgyQTc4QywgMHhmZjgwMDAwMH0sDQorICAgICAgICB7MHgyQUNDODJFOCwgMHhmZjAwZmZmZn0sDQorICAgICAgICB7MHgyRDA4Mzk4NiwgMHhmZjAwODA4MH0sDQorICAgICAgICB7MHg0QTZBNjE5NSwgMHhmZmMwYzBjMH0sDQorICAgICAgICB7MHg1NDZBOEVGMywgMHhmZjgwODA4MH0sDQorICAgICAgICB7MHg2NUM5MTY5QywgMHhmZmZmYTUwMH0sDQorICAgICAgICB7MHg4NDIyQkI2MSwgMHhmZmZmZmZmZn0sDQorICAgICAgICB7MHg5MjcxQTU1OCwgMHhmZjgwMDA4MH0sDQorICAgICAgICB7MHhBNjVBM0VFMywgMHhmZmZmMDBmZn0sDQorICAgICAgICB7MHhCMTM0NTcwOCwgMHhmZjAwMDBmZn0sDQorICAgICAgICB7MHhCNkQyQ0YxRiwgMHhmZjgwODAwMH0sDQorICAgICAgICB7MHhEMTlCNUUxQywgMHhmZmZmZmYwMH0sDQorICAgICAgICB7MHhEQjY0MzkxRCwgMHhmZjAwMDAwMH0sDQorICAgICAgICB7MHhGNjE2RDUwNywgMHhmZjAwZmYwMH0sDQorICAgICAgICB7MHhGNkVGRkYzMSwgMHhmZjAwODAwMH0sDQorICAgIH07DQorICAgIHN0YXRpYyBjb25zdCBGREVfQ1NTUEVSU1VET1RBQkxFIGdfRkRFX0NTU1BlcnN1ZG9UeXBlW10gPSB7DQorICAgICAgICB7RkRFX0NTU1BFUlNVRE9fQWZ0ZXIsCShGWF9MUENXU1RSKUwiOmFmdGVyIiwJMHgxNkVFMUZFQ30sDQorICAgICAgICB7RkRFX0NTU1BFUlNVRE9fQmVmb3JlLAkoRlhfTFBDV1NUUilMIjpiZWZvcmUiLAkweDdEQ0RERTJEfSwNCisgICAgfTsNCisgICAgRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRSBGREVfR2V0Q1NTUGVyc3Vkb0J5RW51bShGREVfQ1NTUEVSU1VETyBlUGVyc3VkbykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChlUGVyc3VkbyA8IEZERV9DU1NQRVJTVURPX05PTkUpID8gKGdfRkRFX0NTU1BlcnN1ZG9UeXBlICsgZVBlcnN1ZG8pIDogTlVMTDsNCisgICAgfQ0KKyAgICBGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUoRlhfTFBDV1NUUiBwc3pOYW1lLCBGWF9JTlQzMiBpTGVuZ3RoKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IEZERV9DU1NQUk9QRVJUWV9NQVggLSAxOw0KKyAgICAgICAgRlhfSU5UMzIgaU1pZCwgaVN0YXJ0ID0gMDsNCisgICAgICAgIEZYX0RXT1JEIGR3TWlkOw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgICAgIGR3TWlkID0gZ19GREVfQ1NTUHJvcGVydGllc1tpTWlkXS5kd0hhc2g7DQorICAgICAgICAgICAgaWYgKGR3SGFzaCA9PSBkd01pZCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ19GREVfQ1NTUHJvcGVydGllcyArIGlNaWQ7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KKyAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5QnlFbnVtKEZERV9DU1NQUk9QRVJUWSBlTmFtZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChlTmFtZSA8IEZERV9DU1NQUk9QRVJUWV9NQVgpID8gKGdfRkRFX0NTU1Byb3BlcnRpZXMgKyBlTmFtZSkgOiBOVUxMOw0KKyAgICB9DQorICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUoRlhfTFBDV1NUUiBwc3pOYW1lLCBGWF9JTlQzMiBpTGVuZ3RoKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IEZERV9DU1NQUk9QRVJUWVZBTFVFX01BWCAtIDE7DQorICAgICAgICBGWF9JTlQzMiBpTWlkLCBpU3RhcnQgPSAwOw0KKyAgICAgICAgRlhfRFdPUkQgZHdNaWQ7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICAgICAgZHdNaWQgPSBnX0ZERV9DU1NQcm9wZXJ0eVZhbHVlc1tpTWlkXS5kd0hhc2g7DQorICAgICAgICAgICAgaWYgKGR3SGFzaCA9PSBkd01pZCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXMgKyBpTWlkOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gZHdNaWQpIHsNCisgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeUVudW0oRkRFX0NTU1BST1BFUlRZVkFMVUUgZU5hbWUpDQorICAgIHsNCisgICAgICAgIHJldHVybiAoZU5hbWUgPCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NQVgpID8gKGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzICsgZU5hbWUpIDogTlVMTDsNCisgICAgfQ0KKyAgICBGREVfTFBDQ1NTTUVESUFUWVBFVEFCTEUgRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShGWF9MUENXU1RSIHBzek5hbWUsIEZYX0lOVDMyIGlMZW5ndGgpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwc3pOYW1lICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgICAgICAgRlhfV09SRCB3SGFzaCA9IChGWF9XT1JEKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IHNpemVvZihnX0ZERV9DU1NNZWRpYVR5cGVzKSAvIHNpemVvZihGREVfQ1NTTUVESUFUWVBFVEFCTEUpIC0gMTsNCisgICAgICAgIEZYX0lOVDMyIGlNaWQsIGlTdGFydCA9IDA7DQorICAgICAgICBGWF9XT1JEIHVNaWQ7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICAgICAgdU1pZCA9IGdfRkRFX0NTU01lZGlhVHlwZXNbaU1pZF0ud0hhc2g7DQorICAgICAgICAgICAgaWYgKHdIYXNoID09IHVNaWQpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGdfRkRFX0NTU01lZGlhVHlwZXMgKyBpTWlkOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod0hhc2ggPiB1TWlkKSB7DQorICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFIEZERV9HZXRDU1NMZW5ndGhVbml0QnlOYW1lKEZYX0xQQ1dTVFIgcHN6TmFtZSwgRlhfSU5UMzIgaUxlbmd0aCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICAgICAgICBGWF9XT1JEIHdIYXNoID0gKEZYX1dPUkQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQorICAgICAgICBGWF9JTlQzMiBpRW5kID0gc2l6ZW9mKGdfRkRFX0NTU0xlbmd0aFVuaXRzKSAvIHNpemVvZihGREVfQ1NTTEVOR1RIVU5JVFRBQkxFKSAtIDE7DQorICAgICAgICBGWF9JTlQzMiBpTWlkLCBpU3RhcnQgPSAwOw0KKyAgICAgICAgRlhfV09SRCB3TWlkOw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgICAgIHdNaWQgPSBnX0ZERV9DU1NMZW5ndGhVbml0c1tpTWlkXS53SGFzaDsNCisgICAgICAgICAgICBpZiAod0hhc2ggPT0gd01pZCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ19GREVfQ1NTTGVuZ3RoVW5pdHMgKyBpTWlkOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod0hhc2ggPiB3TWlkKSB7DQorICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGREVfTFBDQ1NTQ09MT1JUQUJMRSBGREVfR2V0Q1NTQ29sb3JCeU5hbWUoRlhfTFBDV1NUUiBwc3pOYW1lLCBGWF9JTlQzMiBpTGVuZ3RoKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IHNpemVvZihnX0ZERV9DU1NDb2xvcnMpIC8gc2l6ZW9mKEZERV9DU1NDT0xPUlRBQkxFKSAtIDE7DQorICAgICAgICBGWF9JTlQzMiBpTWlkLCBpU3RhcnQgPSAwOw0KKyAgICAgICAgRlhfRFdPUkQgZHdNaWQ7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICAgICAgZHdNaWQgPSBnX0ZERV9DU1NDb2xvcnNbaU1pZF0uZHdIYXNoOw0KKyAgICAgICAgICAgIGlmIChkd0hhc2ggPT0gZHdNaWQpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGdfRkRFX0NTU0NvbG9ycyArIGlNaWQ7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KKyAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfQk9PTCBGREVfUGFyc2VDU1NOdW1iZXIoRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9GTE9BVCAmZlZhbHVlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSAmZVVuaXQpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwc3pWYWx1ZSAhPSBOVUxMICYmIGlWYWx1ZUxlbiA+IDApOw0KKyAgICAgICAgRlhfSU5UMzIgaVVzZWRMZW4gPSAwOw0KKyAgICAgICAgZlZhbHVlID0gRlhfd2NzdG9mKHBzelZhbHVlLCBpVmFsdWVMZW4sICZpVXNlZExlbik7DQorICAgICAgICBpZiAoaVVzZWRMZW4gPD0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlWYWx1ZUxlbiAtPSBpVXNlZExlbjsNCisgICAgICAgIHBzelZhbHVlICs9IGlVc2VkTGVuOw0KKyAgICAgICAgZVVuaXQgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI7DQorICAgICAgICBpZiAoaVZhbHVlTGVuID49IDEgJiYgKnBzelZhbHVlID09ICclJykgew0KKyAgICAgICAgICAgIGVVbml0ID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudDsNCisgICAgICAgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID09IDIpIHsNCisgICAgICAgICAgICBGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFIHBVbml0ID0gRkRFX0dldENTU0xlbmd0aFVuaXRCeU5hbWUocHN6VmFsdWUsIDIpOw0KKyAgICAgICAgICAgIGlmIChwVW5pdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGVVbml0ID0gKEZERV9DU1NQUklNSVRJVkVUWVBFKXBVbml0LT53VmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisNCisgICAgRlhfQk9PTCBGREVfUGFyc2VDU1NTdHJpbmcoRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9JTlQzMiAmaU9mZnNldCwgRlhfSU5UMzIgJmlMZW5ndGgpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwc3pWYWx1ZSAhPSBOVUxMICYmIGlWYWx1ZUxlbiA+IDApOw0KKyAgICAgICAgaU9mZnNldCA9IDA7DQorICAgICAgICBpTGVuZ3RoID0gaVZhbHVlTGVuOw0KKyAgICAgICAgaWYgKGlWYWx1ZUxlbiA+PSAyKSB7DQorICAgICAgICAgICAgRlhfV0NIQVIgZmlyc3QgPSBwc3pWYWx1ZVswXSwgbGFzdCA9IHBzelZhbHVlW2lWYWx1ZUxlbiAtIDFdOw0KKyAgICAgICAgICAgIGlmICgoZmlyc3QgPT0gJ1wiJyAmJiBsYXN0ID09ICdcIicpIHx8IChmaXJzdCA9PSAnXCcnICYmIGxhc3QgPT0gJ1wnJykpIHsNCisgICAgICAgICAgICAgICAgaU9mZnNldCA9IDEsIGlMZW5ndGggLT0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaVZhbHVlTGVuID4gMDsNCisgICAgfQ0KKw0KKyAgICBGWF9CT09MIEZERV9QYXJzZUNTU1VSSShGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0lOVDMyICZpT2Zmc2V0LCBGWF9JTlQzMiAmaUxlbmd0aCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQorICAgICAgICBpZiAoaVZhbHVlTGVuIDwgNiB8fCBwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXSAhPSAnKScgfHwgRlhfd2NzbmljbXAoKEZYX0xQQ1dTVFIpTCJ1cmwoIiwgcHN6VmFsdWUsIDQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU1N0cmluZyhwc3pWYWx1ZSArIDQsIGlWYWx1ZUxlbiAtIDUsIGlPZmZzZXQsIGlMZW5ndGgpKSB7DQorICAgICAgICAgICAgaU9mZnNldCArPSA0Ow0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorDQorICAgIEZYX0JPT0wgRkRFX1BhcnNlQ1NTQ29sb3IoRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9BUkdCICZkd0NvbG9yKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocHN6VmFsdWUgIT0gTlVMTCAmJiBpVmFsdWVMZW4gPiAwKTsNCisgICAgICAgIGlmICgqcHN6VmFsdWUgPT0gJyMnKSB7DQorICAgICAgICAgICAgc3dpdGNoIChpVmFsdWVMZW4pIHsNCisgICAgICAgICAgICAgICAgY2FzZSA0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByZWQgPSBGWF9IZXgyRGVjKChGWF9CWVRFKXBzelZhbHVlWzFdLCAoRlhfQllURSlwc3pWYWx1ZVsxXSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBncmVlbiA9IEZYX0hleDJEZWMoKEZYX0JZVEUpcHN6VmFsdWVbMl0sIChGWF9CWVRFKXBzelZhbHVlWzJdKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJsdWUgPSBGWF9IZXgyRGVjKChGWF9CWVRFKXBzelZhbHVlWzNdLCAoRlhfQllURSlwc3pWYWx1ZVszXSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICBjYXNlIDc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHJlZCA9IEZYX0hleDJEZWMoKEZYX0JZVEUpcHN6VmFsdWVbMV0sIChGWF9CWVRFKXBzelZhbHVlWzJdKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGdyZWVuID0gRlhfSGV4MkRlYygoRlhfQllURSlwc3pWYWx1ZVszXSwgKEZYX0JZVEUpcHN6VmFsdWVbNF0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgYmx1ZSA9IEZYX0hleDJEZWMoKEZYX0JZVEUpcHN6VmFsdWVbNV0sIChGWF9CWVRFKXBzelZhbHVlWzZdKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd0NvbG9yID0gQXJnYkVuY29kZSgyNTUsIHJlZCwgZ3JlZW4sIGJsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChpVmFsdWVMZW4gPj0gMTApIHsNCisgICAgICAgICAgICBpZiAocHN6VmFsdWVbaVZhbHVlTGVuIC0gMV0gIT0gJyknIHx8IEZYX3djc25pY21wKChGWF9MUENXU1RSKUwicmdiKCIsIHBzelZhbHVlLCA0KSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0JZVEUgcmdiWzNdID0gezB9Ow0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCisgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgICAgICAgICAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBsaXN0KHBzelZhbHVlICsgNCwgaVZhbHVlTGVuIC0gNSwgJywnKTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgKytpKSB7DQorICAgICAgICAgICAgICAgIGlmICghbGlzdC5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlICE9IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmdiW2ldID0gZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCA/IEZYU1lTX3JvdW5kKGZWYWx1ZSAqIDIuNTVmKSA6IEZYU1lTX3JvdW5kKGZWYWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGR3Q29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgcmdiWzBdLCByZ2JbMV0sIHJnYlsyXSk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZERV9MUENDU1NDT0xPUlRBQkxFIHBDb2xvciA9IEZERV9HZXRDU1NDb2xvckJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICBpZiAocENvbG9yICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgZHdDb2xvciA9IHBDb2xvci0+ZHdWYWx1ZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorI2lmZGVmIF9jcGx1c3BsdXMNCit9Ow0KKyNlbmRpZg0KK0NGREVfQ1NTVmFsdWVMaXN0OjpDRkRFX0NTU1ZhbHVlTGlzdChJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSAmbGlzdCkNCit7DQorICAgIG1faUNvdW50ID0gbGlzdC5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGlCeXRlQ291bnQgPSBtX2lDb3VudCAqIHNpemVvZihJRkRFX0NTU1ZhbHVlKik7DQorICAgIG1fcHBMaXN0ID0gKElGREVfQ1NTVmFsdWUqKilwU3RhdGljU3RvcmUtPkFsbG9jKGlCeXRlQ291bnQpOw0KKyAgICBGWFNZU19tZW1jcHkobV9wcExpc3QsIGxpc3QuR2V0RGF0YSgpLCBpQnl0ZUNvdW50KTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcjo6TmV4dFZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFICZlVHlwZSwgRlhfTFBDV1NUUiAmcFN0YXJ0LCBGWF9JTlQzMiAmaUxlbmd0aCkNCit7DQorICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgKCptX3BDdXIgPD0gJyAnIHx8ICptX3BDdXIgPT0gbV9TZXBhcmF0b3IpKSB7DQorICAgICAgICArK21fcEN1cjsNCisgICAgfQ0KKyAgICBpZiAobV9wQ3VyID49IG1fcEVuZCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVW5rbm93bjsNCisgICAgcFN0YXJ0ID0gbV9wQ3VyOw0KKyAgICBpTGVuZ3RoID0gMDsNCisgICAgRlhfV0NIQVIgd2NoID0gKm1fcEN1cjsNCisgICAgaWYgKHdjaCA9PSAnIycpIHsNCisgICAgICAgIGlMZW5ndGggPSBTa2lwVG8oJyAnKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID09IDQgfHwgaUxlbmd0aCA9PSA3KSB7DQorICAgICAgICAgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoKHdjaCA+PSAnMCcgJiYgd2NoIDw9ICc5JykgfHwgd2NoID09ICcuJyB8fCB3Y2ggPT0gJy0nIHx8IHdjaCA9PSAnKycpIHsNCisgICAgICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgKCptX3BDdXIgPiAnICcgJiYgKm1fcEN1ciAhPSBtX1NlcGFyYXRvcikpIHsNCisgICAgICAgICAgICArK21fcEN1cjsNCisgICAgICAgIH0NCisgICAgICAgIGlMZW5ndGggPSBtX3BDdXIgLSBwU3RhcnQ7DQorICAgICAgICBpZiAoaUxlbmd0aCA+IDApIHsNCisgICAgICAgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmICh3Y2ggPT0gJ1wiJyB8fCB3Y2ggPT0gJ1wnJykgew0KKyAgICAgICAgcFN0YXJ0Kys7DQorICAgICAgICBpTGVuZ3RoID0gU2tpcFRvKHdjaCkgLSAxOw0KKyAgICAgICAgbV9wQ3VyKys7DQorICAgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzsNCisgICAgfSBlbHNlIGlmIChtX3BFbmQgLSBtX3BDdXIgPiA1ICYmIG1fcEN1clszXSA9PSAnKCcpIHsNCisgICAgICAgIGlmIChGWF93Y3NuaWNtcCgoRlhfTFBDV1NUUilMInVybCIsIG1fcEN1ciwgMykgPT0gMCkgew0KKyAgICAgICAgICAgIHdjaCA9IG1fcEN1cls0XTsNCisgICAgICAgICAgICBpZiAod2NoID09ICdcIicgfHwgd2NoID09ICdcJycpIHsNCisgICAgICAgICAgICAgICAgcFN0YXJ0ICs9IDU7DQorICAgICAgICAgICAgICAgIGlMZW5ndGggPSBTa2lwVG8od2NoKSAtIDY7DQorICAgICAgICAgICAgICAgIG1fcEN1ciArPSAyOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBTdGFydCArPSA0Ow0KKyAgICAgICAgICAgICAgICBpTGVuZ3RoID0gU2tpcFRvKCcpJykgLSA0Ow0KKyAgICAgICAgICAgICAgICBtX3BDdXIrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkk7DQorICAgICAgICB9IGVsc2UgaWYgKEZYX3djc25pY21wKChGWF9MUENXU1RSKUwicmdiIiwgbV9wQ3VyLCAzKSA9PSAwKSB7DQorICAgICAgICAgICAgaUxlbmd0aCA9IFNraXBUbygnKScpICsgMTsNCisgICAgICAgICAgICBtX3BDdXIrKzsNCisgICAgICAgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlMZW5ndGggPSBTa2lwVG8obV9TZXBhcmF0b3IsIFRSVUUsIFRSVUUpOw0KKyAgICAgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEN1ciA8PSBtX3BFbmQgJiYgaUxlbmd0aCA+IDA7DQorfQ0KK0ZYX0lOVDMyIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyOjpTa2lwVG8oRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJXU1NlcGFyYXRvciAsIEZYX0JPT0wgYkJyQ29udGludWUgKQ0KK3sNCisgICAgRlhfTFBDV1NUUiBwU3RhcnQgPSBtX3BDdXI7DQorICAgIGlmICghYkJyQ29udGludWUpIHsNCisgICAgICAgIGlmIChiV1NTZXBhcmF0b3IpDQorICAgICAgICAgICAgd2hpbGUgKCsrbV9wQ3VyIDwgbV9wRW5kICYmICptX3BDdXIgIT0gd2NoICYmICptX3BDdXIgPiAnICcpIDsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICB3aGlsZSAoKyttX3BDdXIgPCBtX3BFbmQgJiYgKm1fcEN1ciAhPSB3Y2gpIDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0lOVDMyIGlCcmFja2V0Q291bnQgPSAwOw0KKyAgICAgICAgaWYgKGJXU1NlcGFyYXRvcikgew0KKyAgICAgICAgICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgKm1fcEN1ciAhPSB3Y2ggJiYgKm1fcEN1ciA+ICcgJykgew0KKyAgICAgICAgICAgICAgICBpZiAoKm1fcEN1ciA9PSAnKCcpIHsNCisgICAgICAgICAgICAgICAgICAgIGlCcmFja2V0Q291bnQrKzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqbV9wQ3VyID09ICcpJykgew0KKyAgICAgICAgICAgICAgICAgICAgaUJyYWNrZXRDb3VudC0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcEN1cisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAqbV9wQ3VyICE9IHdjaCkgew0KKyAgICAgICAgICAgICAgICBpZiAoKm1fcEN1ciA9PSAnKCcpIHsNCisgICAgICAgICAgICAgICAgICAgIGlCcmFja2V0Q291bnQrKzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqbV9wQ3VyID09ICcpJykgew0KKyAgICAgICAgICAgICAgICAgICAgaUJyYWNrZXRDb3VudC0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcEN1cisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlIChpQnJhY2tldENvdW50ID4gMCAmJiBtX3BDdXIgPCBtX3BFbmQpIHsNCisgICAgICAgICAgICBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCisgICAgICAgICAgICAgICAgaUJyYWNrZXRDb3VudC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BDdXIrKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQ3VyIC0gcFN0YXJ0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmNjY2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaApAQCAtMCwwICsxLDE5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfQ1NTREFUQVRBQkxFDQorI2RlZmluZSBfRkRFX0NTU0RBVEFUQUJMRQ0KK2NsYXNzIENGREVfQ1NTRnVuY3Rpb246IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9DU1NGdW5jdGlvbihGWF9MUENXU1RSIHBzekZ1bmNOYW1lLCBJRkRFX0NTU1ZhbHVlTGlzdCAqcEFyZ0xpc3QpOiBtX3BzekZ1bmNOYW1lKHBzekZ1bmNOYW1lKSwgbV9wQXJnTGlzdChwQXJnTGlzdCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBBcmdMaXN0ICE9IE5VTEwpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyCQkJCUNvdW50QXJncygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BBcmdMaXN0LT5Db3VudFZhbHVlcygpOw0KKyAgICB9DQorICAgIElGREVfQ1NTVmFsdWUqCQkJR2V0QXJncyhGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEFyZ0xpc3QtPkdldFZhbHVlKGluZGV4KTsNCisgICAgfQ0KKyAgICBGWF9MUENXU1RSCQkJCUdldEZ1bmNOYW1lKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcHN6RnVuY05hbWU7DQorICAgIH07DQorDQorcHJvdGVjdGVkOg0KKyAgICBJRkRFX0NTU1ZhbHVlTGlzdAkJCQkqbV9wQXJnTGlzdDsNCisgICAgRlhfTFBDV1NUUgkJCQkJCW1fcHN6RnVuY05hbWU7DQorfTsNCitjbGFzcyBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIDogcHVibGljIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShjb25zdCBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICZzcmMpDQorICAgIHsNCisgICAgICAgICp0aGlzID0gc3JjOw0KKyAgICB9DQorICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRlhfQVJHQiBjb2xvcikgOiBtX2VUeXBlKEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQiksIG1fZHdDb2xvcihjb2xvcikgeyB9DQorICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSA6IG1fZVR5cGUoRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgLCBtX2VFbnVtKGVWYWx1ZSkgeyB9DQorICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsIEZYX0ZMT0FUIGZWYWx1ZSkgOiBtX2VUeXBlKGVUeXBlKSwgbV9mTnVtYmVyKGZWYWx1ZSkgeyB9DQorICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsIEZYX0xQQ1dTVFIgcFZhbHVlKSA6IG1fZVR5cGUoZVR5cGUpLCBtX3BTdHJpbmcocFZhbHVlKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9wU3RyaW5nICE9IE5VTEwpOw0KKyAgICB9DQorICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoQ0ZERV9DU1NGdW5jdGlvbiAqcEZ1bmN0aW9uKSA6IG1fZVR5cGUoRkRFX0NTU1BSSU1JVElWRVRZUEVfRnVuY3Rpb24pLCBtX3BGdW5jdGlvbihwRnVuY3Rpb24pIHt9DQorDQorICAgIHZpcnR1YWwgRkRFX0NTU1BSSU1JVElWRVRZUEUJR2V0UHJpbWl0aXZlVHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2VUeXBlOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0UkdCQ29sb3IoKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpOw0KKyAgICAgICAgcmV0dXJuIG1fZHdDb2xvcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZsb2F0KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIG1fZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpOw0KKyAgICAgICAgcmV0dXJuIG1fZk51bWJlcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIJCQkJR2V0U3RyaW5nKEZYX0lOVDMyICZpTGVuZ3RoKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcgJiYgbV9lVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkkpOw0KKyAgICAgICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihtX3BTdHJpbmcpOw0KKyAgICAgICAgcmV0dXJuIG1fcFN0cmluZzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NQUk9QRVJUWVZBTFVFCUdldEVudW0oKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKTsNCisgICAgICAgIHJldHVybiBtX2VFbnVtOw0KKyAgICB9DQorICAgIHZpcnR1YWwJRlhfTFBDV1NUUgkJCQlHZXRGdW5jTmFtZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0Z1bmN0aW9uKTsNCisgICAgICAgIHJldHVybiBtX3BGdW5jdGlvbi0+R2V0RnVuY05hbWUoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUNvdW50QXJncygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0Z1bmN0aW9uKTsNCisgICAgICAgIHJldHVybiBtX3BGdW5jdGlvbi0+Q291bnRBcmdzKCk7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKgkJCUdldEFyZ3MoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0Z1bmN0aW9uKTsNCisgICAgICAgIHJldHVybiBtX3BGdW5jdGlvbi0+R2V0QXJncyhpbmRleCk7DQorICAgIH0NCisNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUJCQltX2VUeXBlOw0KKyAgICB1bmlvbiB7DQorICAgICAgICBGWF9BUkdCCQkJCQkJbV9kd0NvbG9yOw0KKyAgICAgICAgRlhfRkxPQVQJCQkJCW1fZk51bWJlcjsNCisgICAgICAgIEZYX0xQQ1dTVFIJCQkJCW1fcFN0cmluZzsNCisgICAgICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFCQltX2VFbnVtOw0KKyAgICAgICAgQ0ZERV9DU1NGdW5jdGlvbgkJCSptX3BGdW5jdGlvbjsNCisgICAgfTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8SUZERV9DU1NQcmltaXRpdmVWYWx1ZSo+IENGREVfQ1NTUHJpbWl0aXZlQXJyYXk7DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1ZhbHVlKj4gQ0ZERV9DU1NWYWx1ZUFycmF5Ow0KK2NsYXNzIENGREVfQ1NTVmFsdWVMaXN0IDogcHVibGljIElGREVfQ1NTVmFsdWVMaXN0LCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTVmFsdWVMaXN0KElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgY29uc3QgQ0ZERV9DU1NWYWx1ZUFycmF5ICZsaXN0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudFZhbHVlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lDb3VudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0VmFsdWUoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BwTGlzdFtpbmRleF07DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIElGREVfQ1NTVmFsdWUJCQkJCSoqbV9wcExpc3Q7DQorICAgIEZYX0lOVDMyCQkJCQkJbV9pQ291bnQ7DQorfTsNCitjbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciA6IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIoRlhfTFBDV1NUUiBwc3osIEZYX0lOVDMyIGlMZW4sIEZYX1dDSEFSIHNlcGFyYXRvcikNCisgICAgICAgIDogbV9TZXBhcmF0b3Ioc2VwYXJhdG9yKSwgbV9wQ3VyKHBzeiksIG1fcEVuZChwc3ogKyBpTGVuKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocHN6ICE9IE5VTEwgJiYgaUxlbiA+IDApOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQlOZXh0VmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUgJmVUeXBlLCBGWF9MUENXU1RSICZwU3RhcnQsIEZYX0lOVDMyICZpTGVuZ3RoKTsNCisgICAgRlhfV0NIQVIJCW1fU2VwYXJhdG9yOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfSU5UMzIJCVNraXBUbyhGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYldTU2VwYXJhdG9yID0gRkFMU0UsIEZYX0JPT0wgYkJyQ29udGludWUgPSBGQUxTRSk7DQorICAgIEZYX0xQQ1dTVFIJCW1fcEN1cjsNCisgICAgRlhfTFBDV1NUUgkJbV9wRW5kOw0KK307DQorI2lmZGVmIF9jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisjZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIJMHgwMTAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bQkJMHgwMjAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJCQkweDA0MDANCisjZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmcJMHgwODAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IJCTB4MTAwMA0KKyNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uCTB4MjAwMA0KKyNkZWZpbmUgRkRFX0lzT25seVZhbHVlKHR5cGUsZW51bSkJCSgoKHR5cGUpICYgfihlbnVtKSkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUpDQorICAgIHN0cnVjdCBGREVfQ1NTUFJPUEVSVFlUQUJMRSB7DQorICAgICAgICBGREVfQ1NTUFJPUEVSVFkJCQllTmFtZTsNCisgICAgICAgIEZYX0xQQ1dTVFIJCQkJcHN6TmFtZTsNCisgICAgICAgIEZYX0RXT1JECQkJCWR3SGFzaDsNCisgICAgICAgIEZYX0RXT1JECQkJCWR3VHlwZTsNCisgICAgfTsNCisgICAgdHlwZWRlZiBGREVfQ1NTUFJPUEVSVFlUQUJMRSBjb25zdCAqIEZERV9MUENDU1NQUk9QRVJUWVRBQkxFOw0KKw0KKyAgICBGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRQkJRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKEZYX0xQQ1dTVFIgcHN6TmFtZSwgRlhfSU5UMzIgaUxlbmd0aCk7DQorICAgIEZERV9MUENDU1NQUk9QRVJUWVRBQkxFCQlGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1BST1BFUlRZIGVOYW1lKTsNCisgICAgc3RydWN0IEZERV9DU1NQUk9QRVJUWVZBTFVFVEFCTEUgew0KKyAgICAgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUJZU5hbWU7DQorICAgICAgICBGWF9MUENXU1RSCQkJCXBzek5hbWU7DQorICAgICAgICBGWF9EV09SRAkJCQlkd0hhc2g7DQorICAgIH07DQorICAgIHR5cGVkZWYgRkRFX0NTU1BST1BFUlRZVkFMVUVUQUJMRSBjb25zdCAqIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEU7DQorDQorICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUoRlhfTFBDV1NUUiBwc3pOYW1lLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCisgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5RW51bShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlTmFtZSk7DQorICAgIHN0cnVjdCBGREVfQ1NTTUVESUFUWVBFVEFCTEUgew0KKyAgICAgICAgRlhfV09SRAkJCQkJd0hhc2g7DQorICAgICAgICBGWF9XT1JECQkJCQl3VmFsdWU7DQorICAgIH07DQorICAgIHR5cGVkZWYgRkRFX0NTU01FRElBVFlQRVRBQkxFIGNvbnN0ICogRkRFX0xQQ0NTU01FRElBVFlQRVRBQkxFOw0KKyAgICBGREVfTFBDQ1NTTUVESUFUWVBFVEFCTEUJRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShGWF9MUENXU1RSIHBzek5hbWUsIEZYX0lOVDMyIGlMZW5ndGgpOw0KKyAgICBzdHJ1Y3QgRkRFX0NTU0xFTkdUSFVOSVRUQUJMRSB7DQorICAgICAgICBGWF9XT1JECQkJCQl3SGFzaDsNCisgICAgICAgIEZYX1dPUkQJCQkJCXdWYWx1ZTsNCisgICAgfTsNCisgICAgdHlwZWRlZiBGREVfQ1NTTEVOR1RIVU5JVFRBQkxFIGNvbnN0ICogRkRFX0xQQ0NTU0xFTkdUSFVOSVRUQUJMRTsNCisgICAgRkRFX0xQQ0NTU0xFTkdUSFVOSVRUQUJMRQlGREVfR2V0Q1NTTGVuZ3RoVW5pdEJ5TmFtZShGWF9MUENXU1RSIHBzek5hbWUsIEZYX0lOVDMyIGlMZW5ndGgpOw0KKyAgICBzdHJ1Y3QgRkRFX0NTU0NPTE9SVEFCTEUgew0KKyAgICAgICAgRlhfRFdPUkQJCQkJZHdIYXNoOw0KKyAgICAgICAgRlhfQVJHQgkJCQkJZHdWYWx1ZTsNCisgICAgfTsNCisgICAgdHlwZWRlZiBGREVfQ1NTQ09MT1JUQUJMRSBjb25zdCAqIEZERV9MUENDU1NDT0xPUlRBQkxFOw0KKyAgICBGREVfTFBDQ1NTQ09MT1JUQUJMRQkJRkRFX0dldENTU0NvbG9yQnlOYW1lKEZYX0xQQ1dTVFIgcHN6TmFtZSwgRlhfSU5UMzIgaUxlbmd0aCk7DQorICAgIHN0cnVjdCBGREVfQ1NTUEVSU1VET1RBQkxFIHsNCisgICAgICAgIEZERV9DU1NQRVJTVURPCQkJZU5hbWU7DQorICAgICAgICBGWF9MUENXU1RSCQkJCXBzek5hbWU7DQorICAgICAgICBGWF9EV09SRAkJCQlkd0hhc2g7DQorICAgIH07DQorICAgIHR5cGVkZWYgRkRFX0NTU1BFUlNVRE9UQUJMRSBjb25zdCAqIEZERV9MUENDU1NQRVJTVURPVEFCTEU7DQorDQorICAgIEZERV9MUENDU1NQRVJTVURPVEFCTEUJCUZERV9HZXRDU1NQZXJzdWRvQnlFbnVtKEZERV9DU1NQRVJTVURPIGVQZXJzdWRvKTsNCisgICAgRlhfQk9PTAlGREVfUGFyc2VDU1NOdW1iZXIoRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9GTE9BVCAmZlZhbHVlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSAmZVVuaXQpOw0KKyAgICBGWF9CT09MCUZERV9QYXJzZUNTU1N0cmluZyhGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0lOVDMyICZpT2Zmc2V0LCBGWF9JTlQzMiAmaUxlbmd0aCk7DQorICAgIEZYX0JPT0wJRkRFX1BhcnNlQ1NTQ29sb3IoRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9BUkdCICZkd0NvbG9yKTsNCisgICAgRlhfQk9PTAlGREVfUGFyc2VDU1NVUkkoRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9JTlQzMiAmaU9mZnNldCwgRlhfSU5UMzIgJmlMZW5ndGgpOw0KKyNpZmRlZiBfY3BsdXNwbHVzDQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiYmM1YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmNwcApAQCAtMCwwICsxLDExOTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NkZWNsYXJhdGlvbi5oIg0KK0lGREVfQ1NTVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246OkdldFByb3BlcnR5KEZERV9DU1NQUk9QRVJUWSBlUHJvcGVydHksIEZYX0JPT0wgJmJJbXBvcnRhbnQpIGNvbnN0DQorew0KKyAgICBmb3IgKEZERV9MUENTU1BST1BFUlRZSE9MREVSIHBIb2xkZXIgPSBtX3BGaXJzdFByb3BlcnR5OyBwSG9sZGVyOyBwSG9sZGVyID0gcEhvbGRlci0+cE5leHQpIHsNCisgICAgICAgIGlmIChwSG9sZGVyLT5lUHJvcGVydHkgPT0gZVByb3BlcnR5KSB7DQorICAgICAgICAgICAgYkltcG9ydGFudCA9IHBIb2xkZXItPmJJbXBvcnRhbnQ7DQorICAgICAgICAgICAgcmV0dXJuIHBIb2xkZXItPnBWYWx1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfUE9TSVRJT04gQ0ZERV9DU1NEZWNsYXJhdGlvbjo6R2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcEZpcnN0UHJvcGVydHk7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6R2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OICZwb3MsIEZERV9DU1NQUk9QRVJUWSAmZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlIComcFZhbHVlLCBGWF9CT09MICZiSW1wb3J0YW50KSBjb25zdA0KK3sNCisgICAgRkRFX0xQQ1NTUFJPUEVSVFlIT0xERVIgcEhvbGRlciA9IChGREVfTFBDU1NQUk9QRVJUWUhPTERFUilwb3M7DQorICAgIEZYU1lTX2Fzc2VydChwSG9sZGVyICE9IE5VTEwpOw0KKyAgICBiSW1wb3J0YW50ID0gcEhvbGRlci0+YkltcG9ydGFudDsNCisgICAgZVByb3BlcnR5ID0gKEZERV9DU1NQUk9QRVJUWSlwSG9sZGVyLT5lUHJvcGVydHk7DQorICAgIHBWYWx1ZSA9IHBIb2xkZXItPnBWYWx1ZTsNCisgICAgcG9zID0gKEZYX1BPU0lUSU9OKXBIb2xkZXItPnBOZXh0Ow0KK30NCitGWF9QT1NJVElPTiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpHZXRTdGFydEN1c3RvbSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcEZpcnN0Q3VzdG9tOw0KK30NCit2b2lkIENGREVfQ1NTRGVjbGFyYXRpb246OkdldE5leHRDdXN0b20oRlhfUE9TSVRJT04gJnBvcywgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0DQorew0KKyAgICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWSBwUHJvcGVydHkgPSAoRkRFX0xQQ1NTQ1VTVE9NUFJPUEVSVFkpcG9zOw0KKyAgICBpZiAocFByb3BlcnR5ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB3c05hbWUgPSBwUHJvcGVydHktPnB3c05hbWU7DQorICAgIHdzVmFsdWUgPSBwUHJvcGVydHktPnB3c1ZhbHVlOw0KKyAgICBwb3MgPSAoRlhfUE9TSVRJT04pcFByb3BlcnR5LT5wTmV4dDsNCit9DQorRlhfTFBDV1NUUiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpDb3B5VG9Mb2NhbChGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4pDQorew0KKyAgICBGWFNZU19hc3NlcnQoaVZhbHVlTGVuID4gMCk7DQorICAgIENGWF9NYXBQdHJUb1B0ciAqcENhY2hlID0gcEFyZ3MtPnBTdHJpbmdDYWNoZTsNCisgICAgRlhfTFBWT0lEIHBLZXkgPSBOVUxMOw0KKyAgICBpZiAocENhY2hlKSB7DQorICAgICAgICBGWF9MUFZPSUQgcHN6Q2FjaGVkID0gTlVMTDsNCisgICAgICAgIHBLZXkgPSAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzelZhbHVlLCBpVmFsdWVMZW4sIEZBTFNFKTsNCisgICAgICAgIGlmIChwQ2FjaGUtPkxvb2t1cChwS2V5LCBwc3pDYWNoZWQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIChGWF9MUENXU1RSKXBzekNhY2hlZDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9MUFdTVFIgcHN6ID0gKEZYX0xQV1NUUilwQXJncy0+cFN0YXRpY1N0b3JlLT5BbGxvYygoaVZhbHVlTGVuICsgMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgaWYgKHBzeiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU193Y3NuY3B5KHBzeiwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgIHBzeltpVmFsdWVMZW5dID0gJ1wwJzsNCisgICAgaWYgKHBDYWNoZSkgew0KKyAgICAgICAgcENhY2hlLT5TZXRBdChwS2V5LCBwc3opOw0KKyAgICB9DQorICAgIHJldHVybiBwc3o7DQorfQ0KK0lGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246Ok5ld051bWJlclZhbHVlKElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkgY29uc3QNCit7DQorICAgIHN0YXRpYyBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIHNfWmVyb1ZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgMC4wZik7DQorICAgIGlmIChlVW5pdCA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYgRlhTWVNfZmFicyhmVmFsdWUpIDwgMC4wMDFmKSB7DQorICAgICAgICByZXR1cm4gJnNfWmVyb1ZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVVuaXQsIGZWYWx1ZSk7DQorfQ0KK2lubGluZSBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpOZXdFbnVtVmFsdWUoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGVWYWx1ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHlIb2xkZXIoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlICpwVmFsdWUsIEZYX0JPT0wgYkltcG9ydGFudCkNCit7DQorICAgIEZERV9MUENTU1BST1BFUlRZSE9MREVSIHBIb2xkZXIgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIEZERV9DU1NQUk9QRVJUWUhPTERFUjsNCisgICAgcEhvbGRlci0+YkltcG9ydGFudCA9IGJJbXBvcnRhbnQ7DQorICAgIHBIb2xkZXItPmVQcm9wZXJ0eSA9IGVQcm9wZXJ0eTsNCisgICAgcEhvbGRlci0+cFZhbHVlID0gcFZhbHVlOw0KKyAgICBwSG9sZGVyLT5wTmV4dCA9IE5VTEw7DQorICAgIGlmIChtX3BMYXN0UHJvcGVydHkgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wTGFzdFByb3BlcnR5ID0gbV9wRmlyc3RQcm9wZXJ0eSA9IHBIb2xkZXI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BMYXN0UHJvcGVydHktPnBOZXh0ID0gcEhvbGRlcjsNCisgICAgICAgIG1fcExhc3RQcm9wZXJ0eSA9IHBIb2xkZXI7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4pDQorew0KKyAgICBGWFNZU19hc3NlcnQoaVZhbHVlTGVuID4gMCk7DQorICAgIEZYX0JPT0wgYkltcG9ydGFudCA9IEZBTFNFOw0KKyAgICBpZiAoaVZhbHVlTGVuID49IDEwICYmIHBzelZhbHVlW2lWYWx1ZUxlbiAtIDEwXSA9PSAnIScNCisgICAgICAgICAgICAmJiBGWF93Y3NuaWNtcCgoRlhfTFBDV1NUUilMImltcG9ydGFudCIsIHBzelZhbHVlICsgaVZhbHVlTGVuIC0gOSwgOSkgPT0gMCkgew0KKyAgICAgICAgaWYgKChpVmFsdWVMZW4gLT0gMTApID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBiSW1wb3J0YW50ID0gVFJVRTsNCisgICAgfQ0KKyAgICBjb25zdCBGWF9EV09SRCBkd1R5cGUgPSBwQXJncy0+cFByb3BlcnR5LT5kd1R5cGU7DQorICAgIHN3aXRjaCAoZHdUeXBlICYgMHgwRikgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZTogew0KKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgZ19WYWx1ZUd1ZXNzT3JkZXJbXSA9IHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSwNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvciwNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkksDQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRnVuY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nLA0KKyAgICAgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgRlhfSU5UMzIgZ19WYWx1ZUd1ZXNzQ291bnQgPSBzaXplb2YoZ19WYWx1ZUd1ZXNzT3JkZXIpIC8gc2l6ZW9mKEZYX0RXT1JEKTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGdfVmFsdWVHdWVzc0NvdW50OyArK2kpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0RXT1JEIGR3TWF0Y2ggPSBkd1R5cGUgJiBnX1ZhbHVlR3Vlc3NPcmRlcltpXTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChkd01hdGNoID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUgKnBDU1NWYWx1ZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGR3TWF0Y2gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVGdW5jdGlvbjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VGdW5jdGlvbihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VOdW1iZXIocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUgPSBQYXJzZUVudW0ocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VDb2xvcihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVVSSToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VVUkkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlU3RyaW5nKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAocENTU1ZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwQXJncy0+cFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgcENTU1ZhbHVlLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfSXNPbmx5VmFsdWUoZHdUeXBlLCBnX1ZhbHVlR3Vlc3NPcmRlcltpXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kOiB7DQorICAgICAgICAgICAgICAgIElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUgKnBDb2xvciwgKnBTdHlsZSwgKnBXaWR0aDsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChwQXJncy0+cFByb3BlcnR5LT5lTmFtZSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRm9udDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VGb250UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZDoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VCYWNrZ3JvdW5kUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZUxpc3RTdHlsZVByb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlcjoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Q29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wV2lkdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BvZXJ0eShwU3RhdGljU3RvcmUsIHBzelZhbHVlLCBpVmFsdWVMZW4sIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcDoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wV2lkdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodDoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b206DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcG9lcnR5KHBTdGF0aWNTdG9yZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tQ29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVdpZHRoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3c6DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlT3ZlcmZsb3dQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZUNvbHVtblJ1bGVQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX0xpc3Q6DQorICAgICAgICAgICAgc3dpdGNoIChwQXJncy0+cFByb3BlcnR5LT5lTmFtZSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db3VudGVySW5jcmVtZW50Og0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VDb3VudGVyUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db250ZW50Og0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlQ29udGVudFByb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVZhbHVlTGlzdFByb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OkFkZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6TmFtZSwgRlhfSU5UMzIgaU5hbWVMZW4sIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbikNCit7DQorICAgIEZERV9MUENTU0NVU1RPTVBST1BFUlRZIHBQcm9wZXJ0eSA9IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpIEZERV9DU1NDVVNUT01QUk9QRVJUWTsNCisgICAgcFByb3BlcnR5LT5wd3NOYW1lID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzek5hbWUsIGlOYW1lTGVuKTsNCisgICAgcFByb3BlcnR5LT5wd3NWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgcFByb3BlcnR5LT5wTmV4dCA9IE5VTEw7DQorICAgIGlmIChtX3BMYXN0Q3VzdG9tID09IE5VTEwpIHsNCisgICAgICAgIG1fcExhc3RDdXN0b20gPSBtX3BGaXJzdEN1c3RvbSA9IHBQcm9wZXJ0eTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcExhc3RDdXN0b20tPnBOZXh0ID0gcFByb3BlcnR5Ow0KKyAgICAgICAgbV9wTGFzdEN1c3RvbSA9IHBQcm9wZXJ0eTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VOdW1iZXIoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuKQ0KK3sNCisgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdDsNCisgICAgaWYgKCFGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVW5pdCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBOZXdOdW1iZXJWYWx1ZShwQXJncy0+cFN0YXRpY1N0b3JlLCBlVW5pdCwgZlZhbHVlKTsNCit9DQorSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VFbnVtKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbikNCit7DQorICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgIHJldHVybiBwVmFsdWUgPyBOZXdFbnVtVmFsdWUocEFyZ3MtPnBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNvbG9yKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbikNCit7DQorICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgaWYgKCFGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZHdDb2xvcik7DQorfQ0KK0lGREVfQ1NTVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlVVJJKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbikNCit7DQorICAgIEZYX0lOVDMyIGlPZmZzZXQ7DQorICAgIGlmICghRkRFX1BhcnNlQ1NTVVJJKHBzelZhbHVlLCBpVmFsdWVMZW4sIGlPZmZzZXQsIGlWYWx1ZUxlbikpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChpVmFsdWVMZW4gPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcHN6VmFsdWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUgKyBpT2Zmc2V0LCBpVmFsdWVMZW4pOw0KKyAgICByZXR1cm4gcHN6VmFsdWUgPyBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSSwgcHN6VmFsdWUpIDogTlVMTDsNCit9DQorSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VTdHJpbmcoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuKQ0KK3sNCisgICAgRlhfSU5UMzIgaU9mZnNldDsNCisgICAgaWYgKCFGREVfUGFyc2VDU1NTdHJpbmcocHN6VmFsdWUsIGlWYWx1ZUxlbiwgaU9mZnNldCwgaVZhbHVlTGVuKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKGlWYWx1ZUxlbiA8PSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSArIGlPZmZzZXQsIGlWYWx1ZUxlbik7DQorICAgIHJldHVybiBwc3pWYWx1ZSA/IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nLCBwc3pWYWx1ZSkgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUZ1bmN0aW9uKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbikNCit7DQorICAgIGlmIChwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXSAhPSAnKScpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlTdGFydEJyYWNrZXQgPSAwOw0KKyAgICB3aGlsZSAocHN6VmFsdWVbaVN0YXJ0QnJhY2tldF0gIT0gJygnKSB7DQorICAgICAgICBpZiAoaVN0YXJ0QnJhY2tldCA8IGlWYWx1ZUxlbikgew0KKyAgICAgICAgICAgIGlTdGFydEJyYWNrZXQrKzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlTdGFydEJyYWNrZXQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUiBwc3pGdW5jTmFtZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVN0YXJ0QnJhY2tldCk7DQorICAgIHBzelZhbHVlICs9IChpU3RhcnRCcmFja2V0ICsgMSk7DQorICAgIGlWYWx1ZUxlbiAtPSAoaVN0YXJ0QnJhY2tldCArIDIpOw0KKyAgICBDRkRFX0NTU1ZhbHVlQXJyYXkgYXJndW1lbnRBcnI7DQorICAgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLCcpOw0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlUHJpbWl0aXZlVHlwZTsNCisgICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVByaW1pdGl2ZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgICAgICBzd2l0Y2ggKGVQcmltaXRpdmVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFByb3BlcnR5VmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUHJvcGVydHlWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRBcnIuQWRkKE5ld0VudW1WYWx1ZShwQXJncy0+cFN0YXRpY1N0b3JlLCBwUHJvcGVydHlWYWx1ZS0+ZU5hbWUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUgKnBGdW5jdGlvblZhbHVlID0gUGFyc2VGdW5jdGlvbihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEZ1bmN0aW9uVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZChwRnVuY3Rpb25WYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudEFyci5BZGQoRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVByaW1pdGl2ZVR5cGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRBcnIuQWRkKE5ld051bWJlclZhbHVlKHBBcmdzLT5wU3RhdGljU3RvcmUsIGVQcmltaXRpdmVUeXBlLCBmVmFsdWUpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBhcmd1bWVudEFyci5BZGQoRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBJRkRFX0NTU1ZhbHVlTGlzdCAqcEFyZ3VtZW50TGlzdCA9IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBBcmdzLT5wU3RhdGljU3RvcmUsIGFyZ3VtZW50QXJyKTsNCisgICAgQ0ZERV9DU1NGdW5jdGlvbiAqcEZ1bmN0aW9uID0gRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NGdW5jdGlvbihwc3pGdW5jTmFtZSwgcEFyZ3VtZW50TGlzdCk7DQorICAgIHJldHVybiBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBGdW5jdGlvbik7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb250ZW50UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQorew0KKyAgICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUgPSAoSUZYX01FTUFsbG9jYXRvciopcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdDsNCisgICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkk6DQorICAgICAgICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBWYWx1ZS0+ZU5hbWUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3BlblF1b3RlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Nsb3NlUXVvdGU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9PcGVuUXVvdGU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9DbG9zZVF1b3RlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSAqcEZ1bmN0aW9uID0gUGFyc2VGdW5jdGlvbihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEZ1bmN0aW9uICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChwRnVuY3Rpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3QpLCBiSW1wb3J0YW50KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb3VudGVyUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQorew0KKyAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgICAgQ0ZERV9DU1NWYWx1ZUFycmF5IGxpc3Q7DQorICAgIENGREVfQ1NTVmFsdWVBcnJheSBsaXN0RnVsbDsNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QuR2V0U2l6ZSgpID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RGdWxsLkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHN6VmFsdWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgcHN6VmFsdWUpKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEZ1bGwuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nLCBwc3pWYWx1ZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChsaXN0LkdldFNpemUoKSA9PSAxKSB7DQorICAgICAgICBsaXN0RnVsbC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3QpKTsNCisgICAgfQ0KKyAgICBpZiAobGlzdEZ1bGwuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIHBBcmdzLT5wUHJvcGVydHktPmVOYW1lLCBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdEZ1bGwpLCBiSW1wb3J0YW50KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VWYWx1ZUxpc3RQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCkNCit7DQorICAgIElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICAgIEZYX1dDSEFSIHNlcGFyYXRvciA9IChwQXJncy0+cFByb3BlcnR5LT5lTmFtZSA9PSBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSkgPyAnLCcgOiAnICc7DQorICAgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBzZXBhcmF0b3IpOw0KKyAgICBjb25zdCBGWF9EV09SRCBkd1R5cGUgPSBwQXJncy0+cFByb3BlcnR5LT5kd1R5cGU7DQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdDsNCisgICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICAgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6DQorICAgICAgICAgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9IEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nKSB7DQorICAgICAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I6DQorICAgICAgICAgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGxpc3QuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJDb2xvcjoNCisgICAgICAgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvcik7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZToNCisgICAgICAgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSk7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJXaWR0aDoNCisgICAgICAgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCk7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW46DQorICAgICAgICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eShwU3RhdGljU3RvcmUsIGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpblRvcCwgRkRFX0NTU1BST1BFUlRZX01hcmdpblJpZ2h0LCBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luQm90dG9tKTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmc6DQorICAgICAgICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eShwU3RhdGljU3RvcmUsIGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbSk7DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIENGREVfQ1NTVmFsdWVMaXN0ICpwTGlzdCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KTsNCisgICAgICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgcExpc3QsIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OkFkZDRWYWx1ZXNQcm9wZXJ0eShJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSAmbGlzdCwgRlhfQk9PTCBiSW1wb3J0YW50LCBGREVfQ1NTUFJPUEVSVFkgZUxlZnQsIEZERV9DU1NQUk9QRVJUWSBlVG9wLCBGREVfQ1NTUFJPUEVSVFkgZVJpZ2h0LCBGREVfQ1NTUFJPUEVSVFkgZUJvdHRvbSkNCit7DQorICAgIHN3aXRjaCAobGlzdC5HZXRTaXplKCkpIHsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUxlZnQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUJvdHRvbSwgbGlzdFswXSwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlTGVmdCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQm90dG9tLCBsaXN0WzJdLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzNdLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzFdLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMl0sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VCb3JkZXJQcm9wb2VydHkoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIElGREVfQ1NTVmFsdWUgKiZwQ29sb3IsIElGREVfQ1NTVmFsdWUgKiZwU3R5bGUsIElGREVfQ1NTVmFsdWUgKiZwV2lkdGgpIGNvbnN0DQorew0KKyAgICBwQ29sb3IgPSBwU3R5bGUgPSBwV2lkdGggPSBOVUxMOw0KKyAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOg0KKyAgICAgICAgICAgICAgICBpZiAocFdpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCOg0KKyAgICAgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9ySXRlbSA9IEZERV9HZXRDU1NDb2xvckJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sb3JJdGVtICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBDb2xvckl0ZW0tPmR3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaWNrOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWVkaXVtOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGRlbjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZDoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rhc2hlZDoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlkZ2U6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNldDoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQorICAgIH0NCisgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lKTsNCisgICAgfQ0KKyAgICBpZiAocFdpZHRoID09IE5VTEwpIHsNCisgICAgICAgIHBXaWR0aCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRCb3JkZXJQcm9wZXJ0eShJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIElGREVfQ1NTVmFsdWUgKnBDb2xvciwgSUZERV9DU1NWYWx1ZSAqcFN0eWxlLCBJRkRFX0NTU1ZhbHVlICpwV2lkdGgsIEZYX0JPT0wgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZIGVDb2xvciwgRkRFX0NTU1BST1BFUlRZIGVTdHlsZSwgRkRFX0NTU1BST1BFUlRZIGVXaWR0aCkNCit7DQorICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVN0eWxlLCBwU3R5bGUsIGJJbXBvcnRhbnQpOw0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVXaWR0aCwgcFdpZHRoLCBiSW1wb3J0YW50KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQ29sb3IsIHBDb2xvciwgYkltcG9ydGFudCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VMaXN0U3R5bGVQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCkNCit7DQorICAgIElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICAgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwVHlwZSA9IE5VTEwsICpwSW1hZ2UgPSBOVUxMLCAqcFBvc2l0aW9uID0gTlVMTDsNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgICAgICAgICBpZiAocEltYWdlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHBJbWFnZSA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEltYWdlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBUeXBlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zaWRlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2lkZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQb3NpdGlvbiA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUG9zaXRpb24gPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc2M6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DaXJjbGU6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TcXVhcmU6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJSb21hbjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyUm9tYW46DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckdyZWVrOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJMYXRpbjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyTGF0aW46DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bcm1lbmlhbjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dlb3JnaWFuOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJBbHBoYToNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyQWxwaGE6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVHlwZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFBvc2l0aW9uID09IE5VTEwpIHsNCisgICAgICAgIHBQb3NpdGlvbiA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUpOw0KKyAgICB9DQorICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KKyAgICAgICAgcEltYWdlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSk7DQorICAgIH0NCisgICAgaWYgKHBUeXBlID09IE5VTEwpIHsNCisgICAgICAgIHBUeXBlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSk7DQorICAgIH0NCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlUG9zaXRpb24sIHBQb3NpdGlvbiwgYkltcG9ydGFudCk7DQorICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlLCBwSW1hZ2UsIGJJbXBvcnRhbnQpOw0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVUeXBlLCBwVHlwZSwgYkltcG9ydGFudCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQmFja2dyb3VuZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KK3sNCisgICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBDb2xvciA9IE5VTEwsICpwSW1hZ2UgPSBOVUxMLCAqcFJlcGVhdCA9IE5VTEw7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBQb3NYID0gTlVMTCwgKnBQb3NZID0gTlVMTCwgKnBBdHRhY2htZW50ID0gTlVMTDsNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgICAgICAgICBpZiAocEltYWdlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHBJbWFnZSA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChwUG9zWCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUG9zWSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFBvc1kgPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICAgICAgICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9IEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGw6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEF0dGFjaG1lbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdHRhY2htZW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRZOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vUmVwZWF0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBlYXQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBlYXQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBvc1ggPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQb3NYID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3A6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90dG9tOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQb3NZID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUG9zWCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUG9zWCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUG9zWSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9ySXRlbSA9IEZERV9HZXRDU1NDb2xvckJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sb3JJdGVtICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShwQ29sb3JJdGVtLT5kd1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I6DQorICAgICAgICAgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KKyAgICB9DQorICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KKyAgICAgICAgcEltYWdlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSk7DQorICAgIH0NCisgICAgaWYgKHBSZXBlYXQgPT0gTlVMTCkgew0KKyAgICAgICAgcFJlcGVhdCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdCk7DQorICAgIH0NCisgICAgaWYgKHBBdHRhY2htZW50ID09IE5VTEwpIHsNCisgICAgICAgIHBBdHRhY2htZW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsKTsNCisgICAgfQ0KKyAgICBpZiAocFBvc1ggPT0gTlVMTCkgew0KKyAgICAgICAgcFBvc1ggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgMC4wZik7DQorICAgICAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgICAgfSBlbHNlIGlmIChwUG9zWSA9PSBOVUxMKSB7DQorICAgICAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgICAgfQ0KKyAgICBDRkRFX0NTU1ZhbHVlQXJyYXkgcG9zaXRpb247DQorICAgIHBvc2l0aW9uLkFkZChwUG9zWCk7DQorICAgIHBvc2l0aW9uLkFkZChwUG9zWSk7DQorICAgIENGREVfQ1NTVmFsdWVMaXN0ICpwUG9zTGlzdCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBwb3NpdGlvbik7DQorICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRDb2xvciwgcENvbG9yLCBiSW1wb3J0YW50KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEltYWdlLCBwSW1hZ2UsIGJJbXBvcnRhbnQpOw0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0LCBwUmVwZWF0LCBiSW1wb3J0YW50KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZFBvc2l0aW9uLCBwUG9zTGlzdCwgYkltcG9ydGFudCk7DQorICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRBdHRhY2htZW50LCBwQXR0YWNobWVudCwgYkltcG9ydGFudCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlRm9udFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KK3sNCisgICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcvJyk7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBTdHlsZSA9IE5VTEwsICpwVmFyaWFudCA9IE5VTEwsICpwV2VpZ2h0ID0gTlVMTDsNCisgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcEZvbnRTaXplID0gTlVMTCwgKnBMaW5lSGVpZ2h0ID0gTlVMTDsNCisgICAgQ0ZERV9DU1NWYWx1ZUFycmF5IGZhbWlseUxpc3Q7DQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4U21hbGw6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YTGFyZ2U6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlcjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9udFNpemUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXI6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlcjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWM6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT2JsaXF1ZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3R5bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxDYXBzOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBGb250U2l6ZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnRTaXplID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZUhlaWdodCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAocEZvbnRTaXplICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlMaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVR5cGUsIENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLm1fU2VwYXJhdG9yID0gJywnOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKEZYX0lOVDMyKWZWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDA6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzAwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDA6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjAwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDcwMDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDA6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTAwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXZWlnaHQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXZWlnaHQgPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgZlZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChwRm9udFNpemUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwTGluZUhlaWdodCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgICB9DQorICAgIGlmIChwVmFyaWFudCA9PSBOVUxMKSB7DQorICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCk7DQorICAgIH0NCisgICAgaWYgKHBXZWlnaHQgPT0gTlVMTCkgew0KKyAgICAgICAgcFdlaWdodCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCk7DQorICAgIH0NCisgICAgaWYgKHBGb250U2l6ZSA9PSBOVUxMKSB7DQorICAgICAgICBwRm9udFNpemUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KKyAgICB9DQorICAgIGlmIChwTGluZUhlaWdodCA9PSBOVUxMKSB7DQorICAgICAgICBwTGluZUhlaWdodCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCk7DQorICAgIH0NCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLCBwU3R5bGUsIGJJbXBvcnRhbnQpOw0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudCwgcFZhcmlhbnQsIGJJbXBvcnRhbnQpOw0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Gb250V2VpZ2h0LCBwV2VpZ2h0LCBiSW1wb3J0YW50KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsIHBGb250U2l6ZSwgYkltcG9ydGFudCk7DQorICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpbmVIZWlnaHQsIHBMaW5lSGVpZ2h0LCBiSW1wb3J0YW50KTsNCisgICAgaWYgKGZhbWlseUxpc3QuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgQ0ZERV9DU1NWYWx1ZUxpc3QgKnBMaXN0ID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGZhbWlseUxpc3QpOw0KKyAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwgcExpc3QsIGJJbXBvcnRhbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29sdW1uUnVsZVByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KK3sNCisgICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBDb2x1bW5SdWxlV2lkdGggPSBOVUxMOw0KKyAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwQ29sdW1uUnVsZVN0eWxlID0gTlVMTDsNCisgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcENvbHVtblJ1bGVDb2xvciA9IE5VTEw7DQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dyb292ZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNldDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtblJ1bGVTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtblJ1bGVDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVDb2xvciA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpY2s6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikgJiYgcENvbHVtblJ1bGVDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQilkd0NvbG9yKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSAmJiBwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZVdpZHRoID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCAmJiBGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5SdWxlQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpZHdDb2xvcik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCAmJiBwQ29sdW1uUnVsZVN0eWxlID09IE5VTEwgJiYgcENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBDb2x1bW5SdWxlU3R5bGUgPT0gTlVMTCkgew0KKyAgICAgICAgcENvbHVtblJ1bGVTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KKyAgICB9DQorICAgIGlmIChwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCisgICAgICAgIHBDb2x1bW5SdWxlV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KKyAgICB9DQorICAgIGlmIChwQ29sdW1uUnVsZUNvbG9yID09IE5VTEwpIHsNCisgICAgICAgIHBDb2x1bW5SdWxlQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQorICAgIH0NCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlLCBwQ29sdW1uUnVsZVN0eWxlLCBiSW1wb3J0YW50KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoLCBwQ29sdW1uUnVsZVdpZHRoLCBiSW1wb3J0YW50KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZUNvbG9yLCBwQ29sdW1uUnVsZUNvbG9yLCBiSW1wb3J0YW50KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VUZXh0RW1waGFzaXNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCkNCit7DQorICAgIElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICAgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgICBDRkRFX0NTU1ZhbHVlQXJyYXkgYXJyRW1waGFzaXNTdHlsZTsNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBFbXBoYXNpc0NvbG9yID0gTlVMTDsNCisgICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBhcnJFbXBoYXNpc1N0eWxlLkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRW1waGFzaXNDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgYXJyRW1waGFzaXNTdHlsZS5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgcHN6VmFsdWUpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEVtcGhhc2lzQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZHdDb2xvcik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyckVtcGhhc2lzU3R5bGUuR2V0U2l6ZSgpICE9IDApIHsNCisgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlLCBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgYXJyRW1waGFzaXNTdHlsZSksIGJJbXBvcnRhbnQpOw0KKyAgICB9DQorICAgIGlmIChwRW1waGFzaXNDb2xvciAhPSBOVUxMKSB7DQorICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXNDb2xvciwgcEVtcGhhc2lzQ29sb3IsIGJJbXBvcnRhbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29sdW1uc1Byb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KK3sNCisgICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBDb2x1bW5XaWR0aCA9IE5VTEw7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBDb2x1bW5Db3VudCA9IE5VTEw7DQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCAmJiBwVmFsdWUtPmVOYW1lID09IEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29sdW1uV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtbkNvdW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sdW1uQ291bnQgPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtbldpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sdW1uV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwQ29sdW1uV2lkdGggPT0gTlVMTCAmJiBwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2UgaWYgKHBDb2x1bW5XaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICBwQ29sdW1uV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvKTsNCisgICAgfSBlbHNlIGlmIChwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KKyAgICAgICAgcENvbHVtbkNvdW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0byk7DQorICAgIH0NCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uV2lkdGgsIHBDb2x1bW5XaWR0aCwgYkltcG9ydGFudCk7DQorICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkNvdW50LCBwQ29sdW1uQ291bnQsIGJJbXBvcnRhbnQpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZU92ZXJmbG93UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQorew0KKyAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcE92ZXJmbG93WCA9IE5VTEw7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBPdmVyZmxvd1kgPSBOVUxMOw0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nKSB7DQorICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfSGlkZGVuOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfU2Nyb2xsOg0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfQXV0bzoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU09WRVJGTE9XX05vRGlzcGxheToNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU09WRVJGTE9XX05vQ29udGVudDoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE92ZXJmbG93WCAhPSBOVUxMICYmIHBPdmVyZmxvd1kgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT3ZlcmZsb3dYID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93WCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocE92ZXJmbG93WSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1kgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwT3ZlcmZsb3dYID09IE5VTEwgJiYgcE92ZXJmbG93WSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gZWxzZSBpZiAocE92ZXJmbG93WSA9PSBOVUxMKSB7DQorICAgICAgICBwT3ZlcmZsb3dZID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcE92ZXJmbG93WC0+R2V0RW51bSgpKTsNCisgICAgfQ0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1gsIHBPdmVyZmxvd1gsIGJJbXBvcnRhbnQpOw0KKyAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1ksIHBPdmVyZmxvd1ksIGJJbXBvcnRhbnQpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwYWRkOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfQ1NTREVDTEFSQVRJT04NCisjZGVmaW5lIF9GREVfQ1NTREVDTEFSQVRJT04NCisjaW5jbHVkZSAiZmRlX2Nzc2RhdGF0YWJsZS5oIg0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ1NTUFJPUEVSVFlIT0xERVIgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorICAgIEZYX0lOVDE2CQkJCQkJZVByb3BlcnR5Ow0KKyAgICBGWF9JTlQxNgkJCQkJCWJJbXBvcnRhbnQ7DQorICAgIElGREVfQ1NTVmFsdWUJCQkJCSpwVmFsdWU7DQorICAgIF9GREVfQ1NTUFJPUEVSVFlIT0xERVIJCQkqcE5leHQ7DQorfSBGREVfQ1NTUFJPUEVSVFlIT0xERVIsICpGREVfTFBDU1NQUk9QRVJUWUhPTERFUjsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0NTU0NVU1RPTVBST1BFUlRZIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgICBGWF9MUENXU1RSCQkJCQkJcHdzTmFtZTsNCisgICAgRlhfTFBDV1NUUgkJCQkJCXB3c1ZhbHVlOw0KKyAgICBfRkRFX0NTU0NVU1RPTVBST1BFUlRZCQkJKnBOZXh0Ow0KK30gRkRFX0NTU0NVU1RPTVBST1BFUlRZLCAqIEZERV9MUENTU0NVU1RPTVBST1BFUlRZOw0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ1NTUFJPUEVSVFlBUkdTIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgICBJRlhfTUVNQWxsb2NhdG9yCQkqcFN0YXRpY1N0b3JlOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQkqcFN0cmluZ0NhY2hlOw0KKyAgICBGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRQlwUHJvcGVydHk7DQorfSBGREVfQ1NTUFJPUEVSVFlBUkdTOw0KK3R5cGVkZWYgRkRFX0NTU1BST1BFUlRZQVJHUyBjb25zdCAqIEZERV9MUENDU1NQUk9QRVJUWUFSR1M7DQorY2xhc3MgQ0ZERV9DU1NEZWNsYXJhdGlvbiA6IHB1YmxpYyBJRkRFX0NTU0RlY2xhcmF0aW9uLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTRGVjbGFyYXRpb24oKSA6IG1fcEZpcnN0UHJvcGVydHkoTlVMTCksIG1fcExhc3RQcm9wZXJ0eShOVUxMKSwgbV9wRmlyc3RDdXN0b20oTlVMTCksIG1fcExhc3RDdXN0b20oTlVMTCkgeyB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSoJCQlHZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBGWF9CT09MICZiSW1wb3J0YW50KSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9QT1NJVElPTgkJCQlHZXRTdGFydFBvc2l0aW9uKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OICZwb3MsIEZERV9DU1NQUk9QRVJUWSAmZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlIComcFZhbHVlLCBGWF9CT09MICZiSW1wb3J0YW50KSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9QT1NJVElPTgkJCQlHZXRTdGFydEN1c3RvbSgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldE5leHRDdXN0b20oRlhfUE9TSVRJT04gJnBvcywgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0Ow0KKyAgICBGWF9CT09MCQkJCQkJCUFkZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbik7DQorICAgIEZYX0JPT0wJCQkJCQkJQWRkUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pOYW1lLCBGWF9JTlQzMiBpTmFtZUxlbiwgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VUZXh0RW1waGFzaXNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VDb2x1bW5zUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgICBGWF9CT09MCQkJCQkJCVBhcnNlQ29sdW1uUnVsZVByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgICAgRlhfQk9PTAkJCQkJCQlQYXJzZU92ZXJmbG93UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgICBGWF9CT09MCQkJCQkJCVBhcnNlRm9udFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgICAgRlhfQk9PTAkJCQkJCQlQYXJzZUJhY2tncm91bmRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VMaXN0U3R5bGVQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VCb3JkZXJQcm9wb2VydHkoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4sDQorICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSAqJnBDb2xvciwgSUZERV9DU1NWYWx1ZSAqJnBTdHlsZSwgSUZERV9DU1NWYWx1ZSAqJnBXaWR0aCkgY29uc3Q7DQorICAgIHZvaWQJCQkJCQkJQWRkQm9yZGVyUHJvcGVydHkoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBJRkRFX0NTU1ZhbHVlICpwQ29sb3IsIElGREVfQ1NTVmFsdWUgKnBTdHlsZSwgSUZERV9DU1NWYWx1ZSAqcFdpZHRoLCBGWF9CT09MIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVDb2xvciwgRkRFX0NTU1BST1BFUlRZIGVTdHlsZSwgRkRFX0NTU1BST1BFUlRZIGVXaWR0aCk7DQorICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VDb250ZW50UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgICBGWF9CT09MCQkJCQkJCVBhcnNlQ291bnRlclByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgICAgRlhfQk9PTAkJCQkJCQlQYXJzZVZhbHVlTGlzdFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgICAgRlhfQk9PTAkJCQkJCQlBZGQ0VmFsdWVzUHJvcGVydHkoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkgJmxpc3QsIEZYX0JPT0wgYkltcG9ydGFudCwNCisgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZUxlZnQsIEZERV9DU1NQUk9QRVJUWSBlVG9wLCBGREVfQ1NTUFJPUEVSVFkgZVJpZ2h0LCBGREVfQ1NTUFJPUEVSVFkgZUJvdHRvbSk7DQorICAgIElGREVfQ1NTVmFsdWUqCQkJCQlQYXJzZU51bWJlcihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4pOw0KKyAgICBJRkRFX0NTU1ZhbHVlKgkJCQkJUGFyc2VFbnVtKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbik7DQorICAgIElGREVfQ1NTVmFsdWUqCQkJCQlQYXJzZUNvbG9yKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbik7DQorICAgIElGREVfQ1NTVmFsdWUqCQkJCQlQYXJzZVVSSShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBGWF9MUENXU1RSIHBzelZhbHVlLCBGWF9JTlQzMiBpVmFsdWVMZW4pOw0KKyAgICBJRkRFX0NTU1ZhbHVlKgkJCQkJUGFyc2VTdHJpbmcoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuKTsNCisgICAgSUZERV9DU1NWYWx1ZSoJCQkJCVBhcnNlRnVuY3Rpb24oRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgRlhfTFBDV1NUUiBwc3pWYWx1ZSwgRlhfSU5UMzIgaVZhbHVlTGVuKTsNCisgICAgRlhfTFBDV1NUUgkJCQkJCUNvcHlUb0xvY2FsKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIEZYX0xQQ1dTVFIgcHN6VmFsdWUsIEZYX0lOVDMyIGlWYWx1ZUxlbik7DQorICAgIHZvaWQJCQkJCQkJQWRkUHJvcGVydHlIb2xkZXIoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlICpwVmFsdWUsIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqCQkJTmV3TnVtYmVyVmFsdWUoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSBjb25zdDsNCisgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSoJCQlOZXdFbnVtVmFsdWUoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIGNvbnN0Ow0KKyAgICBGREVfTFBDU1NQUk9QRVJUWUhPTERFUgkJCW1fcEZpcnN0UHJvcGVydHk7DQorICAgIEZERV9MUENTU1BST1BFUlRZSE9MREVSCQkJbV9wTGFzdFByb3BlcnR5Ow0KKyAgICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWQkJCW1fcEZpcnN0Q3VzdG9tOw0KKyAgICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWQkJCW1fcExhc3RDdXN0b207DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzJhOGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmNwcApAQCAtMCwwICsxLDE3MTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NjYWNoZS5oIg0KKyNpbmNsdWRlICJmZGVfY3NzZGVjbGFyYXRpb24uaCINCisjaW5jbHVkZSAiZmRlX2Nzc3N0eWxlc2VsZWN0b3IuaCINCitGWF9JTlQzMiBDRkRFX0NTU0NvdW50ZXJTdHlsZTo6RmluZEluZGV4KEZYX0xQQ1dTVFIgcHN6SWRlbnRpZmllcikNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fYXJyQ291bnRlckRhdGEuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIGlmIChGWFNZU193Y3NjbXAocHN6SWRlbnRpZmllciwgbV9hcnJDb3VudGVyRGF0YS5FbGVtZW50QXQoaSkubV9wc3pJZGVudCkgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAtMTsNCit9DQordm9pZCBDRkRFX0NTU0NvdW50ZXJTdHlsZTo6RG9VcGRhdGVJbmRleChJRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QpDQorew0KKyAgICBpZiAocExpc3QgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBMaXN0LT5Db3VudFZhbHVlcygpOw0KKyAgICBGWF9GTE9BVCBmRGVmVmFsdWUgPSAxLjA7DQorICAgIEZYX0JPT0wJYkRlZkluY3JlbWVudCA9IFRSVUU7DQorICAgIGlmIChwTGlzdCA9PSBtX3BDb3VudGVyUmVzZXQpIHsNCisgICAgICAgIGZEZWZWYWx1ZSA9IDAuMDsNCisgICAgICAgIGJEZWZJbmNyZW1lbnQgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIElGREVfQ1NTVmFsdWVMaXN0ICpwQ291bnRlciA9IChJRkRFX0NTU1ZhbHVlTGlzdCopcExpc3QtPkdldFZhbHVlKGkpOw0KKyAgICAgICAgRlhfSU5UMzIgaUxlbjsNCisgICAgICAgIEZYX0xQQ1dTVFIgcHN6SWRlbnRpZmllciA9ICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKHBDb3VudGVyLT5HZXRWYWx1ZSgwKSkpLT5HZXRTdHJpbmcoaUxlbik7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWUgPSBmRGVmVmFsdWU7DQorICAgICAgICBpZiAocENvdW50ZXItPkNvdW50VmFsdWVzKCkgPiAxKSB7DQorICAgICAgICAgICAgZlZhbHVlID0gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikocENvdW50ZXItPkdldFZhbHVlKDEpKSktPkdldEZsb2F0KCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSBGaW5kSW5kZXgocHN6SWRlbnRpZmllcik7DQorICAgICAgICBpZiAoaUluZGV4ID09IC0xKSB7DQorICAgICAgICAgICAgRkRFX0NTU0NPVU5URVJEQVRBIGRhdGE7DQorICAgICAgICAgICAgZGF0YS5tX3BzeklkZW50ID0gcHN6SWRlbnRpZmllcjsNCisgICAgICAgICAgICBpZiAoYkRlZkluY3JlbWVudCkgew0KKyAgICAgICAgICAgICAgICBkYXRhLm1fYkluY3JlbWVudCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGRhdGEubV9pSW5jVmFsID0gKEZYX0lOVDMyKWZWYWx1ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkYXRhLm1faVJlc2V0VmFsID0gKEZYX0lOVDMyKWZWYWx1ZTsNCisgICAgICAgICAgICAgICAgZGF0YS5tX2JSZXNldCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fYXJyQ291bnRlckRhdGEuQWRkKGRhdGEpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGREVfQ1NTQ09VTlRFUkRBVEEgJmRhdGEgPSBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpSW5kZXgpOw0KKyAgICAgICAgICAgIGlmIChiRGVmSW5jcmVtZW50KSB7DQorICAgICAgICAgICAgICAgIGRhdGEubV9iSW5jcmVtZW50ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgZGF0YS5tX2lJbmNWYWwgKz0gKEZYX0lOVDMyKWZWYWx1ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkYXRhLm1fYlJlc2V0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgZGF0YS5tX2lSZXNldFZhbCA9IChGWF9JTlQzMilmVmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NDb3VudGVyU3R5bGU6OlVwZGF0ZUluZGV4KCkNCit7DQorICAgIGlmICghbV9iSW5kZXhEaXJ0eSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fYXJyQ291bnRlckRhdGEuUmVtb3ZlQWxsKCk7DQorICAgIERvVXBkYXRlSW5kZXgobV9wQ291bnRlckluYyk7DQorICAgIERvVXBkYXRlSW5kZXgobV9wQ291bnRlclJlc2V0KTsNCisgICAgbV9iSW5kZXhEaXJ0eSA9IEZBTFNFOw0KK30NCitGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSyBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldFRleHRFbXBoYXNpc01hcmsoKSBjb25zdA0KK3sNCisgICAgaWYgKG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0RW1waGFzaXNNYXJrICE9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0F1dG8pIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1RFWFRFTVBIQVNJU01BUkspbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRFbXBoYXNpc01hcms7DQorICAgIH0NCisgICAgaWYgKG1fSW5oZXJpdGVkRGF0YS5tX2VXcml0aW5nTW9kZSA9PSBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiKSB7DQorICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG90Ow0KKyAgICB9DQorICAgIHJldHVybiBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWU7DQorfQ0KK19GREVfQ1NTUlVMRURBVEE6Ol9GREVfQ1NTUlVMRURBVEEoSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wsIEZYX0RXT1JEIGR3UG9zKQ0KKyAgICA6IHBTZWxlY3RvcihwU2VsKQ0KKyAgICAsIHBEZWNsYXJhdGlvbihwRGVjbCkNCisgICAgLCBkd1ByaW9yaXR5KGR3UG9zKQ0KKyAgICAsIHBOZXh0KE5VTEwpDQorew0KKyAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19TcGVjaWZpY1s1XSA9IHsweDAwMDEwMDAwLCAweDAwMDEwMDAwLCAweDAwMTAwMDAwLCAweDAwMTAwMDAwLCAweDAxMDAwMDAwfTsNCisgICAgZm9yICg7IHBTZWwgIT0gTlVMTDsgcFNlbCA9IHBTZWwtPkdldE5leHRTZWxlY3RvcigpKSB7DQorICAgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlID0gcFNlbC0+R2V0VHlwZSgpOw0KKyAgICAgICAgaWYgKGVUeXBlID4gRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50IHx8IHBTZWwtPkdldE5hbWVIYXNoKCkgIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0gpIHsNCisgICAgICAgICAgICBkd1ByaW9yaXR5ICs9IHNfU3BlY2lmaWNbZVR5cGVdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6Q2xlYXIoKQ0KK3sNCisgICAgbV9JRFJ1bGVzLlJlbW92ZUFsbCgpOw0KKyAgICBtX1RhZ1J1bGVzLlJlbW92ZUFsbCgpOw0KKyAgICBtX0NsYXNzUnVsZXMuUmVtb3ZlQWxsKCk7DQorICAgIG1fcFVuaXZlcnNhbFJ1bGVzID0gTlVMTDsNCisgICAgbV9wU3RhdGljU3RvcmUgPSBOVUxMOw0KKyAgICBtX2lTZWxlY3RvcnMgPSAwOw0KK30NCit2b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVzRnJvbShjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAmc2hlZXRzLCBGWF9EV09SRCBkd01lZGlhTGlzdCwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KK3sNCisgICAgRlhfSU5UMzIgaVNoZWV0cyA9IHNoZWV0cy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2hlZXRzOyArK2kpIHsNCisgICAgICAgIElGREVfQ1NTU3R5bGVTaGVldCAqcFNoZWV0ID0gc2hlZXRzLkdldEF0KGkpOw0KKyAgICAgICAgaWYgKEZYX0RXT1JEIGR3TWF0Y2hNZWRpYSA9IHBTaGVldC0+R2V0TWVkaWFMaXN0KCkgJiBkd01lZGlhTGlzdCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlSdWxlcyA9IHBTaGVldC0+Q291bnRSdWxlcygpOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpUnVsZXM7IGorKykgew0KKyAgICAgICAgICAgICAgICBBZGRSdWxlc0Zyb20ocFNoZWV0LCBwU2hlZXQtPkdldFJ1bGUoaiksIGR3TWF0Y2hNZWRpYSwgcEZvbnRNZ3IpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVzRnJvbShJRkRFX0NTU1N0eWxlU2hlZXQgKnBTdHlsZVNoZWV0LCBJRkRFX0NTU1J1bGUgKnBSdWxlLCBGWF9EV09SRCBkd01lZGlhTGlzdCwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KK3sNCisgICAgc3dpdGNoIChwUnVsZS0+R2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9TdHlsZTogew0KKyAgICAgICAgICAgICAgICBJRkRFX0NTU1N0eWxlUnVsZSAqcFN0eWxlUnVsZSA9IChJRkRFX0NTU1N0eWxlUnVsZSopcFJ1bGU7DQorICAgICAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsYXJhdGlvbiA9IHBTdHlsZVJ1bGUtPkdldERlY2xhcmF0aW9uKCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlTZWxlY3RvcnMgPSBwU3R5bGVSdWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTZWxlY3RvcnM7ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTZWxlY3RvciAqcFNlbGVjdG9yID0gcFN0eWxlUnVsZS0+R2V0U2VsZWN0b3JMaXN0KGkpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTZWxlY3Rvci0+R2V0VHlwZSgpID09IEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3Vkbykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhID0gTmV3UnVsZURhdGEocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVUbyhtX3BQZXJzdWRvUnVsZXMsIHBEYXRhKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChwU2VsZWN0b3ItPkdldE5hbWVIYXNoKCkgIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRSdWxlVG8obV9UYWdSdWxlcywgcFNlbGVjdG9yLT5HZXROYW1lSGFzaCgpLCBwU2VsZWN0b3IsIHBEZWNsYXJhdGlvbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1NlbGVjdG9yICpwTmV4dCA9IHBTZWxlY3Rvci0+R2V0TmV4dFNlbGVjdG9yKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocE5leHQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhID0gTmV3UnVsZURhdGEocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVUbyhtX3BVbml2ZXJzYWxSdWxlcywgcERhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwTmV4dC0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0lEOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSdWxlVG8obV9JRFJ1bGVzLCBwTmV4dC0+R2V0TmFtZUhhc2goKSwgcFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3M6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVUbyhtX0NsYXNzUnVsZXMsIHBOZXh0LT5HZXROYW1lSGFzaCgpLCBwU2VsZWN0b3IsIHBEZWNsYXJhdGlvbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSdWxlVG8obV9wVW5pdmVyc2FsUnVsZXMsIE5ld1J1bGVEYXRhKHBTZWxlY3RvciwgcERlY2xhcmF0aW9uKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfTWVkaWE6IHsNCisgICAgICAgICAgICAgICAgSUZERV9DU1NNZWRpYVJ1bGUgKnBNZWRpYVJ1bGUgPSAoSUZERV9DU1NNZWRpYVJ1bGUqKXBSdWxlOw0KKyAgICAgICAgICAgICAgICBpZiAocE1lZGlhUnVsZS0+R2V0TWVkaWFMaXN0KCkgJiBkd01lZGlhTGlzdCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVJ1bGVzID0gcE1lZGlhUnVsZS0+Q291bnRSdWxlcygpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlSdWxlczsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQWRkUnVsZXNGcm9tKHBTdHlsZVNoZWV0LCBwTWVkaWFSdWxlLT5HZXRSdWxlKGkpLCBkd01lZGlhTGlzdCwgcEZvbnRNZ3IpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCit2b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVUbyhDRlhfTWFwUHRyVG9QdHIgJm1hcCwgRlhfRFdPUkQgZHdLZXksIElGREVfQ1NTU2VsZWN0b3IgKnBTZWwsIElGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsKQ0KK3sNCisgICAgRlhfTFBWT0lEIHBLZXkgPSAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWR3S2V5Ow0KKyAgICBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSA9IE5ld1J1bGVEYXRhKHBTZWwsIHBEZWNsKTsNCisgICAgRkRFX0xQQ1NTUlVMRURBVEEgcExpc3QgPSBOVUxMOw0KKyAgICBpZiAoIW1hcC5Mb29rdXAocEtleSwgKEZYX0xQVk9JRCYpcExpc3QpKSB7DQorICAgICAgICBtYXAuU2V0QXQocEtleSwgcERhdGEpOw0KKyAgICB9IGVsc2UgaWYgKEFkZFJ1bGVUbyhwTGlzdCwgcERhdGEpKSB7DQorICAgICAgICBtYXAuU2V0QXQocEtleSwgcExpc3QpOw0KKyAgICB9DQorfQ0KK2lubGluZSBGWF9CT09MIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVUbyhGREVfTFBDU1NSVUxFREFUQSAmcExpc3QsIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhKQ0KK3sNCisgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsNCisgICAgICAgIHBMaXN0ID0gcERhdGE7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBEYXRhLT5wTmV4dCA9IHBMaXN0LT5wTmV4dDsNCisgICAgICAgIHBMaXN0LT5wTmV4dCA9IHBEYXRhOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfQ0KK2lubGluZSBGREVfTFBDU1NSVUxFREFUQSBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjpOZXdSdWxlRGF0YShJRkRFX0NTU1NlbGVjdG9yICpwU2VsLCBJRkRFX0NTU0RlY2xhcmF0aW9uICpwRGVjbCkNCit7DQorICAgIHJldHVybiBGREVfTmV3V2l0aChtX3BTdGF0aWNTdG9yZSkgRkRFX0NTU1JVTEVEQVRBKHBTZWwsIHBEZWNsLCArK21faVNlbGVjdG9ycyk7DQorfQ0KK0lGREVfQ1NTU3R5bGVTZWxlY3RvciogSUZERV9DU1NTdHlsZVNlbGVjdG9yOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOw0KK30NCitDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkNGREVfQ1NTU3R5bGVTZWxlY3RvcigpDQorICAgIDogbV9wRm9udE1ncihOVUxMKQ0KKyAgICAsIG1fZkRlZkZvbnRTaXplKDEyLjBmKQ0KKyAgICAsIG1fcFJ1bGVEYXRhU3RvcmUoTlVMTCkNCisgICAgLCBtX3BJbmxpbmVTdHlsZVN0b3JlKE5VTEwpDQorICAgICwgbV9wRml4ZWRTdHlsZVN0b3JlKE5VTEwpDQorICAgICwgbV9wQWNjZWxlcmF0b3IoTlVMTCkNCit7DQorICAgIG1fZVByaW9yaXRpZXNbRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9IaWdoXSA9IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfQXV0aG9yOw0KKyAgICBtX2VQcmlvcml0aWVzW0ZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTWlkXSA9IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfVXNlcjsNCisgICAgbV9lUHJpb3JpdGllc1tGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX0xvd10gPSBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXJBZ2VudDsNCit9DQorQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjp+Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCkNCit7DQorICAgIFJlc2V0KCk7DQorICAgIGlmIChtX3BJbmxpbmVTdHlsZVN0b3JlICE9IE5VTEwpIHsNCisgICAgICAgIG1fcElubGluZVN0eWxlU3RvcmUtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wRml4ZWRTdHlsZVN0b3JlICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEZpeGVkU3R5bGVTdG9yZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIGlmIChtX3BBY2NlbGVyYXRvciAhPSBOVUxMKSB7DQorICAgICAgICBGREVfRGVsZXRlIG1fcEFjY2VsZXJhdG9yOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRGb250TWdyKElGWF9Gb250TWdyICpwRm9udE1ncikNCit7DQorICAgIG1fcEZvbnRNZ3IgPSBwRm9udE1ncjsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldERlZkZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChmRm9udFNpemUgPiAwKTsNCisgICAgbV9mRGVmRm9udFNpemUgPSBmRm9udFNpemU7DQorfQ0KK0lGREVfQ1NTQWNjZWxlcmF0b3IqIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6SW5pdEFjY2VsZXJhdG9yKCkNCit7DQorICAgIGlmIChtX3BBY2NlbGVyYXRvciA9PSBOVUxMKSB7DQorICAgICAgICBtX3BBY2NlbGVyYXRvciA9IEZERV9OZXcgQ0ZERV9DU1NBY2NlbGVyYXRvcjsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX3BBY2NlbGVyYXRvciAhPSBOVUxMKTsNCisgICAgfQ0KKyAgICBtX3BBY2NlbGVyYXRvci0+Q2xlYXIoKTsNCisgICAgcmV0dXJuIG1fcEFjY2VsZXJhdG9yOw0KK30NCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlQ29tcHV0ZWRTdHlsZShJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSkNCit7DQorICAgIGlmIChtX3BGaXhlZFN0eWxlU3RvcmUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRml4ZWRTdHlsZVN0b3JlID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9GaXhlZCwgMTYsIHNpemVvZihDRkRFX0NTU0NvbXB1dGVkU3R5bGUpKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX3BGaXhlZFN0eWxlU3RvcmUgIT0gTlVMTCk7DQorICAgIH0NCisgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUgPSBGREVfTmV3V2l0aChtX3BGaXhlZFN0eWxlU3RvcmUpIENGREVfQ1NTQ29tcHV0ZWRTdHlsZShtX3BGaXhlZFN0eWxlU3RvcmUpOw0KKyAgICBpZiAocFBhcmVudFN0eWxlKSB7DQorICAgICAgICBwU3R5bGUtPm1fSW5oZXJpdGVkRGF0YSA9ICgoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwUGFyZW50U3R5bGUpLT5tX0luaGVyaXRlZERhdGE7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KKyAgICB9DQorICAgIHBTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLlJlc2V0KCk7DQorICAgIHJldHVybiBwU3R5bGU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRTdHlsZVNoZWV0KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIElGREVfQ1NTU3R5bGVTaGVldCAqcFNoZWV0KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGVUeXBlIDwgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVgpOw0KKyAgICBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAmZGVzdCA9IG1fU2hlZXRHcm91cHNbZVR5cGVdOw0KKyAgICBkZXN0LlJlbW92ZUF0KDAsIGRlc3QuR2V0U2l6ZSgpKTsNCisgICAgaWYgKHBTaGVldCAhPSBOVUxMKSB7DQorICAgICAgICBkZXN0LkFkZChwU2hlZXQpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0U3R5bGVTaGVldHMoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwgY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkgKnBBcnJheSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChlVHlwZSA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYKTsNCisgICAgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkgJmRlc3QgPSBtX1NoZWV0R3JvdXBzW2VUeXBlXTsNCisgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7DQorICAgICAgICBkZXN0LlJlbW92ZUF0KDAsIGRlc3QuR2V0U2l6ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGRlc3QuQ29weSgqcEFycmF5KTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldFN0eWxlUHJpb3JpdHkoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWSBlUHJpb3JpdHkpDQorew0KKyAgICBtX2VQcmlvcml0aWVzW2VQcmlvcml0eV0gPSBlVHlwZTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlVwZGF0ZVN0eWxlSW5kZXgoRlhfRFdPUkQgZHdNZWRpYUxpc3QpDQorew0KKyAgICBSZXNldCgpOw0KKyAgICBtX3BSdWxlRGF0YVN0b3JlID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9TdGF0aWMsIDEwMjQsIDApOw0KKyAgICBGWFNZU19hc3NlcnQobV9wUnVsZURhdGFTdG9yZSAhPSBOVUxMKTsNCisgICAgZm9yIChGWF9JTlQzMiBpR3JvdXAgPSAwOyBpR3JvdXAgPCBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWDsgKytpR3JvdXApIHsNCisgICAgICAgIENGREVfQ1NTUnVsZUNvbGxlY3Rpb24gJnJ1bGVzID0gbV9SdWxlQ29sbGVjdGlvbltpR3JvdXBdOw0KKyAgICAgICAgcnVsZXMubV9wU3RhdGljU3RvcmUgPSBtX3BSdWxlRGF0YVN0b3JlOw0KKyAgICAgICAgcnVsZXMuQWRkUnVsZXNGcm9tKG1fU2hlZXRHcm91cHNbaUdyb3VwXSwgZHdNZWRpYUxpc3QsIG1fcEZvbnRNZ3IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpSZXNldCgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGlHcm91cCA9IDA7IGlHcm91cCA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYOyArK2lHcm91cCkgew0KKyAgICAgICAgbV9SdWxlQ29sbGVjdGlvbltpR3JvdXBdLkNsZWFyKCk7DQorICAgIH0NCisgICAgaWYgKG1fcFJ1bGVEYXRhU3RvcmUgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wUnVsZURhdGFTdG9yZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wUnVsZURhdGFTdG9yZSA9IE5VTEw7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaERlY2xhcmF0aW9ucyhJRkRFX0NTU1RhZ1Byb3ZpZGVyICpwVGFnLCBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkgJm1hdGNoZWREZWNscywgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEFjY2VsZXJhdG9yICE9IE5VTEwgJiYgcFRhZyAhPSBOVUxMKTsNCisgICAgRkRFX0xQQ1NTVEFHQ0FDSEUgcENhY2hlID0gbV9wQWNjZWxlcmF0b3ItPkdldFRvcEVsZW1lbnQoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBDYWNoZSAhPSBOVUxMICYmIHBDYWNoZS0+R2V0VGFnKCkgPT0gcFRhZyk7DQorICAgIG1hdGNoZWREZWNscy5SZW1vdmVBdCgwLCBtYXRjaGVkRGVjbHMuR2V0U2l6ZSgpKTsNCisgICAgZm9yIChGWF9JTlQzMiBlUHJpb3JpdHkgPSBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX01BWCAtIDE7IGVQcmlvcml0eSA+PSAwOyAtLWVQcmlvcml0eSkgew0KKyAgICAgICAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlR3JvdXAgPSBtX2VQcmlvcml0aWVzW2VQcmlvcml0eV07DQorICAgICAgICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uICZydWxlcyA9IG1fUnVsZUNvbGxlY3Rpb25bZUdyb3VwXTsNCisgICAgICAgIGlmIChydWxlcy5Db3VudFNlbGVjdG9ycygpID09IDApIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlUGVyc3Vkb1R5cGUgPT0gRkRFX0NTU1BFUlNVRE9fTk9ORSkgew0KKyAgICAgICAgICAgIE1hdGNoUnVsZXMocENhY2hlLCBydWxlcy5HZXRVbml2ZXJzYWxSdWxlRGF0YSgpLCBlUGVyc3Vkb1R5cGUpOw0KKyAgICAgICAgICAgIGlmIChwQ2FjaGUtPkhhc2hUYWcoKSkgew0KKyAgICAgICAgICAgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0VGFnUnVsZURhdGEocENhY2hlLT5IYXNoVGFnKCkpLCBlUGVyc3Vkb1R5cGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBwQ2FjaGUtPkNvdW50SGFzaENsYXNzKCk7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHBDYWNoZS0+U2V0Q2xhc3NJbmRleChpKTsNCisgICAgICAgICAgICAgICAgTWF0Y2hSdWxlcyhwQ2FjaGUsIHJ1bGVzLkdldENsYXNzUnVsZURhdGEocENhY2hlLT5IYXNoQ2xhc3MoKSksIGVQZXJzdWRvVHlwZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0UGVyc3Vkb1J1bGVEYXRhKCksIGVQZXJzdWRvVHlwZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9NYXRjaGVkUnVsZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgIFNvcnRSdWxlc1RvKG1hdGNoZWREZWNscyk7DQorICAgICAgICAgICAgbV9NYXRjaGVkUnVsZXMuUmVtb3ZlQXQoMCwgbV9NYXRjaGVkUnVsZXMuR2V0U2l6ZSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbWF0Y2hlZERlY2xzLkdldFNpemUoKTsNCit9DQoraW5saW5lIHZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaFJ1bGVzKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwgRkRFX0xQQ1NTUlVMRURBVEEgcExpc3QsIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSkNCit7DQorICAgIHdoaWxlIChwTGlzdCAhPSBOVUxMKSB7DQorICAgICAgICBpZiAoTWF0Y2hTZWxlY3RvcihwQ2FjaGUsIHBMaXN0LT5wU2VsZWN0b3IsIGVQZXJzdWRvVHlwZSkpIHsNCisgICAgICAgICAgICBtX01hdGNoZWRSdWxlcy5BZGQocExpc3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcExpc3QgPSBwTGlzdC0+cE5leHQ7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6Ok1hdGNoU2VsZWN0b3IoRkRFX0xQQ1NTVEFHQ0FDSEUgcENhY2hlLCBJRkRFX0NTU1NlbGVjdG9yICpwU2VsLCBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUpDQorew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIHdoaWxlIChwU2VsICE9IE5VTEwgJiYgcENhY2hlICE9IE5VTEwpIHsNCisgICAgICAgIHN3aXRjaCAocFNlbC0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0Rlc2NlbmRhbnQ6DQorICAgICAgICAgICAgICAgIGR3SGFzaCA9IHBTZWwtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICAgICAgICAgIHdoaWxlICgocENhY2hlID0gcENhY2hlLT5HZXRQYXJlbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGR3SGFzaCAhPSBGREVfQ1NTVU5JVkVSU0FMSEFTSCAmJiBkd0hhc2ggIT0gcENhY2hlLT5IYXNoVGFnKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChNYXRjaFNlbGVjdG9yKHBDYWNoZSwgcFNlbC0+R2V0TmV4dFNlbGVjdG9yKCksIGVQZXJzdWRvVHlwZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0lEOg0KKyAgICAgICAgICAgICAgICBkd0hhc2ggPSBwQ2FjaGUtPkhhc2hJRCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZHdIYXNoICE9IHBTZWwtPkdldE5hbWVIYXNoKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3M6DQorICAgICAgICAgICAgICAgIGR3SGFzaCA9IHBDYWNoZS0+SGFzaENsYXNzKCk7DQorICAgICAgICAgICAgICAgIGlmIChkd0hhc2ggIT0gcFNlbC0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50Og0KKyAgICAgICAgICAgICAgICBkd0hhc2ggPSBwU2VsLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZHdIYXNoICE9IEZERV9DU1NVTklWRVJTQUxIQVNIICYmIGR3SGFzaCAhPSBwQ2FjaGUtPkhhc2hUYWcoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9QZXJzdWRvOg0KKyAgICAgICAgICAgICAgICBkd0hhc2ggPSBGREVfR2V0Q1NTUGVyc3Vkb0J5RW51bShlUGVyc3Vkb1R5cGUpLT5kd0hhc2g7DQorICAgICAgICAgICAgICAgIGlmIChkd0hhc2ggIT0gcFNlbC0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFNlbCA9IHBTZWwtPkdldE5leHRTZWxlY3RvcigpOw0KKyAgICB9DQorICAgIHJldHVybiBwU2VsID09IE5VTEwgJiYgcENhY2hlICE9IE5VTEw7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTb3J0UnVsZXNUbyhDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkgJm1hdGNoRGVjbHMpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSBtX01hdGNoZWRSdWxlcy5HZXRVcHBlckJvdW5kKCk7IGogPj0gMDsgLS1qKSB7DQorICAgICAgICBGREVfTFBDU1NSVUxFREFUQSAmcE1pbiA9IG1fTWF0Y2hlZFJ1bGVzLkVsZW1lbnRBdChqKTsNCisgICAgICAgIEZYX0RXT1JEIGR3TWluID0gcE1pbi0+ZHdQcmlvcml0eTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IGogLSAxOyBpID49IDA7IC0taSkgew0KKyAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBICZwQ3VyID0gbV9NYXRjaGVkUnVsZXMuRWxlbWVudEF0KGkpOw0KKyAgICAgICAgICAgIGlmIChkd01pbiA+IHBDdXItPmR3UHJpb3JpdHkpIHsNCisgICAgICAgICAgICAgICAgZHdNaW4gPSBwQ3VyLT5kd1ByaW9yaXR5Ow0KKyAgICAgICAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwID0gcE1pbjsNCisgICAgICAgICAgICAgICAgcE1pbiA9IHBDdXI7DQorICAgICAgICAgICAgICAgIHBDdXIgPSBwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1hdGNoRGVjbHMuQWRkKHBNaW4tPnBEZWNsYXJhdGlvbik7DQorICAgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkNvbXB1dGVTdHlsZShJRkRFX0NTU1RhZ1Byb3ZpZGVyICpwVGFnLCBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqcHBEZWNsQXJyYXksIEZYX0lOVDMyIGlEZWNsQ291bnQsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcERlc3RTdHlsZSkNCit7DQorICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcENvbXB1dGVkU3R5bGUgPSAoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwRGVzdFN0eWxlOw0KKyAgICBGWFNZU19hc3NlcnQocFRhZyAmJiBpRGVjbENvdW50ID49IDAgJiYgcENvbXB1dGVkU3R5bGUgIT0gTlVMTCk7DQorICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBUYWctPkdldEZpcnN0QXR0cmlidXRlKCk7DQorICAgIGlmIChwb3MgIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKG1fcElubGluZVN0eWxlU3RvcmUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcElubGluZVN0eWxlU3RvcmUgPSBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX1N0YXRpYywgMjA0OCwgMCk7DQorICAgICAgICB9DQorICAgICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uICpwRGVjbCA9IE5VTEw7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NBdHRyaSwgd3NWYWx1ZTsNCisgICAgICAgIEZYX0RXT1JEIGR3QXR0cmlIYXNoOw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIHBUYWctPkdldE5leHRBdHRyaWJ1dGUocG9zLCB3c0F0dHJpLCB3c1ZhbHVlKTsNCisgICAgICAgICAgICBkd0F0dHJpSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQXR0cmkuR2V0UHRyKCksIHdzQXR0cmkuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX2R3U3R5bGVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKEZYX0xQQ1dTVFIpTCJzdHlsZSIsIDUsIFRSVUUpOw0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX2R3QWxpZ25IYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKEZYX0xQQ1dTVFIpTCJhbGlnbiIsIDUsIFRSVUUpOw0KKyAgICAgICAgICAgIGlmIChkd0F0dHJpSGFzaCA9PSBzX2R3U3R5bGVIYXNoKSB7DQorICAgICAgICAgICAgICAgIGlmIChwRGVjbCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwRGVjbCA9IEZERV9OZXdXaXRoKG1fcElubGluZVN0eWxlU3RvcmUpIENGREVfQ1NTRGVjbGFyYXRpb247DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQXBwZW5kSW5saW5lU3R5bGUocERlY2wsIHdzVmFsdWUuR2V0UHRyKCksIHdzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdBdHRyaUhhc2ggPT0gc19kd0FsaWduSGFzaCkgew0KKyAgICAgICAgICAgICAgICBpZiAocERlY2wgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcERlY2wgPSBGREVfTmV3V2l0aChtX3BJbmxpbmVTdHlsZVN0b3JlKSBDRkRFX0NTU0RlY2xhcmF0aW9uOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWUFSR1MgYXJnczsNCisgICAgICAgICAgICAgICAgYXJncy5wU3RyaW5nQ2FjaGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBhcmdzLnBTdGF0aWNTdG9yZSA9IG1fcElubGluZVN0eWxlU3RvcmU7DQorICAgICAgICAgICAgICAgIGFyZ3MucFByb3BlcnR5ID0gRkRFX0dldENTU1Byb3BlcnR5QnlFbnVtKEZERV9DU1NQUk9QRVJUWV9UZXh0QWxpZ24pOw0KKyAgICAgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkoJmFyZ3MsIHdzVmFsdWUuR2V0UHRyKCksIHdzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKHBvcyAhPSBOVUxMKTsNCisgICAgICAgIGlmIChwRGVjbCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5IGRlY2xzOw0KKyAgICAgICAgICAgIGRlY2xzLlNldFNpemUoaURlY2xDb3VudCArIDEpOw0KKyAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24gKipwcElubGluZSA9IGRlY2xzLkdldERhdGEoKTsNCisgICAgICAgICAgICBGWFNZU19tZW1jcHkocHBJbmxpbmUsIHBwRGVjbEFycmF5LCBpRGVjbENvdW50ICogc2l6ZW9mKElGREVfQ1NTRGVjbGFyYXRpb24qKSk7DQorICAgICAgICAgICAgcHBJbmxpbmVbaURlY2xDb3VudCsrXSA9IHBEZWNsOw0KKyAgICAgICAgICAgIEFwcGx5RGVjbGFyYXRpb25zKFRSVUUsIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqKXBwSW5saW5lLCBpRGVjbENvdW50LCBwRGVzdFN0eWxlKTsNCisgICAgICAgICAgICBBcHBseURlY2xhcmF0aW9ucyhGQUxTRSwgKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKiopcHBJbmxpbmUsIGlEZWNsQ291bnQsIHBEZXN0U3R5bGUpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaURlY2xDb3VudCA+IDApIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwcERlY2xBcnJheSAhPSBOVUxMKTsNCisgICAgICAgIEFwcGx5RGVjbGFyYXRpb25zKFRSVUUsIHBwRGVjbEFycmF5LCBpRGVjbENvdW50LCBwRGVzdFN0eWxlKTsNCisgICAgICAgIEFwcGx5RGVjbGFyYXRpb25zKEZBTFNFLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQorICAgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGx5RGVjbGFyYXRpb25zKEZYX0JPT0wgYlByaW9yaXR5LCBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqcHBEZWNsQXJyYXksIEZYX0lOVDMyIGlEZWNsQ291bnQsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcERlc3RTdHlsZSkNCit7DQorICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcENvbXB1dGVkU3R5bGUgPSAoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwRGVzdFN0eWxlOw0KKyAgICBJRkRFX0NTU1ZhbHVlICpwVmFsOw0KKyAgICBGWF9CT09MIGJJbXBvcnRhbnQ7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIGlmIChiUHJpb3JpdHkpIHsNCisgICAgICAgIElGREVfQ1NTVmFsdWUgKnBMYXN0ZXN0ID0gTlVMTCwgKnBJbXBvcnRhbnQgPSBOVUxMOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlEZWNsQ291bnQ7ICsraSkgew0KKyAgICAgICAgICAgIHBWYWwgPSBwcERlY2xBcnJheVtpXS0+R2V0UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLCBiSW1wb3J0YW50KTsNCisgICAgICAgICAgICBpZiAocFZhbCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYkltcG9ydGFudCkgew0KKyAgICAgICAgICAgICAgICBwSW1wb3J0YW50ID0gcFZhbDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwTGFzdGVzdCA9IHBWYWw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJbXBvcnRhbnQpIHsNCisgICAgICAgICAgICBBcHBseVByb3BlcnR5KEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwgcEltcG9ydGFudCwgcENvbXB1dGVkU3R5bGUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwTGFzdGVzdCkgew0KKyAgICAgICAgICAgIEFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLCBwTGFzdGVzdCwgcENvbXB1dGVkU3R5bGUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5IGltcG9ydGFudHM7DQorICAgICAgICBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICpwRGVjbCA9IE5VTEw7DQorICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVByb3A7DQorICAgICAgICBGWF9QT1NJVElPTiBwb3M7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaURlY2xDb3VudDsgKytpKSB7DQorICAgICAgICAgICAgcERlY2wgPSBwcERlY2xBcnJheVtpXTsNCisgICAgICAgICAgICBwb3MgPSBwRGVjbC0+R2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICAgICAgICAgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwRGVjbC0+R2V0TmV4dFByb3BlcnR5KHBvcywgZVByb3AsIHBWYWwsIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICAgICAgICBpZiAoZVByb3AgPT0gRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYkltcG9ydGFudCkgew0KKyAgICAgICAgICAgICAgICAgICAgQXBwbHlQcm9wZXJ0eShlUHJvcCwgcFZhbCwgcENvbXB1dGVkU3R5bGUpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGltcG9ydGFudHMuR2V0U2l6ZSgpID09IDAgfHwgaW1wb3J0YW50c1tpbXBvcnRhbnRzLkdldFVwcGVyQm91bmQoKV0gIT0gcERlY2wpIHsNCisgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudHMuQWRkKChJRkRFX0NTU0RlY2xhcmF0aW9uKilwRGVjbCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpRGVjbENvdW50ID0gaW1wb3J0YW50cy5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaURlY2xDb3VudDsgKytpKSB7DQorICAgICAgICAgICAgcERlY2wgPSBpbXBvcnRhbnRzW2ldOw0KKyAgICAgICAgICAgIHBvcyA9IHBEZWNsLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgICAgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBEZWNsLT5HZXROZXh0UHJvcGVydHkocG9zLCBlUHJvcCwgcFZhbCwgYkltcG9ydGFudCk7DQorICAgICAgICAgICAgICAgIGlmIChiSW1wb3J0YW50ICYmIGVQcm9wICE9IEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgQXBwbHlQcm9wZXJ0eShlUHJvcCwgcFZhbCwgcENvbXB1dGVkU3R5bGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLCB3c1ZhbHVlOw0KKyAgICAgICAgcG9zID0gcERlY2wtPkdldFN0YXJ0Q3VzdG9tKCk7DQorICAgICAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICAgICAgcERlY2wtPkdldE5leHRDdXN0b20ocG9zLCB3c05hbWUsIHdzVmFsdWUpOw0KKyAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5BZGRDdXN0b21TdHlsZSh3c05hbWUsIHdzVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBlbmRJbmxpbmVTdHlsZShDRkRFX0NTU0RlY2xhcmF0aW9uICpwRGVjbCwgRlhfTFBDV1NUUiBwc3osIEZYX0lOVDMyIGlMZW4pDQorew0KKyAgICBGWFNZU19hc3NlcnQocERlY2wgIT0gTlVMTCAmJiBwc3ogIT0gTlVMTCAmJiBpTGVuID4gMCk7DQorICAgIElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgICBpZiAocFN5bnRheCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBTeW50YXgtPkluaXQocHN6LCBpTGVuLCAzMiwgVFJVRSkpIHsNCisgICAgICAgIEZYX0lOVDMyIGlMZW47DQorICAgICAgICBGWF9MUENXU1RSIHBzejsNCisgICAgICAgIEZERV9DU1NQUk9QRVJUWUFSR1MgYXJnczsNCisgICAgICAgIGFyZ3MucFN0cmluZ0NhY2hlID0gTlVMTDsNCisgICAgICAgIGFyZ3MucFN0YXRpY1N0b3JlID0gbV9wSW5saW5lU3R5bGVTdG9yZTsNCisgICAgICAgIGFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgICAgIGZvciAoOzspIHsNCisgICAgICAgICAgICBGREVfQ1NTU1lOVEFYU1RBVFVTIGVTdGF0dXMgPSBwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCk7DQorICAgICAgICAgICAgaWYgKGVTdGF0dXMgPT0gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWUpIHsNCisgICAgICAgICAgICAgICAgcHN6ID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpTGVuKTsNCisgICAgICAgICAgICAgICAgYXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUocHN6LCBpTGVuKTsNCisgICAgICAgICAgICAgICAgaWYgKGFyZ3MucFByb3BlcnR5ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nQyhwc3osIGlMZW4pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmIChlU3RhdHVzID09IEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICBpZiAoYXJncy5wUHJvcGVydHkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcHN6ID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSgmYXJncywgcHN6LCBpTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgcHN6ID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSgmYXJncywgd3NOYW1lLCB3c05hbWUuR2V0TGVuZ3RoKCksIHBzeiwgaUxlbik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcFN5bnRheC0+UmVsZWFzZSgpOw0KK30NCit2b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6QXBwbHlQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlICpwVmFsdWUsIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcENvbXB1dGVkU3R5bGUpDQorew0KKyNkZWZpbmUgRkRFX0NTU05PTklOSEVSSVRTCShwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhKQ0KKyNkZWZpbmUgRkRFX0NTU0lOSEVSSVRTCQkocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YSkNCisjZGVmaW5lIEZERV9DU1NGT05UU0laRQkJKEZERV9DU1NJTkhFUklUUy5tX2ZGb250U2l6ZSkNCisgICAgaWYgKHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseSAmJiAqKEZYX0RXT1JEKilwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkgPT0gMHhjZGNkY2RjZCkgew0KKyAgICAgICAgcENvbXB1dGVkU3R5bGUgPSBwQ29tcHV0ZWRTdHlsZTsNCisgICAgfQ0KKyAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUpIHsNCisgICAgICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBQcmltaXRpdmUgPSAoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopcFZhbHVlOw0KKyAgICAgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUgPSBwUHJpbWl0aXZlLT5HZXRQcmltaXRpdmVUeXBlKCk7DQorICAgICAgICBzd2l0Y2ggKGVQcm9wZXJ0eSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0Rpc3BsYXk6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lRGlzcGxheSA9IFRvRGlzcGxheShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplOiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAmZkZvbnRTaXplID0gRkRFX0NTU0ZPTlRTSVpFOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJiBlVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZGb250U2l6ZSA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBmRm9udFNpemUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZkZvbnRTaXplID0gVG9Gb250U2l6ZShwUHJpbWl0aXZlLT5HZXRFbnVtKCksIGZGb250U2l6ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodDoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZkxpbmVIZWlnaHQgPSBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpICogRkRFX0NTU0ZPTlRTSVpFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID4gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9mTGluZUhlaWdodCA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbjoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VUZXh0QWxpZ2ggPSBUb1RleHRBbGlnbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRJbmRlbnQ6DQorICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NJTkhFUklUUy5tX1RleHRJbmRlbnQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250V2VpZ2h0Og0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fd0ZvbnRXZWlnaHQgPSBUb0ZvbnRXZWlnaHQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlWYWx1ZSA9IChGWF9JTlQzMilwUHJpbWl0aXZlLT5HZXRGbG9hdCgpIC8gMTAwOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlWYWx1ZSA+PSAxICYmIGlWYWx1ZSA8PSA5KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fd0ZvbnRXZWlnaHQgPSBpVmFsdWUgKiAxMDA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZUZvbnRTdHlsZSA9IFRvRm9udFN0eWxlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sb3I6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2R3Rm9udENvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5MZWZ0Og0KKyAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01hcmdpbldpZHRoLmxlZnQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3A6DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNNYXJnaW4gfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGgudG9wLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luUmlnaHQ6DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNNYXJnaW4gfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGgucmlnaHQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Cb3R0b206DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNNYXJnaW4gfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGguYm90dG9tLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQ6DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1BhZGRpbmdXaWR0aC5sZWZ0LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1RvcDoNCisgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1BhZGRpbmcgfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLnRvcCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdSaWdodDoNCisgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1BhZGRpbmcgfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLnJpZ2h0LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbToNCisgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1BhZGRpbmcgfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLmJvdHRvbSwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aDoNCisgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc0JvcmRlciB8PSBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3JkZXJXaWR0aC5sZWZ0LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wV2lkdGg6DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNCb3JkZXIgfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm9yZGVyV2lkdGgudG9wLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aDoNCisgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc0JvcmRlciB8PSBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3JkZXJXaWR0aC5yaWdodCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVdpZHRoOg0KKyAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzQm9yZGVyIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvcmRlcldpZHRoLmJvdHRvbSwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZToNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCRFJMZWZ0U3R5bGUgPSBUb0JvcmRlclN0eWxlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGU6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQkRSVG9wU3R5bGUgPSBUb0JvcmRlclN0eWxlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRTdHlsZToNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCRFJSaWdodFN0eWxlID0gVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUJEUkJvdHRvbVN0eWxlID0gVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvcjoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJMZWZ0Q29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JEUlRvcENvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JEUlJpZ2h0Q29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JEUkJvdHRvbUNvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVUeXBlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUxpc3RTdHlsZVR5cGUgPSBUb0xpc3RTdHlsZVR5cGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVQb3NpdGlvbjoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VMaXN0U3R5bGVQb3NpdGlvbiA9IFRvTGlzdFN0eWxlUG9zaXRpb24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQ29sb3I6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3QktHQ29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3QktHQ29sb3IgPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1Zpc2liaWxpdHk6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVmlzaWJpbGl0eSA9IFRvVmlzaWJpbGl0eShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1dpZHRoOg0KKyAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3hTaXplLmN4LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0Og0KKyAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3hTaXplLmN5LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWluV2lkdGg6DQorICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01pbkJveFNpemUuY3gsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NaW5IZWlnaHQ6DQorICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01pbkJveFNpemUuY3ksIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXhXaWR0aDoNCisgICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWF4Qm94U2l6ZS5jeCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01heEhlaWdodDoNCisgICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWF4Qm94U2l6ZS5jeSwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ246DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lVmVydGljYWxBbGlnbiA9IFRvVmVydGljYWxBbGlnbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJiBlVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQykgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVZlcnRpY2FsQWxpZ24gPSBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXI7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9mVmVydGljYWxBbGlnbiA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1doaXRlU3BhY2U6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lV2hpdGVTcGFjZSA9IFRvV2hpdGVTcGFjZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRUcmFuc2Zvcm06DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dFRyYW5zZm9ybSA9IFRvVGV4dFRyYW5zZm9ybShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRWYXJpYW50Og0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZUZvbnRWYXJpYW50ID0gVG9Gb250VmFyaWFudChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xldHRlclNwYWNpbmc6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9MZXR0ZXJTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJiBlVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQykgew0KKyAgICAgICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU0lOSEVSSVRTLm1fTGV0dGVyU3BhY2luZywgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV29yZFNwYWNpbmc6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9Xb3JkU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NJTkhFUklUUy5tX1dvcmRTcGFjaW5nLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9GbG9hdDoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VGbG9hdCA9IFRvRmxvYXQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9DbGVhcjoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VDbGVhciA9IFRvQ2xlYXIocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZToNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VXcml0aW5nTW9kZSA9IFRvV3JpdGluZ01vZGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Xb3JkQnJlYWs6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lV29yZEJyZWFrID0gVG9Xb3JkQnJlYWsocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9XaWRvd3M6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2lXaWRvd3MgPSAoRlhfSU5UMzIpcFByaW1pdGl2ZS0+R2V0RmxvYXQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9PcnBoYW5zOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9pT3JwaGFucyA9IChGWF9JTlQzMilwUHJpbWl0aXZlLT5HZXRGbG9hdCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc0NvbG9yOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyYW5zcGFyZW50Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0N1cnJlbnRjb2xvcjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZHdUZXh0RW1waGFzaXNDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQmVmb3JlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVBhZ2VCcmVha0JlZm9yZSA9IFRvUGFnZUJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQWZ0ZXI6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lUGFnZUJyZWFrQWZ0ZXIgPSBUb1BhZ2VCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0luc2lkZToNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VQYWdlQnJlYWtJbnNpZGUgPSBUb1BhZ2VCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WDoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VPdmVyZmxvd1ggPSBUb092ZXJmbG93KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dZOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZU92ZXJmbG93WSA9IFRvT3ZlcmZsb3cocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWs6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lTGluZUJyZWFrID0gVG9MaW5lQnJlYWsocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudDoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbkNvdW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbkNvdW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uR2FwOg0KKyAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Db2x1bW5HYXAsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlQ29sb3I6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3Q29sdW1uUnVsZUNvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUNvbHVtblJ1bGVTdHlsZSA9IFRvQm9yZGVyU3R5bGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlV2lkdGg6DQorICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtblJ1bGVXaWR0aCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtbldpZHRoOg0KKyAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Db2x1bW5XaWR0aCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRJbWFnZToNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BzekJLR0ltYWdlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkkpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wc3pCS0dJbWFnZSA9IHBQcmltaXRpdmUtPkdldFN0cmluZyhpTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Qb3NpdGlvbjoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VQb3NpdGlvbiA9IFRvUG9zaXRpb24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Ub3A6DQorICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1RvcCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvdHRvbToNCisgICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm90dG9tLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGVmdDoNCisgICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTGVmdCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1JpZ2h0Og0KKyAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9SaWdodCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcHN6TGlzdFN0eWxlSW1hZ2UgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3Bzekxpc3RTdHlsZUltYWdlID0gcFByaW1pdGl2ZS0+R2V0U3RyaW5nKGlMZW5ndGgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NhcHRpb25TaWRlOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZUNhcHRpb25TaWRlID0gVG9DYXB0aW9uU2lkZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQ6DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQktHUmVwZWF0ID0gVG9CS0dSZXBlYXQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQXR0YWNobWVudDoNCisgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCS0dBdHRhY2htZW50ID0gVG9CS0dBdHRhY2htZW50KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieUFsaWduOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlBbGlnbiA9IFRvUnVieUFsaWduKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieU92ZXJoYW5nOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlPdmVyaGFuZyA9IFRvUnVieU92ZXJoYW5nKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieVBvc2l0aW9uOg0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlQb3NpdGlvbiA9IFRvUnVieVBvc2l0aW9uKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieVNwYW46DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BSdWJ5U3BhbiA9IHBQcmltaXRpdmU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IEZERV9DU1NWQUxVRVRZUEVfTGlzdCkgew0KKyAgICAgICAgSUZERV9DU1NWYWx1ZUxpc3QgKnBMaXN0ID0gKElGREVfQ1NTVmFsdWVMaXN0KilwVmFsdWU7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBwTGlzdC0+Q291bnRWYWx1ZXMoKTsNCisgICAgICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgc3dpdGNoIChlUHJvcGVydHkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseToNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3BGb250RmFtaWx5ID0gcExpc3Q7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dERlY29yYXRpb246DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd1RleHREZWNvcmF0aW9uID0gVG9UZXh0RGVjb3JhdGlvbihwTGlzdCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ291bnRlckluY3JlbWVudDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ291bnRlclN0eWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9IEZERV9OZXcgQ0ZERV9DU1NDb3VudGVyU3R5bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUtPlNldENvdW50ZXJJbmNyZW1lbnRMaXN0KHBMaXN0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUgPSBGREVfTmV3IENGREVfQ1NTQ291bnRlclN0eWxlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ291bnRlclN0eWxlLT5TZXRDb3VudGVyUmVzZXRMaXN0KHBMaXN0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db250ZW50Og0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcENvbnRlbnRMaXN0ID0gcExpc3Q7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUXVvdGVzOg0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcFF1b3RlcyA9IHBMaXN0Ow0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRDb21iaW5lOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHBMaXN0LT5Db3VudFZhbHVlcygpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFZhbCA9IChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKilwTGlzdC0+R2V0VmFsdWUoaSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbC0+R2V0UHJpbWl0aXZlVHlwZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW06IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsLT5HZXRFbnVtKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lVGV4dENvbWJpbmUgPSBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1RleHRDb21iaW5lTnVtYmVyID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VUZXh0Q29tYmluZSA9IEZERV9DU1NURVhUQ09NQklORV9Ib3Jpem9udGFsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzVGV4dENvbWJpbmVOdW1iZXIgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZlRleHRDb21iaW5lTnVtYmVyID0gcFZhbC0+R2V0RmxvYXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzU3R5bGU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCBlRmlsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSyBlTWFyazsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgcExpc3QtPkNvdW50VmFsdWVzKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwVmFsID0gKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBMaXN0LT5HZXRWYWx1ZShpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsLT5HZXRQcmltaXRpdmVUeXBlKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVG9UZXh0RW1waGFzaXNGaWxsKHBWYWwtPkdldEVudW0oKSwgZUZpbGwpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzRmlsbCA9IGVGaWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVG9UZXh0RW1waGFzaXNNYXJrKHBWYWwtPkdldEVudW0oKSwgZU1hcmspKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzTWFyayA9IGVNYXJrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRFbXBoYXNpc01hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b207DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3BzelRleHRFbXBoYXNpc0N1c3RvbU1hcmsgPSBwVmFsLT5HZXRTdHJpbmcoaUxlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgfQ0KK30NCitGWF9GTE9BVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGx5TnVtYmVyKEZERV9DU1NQUklNSVRJVkVUWVBFIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUsIEZYX0ZMT0FUIGZQZXJjZW50QmFzZSkNCit7DQorICAgIHN3aXRjaCAoZVVuaXQpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUFg6DQorICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCisgICAgICAgICAgICByZXR1cm4gZlZhbHVlICogNzIgLyA5NjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUFQ6DQorICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRU1TOg0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FWFM6DQorICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZSAqIGZQZXJjZW50QmFzZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudDoNCisgICAgICAgICAgICByZXR1cm4gZlZhbHVlICogZlBlcmNlbnRCYXNlIC8gMTAwLjBmOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9DTToNCisgICAgICAgICAgICByZXR1cm4gZlZhbHVlICogMjguMzQ2NGY7DQorICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX01NOg0KKyAgICAgICAgICAgIHJldHVybiBmVmFsdWUgKiAyLjgzNDZmOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9JTjoNCisgICAgICAgICAgICByZXR1cm4gZlZhbHVlICogNzIuMGY7DQorICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1BDOg0KKyAgICAgICAgICAgIHJldHVybiBmVmFsdWUgLyAxMi4wZjsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZTsNCisgICAgfQ0KK30NCitGREVfQ1NTUlVCWVNQQU4JQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1J1YnlTcGFuKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWVNQQU5fTm9uZTsNCisgICAgfQ0KK30NCitGREVfQ1NTUlVCWVBPU0lUSU9OIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9SdWJ5UG9zaXRpb24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmVmb3JlOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX0JlZm9yZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWZ0ZXI6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fQWZ0ZXI7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX1JpZ2h0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fSW5saW5lOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllQT1NJVElPTl9CZWZvcmU7DQorICAgIH0NCit9DQorRkRFX0NTU1JVQllPVkVSSEFORyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieU92ZXJoYW5nKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfQXV0bzsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfU3RhcnQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VuZDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllPVkVSSEFOR19FbmQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWU9WRVJIQU5HX05vbmU7DQorICAgIH0NCit9DQorRkRFX0NTU1JVQllBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieUFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQXV0bzsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fU3RhcnQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRW5kOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXI6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQ2VudGVyOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRW5kOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9SaWdodDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZUxldHRlcjoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlTGV0dGVyOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlU3BhY2U6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRGlzdHJpYnV0ZVNwYWNlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lRWRnZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9MaW5lRWRnZTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQXV0bzsNCisgICAgfQ0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0RW1waGFzaXNNYXJrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksgJmVNYXJrKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX05vbmU7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdDoNCisgICAgICAgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdDsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlOg0KKyAgICAgICAgICAgIGVNYXJrID0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ2lyY2xlOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGVDaXJjbGU6DQorICAgICAgICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Eb3VibGVDaXJjbGU7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyaWFuZ2xlOg0KKyAgICAgICAgICAgIGVNYXJrID0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfVHJpYW5nbGU7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Nlc2FtZToNCisgICAgICAgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX1Nlc2FtZTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHRFbXBoYXNpc0ZpbGwoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLCBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCAmZUZpbGwpDQorew0KKyAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaWxsZWQ6DQorICAgICAgICAgICAgZUZpbGwgPSBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9GaWxsZWQ7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW46DQorICAgICAgICAgICAgZUZpbGwgPSBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9PcGVuOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCit9DQorRkRFX0NTU0JLR0FUVEFDSE1FTlQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0JLR0F0dGFjaG1lbnQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dBVFRBQ0hNRU5UX0ZpeGVkOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGw6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dBVFRBQ0hNRU5UX1Njcm9sbDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dBVFRBQ0hNRU5UX0ZpeGVkOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NDQVBUSU9OU0lERSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQ2FwdGlvblNpZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfVG9wOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b206DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9Cb3R0b207DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9MZWZ0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX1JpZ2h0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CZWZvcmU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9CZWZvcmU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfQWZ0ZXI7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfVG9wOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NQT1NJVElPTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUG9zaXRpb24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhdGljOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUE9TSVRJT05fU3RhdGljOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZWxhdGl2ZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX1JlbGF0aXZlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX0ZpeGVkOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BYnNvbHV0ZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX0Fic29sdXRlOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX1N0YXRpYzsNCisgICAgfQ0KK30NCitGREVfQ1NTQ1VSU09SIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9DdXJzb3IoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9BdXRvOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Dcm9zc2hhaXI6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfQ3Jvc3NoYWlyOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0RlZmF1bHQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1BvaW50ZXI6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfUG9pbnRlcjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTW92ZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9Nb3ZlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FUmVzaXplOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0VSZXNpemU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05lUmVzaXplOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX05lUmVzaXplOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Od1Jlc2l6ZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9Od1Jlc2l6ZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTlJlc2l6ZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9OUmVzaXplOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZVJlc2l6ZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9TZVJlc2l6ZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3dSZXNpemU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfU3dSZXNpemU7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0F1dG87DQorICAgIH0NCit9DQorRkRFX0NTU0JLR1JFUEVBVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQktHUmVwZWF0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFg6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0WDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRZOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob1JlcGVhdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9Ob1JlcGVhdDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0Ow0KKyAgICB9DQorfQ0KK0ZERV9DU1NURVhUQ09NQklORSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dENvbWJpbmUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRDT01CSU5FX0hvcml6b250YWw7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCisgICAgfQ0KK30NCitGREVfQ1NTTElORUJSRUFLIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9MaW5lQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19BdXRvOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb29zZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19Mb29zZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX05vcm1hbDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RyaWN0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX1N0cmljdDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSU5FQlJFQUtfQXV0bzsNCisgICAgfQ0KK30NCitGREVfQ1NTT1ZFUkZMT1cgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb092ZXJmbG93KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Zpc2libGU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19IaWRkZW47DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX1Njcm9sbDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX0F1dG87DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vRGlzcGxheToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX05vRGlzcGxheTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9Db250ZW50Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTT1ZFUkZMT1dfTm9Db250ZW50Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX1Zpc2libGU7DQorICAgIH0NCit9DQorRkRFX0NTU1dSSVRJTkdNT0RFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Xcml0aW5nTW9kZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQorew0KKyAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsVGI6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGI7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsUmw6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9WZXJ0aWNhbFJsOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbExyOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV1JJVElOR01PREVfVmVydGljYWxMcjsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGI7DQorICAgIH0NCit9DQorRkRFX0NTU1dPUkRCUkVBSyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvV29yZEJyZWFrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19Ob3JtYWw7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBBbGw6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfS2VlcEFsbDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQnJlYWtBbGw6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfQnJlYWtBbGw7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBXb3JkczoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19LZWVwV29yZHM7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV09SREJSRUFLX05vcm1hbDsNCisgICAgfQ0KK30NCitGREVfQ1NTRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0Zsb2F0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NGTE9BVF9MZWZ0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0ZMT0FUX1JpZ2h0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRkxPQVRfTm9uZTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NGTE9BVF9Ob25lOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NDTEVBUiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQ2xlYXIoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX05vbmU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9MZWZ0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX1JpZ2h0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3RoOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0xFQVJfQm90aDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9Ob25lOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NQQUdFQlJFQUsgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1BhZ2VCcmVhayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQorew0KKyAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bdm9pZDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19Bdm9pZDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19BdXRvOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BbHdheXM6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQWx3YXlzOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX0xlZnQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX1JpZ2h0Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19BdXRvOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NESVNQTEFZIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9EaXNwbGF5KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfSW5saW5lOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbG9jazoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfQmxvY2s7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX05vbmU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpc3RJdGVtOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9MaXN0SXRlbTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDZWxsOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZUNlbGw7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZVJvdzsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNhcHRpb246DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlQ2FwdGlvbjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3dHcm91cDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVSb3dHcm91cDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVIZWFkZXJHcm91cDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVIZWFkZXJHcm91cDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVGb290ZXJHcm91cDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVGb290ZXJHcm91cDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW5Hcm91cDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVDb2x1bW5Hcm91cDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlQ29sdW1uOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVUYWJsZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfSW5saW5lVGFibGU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZUJsb2NrOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9JbmxpbmVCbG9jazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVuSW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1bkluOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9SdWJ5Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieUJhc2U7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9SdWJ5VGV4dDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2VHcm91cDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMU1lfUnVieUJhc2VHcm91cDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHRHcm91cDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieVRleHRHcm91cDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0lubGluZTsNCisgICAgfQ0KK30NCitGREVfQ1NTVEVYVEFMSUdOIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0QWxpZ24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9MZWZ0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXI6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fQ2VudGVyOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9SaWdodDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSnVzdGlmeToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9MZWZ0Ow0KKyAgICB9DQorfQ0KK0ZYX1dPUkQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRXZWlnaHQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KKyAgICAgICAgICAgIHJldHVybiA0MDA7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGQ6DQorICAgICAgICAgICAgcmV0dXJuIDcwMDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZGVyOg0KKyAgICAgICAgICAgIHJldHVybiA5MDA7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpZ2h0ZXI6DQorICAgICAgICAgICAgcmV0dXJuIDIwMDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIDQwMDsNCisgICAgfQ0KK30NCitGREVfQ1NTRk9OVFNUWUxFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Gb250U3R5bGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSXRhbGljOg0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PYmxpcXVlOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NGT05UU1RZTEVfTm9ybWFsOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NCT1JERVJTVFlMRSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQm9yZGVyU3R5bGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX05vbmU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfU29saWQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGRlbjoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0hpZGRlbjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfRG90dGVkOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9EYXNoZWQ7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0RvdWJsZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfR3Jvb3ZlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX1JpZGdlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNldDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0luc2V0Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9vdXRzZXQ7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfTm9uZTsNCisgICAgfQ0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU0xFTkdUSCAmd2lkdGgsIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlLCBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwUHJpbWl0aXZlLCBGWF9GTE9BVCBmRm9udFNpemUpDQorew0KKyAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCkgew0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BlcmNlbnQsIHBQcmltaXRpdmUtPkdldEZsb2F0KCkgLyAxMDAuMGYpOw0KKyAgICAgICAgcmV0dXJuIHdpZHRoLk5vblplcm8oKTsNCisgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBmRm9udFNpemUpOw0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBmVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHdpZHRoLk5vblplcm8oKTsNCisgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICAgICAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICAgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob25lKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGluOg0KKyAgICAgICAgICAgICAgICB3aWR0aC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bToNCisgICAgICAgICAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAzKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljazoNCisgICAgICAgICAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCA0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRTaXplKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwgRlhfRkxPQVQgZkN1ckZvbnRTaXplKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhTbWFsbDoNCisgICAgICAgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgLyAxLjJmIC8gMS4yZiAvIDEuMmY7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hTbWFsbDoNCisgICAgICAgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgLyAxLjJmIC8gMS4yZjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGw6DQorICAgICAgICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWVkaXVtOg0KKyAgICAgICAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2U6DQorICAgICAgICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplICogMS4yZjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWExhcmdlOg0KKyAgICAgICAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAqIDEuMmYgKiAxLjJmOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeExhcmdlOg0KKyAgICAgICAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAqIDEuMmYgKiAxLjJmICogMS4yZjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2VyOg0KKyAgICAgICAgICAgIHJldHVybiBmQ3VyRm9udFNpemUgKiAxLjJmOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyOg0KKyAgICAgICAgICAgIHJldHVybiBmQ3VyRm9udFNpemUgLyAxLjJmOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gZkN1ckZvbnRTaXplOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NWRVJUSUNBTEFMSUdOIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9WZXJ0aWNhbEFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jhc2VsaW5lOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWlkZGxlOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9NaWRkbGU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvdHRvbToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fQm90dG9tOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdXBlcjoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fU3VwZXI7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N1YjoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fU3ViOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3A6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RvcDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dFRvcDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fVGV4dFRvcDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dEJvdHRvbToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fVGV4dEJvdHRvbTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX0Jhc2VsaW5lOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NMSVNUU1RZTEVUWVBFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9MaXN0U3R5bGVUeXBlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCit7DQorICAgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX05vbmU7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc2M6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Rpc2M7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2lyY2xlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TcXVhcmU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX1NxdWFyZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGVjaW1hbDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9EZWNpbWFsTGVhZGluZ1plcm87DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyUm9tYW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyUm9tYW47DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyUm9tYW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX1VwcGVyUm9tYW47DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyR3JlZWs6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyR3JlZWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyTGF0aW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyTGF0aW47DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyTGF0aW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX1VwcGVyTGF0aW47DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FybWVuaWFuOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Bcm1lbmlhbjsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR2VvcmdpYW46DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0dlb3JnaWFuOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckFscGhhOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckFscGhhOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckFscGhhOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckFscGhhOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DamtJZGVvZ3JhcGhpYzoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2prSWRlb2dyYXBoaWM7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hlYnJldzoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGVicmV3Ow0KKyAgICAgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmE7DQorICAgICAgICBjYXNlIEZERV9DU1NMSVNUU1RZTEVUWVBFX0hpcmFnYW5hSXJvaGE6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0hpcmFnYW5hSXJvaGE7DQorICAgICAgICBjYXNlIEZERV9DU1NMSVNUU1RZTEVUWVBFX0thdGFrYW5hOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYTsNCisgICAgICAgIGNhc2UgRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmFJcm9oYToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmFJcm9oYTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Rpc2M7DQorICAgIH0NCit9DQorRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9MaXN0U3R5bGVQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQorew0KKyAgICByZXR1cm4gZVZhbHVlID09IEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2lkZSA/IEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTl9JbnNpZGUgOiBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT05fT3V0c2lkZTsNCit9DQorRkRFX0NTU1ZJU0lCSUxJVFkgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1Zpc2liaWxpdHkoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmlzaWJsZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZJU0lCSUxJVFlfVmlzaWJsZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9IaWRkZW47DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NvbGxhcHNlOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9Db2xsYXBzZTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWSVNJQklMSVRZX1Zpc2libGU7DQorICAgIH0NCit9DQorRkRFX0NTU1dISVRFU1BBQ0UgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1doaXRlU3BhY2UoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV0hJVEVTUEFDRV9Ob3JtYWw7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3dyYXA6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX05vd3JhcDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlV3JhcDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlV3JhcDsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlTGluZToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlTGluZTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX05vcm1hbDsNCisgICAgfQ0KK30NCitGWF9EV09SRCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dERlY29yYXRpb24oSUZERV9DU1NWYWx1ZUxpc3QgKnBWYWx1ZSkNCit7DQorICAgIEZYX0RXT1JEIGR3RGVjb3JhdGlvbiA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IHBWYWx1ZS0+Q291bnRWYWx1ZXMoKSAtIDE7IGkgPj0gMDsgLS1pKSB7DQorICAgICAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwUHJpbWl0aXZlID0gKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBWYWx1ZS0+R2V0VmFsdWUoaSk7DQorICAgICAgICBpZiAocFByaW1pdGl2ZS0+R2V0UHJpbWl0aXZlVHlwZSgpID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VuZGVybGluZToNCisgICAgICAgICAgICAgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZVRocm91Z2g6DQorICAgICAgICAgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3ZlcmxpbmU6DQorICAgICAgICAgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX092ZXJsaW5lOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmxpbms6DQorICAgICAgICAgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0JsaW5rOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KKyAgICAgICAgICAgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZHdEZWNvcmF0aW9uOw0KK30NCitGREVfQ1NTVEVYVFRSQU5TRk9STSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dFRyYW5zZm9ybShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQorew0KKyAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DYXBpdGFsaXplOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9DYXBpdGFsaXplOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2U6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX1VwcGVyQ2FzZTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJjYXNlOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Mb3dlckNhc2U7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lOw0KKyAgICB9DQorfQ0KK0ZERV9DU1NGT05UVkFSSUFOVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFZhcmlhbnQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KK3sNCisgICAgcmV0dXJuIGVWYWx1ZSA9PSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHMgPyBGREVfQ1NTRk9OVFZBUklBTlRfU21hbGxDYXBzIDogRkRFX0NTU0ZPTlRWQVJJQU5UX05vcm1hbDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDAyOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgKQEAgLTAsMCArMSwxMDAwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9DU1NTVFlMRVNFTEVDVE9SDQorI2RlZmluZSBfRkRFX0NTU1NUWUxFU0VMRUNUT1INCisjZGVmaW5lIEZERV9DU1NVTklWRVJTQUxIQVNICQkoJyonKQ0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ1NTUlVMRURBVEEgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorcHVibGljOg0KKyAgICBfRkRFX0NTU1JVTEVEQVRBKElGREVfQ1NTU2VsZWN0b3IgKnBTZWwsIElGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsLCBGWF9EV09SRCBkd1Bvcyk7DQorICAgIElGREVfQ1NTU2VsZWN0b3IJCQkJKnBTZWxlY3RvcjsNCisgICAgSUZERV9DU1NEZWNsYXJhdGlvbgkJCQkqcERlY2xhcmF0aW9uOw0KKyAgICBGWF9EV09SRAkJCQkJCWR3UHJpb3JpdHk7DQorICAgIF9GREVfQ1NTUlVMRURBVEEJCQkJKnBOZXh0Ow0KK30gRkRFX0NTU1JVTEVEQVRBLCAqIEZERV9MUENTU1JVTEVEQVRBOw0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0xQQ1NTUlVMRURBVEE+IENGREVfQ1NTUnVsZURhdGFBcnJheTsNCitjbGFzcyBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uIDogcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uKCkgOiBtX3BTdGF0aWNTdG9yZShOVUxMKSwgbV9wVW5pdmVyc2FsUnVsZXMoTlVMTCkgLCBtX2lTZWxlY3RvcnMoMCksIG1fcFBlcnN1ZG9SdWxlcyhOVUxMKSB7IH0NCisgICAgfkNGREVfQ1NTUnVsZUNvbGxlY3Rpb24oKQ0KKyAgICB7DQorICAgICAgICBDbGVhcigpOw0KKyAgICB9DQorICAgIHZvaWQJCQkJCQkJQWRkUnVsZXNGcm9tKGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5ICZzaGVldHMsIEZYX0RXT1JEIGR3TWVkaWFMaXN0LCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpOw0KKyAgICB2b2lkCQkJCQkJCUNsZWFyKCk7DQorDQorICAgIEZYX0lOVDMyCQkJCQkJQ291bnRTZWxlY3RvcnMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pU2VsZWN0b3JzOw0KKyAgICB9DQorICAgIEZERV9MUENTU1JVTEVEQVRBCQkJCUdldElEUnVsZURhdGEoRlhfRFdPUkQgZHdJREhhc2gpDQorICAgIHsNCisgICAgICAgIEZYX0xQVk9JRCBwRGF0YTsNCisgICAgICAgIHJldHVybiBtX0lEUnVsZXMuTG9va3VwKChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpZHdJREhhc2gsIHBEYXRhKSA/IChGREVfTFBDU1NSVUxFREFUQSlwRGF0YSA6IE5VTEw7DQorICAgIH0NCisgICAgRkRFX0xQQ1NTUlVMRURBVEEJCQkJR2V0VGFnUnVsZURhdGEoRlhfRFdPUkQgZHdUYWdIYXNuKQ0KKyAgICB7DQorICAgICAgICBGWF9MUFZPSUQgcERhdGE7DQorICAgICAgICByZXR1cm4gbV9UYWdSdWxlcy5Mb29rdXAoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd1RhZ0hhc24sIHBEYXRhKSA/IChGREVfTFBDU1NSVUxFREFUQSlwRGF0YSA6IE5VTEw7DQorICAgIH0NCisgICAgRkRFX0xQQ1NTUlVMRURBVEEJCQkJR2V0Q2xhc3NSdWxlRGF0YShGWF9EV09SRCBkd0lESGFzaCkNCisgICAgew0KKyAgICAgICAgRlhfTFBWT0lEIHBEYXRhOw0KKyAgICAgICAgcmV0dXJuIG1fQ2xhc3NSdWxlcy5Mb29rdXAoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd0lESGFzaCwgcERhdGEpID8gKEZERV9MUENTU1JVTEVEQVRBKXBEYXRhIDogTlVMTDsNCisgICAgfQ0KKyAgICBGREVfTFBDU1NSVUxFREFUQQkJCQlHZXRVbml2ZXJzYWxSdWxlRGF0YSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BVbml2ZXJzYWxSdWxlczsNCisgICAgfQ0KKyAgICBGREVfTFBDU1NSVUxFREFUQQkJCQlHZXRQZXJzdWRvUnVsZURhdGEoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wUGVyc3Vkb1J1bGVzOw0KKyAgICB9DQorICAgIElGWF9NRU1BbGxvY2F0b3IJCQkJKm1fcFN0YXRpY1N0b3JlOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJCQkJCQlBZGRSdWxlc0Zyb20oSUZERV9DU1NTdHlsZVNoZWV0ICpwU3R5bGVTaGVldCwgSUZERV9DU1NSdWxlICpwUnVsZSwgRlhfRFdPUkQgZHdNZWRpYUxpc3QsIElGWF9Gb250TWdyICpwRm9udE1ncik7DQorICAgIHZvaWQJCQkJCQkJQWRkUnVsZVRvKENGWF9NYXBQdHJUb1B0ciAmbWFwLCBGWF9EV09SRCBkd0tleSwgSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wpOw0KKyAgICBGWF9CT09MCQkJCQkJCUFkZFJ1bGVUbyhGREVfTFBDU1NSVUxFREFUQSAmcExpc3QsIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhKTsNCisgICAgRkRFX0xQQ1NTUlVMRURBVEEJCQkJTmV3UnVsZURhdGEoSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wpOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQkJCW1fSURSdWxlczsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJCQltX1RhZ1J1bGVzOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQkJCW1fQ2xhc3NSdWxlczsNCisgICAgRkRFX0xQQ1NTUlVMRURBVEEJCQkJbV9wVW5pdmVyc2FsUnVsZXM7DQorICAgIEZERV9MUENTU1JVTEVEQVRBCQkJCW1fcFBlcnN1ZG9SdWxlczsNCisgICAgRlhfSU5UMzIJCQkJCQltX2lTZWxlY3RvcnM7DQorfTsNCitjbGFzcyBDRkRFX0NTU0FjY2VsZXJhdG9yOw0KK2NsYXNzIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTsNCitjbGFzcyBDRkRFX0NTU1N0eWxlU2VsZWN0b3IgOiBwdWJsaWMgSUZERV9DU1NTdHlsZVNlbGVjdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTU3R5bGVTZWxlY3RvcigpOw0KKyAgICB+Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRNZ3IoSUZYX0ZvbnRNZ3IgKnBGb250TWdyKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXREZWZGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVNldFN0eWxlU2hlZXQoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwgSUZERV9DU1NTdHlsZVNoZWV0ICpwU2hlZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVNldFN0eWxlU2hlZXRzKEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5ICpwQXJyYXkpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFN0eWxlUHJpb3JpdHkoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWSBlUHJpb3JpdHkpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVVwZGF0ZVN0eWxlSW5kZXgoRlhfRFdPUkQgZHdNZWRpYUxpc3QpOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTQWNjZWxlcmF0b3IqCUluaXRBY2NlbGVyYXRvcigpOw0KKyAgICB2aXJ0dWFsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSoJQ3JlYXRlQ29tcHV0ZWRTdHlsZShJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJTWF0Y2hEZWNsYXJhdGlvbnMoSUZERV9DU1NUYWdQcm92aWRlciAqcFRhZywgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5ICZtYXRjaGVkRGVjbHMsIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSA9IEZERV9DU1NQRVJTVURPX05PTkUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCUNvbXB1dGVTdHlsZShJRkRFX0NTU1RhZ1Byb3ZpZGVyICpwVGFnLCBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqcHBEZWNsQXJyYXksIEZYX0lOVDMyIGlEZWNsQ291bnQsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcERlc3RTdHlsZSk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQkJCQkJCVJlc2V0KCk7DQorICAgIHZvaWQJCQkJCQkJTWF0Y2hSdWxlcyhGREVfTFBDU1NUQUdDQUNIRSBwQ2FjaGUsIEZERV9MUENTU1JVTEVEQVRBIHBMaXN0LCBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUpOw0KKyAgICB2b2lkCQkJCQkJCVNvcnRSdWxlc1RvKENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSAmbWF0Y2hEZWNscyk7DQorICAgIEZYX0JPT0wJCQkJCQkJTWF0Y2hTZWxlY3RvcihGREVfTFBDU1NUQUdDQUNIRSBwQ2FjaGUsIElGREVfQ1NTU2VsZWN0b3IgKnBTZWwsIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSk7DQorICAgIHZvaWQJCQkJCQkJQXBwZW5kSW5saW5lU3R5bGUoQ0ZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wsIEZYX0xQQ1dTVFIgcHN6LCBGWF9JTlQzMiBpTGVuKTsNCisgICAgdm9pZAkJCQkJCQlBcHBseURlY2xhcmF0aW9ucyhGWF9CT09MIGJQcmlvcml0eSwgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbiAqKnBwRGVjbEFycmF5LCBGWF9JTlQzMiBpRGVjbENvdW50LCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBEZXN0U3R5bGUpOw0KKyAgICB2b2lkCQkJCQkJCUFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwgSUZERV9DU1NWYWx1ZSAqcFZhbHVlLCBDRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBDb21wdXRlZFN0eWxlKTsNCisNCisgICAgRlhfRkxPQVQJCQkJCQlBcHBseU51bWJlcihGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlLCBGWF9GTE9BVCBmUGVyY2VudEJhc2UpOw0KKyAgICBGWF9CT09MCQkJCQkJCVNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NMRU5HVEggJndpZHRoLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFByaW1pdGl2ZSwgRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgICAgRlhfRkxPQVQJCQkJCQlUb0ZvbnRTaXplKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwgRlhfRkxPQVQgZkN1ckZvbnRTaXplKTsNCisgICAgRkRFX0NTU0RJU1BMQVkJCQkJCVRvRGlzcGxheShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTVEVYVEFMSUdOCQkJCVRvVGV4dEFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZYX1dPUkQJCQkJCQkJVG9Gb250V2VpZ2h0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NGT05UU1RZTEUJCQkJVG9Gb250U3R5bGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU0JPUkRFUlNUWUxFCQkJCVRvQm9yZGVyU3R5bGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU1ZFUlRJQ0FMQUxJR04JCQlUb1ZlcnRpY2FsQWxpZ24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU0xJU1RTVFlMRVRZUEUJCQlUb0xpc3RTdHlsZVR5cGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OCQlUb0xpc3RTdHlsZVBvc2l0aW9uKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NWSVNJQklMSVRZCQkJCVRvVmlzaWJpbGl0eShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTV0hJVEVTUEFDRQkJCQlUb1doaXRlU3BhY2UoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRlhfRFdPUkQJCQkJCQlUb1RleHREZWNvcmF0aW9uKElGREVfQ1NTVmFsdWVMaXN0ICpwTGlzdCk7DQorICAgIEZERV9DU1NURVhUVFJBTlNGT1JNCQkJVG9UZXh0VHJhbnNmb3JtKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NGT05UVkFSSUFOVAkJCQlUb0ZvbnRWYXJpYW50KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NGTE9BVAkJCQkJVG9GbG9hdChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTQ0xFQVIJCQkJCVRvQ2xlYXIoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU1dSSVRJTkdNT0RFCQkJCVRvV3JpdGluZ01vZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU1dPUkRCUkVBSwkJCQlUb1dvcmRCcmVhayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTUEFHRUJSRUFLCQkJCVRvUGFnZUJyZWFrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NPVkVSRkxPVwkJCQkJVG9PdmVyZmxvdyhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTTElORUJSRUFLCQkJCVRvTGluZUJyZWFrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NURVhUQ09NQklORQkJCQlUb1RleHRDb21iaW5lKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZYX0JPT0wJCQkJCQkJVG9UZXh0RW1waGFzaXNNYXJrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksgJmVNYXJrKTsNCisgICAgRlhfQk9PTAkJCQkJCQlUb1RleHRFbXBoYXNpc0ZpbGwoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLCBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCAmZUZpbGwpOw0KKyAgICBGREVfQ1NTQ1VSU09SCQkJCQlUb0N1cnNvcihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTUE9TSVRJT04JCQkJCVRvUG9zaXRpb24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU0NBUFRJT05TSURFCQkJCVRvQ2FwdGlvblNpZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU0JLR1JFUEVBVAkJCQlUb0JLR1JlcGVhdChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTQktHQVRUQUNITUVOVAkJCVRvQktHQXR0YWNobWVudChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTUlVCWUFMSUdOCQkJCVRvUnVieUFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICAgIEZERV9DU1NSVUJZT1ZFUkhBTkcJCQkJVG9SdWJ5T3ZlcmhhbmcoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgRkRFX0NTU1JVQllQT1NJVElPTgkJCQlUb1J1YnlQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgICBGREVfQ1NTUlVCWVNQQU4JCQkJCVRvUnVieVNwYW4oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgICAgSUZYX0ZvbnRNZ3IJCQkJCQkqbV9wRm9udE1ncjsNCisgICAgRlhfRkxPQVQJCQkJCQltX2ZEZWZGb250U2l6ZTsNCisgICAgSUZYX01FTUFsbG9jYXRvcgkJCQkqbV9wUnVsZURhdGFTdG9yZTsNCisgICAgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkJCQltX1NoZWV0R3JvdXBzW0ZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYXTsNCisgICAgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbgkJCW1fUnVsZUNvbGxlY3Rpb25bRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVhdOw0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQCQkJbV9lUHJpb3JpdGllc1tGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX01BWF07DQorICAgIElGWF9NRU1BbGxvY2F0b3IJCQkJKm1fcElubGluZVN0eWxlU3RvcmU7DQorICAgIElGWF9NRU1BbGxvY2F0b3IJCQkJKm1fcEZpeGVkU3R5bGVTdG9yZTsNCisgICAgQ0ZERV9DU1NBY2NlbGVyYXRvcgkJCQkqbV9wQWNjZWxlcmF0b3I7DQorICAgIENGREVfQ1NTUnVsZURhdGFBcnJheQkJCW1fTWF0Y2hlZFJ1bGVzOw0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NDT1VOVEVSREFUQSB7DQorcHVibGljOg0KKyAgICBfRkRFX0NTU0NPVU5URVJEQVRBKCkNCisgICAgew0KKyAgICAgICAgRlhfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihfRkRFX0NTU0NPVU5URVJEQVRBKSk7DQorICAgIH0NCisgICAgRlhfQk9PTAkJR2V0Q291bnRlckluY3JlbWVudChGWF9JTlQzMiAmaVZhbHVlKQ0KKyAgICB7DQorICAgICAgICBpVmFsdWUgPSBtX2lJbmNWYWw7DQorICAgICAgICByZXR1cm4gbV9iSW5jcmVtZW50Ow0KKyAgICB9DQorICAgIEZYX0JPT0wJCUdldENvdW50ZXJSZXNldChGWF9JTlQzMiAmaVZhbHVlKQ0KKyAgICB7DQorICAgICAgICBpVmFsdWUgPSBtX2lSZXNldFZhbDsNCisgICAgICAgIHJldHVybiBtX2JSZXNldDsNCisgICAgfQ0KKyAgICBGWF9MUENXU1RSCW1fcHN6SWRlbnQ7DQorICAgIEZYX0JPT0wJCW1fYkluY3JlbWVudDsNCisgICAgRlhfQk9PTAkJbV9iUmVzZXQ7DQorICAgIEZYX0lOVDMyCW1faUluY1ZhbDsNCisgICAgRlhfSU5UMzIJbV9pUmVzZXRWYWw7DQorfSBGREVfQ1NTQ09VTlRFUkRBVEEsICpGREVfTFBDU1NDT1VOVEVSREFUQTsNCitjbGFzcyBDRkRFX0NTU0NvdW50ZXJTdHlsZQ0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTQ291bnRlclN0eWxlKCk6IG1fcENvdW50ZXJJbmMoTlVMTCksIG1fcENvdW50ZXJSZXNldChOVUxMKSB7fQ0KKyAgICB2b2lkCQkJCQkJCQkJU2V0Q291bnRlckluY3JlbWVudExpc3QoSUZERV9DU1NWYWx1ZUxpc3QgKnBMaXN0KQ0KKyAgICB7DQorICAgICAgICBtX3BDb3VudGVySW5jID0gcExpc3Q7DQorICAgICAgICBtX2JJbmRleERpcnR5ID0gVFJVRTsNCisgICAgfQ0KKyAgICB2b2lkCQkJCQkJCQkJU2V0Q291bnRlclJlc2V0TGlzdChJRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QpDQorICAgIHsNCisgICAgICAgIG1fcENvdW50ZXJSZXNldCA9IHBMaXN0Ow0KKyAgICAgICAgbV9iSW5kZXhEaXJ0eSA9IFRSVUU7DQorICAgIH0NCisgICAgRlhfSU5UMzIJCQkJCQkJCUNvdW50Q291bnRlcnMoKQ0KKyAgICB7DQorICAgICAgICBVcGRhdGVJbmRleCgpOw0KKyAgICAgICAgcmV0dXJuIG1fYXJyQ291bnRlckRhdGEuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRDb3VudGVySW5jcmVtZW50KEZYX0lOVDMyIGluZGV4LCBGWF9JTlQzMiAmaVZhbHVlKQ0KKyAgICB7DQorICAgICAgICBVcGRhdGVJbmRleCgpOw0KKyAgICAgICAgcmV0dXJuIG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGluZGV4KS5HZXRDb3VudGVySW5jcmVtZW50KGlWYWx1ZSk7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCQkJCQkJCUdldENvdW50ZXJSZXNldChGWF9JTlQzMiBpbmRleCwgRlhfSU5UMzIgJmlWYWx1ZSkNCisgICAgew0KKyAgICAgICAgVXBkYXRlSW5kZXgoKTsNCisgICAgICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpbmRleCkuR2V0Q291bnRlclJlc2V0KGlWYWx1ZSk7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUgkJCQkJCQkJR2V0Q291bnRlcklkZW50aWZpZXIoRlhfSU5UMzIgaW5kZXgpDQorICAgIHsNCisgICAgICAgIFVwZGF0ZUluZGV4KCk7DQorICAgICAgICByZXR1cm4gbV9hcnJDb3VudGVyRGF0YS5FbGVtZW50QXQoaW5kZXgpLm1fcHN6SWRlbnQ7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJCQkJCQlVcGRhdGVJbmRleCgpOw0KKyAgICB2b2lkCQkJCQkJCQkJRG9VcGRhdGVJbmRleChJRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QpOw0KKyAgICBGWF9JTlQzMgkJCQkJCQkJRmluZEluZGV4KEZYX0xQQ1dTVFIgcHN6SWRlbnRpZmllcik7DQorICAgIElGREVfQ1NTVmFsdWVMaXN0CQkJCQkJKm1fcENvdW50ZXJJbmM7DQorICAgIElGREVfQ1NTVmFsdWVMaXN0CQkJCQkJKm1fcENvdW50ZXJSZXNldDsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0NTU0NPVU5URVJEQVRBPgltX2FyckNvdW50ZXJEYXRhOw0KKyAgICBGWF9CT09MCQkJCQkJCQkJbV9iSW5kZXhEaXJ0eTsNCit9Ow0KK2NsYXNzIENGREVfQ1NTSW5oZXJpdGVkRGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIHZvaWQJCQkJCQkJUmVzZXQoKQ0KKyAgICB7DQorICAgICAgICBGWF9tZW1zZXQodGhpcywgMCwgc2l6ZW9mKENGREVfQ1NTSW5oZXJpdGVkRGF0YSkpOw0KKyAgICAgICAgbV9MZXR0ZXJTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwpOw0KKyAgICAgICAgbV9Xb3JkU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCisgICAgICAgIG1fVGV4dEluZGVudC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDApOw0KKyAgICAgICAgbV9mRm9udFNpemUgPSAxMi4wZjsNCisgICAgICAgIG1fZkxpbmVIZWlnaHQgPSAxNC4wZjsNCisgICAgICAgIG1fd0ZvbnRXZWlnaHQgPSA0MDA7DQorICAgICAgICBtX2R3Rm9udENvbG9yID0gMHhGRjAwMDAwMDsNCisgICAgICAgIG1faVdpZG93cyA9IDI7DQorICAgICAgICBtX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQgPSBUUlVFOw0KKyAgICAgICAgbV9pT3JwaGFucyA9IDI7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUgkJCQkJCW1fcHN6TGlzdFN0eWxlSW1hZ2U7DQorICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fTGV0dGVyU3BhY2luZzsNCisgICAgRkRFX0NTU0xFTkdUSAkJCQkJbV9Xb3JkU3BhY2luZzsNCisgICAgRkRFX0NTU0xFTkdUSAkJCQkJbV9UZXh0SW5kZW50Ow0KKyAgICBJRkRFX0NTU1ZhbHVlTGlzdAkJCQkqbV9wRm9udEZhbWlseTsNCisgICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJKm1fcFF1b3RlczsNCisgICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJKm1fcEN1cnNvclVyaXM7DQorICAgIEZERV9DU1NDVVJTT1IJCQkJCW1fZUN1cnNvcjsNCisgICAgRlhfRkxPQVQJCQkJCQltX2ZGb250U2l6ZTsNCisgICAgRlhfRkxPQVQJCQkJCQltX2ZMaW5lSGVpZ2h0Ow0KKyAgICBGWF9BUkdCCQkJCQkJCW1fZHdGb250Q29sb3I7DQorICAgIEZYX0FSR0IJCQkJCQkJbV9kd1RleHRFbXBoYXNpc0NvbG9yOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fd0ZvbnRXZWlnaHQ7DQorICAgIEZYX0lOVDMyCQkJCQkJbV9pV2lkb3dzOw0KKyAgICBGWF9JTlQzMgkJCQkJCW1faU9ycGhhbnM7DQorICAgIEZYX0xQQ1dTVFIJCQkJCQltX3BzelRleHRFbXBoYXNpc0N1c3RvbU1hcms7DQorICAgIEZYX1dPUkQJCQkJCQkJbV9lRm9udFZhcmlhbnQJCTogMTsNCisgICAgRlhfV09SRAkJCQkJCQltX2VGb250U3R5bGUJCTogMTsNCisgICAgRlhfV09SRAkJCQkJCQltX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQ6IDE7DQorICAgIEZYX1dPUkQJCQkJCQkJbV9lVGV4dEFsaWdoCQk6IDI7DQorICAgIEZYX1dPUkQJCQkJCQkJbV9lVmlzaWJpbGl0eQkJOiAyOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fZVdoaXRlU3BhY2UJCTogMzsNCisgICAgRlhfV09SRAkJCQkJCQltX2VUZXh0VHJhbnNmb3JtCTogMjsNCisgICAgRlhfV09SRAkJCQkJCQltX2VXcml0aW5nTW9kZQkJOiAyOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fZVdvcmRCcmVhawkJOiAyOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fZUxpbmVCcmVhawkJOiAyOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fZVRleHRFbXBoYXNpc0ZpbGwJOiAxOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fZVRleHRFbXBoYXNpc01hcmsJOiAzOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fZUNhcHRpb25TaWRlCQk6IDM7DQorDQorICAgIEZYX1dPUkQJCQkJCQkJbV9lUnVieUFsaWduCQk6IDQ7DQorICAgIEZYX1dPUkQJCQkJCQkJbV9lUnVieU92ZXJoYW5nCQk6IDI7DQorICAgIEZYX1dPUkQJCQkJCQkJbV9lUnVieVBvc2l0aW9uCQk6IDI7DQorfTsNCitjbGFzcyBDRkRFX0NTU05vbkluaGVyaXRlZERhdGENCit7DQorcHVibGljOg0KKyAgICB2b2lkCQkJCQkJCVJlc2V0KCkNCisgICAgew0KKyAgICAgICAgRlhfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDRkRFX0NTU05vbkluaGVyaXRlZERhdGEpKTsNCisgICAgICAgIG1fTWFyZ2luV2lkdGggPSBtX0JvcmRlcldpZHRoID0gbV9QYWRkaW5nV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAwKTsNCisgICAgICAgIG1fTWluQm94U2l6ZS5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDApOw0KKyAgICAgICAgbV9NYXhCb3hTaXplLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob25lKTsNCisgICAgICAgIG1fZURpc3BsYXkgPSBGREVfQ1NTRElTUExBWV9JbmxpbmU7DQorICAgICAgICBtX2ZWZXJ0aWNhbEFsaWduID0gMC4wZjsNCisgICAgICAgIG1fQ29sdW1uQ291bnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICAgICAgbV9Db2x1bW5HYXAuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQorICAgICAgICBtX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gVFJVRTsNCisgICAgICAgIG1fQ29sdW1uV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICAgICAgbV9Db2x1bW5SdWxlV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICAgICAgbV9lVGV4dENvbWJpbmUgPSBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCisgICAgfQ0KKw0KKyAgICBJRkRFX0NTU1ZhbHVlTGlzdAkJCQkqbV9wQ29udGVudExpc3Q7DQorICAgIENGREVfQ1NTQ291bnRlclN0eWxlCQkJKm1fcENvdW50ZXJTdHlsZTsNCisgICAgRkRFX0NTU1JFQ1QJCQkJCQltX01hcmdpbldpZHRoOw0KKyAgICBGREVfQ1NTUkVDVAkJCQkJCW1fQm9yZGVyV2lkdGg7DQorICAgIEZERV9DU1NSRUNUCQkJCQkJbV9QYWRkaW5nV2lkdGg7DQorICAgIEZERV9DU1NTSVpFCQkJCQkJbV9Cb3hTaXplOw0KKyAgICBGREVfQ1NTU0laRQkJCQkJCW1fTWluQm94U2l6ZTsNCisgICAgRkRFX0NTU1NJWkUJCQkJCQltX01heEJveFNpemU7DQorICAgIEZERV9DU1NQT0lOVAkJCQkJbV9CS0dQb3NpdGlvbjsNCisgICAgRlhfTFBDV1NUUgkJCQkJCW1fcHN6QktHSW1hZ2U7DQorICAgIEZYX0FSR0IJCQkJCQkJbV9kd0JLR0NvbG9yOw0KKyAgICBGWF9BUkdCCQkJCQkJCW1fZHdCRFJMZWZ0Q29sb3I7DQorICAgIEZYX0FSR0IJCQkJCQkJbV9kd0JEUlRvcENvbG9yOw0KKyAgICBGWF9BUkdCCQkJCQkJCW1fZHdCRFJSaWdodENvbG9yOw0KKyAgICBGWF9BUkdCCQkJCQkJCW1fZHdCRFJCb3R0b21Db2xvcjsNCisgICAgSUZERV9DU1NWYWx1ZQkJCQkJKm1fcFJ1YnlTcGFuOw0KKyAgICBGREVfQ1NTTEVOR1RICQkJCQltX0NvbHVtbkNvdW50Ow0KKyAgICBGREVfQ1NTTEVOR1RICQkJCQltX0NvbHVtbkdhcDsNCisgICAgRkRFX0NTU0xFTkdUSAkJCQkJbV9Db2x1bW5SdWxlV2lkdGg7DQorICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fQ29sdW1uV2lkdGg7DQorICAgIEZYX0FSR0IJCQkJCQkJbV9kd0NvbHVtblJ1bGVDb2xvcjsNCisgICAgRkRFX0NTU0xFTkdUSAkJCQkJbV9Ub3A7DQorICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fQm90dG9tOw0KKyAgICBGREVfQ1NTTEVOR1RICQkJCQltX0xlZnQ7DQorICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fUmlnaHQ7DQorDQorICAgIEZYX0ZMT0FUCQkJCQkJbV9mVmVydGljYWxBbGlnbjsNCisgICAgRlhfRkxPQVQJCQkJCQltX2ZUZXh0Q29tYmluZU51bWJlcjsNCisgICAgRlhfRFdPUkQJCQkJCQltX2VCRFJMZWZ0U3R5bGUJCTogNDsNCisgICAgRlhfRFdPUkQJCQkJCQltX2VCRFJUb3BTdHlsZQkJOiA0Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZUJEUlJpZ2h0U3R5bGUJOiA0Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZUJEUkJvdHRvbVN0eWxlCTogNDsNCisgICAgRlhfRFdPUkQJCQkJCQltX2VEaXNwbGF5CQkJOiA1Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZVZlcnRpY2FsQWxpZ24JOiA0Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZUxpc3RTdHlsZVR5cGUJOiA1Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZUNvbHVtblJ1bGVTdHlsZSAgOiA0Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZVBhZ2VCcmVha0luc2lkZQk6IDM7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lUGFnZUJyZWFrQWZ0ZXIJOiAzOw0KKyAgICBGWF9EV09SRAkJCQkJCW1fZVBhZ2VCcmVha0JlZm9yZQk6IDM7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lUG9zaXRpb24JCQk6IDI7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lQktHUmVwZWF0CQk6IDI7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lRmxvYXQJCQk6IDI7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lQ2xlYXIJCQk6IDI7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lT3ZlcmZsb3dYCQk6IDM7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lT3ZlcmZsb3dZCQk6IDM7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lTGlzdFN0eWxlUG9zaXRpb246IDE7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lQktHQXR0YWNobWVudAk6IDE7DQorICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzTWFyZ2luCQk6IDE7DQorICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzQm9yZGVyCQk6IDE7DQorICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzUGFkZGluZwkJOiAxOw0KKyAgICBGWF9EV09SRAkJCQkJCW1fZHdUZXh0RGVjb3JhdGlvbgk6IDU7DQorICAgIEZYX0RXT1JECQkJCQkJbV9lVGV4dENvbWJpbmUJCTogMTsNCisgICAgRlhfRFdPUkQJCQkJCQltX2JDb2x1bW5SdWxlQ29sb3JTYW1lICA6IDE7DQorICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzVGV4dENvbWJpbmVOdW1iZXIgOiAxOw0KK307DQorY2xhc3MgQ0ZERV9DU1NDb21wdXRlZFN0eWxlIDogcHVibGljIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSwgcHVibGljIElGREVfQ1NTRm9udFN0eWxlLA0KKyAgICBwdWJsaWMgSUZERV9DU1NCb3VuZGFyeVN0eWxlLCBwdWJsaWMgSUZERV9DU1NQb3NpdGlvblN0eWxlLA0KKyAgICBwdWJsaWMgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSwgcHVibGljIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlLA0KKyAgICBwdWJsaWMgSUZERV9DU1NWaXN1YWxTdHlsZSwgcHVibGljIElGREVfQ1NTTGlzdFN0eWxlLA0KKyAgICBwdWJsaWMgSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlLCBwdWJsaWMgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUsDQorICAgIHB1YmxpYyBJRkRFX0NTU1RhYmxlU3R5bGUsIHB1YmxpYyBJRkRFX0NTU1J1YnlTdHlsZSwNCisgICAgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUoSUZYX01FTUFsbG9jYXRvciAqcEFsbG9jKSA6IG1fZHdSZWZDb3VudCgxKSwgbV9wQWxsb2NhdG9yKHBBbGxvYykge30NCisgICAgfkNGREVfQ1NTQ29tcHV0ZWRTdHlsZSgpIHt9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJQWRkUmVmKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICsrbV9kd1JlZkNvdW50Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fZHdSZWZDb3VudDsNCisgICAgICAgIGlmIChkd1JlZkNvdW50ID09IDApIHsNCisgICAgICAgICAgICBpZiAobV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIEZERV9EZWxldGUgbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRkRFX0RlbGV0ZVdpdGgoQ0ZERV9DU1NDb21wdXRlZFN0eWxlLCBtX3BBbGxvY2F0b3IsIHRoaXMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGR3UmVmQ291bnQ7DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQkJCQlSZXNldCgpDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLlJlc2V0KCk7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU0ZvbnRTdHlsZSoJCQkJR2V0Rm9udFN0eWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoSUZERV9DU1NGb250U3R5bGUgKiBjb25zdCl0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NCb3VuZGFyeVN0eWxlKgkJCUdldEJvdW5kYXJ5U3R5bGVzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChJRkRFX0NTU0JvdW5kYXJ5U3R5bGUgKiBjb25zdCl0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NQb3NpdGlvblN0eWxlKgkJCUdldFBvc2l0aW9uU3R5bGVzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChJRkRFX0NTU1Bvc2l0aW9uU3R5bGUgKiBjb25zdCl0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSoJCQlHZXRQYXJhZ3JhcGhTdHlsZXMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKElGREVfQ1NTUGFyYWdyYXBoU3R5bGUgKiBjb25zdCl0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUqCQlHZXRCYWNrZ3JvdW5kU3R5bGVzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChJRkRFX0NTU0JhY2tncm91bmRTdHlsZSAqIGNvbnN0KXRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU1Zpc3VhbFN0eWxlKgkJCUdldFZpc3VhbFN0eWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoSUZERV9DU1NWaXN1YWxTdHlsZSAqIGNvbnN0KXRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU0xpc3RTdHlsZSoJCQkJR2V0TGlzdFN0eWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoSUZERV9DU1NMaXN0U3R5bGUgKiBjb25zdCl0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NUYWJsZVN0eWxlKgkJCQlHZXRUYWJsZVN0eWxlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChJRkRFX0NTU1RhYmxlU3R5bGUgKiBjb25zdCl0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlKgkJR2V0TXVsdGlDb2x1bW5TdHlsZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlICogY29uc3QpdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlKglHZXRHZW5lcmF0ZWRDb250ZW50U3R5bGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlICogY29uc3QpdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElGREVfQ1NTUnVieVN0eWxlKgkJCQlHZXRSdWJ5U3R5bGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKElGREVfQ1NTUnVieVN0eWxlICogY29uc3QpdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldEN1c3RvbVN0eWxlKEZYX1dTVFIgd3NOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkgY29uc3QNCisgICAgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gbV9DdXN0b21Qcm9wZXJ0aWVzLkdldFNpemUoKSAtIDI7IGkgPiAtMTsgaSAtPSAyKSB7DQorICAgICAgICAgICAgaWYgKHdzTmFtZSA9PSBtX0N1c3RvbVByb3BlcnRpZXNbaV0pIHsNCisgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IG1fQ3VzdG9tUHJvcGVydGllc1tpICsgMV07DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NSVUJZQUxJR04JCUdldFJ1YnlBbGlnbigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1JVQllBTElHTiltX0luaGVyaXRlZERhdGEubV9lUnVieUFsaWduOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU1JVQllQT1NJVElPTgkJR2V0UnVieVBvc2l0aW9uKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTUlVCWVBPU0lUSU9OKW1fSW5oZXJpdGVkRGF0YS5tX2VSdWJ5UG9zaXRpb247DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTUlVCWU9WRVJIQU5HCQlHZXRSdWJ5T3ZlcmhhbmcoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NSVUJZT1ZFUkhBTkcpbV9Jbmhlcml0ZWREYXRhLm1fZVJ1YnlPdmVyaGFuZzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NSVUJZU1BBTgkJCUdldFJ1YnlTcGFuVHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wUnVieVNwYW4gPT0gTlVMTCA/IEZERV9DU1NSVUJZU1BBTl9Ob25lIDogRkRFX0NTU1JVQllTUEFOX0F0dHI7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKgkJCUdldFJ1YnlTcGFuQXR0cigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wUnVieVNwYW47DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTQ0FQVElPTlNJREUJCUdldENhcHRpb25TaWRlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTQ0FQVElPTlNJREUpbV9Jbmhlcml0ZWREYXRhLm1fZUNhcHRpb25TaWRlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRDb3VudGVycygpDQorICAgIHsNCisgICAgICAgIHJldHVybiAobV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZSA9PSBOVUxMKSA/IDAgOiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5Db3VudENvdW50ZXJzKCk7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9MUENXU1RSCQkJCUdldENvdW50ZXJJZGVudGlmaWVyKEZYX0lOVDMyIGluZGV4KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZS0+R2V0Q291bnRlcklkZW50aWZpZXIoaW5kZXgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0Q291bnRlclJlc2V0KEZYX0lOVDMyIGluZGV4LCBGWF9JTlQzMiAmaVZhbHVlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZS0+R2V0Q291bnRlclJlc2V0KGluZGV4LCBpVmFsdWUpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0Q291bnRlckluY3JlbWVudChGWF9JTlQzMiBpbmRleCwgRlhfSU5UMzIgJmlWYWx1ZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BDb3VudGVyU3R5bGUtPkdldENvdW50ZXJJbmNyZW1lbnQoaW5kZXgsIGlWYWx1ZSk7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlTGlzdCoJCUdldENvbnRlbnQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvbnRlbnRMaXN0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRRdW90ZXMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcFF1b3RlcyA9PSBOVUxMID8gMCA6IG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMtPkNvdW50VmFsdWVzKCk7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9MUENXU1RSCQkJCUdldFF1b3RlcyhGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMgIT0gTlVMTCAmJiBtX0luaGVyaXRlZERhdGEubV9wUXVvdGVzLT5Db3VudFZhbHVlcygpID4gaW5kZXgpOw0KKyAgICAgICAgcmV0dXJuICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMtPkdldFZhbHVlKGluZGV4KSkpLT5HZXRTdHJpbmcoaW5kZXgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0Q29sdW1uQ291bnQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uQ291bnQ7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5HYXAoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uR2FwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Q29sdW1uUnVsZUNvbG9yKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lID8gbV9Jbmhlcml0ZWREYXRhLm1fZHdGb250Q29sb3IgOiBtX05vbkluaGVyaXRlZERhdGEubV9kd0NvbHVtblJ1bGVDb2xvcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Q29sdW1uUnVsZVN0eWxlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTQk9SREVSU1RZTEUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUNvbHVtblJ1bGVTdHlsZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldENvbHVtblJ1bGVXaWR0aCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5SdWxlV2lkdGg7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5XaWR0aCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5XaWR0aDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbHVtbkNvdW50KGNvbnN0IEZERV9DU1NMRU5HVEggJmNvbHVtbkNvdW50KQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5Db3VudCA9IGNvbHVtbkNvdW50Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uR2FwKGNvbnN0IEZERV9DU1NMRU5HVEggJmNvbHVtbkdhcCkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uR2FwID0gY29sdW1uR2FwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uUnVsZUNvbG9yKEZYX0FSR0IgZHdDb2x1bW5SdWxlQ29sb3IpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3Q29sdW1uUnVsZUNvbG9yID0gZHdDb2x1bW5SdWxlQ29sb3IsIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5SdWxlU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVDb2x1bW5SdWxlU3R5bGUpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDb2x1bW5SdWxlU3R5bGUgPSBlQ29sdW1uUnVsZVN0eWxlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uUnVsZVdpZHRoKGNvbnN0IEZERV9DU1NMRU5HVEggJmNvbHVtblJ1bGVXaWR0aCkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uUnVsZVdpZHRoID0gY29sdW1uUnVsZVdpZHRoOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uV2lkdGgoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uV2lkdGgpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtbldpZHRoID0gY29sdW1uV2lkdGg7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudEZvbnRGYW1pbGllcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseSA/IG1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5LT5Db3VudFZhbHVlcygpIDogMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIJCQkJR2V0Rm9udEZhbWlseShGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKG1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5LT5HZXRWYWx1ZShpbmRleCkpKS0+R2V0U3RyaW5nKGluZGV4KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJCUdldEZvbnRXZWlnaHQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fd0ZvbnRXZWlnaHQ7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTRk9OVFZBUklBTlQJCUdldEZvbnRWYXJpYW50KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTRk9OVFZBUklBTlQpbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0ZPTlRTVFlMRQkJR2V0Rm9udFN0eWxlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTRk9OVFNUWUxFKW1fSW5oZXJpdGVkRGF0YS5tX2VGb250U3R5bGU7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9mRm9udFNpemU7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRDb2xvcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRXZWlnaHQoRlhfV09SRCB3Rm9udFdlaWdodCkNCisgICAgew0KKyAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fd0ZvbnRXZWlnaHQgPSB3Rm9udFdlaWdodDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRWYXJpYW50KEZERV9DU1NGT05UVkFSSUFOVCBlRm9udFZhcmlhbnQpDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VGb250VmFyaWFudCA9IGVGb250VmFyaWFudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTdHlsZShGREVfQ1NTRk9OVFNUWUxFIGVGb250U3R5bGUpDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VGb250U3R5bGUgPSBlRm9udFN0eWxlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUgPSBmRm9udFNpemU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2xvcihGWF9BUkdCIGR3Rm9udENvbG9yKQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvciA9IGR3Rm9udENvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyTGVmdENvbG9yKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSTGVmdENvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyVG9wQ29sb3IoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJUb3BDb2xvcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldEJvcmRlclJpZ2h0Q29sb3IoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJSaWdodENvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyQm90dG9tQ29sb3IoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJCb3R0b21Db2xvcjsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyTGVmdFN0eWxlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTQk9SREVSU1RZTEUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkxlZnRTdHlsZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyVG9wU3R5bGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSVG9wU3R5bGU7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlclJpZ2h0U3R5bGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSUmlnaHRTdHlsZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyQm90dG9tU3R5bGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSQm90dG9tU3R5bGU7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCoJCUdldEJvcmRlcldpZHRoKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPyAmKG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoKSA6IE5VTEw7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCoJCUdldE1hcmdpbldpZHRoKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPyAmKG1fTm9uSW5oZXJpdGVkRGF0YS5tX01hcmdpbldpZHRoKSA6IE5VTEw7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCoJCUdldFBhZGRpbmdXaWR0aCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoKSA6IE5VTEw7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJMZWZ0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUkxlZnRDb2xvciA9IGR3Qm9yZGVyQ29sb3I7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJUb3BDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSVG9wQ29sb3IgPSBkd0JvcmRlckNvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyUmlnaHRDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSUmlnaHRDb2xvciA9IGR3Qm9yZGVyQ29sb3I7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJCb3R0b21Db2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSQm90dG9tQ29sb3IgPSBkd0JvcmRlckNvbG9yOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyTGVmdFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJMZWZ0U3R5bGUgPSBlQm9yZGVyU3R5bGU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJUb3BTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lQkRSVG9wU3R5bGUgPSBlQm9yZGVyU3R5bGU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJSaWdodFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJSaWdodFN0eWxlID0gZUJvcmRlclN0eWxlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyQm90dG9tU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkJvdHRvbVN0eWxlID0gZUJvcmRlclN0eWxlOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QgJnJlY3QpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoID0gcmVjdDsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPSBUUlVFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TWFyZ2luV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QgJnJlY3QpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01hcmdpbldpZHRoID0gcmVjdDsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPSBUUlVFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFkZGluZ1dpZHRoKGNvbnN0IEZERV9DU1NSRUNUICZyZWN0KQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGggPSByZWN0Ow0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSBUUlVFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0RJU1BMQVkJCQlHZXREaXNwbGF5KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTRElTUExBWSltX05vbkluaGVyaXRlZERhdGEubV9lRGlzcGxheTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJgkJR2V0Qm94U2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Cb3hTaXplOw0KKyAgICB9DQorICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmCQlHZXRNaW5Cb3hTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01pbkJveFNpemU7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYJCUdldE1heEJveFNpemUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWF4Qm94U2l6ZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NGTE9BVAkJCUdldEZsb2F0KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTRkxPQVQpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUZsb2F0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0NMRUFSCQkJR2V0Q2xlYXIoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NDTEVBUiltX05vbkluaGVyaXRlZERhdGEubV9lQ2xlYXI7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTUE9TSVRJT04JCQlHZXRQb3NpdGlvbigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1BPU0lUSU9OKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VQb3NpdGlvbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NMRU5HVEgJCQlHZXRUb3AoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fVG9wOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSAkJCUdldEJvdHRvbSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Cb3R0b207DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTTEVOR1RICQkJR2V0TGVmdCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9MZWZ0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSAkJCUdldFJpZ2h0KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX1JpZ2h0Ow0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZURpc3BsYXkgPSBlRGlzcGxheTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUgJnNpemUpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JveFNpemUgPSBzaXplOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TWluQm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSAmc2l6ZSkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWluQm94U2l6ZSA9IHNpemU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNYXhCb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFICZzaXplKQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9NYXhCb3hTaXplID0gc2l6ZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZsb2F0KEZERV9DU1NGTE9BVCBlRmxvYXQpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VGbG9hdCA9IGVGbG9hdDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENsZWFyKEZERV9DU1NDTEVBUiBlQ2xlYXIpDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDbGVhciA9IGVDbGVhcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldExpbmVIZWlnaHQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZkxpbmVIZWlnaHQ7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTV0hJVEVTUEFDRQkJR2V0V2hpdGVTcGFjZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1dISVRFU1BBQ0UpbV9Jbmhlcml0ZWREYXRhLm1fZVdoaXRlU3BhY2U7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRUZXh0SW5kZW50KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX1RleHRJbmRlbnQ7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTVEVYVEFMSUdOCQlHZXRUZXh0QWxpZ24oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NURVhUQUxJR04pbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRBbGlnaDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NWRVJUSUNBTEFMSUdOCUdldFZlcnRpY2FsQWxpZ24oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NWRVJUSUNBTEFMSUdOKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0TnVtYmVyVmVydGljYWxBbGlnbigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9mVmVydGljYWxBbGlnbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NURVhUVFJBTlNGT1JNCUdldFRleHRUcmFuc2Zvcm0oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NURVhUVFJBTlNGT1JNKW1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0VHJhbnNmb3JtOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJR2V0VGV4dERlY29yYXRpb24oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdUZXh0RGVjb3JhdGlvbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldExldHRlclNwYWNpbmcoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fTGV0dGVyU3BhY2luZzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldFdvcmRTcGFjaW5nKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU1dSSVRJTkdNT0RFCQlHZXRXcml0aW5nTW9kZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1dSSVRJTkdNT0RFKW1fSW5oZXJpdGVkRGF0YS5tX2VXcml0aW5nTW9kZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NXT1JEQlJFQUsJCUdldFdvcmRCcmVhaygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1dPUkRCUkVBSyltX0luaGVyaXRlZERhdGEubV9lV29yZEJyZWFrOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJR2V0V2lkb3dzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2lXaWRvd3M7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRUZXh0RW1waGFzaXNDb2xvcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID8gbV9Jbmhlcml0ZWREYXRhLm1fZHdGb250Q29sb3IgOiBtX0luaGVyaXRlZERhdGEubV9kd1RleHRFbXBoYXNpc0NvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSwkJR2V0UGFnZUJyZWFrQmVmb3JlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTUEFHRUJSRUFLKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VQYWdlQnJlYWtCZWZvcmU7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLCQlHZXRQYWdlQnJlYWtBZnRlcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU1BBR0VCUkVBSyltX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrQWZ0ZXI7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLCQlHZXRQYWdlQnJlYWtJbnNpZGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NQQUdFQlJFQUspbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0luc2lkZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUdldE9ycGhhbnMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1faU9ycGhhbnM7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTTElORUJSRUFLCQlHZXRMaW5lQnJlYWsoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NMSU5FQlJFQUspbV9Jbmhlcml0ZWREYXRhLm1fZUxpbmVCcmVhazsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNNQVJLCUdldFRleHRFbXBoYXNpc01hcmsoKSBjb25zdDsNCisgICAgdmlydHVhbCBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTAlHZXRUZXh0RW1waGFzaXNGaWxsKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCltX0luaGVyaXRlZERhdGEubV9lVGV4dEVtcGhhc2lzRmlsbDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIJCQkJR2V0VGV4dEVtcGhhc2lzQ3VzdG9tKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0RW1waGFzaXNNYXJrID09IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0N1c3RvbSk7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcHN6VGV4dEVtcGhhc2lzQ3VzdG9tTWFyazsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NURVhUQ09NQklORQkJR2V0VGV4dENvbWJpbmVUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTVEVYVENPTUJJTkUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVRleHRDb21iaW5lOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJSGFzVGV4dENvbWJpbmVOdW1iZXIoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1RleHRDb21iaW5lTnVtYmVyOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0VGV4dENvbWJpbmVOdW1iZXIoKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9Ob25Jbmhlcml0ZWREYXRhLm1fZVRleHRDb21iaW5lID09IEZERV9DU1NURVhUQ09NQklORV9Ib3Jpem9udGFsKTsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9mVGV4dENvbWJpbmVOdW1iZXI7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9mTGluZUhlaWdodCA9IGZMaW5lSGVpZ2h0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0V2hpdGVTcGFjZShGREVfQ1NTV0hJVEVTUEFDRSBlV2hpdGVTcGFjZSkNCisgICAgew0KKyAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZVdoaXRlU3BhY2UgPSBlV2hpdGVTcGFjZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRJbmRlbnQoY29uc3QgRkRFX0NTU0xFTkdUSCAmdGV4dEluZGVudCkNCisgICAgew0KKyAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fVGV4dEluZGVudCA9IHRleHRJbmRlbnQ7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0QWxpZ24oRkRFX0NTU1RFWFRBTElHTiBlVGV4dEFsaWduKQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9lVGV4dEFsaWdoID0gZVRleHRBbGlnbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFZlcnRpY2FsQWxpZ24oRkRFX0NTU1ZFUlRJQ0FMQUxJR04gZVZlcnRpY2FsQWxpZ24pDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduID0gZVZlcnRpY2FsQWxpZ247DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXROdW1iZXJWZXJ0aWNhbEFsaWduKEZYX0ZMT0FUIGZBbGlnbikNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVZlcnRpY2FsQWxpZ24gPSBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXIsIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2ZWZXJ0aWNhbEFsaWduID0gZkFsaWduOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dFRyYW5zZm9ybShGREVfQ1NTVEVYVFRSQU5TRk9STSBlVGV4dFRyYW5zZm9ybSkNCisgICAgew0KKyAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRUcmFuc2Zvcm0gPSBlVGV4dFRyYW5zZm9ybTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHREZWNvcmF0aW9uKEZYX0RXT1JEIGR3VGV4dERlY29yYXRpb24pDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3VGV4dERlY29yYXRpb24gPSBkd1RleHREZWNvcmF0aW9uOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TGV0dGVyU3BhY2luZyhjb25zdCBGREVfQ1NTTEVOR1RIICZsZXR0ZXJTcGFjaW5nKQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9MZXR0ZXJTcGFjaW5nID0gbGV0dGVyU3BhY2luZzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJIAlTZXRXb3JkU3BhY2luZyhjb25zdCBGREVfQ1NTTEVOR1RIICZ3b3JkU3BhY2luZykNCisgICAgew0KKyAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fV29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdyaXRpbmdNb2RlKEZERV9DU1NXUklUSU5HTU9ERSBlV3JpdGluZ01vZGUpDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VXcml0aW5nTW9kZSA9IGVXcml0aW5nTW9kZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdvcmRCcmVhayhGREVfQ1NTV09SREJSRUFLIGVXb3JkQnJlYWspDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VXb3JkQnJlYWsgPSBlV29yZEJyZWFrOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0V2lkb3dzKEZYX0lOVDMyIGlXaWRvd3MpDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2lXaWRvd3MgPSBpV2lkb3dzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dEVtcGhhc2lzQ29sb3IoRlhfQVJHQiBkd1RleHRFbXBoYXNpc0NvbG9yKQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gZHdUZXh0RW1waGFzaXNDb2xvciwgbV9Jbmhlcml0ZWREYXRhLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFnZUJyZWFrQmVmb3JlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0JlZm9yZSkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0JlZm9yZSA9IGVQYWdlQnJlYWtCZWZvcmU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRQYWdlQnJlYWtBZnRlcihGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtBZnRlcikNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0FmdGVyID0gZVBhZ2VCcmVha0FmdGVyOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFnZUJyZWFrSW5zaWRlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0luc2lkZSkNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0luc2lkZSA9IGVQYWdlQnJlYWtJbnNpZGU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRPcnBoYW5zKEZYX0lOVDMyIGlPcnBoYW5zKQ0KKyAgICB7DQorICAgICAgICBtX0luaGVyaXRlZERhdGEubV9pT3JwaGFucyA9IGlPcnBoYW5zOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TGluZUJyZWFrKEZERV9DU1NMSU5FQlJFQUsgZUxpbmVCcmVhaykNCisgICAgew0KKyAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUxpbmVCcmVhayA9IGVMaW5lQnJlYWs7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCS0dDb2xvcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JLR0NvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfTFBDV1NUUgkJCQlHZXRCS0dJbWFnZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wc3pCS0dJbWFnZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NQT0lOVCYJCUdldEJLR1Bvc2l0aW9uKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JLR1Bvc2l0aW9uOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0JLR1JFUEVBVAkJR2V0QktHUmVwZWF0KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTQktHUkVQRUFUKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCS0dSZXBlYXQ7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTQktHQVRUQUNITUVOVAlHZXRCS0dBdHRhY2htZW50KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTQktHQVRUQUNITUVOVCltX05vbkluaGVyaXRlZERhdGEubV9lQktHQXR0YWNobWVudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJLR0NvbG9yKEZYX0FSR0IgZHdCS0dDb2xvcikNCisgICAgew0KKyAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCS0dDb2xvciA9IGR3QktHQ29sb3I7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCS0dQb3NpdGlvbihjb25zdCBGREVfQ1NTUE9JTlQgJmJrZ1Bvc2l0aW9uKQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9CS0dQb3NpdGlvbiA9IGJrZ1Bvc2l0aW9uOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU1ZJU0lCSUxJVFkJCUdldFZpc2liaWxpdHkoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NWSVNJQklMSVRZKW1fSW5oZXJpdGVkRGF0YS5tX2VWaXNpYmlsaXR5Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU09WRVJGTE9XCQkJR2V0T3ZlcmZsb3dYKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGREVfQ1NTT1ZFUkZMT1cpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZU92ZXJmbG93WDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVwkJCUdldE92ZXJmbG93WSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU09WRVJGTE9XKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VPdmVyZmxvd1k7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudEN1cnNvclVybHMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMgPT0gTlVMTCA/IDAgOiBtX0luaGVyaXRlZERhdGEubV9wQ3Vyc29yVXJpcy0+Q291bnRWYWx1ZXMoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIJCQkJR2V0Q3Vyc29yVXJsKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMgIT0gTlVMTCk7DQorICAgICAgICByZXR1cm4gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikobV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMtPkdldFZhbHVlKGluZGV4KSkpLT5HZXRTdHJpbmcoaW5kZXgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU0NVUlNPUgkJCUdldEN1cnNvclR5cGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZUN1cnNvcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFZpc2liaWxpdHkoRkRFX0NTU1ZJU0lCSUxJVFkgZVZpc2liaWxpdHkpDQorICAgIHsNCisgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VWaXNpYmlsaXR5ID0gZVZpc2liaWxpdHk7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTTElTVFNUWUxFVFlQRQkJR2V0TGlzdFN0eWxlVHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRkRFX0NTU0xJU1RTVFlMRVRZUEUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUxpc3RTdHlsZVR5cGU7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04JR2V0TGlzdFN0eWxlUG9zaXRpb24oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiltX05vbkluaGVyaXRlZERhdGEubV9lTGlzdFN0eWxlUG9zaXRpb247DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9MUENXU1RSCQkJCQlHZXRMaXN0U3R5bGVJbWFnZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wc3pMaXN0U3R5bGVJbWFnZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQlTZXRMaXN0U3R5bGVUeXBlKEZERV9DU1NMSVNUU1RZTEVUWVBFIGVMaXN0U3R5bGVUeXBlKQ0KKyAgICB7DQorICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lTGlzdFN0eWxlVHlwZSA9IGVMaXN0U3R5bGVUeXBlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJCVNldExpc3RTdHlsZVBvc2l0aW9uKEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBlTGlzdFN0eWxlUG9zaXRpb24pDQorICAgIHsNCisgICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VMaXN0U3R5bGVQb3NpdGlvbiA9IGVMaXN0U3R5bGVQb3NpdGlvbjsNCisgICAgfQ0KKyAgICB2b2lkIEFkZEN1c3RvbVN0eWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKQ0KKyAgICB7DQorICAgICAgICBtX0N1c3RvbVByb3BlcnRpZXMuQWRkKHdzTmFtZSk7DQorICAgICAgICBtX0N1c3RvbVByb3BlcnRpZXMuQWRkKHdzVmFsdWUpOw0KKyAgICB9DQorICAgIEZYX0RXT1JECQkJCQkJbV9kd1JlZkNvdW50Ow0KKyAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BBbGxvY2F0b3I7DQorICAgIENGREVfQ1NTSW5oZXJpdGVkRGF0YQkJCW1fSW5oZXJpdGVkRGF0YTsNCisgICAgQ0ZERV9DU1NOb25Jbmhlcml0ZWREYXRhCQltX05vbkluaGVyaXRlZERhdGE7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkJCQkJbV9DdXN0b21Qcm9wZXJ0aWVzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNoZWV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJlZjY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5jcHAKQEAgLTAsMCArMSw0ODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NzeW50YXguaCINCisjaW5jbHVkZSAiZmRlX2Nzc2RhdGF0YWJsZS5oIg0KKyNpbmNsdWRlICJmZGVfY3Nzc3R5bGVzaGVldC5oIg0KK0lGREVfQ1NTU3R5bGVTaGVldCogSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkSFRNTFN0YW5kYXJkU3R5bGVTaGVldCgpDQorew0KKyAgICBzdGF0aWMgY29uc3QgRlhfTFBDV1NUUiBzX3BTdHlsZSA9IChGWF9MUENXU1RSKUwiaHRtbCxhZGRyZXNzLGJsb2NrcXVvdGUsYm9keSxkZCxkaXYsZGwsZHQsZmllbGRzZXQsZm9ybSxmcmFtZSxmcmFtZXNldCxoMSxoMixoMyxoNCxoNSxoNixub2ZyYW1lcyxvbCxwLHVsLGNlbnRlcixkaXIsaHIsbWVudSxwcmV7ZGlzcGxheTpibG9ja30iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJsaXtkaXNwbGF5Omxpc3QtaXRlbX1oZWFke2Rpc3BsYXk6bm9uZX10YWJsZXtkaXNwbGF5OnRhYmxlfXRye2Rpc3BsYXk6dGFibGUtcm93fXRoZWFke2Rpc3BsYXk6dGFibGUtaGVhZGVyLWdyb3VwfXRib2R5e2Rpc3BsYXk6dGFibGUtcm93LWdyb3VwfXRmb290e2Rpc3BsYXk6dGFibGUtZm9vdGVyLWdyb3VwfSINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImNvbHtkaXNwbGF5OnRhYmxlLWNvbHVtbn1jb2xncm91cHtkaXNwbGF5OnRhYmxlLWNvbHVtbi1ncm91cH10ZCx0aHtkaXNwbGF5OnRhYmxlLWNlbGx9Y2FwdGlvbntkaXNwbGF5OnRhYmxlLWNhcHRpb259dGh7Zm9udC13ZWlnaHQ6Ym9sZGVyO3RleHQtYWxpZ246Y2VudGVyfWNhcHRpb257dGV4dC1hbGlnbjpjZW50ZXJ9Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiYm9keXttYXJnaW46MH1oMXtmb250LXNpemU6MmVtO21hcmdpbjouNjdlbSAwfWgye2ZvbnQtc2l6ZToxLjVlbTttYXJnaW46Ljc1ZW0gMH1oM3tmb250LXNpemU6MS4xN2VtO21hcmdpbjouODNlbSAwfWg0LHAsYmxvY2txdW90ZSx1bCxmaWVsZHNldCxmb3JtLG9sLGRsLGRpcixtZW51e21hcmdpbjoxLjEyZW0gMH0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJoNXtmb250LXNpemU6LjgzZW07bWFyZ2luOjEuNWVtIDB9aDZ7Zm9udC1zaXplOi43NWVtO21hcmdpbjoxLjY3ZW0gMH1oMSxoMixoMyxoNCxoNSxoNixiLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9YmxvY2txdW90ZXttYXJnaW4tbGVmdDo0MHB4O21hcmdpbi1yaWdodDo0MHB4fWksY2l0ZSxlbSx2YXIsYWRkcmVzc3tmb250LXN0eWxlOml0YWxpY30iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJwcmUsdHQsY29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2V9cHJle3doaXRlLXNwYWNlOnByZX1idXR0b24sdGV4dGFyZWEsaW5wdXQsc2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrfWJpZ3tmb250LXNpemU6MS4xN2VtfXNtYWxsLHN1YixzdXB7Zm9udC1zaXplOi44M2VtfXN1Ynt2ZXJ0aWNhbC1hbGlnbjpzdWJ9Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwic3Vwe3ZlcnRpY2FsLWFsaWduOnN1cGVyfXRhYmxle2JvcmRlci1zcGFjaW5nOjJweH10aGVhZCx0Ym9keSx0Zm9vdHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9dGQsdGgsdHJ7dmVydGljYWwtYWxpZ246aW5oZXJpdH1zLHN0cmlrZSxkZWx7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaH1ocntib3JkZXI6MXB4IGluc2V0IHNpbHZlcn0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJvbCx1bCxkaXIsbWVudSxkZHttYXJnaW4tbGVmdDo0MHB4fW9se2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfW9sIHVsLHVsIG9sLHVsIHVsLG9sIG9se21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9dSxpbnN7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwicnVieXtkaXNwbGF5OnJ1Ynl9cnR7ZGlzcGxheTpydWJ5LXRleHQ7Zm9udC1zaXplOi41ZW19cmJ7ZGlzcGxheTpydWJ5LWJhc2V9cmJje2Rpc3BsYXk6cnVieS1iYXNlLWdyb3VwfXJ0Y3tkaXNwbGF5OnJ1YnktdGV4dC1ncm91cH0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJxOmJlZm9yZXtjb250ZW50Om9wZW4tcXVvdGV9cTphZnRlcntjb250ZW50OmNsb3NlLXF1b3RlfSINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInJwe2Rpc3BsYXk6bm9uZX0iOw0KKyAgICByZXR1cm4gSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbUJ1ZmZlcihDRlhfV2lkZVN0cmluZygpLCBzX3BTdHlsZSwgRlhTWVNfd2NzbGVuKHNfcFN0eWxlKSwgRlhfQ09ERVBBR0VfVVRGOCk7DQorfQ0KK0lGREVfQ1NTU3R5bGVTaGVldCogSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbVN0cmVhbShjb25zdCBDRlhfV2lkZVN0cmluZyAmc3pVcmwsIElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd01lZGlhTGlzdCApDQorew0KKyAgICBDRkRFX0NTU1N0eWxlU2hlZXQgKnBTdHlsZVNoZWV0ID0gRkRFX05ldyBDRkRFX0NTU1N0eWxlU2hlZXQoZHdNZWRpYUxpc3QpOw0KKyAgICBpZiAocFN0eWxlU2hlZXQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKCFwU3R5bGVTaGVldC0+TG9hZEZyb21TdHJlYW0oc3pVcmwsIHBTdHJlYW0sIHdDb2RlUGFnZSkpIHsNCisgICAgICAgIHBTdHlsZVNoZWV0LT5SZWxlYXNlKCk7DQorICAgICAgICBwU3R5bGVTaGVldCA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBTdHlsZVNoZWV0Ow0KK30NCitJRkRFX0NTU1N0eWxlU2hlZXQqCUlGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN6VXJsLCBGWF9MUENXU1RSIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZTaXplLCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdNZWRpYUxpc3QgKQ0KK3sNCisgICAgQ0ZERV9DU1NTdHlsZVNoZWV0ICpwU3R5bGVTaGVldCA9IEZERV9OZXcgQ0ZERV9DU1NTdHlsZVNoZWV0KGR3TWVkaWFMaXN0KTsNCisgICAgaWYgKHBTdHlsZVNoZWV0ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmICghcFN0eWxlU2hlZXQtPkxvYWRGcm9tQnVmZmVyKHN6VXJsLCBwQnVmZmVyLCBpQnVmU2l6ZSwgd0NvZGVQYWdlKSkgew0KKyAgICAgICAgcFN0eWxlU2hlZXQtPlJlbGVhc2UoKTsNCisgICAgICAgIHBTdHlsZVNoZWV0ID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcFN0eWxlU2hlZXQ7DQorfQ0KK0NGREVfQ1NTU3R5bGVTaGVldDo6Q0ZERV9DU1NTdHlsZVNoZWV0KEZYX0RXT1JEIGR3TWVkaWFMaXN0KQ0KKyAgICA6IG1fd0NvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpDQorICAgICwgbV93UmVmQ291bnQoMSkNCisgICAgLCBtX2R3TWVkaWFMaXN0KGR3TWVkaWFMaXN0KQ0KKyAgICAsIG1fcEFsbG9jYXRvcihOVUxMKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fZHdNZWRpYUxpc3QgPiAwKTsNCit9DQorQ0ZERV9DU1NTdHlsZVNoZWV0Ojp+Q0ZERV9DU1NTdHlsZVNoZWV0KCkNCit7DQorICAgIFJlc2V0KCk7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNoZWV0OjpSZXNldCgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSBtX1J1bGVBcnJheS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KKyAgICAgICAgSUZERV9DU1NSdWxlICpwUnVsZSA9IG1fUnVsZUFycmF5LkdldEF0KGkpOw0KKyAgICAgICAgc3dpdGNoIChwUnVsZS0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgICAgY2FzZSAgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOg0KKyAgICAgICAgICAgICAgICAoKENGREVfQ1NTU3R5bGVSdWxlKilwUnVsZSktPn5DRkRFX0NTU1N0eWxlUnVsZSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9NZWRpYToNCisgICAgICAgICAgICAgICAgKChDRkRFX0NTU01lZGlhUnVsZSopcFJ1bGUpLT5+Q0ZERV9DU1NNZWRpYVJ1bGUoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfRm9udEZhY2U6DQorICAgICAgICAgICAgICAgICgoQ0ZERV9DU1NGb250RmFjZVJ1bGUqKXBSdWxlKS0+fkNGREVfQ1NTRm9udEZhY2VSdWxlKCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fUnVsZUFycmF5LlJlbW92ZUFsbCgpOw0KKyAgICBtX1NlbGVjdG9ycy5SZW1vdmVBbGwoKTsNCisgICAgbV9TdHJpbmdDYWNoZS5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fcEFsbG9jYXRvcikgew0KKyAgICAgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BBbGxvY2F0b3IgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0RXT1JEIENGREVfQ1NTU3R5bGVTaGVldDo6QWRkUmVmKCkNCit7DQorICAgIHJldHVybiArK21fd1JlZkNvdW50Ow0KK30NCitGWF9EV09SRCBDRkRFX0NTU1N0eWxlU2hlZXQ6OlJlbGVhc2UoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdSZWZDb3VudCA9IC0tbV93UmVmQ291bnQ7DQorICAgIGlmIChkd1JlZkNvdW50ID09IDApIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdSZWZDb3VudDsNCit9DQorRlhfSU5UMzIgQ0ZERV9DU1NTdHlsZVNoZWV0OjpDb3VudFJ1bGVzKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX1J1bGVBcnJheS5HZXRTaXplKCk7DQorfQ0KK0lGREVfQ1NTUnVsZSogQ0ZERV9DU1NTdHlsZVNoZWV0OjpHZXRSdWxlKEZYX0lOVDMyIGluZGV4KQ0KK3sNCisgICAgcmV0dXJuIG1fUnVsZUFycmF5LkdldEF0KGluZGV4KTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRGcm9tU3RyZWFtKGNvbnN0IENGWF9XaWRlU3RyaW5nICZzelVybCwgSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfV09SRCB3Q29kZVBhZ2UpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFN0cmVhbSAhPSBOVUxMKTsNCisgICAgSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXggPSBJRkRFX0NTU1N5bnRheFBhcnNlcjo6Q3JlYXRlKCk7DQorICAgIGlmIChwU3ludGF4ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocFN0cmVhbS0+R2V0Q29kZVBhZ2UoKSAhPSB3Q29kZVBhZ2UpIHsNCisgICAgICAgIHBTdHJlYW0tPlNldENvZGVQYWdlKHdDb2RlUGFnZSk7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gcFN5bnRheC0+SW5pdChwU3RyZWFtLCA0MDk2KSAmJiBMb2FkRnJvbVN5bnRheChwU3ludGF4KTsNCisgICAgcFN5bnRheC0+UmVsZWFzZSgpOw0KKyAgICBtX3dDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCisgICAgbV9zelVybCA9IHN6VXJsOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRGcm9tQnVmZmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZzelVybCwgRlhfTFBDV1NUUiBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmU2l6ZSwgRlhfV09SRCB3Q29kZVBhZ2UpDQorew0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZTaXplID4gMCk7DQorICAgIElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgICBpZiAocFN5bnRheCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gcFN5bnRheC0+SW5pdChwQnVmZmVyLCBpQnVmU2l6ZSkgJiYgTG9hZEZyb21TeW50YXgocFN5bnRheCk7DQorICAgIHBTeW50YXgtPlJlbGVhc2UoKTsNCisgICAgbV93Q29kZVBhZ2UgPSB3Q29kZVBhZ2U7DQorICAgIG1fc3pVcmwgPSBzelVybDsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbVN5bnRheChJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCkNCit7DQorICAgIFJlc2V0KCk7DQorICAgIG1fcEFsbG9jYXRvciA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAxMDI0LCAwKTsNCisgICAgaWYgKG1fcEFsbG9jYXRvciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRkRFX0NTU1NZTlRBWFNUQVRVUyBlU3RhdHVzOw0KKyAgICBkbyB7DQorICAgICAgICBzd2l0Y2ggKGVTdGF0dXMgPSBwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlOg0KKyAgICAgICAgICAgICAgICBlU3RhdHVzID0gTG9hZFN0eWxlUnVsZShwU3ludGF4LCBtX1J1bGVBcnJheSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVJ1bGU6DQorICAgICAgICAgICAgICAgIGVTdGF0dXMgPSBMb2FkTWVkaWFSdWxlKHBTeW50YXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRm9udEZhY2VSdWxlOg0KKyAgICAgICAgICAgICAgICBlU3RhdHVzID0gTG9hZEZvbnRGYWNlUnVsZShwU3ludGF4LCBtX1J1bGVBcnJheSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19JbXBvcnRSdWxlOg0KKyAgICAgICAgICAgICAgICBlU3RhdHVzID0gTG9hZEltcG9ydFJ1bGUocFN5bnRheCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19QYWdlUnVsZToNCisgICAgICAgICAgICAgICAgZVN0YXR1cyA9IExvYWRQYWdlUnVsZShwU3ludGF4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGVTdGF0dXMgPj0gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lKTsNCisgICAgbV9TZWxlY3RvcnMuUmVtb3ZlQWxsKCk7DQorICAgIG1fU3RyaW5nQ2FjaGUuUmVtb3ZlQWxsKCk7DQorICAgIHJldHVybiBlU3RhdHVzICE9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkTWVkaWFSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KQ0KK3sNCisgICAgRlhfRFdPUkQgZHdNZWRpYUxpc3QgPSAwOw0KKyAgICBDRkRFX0NTU01lZGlhUnVsZSAqcE1lZGlhUnVsZSA9IE5VTEw7DQorICAgIGZvciAoOzspIHsNCisgICAgICAgIHN3aXRjaCAocFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxlbjsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQ1dTVFIgcHN6ID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NNRURJQVRZUEVUQUJMRSBwTWVkaWFUeXBlID0gRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShwc3osIGlMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBNZWRpYVR5cGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGR3TWVkaWFMaXN0IHw9IHBNZWRpYVR5cGUtPndWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlOg0KKyAgICAgICAgICAgICAgICBpZiAocE1lZGlhUnVsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBTa2lwUnVsZVNldChwU3ludGF4KTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhTVEFUVVMgZVN0YXR1cyA9IExvYWRTdHlsZVJ1bGUocFN5bnRheCwgcE1lZGlhUnVsZS0+R2V0QXJyYXkoKSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZVN0YXR1cyA8IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjoNCisgICAgICAgICAgICAgICAgaWYgKChkd01lZGlhTGlzdCAmIG1fZHdNZWRpYUxpc3QpID4gMCAmJiBwTWVkaWFSdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHBNZWRpYVJ1bGUgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpIENGREVfQ1NTTWVkaWFSdWxlKGR3TWVkaWFMaXN0KTsNCisgICAgICAgICAgICAgICAgICAgIG1fUnVsZUFycmF5LkFkZChwTWVkaWFSdWxlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZFN0eWxlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCwgQ0ZERV9DU1NSdWxlQXJyYXkgJnJ1bGVBcnJheSkNCit7DQorICAgIG1fU2VsZWN0b3JzLlJlbW92ZUF0KDAsIG1fU2VsZWN0b3JzLkdldFNpemUoKSk7DQorICAgIENGREVfQ1NTU3R5bGVSdWxlICpwU3R5bGVSdWxlID0gTlVMTDsNCisgICAgRlhfTFBDV1NUUiBwc3pWYWx1ZSA9IE5VTEw7DQorICAgIEZYX0lOVDMyIGlWYWx1ZUxlbiA9IDA7DQorICAgIEZERV9DU1NQUk9QRVJUWUFSR1MgcHJvcGVydHlBcmdzOw0KKyAgICBwcm9wZXJ0eUFyZ3MucFN0YXRpY1N0b3JlID0gbV9wQWxsb2NhdG9yOw0KKyAgICBwcm9wZXJ0eUFyZ3MucFN0cmluZ0NhY2hlID0gJm1fU3RyaW5nQ2FjaGU7DQorICAgIHByb3BlcnR5QXJncy5wUHJvcGVydHkgPSBOVUxMOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgIGZvciAoOzspIHsNCisgICAgICAgIHN3aXRjaCAocFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOiB7DQorICAgICAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU2VsZWN0b3IgKnBTZWxlY3RvciA9IENGREVfQ1NTU2VsZWN0b3I6OkZyb21TdHJpbmcobV9wQWxsb2NhdG9yLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwU2VsZWN0b3IgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU2VsZWN0b3JzLkFkZChwU2VsZWN0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU6DQorICAgICAgICAgICAgICAgIHBzelZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlBcmdzLnBQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICB3c05hbWUgPSBDRlhfV2lkZVN0cmluZ0MocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU6DQorICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHBzelZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGVSdWxlLT5HZXREZWNsSW1wKCkuQWRkUHJvcGVydHkoJnByb3BlcnR5QXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVZhbHVlTGVuID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdHlsZVJ1bGUtPkdldERlY2xJbXAoKS5BZGRQcm9wZXJ0eSgmcHJvcGVydHlBcmdzLCB3c05hbWUsIHdzTmFtZS5HZXRMZW5ndGgoKSwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOg0KKyAgICAgICAgICAgICAgICBpZiAocFN0eWxlUnVsZSA9PSBOVUxMICYmIG1fU2VsZWN0b3JzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHBTdHlsZVJ1bGUgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpIENGREVfQ1NTU3R5bGVSdWxlOw0KKyAgICAgICAgICAgICAgICAgICAgcFN0eWxlUnVsZS0+U2V0U2VsZWN0b3IobV9wQWxsb2NhdG9yLCBtX1NlbGVjdG9ycyk7DQorICAgICAgICAgICAgICAgICAgICBydWxlQXJyYXkuQWRkKHBTdHlsZVJ1bGUpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgU2tpcFJ1bGVTZXQocFN5bnRheCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U6DQorICAgICAgICAgICAgICAgIGlmIChwU3R5bGVSdWxlICE9IE5VTEwgJiYgcFN0eWxlUnVsZS0+R2V0RGVjbEltcCgpLkdldFN0YXJ0UG9zaXRpb24oKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwU3R5bGVSdWxlLT5+Q0ZERV9DU1NTdHlsZVJ1bGUoKTsNCisgICAgICAgICAgICAgICAgICAgIHJ1bGVBcnJheS5SZW1vdmVMYXN0KDEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorICAgICAgICAgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRm9udEZhY2VSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4LCBDRkRFX0NTU1J1bGVBcnJheSAmcnVsZUFycmF5KQ0KK3sNCisgICAgQ0ZERV9DU1NGb250RmFjZVJ1bGUgKnBGb250RmFjZVJ1bGUgPSBOVUxMOw0KKyAgICBGWF9MUENXU1RSIHBzelZhbHVlID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaVZhbHVlTGVuID0gMDsNCisgICAgRkRFX0NTU1BST1BFUlRZQVJHUyBwcm9wZXJ0eUFyZ3M7DQorICAgIHByb3BlcnR5QXJncy5wU3RhdGljU3RvcmUgPSBtX3BBbGxvY2F0b3I7DQorICAgIHByb3BlcnR5QXJncy5wU3RyaW5nQ2FjaGUgPSAmbV9TdHJpbmdDYWNoZTsNCisgICAgcHJvcGVydHlBcmdzLnBQcm9wZXJ0eSA9IE5VTEw7DQorICAgIGZvciAoOzspIHsNCisgICAgICAgIHN3aXRjaCAocFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZToNCisgICAgICAgICAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgIHByb3BlcnR5QXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOg0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlBcmdzLnBQcm9wZXJ0eSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpVmFsdWVMZW4gPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnRGYWNlUnVsZS0+R2V0RGVjbEltcCgpLkFkZFByb3BlcnR5KCZwcm9wZXJ0eUFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjoNCisgICAgICAgICAgICAgICAgaWYgKHBGb250RmFjZVJ1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEZvbnRGYWNlUnVsZSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcikgQ0ZERV9DU1NGb250RmFjZVJ1bGU7DQorICAgICAgICAgICAgICAgICAgICBydWxlQXJyYXkuQWRkKHBGb250RmFjZVJ1bGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U6DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorICAgICAgICAgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkSW1wb3J0UnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCkNCit7DQorICAgIGZvciAoOzspIHsNCisgICAgICAgIHN3aXRjaCAocFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydENsb3NlOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19VUkk6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZFBhZ2VSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KQ0KK3sNCisgICAgcmV0dXJuIFNraXBSdWxlU2V0KHBTeW50YXgpOw0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6U2tpcFJ1bGVTZXQoSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXgpDQorew0KKyAgICBmb3IgKDs7KSB7DQorICAgICAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3RvcjoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbE9wZW46DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZToNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZToNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgICAgICAgICAgICAgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlUnVsZTo6U2V0U2VsZWN0b3IoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBjb25zdCBDRkRFX0NTU1NlbGVjdG9yQXJyYXkgJmxpc3QpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wcFNlbGVjdG9yID09IE5VTEwpOw0KKyAgICBtX2lTZWxlY3RvcnMgPSBsaXN0LkdldFNpemUoKTsNCisgICAgbV9wcFNlbGVjdG9yID0gKElGREVfQ1NTU2VsZWN0b3IqKilwU3RhdGljU3RvcmUtPkFsbG9jKG1faVNlbGVjdG9ycyAqIHNpemVvZihJRkRFX0NTU1NlbGVjdG9yKikpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9pU2VsZWN0b3JzOyArK2kpIHsNCisgICAgICAgIG1fcHBTZWxlY3RvcltpXSA9IGxpc3QuR2V0QXQoaSk7DQorICAgIH0NCit9DQorQ0ZERV9DU1NNZWRpYVJ1bGU6On5DRkRFX0NTU01lZGlhUnVsZSgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSBtX1J1bGVBcnJheS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KKyAgICAgICAgSUZERV9DU1NSdWxlICpwUnVsZSA9IG1fUnVsZUFycmF5LkdldEF0KGkpOw0KKyAgICAgICAgc3dpdGNoIChwUnVsZS0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgICAgY2FzZSAgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOg0KKyAgICAgICAgICAgICAgICAoKENGREVfQ1NTU3R5bGVSdWxlKilwUnVsZSktPn5DRkRFX0NTU1N0eWxlUnVsZSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitpbmxpbmUgRlhfQk9PTCBGREVfSXNDU1NDaGFyKEZYX1dDSEFSIHdjaCkNCit7DQorICAgIHJldHVybiAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKSB8fCAod2NoID49ICdBJyAmJiB3Y2ggPD0gJ1onKTsNCit9DQorRlhfSU5UMzIgRkRFX0dldENTU1BlcnN1ZG9MZW4oRlhfTFBDV1NUUiBwc3osIEZYX0xQQ1dTVFIgcEVuZCkNCit7DQorICAgIEZYU1lTX2Fzc2VydCgqcHN6ID09ICc6Jyk7DQorICAgIEZYX0xQQ1dTVFIgcFN0YXJ0ID0gcHN6Ow0KKyAgICB3aGlsZSAocHN6IDwgcEVuZCkgew0KKyAgICAgICAgRlhfV0NIQVIgd2NoID0gKnBzejsNCisgICAgICAgIGlmIChGREVfSXNDU1NDaGFyKHdjaCkgfHwgd2NoID09ICc6Jykgew0KKyAgICAgICAgICAgICsrcHN6Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcHN6IC0gcFN0YXJ0Ow0KK30NCitGWF9JTlQzMiBGREVfR2V0Q1NTTmFtZUxlbihGWF9MUENXU1RSIHBzeiwgRlhfTFBDV1NUUiBwRW5kKQ0KK3sNCisgICAgRlhfTFBDV1NUUiBwU3RhcnQgPSBwc3o7DQorICAgIHdoaWxlIChwc3ogPCBwRW5kKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Y2ggPSAqcHN6Ow0KKyAgICAgICAgaWYgKEZERV9Jc0NTU0NoYXIod2NoKQ0KKyAgICAgICAgICAgICAgICB8fCAod2NoID49ICcwJyAmJiB3Y2ggPD0gJzknKQ0KKyAgICAgICAgICAgICAgICB8fCB3Y2ggPT0gJ18nIHx8IHdjaCA9PSAnLScpIHsNCisgICAgICAgICAgICArK3BzejsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBzeiAtIHBTdGFydDsNCit9DQorSUZERV9DU1NTZWxlY3RvciogQ0ZERV9DU1NTZWxlY3Rvcjo6RnJvbVN0cmluZyhJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIEZYX0xQQ1dTVFIgcHN6LCBGWF9JTlQzMiBpTGVuKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBTdGF0aWNTdG9yZSAhPSBOVUxMICYmIHBzeiAhPSBOVUxMICYmIGlMZW4gPiAwKTsNCisgICAgRlhfTFBDV1NUUiBwU3RhcnQgPSBwc3o7DQorICAgIEZYX0xQQ1dTVFIgcEVuZCA9IHBzeiArIGlMZW47DQorICAgIGZvciAoOyBwc3ogPCBwRW5kOyArK3Bzeikgew0KKyAgICAgICAgc3dpdGNoICgqcHN6KSB7DQorICAgICAgICAgICAgY2FzZSAnPic6DQorICAgICAgICAgICAgY2FzZSAnWyc6DQorICAgICAgICAgICAgY2FzZSAnKyc6DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGREVfQ1NTU2VsZWN0b3IgKnBGaXJzdCA9IE5VTEwsICpwTGFzdCA9IE5VTEw7DQorICAgIENGREVfQ1NTU2VsZWN0b3IgKnBQZXJzdWRvRmlyc3QgPSBOVUxMLCAqcFBlcnN1ZG9MYXN0ID0gTlVMTDsNCisgICAgZm9yIChwc3ogPSBwU3RhcnQgOyBwc3ogPCBwRW5kOyApIHsNCisgICAgICAgIEZYX1dDSEFSIHdjaCA9ICpwc3o7DQorICAgICAgICBpZiAod2NoID09ICcuJyB8fCB3Y2ggPT0gJyMnKSB7DQorICAgICAgICAgICAgaWYgKHBzeiA9PSBwU3RhcnQgfHwgcHN6Wy0xXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvciAqcCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQsIChGWF9MUENXU1RSKUwiKiIsIDEsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocEZpcnN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHBGaXJzdC0+U2V0VHlwZShGREVfQ1NTU0VMRUNUT1JUWVBFX0Rlc2NlbmRhbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgcC0+U2V0TmV4dChwRmlyc3QpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBGaXJzdCA9IHBMYXN0ID0gcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBMYXN0ICE9IE5VTEwpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlOYW1lTGVuID0gRkRFX0dldENTU05hbWVMZW4oKytwc3osIHBFbmQpOw0KKyAgICAgICAgICAgIGlmIChpTmFtZUxlbiA9PSAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlID0gd2NoID09ICcuJyA/IEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3MgOiBGREVfQ1NTU0VMRUNUT1JUWVBFX0lEOw0KKyAgICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3IgKnAgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTU2VsZWN0b3IoZVR5cGUsIHBzeiwgaU5hbWVMZW4sIEZBTFNFKTsNCisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwLT5TZXROZXh0KHBMYXN0LT5HZXROZXh0U2VsZWN0b3IoKSk7DQorICAgICAgICAgICAgcExhc3QtPlNldE5leHQocCk7DQorICAgICAgICAgICAgcExhc3QgPSBwOw0KKyAgICAgICAgICAgIHBzeiArPSBpTmFtZUxlbjsNCisgICAgICAgIH0gZWxzZSBpZiAoRkRFX0lzQ1NTQ2hhcih3Y2gpIHx8IHdjaCA9PSAnKicpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTmFtZUxlbiA9IHdjaCA9PSAnKicgPyAxIDogRkRFX0dldENTU05hbWVMZW4ocHN6LCBwRW5kKTsNCisgICAgICAgICAgICBpZiAoaU5hbWVMZW4gPT0gMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvciAqcCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQsIHBzeiwgaU5hbWVMZW4sIFRSVUUpOw0KKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwRmlyc3QgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwRmlyc3QgPSBwTGFzdCA9IHA7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQorICAgICAgICAgICAgICAgIHAtPlNldE5leHQocEZpcnN0KTsNCisgICAgICAgICAgICAgICAgcEZpcnN0ID0gcExhc3QgPSBwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwc3ogKz0gaU5hbWVMZW47DQorICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSAnOicpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTmFtZUxlbiA9IEZERV9HZXRDU1NQZXJzdWRvTGVuKHBzeiwgcEVuZCk7DQorICAgICAgICAgICAgaWYgKGlOYW1lTGVuID09IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3IgKnAgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTU2VsZWN0b3IoRkRFX0NTU1NFTEVDVE9SVFlQRV9QZXJzdWRvLCBwc3osIGlOYW1lTGVuLCBUUlVFKTsNCisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocFBlcnN1ZG9GaXJzdCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBQZXJzdWRvRmlyc3QgPSBwUGVyc3Vkb0xhc3QgPSBwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBQZXJzdWRvTGFzdC0+U2V0TmV4dChwKTsNCisgICAgICAgICAgICAgICAgcFBlcnN1ZG9MYXN0ID0gcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcHN6ICs9IGlOYW1lTGVuOw0KKyAgICAgICAgfSBlbHNlIGlmICh3Y2ggPT0gJyAnKSB7DQorICAgICAgICAgICAgcHN6Kys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwUGVyc3Vkb0ZpcnN0ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBwRmlyc3Q7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwUGVyc3Vkb0xhc3QtPlNldE5leHQocEZpcnN0KTsNCisgICAgICAgIHJldHVybiBwUGVyc3Vkb0ZpcnN0Ow0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDI1MWEwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5oCkBAIC0wLDAgKzEsMTYzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9DU1NTVFlMRVNIRUVUDQorI2RlZmluZSBfRkRFX0NTU1NUWUxFU0hFRVQNCisjaW5jbHVkZSAiZmRlX2Nzc2RlY2xhcmF0aW9uLmgiDQorY2xhc3MgQ0ZERV9DU1NTZWxlY3RvciA6IHB1YmxpYyBJRkRFX0NTU1NlbGVjdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTU2VsZWN0b3IoRkRFX0NTU1NFTEVDVE9SVFlQRSBlVHlwZSwgRlhfTFBDV1NUUiBwc3osIEZYX0lOVDMyIGlMZW4sIEZYX0JPT0wgYklnbm9yZUNhc2UpDQorICAgICAgICA6IG1fZVR5cGUoZVR5cGUpLCBtX2R3SGFzaChGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3osIGlMZW4sIGJJZ25vcmVDYXNlKSksIG1fcE5leHQoTlVMTCkNCisgICAgew0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX0NTU1NFTEVDVE9SVFlQRQkJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2VUeXBlOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJR2V0TmFtZUhhc2goKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd0hhc2g7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKgkJR2V0TmV4dFNlbGVjdG9yKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcE5leHQ7DQorICAgIH0NCisgICAgc3RhdGljIElGREVfQ1NTU2VsZWN0b3IqCQlGcm9tU3RyaW5nKElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgRlhfTFBDV1NUUiBwc3osIEZYX0lOVDMyIGlMZW4pOw0KKyAgICB2b2lkCQkJCQkJCVNldE5leHQoSUZERV9DU1NTZWxlY3RvciAqcE5leHQpDQorICAgIHsNCisgICAgICAgIG1fcE5leHQgPSBwTmV4dDsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgc3RhdGljIENGREVfQ1NTU2VsZWN0b3IqCQlQYXJzZVNlbGVjdG9yKElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgRlhfTFBDV1NUUiBwc3osIEZYX0lOVDMyICZpT2ZmLCBGWF9JTlQzMiBpTGVuLCBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlKTsNCisgICAgdm9pZAkJCQkJCQlTZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEUgZVR5cGUpDQorICAgIHsNCisgICAgICAgIG1fZVR5cGUgPSAgZVR5cGU7DQorICAgIH0NCisgICAgRkRFX0NTU1NFTEVDVE9SVFlQRQkJCQltX2VUeXBlOw0KKyAgICBGWF9EV09SRAkJCQkJCW1fZHdIYXNoOw0KKyAgICBJRkRFX0NTU1NlbGVjdG9yCQkJCSptX3BOZXh0Ow0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1NlbGVjdG9yKj4gQ0ZERV9DU1NTZWxlY3RvckFycmF5Ow0KK2NsYXNzIENGREVfQ1NTU3R5bGVSdWxlIDogcHVibGljIElGREVfQ1NTU3R5bGVSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQ1NTU3R5bGVSdWxlKCkgOiBtX3BwU2VsZWN0b3IoTlVMTCksIG1faVNlbGVjdG9ycygwKSB7IH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudFNlbGVjdG9yTGlzdHMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pU2VsZWN0b3JzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9DU1NTZWxlY3RvcioJCUdldFNlbGVjdG9yTGlzdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcHBTZWxlY3RvcltpbmRleF07DQorICAgIH0NCisNCisgICAgdmlydHVhbCBJRkRFX0NTU0RlY2xhcmF0aW9uKglHZXREZWNsYXJhdGlvbigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoSUZERV9DU1NEZWNsYXJhdGlvbiopJm1fRGVjbGFyYXRpb247DQorICAgIH0NCisgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbiYJCQlHZXREZWNsSW1wKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fRGVjbGFyYXRpb247DQorICAgIH0NCisgICAgdm9pZAkJCQkJCQlTZXRTZWxlY3RvcihJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IENGREVfQ1NTU2VsZWN0b3JBcnJheSAmbGlzdCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRkRFX0NTU0RlY2xhcmF0aW9uCQkJCW1fRGVjbGFyYXRpb247DQorICAgIElGREVfQ1NTU2VsZWN0b3IJCQkJKiptX3BwU2VsZWN0b3I7DQorICAgIEZYX0lOVDMyCQkJCQkJbV9pU2VsZWN0b3JzOw0KK307DQorY2xhc3MgQ0ZERV9DU1NNZWRpYVJ1bGUgOiBwdWJsaWMgSUZERV9DU1NNZWRpYVJ1bGUsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9DU1NNZWRpYVJ1bGUoRlhfRFdPUkQgZHdNZWRpYUxpc3QpIDogbV9kd01lZGlhTGlzdChkd01lZGlhTGlzdCkgeyB9DQorICAgIH5DRkRFX0NTU01lZGlhUnVsZSgpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCUdldE1lZGlhTGlzdCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2R3TWVkaWFMaXN0Ow0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRSdWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX1J1bGVBcnJheS5HZXRTaXplKCk7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0NTU1J1bGUqCQkJR2V0UnVsZShGWF9JTlQzMiBpbmRleCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fUnVsZUFycmF5LkdldEF0KGluZGV4KTsNCisgICAgfQ0KKyAgICBDRkRFX0NTU1J1bGVBcnJheSYJCQkJR2V0QXJyYXkoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9SdWxlQXJyYXk7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIEZYX0RXT1JECQkJCQkJbV9kd01lZGlhTGlzdDsNCisgICAgQ0ZERV9DU1NSdWxlQXJyYXkJCQkJbV9SdWxlQXJyYXk7DQorfTsNCitjbGFzcyBDRkRFX0NTU0ZvbnRGYWNlUnVsZSA6IHB1YmxpYyBJRkRFX0NTU0ZvbnRGYWNlUnVsZSwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIElGREVfQ1NTRGVjbGFyYXRpb24qCUdldERlY2xhcmF0aW9uKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChJRkRFX0NTU0RlY2xhcmF0aW9uKikmbV9EZWNsYXJhdGlvbjsNCisgICAgfQ0KKyAgICBDRkRFX0NTU0RlY2xhcmF0aW9uJgkJCUdldERlY2xJbXAoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9EZWNsYXJhdGlvbjsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbgkJCQltX0RlY2xhcmF0aW9uOw0KK307DQorI2RlZmluZSBGREVfQ1NTU1dJVENIREVGQVVMVFMoKQkJY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0VPUzogXA0KKyAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19FT1M7IFwNCisgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOiBcDQorICAgIGRlZmF1bHQ6IFwNCisgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorY2xhc3MgQ0ZERV9DU1NTdHlsZVNoZWV0IDogcHVibGljIElGREVfQ1NTU3R5bGVTaGVldCwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX0NTU1N0eWxlU2hlZXQoRlhfRFdPUkQgZHdNZWRpYUxpc3QpOw0KKyAgICB+Q0ZERV9DU1NTdHlsZVNoZWV0KCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJQWRkUmVmKCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJUmVsZWFzZSgpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldFVybChDRlhfV2lkZVN0cmluZyAmc3pVcmwpDQorICAgIHsNCisgICAgICAgIHN6VXJsID0gbV9zelVybDsNCisgICAgICAgIHJldHVybiBzelVybC5HZXRMZW5ndGgoKSA+IDA7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRNZWRpYUxpc3QoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd01lZGlhTGlzdDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJCUdldENvZGVQYWdlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fd0NvZGVQYWdlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRSdWxlcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIElGREVfQ1NTUnVsZSoJCQlHZXRSdWxlKEZYX0lOVDMyIGluZGV4KTsNCisgICAgRlhfQk9PTAkJCQkJCQlMb2FkRnJvbVN0cmVhbShjb25zdCBDRlhfV2lkZVN0cmluZyAmc3pVcmwsIElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgICAgRlhfQk9PTAkJCQkJCQlMb2FkRnJvbUJ1ZmZlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmc3pVcmwsIEZYX0xQQ1dTVFIgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZlNpemUsIEZYX1dPUkQgd0NvZGVQYWdlKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJCQkJUmVzZXQoKTsNCisgICAgRlhfQk9PTAkJCQkJCQlMb2FkRnJvbVN5bnRheChJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCk7DQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVMJCQkJTG9hZFN0eWxlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCwgQ0ZERV9DU1NSdWxlQXJyYXkgJnJ1bGVBcnJheSk7DQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVMJCQkJTG9hZEltcG9ydFJ1bGUoSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXgpOw0KKyAgICBGREVfQ1NTU1lOVEFYU1RBVFVTCQkJCUxvYWRQYWdlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCk7DQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVMJCQkJTG9hZE1lZGlhUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCk7DQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVMJCQkJTG9hZEZvbnRGYWNlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCwgQ0ZERV9DU1NSdWxlQXJyYXkgJnJ1bGVBcnJheSk7DQorICAgIEZERV9DU1NTWU5UQVhTVEFUVVMJCQkJU2tpcFJ1bGVTZXQoSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXgpOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fd0NvZGVQYWdlOw0KKyAgICBGWF9XT1JECQkJCQkJCW1fd1JlZkNvdW50Ow0KKyAgICBGWF9EV09SRAkJCQkJCW1fZHdNZWRpYUxpc3Q7DQorICAgIElGWF9NRU1BbGxvY2F0b3IJCQkJKm1fcEFsbG9jYXRvcjsNCisgICAgQ0ZERV9DU1NSdWxlQXJyYXkJCQkJbV9SdWxlQXJyYXk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJCQltX3N6VXJsOw0KKyAgICBDRkRFX0NTU1NlbGVjdG9yQXJyYXkJCQltX1NlbGVjdG9yczsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJCQltX1N0cmluZ0NhY2hlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3ludGF4LmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlNWRhOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5jcHAKQEAgLTAsMCArMSw0OTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NzeW50YXguaCINCisjaW5jbHVkZSAiZmRlX2Nzc2RhdGF0YWJsZS5oIg0KKyNpZmRlZiBfY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorICAgIGlubGluZSBGWF9CT09MIEZERV9Jc1NlbGVjdG9yU3RhcnQoRlhfV0NIQVIgd2NoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gd2NoID09ICcuJyB8fCB3Y2ggPT0gJyMnIHx8IHdjaCA9PSAnKicNCisgICAgICAgICAgICAgICB8fCAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKQ0KKyAgICAgICAgICAgICAgIHx8ICh3Y2ggPj0gJ0EnICYmIHdjaCA8PSAnWicpOw0KKyAgICB9DQorI2lmZGVmIF9jcGx1c3BsdXMNCit9Ow0KKyNlbmRpZg0KK0lGREVfQ1NTU3ludGF4UGFyc2VyKiBJRkRFX0NTU1N5bnRheFBhcnNlcjo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGREVfTmV3IENGREVfQ1NTU3ludGF4UGFyc2VyOw0KK30NCitDRkRFX0NTU1N5bnRheFBhcnNlcjo6Q0ZERV9DU1NTeW50YXhQYXJzZXIoKQ0KKyAgICA6IG1fcFN0cmVhbShOVUxMKQ0KKyAgICAsIG1faVN0cmVhbVBvcygwKQ0KKyAgICAsIG1faVBsYW5lU2l6ZSgwKQ0KKyAgICAsIG1faVRleHREYXRMZW4oMCkNCisgICAgLCBtX2R3Q2hlY2soKEZYX0RXT1JEKSAtIDEpDQorICAgICwgbV9lTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KQ0KKyAgICAsIG1fZVN0YXR1cyhGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUpDQorew0KK30NCitDRkRFX0NTU1N5bnRheFBhcnNlcjo6fkNGREVfQ1NTU3ludGF4UGFyc2VyKCkNCit7DQorICAgIG1fVGV4dERhdGEuUmVzZXQoKTsNCisgICAgbV9UZXh0UGxhbmUuUmVzZXQoKTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SW5pdChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9JTlQzMiBpQ1NTUGxhbmVTaXplLCBGWF9JTlQzMiBpVGV4dERhdGFTaXplICwgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uICkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwU3RyZWFtICE9IE5VTEwgJiYgaUNTU1BsYW5lU2l6ZSA+IDAgJiYgaVRleHREYXRhU2l6ZSA+IDApOw0KKyAgICBSZXNldChiT25seURlY2xhcmF0aW9uKTsNCisgICAgaWYgKCFtX1RleHREYXRhLkVzdGltYXRlU2l6ZShpVGV4dERhdGFTaXplKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JZVEUgYm9tWzRdOw0KKyAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KKyAgICBtX2lTdHJlYW1Qb3MgPSBtX3BTdHJlYW0tPkdldEJPTShib20pOw0KKyAgICBtX2lQbGFuZVNpemUgPSBpQ1NTUGxhbmVTaXplOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SW5pdChGWF9MUENXU1RSIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplLCBGWF9JTlQzMiBpVGV4dERhdFNpemUgLCBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDAgJiYgaVRleHREYXRTaXplID4gMCk7DQorICAgIFJlc2V0KGJPbmx5RGVjbGFyYXRpb24pOw0KKyAgICBpZiAoIW1fVGV4dERhdGEuRXN0aW1hdGVTaXplKGlUZXh0RGF0U2l6ZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9UZXh0UGxhbmUuQXR0YWNoQnVmZmVyKHBCdWZmZXIsIGlCdWZmZXJTaXplKTsNCit9DQordm9pZCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6UmVzZXQoRlhfQk9PTCBiT25seURlY2xhcmF0aW9uKQ0KK3sNCisgICAgbV9UZXh0UGxhbmUuUmVzZXQoKTsNCisgICAgbV9UZXh0RGF0YS5SZXNldCgpOw0KKyAgICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgICBtX2lTdHJlYW1Qb3MgPSAwOw0KKyAgICBtX2lUZXh0RGF0TGVuID0gMDsNCisgICAgbV9kd0NoZWNrID0gKEZYX0RXT1JEKSAtIDE7DQorICAgIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgbV9lTW9kZSA9IGJPbmx5RGVjbGFyYXRpb24gPyBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eU5hbWUgOiBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Ow0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkNCit7DQorICAgIHdoaWxlIChtX2VTdGF0dXMgPj0gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lKSB7DQorICAgICAgICBpZiAobV9UZXh0UGxhbmUuSXNFT0YoKSkgew0KKyAgICAgICAgICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBpZiAobV9lTW9kZSA9PSBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eVZhbHVlICYmIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9CT09MIGJFT1M7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbiA9IG1fVGV4dFBsYW5lLkxvYWRGcm9tU3RyZWFtKG1fcFN0cmVhbSwgbV9pU3RyZWFtUG9zLCBtX2lQbGFuZVNpemUsIGJFT1MpOw0KKyAgICAgICAgICAgIG1faVN0cmVhbVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICAgICAgICBpZiAoaUxlbiA8IDEpIHsNCisgICAgICAgICAgICAgICAgaWYgKG1fZU1vZGUgPT0gRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZSAmJiBtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgU2F2ZVRleHREYXRhKCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0VPUzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9XQ0hBUiB3Y2g7DQorICAgICAgICB3aGlsZSAoIW1fVGV4dFBsYW5lLklzRU9GKCkpIHsNCisgICAgICAgICAgICB3Y2ggPSBtX1RleHRQbGFuZS5HZXRDaGFyKCk7DQorICAgICAgICAgICAgc3dpdGNoIChtX2VNb2RlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldDoNCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfQXRSdWxlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXN0b3JlTW9kZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01vZGVTdGFjay5QdXNoKG1fZU1vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Db21tZW50KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjaCA8PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRkRFX0lzU2VsZWN0b3JTdGFydCh3Y2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1N0eWxlUnVsZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3I6DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdjaCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRMZW4gPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3RvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9kZVN0YWNrLlB1c2goRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZENoYXIod2NoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eU5hbWU6DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdjaCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzonOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXN0b3JlTW9kZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZToNCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX0NvbW1lbnQ6DQorICAgICAgICAgICAgICAgICAgICBpZiAod2NoID09ICcvJyAmJiBtX1RleHREYXRhLkdldExlbmd0aCgpID4gMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtX1RleHREYXRhLkdldEF0KG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgLSAxKSA9PSAnKicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN0b3JlTW9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1RleHREYXRhLkFwcGVuZENoYXIod2NoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGU6DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdjaCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lUZXh0RGF0TGVuID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTU1lOVEFYTU9ERSAqcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE1vZGUgPT0gTlVMTCB8fCAqcE1vZGUgIT0gRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFSdWxlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBNb2RlID0gRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzsnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTU1lOVEFYTU9ERSAqcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE1vZGUgPT0gTlVMTCB8fCAqcE1vZGUgIT0gRkRFX0NTU1NZTlRBWE1PREVfSW1wb3J0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNJbXBvcnRFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5hYmxlZCA9IElzSW1wb3J0RW5hYmxlZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkVuYWJsZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZUltcG9ydCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19JbXBvcnRDbG9zZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN3aXRjaFRvQ29tbWVudCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1VSSTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhNT0RFICpwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE1vZGUgPT0gTlVMTCB8fCAqcE1vZGUgIT0gRkRFX0NTU1NZTlRBWE1PREVfSW1wb3J0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2NoIDw9ICcgJyB8fCB3Y2ggPT0gJzsnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlVUklTdGFydCwgaVVSSUxlbmd0aCA9IG1fVGV4dERhdGEuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpVVJJTGVuZ3RoID4gMCAmJiBGREVfUGFyc2VDU1NVUkkobV9UZXh0RGF0YS5HZXRCdWZmZXIoKSwgaVVSSUxlbmd0aCwgaVVSSVN0YXJ0LCBpVVJJTGVuZ3RoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0RGF0YS5TdWJ0cmFjdChpVVJJU3RhcnQsIGlVUklMZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzSW1wb3J0RW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfVVJJOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9BdFJ1bGU6DQorICAgICAgICAgICAgICAgICAgICBpZiAod2NoID4gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGVuID0gbV9UZXh0RGF0YS5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENXU1RSIHBzeiA9IG1fVGV4dERhdGEuR2V0QnVmZmVyKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZYU1lTX3djc25jbXAoTCJjaGFyc2V0IiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfQ2hhcnNldCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwiaW1wb3J0IiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9kZVN0YWNrLlB1c2goRkRFX0NTU1NZTlRBWE1PREVfSW1wb3J0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9VUkkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNJbXBvcnRFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydFJ1bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRlhTWVNfd2NzbmNtcChMIm1lZGlhIiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9kZVN0YWNrLlB1c2goRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFSdWxlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVJ1bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwiZm9udC1mYWNlIiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Gb250RmFjZVJ1bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwicGFnZSIsIHBzeiwgaUxlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUGFnZVJ1bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Vbmtub3duUnVsZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfQ2hhcnNldDoNCisgICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gJzsnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0NoYXJzZXRFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZUNoYXJzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRMZW4gPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wU3RyZWFtICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IEZYX0dldENvZGVQYWdlRm9ybVN0cmluZ1cobV9UZXh0RGF0YS5HZXRCdWZmZXIoKSwgbV9pVGV4dERhdExlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdDb2RlUGFnZSA8IDB4RkZGRiAmJiBtX3BTdHJlYW0tPkdldENvZGVQYWdlKCkgIT0gd0NvZGVQYWdlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+U2V0Q29kZVBhZ2Uod0NvZGVQYWdlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19DaGFyc2V0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9Vbmtub3duUnVsZToNCisgICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gJzsnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1fZVN0YXR1czsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SXNJbXBvcnRFbmFibGVkKCkgY29uc3QNCit7DQorICAgIGlmICgobV9kd0NoZWNrICYgRkRFX0NTU1NZTlRBWENIRUNLX0FsbG93SW1wb3J0KSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fTW9kZVN0YWNrLkdldFNpemUoKSA+IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQoraW5saW5lIEZYX0JPT0wgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKQ0KK3sNCisgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgaWYgKG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwIHx8IHdjaCA+ICcgJykgew0KKyAgICAgICAgbV9UZXh0RGF0YS5BcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK2lubGluZSBGWF9JTlQzMiBDRkRFX0NTU1N5bnRheFBhcnNlcjo6U2F2ZVRleHREYXRhKCkNCit7DQorICAgIG1faVRleHREYXRMZW4gPSBtX1RleHREYXRhLlRyaW1FbmQoKTsNCisgICAgbV9UZXh0RGF0YS5DbGVhcigpOw0KKyAgICByZXR1cm4gbV9pVGV4dERhdExlbjsNCit9DQoraW5saW5lIHZvaWQgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREUgZU1vZGUpDQorew0KKyAgICBtX2VNb2RlID0gZU1vZGU7DQorICAgIFNhdmVUZXh0RGF0YSgpOw0KK30NCitpbmxpbmUgRlhfSU5UMzIgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlN3aXRjaFRvQ29tbWVudCgpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gbV9UZXh0RGF0YS5HZXRMZW5ndGgoKTsNCisgICAgbV9Nb2RlU3RhY2suUHVzaChtX2VNb2RlKTsNCisgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Db21tZW50KTsNCisgICAgcmV0dXJuIGlMZW5ndGg7DQorfQ0KK2lubGluZSBGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpSZXN0b3JlTW9kZSgpDQorew0KKyAgICBGREVfQ1NTU1lOVEFYTU9ERSAqcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgIGlmIChwTW9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgU3dpdGNoTW9kZSgqcE1vZGUpOw0KKyAgICBtX01vZGVTdGFjay5Qb3AoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0xQQ1dTVFIgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkdldEN1cnJlbnRTdHJpbmcoRlhfSU5UMzIgJmlMZW5ndGgpIGNvbnN0DQorew0KKyAgICBpTGVuZ3RoID0gbV9pVGV4dERhdExlbjsNCisgICAgcmV0dXJuIG1fVGV4dERhdGEuR2V0QnVmZmVyKCk7DQorfQ0KK0NGREVfQ1NTVGV4dEJ1Zjo6Q0ZERV9DU1NUZXh0QnVmKCkNCisgICAgOiBtX2JFeHRCdWYoRkFMU0UpDQorICAgICwgbV9wQnVmZmVyKE5VTEwpDQorICAgICwgbV9pQnVmTGVuKDApDQorICAgICwgbV9pRGF0TGVuKDApDQorICAgICwgbV9pRGF0UG9zKDApDQorew0KK30NCitDRkRFX0NTU1RleHRCdWY6On5DRkRFX0NTU1RleHRCdWYoKQ0KK3sNCisgICAgUmVzZXQoKTsNCit9DQordm9pZCBDRkRFX0NTU1RleHRCdWY6OlJlc2V0KCkNCit7DQorICAgIGlmICghbV9iRXh0QnVmICYmIG1fcEJ1ZmZlciAhPSBOVUxMKSB7DQorICAgICAgICBGREVfRnJlZShtX3BCdWZmZXIpOw0KKyAgICAgICAgbV9wQnVmZmVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX2lEYXRQb3MgPSBtX2lEYXRMZW4gPSBtX2lCdWZMZW47DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NUZXh0QnVmOjpBdHRhY2hCdWZmZXIoRlhfTFBDV1NUUiBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmTGVuKQ0KK3sNCisgICAgUmVzZXQoKTsNCisgICAgbV9wQnVmZmVyID0gKEZYX0xQV1NUUilwQnVmZmVyOw0KKyAgICBtX2lEYXRMZW4gPSBtX2lCdWZMZW4gPSBpQnVmTGVuOw0KKyAgICByZXR1cm4gbV9iRXh0QnVmID0gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1RleHRCdWY6OkVzdGltYXRlU2l6ZShGWF9JTlQzMiBpQWxsb2NTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlBbGxvY1NpemUgPiAwKTsNCisgICAgQ2xlYXIoKTsNCisgICAgbV9iRXh0QnVmID0gRkFMU0U7DQorICAgIHJldHVybiBFeHBhbmRCdWYoaUFsbG9jU2l6ZSk7DQorfQ0KK0ZYX0lOVDMyIENGREVfQ1NTVGV4dEJ1Zjo6TG9hZEZyb21TdHJlYW0oSUZYX1N0cmVhbSAqcFR4dFN0cmVhbSwgRlhfSU5UMzIgaVN0cmVhbU9mZnNldCwgRlhfSU5UMzIgaU1heENoYXJzLCBGWF9CT09MICZiRU9TKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlTdHJlYW1PZmZzZXQgPj0gMCAmJiBpTWF4Q2hhcnMgPiAwKTsNCisgICAgQ2xlYXIoKTsNCisgICAgbV9iRXh0QnVmID0gRkFMU0U7DQorICAgIGlmICghRXhwYW5kQnVmKGlNYXhDaGFycykpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHBUeHRTdHJlYW0tPkxvY2soKTsNCisgICAgaWYgKHBUeHRTdHJlYW0tPkdldFBvc2l0aW9uKCkgIT0gaVN0cmVhbU9mZnNldCkgew0KKyAgICAgICAgcFR4dFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBpU3RyZWFtT2Zmc2V0KTsNCisgICAgfQ0KKyAgICBtX2lEYXRMZW4gPSBwVHh0U3RyZWFtLT5SZWFkU3RyaW5nKG1fcEJ1ZmZlciwgaU1heENoYXJzLCBiRU9TKTsNCisgICAgcFR4dFN0cmVhbS0+VW5sb2NrKCk7DQorICAgIHJldHVybiBtX2lEYXRMZW47DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NUZXh0QnVmOjpFeHBhbmRCdWYoRlhfSU5UMzIgaURlc2lyZWRTaXplKQ0KK3sNCisgICAgaWYgKG1fYkV4dEJ1Zikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2UgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgICAgICBtX3BCdWZmZXIgPSAoRlhfTFBXU1RSKUZERV9BbGxvYyhpRGVzaXJlZFNpemUgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgfSBlbHNlIGlmIChtX2lCdWZMZW4gIT0gaURlc2lyZWRTaXplKSB7DQorICAgICAgICBtX3BCdWZmZXIgPSAoRlhfTFBXU1RSKUZERV9SZWFsbG9jKG1fcEJ1ZmZlciwgaURlc2lyZWRTaXplICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsNCisgICAgICAgIG1faUJ1ZkxlbiA9IDA7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2lCdWZMZW4gPSBpRGVzaXJlZFNpemU7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KK30NCit2b2lkIENGREVfQ1NTVGV4dEJ1Zjo6U3VidHJhY3QoRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpTGVuZ3RoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+PSAwICYmIGlMZW5ndGggPiAwKTsNCisgICAgaWYgKGlMZW5ndGggPiBtX2lEYXRMZW4gLSBpU3RhcnQpIHsNCisgICAgICAgIGlMZW5ndGggPSBtX2lEYXRMZW4gLSBpU3RhcnQ7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgICAgICBpTGVuZ3RoID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYU1lTX21lbW1vdmUobV9wQnVmZmVyLCBtX3BCdWZmZXIgKyBpU3RhcnQsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgfQ0KKyAgICBtX2lEYXRMZW4gPSBpTGVuZ3RoOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGUwZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguaApAQCAtMCwwICsxLDEzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfQ1NTU1lOVEFYDQorI2RlZmluZSBfRkRFX0NTU1NZTlRBWA0KK2NsYXNzIENGREVfQ1NTVGV4dEJ1ZiA6IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9DU1NUZXh0QnVmKCk7DQorICAgIH5DRkRFX0NTU1RleHRCdWYoKTsNCisgICAgRlhfQk9PTAkJCQkJCQlBdHRhY2hCdWZmZXIoRlhfTFBDV1NUUiBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmTGVuKTsNCisgICAgRlhfQk9PTAkJCQkJCQlFc3RpbWF0ZVNpemUoRlhfSU5UMzIgaUFsbG9jU2l6ZSk7DQorICAgIEZYX0lOVDMyCQkJCQkJTG9hZEZyb21TdHJlYW0oSUZYX1N0cmVhbSAqcFR4dFN0cmVhbSwgRlhfSU5UMzIgaVN0cmVhbU9mZnNldCwgRlhfSU5UMzIgaU1heENoYXJzLCBGWF9CT09MICZiRU9TKTsNCisgICAgRlhfQk9PTAkJCQkJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkNCisgICAgew0KKyAgICAgICAgaWYgKG1faURhdExlbiA+PSBtX2lCdWZMZW4gJiYgIUV4cGFuZEJ1ZihtX2lCdWZMZW4gKiAyKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAobV9wQnVmZmVyW21faURhdExlbisrXSA9IHdjaCksIFRSVUU7DQorICAgIH0NCisgICAgdm9pZAkJCQkJCQlDbGVhcigpDQorICAgIHsNCisgICAgICAgIG1faURhdFBvcyA9IG1faURhdExlbiA9IDA7DQorICAgIH0NCisgICAgdm9pZAkJCQkJCQlSZXNldCgpOw0KKyAgICBGWF9JTlQzMgkJCQkJCVRyaW1FbmQoKQ0KKyAgICB7DQorICAgICAgICB3aGlsZSAobV9pRGF0TGVuID4gMCAmJiBtX3BCdWZmZXJbbV9pRGF0TGVuIC0gMV0gPD0gJyAnKSB7DQorICAgICAgICAgICAgLS1tX2lEYXRMZW47DQorICAgICAgICB9DQorICAgICAgICBBcHBlbmRDaGFyKDApOw0KKyAgICAgICAgcmV0dXJuIC0tbV9pRGF0TGVuOw0KKyAgICB9DQorICAgIHZvaWQJCQkJCQkJU3VidHJhY3QoRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpTGVuZ3RoKTsNCisgICAgRlhfQk9PTAkJCQkJCQlJc0VPRigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lEYXRQb3MgPj0gbV9pRGF0TGVuOw0KKyAgICB9DQorICAgIEZYX1dDSEFSCQkJCQkJR2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BCdWZmZXJbaW5kZXhdOw0KKyAgICB9DQorICAgIEZYX1dDSEFSCQkJCQkJR2V0Q2hhcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BCdWZmZXJbbV9pRGF0UG9zXTsNCisgICAgfQ0KKyAgICBGWF9XQ0hBUgkJCQkJCUdldE5leHRDaGFyKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChtX2lEYXRQb3MgKyAxID49IG1faURhdExlbikgPyAwIDogbV9wQnVmZmVyW21faURhdFBvcyArIDFdOw0KKyAgICB9DQorICAgIHZvaWQJCQkJCQkJTW92ZU5leHQoKQ0KKyAgICB7DQorICAgICAgICBtX2lEYXRQb3MrKzsNCisgICAgfQ0KKyAgICBGWF9JTlQzMgkJCQkJCUdldExlbmd0aCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lEYXRMZW47DQorICAgIH0NCisgICAgRlhfTFBDV1NUUgkJCQkJCUdldEJ1ZmZlcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BCdWZmZXI7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIEZYX0JPT0wJCQkJCQkJRXhwYW5kQnVmKEZYX0lOVDMyIGlEZXNpcmVkU2l6ZSk7DQorICAgIEZYX0JPT0wJCQkJCQkJbV9iRXh0QnVmOw0KKyAgICBGWF9MUFdTVFIJCQkJCQltX3BCdWZmZXI7DQorICAgIEZYX0lOVDMyCQkJCQkJbV9pQnVmTGVuOw0KKyAgICBGWF9JTlQzMgkJCQkJCW1faURhdExlbjsNCisgICAgRlhfSU5UMzIJCQkJCQltX2lEYXRQb3M7DQorfTsNCisjZGVmaW5lIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0NoYXJzZXQJMQ0KKyNkZWZpbmUgRkRFX0NTU1NZTlRBWENIRUNLX0FsbG93SW1wb3J0CTINCitlbnVtIEZERV9DU1NTWU5UQVhNT0RFIHsNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCwNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfQ29tbWVudCwNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfQXRSdWxlLA0KKyAgICBGREVfQ1NTU1lOVEFYTU9ERV9Vbmtub3duUnVsZSwNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfQ2hhcnNldCwNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfSW1wb3J0LA0KKyAgICBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVJ1bGUsDQorICAgIEZERV9DU1NTWU5UQVhNT0RFX1VSSSwNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFUeXBlLA0KKyAgICBGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3RvciwNCisgICAgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlOYW1lLA0KKyAgICBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eVZhbHVlLA0KK307DQorY2xhc3MgQ0ZERV9DU1NTeW50YXhQYXJzZXIgOiBwdWJsaWMgSUZERV9DU1NTeW50YXhQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9DU1NTeW50YXhQYXJzZXIoKTsNCisgICAgfkNGREVfQ1NTU3ludGF4UGFyc2VyKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUluaXQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfSU5UMzIgaUNTU1BsYW5lU2l6ZSwgRlhfSU5UMzIgaVRleHREYXRhU2l6ZSA9IDMyLCBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJSW5pdChGWF9MUENXU1RSIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplLCBGWF9JTlQzMiBpVGV4dERhdFNpemUgPSAzMiwgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZERV9DU1NTWU5UQVhTVEFUVVMJCURvU3ludGF4UGFyc2UoKTsNCisgICAgdmlydHVhbCBGWF9MUENXU1RSCQkJCUdldEN1cnJlbnRTdHJpbmcoRlhfSU5UMzIgJmlMZW5ndGgpIGNvbnN0Ow0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJCQkJCQlSZXNldChGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24pOw0KKyAgICB2b2lkCQkJCQkJCVN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREUgZU1vZGUpOw0KKyAgICBGWF9JTlQzMgkJCQkJCVN3aXRjaFRvQ29tbWVudCgpOw0KKw0KKyAgICBGWF9CT09MCQkJCQkJCVJlc3RvcmVNb2RlKCk7DQorICAgIEZYX0JPT0wJCQkJCQkJQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgICBGWF9JTlQzMgkJCQkJCVNhdmVUZXh0RGF0YSgpOw0KKyAgICBGWF9CT09MCQkJCQkJCUlzQ2hhcnNldEVuYWJsZWQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKG1fZHdDaGVjayAmIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0NoYXJzZXQpICE9IDA7DQorICAgIH0NCisgICAgdm9pZAkJCQkJCQlEaXNhYmxlQ2hhcnNldCgpDQorICAgIHsNCisgICAgICAgIG1fZHdDaGVjayA9IEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydDsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCQkJCUlzSW1wb3J0RW5hYmxlZCgpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCQkJCURpc2FibGVJbXBvcnQoKQ0KKyAgICB7DQorICAgICAgICBtX2R3Q2hlY2sgPSAwOw0KKyAgICB9DQorICAgIElGWF9TdHJlYW0JCQkJCQkqbV9wU3RyZWFtOw0KKyAgICBGWF9JTlQzMgkJCQkJCW1faVN0cmVhbVBvczsNCisgICAgRlhfSU5UMzIJCQkJCQltX2lQbGFuZVNpemU7DQorICAgIENGREVfQ1NTVGV4dEJ1ZgkJCQkJbV9UZXh0RGF0YTsNCisgICAgQ0ZERV9DU1NUZXh0QnVmCQkJCQltX1RleHRQbGFuZTsNCisgICAgRlhfSU5UMzIJCQkJCQltX2lUZXh0RGF0TGVuOw0KKyAgICBGWF9EV09SRAkJCQkJCW1fZHdDaGVjazsNCisgICAgRkRFX0NTU1NZTlRBWE1PREUJCQkJbV9lTW9kZTsNCisgICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQltX2VTdGF0dXM7DQorICAgIENGWF9TdGFja1RlbXBsYXRlPEZERV9DU1NTWU5UQVhNT0RFPiBtX01vZGVTdGFjazsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODBmMTE4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9kZXZiYXNpYy5oIg0KK3N0YXRpYyBjb25zdCBGREVfSEFUQ0hEQVRBIGdzX0hhdGNoQml0bWFwRGF0YVtGREVfSEFUQ0hTVFlMRV9Ub3RhbF0gPSB7DQorICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTUsIDB4MTUsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZjcsIDB4ZjcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4N2YsIDB4N2YsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZjcsIDB4ZjcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4N2YsIDB4N2YsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhjMSwgMHhjMSwgMHgwMCwgMHgwMCwgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwgMHg4MywgMHg4MywgMHgwMCwgMHgwMCwgMHhjMSwgMHhjMSwgMHgwMCwgMHgwMCwgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwgMHg4MywgMHg4MywgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4YjEsIDB4YjEsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsIDB4ZDgsIDB4ZDgsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4OGQsIDB4OGQsIDB4MDAsIDB4MDAsIDB4YjEsIDB4YjEsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsIDB4ZDgsIDB4ZDgsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4OGQsIDB4OGQsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg1NCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg1NCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDg0LCAweDg0LCAweDAwLCAweDAwLCAweDQ4LCAweDQ4LCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDg0LCAweDg0LCAweDAwLCAweDAwLCAweDQ4LCAweDQ4LCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ODksIDB4ODksIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTgsIDB4OTgsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ODksIDB4ODksIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTgsIDB4OTgsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCit9Ow0KK0ZERV9MUENIQVRDSERBVEEgRkRFX0RFVkdldEhhdGNoRGF0YShGWF9JTlQzMiBpSGF0Y2hTdHlsZSkNCit7DQorICAgIGlmIChpSGF0Y2hTdHlsZSA8IEZERV9IQVRDSFNUWUxFX01pbiB8fCBpSGF0Y2hTdHlsZSA+IEZERV9IQVRDSFNUWUxFX01heCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuICZnc19IYXRjaEJpdG1hcERhdGFbaUhhdGNoU3R5bGVdOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQyNDcxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuaApAQCAtMCwwICsxLDE2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9ERVZJQ0VfQkFTSUNfSU1QDQorI2RlZmluZSBfRkRFX0RFVklDRV9CQVNJQ19JTVANCitzdHJ1Y3QgRkRFX0hBVENIREFUQSB7DQorICAgIEZYX0lOVDMyCWlXaWR0aDsNCisgICAgRlhfSU5UMzIJaUhlaWdodDsNCisgICAgRlhfQllURQkJTWFza0JpdHNbNjRdOw0KK307DQordHlwZWRlZiBGREVfSEFUQ0hEQVRBIGNvbnN0ICogRkRFX0xQQ0hBVENIREFUQTsNCitGREVfTFBDSEFUQ0hEQVRBIEZERV9ERVZHZXRIYXRjaERhdGEoRlhfSU5UMzIgaUhhdGNoU3R5bGUpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dkaWRldmljZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkN2Y2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuY3BwCkBAIC0wLDAgKzEsNTU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiZmRlX2dkaWRldmljZS5oIg0KKyNpbmNsdWRlICJmZGVfZ2Rpb2JqZWN0LmgiDQorI2lmZGVmIF9GREVQTFVTDQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorSUZERV9SZW5kZXJEZXZpY2UqCUlGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgKQ0KK3sNCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9HZGlEZXZpY2UocEJpdG1hcCk7DQorfQ0KK0lGREVfUmVuZGVyRGV2aWNlKglJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKENGWF9SZW5kZXJEZXZpY2UgKnBEZXZpY2UpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ0ZERV9HZGlEZXZpY2U6OkNGREVfR2RpRGV2aWNlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCkNCisgICAgOiBtX2R3R2x5cGhMZW4oMCkNCisgICAgLCBtX3BHbHlwaEJ1ZihOVUxMKQ0KKyAgICAsIG1fcEdyYXBoaWNzKE5VTEwpDQorICAgICwgbV9wQml0bWFwKE5VTEwpDQorICAgICwgbV9wQ2xpcFBhdGgoTlVMTCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwQml0bWFwICE9IE5VTEwpOw0KKyAgICBCSVRNQVBJTkZPIGJtaTsNCisgICAgRlhTWVNfbWVtc2V0KCZibWksIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOw0KKyAgICBibWkuYm1pSGVhZGVyLmJpV2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgICBibWkuYm1pSGVhZGVyLmJpSGVpZ2h0ID0gLXBCaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgICBibWkuYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsNCisgICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gcEJpdG1hcC0+R2V0QlBQKCk7DQorICAgIG1fcEJpdG1hcCA9IEdkaXBsdXM6OkJpdG1hcDo6RnJvbUJJVE1BUElORk8oJmJtaSwgcEJpdG1hcC0+R2V0QnVmZmVyKCkpOw0KKyAgICBGWFNZU19hc3NlcnQobV9wQml0bWFwICE9IE5VTEwpOw0KKyAgICBtX3BHcmFwaGljcyA9IEdkaXBsdXM6OkdyYXBoaWNzOjpGcm9tSW1hZ2UobV9wQml0bWFwKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEdyYXBoaWNzICE9IE5VTEwpOw0KKyAgICBtX3J0Q2xpcFJlY3QuU2V0KDAsIDAsIChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgICBtX3BHcmFwaGljcy0+U2V0Q2xpcCgoY29uc3QgR2RpcGx1czo6UmVjdEYmKW1fcnRDbGlwUmVjdCk7DQorfQ0KK0NGREVfR2RpRGV2aWNlOjp+Q0ZERV9HZGlEZXZpY2UoKQ0KK3sNCisgICAgZGVsZXRlIG1fcEdyYXBoaWNzOw0KKyAgICBkZWxldGUgbV9wQml0bWFwOw0KKyAgICBpZiAobV9wR2x5cGhCdWYpIHsNCisgICAgICAgIEZERV9GcmVlKG1fcEdseXBoQnVmKTsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRkRFX0dkaURldmljZTo6R2V0V2lkdGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0V2lkdGgoKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9HZGlEZXZpY2U6OkdldEhlaWdodCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRIZWlnaHQoKTsNCit9DQorRkRFX0hERVZJQ0VTVEFURSBDRkRFX0dkaURldmljZTo6U2F2ZVN0YXRlKCkNCit7DQorICAgIHJldHVybiAoRkRFX0hERVZJQ0VTVEFURSltX3BHcmFwaGljcy0+U2F2ZSgpOw0KK30NCit2b2lkIENGREVfR2RpRGV2aWNlOjpSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpDQorew0KKyAgICBHZGlwbHVzOjpTdGF0dXMgZVJldCA9IG1fcEdyYXBoaWNzLT5SZXN0b3JlKChHZGlwbHVzOjpHcmFwaGljc1N0YXRlKWhTdGF0ZSk7DQorICAgIGlmIChlUmV0ID09IEdkaXBsdXM6Ok9rKSB7DQorICAgICAgICBHZGlwbHVzOjpSZWN0IHJ0Ow0KKyAgICAgICAgZVJldCA9IG1fcEdyYXBoaWNzLT5HZXRDbGlwQm91bmRzKCZydCk7DQorICAgICAgICBpZiAoZVJldCA9PSBHZGlwbHVzOjpPaykgew0KKyAgICAgICAgICAgIG1fcnRDbGlwUmVjdC5TZXQoKEZYX0ZMT0FUKXJ0LlgsIChGWF9GTE9BVClydC5ZLCAoRlhfRkxPQVQpcnQuV2lkdGgsIChGWF9GTE9BVClydC5IZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwKQ0KK3sNCisgICAgbV9ydENsaXBSZWN0ID0gcnRDbGlwOw0KKyAgICByZXR1cm4gbV9wR3JhcGhpY3MtPlNldENsaXAoKGNvbnN0IEdkaXBsdXM6OlJlY3RGJilydENsaXApID09IEdkaXBsdXM6Ok9rOw0KK30NCitjb25zdCBDRlhfUmVjdEYmIENGREVfR2RpRGV2aWNlOjpHZXRDbGlwUmVjdCgpDQorew0KKyAgICByZXR1cm4gbV9ydENsaXBSZWN0Ow0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGggKnBDbGlwKQ0KK3sNCisgICAgbV9wQ2xpcFBhdGggPSAoQ0ZERV9HZGlQYXRoKilwQ2xpcDsNCisgICAgR2RpcGx1czo6R3JhcGhpY3NQYXRoICpwUGF0aCA9IG1fcENsaXBQYXRoID8gJm1fcENsaXBQYXRoLT5tX1BhdGggOiBOVUxMOw0KKyAgICByZXR1cm4gbV9wR3JhcGhpY3MtPlNldENsaXAocFBhdGgpID09IEdkaXBsdXM6Ok9rOw0KK30NCitJRkRFX1BhdGgqIENGREVfR2RpRGV2aWNlOjpHZXRDbGlwUGF0aCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wQ2xpcFBhdGg7DQorfQ0KK0ZYX0ZMT0FUIENGREVfR2RpRGV2aWNlOjpHZXREcGlYKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BHcmFwaGljcy0+R2V0RHBpWCgpOw0KK30NCitGWF9GTE9BVCBDRkRFX0dkaURldmljZTo6R2V0RHBpWSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wR3JhcGhpY3MtPkdldERwaVkoKTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0ltYWdlKElGREVfSW1hZ2UgKnBJbWcsIGNvbnN0IENGWF9SZWN0RiAqcFNyY1JlY3QsIGNvbnN0IENGWF9SZWN0RiAmZHN0UmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcEltZ01hdHJpeCwgY29uc3QgQ0ZYX01hdHJpeCAqcERldk1hdHJpeCkNCit7DQorICAgIENGREVfR2RpSW1hZ2UgKnBHZGlJbWcgPSAoQ0ZERV9HZGlJbWFnZSopcEltZzsNCisgICAgRlhTWVNfYXNzZXJ0KHBHZGlJbWcgIT0gTlVMTCAmJiBwR2RpSW1nLT5tX3BJbWFnZSAhPSBOVUxMKTsNCisgICAgQ0ZYX1JlY3RGIHNyY1JlY3Q7DQorICAgIGlmIChwU3JjUmVjdCkgew0KKyAgICAgICAgc3JjUmVjdCA9ICpwU3JjUmVjdDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHNyY1JlY3QubGVmdCA9IHNyY1JlY3QudG9wID0gMDsNCisgICAgICAgIHNyY1JlY3Qud2lkdGggPSAoRlhfRkxPQVQpcEltZy0+R2V0SW1hZ2VXaWR0aCgpOw0KKyAgICAgICAgc3JjUmVjdC5oZWlnaHQgPSAoRlhfRkxPQVQpcEltZy0+R2V0SW1hZ2VIZWlnaHQoKTsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG1hdHJpeDsNCisgICAgaWYgKHBJbWdNYXRyaXgpIHsNCisgICAgICAgIG1hdHJpeCA9ICpwSW1nTWF0cml4Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbWF0cml4LlJlc2V0KCk7DQorICAgIH0NCisgICAgbWF0cml4LlRyYW5zbGF0ZShkc3RSZWN0LmxlZnQsIGRzdFJlY3QudG9wKTsNCisgICAgbWF0cml4LlNjYWxlKChkc3RSZWN0LndpZHRoIC8gc3JjUmVjdC53aWR0aCksIChkc3RSZWN0LmhlaWdodCAvIHNyY1JlY3QuaGVpZ2h0KSwgVFJVRSk7DQorICAgIGlmIChwRGV2TWF0cml4KSB7DQorICAgICAgICBtYXRyaXguQ29uY2F0KCpwRGV2TWF0cml4KTsNCisgICAgfQ0KKyAgICBDRlhfUG9pbnRGIGRzdFBvaW50c1szXTsNCisgICAgZHN0UG9pbnRzWzBdLlNldCgwLCAwKTsNCisgICAgZHN0UG9pbnRzWzFdLlNldChzcmNSZWN0LndpZHRoLCAwKTsNCisgICAgZHN0UG9pbnRzWzJdLlNldCgwLCBzcmNSZWN0LmhlaWdodCk7DQorICAgIG1hdHJpeC5UcmFuc2Zvcm1Qb2ludHMoZHN0UG9pbnRzLCAzKTsNCisgICAgbV9wR3JhcGhpY3MtPkRyYXdJbWFnZShwR2RpSW1nLT5tX3BJbWFnZSwgKEdkaXBsdXM6OlBvaW50RiopZHN0UG9pbnRzLCAzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlY3QubGVmdCwgc3JjUmVjdC50b3AsIHNyY1JlY3Qud2lkdGgsIHNyY1JlY3QuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkaXBsdXM6OlVuaXRQaXhlbCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqcERpYiwgY29uc3QgQ0ZYX1JlY3RGICpwU3JjUmVjdCwgY29uc3QgQ0ZYX1JlY3RGICZkc3RSZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwSW1nTWF0cml4LCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBEaWIgIT0gTlVMTCk7DQorICAgIEJJVE1BUElORk8gYm1pOw0KKyAgICBGWFNZU19tZW1zZXQoJmJtaSwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsNCisgICAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IHBEaWItPkdldFdpZHRoKCk7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlIZWlnaHQgPSBwRGliLT5HZXRIZWlnaHQoKTsNCisgICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IHBEaWItPkdldEJQUCgpOw0KKyAgICBHZGlwbHVzOjpCaXRtYXAgYm1wKCZibWksIHBEaWItPkdldEJ1ZmZlcigpKTsNCisgICAgQ0ZERV9HZGlJbWFnZSBpbWcoJmJtcCk7DQorICAgIHJldHVybiBEcmF3SW1hZ2UoJmltZywgcFNyY1JlY3QsIGRzdFJlY3QsIHBJbWdNYXRyaXgsIHBEZXZNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3U3RyaW5nKElGREVfQnJ1c2ggKnBCcnVzaCwgSUZYX0ZvbnQgKnBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0lOVDMyIGlDb3VudCwgRlhfRkxPQVQgZkZvbnRTaXplLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCcnVzaCAhPSBOVUxMICYmIHBGb250ICE9IE5VTEwgJiYgcENoYXJQb3MgIT0gTlVMTCk7DQorICAgIEZYX0FSR0IgYXJnYiA9IDB4RkYwMDAwMDA7DQorICAgIGlmIChwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1NvbGlkKSB7DQorICAgICAgICBhcmdiID0gKChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaCktPkdldENvbG9yKCk7DQorICAgIH0NCisgICAgQ0ZERV9HZGlGb250ICpwR2RpRm9udCA9IChDRkRFX0dkaUZvbnQqKXBGb250Ow0KKyAgICBHTFlQSE1FVFJJQ1MgZ207DQorICAgIE1BVDIgbWF0MjsNCisgICAgRlhfRkxPQVQgZlNjYWxlID0gZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgICAgRlhfRkxPQVQgbWEsIG1iLCBtYywgbWQ7DQorICAgIEZYX0ZMT0FUIGZ4LCBmeTsNCisgICAgd2hpbGUgKC0taUNvdW50ID49IDApIHsNCisgICAgICAgIG1iID0gbWMgPSAwOw0KKyAgICAgICAgbWEgPSBtZCA9IGZTY2FsZTsNCisgICAgICAgIGlmIChwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBhYSA9IG1hICogLXBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSArIG1iICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGJiID0gLW1hICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdICsgbWIgKiBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM107DQorICAgICAgICAgICAgRlhfRkxPQVQgY2MgPSBtYyAqIC1wQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gKyBtZCAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXTsNCisgICAgICAgICAgICBGWF9GTE9BVCBkZCA9IC1tYyAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSArIG1kICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdOw0KKyAgICAgICAgICAgIG1hID0gYWE7DQorICAgICAgICAgICAgbWIgPSBiYjsNCisgICAgICAgICAgICBtYyA9IGNjOw0KKyAgICAgICAgICAgIG1kID0gZGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGFhID0gbWEgKiBwTWF0cml4LT5hICsgbWIgKiBwTWF0cml4LT5jOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGJiID0gbWEgKiBwTWF0cml4LT5iICsgbWIgKiBwTWF0cml4LT5kOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGNjID0gbWMgKiBwTWF0cml4LT5hICsgbWQgKiBwTWF0cml4LT5jOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGRkID0gbWMgKiBwTWF0cml4LT5iICsgbWQgKiBwTWF0cml4LT5kOw0KKyAgICAgICAgICAgIG1hID0gYWE7DQorICAgICAgICAgICAgbWIgPSBiYjsNCisgICAgICAgICAgICBtYyA9IGNjOw0KKyAgICAgICAgICAgIG1kID0gZGQ7DQorICAgICAgICB9DQorICAgICAgICAqKGxvbmcqKSgmbWF0Mi5lTTExKSA9IChsb25nKShtYSAqIDY1NTM2KTsNCisgICAgICAgICoobG9uZyopKCZtYXQyLmVNMjEpID0gKGxvbmcpKG1iICogNjU1MzYpOw0KKyAgICAgICAgKihsb25nKikoJm1hdDIuZU0xMikgPSAobG9uZykobWMgKiA2NTUzNik7DQorICAgICAgICAqKGxvbmcqKSgmbWF0Mi5lTTIyKSA9IChsb25nKShtZCAqIDY1NTM2KTsNCisgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSA9IHBHZGlGb250LT5HZXRHbHlwaERJQml0cyhwQ2hhclBvcy0+bV9HbHlwaEluZGV4LCBhcmdiLCAmbWF0MiwgZ20sIE5VTEwsIDApOw0KKyAgICAgICAgaWYgKGR3U2l6ZSA+IDApIHsNCisgICAgICAgICAgICBpZiAobV9wR2x5cGhCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBtX3BHbHlwaEJ1ZiA9IEZERV9BbGxvYyhkd1NpemUpOw0KKyAgICAgICAgICAgICAgICBtX2R3R2x5cGhMZW4gPSBkd1NpemU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChtX2R3R2x5cGhMZW4gPCBkd1NpemUpIHsNCisgICAgICAgICAgICAgICAgbV9wR2x5cGhCdWYgPSBGREVfUmVhbGxvYyhtX3BHbHlwaEJ1ZiwgZHdTaXplKTsNCisgICAgICAgICAgICAgICAgbV9kd0dseXBoTGVuID0gZHdTaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwR2RpRm9udC0+R2V0R2x5cGhESUJpdHMocENoYXJQb3MtPm1fR2x5cGhJbmRleCwgYXJnYiwgJm1hdDIsIGdtLCBtX3BHbHlwaEJ1ZiwgbV9kd0dseXBoTGVuKTsNCisgICAgICAgICAgICBHZGlwbHVzOjpCaXRtYXAgYm1wKGdtLmdtQmxhY2tCb3hYLCBnbS5nbUJsYWNrQm94WSwgZ20uZ21CbGFja0JveFggKiA0LCBQaXhlbEZvcm1hdDMyYnBwQVJHQiwgbV9wR2x5cGhCdWYpOw0KKyAgICAgICAgICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICAgICAgICAgIGZ4ID0gcE1hdHJpeC0+YSAqIHBDaGFyUG9zLT5tX09yaWdpblggKyBwTWF0cml4LT5jICogcENoYXJQb3MtPm1fT3JpZ2luWSArIHBNYXRyaXgtPmU7DQorICAgICAgICAgICAgICAgIGZ5ID0gcE1hdHJpeC0+YiAqIHBDaGFyUG9zLT5tX09yaWdpblggKyBwTWF0cml4LT5kICogcENoYXJQb3MtPm1fT3JpZ2luWSArIHBNYXRyaXgtPmY7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZnggPSBwQ2hhclBvcy0+bV9PcmlnaW5YOw0KKyAgICAgICAgICAgICAgICBmeSA9IHBDaGFyUG9zLT5tX09yaWdpblk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEdyYXBoaWNzLT5EcmF3SW1hZ2UoJmJtcCwgKEZYU1lTX3JvdW5kKGZ4KSArIGdtLmdtcHRHbHlwaE9yaWdpbi54KSwgKEZYU1lTX3JvdW5kKGZ5KSAtIGdtLmdtcHRHbHlwaE9yaWdpbi55KSk7DQorICAgICAgICB9DQorICAgICAgICBwQ2hhclBvcysrOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3QXJjKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBzdGFydEFuZ2xlID0gRlhfUkFEMkRFRyhzdGFydEFuZ2xlKTsNCisgICAgc3dlZXBBbmdsZSA9IEZYX1JBRDJERUcoc3dlZXBBbmdsZSk7DQorICAgIEdkaXBsdXM6OlBlbiAqcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd0FyYyhwR2RpUGVuLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICAgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdCZXppZXIoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9Qb2ludEYgJnB0MywgY29uc3QgQ0ZYX1BvaW50RiAmcHQ0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIEdkaXBsdXM6OlBlbiAqcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd0JlemllcihwR2RpUGVuLCBwdDEueCwgcHQxLnksIHB0Mi54LCBwdDIueSwgcHQzLngsIHB0My55LCBwdDQueCwgcHQ0LnkpOw0KKyAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3Q3VydmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfQk9PTCBiQ2xvc2VkLCBGWF9GTE9BVCBmVGVuc2lvbiAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IGJDbG9zZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gbV9wR3JhcGhpY3MtPkRyYXdDbG9zZWRDdXJ2ZShwR2RpUGVuLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpLCBmVGVuc2lvbikNCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wR3JhcGhpY3MtPkRyYXdDdXJ2ZShwR2RpUGVuLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpLCBmVGVuc2lvbik7DQorICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICAgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdFbGxpcHNlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgICAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdFbGxpcHNlKHBHZGlQZW4sIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0xpbmVzKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3TGluZXMocEdkaVBlbiwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiopcG9pbnRzLkdldERhdGEoKSwgcG9pbnRzLkdldFNpemUoKSk7DQorICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3TGluZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgICAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdMaW5lKHBHZGlQZW4sIHB0MS54LCBwdDEueSwgcHQyLngsIHB0Mi55KTsNCisgICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1BhdGgoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRkRFX0dkaVBhdGggKnBHZGlQYXRoID0gKENGREVfR2RpUGF0aCopcFBhdGg7DQorICAgIGlmIChwR2RpUGF0aCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3UGF0aChwR2RpUGVuLCAmcEdkaVBhdGgtPm1fUGF0aCk7DQorICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICAgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdQaWUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBzd2VlcEFuZ2xlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHN0YXJ0QW5nbGUgPSBGWF9SQUQyREVHKHN0YXJ0QW5nbGUpOw0KKyAgICBzd2VlcEFuZ2xlID0gRlhfUkFEMkRFRyhzd2VlcEFuZ2xlKTsNCisgICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3UGllKHBHZGlQZW4sIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCisgICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0Nob3JkKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRlhfQXJjRiBjaG9yZDsNCisgICAgY2hvcmQuU2V0KHJlY3QsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgICBDRkRFX0dkaVBhdGggcGF0aDsNCisgICAgcGF0aC5BZGRDaG9yZChjaG9yZCk7DQorICAgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1BvbHlnb24oSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgICAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdQb2x5Z29uKHBHZGlQZW4sIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksIHBvaW50cy5HZXRTaXplKCkpOw0KKyAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3UmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgICAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdSZWN0YW5nbGUocEdkaVBlbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3Um91bmRSZWN0YW5nbGUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfU2l6ZUYgJnJvdW5kLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGREVfR2RpUGF0aCBwYXRoOw0KKyAgICBwYXRoLkFkZFJvdW5kUmVjdGFuZ2xlKHJlY3QsIHJvdW5kKTsNCisgICAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsQ2xvc2VkQ3VydmUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9GTE9BVCBmVGVuc2lvbiAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgR2RpcGx1czo6QnJ1c2ggKnBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBCcnVzaCk7DQorICAgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkZpbGxDbG9zZWRDdXJ2ZShwR2RpQnJ1c2gsIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksIHBvaW50cy5HZXRTaXplKCksIEdkaXBsdXM6OkZpbGxNb2RlQWx0ZXJuYXRlLCBmVGVuc2lvbik7DQorICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KKyAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgICAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbEVsbGlwc2UocEdkaUJydXNoLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KKyAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IElGREVfUGF0aCAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9HZGlQYXRoICpwR2RpUGF0aCA9IChDRkRFX0dkaVBhdGgqKXBQYXRoOw0KKyAgICBpZiAocEdkaVBhdGggPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEdkaXBsdXM6OkJydXNoICpwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgICBpZiAocEdkaUJydXNoID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsUGF0aChwR2RpQnJ1c2gsICZwR2RpUGF0aC0+bV9QYXRoKTsNCisgICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgICAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxQaWUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgc3RhcnRBbmdsZSA9IEZYX1JBRDJERUcoc3RhcnRBbmdsZSk7DQorICAgIHN3ZWVwQW5nbGUgPSBGWF9SQUQyREVHKHN3ZWVwQW5nbGUpOw0KKyAgICBHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgICAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFBpZShwR2RpQnJ1c2gsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCisgICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgICAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxDaG9yZChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRlhfQXJjRiBjaG9yZDsNCisgICAgY2hvcmQuU2V0KHJlY3QsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgICBDRkRFX0dkaVBhdGggcGF0aDsNCisgICAgcGF0aC5BZGRDaG9yZChjaG9yZCk7DQorICAgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbFBvbHlnb24oSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIEdkaXBsdXM6OkJydXNoICpwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgICBpZiAocEdkaUJydXNoID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsUG9seWdvbihwR2RpQnJ1c2gsIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksIHBvaW50cy5HZXRTaXplKCkpOw0KKyAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCisgICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbFJlY3RhbmdsZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgICAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFJlY3RhbmdsZShwR2RpQnJ1c2gsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgICAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxSb3VuZFJlY3RhbmdsZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX1NpemVGICZyb3VuZCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRkRFX0dkaVBhdGggcGF0aDsNCisgICAgcGF0aC5BZGRSb3VuZFJlY3RhbmdsZShyZWN0LCByb3VuZCk7DQorICAgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCit9DQorR2RpcGx1czo6UGVuKiBDRkRFX0dkaURldmljZTo6Q3JlYXRlR2RpUGVuKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgpDQorew0KKyAgICBpZiAocFBlbiA9PSBOVUxMIHx8IGZQZW5XaWR0aCA8IDAuMDFmKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBOVUxMOw0KKyAgICBzd2l0Y2ggKHBQZW4tPkdldFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBGREVfUEVOVFlQRV9Tb2xpZENvbG9yOiB7DQorICAgICAgICAgICAgICAgIEdkaXBsdXM6OkNvbG9yIGdkaUNvbG9yKChHZGlwbHVzOjpBUkdCKXBQZW4tPkdldENvbG9yKCkpOw0KKyAgICAgICAgICAgICAgICBwR2RpUGVuID0gbmV3IEdkaXBsdXM6OlBlbihnZGlDb2xvciwgZlBlbldpZHRoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9QRU5UWVBFX0hhdGNoQnJ1c2g6DQorICAgICAgICBjYXNlIEZERV9QRU5UWVBFX1RleHR1cmVCcnVzaDoNCisgICAgICAgIGNhc2UgRkRFX1BFTlRZUEVfTGluZWFyR3JhZGllbnQ6IHsNCisgICAgICAgICAgICAgICAgR2RpcGx1czo6QnJ1c2ggKnBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBQZW4tPkdldEJydXNoKCkpOw0KKyAgICAgICAgICAgICAgICBpZiAocEdkaUJydXNoKSB7DQorICAgICAgICAgICAgICAgICAgICBwR2RpUGVuID0gbmV3IEdkaXBsdXM6OlBlbihwR2RpQnJ1c2gsIGZQZW5XaWR0aCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKHBHZGlQZW4pIHsNCisgICAgICAgIENGWF9GbG9hdEFycmF5IGRhc2hBcnJheTsNCisgICAgICAgIHBQZW4tPkdldERhc2hBcnJheShkYXNoQXJyYXkpOw0KKyAgICAgICAgcEdkaVBlbi0+U2V0RGFzaFBhdHRlcm4oZGFzaEFycmF5LkdldERhdGEoKSwgZGFzaEFycmF5LkdldFNpemUoKSk7DQorICAgICAgICBwR2RpUGVuLT5TZXREYXNoT2Zmc2V0KHBQZW4tPkdldERhc2hQaGFzZSgpKTsNCisgICAgICAgIHBHZGlQZW4tPlNldERhc2hTdHlsZSgoR2RpcGx1czo6RGFzaFN0eWxlKXBQZW4tPkdldERhc2hTdHlsZSgpKTsNCisgICAgICAgIHBHZGlQZW4tPlNldFN0YXJ0Q2FwKChHZGlwbHVzOjpMaW5lQ2FwKXBQZW4tPkdldExpbmVDYXAoKSk7DQorICAgICAgICBwR2RpUGVuLT5TZXRFbmRDYXAoKEdkaXBsdXM6OkxpbmVDYXApcFBlbi0+R2V0TGluZUNhcCgpKTsNCisgICAgICAgIHBHZGlQZW4tPlNldExpbmVKb2luKChHZGlwbHVzOjpMaW5lSm9pbilwUGVuLT5HZXRMaW5lSm9pbigpKTsNCisgICAgICAgIHBHZGlQZW4tPlNldE1pdGVyTGltaXQocFBlbi0+R2V0TWl0ZXJMaW1pdCgpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcEdkaVBlbjsNCit9DQordm9pZCBDRkRFX0dkaURldmljZTo6UmVsZWFzZUdkaVBlbihHZGlwbHVzOjpQZW4gKnBHZGlQZW4pDQorew0KKyAgICBpZiAocEdkaVBlbikgew0KKyAgICAgICAgUmVsZWFzZUdkaUJydXNoKHBHZGlQZW4tPkdldEJydXNoKCkpOw0KKyAgICAgICAgZGVsZXRlIHBHZGlQZW47DQorICAgIH0NCit9DQorR2RpcGx1czo6QnJ1c2gqIENGREVfR2RpRGV2aWNlOjpDcmVhdGVHZGlCcnVzaChJRkRFX0JydXNoICpwQnJ1c2gpDQorew0KKyAgICBpZiAocEJydXNoID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEdkaXBsdXM6OkJydXNoICpwR2RpQnJ1c2ggPSBOVUxMOw0KKyAgICBzd2l0Y2ggKHBCcnVzaC0+R2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6IHsNCisgICAgICAgICAgICAgICAgSUZERV9Tb2xpZEJydXNoICpwU29saWRCcnVzaCA9IChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaDsNCisgICAgICAgICAgICAgICAgR2RpcGx1czo6Q29sb3IgZ2RpQ29sb3IoKEdkaXBsdXM6OkFSR0IpcFNvbGlkQnJ1c2gtPkdldENvbG9yKCkpOw0KKyAgICAgICAgICAgICAgICBwR2RpQnJ1c2ggPSBuZXcgR2RpcGx1czo6U29saWRCcnVzaChnZGlDb2xvcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQlJVU0hUWVBFX0hhdGNoOiB7DQorICAgICAgICAgICAgICAgIElGREVfSGF0Y2hCcnVzaCAqcEhhdGNoQnJ1c2ggPSAoSUZERV9IYXRjaEJydXNoKilwQnJ1c2g7DQorICAgICAgICAgICAgICAgIEdkaXBsdXM6OkNvbG9yIGZvcmVDb2xvcigoR2RpcGx1czo6QVJHQilwSGF0Y2hCcnVzaC0+R2V0Q29sb3IoVFJVRSkpOw0KKyAgICAgICAgICAgICAgICBHZGlwbHVzOjpDb2xvciBiYWNrQ29sb3IoKEdkaXBsdXM6OkFSR0IpcEhhdGNoQnJ1c2gtPkdldENvbG9yKEZBTFNFKSk7DQorICAgICAgICAgICAgICAgIEdkaXBsdXM6OkhhdGNoU3R5bGUgaGF0Y2hTdHlsZSA9IChHZGlwbHVzOjpIYXRjaFN0eWxlKXBIYXRjaEJydXNoLT5HZXRIYXRjaFN0eWxlKCk7DQorICAgICAgICAgICAgICAgIHBHZGlCcnVzaCA9IG5ldyBHZGlwbHVzOjpIYXRjaEJydXNoKGhhdGNoU3R5bGUsIGZvcmVDb2xvciwgYmFja0NvbG9yKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfVGV4dHVyZTogew0KKyAgICAgICAgICAgICAgICBJRkRFX1RleHR1cmVCcnVzaCAqcFRleHR1cmVCcnVzaCA9IChJRkRFX1RleHR1cmVCcnVzaCopcEJydXNoOw0KKyAgICAgICAgICAgICAgICBDRkRFX0dkaUltYWdlICpwSW1nSG9sZGVyID0gKENGREVfR2RpSW1hZ2UqKXBUZXh0dXJlQnJ1c2gtPkdldEltYWdlKCk7DQorICAgICAgICAgICAgICAgIEdkaXBsdXM6OkltYWdlICpwR2RpSW1hZ2UgPSBwSW1nSG9sZGVyID8gcEltZ0hvbGRlci0+bV9wSW1hZ2UgOiBOVUxMOw0KKyAgICAgICAgICAgICAgICBHZGlwbHVzOjpXcmFwTW9kZSB3cmFwTW9kZSA9IChHZGlwbHVzOjpXcmFwTW9kZSlwVGV4dHVyZUJydXNoLT5HZXRXcmFwTW9kZSgpOw0KKyAgICAgICAgICAgICAgICBwR2RpQnJ1c2ggPSBuZXcgR2RpcGx1czo6VGV4dHVyZUJydXNoKHBHZGlJbWFnZSwgd3JhcE1vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudDogew0KKyAgICAgICAgICAgICAgICBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2ggKnBMaW5lYXJCcnVzaCA9IChJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2gqKXBCcnVzaDsNCisgICAgICAgICAgICAgICAgR2RpcGx1czo6V3JhcE1vZGUgd3JhcE1vZGUgPSAoR2RpcGx1czo6V3JhcE1vZGUpcExpbmVhckJydXNoLT5HZXRXcmFwTW9kZSgpOw0KKyAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHB0U3RhcnQsIHB0RW5kOw0KKyAgICAgICAgICAgICAgICBwTGluZWFyQnJ1c2gtPkdldExpbmVhclBvaW50cyhwdFN0YXJ0LCBwdEVuZCk7DQorICAgICAgICAgICAgICAgIEZYX0FSR0IgY3JTdGFydCwgY3JFbmQ7DQorICAgICAgICAgICAgICAgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyQ29sb3JzKGNyU3RhcnQsIGNyRW5kKTsNCisgICAgICAgICAgICAgICAgcEdkaUJydXNoID0gbmV3IEdkaXBsdXM6OkxpbmVhckdyYWRpZW50QnJ1c2goKGNvbnN0IEdkaXBsdXM6OlBvaW50RiYpcHRTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgR2RpcGx1czo6UG9pbnRGJilwdEVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgR2RpcGx1czo6Q29sb3ImKWNyU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEdkaXBsdXM6OkNvbG9yJiljckVuZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBwR2RpQnJ1c2g7DQorfQ0KK3ZvaWQgQ0ZERV9HZGlEZXZpY2U6OlJlbGVhc2VHZGlCcnVzaChHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoKQ0KK3sNCisgICAgaWYgKHBHZGlCcnVzaCkgew0KKyAgICAgICAgZGVsZXRlIHBHZGlCcnVzaDsNCisgICAgfQ0KK30NCit2b2lkIENGREVfR2RpRGV2aWNlOjpBcHBseU1hdHJpeChjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIG1fR3JhcGhpY3NTdGF0ZSA9IG1fcEdyYXBoaWNzLT5TYXZlKCk7DQorICAgICAgICBHZGlwbHVzOjpNYXRyaXggZ2RpTWF0cml4KHBNYXRyaXgtPmEsIHBNYXRyaXgtPmIsIHBNYXRyaXgtPmMsIHBNYXRyaXgtPmQsIHBNYXRyaXgtPmUsIHBNYXRyaXgtPmYpOw0KKyAgICAgICAgbV9wR3JhcGhpY3MtPlNldFRyYW5zZm9ybSgmZ2RpTWF0cml4KTsNCisgICAgfQ0KK30NCit2b2lkIENGREVfR2RpRGV2aWNlOjpSZXN0b3JlTWF0cml4KGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbV9wR3JhcGhpY3MtPlJlc3RvcmUobV9HcmFwaGljc1N0YXRlKTsNCisgICAgfQ0KK30NCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dkaWRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmVkMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuaApAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9HRElQTFVTREVWSUNFX0lNUA0KKyNkZWZpbmUgX0ZERV9HRElQTFVTREVWSUNFX0lNUA0KKyNpZmRlZiBfRkRFUExVUw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KK2NsYXNzIENGREVfR2RpUGF0aDsNCitjbGFzcyBDRkRFX0dkaURldmljZSA6IHB1YmxpYyBJRkRFX1JlbmRlckRldmljZSwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX0dkaURldmljZShDRlhfRElCaXRtYXAgKnBEaWIpOw0KKyAgICB+Q0ZERV9HZGlEZXZpY2UoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFdpZHRoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRIZWlnaHQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGREVfSERFVklDRVNUQVRFCVNhdmVTdGF0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldENsaXBQYXRoKGNvbnN0IElGREVfUGF0aCAqcENsaXApOw0KKyAgICB2aXJ0dWFsIElGREVfUGF0aCoJCQlHZXRDbGlwUGF0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApOw0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9SZWN0RiYJR2V0Q2xpcFJlY3QoKTsNCisNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldERwaVgoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldERwaVkoKSBjb25zdDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXggPSBOVUxMLCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3SW1hZ2UoSUZERV9JbWFnZSAqcEltZywgY29uc3QgQ0ZYX1JlY3RGICpwU3JjUmVjdCwgY29uc3QgQ0ZYX1JlY3RGICZkc3RSZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwSW1nTWF0cml4ID0gTlVMTCwgY29uc3QgQ0ZYX01hdHJpeCAqcERldk1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1N0cmluZyhJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9JTlQzMiBpQ291bnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0FyYyhJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdCZXppZXIoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9Qb2ludEYgJnB0MywgY29uc3QgQ0ZYX1BvaW50RiAmcHQ0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3Q3VydmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfQk9PTCBiQ2xvc2VkLCBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdFbGxpcHNlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0xpbmVzKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdMaW5lKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludEYgJnB0MSwgY29uc3QgQ0ZYX1BvaW50RiAmcHQyLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UGF0aChJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBJRkRFX1BhdGggKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UGllKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0Nob3JkKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1BvbHlnb24oSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1JlY3RhbmdsZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdSb3VuZFJlY3RhbmdsZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9TaXplRiAmcm91bmQsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFBpZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbENob3JkKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBzd2VlcEFuZ2xlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsUG9seWdvbihJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxSb3VuZFJlY3RhbmdsZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX1NpemVGICZyb3VuZCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKw0KK3Byb3RlY3RlZDoNCisgICAgR2RpcGx1czo6UGVuKgkJCQlDcmVhdGVHZGlQZW4oSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCk7DQorICAgIHZvaWQJCQkJCQlSZWxlYXNlR2RpUGVuKEdkaXBsdXM6OlBlbiAqcEdkaVBlbik7DQorICAgIEdkaXBsdXM6OkJydXNoKgkJCQlDcmVhdGVHZGlCcnVzaChJRkRFX0JydXNoICpwQnJ1c2gpOw0KKyAgICB2b2lkCQkJCQkJUmVsZWFzZUdkaUJydXNoKEdkaXBsdXM6OkJydXNoICpwR2RpQnJ1c2gpOw0KKyAgICB2b2lkCQkJCQkJQXBwbHlNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQJCQkJCQlSZXN0b3JlTWF0cml4KGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICBHZGlwbHVzOjpHcmFwaGljc1N0YXRlCQltX0dyYXBoaWNzU3RhdGU7DQorICAgIEdkaXBsdXM6OkdyYXBoaWNzCQkJKm1fcEdyYXBoaWNzOw0KKyAgICBHZGlwbHVzOjpCaXRtYXAJCQkJKm1fcEJpdG1hcDsNCisgICAgRlhfTFBCWVRFCQkJCQltX3BHbHlwaEJ1ZjsNCisgICAgRlhfRFdPUkQJCQkJCW1fZHdHbHlwaExlbjsNCisgICAgQ0ZYX1JlY3RGCQkJCQltX3J0Q2xpcFJlY3Q7DQorICAgIENGREVfR2RpUGF0aAkJCQkqbV9wQ2xpcFBhdGg7DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkN2VmNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmNwcApAQCAtMCwwICsxLDUzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX2dlZGV2aWNlLmgiDQorI2luY2x1ZGUgImZkZV9nZW9iamVjdC5oIg0KKyNpbmNsdWRlICJmZGVfZGV2YmFzaWMuaCINCisjaWZuZGVmIF9GREVQTFVTDQorI2lmZGVmIF9jcGx1c3BsdXMNCitleHRlbiAiQyIgew0KKyNlbmRpZg0KKyAgICBGWF9CT09MIEZERV9HZXRTdG9ja0hhdGNoTWFzayhGWF9JTlQzMiBpSGF0Y2hTdHlsZSwgQ0ZYX0RJQml0bWFwICYgaGF0Y2hNYXNrKQ0KKyAgICB7DQorICAgICAgICBGREVfTFBDSEFUQ0hEQVRBIHBEYXRhID0gRkRFX0RFVkdldEhhdGNoRGF0YShpSGF0Y2hTdHlsZSk7DQorICAgICAgICBpZiAoIXBEYXRhKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaGF0Y2hNYXNrLkNyZWF0ZShwRGF0YS0+aVdpZHRoLCBwRGF0YS0+aUhlaWdodCwgRlhESUJfMWJwcE1hc2spOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5KGhhdGNoTWFzay5HZXRCdWZmZXIoKSwgcERhdGEtPk1hc2tCaXRzLCBoYXRjaE1hc2suR2V0UGl0Y2goKSAqIHBEYXRhLT5pSGVpZ2h0KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorI2lmZGVmIF9jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorSUZERV9SZW5kZXJEZXZpY2UqCUlGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgKQ0KK3sNCisgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX0Z4Z2VEZXZpY2UgKnBEZXZpY2UgPSBGWF9ORVcgQ0ZYX0Z4Z2VEZXZpY2U7DQorICAgIGlmIChwRGV2aWNlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBEZXZpY2UtPkF0dGFjaChwQml0bWFwLCAwLCBiUmdiQnl0ZU9yZGVyKTsNCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9GeGdlRGV2aWNlKHBEZXZpY2UsIFRSVUUpOw0KK30NCitJRkRFX1JlbmRlckRldmljZSogSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShDRlhfUmVuZGVyRGV2aWNlICpwRGV2aWNlKQ0KK3sNCisgICAgaWYgKHBEZXZpY2UgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9GeGdlRGV2aWNlKHBEZXZpY2UsIEZBTFNFKTsNCit9DQorQ0ZERV9GeGdlRGV2aWNlOjpDRkRFX0Z4Z2VEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSwgRlhfQk9PTCBiT3duZXJEZXZpY2UpDQorICAgIDogbV9wRGV2aWNlKHBEZXZpY2UpDQorICAgICwgbV9iT3duZXJEZXZpY2UoYk93bmVyRGV2aWNlKQ0KKyAgICAsIG1fcENoYXJQb3MoTlVMTCkNCisgICAgLCBtX2lDaGFyQ291bnQoMCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwRGV2aWNlICE9IE5VTEwpOw0KKyAgICBGWF9SRUNUIHJ0ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQorICAgIG1fcnRDbGlwLlNldCgoRlhfRkxPQVQpcnQubGVmdCwgKEZYX0ZMT0FUKXJ0LnRvcCwgKEZYX0ZMT0FUKXJ0LldpZHRoKCksIChGWF9GTE9BVClydC5IZWlnaHQoKSk7DQorfQ0KK0NGREVfRnhnZURldmljZTo6fkNGREVfRnhnZURldmljZSgpDQorew0KKyAgICBpZiAobV9wQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICBGREVfRnJlZShtX3BDaGFyUG9zKTsNCisgICAgfQ0KKyAgICBpZiAobV9iT3duZXJEZXZpY2UgJiYgbV9wRGV2aWNlKSB7DQorICAgICAgICBkZWxldGUgbV9wRGV2aWNlOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGREVfRnhnZURldmljZTo6R2V0V2lkdGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcERldmljZS0+R2V0V2lkdGgoKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9GeGdlRGV2aWNlOjpHZXRIZWlnaHQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcERldmljZS0+R2V0SGVpZ2h0KCk7DQorfQ0KK0ZERV9IREVWSUNFU1RBVEUgQ0ZERV9GeGdlRGV2aWNlOjpTYXZlU3RhdGUoKQ0KK3sNCisgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ0ZERV9GeGdlRGV2aWNlOjpSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpDQorew0KKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgICBjb25zdCBGWF9SRUNUICZydCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOw0KKyAgICBtX3J0Q2xpcC5TZXQoKEZYX0ZMT0FUKXJ0LmxlZnQsIChGWF9GTE9BVClydC50b3AsIChGWF9GTE9BVClydC5XaWR0aCgpLCAoRlhfRkxPQVQpcnQuSGVpZ2h0KCkpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApDQorew0KKyAgICBtX3J0Q2xpcCA9IHJ0Q2xpcDsNCisgICAgRlhfUkVDVCBydCgoRlhfSU5UMzIpRlhTWVNfZmxvb3IocnRDbGlwLmxlZnQpLCAoRlhfSU5UMzIpRlhTWVNfZmxvb3IocnRDbGlwLnRvcCksDQorICAgICAgICAgICAgICAgKEZYX0lOVDMyKUZYU1lTX2NlaWwocnRDbGlwLnJpZ2h0KCkpLCAoRlhfSU5UMzIpRlhTWVNfY2VpbChydENsaXAuYm90dG9tKCkpKTsNCisgICAgcmV0dXJuIG1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZydCk7DQorfQ0KK2NvbnN0IENGWF9SZWN0RiYgQ0ZERV9GeGdlRGV2aWNlOjpHZXRDbGlwUmVjdCgpDQorew0KKyAgICByZXR1cm4gbV9ydENsaXA7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGggKnBDbGlwKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitJRkRFX1BhdGgqIENGREVfRnhnZURldmljZTo6R2V0Q2xpcFBhdGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0ZMT0FUIENGREVfRnhnZURldmljZTo6R2V0RHBpWCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gOTY7DQorfQ0KK0ZYX0ZMT0FUIENGREVfRnhnZURldmljZTo6R2V0RHBpWSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gOTY7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqcERpYiwgY29uc3QgQ0ZYX1JlY3RGICpwU3JjUmVjdCwgY29uc3QgQ0ZYX1JlY3RGICZkc3RSZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwSW1nTWF0cml4LCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBEaWIgIT0gTlVMTCk7DQorICAgIENGWF9SZWN0RiBzcmNSZWN0Ow0KKyAgICBpZiAocFNyY1JlY3QpIHsNCisgICAgICAgIHNyY1JlY3QgPSAqcFNyY1JlY3Q7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBzcmNSZWN0LlNldCgwLCAwLCAoRlhfRkxPQVQpcERpYi0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKXBEaWItPkdldEhlaWdodCgpKTsNCisgICAgfQ0KKyAgICBpZiAoc3JjUmVjdC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IGRpYjJmeGRldjsNCisgICAgaWYgKHBJbWdNYXRyaXgpIHsNCisgICAgICAgIGRpYjJmeGRldiA9ICpwSW1nTWF0cml4Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZGliMmZ4ZGV2LlJlc2V0KCk7DQorICAgIH0NCisgICAgZGliMmZ4ZGV2LmEgPSBkc3RSZWN0LndpZHRoOw0KKyAgICBkaWIyZnhkZXYuZCA9IC1kc3RSZWN0LmhlaWdodDsNCisgICAgZGliMmZ4ZGV2LmUgPSBkc3RSZWN0LmxlZnQ7DQorICAgIGRpYjJmeGRldi5mID0gZHN0UmVjdC5ib3R0b20oKTsNCisgICAgaWYgKHBEZXZNYXRyaXgpIHsNCisgICAgICAgIGRpYjJmeGRldi5Db25jYXQoKnBEZXZNYXRyaXgpOw0KKyAgICB9DQorICAgIEZYX0xQVk9JRCBoYW5kbGUgPSBOVUxMOw0KKyAgICBtX3BEZXZpY2UtPlN0YXJ0RElCaXRzKHBEaWIsIDI1NSwgMCwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKSZkaWIyZnhkZXYsIDAsIGhhbmRsZSk7DQorICAgIHdoaWxlIChtX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKGhhbmRsZSwgTlVMTCkpIHsgfQ0KKyAgICBtX3BEZXZpY2UtPkNhbmNlbERJQml0cyhoYW5kbGUpOw0KKyAgICByZXR1cm4gaGFuZGxlICE9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3U3RyaW5nKElGREVfQnJ1c2ggKnBCcnVzaCwgSUZYX0ZvbnQgKnBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0lOVDMyIGlDb3VudCwgRlhfRkxPQVQgZkZvbnRTaXplLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCcnVzaCAhPSBOVUxMICYmIHBGb250ICE9IE5VTEwgJiYgcENoYXJQb3MgIT0gTlVMTCAmJiBpQ291bnQgPiAwKTsNCisgICAgQ0ZYX0ZvbnRDYWNoZSAqcENhY2hlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCk7DQorICAgIENGWF9Gb250ICpwRnhGb250ID0gKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpOw0KKyAgICBzd2l0Y2ggKHBCcnVzaC0+R2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6IHsNCisgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiID0gKChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaCktPkdldENvbG9yKCk7DQorICAgICAgICAgICAgICAgIGlmICgocEZvbnQtPkdldEZvbnRTdHlsZXMoKSAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpICE9IDAgJiYgIXBGeEZvbnQtPklzSXRhbGljKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TICpwQ1AgPSAoRlhURVhUX0NIQVJQT1MqKXBDaGFyUG9zOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgKnBBTTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGWF9GTE9BVCAgbWMgPSAwLjI2Nzk0OWY7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEFNID0gcENQLT5tX0FkanVzdE1hdHJpeDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQU1bMl0gPSBtYyAqIHBBTVswXSArIHBBTVsyXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQU1bM10gPSBtYyAqIHBBTVsxXSArIHBBTVszXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ1AgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MgKnBDUCA9IChGWFRFWFRfQ0hBUlBPUyopcENoYXJQb3M7DQorICAgICAgICAgICAgICAgIElGWF9Gb250ICpwQ3VyRm9udCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIElGWF9Gb250ICpwU1RGb250ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MgKnBDdXJDUCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDdXJDb3VudCA9IDA7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGUgPSBwRm9udC0+R2V0Rm9udFN0eWxlcygpOw0KKyAgICAgICAgICAgICAgICBDRlhfRm9udCBGeEZvbnQ7DQorICAgICAgICAgICAgICAgIENGWF9TdWJzdEZvbnQgU3Vic3RGeEZvbnQ7DQorICAgICAgICAgICAgICAgIEZ4Rm9udC5tX3BTdWJzdEZvbnQgPSAmU3Vic3RGeEZvbnQ7DQorICAgICAgICAgICAgICAgIFN1YnN0RnhGb250Lm1fV2VpZ2h0ID0gZHdGb250U3R5bGUgJiBGWF9GT05UU1RZTEVfQm9sZCA/IDcwMCA6IDQwMDsNCisgICAgICAgICAgICAgICAgU3Vic3RGeEZvbnQubV9XZWlnaHRDSksgPSBTdWJzdEZ4Rm9udC5tX1dlaWdodDsNCisgICAgICAgICAgICAgICAgU3Vic3RGeEZvbnQubV9JdGFsaWNBbmdsZSA9IGR3Rm9udFN0eWxlICYgRlhfRk9OVFNUWUxFX0l0YWxpYyA/IC0xMiA6IDA7DQorICAgICAgICAgICAgICAgIFN1YnN0RnhGb250Lm1fYkl0bGljQ0pLID0gZHdGb250U3R5bGUgJiBGWF9GT05UU1RZTEVfSXRhbGljID8gVFJVRSA6IEZBTFNFOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsNCisgICAgICAgICAgICAgICAgICAgIHBTVEZvbnQgPSBwRm9udC0+R2V0U3Vic3RGb250KChGWF9JTlQzMilwQ1AtPm1fR2x5cGhJbmRleCk7DQorICAgICAgICAgICAgICAgICAgICBwQ1AtPm1fR2x5cGhJbmRleCAmPSAweDAwRkZGRkZGOw0KKyAgICAgICAgICAgICAgICAgICAgcENQLT5tX2JGb250U3R5bGUgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwQ3VyRm9udCAhPSBwU1RGb250KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZ4Rm9udCA9IChDRlhfRm9udCopcEN1ckZvbnQtPkdldERldkZvbnQoKTsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGeEZvbnQubV9GYWNlID0gcEZ4Rm9udC0+bV9GYWNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCAmRnhGb250LCBwQ2FjaGUsIC1mRm9udFNpemUsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisjZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCBwRnhGb250LCBwQ2FjaGUsIC1mRm9udFNpemUsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckZvbnQgPSBwU1RGb250Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJDUCA9IHBDUDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpQ3VyQ291bnQgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpQ3VyQ291bnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwQ1AgKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBDdXJGb250ICE9IE5VTEwgJiYgaUN1ckNvdW50KSB7DQorICAgICAgICAgICAgICAgICAgICBwRnhGb250ID0gKENGWF9Gb250KilwQ3VyRm9udC0+R2V0RGV2Rm9udCgpOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgICAgICAgICAgICAgICBGeEZvbnQubV9GYWNlID0gcEZ4Rm9udC0+bV9GYWNlOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gbV9wRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpQ3VyQ291bnQsIHBDdXJDUCwgJkZ4Rm9udCwgcENhY2hlLCAtZkZvbnRTaXplLCAoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopcE1hdHJpeCwgYXJnYiwgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgICAgICAgICAgICAgICAgICBGeEZvbnQubV9wU3Vic3RGb250ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIEZ4Rm9udC5tX0ZhY2UgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJSZXQ7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCBwRnhGb250LCBwQ2FjaGUsIC1mRm9udFNpemUsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgfQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgICAgICAgICAgIEZ4Rm9udC5tX3BTdWJzdEZvbnQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBGeEZvbnQubV9GYWNlID0gTlVMTDsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdCZXppZXIoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9Qb2ludEYgJnB0MywgY29uc3QgQ0ZYX1BvaW50RiAmcHQ0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGWF9Qb2ludHNGIHBvaW50czsNCisgICAgcG9pbnRzLkFkZChwdDEpOw0KKyAgICBwb2ludHMuQWRkKHB0Mik7DQorICAgIHBvaW50cy5BZGQocHQzKTsNCisgICAgcG9pbnRzLkFkZChwdDQpOw0KKyAgICBDRkRFX1BhdGggcGF0aDsNCisgICAgcGF0aC5BZGRCZXppZXIocG9pbnRzKTsNCisgICAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0N1cnZlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24gLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGREVfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkFkZEN1cnZlKHBvaW50cywgYkNsb3NlZCwgZlRlbnNpb24pOw0KKyAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3RWxsaXBzZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoIHBhdGg7DQorICAgIHBhdGguQWRkRWxsaXBzZShyZWN0KTsNCisgICAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0xpbmVzKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoIHBhdGg7DQorICAgIHBhdGguQWRkTGluZXMocG9pbnRzKTsNCisgICAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0xpbmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoIHBhdGg7DQorICAgIHBhdGguQWRkTGluZShwdDEsIHB0Mik7DQorICAgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdQYXRoKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IElGREVfUGF0aCAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoICpwR2VQYXRoID0gKENGREVfUGF0aCopcFBhdGg7DQorICAgIGlmIChwR2VQYXRoID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhTdGF0ZTsNCisgICAgaWYgKCFDcmVhdGVQZW4ocFBlbiwgZlBlbldpZHRoLCBncmFwaFN0YXRlKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BEZXZpY2UtPkRyYXdQYXRoKCZwR2VQYXRoLT5tX1BhdGgsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCAmZ3JhcGhTdGF0ZSwgMCwgcFBlbi0+R2V0Q29sb3IoKSwgMCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3UG9seWdvbihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGREVfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkFkZFBvbHlnb24ocG9pbnRzKTsNCisgICAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd1JlY3RhbmdsZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoIHBhdGg7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QpOw0KKyAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsQ2xvc2VkQ3VydmUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9GTE9BVCBmVGVuc2lvbiAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoIHBhdGg7DQorICAgIHBhdGguQWRkQ3VydmUocG9pbnRzLCBUUlVFLCBmVGVuc2lvbik7DQorICAgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxFbGxpcHNlKElGREVfQnJ1c2gqIHBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGREVfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkFkZEVsbGlwc2UocmVjdCk7DQorICAgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxQb2x5Z29uKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRkRFX1BhdGggcGF0aDsNCisgICAgcGF0aC5BZGRQb2x5Z29uKHBvaW50cyk7DQorICAgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZERV9QYXRoIHBhdGg7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QpOw0KKyAgICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpDcmVhdGVQZW4oSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgQ0ZYX0dyYXBoU3RhdGVEYXRhICZncmFwaFN0YXRlKQ0KK3sNCisgICAgaWYgKHBQZW4gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGdyYXBoU3RhdGUubV9MaW5lQ2FwID0gKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcClwUGVuLT5HZXRMaW5lQ2FwKCk7DQorICAgIGdyYXBoU3RhdGUubV9MaW5lSm9pbiA9IChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKXBQZW4tPkdldExpbmVKb2luKCk7DQorICAgIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSBmUGVuV2lkdGg7DQorICAgIGdyYXBoU3RhdGUubV9NaXRlckxpbWl0ID0gcFBlbi0+R2V0TWl0ZXJMaW1pdCgpOw0KKyAgICBncmFwaFN0YXRlLm1fRGFzaFBoYXNlID0gcFBlbi0+R2V0RGFzaFBoYXNlKCk7DQorICAgIENGWF9GbG9hdEFycmF5IGRhc2hBcnJheTsNCisgICAgc3dpdGNoIChwUGVuLT5HZXREYXNoU3R5bGUoKSkgew0KKyAgICAgICAgY2FzZSBGREVfREFTSFNUWUxFX0Rhc2g6DQorICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgzKTsNCisgICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfREFTSFNUWUxFX0RvdDoNCisgICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9EQVNIU1RZTEVfRGFzaERvdDoNCisgICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDMpOw0KKyAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfREFTSFNUWUxFX0Rhc2hEb3REb3Q6DQorICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgzKTsNCisgICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9EQVNIU1RZTEVfQ3VzdG9taXplZDoNCisgICAgICAgICAgICBwUGVuLT5HZXREYXNoQXJyYXkoZGFzaEFycmF5KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpRGFzaENvdW50ID0gZGFzaEFycmF5LkdldFNpemUoKTsNCisgICAgaWYgKGlEYXNoQ291bnQgPiAwKSB7DQorICAgICAgICBncmFwaFN0YXRlLlNldERhc2hDb3VudChpRGFzaENvdW50KTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpRGFzaENvdW50OyArK2kpIHsNCisgICAgICAgICAgICBncmFwaFN0YXRlLm1fRGFzaEFycmF5W2ldID0gZGFzaEFycmF5W2ldICogZlBlbldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit0eXBlZGVmIEZYX0JPT0wgKENGREVfRnhnZURldmljZTo6KnBmRmlsbFBhdGgpKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorc3RhdGljIGNvbnN0IHBmRmlsbFBhdGggZ3NfRmlsbFBhdGhbXSA9IHsNCisgICAgJkNGREVfRnhnZURldmljZTo6RmlsbFNvbGlkUGF0aCwNCisgICAgJkNGREVfRnhnZURldmljZTo6RmlsbEhhdGNoUGF0aCwNCisgICAgJkNGREVfRnhnZURldmljZTo6RmlsbFRleHR1cmVQYXRoLA0KKyAgICAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsTGluZWFyR3JhZGllbnRQYXRoLA0KK307DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIENGREVfUGF0aCAqcEdlUGF0aCA9IChDRkRFX1BhdGgqKXBQYXRoOw0KKyAgICBpZiAocEdlUGF0aCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBCcnVzaCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVR5cGUgPSBwQnJ1c2gtPkdldFR5cGUoKTsNCisgICAgaWYgKGlUeXBlIDwgMCB8fCBpVHlwZSA+IEZERV9CUlVTSFRZUEVfTUFYKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuICh0aGlzLT4qZ3NfRmlsbFBhdGhbaVR5cGVdKShwQnJ1c2gsICZwR2VQYXRoLT5tX1BhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFNvbGlkUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFBhdGggJiYgcEJydXNoICYmIHBCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfU29saWQpOw0KKyAgICBJRkRFX1NvbGlkQnJ1c2ggKnBTb2xpZEJydXNoID0gKElGREVfU29saWRCcnVzaCopcEJydXNoOw0KKyAgICByZXR1cm4gbV9wRGV2aWNlLT5EcmF3UGF0aChwUGF0aCwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIE5VTEwsIHBTb2xpZEJydXNoLT5HZXRDb2xvcigpLCAwLCBGWEZJTExfV0lORElORyk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsSGF0Y2hQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwUGF0aCAmJiBwQnJ1c2ggJiYgcEJydXNoLT5HZXRUeXBlKCkgPT0gRkRFX0JSVVNIVFlQRV9IYXRjaCk7DQorICAgIElGREVfSGF0Y2hCcnVzaCAqcEhhdGNoQnJ1c2ggPSAoSUZERV9IYXRjaEJydXNoKilwQnJ1c2g7DQorICAgIEZYX0lOVDMyIGlTdHlsZSA9IHBIYXRjaEJydXNoLT5HZXRIYXRjaFN0eWxlKCk7DQorICAgIGlmIChpU3R5bGUgPCBGREVfSEFUQ0hTVFlMRV9NaW4gfHwgaVN0eWxlID4gRkRFX0hBVENIU1RZTEVfTWF4KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX0RJQml0bWFwIG1hc2s7DQorICAgIGlmICghRkRFX0dldFN0b2NrSGF0Y2hNYXNrKGlTdHlsZSwgbWFzaykpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9BUkdCIGR3Rm9yZUNvbG9yID0gcEhhdGNoQnJ1c2gtPkdldENvbG9yKFRSVUUpOw0KKyAgICBGWF9BUkdCIGR3QmFja0NvbG9yID0gcEhhdGNoQnJ1c2gtPkdldENvbG9yKEZBTFNFKTsNCisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZiA9IHBQYXRoLT5HZXRCb3VuZGluZ0JveCgpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcmVjdGYuVHJhbnNmb3JtKChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4KTsNCisgICAgfQ0KKyAgICBGWF9SRUNUIHJlY3QoRlhTWVNfcm91bmQocmVjdGYubGVmdCksIEZYU1lTX3JvdW5kKHJlY3RmLnRvcCksDQorICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi5yaWdodCksIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOw0KKyAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgICBtX3BEZXZpY2UtPlN0YXJ0UmVuZGVyaW5nKCk7DQorICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aCwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIEZYRklMTF9XSU5ESU5HKTsNCisgICAgbV9wRGV2aWNlLT5GaWxsUmVjdCgmcmVjdCwgZHdCYWNrQ29sb3IpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSByZWN0LmJvdHRvbTsgaiA8IHJlY3QudG9wOyBqICs9IG1hc2suR2V0SGVpZ2h0KCkpDQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSByZWN0LmxlZnQ7IGkgPCByZWN0LnJpZ2h0OyBpICs9IG1hc2suR2V0V2lkdGgoKSkgew0KKyAgICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmbWFzaywgaSwgaiwgZHdGb3JlQ29sb3IpOw0KKyAgICAgICAgfQ0KKyAgICBtX3BEZXZpY2UtPkVuZFJlbmRlcmluZygpOw0KKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxUZXh0dXJlUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFBhdGggJiYgcEJydXNoICYmIHBCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfVGV4dHVyZSk7DQorICAgIElGREVfVGV4dHVyZUJydXNoICpwVGV4dHVyZUJydXNoID0gKElGREVfVGV4dHVyZUJydXNoKilwQnJ1c2g7DQorICAgIElGREVfSW1hZ2UgKnBJbWFnZSA9IChJRkRFX0ltYWdlKilwVGV4dHVyZUJydXNoLT5HZXRJbWFnZSgpOw0KKyAgICBpZiAocEltYWdlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfU2l6ZSBzaXplOw0KKyAgICBzaXplLlNldChwSW1hZ2UtPkdldEltYWdlV2lkdGgoKSwgcEltYWdlLT5HZXRJbWFnZUhlaWdodCgpKTsNCisgICAgQ0ZYX0RJQml0bWFwIGJtcDsNCisgICAgYm1wLkNyZWF0ZShzaXplLngsIHNpemUueSwgRlhESUJfQXJnYik7DQorICAgIGlmICghcEltYWdlLT5TdGFydExvYWRJbWFnZSgmYm1wLCAwLCAwLCBzaXplLngsIHNpemUueSwgMCwgMCwgc2l6ZS54LCBzaXplLnkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBJbWFnZS0+RG9Mb2FkSW1hZ2UoKSA8IDEwMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHBJbWFnZS0+U3RvcExvYWRJbWFnZSgpOw0KKyAgICByZXR1cm4gV3JhcFRleHR1cmUocFRleHR1cmVCcnVzaC0+R2V0V3JhcE1vZGUoKSwgJmJtcCwgcFBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6V3JhcFRleHR1cmUoRlhfSU5UMzIgaVdyYXBNb2RlLCBjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3RmID0gcFBhdGgtPkdldEJvdW5kaW5nQm94KCk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICByZWN0Zi5UcmFuc2Zvcm0oKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgpOw0KKyAgICB9DQorICAgIEZYX1JFQ1QgcmVjdChGWFNZU19yb3VuZChyZWN0Zi5sZWZ0KSwgRlhTWVNfcm91bmQocmVjdGYudG9wKSwNCisgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3RmLnJpZ2h0KSwgRlhTWVNfcm91bmQocmVjdGYuYm90dG9tKSk7DQorICAgIHJlY3QuTm9ybWFsaXplKCk7DQorICAgIGlmIChyZWN0LklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7DQorICAgIG1fcERldmljZS0+U3RhcnRSZW5kZXJpbmcoKTsNCisgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoLCAoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopcE1hdHJpeCwgRlhGSUxMX1dJTkRJTkcpOw0KKyAgICBzd2l0Y2ggKGlXcmFwTW9kZSkgew0KKyAgICAgICAgY2FzZSBGREVfV1JBUE1PREVfVGlsZToNCisgICAgICAgIGNhc2UgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWDoNCisgICAgICAgIGNhc2UgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWToNCisgICAgICAgIGNhc2UgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWFk6IHsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFggPSBpV3JhcE1vZGUgPT0gRkRFX1dSQVBNT0RFX1RpbGVGbGlwWFkgfHwgaVdyYXBNb2RlID09IEZERV9XUkFQTU9ERV9UaWxlRmxpcFg7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBZID0gaVdyYXBNb2RlID09IEZERV9XUkFQTU9ERV9UaWxlRmxpcFhZIHx8IGlXcmFwTW9kZSA9PSBGREVfV1JBUE1PREVfVGlsZUZsaXBZOw0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAgKnBGbGlwWzJdWzJdOw0KKyAgICAgICAgICAgICAgICBwRmxpcFswXVswXSA9IHBCaXRtYXA7DQorICAgICAgICAgICAgICAgIHBGbGlwWzBdWzFdID0gYkZsaXBYID8gcEJpdG1hcC0+RmxpcEltYWdlKFRSVUUsIEZBTFNFKSA6IHBCaXRtYXA7DQorICAgICAgICAgICAgICAgIHBGbGlwWzFdWzBdID0gYkZsaXBZID8gcEJpdG1hcC0+RmxpcEltYWdlKEZBTFNFLCBUUlVFKSA6IHBCaXRtYXA7DQorICAgICAgICAgICAgICAgIHBGbGlwWzFdWzFdID0gKGJGbGlwWCB8fCBiRmxpcFkpID8gcEJpdG1hcC0+RmxpcEltYWdlKGJGbGlwWCwgYkZsaXBZKSA6IHBCaXRtYXA7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudGVyWSA9IDA7DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IHJlY3QudG9wOyBqIDwgcmVjdC5ib3R0b207IGogKz0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGluZGV4WSA9IGlDb3VudGVyWSsrICUgMjsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudGVyWCA9IDA7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSByZWN0LmxlZnQ7IGkgPCByZWN0LnJpZ2h0OyBpICs9IHBCaXRtYXAtPkdldFdpZHRoKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpbmRleFggPSBpQ291bnRlclgrKyAlIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocEZsaXBbaW5kZXhZXVtpbmRleFhdLCBpLCBqKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocEZsaXBbMF1bMV0gIT0gcEZsaXBbMF1bMF0pIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRmxpcFswXVsxXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocEZsaXBbMV1bMF0gIT0gcEZsaXBbMF1bMF0pIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRmxpcFsxXVswXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocEZsaXBbMV1bMV0gIT0gcEZsaXBbMF1bMF0pIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRmxpcFsxXVsxXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1dSQVBNT0RFX0NsYW1wOiB7DQorICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC5ib3R0b20pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX3BEZXZpY2UtPkVuZFJlbmRlcmluZygpOw0KKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxMaW5lYXJHcmFkaWVudFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBQYXRoICYmIHBCcnVzaCAmJiBwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50KTsNCisgICAgSUZERV9MaW5lYXJHcmFkaWVudEJydXNoICpwTGluZWFyQnJ1c2ggPSAoSUZERV9MaW5lYXJHcmFkaWVudEJydXNoKilwQnJ1c2g7DQorICAgIENGWF9Qb2ludEYgcHQwLCBwdDE7DQorICAgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyUG9pbnRzKHB0MCwgcHQxKTsNCisgICAgQ0ZYX1ZlY3RvckYgZkRpYWdvbmFsOw0KKyAgICBmRGlhZ29uYWwuU2V0KHB0MCwgcHQxKTsNCisgICAgRlhfRkxPQVQgZlRoZXRhID0gRlhTWVNfYXRhbjIoZkRpYWdvbmFsLnksIGZEaWFnb25hbC54KTsNCisgICAgRlhfRkxPQVQgZkxlbmd0aCA9IGZEaWFnb25hbC5MZW5ndGgoKTsNCisgICAgRlhfRkxPQVQgZlRvdGFsWCA9IGZMZW5ndGggLyBGWFNZU19jb3MoZlRoZXRhKTsNCisgICAgRlhfRkxPQVQgZlRvdGFsWSA9IGZMZW5ndGggLyBGWFNZU19jb3MoRlhfUEkgLyAyIC0gZlRoZXRhKTsNCisgICAgRlhfRkxPQVQgZlN0ZXBzID0gRlhfTUFYKGZUb3RhbFgsIGZUb3RhbFkpOw0KKyAgICBGWF9GTE9BVCBkeCA9IGZUb3RhbFggLyBmU3RlcHM7DQorICAgIEZYX0ZMT0FUIGR5ID0gZlRvdGFsWSAvIGZTdGVwczsNCisgICAgRlhfQVJHQiBjcjAsIGNyMTsNCisgICAgcExpbmVhckJydXNoLT5HZXRMaW5lYXJDb2xvcnMoY3IwLCBjcjEpOw0KKyAgICBGWF9GTE9BVCBhMCA9IEZYQVJHQl9BKGNyMCk7DQorICAgIEZYX0ZMT0FUIHIwID0gRlhBUkdCX1IoY3IwKTsNCisgICAgRlhfRkxPQVQgZzAgPSBGWEFSR0JfRyhjcjApOw0KKyAgICBGWF9GTE9BVCBiMCA9IEZYQVJHQl9CKGNyMCk7DQorICAgIEZYX0ZMT0FUIGRhID0gKEZYQVJHQl9BKGNyMSkgLSBhMCkgLyBmU3RlcHM7DQorICAgIEZYX0ZMT0FUIGRyID0gKEZYQVJHQl9SKGNyMSkgLSByMCkgLyBmU3RlcHM7DQorICAgIEZYX0ZMT0FUIGRnID0gKEZYQVJHQl9HKGNyMSkgLSBnMCkgLyBmU3RlcHM7DQorICAgIEZYX0ZMT0FUIGRiID0gKEZYQVJHQl9CKGNyMSkgLSBiMCkgLyBmU3RlcHM7DQorICAgIENGWF9ESUJpdG1hcCBibXA7DQorICAgIGJtcC5DcmVhdGUoRlhTWVNfcm91bmQoRlhTWVNfZmFicyhmRGlhZ29uYWwueCkpLCBGWFNZU19yb3VuZChGWFNZU19mYWJzKGZEaWFnb25hbC55KSksIEZYRElCX0FyZ2IpOw0KKyAgICBDRlhfRnhnZURldmljZSBkZXY7DQorICAgIGRldi5BdHRhY2goJmJtcCk7DQorICAgIHB0MSA9IHB0MDsNCisgICAgRlhfSU5UMzIgaVN0ZXBzID0gRlhTWVNfcm91bmQoRlhTWVNfY2VpbChmU3RlcHMpKTsNCisgICAgd2hpbGUgKC0taVN0ZXBzID49IDApIHsNCisgICAgICAgIGNyMCA9IEFyZ2JFbmNvZGUoRlhTWVNfcm91bmQoYTApLCBGWFNZU19yb3VuZChyMCksIEZYU1lTX3JvdW5kKGcwKSwgRlhTWVNfcm91bmQoYjApKTsNCisgICAgICAgIGRldi5EcmF3Q29zbWV0aWNMaW5lKHB0MC54LCBwdDAueSwgcHQxLngsIHB0MS55LCBjcjApOw0KKyAgICAgICAgcHQxLnggKz0gZHg7DQorICAgICAgICBwdDAueSArPSBkeTsNCisgICAgICAgIGEwICs9IGRhOw0KKyAgICAgICAgcjAgKz0gZHI7DQorICAgICAgICBnMCArPSBkZzsNCisgICAgICAgIGIwICs9IGRiOw0KKyAgICB9DQorICAgIHJldHVybiBXcmFwVGV4dHVyZShwTGluZWFyQnJ1c2gtPkdldFdyYXBNb2RlKCksICZibXAsIHBQYXRoLCBwTWF0cml4KTsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5MGU1MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfRlhHRURFVklDRV9JTVANCisjZGVmaW5lIF9GREVfRlhHRURFVklDRV9JTVANCisjaWZuZGVmIF9GREVQTFVTDQorY2xhc3MgQ0ZERV9GeGdlRGV2aWNlIDogcHVibGljIElGREVfUmVuZGVyRGV2aWNlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfRnhnZURldmljZShDRlhfUmVuZGVyRGV2aWNlICpwRGV2aWNlLCBGWF9CT09MIGJPd25lckRldmljZSk7DQorICAgIH5DRkRFX0Z4Z2VEZXZpY2UoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFdpZHRoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRIZWlnaHQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGREVfSERFVklDRVNUQVRFCVNhdmVTdGF0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldENsaXBQYXRoKGNvbnN0IElGREVfUGF0aCAqcENsaXApOw0KKyAgICB2aXJ0dWFsIElGREVfUGF0aCoJCQlHZXRDbGlwUGF0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApOw0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9SZWN0RiYJR2V0Q2xpcFJlY3QoKTsNCisNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldERwaVgoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldERwaVkoKSBjb25zdDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXggPSBOVUxMLCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3U3RyaW5nKElGREVfQnJ1c2ggKnBCcnVzaCwgSUZYX0ZvbnQgKnBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0lOVDMyIGlDb3VudCwgRlhfRkxPQVQgZkZvbnRTaXplLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3QmV6aWVyKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludEYgJnB0MSwgY29uc3QgQ0ZYX1BvaW50RiAmcHQyLCBjb25zdCBDRlhfUG9pbnRGICZwdDMsIGNvbnN0IENGWF9Qb2ludEYgJnB0NCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0N1cnZlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3RWxsaXBzZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdMaW5lcyhJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3TGluZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1BhdGgoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1BvbHlnb24oSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1JlY3RhbmdsZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFBvbHlnb24oSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsUmVjdGFuZ2xlKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCQkJCQlGaWxsU29saWRQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0JPT0wJCQkJCQlGaWxsSGF0Y2hQYXRoKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0JPT0wJCQkJCQlGaWxsVGV4dHVyZVBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRlhfQk9PTAkJCQkJCUZpbGxMaW5lYXJHcmFkaWVudFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRlhfQk9PTAkJCQkJCURyYXdTb2xpZFN0cmluZyhJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9JTlQzMiBpQ291bnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0JPT0wJCQkJCQlEcmF3U3RyaW5nUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9JTlQzMiBpQ291bnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9CT09MCQkJCQkJQ3JlYXRlUGVuKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIENGWF9HcmFwaFN0YXRlRGF0YSAmZ3JhcGhTdGF0ZSk7DQorICAgIEZYX0JPT0wJCQkJCQlXcmFwVGV4dHVyZShGWF9JTlQzMiBpV3JhcE1vZGUsIGNvbnN0IENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIENGWF9SZW5kZXJEZXZpY2UJCQkqbV9wRGV2aWNlOw0KKyAgICBDRlhfUmVjdEYJCQkJCW1fcnRDbGlwOw0KKyAgICBGWF9CT09MCQkJCQkJbV9iT3duZXJEZXZpY2U7DQorICAgIEZYVEVYVF9DSEFSUE9TCQkJCSptX3BDaGFyUG9zOw0KKyAgICBGWF9JTlQzMgkJCQkJbV9pQ2hhckNvdW50Ow0KK307DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzRjZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9vYmplY3QuaCINCisjaW5jbHVkZSAiZmRlX2dlb2JqZWN0LmgiDQorI2lmbmRlZiBfRkRFUExVUw0KK0lGREVfUGF0aCogSUZERV9QYXRoOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9QYXRoOw0KK30NCitGWF9CT09MIENGREVfUGF0aDo6U3RhcnRGaWd1cmUoKQ0KK3sNCisgICAgcmV0dXJuIENsb3NlRmlndXJlKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9QYXRoOjpDbG9zZUZpZ3VyZSgpDQorew0KKyAgICBGWF9QQVRIUE9JTlQgKnBQb2ludCA9IEdldExhc3RQb2ludCgpOw0KKyAgICBpZiAocFBvaW50KSB7DQorICAgICAgICBwUG9pbnQtPm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9QQVRIUE9JTlQqIENGREVfUGF0aDo6R2V0TGFzdFBvaW50KEZYX0lOVDMyIGlDb3VudCApIGNvbnN0DQorew0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVBvaW50cyA9IG1fUGF0aC5HZXRQb2ludENvdW50KCk7DQorICAgIGlmIChpQ291bnQgPiBpUG9pbnRzKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9QYXRoLkdldFBvaW50cygpICsgaVBvaW50cyAtIGlDb3VudDsNCit9DQorRlhfQk9PTCBDRkRFX1BhdGg6OkZpZ3VyZUNsb3NlZCgpIGNvbnN0DQorew0KKyAgICBGWF9QQVRIUE9JTlQgKnBQb2ludCA9IEdldExhc3RQb2ludCgpOw0KKyAgICByZXR1cm4gcFBvaW50ID8gKHBQb2ludC0+bV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkgOiBUUlVFOw0KK30NCitGWF9QQVRIUE9JTlQqIENGREVfUGF0aDo6QWRkUG9pbnRzKEZYX0lOVDMyIGlDb3VudCkNCit7DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUG9pbnRzID0gbV9QYXRoLkdldFBvaW50Q291bnQoKTsNCisgICAgbV9QYXRoLkFkZFBvaW50Q291bnQoaUNvdW50KTsNCisgICAgcmV0dXJuIG1fUGF0aC5HZXRQb2ludHMoKSArIGlQb2ludHM7DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpNb3ZlVG8oRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgRlhfUEFUSFBPSU5UICpwUG9pbnQgPSBBZGRQb2ludHMoMSk7DQorICAgIHBQb2ludC0+bV9Qb2ludFggPSBmeDsNCisgICAgcFBvaW50LT5tX1BvaW50WSA9IGZ5Ow0KKyAgICBwUG9pbnQtPm1fRmxhZyA9IEZYUFRfTU9WRVRPOw0KK30NCit2b2lkIENGREVfUGF0aDo6TGluZVRvKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIEZYX1BBVEhQT0lOVCAqcFBvaW50ID0gQWRkUG9pbnRzKDEpOw0KKyAgICBwUG9pbnQtPm1fUG9pbnRYID0gZng7DQorICAgIHBQb2ludC0+bV9Qb2ludFkgPSBmeTsNCisgICAgcFBvaW50LT5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkJlemllclRvKGNvbnN0IENGWF9Qb2ludEYgJnAxLCBjb25zdCBDRlhfUG9pbnRGICZwMiwgY29uc3QgQ0ZYX1BvaW50RiAmcDMpDQorew0KKyAgICBGWF9QQVRIUE9JTlQgKnAgPSBBZGRQb2ludHMoMyk7DQorICAgIHBbMF0ubV9Qb2ludFggPSBwMS54Ow0KKyAgICBwWzBdLm1fUG9pbnRZID0gcDEueTsNCisgICAgcFswXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOw0KKyAgICBwWzFdLm1fUG9pbnRYID0gcDIueDsNCisgICAgcFsxXS5tX1BvaW50WSA9IHAyLnk7DQorICAgIHBbMV0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsNCisgICAgcFsyXS5tX1BvaW50WCA9IHAzLng7DQorICAgIHBbMl0ubV9Qb2ludFkgPSBwMy55Ow0KKyAgICBwWzJdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBcmNUbyhGWF9CT09MIGJTdGFydCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBlbmRBbmdsZSkNCit7DQorICAgIEZYX0ZMT0FUIHJ4ID0gcmVjdC53aWR0aCAvIDI7DQorICAgIEZYX0ZMT0FUIHJ5ID0gcmVjdC5oZWlnaHQgLyAyOw0KKyAgICBGWF9GTE9BVCBjeCA9IHJlY3QubGVmdCArIHJ4Ow0KKyAgICBGWF9GTE9BVCBjeSA9IHJlY3QudG9wICsgcnk7DQorICAgIEZYX0ZMT0FUIGFscGhhID0gRlhTWVNfYXRhbjIocnggKiBGWFNZU19zaW4oc3RhcnRBbmdsZSksIHJ5ICogRlhTWVNfY29zKHN0YXJ0QW5nbGUpKTsNCisgICAgRlhfRkxPQVQgYmV0YSA9IEZYU1lTX2F0YW4yKHJ4ICogRlhTWVNfc2luKGVuZEFuZ2xlKSwgcnkgKiBGWFNZU19jb3MoZW5kQW5nbGUpKTsNCisgICAgaWYgKEZYU1lTX2ZhYnMoYmV0YSAtIGFscGhhKSA+IEZYX1BJKSB7DQorICAgICAgICBpZiAoYmV0YSA+IGFscGhhKSB7DQorICAgICAgICAgICAgYmV0YSAtPSAyICogRlhfUEk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGFscGhhIC09IDIgKiBGWF9QSTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBoYWxmX2RlbHRhID0gKGJldGEgLSBhbHBoYSkgLyAyOw0KKyAgICBGWF9GTE9BVCBiY3AgPSA0LjBmIC8gMyAqICgxIC0gRlhTWVNfY29zKGhhbGZfZGVsdGEpKSAvIEZYU1lTX3NpbihoYWxmX2RlbHRhKTsNCisgICAgRlhfRkxPQVQgc2luX2FscGhhID0gRlhTWVNfc2luKGFscGhhKTsNCisgICAgRlhfRkxPQVQgc2luX2JldGEgPSBGWFNZU19zaW4oYmV0YSk7DQorICAgIEZYX0ZMT0FUIGNvc19hbHBoYSA9IEZYU1lTX2NvcyhhbHBoYSk7DQorICAgIEZYX0ZMT0FUIGNvc19iZXRhID0gRlhTWVNfY29zKGJldGEpOw0KKyAgICBpZiAoYlN0YXJ0KSB7DQorICAgICAgICBDRlhfUG9pbnRGIHAwOw0KKyAgICAgICAgcDAuU2V0KGN4ICsgcnggKiBjb3NfYWxwaGEsIGN5ICsgcnkgKiBzaW5fYWxwaGEpOw0KKyAgICAgICAgTW92ZVRvKHAwKTsNCisgICAgfQ0KKyAgICBDRlhfUG9pbnRGIHAxOw0KKyAgICBwMS5TZXQoY3ggKyByeCAqIChjb3NfYWxwaGEgLSBiY3AgKiBzaW5fYWxwaGEpLCBjeSArIHJ5ICogKHNpbl9hbHBoYSArIGJjcCAqIGNvc19hbHBoYSkpOw0KKyAgICBDRlhfUG9pbnRGIHAyOw0KKyAgICBwMi5TZXQoY3ggKyByeCAqIChjb3NfYmV0YSArIGJjcCAqIHNpbl9iZXRhKSwgY3kgKyByeSAqIChzaW5fYmV0YSAtIGJjcCAqIGNvc19iZXRhKSk7DQorICAgIENGWF9Qb2ludEYgcDM7DQorICAgIHAzLlNldChjeCArIHJ4ICogY29zX2JldGEsIGN5ICsgcnkgKiBzaW5fYmV0YSk7DQorICAgIEJlemllclRvKHAxLCBwMiwgcDMpOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkQmV6aWVyKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMpDQorew0KKyAgICBpZiAocG9pbnRzLkdldFNpemUoKSAhPSA0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfTFBDUE9JTlRGIHAgPSBwb2ludHMuR2V0RGF0YSgpOw0KKyAgICBNb3ZlVG8ocFswXSk7DQorICAgIEJlemllclRvKHBbMV0sIHBbMl0sIHBbM10pOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkQmV6aWVycyhjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcG9pbnRzLkdldFNpemUoKTsNCisgICAgaWYgKGlDb3VudCA8IDQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9MUENQT0lOVEYgcCA9IHBvaW50cy5HZXREYXRhKCk7DQorICAgIEZYX0xQQ1BPSU5URiBwRW5kID0gcCArIGlDb3VudDsNCisgICAgTW92ZVRvKHBbMF0pOw0KKyAgICBmb3IgKCsrcDsgcCA8PSBwRW5kIC0gMzsgcCArPSAzKSB7DQorICAgICAgICBCZXppZXJUbyhwWzBdLCBwWzFdLCBwWzJdKTsNCisgICAgfQ0KK30NCit2b2lkIENGREVfUGF0aDo6R2V0Q3VydmVUYW5nZW50cyhjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBDRlhfUG9pbnRzRiAmdGFuZ2VudHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24pIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwb2ludHMuR2V0U2l6ZSgpOw0KKyAgICB0YW5nZW50cy5TZXRTaXplKGlDb3VudCk7DQorICAgIGlmIChpQ291bnQgPCAzKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkNvZWZmaWNpZW50ID0gZlRlbnNpb24gLyAzLjBmOw0KKyAgICBGWF9MUENQT0lOVEYgcFBvaW50cyA9IHBvaW50cy5HZXREYXRhKCk7DQorICAgIEZYX0xQUE9JTlRGIHBUYW5nZW50cyA9IHRhbmdlbnRzLkdldERhdGEoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7DQorICAgICAgICBGWF9JTlQzMiByID0gaSArIDE7DQorICAgICAgICBGWF9JTlQzMiBzID0gaSAtIDE7DQorICAgICAgICBpZiAociA+PSBpQ291bnQpIHsNCisgICAgICAgICAgICByID0gYkNsb3NlZCA/IChyIC0gaUNvdW50KSA6IChpQ291bnQgLSAxKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChzIDwgMCkgew0KKyAgICAgICAgICAgIHMgPSBiQ2xvc2VkID8gKHMgKyBpQ291bnQpIDogMDsNCisgICAgICAgIH0NCisgICAgICAgIHBUYW5nZW50c1tpXS54ICs9IChmQ29lZmZpY2llbnQgKiAocFBvaW50c1tyXS54IC0gcFBvaW50c1tzXS54KSk7DQorICAgICAgICBwVGFuZ2VudHNbaV0ueSArPSAoZkNvZWZmaWNpZW50ICogKHBQb2ludHNbcl0ueSAtIHBQb2ludHNbc10ueSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRDdXJ2ZShjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9CT09MIGJDbG9zZWQsIEZYX0ZMT0FUIGZUZW5zaW9uKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxhc3QgPSBwb2ludHMuR2V0VXBwZXJCb3VuZCgpOw0KKyAgICBpZiAoaUxhc3QgPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1BvaW50c0YgdGFuZ2VudHM7DQorICAgIEdldEN1cnZlVGFuZ2VudHMocG9pbnRzLCB0YW5nZW50cywgYkNsb3NlZCwgZlRlbnNpb24pOw0KKyAgICBGWF9MUENQT0lOVEYgcFBvaW50cyA9IHBvaW50cy5HZXREYXRhKCk7DQorICAgIEZYX0xQUE9JTlRGIHBUYW5nZW50cyA9IHRhbmdlbnRzLkdldERhdGEoKTsNCisgICAgTW92ZVRvKHBQb2ludHNbMF0pOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxhc3Q7ICsraSkgew0KKyAgICAgICAgRlhfSU5UMzIgaiA9IGkgKyAxOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwMTsNCisgICAgICAgIHAxLlNldChwUG9pbnRzW2ldLnggKyBwVGFuZ2VudHNbaV0ueCwgcFBvaW50c1tpXS55ICsgcFRhbmdlbnRzW2ldLnkpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwMjsNCisgICAgICAgIHAyLlNldChwUG9pbnRzW2pdLnggLSBwVGFuZ2VudHNbal0ueCwgcFBvaW50c1tqXS55IC0gcFRhbmdlbnRzW2pdLnkpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwMzsNCisgICAgICAgIHAzLlNldChwUG9pbnRzW2pdLngsIHBQb2ludHNbal0ueSk7DQorICAgICAgICBCZXppZXJUbyhwMSwgcDIsIHAzKTsNCisgICAgfQ0KKyAgICBpZiAoYkNsb3NlZCkgew0KKyAgICAgICAgQ0ZYX1BvaW50RiBwMTsNCisgICAgICAgIHAxLlNldChwUG9pbnRzW2lMYXN0XS54ICsgcFRhbmdlbnRzW2lMYXN0XS54LCBwUG9pbnRzW2lMYXN0XS55ICsgcFRhbmdlbnRzW2lMYXN0XS55KTsNCisgICAgICAgIENGWF9Qb2ludEYgcDI7DQorICAgICAgICBwMi5TZXQocFBvaW50c1swXS54IC0gcFRhbmdlbnRzWzBdLngsIHBQb2ludHNbMF0ueSAtIHBUYW5nZW50c1swXS55KTsNCisgICAgICAgIENGWF9Qb2ludEYgcDM7DQorICAgICAgICBwMy5TZXQocFBvaW50c1swXS54LCBwUG9pbnRzWzBdLnkpOw0KKyAgICAgICAgQmV6aWVyVG8ocDEsIHAyLCBwMyk7DQorICAgICAgICBDbG9zZUZpZ3VyZSgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRFbGxpcHNlKGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIEZYX0ZMT0FUIGZTdGFydEFuZ2xlID0gMDsNCisgICAgRlhfRkxPQVQgZkVuZEFuZ2xlID0gRlhfUEkgLyAyOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgNDsgKytpKSB7DQorICAgICAgICBBcmNUbyhpID09IDAsIHJlY3QsIGZTdGFydEFuZ2xlLCBmRW5kQW5nbGUpOw0KKyAgICAgICAgZlN0YXJ0QW5nbGUgKz0gRlhfUEkgLyAyOw0KKyAgICAgICAgZkVuZEFuZ2xlICs9IEZYX1BJIC8gMjsNCisgICAgfQ0KKyAgICBDbG9zZUZpZ3VyZSgpOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkTGluZShjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MikNCit7DQorICAgIEZYX1BBVEhQT0lOVCAqcExhc3QgPSBHZXRMYXN0UG9pbnQoKTsNCisgICAgaWYgKHBMYXN0ID09IE5VTEwgfHwgRlhTWVNfZmFicyhwTGFzdC0+bV9Qb2ludFggLSBwdDEueCkgPiAwLjAwMSB8fCBGWFNZU19mYWJzKHBMYXN0LT5tX1BvaW50WSAtIHB0MS55KSA+IDAuMDAxKSB7DQorICAgICAgICBNb3ZlVG8ocHQxKTsNCisgICAgfQ0KKyAgICBMaW5lVG8ocHQyKTsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFkZFBhdGgoY29uc3QgSUZERV9QYXRoICpwU3JjLCBGWF9CT09MIGJDb25uZWN0KQ0KK3sNCisgICAgQ0ZERV9QYXRoICpwUGF0aCA9IChDRkRFX1BhdGgqKXBTcmM7DQorICAgIGlmIChwUGF0aCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcFBhdGgtPm1fUGF0aC5HZXRQb2ludENvdW50KCk7DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJDb25uZWN0KSB7DQorICAgICAgICBMaW5lVG8ocFBhdGgtPm1fUGF0aC5HZXRQb2ludFgoMCksIHBQYXRoLT5tX1BhdGguR2V0UG9pbnRZKDApKTsNCisgICAgfQ0KKyAgICBtX1BhdGguQXBwZW5kKCZwUGF0aC0+bV9QYXRoLCBOVUxMKTsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFkZFBvbHlnb24oY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cykNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBvaW50cy5HZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQWRkTGluZXMocG9pbnRzKTsNCisgICAgRlhfTFBDUE9JTlRGIHAgPSBwb2ludHMuR2V0RGF0YSgpOw0KKyAgICBpZiAoRlhTWVNfZmFicyhwWzBdLnggLSBwW2lDb3VudCAtIDFdLngpIDwgMC4wMWYgfHwgRlhTWVNfZmFicyhwWzBdLnkgLSBwW2lDb3VudCAtIDFdLnkpIDwgMC4wMWYpIHsNCisgICAgICAgIExpbmVUbyhwWzBdKTsNCisgICAgfQ0KKyAgICBDbG9zZUZpZ3VyZSgpOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkTGluZXMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cykNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBvaW50cy5HZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfTFBDUE9JTlRGIHAgPSBwb2ludHMuR2V0RGF0YSgpOw0KKyAgICBGWF9MUENQT0lOVEYgcEVuZCA9IHAgKyBpQ291bnQ7DQorICAgIE1vdmVUbyhwWzBdKTsNCisgICAgZm9yICgrK3A7IHAgPCBwRW5kOyArK3ApIHsNCisgICAgICAgIExpbmVUbygqcCk7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1BhdGg6OkFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBNb3ZlVG8ocmVjdC5Ub3BMZWZ0KCkpOw0KKyAgICBMaW5lVG8ocmVjdC5Ub3BSaWdodCgpKTsNCisgICAgTGluZVRvKHJlY3QuQm90dG9tUmlnaHQoKSk7DQorICAgIExpbmVUbyhyZWN0LkJvdHRvbUxlZnQoKSk7DQorICAgIENsb3NlRmlndXJlKCk7DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpHZXRCQm94KENGWF9SZWN0RiAmYmJveCkgY29uc3QNCit7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IG1fUGF0aC5HZXRCb3VuZGluZ0JveCgpOw0KKyAgICBiYm94LlNldChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOw0KKyAgICBiYm94Lk5vcm1hbGl6ZSgpOw0KK30NCit2b2lkIENGREVfUGF0aDo6R2V0QkJveChDRlhfUmVjdEYgJmJib3gsIEZYX0ZMT0FUIGZMaW5lV2lkdGgsIEZYX0ZMT0FUIGZNaXRlckxpbWl0KSBjb25zdA0KK3sNCisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KGZMaW5lV2lkdGgsIGZNaXRlckxpbWl0KTsNCisgICAgYmJveC5TZXQocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpKTsNCisgICAgYmJveC5Ob3JtYWxpemUoKTsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1MmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfR1JBUEhPQkpTX0lNUA0KKyNkZWZpbmUgX0ZERV9HUkFQSE9CSlNfSU1QDQorI2lmbmRlZiBfRkRFUExVUw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KK2NsYXNzIENGREVfR0VGb250TWdyOw0KK2NsYXNzIENGREVfUGF0aCA6IHB1YmxpYyBJRkRFX1BhdGgsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTdGFydEZpZ3VyZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlDbG9zZUZpZ3VyZSgpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBZGRCZXppZXIoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZEJlemllcnMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZEN1cnZlKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmKTsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBZGRMaW5lcyhjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKTsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkTGluZShjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0Mik7DQorICAgIHZpcnR1YWwJdm9pZAkJCUFkZFBhdGgoY29uc3QgSUZERV9QYXRoICpwU3JjLCBGWF9CT09MIGJDb25uZWN0KTsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkUG9seWdvbihjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKTsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkUmVjdGFuZ2xlKGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldEJCb3goQ0ZYX1JlY3RGICZiYm94KSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0QkJveChDRlhfUmVjdEYgJmJib3gsIEZYX0ZMT0FUIGZMaW5lV2lkdGgsIEZYX0ZMT0FUIGZNaXRlckxpbWl0KSBjb25zdDsNCisgICAgRlhfUEFUSFBPSU5UKgkJCUFkZFBvaW50cyhGWF9JTlQzMiBpQ291bnQpOw0KKyAgICBGWF9QQVRIUE9JTlQqCQkJR2V0TGFzdFBvaW50KEZYX0lOVDMyIGlDb3VudCA9IDEpIGNvbnN0Ow0KKyAgICBGWF9CT09MCQkJCQlGaWd1cmVDbG9zZWQoKSBjb25zdDsNCisgICAgdm9pZAkJCQkJTW92ZVRvKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZvaWQJCQkJCUxpbmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQkJCQlCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGICZwMSwgY29uc3QgQ0ZYX1BvaW50RiAmcDIsIGNvbnN0IENGWF9Qb2ludEYgJnAzKTsNCisgICAgdm9pZAkJCQkJQXJjVG8oRlhfQk9PTCBiU3RhcnQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgZW5kQW5nbGUpOw0KKyAgICB2b2lkCQkJCQlNb3ZlVG8oY29uc3QgQ0ZYX1BvaW50RiAmcDApDQorICAgIHsNCisgICAgICAgIE1vdmVUbyhwMC54LCBwMC55KTsNCisgICAgfQ0KKyAgICB2b2lkCQkJCQlMaW5lVG8oY29uc3QgQ0ZYX1BvaW50RiAmcDEpDQorICAgIHsNCisgICAgICAgIExpbmVUbyhwMS54LCBwMS55KTsNCisgICAgfQ0KKyAgICB2b2lkCQkJCQlHZXRDdXJ2ZVRhbmdlbnRzKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIENGWF9Qb2ludHNGICZ0YW5nZW50cywgRlhfQk9PTCBiQ2xvc2VkLCBGWF9GTE9BVCBmVGVuc2lvbikgY29uc3Q7DQorICAgIENGWF9QYXRoRGF0YQkJCW1fUGF0aDsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZlMGFhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmZGVfaXRlcmF0b3IuaCINCitJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKiBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjsNCit9DQorQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6Q0ZERV9WaXN1YWxTZXRJdGVyYXRvcigpDQorICAgIDogbV9kd0ZpbHRlcigwKQ0KK3sNCit9DQorQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6fkNGREVfVmlzdWFsU2V0SXRlcmF0b3IoKQ0KK3sNCisgICAgbV9DYW52YXNTdGFjay5SZW1vdmVBbGwoKTsNCit9DQorRlhfQk9PTCBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpBdHRhY2hDYW52YXMoSUZERV9DYW52YXNTZXQgKnBDYW52YXMpDQorew0KKyAgICBGWFNZU19hc3NlcnQocENhbnZhcyAhPSBOVUxMKTsNCisgICAgbV9DYW52YXNTdGFjay5SZW1vdmVBbGwoKTsNCisgICAgRkRFX0NBTlZBU0lURU0gY2FudmFzOw0KKyAgICBjYW52YXMuaENhbnZhcyA9IE5VTEw7DQorICAgIGNhbnZhcy5wQ2FudmFzID0gcENhbnZhczsNCisgICAgY2FudmFzLmhQb3MgPSBwQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKE5VTEwpOw0KKyAgICBpZiAoY2FudmFzLmhQb3MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBtX0NhbnZhc1N0YWNrLlB1c2goY2FudmFzKSA9PSAwOw0KK30NCitGWF9CT09MIENGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzICkNCit7DQorICAgIGlmIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd2hpbGUgKG1fQ2FudmFzU3RhY2suR2V0U2l6ZSgpID4gMSkgew0KKyAgICAgICAgbV9DYW52YXNTdGFjay5Qb3AoKTsNCisgICAgfQ0KKyAgICBtX2R3RmlsdGVyID0gZHdPYmplY3RzICYgfihGWF9EV09SRClGREVfVklTVUFMT0JKX1dpZGdldDsNCisgICAgaWYgKGR3T2JqZWN0cyAmIEZERV9WSVNVQUxPQkpfV2lkZ2V0KSB7DQorICAgICAgICBtX2R3RmlsdGVyIHw9IDB4RkYwMDsNCisgICAgfQ0KKyAgICBGREVfTFBDQU5WQVNJVEVNIHBDYW52YXMgPSBtX0NhbnZhc1N0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBDYW52YXMgIT0gTlVMTCAmJiBwQ2FudmFzLT5wQ2FudmFzICE9IE5VTEwpOw0KKyAgICBwQ2FudmFzLT5oUG9zID0gcENhbnZhcy0+cENhbnZhcy0+R2V0Rmlyc3RQb3NpdGlvbihOVUxMKTsNCisgICAgcmV0dXJuIHBDYW52YXMtPmhQb3MgIT0gTlVMTDsNCit9DQordm9pZCBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpSZXNldCgpDQorew0KKyAgICBGaWx0ZXJPYmplY3RzKG1fZHdGaWx0ZXIpOw0KK30NCitGREVfSFZJU1VBTE9CSiBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpHZXROZXh0KElGREVfVmlzdWFsU2V0IComcFZpc3VhbFNldCwgRkRFX0hWSVNVQUxPQkogKnBoQ2FudmFzT2JqICwgSUZERV9DYW52YXNTZXQgKipwcENhbnZhc1NldCApDQorew0KKyAgICB3aGlsZSAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICBGREVfTFBDQU5WQVNJVEVNIHBDYW52YXMgPSBtX0NhbnZhc1N0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwQ2FudmFzICE9IE5VTEwgJiYgcENhbnZhcy0+cENhbnZhcyAhPSBOVUxMKTsNCisgICAgICAgIGlmIChwQ2FudmFzLT5oUG9zID09IE5VTEwpIHsNCisgICAgICAgICAgICBpZiAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPT0gMSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9DYW52YXNTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBGREVfSFZJU1VBTE9CSiBoT2JqID0gcENhbnZhcy0+cENhbnZhcy0+R2V0TmV4dChwQ2FudmFzLT5oQ2FudmFzLCBwQ2FudmFzLT5oUG9zLCBwVmlzdWFsU2V0KTsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoaE9iaiAhPSBOVUxMKTsNCisgICAgICAgICAgICBGREVfVklTVUFMT0JKVFlQRSBlVHlwZSA9IHBWaXN1YWxTZXQtPkdldFR5cGUoKTsNCisgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX1ZJU1VBTE9CSl9DYW52YXMpIHsNCisgICAgICAgICAgICAgICAgRkRFX0NBTlZBU0lURU0gY2FudmFzOw0KKyAgICAgICAgICAgICAgICBjYW52YXMuaENhbnZhcyA9IGhPYmo7DQorICAgICAgICAgICAgICAgIGNhbnZhcy5wQ2FudmFzID0gKElGREVfQ2FudmFzU2V0KilwVmlzdWFsU2V0Ow0KKyAgICAgICAgICAgICAgICBjYW52YXMuaFBvcyA9IGNhbnZhcy5wQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKGhPYmopOw0KKyAgICAgICAgICAgICAgICBtX0NhbnZhc1N0YWNrLlB1c2goY2FudmFzKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3T2JqID0gKGVUeXBlID09IEZERV9WSVNVQUxPQkpfV2lkZ2V0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlhfRFdPUkQpKChJRkRFX1dpZGdldFNldCopcFZpc3VhbFNldCktPkdldFdpZGdldFR5cGUoaE9iaikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYX0RXT1JEKWVUeXBlOw0KKyAgICAgICAgICAgIGlmICgobV9kd0ZpbHRlciAmIGR3T2JqKSAhPSAwKSB7DQorICAgICAgICAgICAgICAgIGlmIChwcENhbnZhc1NldCkgew0KKyAgICAgICAgICAgICAgICAgICAgKnBwQ2FudmFzU2V0ID0gcENhbnZhcy0+cENhbnZhczsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocGhDYW52YXNPYmopIHsNCisgICAgICAgICAgICAgICAgICAgICpwaENhbnZhc09iaiA9IHBDYW52YXMtPmhDYW52YXM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGhPYmo7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSB3aGlsZSAocENhbnZhcy0+aFBvcyAhPSBOVUxMKTsNCisgICAgfQ0KKyAgICBpZiAocHBDYW52YXNTZXQpIHsNCisgICAgICAgICpwcENhbnZhc1NldCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKHBoQ2FudmFzT2JqKSB7DQorICAgICAgICAqcGhDYW52YXNPYmogPSBOVUxMOw0KKyAgICB9DQorICAgIHBWaXN1YWxTZXQgPSBOVUxMOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViZDVjNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfSVRFUkFUT1JfSU1QDQorI2RlZmluZSBfRkRFX0lURVJBVE9SX0lNUA0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ0FOVkFTSVRFTSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgICAgSUZERV9DYW52YXNTZXQJKnBDYW52YXM7DQorICAgIEZERV9IVklTVUFMT0JKCWhDYW52YXM7DQorICAgIEZYX1BPU0lUSU9OCQloUG9zOw0KK30gRkRFX0NBTlZBU0lURU0sICogRkRFX0xQQ0FOVkFTSVRFTTsNCitjbGFzcyBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yIDogcHVibGljIElGREVfVmlzdWFsU2V0SXRlcmF0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcigpOw0KKyAgICB+Q0ZERV9WaXN1YWxTZXRJdGVyYXRvcigpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRkRFX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUF0dGFjaENhbnZhcyhJRkRFX0NhbnZhc1NldCAqcENhbnZhcyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzID0gMHhGRkZGRkZGRik7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCk7DQorICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJR2V0TmV4dChJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQsIEZERV9IVklTVUFMT0JKICpwaENhbnZhc09iaiA9IE5VTEwsIElGREVfQ2FudmFzU2V0ICoqcHBDYW52YXNTZXQgPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0RXT1JECQkJCW1fZHdGaWx0ZXI7DQorICAgIENGWF9TdGFja1RlbXBsYXRlPEZERV9DQU5WQVNJVEVNPgltX0NhbnZhc1N0YWNrOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX29iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNTU1YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX29iamVjdC5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX29iamVjdC5oIg0KK0lGREVfUGVuKiBJRkRFX1Blbjo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGREVfTmV3IENGREVfUGVuKCk7DQorfQ0KK0lGREVfQnJ1c2gqIElGREVfQnJ1c2g6OkNyZWF0ZShGWF9JTlQzMiBpVHlwZSkNCit7DQorICAgIHN3aXRjaCAoaVR5cGUpIHsNCisgICAgICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9Tb2xpZDoNCisgICAgICAgICAgICByZXR1cm4gRkRFX05ldyBDRkRFX1NvbGlkQnJ1c2g7DQorICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfSGF0Y2g6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9IYXRjaEJydXNoOw0KKyAgICAgICAgY2FzZSBGREVfQlJVU0hUWVBFX1RleHR1cmU6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9UZXh0dXJlQnJ1c2g7DQorICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQ6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9MaW5lYXJCcnVzaDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNkNzdmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmgKQEAgLTAsMCArMSw0MjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0JBU0VPQkpFQ1RfSU1QDQorI2RlZmluZSBfRkRFX0JBU0VPQkpFQ1RfSU1QDQorY2xhc3MgQ0ZERV9QZW4gOiBwdWJsaWMgSUZERV9QZW4sIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9QZW4oKQ0KKyAgICAgICAgOiBtX0NvbG9yKDApDQorICAgICAgICAsIG1faUxpbmVDYXAoMCkNCisgICAgICAgICwgbV9pTGluZUpvaW4oMCkNCisgICAgICAgICwgbV9pRGFzaFN0eWxlKDApDQorICAgICAgICAsIG1fZkRhc2hQaGFzZSgwKQ0KKyAgICAgICAgLCBtX2ZNaXRlckxpbWl0KDEwKQ0KKyAgICAgICAgLCBtX2JBdXRvUmVsZWFzZShGQUxTRSkNCisgICAgICAgICwgbV9wQnJ1c2goTlVMTCkNCisgICAgew0KKyAgICB9DQorDQorICAgIH5DRkRFX1BlbigpDQorICAgIHsNCisgICAgICAgIGlmIChtX3BCcnVzaCAmJiBtX2JBdXRvUmVsZWFzZSkgew0KKyAgICAgICAgICAgIG1fcEJydXNoLT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFR5cGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wQnJ1c2ggPyBtX3BCcnVzaC0+R2V0VHlwZSgpIDogRkRFX1BFTlRZUEVfU29saWRDb2xvcjsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Q29sb3IoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Db2xvcjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikNCisgICAgew0KKyAgICAgICAgbV9Db2xvciA9IGNvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZERV9CcnVzaCoJCQlHZXRCcnVzaCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BCcnVzaDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0QnJ1c2goSUZERV9CcnVzaCAqcEJydXNoLCBGWF9CT09MIGJBdXRvUmVsZWFzZSkNCisgICAgew0KKyAgICAgICAgbV9iQXV0b1JlbGVhc2UgPSBiQXV0b1JlbGVhc2U7DQorICAgICAgICBtX3BCcnVzaCA9IHBCcnVzaDsNCisgICAgICAgIGlmIChtX3BCcnVzaCAmJiBtX3BCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfU29saWQpIHsNCisgICAgICAgICAgICBtX0NvbG9yID0gKChJRkRFX1NvbGlkQnJ1c2gqKW1fcEJydXNoKS0+R2V0Q29sb3IoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0TGluZUNhcCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lMaW5lQ2FwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRMaW5lQ2FwKEZYX0lOVDMyIGlMaW5lQ2FwKQ0KKyAgICB7DQorICAgICAgICBtX2lMaW5lQ2FwID0gaUxpbmVDYXA7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldERhc2hTdHlsZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lEYXNoU3R5bGU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVNldERhc2hTdHlsZShGWF9JTlQzMiBpRGFzaFN0eWxlKQ0KKyAgICB7DQorICAgICAgICBtX2lEYXNoU3R5bGUgPSBpRGFzaFN0eWxlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXREYXNoUGhhc2UoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9mRGFzaFBoYXNlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREYXNoUGhhc2UoRlhfRkxPQVQgZlBoYXNlKQ0KKyAgICB7DQorICAgICAgICBtX2ZEYXNoUGhhc2UgPSBmUGhhc2U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50RGFzaEFycmF5KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fRGFzaEFycmF5LkdldFNpemUoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0RGFzaEFycmF5KENGWF9GbG9hdEFycmF5ICZkYXNoQXJyYXkpIGNvbnN0DQorICAgIHsNCisgICAgICAgIGRhc2hBcnJheS5Db3B5KG1fRGFzaEFycmF5KTsNCisgICAgICAgIHJldHVybiBkYXNoQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREYXNoQXJyYXkoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkgJmRhc2hBcnJheSkNCisgICAgew0KKyAgICAgICAgbV9EYXNoQXJyYXkuQ29weShkYXNoQXJyYXkpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRMaW5lSm9pbigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lMaW5lSm9pbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TGluZUpvaW4oRlhfSU5UMzIgaUxpbmVKb2luKQ0KKyAgICB7DQorICAgICAgICBtX2lMaW5lSm9pbiA9IGlMaW5lSm9pbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWl0ZXJMaW1pdCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2ZNaXRlckxpbWl0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIGZNaXRlckxpbWl0KQ0KKyAgICB7DQorICAgICAgICBtX2ZNaXRlckxpbWl0ID0gZk1pdGVyTGltaXQ7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50Q29tcG91bmRQYXR0ZXJucygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0NvbXBvdW5kUGF0dGVybnMuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlHZXRDb21wb3VuZFBhdHRlcm5zKENGREVfQ29tcG91bmRQYXR0ZXJucyAmY29tcG91bmRQYXR0ZXJucykgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGNvbXBvdW5kUGF0dGVybnMuQ29weShtX0NvbXBvdW5kUGF0dGVybnMpLCBUUlVFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDb21wb3VuZFBhdHRlcm5zKGNvbnN0IENGREVfQ29tcG91bmRQYXR0ZXJucyAmY29tcG91bmRQYXR0ZXJucykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fQ29tcG91bmRQYXR0ZXJucy5Db3B5KGNvbXBvdW5kUGF0dGVybnMpLCBUUlVFOw0KKyAgICB9DQorDQorICAgIEZYX0FSR0IJCQkJCQltX0NvbG9yOw0KKyAgICBGWF9JTlQzMgkJCQkJbV9pTGluZUNhcDsNCisgICAgRlhfSU5UMzIJCQkJCW1faUxpbmVKb2luOw0KKyAgICBGWF9JTlQzMgkJCQkJbV9pRGFzaFN0eWxlOw0KKyAgICBGWF9GTE9BVAkJCQkJbV9mRGFzaFBoYXNlOw0KKyAgICBGWF9GTE9BVAkJCQkJbV9mTWl0ZXJMaW1pdDsNCisgICAgRlhfQk9PTAkJCQkJCW1fYkF1dG9SZWxlYXNlOw0KKyAgICBJRkRFX0JydXNoCQkJCQkqbV9wQnJ1c2g7DQorICAgIENGWF9GbG9hdEFycmF5CQkJCW1fRGFzaEFycmF5Ow0KKyAgICBDRkRFX0NvbXBvdW5kUGF0dGVybnMJCW1fQ29tcG91bmRQYXR0ZXJuczsNCit9Ow0KK2NsYXNzIENGREVfU29saWRCcnVzaCA6IHB1YmxpYyBJRkRFX1NvbGlkQnJ1c2gsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9Tb2xpZEJydXNoKCkgOiBtX0NvbG9yKDB4RkYwMDAwMDApDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LlJlc2V0KCk7DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFR5cGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkRFX0JSVVNIVFlQRV9Tb2xpZDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmCUdldE1hdHJpeCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX01hdHJpeDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXRNYXRyaXgoKQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5SZXNldCgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5UcmFuc2xhdGUoZHgsIGR5KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5TY2FsZShzeCwgc3kpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXggPSBtYXRyaXg7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fQ29sb3I7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpDQorICAgIHsNCisgICAgICAgIG1fQ29sb3IgPSBjb2xvcjsNCisgICAgfQ0KKw0KKyAgICBGWF9BUkdCCQkJCQkJbV9Db2xvcjsNCisgICAgQ0ZYX01hdHJpeAkJCQkJbV9NYXRyaXg7DQorfTsNCitjbGFzcyBDRkRFX0hhdGNoQnJ1c2ggOiBwdWJsaWMgSUZERV9IYXRjaEJydXNoLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfSGF0Y2hCcnVzaCgpIDogbV9pU3R5bGUoLTEpLCBtX0JhY2tDb2xvcigwKSwgbV9Gb3JlQ29sb3IoMCkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXguUmVzZXQoKTsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGREVfQlJVU0hUWVBFX0hhdGNoOw0KKyAgICB9DQorICAgIHZpcnR1YWwgY29uc3QgQ0ZYX01hdHJpeCYJR2V0TWF0cml4KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTWF0cml4Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZXNldE1hdHJpeCgpDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LlJlc2V0KCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVRyYW5zbGF0ZU1hdHJpeChGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LlRyYW5zbGF0ZShkeCwgZHkpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSb3RhdGVNYXRyaXgoRlhfRkxPQVQgZlJhZGlhbikNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXguUm90YXRlKGZSYWRpYW4pOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTY2FsZU1hdHJpeChGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3kpDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LlNjYWxlKHN4LCBzeSk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCUNvbmNhdE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeCA9IG1hdHJpeDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Q29sb3IoRlhfQk9PTCBiRm9yZWdyb3VuZENvbG9yKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gYkZvcmVncm91bmRDb2xvciA/IG1fRm9yZUNvbG9yIDogbV9CYWNrQ29sb3I7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IsIEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikNCisgICAgew0KKyAgICAgICAgaWYgKGJGb3JlZ3JvdW5kQ29sb3IpIHsNCisgICAgICAgICAgICBtX0ZvcmVDb2xvciA9IGNvbG9yOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX0JhY2tDb2xvciA9IGNvbG9yOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRIYXRjaFN0eWxlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faVN0eWxlOw0KKyAgICB9Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0SGF0Y2hTdHlsZShGWF9JTlQzMiBpSGF0Y2hTdHlsZSkNCisgICAgew0KKyAgICAgICAgbV9pU3R5bGUgPSBpSGF0Y2hTdHlsZTsNCisgICAgICAgIHJldHVybiBtX2lTdHlsZSA+PSBGREVfSEFUQ0hTVFlMRV9NaW4gJiYgbV9pU3R5bGUgPD0gRkRFX0hBVENIU1RZTEVfTWF4Ow0KKyAgICB9DQorICAgIEZYX0lOVDMyCQkJCQltX2lTdHlsZTsNCisgICAgRlhfQVJHQgkJCQkJCW1fQmFja0NvbG9yOw0KKyAgICBGWF9BUkdCCQkJCQkJbV9Gb3JlQ29sb3I7DQorICAgIENGWF9NYXRyaXgJCQkJCW1fTWF0cml4Ow0KK307DQorY2xhc3MgQ0ZERV9UZXh0dXJlQnJ1c2ggOiBwdWJsaWMgSUZERV9UZXh0dXJlQnJ1c2gsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9UZXh0dXJlQnJ1c2goKQ0KKyAgICAgICAgOiBtX2lXcmFwKDApDQorICAgICAgICAsIG1fcEltYWdlKE5VTEwpDQorICAgICAgICAsIG1fYkF1dG9SZWxlYXNlKEZBTFNFKQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5SZXNldCgpOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRkRFX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZERV9CUlVTSFRZUEVfVGV4dHVyZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmCUdldE1hdHJpeCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX01hdHJpeDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXRNYXRyaXgoKQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5SZXNldCgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5UcmFuc2xhdGUoZHgsIGR5KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5TY2FsZShzeCwgc3kpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXggPSBtYXRyaXg7DQorICAgIH0NCisgICAgdmlydHVhbCBJRkRFX0ltYWdlKgkJCUdldEltYWdlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEltYWdlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRJbWFnZShJRkRFX0ltYWdlICpwSW1hZ2UsIEZYX0JPT0wgYkF1dG9SZWxlYXNlKQ0KKyAgICB7DQorICAgICAgICBtX3BJbWFnZSA9IHBJbWFnZTsNCisgICAgICAgIG1fYkF1dG9SZWxlYXNlID0gYkF1dG9SZWxlYXNlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRXcmFwTW9kZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lXcmFwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRXcmFwTW9kZShGWF9JTlQzMiBpV3JhcE1vZGUpDQorICAgIHsNCisgICAgICAgIG1faVdyYXAgPSBpV3JhcE1vZGU7DQorICAgIH0NCisgICAgRlhfSU5UMzIJCQkJCW1faVdyYXA7DQorICAgIElGREVfSW1hZ2UJCQkJCSptX3BJbWFnZTsNCisgICAgRlhfQk9PTAkJCQkJCW1fYkF1dG9SZWxlYXNlOw0KKyAgICBDRlhfTWF0cml4CQkJCQltX01hdHJpeDsNCit9Ow0KK2NsYXNzIENGREVfTGluZWFyQnJ1c2ggOiBwdWJsaWMgSUZERV9MaW5lYXJHcmFkaWVudEJydXNoLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfTGluZWFyQnJ1c2goKSA6IG1fRW5kQ29sb3IoMCksIG1fU3RhcnRDb2xvcigwKSwgbV9pV3JhcE1vZGUoMCkNCisgICAgew0KKyAgICAgICAgbV9TdGFydFBvaW50LnggPSBtX1N0YXJ0UG9pbnQueSA9IG1fRW5kUG9pbnQueCA9IG1fRW5kUG9pbnQueSA9IDA7DQorICAgICAgICBtX01hdHJpeC5SZXNldCgpOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRkRFX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQ7DQorICAgIH0NCisgICAgdmlydHVhbCBjb25zdCBDRlhfTWF0cml4JglHZXRNYXRyaXgoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9NYXRyaXg7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0TWF0cml4KCkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXguUmVzZXQoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJVHJhbnNsYXRlTWF0cml4KEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXguVHJhbnNsYXRlKGR4LCBkeSk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKQ0KKyAgICB7DQorICAgICAgICBtX01hdHJpeC5Sb3RhdGUoZlJhZGlhbik7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXguU2NhbGUoc3gsIHN5KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCisgICAgew0KKyAgICAgICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQorICAgIHsNCisgICAgICAgIG1fTWF0cml4ID0gbWF0cml4Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRMaW5lYXJQb2ludHMoQ0ZYX1BvaW50RiAmc3RhcnRpbmdQb2ludCwgQ0ZYX1BvaW50RiAmZW5kaW5nUG9pbnQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHN0YXJ0aW5nUG9pbnQgPSBtX1N0YXJ0UG9pbnQ7DQorICAgICAgICBlbmRpbmdQb2ludCA9IG1fRW5kUG9pbnQ7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVNldExpbmVhclBvaW50cyhjb25zdCBDRlhfUG9pbnRGICZzdGFydGluZ1BvaW50LCBjb25zdCBDRlhfUG9pbnRGICZlbmRpbmdQb2ludCkNCisgICAgew0KKyAgICAgICAgbV9TdGFydFBvaW50ID0gc3RhcnRpbmdQb2ludDsNCisgICAgICAgIG1fRW5kUG9pbnQgPSBlbmRpbmdQb2ludDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0TGluZWFyQ29sb3JzKEZYX0FSR0IgJnN0YXJ0aW5nQ29sb3IsIEZYX0FSR0IgJmVuZGluZ0NvbG9yKSBjb25zdA0KKyAgICB7DQorICAgICAgICBzdGFydGluZ0NvbG9yID0gbV9TdGFydENvbG9yOw0KKyAgICAgICAgZW5kaW5nQ29sb3IgPSBtX0VuZENvbG9yOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRMaW5lYXJDb2xvcnMoY29uc3QgRlhfQVJHQiAmc3RhcnRpbmdDb2xvciwgY29uc3QgRlhfQVJHQiAmZW5kaW5nQ29sb3IpDQorICAgIHsNCisgICAgICAgIG1fU3RhcnRDb2xvciA9IHN0YXJ0aW5nQ29sb3I7DQorICAgICAgICBtX0VuZENvbG9yID0gZW5kaW5nQ29sb3I7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50R3JhZGllbnRDb2xvcnMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9HcmFkQ29sb3JzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHcmFkaWVudENvbG9ycyhDRkRFX0dyYWRpZW50Q29sb3JzICZjb2xvcnMpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBjb2xvcnMuQ29weShtX0dyYWRDb2xvcnMpLCBUUlVFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEdyYWRpZW50Q29sb3JzKGNvbnN0IENGREVfR3JhZGllbnRDb2xvcnMgJmNvbG9ycykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fR3JhZENvbG9ycy5Db3B5KGNvbG9ycyksIFRSVUU7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFdyYXBNb2RlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faVdyYXBNb2RlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRXcmFwTW9kZShGWF9JTlQzMiBpV3JhcE1vZGUpDQorICAgIHsNCisgICAgICAgIG1faVdyYXBNb2RlID0gaVdyYXBNb2RlOw0KKyAgICB9DQorICAgIENGWF9Qb2ludEYJCQkJCW1fRW5kUG9pbnQ7DQorICAgIENGWF9Qb2ludEYJCQkJCW1fU3RhcnRQb2ludDsNCisgICAgRlhfQVJHQgkJCQkJCW1fRW5kQ29sb3I7DQorICAgIEZYX0FSR0IJCQkJCQltX1N0YXJ0Q29sb3I7DQorICAgIENGREVfR3JhZGllbnRDb2xvcnMJCQltX0dyYWRDb2xvcnM7DQorICAgIEZYX0lOVDMyCQkJCQltX2lXcmFwTW9kZTsNCisgICAgQ0ZYX01hdHJpeAkJCQkJbV9NYXRyaXg7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGU5MTQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmNwcApAQCAtMCwwICsxLDI1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX3JlbmRlci5oIg0KK3ZvaWQgRkRFX0dldFBhZ2VNYXRyaXgoQ0ZYX01hdHJpeCAmcGFnZU1hdHJpeCwgY29uc3QgQ0ZYX1JlY3RGICZkb2NQYWdlUmVjdCwgY29uc3QgQ0ZYX1JlY3QgJmRldmljZVBhZ2VSZWN0LCBGWF9JTlQzMiBpUm90YXRlLCBGWF9EV09SRCBkd0Nvb3JkaW5hdGVzVHlwZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChpUm90YXRlID49IDAgJiYgaVJvdGF0ZSA8PSAzKTsNCisgICAgRlhfQk9PTCBiRmxpcFggPSAoZHdDb29yZGluYXRlc1R5cGUgJiAweDAxKSAhPSAwOw0KKyAgICBGWF9CT09MIGJGbGlwWSA9IChkd0Nvb3JkaW5hdGVzVHlwZSAmIDB4MDIpICE9IDA7DQorICAgIENGWF9NYXRyaXggbTsNCisgICAgbS5TZXQoKGJGbGlwWCA/IC0xLjBmIDogMS4wZiksIDAsIDAsIChiRmxpcFkgPyAtMS4wZiA6IDEuMGYpLCAwLCAwKTsNCisgICAgaWYgKGlSb3RhdGUgPT0gMCB8fCBpUm90YXRlID09IDIpIHsNCisgICAgICAgIG0uYSAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3Qud2lkdGggLyBkb2NQYWdlUmVjdC53aWR0aDsNCisgICAgICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuaGVpZ2h0IC8gZG9jUGFnZVJlY3QuaGVpZ2h0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbS5hICo9IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5oZWlnaHQgLyBkb2NQYWdlUmVjdC53aWR0aDsNCisgICAgICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3Qud2lkdGggLyBkb2NQYWdlUmVjdC5oZWlnaHQ7DQorICAgIH0NCisgICAgbS5Sb3RhdGUoaVJvdGF0ZSAqIDEuNTcwNzk2MzI2NzVmKTsNCisgICAgc3dpdGNoIChpUm90YXRlKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgbS5lID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCkgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QubGVmdDsNCisgICAgICAgICAgICBtLmYgPSBiRmxpcFkgPyAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuYm90dG9tKCkgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QudG9wOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIG0uZSA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0IDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7DQorICAgICAgICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBtLmUgPSBiRmxpcFggPyAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QubGVmdCA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpOw0KKyAgICAgICAgICAgIG0uZiA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC50b3AgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuYm90dG9tKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgbS5lID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCkgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QubGVmdDsNCisgICAgICAgICAgICBtLmYgPSBiRmxpcFggPyAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QudG9wIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBwYWdlTWF0cml4ID0gbTsNCit9DQorSUZERV9SZW5kZXJDb250ZXh0KiBJRkRFX1JlbmRlckNvbnRleHQ6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRkRFX05ldyBDRkRFX1JlbmRlckNvbnRleHQ7DQorfQ0KK0NGREVfUmVuZGVyQ29udGV4dDo6Q0ZERV9SZW5kZXJDb250ZXh0KCkNCisgICAgOiBDRlhfVGhyZWFkTG9jaygpDQorICAgICwgbV9lU3RhdHVzKEZERV9SRU5ERVJTVEFUVVNfUmVzZXQpDQorICAgICwgbV9wUmVuZGVyRGV2aWNlKE5VTEwpDQorICAgICwgbV9wU29saWRCcnVzaChOVUxMKQ0KKyAgICAsIG1fVHJhbnNmb3JtKCkNCisgICAgLCBtX3BDaGFyUG9zKE5VTEwpDQorICAgICwgbV9pQ2hhclBvc0NvdW50KDApDQorICAgICwgbV9wSXRlcmF0b3IoTlVMTCkNCit7DQorICAgIG1fVHJhbnNmb3JtLlJlc2V0KCk7DQorfQ0KK0NGREVfUmVuZGVyQ29udGV4dDo6fkNGREVfUmVuZGVyQ29udGV4dCgpDQorew0KKyAgICBTdG9wUmVuZGVyKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9SZW5kZXJDb250ZXh0OjpTdGFydFJlbmRlcihJRkRFX1JlbmRlckRldmljZSAqcFJlbmRlckRldmljZSwgSUZERV9DYW52YXNTZXQgKnBDYW52YXNTZXQsIGNvbnN0IENGWF9NYXRyaXggJnRtRG9jMkRldmljZSApDQorew0KKyAgICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocFJlbmRlckRldmljZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBDYW52YXNTZXQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIExvY2soKTsNCisgICAgbV9lU3RhdHVzID0gRkRFX1JFTkRFUlNUQVRVU19QYXVzZWQ7DQorICAgIG1fcFJlbmRlckRldmljZSA9IHBSZW5kZXJEZXZpY2U7DQorICAgIG1fVHJhbnNmb3JtID0gdG1Eb2MyRGV2aWNlOw0KKyAgICBpZiAobV9wSXRlcmF0b3IgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wSXRlcmF0b3IgPSBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpDcmVhdGUoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX3BJdGVyYXRvciAhPSBOVUxMKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJBdHRhY2ggPSBtX3BJdGVyYXRvci0+QXR0YWNoQ2FudmFzKHBDYW52YXNTZXQpICYmIG1fcEl0ZXJhdG9yLT5GaWx0ZXJPYmplY3RzKCk7DQorICAgIFVubG9jaygpOw0KKyAgICByZXR1cm4gYkF0dGFjaDsNCit9DQorRkRFX1JFTkRFUlNUQVRVUyBDRkRFX1JlbmRlckNvbnRleHQ6OkRvUmVuZGVyKElGWF9QYXVzZSAqcFBhdXNlKQ0KK3sNCisgICAgaWYgKG1fcFJlbmRlckRldmljZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkRFX1JFTkRFUlNUQVRVU19GYWlsZWQ7DQorICAgIH0NCisgICAgaWYgKG1fcEl0ZXJhdG9yID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGREVfUkVOREVSU1RBVFVTX0ZhaWxlZDsNCisgICAgfQ0KKyAgICBMb2NrKCk7DQorICAgIEZERV9SRU5ERVJTVEFUVVMgZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkOw0KKyAgICBDRlhfTWF0cml4IHJtOw0KKyAgICBybS5TZXRSZXZlcnNlKG1fVHJhbnNmb3JtKTsNCisgICAgQ0ZYX1JlY3RGIHJ0RG9jQ2xpcCA9IG1fcFJlbmRlckRldmljZS0+R2V0Q2xpcFJlY3QoKTsNCisgICAgaWYgKHJ0RG9jQ2xpcC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJ0RG9jQ2xpcC5sZWZ0ID0gcnREb2NDbGlwLnRvcCA9IDA7DQorICAgICAgICBydERvY0NsaXAud2lkdGggPSAoRlhfRkxPQVQpbV9wUmVuZGVyRGV2aWNlLT5HZXRXaWR0aCgpOw0KKyAgICAgICAgcnREb2NDbGlwLmhlaWdodCA9IChGWF9GTE9BVCltX3BSZW5kZXJEZXZpY2UtPkdldEhlaWdodCgpOw0KKyAgICB9DQorICAgIHJtLlRyYW5zZm9ybVJlY3QocnREb2NDbGlwKTsNCisgICAgSUZERV9WaXN1YWxTZXQgKnBWaXN1YWxTZXQ7DQorICAgIEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmo7DQorICAgIENGWF9SZWN0RiBydE9iajsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgd2hpbGUoVFJVRSkgew0KKyAgICAgICAgaFZpc3VhbE9iaiA9IG1fcEl0ZXJhdG9yLT5HZXROZXh0KHBWaXN1YWxTZXQpOw0KKyAgICAgICAgaWYgKGhWaXN1YWxPYmogPT0gTlVMTCB8fCBwVmlzdWFsU2V0ID09IE5VTEwpIHsNCisgICAgICAgICAgICBlU3RhdHVzID0gRkRFX1JFTkRFUlNUQVRVU19Eb25lOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcnRPYmouRW1wdHkoKTsNCisgICAgICAgIHBWaXN1YWxTZXQtPkdldFJlY3QoaFZpc3VhbE9iaiwgcnRPYmopOw0KKyAgICAgICAgaWYgKCFydERvY0NsaXAuSW50ZXJzZWN0V2l0aChydE9iaikpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAocFZpc3VhbFNldC0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfVklTVUFMT0JKX1RleHQ6DQorICAgICAgICAgICAgICAgIFJlbmRlclRleHQoKElGREVfVGV4dFNldCopcFZpc3VhbFNldCwgaFZpc3VhbE9iaik7DQorICAgICAgICAgICAgICAgIGlDb3VudCArPSA1Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9WSVNVQUxPQkpfUGF0aDoNCisgICAgICAgICAgICAgICAgUmVuZGVyUGF0aCgoSUZERV9QYXRoU2V0KilwVmlzdWFsU2V0LCBoVmlzdWFsT2JqKTsNCisgICAgICAgICAgICAgICAgaUNvdW50ICs9IDIwOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9WSVNVQUxPQkpfV2lkZ2V0Og0KKyAgICAgICAgICAgICAgICBpQ291bnQgKz0gMTA7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9DYW52YXM6DQorICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlDb3VudCA+PSAxMDAgJiYgcFBhdXNlICE9IE5VTEwgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIFVubG9jaygpOw0KKyAgICByZXR1cm4gbV9lU3RhdHVzID0gZVN0YXR1czsNCit9DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlN0b3BSZW5kZXIoKQ0KK3sNCisgICAgTG9jaygpOw0KKyAgICBtX2VTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1Jlc2V0Ow0KKyAgICBtX3BSZW5kZXJEZXZpY2UgPSBOVUxMOw0KKyAgICBtX1RyYW5zZm9ybS5SZXNldCgpOw0KKyAgICBpZiAobV9wSXRlcmF0b3IgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcEl0ZXJhdG9yID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wU29saWRCcnVzaCAhPSBOVUxMKSB7DQorICAgICAgICBtX3BTb2xpZEJydXNoLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTb2xpZEJydXNoID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICBGREVfRnJlZShtX3BDaGFyUG9zKTsNCisgICAgICAgIG1fcENoYXJQb3MgPSBOVUxMOw0KKyAgICB9DQorICAgIG1faUNoYXJQb3NDb3VudCA9IDA7DQorICAgIFVubG9jaygpOw0KK30NCit2b2lkIENGREVfUmVuZGVyQ29udGV4dDo6UmVuZGVyVGV4dChJRkRFX1RleHRTZXQgKnBUZXh0U2V0LCBGREVfSFZJU1VBTE9CSiBoVGV4dCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGV4dFNldCAhPSBOVUxMICYmIGhUZXh0ICE9IE5VTEwpOw0KKyAgICBJRlhfRm9udCAqcEZvbnQgPSBwVGV4dFNldC0+R2V0Rm9udChoVGV4dCk7DQorICAgIGlmIChwRm9udCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcFRleHRTZXQtPkdldERpc3BsYXlQb3MoaFRleHQsIE5VTEwsIEZBTFNFKTsNCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9wU29saWRCcnVzaCA9PSBOVUxMKSB7DQorICAgICAgICBtX3BTb2xpZEJydXNoID0gKElGREVfU29saWRCcnVzaCopSUZERV9CcnVzaDo6Q3JlYXRlKEZERV9CUlVTSFRZUEVfU29saWQpOw0KKyAgICAgICAgaWYgKG1fcFNvbGlkQnJ1c2ggPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9wQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgICAgICBtX3BDaGFyUG9zID0gKEZYVEVYVF9DSEFSUE9TKilGREVfQWxsb2Moc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlDb3VudCk7DQorICAgIH0gZWxzZSBpZiAobV9pQ2hhclBvc0NvdW50IDwgaUNvdW50KSB7DQorICAgICAgICBtX3BDaGFyUG9zID0gKEZYVEVYVF9DSEFSUE9TKilGREVfUmVhbGxvYyhtX3BDaGFyUG9zLCBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUNvdW50KTsNCisgICAgfQ0KKyAgICBpZiAobV9pQ2hhclBvc0NvdW50IDwgaUNvdW50KSB7DQorICAgICAgICBtX2lDaGFyUG9zQ291bnQgPSBpQ291bnQ7DQorICAgIH0NCisgICAgaUNvdW50ID0gcFRleHRTZXQtPkdldERpc3BsYXlQb3MoaFRleHQsIG1fcENoYXJQb3MsIEZBTFNFKTsNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFRleHRTZXQtPkdldEZvbnRTaXplKGhUZXh0KTsNCisgICAgRlhfQVJHQiBkd0NvbG9yID0gcFRleHRTZXQtPkdldEZvbnRDb2xvcihoVGV4dCk7DQorICAgIG1fcFNvbGlkQnJ1c2gtPlNldENvbG9yKGR3Q29sb3IpOw0KKyAgICBGREVfSERFVklDRVNUQVRFIGhTdGF0ZTsNCisgICAgRlhfQk9PTCBiQ2xpcCA9IEFwcGx5Q2xpcChwVGV4dFNldCwgaFRleHQsIGhTdGF0ZSk7DQorICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1N0cmluZyhtX3BTb2xpZEJydXNoLCBwRm9udCwgbV9wQ2hhclBvcywgaUNvdW50LCBmRm9udFNpemUsICZtX1RyYW5zZm9ybSk7DQorICAgIGlmIChiQ2xpcCkgew0KKyAgICAgICAgUmVzdG9yZUNsaXAoaFN0YXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGREVfUmVuZGVyQ29udGV4dDo6UmVuZGVyUGF0aChJRkRFX1BhdGhTZXQgKnBQYXRoU2V0LCBGREVfSFZJU1VBTE9CSiBoUGF0aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChwUGF0aFNldCAhPSBOVUxMICYmIGhQYXRoICE9IE5VTEwpOw0KKyAgICBJRkRFX1BhdGggKnBQYXRoID0gcFBhdGhTZXQtPkdldFBhdGgoaFBhdGgpOw0KKyAgICBpZiAocFBhdGggPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZERV9IREVWSUNFU1RBVEUgaFN0YXRlOw0KKyAgICBGWF9CT09MIGJDbGlwID0gQXBwbHlDbGlwKHBQYXRoU2V0LCBoUGF0aCwgaFN0YXRlKTsNCisgICAgRlhfSU5UMzIgaVJlbmRlck1vZGUgPSBwUGF0aFNldC0+R2V0UmVuZGVyTW9kZShoUGF0aCk7DQorICAgIGlmIChpUmVuZGVyTW9kZSAmIEZERV9QQVRIUkVOREVSX1N0cm9rZSkgew0KKyAgICAgICAgSUZERV9QZW4gKnBQZW4gPSBwUGF0aFNldC0+R2V0UGVuKGhQYXRoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBQYXRoU2V0LT5HZXRQZW5XaWR0aChoUGF0aCk7DQorICAgICAgICBpZiAocFBlbiAhPSBOVUxMICYmIGZXaWR0aCA+IDApIHsNCisgICAgICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdQYXRoKHBQZW4sIGZXaWR0aCwgcFBhdGgsICZtX1RyYW5zZm9ybSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlSZW5kZXJNb2RlICYgRkRFX1BBVEhSRU5ERVJfRmlsbCkgew0KKyAgICAgICAgSUZERV9CcnVzaCAqcEJydXNoID0gcFBhdGhTZXQtPkdldEJydXNoKGhQYXRoKTsNCisgICAgICAgIGlmIChwQnJ1c2ggIT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcFJlbmRlckRldmljZS0+RmlsbFBhdGgocEJydXNoLCBwUGF0aCwgJm1fVHJhbnNmb3JtKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkNsaXApIHsNCisgICAgICAgIFJlc3RvcmVDbGlwKGhTdGF0ZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRkRFX1JlbmRlckNvbnRleHQ6OkFwcGx5Q2xpcChJRkRFX1Zpc3VhbFNldCAqcFZpc3VhbFNldCwgRkRFX0hWSVNVQUxPQkogaE9iaiwgRkRFX0hERVZJQ0VTVEFURSAmaFN0YXRlKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0Q2xpcDsNCisgICAgaWYgKCFwVmlzdWFsU2V0LT5HZXRDbGlwKGhPYmosIHJ0Q2xpcCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRPYmo7DQorICAgIHBWaXN1YWxTZXQtPkdldFJlY3QoaE9iaiwgcnRPYmopOw0KKyAgICBydENsaXAuT2Zmc2V0KHJ0T2JqLmxlZnQsIHJ0T2JqLnRvcCk7DQorICAgIG1fVHJhbnNmb3JtLlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgICAgY29uc3QgQ0ZYX1JlY3RGICZydERldkNsaXAgPSBtX3BSZW5kZXJEZXZpY2UtPkdldENsaXBSZWN0KCk7DQorICAgIHJ0Q2xpcC5JbnRlcnNlY3QocnREZXZDbGlwKTsNCisgICAgaFN0YXRlID0gbV9wUmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgICAgcmV0dXJuIG1fcFJlbmRlckRldmljZS0+U2V0Q2xpcFJlY3QocnRDbGlwKTsNCit9DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlJlc3RvcmVDbGlwKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKQ0KK3sNCisgICAgbV9wUmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoaFN0YXRlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk5ODdhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfUkVOREVSX0lNUA0KKyNkZWZpbmUgX0ZERV9SRU5ERVJfSU1QDQorY2xhc3MgQ0ZERV9SZW5kZXJDb250ZXh0Ow0KK2NsYXNzIENGREVfUmVuZGVyQ29udGV4dCA6IHB1YmxpYyBJRkRFX1JlbmRlckNvbnRleHQsIHB1YmxpYyBDRlhfVGhyZWFkTG9jaywgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1JlbmRlckNvbnRleHQoKTsNCisgICAgdmlydHVhbCB+Q0ZERV9SZW5kZXJDb250ZXh0KCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRkRFX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTdGFydFJlbmRlcihJRkRFX1JlbmRlckRldmljZSAqcFJlbmRlckRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0ICpwQ2FudmFzU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCAmdG1Eb2MyRGV2aWNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQorICAgIHZpcnR1YWwgRkRFX1JFTkRFUlNUQVRVUwlHZXRTdGF0dXMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9lU3RhdHVzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX1JFTkRFUlNUQVRVUwlEb1JlbmRlcihJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU3RvcFJlbmRlcigpOw0KKyAgICB2b2lkCQkJCVJlbmRlclBhdGgoSUZERV9QYXRoU2V0ICpwUGF0aFNldCwgRkRFX0hWSVNVQUxPQkogaFBhdGgpOw0KKyAgICB2b2lkCQkJCVJlbmRlclRleHQoSUZERV9UZXh0U2V0ICpwVGV4dFNldCwgRkRFX0hWSVNVQUxPQkogaFRleHQpOw0KKyAgICBGWF9CT09MCQkJCUFwcGx5Q2xpcChJRkRFX1Zpc3VhbFNldCAqcFZpc3VhbFNldCwgRkRFX0hWSVNVQUxPQkogaE9iaiwgRkRFX0hERVZJQ0VTVEFURSAmaFN0YXRlKTsNCisgICAgdm9pZAkJCQlSZXN0b3JlQ2xpcChGREVfSERFVklDRVNUQVRFIGhTdGF0ZSk7DQorcHJvdGVjdGVkOg0KKyAgICBGREVfUkVOREVSU1RBVFVTCQltX2VTdGF0dXM7DQorICAgIElGREVfUmVuZGVyRGV2aWNlCQkqbV9wUmVuZGVyRGV2aWNlOw0KKyAgICBJRkRFX1NvbGlkQnJ1c2gJCQkqbV9wU29saWRCcnVzaDsNCisgICAgQ0ZYX01hdHJpeAkJCQltX1RyYW5zZm9ybTsNCisgICAgRlhURVhUX0NIQVJQT1MJCQkqbV9wQ2hhclBvczsNCisgICAgRlhfSU5UMzIJCQkJbV9pQ2hhclBvc0NvdW50Ow0KKyAgICBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yCSptX3BJdGVyYXRvcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuY3BwIGIveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzNjIwMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuY3BwCkBAIC0wLDAgKzEsOTUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmZGVfdGV4dG91dC5oIg0KK0lGREVfVGV4dE91dCogSUZERV9UZXh0T3V0OjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZERV9OZXcgQ0ZERV9UZXh0T3V0Ow0KK30NCitDRkRFX1RleHRPdXQ6OkNGREVfVGV4dE91dCgpDQorICAgIDogbV9wRm9udChOVUxMKQ0KKyAgICAsIG1fZkZvbnRTaXplKDEyLjBmKQ0KKyAgICAsIG1fZkxpbmVTcGFjZShtX2ZGb250U2l6ZSkNCisgICAgLCBtX2ZMaW5lUG9zKDAuMGYpDQorICAgICwgbV9mVG9sZXJhbmNlKDAuMGYpDQorICAgICwgbV9pQWxpZ25tZW50KDApDQorICAgICwgbV9pVHh0QmtBbGlnbm1lbnQoMCkNCisgICAgLCBtX3BDaGFyV2lkdGhzKE5VTEwpDQorICAgICwgbV9pQ2hhcnMoMCkNCisgICAgLCBtX3BFbGxDaGFyV2lkdGhzKE5VTEwpDQorICAgICwgbV9pRWxsQ2hhcnMoMCkNCisgICAgLCBtX3dQYXJhZ3JhcGhCa0NoYXIoTCdcbicpDQorICAgICwgbV9UeHRDb2xvcigweEZGMDAwMDAwKQ0KKyAgICAsIG1fZHdTdHlsZXMoMCkNCisgICAgLCBtX2R3VHh0QmtTdHlsZXMoMCkNCisgICAgLCBtX2JFbGxpQ2hhbmdlZChGQUxTRSkNCisgICAgLCBtX2lFbGxpcHNpc1dpZHRoKDApDQorICAgICwgbV90dG9MaW5lcyg1KQ0KKyAgICAsIG1faUN1ckxpbmUoMCkNCisgICAgLCBtX2lUb3RhbExpbmVzKDApDQorICAgICwgbV9pQ3VyUGllY2UoMCkNCisgICAgLCBtX3BDaGFyUG9zKE5VTEwpDQorICAgICwgbV9pQ2hhclBvc1NpemUoMCkNCisgICAgLCBtX3BSZW5kZXJEZXZpY2UoTlVMTCkNCit7DQorICAgIG1fcFR4dEJyZWFrID0gSUZYX1R4dEJyZWFrOjpDcmVhdGUoRlhfVFhUQlJFQUtQT0xJQ1lfTm9uZSk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BUeHRCcmVhayAhPSBOVUxMKTsNCisgICAgbV9NYXRyaXguUmVzZXQoKTsNCisgICAgbV9ydENsaXAuUmVzZXQoKTsNCisgICAgbV9ydExvZ2ljQ2xpcC5SZXNldCgpOw0KK30NCitDRkRFX1RleHRPdXQ6On5DRkRFX1RleHRPdXQoKQ0KK3sNCisgICAgaWYgKG1fcFR4dEJyZWFrICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFR4dEJyZWFrLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgaWYgKG1fcENoYXJXaWR0aHMgIT0gTlVMTCkgew0KKyAgICAgICAgRkRFX0ZyZWUobV9wQ2hhcldpZHRocyk7DQorICAgIH0NCisgICAgaWYgKG1fcEVsbENoYXJXaWR0aHMgIT0gTlVMTCkgew0KKyAgICAgICAgRkRFX0ZyZWUobV9wRWxsQ2hhcldpZHRocyk7DQorICAgIH0NCisgICAgaWYgKG1fcFJlbmRlckRldmljZSAhPSBOVUxMKSB7DQorICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICBGREVfRnJlZShtX3BDaGFyUG9zKTsNCisgICAgfQ0KKyAgICBtX3R0b0xpbmVzLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0Rm9udChJRlhfRm9udCAqcEZvbnQpDQorew0KKyAgICBGWFNZU19hc3NlcnQocEZvbnQgIT0gTlVMTCk7DQorICAgIG1fcEZvbnQgPSBwRm9udDsNCisgICAgbV9wVHh0QnJlYWstPlNldEZvbnQocEZvbnQpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGZGb250U2l6ZSA+IDApOw0KKyAgICBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsNCisgICAgbV9wVHh0QnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRUZXh0Q29sb3IoRlhfQVJHQiBjb2xvcikNCit7DQorICAgIG1fVHh0Q29sb3IgPSBjb2xvcjsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldFN0eWxlcyhGWF9EV09SRCBkd1N0eWxlcykNCit7DQorICAgIG1fZHdTdHlsZXMgPSBkd1N0eWxlczsNCisgICAgbV9kd1R4dEJrU3R5bGVzID0gMDsNCisgICAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpIHsNCisgICAgICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgICB9DQorICAgIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9FeHBhbmRUYWIpIHsNCisgICAgICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQorICAgIH0NCisgICAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0FyYWJpY1NoYXBlcykgew0KKyAgICAgICAgbV9kd1R4dEJrU3R5bGVzIHw9IEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY1NoYXBlczsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfUlRMKSB7DQorICAgICAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgICB9DQorICAgIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9BcmFiaWNDb250ZXh0KSB7DQorICAgICAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dDsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpIHsNCisgICAgICAgIG1fZHdUeHRCa1N0eWxlcyB8PSAoRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyB8IEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KTsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+U2V0TGF5b3V0U3R5bGVzKG1fZHdUeHRCa1N0eWxlcyk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQoZlRhYldpZHRoID4gMS4wZik7DQorICAgIG1fcFR4dEJyZWFrLT5TZXRUYWJXaWR0aChmVGFiV2lkdGgsIEZBTFNFKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldEVsbGlwc2lzU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0VsbGlwc2lzKQ0KK3sNCisgICAgbV9iRWxsaUNoYW5nZWQJPSBUUlVFOw0KKyAgICBtX3dzRWxsaXBzaXMJPSB3c0VsbGlwc2lzOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkNCit7DQorICAgIG1fd1BhcmFncmFwaEJrQ2hhciA9IHdjaDsNCisgICAgbV9wVHh0QnJlYWstPlNldFBhcmFncmFwaEJyZWFrQ2hhcih3Y2gpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0QWxpZ25tZW50KEZYX0lOVDMyIGlBbGlnbm1lbnQpDQorew0KKyAgICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50Ow0KKyAgICBzd2l0Y2ggKG1faUFsaWdubWVudCkgew0KKyAgICAgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjoNCisgICAgICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI6DQorICAgICAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfQm90dG9tQ2VudGVyOg0KKyAgICAgICAgICAgIG1faVR4dEJrQWxpZ25tZW50ID0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQ6DQorICAgICAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQ6DQorICAgICAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQ6DQorICAgICAgICAgICAgbV9pVHh0QmtBbGlnbm1lbnQgPSBGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+U2V0QWxpZ25tZW50KG1faVR4dEJrQWxpZ25tZW50KTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVTcGFjZShGWF9GTE9BVCBmTGluZVNwYWNlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGZMaW5lU3BhY2UgPiAxLjBmKTsNCisgICAgbV9mTGluZVNwYWNlID0gZkxpbmVTcGFjZTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldERJQml0bWFwKENGWF9ESUJpdG1hcCAqcERJQikNCit7DQorICAgIEZYU1lTX2Fzc2VydChwRElCICE9IE5VTEwpOw0KKyAgICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIG1fcFJlbmRlckRldmljZSA9IElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUocERJQik7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwRGV2aWNlICE9IE5VTEwpOw0KKyAgICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIG1fcFJlbmRlckRldmljZSA9IElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUocERldmljZSk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdCAmcnRDbGlwKQ0KK3sNCisgICAgbV9ydENsaXAuU2V0KChGWF9GTE9BVClydENsaXAubGVmdCwgKEZYX0ZMT0FUKXJ0Q2xpcC50b3AsIChGWF9GTE9BVClydENsaXAuV2lkdGgoKSwgKEZYX0ZMT0FUKXJ0Q2xpcC5IZWlnaHQoKSk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkNCit7DQorICAgIG1fcnRDbGlwID0gcnRDbGlwOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0TG9naWNDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkNCit7DQorICAgIG1fcnRMb2dpY0NsaXAgPSBydENsaXA7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgbV9NYXRyaXggPSBtYXRyaXg7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSkNCit7DQorICAgIG1fZlRvbGVyYW5jZSA9IGZUb2xlcmFuY2U7DQorICAgIG1fcFR4dEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UobV9mVG9sZXJhbmNlKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UZXh0T3V0OjpHZXRUb3RhbExpbmVzKCkNCit7DQorICAgIHJldHVybiBtX2lUb3RhbExpbmVzOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6Q2FsY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9TaXplICZzaXplKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgICAgcnRUZXh0LlNldCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpc2l6ZS54LCAoRlhfRkxPQVQpc2l6ZS55KTsNCisgICAgQ2FsY1NpemUocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KKyAgICBzaXplLnggPSAoRlhfSU5UMzIpcnRUZXh0LldpZHRoKCk7DQorICAgIHNpemUueSA9IChGWF9JTlQzMilydFRleHQuSGVpZ2h0KCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgICAgcnRUZXh0LlNldCgwLjBmLCAwLjBmLCBzaXplLngsIHNpemUueSk7DQorICAgIENhbGNTaXplKHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCisgICAgc2l6ZS54ID0gcnRUZXh0LldpZHRoKCk7DQorICAgIHNpemUueSA9IHJ0VGV4dC5IZWlnaHQoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfUmVjdCAmcmVjdCkNCit7DQorICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgIHJ0VGV4dC5TZXQoKEZYX0ZMT0FUKXJlY3QubGVmdCwgKEZYX0ZMT0FUKXJlY3QudG9wLCAoRlhfRkxPQVQpcmVjdC5XaWR0aCgpLCAoRlhfRkxPQVQpcmVjdC5IZWlnaHQoKSk7DQorICAgIENhbGNTaXplKHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCisgICAgcmVjdC5TZXQoKEZYX0lOVDMyKXJ0VGV4dC5sZWZ0LCAoRlhfSU5UMzIpcnRUZXh0LnRvcCwgKEZYX0lOVDMyKXJ0VGV4dC5XaWR0aCgpLCAoRlhfSU5UMzIpcnRUZXh0LkhlaWdodCgpKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBpZiAocHdzU3RyID09IE5VTEwgfHwgaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJlY3Qud2lkdGgJPSAwLjBmOw0KKyAgICAgICAgcmVjdC5oZWlnaHQJPSAwLjBmOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX01hdHJpeCBybTsNCisgICAgICAgIHJtLlNldFJldmVyc2UobV9NYXRyaXgpOw0KKyAgICAgICAgcm0uVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgICAgICAgIENhbGNUZXh0U2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOw0KKyAgICAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgICAgfQ0KK30NCit2b2lkIENGREVfVGV4dE91dDo6Q2FsY0xvZ2ljU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgICAgcnRUZXh0LlNldCgwLjBmLCAwLjBmLCBzaXplLngsIHNpemUueSk7DQorICAgIENhbGNMb2dpY1NpemUocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KKyAgICBzaXplLnggPSBydFRleHQuV2lkdGgoKTsNCisgICAgc2l6ZS55ID0gcnRUZXh0LkhlaWdodCgpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6Q2FsY0xvZ2ljU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgaWYgKHB3c1N0ciA9PSBOVUxMIHx8IGlMZW5ndGggPCAxKSB7DQorICAgICAgICByZWN0LndpZHRoCT0gMC4wZjsNCisgICAgICAgIHJlY3QuaGVpZ2h0ID0gMC4wZjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENhbGNUZXh0U2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjVGV4dFNpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwgJiYgbV9mRm9udFNpemUgPj0gMS4wZik7DQorICAgIFNldExpbmVXaWR0aChyZWN0KTsNCisgICAgbV9pVG90YWxMaW5lcyA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcFN0cgkJPSBwd3NTdHI7DQorICAgIEZYX0JPT0wJYkhvdEtleQkJPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9Ib3RLZXkpID8gVFJVRSA6IEZBTFNFOw0KKyAgICBGWF9CT09MIGJWZXJ0aWNhbAk9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSA/IFRSVUUgOiBGQUxTRTsNCisgICAgRlhfRkxPQVQgZldpZHRoCQk9IDAuMGY7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQJPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmU3RhcnRQb3MJPSBiVmVydGljYWwgPyByZWN0LmJvdHRvbSgpIDogcmVjdC5yaWdodCgpOw0KKyAgICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzID0gMDsNCisgICAgRlhfV0NIQVIgd1ByZUNoYXIJPSAwOw0KKyAgICBGWF9XQ0hBUiB3Y2g7DQorICAgIEZYX1dDSEFSIHdCcmVhayA9IDA7DQorICAgIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7DQorICAgICAgICB3Y2ggPSAqcFN0cisrOw0KKyAgICAgICAgaWYgKHdCcmVhayA9PSAwICYmICh3Y2ggPT0gTCdcbicgfHwgd2NoID09IEwnXHInKSkgew0KKyAgICAgICAgICAgIHdCcmVhayA9IHdjaDsNCisgICAgICAgICAgICBtX3BUeHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKHdjaCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkhvdEtleSAmJiB3Y2ggPT0gTCcmJyAmJiB3UHJlQ2hhciAhPSBMJyYnKSB7DQorICAgICAgICAgICAgd1ByZUNoYXIgPSB3Y2g7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCisgICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgIFJldHJpZXZlTGluZVdpZHRoKGR3QnJlYWtTdGF0dXMsIGZTdGFydFBvcywgZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgICAgIHdQcmVDaGFyID0gMDsNCisgICAgfQ0KKyAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICBSZXRyaWV2ZUxpbmVXaWR0aChkd0JyZWFrU3RhdHVzLCBmU3RhcnRQb3MsIGZXaWR0aCwgZkhlaWdodCk7DQorICAgIH0NCisgICAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQorICAgIEZYX0ZMT0FUIGZJbmMgPSByZWN0LkhlaWdodCgpIC0gZkhlaWdodDsNCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgZkluYyA9IHJlY3QuV2lkdGgoKSAtIGZIZWlnaHQ7DQorICAgIH0NCisgICAgaWYgKG1faUFsaWdubWVudCA+PSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQgJiYgbV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0KSB7DQorICAgICAgICBmSW5jIC89IDIuMGY7DQorICAgIH0gZWxzZSBpZiAobV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0KSB7DQorICAgICAgICBmSW5jID0gMC4wZjsNCisgICAgfQ0KKyAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICByZWN0LnRvcCArPSBmU3RhcnRQb3M7DQorICAgICAgICByZWN0LmxlZnQgKz0gZkluYzsNCisgICAgICAgIHJlY3Qud2lkdGgJPSBmSGVpZ2h0Ow0KKyAgICAgICAgcmVjdC5oZWlnaHQgPSBGWF9NSU4oZldpZHRoLCByZWN0LkhlaWdodCgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QubGVmdCArPSBmU3RhcnRQb3M7DQorICAgICAgICByZWN0LnRvcCArPSBmSW5jOw0KKyAgICAgICAgcmVjdC53aWR0aAk9IEZYX01JTihmV2lkdGgsIHJlY3QuV2lkdGgoKSk7DQorICAgICAgICByZWN0LmhlaWdodCA9IGZIZWlnaHQ7DQorICAgICAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9MYXN0TGluZUhlaWdodCkgew0KKyAgICAgICAgICAgIHJlY3QuaGVpZ2h0IC09IG1fZkxpbmVTcGFjZSAtIG1fZkZvbnRTaXplOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMaW5lV2lkdGgoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgaWYgKChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpID09IDApIHsNCisgICAgICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAwLjBmOw0KKyAgICAgICAgaWYgKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpIHsNCisgICAgICAgICAgICBpZiAocmVjdC5IZWlnaHQoKSA8IDEuMGYpIHsNCisgICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgPSBtX2ZGb250U2l6ZSAqIDEwMDAuMGY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZMaW5lV2lkdGggPSByZWN0LkhlaWdodCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAocmVjdC5XaWR0aCgpIDwgMS4wZikgew0KKyAgICAgICAgICAgICAgICByZWN0LndpZHRoID0gbV9mRm9udFNpemUgKiAxMDAwLjBmOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmTGluZVdpZHRoID0gcmVjdC5XaWR0aCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVHh0QnJlYWstPlNldExpbmVXaWR0aChmTGluZVdpZHRoKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENGREVfVGV4dE91dDo6UmV0cmlldmVMaW5lV2lkdGgoRlhfRFdPUkQgZHdCcmVha1N0YXR1cywgRlhfRkxPQVQgJmZTdGFydFBvcywgRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgJmZIZWlnaHQpDQorew0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA8PSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkxpbmVTdGVwCT0gKG1fZkxpbmVTcGFjZSA+IG1fZkZvbnRTaXplKSA/IG1fZkxpbmVTcGFjZSA6IG1fZkZvbnRTaXplOw0KKyAgICBGWF9CT09MIGJMaW5lV3JhcAk9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xpbmVXcmFwKSA/IFRSVUUgOiBGQUxTRTsNCisgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGY7DQorICAgIEZYX0lOVDMyIGlDb3VudAkJPSBtX3BUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqcFBpZWNlID0gbV9wVHh0QnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQorICAgICAgICBmTGluZVdpZHRoICs9IChGWF9GTE9BVClwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGY7DQorICAgICAgICBmU3RhcnRQb3MgPSBGWF9NSU4oZlN0YXJ0UG9zLCAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmKTsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhaykgew0KKyAgICAgICAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQorICAgIH0NCisgICAgaWYgKCFiTGluZVdyYXAgJiYgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCisgICAgICAgIGZXaWR0aCArPSBmTGluZVdpZHRoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZldpZHRoID0gRlhfTUFYKGZXaWR0aCwgZkxpbmVXaWR0aCk7DQorICAgICAgICBmSGVpZ2h0ICs9IGZMaW5lU3RlcDsNCisgICAgfQ0KKyAgICBtX2lUb3RhbExpbmVzKys7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RHJhd1RleHQoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpDQorew0KKyAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgICBydFRleHQuU2V0KChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpOw0KKyAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkNCit7DQorICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgIHJ0VGV4dC5TZXQoeCwgeSwgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpOw0KKyAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3QgJnJlY3QpDQorew0KKyAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgICBydFRleHQuU2V0KChGWF9GTE9BVClyZWN0LmxlZnQsIChGWF9GTE9BVClyZWN0LnRvcCwgKEZYX0ZMT0FUKXJlY3Qud2lkdGgsIChGWF9GTE9BVClyZWN0LmhlaWdodCk7DQorICAgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgICBydFRleHQuU2V0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgICAgQ0ZYX01hdHJpeCBybTsNCisgICAgcm0uU2V0UmV2ZXJzZShtX01hdHJpeCk7DQorICAgIHJtLlRyYW5zZm9ybVJlY3QocnRUZXh0KTsNCisgICAgRHJhd1RleHQocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQsIG1fcnRDbGlwKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdMb2dpY1RleHQoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQorew0KKyAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgICBydFRleHQuU2V0KHgsIHksIG1fZkZvbnRTaXplICogMTAwMC4wZiwgbV9mRm9udFNpemUgKiAxMDAwLjBmKTsNCisgICAgRHJhd0xvZ2ljVGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TG9naWNUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBDRlhfUmVjdEYgcnRDbGlwOw0KKyAgICBydENsaXAuU2V0KG1fcnRMb2dpY0NsaXAubGVmdCwgbV9ydExvZ2ljQ2xpcC50b3AsIG1fcnRMb2dpY0NsaXAud2lkdGgsIG1fcnRMb2dpY0NsaXAuaGVpZ2h0KTsNCisgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJlY3QsIHJ0Q2xpcCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwgJiYgbV9mRm9udFNpemUgPj0gMS4wZik7DQorICAgIGlmIChwd3NTdHIgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChyZWN0LndpZHRoIDwgbV9mRm9udFNpemUgfHwgcmVjdC5oZWlnaHQgPCBtX2ZGb250U2l6ZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSByZWN0LndpZHRoOw0KKyAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgew0KKyAgICAgICAgZkxpbmVXaWR0aCA9IHJlY3QuaGVpZ2h0Ow0KKyAgICB9DQorICAgIG1fcFR4dEJyZWFrLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7DQorICAgIG1fdHRvTGluZXMuUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICBtX3dzVGV4dC5FbXB0eSgpOw0KKyAgICBMb2FkVGV4dChwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOw0KKyAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9FbGxpcHNpcykgew0KKyAgICAgICAgUmVwbGFjZVdpZHRoRWxsaXBzaXMoKTsNCisgICAgfQ0KKyAgICBSZWxvYWQocmVjdCk7DQorICAgIERvQWxpZ25tZW50KHJlY3QpOw0KKyAgICBPbkRyYXcocnRDbGlwKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkV4cGFuZEJ1ZmZlcihGWF9JTlQzMiBpU2l6ZSwgRlhfSU5UMzIgaVR5cGUpDQorew0KKyAgICBzd2l0Y2ggKGlUeXBlKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgaWYgKG1fcENoYXJXaWR0aHMgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBtX3BDaGFyV2lkdGhzID0gKEZYX0lOVDMyKilGREVfQWxsb2MoaVNpemUgKiBzaXplb2YoRlhfSU5UMzIpKTsNCisgICAgICAgICAgICAgICAgbV9pQ2hhcnMgPSBpU2l6ZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1faUNoYXJzIDwgaVNpemUpIHsNCisgICAgICAgICAgICAgICAgbV9wQ2hhcldpZHRocyA9IChGWF9JTlQzMiopRkRFX1JlYWxsb2MobV9wQ2hhcldpZHRocywgaVNpemUgKiBzaXplb2YoRlhfSU5UMzIpKTsNCisgICAgICAgICAgICAgICAgbV9pQ2hhcnMgPSBpU2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcENoYXJXaWR0aHMsIDAsIGlTaXplKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICBpZiAobV9wRWxsQ2hhcldpZHRocyA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIG1fcEVsbENoYXJXaWR0aHMgPSAoRlhfSU5UMzIqKUZERV9BbGxvYyhpU2l6ZSAqIHNpemVvZihGWF9JTlQzMikpOw0KKyAgICAgICAgICAgICAgICBtX2lFbGxDaGFycyA9IGlTaXplOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9pRWxsQ2hhcnMgPCBpU2l6ZSkgew0KKyAgICAgICAgICAgICAgICBtX3BFbGxDaGFyV2lkdGhzID0gKEZYX0lOVDMyKilGREVfUmVhbGxvYyhtX3BFbGxDaGFyV2lkdGhzLCBpU2l6ZSAqIHNpemVvZihGWF9JTlQzMikpOw0KKyAgICAgICAgICAgICAgICBtX2lFbGxDaGFycyA9IGlTaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wRWxsQ2hhcldpZHRocywgMCwgaVNpemUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIGlmIChtX3BDaGFyUG9zID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgbV9wQ2hhclBvcyA9IChGWFRFWFRfQ0hBUlBPUyopRkRFX0FsbG9jKGlTaXplICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQorICAgICAgICAgICAgICAgIG1faUNoYXJQb3NTaXplID0gaVNpemU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChtX2lDaGFyUG9zU2l6ZSA8IGlTaXplKSB7DQorICAgICAgICAgICAgICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9SZWFsbG9jKG1fcENoYXJQb3MsIGlTaXplICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQorICAgICAgICAgICAgICAgIG1faUNoYXJQb3NTaXplID0gaVNpemU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpMb2FkRWxsaXBzaXMoKQ0KK3sNCisgICAgaWYgKCFtX2JFbGxpQ2hhbmdlZCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fYkVsbGlDaGFuZ2VkID0gRkFMU0U7DQorICAgIG1faUVsbGlwc2lzV2lkdGggPSAwOw0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gbV93c0VsbGlwc2lzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBFeHBhbmRCdWZmZXIoaUxlbmd0aCwgMSk7DQorICAgIEZYX0xQQ1dTVFIgcFN0ciA9IChGWF9MUENXU1RSKW1fd3NFbGxpcHNpczsNCisgICAgRlhfSU5UMzIgKnBDaGFyV2lkdGhzID0gbV9wRWxsQ2hhcldpZHRoczsNCisgICAgRlhfRFdPUkQgZHdCcmVha1N0YXR1czsNCisgICAgRlhfV0NIQVIgd2NoOw0KKyAgICB3aGlsZSAoaUxlbmd0aC0tID4gMCkgew0KKyAgICAgICAgd2NoID0gKnBTdHIrKzsNCisgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICAgICAgUmV0cmlldmVFbGxQaWVjZXMocENoYXJXaWR0aHMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgIFJldHJpZXZlRWxsUGllY2VzKHBDaGFyV2lkdGhzKTsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlJldHJpZXZlRWxsUGllY2VzKEZYX0lOVDMyIComcENoYXJXaWR0aHMpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX3BUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KKyAgICBDRlhfQ2hhciAqcFRDOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqcFBpZWNlID0gbV9wVHh0QnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQorICAgICAgICBGWF9JTlQzMiBpUGllY2VDaGFycyA9IHBQaWVjZS0+R2V0TGVuZ3RoKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgew0KKyAgICAgICAgICAgIHBUQyA9IHBQaWVjZS0+R2V0Q2hhclB0cihqKTsNCisgICAgICAgICAgICBpZiAocFRDLT5tX2lDaGFyV2lkdGggPD0gMCkgew0KKyAgICAgICAgICAgICAgICAqcENoYXJXaWR0aHMgPSAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICpwQ2hhcldpZHRocyA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2lFbGxpcHNpc1dpZHRoICs9ICpwQ2hhcldpZHRoczsNCisgICAgICAgICAgICBwQ2hhcldpZHRocysrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpMb2FkVGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgRlhfTFBXU1RSIHBTdHIJCT0gbV93c1RleHQuR2V0QnVmZmVyKGlMZW5ndGgpOw0KKyAgICBGWF9JTlQzMiBpVHh0TGVuZ3RoID0gaUxlbmd0aDsNCisgICAgRXhwYW5kQnVmZmVyKGlUeHRMZW5ndGgsIDApOw0KKyAgICBGWF9CT09MIGJIb3RLZXkJCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KSA/IFRSVUUgOiBGQUxTRTsNCisgICAgRlhfQk9PTCBiVmVydGljYWwJPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgPyBUUlVFIDogRkFMU0U7DQorICAgIEZYX0JPT0wgYkxpbmVXcmFwCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApID8gVFJVRSA6IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBmTGluZVN0ZXAJPSAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQorICAgIEZYX0ZMT0FUIGZMaW5lU3RvcAk9IGJWZXJ0aWNhbCA/IHJlY3QubGVmdCA6IHJlY3QuYm90dG9tKCk7DQorICAgIG1fZkxpbmVQb3MJPSBiVmVydGljYWwgPyByZWN0LnJpZ2h0KCkgOiByZWN0LnRvcDsNCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgZkxpbmVTdGVwID0gLWZMaW5lU3RlcDsNCisgICAgfQ0KKyAgICBtX2hvdEtleXMuUmVtb3ZlQWxsKCk7DQorICAgIEZYX0lOVDMyIGlTdGFydENoYXIgPSAwOw0KKyAgICBGWF9JTlQzMiBpQ2hhcnMJCT0gMDsNCisgICAgRlhfSU5UMzIgaVBpZWNlV2lkdGhzID0gMDsNCisgICAgRlhfRFdPUkQgZHdCcmVha1N0YXR1czsNCisgICAgRlhfV0NIQVIgd2NoOw0KKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgICAgd2hpbGUgKGlUeHRMZW5ndGgtLSA+IDApIHsNCisgICAgICAgIHdjaCA9ICpwd3NTdHIrKzsNCisgICAgICAgIGlmICh3Y2ggPT0gTCcmJyAmJiBiSG90S2V5ICYmIChwU3RyIC0gMSkgIT0gTlVMTCAmJiAqKHBTdHIgLSAxKSAhPSBMJyYnKSB7DQorICAgICAgICAgICAgaWYgKGlUeHRMZW5ndGggPiAwKSB7DQorICAgICAgICAgICAgICAgIG1faG90S2V5cy5BZGQoaUNoYXJzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICAqcFN0cisrID0gd2NoOw0KKyAgICAgICAgaUNoYXJzKys7DQorICAgICAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCisgICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgIEZYX0JPT0wgYkVuZG9mTGluZSA9IFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgRkFMU0UsIHJlY3QpOw0KKyAgICAgICAgICAgIGlmIChiRW5kb2ZMaW5lICYmIChiTGluZVdyYXAgfHwgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19MaW5lQnJlYWsgJiYgIWJMaW5lV3JhcCkpKSB7DQorICAgICAgICAgICAgICAgIGlQaWVjZVdpZHRocyA9IDA7DQorICAgICAgICAgICAgICAgIG1faUN1ckxpbmUrKzsNCisgICAgICAgICAgICAgICAgbV9mTGluZVBvcyArPSBmTGluZVN0ZXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgoYlZlcnRpY2FsICYmIG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPCBmTGluZVN0b3ApIHx8ICghYlZlcnRpY2FsICYmIG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPiBmTGluZVN0b3ApKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDdXJMaW5lID0gbV9pQ3VyTGluZTsNCisgICAgICAgICAgICAgICAgaWYgKGJFbmRvZkxpbmUpIHsNCisgICAgICAgICAgICAgICAgICAgIGlDdXJMaW5lLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZERV9UVE9MaW5lICpwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaUN1ckxpbmUpOw0KKyAgICAgICAgICAgICAgICBwTGluZS0+bV9iTmV3UmVsb2FkID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrICYmICFiUmV0KSB7DQorICAgICAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIEZBTFNFLCByZWN0KTsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCisgICAgbV93c1RleHQuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsNCit9DQorRlhfQk9PTCBDRkRFX1RleHRPdXQ6OlJldHJpZWNlUGllY2VzKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsIEZYX0lOVDMyICZpU3RhcnRDaGFyLCBGWF9JTlQzMiAmaVBpZWNlV2lkdGhzLCBGWF9CT09MIGJSZWxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIEZYX0JPT0wgYlNpbmdsZUxpbmUgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSA/IFRSVUUgOiBGQUxTRTsNCisgICAgRlhfQk9PTCBiTGluZVdyYXAJPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9MaW5lV3JhcCkgPyBUUlVFIDogRkFMU0U7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBmTGluZVN0ZXAJPSAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQorICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIGZMaW5lU3RlcCA9IC1mTGluZVN0ZXA7DQorICAgIH0NCisgICAgQ0ZYX0NoYXIgKnBUQwkJPSBOVUxMOw0KKyAgICBGWF9CT09MIGJOZWVkUmVsb2FkCT0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGgJPSBiVmVydGljYWwgPyByZWN0LkhlaWdodCgpIDogcmVjdC5XaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBpTGluZVdpZHRoID0gRlhTWVNfcm91bmQoZkxpbmVXaWR0aCAqIDIwMDAwLjBmKTsNCisgICAgRlhfSU5UMzIgaUNvdW50CQk9IG1fcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgY29uc3QgQ0ZYX1R4dFBpZWNlICpwUGllY2UgPSBtX3BUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgICAgIEZYX0lOVDMyIGlQaWVjZUNoYXJzID0gcFBpZWNlLT5HZXRMZW5ndGgoKTsNCisgICAgICAgIEZYX0lOVDMyIGlDaGFyCT0gaVN0YXJ0Q2hhcjsNCisgICAgICAgIEZYX0lOVDMyIGlXaWR0aAk9IDA7DQorICAgICAgICBGWF9JTlQzMiBqID0gMDsNCisgICAgICAgIGZvciAoOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgew0KKyAgICAgICAgICAgIHBUQyA9IHBQaWVjZS0+R2V0Q2hhclB0cihqKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpQ3VyQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGggPiAwID8gcFRDLT5tX2lDaGFyV2lkdGggOiAwOw0KKyAgICAgICAgICAgIGlmIChiU2luZ2xlTGluZSB8fCAhYkxpbmVXcmFwKSB7DQorICAgICAgICAgICAgICAgIGlmIChpTGluZVdpZHRoIC0gaVBpZWNlV2lkdGhzIC0gaVdpZHRoIDwgaUN1ckNoYXJXaWR0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgYk5lZWRSZWxvYWQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaVdpZHRoICs9IGlDdXJDaGFyV2lkdGg7DQorICAgICAgICAgICAgbV9wQ2hhcldpZHRoc1tpQ2hhcisrXSA9IGlDdXJDaGFyV2lkdGg7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaiA9PSAwICYmICFiUmVsb2FkKSB7DQorICAgICAgICAgICAgQ0ZERV9UVE9MaW5lICpwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQobV9pQ3VyTGluZSk7DQorICAgICAgICAgICAgcExpbmUtPm1fYk5ld1JlbG9hZCA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKGogPiAwKSB7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0UGllY2U7DQorICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgICAgICAgICBydFBpZWNlLmxlZnQJPSBtX2ZMaW5lUG9zOw0KKyAgICAgICAgICAgICAgICBydFBpZWNlLnRvcAkJPSByZWN0LnRvcCArIChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQorICAgICAgICAgICAgICAgIHJ0UGllY2Uud2lkdGgJPSBmTGluZVN0ZXA7DQorICAgICAgICAgICAgICAgIHJ0UGllY2UuaGVpZ2h0CT0gaVdpZHRoIC8gMjAwMDAuMGY7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcnRQaWVjZS5sZWZ0CT0gcmVjdC5sZWZ0ICsgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZjsNCisgICAgICAgICAgICAgICAgcnRQaWVjZS50b3AJCT0gbV9mTGluZVBvczsNCisgICAgICAgICAgICAgICAgcnRQaWVjZS53aWR0aAk9IGlXaWR0aCAvIDIwMDAwLjBmOw0KKyAgICAgICAgICAgICAgICBydFBpZWNlLmhlaWdodAk9IGZMaW5lU3RlcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRkRFX1RUT1BJRUNFIHR0b1BpZWNlOw0KKyAgICAgICAgICAgIHR0b1BpZWNlLmlTdGFydENoYXIgPSBpU3RhcnRDaGFyOw0KKyAgICAgICAgICAgIHR0b1BpZWNlLmlDaGFycwkJPSBqOw0KKyAgICAgICAgICAgIHR0b1BpZWNlLnJ0UGllY2UJPSBydFBpZWNlOw0KKyAgICAgICAgICAgIHR0b1BpZWNlLmR3Q2hhclN0eWxlcyA9IHBQaWVjZS0+bV9kd0NoYXJTdHlsZXM7DQorICAgICAgICAgICAgaWYgKEZYX0lzT2RkKHBQaWVjZS0+bV9pQmlkaUxldmVsKSkgew0KKyAgICAgICAgICAgICAgICB0dG9QaWVjZS5kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQXBwZW5kUGllY2UodHRvUGllY2UsIGJOZWVkUmVsb2FkLCAoYlJlbG9hZCAmJiBpID09IGlDb3VudCAtIDEpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlTdGFydENoYXIgKz0gaVBpZWNlQ2hhcnM7DQorICAgICAgICBpUGllY2VXaWR0aHMgKz0gaVdpZHRoOw0KKyAgICB9DQorICAgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICAgIEZYX0JPT0wgYlJldCA9IGJTaW5nbGVMaW5lIHx8IGJMaW5lV3JhcCB8fCAoIWJMaW5lV3JhcCAmJiBiTmVlZFJlbG9hZCkgfHwgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhazsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpBcHBlbmRQaWVjZShjb25zdCBGREVfVFRPUElFQ0UgJnR0b1BpZWNlLCBGWF9CT09MIGJOZWVkUmVsb2FkLCBGWF9CT09MIGJFbmQpDQorew0KKyAgICBpZiAobV9pQ3VyTGluZSA+PSBtX3R0b0xpbmVzLkdldFNpemUoKSkgew0KKyAgICAgICAgQ0ZERV9UVE9MaW5lIHR0b0xpbmU7DQorICAgICAgICB0dG9MaW5lLm1fYk5ld1JlbG9hZCA9IGJOZWVkUmVsb2FkOw0KKyAgICAgICAgbV9pQ3VyUGllY2UJPSB0dG9MaW5lLkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7DQorICAgICAgICBtX2lDdXJMaW5lCT0gbV90dG9MaW5lcy5BZGQodHRvTGluZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lCT0gbV90dG9MaW5lcy5HZXRQdHJBdChtX2lDdXJMaW5lKTsNCisgICAgICAgIHBMaW5lLT5tX2JOZXdSZWxvYWQJPSBiTmVlZFJlbG9hZDsNCisgICAgICAgIG1faUN1clBpZWNlID0gcExpbmUtPkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7DQorICAgICAgICBpZiAoYkVuZCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlQaWVjZXMgPSBwTGluZS0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgIGlmIChtX2lDdXJQaWVjZSA8IGlQaWVjZXMpIHsNCisgICAgICAgICAgICAgICAgcExpbmUtPlJlbW92ZUxhc3QoaVBpZWNlcyAtIG1faUN1clBpZWNlIC0gMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkVuZCAmJiBiTmVlZFJlbG9hZCkgew0KKyAgICAgICAgbV9pQ3VyUGllY2UgPSAwOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpSZXBsYWNlV2lkdGhFbGxpcHNpcygpDQorew0KKyAgICBMb2FkRWxsaXBzaXMoKTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IG1fd3NFbGxpcHNpcy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxpbmVzID0gbV90dG9MaW5lcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGluZXM7IGkrKykgew0KKyAgICAgICAgQ0ZERV9UVE9MaW5lICpwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaSk7DQorICAgICAgICBpZiAoIXBMaW5lLT5tX2JOZXdSZWxvYWQpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlFbGxpcHNpc0NoYXJJbmRleCA9IGlMZW5ndGggLSAxOw0KKyAgICAgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpQ2hhckNvdW50CT0gMDsNCisgICAgICAgIEZYX0lOVDMyIGlQaWVjZSA9IHBMaW5lLT5HZXRTaXplKCk7DQorICAgICAgICB3aGlsZSAoaVBpZWNlLS0gPiAwKSB7DQorICAgICAgICAgICAgRkRFX0xQVFRPUElFQ0UgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KGlQaWVjZSk7DQorICAgICAgICAgICAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSBwUGllY2UtPmlDaGFycyAtIDE7IGogPj0gMDsgai0tKSB7DQorICAgICAgICAgICAgICAgIGlmIChpRWxsaXBzaXNDaGFySW5kZXggPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpbmRleCA9IHBQaWVjZS0+aVN0YXJ0Q2hhciArIGo7DQorICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggKz0gbV9wQ2hhcldpZHRoc1tpbmRleF07DQorICAgICAgICAgICAgICAgIGlDaGFyQ291bnQrKzsNCisgICAgICAgICAgICAgICAgaWYgKGlDaGFyQ291bnQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV93c1RleHQuU2V0QXQoaW5kZXgsIG1fd3NFbGxpcHNpcy5HZXRBdChpRWxsaXBzaXNDaGFySW5kZXgpKTsNCisgICAgICAgICAgICAgICAgICAgIG1fcENoYXJXaWR0aHNbaW5kZXhdID0gbV9wRWxsQ2hhcldpZHRoc1tpRWxsaXBzaXNDaGFySW5kZXhdOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyV2lkdGggPD0gbV9pRWxsaXBzaXNXaWR0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV93c1RleHQuU2V0QXQoaW5kZXgsIDApOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wQ2hhcldpZHRoc1tpbmRleF0gPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlFbGxpcHNpc0NoYXJJbmRleC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaUVsbGlwc2lzQ2hhckluZGV4IDwgMCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlJlbG9hZChjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX3R0b0xpbmVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpKTsNCisgICAgICAgIGlmIChwTGluZSA9PSBOVUxMIHx8ICFwTGluZS0+bV9iTmV3UmVsb2FkKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBtX2lDdXJMaW5lCT0gaTsNCisgICAgICAgIG1faUN1clBpZWNlID0gMDsNCisgICAgICAgIFJlbG9hZExpbmVQaWVjZShwTGluZSwgcmVjdCk7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlJlbG9hZExpbmVQaWVjZShDRkRFX1RUT0xpbmUgKnBMaW5lLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBGWF9MUENXU1RSIHB3c1N0cgkJPSAoRlhfTFBDV1NUUiltX3dzVGV4dDsNCisgICAgRlhfQk9PTCBiVmVydGljYWwJCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBpUGllY2VXaWR0aHMJPSAwOw0KKyAgICBGREVfTFBUVE9QSUVDRSBwUGllY2UJPSBwTGluZS0+R2V0UHRyQXQoMCk7DQorICAgIEZYX0lOVDMyIGlTdGFydENoYXIJCT0gcFBpZWNlLT5pU3RhcnRDaGFyOw0KKyAgICBtX2ZMaW5lUG9zCT0gYlZlcnRpY2FsID8gcFBpZWNlLT5ydFBpZWNlLmxlZnQgOiBwUGllY2UtPnJ0UGllY2UudG9wOw0KKyAgICBGWF9JTlQzMiBpUGllY2VDb3VudAk9IHBMaW5lLT5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGlQaWVjZUluZGV4CT0gMDsNCisgICAgRlhfRFdPUkQgZHdCcmVha1N0YXR1cwk9IDA7DQorICAgIEZYX1dDSEFSIHdjaDsNCisgICAgd2hpbGUgKGlQaWVjZUluZGV4IDwgaVBpZWNlQ291bnQpIHsNCisgICAgICAgIEZYX0lOVDMyIGlTdGFyCT0gaVN0YXJ0Q2hhcjsNCisgICAgICAgIEZYX0lOVDMyIGlFbmQJPSBwUGllY2UtPmlDaGFycyArIGlTdGFyOw0KKyAgICAgICAgd2hpbGUgKGlTdGFyIDwgaUVuZCkgew0KKyAgICAgICAgICAgIHdjaCA9ICoocHdzU3RyICsgaVN0YXIpOw0KKyAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgICAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIFRSVUUsIHJlY3QpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpU3RhcisrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVBpZWNlSW5kZXgrKzsNCisgICAgICAgIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChpUGllY2VJbmRleCk7DQorICAgIH0NCisgICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgUmV0cmllY2VQaWVjZXMoZHdCcmVha1N0YXR1cywgaVN0YXJ0Q2hhciwgaVBpZWNlV2lkdGhzLCBUUlVFLCByZWN0KTsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRvQWxpZ25tZW50KGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBmTGluZVN0b3BTCT0gYlZlcnRpY2FsID8gcmVjdC5yaWdodCgpIDogcmVjdC5ib3R0b20oKTsNCisgICAgRlhfSU5UMzIgaUxpbmVzCQk9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaUxpbmVzIDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGREVfVFRPTGluZSAqcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGlMaW5lcyAtIDEpOw0KKyAgICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoMCk7DQorICAgIGlmIChwUGllY2UgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZMaW5lU3RvcEQgPSBiVmVydGljYWwgPyBwUGllY2UtPnJ0UGllY2UucmlnaHQoKSA6IHBQaWVjZS0+cnRQaWVjZS5ib3R0b20oKTsNCisgICAgRlhfRkxPQVQgZkluYwkJPSBmTGluZVN0b3BTIC0gZkxpbmVTdG9wRDsNCisgICAgaWYgKG1faUFsaWdubWVudCA+PSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQgJiYgbV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0KSB7DQorICAgICAgICBmSW5jIC89IDIuMGY7DQorICAgIH0gZWxzZSBpZiAobV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0KSB7DQorICAgICAgICBmSW5jID0gMC4wZjsNCisgICAgfQ0KKyAgICBpZiAoZkluYyA8IDEuMGYpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxpbmVzOyBpKyspIHsNCisgICAgICAgIENGREVfVFRPTGluZSAqcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGkpOw0KKyAgICAgICAgRlhfSU5UMzIgaVBpZWNlcyA9IHBMaW5lLT5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQorICAgICAgICAgICAgRkRFX0xQVFRPUElFQ0UgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KGopOw0KKyAgICAgICAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgICAgICAgICAgcFBpZWNlLT5ydFBpZWNlLmxlZnQgKz0gZkluYzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwUGllY2UtPnJ0UGllY2UudG9wCSArPSBmSW5jOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGREVfVGV4dE91dDo6T25EcmF3KGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwKQ0KK3sNCisgICAgaWYgKG1fcFJlbmRlckRldmljZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxpbmVzID0gbV90dG9MaW5lcy5HZXRTaXplKCk7DQorICAgIGlmIChpTGluZXMgPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSUZERV9Tb2xpZEJydXNoICpwQnJ1c2ggPSAoSUZERV9Tb2xpZEJydXNoKilJRkRFX0JydXNoOjpDcmVhdGUoRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQorICAgIHBCcnVzaC0+U2V0Q29sb3IobV9UeHRDb2xvcik7DQorICAgIElGREVfUGVuICpwUGVuID0gTlVMTDsNCisgICAgRkRFX0hERVZJQ0VTVEFURSBoRGV2ID0gbV9wUmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgICAgaWYgKHJ0Q2xpcC5XaWR0aCgpID4gMC4wZiAmJiBydENsaXAuSGVpZ2h0KCkgPiAwLjBmKSB7DQorICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlMaW5lczsgaSsrKSB7DQorICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpKTsNCisgICAgICAgIEZYX0lOVDMyIGlQaWVjZXMgPSBwTGluZS0+R2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgICAgICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChqKTsNCisgICAgICAgICAgICBpZiAocFBpZWNlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IEdldERpc3BsYXlQb3MocFBpZWNlKTsNCisgICAgICAgICAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdTdHJpbmcocEJydXNoLCBtX3BGb250LCBtX3BDaGFyUG9zLCBpQ291bnQsIG1fZkZvbnRTaXplLCAmbV9NYXRyaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBEcmF3TGluZShwUGllY2UsIHBQZW4pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcFJlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKGhEZXYpOw0KKyAgICBpZiAocEJydXNoKQl7DQorICAgICAgICBwQnJ1c2gtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBpZiAocFBlbikJew0KKyAgICAgICAgcFBlbi0+UmVsZWFzZSgpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGREVfVGV4dE91dDo6R2V0RGlzcGxheVBvcyhGREVfTFBUVE9QSUVDRSBwUGllY2UpDQorew0KKyAgICBGWF9UWFRSVU4gdHI7DQorICAgIFRvVGV4dFJ1bihwUGllY2UsIHRyKTsNCisgICAgRXhwYW5kQnVmZmVyKHRyLmlMZW5ndGgsIDIpOw0KKyAgICByZXR1cm4gbV9wVHh0QnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBtX3BDaGFyUG9zKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UZXh0T3V0OjpHZXRDaGFyUmVjdHMoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKQ0KK3sNCisgICAgRlhfVFhUUlVOIHRyOw0KKyAgICBUb1RleHRSdW4ocFBpZWNlLCB0cik7DQorICAgIG1fcmVjdEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm4gbV9wVHh0QnJlYWstPkdldENoYXJSZWN0cygmdHIsIG1fcmVjdEFycmF5KTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlRvVGV4dFJ1bihjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIEZYX1RYVFJVTiAmdHIpDQorew0KKyAgICB0ci5wQWNjZXNzCQk9IE5VTEw7DQorICAgIHRyLnBJZGVudGl0eQk9IE5VTEw7DQorICAgIHRyLnBTdHIJCQk9IChGWF9MUENXU1RSKW1fd3NUZXh0ICsgcFBpZWNlLT5pU3RhcnRDaGFyOw0KKyAgICB0ci5wV2lkdGhzCQk9IG1fcENoYXJXaWR0aHMgKyBwUGllY2UtPmlTdGFydENoYXI7DQorICAgIHRyLmlMZW5ndGgJCT0gcFBpZWNlLT5pQ2hhcnM7DQorICAgIHRyLnBGb250CQk9IG1fcEZvbnQ7DQorICAgIHRyLmZGb250U2l6ZQk9IG1fZkZvbnRTaXplOw0KKyAgICB0ci5kd1N0eWxlcwkJPSBtX2R3VHh0QmtTdHlsZXM7DQorICAgIHRyLmlDaGFyUm90YXRpb24gPSAwOw0KKyAgICB0ci5kd0NoYXJTdHlsZXMJPSBwUGllY2UtPmR3Q2hhclN0eWxlczsNCisgICAgdHIud0xpbmVCcmVha0NoYXIgPSBtX3dQYXJhZ3JhcGhCa0NoYXI7DQorICAgIHRyLnBSZWN0CQk9ICZwUGllY2UtPnJ0UGllY2U7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TGluZShjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIElGREVfUGVuIComcFBlbikNCit7DQorICAgIEZYX0JPT0wgYlVuZGVyTGluZSA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1VuZGVybGluZSkgPyBUUlVFIDogRkFMU0U7DQorICAgIEZYX0JPT0wgYlN0cmlrZU91dCA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1N0cmlrZW91dCkgPyBUUlVFIDogRkFMU0U7DQorICAgIEZYX0JPT0wgYkhvdEtleQkgICA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0hvdEtleSkgPyBUUlVFIDogRkFMU0U7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsICA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSA/IFRSVUUgOiBGQUxTRTsNCisgICAgaWYgKCFiVW5kZXJMaW5lICYmICFiU3RyaWtlT3V0ICYmICFiSG90S2V5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBQZW4gPT0gTlVMTCkgew0KKyAgICAgICAgcFBlbiA9IElGREVfUGVuOjpDcmVhdGUoKTsNCisgICAgICAgIHBQZW4tPlNldENvbG9yKG1fVHh0Q29sb3IpOw0KKyAgICB9DQorICAgIElGREVfUGF0aCAqcFBhdGggPSBJRkRFX1BhdGg6OkNyZWF0ZSgpOw0KKyAgICBGWF9JTlQzMiBpTGluZUNvdW50ID0gMDsNCisgICAgQ0ZYX1JlY3RGIHJ0VGV4dCA9IHBQaWVjZS0+cnRQaWVjZTsNCisgICAgQ0ZYX1BvaW50RiBwdDEsIHB0MjsNCisgICAgaWYgKGJVbmRlckxpbmUpIHsNCisgICAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgICAgICBwdDEueCA9IHJ0VGV4dC5sZWZ0Ow0KKyAgICAgICAgICAgIHB0MS55ID0gcnRUZXh0LnRvcDsNCisgICAgICAgICAgICBwdDIueCA9IHJ0VGV4dC5sZWZ0Ow0KKyAgICAgICAgICAgIHB0Mi55ID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwdDEueCA9IHJ0VGV4dC5sZWZ0Ow0KKyAgICAgICAgICAgIHB0MS55ID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICAgICAgICAgIHB0Mi54ID0gcnRUZXh0LnJpZ2h0KCk7DQorICAgICAgICAgICAgcHQyLnkgPSBydFRleHQuYm90dG9tKCk7DQorICAgICAgICB9DQorICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgICAgICBpTGluZUNvdW50Kys7DQorICAgIH0NCisgICAgaWYgKGJTdHJpa2VPdXQpIHsNCisgICAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgICAgICBwdDEueCA9IHJ0VGV4dC5sZWZ0ICsgcnRUZXh0LndpZHRoICogMi4wZiAvIDUuMGY7DQorICAgICAgICAgICAgcHQxLnkgPSBydFRleHQudG9wOzsNCisgICAgICAgICAgICBwdDIueCA9IHB0MS54Ow0KKyAgICAgICAgICAgIHB0Mi55ID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwdDEueCA9IHJ0VGV4dC5sZWZ0Ow0KKyAgICAgICAgICAgIHB0MS55ID0gcnRUZXh0LmJvdHRvbSgpIC0gcnRUZXh0LmhlaWdodCAqIDIuMGYgLyA1LjBmOw0KKyAgICAgICAgICAgIHB0Mi54ID0gcnRUZXh0LnJpZ2h0KCk7DQorICAgICAgICAgICAgcHQyLnkgPSBwdDEueTsNCisgICAgICAgIH0NCisgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICAgIGlMaW5lQ291bnQrKzsNCisgICAgfQ0KKyAgICBpZiAoYkhvdEtleSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUhvdEtleXMgPSBtX2hvdEtleXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50CSAgPSBHZXRDaGFyUmVjdHMocFBpZWNlKTsNCisgICAgICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlIb3RLZXlzOyBpKyspIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNoYXJJbmRleCA9IG1faG90S2V5cy5HZXRBdChpKTsNCisgICAgICAgICAgICAgICAgaWYgKGlDaGFySW5kZXggPj0gcFBpZWNlLT5pU3RhcnRDaGFyICYmIGlDaGFySW5kZXggPCBwUGllY2UtPmlTdGFydENoYXIgKyBwUGllY2UtPmlDaGFycykgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJlY3QgPSBtX3JlY3RBcnJheS5HZXRBdChpQ2hhckluZGV4IC0gcFBpZWNlLT5pU3RhcnRDaGFyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwdDEueCA9IHJlY3QubGVmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwdDEueSA9IHJlY3QudG9wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5sZWZ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi55ID0gcmVjdC5ib3R0b20oKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnggPSByZWN0LmxlZnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnkgPSByZWN0LmJvdHRvbSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5yaWdodCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi55ID0gcmVjdC5ib3R0b20oKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICAgICAgICAgICAgICAgIGlMaW5lQ291bnQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUxpbmVDb3VudCA+IDApIHsNCisgICAgICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1BhdGgocFBlbiwgMSwgcFBhdGgsICZtX01hdHJpeCk7DQorICAgIH0NCisgICAgcFBhdGgtPlJlbGVhc2UoKTsNCit9DQorQ0ZERV9UVE9MaW5lOjpDRkRFX1RUT0xpbmUoKQ0KKyAgICA6IG1fYk5ld1JlbG9hZChGQUxTRSkNCisgICAgLCBtX3BpZWNlcyg1KQ0KKyAgICAsIG1faVBpZWNlQ291bnQoMCkNCit7DQorfQ0KK0NGREVfVFRPTGluZTo6Q0ZERV9UVE9MaW5lKGNvbnN0IENGREVfVFRPTGluZSAmdHRvTGluZSkNCisgICAgOiBtX3BpZWNlcyg1KQ0KK3sNCisgICAgbV9iTmV3UmVsb2FkCT0gdHRvTGluZS5tX2JOZXdSZWxvYWQ7DQorICAgIG1faVBpZWNlQ291bnQJPSB0dG9MaW5lLm1faVBpZWNlQ291bnQ7DQorICAgIG1fcGllY2VzLkNvcHkodHRvTGluZS5tX3BpZWNlcyk7DQorfQ0KK0NGREVfVFRPTGluZTo6fkNGREVfVFRPTGluZSgpDQorew0KK30NCitGWF9JTlQzMiBDRkRFX1RUT0xpbmU6OkFkZFBpZWNlKEZYX0lOVDMyIGluZGV4LCBjb25zdCBGREVfVFRPUElFQ0UgJnR0b1BpZWNlKQ0KK3sNCisgICAgaWYgKGluZGV4ID49IG1faVBpZWNlQ291bnQpIHsNCisgICAgICAgIGluZGV4ID0gbV9waWVjZXMuQWRkKHR0b1BpZWNlKSArIDE7DQorICAgICAgICBtX2lQaWVjZUNvdW50Kys7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGREVfVFRPUElFQ0UgJnBpZWNlID0gbV9waWVjZXMuR2V0QXQoaW5kZXgpOw0KKyAgICAgICAgcGllY2UgPSB0dG9QaWVjZTsNCisgICAgfQ0KKyAgICByZXR1cm4gaW5kZXg7DQorfQ0KK0ZYX0lOVDMyIENGREVfVFRPTGluZTo6R2V0U2l6ZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9pUGllY2VDb3VudDsNCit9DQorRkRFX0xQVFRPUElFQ0UgQ0ZERV9UVE9MaW5lOjpHZXRQdHJBdChGWF9JTlQzMiBpbmRleCkNCit7DQorICAgIGlmIChpbmRleCA+PSBtX2lQaWVjZUNvdW50KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9waWVjZXMuR2V0UHRyQXQoaW5kZXgpOw0KK30NCit2b2lkIENGREVfVFRPTGluZTo6UmVtb3ZlTGFzdChGWF9JTlQzMiBpQ291bnQpDQorew0KKyAgICBtX3BpZWNlcy5SZW1vdmVMYXN0KGlDb3VudCk7DQorfQ0KK3ZvaWQgQ0ZERV9UVE9MaW5lOjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpDQorew0KKyAgICBtX3BpZWNlcy5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5oIGIveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmFkODkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1RFWFRPVVRfSU1QDQorI2RlZmluZSBfRkRFX1RFWFRPVVRfSU1QDQorc3RydWN0IEZERV9UVE9QSUVDRSB7DQorcHVibGljOg0KKyAgICBGWF9JTlQzMglpU3RhcnRDaGFyOw0KKyAgICBGWF9JTlQzMglpQ2hhcnM7DQorICAgIEZYX0RXT1JECWR3Q2hhclN0eWxlczsNCisgICAgQ0ZYX1JlY3RGCXJ0UGllY2U7DQorfTsNCit0eXBlZGVmIEZERV9UVE9QSUVDRSAqIEZERV9MUFRUT1BJRUNFOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZERV9UVE9QSUVDRT4gQ0ZERV9UVE9QaWVjZUFycmF5Ow0KK2NsYXNzIENGREVfVFRPTGluZSA6IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9UVE9MaW5lKCk7DQorICAgIENGREVfVFRPTGluZShjb25zdCBDRkRFX1RUT0xpbmUgJnR0b0xpbmUpOw0KKyAgICB+Q0ZERV9UVE9MaW5lKCk7DQorICAgIEZYX0lOVDMyCQlBZGRQaWVjZShGWF9JTlQzMiBpbmRleCwgY29uc3QgRkRFX1RUT1BJRUNFICZ0dG9QaWVjZSk7DQorICAgIEZYX0lOVDMyCQlHZXRTaXplKCkgY29uc3Q7DQorICAgIEZERV9MUFRUT1BJRUNFCUdldFB0ckF0KEZYX0lOVDMyIGluZGV4KTsNCisgICAgdm9pZAkJCVJlbW92ZUxhc3QoRlhfSU5UMzIgaUNvdW50KTsNCisgICAgdm9pZAkJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSk7DQorICAgIEZYX0JPT0wJCQltX2JOZXdSZWxvYWQ7DQorICAgIENGREVfVFRPUGllY2VBcnJheSBtX3BpZWNlczsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0lOVDMyCQltX2lQaWVjZUNvdW50Ow0KK307DQordHlwZWRlZiBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGU8Q0ZERV9UVE9MaW5lPiBDRkRFX1RUT0xpbmVBcnJheTsNCitjbGFzcyBDRkRFX1RleHRPdXQgOiBwdWJsaWMgSUZERV9UZXh0T3V0LCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfVGV4dE91dCgpOw0KKyAgICB+Q0ZERV9UZXh0T3V0KCk7DQorICAgIHZpcnR1YWwJdm9pZAkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFRleHRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXMpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCk7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0RWxsaXBzaXNTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRWxsaXBzaXMpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEFsaWdubWVudChGWF9JTlQzMiBpQWxpZ25tZW50KTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRMaW5lU3BhY2UoRlhfRkxPQVQgZkxpbmVTcGFjZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0RElCaXRtYXAoQ0ZYX0RJQml0bWFwICpwRElCKTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3QgJnJ0Q2xpcCk7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKTsNCisgICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1NpemUgJnNpemUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUNhbGNTaXplKEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfU2l6ZUYgJnNpemUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUNhbGNTaXplKEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfUmVjdCAmcmVjdCk7DQorICAgIHZpcnR1YWwgdm9pZAkJQ2FsY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCk7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJRHJhd1RleHQoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURyYXdUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgICAgdmlydHVhbCB2b2lkCQlEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3QgJnJlY3QpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURyYXdUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldExvZ2ljQ2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUNhbGNMb2dpY1NpemUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJQ2FsY0xvZ2ljU2l6ZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdmlydHVhbCB2b2lkCQlEcmF3TG9naWNUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgICAgdmlydHVhbCB2b2lkCQlEcmF3TG9naWNUZXh0KEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldFRvdGFsTGluZXMoKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJQ2FsY1RleHRTaXplKEZYX0xQQ1dTVFIgcHdzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICBGWF9CT09MCQkJCVJldHJpZXZlTGluZVdpZHRoKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsIEZYX0ZMT0FUICZmU3RhcnRQb3MsIEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCisgICAgdm9pZAkJCQlTZXRMaW5lV2lkdGgoQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZAkJCQlEcmF3VGV4dChGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCk7DQorICAgIHZvaWQJCQkJTG9hZFRleHQoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZvaWQJCQkJTG9hZEVsbGlwc2lzKCk7DQorICAgIHZvaWQJCQkJRXhwYW5kQnVmZmVyKEZYX0lOVDMyIGlTaXplLCBGWF9JTlQzMiBpVHlwZSk7DQorICAgIHZvaWQJCQkJUmV0cmlldmVFbGxQaWVjZXMoRlhfSU5UMzIgKiZwQ2hhcldpZHRocyk7DQorDQorICAgIHZvaWQJCQkJUmVsb2FkKGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZvaWQJCQkJUmVsb2FkTGluZVBpZWNlKENGREVfVFRPTGluZSAqcExpbmUsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIEZYX0JPT0wJCQkJUmV0cmllY2VQaWVjZXMoRlhfRFdPUkQgZHdCcmVha1N0YXR1cywgRlhfSU5UMzIgJmlTdGFydENoYXIsIEZYX0lOVDMyICZpUGllY2VXaWR0aHMsIEZYX0JPT0wgYlJlbG9hZCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZAkJCQlBcHBlbmRQaWVjZShjb25zdCBGREVfVFRPUElFQ0UgJnR0b1BpZWNlLCBGWF9CT09MIGJOZWVkUmVsb2FkLCBGWF9CT09MIGJFbmQpOw0KKyAgICB2b2lkCQkJCVJlcGxhY2VXaWR0aEVsbGlwc2lzKCk7DQorICAgIHZvaWQJCQkJRG9BbGlnbm1lbnQoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZAkJCQlPbkRyYXcoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApOw0KKyAgICBGWF9JTlQzMgkJCUdldERpc3BsYXlQb3MoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKTsNCisgICAgRlhfSU5UMzIJCQlHZXRDaGFyUmVjdHMoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKTsNCisNCisgICAgdm9pZAkJCQlUb1RleHRSdW4oY29uc3QgRkRFX0xQVFRPUElFQ0UgcFBpZWNlLCBGWF9UWFRSVU4gJnRyKTsNCisgICAgdm9pZAkJCQlEcmF3TGluZShjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIElGREVfUGVuIComcFBlbik7DQorDQorICAgIElGWF9UeHRCcmVhawkJKm1fcFR4dEJyZWFrOw0KKyAgICBJRlhfRm9udAkJCSptX3BGb250Ow0KKyAgICBGWF9GTE9BVAkJCW1fZkZvbnRTaXplOw0KKyAgICBGWF9GTE9BVAkJCW1fZkxpbmVTcGFjZTsNCisgICAgRlhfRkxPQVQJCQltX2ZMaW5lUG9zOw0KKyAgICBGWF9GTE9BVAkJCW1fZlRvbGVyYW5jZTsNCisNCisgICAgRlhfSU5UMzIJCQltX2lBbGlnbm1lbnQ7DQorICAgIEZYX0lOVDMyCQkJbV9pVHh0QmtBbGlnbm1lbnQ7DQorICAgIEZYX0lOVDMyCQkJKm1fcENoYXJXaWR0aHM7DQorICAgIEZYX0lOVDMyCQkJbV9pQ2hhcnM7DQorICAgIEZYX0lOVDMyCQkJKm1fcEVsbENoYXJXaWR0aHM7DQorICAgIEZYX0lOVDMyCQkJbV9pRWxsQ2hhcnM7DQorICAgIEZYX1dDSEFSCQkJbV93UGFyYWdyYXBoQmtDaGFyOw0KKyAgICBGWF9BUkdCCQkJCW1fVHh0Q29sb3I7DQorICAgIEZYX0RXT1JECQkJbV9kd1N0eWxlczsNCisgICAgRlhfRFdPUkQJCQltX2R3VHh0QmtTdHlsZXM7DQorICAgIENGWF9XaWRlU3RyaW5nCQltX3dzRWxsaXBzaXM7DQorICAgIEZYX0JPT0wJCQkJbV9iRWxsaUNoYW5nZWQ7DQorICAgIEZYX0lOVDMyCQkJbV9pRWxsaXBzaXNXaWR0aDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCW1fd3NUZXh0Ow0KKyAgICBDRlhfUmVjdEYJCQltX3J0Q2xpcDsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydExvZ2ljQ2xpcDsNCisgICAgQ0ZYX01hdHJpeAkJCW1fTWF0cml4Ow0KKyAgICBDRkRFX1RUT0xpbmVBcnJheQltX3R0b0xpbmVzOw0KKyAgICBGWF9JTlQzMgkJCW1faUN1ckxpbmU7DQorICAgIEZYX0lOVDMyCQkJbV9pQ3VyUGllY2U7DQorICAgIEZYX0lOVDMyCQkJbV9pVG90YWxMaW5lczsNCisgICAgRlhURVhUX0NIQVJQT1MJCSptX3BDaGFyUG9zOw0KKyAgICBGWF9JTlQzMgkJCW1faUNoYXJQb3NTaXplOw0KKyAgICBJRkRFX1JlbmRlckRldmljZQkqbV9wUmVuZGVyRGV2aWNlOw0KKyAgICBDRlhfSW50MzJBcnJheQkJbV9ob3RLZXlzOw0KKyAgICBDRlhfUmVjdEZBcnJheQkJbV9yZWN0QXJyYXk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuY3BwIGIveGZhL3NyYy9mZHAvc3JjL3htbC9mZGVfeG1sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU0YjQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL3htbC9mZGVfeG1sLmNwcApAQCAtMCwwICsxLDI3MTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV94bWwuaCINCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisjZGVmaW5lIEZERV9YTUxWQUxJRENIQVJSQU5HRU5VTQk1DQorc3RhdGljIEZYX1dDSEFSIGdfWE1MVmFsaWRDaGFyUmFuZ2VbRkRFX1hNTFZBTElEQ0hBUlJBTkdFTlVNXVsyXSA9IHt7MHgwOSwgMHgwOX0sIHsweDBBLCAweDBBfSwgezB4MEQsIDB4MER9LCB7MHgyMCwgMHhEN0ZGfSwgezB4RTAwMCwgMHhGRkZEfX07DQorRlhfQk9PTCBGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpDQorew0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpRW5kID0gRkRFX1hNTFZBTElEQ0hBUlJBTkdFTlVNIC0gMSwgaU1pZDsNCisgICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGlmIChjaCA8IGdfWE1MVmFsaWRDaGFyUmFuZ2VbaU1pZF1bMF0pIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID4gZ19YTUxWYWxpZENoYXJSYW5nZVtpTWlkXVsxXSkgew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgRkRFX0lzWE1MV2hpdGVTcGFjZShGWF9XQ0hBUiBjaCkNCit7DQorICAgIHJldHVybiBjaCA9PSBMJyAnIHx8IGNoID09IDB4MEEgfHwgY2ggPT0gMHgwRCB8fCBjaCA9PSAweDA5Ow0KK30NCit0eXBlZGVmIHN0cnVjdCBfRkRFX1hNTE5BTUVDSEFSIHsNCisgICAgRlhfV0NIQVIJd1N0YXJ0Ow0KKyAgICBGWF9XQ0hBUgl3RW5kOw0KKyAgICBGWF9CT09MCWJTdGFydENoYXI7DQorfSBGREVfWE1MTkFNRUNIQVI7DQorI2RlZmluZSBGREVfWE1MTkFNRUNIQVJTTlVNCQkyMA0KK3N0YXRpYyBGREVfWE1MTkFNRUNIQVIgZ19YTUxOYW1lQ2hhcnNbRkRFX1hNTE5BTUVDSEFSU05VTV0gPSB7DQorICAgIHtMJy0nLCBMJy4nLCBGQUxTRX0sCQl7TCcwJywgTCc5JywgRkFMU0V9LAkJe0wnOicsIEwnOicsIEZBTFNFfSwJCXtMJ0EnLCBMJ1onLCBUUlVFfSwNCisgICAge0wnXycsIEwnXycsIFRSVUV9LAkJCXtMJ2EnLCBMJ3onLCBUUlVFfSwJCQl7MHhCNywgMHhCNywgRkFMU0V9LAkJezB4QzAsIDB4RDYsIFRSVUV9LA0KKyAgICB7MHhEOCwgMHhGNiwgVFJVRX0sCQkJezB4RjgsIDB4MDJGRiwgVFJVRX0sCQl7MHgwMzAwLCAweDAzNkYsIEZBTFNFfSwJezB4MDM3MCwgMHgwMzdELCBUUlVFfSwNCisgICAgezB4MDM3RiwgMHgxRkZGLCBUUlVFfSwJCXsweDIwMEMsIDB4MjAwRCwgVFJVRX0sCQl7MHgyMDNGLCAweDIwNDAsIEZBTFNFfSwJezB4MjA3MCwgMHgyMThGLCBUUlVFfSwNCisgICAgezB4MkMwMCwgMHgyRkVGLCBUUlVFfSwJCXsweDMwMDEsIDB4RDdGRiwgVFJVRX0sCQl7MHhGOTAwLCAweEZEQ0YsIFRSVUV9LAkJezB4RkRGMCwgMHhGRkZELCBUUlVFfSwNCit9Ow0KK0ZYX0JPT0wgRkRFX0lzWE1MTmFtZUNoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgYkZpcnN0Q2hhcikNCit7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSBGREVfWE1MTkFNRUNIQVJTTlVNIC0gMSwgaU1pZDsNCisgICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGlmIChjaCA8IGdfWE1MTmFtZUNoYXJzW2lNaWRdLndTdGFydCkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPiBnX1hNTE5hbWVDaGFyc1tpTWlkXS53RW5kKSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChiRmlyc3RDaGFyKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBnX1hNTE5hbWVDaGFyc1tpTWlkXS5iU3RhcnRDaGFyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCitDRkRFX1hNTE5vZGU6OkNGREVfWE1MTm9kZSgpDQorICAgIDogbV9wUGFyZW50KE5VTEwpDQorICAgICwgbV9wQ2hpbGQoTlVMTCkNCisgICAgLCBtX3BQcmlvcihOVUxMKQ0KKyAgICAsIG1fcE5leHQoTlVMTCkNCit7DQorfQ0KK0NGREVfWE1MTm9kZTo6fkNGREVfWE1MTm9kZSgpDQorew0KKyAgICBEZWxldGVDaGlsZHJlbigpOw0KK30NCit2b2lkIENGREVfWE1MTm9kZTo6RGVsZXRlQ2hpbGRyZW4oKQ0KK3sNCisgICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZCwgKnBUZW1wOw0KKyAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgIHBUZW1wID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgICAgcENoaWxkLT5SZWxlYXNlKCk7DQorICAgICAgICBwQ2hpbGQgPSBwVGVtcDsNCisgICAgfQ0KKyAgICBtX3BDaGlsZCA9IE5VTEw7DQorfQ0KK0ZYX0lOVDMyIENGREVfWE1MTm9kZTo6Q291bnRDaGlsZE5vZGVzKCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIENGREVfWE1MTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICAgICAgaUNvdW50ICsrOw0KKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpHZXRDaGlsZE5vZGUoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorew0KKyAgICBDRkRFX1hNTE5vZGUgKnBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChpbmRleCA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBDaGlsZDsNCisgICAgICAgIH0NCisgICAgICAgIGluZGV4IC0tOw0KKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDRkRFX1hNTE5vZGU6OkdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSAqcE5vZGUpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgIENGREVfWE1MTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKHBDaGlsZCA9PSBwTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsNCisgICAgICAgIH0NCisgICAgICAgIGluZGV4ICsrOw0KKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHJldHVybiAtMTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OkdldFBhdGgoRlhfTFBDV1NUUiBwUGF0aCwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfQk9PTCBiUXVhbGlmaWVkTmFtZSkgY29uc3QNCit7DQorICAgIEZYU1lTX2Fzc2VydChwUGF0aCAhPSBOVUxMKTsNCisgICAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgICAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBQYXRoKTsNCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyBjc1BhdGg7DQorICAgIEZYX0xQQ1dTVFIgcFN0YXJ0ID0gcFBhdGgsIHBFbmQgPSBwUGF0aCArIGlMZW5ndGg7DQorICAgIEZYX1dDSEFSIGNoOw0KKyAgICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KKyAgICAgICAgY2ggPSAqcFN0YXJ0ICsrOw0KKyAgICAgICAgaWYgKGNoID09IEwnLycpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY3NQYXRoICs9IGNoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlMZW5ndGggLT0gcFN0YXJ0IC0gcFBhdGg7DQorICAgIENGREVfWE1MTm9kZSAqcEZpbmQgPSBOVUxMOw0KKyAgICBpZiAoY3NQYXRoLkdldExlbmd0aCgpIDwgMSkgew0KKyAgICAgICAgcEZpbmQgPSBHZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlJvb3QpOw0KKyAgICB9IGVsc2UgaWYgKGNzUGF0aC5Db21wYXJlKEwiLi4iKSA9PSAwKSB7DQorICAgICAgICBwRmluZCA9IG1fcFBhcmVudDsNCisgICAgfSBlbHNlIGlmIChjc1BhdGguQ29tcGFyZShMIi4iKSA9PSAwKSB7DQorICAgICAgICBwRmluZCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZzsNCisgICAgICAgIENGREVfWE1MTm9kZSAqcE5vZGUgPSBtX3BDaGlsZDsNCisgICAgICAgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgaWYgKHBOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBpZiAoYlF1YWxpZmllZE5hbWUpIHsNCisgICAgICAgICAgICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPkdldFRhZ05hbWUod3NUYWcpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAod3NUYWcuQ29tcGFyZShjc1BhdGgpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBGaW5kID0gcE5vZGU7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBGaW5kID0gcE5vZGUtPkdldFBhdGgocFN0YXJ0LCBpTGVuZ3RoLCBiUXVhbGlmaWVkTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAocEZpbmQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwRmluZDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwRmluZCA9PSBOVUxMIHx8IGlMZW5ndGggPCAxKSB7DQorICAgICAgICByZXR1cm4gcEZpbmQ7DQorICAgIH0NCisgICAgcmV0dXJuIHBGaW5kLT5HZXRQYXRoKHBTdGFydCwgaUxlbmd0aCwgYlF1YWxpZmllZE5hbWUpOw0KK30NCitGWF9JTlQzMiBDRkRFX1hNTE5vZGU6Okluc2VydENoaWxkTm9kZShDRkRFX1hNTE5vZGUgKnBOb2RlLCBGWF9JTlQzMiBpbmRleCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwTm9kZSAhPSBOVUxMKTsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IHRoaXM7DQorICAgIGlmIChtX3BDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICBtX3BDaGlsZCA9IHBOb2RlOw0KKyAgICAgICAgcE5vZGUtPm1fcFByaW9yID0gTlVMTDsNCisgICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gTlVMTDsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9IGVsc2UgaWYgKGluZGV4ID09IDApIHsNCisgICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wQ2hpbGQ7DQorICAgICAgICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KKyAgICAgICAgbV9wQ2hpbGQtPm1fcFByaW9yID0gcE5vZGU7DQorICAgICAgICBtX3BDaGlsZCA9IHBOb2RlOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgQ0ZERV9YTUxOb2RlICpwRmluZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAoKytpQ291bnQgIT0gaW5kZXggJiYgcEZpbmQtPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgcEZpbmQgPSBwRmluZC0+bV9wTmV4dDsNCisgICAgfQ0KKyAgICBwTm9kZS0+bV9wUHJpb3IgPSBwRmluZDsNCisgICAgcE5vZGUtPm1fcE5leHQgPSBwRmluZC0+bV9wTmV4dDsNCisgICAgaWYgKHBGaW5kLT5tX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHBGaW5kLT5tX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOw0KKyAgICB9DQorICAgIHBGaW5kLT5tX3BOZXh0ID0gcE5vZGU7DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxOb2RlOjpSZW1vdmVDaGlsZE5vZGUoQ0ZERV9YTUxOb2RlICpwTm9kZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BDaGlsZCAhPSBOVUxMICYmIHBOb2RlICE9IE5VTEwpOw0KKyAgICBpZiAobV9wQ2hpbGQgPT0gcE5vZGUpIHsNCisgICAgICAgIG1fcENoaWxkID0gcE5vZGUtPm1fcE5leHQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwTm9kZS0+bV9wUHJpb3ItPm1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgfQ0KKyAgICBpZiAocE5vZGUtPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgcE5vZGUtPm1fcE5leHQtPm1fcFByaW9yID0gcE5vZGUtPm1fcFByaW9yOw0KKyAgICB9DQorICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICBwTm9kZS0+bV9wTmV4dCA9IE5VTEw7DQorICAgIHBOb2RlLT5tX3BQcmlvciA9IE5VTEw7DQorfQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpHZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSBjb25zdA0KK3sNCisgICAgc3dpdGNoIChlSXRlbSkgew0KKyAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6OlJvb3Q6IHsNCisgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwUGFyZW50ID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHBQYXJlbnQtPm1fcFBhcmVudCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+bV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwUGFyZW50Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQYXJlbnQ6DQorICAgICAgICAgICAgcmV0dXJuIG1fcFBhcmVudDsNCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpGaXJzdFNpYmxpbmc6IHsNCisgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwSXRlbSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbS0+bV9wUHJpb3IgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUHJpb3I7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHBJdGVtID09IChDRkRFX1hNTE5vZGUqKXRoaXMgPyBOVUxMIDogcEl0ZW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6OlByaW9yU2libGluZzoNCisgICAgICAgICAgICByZXR1cm4gbV9wUHJpb3I7DQorICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmc6DQorICAgICAgICAgICAgcmV0dXJuIG1fcE5leHQ7DQorICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6TGFzdFNpYmxpbmc6IHsNCisgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwSXRlbSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbS0+bV9wTmV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBJdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpGaXJzdE5laWdoYm9yOiB7DQorICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwUGFyZW50LT5tX3BQYXJlbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPm1fcFBhcmVudDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcFBhcmVudCA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBQYXJlbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6OlByaW9yTmVpZ2hib3I6IHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcFByaW9yID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BQYXJlbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwSXRlbSA9IG1fcFByaW9yOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoQ0ZERV9YTUxOb2RlICpwVGVtcCA9IHBJdGVtLT5tX3BDaGlsZCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocFRlbXAgPSBwSXRlbS0+bV9wTmV4dCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtID0gcFRlbXA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHBJdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpOZXh0TmVpZ2hib3I6IHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BDaGlsZDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobV9wTmV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wTmV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUgKnBJdGVtID0gbV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICB3aGlsZSAocEl0ZW0gIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtLT5tX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEl0ZW0tPm1fcE5leHQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6Okxhc3ROZWlnaGJvcjogew0KKyAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUgKnBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHBJdGVtLT5tX3BQYXJlbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEl0ZW0tPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAocEl0ZW0tPm1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcENoaWxkOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBJdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BDaGlsZDsNCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpMYXN0Q2hpbGQ6IHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwQ2hpbGQtPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0ZERV9YTUxOb2RlOjpHZXROb2RlTGV2ZWwoKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaUxldmVsID0gMDsNCisgICAgQ0ZERV9YTUxOb2RlICpwSXRlbSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgIHdoaWxlICgocEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50KSAhPSBOVUxMKSB7DQorICAgICAgICBpTGV2ZWwgKys7DQorICAgIH0NCisgICAgcmV0dXJuIGlMZXZlbDsNCit9DQorRlhfQk9PTCBDRkRFX1hNTE5vZGU6Okluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sIENGREVfWE1MTm9kZSAqcE5vZGUpDQorew0KKyAgICBGWFNZU19hc3NlcnQocE5vZGUgIT0gTlVMTCk7DQorICAgIHN3aXRjaCAoZUl0ZW0pIHsNCisgICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpOZXh0U2libGluZzogew0KKyAgICAgICAgICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gbV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcE5leHQ7DQorICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BQcmlvciA9IHRoaXM7DQorICAgICAgICAgICAgICAgIGlmIChtX3BOZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcE5leHQgPSBwTm9kZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6OlByaW9yU2libGluZzogew0KKyAgICAgICAgICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gbV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IHRoaXM7DQorICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BQcmlvciA9IG1fcFByaW9yOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wUHJpb3IpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcFByaW9yLT5tX3BOZXh0ID0gcE5vZGU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wUGFyZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BQYXJlbnQtPm1fcENoaWxkID0gcE5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wUHJpb3IgPSBwTm9kZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6UmVtb3ZlTm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkNCit7DQorICAgIENGREVfWE1MTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgICBzd2l0Y2ggKGVJdGVtKSB7DQorICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmc6DQorICAgICAgICAgICAgaWYgKG1fcE5leHQpIHsNCisgICAgICAgICAgICAgICAgcE5vZGUgPSBtX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICBtX3BOZXh0ID0gcE5vZGUtPm1fcE5leHQ7DQorICAgICAgICAgICAgICAgIGlmIChtX3BOZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BOZXh0LT5tX3BQcmlvciA9IHRoaXM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgcE5vZGUtPm1fcFByaW9yID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCit2b2lkICBDRkRFX1hNTE5vZGU6OlNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0pDQorew0KKyAgICBDRkRFX1hNTE5vZGUgKnBOb2RlID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgRlhTWVNfYXNzZXJ0KHBYTUxTdHJlYW0gIT0gTlVMTCAmJiBwTm9kZSAhPSBOVUxMKTsNCisgICAgc3dpdGNoIChwTm9kZS0+R2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgICAgICAgICBDRkRFX1hNTEluc3RydWN0aW9uICpwSW5zdHJ1Y3Rpb24gPSAoQ0ZERV9YTUxJbnN0cnVjdGlvbiopcE5vZGU7DQorICAgICAgICAgICAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuQ29tcGFyZU5vQ2FzZShMInhtbCIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkxFKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJVVEYtMTYiOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiVVRGLTE2YmUiOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlVURi04IjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCI/PiI7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3MuRm9ybWF0KChGWF9MUENXU1RSKUwiPD8lcyIsIChGWF9MUENXU1RSKXBJbnN0cnVjdGlvbi0+bV93c1RhcmdldCk7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmYXR0cmlidXRlcyA9IHBJbnN0cnVjdGlvbi0+bV9BdHRyaWJ1dGVzOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaSwgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBMIiAiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IGF0dHJpYnV0ZXNbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCI9XCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCImIiwgKEZYX0xQQ1dTVFIpTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZSgoRlhfTFBDV1NUUilMIjwiLCAoRlhfTFBDV1NUUilMIiZsdDsiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCI+IiwgKEZYX0xQQ1dTVFIpTCImZ3Q7Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCciLCAoRlhfTFBDV1NUUilMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZSgoRlhfTFBDV1NUUilMIlwiIiwgKEZYX0xQQ1dTVFIpTCImcXVvdDsiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cyArPSB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5ICZ0YXJnZXRkYXRhID0gcEluc3RydWN0aW9uLT5tX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSB0YXJnZXRkYXRhLkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gTCIgXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IHRhcmdldGRhdGFbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJcIiI7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCI/PiI7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgICAgICAgICB3cyA9IEwiPCI7DQorICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgJmF0dHJpYnV0ZXMgPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX0F0dHJpYnV0ZXM7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IGF0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCIgIjsNCisgICAgICAgICAgICAgICAgICAgIHdzICs9IGF0dHJpYnV0ZXNbaV07DQorICAgICAgICAgICAgICAgICAgICB3cyArPSBMIj1cIiI7DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gYXR0cmlidXRlc1tpICsgMV07DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCImIiwgKEZYX0xQQ1dTVFIpTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiPCIsIChGWF9MUENXU1RSKUwiJmx0OyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiPiIsIChGWF9MUENXU1RSKUwiJmd0OyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCciLCAoRlhfTFBDV1NUUilMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCIiLCAoRlhfTFBDV1NUUilMIiZxdW90OyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3MgKz0gd3NWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocE5vZGUtPm1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCJcbi8+IjsNCisgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3cyA9IEwiXG4+IjsNCisgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUgKnBDaGlsZCA9IHBOb2RlLT5tX3BDaGlsZDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZC0+U2F2ZVhNTE5vZGUocFhNTFN0cmVhbSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3MgPSBMIjwvIjsNCisgICAgICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlxuPiI7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gKChDRkRFX1hNTFRleHQqKXBOb2RlKS0+bV93c1RleHQ7DQorICAgICAgICAgICAgICAgIHdzLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCImIiwgKEZYX0xQQ1dTVFIpTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiPCIsIChGWF9MUENXU1RSKUwiJmx0OyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiPiIsIChGWF9MUENXU1RSKUwiJmd0OyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCciLCAoRlhfTFBDV1NUUilMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCIiLCAoRlhfTFBDV1NUUilMIiZxdW90OyIpOw0KKyAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7DQorICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxDaGFyRGF0YSopcE5vZGUpLT5tX3dzQ2hhckRhdGE7DQorICAgICAgICAgICAgICAgIHdzICs9IEwiXV0+IjsNCisgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1Vua25vd246DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9YTUxOb2RlOjpDbG9uZUNoaWxkcmVuKENGREVfWE1MTm9kZSogcENsb25lKQ0KK3sNCisgICAgaWYgKCFtX3BDaGlsZCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGREVfWE1MTm9kZSogcE5leHQgPSBtX3BDaGlsZDsNCisgICAgQ0ZERV9YTUxOb2RlKiBwQ2xvbmVOZXh0ID0gcE5leHQtPkNsb25lKFRSVUUpOw0KKyAgICBwQ2xvbmUtPkluc2VydENoaWxkTm9kZShwQ2xvbmVOZXh0KTsNCisgICAgcE5leHQgPSBwTmV4dC0+bV9wTmV4dDsNCisgICAgd2hpbGUgKHBOZXh0KSB7DQorICAgICAgICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IHBOZXh0LT5DbG9uZShUUlVFKTsNCisgICAgICAgIHBDbG9uZU5leHQtPkluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcsIHBDaGlsZCk7DQorICAgICAgICBwQ2xvbmVOZXh0ID0gcENoaWxkOw0KKyAgICAgICAgcE5leHQgPSBwTmV4dC0+bV9wTmV4dDsNCisgICAgfQ0KK30NCitJRkRFX1hNTEluc3RydWN0aW9uKiBJRkRFX1hNTEluc3RydWN0aW9uOjpDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFyZ2V0KQ0KK3sNCisgICAgcmV0dXJuIChJRkRFX1hNTEluc3RydWN0aW9uKilGREVfTmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24od3NUYXJnZXQpOw0KK30NCitDRkRFX1hNTEluc3RydWN0aW9uOjpDRkRFX1hNTEluc3RydWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkNCisgICAgOiBDRkRFX1hNTE5vZGUoKQ0KKyAgICAsIG1fd3NUYXJnZXQod3NUYXJnZXQpDQorICAgICwgbV9UYXJnZXREYXRhKCkNCisgICAgLCBtX0F0dHJpYnV0ZXMoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fd3NUYXJnZXQuR2V0TGVuZ3RoKCkgPiAwKTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTEluc3RydWN0aW9uOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQorew0KKyAgICBDRkRFX1hNTEluc3RydWN0aW9uKiBwQ2xvbmUgPSBGREVfTmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24obV93c1RhcmdldCk7DQorICAgIGlmICghcENsb25lKSB7DQorICAgICAgICByZXR1cm4gcENsb25lOw0KKyAgICB9DQorICAgIHBDbG9uZS0+bV9BdHRyaWJ1dGVzLkNvcHkobV9BdHRyaWJ1dGVzKTsNCisgICAgcENsb25lLT5tX1RhcmdldERhdGEuQ29weShtX1RhcmdldERhdGEpOw0KKyAgICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICAgICAgQ2xvbmVDaGlsZHJlbihwQ2xvbmUpOw0KKyAgICB9DQorICAgIHJldHVybiBwQ2xvbmU7DQorfQ0KK0ZYX0lOVDMyIENGREVfWE1MSW5zdHJ1Y3Rpb246OkNvdW50QXR0cmlidXRlcygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9BdHRyaWJ1dGVzLkdldFNpemUoKSAvIDI7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0QXR0cmlidXRlKEZYX0lOVDMyIGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IGlDb3VudCAvIDIpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgIGlmIChpbmRleCA9PSAwKSB7DQorICAgICAgICAgICAgd3NBdHRyaU5hbWUgPSBtX0F0dHJpYnV0ZXNbaV07DQorICAgICAgICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGluZGV4IC0tOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRkRFX1hNTEluc3RydWN0aW9uOjpIYXNBdHRyaWJ1dGUoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0U3RyaW5nKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlLCBGWF9MUENXU1RSIHB3c0RlZlZhbHVlKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgd3NBdHRyaVZhbHVlID0gcHdzRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydCh3c0F0dHJpTmFtZS5HZXRMZW5ndGgoKSA+IDApOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZSh3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgICAgICAgIG1fQXR0cmlidXRlc1tpXSA9IHdzQXR0cmlOYW1lOw0KKyAgICAgICAgICAgIG1fQXR0cmlidXRlc1tpICsgMV0gPSB3c0F0dHJpVmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fQXR0cmlidXRlcy5BZGQod3NBdHRyaU5hbWUpOw0KKyAgICBtX0F0dHJpYnV0ZXMuQWRkKHdzQXR0cmlWYWx1ZSk7DQorfQ0KK0ZYX0lOVDMyIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldEludGVnZXIoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0lOVDMyIGlEZWZWYWx1ZSkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBGWFNZU193dG9pKChGWF9MUENXU1RSKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0SW50ZWdlcihGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfSU5UMzIgaUF0dHJpVmFsdWUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICB3c1ZhbHVlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgaUF0dHJpVmFsdWUpOw0KKyAgICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCit9DQorRlhfRkxPQVQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0RmxvYXQoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZEZWZWYWx1ZSkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBGWF93Y3N0b2YoKEZYX0xQQ1dTVFIpbV9BdHRyaWJ1dGVzW2kgKyAxXSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGZEZWZWYWx1ZTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpTZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICB3c1ZhbHVlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVmIiwgZkF0dHJpVmFsdWUpOw0KKyAgICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpSZW1vdmVBdHRyaWJ1dGUoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICAgICAgICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQXQoaSArIDEpOw0KKyAgICAgICAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6Q291bnREYXRhKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX1RhcmdldERhdGEuR2V0U2l6ZSgpOw0KK30NCitGWF9CT09MIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldERhdGEoRlhfSU5UMzIgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpIGNvbnN0DQorew0KKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fVGFyZ2V0RGF0YS5HZXRTaXplKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3c0RhdGEgPSBtX1RhcmdldERhdGFbaW5kZXhdOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpBcHBlbmREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpDQorew0KKyAgICBtX1RhcmdldERhdGEuQWRkKHdzRGF0YSk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6UmVtb3ZlRGF0YShGWF9JTlQzMiBpbmRleCkNCit7DQorICAgIG1fVGFyZ2V0RGF0YS5SZW1vdmVBdChpbmRleCk7DQorfQ0KK0lGREVfWE1MRWxlbWVudCogSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKQ0KK3sNCisgICAgcmV0dXJuIChJRkRFX1hNTEVsZW1lbnQqKUZERV9OZXcgQ0ZERV9YTUxFbGVtZW50KHdzVGFnKTsNCit9DQorQ0ZERV9YTUxFbGVtZW50OjpDRkRFX1hNTEVsZW1lbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKQ0KKyAgICA6IENGREVfWE1MTm9kZSgpDQorICAgICwgbV93c1RhZyh3c1RhZykNCisgICAgLCBtX0F0dHJpYnV0ZXMoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fd3NUYWcuR2V0TGVuZ3RoKCkgPiAwKTsNCit9DQorQ0ZERV9YTUxFbGVtZW50Ojp+Q0ZERV9YTUxFbGVtZW50KCkNCit7DQorICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBbGwoKTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTEVsZW1lbnQ6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkNCit7DQorICAgIENGREVfWE1MRWxlbWVudCogcENsb25lID0gRkRFX05ldyBDRkRFX1hNTEVsZW1lbnQobV93c1RhZyk7DQorICAgIGlmICghcENsb25lKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwQ2xvbmUtPm1fQXR0cmlidXRlcy5Db3B5KG1fQXR0cmlidXRlcyk7DQorICAgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgICAgICBDbG9uZUNoaWxkcmVuKHBDbG9uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICBDRkRFX1hNTE5vZGUgKnBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICAgICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgc3dpdGNoIChwQ2hpbGQtPkdldFR5cGUoKSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQorICAgICAgICAgICAgICAgICAgICB3c1RleHQgKz0gKChDRkRFX1hNTFRleHQqKXBDaGlsZCktPm1fd3NUZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcENsb25lLT5TZXRUZXh0RGF0YSh3c1RleHQpOw0KKyAgICB9DQorICAgIHJldHVybiBwQ2xvbmU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhZykgY29uc3QNCit7DQorICAgIHdzVGFnID0gbV93c1RhZzsNCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldExvY2FsVGFnTmFtZShDRlhfV2lkZVN0cmluZyAmd3NUYWcpIGNvbnN0DQorew0KKyAgICBGWF9TVFJTSVpFIGlGaW5kID0gbV93c1RhZy5GaW5kKEwnOicsIDApOw0KKyAgICBpZiAoaUZpbmQgPCAwKSB7DQorICAgICAgICB3c1RhZyA9IG1fd3NUYWc7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c1RhZyA9IG1fd3NUYWcuUmlnaHQobV93c1RhZy5HZXRMZW5ndGgoKSAtIGlGaW5kIC0gMSk7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyAmd3NQcmVmaXgpIGNvbnN0DQorew0KKyAgICBGWF9TVFJTSVpFIGlGaW5kID0gbV93c1RhZy5GaW5kKEwnOicsIDApOw0KKyAgICBpZiAoaUZpbmQgPCAwKSB7DQorICAgICAgICB3c1ByZWZpeC5FbXB0eSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NQcmVmaXggPSBtX3dzVGFnLkxlZnQoaUZpbmQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZXNwYWNlKSBjb25zdA0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaShMInhtbG5zIiksIHdzUHJlZml4Ow0KKyAgICBHZXROYW1lc3BhY2VQcmVmaXgod3NQcmVmaXgpOw0KKyAgICBpZiAod3NQcmVmaXguR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICB3c0F0dHJpICs9IEwiOiI7DQorICAgICAgICB3c0F0dHJpICs9IHdzUHJlZml4Ow0KKyAgICB9DQorICAgIHdzTmFtZXNwYWNlLkVtcHR5KCk7DQorICAgIENGREVfWE1MTm9kZSAqcE5vZGUgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZERV9YTUxFbGVtZW50ICpwRWxlbWVudCA9IChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlOw0KKyAgICAgICAgaWYgKCFwRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzQXR0cmkpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEVsZW1lbnQtPkdldFN0cmluZyh3c0F0dHJpLCB3c05hbWVzcGFjZSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRkRFX1hNTEVsZW1lbnQ6OkNvdW50QXR0cmlidXRlcygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9BdHRyaWJ1dGVzLkdldFNpemUoKSAvIDI7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxFbGVtZW50OjpHZXRBdHRyaWJ1dGUoRlhfSU5UMzIgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgaUNvdW50IC8gMik7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgaWYgKGluZGV4ID09IDApIHsNCisgICAgICAgICAgICB3c0F0dHJpTmFtZSA9IG1fQXR0cmlidXRlc1tpXTsNCisgICAgICAgICAgICB3c0F0dHJpVmFsdWUgPSBtX0F0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW5kZXggLS07DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfWE1MRWxlbWVudDo6SGFzQXR0cmlidXRlKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6R2V0U3RyaW5nKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlLCBGWF9MUENXU1RSIHB3c0RlZlZhbHVlKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgd3NBdHRyaVZhbHVlID0gcHdzRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHdzQXR0cmlOYW1lLkdldExlbmd0aCgpID4gMCk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgICAgICAgbV9BdHRyaWJ1dGVzW2ldID0gd3NBdHRyaU5hbWU7DQorICAgICAgICAgICAgbV9BdHRyaWJ1dGVzW2kgKyAxXSA9IHdzQXR0cmlWYWx1ZTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9BdHRyaWJ1dGVzLkFkZCh3c0F0dHJpTmFtZSk7DQorICAgIG1fQXR0cmlidXRlcy5BZGQod3NBdHRyaVZhbHVlKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9YTUxFbGVtZW50OjpHZXRJbnRlZ2VyKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBGWF9JTlQzMiBpRGVmVmFsdWUpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gRlhTWVNfd3RvaSgoRlhfTFBDV1NUUiltX0F0dHJpYnV0ZXNbaSArIDFdKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gaURlZlZhbHVlOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6U2V0SW50ZWdlcihGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfSU5UMzIgaUF0dHJpVmFsdWUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICB3c1ZhbHVlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgaUF0dHJpVmFsdWUpOw0KKyAgICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCit9DQorRlhfRkxPQVQgQ0ZERV9YTUxFbGVtZW50OjpHZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkRlZlZhbHVlKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZYX3djc3RvZigoRlhfTFBDV1NUUiltX0F0dHJpYnV0ZXNbaSArIDFdKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZkRlZlZhbHVlOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6U2V0RmxvYXQoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgd3NWYWx1ZS5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZiIsIGZBdHRyaVZhbHVlKTsNCisgICAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpSZW1vdmVBdHRyaWJ1dGUoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICAgICAgICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQXQoaSArIDEpOw0KKyAgICAgICAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQorew0KKyAgICBDRlhfV2lkZVRleHRCdWYgYnVmZmVyOw0KKyAgICBDRkRFX1hNTE5vZGUgKnBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgIHN3aXRjaCAocENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQorICAgICAgICAgICAgICAgIGJ1ZmZlciA8PCAoKENGREVfWE1MVGV4dCopcENoaWxkKS0+bV93c1RleHQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6DQorICAgICAgICAgICAgICAgIGJ1ZmZlciA8PCAoKENGREVfWE1MQ2hhckRhdGEqKXBDaGlsZCktPm1fd3NDaGFyRGF0YTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQorICAgIH0NCisgICAgd3NUZXh0ID0gYnVmZmVyLkdldFdpZGVTdHJpbmcoKTsNCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OlNldFRleHREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBpZiAod3NUZXh0LkdldExlbmd0aCgpIDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEluc2VydENoaWxkTm9kZShGREVfTmV3IENGREVfWE1MVGV4dCh3c1RleHQpKTsNCit9DQorSUZERV9YTUxUZXh0KiBJRkRFX1hNTFRleHQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgcmV0dXJuIChJRkRFX1hNTFRleHQqKUZERV9OZXcgQ0ZERV9YTUxUZXh0KHdzVGV4dCk7DQorfQ0KK0NGREVfWE1MVGV4dDo6Q0ZERV9YTUxUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorICAgIDogQ0ZERV9YTUxOb2RlKCkNCisgICAgLCBtX3dzVGV4dCh3c1RleHQpDQorew0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MVGV4dDo6Q2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKQ0KK3sNCisgICAgQ0ZERV9YTUxUZXh0KiBwQ2xvbmUgPSBGREVfTmV3IENGREVfWE1MVGV4dChtX3dzVGV4dCk7DQorICAgIHJldHVybiBwQ2xvbmU7DQorfQ0KK0lGREVfWE1MQ2hhckRhdGEqIElGREVfWE1MQ2hhckRhdGE6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDRGF0YSkNCit7DQorICAgIHJldHVybiAoSUZERV9YTUxDaGFyRGF0YSopRkRFX05ldyBDRkRFX1hNTENoYXJEYXRhKHdzQ0RhdGEpOw0KK30NCitDRkRFX1hNTENoYXJEYXRhOjpDRkRFX1hNTENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NEYXRhKQ0KKyAgICA6IENGREVfWE1MRGVjbGFyYXRpb24oKQ0KKyAgICAsIG1fd3NDaGFyRGF0YSh3c0NEYXRhKQ0KK3sNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTENoYXJEYXRhOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQorew0KKyAgICBDRkRFX1hNTENoYXJEYXRhKiBwQ2xvbmUgPSBGREVfTmV3IENGREVfWE1MQ2hhckRhdGEobV93c0NoYXJEYXRhKTsNCisgICAgcmV0dXJuIHBDbG9uZTsNCit9DQorSUZERV9YTUxEb2MqIElGREVfWE1MRG9jOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIChJRkRFX1hNTERvYyopRkRFX05ldyBDRkRFX1hNTERvYzsNCit9DQorQ0ZERV9YTUxEb2M6OkNGREVfWE1MRG9jKCkNCisgICAgOiBtX3BSb290KE5VTEwpDQorICAgICwgbV9wU3ludGF4UGFyc2VyKE5VTEwpDQorICAgICwgbV9wWE1MUGFyc2VyKE5VTEwpDQorew0KKyAgICBSZXNldChUUlVFKTsNCisgICAgQ0ZERV9YTUxJbnN0cnVjdGlvbiAqcFhNTCA9IEZERV9OZXcgQ0ZERV9YTUxJbnN0cnVjdGlvbigoRlhfTFBDV1NUUilMInhtbCIpOw0KKyAgICBtX3BSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTCk7DQorfQ0KK0NGREVfWE1MRG9jOjp+Q0ZERV9YTUxEb2MoKQ0KK3sNCisgICAgUmVzZXQoRkFMU0UpOw0KK30NCit2b2lkIENGREVfWE1MRG9jOjpSZXNldChGWF9CT09MIGJJbml0Um9vdCkNCit7DQorICAgIG1faVN0YXR1cyA9IDA7DQorICAgIG1fcFN0cmVhbSA9IE5VTEw7DQorICAgIGlmIChiSW5pdFJvb3QpIHsNCisgICAgICAgIGlmIChtX3BSb290ID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BSb290ID0gRkRFX05ldyBDRkRFX1hNTE5vZGU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcFJvb3QtPkRlbGV0ZUNoaWxkcmVuKCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9wUm9vdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wUm9vdC0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIG1fcFJvb3QgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIFJlbGVhc2VQYXJzZXIoKTsNCit9DQordm9pZCBDRkRFX1hNTERvYzo6UmVsZWFzZVBhcnNlcigpDQorew0KKyAgICBpZiAobV9wWE1MUGFyc2VyICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFhNTFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wWE1MUGFyc2VyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wU3ludGF4UGFyc2VyICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFN5bnRheFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wU3ludGF4UGFyc2VyID0gTlVMTDsNCisgICAgfQ0KK30NCitGWF9CT09MIENGREVfWE1MRG9jOjpMb2FkWE1MKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIEZYX0lOVDMyIGlYTUxQbGFuZVNpemUgLCBGWF9JTlQzMiBpVGV4dERhdGFTaXplICwgRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciApDQorew0KKyAgICBpZiAocFhNTFN0cmVhbSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgUmVzZXQoVFJVRSk7DQorICAgIGlYTUxQbGFuZVNpemUgPSBpWE1MUGxhbmVTaXplIC8gMTAyNDsNCisgICAgaWYgKGlYTUxQbGFuZVNpemUgPCAxKSB7DQorICAgICAgICBpWE1MUGxhbmVTaXplID0gMTsNCisgICAgfQ0KKyAgICBpWE1MUGxhbmVTaXplICo9IDEwMjQ7DQorICAgIGlmIChpWE1MUGxhbmVTaXplIDwgNDA5Nikgew0KKyAgICAgICAgaVhNTFBsYW5lU2l6ZSA9IDQwOTY7DQorICAgIH0NCisgICAgaVRleHREYXRhU2l6ZSA9IGlUZXh0RGF0YVNpemUgLyAxMjg7DQorICAgIGlmIChpVGV4dERhdGFTaXplIDwgMSkgew0KKyAgICAgICAgaVRleHREYXRhU2l6ZSA9IDE7DQorICAgIH0NCisgICAgaVRleHREYXRhU2l6ZSAqPSAxMjg7DQorICAgIGlmIChpVGV4dERhdGFTaXplIDwgMTI4KSB7DQorICAgICAgICBpVGV4dERhdGFTaXplID0gMTI4Ow0KKyAgICB9DQorICAgIG1fcFN0cmVhbSA9IHBYTUxTdHJlYW07DQorICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gbV9wU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KKyAgICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjgpIHsNCisgICAgICAgIG1fcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQorICAgIH0NCisgICAgbV9wU3ludGF4UGFyc2VyID0gSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgICBpZiAobV9wU3ludGF4UGFyc2VyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BTeW50YXhQYXJzZXItPkluaXQobV9wU3RyZWFtLCBpWE1MUGxhbmVTaXplLCBpVGV4dERhdGFTaXplKTsNCisgICAgaWYgKHBIYW5kbGVyID09IE5VTEwpIHsNCisgICAgICAgIG1fcFhNTFBhcnNlciA9IEZERV9OZXcgQ0ZERV9YTUxET01QYXJzZXIobV9wUm9vdCwgbV9wU3ludGF4UGFyc2VyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcFhNTFBhcnNlciA9IEZERV9OZXcgQ0ZERV9YTUxTQVhQYXJzZXIocEhhbmRsZXIsIG1fcFN5bnRheFBhcnNlcik7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFhNTFBhcnNlciAhPSBOVUxMOw0KK30NCitGWF9CT09MIENGREVfWE1MRG9jOjpMb2FkWE1MKElGREVfWE1MUGFyc2VyICpwWE1MUGFyc2VyKQ0KK3sNCisgICAgaWYgKHBYTUxQYXJzZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFJlc2V0KFRSVUUpOw0KKyAgICBtX3BYTUxQYXJzZXIgPSBwWE1MUGFyc2VyOw0KKyAgICByZXR1cm4gbV9wWE1MUGFyc2VyICE9IE5VTEw7DQorfQ0KK0ZYX0lOVDMyIENGREVfWE1MRG9jOjpEb0xvYWQoSUZYX1BhdXNlICpwUGF1c2UpDQorew0KKyAgICBpZiAobV9pU3RhdHVzID49IDEwMCkgew0KKyAgICAgICAgcmV0dXJuIG1faVN0YXR1czsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQobV9wWE1MUGFyc2VyICE9IE5VTEwpOw0KKyAgICByZXR1cm4gbV9pU3RhdHVzID0gbV9wWE1MUGFyc2VyLT5Eb1BhcnNlcihwUGF1c2UpOw0KK30NCit2b2lkIENGREVfWE1MRG9jOjpDbG9zZVhNTCgpDQorew0KKyAgICBSZWxlYXNlUGFyc2VyKCk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxEb2M6OlNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSAqcElOb2RlKQ0KK3sNCisgICAgQ0ZERV9YTUxOb2RlICpwTm9kZSA9IChDRkRFX1hNTE5vZGUqKXBJTm9kZTsNCisgICAgRlhTWVNfYXNzZXJ0KHBYTUxTdHJlYW0gIT0gTlVMTCAmJiBwTm9kZSAhPSBOVUxMKTsNCisgICAgc3dpdGNoIChwTm9kZS0+R2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgICAgICAgICBDRkRFX1hNTEluc3RydWN0aW9uICpwSW5zdHJ1Y3Rpb24gPSAoQ0ZERV9YTUxJbnN0cnVjdGlvbiopcE5vZGU7DQorICAgICAgICAgICAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuQ29tcGFyZU5vQ2FzZShMInhtbCIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkxFKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJVVEYtMTYiOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiVVRGLTE2YmUiOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlVURi04IjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCI/PiI7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3MuRm9ybWF0KChGWF9MUENXU1RSKUwiPD8lcyIsIChGWF9MUENXU1RSKXBJbnN0cnVjdGlvbi0+bV93c1RhcmdldCk7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmYXR0cmlidXRlcyA9IHBJbnN0cnVjdGlvbi0+bV9BdHRyaWJ1dGVzOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaSwgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBMIiAiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IGF0dHJpYnV0ZXNbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCI9XCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCImIiwgKEZYX0xQQ1dTVFIpTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZSgoRlhfTFBDV1NUUilMIjwiLCAoRlhfTFBDV1NUUilMIiZsdDsiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCI+IiwgKEZYX0xQQ1dTVFIpTCImZ3Q7Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCciLCAoRlhfTFBDV1NUUilMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZSgoRlhfTFBDV1NUUilMIlwiIiwgKEZYX0xQQ1dTVFIpTCImcXVvdDsiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3cyArPSB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5ICZ0YXJnZXRkYXRhID0gcEluc3RydWN0aW9uLT5tX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSB0YXJnZXRkYXRhLkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gTCIgXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IHRhcmdldGRhdGFbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJcIiI7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCI/PiI7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgICAgICAgICB3cyA9IEwiPCI7DQorICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgJmF0dHJpYnV0ZXMgPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX0F0dHJpYnV0ZXM7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IGF0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCIgIjsNCisgICAgICAgICAgICAgICAgICAgIHdzICs9IGF0dHJpYnV0ZXNbaV07DQorICAgICAgICAgICAgICAgICAgICB3cyArPSBMIj1cIiI7DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gYXR0cmlidXRlc1tpICsgMV07DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCImIiwgKEZYX0xQQ1dTVFIpTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiPCIsIChGWF9MUENXU1RSKUwiJmx0OyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiPiIsIChGWF9MUENXU1RSKUwiJmd0OyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCciLCAoRlhfTFBDV1NUUilMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCIiLCAoRlhfTFBDV1NUUilMIiZxdW90OyIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3MgKz0gd3NWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCIiOw0KKyAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocE5vZGUtPm1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzID0gTCJcbi8+IjsNCisgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3cyA9IEwiXG4+IjsNCisgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUgKnBDaGlsZCA9IHBOb2RlLT5tX3BDaGlsZDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVYTUxOb2RlKHBYTUxTdHJlYW0sIChJRkRFX1hNTE5vZGUqKXBDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3MgPSBMIjwvIjsNCisgICAgICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlxuPiI7DQorICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gKChDRkRFX1hNTFRleHQqKXBOb2RlKS0+bV93c1RleHQ7DQorICAgICAgICAgICAgICAgIHdzLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCImIiwgKEZYX0xQQ1dTVFIpTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiPCIsIChGWF9MUENXU1RSKUwiJmx0OyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiPiIsIChGWF9MUENXU1RSKUwiJmd0OyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCciLCAoRlhfTFBDV1NUUilMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKChGWF9MUENXU1RSKUwiXCIiLCAoRlhfTFBDV1NUUilMIiZxdW90OyIpOw0KKyAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7DQorICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxDaGFyRGF0YSopcE5vZGUpLT5tX3dzQ2hhckRhdGE7DQorICAgICAgICAgICAgICAgIHdzICs9IEwiXV0+IjsNCisgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1Vua25vd246DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9YTUxEb2M6OlNhdmVYTUwoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSwgRlhfQk9PTCBiU2F2ZUJPTSkNCit7DQorICAgIGlmIChwWE1MU3RyZWFtID09IE5VTEwgfHwgcFhNTFN0cmVhbSA9PSBtX3BTdHJlYW0pIHsNCisgICAgICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCAwKTsNCisgICAgICAgIHBYTUxTdHJlYW0gPSBtX3BTdHJlYW07DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KChwWE1MU3RyZWFtLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpICE9IDApOw0KKyAgICBGWFNZU19hc3NlcnQoKHBYTUxTdHJlYW0tPkdldEFjY2Vzc01vZGVzKCkgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IHBYTUxTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICAgIGlmICh3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZMRSAmJiB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZCRSAmJiB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICAgICAgd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGODsNCisgICAgICAgIHBYTUxTdHJlYW0tPlNldENvZGVQYWdlKHdDb2RlUGFnZSk7DQorICAgIH0NCisgICAgaWYgKGJTYXZlQk9NKSB7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUilMIlx4RkVGRiIsIDEpOw0KKyAgICB9DQorICAgIENGREVfWE1MTm9kZSAqcE5vZGUgPSBtX3BSb290LT5tX3BDaGlsZDsNCisgICAgd2hpbGUgKHBOb2RlICE9IE5VTEwpIHsNCisgICAgICAgIFNhdmVYTUxOb2RlKHBYTUxTdHJlYW0sIChJRkRFX1hNTE5vZGUqKXBOb2RlKTsNCisgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7DQorICAgIH0NCisgICAgaWYgKHBYTUxTdHJlYW0gPT0gbV9wU3RyZWFtKSB7DQorICAgICAgICBGWF9JTlQzMiBpUG9zID0gcFhNTFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICAgIHBYTUxTdHJlYW0tPlNldExlbmd0aChpUG9zKTsNCisgICAgfQ0KK30NCitDRkRFX1hNTERPTVBhcnNlcjo6Q0ZERV9YTUxET01QYXJzZXIoQ0ZERV9YTUxOb2RlICpwUm9vdCwgSUZERV9YTUxTeW50YXhQYXJzZXIgKnBQYXJzZXIpDQorICAgIDogbV9wUm9vdChwUm9vdCkNCisgICAgLCBtX3BQYXJzZXIocFBhcnNlcikNCisgICAgLCBtX3BQYXJlbnQocFJvb3QpDQorICAgICwgbV9wQ2hpbGQoTlVMTCkNCisgICAgLCBtX05vZGVTdGFjaygxNikNCisgICAgLCBtX3dzMSgpDQorICAgICwgbV93czIoKQ0KK3sNCisgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BQYXJlbnQpOw0KK30NCitDRkRFX1hNTERPTVBhcnNlcjo6fkNGREVfWE1MRE9NUGFyc2VyKCkNCit7DQorICAgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICBtX3dzMi5FbXB0eSgpOw0KK30NCitGWF9JTlQzMiBDRkRFX1hNTERPTVBhcnNlcjo6RG9QYXJzZXIoSUZYX1BhdXNlICpwUGF1c2UpDQorew0KKyAgICBGWF9EV09SRCBkd1JldDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGR3UmV0ID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgICAgICBzd2l0Y2ggKGR3UmV0KSB7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbjoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uQ2xvc2U6DQorICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWs6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2U6DQorICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFnTmFtZShtX3dzMSk7DQorICAgICAgICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPkdldFRhZ05hbWUobV93czIpOw0KKyAgICAgICAgICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxLkNvbXBhcmUobV93czIpICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9Ob2RlU3RhY2suR2V0U2l6ZSgpIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wUGFyZW50ID0gKENGREVfWE1MTm9kZSopKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQorICAgICAgICAgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZToNCisgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXROYW1lKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBGREVfTmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24obV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQorICAgICAgICAgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOg0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IEZERV9OZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcENoaWxkKTsNCisgICAgICAgICAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWU6DQorICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KKyAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MyKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+U2V0U3RyaW5nKG1fd3MxLCBtX3dzMik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEluc3RydWN0aW9uKiltX3BDaGlsZCktPlNldFN0cmluZyhtX3dzMSwgbV93czIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Og0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRleHREYXRhKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBGREVfTmV3IENGREVfWE1MVGV4dChtX3dzMSk7DQorICAgICAgICAgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YToNCisgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICAgICAgICAgIG1fcENoaWxkID0gRkRFX05ldyBDRkRFX1hNTENoYXJEYXRhKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE6DQorICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZCA9PSBOVUxMIHx8IG1fcENoaWxkLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghbV93czEuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAoKENGREVfWE1MSW5zdHJ1Y3Rpb24qKW1fcENoaWxkKS0+QXBwZW5kRGF0YShtX3dzMSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXREYXRhKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgKChDRkRFX1hNTEluc3RydWN0aW9uKiltX3BDaGlsZCktPkFwcGVuZERhdGEobV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IGR3UmV0ID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhdXNlICE9IE5VTEwgJiYgaUNvdW50ID4gNTAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KK30NCitDRkRFX1hNTFNBWFBhcnNlcjo6Q0ZERV9YTUxTQVhQYXJzZXIoRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciwgSUZERV9YTUxTeW50YXhQYXJzZXIgKnBQYXJzZXIpDQorICAgIDogbV9wSGFuZGxlcihwSGFuZGxlcikNCisgICAgLCBtX3BQYXJzZXIocFBhcnNlcikNCisgICAgLCBtX1RhZ1N0YWNrKDE2KQ0KKyAgICAsIG1fcFRhZ1RvcChOVUxMKQ0KKyAgICAsIG1fd3MxKCkNCisgICAgLCBtX3dzMigpDQorew0KK30NCitDRkRFX1hNTFNBWFBhcnNlcjo6fkNGREVfWE1MU0FYUGFyc2VyKCkNCit7DQorICAgIG1fVGFnU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgIG1fd3MxLkVtcHR5KCk7DQorICAgIG1fd3MyLkVtcHR5KCk7DQorfQ0KK0ZYX0lOVDMyIENGREVfWE1MU0FYUGFyc2VyOjpEb1BhcnNlcihJRlhfUGF1c2UgKnBQYXVzZSkNCit7DQorICAgIEZYX0RXT1JEIGR3UmV0ID0gMDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGR3UmV0ID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgICAgICBzd2l0Y2ggKGR3UmV0KSB7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazoNCisgICAgICAgICAgICAgICAgaWYgKG1fcFRhZ1RvcCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobV9wVGFnVG9wLT5lVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0JyZWFrKG1fcEhhbmRsZXIsIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOg0KKyAgICAgICAgICAgICAgICBpZiAobV9wVGFnVG9wID09IE5VTEwgfHwgbV9wVGFnVG9wLT5lVHlwZSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxLkNvbXBhcmUobV9wVGFnVG9wLT53c1RhZ05hbWUpICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fd3MxLkdldExlbmd0aCgpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnQnJlYWsobV9wSGFuZGxlciwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnQ2xvc2UobV9wSGFuZGxlciwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KKyAgICAgICAgICAgICAgICBQb3AoKTsNCisgICAgICAgICAgICAgICAgaUNvdW50Kys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lOiB7DQorICAgICAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxUQUcJeG1sVGFnOw0KKyAgICAgICAgICAgICAgICAgICAgeG1sVGFnLndzVGFnTmFtZSA9IG1fd3MxOw0KKyAgICAgICAgICAgICAgICAgICAgeG1sVGFnLmVUeXBlID0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247DQorICAgICAgICAgICAgICAgICAgICBQdXNoKHhtbFRhZyk7DQorICAgICAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VudGVyKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0luc3RydWN0aW9uLCBtX3BUYWdUb3AtPndzVGFnTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOiB7DQorICAgICAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxUQUcJeG1sVGFnOw0KKyAgICAgICAgICAgICAgICAgICAgeG1sVGFnLndzVGFnTmFtZSA9IG1fd3MxOw0KKyAgICAgICAgICAgICAgICAgICAgeG1sVGFnLmVUeXBlID0gRkRFX1hNTE5PREVfRWxlbWVudDsNCisgICAgICAgICAgICAgICAgICAgIFB1c2goeG1sVGFnKTsNCisgICAgICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnRW50ZXIobV9wSGFuZGxlciwgRkRFX1hNTE5PREVfRWxlbWVudCwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWU6DQorICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0TmFtZShtX3dzMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldEF0dHJpYnV0ZU5hbWUobV93czIpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wVGFnVG9wID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChtX3BUYWdUb3AtPmVUeXBlID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uQXR0cmlidXRlKG1fcEhhbmRsZXIsIG1fd3MxLCBtX3dzMik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOg0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRleHREYXRhKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wSGFuZGxlci0+T25EYXRhKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0NoYXJEYXRhLCBtX3dzMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Og0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRleHREYXRhKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wSGFuZGxlci0+T25EYXRhKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX1RleHQsIG1fd3MxKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE6DQorICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQorICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uRGF0YShtX3BIYW5kbGVyLCBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbiwgbV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IGR3UmV0ID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhdXNlICE9IE5VTEwgJiYgaUNvdW50ID4gNTAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KK30NCitpbmxpbmUgdm9pZCBDRkRFX1hNTFNBWFBhcnNlcjo6UHVzaChjb25zdCBDRkRFX1hNTFRBRyAmeG1sVGFnKQ0KK3sNCisgICAgbV9UYWdTdGFjay5QdXNoKHhtbFRhZyk7DQorICAgIG1fcFRhZ1RvcCA9IG1fVGFnU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KK30NCitpbmxpbmUgdm9pZCBDRkRFX1hNTFNBWFBhcnNlcjo6UG9wKCkNCit7DQorICAgIG1fVGFnU3RhY2suUG9wKCk7DQorICAgIG1fcFRhZ1RvcCA9IG1fVGFnU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KK30NCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCitDRkRFX0Jsb2NrQnVmZmVyOjpDRkRFX0Jsb2NrQnVmZmVyKEZYX0lOVDMyIGlBbGxvY1N0ZXApDQorICAgIDogbV9pQWxsb2NTdGVwKGlBbGxvY1N0ZXApLA0KKyAgICAgIG1faVN0YXJ0UG9zaXRpb24oMCksDQorICAgICAgbV9pQnVmZmVyU2l6ZSgwKSwNCisgICAgICBtX2lEYXRhTGVuZ3RoKDApDQorew0KK30NCitDRkRFX0Jsb2NrQnVmZmVyOjp+Q0ZERV9CbG9ja0J1ZmZlcigpDQorew0KKyAgICBDbGVhckJ1ZmZlcigpOw0KK30NCitGWF9MUFdTVFIgQ0ZERV9CbG9ja0J1ZmZlcjo6R2V0QXZhaWxhYmxlQmxvY2soRlhfSU5UMzImIGlJbmRleEluQmxvY2spDQorew0KKyAgICBpSW5kZXhJbkJsb2NrID0gMDsNCisgICAgRlhfSU5UMzIgaUJsb2NrTnVtID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgICAgaWYgKGlCbG9ja051bSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUmVhbEluZGV4ID0gbV9pU3RhcnRQb3NpdGlvbiArIG1faURhdGFMZW5ndGg7DQorICAgIEZYX0xQV1NUUiBwRGF0YUJsb2NrID0gTlVMTDsNCisgICAgaWYoaVJlYWxJbmRleCA9PSBtX2lCdWZmZXJTaXplKSB7DQorICAgICAgICBGWF9MUFdTVFIgcEJsb2NrID0gKEZYX0xQV1NUUilGREVfQWxsb2MobV9pQWxsb2NTdGVwICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICBpZiAocEJsb2NrKSB7DQorICAgICAgICAgICAgbV9CbG9ja0FycmF5LkFkZChwQmxvY2spOw0KKyAgICAgICAgICAgIG1faUJ1ZmZlclNpemUgKz0gbV9pQWxsb2NTdGVwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUluZGV4SW5CbG9jayA9IDA7DQorICAgICAgICBwRGF0YUJsb2NrID0gcEJsb2NrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgaUJsb2NrSW5kZXggPSBpUmVhbEluZGV4IC8gbV9pQWxsb2NTdGVwOw0KKyAgICAgICAgRlhfSU5UMzIgaUlubmVySW5kZXggPSBpUmVhbEluZGV4ICUgbV9pQWxsb2NTdGVwOw0KKyAgICAgICAgaUluZGV4SW5CbG9jayA9IGlJbm5lckluZGV4Ow0KKyAgICAgICAgcERhdGFCbG9jayA9IChGWF9MUFdTVFIpbV9CbG9ja0FycmF5W2lCbG9ja0luZGV4XTsNCisgICAgfQ0KKyAgICByZXR1cm4gcERhdGFCbG9jazsNCit9DQorRlhfQk9PTCBDRkRFX0Jsb2NrQnVmZmVyOjpJbml0QnVmZmVyKEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgQ2xlYXJCdWZmZXIoKTsNCisgICAgRlhfSU5UMzIgaU51bU9mQmxvY2sgPSAoaUJ1ZmZlclNpemUgLSAxKSAvIG1faUFsbG9jU3RlcCArIDE7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTnVtT2ZCbG9jazsgaSsrKSB7DQorICAgICAgICBGWF9MUFdTVFIgcEJsb2NrQnVmZmVyID0gKEZYX0xQV1NUUilGREVfQWxsb2MobV9pQWxsb2NTdGVwICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICBpZiAocEJsb2NrQnVmZmVyID09IE5VTEwpIHsNCisgICAgICAgICAgICBDbGVhckJ1ZmZlcigpOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG1fQmxvY2tBcnJheS5BZGQocEJsb2NrQnVmZmVyKTsNCisgICAgfQ0KKyAgICBtX2lCdWZmZXJTaXplID0gaU51bU9mQmxvY2sgKiBtX2lBbGxvY1N0ZXA7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfQmxvY2tCdWZmZXI6OlNldFRleHRDaGFyKEZYX0lOVDMyIGlJbmRleCwgRlhfV0NIQVIgY2gpDQorew0KKyAgICBpZiAoaUluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSZWFsSW5kZXggPSBtX2lTdGFydFBvc2l0aW9uICsgaUluZGV4Ow0KKyAgICBGWF9JTlQzMiBpQmxvY2tJbmRleCA9IGlSZWFsSW5kZXggLyBtX2lBbGxvY1N0ZXA7DQorICAgIEZYX0lOVDMyIGlJbm5lckluZGV4ID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsNCisgICAgRlhfSU5UMzIgaUJsb2NrU2l6ZSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICAgIGlmIChpQmxvY2tJbmRleCA+PSBpQmxvY2tTaXplKSB7DQorICAgICAgICBGWF9JTlQzMiBpTmV3QmxvY2tzID0gaUJsb2NrSW5kZXggLSBpQmxvY2tTaXplICsgMTsNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBGWF9MUFdTVFIgcEJsb2NrID0gKEZYX0xQV1NUUilGREVfQWxsb2MobV9pQWxsb2NTdGVwICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICAgICAgaWYgKCFwQmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX0Jsb2NrQXJyYXkuQWRkKHBCbG9jayk7DQorICAgICAgICAgICAgbV9pQnVmZmVyU2l6ZSArPSBtX2lBbGxvY1N0ZXA7DQorICAgICAgICB9IHdoaWxlICgtLWlOZXdCbG9ja3MpOw0KKyAgICB9DQorICAgIEZYX0xQV1NUUiBwVGV4dERhdGEgPSAoRlhfTFBXU1RSKW1fQmxvY2tBcnJheVtpQmxvY2tJbmRleF07DQorICAgICoocFRleHREYXRhICsgaUlubmVySW5kZXgpID0gY2g7DQorICAgIGlmIChtX2lEYXRhTGVuZ3RoIDw9IGlJbmRleCkgew0KKyAgICAgICAgbV9pRGF0YUxlbmd0aCA9IGlJbmRleCArIDE7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0ZERV9CbG9ja0J1ZmZlcjo6RGVsZXRlVGV4dENoYXJzKEZYX0lOVDMyIGlDb3VudCwgRlhfQk9PTCBiRGlyZWN0aW9uICkNCit7DQorICAgIGlmIChpQ291bnQgPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIG1faURhdGFMZW5ndGg7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA+PSBtX2lEYXRhTGVuZ3RoKSB7DQorICAgICAgICBSZXNldChGQUxTRSk7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAoYkRpcmVjdGlvbikgew0KKyAgICAgICAgbV9pU3RhcnRQb3NpdGlvbiArPSBpQ291bnQ7DQorICAgICAgICBtX2lEYXRhTGVuZ3RoIC09IGlDb3VudDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1faURhdGFMZW5ndGggLT0gaUNvdW50Ow0KKyAgICB9DQorICAgIHJldHVybiBtX2lEYXRhTGVuZ3RoOw0KK30NCit2b2lkICBDRkRFX0Jsb2NrQnVmZmVyOjpHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0RGF0YSwgRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpTGVuZ3RoKSBjb25zdA0KK3sNCisgICAgd3NUZXh0RGF0YS5FbXB0eSgpOw0KKyAgICBGWF9JTlQzMiBpTWF5YmVEYXRhTGVuZ3RoID0gbV9pQnVmZmVyU2l6ZSAtIDEgLSBtX2lTdGFydFBvc2l0aW9uOw0KKyAgICBpZiAoaVN0YXJ0IDwgMCB8fCBpU3RhcnQgPiBpTWF5YmVEYXRhTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPT0gLTEgfHwgaUxlbmd0aCA+IGlNYXliZURhdGFMZW5ndGgpIHsNCisgICAgICAgIGlMZW5ndGggPSBpTWF5YmVEYXRhTGVuZ3RoOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoIDw9IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9MUFdTVFIgcEJ1ZiA9IHdzVGV4dERhdGEuR2V0QnVmZmVyKGlMZW5ndGgpOw0KKyAgICBpZiAoIXBCdWYpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpU3RhcnRCbG9ja0luZGV4ID0gMDsNCisgICAgRlhfSU5UMzIgaVN0YXJ0SW5uZXJJbmRleCA9IDA7DQorICAgIFRleHREYXRhSW5kZXgyQnVmSW5kZXgoaVN0YXJ0LCBpU3RhcnRCbG9ja0luZGV4LCBpU3RhcnRJbm5lckluZGV4KTsNCisgICAgRlhfSU5UMzIgaUVuZEJsb2NrSW5kZXggPSAwOw0KKyAgICBGWF9JTlQzMiBpRW5kSW5uZXJJbmRleCA9IDA7DQorICAgIFRleHREYXRhSW5kZXgyQnVmSW5kZXgoaVN0YXJ0ICsgaUxlbmd0aCwgaUVuZEJsb2NrSW5kZXgsIGlFbmRJbm5lckluZGV4KTsNCisgICAgRlhfSU5UMzIgaVBvaW50ZXIgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSBpU3RhcnRCbG9ja0luZGV4OyBpIDw9IGlFbmRCbG9ja0luZGV4OyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGlCdWZmZXJQb2ludGVyID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGlDb3B5TGVuZ3RoID0gbV9pQWxsb2NTdGVwOw0KKyAgICAgICAgaWYgKGkgPT0gaVN0YXJ0QmxvY2tJbmRleCkgew0KKyAgICAgICAgICAgIGlDb3B5TGVuZ3RoIC09IGlTdGFydElubmVySW5kZXg7DQorICAgICAgICAgICAgaUJ1ZmZlclBvaW50ZXIgPSBpU3RhcnRJbm5lckluZGV4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGkgPT0gaUVuZEJsb2NrSW5kZXgpIHsNCisgICAgICAgICAgICBpQ29weUxlbmd0aCAtPSAoKG1faUFsbG9jU3RlcCAtIDEpIC0gaUVuZElubmVySW5kZXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfTFBXU1RSIHBCbG9ja0J1ZiA9IChGWF9MUFdTVFIpbV9CbG9ja0FycmF5W2ldOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5KHBCdWYgKyBpUG9pbnRlciwgcEJsb2NrQnVmICsgaUJ1ZmZlclBvaW50ZXIsIGlDb3B5TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICBpUG9pbnRlciArPSBpQ29weUxlbmd0aDsNCisgICAgfQ0KKyAgICB3c1RleHREYXRhLlJlbGVhc2VCdWZmZXIoaUxlbmd0aCk7DQorfQ0KK3ZvaWQgQ0ZERV9CbG9ja0J1ZmZlcjo6VGV4dERhdGFJbmRleDJCdWZJbmRleChjb25zdCBGWF9JTlQzMiBpSW5kZXgsIEZYX0lOVDMyJiBpQmxvY2tJbmRleCwgRlhfSU5UMzImIGlJbm5lckluZGV4KSBjb25zdA0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlJbmRleCA+PSAwKTsNCisgICAgRlhfSU5UMzIgaVJlYWxJbmRleCA9IG1faVN0YXJ0UG9zaXRpb24gKyBpSW5kZXg7DQorICAgIGlCbG9ja0luZGV4ID0gaVJlYWxJbmRleCAvIG1faUFsbG9jU3RlcDsNCisgICAgaUlubmVySW5kZXggPSBpUmVhbEluZGV4ICUgbV9pQWxsb2NTdGVwOw0KK30NCit2b2lkIENGREVfQmxvY2tCdWZmZXI6OkNsZWFyQnVmZmVyKCkNCit7DQorICAgIG1faUJ1ZmZlclNpemUgPSAwOw0KKyAgICBGWF9JTlQzMiBpU2l6ZSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgICBGREVfRnJlZShtX0Jsb2NrQXJyYXlbaV0pOw0KKyAgICAgICAgbV9CbG9ja0FycmF5W2ldID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX0Jsb2NrQXJyYXkuUmVtb3ZlQWxsKCk7DQorfQ0KKyNlbmRpZg0KK0lGREVfWE1MU3ludGF4UGFyc2VyKiBJRkRFX1hNTFN5bnRheFBhcnNlcjo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGREVfTmV3IENGREVfWE1MU3ludGF4UGFyc2VyOw0KK30NCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCitDRkRFX1hNTFN5bnRheFBhcnNlcjo6Q0ZERV9YTUxTeW50YXhQYXJzZXIoKQ0KKyAgICA6IG1fcFN0cmVhbShOVUxMKQ0KKyAgICAsIG1faVhNTFBsYW5lU2l6ZSgtMSkNCisgICAgLCBtX2lDdXJyZW50UG9zKDApDQorICAgICwgbV9pQ3VycmVudE5vZGVOdW0oLTEpDQorICAgICwgbV9pTGFzdE5vZGVOdW0oLTEpDQorICAgICwgbV9pUGFyc2VkQ2hhcnMoMCkNCisgICAgLCBtX2lQYXJzZWRCeXRlcygwKQ0KKyAgICAsIG1fcEJ1ZmZlcihOVUxMKQ0KKyAgICAsIG1faUJ1ZmZlckNoYXJzKDApDQorICAgICwgbV9iRU9TKEZBTFNFKQ0KKyAgICAsIG1fcFN0YXJ0KE5VTEwpDQorICAgICwgbV9wRW5kKE5VTEwpDQorICAgICwgbV9YTUxOb2RlU3RhY2soMTYpDQorICAgICwgbV9kd1N0YXR1cyhGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpDQorICAgICwgbV9kd01vZGUoRkRFX1hNTFNZTlRBWE1PREVfVGV4dCkNCisgICAgLCBtX3dRdW90YXRpb25NYXJrKDApDQorICAgICwgbV9CbG9ja0J1ZmZlcigpDQorICAgICwgbV9wQ3VycmVudEJsb2NrKE5VTEwpDQorICAgICwgbV9pSW5kZXhJbkJsb2NrKDApDQorICAgICwgbV9pRGF0YUxlbmd0aChtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGhSZWYoKSkNCisgICAgLCBtX2lBbGxvY1N0ZXAobV9CbG9ja0J1ZmZlci5HZXRBbGxvY1N0ZXAoKSkNCisgICAgLCBtX2lUZXh0RGF0YUxlbmd0aCgwKQ0KKyAgICAsIG1faUVudGl0eVN0YXJ0KC0xKQ0KKyAgICAsIG1fU2tpcFN0YWNrKDE2KQ0KK3sNCisgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9Vbmtub3duOw0KK30NCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpJbml0KElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0lOVDMyIGlYTUxQbGFuZVNpemUsIEZYX0lOVDMyIGlUZXh0RGF0YVNpemUgKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSA9PSBOVUxMICYmIG1fcEJ1ZmZlciA9PSBOVUxMKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCAmJiBpWE1MUGxhbmVTaXplID4gMCk7DQorICAgIEZYX0lOVDMyIGlTdHJlYW1MZW5ndGggPSBwU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlTdHJlYW1MZW5ndGggPiAwKTsNCisgICAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCisgICAgbV9pWE1MUGxhbmVTaXplID0gRlhfTUlOKGlYTUxQbGFuZVNpemUsIGlTdHJlYW1MZW5ndGgpOw0KKyAgICBGWF9CWVRFIGJvbVs0XTsNCisgICAgbV9pQ3VycmVudFBvcyA9IG1fcFN0cmVhbS0+R2V0Qk9NKGJvbSk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXIgPT0gTlVMTCk7DQorICAgIG1fcEJ1ZmZlciA9IChGWF9MUFdTVFIpRkRFX0FsbG9jKG1faVhNTFBsYW5lU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBtX3BTdGFydCA9IG1fcEVuZCA9IG1fcEJ1ZmZlcjsNCisgICAgRlhTWVNfYXNzZXJ0KCFtX0Jsb2NrQnVmZmVyLklzSW5pdGlhbGl6ZWQoKSk7DQorICAgIG1fQmxvY2tCdWZmZXIuSW5pdEJ1ZmZlcigpOw0KKyAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgIG1faVBhcnNlZEJ5dGVzID0gbV9pUGFyc2VkQ2hhcnMgPSAwOw0KKyAgICBtX2lCdWZmZXJDaGFycyA9IDA7DQorfQ0KK0ZYX0RXT1JEIENGREVfWE1MU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkNCit7DQorICAgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IgfHwgbV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KKyAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMICYmIG1fcEJ1ZmZlciAhPSBOVUxMICYmIG1fQmxvY2tCdWZmZXIuSXNJbml0aWFsaXplZCgpKTsNCisgICAgRlhfSU5UMzIgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIGlQb3M7DQorICAgIEZYX1dDSEFSIGNoOw0KKyAgICBGWF9EV09SRCBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGlmIChtX3BTdGFydCA+PSBtX3BFbmQpIHsNCisgICAgICAgICAgICBpZiAobV9iRU9TIHx8IG1faUN1cnJlbnRQb3MgPj0gaVN0cmVhbUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2lQYXJzZWRDaGFycyArPSAobV9wRW5kIC0gbV9wQnVmZmVyKTsNCisgICAgICAgICAgICBtX2lQYXJzZWRCeXRlcyA9IG1faUN1cnJlbnRQb3M7DQorICAgICAgICAgICAgbV9wU3RyZWFtLT5Mb2NrKCk7DQorICAgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKSAhPSBtX2lDdXJyZW50UG9zKSB7DQorICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lDdXJyZW50UG9zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9pQnVmZmVyQ2hhcnMgPSBtX3BTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBtX2lYTUxQbGFuZVNpemUsIG1fYkVPUyk7DQorICAgICAgICAgICAgaVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICAgICAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgICAgICAgICAgIGlmIChtX2lCdWZmZXJDaGFycyA8IDEpIHsNCisgICAgICAgICAgICAgICAgbV9pQ3VycmVudFBvcyA9IGlTdHJlYW1MZW5ndGg7DQorICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUzsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1faUN1cnJlbnRQb3MgPSBpUG9zOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0ID0gbV9wQnVmZmVyOw0KKyAgICAgICAgICAgIG1fcEVuZCA9IG1fcEJ1ZmZlciArIG1faUJ1ZmZlckNoYXJzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKG1fcFN0YXJ0IDwgbV9wRW5kKSB7DQorICAgICAgICAgICAgY2ggPSAqbV9wU3RhcnQ7DQorICAgICAgICAgICAgc3dpdGNoIChtX2R3TW9kZSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RleHQ6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc8Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnIScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pTGFzdE5vZGVOdW0gKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfRWxlbWVudDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYWc7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0Og0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhZzoNCisgICAgICAgICAgICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fZHdNb2RlICE9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU6DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEgJiYgRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc+JyB8fCBjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9CcmVha0VsZW1lbnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz0nICYmICFGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpRXF1YWxTaWduOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpRXF1YWxTaWduOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gTCc9Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlRdW90YXRpb246DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBMJ1wiJyAmJiBjaCAhPSBMJ1wnJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gY2g7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZToNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IEwnPicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9pRGF0YUxlbmd0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUgPSAqcFhNTE5vZGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9DdXJOb2RlLmlOb2RlTnVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Og0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Og0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YUxlbmd0aCA8IDEpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICctJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCc+Jyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwRGVjbE5vZGU6DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9Ta2lwQ2hhciA9PSBMJ1wnJyB8fCBtX1NraXBDaGFyID09IEwnXCInKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IG1fU2tpcENoYXIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQRFdPUkQgcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikgKiBwRFdvcmQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCc8JzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJz4nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnWyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCddJzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCddJyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMJygnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnKSc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnKScpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCdcJyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCdcJyc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXCcnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnXCInOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCInOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wiJyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBtX1NraXBDaGFyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBEV09SRCBwRFdvcmQgPSBtX1NraXBTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEV29yZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoID49IDkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSGVhZGVyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c0hlYWRlciwgMCwgNyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NIZWFkZXIuRXF1YWwoRlhfV1NUUkMoTCJbQ0RBVEFbIikpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWlsZXI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RhaWxlciwgbV9pRGF0YUxlbmd0aCAtIDIsIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c1RhaWxlci5FcXVhbChGWF9XU1RSQyhMIl1dIikpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuRGVsZXRlVGV4dENoYXJzKDcsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkRlbGV0ZVRleHRDaGFycygyLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSAoRlhfV0NIQVIpICogcERXb3JkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9Ta2lwU3RhY2suR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJy0nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IEwnLSc7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJz4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPiAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE6DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV93UXVvdGF0aW9uTWFyayA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IGNoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gbV93UXVvdGF0aW9uTWFyaykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdTdGF0dXMgIT0gRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KKyNlbHNlDQorQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkNGREVfWE1MU3ludGF4UGFyc2VyKCkNCisgICAgOiBtX3BTdHJlYW0oTlVMTCkNCisgICAgLCBtX2lYTUxQbGFuZVNpemUoLTEpDQorICAgICwgbV9pVGV4dERhdGFTaXplKDI1NikNCisgICAgLCBtX2lDdXJyZW50UG9zKDApDQorICAgICwgbV9pQ3VycmVudE5vZGVOdW0oLTEpDQorICAgICwgbV9pTGFzdE5vZGVOdW0oLTEpDQorICAgICwgbV9pUGFyc2VkQ2hhcnMoMCkNCisgICAgLCBtX2lQYXJzZWRCeXRlcygwKQ0KKyAgICAsIG1fcEJ1ZmZlcihOVUxMKQ0KKyAgICAsIG1faUJ1ZmZlckNoYXJzKDApDQorICAgICwgbV9iRU9TKEZBTFNFKQ0KKyAgICAsIG1fcFN0YXJ0KE5VTEwpDQorICAgICwgbV9wRW5kKE5VTEwpDQorICAgICwgbV9YTUxOb2RlU3RhY2soMTYpDQorICAgICwgbV9wd3NUZXh0RGF0YShOVUxMKQ0KKyAgICAsIG1faURhdGFQb3MoMCkNCisgICAgLCBtX2R3U3RhdHVzKEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZSkNCisgICAgLCBtX2R3TW9kZShGREVfWE1MU1lOVEFYTU9ERV9UZXh0KQ0KKyAgICAsIG1fd1F1b3RhdGlvbk1hcmsoMCkNCisgICAgLCBtX2lUZXh0RGF0YUxlbmd0aCgwKQ0KKyAgICAsIG1faUVudGl0eVN0YXJ0KC0xKQ0KKyAgICAsIG1fU2tpcFN0YWNrKDE2KQ0KK3sNCisgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9Vbmtub3duOw0KK30NCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpJbml0KElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0lOVDMyIGlYTUxQbGFuZVNpemUsIEZYX0lOVDMyIGlUZXh0RGF0YVNpemUgKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSA9PSBOVUxMICYmIG1fcEJ1ZmZlciA9PSBOVUxMKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCAmJiBpWE1MUGxhbmVTaXplID4gMCAmJiBpVGV4dERhdGFTaXplID4gMCk7DQorICAgIEZYX0lOVDMyIGlTdHJlYW1MZW5ndGggPSBwU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlTdHJlYW1MZW5ndGggPiAwKTsNCisgICAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCisgICAgbV9pWE1MUGxhbmVTaXplID0gRlhfTUlOKGlYTUxQbGFuZVNpemUsIGlTdHJlYW1MZW5ndGgpOw0KKyAgICBtX2lUZXh0RGF0YVNpemUgPSBpVGV4dERhdGFTaXplOw0KKyAgICBGWF9CWVRFIGJvbVs0XTsNCisgICAgbV9pQ3VycmVudFBvcyA9IG1fcFN0cmVhbS0+R2V0Qk9NKGJvbSk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXIgPT0gTlVMTCk7DQorICAgIG1fcEJ1ZmZlciA9IChGWF9MUFdTVFIpRkRFX0FsbG9jKG1faVhNTFBsYW5lU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBtX3BTdGFydCA9IG1fcEVuZCA9IG1fcEJ1ZmZlcjsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcHdzVGV4dERhdGEgPT0gTlVMTCk7DQorICAgIG1fcHdzVGV4dERhdGEgPSAoRlhfTFBXU1RSKUZERV9BbGxvYyhtX2lUZXh0RGF0YVNpemUgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lQYXJzZWRDaGFycyA9IDA7DQorICAgIG1faUJ1ZmZlckNoYXJzID0gMDsNCit9DQorRlhfRFdPUkQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkRvU3ludGF4UGFyc2UoKQ0KK3sNCisgICAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fCBtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwgJiYgbV9wQnVmZmVyICE9IE5VTEwgJiYgbV9wd3NUZXh0RGF0YSAhPSBOVUxMKTsNCisgICAgRlhfSU5UMzIgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIGlQb3M7DQorICAgIEZYX1dDSEFSIGNoOw0KKyAgICBGWF9EV09SRCBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGlmIChtX3BTdGFydCA+PSBtX3BFbmQpIHsNCisgICAgICAgICAgICBpZiAobV9iRU9TIHx8IG1faUN1cnJlbnRQb3MgPj0gaVN0cmVhbUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2lQYXJzZWRDaGFycyArPSAobV9wRW5kIC0gbV9wQnVmZmVyKTsNCisgICAgICAgICAgICBtX2lQYXJzZWRCeXRlcyA9IG1faUN1cnJlbnRQb3M7DQorICAgICAgICAgICAgbV9wU3RyZWFtLT5Mb2NrKCk7DQorICAgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKSAhPSBtX2lDdXJyZW50UG9zKSB7DQorICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lDdXJyZW50UG9zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9pQnVmZmVyQ2hhcnMgPSBtX3BTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBtX2lYTUxQbGFuZVNpemUsIG1fYkVPUyk7DQorICAgICAgICAgICAgaVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICAgICAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgICAgICAgICAgIGlmIChtX2lCdWZmZXJDaGFycyA8IDEpIHsNCisgICAgICAgICAgICAgICAgbV9pQ3VycmVudFBvcyA9IGlTdHJlYW1MZW5ndGg7DQorICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUzsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1faUN1cnJlbnRQb3MgPSBpUG9zOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0ID0gbV9wQnVmZmVyOw0KKyAgICAgICAgICAgIG1fcEVuZCA9IG1fcEJ1ZmZlciArIG1faUJ1ZmZlckNoYXJzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKG1fcFN0YXJ0IDwgbV9wRW5kKSB7DQorICAgICAgICAgICAgY2ggPSAqbV9wU3RhcnQ7DQorICAgICAgICAgICAgc3dpdGNoIChtX2R3TW9kZSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RleHQ6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc8Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnIScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pTGFzdE5vZGVOdW0gKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfRWxlbWVudDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYWc7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0Og0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhZzoNCisgICAgICAgICAgICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFQb3MgPCAxKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fZHdNb2RlICE9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxICYmIEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhUG9zIDwgMSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicgfHwgY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz8nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc9JyAmJiAhRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ246DQorICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBMJz0nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlRdW90YXRpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjoNCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IEwnXCInICYmIGNoICE9IEwnXCcnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVZhbHVlOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IG1fd1F1b3RhdGlvbk1hcmspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IEwnPicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvcyArK10gPSBjaDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFQb3MgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBGREVfTFBYTUxOT0RFIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9Vbmtub3duOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX0N1ck5vZGUuaU5vZGVOdW07DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Og0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Og0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YVBvcyA8IDEpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbDoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gTCdcJycgfHwgbV9Ta2lwQ2hhciA9PSBMJ1wiJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBtX1NraXBDaGFyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUERXT1JEIHBEV29yZCA9IG1fU2tpcFN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERXb3JkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSAoRlhfV0NIQVIpICogcERXb3JkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnPCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCc+Jyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMJ1snOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXSc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXScpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCcoJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJyknOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJyknKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnXCcnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCcnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wnJyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMJ1wiJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJ1wiJzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCdcIicpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gbV9Ta2lwQ2hhcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQRFdPUkQgcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pVGV4dERhdGFMZW5ndGggPj0gOQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEZYU1lTX21lbWNtcChtX3B3c1RleHREYXRhLCBMIltDREFUQVsiLCA3ICogc2l6ZW9mKEZYX1dDSEFSKSkgPT0gMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEZYU1lTX21lbWNtcChtX3B3c1RleHREYXRhICsgbV9pVGV4dERhdGFMZW5ndGggLSAyLCBMIl1dIiwgMiAqIHNpemVvZihGWF9XQ0hBUikpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoIC09IDk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcHdzVGV4dERhdGEsIG1fcHdzVGV4dERhdGEgKyA3LCBtX2lUZXh0RGF0YUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gKEZYX1dDSEFSKSAqIHBEV29yZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fU2tpcFN0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPj0gbV9pVGV4dERhdGFTaXplKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MgKytdID0gY2g7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnQ6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCctJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MrKzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YToNCisgICAgICAgICAgICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc/Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VJbnN0cnVjdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fd1F1b3RhdGlvbk1hcmsgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gY2g7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPj0gbV9pVGV4dERhdGFTaXplKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MgKytdID0gY2g7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdTdGF0dXMgIT0gRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KKyNlbmRpZg0KK0NGREVfWE1MU3ludGF4UGFyc2VyOjp+Q0ZERV9YTUxTeW50YXhQYXJzZXIoKQ0KK3sNCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCisgICAgaWYgKG1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gTlVMTDsNCisgICAgfQ0KKyNlbHNlDQorICAgIGlmIChtX3B3c1RleHREYXRhICE9IE5VTEwpIHsNCisgICAgICAgIEZERV9GcmVlKG1fcHdzVGV4dERhdGEpOw0KKyAgICB9DQorI2VuZGlmDQorICAgIGlmIChtX3BCdWZmZXIgIT0gTlVMTCkgew0KKyAgICAgICAgRkRFX0ZyZWUobV9wQnVmZmVyKTsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0U3RhdHVzKCkgY29uc3QNCit7DQorICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaVN0cmVhbUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybiAxMDA7DQorICAgIH0NCisgICAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcikgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgICAgICByZXR1cm4gMTAwOw0KKyAgICB9DQorICAgIHJldHVybiBtX2lQYXJzZWRCeXRlcyAqIDEwMCAvIGlTdHJlYW1MZW5ndGg7DQorfQ0KK3N0YXRpYyBGWF9JTlQzMiBGWF9HZXRVVEY4RW5jb2RlTGVuZ3RoKEZYX0xQQ1dTVFIgcFNyYywgRlhfSU5UMzIgaVNyY0xlbikNCit7DQorICAgIEZYX0RXT1JEIHVuaWNvZGUgPSAwOw0KKyAgICBGWF9JTlQzMiBpRHN0TnVtID0gMDsNCisgICAgd2hpbGUgKGlTcmNMZW4gLS0gPiAwKSB7DQorICAgICAgICB1bmljb2RlID0gKnBTcmMgKys7DQorICAgICAgICBpbnQgbmJ5dGVzID0gMDsNCisgICAgICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODApIHsNCisgICAgICAgICAgICBuYnl0ZXMgPSAxOw0KKyAgICAgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODAwKSB7DQorICAgICAgICAgICAgbmJ5dGVzID0gMjsNCisgICAgICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDEwMDAwKSB7DQorICAgICAgICAgICAgbmJ5dGVzID0gMzsNCisgICAgICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDIwMDAwMCkgew0KKyAgICAgICAgICAgIG5ieXRlcyA9IDQ7DQorICAgICAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg0MDAwMDAwKSB7DQorICAgICAgICAgICAgbmJ5dGVzID0gNTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbmJ5dGVzID0gNjsNCisgICAgICAgIH0NCisgICAgICAgIGlEc3ROdW0gKz0gbmJ5dGVzOw0KKyAgICB9DQorICAgIHJldHVybiBpRHN0TnVtOw0KK30NCitGWF9GSUxFU0laRSBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0Q3VycmVudEJpbmFyeVBvcygpIGNvbnN0DQorew0KKyAgICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5TcmNMZW4gPSBtX3BTdGFydCAtIG1fcEJ1ZmZlcjsNCisgICAgRlhfSU5UMzIgbkRzdExlbiA9IEZYX0dldFVURjhFbmNvZGVMZW5ndGgobV9wQnVmZmVyLCBuU3JjTGVuKTsNCisgICAgcmV0dXJuIG1faVBhcnNlZEJ5dGVzICsgbkRzdExlbjsNCit9DQorI2lmZGVmIF9GREVfQkxPQ0tfQlVGRkVSDQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6UGFyc2VUZXh0Q2hhcihGWF9XQ0hBUiBjaCkNCit7DQorICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQorICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7DQorICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2ggPT0gTCc7Jykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFbnRpdHk7DQorICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKGNzRW50aXR5LCBtX2lFbnRpdHlTdGFydCArIDEsIChtX2lEYXRhTGVuZ3RoIC0gMSkgLSBtX2lFbnRpdHlTdGFydCAtIDEpOw0KKyAgICAgICAgRlhfSU5UMzIgaUxlbiA9IGNzRW50aXR5LkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgICAgICAgaWYgKGNzRW50aXR5WzBdID09IEwnIycpIHsNCisgICAgICAgICAgICAgICAgY2ggPSAwOw0KKyAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Ow0KKyAgICAgICAgICAgICAgICBpZiAoaUxlbiA+IDEgJiYgY3NFbnRpdHlbMV0gPT0gTCd4Jykgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMjsgaSA8IGlMZW47IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgPj0gTCcwJyAmJiB3IDw9IEwnOScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gTCcwJzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdBJyAmJiB3IDw9IEwnRicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49IEwnYScgJiYgdyA8PSBMJ2YnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDg3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDE7IGkgPCBpTGVuOyBpICsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3IDwgTCcwJyB8fCB3ID4gTCc5Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBjaCAqIDEwICsgdyAtIEwnMCc7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGNoICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIGNoKTsNCisgICAgICAgICAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhbXAiKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJyYnKTsNCisgICAgICAgICAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJsdCIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnPCcpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgKys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImd0IikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCc+Jyk7DQorICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCArKzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiYXBvcyIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnXCcnKTsNCisgICAgICAgICAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0ICsrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJxdW90IikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCdcIicpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX0Jsb2NrQnVmZmVyLkRlbGV0ZVRleHRDaGFycyhtX2lEYXRhTGVuZ3RoIC0gbV9pRW50aXR5U3RhcnQsIEZBTFNFKTsNCisgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9pRW50aXR5U3RhcnQgPCAwICYmIGNoID09IEwnJicpIHsNCisgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IG1faURhdGFMZW5ndGggLSAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcFN0YXJ0ICsrOw0KK30NCisjZWxzZQ0KK3ZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OlBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2gpDQorew0KKyAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICB9DQorICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvc10gPSBjaDsNCisgICAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2ggPT0gTCc7Jykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFbnRpdHkobV9wd3NUZXh0RGF0YSArIG1faUVudGl0eVN0YXJ0ICsgMSwgbV9pRGF0YVBvcyAtIG1faUVudGl0eVN0YXJ0IC0gMSk7DQorICAgICAgICBGWF9JTlQzMiBpTGVuID0gY3NFbnRpdHkuR2V0TGVuZ3RoKCk7DQorICAgICAgICBpZiAoaUxlbiA+IDApIHsNCisgICAgICAgICAgICBpZiAoY3NFbnRpdHlbMF0gPT0gTCcjJykgew0KKyAgICAgICAgICAgICAgICBjaCA9IDA7DQorICAgICAgICAgICAgICAgIEZYX1dDSEFSIHc7DQorICAgICAgICAgICAgICAgIGlmIChpTGVuID4gMSAmJiBjc0VudGl0eVsxXSA9PSBMJ3gnKSB7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlbjsgaSArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA+PSBMJzAnICYmIHcgPD0gTCc5Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSBMJzAnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSBMJ0EnICYmIHcgPD0gTCdGJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdhJyAmJiB3IDw9IEwnZicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gODc7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IGlMZW47IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgPCBMJzAnIHx8IHcgPiBMJzknKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGNoICogMTAgKyB3IC0gTCcwJzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSBjaDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChjc0VudGl0eS5Db21wYXJlKEwiYW1wIikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSBMJyYnOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJsdCIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRW50aXR5U3RhcnQgKytdID0gTCc8JzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiZ3QiKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faUVudGl0eVN0YXJ0ICsrXSA9IEwnPic7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImFwb3MiKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faUVudGl0eVN0YXJ0ICsrXSA9IEwnXCcnOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJxdW90IikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSBMJ1wiJzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1faURhdGFQb3MgPSBtX2lFbnRpdHlTdGFydDsNCisgICAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9pRW50aXR5U3RhcnQgPCAwICYmIGNoID09IEwnJicpIHsNCisgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IG1faURhdGFQb3M7DQorICAgICAgICB9DQorICAgICAgICBtX2lEYXRhUG9zICsrOw0KKyAgICB9DQorICAgIG1fcFN0YXJ0ICsrOw0KK30NCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpSZWFsbG9jVGV4dERhdGFCdWZmZXIoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcHdzVGV4dERhdGEgIT0gTlVMTCk7DQorICAgIGlmIChtX2lUZXh0RGF0YVNpemUgPD0gMTAyNCAqIDEwMjQpIHsNCisgICAgICAgIG1faVRleHREYXRhU2l6ZSAqPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9pVGV4dERhdGFTaXplICs9IDEwMjQgKiAxMDI0Ow0KKyAgICB9DQorICAgIG1fcHdzVGV4dERhdGEgPSAoRlhfTFBXU1RSKUZERV9SZWFsbG9jKG1fcHdzVGV4dERhdGEsIG1faVRleHREYXRhU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KK30NCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpHZXREYXRhKENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpIGNvbnN0DQorew0KKyAgICBGWF9MUFdTVFIgcEJ1ZiA9IHdzRGF0YS5HZXRCdWZmZXIobV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgICBGWFNZU19tZW1jcHkocEJ1ZiwgbV9wd3NUZXh0RGF0YSwgbV9pVGV4dERhdGFMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgd3NEYXRhLlJlbGVhc2VCdWZmZXIobV9pVGV4dERhdGFMZW5ndGgpOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuaCBiL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuaApAQCAtMCwwICsxLDQ0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfWE1MX0lNUA0KKyNkZWZpbmUgX0ZERV9YTUxfSU1QDQorI2RlZmluZSBfRkRFX0JMT0NLX0JVRkZFUg0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KK2NsYXNzIENGREVfQmxvY2tCdWZmZXI7DQorI2VuZGlmDQorY2xhc3MgQ0ZERV9YTUxOb2RlOw0KK2NsYXNzIENGREVfWE1MSW5zdHJ1Y3Rpb247DQorY2xhc3MgQ0ZERV9YTUxFbGVtZW50Ow0KK2NsYXNzIENGREVfWE1MVGV4dDsNCitjbGFzcyBDRkRFX1hNTERvYzsNCitjbGFzcyBJRkRFX1hNTFBhcnNlcjsNCitjbGFzcyBDRkRFX1hNTERPTVBhcnNlcjsNCitjbGFzcyBDRkRFX1hNTFNBWFBhcnNlcjsNCitjbGFzcyBDRkRFX1hNTFN5bnRheFBhcnNlcjsNCitjbGFzcyBDRkRFX1hNTE5vZGUgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfWE1MTm9kZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRkRFX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFCUdldFR5cGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlDb3VudENoaWxkTm9kZXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBDRkRFX1hNTE5vZGUqCUdldENoaWxkTm9kZShGWF9JTlQzMiBpbmRleCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSAqcE5vZGUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIENGREVfWE1MTm9kZSoJR2V0UGF0aChGWF9MUENXU1RSIHBQYXRoLCBGWF9JTlQzMiBpTGVuZ3RoID0gLTEsIEZYX0JPT0wgYlF1YWxpZmllZE5hbWUgPSBUUlVFKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJSW5zZXJ0Q2hpbGROb2RlKENGREVfWE1MTm9kZSAqcE5vZGUsIEZYX0lOVDMyIGluZGV4ID0gLTEpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVDaGlsZE5vZGUoQ0ZERV9YTUxOb2RlICpwTm9kZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCURlbGV0ZUNoaWxkcmVuKCk7DQorICAgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKglHZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0Tm9kZUxldmVsKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sIENGREVfWE1MTm9kZSAqcE5vZGUpOw0KKyAgICB2aXJ0dWFsCUNGREVfWE1MTm9kZSoJUmVtb3ZlTm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSk7DQorICAgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKglDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTYXZlWE1MTm9kZShJRlhfU3RyZWFtICpwWE1MU3RyZWFtKTsNCitwdWJsaWM6DQorICAgIH5DRkRFX1hNTE5vZGUoKTsNCisgICAgdm9pZAkJCQkJQ2xvbmVDaGlsZHJlbihDRkRFX1hNTE5vZGUqIHBDbG9uZSk7DQorICAgIENGREVfWE1MTm9kZQkqbV9wUGFyZW50Ow0KKyAgICBDRkRFX1hNTE5vZGUJKm1fcENoaWxkOw0KKyAgICBDRkRFX1hNTE5vZGUJKm1fcFByaW9yOw0KKyAgICBDRkRFX1hNTE5vZGUJKm1fcE5leHQ7DQorfTsNCitjbGFzcyBDRkRFX1hNTEluc3RydWN0aW9uIDogcHVibGljIENGREVfWE1MTm9kZQ0KK3sNCitwdWJsaWM6DQorICAgIENGREVfWE1MSW5zdHJ1Y3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFyZ2V0KTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRQlHZXRUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOw0KKyAgICB9DQorICAgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKglDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QNCisgICAgew0KKyAgICAgICAgd3NUYXJnZXQgPSBtX3dzVGFyZ2V0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUNvdW50QXR0cmlidXRlcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRBdHRyaWJ1dGUoRlhfSU5UMzIgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0F0dHJpYnV0ZShGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFN0cmluZyhGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSwgRlhfTFBDV1NUUiBwd3NEZWZWYWx1ZSA9IE5VTEwpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SW50ZWdlcihGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfSU5UMzIgaURlZlZhbHVlID0gMCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEludGVnZXIoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0lOVDMyIGlBdHRyaVZhbHVlKTsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0RmxvYXQoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGbG9hdChGWF9MUENXU1RSIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVBdHRyaWJ1dGUoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlDb3VudERhdGEoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0RGF0YShGWF9JTlQzMiBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFwcGVuZERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbW92ZURhdGEoRlhfSU5UMzIgaW5kZXgpOw0KK3B1YmxpYzoNCisgICAgfkNGREVfWE1MSW5zdHJ1Y3Rpb24oKSB7fQ0KKyAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NUYXJnZXQ7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkJCW1fQXR0cmlidXRlczsNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheQkJbV9UYXJnZXREYXRhOw0KK307DQorY2xhc3MgQ0ZERV9YTUxFbGVtZW50IDogcHVibGljIENGREVfWE1MTm9kZQ0KK3sNCitwdWJsaWM6DQorICAgIENGREVfWE1MRWxlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUYWcpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRkRFX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFCUdldFR5cGUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkRFX1hNTE5PREVfRWxlbWVudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENGREVfWE1MTm9kZSoJQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyAmd3NUYWcpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRMb2NhbFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0TmFtZXNwYWNlUHJlZml4KENGWF9XaWRlU3RyaW5nICZ3c1ByZWZpeCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldE5hbWVzcGFjZVVSSShDRlhfV2lkZVN0cmluZyAmd3NOYW1lc3BhY2UpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlDb3VudEF0dHJpYnV0ZXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QXR0cmlidXRlKEZYX0lOVDMyIGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlIYXNBdHRyaWJ1dGUoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRTdHJpbmcoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUsIEZYX0xQQ1dTVFIgcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEludGVnZXIoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0lOVDMyIGlEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRJbnRlZ2VyKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBGWF9JTlQzMiBpQXR0cmlWYWx1ZSk7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldEZsb2F0KEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmRGVmVmFsdWUgPSAwKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0RmxvYXQoRlhfTFBDV1NUUiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlQXR0cmlidXRlKEZYX0xQQ1dTVFIgcHdzQXR0cmlOYW1lKTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFRleHREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KK3B1YmxpYzoNCisgICAgfkNGREVfWE1MRWxlbWVudCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NUYWc7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkJCW1fQXR0cmlidXRlczsNCit9Ow0KK2NsYXNzIENGREVfWE1MVGV4dCA6IHB1YmxpYyBDRkRFX1hNTE5vZGUNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1hNTFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfWE1MTk9ERVRZUEUJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGREVfWE1MTk9ERV9UZXh0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKglDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHdzVGV4dCA9IG1fd3NUZXh0Ow0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCisgICAgew0KKyAgICAgICAgbV93c1RleHQgPSB3c1RleHQ7DQorICAgIH0NCitwdWJsaWM6DQorICAgIH5DRkRFX1hNTFRleHQoKSB7fQ0KKyAgICBDRlhfV2lkZVN0cmluZwkJbV93c1RleHQ7DQorfTsNCitjbGFzcyBDRkRFX1hNTERlY2xhcmF0aW9uIDogcHVibGljIENGREVfWE1MTm9kZQ0KK3sNCitwdWJsaWM6DQorICAgIENGREVfWE1MRGVjbGFyYXRpb24oKSA6IENGREVfWE1MTm9kZSgpIHsgfQ0KK307DQorY2xhc3MgQ0ZERV9YTUxDaGFyRGF0YSA6IHB1YmxpYyBDRkRFX1hNTERlY2xhcmF0aW9uDQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9YTUxDaGFyRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDRGF0YSk7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGREVfWE1MTk9ERVRZUEUJR2V0VHlwZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGREVfWE1MTk9ERV9DaGFyRGF0YTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENGREVfWE1MTm9kZSoJQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0Q2hhckRhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzQ2hhckRhdGEpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHdzQ2hhckRhdGEgPSBtX3dzQ2hhckRhdGE7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Q2hhckRhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQ0RhdGEpDQorICAgIHsNCisgICAgICAgIG1fd3NDaGFyRGF0YSA9IHdzQ0RhdGE7DQorICAgIH0NCisNCitwdWJsaWM6DQorICAgIH5DRkRFX1hNTENoYXJEYXRhKCkge30NCisNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCW1fd3NDaGFyRGF0YTsNCit9Ow0KK2NsYXNzIENGREVfWE1MRG9jIDogcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1hNTERvYygpOw0KKyAgICB+Q0ZERV9YTUxEb2MoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlMb2FkWE1MKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIEZYX0lOVDMyIGlYTUxQbGFuZVNpemUgPSA4MTkyLCBGWF9JTlQzMiBpVGV4dERhdGFTaXplID0gMjU2LCBGREVfTFBYTUxSRUFERVJIQU5ETEVSIHBIYW5kbGVyID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRYTUwoSUZERV9YTUxQYXJzZXIgKnBYTUxQYXJzZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlEb0xvYWQoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCisgICAgdmlydHVhbCB2b2lkCQkJQ2xvc2VYTUwoKTsNCisgICAgdmlydHVhbCBDRkRFX1hNTE5vZGUqCUdldFJvb3QoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wUm9vdDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTYXZlWE1MKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0gPSBOVUxMLCBGWF9CT09MIGJTYXZlQk9NID0gVFJVRSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSAqcE5vZGUpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZYX1N0cmVhbQkJCQkqbV9wU3RyZWFtOw0KKyAgICBGWF9JTlQzMgkJCQltX2lTdGF0dXM7DQorICAgIENGREVfWE1MTm9kZQkJCSptX3BSb290Ow0KKyAgICBJRkRFX1hNTFN5bnRheFBhcnNlcgkqbV9wU3ludGF4UGFyc2VyOw0KKyAgICBJRkRFX1hNTFBhcnNlcgkJCSptX3BYTUxQYXJzZXI7DQorICAgIHZvaWQJCQlSZXNldChGWF9CT09MIGJJbml0Um9vdCk7DQorICAgIHZvaWQJCQlSZWxlYXNlUGFyc2VyKCk7DQorfTsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPENGREVfWE1MTm9kZSo+CUNGREVfWE1MRE9NTm9kZVN0YWNrOw0KK2NsYXNzIENGREVfWE1MRE9NUGFyc2VyIDogcHVibGljIElGREVfWE1MUGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfWE1MRE9NUGFyc2VyKENGREVfWE1MTm9kZSAqcFJvb3QsIElGREVfWE1MU3ludGF4UGFyc2VyCSpwUGFyc2VyKTsNCisgICAgfkNGREVfWE1MRE9NUGFyc2VyKCk7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJRG9QYXJzZXIoSUZYX1BhdXNlICpwUGF1c2UpOw0KK3ByaXZhdGU6DQorICAgIENGREVfWE1MTm9kZQkJCSptX3BSb290Ow0KKyAgICBJRkRFX1hNTFN5bnRheFBhcnNlcgkqbV9wUGFyc2VyOw0KKyAgICBDRkRFX1hNTE5vZGUJCQkqbV9wUGFyZW50Ow0KKyAgICBDRkRFX1hNTE5vZGUJCQkqbV9wQ2hpbGQ7DQorICAgIENGREVfWE1MRE9NTm9kZVN0YWNrCW1fTm9kZVN0YWNrOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3MxOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3MyOw0KK307DQorY2xhc3MgQ0ZERV9YTUxUQUcgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfWE1MVEFHKCkgOiBlVHlwZShGREVfWE1MTk9ERV9Vbmtub3duKSB7fQ0KKyAgICBDRkRFX1hNTFRBRyhjb25zdCBDRkRFX1hNTFRBRyAmc3JjKSA6IHdzVGFnTmFtZShzcmMud3NUYWdOYW1lKSwgZVR5cGUoc3JjLmVUeXBlKSB7fQ0KKyAgICBDRlhfV2lkZVN0cmluZwl3c1RhZ05hbWU7DQorICAgIEZERV9YTUxOT0RFVFlQRQllVHlwZTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU8Q0ZERV9YTUxUQUc+CUNGREVfWE1MVGFnU3RhY2s7DQorY2xhc3MgQ0ZERV9YTUxTQVhQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9YTUxTQVhQYXJzZXIoRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciwgSUZERV9YTUxTeW50YXhQYXJzZXIJKnBQYXJzZXIpOw0KKyAgICB+Q0ZERV9YTUxTQVhQYXJzZXIoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlEb1BhcnNlcihJRlhfUGF1c2UgKnBQYXVzZSk7DQorcHJpdmF0ZToNCisgICAgdm9pZAkJCQkJUHVzaChjb25zdCBDRkRFX1hNTFRBRyAmeG1sVGFnKTsNCisgICAgdm9pZAkJCQkJUG9wKCk7DQorICAgIEZERV9MUFhNTFJFQURFUkhBTkRMRVIJbV9wSGFuZGxlcjsNCisgICAgSUZERV9YTUxTeW50YXhQYXJzZXIJKm1fcFBhcnNlcjsNCisgICAgQ0ZERV9YTUxUYWdTdGFjawkJbV9UYWdTdGFjazsNCisgICAgQ0ZERV9YTUxUQUcJCQkJKm1fcFRhZ1RvcDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzMTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzMjsNCit9Ow0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KK2NsYXNzIENGREVfQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfQmxvY2tCdWZmZXIoRlhfSU5UMzIgaUFsbG9jU3RlcCA9IDEwMjQgKiAxMDI0KTsNCisgICAgfkNGREVfQmxvY2tCdWZmZXIoKTsNCisNCisgICAgRlhfQk9PTCBJbml0QnVmZmVyKEZYX0lOVDMyIGlCdWZmZXJTaXplID0gMTAyNCAqIDEwMjQpOw0KKyAgICBGWF9CT09MIElzSW5pdGlhbGl6ZWQoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pQnVmZmVyU2l6ZSAvIG1faUFsbG9jU3RlcCA+PSAxOw0KKyAgICB9DQorICAgIHZvaWQgUmVsZWFzZUJ1ZmZlcigpDQorICAgIHsNCisgICAgICAgIEZERV9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICBGWF9MUFdTVFIgR2V0QXZhaWxhYmxlQmxvY2soRlhfSU5UMzImIGlJbmRleEluQmxvY2spOw0KKyAgICBpbmxpbmUgRlhfSU5UMzIgR2V0QWxsb2NTdGVwKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faUFsbG9jU3RlcDsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfSU5UMzImIEdldERhdGFMZW5ndGhSZWYoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pRGF0YUxlbmd0aDsNCisgICAgfQ0KKyAgICBpbmxpbmUgdm9pZCBSZXNldChGWF9CT09MIGJSZXNlcnZlRGF0YSA9IFRSVUUpDQorICAgIHsNCisgICAgICAgIGlmICghYlJlc2VydmVEYXRhKSB7DQorICAgICAgICAgICAgbV9pU3RhcnRQb3NpdGlvbiA9IDA7DQorICAgICAgICB9DQorICAgICAgICBtX2lEYXRhTGVuZ3RoID0gMDsNCisgICAgfQ0KKyAgICB2b2lkIFNldFRleHRDaGFyKEZYX0lOVDMyIGlJbmRleCwgRlhfV0NIQVIgY2gpOw0KKyAgICBGWF9JTlQzMiBEZWxldGVUZXh0Q2hhcnMoRlhfSU5UMzIgaUNvdW50LCBGWF9CT09MIGJEaXJlY3Rpb24gPSBUUlVFKTsNCisgICAgdm9pZCAgR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dERhdGEsIEZYX0lOVDMyIGlTdGFydCAgPSAwLCBGWF9JTlQzMiBpTGVuZ3RoID0gLTEpIGNvbnN0Ow0KKw0KK3Byb3RlY3RlZDoNCisgICAgaW5saW5lIHZvaWQgVGV4dERhdGFJbmRleDJCdWZJbmRleChjb25zdCBGWF9JTlQzMiBpSW5kZXgsIEZYX0lOVDMyJiBpQmxvY2tJbmRleCwgRlhfSU5UMzImIGlJbm5lckluZGV4KSBjb25zdDsNCisgICAgdm9pZCBDbGVhckJ1ZmZlcigpOw0KKyAgICBDRlhfUHRyQXJyYXkgbV9CbG9ja0FycmF5Ow0KKyAgICBGWF9JTlQzMiBtX2lEYXRhTGVuZ3RoOw0KKyAgICBGWF9JTlQzMiBtX2lCdWZmZXJTaXplOw0KKyAgICBGWF9JTlQzMiBtX2lBbGxvY1N0ZXA7DQorICAgIEZYX0lOVDMyIG1faVN0YXJ0UG9zaXRpb247DQorfTsNCisjZW5kaWYNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1RleHQJCQkJMA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfTm9kZQkJCQkxDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQJCQkyDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UYWcJCQkJMw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lCQkJNA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ24JNQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlRdW90YXRpb24JNg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZQkJNw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5CQkJOA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5RGVjaW1hbAkJOQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5SGV4CQkJMTANCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb24JMTENCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0JyZWFrRWxlbWVudAkJMTINCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudAkJMTMNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZQkJMTQNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0RlY2xDaGFyRGF0YQkJMTUNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50CQkxNg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnRPckRlY2wJMTcNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGEJCTE4DQorY2xhc3MgQ0ZERV9YTUxTeW50YXhQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxTeW50YXhQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9YTUxTeW50YXhQYXJzZXIoKTsNCisgICAgfkNGREVfWE1MU3ludGF4UGFyc2VyKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGREVfRGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJSW5pdChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9JTlQzMiBpWE1MUGxhbmVTaXplLCBGWF9JTlQzMiBpVGV4dERhdGFTaXplID0gMjU2KTsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJRG9TeW50YXhQYXJzZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRTdGF0dXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0Q3VycmVudFBvcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lQYXJzZWRDaGFycyArIChtX3BTdGFydCAtIG1fcEJ1ZmZlcik7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0Q3VycmVudEJpbmFyeVBvcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRDdXJyZW50Tm9kZU51bWJlcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lDdXJyZW50Tm9kZU51bTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRMYXN0Tm9kZU51bWJlcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lMYXN0Tm9kZU51bTsNCisgICAgfQ0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QNCisgICAgew0KKyAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RhcmdldCwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdA0KKyAgICB7DQorICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFnLCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJR2V0QXR0cmlidXRlTmFtZShDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUpIGNvbnN0DQorICAgIHsNCisgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NBdHRyaU5hbWUsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdA0KKyAgICB7DQorICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzQXR0cmlWYWx1ZSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NUZXh0LCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJR2V0VGFyZ2V0RGF0YShDRlhfV2lkZVN0cmluZyAmd3NEYXRhKSBjb25zdA0KKyAgICB7DQorICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzRGF0YSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgICB9DQorI2Vsc2UNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyAmd3NUYXJnZXQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEdldERhdGEod3NUYXJnZXQpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdA0KKyAgICB7DQorICAgICAgICBHZXREYXRhKHdzVGFnKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSkgY29uc3QNCisgICAgew0KKyAgICAgICAgR2V0RGF0YSh3c0F0dHJpTmFtZSk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJR2V0QXR0cmlidXRlVmFsdWUoQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkgY29uc3QNCisgICAgew0KKyAgICAgICAgR2V0RGF0YSh3c0F0dHJpVmFsdWUpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEdldERhdGEod3NUZXh0KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXREYXRhKENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEdldERhdGEod3NEYXRhKTsNCisgICAgfQ0KKyNlbmRpZg0KK3Byb3RlY3RlZDoNCisgICAgSUZYX1N0cmVhbQkJCSptX3BTdHJlYW07DQorICAgIEZYX0lOVDMyCQkJbV9pWE1MUGxhbmVTaXplOw0KKyAgICBGWF9JTlQzMgkJCW1faUN1cnJlbnRQb3M7DQorICAgIEZYX0lOVDMyCQkJbV9pQ3VycmVudE5vZGVOdW07DQorICAgIEZYX0lOVDMyCQkJbV9pTGFzdE5vZGVOdW07DQorICAgIEZYX0lOVDMyCQkJbV9pUGFyc2VkQ2hhcnM7DQorICAgIEZYX0lOVDMyCQkJbV9pUGFyc2VkQnl0ZXM7DQorICAgIEZYX0xQV1NUUgkJCW1fcEJ1ZmZlcjsNCisgICAgRlhfSU5UMzIJCQltX2lCdWZmZXJDaGFyczsNCisgICAgRlhfQk9PTAkJCQltX2JFT1M7DQorICAgIEZYX0xQV1NUUgkJCW1fcFN0YXJ0Ow0KKyAgICBGWF9MUFdTVFIJCQltX3BFbmQ7DQorICAgIEZERV9YTUxOT0RFCQkJbV9DdXJOb2RlOw0KKyAgICBDRkRFX1hNTE5vZGVTdGFjawltX1hNTE5vZGVTdGFjazsNCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCisgICAgQ0ZERV9CbG9ja0J1ZmZlcgltX0Jsb2NrQnVmZmVyOw0KKyAgICBGWF9JTlQzMgkJCW1faUFsbG9jU3RlcDsNCisgICAgRlhfSU5UMzImCQkJbV9pRGF0YUxlbmd0aDsNCisgICAgRlhfTFBXU1RSCQkJbV9wQ3VycmVudEJsb2NrOw0KKyAgICBGWF9JTlQzMgkJCW1faUluZGV4SW5CbG9jazsNCisjZWxzZQ0KKyAgICBGWF9JTlQzMgkJCW1faVRleHREYXRhU2l6ZTsNCisgICAgRlhfTFBXU1RSCQkJbV9wd3NUZXh0RGF0YTsNCisgICAgRlhfSU5UMzIJCQltX2lEYXRhUG9zOw0KKyNlbmRpZg0KKyAgICBGWF9JTlQzMgkJCW1faVRleHREYXRhTGVuZ3RoOw0KKyAgICBGWF9EV09SRAkJCW1fZHdTdGF0dXM7DQorICAgIEZYX0RXT1JECQkJbV9kd01vZGU7DQorICAgIEZYX1dDSEFSCQkJbV93UXVvdGF0aW9uTWFyazsNCisgICAgRlhfSU5UMzIJCQltX2lFbnRpdHlTdGFydDsNCisgICAgQ0ZYX0RXb3JkU3RhY2sJCW1fU2tpcFN0YWNrOw0KKyAgICBGWF9XQ0hBUgkJCW1fU2tpcENoYXI7DQorICAgIGlubGluZSB2b2lkCQkJCVBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2gpOw0KKyNpZm5kZWYgX0ZERV9CTE9DS19CVUZGRVINCisgICAgdm9pZAkJCQlSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgdm9pZAkJCQlHZXREYXRhKENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpIGNvbnN0Ow0KKyNlbmRpZg0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvaW5jbHVkZS9meF93b3JkYnJlYWsuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvZnhfd29yZGJyZWFrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxYWNhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvZnhfd29yZGJyZWFrLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9XT1JEQlJFQUtfSA0KKyNkZWZpbmUgX0ZYX1dPUkRCUkVBS19IDQorY2xhc3MgSUZYX0NoYXJJdGVyOw0KK2NsYXNzIElGWF9Xb3JkQnJlYWsNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJQXR0YWNoKElGWF9DaGFySXRlciAqIHBJdGVyKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJQXR0YWNoKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgd3NUZXh0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0QXQoRlhfSU5UMzIgbkluZGV4KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0V29yZFBvcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRXb3JkTGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFdvcmQoQ0ZYX1dpZGVTdHJpbmcgJndzV29yZCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzRU9GKEZYX0JPT0wgYlRhaWwgPSBUUlVFKSBjb25zdCA9IDA7DQorfTsNCitJRlhfV29yZEJyZWFrICogRlhfV29yZEJyZWFrX0NyZWF0ZSgpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ZjM2VjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfSUZERV9UWFRFRFRCVUZfSA0KKyNkZWZpbmUgX0lGREVfVFhURURUQlVGX0gNCisjZGVmaW5lIEZERV9ERUZDSFVOS0xFTkdUSAkoMTAyNCkNCitjbGFzcyBJRkRFX1R4dEVkdEJ1ZjsNCitjbGFzcyBJRkRFX1R4dEVkdEJ1Zg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRDaHVua1NpemUoRlhfSU5UMzIgbkNodW5rU2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENodW5rU2l6ZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXJCeUluZGV4KEZYX0lOVDMyIG5JbmRleCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFJhbmdlKENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5CZWdpbiwgRlhfSU5UMzIgbkNvdW50ID0gLSAxKSBjb25zdCA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJSW5zZXJ0KEZYX0lOVDMyIG5Qb3MsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoID0gMSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyIG5MZW5ndGggPSAxKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IFRSVUUpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQlPcHRpbWl6ZShJRlhfUGF1c2UgKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmggYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3NzM5YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaApAQCAtMCwwICsxLDIzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9JRkRFX1RYVEVEVEVOR0lORV9IDQorI2RlZmluZSBfSUZERV9UWFRFRFRFTkdJTkVfSA0KK2NsYXNzIElGREVfVHh0RWR0QnVmOw0KK2NsYXNzIElGREVfVHh0RWR0UGFnZTsNCitjbGFzcyBJRkRFX1R4dEVkdEVuZ2luZTsNCitjbGFzcyBJRkRFX1R4dEVkdEV2ZW50U2luazsNCitjbGFzcyBJRkRFX1R4dEVkdFBhcmFnOw0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX1ByZXYJCSgwTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX05leHQJCSgxTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX1dob2xlV29yZCAoMUwgPDwgMSkNCisjZGVmaW5lIEZERV9UWFRFRFRfRklORF9GTEFHU19Ob0Nhc2UJKDFMIDw8IDIpDQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9IVFhURURURklORCB7DQorICAgIEZYX0xQVk9JRCBwRGF0YTsNCit9ICogRkRFX0hUWFRFRFRGSU5EOw0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzCQkoMUwgPDwgMCkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwCSgxTCA8PCAxKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9SZWFkT25seQkJKDFMIDw8IDIpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0CSgxTCA8PCAzKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yegkoMUwgPDwgNCkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbwkJKDFMIDw8IDUpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0ZJRUxEX1RBQgkJKDFMIDw8IDYpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0ZJRUxEX0FVVE8JCSgxTCA8PCA3KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9WYWxpZGF0ZQkJKDFMIDw8IDgpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkCQkoMUwgPDwgOSkNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0xlZnQJCQkoMEwgPDwgMCkNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0NlbnRlcgkJKDFMIDw8IDApDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9SaWdodAkJCSgyTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUQUxJR05fTm9ybWFsCQkoMUwgPDwgMykNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0p1c3RpZmllZAkJKDFMIDw8IDQpDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9EaXN0cmlidXRlZAkoMUwgPDwgNSkNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbAkJKDFMIDw8IDApDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQ2hhclZlcnRpYWwJCSgxTCA8PCAxKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlCQkoMUwgPDwgMikNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9SVEwJCQkJKDFMIDw8IDMpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQJCQkoMUwgPDwgNCkNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9FeHBhbmRUYWIJCSgxTCA8PCA1KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0FyYWJpY0NvbnRleHQJKDFMIDw8IDYpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQXJhYmljU2hhcGVzCQkoMUwgPDwgNykNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9MYXN0TGluZUhlaWdodAkoMUwgPDwgOCkNCitlbnVtIEZERV9UWFRFRFRNT1ZFQ0FSRVQgew0KKyAgICBNQ19Nb3ZlTm9uZQk9IDAJLA0KKyAgICBNQ19MZWZ0CQkJLA0KKyAgICBNQ19SaWdodAkJLA0KKyAgICBNQ19VcAkJCSwNCisgICAgTUNfRG93bgkJCSwNCisgICAgTUNfV29yZEJhY2t3YXJkCSwNCisgICAgTUNfV29yZEZvcndhcmQJLA0KKyAgICBNQ19MaW5lU3RhcnQJLA0KKyAgICBNQ19MaW5lRW5kCQksDQorICAgIE1DX1BhcmFnU3RhcnQJLA0KKyAgICBNQ19QYXJhZ0VuZAkJLA0KKyAgICBNQ19QYWdlVXAJCSwNCisgICAgTUNfUGFnZURvd24JCSwNCisgICAgTUNfSG9tZQkJCSwNCisgICAgTUNfRW5kCQkJLA0KK307DQorZW51bSBGREVfVFhURURUX01PRElGWV9SRVQgew0KKyAgICBGREVfVFhURURUX01PRElGWV9SRVRfRl9UYWIJCQk9IC02LA0KKyAgICBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQJCT0gLTUsDQorICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGUJPSAtNCwNCisgICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnkJPSAtMywNCisgICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbAkJPSAtMiwNCisgICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTm9ybWFsCQk9IC0xLA0KKyAgICBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWwJCT0gMCwNCisgICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfRnVsbAkJPSAxLA0KKyAgICBGREVfVFhURURUX01PRElGWV9SRVRfU19QYXJ0CQk9IDIsDQorICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX0VtcHR5CQk9IDMsDQorICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9UX1RhYgkJCT0gNCwNCit9Ow0KK2VudW0gRkRFX1RYVEVESVRfTElORUVORCB7DQorICAgIEZERV9UWFRFRElUX0xJTkVFTkRfQXV0bywNCisgICAgRkRFX1RYVEVESVRfTElORUVORF9DUkxGLA0KKyAgICBGREVfVFhURURJVF9MSU5FRU5EX0NSLA0KKyAgICBGREVfVFhURURJVF9MSU5FRU5EX0xGLA0KK307DQorc3RydWN0IF9GREVfVFhURURUUEFSQU1TIDogcHVibGljIENGWF9PYmplY3Qgew0KKyAgICBfRkRFX1RYVEVEVFBBUkFNUygpDQorICAgICAgICA6IGZQbGF0ZVdpZHRoKDApDQorICAgICAgICAsIGZQbGF0ZUhlaWdodCgwKQ0KKyAgICAgICAgLCBuTGluZUNvdW50KDApDQorICAgICAgICAsIGR3TGF5b3V0U3R5bGVzKDApDQorICAgICAgICAsIGR3QWxpZ25tZW50KDApDQorICAgICAgICAsIGR3TW9kZSgwKQ0KKyAgICAgICAgLCBwRm9udChOVUxMKQ0KKyAgICAgICAgLCBmRm9udFNpemUoMTAuMGYpDQorICAgICAgICAsIGR3Rm9udENvbG9yKDB4ZmYwMDAwMDApDQorICAgICAgICAsIGZMaW5lU3BhY2UoMTAuMGYpDQorICAgICAgICAsIGZUYWJXaWR0aCgzNikNCisgICAgICAgICwgYlRhYkVxdWlkaXN0YW50KEZBTFNFKQ0KKyAgICAgICAgLCB3RGVmQ2hhcigweEZFRkYpDQorICAgICAgICAsIHdMaW5lQnJlYWtDaGFyKCdcbicpDQorICAgICAgICAsIG5DaGFyUm90YXRpb24oMCkNCisgICAgICAgICwgbkxpbmVFbmQoMCkNCisgICAgICAgICwgbkhvcnpTY2FsZSgxMDApDQorICAgICAgICAsIGZDaGFyU3BhY2UoMCkNCisgICAgICAgICwgcEV2ZW50U2luayhOVUxMKQ0KKyAgICB7DQorICAgIH0NCisgICAgRlhfRkxPQVQJZlBsYXRlV2lkdGg7DQorICAgIEZYX0ZMT0FUCWZQbGF0ZUhlaWdodDsNCisgICAgRlhfSU5UMzIJbkxpbmVDb3VudDsNCisgICAgRlhfRFdPUkQJZHdMYXlvdXRTdHlsZXM7DQorICAgIEZYX0RXT1JECWR3QWxpZ25tZW50Ow0KKyAgICBGWF9EV09SRAlkd01vZGU7DQorICAgIElGWF9Gb250CSpwRm9udDsNCisgICAgRlhfRkxPQVQJZkZvbnRTaXplOw0KKyAgICBGWF9BUkdCCQlkd0ZvbnRDb2xvcjsNCisgICAgRlhfRkxPQVQJZkxpbmVTcGFjZTsNCisgICAgRlhfRkxPQVQJZlRhYldpZHRoOw0KKyAgICBGWF9CT09MCQliVGFiRXF1aWRpc3RhbnQ7DQorICAgIEZYX1dDSEFSCXdEZWZDaGFyOw0KKyAgICBGWF9XQ0hBUgl3TGluZUJyZWFrQ2hhcjsNCisgICAgRlhfSU5UMzIJbkNoYXJSb3RhdGlvbjsNCisgICAgRlhfSU5UMzIJbkxpbmVFbmQ7DQorICAgIEZYX0lOVDMyCW5Ib3J6U2NhbGU7DQorICAgIEZYX0ZMT0FUCWZDaGFyU3BhY2U7DQorICAgIElGREVfVHh0RWR0RXZlbnRTaW5rICogcEV2ZW50U2luazsNCit9Ow0KK3R5cGVkZWYgX0ZERV9UWFRFRFRQQVJBTVMJRkRFX1RYVEVEVFBBUkFNUzsNCit0eXBlZGVmIF9GREVfVFhURURUUEFSQU1TKglGREVfTFBUWFRFRFRQQVJBTVM7DQorZW51bSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRSB7DQorICAgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydAk9IDAJLA0KKyAgICBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGUJCSwNCisgICAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfUmVwbGFjZQkJLA0KK307DQorc3RydWN0IF9GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgRlhfSU5UMzIJCW5DaGFuZ2VUeXBlOw0KKyAgICBDRlhfV2lkZVN0cmluZwl3c0luc2VydDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJd3NEZWxldGU7DQorICAgIENGWF9XaWRlU3RyaW5nICB3c1ByZXZUZXh0Ow0KK307DQordHlwZWRlZiBfRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8JCUZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPOw0KK3R5cGVkZWYgX0ZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPKglGREVfTFBUWFRFRFRfVEVYVENIQU5HRV9JTkZPOw0KK2NsYXNzIElGREVfVHh0RWR0RXZlbnRTaW5rDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCU9uX0NhcmV0Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBGWF9JTlQzMiBuUGFnZSwgRlhfQk9PTCBiVmlzaWJsZSA9IFRSVUUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCU9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPICZDaGFuZ2VJbmZvKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlPbl9QYWdlQ291bnRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCU9uX1NlbENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJT25fUGFnZUxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgRlhfSU5UMzIgblBhZ2VJbmRleCwgRlhfSU5UMzIgblB1cnBvc2UpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCU9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgRlhfSU5UMzIgblBhZ2VJbmRleCwgRlhfSU5UMzIgblB1cnBvc2UpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCU9uX1BhZ2VDaGFuZ2UoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgRlhfSU5UMzIgblBhZ2VJbmRleCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJT25fQWRkRG9SZWNvcmQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgRlhfQlNUUiBic0RvUmVjb3JkKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIEZYX0lOVDMyIG5CbG9ja0luZGV4LCBGWF9JTlQzMiBuRmllbGRJbmRleCwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZFRleHQsIEZYX0lOVDMyIG5DaGFySW5kZXgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MIE9uX1ZhbGlkYXRlQmxvY2soSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgRlhfSU5UMzIgbkJsb2NrSW5kZXgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MIE9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBGWF9JTlQzMiBuQmxvY2tJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2tUZXh0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSA9IDA7DQorfTsNCitjbGFzcyBJRlhfQ2hhckl0ZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2ID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCBGWF9XQ0hBUglHZXRDaGFyKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEF0KEZYX0lOVDMyIG5JbmRleCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldEF0KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzRU9GKEZYX0JPT0wgYlRhaWwgPSBUUlVFKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0NoYXJJdGVyICogQ2xvbmUoKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX1R4dEVkdEVuZ2luZQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX1R4dEVkdEVuZ2luZSoJCUNyZWF0ZSgpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TICZwYXJhbXMpID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBGREVfVFhURURUUEFSQU1TKiBHZXRFZGl0UGFyYW1zKCkgY29uc3QgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUNvdW50UGFnZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9UeHRFZHRQYWdlKgkJR2V0UGFnZShGWF9JTlQzMiBuSW5kZXgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCQlTZXRCdWZDaHVua1NpemUoRlhfSU5UMzIgbkNodW5rU2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFRleHRCeVN0cmVhbShJRlhfU3RyZWFtICogcFN0cmVhbSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUdldFRleHRMZW5ndGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCA9IC0xKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJQ2xlYXJUZXh0KCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUdldENhcmV0UmVjdChDRlhfUmVjdEYgJnJ0Q2FyZXQpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRDYXJldFBvcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlTZXRDYXJldFBvcyhGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlNb3ZlQ2FyZXRQb3MoRkRFX1RYVEVEVE1PVkVDQVJFVCBlTW92ZUNhcmV0LCBGWF9CT09MIGJTaGlmdCA9IEZBTFNFLCBGWF9CT09MIGJDdHJsID0gRkFMU0UpID0gMDsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCQlMb2NrKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVVubG9jaygpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCQlJc0xvY2tlZCgpIGNvbnN0ID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlJbnNlcnQoRlhfSU5UMzIgblN0YXJ0LCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbmd0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCURlbGV0ZShGWF9JTlQzMiBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSA9IEZBTFNFKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJRGVsZXRlUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgPSAtMSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCVJlcGxhY2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuTGVuZ3RoLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NSZXBsYWNlKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TGltaXQoRlhfSU5UMzIgbkxpbWl0KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvcm1hdEJsb2NrKEZYX0lOVDMyIG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2tGb3JtYXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlDb3VudEVkaXRCbG9ja3MoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0RWRpdEJsb2NrVGV4dChGWF9JTlQzMiBuSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrVGV4dCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCUNvdW50RWRpdEZpZWxkcyhGWF9JTlQzMiBuQmxvY2tJbmRleCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldEVkaXRGaWVsZFRleHQoRlhfSU5UMzIgbkJsb2NrSW5kZXgsIEZYX0lOVDMyIG5GaWVsZEluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZFRleHQpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlTdGFydEVkaXQoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJRW5kRWRpdCgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlBZGRTZWxSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCA9IC0xKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRTZWxSYW5nZXMoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJR2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJQ2xlYXJTZWxlY3Rpb24oKSA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJUmVkbyhGWF9CU1RSIGJzUmVkbykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVVuZG8oRlhfQlNUUiBic1VuZG8pID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlTdGFydExheW91dCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlEb0xheW91dChJRlhfUGF1c2UgKnBQYXVzZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCUVuZExheW91dCgpID0gMDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCQlPcHRpbWl6ZShJRlhfUGF1c2UgKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRQYXJhZ3MoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9UeHRFZHRQYXJhZyoJCUdldFBhcmFnKEZYX0lOVDMyIG5QYXJhZ0luZGV4KSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0NoYXJJdGVyKgkJCUNyZWF0ZUNoYXJJdGVyKCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9UeHRFZHRQYXJhZw0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsCUZYX0lOVDMyCQkJR2V0U3RhcnRJbmRleCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50TGluZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRMaW5lUmFuZ2UoRlhfSU5UMzIgbkxpbmVJbmRleCwgRlhfSU5UMzImIG5TdGFydCwgRlhfSU5UMzImIG5Db3VudCkgY29uc3QgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRwYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NTQzNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRwYWdlLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9JRkRFX1RYVEVEVFBBR0VfSA0KKyNkZWZpbmUgX0lGREVfVFhURURUUEFHRV9IDQorY2xhc3MgSUZERV9UeHRFZHRFbmdpbmU7DQorY2xhc3MgSUZERV9UeHRFZHRQYWdlOw0KK2NsYXNzIElGREVfVHh0RWR0UGFnZSA6IHB1YmxpYyBJRkRFX0NhbnZhc1NldCwgcHVibGljIElGWF9UeHRBY2Nlc3MNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZERV9UeHRFZHRQYWdlICogQ3JlYXRlKElGREVfVHh0RWR0RW5naW5lICogcEVuZ2luZSwgRlhfSU5UMzIgbkluZGV4KTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7DQorDQorICAgIHZpcnR1YWwgSUZERV9UeHRFZHRFbmdpbmUgKiBHZXRFbmdpbmUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0Q2hhclJlY3QoRlhfSU5UMzIgbkluZGV4LCBDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkJCb3ggPSBGQUxTRSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGICZmUG9pbnQsIEZYX0JPT0wgJmJCZWZvcmUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlDYWxjUmFuZ2VSZWN0QXJyYXkoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQsIENGWF9SZWN0RkFycmF5ICZSZWN0RkFycikgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCVNlbGVjdFdvcmQgKGNvbnN0IENGWF9Qb2ludEYgJmZQb2ludCwgRlhfSU5UMzIgJm5Db3VudCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENoYXJTdGFydCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRDaGFyQ291bnQoKSBjb25zdCA9IDA7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0RGlzcGxheVBvcyhjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCwgRlhURVhUX0NIQVJQT1MqICZwQ2hhclBvcywgRlhfTFBSRUNURiBwQkJveCA9IE5VTEwpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzTG9hZGVkKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJTG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVVubG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJgkJR2V0Q29udGVudHNCb3goKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1MTViZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmNwcApAQCAtMCwwICsxLDY3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX3R4dGVkdGJsb2NrLmgiDQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04JCTB4RkZGOQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQJCTB4RkZGQg0KKyNkZWZpbmUgRkRFX1RYVEVEVF9aRVJPV0lEVEhTUEFDRQkJMHgyMDBCDQorI2RlZmluZSBGREVfVFhURURUX0lTSU5URUdFUihhKQkoKGEpID49IEwnMCcgJiYgKGEpIDw9IEwnOScpDQorI2RlZmluZSBGREVfVFhURURUX0lTU0lHTihhKQkoKChhKSA9PSBMJy0nKSB8fCAoKGEpID09IEwnKycpKQ0KK0NGREVfVHh0RWR0QmxvY2s6OkNGREVfVHh0RWR0QmxvY2soQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NCbG9jaywgRlhfSU5UMzIgblBvc2l0aW9uKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKQ0KKyAgICAsIG1fbkRpc3BsYXlMZW5ndGgoMCkNCisgICAgLCBtX25JbmRleCgwKQ0KKyAgICAsIG1fblBvc2l0aW9uKG5Qb3NpdGlvbikNCit7DQorICAgIEZYX0xQQ1dTVFIgbHBCdWYgPSBGWF9MUENXU1RSKHdzQmxvY2spOw0KKyAgICBGWF9JTlQzMiBuQ291bnQJPSB3c0Jsb2NrLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBpCQk9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRml4Ow0KKyAgICBGWF9JTlQzMiBqID0gMDsNCisgICAgd2hpbGUgKGkgPCBuQ291bnQpIHsNCisgICAgICAgIGlmIChscEJ1ZltpXSAhPSBMJyUnKSB7DQorICAgICAgICAgICAgd3NGaXggKz0gbHBCdWZbaV07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGkgKys7DQorICAgICAgICAgICAgaWYgKGkgPCBuQ291bnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKGxwQnVmW2ldID09IEwnJScpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzRml4ICs9IGxwQnVmW2ldOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0ZpeC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gQ0ZERV9UeHRFZHRGaWVsZDo6Q3JlYXRlKHdzRml4LCBqLCB0aGlzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBqICsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9uRGlzcGxheUxlbmd0aCArPSBwRmllbGQtPkdldERpc3BsYXlMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c0ZpeC5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgblBvcyA9IGkgLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxwQnVmW2kgKytdICE9IEwnKScpDQorICAgICAgICAgICAgICAgICAgICAgICAgOw0KKyAgICAgICAgICAgICAgICAgICAgaSArKzsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0ZpZWxkKGxwQnVmICsgblBvcywgaSAtIG5Qb3MpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpZWxkLCBqLCB0aGlzKTsNCisgICAgICAgICAgICAgICAgICAgIGogKys7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCisgICAgICAgICAgICAgICAgICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQorICAgICAgICAgICAgICAgICAgICBtX0VkaXRGaWVsZEFyci5BZGQocEZpZWxkKTsNCisgICAgICAgICAgICAgICAgICAgIG1fbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICBpIC0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaSArKzsNCisgICAgfQ0KKyAgICBpZiAoIXdzRml4LklzRW1wdHkoKSkgew0KKyAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpeCwgaiwgdGhpcyk7DQorICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCisgICAgICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQorICAgICAgICBtX25EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KKyAgICB9DQorfQ0KK0NGREVfVHh0RWR0QmxvY2s6On5DRkRFX1R4dEVkdEJsb2NrKCkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gbV9GaWVsZEFycltpXTsNCisgICAgICAgIHBGaWVsZC0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIG1fRmllbGRBcnIuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCbG9jazo6R2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRGlzcGxheSkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gbV9GaWVsZEFycltpXTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NUZW1wKTsNCisgICAgICAgIHdzRGlzcGxheSArPSB3c1RlbXA7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRCbG9jazo6R2V0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIG5EaXNwbGF5TGVuZ3RoID0gMDsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KKyAgICAgICAgbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIG5EaXNwbGF5TGVuZ3RoOw0KK30NCit2b2lkIENGREVfVHh0RWR0QmxvY2s6OkdldEJsb2NrVGV4dChDRlhfV2lkZVN0cmluZyAmd3NCbG9jaykNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gbV9GaWVsZEFycltpXTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzVGVtcCk7DQorICAgICAgICB3c0Jsb2NrICs9IHdzVGVtcDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEJsb2NrOjpDb3VudEZpZWxkKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX0VkaXRGaWVsZEFyci5HZXRTaXplKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCbG9jazo6R2V0RmllbGRUZXh0KEZYX0lOVDMyIG5JbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQpDQorew0KKyAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gbV9FZGl0RmllbGRBcnJbbkluZGV4XTsNCisgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NGaWVsZCk7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0QmxvY2s6OkdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBuVG90YWxMZW5ndGggPSAwOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX0VkaXRGaWVsZEFyci5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBtX0VkaXRGaWVsZEFycltpXTsNCisgICAgICAgIG5Ub3RhbExlbmd0aCA9IHBGaWVsZC0+R2V0RmllbGRUZXh0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIG5Ub3RhbExlbmd0aDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRCbG9jazo6R2V0UG9zKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX25Qb3NpdGlvbjsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpHZXRSZWFsVGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NUZW1wKTsNCisgICAgICAgIHdzVGV4dCArPSB3c1RlbXA7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpCYWNrdXAoKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9FZGl0RmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBtX0VkaXRGaWVsZEFycltpXS0+QmFja3VwKCk7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpSZXN0b3JlKCkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fRWRpdEZpZWxkQXJyLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgbV9FZGl0RmllbGRBcnJbaV0tPlJlc3RvcmUoKTsNCisgICAgfQ0KK30NCitDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOjpDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCkNCit7DQorfQ0KK0NGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6On5DRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCkNCit7DQorICAgIEZERV9MUFRYVEVEVEZPUk1BVElURU0gbHBJdGVtID0gTlVMTDsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9JdGVtQXJyLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgbHBJdGVtID0gbV9JdGVtQXJyW2ldOw0KKyAgICAgICAgZGVsZXRlIGxwSXRlbTsNCisgICAgfQ0KKyAgICBtX0l0ZW1BcnIuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcjo6UGFyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0KQ0KK3sNCisgICAgbV93c0Zvcm1hdCA9IHdzRm9ybWF0Ow0KKyAgICBGWF9MUENXU1RSCXBCdWYJPSBGWF9MUENXU1RSKG1fd3NGb3JtYXQpOw0KKyAgICBGWF9JTlQzMgluQ291bnQJPSBtX3dzRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgICBuQ291bnQgLT0gMjsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHBCdWZbaV07DQorICAgICAgICBpZiAod0NoYXIgPT0gTCcoJykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGkgKys7DQorICAgIEZERV9UWFRFRFRGT1JNQVRJVEVNIEZvcm1hdEl0ZW07DQorICAgIGZvciAoOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICB3aGlsZSAocEJ1ZltpXSA9PSBMJyAnKSB7DQorICAgICAgICAgICAgaSArKzsNCisgICAgICAgIH0NCisgICAgICAgIEZvcm1hdEl0ZW0ubktleVN0YXJ0ID0gaTsNCisgICAgICAgIHdoaWxlIChwQnVmW2ldICE9IEwnOicpIHsNCisgICAgICAgICAgICBpICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRm9ybWF0SXRlbS5uS2V5Q291bnQgPSBpIC0gRm9ybWF0SXRlbS5uS2V5U3RhcnQ7DQorICAgICAgICBpICsrOw0KKyAgICAgICAgRm9ybWF0SXRlbS5uVmFsU3RhcnQgPSBpOw0KKyAgICAgICAgd2hpbGUgKHBCdWZbaV0gIT0gTCc7JyAmJiBpIDwgbkNvdW50KSB7DQorICAgICAgICAgICAgaSArKzsNCisgICAgICAgIH0NCisgICAgICAgIEZvcm1hdEl0ZW0ublZhbENvdW50ID0gaSAtIEZvcm1hdEl0ZW0ublZhbFN0YXJ0Ow0KKyAgICAgICAgRkRFX0xQVFhURURURk9STUFUSVRFTSBwRm9ybWF0SXRlbSA9IEZYX05FVyBGREVfVFhURURURk9STUFUSVRFTTsNCisgICAgICAgIEZYU1lTX21lbWNweShwRm9ybWF0SXRlbSwgJkZvcm1hdEl0ZW0sIHNpemVvZihGREVfVFhURURURk9STUFUSVRFTSkpOw0KKyAgICAgICAgbV9JdGVtQXJyLkFkZChwRm9ybWF0SXRlbSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6OkNvdW50SXRlbXMoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fSXRlbUFyci5HZXRTaXplKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcjo6R2V0SXRlbShGWF9JTlQzMiBuSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0tleSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0DQorew0KKyAgICBGREVfTFBUWFRFRFRGT1JNQVRJVEVNIGxwSXRlbSA9IG1fSXRlbUFycltuSW5kZXhdOw0KKyAgICBGWF9MUENXU1RSIGxwU3JjQnVmID0gRlhfTFBDV1NUUihtX3dzRm9ybWF0KTsNCisgICAgRlhfTFBXU1RSIGxwRHN0QnVmID0gd3NLZXkuR2V0QnVmZmVyKGxwSXRlbS0+bktleUNvdW50KTsNCisgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1ZiArIGxwSXRlbS0+bktleVN0YXJ0LCBscEl0ZW0tPm5LZXlDb3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICB3c0tleS5SZWxlYXNlQnVmZmVyKGxwSXRlbS0+bktleUNvdW50KTsNCisgICAgbHBEc3RCdWYgPSB3c1ZhbHVlLkdldEJ1ZmZlcihscEl0ZW0tPm5WYWxDb3VudCk7DQorICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYgKyBscEl0ZW0tPm5WYWxTdGFydCwgbHBJdGVtLT5uVmFsQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgd3NWYWx1ZS5SZWxlYXNlQnVmZmVyKGxwSXRlbS0+blZhbENvdW50KTsNCit9DQorQ0ZERV9UeHRFZHRGaWVsZCAqIENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCwgRlhfSU5UMzIgbkluZGV4LCBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrKQ0KK3sNCisgICAgaWYgKHdzRmllbGRbMF0gIT0gTCclJyB8fCAod3NGaWVsZFswXSA9PSBMJyUnICYmIHdzRmllbGRbMV0gPT0gTCclJykpIHsNCisgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9GaXhlZCh3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQorICAgIH0NCisgICAgRlhfV0NIQVIgd2NUeXBlID0gd3NGaWVsZFt3c0ZpZWxkLkdldExlbmd0aCgpIC0gMV07DQorICAgIHN3aXRjaCh3Y1R5cGUpIHsNCisgICAgICAgIGNhc2UgTCdkJzoNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RmllbGRfSW50ZWdlcih3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQorICAgICAgICBjYXNlIEwnZic6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdEZpZWxkX0Zsb2F0KHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgICAgICAgIGNhc2UgTCdzJzoNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RmllbGRfU3RyaW5nKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgICAgICAgIGNhc2UgTCdwJzoNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQod3NGaWVsZCwgbkluZGV4LCBwQmxvY2spOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitDRkRFX1R4dEVkdEZpZWxkOjpDRkRFX1R4dEVkdEZpZWxkKEZYX0lOVDMyIG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jaykNCisgICAgOiBtX25MZW5ndGgoLTEpDQorICAgICwgbV93Y0ZpbGwoTCcgJykNCisgICAgLCBtX2JSZXNlcnZlU3BhY2UoRkFMU0UpDQorICAgICwgbV9iTGVmdEFsaWdubWVudChUUlVFKQ0KKyAgICAsIG1fbkluZGV4KG5JbmRleCkNCisgICAgLCBtX3BCbG9jayhwQmxvY2spDQorew0KKyAgICBGWFNZU19hc3NlcnQocEJsb2NrKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRGaWVsZDo6SW5zZXJ0KEZYX0lOVDMyIG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAmbkNhcmV0LCBGWF9CT09MICZiQmVmb3JlKQ0KK3sNCisgICAgRlhfSU5UMzIgbkZpZWxkTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBuSW5uZXJJbmRleAk9IG5JbmRleCAtIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICAgIGlmIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpIHsNCisgICAgICAgIG5Jbm5lckluZGV4IC09IChtX25MZW5ndGggLSBuRmllbGRMZW5ndGgpOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChuSW5uZXJJbmRleCA+PSAwICYmIG5Jbm5lckluZGV4IDw9IG5GaWVsZExlbmd0aCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcCA9IG1fd3NGaWVsZDsNCisgICAgRlhfSU5UMzIgbkluc0xlbmd0aCA9IHdzSW5zLkdldExlbmd0aCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkluc0xlbmd0aDsgaSArKywgbklubmVySW5kZXggKyspIHsNCisgICAgICAgIHdzVGVtcC5JbnNlcnQobklubmVySW5kZXgsIHdzSW5zW2ldKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgICAgc3dpdGNoIChuUmV0KSB7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMOw0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfSU5WQUxJREFURToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURTsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TOg0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX3dzRmllbGQJPSB3c1RlbXA7DQorICAgIG5DYXJldAkJPSBuSW5kZXggKyAoKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyAtbkluc0xlbmd0aCA6IG5JbnNMZW5ndGgpOw0KKyAgICBiQmVmb3JlCQk9IFRSVUU7DQorICAgIHJldHVybiAobkZpZWxkTGVuZ3RoICsgbkluc0xlbmd0aCA8IG1fbkxlbmd0aCkgPyBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19OT1JNQUwgOiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19GVUxMOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEZpZWxkOjpEZWxldGUoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nICZ3c0RlbCwgRlhfSU5UMzIgJm5DYXJldCwgRlhfQk9PTCAmYkJlZm9yZSkNCit7DQorICAgIEZYX0lOVDMyIG5GaWVsZExlbmd0aAk9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgbklubmVySW5kZXgJPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgICBpZiAobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgICAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCisgICAgfQ0KKyAgICBpZiAobklubmVySW5kZXggPCAwIHx8IChuSW5uZXJJbmRleCArIG5Db3VudCkgPiBuRmllbGRMZW5ndGgpIHsNCisgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXAgPSBtX3dzRmllbGQ7DQorICAgIHdzVGVtcC5EZWxldGUobklubmVySW5kZXgsIG5Db3VudCk7DQorICAgIEZYX0lOVDMyIG5SZXQgPSBWYWxpZGF0ZSh3c1RlbXApOw0KKyAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZOw0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfSU5WQUxJREFURToNCisgICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURTsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TOg0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9MUFdTVFIgbHBCdWYgPSB3c0RlbC5HZXRCdWZmZXIobkNvdW50KTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmLCBGWF9MUENXU1RSKG1fd3NGaWVsZCkgKyBuSW5uZXJJbmRleCwgbkNvdW50ICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIHdzRGVsLlJlbGVhc2VCdWZmZXIobkNvdW50KTsNCisgICAgbV93c0ZpZWxkCT0gd3NUZW1wOw0KKyAgICBuQ2FyZXQJCT0gbkluZGV4ICsgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyBuQ291bnQgOiAwOw0KKyAgICBiQmVmb3JlCQk9IFRSVUU7DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRGaWVsZDo6UmVwbGFjZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyIG5Db3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLCBGWF9JTlQzMiAmbkNhcmV0LCBGWF9CT09MICZiQmVmb3JlKQ0KK3sNCisgICAgRlhfSU5UMzIJCW5Jbm5lckluZGV4CQk9IG5JbmRleCAtIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICAgIEZYX0lOVDMyCQluSW5zTGVuZ3RoCQk9IHdzSW5zLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMgkJbkZpZWxkTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwl3c1RlbXAJCQk9IG1fd3NGaWVsZDsNCisgICAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KKyAgICAgICAgbklubmVySW5kZXggLT0gKG1fbkxlbmd0aCAtIG5GaWVsZExlbmd0aCk7DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KG5Jbm5lckluZGV4ID49IDAgJiYgbklubmVySW5kZXggPD0gbkZpZWxkTGVuZ3RoKTsNCisgICAgaWYgKG5Jbm5lckluZGV4ICsgbkNvdW50ID4gbkZpZWxkTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd3NUZW1wLkRlbGV0ZShuSW5uZXJJbmRleCwgbkNvdW50KTsNCisgICAgRlhfSU5UMzIgbklubmVySW5kZXhCSyA9IG5Jbm5lckluZGV4Ow0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkluc0xlbmd0aDsgaSArKywgbklubmVySW5kZXggKyspIHsNCisgICAgICAgIHdzVGVtcC5JbnNlcnQobklubmVySW5kZXgsIHdzSW5zW2ldKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgICAgc3dpdGNoKG5SZXQpIHsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw6DQorICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEw7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOg0KKyAgICAgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9MUFdTVFIJbHBCdWZmZXIgPSB3c0RlbC5HZXRCdWZmZXIobkNvdW50KTsNCisgICAgRlhfTFBDV1NUUglscFNyY0J1ZiA9IEZYX0xQQ1dTVFIobV93c0ZpZWxkKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBscFNyY0J1ZiArIG5Jbm5lckluZGV4QkssIG5Db3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICB3c0RlbC5SZWxlYXNlQnVmZmVyKG5Db3VudCk7DQorICAgIG1fd3NGaWVsZAk9IHdzVGVtcDsNCisgICAgbkNhcmV0CQk9IG5JbmRleCArICgobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSA/IChuQ291bnQgLSBuSW5zTGVuZ3RoKSA6IChuSW5zTGVuZ3RoKSk7DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19OT1JNQUw7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRGlzcGxheSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGQ7DQorICAgIEdldE5vcm1hbGl6ZWRGaWVsZFRleHQod3NGaWVsZCk7DQorICAgIEZYX0lOVDMyIG5MZW5ndGgJPSB3c0ZpZWxkLkdldExlbmd0aCgpICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCisgICAgRlhfTFBXU1RSIGxwQnVmZmVyCT0gd3NEaXNwbGF5LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgbHBCdWZmZXJbMF0JCQkJPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTjsNCisgICAgbHBCdWZmZXJbbkxlbmd0aCAtIDFdCT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICAgIEZYX0RXT1JEIG5BZGRyZXNzID0gKEZYX0RXT1JEKXRoaXM7DQorICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDEsICZuQWRkcmVzcywgc2l6ZW9mKEZYX0RXT1JEKSk7DQorICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDMsIEZYX0xQQ1dTVFIod3NGaWVsZCksIChuTGVuZ3RoIC0gNCkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgd3NEaXNwbGF5LlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RmllbGQ6OkdldERpc3BsYXlMZW5ndGgoKQ0KK3sNCisgICAgcmV0dXJuIChtX2JSZXNlcnZlU3BhY2UgPyBtX25MZW5ndGggOiBtX3dzRmllbGQuR2V0TGVuZ3RoKCkpICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQpDQorew0KKyAgICB3c0ZpZWxkID0gbV93c0ZpZWxkOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEZpZWxkOjpHZXRGaWVsZFRleHRMZW5ndGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0UmVhbEluZGV4KEZYX0lOVDMyIG5JbmRleCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIG5Jbm5lckluZGV4CT0gbkluZGV4IC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCisgICAgaWYgKG5Jbm5lckluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkZpZWxkTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBpZiAobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgICAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCisgICAgfQ0KKyAgICBpZiAobklubmVySW5kZXggPCAwKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAobklubmVySW5kZXggPj0gbkZpZWxkTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gbkZpZWxkTGVuZ3RoOw0KKyAgICB9DQorICAgIHJldHVybiBuSW5uZXJJbmRleCArIDE7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RmllbGQ6Ok5vcm1hbGl6ZUNhcmV0UG9zKEZYX0lOVDMyIG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbiApIGNvbnN0DQorew0KKyAgICBuSW5kZXggLT0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCisgICAgRlhfSU5UMzIgbkxlbmd0aCA9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgICAgaWYgKG1fYlJlc2VydmVTcGFjZSkgew0KKyAgICAgICAgRlhfSU5UMzIgbkZpZWxkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKG1fYkxlZnRBbGlnbm1lbnQpIHsNCisgICAgICAgICAgICBpZiAobkluZGV4ID4gbkZpZWxkTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgIGlmIChlRGlyZWN0aW9uID09IEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5JbmRleCA9IG5GaWVsZExlbmd0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5SZXNlcnZlTGVuZ3RoID0gbV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoOw0KKyAgICAgICAgICAgIGlmIChuSW5kZXggPCBuUmVzZXJ2ZUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBpZiAoZURpcmVjdGlvbiA9PSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbkluZGV4ID0gblJlc2VydmVMZW5ndGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBuSW5kZXggKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RmllbGQ6OkdldEVkaXRhYmxlUmFuZ2UoRlhfSU5UMzIgJm5CZ24sIEZYX0lOVDMyICZuRW5kKSBjb25zdA0KK3sNCisgICAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KKyAgICAgICAgbkVuZCA9IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUgKyBtX25MZW5ndGg7DQorICAgICAgICBuQmduID0gbkVuZCAtIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG5CZ24gPSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgICAgICAgbkVuZCA9IG5CZ24gKyBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6QmFja3VwKCkNCit7DQorICAgIG1fd3NCYWNrdXAgPSBtX3dzRmllbGQ7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6UmVzdG9yZSgpDQorew0KKyAgICBtX3dzRmllbGQgPSBtX3dzQmFja3VwOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEZpZWxkOjpWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHdzVGV4dCkgY29uc3QNCit7DQorICAgIGlmIChtX25MZW5ndGggPCAwKSB7DQorICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX1M7DQorICAgIH0NCisgICAgcmV0dXJuIHdzVGV4dC5HZXRMZW5ndGgoKSA8PSBtX25MZW5ndGggPyBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1MgOiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKSBjb25zdA0KK3sNCisgICAgd3NGaWVsZCA9IG1fd3NGaWVsZDsNCisgICAgaWYgKG1fbkxlbmd0aCA9PSAtMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX2JSZXNlcnZlU3BhY2UpIHsNCisgICAgICAgIEZYX0lOVDMyIG5GaWVsZAk9IHdzRmllbGQuR2V0TGVuZ3RoKCk7DQorICAgICAgICBGWF9JTlQzMiBuRmlsbAk9IG1fbkxlbmd0aCAtIG5GaWVsZDsNCisgICAgICAgIGlmIChtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgICAgICAgICAgd2hpbGUgKG5GaWxsIC0tKSB7DQorICAgICAgICAgICAgICAgIHdzRmllbGQuSW5zZXJ0KG5GaWVsZCsrLCBtX3djRmlsbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3aGlsZSAobkZpbGwgLS0pIHsNCisgICAgICAgICAgICAgICAgd3NGaWVsZC5JbnNlcnQoMCwgbV93Y0ZpbGwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCitDRkRFX1R4dEVkdEZpZWxkX0ludGVnZXI6OkNGREVfVHh0RWR0RmllbGRfSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCwgRlhfSU5UMzIgbkluZGV4LCBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrKQ0KKyAgICA6IG1fYlNpZ24oRkFMU0UpDQorICAgICwgQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykNCit7DQorICAgIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIgRm9ybWF0UGFyc2VyOw0KKyAgICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdza2V5Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgICAgIGlmICh3c2tleS5FcXVhbChMIkxlbmd0aCIpKSB7DQorICAgICAgICAgICAgbV9uTGVuZ3RoID0gd3NWYWwuR2V0SW50ZWdlcigpOw0KKyAgICAgICAgfSBlbHNlIGlmICh3c2tleS5FcXVhbChMIlNpZ24iKSkgew0KKyAgICAgICAgICAgIG1fYlNpZ24gPSB3c1ZhbC5HZXRJbnRlZ2VyKCkgIT0gMDsNCisgICAgICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJGaWxsQ2hhciIpKSB7DQorICAgICAgICAgICAgbV93Y0ZpbGwgPSB3c1ZhbFswXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NrZXkuRW1wdHkoKTsNCisgICAgICAgIHdzVmFsLkVtcHR5KCk7DQorICAgIH0NCisgICAgaWYgKG1fbkxlbmd0aCA9PSAtMSkgew0KKyAgICAgICAgbV9iUmVzZXJ2ZVNwYWNlID0gRkFMU0U7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyOjpWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaQk9IDA7DQorICAgIGlmIChtX2JTaWduKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSB3c1RleHRbMF07DQorICAgICAgICBpZiAoRkRFX1RYVEVEVF9JU1NJR04od2NUZW1wKSkgew0KKyAgICAgICAgICAgIGkgKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgaWYgKG1fbkxlbmd0aCA+IDApIHsNCisgICAgICAgIGlmIChuTGVuZ3RoIC0gaSA+IChtX25MZW5ndGggLSAobV9iU2lnbiA/IDEgOiAwKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yICg7IGkgPCBuTGVuZ3RoOyBpICsrKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSB3c1RleHRbaV07DQorICAgICAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUzsNCit9DQorQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdDo6Q0ZERV9UeHRFZHRGaWVsZF9GbG9hdChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCwgRlhfSU5UMzIgbkluZGV4LCBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrKQ0KKyAgICA6IENGREVfVHh0RWR0RmllbGQobkluZGV4LCBwQmxvY2spDQorICAgICwgbV9iU2lnbmVkKEZBTFNFKQ0KKyAgICAsIG1fbkludFBhcnRsZW5ndGgoLTEpDQorICAgICwgbV9uRGVjUGFydExlbmd0aCgtMSkNCit7DQorICAgIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIgRm9ybWF0UGFyc2VyOw0KKyAgICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdza2V5Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgICAgIGlmICh3c2tleS5FcXVhbChMIkRlY0xlbmd0aCIpKSB7DQorICAgICAgICAgICAgbV9uRGVjUGFydExlbmd0aCA9IHdzVmFsLkdldEludGVnZXIoKTsNCisgICAgICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJJbnRMZW5ndGgiKSkgew0KKyAgICAgICAgICAgIG1fbkludFBhcnRsZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgICAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiU2lnbiIpKSB7DQorICAgICAgICAgICAgbV9iU2lnbmVkID0gd3NWYWwuR2V0SW50ZWdlcigpICE9IDA7DQorICAgICAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiRmlsbENoYXIiKSkgew0KKyAgICAgICAgICAgIG1fd2NGaWxsID0gd3NWYWxbMF07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX25JbnRQYXJ0bGVuZ3RoID09IC0xIHx8IG1fbkRlY1BhcnRMZW5ndGggPT0gLTEpIHsNCisgICAgICAgICAgICBtX25MZW5ndGggPSAtMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9uTGVuZ3RoID0gbV9uSW50UGFydGxlbmd0aCArIG1fbkRlY1BhcnRMZW5ndGggKyAxICsgKG1fYlNpZ25lZCA/IDEgOiAwKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fYlJlc2VydmVTcGFjZSA9IFRSVUU7DQorICAgICAgICB3c2tleS5FbXB0eSgpOw0KKyAgICAgICAgd3NWYWwuRW1wdHkoKTsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEZpZWxkX0Zsb2F0OjpWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHdzVGV4dCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIG5MZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChtX25MZW5ndGggIT0gLTEgJiYgKG5MZW5ndGggPiBtX25MZW5ndGgpKSB7DQorICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUiBscEJ1ZiA9IEZYX0xQQ1dTVFIod3NUZXh0KTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGlmIChtX2JTaWduZWQpIHsNCisgICAgICAgIEZYX1dDSEFSIHdjVGVtcCA9IGxwQnVmWzBdOw0KKyAgICAgICAgaWYgKEZERV9UWFRFRFRfSVNTSUdOKHdjVGVtcCkpIHsNCisgICAgICAgICAgICBpICsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5JbnRQYXJ0CT0gMDsNCisgICAgRlhfSU5UMzIgblBvaW50CQk9IDA7DQorICAgIGZvciAoOyBpIDwgbkxlbmd0aDsgaSArKykgew0KKyAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gbHBCdWZbaV07DQorICAgICAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCisgICAgICAgICAgICBpZiAod2NUZW1wICE9IEwnLicpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBuUG9pbnQgPSAxOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkludFBhcnQgKys7DQorICAgIH0NCisgICAgaWYgKG1fbkludFBhcnRsZW5ndGggIT0gLTEgJiYgKG5JbnRQYXJ0ID4gbV9uSW50UGFydGxlbmd0aCkpIHsNCisgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9uRGVjUGFydExlbmd0aCAhPSAtMSAmJiAobkxlbmd0aCAtIG5JbnRQYXJ0IC0gblBvaW50ID4gbV9uRGVjUGFydExlbmd0aCkpIHsNCisgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCisgICAgfQ0KKyAgICBpICsrOw0KKyAgICBmb3IgKDsgaSA8IG5MZW5ndGg7IGkgKyspIHsNCisgICAgICAgIEZYX1dDSEFSIHdjVGVtcCA9IGxwQnVmW2ldOw0KKyAgICAgICAgaWYgKCFGREVfVFhURURUX0lTSU5URUdFUih3Y1RlbXApKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1M7DQorfQ0KK0NGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQ6OkNGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQsIEZYX0lOVDMyIG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jaykNCisgICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKQ0KKyAgICAsIG1fd2NBbGlhcyhMJyonKQ0KK3sNCisgICAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQorICAgIEZvcm1hdFBhcnNlci5QYXJzZSh3c0ZpZWxkKTsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gRm9ybWF0UGFyc2VyLkNvdW50SXRlbXMoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NrZXk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBGb3JtYXRQYXJzZXIuR2V0SXRlbShpLCB3c2tleSwgd3NWYWwpOw0KKyAgICAgICAgaWYgKHdza2V5LkVxdWFsKEwiTGVuZ3RoIikpIHsNCisgICAgICAgICAgICBtX25MZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgICAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiQWxpYXNDaGFyIikpIHsNCisgICAgICAgICAgICBtX3djQWxpYXMgPSB3c1ZhbFswXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NrZXkuRW1wdHkoKTsNCisgICAgICAgIHdzVmFsLkVtcHR5KCk7DQorICAgIH0NCisgICAgaWYgKG1fbkxlbmd0aCA9PSAtMSkgew0KKyAgICAgICAgbV9iUmVzZXJ2ZVNwYWNlID0gRkFMU0U7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkOjpHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgbkZpbGVkTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoCQk9IG1fYlJlc2VydmVTcGFjZSA/IG1fbkxlbmd0aCA6IG5GaWxlZExlbmd0aDsNCisgICAgRlhfTFBXU1RSIGxwQnVmCQkJPSB3c0ZpZWxkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgRlhfSU5UMzIgblNwYWNlTGVuZ3RoCT0gbkxlbmd0aCAtIG5GaWxlZExlbmd0aDsNCisgICAgRlhfSU5UMzIgbkZpcnN0UGFydAkJPSBtX2JMZWZ0QWxpZ25tZW50ID8gbkZpbGVkTGVuZ3RoIDogblNwYWNlTGVuZ3RoOw0KKyAgICBGWF9XQ0hBUiB3Rmlyc3RDaGFyCQk9IG1fYkxlZnRBbGlnbm1lbnQgPyBtX3djQWxpYXMgOiBMJyAnOw0KKyAgICBGWF9XQ0hBUiB3U2Vjb25kQ2hhcgk9IG1fYkxlZnRBbGlnbm1lbnQgPyBMJyAnIDogbV93Y0FsaWFzOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yICg7IGkgPCBuRmlyc3RQYXJ0OyBpICsrKSB7DQorICAgICAgICBscEJ1ZltpXSA9IHdGaXJzdENoYXI7DQorICAgIH0NCisgICAgZm9yICg7IGkgPCBuTGVuZ3RoOyBpICsrKSB7DQorICAgICAgICBscEJ1ZltpXSA9IHdTZWNvbmRDaGFyOw0KKyAgICB9DQorICAgIHdzRmllbGQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCit9DQorQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmc6OkNGREVfVHh0RWR0RmllbGRfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBGWF9JTlQzMiBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spDQorICAgIDogQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykNCit7DQorICAgIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIgRm9ybWF0UGFyc2VyOw0KKyAgICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdza2V5Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgICAgIGlmICh3c2tleS5FcXVhbChMIkxlbmd0aCIpKSB7DQorICAgICAgICAgICAgbV9uTGVuZ3RoID0gd3NWYWwuR2V0SW50ZWdlcigpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgICAgICB9DQorICAgICAgICB3c2tleS5FbXB0eSgpOw0KKyAgICAgICAgd3NWYWwuRW1wdHkoKTsNCisgICAgfQ0KK30NCitDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOjpDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBGWF9JTlQzMiBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spDQorICAgIDogQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykNCit7DQorICAgIG1fd3NGaWVsZCA9IHdzRmllbGQ7DQorICAgIG1fbkxlbmd0aCA9IHdzRmllbGQuR2V0TGVuZ3RoKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZF9GaXhlZDo6R2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRGlzcGxheSkNCit7DQorICAgIEZYX0lOVDMyIG5MZW5ndGgJPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCkgKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX1RBSUxTSVpFOw0KKyAgICBGWF9MUFdTVFIgbHBCdWZmZXIJPSB3c0Rpc3BsYXkuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgICBscEJ1ZmZlclswXQkJCQk9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KKyAgICBscEJ1ZmZlcltuTGVuZ3RoIC0gMV0JPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORDsNCisgICAgRlhfRFdPUkQgbkFkZHJlc3MgPSAoRlhfRFdPUkQpdGhpczsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgMSwgJm5BZGRyZXNzLCBzaXplb2YoRlhfRFdPUkQpKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgMywgRlhfTFBDV1NUUihtX3dzRmllbGQpLCAobkxlbmd0aCAtIDQpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIHdzRGlzcGxheS5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOjpOb3JtYWxpemVDYXJldFBvcyhGWF9JTlQzMiBuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfRElSRUNUSU9OIGVEaXJlY3Rpb24gKSBjb25zdA0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwICYmIG5JbmRleCA8PSBtX25MZW5ndGgpOw0KKyAgICBpZiAoZURpcmVjdGlvbiA9PSBGREVfRk9STUFUX0NBUkVUX01JRERMRSkgew0KKyAgICAgICAgcmV0dXJuIChuSW5kZXggPiBtX3dzRmllbGQuR2V0TGVuZ3RoKCkgLyAyKSA/IC0xIDogLTI7DQorICAgIH0NCisgICAgcmV0dXJuIGVEaXJlY3Rpb24gPT0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCA/IC0yIDogLTE7DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWVlNzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5oCkBAIC0wLDAgKzEsMjI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9UWFRFRFRCTE9DS19IDQorI2RlZmluZSBfRkRFX1RYVEVEVEJMT0NLX0gNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorY2xhc3MgQ0ZERV9UeHRFZHRFbmdpbmU7DQorY2xhc3MgQ0ZERV9UeHRFZHRCbG9jazsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOw0KK2NsYXNzIENGREVfVHh0RWR0RmllbGQ7DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyOw0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfRmxvYXQ7DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZDsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1N0cmluZzsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOw0KKyNkZWZpbmUgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSAzDQorI2RlZmluZSBGREVfRk9STUFUX0VESVRfRklFTERfVEFJTFNJWkUJMQ0KK2VudW0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUIHsNCisgICAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMID0gMCwNCisgICAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTAkJLA0KKyAgICBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMCQksDQorICAgIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEUsDQorfTsNCitlbnVtIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVCB7DQorICAgIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TCQkJPSAwCSwNCisgICAgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURQksDQorICAgIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZCQksDQorfTsNCitlbnVtIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUkVUIHsNCisgICAgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TCQkJPSAwCSwNCisgICAgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEwJCSwNCisgICAgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEUJLA0KK307DQorZW51bSBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiB7DQorICAgIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCwNCisgICAgRkRFX0ZPUk1BVF9DQVJFVF9NSURETEUsDQorICAgIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0QmxvY2sgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfVHh0RWR0QmxvY2soQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NCbG9jaywgRlhfSU5UMzIgblBvc2l0aW9uKTsNCisgICAgfkNGREVfVHh0RWR0QmxvY2soKTsNCisgICAgdm9pZAkJR2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRGlzcGxheSk7DQorICAgIEZYX0lOVDMyCUdldExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2b2lkCQlHZXRCbG9ja1RleHQoQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2spOw0KKyAgICBGWF9JTlQzMglDb3VudEZpZWxkKCkgY29uc3Q7DQorICAgIHZvaWQJCUdldEZpZWxkVGV4dChGWF9JTlQzMiBuSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKTsNCisgICAgRlhfSU5UMzIJR2V0RmllbGRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorDQorICAgIEZYX0lOVDMyCUdldFBvcygpIGNvbnN0Ow0KKyAgICB2b2lkCQlHZXRSZWFsVGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdDsNCisgICAgdm9pZAkJQmFja3VwKCk7DQorICAgIHZvaWQJCVJlc3RvcmUoKTsNCisgICAgdm9pZAkJU2V0SW5kZXgoRlhfSU5UMzIgbkluZGV4KQ0KKyAgICB7DQorICAgICAgICBtX25JbmRleCA9IG5JbmRleDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglHZXRJbmRleCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX25JbmRleDsNCisgICAgfQ0KK3ByaXZhdGU6DQorICAgIENGREVfVHh0RWR0RW5naW5lICogbV9wRW5naW5lOw0KKyAgICBGWF9JTlQzMiBtX25EaXNwbGF5TGVuZ3RoOw0KKyAgICBGWF9JTlQzMiBtX25JbmRleDsNCisNCisgICAgRlhfSU5UMzIJbV9uUG9zaXRpb247DQorICAgIENGWF9BcnJheVRlbXBsYXRlPENGREVfVHh0RWR0RmllbGQqPiBtX0ZpZWxkQXJyOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDRkRFX1R4dEVkdEZpZWxkKj4gbV9FZGl0RmllbGRBcnI7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCk7DQorICAgIH5DRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCk7DQorICAgIEZYX0JPT0wJCVBhcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCk7DQorICAgIEZYX0lOVDMyCUNvdW50SXRlbXMoKSBjb25zdDsNCisgICAgdm9pZAkJR2V0SXRlbShGWF9JTlQzMiBuSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0tleSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0Ow0KK3ByaXZhdGU6DQorICAgIHR5cGVkZWYgc3RydWN0IDogcHVibGljIENGWF9PYmplY3Qgew0KKyAgICAgICAgRlhfSU5UMzIgbktleVN0YXJ0Ow0KKyAgICAgICAgRlhfSU5UMzIgbktleUNvdW50Ow0KKyAgICAgICAgRlhfSU5UMzIgblZhbFN0YXJ0Ow0KKyAgICAgICAgRlhfSU5UMzIgblZhbENvdW50Ow0KKyAgICB9IEZERV9UWFRFRFRGT1JNQVRJVEVNLCAqIEZERV9MUFRYVEVEVEZPUk1BVElURU07DQorDQorICAgIENGWF9XaWRlU3RyaW5nIG1fd3NGb3JtYXQ7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPEZERV9MUFRYVEVEVEZPUk1BVElURU0+IG1fSXRlbUFycjsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RmllbGQgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBDRkRFX1R4dEVkdEZpZWxkICogQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBGWF9JTlQzMiBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglJbnNlcnQoCUZYX0lOVDMyIG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgJm5DYXJldCwgRlhfQk9PTCAmYkJlZm9yZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJRGVsZXRlKAlGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyIG5Db3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nICZ3c0RlbCwgRlhfSU5UMzIgJm5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJCZWZvcmUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCVJlcGxhY2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsIENGWF9XaWRlU3RyaW5nICZ3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0Rpc3BsYXkpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldERpc3BsYXlMZW5ndGgoKTsNCisgICAgdmlydHVhbCB2b2lkCQlHZXRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldFJlYWxJbmRleChGWF9JTlQzMiBuSW5kZXgpIGNvbnN0Ow0KKw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU5vcm1hbGl6ZUNhcmV0UG9zKAlGWF9JTlQzMiBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiBlRGlyZWN0aW9uID0gRkRFX0ZPUk1BVF9DQVJFVF9NSURETEUpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEVkaXRhYmxlUmFuZ2UoRlhfSU5UMzIgJm5CZ24sIEZYX0lOVDMyICZuRW5kKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQlCYWNrdXAoKTsNCisgICAgdmlydHVhbCB2b2lkCQlSZXN0b3JlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNGaXgoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdm9pZAkJCQlTZXRJbmRleChGWF9JTlQzMiBuSW5kZXgpDQorICAgIHsNCisgICAgICAgIG1fbkluZGV4ID0gbkluZGV4Ow0KKyAgICB9DQorICAgIEZYX0lOVDMyCQkJR2V0SW5kZXgoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9uSW5kZXg7DQorICAgIH0NCisgICAgRlhfSU5UMzIJCQlHZXRCbG9ja0luZGV4KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEJsb2NrLT5HZXRJbmRleCgpOw0KKyAgICB9DQorcHJvdGVjdGVkOg0KKyAgICBDRkRFX1R4dEVkdEZpZWxkKEZYX0lOVDMyIG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQorICAgIHZpcnR1YWwJCQkJfkNGREVfVHh0RWR0RmllbGQoKSB7fQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCVZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgd3NUZXh0KSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQlHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCW1fbkxlbmd0aDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c0ZpZWxkOw0KKyAgICBDRlhfV2lkZVN0cmluZwltX3dzQmFja3VwOw0KKyAgICBGWF9XQ0hBUgkJbV93Y0ZpbGw7DQorICAgIEZYX0JPT0wJCQkJbV9iUmVzZXJ2ZVNwYWNlOw0KKyAgICBGWF9CT09MCQkJCW1fYkxlZnRBbGlnbm1lbnQ7DQorICAgIEZYX0lOVDMyCQkJbV9uSW5kZXg7DQorICAgIENGREVfVHh0RWR0QmxvY2sgKgltX3BCbG9jazsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfSW50ZWdlciA6IHB1YmxpYyBDRkRFX1R4dEVkdEZpZWxkDQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBGWF9JTlQzMiBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spOw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKCkge30NCisgICAgdmlydHVhbCBGWF9JTlQzMglWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdDsNCitwcml2YXRlOg0KKyAgICBGWF9CT09MCW1fYlNpZ247DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0Zsb2F0IDogcHVibGljIENGREVfVHh0RWR0RmllbGQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdEZpZWxkX0Zsb2F0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBGWF9JTlQzMiBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spOw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9GbG9hdCgpIHt9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJVmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB3c1RleHQpIGNvbnN0Ow0KK3ByaXZhdGU6DQorICAgIEZYX0JPT0wJCW1fYlNpZ25lZDsNCisgICAgRlhfSU5UMzIJbV9uSW50UGFydGxlbmd0aDsNCisgICAgRlhfSU5UMzIJbV9uRGVjUGFydExlbmd0aDsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQsIEZYX0lOVDMyIG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQorDQorcHJvdGVjdGVkOg0KKyAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkKCkge30NCisgICAgdmlydHVhbCB2b2lkCQlHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKSBjb25zdDsNCitwcml2YXRlOg0KKyAgICBGWF9XQ0hBUgltX3djQWxpYXM7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1N0cmluZyA6IHB1YmxpYyBDRkRFX1R4dEVkdEZpZWxkDQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQsIEZYX0lOVDMyIG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQorcHJvdGVjdGVkOg0KKyAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEZpZWxkX1N0cmluZygpIHt9DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkIDogcHVibGljIENGREVfVHh0RWR0RmllbGQNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBGWF9JTlQzMiBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUluc2VydCgJRlhfSU5UMzIgbkluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAmbkNhcmV0LCBGWF9CT09MICZiQmVmb3JlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMglEZWxldGUoCUZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgbkNvdW50LCBDRlhfV2lkZVN0cmluZyAmd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAmbkNhcmV0LCBGWF9CT09MICZiQmVmb3JlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMglSZXBsYWNlKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgbkNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyAmd3NEZWwsIEZYX0lOVDMyICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0Rpc3BsYXkpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU5vcm1hbGl6ZUNhcmV0UG9zKAlGWF9JTlQzMiBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiBlRGlyZWN0aW9uICkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RWRpdGFibGVSYW5nZShGWF9JTlQzMiAmbkJnbiwgRlhfSU5UMzIgJm5FbmQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCUJhY2t1cCgpIHt9DQorICAgIHZpcnR1YWwgdm9pZAkJUmVzdG9yZSgpIHt9DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNGaXgoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9GaXhlZCgpIHt9DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuY3BwIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNiMGM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmNwcApAQCAtMCwwICsxLDQ0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRidWYuaCINCisjZGVmaW5lIEZERV9ERUZDSFVOS0NPVU5UCTINCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOCQkweEZGRjkNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5ECQkweEZGRkINCisjZGVmaW5lIEZERV9UWFRFRFRfWkVST1dJRFRIU1BBQ0UJCTB4MjAwQg0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCitDRkRFX1R4dEVkdEJ1Zkl0ZXI6OkNGREVfVHh0RWR0QnVmSXRlcihDRkRFX1R4dEVkdEJ1ZiAqIHBCdWYsIEZYX0JPT0wgYkZvckRpc3BsYXkgKQ0KKyNlbHNlDQorQ0ZERV9UeHRFZHRCdWZJdGVyOjpDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYgKiBwQnVmLCBGWF9XQ0hBUiB3Y0FsaWFzICkNCisjZW5kaWYNCisgICAgOiBtX25DdXJDaHVuaygwKQ0KKyAgICAsIG1fbkN1ckluZGV4KDApDQorICAgICwgbV9uSW5kZXgoMCkNCisgICAgLCBtX3BCdWYocEJ1ZikNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgICwgbV9iRm9yRGlzcGxheShiRm9yRGlzcGxheSkNCisgICAgLCBtX25BbGlhc0NvdW50KDApDQorI2VuZGlmDQorICAgICwgbV9iSW5GaWVsZChGQUxTRSkNCisgICAgLCBtX0FsaWFzKHdjQWxpYXMpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wQnVmKTsNCit9DQorQ0ZERV9UeHRFZHRCdWZJdGVyOjp+Q0ZERV9UeHRFZHRCdWZJdGVyKCkNCit7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWZJdGVyOjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0QnVmSXRlcjo6TmV4dChGWF9CT09MIGJQcmV2ICkNCit7DQorICAgIGlmIChiUHJldikgew0KKyAgICAgICAgaWYgKG1fbkluZGV4ID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPCBtX3BCdWYtPm1fQ2h1bmtzLkdldFNpemUoKSk7DQorICAgICAgICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IE5VTEw7DQorICAgICAgICBpZiAobV9uQ3VySW5kZXggPiAwKSB7DQorICAgICAgICAgICAgbV9uQ3VySW5kZXggLS07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdoaWxlIChtX25DdXJDaHVuayA+IDApIHsNCisgICAgICAgICAgICAgICAgLS1tX25DdXJDaHVuazsNCisgICAgICAgICAgICAgICAgbHBDaHVuayA9IChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua107DQorICAgICAgICAgICAgICAgIGlmIChscENodW5rLT5uVXNlZCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fbkN1ckluZGV4ID0gbHBDaHVuay0+blVzZWQgLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPj0gMCk7DQorICAgICAgICBtX25JbmRleCAtLTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fbkluZGV4ID49IChtX3BCdWYtPm1fblRvdGFsIC0gMSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPCBtX3BCdWYtPm1fQ2h1bmtzLkdldFNpemUoKSk7DQorICAgICAgICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IFwNCisgICAgICAgICAgICAgICAgKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXTsNCisgICAgICAgIGlmIChscENodW5rLT5uVXNlZCAhPSAobV9uQ3VySW5kZXggKyAxKSkgew0KKyAgICAgICAgICAgIG1fbkN1ckluZGV4ICsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBuRW5kID0gbV9wQnVmLT5tX0NodW5rcy5HZXRTaXplKCkgLSAxOw0KKyAgICAgICAgICAgIHdoaWxlIChtX25DdXJDaHVuayA8IG5FbmQpIHsNCisgICAgICAgICAgICAgICAgbV9uQ3VyQ2h1bmsgKys7DQorICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiBscENodW5rVGVtcCA9IFwNCisgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSKW1fcEJ1Zi0+bV9DaHVua3NbbV9uQ3VyQ2h1bmtdOw0KKyAgICAgICAgICAgICAgICBpZiAobHBDaHVua1RlbXAtPm5Vc2VkID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9uQ3VySW5kZXggPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX25JbmRleCArKzsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWZJdGVyOjpTZXRBdChGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQorICAgIENGREVfVHh0RWR0QnVmOjpGREVfQ0hVTktQTEFDRSBjcDsNCisgICAgbV9wQnVmLT5JbmRleDJDUChuSW5kZXgsIGNwKTsNCisgICAgbV9uSW5kZXgJPSBuSW5kZXg7DQorICAgIG1fbkN1ckNodW5rID0gY3AubkNodW5rSW5kZXg7DQorICAgIG1fbkN1ckluZGV4CT0gY3AubkNoYXJJbmRleDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRCdWZJdGVyOjpHZXRBdCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9uSW5kZXg7DQorfQ0KK0ZYX1dDSEFSIENGREVfVHh0RWR0QnVmSXRlcjo6R2V0Q2hhcigpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9uSW5kZXggPj0gMCAmJiBtX25JbmRleCA8IG1fcEJ1Zi0+bV9uVG90YWwpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgaWYgKG1fYkZvckRpc3BsYXkpIHsNCisgICAgICAgIGlmIChtX2JJbkZpZWxkKSB7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KG1fbkFsaWFzQ291bnQgPj0gMCAmJiBtX25BbGlhc0NvdW50IDw9IDIpOw0KKyAgICAgICAgICAgIGlmIChtX25BbGlhc0NvdW50ID4gMCkgew0KKyAgICAgICAgICAgICAgICBtX25BbGlhc0NvdW50IC0tOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9aRVJPV0lEVEhTUEFDRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfV0NIQVIgd2MgPSAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSktPndDaGFyc1ttX25DdXJJbmRleF07DQorICAgICAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQorICAgICAgICAgICAgICAgIG1fbkFsaWFzQ291bnQJPSAwOw0KKyAgICAgICAgICAgICAgICBtX2JJbkZpZWxkCQk9IEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gd2M7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdjID0gKChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua10pLT53Q2hhcnNbbV9uQ3VySW5kZXhdOw0KKyAgICAgICAgICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTikgew0KKyAgICAgICAgICAgICAgICBtX25BbGlhc0NvdW50CT0gMjsNCisgICAgICAgICAgICAgICAgbV9iSW5GaWVsZAkJPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gd2M7DQorICAgICAgICB9DQorICAgIH0NCisjZW5kaWYNCisgICAgaWYgKG1fQWxpYXMgPT0gMCB8fCBtX25JbmRleCA9PSAobV9wQnVmLT5tX25Ub3RhbCAtIDEpKSB7DQorICAgICAgICByZXR1cm4gKChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua10pLT53Q2hhcnNbbV9uQ3VySW5kZXhdOw0KKyAgICB9DQorICAgIHJldHVybiBtX0FsaWFzOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0QnVmSXRlcjo6SXNFT0YoRlhfQk9PTCBiVGFpbCApIGNvbnN0DQorew0KKyAgICByZXR1cm4gYlRhaWwgPyBtX25JbmRleCA9PSAobV9wQnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAyKSA6IG1fbkluZGV4ID09IDA7DQorfQ0KK0lGWF9DaGFySXRlciAqIENGREVfVHh0RWR0QnVmSXRlcjo6Q2xvbmUoKQ0KK3sNCisgICAgQ0ZERV9UeHRFZHRCdWZJdGVyICogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKG1fcEJ1Zik7DQorICAgIHBJdGVyLT5tX25DdXJDaHVuawk9IG1fbkN1ckNodW5rOw0KKyAgICBwSXRlci0+bV9uQ3VySW5kZXgJPSBtX25DdXJJbmRleDsNCisgICAgcEl0ZXItPm1fbkluZGV4CQk9IG1fbkluZGV4Ow0KKyAgICBwSXRlci0+bV9BbGlhcwkJPSBtX0FsaWFzOw0KKyAgICByZXR1cm4gcEl0ZXI7DQorfQ0KK0NGREVfVHh0RWR0QnVmOjpDRkRFX1R4dEVkdEJ1ZihGWF9JTlQzMiBuRGVmQ2h1bmtTaXplICkNCisgICAgOiBtX25DaHVua1NpemUobkRlZkNodW5rU2l6ZSkNCisgICAgLCBtX25Ub3RhbCgwKQ0KKyAgICAsIG1fYkNoYW5nZWQoRkFMU0UpDQorICAgICwgbV9wQWxsb2NhdG9yKE5VTEwpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9uQ2h1bmtTaXplKTsNCisgICAgUmVzZXRDaHVua0J1ZmZlcihGREVfREVGQ0hVTktDT1VOVCwgbV9uQ2h1bmtTaXplKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6UmVsZWFzZSgpDQorew0KKyAgICBkZWxldGUgdGhpczsNCit9DQorQ0ZERV9UeHRFZHRCdWY6On5DRkRFX1R4dEVkdEJ1ZigpDQorew0KKyAgICBDbGVhcihUUlVFKTsNCisgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICAgIG1fQ2h1bmtzLlJlbW92ZUFsbCgpOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0QnVmOjpTZXRDaHVua1NpemUoRlhfSU5UMzIgbkNodW5rU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChuQ2h1bmtTaXplKTsNCisgICAgUmVzZXRDaHVua0J1ZmZlcihGREVfREVGQ0hVTktDT1VOVCwgbkNodW5rU2l6ZSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEJ1Zjo6R2V0Q2h1bmtTaXplKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX25DaHVua1NpemU7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0QnVmOjpHZXRUZXh0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX25Ub3RhbDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KCF3c1RleHQuSXNFbXB0eSgpKTsNCisgICAgQ2xlYXIoRkFMU0UpOw0KKyAgICBGWF9JTlQzMiBuVGV4dExlbmd0aAk9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgbk5lZWRDb3VudAkJPSAoKG5UZXh0TGVuZ3RoIC0gMSkgLyBtX25DaHVua1NpemUgKyAxKSAtIG1fQ2h1bmtzLkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuTmVlZENvdW50OyBpICsrKSB7DQorICAgICAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2Moc2l6ZW9mKEZERV9DSFVOS0hFQURFUikgKyBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fbkNodW5rU2l6ZSAtIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICBscENodW5rLT5uVXNlZCA9IDA7DQorICAgICAgICBtX0NodW5rcy5BZGQobHBDaHVuayk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJblRvdGFsQ291bnQJCT0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KKyAgICBGWF9MUENXU1RSCWxwU3JjQnVmCQk9IEZYX0xQQ1dTVFIod3NUZXh0KTsNCisgICAgRlhfSU5UMzIJbkxlYXZlCQkJPSBuVGV4dExlbmd0aDsNCisgICAgRlhfSU5UMzIJbkNvcHllZExlbmd0aAk9IG1fbkNodW5rU2l6ZTsNCisgICAgZm9yIChpID0gMDsgaSA8IG5Ub3RhbENvdW50ICYmIG5MZWF2ZSA+IDA7IGkgKyspIHsNCisgICAgICAgIGlmIChuTGVhdmUgPCBuQ29weWVkTGVuZ3RoKSB7DQorICAgICAgICAgICAgbkNvcHllZExlbmd0aCA9IG5MZWF2ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV07DQorICAgICAgICBGWFNZU19tZW1jcHkobHBDaHVuay0+d0NoYXJzLCBscFNyY0J1ZiwgbkNvcHllZExlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgbkxlYXZlCQkJLT0gbkNvcHllZExlbmd0aDsNCisgICAgICAgIGxwU3JjQnVmCQkrPSBuQ29weWVkTGVuZ3RoOw0KKyAgICAgICAgbHBDaHVuay0+blVzZWQJPSBuQ29weWVkTGVuZ3RoOw0KKyAgICB9DQorICAgIG1fblRvdGFsCT0gblRleHRMZW5ndGg7DQorICAgIG1fYkNoYW5nZWQJPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQorew0KKyAgICBHZXRSYW5nZSh3c1RleHQsIDAsIG1fblRvdGFsKTsNCit9DQorRlhfV0NIQVIgQ0ZERV9UeHRFZHRCdWY6OkdldENoYXJCeUluZGV4KEZYX0lOVDMyIG5JbmRleCkgY29uc3QNCit7DQorICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBHZXRUZXh0TGVuZ3RoKCkpOw0KKyAgICBGREVfTFBDSFVOS0hFQURFUglwQ2h1bmtIZWFkZXIJPSBOVUxMOw0KKyAgICBGWF9JTlQzMgkJCW5Ub3RhbAkJCT0gMDsNCisgICAgRlhfSU5UMzIJCQluQ291bnQJCQk9IG1fQ2h1bmtzLkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIHBDaHVua0hlYWRlciA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCisgICAgICAgIG5Ub3RhbCArPSBwQ2h1bmtIZWFkZXItPm5Vc2VkOw0KKyAgICAgICAgaWYgKG5Ub3RhbCA+IG5JbmRleCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwQ2h1bmtIZWFkZXIpOw0KKyAgICByZXR1cm4gcENodW5rSGVhZGVyLT53Q2hhcnNbcENodW5rSGVhZGVyLT5uVXNlZCAtIChuVG90YWwgLSBuSW5kZXgpXTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6R2V0UmFuZ2UoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgbkJlZ2luLCBGWF9JTlQzMiBuTGVuZ3RoKSBjb25zdA0KK3sNCisgICAgRkRFX0NIVU5LUExBQ0UgY3A7DQorICAgIEluZGV4MkNQKG5CZWdpbiwgY3ApOw0KKyAgICBGWF9JTlQzMgluTGVhdmUJCT0gbkxlbmd0aDsNCisgICAgRlhfSU5UMzIJbkNvdW50CQk9IG1fQ2h1bmtzLkdldFNpemUoKTsNCisgICAgRlhfTFBXU1RSCWxwRHN0QnVmCT0gd3NUZXh0LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgRlhfSU5UMzIJbkNodW5rSW5kZXgJPSBjcC5uQ2h1bmtJbmRleDsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIJbHBDaHVua0hlYWRlcgk9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tuQ2h1bmtJbmRleF07DQorICAgIEZYX0lOVDMyCQkJbkNvcHlMZW5ndGgJCT0gbHBDaHVua0hlYWRlci0+blVzZWQgLSBjcC5uQ2hhckluZGV4Ow0KKyAgICBGWF9MUFdTVFIJCQlscFNyY0J1ZgkJPSBscENodW5rSGVhZGVyLT53Q2hhcnMgKyBjcC5uQ2hhckluZGV4Ow0KKyAgICB3aGlsZSAobkxlYXZlID4gMCkgew0KKyAgICAgICAgaWYgKG5MZWF2ZSA8PSBuQ29weUxlbmd0aCkgew0KKyAgICAgICAgICAgIG5Db3B5TGVuZ3RoID0gbkxlYXZlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1ZiwgbkNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICAgIG5DaHVua0luZGV4ICsrOw0KKyAgICAgICAgaWYgKG5DaHVua0luZGV4ID49IG5Db3VudCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbHBDaHVua0hlYWRlcgk9CShGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tuQ2h1bmtJbmRleF07DQorICAgICAgICBscFNyY0J1ZgkJPQlscENodW5rSGVhZGVyLT53Q2hhcnM7DQorICAgICAgICBuTGVhdmUJCQktPQluQ29weUxlbmd0aDsNCisgICAgICAgIGxwRHN0QnVmCQkrPQluQ29weUxlbmd0aDsNCisgICAgICAgIG5Db3B5TGVuZ3RoCQk9CWxwQ2h1bmtIZWFkZXItPm5Vc2VkOw0KKyAgICB9DQorICAgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6Okluc2VydChGWF9JTlQzMiBuUG9zLCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbmd0aCApDQorew0KKyAgICBGWFNZU19hc3NlcnQoblBvcyA+PSAwICYmIG5Qb3MgPD0gbV9uVG90YWwpOw0KKyAgICBGREVfQ0hVTktQTEFDRSBjcDsNCisgICAgSW5kZXgyQ1AoblBvcywgY3ApOw0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoVGVtcCA9IG5MZW5ndGg7DQorICAgIGlmIChjcC5uQ2hhckluZGV4ICE9IDApIHsNCisgICAgICAgIEZERV9MUENIVU5LSEVBREVSCWxwTmV3Q2h1bmsJPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9wQWxsb2NhdG9yLT5BbGxvYyhzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICAgIEZERV9MUENIVU5LSEVBREVSCWxwQ2h1bmsJCT0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwLm5DaHVua0luZGV4XTsNCisgICAgICAgIEZYX0lOVDMyIG5Db3B5ID0gbHBDaHVuay0+blVzZWQgLSBjcC5uQ2hhckluZGV4Ow0KKyAgICAgICAgRlhTWVNfbWVtY3B5KGxwTmV3Q2h1bmstPndDaGFycywgbHBDaHVuay0+d0NoYXJzICsgY3AubkNoYXJJbmRleCwgbkNvcHkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICAgIGxwQ2h1bmstPm5Vc2VkIC09IG5Db3B5Ow0KKyAgICAgICAgY3AubkNodW5rSW5kZXggKys7DQorICAgICAgICBtX0NodW5rcy5JbnNlcnRBdChjcC5uQ2h1bmtJbmRleCwgbHBOZXdDaHVuayk7DQorICAgICAgICBscE5ld0NodW5rLT5uVXNlZAk9IG5Db3B5Ow0KKyAgICAgICAgY3AubkNoYXJJbmRleAkJPSAwOw0KKyAgICB9DQorICAgIGlmIChjcC5uQ2h1bmtJbmRleCAhPSAwKSB7DQorICAgICAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwLm5DaHVua0luZGV4IC0gMV07DQorICAgICAgICBpZiAobHBDaHVuay0+blVzZWQgIT0gbV9uQ2h1bmtTaXplKSB7DQorICAgICAgICAgICAgY3AubkNodW5rSW5kZXggLS07DQorICAgICAgICAgICAgRlhfSU5UMzIgbkZyZWUgPSBtX25DaHVua1NpemUgLSBscENodW5rLT5uVXNlZDsNCisgICAgICAgICAgICBGWF9JTlQzMiBuQ29weSA9IEZYX01JTihuTGVuZ3RoVGVtcCwgbkZyZWUpOw0KKyAgICAgICAgICAgIEZYU1lTX21lbWNweShscENodW5rLT53Q2hhcnMgKyBscENodW5rLT5uVXNlZCwgbHBUZXh0LCBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgICAgIGxwVGV4dAkJCSs9IG5Db3B5Ow0KKyAgICAgICAgICAgIG5MZW5ndGhUZW1wCQktPSBuQ29weTsNCisgICAgICAgICAgICBscENodW5rLT5uVXNlZAkrPSBuQ29weTsNCisgICAgICAgICAgICBjcC5uQ2h1bmtJbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHdoaWxlIChuTGVuZ3RoVGVtcCA+IDApIHsNCisgICAgICAgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9wQWxsb2NhdG9yLT5BbGxvYyhzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChscENodW5rKTsNCisgICAgICAgIEZYX0lOVDMyIG5Db3B5ID0gRlhfTUlOKG5MZW5ndGhUZW1wLCBtX25DaHVua1NpemUpOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5KGxwQ2h1bmstPndDaGFycywgbHBUZXh0LCBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgbHBUZXh0CQkJKz0JbkNvcHk7DQorICAgICAgICBuTGVuZ3RoVGVtcAkJLT0JbkNvcHk7DQorICAgICAgICBscENodW5rLT5uVXNlZAk9CW5Db3B5Ow0KKyAgICAgICAgbV9DaHVua3MuSW5zZXJ0QXQoY3AubkNodW5rSW5kZXgsIGxwQ2h1bmspOw0KKyAgICAgICAgY3AubkNodW5rSW5kZXggKys7DQorICAgIH0NCisgICAgbV9uVG90YWwJKz0Jbkxlbmd0aDsNCisgICAgbV9iQ2hhbmdlZAk9CVRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OkRlbGV0ZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyIG5MZW5ndGggKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwICYmIG5JbmRleCA+PSAwICYmIG5JbmRleCArIG5MZW5ndGggPD0gbV9uVG90YWwpOw0KKyAgICBGREVfQ0hVTktQTEFDRSBjcEVuZDsNCisgICAgSW5kZXgyQ1AobkluZGV4ICsgbkxlbmd0aCAtIDEsIGNwRW5kKTsNCisgICAgbV9uVG90YWwgLT0gbkxlbmd0aDsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcEVuZC5uQ2h1bmtJbmRleF07DQorICAgIEZYX0lOVDMyIG5GaXJzdFBhcnQJPSBjcEVuZC5uQ2hhckluZGV4ICsgMTsNCisgICAgRlhfSU5UMzIgbk1vdmVQYXJ0CT0gbHBDaHVuay0+blVzZWQgLSBuRmlyc3RQYXJ0Ow0KKyAgICBpZiAobk1vdmVQYXJ0ICE9IDApIHsNCisgICAgICAgIEZYX0lOVDMyIG5EZWxldGUgPSBGWF9NSU4obkZpcnN0UGFydCwgbkxlbmd0aCk7DQorICAgICAgICBGWFNZU19tZW1tb3ZlKGxwQ2h1bmstPndDaGFycyArIG5GaXJzdFBhcnQgLSBuRGVsZXRlLCBcDQorICAgICAgICAgICAgICAgICAgICAgIGxwQ2h1bmstPndDaGFycyArIG5GaXJzdFBhcnQsIG5Nb3ZlUGFydCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgbHBDaHVuay0+blVzZWQJLT0gbkRlbGV0ZTsNCisgICAgICAgIG5MZW5ndGgJCQktPSBuRGVsZXRlOw0KKyAgICAgICAgY3BFbmQubkNodW5rSW5kZXggLS07DQorICAgIH0NCisgICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7DQorICAgICAgICBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwRW5kLm5DaHVua0luZGV4XTsNCisgICAgICAgIEZYX0lOVDMyIG5EZWxldGVkID0gRlhfTUlOKGxwQ2h1bmstPm5Vc2VkLCBuTGVuZ3RoKTsNCisgICAgICAgIGxwQ2h1bmstPm5Vc2VkIC09IG5EZWxldGVkOw0KKyAgICAgICAgaWYgKGxwQ2h1bmstPm5Vc2VkID09IDApIHsNCisgICAgICAgICAgICBtX3BBbGxvY2F0b3ItPkZyZWUobHBDaHVuayk7DQorICAgICAgICAgICAgbV9DaHVua3MuUmVtb3ZlQXQoY3BFbmQubkNodW5rSW5kZXgpOw0KKyAgICAgICAgICAgIGxwQ2h1bmsgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkxlbmd0aCAtPSBuRGVsZXRlZDsNCisgICAgICAgIGNwRW5kLm5DaHVua0luZGV4IC0tOw0KKyAgICB9DQorICAgIG1fYkNoYW5nZWQgPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlICkNCit7DQorICAgIEZYX0lOVDMyIGkJCT0gMDsNCisgICAgRlhfSU5UMzIgbkNvdW50CT0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KKyAgICBpZiAoYlJlbGVhc2UpIHsNCisgICAgICAgIHdoaWxlIChpIDwgbkNvdW50KSB7DQorICAgICAgICAgICAgbV9wQWxsb2NhdG9yLT5GcmVlKG1fQ2h1bmtzW2krK10pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAoaSA8IG5Db3VudCkgew0KKyAgICAgICAgICAgICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaSsrXSktPm5Vc2VkID0gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX25Ub3RhbAk9IDA7DQorICAgIG1fYkNoYW5nZWQJPSBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0QnVmOjpPcHRpbWl6ZShJRlhfUGF1c2UgKiBwUGF1c2UgKQ0KK3sNCisgICAgaWYgKG1fYkNoYW5nZWQgPT0gRkFMU0UpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChtX25Ub3RhbCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICAgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoIDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCisgICAgICAgIGlmIChscENodW5rLT5uVXNlZCA9PSAwKSB7DQorICAgICAgICAgICAgbV9wQWxsb2NhdG9yLT5GcmVlKGxwQ2h1bmspOw0KKyAgICAgICAgICAgIG1fQ2h1bmtzLlJlbW92ZUF0KGkpOw0KKyAgICAgICAgICAgIC0taTsNCisgICAgICAgICAgICAtLW5Db3VudDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFBhdXNlICE9IE5VTEwgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBQcmVDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1swXTsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDdXJDaHVuayA9IE5VTEw7DQorICAgIGZvciAoaSA9IDE7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIGxwQ3VyQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV07DQorICAgICAgICBpZiAobHBQcmVDaHVuay0+blVzZWQgKyBscEN1ckNodW5rLT5uVXNlZCA8PSBtX25DaHVua1NpemUpIHsNCisgICAgICAgICAgICBGWFNZU19tZW1jcHkobHBQcmVDaHVuay0+d0NoYXJzICsgbHBQcmVDaHVuay0+blVzZWQsIGxwQ3VyQ2h1bmstPndDaGFycywgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBscEN1ckNodW5rLT5uVXNlZCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgICAgIGxwUHJlQ2h1bmstPm5Vc2VkICs9IGxwQ3VyQ2h1bmstPm5Vc2VkOw0KKyAgICAgICAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscEN1ckNodW5rKTsNCisgICAgICAgICAgICBtX0NodW5rcy5SZW1vdmVBdChpKTsNCisgICAgICAgICAgICAtLWk7DQorICAgICAgICAgICAgLS1uQ291bnQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGxwUHJlQ2h1bmsgPSBscEN1ckNodW5rOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBQYXVzZSAhPSBOVUxMICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX2JDaGFuZ2VkID0gRkFMU0U7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpSZXNldENodW5rQnVmZmVyKEZYX0lOVDMyIG5EZWZDaHVua0NvdW50LCBGWF9JTlQzMiBuQ2h1bmtTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5DaHVua1NpemUpOw0KKyAgICBGWFNZU19hc3NlcnQobkRlZkNodW5rQ291bnQpOw0KKyAgICBpZiAobV9wQWxsb2NhdG9yKSB7DQorICAgICAgICBtX3BBbGxvY2F0b3ItPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICAgIH0NCisgICAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorICAgIG1fbkNodW5rU2l6ZSA9IG5DaHVua1NpemU7DQorICAgIEZYX0lOVDMyIG5DaHVua0xlbmd0aCA9IHNpemVvZihGREVfQ0hVTktIRUFERVIpICsgKG1fbkNodW5rU2l6ZSAtIDEpICogc2l6ZW9mKEZYX1dDSEFSKTsNCisgICAgbV9wQWxsb2NhdG9yID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9GaXhlZCwgbkRlZkNodW5rQ291bnQsIG5DaHVua0xlbmd0aCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BBbGxvY2F0b3IpOw0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rSGVhZGVyID0gKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2MobkNodW5rTGVuZ3RoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGxwQ2h1bmtIZWFkZXIpOw0KKyAgICBscENodW5rSGVhZGVyLT5uVXNlZCA9IDA7DQorICAgIG1fQ2h1bmtzLkFkZChscENodW5rSGVhZGVyKTsNCisgICAgbV9uVG90YWwgPSAwOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEJ1Zjo6Q1AySW5kZXgoY29uc3QgRkRFX0NIVU5LUExBQ0UgJiBjcCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIG5Ub3RhbCA9IGNwLm5DaGFySW5kZXg7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3AubkNodW5rSW5kZXg7IGkgKyspIHsNCisgICAgICAgIG5Ub3RhbCArPSAoKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldKS0+blVzZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIG5Ub3RhbDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6SW5kZXgyQ1AoRlhfSU5UMzIgbkluZGV4LCBGREVfQ0hVTktQTEFDRSAmIGNwKSBjb25zdA0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5JbmRleCA8PSBHZXRUZXh0TGVuZ3RoKCkpOw0KKyAgICBpZiAobkluZGV4ID09IG1fblRvdGFsKSB7DQorICAgICAgICBjcC5uQ2h1bmtJbmRleAk9IG1fQ2h1bmtzLkdldFNpemUoKSAtIDE7DQorICAgICAgICBjcC5uQ2hhckluZGV4CT0gKChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcC5uQ2h1bmtJbmRleF0pLT5uVXNlZDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglpCQk9IDA7DQorICAgIEZYX0lOVDMyCW5Ub3RhbAk9IDA7DQorICAgIEZYX0lOVDMyCW5Db3VudAk9IG1fQ2h1bmtzLkdldFNpemUoKTsNCisgICAgZm9yICggOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBuVG90YWwgKz0gKChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXSktPm5Vc2VkOw0KKyAgICAgICAgaWYgKG5Ub3RhbCA+IG5JbmRleCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGNwLm5DaHVua0luZGV4CT0gaTsNCisgICAgY3AubkNoYXJJbmRleAk9ICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV0pLT5uVXNlZCAtIChuVG90YWwgLSBuSW5kZXgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuaCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYWVhY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuaApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9UWFRFRFRCVUZfSA0KKyNkZWZpbmUgX0ZERV9UWFRFRFRCVUZfSA0KK2NsYXNzIElGWF9DaGFySXRlcjsNCitjbGFzcyBDRkRFX1R4dEVkdEJ1Zkl0ZXI7DQorY2xhc3MgQ0ZERV9UeHRFZHRCdWY7DQorY2xhc3MgQ0ZERV9UeHRFZHRCdWZJdGVyIDogcHVibGljIElGWF9DaGFySXRlciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgQ0ZERV9UeHRFZHRCdWZJdGVyKENGREVfVHh0RWR0QnVmICogcEJ1ZiwgRlhfQk9PTCBiRm9yRGlzcGxheSA9IFRSVUUpOw0KKyNlbHNlDQorICAgIENGREVfVHh0RWR0QnVmSXRlcihDRkRFX1R4dEVkdEJ1ZiAqIHBCdWYsIEZYX1dDSEFSIHdjQWxpYXMgPSAwKTsNCisjZW5kaWYNCisNCisgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2ID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXIoKTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRBdChGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldEF0KCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNFT0YoRlhfQk9PTCBiVGFpbCA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIElGWF9DaGFySXRlciAqIENsb25lKCk7DQorcHJvdGVjdGVkOg0KKyAgICB+Q0ZERV9UeHRFZHRCdWZJdGVyKCk7DQorcHJpdmF0ZToNCisgICAgQ0ZERV9UeHRFZHRCdWYqCW1fcEJ1ZjsNCisgICAgRlhfSU5UMzIJCW1fbkN1ckNodW5rOw0KKyAgICBGWF9JTlQzMgkJbV9uQ3VySW5kZXg7DQorICAgIEZYX0lOVDMyCQltX25JbmRleDsNCisgICAgRlhfQk9PTAkJCW1fYkluRmllbGQ7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBGWF9CT09MCQkJbV9iRm9yRGlzcGxheTsNCisgICAgRlhfSU5UMzIJCW1fbkFsaWFzQ291bnQ7DQorI2VuZGlmDQorICAgIEZYX1dDSEFSCQltX0FsaWFzOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRCdWYgOiBwdWJsaWMgSUZERV9UeHRFZHRCdWYsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KKyAgICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHRCdWZJdGVyOw0KKyAgICBzdHJ1Y3QgX0ZERV9DSFVOS0hFQURFUiA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgICAgIEZYX0lOVDMyCW5Vc2VkOw0KKyAgICAgICAgRlhfV0NIQVIJd0NoYXJzWzFdOw0KKyAgICB9Ow0KKyAgICB0eXBlZGVmIF9GREVfQ0hVTktIRUFERVIJRkRFX0NIVU5LSEVBREVSOw0KKyAgICB0eXBlZGVmIF9GREVfQ0hVTktIRUFERVIqCUZERV9MUENIVU5LSEVBREVSOw0KKyAgICBzdHJ1Y3QgX0ZERV9DSFVOS1BMQUNFIDogcHVibGljIENGWF9PYmplY3Qgew0KKyAgICAgICAgRlhfSU5UMzIJbkNodW5rSW5kZXg7DQorICAgICAgICBGWF9JTlQzMgluQ2hhckluZGV4Ow0KKyAgICB9Ow0KKyAgICB0eXBlZGVmIF9GREVfQ0hVTktQTEFDRQkJRkRFX0NIVU5LUExBQ0U7DQorICAgIHR5cGVkZWYgX0ZERV9DSFVOS1BMQUNFKglGREVfTFBDSFVOS1BMQUNFOw0KKw0KK3B1YmxpYzoNCisgICAgQ0ZERV9UeHRFZHRCdWYoRlhfSU5UMzIgbkRlZkNodW5rU2l6ZSA9IEZERV9ERUZDSFVOS0xFTkdUSCk7DQorDQorICAgIHZpcnR1YWwJdm9pZAkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldENodW5rU2l6ZShGWF9JTlQzMiBuQ2h1bmtTaXplKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRDaHVua1NpemUoKSBjb25zdDsNCisgICAgdmlydHVhbAlGWF9JTlQzMglHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdmlydHVhbCB2b2lkCQlHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXJCeUluZGV4KEZYX0lOVDMyIG5JbmRleCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJR2V0UmFuZ2UoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgbkJlZ2luZSwgRlhfSU5UMzIgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUluc2VydChGWF9JTlQzMiBuUG9zLCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbmd0aCA9IDEpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyIG5MZW5ndGggPSAxKTsNCisgICAgdmlydHVhbCB2b2lkCQlDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gVFJVRSk7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT3B0aW1pemUoSUZYX1BhdXNlICogcFBhdXNlID0gTlVMTCk7DQorDQorcHJvdGVjdGVkOg0KKyAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEJ1ZigpOw0KK3ByaXZhdGU6DQorICAgIHZvaWQJCVJlc2V0Q2h1bmtCdWZmZXIoRlhfSU5UMzIgbkRlZkNodW5rQ291bnQsIEZYX0lOVDMyIG5DaHVua1NpemUpOw0KKyAgICBGWF9JTlQzMglDUDJJbmRleChjb25zdCBGREVfQ0hVTktQTEFDRSAmIGNwKSBjb25zdDsNCisgICAgdm9pZAkJSW5kZXgyQ1AoRlhfSU5UMzIgbkluZGV4LCBGREVfQ0hVTktQTEFDRSAmIGNwKSBjb25zdDsNCisNCisgICAgRlhfSU5UMzIJCQltX25DaHVua1NpemU7DQorDQorICAgIEZYX0lOVDMyCQkJbV9uVG90YWw7DQorICAgIEZYX0JPT0wJCQkJbV9iQ2hhbmdlZDsNCisgICAgQ0ZYX1B0ckFycmF5CQltX0NodW5rczsNCisgICAgSUZYX01FTUFsbG9jYXRvciAqCW1fcEFsbG9jYXRvcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYmQxMzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuY3BwCkBAIC0wLDAgKzEsMjg3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2lmZGVfdHh0ZWR0YnVmLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvaWZkZV90eHRlZHRwYWdlLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRlbmdpbmUuaCINCisjaW5jbHVkZSAiZmRlX3R4dGVkdHBhcmFnLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRrbXBtYXRjaC5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YnVmLmgiDQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YmxvY2suaCINCisjZW5kaWYNCisjZGVmaW5lIEZERV9QQUdFV0lEVEhfTUFYCQkJCTB4RkZGRg0KKyNkZWZpbmUgRkRFX1RYVFBMQVRFU0laRQkJCQkoMTAyNCAqIDEyKQ0KKyNkZWZpbmUgRkRFX1VOSUNPREVfUEFSQUdSQVBIX1NQRVJBVE9SCSgweDIwMjkpDQorI2RlZmluZSBGREVfVFhURURUX0RPUkVDT1JEX0lOUwkJCTANCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfREVMCQkJMQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUSU5TCTMNCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMCTQNCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQCTUNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOCQkweEZGRjkNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5ECQkweEZGRkINCisjZW5kaWYNCitJRkRFX1R4dEVkdEVuZ2luZSAqIElGREVfVHh0RWR0RW5naW5lOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdEVuZ2luZSgpOw0KK30NCitDRkRFX1R4dEVkdEVuZ2luZTo6Q0ZERV9UeHRFZHRFbmdpbmUoKQ0KKyAgICA6IG1fblBhZ2VMaW5lQ291bnQoMjApDQorICAgICwgbV9uTGluZUNvdW50KDApDQorICAgICwgbV9uQW5jaG9yUG9zKC0xKQ0KKyAgICAsIG1fbkxheW91dFBvcygwKQ0KKyAgICAsIG1fZkNhcmV0UG9zUmVzZXJ2ZSgwLjApDQorICAgICwgbV9uQ2FyZXQoMCkNCisgICAgLCBtX2JCZWZvcmUoVFJVRSkNCisgICAgLCBtX25DYXJldFBhZ2UoMCkNCisgICAgLCBtX2JMb2NrKEZBTFNFKQ0KKyAgICAsIG1fbkxpbWl0KDApDQorICAgICwgbV93Y0FsaWFzQ2hhcihMJyonKQ0KKyAgICAsIG1fcFRleHRCcmVhayhOVUxMKQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgLCBtX25GaXhMZW5ndGgoLTEpDQorI2VuZGlmDQorICAgICwgbV9kd0ZpbmRGbGFncygwKQ0KKyAgICAsIG1fbkZpcnN0TGluZUVuZChGREVfVFhURURJVF9MSU5FRU5EX0F1dG8pDQorICAgICwgbV93TGluZUVuZChGREVfVU5JQ09ERV9QQVJBR1JBUEhfU1BFUkFUT1IpDQorICAgICwgbV9iQXV0b0xpbmVFbmQoVFJVRSkNCit7DQorICAgIEZYU1lTX21lbXNldCgmbV9ydENhcmV0LCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICAgIG1fcFR4dEJ1ZiA9IEZYX05FVyBDRkRFX1R4dEVkdEJ1ZigpOw0KKyAgICBtX2JBdXRvTGluZUVuZAk9IChtX1BhcmFtLm5MaW5lRW5kID09IEZERV9UWFRFRElUX0xJTkVFTkRfQXV0byk7DQorfQ0KK0NGREVfVHh0RWR0RW5naW5lOjp+Q0ZERV9UeHRFZHRFbmdpbmUoKQ0KK3sNCisgICAgaWYgKG1fcFR4dEJ1Zikgew0KKyAgICAgICAgbV9wVHh0QnVmLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BUeHRCdWYgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BUZXh0QnJlYWspIHsNCisgICAgICAgIG1fcFRleHRCcmVhay0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wVGV4dEJyZWFrID0gTlVMTDsNCisgICAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgRlhfSU5UMzIgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAobkJsb2NrQ291bnQgPiAwKSB7DQorICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgIGZvciAoOyBpIDwgbkJsb2NrQ291bnQ7IGkgKyspIHsNCisgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrID0gbV9CbG9ja0FycmF5W2ldOw0KKyAgICAgICAgICAgIGRlbGV0ZSBwQmxvY2s7DQorICAgICAgICB9DQorICAgICAgICBtX0Jsb2NrQXJyYXkuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisjZW5kaWYNCisgICAgUmVtb3ZlQWxsUGFyYWdzKCk7DQorICAgIFJlbW92ZUFsbFBhZ2VzKCk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luayA9IE5VTEw7DQorICAgIENsZWFyU2VsZWN0aW9uKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbGVhc2UoKQ0KK3sNCisgICAgZGVsZXRlIHRoaXM7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEVkaXRQYXJhbXMoY29uc3QgRkRFX1RYVEVEVFBBUkFNUyAmcGFyYW1zKQ0KK3sNCisgICAgaWYgKG1fcFRleHRCcmVhayA9PSBOVUxMKSB7DQorICAgICAgICBtX3BUZXh0QnJlYWsJPSBJRlhfVHh0QnJlYWs6OkNyZWF0ZShGWF9UWFRCUkVBS1BPTElDWV9Ob25lKTsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1jcHkoJm1fUGFyYW0sICZwYXJhbXMsIHNpemVvZihGREVfVFhURURUUEFSQU1TKSk7DQorICAgIG1fd0xpbmVFbmQJCT0gcGFyYW1zLndMaW5lQnJlYWtDaGFyOw0KKyAgICBtX2JBdXRvTGluZUVuZAk9IChtX1BhcmFtLm5MaW5lRW5kID09IEZERV9UWFRFRElUX0xJTkVFTkRfQXV0byk7DQorICAgIFVwZGF0ZVR4dEJyZWFrKCk7DQorfQ0KK2NvbnN0IEZERV9UWFRFRFRQQVJBTVMgKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0RWRpdFBhcmFtcygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gJm1fUGFyYW07DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpDb3VudFBhZ2VzKCkgY29uc3QNCit7DQorICAgIGlmIChtX25MaW5lQ291bnQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgcmV0dXJuICgobV9uTGluZUNvdW50IC0gMSkgLyBtX25QYWdlTGluZUNvdW50KSArIDE7DQorfQ0KK0lGREVfVHh0RWR0UGFnZSAqIENGREVfVHh0RWR0RW5naW5lOjpHZXRQYWdlKEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gKElGREVfVHh0RWR0UGFnZSopbV9QYWdlUHRyQXJyYXlbbkluZGV4XTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0QnVmQ2h1bmtTaXplKEZYX0lOVDMyIG5DaHVua1NpemUpDQorew0KKyAgICByZXR1cm4gbV9wVHh0QnVmLT5TZXRDaHVua1NpemUobkNodW5rU2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldFRleHRCeVN0cmVhbShJRlhfU3RyZWFtICpwU3RyZWFtKQ0KK3sNCisgICAgUmVzZXRFbmdpbmUoKTsNCisgICAgRlhfSU5UMzIJbkluZGV4CT0gMDsNCisgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCAmJiBwU3RyZWFtLT5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgRlhfSU5UMzIJblN0cmVhbUxlbmd0aAk9IHBTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgICAgICAgRlhfQk9PTAkJYlZhbGlkCQkJPSBUUlVFOw0KKyAgICAgICAgaWYgKG1fbkxpbWl0ID4gMCAmJiBuU3RyZWFtTGVuZ3RoID4gbV9uTGltaXQpIHsNCisgICAgICAgICAgICBiVmFsaWQgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYlByZUlzQ1IgPSBGQUxTRTsNCisgICAgICAgIGlmIChiVmFsaWQpIHsNCisgICAgICAgICAgICBGWF9CWVRFIGJvbVs0XTsNCisgICAgICAgICAgICBGWF9JTlQzMiBuUG9zICA9IHBTdHJlYW0tPkdldEJPTShib20pOw0KKyAgICAgICAgICAgIHBTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgblBvcyk7DQorICAgICAgICAgICAgRlhfSU5UMzIJYkVvcwkJPSBGQUxTRTsNCisgICAgICAgICAgICBGWF9JTlQzMgluUGxhdGVTaXplCT0gRlhfTUlOKG5TdHJlYW1MZW5ndGgsIG1fcFR4dEJ1Zi0+R2V0Q2h1bmtTaXplKCkpOw0KKyAgICAgICAgICAgIEZYX0xQV1NUUglscHdzdHIJCT0gKEZYX0xQV1NUUilGREVfQWxsb2MoblBsYXRlU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChscHdzdHIpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyCW5SZWFkID0gMDsNCisgICAgICAgICAgICB3aGlsZSAoIWJFb3MpIHsNCisgICAgICAgICAgICAgICAgblJlYWQgPSBwU3RyZWFtLT5SZWFkU3RyaW5nKGxwd3N0ciwgblBsYXRlU2l6ZSwgYkVvcyk7DQorICAgICAgICAgICAgICAgIGJQcmVJc0NSID0gUmVwbGFjZVBhcmFnRW5kKGxwd3N0ciwgblJlYWQsIGJQcmVJc0NSKTsNCisgICAgICAgICAgICAgICAgbV9wVHh0QnVmLT5JbnNlcnQobkluZGV4LCBscHdzdHIsIG5SZWFkKTsNCisgICAgICAgICAgICAgICAgbkluZGV4ICs9IG5SZWFkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGREVfRnJlZShscHdzdHIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5JbmRleCwgJm1fd0xpbmVFbmQsIDEpOw0KKyAgICBSZWJ1aWxkUGFyYWdyYXBocygpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBSZXNldEVuZ2luZSgpOw0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KKyAgICBpZiAobkxlbmd0aCA+IDApIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgIEZYX0xQV1NUUiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICAgICAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIEZYX0xQQ1dTVFIod3NUZXh0KSwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgUmVwbGFjZVBhcmFnRW5kKGxwQnVmZmVyLCBuTGVuZ3RoLCBGQUxTRSk7DQorICAgICAgICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgICAgIGlmIChtX25MaW1pdCA+IDAgJiYgbkxlbmd0aCA+IG1fbkxpbWl0KSB7DQorICAgICAgICAgICAgd3NUZW1wLkRlbGV0ZShtX25MaW1pdCwgbkxlbmd0aCAtIG1fbkxpbWl0KTsNCisgICAgICAgICAgICBuTGVuZ3RoID0gbV9uTGltaXQ7DQorICAgICAgICB9DQorICAgICAgICBtX3BUeHRCdWYtPlNldFRleHQod3NUZW1wKTsNCisgICAgfQ0KKyAgICBtX3BUeHRCdWYtPkluc2VydChuTGVuZ3RoLCAmbV93TGluZUVuZCwgMSk7DQorICAgIFJlYnVpbGRQYXJhZ3JhcGhzKCk7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIHJldHVybiBHZXRUZXh0QnVmTGVuZ3RoKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgKQ0KK3sNCisgICAgRlhfSU5UMzIgblRleHRCdWZMZW5ndGggPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQorICAgIGlmIChuQ291bnQgPT0gLTEpIHsNCisgICAgICAgIG5Db3VudCA9IG5UZXh0QnVmTGVuZ3RoIC0gblN0YXJ0Ow0KKyAgICB9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBGWF9JTlQzMiBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICAgIGlmIChuQmxvY2tDb3VudCA9PSAwIHx8IG1fd3NGaXhUZXh0LklzRW1wdHkoKSkgew0KKyAgICAgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIEZYX0xQQ1dTVFIJbHBGaXhCdWZmZXIJPSBGWF9MUENXU1RSKG1fd3NGaXhUZXh0KTsNCisgICAgRlhfTFBXU1RSCWxwQnVmZmVyCT0gd3NUZW1wLkdldEJ1ZmZlcihuVGV4dEJ1Zkxlbmd0aCk7DQorICAgIEZYX0lOVDMyIG5SZWFsTGVuZ3RoCT0gMDsNCisgICAgRlhfSU5UMzIgblByZVBvcwkJPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkJsb2NrQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGREVfVHh0RWR0QmxvY2sgKnBCbG9jayA9IG1fQmxvY2tBcnJheVtpXTsNCisgICAgICAgIEZYX0lOVDMyIG5Qb3MgPSBwQmxvY2stPkdldFBvcygpOw0KKyAgICAgICAgRlhfSU5UMzIgbkNvcHlMZW5ndGggPSBuUG9zIC0gblByZVBvczsNCisgICAgICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBscEZpeEJ1ZmZlciArIG5QcmVQb3MsIG5Db3B5TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICBuUmVhbExlbmd0aCArPSBuQ29weUxlbmd0aDsNCisgICAgICAgIG5QcmVQb3MJCT0gIG5Qb3M7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Jsb2NrOw0KKyAgICAgICAgcEJsb2NrLT5HZXRSZWFsVGV4dCh3c0Jsb2NrKTsNCisgICAgICAgIG5Db3B5TGVuZ3RoID0gd3NCbG9jay5HZXRMZW5ndGgoKTsNCisgICAgICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBGWF9MUENXU1RSKHdzQmxvY2spLCBuQ29weUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgblJlYWxMZW5ndGggKz0gbkNvcHlMZW5ndGg7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkxlZnRMZW5ndGggPSBtX3dzRml4VGV4dC5HZXRMZW5ndGgoKSAtIG5QcmVQb3M7DQorICAgIGlmIChuTGVmdExlbmd0aCA+IDApIHsNCisgICAgICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBscEZpeEJ1ZmZlciArIG5QcmVQb3MsIG5MZWZ0TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICBuUmVhbExlbmd0aCArPSBuTGVmdExlbmd0aDsNCisgICAgfQ0KKyAgICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuUmVhbExlbmd0aCk7DQorICAgIEZYX0lOVDMyIG5SZWFsQmduCT0gR2V0UmVhbEluZGV4KG5TdGFydCk7DQorICAgIEZYX0lOVDMyIG5SZWFsRW5kCT0gR2V0UmVhbEluZGV4KG5TdGFydCArIG5Db3VudCAtIDEpOw0KKyAgICBGWF9JTlQzMiBuUmVhbENvdW50CT0gblJlYWxFbmQgLSBuUmVhbEJnbjsNCisgICAgRlhfTFBXU1RSIGxwRGVzdEJ1ZiA9IHdzVGV4dC5HZXRCdWZmZXIoblJlYWxDb3VudCk7DQorICAgIEZYU1lTX21lbWNweShscERlc3RCdWYsIEZYX0xQQ1dTVFIod3NUZW1wKSArIG5SZWFsQmduLCBuUmVhbENvdW50ICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKCk7DQorI2Vsc2UNCisgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgUmVjb3ZlclBhcmFnRW5kKHdzVGV4dCk7DQorICAgIHJldHVybjsNCisjZW5kaWYNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6Q2xlYXJUZXh0KCkNCit7DQorICAgIERlbGV0ZVJhbmdlKDAsIC0xKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYgJnJ0Q2FyZXQpIGNvbnN0DQorew0KKyAgICBydENhcmV0ID0gbV9ydENhcmV0Ow0KKyAgICByZXR1cm4gbV9uQ2FyZXQ7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpHZXRDYXJldFBvcygpIGNvbnN0DQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgcmV0dXJuIG1fbkNhcmV0ICsgKG1fYkJlZm9yZSA/IDAgOiAxKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldENhcmV0UG9zKEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKQ0KK3sNCisgICAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPD0gR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCisgICAgaWYgKG1fUGFnZVB0ckFycmF5LkdldFNpemUoKSA8PSBtX25DYXJldFBhZ2UpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9NSURETEUsIGJCZWZvcmUpOw0KKyAgICB9DQorI2VuZGlmDQorICAgIG1fYkJlZm9yZQk9IGJCZWZvcmU7DQorICAgIG1fbkNhcmV0CT0gbkluZGV4Ow0KKyAgICBNb3ZlUGFnZTJDaGFyKG1fbkNhcmV0KTsNCisgICAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsNCisgICAgaWYgKCFtX2JCZWZvcmUpIHsNCisgICAgICAgIG1fbkNhcmV0ICsrOw0KKyAgICAgICAgbV9iQmVmb3JlID0gVFJVRTsNCisgICAgfQ0KKyAgICBtX2ZDYXJldFBvc1Jlc2VydmUgPSAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgPyBcDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDYXJldC50b3AgOiBtX3J0Q2FyZXQubGVmdDsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9DYXJldENoYW5nZWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgICAgbV9uQW5jaG9yUG9zID0gLTE7DQorICAgIHJldHVybiBtX25DYXJldDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVDYXJldFBvcyhGREVfVFhURURUTU9WRUNBUkVUIGVNb3ZlQ2FyZXQsDQorICAgICAgICBGWF9CT09MIGJTaGlmdCAsDQorICAgICAgICBGWF9CT09MIGJDdHJsICkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAobV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpIDw9IG1fbkNhcmV0UGFnZSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfQk9PTCBiU2VsQ2hhbmdlID0gRkFMU0U7DQorICAgIGlmIChJc1NlbGVjdCgpKSB7DQorICAgICAgICBDbGVhclNlbGVjdGlvbigpOw0KKyAgICAgICAgYlNlbENoYW5nZSA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGJTaGlmdCkgew0KKyAgICAgICAgaWYgKG1fbkFuY2hvclBvcyA9PSAtMSkgew0KKyAgICAgICAgICAgIG1fbkFuY2hvclBvcyA9IG1fbkNhcmV0Ow0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9uQW5jaG9yUG9zID0gLTE7DQorICAgIH0NCisgICAgRlhfQk9PTAkJYlZlcnRpY2FsCT0gbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbDsNCisgICAgRlhfSU5UMzIJbkNhcmV0CQk9IG1fbkNhcmV0Ow0KKyAgICBGWF9JTlQzMgluQ2FyZXRQYWdlCT0gbV9uQ2FyZXRQYWdlOw0KKyAgICBzd2l0Y2ggKGVNb3ZlQ2FyZXQpIHsNCisgICAgICAgIGNhc2UgTUNfTGVmdDogew0KKyAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHB0Q2FyZXQ7DQorICAgICAgICAgICAgICAgICAgICBpZiAoTW92ZVVwKHB0Q2FyZXQpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuSW5kZXggPSBNb3ZlQmFja3dhcmQoYkJlZm9yZSk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQsIGJCZWZvcmUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX25DYXJldDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICBpZiAobkluZGV4ID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUNfUmlnaHQ6IHsNCisgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKE1vdmVEb3duKHB0Q2FyZXQpKQl7DQorICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuSW5kZXggPSBNb3ZlRm9yd2FyZChiQmVmb3JlKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgICAgICAgICAgICAgICAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPT0gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkluZGV4ID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCwgYkJlZm9yZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICBpZiAobkluZGV4ID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUNfVXA6IHsNCisgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5JbmRleCA9IE1vdmVCYWNrd2FyZChiQmVmb3JlKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgICAgICAgICAgICAgICAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCwgYkJlZm9yZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICBpZiAobkluZGV4ID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcHRDYXJldDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChNb3ZlVXAocHRDYXJldCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDYXJldEluZGV4KHB0Q2FyZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBNQ19Eb3duOiB7DQorICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuSW5kZXggPSBNb3ZlRm9yd2FyZChiQmVmb3JlKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgICAgICAgICAgICAgICAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJELCBiQmVmb3JlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKE1vdmVEb3duKHB0Q2FyZXQpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUNfV29yZEJhY2t3YXJkOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBNQ19Xb3JkRm9yd2FyZDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUNfTGluZVN0YXJ0Og0KKyAgICAgICAgICAgIE1vdmVMaW5lU3RhcnQoKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUNfTGluZUVuZDoNCisgICAgICAgICAgICBNb3ZlTGluZUVuZCgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBNQ19QYXJhZ1N0YXJ0Og0KKyAgICAgICAgICAgIE1vdmVQYXJhZ1N0YXJ0KCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE1DX1BhcmFnRW5kOg0KKyAgICAgICAgICAgIE1vdmVQYXJhZ0VuZCgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBNQ19QYWdlRG93bjoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUNfUGFnZVVwOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBNQ19Ib21lOg0KKyAgICAgICAgICAgIE1vdmVIb21lKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE1DX0VuZDoNCisgICAgICAgICAgICBNb3ZlRW5kKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChiU2hpZnQgJiYgbV9uQW5jaG9yUG9zICE9IC0xICYmIChtX25BbmNob3JQb3MgIT0gbV9uQ2FyZXQpKSB7DQorICAgICAgICBBZGRTZWxSYW5nZShGWF9NSU4obV9uQW5jaG9yUG9zLCBtX25DYXJldCksIEZYU1lTX2FicyhtX25BbmNob3JQb3MgLSBtX25DYXJldCkpOw0KKyAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgICB9DQorICAgIGlmIChiU2VsQ2hhbmdlKSB7DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fbkNhcmV0Ow0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpMb2NrKCkNCit7DQorICAgIG1fYkxvY2sgPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVbmxvY2soKQ0KK3sNCisgICAgbV9iTG9jayA9IEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpJc0xvY2tlZCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9iTG9jazsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6Okluc2VydChGWF9JTlQzMiBuU3RhcnQsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoKQ0KK3sNCisgICAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQ7DQorICAgIH0NCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgIEZYX0lOVDMyIG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgICAgaWYgKG5CbG9ja0NvdW50KSB7DQorICAgICAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0ZJRUxEX1RBQiAmJiBuTGVuZ3RoID09IDEgJiYgbHBUZXh0WzBdID09IEwnXHQnKSB7DQorICAgICAgICAgICAgcmV0dXJuIE1vdmUyTmV4dEVkaXRhYmxlRmllbGQoblN0YXJ0KSA/IEZERV9UWFRFRFRfTU9ESUZZX1JFVF9UX1RhYiA6IFwNCisgICAgICAgICAgICAgICAgICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfVGFiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgblNlbFJhbmdlQ291bnQgPSBDb3VudFNlbFJhbmdlcygpOw0KKyAgICAgICAgaWYgKG5TZWxSYW5nZUNvdW50ID4gMCkgew0KKyAgICAgICAgICAgIGlmIChuU2VsUmFuZ2VDb3VudCA+IDEpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9JTlQzMiBuU2VsU3RhcnQ7DQorICAgICAgICAgICAgRlhfSU5UMzIgblNlbENvdW50Ow0KKyAgICAgICAgICAgIG5TZWxDb3VudCA9IEdldFNlbFJhbmdlKDAsIG5TZWxTdGFydCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgblNlbEVuZCA9IG5TZWxTdGFydCArIG5TZWxDb3VudDsNCisgICAgICAgICAgICBGWF9JTlQzMiBuQmduID0gMDsNCisgICAgICAgICAgICBGWF9JTlQzMiBuRW5kID0gMDsNCisgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gTlVMTDsNCisgICAgICAgICAgICBGWF9CT09MIGJJbkZpZWxkID0gR2V0RmllbGRCb3VuZGFyeShuU2VsU3RhcnQsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICAgICAgICAgICAgaWYgKG5TZWxFbmQgPiBuRW5kKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGJJbkZpZWxkKSB7DQorICAgICAgICAgICAgICAgIHBGaWVsZC0+QmFja3VwKCk7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wJYkJlZm9yZQk9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkNhcmV0Ow0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBuSW5kZXhJbkZpZWxkID0gblNlbFN0YXJ0IC0gbkJnbjsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgblJldCA9IHBGaWVsZC0+UmVwbGFjZShuU2VsU3RhcnQgLSBuQmduLCBuU2VsQ291bnQsIENGWF9XaWRlU3RyaW5nQyhscFRleHQsIG5MZW5ndGgpLCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCisgICAgICAgICAgICAgICAgc3dpdGNoKG5SZXQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTDoNCisgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURToNCisgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZDsNCisgICAgICAgICAgICAgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NGaWVsZCk7DQorICAgICAgICAgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICAgICAgICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgICAgICAgICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgICAgICAgICAgICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgfHwgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yeikpIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICAgICAgICAgIEdldFByZVJlcGxhY2VUZXh0KHdzVGV4dCwgbkJnbiwgbkVuZCAtIG5CZ24gKyAxLCBGWF9MUENXU1RSKHdzRGlzcGxheSksIHdzRGlzcGxheS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIUlzRml0QXJlYSh3c1RleHQpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5OZXdDYXJldCA9IG5CZ24gKyBuQ2FyZXQ7DQorICAgICAgICAgICAgICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCAqIHBSZWNvcmQgPSBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UodGhpcywgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25DYXJldCwgbk5ld0NhcmV0LCBwRmllbGQsIG5JbmRleEluRmllbGQsIG5CZ24sIHdzRGlzcGxheS5HZXRMZW5ndGgoKSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RlbCwgQ0ZYX1dpZGVTdHJpbmdDKGxwVGV4dCwgbkxlbmd0aCksIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgICAgICAgICAgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgICAgICAgICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQorICAgICAgICAgICAgICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgU2V0Q2FyZXRQb3MobkJnbiArIG5DYXJldCwgYkJlZm9yZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgbkJnbiA9IDA7DQorICAgICAgICBGWF9JTlQzMiBuRW5kID0gMDsNCisgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBOVUxMOw0KKyAgICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkobV9uQ2FyZXQsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICAgICAgICBGWF9JTlQzMgluQ2FyZXRJbkZpZWxkCT0gbV9uQ2FyZXQgLSBuQmduOw0KKyAgICAgICAgRlhfQk9PTAkJYkJlZm9yZQkJCT0gRkFMU0U7DQorICAgICAgICBpZiAoYkluRmllbGQpIHsNCisgICAgICAgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyAgd3NJbnMobHBUZXh0LCBuTGVuZ3RoKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBuUmV0ID0gcEZpZWxkLT5JbnNlcnQobkNhcmV0SW5GaWVsZCwgd3NJbnMsIG5DYXJldEluRmllbGQsIGJCZWZvcmUpOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYkZ1bGwgPSBGQUxTRTsNCisgICAgICAgICAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19OT1JNQUw6DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19GVUxMOg0KKyAgICAgICAgICAgICAgICAgICAgYkZ1bGwgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Ob3JtYWw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGQ7DQorICAgICAgICAgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NGaWVsZCk7DQorICAgICAgICAgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlRmllbGQodGhpcywgcEZpZWxkLT5HZXRCbG9ja0luZGV4KCksIHBGaWVsZC0+R2V0SW5kZXgoKSwgd3NGaWVsZCwgMCkpIHsNCisgICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgICAgICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgICAgICAgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0KSB8fCAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICAgICAgICAgIEdldFByZVJlcGxhY2VUZXh0KHdzVGV4dCwgbkJnbiwgbkVuZCAtIG5CZ24gKyAxLCBGWF9MUENXU1RSKHdzRGlzcGxheSksIHdzRGlzcGxheS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIGlmICghSXNGaXRBcmVhKHdzVGV4dCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQorICAgICAgICAgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQorICAgICAgICAgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQodGhpcywgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNhcmV0LCBwRmllbGQsIG1fbkNhcmV0IC0gbkJnbiwgbkJnbiwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5LkdldExlbmd0aCgpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKGxwVGV4dCwgbkxlbmd0aCksIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgICAgICAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICAgICAgICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICAgICAgICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5DYXJldFBvcyA9IG5CZ24gKyBuQ2FyZXRJbkZpZWxkOw0KKyAgICAgICAgICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfRklFTERfQVVUTyAmJiBiRnVsbCAmJiBuQ2FyZXRQb3MgPT0gbkVuZCkgew0KKyAgICAgICAgICAgICAgICBpZiAoTW92ZTJOZXh0RWRpdGFibGVGaWVsZChuRW5kLCBUUlVFLCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFNldENhcmV0UG9zKG5DYXJldFBvcywgYkJlZm9yZSk7DQorICAgICAgICAgICAgcmV0dXJuIGJGdWxsID8gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfRnVsbCA6IEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCisgICAgICAgIH0NCisgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Ob3JtYWw7DQorICAgIH0NCisjZW5kaWYNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICBGWF9MUFdTVFIgbHBCdWZmZXIgPSB3c1RlbXAuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBSZXBsYWNlUGFyYWdFbmQobHBCdWZmZXIsIG5MZW5ndGgsIEZBTFNFKTsNCisgICAgd3NUZW1wLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorICAgIEZYX0JPT0wgYlBhcnQgPSBGQUxTRTsNCisgICAgaWYgKG1fbkxpbWl0ID4gMCkgew0KKyAgICAgICAgRlhfSU5UMzIgblRvdGFsTGVuZ3RoCT0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgICAgICAgRlhfSU5UMzIgbkRlbExlbmd0aAkJPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBTZWxSYW5nZSA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0QXQoaSk7DQorICAgICAgICAgICAgblRvdGFsTGVuZ3RoIC09IGxwU2VsUmFuZ2UtPm5Db3VudDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIG5FeHBlY3RMZW5ndGgJPSBuVG90YWxMZW5ndGggKyBuTGVuZ3RoOw0KKyAgICAgICAgaWYgKG5Ub3RhbExlbmd0aCA9PSBtX25MaW1pdCkgew0KKyAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5FeHBlY3RMZW5ndGggPiBtX25MaW1pdCkgew0KKyAgICAgICAgICAgIG5MZW5ndGggLT0gKG5FeHBlY3RMZW5ndGggLSBtX25MaW1pdCk7DQorICAgICAgICAgICAgYlBhcnQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0KSB8fCAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSkgew0KKyAgICAgICAgRlhfSU5UMzIgblRlbXAgPSBuTGVuZ3RoOw0KKyAgICAgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICB3aGlsZSAobkxlbmd0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgR2V0UHJlSW5zZXJ0VGV4dCh3c1RleHQsIG1fbkNhcmV0LCBscEJ1ZmZlciwgbkxlbmd0aCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5Ub3RhbCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgRlhfTFBXU1RSIGxwQnVmID0gd3NUZXh0LkdldEJ1ZmZlcihuVG90YWwpOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgblRvdGFsOyBpICsrKSB7DQorICAgICAgICAgICAgICAgICAgICBscEJ1ZltpXSA9IG1fd2NBbGlhc0NoYXI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIoblRvdGFsKTsNCisgICAgICAgICAgICAgICAgaWYgKElzRml0QXJlYSh3c1RleHQpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBuTGVuZ3RoIC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgICAgIHdoaWxlIChuTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICAgICAgICBHZXRQcmVJbnNlcnRUZXh0KHdzVGV4dCwgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgaWYgKElzRml0QXJlYSh3c1RleHQpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBuTGVuZ3RoIC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChuTGVuZ3RoID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChuTGVuZ3RoIDwgblRlbXApIHsNCisgICAgICAgICAgICBiUGFydCA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9WYWxpZGF0ZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgR2V0UHJlSW5zZXJ0VGV4dCh3c1RleHQsIG1fbkNhcmV0LCBscEJ1ZmZlciwgbkxlbmd0aCk7DQorICAgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGUodGhpcywgd3NUZXh0KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChJc1NlbGVjdCgpKSB7DQorICAgICAgICBEZWxldGVTZWxlY3QoKTsNCisgICAgfQ0KKyAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KHRoaXMsIG1fbkNhcmV0LCBscEJ1ZmZlciwgbkxlbmd0aCk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KKyAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCisgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c1ByZXZUZXh0LCAwKTsNCisgICAgSW5uZXJfSW5zZXJ0KG1fbkNhcmV0LCBscEJ1ZmZlciwgbkxlbmd0aCk7DQorICAgIG1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZQk9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydDsNCisgICAgbV9DaGFuZ2VJbmZvLndzSW5zZXJ0CQk9IENGWF9XaWRlU3RyaW5nKGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgblN0YXJ0ID0JbV9uQ2FyZXQ7DQorICAgIG5TdGFydCArPQluTGVuZ3RoOw0KKyAgICBGWF9XQ0hBUiB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0IC0gMSk7DQorICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgIGlmICh3Q2hhciAhPSBMJ1xuJyAmJiB3Q2hhciAhPSBMJ1xyJykgew0KKyAgICAgICAgblN0YXJ0IC0tOw0KKyAgICAgICAgYkJlZm9yZSA9IEZBTFNFOw0KKyAgICB9DQorICAgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgICAgcmV0dXJuIGJQYXJ0ID8gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfUGFydCA6IEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZShGWF9JTlQzMiBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSApDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgICAgfQ0KKyAgICBpZiAoSXNTZWxlY3QoKSkgew0KKyAgICAgICAgRGVsZXRlU2VsZWN0KCk7DQorICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgICB9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBGWF9JTlQzMiBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICAgIGlmIChuQmxvY2tDb3VudCA+IDApIHsNCisgICAgICAgIGlmIChiQmFja3NwYWNlKSB7DQorICAgICAgICAgICAgblN0YXJ0IC0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgbkNvdW50ID0gMTsNCisgICAgICAgIEZYX0lOVDMyIG5CZ24gPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgbkVuZCA9IDA7DQorICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gTlVMTDsNCisgICAgICAgIEZYX0JPT0wgYkluRmllbGQgPSBHZXRGaWVsZEJvdW5kYXJ5KG5TdGFydCwgbkJnbiwgbkVuZCwgcEZpZWxkKTsNCisgICAgICAgIEZYX0lOVDMyCW5DYXJldEluRmllbGQJPSBuU3RhcnQgLSBuQmduOw0KKyAgICAgICAgRlhfQk9PTAkJYkJlZm9yZQkJCT0gRkFMU0U7DQorICAgICAgICBpZiAoYkluRmllbGQgJiYgIXBGaWVsZC0+SXNGaXgoKSkgew0KKyAgICAgICAgICAgIHBGaWVsZC0+QmFja3VwKCk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQorICAgICAgICAgICAgRlhfSU5UMzIgbkNhcmV0ID0gMDsNCisgICAgICAgICAgICBGWF9JTlQzMiBuUmV0ID0gcEZpZWxkLT5EZWxldGUobkNhcmV0SW5GaWVsZCwgbkNvdW50LCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCisgICAgICAgICAgICBuQ2FyZXQgKz0gbkJnbjsNCisgICAgICAgICAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KKyAgICAgICAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KKyAgICAgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgICAgICAgICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgICAgICAgICAgICBSZXBsYWNlKG5CZ24sIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5KTsNCisgICAgICAgICAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgICAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCAqIHBSZWNvcmQgPSBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSh0aGlzLCBuU3RhcnQsIHBGaWVsZCwgbkNhcmV0SW5GaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheS5HZXRMZW5ndGgoKSwgd3NEZWwsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgICAgICAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICAgICAgICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICAgICAgICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSAxOw0KKyAgICBpZiAoYkJhY2tzcGFjZSkgew0KKyAgICAgICAgaWYgKG5TdGFydCA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5TdGFydCA+IDIgJiYgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKSA9PSBMJ1xuJyAmJiBcDQorICAgICAgICAgICAgICAgIG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0IC0gMikgPT0gTCdccicpIHsNCisgICAgICAgICAgICBuU3RhcnQgLS07DQorICAgICAgICAgICAgbkNvdW50ICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgblN0YXJ0IC0tOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG5TdGFydCA9PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoblN0YXJ0ICsgMSA8IEdldFRleHRCdWZMZW5ndGgoKSkgJiYgKG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0KSA9PSBMJ1xyJykgJiYgXA0KKyAgICAgICAgICAgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgKyAxKSA9PSBMJ1xuJykpIHsNCisgICAgICAgICAgICBuQ291bnQgKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9WYWxpZGF0ZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgR2V0UHJlRGVsZXRlVGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZSh0aGlzLCB3c1RleHQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JhbmdlOw0KKyAgICAgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1JhbmdlLCBuU3RhcnQsIG5Db3VudCk7DQorICAgICAgICBJRkRFX1R4dEVkdERvUmVjb3JkICogcFJlY29yZCA9IEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKHRoaXMsIG5TdGFydCwgbV9uQ2FyZXQsIHdzUmFuZ2UpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQorICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlCT0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlOw0KKyAgICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c0RlbGV0ZSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBJbm5lcl9EZWxldGVSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorICAgIFNldENhcmV0UG9zKG5TdGFydCArICgoIWJCYWNrc3BhY2UgJiYgblN0YXJ0ID4gMCkgPyAtMSA6IDApLCAoYkJhY2tzcGFjZSB8fCBuU3RhcnQgPT0gMCkpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKHRoaXMsIG1fQ2hhbmdlSW5mbyk7DQorICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpEZWxldGVSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCApDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgICAgfQ0KKyAgICBpZiAobkNvdW50ID09IC0xKSB7DQorICAgICAgICBuQ291bnQgPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQorICAgIH0NCisgICAgaWYgKG5Db3VudCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgICB9DQorICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIEdldFByZURlbGV0ZVRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICAgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGUodGhpcywgd3NUZXh0KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIERlbGV0ZVJhbmdlX0RvUmVjb3JkKG5TdGFydCwgbkNvdW50KTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KKyAgICBTZXRDYXJldFBvcyhuU3RhcnQsIFRSVUUpOw0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEVuZ2luZTo6UmVwbGFjZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5MZW5ndGgsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JlcGxhY2UpDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgICAgfQ0KKyAgICBpZiAoblN0YXJ0IDwgMCB8fCAoblN0YXJ0ICsgbkxlbmd0aCA+IEdldFRleHRCdWZMZW5ndGgoKSkpIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgICAgfQ0KKyAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICBHZXRQcmVSZXBsYWNlVGV4dCh3c1RleHQsIG5TdGFydCwgbkxlbmd0aCwgRlhfTFBDV1NUUih3c1JlcGxhY2UpLCB3c1JlcGxhY2UuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoSXNTZWxlY3QoKSkgew0KKyAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgfQ0KKyAgICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUJPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlOw0KKyAgICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c0RlbGV0ZSwgblN0YXJ0LCBuTGVuZ3RoKTsNCisgICAgaWYgKG5MZW5ndGggPiAwKSB7DQorICAgICAgICBJbm5lcl9EZWxldGVSYW5nZShuU3RhcnQsIG5MZW5ndGgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5UZXh0TGVuZ3RoID0gd3NSZXBsYWNlLkdldExlbmd0aCgpOw0KKyAgICBpZiAoblRleHRMZW5ndGggPiAwKSB7DQorICAgICAgICBJbm5lcl9JbnNlcnQoblN0YXJ0LCBGWF9MUENXU1RSKHdzUmVwbGFjZSksIG5UZXh0TGVuZ3RoKTsNCisgICAgfQ0KKyAgICBtX0NoYW5nZUluZm8ud3NJbnNlcnQgPSBDRlhfV2lkZVN0cmluZyhGWF9MUENXU1RSKHdzUmVwbGFjZSksIG5UZXh0TGVuZ3RoKTsNCisgICAgblN0YXJ0ICs9CW5UZXh0TGVuZ3RoOw0KKyAgICBGWF9XQ0hBUiB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0IC0gMSk7DQorICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgIGlmICh3Q2hhciAhPSBMJ1xuJyAmJiB3Q2hhciAhPSBMJ1xyJykgew0KKyAgICAgICAgblN0YXJ0IC0tOw0KKyAgICAgICAgYkJlZm9yZSA9IEZBTFNFOw0KKyAgICB9DQorICAgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0TGltaXQoRlhfSU5UMzIgbkxpbWl0KQ0KK3sNCisgICAgbV9uTGltaXQgPSBuTGltaXQ7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3Y0FsaWFzKQ0KK3sNCisgICAgbV93Y0FsaWFzQ2hhciA9IHdjQWxpYXM7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEZvcm1hdEJsb2NrKEZYX0lOVDMyIG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2tGb3JtYXQpDQorew0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgaWYgKG1fbkZpeExlbmd0aCA9PSAtMSkgew0KKyAgICAgICAgbV9uRml4TGVuZ3RoID0gR2V0VGV4dExlbmd0aCgpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fd3NGaXhUZXh0LklzRW1wdHkoKSk7DQorICAgICAgICBHZXRUZXh0KG1fd3NGaXhUZXh0LCAwLCAtMSk7DQorICAgIH0NCisgICAgRlhfQk9PTAkJYkluQmxvY2sJPSBGQUxTRTsNCisgICAgRlhfSU5UMzIJbkNoYXJJbmRleAk9IDA7DQorICAgIEZYX0lOVDMyCW5CbG9ja0luZGV4CT0gMDsNCisgICAgRlhfSU5UMzIJbkJsb2NrUG9zCT0gLTE7DQorICAgIEZYX1dDSEFSCXdjOw0KKyAgICBDRkRFX1R4dEVkdEJ1Zkl0ZXIgKiBwSXRlciA9IEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKiltX3BUeHRCdWYsIEZBTFNFKTsNCisgICAgcEl0ZXItPlNldEF0KDApOw0KKyAgICBkbyB7DQorICAgICAgICB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgICBpZiAoYkluQmxvY2spIHsNCisgICAgICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICAgICAgICAgICAgbkJsb2NrSW5kZXggKys7DQorICAgICAgICAgICAgICAgIGJJbkJsb2NrID0gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCisgICAgICAgICAgICAgICAgYkluQmxvY2sgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChuQ2hhckluZGV4ICsrID09IG5JbmRleCkgew0KKyAgICAgICAgICAgICAgICAgICAgbkJsb2NrUG9zID0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAocEl0ZXItPk5leHQoKSk7DQorICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgIGlmIChuQmxvY2tQb3MgPT0gLTEpIHsNCisgICAgICAgIG5CbG9ja1BvcyA9IEdldFRleHRCdWZMZW5ndGgoKTsNCisgICAgfQ0KKyAgICBDRkRFX1R4dEVkdEJsb2NrICogcEVkaXRCbG9jayA9IEZYX05FVyBDRkRFX1R4dEVkdEJsb2NrKHRoaXMsIHdzQmxvY2tGb3JtYXQsIG5JbmRleCk7DQorICAgIG1fQmxvY2tBcnJheS5JbnNlcnRBdChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpLCBwRWRpdEJsb2NrKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgICBwRWRpdEJsb2NrLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICBtX25DYXJldCA9IG5CbG9ja1BvczsNCisgICAgaWYgKHdzRGlzcGxheS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgIFJhd0luc2VydChuQmxvY2tQb3MsIEZYX0xQQ1dTVFIod3NEaXNwbGF5KSwgd3NEaXNwbGF5LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyNlbmRpZg0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEVuZ2luZTo6Q291bnRFZGl0QmxvY2tzKCkgY29uc3QNCit7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICByZXR1cm4gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisjZWxzZQ0KKyAgICByZXR1cm4gMDsNCisjZW5kaWYNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0RWRpdEJsb2NrVGV4dChGWF9JTlQzMiBuSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrVGV4dCkgY29uc3QNCit7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrID0gbV9CbG9ja0FycmF5W25JbmRleF07DQorICAgIHBCbG9jay0+R2V0QmxvY2tUZXh0KHdzQmxvY2tUZXh0KTsNCisjZW5kaWYNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50RWRpdEZpZWxkcyhGWF9JTlQzMiBuQmxvY2tJbmRleCkgY29uc3QNCit7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrID0gbV9CbG9ja0FycmF5W25CbG9ja0luZGV4XTsNCisgICAgcmV0dXJuIHBCbG9jay0+Q291bnRGaWVsZCgpOw0KKyNlbHNlDQorICAgIHJldHVybiAwOw0KKyNlbmRpZg0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRFZGl0RmllbGRUZXh0KEZYX0lOVDMyIG5CbG9ja0luZGV4LCBGWF9JTlQzMiBuRmllbGRJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGRUZXh0KSBjb25zdA0KK3sNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbbkJsb2NrSW5kZXhdOw0KKyAgICBwQmxvY2stPkdldEZpZWxkVGV4dChuRmllbGRJbmRleCwgd3NGaWVsZFRleHQpOw0KKyNlbmRpZg0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTdGFydEVkaXQoKQ0KK3sNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorI2VuZGlmDQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkVuZEVkaXQoKQ0KK3sNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorI2VuZGlmDQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZVNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ICkNCit7DQorICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwVGVtcCA9IE5VTEw7DQorICAgIEZYX0lOVDMyIG5SYW5nZUNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgblJhbmdlQ291bnQ7IGkgKyspIHsNCisgICAgICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbaV07DQorICAgICAgICBpZiAobHBUZW1wLT5uU3RhcnQgPT0gblN0YXJ0ICYmIGxwVGVtcC0+bkNvdW50ID09IG5Db3VudCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBscFRlbXA7DQorICAgICAgICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChpKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpBZGRTZWxSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCApDQorew0KKyAgICBpZiAobkNvdW50ID09IC0xKSB7DQorICAgICAgICBuQ291bnQgPSBHZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIgblNpemUJPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCisgICAgaWYgKG5TaXplIDw9IDApIHsNCisgICAgICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwU2VsUmFuZ2UgPSBGWF9ORVcgRkRFX1RYVEVEVFNFTFJBTkdFOw0KKyAgICAgICAgbHBTZWxSYW5nZS0+blN0YXJ0CT0gblN0YXJ0Ow0KKyAgICAgICAgbHBTZWxSYW5nZS0+bkNvdW50CT0gbkNvdW50Ow0KKyAgICAgICAgbV9TZWxSYW5nZVB0ckFyci5BZGQobHBTZWxSYW5nZSk7DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBUZW1wID0gTlVMTDsNCisgICAgbHBUZW1wID0gbV9TZWxSYW5nZVB0ckFycltuU2l6ZSAtIDFdOw0KKyAgICBpZiAoblN0YXJ0ID49IGxwVGVtcC0+blN0YXJ0ICsgbHBUZW1wLT5uQ291bnQpIHsNCisgICAgICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwU2VsUmFuZ2UgPSBGWF9ORVcgRkRFX1RYVEVEVFNFTFJBTkdFOw0KKyAgICAgICAgbHBTZWxSYW5nZS0+blN0YXJ0CT0gblN0YXJ0Ow0KKyAgICAgICAgbHBTZWxSYW5nZS0+bkNvdW50CT0gbkNvdW50Ow0KKyAgICAgICAgbV9TZWxSYW5nZVB0ckFyci5BZGQobHBTZWxSYW5nZSk7DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIJbkVuZAkJPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KKyAgICBGWF9CT09MCQliQmVnaW4JCT0gRkFMU0U7DQorICAgIEZYX0lOVDMyCW5SYW5nZUJnbgk9IDA7DQorICAgIEZYX0lOVDMyCW5SYW5nZUNudAk9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuU2l6ZTsgaSArKykgew0KKyAgICAgICAgbHBUZW1wCQk9IG1fU2VsUmFuZ2VQdHJBcnJbaV07DQorICAgICAgICBGWF9JTlQzMiBuVGVtcEJnbgk9IGxwVGVtcC0+blN0YXJ0Ow0KKyAgICAgICAgRlhfSU5UMzIgblRlbXBFbmQJPSBuVGVtcEJnbiArIGxwVGVtcC0+bkNvdW50IC0gMTsNCisgICAgICAgIGlmIChiQmVnaW4pIHsNCisgICAgICAgICAgICBpZiAobkVuZCA8IG5UZW1wQmduKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoblN0YXJ0ID49IG5UZW1wQmduICYmIG5TdGFydCA8PSBuVGVtcEVuZCkgew0KKyAgICAgICAgICAgICAgICBuUmFuZ2VDbnQgKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBuUmFuZ2VDbnQgKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChuU3RhcnQgPD0gblRlbXBFbmQpIHsNCisgICAgICAgICAgICAgICAgblJhbmdlQmduID0gaTsNCisgICAgICAgICAgICAgICAgaWYgKG5FbmQgPCBuVGVtcEJnbikgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgblJhbmdlQ250ID0gMTsNCisgICAgICAgICAgICAgICAgYkJlZ2luID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG5SYW5nZUNudCA9PSAwKSB7DQorICAgICAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFNlbFJhbmdlID0gRlhfTkVXIEZERV9UWFRFRFRTRUxSQU5HRTsNCisgICAgICAgIGxwU2VsUmFuZ2UtPm5TdGFydAk9IG5TdGFydDsNCisgICAgICAgIGxwU2VsUmFuZ2UtPm5Db3VudAk9IG5Db3VudDsNCisgICAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuSW5zZXJ0QXQoblJhbmdlQmduLCBscFNlbFJhbmdlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbblJhbmdlQmduXTsNCisgICAgICAgIGxwVGVtcC0+blN0YXJ0ID0gblN0YXJ0Ow0KKyAgICAgICAgbHBUZW1wLT5uQ291bnQgPSBuQ291bnQ7DQorICAgICAgICBuUmFuZ2VDbnQgLS07DQorICAgICAgICBuUmFuZ2VCZ24gKys7DQorICAgICAgICB3aGlsZSAoblJhbmdlQ250LS0pIHsNCisgICAgICAgICAgICBkZWxldGUgbV9TZWxSYW5nZVB0ckFycltuUmFuZ2VCZ25dOw0KKyAgICAgICAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQXQoblJhbmdlQmduKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICAgIHJldHVybjsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50U2VsUmFuZ2VzKCkNCit7DQorICAgIHJldHVybiBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFNlbFJhbmdlKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgJm5TdGFydCkNCit7DQorICAgIG5TdGFydCA9IG1fU2VsUmFuZ2VQdHJBcnJbbkluZGV4XS0+blN0YXJ0Ow0KKyAgICByZXR1cm4gbV9TZWxSYW5nZVB0ckFycltuSW5kZXhdLT5uQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkNsZWFyU2VsZWN0aW9uKCkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpOw0KKyAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFJhbmdlID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIGxwUmFuZ2UgPSBtX1NlbFJhbmdlUHRyQXJyW2ldOw0KKyAgICAgICAgaWYgKGxwUmFuZ2UgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBscFJhbmdlOw0KKyAgICAgICAgICAgIGxwUmFuZ2UgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChuQ291bnQgJiYgbV9QYXJhbS5wRXZlbnRTaW5rKSB7DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVkbyhGWF9CU1RSIGJzUmVkbykNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSUZERV9UeHRFZHREb1JlY29yZCAqIHBEb1JlY29yZCA9IElGREVfVHh0RWR0RG9SZWNvcmQ6OkNyZWF0ZShic1JlZG8pOw0KKyAgICBGWFNZU19hc3NlcnQocERvUmVjb3JkKTsNCisgICAgaWYgKHBEb1JlY29yZCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiT0sgPSBwRG9SZWNvcmQtPlJlZG8oKTsNCisgICAgcERvUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBiT0s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlVuZG8oRlhfQlNUUiBic1VuZG8pDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwRG9SZWNvcmQgPSBJRkRFX1R4dEVkdERvUmVjb3JkOjpDcmVhdGUoYnNVbmRvKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBEb1JlY29yZCk7DQorICAgIGlmIChwRG9SZWNvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYk9LID0gcERvUmVjb3JkLT5VbmRvKCk7DQorICAgIHBEb1JlY29yZC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gYk9LOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEVuZ2luZTo6U3RhcnRMYXlvdXQoKQ0KK3sNCisgICAgTG9jaygpOw0KKyAgICBSZW1vdmVBbGxQYWdlcygpOw0KKyAgICBtX25MYXlvdXRQb3MgPSAwOw0KKyAgICBtX25MaW5lQ291bnQgPSAwOw0KKyAgICByZXR1cm4gMDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkRvTGF5b3V0KElGWF9QYXVzZSAqIHBQYXVzZSkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBOVUxMOw0KKyAgICBGWF9JTlQzMiBuTGluZUNvdW50ID0gMDsNCisgICAgZm9yICg7IG1fbkxheW91dFBvcyA8IG5Db3VudDsgbV9uTGF5b3V0UG9zICsrKSB7DQorICAgICAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbbV9uTGF5b3V0UG9zXTsNCisgICAgICAgIHBQYXJhZy0+Q2FsY0xpbmVzKCk7DQorICAgICAgICBuTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICAgICAgaWYgKChwUGF1c2UgIT0gTlVMTCkgJiYgKG5MaW5lQ291bnQgPiBtX25QYWdlTGluZUNvdW50KSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICAgICAgICBtX25MaW5lQ291bnQgKz0gbkxpbmVDb3VudDsNCisgICAgICAgICAgICByZXR1cm4gKCsrbV9uTGF5b3V0UG9zICAqIDEwMCkgLyBuQ291bnQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9uTGluZUNvdW50ICs9IG5MaW5lQ291bnQ7DQorICAgIHJldHVybiAxMDA7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkVuZExheW91dCgpDQorew0KKyAgICBVcGRhdGVQYWdlcygpOw0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoID0gR2V0VGV4dExlbmd0aCgpOw0KKyAgICBpZiAobV9uQ2FyZXQgPiBuTGVuZ3RoKSB7DQorICAgICAgICBtX25DYXJldCA9IG5MZW5ndGg7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkluZGV4ID0gbV9uQ2FyZXQ7DQorICAgIGlmICghbV9iQmVmb3JlKSB7DQorICAgICAgICBuSW5kZXggLS07DQorICAgIH0NCisgICAgbV9ydENhcmV0LlNldCgwLCAwLCAxLCBtX1BhcmFtLmZGb250U2l6ZSk7DQorICAgIFVubG9jaygpOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpPcHRpbWl6ZShJRlhfUGF1c2UgKiBwUGF1c2UgKQ0KK3sNCisgICAgcmV0dXJuIG1fcFR4dEJ1Zi0+T3B0aW1pemUocFBhdXNlKTsNCit9DQorSUZERV9UeHRFZHRCdWYgKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dEJ1ZigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKElGREVfVHh0RWR0QnVmKiltX3BUeHRCdWY7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnVmTGVuZ3RoKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSAtIDE7DQorfQ0KK0lGWF9UeHRCcmVhayAqIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnJlYWsoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcFRleHRCcmVhazsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldExpbmVDb3VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9uTGluZUNvdW50Ow0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UGFnZUxpbmVDb3VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9uUGFnZUxpbmVDb3VudDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50UGFyYWdzKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KK30NCitJRkRFX1R4dEVkdFBhcmFnKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UGFyYWcoRlhfSU5UMzIgblBhcmFnSW5kZXgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9QYXJhZ1B0ckFycmF5W25QYXJhZ0luZGV4XTsNCit9DQorSUZYX0NoYXJJdGVyKiBDRkRFX1R4dEVkdEVuZ2luZTo6Q3JlYXRlQ2hhckl0ZXIoKQ0KK3sNCisgICAgaWYgKCFtX3BUeHRCdWYpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmKTsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6OkxpbmUyUGFyYWcoRlhfSU5UMzIgblN0YXJ0UGFyYWcsIEZYX0lOVDMyIG5TdGFydExpbmVvZlBhcmFnLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkxpbmVJbmRleCwgRlhfSU5UMzIgJm5TdGFydExpbmUpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBuTGluZVRvdGFsID0gblN0YXJ0TGluZW9mUGFyYWc7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBOVUxMOw0KKyAgICBGWF9JTlQzMiBpID0gblN0YXJ0UGFyYWc7DQorICAgIGZvciAoOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgICAgICBuTGluZVRvdGFsICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICAgICAgaWYgKG5MaW5lVG90YWwgPiBuTGluZUluZGV4KSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgblN0YXJ0TGluZSA9IG5MaW5lVG90YWwgLSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgcmV0dXJuIGk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFByZURlbGV0ZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiBuTGVuZ3RoKQ0KK3sNCisgICAgR2V0VGV4dCh3c1RleHQsIDAsIEdldFRleHRCdWZMZW5ndGgoKSk7DQorICAgIHdzVGV4dC5EZWxldGUobkluZGV4LCBuTGVuZ3RoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UHJlSW5zZXJ0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuSW5kZXgsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoKQ0KK3sNCisgICAgR2V0VGV4dCh3c1RleHQsIDAsIEdldFRleHRCdWZMZW5ndGgoKSk7DQorICAgIEZYX0lOVDMyIG5TZWxJbmRleAk9IDA7DQorICAgIEZYX0lOVDMyIG5TZWxMZW5ndGgJPSAwOw0KKyAgICBGWF9JTlQzMiBuU2VsQ291bnQJPSBDb3VudFNlbFJhbmdlcygpOw0KKyAgICB3aGlsZSAoblNlbENvdW50IC0tKSB7DQorICAgICAgICBuU2VsTGVuZ3RoID0gR2V0U2VsUmFuZ2UoblNlbENvdW50LCBuU2VsSW5kZXgpOw0KKyAgICAgICAgd3NUZXh0LkRlbGV0ZShuU2VsSW5kZXgsIG5TZWxMZW5ndGgpOw0KKyAgICAgICAgbkluZGV4ID0gblNlbEluZGV4Ow0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgRlhfSU5UMzIJbk9sZExlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDV1NUUglwT2xkQnVmZmVyID0gRlhfTFBDV1NUUih3c1RleHQpOw0KKyAgICBGWF9MUFdTVFIgbHBCdWZmZXIgPSB3c1RlbXAuR2V0QnVmZmVyKG5PbGRMZW5ndGggKyBuTGVuZ3RoKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBwT2xkQnVmZmVyLCAobkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyBuSW5kZXgsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyBuSW5kZXggKyBuTGVuZ3RoLCBwT2xkQnVmZmVyICsgbkluZGV4LCAobk9sZExlbmd0aCAtIG5JbmRleCkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgd3NUZW1wLlJlbGVhc2VCdWZmZXIobk9sZExlbmd0aCArIG5MZW5ndGgpOw0KKyAgICB3c1RleHQgPSB3c1RlbXA7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFByZVJlcGxhY2VUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgbk9yaWdpbkxlbmd0aCwgRlhfTFBDV1NUUiBscFRleHQsIEZYX0lOVDMyIG5MZW5ndGgpDQorew0KKyAgICBHZXRUZXh0KHdzVGV4dCwgMCwgR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCisgICAgRlhfSU5UMzIgblNlbEluZGV4CT0gMDsNCisgICAgRlhfSU5UMzIgblNlbExlbmd0aAk9IDA7DQorICAgIEZYX0lOVDMyIG5TZWxDb3VudAk9IENvdW50U2VsUmFuZ2VzKCk7DQorICAgIHdoaWxlIChuU2VsQ291bnQgLS0pIHsNCisgICAgICAgIG5TZWxMZW5ndGggPSBHZXRTZWxSYW5nZShuU2VsQ291bnQsIG5TZWxJbmRleCk7DQorICAgICAgICB3c1RleHQuRGVsZXRlKG5TZWxJbmRleCwgblNlbExlbmd0aCk7DQorICAgIH0NCisgICAgd3NUZXh0LkRlbGV0ZShuSW5kZXgsIG5PcmlnaW5MZW5ndGgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyspIHsNCisgICAgICAgIHdzVGV4dC5JbnNlcnQobkluZGV4ICsrLCBscFRleHRbaV0pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OklubmVyX0luc2VydChGWF9JTlQzMiBuU3RhcnQsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwKTsNCisgICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3MpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgICAgRlhfSU5UMzIgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gUGFyYWdQb3MublBhcmFnSW5kZXggKyAxOyBpIDwgblBhcmFnQ291bnQ7IGkgKyspIHsNCisgICAgICAgIG1fUGFyYWdQdHJBcnJheVtpXS0+bV9uQ2hhclN0YXJ0ICs9IG5MZW5ndGg7DQorICAgIH0NCisgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZwk9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQorICAgIEZYX0lOVDMyIG5SZXNlcnZlTGluZUNvdW50CT0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICAgIEZYX0lOVDMyIG5SZXNlcnZlQ2hhclN0YXJ0CT0gcFBhcmFnLT5tX25DaGFyU3RhcnQ7DQorICAgIEZYX0lOVDMyIG5MZWF2ZVBhcnQJCQk9IFBhcmFnUG9zLm5DaGFySW5kZXg7DQorICAgIEZYX0lOVDMyIG5DdXRQYXJ0CQkJPSBwUGFyYWctPm1fbkNoYXJDb3VudCAtIFBhcmFnUG9zLm5DaGFySW5kZXg7DQorICAgIEZYX0lOVDMyIG5UZXh0U3RhcnQJCQk9IDA7DQorICAgIEZYX1dDSEFSIHdDdXJDaGFyCT0gTCcgJzsNCisgICAgRlhfTFBDV1NUUiBscFBvcwk9IGxwVGV4dDsNCisgICAgRlhfQk9PTCBiRmlyc3QJCT0gVFJVRTsNCisgICAgRlhfSU5UMzIgblBhcmFnSW5kZXggPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsNCisgICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyssIGxwUG9zICsrKSB7DQorICAgICAgICB3Q3VyQ2hhciA9ICpscFBvczsNCisgICAgICAgIGlmICh3Q3VyQ2hhciA9PSBtX3dMaW5lRW5kKSB7DQorICAgICAgICAgICAgaWYgKGJGaXJzdCkgew0KKyAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IG5MZWF2ZVBhcnQgKyAoaSAtIG5UZXh0U3RhcnQgKyAxKTsNCisgICAgICAgICAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgICAgICAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQorICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBQYXJhZyA9IEZYX05FVyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOw0KKyAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IGkgLSBuVGV4dFN0YXJ0ICsgMTsNCisgICAgICAgICAgICAgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCisgICAgICAgICAgICAgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQorICAgICAgICAgICAgICAgIG5SZXNlcnZlQ2hhclN0YXJ0ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBuVGV4dFN0YXJ0ID0gaSArIDE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJGaXJzdCkgew0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgKz0gbkxlbmd0aDsNCisgICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgICAgICBiRmlyc3QgPSBGQUxTRTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBQYXJhZyA9IEZYX05FVyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOw0KKyAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlbmd0aCAtIG5UZXh0U3RhcnQgKyBuQ3V0UGFydDsNCisgICAgICAgIHBQYXJhZy0+bV9uQ2hhclN0YXJ0ID0gblJlc2VydmVDaGFyU3RhcnQ7DQorICAgICAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsNCisgICAgfQ0KKyAgICBtX3BUeHRCdWYtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbmd0aCk7DQorICAgIEZYX0lOVDMyIG5Ub3RhbExpbmVDb3VudCA9IDA7DQorICAgIGZvciAoaSA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4OyBpIDw9IG5QYXJhZ0luZGV4OyBpICsrKSB7DQorICAgICAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KKyAgICAgICAgblRvdGFsTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICB9DQorICAgIG1fbkxpbmVDb3VudCArPSAgblRvdGFsTGluZUNvdW50IC0gblJlc2VydmVMaW5lQ291bnQ7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgICAgVXBkYXRlUGFnZXMoKTsNCit9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJhd0luc2VydChGWF9JTlQzMiBuU3RhcnQsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwKTsNCisgICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3MpOw0KKyAgICBGWF9JTlQzMiBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleCArIDE7IGkgPCBuUGFyYWdDb3VudDsgaSArKykgew0KKyAgICAgICAgbV9QYXJhZ1B0ckFycmF5W2ldLT5tX25DaGFyU3RhcnQgKz0gbkxlbmd0aDsNCisgICAgfQ0KKyAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnCT0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zLm5QYXJhZ0luZGV4XTsNCisgICAgRlhfSU5UMzIgblJlc2VydmVMaW5lQ291bnQJPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgRlhfSU5UMzIgblJlc2VydmVDaGFyU3RhcnQJPSBwUGFyYWctPm1fbkNoYXJTdGFydDsNCisgICAgRlhfSU5UMzIgbkxlYXZlUGFydAkJCT0gUGFyYWdQb3MubkNoYXJJbmRleDsNCisgICAgRlhfSU5UMzIgbkN1dFBhcnQJCQk9IHBQYXJhZy0+bV9uQ2hhckNvdW50IC0gUGFyYWdQb3MubkNoYXJJbmRleDsNCisgICAgRlhfSU5UMzIgblRleHRTdGFydAkJCT0gMDsNCisgICAgRlhfV0NIQVIgd0N1ckNoYXIJPSBMJyAnOw0KKyAgICBGWF9MUENXU1RSIGxwUG9zCT0gbHBUZXh0Ow0KKyAgICBGWF9CT09MIGJGaXJzdAkJPSBUUlVFOw0KKyAgICBGWF9JTlQzMiBuUGFyYWdJbmRleCA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4Ow0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbkxlbmd0aDsgaSArKywgbHBQb3MgKyspIHsNCisgICAgICAgIHdDdXJDaGFyID0gKmxwUG9zOw0KKyAgICAgICAgaWYgKHdDdXJDaGFyID09IG1fd0xpbmVFbmQpIHsNCisgICAgICAgICAgICBpZiAoYkZpcnN0KSB7DQorICAgICAgICAgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlYXZlUGFydCArIChpIC0gblRleHRTdGFydCArIDEpOw0KKyAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgICAgICAgICAgICBuUmVzZXJ2ZUNoYXJTdGFydCArPSBwUGFyYWctPm1fbkNoYXJDb3VudDsNCisgICAgICAgICAgICAgICAgYkZpcnN0ID0gRkFMU0U7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgICAgICAgICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgICAgICAgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gaSAtIG5UZXh0U3RhcnQgKyAxOw0KKyAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJTdGFydCA9IG5SZXNlcnZlQ2hhclN0YXJ0Ow0KKyAgICAgICAgICAgICAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsNCisgICAgICAgICAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG5UZXh0U3RhcnQgPSBpICsgMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkZpcnN0KSB7DQorICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCArPSBuTGVuZ3RoOw0KKyAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuTGVuZ3RoIC0gblRleHRTdGFydCArIG5DdXRQYXJ0Ow0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCisgICAgICAgIG1fUGFyYWdQdHJBcnJheS5JbnNlcnRBdCgrK25QYXJhZ0luZGV4LCBwUGFyYWcpOw0KKyAgICB9DQorICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuZ3RoKTsNCit9DQorI2VuZGlmDQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6SW5uZXJfRGVsZXRlUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgKQ0KK3sNCisgICAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICAgICAgbkNvdW50ID0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkVuZCA9IG5TdGFydCArIG5Db3VudCAtIDE7DQorICAgIEZYU1lTX2Fzc2VydChuU3RhcnQgPj0gMCAmJiBuRW5kIDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zQmduLCBQYXJhZ1Bvc0VuZDsNCisgICAgVGV4dFBvczJQYXJhZ1BvcyhuU3RhcnQsIFBhcmFnUG9zQmduKTsNCisgICAgVGV4dFBvczJQYXJhZ1BvcyhuRW5kLCBQYXJhZ1Bvc0VuZCk7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NFbmQublBhcmFnSW5kZXhdOw0KKyAgICBGWF9CT09MIGJMYXN0UGFyYWcgPSBGQUxTRTsNCisgICAgaWYgKFBhcmFnUG9zRW5kLm5DaGFySW5kZXggPT0gcFBhcmFnLT5tX25DaGFyQ291bnQgLSAxKSB7DQorICAgICAgICBpZiAoUGFyYWdQb3NFbmQublBhcmFnSW5kZXggPCBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpIC0gMSkgew0KKyAgICAgICAgICAgIFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4ICsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBiTGFzdFBhcmFnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuVG90YWxMaW5lQ291bnQJPSAwOw0KKyAgICBGWF9JTlQzMiBuVG90YWxDaGFyQ291bnQJPSAwOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gUGFyYWdQb3NCZ24ublBhcmFnSW5kZXg7IGkgPD0gUGFyYWdQb3NFbmQublBhcmFnSW5kZXg7IGkgKyspIHsNCisgICAgICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KKyAgICAgICAgblRvdGFsTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICAgICAgblRvdGFsQ2hhckNvdW50ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KKyAgICB9DQorICAgIG1fcFR4dEJ1Zi0+RGVsZXRlKG5TdGFydCwgbkNvdW50KTsNCisgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBFbmRQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleF07DQorICAgIEZYX0lOVDMyIG5OZXh0UGFyYWdJbmRleCA9IChQYXJhZ1Bvc0Jnbi5uQ2hhckluZGV4ID09IDAgJiYgYkxhc3RQYXJhZykgPyBQYXJhZ1Bvc0Jnbi5uUGFyYWdJbmRleCA6IFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFnUG9zQmduLm5QYXJhZ0luZGV4ICsgMSk7DQorICAgIGZvciAoaSA9IG5OZXh0UGFyYWdJbmRleDsgaSA8PSBQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleDsgaSArKykgew0KKyAgICAgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtuTmV4dFBhcmFnSW5kZXhdOw0KKyAgICAgICAgZGVsZXRlIHBQYXJhZzsNCisgICAgICAgIG1fUGFyYWdQdHJBcnJheS5SZW1vdmVBdChuTmV4dFBhcmFnSW5kZXgpOw0KKyAgICB9DQorICAgIGlmICghKGJMYXN0UGFyYWcgJiYgUGFyYWdQb3NCZ24ubkNoYXJJbmRleCA9PSAwKSkgew0KKyAgICAgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zQmduLm5QYXJhZ0luZGV4XTsNCisgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gblRvdGFsQ2hhckNvdW50IC0gbkNvdW50Ow0KKyAgICAgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCisgICAgICAgIG5Ub3RhbExpbmVDb3VudCAtPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICAgIGZvciAoaSA9IG5OZXh0UGFyYWdJbmRleDsgaSA8IG5QYXJhZ0NvdW50OyBpICsrKSB7DQorICAgICAgICBtX1BhcmFnUHRyQXJyYXlbaV0tPm1fbkNoYXJTdGFydCAtPSBuQ291bnQ7DQorICAgIH0NCisgICAgbV9uTGluZUNvdW50IC09IG5Ub3RhbExpbmVDb3VudDsNCisgICAgVXBkYXRlUGFnZXMoKTsNCisgICAgRlhfSU5UMzIgblBhZ2VDb3VudCA9IENvdW50UGFnZXMoKTsNCisgICAgaWYgKG1fbkNhcmV0UGFnZSA+PSBuUGFnZUNvdW50KSB7DQorICAgICAgICBtX25DYXJldFBhZ2UgPSBuUGFnZUNvdW50IC0gMTsNCisgICAgfQ0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZVJhbmdlX0RvUmVjb3JkKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50LCBGWF9CT09MIGJTZWwgKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+PSAwKTsNCisgICAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICAgICAgbkNvdW50ID0gR2V0VGV4dExlbmd0aCgpIC0gblN0YXJ0Ow0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydCgoblN0YXJ0ICsgbkNvdW50KSA8PSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBGWF9JTlQzMiBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICAgIGlmIChuQmxvY2tDb3VudCA+IDApIHsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUmFuZ2U7DQorICAgICAgICBtX3BUeHRCdWYtPkdldFJhbmdlKHdzUmFuZ2UsIG5TdGFydCwgbkNvdW50KTsNCisgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UodGhpcywgblN0YXJ0LCBtX25DYXJldCwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1JhbmdlLCBiU2VsKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQorICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICAgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIG1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZQk9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0RlbGV0ZTsNCisgICAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkNvdW50KTsNCisgICAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZXNldEVuZ2luZSgpDQorew0KKyAgICBSZW1vdmVBbGxQYWdlcygpOw0KKyAgICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgbV9uQ2FyZXQgPSAwOw0KKyAgICBtX3BUeHRCdWYtPkNsZWFyKEZBTFNFKTsNCisgICAgbV9uQ2FyZXQgPSAwOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZWJ1aWxkUGFyYWdyYXBocygpDQorew0KKyAgICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgICAgRlhfV0NIQVIgd0NoYXIJCQk9IEwnICc7DQorICAgIEZYX1dDSEFSIHdDaGFyUHJlCQk9IEwnICc7DQorICAgIEZYX0lOVDMyIG5QYXJhZ1N0YXJ0CT0gMDsNCisgICAgRlhfSU5UMzIgbkNvdW50CQkJPSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgbkluZGV4CQkJCT0gMDsNCisgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZwk9IE5VTEw7DQorICAgIElGWF9DaGFySXRlciAqIHBJdGVyCT0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1Zik7DQorICAgIHBJdGVyLT5TZXRBdCgwKTsNCisgICAgZG8gew0KKyAgICAgICAgd0NoYXIJPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgbkluZGV4CT0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgICBpZiAod0NoYXIgPT0gbV93TGluZUVuZCkgew0KKyAgICAgICAgICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBGWF9ORVcgQ0ZERV9UeHRFZHRQYXJhZyh0aGlzKTsNCisgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJTdGFydCA9IG5QYXJhZ1N0YXJ0Ow0KKyAgICAgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkluZGV4IC0gblBhcmFnU3RhcnQgKyAxOw0KKyAgICAgICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgICAgICAgICAgbV9QYXJhZ1B0ckFycmF5LkFkZChwUGFyYWcpOw0KKyAgICAgICAgICAgIG5QYXJhZ1N0YXJ0ID0gbkluZGV4ICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAocEl0ZXItPk5leHQoKSk7DQorICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZUFsbFBhcmFncygpDQorew0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgICAgIGlmIChwUGFyYWcpIHsNCisgICAgICAgICAgICBkZWxldGUgcFBhcmFnOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fUGFyYWdQdHJBcnJheS5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVtb3ZlQWxsUGFnZXMoKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgSUZERV9UeHRFZHRQYWdlICogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVtpXTsNCisgICAgICAgIGlmIChwUGFnZSkgew0KKyAgICAgICAgICAgIHBQYWdlLT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9QYWdlUHRyQXJyYXkuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZVBhcmFncygpDQorew0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAobkNvdW50ID09IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gTlVMTDsNCisgICAgRlhfSU5UMzIgbkxpbmVDb3VudCA9IDA7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgICAgICBpZiAocFBhcmFnLT5tX25MaW5lQ291bnQgPT0gLTEpIHsNCisgICAgICAgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkxpbmVDb3VudCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgfQ0KKyAgICBtX25MaW5lQ291bnQgPSBuTGluZUNvdW50Ow0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVQYWdlcygpDQorew0KKyAgICBpZiAobV9uTGluZUNvdW50ID09IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuUGFnZUNvdW50CT0gKG1fbkxpbmVDb3VudCAtIDEpIC8gKG1fblBhZ2VMaW5lQ291bnQpICsgMTsNCisgICAgRlhfSU5UMzIgblNpemUJCT0gbV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAoblNpemUgPT0gblBhZ2VDb3VudCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChuU2l6ZSA+IG5QYWdlQ291bnQpIHsNCisgICAgICAgIElGREVfVHh0RWR0UGFnZSAqIHBQYWdlID0gTlVMTDsNCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgZm9yIChpID0gblNpemUgLSAxOyBpID49IG5QYWdlQ291bnQ7IGkgLS0pIHsNCisgICAgICAgICAgICBwUGFnZSA9IG1fUGFnZVB0ckFycmF5W2ldOw0KKyAgICAgICAgICAgIGlmIChwUGFnZSkgew0KKyAgICAgICAgICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1BhZ2VQdHJBcnJheS5SZW1vdmVBdChpKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNvdW50Q2hhbmdlZCh0aGlzKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoblNpemUgPCBuUGFnZUNvdW50KSB7DQorICAgICAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwUGFnZSA9IE5VTEw7DQorICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgIGZvciAoaSA9IG5TaXplOyBpIDwgblBhZ2VDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgIHBQYWdlID0gSUZERV9UeHRFZHRQYWdlOjpDcmVhdGUodGhpcywgaSk7DQorICAgICAgICAgICAgbV9QYWdlUHRyQXJyYXkuQWRkKHBQYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNvdW50Q2hhbmdlZCh0aGlzKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVUeHRCcmVhaygpDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gbV9wVGV4dEJyZWFrLT5HZXRMYXlvdXRTdHlsZXMoKTsNCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzKSB7DQorICAgICAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgICB9DQorICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgICAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQ7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmUpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUmV2ZXJzZUxpbmU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9SZXZlcnNlTGluZTsNCisgICAgfQ0KKyAgICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9SVEwpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgICB9DQorICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0KSB7DQorICAgICAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQ7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ2hhclZlcnRpYWwpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFyczsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnM7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRXhwYW5kVGFiKSB7DQorICAgICAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0V4cGFuZFRhYjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGR3U3R5bGUgJj0gfiBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQXJhYmljQ29udGV4dCkgew0KKyAgICAgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNDb250ZXh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dDsNCisgICAgfQ0KKyAgICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9BcmFiaWNTaGFwZXMpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOw0KKyAgICB9DQorICAgIG1fcFRleHRCcmVhay0+U2V0TGF5b3V0U3R5bGVzKGR3U3R5bGUpOw0KKyAgICBGWF9EV09SRCBkd0FsaWdtZW50ID0gMDsNCisgICAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQpIHsNCisgICAgICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQ7DQorICAgIH0gZWxzZSBpZiAobV9QYXJhbS5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkKSB7DQorICAgICAgICBkd0FsaWdtZW50IHw9IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQ7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIpIHsNCisgICAgICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXI7DQorICAgIH0gZWxzZSBpZihtX1BhcmFtLmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fUmlnaHQpIHsNCisgICAgICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodDsNCisgICAgfQ0KKyAgICBtX3BUZXh0QnJlYWstPlNldEFsaWdubWVudChkd0FsaWdtZW50KTsNCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCisgICAgICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwKSB7DQorICAgICAgICAgICAgbV9wVGV4dEJyZWFrLT5TZXRMaW5lV2lkdGgobV9QYXJhbS5mUGxhdGVIZWlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChGREVfUEFHRVdJRFRIX01BWCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCkgew0KKyAgICAgICAgICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKG1fUGFyYW0uZlBsYXRlV2lkdGgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChGREVfUEFHRVdJRFRIX01BWCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9uUGFnZUxpbmVDb3VudCA9IG1fUGFyYW0ubkxpbmVDb3VudDsNCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDb21iV2lkdGggPSBtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BhcmFtLmZQbGF0ZUhlaWdodCA6IG1fUGFyYW0uZlBsYXRlV2lkdGg7DQorICAgICAgICBpZiAobV9uTGltaXQgPiAwKSB7DQorICAgICAgICAgICAgZkNvbWJXaWR0aCAvPSBtX25MaW1pdDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFRleHRCcmVhay0+U2V0Q29tYldpZHRoKGZDb21iV2lkdGgpOw0KKyAgICB9DQorICAgIG1fcFRleHRCcmVhay0+U2V0Rm9udChtX1BhcmFtLnBGb250KTsNCisgICAgbV9wVGV4dEJyZWFrLT5TZXRGb250U2l6ZShtX1BhcmFtLmZGb250U2l6ZSk7DQorICAgIG1fcFRleHRCcmVhay0+U2V0VGFiV2lkdGgobV9QYXJhbS5mVGFiV2lkdGgsIG1fUGFyYW0uYlRhYkVxdWlkaXN0YW50KTsNCisgICAgbV9wVGV4dEJyZWFrLT5TZXREZWZhdWx0Q2hhcihtX1BhcmFtLndEZWZDaGFyKTsNCisgICAgbV9wVGV4dEJyZWFrLT5TZXRQYXJhZ3JhcGhCcmVha0NoYXIobV9QYXJhbS53TGluZUJyZWFrQ2hhcik7DQorICAgIG1fcFRleHRCcmVhay0+U2V0Q2hhclJvdGF0aW9uKG1fUGFyYW0ubkNoYXJSb3RhdGlvbik7DQorICAgIG1fcFRleHRCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKG1fUGFyYW0uZkZvbnRTaXplICogMC4yZik7DQorICAgIG1fcFRleHRCcmVhay0+U2V0SG9yaXpvbnRhbFNjYWxlKG1fUGFyYW0ubkhvcnpTY2FsZSk7DQorICAgIG1fcFRleHRCcmVhay0+U2V0Q2hhclNwYWNlKG1fUGFyYW0uZkNoYXJTcGFjZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlcGxhY2VQYXJhZ0VuZChGWF9MUFdTVFIgJmxwVGV4dCwgRlhfSU5UMzIgJm5MZW5ndGgsIEZYX0JPT0wgYlByZUlzQ1IgKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyspIHsNCisgICAgICAgIEZYX1dDSEFSIHdjID0gbHBUZXh0W2ldOw0KKyAgICAgICAgc3dpdGNoKHdjKSB7DQorICAgICAgICAgICAgY2FzZSBMJ1xyJzogew0KKyAgICAgICAgICAgICAgICAgICAgbHBUZXh0W2ldCT0gbV93TGluZUVuZDsNCisgICAgICAgICAgICAgICAgICAgIGJQcmVJc0NSCT0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEwnXG4nOiB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlByZUlzQ1IgPT0gVFJVRSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5OZXh0ID0gaSArIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5OZXh0IDwgbkxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKGxwVGV4dCArIGksIGxwVGV4dCArIG5OZXh0LCAobkxlbmd0aCAtIG5OZXh0KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpIC0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGgJLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgYlByZUlzQ1IgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9iQXV0b0xpbmVFbmQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUkxGOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBdXRvTGluZUVuZAk9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbHBUZXh0W2ldID0gbV93TGluZUVuZDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9iQXV0b0xpbmVFbmQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9MRjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQXV0b0xpbmVFbmQJPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJQcmVJc0NSICYmIG1fYkF1dG9MaW5lRW5kKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUjsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2JBdXRvTGluZUVuZAk9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYlByZUlzQ1IgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gYlByZUlzQ1I7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlY292ZXJQYXJhZ0VuZChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgRlhfV0NIQVIgd2MgPSAobV9uRmlyc3RMaW5lRW5kID09IEZERV9UWFRFRElUX0xJTkVFTkRfQ1IpID8gTCdcbicgOiBMJ1xyJzsNCisgICAgaWYgKG1fbkZpcnN0TGluZUVuZCA9PSBGREVfVFhURURJVF9MSU5FRU5EX0NSTEYpIHsNCisgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0lOVDMyPiBQb3NBcnI7DQorICAgICAgICBGWF9JTlQzMiBuTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KKyAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICBGWF9MUFdTVFIgbHBQb3MgPSAoRlhfTFBXU1RSKShGWF9MUENXU1RSKXdzVGV4dDsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuTGVuZ3RoOyBpICsrLCBscFBvcyArKykgew0KKyAgICAgICAgICAgIGlmICgqbHBQb3MgPT0gbV93TGluZUVuZCkgew0KKyAgICAgICAgICAgICAgICAqbHBQb3MgPSB3YzsNCisgICAgICAgICAgICAgICAgUG9zQXJyLkFkZChpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9MUENXU1RSIGxwU3JjQnVmID0gRlhfTFBDV1NUUih3c1RleHQpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgRlhfSU5UMzIgbkNvdW50ID0gUG9zQXJyLkdldFNpemUoKTsNCisgICAgICAgIEZYX0xQV1NUUiBscERzdEJ1ZiA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCArIG5Db3VudCk7DQorICAgICAgICBGWF9JTlQzMiBuRHN0UG9zID0gMDsNCisgICAgICAgIEZYX0lOVDMyIG5TcmNQb3MgPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5Qb3MgPSBQb3NBcnJbaV07DQorICAgICAgICAgICAgRlhfSU5UMzIgbkNvcHlMZW4gPSBuUG9zIC0gblNyY1BvcyArIDE7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmICsgbkRzdFBvcywgbHBTcmNCdWYgKyBuU3JjUG9zLCBuQ29weUxlbiAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgICAgICAgIG5Ec3RQb3MgKz0gbkNvcHlMZW47DQorICAgICAgICAgICAgblNyY1BvcyArPSBuQ29weUxlbjsNCisgICAgICAgICAgICBscERzdEJ1ZltuRHN0UG9zXSA9IEwnXG4nOw0KKyAgICAgICAgICAgIG5Ec3RQb3MgKys7DQorICAgICAgICB9DQorICAgICAgICBpZiAoblNyY1BvcyA8IG5MZW5ndGgpIHsNCisgICAgICAgICAgICBGWFNZU19tZW1jcHkobHBEc3RCdWYgKyBuRHN0UG9zLCBscFNyY0J1ZiArIG5TcmNQb3MsIChuTGVuZ3RoIC0gblNyY1BvcykgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICAgIH0NCisgICAgICAgIHdzVGVtcC5SZWxlYXNlQnVmZmVyKG5MZW5ndGggKyBuQ291bnQpOw0KKyAgICAgICAgd3NUZXh0ID0gd3NUZW1wOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgIEZYX0xQV1NUUiBscEJ1ZiA9IChGWF9MUFdTVFIpKEZYX0xQQ1dTVFIpd3NUZXh0Ow0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyssIGxwQnVmKyspIHsNCisgICAgICAgICAgICBpZiAoKmxwQnVmID09IG1fd0xpbmVFbmQpIHsNCisgICAgICAgICAgICAgICAgKmxwQnVmID0gd2M7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlUGFnZTJDaGFyKEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCk7DQorICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPD0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyAgICBpZiAobV9uQ2FyZXRQYWdlID49IDApIHsNCisgICAgICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVttX25DYXJldFBhZ2VdOw0KKyAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICAgICAgRlhfSU5UMzIgblBhZ2VDaGFyU3RhcnQgPSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7DQorICAgICAgICBGWF9JTlQzMiBuUGFnZUNoYXJDb3VudCA9IHBQYWdlLT5HZXRDaGFyQ291bnQoKTsNCisgICAgICAgIGlmIChuSW5kZXggPj0gblBhZ2VDaGFyU3RhcnQgJiYgbkluZGV4IDwgblBhZ2VDaGFyU3RhcnQgKyBuUGFnZUNoYXJDb3VudCkgew0KKyAgICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICAgICAgICAgIHJldHVybiBtX25DYXJldFBhZ2U7DQorICAgICAgICB9DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgICAgfQ0KKyAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gTlVMTDsNCisgICAgRlhfSU5UMzIgbkxpbmVDb3VudAkJPSAwOw0KKyAgICBGWF9JTlQzMiBuUGFyYWdDb3VudAk9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgblBhcmFnQ291bnQ7IGkgKyspIHsNCisgICAgICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgICAgIGlmIChwUGFyYWctPm1fbkNoYXJTdGFydCA8PSBuSW5kZXggJiYgbkluZGV4IDwgKHBQYXJhZy0+bV9uQ2hhclN0YXJ0ICsgcFBhcmFnLT5tX25DaGFyQ291bnQpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBuTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICB9DQorICAgIHBQYXJhZy0+TG9hZFBhcmFnKCk7DQorICAgIEZYX0lOVDMyIG5MaW5lU3RhcnQJCT0gLTE7DQorICAgIEZYX0lOVDMyIG5MaW5lQ2hhckNvdW50ID0gLTE7DQorICAgIGZvciAoaSA9IDA7IGkgPCBwUGFyYWctPm1fbkxpbmVDb3VudDsgaSArKykgew0KKyAgICAgICAgcFBhcmFnLT5HZXRMaW5lUmFuZ2UoaSwgbkxpbmVTdGFydCwgbkxpbmVDaGFyQ291bnQpOw0KKyAgICAgICAgaWYgKG5MaW5lU3RhcnQgPD0gbkluZGV4ICYmIG5JbmRleCA8IChuTGluZVN0YXJ0ICsgbkxpbmVDaGFyQ291bnQpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KGkgPCBwUGFyYWctPm1fbkxpbmVDb3VudCk7DQorICAgIG5MaW5lQ291bnQgKz0gKGkgKyAxKTsNCisgICAgbV9uQ2FyZXRQYWdlID0gKG5MaW5lQ291bnQgLSAxKSAvIG1fblBhZ2VMaW5lQ291bnQgKyAxIC0gMTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQorICAgIHBQYXJhZy0+VW5sb2FkUGFyYWcoKTsNCisgICAgcmV0dXJuIG1fbkNhcmV0UGFnZTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VGV4dFBvczJQYXJhZ1BvcyhGWF9JTlQzMiBuSW5kZXgsIEZERV9UWFRFRFRQQVJBR1BPUyAmUGFyYWdQb3MpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBuQmduID0gMDsNCisgICAgRlhfSU5UMzIgbk1pZCA9IDA7DQorICAgIEZYX0lOVDMyIG5FbmQgPSBuQ291bnQgLSAxOw0KKyAgICB3aGlsZSAobkVuZCA+IG5CZ24pIHsNCisgICAgICAgIG5NaWQgPSAobkJnbiArIG5FbmQpIC8gMjsNCisgICAgICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbbk1pZF07DQorICAgICAgICBpZiAobkluZGV4IDwgcFBhcmFnLT5tX25DaGFyU3RhcnQpIHsNCisgICAgICAgICAgICBuRW5kID0gbk1pZCAtIDE7DQorICAgICAgICB9IGVsc2UgaWYgKG5JbmRleCA+PSAocFBhcmFnLT5tX25DaGFyU3RhcnQgKyBwUGFyYWctPm1fbkNoYXJDb3VudCkpIHsNCisgICAgICAgICAgICBuQmduID0gbk1pZCArIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChuQmduID09IG5FbmQpIHsNCisgICAgICAgIG5NaWQgPSBuQmduOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyU3RhcnQgJiYgXA0KKyAgICAgICAgICAgICAgICAgKG5JbmRleCA8IG1fUGFyYWdQdHJBcnJheVtuTWlkXS0+bV9uQ2hhclN0YXJ0ICsgbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyQ291bnQpKTsNCisgICAgUGFyYWdQb3MublBhcmFnSW5kZXgJPSBuTWlkOw0KKyAgICBQYXJhZ1Bvcy5uQ2hhckluZGV4CQk9IG5JbmRleCAtIG1fUGFyYWdQdHJBcnJheVtuTWlkXS0+bV9uQ2hhclN0YXJ0Ow0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUZvcndhcmQoRlhfQk9PTCAmYkJlZm9yZSkNCit7DQorICAgIGlmIChtX25DYXJldCA9PSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSAtIDEpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuQ2FyZXQgPSBtX25DYXJldDsNCisgICAgaWYgKChuQ2FyZXQgKyAxIDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpICYmIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCkgPT0gTCdccicpICYmIFwNCisgICAgICAgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQgKyAxKSA9PSBMJ1xuJykpIHsNCisgICAgICAgIG5DYXJldCArKzsNCisgICAgfQ0KKyAgICBuQ2FyZXQgKys7DQorICAgIGJCZWZvcmUgPSBUUlVFOw0KKyAgICByZXR1cm4gbkNhcmV0Ow0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUJhY2t3YXJkKEZYX0JPT0wgJmJCZWZvcmUpDQorew0KKyAgICBpZiAobV9uQ2FyZXQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5DYXJldCA9IG1fbkNhcmV0Ow0KKyAgICBpZiAobkNhcmV0ID4gMiAmJiBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDEpID09IEwnXG4nICYmIFwNCisgICAgICAgICAgICBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDIpID09IEwnXHInKSB7DQorICAgICAgICBuQ2FyZXQgLS07DQorICAgIH0NCisgICAgbkNhcmV0IC0tOw0KKyAgICBiQmVmb3JlID0gVFJVRTsNCisgICAgcmV0dXJuIG5DYXJldDsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZVVwKENGWF9Qb2ludEYgJnB0Q2FyZXQpDQorew0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwUGFnZQkJPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQorICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDb250ZW50CT0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgICAgICBwdENhcmV0LnggPSBtX3J0Q2FyZXQubGVmdCArIG1fcnRDYXJldC53aWR0aCAvIDIgLSBtX1BhcmFtLmZMaW5lU3BhY2U7DQorICAgICAgICBwdENhcmV0LnkgPSBtX2ZDYXJldFBvc1Jlc2VydmU7DQorICAgICAgICBGWF9CT09MIGJMaW5lUmVzZXJ2ZSA9IG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmU7DQorICAgICAgICBpZiAocHRDYXJldC54IDwgcnRDb250ZW50LmxlZnQpIHsNCisgICAgICAgICAgICBpZiAoYkxpbmVSZXNlcnZlKSB7DQorICAgICAgICAgICAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gQ291bnRQYWdlcygpIC0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKG1fbkNhcmV0UGFnZSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGJMaW5lUmVzZXJ2ZSkgew0KKyAgICAgICAgICAgICAgICBtX25DYXJldFBhZ2UgKys7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9uQ2FyZXRQYWdlIC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDaGFuZ2UodGhpcywgbV9uQ2FyZXRQYWdlKTsNCisgICAgICAgICAgICBwdENhcmV0LnggLT0gcnRDb250ZW50LmxlZnQ7DQorICAgICAgICAgICAgSUZERV9UeHRFZHRQYWdlICogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQorICAgICAgICAgICAgcHRDYXJldC54ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLnJpZ2h0KCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwdENhcmV0LnggPSBtX2ZDYXJldFBvc1Jlc2VydmU7DQorICAgICAgICBwdENhcmV0LnkgPSBtX3J0Q2FyZXQudG9wICsgbV9ydENhcmV0LmhlaWdodCAvIDIgLSBtX1BhcmFtLmZMaW5lU3BhY2U7DQorICAgICAgICBpZiAocHRDYXJldC55IDwgcnRDb250ZW50LnRvcCkgew0KKyAgICAgICAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHB0Q2FyZXQueSAtPSBydENvbnRlbnQudG9wOw0KKyAgICAgICAgICAgIG1fbkNhcmV0UGFnZSAtLTsNCisgICAgICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDaGFuZ2UodGhpcywgbV9uQ2FyZXRQYWdlKTsNCisgICAgICAgICAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwQ3VyUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgICAgICAgICAgICBwdENhcmV0LnkgKz0gcEN1clBhZ2UtPkdldENvbnRlbnRzQm94KCkuYm90dG9tKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVEb3duKENGWF9Qb2ludEYgJnB0Q2FyZXQpDQorew0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENvbnRlbnQgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCisgICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCisgICAgICAgIHB0Q2FyZXQueCA9IG1fcnRDYXJldC5sZWZ0ICsgbV9ydENhcmV0LndpZHRoIC8gMiArIG1fUGFyYW0uZkxpbmVTcGFjZTsNCisgICAgICAgIHB0Q2FyZXQueSA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsNCisgICAgICAgIGlmIChwdENhcmV0LnggPj0gcnRDb250ZW50LnJpZ2h0KCkpIHsNCisgICAgICAgICAgICBGWF9CT09MIGJMaW5lUmVzZXJ2ZSA9IG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmU7DQorICAgICAgICAgICAgaWYgKGJMaW5lUmVzZXJ2ZSkgew0KKyAgICAgICAgICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gQ291bnRQYWdlcygpIC0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiTGluZVJlc2VydmUpIHsNCisgICAgICAgICAgICAgICAgbV9uQ2FyZXRQYWdlIC0tOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fbkNhcmV0UGFnZSArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQorICAgICAgICAgICAgcHRDYXJldC54IC09IHJ0Q29udGVudC5yaWdodCgpOw0KKyAgICAgICAgICAgIElGREVfVHh0RWR0UGFnZSAqIHBDdXJQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KKyAgICAgICAgICAgIHB0Q2FyZXQueCArPSBwQ3VyUGFnZS0+R2V0Q29udGVudHNCb3goKS5sZWZ0Ow0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcHRDYXJldC54ID0gbV9mQ2FyZXRQb3NSZXNlcnZlOw0KKyAgICAgICAgcHRDYXJldC55ID0gbV9ydENhcmV0LnRvcCArIG1fcnRDYXJldC5oZWlnaHQgLyAyICsgbV9QYXJhbS5mTGluZVNwYWNlOw0KKyAgICAgICAgaWYgKHB0Q2FyZXQueSA+PSBydENvbnRlbnQuYm90dG9tKCkpIHsNCisgICAgICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IENvdW50UGFnZXMoKSAtIDEpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwdENhcmV0LnkgLT0gcnRDb250ZW50LmJvdHRvbSgpOw0KKyAgICAgICAgICAgIG1fbkNhcmV0UGFnZSArKzsNCisgICAgICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDaGFuZ2UodGhpcywgbV9uQ2FyZXRQYWdlKTsNCisgICAgICAgICAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwQ3VyUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgICAgICAgICAgICBwdENhcmV0LnkgKz0gcEN1clBhZ2UtPkdldENvbnRlbnRzQm94KCkudG9wOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlTGluZVN0YXJ0KCkNCit7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQorICAgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgICBwUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgICBGWF9JTlQzMiBuTGluZUNvdW50ID0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBGWF9JTlQzMiBuU3RhcnQgPSAwOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSAwOw0KKyAgICBmb3IgKDsgaSA8IG5MaW5lQ291bnQ7IGkgKyspIHsNCisgICAgICAgIHBQYXJhZy0+R2V0TGluZVJhbmdlKGksIG5TdGFydCwgbkNvdW50KTsNCisgICAgICAgIGlmIChuSW5kZXggPj0gblN0YXJ0ICYmIG5JbmRleCA8IG5TdGFydCArIG5Db3VudCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIFVwZGF0ZUNhcmV0UmVjdChuU3RhcnQsIFRSVUUpOw0KKyAgICBwUGFyYWctPlVubG9hZFBhcmFnKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlTGluZUVuZCgpDQorew0KKyAgICBGWF9JTlQzMiBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsNCisgICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgICBUZXh0UG9zMlBhcmFnUG9zKG5JbmRleCwgUGFyYWdQb3MpOw0KKyAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zLm5QYXJhZ0luZGV4XTsNCisgICAgcFBhcmFnLT5Mb2FkUGFyYWcoKTsNCisgICAgRlhfSU5UMzIgbkxpbmVDb3VudCA9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgRlhfSU5UMzIgblN0YXJ0ID0gMDsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gMDsNCisgICAgZm9yICg7IGkgPCBuTGluZUNvdW50OyBpICsrKSB7DQorICAgICAgICBwUGFyYWctPkdldExpbmVSYW5nZShpLCBuU3RhcnQsIG5Db3VudCk7DQorICAgICAgICBpZiAobkluZGV4ID49IG5TdGFydCAmJiBuSW5kZXggPCBuU3RhcnQgKyBuQ291bnQpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBuSW5kZXgJPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KKyAgICBGWFNZU19hc3NlcnQobkluZGV4IDw9IEdldFRleHRCdWZMZW5ndGgoKSk7DQorICAgIEZYX1dDSEFSIHdDaGFyCT0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOw0KKyAgICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgICAgaWYgKG5JbmRleCA8PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgICAgIGlmICh3Q2hhciA9PSBMJ1xyJykgew0KKyAgICAgICAgICAgIGJCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmICh3Q2hhciA9PSBMJ1xuJyAmJiBuSW5kZXggPiBuU3RhcnQpIHsNCisgICAgICAgICAgICBiQmVmb3JlID0gVFJVRTsNCisgICAgICAgICAgICBuSW5kZXggLS07DQorICAgICAgICAgICAgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQorICAgICAgICAgICAgaWYgKHdDaGFyICE9IEwnXHInKSB7DQorICAgICAgICAgICAgICAgIG5JbmRleCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgYkJlZm9yZSk7DQorICAgIHBQYXJhZy0+VW5sb2FkUGFyYWcoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVQYXJhZ1N0YXJ0KCkNCit7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQorICAgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgICBVcGRhdGVDYXJldFJlY3QocFBhcmFnLT5tX25DaGFyU3RhcnQsIFRSVUUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZVBhcmFnRW5kKCkNCit7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQorICAgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgICBuSW5kZXgJPSBwUGFyYWctPm1fbkNoYXJTdGFydCArIHBQYXJhZy0+bV9uQ2hhckNvdW50IC0gMTsNCisgICAgRlhfV0NIQVIgd0NoYXIJPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQorICAgIGlmICh3Q2hhciA9PSBMJ1xuJyAmJiBuSW5kZXggPiAwKSB7DQorICAgICAgICBuSW5kZXggLS07DQorICAgICAgICB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkluZGV4KTsNCisgICAgICAgIGlmICh3Q2hhciAhPSBMJ1xyJykgew0KKyAgICAgICAgICAgIG5JbmRleCArKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVIb21lKCkNCit7DQorICAgIFVwZGF0ZUNhcmV0UmVjdCgwLCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVFbmQoKQ0KK3sNCisgICAgVXBkYXRlQ2FyZXRSZWN0KEdldFRleHRCdWZMZW5ndGgoKSwgVFJVRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRFbmdpbmU6Ok5vcm1hbGl6ZUNhcmV0UG9zKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgbkZsYWdzLCBGWF9CT09MICZiQmVmb3JlKQ0KK3sNCisgICAgYkJlZm9yZSA9IFRSVUU7DQorICAgIEZYX0lOVDMyIG5CZ24gPSAwLCBuRW5kID0gMDsNCisgICAgRlhfSU5UMzIgblJlY29yZCA9IC0xOw0KKyAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gTlVMTDsNCisgICAgRlhfQk9PTCBiUmV0ID0gR2V0RmllbGRCb3VuZGFyeShuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICAgIEZYX0lOVDMyIG5EZWx0YSA9IDA7DQorICAgIGlmIChiUmV0ICYmICFwRmllbGQtPklzRml4KCkpIHsNCisgICAgICAgIGlmIChuSW5kZXggLSBuQmduIDwgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSkgew0KKyAgICAgICAgICAgIGlmIChuRmxhZ3MgPT0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgew0KKyAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEVkaXRhYmxlRmllbGQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRWRpdGFibGVGaWVsZCwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEVkaXRhYmxlRmllbGQtPk5vcm1hbGl6ZUNhcmV0UG9zKG5FbmQgLSBuQmduLCBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSArIG5CZ247DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbkluZGV4ID0gbkJnbiArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBuUmV0ID0gcEZpZWxkLT5Ob3JtYWxpemVDYXJldFBvcyhuSW5kZXggLSBuQmduLCAoRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04pbkZsYWdzKTsNCisgICAgICAgIGlmIChuUmV0ID49IDApIHsNCisgICAgICAgICAgICByZXR1cm4gblJldCArIG5CZ247DQorICAgICAgICB9DQorICAgICAgICBpZiAoblJldCA9PSAtMikgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5FZGl0YWJsZVBvc0JnbiA9IDAsIG5FZGl0YWJsZVBvc0VuZCA9IDA7DQorICAgICAgICAgICAgcEZpZWxkLT5HZXRFZGl0YWJsZVJhbmdlKG5FZGl0YWJsZVBvc0JnbiwgbkVkaXRhYmxlUG9zRW5kKTsNCisgICAgICAgICAgICBuUmVjb3JkID0gbkJnbiArIG5FZGl0YWJsZVBvc0JnbjsNCisgICAgICAgICAgICBuRmxhZ3MgPSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoblJldCA9PSAtMSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgbkVkaXRhYmxlUG9zQmduID0gMCwgbkVkaXRhYmxlUG9zRW5kID0gMDsNCisgICAgICAgICAgICBwRmllbGQtPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KKyAgICAgICAgICAgIG5SZWNvcmQgPSBuQmduICsgbkVkaXRhYmxlUG9zRW5kOw0KKyAgICAgICAgICAgIG5GbGFncyA9IEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmICghYlJldCkgew0KKyAgICAgICAgbkRlbHRhID0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSAtIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKG5GbGFncykgew0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQ6IHsNCisgICAgICAgICAgICAgICAgaWYgKEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbiwgbkVuZCwgcEZpZWxkKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MoRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEKSArICBuQmduOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5SZWNvcmQgIT0gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gblJlY29yZDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsgbkJnbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9DQVJFVF9NSURETEU6IHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkJnbjEgPSAwLCBuRW5kMSA9IDAsIG5CZ24yID0gMCwgbkVuZDIgPSAwOw0KKyAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEVkaXRhYmxlRmllbGQxID0gTlVMTDsNCisgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBFZGl0YWJsZUZpZWxkMiA9IE5VTEw7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldDEgPSBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24xLCBuRW5kMSwgcEVkaXRhYmxlRmllbGQxLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldDIgPSBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24yLCBuRW5kMiwgcEVkaXRhYmxlRmllbGQyKTsNCisgICAgICAgICAgICAgICAgaWYgKGJSZXQxID09IEZBTFNFKSB7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoYlJldDIpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBFZGl0YWJsZUZpZWxkMi0+Tm9ybWFsaXplQ2FyZXRQb3MoRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEKSArIG5CZ24yOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJSZXQyID09IEZBTFNFKSB7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoYlJldDEpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBFZGl0YWJsZUZpZWxkMS0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZDEgLSBuQmduMSwgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgKyBuQmduMTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5FZGl0YWJsZVBvc0JnbiA9IDAsIG5FZGl0YWJsZVBvc0VuZCA9IDA7DQorICAgICAgICAgICAgICAgICAgICBpZiAobkluZGV4IC0gbkVuZDEgPCBuQmduMiArIG5EZWx0YSAtIG5JbmRleCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGl0YWJsZUZpZWxkMS0+R2V0RWRpdGFibGVSYW5nZShuRWRpdGFibGVQb3NCZ24sIG5FZGl0YWJsZVBvc0VuZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5FZGl0YWJsZVBvc0VuZCArIG5CZ24xOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRpdGFibGVGaWVsZDItPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuRWRpdGFibGVQb3NCZ24gKyBuQmduMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRDogew0KKyAgICAgICAgICAgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsgbkJnbjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChuUmVjb3JkICE9IC0xKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5SZWNvcmQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBiUmV0ID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MoRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEKSArIG5CZ247DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICAgICAgICByZXR1cm4gbkluZGV4Ow0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEZpZWxkQm91bmRhcnkoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmbkJnbiwgRlhfSU5UMzIgJm5FbmQsIENGREVfVHh0RWR0RmllbGQgKiAmcEZpZWxkKQ0KK3sNCisgICAgQ0ZERV9UeHRFZHRCdWZJdGVyICogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICAgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQorICAgIGRvIHsNCisgICAgICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORCkgew0KKyAgICAgICAgICAgIG5FbmQJPSBwSXRlci0+R2V0QXQoKTsNCisgICAgICAgICAgICBiRmluZAk9IFRSVUU7DQorICAgICAgICAgICAgbkluZGV4IC0tOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQorICAgICAgICAgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCkpOw0KKyAgICBpZiAoIWJGaW5kKSB7DQorICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgICBkbyB7DQorICAgICAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCisgICAgICAgICAgICBuQmduID0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgICAgICAgcEl0ZXItPk5leHQoKTsNCisgICAgICAgICAgICBGWF9EV09SRCBkd1ByZSA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgICAgIHBJdGVyLT5OZXh0KCk7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCisgICAgICAgICAgICBwRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCAqKSgoZHdDdXIgPDwgMTYpIHwgZHdQcmUpOw0KKyAgICAgICAgICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAocEl0ZXItPk5leHQoVFJVRSkpOw0KKyAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OkZpbmRFZGl0YWJsZUZpZWxkKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgJm5CZ24sIEZYX0lOVDMyICZuRW5kLCBDRkRFX1R4dEVkdEZpZWxkICogJnBGaWVsZCwgRlhfQk9PTCBiRm9yd2FyZCApDQorew0KKyAgICBGWF9XQ0hBUiB3Y0ZpcnN0CT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR047DQorICAgIEZYX1dDSEFSIHdjU2Vjb25kCT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICAgIGlmICghYkZvcndhcmQpIHsNCisgICAgICAgIHdjRmlyc3QJCT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICAgICAgICB3Y1NlY29uZAk9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KKyAgICB9DQorICAgIENGREVfVHh0RWR0QnVmSXRlciAqIHBJdGVyID0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1ZiwgRkFMU0UpOw0KKyAgICBwSXRlci0+U2V0QXQobkluZGV4KTsNCisgICAgRlhfSU5UMzIgYkZpbmQgPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgRlhfV0NIQVIgd2MgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgaWYgKHdjID09IHdjRmlyc3QpIHsNCisgICAgICAgICAgICBuQmduCT0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgICAgICAgYkZpbmQJPSBUUlVFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChwSXRlci0+TmV4dCghYkZvcndhcmQpKTsNCisgICAgaWYgKCFiRmluZCkgew0KKyAgICAgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBiRmluZCA9IEZBTFNFOw0KKyAgICBkbyB7DQorICAgICAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgICBpZiAod2MgPT0gd2NTZWNvbmQpIHsNCisgICAgICAgICAgICBuRW5kID0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgICAgICAgYkZpbmQgPSBUUlVFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChwSXRlci0+TmV4dCghYkZvcndhcmQpKTsNCisgICAgRlhTWVNfYXNzZXJ0KGJGaW5kKTsNCisgICAgaWYgKCFiRm9yd2FyZCkgew0KKyAgICAgICAgRlhfSU5UMzIgblRlbXAgPSBuQmduOw0KKyAgICAgICAgbkJnbiA9IG5FbmQ7DQorICAgICAgICBuRW5kID0gblRlbXA7DQorICAgIH0NCisgICAgcEl0ZXItPlNldEF0KG5CZ24gKyAxKTsNCisgICAgRlhfRFdPUkQgZHdQcmUgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCisgICAgcEl0ZXItPk5leHQoKTsNCisgICAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCisgICAgcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQgKikoKGR3Q3VyIDw8IDE2KSB8IGR3UHJlKTsNCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgaWYgKCFwRmllbGQtPklzRml4KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGaW5kRWRpdGFibGVGaWVsZCgoYkZvcndhcmQgPyBuRW5kIDogbkJnbiksIG5CZ24sIG5FbmQsIHBGaWVsZCwgYkZvcndhcmQpOw0KK30NCitGWF9CT09MCUNGREVfVHh0RWR0RW5naW5lOjpNb3ZlMk5leHRFZGl0YWJsZUZpZWxkKEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiRm9yd2FyZCAsIEZYX0JPT0wgYlNlbGVjdCAgKQ0KK3sNCisgICAgaWYgKG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuQmduID0gMCwgbkVuZCA9IDA7DQorICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBOVUxMOw0KKyAgICBGWF9CT09MIGJSZXQgPSBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCwgYkZvcndhcmQpOw0KKyAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuRWRpdGFibGVCZ24gPSAwLCBuRWRpdGFibGVFbmQgPSAwOw0KKyAgICBwRmllbGQtPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlQmduLCBuRWRpdGFibGVFbmQpOw0KKyAgICBuRWRpdGFibGVCZ24gKz0gbkJnbjsNCisgICAgbkVkaXRhYmxlRW5kICs9IG5CZ247DQorICAgIGlmIChiU2VsZWN0KSB7DQorICAgICAgICBGWF9JTlQzMiBuUmFuZ2VDb3VudCA9IG5FZGl0YWJsZUVuZCAtIG5FZGl0YWJsZUJnbjsNCisgICAgICAgIGlmIChuUmFuZ2VDb3VudCA+IDApIHsNCisgICAgICAgICAgICBBZGRTZWxSYW5nZShuRWRpdGFibGVCZ24sIG5FZGl0YWJsZUVuZCAtIG5FZGl0YWJsZUJnbik7DQorICAgICAgICB9DQorICAgIH0NCisgICAgU2V0Q2FyZXRQb3MobkVkaXRhYmxlRW5kLCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0RW5naW5lOjpHZXRSZWFsSW5kZXgoRlhfSU5UMzIgbkluZGV4KSBjb25zdA0KK3sNCisgICAgQ0ZERV9UeHRFZHRCdWZJdGVyICogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICAgIHBJdGVyLT5TZXRBdCgwKTsNCisgICAgRlhfQk9PTAkJYkluRmllbGQJPSBGQUxTRTsNCisgICAgRlhfSU5UMzIJbkZpZWxkQmduCT0gMDsNCisgICAgRlhfSU5UMzIJblJlYWxJbmRleAk9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPD0gbkluZGV4OyBpICsrKSB7DQorICAgICAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgICBpZiAoYkluRmllbGQpIHsNCisgICAgICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQcmUgPSAoRlhfRFdPUkQpbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuRmllbGRCZ24gKyAxKTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuRmllbGRCZ24gKyAyKTsNCisgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkICopKChkd0N1ciA8PCAxNikgfCBkd1ByZSk7DQorICAgICAgICAgICAgICAgIG5SZWFsSW5kZXggKz0gcEZpZWxkLT5HZXRGaWVsZFRleHRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgYkluRmllbGQgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTikgew0KKyAgICAgICAgICAgICAgICBiSW5GaWVsZAk9IFRSVUU7DQorICAgICAgICAgICAgICAgIG5GaWVsZEJnbgk9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG5SZWFsSW5kZXggKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcEl0ZXItPk5leHQoKTsNCisgICAgfQ0KKyAgICBpZiAoIWJJbkZpZWxkKSB7DQorICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgcmV0dXJuIG5SZWFsSW5kZXg7DQorICAgIH0NCisgICAgcEl0ZXItPlNldEF0KG5GaWVsZEJnbiArIDEpOw0KKyAgICBGWF9EV09SRCBkd1ByZSA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBwSXRlci0+TmV4dCgpOw0KKyAgICBGWF9EV09SRCBkd0N1ciA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQgKikoKGR3Q3VyIDw8IDE2KSB8IGR3UHJlKTsNCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgaWYgKHBGaWVsZC0+SXNGaXgoKSkgew0KKyAgICAgICAgRlhfSU5UMzIgbkRlbHRhID0gbkluZGV4IC0gbkZpZWxkQmduIC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIDE7DQorICAgICAgICByZXR1cm4gblJlYWxJbmRleCArIChuRGVsdGEgPiAwID8gbkRlbHRhIDogMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gblJlYWxJbmRleCArIHBGaWVsZC0+R2V0UmVhbEluZGV4KG5JbmRleCAtIG5GaWVsZEJnbik7DQorICAgIH0NCit9DQorI2VuZGlmDQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6SXNGaXRBcmVhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBJRkRFX1RleHRPdXQgKiBwVGV4dE91dCA9IElGREVfVGV4dE91dDo6Q3JlYXRlKCk7DQorICAgIHBUZXh0T3V0LT5TZXRMaW5lU3BhY2UobV9QYXJhbS5mTGluZVNwYWNlKTsNCisgICAgcFRleHRPdXQtPlNldEZvbnQobV9QYXJhbS5wRm9udCk7DQorICAgIHBUZXh0T3V0LT5TZXRGb250U2l6ZShtX1BhcmFtLmZGb250U2l6ZSk7DQorICAgIENGWF9SZWN0RiByY1RleHQ7DQorICAgIEZYU1lTX21lbXNldCgmcmNUZXh0LCAwLCBzaXplb2YocmNUZXh0KSk7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lcykpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICAgIH0NCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXApIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgICAgICAgcmNUZXh0LndpZHRoID0gbV9QYXJhbS5mUGxhdGVXaWR0aDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJjVGV4dC53aWR0aCA9IDY1NTM1Ow0KKyAgICB9DQorICAgIHBUZXh0T3V0LT5TZXRTdHlsZXMoZHdTdHlsZSk7DQorICAgIHdzVGV4dCArPSBMIlxuIjsNCisgICAgcFRleHRPdXQtPkNhbGNMb2dpY1NpemUod3NUZXh0LCB3c1RleHQuR2V0TGVuZ3RoKCksIHJjVGV4dCk7DQorICAgIHBUZXh0T3V0LT5SZWxlYXNlKCk7DQorICAgIHdzVGV4dC5EZWxldGUod3NUZXh0LkdldExlbmd0aCgpIC0gMSk7DQorICAgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSAmJiAocmNUZXh0LndpZHRoID4gbV9QYXJhbS5mUGxhdGVXaWR0aCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgJiYgXA0KKyAgICAgICAgICAgIChyY1RleHQuaGVpZ2h0ID4gbV9QYXJhbS5mTGluZVNwYWNlICogbV9QYXJhbS5uTGluZUNvdW50KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVDYXJldFJlY3QoRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUpDQorew0KKyAgICBNb3ZlUGFnZTJDaGFyKG5JbmRleCk7DQorICAgIEdldENhcmV0UmVjdChtX3J0Q2FyZXQsIG1fbkNhcmV0UGFnZSwgbkluZGV4LCBiQmVmb3JlKTsNCisgICAgbV9uQ2FyZXQJPSBuSW5kZXg7DQorICAgIG1fYkJlZm9yZQk9IGJCZWZvcmU7DQorICAgIGlmICghbV9iQmVmb3JlKSB7DQorICAgICAgICBtX25DYXJldCArKzsNCisgICAgICAgIG1fYkJlZm9yZSA9IFRSVUU7DQorICAgIH0NCisgICAgbV9mQ2FyZXRQb3NSZXNlcnZlID0gKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpID8gXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2FyZXQudG9wIDogbV9ydENhcmV0LmxlZnQ7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQ2FyZXRDaGFuZ2VkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYgJnJ0Q2FyZXQsIEZYX0lOVDMyIG5QYWdlSW5kZXgsIEZYX0lOVDMyIG5DYXJldCwgRlhfQk9PTCBiQmVmb3JlICkNCit7DQorICAgIElGREVfVHh0RWR0UGFnZSAqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbbV9uQ2FyZXRQYWdlXTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICBGWF9CT09MCQliQ29tYlRleHQJCT0gbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Db21iVGV4dDsNCisgICAgRlhfSU5UMzIJbkluZGV4SW5wYWdlCT0gbkNhcmV0IC0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KKyAgICBpZiAoYkJlZm9yZSAmJiBiQ29tYlRleHQgJiYgbkluZGV4SW5wYWdlID4gMCkgew0KKyAgICAgICAgbkluZGV4SW5wYWdlLS07DQorICAgICAgICBiQmVmb3JlCT0gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkJJRElMZXZlbCA9IHBQYWdlLT5HZXRDaGFyUmVjdChuSW5kZXhJbnBhZ2UsIHJ0Q2FyZXQsIGJDb21iVGV4dCk7DQorICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgICAgICBpZiAoKCFGWF9Jc09kZChuQklESUxldmVsKSAmJiAhYkJlZm9yZSkgfHwgKEZYX0lzT2RkKG5CSURJTGV2ZWwpICYmIGJCZWZvcmUpKSB7DQorICAgICAgICAgICAgcnRDYXJldC5PZmZzZXQoMCwgcnRDYXJldC5oZWlnaHQgLSAxLjBmKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChydENhcmV0LmhlaWdodCA9PSAwICYmIHJ0Q2FyZXQudG9wID4gMS4wZikgew0KKyAgICAgICAgICAgIHJ0Q2FyZXQudG9wIC09IDEuMGY7DQorICAgICAgICB9DQorICAgICAgICBydENhcmV0LmhlaWdodCA9IDEuMGY7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoKCFGWF9Jc09kZChuQklESUxldmVsKSAmJiAhYkJlZm9yZSkgfHwgKEZYX0lzT2RkKG5CSURJTGV2ZWwpICYmIGJCZWZvcmUpKSB7DQorICAgICAgICAgICAgcnRDYXJldC5PZmZzZXQocnRDYXJldC53aWR0aCAtIDEuMGYsIDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJ0Q2FyZXQud2lkdGggPT0gMCAmJiBydENhcmV0LmxlZnQgPiAxLjBmKSB7DQorICAgICAgICAgICAgcnRDYXJldC5sZWZ0IC09IDEuMGY7DQorICAgICAgICB9DQorICAgICAgICBydENhcmV0LndpZHRoID0gMS4wZjsNCisgICAgfQ0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VXBkYXRlQ2FyZXRJbmRleChjb25zdCBDRlhfUG9pbnRGICYgcHRDYXJldCkNCit7DQorICAgIElGREVfVHh0RWR0UGFnZSAqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbbV9uQ2FyZXRQYWdlXTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICBtX25DYXJldCA9IHBQYWdlLT5HZXRDaGFySW5kZXgocHRDYXJldCwgbV9iQmVmb3JlKTsNCisgICAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsNCisgICAgaWYgKCFtX2JCZWZvcmUpIHsNCisgICAgICAgIG1fbkNhcmV0ICsrOw0KKyAgICAgICAgbV9iQmVmb3JlID0gVFJVRTsNCisgICAgfQ0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0NhcmV0Q2hhbmdlZCh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6SXNTZWxlY3QoKQ0KK3sNCisgICAgcmV0dXJuIG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RGVsZXRlU2VsZWN0KCkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudFJhbmdlID0gQ291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKG5Db3VudFJhbmdlID4gMCkgew0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgICAgIEZYX0lOVDMyIG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgICAgICAgIGlmIChuQmxvY2tDb3VudCA+IDApIHsNCisgICAgICAgICAgICBpZiAobkNvdW50UmFuZ2UgPiAxKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfSU5UMzIgblNlbFN0YXJ0Ow0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5TZWxDb3VudDsNCisgICAgICAgICAgICBuU2VsQ291bnQgPSBHZXRTZWxSYW5nZSgwLCBuU2VsU3RhcnQpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5TZWxFbmQgPSBuU2VsU3RhcnQgKyBuU2VsQ291bnQ7DQorICAgICAgICAgICAgRlhfSU5UMzIgbkJnbiA9IDA7DQorICAgICAgICAgICAgRlhfSU5UMzIgbkVuZCA9IDA7DQorICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IE5VTEw7DQorICAgICAgICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblNlbFN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyCW5DYXJldEluRmllbGQJPSBuU2VsU3RhcnQgLSBuQmduOw0KKyAgICAgICAgICAgIEZYX0JPT0wJCWJCZWZvcmUJCQk9IEZBTFNFOw0KKyAgICAgICAgICAgIGlmICghYkluRmllbGQgfHwgcEZpZWxkLT5Jc0ZpeCgpIHx8IG5TZWxFbmQgPiBuRW5kKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcEZpZWxkLT5CYWNrdXAoKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgICAgICAgICAgICBGWF9JTlQzMiBuQ2FyZXQgPSAwOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5SZXQgPSBwRmllbGQtPkRlbGV0ZShuQ2FyZXRJbkZpZWxkLCBuU2VsQ291bnQsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICAgICAgICAgIG5DYXJldCArPSBuQmduOw0KKyAgICAgICAgICAgIHN3aXRjaCAoblJldCkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TOg0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURToNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KKyAgICAgICAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KKyAgICAgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgICAgICAgICBwRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICAgICAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQorICAgICAgICAgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQorICAgICAgICAgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUodGhpcywgblNlbFN0YXJ0LCBwRmllbGQsIG5DYXJldEluRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCksIHdzRGVsLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQorICAgICAgICAgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCisgICAgICAgICAgICAgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIGJCZWZvcmUpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgIEZYX0lOVDMyIG5TZWxTdGFydDsNCisgICAgICAgIEZYX0lOVDMyIG5TZWxDb3VudDsNCisgICAgICAgIHdoaWxlIChuQ291bnRSYW5nZSA+IDApIHsNCisgICAgICAgICAgICBuU2VsQ291bnQgPSBHZXRTZWxSYW5nZSgtLW5Db3VudFJhbmdlLCBuU2VsU3RhcnQpOw0KKyAgICAgICAgICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbbkNvdW50UmFuZ2VdOw0KKyAgICAgICAgICAgIGRlbGV0ZSBscFRlbXA7DQorICAgICAgICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChuQ291bnRSYW5nZSk7DQorICAgICAgICAgICAgRGVsZXRlUmFuZ2VfRG9SZWNvcmQoblNlbFN0YXJ0LCBuU2VsQ291bnQsIFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCisgICAgICAgIFNldENhcmV0UG9zKG5TZWxTdGFydCwgVFJVRSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCit9DQorSUZERV9UeHRFZHREb1JlY29yZCAqIElGREVfVHh0RWR0RG9SZWNvcmQ6OkNyZWF0ZShGWF9CU1RSIGJzRG9SZWNvcmQpDQorew0KKyAgICBGWF9MUENTVFIJbHBCdWYJPQlic0RvUmVjb3JkLkdldENTdHIoKTsNCisgICAgRlhfSU5UMzIJblR5cGUJPQkqKChGWF9JTlQzMiopbHBCdWYpOw0KKyAgICBzd2l0Y2goblR5cGUpIHsNCisgICAgICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9JTlM6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydChic0RvUmVjb3JkKTsNCisgICAgICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUw6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKGJzRG9SZWNvcmQpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRJTlM6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KGJzRG9SZWNvcmQpOw0KKyAgICAgICAgY2FzZSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVERFTDoNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUoYnNEb1JlY29yZCk7DQorICAgICAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQOg0KKyAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoYnNEb1JlY29yZCk7DQorI2VuZGlmDQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoRlhfQlNUUiBic0RvUmVjb3JkKQ0KK3sNCisgICAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydChDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsDQorICAgICAgICBGWF9JTlQzMiBuQ2FyZXQsDQorICAgICAgICBGWF9MUENXU1RSIGxwVGV4dCwNCisgICAgICAgIEZYX0lOVDMyIG5MZW5ndGgpDQorICAgIDogbV9wRW5naW5lKHBFbmdpbmUpDQorICAgICwgbV9uQ2FyZXQobkNhcmV0KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBFbmdpbmUpOw0KKyAgICBGWF9MUFdTVFIgbHBCdWZmZXIgPSBtX3dzSW5zZXJ0LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBscFRleHQsIG5MZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbV93c0luc2VydC5SZWxlYXNlQnVmZmVyKCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ojp+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKQ0KK3sNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6UmVsZWFzZSgpDQorew0KKyAgICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6VW5kbygpDQorew0KKyAgICBpZiAobV9wRW5naW5lLT5Jc1NlbGVjdCgpKSB7DQorICAgICAgICBtX3BFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICAgIH0NCisgICAgbV9wRW5naW5lLT5Jbm5lcl9EZWxldGVSYW5nZShtX25DYXJldCwgbV93c0luc2VydC5HZXRMZW5ndGgoKSk7DQorICAgIEZERV9UWFRFRFRQQVJBTVMmIFBhcmFtID0gbV9wRW5naW5lLT5tX1BhcmFtOw0KKyAgICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZSA9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0RlbGV0ZTsNCisgICAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUJPSBtX3dzSW5zZXJ0Ow0KKyAgICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpSZWRvKCkNCit7DQorICAgIG1fcEVuZ2luZS0+SW5uZXJfSW5zZXJ0KG1fbkNhcmV0LCBGWF9MUENXU1RSKG1fd3NJbnNlcnQpLCBtX3dzSW5zZXJ0LkdldExlbmd0aCgpKTsNCisgICAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07DQorICAgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZQk9IG1fd3NJbnNlcnQ7DQorICAgIFBhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKG1fcEVuZ2luZSwgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8pOw0KKyAgICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0DQorew0KKyAgICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IEZYX0lOVDMyKEZERV9UWFRFRFRfRE9SRUNPUkRfSU5TKTsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IChGWF9JTlQzMikoRlhfVUlOVFBUUiltX3BFbmdpbmU7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX25DYXJldDsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NJbnNlcnQ7DQorICAgIEZYX0lOVDMyCW5MZW5ndGgJCT0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENCWVRFCWxwU3JjQnVmCT0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KKyAgICBGWF9MUFNUUglscERzdEJ1Zgk9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmLCBuTGVuZ3RoKTsNCisgICAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpEZXNlcmlhbGl6ZShGWF9CU1RSIGJzRG9SZWNvcmQpDQorew0KKyAgICBDRlhfQXJjaGl2ZUxvYWRlciBBcmNoaXZlTG9hZGVyKChGWF9MUENCWVRFKWJzRG9SZWNvcmQuR2V0Q1N0cigpLCBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgICAgRlhfSU5UMzIgblR5cGUgPSAwOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KKyAgICBGWFNZU19hc3NlcnQoblR5cGUgPT0gRkRFX1RYVEVEVF9ET1JFQ09SRF9JTlMpOw0KKyAgICBGWF9JTlQzMiBuRW5naW5lID0gMDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKShGWF9VSU5UUFRSKW5FbmdpbmU7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0luc2VydDsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZShGWF9CU1RSIGJzRG9SZWNvcmQpDQorew0KKyAgICBEZXNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZShDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsDQorICAgICAgICBGWF9JTlQzMiBuSW5kZXgsDQorICAgICAgICBGWF9JTlQzMiBuQ2FyZXQsDQorICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NSYW5nZSwNCisgICAgICAgIEZYX0JPT0wgYlNlbCkNCisgICAgOiBtX3BFbmdpbmUocEVuZ2luZSkNCisgICAgLCBtX25JbmRleChuSW5kZXgpDQorICAgICwgbV9uQ2FyZXQobkNhcmV0KQ0KKyAgICAsIG1fd3NSYW5nZSh3c1JhbmdlKQ0KKyAgICAsIG1fYlNlbChiU2VsKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBFbmdpbmUpOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjp+Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSgpDQorew0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OlJlbGVhc2UoKQ0KK3sNCisgICAgZGVsZXRlIHRoaXM7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6VW5kbygpDQorew0KKyAgICBpZiAobV9wRW5naW5lLT5Jc1NlbGVjdCgpKSB7DQorICAgICAgICBtX3BFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICAgIH0NCisgICAgbV9wRW5naW5lLT5Jbm5lcl9JbnNlcnQobV9uSW5kZXgsIEZYX0xQQ1dTVFIobV93c1JhbmdlKSwgbV93c1JhbmdlLkdldExlbmd0aCgpKTsNCisgICAgaWYgKG1fYlNlbCkgew0KKyAgICAgICAgbV9wRW5naW5lLT5BZGRTZWxSYW5nZShtX25JbmRleCwgbV93c1JhbmdlLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgICAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9JbnNlcnQ7DQorICAgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLndzRGVsZXRlCT0gbV93c1JhbmdlOw0KKyAgICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OlJlZG8oKQ0KK3sNCisgICAgbV9wRW5naW5lLT5Jbm5lcl9EZWxldGVSYW5nZShtX25JbmRleCwgbV93c1JhbmdlLkdldExlbmd0aCgpKTsNCisgICAgaWYgKG1fYlNlbCkgew0KKyAgICAgICAgbV9wRW5naW5lLT5SZW1vdmVTZWxSYW5nZShtX25JbmRleCwgbV93c1JhbmdlLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgICAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9JbnNlcnQ7DQorICAgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLndzRGVsZXRlCT0gbV93c1JhbmdlOw0KKyAgICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25JbmRleCwgVFJVRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OlNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyAmYnNEb1JlY29yZCkgY29uc3QNCit7DQorICAgIENGWF9BcmNoaXZlU2F2ZXIgQXJjaGl2ZVNhdmVyOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgRlhfSU5UMzIoRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUwpOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgKEZYX0lOVDMyKShGWF9VSU5UUFRSKW1fcEVuZ2luZTsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fYlNlbDsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fbkluZGV4Ow0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzUmFuZ2U7DQorICAgIEZYX0lOVDMyCW5MZW5ndGgJCT0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENCWVRFCWxwU3JjQnVmCT0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KKyAgICBGWF9MUFNUUglscERzdEJ1Zgk9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmLCBuTGVuZ3RoKTsNCisgICAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OkRlc2VyaWFsaXplKEZYX0JTVFIgYnNEb1JlY29yZCkNCit7DQorICAgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKEZYX0xQQ0JZVEUpYnNEb1JlY29yZC5HZXRDU3RyKCksIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KKyAgICBGWF9JTlQzMiBuVHlwZSA9IDA7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gblR5cGU7DQorICAgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0RFTCk7DQorICAgIEZYX0lOVDMyIG5FbmdpbmUgPSAwOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQorICAgIG1fcEVuZ2luZSA9IChDRkRFX1R4dEVkdEVuZ2luZSopKEZYX1VJTlRQVFIpbkVuZ2luZTsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBtX2JTZWw7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uSW5kZXg7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV93c1JhbmdlOw0KK30NCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydChGWF9CU1RSIGJzRG9SZWNvcmQpDQorew0KKyAgICBEZXNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydChDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsDQorICAgICAgICBGWF9JTlQzMiBuQ2FyZXQsDQorICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkLA0KKyAgICAgICAgRlhfSU5UMzIgbkluZGV4SW5GaWVsZCwNCisgICAgICAgIEZYX0lOVDMyIG5GaWVsZEJnbiwNCisgICAgICAgIEZYX0lOVDMyIG5PbGRGaWVsZExlbmd0aCwNCisgICAgICAgIEZYX0lOVDMyIG5OZXdGaWVsZExlbmd0aCwNCisgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0lucywNCisgICAgICAgIEZYX0JPT0wgYlNlbCApDQorICAgIDogbV9wRW5naW5lKHBFbmdpbmUpDQorICAgICwgbV9uQ2FyZXQobkNhcmV0KQ0KKyAgICAsIG1fcEZpZWxkKHBGaWVsZCkNCisgICAgLCBtX25JbmRleEluRmllbGQobkluZGV4SW5GaWVsZCkNCisgICAgLCBtX25GaWVsZEJnbihuRmllbGRCZ24pDQorICAgICwgbV9uT2xkRmllbGRMZW5ndGgobk9sZEZpZWxkTGVuZ3RoKQ0KKyAgICAsIG1fbk5ld0ZpZWxkTGVuZ3RoKG5OZXdGaWVsZExlbmd0aCkNCisgICAgLCBtX3dzSW5zKHdzSW5zKQ0KKyAgICAsIG1fYlNlbChiU2VsKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBFbmdpbmUpOw0KKyAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6fkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoKQ0KK3sNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MCUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OlVuZG8oKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQorICAgIEZYX0lOVDMyCW5DYXJldAkJPSAwOw0KKyAgICBGWF9CT09MCQliQmVmb3JlCT0gRkFMU0U7DQorICAgIEZYX0lOVDMyIG5SZXQgPSBtX3BGaWVsZC0+RGVsZXRlKG1fbkluZGV4SW5GaWVsZCwgbV93c0lucy5HZXRMZW5ndGgoKSwgd3NEZWwsIG5DYXJldCwgYkJlZm9yZSk7DQorICAgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUgJiYgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uTmV3RmllbGRMZW5ndGgsIHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIFRSVUUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpSZWRvKCkNCit7DQorICAgIEZYX0lOVDMyCW5DYXJldAk9IDA7DQorICAgIEZYX0JPT0wJCWJCZWZvcmUJPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgblJldCA9IG1fcEZpZWxkLT5JbnNlcnQobV9uSW5kZXhJbkZpZWxkLCBtX3dzSW5zLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMICYmIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uT2xkRmllbGRMZW5ndGgsIHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQgKyBtX3dzSW5zLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6U2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdA0KK3sNCisgICAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVElOUyk7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihtX3BFbmdpbmUpOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihtX3BGaWVsZCk7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX25JbmRleEluRmllbGQ7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX25GaWVsZEJnbjsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uTmV3RmllbGRMZW5ndGg7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzSW5zOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KKyAgICBGWF9JTlQzMgluTGVuZ3RoCQk9IEFyY2hpdmVTYXZlci5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDQllURQlscFNyY0J1Zgk9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCisgICAgRlhfTFBTVFIJbHBEc3RCdWYJPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQorICAgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpEZXNlcmlhbGl6ZShGWF9CU1RSIGJzRG9SZWNvcmQpDQorew0KKyAgICBDRlhfQXJjaGl2ZUxvYWRlciBBcmNoaXZlTG9hZGVyKChGWF9MUENCWVRFKWJzRG9SZWNvcmQuR2V0Q1N0cigpLCBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgICAgRlhfSU5UMzIgblR5cGUgPSAwOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KKyAgICBGWFNZU19hc3NlcnQoblR5cGUgPT0gRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRJTlMpOw0KKyAgICBGWF9JTlQzMiBuRW5naW5lID0gMDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKShGWF9VSU5UUFRSKW5FbmdpbmU7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICAgIEZYX0lOVDMyIG5GaWVsZCA9IDA7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbkZpZWxkOw0KKyAgICBtX3BGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKiluRmllbGQ7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uSW5kZXhJbkZpZWxkOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fbkZpZWxkQmduOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fd3NJbnM7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9iU2VsOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKEZYX0JTVFIgYnNEb1JlY29yZCkNCit7DQorICAgIERlc2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKENGREVfVHh0RWR0RW5naW5lICogcEVuZ2luZSwNCisgICAgICAgIEZYX0lOVDMyIG5DYXJldCwNCisgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQsDQorICAgICAgICBGWF9JTlQzMiBuSW5kZXhJbkZpZWxkLA0KKyAgICAgICAgRlhfSU5UMzIgbkZpZWxkQmduLA0KKyAgICAgICAgRlhfSU5UMzIgbk9sZExlbmd0aCwNCisgICAgICAgIEZYX0lOVDMyIG5OZXdMZW5ndGgsDQorICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NEZWwsDQorICAgICAgICBGWF9CT09MIGJTZWwgKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKQ0KKyAgICAsIG1fbkNhcmV0KG5DYXJldCkNCisgICAgLCBtX3BGaWVsZChwRmllbGQpDQorICAgICwgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpDQorICAgICwgbV9uRmllbGRCZ24obkZpZWxkQmduKQ0KKyAgICAsIG1fbk9sZEZpZWxkTGVuZ3RoKG5PbGRMZW5ndGgpDQorICAgICwgbV9uTmV3RmllbGRMZW5ndGgobk5ld0xlbmd0aCkNCisgICAgLCBtX3dzRGVsKHdzRGVsKQ0KKyAgICAsIG1fYlNlbChiU2VsKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEVuZ2luZSk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BGaWVsZCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGU6On5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKCkNCit7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6UmVsZWFzZSgpDQorew0KKyAgICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTAlDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpVbmRvKCkNCit7DQorICAgIEZYX0lOVDMyCW5DYXJldAk9IDA7DQorICAgIEZYX0JPT0wJCWJCZWZvcmUJPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgIG5SZXQgPSBtX3BGaWVsZC0+SW5zZXJ0KG1fbkluZGV4SW5GaWVsZCwgbV93c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCisgICAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTCAmJiBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk5ld0ZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6UmVkbygpDQorew0KKyAgICBGWF9JTlQzMgluQ2FyZXQJPSAwOw0KKyAgICBGWF9CT09MCQliQmVmb3JlCT0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQorICAgIEZYX0lOVDMyIG5SZXQgPSBtX3BGaWVsZC0+RGVsZXRlKG1fbkluZGV4SW5GaWVsZCwgbV93c0RlbC5HZXRMZW5ndGgoKSwgd3NEZWwsIG5DYXJldCwgYkJlZm9yZSk7DQorICAgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUgJiYgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uT2xkRmllbGRMZW5ndGgsIHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQgLSBtX3dzRGVsLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6U2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdA0KK3sNCisgICAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVERFTCk7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihtX3BFbmdpbmUpOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihtX3BGaWVsZCk7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX25JbmRleEluRmllbGQ7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX25GaWVsZEJnbjsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uTmV3RmllbGRMZW5ndGg7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzRGVsOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KKyAgICBGWF9JTlQzMgluTGVuZ3RoCQk9IEFyY2hpdmVTYXZlci5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDQllURQlscFNyY0J1Zgk9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCisgICAgRlhfTFBTVFIJbHBEc3RCdWYJPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQorICAgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpEZXNlcmlhbGl6ZShGWF9CU1RSIGJzRG9SZWNvcmQpDQorew0KKyAgICBDRlhfQXJjaGl2ZUxvYWRlciBBcmNoaXZlTG9hZGVyKChGWF9MUENCWVRFKWJzRG9SZWNvcmQuR2V0Q1N0cigpLCBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgICAgRlhfSU5UMzIgblR5cGUgPSAwOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KKyAgICBGWFNZU19hc3NlcnQoblR5cGUgPT0gRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRERUwpOw0KKyAgICBGWF9JTlQzMiBuRW5naW5lID0gMDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKShGWF9VSU5UUFRSKW5FbmdpbmU7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICAgIEZYX0lOVDMyIG5GaWVsZCA9IDA7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbkZpZWxkOw0KKyAgICBtX3BGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKiluRmllbGQ7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uSW5kZXhJbkZpZWxkOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fbkZpZWxkQmduOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fd3NEZWw7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9iU2VsOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoRlhfQlNUUiBic0RvUmVjb3JkKQ0KK3sNCisgICAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgJQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KKyAgICAgICAgRlhfSU5UMzIgbkNhcmV0LA0KKyAgICAgICAgRlhfSU5UMzIgbk5ld0NhcmV0LA0KKyAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCwNCisgICAgICAgIEZYX0lOVDMyCW5JbmRleEluRmllbGQsDQorICAgICAgICBGWF9JTlQzMgluRmllbGRCZ24sDQorICAgICAgICBGWF9JTlQzMgluRmllbGROZXdMZW5ndGgsDQorICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NEZWwsDQorICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQorICAgICAgICBGWF9CT09MCWJTZWwpDQorICAgIDogbV9wRW5naW5lKHBFbmdpbmUpDQorICAgICwgbV9uQ2FyZXQobkNhcmV0KQ0KKyAgICAsIG1fbk5ld0NhcmV0KG5OZXdDYXJldCkNCisgICAgLCBtX3BGaWVsZChwRmllbGQpDQorICAgICwgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpDQorICAgICwgbV9uRmllbGRCZ24obkZpZWxkQmduKQ0KKyAgICAsIG1fbkZpZWxkTmV3TGVuZ3RoKG5GaWVsZE5ld0xlbmd0aCkNCisgICAgLCBtX3dzRGVsKHdzRGVsKQ0KKyAgICAsIG1fd3NJbnMod3NJbnMpDQorICAgICwgbV9iU2VsKGJTZWwpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRW5naW5lKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpZWxkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6On5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgpDQorew0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MCUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpVbmRvKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KKyAgICBGWF9JTlQzMgluQ2FyZXQJPSAwOw0KKyAgICBGWF9CT09MCQliQmVmb3JlCT0gRkFMU0U7DQorICAgIEZYX0lOVDMyCW5SZXQJPSBtX3BGaWVsZC0+UmVwbGFjZShtX25JbmRleEluRmllbGQsIG1fd3NJbnMuR2V0TGVuZ3RoKCksIG1fd3NEZWwsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9JTlZBTElEQVRFICYmIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbkZpZWxkTmV3TGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OlJlZG8oKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQorICAgIEZYX0lOVDMyCW5DYXJldAk9IDA7DQorICAgIEZYX0JPT0wJCWJCZWZvcmUJPSBGQUxTRTsNCisgICAgRlhfSU5UMzIJblJldAk9IG1fcEZpZWxkLT5SZXBsYWNlKG1fbkluZGV4SW5GaWVsZCwgbV93c0RlbC5HZXRMZW5ndGgoKSwgbV93c0lucywgd3NEZWwsIG5DYXJldCwgYkJlZm9yZSk7DQorICAgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUgJiYgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uRmllbGROZXdMZW5ndGgsIHdzRGlzcGxheSk7DQorICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uTmV3Q2FyZXQsIFRSVUUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6U2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdA0KK3sNCisgICAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVFJFUCk7DQorICAgIEFyY2hpdmVTYXZlciA8PCBGWF9JTlQzMihtX3BFbmdpbmUpOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX25OZXdDYXJldDsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IEZYX0lOVDMyKG1fcEZpZWxkKTsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fbkluZGV4SW5GaWVsZDsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fbkZpZWxkQmduOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uRmllbGROZXdMZW5ndGg7DQorICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzRGVsOw0KKyAgICBBcmNoaXZlU2F2ZXIgPDwgbV93c0luczsNCisgICAgQXJjaGl2ZVNhdmVyIDw8IG1fYlNlbDsNCisgICAgRlhfSU5UMzIJbkxlbmd0aAkJPSBBcmNoaXZlU2F2ZXIuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0xQQ0JZVEUJbHBTcmNCdWYJPSBBcmNoaXZlU2F2ZXIuR2V0QnVmZmVyKCk7DQorICAgIEZYX0xQU1RSCWxwRHN0QnVmCT0gYnNEb1JlY29yZC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5MZW5ndGgpOw0KKyAgICBic0RvUmVjb3JkLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OkRlc2VyaWFsaXplKEZYX0JTVFIgYnNEb1JlY29yZCkNCit7DQorICAgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKEZYX0xQQ0JZVEUpYnNEb1JlY29yZC5HZXRDU3RyKCksIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KKyAgICBGWF9JTlQzMiBuVHlwZSA9IDA7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gblR5cGU7DQorICAgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVFJFUCk7DQorICAgIEZYX0lOVDMyIG5FbmdpbmUgPSAwOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQorICAgIG1fcEVuZ2luZSA9IChDRkRFX1R4dEVkdEVuZ2luZSopKEZYX1VJTlRQVFIpbkVuZ2luZTsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBtX25DYXJldDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBtX25OZXdDYXJldDsNCisgICAgRlhfSU5UMzIgbkZpZWxkID0gMDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBuRmllbGQ7DQorICAgIG1fcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKW5GaWVsZDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBtX25JbmRleEluRmllbGQ7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uRmllbGRCZ247DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uRmllbGROZXdMZW5ndGg7DQorICAgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0RlbDsNCisgICAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzSW5zOw0KKyAgICBBcmNoaXZlTG9hZGVyID4+IG1fYlNlbDsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY3YTZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmgKQEAgLTAsMCArMSwzNDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1RYVEVEVEVOR0lORV9IDQorI2RlZmluZSBfRkRFX1RYVEVEVEVOR0lORV9IDQorY2xhc3MgQ0ZERV9UeHRFZHRCdWY7DQorY2xhc3MgQ0ZERV9UeHRFZHRQYWdlOw0KK2NsYXNzIElGWF9UeHRCcmVhazsNCitjbGFzcyBDRkRFX1R4dEVkdFBhcmFnOw0KK2NsYXNzIENGREVfVHh0RWR0S01QTWF0Y2g7DQorY2xhc3MgSUZERV9UeHRFZHRGb3JtYXRvcjsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkOw0KK2NsYXNzIENGREVfVHh0RWR0QmxvY2s7DQorY2xhc3MgSUZYX0NoYXJJdGVyOw0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lOw0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ow0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRm9ybWF0SW5zZXJ0Ow0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRm9ybWF0RGVsZXRlOw0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRm9ybWF0UmVwbGFjZTsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0Ow0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGU7DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U7DQorI2VuZGlmDQorY2xhc3MgSUZERV9UeHRFZHREb1JlY29yZA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRkRFX1R4dEVkdERvUmVjb3JkICogQ3JlYXRlKEZYX0JTVFIgYnNEb1JlY29yZCk7DQorICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MIFVuZG8oKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lIDogcHVibGljIElGREVfVHh0RWR0RW5naW5lLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCisgICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ow0KKyAgICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTsNCisgICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0UGFnZTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0Zvcm1hdEluc2VydDsNCisgICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRm9ybWF0RGVsZXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXRSZXBsYWNlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHRCbG9jazsNCisjZW5kaWYNCisgICAgc3RydWN0IF9GREVfVFhURURUU0VMUkFOR0UgOiBwdWJsaWMgQ0ZYX09iamVjdCB7DQorICAgICAgICBGWF9JTlQzMiBuU3RhcnQ7DQorICAgICAgICBGWF9JTlQzMiBuQ291bnQ7DQorICAgIH07DQorICAgIHR5cGVkZWYgX0ZERV9UWFRFRFRTRUxSQU5HRQkJRkRFX1RYVEVEVFNFTFJBTkdFOw0KKyAgICB0eXBlZGVmIF9GREVfVFhURURUU0VMUkFOR0UgKglGREVfTFBUWFRFRFRTRUxSQU5HRTsNCisgICAgc3RydWN0IF9GREVfVFhURURUUEFSQUdQT1MgOiBwdWJsaWMgQ0ZYX09iamVjdCB7DQorICAgICAgICBGWF9JTlQzMgluUGFyYWdJbmRleDsNCisgICAgICAgIEZYX0lOVDMyCW5DaGFySW5kZXg7DQorICAgIH07DQorICAgIHR5cGVkZWYgX0ZERV9UWFRFRFRQQVJBR1BPUwkJRkRFX1RYVEVEVFBBUkFHUE9TOw0KKyAgICB0eXBlZGVmIF9GREVfVFhURURUUEFSQUdQT1MgKglGREVfTFBUWFRFRFRQQVJBR1BPUzsNCitwdWJsaWM6DQorICAgIENGREVfVHh0RWR0RW5naW5lKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJCVJlbGVhc2UoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCQkJU2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TICZwYXJhbXMpOw0KKyAgICB2aXJ0dWFsIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqCQlHZXRFZGl0UGFyYW1zKCkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCUNvdW50UGFnZXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBJRkRFX1R4dEVkdFBhZ2UqCQkJR2V0UGFnZShGWF9JTlQzMiBuSW5kZXgpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEJ1ZkNodW5rU2l6ZShGWF9JTlQzMiBuQ2h1bmtTaXplKTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRUZXh0QnlTdHJlYW0oSUZYX1N0cmVhbSAqcFN0cmVhbSk7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCA9IC0xKTsNCisgICAgdmlydHVhbCB2b2lkCQlDbGVhclRleHQoKTsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRDYXJldFJlY3QoQ0ZYX1JlY3RGICZydENhcmV0KSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRDYXJldFBvcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCVNldENhcmV0UG9zKEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglNb3ZlQ2FyZXRQb3MoRkRFX1RYVEVEVE1PVkVDQVJFVCBlTW92ZUNhcmV0LCBGWF9CT09MIGJTaGlmdCA9IEZBTFNFLCBGWF9CT09MIGJDdHJsID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJTG9jaygpOw0KKyAgICB2aXJ0dWFsIHZvaWQJVW5sb2NrKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlJc0xvY2tlZCgpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUluc2VydChGWF9JTlQzMiBuU3RhcnQsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglEZWxldGUoRlhfSU5UMzIgblN0YXJ0LCBGWF9CT09MIGJCYWNrc3BhY2UgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJRGVsZXRlUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgPSAtMSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJUmVwbGFjZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5MZW5ndGgsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JlcGxhY2UpOw0KKw0KKyAgICB2aXJ0dWFsCXZvaWQJCVNldExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIHZpcnR1YWwJdm9pZAkJU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdjQWxpYXMpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEZvcm1hdEJsb2NrKEZYX0lOVDMyIG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2tGb3JtYXQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUNvdW50RWRpdEJsb2NrcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldEVkaXRCbG9ja1RleHQoRlhfSU5UMzIgbkluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja1RleHQpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUNvdW50RWRpdEZpZWxkcyhGWF9JTlQzMiBuQmxvY2tJbmRleCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJR2V0RWRpdEZpZWxkVGV4dChGWF9JTlQzMiBuQmxvY2tJbmRleCwgRlhfSU5UMzIgbkZpZWxkSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkVGV4dCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJU3RhcnRFZGl0KCk7DQorICAgIHZpcnR1YWwgdm9pZAkJRW5kRWRpdCgpOw0KKw0KKyAgICB2b2lkCQkJCVJlbW92ZVNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCUFkZFNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUNvdW50U2VsUmFuZ2VzKCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KTsNCisgICAgdmlydHVhbCB2b2lkCQlDbGVhclNlbGVjdGlvbigpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oRlhfQlNUUiBic1JlZG8pOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oRlhfQlNUUiBic1VuZG8pOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCVN0YXJ0TGF5b3V0KCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJRG9MYXlvdXQoSUZYX1BhdXNlICpwUGF1c2UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUVuZExheW91dCgpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wdGltaXplKElGWF9QYXVzZSAqIHBQYXVzZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJQ291bnRQYXJhZ3MoKSBjb25zdDsNCisgICAgdmlydHVhbCBJRkRFX1R4dEVkdFBhcmFnKglHZXRQYXJhZyhGWF9JTlQzMiBuUGFyYWdJbmRleCkgY29uc3Q7DQorICAgIHZpcnR1YWwgSUZYX0NoYXJJdGVyKgkJQ3JlYXRlQ2hhckl0ZXIoKTsNCisgICAgSUZERV9UeHRFZHRCdWYqCUdldFRleHRCdWYoKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCUdldFRleHRCdWZMZW5ndGgoKSBjb25zdDsNCisgICAgSUZYX1R4dEJyZWFrKglHZXRUZXh0QnJlYWsoKSBjb25zdDsNCisgICAgRlhfSU5UMzIJR2V0TGluZUNvdW50KCkgY29uc3Q7DQorICAgIEZYX0lOVDMyCUdldFBhZ2VMaW5lQ291bnQoKSBjb25zdDsNCisNCisgICAgRlhfSU5UMzIJCQlMaW5lMlBhcmFnKEZYX0lOVDMyIG5TdGFydFBhcmFnLCBGWF9JTlQzMiBuU3RhcnRMaW5lb2ZQYXJhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5MaW5lSW5kZXgsIEZYX0lOVDMyICZuU3RhcnRMaW5lKSBjb25zdDsNCisgICAgRlhfV0NIQVIJCQlHZXRBbGlhc0NoYXIoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV93Y0FsaWFzQ2hhcjsNCisgICAgfQ0KKw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCB+Q0ZERV9UeHRFZHRFbmdpbmUoKTsNCitwcml2YXRlOg0KKyAgICB2b2lkCUlubmVyX0luc2VydChGWF9JTlQzMiBuU3RhcnQsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuZ3RoKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgIHZvaWQJUmF3SW5zZXJ0KEZYX0lOVDMyIG5TdGFydCwgRlhfTFBDV1NUUiBscFRleHQsIEZYX0lOVDMyIG5MZW5ndGgpOw0KKyNlbmRpZg0KKyAgICB2b2lkCUdldFByZURlbGV0ZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiBuTGVuZ3RoKTsNCisgICAgdm9pZAlHZXRQcmVJbnNlcnRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5JbmRleCwgRlhfTFBDV1NUUiBscFRleHQsIEZYX0lOVDMyIG5MZW5ndGgpOw0KKyAgICB2b2lkCUdldFByZVJlcGxhY2VUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgbk9yaWdpbkxlbmd0aCwgRlhfTFBDV1NUUiBscFRleHQsIEZYX0lOVDMyIG5MZW5ndGgpOw0KKw0KKyAgICB2b2lkCUlubmVyX0RlbGV0ZVJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpOw0KKyAgICB2b2lkCURlbGV0ZVJhbmdlX0RvUmVjb3JkKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50LCBGWF9CT09MIGJTZWwgPSBGQUxTRSk7DQorICAgIHZvaWQJUmVzZXRFbmdpbmUoKTsNCisgICAgdm9pZAlSZWJ1aWxkUGFyYWdyYXBocygpOw0KKyAgICB2b2lkCVJlbW92ZUFsbFBhcmFncygpOw0KKyAgICB2b2lkCVJlbW92ZUFsbFBhZ2VzKCk7DQorICAgIHZvaWQJVXBkYXRlUGFyYWdzKCk7DQorICAgIHZvaWQJVXBkYXRlUGFnZXMoKTsNCisgICAgdm9pZAlVcGRhdGVUeHRCcmVhaygpOw0KKw0KKyAgICBGWF9CT09MCVJlcGxhY2VQYXJhZ0VuZChGWF9MUFdTVFIgJmxwVGV4dCwgRlhfSU5UMzIgJm5MZW5ndGgsIEZYX0JPT0wgYlByZUlzQ1IgPSBGQUxTRSk7DQorICAgIHZvaWQJUmVjb3ZlclBhcmFnRW5kKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICBGWF9JTlQzMglNb3ZlUGFnZTJDaGFyKEZYX0lOVDMyIG5JbmRleCk7DQorICAgIHZvaWQJCVRleHRQb3MyUGFyYWdQb3MoRlhfSU5UMzIgbkluZGV4LCBGREVfVFhURURUUEFSQUdQT1MgJlBhcmFnUG9zKSBjb25zdDsNCisgICAgRlhfSU5UMzIJTW92ZUZvcndhcmQoRlhfQk9PTCAmYkJlZm9yZSk7DQorICAgIEZYX0lOVDMyCU1vdmVCYWNrd2FyZChGWF9CT09MICZiQmVmb3JlKTsNCisgICAgRlhfQk9PTAkJTW92ZVVwKENGWF9Qb2ludEYgJnB0Q2FyZXQpOw0KKyAgICBGWF9CT09MCQlNb3ZlRG93bihDRlhfUG9pbnRGICZwdENhcmV0KTsNCisgICAgRlhfQk9PTAkJTW92ZUxpbmVTdGFydCgpOw0KKyAgICBGWF9CT09MCQlNb3ZlTGluZUVuZCgpOw0KKyAgICBGWF9CT09MCQlNb3ZlUGFyYWdTdGFydCgpOw0KKyAgICBGWF9CT09MCQlNb3ZlUGFyYWdFbmQoKTsNCisgICAgRlhfQk9PTAkJTW92ZUhvbWUoKTsNCisgICAgRlhfQk9PTAkJTW92ZUVuZCgpOw0KKyAgICBGWF9CT09MCQlJc0ZpdEFyZWEoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZvaWQJVXBkYXRlQ2FyZXRSZWN0KEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQorICAgIHZvaWQJR2V0Q2FyZXRSZWN0KENGWF9SZWN0RiAmcnRDYXJldCwgRlhfSU5UMzIgblBhZ2VJbmRleCwgRlhfSU5UMzIgbkNhcmV0LCBGWF9CT09MIGJCZWZvcmUgPSBUUlVFKTsNCisgICAgdm9pZAlVcGRhdGVDYXJldEluZGV4KGNvbnN0IENGWF9Qb2ludEYgJiBwdENhcmV0KTsNCisNCisgICAgRlhfQk9PTAlJc1NlbGVjdCgpOw0KKyAgICB2b2lkCURlbGV0ZVNlbGVjdCgpOw0KKyAgICBJRkRFX1R4dEVkdEJ1ZioJCW1fcFR4dEJ1ZjsNCisgICAgSUZYX1R4dEJyZWFrKgkJbV9wVGV4dEJyZWFrOw0KKyAgICBGREVfVFhURURUUEFSQU1TCW1fUGFyYW07DQorICAgIENGWF9BcnJheVRlbXBsYXRlPElGREVfVHh0RWR0UGFnZSo+CQkJbV9QYWdlUHRyQXJyYXk7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPENGREVfVHh0RWR0UGFyYWcqPgkJbV9QYXJhZ1B0ckFycmF5Ow0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfTFBUWFRFRFRTRUxSQU5HRT4JCW1fU2VsUmFuZ2VQdHJBcnI7DQorICAgIEZYX0lOVDMyCW1fblBhZ2VMaW5lQ291bnQ7DQorICAgIEZYX0lOVDMyCW1fbkxpbmVDb3VudDsNCisgICAgRlhfSU5UMzIJbV9uQW5jaG9yUG9zOw0KKyAgICBGWF9JTlQzMgltX25MYXlvdXRQb3M7DQorICAgIEZYX0ZMT0FUCW1fZkNhcmV0UG9zUmVzZXJ2ZTsNCisgICAgRlhfSU5UMzIJbV9uQ2FyZXQ7DQorICAgIEZYX0JPT0wJCW1fYkJlZm9yZTsNCisgICAgRlhfSU5UMzIJbV9uQ2FyZXRQYWdlOw0KKyAgICBDRlhfUmVjdEYJbV9ydENhcmV0Ow0KKyAgICBGWF9EV09SRAltX2R3RmluZEZsYWdzOw0KKw0KKyAgICBGWF9CT09MCQltX2JMb2NrOw0KKyAgICBGWF9JTlQzMgltX25MaW1pdDsNCisgICAgRlhfV0NIQVIJbV93Y0FsaWFzQ2hhcjsNCisgICAgRlhfSU5UMzIJbV9uRmlyc3RMaW5lRW5kOw0KKyAgICBGWF9CT09MCQltX2JBdXRvTGluZUVuZDsNCisgICAgRlhfV0NIQVIJbV93TGluZUVuZDsNCisNCisgICAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8gbV9DaGFuZ2VJbmZvOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydChGWF9CU1RSIGJzRG9SZWNvcmQpOw0KKyAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCgJQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDV1NUUiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuTGVuZ3RoKTsNCisgICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBGWF9CT09MIFVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgICAgdmlydHVhbCB2b2lkCVNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyAmYnNEb1JlY29yZCkgY29uc3Q7DQorcHJvdGVjdGVkOg0KKyAgICB+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKTsNCisgICAgdm9pZAkJCURlc2VyaWFsaXplKEZYX0JTVFIgYnNEb1JlY29yZCk7DQorcHJpdmF0ZToNCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUgKgltX3BFbmdpbmU7DQorICAgIEZYX0lOVDMyCQkJbV9uQ2FyZXQ7DQorICAgIENGWF9XaWRlU3RyaW5nCQltX3dzSW5zZXJ0Ow0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoRlhfQlNUUiBic0RvUmVjb3JkKTsNCisgICAgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZShDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWwgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwJdm9pZAlSZWxlYXNlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKCk7DQorICAgIHZpcnR1YWwgdm9pZAlTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0Ow0KK3Byb3RlY3RlZDoNCisgICAgfkNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoKTsNCisgICAgdm9pZAkJCURlc2VyaWFsaXplKEZYX0JTVFIgYnNEb1JlY29yZCk7DQorcHJpdmF0ZToNCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUgKgltX3BFbmdpbmU7DQorICAgIEZYX0JPT0wJCQkJbV9iU2VsOw0KKyAgICBGWF9JTlQzMgkJCW1fbkluZGV4Ow0KKyAgICBGWF9JTlQzMgkJCW1fbkNhcmV0Ow0KKyAgICBDRlhfV2lkZVN0cmluZwkJbV93c1JhbmdlOw0KK307DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KEZYX0JTVFIgYnNEb1JlY29yZCk7DQorICAgIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5JbmRleEluRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkZpZWxkQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5PbGRGaWVsZExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuTmV3RmllbGRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCisgICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCVVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCVJlZG8oKTsNCisgICAgdmlydHVhbCB2b2lkCVNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyAmYnNEb1JlY29yZCkgY29uc3Q7DQorcHJvdGVjdGVkOg0KKyAgICB+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCgpOw0KKyAgICB2b2lkCURlc2VyaWFsaXplKEZYX0JTVFIgYnNEb1JlY29yZCk7DQorDQorcHJpdmF0ZToNCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUgKgltX3BFbmdpbmU7DQorICAgIEZYX0lOVDMyCQkJbV9uQ2FyZXQ7DQorICAgIENGREVfVHh0RWR0RmllbGQgKgltX3BGaWVsZDsNCisgICAgRlhfSU5UMzIJCQltX25JbmRleEluRmllbGQ7DQorICAgIEZYX0lOVDMyCQkJbV9uRmllbGRCZ247DQorICAgIEZYX0lOVDMyCQkJbV9uT2xkRmllbGRMZW5ndGg7DQorICAgIEZYX0lOVDMyCQkJbV9uTmV3RmllbGRMZW5ndGg7DQorICAgIENGWF9XaWRlU3RyaW5nCQltX3dzSW5zOw0KKyAgICBGWF9CT09MCQkJCW1fYlNlbDsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKEZYX0JTVFIgYnNEb1JlY29yZCk7DQorICAgIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5JbmRleEluRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkZpZWxkQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5PbGRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbk5ld0xlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJVW5kbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJUmVkbygpOw0KKyAgICB2aXJ0dWFsIHZvaWQJU2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKCk7DQorICAgIHZvaWQJRGVzZXJpYWxpemUoRlhfQlNUUiBic0RvUmVjb3JkKTsNCitwcml2YXRlOg0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSAqIG1fcEVuZ2luZTsNCisgICAgRlhfSU5UMzIJCQltX25DYXJldDsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCAqCW1fcEZpZWxkOw0KKyAgICBGWF9JTlQzMgkJCW1fbkluZGV4SW5GaWVsZDsNCisgICAgRlhfSU5UMzIJCQltX25GaWVsZEJnbjsNCisgICAgRlhfSU5UMzIJCQltX25PbGRGaWVsZExlbmd0aDsNCisgICAgRlhfSU5UMzIJCQltX25OZXdGaWVsZExlbmd0aDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCW1fd3NEZWw7DQorICAgIEZYX0JPT0wJCQkJbV9iU2VsOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZShGWF9CU1RSIGJzRG9SZWNvcmQpOw0KKyAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgJQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5OZXdDYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIJbkluZGV4SW5GaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIJbkZpZWxkQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMgluRmllbGROZXdMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCWJTZWwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJVW5kbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJUmVkbygpOw0KKyAgICB2aXJ0dWFsIHZvaWQJU2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgpOw0KKyAgICB2b2lkCURlc2VyaWFsaXplKEZYX0JTVFIgYnNEb1JlY29yZCk7DQorcHJpdmF0ZToNCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBtX3BFbmdpbmU7DQorICAgIEZYX0lOVDMyCQkJbV9uQ2FyZXQ7DQorICAgIEZYX0lOVDMyCQkJbV9uTmV3Q2FyZXQ7DQorICAgIENGREVfVHh0RWR0RmllbGQgKgltX3BGaWVsZDsNCisgICAgRlhfSU5UMzIJCQltX25JbmRleEluRmllbGQ7DQorICAgIEZYX0lOVDMyCQkJbV9uRmllbGRCZ247DQorICAgIEZYX0lOVDMyCQkJbV9uRmllbGROZXdMZW5ndGg7DQorICAgIENGWF9XaWRlU3RyaW5nCQltX3dzRGVsOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJbV93c0luczsNCisgICAgRlhfQk9PTAkJCQltX2JTZWw7DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRrbXBtYXRjaC5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRrbXBtYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwNzkwYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGttcG1hdGNoLmNwcApAQCAtMCwwICsxLDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRrbXBtYXRjaC5oIg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGttcG1hdGNoLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRrbXBtYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWI0NzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRrbXBtYXRjaC5oCkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfS01QTUFUQ0hfSA0KKyNkZWZpbmUgX0ZERV9LTVBNQVRDSF9IDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE5NGY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5jcHAKQEAgLTAsMCArMSw2NDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2lmZGVfdHh0ZWR0cGFnZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0cGFnZS5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0ZW5naW5lLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRwYXJhZy5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YnVmLmgiDQorI2RlZmluZSBGREVfVFhURURUX1RPTEVSQU5DRSAwLjFmDQorSUZERV9UeHRFZHRQYWdlICogSUZERV9UeHRFZHRQYWdlOjpDcmVhdGUoSUZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICByZXR1cm4gKElGREVfVHh0RWR0UGFnZSopRlhfTkVXIENGREVfVHh0RWR0UGFnZShwRW5naW5lLCBuSW5kZXgpOw0KK30NCitDRkRFX1R4dEVkdFRleHRTZXQ6OkNGREVfVHh0RWR0VGV4dFNldChDRkRFX1R4dEVkdFBhZ2UgKiBwUGFnZSkNCisgICAgOiBtX3BQYWdlKHBQYWdlKQ0KK3sNCit9DQorQ0ZERV9UeHRFZHRUZXh0U2V0Ojp+Q0ZERV9UeHRFZHRUZXh0U2V0KCkNCit7DQorfQ0KK0ZERV9WSVNVQUxPQkpUWVBFIENGREVfVHh0RWR0VGV4dFNldDo6R2V0VHlwZSgpDQorew0KKyAgICByZXR1cm4gRkRFX1ZJU1VBTE9CSl9UZXh0Ow0KK30NCitGWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0QkJveChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJmJib3gpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KQ0KK3sNCisgICAgcnQgPSAoKEZERV9MUFRFWFRFRElUUElFQ0UpKGhWaXN1YWxPYmopKS0+cnRQaWVjZTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmcnQpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0lOVDMyIENGREVfVHh0RWR0VGV4dFNldDo6R2V0U3RyaW5nKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSAoRkRFX0xQVEVYVEVESVRQSUVDRSloVGV4dDsNCisgICAgRlhfTFBXU1RSIHBCdWZmZXIgPSB3c1RleHQuR2V0QnVmZmVyKHBQaWVjZS0+bkNvdW50KTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHBQaWVjZS0+bkNvdW50OyBpKyspIHsNCisgICAgICAgIHBCdWZmZXJbaV0gPSBtX3BQYWdlLT5HZXRDaGFyKChGWF9MUFZPSUQpaFRleHQsIGkpOw0KKyAgICB9DQorICAgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKHBQaWVjZS0+bkNvdW50KTsNCisgICAgcmV0dXJuIHBQaWVjZS0+bkNvdW50Ow0KK30NCitJRlhfRm9udCogQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRGb250KEZERV9IVklTVUFMT0JKIGhUZXh0KQ0KK3sNCisgICAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPnBGb250Ow0KK30NCitGWF9GTE9BVCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnRTaXplKEZERV9IVklTVUFMT0JKIGhUZXh0KQ0KK3sNCisgICAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPmZGb250U2l6ZTsNCit9DQorRlhfQVJHQiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnRDb2xvcihGREVfSFZJU1VBTE9CSiBoVGV4dCkNCit7DQorICAgIHJldHVybiBtX3BQYWdlLT5HZXRFbmdpbmUoKS0+R2V0RWRpdFBhcmFtcygpLT5kd0ZvbnRDb2xvcjsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXREaXNwbGF5UG9zKEZERV9IVklTVUFMT0JKIGhUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlICwgQ0ZYX1dpZGVTdHJpbmcgKnBXU0Zvcm1zICkNCit7DQorICAgIGlmIChoVGV4dCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IChGREVfTFBURVhURURJVFBJRUNFKWhUZXh0Ow0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoID0gcFBpZWNlLT5uQ291bnQ7DQorICAgIGlmIChuTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikobV9wUGFnZS0+R2V0RW5naW5lKCkpOw0KKyAgICBjb25zdCBGREVfVFhURURUUEFSQU1TICogcFRleHRQYXJhbXMgPSBwRW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQorICAgIElGWF9UeHRCcmVhayAqIHBCcmVhayA9IHBFbmdpbmUtPkdldFRleHRCcmVhaygpOw0KKyAgICBGWF9EV09SRCBkd0xheW91dFN0eWxlID0gcEJyZWFrLT5HZXRMYXlvdXRTdHlsZXMoKTsNCisgICAgRlhfVFhUUlVOIHRyOw0KKyAgICB0ci5wQWNjZXNzCQkJPSBtX3BQYWdlOw0KKyAgICB0ci5wSWRlbnRpdHkJCT0gKEZYX0xQVk9JRCloVGV4dDsNCisgICAgdHIucFN0cgkJCQk9IE5VTEw7DQorICAgIHRyLnBXaWR0aHMJCQk9IE5VTEw7DQorICAgIHRyLmlMZW5ndGgJCQk9IG5MZW5ndGg7DQorICAgIHRyLnBGb250CQkJPSBwVGV4dFBhcmFtcy0+cEZvbnQ7DQorICAgIHRyLmZGb250U2l6ZQkJPSBwVGV4dFBhcmFtcy0+ZkZvbnRTaXplOw0KKyAgICB0ci5kd1N0eWxlcwkJCT0gZHdMYXlvdXRTdHlsZTsNCisgICAgdHIuaUNoYXJSb3RhdGlvbgk9IHBUZXh0UGFyYW1zLT5uQ2hhclJvdGF0aW9uOw0KKyAgICB0ci5kd0NoYXJTdHlsZXMJCT0gcFBpZWNlLT5kd0NoYXJTdHlsZXM7DQorICAgIHRyLnBSZWN0CQkJPSAmKHBQaWVjZS0+cnRQaWVjZSk7DQorICAgIHRyLndMaW5lQnJlYWtDaGFyCT0gcFRleHRQYXJhbXMtPndMaW5lQnJlYWtDaGFyOw0KKyAgICByZXR1cm4gcEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgcENoYXJQb3MsIGJDaGFyQ29kZSwgcFdTRm9ybXMpOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldENoYXJSZWN0cyhGREVfSFZJU1VBTE9CSiBoVGV4dCwgQ0ZYX1JlY3RGQXJyYXkgJnJ0QXJyYXkpDQorew0KKyAgICByZXR1cm4gR2V0Q2hhclJlY3RzX0ltcGwoaFRleHQsIHJ0QXJyYXkpOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldENoYXJSZWN0c19JbXBsKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSwgRlhfQk9PTCBiQkJveCApDQorew0KKyAgICBpZiAoaFRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSAoRkRFX0xQVEVYVEVESVRQSUVDRSloVGV4dDsNCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikobV9wUGFnZS0+R2V0RW5naW5lKCkpOw0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoID0gcFBpZWNlLT5uQ291bnQ7DQorICAgIGlmIChuTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyAqIHBUZXh0UGFyYW1zID0gcEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KKyAgICBGWF9EV09SRCBkd0xheW91dFN0eWxlID0gcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCktPkdldExheW91dFN0eWxlcygpOw0KKyAgICBGWF9UWFRSVU4gdHI7DQorICAgIHRyLnBBY2Nlc3MJCQk9IG1fcFBhZ2U7DQorICAgIHRyLnBJZGVudGl0eQkJPSAoRlhfTFBWT0lEKWhUZXh0Ow0KKyAgICB0ci5wU3RyCQkJCT0gTlVMTDsNCisgICAgdHIucFdpZHRocwkJCT0gTlVMTDsNCisgICAgdHIuaUxlbmd0aAkJCT0gbkxlbmd0aDsNCisgICAgdHIucEZvbnQJCQk9IHBUZXh0UGFyYW1zLT5wRm9udDsNCisgICAgdHIuZkZvbnRTaXplCQk9IHBUZXh0UGFyYW1zLT5mRm9udFNpemU7DQorICAgIHRyLmR3U3R5bGVzCQkJPSBkd0xheW91dFN0eWxlOw0KKyAgICB0ci5pQ2hhclJvdGF0aW9uCT0gcFRleHRQYXJhbXMtPm5DaGFyUm90YXRpb247DQorICAgIHRyLmR3Q2hhclN0eWxlcwkJPSBwUGllY2UtPmR3Q2hhclN0eWxlczsNCisgICAgdHIucFJlY3QJCQk9ICYocFBpZWNlLT5ydFBpZWNlKTsNCisgICAgdHIud0xpbmVCcmVha0NoYXIJPSBwVGV4dFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7DQorICAgIHJldHVybiBwRW5naW5lLT5HZXRUZXh0QnJlYWsoKS0+R2V0Q2hhclJlY3RzKCZ0ciwgcnRBcnJheSwgYkJCb3gpOw0KK30NCitDRkRFX1R4dEVkdFBhZ2U6OkNGREVfVHh0RWR0UGFnZShJRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsIEZYX0lOVDMyIG5QYWdlSW5kZXgpDQorICAgIDogbV9wSXRlcihOVUxMKQ0KKyAgICAsIG1fcFRleHRTZXQoTlVMTCkNCisgICAgLCBtX25SZWZDb3VudCgwKQ0KKyAgICAsIG1fblBhZ2VTdGFydCgtMSkNCisgICAgLCBtX25DaGFyQ291bnQoMCkNCisgICAgLCBtX25QYWdlSW5kZXgoblBhZ2VJbmRleCkNCisgICAgLCBtX2JMb2FkZWQoRkFMU0UpDQorICAgICwgbV9iTGFzdFBhZ2UoRkFMU0UpDQorICAgICwgbV9wQ2hhcldpZHRoKE5VTEwpDQorICAgICwgbV9wQmduUGFyYWcoTlVMTCkNCisgICAgLCBtX3BFbmRQYXJhZyhOVUxMKQ0KK3sNCisgICAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZSwgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KKyAgICBGWFNZU19tZW1zZXQoJm1fcnRQYWdlTWFyZ2luLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICAgIEZYU1lTX21lbXNldCgmbV9ydFBhZ2VDb250ZW50cywgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KKyAgICBGWFNZU19tZW1zZXQoJm1fcnRQYWdlQ2FudmFzLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICAgIG1fcEVkaXRFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKXBFbmdpbmU7DQorfQ0KK0NGREVfVHh0RWR0UGFnZTo6fkNGREVfVHh0RWR0UGFnZSgpDQorew0KKyAgICBtX1BpZWNlTWFzc0Fyci5SZW1vdmVBbGwoVFJVRSk7DQorICAgIGlmIChtX3BUZXh0U2V0KSB7DQorICAgICAgICBkZWxldGUgbV9wVGV4dFNldDsNCisgICAgICAgIG1fcFRleHRTZXQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BDaGFyV2lkdGgpIHsNCisgICAgICAgIGRlbGV0ZSBbXSBtX3BDaGFyV2lkdGg7DQorICAgICAgICBtX3BDaGFyV2lkdGggPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BJdGVyICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcEl0ZXIgPSBOVUxMOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRQYWdlOjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitJRkRFX1R4dEVkdEVuZ2luZSAqIENGREVfVHh0RWR0UGFnZTo6R2V0RW5naW5lKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoSUZERV9UeHRFZHRFbmdpbmUqKW1fcEVkaXRFbmdpbmU7DQorfQ0KK0ZERV9WSVNVQUxPQkpUWVBFIENGREVfVHh0RWR0UGFnZTo6R2V0VHlwZSgpDQorew0KKyAgICByZXR1cm4gRkRFX1ZJU1VBTE9CSl9UZXh0Ow0KK30NCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6R2V0QkJveChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJmJib3gpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6R2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6R2V0Q2xpcChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJSZWN0KEZYX0lOVDMyIG5JbmRleCwgQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJCQm94ICkgY29uc3QNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX25SZWZDb3VudCA+IDApOw0KKyAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9uQ2hhckNvdW50KTsNCisgICAgaWYgKG1fblJlZkNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBjb25zdCBGREVfTFBURVhURURJVFBJRUNFICBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChpKTsNCisgICAgICAgIGlmIChuSW5kZXggPj0gcFBpZWNlLT5uU3RhcnQgJiYgbkluZGV4IDwgKHBQaWVjZS0+blN0YXJ0ICsgcFBpZWNlLT5uQ291bnQpKSB7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkgcmVjdEFycjsNCisgICAgICAgICAgICBpZiAoYkJCb3gpIHsNCisgICAgICAgICAgICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzX0ltcGwoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFyciwgYkJCb3gpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcFRleHRTZXQtPkdldENoYXJSZWN0cygoRkRFX0hWSVNVQUxPQkopcFBpZWNlLCByZWN0QXJyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVjdCA9IHJlY3RBcnJbbkluZGV4IC0gcFBpZWNlLT5uU3RhcnRdOw0KKyAgICAgICAgICAgIHJldHVybiBwUGllY2UtPm5CaWRpTGV2ZWw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICByZXR1cm4gMDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDaGFySW5kZXgoY29uc3QgQ0ZYX1BvaW50RiAmZlBvaW50LCBGWF9CT09MICZiQmVmb3JlKQ0KK3sNCisgICAgRlhfQk9PTAliVmVydGljYWwJPSBtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsOw0KKyAgICBDRlhfUG9pbnRGIHB0RiA9IGZQb2ludDsNCisgICAgTm9ybWFsaXplUHQyUmVjdChwdEYsIG1fcnRQYWdlQ29udGVudHMsIEZERV9UWFRFRFRfVE9MRVJBTkNFKTsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgICBDRlhfUmVjdEYgcnRMaW5lOw0KKyAgICBGWF9JTlQzMiBuQmduID0gMDsNCisgICAgRlhfSU5UMzIgbkVuZCA9IDA7DQorICAgIEZYX0JPT0wgYkluTGluZSA9IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgY29uc3QgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChpKTsNCisgICAgICAgIGlmICghYkluTGluZSAmJiAoYlZlcnRpY2FsID8gKHBQaWVjZS0+cnRQaWVjZS5sZWZ0IDw9IHB0Ri54ICYmIHBQaWVjZS0+cnRQaWVjZS5yaWdodCgpID4gcHRGLngpIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAocFBpZWNlLT5ydFBpZWNlLnRvcCA8PSBwdEYueSAmJiBwUGllY2UtPnJ0UGllY2UuYm90dG9tKCkgPiBwdEYueSkpKSB7DQorICAgICAgICAgICAgbkJnbiA9IG5FbmQgPSBpOw0KKyAgICAgICAgICAgIHJ0TGluZSA9IHBQaWVjZS0+cnRQaWVjZTsNCisgICAgICAgICAgICBiSW5MaW5lID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoYkluTGluZSkgew0KKyAgICAgICAgICAgIGlmIChiVmVydGljYWwgPyAoIShwUGllY2UtPnJ0UGllY2UubGVmdCA8PSBwdEYueCAmJiBwUGllY2UtPnJ0UGllY2UucmlnaHQoKSA+IHB0Ri54KSkgOiBcDQorICAgICAgICAgICAgICAgICAgICAocFBpZWNlLT5ydFBpZWNlLmJvdHRvbSgpIDw9IHB0Ri55IHx8IHBQaWVjZS0+cnRQaWVjZS50b3AgPiBwdEYueSkpIHsNCisgICAgICAgICAgICAgICAgbkVuZCA9IGkgLSAxOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBydExpbmUuVW5pb24ocFBpZWNlLT5ydFBpZWNlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgTm9ybWFsaXplUHQyUmVjdChwdEYsIHJ0TGluZSwgRkRFX1RYVEVEVF9UT0xFUkFOQ0UpOw0KKyAgICBGWF9JTlQzMiBuQ2FyZXQgPSAwOw0KKyAgICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IE5VTEw7DQorICAgIGZvciAoaSA9IG5CZ247IGkgPD0gbkVuZDsgaSArKykgew0KKyAgICAgICAgcFBpZWNlID0gbV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoaSk7DQorICAgICAgICBuQ2FyZXQgPSBtX25QYWdlU3RhcnQgKyBwUGllY2UtPm5TdGFydDsNCisgICAgICAgIGlmIChwUGllY2UtPnJ0UGllY2UuQ29udGFpbnMocHRGKSkgew0KKyAgICAgICAgICAgIENGWF9SZWN0RkFycmF5IHJlY3RBcnI7DQorICAgICAgICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzKChGREVfSFZJU1VBTE9CSilwUGllY2UsIHJlY3RBcnIpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5SdENvdW50ID0gcmVjdEFyci5HZXRTaXplKCk7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IG5SdENvdW50OyBqICsrKSB7DQorICAgICAgICAgICAgICAgIGlmIChyZWN0QXJyW2pdLkNvbnRhaW5zKHB0RikpIHsNCisgICAgICAgICAgICAgICAgICAgIG5DYXJldCA9IG1fblBhZ2VTdGFydCArIHBQaWVjZS0+blN0YXJ0ICsgajsNCisgICAgICAgICAgICAgICAgICAgIGlmIChuQ2FyZXQgPj0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWZMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdDaGFyID09IEwnXG4nIHx8IHdDaGFyID09IEwnXHInKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdDaGFyID09IEwnXG4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCktPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDEpID09IEwnXHInKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2FyZXQgLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5DYXJldDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWwgPyAocHRGLnkgPiAoKHJlY3RBcnJbal0udG9wICsgcmVjdEFycltqXS5ib3R0b20oKSkgLyAyKSkgOiBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdEYueCA+ICgocmVjdEFycltqXS5sZWZ0ICsgcmVjdEFycltqXS5yaWdodCgpKSAvIDIpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJCZWZvcmUgPSBGWF9Jc09kZChwUGllY2UtPm5CaWRpTGV2ZWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiQmVmb3JlID0gIUZYX0lzT2RkKHBQaWVjZS0+bkJpZGlMZXZlbCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbkNhcmV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGJCZWZvcmUgPSBUUlVFOw0KKyAgICByZXR1cm4gbkNhcmV0Ow0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJTdGFydCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9uUGFnZVN0YXJ0Ow0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJDb3VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9uQ2hhckNvdW50Ow0KK30NCitGWF9JTlQzMiBDRkRFX1R4dEVkdFBhZ2U6OkdldERpc3BsYXlQb3MoY29uc3QgQ0ZYX1JlY3RGICZydENsaXAsIEZYVEVYVF9DSEFSUE9TIComcENoYXJQb3MsIEZYX0xQUkVDVEYgcEJCb3ggKSBjb25zdA0KK3sNCisgICAgcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhzaXplb2YoRlhURVhUX0NIQVJQT1MpICogbV9uQ2hhckNvdW50KTsNCisgICAgRlhfSU5UMzIJCW5DaGFyUG9zQ291bnQJPSAwOw0KKyAgICBGREVfSFZJU1VBTE9CSgloVmlzdWFsT2JqCQk9IE5VTEw7DQorICAgIEZYX0lOVDMyCQluVmlzdWFsT2JqQ291bnQJPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQorICAgIEZYVEVYVF9DSEFSUE9TKglwb3MJCQkJPSBwQ2hhclBvczsNCisgICAgQ0ZYX1JlY3RGIHJ0T2JqOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgblZpc3VhbE9iakNvdW50OyBpICsrKSB7DQorICAgICAgICBoVmlzdWFsT2JqID0gKEZERV9IVklTVUFMT0JKKW1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICAgICAgbV9wVGV4dFNldC0+R2V0UmVjdChoVmlzdWFsT2JqLCBydE9iaik7DQorICAgICAgICBpZiAoIXJ0Q2xpcC5JbnRlcnNlY3RXaXRoKHJ0T2JqKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgbkNvdW50CT0gbV9wVGV4dFNldC0+R2V0RGlzcGxheVBvcyhoVmlzdWFsT2JqLCBwb3MsIEZBTFNFKTsNCisgICAgICAgIG5DaGFyUG9zQ291bnQJKz0gbkNvdW50Ow0KKyAgICAgICAgcG9zCQkJCSs9IG5Db3VudDsNCisgICAgfQ0KKyAgICBpZiAoKG5DaGFyUG9zQ291bnQgKiA1KSA8IChtX25DaGFyQ291bnQgPDwgMikpIHsNCisgICAgICAgIEZYX0lOVDMyIG5MZW5ndGggPSBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogbkNoYXJQb3NDb3VudDsNCisgICAgICAgIEZYVEVYVF9DSEFSUE9TICogcFRlbXAgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhuTGVuZ3RoKTsNCisgICAgICAgIEZYU1lTX21lbWNweShwVGVtcCwgcENoYXJQb3MsIG5MZW5ndGgpOw0KKyAgICAgICAgRkRFX0ZyZWUocENoYXJQb3MpOw0KKyAgICAgICAgcENoYXJQb3MgPSBwVGVtcDsNCisgICAgfQ0KKyAgICByZXR1cm4gbkNoYXJQb3NDb3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6OkNhbGNSYW5nZVJlY3RBcnJheShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCwgQ0ZYX1JlY3RGQXJyYXkgJlJlY3RGQXJyKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIJblBpZWNlQ291bnQJPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyCW5FbmQJCT0gblN0YXJ0ICsgbkNvdW50IC0gMTsNCisgICAgRlhfQk9PTAkJYkluUmFuZ2UJPSBGQUxTRTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5QaWVjZUNvdW50OyBpICsrKSB7DQorICAgICAgICBGREVfTFBURVhURURJVFBJRUNFIHBpZWNlID0gbV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoaSk7DQorICAgICAgICBpZiAoIWJJblJhbmdlKSB7DQorICAgICAgICAgICAgaWYgKG5TdGFydCA+PSBwaWVjZS0+blN0YXJ0ICYmIG5TdGFydCA8IChwaWVjZS0+blN0YXJ0ICsgcGllY2UtPm5Db3VudCkpIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgblJhbmdlRW5kID0gcGllY2UtPm5Db3VudCAtIDE7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuZCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBpZiAobkVuZCA+PSBwaWVjZS0+blN0YXJ0ICYmIG5FbmQgPCAocGllY2UtPm5TdGFydCArIHBpZWNlLT5uQ291bnQpKSB7DQorICAgICAgICAgICAgICAgICAgICBuUmFuZ2VFbmQgPSBuRW5kIC0gcGllY2UtPm5TdGFydDsNCisgICAgICAgICAgICAgICAgICAgIGJFbmQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5IHJjQXJyOw0KKyAgICAgICAgICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBpZWNlLCByY0Fycik7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5TaXplID0gcmNBcnIuR2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcmVjdFBpZWNlID0gcmNBcnJbblN0YXJ0IC0gcGllY2UtPm5TdGFydF07DQorICAgICAgICAgICAgICAgIHJlY3RQaWVjZS5VbmlvbihyY0FycltuUmFuZ2VFbmRdKTsNCisgICAgICAgICAgICAgICAgUmVjdEZBcnIuQWRkKHJlY3RQaWVjZSk7DQorICAgICAgICAgICAgICAgIGlmIChiRW5kKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYkluUmFuZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG5FbmQgPj0gcGllY2UtPm5TdGFydCAmJiBuRW5kIDwgKHBpZWNlLT5uU3RhcnQgKyBwaWVjZS0+bkNvdW50KSkgew0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSByY0FycjsNCisgICAgICAgICAgICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzKChGREVfSFZJU1VBTE9CSilwaWVjZSwgcmNBcnIpOw0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcmVjdFBpZWNlID0gcmNBcnJbMF07DQorICAgICAgICAgICAgICAgIHJlY3RQaWVjZS5VbmlvbihyY0FycltuRW5kIC0gcGllY2UtPm5TdGFydF0pOw0KKyAgICAgICAgICAgICAgICBSZWN0RkFyci5BZGQocmVjdFBpZWNlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBSZWN0RkFyci5BZGQocGllY2UtPnJ0UGllY2UpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybjsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRQYWdlOjpTZWxlY3RXb3JkKGNvbnN0IENGWF9Qb2ludEYgJmZQb2ludCwgRlhfSU5UMzIgJm5Db3VudCkNCit7DQorICAgIGlmIChtX25SZWZDb3VudCA8IDApIHsNCisgICAgICAgIHJldHVybiAtIDE7DQorICAgIH0NCisgICAgSUZERV9UeHRFZHRCdWYgKiBwQnVmID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpOw0KKyAgICBGWF9CT09MIGJCZWZvcmU7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IEdldENoYXJJbmRleChmUG9pbnQsIGJCZWZvcmUpOw0KKyAgICBpZiAobkluZGV4ID09IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWZMZW5ndGgoKSkgew0KKyAgICAgICAgbkluZGV4ID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpIC0gMTsNCisgICAgfQ0KKyAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIElGWF9Xb3JkQnJlYWsgKiBwSXRlciA9IEZYX1dvcmRCcmVha19DcmVhdGUoKTsNCisgICAgcEl0ZXItPkF0dGFjaChGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopcEJ1ZikpOw0KKyAgICBwSXRlci0+U2V0QXQobkluZGV4KTsNCisgICAgbkNvdW50ID0gcEl0ZXItPkdldFdvcmRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgblJldCA9IHBJdGVyLT5HZXRXb3JkUG9zKCk7DQorICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBuUmV0Ow0KK30NCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6SXNMb2FkZWQoRlhfTFBDUkVDVEYgcENsaXBCb3ggKQ0KK3sNCisgICAgcmV0dXJuIG1fYkxvYWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRQYWdlOjpMb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCAsIElGWF9QYXVzZSAqcFBhdXNlICkNCit7DQorICAgIGlmIChtX25SZWZDb3VudCA+IDApIHsNCisgICAgICAgIG1fblJlZkNvdW50ICsrOw0KKyAgICAgICAgcmV0dXJuIG1fblJlZkNvdW50Ow0KKyAgICB9DQorICAgIElGREVfVHh0RWR0QnVmICogcEJ1Zgk9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWYoKTsNCisgICAgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyAqIHBQYXJhbXMgPSBtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQorICAgIGlmIChtX3BJdGVyICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBGWF9XQ0hBUiB3Y0FsaWFzID0gMDsNCisgICAgaWYgKHBQYXJhbXMtPmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQpIHsNCisgICAgICAgIHdjQWxpYXMgPSBtX3BFZGl0RW5naW5lLT5HZXRBbGlhc0NoYXIoKTsNCisgICAgfQ0KKyAgICBtX3BJdGVyID0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKXBCdWYsIHdjQWxpYXMpOw0KKyAgICBJRlhfVHh0QnJlYWsgKglwQnJlYWsJPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnJlYWsoKTsNCisgICAgcEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgIHBCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgICBGWF9JTlQzMiBuTGluZUNvdW50CQk9IG1fcEVkaXRFbmdpbmUtPkdldExpbmVDb3VudCgpOw0KKyAgICBGWF9JTlQzMiBuUGFnZUxpbmVDb3VudCA9IG1fcEVkaXRFbmdpbmUtPkdldFBhZ2VMaW5lQ291bnQoKTsNCisgICAgRlhfSU5UMzIgbkxlbmd0aCA9IHBCdWYtPkdldFRleHRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgblN0YXJ0TGluZQk9IG5QYWdlTGluZUNvdW50ICogbV9uUGFnZUluZGV4Ow0KKyAgICBGWF9JTlQzMiBuRW5kTGluZQk9IEZYX01JTigoblN0YXJ0TGluZSArIG5QYWdlTGluZUNvdW50IC0gMSksIChtX3BFZGl0RW5naW5lLT5HZXRMaW5lQ291bnQoKSAtIDEpKTsNCisgICAgRlhfSU5UMzIgblBhZ2VTdGFydCwgblBhZ2VFbmQsIG5UZW1wLCBuQmduUGFyYWcsIG5TdGFydExpbmVJblBhcmFnLCBuRW5kUGFyYWcsIG5FbmRMaW5lSW5QYXJhZzsNCisgICAgbkJnblBhcmFnID0gbV9wRWRpdEVuZ2luZS0+TGluZTJQYXJhZygwLCAwLCBuU3RhcnRMaW5lLCBuU3RhcnRMaW5lSW5QYXJhZyk7DQorICAgIG1fcEJnblBhcmFnID0gKENGREVfVHh0RWR0UGFyYWcqKW1fcEVkaXRFbmdpbmUtPkdldFBhcmFnKG5CZ25QYXJhZyk7DQorICAgIG1fcEJnblBhcmFnLT5Mb2FkUGFyYWcoKTsNCisgICAgbV9wQmduUGFyYWctPkdldExpbmVSYW5nZShuU3RhcnRMaW5lIC0gblN0YXJ0TGluZUluUGFyYWcsIG5QYWdlU3RhcnQsIG5UZW1wKTsNCisgICAgbkVuZFBhcmFnID0gbV9wRWRpdEVuZ2luZS0+TGluZTJQYXJhZyhuQmduUGFyYWcsIG5TdGFydExpbmVJblBhcmFnLCBuRW5kTGluZSwgbkVuZExpbmVJblBhcmFnKTsNCisgICAgbV9wRW5kUGFyYWcgPSAoQ0ZERV9UeHRFZHRQYXJhZyopbV9wRWRpdEVuZ2luZS0+R2V0UGFyYWcobkVuZFBhcmFnKTsNCisgICAgbV9wRW5kUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgICBtX3BFbmRQYXJhZy0+R2V0TGluZVJhbmdlKG5FbmRMaW5lIC0gbkVuZExpbmVJblBhcmFnLCBuUGFnZUVuZCwgblRlbXApOw0KKyAgICBuUGFnZUVuZCArPSAoblRlbXAgLSAxKTsNCisgICAgRlhfQk9PTCBiVmVydGlhbCA9IHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsOw0KKyAgICBGWF9CT09MIGJMaW5lUmVzZXJ2ZSA9IHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KKyAgICBGWF9GTE9BVCBmTGluZVN0YXJ0ID0gYlZlcnRpYWwgPyAoYkxpbmVSZXNlcnZlID8gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gcFBhcmFtcy0+ZkxpbmVTcGFjZSkgOiAwLjBmKSA6IDAuMGY7DQorICAgIEZYX0ZMT0FUIGZMaW5lU3RlcAk9IChiVmVydGlhbCAmJiBiTGluZVJlc2VydmUpID8gKC1wUGFyYW1zLT5mTGluZVNwYWNlKSA6IHBQYXJhbXMtPmZMaW5lU3BhY2U7DQorICAgIEZYX0ZMT0FUIGZMaW5lUG9zCT0gZkxpbmVTdGFydDsNCisgICAgaWYgKG1fcFRleHRTZXQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wVGV4dFNldCA9IEZYX05FVyBDRkRFX1R4dEVkdFRleHRTZXQodGhpcyk7DQorICAgIH0NCisgICAgbV9QaWVjZU1hc3NBcnIuUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzCT0gRlhfVFhUQlJFQUtfTm9uZTsNCisgICAgRlhfSU5UMzIgbkxpbmVTdGFydAkJPSBuUGFnZVN0YXJ0Ow0KKyAgICBGWF9JTlQzMiBuUGllY2VTdGFydAk9IDA7DQorICAgIGlmIChtX3BDaGFyV2lkdGggIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIFtdIG1fcENoYXJXaWR0aDsNCisgICAgfQ0KKyAgICBtX3BDaGFyV2lkdGggPSBuZXcgRlhfSU5UMzJbblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMV07DQorICAgIHBCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgICBwQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgbV9uUGFnZVN0YXJ0ID0gblBhZ2VTdGFydDsNCisgICAgbV9uQ2hhckNvdW50ID0gblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMTsNCisgICAgRlhfQk9PTAkJYlJlbG9hZAkJCT0gRkFMU0U7DQorICAgIEZYX0ZMT0FUCWZEZWZDaGFyV2lkdGgJPSAwOw0KKyAgICBJRlhfQ2hhckl0ZXIgKiBwSXRlciA9IG1fcEl0ZXItPkNsb25lKCk7DQorICAgIHBJdGVyLT5TZXRBdChuUGFnZVN0YXJ0KTsNCisgICAgbV9wSXRlci0+U2V0QXQoblBhZ2VTdGFydCk7DQorICAgIEZYX0lOVDMyIG5UZXh0RW5kID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgICBGWF9CT09MCWJGaXJzdFBpZWNlID0gVFJVRTsNCisgICAgZG8gew0KKyAgICAgICAgaWYgKGJSZWxvYWQpIHsNCisgICAgICAgICAgICBkd0JyZWFrU3RhdHVzID0gcEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdBcHBlbmQgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwQnJlYWstPkFwcGVuZENoYXIod0FwcGVuZCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEl0ZXItPkdldEF0KCkgPT0gblBhZ2VFbmQgJiYgZHdCcmVha1N0YXR1cyA8IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KKyAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5QaWVjZUNvdW50ID0gcEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IG5QaWVjZUNvdW50OyBqICsrKSB7DQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqIHBQaWVjZSA9IHBCcmVhay0+R2V0QnJlYWtQaWVjZShqKTsNCisgICAgICAgICAgICAgICAgRkRFX1RFWFRFRElUUElFQ0UgVHh0RWR0UGllY2U7DQorICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldCgmVHh0RWR0UGllY2UsIDAsIHNpemVvZihGREVfVEVYVEVESVRQSUVDRSkpOw0KKyAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5uQmlkaUxldmVsCT0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7DQorICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLm5Db3VudAkJPSBwUGllY2UtPkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5uU3RhcnQJCT0gblBpZWNlU3RhcnQ7DQorICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLmR3Q2hhclN0eWxlcyA9IHBQaWVjZS0+bV9kd0NoYXJTdHlsZXM7DQorICAgICAgICAgICAgICAgIGlmIChGWF9Jc09kZChwUGllY2UtPm1faUJpZGlMZXZlbCkpIHsNCisgICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLmR3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQYXJhQnJlYWtXaWR0aCA9IDAuMGY7DQorICAgICAgICAgICAgICAgIGlmIChwUGllY2UtPm1fZHdTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3UnRDaGFyID0gIHBQYXJhbXMtPndMaW5lQnJlYWtDaGFyOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFR4dEVkdFBpZWNlLm5Db3VudCA+PSAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmLT5HZXRDaGFyQnlJbmRleChtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Q2hhclByZSA9IHBCdWYtPkdldENoYXJCeUluZGV4KG1fblBhZ2VTdGFydCArIFR4dEVkdFBpZWNlLm5TdGFydCArIFR4dEVkdFBpZWNlLm5Db3VudCAtIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3Q2hhciA9PSB3UnRDaGFyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQYXJhQnJlYWtXaWR0aCArPSBmRGVmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0NoYXJQcmUgPT0gd1J0Q2hhcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFR4dEVkdFBpZWNlLm5Db3VudCA+PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmLT5HZXRDaGFyQnlJbmRleChtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0NoYXIgPT0gd1J0Q2hhcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgICAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLmxlZnQJPSBmTGluZVBvczsNCisgICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UudG9wCQk9IChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLndpZHRoCT0gcFBhcmFtcy0+ZkxpbmVTcGFjZTsNCisgICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UuaGVpZ2h0CT0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZiArIGZQYXJhQnJlYWtXaWR0aDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UubGVmdAk9IChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLnRvcAkJPSBmTGluZVBvczsNCisgICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2Uud2lkdGgJPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmICsgZlBhcmFCcmVha1dpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS5oZWlnaHQJPSBwUGFyYW1zLT5mTGluZVNwYWNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChiRmlyc3RQaWVjZSkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9ydFBhZ2VDb250ZW50cyA9IFR4dEVkdFBpZWNlLnJ0UGllY2U7DQorICAgICAgICAgICAgICAgICAgICBiRmlyc3RQaWVjZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgbV9ydFBhZ2VDb250ZW50cy5VbmlvbihUeHRFZHRQaWVjZS5ydFBpZWNlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBuUGllY2VTdGFydCArPSBUeHRFZHRQaWVjZS5uQ291bnQ7DQorICAgICAgICAgICAgICAgIG1fUGllY2VNYXNzQXJyLkFkZChUeHRFZHRQaWVjZSk7DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgayA9IDA7IGsgPCBUeHRFZHRQaWVjZS5uQ291bnQ7IGsgKyspIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyKiBwdGMgPSBwUGllY2UtPkdldENoYXJQdHIoayk7DQorICAgICAgICAgICAgICAgICAgICBtX3BDaGFyV2lkdGhbVHh0RWR0UGllY2UublN0YXJ0ICsga10gPSBwdGMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmTGluZVBvcyArPSBmTGluZVN0ZXA7DQorICAgICAgICAgICAgcEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEl0ZXItPkdldEF0KCkgPT0gblBhZ2VFbmQgJiYgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCisgICAgICAgICAgICBiUmVsb2FkID0gVFJVRTsNCisgICAgICAgICAgICBwSXRlci0+TmV4dChUUlVFKTsNCisgICAgICAgIH0NCisgICAgfSAgd2hpbGUgKHBJdGVyLT5OZXh0KEZBTFNFKSAmJiAocEl0ZXItPkdldEF0KCkgPD0gblBhZ2VFbmQpKTsNCisgICAgaWYgKG1fcnRQYWdlQ29udGVudHMubGVmdCAhPSAwKSB7DQorICAgICAgICBGWF9GTE9BVCBmRGVsdGEgPSAwLjBmOw0KKyAgICAgICAgaWYgKG1fcnRQYWdlQ29udGVudHMud2lkdGggPCBwUGFyYW1zLT5mUGxhdGVXaWR0aCkgew0KKyAgICAgICAgICAgIGlmIChwUGFyYW1zLT5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX1JpZ2h0KSB7DQorICAgICAgICAgICAgICAgIGZEZWx0YSA9IHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gbV9ydFBhZ2VDb250ZW50cy53aWR0aDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBQYXJhbXMtPmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fQ2VudGVyKSB7DQorICAgICAgICAgICAgICAgIGlmICgocFBhcmFtcy0+ZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpICYmIG1fbkNoYXJDb3VudCA+IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fbkNoYXJDb3VudCAtIDE7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuID0gKG1fcEVkaXRFbmdpbmUtPm1fbkxpbWl0IC0gbkNvdW50KSAvIDI7DQorICAgICAgICAgICAgICAgICAgICBmRGVsdGEgPSAobV9ydFBhZ2VDb250ZW50cy53aWR0aCAvIG5Db3VudCkgKiBuOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZkRlbHRhID0gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gbV9ydFBhZ2VDb250ZW50cy53aWR0aCkgLyAyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZk9mZnNldCA9IG1fcnRQYWdlQ29udGVudHMubGVmdCAtIGZEZWx0YTsNCisgICAgICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fUGllY2VNYXNzQXJyLkdldFNpemUoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgICAgICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICAgICAgICAgIHBQaWVjZS0+cnRQaWVjZS5PZmZzZXQoLWZPZmZzZXQsIDAuMGYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9ydFBhZ2VDb250ZW50cy5PZmZzZXQoLWZPZmZzZXQsIDAuMGYpOw0KKyAgICB9DQorICAgIGlmIChtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xhc3RMaW5lSGVpZ2h0KSB7DQorICAgICAgICBtX3J0UGFnZUNvbnRlbnRzLmhlaWdodCAtPSBwUGFyYW1zLT5mTGluZVNwYWNlIC0gcFBhcmFtcy0+ZkZvbnRTaXplOw0KKyAgICAgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgICAgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChuQ291bnQgLSAxKTsNCisgICAgICAgIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgPSBwUGFyYW1zLT5mRm9udFNpemU7DQorICAgIH0NCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgbV9uUmVmQ291bnQgPSAxOw0KKyAgICBtX2JMb2FkZWQgPSBUUlVFOw0KKyAgICByZXR1cm4gMDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6OlVubG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fblJlZkNvdW50ID4gMCk7DQorICAgIG1fblJlZkNvdW50IC0tOw0KKyAgICBpZiAobV9uUmVmQ291bnQgPT0gMCkgew0KKyAgICAgICAgbV9QaWVjZU1hc3NBcnIuUmVtb3ZlQWxsKCk7DQorICAgICAgICBpZiAobV9wVGV4dFNldCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BUZXh0U2V0Ow0KKyAgICAgICAgICAgIG1fcFRleHRTZXQgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcENoYXJXaWR0aCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBbXSBtX3BDaGFyV2lkdGg7DQorICAgICAgICAgICAgbV9wQ2hhcldpZHRoID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BCZ25QYXJhZykgew0KKyAgICAgICAgICAgIG1fcEJnblBhcmFnLT5VbmxvYWRQYXJhZygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcEVuZFBhcmFnKSB7DQorICAgICAgICAgICAgbV9wRW5kUGFyYWctPlVubG9hZFBhcmFnKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wSXRlcikgew0KKyAgICAgICAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICBtX3BJdGVyID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEJnblBhcmFnID0gTlVMTDsNCisgICAgICAgIG1fcEVuZFBhcmFnID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm47DQorfQ0KK2NvbnN0IENGWF9SZWN0RiYgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDb250ZW50c0JveCgpDQorew0KKyAgICByZXR1cm4gbV9ydFBhZ2VDb250ZW50czsNCit9DQorRlhfUE9TSVRJT04gQ0ZERV9UeHRFZHRQYWdlOjpHZXRGaXJzdFBvc2l0aW9uKEZERV9IVklTVUFMT0JKIGhDYW52YXMpDQorew0KKyAgICBpZiAobV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9QT1NJVElPTikxOw0KK30NCitGREVfSFZJU1VBTE9CSiBDRkRFX1R4dEVkdFBhZ2U6OkdldE5leHQoRkRFX0hWSVNVQUxPQkogaENhbnZhcywgRlhfUE9TSVRJT04gJnBvcywgSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0KQ0KK3sNCisgICAgaWYgKG1fcFRleHRTZXQgPT0gTlVMTCkgew0KKyAgICAgICAgcG9zID0gTlVMTDsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5Qb3MgPSAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpcG9zOw0KKyAgICBwVmlzdWFsU2V0ID0gbV9wVGV4dFNldDsNCisgICAgaWYgKG5Qb3MgKyAxID4gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpKSB7DQorICAgICAgICBwb3MgPSBOVUxMOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcG9zID0gKEZYX1BPU0lUSU9OKShGWF9VSU5UUFRSKShuUG9zICsgMSk7DQorICAgIH0NCisgICAgcmV0dXJuIChGREVfSFZJU1VBTE9CSikobV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoblBvcyAtIDEpKTsNCit9DQorRkRFX0hWSVNVQUxPQkogQ0ZERV9UeHRFZHRQYWdlOjpHZXRQYXJlbnRDYW52YXMoRkRFX0hWSVNVQUxPQkogaENhbnZhcywgSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0KQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX1dDSEFSIENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhcihGWF9MUFZPSUQgcElkZW50aXR5LCBGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IG1fblBhZ2VTdGFydCArICgoRkRFX0xQVEVYVEVESVRQSUVDRSlwSWRlbnRpdHkpLT5uU3RhcnQgKyBpbmRleDsNCisgICAgaWYgKG5JbmRleCAhPSBtX3BJdGVyLT5HZXRBdCgpKSB7DQorICAgICAgICBtX3BJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgICB9DQorICAgIEZYX1dDSEFSIHdDaGFyID0gbV9wSXRlci0+R2V0Q2hhcigpOw0KKyAgICBtX3BJdGVyLT5OZXh0KCk7DQorICAgIHJldHVybiB3Q2hhcjsNCit9DQorRlhfSU5UMzIgQ0ZERV9UeHRFZHRQYWdlOjpHZXRXaWR0aChGWF9MUFZPSUQgcElkZW50aXR5LCBGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIG5XaWR0aCA9IG1fcENoYXJXaWR0aFsoKEZERV9MUFRFWFRFRElUUElFQ0UpcElkZW50aXR5KS0+blN0YXJ0ICsgaW5kZXhdOw0KKyAgICByZXR1cm4gbldpZHRoOw0KK30NCit2b2lkIENGREVfVHh0RWR0UGFnZTo6Tm9ybWFsaXplUHQyUmVjdChDRlhfUG9pbnRGICZwdEYsIGNvbnN0IENGWF9SZWN0RiAmcnRGLCBGWF9GTE9BVCBmVG9sZXJhbmNlKSBjb25zdA0KK3sNCisgICAgaWYgKHJ0Ri5Db250YWlucyhwdEYueCwgcHRGLnkpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHB0Ri54IDwgcnRGLmxlZnQpIHsNCisgICAgICAgIHB0Ri54ID0gcnRGLmxlZnQ7DQorICAgIH0gZWxzZSBpZiAocHRGLnggPj0gcnRGLnJpZ2h0KCkpIHsNCisgICAgICAgIHB0Ri54ID0gcnRGLnJpZ2h0KCkgLSBmVG9sZXJhbmNlOw0KKyAgICB9DQorICAgIGlmIChwdEYueSA8IHJ0Ri50b3ApIHsNCisgICAgICAgIHB0Ri55ID0gcnRGLnRvcDsNCisgICAgfSBlbHNlIGlmIChwdEYueSA+PSBydEYuYm90dG9tKCkpIHsNCisgICAgICAgIHB0Ri55ID0gcnRGLmJvdHRvbSgpIC0gZlRvbGVyYW5jZTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMjFiNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuaApAQCAtMCwwICsxLDEzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfVFhURURUUEFHRV9IDQorI2RlZmluZSBfRkRFX1RYVEVEVFBBR0VfSA0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lOw0KK2NsYXNzIElGWF9DaGFySXRlcjsNCitjbGFzcyBDRkRFX1R4dEVkdFBhZ2U7DQorY2xhc3MgQ0ZERV9UeHRFZHRMaW5lRXh0Ow0KK2NsYXNzIENGREVfVHh0RWR0VGV4dFNldDsNCitjbGFzcyBDRkRFX1R4dEVkdFBhcmFnOw0KK2VudW0gRkRFX1RYVEVEVF9DSEFSVFlQRSB7DQorICAgIEZERV9UWFRFRFRfQ0hBUlRZUEVfVW5rbm93bgk9IDAJLA0KKyAgICBGREVfVFhURURUX0NIQVJUWVBFX1RhYgkJCSwNCisgICAgRkRFX1RYVEVEVF9DSEFSVFlQRV9TcGFjZQkJLA0KKyAgICBGREVfVFhURURUX0NIQVJUWVBFX1B1bmN0dWF0aW9uCSwNCisgICAgRkRFX1RYVEVEVF9DSEFSVFlQRV9MaW5lQnJlYWsJLA0KKyAgICBGREVfVFhURURUX0NIQVJUWVBFX051bWJlcgkJLA0KKyAgICBGREVfVFhURURUX0NIQVJUWVBFX0NoYXIJCSwNCisgICAgRkRFX1RYVEVEVF9DSEFSVFlQRV9DSksJCQksDQorfTsNCitzdGF0aWMgRkRFX1RYVEVEVF9DSEFSVFlQRSBGREVfR2V0RWRpdFNlbENoYXJUeXBlKEZYX1dDSEFSIHdDaGFyKQ0KK3sNCisgICAgaWYgKHdDaGFyID09IDB4OSkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfVGFiOw0KKyAgICB9IGVsc2UgaWYgKHdDaGFyID09IDB4MjAgfHwgd0NoYXIgPT0gMHhBMCkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfU3BhY2U7DQorICAgIH0gZWxzZSBpZiAod0NoYXIgPT0gMHg5IHx8IHdDaGFyID09IDB4MjAgfHwgd0NoYXIgPT0gMHhBMCB8fCAod0NoYXIgPj0gTCchJyAmJiB3Q2hhciA8PSBMJy8nKSB8fCAod0NoYXIgPj0gTCc6JyAmJiB3Q2hhciA8PSBMJ0AnKSB8fCAod0NoYXIgPj0gTCdbJyAmJiB3Q2hhciA8PSBMJ14nKSB8fA0KKyAgICAgICAgICAgICAgICh3Q2hhciA+PSBMJ3snICYmIHdDaGFyIDw9IEwnficpIHx8IHdDaGFyID09IDB4NjApIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX1B1bmN0dWF0aW9uOw0KKyAgICB9IGVsc2UgaWYgKHdDaGFyID09IDB4MGEgfHwgd0NoYXIgPT0gMHgwZCkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfTGluZUJyZWFrOw0KKyAgICB9IGVsc2UgaWYgKHdDaGFyID49ICcwJyAmJiB3Q2hhciA8PSAnOScpIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX051bWJlcjsNCisgICAgfSBlbHNlIGlmICgod0NoYXIgPj0gMHgyZTgwICYmIHdDaGFyIDw9IDB4MmVmZikgfHwgKHdDaGFyID49IDB4MzAwMCAmJiB3Q2hhciA8PSAweDMwM2YpIHx8ICh3Q2hhciA+PSAweDMxYzAgJiYgd0NoYXIgPD0gMHgzMWVmKQ0KKyAgICAgICAgICAgICAgIHx8ICh3Q2hhciA+PSAweDMyMDAgJiYgd0NoYXIgPD0gMHgzMmZmKSB8fCAod0NoYXIgPj0gMHgzMzAwICYmIHdDaGFyIDw9IDB4MzNmZikgfHwgKHdDaGFyID49IDB4MzQwMCAmJiB3Q2hhciA8PSAweDRkYmYpDQorICAgICAgICAgICAgICAgfHwgKHdDaGFyID49IDB4NGUwMCAmJiB3Q2hhciA8PSAweDlmZmYpIHx8ICh3Q2hhciA+PSAweGY5MDAgJiYgd0NoYXIgPD0gMHhmYWZmKSB8fCAod0NoYXIgPj0gMHhmZTMwICYmIHdDaGFyIDw9IDB4ZmU0ZikpIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX0NKSzsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX0NoYXI7DQorICAgIH0NCit9DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9UWFRFRFRQSUVDRSA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgRlhfSU5UMzIJblN0YXJ0Ow0KKyAgICBGWF9JTlQzMgluQ291bnQ7DQorICAgIEZYX0lOVDMyCW5CaWRpTGV2ZWw7DQorICAgIENGWF9SZWN0RglydFBpZWNlOw0KKyAgICBGWF9EV09SRAlkd0NoYXJTdHlsZXM7DQorfSBGREVfVEVYVEVESVRQSUVDRSwgKiBGREVfTFBURVhURURJVFBJRUNFOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZERV9URVhURURJVFBJRUNFPiBDRkRFX1RYVEVEVFBpZWNlTWFzc0FycmF5Ow0KK2NsYXNzIENGREVfVHh0RWR0VGV4dFNldCA6IHB1YmxpYyBJRkRFX1RleHRTZXQsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZERV9UeHRFZHRUZXh0U2V0KENGREVfVHh0RWR0UGFnZSAqIHBQYWdlKTsNCisgICAgfkNGREVfVHh0RWR0VGV4dFNldCgpOw0KKw0KKyAgICB2aXJ0dWFsIEZERV9WSVNVQUxPQkpUWVBFCUdldFR5cGUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRCQm94KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmYmJveCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9NYXRyaXggJm1hdHJpeCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmcnQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoVGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCUdldEZvbnQoRkRFX0hWSVNVQUxPQkogaFRleHQpOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCUdldEZvbnRTaXplKEZERV9IVklTVUFMT0JKIGhUZXh0KTsNCisgICAgdmlydHVhbCBGWF9BUkdCCQlHZXRGb250Q29sb3IoRkRFX0hWSVNVQUxPQkogaFRleHQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldERpc3BsYXlQb3MoRkRFX0hWSVNVQUxPQkogaFRleHQsIEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSwgQ0ZYX1dpZGVTdHJpbmcgKnBXU0Zvcm1zID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0Q2hhclJlY3RzKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0Q2hhclJlY3RzX0ltcGwoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJCQm94ID0gRkFMU0UpOw0KK3ByaXZhdGU6DQorDQorICAgIENGREVfVHh0RWR0UGFnZSAqIG1fcFBhZ2U7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdFBhZ2UgOiBwdWJsaWMgQ0ZYX09iamVjdCwgcHVibGljIElGREVfVHh0RWR0UGFnZQ0KK3sNCitwdWJsaWM6DQorICAgIENGREVfVHh0RWR0UGFnZShJRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsIEZYX0lOVDMyIG5MaW5lSW5kZXgpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIElGREVfVHh0RWR0RW5naW5lICogR2V0RW5naW5lKCkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgRkRFX1ZJU1VBTE9CSlRZUEUJR2V0VHlwZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZiYm94KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRSZWN0KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmcnQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZydCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0Q2hhclJlY3QoRlhfSU5UMzIgbkluZGV4LCBDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkJCb3ggPSBGQUxTRSkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0Q2hhckluZGV4KGNvbnN0IENGWF9Qb2ludEYgJmZQb2ludCwgRlhfQk9PTCAmYkJlZm9yZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJU2VsZWN0V29yZChjb25zdCBDRlhfUG9pbnRGICZmUG9pbnQsIEZYX0lOVDMyICZuQ291bnQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENoYXJTdGFydCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENoYXJDb3VudCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCUNhbGNSYW5nZVJlY3RBcnJheShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCwgQ0ZYX1JlY3RGQXJyYXkgJlJlY3RGQXJyKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXREaXNwbGF5UG9zKGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwLCBGWFRFWFRfQ0hBUlBPUyAqJnBDaGFyUG9zLCBGWF9MUFJFQ1RGIHBCQm94KSBjb25zdDsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzTG9hZGVkKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlMb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwsIElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlVbmxvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCk7DQorDQorICAgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJglHZXRDb250ZW50c0JveCgpOw0KKyAgICB2aXJ0dWFsIEZYX1BPU0lUSU9OCQkJR2V0Rmlyc3RQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoQ2FudmFzKTsNCisgICAgdmlydHVhbCBGREVfSFZJU1VBTE9CSgkJR2V0TmV4dChGREVfSFZJU1VBTE9CSiBoQ2FudmFzLCBGWF9QT1NJVElPTiAmcG9zLCBJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQpOw0KKyAgICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKCQlHZXRQYXJlbnRDYW52YXMoRkRFX0hWSVNVQUxPQkogaENhbnZhcywgSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0KTsNCisgICAgdmlydHVhbCBGWF9XQ0hBUglHZXRDaGFyKEZYX0xQVk9JRCBwSWRlbnRpdHksIEZYX0lOVDMyIGluZGV4KSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRXaWR0aChGWF9MUFZPSUQgcElkZW50aXR5LCBGWF9JTlQzMiBpbmRleCkgY29uc3Q7DQorcHJvdGVjdGVkOg0KKyAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdFBhZ2UoKTsNCitwcml2YXRlOg0KKyAgICB2b2lkIE5vcm1hbGl6ZVB0MlJlY3QoQ0ZYX1BvaW50RiAmcHRGLCBjb25zdCBDRlhfUmVjdEYgJnJ0RiwgRlhfRkxPQVQgZlRvbGVyYW5jZSkgY29uc3Q7DQorICAgIElGWF9DaGFySXRlcgkJCQkqbV9wSXRlcjsNCisgICAgQ0ZERV9UeHRFZHRUZXh0U2V0CQkJKm1fcFRleHRTZXQ7DQorICAgIENGREVfVHh0RWR0RW5naW5lCQkJKm1fcEVkaXRFbmdpbmU7DQorICAgIENGREVfVFhURURUUGllY2VNYXNzQXJyYXkJbV9QaWVjZU1hc3NBcnI7DQorICAgIENGREVfVHh0RWR0UGFyYWcgKgkJCW1fcEJnblBhcmFnOw0KKyAgICBDRkRFX1R4dEVkdFBhcmFnICoJCQltX3BFbmRQYXJhZzsNCisNCisgICAgRlhfSU5UMzIJbV9uUmVmQ291bnQ7DQorICAgIEZYX0lOVDMyCW1fblBhZ2VTdGFydDsNCisgICAgRlhfSU5UMzIJbV9uQ2hhckNvdW50Ow0KKyAgICBGWF9JTlQzMgltX25QYWdlSW5kZXg7DQorICAgIEZYX0JPT0wJCW1fYkxvYWRlZDsNCisgICAgRlhfQk9PTAkJbV9iTGFzdFBhZ2U7DQorICAgIENGWF9SZWN0RgltX3J0UGFnZTsNCisgICAgQ0ZYX1JlY3RGCW1fcnRQYWdlTWFyZ2luOw0KKyAgICBDRlhfUmVjdEYJbV9ydFBhZ2VDb250ZW50czsNCisgICAgQ0ZYX1JlY3RGCW1fcnRQYWdlQ2FudmFzOw0KKyAgICBGWF9JTlQzMioJbV9wQ2hhcldpZHRoOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuY3BwIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODdkZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0cGFyYWcuaCINCisjaW5jbHVkZSAiZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YnVmLmgiDQorQ0ZERV9UeHRFZHRQYXJhZzo6Q0ZERV9UeHRFZHRQYXJhZyhDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUpDQorICAgIDogbV9uTGluZUNvdW50KDApDQorICAgICwgbV9uQ2hhclN0YXJ0KDApDQorICAgICwgbV9uQ2hhckNvdW50KDApDQorICAgICwgbV9scERhdGEoTlVMTCkNCisgICAgLCBtX3BFbmdpbmUocEVuZ2luZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BFbmdpbmUpOw0KK30NCitDRkRFX1R4dEVkdFBhcmFnOjp+Q0ZERV9UeHRFZHRQYXJhZygpDQorew0KKyAgICBpZiAobV9scERhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX2xwRGF0YSk7DQorICAgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpMb2FkUGFyYWcoKQ0KK3sNCisgICAgaWYgKG1fbHBEYXRhICE9IE5VTEwpIHsNCisgICAgICAgICgoRlhfSU5UMzIqKW1fbHBEYXRhKVswXSsrOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGWF9UeHRCcmVhayAqIHBUeHRCcmVhawk9IG1fcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCk7DQorICAgIElGREVfVHh0RWR0QnVmICogcFR4dEJ1Zgk9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1ZigpOw0KKyAgICBjb25zdCBGREVfVFhURURUUEFSQU1TICpwUGFyYW0JPSBtX3BFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgICAgRlhfV0NIQVIgd2NBbGlhcyA9IDA7DQorICAgIGlmIChwUGFyYW0tPmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQpIHsNCisgICAgICAgIHdjQWxpYXMgPSBtX3BFbmdpbmUtPkdldEFsaWFzQ2hhcigpOw0KKyAgICB9DQorICAgIElGWF9DaGFySXRlciAqIHBJdGVyCT0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKXBUeHRCdWYsIHdjQWxpYXMpOw0KKyAgICBwSXRlci0+U2V0QXQobV9uQ2hhclN0YXJ0KTsNCisgICAgRlhfSU5UMzIgbkVuZEluZGV4ID0gbV9uQ2hhclN0YXJ0ICsgbV9uQ2hhckNvdW50Ow0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9JTlQzMj4gTGluZUJhc2VBcnI7DQorICAgIEZYX0JPT0wJCWJSZWxvYWQJCQk9IEZBTFNFOw0KKyAgICBGWF9EV09SRAlkd0JyZWFrU3RhdHVzCT0gRlhfVFhUQlJFQUtfTm9uZTsNCisgICAgRlhfSU5UMzIgblRleHRFbmQgPSBtX3BFbmdpbmUtPkdldFRleHRCdWZMZW5ndGgoKTsNCisgICAgZG8Jew0KKyAgICAgICAgaWYgKGJSZWxvYWQpIHsNCisgICAgICAgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdBcHBlbmQgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkFwcGVuZENoYXIod0FwcGVuZCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEl0ZXItPkdldEF0KCkgKyAxID09IG5FbmRJbmRleCAmJiBkd0JyZWFrU3RhdHVzIDwgRlhfVFhUQlJFQUtfTGluZUJyZWFrKSB7DQorICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgbkNvdW50ID0gcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgblRvdGFsID0gMDsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbkNvdW50OyBqICsrKSB7DQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqIFBpZWNlID0gcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGopOw0KKyAgICAgICAgICAgICAgICBuVG90YWwgKz0gUGllY2UtPkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBMaW5lQmFzZUFyci5BZGQoblRvdGFsKTsNCisgICAgICAgICAgICBwVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgocEl0ZXItPkdldEF0KCkgKyAxID09IG5FbmRJbmRleCkgJiYgKGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfTGluZUJyZWFrKSkgew0KKyAgICAgICAgICAgIGJSZWxvYWQgPSBUUlVFOw0KKyAgICAgICAgICAgIHBJdGVyLT5OZXh0KFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChwSXRlci0+TmV4dChGQUxTRSkgJiYgKHBJdGVyLT5HZXRBdCgpIDwgbkVuZEluZGV4KSk7DQorICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgIHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgICBwVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgRlhfSU5UMzIgbkxpbmVDb3VudCA9IExpbmVCYXNlQXJyLkdldFNpemUoKTsNCisgICAgbV9uTGluZUNvdW50ID0gbkxpbmVDb3VudDsNCisgICAgaWYgKG1fbHBEYXRhID09IE5VTEwpIHsNCisgICAgICAgIG1fbHBEYXRhID0gRlhfQWxsb2MoRlhfSU5UMzIsIG5MaW5lQ291bnQgKyAxKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fbHBEYXRhID0gRlhfUmVhbGxvYyhGWF9JTlQzMiwgbV9scERhdGEsIChuTGluZUNvdW50ICsgMSkpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyICogcEludEFyciA9IChGWF9JTlQzMiopbV9scERhdGE7DQorICAgIHBJbnRBcnJbMF0gPSAxOw0KKyAgICBtX25MaW5lQ291bnQgPSBuTGluZUNvdW50Ow0KKyAgICBwSW50QXJyICsrOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbkxpbmVDb3VudDsgaiArKywgcEludEFyciArKykgew0KKyAgICAgICAgKnBJbnRBcnIgPSBMaW5lQmFzZUFycltqXTsNCisgICAgfQ0KKyAgICBMaW5lQmFzZUFyci5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpVbmxvYWRQYXJhZygpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9scERhdGEgIT0gTlVMTCk7DQorICAgICgoRlhfSU5UMzIqKW1fbHBEYXRhKVswXS0tOw0KKyAgICBGWFNZU19hc3NlcnQoKChGWF9JTlQzMiopbV9scERhdGEpWzBdID49IDApOw0KKyAgICBpZiAoKChGWF9JTlQzMiopbV9scERhdGEpWzBdID09IDApIHsNCisgICAgICAgIEZYX0ZyZWUobV9scERhdGEpOw0KKyAgICAgICAgbV9scERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRQYXJhZzo6Q2FsY0xpbmVzKCkNCit7DQorICAgIElGWF9UeHRCcmVhayAqIHBUeHRCcmVhawk9IG1fcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCk7DQorICAgIElGREVfVHh0RWR0QnVmICogcFR4dEJ1Zgk9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1ZigpOw0KKyAgICBJRlhfQ2hhckl0ZXIgKiBwSXRlcgk9IEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKilwVHh0QnVmKTsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gMDsNCisgICAgRlhfRFdPUkQgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7DQorICAgIEZYX0lOVDMyIG5FbmRJbmRleCA9IG1fbkNoYXJTdGFydCArIG1fbkNoYXJDb3VudDsNCisgICAgcEl0ZXItPlNldEF0KG1fbkNoYXJTdGFydCk7DQorICAgIEZYX0JPT0wgYlJlbG9hZCA9IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBuVGV4dEVuZCA9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgICBkbyB7DQorICAgICAgICBpZiAoYlJlbG9hZCkgew0KKyAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4ICYmIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCisgICAgICAgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgICAgICBuQ291bnQgKys7DQorICAgICAgICAgICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKHBJdGVyLT5HZXRBdCgpICsgMSA9PSBuRW5kSW5kZXgpICYmIChkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykpIHsNCisgICAgICAgICAgICBiUmVsb2FkID0gVFJVRTsNCisgICAgICAgICAgICBwSXRlci0+TmV4dChUUlVFKTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAocEl0ZXItPk5leHQoRkFMU0UpICYmIChwSXRlci0+R2V0QXQoKSA8IG5FbmRJbmRleCkpOw0KKyAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICAgIG1fbkxpbmVDb3VudCA9IG5Db3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpHZXRMaW5lUmFuZ2UoRlhfSU5UMzIgbkxpbmVJbmRleCwgRlhfSU5UMzImIG5TdGFydCwgRlhfSU5UMzImIG5Db3VudCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyICogcExpbmVCYXNlQXJyID0gKEZYX0lOVDMyKiltX2xwRGF0YTsNCisgICAgRlhTWVNfYXNzZXJ0KG5MaW5lSW5kZXggPCBtX25MaW5lQ291bnQpOw0KKyAgICBuU3RhcnQgPSBtX25DaGFyU3RhcnQ7DQorICAgIHBMaW5lQmFzZUFyciArKzsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5MaW5lSW5kZXg7IGkgKyspIHsNCisgICAgICAgIG5TdGFydCArPSAqcExpbmVCYXNlQXJyOw0KKyAgICAgICAgcExpbmVCYXNlQXJyICsrOw0KKyAgICB9DQorICAgIG5Db3VudCA9ICpwTGluZUJhc2VBcnI7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTg0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1RYVEVEVFBBUkFHX0gNCisjZGVmaW5lIF9GREVfVFhURURUUEFSQUdfSA0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lOw0KK2NsYXNzIENGREVfVHh0RWR0UGFyYWc7DQorY2xhc3MgQ0ZERV9UeHRFZHRQYXJhZyA6IHB1YmxpYyBJRkRFX1R4dEVkdFBhcmFnLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGREVfVHh0RWR0UGFyYWcoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lKTsNCisgICAgfkNGREVfVHh0RWR0UGFyYWcoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFRleHRMZW5ndGgoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9uQ2hhckNvdW50Ow0KKyAgICB9DQorICAgIHZpcnR1YWwJRlhfSU5UMzIJCQlHZXRTdGFydEluZGV4KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fbkNoYXJTdGFydDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJQ291bnRMaW5lcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX25MaW5lQ291bnQ7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCUdldExpbmVSYW5nZShGWF9JTlQzMiBuTGluZUluZGV4LCBGWF9JTlQzMiYgblN0YXJ0LCBGWF9JTlQzMiYgbkNvdW50KSBjb25zdDsNCisgICAgdm9pZAlMb2FkUGFyYWcoKTsNCisgICAgdm9pZAlVbmxvYWRQYXJhZygpOw0KKyAgICB2b2lkCUNhbGNMaW5lcygpOw0KKyAgICBGWF9JTlQzMgltX25DaGFyU3RhcnQ7DQorICAgIEZYX0lOVDMyCW1fbkNoYXJDb3VudDsNCisgICAgRlhfSU5UMzIJbV9uTGluZUNvdW50Ow0KK3ByaXZhdGU6DQorICAgIEZYX0xQVk9JRAkJCW1fbHBEYXRhOw0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSoJbV9wRW5naW5lOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha19pbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODQ3YWY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZ4X3dvcmRicmVha19pbXBsLmgiDQorI2RlZmluZSBGWF9Jc09kZChhKSAoKGEpICYgMSkNCitGWF9Xb3JkQnJlYWtQcm9wIEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KEZYX1dDSEFSIHdjQ29kZVBvaW50KQ0KK3sNCisgICAgRlhfRFdPUkQJZHdQcm9wZXJ0eSA9IChGWF9EV09SRClnc19GWF9Xb3JkQnJlYWtfQ29kZVBvaW50UHJvcGVydGllc1t3Y0NvZGVQb2ludCA+PiAxXTsNCisgICAgcmV0dXJuIChGWF9Xb3JkQnJlYWtQcm9wKShGWF9Jc09kZCh3Y0NvZGVQb2ludCkgPyAoZHdQcm9wZXJ0eSAmIDB4MEYpIDogKGR3UHJvcGVydHkgPj4gNCkpOw0KK30NCitDRlhfQ2hhckl0ZXI6OkNGWF9DaGFySXRlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmIHdzVGV4dCkNCisgICAgOiBtX3dzVGV4dCh3c1RleHQpDQorICAgICwgbV9uSW5kZXgoMCkNCit7DQorICAgIEZYU1lTX2Fzc2VydCghd3NUZXh0LklzRW1wdHkoKSk7DQorfQ0KK0NGWF9DaGFySXRlcjo6fkNGWF9DaGFySXRlcigpDQorew0KK30NCit2b2lkIENGWF9DaGFySXRlcjo6UmVsZWFzZSgpDQorew0KKyAgICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTCBDRlhfQ2hhckl0ZXI6Ok5leHQoRlhfQk9PTCBiUHJldiApDQorew0KKyAgICBpZiAoYlByZXYpIHsNCisgICAgICAgIGlmIChtX25JbmRleCA8PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9uSW5kZXggLS07DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9uSW5kZXggKyAxID49IG1fd3NUZXh0LkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9uSW5kZXggKys7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX1dDSEFSIENGWF9DaGFySXRlcjo6R2V0Q2hhcigpDQorew0KKyAgICByZXR1cm4gbV93c1RleHQuR2V0QXQobV9uSW5kZXgpOw0KK30NCit2b2lkIENGWF9DaGFySXRlcjo6U2V0QXQoRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fd3NUZXh0LkdldExlbmd0aCgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9uSW5kZXggPSBuSW5kZXg7DQorfQ0KK0ZYX0lOVDMyIENGWF9DaGFySXRlcjo6R2V0QXQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fbkluZGV4Ow0KK30NCitGWF9CT09MIENGWF9DaGFySXRlcjo6SXNFT0YoRlhfQk9PTCBiVGFpbCApIGNvbnN0DQorew0KKyAgICByZXR1cm4gYlRhaWwgPyAobV9uSW5kZXggKyAxID09IG1fd3NUZXh0LkdldExlbmd0aCgpKSA6IChtX25JbmRleCA9PSAwKTsNCit9DQorSUZYX0NoYXJJdGVyICogQ0ZYX0NoYXJJdGVyOjpDbG9uZSgpDQorew0KKyAgICBDRlhfQ2hhckl0ZXIgKiBwSXRlciA9IG5ldyBDRlhfQ2hhckl0ZXIobV93c1RleHQpOw0KKyAgICBwSXRlci0+bV9uSW5kZXggPSBtX25JbmRleDsNCisgICAgcmV0dXJuIHBJdGVyOw0KK30NCitDRlhfV29yZEJyZWFrOjpDRlhfV29yZEJyZWFrKCkNCisgICAgOiBtX3BQcmVJdGVyKE5VTEwpDQorICAgICwgbV9wQ3VySXRlcihOVUxMKQ0KK3sNCit9DQorQ0ZYX1dvcmRCcmVhazo6fkNGWF9Xb3JkQnJlYWsoKQ0KK3sNCisgICAgaWYgKG1fcFByZUl0ZXIpIHsNCisgICAgICAgIG1fcFByZUl0ZXItPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcFByZUl0ZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BDdXJJdGVyKSB7DQorICAgICAgICBtX3BDdXJJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BDdXJJdGVyID0gTlVMTDsNCisgICAgfQ0KK30NCit2b2lkIENGWF9Xb3JkQnJlYWs6OlJlbGVhc2UoKQ0KK3sNCisgICAgZGVsZXRlIHRoaXM7DQorfQ0KK3ZvaWQgQ0ZYX1dvcmRCcmVhazo6QXR0YWNoKElGWF9DaGFySXRlciAqIHBJdGVyKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBJdGVyKTsNCisgICAgbV9wQ3VySXRlciA9IHBJdGVyOw0KK30NCit2b2lkIENGWF9Xb3JkQnJlYWs6OkF0dGFjaChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgbV9wQ3VySXRlciA9IG5ldyBDRlhfQ2hhckl0ZXIod3NUZXh0KTsNCit9DQorRlhfQk9PTCBDRlhfV29yZEJyZWFrOjpOZXh0KEZYX0JPT0wgYlByZXYpDQorew0KKyAgICBJRlhfQ2hhckl0ZXIgKiBwSXRlciA9IGJQcmV2ID8gbV9wUHJlSXRlci0+Q2xvbmUoKSA6IG1fcEN1ckl0ZXItPkNsb25lKCk7DQorICAgIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHBJdGVyLT5OZXh0KGJQcmV2KTsNCisgICAgaWYgKCFGaW5kTmV4dEJyZWFrUG9zKHBJdGVyLCBiUHJldiwgVFJVRSkpIHsNCisgICAgICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGJQcmV2KSB7DQorICAgICAgICBtX3BDdXJJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BDdXJJdGVyID0gbV9wUHJlSXRlcjsNCisgICAgICAgIG1fcEN1ckl0ZXItPk5leHQoVFJVRSk7DQorICAgICAgICBtX3BQcmVJdGVyID0gcEl0ZXI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BQcmVJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BQcmVJdGVyID0gbV9wQ3VySXRlcjsNCisgICAgICAgIG1fcFByZUl0ZXItPk5leHQoKTsNCisgICAgICAgIG1fcEN1ckl0ZXIgPSBwSXRlcjsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRlhfV29yZEJyZWFrOjpTZXRBdChGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICBpZiAobV9wUHJlSXRlcikgew0KKyAgICAgICAgbV9wUHJlSXRlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wUHJlSXRlciA9IE5VTEw7DQorICAgIH0NCisgICAgbV9wQ3VySXRlci0+U2V0QXQobkluZGV4KTsNCisgICAgRmluZE5leHRCcmVha1BvcyhtX3BDdXJJdGVyLCBUUlVFLCBGQUxTRSk7DQorICAgIG1fcFByZUl0ZXIgPSBtX3BDdXJJdGVyOw0KKyAgICBtX3BDdXJJdGVyID0gbV9wUHJlSXRlci0+Q2xvbmUoKTsNCisgICAgRmluZE5leHRCcmVha1BvcyhtX3BDdXJJdGVyLCBGQUxTRSwgRkFMU0UpOw0KK30NCitGWF9JTlQzMiBDRlhfV29yZEJyZWFrOjpHZXRXb3JkUG9zKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BQcmVJdGVyLT5HZXRBdCgpOw0KK30NCitGWF9JTlQzMiBDRlhfV29yZEJyZWFrOjpHZXRXb3JkTGVuZ3RoKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BDdXJJdGVyLT5HZXRBdCgpIC0gbV9wUHJlSXRlci0+R2V0QXQoKSArIDE7DQorfQ0KK3ZvaWQgQ0ZYX1dvcmRCcmVhazo6R2V0V29yZChDRlhfV2lkZVN0cmluZyAmd3NXb3JkKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgbldvcmRMZW5ndGggPSBHZXRXb3JkTGVuZ3RoKCk7DQorICAgIGlmIChuV29yZExlbmd0aCA8PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfTFBXU1RSIGxwQnVmID0gd3NXb3JkLkdldEJ1ZmZlcihuV29yZExlbmd0aCk7DQorICAgIElGWF9DaGFySXRlciAqIHBUZW1wSXRlciA9IG1fcFByZUl0ZXItPkNsb25lKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICB3aGlsZSAocFRlbXBJdGVyLT5HZXRBdCgpIDw9IG1fcEN1ckl0ZXItPkdldEF0KCkpIHsNCisgICAgICAgIGxwQnVmW2krK10gPSBwVGVtcEl0ZXItPkdldENoYXIoKTsNCisgICAgICAgIEZYX0JPT0wgYkVuZCA9IHBUZW1wSXRlci0+TmV4dCgpOw0KKyAgICAgICAgaWYgKCFiRW5kKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcFRlbXBJdGVyLT5SZWxlYXNlKCk7DQorICAgIHdzV29yZC5SZWxlYXNlQnVmZmVyKG5Xb3JkTGVuZ3RoKTsNCit9DQorRlhfQk9PTCBDRlhfV29yZEJyZWFrOjpJc0VPRihGWF9CT09MIGJUYWlsKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcEN1ckl0ZXItPklzRU9GKGJUYWlsKTsNCit9DQorRlhfQk9PTCBDRlhfV29yZEJyZWFrOjpGaW5kTmV4dEJyZWFrUG9zKElGWF9DaGFySXRlciAqIHBJdGVyLCBGWF9CT09MIGJQcmV2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGcm9tTmV4dCApDQorew0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wIGVQcmVUeXBlCT0gRlhfV29yZEJyZWFrUHJvcF9Ob25lOw0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wIGVDdXJUeXBlCT0gRlhfV29yZEJyZWFrUHJvcF9Ob25lOw0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wIGVOZXh0VHlwZSA9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsNCisgICAgaWYgKHBJdGVyLT5Jc0VPRighYlByZXYpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoIShiRnJvbU5leHQgfHwgcEl0ZXItPklzRU9GKGJQcmV2KSkpIHsNCisgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgICAgICBGWF9XQ0hBUgl3Y1RlbXAJPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgZVByZVR5cGUgPSBGWF9HZXRXb3JkQnJlYWtQcm9wZXJ0eSh3Y1RlbXApOw0KKyAgICAgICAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgICB9DQorICAgIEZYX1dDSEFSCXdjVGVtcAk9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgIGVDdXJUeXBlID0gRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCisgICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOw0KKyAgICBkbyB7DQorICAgICAgICBwSXRlci0+TmV4dChiUHJldik7DQorICAgICAgICBGWF9XQ0hBUgl3Y1RlbXAJPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgZU5leHRUeXBlID0gRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCisgICAgICAgIEZYX1dPUkQgd0JyZWFrID0gZ3NfRlhfV29yZEJyZWFrX1RhYmxlW2VDdXJUeXBlXSAmICgoRlhfV09SRCkoMSA8PCBlTmV4dFR5cGUpKTsNCisgICAgICAgIGlmICh3QnJlYWspIHsNCisgICAgICAgICAgICBpZiAocEl0ZXItPklzRU9GKCFiUHJldikpIHsNCisgICAgICAgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiRmlyc3QpIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkZsYWdzID0gMDsNCisgICAgICAgICAgICAgICAgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTGV0dGVyKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5GbGFncyA9IDE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW0pIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5GbGFncyA9IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWdzID0gMTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChuRmxhZ3MgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQobkZsYWdzIDw9IDIpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKG5GbGFncyA9PSAxICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwSXRlci0+TmV4dChiUHJldik7DQorICAgICAgICAgICAgICAgICAgICB3QnJlYWsgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHdCcmVhaykgew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBuRmxhZ3MgPSAwOw0KKyAgICAgICAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTGV0dGVyKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWdzID0gMTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW0pIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWdzID0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWdzID0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobkZsYWdzIDw9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQobkZsYWdzIDw9IDIpOw0KKyAgICAgICAgICAgICAgICBwSXRlci0+TmV4dChiUHJldik7DQorICAgICAgICAgICAgICAgIHdjVGVtcCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgICAgICAgICAgIGVOZXh0VHlwZSA9IChGWF9Xb3JkQnJlYWtQcm9wKUZYX0dldFdvcmRCcmVha1Byb3BlcnR5KHdjVGVtcCk7DQorICAgICAgICAgICAgICAgIGlmICghKChuRmxhZ3MgPT0gMSAmJiBlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChuRmxhZ3MgPT0gMiAmJiBlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykpKSB7DQorICAgICAgICAgICAgICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOw0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZVByZVR5cGUJPSBlQ3VyVHlwZTsNCisgICAgICAgIGVDdXJUeXBlCT0gZU5leHRUeXBlOw0KKyAgICAgICAgYkZpcnN0CQk9IEZBTFNFOw0KKyAgICB9IHdoaWxlICghcEl0ZXItPklzRU9GKCFiUHJldikpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorSUZYX1dvcmRCcmVhayAqIEZYX1dvcmRCcmVha19DcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBDRlhfV29yZEJyZWFrOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha19pbXBsLmggYi94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha19pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4OTVhNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuaApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1dPUkRCUkVBS19JTVBMX0gNCisjZGVmaW5lIF9GWF9XT1JEQlJFQUtfSU1QTF9IDQorZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ3NfRlhfV29yZEJyZWFrX1RhYmxlWzE2XTsNCitleHRlcm4gY29uc3QgRlhfQllURSBnc19GWF9Xb3JkQnJlYWtfQ29kZVBvaW50UHJvcGVydGllc1soMHhGRkZGIC0gMSkgLyAyICsgMV07DQorZW51bSBGWF9Xb3JkQnJlYWtQcm9wIHsNCisgICAgRlhfV29yZEJyZWFrUHJvcF9Ob25lCQk9IDAJLA0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wX0NSCQkJCSwNCisgICAgRlhfV29yZEJyZWFrUHJvcF9MRgkJCQksDQorICAgIEZYX1dvcmRCcmVha1Byb3BfTmV3TGluZQkJLA0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wX0V4dGVuZAkJCSwNCisgICAgRlhfV29yZEJyZWFrUHJvcF9Gb3JtYXQJCQksDQorICAgIEZYX1dvcmRCcmVha1Byb3BfS2F0YUthbmEJCSwNCisgICAgRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyCQksDQorICAgIEZYX1dvcmRCcmVha1Byb3BfTWlkTGV0dGVyCQksDQorICAgIEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtCQkJLA0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bUxldAkJLA0KKyAgICBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljCQksDQorICAgIEZYX1dvcmRCcmVha1Byb3BfRXh0ZW5kTnVtTGV0CSwNCit9Ow0KK0ZYX1dvcmRCcmVha1Byb3AgRlhfR2V0V29yZEJyZWFrUHJvcGVydHkoRlhfV0NIQVIgd2NDb2RlUG9pbnQpOw0KK2NsYXNzIENGWF9DaGFySXRlciA6IHB1YmxpYyBJRlhfQ2hhckl0ZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0NoYXJJdGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgd3NUZXh0KTsNCisgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2ID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXIoKTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRBdChGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldEF0KCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNFT0YoRlhfQk9PTCBiVGFpbCA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIElGWF9DaGFySXRlciAqIENsb25lKCk7DQorcHJvdGVjdGVkOg0KKyAgICB+Q0ZYX0NoYXJJdGVyKCk7DQorcHJpdmF0ZToNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJm1fd3NUZXh0Ow0KKyAgICBGWF9JTlQzMgltX25JbmRleDsNCit9Ow0KK2NsYXNzIENGWF9Xb3JkQnJlYWsgOiBwdWJsaWMgSUZYX1dvcmRCcmVhaywgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfV29yZEJyZWFrKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUF0dGFjaChJRlhfQ2hhckl0ZXIgKiBwSXRlcik7DQorICAgIHZpcnR1YWwgdm9pZAkJQXR0YWNoKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU5leHQoRlhfQk9PTCBiUHJldik7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0QXQoRlhfSU5UMzIgbkluZGV4KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRXb3JkUG9zKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0V29yZExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldFdvcmQoQ0ZYX1dpZGVTdHJpbmcgJndzV29yZCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNFT0YoRlhfQk9PTCBiVGFpbCApIGNvbnN0Ow0KK3Byb3RlY3RlZDoNCisgICAgfkNGWF9Xb3JkQnJlYWsoKTsNCisgICAgRlhfQk9PTCBGaW5kTmV4dEJyZWFrUG9zKElGWF9DaGFySXRlciAqIHBJdGVyLCBGWF9CT09MIGJQcmV2LCBGWF9CT09MIGJGcm9tTmV4dCA9IFRSVUUpOw0KK3ByaXZhdGU6DQorICAgIElGWF9DaGFySXRlciAqIG1fcFByZUl0ZXI7DQorICAgIElGWF9DaGFySXRlciAqIG1fcEN1ckl0ZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha2RhdGEuY3BwIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2UzMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcApAQCAtMCwwICsxLDIwNjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZ4X3dvcmRicmVha19pbXBsLmgiDQorZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ3NfRlhfV29yZEJyZWFrX1RhYmxlWzE2XSA9IHsNCisgICAgMHhGRkZGLCAweEZGRjksIDB4RkZGQiwgMHhGRkZCLCAweEZGRkIsIDB4RkZGQiwgMHhFRkJCLCAweEU3N0IsDQorICAgIDB4RkZGQiwgMHhGRkZCLCAweEZGRkIsIDB4RTc3QiwgMHhFNzNCLCAweEZGRkIsIDB4RkZGQiwgMHhGRkZCLA0KK307DQorZXh0ZXJuIGNvbnN0IEZYX0JZVEUgZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbKDB4RkZGRiAtIDEpIC8gMiArIDFdID0gew0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIzLCAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDkwLCAweEEwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDg5LCAweDAwLCAweDAwLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDBDLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDkwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweDc3LCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LA0KKyAgICAweDA0LCAweDQwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDBCLCAweDkwLCAweDc3LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ1LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc0LCAweDQwLCAweDQ0LCAweDQ0LCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDcwLCAweDA3LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDAwLCAweDkwLCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDc0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDc0LCAweDQ0LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDA3LCAweDcwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDc3LCAweDA3LA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDcwLCAweDc3LCAweDAwLCAweDQwLCAweDQ0LA0KKyAgICAweDQ0LCAweDQwLCAweDAwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDcwLCAweDcwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDQ0LCAweDc3LCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQ0LCAweDA0LCAweDQ0LCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDc3LCAweDA3LA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDQ3LCAweDA3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDcwLCAweDcwLCAweDc3LA0KKyAgICAweDAwLCAweDA3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDQ0LA0KKyAgICAweDQ0LCAweDQwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLCAweDc3LCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDQwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDQ0LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDQ0LA0KKyAgICAweDQwLCAweDQ0LCAweDQwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDA0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDQ0LCAweDQ0LCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA0LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDA0LA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDA3LCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLA0KKyAgICAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweEEwLCAweDA4LCAweDMzLCAweDU1LCAweDU1LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLA0KKyAgICAweEMwLCAweDAwLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDU1LCAweDU1LCAweDUwLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDU1LCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDcwLCAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LA0KKyAgICAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDA2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDA3LCAweDcwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ2LCAweDYwLCAweDAwLA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDYwLCAweDY2LCAweDY2LA0KKyAgICAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDYwLA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDA3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDQ3LCAweDc3LCAweDQ3LCAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDAwLCAweDAwLA0KKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDAwLCAweDAwLCAweDQ0LA0KKyAgICAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDA3LCAweDQ3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDcwLCAweDcwLA0KKyAgICAweDc3LCAweDA3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDkwLCAweDA4LCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweENDLCAweDkwLCAweEEwLCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA1LA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDkwLCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDAwLCAweDAwLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDBDLA0KKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDQ0LA0KKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDU1LCAweDAwLCAweDAwLA0KK307DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZmdhcy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZmdhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDg1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9mZ2FzLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GR0FTXw0KKyNkZWZpbmUgX0ZHQVNfDQorI2luY2x1ZGUgImZ4X3N5cy5oIg0KKyNpbmNsdWRlICJmeF9tZW0uaCINCisjaW5jbHVkZSAiZnhfbGdnLmgiDQorI2luY2x1ZGUgImZ4X3V0bC5oIg0KKyNpbmNsdWRlICJmeF9hbGcuaCINCisjaW5jbHVkZSAiZnhfY3BnLmgiDQorI2luY2x1ZGUgImZ4X3N0bS5oIg0KKyNpbmNsdWRlICJmeF9kYXRldGltZS5oIg0KKyNpbmNsdWRlICJmeF9sb2NhbGUuaCINCisjaW5jbHVkZSAiZnhfc2F4LmgiDQorI2luY2x1ZGUgImZ4X2ZudC5oIg0KKyNpbmNsdWRlICJmeF91Y2QuaCINCisjaW5jbHVkZSAiZnhfbGJrLmgiDQorI2luY2x1ZGUgImZ4X3Riay5oIg0KKyNpbmNsdWRlICJmeF9yYmsuaCINCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9hbGcuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2FsZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTQ2NjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9hbGcuaApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0FMR09SSVRITQ0KKyNkZWZpbmUgX0ZYX0FMR09SSVRITQ0KKyNkZWZpbmUgRlhfSXNPZGQoYSkJKChhKSAmIDEpDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorRlhfSU5UMzIJRlhfQmFzZTY0RW5jb2RlQShGWF9MUENCWVRFIHBTcmMsIEZYX0lOVDMyIGlTcmNMZW4sIEZYX0xQU1RSIHBEc3QpOw0KK0ZYX0lOVDMyCUZYX0Jhc2U2NERlY29kZUEoRlhfTFBDU1RSIHBTcmMsIEZYX0lOVDMyIGlTcmNMZW4sIEZYX0xQQllURSBwRHN0KTsNCitGWF9JTlQzMglGWF9CYXNlNjREZWNvZGVXKEZYX0xQQ1dTVFIgcFNyYywgRlhfSU5UMzIgaVNyY0xlbiwgRlhfTFBCWVRFIHBEc3QpOw0KK0ZYX0JZVEUJCUZYX0hleDJEZWMoRlhfQllURSBoZXhIaWdoLCBGWF9CWVRFIGhleExvdyk7DQorRlhfSU5UMzIJRlhfU2VwYXJhdGVTdHJpbmdXKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaVN0ckxlbiwgRlhfV0NIQVIgZGVsaW1pdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZwaWVjZXMpOw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK307DQorI2VuZGlmDQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0RTUEFUZW1wbGF0ZQ0KK3sNCitwdWJsaWM6DQorICAgIEZYX0lOVDMyIExvb2t1cChjb25zdCBiYXNlVHlwZSAmZmluZCwgY29uc3QgYmFzZVR5cGUgKnBBcnJheSwgRlhfSU5UMzIgaUNvdW50KQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocEFycmF5ICE9IE5VTEwpOw0KKyAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpRW5kID0gaUNvdW50IC0gMSwgaU1pZDsNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgICAgICBjb25zdCBiYXNlVHlwZSAmdiA9IHBBcnJheVtpTWlkXTsNCisgICAgICAgICAgICBpZiAoZmluZCA9PSB2KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpTWlkOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmluZCA8IHYpIHsNCisgICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9jcGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M2NTIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfQ09ERVBBR0UNCisjZGVmaW5lIF9GWF9DT0RFUEFHRQ0KK2NsYXNzIElGWF9Db2RlUGFnZTsNCisjZGVmaW5lIEZYX0NPREVQQUdFX0RlZkFOU0kJCQkJCQkwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9EZWZPRU0JCQkJCQkxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9EZWZNQUMJCQkJCQkyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9UaHJlYWQJCQkJCQkzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9TeW1ib2wJCQkJCQk0Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVVMJCQkJCTQzNw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX0FTTU83MDgJCQkJNzA4DQorI2RlZmluZSBGWF9DT0RFUEFHRV9BcmFiaWNfQVNNTzQ0OVBsdXMJCQk3MDkNCisjZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19UcmFuc3BhcmVudAkJCTcxMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX05hZml0aGFFbmhhbmNlZAkJNzExDQorI2RlZmluZSBGWF9DT0RFUEFHRV9BcmFiaWNfVHJhbnNwYXJlbnRBU01PCQk3MjANCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMQkJCQk3MzcNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0JhbHRpYwkJCQk3NzUNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luMzFfV2VzdGVybkV1cm9wZWFuCQk4MTkNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1dlc3Rlcm5FdXJvcGVhbgkJODUwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19FYXN0ZXJuRXVyb3BlYW4JCTg1Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTGF0aW4zCQkJCTg1Mw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQ3lyaWxsaWMJCQkJODU1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19UdXJraXNoCQkJCTg1Nw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTGF0aW4xRXVybwkJCTg1OA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfUG9ydHVndWVzZQkJCTg2MA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSWNlbGFuZGljCQkJCTg2MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSGVicmV3CQkJCTg2Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfRnJlbmNoQ2FuYWRpYW4JCTg2Mw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQXJhYmljCQkJCTg2NA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTm9yd2VnaWFuCQkJCTg2NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfUnVzc2lhbgkJCQk4NjYNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMgkJCQk4NjkNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1RoYWkJCQkJCTg3NA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfS2FtZW5pY2t5Q1MJCQk4OTUNCisjZGVmaW5lIEZYX0NPREVQQUdFX1NoaWZ0SklTCQkJCQk5MzINCisjZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkCQkJOTM2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9Lb3JlYW4JCQkJCQk5NDkNCisjZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbAkJCTk1MA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMTZMRQkJCQkJCTEyMDANCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjE2QkUJCQkJCQkxMjAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4JCTEyNTANCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljCQkJCTEyNTENCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbgkJMTI1Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fR3JlZWsJCQkJCTEyNTMNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2gJCQkJMTI1NA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3CQkJCTEyNTUNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYwkJCQkxMjU2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMJCQkJMTI1Nw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZQkJCTEyNTgNCisjZGVmaW5lIEZYX0NPREVQQUdFX0pvaGFiCQkJCQkJMTM2MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1JvbWFuCQkJCQkxMDAwMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1NoaWZ0SklTCQkJCTEwMDAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ2hpbmVzZVRyYWRpdGlvbmFsCQkxMDAwMg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0tvcmVhbgkJCQkJMTAwMDMNCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19BcmFiaWMJCQkJCTEwMDA0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfSGVicmV3CQkJCQkxMDAwNQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0dyZWVrCQkJCQkxMDAwNg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0N5cmlsbGljCQkJCTEwMDA3DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ2hpbmVzZVNpbXBsaWZpZWQJCTEwMDA4DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfVGhhaQkJCQkJMTAwMjENCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19FYXN0ZXJuRXVyb3BlYW4JCQkxMDAyOQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1R1cmtpc2gJCQkJCTEwMDgxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkxFCQkJCQkJMTIwMDANCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjMyQkUJCQkJCQkxMjAwMQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xCQkJCQkyODU5MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8yCQkJCQkyODU5Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8zCQkJCQkyODU5Mw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV80CQkJCQkyODU5NA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV81CQkJCQkyODU5NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV82CQkJCQkyODU5Ng0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV83CQkJCQkyODU5Nw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV84CQkJCQkyODU5OA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV85CQkJCQkyODU5OQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xMAkJCQkJMjg2MDANCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTEJCQkJCTI4NjAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEyCQkJCQkyODYwMg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xMwkJCQkJMjg2MDMNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTQJCQkJCTI4NjA0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE1CQkJCQkyODYwNQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xNgkJCQkJMjg2MDYNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0RldmFuYWdhcmkJCQk1NzAwMg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfQmVuZ2FsaQkJCQk1NzAwMw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfVGFtaWwJCQkJCTU3MDA0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9UZWx1Z3UJCQkJNTcwMDUNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0Fzc2FtZXNlCQkJCTU3MDA2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9Pcml5YQkJCQkJNTcwMDcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0thbm5hZGEJCQkJNTcwMDgNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX01hbGF5YWxhbQkJCQk1NzAwOQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfR3VqYXJhdGkJCQkJNTcwMTANCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX1B1bmphYmkJCQkJNTcwMTENCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjcJCQkJCQk2NTAwMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGOAkJCQkJCTY1MDAxDQorI2RlZmluZSBGWF9DSEFSU0VUX0FOU0kJCQkJCQkJMA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9EZWZhdWx0CQkJCQkJMQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9TeW1ib2wJCQkJCQkyDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19Sb21hbgkJCQkJNzcNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1NoaWZ0SklTCQkJCQk3OA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfS29yZWFuCQkJCQk3OQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfQ2hpbmVzZVNpbXBsaWZpZWQJCTgwDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJpZGl0aW9uYWwJCTgxDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19Kb2hhYgkJCQkJODINCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0hlYnJldwkJCQkJODMNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0FyYWJpYwkJCQkJODQNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0dyZWVrCQkJCQk4NQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfVHVya2lzaAkJCQkJODYNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1RoYWkJCQkJCQk4Nw0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfRWFzdGVybkV1cm9wZWFuCQkJODgNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0N5cmlsbGljCQkJCQk4OQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9TaGlmdEpJUwkJCQkJCTEyOA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9Lb3JlYW4JCQkJCQkxMjkNCisjZGVmaW5lIEZYX0NIQVJTRVRfSm9oYWIJCQkJCQkxMzANCisjZGVmaW5lIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQJCQkxMzQNCisjZGVmaW5lIEZYX0NIQVJTRVRfQ2hpbmVzZVRyaWRpdGlvbmFsCQkJMTM2DQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0dyZWVrCQkJCQkxNjENCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fVHVya2lzaAkJCQkxNjINCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fVmlldG5hbWVzZQkJCQkxNjMNCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3CQkJCQkxNzcNCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fQXJhYmljCQkJCQkxNzgNCisjZGVmaW5lIEZYX0NIQVJTRVRfQXJhYmljVHJhZGl0aW9uYWwJCQkxNzkNCisjZGVmaW5lIEZYX0NIQVJTRVRfQXJhYmljVXNlcgkJCQkJMTgwDQorI2RlZmluZSBGWF9DSEFSU0VUX0hlYnJld1VzZXIJCQkJCTE4MQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWMJCQkJCTE4Ng0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9DeXJpbGxpYwkJCQkyMDQNCisjZGVmaW5lIEZYX0NIQVJTRVRfVGhhaQkJCQkJCQkyMjINCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVyRXVyb3BlYW4JCQkyMzgNCisjZGVmaW5lIEZYX0NIQVJTRVRfVVMJCQkJCQkJMjU0DQorI2RlZmluZSBGWF9DSEFSU0VUX09FTQkJCQkJCQkyNTUNCitGWF9XT1JECUZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQoRlhfQllURSBjaGFyc2V0KTsNCitGWF9XT1JEIEZYX0dldENoYXJzZXRGcm9tQ29kZVBhZ2UoRlhfV09SRCBjb2RlcGFnZSk7DQorRlhfV09SRAlGWF9HZXRDb2RlUGFnZUZyb21TdHJpbmdBKEZYX0xQQ1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRm9ybVN0cmluZ1coRlhfTFBDV1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCitGWF9XT1JECUZYX0dldERlZkNvZGVQYWdlQnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSk7DQordm9pZAlGWF9Td2FwQnl0ZU9yZGVyKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCit2b2lkCUZYX1N3YXBCeXRlT3JkZXJDb3B5KEZYX0xQQ1dTVFIgcFNyYywgRlhfTFBXU1RSIHBEc3QsIEZYX0lOVDMyIGlMZW5ndGgpOw0KK3ZvaWQJRlhfVVRGMTZUb1dDaGFyKEZYX0xQVk9JRCBwQnVmZmVyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCit2b2lkCUZYX1VURjE2VG9XQ2hhckNvcHkoY29uc3QgRlhfV09SRCAqcFVURjE2LCBGWF9MUFdTVFIgcFdDaGFyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCit2b2lkCUZYX1dDaGFyVG9VVEYxNihGWF9MUFZPSUQgcEJ1ZmZlciwgRlhfSU5UMzIgaUxlbmd0aCk7DQordm9pZAlGWF9XQ2hhclRvVVRGMTZDb3B5KEZYX0xQQ1dTVFIgcFdDaGFyLCBGWF9XT1JEICpwVVRGMTYsIEZYX0lOVDMyIGlMZW5ndGgpOw0KK0ZYX0lOVDMyCUZYX0RlY29kZVN0cmluZyhGWF9XT1JEIHdDb2RlUGFnZSwgRlhfTFBDU1RSIHBTcmMsIEZYX0lOVDMyICpwU3JjTGVuLCBGWF9MUFdTVFIgcERzdCwgRlhfSU5UMzIgKnBEc3RMZW4sIEZYX0JPT0wgYkVyckJyZWFrID0gRkFMU0UpOw0KK0ZYX0lOVDMyCUZYX1VURjhEZWNvZGUoRlhfTFBDU1RSIHBTcmMsIEZYX0lOVDMyICpwU3JjTGVuLCBGWF9MUFdTVFIgcERzdCwgRlhfSU5UMzIgKnBEc3RMZW4pOw0KK2VudW0gRlhfQ09ERVNZU1RFTSB7DQorICAgIEZYX01CQ1MJCT0gIDAsDQorICAgIEZYX1NCQ1MJCQksDQorICAgIEZYX0RCQ1MJCQksDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfQ09ERVBBR0VfSEVBREVSIHsNCisgICAgRlhfVUlOVDE2CQl1Q1BJRDsNCisgICAgRlhfVUlOVDgJCXVNaW5DaGFyQnl0ZXM7DQorICAgIEZYX1VJTlQ4CQl1TWF4Q2hhckJ5dGVzOw0KKyAgICBGWF9DT0RFU1lTVEVNCWVDUFR5cGU7DQorICAgIEZYX0JPT0wJCQliSGFzTGVhZEJ5dGU7DQorICAgIEZYX1dDSEFSCQl3TWluQ2hhcjsNCisgICAgRlhfV0NIQVIJCXdNYXhDaGFyOw0KKyAgICBGWF9XQ0hBUgkJd0RlZkNoYXI7DQorICAgIEZYX1dDSEFSCQl3TWluVW5pY29kZTsNCisgICAgRlhfV0NIQVIJCXdNYXhVbmljb2RlOw0KKyAgICBGWF9XQ0hBUgkJd0RlZlVuaWNvZGU7DQorfSBGWF9DT0RFUEFHRV9IRUFERVI7DQorI2RlZmluZSBGWF9DUE1BUFRZUEVfQ29uc2VjdXRpb24JMQ0KKyNkZWZpbmUgRlhfQ1BNQVBUWVBFX1N0cmljdAkJCTINCisjZGVmaW5lIEZYX0NQTUFQVFlQRV9Ob01hcHBpbmcJCTMNCisjZGVmaW5lIEZYX0NQTUFQVFlQRV9EZWx0YQkJCTQNCit0eXBlZGVmIHN0cnVjdCBfRlhfQ1BDVV9NQVBUQUJMRTEgew0KKyAgICBGWF9VSU5UMTYgIHVNYXBUeXBlOw0KKyAgICBGWF9VSU5UMTYgIHVVbmlvY2RlOw0KK30gRlhfQ1BDVV9NQVBUQUJMRTE7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NQQ1VfTUFQVEFCTEUyIHsNCisgICAgRlhfVUlOVDgJdVRyYWlsQnl0ZTsNCisgICAgRlhfVUlOVDgJdU1hcFR5cGU7DQorICAgIEZYX1VJTlQxNgl1T2Zmc2V0Ow0KK30gRlhfQ1BDVV9NQVBUQUJMRTI7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NQQ1VfTUFQSU5GTyB7DQorICAgIEZYX0NQQ1VfTUFQVEFCTEUxCQkqcE1hcFRhYmxlMTsNCisgICAgRlhfQ1BDVV9NQVBUQUJMRTIJCSpwTWFwVGFibGUyOw0KKyAgICBGWF9MUENCWVRFCQkJCXBNYXBEYXRhOw0KK30gRlhfQ1BDVV9NQVBJTkZPOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9DUFVDX01BUFRBQkxFIHsNCisgICAgRlhfVUlOVDE2CXVTdGFydFVuaWNvZGU7DQorICAgIEZYX1VJTlQxNgl1RW5kVW5pY29kZTsNCisgICAgRlhfVUlOVDE2CXVNYXBUeXBlOw0KKyAgICBGWF9VSU5UMTYJdU9mZnNldDsNCit9IEZYX0NQVUNfTUFQVEFCTEU7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NQVUNfTUFQSU5GTyB7DQorICAgIEZYX1VJTlQzMgkJCXVNYXBDb3VudDsNCisgICAgRlhfQ1BVQ19NQVBUQUJMRQkqcE1hcFRhYmxlOw0KKyAgICBGWF9MUENCWVRFCQkJcE1hcERhdGE7DQorfSBGWF9DUFVDX01BUElORk87DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NPREVQQUdFIHsNCisgICAgRlhfQ09ERVBBR0VfSEVBREVSIGNvbnN0CSpwQ1BIZWFkZXI7DQorICAgIEZYX0NQQ1VfTUFQSU5GTyBjb25zdAkJKnBDUENVTWFwSW5mbzsNCisgICAgRlhfQ1BVQ19NQVBJTkZPIGNvbnN0CQkqcENQVUNNYXBJbmZvOw0KK30gRlhfQ09ERVBBR0UsICogRlhfTFBDT0RFUEFHRTsNCit0eXBlZGVmIEZYX0NPREVQQUdFIGNvbnN0ICogRlhfTFBDQ09ERVBBR0U7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1NUUjJDUEhBU0ggew0KKyAgICBGWF9VSU5UMzIgIHVIYXNoOw0KKyAgICBGWF9VSU5UMzIgIHVDb2RlUGFnZTsNCit9IEZYX1NUUjJDUEhBU0g7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NIQVJTRVRfTUFQIHsNCisgICAgRlhfVUlOVDE2IGNoYXJzZXQ7DQorICAgIEZYX1VJTlQxNiBjb2RlcGFnZTsNCit9IEZYX0NIQVJTRVRfTUFQOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9MQU5HMkNQTUFQIHsNCisgICAgRlhfV09SRAl3TGFuZ3VhZ2U7DQorICAgIEZYX1dPUkQJd0NvZGVwYWdlOw0KK30gRlhfTEFORzJDUE1BUDsNCitjbGFzcyBJRlhfQ29kZVBhZ2UNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZYX0NvZGVQYWdlKglDcmVhdGUoRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQlHZXRDb2RlUGFnZU51bWJlcigpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9DT0RFU1lTVEVNCUdldENvZGVTeXN0ZW1UeXBlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlIYXNMZWFkQnl0ZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNMZWFkQnl0ZShGWF9CWVRFIGJ5dGUpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0TWluQnl0ZXNQZXJDaGFyKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRNYXhCeXRlc1BlckNoYXIoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfV0NIQVIJCUdldE1pbkNoYXJjb2RlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX1dDSEFSCQlHZXRNYXhDaGFyY29kZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9XQ0hBUgkJR2V0RGVmQ2hhcmNvZGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfV0NIQVIJCUdldE1pblVuaWNvZGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfV0NIQVIJCUdldE1heFVuaWNvZGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfV0NIQVIJCUdldERlZlVuaWNvZGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVmFsaWRDaGFyY29kZShGWF9XT1JEIHdDaGFyY29kZSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX1dDSEFSCQlHZXRVbmljb2RlKEZYX1dPUkQgd0NoYXJjb2RlKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVmFsaWRVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCUdldENoYXJjb2RlKEZYX1dDSEFSIHdVbmljb2RlKSBjb25zdCA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9kYXRldGltZS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZGF0ZXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBhNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZGF0ZXRpbWUuaApAQCAtMCwwICsxLDQ3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9EQVRFVElNRV9IXw0KKyNkZWZpbmUgX0ZYX0RBVEVUSU1FX0hfDQorY2xhc3MgQ0ZYX1VuaXRpbWU7DQorY2xhc3MgQ0ZYX0RhdGVUaW1lOw0KK3R5cGVkZWYgRlhfSU5UNjQJRlhfVU5JVElNRTsNCitlbnVtIEZYX1dFRUtEQVkgew0KKyAgICBGWF9TdW5kYXkJCQk9ICAwLA0KKyAgICBGWF9Nb25kYXkJCQkJLA0KKyAgICBGWF9UdWVzZGF5CQkJCSwNCisgICAgRlhfV2VkbmVzZGF5CQkJLA0KKyAgICBGWF9UaHVyc2RheQkJCQksDQorICAgIEZYX0ZyaWRheQkJCQksDQorICAgIEZYX1NhdHVyZGF5CQkJCSwNCit9Ow0KK0ZYX0JPT0wJCUZYX0lzTGVhcFllYXIoRlhfSU5UMzIgaVllYXIpOw0KK0ZYX0lOVDMyCUZYX0RheXNJblllYXIoRlhfSU5UMzIgaVllYXIpOw0KK0ZYX0JZVEUJCUZYX0RheXNJbk1vbnRoKEZYX0lOVDMyIGlZZWFyLCBGWF9CWVRFIGlNb250aCk7DQorY2xhc3MgQ0ZYX1VuaXRpbWUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9Vbml0aW1lKCkNCisgICAgew0KKyAgICAgICAgbV9pVW5pdGltZSA9IDA7DQorICAgIH0NCisgICAgQ0ZYX1VuaXRpbWUoRlhfVU5JVElNRSBpVW5pdGltZSkNCisgICAgew0KKyAgICAgICAgbV9pVW5pdGltZSA9IGlVbml0aW1lOw0KKyAgICB9DQorICAgIENGWF9Vbml0aW1lKGNvbnN0IENGWF9Vbml0aW1lICZ1bml0aW1lKQ0KKyAgICB7DQorICAgICAgICBtX2lVbml0aW1lID0gdW5pdGltZS5tX2lVbml0aW1lOw0KKyAgICB9DQorICAgIG9wZXJhdG9yIEZYX1VOSVRJTUUgKiAoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gJm1faVVuaXRpbWU7DQorICAgIH0NCisgICAgb3BlcmF0b3IgRlhfVU5JVElNRSBjb25zdCAqICgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAmbV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBvcGVyYXRvciBGWF9VTklUSU1FJiAoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBvcGVyYXRvciBjb25zdCBGWF9VTklUSU1FJiAoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBDRlhfVW5pdGltZSYJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQpDQorICAgIHsNCisgICAgICAgIG1faVVuaXRpbWUgPSB0Lm1faVVuaXRpbWU7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgQ0ZYX1VuaXRpbWUmCW9wZXJhdG9yID0gKEZYX1VOSVRJTUUgdCkNCisgICAgew0KKyAgICAgICAgbV9pVW5pdGltZSA9IHQ7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgQ0ZYX1VuaXRpbWUmCW9wZXJhdG9yICs9IChjb25zdCBDRlhfVW5pdGltZSAmdCkNCisgICAgew0KKyAgICAgICAgbV9pVW5pdGltZSArPSB0Lm1faVVuaXRpbWU7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgQ0ZYX1VuaXRpbWUmCW9wZXJhdG9yICs9IChGWF9VTklUSU1FIHQpDQorICAgIHsNCisgICAgICAgIG1faVVuaXRpbWUgKz0gdDsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBDRlhfVW5pdGltZSYJb3BlcmF0b3IgLT0gKGNvbnN0IENGWF9Vbml0aW1lICZ0KQ0KKyAgICB7DQorICAgICAgICBtX2lVbml0aW1lIC09IHQubV9pVW5pdGltZTsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBDRlhfVW5pdGltZSYJb3BlcmF0b3IgLT0gKEZYX1VOSVRJTUUgdCkNCisgICAgew0KKyAgICAgICAgbV9pVW5pdGltZSAtPSB0Ow0KKyAgICAgICAgcmV0dXJuICp0aGlzOw0KKyAgICB9DQorICAgIHZvaWQJCQlOb3coKTsNCisgICAgdm9pZAkJCVNldEdNVGltZSgpOw0KKyAgICB2b2lkCQkJU2V0KEZYX0lOVDMyIHllYXIsIEZYX0JZVEUgbW9udGgsIEZYX0JZVEUgZGF5LCBGWF9CWVRFIGhvdXIgPSAwLCBGWF9CWVRFIG1pbnV0ZSA9IDAsIEZYX0JZVEUgc2Vjb25kID0gMCwgRlhfV09SRCBtaWxsaXNlY29uZCA9IDApOw0KKyAgICB2b2lkCQkJU2V0KEZYX1VOSVRJTUUgdCk7DQorICAgIEZYX0lOVDMyCQlHZXRZZWFyKCkgY29uc3Q7DQorICAgIEZYX0JZVEUJCQlHZXRNb250aCgpIGNvbnN0Ow0KKyAgICBGWF9CWVRFCQkJR2V0RGF5KCkgY29uc3Q7DQorICAgIEZYX1dFRUtEQVkJCUdldERheU9mV2VlaygpIGNvbnN0Ow0KKyAgICBGWF9XT1JECQkJR2V0RGF5T2ZZZWFyKCkgY29uc3Q7DQorICAgIEZYX0lOVDY0CQlHZXREYXlPZkFEKCkgY29uc3Q7DQorICAgIEZYX0JZVEUJCQlHZXRIb3VyKCkgY29uc3Q7DQorICAgIEZYX0JZVEUJCQlHZXRNaW51dGUoKSBjb25zdDsNCisgICAgRlhfQllURQkJCUdldFNlY29uZCgpIGNvbnN0Ow0KKyAgICBGWF9XT1JECQkJR2V0TWlsbGlzZWNvbmQoKSBjb25zdDsNCisgICAgRlhfQk9PTAkJCUFkZFllYXJzKEZYX0lOVDMyIGlZZWFycyk7DQorICAgIEZYX0JPT0wJCQlBZGRNb250aHMoRlhfSU5UMzIgaU1vbnRocyk7DQorICAgIEZYX0JPT0wJCQlBZGREYXlzKEZYX0lOVDMyIGlEYXlzKTsNCisgICAgRlhfQk9PTAkJCUFkZEhvdXJzKEZYX0lOVDMyIGlIb3Vycyk7DQorICAgIEZYX0JPT0wJCQlBZGRNaW51dGVzKEZYX0lOVDMyIGlNaW51dGVzKTsNCisgICAgRlhfQk9PTAkJCUFkZFNlY29uZHMoRlhfSU5UMzIgaVNlY29uZHMpOw0KKyAgICBGWF9CT09MCQkJQWRkTWlsbGlzZWNvbmRzKEZYX0lOVDMyIGlNaWxsaXNlY29uZHMpOw0KKyAgICBmcmllbmQgQ0ZYX1VuaXRpbWUJb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIubV9pVW5pdGltZSk7DQorICAgIH0NCisgICAgZnJpZW5kIENGWF9Vbml0aW1lCW9wZXJhdG9yICsgKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgRlhfVU5JVElNRSB0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mik7DQorICAgIH0NCisgICAgZnJpZW5kIENGWF9Vbml0aW1lCW9wZXJhdG9yICsgKEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxICsgdDIubV9pVW5pdGltZSk7DQorICAgIH0NCisgICAgZnJpZW5kIENGWF9Vbml0aW1lCW9wZXJhdG9yIC0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEubV9pVW5pdGltZSArIHQyLm1faVVuaXRpbWUpOw0KKyAgICB9DQorICAgIGZyaWVuZCBDRlhfVW5pdGltZQlvcGVyYXRvciAtIChjb25zdCBDRlhfVW5pdGltZSAmdDEsIEZYX1VOSVRJTUUgdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIpOw0KKyAgICB9DQorICAgIGZyaWVuZCBDRlhfVW5pdGltZQlvcGVyYXRvciAtIChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfVW5pdGltZSh0MSArIHQyLm1faVVuaXRpbWUpOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA9PSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lID09IHQyLm1faVVuaXRpbWU7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIEZYX1VOSVRJTUUgdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lID09IHQyOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA9PSAoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEgPT0gdDIubV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgIT0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSAhPSB0Mi5tX2lVbml0aW1lOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciAhPSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBGWF9VTklUSU1FIHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSAhPSB0MjsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgIT0gKEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHQxICE9IHQyLm1faVVuaXRpbWU7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID4gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+IHQyLm1faVVuaXRpbWU7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID4gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgRlhfVU5JVElNRSB0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPiB0MjsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPiAoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEgPiB0Mi5tX2lVbml0aW1lOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA+PSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lID49IHQyLm1faVVuaXRpbWU7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID49IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIEZYX1VOSVRJTUUgdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lID49IHQyOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA+PSAoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEgPj0gdDIubV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPCAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDwgdDIubV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPCAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBGWF9VTklUSU1FIHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSA8IHQyOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA8IChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MSA8IHQyLm1faVVuaXRpbWU7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yIDw9IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPD0gdDIubV9pVW5pdGltZTsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPD0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgRlhfVU5JVElNRSB0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPD0gdDI7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yIDw9IChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiB0MSA8PSB0Mi5tX2lVbml0aW1lOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgRlhfVU5JVElNRSBtX2lVbml0aW1lOw0KK307DQorI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpDQorI2VuZGlmDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0RBVEUgew0KKyAgICBGWF9JTlQzMgl5ZWFyOw0KKyAgICBGWF9CWVRFCQltb250aDsNCisgICAgRlhfQllURQkJZGF5Ow0KK30gRlhfREFURSwgKiBGWF9MUERBVEU7DQordHlwZWRlZiBGWF9EQVRFIGNvbnN0ICogRlhfTFBDREFURTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfVElNRSB7DQorICAgIEZYX0JZVEUJCWhvdXI7DQorICAgIEZYX0JZVEUJCW1pbnV0ZTsNCisgICAgRlhfQllURQkJc2Vjb25kOw0KKyAgICBGWF9XT1JECQltaWxsaXNlY29uZDsNCit9IEZYX1RJTUUsICogRlhfTFBUSU1FOw0KK3R5cGVkZWYgRlhfVElNRSBjb25zdCAqIEZYX0xQQ1RJTUU7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1RJTUVaT05FIHsNCisgICAgRlhfSU5UOAkJdHpIb3VyOw0KKyAgICBGWF9CWVRFCQl0ek1pbnV0ZTsNCit9IEZYX1RJTUVaT05FLCAqIEZYX0xQVElNRVpPTkU7DQordHlwZWRlZiBGWF9USU1FWk9ORSBjb25zdCAqIEZYX0xQQ1RJTUVaT05FOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9EQVRFVElNRSB7DQorICAgIHVuaW9uIHsNCisgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgICAgRlhfSU5UMzIJeWVhcjsNCisgICAgICAgICAgICBGWF9CWVRFCQltb250aDsNCisgICAgICAgICAgICBGWF9CWVRFCQlkYXk7DQorICAgICAgICB9IHNEYXRlOw0KKyAgICAgICAgRlhfREFURSBhRGF0ZTsNCisgICAgfSBEYXRlOw0KKyAgICB1bmlvbiB7DQorICAgICAgICBzdHJ1Y3Qgew0KKyAgICAgICAgICAgIEZYX0JZVEUJCWhvdXI7DQorICAgICAgICAgICAgRlhfQllURQkJbWludXRlOw0KKyAgICAgICAgICAgIEZYX0JZVEUJCXNlY29uZDsNCisgICAgICAgICAgICBGWF9XT1JECQltaWxsaXNlY29uZDsNCisgICAgICAgIH0gc1RpbWU7DQorICAgICAgICBGWF9USU1FIGFUaW1lOw0KKyAgICB9IFRpbWU7DQorfSBGWF9EQVRFVElNRSwgKiBGWF9MUERBVEVUSU1FOw0KK3R5cGVkZWYgRlhfREFURVRJTUUgY29uc3QgKiBGWF9MUENEQVRFVElNRTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfREFURVRJTUVaT05FIHsNCisgICAgdW5pb24gew0KKyAgICAgICAgc3RydWN0IHsNCisgICAgICAgICAgICB1bmlvbiB7DQorICAgICAgICAgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMgl5ZWFyOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfQllURQkJbW9udGg7DQorICAgICAgICAgICAgICAgICAgICBGWF9CWVRFCQlkYXk7DQorICAgICAgICAgICAgICAgIH07DQorICAgICAgICAgICAgICAgIEZYX0RBVEUJZGF0ZTsNCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgIHVuaW9uIHsNCisgICAgICAgICAgICAgICAgc3RydWN0IHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUJCWhvdXI7DQorICAgICAgICAgICAgICAgICAgICBGWF9CWVRFCQltaW51dGU7DQorICAgICAgICAgICAgICAgICAgICBGWF9CWVRFCQlzZWNvbmQ7DQorICAgICAgICAgICAgICAgICAgICBGWF9XT1JECQltaWxsaXNlY29uZDsNCisgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICAgICAgRlhfVElNRSB0aW1lOw0KKyAgICAgICAgICAgIH07DQorICAgICAgICB9Ow0KKyAgICAgICAgRlhfREFURVRJTUUgZHQ7DQorICAgIH07DQorICAgIHVuaW9uIHsNCisgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgICAgRlhfSU5UOAl0ekhvdXI7DQorICAgICAgICAgICAgRlhfQllURQl0ek1pbnV0ZTsNCisgICAgICAgIH07DQorICAgICAgICBGWF9USU1FWk9ORSB0ejsNCisgICAgfTsNCit9IEZYX0RBVEVUSU1FWk9ORSwgKiBGWF9MUERBVEVUSU1FWk9ORTsNCit0eXBlZGVmIEZYX0RBVEVUSU1FWk9ORSBjb25zdCAqIEZYX0xQQ0RBVEVUSU1FWk9ORTsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socG9wKQ0KKyNlbmRpZg0KK2NsYXNzIENGWF9EYXRlVGltZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0RhdGVUaW1lKCkge30NCisgICAgQ0ZYX0RhdGVUaW1lKGNvbnN0IEZYX0RBVEVUSU1FICZkdCkNCisgICAgew0KKyAgICAgICAgbV9EYXRlVGltZSA9IGR0Ow0KKyAgICB9DQorICAgIENGWF9EYXRlVGltZShjb25zdCBDRlhfRGF0ZVRpbWUgJmR0KQ0KKyAgICB7DQorICAgICAgICBtX0RhdGVUaW1lID0gZHQubV9EYXRlVGltZTsNCisgICAgfQ0KKyAgICBvcGVyYXRvciBGWF9EQVRFVElNRSAqICgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAmbV9EYXRlVGltZTsNCisgICAgfQ0KKyAgICBvcGVyYXRvciBGWF9EQVRFVElNRSBjb25zdCAqICgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAmbV9EYXRlVGltZTsNCisgICAgfQ0KKyAgICBvcGVyYXRvciBGWF9EQVRFVElNRSYgKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fRGF0ZVRpbWU7DQorICAgIH0NCisgICAgb3BlcmF0b3IgY29uc3QgRlhfREFURVRJTUUmICgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0RhdGVUaW1lOw0KKyAgICB9DQorICAgIENGWF9EYXRlVGltZSYJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdCkNCisgICAgew0KKyAgICAgICAgbV9EYXRlVGltZSA9IGR0Lm1fRGF0ZVRpbWU7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgQ0ZYX0RhdGVUaW1lJglvcGVyYXRvciA9IChjb25zdCBGWF9EQVRFVElNRSAmZHQpDQorICAgIHsNCisgICAgICAgIG1fRGF0ZVRpbWUgPSBkdDsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBDRlhfRGF0ZVRpbWUmCW9wZXJhdG9yICs9IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0KQ0KKyAgICB7DQorICAgICAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSArIGR0LlRvVW5pdGltZSgpKTsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBDRlhfRGF0ZVRpbWUmCW9wZXJhdG9yICs9IChjb25zdCBGWF9EQVRFVElNRSAmZHQpDQorICAgIHsNCisgICAgICAgIEZyb21Vbml0aW1lKFRvVW5pdGltZSgpICsgKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0KS5Ub1VuaXRpbWUoKSk7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgQ0ZYX0RhdGVUaW1lJglvcGVyYXRvciAtPSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdCkNCisgICAgew0KKyAgICAgICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgLSBkdC5Ub1VuaXRpbWUoKSk7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCisgICAgQ0ZYX0RhdGVUaW1lJglvcGVyYXRvciAtPSAoY29uc3QgRlhfREFURVRJTUUgJmR0KQ0KKyAgICB7DQorICAgICAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSAtICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdCkuVG9Vbml0aW1lKCkpOw0KKyAgICAgICAgcmV0dXJuICp0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldChGWF9JTlQzMiB5ZWFyLCBGWF9CWVRFIG1vbnRoLCBGWF9CWVRFIGRheSwgRlhfQllURSBob3VyID0gMCwgRlhfQllURSBtaW51dGUgPSAwLCBGWF9CWVRFIHNlY29uZCA9IDAsIEZYX1dPUkQgbWlsbGlzZWNvbmQgPSAwKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJRnJvbVVuaXRpbWUoRlhfVU5JVElNRSB0KTsNCisgICAgdmlydHVhbCBGWF9VTklUSU1FCQlUb1VuaXRpbWUoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0WWVhcigpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JZVEUJCQlHZXRNb250aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JZVEUJCQlHZXREYXkoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9XRUVLREFZCQlHZXREYXlPZldlZWsoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9XT1JECQkJR2V0RGF5T2ZZZWFyKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UNjQJCUdldERheU9mQUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CWVRFCQkJR2V0SG91cigpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JZVEUJCQlHZXRNaW51dGUoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CWVRFCQkJR2V0U2Vjb25kKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCUdldE1pbGxpc2Vjb25kKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUFkZFllYXJzKEZYX0lOVDMyIGlZZWFycyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUFkZE1vbnRocyhGWF9JTlQzMiBpTW9udGhzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJQWRkRGF5cyhGWF9JTlQzMiBpRGF5cyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUFkZEhvdXJzKEZYX0lOVDMyIGlIb3Vycyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUFkZE1pbnV0ZXMoRlhfSU5UMzIgaU1pbnV0ZXMpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlBZGRTZWNvbmRzKEZYX0lOVDMyIGlTZWNvbmRzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJQWRkTWlsbGlzZWNvbmRzKEZYX0lOVDMyIGlNaWxsaXNlY29uZHMpOw0KKyAgICBmcmllbmQgQ0ZYX0RhdGVUaW1lCW9wZXJhdG9yICsgKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICAgICAgZHQuRnJvbVVuaXRpbWUoZHQxLlRvVW5pdGltZSgpICsgZHQyLlRvVW5pdGltZSgpKTsNCisgICAgICAgIHJldHVybiBkdDsNCisgICAgfQ0KKyAgICBmcmllbmQgQ0ZYX0RhdGVUaW1lCW9wZXJhdG9yICsgKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KKyAgICB7DQorICAgICAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgICAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgKyAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKSk7DQorICAgICAgICByZXR1cm4gZHQ7DQorICAgIH0NCisgICAgZnJpZW5kIENGWF9EYXRlVGltZQlvcGVyYXRvciArIChjb25zdCBGWF9EQVRFVElNRSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICAgICAgZHQuRnJvbVVuaXRpbWUoKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgKyBkdDIuVG9Vbml0aW1lKCkpOw0KKyAgICAgICAgcmV0dXJuIGR0Ow0KKyAgICB9DQorICAgIGZyaWVuZCBDRlhfRGF0ZVRpbWUJb3BlcmF0b3IgLSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KKyAgICB7DQorICAgICAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgICAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgLSBkdDIuVG9Vbml0aW1lKCkpOw0KKyAgICAgICAgcmV0dXJuIGR0Ow0KKyAgICB9DQorICAgIGZyaWVuZCBDRlhfRGF0ZVRpbWUJb3BlcmF0b3IgLSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IEZYX0RBVEVUSU1FICZkdDIpDQorICAgIHsNCisgICAgICAgIENGWF9EYXRlVGltZSBkdDsNCisgICAgICAgIGR0LkZyb21Vbml0aW1lKGR0MS5Ub1VuaXRpbWUoKSAtICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpKTsNCisgICAgICAgIHJldHVybiBkdDsNCisgICAgfQ0KKyAgICBmcmllbmQgQ0ZYX0RhdGVUaW1lCW9wZXJhdG9yIC0gKGNvbnN0IEZYX0RBVEVUSU1FICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KKyAgICB7DQorICAgICAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgICAgICBkdC5Gcm9tVW5pdGltZSgoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSAtIGR0Mi5Ub1VuaXRpbWUoKSk7DQorICAgICAgICByZXR1cm4gZHQ7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA9PSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wKChGWF9MUENEQVRFVElNRSlkdDEsIChGWF9MUENEQVRFVElNRSlkdDIsIHNpemVvZihGWF9EQVRFVElNRSkpID09IDA7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA9PSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IEZYX0RBVEVUSU1FICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoKEZYX0xQQ0RBVEVUSU1FKWR0MSwgJmR0Miwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgPT0gMDsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yID09IChjb25zdCBGWF9EQVRFVElNRSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgmZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgIT0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgIT0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wKChGWF9MUENEQVRFVElNRSlkdDEsICZkdDIsIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDA7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciAhPSAoY29uc3QgRlhfREFURVRJTUUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoJmR0MSwgKEZYX0xQQ0RBVEVUSU1FKWR0Miwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMDsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yID4gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA+IGR0Mi5Ub1VuaXRpbWUoKTsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yID4gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCk7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA+IChjb25zdCBGWF9EQVRFVElNRSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpID4gZHQyLlRvVW5pdGltZSgpOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPj0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA+PSBkdDIuVG9Vbml0aW1lKCk7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA+PSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IEZYX0RBVEVUSU1FICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPj0gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCk7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA+PSAoY29uc3QgRlhfREFURVRJTUUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSA+PSBkdDIuVG9Vbml0aW1lKCk7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA8IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPCBkdDIuVG9Vbml0aW1lKCk7DQorICAgIH0NCisgICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA8IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgRlhfREFURVRJTUUgJmR0MikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8ICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPCAoY29uc3QgRlhfREFURVRJTUUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSA8IGR0Mi5Ub1VuaXRpbWUoKTsNCisgICAgfQ0KKyAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yIDw9IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPD0gZHQyLlRvVW5pdGltZSgpOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPD0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDw9ICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpOw0KKyAgICB9DQorICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPD0gKGNvbnN0IEZYX0RBVEVUSU1FICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPD0gZHQyLlRvVW5pdGltZSgpOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgRlhfREFURVRJTUUgbV9EYXRlVGltZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2ZudC5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZm50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2NDg1MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2ZudC5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0ZPTlQNCisjZGVmaW5lIF9GWF9GT05UDQorY2xhc3MgSUZYX0ZvbnQ7DQorY2xhc3MgSUZYX0ZvbnRNZ3I7DQorI2RlZmluZSBGWF9GT05UU1RZTEVfTm9ybWFsCQkJCQkweDAwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaAkJCQkweDAxDQorI2RlZmluZSBGWF9GT05UU1RZTEVfU2VyaWYJCQkJCTB4MDINCisjZGVmaW5lIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYwkJCQkweDA0DQorI2RlZmluZSBGWF9GT05UU1RZTEVfU2NyaXB0CQkJCQkweDA4DQorI2RlZmluZSBGWF9GT05UU1RZTEVfSXRhbGljCQkJCQkweDQwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZAkJCQkJMHg0MDAwMA0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX0JvbGRJdGFsaWMJCQkJKEZYX0ZPTlRTVFlMRV9Cb2xkfEZYX0ZPTlRTVFlMRV9JdGFsaWMpDQorI2RlZmluZSBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaAkJCQkweDgwMDAwMDAwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9VbmRlcmxpbmUJCQkweDAwMDAwMDAxDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdHJpa2VvdXQJCQkweDAwMDAwMDAyDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9PdmVybGluZQkJCTB4MDAwMDAwMDQNCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0VtcGhhc2lzCQkJMHgwMDAwMDAwOA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU3VwZXJzY3JpcHQJCTB4MDAwMDAwMTANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1N1YnNjcmlwdAkJCTB4MDAwMDAwMjANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1NtYWxsQ2FwaXRhbAkJMHgwMDAwMDA0MA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fQ2FwaXRhbAkJCTB4MDAwMDAwODANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0xvd2VyY2FzZQkJCTB4MDAwMDAwQzANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1JhaXNlZAkJCTB4MDAwMDAxMDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1N1bmtlbgkJCTB4MDAwMDAyMDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1NoYWRvdwkJCTB4MDAwMDA0MDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0JvdW5kaW5nU2hhcGUJCTB4MjAwMDAwMDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0hpZGUJCQkJMHg0MDAwMDAwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU3Ryb2tlRmlsbAkJMHg4MDAwMDAwMA0KKyNkZWZpbmUgRlhfQk9VTkRJTkdTSEFQRV9Ob25lCQkJMA0KKyNkZWZpbmUgRlhfQk9VTkRJTkdTSEFQRV9DaXJjbGUJCQkxDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX1NxdWFyZQkJCTINCisjZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfVHJpYW5nbGUJCTMNCisjZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfRGlhbW9uZAkJNA0KK2NsYXNzIElGWF9Gb250UHJvdmlkZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENoYXJXaWR0aChJRlhfRm9udCogcEZvbnQsIEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKSA9IDA7DQorfTsNCitjbGFzcyBJRlhfRm9udA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRlhfRm9udCoJCUxvYWRGb250KEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKTsNCisgICAgc3RhdGljIElGWF9Gb250KgkJTG9hZEZvbnQoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpTGVuZ3RoLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpOw0KKyAgICBzdGF0aWMgSUZYX0ZvbnQqCQlMb2FkRm9udChGWF9MUENXU1RSIHBzekZpbGVOYW1lLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpOw0KKyAgICBzdGF0aWMgSUZYX0ZvbnQqCQlMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyLCBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpOw0KKyAgICBzdGF0aWMgSUZYX0ZvbnQqCQlMb2FkRm9udChDRlhfRm9udCAqcEV4dEZvbnQsIElGWF9Gb250TWdyICpwRm9udE1nciwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlSZXRhaW4oKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlEZXJpdmUoRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDApID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyAmd3NGYW1pbHkpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0UHNOYW1lKENGWF9XaWRlU3RyaW5nICZ3c05hbWUpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Rm9udFN0eWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CWVRFCQkJR2V0Q2hhclNldCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0QXNjZW50KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXREZXNjZW50KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwgQ0ZYX1JlY3QgJmJib3gsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChDRlhfUmVjdCAmYmJveCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVzZXQoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRTdWJzdEZvbnQoRlhfSU5UMzIgaUdseXBoSW5kZXgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkKgkJCUdldERldkZvbnQoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRQcm92aWRlcihJRlhfRm9udFByb3ZpZGVyKiBwUHJvdmlkZXIpID0gMDsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMb2dpY2FsRm9udFN0eWxlKEZYX0RXT1JEIGR3TG9nRm9udFN0eWxlKSA9IDA7DQorI2VuZGlmDQorfTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KK3R5cGVkZWYgc3RydWN0IF9GWF9GT05UTUFUQ0hQQVJBTVMgOiBwdWJsaWMgQ0ZYX09iamVjdCB7DQorICAgIEZYX0xQQ1dTVFIJCQkJcHdzRmFtaWx5Ow0KKyAgICBGWF9EV09SRAkJCQlkd0ZvbnRTdHlsZXM7DQorICAgIEZYX0RXT1JECQkJCWR3VVNCOw0KKyAgICBGWF9EV09SRAkJCQlkd01hdGNoRmxhZ3M7DQorICAgIEZYX1dDSEFSCQkJCXdVbmljb2RlOw0KKyAgICBGWF9XT1JECQkJCQl3Q29kZVBhZ2U7DQorfSBGWF9GT05UTUFUQ0hQQVJBTVMsICogRlhfTFBGT05UTUFUQ0hQQVJBTVM7DQordHlwZWRlZiBGWF9GT05UTUFUQ0hQQVJBTVMgY29uc3QgKiBGWF9MUENGT05UTUFUQ0hQQVJBTVM7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZPTlRTSUdOQVRVUkUgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorICAgIEZYX0RXT1JECQkJCWZzVXNiWzRdOw0KKyAgICBGWF9EV09SRAkJCQlmc0NzYlsyXTsNCit9IEZYX0ZPTlRTSUdOQVRVUkU7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZPTlRERVNDUklQVE9SIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgICBGWF9XQ0hBUgkJCQl3c0ZvbnRGYWNlWzMyXTsNCisgICAgRlhfRFdPUkQJCQkJZHdGb250U3R5bGVzOw0KKyAgICBGWF9CWVRFCQkJCQl1Q2hhclNldDsNCisgICAgRlhfRk9OVFNJR05BVFVSRQkJRm9udFNpZ25hdHVyZTsNCit9IEZYX0ZPTlRERVNDUklQVE9SLCAqIEZYX0xQRk9OVERFU0NSSVBUT1I7DQordHlwZWRlZiBGWF9GT05UREVTQ1JJUFRPUiBjb25zdCAqIEZYX0xQQ0ZPTlRERVNDUklQVE9SOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX0ZPTlRERVNDUklQVE9SPiBDRlhfRm9udERlc2NyaXB0b3JzOw0KK2lubGluZSBGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBGWF9GT05UREVTQ1JJUFRPUiAmbGVmdCwgY29uc3QgRlhfRk9OVERFU0NSSVBUT1IgJnJpZ2h0KQ0KK3sNCisgICAgcmV0dXJuIGxlZnQudUNoYXJTZXQgPT0gcmlnaHQudUNoYXJTZXQNCisgICAgICAgICAgICYmIGxlZnQuZHdGb250U3R5bGVzID09IHJpZ2h0LmR3Rm9udFN0eWxlcw0KKyAgICAgICAgICAgJiYgRlhTWVNfd2NzY21wKGxlZnQud3NGb250RmFjZSwgcmlnaHQud3NGb250RmFjZSkgPT0gMA0KKyAgICAgICAgICAgJiYgRlhTWVNfbWVtY21wKCZsZWZ0LkZvbnRTaWduYXR1cmUsICZyaWdodC5Gb250U2lnbmF0dXJlLCBzaXplb2YoRlhfRk9OVFNJR05BVFVSRSkpID09IDA7DQorfQ0KKyNkZWZpbmUgRlhfRk9OVE1BVENIUEFSQV9NYWN0aFN0eWxlCQkweDAxDQorI2RlZmluZSBGWF9GT05UTUFUQ0hQQVJBX01hY3RoRmFtaWx5CTB4MDINCisjZGVmaW5lIEZYX0ZPTlRNQVRDSFBBUkFfTWFjdGhVbmljb2RlCTB4MDQNCit0eXBlZGVmIHZvaWQgKCpGWF9MUEVudW1BbGxGb250cykoQ0ZYX0ZvbnREZXNjcmlwdG9ycyAmZm9udHMsIEZYX0xQVk9JRCBwVXNlckRhdGEsIEZYX0xQQ1dTVFIgcHdzRmFjZU5hbWUsIEZYX1dDSEFSIHdVbmljb2RlKTsNCitGWF9MUEVudW1BbGxGb250cyBGWF9HZXREZWZGb250RW51bWVyYXRvcigpOw0KK3R5cGVkZWYgRlhfTFBDRk9OVERFU0NSSVBUT1IgKCpGWF9MUE1hdGNoRm9udCkoRlhfTFBGT05UTUFUQ0hQQVJBTVMgcFBhcmFtcywgY29uc3QgQ0ZYX0ZvbnREZXNjcmlwdG9ycyAmZm9udHMsIEZYX0xQVk9JRCBwVXNlckRhdGEpOw0KK0ZYX0xQTWF0Y2hGb250IEZYX0dldERlZkZvbnRNYXRjaG9yKCk7DQorY2xhc3MgSUZYX0ZvbnRNZ3INCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZYX0ZvbnRNZ3IqCUNyZWF0ZShGWF9MUEVudW1BbGxGb250cyBwRW51bWVyYXRvciwgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIgPSBOVUxMLCBGWF9MUFZPSUQgcFVzZXJEYXRhID0gTlVMTCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDaGFyc2V0KEZYX0JZVEUgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChGWF9MUENXU1RSIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUxlbmd0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGaWxlTmFtZSkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0sIEZYX0xQQ1dTVFIgcHN6Rm9udEFsaWFzID0gTlVMTCwgRlhfRFdPUkQgZHdGb250U3R5bGVzID0gMCwgRlhfV09SRCB3Q29kZVBhZ2UgPSAwLCBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KElGWF9Gb250ICpwU3JjRm9udCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhckZvbnRDYWNoZSgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlRm9udChJRlhfRm9udCAqcEZvbnQpID0gMDsNCit9Ow0KKyNlbHNlDQorY2xhc3MgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDb2RlUGFnZShJRlhfRm9udE1nciogcEZvbnRNZ3IsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNoYXJzZXQoSUZYX0ZvbnRNZ3IqIHBGb250TWdyLCBGWF9CWVRFIG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeVVuaWNvZGUoSUZYX0ZvbnRNZ3IqIHBGb250TWdyLCBGWF9XQ0hBUiB3VW5pY29kZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlMYW5ndWFnZShJRlhfRm9udE1nciogcEZvbnRNZ3IsIEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCit9Ow0KK2NsYXNzIElGWF9Gb250U291cmNlRW51bQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwJdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCUdldFN0YXJ0UG9zaXRpb24oRlhfTFBWT0lEIHBVc2VyRGF0YSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRmlsZUFjY2VzcyoJR2V0TmV4dChGWF9QT1NJVElPTiYgcG9zLCBGWF9MUFZPSUQgcFVzZXJEYXRhID0gTlVMTCkgPSAwOw0KK307DQorSUZYX0ZvbnRTb3VyY2VFbnVtKglGWF9DcmVhdGVEZWZhdWx0Rm9udFNvdXJjZUVudW0oKTsNCitjbGFzcyBJRlhfRm9udE1ncg0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRlhfRm9udE1nciogQ3JlYXRlKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLCBJRlhfRm9udE1nckRlbGVnYXRlKiBwRGVsZWdhdGUgPSBOVUxMLCBGWF9MUFZPSUQgcFVzZXJEYXRhID0gTlVMTCk7DQorICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNoYXJzZXQoRlhfQllURSBuQ2hhcnNldCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldEZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgICAgaW5saW5lIElGWF9Gb250KgkJTG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2Uod0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlDaGFyc2V0KEZYX0JZVEUgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0Rm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyIGlGYWNlSW5kZXgsIEZYX0lOVDMyKiBwRmFjZUNvdW50ID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGaWxlTmFtZSwgRlhfSU5UMzIgaUZhY2VJbmRleCwgRlhfSU5UMzIqIHBGYWNlQ291bnQgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgRlhfSU5UMzIgaUZhY2VJbmRleCwgRlhfSU5UMzIqIHBGYWNlQ291bnQgPSBOVUxMLCBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpID0gMDsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJQ2xlYXJGb250Q2FjaGUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbW92ZUZvbnQoSUZYX0ZvbnQgKnBGb250KSA9IDA7DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2FhNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0xJTkVCUkVBSw0KKyNkZWZpbmUgX0ZYX0xJTkVCUkVBSw0KK2VudW0gRlhfTElORUJSRUFLVFlQRSB7DQorICAgIEZYX0xCVF9VTktOT1dOCQkJCT0gMHgwMCwNCisgICAgRlhfTEJUX0RJUkVDVF9CUksJCQk9IDB4MUEsDQorICAgIEZYX0xCVF9JTkRJUkVDVF9CUksJCQk9IDB4MkIsDQorICAgIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLCQk9IDB4M0MsDQorICAgIEZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksJPSAweDRELA0KKyAgICBGWF9MQlRfUFJPSElCSVRFRF9CUksJCT0gMHg1RSwNCisgICAgRlhfTEJUX0hBTkdVTF9TUEFDRV9CUksJCT0gMHg2RiwNCit9Ow0KKyNkZWZpbmUgRlhfTEJVTglGWF9MQlRfVU5LTk9XTg0KKyNkZWZpbmUgRlhfTEJEQglGWF9MQlRfRElSRUNUX0JSSw0KKyNkZWZpbmUgRlhfTEJJQglGWF9MQlRfSU5ESVJFQ1RfQlJLDQorI2RlZmluZSBGWF9MQkNCCUZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLDQorI2RlZmluZSBGWF9MQkNQCUZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksNCisjZGVmaW5lIEZYX0xCUEIJRlhfTEJUX1BST0hJQklURURfQlJLDQorI2RlZmluZSBGWF9MQkhTCUZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLDQordm9pZAlGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoRlhfTFBDV1NUUiBwd3NUZXh0LCBGWF9MSU5FQlJFQUtUWVBFICpwQnJrVHlwZSwgRlhfSU5UMzIgaUxlbmd0aCk7DQordm9pZAlGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoRlhfTFBDV1NUUiBwd3NUZXh0LCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfSW50MzJNYXNzQXJyYXkgJmJwKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sZ2cuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xnZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDc4NmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sZ2cuaApAQCAtMCwwICsxLDI2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9MQU5HVUFHRQ0KKyNkZWZpbmUgX0ZYX0xBTkdVQUdFDQorI2RlZmluZSBGWF9MQU5HX05ldXRyYWwJCQkJCQkJMHgwMDAwDQorI2RlZmluZSBGWF9MQU5HX0ludmFyaWFudAkJCQkJCTB4MDA3Zg0KKyNkZWZpbmUgRlhfTEFOR19Vc2VyRGVmYXVsdAkJCQkJCTB4MDQwMA0KKyNkZWZpbmUgRlhfTEFOR19TeXN0ZW1EZWZhdWx0CQkJCQkweDA4MDANCisjZGVmaW5lIEZYX0xBTkdfQWZyaWthYW5zX1NvdXRoQWZyaWNhCQkJMHgwNDM2DQorI2RlZmluZSBGWF9MQU5HX0FsYmFuaWFuX0FsYmFuaWEJCQkJMHgwNDFjDQorI2RlZmluZSBGWF9MQU5HX0Fsc2F0aWFuX0ZyYW5jZQkJCQkJMHgwNDg0DQorI2RlZmluZSBGWF9MQU5HX0FtaGFyaWNfRXRoaW9waWEJCQkJMHgwNDVlDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19BbGdlcmlhCQkJCQkweDE0MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0JhaHJhaW4JCQkJCTB4M2MwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfRWd5cHQJCQkJCTB4MGMwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSXJhcQkJCQkJCTB4MDgwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSm9yZGFuCQkJCQkweDJjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0t1d2FpdAkJCQkJMHgzNDAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19MZWJhbm9uCQkJCQkweDMwMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0xpYnlhCQkJCQkweDEwMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX01vcm9jY28JCQkJCTB4MTgwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfT21hbgkJCQkJCTB4MjAwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfUWF0YXIJCQkJCTB4NDAwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfU2F1ZGlBcmFiaWEJCQkJMHgwNDAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19TeXJpYQkJCQkJMHgyODAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19UdW5pc2lhCQkJCQkweDFjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1VBRQkJCQkJCTB4MzgwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfWWVtZW4JCQkJCTB4MjQwMQ0KKyNkZWZpbmUgRlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhCQkJCTB4MDQyYg0KKyNkZWZpbmUgRlhfTEFOR19Bc3NhbWVzZV9JbmRpYQkJCQkJMHgwNDRkDQorI2RlZmluZSBGWF9MQU5HX0F6ZXJiYWlqYW5fQ3lyaWxsaWMJCQkJMHgwODJjDQorI2RlZmluZSBGWF9MQU5HX0F6ZXJiYWlqYW5fTGF0aW4JCQkJMHgwNDJjDQorI2RlZmluZSBGWF9MQU5HX0Jhc2hraXJfUnVzc2lhCQkJCQkweDA0NmQNCisjZGVmaW5lIEZYX0xBTkdfQmFzcXVlX0Jhc3F1ZQkJCQkJMHgwNDJkDQorI2RlZmluZSBGWF9MQU5HX0JlbGFydXNpYW5fQmVsYXJ1cwkJCQkweDA0MjMNCisjZGVmaW5lIEZYX0xBTkdfQmVuZ2FsaV9CYW5nbGFkZXNoCQkJCTB4MDg0NQ0KKyNkZWZpbmUgRlhfTEFOR19CZW5nYWxpX0luZGlhCQkJCQkweDA0NDUNCisjZGVmaW5lIEZYX0xBTkdfQm9zbmlhX0hlcnplZ292aW5hCQkJCTB4MTAxYQ0KKyNkZWZpbmUgRlhfTEFOR19Cb3NuaWFuX0N5cmlsbGljCQkJCTB4MjAxYQ0KKyNkZWZpbmUgRlhfTEFOR19Cb3NuaWFuX0xhdGluCQkJCQkweDE0MWENCisjZGVmaW5lIEZYX0xBTkdfQnJldG9uX0ZyYW5jZQkJCQkJMHgwNDdlDQorI2RlZmluZSBGWF9MQU5HX0J1bGdhcmlhbl9CdWxnYXJpYQkJCQkweDA0MDINCisjZGVmaW5lIEZYX0xBTkdfQnVybWVzZQkJCQkJCQkweDA0NTUNCisjZGVmaW5lIEZYX0xBTkdfQ2F0YWxhbl9DYXRhbGFuCQkJCQkweDA0MDMNCisjZGVmaW5lIEZYX0xBTkdfQ2hlcm9rZWUJCQkJCQkweDA0NWMNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZwkJCQkweDBjMDQNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9NYWNhbwkJCQkJMHgxNDA0DQorI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfUFJDCQkJCQkJMHgwODA0DQorI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfU2luZ2Fwb3JlCQkJCTB4MTAwNA0KKyNkZWZpbmUgRlhfTEFOR19DaGluZXNlX1RhaXdhbgkJCQkJMHgwNDA0DQorI2RlZmluZSBGWF9MQU5HX0NvcnNpY2FuX0ZyYW5jZQkJCQkJMHgwNDgzDQorI2RlZmluZSBGWF9MQU5HX0Nyb2F0aWFuX0Nyb2F0aWEJCQkJMHgwNDFhDQorI2RlZmluZSBGWF9MQU5HX0Nyb2F0aWFuX0xhdGluCQkJCQkweDEwMWENCisjZGVmaW5lIEZYX0xBTkdfQ3VzdG9tQ3VycmVudAkJCQkJMHgwYzAwDQorI2RlZmluZSBGWF9MQU5HX0N6ZWNoUmVwdWJsaWMJCQkJCTB4MDQwNQ0KKyNkZWZpbmUgRlhfTEFOR19EYW5pc2hfRGVubWFyawkJCQkJMHgwNDA2DQorI2RlZmluZSBGWF9MQU5HX0RhcmlfQWZnaGFuaXN0YW4JCQkJMHgwNDhjDQorI2RlZmluZSBGWF9MQU5HX0RpdmVoaV9NYWxkaXZlcwkJCQkJMHgwNDY1DQorI2RlZmluZSBGWF9MQU5HX0R1dGNoX0JlbGdpdW0JCQkJCTB4MDgxMw0KKyNkZWZpbmUgRlhfTEFOR19EdXRjaF9OZXRoZXJsYW5kcwkJCQkweDA0MTMNCisjZGVmaW5lIEZYX0xBTkdfRHV0Y2hfUHJlZmVycmVkCQkJCQkweDAwMTMNCisjZGVmaW5lIEZYX0xBTkdfRHpvbmdraGEJCQkJCQkweDA4NTENCisjZGVmaW5lIEZYX0xBTkdfRWRvCQkJCQkJCQkweDA0NjYNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEJCQkJMHgwYzA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfQmVsaXplCQkJCQkweDI4MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9DYW5hZGEJCQkJCTB4MTAwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0NhcmliYmVhbgkJCQkweDI0MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Ib25nS29uZwkJCQkweDNjMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9JbmRpYQkJCQkJMHg0MDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kb25lc2lhCQkJCTB4MzgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0lyZWxhbmQJCQkJCTB4MTgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0phbWFpY2EJCQkJCTB4MjAwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX01hbGF5c2lhCQkJCTB4NDQwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX05ld1plYWxhbmQJCQkJMHgxNDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfUGhpbGlwcGluZXMJCQkJMHgzNDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfU2luZ2Fwb3JlCQkJCTB4NDgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1NvdXRoQWZyaWNhCQkJCTB4MWMwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1RyaW5pZGFkVG9iYWdvCQkJMHgyYzA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkS2luZ2RvbQkJCTB4MDgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1VuaXRlZFN0YXRlcwkJCTB4MDQwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1ppbWJhYndlCQkJCTB4MzAwOQ0KKyNkZWZpbmUgRlhfTEFOR19Fc3Rvbmlhbl9Fc3RvbmlhCQkJCTB4MDQyNQ0KKyNkZWZpbmUgRlhfTEFOR19GYXJvZXNlX0Zhcm9lSXNsYW5kcwkJCTB4MDQzOA0KKyNkZWZpbmUgRlhfTEFOR19GaWxpcGlub19QaGlsaXBwaW5lcwkJCTB4MDQ2NA0KKyNkZWZpbmUgRlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQJCQkJCTB4MDQwYg0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQmVsZ2l1bQkJCQkJMHgwODBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW1lcm9vbgkJCQkJMHgyYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW5hZGEJCQkJCTB4MGMwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQ29uZ29EUkMJCQkJCTB4MjQwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQ290ZWRJdm9pcmUJCQkJMHgzMDBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9GcmFuY2UJCQkJCTB4MDQwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfSGFpdGkJCQkJCTB4M2MwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTHV4ZW1ib3VyZwkJCQkweDE0MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01hbGkJCQkJCQkweDM0MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01vbmFjbwkJCQkJMHgxODBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Nb3JvY2NvCQkJCQkweDM4MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX1JldW5pb24JCQkJCTB4MjAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfU2VuZWdhbAkJCQkJMHgyODBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Td2l0emVybGFuZAkJCQkweDEwMGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX1dlc3RJbmRpZXMJCQkJMHgxYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyaXNpYW5fTmV0aGVybGFuZHMJCQkJMHgwNDYyDQorI2RlZmluZSBGWF9MQU5HX0Z1bGZ1bGRlCQkJCQkJMHgwNDY3DQorI2RlZmluZSBGWF9MQU5HX0dhZWxpY19JcmVsYW5kCQkJCQkweDA4M2MNCisjZGVmaW5lIEZYX0xBTkdfR2FlbGljX1Njb3RsYW5kCQkJCQkweDA0M2MNCisjZGVmaW5lIEZYX0xBTkdfR2FsaWNpYW5fR2FsaWNpYW4JCQkJMHgwNDU2DQorI2RlZmluZSBGWF9MQU5HX0dlb3JnaWFuX0dlb3JnaWEJCQkJMHgwNDM3DQorI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9BdXN0cmlhCQkJCQkweDBjMDcNCisjZGVmaW5lIEZYX0xBTkdfR2VybWFuX0dlcm1hbnkJCQkJCTB4MDQwNw0KKyNkZWZpbmUgRlhfTEFOR19HZXJtYW5fTGllY2h0ZW5zdGVpbgkJCTB4MTQwNw0KKyNkZWZpbmUgRlhfTEFOR19HZXJtYW5fTHV4ZW1ib3VyZwkJCQkweDEwMDcNCisjZGVmaW5lIEZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kCQkJCTB4MDgwNw0KKyNkZWZpbmUgRlhfTEFOR19HcmVla19HcmVlY2UJCQkJCTB4MDQwOA0KKyNkZWZpbmUgRlhfTEFOR19HcmVlbmxhbmRpY19HcmVlbmxhbmQJCQkweDA0NmYNCisjZGVmaW5lIEZYX0xBTkdfR3VhcmFuaQkJCQkJCQkweDA0NzQNCisjZGVmaW5lIEZYX0xBTkdfR3VqYXJhdGlfSW5kaWEJCQkJCTB4MDQ0Nw0KKyNkZWZpbmUgRlhfTEFOR19IYXVzYV9MYXRpbk5pZ2VyaWEJCQkJMHgwNDY4DQorI2RlZmluZSBGWF9MQU5HX0hhd2FpaWFuCQkJCQkJMHgwNDc1DQorI2RlZmluZSBGWF9MQU5HX0hlYnJld19Jc3JhZWwJCQkJCTB4MDQwZA0KKyNkZWZpbmUgRlhfTEFOR19IaW5kaV9JbmRpYQkJCQkJCTB4MDQzOQ0KKyNkZWZpbmUgRlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeQkJCQkweDA0MGUNCisjZGVmaW5lIEZYX0xBTkdfSWJpYmlvX05pZ2VyaWEJCQkJCTB4MDQ2OQ0KKyNkZWZpbmUgRlhfTEFOR19JY2VsYW5kaWNfSWNlbGFuZAkJCQkweDA0MGYNCisjZGVmaW5lIEZYX0xBTkdfSWdib19OaWdlcmlhCQkJCQkweDA0NzANCisjZGVmaW5lIEZYX0xBTkdfSW5kb25lc2lhbl9JbmRvbmVzaWEJCQkweDA0MjENCisjZGVmaW5lIEZYX0xBTkdfSW51a3RpdHV0X0xhdGluQ2FuYWRhCQkJMHgwODVkDQorI2RlZmluZSBGWF9MQU5HX0ludWt0aXR1dF9TeWxsYWJpY3NDYW5hZGEJCTB4MDQ1ZA0KKyNkZWZpbmUgRlhfTEFOR19Jc2lYaG9zYV9Tb3V0aEFmcmljYQkJCTB4MDQzNA0KKyNkZWZpbmUgRlhfTEFOR19Jc2ladWx1X1NvdXRoQWZyaWNhCQkJCTB4MDQzNQ0KKyNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX0l0YWx5CQkJCQkweDA0MTANCisjZGVmaW5lIEZYX0xBTkdfSXRhbGlhbl9Td2l0emVybGFuZAkJCQkweDA4MTANCisjZGVmaW5lIEZYX0xBTkdfSmFwYW5lc2VfSmFwYW4JCQkJCTB4MDQxMQ0KKyNkZWZpbmUgRlhfTEFOR19LYW5uYWRhX0luZGlhCQkJCQkweDA0NGINCisjZGVmaW5lIEZYX0xBTkdfS2FudXJpCQkJCQkJCTB4MDQ3MQ0KKyNkZWZpbmUgRlhfTEFOR19LYXNobWlyaQkJCQkJCTB4MDg2MA0KKyNkZWZpbmUgRlhfTEFOR19LYXNobWlyaV9BcmFiaWMJCQkJCTB4MDQ2MA0KKyNkZWZpbmUgRlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbgkJCQkweDA0M2YNCisjZGVmaW5lIEZYX0xBTkdfS2htZXJfQ2FtYm9kaWEJCQkJCTB4MDQ1Mw0KKyNkZWZpbmUgRlhfTEFOR19LaWNoZV9HdWF0ZW1hbGEJCQkJCTB4MDQ4Ng0KKyNkZWZpbmUgRlhfTEFOR19LaW55YXJ3YW5kYV9Sd2FuZGEJCQkJMHgwNDg3DQorI2RlZmluZSBGWF9MQU5HX0tpc3dhaGlsaV9LZW55YQkJCQkJMHgwNDQxDQorI2RlZmluZSBGWF9MQU5HX0tvbmthbmlfSW5kaWEJCQkJCTB4MDQ1Nw0KKyNkZWZpbmUgRlhfTEFOR19Lb3JlYW5fS29yZWEJCQkJCTB4MDQxMg0KKyNkZWZpbmUgRlhfTEFOR19LeXJneXpfS3lyZ3l6c3RhbgkJCQkweDA0NDANCisjZGVmaW5lIEZYX0xBTkdfTGFvX0xhb1BEUgkJCQkJCTB4MDQ1NA0KKyNkZWZpbmUgRlhfTEFOR19MYXRpbgkJCQkJCQkweDA0NzYNCisjZGVmaW5lIEZYX0xBTkdfTGF0dmlhbl9MYXR2aWEJCQkJCTB4MDQyNg0KKyNkZWZpbmUgRlhfTEFOR19MaXRodWFuaWFuX0xpdGh1YW5pYQkJCTB4MDQyNw0KKyNkZWZpbmUgRlhfTEFOR19MaXRodWFuaWFuVHJhZAkJCQkJMHgwODI3DQorI2RlZmluZSBGWF9MQU5HX0xvd2VyIFNvcmJpYW5fR2VybWFueQkJCTB4MDgyZQ0KKyNkZWZpbmUgRlhfTEFOR19MdXhlbWJvdXJnaXNoX0x1eGVtYm91cmcJCTB4MDQ2ZQ0KKyNkZWZpbmUgRlhfTEFOR19NYWNlZG9uaWFuCQkJCQkJMHgwNDJmDQorI2RlZmluZSBGWF9MQU5HX01hbGF5X0JydW5laURhcnVzc2FsYW0JCQkweDA4M2UNCisjZGVmaW5lIEZYX0xBTkdfTWFsYXlfTWFsYXlzaWEJCQkJCTB4MDQzZQ0KKyNkZWZpbmUgRlhfTEFOR19NYWxheWFsYW1fSW5kaWEJCQkJCTB4MDQ0Yw0KKyNkZWZpbmUgRlhfTEFOR19NYWxkaXZpYW4JCQkJCQkweDA0NjUNCisjZGVmaW5lIEZYX0xBTkdfTWFsdGVzZV9NYWx0YQkJCQkJMHgwNDNhDQorI2RlZmluZSBGWF9MQU5HX01hbmlwdXJpCQkJCQkJMHgwNDU4DQorI2RlZmluZSBGWF9MQU5HX01hb3JpX05ld1plYWxhbmQJCQkJMHgwNDgxDQorI2RlZmluZSBGWF9MQU5HX01hcHVkdW5ndW5fQ2hpbGUJCQkJMHgwNDdhDQorI2RlZmluZSBGWF9MQU5HX01hcmF0aGlfSW5kaWEJCQkJCTB4MDQ0ZQ0KKyNkZWZpbmUgRlhfTEFOR19Nb2hhd2tfTW9oYXdrCQkJCQkweDA0N2MNCisjZGVmaW5lIEZYX0xBTkdfTW9uZ29saWFuX0N5cmlsbGljTW9uZ29saWEJCTB4MDQ1MA0KKyNkZWZpbmUgRlhfTEFOR19Nb25nb2xpYW5fVHJhZGl0aW9uYWxNb25nb2xpYW4JMHgwODUwDQorI2RlZmluZSBGWF9MQU5HX05lcGFsaV9JbmRpYQkJCQkJMHgwODYxDQorI2RlZmluZSBGWF9MQU5HX05lcGFsaV9OZXBhbAkJCQkJMHgwNDYxDQorI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9Cb2ttYWwJCQkJMHgwNDE0DQorI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9OeW5vcnNrCQkJCTB4MDgxNA0KKyNkZWZpbmUgRlhfTEFOR19PY2NpdGFuX0ZyYW5jZQkJCQkJMHgwNDgyDQorI2RlZmluZSBGWF9MQU5HX09yaXlhX0luZGlhCQkJCQkJMHgwNDQ4DQorI2RlZmluZSBGWF9MQU5HX09yb21vCQkJCQkJCTB4MDQ3Mg0KKyNkZWZpbmUgRlhfTEFOR19QYXBpYW1lbnR1CQkJCQkJMHgwNDc5DQorI2RlZmluZSBGWF9MQU5HX1Bhc2h0b19BZmdoYW5pc3RhbgkJCQkweDA0NjMNCisjZGVmaW5lIEZYX0xBTkdfUGVyc2lhbgkJCQkJCQkweDA0MjkNCisjZGVmaW5lIEZYX0xBTkdfUG9saXNoX1BvbGFuZAkJCQkJMHgwNDE1DQorI2RlZmluZSBGWF9MQU5HX1BvcnR1Z3Vlc2VfQnJhemlsCQkJCTB4MDQxNg0KKyNkZWZpbmUgRlhfTEFOR19Qb3J0dWd1ZXNlX1BvcnR1Z2FsCQkJCTB4MDgxNg0KKyNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX0luZGlhCQkJCQkweDA0NDYNCisjZGVmaW5lIEZYX0xBTkdfUHVuamFiaV9QYWtpc3RhbgkJCQkweDA4NDYNCisjZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9Cb2xpdmlhCQkJCQkweDA0NmINCisjZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9FY3VhZG9yCQkJCQkweDA4NmINCisjZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9QZXJ1CQkJCQkweDBjNmINCisjZGVmaW5lIEZYX0xBTkdfUm9tYW5pYW5fTW9sZG92YQkJCQkweDA4MTgNCisjZGVmaW5lIEZYX0xBTkdfUm9tYW5pYW5fUm9tYW5pYQkJCQkweDA0MTgNCisjZGVmaW5lIEZYX0xBTkdfUm9tYW5zaF9Td2l0emVybGFuZAkJCQkweDA0MTcNCisjZGVmaW5lIEZYX0xBTkdfUnVzc2lhbl9Nb2xkb3ZhCQkJCQkweDA4MTkNCisjZGVmaW5lIEZYX0xBTkdfUnVzc2lhbl9SdXNzaWEJCQkJCTB4MDQxOQ0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX0luYXJpRmlubGFuZAkJCQkweDI0M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlTm9yd2F5CQkJCQkweDEwM2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlU3dlZGVuCQkJCQkweDE0M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVybkZpbmxhbmQJCQkweDBjM2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVybk5vcndheQkJCQkweDA0M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVyblN3ZWRlbgkJCQkweDA4M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Ta29sdEZpbmxhbmQJCQkJMHgyMDNiDQorI2RlZmluZSBGWF9MQU5HX1NhbWlfU291dGhlcm5Ob3J3YXkJCQkJMHgxODNiDQorI2RlZmluZSBGWF9MQU5HX1NhbWlfU291dGhlcm5Td2VkZW4JCQkJMHgxYzNiDQorI2RlZmluZSBGWF9MQU5HX1NhbnNrcml0SW5kaWEJCQkJCTB4MDQ0Zg0KKyNkZWZpbmUgRlhfTEFOR19TZXJiaWFuQ3lyaWxsaWNfQm9zbmlhSGVyemVnb3ZpbmEJMHgxYzFhDQorI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5DeXJpbGxpY19TZXJiaWEJCQkJMHgwYzFhDQorI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5MYXRpbl9Cb3NuaWFIZXJ6ZWdvdmluYQkJMHgxODFhDQorI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5MYXRpbl9TZXJiaWEJCQkJMHgwODFhDQorI2RlZmluZSBGWF9MQU5HX1Nlc290aG9TYUxlYm9hCQkJCQkweDA0NmMNCisjZGVmaW5lIEZYX0xBTkdfU2V0c3dhbmFfU291dGhBZnJpY2EJCQkweDA0MzINCisjZGVmaW5lIEZYX0xBTkdfU2luZGhpX0FyYWJpYwkJCQkJMHgwODU5DQorI2RlZmluZSBGWF9MQU5HX1NpbmRoaV9EZXZhbmFnYXJpCQkJCTB4MDQ1OQ0KKyNkZWZpbmUgRlhfTEFOR19TaW5oYWxhX1NyaUxhbmthCQkJCTB4MDQ1Yg0KKyNkZWZpbmUgRlhfTEFOR19TbG92YWtfU2xvdmFraWEJCQkJCTB4MDQxYg0KKyNkZWZpbmUgRlhfTEFOR19TbG92ZW5pYW5fU2xvdmVuaWEJCQkJMHgwNDI0DQorI2RlZmluZSBGWF9MQU5HX1NvbWFsaQkJCQkJCQkweDA0NzcNCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9BcmdlbnRpbmEJCQkJMHgyYzBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQm9saXZpYQkJCQkJMHg0MDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ2hpbGUJCQkJCTB4MzQwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0NvbG9tYmlhCQkJCTB4MjQwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0Nvc3RhUmljYQkJCQkweDE0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Eb21pbmljYW5SZXB1YmxpYwkJMHgxYzBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWN1YWRvcgkJCQkJMHgzMDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWxTYWx2YWRvcgkJCQkweDQ0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEJCQkJMHgxMDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfSG9uZHVyYXMJCQkJMHg0ODBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfTWV4aWNvCQkJCQkweDA4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9OaWNhcmFndWEJCQkJMHg0YzBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGFuYW1hCQkJCQkweDE4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QYXJhZ3VheQkJCQkweDNjMGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QZXJ1CQkJCQkweDI4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QdWVydG9SaWNvCQkJCTB4NTAwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0ludGVybmF0aW9uYWxTb3J0CQkweDBjMGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9UcmFkaXRpb25hbFNvcnQJCQkweDA0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Vbml0ZWRTdGF0ZXMJCQkweDU0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9VcnVndWF5CQkJCQkweDM4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEJCQkJMHgyMDBhDQorI2RlZmluZSBGWF9MQU5HX1N1dHVfU291dGhBZnJpY2EJCQkJMHgwNDMwDQorI2RlZmluZSBGWF9MQU5HX1N3ZWRpc2hfRmlubGFuZAkJCQkJMHgwODFkDQorI2RlZmluZSBGWF9MQU5HX1N3ZWRpc2hfU3dlZGVuCQkJCQkweDA0MWQNCisjZGVmaW5lIEZYX0xBTkdfU3lyaWFjX1N5cmlhCQkJCQkweDA0NWENCisjZGVmaW5lIEZYX0xBTkdfVGFqaWtfQ3lyaWxsaWNUYWppa2lzdGFuCQkweDA0MjgNCisjZGVmaW5lIEZYX0xBTkdfVGFtYXppZ2h0X0FyYWJpY01vcm9jY28JCQkweDA0NWYNCisjZGVmaW5lIEZYX0xBTkdfVGFtYXppZ2h0X0xhdGluQWxnZXJpYQkJCTB4MDg1Zg0KKyNkZWZpbmUgRlhfTEFOR19UYW1pbF9JbmRpYQkJCQkJCTB4MDQ0OQ0KKyNkZWZpbmUgRlhfTEFOR19UYXRhcl9SdXNzaWEJCQkJCTB4MDQ0NA0KKyNkZWZpbmUgRlhfTEFOR19UZWx1Z3VfSW5kaWEJCQkJCTB4MDQ0YQ0KKyNkZWZpbmUgRlhfTEFOR19UaGFpX1RoYWlsYW5kCQkJCQkweDA0MWUNCisjZGVmaW5lIEZYX0xBTkdfVGliZXRhblBSQwkJCQkJCTB4MDQ1MQ0KKyNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9Fcml0cmVhCQkJCTB4MDg3Mw0KKyNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9FdGhpb3BpYQkJCQkweDA0NzMNCisjZGVmaW5lIEZYX0xBTkdfVHNvbmdhCQkJCQkJCTB4MDQzMQ0KKyNkZWZpbmUgRlhfTEFOR19UdXJraXNoX1R1cmtleQkJCQkJMHgwNDFmDQorI2RlZmluZSBGWF9MQU5HX1R1cmttZW5fVHVya21lbmlzdGFuCQkJMHgwNDQyDQorI2RlZmluZSBGWF9MQU5HX1VpZ2h1clBSQwkJCQkJCTB4MDQ4MA0KKyNkZWZpbmUgRlhfTEFOR19Va3JhaW5pYW5fVWtyYWluZQkJCQkweDA0MjINCisjZGVmaW5lIEZYX0xBTkdfVXBwZXJTb3JiaWFuX0dlcm1hbnkJCQkweDA0MmUNCisjZGVmaW5lIEZYX0xBTkdfVXJkdV9QYWtpc3RhbgkJCQkJMHgwNDIwDQorI2RlZmluZSBGWF9MQU5HX1VyZHVfSW5kaWEJCQkJCQkweDA4MjANCisjZGVmaW5lIEZYX0xBTkdfVXpiZWtfQ3lyaWxsaWNVemJla2lzdGFuCQkweDA4NDMNCisjZGVmaW5lIEZYX0xBTkdfVXpiZWtfTGF0aW5VemJla2lzdGFuCQkJMHgwNDQzDQorI2RlZmluZSBGWF9MQU5HX1ZlbmRhCQkJCQkJCTB4MDQzMw0KKyNkZWZpbmUgRlhfTEFOR19WaWV0bmFtZXNlX1ZpZXRuYW0JCQkJMHgwNDJhDQorI2RlZmluZSBGWF9MQU5HX1dlbHNoX1VuaXRlZEtpbmdkb20JCQkJMHgwNDUyDQorI2RlZmluZSBGWF9MQU5HX1dvbG9mX1NlbmVnYWwJCQkJCTB4MDQ4OA0KKyNkZWZpbmUgRlhfTEFOR19YaG9zYQkJCQkJCQkweDA0MzQNCisjZGVmaW5lIEZYX0xBTkdfWWFrdXRfUnVzc2lhCQkJCQkweDA0ODUNCisjZGVmaW5lIEZYX0xBTkdfWWlQUkMJCQkJCQkJMHgwNDc4DQorI2RlZmluZSBGWF9MQU5HX1lpZGRpc2gJCQkJCQkJMHgwNDNkDQorI2RlZmluZSBGWF9MQU5HX1lvcnViYV9OaWdlcmlhCQkJCQkweDA0NmENCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sb2NhbGUuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODY5NzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sb2NhbGUuaApAQCAtMCwwICsxLDE2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9MT0NBTEVfSF8NCisjZGVmaW5lIF9GWF9MT0NBTEVfSF8NCitjbGFzcyBDRlhfVW5pdGltZTsNCitjbGFzcyBJRlhfTG9jYWxlOw0KK2NsYXNzIElGWF9Gb3JtYXRTdHJpbmc7DQorY2xhc3MgSUZYX0xvY2FsZU1ncjsNCitlbnVtIEZYX0xPQ0FMRU5VTVNZTUJPTCB7DQorICAgIEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLA0KKyAgICBGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsDQorICAgIEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LA0KKyAgICBGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsDQorICAgIEZYX0xPQ0FMRU5VTVNZTUJPTF9aZXJvLA0KKyAgICBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsDQorICAgIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeU5hbWUsDQorfTsNCitlbnVtIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgew0KKyAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsDQorICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsDQorICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLA0KKyAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGwsDQorICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZywNCit9Ow0KK2VudW0gRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgew0KKyAgICBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQsDQorICAgIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3ksDQorICAgIEZYX0xPQ0FMRU5VTVBBVFRFUk5fRGVjaW1hbCwNCisgICAgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyLA0KK307DQorZW51bSBGWF9MT0NBTEVDQVRFR09SWSB7DQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1Vua25vd24sDQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUsDQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWUsDQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lLA0KKyAgICBGWF9MT0NBTEVDQVRFR09SWV9OdW0sDQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQsDQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm8sDQorICAgIEZYX0xPQ0FMRUNBVEVHT1JZX051bGwsDQorfTsNCitlbnVtIEZYX0RBVEVUSU1FVFlQRSB7DQorICAgIEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duLA0KKyAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZSwNCisgICAgRlhfREFURVRJTUVUWVBFX1RpbWUsDQorICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwNCisgICAgRlhfREFURVRJTUVUWVBFX1RpbWVEYXRlLA0KK307DQorY2xhc3MgSUZYX0xvY2FsZQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJRlhfTG9jYWxlKiBDcmVhdGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSk7DQorDQorICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgPSAwOw0KKw0KKw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAlHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlHZXRNb250aE5hbWUoRlhfSU5UMzIgbk1vbnRoLCBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlHZXREYXlOYW1lKEZYX0lOVDMyIG5XZWVrLCBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLCBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCUdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgRlhfQk9PTCBiQUQgPSBUUlVFKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAlHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorfTsNCitjbGFzcyBJRlhfTG9jYWxlTWdyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9XT1JECQkJR2V0RGVmTG9jYWxlSUQoKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX0xvY2FsZSogCUdldERlZkxvY2FsZSgpID0gMDsNCisgICAgdmlydHVhbCBJRlhfTG9jYWxlKiAJR2V0TG9jYWxlKEZYX1dPUkQgbGNpZCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9Mb2NhbGUqIAlHZXRMb2NhbGVCeU5hbWUoRlhfV1NUUiB3c0xvY2FsZU5hbWUpID0gMDsNCit9Ow0KK0lGWF9Mb2NhbGVNZ3IqCUZYX0xvY2FsZU1ncl9DcmVhdGUoRlhfTFBDV1NUUiBwc3pMb2NhbFBhdGgsIEZYX1dPUkQgd0RlZmF1bHRMQ0lEKTsNCit2b2lkCQkJRlhfUGFyc2VOdW1TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtLCBDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQpOw0KK0ZYX0JPT0wJCQlGWF9EYXRlRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLCBDRlhfVW5pdGltZSYgZGF0ZXRpbWUpOw0KK0ZYX0JPT0wJCQlGWF9UaW1lRnJvbUNhbm9uaWNhbChGWF9XU1RSIHdzVGltZSwgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLCBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCitjbGFzcyBJRlhfRm9ybWF0U3RyaW5nDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGWF9Gb3JtYXRTdHJpbmcqIENyZWF0ZShJRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyLCBGWF9CT09MIGJVc2VMQ0lEKTsNCisNCisgICAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZCBTcGxpdEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0dGVybnMpID0gMDsNCisgICAgdmlydHVhbCBGWF9MT0NBTEVDQVRFR09SWQlHZXRDYXRlZ29yeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCQlHZXRMQ0lEKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJR2V0TG9jYWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlQYXJzZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCVBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfRkxPQVQgJmZWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJUGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfREFURVRJTUVUWVBFIGVEYXRlVGltZVR5cGUsIENGWF9Vbml0aW1lJiBkdFZhbHVlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdE51bShGWF9GTE9BVCBmTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0WmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSA9IDA7DQorfTsNCitjbGFzcyBDRlhfRGVjaW1hbCA6IENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfRGVjaW1hbCgpOw0KKyAgICBDRlhfRGVjaW1hbChGWF9VSU5UMzIgdmFsKTsNCisgICAgQ0ZYX0RlY2ltYWwoRlhfVUlOVDY0IHZhbCk7DQorICAgIENGWF9EZWNpbWFsKEZYX0lOVDMyIHZhbCk7DQorICAgIENGWF9EZWNpbWFsKEZYX0lOVDY0IHZhbCk7DQorICAgIENGWF9EZWNpbWFsKEZYX0ZMT0FUIHZhbCwgRlhfVUlOVDggc2NhbGUgPSAzKTsNCisgICAgQ0ZYX0RlY2ltYWwoRlhfV1NUUiBzdHIpOw0KKyAgICBDRlhfRGVjaW1hbChGWF9CU1RSIHN0cik7DQorICAgIG9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkgY29uc3Q7DQorICAgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0Ow0KKyAgICBGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgICAgRlhfQk9PTCBvcGVyYXRvciA8PSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICAgIEZYX0JPT0wgb3BlcmF0b3IgPj0gKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgICBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgICAgRlhfQk9PTCBvcGVyYXRvciA8ICAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICAgIEZYX0JPT0wgb3BlcmF0b3IgPiAgKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgICBDRlhfRGVjaW1hbCBvcGVyYXRvciArIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgICAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IgLSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICAgIENGWF9EZWNpbWFsIG9wZXJhdG9yICogKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgICBDRlhfRGVjaW1hbCBvcGVyYXRvciAvIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgICAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IgJSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICAgIHZvaWQJCVNldFNjYWxlKEZYX1VJTlQ4IG5ld1NjYWxlKTsNCisgICAgRlhfVUlOVDgJR2V0U2NhbGUoKTsNCisgICAgdm9pZAkJU2V0QWJzKCk7DQorICAgIHZvaWQJCVNldE5lZ2F0ZSgpOw0KKyAgICB2b2lkCQlTZXRGbG9vcigpOw0KKyAgICB2b2lkCQlTZXRDZWlsaW5nKCk7DQorICAgIHZvaWQJCVNldFRydW5jYXRlKCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhfRGVjaW1hbChGWF9VSU5UMzIgaGksIEZYX1VJTlQzMiBtaWQsIEZYX1VJTlQzMiBsbywgRlhfQk9PTCBuZWcsIEZYX1VJTlQ4IHNjYWxlKTsNCisgICAgaW5saW5lIEZYX0JPT0wJSXNOb3RaZXJvKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fdUhpIHx8IG1fdU1pZCB8fCBtX3VMbzsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfSU5UOAlDb21wYXJlIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgICAgaW5saW5lIHZvaWQJCVN3YXAoQ0ZYX0RlY2ltYWwmIHZhbCk7DQorICAgIGlubGluZSB2b2lkCQlGbG9vck9yQ2VpbChGWF9CT09MIGJGbG9vcik7DQorICAgIENGWF9EZWNpbWFsCQlBZGRPck1pbnVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwsIEZYX0JPT0wgaXNBZGRpbmcpIGNvbnN0Ow0KKyAgICBDRlhfRGVjaW1hbAkJTXVsdGlwbHkoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICAgIENGWF9EZWNpbWFsCQlEaXZpZGUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICAgIENGWF9EZWNpbWFsCQlNb2R1bHVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgICBGWF9VSU5UMzIJCW1fdUZsYWdzOw0KKyAgICBGWF9VSU5UMzIJCW1fdUhpOw0KKyAgICBGWF9VSU5UMzIJCW1fdUxvOw0KKyAgICBGWF9VSU5UMzIJCW1fdU1pZDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X21lbS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjZDg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X21lbS5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfTUVNT1JZDQorI2RlZmluZSBfRlhfTUVNT1JZDQorY2xhc3MgSUZYX01FTUFsbG9jYXRvcjsNCitjbGFzcyBDRlhfVGFyZ2V0Ow0KK2VudW0gRlhfQUxMT0NUWVBFIHsNCisgICAgRlhfQUxMT0NUWVBFX0RlZmF1bHQJCT0gIDAsDQorICAgIEZYX0FMTE9DVFlQRV9TdGF0aWMJCQkJLA0KKyAgICBGWF9BTExPQ1RZUEVfRml4ZWQJCQkJLA0KKyAgICBGWF9BTExPQ1RZUEVfRHluYW1pYwkJCSwNCit9Ow0KK2NsYXNzIElGWF9NRU1BbGxvY2F0b3INCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQqCQkJQWxsb2Moc2l6ZV90IHNpemUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJRnJlZSh2b2lkICpwQmxvY2spID0gMDsNCisgICAgdmlydHVhbCBzaXplX3QJCQlHZXRCbG9ja1NpemUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCVNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0ID0gMDsNCit9Ow0KK0lGWF9NRU1BbGxvY2F0b3IqCUZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEUgZVR5cGUsIHNpemVfdCBjaHVua1NpemUsIHNpemVfdCBibG9ja1NpemUpOw0KK2NsYXNzIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICB2b2lkKglvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsNCisgICAgfQ0KKyAgICB2b2lkCW9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKQ0KKyAgICB7DQorICAgICAgICBGWF9GcmVlKHApOw0KKyAgICB9DQorICAgIHZvaWQqCW9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgSUZYX01FTUFsbG9jYXRvciAqcEFsbG9jYXRvcikNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBBbGxvY2F0b3ItPkFsbG9jKHNpemUpOw0KKyAgICB9DQorICAgIHZvaWQJb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnAsIElGWF9NRU1BbGxvY2F0b3IgKnBBbGxvY2F0b3IpDQorICAgIHsNCisgICAgICAgIHBBbGxvY2F0b3ItPkZyZWUocCk7DQorICAgIH0NCisgICAgdm9pZCoJb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCB2b2lkICpwbGFjZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBsYWNlOw0KKyAgICB9DQorICAgIHZvaWQJb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnAsIHZvaWQgKnBsYWNlKQl7fQ0KK307DQorI2RlZmluZSBGWFRBUkdFVF9OZXcJCQkJCQkJCQkJCW5ldw0KKyNkZWZpbmUgRlhUQVJHRVRfTmV3V2l0aChfX2FsbG9jYXRvcl9fKQkJCQkJCQluZXcoX19hbGxvY2F0b3JfXykNCisjZGVmaW5lIEZYVEFSR0VUX0RlbGV0ZQkJCQkJCQkJCQkJZGVsZXRlDQorI2RlZmluZSBGWFRBUkdFVF9EZWxldGVXaXRoKF9fY2xhc3NfXywgX19hbGxvY2F0b3JfXywgcG9pbnRlcikJeyhwb2ludGVyKS0+fl9fY2xhc3NfXygpOyAocG9pbnRlciktPm9wZXJhdG9yIGRlbGV0ZSgocG9pbnRlciksIChfX2FsbG9jYXRvcl9fKSk7fQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfcmJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1M2ZjNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oCkBAIC0wLDAgKzEsMjM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1JURkJSRUFLDQorI2RlZmluZSBfRlhfUlRGQlJFQUsNCitjbGFzcyBJRlhfVW5rbm93bjsNCitjbGFzcyBJRlhfRm9udDsNCitjbGFzcyBDRlhfQ2hhcjsNCitjbGFzcyBDRlhfUlRGQ2hhcjsNCitjbGFzcyBDRlhfUlRGQnJlYWtQaWVjZTsNCitjbGFzcyBJRlhfUlRGQnJlYWs7DQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9Ob25lCQkJCQkweDAwDQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrCQkJMHgwMQ0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWsJCQkweDAyDQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9JbmZpeEJyZWFrCQkJMHgwNA0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfVGFiQnJlYWsJCQkJMHgwOA0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfT3JwaGFuUG9zaXRpb25lZFRhYgkweDEwDQorI2RlZmluZSBGWF9SVEZCUkVBS19Ob25lCQkJCQkJMHgwMA0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGllY2VCcmVhawkJCQkJMHgwMQ0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfTGluZUJyZWFrCQkJCQkweDAyDQorI2RlZmluZSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhawkJCQkweDAzDQorI2RlZmluZSBGWF9SVEZCUkVBS19QYWdlQnJlYWsJCQkJCTB4MDQNCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb24JCQkweDAxDQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dAkJMHgwMg0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycwkJCTB4MDQNCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX0xpbmVEaXJlY3Rpb24JCQkweDA4DQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWIJCQkJMHgxMA0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfQXJhYmljTnVtYmVyCQkJMHgyMA0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZQkJCTB4NDANCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlCQkJCTB4ODANCisjZGVmaW5lIEZYX1JURkNIQVJTVFlMRV9BbGlnbm1lbnQJCQkJMHgwMDBGDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQXJhYmljTnVtYmVyCQkJMHgwMDEwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQXJhYmljU2hhZGRhCQkJMHgwMDIwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfT2RkQmlkaUxldmVsCQkJMHgwMDQwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyCQkJMHgwMDgwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQXJhYmljQ29udGV4dAkJCTB4MDMwMA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0luZGljCQkJCTB4MDQwMA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0NvbW1hCQkJCTB4MDgwMA0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0CQkJCTANCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyCQkJCTENCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQJCQkJMg0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQJCQkoMSA8PCAyKQ0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZAkJCSgyIDw8IDIpDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZExlZnQJCShGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkQ2VudGVyCQkoRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQJCShGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkTGVmdAkJKEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCB8IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkQ2VudGVyCShGWF9SVEZMSU5FQUxJR05NRU5UX0NlbnRlciB8IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkUmlnaHQJKEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9Mb3dlck1hc2sJCQkweDAzDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2sJCQkweDBDDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1JURlRFWFRPQkogew0KKyAgICBfRlhfUlRGVEVYVE9CSigpDQorICAgIHsNCisgICAgICAgIHBTdHIgPSBOVUxMOw0KKyAgICAgICAgcFdpZHRocyA9IE5VTEw7DQorICAgICAgICBpTGVuZ3RoID0gMDsNCisgICAgICAgIHBGb250ID0gTlVMTDsNCisgICAgICAgIGZGb250U2l6ZSA9IDEyLjBmOw0KKyAgICAgICAgZHdMYXlvdXRTdHlsZXMgPSAwOw0KKyAgICAgICAgaUNoYXJSb3RhdGlvbiA9IDA7DQorICAgICAgICBpQmlkaUxldmVsID0gMDsNCisgICAgICAgIHBSZWN0ID0gTlVMTDsNCisgICAgICAgIHdMaW5lQnJlYWtDaGFyID0gTCdcbic7DQorICAgICAgICBpSG9yaXpvbnRhbFNjYWxlID0gMTAwOw0KKyAgICAgICAgaVZlcnRpY2FsU2NhbGUgPSAxMDA7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUgkJcFN0cjsNCisgICAgRlhfSU5UMzIJCSpwV2lkdGhzOw0KKyAgICBGWF9JTlQzMgkJaUxlbmd0aDsNCisgICAgSUZYX0ZvbnQJCSpwRm9udDsNCisgICAgRlhfRkxPQVQJCWZGb250U2l6ZTsNCisgICAgRlhfRFdPUkQJCWR3TGF5b3V0U3R5bGVzOw0KKyAgICBGWF9JTlQzMgkJaUNoYXJSb3RhdGlvbjsNCisgICAgRlhfSU5UMzIJCWlCaWRpTGV2ZWw7DQorICAgIEZYX0xQQ1JFQ1RGCQlwUmVjdDsNCisgICAgRlhfV0NIQVIJCXdMaW5lQnJlYWtDaGFyOw0KKyAgICBGWF9JTlQzMgkJaUhvcml6b250YWxTY2FsZTsNCisgICAgRlhfSU5UMzIJCWlWZXJ0aWNhbFNjYWxlOw0KK30gRlhfUlRGVEVYVE9CSiwgKiBGWF9MUFJURlRFWFRPQko7DQordHlwZWRlZiBGWF9SVEZURVhUT0JKIGNvbnN0ICogRlhfTFBDUlRGVEVYVE9CSjsNCitjbGFzcyBDRlhfUlRGUGllY2UgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9SVEZQaWVjZSgpIDogbV9kd1N0YXR1cyhGWF9SVEZCUkVBS19QaWVjZUJyZWFrKQ0KKyAgICAgICAgLCBtX2lTdGFydFBvcygwKQ0KKyAgICAgICAgLCBtX2lXaWR0aCgtMSkNCisgICAgICAgICwgbV9pU3RhcnRDaGFyKDApDQorICAgICAgICAsIG1faUNoYXJzKDApDQorICAgICAgICAsIG1faUJpZGlMZXZlbCgwKQ0KKyAgICAgICAgLCBtX2lCaWRpUG9zKDApDQorICAgICAgICAsIG1faUZvbnRTaXplKDApDQorICAgICAgICAsIG1faUZvbnRIZWlnaHQoMCkNCisgICAgICAgICwgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCkNCisgICAgICAgICwgbV9pVmVydGljYWxTY2FsZSgxMDApDQorICAgICAgICAsIG1fZHdMYXlvdXRTdHlsZXMoMCkNCisgICAgICAgICwgbV9kd0lkZW50aXR5KDApDQorICAgICAgICAsIG1fcENoYXJzKE5VTEwpDQorICAgICAgICAsIG1fcFVzZXJEYXRhKE5VTEwpDQorICAgIHsNCisgICAgfQ0KKyAgICB+Q0ZYX1JURlBpZWNlKCkNCisgICAgew0KKyAgICAgICAgUmVzZXQoKTsNCisgICAgfQ0KKyAgICB2b2lkIEFwcGVuZENoYXIoY29uc3QgQ0ZYX1JURkNoYXIgJnRjKQ0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9wQ2hhcnMgIT0gTlVMTCk7DQorICAgICAgICBtX3BDaGFycy0+QWRkKHRjKTsNCisgICAgICAgIGlmIChtX2lXaWR0aCA8IDApIHsNCisgICAgICAgICAgICBtX2lXaWR0aCA9IHRjLm1faUNoYXJXaWR0aDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9pV2lkdGggKz0gdGMubV9pQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9pQ2hhcnMgKys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgR2V0RW5kUG9zKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faVdpZHRoIDwgMCA/IG1faVN0YXJ0UG9zIDogbV9pU3RhcnRQb3MgKyBtX2lXaWR0aDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBHZXRMZW5ndGgoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pQ2hhcnM7DQorICAgIH0NCisgICAgRlhfSU5UMzIgR2V0RW5kQ2hhcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCisgICAgfQ0KKyAgICBDRlhfUlRGQ2hhciYgR2V0Q2hhcihGWF9JTlQzMiBpbmRleCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX2lDaGFycyAmJiBtX3BDaGFycyAhPSBOVUxMKTsNCisgICAgICAgIHJldHVybiAqbV9wQ2hhcnMtPkdldERhdGFQdHIobV9pU3RhcnRDaGFyICsgaW5kZXgpOw0KKyAgICB9DQorICAgIENGWF9SVEZDaGFyKiBHZXRDaGFyUHRyKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzICE9IE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIG1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCisgICAgfQ0KKyAgICB2b2lkIEdldFN0cmluZyAoRlhfTFBXU1RSIHBUZXh0KSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocFRleHQgIT0gTlVMTCk7DQorICAgICAgICBGWF9JTlQzMiBpRW5kQ2hhciA9IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KKyAgICAgICAgQ0ZYX1JURkNoYXIgKnBDaGFyOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkgKyspIHsNCisgICAgICAgICAgICBwQ2hhciA9IG1fcENoYXJzLT5HZXREYXRhUHRyKGkpOw0KKyAgICAgICAgICAgICpwVGV4dCArKyA9IChGWF9XQ0hBUilwQ2hhci0+bV93Q2hhckNvZGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhfTFBXU1RSIHBUZXh0ID0gd3NUZXh0LkdldEJ1ZmZlcihtX2lDaGFycyk7DQorICAgICAgICBHZXRTdHJpbmcocFRleHQpOw0KKyAgICAgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIobV9pQ2hhcnMpOw0KKyAgICB9DQorICAgIHZvaWQgR2V0V2lkdGhzKEZYX0lOVDMyICpwV2lkdGhzKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQocFdpZHRocyAhPSBOVUxMKTsNCisgICAgICAgIEZYX0lOVDMyIGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7DQorICAgICAgICBDRlhfUlRGQ2hhciAqcENoYXI7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBtX2lTdGFydENoYXI7IGkgPCBpRW5kQ2hhcjsgaSArKykgew0KKyAgICAgICAgICAgIHBDaGFyID0gbV9wQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgICAgICAgKnBXaWR0aHMgKysgPSBwQ2hhci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHZvaWQgUmVzZXQoKQ0KKyAgICB7DQorICAgICAgICBtX2R3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgICAgIGlmIChtX2lXaWR0aCA+IC0xKSB7DQorICAgICAgICAgICAgbV9pU3RhcnRQb3MgKz0gbV9pV2lkdGg7DQorICAgICAgICB9DQorICAgICAgICBtX2lXaWR0aCA9IC0xOw0KKyAgICAgICAgbV9pU3RhcnRDaGFyICs9IG1faUNoYXJzOw0KKyAgICAgICAgbV9pQ2hhcnMgPSAwOw0KKyAgICAgICAgbV9pQmlkaUxldmVsID0gMDsNCisgICAgICAgIG1faUJpZGlQb3MgPSAwOw0KKyAgICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlID0gMTAwOw0KKyAgICAgICAgbV9pVmVydGljYWxTY2FsZSA9IDEwMDsNCisgICAgfQ0KKyAgICBGWF9EV09SRAkJCW1fZHdTdGF0dXM7DQorICAgIEZYX0lOVDMyCQkJbV9pU3RhcnRQb3M7DQorICAgIEZYX0lOVDMyCQkJbV9pV2lkdGg7DQorICAgIEZYX0lOVDMyCQkJbV9pU3RhcnRDaGFyOw0KKyAgICBGWF9JTlQzMgkJCW1faUNoYXJzOw0KKyAgICBGWF9JTlQzMgkJCW1faUJpZGlMZXZlbDsNCisgICAgRlhfSU5UMzIJCQltX2lCaWRpUG9zOw0KKyAgICBGWF9JTlQzMgkJCW1faUZvbnRTaXplOw0KKyAgICBGWF9JTlQzMgkJCW1faUZvbnRIZWlnaHQ7DQorICAgIEZYX0lOVDMyCQkJbV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICBGWF9JTlQzMgkJCW1faVZlcnRpY2FsU2NhbGU7DQorICAgIEZYX0RXT1JECQkJbV9kd0xheW91dFN0eWxlczsNCisgICAgRlhfRFdPUkQJCQltX2R3SWRlbnRpdHk7DQorICAgIENGWF9SVEZDaGFyQXJyYXkJKm1fcENoYXJzOw0KKyAgICBJRlhfVW5rbm93bgkJCSptX3BVc2VyRGF0YTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPENGWF9SVEZQaWVjZT4gQ0ZYX1JURlBpZWNlQXJyYXk7DQorY2xhc3MgSUZYX1JURkJyZWFrDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGWF9SVEZCcmVhayoJQ3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVTdGFydCwgRlhfRkxPQVQgZkxpbmVFbmQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcykgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRMYXlvdXRTdHlsZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250KElGWF9Gb250ICpwRm9udCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCUFkZFBvc2l0aW9uZWRUYWIoRlhfRkxPQVQgZlRhYlBvcykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRQb3NpdGlvbmVkVGFicyhjb25zdCBDRlhfRmxvYXRBcnJheSAmdGFicykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhclBvc2l0aW9uZWRUYWJzKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZUJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0SG9yaXpvbnRhbFNjYWxlKEZYX0lOVDMyIGlTY2FsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRWZXJ0aWNhbFNjYWxlKEZYX0lOVDMyIGlTY2FsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyUm90YXRpb24oRlhfSU5UMzIgaUNoYXJSb3RhdGlvbikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRXb3JkU3BhY2UoRlhfQk9PTCBiRGVmYXVsdCwgRlhfRkxPQVQgZldvcmRTcGFjZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0QWxpZ25tZW50KEZYX0lOVDMyIGlBbGlnbm1lbnQgPSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VXNlckRhdGEoSUZYX1Vua25vd24gKnBVc2VyRGF0YSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCQlFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQkJQ291bnRCcmVha1BpZWNlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBDRlhfUlRGUGllY2UqCQkJR2V0QnJlYWtQaWVjZShGWF9JTlQzMiBpbmRleCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQlHZXRMaW5lUmVjdChDRlhfUmVjdEYgJnJlY3QpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQkJQ2xlYXJCcmVha1BpZWNlcygpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVzZXQoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldERpc3BsYXlQb3MoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLCBDRlhfV2lkZVN0cmluZyAqcFdTRm9ybXMgPSBOVUxMLCBGWF9BZGp1c3RDaGFyRGlzcGxheVBvcyBwQWRqdXN0UG9zID0gTlVMTCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRDaGFyUmVjdHMoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwgQ0ZYX1JlY3RGQXJyYXkgJnJ0QXJyYXksIEZYX0JPT0wgYkNoYXJCQm94ID0gRkFMU0UpIGNvbnN0ID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc2F4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxNTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfU0FYXw0KKyNkZWZpbmUgX0ZYX1NBWF8NCitjbGFzcyBJRlhfU0FYUmVhZGVySGFuZGxlcjsNCitjbGFzcyBJRlhfU0FYUmVhZGVyOw0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfYW1wCQkweDAwMDENCisjZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2x0CQkweDAwMDINCisjZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2d0CQkweDAwMDQNCisjZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MJCTB4MDAwOA0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfcXVvdAkJMHgwMDEwDQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9zaGFycAkweDAwMjANCisjZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RTa2lwU3BhY2UJCTB4MDEwMA0KK2VudW0gRlhfU0FYTk9ERSB7DQorICAgIEZYX1NBWE5PREVfVW5rbm93biA9IDAsDQorICAgIEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24sDQorICAgIEZYX1NBWE5PREVfRGVjbGFyYXRpb24sDQorICAgIEZYX1NBWE5PREVfQ29tbWVudCwNCisgICAgRlhfU0FYTk9ERV9UYWcsDQorICAgIEZYX1NBWE5PREVfVGV4dCwNCisgICAgRlhfU0FYTk9ERV9DaGFyRGF0YSwNCit9Ow0KK2NsYXNzIElGWF9TQVhSZWFkZXJIYW5kbGVyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9MUFZPSUQJT25UYWdFbnRlcihGWF9CU1RSIGJzVGFnTmFtZSwgRlhfU0FYTk9ERSBlVHlwZSwgRlhfRFdPUkQgZHdTdGFydFBvcykgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQXR0cmlidXRlKEZYX0xQVk9JRCBwVGFnLCBGWF9CU1RSIGJzQXR0cmksIEZYX0JTVFIgYnNWYWx1ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQnJlYWsoRlhfTFBWT0lEIHBUYWcpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlPblRhZ0RhdGEoRlhfTFBWT0lEIHBUYWcsIEZYX1NBWE5PREUgZVR5cGUsIEZYX0JTVFIgYnNEYXRhLCBGWF9EV09SRCBkd1N0YXJ0UG9zKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJT25UYWdDbG9zZShGWF9MUFZPSUQgcFRhZywgRlhfRFdPUkQgZHdFbmRQb3MpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlPblRhZ0VuZChGWF9MUFZPSUQgcFRhZywgRlhfQlNUUiBic1RhZ05hbWUsIEZYX0RXT1JEIGR3RW5kUG9zKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJT25UYXJnZXREYXRhKEZYX0xQVk9JRCBwVGFnLCBGWF9TQVhOT0RFIGVUeXBlLCBGWF9CU1RSIGJzRGF0YSwgRlhfRFdPUkQgZHdTdGFydFBvcykgPSAwOw0KK307DQorY2xhc3MgSUZYX1NBWFJlYWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglTdGFydFBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0RXT1JEIGR3U3RhcnQgPSAwLCBGWF9EV09SRCBkd0xlbiA9IC0xLCBGWF9EV09SRCBkd1BhcnNlTW9kZSA9IDApID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMglDb250aW51ZVBhcnNlKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNraXBDdXJyZW50Tm9kZSgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRIYW5kbGVyKElGWF9TQVhSZWFkZXJIYW5kbGVyICpwSGFuZGxlcikgPSAwOw0KK307DQorSUZYX1NBWFJlYWRlcioJRlhfU0FYUmVhZGVyX0NyZWF0ZSgpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N0bS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0MjRkYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N0bS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfU1RSRUFNDQorI2RlZmluZSBfRlhfU1RSRUFNDQorY2xhc3MgSUZYX1N0cmVhbTsNCitJRlhfRmlsZVJlYWQqCUZYX0NyZWF0ZUZpbGVSZWFkKElGWF9TdHJlYW0gKnBCYXNlU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gRkFMU0UpOw0KKyNpZmRlZiBGWF9GSUxFU0laRQ0KK0lGWF9GaWxlUmVhZCoJRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9GSUxFU0laRSBpRmlsZVNpemUgPSAtMSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSA9IFRSVUUpOw0KKyNlbHNlDQorSUZYX0ZpbGVSZWFkKglGWF9DcmVhdGVGaWxlUmVhZChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlclJlYWQsIEZYX0lOVDMyIGlGaWxlU2l6ZSA9IC0xLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gVFJVRSk7DQorI2VuZGlmDQorSUZYX0ZpbGVXcml0ZSoJRlhfQ3JlYXRlRmlsZVdyaXRlKElGWF9TdHJlYW0gKnBCYXNlU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gRkFMU0UpOw0KK2VudW0gRlhfU1RSRUFNQUNDRVNTIHsNCisgICAgRlhfU1RSRUFNQUNDRVNTX0JpbmFyeQkJPSAweDAwLA0KKyAgICBGWF9TVFJFQU1BQ0NFU1NfVGV4dAkJPSAweDAxLA0KKyAgICBGWF9TVFJFQU1BQ0NFU1NfUmVhZAkJPSAweDAyLA0KKyAgICBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUJCT0gMHgwNCwNCisgICAgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlCT0gMHgxMCwNCisgICAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZAkJPSAweDIwLA0KKyAgICBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlCQk9IDB4ODAsDQorfTsNCitlbnVtIEZYX1NUUkVBTVNFRUsgew0KKyAgICBGWF9TVFJFQU1TRUVLX0JlZ2luCQkJPSAwICwNCisgICAgRlhfU1RSRUFNU0VFS19DdXJyZW50CQkJLA0KKyAgICBGWF9TVFJFQU1TRUVLX0VuZAkJCQksDQorfTsNCitjbGFzcyBJRlhfU3RyZWFtDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElGWF9TdHJlYW0qCQkJQ3JlYXRlU3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICAgIHN0YXRpYyBJRlhfU3RyZWFtKgkJCUNyZWF0ZVN0cmVhbShJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICAgIHN0YXRpYyBJRlhfU3RyZWFtKgkJCUNyZWF0ZVN0cmVhbShGWF9MUENXU1RSIHBzekZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICAgIHN0YXRpYyBJRlhfU3RyZWFtKgkJCUNyZWF0ZVN0cmVhbShGWF9MUEJZVEUgcERhdGEsIEZYX0lOVDMyIGxlbmd0aCwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgICBzdGF0aWMgSUZYX1N0cmVhbSoJCQlDcmVhdGVTdHJlYW0oSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9EV09SRCBkd0FjY2VzcywgRlhfSU5UMzIgaUZpbGVTaXplID0gLTEsIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkID0gVFJVRSk7DQorICAgIHN0YXRpYyBJRlhfU3RyZWFtKgkJCUNyZWF0ZVRleHRTdHJlYW0oSUZYX1N0cmVhbSAqcEJhc2VTdHJlYW0sIEZYX0JPT0wgYkRlbGV0ZU9uUmVsZWFzZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQkJUmV0YWluKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJR2V0QWNjZXNzTW9kZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRMZW5ndGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFBvc2l0aW9uKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlSZWFkRGF0YShGWF9MUEJZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIEZYX0lOVDMyIGNvbnN0ICpwQnl0ZVNpemUgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlXcml0ZURhdGEoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJV3JpdGVTdHJpbmcoRlhfTFBDV1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlGbHVzaCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldExlbmd0aChGWF9JTlQzMiBpTGVuZ3RoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRCT00oRlhfQllURSBib21bNF0pIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9XT1JECQkJCUdldENvZGVQYWdlKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJU2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCUxvY2soKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlVbmxvY2soKSA9IDA7DQorICAgIHZpcnR1YWwgSUZYX1N0cmVhbSoJCQlDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsIEZYX0lOVDMyIGlPZmZzZXQsIEZYX0lOVDMyIGlMZW5ndGgpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N5cy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiNWM3NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N5cy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfU1lTVEVNDQorI2RlZmluZSBfRlhfU1lTVEVNDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorI2RlZmluZSBGWF9SQUQyREVHKHIpCQkoKHIpICogMTgwLjBmIC8gRlhfUEkpDQorI2RlZmluZSBGWF9ERUcyUkFEKGEpCQkoKGEpICogRlhfUEkgLyAxODAuMGYpDQordHlwZWRlZiBGWF9JTlQ4ICoJCQlGWF9MUElOVDg7DQordHlwZWRlZiBGWF9JTlQ4IGNvbnN0ICoJCUZYX0xQQ0lOVDg7DQordHlwZWRlZiBGWF9JTlQzMiAqCQkJRlhfTFBJTlQzMjsNCit0eXBlZGVmIEZYX0lOVDMyIGNvbnN0ICoJRlhfTFBDSU5UMzI7DQordHlwZWRlZiBsb25nCQkJCUZYX0xPTkc7DQordHlwZWRlZiBGWF9MT05HICoJCQlGWF9MUExPTkc7DQordHlwZWRlZiBGWF9MT05HIGNvbnN0ICoJCUZYX0xQQ0xPTkc7DQordHlwZWRlZiBGWF9GTE9BVCBjb25zdCAqCUZYX0xQQ0ZMT0FUOw0KK3R5cGVkZWYgZG91YmxlCQkJCUZYX0RPVUJMRTsNCit0eXBlZGVmIEZYX0RPVUJMRSAqCQkJRlhfTFBET1VCTEU7DQordHlwZWRlZiBGWF9ET1VCTEUgY29uc3QgKglGWF9MUENET1VCTEU7DQorRlhfRkxPQVQJRlhfdGFuKEZYX0ZMT0FUIGEpOw0KK0ZYX0ZMT0FUCUZYX2xvZyhGWF9GTE9BVCBiLCBGWF9GTE9BVCB4KTsNCitGWF9GTE9BVAlGWF9zdHJ0b2YoRlhfTFBDU1RSIHBjc1N0ciwgRlhfSU5UMzIgaUxlbmd0aCA9IC0xLCBGWF9JTlQzMiAqcFVzZWRMZW4gPSBOVUxMKTsNCitGWF9GTE9BVAlGWF93Y3N0b2YoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGggPSAtMSwgRlhfSU5UMzIgKnBVc2VkTGVuID0gTlVMTCk7DQorRlhfTFBXU1RSCUZYX3djc25jcHkoRlhfTFBXU1RSIGRzdFN0ciwgRlhfTFBDV1NUUiBzcmNTdHIsIHNpemVfdCBjb3VudCk7DQorRlhfSU5UMzIJRlhfd2NzbmljbXAoRlhfTFBDV1NUUiBzMSwgRlhfTFBDV1NUUiBzMiwgc2l6ZV90IGNvdW50KTsNCitGWF9JTlQzMglGWF9zdHJuaWNtcChGWF9MUENTVFIgczEsIEZYX0xQQ1NUUiBzMiwgc2l6ZV90IGNvdW50KTsNCitpbmxpbmUgRlhfQk9PTAlGWF9pc2xvd2VyKEZYX0lOVDMyIGNoKQ0KK3sNCisgICAgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7DQorfQ0KK2lubGluZSBGWF9CT09MCUZYX2lzdXBwZXIoRlhfSU5UMzIgY2gpDQorew0KKyAgICByZXR1cm4gY2ggPj0gJ0EnICYmIGNoIDw9ICdaJzsNCit9DQoraW5saW5lIEZYX0lOVDMyCUZYX3RvbG93ZXIoRlhfSU5UMzIgY2gpDQorew0KKyAgICByZXR1cm4gRlhfaXN1cHBlcihjaCkgPyAoY2ggKyAweDIwKSA6IGNoOw0KK30NCitpbmxpbmUgRlhfSU5UMzIgRlhfdG91cHBlcihGWF9JTlQzMiBjaCkNCit7DQorICAgIHJldHVybiBGWF9pc2xvd2VyKGNoKSA/IChjaCAtIDB4MjApIDogY2g7DQorfQ0KK0ZYX0lOVDMyCUZYX2ZpbGVsZW5ndGgoRlhTWVNfRklMRSAqZmlsZSk7DQorRlhfQk9PTAkJRlhfZnNldHNpemUoRlhTWVNfRklMRSAqZmlsZSwgRlhfSU5UMzIgc2l6ZSk7DQordm9pZAkJRlhfbWVtc2V0KEZYX0xQVk9JRCBwQnVmLCBGWF9JTlQzMiBpVmFsdWUsIHNpemVfdCBzaXplKTsNCit2b2lkCQlGWF9tZW1jcHkoRlhfTFBWT0lEIHBEc3QsIEZYX0xQQ1ZPSUQgcFNyYywgc2l6ZV90IHNpemUpOw0KK0ZYX0JPT0wJCUZYX0lzUmVsYXRpdmVQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NQYXRoKTsNCitGWF9CT09MCQlGWF9Kb2luUGF0aChjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzQmFzZVBhdGgsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZWxhdGl2ZVBhdGgsIENGWF9XaWRlU3RyaW5nICZ3c0Fic29sdXRlUGF0aCk7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1ZFUlNJT04gew0KKyAgICBGWF9EV09SRAlkd01ham9yVmVyc2lvbjsNCisgICAgRlhfRFdPUkQJZHdNaW5vclZlcnNpb247DQorICAgIEZYX0RXT1JECWR3QnVpbGRWZXJzaW9uOw0KK30gRlhfVkVSU0lPTiwgKiBGWF9MUFZFUlNJT047DQordHlwZWRlZiBGWF9WRVJTSU9OIGNvbnN0ICogRlhfTFBDVkVSU0lPTjsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdGJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2NGQxZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oCkBAIC0wLDAgKzEsMjExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1RFWFRCUkVBSw0KKyNkZWZpbmUgX0ZYX1RFWFRCUkVBSw0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIENGWF9DaGFyOw0KK2NsYXNzIElGWF9UeHRBY2Nlc3M7DQorY2xhc3MgQ0ZYX1R4dENoYXI7DQorY2xhc3MgQ0ZYX1R4dFBpZWNlOw0KK2NsYXNzIElGWF9UeHRCcmVhazsNCisjZGVmaW5lIEZYX1RYVEJSRUFLUE9MSUNZX05vbmUJCQkJMHgwMA0KKyNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfUGFnaW5hdGlvbgkJMHgwMQ0KKyNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhawkJMHgwMg0KKyNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWsJCTB4MDQNCisjZGVmaW5lIEZYX1RYVEJSRUFLX05vbmUJCQkJCTB4MDANCisjZGVmaW5lIEZYX1RYVEJSRUFLX1BpZWNlQnJlYWsJCQkJMHgwMQ0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfTGluZUJyZWFrCQkJCTB4MDINCisjZGVmaW5lIEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrCQkJMHgwMw0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGFnZUJyZWFrCQkJCTB4MDQNCisjZGVmaW5lIEZYX1RYVEJSRUFLX0NvbnRyb2xDaGFyCQkJCTB4MTANCisjZGVmaW5lIEZYX1RYVEJSRUFLX0JyZWFrQ2hhcgkJCQkweDIwDQorI2RlZmluZSBGWF9UWFRCUkVBS19Vbmtub3duQ2hhcgkJCQkweDQwDQorI2RlZmluZSBGWF9UWFRCUkVBS19SZW1vdmVDaGFyCQkJCTB4ODANCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX011dGlwbGVGb3JtYXQJCTB4MDAwMQ0KKyNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQJMHgwMDAyDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzCQkweDAwMDQNCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX1JldmVyc2VMaW5lCQkweDAwMDgNCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQJCTB4MDAxMA0KKyNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzCQkweDAwMjANCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcgkweDAwNDANCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0V4cGFuZFRhYgkJCTB4MDEwMA0KKyNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZQkJMHgwMjAwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dAkJCTB4MDQwMA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FsaWdubWVudAkJCTB4MDAwRg0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlcgkJMHgwMDEwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhCQkweDAwMjANCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwJCTB4MDA0MA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlcgkJMHgwMDgwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29udGV4dAkJMHgwMzAwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMJCQkweDA0MDANCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNDb21tYQkJCTB4MDgwMA0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0CQkJCTANCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyCQkJCTENCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQJCQkJMg0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQJCQkoMSA8PCAyKQ0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZAkJCSgyIDw8IDIpDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZExlZnQJCShGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkQ2VudGVyCQkoRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQJCShGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkTGVmdAkJKEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCB8IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkQ2VudGVyCShGWF9UWFRMSU5FQUxJR05NRU5UX0NlbnRlciB8IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkUmlnaHQJKEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9Mb3dlck1hc2sJCQkweDAzDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2sJCQkweDBDDQorI2RlZmluZSBGWF9UWFRCUkVBS19NaW5pbXVtVGFiV2lkdGgJCQkJMTYwMDAwDQorY2xhc3MgSUZYX1R4dEFjY2Vzcw0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfV0NIQVIJR2V0Q2hhcihGWF9MUFZPSUQgcElkZW50aXR5LCBGWF9JTlQzMiBpbmRleCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldFdpZHRoKEZYX0xQVk9JRCBwSWRlbnRpdHksIEZYX0lOVDMyIGluZGV4KSBjb25zdCA9IDA7DQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfVFhUUlVOIHsNCisgICAgX0ZYX1RYVFJVTigpDQorICAgIHsNCisgICAgICAgIHBBY2Nlc3MJCQk9IE5VTEw7DQorICAgICAgICBwSWRlbnRpdHkJCT0gTlVMTDsNCisgICAgICAgIHBTdHIJCQk9IE5VTEw7DQorICAgICAgICBwV2lkdGhzCQkJPSBOVUxMOw0KKyAgICAgICAgaUxlbmd0aAkJCT0gMDsNCisgICAgICAgIHBGb250CQkJPSBOVUxMOw0KKyAgICAgICAgZkZvbnRTaXplCQk9IDEyOw0KKyAgICAgICAgZHdTdHlsZXMJCT0gMDsNCisgICAgICAgIGlIb3Jpem9udGFsU2NhbGUgPSAxMDA7DQorICAgICAgICBpVmVydGljYWxTY2FsZQk9IDEwMDsNCisgICAgICAgIGlDaGFyUm90YXRpb24JPSAwOw0KKyAgICAgICAgZHdDaGFyU3R5bGVzCT0gMDsNCisgICAgICAgIHBSZWN0CQkJPSBOVUxMOw0KKyAgICAgICAgd0xpbmVCcmVha0NoYXIJPSBMJ1xuJzsNCisgICAgICAgIGJTa2lwU3BhY2UJCT0gVFJVRTsNCisgICAgfQ0KKyAgICBJRlhfVHh0QWNjZXNzCSpwQWNjZXNzOw0KKyAgICBGWF9MUFZPSUQJCXBJZGVudGl0eTsNCisgICAgRlhfTFBDV1NUUgkJcFN0cjsNCisgICAgRlhfSU5UMzIJCSpwV2lkdGhzOw0KKyAgICBGWF9JTlQzMgkJaUxlbmd0aDsNCisgICAgSUZYX0ZvbnQJCSpwRm9udDsNCisgICAgRlhfRkxPQVQJCWZGb250U2l6ZTsNCisgICAgRlhfRFdPUkQJCWR3U3R5bGVzOw0KKyAgICBGWF9JTlQzMgkJaUhvcml6b250YWxTY2FsZTsNCisgICAgRlhfSU5UMzIJCWlWZXJ0aWNhbFNjYWxlOw0KKyAgICBGWF9JTlQzMgkJaUNoYXJSb3RhdGlvbjsNCisgICAgRlhfRFdPUkQJCWR3Q2hhclN0eWxlczsNCisgICAgRlhfTFBDUkVDVEYJCXBSZWN0Ow0KKyAgICBGWF9XQ0hBUgkJd0xpbmVCcmVha0NoYXI7DQorICAgIEZYX0JPT0wJCQliU2tpcFNwYWNlOw0KK30gRlhfVFhUUlVOLCAqIEZYX0xQVFhUUlVOOw0KK3R5cGVkZWYgRlhfVFhUUlVOIGNvbnN0ICogRlhfTFBDVFhUUlVOOw0KK2NsYXNzIENGWF9UeHRQaWVjZSA6IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX1R4dFBpZWNlKCkgOiBtX2R3U3RhdHVzKEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspDQorICAgICAgICAsIG1faVN0YXJ0UG9zKDApDQorICAgICAgICAsIG1faVdpZHRoKC0xKQ0KKyAgICAgICAgLCBtX2lTdGFydENoYXIoMCkNCisgICAgICAgICwgbV9pQ2hhcnMoMCkNCisgICAgICAgICwgbV9pQmlkaUxldmVsKDApDQorICAgICAgICAsIG1faUJpZGlQb3MoMCkNCisgICAgICAgICwgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCkNCisgICAgICAgICwgbV9pVmVydGljYWxTY2FsZSgxMDApDQorICAgICAgICAsIG1fZHdDaGFyU3R5bGVzKDApDQorICAgICAgICAsIG1fcENoYXJzKE5VTEwpDQorICAgICAgICAsIG1fcFVzZXJEYXRhKE5VTEwpDQorICAgIHsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBHZXRFbmRQb3MoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pV2lkdGggPCAwID8gbV9pU3RhcnRQb3MgOiBtX2lTdGFydFBvcyArIG1faVdpZHRoOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIEdldExlbmd0aCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lDaGFyczsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBHZXRFbmRDaGFyKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KKyAgICB9DQorICAgIENGWF9UeHRDaGFyKiBHZXRDaGFyUHRyKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzICE9IE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIG1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCisgICAgfQ0KKyAgICB2b2lkIEdldFN0cmluZyhGWF9MUFdTVFIgcFRleHQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwVGV4dCAhPSBOVUxMKTsNCisgICAgICAgIEZYX0lOVDMyIGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7DQorICAgICAgICBDRlhfQ2hhciAqcENoYXI7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBtX2lTdGFydENoYXI7IGkgPCBpRW5kQ2hhcjsgaSArKykgew0KKyAgICAgICAgICAgIHBDaGFyID0gbV9wQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgICAgICAgKnBUZXh0ICsrID0gKEZYX1dDSEFSKXBDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICB2b2lkIEdldFN0cmluZyhDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWF9MUFdTVFIgcFRleHQgPSB3c1RleHQuR2V0QnVmZmVyKG1faUNoYXJzKTsNCisgICAgICAgIEdldFN0cmluZyhwVGV4dCk7DQorICAgICAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihtX2lDaGFycyk7DQorICAgIH0NCisgICAgdm9pZCBHZXRXaWR0aHMoRlhfSU5UMzIgKnBXaWR0aHMpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwV2lkdGhzICE9IE5VTEwpOw0KKyAgICAgICAgRlhfSU5UMzIgaUVuZENoYXIgPSBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCisgICAgICAgIENGWF9DaGFyICpwQ2hhcjsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IG1faVN0YXJ0Q2hhcjsgaSA8IGlFbmRDaGFyOyBpICsrKSB7DQorICAgICAgICAgICAgcENoYXIgPSBtX3BDaGFycy0+R2V0RGF0YVB0cihpKTsNCisgICAgICAgICAgICAqcFdpZHRocyArKyA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfRFdPUkQJCQltX2R3U3RhdHVzOw0KKyAgICBGWF9JTlQzMgkJCW1faVN0YXJ0UG9zOw0KKyAgICBGWF9JTlQzMgkJCW1faVdpZHRoOw0KKyAgICBGWF9JTlQzMgkJCW1faVN0YXJ0Q2hhcjsNCisgICAgRlhfSU5UMzIJCQltX2lDaGFyczsNCisgICAgRlhfSU5UMzIJCQltX2lCaWRpTGV2ZWw7DQorICAgIEZYX0lOVDMyCQkJbV9pQmlkaVBvczsNCisgICAgRlhfSU5UMzIJCQltX2lIb3Jpem9udGFsU2NhbGU7DQorICAgIEZYX0lOVDMyCQkJbV9pVmVydGljYWxTY2FsZTsNCisgICAgRlhfRFdPUkQJCQltX2R3Q2hhclN0eWxlczsNCisgICAgQ0ZYX1R4dENoYXJBcnJheQkqbV9wQ2hhcnM7DQorICAgIEZYX0xQVk9JRAkJCW1fcFVzZXJEYXRhOw0KK307DQordHlwZWRlZiBDRlhfQmFzZUFycmF5VGVtcGxhdGU8Q0ZYX1R4dFBpZWNlPiBDRlhfVHh0UGllY2VBcnJheTsNCitjbGFzcyBJRlhfVHh0QnJlYWsNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSUZYX1R4dEJyZWFrKglDcmVhdGUoRlhfRFdPUkQgZHdQb2xpY2llcyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVdpZHRoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMYXlvdXRTdHlsZXMoRlhfRFdPUkQgZHdMYXlvdXRTdHlsZXMpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udChJRlhfRm9udCAqcEZvbnQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0SG9yaXpvbnRhbFNjYWxlKEZYX0lOVDMyIGlTY2FsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRWZXJ0aWNhbFNjYWxlKEZYX0lOVDMyIGlTY2FsZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyUm90YXRpb24oRlhfSU5UMzIgaUNoYXJSb3RhdGlvbikgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRBbGlnbm1lbnQoRlhfSU5UMzIgaUFsaWdubWVudCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRDb250ZXh0Q2hhclN0eWxlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Q29udGV4dENoYXJTdHlsZXMoRlhfRFdPUkQgZHdDaGFyU3R5bGVzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldENvbWJXaWR0aChGWF9GTE9BVCBmQ29tYldpZHRoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFVzZXJEYXRhKEZYX0xQVk9JRCBwVXNlckRhdGEpID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJCQkJQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJCQkJRW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCUNvdW50QnJlYWtDaGFycygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQkJQ291bnRCcmVha1BpZWNlcygpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBjb25zdCBDRlhfVHh0UGllY2UqCQkJR2V0QnJlYWtQaWVjZShGWF9JTlQzMiBpbmRleCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCQlDbGVhckJyZWFrUGllY2VzKCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZXNldCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0RGlzcGxheVBvcyhGWF9MUENUWFRSVU4gcFR4dFJ1biwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLCBDRlhfV2lkZVN0cmluZyAqcFdTRm9ybXMgPSBOVUxMLCBGWF9BZGp1c3RDaGFyRGlzcGxheVBvcyBwQWRqdXN0UG9zID0gTlVMTCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRDaGFyUmVjdHMoRlhfTFBDVFhUUlVOIHBUeHRSdW4sIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdCA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91Y2QuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3VjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNWM4YWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91Y2QuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZHQVNfVU5JQ09ERV8NCisjZGVmaW5lIF9GR0FTX1VOSUNPREVfDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9MZWZ0CQkweDAxDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9DZW50ZXIJCTB4MDINCisjZGVmaW5lIEZYX0pBUENIQVJQUk9QRVJUWUVYX1JpZ2h0CQkweDAzDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9Ub3AJCTB4MTANCisjZGVmaW5lIEZYX0pBUENIQVJQUk9QRVJUWUVYX01pZGRsZQkJMHgyMA0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfQm90dG9tCQkweDMwDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0pBUENIQVJQUk9QRVJUWUVYIHsNCisgICAgRlhfV0NIQVIJd0NoYXI7DQorICAgIEZYX0JZVEUJCXVBbGlnbjsNCit9IEZYX0pBUENIQVJQUk9QRVJUWUVYLCAqRlhfTFBKQVBDSEFSUFJPUEVSVFlFWDsNCit0eXBlZGVmIEZYX0pBUENIQVJQUk9QRVJUWUVYIGNvbnN0ICogRlhfTFBDSkFQQ0hBUlBST1BFUlRZRVg7DQorRlhfTFBDSkFQQ0hBUlBST1BFUlRZRVggRlhfR2V0SmFwQ2hhclByb3BlcnR5RXgoRlhfV0NIQVIgd2NoKTsNCit0eXBlZGVmIEZYX0JPT0wgKCpGWF9BZGp1c3RDaGFyRGlzcGxheVBvcykoRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJNQkNTQ29kZSwgSUZYX0ZvbnQgKnBGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlZlcnRpY2FsLCBDRlhfUG9pbnRGICZwdE9mZnNldCk7DQorRlhfQk9PTCBGWF9BZGp1c3RKYXBDaGFyRGlzcGxheVBvcyhGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYk1CQ1NDb2RlLCBJRlhfRm9udCAqcEZvbnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiVmVydGljYWwsIENGWF9Qb2ludEYgJnB0T2Zmc2V0KTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3V0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjdiNjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaApAQCAtMCwwICsxLDc5NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9VVElMUw0KKyNkZWZpbmUgX0ZYX1VUSUxTDQorY2xhc3MgQ0ZYX1RocmVhZExvY2s7DQorY2xhc3MgQ0ZYX0Jhc2VBcnJheTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlOw0KK3RlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPiBjbGFzcyBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGU7DQorY2xhc3MgQ0ZYX0Jhc2VNYXNzQXJyYXk7DQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlOw0KK2NsYXNzIENGWF9CYXNlRGlzY3JldGVBcnJheTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTsNCitjbGFzcyBDRlhfQmFzZVN0YWNrOw0KK3RlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPiBjbGFzcyBDRlhfU3RhY2tUZW1wbGF0ZTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU7DQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9DUExUcmVlTm9kZTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0NQTFRyZWU7DQorY2xhc3MgQ0ZYX1RocmVhZExvY2sNCit7DQorcHVibGljOg0KKyAgICBDRlhfVGhyZWFkTG9jaygpOw0KKyAgICB2aXJ0dWFsIH5DRlhfVGhyZWFkTG9jaygpOw0KKyAgICB2b2lkCUxvY2soKTsNCisgICAgdm9pZAlVbmxvY2soKTsNCitwcml2YXRlOg0KKyAgICBGWF9MUFZPSUQJbV9wRGF0YTsNCit9Ow0KK2NsYXNzIENGWF9CYXNlQXJyYXkgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9CYXNlQXJyYXkoRlhfSU5UMzIgaUdyb3dTaXplLCBGWF9JTlQzMiBpQmxvY2tTaXplKTsNCisgICAgfkNGWF9CYXNlQXJyYXkoKTsNCisgICAgRlhfSU5UMzIJR2V0U2l6ZSgpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMglHZXRCbG9ja1NpemUoKSBjb25zdDsNCisgICAgRlhfTFBCWVRFCUFkZFNwYWNlVG8oRlhfSU5UMzIgaW5kZXgpOw0KKyAgICBGWF9MUEJZVEUJR2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICBGWF9MUEJZVEUJR2V0QnVmZmVyKCkgY29uc3Q7DQorICAgIEZYX0lOVDMyCUFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5ICZzcmMsIEZYX0lOVDMyIGlTdGFydCA9IDAsIEZYX0lOVDMyIGlDb3VudCA9IC0xKTsNCisgICAgRlhfSU5UMzIJQ29weShjb25zdCBDRlhfQmFzZUFycmF5ICZzcmMsIEZYX0lOVDMyIGlTdGFydCA9IDAsIEZYX0lOVDMyIGlDb3VudCA9IC0xKTsNCisgICAgRlhfSU5UMzIJUmVtb3ZlTGFzdChGWF9JTlQzMiBpQ291bnQgPSAtMSk7DQorICAgIHZvaWQJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKTsNCisgICAgRlhfTFBWT0lECW1fcERhdGE7DQorfTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQmFzZUFycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VBcnJheQ0KK3sNCitwdWJsaWM6DQorICAgIENGWF9CYXNlQXJyYXlUZW1wbGF0ZShGWF9JTlQzMiBpR3Jvd1NpemUgPSAxMDApIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQorICAgIENGWF9CYXNlQXJyYXlUZW1wbGF0ZShGWF9JTlQzMiBpR3Jvd1NpemUsIEZYX0lOVDMyIGlCbG9ja1NpemUpIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIGlCbG9ja1NpemUpIHt9DQorICAgIEZYX0lOVDMyCUdldFNpemUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyCUdldEJsb2NrU2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfQmFzZUFycmF5OjpHZXRCbG9ja1NpemUoKTsNCisgICAgfQ0KKyAgICBiYXNlVHlwZSoJQWRkU3BhY2UoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKENGWF9CYXNlQXJyYXk6OkdldFNpemUoKSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJQWRkKGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCisgICAgICAgICooYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgICAgICAgIHJldHVybiBpbmRleDsNCisgICAgfQ0KKyAgICBiYXNlVHlwZSoJR2V0QnVmZmVyKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QnVmZmVyKCk7DQorICAgIH0NCisgICAgYmFzZVR5cGUmCUdldEF0KEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIGJhc2VUeXBlKglHZXRQdHJBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIHZvaWQJCVNldEF0KEZYX0lOVDMyIGluZGV4LCBjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCisgICAgew0KKyAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpID0gZWxlbWVudDsNCisgICAgfQ0KKyAgICB2b2lkCQlTZXRBdEdyb3coRlhfSU5UMzIgaW5kZXgsIGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KSA9IGVsZW1lbnQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIJQXBwZW5kKGNvbnN0IENGWF9CYXNlQXJyYXlUZW1wbGF0ZSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkFwcGVuZChzcmMsIGlTdGFydCwgaUNvdW50KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglDb3B5KGNvbnN0IENGWF9CYXNlQXJyYXlUZW1wbGF0ZSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkNvcHkoc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJUmVtb3ZlTGFzdChGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCisgICAgfQ0KKyAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCisgICAgew0KKyAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICAgIH0NCit9Ow0KK3R5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPEZYX0xQVk9JRD4JQ0ZERV9QdHJBcnJheTsNCit0eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4JCUNGREVfRFdvcmRBcnJheTsNCit0eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxGWF9XT1JEPgkJQ0ZERV9Xb3JkQXJyYXk7DQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlQXJyYXkNCit7DQorcHVibGljOg0KKyAgICBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUoRlhfSU5UMzIgaUdyb3dTaXplID0gMTAwKSA6IENGWF9CYXNlQXJyYXkoaUdyb3dTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgICB+Q0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlKCkNCisgICAgew0KKyAgICAgICAgUmVtb3ZlQWxsKEZBTFNFKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglHZXRTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglHZXRCbG9ja1NpemUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJQWRkKGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCisgICAgICAgIGJhc2VUeXBlICpwID0gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCisgICAgICAgIEZYVEFSR0VUX05ldyAoKHZvaWQqKXApYmFzZVR5cGUoZWxlbWVudCk7DQorICAgICAgICByZXR1cm4gaW5kZXg7DQorICAgIH0NCisgICAgYmFzZVR5cGUmCUdldEF0KEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIGJhc2VUeXBlKglHZXRQdHJBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyCUFwcGVuZChjb25zdCBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUgJnNyYywgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgRlhfSU5UMzIgaUNvdW50ID0gLTEpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChHZXRCbG9ja1NpemUoKSA9PSBzcmMuR2V0QmxvY2tTaXplKCkpOw0KKyAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQorICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KKyAgICAgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpU2l6ZSkgew0KKyAgICAgICAgICAgIGlDb3VudCA9IGlTaXplIC0gaVN0YXJ0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIGlTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpU2l6ZSArIGlDb3VudCAtIDEpOw0KKyAgICAgICAgRlhfTFBCWVRFICpwU3RhcnQgPSBDRlhfQmFzZUFycmF5OjpHZXRBdChpU2l6ZSk7DQorICAgICAgICBGWF9JTlQzMiBpQmxvY2tTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7DQorICAgICAgICBpU2l6ZSA9IGlTdGFydCArIGlDb3VudDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpICsrKSB7DQorICAgICAgICAgICAgRlhUQVJHRVRfTmV3V2l0aCAoKHZvaWQqKXBTdGFydCliYXNlVHlwZShzcmMuR2V0QXQoaSkpOw0KKyAgICAgICAgICAgIHBTdGFydCArPSBpQmxvY2tTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGlDb3VudDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglDb3B5KGNvbnN0IENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEdldEJsb2NrU2l6ZSgpID09IHNyYy5HZXRCbG9ja1NpemUoKSk7DQorICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQorICAgICAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgICAgICAgIGlDb3VudCA9IGlTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlTaXplKSB7DQorICAgICAgICAgICAgaUNvdW50ID0gaVNpemUgLSBpU3RhcnQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpQ291bnQgLSAxKTsNCisgICAgICAgIEZYX0xQQllURSAqcFN0YXJ0ID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoMCk7DQorICAgICAgICBGWF9JTlQzMiBpQmxvY2tTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7DQorICAgICAgICBpU2l6ZSA9IGlTdGFydCArIGlDb3VudDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpICsrKSB7DQorICAgICAgICAgICAgRlhUQVJHRVRfTmV3ICgodm9pZCopcFN0YXJ0KWJhc2VUeXBlKHNyYy5HZXRBdChpKSk7DQorICAgICAgICAgICAgcFN0YXJ0ICs9IGlCbG9ja1NpemU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaUNvdW50Ow0KKyAgICB9DQorICAgIEZYX0lOVDMyCVJlbW92ZUxhc3QoRlhfSU5UMzIgaUNvdW50ID0gLTEpDQorICAgIHsNCisgICAgICAgIEZYX0lOVDMyIGlTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICAgICAgaWYgKGlDb3VudCA8IDAgfHwgaUNvdW50ID4gaVNpemUpIHsNCisgICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBpU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IGlTaXplIC0gaUNvdW50OyBpIDwgaVNpemU7IGkgKyspIHsNCisgICAgICAgICAgICAoKGJhc2VUeXBlKilHZXRQdHJBdChpKSktPn5iYXNlVHlwZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCisgICAgfQ0KKyAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7IGkgKyspIHsNCisgICAgICAgICAgICAoKGJhc2VUeXBlKilHZXRQdHJBdChpKSktPn5iYXNlVHlwZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICAgIH0NCit9Ow0KK2NsYXNzIENGWF9CYXNlTWFzc0FycmF5IDogcHVibGljIENGWF9UYXJnZXQNCit7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhfQmFzZU1hc3NBcnJheShGWF9JTlQzMiBpQ2h1bmtTaXplLCBGWF9JTlQzMiBpQmxvY2tTaXplKTsNCisgICAgfkNGWF9CYXNlTWFzc0FycmF5KCk7DQorICAgIEZYX0lOVDMyCUdldFNpemUoKSBjb25zdDsNCisgICAgRlhfTFBCWVRFCUFkZFNwYWNlVG8oRlhfSU5UMzIgaW5kZXgpOw0KKyAgICBGWF9MUEJZVEUJR2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMglBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXkgJnNyYywgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgRlhfSU5UMzIgaUNvdW50ID0gLTEpOw0KKyAgICBGWF9JTlQzMglDb3B5KGNvbnN0IENGWF9CYXNlTWFzc0FycmF5ICZzcmMsIEZYX0lOVDMyIGlTdGFydCA9IDAsIEZYX0lOVDMyIGlDb3VudCA9IC0xKTsNCisgICAgRlhfSU5UMzIJUmVtb3ZlTGFzdChGWF9JTlQzMiBpQ291bnQgPSAtMSk7DQorICAgIHZvaWQJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKTsNCisgICAgRlhfTFBWT0lECW1fcERhdGE7DQorfTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfTWFzc0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VNYXNzQXJyYXkNCit7DQorcHVibGljOg0KKyAgICBDRlhfTWFzc0FycmF5VGVtcGxhdGUoRlhfSU5UMzIgaUNodW5rU2l6ZSA9IDEwMCkgOiBDRlhfQmFzZU1hc3NBcnJheShpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgICBDRlhfTWFzc0FycmF5VGVtcGxhdGUoRlhfSU5UMzIgaUNodW5rU2l6ZSwgRlhfSU5UMzIgaUJsb2NrU2l6ZSkgOiBDRlhfQmFzZU1hc3NBcnJheShpQ2h1bmtTaXplLCBpQmxvY2tTaXplKSB7fQ0KKyAgICBGWF9JTlQzMglHZXRTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgIH0NCisgICAgYmFzZVR5cGUqCUFkZFNwYWNlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJQWRkKGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgICAgICAqKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6QWRkU3BhY2VUbyhpbmRleCkgPSBlbGVtZW50Ow0KKyAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICB9DQorICAgIGJhc2VUeXBlJglHZXRBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQorICAgIH0NCisgICAgYmFzZVR5cGUqCUdldFB0ckF0KEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIHZvaWQJCVNldEF0KEZYX0lOVDMyIGluZGV4LCBjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCisgICAgew0KKyAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldEF0KGluZGV4KSA9IGVsZW1lbnQ7DQorICAgIH0NCisgICAgdm9pZAkJU2V0QXRHcm93KEZYX0lOVDMyIGluZGV4LCBjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCisgICAgew0KKyAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglBcHBlbmQoY29uc3QgQ0ZYX01hc3NBcnJheVRlbXBsYXRlICZzcmMsIEZYX0lOVDMyIGlTdGFydCA9IDAsIEZYX0lOVDMyIGlDb3VudCA9IC0xKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFwcGVuZChzcmMsIGlTdGFydCwgaUNvdW50KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglDb3B5KGNvbnN0IENGWF9NYXNzQXJyYXlUZW1wbGF0ZSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpDb3B5KHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyCVJlbW92ZUxhc3QoRlhfSU5UMzIgaUNvdW50ID0gLTEpDQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlTGFzdChpQ291bnQpOw0KKyAgICB9DQorICAgIHZvaWQJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKQ0KKyAgICB7DQorICAgICAgICBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICAgIH0NCit9Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX0xQVk9JRD4JQ0ZYX1B0ck1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9JTlQzMj4JCUNGWF9JbnQzMk1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4JCUNGWF9EV29yZE1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9XT1JEPgkJQ0ZYX1dvcmRNYXNzQXJyYXk7DQordHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8Q0ZYX1JlY3Q+CQlDRlhfUmVjdE1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxDRlhfUmVjdEY+CUNGWF9SZWN0Rk1hc3NBcnJheTsNCit0ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VNYXNzQXJyYXkNCit7DQorcHVibGljOg0KKyAgICBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGUoRlhfSU5UMzIgaUNodW5rU2l6ZSA9IDEwMCkgOiBDRlhfQmFzZU1hc3NBcnJheShpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgICB+Q0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlKCkNCisgICAgew0KKyAgICAgICAgUmVtb3ZlQWxsKEZBTFNFKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglHZXRTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJQWRkKGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgICAgICBiYXNlVHlwZSAqcCA9IChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpOw0KKyAgICAgICAgRlhUQVJHRVRfTmV3ICgodm9pZCopcCliYXNlVHlwZShlbGVtZW50KTsNCisgICAgICAgIHJldHVybiBpbmRleDsNCisgICAgfQ0KKyAgICBiYXNlVHlwZSYJR2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAqKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIGJhc2VUeXBlKglHZXRQdHJBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldEF0KGluZGV4KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglBcHBlbmQoY29uc3QgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlICZzcmMsIEZYX0lOVDMyIGlTdGFydCA9IDAsIEZYX0lOVDMyIGlDb3VudCA9IC0xKQ0KKyAgICB7DQorICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQorICAgICAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgICAgICAgIGlDb3VudCA9IGlTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCisgICAgICAgIGlmIChpRW5kID4gaVNpemUpIHsNCisgICAgICAgICAgICBpRW5kID0gaVNpemU7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBpU3RhcnQ7IGkgPCBpRW5kOyBpICsrKSB7DQorICAgICAgICAgICAgQWRkKHNyYy5HZXRBdChpKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglDb3B5KGNvbnN0IENGWF9PYmplY3RNYXNzQXJyYXlUZW1wbGF0ZSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQorICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KKyAgICAgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlFbmQgPSBpU3RhcnQgKyBpQ291bnQ7DQorICAgICAgICBpZiAoaUVuZCA+IGlTaXplKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gaVN0YXJ0OyBpIDwgaUVuZDsgaSArKykgew0KKyAgICAgICAgICAgIEFkZChzcmMuR2V0QXQoaSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJUmVtb3ZlTGFzdChGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICAgICAgaWYgKGlDb3VudCA8IDAgfHwgaUNvdW50ID4gaVNpemUpIHsNCisgICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBpU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IGlTaXplIC0gaUNvdW50OyBpIDwgaVNpemU7IGkgKyspIHsNCisgICAgICAgICAgICAoKGJhc2VUeXBlKilHZXRQdHJBdChpKSktPn5iYXNlVHlwZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpSZW1vdmVMYXN0KGlDb3VudCk7DQorICAgIH0NCisgICAgdm9pZAkJUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQorICAgIHsNCisgICAgICAgIEZYX0lOVDMyIGlTaXplID0gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgaSArKykgew0KKyAgICAgICAgICAgICgoYmFzZVR5cGUqKUdldFB0ckF0KGkpKS0+fmJhc2VUeXBlKCk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICAgIH0NCit9Ow0KK2NsYXNzIENGWF9CYXNlRGlzY3JldGVBcnJheSA6IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5KEZYX0lOVDMyIGlDaHVua1NpemUsIEZYX0lOVDMyIGlCbG9ja1NpemUpOw0KKyAgICB+Q0ZYX0Jhc2VEaXNjcmV0ZUFycmF5KCk7DQorICAgIEZYX0xQQllURQlBZGRTcGFjZVRvKEZYX0lOVDMyIGluZGV4KTsNCisgICAgRlhfTFBCWVRFCUdldEF0KEZYX0lOVDMyIGluZGV4KSBjb25zdDsNCisgICAgdm9pZAkJUmVtb3ZlQWxsKCk7DQorICAgIEZYX0xQVk9JRAltX3BEYXRhOw0KK307DQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZURpc2NyZXRlQXJyYXkNCit7DQorcHVibGljOg0KKyAgICBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlKEZYX0lOVDMyIGlDaHVua1NpemUgPSAxMDApIDogQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5KGlDaHVua1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQorICAgIGJhc2VUeXBlJglHZXRBdChGWF9JTlQzMiBpbmRleCwgY29uc3QgYmFzZVR5cGUgJmRlZlZhbHVlKSBjb25zdA0KKyAgICB7DQorICAgICAgICBiYXNlVHlwZSAqcCA9IChiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbmRleCk7DQorICAgICAgICByZXR1cm4gcCA9PSBOVUxMID8gKGJhc2VUeXBlJilkZWZWYWx1ZSA6ICpwOw0KKyAgICB9DQorICAgIGJhc2VUeXBlKglHZXRQdHJBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbmRleCk7DQorICAgIH0NCisgICAgdm9pZAkJU2V0QXRHcm93KEZYX0lOVDMyIGluZGV4LCBjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCisgICAgew0KKyAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KSA9IGVsZW1lbnQ7DQorICAgIH0NCisgICAgdm9pZAkJUmVtb3ZlQWxsKCkNCisgICAgew0KKyAgICAgICAgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpSZW1vdmVBbGwoKTsNCisgICAgfQ0KK307DQordHlwZWRlZiBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlPEZYX0xQVk9JRD4JQ0ZYX1B0ckRpc2NyZXRlQXJyYXk7DQordHlwZWRlZiBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlPEZYX0RXT1JEPgkJQ0ZYX0RXb3JkRGlzY3JldGVBcnJheTsNCit0eXBlZGVmIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGU8RlhfV09SRD4JCUNGWF9Xb3JkRGlzY3JldGVBcnJheTsNCitjbGFzcyBDRlhfQmFzZVN0YWNrIDogcHVibGljIENGWF9UYXJnZXQNCit7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhfQmFzZVN0YWNrKEZYX0lOVDMyIGlDaHVua1NpemUsIEZYX0lOVDMyIGlCbG9ja1NpemUpOw0KKyAgICB+Q0ZYX0Jhc2VTdGFjaygpOw0KKyAgICBGWF9MUEJZVEUJUHVzaCgpOw0KKyAgICB2b2lkCQlQb3AoKTsNCisgICAgRlhfTFBCWVRFCUdldFRvcEVsZW1lbnQoKSBjb25zdDsNCisgICAgRlhfSU5UMzIJR2V0U2l6ZSgpIGNvbnN0Ow0KKyAgICBGWF9MUEJZVEUJR2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQorICAgIEZYX0xQVk9JRAltX3BEYXRhOw0KK307DQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX1N0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjaw0KK3sNCitwdWJsaWM6DQorICAgIENGWF9TdGFja1RlbXBsYXRlKEZYX0lOVDMyIGlDaHVua1NpemUgPSAxMDApIDogQ0ZYX0Jhc2VTdGFjayhpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgICBGWF9JTlQzMglQdXNoKGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCisgICAgICAgICooYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OlB1c2goKSA9IGVsZW1lbnQ7DQorICAgICAgICByZXR1cm4gaW5kZXg7DQorICAgIH0NCisgICAgdm9pZAkJUG9wKCkNCisgICAgew0KKyAgICAgICAgQ0ZYX0Jhc2VTdGFjazo6UG9wKCk7DQorICAgIH0NCisgICAgYmFzZVR5cGUqCUdldFRvcEVsZW1lbnQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJR2V0U2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQorICAgIH0NCisgICAgYmFzZVR5cGUqCUdldEF0KEZYX0lOVDMyIGluZGV4KSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRBdChpbmRleCk7DQorICAgIH0NCisgICAgdm9pZAkJUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQorICAgIHsNCisgICAgICAgIENGWF9CYXNlU3RhY2s6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICB9DQorfTsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX0xQVk9JRD4JQ0ZYX1B0clN0YWNrOw0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8RlhfRFdPUkQ+CUNGWF9EV29yZFN0YWNrOw0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8RlhfV09SRD4JCUNGWF9Xb3JkU3RhY2s7DQordHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxGWF9JTlQzMj4JQ0ZYX0ludDMyU3RhY2s7DQordGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjaw0KK3sNCitwdWJsaWM6DQorICAgIENGWF9PYmplY3RTdGFja1RlbXBsYXRlKEZYX0lOVDMyIGlDaHVua1NpemUgPSAxMDApIDogQ0ZYX0Jhc2VTdGFjayhpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgICB+Q0ZYX09iamVjdFN0YWNrVGVtcGxhdGUoKQ0KKyAgICB7DQorICAgICAgICBSZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglQdXNoKGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCisgICAgICAgIGJhc2VUeXBlICpwID0gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpQdXNoKCk7DQorICAgICAgICBGWFRBUkdFVF9OZXcgKCh2b2lkKilwKWJhc2VUeXBlKGVsZW1lbnQpOw0KKyAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICB9DQorICAgIHZvaWQJCVBvcCgpDQorICAgIHsNCisgICAgICAgIGJhc2VUeXBlICpwID0gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQorICAgICAgICBpZiAocCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcC0+fmJhc2VUeXBlKCk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfQmFzZVN0YWNrOjpQb3AoKTsNCisgICAgfQ0KKyAgICBiYXNlVHlwZSoJR2V0VG9wRWxlbWVudCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldFRvcEVsZW1lbnQoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMglHZXRTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBiYXNlVHlwZSoJR2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldEF0KGluZGV4KTsNCisgICAgfQ0KKyAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7IGkgKyspIHsNCisgICAgICAgICAgICAoKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRBdChpKSktPn5iYXNlVHlwZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0Jhc2VTdGFjazo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIJQ29weShjb25zdCBDRlhfT2JqZWN0U3RhY2tUZW1wbGF0ZSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSkNCisgICAgew0KKyAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQorICAgICAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgICAgICAgIGlDb3VudCA9IGlTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCisgICAgICAgIGlmIChpRW5kID4gaVNpemUpIHsNCisgICAgICAgICAgICBpRW5kID0gaVNpemU7DQorICAgICAgICB9DQorICAgICAgICBSZW1vdmVBbGwoVFJVRSk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBpU3RhcnQ7IGkgPCBpRW5kOyBpICsrKSB7DQorICAgICAgICAgICAgUHVzaCgqc3JjLkdldEF0KGkpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQorICAgIH0NCit9Ow0KK3RlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9DUExUcmVlTm9kZSA6IHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgdHlwZWRlZiBDRlhfQ1BMVHJlZU5vZGU8YmFzZVR5cGU+CUNQTFRyZWVOb2RlOw0KKyAgICBDRlhfQ1BMVHJlZU5vZGUoKSA6IG1fcFBhcmVudE5vZGUoTlVMTCkNCisgICAgICAgICwgbV9wQ2hpbGROb2RlKE5VTEwpDQorICAgICAgICAsIG1fcFByZXZOb2RlKE5VTEwpDQorICAgICAgICAsIG1fcE5leHROb2RlKE5VTEwpDQorICAgICAgICAsIG1fRGF0YSgpDQorICAgIHsNCisgICAgfQ0KKyAgICBlbnVtIFRyZWVOb2RlIHtSb290ID0gMCwgUGFyZW50LCBGaXJzdFNpYmxpbmcsIFByZXZpb3VzU2libGluZywgTmV4dFNpYmxpbmcsIExhc3RTaWJsaW5nLCBGaXJzdE5laWdoYm9yLCBQcmV2aW91c05laWdoYm9yLCBOZXh0TmVpZ2hib3IsIExhc3ROZWlnaGJvciwgRmlyc3RDaGlsZCwgTGFzdENoaWxkfTsNCisgICAgQ1BMVHJlZU5vZGUqIEdldE5vZGUoVHJlZU5vZGUgZU5vZGUpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHN3aXRjaCAoZU5vZGUpIHsNCisgICAgICAgICAgICBjYXNlIFJvb3Q6IHsNCisgICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwUGFyZW50ID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBQYXJlbnQtPm1fcFBhcmVudE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyZW50ID0gcFRlbXA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFBhcmVudDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgUGFyZW50Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wUGFyZW50Tm9kZTsNCisgICAgICAgICAgICBjYXNlIEZpcnN0U2libGluZzogew0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BQcmV2Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGUgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBOb2RlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBQcmV2aW91c1NpYmxpbmc6DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3BQcmV2Tm9kZTsNCisgICAgICAgICAgICBjYXNlIE5leHRTaWJsaW5nOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wTmV4dE5vZGU7DQorICAgICAgICAgICAgY2FzZSBMYXN0U2libGluZzogew0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BOZXh0Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGUgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBOb2RlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGaXJzdE5laWdoYm9yOiB7DQorICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFBhcmVudCA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocFRlbXAgPSBwUGFyZW50LT5tX3BQYXJlbnROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmVudCA9IHBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBQYXJlbnQgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBQYXJlbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIFByZXZpb3VzTmVpZ2hib3I6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BQcmV2Tm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcFBhcmVudE5vZGU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcE5vZGUgPSBtX3BQcmV2Tm9kZTsNCisgICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wQ2hpbGROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBOZXh0TmVpZ2hib3I6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BDaGlsZE5vZGU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9wTmV4dE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BOZXh0Tm9kZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwTm9kZSA9IG1fcFBhcmVudE5vZGU7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTm9kZS0+bV9wTmV4dE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BQYXJlbnROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIExhc3ROZWlnaGJvcjogew0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BQYXJlbnROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wTmV4dE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBOb2RlLT5tX3BDaGlsZE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wQ2hpbGROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlID09IChDUExUcmVlTm9kZSopdGhpcyA/IE5VTEwgOiBwTm9kZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRmlyc3RDaGlsZDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcENoaWxkTm9kZTsNCisgICAgICAgICAgICBjYXNlIExhc3RDaGlsZDogew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcENoaWxkID0gbV9wQ2hpbGROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBDaGlsZC0+bV9wTmV4dE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGQgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHZvaWQgU2V0UGFyZW50Tm9kZShDUExUcmVlTm9kZSAqcE5vZGUpDQorICAgIHsNCisgICAgICAgIG1fcFBhcmVudE5vZGUgPSBwTm9kZTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBDb3VudENoaWxkTm9kZXMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gbV9wQ2hpbGROb2RlOw0KKyAgICAgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgICAgICAgaUNvdW50ICsrOw0KKyAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGlDb3VudDsNCisgICAgfQ0KKyAgICBDUExUcmVlTm9kZSogR2V0Q2hpbGROb2RlKEZYX0lOVDMyIGlJbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgICAgIENQTFRyZWVOb2RlICpwTm9kZSA9IG1fcENoaWxkTm9kZTsNCisgICAgICAgIHdoaWxlIChwTm9kZSkgew0KKyAgICAgICAgICAgIGlmIChpSW5kZXggPT0gaUNvdW50KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUNvdW50ICsrOw0KKyAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgR2V0Tm9kZUluZGV4KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gbV9wUHJldk5vZGU7DQorICAgICAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGluZGV4ICsrOw0KKyAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFByZXZOb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICB9DQorICAgIEZYX0JPT0wgSXNQYXJlbnROb2RlKGNvbnN0IENQTFRyZWVOb2RlICpwTm9kZSkgY29uc3QNCisgICAgew0KKyAgICAgICAgQ1BMVHJlZU5vZGUgKnBQYXJlbnQgPSBtX3BQYXJlbnROb2RlOw0KKyAgICAgICAgd2hpbGUgKHBQYXJlbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChwUGFyZW50ID09IHBOb2RlKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0VHJlZU5vZGUoUGFyZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9CT09MIElzQ2hpbGROb2RlKGNvbnN0IENQTFRyZWVOb2RlICpwTm9kZSkgY29uc3QNCisgICAgew0KKyAgICAgICAgaWYgKHBOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcE5vZGUtPklzUGFyZW50Tm9kZSgoY29uc3QgQ1BMVHJlZU5vZGUqKXRoaXMpOw0KKyAgICB9DQorICAgIHZvaWQgU2V0Q2hpbGROb2RlKENQTFRyZWVOb2RlICpwTm9kZSkNCisgICAgew0KKyAgICAgICAgbV9wQ2hpbGROb2RlID0gcE5vZGU7DQorICAgIH0NCisgICAgdm9pZCBTZXRQcmV2Tm9kZShDUExUcmVlTm9kZSAqcE5vZGUpDQorICAgIHsNCisgICAgICAgIG1fcFByZXZOb2RlID0gcE5vZGU7DQorICAgIH0NCisgICAgdm9pZCBTZXROZXh0Tm9kZShDUExUcmVlTm9kZSAqcE5vZGUpDQorICAgIHsNCisgICAgICAgIG1fcE5leHROb2RlID0gcE5vZGU7DQorICAgIH0NCisgICAgRlhfSU5UMzIgR2V0Tm9kZUxldmVsKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaUxldmVsID0gMDsNCisgICAgICAgIENQTFRyZWVOb2RlICpwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgICAgIHdoaWxlICgocE5vZGUgPSBwTm9kZS0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlMZXZlbCArKzsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBpTGV2ZWw7DQorICAgIH0NCisgICAgRlhfQk9PTCBJc1Jvb3ROb2RlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFBhcmVudE5vZGUgPT0gTlVMTDsNCisgICAgfQ0KKyAgICBiYXNlVHlwZSBHZXREYXRhKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fRGF0YTsNCisgICAgfQ0KKyAgICB2b2lkIFNldERhdGEoYmFzZVR5cGUgZGF0YSkNCisgICAgew0KKyAgICAgICAgbV9EYXRhID0gZGF0YTsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ1BMVHJlZU5vZGUJCSptX3BQYXJlbnROb2RlOw0KKyAgICBDUExUcmVlTm9kZQkJKm1fcENoaWxkTm9kZTsNCisgICAgQ1BMVHJlZU5vZGUJCSptX3BQcmV2Tm9kZTsNCisgICAgQ1BMVHJlZU5vZGUJCSptX3BOZXh0Tm9kZTsNCisgICAgYmFzZVR5cGUJCW1fRGF0YTsNCisgICAgZnJpZW5kIGNsYXNzIENGWF9DUExUcmVlPGJhc2VUeXBlPjsNCit9Ow0KK3RlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9DUExUcmVlIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICB0eXBlZGVmIENGWF9DUExUcmVlTm9kZTxiYXNlVHlwZT4JQ1BMVHJlZU5vZGU7DQorICAgIENGWF9DUExUcmVlKCkgOiBtX1Jvb3QoKQ0KKyAgICB7DQorICAgIH0NCisgICAgfkNGWF9DUExUcmVlKCkNCisgICAgew0KKyAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gbV9Sb290LkdldE5vZGUoQ1BMVHJlZU5vZGU6Okxhc3ROZWlnaGJvcik7DQorICAgICAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChwTm9kZS0+SXNSb290Tm9kZSgpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXAgPSBwTm9kZS0+R2V0Tm9kZShDUExUcmVlTm9kZTo6UHJldmlvdXNOZWlnaGJvcik7DQorICAgICAgICAgICAgZGVsZXRlIHBOb2RlOw0KKyAgICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ1BMVHJlZU5vZGUqIEdldFJvb3QoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gJm1fUm9vdDsNCisgICAgfQ0KKyAgICBDUExUcmVlTm9kZSogQWRkQ2hpbGQoYmFzZVR5cGUgZGF0YSwgQ1BMVHJlZU5vZGUgKnBQYXJlbnQgPSBOVUxMKQ0KKyAgICB7DQorICAgICAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcFBhcmVudCA9ICZtX1Jvb3Q7DQorICAgICAgICB9DQorICAgICAgICBDUExUcmVlTm9kZSAqcENoaWxkID0gRlhUQVJHRVRfTmV3IENQTFRyZWVOb2RlOw0KKyAgICAgICAgcENoaWxkLT5TZXRQYXJlbnROb2RlKHBQYXJlbnQpOw0KKyAgICAgICAgcENoaWxkLT5TZXREYXRhKGRhdGEpOw0KKyAgICAgICAgaWYgKHBQYXJlbnQtPm1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcFBhcmVudC0+bV9wQ2hpbGROb2RlID0gcENoaWxkOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDUExUcmVlTm9kZSAqcExhc3QgPSBwUGFyZW50LT5HZXROb2RlKENQTFRyZWVOb2RlOjpMYXN0Q2hpbGQpOw0KKyAgICAgICAgICAgIHBDaGlsZC0+U2V0UHJldk5vZGUocExhc3QpOw0KKyAgICAgICAgICAgIHBMYXN0LT5TZXROZXh0Tm9kZShwQ2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBDaGlsZDsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ1BMVHJlZU5vZGUJCW1fUm9vdDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUwLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTAuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1MS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1MS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUxLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTIuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1Mi5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUzLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTMuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1NC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU0LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTUuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1NS5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU2LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTYuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1Ny5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1Ny5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU3LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTguY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1OC5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U4NzQuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTg3NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U4NzQuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTMyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5MzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTMyLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTkzNi5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTM2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTkzNi5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5NDkuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTk0OS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5NDkuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTUwLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5NTAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTUwLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTAuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1MC5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUxLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTEuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1Mi5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUyLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTMuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1My5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU0LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTQuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1NS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1NS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU1LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTYuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1Ni5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU3LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTcuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1OC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1OC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU4LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTg3NC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpODc0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTg3NC5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5MzIuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTkzMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5MzIuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTM2LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5MzYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTM2LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk0OS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTQ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk0OS5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5NTAuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk1MC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5NTAuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUwLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTEuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MS5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTIuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1My5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1My5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUzLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTQuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1NC5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU1LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTUuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ni5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ni5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU2LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTcuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ny5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU4LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTguY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjODc0LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM4NzQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjODc0LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzMi5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzMi5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5MzYuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5MzYuY3BwCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTQ5LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5NDkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDI1MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTQ5LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1Yzk1MC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTUwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyNTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1Yzk1MC5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2FsZ29yaXRobS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9hbGdvcml0aG0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDc3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9hbGdvcml0aG0uY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCitjb25zdCBzdGF0aWMgRlhfQ0hBUiBnX0ZYQmFzZTY0RW5jb2Rlck1hcFs2NF0gPSB7DQorICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLA0KKyAgICAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywNCisgICAgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsDQorICAgICdZJywgJ1onLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLA0KKyAgICAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywNCisgICAgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsDQorICAgICd3JywgJ3gnLCAneScsICd6JywgJzAnLCAnMScsICcyJywgJzMnLA0KKyAgICAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJywNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GWF9CQVNFNjREQVRBIHsNCisNCisgICAgRlhfRFdPUkQJZGF0YTEgOiAyOw0KKyAgICBGWF9EV09SRAlkYXRhMiA6IDY7DQorICAgIEZYX0RXT1JECWRhdGEzIDogNDsNCisgICAgRlhfRFdPUkQJZGF0YTQgOiA0Ow0KKyAgICBGWF9EV09SRAlkYXRhNSA6IDY7DQorICAgIEZYX0RXT1JECWRhdGE2IDogMjsNCisgICAgRlhfRFdPUkQJZGF0YTcgOiA4Ow0KK30gRlhfQkFTRTY0REFUQSwgKiBGWF9MUEJBU0U2NEVOQ09ERURBVEE7DQordHlwZWRlZiBGWF9CQVNFNjREQVRBIGNvbnN0ICogRlhfTFBDQkFTRTY0REFUQTsNCitzdGF0aWMgdm9pZCBGWF9CYXNlNjRFbmNvZGVQaWVjZShjb25zdCBGWF9CQVNFNjREQVRBICZzcmMsIEZYX0lOVDMyIGlCeXRlcywgRlhfQ0hBUiBkc3RbNF0pDQorew0KKyAgICBkc3RbMF0gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtzcmMuZGF0YTJdOw0KKyAgICBGWF9EV09SRCBiID0gc3JjLmRhdGExIDw8IDQ7DQorICAgIGlmIChpQnl0ZXMgPiAxKSB7DQorICAgICAgICBiIHw9IHNyYy5kYXRhNDsNCisgICAgfQ0KKyAgICBkc3RbMV0gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtiXTsNCisgICAgaWYgKGlCeXRlcyA+IDEpIHsNCisgICAgICAgIGIgPSBzcmMuZGF0YTMgPDwgMjsNCisgICAgICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgICAgICAgYiB8PSBzcmMuZGF0YTY7DQorICAgICAgICB9DQorICAgICAgICBkc3RbMl0gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtiXTsNCisgICAgICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgICAgICAgZHN0WzNdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGE1XTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZHN0WzNdID0gJz0nOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHN0WzJdID0gZHN0WzNdID0gJz0nOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIEZYX0Jhc2U2NEVuY29kZUEoRlhfTFBDQllURSBwU3JjLCBGWF9JTlQzMiBpU3JjTGVuLCBGWF9MUFNUUiBwRHN0KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQorICAgIGlmIChpU3JjTGVuIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKHBEc3QgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfSU5UMzIgaURzdExlbiA9IGlTcmNMZW4gLyAzICogNDsNCisgICAgICAgIGlmICgoaVNyY0xlbiAlIDMpICE9IDApIHsNCisgICAgICAgICAgICBpRHN0TGVuICs9IDQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaURzdExlbjsNCisgICAgfQ0KKyAgICBGWF9CQVNFNjREQVRBIHNyY0RhdGE7DQorICAgIEZYX0lOVDMyIGlCeXRlcyA9IDM7DQorICAgIEZYX0xQU1RSIHBEc3RFbmQgPSBwRHN0Ow0KKyAgICB3aGlsZSAoaVNyY0xlbiA+IDApIHsNCisgICAgICAgIGlmIChpU3JjTGVuID4gMikgew0KKyAgICAgICAgICAgICgoRlhfTFBCWVRFKSZzcmNEYXRhKVswXSA9ICpwU3JjICsrOw0KKyAgICAgICAgICAgICgoRlhfTFBCWVRFKSZzcmNEYXRhKVsxXSA9ICpwU3JjICsrOw0KKyAgICAgICAgICAgICgoRlhfTFBCWVRFKSZzcmNEYXRhKVsyXSA9ICpwU3JjICsrOw0KKyAgICAgICAgICAgIGlTcmNMZW4gLT0gMzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgKigoRlhfTFBEV09SRCkmc3JjRGF0YSkgPSAwOw0KKyAgICAgICAgICAgICgoRlhfTFBCWVRFKSZzcmNEYXRhKVswXSA9ICpwU3JjICsrOw0KKyAgICAgICAgICAgIGlmIChpU3JjTGVuID4gMSkgew0KKyAgICAgICAgICAgICAgICAoKEZYX0xQQllURSkmc3JjRGF0YSlbMV0gPSAqcFNyYyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUJ5dGVzID0gaVNyY0xlbjsNCisgICAgICAgICAgICBpU3JjTGVuID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0Jhc2U2NEVuY29kZVBpZWNlKHNyY0RhdGEsIGlCeXRlcywgcERzdEVuZCk7DQorICAgICAgICBwRHN0RW5kICs9IDQ7DQorICAgIH0NCisgICAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0Ow0KK30NCitjb25zdCBzdGF0aWMgRlhfQllURSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsyNTZdID0gew0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweDNGLA0KKyAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDNCLA0KKyAgICAweDNDLCAweDNELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LA0KKyAgICAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLA0KKyAgICAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LA0KKyAgICAweDE3LCAweDE4LCAweDE5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGLCAweDIwLA0KKyAgICAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LA0KKyAgICAweDI5LCAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLCAweDMwLA0KKyAgICAweDMxLCAweDMyLCAweDMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KK307DQorc3RhdGljIHZvaWQgRlhfQmFzZTY0RGVjb2RlUGllY2UoY29uc3QgRlhfQ0hBUiBzcmNbNF0sIEZYX0lOVDMyIGlDaGFycywgRlhfQkFTRTY0REFUQSAmZHN0LCBGWF9JTlQzMiAmaUJ5dGVzKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlDaGFycyA+IDAgJiYgaUNoYXJzIDwgNSk7DQorICAgIGlCeXRlcyA9IDE7DQorICAgIGRzdC5kYXRhMiA9IGdfRlhCYXNlNjREZWNvZGVyTWFwWyhGWF9CWVRFKXNyY1swXV07DQorICAgIGlmIChpQ2hhcnMgPiAxKSB7DQorICAgICAgICBGWF9CWVRFIGIgPSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsoRlhfQllURSlzcmNbMV1dOw0KKyAgICAgICAgZHN0LmRhdGExID0gYiA+PiA0Ow0KKyAgICAgICAgZHN0LmRhdGE0ID0gYjsNCisgICAgICAgIGlmIChpQ2hhcnMgPiAyKSB7DQorICAgICAgICAgICAgaUJ5dGVzID0gMjsNCisgICAgICAgICAgICBiID0gZ19GWEJhc2U2NERlY29kZXJNYXBbKEZYX0JZVEUpc3JjWzJdXTsNCisgICAgICAgICAgICBkc3QuZGF0YTMgPSBiID4+IDI7DQorICAgICAgICAgICAgZHN0LmRhdGE2ID0gYjsNCisgICAgICAgICAgICBpZiAoaUNoYXJzID4gMykgew0KKyAgICAgICAgICAgICAgICBpQnl0ZXMgPSAzOw0KKyAgICAgICAgICAgICAgICBkc3QuZGF0YTUgPSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsoRlhfQllURSlzcmNbM11dOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRzdC5kYXRhNSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkc3QuZGF0YTMgPSAwOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHN0LmRhdGExID0gMDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBGWF9CYXNlNjREZWNvZGVBKEZYX0xQQ1NUUiBwU3JjLCBGWF9JTlQzMiBpU3JjTGVuLCBGWF9MUEJZVEUgcERzdCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwpOw0KKyAgICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHdoaWxlIChpU3JjTGVuID4gMCAmJiBwU3JjW2lTcmNMZW4gLSAxXSA9PSAnPScpIHsNCisgICAgICAgIGlTcmNMZW4gLS07DQorICAgIH0NCisgICAgaWYgKGlTcmNMZW4gPCAxKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAocERzdCA9PSBOVUxMKSB7DQorICAgICAgICBGWF9JTlQzMiBpRHN0TGVuID0gaVNyY0xlbiAvIDQgKiAzOw0KKyAgICAgICAgaVNyY0xlbiAlPSA0Ow0KKyAgICAgICAgaWYgKGlTcmNMZW4gPT0gMSkgew0KKyAgICAgICAgICAgIGlEc3RMZW4gKz0gMTsNCisgICAgICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7DQorICAgICAgICAgICAgaURzdExlbiArPSAxOw0KKyAgICAgICAgfSBlbHNlIGlmIChpU3JjTGVuID09IDMpIHsNCisgICAgICAgICAgICBpRHN0TGVuICs9IDI7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaURzdExlbjsNCisgICAgfQ0KKyAgICBGWF9DSEFSIHNyY0RhdGFbNF07DQorICAgIEZYX0JBU0U2NERBVEEgZHN0RGF0YTsNCisgICAgRlhfSU5UMzIgaUNoYXJzID0gNCwgaUJ5dGVzOw0KKyAgICBGWF9MUEJZVEUgcERzdEVuZCA9IHBEc3Q7DQorICAgIHdoaWxlIChpU3JjTGVuID4gMCkgew0KKyAgICAgICAgaWYgKGlTcmNMZW4gPiAzKSB7DQorICAgICAgICAgICAgKigoRlhfRFdPUkQqKXNyY0RhdGEpID0gKigoRlhfRFdPUkQqKXBTcmMpOw0KKyAgICAgICAgICAgIHBTcmMgKz0gNDsNCisgICAgICAgICAgICBpU3JjTGVuIC09IDQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICooKEZYX0xQRFdPUkQpJmRzdERhdGEpID0gMDsNCisgICAgICAgICAgICAqKChGWF9EV09SRCopc3JjRGF0YSkgPSAwOw0KKyAgICAgICAgICAgIHNyY0RhdGFbMF0gPSAqcFNyYyArKzsNCisgICAgICAgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsNCisgICAgICAgICAgICAgICAgc3JjRGF0YVsxXSA9ICpwU3JjICsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaVNyY0xlbiA+IDIpIHsNCisgICAgICAgICAgICAgICAgc3JjRGF0YVsyXSA9ICpwU3JjICsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpQ2hhcnMgPSBpU3JjTGVuOw0KKyAgICAgICAgICAgIGlTcmNMZW4gPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQmFzZTY0RGVjb2RlUGllY2Uoc3JjRGF0YSwgaUNoYXJzLCBkc3REYXRhLCBpQnl0ZXMpOw0KKyAgICAgICAgKnBEc3RFbmQgKysgPSAoKEZYX0xQQllURSkmZHN0RGF0YSlbMF07DQorICAgICAgICBpZiAoaUJ5dGVzID4gMSkgew0KKyAgICAgICAgICAgICpwRHN0RW5kICsrID0gKChGWF9MUEJZVEUpJmRzdERhdGEpWzFdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlCeXRlcyA+IDIpIHsNCisgICAgICAgICAgICAqcERzdEVuZCArKyA9ICgoRlhfTFBCWVRFKSZkc3REYXRhKVsyXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7DQorfQ0KK0ZYX0lOVDMyIEZYX0Jhc2U2NERlY29kZVcoRlhfTFBDV1NUUiBwU3JjLCBGWF9JTlQzMiBpU3JjTGVuLCBGWF9MUEJZVEUgcERzdCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwpOw0KKyAgICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHdoaWxlIChpU3JjTGVuID4gMCAmJiBwU3JjW2lTcmNMZW4gLSAxXSA9PSAnPScpIHsNCisgICAgICAgIGlTcmNMZW4gLS07DQorICAgIH0NCisgICAgaWYgKGlTcmNMZW4gPCAxKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAocERzdCA9PSBOVUxMKSB7DQorICAgICAgICBGWF9JTlQzMiBpRHN0TGVuID0gaVNyY0xlbiAvIDQgKiAzOw0KKyAgICAgICAgaVNyY0xlbiAlPSA0Ow0KKyAgICAgICAgaWYgKGlTcmNMZW4gPT0gMSkgew0KKyAgICAgICAgICAgIGlEc3RMZW4gKz0gMTsNCisgICAgICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7DQorICAgICAgICAgICAgaURzdExlbiArPSAxOw0KKyAgICAgICAgfSBlbHNlIGlmIChpU3JjTGVuID09IDMpIHsNCisgICAgICAgICAgICBpRHN0TGVuICs9IDI7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaURzdExlbjsNCisgICAgfQ0KKyAgICBGWF9DSEFSIHNyY0RhdGFbNF07DQorICAgIEZYX0JBU0U2NERBVEEgZHN0RGF0YTsNCisgICAgRlhfSU5UMzIgaUNoYXJzID0gNCwgaUJ5dGVzOw0KKyAgICBGWF9MUEJZVEUgcERzdEVuZCA9IHBEc3Q7DQorICAgIHdoaWxlIChpU3JjTGVuID4gMCkgew0KKyAgICAgICAgaWYgKGlTcmNMZW4gPiAzKSB7DQorICAgICAgICAgICAgc3JjRGF0YVswXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgc3JjRGF0YVsxXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgc3JjRGF0YVsyXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgc3JjRGF0YVszXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgaVNyY0xlbiAtPSA0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAqKChGWF9MUERXT1JEKSZkc3REYXRhKSA9IDA7DQorICAgICAgICAgICAgKigoRlhfRFdPUkQqKXNyY0RhdGEpID0gMDsNCisgICAgICAgICAgICBzcmNEYXRhWzBdID0gKEZYX0NIQVIpICogcFNyYyArKzsNCisgICAgICAgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsNCisgICAgICAgICAgICAgICAgc3JjRGF0YVsxXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChpU3JjTGVuID4gMikgew0KKyAgICAgICAgICAgICAgICBzcmNEYXRhWzJdID0gKEZYX0NIQVIpICogcFNyYyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUNoYXJzID0gaVNyY0xlbjsNCisgICAgICAgICAgICBpU3JjTGVuID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0Jhc2U2NERlY29kZVBpZWNlKHNyY0RhdGEsIGlDaGFycywgZHN0RGF0YSwgaUJ5dGVzKTsNCisgICAgICAgICpwRHN0RW5kICsrID0gKChGWF9MUEJZVEUpJmRzdERhdGEpWzBdOw0KKyAgICAgICAgaWYgKGlCeXRlcyA+IDEpIHsNCisgICAgICAgICAgICAqcERzdEVuZCArKyA9ICgoRlhfTFBCWVRFKSZkc3REYXRhKVsxXTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgICAgICAgKnBEc3RFbmQgKysgPSAoKEZYX0xQQllURSkmZHN0RGF0YSlbMl07DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0Ow0KK30NCitjb25zdCBzdGF0aWMgRlhfQllURSBnX0ZYSGV4MkRlY01hcFsyNTZdID0gew0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkxLAkyLAkzLAk0LAk1LAk2LAk3LAk4LAk5LAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkxMCwJMTEsCTEyLAkxMywJMTQsCTE1LAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkxMCwJMTEsCTEyLAkxMywJMTQsCTE1LAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KKyAgICAwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLA0KK307DQorRlhfQllURSBGWF9IZXgyRGVjKEZYX0JZVEUgaGV4SGlnaCwgRlhfQllURSBoZXhMb3cpDQorew0KKyAgICByZXR1cm4gKGdfRlhIZXgyRGVjTWFwW2hleEhpZ2hdIDw8IDQpICsgZ19GWEhleDJEZWNNYXBbaGV4TG93XTsNCit9DQorRlhfSU5UMzIgRlhfU2VwYXJhdGVTdHJpbmdXKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaVN0ckxlbiwgRlhfV0NIQVIgZGVsaW1pdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZwaWVjZXMpDQorew0KKyAgICBpZiAocFN0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAoaVN0ckxlbiA8IDApIHsNCisgICAgICAgIGlTdHJMZW4gPSBGWFNZU193Y3NsZW4ocFN0cik7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUiBwVG9rZW4gPSBwU3RyOw0KKyAgICBGWF9MUENXU1RSIHBFbmQgPSBwU3RyICsgaVN0ckxlbjsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGlmIChwU3RyID49IHBFbmQgfHwgZGVsaW1pdGVyID09ICpwU3RyKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3ViKHBUb2tlbiwgcFN0ciAtIHBUb2tlbik7DQorICAgICAgICAgICAgcGllY2VzLkFkZChzdWIpOw0KKyAgICAgICAgICAgIHBUb2tlbiA9IHBTdHIgKyAxOw0KKyAgICAgICAgICAgIGlmIChwU3RyID49IHBFbmQpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcFN0ciArKzsNCisgICAgfQ0KKyAgICByZXR1cm4gcGllY2VzLkdldFNpemUoKTsNCit9DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jb2RlcGFnZS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jb2RlcGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZWRjOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NvZGVwYWdlLmNwcApAQCAtMCwwICsxLDM3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X2NvZGVwYWdlLmgiDQorc3RhdGljIGNvbnN0IEZYX0NIQVJTRVRfTUFQIGdfRlhDaGFyc2V0MkNvZGVQYWdlVGFibGVbXSA9IHsNCisgICAgeyAwLAkxMjUyICB9LA0KKyAgICB7IDEsCTAJICB9LA0KKyAgICB7IDIsCTQyCSAgfSwNCisgICAgeyA3NywJMTAwMDAgfSwNCisgICAgeyA3OCwJMTAwMDEgfSwNCisgICAgeyA3OSwJMTAwMDMgfSwNCisgICAgeyA4MCwJMTAwMDggfSwNCisgICAgeyA4MSwJMTAwMDIgfSwNCisgICAgeyA4MywJMTAwMDUgfSwNCisgICAgeyA4NCwJMTAwMDQgfSwNCisgICAgeyA4NSwJMTAwMDYgfSwNCisgICAgeyA4NiwJMTAwODEgfSwNCisgICAgeyA4NywJMTAwMjEgfSwNCisgICAgeyA4OCwJMTAwMjkgfSwNCisgICAgeyA4OSwJMTAwMDcgfSwNCisgICAgeyAxMjgsCTkzMgl9LA0KKyAgICB7IDEyOSwJOTQ5CX0sDQorICAgIHsgMTMwLAkxMzYxIH0sDQorICAgIHsgMTM0LAk5MzYJfSwNCisgICAgeyAxMzYsCTk1MAl9LA0KKyAgICB7IDE2MSwJMTI1MyB9LA0KKyAgICB7IDE2MiwJMTI1NCB9LA0KKyAgICB7IDE2MywJMTI1OCB9LA0KKyAgICB7IDE3NywJMTI1NSB9LA0KKyAgICB7IDE3OCwJMTI1NiB9LA0KKyAgICB7IDE4NiwJMTI1NyB9LA0KKyAgICB7IDIwNCwJMTI1MSB9LA0KKyAgICB7IDIyMiwJODc0CX0sDQorICAgIHsgMjM4LAkxMjUwIH0sDQorICAgIHsgMjU0LAk0MzcJfSwNCisgICAgeyAyNTUsCTg1MAl9LA0KK307DQorRlhfV09SRCBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KEZYX0JZVEUgY2hhcnNldCkNCit7DQorICAgIEZYX0lOVDMyIGlFbmQgPSBzaXplb2YoZ19GWENoYXJzZXQyQ29kZVBhZ2VUYWJsZSkgLyBzaXplb2YoRlhfQ0hBUlNFVF9NQVApIC0gMTsNCisgICAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlNaWQ7DQorICAgIGRvIHsNCisgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgY29uc3QgRlhfQ0hBUlNFVF9NQVAgJiBjcCA9IGdfRlhDaGFyc2V0MkNvZGVQYWdlVGFibGVbaU1pZF07DQorICAgICAgICBpZiAoY2hhcnNldCA9PSBjcC5jaGFyc2V0KSB7DQorICAgICAgICAgICAgcmV0dXJuIGNwLmNvZGVwYWdlOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaGFyc2V0IDwgY3AuY2hhcnNldCkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIDB4RkZGRjsNCit9DQorc3RhdGljIGNvbnN0IEZYX0NIQVJTRVRfTUFQIGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGVbXSA9IHsNCisgICAgeyAxLAkwCSAgfSwNCisgICAgeyAyLAk0MgkgIH0sDQorICAgIHsgMjU0LAk0MzcJfSwNCisgICAgeyAyNTUsCTg1MAl9LA0KKyAgICB7IDIyMiwJODc0CX0sDQorICAgIHsgMTI4LAk5MzIJfSwNCisgICAgeyAxMzQsCTkzNgl9LA0KKyAgICB7IDEyOSwJOTQ5CX0sDQorICAgIHsgMTM2LAk5NTAJfSwNCisgICAgeyAyMzgsCTEyNTAgfSwNCisgICAgeyAyMDQsCTEyNTEgfSwNCisgICAgeyAwLAkxMjUyICB9LA0KKyAgICB7IDE2MSwJMTI1MyB9LA0KKyAgICB7IDE2MiwJMTI1NCB9LA0KKyAgICB7IDE3NywJMTI1NSB9LA0KKyAgICB7IDE3OCwJMTI1NiB9LA0KKyAgICB7IDE4NiwJMTI1NyB9LA0KKyAgICB7IDE2MywJMTI1OCB9LA0KKyAgICB7IDEzMCwJMTM2MSB9LA0KKyAgICB7IDc3LAkxMDAwMCB9LA0KKyAgICB7IDc4LAkxMDAwMSB9LA0KKyAgICB7IDc5LAkxMDAwMyB9LA0KKyAgICB7IDgwLAkxMDAwOCB9LA0KKyAgICB7IDgxLAkxMDAwMiB9LA0KKyAgICB7IDgzLAkxMDAwNSB9LA0KKyAgICB7IDg0LAkxMDAwNCB9LA0KKyAgICB7IDg1LAkxMDAwNiB9LA0KKyAgICB7IDg2LAkxMDA4MSB9LA0KKyAgICB7IDg3LAkxMDAyMSB9LA0KKyAgICB7IDg4LAkxMDAyOSB9LA0KKyAgICB7IDg5LAkxMDAwNyB9LA0KK307DQorRlhfV09SRCBGWF9HZXRDaGFyc2V0RnJvbUNvZGVQYWdlKEZYX1dPUkQgY29kZXBhZ2UpDQorew0KKyAgICBGWF9JTlQzMiBpRW5kID0gc2l6ZW9mKGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGUpIC8gc2l6ZW9mKEZYX0NIQVJTRVRfTUFQKSAtIDE7DQorICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgICBkbyB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGNvbnN0IEZYX0NIQVJTRVRfTUFQICYgY3AgPSBnX0ZYQ29kZXBhZ2UyQ2hhcnNldFRhYmxlW2lNaWRdOw0KKyAgICAgICAgaWYgKGNvZGVwYWdlID09IGNwLmNvZGVwYWdlKSB7DQorICAgICAgICAgICAgcmV0dXJuIGNwLmNoYXJzZXQ7DQorICAgICAgICB9IGVsc2UgaWYgKGNvZGVwYWdlIDwgY3AuY29kZXBhZ2UpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiAweEZGRkY7DQorfQ0KK2NvbnN0IEZYX0xBTkcyQ1BNQVAgZ19GWExhbmcyQ29kZXBhZ2VUYWJsZVtdID0gew0KKyAgICB7RlhfTEFOR19BcmFiaWNfU2F1ZGlBcmFiaWEgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19CdWxnYXJpYW5fQnVsZ2FyaWEgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19DYXRhbGFuX0NhdGFsYW4gICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19DaGluZXNlX1RhaXdhbiAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9DaGluZXNlVHJhZGl0aW9uYWwgICB9LA0KKyAgICB7RlhfTEFOR19DemVjaFJlcHVibGljICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19EYW5pc2hfRGVubWFyayAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19HZXJtYW5fR2VybWFueSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19HcmVla19HcmVlY2UgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9HcmVlayAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX1VuaXRlZFN0YXRlcyAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX1RyYWRpdGlvbmFsU29ydCAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GcmVuY2hfRnJhbmNlICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19IZWJyZXdfSXNyYWVsICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9IZWJyZXcgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeSAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19JY2VsYW5kaWNfSWNlbGFuZCAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19JdGFsaWFuX0l0YWx5ICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19KYXBhbmVzZV9KYXBhbiAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9TaGlmdEpJUyAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19Lb3JlYW5fS29yZWEgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9Lb3JlYW4gICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19EdXRjaF9OZXRoZXJsYW5kcyAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Ob3J3ZWdpYW5fQm9rbWFsICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Qb2xpc2hfUG9sYW5kICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Qb3J0dWd1ZXNlX0JyYXppbCAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Sb21hbmlhbl9Sb21hbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19SdXNzaWFuX1J1c3NpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19Dcm9hdGlhbl9Dcm9hdGlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TbG92YWtfU2xvdmFraWEgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19BbGJhbmlhbl9BbGJhbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Td2VkaXNoX1N3ZWRlbiAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19UaGFpX1RoYWlsYW5kICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU0RPU19UaGFpICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19UdXJraXNoX1R1cmtleSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19VcmR1X1Bha2lzdGFuICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19JbmRvbmVzaWFuX0luZG9uZXNpYSAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Va3JhaW5pYW5fVWtyYWluZSAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19CZWxhcnVzaWFuX0JlbGFydXMgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19TbG92ZW5pYW5fU2xvdmVuaWEgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Fc3Rvbmlhbl9Fc3RvbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19MYXR2aWFuX0xhdHZpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19MaXRodWFuaWFuX0xpdGh1YW5pYSAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19QZXJzaWFuICAgICAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19WaWV0bmFtZXNlX1ZpZXRuYW0gICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9WaWV0bmFtZXNlICAgICB9LA0KKyAgICB7RlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19BemVyYmFpamFuX0xhdGluICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19CYXNxdWVfQmFzcXVlICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19NYWNlZG9uaWFuICAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19BZnJpa2FhbnNfU291dGhBZnJpY2EgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19HZW9yZ2lhbl9HZW9yZ2lhICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19GYXJvZXNlX0Zhcm9lSXNsYW5kcyAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19IaW5kaV9JbmRpYSAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19NYWxheV9NYWxheXNpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbiAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19LeXJneXpfS3lyZ3l6c3RhbiAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19LaXN3YWhpbGlfS2VueWEgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19VemJla19MYXRpblV6YmVraXN0YW4gICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19UYXRhcl9SdXNzaWEgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KKyAgICB7RlhfTEFOR19QdW5qYWJpX0luZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19HdWphcmF0aV9JbmRpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19UYW1pbF9JbmRpYSAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19UZWx1Z3VfSW5kaWEgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19LYW5uYWRhX0luZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19NYXJhdGhpX0luZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19TYW5za3JpdEluZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KKyAgICB7RlhfTEFOR19Nb25nb2xpYW5fQ3lyaWxsaWNNb25nb2xpYSwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCisgICAge0ZYX0xBTkdfR2FsaWNpYW5fR2FsaWNpYW4gICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfS29ua2FuaV9JbmRpYSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfRGVmQU5TSSAgICAgICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfU3lyaWFjX1N5cmlhICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfRGVmQU5TSSAgICAgICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRGl2ZWhpX01hbGRpdmVzICAgICAgICAgICwJRlhfQ09ERVBBR0VfRGVmQU5TSSAgICAgICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0lyYXEgICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQ2hpbmVzZV9QUkMgICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQgICAgfSwNCisgICAge0ZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9Vbml0ZWRLaW5nZG9tICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9NZXhpY28gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX0JlbGdpdW0gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfSXRhbGlhbl9Td2l0emVybGFuZCAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRHV0Y2hfQmVsZ2l1bSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfTm9yd2VnaWFuX055bm9yc2sgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfUG9ydHVndWVzZV9Qb3J0dWdhbCAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU2VyYmlhbkxhdGluX1NlcmJpYSAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3dlZGlzaF9GaW5sYW5kICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXplcmJhaWphbl9DeXJpbGxpYyAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCisgICAge0ZYX0xBTkdfTWFsYXlfQnJ1bmVpRGFydXNzYWxhbSAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfVXpiZWtfQ3lyaWxsaWNVemJla2lzdGFuICwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0VneXB0ICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZyAgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsICAgfSwNCisgICAge0ZYX0xBTkdfR2VybWFuX0F1c3RyaWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9JbnRlcm5hdGlvbmFsU29ydCwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX0NhbmFkYSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX1NlcmJpYSAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0xpYnlhICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQ2hpbmVzZV9TaW5nYXBvcmUgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQgICAgfSwNCisgICAge0ZYX0xBTkdfR2VybWFuX0x1eGVtYm91cmcgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9DYW5hZGEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX1N3aXR6ZXJsYW5kICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0FsZ2VyaWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfQ2hpbmVzZV9NYWNhbyAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsICAgfSwNCisgICAge0ZYX0xBTkdfR2VybWFuX0xpZWNodGVuc3RlaW4gICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9OZXdaZWFsYW5kICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Db3N0YVJpY2EgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX0x1eGVtYm91cmcgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX01vcm9jY28gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9JcmVsYW5kICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QYW5hbWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX01vbmFjbyAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1R1bmlzaWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9Tb3V0aEFmcmljYSAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Eb21pbmljYW5SZXB1YmxpYywJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX09tYW4gICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9KYW1haWNhICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1llbWVuICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9DYXJpYmJlYW4gICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Db2xvbWJpYSAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1N5cmlhICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9CZWxpemUgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QZXJ1ICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0pvcmRhbiAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9UcmluaWRhZFRvYmFnbyAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9BcmdlbnRpbmEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0xlYmFub24gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9aaW1iYWJ3ZSAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9FY3VhZG9yICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0t1d2FpdCAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9QaGlsaXBwaW5lcyAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9DaGlsZSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1VBRSAgICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9VcnVndWF5ICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0JhaHJhaW4gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QYXJhZ3VheSAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1FhdGFyICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Cb2xpdmlhICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9FbFNhbHZhZG9yICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Ib25kdXJhcyAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9OaWNhcmFndWEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QdWVydG9SaWNvICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCit9Ow0KK0ZYX1dPUkQgRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlKQ0KK3sNCisgICAgRlhfSU5UMzIgaUVuZCA9IHNpemVvZihnX0ZYTGFuZzJDb2RlcGFnZVRhYmxlKSAvIHNpemVvZihGWF9MQU5HMkNQTUFQKSAtIDE7DQorICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgICBkbyB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGNvbnN0IEZYX0xBTkcyQ1BNQVAgJmNwID0gZ19GWExhbmcyQ29kZXBhZ2VUYWJsZVtpTWlkXTsNCisgICAgICAgIGlmICh3TGFuZ3VhZ2UgPT0gY3Aud0xhbmd1YWdlKSB7DQorICAgICAgICAgICAgcmV0dXJuIGNwLndDb2RlcGFnZTsNCisgICAgICAgIH0gZWxzZSBpZiAod0xhbmd1YWdlIDwgY3Aud0xhbmd1YWdlKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gMHhGRkZGOw0KK30NCitzdGF0aWMgY29uc3QgRlhfU1RSMkNQSEFTSCBnX0ZYQ1BIYXNoVGFibGVbXSA9IHsNCisgICAgeyAweGQ0NSwJMHg2ZmFmIH0sCQl7IDB4ZDQ2LAkweDZmYjAgfSwJCXsgMHhkNDcsCTB4NmZiMSB9LAkJeyAweGQ0OCwJMHg2ZmIyIH0sDQorICAgIHsgMHhkNDksCTB4NGU2IH0sCQl7IDB4ZDRkLAkweDZmYmQgfSwJCXsgMHhlOWUsCTB4NGU0IH0sCQl7IDB4Yzk5OCwJMHgxYjUgfSwNCisgICAgeyAweDE4ZWYwLAkweDNhOCB9LAkJeyAweDE5Zjg1LAkweDUxODIgfSwJCXsgMHgyZTIzMzUsCTB4M2I2IH0sCQl7IDB4MzI1MTUzLAkweDUxODIgfSwNCisgICAgeyAweDE0NWJkZWQsCTB4MjcxNiB9LAl7IDB4M2M5YTVmMiwJMHhjNmYzIH0sCXsgMHg0YzQ1ZjJkLAkweDNhNCB9LAl7IDB4NGM0NWY0ZSwJMHhjNDMxIH0sDQorICAgIHsgMHg1OGNhZjUxLAkweDRlNCB9LAl7IDB4NWE1Y2Q3ZCwJMHgzYTggfSwJeyAweDVhNmM2YTcsCTB4NGU0IH0sCXsgMHg1YTZjYTBiLAkweDFiNSB9LA0KKyAgICB7IDB4NWE2Y2Q2OCwJMHgzMDcgfSwJeyAweDVhNmQ4ZDMsCTB4NGU0IH0sCXsgMHg1YTZkOTQ4LAkweDM1NCB9LAl7IDB4NWE2ZDk2YiwJMHgzNjIgfSwNCisgICAgeyAweDVhNmQ5ODQsCTB4MzY2IH0sCXsgMHg1YTkwZTM1LAkweDFiNSB9LAl7IDB4NWUwY2YwMCwJMHg2ZmI1IH0sCXsgMHg2MDljMzI0LAkweDU1MSB9LA0KKyAgICB7IDB4NjE3ZDk3ZiwJMHg1MTgyIH0sCXsgMHg2YTZmZDkxLAkweGZkZTggfSwJeyAweDZhNmZkOTIsCTB4ZmRlOSB9LAl7IDB4NmIxMDJkZSwJMHhjYWRjIH0sDQorICAgIHsgMHg2YjEwZjQ4LAkweDRlODkgfSwJeyAweDEwMjA4MDVmLAkweDRlNCB9LAl7IDB4MTBmMDUyNGMsCTB4NmZiNSB9LAl7IDB4MTFkNTU4ZmUsCTB4NmZiMCB9LA0KKyAgICB7IDB4MTM4OThkMTksCTB4YzQyZCB9LAl7IDB4MTM4OThkM2EsCTB4YzQzMSB9LAl7IDB4MTM4YTMxOWUsCTB4NmZiMSB9LAl7IDB4MTQ2NzljMDksCTB4OTZjNiB9LA0KKyAgICB7IDB4MTUzZjBhM2QsCTB4NmZiMiB9LAl7IDB4MTU3NmVlYjMsCTB4NGUyMCB9LAl7IDB4MTY5YTBjZTYsCTB4YzZmOSB9LAl7IDB4MTZmM2UyZGMsCTB4NmZiMyB9LA0KKyAgICB7IDB4MThhOGJiN2EsCTB4NmZiNCB9LAl7IDB4MWE1ZDk0MTksCTB4NmZiNSB9LAl7IDB4MWE4NDdiNDgsCTB4M2E4IH0sCXsgMHgxYjc2MjQxOSwJMHhjZWM4IH0sDQorICAgIHsgMHgxYjlkNzg0NywJMHg0NzUgfSwJeyAweDFjMTI2Y2I5LAkweDZmYjYgfSwJeyAweDFjY2RiYzdkLAkweDRmNDIgfSwJeyAweDFkMzMwZjVmLAkweDI3MTQgfSwNCisgICAgeyAweDFkYzc0NTU5LAkweDRlNiB9LAl7IDB4MWVkZDgwZGEsCTB4NGU0IH0sCXsgMHgyM2U0YjAzZCwJMHhmZGU4IH0sCXsgMHgyNGYyOGExNiwJMHg0ZjNkIH0sDQorICAgIHsgMHgyODZlN2EzMiwJMHgyNzE1IH0sCXsgMHgyYzdjMThlZCwJMHgzYTggfSwJeyAweDJlMjEwM2I3LAkweDI3MTMgfSwJeyAweDMwNGJmNDc5LAkweDZmYjQgfSwNCisgICAgeyAweDMwNGJmNDdkLAkweDZmYjUgfSwJeyAweDMwOWJiODY5LAkweGZkZTggfSwJeyAweDMwOWJiODZhLAkweGZkZTkgfSwJeyAweDMzNjY0MzU3LAkweDNiNiB9LA0KKyAgICB7IDB4MzUyZDZiNDksCTB4M2E0IH0sCXsgMHgzNmY1NjYxYywJMHgxYjUgfSwJeyAweDM5MmU4ZjQ4LAkweGNhZGMgfSwJeyAweDNkYzdjNjRjLAkweDQ3YyB9LA0KKyAgICB7IDB4M2VkMmU4ZTEsCTB4NGU0IH0sCXsgMHgzZjBjMmZlYSwJMHhjYWVkIH0sCXsgMHgzZjBmZWY4ZiwJMHhjNmYyIH0sCXsgMHgzZjVlMTMwZiwJMHg1MTgyIH0sDQorICAgIHsgMHg0NzE3NGQxZiwJMHgzYTggfSwJeyAweDQ5Njg2YjdiLAkweDZmYjQgfSwJeyAweDRiODBiMGQ5LAkweDNhNCB9LAl7IDB4NGRjZGE5N2EsCTB4NGU0IH0sDQorICAgIHsgMHg0ZGNkYTliNiwJMHg0ZTQgfSwJeyAweDRlODgxZTZhLAkweDUyMjEgfSwJeyAweDRmZmRmNWExLAkweDM2YSB9LAl7IDB4NGZmZGY1YTUsCTB4NmZiZCB9LA0KKyAgICB7IDB4NTI0MWNlMTYsCTB4NGU4YiB9LAl7IDB4NTQ2YmFiOWQsCTB4NGU0IH0sCXsgMHg1NGEzZDY0ZSwJMHg2ZmI2IH0sCXsgMHg1NjIxNzliZCwJMHg1MTYxIH0sDQorICAgIHsgMHg1N2MxZGYxNSwJMHhjNmY3IH0sCXsgMHg2MWZmNmU2MiwJMHg0ZjM2IH0sCXsgMHg2MzU5YzdkOCwJMHg0ZjM1IH0sCXsgMHg2M2YzYzMzNSwJMHgzYTggfSwNCisgICAgeyAweDY0NWEwZjc4LAkweDQ3NyB9LAl7IDB4NjkxYWMyZmQsCTB4Mjc1ZiB9LAl7IDB4NmRjMmVhYjAsCTB4MmQwIH0sCXsgMHg2ZGMyZWVlZiwJMHgzNWUgfSwNCisgICAgeyAweDZkYzJlZjEwLAkweDM2YSB9LAl7IDB4NzEwMzEzOGEsCTB4NDdkIH0sCXsgMHg3MTBkZmJkMCwJMHhjNmY1IH0sCXsgMHg3MzE5ZjZjYiwJMHgzNmEgfSwNCisgICAgeyAweDc0NTA5NmFkLAkweDNhOCB9LAl7IDB4NzQ4NjYyMjksCTB4NGU4YyB9LAl7IDB4NzcxODVmYTUsCTB4M2E4IH0sCXsgMHg3OTUzZjAwMiwJMHg2ZmFmIH0sDQorICAgIHsgMHg3OTUzZjAwMywJMHg2ZmIwIH0sCXsgMHg3OTUzZjAwNCwJMHg2ZmIxIH0sCXsgMHg3OTUzZjAwNSwJMHg2ZmIyIH0sCXsgMHg3OTUzZjAwNiwJMHg2ZmI3IH0sDQorICAgIHsgMHg3OTUzZjAwYSwJMHg2ZmJkIH0sCXsgMHg3YzU3NzU3MSwJMHgyNzYxIH0sCXsgMHg3ZThjOGZmMSwJMHg0NzkgfSwJeyAweDgwMzFmNDdmLAkweDNiNSB9LA0KKyAgICB7IDB4ODAzMWY0ODEsCTB4M2I1IH0sCXsgMHg4MGM0YTcxMCwJMHg1MTg3IH0sCXsgMHg4NTdjN2UxNCwJMHhmZGU4IH0sCXsgMHg4NTdjN2UxNSwJMHhmZGU5IH0sDQorICAgIHsgMHg4NmI1OWM5MCwJMHg0ZTQgfSwJeyAweDg2YjU5YzkxLAkweDZmYjAgfSwJeyAweDg2YjU5YzkyLAkweDZmYjEgfSwJeyAweDg2YjU5YzkzLAkweDZmYjIgfSwNCisgICAgeyAweDg2YjU5Yzk0LAkweDZmYjMgfSwJeyAweDg2YjU5Yzk1LAkweDZmYjQgfSwJeyAweDg2YjU5Yzk2LAkweDZmYjUgfSwJeyAweDg2YjU5Yzk3LAkweDRlNyB9LA0KKyAgICB7IDB4ODZiNTljOTgsCTB4NGU2IH0sCXsgMHg4YjRiMjRlYywJMHg1MTkwIH0sCXsgMHg4ZmFjZTM2MiwJMHg0ZTQgfSwJeyAweDhmZjllYzJhLAkweGZkZTkgfSwNCisgICAgeyAweDkxOWQzOTg5LAkweGNhZGMgfSwJeyAweDk5NjdlNWFkLAkweDRlMjIgfSwJeyAweDk5ZjhiOTMzLAkweDZmYmQgfSwJeyAweDliZDJhMzgwLAkweDRmYzcgfSwNCisgICAgeyAweDliZWZhZDIzLAkweDRmMzggfSwJeyAweDljN2FjNjQ5LAkweDRmM2MgfSwJeyAweGEwMjQ2OGRiLAkweGRlYWUgfSwJeyAweGEwMjQ2OGVjLAkweGRlYWIgfSwNCisgICAgeyAweGEwMjQ2OTJhLAkweGRlYWEgfSwJeyAweGEwMjQ2OTk3LAkweGRlYjIgfSwJeyAweGEwMjQ2OWZmLAkweGRlYjAgfSwJeyAweGEwMjQ2YTNkLAkweGRlYjEgfSwNCisgICAgeyAweGEwMjQ2YThjLAkweGRlYWYgfSwJeyAweGEwMjQ2YTlhLAkweGRlYjMgfSwJeyAweGEwMjQ2YjE2LAkweGRlYWMgfSwJeyAweGEwMjQ2YjFhLAkweGRlYWQgfSwNCisgICAgeyAweGEwNzFhZGRjLAkweDRiMSB9LAl7IDB4YTM4YjYyZGMsCTB4NDc0IH0sCXsgMHhhNGMwOWZlZCwJMHgzYTggfSwJeyAweGE1MWU4NmU1LAkweDRlNyB9LA0KKyAgICB7IDB4YTY3YWIxM2UsCTB4M2E0IH0sCXsgMHhhNzQxNDI0NCwJMHg1MWE5IH0sCXsgMHhhOWRkYmVhZCwJMHhjNmZiIH0sCXsgMHhhYjI0ZmZhYiwJMHg0ZThhIH0sDQorICAgIHsgMHhhYmVmOGFjNCwJMHgyNzEwIH0sCXsgMHhhYmZhMjBhYywJMHg2ZmI0IH0sCXsgMHhhZDM2ODk1ZSwJMHg0ZTIgfSwJeyAweGFkMzY4OTVmLAkweDRlMyB9LA0KKyAgICB7IDB4YWYzMTBlOTAsCTB4NDAyIH0sCXsgMHhhZjMxMTY2ZiwJMHg0ZTggfSwJeyAweGFmNzI3N2E1LAkweDNiNiB9LAl7IDB4YWZjMGQ4YjMsCTB4OTZjNiB9LA0KKyAgICB7IDB4YjBmZDVkYmEsCTB4Y2FlMCB9LAl7IDB4YjBmZDVlOTUsCTB4Y2FkYyB9LAl7IDB4YjEwNTI4OTMsCTB4NzE0OSB9LAl7IDB4YjFlOTg3NDUsCTB4MzZhIH0sDQorICAgIHsgMHhiMjc3ZTkxYywJMHg1MTY2IH0sCXsgMHhiMmY3ZWFjNSwJMHhjYWUwIH0sCXsgMHhiMmY3ZWJhMCwJMHhjYWRjIH0sCXsgMHhiMmY3ZWJjMSwJMHgzYjUgfSwNCisgICAgeyAweGI1M2ZhNzdkLAkweDNhOCB9LAl7IDB4YjYzOTExMzgsCTB4NmZiNSB9LAl7IDB4YjczNThiN2YsCTB4NmZiNiB9LAl7IDB4YjhjNDJiNDAsCTB4NGU0IH0sDQorICAgIHsgMHhiOGM0MmVhNCwJMHgxYjUgfSwJeyAweGI4YzQzOWU3LAkweDJlMSB9LAl7IDB4YjhjNDNhNjEsCTB4MzA3IH0sCXsgMHhiOGM0M2Q2YywJMHg0ZTQgfSwNCisgICAgeyAweGI4YzQzZGRmLAkweDM1MiB9LAl7IDB4YjhjNDNkZTEsCTB4MzU0IH0sCXsgMHhiOGM0M2RlNiwJMHgzNTkgfSwJeyAweGI4YzQzZGZmLAkweDM1ZCB9LA0KKyAgICB7IDB4YjhjNDNlMDQsCTB4MzYyIH0sCXsgMHhiOGM0M2UwNywJMHgzNjUgfSwJeyAweGJjZDI5YTdmLAkweDNhOCB9LAl7IDB4YmNlMzRlNzgsCTB4NTE4MiB9LA0KKyAgICB7IDB4YmNlMzRlN2IsCTB4NTU2YSB9LAl7IDB4YmNlODE1MDQsCTB4M2I1IH0sCXsgMHhiZDhhNGM5NSwJMHgyNzJkIH0sCXsgMHhiZGQ4OWRhZCwJMHg0ZTQgfSwNCisgICAgeyAweGJkZDg5ZGFlLAkweDZmYjAgfSwJeyAweGJkZDg5ZGFmLAkweDZmYjEgfSwJeyAweGJkZDg5ZGIwLAkweDZmYjIgfSwJeyAweGJkZDg5ZGIxLAkweDRlNiB9LA0KKyAgICB7IDB4YmRkODlkYjUsCTB4NmZiZCB9LAl7IDB4YzE3NTZlOWYsCTB4MzZiIH0sCXsgMHhjNzQ4MjQ0NCwJMHg0N2EgfSwJeyAweGM5MjgxYzE4LAkweDRlNCB9LA0KKyAgICB7IDB4YzllZjk1ZGYsCTB4NDdiIH0sCXsgMHhjY2M5ZGIwZCwJMHg0ZTQgfSwJeyAweGNjYzlkYjBlLAkweDZmYjAgfSwJeyAweGNkNzM0MjVmLAkweDNiNiB9LA0KKyAgICB7IDB4Y2UzOGI0MGIsCTB4NGIwIH0sCXsgMHhjZTk5ZTU0OSwJMHgyNSB9LAkJeyAweGNmNTk4NzQwLAkweDRlNyB9LAl7IDB4Y2Y2ZDZmNzgsCTB4NGU0IH0sDQorICAgIHsgMHhjZjc1OGRmNiwJMHgzYTQgfSwJeyAweGQxMjY2ZTUxLAkweDZmYjUgfSwJeyAweGQyOTEwMjEzLAkweDI3MTggfSwJeyAweGQyOTE5NmJiLAkweDI3MTIgfSwNCisgICAgeyAweGQzZWIyZmMyLAkweDQ3NiB9LAl7IDB4ZDQ0MmRjMmMsCTB4NGZjNCB9LAl7IDB4ZDlkYTRkYTQsCTB4MjcxMSB9LAl7IDB4ZGJhZDJmNDIsCTB4NGU0IH0sDQorICAgIHsgMHhkYmFkMmY0MywJMHg2ZmIwIH0sCXsgMHhkYmFkMmY0NCwJMHg2ZmIxIH0sCXsgMHhkYmFkMmY0NSwJMHg2ZmIyIH0sCXsgMHhkYmFkMmY0NiwJMHg2ZmIzIH0sDQorICAgIHsgMHhkYmFkMmY0NywJMHg2ZmI0IH0sCXsgMHhkYmFkMmY0OCwJMHg2ZmI1IH0sCXsgMHhkYmFkMmY0OSwJMHg2ZmI2IH0sCXsgMHhkYmFkMmY0YSwJMHg0ZTYgfSwNCisgICAgeyAweGRjNDM4MDMzLAkweDRmMzEgfSwJeyAweGRjY2I0MzliLAkweDQ3NyB9LAl7IDB4ZGNjZGM2MjYsCTB4M2I1IH0sCXsgMHhkZDgwYTU5NSwJMHg0ZTQgfSwNCisgICAgeyAweGRkODBhNTk2LAkweDZmYjAgfSwJeyAweGRkODBhNTllLAkweDZmYjEgfSwJeyAweGRkODBhNWI0LAkweDZmYjIgfSwJeyAweGRkODBhNWQ5LAkweDZmYjUgfSwNCisgICAgeyAweGRkODBhNWRhLAkweDZmYjQgfSwJeyAweGRkODBhNWZhLAkweDZmYjYgfSwJeyAweGRkODBhNjE1LAkweDZmYjMgfSwJeyAweGRkODBhNjE5LAkweDRlNiB9LA0KKyAgICB7IDB4ZGQ4MGE2MWEsCTB4M2I1IH0sCXsgMHhkZDgwYzBmOCwJMHg0ZTlmIH0sCXsgMHhkZjdlNDZmZiwJMHg0ZmM4IH0sCXsgMHhkZjg2ODBmZCwJMHg1NTZhIH0sDQorICAgIHsgMHhkZmIwYmQ2ZSwJMHhjNDJkIH0sCXsgMHhkZmYwNTQ4NiwJMHgyYzQgfSwJeyAweGUzMzIzMzk5LAkweDNhNCB9LAl7IDB4ZTYwNDEyZGQsCTB4M2I1IH0sDQorICAgIHsgMHhlZWU0N2FkZCwJMHg0YjAgfSwJeyAweGYwMjFhMTg2LAkweDRlMiB9LAl7IDB4ZjAyMWExODcsCTB4NGUzIH0sCXsgMHhmMDIxYTE4OCwJMHg0ZTQgfSwNCisgICAgeyAweGYwMjFhMTg5LAkweDRlNSB9LAl7IDB4ZjAyMWExOGEsCTB4NGU2IH0sCXsgMHhmMDIxYTE4YiwJMHg0ZTcgfSwJeyAweGYwMjFhMThjLAkweDRlOCB9LA0KKyAgICB7IDB4ZjAyMWExOGQsCTB4NGU5IH0sCXsgMHhmMDIxYTE4ZSwJMHg0ZWEgfSwJeyAweGYwNzAwNDU2LAkweDZmYjMgfSwJeyAweGYyNzRmMTc1LAkweDNiNSB9LA0KKyAgICB7IDB4ZjJhOTczMGIsCTB4M2E4IH0sCXsgMHhmM2Q0NjNjMiwJMHgzYTQgfSwJeyAweGY1MmE3MGEzLAkweGM0MmUgfSwJeyAweGY1NjkzMTQ3LAkweDZmYjMgfSwNCisgICAgeyAweGY2MzdlMTU3LAkweDQ3OCB9LAl7IDB4ZmMyMTNmM2EsCTB4MjcxNyB9LAl7IDB4ZmY2NTRkMTQsCTB4M2I1IH0sDQorfTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRnJvbVN0cmluZ0EoRlhfTFBDU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsNCisgICAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgICAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIHJldHVybiAweEZGRkY7DQorICAgIH0NCisgICAgRlhfVUlOVDMyIHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEocFN0ciwgaUxlbmd0aCwgVFJVRSk7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlNaWQ7DQorICAgIEZYX0lOVDMyIGlFbmQgPSBzaXplb2YoZ19GWENQSGFzaFRhYmxlKSAvIHNpemVvZihGWF9TVFIyQ1BIQVNIKSAtIDE7DQorICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgICBkbyB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGNvbnN0IEZYX1NUUjJDUEhBU0ggJiBjcCA9IGdfRlhDUEhhc2hUYWJsZVtpTWlkXTsNCisgICAgICAgIGlmICh1SGFzaCA9PSBjcC51SGFzaCkgew0KKyAgICAgICAgICAgIHJldHVybiAoRlhfV09SRCljcC51Q29kZVBhZ2U7DQorICAgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwgY3AudUhhc2gpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiAweEZGRkY7DQorfQ0KK0ZYX1dPUkQgRlhfR2V0Q29kZVBhZ2VGb3JtU3RyaW5nVyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBpZiAoaUxlbmd0aCA8IDApIHsNCisgICAgICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFN0cik7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDB4RkZGRjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBjc1N0cjsNCisgICAgRlhfTFBTVFIgcEJ1ZiA9IGNzU3RyLkdldEJ1ZmZlcihpTGVuZ3RoICsgMSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuZ3RoOyArK2kpIHsNCisgICAgICAgICpwQnVmICsrID0gKEZYX0NIQVIpICogcFN0ciArKzsNCisgICAgfQ0KKyAgICBjc1N0ci5SZWxlYXNlQnVmZmVyKGlMZW5ndGgpOw0KKyAgICByZXR1cm4gRlhfR2V0Q29kZVBhZ2VGcm9tU3RyaW5nQShjc1N0ciwgaUxlbmd0aCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NvZGVwYWdlLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jb2RlcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWY0NjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jb2RlcGFnZS5oCkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9DT0RFUEFHRV9JTVANCisjZGVmaW5lIF9GWF9DT0RFUEFHRV9JTVANCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jcG1nci5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jcG1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiMmFhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NwbWdyLmNwcApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfY29kZXBhZ2UuaCINCisjaWZkZWYgX0ZYQ1ANCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiDQorew0KKyNlbmRpZg0KK2V4dGVybiBjb25zdCBGWF9DT0RFUEFHRV9IRUFERVIgZ19DUDkzNl9NYXBIZWFkZXI7DQorZXh0ZXJuIGNvbnN0IEZYX0NPREVQQUdFX0hFQURFUiBnX0NQOTMyX01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1A5NDlfTWFwSGVhZGVyOw0KK2V4dGVybiBjb25zdCBGWF9DT0RFUEFHRV9IRUFERVIgZ19DUDk1MF9NYXBIZWFkZXI7DQorZXh0ZXJuIGNvbnN0IEZYX0NPREVQQUdFX0hFQURFUiBnX0NQODc0X01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjUwX01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjUxX01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjUyX01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjUzX01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjU0X01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjU1X01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjU2X01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjU3X01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ09ERVBBR0VfSEVBREVSIGdfQ1AxMjU4X01hcEhlYWRlcjsNCitleHRlcm4gY29uc3QgRlhfQ1BDVV9NQVBJTkZPIGdfQ1A5MzZfQ1VNYXA7DQorZXh0ZXJuIGNvbnN0IEZYX0NQQ1VfTUFQSU5GTyBnX0NQOTMyX0NVTWFwOw0KK2V4dGVybiBjb25zdCBGWF9DUENVX01BUElORk8gZ19DUDk0OV9DVU1hcDsNCitleHRlcm4gY29uc3QgRlhfQ1BDVV9NQVBJTkZPIGdfQ1A5NTBfQ1VNYXA7DQorZXh0ZXJuIGNvbnN0IEZYX0NQQ1VfTUFQSU5GTyBnX0NQODc0X0NVTWFwOw0KK2V4dGVybiBjb25zdCBGWF9DUENVX01BUElORk8gZ19DUDEyNTBfQ1VNYXA7DQorZXh0ZXJuIGNvbnN0IEZYX0NQQ1VfTUFQSU5GTyBnX0NQMTI1MV9DVU1hcDsNCitleHRlcm4gY29uc3QgRlhfQ1BDVV9NQVBJTkZPIGdfQ1AxMjUyX0NVTWFwOw0KK2V4dGVybiBjb25zdCBGWF9DUENVX01BUElORk8gZ19DUDEyNTNfQ1VNYXA7DQorZXh0ZXJuIGNvbnN0IEZYX0NQQ1VfTUFQSU5GTyBnX0NQMTI1NF9DVU1hcDsNCitleHRlcm4gY29uc3QgRlhfQ1BDVV9NQVBJTkZPIGdfQ1AxMjU1X0NVTWFwOw0KK2V4dGVybiBjb25zdCBGWF9DUENVX01BUElORk8gZ19DUDEyNTZfQ1VNYXA7DQorZXh0ZXJuIGNvbnN0IEZYX0NQQ1VfTUFQSU5GTyBnX0NQMTI1N19DVU1hcDsNCitleHRlcm4gY29uc3QgRlhfQ1BDVV9NQVBJTkZPIGdfQ1AxMjU4X0NVTWFwOw0KK0ZYX0xQQ0NPREVQQUdFIEZYX0dldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKQ0KK3sNCisgICAgRlhfSU5UMzIgaUVuZCA9IHNpemVvZihnX0ZYQ29kZVBhZ2VNZ3IpIC8gc2l6ZW9mKEZYX0NPREVQQUdFKSAtIDE7DQorICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgICBGWF9VSU5UMTYgdUNQSUQ7DQorICAgIGRvIHsNCisgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgY29uc3QgRlhfQ09ERVBBR0UgJmNwID0gZ19GWENvZGVQYWdlTWdyW2lNaWRdOw0KKyAgICAgICAgdUNQSUQgPSBjcC5wQ1BIZWFkZXItPnVDUElEOw0KKyAgICAgICAgaWYgKHdDb2RlUGFnZSA9PSB1Q1BJRCkgew0KKyAgICAgICAgICAgIHJldHVybiBnX0ZYQ29kZVBhZ2VNZ3IgKyBpTWlkOw0KKyAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPCB1Q1BJRCkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9lbmNvZGUuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfZW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJiNWE5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfZW5jb2RlLmNwcApAQCAtMCwwICsxLDE4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X2NvZGVwYWdlLmgiDQordm9pZCBGWF9Td2FwQnl0ZU9yZGVyKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7DQorICAgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICAgICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihwU3RyKTsNCisgICAgfQ0KKyAgICBGWF9XT1JEIHdjaDsNCisgICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPiAyKSB7DQorICAgICAgICB3aGlsZSAoaUxlbmd0aCAtLSA+IDApIHsNCisgICAgICAgICAgICB3Y2ggPSAoRlhfV09SRCkgKiBwU3RyOw0KKyAgICAgICAgICAgIHdjaCA9ICh3Y2ggPj4gOCkgfCAod2NoIDw8IDgpOw0KKyAgICAgICAgICAgIHdjaCAmPSAweDAwRkY7DQorICAgICAgICAgICAgKnBTdHIgKysgPSB3Y2g7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAoaUxlbmd0aCAtLSA+IDApIHsNCisgICAgICAgICAgICB3Y2ggPSAoRlhfV09SRCkgKiBwU3RyOw0KKyAgICAgICAgICAgIHdjaCA9ICh3Y2ggPj4gOCkgfCAod2NoIDw8IDgpOw0KKyAgICAgICAgICAgICpwU3RyICsrID0gd2NoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgRlhfU3dhcEJ5dGVPcmRlckNvcHkoRlhfTFBDV1NUUiBwU3JjLCBGWF9MUFdTVFIgcERzdCwgRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwgJiYgcERzdCAhPSBOVUxMKTsNCisgICAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgICAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBTcmMpOw0KKyAgICB9DQorICAgIEZYX1dPUkQgd2NoOw0KKyAgICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA+IDIpIHsNCisgICAgICAgIHdoaWxlIChpTGVuZ3RoIC0tID4gMCkgew0KKyAgICAgICAgICAgIHdjaCA9IChGWF9XT1JEKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQorICAgICAgICAgICAgd2NoICY9IDB4MDBGRjsNCisgICAgICAgICAgICAqcERzdCArKyA9IHdjaDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdoaWxlIChpTGVuZ3RoIC0tID4gMCkgew0KKyAgICAgICAgICAgIHdjaCA9IChGWF9XT1JEKSAqIHBTcmMgKys7DQorICAgICAgICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQorICAgICAgICAgICAgKnBEc3QgKysgPSB3Y2g7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBGWF9VVEYxNlRvV0NoYXIoRlhfTFBWT0lEIHBCdWZmZXIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX1dPUkQgKnBTcmMgPSAoRlhfV09SRCopcEJ1ZmZlcjsNCisgICAgRlhfTFBXU1RSIHBEc3QgPSAoRlhfTFBXU1RSKXBCdWZmZXI7DQorICAgIHdoaWxlICgtLWlMZW5ndGggPj0gMCkgew0KKyAgICAgICAgcERzdFtpTGVuZ3RoXSA9IChGWF9XQ0hBUilwU3JjW2lMZW5ndGhdOw0KKyAgICB9DQorfQ0KK3ZvaWQgRlhfVVRGMTZUb1dDaGFyQ29weShjb25zdCBGWF9XT1JEICpwVVRGMTYsIEZYX0xQV1NUUiBwV0NoYXIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFVURjE2ICE9IE5VTEwgJiYgcFdDaGFyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSB7DQorICAgICAgICBGWFNZU19tZW1jcHkocFdDaGFyLCBwVVRGMTYsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdoaWxlICgtLWlMZW5ndGggPj0gMCkgew0KKyAgICAgICAgICAgIHBXQ2hhcltpTGVuZ3RoXSA9IChGWF9XQ0hBUilwVVRGMTZbaUxlbmd0aF07DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBGWF9XQ2hhclRvVVRGMTYoRlhfTFBWT0lEIHBCdWZmZXIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIgcFNyYyA9IChGWF9MUENXU1RSKXBCdWZmZXI7DQorICAgIEZYX1dPUkQgKnBEc3QgPSAoRlhfV09SRCopcEJ1ZmZlcjsNCisgICAgd2hpbGUgKC0taUxlbmd0aCA+PSAwKSB7DQorICAgICAgICAqcERzdCsrID0gKEZYX1dPUkQpICogcFNyYysrOw0KKyAgICB9DQorfQ0KK3ZvaWQgRlhfV0NoYXJUb1VURjE2Q29weShGWF9MUENXU1RSIHBXQ2hhciwgRlhfV09SRCAqcFVURjE2LCBGWF9JTlQzMiBpTGVuZ3RoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBXQ2hhciAhPSBOVUxMICYmIHBVVEYxNiAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KKyAgICAgICAgRlhTWVNfbWVtY3B5KHBVVEYxNiwgcFdDaGFyLCBpTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAoLS1pTGVuZ3RoID49IDApIHsNCisgICAgICAgICAgICAqcFVURjE2KysgPSAoRlhfV09SRCkgKiBwV0NoYXIrKzsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitpbmxpbmUgRlhfRFdPUkQgRlhfRFdvcmRGcm9tQnl0ZXMoRlhfTFBDQllURSBwU3RyKQ0KK3sNCisgICAgcmV0dXJuIEZYQlNUUl9JRChwU3RyWzNdLCBwU3RyWzJdLCBwU3RyWzFdLCBwU3RyWzBdKTsNCit9DQoraW5saW5lIEZYX1dPUkQgRlhfV29yZEZyb21CeXRlcyhGWF9MUENCWVRFIHBTdHIpDQorew0KKyAgICByZXR1cm4gKHBTdHJbMV0gPDwgOCB8IHBTdHJbMF0pOw0KK30NCitGWF9JTlQzMiBGWF9EZWNvZGVTdHJpbmcoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0xQQ1NUUiBwU3JjLCBGWF9JTlQzMiAqcFNyY0xlbiwgRlhfTFBXU1RSIHBEc3QsIEZYX0lOVDMyICpwRHN0TGVuLCBGWF9CT09MIGJFcnJCcmVhaykNCit7DQorICAgIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICAgICAgcmV0dXJuIEZYX1VURjhEZWNvZGUocFNyYywgcFNyY0xlbiwgcERzdCwgcERzdExlbik7DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KK30NCitGWF9JTlQzMiBGWF9VVEY4RGVjb2RlKEZYX0xQQ1NUUiBwU3JjLCBGWF9JTlQzMiAqcFNyY0xlbiwgRlhfTFBXU1RSIHBEc3QsIEZYX0lOVDMyICpwRHN0TGVuKQ0KK3sNCisgICAgaWYgKHBTcmNMZW4gPT0gTlVMTCB8fCBwRHN0TGVuID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpU3JjTGVuID0gKnBTcmNMZW47DQorICAgIGlmIChpU3JjTGVuIDwgMSkgew0KKyAgICAgICAgKnBTcmNMZW4gPSAqcERzdExlbiA9IDA7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpRHN0TGVuID0gKnBEc3RMZW47DQorICAgIEZYX0JPT0wgYlZhbGlkRHN0ID0gKHBEc3QgIT0gTlVMTCAmJiBpRHN0TGVuID4gMCk7DQorICAgIEZYX0RXT1JEIGR3Q29kZSA9IDA7DQorICAgIEZYX0lOVDMyIGlQZW5kaW5nID0gMDsNCisgICAgRlhfSU5UMzIgaVNyY051bSA9IDAsIGlEc3ROdW0gPSAwOw0KKyAgICBGWF9JTlQzMiBrID0gMDsNCisgICAgRlhfSU5UMzIgaUluZGV4ID0gMDsNCisgICAgayA9IDE7DQorICAgIHdoaWxlIChpSW5kZXggPCBpU3JjTGVuKSB7DQorICAgICAgICBGWF9CWVRFIGJ5dGUgPSAoRlhfQllURSkgKiAocFNyYyArIGlJbmRleCk7DQorICAgICAgICBpZiAoYnl0ZSA8IDB4ODApIHsNCisgICAgICAgICAgICBpUGVuZGluZyA9IDA7DQorICAgICAgICAgICAgayA9IDE7DQorICAgICAgICAgICAgaURzdE51bSArKzsNCisgICAgICAgICAgICBpU3JjTnVtICs9IGs7DQorICAgICAgICAgICAgaWYgKGJWYWxpZERzdCkgew0KKyAgICAgICAgICAgICAgICAqcERzdCArKyA9IGJ5dGU7DQorICAgICAgICAgICAgICAgIGlmIChpRHN0TnVtID49IGlEc3RMZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChieXRlIDwgMHhjMCkgew0KKyAgICAgICAgICAgIGlmIChpUGVuZGluZyA8IDEpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlQZW5kaW5nLS07DQorICAgICAgICAgICAgZHdDb2RlIHw9IChieXRlICYgMHgzZikgPDwgKGlQZW5kaW5nICogNik7DQorICAgICAgICAgICAgaWYgKGlQZW5kaW5nID09IDApIHsNCisgICAgICAgICAgICAgICAgaURzdE51bSArKzsNCisgICAgICAgICAgICAgICAgaVNyY051bSArPSBrOw0KKyAgICAgICAgICAgICAgICBpZiAoYlZhbGlkRHN0KSB7DQorICAgICAgICAgICAgICAgICAgICAqcERzdCArKyA9IGR3Q29kZTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpRHN0TnVtID49IGlEc3RMZW4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZTApIHsNCisgICAgICAgICAgICBpUGVuZGluZyA9IDE7DQorICAgICAgICAgICAgayA9IDI7DQorICAgICAgICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDFmKSA8PCA2Ow0KKyAgICAgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmMCkgew0KKyAgICAgICAgICAgIGlQZW5kaW5nID0gMjsNCisgICAgICAgICAgICBrID0gMzsNCisgICAgICAgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MGYpIDw8IDEyOw0KKyAgICAgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmOCkgew0KKyAgICAgICAgICAgIGlQZW5kaW5nID0gMzsNCisgICAgICAgICAgICBrID0gNDsNCisgICAgICAgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDcpIDw8IDE4Ow0KKyAgICAgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmYykgew0KKyAgICAgICAgICAgIGlQZW5kaW5nID0gNDsNCisgICAgICAgICAgICBrID0gNTsNCisgICAgICAgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDMpIDw8IDI0Ow0KKyAgICAgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmZSkgew0KKyAgICAgICAgICAgIGlQZW5kaW5nID0gNTsNCisgICAgICAgICAgICBrID0gNjsNCisgICAgICAgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDEpIDw8IDMwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlJbmRleCsrOw0KKyAgICB9DQorICAgICpwU3JjTGVuID0gaVNyY051bTsNCisgICAgKnBEc3RMZW4gPSBpRHN0TnVtOw0KKyAgICByZXR1cm4gMTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X21lbW9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkMDgxYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X21lbW9yeS5jcHAKQEAgLTAsMCArMSwzMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9tZW1vcnkuaCINCisjZGVmaW5lIEZYXzRCWVRFQUxJR04oc2l6ZSkJKCgoc2l6ZSkgKyAzKSAvIDQgKiA0KQ0KK0lGWF9NRU1BbGxvY2F0b3IqIEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEUgZVR5cGUsIHNpemVfdCBjaHVua1NpemUsIHNpemVfdCBibG9ja1NpemUpDQorew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorI2lmbmRlZiBfRlhFTUINCisgICAgICAgIGNhc2UgRlhfQUxMT0NUWVBFX0R5bmFtaWM6DQorICAgICAgICAgICAgcmV0dXJuIEZYVEFSR0VUX05ldyBDRlhfRHluYW1pY1N0b3JlKGNodW5rU2l6ZSk7DQorI2VuZGlmDQorICAgICAgICBjYXNlIEZYX0FMTE9DVFlQRV9EZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGWFRBUkdFVF9OZXcgQ0ZYX0RlZlN0b3JlKCk7DQorICAgICAgICBjYXNlIEZYX0FMTE9DVFlQRV9TdGF0aWM6DQorICAgICAgICAgICAgcmV0dXJuIEZYVEFSR0VUX05ldyBDRlhfU3RhdGljU3RvcmUoY2h1bmtTaXplKTsNCisgICAgICAgIGNhc2UgRlhfQUxMT0NUWVBFX0ZpeGVkOg0KKyAgICAgICAgICAgIHJldHVybiBGWFRBUkdFVF9OZXcgQ0ZYX0ZpeGVkU3RvcmUoYmxvY2tTaXplLCBjaHVua1NpemUpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KK30NCitDRlhfU3RhdGljU3RvcmU6OkNGWF9TdGF0aWNTdG9yZShzaXplX3QgaURlZkNodW5rU2l6ZSkNCisgICAgOiBtX2lBbGxvY2F0ZWRTaXplKDApDQorICAgICwgbV9pRGVmQ2h1bmtTaXplKGlEZWZDaHVua1NpemUpDQorICAgICwgbV9wQ2h1bmsoTlVMTCkNCisgICAgLCBtX3BMYXN0Q2h1bmsoTlVMTCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2lEZWZDaHVua1NpemUgIT0gMCk7DQorfQ0KK0NGWF9TdGF0aWNTdG9yZTo6fkNGWF9TdGF0aWNTdG9yZSgpDQorew0KKyAgICByZWdpc3RlciBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgcENodW5rLCBwTmV4dDsNCisgICAgcENodW5rID0gbV9wQ2h1bms7DQorICAgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICAgICAgcE5leHQgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICAgICAgICBGWF9GcmVlKHBDaHVuayk7DQorICAgICAgICBwQ2h1bmsgPSBwTmV4dDsNCisgICAgfQ0KK30NCitGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgQ0ZYX1N0YXRpY1N0b3JlOjpBbGxvY0NodW5rKHNpemVfdCBzaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICAgIHJlZ2lzdGVyIEZYX0xQU1RBVElDU1RPUkVDSFVOSyBwQ2h1bmsgPSAoRlhfTFBTVEFUSUNTVE9SRUNIVU5LKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihGWF9TVEFUSUNTVE9SRUNIVU5LKSArIHNpemUpOw0KKyAgICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBDaHVuay0+aUNodW5rU2l6ZSA9IHNpemU7DQorICAgIHBDaHVuay0+aUZyZWVTaXplID0gc2l6ZTsNCisgICAgcENodW5rLT5wTmV4dENodW5rID0gTlVMTDsNCisgICAgaWYgKG1fcExhc3RDaHVuayA9PSBOVUxMKSB7DQorICAgICAgICBtX3BDaHVuayA9IHBDaHVuazsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcExhc3RDaHVuay0+cE5leHRDaHVuayA9IHBDaHVuazsNCisgICAgfQ0KKyAgICBtX3BMYXN0Q2h1bmsgPSBwQ2h1bms7DQorICAgIHJldHVybiBwQ2h1bms7DQorfQ0KK0ZYX0xQU1RBVElDU1RPUkVDSFVOSyBDRlhfU3RhdGljU3RvcmU6OkZpbmRDaHVuayhzaXplX3Qgc2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KKyAgICBpZiAobV9wTGFzdENodW5rID09IE5VTEwgfHwgbV9wTGFzdENodW5rLT5pRnJlZVNpemUgPCBzaXplKSB7DQorICAgICAgICByZXR1cm4gQWxsb2NDaHVuayhGWF9NQVgobV9pRGVmQ2h1bmtTaXplLCBzaXplKSk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcExhc3RDaHVuazsNCit9DQordm9pZCogQ0ZYX1N0YXRpY1N0b3JlOjpBbGxvYyhzaXplX3Qgc2l6ZSkNCit7DQorICAgIHNpemUgPSBGWF80QllURUFMSUdOKHNpemUpOw0KKyAgICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgICAgcmVnaXN0ZXIgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIHBDaHVuayA9IEZpbmRDaHVuayhzaXplKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMICYmIHBDaHVuay0+aUZyZWVTaXplID49IHNpemUpOw0KKyAgICByZWdpc3RlciBGWF9MUEJZVEUgcCA9IChGWF9MUEJZVEUpcENodW5rOw0KKyAgICBwICs9IHNpemVvZihGWF9TVEFUSUNTVE9SRUNIVU5LKSArIHBDaHVuay0+aUNodW5rU2l6ZSAtIHBDaHVuay0+aUZyZWVTaXplOw0KKyAgICBwQ2h1bmstPmlGcmVlU2l6ZSAtPSBzaXplOw0KKyAgICBtX2lBbGxvY2F0ZWRTaXplICs9IHNpemU7DQorICAgIHJldHVybiBwOw0KK30NCitzaXplX3QgQ0ZYX1N0YXRpY1N0b3JlOjpTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpDQorew0KKyAgICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgICAgc2l6ZV90IHYgPSBtX2lEZWZDaHVua1NpemU7DQorICAgIG1faURlZkNodW5rU2l6ZSA9IHNpemU7DQorICAgIHJldHVybiB2Ow0KK30NCitDRlhfRml4ZWRTdG9yZTo6Q0ZYX0ZpeGVkU3RvcmUoc2l6ZV90IGlCbG9ja1NpemUsIHNpemVfdCBpQmxvY2tOdW1zSW5DaHVuaykNCisgICAgOiBtX2lCbG9ja1NpemUoRlhfNEJZVEVBTElHTihpQmxvY2tTaXplKSkNCisgICAgLCBtX2lEZWZDaHVua1NpemUoRlhfNEJZVEVBTElHTihpQmxvY2tOdW1zSW5DaHVuaykpDQorICAgICwgbV9wQ2h1bmsoTlVMTCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2lCbG9ja1NpemUgIT0gMCAmJiBtX2lEZWZDaHVua1NpemUgIT0gMCk7DQorfQ0KK0NGWF9GaXhlZFN0b3JlOjp+Q0ZYX0ZpeGVkU3RvcmUoKQ0KK3sNCisgICAgcmVnaXN0ZXIgRlhfTFBGSVhFRFNUT1JFQ0hVTksgcENodW5rLCBwTmV4dDsNCisgICAgcENodW5rID0gbV9wQ2h1bms7DQorICAgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICAgICAgcE5leHQgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICAgICAgICBGWF9GcmVlKHBDaHVuayk7DQorICAgICAgICBwQ2h1bmsgPSBwTmV4dDsNCisgICAgfQ0KK30NCitGWF9MUEZJWEVEU1RPUkVDSFVOSyBDRlhfRml4ZWRTdG9yZTo6QWxsb2NDaHVuaygpDQorew0KKyAgICBGWF9JTlQzMiBpVG90YWxTaXplID0gc2l6ZW9mKEZYX0ZJWEVEU1RPUkVDSFVOSykgKyBtX2lEZWZDaHVua1NpemUgKyBtX2lCbG9ja1NpemUgKiBtX2lEZWZDaHVua1NpemU7DQorICAgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBDaHVuayA9IChGWF9MUEZJWEVEU1RPUkVDSFVOSylGWF9BbGxvYyhGWF9CWVRFLCBpVG90YWxTaXplKTsNCisgICAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQocENodW5rLT5GaXJzdEZsYWcoKSwgMCwgbV9pRGVmQ2h1bmtTaXplKTsNCisgICAgcENodW5rLT5wTmV4dENodW5rID0gbV9wQ2h1bms7DQorICAgIHBDaHVuay0+aUNodW5rU2l6ZSA9IG1faURlZkNodW5rU2l6ZTsNCisgICAgcENodW5rLT5pRnJlZU51bSA9IG1faURlZkNodW5rU2l6ZTsNCisgICAgbV9wQ2h1bmsgPSBwQ2h1bms7DQorICAgIHJldHVybiBwQ2h1bms7DQorfQ0KK3ZvaWQqIENGWF9GaXhlZFN0b3JlOjpBbGxvYyhzaXplX3Qgc2l6ZSkNCit7DQorICAgIGlmIChzaXplID4gbV9pQmxvY2tTaXplKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZWdpc3RlciBGWF9MUEZJWEVEU1RPUkVDSFVOSyBwQ2h1bmsgPSBtX3BDaHVuazsNCisgICAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgICAgICBpZiAocENodW5rLT5pRnJlZU51bSA+IDApIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgfQ0KKyAgICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgICAgIHBDaHVuayA9IEFsbG9jQ2h1bmsoKTsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KKyAgICByZWdpc3RlciBGWF9MUEJZVEUgcEZsYWdzID0gcENodW5rLT5GaXJzdEZsYWcoKTsNCisgICAgcmVnaXN0ZXIgc2l6ZV90IGkgPSAwOw0KKyAgICBmb3IgKDsgaSA8IHBDaHVuay0+aUNodW5rU2l6ZTsgaSArKykNCisgICAgICAgIGlmIChwRmxhZ3NbaV0gPT0gMCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQoaSA8IHBDaHVuay0+aUNodW5rU2l6ZSk7DQorICAgIHBGbGFnc1tpXSA9IDE7DQorICAgIHBDaHVuay0+aUZyZWVOdW0gLS07DQorICAgIHJldHVybiBwQ2h1bmstPkZpcnN0QmxvY2soKSArIGkgKiBtX2lCbG9ja1NpemU7DQorfQ0KK3ZvaWQgQ0ZYX0ZpeGVkU3RvcmU6OkZyZWUodm9pZCogcEJsb2NrKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCbG9jayAhPSBOVUxMKTsNCisgICAgcmVnaXN0ZXIgRlhfTFBGSVhFRFNUT1JFQ0hVTksgcFByaW9yLCBwQ2h1bms7DQorICAgIHBQcmlvciA9IE5VTEwsIHBDaHVuayA9IG1fcENodW5rOw0KKyAgICByZWdpc3RlciBGWF9MUEJZVEUgcFN0YXJ0ID0gTlVMTCwgcEVuZDsNCisgICAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgICAgICBwU3RhcnQgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgICAgICAgIGlmIChwQmxvY2sgPj0gcFN0YXJ0KSB7DQorICAgICAgICAgICAgcEVuZCA9IHBTdGFydCArIG1faUJsb2NrU2l6ZSAqIHBDaHVuay0+aUNodW5rU2l6ZTsNCisgICAgICAgICAgICBpZiAocEJsb2NrIDwgcEVuZCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwUHJpb3IgPSBwQ2h1bmssIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KKyAgICByZWdpc3RlciBzaXplX3QgaVBvcyA9ICgoRlhfTFBCWVRFKXBCbG9jayAtIHBTdGFydCkgLyBtX2lCbG9ja1NpemU7DQorICAgIEZYU1lTX2Fzc2VydChpUG9zIDwgcENodW5rLT5pQ2h1bmtTaXplKTsNCisgICAgcmVnaXN0ZXIgRlhfTFBCWVRFIHBGbGFncyA9IHBDaHVuay0+Rmlyc3RGbGFnKCk7DQorICAgIGlmIChwRmxhZ3NbaVBvc10gPT0gMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBGbGFnc1tpUG9zXSA9IDA7DQorICAgIHBDaHVuay0+aUZyZWVOdW0gKys7DQorICAgIGlmIChwQ2h1bmstPmlGcmVlTnVtID09IHBDaHVuay0+aUNodW5rU2l6ZSkgew0KKyAgICAgICAgaWYgKHBQcmlvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wQ2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBQcmlvci0+cE5leHRDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocENodW5rKTsNCisgICAgfQ0KK30NCitzaXplX3QgQ0ZYX0ZpeGVkU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3QgaUNodW5rU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChpQ2h1bmtTaXplICE9IDApOw0KKyAgICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCisgICAgbV9pRGVmQ2h1bmtTaXplID0gRlhfNEJZVEVBTElHTihpQ2h1bmtTaXplKTsNCisgICAgcmV0dXJuIHY7DQorfQ0KKyNpZm5kZWYgX0ZYRU1CDQorQ0ZYX0R5bmFtaWNTdG9yZTo6Q0ZYX0R5bmFtaWNTdG9yZShzaXplX3QgaURlZkNodW5rU2l6ZSkNCisgICAgOiBtX2lEZWZDaHVua1NpemUoaURlZkNodW5rU2l6ZSkNCisgICAgLCBtX3BDaHVuayhOVUxMKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faURlZkNodW5rU2l6ZSAhPSAwKTsNCit9DQorQ0ZYX0R5bmFtaWNTdG9yZTo6fkNGWF9EeW5hbWljU3RvcmUoKQ0KK3sNCisgICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwQ2h1bmssIHBOZXh0Ow0KKyAgICBwQ2h1bmsgPSBtX3BDaHVuazsNCisgICAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgICAgICBwTmV4dCA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgICAgIEZYX0ZyZWUocENodW5rKTsNCisgICAgICAgIHBDaHVuayA9IHBOZXh0Ow0KKyAgICB9DQorfQ0KK0ZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgQ0ZYX0R5bmFtaWNTdG9yZTo6QWxsb2NDaHVuayhzaXplX3Qgc2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KKyAgICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBDaHVuayA9IChGWF9MUERZTkFNSUNTVE9SRUNIVU5LKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihGWF9EWU5BTUlDU1RPUkVDSFVOSykgKyBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spICogMiArIHNpemUpOw0KKyAgICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBDaHVuay0+aUNodW5rU2l6ZSA9IHNpemU7DQorICAgIHBDaHVuay0+aUZyZWVTaXplID0gc2l6ZTsNCisgICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVCTE9DSyBwQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgICAgcEJsb2NrLT5pQmxvY2tTaXplID0gc2l6ZTsNCisgICAgcEJsb2NrLT5iVXNlZCA9IEZBTFNFOw0KKyAgICBwQmxvY2sgPSBwQmxvY2stPk5leHRCbG9jaygpOw0KKyAgICBwQmxvY2stPmlCbG9ja1NpemUgPSAwOw0KKyAgICBwQmxvY2stPmJVc2VkID0gVFJVRTsNCisgICAgaWYgKG1fcENodW5rICE9IE5VTEwgJiYgc2l6ZSA+PSBtX2lEZWZDaHVua1NpemUpIHsNCisgICAgICAgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgcExhc3QgPSBtX3BDaHVuazsNCisgICAgICAgIHdoaWxlIChwTGFzdC0+cE5leHRDaHVuayAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcExhc3QgPSBwTGFzdC0+cE5leHRDaHVuazsNCisgICAgICAgIH0NCisgICAgICAgIHBMYXN0LT5wTmV4dENodW5rID0gcENodW5rOw0KKyAgICAgICAgcENodW5rLT5wTmV4dENodW5rID0gTlVMTDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDaHVuay0+cE5leHRDaHVuayA9IG1fcENodW5rOw0KKyAgICAgICAgbV9wQ2h1bmsgPSBwQ2h1bms7DQorICAgIH0NCisgICAgcmV0dXJuIHBDaHVuazsNCit9DQordm9pZCogQ0ZYX0R5bmFtaWNTdG9yZTo6QWxsb2Moc2l6ZV90IHNpemUpDQorew0KKyAgICBzaXplID0gRlhfNEJZVEVBTElHTihzaXplKTsNCisgICAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICAgIHJlZ2lzdGVyIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgcENodW5rID0gbV9wQ2h1bms7DQorICAgIHJlZ2lzdGVyIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sgcEJsb2NrID0gTlVMTDsNCisgICAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgICAgICBpZiAocENodW5rLT5pRnJlZVNpemUgPj0gc2l6ZSkgew0KKyAgICAgICAgICAgIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICAgICAgICAgIHJlZ2lzdGVyIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsNCisgICAgICAgICAgICB3aGlsZShwQmxvY2stPmlCbG9ja1NpemUgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBpZiAoIXBCbG9jay0+YlVzZWQgJiYgcEJsb2NrLT5pQmxvY2tTaXplID49IHNpemUpIHsNCisgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBCbG9jayA9IHBCbG9jay0+TmV4dEJsb2NrKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiRmluZCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwQ2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICAgIH0NCisgICAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQorICAgICAgICBwQ2h1bmsgPSBBbGxvY0NodW5rKEZYX01BWChtX2lEZWZDaHVua1NpemUsIHNpemUpKTsNCisgICAgICAgIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCAmJiBwQmxvY2sgIT0gTlVMTCk7DQorICAgIHJlZ2lzdGVyIHNpemVfdCBtID0gc2l6ZSArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVCTE9DSyk7DQorICAgIHBCbG9jay0+YlVzZWQgPSBUUlVFOw0KKyAgICBpZiAocEJsb2NrLT5pQmxvY2tTaXplID4gbSkgew0KKyAgICAgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSBwQmxvY2stPmlCbG9ja1NpemU7DQorICAgICAgICBwQmxvY2stPmlCbG9ja1NpemUgPSBzaXplOw0KKyAgICAgICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVCTE9DSyBwTmV4dEJsb2NrID0gcEJsb2NrLT5OZXh0QmxvY2soKTsNCisgICAgICAgIHBOZXh0QmxvY2stPmJVc2VkID0gRkFMU0U7DQorICAgICAgICBwTmV4dEJsb2NrLT5pQmxvY2tTaXplID0gbiAtIHNpemUgLSBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgICAgICAgcENodW5rLT5pRnJlZVNpemUgLT0gc2l6ZSArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVCTE9DSyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ2h1bmstPmlGcmVlU2l6ZSAtPSBwQmxvY2stPmlCbG9ja1NpemU7DQorICAgIH0NCisgICAgcmV0dXJuIHBCbG9jay0+RGF0YSgpOw0KK30NCit2b2lkIENGWF9EeW5hbWljU3RvcmU6OkZyZWUodm9pZCogcEJsb2NrKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCbG9jayAhPSBOVUxMKTsNCisgICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwUHJpb3JDaHVuaywgcENodW5rOw0KKyAgICBwUHJpb3JDaHVuayA9IE5VTEwsIHBDaHVuayA9IG1fcENodW5rOw0KKyAgICB3aGlsZSAocENodW5rICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwQmxvY2sgPiBwQ2h1bmsgJiYgcEJsb2NrIDw9ICgoRlhfTFBCWVRFKXBDaHVuayArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVDSFVOSykgKyBwQ2h1bmstPmlDaHVua1NpemUpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwUHJpb3JDaHVuayA9IHBDaHVuaywgcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCk7DQorICAgIHJlZ2lzdGVyIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sgcFByaW9yQmxvY2ssIHBGaW5kQmxvY2s7DQorICAgIHBQcmlvckJsb2NrID0gTlVMTCwgcEZpbmRCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICB3aGlsZShwRmluZEJsb2NrLT5pQmxvY2tTaXplICE9IDApIHsNCisgICAgICAgIGlmIChwQmxvY2sgPT0gKHZvaWQqKXBGaW5kQmxvY2stPkRhdGEoKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFByaW9yQmxvY2sgPSBwRmluZEJsb2NrOw0KKyAgICAgICAgcEZpbmRCbG9jayA9IHBGaW5kQmxvY2stPk5leHRCbG9jaygpOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwRmluZEJsb2NrLT5pQmxvY2tTaXplICE9IDAgJiYgcEZpbmRCbG9jay0+YlVzZWQgJiYgcEJsb2NrID09ICh2b2lkKilwRmluZEJsb2NrLT5EYXRhKCkpOw0KKyAgICBwRmluZEJsb2NrLT5iVXNlZCA9IEZBTFNFOw0KKyAgICBwQ2h1bmstPmlGcmVlU2l6ZSArPSBwRmluZEJsb2NrLT5pQmxvY2tTaXplOw0KKyAgICBpZiAocFByaW9yQmxvY2sgPT0gTlVMTCkgew0KKyAgICAgICAgcFByaW9yQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgICAgfSBlbHNlIGlmIChwUHJpb3JCbG9jay0+YlVzZWQpIHsNCisgICAgICAgIHBQcmlvckJsb2NrID0gcEZpbmRCbG9jazsNCisgICAgfQ0KKyAgICBwRmluZEJsb2NrID0gcFByaW9yQmxvY2s7DQorICAgIHJlZ2lzdGVyIHNpemVfdCBzaXplRnJlZSA9IDA7DQorICAgIHJlZ2lzdGVyIHNpemVfdCBzaXplQmxvY2sgPSAwOw0KKyAgICB3aGlsZSAocEZpbmRCbG9jay0+aUJsb2NrU2l6ZSAhPSAwICYmICFwRmluZEJsb2NrLT5iVXNlZCkgew0KKyAgICAgICAgaWYgKHBGaW5kQmxvY2sgIT0gcFByaW9yQmxvY2spIHsNCisgICAgICAgICAgICBzaXplRnJlZSArPSBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgICAgICAgICAgIHNpemVCbG9jayArPSBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2l6ZUJsb2NrICs9IHBGaW5kQmxvY2stPmlCbG9ja1NpemU7DQorICAgICAgICBwRmluZEJsb2NrID0gcEZpbmRCbG9jay0+TmV4dEJsb2NrKCk7DQorICAgIH0NCisgICAgcFByaW9yQmxvY2stPmlCbG9ja1NpemUgPSBzaXplQmxvY2s7DQorICAgIHBDaHVuay0+aUZyZWVTaXplICs9IHNpemVGcmVlOw0KKyAgICBpZiAocENodW5rLT5pRnJlZVNpemUgPT0gcENodW5rLT5pQ2h1bmtTaXplKSB7DQorICAgICAgICBpZiAocFByaW9yQ2h1bmsgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwUHJpb3JDaHVuay0+cE5leHRDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocENodW5rKTsNCisgICAgfQ0KK30NCitzaXplX3QgQ0ZYX0R5bmFtaWNTdG9yZTo6U2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICAgIHNpemVfdCB2ID0gbV9pRGVmQ2h1bmtTaXplOw0KKyAgICBtX2lEZWZDaHVua1NpemUgPSBzaXplOw0KKyAgICByZXR1cm4gdjsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmggYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTIxYzMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmgKQEAgLTAsMCArMSwxOTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfTUVNT1JZX0lNUA0KKyNkZWZpbmUgX0ZYX01FTU9SWV9JTVANCitjbGFzcyBDRlhfRGVmU3RvcmU7DQorY2xhc3MgQ0ZYX1N0YXRpY1N0b3JlOw0KK2NsYXNzIENGWF9GaXhlZFN0b3JlOw0KK2NsYXNzIENGWF9EeW5hbWljU3RvcmU7DQorY2xhc3MgQ0ZYX0RlZlN0b3JlIDogcHVibGljIElGWF9NRU1BbGxvY2F0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0RlZlN0b3JlKCkge30NCisgICAgfkNGWF9EZWZTdG9yZSgpIHt9DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGWFRBUkdFVF9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQqCQkJQWxsb2Moc2l6ZV90IHNpemUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQlGcmVlKHZvaWQgKnBCbG9jaykNCisgICAgew0KKyAgICAgICAgRlhfRnJlZShwQmxvY2spOw0KKyAgICB9DQorICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgdmlydHVhbCBzaXplX3QJCQlHZXREZWZDaHVua1NpemUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCVNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgdmlydHVhbCBzaXplX3QJCQlHZXRDdXJyZW50RGF0YVNpemUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KK307DQorI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpDQorI2VuZGlmDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1NUQVRJQ1NUT1JFQ0hVTksgew0KKyAgICBfRlhfU1RBVElDU1RPUkVDSFVOSyoJcE5leHRDaHVuazsNCisgICAgc2l6ZV90CQkJCQlpQ2h1bmtTaXplOw0KKyAgICBzaXplX3QJCQkJCWlGcmVlU2l6ZTsNCit9IEZYX1NUQVRJQ1NUT1JFQ0hVTkssICogRlhfTFBTVEFUSUNTVE9SRUNIVU5LOw0KK3R5cGVkZWYgRlhfU1RBVElDU1RPUkVDSFVOSyBjb25zdCAqIEZYX0xQQ1NUQVRJQ1NUT1JFQ0hVTks7DQorI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQorI3ByYWdtYSBwYWNrKHBvcCkNCisjZW5kaWYNCitjbGFzcyBDRlhfU3RhdGljU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRlhfU3RhdGljU3RvcmUoc2l6ZV90IGlEZWZDaHVua1NpemUgPSA0MDk2KTsNCisgICAgfkNGWF9TdGF0aWNTdG9yZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgRlhUQVJHRVRfRGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkKgkJCUFsbG9jKHNpemVfdCBzaXplKTsNCisgICAgdmlydHVhbCB2b2lkCQkJRnJlZShGWF9MUFZPSUQgcEJsb2NrKSB7fQ0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEJsb2NrU2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faURlZkNodW5rU2l6ZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCVNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSk7DQorICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faUFsbG9jYXRlZFNpemU7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIHNpemVfdAkJCQkJbV9pQWxsb2NhdGVkU2l6ZTsNCisgICAgc2l6ZV90CQkJCQltX2lEZWZDaHVua1NpemU7DQorICAgIEZYX0xQU1RBVElDU1RPUkVDSFVOSwltX3BDaHVuazsNCisgICAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LCW1fcExhc3RDaHVuazsNCisgICAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LCUFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KKyAgICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksJRmluZENodW5rKHNpemVfdCBzaXplKTsNCit9Ow0KKyNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXw0KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQ0KKyNlbmRpZg0KK3R5cGVkZWYgc3RydWN0IF9GWF9GSVhFRFNUT1JFQ0hVTksgew0KKyAgICBGWF9MUEJZVEUJCQkJRmlyc3RGbGFnKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChGWF9MUEJZVEUpdGhpcyArIHNpemVvZihfRlhfRklYRURTVE9SRUNIVU5LKTsNCisgICAgfQ0KKyAgICBGWF9MUEJZVEUJCQkJRmlyc3RCbG9jaygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBGaXJzdEZsYWcoKSArIGlDaHVua1NpemU7DQorICAgIH0NCisgICAgX0ZYX0ZJWEVEU1RPUkVDSFVOSyoJcE5leHRDaHVuazsNCisgICAgc2l6ZV90CQkJCQlpQ2h1bmtTaXplOw0KKyAgICBzaXplX3QJCQkJCWlGcmVlTnVtOw0KK30gRlhfRklYRURTVE9SRUNIVU5LLCAqIEZYX0xQRklYRURTVE9SRUNIVU5LOw0KK3R5cGVkZWYgRlhfRklYRURTVE9SRUNIVU5LIGNvbnN0ICogRlhfTFBDRklYRURTVE9SRUNIVU5LOw0KKyNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXw0KKyNwcmFnbWEgcGFjayhwb3ApDQorI2VuZGlmDQorY2xhc3MgQ0ZYX0ZpeGVkU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRlhfRml4ZWRTdG9yZShzaXplX3QgaUJsb2NrU2l6ZSwgc2l6ZV90IGlCbG9ja051bXNJbkNodW5rKTsNCisgICAgdmlydHVhbCB+Q0ZYX0ZpeGVkU3RvcmUoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIEZYVEFSR0VUX0RlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZCoJCQlBbGxvYyhzaXplX3Qgc2l6ZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUZyZWUoRlhfTFBWT0lEIHBCbG9jayk7DQorICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faUJsb2NrU2l6ZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCUdldERlZkNodW5rU2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lEZWZDaHVua1NpemU7DQorICAgIH0NCisgICAgdmlydHVhbCBzaXplX3QJCQlTZXREZWZDaHVua1NpemUoc2l6ZV90IGlDaHVua1NpemUpOw0KKyAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorcHJvdGVjdGVkOg0KKyAgICBzaXplX3QJCQkJCW1faUJsb2NrU2l6ZTsNCisgICAgc2l6ZV90CQkJCQltX2lEZWZDaHVua1NpemU7DQorICAgIEZYX0xQRklYRURTVE9SRUNIVU5LCW1fcENodW5rOw0KKyAgICBGWF9MUEZJWEVEU1RPUkVDSFVOSwlBbGxvY0NodW5rKCk7DQorfTsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socHVzaCwgMSkNCisjZW5kaWYNCit0eXBlZGVmIHN0cnVjdCBfRlhfRFlOQU1JQ1NUT1JFQkxPQ0sgew0KKyAgICBfRlhfRFlOQU1JQ1NUT1JFQkxPQ0sqCU5leHRCbG9jaygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoX0ZYX0RZTkFNSUNTVE9SRUJMT0NLKikoRGF0YSgpICsgaUJsb2NrU2l6ZSk7DQorICAgIH0NCisgICAgRlhfTFBCWVRFCQkJCURhdGEoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZYX0xQQllURSl0aGlzICsgc2l6ZW9mKF9GWF9EWU5BTUlDU1RPUkVCTE9DSyk7DQorICAgIH0NCisgICAgc2l6ZV90CQlpQmxvY2tTaXplOw0KKyAgICBGWF9CT09MCQliVXNlZDsNCit9IEZYX0RZTkFNSUNTVE9SRUJMT0NLLCAqIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0s7DQordHlwZWRlZiBGWF9EWU5BTUlDU1RPUkVCTE9DSyBjb25zdCAqIEZYX0xQQ0RZTkFNSUNTVE9SRUJMT0NLOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9EWU5BTUlDU1RPUkVDSFVOSyB7DQorICAgIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sJRmlyc3RCbG9jaygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoRlhfTFBEWU5BTUlDU1RPUkVCTE9DSykoKEZYX0xQQllURSl0aGlzICsgc2l6ZW9mKF9GWF9EWU5BTUlDU1RPUkVDSFVOSykpOw0KKyAgICB9DQorICAgIF9GWF9EWU5BTUlDU1RPUkVDSFVOSyoJcE5leHRDaHVuazsNCisgICAgc2l6ZV90CQkJCQlpQ2h1bmtTaXplOw0KKyAgICBzaXplX3QJCQkJCWlGcmVlU2l6ZTsNCit9IEZYX0RZTkFNSUNTVE9SRUNIVU5LLCAqIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTks7DQordHlwZWRlZiBGWF9EWU5BTUlDU1RPUkVDSFVOSyBjb25zdCAqIEZYX0xQQ0RZTkFNSUNTVE9SRUNIVU5LOw0KKyNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXw0KKyNwcmFnbWEgcGFjayhwb3ApDQorI2VuZGlmDQorY2xhc3MgQ0ZYX0R5bmFtaWNTdG9yZSA6IHB1YmxpYyBJRlhfTUVNQWxsb2NhdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9EeW5hbWljU3RvcmUoc2l6ZV90IGlEZWZDaHVua1NpemUgPSA0MDk2KTsNCisgICAgdmlydHVhbCB+Q0ZYX0R5bmFtaWNTdG9yZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGWFRBUkdFVF9EZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQqCQlBbGxvYyhzaXplX3Qgc2l6ZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJRnJlZShGWF9MUFZPSUQgcEJsb2NrKTsNCisgICAgdmlydHVhbCBzaXplX3QJCUdldEJsb2NrU2l6ZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgc2l6ZV90CQlHZXREZWZDaHVua1NpemUoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pRGVmQ2h1bmtTaXplOw0KKyAgICB9DQorICAgIHZpcnR1YWwgc2l6ZV90CQlTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpOw0KKyAgICB2aXJ0dWFsIHNpemVfdAkJR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIHNpemVfdAkJCQkJCW1faURlZkNodW5rU2l6ZTsNCisgICAgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSwkJbV9wQ2h1bms7DQorICAgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksJCUFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmM2ZlMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAKQEAgLTAsMCArMSwxNjEzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfc3RyZWFtLmgiDQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MsIEZYX0lOVDMyIGlGaWxlU2l6ZSwgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQgKQ0KK3sNCisgICAgQ0ZYX1N0cmVhbSAqcFNSID0gRlhfTkVXIENGWF9TdHJlYW07DQorICAgIGlmICghcFNSKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIXBTUi0+TG9hZEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgZHdBY2Nlc3MsIGJSZWxlYXNlQnVmZmVyUmVhZCkpIHsNCisgICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgICAgIElGWF9TdHJlYW0gKnBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgICAgICAgaWYgKCFwVFIpIHsNCisgICAgICAgICAgICBwVFItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICBwVFIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBUUjsNCisgICAgfQ0KKyAgICByZXR1cm4gcFNSOw0KK30NCitJRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KK3sNCisgICAgQ0ZYX1N0cmVhbSAqcFNSID0gRlhfTkVXIENGWF9TdHJlYW07DQorICAgIGlmIChwU1IgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKCFwU1ItPkxvYWRGaWxlUmVhZChwRmlsZVJlYWQsIGR3QWNjZXNzKSkgew0KKyAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgew0KKyAgICAgICAgSUZYX1N0cmVhbSAqcFRSID0gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBTUiwgVFJVRSk7DQorICAgICAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICAgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwVFI7DQorICAgIH0NCisgICAgcmV0dXJuIHBTUjsNCit9DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKElGWF9GaWxlV3JpdGUgKnBGaWxlV3JpdGUsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KK3sNCisgICAgQ0ZYX1N0cmVhbSAqcFNSID0gRlhfTkVXIENGWF9TdHJlYW07DQorICAgIGlmIChwU1IgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKCFwU1ItPkxvYWRGaWxlV3JpdGUocEZpbGVXcml0ZSwgZHdBY2Nlc3MpKSB7DQorICAgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgICAgICBJRlhfU3RyZWFtICpwVFIgPSBGWF9ORVcgQ0ZYX1RleHRTdHJlYW0ocFNSLCBUUlVFKTsNCisgICAgICAgIGlmIChwVFIgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBUUjsNCisgICAgfQ0KKyAgICByZXR1cm4gcFNSOw0KK30NCitJRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oRlhfTFBDV1NUUiBwc3pGaWxlTmFtZSwgRlhfRFdPUkQgZHdBY2Nlc3MpDQorew0KKyAgICBDRlhfU3RyZWFtICpwU1IgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCisgICAgaWYgKHBTUiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIXBTUi0+TG9hZEZpbGUocHN6RmlsZU5hbWUsIGR3QWNjZXNzKSkgew0KKyAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgew0KKyAgICAgICAgSUZYX1N0cmVhbSAqcFRSID0gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBTUiwgVFJVRSk7DQorICAgICAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICAgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwVFI7DQorICAgIH0NCisgICAgcmV0dXJuIHBTUjsNCit9DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKEZYX0xQQllURSBwRGF0YSwgRlhfSU5UMzIgbGVuZ3RoLCBGWF9EV09SRCBkd0FjY2VzcykNCit7DQorICAgIENGWF9TdHJlYW0gKnBTUiA9IEZYX05FVyBDRlhfU3RyZWFtOw0KKyAgICBpZiAocFNSID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmICghcFNSLT5Mb2FkQnVmZmVyKHBEYXRhLCBsZW5ndGgsIGR3QWNjZXNzKSkgew0KKyAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgew0KKyAgICAgICAgSUZYX1N0cmVhbSAqcFRSID0gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBTUiwgVFJVRSk7DQorICAgICAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICAgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwVFI7DQorICAgIH0NCisgICAgcmV0dXJuIHBTUjsNCit9DQorQ0ZYX1N0cmVhbUltcDo6Q0ZYX1N0cmVhbUltcCgpDQorICAgIDogQ0ZYX1RocmVhZExvY2soKQ0KKyAgICAsIG1fZHdBY2Nlc3MoMCkNCit7DQorfQ0KK0NGWF9GaWxlU3RyZWFtSW1wOjpDRlhfRmlsZVN0cmVhbUltcCgpDQorICAgIDogQ0ZYX1N0cmVhbUltcCgpDQorICAgICwgbV9oRmlsZShOVUxMKQ0KKyAgICAsIG1faUxlbmd0aCgwKQ0KK3sNCit9DQorQ0ZYX0ZpbGVTdHJlYW1JbXA6On5DRlhfRmlsZVN0cmVhbUltcCgpDQorew0KKyAgICBpZiAobV9oRmlsZSAhPSBOVUxMKSB7DQorICAgICAgICBGWFNZU19mY2xvc2UobV9oRmlsZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRlhfRmlsZVN0cmVhbUltcDo6TG9hZEZpbGUoRlhfTFBDV1NUUiBwc3pTcmNGaWxlTmFtZSwgRlhfRFdPUkQgZHdBY2Nlc3MpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRmlsZSA9PSBOVUxMKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBzelNyY0ZpbGVOYW1lICE9IE5VTEwgJiYgRlhTWVNfd2NzbGVuKHBzelNyY0ZpbGVOYW1lKSA+IDApOw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01vZGU7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgew0KKyAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCkgew0KKyAgICAgICAgICAgIHdzTW9kZSA9IEwiYStiIjsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCisgICAgICAgICAgICB3c01vZGUgPSBMIncrYiI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzTW9kZSA9IEwicitiIjsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdzTW9kZSA9IEwicmIiOw0KKyAgICB9DQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQorICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgd3NNb2RlKTsNCisjZWxzZQ0KKyAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCB3c01vZGUpOw0KKyNlbmRpZg0KKyAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQorICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCisgICAgICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlKSB7DQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQorICAgICAgICAgICAgICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgTCJ3K2IiKTsNCisjZWxzZQ0KKyAgICAgICAgICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMIncrYiIpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQorICAgICAgICAgICAgICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgTCJyK2IiKTsNCisjZWxzZQ0KKyAgICAgICAgICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMInIrYiIpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9mc2V0c2l6ZShtX2hGaWxlLCAwKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorI2Vsc2UNCisgICAgQ0ZYX0J5dGVTdHJpbmcgd3NNb2RlOw0KKyAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCisgICAgICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCisgICAgICAgICAgICB3c01vZGUgPSAiYStiIjsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCisgICAgICAgICAgICB3c01vZGUgPSAidytiIjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NNb2RlID0gInIrYiI7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c01vZGUgPSAicmIiOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIHN6RmlsZU5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHN6U3JjRmlsZU5hbWUpOw0KKyAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oc3pGaWxlTmFtZSwgd3NNb2RlKTsNCisgICAgaWYgKG1faEZpbGUgPT0gTlVMTCkgew0KKyAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgICAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0NyZWF0ZSkgew0KKyAgICAgICAgICAgICAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oc3pGaWxlTmFtZSwgIncrYiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIG1faEZpbGUgPSBGWFNZU19mb3BlbihzekZpbGVOYW1lLCAicitiIik7DQorICAgICAgICAgICAgICAgIGlmIChtX2hGaWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX2ZzZXRzaXplKG1faEZpbGUsIDApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisjZW5kaWYNCisgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICBpZiAoKGR3QWNjZXNzICYgKEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkpID09IChGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpKSB7DQorICAgICAgICBtX2lMZW5ndGggPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9pTGVuZ3RoID0gRlhfZmlsZWxlbmd0aChtX2hGaWxlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVTdHJlYW1JbXA6OkdldExlbmd0aCgpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgICAgcmV0dXJuIG1faUxlbmd0aDsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgRlhfSU5UMzIgaU9mZnNldCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KKyAgICBGWFNZU19mc2VlayhtX2hGaWxlLCBpT2Zmc2V0LCBlU2Vlayk7DQorICAgIHJldHVybiBGWFNZU19mdGVsbChtX2hGaWxlKTsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVTdHJlYW1JbXA6OkdldFBvc2l0aW9uKCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KKyAgICByZXR1cm4gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZpbGVTdHJlYW1JbXA6OklzRU9GKCkgY29uc3QNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KKyAgICByZXR1cm4gRlhTWVNfZnRlbGwobV9oRmlsZSkgPj0gbV9pTGVuZ3RoOw0KK30NCitGWF9JTlQzMiBDRlhfRmlsZVN0cmVhbUltcDo6UmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgICAgcmV0dXJuIEZYU1lTX2ZyZWFkKHBCdWZmZXIsIDEsIGlCdWZmZXJTaXplLCBtX2hGaWxlKTsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTWF4TGVuZ3RoID4gMCk7DQorICAgIGlmIChtX2lMZW5ndGggPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVBvc2l0aW9uID0gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSBGWF9NSU4oKG1faUxlbmd0aCAtIGlQb3NpdGlvbikgLyAyLCBpTWF4TGVuZ3RoKTsNCisgICAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaUxlbiA9IEZYU1lTX2ZyZWFkKHBTdHIsIDIsIGlMZW4sIG1faEZpbGUpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICB3aGlsZSAoKnBTdHIgIT0gTCdcMCcgJiYgaUNvdW50IDwgaUxlbikgew0KKyAgICAgICAgcFN0ciArKywgaUNvdW50ICsrOw0KKyAgICB9DQorICAgIGlQb3NpdGlvbiArPSBpQ291bnQgKiAyOw0KKyAgICBpZiAoRlhTWVNfZnRlbGwobV9oRmlsZSkgIT0gaVBvc2l0aW9uKSB7DQorICAgICAgICBGWFNZU19mc2VlayhtX2hGaWxlLCBpUG9zaXRpb24sIDApOw0KKyAgICB9DQorICAgIGJFT1MgPSAoaVBvc2l0aW9uID49IG1faUxlbmd0aCk7DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9GaWxlU3RyZWFtSW1wOjpXcml0ZURhdGEoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgaUJ1ZmZlclNpemUsIG1faEZpbGUpOw0KKyAgICBpZiAoaVJldCAhPSAwKSB7DQorICAgICAgICBGWF9JTlQzMiBpUG9zID0gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorICAgICAgICBpZiAoaVBvcyA+IG1faUxlbmd0aCkgew0KKyAgICAgICAgICAgIG1faUxlbmd0aCA9IGlQb3M7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9GaWxlU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMICYmIChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSBGWFNZU19md3JpdGUocFN0ciwgMiwgaUxlbmd0aCwgbV9oRmlsZSk7DQorICAgIGlmIChpUmV0ICE9IDApIHsNCisgICAgICAgIEZYX0lOVDMyIGlQb3MgPSBGWFNZU19mdGVsbChtX2hGaWxlKTsNCisgICAgICAgIGlmIChpUG9zID4gbV9pTGVuZ3RoKSB7DQorICAgICAgICAgICAgbV9pTGVuZ3RoID0gaVBvczsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gaVJldDsNCit9DQordm9pZCBDRlhfRmlsZVN0cmVhbUltcDo6Rmx1c2goKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQorICAgIEZYU1lTX2ZmbHVzaChtX2hGaWxlKTsNCit9DQorRlhfQk9PTCBDRlhfRmlsZVN0cmVhbUltcDo6U2V0TGVuZ3RoKEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMICYmIChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCisgICAgRlhfQk9PTCBiUmV0ID0gRlhfZnNldHNpemUobV9oRmlsZSwgaUxlbmd0aCk7DQorICAgIG1faUxlbmd0aCA9IEZYX2ZpbGVsZW5ndGgobV9oRmlsZSk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OkNGWF9GaWxlUmVhZFN0cmVhbUltcCgpDQorICAgIDogbV9wRmlsZVJlYWQoTlVMTCkNCisgICAgLCBtX2lQb3NpdGlvbigwKQ0KKyAgICAsIG1faUxlbmd0aCgwKQ0KK3sNCit9DQorRlhfQk9PTCBDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OkxvYWRGaWxlUmVhZChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgPT0gTlVMTCAmJiBwRmlsZVJlYWQgIT0gTlVMTCk7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fcEZpbGVSZWFkID0gcEZpbGVSZWFkOw0KKyAgICBtX2lMZW5ndGggPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1faUxlbmd0aDsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpDQorew0KKyAgICBzd2l0Y2ggKGVTZWVrKSB7DQorICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGggKyBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gMDsNCisgICAgfSBlbHNlIGlmIChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoOw0KKyAgICB9DQorICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCit9DQorRlhfQk9PTCBDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OklzRU9GKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGg7DQorfQ0KK0ZYX0lOVDMyIENGWF9GaWxlUmVhZFN0cmVhbUltcDo6UmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVSZWFkICE9IE5VTEwpOw0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICAgIGlmIChpQnVmZmVyU2l6ZSA+IG1faUxlbmd0aCAtIG1faVBvc2l0aW9uKSB7DQorICAgICAgICBpQnVmZmVyU2l6ZSA9IG1faUxlbmd0aCAtIG1faVBvc2l0aW9uOw0KKyAgICB9DQorICAgIGlmIChtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKHBCdWZmZXIsIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSkpIHsNCisgICAgICAgIG1faVBvc2l0aW9uICs9IGlCdWZmZXJTaXplOw0KKyAgICAgICAgcmV0dXJuIGlCdWZmZXJTaXplOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitGWF9JTlQzMiBDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KKyAgICBpTWF4TGVuZ3RoID0gUmVhZERhdGEoKEZYX0xQQllURSlwU3RyLCBpTWF4TGVuZ3RoICogMikgLyAyOw0KKyAgICBpZiAoaU1heExlbmd0aCA8PSAwKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgd2hpbGUgKGkgPCBpTWF4TGVuZ3RoICYmIHBTdHJbaV0gIT0gTCdcMCcpIHsNCisgICAgICAgICsraTsNCisgICAgfQ0KKyAgICBiRU9TID0gKG1faVBvc2l0aW9uID49IG1faUxlbmd0aCkgfHwgcFN0cltpXSA9PSBMJ1wwJzsNCisgICAgcmV0dXJuIGk7DQorfQ0KK0NGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpDRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpDQorICAgIDogbV9wQnVmZmVyUmVhZChOVUxMKQ0KKyAgICAsIG1fYlJlbGVhc2VCdWZmZXJSZWFkKEZBTFNFKQ0KKyAgICAsIG1faVBvc2l0aW9uKDApDQorICAgICwgbV9pQnVmZmVyU2l6ZSgwKQ0KK3sNCit9DQorQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6On5DRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpDQorew0KKyAgICBpZiAobV9iUmVsZWFzZUJ1ZmZlclJlYWQgJiYgbV9wQnVmZmVyUmVhZCAhPSBOVUxMKSB7DQorICAgICAgICBtX3BCdWZmZXJSZWFkLT5SZWxlYXNlKCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6TG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9JTlQzMiBpRmlsZVNpemUsIEZYX0RXT1JEIGR3QWNjZXNzLCBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkID09IE5VTEwgJiYgcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fYlJlbGVhc2VCdWZmZXJSZWFkID0gYlJlbGVhc2VCdWZmZXJSZWFkOw0KKyAgICBtX3BCdWZmZXJSZWFkID0gcEJ1ZmZlclJlYWQ7DQorICAgIG1faUJ1ZmZlclNpemUgPSBpRmlsZVNpemU7DQorICAgIGlmIChtX2lCdWZmZXJTaXplID49IDApIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1faUJ1ZmZlclNpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgd2hpbGUgKCFtX3BCdWZmZXJSZWFkLT5Jc0VPRigpKSB7DQorICAgICAgICBtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKTsNCisgICAgICAgIG1faUJ1ZmZlclNpemUgKz0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1faUJ1ZmZlclNpemU7DQorfQ0KK0ZYX0lOVDMyIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gR2V0TGVuZ3RoKCk7DQorICAgIHN3aXRjaCAoZVNlZWspIHsNCisgICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19CZWdpbjoNCisgICAgICAgICAgICBtX2lQb3NpdGlvbiA9IGlPZmZzZXQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoNCisgICAgICAgICAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0VuZDoNCisgICAgICAgICAgICBtX2lQb3NpdGlvbiA9IGlMZW5ndGggKyBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gMDsNCisgICAgfSBlbHNlIGlmIChtX2lQb3NpdGlvbiA+PSBpTGVuZ3RoKSB7DQorICAgICAgICBtX2lQb3NpdGlvbiA9IGlMZW5ndGg7DQorICAgIH0NCisgICAgcmV0dXJuIG1faVBvc2l0aW9uOw0KK30NCitGWF9CT09MIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpJc0VPRigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wQnVmZmVyUmVhZCA/IG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgOiBUUlVFOw0KK30NCitGWF9JTlQzMiBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6UmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEdldExlbmd0aCgpOw0KKyAgICBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKGlCdWZmZXJTaXplID4gaUxlbmd0aCAtIG1faVBvc2l0aW9uKSB7DQorICAgICAgICBpQnVmZmVyU2l6ZSA9IGlMZW5ndGggLSBtX2lQb3NpdGlvbjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgRlhfRFdPUkQgZHdCbG9ja1NpemUJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgaWYgKG1faVBvc2l0aW9uIDwgKEZYX0lOVDMyKWR3QmxvY2tPZmZzZXQpIHsNCisgICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgICAgICBkd0Jsb2NrU2l6ZQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgfQ0KKyAgICB3aGlsZSAobV9pUG9zaXRpb24gPCAoRlhfSU5UMzIpZHdCbG9ja09mZnNldCB8fCBtX2lQb3NpdGlvbiA+PSAoRlhfSU5UMzIpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgICAgIGlmIChtX3BCdWZmZXJSZWFkLT5Jc0VPRigpIHx8ICFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgICAgICBkd0Jsb2NrU2l6ZQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgfQ0KKyAgICBpZiAobV9pUG9zaXRpb24gPCAoRlhfSU5UMzIpZHdCbG9ja09mZnNldCB8fCBtX2lQb3NpdGlvbiA+PSAoRlhfSU5UMzIpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYX0xQQ0JZVEUgcEJ1ZmZlclRtcAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7DQorICAgIEZYX0RXT1JEIGR3T2Zmc2V0VG1wCT0gbV9pUG9zaXRpb24gLSBkd0Jsb2NrT2Zmc2V0Ow0KKyAgICBGWF9EV09SRCBkd0NvcHlTaXplCQk9IEZYX01JTihpQnVmZmVyU2l6ZSwgKEZYX0lOVDMyKShkd0Jsb2NrU2l6ZSAtIGR3T2Zmc2V0VG1wKSk7DQorICAgIEZYU1lTX21lbWNweShwQnVmZmVyLCBwQnVmZmVyVG1wICsgZHdPZmZzZXRUbXAsIGR3Q29weVNpemUpOw0KKyAgICBkd09mZnNldFRtcCA9IGR3Q29weVNpemU7DQorICAgIGlCdWZmZXJTaXplIC09IGR3Q29weVNpemU7DQorICAgIHdoaWxlIChpQnVmZmVyU2l6ZSA+IDApIHsNCisgICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgICAgICBwQnVmZmVyVG1wCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7DQorICAgICAgICBkd0NvcHlTaXplCQk9IEZYX01JTigoRlhfRFdPUkQpaUJ1ZmZlclNpemUsIGR3QmxvY2tTaXplKTsNCisgICAgICAgIEZYU1lTX21lbWNweShwQnVmZmVyICsgZHdPZmZzZXRUbXAsIHBCdWZmZXJUbXAsIGR3Q29weVNpemUpOw0KKyAgICAgICAgZHdPZmZzZXRUbXAgKz0gZHdDb3B5U2l6ZTsNCisgICAgICAgIGlCdWZmZXJTaXplIC09IGR3Q29weVNpemU7DQorICAgIH0NCisgICAgbV9pUG9zaXRpb24gKz0gZHdPZmZzZXRUbXA7DQorICAgIHJldHVybiBkd09mZnNldFRtcDsNCit9DQorRlhfSU5UMzIgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wQnVmZmVyUmVhZCAhPSBOVUxMKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTWF4TGVuZ3RoID4gMCk7DQorICAgIGlNYXhMZW5ndGggPSBSZWFkRGF0YSgoRlhfTFBCWVRFKXBTdHIsIGlNYXhMZW5ndGggKiAyKSAvIDI7DQorICAgIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICB3aGlsZSAoaSA8IGlNYXhMZW5ndGggJiYgcFN0cltpXSAhPSBMJ1wwJykgew0KKyAgICAgICAgKytpOw0KKyAgICB9DQorICAgIGJFT1MgPSAobV9pUG9zaXRpb24gPj0gR2V0TGVuZ3RoKCkpIHx8IHBTdHJbaV0gPT0gTCdcMCc7DQorICAgIHJldHVybiBpOw0KK30NCitDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpDRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCkNCisgICAgOiBtX3BGaWxlV3JpdGUoTlVMTCkNCisgICAgLCBtX2lQb3NpdGlvbigwKQ0KK3sNCit9DQorRlhfQk9PTCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpMb2FkRmlsZVdyaXRlKElGWF9GaWxlV3JpdGUgKnBGaWxlV3JpdGUsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVXcml0ZSA9PSBOVUxMICYmIHBGaWxlV3JpdGUgIT0gTlVMTCk7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19SZWFkKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCkgew0KKyAgICAgICAgbV9pUG9zaXRpb24gPSBwRmlsZVdyaXRlLT5HZXRTaXplKCk7DQorICAgIH0NCisgICAgbV9wRmlsZVdyaXRlID0gcEZpbGVXcml0ZTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OkdldExlbmd0aCgpIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcEZpbGVXcml0ZSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9JTlQzMiltX3BGaWxlV3JpdGUtPkdldFNpemUoKTsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBGWF9JTlQzMiBpT2Zmc2V0KQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEdldExlbmd0aCgpOw0KKyAgICBzd2l0Y2ggKGVTZWVrKSB7DQorICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoICsgaU9mZnNldDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgICAgICBtX2lQb3NpdGlvbiA9IDA7DQorICAgIH0gZWxzZSBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgew0KKyAgICAgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoOw0KKyAgICB9DQorICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCit9DQorRlhfQk9PTCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpJc0VPRigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9pUG9zaXRpb24gPj0gR2V0TGVuZ3RoKCk7DQorfQ0KK0ZYX0lOVDMyIENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OldyaXRlRGF0YShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgaWYgKCFtX3BGaWxlV3JpdGUpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmIChtX3BGaWxlV3JpdGUtPldyaXRlQmxvY2socEJ1ZmZlciwgbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKSkgew0KKyAgICAgICAgbV9pUG9zaXRpb24gKz0gaUJ1ZmZlclNpemU7DQorICAgIH0NCisgICAgcmV0dXJuIGlCdWZmZXJTaXplOw0KK30NCitGWF9JTlQzMiBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICByZXR1cm4gV3JpdGVEYXRhKChGWF9MUENCWVRFKXBTdHIsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCit9DQordm9pZCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpGbHVzaCgpDQorew0KKyAgICBpZiAobV9wRmlsZVdyaXRlKSB7DQorICAgICAgICBtX3BGaWxlV3JpdGUtPkZsdXNoKCk7DQorICAgIH0NCit9DQorQ0ZYX0J1ZmZlclN0cmVhbUltcDo6Q0ZYX0J1ZmZlclN0cmVhbUltcCgpDQorICAgIDogQ0ZYX1N0cmVhbUltcCgpDQorICAgICwgbV9wRGF0YShOVUxMKQ0KKyAgICAsIG1faVRvdGFsU2l6ZSgwKQ0KKyAgICAsIG1faVBvc2l0aW9uKDApDQorICAgICwgbV9pTGVuZ3RoKDApDQorew0KK30NCitGWF9CT09MIENGWF9CdWZmZXJTdHJlYW1JbXA6OkxvYWRCdWZmZXIoRlhfTFBCWVRFIHBEYXRhLCBGWF9JTlQzMiBpVG90YWxTaXplLCBGWF9EV09SRCBkd0FjY2VzcykNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhID09IE5VTEwpOw0KKyAgICBGWFNZU19hc3NlcnQocERhdGEgIT0gTlVMTCAmJiBpVG90YWxTaXplID4gMCk7DQorICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgbV9wRGF0YSA9IHBEYXRhOw0KKyAgICBtX2lUb3RhbFNpemUgPSBpVG90YWxTaXplOw0KKyAgICBtX2lQb3NpdGlvbiA9IDA7DQorICAgIG1faUxlbmd0aCA9IChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCA/IDAgOiBpVG90YWxTaXplOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfSU5UMzIgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgICByZXR1cm4gbV9pTGVuZ3RoOw0KK30NCitGWF9JTlQzMiBDRlhfQnVmZmVyU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMKTsNCisgICAgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQmVnaW4pIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsNCisgICAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQpIHsNCisgICAgICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7DQorICAgIH0gZWxzZSBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19FbmQpIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoICsgaU9mZnNldDsNCisgICAgfQ0KKyAgICBpZiAobV9pUG9zaXRpb24gPiBtX2lMZW5ndGgpIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoOw0KKyAgICB9DQorICAgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9pUG9zaXRpb247DQorfQ0KK0ZYX0lOVDMyIENGWF9CdWZmZXJTdHJlYW1JbXA6OkdldFBvc2l0aW9uKCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgICByZXR1cm4gbV9pUG9zaXRpb247DQorfQ0KK0ZYX0JPT0wgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6SXNFT0YoKSBjb25zdA0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQorICAgIHJldHVybiBtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGg7DQorfQ0KK0ZYX0lOVDMyIENGWF9CdWZmZXJTdHJlYW1JbXA6OlJlYWREYXRhKEZYX0xQQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSBGWF9NSU4obV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCisgICAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KHBCdWZmZXIsIG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgaUxlbik7DQorICAgIG1faVBvc2l0aW9uICs9IGlMZW47DQorICAgIHJldHVybiBpTGVuOw0KK30NCitGWF9JTlQzMiBDRlhfQnVmZmVyU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gRlhfTUlOKChtX2lMZW5ndGggLSBtX2lQb3NpdGlvbikgLyAyLCBpTWF4TGVuZ3RoKTsNCisgICAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUiBwU3JjID0gKEZYX0xQQ1dTVFIpKEZYX0xQU1RSKShtX3BEYXRhICsgbV9pUG9zaXRpb24pOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICB3aGlsZSAoKnBTcmMgIT0gTCdcMCcgJiYgaUNvdW50IDwgaUxlbikgew0KKyAgICAgICAgKnBTdHIgKysgPSAqcFNyYyArKywgaUNvdW50ICsrOw0KKyAgICB9DQorICAgIG1faVBvc2l0aW9uICs9IGlDb3VudCAqIDI7DQorICAgIGJFT1MgPSAoKnBTcmMgPT0gTCdcMCcpIHx8IChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpOw0KKyAgICByZXR1cm4gaUNvdW50Ow0KK30NCitGWF9JTlQzMiBDRlhfQnVmZmVyU3RyZWFtSW1wOjpXcml0ZURhdGEoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSBGWF9NSU4obV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCisgICAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgcEJ1ZmZlciwgaUxlbik7DQorICAgIG1faVBvc2l0aW9uICs9IGlMZW47DQorICAgIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgew0KKyAgICAgICAgbV9pTGVuZ3RoID0gbV9pUG9zaXRpb247DQorICAgIH0NCisgICAgcmV0dXJuIGlMZW47DQorfQ0KK0ZYX0lOVDMyIENGWF9CdWZmZXJTdHJlYW1JbXA6OldyaXRlU3RyaW5nKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgRlhfSU5UMzIgaUxlbiA9IEZYX01JTigobV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24pIC8gMiwgaUxlbmd0aCk7DQorICAgIGlmIChpTGVuIDw9IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYU1lTX21lbWNweShtX3BEYXRhICsgbV9pUG9zaXRpb24sIHBTdHIsIGlMZW4gKiAyKTsNCisgICAgbV9pUG9zaXRpb24gKz0gaUxlbiAqIDI7DQorICAgIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgew0KKyAgICAgICAgbV9pTGVuZ3RoID0gbV9pUG9zaXRpb247DQorICAgIH0NCisgICAgcmV0dXJuIGlMZW47DQorfQ0KK0lGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVRleHRTdHJlYW0oSUZYX1N0cmVhbSAqcEJhc2VTdHJlYW0sIEZYX0JPT0wgYkRlbGV0ZU9uUmVsZWFzZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwQmFzZVN0cmVhbSAhPSBOVUxMKTsNCisgICAgcmV0dXJuIEZYX05FVyBDRlhfVGV4dFN0cmVhbShwQmFzZVN0cmVhbSwgYkRlbGV0ZU9uUmVsZWFzZSk7DQorfQ0KK0NGWF9UZXh0U3RyZWFtOjpDRlhfVGV4dFN0cmVhbShJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJEZWxTdHJlYW0pDQorICAgIDogbV93Q29kZVBhZ2UoRlhfQ09ERVBBR0VfRGVmQU5TSSkNCisgICAgLCBtX3dCT01MZW5ndGgoMCkNCisgICAgLCBtX2R3Qk9NKDApDQorICAgICwgbV9wQnVmKE5VTEwpDQorICAgICwgbV9pQnVmU2l6ZSgwKQ0KKyAgICAsIG1fYkRlbFN0cmVhbShiRGVsU3RyZWFtKQ0KKyAgICAsIG1fcFN0cmVhbUltcChwU3RyZWFtKQ0KKyAgICAsIG1faVJlZkNvdW50KDEpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wU3RyZWFtSW1wICE9IE5VTEwpOw0KKyAgICBtX3BTdHJlYW1JbXAtPlJldGFpbigpOw0KKyAgICBJbml0U3RyZWFtKCk7DQorfQ0KK0NGWF9UZXh0U3RyZWFtOjp+Q0ZYX1RleHRTdHJlYW0oKQ0KK3sNCisgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgIGlmIChtX2JEZWxTdHJlYW0pIHsNCisgICAgICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIGlmIChtX3BCdWYgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX3BCdWYpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1RleHRTdHJlYW06OkluaXRTdHJlYW0oKQ0KK3sNCisgICAgRlhfSU5UMzIgaVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KKyAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgMCk7DQorICAgIG1fcFN0cmVhbUltcC0+UmVhZERhdGEoKEZYX0xQQllURSkmbV9kd0JPTSwgMyk7DQorI2lmIF9GWF9FTkRJQU5fID09IF9GWF9MSVRUTEVfRU5ESUFOXw0KKyAgICBtX2R3Qk9NICY9IDB4MDBGRkZGRkY7DQorICAgIGlmIChtX2R3Qk9NID09IDB4MDBCRkJCRUYpIHsNCisgICAgICAgIG1fd0JPTUxlbmd0aCA9IDM7DQorICAgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2R3Qk9NICY9IDB4MDAwMEZGRkY7DQorICAgICAgICBpZiAobV9kd0JPTSA9PSAweDAwMDBGRkZFKSB7DQorICAgICAgICAgICAgbV93Qk9NTGVuZ3RoID0gMjsNCisgICAgICAgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjE2QkU7DQorICAgICAgICB9IGVsc2UgaWYgKG1fZHdCT00gPT0gMHgwMDAwRkVGRikgew0KKyAgICAgICAgICAgIG1fd0JPTUxlbmd0aCA9IDI7DQorICAgICAgICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3dCT01MZW5ndGggPSAwOw0KKyAgICAgICAgICAgIG1fZHdCT00gPSAwOw0KKyAgICAgICAgICAgIG1fd0NvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7DQorICAgICAgICB9DQorICAgIH0NCisjZWxzZQ0KKyAgICBtX2R3Qk9NICY9IDB4RkZGRkZGMDA7DQorICAgIGlmIChtX2R3Qk9NID09IDB4RUZCQkJGMDApIHsNCisgICAgICAgIG1fd0JPTUxlbmd0aCA9IDM7DQorICAgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2R3Qk9NICY9IDB4RkZGRjAwMDA7DQorICAgICAgICBpZiAobV9kd0JPTSA9PSAweEZFRkYwMDAwKSB7DQorICAgICAgICAgICAgbV93Qk9NTGVuZ3RoID0gMjsNCisgICAgICAgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjE2QkU7DQorICAgICAgICB9IGVsc2UgaWYgKG1fZHdCT00gPT0gMHhGRkZFMDAwMCkgew0KKyAgICAgICAgICAgIG1fd0JPTUxlbmd0aCA9IDI7DQorICAgICAgICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3dCT01MZW5ndGggPSAwOw0KKyAgICAgICAgICAgIG1fZHdCT00gPSAwOw0KKyAgICAgICAgICAgIG1fd0NvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7DQorICAgICAgICB9DQorICAgIH0NCisjZW5kaWYNCisgICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIEZYX01BWChtX3dCT01MZW5ndGgsIGlQb3NpdGlvbikpOw0KK30NCit2b2lkIENGWF9UZXh0U3RyZWFtOjpSZWxlYXNlKCkNCit7DQorICAgIGlmICgtLW1faVJlZkNvdW50IDwgMSkgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCit9DQorSUZYX1N0cmVhbSogQ0ZYX1RleHRTdHJlYW06OlJldGFpbigpDQorew0KKyAgICBtX2lSZWZDb3VudCsrOw0KKyAgICByZXR1cm4gdGhpczsNCit9DQorRlhfRFdPUkQgQ0ZYX1RleHRTdHJlYW06OkdldEFjY2Vzc01vZGVzKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPkdldEFjY2Vzc01vZGVzKCkgfCBGWF9TVFJFQU1BQ0NFU1NfVGV4dDsNCit9DQorRlhfSU5UMzIgQ0ZYX1RleHRTdHJlYW06OkdldExlbmd0aCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCit9DQorRlhfSU5UMzIgQ0ZYX1RleHRTdHJlYW06OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgRlhfSU5UMzIgaU9mZnNldCkNCit7DQorICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPlNlZWsoZVNlZWssIGlPZmZzZXQpOw0KK30NCitGWF9JTlQzMiBDRlhfVGV4dFN0cmVhbTo6R2V0UG9zaXRpb24oKQ0KK3sNCisgICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCit9DQorRlhfQk9PTCBDRlhfVGV4dFN0cmVhbTo6SXNFT0YoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+SXNFT0YoKTsNCit9DQorRlhfSU5UMzIgQ0ZYX1RleHRTdHJlYW06OlJlYWREYXRhKEZYX0xQQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkNCit7DQorICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKHBCdWZmZXIsIGlCdWZmZXJTaXplKTsNCit9DQorRlhfSU5UMzIgQ0ZYX1RleHRTdHJlYW06OldyaXRlRGF0YShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+V3JpdGVEYXRhKHBCdWZmZXIsIGlCdWZmZXJTaXplKTsNCit9DQordm9pZCBDRlhfVGV4dFN0cmVhbTo6Rmx1c2goKQ0KK3sNCisgICAgbV9wU3RyZWFtSW1wLT5GbHVzaCgpOw0KK30NCitGWF9CT09MIENGWF9UZXh0U3RyZWFtOjpTZXRMZW5ndGgoRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPlNldExlbmd0aChpTGVuZ3RoKTsNCit9DQorRlhfV09SRCBDRlhfVGV4dFN0cmVhbTo6R2V0Q29kZVBhZ2UoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fd0NvZGVQYWdlOw0KK30NCitJRlhfU3RyZWFtKiBDRlhfVGV4dFN0cmVhbTo6Q3JlYXRlU2hhcmVkU3RyZWFtKEZYX0RXT1JEIGR3QWNjZXNzLCBGWF9JTlQzMiBpT2Zmc2V0LCBGWF9JTlQzMiBpTGVuZ3RoKQ0KK3sNCisgICAgSUZYX1N0cmVhbSAqcFNSID0gbV9wU3RyZWFtSW1wLT5DcmVhdGVTaGFyZWRTdHJlYW0oZHdBY2Nlc3MsIGlPZmZzZXQsIGlMZW5ndGgpOw0KKyAgICBpZiAocFNSID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgICAgICBJRlhfU3RyZWFtICpwVFIgPSBGWF9ORVcgQ0ZYX1RleHRTdHJlYW0ocFNSLCBUUlVFKTsNCisgICAgICAgIGlmIChwVFIgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBUUjsNCisgICAgfQ0KKyAgICByZXR1cm4gcFNSOw0KK30NCitGWF9JTlQzMiBDRlhfVGV4dFN0cmVhbTo6R2V0Qk9NKEZYX0JZVEUgYm9tWzRdKSBjb25zdA0KK3sNCisgICAgaWYgKG1fd0JPTUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgICooRlhfRFdPUkQqKWJvbSA9IG1fZHdCT007DQorICAgIHJldHVybiAoRlhfSU5UMzIpbV93Qk9NTGVuZ3RoOw0KK30NCitGWF9XT1JEIENGWF9UZXh0U3RyZWFtOjpTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSkNCit7DQorICAgIGlmIChtX3dCT01MZW5ndGggPiAwKSB7DQorICAgICAgICByZXR1cm4gbV93Q29kZVBhZ2U7DQorICAgIH0NCisgICAgRlhfV09SRCB2ID0gbV93Q29kZVBhZ2U7DQorICAgIG1fd0NvZGVQYWdlID0gd0NvZGVQYWdlOw0KKyAgICByZXR1cm4gdjsNCit9DQorRlhfSU5UMzIgQ0ZYX1RleHRTdHJlYW06OlJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIEZYX0lOVDMyIGNvbnN0ICpwQnl0ZVNpemUpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxlbjsNCisgICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUgfHwgbV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUJ5dGVzID0gcEJ5dGVTaXplID09IE5VTEwgPyBpTWF4TGVuZ3RoICogMiA6ICpwQnl0ZVNpemU7DQorICAgICAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKChGWF9MUEJZVEUpcFN0ciwgaUJ5dGVzKTsNCisgICAgICAgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQorICAgICAgICBpTWF4TGVuZ3RoID0gaUxlbiAvIDI7DQorICAgICAgICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA+IDIpIHsNCisgICAgICAgICAgICBGWF9VVEYxNlRvV0NoYXIocFN0ciwgaU1heExlbmd0aCk7DQorICAgICAgICB9DQorI2lmIF9GWF9FTkRJQU5fID09IF9GWF9CSUdfRU5ESUFOXw0KKyAgICAgICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsNCisgICAgICAgICAgICBGWF9Td2FwQnl0ZU9yZGVyKHBTdHIsIGlNYXhMZW5ndGgpOw0KKyAgICAgICAgfQ0KKyNlbHNlDQorICAgICAgICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICAgICAgICAgIEZYX1N3YXBCeXRlT3JkZXIocFN0ciwgaU1heExlbmd0aCk7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9JTlQzMiBwb3MgPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICAgICAgICBGWF9JTlQzMiBpQnl0ZXMgPSBwQnl0ZVNpemUgPT0gTlVMTCA/IGlNYXhMZW5ndGggOiAqcEJ5dGVTaXplOw0KKyAgICAgICAgaUJ5dGVzID0gRlhfTUlOKGlCeXRlcywgbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKSAtIHBvcyk7DQorICAgICAgICBpZiAoaUJ5dGVzID4gMCkgew0KKyAgICAgICAgICAgIGlmIChtX3BCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBtX3BCdWYgPSAoRlhfTFBCWVRFKUZYX0FsbG9jKEZYX0JZVEUsIGlCeXRlcyk7DQorICAgICAgICAgICAgICAgIG1faUJ1ZlNpemUgPSBpQnl0ZXM7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpQnl0ZXMgPiBtX2lCdWZTaXplKSB7DQorICAgICAgICAgICAgICAgIG1fcEJ1ZiA9IChGWF9MUEJZVEUpRlhfUmVhbGxvYyhGWF9CWVRFLCBtX3BCdWYsIGlCeXRlcyk7DQorICAgICAgICAgICAgICAgIG1faUJ1ZlNpemUgPSBpQnl0ZXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KKyAgICAgICAgICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKG1fcEJ1ZiwgaUJ5dGVzKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpU3JjID0gaUxlbjsNCisgICAgICAgICAgICBGWF9JTlQzMiBpRGVjb2RlID0gRlhfRGVjb2RlU3RyaW5nKG1fd0NvZGVQYWdlLCAoRlhfTFBDU1RSKW1fcEJ1ZiwgJmlTcmMsIHBTdHIsICZpTWF4TGVuZ3RoLCBUUlVFKTsNCisgICAgICAgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19DdXJyZW50LCBpU3JjIC0gaUxlbik7DQorICAgICAgICAgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgICAgICAgICBpZiAoaURlY29kZSA8IDEpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaU1heExlbmd0aCA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgYkVPUyA9IG1fcFN0cmVhbUltcC0+SXNFT0YoKTsNCisgICAgcmV0dXJuIGlNYXhMZW5ndGg7DQorfQ0KK0ZYX0lOVDMyIENGWF9UZXh0U3RyZWFtOjpXcml0ZVN0cmluZyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgICAgaWYgKChtX3BTdHJlYW1JbXAtPkdldEFjY2Vzc01vZGVzKCkgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICAgICAgRlhfSU5UMzIgbGVuID0gaUxlbmd0aDsNCisgICAgICAgIENGWF9VVEY4RW5jb2RlciBlbmNvZGVyOw0KKyAgICAgICAgd2hpbGUgKGxlbiAtLSA+IDApIHsNCisgICAgICAgICAgICBlbmNvZGVyLklucHV0KCpwU3RyICsrKTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic1Jlc3VsdCA9IGVuY29kZXIuR2V0UmVzdWx0KCk7DQorICAgICAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgICAgIG1fcFN0cmVhbUltcC0+V3JpdGVEYXRhKChGWF9MUENCWVRFKWJzUmVzdWx0LkdldENTdHIoKSwgYnNSZXN1bHQuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgfQ0KKyAgICByZXR1cm4gaUxlbmd0aDsNCit9DQorQ0ZYX1N0cmVhbTo6Q0ZYX1N0cmVhbSgpDQorICAgIDogbV9lU3RyZWFtVHlwZShGWF9TUkVBTVRZUEVfVW5rbm93bikNCisgICAgLCBtX3BTdHJlYW1JbXAoTlVMTCkNCisgICAgLCBtX2R3QWNjZXNzKDApDQorICAgICwgbV9pVG90YWxTaXplKDApDQorICAgICwgbV9pUG9zaXRpb24oMCkNCisgICAgLCBtX2lTdGFydCgwKQ0KKyAgICAsIG1faUxlbmd0aCgwKQ0KKyAgICAsIG1faVJlZkNvdW50KDEpDQorew0KK30NCitDRlhfU3RyZWFtOjp+Q0ZYX1N0cmVhbSgpDQorew0KKyAgICBpZiAobV9lU3RyZWFtVHlwZSAhPSBGWF9TVFJFQU1UWVBFX1N0cmVhbSAmJiBtX3BTdHJlYW1JbXAgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRlhfU3RyZWFtOjpMb2FkRmlsZShGWF9MUENXU1RSIHBzelNyY0ZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2VzcykNCit7DQorICAgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBzelNyY0ZpbGVOYW1lID09IE5VTEwgfHwgRlhTWVNfd2NzbGVuKHBzelNyY0ZpbGVOYW1lKSA8IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BTdHJlYW1JbXAgPSBGWF9ORVcgQ0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gKChDRlhfRmlsZVN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEZpbGUocHN6U3JjRmlsZU5hbWUsIGR3QWNjZXNzKTsNCisgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9GaWxlOw0KKyAgICAgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICAgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfU3RyZWFtOjpMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KK3sNCisgICAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocEZpbGVSZWFkID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BTdHJlYW1JbXAgPSBGWF9ORVcgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKCk7DQorICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApLT5Mb2FkRmlsZVJlYWQocEZpbGVSZWFkLCBkd0FjY2Vzcyk7DQorICAgIGlmICghYlJldCkgew0KKyAgICAgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfRmlsZTsNCisgICAgICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEZpbGVXcml0ZShJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2VzcykNCit7DQorICAgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBGaWxlV3JpdGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fcFN0cmVhbUltcCA9IEZYX05FVyBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCk7DQorICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEZpbGVXcml0ZShwRmlsZVdyaXRlLCBkd0FjY2Vzcyk7DQorICAgIGlmICghYlJldCkgew0KKyAgICAgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfRmlsZTsNCisgICAgICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEJ1ZmZlcihGWF9MUEJZVEUgcERhdGEsIEZYX0lOVDMyIGlUb3RhbFNpemUsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KK3sNCisgICAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocERhdGEgPT0gTlVMTCB8fCBpVG90YWxTaXplIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fcFN0cmVhbUltcCA9IEZYX05FVyBDRlhfQnVmZmVyU3RyZWFtSW1wKCk7DQorICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ0ZYX0J1ZmZlclN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEJ1ZmZlcihwRGF0YSwgaVRvdGFsU2l6ZSwgZHdBY2Nlc3MpOw0KKyAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wU3RyZWFtSW1wID0gTlVMTDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fZVN0cmVhbVR5cGUgPSBGWF9TVFJFQU1UWVBFX0J1ZmZlcjsNCisgICAgICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9JTlQzMiBpRmlsZVNpemUsIEZYX0RXT1JEIGR3QWNjZXNzLCBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCkNCit7DQorICAgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKCFwQnVmZmVyUmVhZCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fcFN0cmVhbUltcCA9IEZYX05FVyBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDsNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gKChDRlhfQnVmZmVyUmVhZFN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgZHdBY2Nlc3MsIGJSZWxlYXNlQnVmZmVyUmVhZCk7DQorICAgIGlmICghYlJldCkgew0KKyAgICAgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfQnVmZmVyUmVhZDsNCisgICAgICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK3ZvaWQgQ0ZYX1N0cmVhbTo6UmVsZWFzZSgpDQorew0KKyAgICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorfQ0KK0lGWF9TdHJlYW0qIENGWF9TdHJlYW06OlJldGFpbigpDQorew0KKyAgICBtX2lSZWZDb3VudCsrOw0KKyAgICByZXR1cm4gdGhpczsNCit9DQorRlhfSU5UMzIgQ0ZYX1N0cmVhbTo6R2V0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfRmlsZSB8fCBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQorICAgICAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9pTGVuZ3RoOw0KK30NCitGWF9JTlQzMiBDRlhfU3RyZWFtOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpDQorew0KKyAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KKyAgICAgICAgcmV0dXJuIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5TZWVrKGVTZWVrLCBpT2Zmc2V0KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpRW5kID0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQorICAgIEZYX0lOVDMyIGlQb3NpdGlvbiA9IG1faVN0YXJ0ICsgaU9mZnNldDsNCisgICAgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQmVnaW4pIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gaVBvc2l0aW9uOw0KKyAgICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQ3VycmVudCkgew0KKyAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0VuZCkgew0KKyAgICAgICAgbV9pUG9zaXRpb24gPSBpRW5kICsgaU9mZnNldDsNCisgICAgfQ0KKyAgICBpZiAobV9pUG9zaXRpb24gPiBpRW5kKSB7DQorICAgICAgICBtX2lQb3NpdGlvbiA9IGlFbmQ7DQorICAgIH0NCisgICAgaWYgKG1faVBvc2l0aW9uIDwgbV9pU3RhcnQpIHsNCisgICAgICAgIG1faVBvc2l0aW9uID0gbV9pU3RhcnQ7DQorICAgIH0NCisgICAgcmV0dXJuIG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9TdHJlYW06OkdldFBvc2l0aW9uKCkNCit7DQorICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfRmlsZSB8fCBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQorICAgICAgICByZXR1cm4gbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICAgIH0NCisgICAgcmV0dXJuIG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6SXNFT0YoKSBjb25zdA0KK3sNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KKyAgICAgICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+SXNFT0YoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQorfQ0KK0ZYX0lOVDMyIENGWF9TdHJlYW06OlJlYWREYXRhKEZYX0xQQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxlbiA9IEZYX01JTihtX2lTdGFydCArIG1faUxlbmd0aCAtIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSk7DQorICAgIGlmIChpTGVuIDw9IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KKyAgICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQorICAgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KKyAgICB9DQorICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKHBCdWZmZXIsIGlMZW4pOw0KKyAgICBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCisgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgcmV0dXJuIGlMZW47DQorfQ0KK0ZYX0lOVDMyIENGWF9TdHJlYW06OlJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIEZYX0lOVDMyIGNvbnN0ICpwQnl0ZVNpemUpDQorew0KKyAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gaUVuZCAtIG1faVBvc2l0aW9uOw0KKyAgICBpZiAocEJ5dGVTaXplICE9IE5VTEwpIHsNCisgICAgICAgIGlMZW4gPSBGWF9NSU4oaUxlbiwgKnBCeXRlU2l6ZSk7DQorICAgIH0NCisgICAgaUxlbiA9IEZYX01JTihpRW5kIC8gMiwgaU1heExlbmd0aCk7DQorICAgIGlmIChpTGVuIDw9IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KKyAgICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQorICAgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KKyAgICB9DQorICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWRTdHJpbmcocFN0ciwgaUxlbiwgYkVPUyk7DQorICAgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KKyAgICBpZiAoaUxlbiA+IDAgJiYgbV9pUG9zaXRpb24gPj0gaUVuZCkgew0KKyAgICAgICAgYkVPUyA9IFRSVUU7DQorICAgIH0NCisgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgcmV0dXJuIGlMZW47DQorfQ0KK0ZYX0lOVDMyIENGWF9TdHJlYW06OldyaXRlRGF0YShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVuID0gaUJ1ZmZlclNpemU7DQorICAgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfU3RyZWFtKSB7DQorICAgICAgICBpTGVuID0gRlhfTUlOKG1faVN0YXJ0ICsgbV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCisgICAgICAgIGlmIChpTGVuIDw9IDApIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgRlhfSU5UMzIgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQorICAgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KKyAgICB9DQorICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YShwQnVmZmVyLCBpTGVuKTsNCisgICAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICAgIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsNCisgICAgICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQorICAgIH0NCisgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgcmV0dXJuIGlMZW47DQorfQ0KK0ZYX0lOVDMyIENGWF9TdHJlYW06OldyaXRlU3RyaW5nKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVuID0gaUxlbmd0aDsNCisgICAgaWYgKG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9TdHJlYW0pIHsNCisgICAgICAgIGlMZW4gPSBGWF9NSU4oKG1faVN0YXJ0ICsgbV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24pIC8gMiwgaUxlbmd0aCk7DQorICAgICAgICBpZiAoaUxlbiA8PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQorICAgIEZYX0lOVDMyIGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCisgICAgaWYgKG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKSAhPSBtX2lQb3NpdGlvbikgew0KKyAgICAgICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faVBvc2l0aW9uKTsNCisgICAgfQ0KKyAgICBpTGVuID0gbV9wU3RyZWFtSW1wLT5Xcml0ZVN0cmluZyhwU3RyLCBpTGVuKTsNCisgICAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICAgIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsNCisgICAgICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQorICAgIH0NCisgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgcmV0dXJuIGlMZW47DQorfQ0KK3ZvaWQgQ0ZYX1N0cmVhbTo6Rmx1c2goKQ0KK3sNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wU3RyZWFtSW1wLT5GbHVzaCgpOw0KK30NCitGWF9CT09MIENGWF9TdHJlYW06OlNldExlbmd0aChGWF9JTlQzMiBpTGVuZ3RoKQ0KK3sNCisgICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+U2V0TGVuZ3RoKGlMZW5ndGgpOw0KK30NCitGWF9JTlQzMiBDRlhfU3RyZWFtOjpHZXRCT00oRlhfQllURSBib21bNF0pIGNvbnN0DQorew0KKyAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQorRlhfV09SRCBDRlhfU3RyZWFtOjpHZXRDb2RlUGFnZSgpIGNvbnN0DQorew0KKyNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfTElUVExFX0VORElBTl8NCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX1VURjE2TEU7DQorI2Vsc2UNCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX1VURjE2QkU7DQorI2VuZGlmDQorfQ0KK0ZYX1dPUkQgQ0ZYX1N0cmVhbTo6U2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpDQorew0KKyNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfTElUVExFX0VORElBTl8NCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX1VURjE2TEU7DQorI2Vsc2UNCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX1VURjE2QkU7DQorI2VuZGlmDQorfQ0KK0lGWF9TdHJlYW0qIENGWF9TdHJlYW06OkNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywgRlhfSU5UMzIgaU9mZnNldCwgRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydCggaUxlbmd0aCA+IDApOw0KKyAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSAhPSAwICYmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDAgJiYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZWdpc3RlciBGWF9JTlQzMiBpU3RhcnQgPSBtX2lTdGFydCArIGlPZmZzZXQ7DQorICAgIHJlZ2lzdGVyIEZYX0lOVDMyIGlUb3RhbCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgICBpZiAoaVN0YXJ0IDwgbV9pU3RhcnQgfHwgaVN0YXJ0ID49IGlUb3RhbCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmVnaXN0ZXIgRlhfSU5UMzIgaUVuZCA9IGlTdGFydCArIGlMZW5ndGg7DQorICAgIGlmIChpRW5kIDwgaVN0YXJ0IHx8IGlFbmQgPiBpVG90YWwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9TdHJlYW0gKnBTaGFyZWQgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCisgICAgaWYgKHBTaGFyZWQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcFNoYXJlZC0+bV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfU3RyZWFtOw0KKyAgICBwU2hhcmVkLT5tX3BTdHJlYW1JbXAgPSBtX3BTdHJlYW1JbXA7DQorICAgIHBTaGFyZWQtPm1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgcFNoYXJlZC0+bV9pVG90YWxTaXplID0gaUxlbmd0aDsNCisgICAgcFNoYXJlZC0+bV9pUG9zaXRpb24gPSBpU3RhcnQ7DQorICAgIHBTaGFyZWQtPm1faVN0YXJ0ID0gaVN0YXJ0Ow0KKyAgICBwU2hhcmVkLT5tX2lMZW5ndGggPSAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDAgPyAwIDogaUxlbmd0aDsNCisgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgICAgIHJldHVybiBJRlhfU3RyZWFtOjpDcmVhdGVUZXh0U3RyZWFtKHBTaGFyZWQsIFRSVUUpOw0KKyAgICB9DQorICAgIHJldHVybiBwU2hhcmVkOw0KK30NCitJRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKElGWF9TdHJlYW0gKnBCYXNlU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCYXNlU3RyZWFtICE9IE5VTEwpOw0KKyAgICByZXR1cm4gRlhfTkVXIENGR0FTX0ZpbGVSZWFkKHBCYXNlU3RyZWFtLCBiUmVsZWFzZVN0cmVhbSk7DQorfQ0KKyNpZmRlZiBGWF9GSUxFU0laRQ0KK0NGR0FTX0ZpbGVSZWFkOjpDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fYlJlbGVhc2VTdHJlYW0oYlJlbGVhc2VTdHJlYW0pDQorICAgICwgbV9wU3RyZWFtKHBTdHJlYW0pDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwpOw0KK30NCitDRkdBU19GaWxlUmVhZDo6fkNGR0FTX0ZpbGVSZWFkKCkNCit7DQorICAgIGlmIChtX2JSZWxlYXNlU3RyZWFtKSB7DQorICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgfQ0KK30NCitGWF9GSUxFU0laRSBDRkdBU19GaWxlUmVhZDo6R2V0U2l6ZSgpDQorew0KKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVJlYWQ6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpDQorew0KKyAgICBtX3BTdHJlYW0tPkxvY2soKTsNCisgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIChGWF9JTlQzMilvZmZzZXQpOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gbV9wU3RyZWFtLT5SZWFkRGF0YSgoRlhfTFBCWVRFKWJ1ZmZlciwgKEZYX0lOVDMyKXNpemUpOw0KKyAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgICByZXR1cm4gaUxlbiA9PSAoRlhfSU5UMzIpc2l6ZTsNCit9DQorI2Vsc2UNCitDRkdBU19GaWxlUmVhZDo6Q0ZHQVNfRmlsZVJlYWQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSkNCisgICAgOiBtX2JSZWxlYXNlU3RyZWFtKGJSZWxlYXNlU3RyZWFtKQ0KKyAgICAsIG1fcFN0cmVhbShwU3RyZWFtKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVJlYWQ6On5DRkdBU19GaWxlUmVhZCgpDQorew0KKyAgICBpZiAobV9iUmVsZWFzZVN0cmVhbSkgew0KKyAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgIH0NCit9DQorRlhfRFdPUkQgQ0ZHQVNfRmlsZVJlYWQ6OkdldFNpemUoKQ0KK3sNCisgICAgcmV0dXJuIChGWF9EV09SRCltX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KK30NCitGWF9CT09MIENGR0FTX0ZpbGVSZWFkOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9EV09SRCBvZmZzZXQsIEZYX0RXT1JEIHNpemUpDQorew0KKyAgICBtX3BTdHJlYW0tPkxvY2soKTsNCisgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIChGWF9JTlQzMilvZmZzZXQpOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gbV9wU3RyZWFtLT5SZWFkRGF0YSgoRlhfTFBCWVRFKWJ1ZmZlciwgKEZYX0lOVDMyKXNpemUpOw0KKyAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgICByZXR1cm4gaUxlbiA9PSAoRlhfSU5UMzIpc2l6ZTsNCit9DQorI2VuZGlmDQorI2lmZGVmIEZYX0ZJTEVTSVpFDQorSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlclJlYWQsIEZYX0ZJTEVTSVpFIGlGaWxlU2l6ZSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSkNCit7DQorICAgIGlmICghcEJ1ZmZlclJlYWQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9ORVcgQ0ZYX0J1ZmZlckFjY0ltcChwQnVmZmVyUmVhZCwgaUZpbGVTaXplLCBiUmVsZWFzZVN0cmVhbSk7DQorfQ0KK0NGWF9CdWZmZXJBY2NJbXA6OkNGWF9CdWZmZXJBY2NJbXAoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9GSUxFU0laRSBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQorICAgIDogbV9wQnVmZmVyUmVhZChwQnVmZmVyUmVhZCkNCisgICAgLCBtX2JSZWxlYXNlU3RyZWFtKGJSZWxlYXNlU3RyZWFtKQ0KKyAgICAsIG1faUJ1ZlNpemUoaUZpbGVTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQpOw0KK30NCitDRlhfQnVmZmVyQWNjSW1wOjp+Q0ZYX0J1ZmZlckFjY0ltcCgpDQorew0KKyAgICBpZiAobV9iUmVsZWFzZVN0cmVhbSAmJiBtX3BCdWZmZXJSZWFkKSB7DQorICAgICAgICBtX3BCdWZmZXJSZWFkLT5SZWxlYXNlKCk7DQorICAgIH0NCit9DQorRlhfRklMRVNJWkUgQ0ZYX0J1ZmZlckFjY0ltcDo6R2V0U2l6ZSgpDQorew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmIChtX2lCdWZTaXplID49IDApCXsNCisgICAgICAgIHJldHVybiBtX2lCdWZTaXplOw0KKyAgICB9DQorICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgbV9pQnVmU2l6ZSA9IChGWF9GSUxFU0laRSltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgd2hpbGUgKCFtX3BCdWZmZXJSZWFkLT5Jc0VPRigpKSB7DQorICAgICAgICBtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKTsNCisgICAgICAgIG1faUJ1ZlNpemUgKz0gKEZYX0ZJTEVTSVpFKW1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiBtX2lCdWZTaXplOw0KK30NCitGWF9CT09MIENGWF9CdWZmZXJBY2NJbXA6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpDQorew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkJew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhfRklMRVNJWkUgZHdCdWZTaXplID0gR2V0U2l6ZSgpOw0KKyAgICBpZiAob2Zmc2V0ID49IGR3QnVmU2l6ZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHNpemVfdCBkd0Jsb2NrU2l6ZQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBGWF9GSUxFU0laRSBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgaWYgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQpIHsNCisgICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGR3QmxvY2tTaXplCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICAgICAgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgIH0NCisgICAgd2hpbGUgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQgfHwgb2Zmc2V0ID49IChGWF9GSUxFU0laRSkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KKyAgICAgICAgaWYgKG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgfHwgIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkd0Jsb2NrU2l6ZQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICB9DQorICAgIGlmIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0IHx8IG9mZnNldCA+PSAoRlhfRklMRVNJWkUpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9MUENCWVRFIHBCdWZmZXIJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgICAgRlhfRklMRVNJWkUgZHdPZmZzZXQJCT0gb2Zmc2V0IC0gZHdCbG9ja09mZnNldDsNCisgICAgc2l6ZV90IGR3Q29weVNpemUJCT0gRlhfTUlOKHNpemUsIGR3QmxvY2tTaXplIC0gZHdPZmZzZXQpOw0KKyAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBwQnVmZmVyICsgZHdPZmZzZXQsIGR3Q29weVNpemUpOw0KKyAgICBvZmZzZXQgPSBkd0NvcHlTaXplOw0KKyAgICBzaXplIC09IGR3Q29weVNpemU7DQorICAgIHdoaWxlIChzaXplKSB7DQorICAgICAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgICAgIGR3QmxvY2tTaXplCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICAgICAgcEJ1ZmZlcgkJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgICAgICAgIGR3Q29weVNpemUJCT0gRlhfTUlOKHNpemUsIGR3QmxvY2tTaXplKTsNCisgICAgICAgIEZYU1lTX21lbWNweSgoKEZYX0xQQllURSlidWZmZXIpICsgb2Zmc2V0LCBwQnVmZmVyLCBkd0NvcHlTaXplKTsNCisgICAgICAgIG9mZnNldAkrPSBkd0NvcHlTaXplOw0KKyAgICAgICAgc2l6ZQktPSBkd0NvcHlTaXplOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCisjZWxzZQ0KK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9JTlQzMiBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQorew0KKyAgICBpZiAoIXBCdWZmZXJSZWFkKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfTkVXIENGWF9CdWZmZXJBY2NJbXAocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgYlJlbGVhc2VTdHJlYW0pOw0KK30NCitDRlhfQnVmZmVyQWNjSW1wOjpDRlhfQnVmZmVyQWNjSW1wKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyUmVhZCwgRlhfSU5UMzIgaUZpbGVTaXplLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fcEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQpDQorICAgICwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkNCisgICAgLCBtX2lCdWZTaXplKGlGaWxlU2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkKTsNCit9DQorQ0ZYX0J1ZmZlckFjY0ltcDo6fkNGWF9CdWZmZXJBY2NJbXAoKQ0KK3sNCisgICAgaWYgKG1fYlJlbGVhc2VTdHJlYW0gJiYgbV9wQnVmZmVyUmVhZCkgew0KKyAgICAgICAgbV9wQnVmZmVyUmVhZC0+UmVsZWFzZSgpOw0KKyAgICB9DQorfQ0KK0ZYX0RXT1JEIENGWF9CdWZmZXJBY2NJbXA6OkdldFNpemUoKQ0KK3sNCisgICAgaWYgKCFtX3BCdWZmZXJSZWFkKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAobV9pQnVmU2l6ZSA+PSAwKQl7DQorICAgICAgICByZXR1cm4gbV9pQnVmU2l6ZTsNCisgICAgfQ0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIG1faUJ1ZlNpemUgPSAoRlhfRFdPUkQpbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgIHdoaWxlICghbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSkgew0KKyAgICAgICAgbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSk7DQorICAgICAgICBtX2lCdWZTaXplICs9IChGWF9EV09SRCltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9pQnVmU2l6ZTsNCit9DQorRlhfQk9PTCBDRlhfQnVmZmVyQWNjSW1wOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9EV09SRCBvZmZzZXQsIEZYX0RXT1JEIHNpemUpDQorew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkJew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdCdWZTaXplID0gR2V0U2l6ZSgpOw0KKyAgICBpZiAob2Zmc2V0ID49IGR3QnVmU2l6ZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHNpemVfdCBkd0Jsb2NrU2l6ZQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBGWF9EV09SRCBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgaWYgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQpIHsNCisgICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGR3QmxvY2tTaXplCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICAgICAgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgIH0NCisgICAgd2hpbGUgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQgfHwgb2Zmc2V0ID49IChGWF9EV09SRCkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KKyAgICAgICAgaWYgKG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgfHwgIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkd0Jsb2NrU2l6ZQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICB9DQorICAgIGlmIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0IHx8IG9mZnNldCA+PSAoRlhfRFdPUkQpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9MUENCWVRFIHBCdWZmZXIJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgICAgRlhfRFdPUkQgZHdPZmZzZXQJCT0gb2Zmc2V0IC0gZHdCbG9ja09mZnNldDsNCisgICAgRlhfRFdPUkQgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUgLSBkd09mZnNldCk7DQorICAgIEZYU1lTX21lbWNweShidWZmZXIsIHBCdWZmZXIgKyBkd09mZnNldCwgZHdDb3B5U2l6ZSk7DQorICAgIG9mZnNldCA9IGR3Q29weVNpemU7DQorICAgIHNpemUgLT0gZHdDb3B5U2l6ZTsNCisgICAgd2hpbGUgKHNpemUpIHsNCisgICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgICAgICBwQnVmZmVyCQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KKyAgICAgICAgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUpOw0KKyAgICAgICAgRlhTWVNfbWVtY3B5KCgoRlhfTFBCWVRFKWJ1ZmZlcikgKyBvZmZzZXQsIHBCdWZmZXIsIGR3Q29weVNpemUpOw0KKyAgICAgICAgb2Zmc2V0CSs9IGR3Q29weVNpemU7DQorICAgICAgICBzaXplCS09IGR3Q29weVNpemU7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KKyNlbmRpZg0KK0lGWF9GaWxlV3JpdGUqCUZYX0NyZWF0ZUZpbGVXcml0ZShJRlhfU3RyZWFtICpwQmFzZVN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwQmFzZVN0cmVhbSAhPSBOVUxMKTsNCisgICAgcmV0dXJuIEZYX05FVyBDRkdBU19GaWxlV3JpdGUocEJhc2VTdHJlYW0sIGJSZWxlYXNlU3RyZWFtKTsNCit9DQorI2lmZGVmIEZYX0ZJTEVTSVpFDQorQ0ZHQVNfRmlsZVdyaXRlOjpDRkdBU19GaWxlV3JpdGUoSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSkNCisgICAgOiBtX3BTdHJlYW0ocFN0cmVhbSkNCisgICAgLCBtX2JSZWxlYXNlU3RyZWFtKGJSZWxlYXNlU3RyZWFtKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVdyaXRlOjp+Q0ZHQVNfRmlsZVdyaXRlKCkNCit7DQorICAgIGlmIChtX2JSZWxlYXNlU3RyZWFtKSB7DQorICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgfQ0KK30NCitGWF9GSUxFU0laRSBDRkdBU19GaWxlV3JpdGU6OkdldFNpemUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpGbHVzaCgpDQorew0KKyAgICBtX3BTdHJlYW0tPkZsdXNoKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGR0FTX0ZpbGVXcml0ZTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgICByZXR1cm4gbV9wU3RyZWFtLT5Xcml0ZURhdGEoKEZYX0xQQ0JZVEUpcERhdGEsIChGWF9JTlQzMilzaXplKSA9PSAoRlhfSU5UMzIpc2l6ZTsNCit9DQorRlhfQk9PTCBDRkdBU19GaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpDQorew0KKyAgICBtX3BTdHJlYW0tPkxvY2soKTsNCisgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG9mZnNldCk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSBtX3BTdHJlYW0tPldyaXRlRGF0YSgoRlhfTFBCWVRFKXBEYXRhLCAoRlhfSU5UMzIpc2l6ZSk7DQorICAgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICAgIHJldHVybiBpTGVuID09IChGWF9JTlQzMilzaXplOw0KK30NCisjZWxzZQ0KK0NGR0FTX0ZpbGVXcml0ZTo6Q0ZHQVNfRmlsZVdyaXRlKElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQorICAgIDogbV9wU3RyZWFtKHBTdHJlYW0pDQorICAgICwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BTdHJlYW0gIT0gTlVMTCk7DQorfQ0KK0NGR0FTX0ZpbGVXcml0ZTo6fkNGR0FTX0ZpbGVXcml0ZSgpDQorew0KKyAgICBpZiAobV9iUmVsZWFzZVN0cmVhbSkgew0KKyAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgIH0NCit9DQorRlhfRFdPUkQgQ0ZHQVNfRmlsZVdyaXRlOjpHZXRTaXplKCkNCit7DQorICAgIHJldHVybiBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KK30NCitGWF9EV09SRCBDRkdBU19GaWxlV3JpdGU6OkZsdXNoKCkNCit7DQorICAgIG1fcFN0cmVhbS0+Rmx1c2goKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9EV09SRCBzaXplKQ0KK3sNCisgICAgcmV0dXJuIG1fcFN0cmVhbS0+V3JpdGVEYXRhKChGWF9MUENCWVRFKXBEYXRhLCAoRlhfSU5UMzIpc2l6ZSkgPT0gKEZYX0lOVDMyKXNpemU7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9EV09SRCBvZmZzZXQsIEZYX0RXT1JEIHNpemUpDQorew0KKyAgICBtX3BTdHJlYW0tPkxvY2soKTsNCisgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG9mZnNldCk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSBtX3BTdHJlYW0tPldyaXRlRGF0YSgoRlhfTFBCWVRFKXBEYXRhLCAoRlhfSU5UMzIpc2l6ZSk7DQorICAgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICAgIHJldHVybiBpTGVuID09IChGWF9JTlQzMilzaXplOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zdHJlYW0uaCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGEwZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zdHJlYW0uaApAQCAtMCwwICsxLDQwNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9TVFJFQU1fSU1QDQorI2RlZmluZSBfRlhfU1RSRUFNX0lNUA0KK2NsYXNzIENGWF9TdHJlYW1JbXA7DQorY2xhc3MgQ0ZYX0ZpbGVTdHJlYW1JbXA7DQorY2xhc3MgQ0ZYX0J1ZmZlclN0cmVhbUltcDsNCitjbGFzcyBDRlhfRmlsZVJlYWRTdHJlYW1JbXA7DQorY2xhc3MgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA7DQorY2xhc3MgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDsNCitjbGFzcyBDRlhfU3RyZWFtOw0KK2NsYXNzIENGWF9UZXh0U3RyZWFtOw0KK2NsYXNzIENGWF9GaWxlUmVhZDsNCitjbGFzcyBDRlhfRmlsZVdyaXRlOw0KK2NsYXNzIENGWF9CdWZmZXJBY2NJbXA7DQorY2xhc3MgQ0ZYX1N0cmVhbUltcCA6IHB1YmxpYyBDRlhfVGhyZWFkTG9jaywgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0QWNjZXNzTW9kZXMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd0FjY2VzczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRMZW5ndGgoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgRlhfSU5UMzIgaU9mZnNldCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRQb3NpdGlvbigpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVJlYWREYXRhKEZYX0xQQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlSZWFkU3RyaW5nKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlRGF0YShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlU3RyaW5nKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlGbHVzaCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TGVuZ3RoKEZYX0lOVDMyIGlMZW5ndGgpID0gMDsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9TdHJlYW1JbXAoKTsNCisgICAgdmlydHVhbCB+Q0ZYX1N0cmVhbUltcCgpIHt9DQorICAgIEZYX0RXT1JECQkJCW1fZHdBY2Nlc3M7DQorfTsNCitjbGFzcyBDRlhfRmlsZVN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCisgICAgdmlydHVhbCB+Q0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGaWxlKEZYX0xQQ1dTVFIgcHN6U3JjRmlsZU5hbWUsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0TGVuZ3RoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgRlhfSU5UMzIgaU9mZnNldCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldFBvc2l0aW9uKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVJlYWREYXRhKEZYX0xQQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlXcml0ZURhdGEoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlU3RyaW5nKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUZsdXNoKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldExlbmd0aChGWF9JTlQzMiBpTGVuZ3RoKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYU1lTX0ZJTEUJKm1faEZpbGU7DQorICAgIEZYX0lOVDMyCW1faUxlbmd0aDsNCit9Ow0KK2NsYXNzIENGWF9CdWZmZXJTdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1N0cmVhbUltcA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9CdWZmZXJTdHJlYW1JbXAoKTsNCisgICAgdmlydHVhbCB+Q0ZYX0J1ZmZlclN0cmVhbUltcCgpIHt9DQorICAgIEZYX0JPT0wJCQlMb2FkQnVmZmVyKEZYX0xQQllURSBwRGF0YSwgRlhfSU5UMzIgaVRvdGFsU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRMZW5ndGgoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBGWF9JTlQzMiBpT2Zmc2V0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0UG9zaXRpb24oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUmVhZFN0cmluZyhGWF9MUFdTVFIgcFN0ciwgRlhfSU5UMzIgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUyk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlRGF0YShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJV3JpdGVTdHJpbmcoRlhfTFBDV1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJRmx1c2goKSB7fQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRMZW5ndGgoRlhfSU5UMzIgaUxlbmd0aCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorcHJvdGVjdGVkOg0KKyAgICBGWF9MUEJZVEUJbV9wRGF0YTsNCisgICAgRlhfSU5UMzIJbV9pVG90YWxTaXplOw0KKyAgICBGWF9JTlQzMgltX2lQb3NpdGlvbjsNCisgICAgRlhfSU5UMzIJbV9pTGVuZ3RoOw0KK307DQorY2xhc3MgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wIDogcHVibGljIENGWF9TdHJlYW1JbXANCit7DQorcHVibGljOg0KKyAgICBDRlhfRmlsZVJlYWRTdHJlYW1JbXAoKTsNCisgICAgdmlydHVhbCB+Q0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKCkge30NCisgICAgRlhfQk9PTAkJCUxvYWRGaWxlUmVhZChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRMZW5ndGgoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBGWF9JTlQzMiBpT2Zmc2V0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0UG9zaXRpb24oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pUG9zaXRpb247DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBjb25zdDsNCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUmVhZFN0cmluZyhGWF9MUFdTVFIgcFN0ciwgRlhfSU5UMzIgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUyk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlRGF0YShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlXcml0ZVN0cmluZyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCUZsdXNoKCkge30NCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TGVuZ3RoKEZYX0lOVDMyIGlMZW5ndGgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgSUZYX0ZpbGVSZWFkCQkJKm1fcEZpbGVSZWFkOw0KKyAgICBGWF9JTlQzMgkJCQltX2lQb3NpdGlvbjsNCisgICAgRlhfSU5UMzIJCQkJbV9pTGVuZ3RoOw0KK307DQorY2xhc3MgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1N0cmVhbUltcA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wKCk7DQorICAgIH5DRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpOw0KKyAgICBGWF9CT09MCQkJTG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9JTlQzMiBpRmlsZVNpemUsIEZYX0RXT1JEIGR3QWNjZXNzLCBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCk7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRQb3NpdGlvbigpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlSZWFkRGF0YShGWF9MUEJZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlSZWFkU3RyaW5nKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJV3JpdGVEYXRhKEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlU3RyaW5nKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJRmx1c2goKSB7fQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRMZW5ndGgoRlhfSU5UMzIgaUxlbmd0aCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgSUZYX0J1ZmZlclJlYWQJCQkqbV9wQnVmZmVyUmVhZDsNCisgICAgRlhfQk9PTAkJCQkJbV9iUmVsZWFzZUJ1ZmZlclJlYWQ7DQorICAgIEZYX0lOVDMyCQkJCW1faVBvc2l0aW9uOw0KKyAgICBGWF9JTlQzMgkJCQltX2lCdWZmZXJTaXplOw0KK307DQorY2xhc3MgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCgpOw0KKyAgICB2aXJ0dWFsIH5DRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCkge30NCisgICAgRlhfQk9PTAkJCUxvYWRGaWxlV3JpdGUoSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRMZW5ndGgoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBGWF9JTlQzMiBpT2Zmc2V0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0UG9zaXRpb24oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9pUG9zaXRpb247DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlSZWFkU3RyaW5nKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlXcml0ZURhdGEoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVdyaXRlU3RyaW5nKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUZsdXNoKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldExlbmd0aChGWF9JTlQzMiBpTGVuZ3RoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIElGWF9GaWxlV3JpdGUJCQkqbV9wRmlsZVdyaXRlOw0KKyAgICBGWF9JTlQzMgkJCQltX2lQb3NpdGlvbjsNCit9Ow0KK2VudW0gRlhfU1RSRUFNVFlQRSB7DQorICAgIEZYX1NSRUFNVFlQRV9Vbmtub3duCT0gIDAsDQorICAgIEZYX1NUUkVBTVRZUEVfRmlsZQkJCSwNCisgICAgRlhfU1RSRUFNVFlQRV9CdWZmZXIJCSwNCisgICAgRlhfU1RSRUFNVFlQRV9TdHJlYW0JCSwNCisgICAgRlhfU1RSRUFNVFlQRV9CdWZmZXJSZWFkCSwNCit9Ow0KK2NsYXNzIENGWF9TdHJlYW0gOiBwdWJsaWMgSUZYX1N0cmVhbSwgcHVibGljIENGWF9UaHJlYWRMb2NrLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9TdHJlYW0oKTsNCisgICAgfkNGWF9TdHJlYW0oKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGaWxlKEZYX0xQQ1dTVFIgcHN6U3JjRmlsZU5hbWUsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgICAgRlhfQk9PTAkJCUxvYWRCdWZmZXIoRlhfTFBCWVRFIHBEYXRhLCBGWF9JTlQzMiBpVG90YWxTaXplLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICAgIEZYX0JPT0wJCQlMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGaWxlV3JpdGUoSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgICBGWF9CT09MCQkJTG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9JTlQzMiBpRmlsZVNpemUsIEZYX0RXT1JEIGR3QWNjZXNzLCBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBJRlhfU3RyZWFtKgkJUmV0YWluKCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEFjY2Vzc01vZGVzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZHdBY2Nlc3M7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0TGVuZ3RoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgRlhfSU5UMzIgaU9mZnNldCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldFBvc2l0aW9uKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVJlYWREYXRhKEZYX0xQQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpQnVmZmVyU2l6ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVJlYWRTdHJpbmcoRlhfTFBXU1RSIHBTdHIsIEZYX0lOVDMyIGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIEZYX0lOVDMyIGNvbnN0ICpwQnl0ZVNpemUgPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJV3JpdGVEYXRhKEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlXcml0ZVN0cmluZyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlGbHVzaCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRMZW5ndGgoRlhfSU5UMzIgaUxlbmd0aCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEJPTShGWF9CWVRFIGJvbVs0XSkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCUdldENvZGVQYWdlKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCVNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJTG9jaygpDQorICAgIHsNCisgICAgICAgIENGWF9UaHJlYWRMb2NrOjpMb2NrKCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJVW5sb2NrKCkNCisgICAgew0KKyAgICAgICAgQ0ZYX1RocmVhZExvY2s6OlVubG9jaygpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZYX1N0cmVhbSoJCUNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywgRlhfSU5UMzIgaU9mZnNldCwgRlhfSU5UMzIgaUxlbmd0aCk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9TVFJFQU1UWVBFCQkJbV9lU3RyZWFtVHlwZTsNCisgICAgQ0ZYX1N0cmVhbUltcAkJCSptX3BTdHJlYW1JbXA7DQorICAgIEZYX0RXT1JECQkJCW1fZHdBY2Nlc3M7DQorICAgIEZYX0lOVDMyCQkJCW1faVRvdGFsU2l6ZTsNCisgICAgRlhfSU5UMzIJCQkJbV9pUG9zaXRpb247DQorICAgIEZYX0lOVDMyCQkJCW1faVN0YXJ0Ow0KKyAgICBGWF9JTlQzMgkJCQltX2lMZW5ndGg7DQorICAgIEZYX0lOVDMyCQkJCW1faVJlZkNvdW50Ow0KK307DQorY2xhc3MgQ0ZYX1RleHRTdHJlYW0gOiBwdWJsaWMgSUZYX1N0cmVhbSwgcHVibGljIENGWF9UaHJlYWRMb2NrLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9UZXh0U3RyZWFtKElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0JPT0wgYkRlbFN0cmVhbSk7DQorICAgIH5DRlhfVGV4dFN0cmVhbSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQkJUmV0YWluKCk7DQorDQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQlHZXRBY2Nlc3NNb2RlcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0TGVuZ3RoKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0UG9zaXRpb24oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlSZWFkRGF0YShGWF9MUEJZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJUmVhZFN0cmluZyhGWF9MUFdTVFIgcFN0ciwgRlhfSU5UMzIgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUywgRlhfSU5UMzIgY29uc3QgKnBCeXRlU2l6ZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJV3JpdGVEYXRhKEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJV3JpdGVTdHJpbmcoRlhfTFBDV1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCUZsdXNoKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRMZW5ndGgoRlhfSU5UMzIgaUxlbmd0aCk7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRCT00oRlhfQllURSBib21bNF0pIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJR2V0Q29kZVBhZ2UoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9XT1JECQkJCVNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCUxvY2soKQ0KKyAgICB7DQorICAgICAgICBDRlhfVGhyZWFkTG9jazo6TG9jaygpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlVbmxvY2soKQ0KKyAgICB7DQorICAgICAgICBDRlhfVGhyZWFkTG9jazo6VW5sb2NrKCk7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBJRlhfU3RyZWFtKgkJCUNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywgRlhfSU5UMzIgaU9mZnNldCwgRlhfSU5UMzIgaUxlbmd0aCk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9XT1JECQltX3dDb2RlUGFnZTsNCisgICAgRlhfV09SRAkJbV93Qk9NTGVuZ3RoOw0KKyAgICBGWF9EV09SRAltX2R3Qk9NOw0KKyAgICBGWF9MUEJZVEUJbV9wQnVmOw0KKyAgICBGWF9JTlQzMgltX2lCdWZTaXplOw0KKyAgICBGWF9CT09MCQltX2JEZWxTdHJlYW07DQorICAgIElGWF9TdHJlYW0JKm1fcFN0cmVhbUltcDsNCisgICAgRlhfSU5UMzIJbV9pUmVmQ291bnQ7DQorICAgIHZvaWQJCUluaXRTdHJlYW0oKTsNCit9Ow0KKyNpZmRlZiBGWF9GSUxFU0laRQ0KK2NsYXNzIENGR0FTX0ZpbGVSZWFkIDogcHVibGljIElGWF9GaWxlUmVhZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCisgICAgdmlydHVhbCB+Q0ZHQVNfRmlsZVJlYWQoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9CT09MCQkJCQltX2JSZWxlYXNlU3RyZWFtOw0KKyAgICBJRlhfU3RyZWFtCQkJCSptX3BTdHJlYW07DQorfTsNCisjZWxzZQ0KK2NsYXNzIENGR0FTX0ZpbGVSZWFkIDogcHVibGljIElGWF9GaWxlUmVhZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCisgICAgdmlydHVhbCB+Q0ZHQVNfRmlsZVJlYWQoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldFNpemUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRFdPUkQgb2Zmc2V0LCBGWF9EV09SRCBzaXplKTsNCisNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0JPT0wJCQkJCW1fYlJlbGVhc2VTdHJlYW07DQorICAgIElGWF9TdHJlYW0JCQkJKm1fcFN0cmVhbTsNCit9Ow0KKyNlbmRpZg0KKyNpZmRlZiBGWF9GSUxFU0laRQ0KK2NsYXNzIENGWF9CdWZmZXJBY2NJbXAgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9CdWZmZXJBY2NJbXAoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9GSUxFU0laRSBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pOw0KKyAgICB2aXJ0dWFsIH5DRlhfQnVmZmVyQWNjSW1wKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBkZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRTaXplKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZYX0J1ZmZlclJlYWQJCQkqbV9wQnVmZmVyUmVhZDsNCisgICAgRlhfQk9PTAkJCQkJbV9iUmVsZWFzZVN0cmVhbTsNCisgICAgRlhfRklMRVNJWkUJCQkJbV9pQnVmU2l6ZTsNCit9Ow0KKyNlbHNlDQorY2xhc3MgQ0ZYX0J1ZmZlckFjY0ltcCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlclJlYWQsIEZYX0lOVDMyIGlGaWxlU2l6ZSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICAgIHZpcnR1YWwgfkNGWF9CdWZmZXJBY2NJbXAoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldFNpemUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRFdPUkQgb2Zmc2V0LCBGWF9EV09SRCBzaXplKTsNCisNCitwcm90ZWN0ZWQ6DQorICAgIElGWF9CdWZmZXJSZWFkCQkJKm1fcEJ1ZmZlclJlYWQ7DQorICAgIEZYX0JPT0wJCQkJCW1fYlJlbGVhc2VTdHJlYW07DQorICAgIEZYX0lOVDMyCQkJCW1faUJ1ZlNpemU7DQorfTsNCisjZW5kaWYNCisjaWZkZWYgRlhfRklMRVNJWkUNCitjbGFzcyBDRkdBU19GaWxlV3JpdGUgOiBwdWJsaWMgSUZYX0ZpbGVXcml0ZSwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkdBU19GaWxlV3JpdGUoSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICAgIHZpcnR1YWwgfkNGR0FTX0ZpbGVXcml0ZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0U2l6ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlGbHVzaCgpOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSk7DQorICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZYX1N0cmVhbQkJCQkqbV9wU3RyZWFtOw0KKyAgICBGWF9CT09MCQkJCQltX2JSZWxlYXNlU3RyZWFtOw0KK307DQorI2Vsc2UNCitjbGFzcyBDRkdBU19GaWxlV3JpdGUgOiBwdWJsaWMgSUZYX0ZpbGVXcml0ZSwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRkdBU19GaWxlV3JpdGUoSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICAgIHZpcnR1YWwgfkNGR0FTX0ZpbGVXcml0ZSgpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0U2l6ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlGbHVzaCgpOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9EV09SRCBzaXplKTsNCisgICAgdmlydHVhbAlGWF9CT09MCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRFdPUkQgb2Zmc2V0LCBGWF9EV09SRCBzaXplKTsNCisNCitwcm90ZWN0ZWQ6DQorICAgIElGWF9TdHJlYW0JCQkJKm1fcFN0cmVhbTsNCisgICAgRlhfQk9PTAkJCQkJbV9iUmVsZWFzZVN0cmVhbTsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N5c3RlbS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTQ0MDcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zeXN0ZW0uY3BwCkBAIC0wLDAgKzEsMjM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCisjaW5jbHVkZSA8aW8uaD4NCisjZWxpZiBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9MSU5VWF9NaW5pXw0KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4NCisjZW5kaWYNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCitGWF9GTE9BVCBGWF90YW4oRlhfRkxPQVQgYSkNCit7DQorICAgIHJldHVybiAoRlhfRkxPQVQpdGFuKGEpOw0KK30NCitGWF9GTE9BVCBGWF9sb2coRlhfRkxPQVQgYiwgRlhfRkxPQVQgeCkNCit7DQorICAgIHJldHVybiBGWFNZU19sb2coeCkgLyBGWFNZU19sb2coYik7DQorfQ0KK0ZYX0xQV1NUUiBGWF93Y3NuY3B5KEZYX0xQV1NUUiBkc3RTdHIsIEZYX0xQQ1dTVFIgc3JjU3RyLCBzaXplX3QgY291bnQpDQorew0KKyAgICBGWFNZU19hc3NlcnQoZHN0U3RyICE9IE5VTEwgJiYgc3JjU3RyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKQ0KKyAgICAgICAgaWYgKChkc3RTdHJbaV0gPSBzcmNTdHJbaV0pID09IEwnXDAnKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIHJldHVybiBkc3RTdHI7DQorfQ0KK0ZYX0lOVDMyIEZYX3djc25pY21wKEZYX0xQQ1dTVFIgczEsIEZYX0xQQ1dTVFIgczIsIHNpemVfdCBjb3VudCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChzMSAhPSBOVUxMICYmIHMyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCisgICAgRlhfV0NIQVIgd2NoMSA9IDAsIHdjaDIgPSAwOw0KKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsNCisgICAgICAgIHdjaDEgPSAoRlhfV0NIQVIpRlhfdG9sb3dlcigqczErKyk7DQorICAgICAgICB3Y2gyID0gKEZYX1dDSEFSKUZYX3RvbG93ZXIoKnMyKyspOw0KKyAgICAgICAgaWYgKHdjaDEgIT0gd2NoMikgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiB3Y2gxIC0gd2NoMjsNCit9DQorRlhfSU5UMzIgRlhfc3RybmljbXAoRlhfTFBDU1RSIHMxLCBGWF9MUENTVFIgczIsIHNpemVfdCBjb3VudCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChzMSAhPSBOVUxMICYmIHMyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCisgICAgRlhfQ0hBUiBjaDEgPSAwLCBjaDIgPSAwOw0KKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsNCisgICAgICAgIGNoMSA9IChGWF9DSEFSKUZYX3RvbG93ZXIoKnMxKyspOw0KKyAgICAgICAgY2gyID0gKEZYX0NIQVIpRlhfdG9sb3dlcigqczIrKyk7DQorICAgICAgICBpZiAoY2gxICE9IGNoMikgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBjaDEgLSBjaDI7DQorfQ0KK0ZYX0lOVDMyIEZYX2ZpbGVsZW5ndGgoRlhTWVNfRklMRSAqZmlsZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChmaWxlICE9IE5VTEwpOw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCisgICAgcmV0dXJuIF9maWxlbGVuZ3RoKF9maWxlbm8oZmlsZSkpOw0KKyNlbHNlDQorICAgIEZYX0lOVDMyIGlQb3MgPSBGWFNZU19mdGVsbChmaWxlKTsNCisgICAgRlhTWVNfZnNlZWsoZmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gRlhTWVNfZnRlbGwoZmlsZSk7DQorICAgIEZYU1lTX2ZzZWVrKGZpbGUsIGlQb3MsIEZYU1lTX1NFRUtfU0VUKTsNCisgICAgcmV0dXJuIGlMZW47DQorI2VuZGlmDQorfQ0KK0ZYX0JPT0wgRlhfZnNldHNpemUoRlhTWVNfRklMRSAqZmlsZSwgRlhfSU5UMzIgc2l6ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChmaWxlICE9IE5VTEwpOw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCisgICAgcmV0dXJuIF9jaHNpemUoX2ZpbGVubyhmaWxlKSwgc2l6ZSkgPT0gMDsNCisjZWxpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfDQorICAgIEhBTkRMRSBoRmlsZSA9IF9maWxlbm8oZmlsZSk7DQorICAgIEZYX0RXT1JEIGR3UG9zID0gOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgMCwgMCwgRklMRV9DVVJSRU5UKTsNCisgICAgOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgc2l6ZSwgMCwgRklMRV9CRUdJTik7DQorICAgIEZYX0JPT0wgYlJldCA9IDo6U2V0RW5kT2ZGaWxlKGhGaWxlKTsNCisgICAgOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgKEZYX0lOVDMyKWR3UG9zLCAwLCBGSUxFX0JFR0lOKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorI2Vsc2UNCisgICAgcmV0dXJuIEZBTFNFOw0KKyNlbmRpZg0KK30NCitGWF9GTE9BVCBGWF9zdHJ0b2YoRlhfTFBDU1RSIHBjc1N0ciwgRlhfSU5UMzIgaUxlbmd0aCAsIEZYX0lOVDMyICpwVXNlZExlbiApDQorew0KKyAgICBGWFNZU19hc3NlcnQocGNzU3RyICE9IE5VTEwpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDApIHsNCisgICAgICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocGNzU3RyKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfd2NzdG9mKENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocGNzU3RyLCBpTGVuZ3RoKSwgaUxlbmd0aCwgcFVzZWRMZW4pOw0KK30NCitGWF9GTE9BVCBGWF93Y3N0b2YoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGggLCBGWF9JTlQzMiAqcFVzZWRMZW4gKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHB3c1N0ciAhPSBOVUxMKTsNCisgICAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgICAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHB3c1N0cik7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDAuMGY7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVVzZWRMZW4gPSAwOw0KKyAgICBGWF9CT09MIGJOZWd0aXZlID0gRkFMU0U7DQorICAgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgew0KKyAgICAgICAgY2FzZSAnLSc6DQorICAgICAgICAgICAgYk5lZ3RpdmUgPSBUUlVFOw0KKyAgICAgICAgY2FzZSAnKyc6DQorICAgICAgICAgICAgaVVzZWRMZW4rKzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVmFsdWUgPSAwLjBmOw0KKyAgICB3aGlsZSAoaVVzZWRMZW4gPCBpTGVuZ3RoKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOw0KKyAgICAgICAgaWYgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSB7DQorICAgICAgICAgICAgZlZhbHVlID0gZlZhbHVlICogMTAuMGYgKyAod2NoIC0gTCcwJyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVVzZWRMZW4rKzsNCisgICAgfQ0KKyAgICBpZiAoaVVzZWRMZW4gPCBpTGVuZ3RoICYmIHB3c1N0cltpVXNlZExlbl0gPT0gTCcuJykgew0KKyAgICAgICAgRlhfRkxPQVQgZlByZWNpc2UgPSAwLjFmOw0KKyAgICAgICAgd2hpbGUgKCsraVVzZWRMZW4gPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgRlhfV0NIQVIgd2NoID0gcHdzU3RyW2lVc2VkTGVuXTsNCisgICAgICAgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsNCisgICAgICAgICAgICAgICAgZlZhbHVlICs9ICh3Y2ggLSBMJzAnKSAqIGZQcmVjaXNlOw0KKyAgICAgICAgICAgICAgICBmUHJlY2lzZSAqPSAwLjFmOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFVzZWRMZW4pIHsNCisgICAgICAgICpwVXNlZExlbiA9IGlVc2VkTGVuOw0KKyAgICB9DQorICAgIHJldHVybiBiTmVndGl2ZSA/IC1mVmFsdWUgOiBmVmFsdWU7DQorfQ0KK3ZvaWQgRlhfbWVtc2V0KEZYX0xQVk9JRCBwQnVmLCBGWF9JTlQzMiBpVmFsdWUsIHNpemVfdCBzaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBCdWYgIT0gTlVMTCAmJiBzaXplID4gMCAmJiAoc2l6ZSAmIDB4MDMpID09IDApOw0KKyAgICBGWFNZU19hc3NlcnQoKCgoc2l6ZV90KXBCdWYpICYgMHgwMykgPT0gMCk7DQorICAgIEZYX0RXT1JEICpwU3RhcnQgPSAoRlhfRFdPUkQqKXBCdWY7DQorICAgIEZYX0RXT1JEICpwRW5kID0gcFN0YXJ0ICsgKHNpemUgPj4gMik7DQorICAgIHdoaWxlIChwU3RhcnQgPCBwRW5kKSB7DQorICAgICAgICAqcFN0YXJ0ICsrID0gaVZhbHVlOw0KKyAgICB9DQorfQ0KK3ZvaWQgRlhfbWVtY3B5KEZYX0xQVk9JRCBwRHN0LCBGWF9MUENWT0lEIHBTcmMsIHNpemVfdCBzaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBEc3QgIT0gTlVMTCAmJiBwU3JjICE9IE5VTEwgJiYgc2l6ZSA+IDAgJiYgKHNpemUgJiAweDAzKSA9PSAwKTsNCisgICAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwRHN0KSAmIDB4MDMpID09IDAgJiYgKCgoc2l6ZV90KXBTcmMpICYgMHgwMykgPT0gMCk7DQorICAgIEZYX0RXT1JEICpwU3RhcnQgPSAoRlhfRFdPUkQqKXBEc3Q7DQorICAgIEZYX0RXT1JEICpwRW5kID0gcFN0YXJ0ICsgKHNpemUgPj4gMik7DQorICAgIEZYX0RXT1JEICpwVmFsdWUgPSAoRlhfRFdPUkQqKXBTcmM7DQorICAgIHdoaWxlIChwU3RhcnQgPCBwRW5kKSB7DQorICAgICAgICAqcFN0YXJ0ICsrID0gKnBWYWx1ZSArKzsNCisgICAgfQ0KK30NCitGWF9CT09MIEZYX0lzUmVsYXRpdmVQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NVcmwpDQorew0KKyAgICBGWF9JTlQzMiBpVXJsTGVuID0gd3NVcmwuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpVXJsTGVuID09IDApIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IEZYX01JTig1LCBpVXJsTGVuKSAtIDE7IGkgPj0gMDsgLS1pKQ0KKyAgICAgICAgaWYgKHdzVXJsLkdldEF0KGkpID09ICc6Jykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgRlhfSm9pblBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c0Jhc2VQYXRoLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVsYXRpdmVQYXRoLCBDRlhfV2lkZVN0cmluZyAmd3NBYnNvbHV0ZVBhdGgpDQorew0KKyAgICBpZiAoIUZYX0lzUmVsYXRpdmVQYXRoKHdzUmVsYXRpdmVQYXRoKSkgew0KKyAgICAgICAgd3NBYnNvbHV0ZVBhdGggPSB3c1JlbGF0aXZlUGF0aDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIgcFJlbFN0YXJ0ID0gd3NSZWxhdGl2ZVBhdGguR2V0UHRyKCk7DQorICAgIEZYX0xQQ1dTVFIgcFJlbEVuZCAgID0gcFJlbFN0YXJ0ICsgd3NSZWxhdGl2ZVBhdGguR2V0TGVuZ3RoKCk7DQorICAgIGlmIChwUmVsU3RhcnQgPCBwUmVsRW5kKSB7DQorICAgICAgICBzd2l0Y2ggKCpwUmVsU3RhcnQpIHsNCisgICAgICAgICAgICBjYXNlICcjJzoNCisgICAgICAgICAgICAgICAgd3NBYnNvbHV0ZVBhdGggPSBDRlhfV2lkZVN0cmluZyh3c0Jhc2VQYXRoLCB3c1JlbGF0aXZlUGF0aCk7DQorICAgICAgICAgICAgICAgIHJldHVybiB3c0Fic29sdXRlUGF0aC5HZXRMZW5ndGgoKSA+IDA7DQorICAgICAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgICAgY2FzZSAnXFwnOg0KKyAgICAgICAgICAgICAgICB3c0Fic29sdXRlUGF0aCA9IHdzUmVsYXRpdmVQYXRoOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gd3NBYnNvbHV0ZVBhdGguR2V0TGVuZ3RoKCkgPiAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5CYWNrQ291bnQgPSAwOw0KKyAgICBmb3IoOzspIHsNCisgICAgICAgIGlmIChwUmVsU3RhcnQgPj0gcFJlbEVuZCkgew0KKyAgICAgICAgICAgIHdzQWJzb2x1dGVQYXRoID0gd3NCYXNlUGF0aDsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgqcFJlbFN0YXJ0ICE9ICcuJykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBSZWxTdGFydCArIDEgPCBwUmVsRW5kICYmDQorICAgICAgICAgICAgICAgIChwUmVsU3RhcnRbMV0gPT0gJy8nIHx8IHBSZWxTdGFydFsxXSA9PSAnXFwnKSkgew0KKyAgICAgICAgICAgIHBSZWxTdGFydCArPSAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChwUmVsU3RhcnQgKyAyIDwgcFJlbEVuZA0KKyAgICAgICAgICAgICAgICAgICAmJiBwUmVsU3RhcnRbMV0gPT0gJy4nDQorICAgICAgICAgICAgICAgICAgICYmIChwUmVsU3RhcnRbMl0gPT0gJy8nIHx8IHBSZWxTdGFydFsyXSA9PSAnXFwnKSkgew0KKyAgICAgICAgICAgIHBSZWxTdGFydCArPSAzOw0KKyAgICAgICAgICAgIG5CYWNrQ291bnQrKzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIgcEJhc2VTdGFydCA9IHdzQmFzZVBhdGguR2V0UHRyKCk7DQorICAgIEZYX0xQQ1dTVFIgcEJhc2VFbmQgICA9IHBCYXNlU3RhcnQgKyB3c0Jhc2VQYXRoLkdldExlbmd0aCgpOw0KKyAgICB3aGlsZShwQmFzZVN0YXJ0IDwgKC0tcEJhc2VFbmQpICYmICpwQmFzZUVuZCAhPSAnLycgJiYgKnBCYXNlRW5kICE9ICdcXCcpDQorICAgICAgICA7DQorICAgIGlmIChwQmFzZVN0YXJ0ID09IHBCYXNlRW5kKSB7DQorICAgICAgICB3c0Fic29sdXRlUGF0aCA9IENGWF9XaWRlU3RyaW5nQyhwUmVsU3RhcnQsIHBSZWxFbmQgLSBwUmVsU3RhcnQpOw0KKyAgICAgICAgcmV0dXJuIHdzQWJzb2x1dGVQYXRoLkdldExlbmd0aCgpID4gMDsNCisgICAgfQ0KKyAgICB3aGlsZSAobkJhY2tDb3VudCA+IDApIHsNCisgICAgICAgIGlmIChwQmFzZVN0YXJ0ID49ICgtLXBCYXNlRW5kKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0gZWxzZSBpZiAoKnBCYXNlRW5kID09ICcvJyB8fCAqcEJhc2VFbmQgPT0gJ1xcJykNCisgICAgICAgICAgICBpZiAoKC0tbkJhY2tDb3VudCkgPD0gMCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgd3NBYnNvbHV0ZVBhdGggPSBDRlhfV2lkZVN0cmluZyhDRlhfV2lkZVN0cmluZ0MocEJhc2VTdGFydCwgcEJhc2VFbmQgLSBwQmFzZVN0YXJ0ICsgMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKHBSZWxTdGFydCwgcFJlbEVuZCAtIHBSZWxTdGFydCkpOw0KKyAgICByZXR1cm4gd3NBYnNvbHV0ZVBhdGguR2V0TGVuZ3RoKCkgPiAwOw0KK30NCisjaWZkZWYgX19jcGx1c3BsdXMNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNhZjIzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuY3BwCkBAIC0wLDAgKzEsNDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfdXRpbHMuaCINCitDRlhfVGhyZWFkTG9jazo6Q0ZYX1RocmVhZExvY2soKQ0KKyAgICA6IG1fcERhdGEoTlVMTCkNCit7DQorfQ0KK0NGWF9UaHJlYWRMb2NrOjp+Q0ZYX1RocmVhZExvY2soKQ0KK3sNCit9DQordm9pZCBDRlhfVGhyZWFkTG9jazo6TG9jaygpDQorew0KK30NCit2b2lkIENGWF9UaHJlYWRMb2NrOjpVbmxvY2soKQ0KK3sNCit9DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0JBU0VBUlJBWURBVEEgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorICAgIEZYX0lOVDMyCWlHcm93U2l6ZTsNCisgICAgRlhfSU5UMzIJaUJsb2NrU2l6ZTsNCisgICAgRlhfSU5UMzIJaVRvdGFsQ291bnQ7DQorICAgIEZYX0lOVDMyCWlCbG9ja0NvdW50Ow0KKyAgICBGWF9MUEJZVEUJcEJ1ZmZlcjsNCit9IEZYX0JBU0VBUlJBWURBVEEsICogRlhfTFBCQVNFQVJSQVlEQVRBOw0KK3R5cGVkZWYgRlhfQkFTRUFSUkFZREFUQSBjb25zdCAqIEZYX0xQQ0JBU0VBUlJBWURBVEE7DQorQ0ZYX0Jhc2VBcnJheTo6Q0ZYX0Jhc2VBcnJheShGWF9JTlQzMiBpR3Jvd1NpemUsIEZYX0lOVDMyIGlCbG9ja1NpemUpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaUdyb3dTaXplID4gMCAmJiBpQmxvY2tTaXplID4gMCk7DQorICAgIG1fcERhdGEgPSBGWFRBUkdFVF9OZXcgRlhfQkFTRUFSUkFZREFUQTsNCisgICAgRlhfbWVtc2V0KG1fcERhdGEsIDAsIHNpemVvZihGWF9CQVNFQVJSQVlEQVRBKSk7DQorICAgICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pR3Jvd1NpemUgPSBpR3Jvd1NpemU7DQorICAgICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tTaXplID0gaUJsb2NrU2l6ZTsNCit9DQorQ0ZYX0Jhc2VBcnJheTo6fkNGWF9CYXNlQXJyYXkoKQ0KK3sNCisgICAgRlhfTFBCQVNFQVJSQVlEQVRBIHBEYXRhID0gKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhOw0KKyAgICBpZiAocERhdGEtPnBCdWZmZXIgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShwRGF0YS0+cEJ1ZmZlcik7DQorICAgIH0NCisgICAgRlhUQVJHRVRfRGVsZXRlIHBEYXRhOw0KK30NCitGWF9JTlQzMiBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9CYXNlQXJyYXk6OkdldEJsb2NrU2l6ZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja1NpemU7DQorfQ0KK0ZYX0xQQllURSBDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKEZYX0lOVDMyIGluZGV4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KKyAgICBGWF9MUEJZVEUgJnBCdWZmZXIgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+cEJ1ZmZlcjsNCisgICAgRlhfSU5UMzIgJmlUb3RhbENvdW50ID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlUb3RhbENvdW50Ow0KKyAgICBGWF9JTlQzMiBpQmxvY2tTaXplID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja1NpemU7DQorICAgIGlmIChpbmRleCA+PSBpVG90YWxDb3VudCkgew0KKyAgICAgICAgRlhfSU5UMzIgaUdyb3dTaXplID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlHcm93U2l6ZTsNCisgICAgICAgIGlUb3RhbENvdW50ID0gKGluZGV4IC8gaUdyb3dTaXplICsgMSkgKiBpR3Jvd1NpemU7DQorICAgICAgICBGWF9JTlQzMiBpTmV3U2l6ZSA9IGlUb3RhbENvdW50ICogaUJsb2NrU2l6ZTsNCisgICAgICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgICAgICAgICBwQnVmZmVyID0gKEZYX0xQQllURSlGWF9BbGxvYyhGWF9CWVRFLCBpTmV3U2l6ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBCdWZmZXIgPSAoRlhfTFBCWVRFKUZYX1JlYWxsb2MoRlhfQllURSwgcEJ1ZmZlciwgaU5ld1NpemUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwpOw0KKyAgICBGWF9JTlQzMiAmaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQorICAgIGlmIChpbmRleCA+PSBpQmxvY2tDb3VudCkgew0KKyAgICAgICAgaUJsb2NrQ291bnQgPSBpbmRleCArIDE7DQorICAgIH0NCisgICAgcmV0dXJuIHBCdWZmZXIgKyBpbmRleCAqIGlCbG9ja1NpemU7DQorfQ0KK0ZYX0xQQllURSBDRlhfQmFzZUFycmF5OjpHZXRBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja0NvdW50KTsNCisgICAgcmV0dXJuICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5wQnVmZmVyICsgaW5kZXggKiAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrU2l6ZTsNCit9DQorRlhfTFBCWVRFIENGWF9CYXNlQXJyYXk6OkdldEJ1ZmZlcigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXI7DQorfQ0KK0ZYX0lOVDMyIENGWF9CYXNlQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5ICZzcmMsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50KQ0KK3sNCisgICAgRlhfSU5UMzIgaUJsb2NrU2l6ZSA9ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tTaXplOw0KKyAgICBGWFNZU19hc3NlcnQoaUJsb2NrU2l6ZSA9PSAoKEZYX0xQQkFTRUFSUkFZREFUQSlzcmMubV9wRGF0YSktPmlCbG9ja1NpemUpOw0KKyAgICBGWF9JTlQzMiAmaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQorICAgIEZYX0lOVDMyIGlBZGRlZCA9IHNyYy5HZXRTaXplKCk7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQWRkZWQpOw0KKyAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgICAgaUNvdW50ID0gaUFkZGVkOw0KKyAgICB9DQorICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQWRkZWQpIHsNCisgICAgICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsNCisgICAgfQ0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfTFBCWVRFIHBEc3QgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+cEJ1ZmZlciArIGlCbG9ja0NvdW50ICogaUJsb2NrU2l6ZTsNCisgICAgQWRkU3BhY2VUbyhpQmxvY2tDb3VudCArIGlDb3VudCAtIDEpOw0KKyAgICBGWF9tZW1jcHkocERzdCwgKChGWF9MUEJBU0VBUlJBWURBVEEpc3JjLm1fcERhdGEpLT5wQnVmZmVyICsgaVN0YXJ0ICogaUJsb2NrU2l6ZSwgaUNvdW50ICogaUJsb2NrU2l6ZSk7DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9CYXNlQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VBcnJheSAmc3JjLCBGWF9JTlQzMiBpU3RhcnQsIEZYX0lOVDMyIGlDb3VudCkNCit7DQorICAgIEZYX0lOVDMyIGlCbG9ja1NpemUgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrU2l6ZTsNCisgICAgRlhTWVNfYXNzZXJ0KGlCbG9ja1NpemUgPT0gKChGWF9MUEJBU0VBUlJBWURBVEEpc3JjLm1fcERhdGEpLT5pQmxvY2tTaXplKTsNCisgICAgRlhfSU5UMzIgaUNvcGllZCA9IHNyYy5HZXRTaXplKCk7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQ29waWVkKTsNCisgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICAgIGlDb3VudCA9IGlDb3BpZWQ7DQorICAgIH0NCisgICAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlDb3BpZWQpIHsNCisgICAgICAgIGlDb3VudCA9IGlDb3BpZWQgLSBpU3RhcnQ7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIFJlbW92ZUFsbChUUlVFKTsNCisgICAgQWRkU3BhY2VUbyhpQ291bnQgLSAxKTsNCisgICAgRlhfbWVtY3B5KCgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5wQnVmZmVyLCAoKEZYX0xQQkFTRUFSUkFZREFUQSlzcmMubV9wRGF0YSktPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLCBpQ291bnQgKiBpQmxvY2tTaXplKTsNCisgICAgcmV0dXJuIGlDb3VudDsNCit9DQorRlhfSU5UMzIgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlTGFzdChGWF9JTlQzMiBpQ291bnQpDQorew0KKyAgICBGWF9JTlQzMiAmaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQorICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+IGlCbG9ja0NvdW50KSB7DQorICAgICAgICBpQ291bnQgPSBpQmxvY2tDb3VudDsNCisgICAgICAgIGlCbG9ja0NvdW50ID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlCbG9ja0NvdW50IC09IGlDb3VudDsNCisgICAgfQ0KKyAgICByZXR1cm4gaUNvdW50Ow0KK30NCit2b2lkIENGWF9CYXNlQXJyYXk6OlJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSkNCit7DQorICAgIGlmICghYkxlYXZlTWVtb3J5KSB7DQorICAgICAgICBGWF9MUEJZVEUgJnBCdWZmZXIgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+cEJ1ZmZlcjsNCisgICAgICAgIGlmIChwQnVmZmVyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOw0KKyAgICAgICAgICAgIHBCdWZmZXIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlUb3RhbENvdW50ID0gMDsNCisgICAgfQ0KKyAgICAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQgPSAwOw0KK30NCitDRlhfQmFzZU1hc3NBcnJheUltcDo6Q0ZYX0Jhc2VNYXNzQXJyYXlJbXAoRlhfSU5UMzIgaUNodW5rU2l6ZSwgRlhfSU5UMzIgaUJsb2NrU2l6ZSkNCisgICAgOiBtX2lDaHVua1NpemUoaUNodW5rU2l6ZSkNCisgICAgLCBtX2lCbG9ja1NpemUoaUJsb2NrU2l6ZSkNCisgICAgLCBtX2lDaHVua0NvdW50KDApDQorICAgICwgbV9pQmxvY2tDb3VudCgwKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faUNodW5rU2l6ZSA+IDAgJiYgbV9pQmxvY2tTaXplID4gMCk7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgICBtX3BEYXRhLT5TZXRTaXplKDE2KTsNCit9DQorQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6On5DRlhfQmFzZU1hc3NBcnJheUltcCgpDQorew0KKyAgICBSZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIG1fcERhdGE7DQorfQ0KK0ZYX0xQQllURSBDRlhfQmFzZU1hc3NBcnJheUltcDo6QWRkU3BhY2VUbyhGWF9JTlQzMiBpbmRleCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCisgICAgRlhfTFBCWVRFIHBDaHVuazsNCisgICAgaWYgKGluZGV4IDwgbV9pQmxvY2tDb3VudCkgew0KKyAgICAgICAgcENodW5rID0gKEZYX0xQQllURSltX3BEYXRhLT5HZXRBdChpbmRleCAvIG1faUNodW5rU2l6ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9JTlQzMiBpTWVtU2l6ZSA9IG1faUNodW5rU2l6ZSAqIG1faUJsb2NrU2l6ZTsNCisgICAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICAgICAgaWYgKGluZGV4IDwgbV9pQ2h1bmtDb3VudCAqIG1faUNodW5rU2l6ZSkgew0KKyAgICAgICAgICAgICAgICBwQ2h1bmsgPSAoRlhfTFBCWVRFKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcENodW5rID0gKEZYX0xQQllURSlGWF9BbGxvYyhGWF9CWVRFLCBpTWVtU2l6ZSk7DQorICAgICAgICAgICAgICAgIGlmIChtX2lDaHVua0NvdW50IDwgbV9wRGF0YS0+R2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5TZXRBdChtX2lDaHVua0NvdW50LCBwQ2h1bmspOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGF0YS0+QWRkKHBDaHVuayk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9pQ2h1bmtDb3VudCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgICAgbV9pQmxvY2tDb3VudCA9IGluZGV4ICsgMTsNCisgICAgcmV0dXJuIHBDaHVuayArIChpbmRleCAlIG1faUNodW5rU2l6ZSkgKiBtX2lCbG9ja1NpemU7DQorfQ0KK0ZYX0xQQllURSBDRlhfQmFzZU1hc3NBcnJheUltcDo6R2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUJsb2NrQ291bnQpOw0KKyAgICBGWF9MUEJZVEUgcENodW5rID0gKEZYX0xQQllURSltX3BEYXRhLT5HZXRBdChpbmRleCAvIG1faUNodW5rU2l6ZSk7DQorICAgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCk7DQorICAgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBtX2lDaHVua1NpemUpICogbV9pQmxvY2tTaXplOw0KK30NCitGWF9JTlQzMiBDRlhfQmFzZU1hc3NBcnJheUltcDo6QXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wICZzcmMsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faUJsb2NrU2l6ZSA9PSBzcmMubV9pQmxvY2tTaXplKTsNCisgICAgRlhfSU5UMzIgaUFkZGVkID0gc3JjLm1faUJsb2NrQ291bnQ7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQWRkZWQpOw0KKyAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgICAgaUNvdW50ID0gaUFkZGVkOw0KKyAgICB9DQorICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQWRkZWQpIHsNCisgICAgICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsNCisgICAgfQ0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIG1faUJsb2NrQ291bnQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUJsb2NrQ291bnQgPSBtX2lCbG9ja0NvdW50Ow0KKyAgICBGWF9JTlQzMiBpVG90YWwgPSBtX2lCbG9ja0NvdW50ICsgaUNvdW50Ow0KKyAgICBBZGRTcGFjZVRvKGlUb3RhbCAtIDEpOw0KKyAgICBBcHBlbmQoaUJsb2NrQ291bnQsIHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgICByZXR1cm4gbV9pQmxvY2tDb3VudDsNCit9DQorRlhfSU5UMzIgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAgJnNyYywgRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpQ291bnQpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOw0KKyAgICBGWF9JTlQzMiBpQ29waWVkID0gc3JjLm1faUJsb2NrQ291bnQ7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSk7DQorICAgIGlmIChpU3RhcnQgPj0gaUNvcGllZCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgICAgaUNvdW50ID0gaUNvcGllZDsNCisgICAgfQ0KKyAgICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaUNvcGllZCkgew0KKyAgICAgICAgaUNvdW50ID0gaUNvcGllZCAtIGlTdGFydDsNCisgICAgfQ0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKG1faUJsb2NrQ291bnQgPCBpQ291bnQpIHsNCisgICAgICAgIEFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQorICAgIH0NCisgICAgQXBwZW5kKDAsIHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgICByZXR1cm4gbV9pQmxvY2tDb3VudDsNCit9DQordm9pZCBDRlhfQmFzZU1hc3NBcnJheUltcDo6QXBwZW5kKEZYX0lOVDMyIGlEc3RTdGFydCwgY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAgJnNyYywgRlhfSU5UMzIgaVNyY1N0YXJ0LCBGWF9JTlQzMiBpU3JjQ291bnQpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaURzdFN0YXJ0ID4gLTEgJiYgbV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOw0KKyAgICBGWF9JTlQzMiBpU3JjVG90YWwgPSBzcmMubV9pQmxvY2tDb3VudDsNCisgICAgRlhTWVNfYXNzZXJ0KGlTcmNUb3RhbCA+IDAgJiYgbV9pQmxvY2tDb3VudCA+PSBpRHN0U3RhcnQgKyBpU3JjQ291bnQpOw0KKyAgICBGWFNZU19hc3NlcnQoaVNyY1N0YXJ0ID4gLTEgJiYgaVNyY1N0YXJ0IDwgaVNyY1RvdGFsICYmIGlTcmNDb3VudCA+IDAgJiYgaVNyY1N0YXJ0ICsgaVNyY0NvdW50IDw9IGlTcmNUb3RhbCk7DQorICAgIEZYX0lOVDMyIGlEc3RDaHVua0luZGV4ID0gaURzdFN0YXJ0IC8gbV9pQ2h1bmtTaXplOw0KKyAgICBGWF9JTlQzMiBpU3JjQ2h1bmtJbmRleCA9IGlTcmNTdGFydCAvIHNyYy5tX2lDaHVua1NpemU7DQorICAgIEZYX0xQQllURSBwRHN0Q2h1bmsgPSAoRlhfTFBCWVRFKUdldEF0KGlEc3RTdGFydCk7DQorICAgIEZYX0xQQllURSBwU3JjQ2h1bmsgPSAoRlhfTFBCWVRFKXNyYy5HZXRBdChpU3JjU3RhcnQpOw0KKyAgICBGWF9JTlQzMiBpRHN0Q2h1bmtTaXplID0gbV9pQ2h1bmtTaXplIC0gKGlEc3RTdGFydCAlIG1faUNodW5rU2l6ZSk7DQorICAgIEZYX0lOVDMyIGlTcmNDaHVua1NpemUgPSBzcmMubV9pQ2h1bmtTaXplIC0gKGlTcmNTdGFydCAlIHNyYy5tX2lDaHVua1NpemUpOw0KKyAgICBGWF9JTlQzMiBpQ29weVNpemUgPSBGWF9NSU4oaVNyY0NvdW50LCBGWF9NSU4oaVNyY0NodW5rU2l6ZSwgaURzdENodW5rU2l6ZSkpOw0KKyAgICBGWF9JTlQzMiBpQ29weUJ5dGVzID0gaUNvcHlTaXplICogbV9pQmxvY2tTaXplOw0KKyAgICB3aGlsZSAoaVNyY0NvdW50ID4gMCkgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBEc3RDaHVuayAhPSBOVUxMICYmIHBTcmNDaHVuayAhPSBOVUxMKTsNCisgICAgICAgIEZYU1lTX21lbWNweShwRHN0Q2h1bmssIHBTcmNDaHVuaywgaUNvcHlCeXRlcyk7DQorICAgICAgICBpU3JjQ291bnQgLT0gaUNvcHlTaXplOw0KKyAgICAgICAgaVNyY0NodW5rU2l6ZSAtPSBpQ29weVNpemU7DQorICAgICAgICBpZiAoaVNyY0NodW5rU2l6ZSA8IDEpIHsNCisgICAgICAgICAgICBpU3JjQ2h1bmtTaXplID0gc3JjLm1faUNodW5rU2l6ZTsNCisgICAgICAgICAgICBpU3JjQ2h1bmtJbmRleCArKzsNCisgICAgICAgICAgICBwU3JjQ2h1bmsgPSAoRlhfTFBCWVRFKXNyYy5tX3BEYXRhLT5HZXRBdChpU3JjQ2h1bmtJbmRleCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBTcmNDaHVuayArPSBpQ29weUJ5dGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaURzdENodW5rU2l6ZSAtPSBpQ29weVNpemU7DQorICAgICAgICBpZiAoaURzdENodW5rU2l6ZSA8IDEpIHsNCisgICAgICAgICAgICBpRHN0Q2h1bmtTaXplID0gbV9pQ2h1bmtTaXplOw0KKyAgICAgICAgICAgIGlEc3RDaHVua0luZGV4ICsrOw0KKyAgICAgICAgICAgIHBEc3RDaHVuayA9IChGWF9MUEJZVEUpbV9wRGF0YS0+R2V0QXQoaURzdENodW5rSW5kZXgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwRHN0Q2h1bmsgKz0gaUNvcHlCeXRlczsNCisgICAgICAgIH0NCisgICAgICAgIGlDb3B5U2l6ZSA9IEZYX01JTihpU3JjQ291bnQsIEZYX01JTihpU3JjQ2h1bmtTaXplLCBpRHN0Q2h1bmtTaXplKSk7DQorICAgICAgICBpQ29weUJ5dGVzID0gaUNvcHlTaXplICogbV9pQmxvY2tTaXplOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGWF9CYXNlTWFzc0FycmF5SW1wOjpSZW1vdmVMYXN0KEZYX0lOVDMyIGlDb3VudCkNCit7DQorICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+PSBtX2lCbG9ja0NvdW50KSB7DQorICAgICAgICBtX2lCbG9ja0NvdW50ID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1faUJsb2NrQ291bnQgLT0gaUNvdW50Ow0KKyAgICB9DQorICAgIHJldHVybiBtX2lCbG9ja0NvdW50Ow0KK30NCit2b2lkIENGWF9CYXNlTWFzc0FycmF5SW1wOjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpDQorew0KKyAgICBpZiAoYkxlYXZlTWVtb3J5KSB7DQorICAgICAgICBtX2lCbG9ja0NvdW50ID0gMDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9pQ2h1bmtDb3VudDsgaSArKykgew0KKyAgICAgICAgRlhfTFBWT0lEIHAgPSBtX3BEYXRhLT5HZXRBdChpKTsNCisgICAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocCk7DQorICAgIH0NCisgICAgbV9wRGF0YS0+UmVtb3ZlQWxsKCk7DQorICAgIG1faUNodW5rQ291bnQgPSAwOw0KKyAgICBtX2lCbG9ja0NvdW50ID0gMDsNCit9DQorQ0ZYX0Jhc2VNYXNzQXJyYXk6OkNGWF9CYXNlTWFzc0FycmF5KEZYX0lOVDMyIGlDaHVua1NpemUsIEZYX0lOVDMyIGlCbG9ja1NpemUpDQorew0KKyAgICBtX3BEYXRhID0gRlhUQVJHRVRfTmV3IENGWF9CYXNlTWFzc0FycmF5SW1wKGlDaHVua1NpemUsIGlCbG9ja1NpemUpOw0KK30NCitDRlhfQmFzZU1hc3NBcnJheTo6fkNGWF9CYXNlTWFzc0FycmF5KCkNCit7DQorICAgIEZYVEFSR0VUX0RlbGV0ZSAoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGE7DQorfQ0KK0ZYX0lOVDMyIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGWF9CYXNlTWFzc0FycmF5SW1wKiltX3BEYXRhKS0+bV9pQmxvY2tDb3VudDsNCit9DQorRlhfTFBCWVRFIENGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKEZYX0lOVDMyIGluZGV4KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5BZGRTcGFjZVRvKGluZGV4KTsNCit9DQorRlhfTFBCWVRFIENGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGWF9CYXNlTWFzc0FycmF5SW1wKiltX3BEYXRhKS0+R2V0QXQoaW5kZXgpOw0KK30NCitGWF9JTlQzMiBDRlhfQmFzZU1hc3NBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5ICZzcmMsIEZYX0lOVDMyIGlTdGFydCwgRlhfSU5UMzIgaUNvdW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5BcHBlbmQoKihDRlhfQmFzZU1hc3NBcnJheUltcCopc3JjLm1fcERhdGEsIGlTdGFydCwgaUNvdW50KTsNCit9DQorRlhfSU5UMzIgQ0ZYX0Jhc2VNYXNzQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXkgJnNyYywgRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpQ291bnQpDQorew0KKyAgICByZXR1cm4gKChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YSktPkNvcHkoKihDRlhfQmFzZU1hc3NBcnJheUltcCopc3JjLm1fcERhdGEsIGlTdGFydCwgaUNvdW50KTsNCit9DQorRlhfSU5UMzIgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUxhc3QoRlhfSU5UMzIgaUNvdW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5SZW1vdmVMYXN0KGlDb3VudCk7DQorfQ0KK3ZvaWQgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSkNCit7DQorICAgICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCit9DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0JBU0VESVNDUkVURUFSUkFZREFUQSA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgRlhfSU5UMzIJCWlCbG9ja1NpemU7DQorICAgIEZYX0lOVDMyCQlpQ2h1bmtTaXplOw0KKyAgICBGWF9JTlQzMgkJaUNodW5rQ291bnQ7DQorICAgIENGWF9QdHJBcnJheQlDaHVua0J1ZmZlcjsNCit9IEZYX0JBU0VESVNDUkVURUFSUkFZREFUQSwgKiBGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQTsNCit0eXBlZGVmIEZYX0JBU0VESVNDUkVURUFSUkFZREFUQSBjb25zdCAqIEZYX0xQQ0JBU0VESVNDUkVURUFSUkFZREFUQTsNCitDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkNGWF9CYXNlRGlzY3JldGVBcnJheShGWF9JTlQzMiBpQ2h1bmtTaXplLCBGWF9JTlQzMiBpQmxvY2tTaXplKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlDaHVua1NpemUgPiAwICYmIGlCbG9ja1NpemUgPiAwKTsNCisgICAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGE7DQorICAgIG1fcERhdGEgPSBwRGF0YSA9IEZYX05FVyBGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEE7DQorICAgIHBEYXRhLT5DaHVua0J1ZmZlci5TZXRTaXplKDE2KTsNCisgICAgcERhdGEtPmlDaHVua0NvdW50ID0gMDsNCisgICAgcERhdGEtPmlDaHVua1NpemUgPSBpQ2h1bmtTaXplOw0KKyAgICBwRGF0YS0+aUJsb2NrU2l6ZSA9IGlCbG9ja1NpemU7DQorfQ0KK0NGWF9CYXNlRGlzY3JldGVBcnJheTo6fkNGWF9CYXNlRGlzY3JldGVBcnJheSgpDQorew0KKyAgICBSZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIChGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSltX3BEYXRhOw0KK30NCitGWF9MUEJZVEUgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpBZGRTcGFjZVRvKEZYX0lOVDMyIGluZGV4KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KKyAgICBGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSBwRGF0YSA9IChGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSltX3BEYXRhOw0KKyAgICBGWF9JTlQzMiAmaUNodW5rQ291bnQgPSBwRGF0YS0+aUNodW5rQ291bnQ7DQorICAgIEZYX0lOVDMyIGlDaHVua1NpemUgPSBwRGF0YS0+aUNodW5rU2l6ZTsNCisgICAgRlhfTFBCWVRFIHBDaHVuayA9IE5VTEw7DQorICAgIEZYX0lOVDMyIGlDaHVuayA9IGluZGV4IC8gaUNodW5rU2l6ZTsNCisgICAgaWYgKGlDaHVuayA8IGlDaHVua0NvdW50KSB7DQorICAgICAgICBwQ2h1bmsgPSAoRlhfTFBCWVRFKXBEYXRhLT5DaHVua0J1ZmZlci5HZXRBdChpQ2h1bmspOw0KKyAgICB9DQorICAgIGlmIChwQ2h1bmsgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfSU5UMzIgaU1lbVNpemUgPSBpQ2h1bmtTaXplICogcERhdGEtPmlCbG9ja1NpemU7DQorICAgICAgICBwQ2h1bmsgPSAoRlhfTFBCWVRFKUZYX0FsbG9jKEZYX0JZVEUsIGlNZW1TaXplKTsNCisgICAgICAgIEZYU1lTX21lbXNldChwQ2h1bmssIDAsIGlNZW1TaXplKTsNCisgICAgICAgIHBEYXRhLT5DaHVua0J1ZmZlci5TZXRBdEdyb3coaUNodW5rLCBwQ2h1bmspOw0KKyAgICAgICAgaWYgKGlDaHVua0NvdW50IDw9IGlDaHVuaykgew0KKyAgICAgICAgICAgIGlDaHVua0NvdW50ID0gaUNodW5rICsgMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcENodW5rICsgKGluZGV4ICUgaUNodW5rU2l6ZSkgKiBwRGF0YS0+aUJsb2NrU2l6ZTsNCit9DQorRlhfTFBCWVRFIENGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSk7DQorICAgIEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBIHBEYXRhID0gKEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBKW1fcERhdGE7DQorICAgIEZYX0lOVDMyIGlDaHVua1NpemUgPSBwRGF0YS0+aUNodW5rU2l6ZTsNCisgICAgRlhfSU5UMzIgaUNodW5rID0gaW5kZXggLyBpQ2h1bmtTaXplOw0KKyAgICBpZiAoaUNodW5rID49IHBEYXRhLT5pQ2h1bmtDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfTFBCWVRFIHBDaHVuayA9IChGWF9MUEJZVEUpcERhdGEtPkNodW5rQnVmZmVyLkdldEF0KGlDaHVuayk7DQorICAgIGlmIChwQ2h1bmsgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBDaHVuayArIChpbmRleCAlIGlDaHVua1NpemUpICogcERhdGEtPmlCbG9ja1NpemU7DQorfQ0KK3ZvaWQgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpSZW1vdmVBbGwoKQ0KK3sNCisgICAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCisgICAgQ0ZYX1B0ckFycmF5ICZDaHVua0J1ZmZlciA9IHBEYXRhLT5DaHVua0J1ZmZlcjsNCisgICAgRlhfSU5UMzIgJmlDaHVua0NvdW50ID0gcERhdGEtPmlDaHVua0NvdW50Ow0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNodW5rQ291bnQ7IGkrKykgew0KKyAgICAgICAgRlhfTFBWT0lEIHAgPSBDaHVua0J1ZmZlci5HZXRBdChpKTsNCisgICAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocCk7DQorICAgIH0NCisgICAgQ2h1bmtCdWZmZXIuUmVtb3ZlQWxsKCk7DQorICAgIGlDaHVua0NvdW50ID0gMDsNCit9DQorQ0ZYX0Jhc2VTdGFjazo6Q0ZYX0Jhc2VTdGFjayhGWF9JTlQzMiBpQ2h1bmtTaXplLCBGWF9JTlQzMiBpQmxvY2tTaXplKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYVEFSR0VUX05ldyBDRlhfQmFzZU1hc3NBcnJheUltcChpQ2h1bmtTaXplLCBpQmxvY2tTaXplKTsNCit9DQorQ0ZYX0Jhc2VTdGFjazo6fkNGWF9CYXNlU3RhY2soKQ0KK3sNCisgICAgRlhUQVJHRVRfRGVsZXRlIChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YTsNCit9DQorRlhfTFBCWVRFIENGWF9CYXNlU3RhY2s6OlB1c2goKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5BZGRTcGFjZSgpOw0KK30NCit2b2lkIENGWF9CYXNlU3RhY2s6OlBvcCgpDQorew0KKyAgICBGWF9JTlQzMiAmaUJsb2NrQ291bnQgPSAoKENGWF9CYXNlTWFzc0FycmF5SW1wKiltX3BEYXRhKS0+bV9pQmxvY2tDb3VudDsNCisgICAgaWYgKGlCbG9ja0NvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlCbG9ja0NvdW50IC0tOw0KK30NCitGWF9MUEJZVEUgQ0ZYX0Jhc2VTdGFjazo6R2V0VG9wRWxlbWVudCgpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpU2l6ZSA9ICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5tX2lCbG9ja0NvdW50Ow0KKyAgICBpZiAoaVNpemUgPCAxKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gKChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YSktPkdldEF0KGlTaXplIC0gMSk7DQorfQ0KK0ZYX0lOVDMyIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuICgoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGEpLT5tX2lCbG9ja0NvdW50Ow0KK30NCitGWF9MUEJZVEUgQ0ZYX0Jhc2VTdGFjazo6R2V0QXQoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YSktPkdldEF0KGluZGV4KTsNCit9DQordm9pZCBDRlhfQmFzZVN0YWNrOjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgKQ0KK3sNCisgICAgKChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YSktPlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF91dGlscy5oIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDczYjgwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1VUSUxTX0lNUA0KKyNkZWZpbmUgX0ZYX1VUSUxTX0lNUA0KK2NsYXNzIENGWF9CYXNlTWFzc0FycmF5SW1wIDogcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDRlhfQmFzZU1hc3NBcnJheUltcChGWF9JTlQzMiBpQ2h1bmtTaXplLCBGWF9JTlQzMiBpQmxvY2tTaXplKTsNCisgICAgfkNGWF9CYXNlTWFzc0FycmF5SW1wKCk7DQorICAgIEZYX0xQQllURQlBZGRTcGFjZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBBZGRTcGFjZVRvKG1faUJsb2NrQ291bnQpOw0KKyAgICB9DQorICAgIEZYX0xQQllURQlBZGRTcGFjZVRvKEZYX0lOVDMyIGluZGV4KTsNCisgICAgRlhfTFBCWVRFCUdldEF0KEZYX0lOVDMyIGluZGV4KSBjb25zdDsNCisgICAgRlhfSU5UMzIJQXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wICZzcmMsIEZYX0lOVDMyIGlTdGFydCA9IDAsIEZYX0lOVDMyIGlDb3VudCA9IC0xKTsNCisgICAgRlhfSU5UMzIJQ29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCAmc3JjLCBGWF9JTlQzMiBpU3RhcnQgPSAwLCBGWF9JTlQzMiBpQ291bnQgPSAtMSk7DQorICAgIEZYX0lOVDMyCVJlbW92ZUxhc3QoRlhfSU5UMzIgaUNvdW50ID0gLTEpOw0KKyAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQorICAgIEZYX0lOVDMyCQltX2lDaHVua1NpemU7DQorICAgIEZYX0lOVDMyCQltX2lCbG9ja1NpemU7DQorICAgIEZYX0lOVDMyCQltX2lDaHVua0NvdW50Ow0KKyAgICBGWF9JTlQzMgkJbV9pQmxvY2tDb3VudDsNCisgICAgQ0ZYX1B0ckFycmF5CSptX3BEYXRhOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlBcHBlbmQoRlhfSU5UMzIgaURzdFN0YXJ0LCBjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCAmc3JjLCBGWF9JTlQzMiBpU3JjU3RhcnQgPSAwLCBGWF9JTlQzMiBpU3JjQ291bnQgPSAtMSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODYwZWMzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaApAQCAtMCwwICsxLDEyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYTUFUSF9CQVNFXw0KKyNkZWZpbmUgX0ZYTUFUSF9CQVNFXw0KKyNpbmNsdWRlICIuLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIg0KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ZnYXMuaCINCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYTcwMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmNwcApAQCAtMCwwICsxLDIzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X2ZvbnR1dGlscy5oIg0KK0ZYX0RXT1JEIEZHQVNfR2V0Rm9udEhhc2hDb2RlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpDQorew0KKyAgICBGWF9EV09SRCBkd0hhc2ggPSB3Q29kZVBhZ2U7DQorICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgew0KKyAgICAgICAgZHdIYXNoIHw9IDB4MDAwMTAwMDA7DQorICAgIH0NCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgew0KKyAgICAgICAgZHdIYXNoIHw9IDB4MDAwMjAwMDA7DQorICAgIH0NCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgew0KKyAgICAgICAgZHdIYXNoIHw9IDB4MDAwNDAwMDA7DQorICAgIH0NCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpIHsNCisgICAgICAgIGR3SGFzaCB8PSAweDAwMDgwMDAwOw0KKyAgICB9DQorICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQorICAgICAgICBkd0hhc2ggfD0gMHgwMDEwMDAwMDsNCisgICAgfQ0KKyAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgICAgIGR3SGFzaCB8PSAweDAwMjAwMDAwOw0KKyAgICB9DQorICAgIHJldHVybiBkd0hhc2g7DQorfQ0KK0ZYX0RXT1JEIEZHQVNfR2V0Rm9udEZhbWlseUhhc2goRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250KHBzekZvbnRGYW1pbHkpOw0KKyAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgICAgIHdzRm9udCArPSBMIkJvbGQiOw0KKyAgICB9DQorICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQorICAgICAgICB3c0ZvbnQgKz0gTCJJdGFsaWMiOw0KKyAgICB9DQorICAgIHdzRm9udCArPSB3Q29kZVBhZ2U7DQorICAgIHJldHVybiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoRlhfTFBDV1NUUil3c0ZvbnQsIHdzRm9udC5HZXRMZW5ndGgoKSk7DQorfQ0KK3N0YXRpYyBjb25zdCBGR0FTX0ZPTlRVU0IgZ19GWEdkaUZvbnRVU0JUYWJsZVtdID0gew0KKyAgICB7MHgwMDAwICAsCTB4MDA3RiAgLAkwICAsCTEyNTIgIH0sDQorICAgIHsweDAwODAgICwJMHgwMEZGICAsCTEgICwJMTI1MiAgfSwNCisgICAgezB4MDEwMCAgLAkweDAxN0YgICwJMiAgLAkxMjUwICB9LA0KKyAgICB7MHgwMTgwICAsCTB4MDI0RiAgLAkzICAsCTEyNTAgIH0sDQorICAgIHsweDAyNTAgICwJMHgwMkFGICAsCTQgICwJMHhGRkZGfSwNCisgICAgezB4MDJCMCAgLAkweDAyRkYgICwJNSAgLAkweEZGRkZ9LA0KKyAgICB7MHgwMzAwICAsCTB4MDM2RiAgLAk2ICAsCTB4RkZGRn0sDQorICAgIHsweDAzNzAgICwJMHgwM0ZGICAsCTcgICwJMTI1MyAgfSwNCisgICAgezB4MDQwMCAgLAkweDA0RkYgICwJOSAgLAkxMjUxICB9LA0KKyAgICB7MHgwNTAwICAsCTB4MDUyRiAgLAk5ICAsCTB4RkZGRn0sDQorICAgIHsweDA1MzAgICwJMHgwNThGICAsCTEwICwJMHhGRkZGfSwNCisgICAgezB4MDU5MCAgLAkweDA1RkYgICwJMTEgLAkxMjU1ICB9LA0KKyAgICB7MHgwNjAwICAsCTB4MDZGRiAgLAkxMyAsCTEyNTYgIH0sDQorICAgIHsweDA3MDAgICwJMHgwNzRGICAsCTcxICwJMHhGRkZGfSwNCisgICAgezB4MDc1MCAgLAkweDA3N0YgICwJMTMgLAkweEZGRkZ9LA0KKyAgICB7MHgwNzgwICAsCTB4MDdCRiAgLAk3MiAsCTB4RkZGRn0sDQorICAgIHsweDA3QzAgICwJMHgwN0ZGICAsCTE0ICwJMHhGRkZGfSwNCisgICAgezB4MDgwMCAgLAkweDA4RkYgICwJOTk5LAkweEZGRkZ9LA0KKyAgICB7MHgwOTAwICAsCTB4MDk3RiAgLAkxNSAsCTB4RkZGRn0sDQorICAgIHsweDA5ODAgICwJMHgwOUZGICAsCTE2ICwJMHhGRkZGfSwNCisgICAgezB4MEEwMCAgLAkweDBBN0YgICwJMTcgLAkweEZGRkZ9LA0KKyAgICB7MHgwQTgwICAsCTB4MEFGRiAgLAkxOCAsCTB4RkZGRn0sDQorICAgIHsweDBCMDAgICwJMHgwQjdGICAsCTE5ICwJMHhGRkZGfSwNCisgICAgezB4MEI4MCAgLAkweDBCRkYgICwJMjAgLAkweEZGRkZ9LA0KKyAgICB7MHgwQzAwICAsCTB4MEM3RiAgLAkyMSAsCTB4RkZGRn0sDQorICAgIHsweDBDODAgICwJMHgwQ0ZGICAsCTIyICwJMHhGRkZGfSwNCisgICAgezB4MEQwMCAgLAkweDBEN0YgICwJMjMgLAkweEZGRkZ9LA0KKyAgICB7MHgwRDgwICAsCTB4MERGRiAgLAk3MyAsCTB4RkZGRn0sDQorICAgIHsweDBFMDAgICwJMHgwRTdGICAsCTI0ICwJODc0ICAgfSwNCisgICAgezB4MEU4MCAgLAkweDBFRkYgICwJMjUgLAkweEZGRkZ9LA0KKyAgICB7MHgwRjAwICAsCTB4MEZGRiAgLAk3MCAsCTB4RkZGRn0sDQorICAgIHsweDEwMDAgICwJMHgxMDlGICAsCTc0ICwJMHhGRkZGfSwNCisgICAgezB4MTBBMCAgLAkweDEwRkYgICwJMjYgLAkweEZGRkZ9LA0KKyAgICB7MHgxMTAwICAsCTB4MTFGRiAgLAkyOCAsCTB4RkZGRn0sDQorICAgIHsweDEyMDAgICwJMHgxMzdGICAsCTc1ICwJMHhGRkZGfSwNCisgICAgezB4MTM4MCAgLAkweDEzOUYgICwJNzUgLAkweEZGRkZ9LA0KKyAgICB7MHgxM0EwICAsCTB4MTNGRiAgLAk3NiAsCTB4RkZGRn0sDQorICAgIHsweDE0MDAgICwJMHgxNjdGICAsCTc3ICwJMHhGRkZGfSwNCisgICAgezB4MTY4MCAgLAkweDE2OUYgICwJNzggLAkweEZGRkZ9LA0KKyAgICB7MHgxNkEwICAsCTB4MTZGRiAgLAk3OSAsCTB4RkZGRn0sDQorICAgIHsweDE3MDAgICwJMHgxNzFGICAsCTg0ICwJMHhGRkZGfSwNCisgICAgezB4MTcyMCAgLAkweDE3M0YgICwJODQgLAkweEZGRkZ9LA0KKyAgICB7MHgxNzQwICAsCTB4MTc1RiAgLAk4NCAsCTB4RkZGRn0sDQorICAgIHsweDE3NjAgICwJMHgxNzdGICAsCTg0ICwJMHhGRkZGfSwNCisgICAgezB4MTc4MCAgLAkweDE3RkYgICwJODAgLAkweEZGRkZ9LA0KKyAgICB7MHgxODAwICAsCTB4MThBRiAgLAk4MSAsCTB4RkZGRn0sDQorICAgIHsweDE4QjAgICwJMHgxOEZGICAsCTk5OSwJMHhGRkZGfSwNCisgICAgezB4MTkwMCAgLAkweDE5NEYgICwJOTMgLAkweEZGRkZ9LA0KKyAgICB7MHgxOTUwICAsCTB4MTk3RiAgLAk5NCAsCTB4RkZGRn0sDQorICAgIHsweDE5ODAgICwJMHgxOURGICAsCTk1ICwJMHhGRkZGfSwNCisgICAgezB4MTlFMCAgLAkweDE5RkYgICwJODAgLAkweEZGRkZ9LA0KKyAgICB7MHgxQTAwICAsCTB4MUExRiAgLAk5NiAsCTB4RkZGRn0sDQorICAgIHsweDFBMjAgICwJMHgxQUZGICAsCTk5OSwJMHhGRkZGfSwNCisgICAgezB4MUIwMCAgLAkweDFCN0YgICwJMjcgLAkweEZGRkZ9LA0KKyAgICB7MHgxQjgwICAsCTB4MUJCRiAgLAkxMTIsCTB4RkZGRn0sDQorICAgIHsweDFCQzAgICwJMHgxQkZGICAsCTk5OSwJMHhGRkZGfSwNCisgICAgezB4MUMwMCAgLAkweDFDNEYgICwJMTEzLAkweEZGRkZ9LA0KKyAgICB7MHgxQzUwICAsCTB4MUM3RiAgLAkxMTQsCTB4RkZGRn0sDQorICAgIHsweDFDODAgICwJMHgxQ0ZGICAsCTk5OSwJMHhGRkZGfSwNCisgICAgezB4MUQwMCAgLAkweDFEN0YgICwJNCAgLAkweEZGRkZ9LA0KKyAgICB7MHgxRDgwICAsCTB4MURCRiAgLAk0ICAsCTB4RkZGRn0sDQorICAgIHsweDFEQzAgICwJMHgxREZGICAsCTYgICwJMHhGRkZGfSwNCisgICAgezB4MUUwMCAgLAkweDFFRkYgICwJMjkgLAkweEZGRkZ9LA0KKyAgICB7MHgxRjAwICAsCTB4MUZGRiAgLAkzMCAsCTB4RkZGRn0sDQorICAgIHsweDIwMDAgICwJMHgyMDZGICAsCTMxICwJMHhGRkZGfSwNCisgICAgezB4MjA3MCAgLAkweDIwOUYgICwJMzIgLAkweEZGRkZ9LA0KKyAgICB7MHgyMEEwICAsCTB4MjBDRiAgLAkzMyAsCTB4RkZGRn0sDQorICAgIHsweDIwRDAgICwJMHgyMEZGICAsCTM0ICwJMHhGRkZGfSwNCisgICAgezB4MjEwMCAgLAkweDIxNEYgICwJMzUgLAkweEZGRkZ9LA0KKyAgICB7MHgyMTUwICAsCTB4MjE1RiAgLAkzNiAsCTB4RkZGRn0sDQorICAgIHsweDIxNjAgICwJMHgyMTZCICAsCTM2ICwJOTM2ICAgfSwNCisgICAgezB4MjE2QyAgLAkweDIxNkYgICwJMzYgLAkweEZGRkZ9LA0KKyAgICB7MHgyMTcwICAsCTB4MjE3OSAgLAkzNiAsCTkzNiAgIH0sDQorICAgIHsweDIxN0EgICwJMHgyMThGICAsCTM2ICwJMHhGRkZGfSwNCisgICAgezB4MjE5MCAgLAkweDIxOTkgICwJMzcgLAk5NDkgICB9LA0KKyAgICB7MHgyMTlBICAsCTB4MjFGRiAgLAkzNyAsCTB4RkZGRn0sDQorICAgIHsweDIyMDAgICwJMHgyMkZGICAsCTM4ICwJMHhGRkZGfSwNCisgICAgezB4MjMwMCAgLAkweDIzRkYgICwJMzkgLAkweEZGRkZ9LA0KKyAgICB7MHgyNDAwICAsCTB4MjQzRiAgLAk0MCAsCTB4RkZGRn0sDQorICAgIHsweDI0NDAgICwJMHgyNDVGICAsCTQxICwJMHhGRkZGfSwNCisgICAgezB4MjQ2MCAgLAkweDI0NzMgICwJNDIgLAk5MzIgICB9LA0KKyAgICB7MHgyNDc0ICAsCTB4MjQ5QiAgLAk0MiAsCTkzNiAgIH0sDQorICAgIHsweDI0OUMgICwJMHgyNEU5ICAsCTQyICwJOTQ5ICAgfSwNCisgICAgezB4MjRFQSAgLAkweDI0RkYgICwJNDIgLAkweEZGRkZ9LA0KKyAgICB7MHgyNTAwICAsCTB4MjU3MyAgLAk0MyAsCTkzNiAgIH0sDQorICAgIHsweDI1NzQgICwJMHgyNTdGICAsCTQzICwJMHhGRkZGfSwNCisgICAgezB4MjU4MCAgLAkweDI1ODAgICwJNDQgLAkweEZGRkZ9LA0KKyAgICB7MHgyNTgxICAsCTB4MjU4RiAgLAk0NCAsCTkzNiAgIH0sDQorICAgIHsweDI1OTAgICwJMHgyNTlGICAsCTQ0ICwJMHhGRkZGfSwNCisgICAgezB4MjVBMCAgLAkweDI1RkYgICwJNDUgLAkweEZGRkZ9LA0KKyAgICB7MHgyNjAwICAsCTB4MjZGRiAgLAk0NiAsCTB4RkZGRn0sDQorICAgIHsweDI3MDAgICwJMHgyN0JGICAsCTQ3ICwJMHhGRkZGfSwNCisgICAgezB4MjdDMCAgLAkweDI3RUYgICwJMzggLAkweEZGRkZ9LA0KKyAgICB7MHgyN0YwICAsCTB4MjdGRiAgLAkzNyAsCTB4RkZGRn0sDQorICAgIHsweDI4MDAgICwJMHgyOEZGICAsCTgyICwJMHhGRkZGfSwNCisgICAgezB4MjkwMCAgLAkweDI5N0YgICwJMzcgLAkweEZGRkZ9LA0KKyAgICB7MHgyOTgwICAsCTB4MjlGRiAgLAkzOCAsCTB4RkZGRn0sDQorICAgIHsweDJBMDAgICwJMHgyQUZGICAsCTM4ICwJMHhGRkZGfSwNCisgICAgezB4MkIwMCAgLAkweDJCRkYgICwJMzcgLAkweEZGRkZ9LA0KKyAgICB7MHgyQzAwICAsCTB4MkM1RiAgLAk5NyAsCTB4RkZGRn0sDQorICAgIHsweDJDNjAgICwJMHgyQzdGICAsCTI5ICwJMHhGRkZGfSwNCisgICAgezB4MkM4MCAgLAkweDJDRkYgICwJOCAgLAkweEZGRkZ9LA0KKyAgICB7MHgyRDAwICAsCTB4MkQyRiAgLAkyNiAsCTB4RkZGRn0sDQorICAgIHsweDJEMzAgICwJMHgyRDdGICAsCTk4ICwJMHhGRkZGfSwNCisgICAgezB4MkQ4MCAgLAkweDJEREYgICwJNzUgLAkweEZGRkZ9LA0KKyAgICB7MHgyREUwICAsCTB4MkRGRiAgLAk5ICAsCTB4RkZGRn0sDQorICAgIHsweDJFMDAgICwJMHgyRTdGICAsCTMxICwJMHhGRkZGfSwNCisgICAgezB4MkU4MCAgLAkweDJFRkYgICwJNTkgLAkweEZGRkZ9LA0KKyAgICB7MHgyRjAwICAsCTB4MkZERiAgLAk1OSAsCTB4RkZGRn0sDQorICAgIHsweDJGRTAgICwJMHgyRkVGICAsCTk5OSwJMHhGRkZGfSwNCisgICAgezB4MkZGMCAgLAkweDJGRkYgICwJNTkgLAkweEZGRkZ9LA0KKyAgICB7MHgzMDAwICAsCTB4MzAzRiAgLAk0OCAsCTB4RkZGRn0sDQorICAgIHsweDMwNDAgICwJMHgzMDlGICAsCTQ5ICwJOTMyICAgfSwNCisgICAgezB4MzBBMCAgLAkweDMwRkYgICwJNTAgLAk5MzIgICB9LA0KKyAgICB7MHgzMTAwICAsCTB4MzEyOSAgLAk1MSAsCTkzNiAgIH0sDQorICAgIHsweDMxMkEgICwJMHgzMTJGICAsCTUxICwJMHhGRkZGfSwNCisgICAgezB4MzEzMCAgLAkweDMxOEYgICwJNTIgLAk5NDkgICB9LA0KKyAgICB7MHgzMTkwICAsCTB4MzE5RiAgLAk1OSAsCTB4RkZGRn0sDQorICAgIHsweDMxQTAgICwJMHgzMUJGICAsCTUxICwJMHhGRkZGfSwNCisgICAgezB4MzFDMCAgLAkweDMxRUYgICwJNjEgLAkweEZGRkZ9LA0KKyAgICB7MHgzMUYwICAsCTB4MzFGRiAgLAk1MCAsCTB4RkZGRn0sDQorICAgIHsweDMyMDAgICwJMHgzMjFDICAsCTU0ICwJOTQ5ICAgfSwNCisgICAgezB4MzIxRCAgLAkweDMyNUYgICwJNTQgLAkweEZGRkZ9LA0KKyAgICB7MHgzMjYwICAsCTB4MzI3RiAgLAk1NCAsCTk0OSAgIH0sDQorICAgIHsweDMyODAgICwJMHgzMkZGICAsCTU0ICwJMHhGRkZGfSwNCisgICAgezB4MzMwMCAgLAkweDMzODcgICwJNTUgLAkweEZGRkZ9LA0KKyAgICB7MHgzMzg4ICAsCTB4MzNEMCAgLAk1NSAsCTk0OSAgIH0sDQorICAgIHsweDMzRDEgICwJMHgzM0ZGICAsCTU1ICwJMHhGRkZGfSwNCisgICAgezB4MzQwMCAgLAkweDREQkYgICwJNTkgLAkweEZGRkZ9LA0KKyAgICB7MHg0REMwICAsCTB4NERGRiAgLAk5OSAsCTB4RkZGRn0sDQorICAgIHsweDRFMDAgICwJMHg5RkE1ICAsCTU5ICwJOTM2ICAgfSwNCisgICAgezB4OUZBNiAgLAkweDlGRkYgICwJNTkgLAkweEZGRkZ9LA0KKyAgICB7MHhBMDAwICAsCTB4QTQ4RiAgLAk4MyAsCTB4RkZGRn0sDQorICAgIHsweEE0OTAgICwJMHhBNENGICAsCTgzICwJMHhGRkZGfSwNCisgICAgezB4QTREMCAgLAkweEE0RkYgICwJOTk5LAkweEZGRkZ9LA0KKyAgICB7MHhBNTAwICAsCTB4QTYzRiAgLAkxMiAsCTB4RkZGRn0sDQorICAgIHsweEE2NDAgICwJMHhBNjlGICAsCTkgICwJMHhGRkZGfSwNCisgICAgezB4QTZBMCAgLAkweEE2RkYgICwJOTk5LAkweEZGRkZ9LA0KKyAgICB7MHhBNzAwICAsCTB4QTcxRiAgLAk1ICAsCTB4RkZGRn0sDQorICAgIHsweEE3MjAgICwJMHhBN0ZGICAsCTI5ICwJMHhGRkZGfSwNCisgICAgezB4QTgwMCAgLAkweEE4MkYgICwJMTAwLAkweEZGRkZ9LA0KKyAgICB7MHhBODMwICAsCTB4QThGRiAgLAk5OTksCTB4RkZGRn0sDQorICAgIHsweEE4NDAgICwJMHhBODdGICAsCTUzICwJMHhGRkZGfSwNCisgICAgezB4QTg4MCAgLAkweEE4REYgICwJMTE1LAkweEZGRkZ9LA0KKyAgICB7MHhBOEUwICAsCTB4QThGRiAgLAk5OTksCTB4RkZGRn0sDQorICAgIHsweEE5MDAgICwJMHhBOTJGICAsCTExNiwJMHhGRkZGfSwNCisgICAgezB4QTkzMCAgLAkweEE5NUYgICwJMTE3LAkweEZGRkZ9LA0KKyAgICB7MHhBOTYwICAsCTB4QTlGRiAgLAk5OTksCTB4RkZGRn0sDQorICAgIHsweEFBMDAgICwJMHhBQTVGICAsCTExOCwJMHhGRkZGfSwNCisgICAgezB4QUE2MCAgLAkweEFCRkYgICwJOTk5LAkweEZGRkZ9LA0KKyAgICB7MHhBQzAwICAsCTB4RDdBRiAgLAk1NiAsCTk0OSAgIH0sDQorICAgIHsweEQ3QjAgICwJMHhEN0ZGICAsCTk5OSwJMHhGRkZGfSwNCisgICAgezB4RDgwMCAgLAkweERCN0YgICwJNTcgLAkweEZGRkZ9LA0KKyAgICB7MHhEQjgwICAsCTB4REJGRiAgLAk1NyAsCTB4RkZGRn0sDQorICAgIHsweERDMDAgICwJMHhERkZGICAsCTU3ICwJMHhGRkZGfSwNCisgICAgezB4RTAwMCAgLAkweEU4MTQgICwJNjAgLAkweEZGRkZ9LA0KKyAgICB7MHhFODE1ICAsCTB4RTg2NCAgLAk2MCAsCTkzNiAgIH0sDQorICAgIHsweEU4NjUgICwJMHhGOEZGICAsCTYwICwJMHhGRkZGfSwNCisgICAgezB4RjkwMCAgLAkweEZBMEIgICwJNjEgLAk5NDkgICB9LA0KKyAgICB7MHhGQTBDICAsCTB4RkEwRCAgLAk2MSAsCTkzNiAgIH0sDQorICAgIHsweEZBMEUgICwJMHhGQTJEICAsCTYxICwJOTMyICAgfSwNCisgICAgezB4RkEyRSAgLAkweEZBRkYgICwJNjEgLAkweEZGRkZ9LA0KKyAgICB7MHhGQjAwICAsCTB4RkI0RiAgLAk2MiAsCTB4RkZGRn0sDQorICAgIHsweEZCNTAgICwJMHhGREZGICAsCTYzICwJMTI1NiAgfSwNCisgICAgezB4RkUwMCAgLAkweEZFMEYgICwJOTEgLAkweEZGRkZ9LA0KKyAgICB7MHhGRTEwICAsCTB4RkUxRiAgLAk2NSAsCTB4RkZGRn0sDQorICAgIHsweEZFMjAgICwJMHhGRTJGICAsCTY0ICwJMHhGRkZGfSwNCisgICAgezB4RkUzMCAgLAkweEZFNEYgICwJNjUgLAkweEZGRkZ9LA0KKyAgICB7MHhGRTUwICAsCTB4RkU2RiAgLAk2NiAsCTB4RkZGRn0sDQorICAgIHsweEZFNzAgICwJMHhGRUZGICAsCTY3ICwJMTI1NiAgfSwNCisgICAgezB4RkYwMCAgLAkweEZGNUYgICwJNjggLAk5MzYgICB9LA0KKyAgICB7MHhGRjYwICAsCTB4RkY5RiAgLAk2OCAsCTkzMiAgIH0sDQorICAgIHsweEZGQTAgICwJMHhGRkVGICAsCTY4ICwJMHhGRkZGfSwNCit9Ow0KK0ZHQVNfTFBDRk9OVFVTQiBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZChGWF9XQ0hBUiB3VW5pY29kZSkNCit7DQorICAgIEZYX0lOVDMyIGlFbmQgPSBzaXplb2YoZ19GWEdkaUZvbnRVU0JUYWJsZSkgLyBzaXplb2YoRkdBU19GT05UVVNCKSAtIDE7DQorICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgICBkbyB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGNvbnN0IEZHQVNfRk9OVFVTQiAmdXNiID0gZ19GWEdkaUZvbnRVU0JUYWJsZVtpTWlkXTsNCisgICAgICAgIGlmICh3VW5pY29kZSA8IHVzYi53U3RhcnRVbmljb2RlKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIGlmICh3VW5pY29kZSA+IHVzYi53RW5kVW5pY29kZSkgew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gJnVzYjsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzA4OGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GR0FTX0ZPTlRVVElMX0hfDQorI2RlZmluZSBfRkdBU19GT05UVVRJTF9IXw0KK3R5cGVkZWYgc3RydWN0IF9GR0FTX0ZPTlRVU0Igew0KKyAgICBGWF9XQ0hBUgl3U3RhcnRVbmljb2RlOw0KKyAgICBGWF9XQ0hBUgl3RW5kVW5pY29kZTsNCisgICAgRlhfV09SRAkJd0JpdEZpZWxkOw0KKyAgICBGWF9XT1JECQl3Q29kZVBhZ2U7DQorfSBGR0FTX0ZPTlRVU0IsICogRkdBU19MUEZPTlRVU0I7DQordHlwZWRlZiBGR0FTX0ZPTlRVU0IgY29uc3QgKiBGR0FTX0xQQ0ZPTlRVU0I7DQorRlhfRFdPUkQgRkdBU19HZXRGb250SGFzaENvZGUoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyk7DQorRlhfRFdPUkQgRkdBU19HZXRGb250RmFtaWx5SGFzaChGWF9MUENXU1RSIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpOw0KK0ZHQVNfTFBDRk9OVFVTQiBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZChGWF9XQ0hBUiB3VW5pY29kZSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWI2NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2RpZm9udC5jcHAKQEAgLTAsMCArMSw1MzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9nZGlmb250LmgiDQorI2luY2x1ZGUgImZ4X3N0ZGZvbnRtZ3IuaCINCisjaWZkZWYgX0ZYUExVUw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KK0NGWF9HZGlGb250Q2FjaGU6OkNGWF9HZGlGb250Q2FjaGUoKQ0KKyAgICA6IG1fR2x5cGhNYXAoMTI4KQ0KK3sNCit9DQorQ0ZYX0dkaUZvbnRDYWNoZTo6fkNGWF9HZGlGb250Q2FjaGUoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcG9zID0gbV9HbHlwaE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIEZYX0lOVDMyIGlHbHlwaDsNCisgICAgRlhfTFBHRElHT0NBQ0hFIHBHbHlwaDsNCisgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgICAgICBwR2x5cGggPSBOVUxMOw0KKyAgICAgICAgbV9HbHlwaE1hcC5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKWlHbHlwaCwgKHZvaWQqJilwR2x5cGgpOw0KKyAgICAgICAgaWYgKHBHbHlwaCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRkRFX0ZyZWUocEdseXBoLT5wT3V0bGluZSk7DQorICAgICAgICAgICAgRkRFX0ZyZWUocEdseXBoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX0dseXBoTWFwLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGWF9HZGlGb250Q2FjaGU6OlNldENhY2hlZEdseXBoT3V0bGluZShGWF9EV09SRCBkd0dseXBoLCBjb25zdCBHTFlQSE1FVFJJQ1MgJmdtLCBGWF9MUEJZVEUgcE91dGxpbmUpDQorew0KKyAgICBGWFNZU19hc3NlcnQocE91dGxpbmUgIT0gTlVMTCk7DQorICAgIEZYX0xQR0RJR09DQUNIRSBwR2x5cGggPSAoRlhfTFBHRElHT0NBQ0hFKUZERV9BbGxvYyhzaXplb2YoRlhfR0RJR09DQUNIRSkpOw0KKyAgICBwR2x5cGgtPmdtID0gZ207DQorICAgIHBHbHlwaC0+cE91dGxpbmUgPSBwT3V0bGluZTsNCisgICAgbV9HbHlwaE1hcC5TZXRBdCgodm9pZCopZHdHbHlwaCwgKHZvaWQqKXBHbHlwaCk7DQorfQ0KK0ZYX0xQQ0dESUdPQ0FDSEUgQ0ZYX0dkaUZvbnRDYWNoZTo6R2V0Q2FjaGVkR2x5cGhPdXRsaW5lKEZYX0RXT1JEIGR3R2x5cGgpIGNvbnN0DQorew0KKyAgICBGWF9MUENHRElHT0NBQ0hFIHBHbHlwaCA9IE5VTEw7DQorICAgIGlmICghbV9HbHlwaE1hcC5Mb29rdXAoKHZvaWQqKWR3R2x5cGgsICh2b2lkKiYpcEdseXBoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBwR2x5cGg7DQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorew0KKyAgICBDRlhfR2RpRm9udCAqcEZvbnQgPSBGWF9ORVcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgICBpZiAoIXBGb250LT5Mb2FkRm9udChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpTGVuZ3RoLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorew0KKyAgICBDRlhfR2RpRm9udCAqcEZvbnQgPSBGWF9ORVcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgICBpZiAoIXBGb250LT5Mb2FkRm9udChwQnVmZmVyLCBpTGVuZ3RoKSkgew0KKyAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCit9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChGWF9MUENXU1RSIHBzekZpbGVOYW1lLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorew0KKyAgICBDRlhfR2RpRm9udCAqcEZvbnQgPSBGWF9ORVcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgICBpZiAoIXBGb250LT5Mb2FkRm9udChwc3pGaWxlTmFtZSkpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0sIElGWF9Gb250TWdyICpwRm9udE1nciwgRlhfQk9PTCBiU2F2ZVN0cmVhbSApDQorew0KKyAgICBDRlhfR2RpRm9udCAqcEZvbnQgPSBGWF9ORVcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgICBpZiAoIXBGb250LT5Mb2FkRm9udChwRm9udFN0cmVhbSkpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoQ0ZYX0ZvbnQgKnBFeHRGb250LCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorew0KKyAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorI2RlZmluZSBGWF9HRElGT05UX0ZPTlRDQUNIRVNJWkUJOA0KK0NGWF9HZGlGb250OjpDRlhfR2RpRm9udChJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorICAgIDogbV9wRm9udE1ncihwRm9udE1ncikNCisgICAgLCBtX2lSZWZDb3VudCgxKQ0KKyAgICAsIG1fV2lkdGhDYWNoZSgxMDI0KQ0KKyAgICAsIG1faE9sZEZvbnQoTlVMTCkNCisgICAgLCBtX2hGb250KE5VTEwpDQorICAgICwgbV9oREMoTlVMTCkNCisgICAgLCBtX3dzRm9udEZpbGVOYW1lKCkNCisgICAgLCBtX0ZvbnRGYW1pbGllcygpDQorICAgICwgbV9oUmVzKE5VTEwpDQorICAgICwgbV9kd1N0eWxlcygwKQ0KKyAgICAsIG1fU3Vic3RGb250cygpDQorICAgICwgbV9Gb250TWFwcGVyKDE2KQ0KKyAgICAsIG1fRm9udENhY2hlKEZYX0dESUZPTlRfRk9OVENBQ0hFU0laRSkNCit7DQorICAgIG1faERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7DQorICAgIEZYX21lbXNldCgmbV9Mb2dGb250LCAwLCBzaXplb2YobV9Mb2dGb250KSk7DQorICAgIEZYU1lTX2Fzc2VydChtX2hEQyAhPSBOVUxMKTsNCit9DQorQ0ZYX0dkaUZvbnQ6On5DRlhfR2RpRm9udCgpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpXTsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgbV9TdWJzdEZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgICBtX0ZvbnRNYXBwZXIuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChtX2hGb250ICE9IE5VTEwpIHsNCisgICAgICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBtX2hPbGRGb250KTsNCisgICAgICAgIDo6RGVsZXRlT2JqZWN0KG1faEZvbnQpOw0KKyAgICB9DQorICAgIDo6RGVsZXRlREMobV9oREMpOw0KKyAgICBpZiAobV9oUmVzICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChtX3dzRm9udEZpbGVOYW1lLkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICAgIDo6UmVtb3ZlRm9udFJlc291cmNlVygoRlhfTFBDV1NUUiltX3dzRm9udEZpbGVOYW1lKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgOjpSZW1vdmVGb250TWVtUmVzb3VyY2VFeChtX2hSZXMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fV2lkdGhDYWNoZS5SZW1vdmVBbGwoKTsNCisgICAgQ2xlYXJDYWNoZSgpOw0KK30NCit2b2lkIENGWF9HZGlGb250OjpDbGVhckNhY2hlKCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIElGWF9Gb250ICpwRm9udCA9IChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2ldOw0KKyAgICAgICAgKChDRlhfR2RpRm9udCopcEZvbnQpLT5DbGVhckNhY2hlKCk7DQorICAgIH0NCisgICAgRlhfUE9TSVRJT04gcG9zID0gbV9Gb250Q2FjaGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICBGWF9EV09SRCBkd01BVDI7DQorICAgIENGWF9HZGlGb250Q2FjaGUgKnBDYWNoZTsNCisgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgICAgICBwQ2FjaGUgPSBOVUxMOw0KKyAgICAgICAgbV9Gb250Q2FjaGUuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilkd01BVDIsICh2b2lkKiYpcENhY2hlKTsNCisgICAgICAgIGlmIChwQ2FjaGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwQ2FjaGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9Gb250Q2FjaGUuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZYX0dkaUZvbnQ6OlJlbGVhc2UoKQ0KK3sNCisgICAgaWYgKC0tIG1faVJlZkNvdW50IDwgMSkgew0KKyAgICAgICAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcEZvbnRNZ3ItPlJlbW92ZUZvbnQodGhpcyk7DQorICAgICAgICB9DQorICAgICAgICBkZWxldGUgdGhpczsNCisgICAgfQ0KK30NCitJRlhfRm9udCogQ0ZYX0dkaUZvbnQ6OlJldGFpbigpDQorew0KKyAgICArKyBtX2lSZWZDb3VudDsNCisgICAgcmV0dXJuIHRoaXM7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkxvYWRGb250KEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2hGb250ID09IE5VTEwpOw0KKyAgICBMT0dGT05UVyBsZjsNCisgICAgRlhfbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKGxmKSk7DQorICAgIGxmLmxmSGVpZ2h0ID0gLTEwMDA7DQorICAgIGxmLmxmV2VpZ2h0ID0gKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSA/IEZXX0JPTEQgOiBGV19OT1JNQUw7DQorICAgIGxmLmxmSXRhbGljID0gKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpICE9IDA7DQorICAgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpID8gRklYRURfUElUQ0ggOiBWQVJJQUJMRV9QSVRDSDsNCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgew0KKyAgICAgICAgbGYubGZQaXRjaEFuZEZhbWlseSB8PSBGRl9ST01BTjsNCisgICAgfQ0KKyAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NjcmlwdCkgew0KKyAgICAgICAgbGYubGZQaXRjaEFuZEZhbWlseSB8PSBGRl9TQ1JJUFQ7DQorICAgIH0NCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgew0KKyAgICAgICAgbGYubGZDaGFyU2V0ID0gU1lNQk9MX0NIQVJTRVQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9XT1JEIHdDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZSh3Q29kZVBhZ2UpOw0KKyAgICAgICAgbGYubGZDaGFyU2V0ID0gd0NoYXJTZXQgIT0gMHhGRkZGID8gKEZYX0JZVEUpd0NoYXJTZXQgOiBERUZBVUxUX0NIQVJTRVQ7DQorICAgIH0NCisgICAgaWYgKHBzekZvbnRGYW1pbHkgPT0gTlVMTCkgew0KKyAgICAgICAgbGYubGZGYWNlTmFtZVswXSA9IEwnXDAnOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhTWVNfd2NzbmNweShsZi5sZkZhY2VOYW1lLCBwc3pGb250RmFtaWx5LCAzMSk7DQorICAgIH0NCisgICAgcmV0dXJuIExvYWRGb250KGxmKTsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpTGVuZ3RoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCAmJiBwQnVmZmVyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgICBHZGlwbHVzOjpQcml2YXRlRm9udENvbGxlY3Rpb24gcGZjOw0KKyAgICBpZiAocGZjLkFkZE1lbW9yeUZvbnQocEJ1ZmZlciwgaUxlbmd0aCkgIT0gR2RpcGx1czo6T2spIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoR2V0Rm9udEZhbWlsaWVzKHBmYykgPCAxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdDb3VudCA9IDA7DQorICAgIG1faFJlcyA9IDo6QWRkRm9udE1lbVJlc291cmNlRXgoKHZvaWQqKXBCdWZmZXIsIGlMZW5ndGgsIDAsICZkd0NvdW50KTsNCisgICAgaWYgKG1faFJlcyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGYW1pbHkgPSBtX0ZvbnRGYW1pbGllc1swXTsNCisgICAgbV9oRm9udCA9IDo6Q3JlYXRlRm9udFcoLTEwMDAsIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIDAsIDAsIERFRkFVTFRfQ0hBUlNFVCwgMCwgMCwgMCwgMCwgKEZYX0xQQ1dTVFIpd3NGYW1pbHkpOw0KKyAgICBpZiAobV9oRm9udCA9PSBOVUxMKSB7DQorICAgICAgICA6OlJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KG1faFJlcyk7DQorICAgICAgICBtX2hSZXMgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KKyAgICBtX2hPbGRGb250ID0gOjpTZWxlY3RPYmplY3QobV9oREMsIG1faEZvbnQpOw0KKyAgICA6OkdldE91dGxpbmVUZXh0TWV0cmljc1cobV9oREMsIHNpemVvZihtX091dGxpbmVUTSksICZtX091dGxpbmVUTSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9HZGlGb250OjpMb2FkRm9udChGWF9MUENXU1RSIHBzekZpbGVOYW1lKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCAmJiBwc3pGaWxlTmFtZSAhPSBOVUxMKTsNCisgICAgR2RpcGx1czo6UHJpdmF0ZUZvbnRDb2xsZWN0aW9uIHBmYzsNCisgICAgaWYgKHBmYy5BZGRGb250RmlsZShwc3pGaWxlTmFtZSkgIT0gR2RpcGx1czo6T2spIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoR2V0Rm9udEZhbWlsaWVzKHBmYykgPCAxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV93c0ZvbnRGaWxlTmFtZSA9IHBzekZpbGVOYW1lOw0KKyAgICBtX2hSZXMgPSAoSEFORExFKTo6QWRkRm9udFJlc291cmNlVyhwc3pGaWxlTmFtZSk7DQorICAgIGlmIChtX2hSZXMgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5ID0gbV9Gb250RmFtaWxpZXNbMF07DQorICAgIG1faEZvbnQgPSA6OkNyZWF0ZUZvbnRXKC0xMDAwLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCAwLCAwLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsIDAsIDAsIChGWF9MUENXU1RSKXdzRmFtaWx5KTsNCisgICAgaWYgKG1faEZvbnQgPT0gTlVMTCkgew0KKyAgICAgICAgOjpSZW1vdmVGb250UmVzb3VyY2VXKHBzekZpbGVOYW1lKTsNCisgICAgICAgIG1faFJlcyA9IE5VTEw7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgUmV0cmlldmVGb250U3R5bGVzKCk7DQorICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBtX2hGb250KTsNCisgICAgOjpHZXRPdXRsaW5lVGV4dE1ldHJpY3NXKG1faERDLCBzaXplb2YobV9PdXRsaW5lVE0pLCAmbV9PdXRsaW5lVE0pOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0pDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRm9udCA9PSBOVUxMICYmIHBGb250U3RyZWFtICE9IE5VTEwpOw0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEZvbnRTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9MUEJZVEUgcEJ1ZiA9IChGWF9MUEJZVEUpRkRFX0FsbG9jKGlMZW5ndGgpOw0KKyAgICBpZiAocEJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaUxlbmd0aCA9IHBGb250U3RyZWFtLT5SZWFkRGF0YShwQnVmLCBpTGVuZ3RoKTsNCisgICAgRlhfQk9PTCBiUmV0ID0gTG9hZEZvbnQocEJ1ZiwgaUxlbmd0aCk7DQorICAgIEZERV9GcmVlKHBCdWYpOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoY29uc3QgTE9HRk9OVFcgJmxmKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCk7DQorICAgIG1faEZvbnQgPSA6OkNyZWF0ZUZvbnRJbmRpcmVjdFcoKExQTE9HRk9OVFcpJmxmKTsNCisgICAgaWYgKG1faEZvbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KKyAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgbV9oRm9udCk7DQorICAgIDo6R2V0T3V0bGluZVRleHRNZXRyaWNzVyhtX2hEQywgc2l6ZW9mKG1fT3V0bGluZVRNKSwgJm1fT3V0bGluZVRNKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENGWF9HZGlGb250OjpHZXRGb250RmFtaWxpZXMoR2RpcGx1czo6Rm9udENvbGxlY3Rpb24gJmZjKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gZmMuR2V0RmFtaWx5Q291bnQoKTsNCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICAgIHJldHVybiBpQ291bnQ7DQorICAgIH0NCisgICAgR2RpcGx1czo6Rm9udEZhbWlseSAqcEZvbnRGYW1pbGllcyA9IChHZGlwbHVzOjpGb250RmFtaWx5KilGREVfQWxsb2MoaUNvdW50ICogc2l6ZW9mKEdkaXBsdXM6OkZvbnRGYW1pbHkpKTsNCisgICAgaWYgKHBGb250RmFtaWxpZXMgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlGaW5kID0gMDsNCisgICAgZmMuR2V0RmFtaWxpZXMoaUNvdW50LCBwRm9udEZhbWlsaWVzLCAmaUZpbmQpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZhbWlseU5hbWU7DQorICAgICAgICBGWF9MUFdTVFIgcE5hbWUgPSB3c0ZhbWlseU5hbWUuR2V0QnVmZmVyKExGX0ZBQ0VTSVpFKTsNCisgICAgICAgIHBGb250RmFtaWxpZXNbaV0uR2V0RmFtaWx5TmFtZShwTmFtZSk7DQorICAgICAgICB3c0ZhbWlseU5hbWUuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgICAgICAgbV9Gb250RmFtaWxpZXMuQWRkKHdzRmFtaWx5TmFtZSk7DQorICAgIH0NCisgICAgRkRFX0ZyZWUocEZvbnRGYW1pbGllcyk7DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZYX0dkaUZvbnQ6OlJldHJpZXZlRm9udFN0eWxlcygpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRm9udCAhPSBOVUxMKTsNCisgICAgRlhfbWVtc2V0KCZtX0xvZ0ZvbnQsIDAsIHNpemVvZihtX0xvZ0ZvbnQpKTsNCisgICAgOjpHZXRPYmplY3RXKG1faEZvbnQsIHNpemVvZihtX0xvZ0ZvbnQpLCAmbV9Mb2dGb250KTsNCisgICAgbV9kd1N0eWxlcyA9IEZYX0dldEdkaUZvbnRTdHlsZXMobV9Mb2dGb250KTsNCit9DQordm9pZCBDRlhfR2RpRm9udDo6R2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyAmd3NGYW1pbHkpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQobV9oRm9udCAhPSBOVUxMKTsNCisgICAgd3NGYW1pbHkgPSBtX0xvZ0ZvbnQubGZGYWNlTmFtZTsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJSZWN1cnNpdmUsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgaVdpZHRoID0gKEZYX0lOVDMyKShGWF9TSE9SVCltX1dpZHRoQ2FjaGUuR2V0QXQod1VuaWNvZGUsIDApOw0KKyAgICBpZiAoaVdpZHRoID09IDAgfHwgaVdpZHRoID09IC0xKSB7DQorICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSBOVUxMOw0KKyAgICAgICAgRlhfSU5UMzIgaUdseXBoID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgVFJVRSwgJnBGb250LCBiQ2hhckNvZGUpOw0KKyAgICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYgJiYgcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgICAgICAgICAgaWYgKCE6OkdldENoYXJXaWR0aEkobV9oREMsIGlHbHlwaCwgMSwgTlVMTCwgJmlXaWR0aCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGlXaWR0aCA9IC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmICgoKENGWF9HZGlGb250KilwRm9udCktPkdldENoYXJXaWR0aCh3VW5pY29kZSwgaVdpZHRoLCBGQUxTRSwgYkNoYXJDb2RlKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlXaWR0aCA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgTG9jaygpOw0KKyAgICAgICAgbV9XaWR0aENhY2hlLlNldEF0R3Jvdyh3VW5pY29kZSwgKEZYX1NIT1JUKWlXaWR0aCk7DQorICAgICAgICBVbmxvY2soKTsNCisgICAgfQ0KKyAgICByZXR1cm4gaVdpZHRoID4gMDsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSkNCit7DQorICAgIHJldHVybiBHZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgVFJVRSwgYkNoYXJDb2RlKTsNCit9DQorRlhfSU5UMzIgQ0ZYX0dkaUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgSUZYX0ZvbnQgKipwcEZvbnQsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgRlhfSU5UMzIgaUdseXBoID0gMFhGRkZGOw0KKyAgICBpZiAoOjpHZXRHbHlwaEluZGljZXNXKG1faERDLCAmd1VuaWNvZGUsIDEsIChMUFdPUkQpJmlHbHlwaCwgR0dJX01BUktfTk9ORVhJU1RJTkdfR0xZUEhTKSAhPSBHRElfRVJST1IgJiYgaUdseXBoICE9IDB4RkZGRikgew0KKyAgICAgICAgaWYgKHBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgKnBwRm9udCA9IChJRlhfRm9udCopdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBpR2x5cGg7DQorICAgIH0NCisgICAgRlhfTFBDRk9OVFVTQiBwRm9udFVTQiA9IEZYX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7DQorICAgIGlmIChwRm9udFVTQiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMHhGRkZGOw0KKyAgICB9DQorICAgIEZYX1dPUkQgd0JpdEZpZWxkID0gcEZvbnRVU0ItPndCaXRGaWVsZDsNCisgICAgaWYgKHdCaXRGaWVsZCA+PSAxMjgpIHsNCisgICAgICAgIHJldHVybiAweEZGRkY7DQorICAgIH0NCisgICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCisgICAgbV9Gb250TWFwcGVyLkxvb2t1cCgodm9pZCopd0JpdEZpZWxkLCAodm9pZComKXBGb250KTsNCisgICAgaWYgKHBGb250ICE9IE5VTEwgJiYgcEZvbnQgIT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgICAgICBpR2x5cGggPSAoKENGWF9HZGlGb250KilwRm9udCktPkdldEdseXBoSW5kZXgod1VuaWNvZGUsIEZBTFNFLCBOVUxMLCBiQ2hhckNvZGUpOw0KKyAgICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpID0gbV9TdWJzdEZvbnRzLkZpbmQocEZvbnQpOw0KKyAgICAgICAgICAgIGlmIChpID4gLTEpIHsNCisgICAgICAgICAgICAgICAgaUdseXBoIHw9ICgoaSArIDEpIDw8IDI0KTsNCisgICAgICAgICAgICAgICAgaWYgKHBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAqcHBGb250ID0gcEZvbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGlHbHlwaDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCAmJiBiUmVjdXJzaXZlKSB7DQorICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSBtX3BGb250TWdyLT5HZXREZWZGb250QnlVbmljb2RlKHdVbmljb2RlLCBtX2R3U3R5bGVzLCBtX0xvZ0ZvbnQubGZGYWNlTmFtZSk7DQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4RkZGRjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9Gb250TWFwcGVyLlNldEF0KCh2b2lkKil3Qml0RmllbGQsICh2b2lkKilwRm9udCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaSA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQorICAgICAgICAgICAgbV9TdWJzdEZvbnRzLkFkZChwRm9udCk7DQorICAgICAgICAgICAgaUdseXBoID0gKChDRlhfR2RpRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgICAgICAgICBpZiAoaUdseXBoICE9IDB4RkZGRikgew0KKyAgICAgICAgICAgICAgICBpR2x5cGggfD0gKChpICsgMSkgPDwgMjQpOw0KKyAgICAgICAgICAgICAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICpwcEZvbnQgPSBwRm9udDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gaUdseXBoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMHhGRkZGOw0KK30NCitGWF9JTlQzMiBDRlhfR2RpRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUpDQorew0KKyAgICByZXR1cm4gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgVFJVRSwgTlVMTCwgYkNoYXJDb2RlKTsNCit9DQorRlhfSU5UMzIgQ0ZYX0dkaUZvbnQ6OkdldEFzY2VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9PdXRsaW5lVE0ub3RtQXNjZW50Ow0KK30NCitGWF9JTlQzMiBDRlhfR2RpRm9udDo6R2V0RGVzY2VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9PdXRsaW5lVE0ub3RtRGVzY2VudDsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsIENGWF9SZWN0ICZiYm94LCBGWF9CT09MIGJDaGFyQ29kZSkNCit7DQorICAgIEZYX0lOVDMyIGlHbHlwaEluZGV4ID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgYkNoYXJDb2RlKTsNCisgICAgaWYgKGlHbHlwaEluZGV4ID09IDB4RkZGRikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGWF9Gb250ICpwRm9udCA9IEdldFN1YnN0Rm9udChpR2x5cGhJbmRleCk7DQorICAgIGlmIChwRm9udCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgR0xZUEhNRVRSSUNTIGdtOw0KKyAgICBpR2x5cGhJbmRleCAmPSAweDAwRkZGRkZGOw0KKyAgICBzdGF0aWMgY29uc3QgTUFUMiBtYXQyID0ge3swLCAxfSwgezAsIDB9LCB7MCwgMH0sIHswLCAxfX07DQorICAgIGlmICg6OkdldEdseXBoT3V0bGluZVcoKChDRlhfR2RpRm9udCopcEZvbnQpLT5tX2hEQywgaUdseXBoSW5kZXgsIEdHT19HTFlQSF9JTkRFWCB8IEdHT19NRVRSSUNTLCAmZ20sIDAsIE5VTEwsICZtYXQyKSAhPSBHRElfRVJST1IpIHsNCisgICAgICAgIGJib3gubGVmdCA9IGdtLmdtcHRHbHlwaE9yaWdpbi54Ow0KKyAgICAgICAgYmJveC50b3AgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsNCisgICAgICAgIGJib3gud2lkdGggPSBnbS5nbUJsYWNrQm94WDsNCisgICAgICAgIGJib3guaGVpZ2h0ID0gZ20uZ21CbGFja0JveFk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldEJCb3goQ0ZYX1JlY3QgJmJib3gpDQorew0KKyAgICBiYm94LmxlZnQgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3gubGVmdDsNCisgICAgYmJveC50b3AgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3gudG9wOw0KKyAgICBiYm94LndpZHRoID0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LnJpZ2h0IC0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LmxlZnQ7DQorICAgIGJib3guaGVpZ2h0ID0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LmJvdHRvbSAtIG1fT3V0bGluZVRNLm90bXJjRm9udEJveC50b3A7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9JTlQzMiBDRlhfR2RpRm9udDo6R2V0SXRhbGljQW5nbGUoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fT3V0bGluZVRNLm90bUl0YWxpY0FuZ2xlIC8gMTA7DQorfQ0KK3ZvaWQgQ0ZYX0dkaUZvbnQ6OlJlc2V0KCkNCit7DQorICAgIExvY2soKTsNCisgICAgbV9XaWR0aENhY2hlLlJlbW92ZUFsbCgpOw0KKyAgICBDbGVhckNhY2hlKCk7DQorICAgIFVubG9jaygpOw0KK30NCitJRlhfRm9udCogQ0ZYX0dkaUZvbnQ6OkdldFN1YnN0Rm9udChGWF9JTlQzMiBpR2x5cGhJbmRleCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlIaWdoZXIgPSAoaUdseXBoSW5kZXggJiAweDdGMDAwMDAwKSA+PiAyNDsNCisgICAgaWYgKGlIaWdoZXIgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIChJRlhfRm9udCopdGhpczsNCisgICAgfQ0KKyAgICBpZiAoaUhpZ2hlciA+IG1fU3Vic3RGb250cy5HZXRTaXplKCkpIHsNCisgICAgICAgIHJldHVybiAoSUZYX0ZvbnQqKXRoaXM7DQorICAgIH0NCisgICAgcmV0dXJuIChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2lIaWdoZXIgLSAxXTsNCit9DQorRlhfRFdPUkQgQ0ZYX0dkaUZvbnQ6OkdldEdseXBoRElCaXRzKEZYX0lOVDMyIGlHbHlwaEluZGV4LCBGWF9BUkdCIGFyZ2IsIGNvbnN0IE1BVDIgKnBNYXRyaXgsIEdMWVBITUVUUklDUyAmZ20sIEZYX0xQVk9JRCBwQnVmZmVyLCBGWF9EV09SRCBidWZTaXplKQ0KK3sNCisgICAgc3RhdGljIGNvbnN0IFVJTlQgdUZvcm1hdCA9IEdHT19HTFlQSF9JTkRFWCB8IEdHT19HUkFZOF9CSVRNQVA7DQorICAgIElGWF9Gb250ICpwRm9udCA9IEdldFN1YnN0Rm9udChpR2x5cGhJbmRleCk7DQorICAgIGlmIChwRm9udCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAocEZvbnQgIT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgICAgICByZXR1cm4gKChDRlhfR2RpRm9udCopcEZvbnQpLT5HZXRHbHlwaERJQml0cyhpR2x5cGhJbmRleCAmIDB4MDBGRkZGRkYsIGFyZ2IsIHBNYXRyaXgsIGdtLCBwQnVmZmVyLCBidWZTaXplKTsNCisgICAgfQ0KKyAgICBGWF9MUEJZVEUgcEdseXBoT3V0bGluZSA9IE5VTEw7DQorICAgIEZYU1lTX2Fzc2VydChwTWF0cml4ICE9IE5VTEwpOw0KKyAgICBGWF9EV09SRCBkd01BVDIgPSBHZXRNQVQySGFzaENvZGUoKGNvbnN0IEZJWEVEKilwTWF0cml4KTsNCisgICAgQ0ZYX0dkaUZvbnRDYWNoZSAqcENhY2hlID0gTlVMTDsNCisgICAgaWYgKG1fRm9udENhY2hlLkxvb2t1cCgodm9pZCopZHdNQVQyLCAodm9pZComKXBDYWNoZSkgJiYgcENhY2hlICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0xQQ0dESUdPQ0FDSEUgcEdPID0gcENhY2hlLT5HZXRDYWNoZWRHbHlwaE91dGxpbmUoaUdseXBoSW5kZXgpOw0KKyAgICAgICAgaWYgKHBHTyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgZ20gPSBwR08tPmdtOw0KKyAgICAgICAgICAgIHBHbHlwaE91dGxpbmUgPSBwR08tPnBPdXRsaW5lOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwR2x5cGhPdXRsaW5lID09IE5VTEwpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3R2x5cGhTaXplID0gOjpHZXRHbHlwaE91dGxpbmVXKG1faERDLCBpR2x5cGhJbmRleCwgdUZvcm1hdCwgJmdtLCAwLCBOVUxMLCBwTWF0cml4KTsNCisgICAgICAgIGlmIChkd0dseXBoU2l6ZSA9PSAwIHx8IGR3R2x5cGhTaXplID09IEdESV9FUlJPUikgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEdseXBoT3V0bGluZSA9IChGWF9MUEJZVEUpRlhfQWxsb2MoZHdHbHlwaFNpemUpOw0KKyAgICAgICAgOjpHZXRHbHlwaE91dGxpbmVXKG1faERDLCBpR2x5cGhJbmRleCwgdUZvcm1hdCwgJmdtLCBkd0dseXBoU2l6ZSwgcEdseXBoT3V0bGluZSwgcE1hdHJpeCk7DQorICAgICAgICBpZiAocENhY2hlID09IE5VTEwpIHsNCisgICAgICAgICAgICBwQ2FjaGUgPSBGWF9ORVcgQ0ZYX0dkaUZvbnRDYWNoZTsNCisgICAgICAgICAgICBpZiAobV9Gb250Q2FjaGUuR2V0Q291bnQoKSA+PSBGWF9HRElGT05UX0ZPTlRDQUNIRVNJWkUpIHsNCisgICAgICAgICAgICAgICAgQ2xlYXJDYWNoZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX0ZvbnRDYWNoZS5TZXRBdCgodm9pZCopZHdNQVQyLCAodm9pZCopcENhY2hlKTsNCisgICAgICAgIH0NCisgICAgICAgIHBDYWNoZS0+U2V0Q2FjaGVkR2x5cGhPdXRsaW5lKGlHbHlwaEluZGV4LCBnbSwgcEdseXBoT3V0bGluZSk7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdEaWJTaXplID0gZ20uZ21CbGFja0JveFggKiA0ICogZ20uZ21CbGFja0JveFk7DQorICAgIGlmIChwQnVmZmVyID09IE5VTEwgfHwgYnVmU2l6ZSA8IGR3RGliU2l6ZSkgew0KKyAgICAgICAgcmV0dXJuIGR3RGliU2l6ZTsNCisgICAgfQ0KKyAgICBDcmVhdGVHbHlwaEJpdG1hcChnbS5nbUJsYWNrQm94WCwgZ20uZ21CbGFja0JveFksIHBHbHlwaE91dGxpbmUsIChGWF9MUERXT1JEKXBCdWZmZXIsIGFyZ2IpOw0KKyAgICByZXR1cm4gZHdEaWJTaXplOw0KK30NCitGWF9EV09SRCBDRlhfR2RpRm9udDo6R2V0SGFzaENvZGUoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEZYX0dldEZvbnRIYXNoQ29kZShGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KG1fTG9nRm9udC5sZkNoYXJTZXQpLCBGWF9HZXRHZGlGb250U3R5bGVzKG1fTG9nRm9udCkpOw0KK30NCitGWF9EV09SRCBDRlhfR2RpRm9udDo6R2V0TUFUMkhhc2hDb2RlKGNvbnN0IEZJWEVEICpwRml4ZWQpDQorew0KKyAgICBGWFNZU19hc3NlcnQocEZpeGVkICE9IE5VTEwpOw0KKyAgICBGWF9EV09SRCBkd0hhc2gxID0gMCwgZHdIYXNoMiA9IDUzODEsIGR3UmV0Ow0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsNCisgICAgICAgIGR3UmV0ID0gKigoY29uc3QgRlhfRFdPUkQqKXBGaXhlZCk7DQorICAgICAgICBkd0hhc2gxID0gMTMxMyAqIGR3SGFzaDEgKyBkd1JldDsNCisgICAgICAgIGR3SGFzaDIgKz0gKGR3SGFzaDIgPDwgNSkgKyBkd1JldDsNCisgICAgICAgIHBGaXhlZCArKzsNCisgICAgfQ0KKyAgICByZXR1cm4gKChkd0hhc2gxICYgMHgwMDAwRkZGRikgPDwgMTYpIHwgKGR3SGFzaDIgJiAweDAwMDBGRkZGKTsNCit9DQordm9pZCBDRlhfR2RpRm9udDo6Q3JlYXRlR2x5cGhCaXRtYXAoRlhfSU5UMzIgaVdpZHRoLCBGWF9JTlQzMiBpSGVpZ2h0LCBGWF9MUEJZVEUgcE91dGxpbmUsIEZYX0xQRFdPUkQgcERJQiwgRlhfQVJHQiBhcmdiKQ0KK3sNCisgICAgRlhfSU5UMzIgcGFkZGluZyA9ICgoaVdpZHRoICsgMykgLyA0KSAqIDQgLSBpV2lkdGg7DQorICAgIEZYX0RXT1JEIGFscGhhOw0KKyAgICBGWF9JTlQzMiBpLCBqOw0KKyAgICBmb3IgKGogPSBpSGVpZ2h0IC0gMTsgaiA+PSAwOyAtLWopIHsNCisgICAgICAgIGZvciAoaSA9IGlXaWR0aCAtIDE7IGkgPj0gMDsgLS1pKSB7DQorICAgICAgICAgICAgaWYgKChhbHBoYSA9ICpwT3V0bGluZSsrKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICpwRElCKysgPSAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGFscGhhID0gKGFyZ2IgPj4gMjQpICogKGFscGhhICogNCAtIDEpIC8gMjU2Ow0KKyAgICAgICAgICAgICAgICAqcERJQisrID0gKGFscGhhIDw8IDI0KSB8IChhcmdiICYgMHgwMEZGRkZGRik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcE91dGxpbmUgKz0gcGFkZGluZzsNCisgICAgfQ0KK30NCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2RpZm9udC5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ4OGYzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuaApAQCAtMCwwICsxLDg5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0dESU9CSkVDVF9JTVANCisjZGVmaW5lIF9GWF9HRElPQkpFQ1RfSU1QDQorI2lmZGVmIF9GWFBMVVMNCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCit0eXBlZGVmIHN0cnVjdCBfRlhfR0RJR09DQUNIRSB7DQorICAgIEdMWVBITUVUUklDUwlnbTsNCisgICAgRlhfTFBCWVRFCQlwT3V0bGluZTsNCit9IEZYX0dESUdPQ0FDSEUsICogRlhfTFBHRElHT0NBQ0hFOw0KK3R5cGVkZWYgRlhfR0RJR09DQUNIRSBjb25zdCAqIEZYX0xQQ0dESUdPQ0FDSEU7DQorY2xhc3MgQ0ZYX0dkaUZvbnRDYWNoZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0dkaUZvbnRDYWNoZSgpOw0KKyAgICB+Q0ZYX0dkaUZvbnRDYWNoZSgpOw0KKyAgICB2b2lkCQkJCVNldENhY2hlZEdseXBoT3V0bGluZShGWF9EV09SRCBkd0dseXBoLCBjb25zdCBHTFlQSE1FVFJJQ1MgJmdtLCBGWF9MUEJZVEUgcE91dGxpbmUpOw0KKyAgICBGWF9MUENHRElHT0NBQ0hFCUdldENhY2hlZEdseXBoT3V0bGluZShGWF9EV09SRCBkd0dseXBoKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9NYXBQdHJUb1B0cgkJbV9HbHlwaE1hcDsNCit9Ow0KK2NsYXNzIENGWF9HZGlGb250IDogcHVibGljIElGWF9Gb250LCBwdWJsaWMgQ0ZYX1RocmVhZExvY2ssIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0dkaUZvbnQoSUZYX0ZvbnRNZ3IgKnBGb250TWdyKTsNCisgICAgfkNGWF9HZGlGb250KCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCVJldGFpbigpOw0KKyAgICBGWF9CT09MCQkJTG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGb250KEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUxlbmd0aCk7DQorICAgIEZYX0JPT0wJCQlMb2FkRm9udChGWF9MUENXU1RSIHBzekZpbGVOYW1lKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGb250KGNvbnN0IExPR0ZPTlRXICZsZik7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlEZXJpdmUoRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDApDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzRmFtaWx5KSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Rm9udFN0eWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2R3U3R5bGVzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQllURQkJCUdldENoYXJTZXQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9Mb2dGb250LmxmQ2hhclNldDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0lOVDMyICZpV2lkdGgsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0QXNjZW50KCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldERlc2NlbnQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsIENGWF9SZWN0ICZiYm94LCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChDRlhfUmVjdCAmYmJveCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCk7DQorICAgIEZYX0RXT1JECQlHZXRHbHlwaERJQml0cyhGWF9JTlQzMiBpR2x5cGhJbmRleCwgRlhfQVJHQiBhcmdiLCBjb25zdCBNQVQyICpwTWF0cml4LCBHTFlQSE1FVFJJQ1MgJmdtLCBGWF9MUFZPSUQgcEJ1ZmZlciwgRlhfRFdPUkQgYnVmU2l6ZSk7DQorICAgIEZYX0RXT1JECQlHZXRIYXNoQ29kZSgpIGNvbnN0Ow0KK3Byb3RlY3RlZDoNCisgICAgSUZYX0ZvbnRNZ3IJCQkJKm1fcEZvbnRNZ3I7DQorICAgIEZYX0lOVDMyCQkJCW1faVJlZkNvdW50Ow0KKyAgICBDRlhfV29yZERpc2NyZXRlQXJyYXkJbV9XaWR0aENhY2hlOw0KKyAgICBPVVRMSU5FVEVYVE1FVFJJQ1cJCW1fT3V0bGluZVRNOw0KKyAgICBIR0RJT0JKCQkJCQltX2hPbGRGb250Ow0KKyAgICBIRk9OVAkJCQkJbV9oRm9udDsNCisgICAgSERDCQkJCQkJbV9oREM7DQorICAgIExPR0ZPTlRXCQkJCW1fTG9nRm9udDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzRm9udEZpbGVOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQltX0ZvbnRGYW1pbGllczsNCisgICAgSEFORExFCQkJCQltX2hSZXM7DQorICAgIEZYX0RXT1JECQkJCW1fZHdTdHlsZXM7DQorICAgIENGWF9QdHJBcnJheQkJCW1fU3Vic3RGb250czsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9Gb250TWFwcGVyOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0ZvbnRDYWNoZTsNCisgICAgdm9pZAkJCUNsZWFyQ2FjaGUoKTsNCisgICAgRlhfSU5UMzIJCUdldEZvbnRGYW1pbGllcyhHZGlwbHVzOjpGb250Q29sbGVjdGlvbiAmZmMpOw0KKyAgICB2b2lkCQkJUmV0cmlldmVGb250U3R5bGVzKCk7DQorICAgIElGWF9Gb250KgkJR2V0U3Vic3RGb250KEZYX0lOVDMyIGlHbHlwaEluZGV4KSBjb25zdDsNCisgICAgRlhfQk9PTAkJCUdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfSU5UMzIgJmlXaWR0aCwgRlhfQk9PTCBiUmVjdXJzaXZlLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgICAgRlhfSU5UMzIJCUdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgSUZYX0ZvbnQgKipwcEZvbnQsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgICBGWF9EV09SRAkJR2V0TUFUMkhhc2hDb2RlKGNvbnN0IEZJWEVEICpwRml4ZWQpOw0KKyAgICB2b2lkCQkJQ3JlYXRlR2x5cGhCaXRtYXAoRlhfSU5UMzIgaVdpZHRoLCBGWF9JTlQzMiBpSGVpZ2h0LCBGWF9MUEJZVEUgcE91dGxpbmUsIEZYX0xQRFdPUkQgcERJQiwgRlhfQVJHQiBhcmdiKTsNCisgICAgZnJpZW5kIGNsYXNzIENGWF9HZGlGb250TWdyOw0KK307DQorI2VuZGlmDQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTUyYmM3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5jcHAKQEAgLTAsMCArMSw1OTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9nZWZvbnQuaCINCisjaW5jbHVkZSAiZnhfZm9udHV0aWxzLmgiDQorI2lmbmRlZiBfRlhQTFVTDQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChGWF9MUENXU1RSIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UsIElGWF9Gb250TWdyICpwRm9udE1ncikNCit7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgaWYgKE5VTEwgIT0gcEZvbnRNZ3IpIHsNCisgICAgICAgIHJldHVybiBwRm9udE1nci0+R2V0Rm9udEJ5Q29kZVBhZ2Uod0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyNlbHNlDQorICAgIENGWF9HRUZvbnQgKnBGb250ID0gRlhfTkVXIENGWF9HRUZvbnQocEZvbnRNZ3IpOw0KKyAgICBpZiAoIXBGb250LT5Mb2FkRm9udChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorI2VuZGlmDQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBpTGVuZ3RoLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorew0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIGlmIChOVUxMICE9IHBGb250TWdyKSB7DQorICAgICAgICByZXR1cm4gcEZvbnRNZ3ItPkxvYWRGb250KHBCdWZmZXIsIGlMZW5ndGgsIDAsIE5VTEwpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyNlbHNlDQorICAgIENGWF9HRUZvbnQgKnBGb250ID0gRlhfTkVXIENGWF9HRUZvbnQocEZvbnRNZ3IpOw0KKyAgICBpZiAoIXBGb250LT5Mb2FkRm9udChwQnVmZmVyLCBpTGVuZ3RoKSkgew0KKyAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCisjZW5kaWYNCit9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChGWF9MUENXU1RSIHBzekZpbGVOYW1lLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQorew0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIGlmIChOVUxMICE9IHBGb250TWdyKSB7DQorICAgICAgICByZXR1cm4gcEZvbnRNZ3ItPkxvYWRGb250KHBzekZpbGVOYW1lLCAwLCBOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisjZWxzZQ0KKyAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocHN6RmlsZU5hbWUpKSB7DQorICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBGb250Ow0KKyNlbmRpZg0KK30NCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IsIEZYX0JPT0wgYlNhdmVTdHJlYW0pDQorew0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIGlmIChOVUxMICE9IHBGb250TWdyKSB7DQorICAgICAgICByZXR1cm4gcEZvbnRNZ3ItPkxvYWRGb250KHBGb250U3RyZWFtLCAwLCBOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisjZWxzZQ0KKyAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEZvbnRTdHJlYW0sIGJTYXZlU3RyZWFtKSkgew0KKyAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCisjZW5kaWYNCit9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChDRlhfRm9udCAqcEV4dEZvbnQsIElGWF9Gb250TWdyICpwRm9udE1nciwgRlhfQk9PTCBiVGFrZU92ZXIpDQorew0KKyAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEV4dEZvbnQsIGJUYWtlT3ZlcikpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorfQ0KK0NGWF9HRUZvbnQ6OkNGWF9HRUZvbnQoSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KKyAgICA6IENGWF9UaHJlYWRMb2NrKCkNCisgICAgLCBtX3BGb250KE5VTEwpDQorICAgICwgbV9wRm9udE1ncihwRm9udE1ncikNCisgICAgLCBtX2lSZWZDb3VudCgxKQ0KKyAgICAsIG1fYkV4dEZvbnQoRkFMU0UpDQorICAgICwgbV9wU3RyZWFtKE5VTEwpDQorICAgICwgbV9wRmlsZVJlYWQoTlVMTCkNCisgICAgLCBtX3BGb250RW5jb2RpbmcoTlVMTCkNCisgICAgLCBtX3BDaGFyV2lkdGhNYXAoTlVMTCkNCisgICAgLCBtX3BSZWN0QXJyYXkoTlVMTCkNCisgICAgLCBtX3BCQm94TWFwKE5VTEwpDQorICAgICwgbV93Q2hhclNldCgweEZGRkYpDQorICAgICwgbV9wUHJvdmlkZXIoTlVMTCkNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAsIG1fYlVzZUxvZ0ZvbnRTdHlsZShGQUxTRSkNCisgICAgLCBtX2R3TG9nRm9udFN0eWxlKDApDQorI2VuZGlmDQorICAgICwgbV9TdWJzdEZvbnRzKCkNCisgICAgLCBtX0ZvbnRNYXBwZXIoMTYpDQorew0KK30NCitDRlhfR0VGb250OjpDRlhfR0VGb250KGNvbnN0IENGWF9HRUZvbnQgJnNyYywgRlhfRFdPUkQgZHdGb250U3R5bGVzKQ0KKyAgICA6IENGWF9UaHJlYWRMb2NrKCkNCisgICAgLCBtX3BGb250KE5VTEwpDQorICAgICwgbV9wRm9udE1ncihzcmMubV9wRm9udE1ncikNCisgICAgLCBtX2lSZWZDb3VudCgxKQ0KKyAgICAsIG1fYkV4dEZvbnQoRkFMU0UpDQorICAgICwgbV9wU3RyZWFtKE5VTEwpDQorICAgICwgbV9wRmlsZVJlYWQoTlVMTCkNCisgICAgLCBtX3BGb250RW5jb2RpbmcoTlVMTCkNCisgICAgLCBtX3BDaGFyV2lkdGhNYXAoTlVMTCkNCisgICAgLCBtX3BSZWN0QXJyYXkoTlVMTCkNCisgICAgLCBtX3BCQm94TWFwKE5VTEwpDQorICAgICwgbV93Q2hhclNldCgweEZGRkYpDQorICAgICwgbV9wUHJvdmlkZXIoTlVMTCkNCisgICAgLCBtX1N1YnN0Rm9udHMoKQ0KKyAgICAsIG1fRm9udE1hcHBlcigxNikNCit7DQorICAgIG1fcEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQorICAgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwpOw0KKyAgICBGWFNZU19hc3NlcnQoc3JjLm1fcEZvbnQgIT0gTlVMTCk7DQorICAgIG1fcEZvbnQtPkxvYWRDbG9uZShzcmMubV9wRm9udCk7DQorICAgIENGWF9TdWJzdEZvbnQgKiZwU3Vic3QgPSBtX3BGb250LT5tX3BTdWJzdEZvbnQ7DQorICAgIGlmIChwU3Vic3QgPT0gTlVMTCkgew0KKyAgICAgICAgcFN1YnN0ID0gRlhfTkVXIENGWF9TdWJzdEZvbnQ7DQorICAgIH0NCisgICAgaWYgKHBTdWJzdCkgew0KKyAgICAgICAgcFN1YnN0LT5tX1dlaWdodCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUw7DQorICAgICAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KKyAgICAgICAgICAgIHBTdWJzdC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9JVEFMSUM7DQorICAgICAgICB9DQorICAgIH0NCisgICAgSW5pdEZvbnQoKTsNCit9DQorQ0ZYX0dFRm9udDo6fkNGWF9HRUZvbnQoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaV07DQorICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIG1fU3Vic3RGb250cy5SZW1vdmVBbGwoKTsNCisgICAgbV9Gb250TWFwcGVyLlJlbW92ZUFsbCgpOw0KKyAgICBpZiAobV9wRmlsZVJlYWQgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wU3RyZWFtICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIGlmIChtX3BGb250RW5jb2RpbmcgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fcEZvbnRFbmNvZGluZzsNCisgICAgfQ0KKyAgICBpZiAobV9wQ2hhcldpZHRoTWFwICE9IE5VTEwpIHsNCisgICAgICAgIEZYVEFSR0VUX0RlbGV0ZSBtX3BDaGFyV2lkdGhNYXA7DQorICAgIH0NCisgICAgaWYgKG1fcFJlY3RBcnJheSAhPSBOVUxMKSB7DQorICAgICAgICBGWFRBUkdFVF9EZWxldGUgbV9wUmVjdEFycmF5Ow0KKyAgICB9DQorICAgIGlmIChtX3BCQm94TWFwICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BCQm94TWFwOw0KKyAgICB9DQorICAgIGlmIChtX3BGb250ICE9IE5VTEwgJiYgIW1fYkV4dEZvbnQpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BGb250Ow0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6UmVsZWFzZSgpDQorew0KKyAgICBpZiAoLS0gbV9pUmVmQ291bnQgPCAxKSB7DQorICAgICAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wRm9udE1nci0+UmVtb3ZlRm9udCh0aGlzKTsNCisgICAgICAgIH0NCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorfQ0KK0lGWF9Gb250KiBDRlhfR0VGb250OjpSZXRhaW4oKQ0KK3sNCisgICAgKysgbV9pUmVmQ291bnQ7DQorICAgIHJldHVybiB0aGlzOw0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSkNCit7DQorICAgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBMb2NrKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udEZhbWlseTsNCisgICAgaWYgKHBzekZvbnRGYW1pbHkgIT0gTlVMTCkgew0KKyAgICAgICAgY3NGb250RmFtaWx5ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBzekZvbnRGYW1pbHkpOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwOw0KKyAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpIHsNCisgICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX0ZJWEVEX1BJVENIOw0KKyAgICB9DQorICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpIHsNCisgICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX1NFUklGOw0KKyAgICB9DQorICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCisgICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX1NZTUJPTElDOw0KKyAgICB9DQorICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQorICAgICAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TQ1JJUFQ7DQorICAgIH0NCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX0lUQUxJQzsNCisgICAgfQ0KKyAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX0JPTEQ7DQorICAgIH0NCisgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9FeGFjdE1hdGNoKSB7DQorICAgICAgICBkd0ZsYWdzIHw9IEZYRk9OVF9FWEFDVE1BVENIOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlXZWlnaHQgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KKyAgICBGWF9XT1JEIHdDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZSh3Q29kZVBhZ2UpOw0KKyAgICBpZiAod0NoYXJTZXQgPT0gMHhGRkZGKSB7DQorICAgICAgICB3Q2hhclNldCA9IEZYU1lTX0dldEFDUCgpOw0KKyAgICB9DQorICAgIG1fd0NoYXJTZXQgPSB3Q2hhclNldDsNCisgICAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCisgICAgaWYgKChkd0ZsYWdzICYgRlhGT05UX0lUQUxJQykgJiYgKGR3RmxhZ3MgJiBGWEZPTlRfQk9MRCkpIHsNCisgICAgICAgIGNzRm9udEZhbWlseSArPSAiLEJvbGRJdGFsaWMiOw0KKyAgICB9IGVsc2UgaWYgKGR3RmxhZ3MgJiBGWEZPTlRfQk9MRCkgew0KKyAgICAgICAgY3NGb250RmFtaWx5ICs9ICIsQm9sZCI7DQorICAgIH0gZWxzZSBpZiAoZHdGbGFncyAmIEZYRk9OVF9JVEFMSUMpIHsNCisgICAgICAgIGNzRm9udEZhbWlseSArPSAiLEl0YWxpYyI7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZFN1YnN0KGNzRm9udEZhbWlseSwgVFJVRSwgZHdGbGFncywgaVdlaWdodCwgMCwgd0NvZGVQYWdlKTsNCisgICAgYlJldCA9IG1fcEZvbnQtPm1fRmFjZSAhPSBOVUxMOw0KKyAgICBpZiAoYlJldCkgew0KKyAgICAgICAgSW5pdEZvbnQoKTsNCisgICAgfQ0KKyAgICBVbmxvY2soKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6TG9hZEZvbnQoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9JTlQzMiBsZW5ndGgpDQorew0KKyAgICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgTG9jaygpOw0KKyAgICBtX3BGb250ID0gRlhfTkVXIENGWF9Gb250Ow0KKyAgICBGWF9CT09MIGJSZXQgPSBtX3BGb250LT5Mb2FkRW1iZWRkZWQocEJ1ZmZlciwgbGVuZ3RoKTsNCisgICAgaWYgKGJSZXQpIHsNCisgICAgICAgIEluaXRGb250KCk7DQorICAgIH0NCisgICAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgICAgVW5sb2NrKCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KEZYX0xQQ1dTVFIgcHN6RmlsZU5hbWUpDQorew0KKyAgICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcFN0cmVhbSAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcEZpbGVSZWFkICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBMb2NrKCk7DQorICAgIG1fcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShwc3pGaWxlTmFtZSwgRlhfU1RSRUFNQUNDRVNTX0JpbmFyeSB8IEZYX1NUUkVBTUFDQ0VTU19SZWFkKTsNCisgICAgbV9wRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZChtX3BTdHJlYW0pOw0KKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgICAgaWYgKG1fcFN0cmVhbSAhPSBOVUxMICYmIG1fcEZpbGVSZWFkICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQorICAgICAgICBiUmV0ID0gbV9wRm9udC0+TG9hZEZpbGUobV9wRmlsZVJlYWQpOw0KKyAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgICAgbV9wRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICBtX3BGaWxlUmVhZCA9IE5VTEw7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEluaXRGb250KCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgICAgVW5sb2NrKCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBGWF9CT09MIGJTYXZlU3RyZWFtKQ0KK3sNCisgICAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwRm9udFN0cmVhbSA9PSBOVUxMIHx8IHBGb250U3RyZWFtLT5HZXRMZW5ndGgoKSA8IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAobV9wRmlsZVJlYWQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIExvY2soKTsNCisgICAgaWYgKGJTYXZlU3RyZWFtKSB7DQorICAgICAgICBtX3BTdHJlYW0gPSBwRm9udFN0cmVhbTsNCisgICAgfQ0KKyAgICBtX3BGaWxlUmVhZCA9IEZYX0NyZWF0ZUZpbGVSZWFkKHBGb250U3RyZWFtKTsNCisgICAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCisgICAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZEZpbGUobV9wRmlsZVJlYWQpOw0KKyAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgIG1fcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BGaWxlUmVhZCA9IE5VTEw7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBJbml0Rm9udCgpOw0KKyAgICB9DQorICAgIG1fd0NoYXJTZXQgPSAweEZGRkY7DQorICAgIFVubG9jaygpOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChDRlhfRm9udCAqcEV4dEZvbnQsIEZYX0JPT0wgYlRha2VPdmVyKQ0KK3sNCisgICAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwRXh0Rm9udCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgTG9jaygpOw0KKyAgICBpZiAoKG1fcEZvbnQgPSBwRXh0Rm9udCkgIT0gTlVMTCkgew0KKyAgICAgICAgbV9iRXh0Rm9udCA9ICFiVGFrZU92ZXI7DQorICAgICAgICBJbml0Rm9udCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9iRXh0Rm9udCA9IFRSVUU7DQorICAgIH0NCisgICAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgICAgVW5sb2NrKCk7DQorICAgIHJldHVybiBtX3BGb250ICE9IE5VTEw7DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6SW5pdEZvbnQoKQ0KK3sNCisgICAgaWYgKG1fcEZvbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BGb250RW5jb2RpbmcgPT0gTlVMTCkgew0KKyNpZmRlZiBGWEZNX0VOQ09ESU5HX05PTkUNCisgICAgICAgIG1fcEZvbnRFbmNvZGluZyA9IEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KG1fcEZvbnQpOw0KKyNlbHNlDQorICAgICAgICBtX3BGb250RW5jb2RpbmcgPSBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhtX3BGb250KTsNCisjZW5kaWYNCisgICAgfQ0KKyAgICBpZiAobV9wQ2hhcldpZHRoTWFwID09IE5VTEwpIHsNCisgICAgICAgIG1fcENoYXJXaWR0aE1hcCA9IEZYVEFSR0VUX05ldyBDRlhfV29yZERpc2NyZXRlQXJyYXkoMTAyNCk7DQorICAgIH0NCisgICAgaWYgKG1fcFJlY3RBcnJheSA9PSBOVUxMKSB7DQorICAgICAgICBtX3BSZWN0QXJyYXkgPSBGWFRBUkdFVF9OZXcgQ0ZYX1JlY3RNYXNzQXJyYXkoMTYpOw0KKyAgICB9DQorICAgIGlmIChtX3BCQm94TWFwID09IE5VTEwpIHsNCisgICAgICAgIG1fcEJCb3hNYXAgPSBGWF9ORVcgQ0ZYX01hcFB0clRvUHRyKDE2KTsNCisgICAgfQ0KK30NCitJRlhfRm9udCogQ0ZYX0dFRm9udDo6RGVyaXZlKEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgKQ0KK3sNCisgICAgaWYgKEdldEZvbnRTdHlsZXMoKSA9PSBkd0ZvbnRTdHlsZXMpIHsNCisgICAgICAgIHJldHVybiBSZXRhaW4oKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfTkVXIENGWF9HRUZvbnQoKnRoaXMsIGR3Rm9udFN0eWxlcyk7DQorfQ0KK0ZYX0JZVEUgQ0ZYX0dFRm9udDo6R2V0Q2hhclNldCgpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRm9udCAhPSBOVUxMKTsNCisgICAgaWYgKG1fd0NoYXJTZXQgIT0gMHhGRkZGKSB7DQorICAgICAgICByZXR1cm4gKEZYX0JZVEUpbV93Q2hhclNldDsNCisgICAgfQ0KKyAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGWF9DSEFSU0VUX0RlZmF1bHQ7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9DaGFyc2V0Ow0KK30NCit2b2lkIENGWF9HRUZvbnQ6OkdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzRmFtaWx5KSBjb25zdA0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCk7DQorICAgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgPT0gTlVMTCB8fCBtX3BGb250LT5tX3BTdWJzdEZvbnQtPm1fRmFtaWx5LkdldExlbmd0aCgpID09IDApIHsNCisgICAgICAgIHdzRmFtaWx5ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BGb250LT5HZXRGYW1pbHlOYW1lKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NGYW1pbHkgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKG1fcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9GYW1pbHkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6R2V0UHNOYW1lKENGWF9XaWRlU3RyaW5nICZ3c05hbWUpIGNvbnN0DQorew0KKyAgICB3c05hbWUgPSBtX3BGb250LT5HZXRQc05hbWUoKTsNCit9DQorRlhfRFdPUkQgQ0ZYX0dFRm9udDo6R2V0Rm9udFN0eWxlcygpIGNvbnN0DQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRm9udCAhPSBOVUxMKTsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICBpZiAobV9iVXNlTG9nRm9udFN0eWxlKSB7DQorICAgICAgICByZXR1cm4gbV9kd0xvZ0ZvbnRTdHlsZTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IDA7DQorICAgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgPT0gTlVMTCkgew0KKyAgICAgICAgaWYgKG1fcEZvbnQtPklzQm9sZCgpKSB7DQorICAgICAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wRm9udC0+SXNJdGFsaWMoKSkgew0KKyAgICAgICAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250LT5tX1dlaWdodCA9PSBGWEZPTlRfRldfQk9MRCkgew0KKyAgICAgICAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0lUQUxJQykgew0KKyAgICAgICAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGR3U3R5bGVzOw0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfSU5UMzIgJmlXaWR0aCwgRlhfQk9PTCBiQ2hhckNvZGUpDQorew0KKyAgICByZXR1cm4gR2V0Q2hhcldpZHRoKHdVbmljb2RlLCBpV2lkdGgsIFRSVUUsIGJDaGFyQ29kZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJSZWN1cnNpdmUsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0IChtX3BDaGFyV2lkdGhNYXAgIT0gTlVMTCk7DQorICAgIGlXaWR0aCA9IG1fcENoYXJXaWR0aE1hcC0+R2V0QXQod1VuaWNvZGUsIDApOw0KKyAgICBpZiAoaVdpZHRoIDwgMSkgew0KKyAgICAgICAgaWYgKCFtX3BQcm92aWRlciB8fCAhbV9wUHJvdmlkZXItPkdldENoYXJXaWR0aCh0aGlzLCB3VW5pY29kZSwgaVdpZHRoLCBiQ2hhckNvZGUpKSB7DQorICAgICAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCisgICAgICAgICAgICBGWF9JTlQzMiBpR2x5cGggPSBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCAmcEZvbnQsIGJDaGFyQ29kZSk7DQorICAgICAgICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYgJiYgcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBpZiAocEZvbnQgPT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgICAgICAgICAgICAgICAgICBpV2lkdGggPSBtX3BGb250LT5HZXRHbHlwaFdpZHRoKGlHbHlwaCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVdpZHRoIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlXaWR0aCA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgoQ0ZYX0dFRm9udCopcEZvbnQpLT5HZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgRkFMU0UsIGJDaGFyQ29kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaVdpZHRoID0gLTE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgTG9jaygpOw0KKyAgICAgICAgbV9wQ2hhcldpZHRoTWFwLT5TZXRBdEdyb3cod1VuaWNvZGUsIChGWF9TSE9SVClpV2lkdGgpOw0KKyAgICAgICAgVW5sb2NrKCk7DQorICAgIH0gZWxzZSBpZiAoaVdpZHRoID09IDY1NTM1KSB7DQorICAgICAgICBpV2lkdGggPSAtMTsNCisgICAgfQ0KKyAgICByZXR1cm4gaVdpZHRoID4gMDsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwgQ0ZYX1JlY3QgJmJib3gsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgcmV0dXJuIEdldENoYXJCQm94KHdVbmljb2RlLCBiYm94LCBUUlVFLCBiQ2hhckNvZGUpOw0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLCBDRlhfUmVjdCAmYmJveCwgRlhfQk9PTCBiUmVjdXJzaXZlLCBGWF9CT09MIGJDaGFyQ29kZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BSZWN0QXJyYXkgIT0gTlVMTCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BCQm94TWFwICE9IE5VTEwpOw0KKyAgICBGWF9MUFZPSUQgcFJlY3QgPSBOVUxMOw0KKyAgICBpZiAoIW1fcEJCb3hNYXAtPkxvb2t1cCgodm9pZCopKEZYX1VJTlRQVFIpd1VuaWNvZGUsIHBSZWN0KSkgew0KKyAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCisgICAgICAgIEZYX0lOVDMyIGlHbHlwaCA9IEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsICZwRm9udCwgYkNoYXJDb2RlKTsNCisgICAgICAgIGlmIChpR2x5cGggIT0gMHhGRkZGICYmIHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBpZiAocEZvbnQgPT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgICAgICAgICAgICAgIEZYX1JFQ1QgcnRCQm94Ow0KKyAgICAgICAgICAgICAgICBpZiAobV9wRm9udC0+R2V0R2x5cGhCQm94KGlHbHlwaCwgcnRCQm94KSkgew0KKyAgICAgICAgICAgICAgICAgICAgTG9jaygpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QgcnQ7DQorICAgICAgICAgICAgICAgICAgICBydC5TZXQocnRCQm94LmxlZnQsIHJ0QkJveC50b3AsIHJ0QkJveC5XaWR0aCgpLCBydEJCb3guSGVpZ2h0KCkpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaW5kZXggPSBtX3BSZWN0QXJyYXktPkFkZChydCk7DQorICAgICAgICAgICAgICAgICAgICBwUmVjdCA9IG1fcFJlY3RBcnJheS0+R2V0UHRyQXQoaW5kZXgpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wQkJveE1hcC0+U2V0QXQoKHZvaWQqKShGWF9VSU5UUFRSKXdVbmljb2RlLCBwUmVjdCk7DQorICAgICAgICAgICAgICAgICAgICBVbmxvY2soKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKChDRlhfR0VGb250KilwRm9udCktPkdldENoYXJCQm94KHdVbmljb2RlLCBiYm94LCBGQUxTRSwgYkNoYXJDb2RlKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBSZWN0ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBiYm94ID0gKihGWF9MUENSRUNUKXBSZWN0Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpHZXRCQm94KENGWF9SZWN0ICZiYm94KQ0KK3sNCisgICAgRlhfUkVDVCBydCgwLCAwLCAwLCAwKTsNCisgICAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+R2V0QkJveChydCk7DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgICBiYm94LmxlZnQgPSBydC5sZWZ0Ow0KKyAgICAgICAgYmJveC53aWR0aCA9IHJ0LldpZHRoKCk7DQorICAgICAgICBiYm94LnRvcCA9IHJ0LmJvdHRvbTsNCisgICAgICAgIGJib3guaGVpZ2h0ID0gLXJ0LkhlaWdodCgpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9JTlQzMiBDRlhfR0VGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0DQorew0KKyAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BGb250LT5tX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7DQorfQ0KK0ZYX0lOVDMyIENGWF9HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgcmV0dXJuIEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsIE5VTEwsIGJDaGFyQ29kZSk7DQorfQ0KK0ZYX0lOVDMyIENGWF9HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgSUZYX0ZvbnQgKipwcEZvbnQsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0IChtX3BGb250RW5jb2RpbmcgIT0gTlVMTCk7DQorICAgIEZYX0lOVDMyIGlHbHlwaEluZGV4ID0gbV9wRm9udEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZSh3VW5pY29kZSk7DQorICAgIGlmIChpR2x5cGhJbmRleCA+IDApIHsNCisgICAgICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICpwcEZvbnQgPSAoSUZYX0ZvbnQqKXRoaXM7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaUdseXBoSW5kZXg7DQorICAgIH0NCisgICAgRkdBU19MUENGT05UVVNCIHBGb250VVNCID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KKyAgICBpZiAocEZvbnRVU0IgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDB4RkZGRjsNCisgICAgfQ0KKyAgICBGWF9XT1JEIHdCaXRGaWVsZCA9IHBGb250VVNCLT53Qml0RmllbGQ7DQorICAgIGlmICh3Qml0RmllbGQgPj0gMTI4KSB7DQorICAgICAgICByZXR1cm4gMHhGRkZGOw0KKyAgICB9DQorICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQorICAgIG1fRm9udE1hcHBlci5Mb29rdXAoKHZvaWQqKShGWF9VSU5UUFRSKXdVbmljb2RlLCAodm9pZComKXBGb250KTsNCisgICAgaWYgKHBGb250ICE9IE5VTEwgJiYgcEZvbnQgIT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgICAgICBpR2x5cGhJbmRleCA9ICgoQ0ZYX0dFRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgICAgIGlmIChpR2x5cGhJbmRleCAhPSAweEZGRkYpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpID0gbV9TdWJzdEZvbnRzLkZpbmQocEZvbnQpOw0KKyAgICAgICAgICAgIGlmIChpID4gLTEpIHsNCisgICAgICAgICAgICAgICAgaUdseXBoSW5kZXggfD0gKChpICsgMSkgPDwgMjQpOw0KKyAgICAgICAgICAgICAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICpwcEZvbnQgPSBwRm9udDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gaUdseXBoSW5kZXg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BGb250TWdyICE9IE5VTEwgJiYgYlJlY3Vyc2l2ZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGYW1pbHk7DQorICAgICAgICBHZXRGYW1pbHlOYW1lKHdzRmFtaWx5KTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gbV9wRm9udE1nci0+R2V0RGVmRm9udEJ5VW5pY29kZSh3VW5pY29kZSwgR2V0Rm9udFN0eWxlcygpLCAoRlhfTFBDV1NUUil3c0ZhbWlseSk7DQorI2Vsc2UNCisgICAgICAgIElGWF9Gb250ICpwRm9udCA9IG1fcEZvbnRNZ3ItPkdldEZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIEdldEZvbnRTdHlsZXMoKSwgKEZYX0xQQ1dTVFIpd3NGYW1pbHkpOw0KKyAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnQpIHsNCisgICAgICAgICAgICBwRm9udCA9IG1fcEZvbnRNZ3ItPkdldEZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIEdldEZvbnRTdHlsZXMoKSwgTlVMTCk7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4RkZGRjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9Gb250TWFwcGVyLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUil3VW5pY29kZSwgKHZvaWQqKXBGb250KTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCisgICAgICAgICAgICBtX1N1YnN0Rm9udHMuQWRkKHBGb250KTsNCisgICAgICAgICAgICBpR2x5cGhJbmRleCA9ICgoQ0ZYX0dFRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgICAgICAgICBpZiAoaUdseXBoSW5kZXggIT0gMHhGRkZGKSB7DQorICAgICAgICAgICAgICAgIGlHbHlwaEluZGV4IHw9ICgoaSArIDEpIDw8IDI0KTsNCisgICAgICAgICAgICAgICAgaWYgKHBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAqcHBGb250ID0gcEZvbnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGlHbHlwaEluZGV4Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMHhGRkZGOw0KK30NCitGWF9JTlQzMiBDRlhfR0VGb250OjpHZXRBc2NlbnQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcEZvbnQtPkdldEFzY2VudCgpOw0KK30NCitGWF9JTlQzMiBDRlhfR0VGb250OjpHZXREZXNjZW50KCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BGb250LT5HZXREZXNjZW50KCk7DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6UmVzZXQoKQ0KK3sNCisgICAgTG9jaygpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpXTsNCisgICAgICAgICgoQ0ZYX0dFRm9udCopcEZvbnQpLT5SZXNldCgpOw0KKyAgICB9DQorICAgIGlmIChtX3BDaGFyV2lkdGhNYXAgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wQ2hhcldpZHRoTWFwLT5SZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wQkJveE1hcCAhPSBOVUxMKSB7DQorICAgICAgICBtX3BCQm94TWFwLT5SZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUmVjdEFycmF5ICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFJlY3RBcnJheS0+UmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgVW5sb2NrKCk7DQorfQ0KK0lGWF9Gb250KiBDRlhfR0VGb250OjpHZXRTdWJzdEZvbnQoRlhfSU5UMzIgaUdseXBoSW5kZXgpIGNvbnN0DQorew0KKyAgICBpR2x5cGhJbmRleCA9ICgoRlhfRFdPUkQpaUdseXBoSW5kZXgpID4+IDI0Ow0KKyAgICByZXR1cm4gaUdseXBoSW5kZXggPT0gMCA/IChJRlhfRm9udCopdGhpcyA6IChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2lHbHlwaEluZGV4IC0gMV07DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuaCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzBmZjA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfR1JBUEhPQkpTX0lNUA0KKyNkZWZpbmUgX0ZYX0dSQVBIT0JKU19JTVANCisjaWZuZGVmIF9GWFBMVVMNCitjbGFzcyBDRlhfR0VGb250TWdyOw0KKyNpZm5kZWYgRlhGT05UX1NVQlNUX0lUQUxJQw0KKyNkZWZpbmUgRlhGT05UX1NVQlNUX0lUQUxJQwkweDAyDQorI2VuZGlmDQorY2xhc3MgQ0ZYX0dFRm9udCA6IHB1YmxpYyBJRlhfRm9udCwgcHVibGljIENGWF9UaHJlYWRMb2NrLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9HRUZvbnQoY29uc3QgQ0ZYX0dFRm9udCAmc3JjLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KKyAgICBDRlhfR0VGb250KElGWF9Gb250TWdyICpwRm9udE1ncik7DQorICAgIH5DRlhfR0VGb250KCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCVJldGFpbigpOw0KKyAgICBGWF9CT09MCQkJTG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGb250KEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgbGVuZ3RoKTsNCisgICAgRlhfQk9PTAkJCUxvYWRGb250KEZYX0xQQ1dTVFIgcHN6RmlsZU5hbWUpOw0KKyAgICBGWF9CT09MCQkJTG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0sIEZYX0JPT0wgYlNhdmVTdHJlYW0pOw0KKyAgICBGWF9CT09MCQkJTG9hZEZvbnQoQ0ZYX0ZvbnQgKnBFeHRGb250LCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCURlcml2ZShGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlID0gMCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzRmFtaWx5KSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0UHNOYW1lKENGWF9XaWRlU3RyaW5nICZ3c05hbWUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRGb250U3R5bGVzKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQllURQkJCUdldENoYXJTZXQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEFzY2VudCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXREZXNjZW50KCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLCBDRlhfUmVjdCAmYmJveCwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJCb3goQ0ZYX1JlY3QgJmJib3gpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZXNldCgpOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0U3Vic3RGb250KEZYX0lOVDMyIGlHbHlwaEluZGV4KSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkKgkJCUdldERldkZvbnQoKWNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAodm9pZCopbV9wRm9udDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250UHJvdmlkZXIoSUZYX0ZvbnRQcm92aWRlciogcFByb3ZpZGVyKQ0KKyAgICB7DQorICAgICAgICBtX3BQcm92aWRlciA9IHBQcm92aWRlcjsNCisgICAgfQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExvZ2ljYWxGb250U3R5bGUoRlhfRFdPUkQgZHdMb2dGb250U3R5bGUpDQorICAgIHsNCisgICAgICAgIG1fYlVzZUxvZ0ZvbnRTdHlsZSA9IFRSVUU7DQorICAgICAgICBtX2R3TG9nRm9udFN0eWxlID0gZHdMb2dGb250U3R5bGU7DQorICAgIH07DQorI2VuZGlmDQorcHJvdGVjdGVkOg0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIEZYX0JPT0wJCQkJCW1fYlVzZUxvZ0ZvbnRTdHlsZTsNCisgICAgRlhfRFdPUkQJCQkJbV9kd0xvZ0ZvbnRTdHlsZTsNCisjZW5kaWYNCisgICAgQ0ZYX0ZvbnQJCQkJKm1fcEZvbnQ7DQorICAgIElGWF9Gb250TWdyCQkJCSptX3BGb250TWdyOw0KKyAgICBGWF9JTlQzMgkJCQltX2lSZWZDb3VudDsNCisgICAgRlhfQk9PTAkJCQkJbV9iRXh0Rm9udDsNCisgICAgSUZYX1N0cmVhbQkJCQkqbV9wU3RyZWFtOw0KKyAgICBJRlhfRmlsZVJlYWQJCQkqbV9wRmlsZVJlYWQ7DQorICAgIElGWF9Gb250RW5jb2RpbmcJCSptX3BGb250RW5jb2Rpbmc7DQorICAgIENGWF9Xb3JkRGlzY3JldGVBcnJheQkqbV9wQ2hhcldpZHRoTWFwOw0KKyAgICBDRlhfUmVjdE1hc3NBcnJheQkJKm1fcFJlY3RBcnJheTsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJKm1fcEJCb3hNYXA7DQorICAgIElGWF9Gb250UHJvdmlkZXIJCSptX3BQcm92aWRlcjsNCisgICAgRlhfV09SRAkJCQkJbV93Q2hhclNldDsNCisgICAgQ0ZYX1B0ckFycmF5CQltX1N1YnN0Rm9udHM7DQorICAgIENGWF9NYXBQdHJUb1B0cgkJbV9Gb250TWFwcGVyOw0KKyAgICB2b2lkCQkJSW5pdEZvbnQoKTsNCisgICAgRlhfQk9PTAkJR2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsIENGWF9SZWN0ICZiYm94LCBGWF9CT09MIGJSZWN1cnNpdmUsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgICBGWF9CT09MCQlHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0lOVDMyICZpV2lkdGgsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICAgIEZYX0lOVDMyCUdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgSUZYX0ZvbnQgKipwcEZvbnQsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KK307DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTljYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfc3RkZm9udG1nci5jcHAKQEAgLTAsMCArMSwxNDkwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfc3RkZm9udG1nci5oIg0KKyNpbmNsdWRlICJmeF9mb250dXRpbHMuaCINCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KK0lGWF9Gb250TWdyKiBJRlhfRm9udE1ncjo6Q3JlYXRlKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yLCBGWF9MUE1hdGNoRm9udCBwTWF0Y2hlciAsIEZYX0xQVk9JRCBwVXNlckRhdGEgKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDRlhfU3RkRm9udE1nckltcChwRW51bWVyYXRvciwgcE1hdGNoZXIsIHBVc2VyRGF0YSk7DQorfQ0KK0NGWF9TdGRGb250TWdySW1wOjpDRlhfU3RkRm9udE1nckltcChGWF9MUEVudW1BbGxGb250cyBwRW51bWVyYXRvciwgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIsIEZYX0xQVk9JRCBwVXNlckRhdGEpDQorICAgIDogbV9wTWF0Y2hlcihwTWF0Y2hlcikNCisgICAgLCBtX3BFbnVtZXJhdG9yKHBFbnVtZXJhdG9yKQ0KKyAgICAsIG1fRm9udEZhY2VzKCkNCisgICAgLCBtX0ZvbnRzKCkNCisgICAgLCBtX0NQRm9udHMoOCkNCisgICAgLCBtX0ZhbWlseUZvbnRzKDE2KQ0KKyAgICAsIG1fVW5pY29kZUZvbnRzKDE2KQ0KKyAgICAsIG1fQnVmZmVyRm9udHMoNCkNCisgICAgLCBtX0ZpbGVGb250cyg0KQ0KKyAgICAsIG1fU3RyZWFtRm9udHMoNCkNCisgICAgLCBtX0Rlcml2ZUZvbnRzKDQpDQorICAgICwgbV9wVXNlckRhdGEocFVzZXJEYXRhKQ0KK3sNCisgICAgaWYgKG1fcEVudW1lcmF0b3IgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wRW51bWVyYXRvcihtX0ZvbnRGYWNlcywgbV9wVXNlckRhdGEsIE5VTEwsIDB4RkVGRik7DQorICAgIH0NCisgICAgaWYgKG1fcE1hdGNoZXIgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wTWF0Y2hlciA9IEZYX0RlZkZvbnRNYXRjaGVyOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChtX3BNYXRjaGVyICE9IE5VTEwpOw0KK30NCitDRlhfU3RkRm9udE1nckltcDo6fkNGWF9TdGRGb250TWdySW1wKCkNCit7DQorICAgIG1fRm9udEZhY2VzLlJlbW92ZUFsbCgpOw0KKyAgICBtX0NQRm9udHMuUmVtb3ZlQWxsKCk7DQorICAgIG1fRmFtaWx5Rm9udHMuUmVtb3ZlQWxsKCk7DQorICAgIG1fVW5pY29kZUZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgICBtX0J1ZmZlckZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgICBtX0ZpbGVGb250cy5SZW1vdmVBbGwoKTsNCisgICAgbV9TdHJlYW1Gb250cy5SZW1vdmVBbGwoKTsNCisgICAgbV9EZXJpdmVGb250cy5SZW1vdmVBbGwoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gbV9Gb250cy5HZXRVcHBlckJvdW5kKCk7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSAoSUZYX0ZvbnQqKW1fRm9udHNbaV07DQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9Gb250cy5SZW1vdmVBbGwoKTsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpHZXREZWZGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkpDQorew0KKyAgICBGWF9EV09SRCBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQorICAgIGlmIChtX0NQRm9udHMuTG9va3VwKCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgICAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpIDogTlVMTDsNCisgICAgfQ0KKyAgICBGWF9MUENGT05UREVTQ1JJUFRPUiBwRkQ7DQorICAgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBUUlVFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKQ0KKyAgICAgICAgaWYgKChwRkQgPSBGaW5kRm9udChOVUxMLCBkd0ZvbnRTdHlsZXMsIFRSVUUsIHdDb2RlUGFnZSkpID09IE5VTEwpDQorICAgICAgICAgICAgaWYgKChwRkQgPSBGaW5kRm9udChOVUxMLCBkd0ZvbnRTdHlsZXMsIEZBTFNFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KHBGRCAhPSBOVUxMKTsNCisgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZELT53c0ZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgICAgICBtX0NQRm9udHMuU2V0QXQoKHZvaWQqKShGWF9VSU5UUFRSKWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgICAgIGR3SGFzaCA9IEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocEZELT53c0ZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpHZXREZWZGb250QnlDaGFyc2V0KEZYX0JZVEUgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5KQ0KK3sNCisgICAgcmV0dXJuIEdldERlZkZvbnRCeUNvZGVQYWdlKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQobkNoYXJzZXQpLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KK30NCisjZGVmaW5lIF9GWF9VU0VHQVNGT05UTUdSXw0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkpDQorew0KKyAgICBGR0FTX0xQQ0ZPTlRVU0IgcFJldCA9IEZHQVNfR2V0VW5pY29kZUJpdEZpZWxkKHdVbmljb2RlKTsNCisgICAgaWYgKHBSZXQtPndCaXRGaWVsZCA9PSA5OTkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBwUmV0LT53Qml0RmllbGQpOw0KKyAgICBJRlhfRm9udCAqcEZvbnQgPSBOVUxMOw0KKyAgICBpZiAobV9Vbmljb2RlRm9udHMuTG9va3VwKCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgICAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCBwUmV0LT53Q29kZVBhZ2UpIDogTlVMTDsNCisgICAgfQ0KKyNpZmRlZiBfRlhfVVNFR0FTRk9OVE1HUl8NCisgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBGQUxTRSwgcFJldC0+d0NvZGVQYWdlLCBwUmV0LT53Qml0RmllbGQsIHdVbmljb2RlKTsNCisgICAgaWYgKHBGRCA9PSBOVUxMICYmIHBzekZvbnRGYW1pbHkpIHsNCisgICAgICAgIHBGRCA9IEZpbmRGb250KE5VTEwsIGR3Rm9udFN0eWxlcywgRkFMU0UsIHBSZXQtPndDb2RlUGFnZSwgcFJldC0+d0JpdEZpZWxkLCB3VW5pY29kZSk7DQorICAgIH0NCisgICAgaWYgKHBGRCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocEZEKTsNCisgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHBGRC0+dUNoYXJTZXQpOw0KKyAgICBGWF9MUENXU1RSIHBGb250RmFjZSA9IHBGRC0+d3NGb250RmFjZTsNCisgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorI2Vsc2UNCisgICAgQ0ZYX0ZvbnRNYXBwZXIqIHBCdWlsdGluTWFwcGVyID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX3BCdWlsdGluTWFwcGVyOw0KKyAgICBpZiAocEJ1aWx0aW5NYXBwZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVdlaWdodCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUw7DQorICAgIGludCBpdGFsaWNfYW5nbGUgPSAwOw0KKyAgICBGWEZUX0ZhY2UgZnRGYWNlID0gcEJ1aWx0aW5NYXBwZXItPkZpbmRTdWJzdEZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIGR3Rm9udFN0eWxlcywgaVdlaWdodCwgaXRhbGljX2FuZ2xlKTsNCisgICAgaWYgKGZ0RmFjZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfRm9udCogcEZYRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCisgICAgaWYgKHBGWEZvbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcEZYRm9udC0+bV9GYWNlID0gZnRGYWNlOw0KKyAgICBwRlhGb250LT5tX3BGb250RGF0YSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX0Jhc2UoZnRGYWNlKTsNCisgICAgcEZYRm9udC0+bV9kd1NpemUgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9TaXplKGZ0RmFjZSk7DQorICAgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHBGWEZvbnQsIHRoaXMpOw0KKyAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IHBSZXQtPndDb2RlUGFnZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQc05hbWUgPSBwRlhGb250LT5HZXRQc05hbWUoKTsNCisgICAgRlhfTFBDV1NUUiBwRm9udEZhY2UgPSB3c1BzTmFtZTsNCisjZW5kaWYNCisgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgIG1fRm9udHMuQWRkKHBGb250KTsNCisgICAgICAgIG1fVW5pY29kZUZvbnRzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgICAgICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICAgICAgICBtX0NQRm9udHMuU2V0QXQoKHZvaWQqKShGWF9VSU5UUFRSKWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgICAgIGR3SGFzaCA9IEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocEZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpHZXREZWZGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkpDQorew0KKyAgICByZXR1cm4gR2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHdMYW5ndWFnZSksIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQorICAgIGlmIChtX0ZhbWlseUZvbnRzLkxvb2t1cCgodm9pZCopKEZYX1VJTlRQVFIpZHdIYXNoLCAodm9pZComKXBGb250KSkgew0KKyAgICAgICAgcmV0dXJuIHBGb250ID8gTG9hZEZvbnQocEZvbnQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSA6IE5VTEw7DQorICAgIH0NCisgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZEID0gTlVMTDsNCisgICAgaWYgKChwRkQgPSBGaW5kRm9udChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIFRSVUUsIHdDb2RlUGFnZSkpID09IE5VTEwpDQorICAgICAgICBpZiAoKHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgRkFMU0UsIHdDb2RlUGFnZSkpID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KHBGRCAhPSBOVUxMKTsNCisgICAgaWYgKHdDb2RlUGFnZSA9PSAweEZGRkYpIHsNCisgICAgICAgIHdDb2RlUGFnZSA9IEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQocEZELT51Q2hhclNldCk7DQorICAgIH0NCisgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZELT53c0ZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgICAgICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICAgICAgICBtX0NQRm9udHMuU2V0QXQoKHZvaWQqKShGWF9VSU5UUFRSKWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitJRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgICBJRlhfRm9udCAqcEZvbnQgPSBOVUxMOw0KKyAgICBpZiAobV9CdWZmZXJGb250cy5Mb29rdXAoKHZvaWQqKXBCdWZmZXIsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEJ1ZmZlciwgaUxlbmd0aCwgdGhpcyk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgICAgICBtX0J1ZmZlckZvbnRzLlNldEF0KCh2b2lkKilwQnVmZmVyLCBwRm9udCk7DQorICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitJRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KEZYX0xQQ1dTVFIgcHN6RmlsZU5hbWUpDQorew0KKyAgICBGWFNZU19hc3NlcnQocHN6RmlsZU5hbWUgIT0gTlVMTCk7DQorICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzekZpbGVOYW1lLCAtMSk7DQorICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQorICAgIGlmIChtX0ZpbGVGb250cy5Mb29rdXAoKHZvaWQqKShGWF9VSU5UUFRSKWR3SGFzaCwgKHZvaWQqJilwRm9udCkpIHsNCisgICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwc3pGaWxlTmFtZSwgTlVMTCk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgICAgICBtX0ZpbGVGb250cy5TZXRBdCgodm9pZCopKEZYX1VJTlRQVFIpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KKyAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgRlhfTFBDV1NUUiBwc3pGb250QWxpYXMgLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMgLCBGWF9XT1JEIHdDb2RlUGFnZSAsIEZYX0JPT0wgYlNhdmVTdHJlYW0gKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBGb250U3RyZWFtICE9IE5VTEwgJiYgcEZvbnRTdHJlYW0tPkdldExlbmd0aCgpID4gMCk7DQorICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQorICAgIGlmIChtX1N0cmVhbUZvbnRzLkxvb2t1cCgodm9pZCopcEZvbnRTdHJlYW0sICh2b2lkKiYpcEZvbnQpKSB7DQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChwc3pGb250QWxpYXMgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0hhc2ggPSBGR0FTX0dldEZvbnRGYW1pbHlIYXNoKHBzekZvbnRBbGlhcywgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgICAgICAgICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHBGb250U3RyZWFtLCB0aGlzLCBiU2F2ZVN0cmVhbSk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgICAgICBtX1N0cmVhbUZvbnRzLlNldEF0KCh2b2lkKilwRm9udFN0cmVhbSwgKHZvaWQqKXBGb250KTsNCisgICAgICAgIGlmIChwc3pGb250QWxpYXMgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocHN6Rm9udEFsaWFzLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgICAgICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKEZYX1VJTlRQVFIpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoSUZYX0ZvbnQgKnBTcmNGb250LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBTcmNGb250ICE9IE5VTEwpOw0KKyAgICBpZiAocFNyY0ZvbnQtPkdldEZvbnRTdHlsZXMoKSA9PSBkd0ZvbnRTdHlsZXMpIHsNCisgICAgICAgIHJldHVybiBwU3JjRm9udC0+UmV0YWluKCk7DQorICAgIH0NCisgICAgdm9pZCogYnVmZmVyWzNdID0ge3BTcmNGb250LCAodm9pZCopKEZYX1VJTlRQVFIpZHdGb250U3R5bGVzLCAodm9pZCopKEZYX1VJTlRQVFIpd0NvZGVQYWdlfTsNCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKEZYX0xQQ1NUUilidWZmZXIsIDMgKiBzaXplb2Yodm9pZCopKTsNCisgICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCisgICAgaWYgKG1fRGVyaXZlRm9udHMuR2V0Q291bnQoKSA+IDApIHsNCisgICAgICAgIG1fRGVyaXZlRm9udHMuTG9va3VwKCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKiYpcEZvbnQpOw0KKyAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBGb250ID0gcFNyY0ZvbnQtPkRlcml2ZShkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBtX0Rlcml2ZUZvbnRzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IG1fRm9udHMuRmluZChwRm9udCk7DQorICAgICAgICBpZiAoaW5kZXggPCAwKSB7DQorICAgICAgICAgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KKyAgICAgICAgICAgIHBGb250LT5SZXRhaW4oKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwRm9udDsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRlhfU3RkRm9udE1nckltcDo6Q2xlYXJGb250Q2FjaGUoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9Gb250cy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIElGWF9Gb250ICpwRm9udCA9IChJRlhfRm9udCopbV9Gb250c1tpXTsNCisgICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcEZvbnQtPlJlc2V0KCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRlhfU3RkRm9udE1nckltcDo6UmVtb3ZlRm9udChDRlhfTWFwUHRyVG9QdHIgJmZvbnRNYXAsIElGWF9Gb250ICpwRm9udCkNCit7DQorICAgIEZYX1BPU0lUSU9OIHBvcyA9IGZvbnRNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICBGWF9MUFZPSUQgcEtleTsNCisgICAgRlhfTFBWT0lEIHBGaW5kOw0KKyAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgICAgIHBGaW5kID0gTlVMTDsNCisgICAgICAgIGZvbnRNYXAuR2V0TmV4dEFzc29jKHBvcywgcEtleSwgcEZpbmQpOw0KKyAgICAgICAgaWYgKHBGaW5kICE9ICh2b2lkKilwRm9udCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9udE1hcC5SZW1vdmVLZXkocEtleSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCit2b2lkIENGWF9TdGRGb250TWdySW1wOjpSZW1vdmVGb250KElGWF9Gb250ICpwRm9udCkNCit7DQorICAgIFJlbW92ZUZvbnQobV9DUEZvbnRzLCBwRm9udCk7DQorICAgIFJlbW92ZUZvbnQobV9GYW1pbHlGb250cywgcEZvbnQpOw0KKyAgICBSZW1vdmVGb250KG1fVW5pY29kZUZvbnRzLCBwRm9udCk7DQorICAgIFJlbW92ZUZvbnQobV9CdWZmZXJGb250cywgcEZvbnQpOw0KKyAgICBSZW1vdmVGb250KG1fRmlsZUZvbnRzLCBwRm9udCk7DQorICAgIFJlbW92ZUZvbnQobV9TdHJlYW1Gb250cywgcEZvbnQpOw0KKyAgICBSZW1vdmVGb250KG1fRGVyaXZlRm9udHMsIHBGb250KTsNCisgICAgRlhfSU5UMzIgaUZpbmQgPSBtX0ZvbnRzLkZpbmQocEZvbnQpOw0KKyAgICBpZiAoaUZpbmQgPiAtMSkgew0KKyAgICAgICAgbV9Gb250cy5SZW1vdmVBdChpRmluZCwgMSk7DQorICAgIH0NCit9DQorRlhfTFBDRk9OVERFU0NSSVBUT1IgQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkZpbmRGb250KEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9EV09SRCBkd01hdGNoRmxhZ3MsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd1VTQiAsIEZYX1dDSEFSIHdVbmljb2RlICkNCit7DQorICAgIGlmIChtX3BNYXRjaGVyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0ZPTlRNQVRDSFBBUkFNUyBwYXJhbXM7DQorICAgIEZYX21lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7DQorICAgIHBhcmFtcy5kd1VTQiA9IGR3VVNCOw0KKyAgICBwYXJhbXMud1VuaWNvZGUgPSB3VW5pY29kZTsNCisgICAgcGFyYW1zLndDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCisgICAgcGFyYW1zLnB3c0ZhbWlseSA9IHBzekZvbnRGYW1pbHk7DQorICAgIHBhcmFtcy5kd0ZvbnRTdHlsZXMgPSBkd0ZvbnRTdHlsZXM7DQorICAgIHBhcmFtcy5kd01hdGNoRmxhZ3MgPSBkd01hdGNoRmxhZ3M7DQorICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBEZXNjID0gbV9wTWF0Y2hlcigmcGFyYW1zLCBtX0ZvbnRGYWNlcywgbV9wVXNlckRhdGEpOw0KKyAgICBpZiAocERlc2MpIHsNCisgICAgICAgIHJldHVybiBwRGVzYzsNCisgICAgfQ0KKyAgICBpZiAocHN6Rm9udEZhbWlseSAmJiBtX3BFbnVtZXJhdG9yKSB7DQorICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JzIG5hbWVkRm9udHM7DQorICAgICAgICBtX3BFbnVtZXJhdG9yKG5hbWVkRm9udHMsIG1fcFVzZXJEYXRhLCBwc3pGb250RmFtaWx5LCB3VW5pY29kZSk7DQorICAgICAgICBwYXJhbXMucHdzRmFtaWx5ID0gTlVMTDsNCisgICAgICAgIHBEZXNjID0gbV9wTWF0Y2hlcigmcGFyYW1zLCBuYW1lZEZvbnRzLCBtX3BVc2VyRGF0YSk7DQorICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gbV9Gb250RmFjZXMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgICAgICBGWF9MUENGT05UREVTQ1JJUFRPUiBwTWF0Y2ggPSBtX0ZvbnRGYWNlcy5HZXRQdHJBdChpKTsNCisgICAgICAgICAgICBpZiAoKnBNYXRjaCA9PSAqcERlc2MpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBNYXRjaDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpbnQgaW5kZXggPSBtX0ZvbnRGYWNlcy5BZGQoKnBEZXNjKTsNCisgICAgICAgIHJldHVybiBtX0ZvbnRGYWNlcy5HZXRQdHJBdChpbmRleCk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0xQQ0ZPTlRERVNDUklQVE9SIEZYX0RlZkZvbnRNYXRjaGVyKEZYX0xQRk9OVE1BVENIUEFSQU1TIHBQYXJhbXMsIGNvbnN0IENGWF9Gb250RGVzY3JpcHRvcnMgJmZvbnRzLCBGWF9MUFZPSUQgcFVzZXJEYXRhKQ0KK3sNCisgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEJlc3RGb250ID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaUJlc3RTaW1pbGFyID0gMDsNCisgICAgRlhfQk9PTCBiTWF0Y2hTdHlsZSA9IChwUGFyYW1zLT5kd01hdGNoRmxhZ3MgJiBGWF9GT05UTUFUQ0hQQVJBX01hY3RoU3R5bGUpID4gMDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gZm9udHMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsNCisgICAgICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGb250ID0gZm9udHMuR2V0UHRyQXQoaSk7DQorICAgICAgICBpZiAoKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZEl0YWxpYykgPT0gRlhfRk9OVFNUWUxFX0JvbGRJdGFsaWMpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUGFyYW1zLT5wd3NGYW1pbHkpIHsNCisgICAgICAgICAgICBpZiAoRlhTWVNfd2NzaWNtcChwUGFyYW1zLT5wd3NGYW1pbHksIHBGb250LT53c0ZvbnRGYWNlKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBGb250LT51Q2hhclNldCA9PSBGWF9DSEFSU0VUX1N5bWJvbCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcEZvbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBGb250LT51Q2hhclNldCA9PSBGWF9DSEFSU0VUX1N5bWJvbCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBQYXJhbXMtPndDb2RlUGFnZSAhPSAweEZGRkYpIHsNCisgICAgICAgICAgICBpZiAoRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChwRm9udC0+dUNoYXJTZXQpICE9IHBQYXJhbXMtPndDb2RlUGFnZSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChwUGFyYW1zLT5kd1VTQiA8IDEyOCkgew0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0J5dGUgPSBwUGFyYW1zLT5kd1VTQiAvIDMyOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1VTQiA9IDEgPDwgKHBQYXJhbXMtPmR3VVNCICUgMzIpOw0KKyAgICAgICAgICAgICAgICBpZiAoKHBGb250LT5Gb250U2lnbmF0dXJlLmZzVXNiW2R3Qnl0ZV0gJiBkd1VTQikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYk1hdGNoU3R5bGUpIHsNCisgICAgICAgICAgICBpZiAoKHBGb250LT5kd0ZvbnRTdHlsZXMgJiAweDBGKSA9PSAocFBhcmFtcy0+ZHdGb250U3R5bGVzICYgMHgwRikpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUGFyYW1zLT5wd3NGYW1pbHkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmIChGWFNZU193Y3NpY21wKHBQYXJhbXMtPnB3c0ZhbWlseSwgcEZvbnQtPndzRm9udEZhY2UpID09IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlTaW1pbGFyVmFsdWUgPSBGWF9HZXRTaW1pbGFyVmFsdWUocEZvbnQsIHBQYXJhbXMtPmR3Rm9udFN0eWxlcyk7DQorICAgICAgICBpZiAoaUJlc3RTaW1pbGFyIDwgaVNpbWlsYXJWYWx1ZSkgew0KKyAgICAgICAgICAgIGlCZXN0U2ltaWxhciA9IGlTaW1pbGFyVmFsdWU7DQorICAgICAgICAgICAgcEJlc3RGb250ID0gcEZvbnQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGlCZXN0U2ltaWxhciA8IDEgPyBOVUxMIDogcEJlc3RGb250Ow0KK30NCitGWF9JTlQzMiBGWF9HZXRTaW1pbGFyVmFsdWUoRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZvbnQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcykNCit7DQorICAgIEZYX0lOVDMyIGlWYWx1ZSA9IDA7DQorICAgIGlmICgoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1N5bWJvbGljKSA9PSAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykpIHsNCisgICAgICAgIGlWYWx1ZSArPSA2NDsNCisgICAgfQ0KKyAgICBpZiAoKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSA9PSAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSkgew0KKyAgICAgICAgaVZhbHVlICs9IDMyOw0KKyAgICB9DQorICAgIGlmICgoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NlcmlmKSA9PSAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikpIHsNCisgICAgICAgIGlWYWx1ZSArPSAxNjsNCisgICAgfQ0KKyAgICBpZiAoKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpID09IChwRm9udC0+ZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NjcmlwdCkpIHsNCisgICAgICAgIGlWYWx1ZSArPSA4Ow0KKyAgICB9DQorICAgIHJldHVybiBpVmFsdWU7DQorfQ0KK0ZYX0xQTWF0Y2hGb250IEZYX0dldERlZkZvbnRNYXRjaG9yKCkNCit7DQorICAgIHJldHVybiBGWF9EZWZGb250TWF0Y2hlcjsNCit9DQorRlhfRFdPUkQgRlhfR2V0R2RpRm9udFN0eWxlcyhjb25zdCBMT0dGT05UVyAmbGYpDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IDA7DQorICAgIGlmICgobGYubGZQaXRjaEFuZEZhbWlseSAmIDB4MDMpID09IEZJWEVEX1BJVENIKSB7DQorICAgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaDsNCisgICAgfQ0KKyAgICBGWF9CWVRFIG5GYW1pbGllcyA9IGxmLmxmUGl0Y2hBbmRGYW1pbHkgJiAweEYwOw0KKyAgICBpZiAobkZhbWlsaWVzID09IEZGX1JPTUFOKSB7DQorICAgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfU2VyaWY7DQorICAgIH0NCisgICAgaWYgKG5GYW1pbGllcyA9PSBGRl9TQ1JJUFQpIHsNCisgICAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9TY3JpcHQ7DQorICAgIH0NCisgICAgaWYgKGxmLmxmQ2hhclNldCA9PSBTWU1CT0xfQ0hBUlNFVCkgew0KKyAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX1N5bWJvbGljOw0KKyAgICB9DQorICAgIHJldHVybiBkd1N0eWxlczsNCit9DQorc3RhdGljIEZYX0lOVDMyIENBTExCQUNLIEZYX0dkaUZvbnRFbnVtUHJvYyhFTlVNTE9HRk9OVEVYICpscGVsZmUsIE5FV1RFWFRNRVRSSUNFWCAqbHBudG1lLCBEV09SRCBkd0ZvbnRUeXBlLCBMUEFSQU0gbFBhcmFtKQ0KK3sNCisgICAgaWYgKGR3Rm9udFR5cGUgIT0gVFJVRVRZUEVfRk9OVFRZUEUpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGNvbnN0IExPR0ZPTlRXICZsZiA9ICgoTFBFTlVNTE9HRk9OVEVYVylscGVsZmUpLT5lbGZMb2dGb250Ow0KKyAgICBpZiAobGYubGZGYWNlTmFtZVswXSA9PSBMJ0AnKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBGWF9MUEZPTlRERVNDUklQVE9SIHBGb250ID0gRlhfQWxsb2MoRlhfRk9OVERFU0NSSVBUT1IsIDEpOw0KKyAgICBpZiAoTlVMTCA9PSBwRm9udCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0KHBGb250LCAwLCBzaXplb2YoRlhfRk9OVERFU0NSSVBUT1IpKTsNCisgICAgcEZvbnQtPnVDaGFyU2V0ID0gbGYubGZDaGFyU2V0Ow0KKyAgICBwRm9udC0+ZHdGb250U3R5bGVzID0gRlhfR2V0R2RpRm9udFN0eWxlcyhsZik7DQorICAgIEZYU1lTX3djc25jcHkocEZvbnQtPndzRm9udEZhY2UsIChGWF9MUENXU1RSKWxmLmxmRmFjZU5hbWUsIDMxKTsNCisgICAgcEZvbnQtPndzRm9udEZhY2VbMzFdID0gMDsNCisgICAgRlhfbWVtY3B5KCZwRm9udC0+Rm9udFNpZ25hdHVyZSwgJmxwbnRtZS0+bnRtRm9udFNpZywgc2l6ZW9mKGxwbnRtZS0+bnRtRm9udFNpZykpOw0KKyAgICAoKENGWF9Gb250RGVzY3JpcHRvcnMqKWxQYXJhbSktPkFkZCgqcEZvbnQpOw0KKyAgICBGWF9GcmVlKHBGb250KTsNCisgICAgcmV0dXJuIDE7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX0VudW1HZGlGb250cyhDRlhfRm9udERlc2NyaXB0b3JzICZmb250cywgRlhfTFBWT0lEIHBVc2VyRGF0YSwgRlhfTFBDV1NUUiBwd3NGYWNlTmFtZSwgRlhfV0NIQVIgd1VuaWNvZGUpDQorew0KKyAgICBIREMgaERDID0gOjpHZXREQyhOVUxMKTsNCisgICAgTE9HRk9OVFcgbGZGaW5kOw0KKyAgICBGWF9tZW1zZXQoJmxmRmluZCwgMCwgc2l6ZW9mKGxmRmluZCkpOw0KKyAgICBsZkZpbmQubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOw0KKyAgICBpZiAocHdzRmFjZU5hbWUpIHsNCisgICAgICAgIEZYU1lTX3djc25jcHkoKEZYX0xQV1NUUilsZkZpbmQubGZGYWNlTmFtZSwgcHdzRmFjZU5hbWUsIDMxKTsNCisgICAgICAgIGxmRmluZC5sZkZhY2VOYW1lWzMxXSA9IDA7DQorICAgIH0NCisgICAgRW51bUZvbnRGYW1pbGllc0V4VyhoREMsIChMUExPR0ZPTlRXKSZsZkZpbmQsIChGT05URU5VTVBST0NXKUZYX0dkaUZvbnRFbnVtUHJvYywgKExQQVJBTSkmZm9udHMsIDApOw0KKyAgICA6OlJlbGVhc2VEQyhOVUxMLCBoREMpOw0KK30NCitGWF9MUEVudW1BbGxGb250cyBGWF9HZXREZWZGb250RW51bWVyYXRvcigpDQorew0KKyAgICByZXR1cm4gRlhfRW51bUdkaUZvbnRzOw0KK30NCisjZWxzZQ0KK0ZYX0xQQ1NUUiBnX0ZvbnRGb2xkZXJzW10gPSB7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfDQorICAgIChGWF9MUENTVFIpIi91c3Ivc2hhcmUvZm9udHMiLA0KKyAgICAoRlhfTFBDU1RSKSIvdXNyL3NoYXJlL1gxMS9mb250cy9UeXBlMSIsDQorICAgIChGWF9MUENTVFIpIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1RURiIsDQorICAgIChGWF9MUENTVFIpIi91c3IvbG9jYWwvc2hhcmUvZm9udHMiLA0KKyNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfDQorICAgIChGWF9MUENTVFIpIn4vTGlicmFyeS9Gb250cyIsDQorICAgIChGWF9MUENTVFIpIi9MaWJyYXJ5L0ZvbnRzIiwNCisgICAgKEZYX0xQQ1NUUikiL1N5c3RlbS9MaWJyYXJ5L0ZvbnRzIiwNCisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfDQorICAgIChGWF9MUENTVFIpIi9zeXN0ZW0vZm9udHMiLA0KKyNlbmRpZg0KK307DQorQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkNGWF9Gb250U291cmNlRW51bV9GaWxlKCkNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaXplb2YoZ19Gb250Rm9sZGVycykgLyBzaXplb2YoRlhfTFBDU1RSKTsgaSsrKSB7DQorICAgICAgICBtX0ZvbGRlclBhdGhzLkFkZChnX0ZvbnRGb2xkZXJzW2ldKTsNCisgICAgfQ0KK30NCitDRlhfQnl0ZVN0cmluZyBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6R2V0TmV4dEZpbGUoKQ0KK3sNCitSZXN0YXJ0Og0KKyAgICBGWF9MUFZPSUQgcEN1ckhhbmRsZSA9IG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpID09IDAgPyBOVUxMIDogbV9Gb2xkZXJRdWV1ZS5HZXREYXRhUHRyKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSktPnBGaWxlSGFuZGxlOw0KKyAgICBpZiAoTlVMTCA9PSBwQ3VySGFuZGxlKSB7DQorICAgICAgICBpZiAobV9Gb2xkZXJQYXRocy5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEN1ckhhbmRsZSA9IEZYX09wZW5Gb2xkZXIobV9Gb2xkZXJQYXRoc1ttX0ZvbGRlclBhdGhzLkdldFNpemUoKSAtIDFdKTsNCisgICAgICAgIEZYX0hhbmRsZVBhcmVudFBhdGggaHBwOw0KKyAgICAgICAgaHBwLnBGaWxlSGFuZGxlID0gcEN1ckhhbmRsZTsNCisgICAgICAgIGhwcC5ic1BhcmVudFBhdGggPSBtX0ZvbGRlclBhdGhzW21fRm9sZGVyUGF0aHMuR2V0U2l6ZSgpIC0gMV07DQorICAgICAgICBtX0ZvbGRlclF1ZXVlLkFkZChocHApOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZTsNCisgICAgRlhfQk9PTAliRm9sZGVyOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0ZvbGRlclNwZWFyYXRvciA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShDRlhfV2lkZVN0cmluZyhGWF9HZXRGb2xkZXJTZXBhcmF0b3IoKSkpOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgaWYgKCFGWF9HZXROZXh0RmlsZShwQ3VySGFuZGxlLCBic05hbWUsIGJGb2xkZXIpKSB7DQorICAgICAgICAgICAgRlhfQ2xvc2VGb2xkZXIocEN1ckhhbmRsZSk7DQorICAgICAgICAgICAgbV9Gb2xkZXJRdWV1ZS5SZW1vdmVBdChtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpOw0KKyAgICAgICAgICAgIGlmIChtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgIG1fRm9sZGVyUGF0aHMuUmVtb3ZlQXQobV9Gb2xkZXJQYXRocy5HZXRTaXplKCkgLSAxKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fRm9sZGVyUGF0aHMuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGdvdG8gUmVzdGFydDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQ3VySGFuZGxlID0gbV9Gb2xkZXJRdWV1ZS5HZXREYXRhUHRyKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSktPnBGaWxlSGFuZGxlOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJzTmFtZSA9PSAiLiIgfHwgYnNOYW1lID09ICIuLiIpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiRm9sZGVyKSB7DQorICAgICAgICAgICAgRlhfSGFuZGxlUGFyZW50UGF0aCBocHA7DQorICAgICAgICAgICAgaHBwLmJzUGFyZW50UGF0aCA9IG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5ic1BhcmVudFBhdGggKyBic0ZvbGRlclNwZWFyYXRvciArIGJzTmFtZTsNCisgICAgICAgICAgICBocHAucEZpbGVIYW5kbGUgPSBGWF9PcGVuRm9sZGVyKGhwcC5ic1BhcmVudFBhdGgpOw0KKyAgICAgICAgICAgIGlmIChocHAucEZpbGVIYW5kbGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9Gb2xkZXJRdWV1ZS5BZGQoaHBwKTsNCisgICAgICAgICAgICBwQ3VySGFuZGxlID0gaHBwLnBGaWxlSGFuZGxlOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnNOYW1lID0gbV9Gb2xkZXJRdWV1ZS5HZXREYXRhUHRyKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSktPmJzUGFyZW50UGF0aCArIGJzRm9sZGVyU3BlYXJhdG9yICsgYnNOYW1lOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIGJzTmFtZTsNCit9DQorRlhfUE9TSVRJT04gQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldFN0YXJ0UG9zaXRpb24oIEZYX0xQVk9JRCBwVXNlckRhdGEgICkNCit7DQorICAgIG1fd3NOZXh0ID0gR2V0TmV4dEZpbGUoKS5VVEY4RGVjb2RlKCk7DQorICAgIGlmICgwID09IG1fd3NOZXh0LkdldExlbmd0aCgpKSB7DQorICAgICAgICByZXR1cm4gKEZYX1BPU0lUSU9OKTA7DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9QT1NJVElPTikgLSAxOw0KK30NCitJRlhfRmlsZUFjY2VzcyogQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHQoIEZYX1BPU0lUSU9OJiBwb3MsIEZYX0xQVk9JRCBwVXNlckRhdGEgICkNCit7DQorICAgIElGWF9GaWxlQWNjZXNzKiBwQWNjZXNzID0gRlhfQ3JlYXRlRGVmYXVsdEZpbGVBY2Nlc3MobV93c05leHQpOw0KKyAgICBtX3dzTmV4dCA9IEdldE5leHRGaWxlKCkuVVRGOERlY29kZSgpOw0KKyAgICBwb3MgPSAwICE9IG1fd3NOZXh0LkdldExlbmd0aCgpID8gcEFjY2VzcyA6IE5VTEw7DQorICAgIHJldHVybiAoSUZYX0ZpbGVBY2Nlc3MqKXBBY2Nlc3M7DQorfQ0KK0lGWF9Gb250U291cmNlRW51bSoJRlhfQ3JlYXRlRGVmYXVsdEZvbnRTb3VyY2VFbnVtKCkNCit7DQorICAgIHJldHVybiAoSUZYX0ZvbnRTb3VyY2VFbnVtKilGWF9ORVcgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU7DQorfQ0KK0lGWF9Gb250TWdyKiBJRlhfRm9udE1ncjo6Q3JlYXRlKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLCBJRlhfRm9udE1nckRlbGVnYXRlKiBwRGVsZWdhdGUsIEZYX0xQVk9JRCBwVXNlckRhdGEpDQorew0KKyAgICBpZiAoTlVMTCA9PSBwRm9udEVudW0pIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9Gb250TWdySW1wKiBwRm9udE1nciA9IEZYX05FVyBDRlhfRm9udE1nckltcChwRm9udEVudW0sIHBEZWxlZ2F0ZSwgcFVzZXJEYXRhKTsNCisgICAgaWYgKE5VTEwgPT0gcEZvbnRNZ3IpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChwRm9udE1nci0+RW51bUZvbnRzKCkpIHsNCisgICAgICAgIHJldHVybiBwRm9udE1ncjsNCisgICAgfQ0KKyAgICBkZWxldGUgcEZvbnRNZ3I7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDRlhfRm9udE1nckltcDo6Q0ZYX0ZvbnRNZ3JJbXAoIElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLCBJRlhfRm9udE1nckRlbGVnYXRlKiBwRGVsZWdhdGUgLCBGWF9MUFZPSUQgcFVzZXJEYXRhICApDQorICAgIDogbV9wRm9udFNvdXJjZShwRm9udEVudW0pDQorICAgICwgbV9wRGVsZWdhdGUocERlbGVnYXRlKQ0KKyAgICAsIG1fcFVzZXJEYXRhKHBVc2VyRGF0YSkNCit7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZvbnRNZ3JJbXA6OkVudW1Gb250cygpDQorew0KKyAgICBGWEZUX0xpYnJhcnkmIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5Ow0KKyAgICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQorICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJmxpYnJhcnkpOw0KKyAgICB9DQorICAgIGlmIChsaWJyYXJ5ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWEZUX0ZhY2UgcEZhY2UgPSBOVUxMOw0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BGb250U291cmNlLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIElGWF9GaWxlQWNjZXNzKiBwRm9udFNvdXJjZSA9IE5VTEw7DQorICAgIElGWF9GaWxlUmVhZCogcEZvbnRTdHJlYW0gPSBOVUxMOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBwRm9udFNvdXJjZSA9IG1fcEZvbnRTb3VyY2UtPkdldE5leHQocG9zKTsNCisgICAgICAgIHBGb250U3RyZWFtID0gcEZvbnRTb3VyY2UtPkNyZWF0ZUZpbGVTdHJlYW0oRlhfRklMRU1PREVfUmVhZE9ubHkpOw0KKyAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnRTdHJlYW0pIHsNCisgICAgICAgICAgICBwRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKE5VTEwgPT0gKHBGYWNlID0gTG9hZEZhY2UocEZvbnRTdHJlYW0sIDApKSkgew0KKyAgICAgICAgICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIG5GYWNlQ291bnQgPSBwRmFjZS0+bnVtX2ZhY2VzOw0KKyAgICAgICAgUmVwb3J0RmFjZShwRmFjZSwgbV9JbnN0YWxsZWRGb250cywgcEZvbnRTb3VyY2UpOw0KKyAgICAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKSkgew0KKyAgICAgICAgICAgIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IG5GYWNlQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChOVUxMID09IChwRmFjZSA9IExvYWRGYWNlKHBGb250U3RyZWFtLCBpKSkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFJlcG9ydEZhY2UocEZhY2UsIG1fSW5zdGFsbGVkRm9udHMsIHBGb250U291cmNlKTsNCisgICAgICAgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQorICAgICAgICAgICAgICAgIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQorICAgICAgICB9DQorICAgICAgICBwRm9udFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRlhfRm9udE1nckltcDo6UmVsZWFzZSgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9JbnN0YWxsZWRGb250cy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIG1fSW5zdGFsbGVkRm9udHNbaV07DQorICAgIH0NCisgICAgRlhfUE9TSVRJT04gcG9zID0gbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogcERlc2NzOw0KKyAgICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRGVzY3MpOw0KKyAgICAgICAgaWYgKE5VTEwgIT0gcERlc2NzKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBEZXNjczsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwb3MgPSBtX0hhc2gyRm9udHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHM7DQorICAgICAgICBtX0hhc2gyRm9udHMuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udHMpOw0KKyAgICAgICAgaWYgKE5VTEwgIT0gcEZvbnRzKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBGb250czsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX0hhc2gyRm9udHMuUmVtb3ZlQWxsKCk7DQorICAgIHBvcyA9IG1fSGFzaDJGaWxlQWNjZXNzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICAgICAgSUZYX0ZpbGVBY2Nlc3MqIHBGaWxlQWNjZXNzOw0KKyAgICAgICAgbV9IYXNoMkZpbGVBY2Nlc3MuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRmlsZUFjY2Vzcyk7DQorICAgICAgICBpZiAoTlVMTCAhPSBwRmlsZUFjY2Vzcykgew0KKyAgICAgICAgICAgIHBGaWxlQWNjZXNzLT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgICAgICBJRlhfRm9udCogcEZvbnQ7DQorICAgICAgICBtX0ZpbGVBY2Nlc3MySUZYRm9udC5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBGb250KTsNCisgICAgICAgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwb3MgPSBtX0lGWEZvbnQyRmlsZVJlYWQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBJRlhfRm9udCogcEZvbnQ7DQorICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCisgICAgICAgIG1fSUZYRm9udDJGaWxlUmVhZC5HZXROZXh0QXNzb2MocG9zLCBwRm9udCwgcEZpbGVSZWFkKTsNCisgICAgICAgIHBGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUNvZGVQYWdlKCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgICkNCit7DQorICAgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTCA6IG1fcERlbGVnYXRlLT5HZXREZWZGb250QnlDb2RlUGFnZSh0aGlzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQorfQ0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q2hhcnNldCggRlhfQllURSBuQ2hhcnNldCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgICkNCit7DQorICAgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTCA6IG1fcERlbGVnYXRlLT5HZXREZWZGb250QnlDaGFyc2V0KHRoaXMsIG5DaGFyc2V0LCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeVVuaWNvZGUoIEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSAgKQ0KK3sNCisgICAgcmV0dXJuIE5VTEwgPT0gbV9wRGVsZWdhdGUgPyBOVUxMIDogbV9wRGVsZWdhdGUtPkdldERlZkZvbnRCeVVuaWNvZGUodGhpcywgd1VuaWNvZGUsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQorfQ0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0RGVmRm9udEJ5TGFuZ3VhZ2UoIEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSAgKQ0KK3sNCisgICAgcmV0dXJuIE5VTEwgPT0gbV9wRGVsZWdhdGUgPyBOVUxMIDogbV9wRGVsZWdhdGUtPkdldERlZkZvbnRCeUxhbmd1YWdlKHRoaXMsIHdMYW5ndWFnZSwgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlDb2RlUGFnZSggRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ICApDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0hhc2g7DQorICAgIGJzSGFzaC5Gb3JtYXQoIiVkLCAlZCIsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzKTsNCisgICAgYnNIYXNoICs9IENGWF9XaWRlU3RyaW5nKHBzekZvbnRGYW1pbHkpLlVURjhFbmNvZGUoKTsNCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHMgPSBOVUxMOw0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgICBpZiAobV9IYXNoMkZvbnRzLkxvb2t1cChkd0hhc2gsIHBGb250cykpIHsNCisgICAgICAgIGlmIChOVUxMID09IHBGb250cykgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKDAgIT0gcEZvbnRzLT5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICByZXR1cm4gcEZvbnRzLT5HZXRBdCgwKS0+UmV0YWluKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQorICAgICAgICBwRm9udHMgPSBGWF9ORVcgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPjsNCisgICAgfQ0KKyAgICBpZiAoTlVMTCA9PSBwRm9udHMpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIG1fSGFzaDJGb250cy5TZXRBdChkd0hhc2gsIHBGb250cyk7DQorICAgIENGWF9Gb250RGVzY3JpcHRvckluZm9zKiBzb3J0ZWRGb250cyA9IE5VTEw7DQorICAgIGlmICghbV9IYXNoMkNhbmRpZGF0ZUxpc3QuTG9va3VwKGR3SGFzaCwgc29ydGVkRm9udHMpKSB7DQorICAgICAgICBzb3J0ZWRGb250cyA9IEZYX05FVyBDRlhfRm9udERlc2NyaXB0b3JJbmZvczsNCisgICAgICAgIE1hdGNoRm9udHMoKnNvcnRlZEZvbnRzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgQ0ZYX1dpZGVTdHJpbmcocHN6Rm9udEZhbWlseSksIDApOw0KKyAgICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuU2V0QXQoZHdIYXNoLCBzb3J0ZWRGb250cyk7DQorICAgIH0NCisgICAgaWYgKHNvcnRlZEZvbnRzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYyA9IHNvcnRlZEZvbnRzLT5HZXRBdCgwKS5wRm9udDsNCisgICAgcEZvbnQgPSBMb2FkRm9udChwRGVzYy0+bV9wRmlsZUFjY2VzcywgcERlc2MtPm1fbkZhY2VJbmRleCwgTlVMTCk7DQorICAgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgICAgICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOw0KKyAgICB9DQorICAgIHBGb250cy0+QWRkKHBGb250KTsNCisgICAgcmV0dXJuIHBGb250Ow0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldEZvbnRCeUNoYXJzZXQoIEZYX0JZVEUgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ICApDQorew0KKyAgICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChuQ2hhcnNldCksIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQorfQ0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0Rm9udEJ5VW5pY29kZSggRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ICApDQorew0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgICBpZiAobV9GYWlsZWRVbmljb2RlczJOVUxMLkxvb2t1cCh3VW5pY29kZSwgcEZvbnQpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGR0FTX0xQQ0ZPTlRVU0IgeCA9IEZHQVNfR2V0VW5pY29kZUJpdEZpZWxkKHdVbmljb2RlKTsNCisgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBOVUxMID09IHggPyAweEZGRkYgOiB4LT53Q29kZVBhZ2U7DQorICAgIEZYX1dPUkQgd0JpdEZpZWxkID0gTlVMTCA9PSB4ID8gOTk5IDogeC0+d0JpdEZpZWxkOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0hhc2g7DQorICAgIGlmICh3Q29kZVBhZ2UgPT0gMHhGRkZGKSB7DQorICAgICAgICBic0hhc2guRm9ybWF0KCIlZCwgJWQsICVkIiwgd0NvZGVQYWdlLCB3Qml0RmllbGQsIGR3Rm9udFN0eWxlcyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBic0hhc2guRm9ybWF0KCIlZCwgJWQiLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICAgIH0NCisgICAgYnNIYXNoICs9IENGWF9XaWRlU3RyaW5nKHBzekZvbnRGYW1pbHkpLlVURjhFbmNvZGUoKTsNCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHMgPSBOVUxMOw0KKyAgICBpZiAobV9IYXNoMkZvbnRzLkxvb2t1cChkd0hhc2gsIHBGb250cykpIHsNCisgICAgICAgIGlmIChOVUxMID09IHBGb250cykgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKDAgIT0gcEZvbnRzLT5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgcEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICBpZiAoVmVyaWZ5VW5pY29kZShwRm9udHMtPkdldEF0KGkpLCB3VW5pY29kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwRm9udHMtPkdldEF0KGkpLT5SZXRhaW4oKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoTlVMTCA9PSBwRm9udHMpIHsNCisgICAgICAgIHBGb250cyA9IEZYX05FVyBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+Ow0KKyAgICB9DQorICAgIGlmIChOVUxMID09IHBGb250cykgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgbV9IYXNoMkZvbnRzLlNldEF0KGR3SGFzaCwgcEZvbnRzKTsNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3MqIHNvcnRlZEZvbnRzID0gTlVMTDsNCisgICAgaWYgKCFtX0hhc2gyQ2FuZGlkYXRlTGlzdC5Mb29rdXAoZHdIYXNoLCBzb3J0ZWRGb250cykpIHsNCisgICAgICAgIHNvcnRlZEZvbnRzID0gRlhfTkVXIENGWF9Gb250RGVzY3JpcHRvckluZm9zOw0KKyAgICAgICAgTWF0Y2hGb250cygqc29ydGVkRm9udHMsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLCBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KSwgd1VuaWNvZGUpOw0KKyAgICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuU2V0QXQoZHdIYXNoLCBzb3J0ZWRGb250cyk7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHNvcnRlZEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYyA9IHNvcnRlZEZvbnRzLT5HZXRBdChpKS5wRm9udDsNCisgICAgICAgIGlmIChWZXJpZnlVbmljb2RlKHBEZXNjLCB3VW5pY29kZSkpIHsNCisgICAgICAgICAgICBwRm9udCA9IExvYWRGb250KHBEZXNjLT5tX3BGaWxlQWNjZXNzLCBwRGVzYy0+bV9uRmFjZUluZGV4LCBOVUxMKTsNCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwRm9udCkgew0KKyAgICAgICAgICAgICAgICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwRm9udHMtPkFkZChwRm9udCk7DQorICAgICAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChOVUxMID09IHBzekZvbnRGYW1pbHkpIHsNCisgICAgICAgIG1fRmFpbGVkVW5pY29kZXMyTlVMTC5TZXRBdCh3VW5pY29kZSwgTlVMTCk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZvbnRNZ3JJbXA6OlZlcmlmeVVuaWNvZGUoIENGWF9Gb250RGVzY3JpcHRvciogcERlc2MsIEZYX1dDSEFSIHdjVW5pY29kZSApDQorew0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCA9IHBEZXNjLT5tX3BGaWxlQWNjZXNzLT5DcmVhdGVGaWxlU3RyZWFtKEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsNCisgICAgaWYgKE5VTEwgPT0gcEZpbGVSZWFkKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhGVF9GYWNlIHBGYWNlID0gTG9hZEZhY2UocEZpbGVSZWFkLCBwRGVzYy0+bV9uRmFjZUluZGV4KTsNCisgICAgaWYgKE5VTEwgPT0gcEZhY2UpIHsNCisgICAgICAgIGdvdG8gQmFkUmV0Ow0KKyAgICB9DQorICAgIGlmICgwICE9IEZYRlRfU2VsZWN0X0NoYXJtYXAocEZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsNCisgICAgICAgIGdvdG8gQmFkUmV0Ow0KKyAgICB9DQorICAgIGlmICgwID09IEZYRlRfR2V0X0NoYXJfSW5kZXgocEZhY2UsIHdjVW5pY29kZSkpIHsNCisgICAgICAgIGdvdG8gQmFkUmV0Ow0KKyAgICB9DQorICAgIHBGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQorICAgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKTsNCisgICAgfQ0KKyAgICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQorICAgIHJldHVybiBUUlVFOw0KK0JhZFJldDoNCisgICAgaWYgKE5VTEwgIT0gcEZpbGVSZWFkKSB7DQorICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBpZiAoTlVMTCAhPSBwRmFjZSkgew0KKyAgICAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKSkgew0KKyAgICAgICAgICAgIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRlhfRm9udE1nckltcDo6VmVyaWZ5VW5pY29kZSggSUZYX0ZvbnQqIHBGb250LCBGWF9XQ0hBUiB3Y1VuaWNvZGUgKQ0KK3sNCisgICAgaWYgKE5VTEwgPT0gcEZvbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWEZUX0ZhY2UgcEZhY2UgPSAoKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpKS0+bV9GYWNlOw0KKyAgICBGWEZUX0NoYXJNYXAgY2hhcm1hcCA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChwRmFjZSk7DQorICAgIGlmICgwICE9IEZYRlRfU2VsZWN0X0NoYXJtYXAocEZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoMCA9PSBGWEZUX0dldF9DaGFyX0luZGV4KHBGYWNlLCB3Y1VuaWNvZGUpKSB7DQorICAgICAgICBGWEZUX1NldF9DaGFybWFwKHBGYWNlLCBjaGFybWFwKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlMYW5ndWFnZSggRlhfV09SRCB3TGFuZ3VhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ICApDQorew0KKyAgICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHdMYW5ndWFnZSksIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQorfQ0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6TG9hZEZvbnQoIEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfSU5UMzIgaUZhY2VJbmRleCwgRlhfSU5UMzIqIHBGYWNlQ291bnQgKQ0KK3sNCisgICAgRlhfTFBWT0lEIEhhc2hbMl0gPSB7KEZYX0xQVk9JRCkoRlhfVUlOVFBUUilwQnVmZmVyLCAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWlMZW5ndGh9Ow0KKyAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoRlhfTFBDU1RSKUhhc2gsIDIgKiBzaXplb2YgKEZYX0xQVk9JRCkpOw0KKyAgICBJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MgPSBOVUxMOw0KKyAgICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KKyAgICB9DQorICAgIGlmIChOVUxMICE9IHBGb250QWNjZXNzKSB7DQorICAgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnRBY2Nlc3MsIGlGYWNlSW5kZXgsIHBGYWNlQ291bnQsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udCggRlhfTFBDV1NUUiBwc3pGaWxlTmFtZSwgRlhfSU5UMzIgaUZhY2VJbmRleCwgRlhfSU5UMzIqIHBGYWNlQ291bnQgKQ0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KKyAgICBic0hhc2ggKz0gQ0ZYX1dpZGVTdHJpbmcocHN6RmlsZU5hbWUpLlVURjhFbmNvZGUoKTsNCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKEZYX0xQQ1NUUilic0hhc2gsIGJzSGFzaC5HZXRMZW5ndGgoKSk7DQorICAgIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcyA9IE5VTEw7DQorICAgIGlmICghbV9IYXNoMkZpbGVBY2Nlc3MuTG9va3VwKGR3SGFzaCwgcEZvbnRBY2Nlc3MpKSB7DQorICAgICAgICBwRm9udEFjY2VzcyA9IEZYX0NyZWF0ZURlZmF1bHRGaWxlQWNjZXNzKHBzekZpbGVOYW1lKTsNCisgICAgICAgIG1fSGFzaDJGaWxlQWNjZXNzLlNldEF0KGR3SGFzaCwgcEZvbnRBY2Nlc3MpOw0KKyAgICB9DQorICAgIGlmIChOVUxMICE9IHBGb250QWNjZXNzKSB7DQorICAgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnRBY2Nlc3MsIGlGYWNlSW5kZXgsIHBGYWNlQ291bnQsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udCggSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sIEZYX0lOVDMyIGlGYWNlSW5kZXgsIEZYX0lOVDMyKiBwRmFjZUNvdW50LCBGWF9CT09MIGJTYXZlU3RyZWFtICApDQorew0KKyAgICBGWF9MUFZPSUQgSGFzaFsxXSA9IHsoRlhfTFBWT0lEKShGWF9VSU5UUFRSKXBGb250U3RyZWFtfTsNCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKEZYX0xQQ1NUUilIYXNoLCAxICogc2l6ZW9mIChGWF9MUFZPSUQpKTsNCisgICAgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzID0gTlVMTDsNCisgICAgaWYgKCFtX0hhc2gyRmlsZUFjY2Vzcy5Mb29rdXAoZHdIYXNoLCBwRm9udEFjY2VzcykpIHsNCisgICAgfQ0KKyAgICBpZiAoTlVMTCAhPSBwRm9udEFjY2Vzcykgew0KKyAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorfQ0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6TG9hZEZvbnQoIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcywgRlhfSU5UMzIgaUZhY2VJbmRleCwgRlhfSU5UMzIqIHBGYWNlQ291bnQsIEZYX0JPT0wgYldhbnRDYWNoZSApDQorew0KKyAgICBGWF9EV09SRCBkd0hhc2ggPSAwOw0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgICBpZiAoYldhbnRDYWNoZSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KKyAgICAgICAgYnNIYXNoLkZvcm1hdCgiJWQsICVkIiwgKEZYX1VJTlRQVFIpcEZvbnRBY2Nlc3MsIGlGYWNlSW5kZXgpOw0KKyAgICAgICAgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgaWYgKG1fRmlsZUFjY2VzczJJRlhGb250Lkxvb2t1cChkd0hhc2gsIHBGb250KSkgew0KKyAgICAgICAgICAgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHBGYWNlQ291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgICpwRmFjZUNvdW50ID0gKChDRlhfRm9udCopcEZvbnQtPkdldERldkZvbnQoKSktPm1fRmFjZS0+bnVtX2ZhY2VzOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9Gb250KiBwSW50ZXJuYWxGb250ID0gRlhfTkVXIENGWF9Gb250Ow0KKyAgICBpZiAoTlVMTCA9PSBwSW50ZXJuYWxGb250KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBJRlhfRmlsZVJlYWQqIHBGb250U3RyZWFtID0gcEZvbnRBY2Nlc3MtPkNyZWF0ZUZpbGVTdHJlYW0oRlhfRklMRU1PREVfUmVhZE9ubHkpOw0KKyAgICBpZiAoTlVMTCA9PSBwRm9udFN0cmVhbSkgew0KKyAgICAgICAgZGVsZXRlIHBJbnRlcm5hbEZvbnQ7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIXBJbnRlcm5hbEZvbnQtPkxvYWRGaWxlKHBGb250U3RyZWFtLCBpRmFjZUluZGV4KSkgew0KKyAgICAgICAgZGVsZXRlIHBJbnRlcm5hbEZvbnQ7DQorICAgICAgICBwRm9udFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEludGVybmFsRm9udCwgdGhpcywgVFJVRSk7DQorICAgIGlmIChOVUxMID09IHBGb250KSB7DQorICAgICAgICBkZWxldGUgcEludGVybmFsRm9udDsNCisgICAgICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoYldhbnRDYWNoZSkgew0KKyAgICAgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuU2V0QXQoZHdIYXNoLCBwRm9udCk7DQorICAgIH0NCisgICAgbV9JRlhGb250MkZpbGVSZWFkLlNldEF0KHBGb250LCBwRm9udFN0cmVhbSk7DQorICAgIGlmIChOVUxMICE9IHBGYWNlQ291bnQpIHsNCisgICAgICAgICpwRmFjZUNvdW50ID0gKChDRlhfRm9udCopcEZvbnQtPkdldERldkZvbnQoKSktPm1fRmFjZS0+bnVtX2ZhY2VzOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCit9DQorZXh0ZXJuICJDIg0KK3sNCisgICAgdW5zaWduZWQgbG9uZyBfZnRTdHJlYW1SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkNCisgICAgew0KKyAgICAgICAgaWYgKGNvdW50ID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUgPSAoSUZYX0ZpbGVSZWFkKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsNCisgICAgICAgIGludCByZXMgPSBwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7DQorICAgICAgICBpZiAocmVzKSB7DQorICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgdm9pZCBfZnRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pDQorICAgIHsNCisgICAgfQ0KK307DQorRlhGVF9GYWNlIENGWF9Gb250TWdySW1wOjpMb2FkRmFjZSggSUZYX0ZpbGVSZWFkKiBwRm9udFN0cmVhbSwgRlhfSU5UMzIgaUZhY2VJbmRleCApDQorew0KKyAgICBGWEZUX0xpYnJhcnkmIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5Ow0KKyAgICBGWEZUX09wZW5fQXJncyBmdEFyZ3M7DQorICAgIEZYRlRfU3RyZWFtIGZ0U3RyZWFtID0gRlhfQWxsb2MoRlhGVF9TdHJlYW1SZWMsIDEpOw0KKyAgICBGWEZUX0ZhY2UgcEZhY2UgPSBOVUxMOw0KKyAgICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQorICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJmxpYnJhcnkpOw0KKyAgICB9DQorICAgIGlmIChsaWJyYXJ5ID09IE5VTEwpIHsNCisgICAgICAgIGdvdG8gQmFkUmV0Ow0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldCgmZnRBcmdzLCAwLCBzaXplb2YoRlhGVF9PcGVuX0FyZ3MpKTsNCisgICAgaWYgKE5VTEwgPT0gZnRTdHJlYW0pIHsNCisgICAgICAgIGdvdG8gQmFkUmV0Ow0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldChmdFN0cmVhbSwgMCwgc2l6ZW9mKEZYRlRfU3RyZWFtUmVjKSk7DQorICAgIGlmIChOVUxMID09IHBGb250U3RyZWFtKSB7DQorICAgICAgICBnb3RvIEJhZFJldDsNCisgICAgfQ0KKyAgICBmdFN0cmVhbS0+YmFzZSA9IE5VTEw7DQorICAgIGZ0U3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBwRm9udFN0cmVhbTsNCisgICAgZnRTdHJlYW0tPnBvcyA9IDA7DQorICAgIGZ0U3RyZWFtLT5zaXplID0gKHVuc2lnbmVkIGxvbmcpcEZvbnRTdHJlYW0tPkdldFNpemUoKTsNCisgICAgZnRTdHJlYW0tPnJlYWQgPSBfZnRTdHJlYW1SZWFkOw0KKyAgICBmdFN0cmVhbS0+Y2xvc2UgPSBfZnRTdHJlYW1DbG9zZTsNCisgICAgZnRBcmdzLmZsYWdzIHw9IEZUX09QRU5fU1RSRUFNOw0KKyAgICBmdEFyZ3Muc3RyZWFtID0gZnRTdHJlYW07DQorICAgIGlmICgwICE9IEZYRlRfT3Blbl9GYWNlKGxpYnJhcnksICZmdEFyZ3MsIGlGYWNlSW5kZXgsICZwRmFjZSkpIHsNCisgICAgICAgIGdvdG8gQmFkUmV0Ow0KKyAgICB9DQorICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKHBGYWNlLCAwLCA2NCk7DQorICAgIHJldHVybiBwRmFjZTsNCitCYWRSZXQ6DQorICAgIGlmIChOVUxMICE9IGZ0U3RyZWFtKSB7DQorICAgICAgICBGWF9GcmVlKGZ0U3RyZWFtKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0ZYX0ZvbnRNZ3JJbXA6Ok1hdGNoRm9udHMoIENGWF9Gb250RGVzY3JpcHRvckluZm9zJiBNYXRjaGVkRm9udHMsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwgRlhfV0NIQVIgd2NVbmljb2RlICkNCit7DQorICAgIE1hdGNoZWRGb250cy5SZW1vdmVBbGwoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb3JtYWxpemVkRm9udE5hbWUgPSBGb250TmFtZTsNCisgICAgTm9ybWFsaXplRm9udE5hbWUod3NOb3JtYWxpemVkRm9udE5hbWUpOw0KKyAgICBzdGF0aWMgY29uc3QgRlhfSU5UMzIgbk1heCA9IDB4ZmZmZjsNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udCA9IE5VTEw7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fSW5zdGFsbGVkRm9udHMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgICAgIHBGb250ID0gbV9JbnN0YWxsZWRGb250c1tpXTsNCisgICAgICAgIEZYX0lOVDMyIG5QZW5hbHR5ID0gQ2FsY1BlbmFsdHkocEZvbnQsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLCB3c05vcm1hbGl6ZWRGb250TmFtZSwgd2NVbmljb2RlKTsNCisgICAgICAgIGlmIChuUGVuYWx0eSA+PSAweEZGRkYpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZvbnREZXNjcmlwdG9ySW5mbyBGb250SW5mbzsNCisgICAgICAgIEZvbnRJbmZvLnBGb250ID0gcEZvbnQ7DQorICAgICAgICBGb250SW5mby5uUGVuYWx0eSA9IG5QZW5hbHR5Ow0KKyAgICAgICAgTWF0Y2hlZEZvbnRzLkFkZChGb250SW5mbyk7DQorICAgICAgICBpZiAoTWF0Y2hlZEZvbnRzLkdldFNpemUoKSA9PSBuTWF4KSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKE1hdGNoZWRGb250cy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ0ZYX1NTb3J0VGVtcGxhdGU8RlhfRm9udERlc2NyaXB0b3JJbmZvPiBzc29ydDsNCisgICAgc3NvcnQuU2hlbGxTb3J0KE1hdGNoZWRGb250cy5HZXREYXRhKCksIE1hdGNoZWRGb250cy5HZXRTaXplKCkpOw0KKyAgICByZXR1cm4gTWF0Y2hlZEZvbnRzLkdldFNpemUoKTsNCit9DQorc3RydWN0IEZYX0JpdENvZGVQYWdlIHsNCisgICAgRlhfV09SRCB3Qml0Ow0KKyAgICBGWF9XT1JEIHdDb2RlUGFnZTsNCit9Ow0KK3N0YXRpYyBjb25zdCBGWF9CaXRDb2RlUGFnZSBnX0JpdDJDb2RlUGFnZVtdID0gew0KKyAgICB7MCwgMTI1Mn0sDQorICAgIHsxLCAxMjUwfSwNCisgICAgezIsIDEyNTF9LA0KKyAgICB7MywgMTI1M30sDQorICAgIHs0LCAxMjU0fSwNCisgICAgezUsIDEyNTV9LA0KKyAgICB7NiwgMTI1Nn0sDQorICAgIHs3LCAxMjU3fSwNCisgICAgezgsIDEyNTh9LA0KKyAgICB7OSwgMH0sDQorICAgIHsxMCwgMH0sDQorICAgIHsxMSwgMH0sDQorICAgIHsxMiwgMH0sDQorICAgIHsxMywgMH0sDQorICAgIHsxNCwgMH0sDQorICAgIHsxNSwgMH0sDQorICAgIHsxNiwgODc0fSwNCisgICAgezE3LCA5MzJ9LA0KKyAgICB7MTgsIDkzNn0sDQorICAgIHsxOSwgOTQ5fSwNCisgICAgezIwLCA5NTB9LA0KKyAgICB7MjEsIDEzNjF9LA0KKyAgICB7MjIsIDB9LA0KKyAgICB7MjMsIDB9LA0KKyAgICB7MjQsIDB9LA0KKyAgICB7MjUsIDB9LA0KKyAgICB7MjYsIDB9LA0KKyAgICB7MjcsIDB9LA0KKyAgICB7MjgsIDB9LA0KKyAgICB7MjksIDB9LA0KKyAgICB7MzAsIDB9LA0KKyAgICB7MzEsIDB9LA0KKyAgICB7MzIsIDB9LA0KKyAgICB7MzMsIDB9LA0KKyAgICB7MzQsIDB9LA0KKyAgICB7MzUsIDB9LA0KKyAgICB7MzYsIDB9LA0KKyAgICB7MzcsIDB9LA0KKyAgICB7MzgsIDB9LA0KKyAgICB7MzksIDB9LA0KKyAgICB7NDAsIDB9LA0KKyAgICB7NDEsIDB9LA0KKyAgICB7NDIsIDB9LA0KKyAgICB7NDMsIDB9LA0KKyAgICB7NDQsIDB9LA0KKyAgICB7NDUsIDB9LA0KKyAgICB7NDYsIDB9LA0KKyAgICB7NDcsIDB9LA0KKyAgICB7NDgsIDg2OX0sDQorICAgIHs0OSwgODY2fSwNCisgICAgezUwLCA4NjV9LA0KKyAgICB7NTEsIDg2NH0sDQorICAgIHs1MiwgODYzfSwNCisgICAgezUzLCA4NjJ9LA0KKyAgICB7NTQsIDg2MX0sDQorICAgIHs1NSwgODYwfSwNCisgICAgezU2LCA4NTd9LA0KKyAgICB7NTcsIDg1NX0sDQorICAgIHs1OCwgODUyfSwNCisgICAgezU5LCA3NzV9LA0KKyAgICB7NjAsIDczN30sDQorICAgIHs2MSwgNzA4fSwNCisgICAgezYyLCA4NTB9LA0KKyAgICB7NjMsIDQzN30sDQorfTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlQml0KEZYX1dPUkQgd0NvZGVQYWdlKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHNpemVvZihnX0JpdDJDb2RlUGFnZSkgLyBzaXplb2YgKEZYX0JpdENvZGVQYWdlKTsgaSsrKSB7DQorICAgICAgICBpZiAoZ19CaXQyQ29kZVBhZ2VbaV0ud0NvZGVQYWdlID09IHdDb2RlUGFnZSkgew0KKyAgICAgICAgICAgIHJldHVybiBnX0JpdDJDb2RlUGFnZVtpXS53Qml0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAoRlhfV09SRCkgLSAxOw0KK30NCitGWF9XT1JEIEZYX0dldFVuaWNvZGVCaXQoRlhfV0NIQVIgd2NVbmljb2RlKQ0KK3sNCisgICAgRkdBU19MUENGT05UVVNCIHggPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3Y1VuaWNvZGUpOw0KKyAgICBpZiAoTlVMTCA9PSB4KSB7DQorICAgICAgICByZXR1cm4gOTk5Ow0KKyAgICB9DQorICAgIHJldHVybiB4LT53Qml0RmllbGQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9Gb250TWdySW1wOjpDYWxjUGVuYWx0eSggQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwSW5zdGFsbGVkLCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsIEZYX1dDSEFSIHdjVW5pY29kZSApDQorew0KKyAgICBGWF9JTlQzMiBuUGVuYWx0eSA9IDMwMDAwOw0KKyAgICBpZiAoMCAhPSBGb250TmFtZS5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgaWYgKEZvbnROYW1lICE9IHBJbnN0YWxsZWQtPm1fd3NGYWNlTmFtZSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGk7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICBpZiAocEluc3RhbGxlZC0+bV93c0ZhbWlseU5hbWVzW2ldID09IEZvbnROYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaSA9PSBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBuUGVuYWx0eSAtPSAyODAwMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG5QZW5hbHR5IC09IDMwMDAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKDMwMDAwID09IG5QZW5hbHR5ICYmIDAgPT0gSXNQYXJ0TmFtZShwSW5zdGFsbGVkLT5tX3dzRmFjZU5hbWUsIEZvbnROYW1lKSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGk7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICBpZiAoMCAhPSBJc1BhcnROYW1lKHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lc1tpXSwgRm9udE5hbWUpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaSA9PSBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBuUGVuYWx0eSAtPSAyNjAwMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG5QZW5hbHR5IC09IDI3MDAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3U3R5bGVNYXNrID0gcEluc3RhbGxlZC0+bV9kd0ZvbnRTdHlsZXMgXiBkd0ZvbnRTdHlsZXM7DQorICAgIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSB7DQorICAgICAgICBuUGVuYWx0eSArPSA0NTAwOw0KKyAgICB9DQorICAgIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSB7DQorICAgICAgICBuUGVuYWx0eSArPSAxMDAwMDsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQorICAgICAgICBuUGVuYWx0eSArPSAxMDAwMDsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfU2VyaWYpIHsNCisgICAgICAgIG5QZW5hbHR5ICs9IDUwMDsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCisgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgfQ0KKyAgICBpZiAoblBlbmFsdHkgPj0gMHhGRkZGKSB7DQorICAgICAgICByZXR1cm4gMHhGRkZGOw0KKyAgICB9DQorICAgIEZYX1dPUkQgd0JpdCA9ICgoMCA9PSB3Q29kZVBhZ2UgfHwgMHhGRkZGID09IHdDb2RlUGFnZSkgPyAoRlhfV09SRCkgLSAxIDogRlhfR2V0Q29kZVBhZ2VCaXQod0NvZGVQYWdlKSk7DQorICAgIGlmICh3Qml0ICE9IChGWF9XT1JEKSAtIDEpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydCh3Qml0IDwgNjQpOw0KKyAgICAgICAgaWYgKDAgPT0gKHBJbnN0YWxsZWQtPm1fZHdDc2Jbd0JpdCAvIDMyXSAmICgxIDw8ICh3Qml0ICUgMzIpKSkpIHsNCisgICAgICAgICAgICBuUGVuYWx0eSArPSAweEZGRkY7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG5QZW5hbHR5IC09IDYwMDAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHdCaXQgPSAoKDAgPT0gd2NVbmljb2RlIHx8IDB4RkZGRSA9PSB3Y1VuaWNvZGUpID8gKEZYX1dPUkQpOTk5IDogRlhfR2V0VW5pY29kZUJpdCh3Y1VuaWNvZGUpKTsNCisgICAgaWYgKHdCaXQgIT0gKEZYX1dPUkQpOTk5KSB7DQorICAgICAgICBGWFNZU19hc3NlcnQod0JpdCA8IDEyOCk7DQorICAgICAgICBpZiAoMCA9PSAocEluc3RhbGxlZC0+bV9kd1VzYlt3Qml0IC8gMzJdICYgKDEgPDwgKHdCaXQgJSAzMikpKSkgew0KKyAgICAgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgblBlbmFsdHkgLT0gNjAwMDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG5QZW5hbHR5Ow0KK30NCit2b2lkIENGWF9Gb250TWdySW1wOjpDbGVhckZvbnRDYWNoZSgpDQorew0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3SGFzaDsNCisgICAgICAgIENGWF9Gb250RGVzY3JpcHRvckluZm9zKiBwRGVzY3M7DQorICAgICAgICBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBEZXNjcyk7DQorICAgICAgICBpZiAoTlVMTCAhPSBwRGVzY3MpIHsNCisgICAgICAgICAgICBkZWxldGUgcERlc2NzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBvcyA9IG1fRmlsZUFjY2VzczJJRlhGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICAgICAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgICAgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udCk7DQorICAgICAgICBpZiAoTlVMTCAhPSBwRm9udCkgew0KKyAgICAgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcG9zID0gbV9JRlhGb250MkZpbGVSZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQ7DQorICAgICAgICBtX0lGWEZvbnQyRmlsZVJlYWQuR2V0TmV4dEFzc29jKHBvcywgcEZvbnQsIHBGaWxlUmVhZCk7DQorICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgfQ0KK30NCit2b2lkIENGWF9Gb250TWdySW1wOjpSZW1vdmVGb250KCBJRlhfRm9udCogcEVGb250ICkNCit7DQorICAgIGlmIChOVUxMID09IHBFRm9udCkgew0KKyAgICAgICAgcmV0dXJuIDsNCisgICAgfQ0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCisgICAgaWYgKG1fSUZYRm9udDJGaWxlUmVhZC5Mb29rdXAocEVGb250LCBwRmlsZVJlYWQpKSB7DQorICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fSUZYRm9udDJGaWxlUmVhZC5SZW1vdmVLZXkocEVGb250KTsNCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwb3M7DQorICAgIHBvcyA9IG1fRmlsZUFjY2VzczJJRlhGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICAgICAgSUZYX0ZvbnQqIHBDRm9udDsNCisgICAgICAgIG1fRmlsZUFjY2VzczJJRlhGb250LkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcENGb250KTsNCisgICAgICAgIGlmIChwQ0ZvbnQgPT0gcEVGb250KSB7DQorICAgICAgICAgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuUmVtb3ZlS2V5KGR3SGFzaCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcG9zID0gbV9IYXNoMkZvbnRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogcEZvbnRzOw0KKyAgICAgICAgbV9IYXNoMkZvbnRzLkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcEZvbnRzKTsNCisgICAgICAgIGlmIChOVUxMICE9IHBGb250cykgew0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBwRm9udHMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGlmIChwRm9udHMtPkdldEF0KGkpID09IHBFRm9udCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEZvbnRzLT5TZXRBdChpLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9IYXNoMkZvbnRzLlJlbW92ZUtleShkd0hhc2gpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OlJlcG9ydEZhY2UoIEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX0ZvbnREZXNjcmlwdG9ycyYgRm9udHMsIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcykNCit7DQorICAgIGlmICgwID09IChwRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkpIHsNCisgICAgICAgIHJldHVybiA7DQorICAgIH0NCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udCA9IEZYX05FVyBDRlhfRm9udERlc2NyaXB0b3I7DQorICAgIGlmIChOVUxMID09IHBGb250KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcEZvbnQtPm1fZHdGb250U3R5bGVzIHw9IEZYRlRfSXNfRmFjZV9Cb2xkKHBGYWNlKSA/IEZYX0ZPTlRTVFlMRV9Cb2xkIDogMDsNCisgICAgcEZvbnQtPm1fZHdGb250U3R5bGVzIHw9IEZYRlRfSXNfRmFjZV9JdGFsaWMocEZhY2UpID8gRlhfRk9OVFNUWUxFX0l0YWxpYyA6IDA7DQorICAgIHBGb250LT5tX2R3Rm9udFN0eWxlcyB8PSBHZXRGbGFncyhwRmFjZSk7DQorICAgIENGWF9Xb3JkQXJyYXkgQ2hhcnNldHM7DQorICAgIEdldENoYXJzZXRzKHBGYWNlLCBDaGFyc2V0cyk7DQorICAgIEdldFVTQkNTQihwRmFjZSwgcEZvbnQtPm1fZHdVc2IsIHBGb250LT5tX2R3Q3NiKTsNCisgICAgdW5zaWduZWQgbG9uZyBuTGVuZ3RoID0gMDsNCisgICAgRlRfVUxvbmcgZHdUYWc7DQorICAgIEZYX0xQQllURSBwVGFibGUgPSBOVUxMOw0KKyAgICBGVF9FTkNfVEFHKGR3VGFnLCAnbicsICdhJywgJ20nLCAnZScpOw0KKyAgICB1bnNpZ25lZCBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZShwRmFjZSwgZHdUYWcsIDAsIE5VTEwsICZuTGVuZ3RoKTsNCisgICAgaWYgKDAgPT0gZXJyb3IgJiYgMCAhPSBuTGVuZ3RoKSB7DQorICAgICAgICBwVGFibGUgPSBGWF9BbGxvYyhGWF9CWVRFLCBuTGVuZ3RoKTsNCisgICAgICAgIGlmIChOVUxMICE9IHBUYWJsZSkgew0KKyAgICAgICAgICAgIGVycm9yID0gRlhGVF9Mb2FkX1NmbnRfVGFibGUocEZhY2UsIGR3VGFnLCAwLCBwVGFibGUsIE5VTEwpOw0KKyAgICAgICAgICAgIGlmICgwICE9IGVycm9yKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocFRhYmxlKTsNCisgICAgICAgICAgICAgICAgcFRhYmxlID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgR2V0TmFtZXMocFRhYmxlLCBwRm9udC0+bV93c0ZhbWlseU5hbWVzKTsNCisgICAgaWYgKE5VTEwgIT0gcFRhYmxlKSB7DQorICAgICAgICBGWF9GcmVlKHBUYWJsZSk7DQorICAgIH0NCisgICAgcEZvbnQtPm1fd3NGYW1pbHlOYW1lcy5BZGQoQ0ZYX0J5dGVTdHJpbmcocEZhY2UtPmZhbWlseV9uYW1lKS5VVEY4RGVjb2RlKCkpOw0KKyAgICBwRm9udC0+bV93c0ZhY2VOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChGWEZUX0dldF9Qb3N0c2NyaXB0X05hbWUocEZhY2UpKTsNCisgICAgcEZvbnQtPm1fbkZhY2VJbmRleCA9IHBGYWNlLT5mYWNlX2luZGV4Ow0KKyAgICBwRm9udC0+bV9wRmlsZUFjY2VzcyA9IHBGb250QWNjZXNzLT5SZXRhaW4oKTsNCisgICAgTm9ybWFsaXplRm9udE5hbWUocEZvbnQtPm1fd3NGYWNlTmFtZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBwRm9udC0+bV93c0ZhbWlseU5hbWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBOb3JtYWxpemVGb250TmFtZShwRm9udC0+bV93c0ZhbWlseU5hbWVzW2ldKTsNCisgICAgfQ0KKyAgICBGb250cy5BZGQocEZvbnQpOw0KK30NCitGWF9EV09SRCBDRlhfRm9udE1nckltcDo6R2V0RmxhZ3MoRlhGVF9GYWNlIHBGYWNlKQ0KK3sNCisgICAgRlhfRFdPUkQgZmxhZyA9IDA7DQorICAgIGlmIChGVF9JU19GSVhFRF9XSURUSChwRmFjZSkpIHsNCisgICAgICAgIGZsYWcgfD0gRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2g7DQorICAgIH0NCisgICAgVFRfT1MyKiBwT1MyID0gKFRUX09TMiopRlRfR2V0X1NmbnRfVGFibGUocEZhY2UsIGZ0X3NmbnRfb3MyKTsNCisgICAgaWYgKCFwT1MyKSB7DQorICAgICAgICByZXR1cm4gZmxhZzsNCisgICAgfQ0KKyAgICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkgew0KKyAgICAgICAgZmxhZyB8PSBGWF9GT05UU1RZTEVfU3ltYm9saWM7DQorICAgIH0NCisgICAgaWYgKHBPUzItPnBhbm9zZVswXSA9PSAyKSB7DQorICAgICAgICBGWF9CWVRFIHVTZXJpZiA9IHBPUzItPnBhbm9zZVsxXTsNCisgICAgICAgIGlmICgodVNlcmlmID4gMSAmJiB1U2VyaWYgPCAxMCkgfHwgdVNlcmlmID4gMTMpIHsNCisgICAgICAgICAgICBmbGFnIHw9IEZYX0ZPTlRTVFlMRV9TZXJpZjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZmxhZzsNCit9DQorI2RlZmluZSBHZXRVSW50OChwKSAoKEZYX1VJTlQ4KSgocClbMF0pKQ0KKyNkZWZpbmUgR2V0VUludDE2KHApICgoRlhfVUlOVDE2KSgocClbMF0gPDwgOCB8IChwKVsxXSkpDQorI2RlZmluZSBHZXRVSW50MzIocCkgKChGWF9VSU5UMzIpKChwKVswXSA8PCAyNCB8IChwKVsxXSA8PCAxNiB8IChwKVsyXSA8PCA4IHwgKHApWzNdKSkNCit2b2lkIENGWF9Gb250TWdySW1wOjpHZXROYW1lcyhGWF9MUENCWVRFIG5hbWVfdGFibGUsIENGWF9XaWRlU3RyaW5nQXJyYXkmIE5hbWVzKQ0KK3sNCisgICAgaWYgKE5VTEwgPT0gbmFtZV90YWJsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0xQQllURSBscFRhYmxlID0gKEZYX0xQQllURSluYW1lX3RhYmxlOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZhbWlseTsNCisgICAgRlhfTFBCWVRFIHNwID0gbHBUYWJsZSArIDI7DQorICAgIEZYX0xQQllURSBscE5hbWVSZWNvcmQgPSBscFRhYmxlICsgNjsNCisgICAgRlhfVUlOVDE2IG5OYW1lQ291bnQgPSBHZXRVSW50MTYoc3ApOw0KKyAgICBGWF9MUEJZVEUgbHBTdHIgPSBscFRhYmxlICsgR2V0VUludDE2KHNwICsgMik7DQorICAgIGZvciAoRlhfVUlOVDE2IGogPSAwOyBqIDwgbk5hbWVDb3VudDsgaisrKSB7DQorICAgICAgICBGWF9VSU5UMTYgbk5hbWVJRCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyA2KTsNCisgICAgICAgIGlmIChuTmFtZUlEICE9IDEpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX1VJTlQxNiBuUGxhdGZvcm1JRCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyAwKTsNCisgICAgICAgIEZYX1VJTlQxNiBuTmFtZUxlbmd0aCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyA4KTsNCisgICAgICAgIEZYX1VJTlQxNiBuTmFtZU9mZnNldCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyAxMCk7DQorICAgICAgICB3c0ZhbWlseS5FbXB0eSgpOw0KKyAgICAgICAgaWYgKG5QbGF0Zm9ybUlEICE9IDEpIHsNCisgICAgICAgICAgICBmb3IgKEZYX1VJTlQxNiBrID0gMDsgayA8IG5OYW1lTGVuZ3RoIC8gMjsgaysrKSB7DQorICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdjVGVtcCA9IEdldFVJbnQxNihscFN0ciArIG5OYW1lT2Zmc2V0ICsgayAqIDIpOw0KKyAgICAgICAgICAgICAgICB3c0ZhbWlseSArPSB3Y1RlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIE5hbWVzLkFkZCh3c0ZhbWlseSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZvciAoRlhfVUlOVDE2IGsgPSAwOyBrIDwgbk5hbWVMZW5ndGg7IGsrKykgew0KKyAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBHZXRVSW50OChscFN0ciArIG5OYW1lT2Zmc2V0ICsgayk7DQorICAgICAgICAgICAgICAgIHdzRmFtaWx5ICs9IHdjVGVtcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgTmFtZXMuQWRkKHdzRmFtaWx5KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCisjdW5kZWYgR2V0VUludDgNCisjdW5kZWYgR2V0VUludDE2DQorI3VuZGVmIEdldFVJbnQzMg0KK3N0cnVjdCBGWF9CSVQyQ0hBUlNFVCB7DQorICAgIEZYX1dPUkQgd0JpdDsNCisgICAgRlhfV09SRCB3Q2hhcnNldDsNCit9Ow0KK0ZYX0JJVDJDSEFSU0VUIGdfRlhfQml0MkNoYXJzZXQxWzE2XSA9IHsNCisgICAgezEgPDwgMCAsIEZYX0NIQVJTRVRfQU5TSX0sDQorICAgIHsxIDw8IDEgLCBGWF9DSEFSU0VUX01TV2luX0Vhc3RlckV1cm9wZWFufSwNCisgICAgezEgPDwgMiAsIEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7MSA8PCAzICwgRlhfQ0hBUlNFVF9NU1dpbl9HcmVla30sDQorICAgIHsxIDw8IDQgLCBGWF9DSEFSU0VUX01TV2luX1R1cmtpc2h9LA0KKyAgICB7MSA8PCA1ICwgRlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXd9LA0KKyAgICB7MSA8PCA2ICwgRlhfQ0hBUlNFVF9NU1dpbl9BcmFiaWN9LA0KKyAgICB7MSA8PCA3ICwgRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWN9LA0KKyAgICB7MSA8PCA4ICwgRlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlfSwNCisgICAgezEgPDwgOSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEwICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTEgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMiAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEzICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTQgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxNSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorfTsNCitGWF9CSVQyQ0hBUlNFVCBnX0ZYX0JpdDJDaGFyc2V0MlsxNl0gPSB7DQorICAgIHsxIDw8IDAgLCBGWF9DSEFSU0VUX1RoYWl9LA0KKyAgICB7MSA8PCAxICwgRlhfQ0hBUlNFVF9TaGlmdEpJU30sDQorICAgIHsxIDw8IDIgLCBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkfSwNCisgICAgezEgPDwgMyAsIEZYX0NIQVJTRVRfS29yZWFufSwNCisgICAgezEgPDwgNCAsIEZYX0NIQVJTRVRfQ2hpbmVzZVRyaWRpdGlvbmFsfSwNCisgICAgezEgPDwgNSAsIEZYX0NIQVJTRVRfSm9oYWJ9LA0KKyAgICB7MSA8PCA2ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNyAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDggLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA5ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTAgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEyICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTMgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxNCAsIEZYX0NIQVJTRVRfT0VNfSwNCisgICAgezEgPDwgMTUgLCBGWF9DSEFSU0VUX1N5bWJvbH0sDQorfTsNCitGWF9CSVQyQ0hBUlNFVCBnX0ZYX0JpdDJDaGFyc2V0M1sxNl0gPSB7DQorICAgIHsxIDw8IDAgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMiAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDMgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA0ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDYgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA3ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgOCAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDkgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMCAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDExICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTIgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMyAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDE0ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTUgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KK307DQorRlhfQklUMkNIQVJTRVQgZ19GWF9CaXQyQ2hhcnNldDRbMTZdID0gew0KKyAgICB7MSA8PCAwICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDEgLCBGWF9DSEFSU0VUX0RlZmF1bHQgfSwNCisgICAgezEgPDwgMiAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KKyAgICB7MSA8PCAzICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDQgLCBGWF9DSEFSU0VUX0RlZmF1bHQgfSwNCisgICAgezEgPDwgNSAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KKyAgICB7MSA8PCA2ICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDcgLCBGWF9DSEFSU0VUX0RlZmF1bHQgfSwNCisgICAgezEgPDwgOCAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KKyAgICB7MSA8PCA5ICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDEwICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDExICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDEyICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDEzICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDE0ICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQorICAgIHsxIDw8IDE1ICwgRlhfQ0hBUlNFVF9VUyB9LA0KK307DQorI2RlZmluZSBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVChuKSBcDQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCAxNjsgaSsrKVwNCisgICAge1wNCisgICAgICAgIGlmICgoYSMjbiAmIGdfRlhfQml0MkNoYXJzZXQjI25baV0ud0JpdCkgIT0gMClcDQorICAgICAgICB7XA0KKyAgICAgICAgICAgIENoYXJzZXRzLkFkZChnX0ZYX0JpdDJDaGFyc2V0IyNuW2ldLndDaGFyc2V0KTtcDQorICAgICAgICB9XA0KKyAgICB9DQordm9pZCBDRlhfRm9udE1nckltcDo6R2V0Q2hhcnNldHMoIEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX1dvcmRBcnJheSYgQ2hhcnNldHMgKQ0KK3sNCisgICAgQ2hhcnNldHMuUmVtb3ZlQWxsKCk7DQorICAgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQorICAgIGlmIChOVUxMICE9IHBPUzIpIHsNCisgICAgICAgIEZYX1dPUkQgYTEsIGEyLCBhMywgYTQ7DQorICAgICAgICBhMSA9IHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAweDAwMDBmZmZmOw0KKyAgICAgICAgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQoMSk7DQorICAgICAgICBhMiA9IChwT1MyLT51bENvZGVQYWdlUmFuZ2UxID4+IDE2KSAmIDB4MDAwMGZmZmY7DQorICAgICAgICBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVCgyKTsNCisgICAgICAgIGEzID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMiAmIDB4MDAwMGZmZmY7DQorICAgICAgICBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVCgzKTsNCisgICAgICAgIGE0ID0gKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTIgPj4gMTYpICYgMHgwMDAwZmZmZjsNCisgICAgICAgIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKDQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ2hhcnNldHMuQWRkKEZYX0NIQVJTRVRfRGVmYXVsdCk7DQorICAgIH0NCit9DQorI3VuZGVmIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UDQordm9pZCBDRlhfRm9udE1nckltcDo6R2V0VVNCQ1NCKCBGWEZUX0ZhY2UgcEZhY2UsIEZYX0RXT1JEKiBVU0IsIEZYX0RXT1JEKiBDU0IgKQ0KK3sNCisgICAgVFRfT1MyKiBwT1MyID0gKFRUX09TMiopRlRfR2V0X1NmbnRfVGFibGUocEZhY2UsIGZ0X3NmbnRfb3MyKTsNCisgICAgaWYgKE5VTEwgIT0gcE9TMikgew0KKyAgICAgICAgVVNCWzBdID0gcE9TMi0+dWxVbmljb2RlUmFuZ2UxOw0KKyAgICAgICAgVVNCWzFdID0gcE9TMi0+dWxVbmljb2RlUmFuZ2UyOw0KKyAgICAgICAgVVNCWzJdID0gcE9TMi0+dWxVbmljb2RlUmFuZ2UzOw0KKyAgICAgICAgVVNCWzNdID0gcE9TMi0+dWxVbmljb2RlUmFuZ2U0Ow0KKyAgICAgICAgQ1NCWzBdID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMTsNCisgICAgICAgIENTQlsxXSA9IHBPUzItPnVsQ29kZVBhZ2VSYW5nZTI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBVU0JbMF0gPSAwOw0KKyAgICAgICAgVVNCWzFdID0gMDsNCisgICAgICAgIFVTQlsyXSA9IDA7DQorICAgICAgICBVU0JbM10gPSAwOw0KKyAgICAgICAgQ1NCWzBdID0gMDsNCisgICAgICAgIENTQlsxXSA9IDA7DQorICAgIH0NCit9DQordm9pZCBDRlhfRm9udE1nckltcDo6Tm9ybWFsaXplRm9udE5hbWUoIENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSApDQorew0KKyAgICBGb250TmFtZS5NYWtlTG93ZXIoKTsNCisgICAgRm9udE5hbWUuUmVtb3ZlKCcgJyk7DQorICAgIEZvbnROYW1lLlJlbW92ZSgnLScpOw0KK30NCitGWF9JTlQzMiBDRlhfRm9udE1nckltcDo6SXNQYXJ0TmFtZSggY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgTmFtZTIgKQ0KK3sNCisgICAgaWYgKE5hbWUxLkZpbmQoKEZYX0xQQ1dTVFIpTmFtZTIpICE9IC0xKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuaCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjYzczNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfRk9OVE1HUl9JTVANCisjZGVmaW5lIF9GWF9GT05UTUdSX0lNUA0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorRlhfSU5UMzIgRlhfR2V0U2ltaWxhclZhbHVlKEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGb250LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KK0ZYX0xQQ0ZPTlRERVNDUklQVE9SIEZYX0RlZkZvbnRNYXRjaGVyKEZYX0xQRk9OVE1BVENIUEFSQU1TIHBQYXJhbXMsIGNvbnN0IENGWF9Gb250RGVzY3JpcHRvcnMgJmZvbnRzLCBGWF9MUFZPSUQgcFVzZXJEYXRhKTsNCitjbGFzcyBDRlhfU3RkRm9udE1nckltcCA6IHB1YmxpYyBJRlhfRm9udE1nciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfU3RkRm9udE1nckltcChGWF9MUEVudW1BbGxGb250cyBwRW51bWVyYXRvciwgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIsIEZYX0xQVk9JRCBwVXNlckRhdGEpOw0KKyAgICB+Q0ZYX1N0ZEZvbnRNZ3JJbXAoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNoYXJzZXQoRlhfQllURSBuQ2hhcnNldCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRik7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlMZW5ndGgpOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoRlhfTFBDV1NUUiBwc3pGaWxlTmFtZSk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgRlhfTFBDV1NUUiBwc3pGb250QWxpYXMgPSBOVUxMLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMgPSAwLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDAsIEZYX0JPT0wgYlNhdmVTdHJlYW0gPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChJRlhfRm9udCAqcFNyY0ZvbnQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhckZvbnRDYWNoZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVGb250KElGWF9Gb250ICpwRm9udCk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9MUE1hdGNoRm9udAkJCW1fcE1hdGNoZXI7DQorICAgIEZYX0xQRW51bUFsbEZvbnRzCQltX3BFbnVtZXJhdG9yOw0KKyAgICBDRlhfRm9udERlc2NyaXB0b3JzCQltX0ZvbnRGYWNlczsNCisgICAgQ0ZYX1B0ckFycmF5CQkJbV9Gb250czsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9DUEZvbnRzOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0ZhbWlseUZvbnRzOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQltX1VuaWNvZGVGb250czsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9CdWZmZXJGb250czsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9GaWxlRm9udHM7DQorICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fU3RyZWFtRm9udHM7DQorICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fRGVyaXZlRm9udHM7DQorICAgIEZYX0xQVk9JRAkJCQltX3BVc2VyRGF0YTsNCisgICAgdm9pZAkJCQkJUmVtb3ZlRm9udChDRlhfTWFwUHRyVG9QdHIgJmZvbnRNYXAsIElGWF9Gb250ICpwRm9udCk7DQorICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SCUZpbmRGb250KEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9EV09SRCBkd01hdGNoRmxhZ3MsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd1VTQiA9IDk5OSwgRlhfV0NIQVIgd1VuaWNvZGUgPSAwKTsNCisgICAgSUZYX0ZvbnQqCQkJCUdldEZvbnQoRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZELCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KK307DQorRlhfRFdPUkQgRlhfR2V0R2RpRm9udFN0eWxlcyhjb25zdCBMT0dGT05UVyAmbGYpOw0KKyNlbHNlDQorY2xhc3MgQ0ZYX0ZvbnREZXNjcmlwdG9yIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfRm9udERlc2NyaXB0b3IoKQ0KKyAgICAgICAgOiBtX3BGaWxlQWNjZXNzKE5VTEwpDQorICAgICAgICAsIG1fbkZhY2VJbmRleCgwKQ0KKyAgICAgICAgLCBtX2R3Rm9udFN0eWxlcygwKQ0KKyAgICB7DQorICAgICAgICBtX2R3VXNiWzBdID0gbV9kd1VzYlsxXSA9IG1fZHdVc2JbMl0gPSBtX2R3VXNiWzNdID0gMDsNCisgICAgICAgIG1fZHdDc2JbMF0gPSBtX2R3Q3NiWzFdID0gMDsNCisgICAgfQ0KKyAgICB+Q0ZYX0ZvbnREZXNjcmlwdG9yKCkNCisgICAgew0KKyAgICAgICAgaWYgKE5VTEwgIT0gbV9wRmlsZUFjY2Vzcykgew0KKyAgICAgICAgICAgIG1fcEZpbGVBY2Nlc3MtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBJRlhfRmlsZUFjY2VzcyoJCQltX3BGaWxlQWNjZXNzOw0KKyAgICBGWF9JTlQzMgkJCQltX25GYWNlSW5kZXg7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c0ZhY2VOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQltX3dzRmFtaWx5TmFtZXM7DQorICAgIEZYX0RXT1JECQkJCW1fZHdGb250U3R5bGVzOw0KKyAgICBGWF9EV09SRAkJCQltX2R3VXNiWzRdOw0KKyAgICBGWF9EV09SRAkJCQltX2R3Q3NiWzJdOw0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfRm9udERlc2NyaXB0b3IqPiBDRlhfRm9udERlc2NyaXB0b3JzOw0KK3N0cnVjdCBGWF9Gb250RGVzY3JpcHRvckluZm8gew0KK3B1YmxpYzoNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udDsNCisgICAgRlhfSU5UMzIgblBlbmFsdHk7DQorICAgIEZYX0JPT0wgb3BlcmF0b3IgPiAoY29uc3QgRlhfRm9udERlc2NyaXB0b3JJbmZvJiB4KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdGhpcy0+blBlbmFsdHkgPiB4Lm5QZW5hbHR5Ow0KKyAgICB9Ow0KKyAgICBGWF9CT09MIG9wZXJhdG9yIDwgKGNvbnN0IEZYX0ZvbnREZXNjcmlwdG9ySW5mbyYgeCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHRoaXMtPm5QZW5hbHR5IDwgeC5uUGVuYWx0eTsNCisgICAgfTsNCisgICAgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgRlhfRm9udERlc2NyaXB0b3JJbmZvJiB4KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gdGhpcy0+blBlbmFsdHkgPT0geC5uUGVuYWx0eTsNCisgICAgfTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRm9udERlc2NyaXB0b3JJbmZvPiBDRlhfRm9udERlc2NyaXB0b3JJbmZvczsNCitzdHJ1Y3QgRlhfSGFuZGxlUGFyZW50UGF0aCA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgRlhfSGFuZGxlUGFyZW50UGF0aCgpDQorICAgIHsNCisgICAgfQ0KKyAgICBGWF9IYW5kbGVQYXJlbnRQYXRoKGNvbnN0IEZYX0hhbmRsZVBhcmVudFBhdGgmIHgpDQorICAgIHsNCisgICAgICAgIHBGaWxlSGFuZGxlID0geC5wRmlsZUhhbmRsZTsNCisgICAgICAgIGJzUGFyZW50UGF0aCA9IHguYnNQYXJlbnRQYXRoOw0KKyAgICB9DQorICAgIHZvaWQqIHBGaWxlSGFuZGxlOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1BhcmVudFBhdGg7DQorfTsNCitjbGFzcyBDRlhfRm9udFNvdXJjZUVudW1fRmlsZSA6IHB1YmxpYyBJRlhfRm9udFNvdXJjZUVudW0sIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9Ow0KKyAgICB2aXJ0dWFsIEZYX1BPU0lUSU9OCQlHZXRTdGFydFBvc2l0aW9uKEZYX0xQVk9JRCBwVXNlckRhdGEgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRlhfRmlsZUFjY2VzcyoJR2V0TmV4dChGWF9QT1NJVElPTiYgcG9zLCBGWF9MUFZPSUQgcFVzZXJEYXRhID0gTlVMTCk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROZXh0RmlsZSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NOZXh0Ow0KKyAgICBDRlhfT2JqZWN0QXJyYXk8RlhfSGFuZGxlUGFyZW50UGF0aD4JbV9Gb2xkZXJRdWV1ZTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheQkJbV9Gb2xkZXJQYXRoczsNCit9Ow0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBJRlhfRmlsZUFjY2Vzcyo+IENGWF9IYXNoRmlsZU1hcDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgSUZYX0ZvbnQqPiBDRlhfSGFzaEZvbnRNYXA7DQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENGWF9Gb250RGVzY3JpcHRvckluZm9zKj4gQ0ZYX0hhc2hGb250RGVzY3NNYXA7DQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj4qID4gQ0ZYX0hhc2hGb250c01hcDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9XQ0hBUiwgSUZYX0ZvbnQqPiBDRlhfVW5pY29kZUZvbnRNYXA7DQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8SUZYX0ZpbGVBY2Nlc3MqLCBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiA+IENGWF9GaWxlRm9udE1hcDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxJRlhfRm9udCosIElGWF9GaWxlUmVhZCo+IENGWF9Gb25TdHJlYW10TWFwOw0KK2NsYXNzIENGWF9Gb250TWdySW1wIDogcHVibGljIElGWF9Gb250TWdyLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9Gb250TWdySW1wKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLCBJRlhfRm9udE1nckRlbGVnYXRlKiBwRGVsZWdhdGUgPSBOVUxMLCBGWF9MUFZPSUQgcFVzZXJEYXRhID0gTlVMTCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5Q2hhcnNldChGWF9CWVRFIG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9MUENXU1RSIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlDaGFyc2V0KEZYX0JZVEUgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX0xQQ1dTVFIgcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0Rm9udEJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfTFBDV1NUUiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyIGlGYWNlSW5kZXgsIEZYX0lOVDMyKiBwRmFjZUNvdW50KTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KEZYX0xQQ1dTVFIgcHN6RmlsZU5hbWUsIEZYX0lOVDMyIGlGYWNlSW5kZXgsIEZYX0lOVDMyKiBwRmFjZUNvdW50KTsNCisgICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLCBGWF9JTlQzMiBpRmFjZUluZGV4LCBGWF9JTlQzMiogcEZhY2VDb3VudCwgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKTsNCisgICAgdmlydHVhbCB2b2lkCQkJQ2xlYXJGb250Q2FjaGUoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpOw0KKyAgICBGWF9CT09MCQkJCQlFbnVtRm9udHMoKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJCVJlcG9ydEZhY2UoRlhGVF9GYWNlIHBGYWNlLCBDRlhfRm9udERlc2NyaXB0b3JzJiBGb250cywgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzKTsNCisgICAgdm9pZAkJCQkJR2V0TmFtZXMoRlhfTFBDQllURSBuYW1lX3RhYmxlLCBDRlhfV2lkZVN0cmluZ0FycmF5JiBOYW1lcyk7DQorICAgIHZvaWQJCQkJCUdldENoYXJzZXRzKEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX1dvcmRBcnJheSYgQ2hhcnNldHMpOw0KKyAgICB2b2lkCQkJCQlHZXRVU0JDU0IoRlhGVF9GYWNlIHBGYWNlLCBGWF9EV09SRCogVVNCLCBGWF9EV09SRCogQ1NCKTsNCisgICAgRlhfRFdPUkQJCQkJR2V0RmxhZ3MoRlhGVF9GYWNlIHBGYWNlKTsNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9ycwkJbV9JbnN0YWxsZWRGb250czsNCisgICAgRlhfQk9PTAkJCQkJVmVyaWZ5VW5pY29kZShDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjLCBGWF9XQ0hBUiB3Y1VuaWNvZGUpOw0KKyAgICBGWF9CT09MCQkJCQlWZXJpZnlVbmljb2RlKElGWF9Gb250KiBwRm9udCwgRlhfV0NIQVIgd2NVbmljb2RlKTsNCisgICAgdm9pZAkJCQkJTm9ybWFsaXplRm9udE5hbWUoIENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSApOw0KKyAgICBGWF9JTlQzMgkJCQlJc1BhcnROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBOYW1lMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUyKTsNCisgICAgRlhfSU5UMzIJCQkJTWF0Y2hGb250cyhDRlhfRm9udERlc2NyaXB0b3JJbmZvcyYgTWF0Y2hlZEZvbnRzLCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsIEZYX1dDSEFSIHdjVW5pY29kZSA9IDB4RkZGRSk7DQorICAgIEZYX0lOVDMyCQkJCUNhbGNQZW5hbHR5KENGWF9Gb250RGVzY3JpcHRvciogcEluc3RhbGxlZCwgRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIEZvbnROYW1lLCBGWF9XQ0hBUiB3Y1VuaWNvZGUgPSAweEZGRkUpOw0KKyAgICBJRlhfRm9udCoJCQkJTG9hZEZvbnQoSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzLCBGWF9JTlQzMiBpRmFjZUluZGV4LCBGWF9JTlQzMiogcEZhY2VDb3VudCwgRlhfQk9PTCBiV2FudENhY2hlID0gRkFMU0UpOw0KKyAgICBGWEZUX0ZhY2UJCQkJTG9hZEZhY2UoSUZYX0ZpbGVSZWFkKiBwRm9udFN0cmVhbSwgRlhfSU5UMzIgaUZhY2VJbmRleCk7DQorICAgIENGWF9IYXNoRm9udERlc2NzTWFwCW1fSGFzaDJDYW5kaWRhdGVMaXN0Ow0KKyAgICBDRlhfSGFzaEZvbnRzTWFwCQltX0hhc2gyRm9udHM7DQorICAgIENGWF9IYXNoRmlsZU1hcAkJCW1fSGFzaDJGaWxlQWNjZXNzOw0KKyAgICBDRlhfSGFzaEZvbnRNYXAJCQltX0ZpbGVBY2Nlc3MySUZYRm9udDsNCisgICAgQ0ZYX0ZvblN0cmVhbXRNYXAJCW1fSUZYRm9udDJGaWxlUmVhZDsNCisgICAgQ0ZYX1VuaWNvZGVGb250TWFwCQltX0ZhaWxlZFVuaWNvZGVzMk5VTEw7DQorICAgIElGWF9Gb250U291cmNlRW51bSoJCW1fcEZvbnRTb3VyY2U7DQorICAgIElGWF9Gb250TWdyRGVsZWdhdGUqCW1fcERlbGVnYXRlOw0KKyAgICBGWF9MUFZPSUQJCQkJbV9wVXNlckRhdGE7DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9saW5lYnJlYWsuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjYyZTFjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQorZXh0ZXJuIGNvbnN0IEZYX0RXT1JEIGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbNjU1MzZdOw0KK2V4dGVybiBjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXSA9IHsNCisgICAge0ZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCQ1AsIEZYX0xCUEIsCUZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KK307DQordm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoRlhfTFBDV1NUUiBwd3NUZXh0LCBGWF9MSU5FQlJFQUtUWVBFICpwQnJrVHlwZSwgRlhfSU5UMzIgaUxlbmd0aCkNCit7DQorICAgIGlmIChpTGVuZ3RoIDwgMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3Q3VyLCBkd05leHQ7DQorICAgIEZYX1dDSEFSIHdjaDsNCisgICAgd2NoID0gKnB3c1RleHQgKys7DQorICAgIGR3Q3VyID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgMHgwMDNGOw0KKyAgICBpTGVuZ3RoIC0tOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxlbmd0aDsgaSArKykgew0KKyAgICAgICAgd2NoID0gKnB3c1RleHQgKys7DQorICAgICAgICBkd05leHQgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiAweDAwM0Y7DQorICAgICAgICBpZiAoZHdOZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgICAgIHBCcmtUeXBlW2ldID0gRlhfTEJUX1BST0hJQklURURfQlJLOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwQnJrVHlwZVtpXSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUgKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsgKGR3Q3VyIDw8IDUpICsgZHdOZXh0KTsNCisgICAgICAgIH0NCisgICAgICAgIGR3Q3VyID0gZHdOZXh0Ow0KKyAgICB9DQorICAgIHBCcmtUeXBlW2lMZW5ndGhdID0gRlhfTEJUX0lORElSRUNUX0JSSzsNCit9DQordm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoRlhfTFBDV1NUUiBwd3NUZXh0LCBGWF9JTlQzMiBpTGVuZ3RoLCBDRlhfSW50MzJNYXNzQXJyYXkgJmJwKQ0KK3sNCisgICAgaWYgKGlMZW5ndGggPCAyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfTElORUJSRUFLVFlQRSBlVHlwZTsNCisgICAgRlhfRFdPUkQgZHdDdXIsIGR3TmV4dDsNCisgICAgRlhfV0NIQVIgd2NoOw0KKyAgICB3Y2ggPSAqcHdzVGV4dCArKzsNCisgICAgZHdDdXIgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiAweDAwM0Y7DQorICAgIGlMZW5ndGggLS07DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpICsrKSB7DQorICAgICAgICB3Y2ggPSAqcHdzVGV4dCArKzsNCisgICAgICAgIGR3TmV4dCA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIDB4MDAzRjsNCisgICAgICAgIGlmIChkd05leHQgPT0gRlhfQ0JQX1NQKSB7DQorICAgICAgICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSAqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKyAoZHdDdXIgPDwgNSkgKyBkd05leHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQorICAgICAgICAgICAgYnAuQWRkKGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZHdDdXIgPSBkd05leHQ7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzY0YzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5jcHAKQEAgLTAsMCArMSwxNTIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfdW5pY29kZS5oIg0KKyNpbmNsdWRlICJmeF9ydGZicmVhay5oIg0KK2V4dGVybiBjb25zdCBGWF9EV09SRCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWzY1NTM2XTsNCitleHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcls2NF07DQorZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcls1MTJdOw0KK2V4dGVybiBjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXTsNCitJRlhfUlRGQnJlYWsqIElGWF9SVEZCcmVhazo6Q3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGWF9SVEZCcmVhayhkd1BvbGljaWVzKTsNCit9DQorQ0ZYX1JURkJyZWFrOjpDRlhfUlRGQnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcykNCisgICAgOiBtX2R3UG9saWNpZXMoZHdQb2xpY2llcykNCisgICAgLCBtX3BBcmFiaWNDaGFyKE5VTEwpDQorICAgICwgbV9pTGluZVN0YXJ0KDApDQorICAgICwgbV9pTGluZUVuZCgyMDAwMDAwKQ0KKyAgICAsIG1fZHdMYXlvdXRTdHlsZXMoMCkNCisgICAgLCBtX2JQYWdpbmF0aW9uKEZBTFNFKQ0KKyAgICAsIG1fYlZlcnRpY2FsKEZBTFNFKQ0KKyAgICAsIG1fYlNpbmdsZUxpbmUoRkFMU0UpDQorICAgICwgbV9iQ2hhckNvZGUoRkFMU0UpDQorICAgICwgbV9wRm9udChOVUxMKQ0KKyAgICAsIG1faUZvbnRIZWlnaHQoMjQwKQ0KKyAgICAsIG1faUZvbnRTaXplKDI0MCkNCisgICAgLCBtX2lUYWJXaWR0aCg3MjAwMDApDQorICAgICwgbV9Qb3NpdGlvbmVkVGFicygpDQorICAgICwgbV9iT3JwaGFuTGluZShGQUxTRSkNCisgICAgLCBtX3dEZWZDaGFyKDB4RkVGRikNCisgICAgLCBtX2lEZWZDaGFyKDApDQorICAgICwgbV93TGluZUJyZWFrQ2hhcihMJ1xuJykNCisgICAgLCBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKQ0KKyAgICAsIG1faVZlcnRpY2FsU2NhbGUoMTAwKQ0KKyAgICAsIG1faUxpbmVSb3RhdGlvbigwKQ0KKyAgICAsIG1faUNoYXJSb3RhdGlvbigwKQ0KKyAgICAsIG1faVJvdGF0aW9uKDApDQorICAgICwgbV9pQ2hhclNwYWNlKDApDQorICAgICwgbV9iV29yZFNwYWNlKEZBTFNFKQ0KKyAgICAsIG1faVdvcmRTcGFjZSgwKQ0KKyAgICAsIG1fYlJUTChGQUxTRSkNCisgICAgLCBtX2lBbGlnbm1lbnQoRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KQ0KKyAgICAsIG1fcFVzZXJEYXRhKE5VTEwpDQorICAgICwgbV9kd0NoYXJUeXBlKDApDQorICAgICwgbV9kd0lkZW50aXR5KDApDQorICAgICwgbV9SVEZMaW5lMSgpDQorICAgICwgbV9SVEZMaW5lMigpDQorICAgICwgbV9wQ3VyTGluZShOVUxMKQ0KKyAgICAsIG1faVJlYWR5KDApDQorICAgICwgbV9pVG9sZXJhbmNlKDApDQorew0KKyAgICBtX3BBcmFiaWNDaGFyID0gSUZYX0FyYWJpY0NoYXI6OkNyZWF0ZSgpOw0KKyAgICBtX3BDdXJMaW5lID0gJm1fUlRGTGluZTE7DQorfQ0KK0NGWF9SVEZCcmVhazo6fkNGWF9SVEZCcmVhaygpDQorew0KKyAgICBSZXNldCgpOw0KKyAgICBtX1Bvc2l0aW9uZWRUYWJzLlJlbW92ZUFsbCgpOw0KKyAgICBtX3BBcmFiaWNDaGFyLT5SZWxlYXNlKCk7DQorICAgIGlmIChtX3BVc2VyRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICBtX3BVc2VyRGF0YS0+UmVsZWFzZSgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVTdGFydCwgRlhfRkxPQVQgZkxpbmVFbmQpDQorew0KKyAgICBtX2lMaW5lU3RhcnQgPSBGWFNZU19yb3VuZChmTGluZVN0YXJ0ICogMjAwMDAuMGYpOw0KKyAgICBtX2lMaW5lRW5kID0gRlhTWVNfcm91bmQoZkxpbmVFbmQgKiAyMDAwMC4wZik7DQorICAgIEZYU1lTX2Fzc2VydChtX2lMaW5lRW5kID49IG1faUxpbmVTdGFydCk7DQorICAgIGlmIChtX3BDdXJMaW5lLT5tX2lTdGFydCA8IG1faUxpbmVTdGFydCkgew0KKyAgICAgICAgbV9wQ3VyTGluZS0+bV9pU3RhcnQgPSBtX2lMaW5lU3RhcnQ7DQorICAgIH0NCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpDQorew0KKyAgICBGWF9JTlQzMiBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KKyAgICBpZiAoaUxpbmVQb3MgPiBtX2lMaW5lRW5kKSB7DQorICAgICAgICBpTGluZVBvcyA9IG1faUxpbmVFbmQ7DQorICAgIH0NCisgICAgbV9wQ3VyTGluZS0+bV9pU3RhcnQgPSBpTGluZVBvczsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykNCit7DQorICAgIGlmIChtX2R3TGF5b3V0U3R5bGVzID09IGR3TGF5b3V0U3R5bGVzKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgU2V0QnJlYWtTdGF0dXMoKTsNCisgICAgbV9kd0xheW91dFN0eWxlcyA9IGR3TGF5b3V0U3R5bGVzOw0KKyAgICBtX2JQYWdpbmF0aW9uID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9QYWdpbmF0aW9uKSAhPSAwOw0KKyAgICBtX2JWZXJ0aWNhbCA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycykgIT0gMDsNCisgICAgbV9iU2luZ2xlTGluZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsNCisgICAgbV9iQ2hhckNvZGUgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSAhPSAwOw0KKyAgICBtX2lMaW5lUm90YXRpb24gPSBHZXRMaW5lUm90YXRpb24obV9kd0xheW91dFN0eWxlcyk7DQorICAgIG1faVJvdGF0aW9uID0gbV9pTGluZVJvdGF0aW9uICsgbV9pQ2hhclJvdGF0aW9uOw0KKyAgICBtX2lSb3RhdGlvbiAlPSA0Ow0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0Rm9udChJRlhfRm9udCAqcEZvbnQpDQorew0KKyAgICBpZiAocEZvbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BGb250ID09IHBGb250KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgU2V0QnJlYWtTdGF0dXMoKTsNCisgICAgbV9wRm9udCA9IHBGb250Ow0KKyAgICBtX2lEZWZDaGFyID0gMDsNCisgICAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgbV9pRm9udEhlaWdodCA9IG1faUZvbnRTaXplOw0KKyAgICAgICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGKSB7DQorICAgICAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpDQorew0KKyAgICBGWF9JTlQzMiBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7DQorICAgIGlmIChtX2lGb250U2l6ZSA9PSBpRm9udFNpemUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBTZXRCcmVha1N0YXR1cygpOw0KKyAgICBtX2lGb250U2l6ZSA9IGlGb250U2l6ZTsNCisgICAgbV9pRGVmQ2hhciA9IDA7DQorICAgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCisgICAgICAgIG1faUZvbnRIZWlnaHQgPSBtX2lGb250U2l6ZTsNCisgICAgICAgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRikgew0KKyAgICAgICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgICAgICAgICAgbV9pRGVmQ2hhciAqPSBtX2lGb250U2l6ZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKQ0KK3sNCisgICAgbV9pVGFiV2lkdGggPSBGWFNZU19yb3VuZChmVGFiV2lkdGggKiAyMDAwMC4wZik7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpBZGRQb3NpdGlvbmVkVGFiKEZYX0ZMT0FUIGZUYWJQb3MpDQorew0KKyAgICBGWF9JTlQzMiBpTGluZUVuZCA9IG1faUxpbmVFbmQ7DQorICAgIEZYX0lOVDMyIGlUYWJQb3MgPSBGWFNZU19yb3VuZChmVGFiUG9zICogMjAwMDAuMGYpICsgbV9pTGluZVN0YXJ0Ow0KKyAgICBpZiAoaVRhYlBvcyA+IGlMaW5lRW5kKSB7DQorICAgICAgICBpVGFiUG9zID0gaUxpbmVFbmQ7DQorICAgIH0NCisgICAgaWYgKG1fUG9zaXRpb25lZFRhYnMuRmluZChpVGFiUG9zLCAwKSA+IC0xKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9Qb3NpdGlvbmVkVGFicy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGlGaW5kID0gMDsNCisgICAgZm9yICg7IGlGaW5kIDwgaUNvdW50OyBpRmluZCArKykgew0KKyAgICAgICAgaWYgKG1fUG9zaXRpb25lZFRhYnNbaUZpbmRdID4gaVRhYlBvcykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fUG9zaXRpb25lZFRhYnMuSW5zZXJ0QXQoaUZpbmQsIGlUYWJQb3MpOw0KKyAgICBpZiAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfT3JwaGFuUG9zaXRpb25lZFRhYikgew0KKyAgICAgICAgbV9iT3JwaGFuTGluZSA9IEdldExhc3RQb3NpdGlvbmVkVGFiKCkgPj0gaUxpbmVFbmQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2JPcnBoYW5MaW5lID0gRkFMU0U7DQorICAgIH0NCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFBvc2l0aW9uZWRUYWJzKGNvbnN0IENGWF9GbG9hdEFycmF5ICZ0YWJzKQ0KK3sNCisgICAgbV9Qb3NpdGlvbmVkVGFicy5SZW1vdmVBbGwoKTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gdGFicy5HZXRTaXplKCk7DQorICAgIG1fUG9zaXRpb25lZFRhYnMuU2V0U2l6ZShpQ291bnQpOw0KKyAgICBGWF9JTlQzMiBpTGluZUVuZCA9IG1faUxpbmVFbmQ7DQorICAgIEZYX0lOVDMyIGlUYWJQb3M7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIGlUYWJQb3MgPSBGWFNZU19yb3VuZCh0YWJzW2ldICogMjAwMDAuMGYpICsgbV9pTGluZVN0YXJ0Ow0KKyAgICAgICAgaWYgKGlUYWJQb3MgPiBpTGluZUVuZCkgew0KKyAgICAgICAgICAgIGlUYWJQb3MgPSBpTGluZUVuZDsNCisgICAgICAgIH0NCisgICAgICAgIG1fUG9zaXRpb25lZFRhYnNbaV0gPSBpVGFiUG9zOw0KKyAgICB9DQorICAgIGlmIChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9PcnBoYW5Qb3NpdGlvbmVkVGFiKSB7DQorICAgICAgICBtX2JPcnBoYW5MaW5lID0gR2V0TGFzdFBvc2l0aW9uZWRUYWIoKSA+PSBpTGluZUVuZDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fYk9ycGhhbkxpbmUgPSBGQUxTRTsNCisgICAgfQ0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6Q2xlYXJQb3NpdGlvbmVkVGFicygpDQorew0KKyAgICBtX1Bvc2l0aW9uZWRUYWJzLlJlbW92ZUFsbCgpOw0KKyAgICBtX2JPcnBoYW5MaW5lID0gRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpDQorew0KKyAgICBtX3dEZWZDaGFyID0gd2NoOw0KKyAgICBtX2lEZWZDaGFyID0gMDsNCisgICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGICYmIG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgICAgIGlmIChtX2lEZWZDaGFyIDwgMCkgew0KKyAgICAgICAgICAgIG1faURlZkNoYXIgPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkNCit7DQorICAgIGlmICh3Y2ggIT0gTCdccicgJiYgd2NoICE9IEwnXG4nKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV93TGluZUJyZWFrQ2hhciA9IHdjaDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKQ0KK3sNCisgICAgbV9pVG9sZXJhbmNlID0gRlhTWVNfcm91bmQoZlRvbGVyYW5jZSAqIDIwMDAwLjBmKTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldEhvcml6b250YWxTY2FsZShGWF9JTlQzMiBpU2NhbGUpDQorew0KKyAgICBpZiAoaVNjYWxlIDwgMCkgew0KKyAgICAgICAgaVNjYWxlID0gMDsNCisgICAgfQ0KKyAgICBpZiAobV9pSG9yaXpvbnRhbFNjYWxlID09IGlTY2FsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFNldEJyZWFrU3RhdHVzKCk7DQorICAgIG1faUhvcml6b250YWxTY2FsZSA9IGlTY2FsZTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoRlhfSU5UMzIgaVNjYWxlKQ0KK3sNCisgICAgaWYgKGlTY2FsZSA8IDApIHsNCisgICAgICAgIGlTY2FsZSA9IDA7DQorICAgIH0NCisgICAgaWYgKG1faVZlcnRpY2FsU2NhbGUgPT0gaVNjYWxlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgU2V0QnJlYWtTdGF0dXMoKTsNCisgICAgbV9pVmVydGljYWxTY2FsZSA9IGlTY2FsZTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldENoYXJSb3RhdGlvbihGWF9JTlQzMiBpQ2hhclJvdGF0aW9uKQ0KK3sNCisgICAgaWYgKGlDaGFyUm90YXRpb24gPCAwKSB7DQorICAgICAgICBpQ2hhclJvdGF0aW9uICs9ICgtaUNoYXJSb3RhdGlvbiAvIDQgKyAxKSAqIDQ7DQorICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA+IDMpIHsNCisgICAgICAgIGlDaGFyUm90YXRpb24gLT0gKGlDaGFyUm90YXRpb24gLyA0KSAqIDQ7DQorICAgIH0NCisgICAgaWYgKG1faUNoYXJSb3RhdGlvbiA9PSBpQ2hhclJvdGF0aW9uKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgU2V0QnJlYWtTdGF0dXMoKTsNCisgICAgbV9pQ2hhclJvdGF0aW9uID0gaUNoYXJSb3RhdGlvbjsNCisgICAgbV9pUm90YXRpb24gPSBtX2lMaW5lUm90YXRpb24gKyBtX2lDaGFyUm90YXRpb247DQorICAgIG1faVJvdGF0aW9uICU9IDQ7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkNCit7DQorICAgIG1faUNoYXJTcGFjZSA9IEZYU1lTX3JvdW5kKGZDaGFyU3BhY2UgKiAyMDAwMC4wZik7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRXb3JkU3BhY2UoRlhfQk9PTCBiRGVmYXVsdCwgRlhfRkxPQVQgZldvcmRTcGFjZSkNCit7DQorICAgIG1fYldvcmRTcGFjZSA9ICFiRGVmYXVsdDsNCisgICAgbV9pV29yZFNwYWNlID0gRlhTWVNfcm91bmQoZldvcmRTcGFjZSAqIDIwMDAwLjBmKTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFJlYWRpbmdPcmRlcihGWF9CT09MIGJSVEwpDQorew0KKyAgICBtX2JSVEwgPSBiUlRMOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0QWxpZ25tZW50KEZYX0lOVDMyIGlBbGlnbm1lbnQpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaUFsaWdubWVudCA+PSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQgJiYgaUFsaWdubWVudCA8PSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKTsNCisgICAgbV9pQWxpZ25tZW50ID0gaUFsaWdubWVudDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFVzZXJEYXRhKElGWF9Vbmtub3duICpwVXNlckRhdGEpDQorew0KKyAgICBpZiAobV9wVXNlckRhdGEgPT0gcFVzZXJEYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgU2V0QnJlYWtTdGF0dXMoKTsNCisgICAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFVzZXJEYXRhLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgbV9wVXNlckRhdGEgPSBwVXNlckRhdGE7DQorICAgIGlmIChtX3BVc2VyRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICBtX3BVc2VyRGF0YS0+QWRkUmVmKCk7DQorICAgIH0NCit9DQorc3RhdGljIGNvbnN0IEZYX0lOVDMyIGdzX0ZYX1JURkxpbmVSb3RhdGlvbnNbOF0gPSB7MCwgMywgMSwgMCwgMiwgMSwgMywgMn07DQorRlhfSU5UMzIgQ0ZYX1JURkJyZWFrOjpHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0DQorew0KKyAgICByZXR1cm4gZ3NfRlhfUlRGTGluZVJvdGF0aW9uc1soZHdTdHlsZXMgJiAweDBFKSA+PiAxXTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldEJyZWFrU3RhdHVzKCkNCit7DQorICAgIG1fZHdJZGVudGl0eSArKzsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9SVEZDaGFyICZ0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIoaUNvdW50IC0gMSk7DQorICAgIGlmICh0Yy5tX2R3U3RhdHVzID09IDApIHsNCisgICAgICAgIHRjLm1fZHdTdGF0dXMgPSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrOw0KKyAgICB9DQorfQ0KK0NGWF9SVEZDaGFyKiBDRlhfUlRGQnJlYWs6OkdldExhc3RDaGFyKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KK3sNCisgICAgQ0ZYX1JURkNoYXJBcnJheSAmdGNhID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHRjYS5HZXRTaXplKCk7DQorICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaUNvdW50KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfUlRGQ2hhciAqcFRDOw0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSBpQ291bnQgLSAxOw0KKyAgICB3aGlsZSAoaVN0YXJ0ID4gLTEpIHsNCisgICAgICAgIHBUQyA9IHRjYS5HZXREYXRhUHRyKGlTdGFydCAtLSk7DQorICAgICAgICBpZiAocFRDLT5tX2lDaGFyV2lkdGggPj0gMCB8fCBwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgICBpZiAoLS1pbmRleCA8IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBUQzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGWF9SVEZMaW5lKiBDRlhfUlRGQnJlYWs6OkdldFJURkxpbmUoRlhfQk9PTCBiUmVhZHkpIGNvbnN0DQorew0KKyAgICBpZiAoYlJlYWR5KSB7DQorICAgICAgICBpZiAobV9pUmVhZHkgPT0gMSkgew0KKyAgICAgICAgICAgIHJldHVybiAoQ0ZYX1JURkxpbmUqKSZtX1JURkxpbmUxOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX2lSZWFkeSA9PSAyKSB7DQorICAgICAgICAgICAgcmV0dXJuIChDRlhfUlRGTGluZSopJm1fUlRGTGluZTI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChtX3BDdXJMaW5lICE9IE5VTEwpOw0KKyAgICByZXR1cm4gbV9wQ3VyTGluZTsNCit9DQorQ0ZYX1JURlBpZWNlQXJyYXkqIENGWF9SVEZCcmVhazo6R2V0UlRGUGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdA0KK3sNCisgICAgQ0ZYX1JURkxpbmUgKnBSVEZMaW5lID0gR2V0UlRGTGluZShiUmVhZHkpOw0KKyAgICBpZiAocFJURkxpbmUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuICZwUlRGTGluZS0+bV9MaW5lUGllY2VzOw0KK30NCitpbmxpbmUgRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIGR3VHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID8gRlhfQ0hBUlRZUEVfQXJhYmljIDogZHdUeXBlOw0KK30NCitGWF9JTlQzMiBDRlhfUlRGQnJlYWs6OkdldExhc3RQb3NpdGlvbmVkVGFiKCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fUG9zaXRpb25lZFRhYnMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIG1faUxpbmVTdGFydDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9Qb3NpdGlvbmVkVGFic1tpQ291bnQgLSAxXTsNCit9DQorRlhfQk9PTCBDRlhfUlRGQnJlYWs6OkdldFBvc2l0aW9uZWRUYWIoRlhfSU5UMzIgJmlUYWJQb3MpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX1Bvc2l0aW9uZWRUYWJzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgaWYgKG1fUG9zaXRpb25lZFRhYnNbaV0gPiBpVGFiUG9zKSB7DQorICAgICAgICAgICAgaVRhYlBvcyA9IG1fUG9zaXRpb25lZFRhYnNbaV07DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit0eXBlZGVmIEZYX0RXT1JEIChDRlhfUlRGQnJlYWs6OipGWF9SVEZCcmVha19MUEZBcHBlbmRDaGFyKShDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbik7DQorc3RhdGljIGNvbnN0IEZYX1JURkJyZWFrX0xQRkFwcGVuZENoYXIgZ19GWF9SVEZCcmVha19scGZBcHBlbmRDaGFyWzE2XSA9IHsNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorfTsNCitGWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX3BDdXJMaW5lICE9IE5VTEwgJiYgbV9wQXJhYmljQ2hhciAhPSBOVUxMKTsNCisgICAgaWYgKG1fYkNoYXJDb2RlKSB7DQorICAgICAgICByZXR1cm4gQXBwZW5kQ2hhcl9DaGFyQ29kZSh3Y2gpOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07DQorICAgIEZYX0RXT1JEIGR3VHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICAgIENGWF9SVEZDaGFyQXJyYXkgJnRjYSA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgICBDRlhfUlRGQ2hhciAqcEN1ckNoYXIgPSB0Y2EuQWRkU3BhY2UoKTsNCisgICAgcEN1ckNoYXItPm1fZHdTdGF0dXMgPSAwOw0KKyAgICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSB3Y2g7DQorICAgIHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzID0gZHdQcm9wczsNCisgICAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gMDsNCisgICAgcEN1ckNoYXItPm1fZHdMYXlvdXRTdHlsZXMgPSAwOw0KKyAgICBwQ3VyQ2hhci0+bV9pRm9udFNpemUgPSBtX2lGb250U2l6ZTsNCisgICAgcEN1ckNoYXItPm1faUZvbnRIZWlnaHQgPSBtX2lGb250SGVpZ2h0Ow0KKyAgICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICBwQ3VyQ2hhci0+bV9pVmVydGlhbFNjYWxlID0gbV9pVmVydGljYWxTY2FsZTsNCisgICAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOw0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCisgICAgcEN1ckNoYXItPm1fZHdJZGVudGl0eSA9IG1fZHdJZGVudGl0eTsNCisgICAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFVzZXJEYXRhLT5BZGRSZWYoKTsNCisgICAgfQ0KKyAgICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgICAgRlhfRFdPUkQgZHdSZXQxID0gRlhfUlRGQlJFQUtfTm9uZTsNCisgICAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJiBHZXRVbmlmaWVkQ2hhclR5cGUobV9kd0NoYXJUeXBlKSAhPSBHZXRVbmlmaWVkQ2hhclR5cGUoZHdUeXBlKSkgew0KKyAgICAgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIG1fZHdDaGFyVHlwZSA+IDAgJiYgbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pTGluZUVuZCArIG1faVRvbGVyYW5jZSkgew0KKyAgICAgICAgICAgIGlmIChtX2R3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgZHdUeXBlICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgICAgICAgICAgZHdSZXQxID0gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICAgICAgICAgICAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEN1ckNoYXIgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFycy5HZXREYXRhUHRyKGlDb3VudCAtIDEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSb3RhdGlvbiA9IG1faVJvdGF0aW9uOw0KKyAgICBpZiAobV9iVmVydGljYWwgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgIGlSb3RhdGlvbiA9IChpUm90YXRpb24gKyAxKSAlIDQ7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdSZXQyID0gKHRoaXMtPipnX0ZYX1JURkJyZWFrX2xwZkFwcGVuZENoYXJbZHdUeXBlID4+IEZYX0NIQVJUWVBFQklUU10pKHBDdXJDaGFyLCBpUm90YXRpb24pOw0KKyAgICBtX2R3Q2hhclR5cGUgPSBkd1R5cGU7DQorICAgIHJldHVybiBGWF9NQVgoZHdSZXQxLCBkd1JldDIpOw0KK30NCitGWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQ2hhckNvZGUoRlhfV0NIQVIgd2NoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX3BDdXJMaW5lICE9IE5VTEwpOw0KKyAgICBGWFNZU19hc3NlcnQobV9iQ2hhckNvZGUpOw0KKyAgICBtX3BDdXJMaW5lLT5tX2lNQkNTQ2hhcnMgKys7DQorICAgIENGWF9SVEZDaGFyQXJyYXkgJnRjYSA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgICBDRlhfUlRGQ2hhciAqcEN1ckNoYXIgPSB0Y2EuQWRkU3BhY2UoKTsNCisgICAgcEN1ckNoYXItPm1fZHdTdGF0dXMgPSAwOw0KKyAgICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSB3Y2g7DQorICAgIHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzID0gMDsNCisgICAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gMDsNCisgICAgcEN1ckNoYXItPm1fZHdMYXlvdXRTdHlsZXMgPSBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgICBwQ3VyQ2hhci0+bV9pRm9udFNpemUgPSBtX2lGb250U2l6ZTsNCisgICAgcEN1ckNoYXItPm1faUZvbnRIZWlnaHQgPSBtX2lGb250SGVpZ2h0Ow0KKyAgICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICBwQ3VyQ2hhci0+bV9pVmVydGlhbFNjYWxlID0gbV9pVmVydGljYWxTY2FsZTsNCisgICAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOw0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCisgICAgcEN1ckNoYXItPm1fZHdJZGVudGl0eSA9IG1fZHdJZGVudGl0eTsNCisgICAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgICAgIG1fcFVzZXJEYXRhLT5BZGRSZWYoKTsNCisgICAgfQ0KKyAgICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCA9IDA7DQorICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChtX2lSb3RhdGlvbikpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod2NoLCBpQ2hhcldpZHRoLCBUUlVFKSkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOw0KKyAgICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsNCisgICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgIG1fcEN1ckxpbmUtPm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgIG1fZHdDaGFyVHlwZSA9IDA7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCA9IDA7DQorICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKSB7DQorICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQorICAgIENGWF9SVEZDaGFyICpwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigwKTsNCisgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMICYmIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA+IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2R3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsNCisgICAgfQ0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KK30NCitGWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKQ0KK3sNCisgICAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWIpIHsNCisgICAgICAgIEZYX0JPT0wgYkJyZWFrID0gRkFMU0U7DQorICAgICAgICBpZiAoKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1RhYkJyZWFrKSAhPSAwKSB7DQorICAgICAgICAgICAgYkJyZWFrID0gKG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUxpbmVFbmQgKyBtX2lUb2xlcmFuY2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCisgICAgICAgIEZYX0lOVDMyIGlDaGFyV2lkdGggPSBpTGluZVdpZHRoOw0KKyAgICAgICAgaWYgKEdldFBvc2l0aW9uZWRUYWIoaUNoYXJXaWR0aCkpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoIC09IGlMaW5lV2lkdGg7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lUYWJXaWR0aCAqIChpTGluZVdpZHRoIC8gbV9pVGFiV2lkdGggKyAxKSAtIGlMaW5lV2lkdGg7DQorICAgICAgICB9DQorICAgICAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJiBiQnJlYWspIHsNCisgICAgICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX1JURkNoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pDQorew0KKyAgICBGWF9EV09SRCBkd1JldDIgPSBGWF9SVEZCUkVBS19Ob25lOw0KKyAgICBpZiAoIW1fYlNpbmdsZUxpbmUpIHsNCisgICAgICAgIHN3aXRjaCAocEN1ckNoYXItPm1fd0NoYXJDb2RlKSB7DQorICAgICAgICAgICAgY2FzZSBMJ1x2JzoNCisgICAgICAgICAgICBjYXNlIDB4MjAyODoNCisgICAgICAgICAgICAgICAgZHdSZXQyID0gRlhfUlRGQlJFQUtfTGluZUJyZWFrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEwnXGYnOg0KKyAgICAgICAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYWdlQnJlYWs7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMHgyMDI5Og0KKyAgICAgICAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhazsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgaWYgKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSA9PSBtX3dMaW5lQnJlYWtDaGFyKSB7DQorICAgICAgICAgICAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd1JldDIgIT0gRlhfUlRGQlJFQUtfTm9uZSkgew0KKyAgICAgICAgICAgIGR3UmV0MiA9IEVuZEJyZWFrKGR3UmV0Mik7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGR3UmV0MjsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYyhDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbikNCit7DQorICAgIENGWF9SVEZDaGFyICpwTGFzdENoYXIgPSBOVUxMOw0KKyAgICBGWF9JTlQzMiAmaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICBGWF9JTlQzMiBpQ2hhcldpZHRoID0gMDsNCisgICAgRlhfV0NIQVIgd0Zvcm07DQorICAgIEZYX0JPT0wgYkFsZWYgPSBGQUxTRTsNCisgICAgaWYgKG1fZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIG1fZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7DQorICAgICAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxKTsNCisgICAgICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlMaW5lV2lkdGggLT0gcExhc3RDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgICAgQ0ZYX1JURkNoYXIgKnBQcmV2Q2hhciA9IEdldExhc3RDaGFyKDIpOw0KKyAgICAgICAgICAgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIocExhc3RDaGFyLCBwUHJldkNoYXIsIHBDdXJDaGFyKTsNCisgICAgICAgICAgICBiQWxlZiA9ICh3Rm9ybSA9PSAweEZFRkYgJiYgcExhc3RDaGFyLT5HZXRDaGFyVHlwZSgpID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMYXN0Um90YXRpb24gPSBwTGFzdENoYXItPm1fblJvdGF0aW9uICsgbV9pTGluZVJvdGF0aW9uOw0KKyAgICAgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAmJiAocExhc3RDaGFyLT5tX2R3Q2hhclByb3BzICYgMHg4MDAwKSAhPSAwKSB7DQorICAgICAgICAgICAgICAgIGlMYXN0Um90YXRpb24gKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpTGFzdFJvdGF0aW9uKSkgew0KKyAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgocExhc3RDaGFyLT5tX3dDaGFyQ29kZSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgICAgICAgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQorICAgICAgICAgICAgcExhc3RDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHBDdXJDaGFyLCAoYkFsZWYgPyBOVUxMIDogcExhc3RDaGFyKSwgTlVMTCk7DQorICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpDQorICAgICAgICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgocEN1ckNoYXItPm1fd0NoYXJDb2RlLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpIHsNCisgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOw0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICBtX3BDdXJMaW5lLT5tX2lBcmFiaWNDaGFycyArKzsNCisgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUxpbmVFbmQgKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgICAgIHJldHVybiBFbmRCcmVhayhGWF9SVEZCUkVBS19MaW5lQnJlYWspOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KK30NCitGWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdUeXBlID0gKHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICAgIEZYX1dDSEFSIHdGb3JtOw0KKyAgICBpZiAoZHdUeXBlID09IEZYX0NIQVJUWVBFX051bWVyaWMpIHsNCisgICAgICAgIGlmIChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfQXJhYmljTnVtYmVyKSB7DQorICAgICAgICAgICAgd0Zvcm0gPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgKyAweDA2MzA7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdGb3JtID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fYlJUTCB8fCBtX2JWZXJ0aWNhbCkgew0KKyAgICAgICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSwgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMsIG1fYlJUTCwgbV9iVmVydGljYWwpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgd0Zvcm0gPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCA9IDA7DQorICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCisgICAgaUNoYXJXaWR0aCArPSBtX2lDaGFyU3BhY2U7DQorICAgIGlmIChkd1R5cGUgPT0gRlhfQ0hBUlRZUEVfU3BhY2UgJiYgbV9iV29yZFNwYWNlKSB7DQorICAgICAgICBpQ2hhcldpZHRoICs9IG1faVdvcmRTcGFjZTsNCisgICAgfQ0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgRlhfQk9PTCBiQnJlYWsgPSAoZHdUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKTsNCisgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIGJCcmVhayAmJiBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cykNCit7DQorICAgIEZYU1lTX2Fzc2VydChkd1N0YXR1cyA+PSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrICYmIGR3U3RhdHVzIDw9IEZYX1JURkJSRUFLX1BhZ2VCcmVhayk7DQorICAgIG1fZHdJZGVudGl0eSArKzsNCisgICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICBDRlhfUlRGUGllY2UgKnBMYXN0UGllY2UgPSBwQ3VyUGllY2VzLT5HZXRQdHJBdCgtLSBpQ291bnQpOw0KKyAgICAgICAgaWYgKGR3U3RhdHVzID4gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1JURkxpbmUgKnBMYXN0TGluZSA9IEdldFJURkxpbmUoVFJVRSk7DQorICAgICAgICBpZiAocExhc3RMaW5lICE9IE5VTEwpIHsNCisgICAgICAgICAgICBwQ3VyUGllY2VzID0gJnBMYXN0TGluZS0+bV9MaW5lUGllY2VzOw0KKyAgICAgICAgICAgIGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCisgICAgICAgICAgICBpZiAoaUNvdW50IC0tID4gMCkgew0KKyAgICAgICAgICAgICAgICBDRlhfUlRGUGllY2UgKnBMYXN0UGllY2UgPSBwQ3VyUGllY2VzLT5HZXRQdHJBdChpQ291bnQpOw0KKyAgICAgICAgICAgICAgICBpZiAoZHdTdGF0dXMgPiBGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICAgICAgICAgICAgICBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IHBMYXN0UGllY2UtPm1fZHdTdGF0dXM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCisgICAgICAgIH0NCisgICAgICAgIGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgICAgICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUlRGQ2hhciAmdGMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyKGlDb3VudCAtIDEpOw0KKyAgICAgICAgdGMubV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICAgICAgaWYgKGR3U3RhdHVzIDw9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgICAgICByZXR1cm4gZHdTdGF0dXM7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9pUmVhZHkgPSAobV9wQ3VyTGluZSA9PSAmbV9SVEZMaW5lMSkgPyAxIDogMjsNCisgICAgQ0ZYX1JURkxpbmUgKnBOZXh0TGluZSA9IChtX3BDdXJMaW5lID09ICZtX1JURkxpbmUxKSA/ICZtX1JURkxpbmUyIDogJm1fUlRGTGluZTE7DQorICAgIEZYX0JPT0wgYkFsbENoYXJzID0gKG1faUFsaWdubWVudCA+IEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQpOw0KKyAgICBDRlhfVFBPQXJyYXkgdHBvczsNCisgICAgaWYgKEVuZEJyZWFrX1NwbGl0TGluZShwTmV4dExpbmUsIGJBbGxDaGFycywgZHdTdGF0dXMpKSB7DQorICAgICAgICBnb3RvIEVuZEJyZWFrX1JldDsNCisgICAgfQ0KKyAgICBpZiAoIW1fYkNoYXJDb2RlKSB7DQorICAgICAgICBFbmRCcmVha19CaWRpTGluZSh0cG9zLCBkd1N0YXR1cyk7DQorICAgIH0NCisgICAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1faUFsaWdubWVudCA+IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICAgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOw0KKyAgICB9DQorRW5kQnJlYWtfUmV0Og0KKyAgICBtX3BDdXJMaW5lID0gcE5leHRMaW5lOw0KKyAgICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IG1faUxpbmVTdGFydDsNCisgICAgQ0ZYX1JURkNoYXIgKnBUQyA9IEdldExhc3RDaGFyKDApOw0KKyAgICBtX2R3Q2hhclR5cGUgPSBwVEMgPT0gTlVMTCA/IDAgOiBwVEMtPkdldENoYXJUeXBlKCk7DQorICAgIHJldHVybiBkd1N0YXR1czsNCit9DQorRlhfQk9PTCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX1NwbGl0TGluZShDRlhfUlRGTGluZSAqcE5leHRMaW5lLCBGWF9CT09MIGJBbGxDaGFycywgRlhfRFdPUkQgZHdTdGF0dXMpDQorew0KKyAgICBGWF9CT09MIGJEb25lID0gRkFMU0U7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJiBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgICBDRlhfUlRGQ2hhciAmdGMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyKG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKSAtIDEpOw0KKyAgICAgICAgc3dpdGNoICh0Yy5HZXRDaGFyVHlwZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGWF9DSEFSVFlQRV9UYWI6DQorICAgICAgICAgICAgICAgIGlmICgobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfVGFiQnJlYWspICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KKyAgICAgICAgICAgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfQ29udHJvbDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWF9DSEFSVFlQRV9TcGFjZToNCisgICAgICAgICAgICAgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgIW1fYlBhZ2luYXRpb24gJiYgYkFsbENoYXJzKTsNCisgICAgICAgICAgICAgICAgICAgIGJEb25lID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgIW1fYlBhZ2luYXRpb24gJiYgYkFsbENoYXJzKTsNCisgICAgICAgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9iUGFnaW5hdGlvbiB8fCBtX3BDdXJMaW5lLT5tX2lNQkNTQ2hhcnMgPiAwKSB7DQorICAgICAgICBjb25zdCBDRlhfUlRGQ2hhciAqcEN1ckNoYXJzID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMuR2V0RGF0YSgpOw0KKyAgICAgICAgY29uc3QgQ0ZYX1JURkNoYXIgKnBUQzsNCisgICAgICAgIENGWF9SVEZQaWVjZUFycmF5ICpwQ3VyUGllY2VzID0gJm1fcEN1ckxpbmUtPm1fTGluZVBpZWNlczsNCisgICAgICAgIENGWF9SVEZQaWVjZSB0cDsNCisgICAgICAgIHRwLm1fcENoYXJzID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgICAgICAgRlhfQk9PTCBiTmV3ID0gVFJVRTsNCisgICAgICAgIEZYX0RXT1JEIGR3SWRlbnRpdHkgPSAoRlhfRFdPUkQpIC0gMTsNCisgICAgICAgIEZYX0lOVDMyIGlMYXN0ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpIC0gMSwgaiA9IDA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDw9IGlMYXN0Oykgew0KKyAgICAgICAgICAgIHBUQyA9IHBDdXJDaGFycyArIGk7DQorICAgICAgICAgICAgaWYgKGJOZXcpIHsNCisgICAgICAgICAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsNCisgICAgICAgICAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQorICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoID0gMDsNCisgICAgICAgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgdHAubV9pRm9udFNpemUgPSBwVEMtPm1faUZvbnRTaXplOw0KKyAgICAgICAgICAgICAgICB0cC5tX2lGb250SGVpZ2h0ID0gcFRDLT5tX2lGb250SGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsNCisgICAgICAgICAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgICAgICAgICAgICB0cC5tX2R3TGF5b3V0U3R5bGVzID0gcFRDLT5tX2R3TGF5b3V0U3R5bGVzOw0KKyAgICAgICAgICAgICAgICBkd0lkZW50aXR5ID0gcFRDLT5tX2R3SWRlbnRpdHk7DQorICAgICAgICAgICAgICAgIHRwLm1fZHdJZGVudGl0eSA9IGR3SWRlbnRpdHk7DQorICAgICAgICAgICAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsNCisgICAgICAgICAgICAgICAgaiA9IGk7DQorICAgICAgICAgICAgICAgIGJOZXcgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGkgPT0gaUxhc3QgfHwgcFRDLT5tX2R3U3RhdHVzICE9IEZYX1JURkJSRUFLX05vbmUgfHwgcFRDLT5tX2R3SWRlbnRpdHkgIT0gZHdJZGVudGl0eSkgew0KKyAgICAgICAgICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSBqOw0KKyAgICAgICAgICAgICAgICBpZiAocFRDLT5tX2R3SWRlbnRpdHkgPT0gZHdJZGVudGl0eSkgew0KKyAgICAgICAgICAgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgdHAubV9pQ2hhcnMgKz0gMTsNCisgICAgICAgICAgICAgICAgICAgIGkgKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgICAgICAgICAgYk5ldyA9IFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgdHAubV9pV2lkdGggKz0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgIGkgKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsNCisgICAgICAgIEZYX0lOVDMyIGlFbmRQb3MgPSBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCk7DQorICAgICAgICBHZXRCcmVha1BvcyhtX3BDdXJMaW5lLT5tX0xpbmVDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBUUlVFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkgJnRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKQ0KK3sNCisgICAgRlhfVFBPIHRwbzsNCisgICAgQ0ZYX1JURlBpZWNlIHRwOw0KKyAgICBDRlhfUlRGQ2hhciAqcFRDOw0KKyAgICBGWF9JTlQzMiBpLCBqOw0KKyAgICBDRlhfUlRGQ2hhckFycmF5ICZjaGFycyA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgIEZYX0JPT0wgYkRvbmUgPSAoIW1fYlBhZ2luYXRpb24gJiYgIW1fYkNoYXJDb2RlICYmIChtX3BDdXJMaW5lLT5tX2lBcmFiaWNDaGFycyA+IDAgfHwgbV9iUlRMKSk7DQorICAgIGlmIChiRG9uZSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUJpZGlOdW0gPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgICAgICAgcFRDLT5tX2lCaWRpUG9zID0gaTsNCisgICAgICAgICAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgICAgICAgICAgaUJpZGlOdW0gPSBpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9CaWRpTGluZShjaGFycywgaUJpZGlOdW0gKyAxLCBtX2JSVEwgPyAxIDogMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsNCisgICAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IDA7DQorICAgICAgICAgICAgcFRDLT5tX2lCaWRpUG9zID0gMDsNCisgICAgICAgICAgICBwVEMtPm1faUJpZGlPcmRlciA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgdHAubV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQorICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIHRwLm1fcENoYXJzID0gJmNoYXJzOw0KKyAgICBDRlhfUlRGUGllY2VBcnJheSAqcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7DQorICAgIEZYX0lOVDMyIGlCaWRpTGV2ZWwgPSAtMSwgaUNoYXJXaWR0aDsNCisgICAgRlhfRFdPUkQgZHdJZGVudGl0eSA9IChGWF9EV09SRCkgLSAxOw0KKyAgICBpID0gaiA9IDA7DQorICAgIHdoaWxlIChpIDwgaUNvdW50KSB7DQorICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOw0KKyAgICAgICAgaWYgKGlCaWRpTGV2ZWwgPCAwKSB7DQorICAgICAgICAgICAgaUJpZGlMZXZlbCA9IHBUQy0+bV9pQmlkaUxldmVsOw0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA8IDEpIHsNCisgICAgICAgICAgICAgICAgdHAubV9pV2lkdGggPSAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdHAubV9pQmlkaUxldmVsID0gaUJpZGlMZXZlbDsNCisgICAgICAgICAgICB0cC5tX2lCaWRpUG9zID0gcFRDLT5tX2lCaWRpT3JkZXI7DQorICAgICAgICAgICAgdHAubV9pRm9udFNpemUgPSBwVEMtPm1faUZvbnRTaXplOw0KKyAgICAgICAgICAgIHRwLm1faUZvbnRIZWlnaHQgPSBwVEMtPm1faUZvbnRIZWlnaHQ7DQorICAgICAgICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgICAgICAgIGR3SWRlbnRpdHkgPSBwVEMtPm1fZHdJZGVudGl0eTsNCisgICAgICAgICAgICB0cC5tX2R3SWRlbnRpdHkgPSBkd0lkZW50aXR5Ow0KKyAgICAgICAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsNCisgICAgICAgICAgICB0cC5tX2R3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgICAgICAgICBpICsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChpQmlkaUxldmVsICE9IHBUQy0+bV9pQmlkaUxldmVsIHx8IHBUQy0+bV9kd0lkZW50aXR5ICE9IGR3SWRlbnRpdHkpIHsNCisgICAgICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7DQorICAgICAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgICAgICB0cC5tX2lTdGFydFBvcyArPSB0cC5tX2lXaWR0aDsNCisgICAgICAgICAgICB0cC5tX2lTdGFydENoYXIgPSBpOw0KKyAgICAgICAgICAgIHRwby5pbmRleCA9IGogKys7DQorICAgICAgICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7DQorICAgICAgICAgICAgdHBvcy5BZGQodHBvKTsNCisgICAgICAgICAgICBpQmlkaUxldmVsID0gLTE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgdHAubV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaSArKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaSA+IHRwLm1faVN0YXJ0Q2hhcikgew0KKyAgICAgICAgdHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KKyAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgIHRwby5pbmRleCA9IGo7DQorICAgICAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsNCisgICAgICAgIHRwb3MuQWRkKHRwbyk7DQorICAgIH0NCisgICAgaWYgKCFtX2JDaGFyQ29kZSkgew0KKyAgICAgICAgaiA9IHRwb3MuR2V0U2l6ZSgpIC0gMTsNCisgICAgICAgIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KHRwb3MsIDAsIGopOw0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7IGkgKyspIHsNCisgICAgICAgICAgICB0cG8gPSB0cG9zLkdldEF0KGkpOw0KKyAgICAgICAgICAgIENGWF9SVEZQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCisgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnRQb3M7DQorICAgICAgICAgICAgaVN0YXJ0UG9zICs9IHR0cC5tX2lXaWR0aDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSAmdHBvcywgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKQ0KK3sNCisgICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KKyAgICBGWF9JTlQzMiBpTmV0V2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aCwgaUdhcENoYXJzID0gMCwgaUNoYXJXaWR0aDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOw0KKyAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQorICAgIEZYX0RXT1JEIGR3Q2hhclR5cGU7DQorICAgIEZYX0lOVDMyIGksIGo7DQorICAgIEZYX1RQTyB0cG87DQorICAgIGZvciAoaSA9IGlDb3VudCAtIDE7IGkgPiAtMTsgaSAtLSkgew0KKyAgICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICAgIENGWF9SVEZQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCisgICAgICAgIGlmICghYkZpbmQpIHsNCisgICAgICAgICAgICBpTmV0V2lkdGggPSB0dHAuR2V0RW5kUG9zKCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJBcmFiaWMgPSBGWF9Jc09kZCh0dHAubV9pQmlkaUxldmVsKTsNCisgICAgICAgIGogPSBiQXJhYmljID8gMCA6IHR0cC5tX2lDaGFycyAtIDE7DQorICAgICAgICB3aGlsZSAoaiA+IC0xICYmIGogPCB0dHAubV9pQ2hhcnMpIHsNCisgICAgICAgICAgICBjb25zdCBDRlhfUlRGQ2hhciAmdGMgPSB0dHAuR2V0Q2hhcihqKTsNCisgICAgICAgICAgICBpZiAodGMubV9uQnJlYWtUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQorICAgICAgICAgICAgICAgIGlHYXBDaGFycyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFiRmluZCB8fCAhYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgICAgIGR3Q2hhclR5cGUgPSB0Yy5HZXRDaGFyVHlwZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSB8fCBkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghYkZpbmQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gdGMubV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiQWxsQ2hhcnMgJiYgaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU5ldFdpZHRoIC09IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJBbGxDaGFycyAmJiBiRmluZCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlPZmZzZXQgPSBtX2lMaW5lRW5kIC0gaU5ldFdpZHRoOw0KKyAgICBGWF9JTlQzMiBpTG93ZXJBbGlnbm1lbnQgPSAobV9pQWxpZ25tZW50ICYgRlhfUlRGTElORUFMSUdOTUVOVF9Mb3dlck1hc2spOw0KKyAgICBGWF9JTlQzMiBpSGlnaGVyQWxpZ25tZW50ID0gKG1faUFsaWdubWVudCAmIEZYX1JURkxJTkVBTElHTk1FTlRfSGlnaGVyTWFzayk7DQorICAgIGlmIChpR2FwQ2hhcnMgPiAwICYmIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgfHwgKGlIaWdoZXJBbGlnbm1lbnQgPT0gRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgJiYgZHdTdGF0dXMgIT0gRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWspKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gLTE7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICAgICAgICBDRlhfUlRGUGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgICAgICAgaWYgKGlTdGFydCA8IDApIHsNCisgICAgICAgICAgICAgICAgaVN0YXJ0ID0gdHRwLm1faVN0YXJ0UG9zOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfSU5UMzIgazsNCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdHRwLm1faUNoYXJzOyBqICsrKSB7DQorICAgICAgICAgICAgICAgIENGWF9SVEZDaGFyICZ0YyA9IHR0cC5HZXRDaGFyKGopOw0KKyAgICAgICAgICAgICAgICBpZiAodGMubV9uQnJlYWtUeXBlICE9IEZYX0xCVF9ESVJFQ1RfQlJLIHx8IHRjLm1faUNoYXJXaWR0aCA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGsgPSBpT2Zmc2V0IC8gaUdhcENoYXJzOw0KKyAgICAgICAgICAgICAgICB0Yy5tX2lDaGFyV2lkdGggKz0gazsNCisgICAgICAgICAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7DQorICAgICAgICAgICAgICAgIGlPZmZzZXQgLT0gazsNCisgICAgICAgICAgICAgICAgaUdhcENoYXJzIC0tOw0KKyAgICAgICAgICAgICAgICBpZiAoaUdhcENoYXJzIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaVN0YXJ0ICs9IHR0cC5tX2lXaWR0aDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChpTG93ZXJBbGlnbm1lbnQgPiBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQpIHsNCisgICAgICAgIGlmIChpTG93ZXJBbGlnbm1lbnQgPT0gRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIpIHsNCisgICAgICAgICAgICBpT2Zmc2V0IC89IDI7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaU9mZnNldCA+IDApIHsNCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgICAgIENGWF9SVEZQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQoaSk7DQorICAgICAgICAgICAgICAgIHR0cC5tX2lTdGFydFBvcyArPSBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRlhfUlRGQnJlYWs6OkdldEJyZWFrUG9zKENGWF9SVEZDaGFyQXJyYXkgJnRjYSwgRlhfSU5UMzIgJmlFbmRQb3MsIEZYX0JPT0wgYkFsbENoYXJzLCBGWF9CT09MIGJPbmx5QnJrKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHRjYS5HZXRTaXplKCkgLSAxOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlCcmVhayA9IC0xLCBpQnJlYWtQb3MgPSAtMSwgaUluZGlyZWN0ID0gLTEsIGlJbmRpcmVjdFBvcyA9IC0xLCBpTGFzdCA9IC0xLCBpTGFzdFBvcyA9IC0xOw0KKyAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBtX2JPcnBoYW5MaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZUVuZCkgew0KKyAgICAgICAgaWYgKCFiQWxsQ2hhcnMgfHwgbV9iQ2hhckNvZGUpIHsNCisgICAgICAgICAgICByZXR1cm4gaUxlbmd0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlCcmVhayA9IGlMZW5ndGg7DQorICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOw0KKyAgICB9DQorICAgIENGWF9SVEZDaGFyICpwQ2hhckFycmF5ID0gdGNhLkdldERhdGEoKTsNCisgICAgaWYgKG1fYkNoYXJDb2RlKSB7DQorICAgICAgICBjb25zdCBDRlhfUlRGQ2hhciAqcENoYXI7DQorICAgICAgICBGWF9JTlQzMiBpQ2hhcldpZHRoOw0KKyAgICAgICAgd2hpbGUgKGlMZW5ndGggPiAwKSB7DQorICAgICAgICAgICAgaWYgKGlFbmRQb3MgPD0gbV9pTGluZUVuZCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcENoYXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aC0tOw0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwQ2hhci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGlMZW5ndGg7DQorICAgIH0NCisgICAgRlhfQk9PTCBiU3BhY2VCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwOw0KKyAgICBGWF9CT09MIGJUYWJCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9UYWJCcmVhaykgIT0gMDsNCisgICAgRlhfQk9PTCBiTnVtYmVyQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWspICE9IDA7DQorICAgIEZYX0JPT0wgYkluZml4QnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfSW5maXhCcmVhaykgIT0gMDsNCisgICAgRlhfTElORUJSRUFLVFlQRSBlVHlwZTsNCisgICAgRlhfRFdPUkQgbkNvZGVQcm9wLCBuQ3VyLCBuTmV4dDsNCisgICAgQ0ZYX1JURkNoYXIgKnBDdXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aC0tOw0KKyAgICBpZiAoYkFsbENoYXJzKSB7DQorICAgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCisgICAgfQ0KKyAgICBuQ29kZVByb3AgPSBwQ3VyLT5tX2R3Q2hhclByb3BzOw0KKyAgICBuTmV4dCA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCisgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsNCisgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICAgIH0NCisgICAgd2hpbGUgKGlMZW5ndGggPj0gMCkgew0KKyAgICAgICAgcEN1ciA9IHBDaGFyQXJyYXkgKyBpTGVuZ3RoOw0KKyAgICAgICAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsNCisgICAgICAgIG5DdXIgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgICAgICBGWF9CT09MIGJOZWVkQnJlYWsgPSBGQUxTRTsNCisgICAgICAgIGlmIChuQ3VyID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgICAgIGJOZWVkQnJlYWsgPSAhYlNwYWNlQnJlYWs7DQorICAgICAgICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgICAgICAgICBlVHlwZSA9IGJTcGFjZUJyZWFrID8gRlhfTEJUX0RJUkVDVF9CUksgOiBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFICopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAobkN1ciA9PSBGWF9DQlBfVEIpIHsNCisgICAgICAgICAgICBiTmVlZEJyZWFrID0gIWJUYWJCcmVhazsNCisgICAgICAgICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1RCKSB7DQorICAgICAgICAgICAgICAgIGVUeXBlID0gYlRhYkJyZWFrID8gRlhfTEJUX0RJUkVDVF9CUksgOiBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFICopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoYk51bWJlckJyZWFrICYmIG5DdXIgPT0gRlhfQ0JQX05VICYmIG5OZXh0ID09IEZYX0NCUF9OVSkgew0KKyAgICAgICAgICAgIGVUeXBlID0gRlhfTEJUX0RJUkVDVF9CUks7DQorICAgICAgICB9IGVsc2UgaWYgKGJJbmZpeEJyZWFrICYmIG5DdXIgPT0gRlhfQ0JQX0lTICYmIG5OZXh0ID09IEZYX0NCUF9JUykgew0KKyAgICAgICAgICAgIGVUeXBlID0gRlhfTEJUX0RJUkVDVF9CUks7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfU1ApIHsNCisgICAgICAgICAgICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFICopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChiQWxsQ2hhcnMpIHsNCisgICAgICAgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBlVHlwZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghYk9ubHlCcmspIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYkJyZWFrID0gRkFMU0U7DQorICAgICAgICAgICAgaWYgKG5DdXIgPT0gRlhfQ0JQX1RCICYmIGJUYWJCcmVhaykgew0KKyAgICAgICAgICAgICAgICBiQnJlYWsgPSBpQ2hhcldpZHRoID4gMCAmJiBpRW5kUG9zIC0gaUNoYXJXaWR0aCA8PSBtX2lMaW5lRW5kOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJCcmVhayA9IGlFbmRQb3MgPD0gbV9pTGluZUVuZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fYlNpbmdsZUxpbmUgfHwgbV9iT3JwaGFuTGluZSB8fCBiQnJlYWsgfHwgYk5lZWRCcmVhaykgew0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRlhfTEJUX0RJUkVDVF9CUksgJiYgaUJyZWFrIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWJBbGxDaGFycykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZYX0xCVF9JTkRJUkVDVF9CUksgJiYgaUluZGlyZWN0IDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaUluZGlyZWN0ID0gaUxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgIGlJbmRpcmVjdFBvcyA9IGlFbmRQb3M7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGlMYXN0IDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaUxhc3QgPSBpTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgICAgICBpTGVuZ3RoIC0tOw0KKyAgICB9DQorICAgIGlmIChiT25seUJyaykgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKGlCcmVhayA+IC0xKSB7DQorICAgICAgICBpRW5kUG9zID0gaUJyZWFrUG9zOw0KKyAgICAgICAgcmV0dXJuIGlCcmVhazsNCisgICAgfQ0KKyAgICBpZiAoaUluZGlyZWN0ID4gLTEpIHsNCisgICAgICAgIGlFbmRQb3MgPSBpSW5kaXJlY3RQb3M7DQorICAgICAgICByZXR1cm4gaUluZGlyZWN0Ow0KKyAgICB9DQorICAgIGlmIChpTGFzdCA+IC0xKSB7DQorICAgICAgICBpRW5kUG9zID0gaUxhc3RQb3M7DQorICAgICAgICByZXR1cm4gaUxhc3Q7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTcGxpdFRleHRMaW5lKENGWF9SVEZMaW5lICpwQ3VyTGluZSwgQ0ZYX1JURkxpbmUgKnBOZXh0TGluZSwgRlhfQk9PTCBiQWxsQ2hhcnMpDQorew0KKyAgICBGWFNZU19hc3NlcnQocEN1ckxpbmUgIT0gTlVMTCAmJiBwTmV4dExpbmUgIT0gTlVMTCk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgIGlmIChpQ291bnQgPCAyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUVuZFBvcyA9IHBDdXJMaW5lLT5HZXRMaW5lRW5kKCk7DQorICAgIENGWF9SVEZDaGFyQXJyYXkgJmN1ckNoYXJzID0gcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgICBGWF9JTlQzMiBpQ2hhclBvcyA9IEdldEJyZWFrUG9zKGN1ckNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIEZBTFNFKTsNCisgICAgaWYgKGlDaGFyUG9zIDwgMCkgew0KKyAgICAgICAgaUNoYXJQb3MgPSAwOw0KKyAgICB9DQorICAgIGlDaGFyUG9zICsrOw0KKyAgICBpZiAoaUNoYXJQb3MgPj0gaUNvdW50KSB7DQorICAgICAgICBwTmV4dExpbmUtPlJlbW92ZUFsbChUUlVFKTsNCisgICAgICAgIENGWF9DaGFyICpwVEMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQorICAgICAgICBwVEMtPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9SVEZDaGFyQXJyYXkgJm5leHRDaGFycyA9IHBOZXh0TGluZS0+bV9MaW5lQ2hhcnM7DQorICAgIGludCBjdXJfc2l6ZSA9IGN1ckNoYXJzLkdldFNpemUoKTsNCisgICAgbmV4dENoYXJzLlNldFNpemUoY3VyX3NpemUgLSBpQ2hhclBvcyk7DQorICAgIEZYU1lTX21lbWNweShuZXh0Q2hhcnMuR2V0RGF0YSgpLCBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zKSwgKGN1cl9zaXplIC0gaUNoYXJQb3MpICogc2l6ZW9mKENGWF9SVEZDaGFyKSk7DQorICAgIGlDb3VudCAtPSBpQ2hhclBvczsNCisgICAgY3VyX3NpemUgPSBjdXJDaGFycy5HZXRTaXplKCk7DQorICAgIGN1ckNoYXJzLlJlbW92ZUF0KGN1cl9zaXplIC0gaUNvdW50LCBpQ291bnQpOw0KKyAgICBwTmV4dExpbmUtPm1faVN0YXJ0ID0gcEN1ckxpbmUtPm1faVN0YXJ0Ow0KKyAgICBwTmV4dExpbmUtPm1faVdpZHRoID0gcEN1ckxpbmUtPkdldExpbmVFbmQoKSAtIGlFbmRQb3M7DQorICAgIHBDdXJMaW5lLT5tX2lXaWR0aCA9IGlFbmRQb3M7DQorICAgIENGWF9SVEZDaGFyKiB0YyA9IGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MgLSAxKTsNCisgICAgdGMtPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KKyAgICBpQ291bnQgPSBuZXh0Q2hhcnMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfUlRGQ2hhciAqcE5leHRDaGFycyA9IG5leHRDaGFycy5HZXREYXRhKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGWF9SVEZDaGFyKiB0YyA9IHBOZXh0Q2hhcnMgKyBpOw0KKyAgICAgICAgaWYgKHRjLT5HZXRDaGFyVHlwZSgpID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCisgICAgICAgICAgICBwQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgLS07DQorICAgICAgICAgICAgcE5leHRMaW5lLT5tX2lBcmFiaWNDaGFycyArKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh0Yy0+bV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSB7DQorICAgICAgICAgICAgcEN1ckxpbmUtPm1faU1CQ1NDaGFycyAtLTsNCisgICAgICAgICAgICBwTmV4dExpbmUtPm1faU1CQ1NDaGFycyArKzsNCisgICAgICAgIH0NCisgICAgICAgIHRjLT5tX2R3U3RhdHVzID0gMDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRlhfUlRGQnJlYWs6OkNvdW50QnJlYWtQaWVjZXMoKSBjb25zdA0KK3sNCisgICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBSVEZQaWVjZXMgPSBHZXRSVEZQaWVjZXMoVFJVRSk7DQorICAgIGlmIChwUlRGUGllY2VzID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiBwUlRGUGllY2VzLT5HZXRTaXplKCk7DQorfQ0KK2NvbnN0IENGWF9SVEZQaWVjZSogQ0ZYX1JURkJyZWFrOjpHZXRCcmVha1BpZWNlKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KK3sNCisgICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBSVEZQaWVjZXMgPSBHZXRSVEZQaWVjZXMoVFJVRSk7DQorICAgIGlmIChwUlRGUGllY2VzID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcFJURlBpZWNlcy0+R2V0U2l6ZSgpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcFJURlBpZWNlcy0+R2V0UHRyQXQoaW5kZXgpOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6R2V0TGluZVJlY3QoQ0ZYX1JlY3RGICZyZWN0KSBjb25zdA0KK3sNCisgICAgcmVjdC50b3AgPSAwOw0KKyAgICBDRlhfUlRGTGluZSAqcFJURkxpbmUgPSBHZXRSVEZMaW5lKFRSVUUpOw0KKyAgICBpZiAocFJURkxpbmUgPT0gTlVMTCkgew0KKyAgICAgICAgcmVjdC5sZWZ0ID0gKChGWF9GTE9BVCltX2lMaW5lU3RhcnQpIC8gMjAwMDAuMGY7DQorICAgICAgICByZWN0LndpZHRoID0gcmVjdC5oZWlnaHQgPSAwOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHJlY3QubGVmdCA9ICgoRlhfRkxPQVQpcFJURkxpbmUtPm1faVN0YXJ0KSAvIDIwMDAwLjBmOw0KKyAgICByZWN0LndpZHRoID0gKChGWF9GTE9BVClwUlRGTGluZS0+bV9pV2lkdGgpIC8gMjAwMDAuMGY7DQorICAgIENGWF9SVEZQaWVjZUFycmF5ICZydGZQaWVjZXMgPSBwUlRGTGluZS0+bV9MaW5lUGllY2VzOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBydGZQaWVjZXMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmVjdC53aWR0aCA9IDA7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1JURlBpZWNlICpwQnJlYWtQaWVjZTsNCisgICAgRlhfSU5UMzIgaUxpbmVIZWlnaHQgPSAwLCBpTWF4Ow0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBwQnJlYWtQaWVjZSA9IHJ0ZlBpZWNlcy5HZXRQdHJBdChpKTsNCisgICAgICAgIEZYX0lOVDMyIGlGb250SGVpZ2h0ID0gRlhTWVNfcm91bmQocEJyZWFrUGllY2UtPm1faUZvbnRIZWlnaHQgKiBwQnJlYWtQaWVjZS0+bV9pVmVydGljYWxTY2FsZSAvIDEwMC4wZik7DQorICAgICAgICBpTWF4ID0gRlhfTUFYKHBCcmVha1BpZWNlLT5tX2lGb250U2l6ZSwgaUZvbnRIZWlnaHQpOw0KKyAgICAgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgICAgICAgIGlMaW5lSGVpZ2h0ID0gaU1heDsNCisgICAgICAgIH0gZWxzZSBpZiAoaUxpbmVIZWlnaHQgPCBpTWF4KSB7DQorICAgICAgICAgICAgaUxpbmVIZWlnaHQgPSBpTWF4Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJlY3QuaGVpZ2h0ID0gKChGWF9GTE9BVClpTGluZUhlaWdodCkgLyAyMC4wZjsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OkNsZWFyQnJlYWtQaWVjZXMoKQ0KK3sNCisgICAgQ0ZYX1JURkxpbmUgKnBSVEZMaW5lID0gR2V0UlRGTGluZShUUlVFKTsNCisgICAgaWYgKHBSVEZMaW5lICE9IE5VTEwpIHsNCisgICAgICAgIHBSVEZMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQorICAgIH0NCisgICAgbV9pUmVhZHkgPSAwOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6UmVzZXQoKQ0KK3sNCisgICAgbV9kd0NoYXJUeXBlID0gMDsNCisgICAgbV9SVEZMaW5lMS5SZW1vdmVBbGwoVFJVRSk7DQorICAgIG1fUlRGTGluZTIuUmVtb3ZlQWxsKFRSVUUpOw0KK30NCitGWF9JTlQzMiBDRlhfUlRGQnJlYWs6OkdldERpc3BsYXlQb3MoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSAsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyAsIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgKSBjb25zdA0KK3sNCisgICAgaWYgKHBUZXh0ID09IE5VTEwgfHwgcFRleHQtPmlMZW5ndGggPCAxKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocFRleHQtPnBTdHIgIT0gTlVMTCAmJiBwVGV4dC0+cFdpZHRocyAhPSBOVUxMICYmIHBUZXh0LT5wRm9udCAhPSBOVUxMICYmIHBUZXh0LT5wUmVjdCAhPSBOVUxMKTsNCisgICAgRlhfTFBDV1NUUiBwU3RyID0gcFRleHQtPnBTdHI7DQorICAgIEZYX0lOVDMyICpwV2lkdGhzID0gcFRleHQtPnBXaWR0aHM7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwVGV4dC0+aUxlbmd0aCAtIDE7DQorICAgIElGWF9Gb250ICpwRm9udCA9IHBUZXh0LT5wRm9udDsNCisgICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwVGV4dC0+ZHdMYXlvdXRTdHlsZXM7DQorICAgIENGWF9SZWN0RiBydFRleHQoKnBUZXh0LT5wUmVjdCk7DQorICAgIEZYX0JPT0wgYlJUTFBpZWNlID0gRlhfSXNPZGQocFRleHQtPmlCaWRpTGV2ZWwpOw0KKyAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVGV4dC0+ZkZvbnRTaXplOw0KKyAgICBGWF9JTlQzMiBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7DQorICAgIEZYX0lOVDMyIGlBc2NlbnQgPSBwRm9udC0+R2V0QXNjZW50KCk7DQorICAgIEZYX0lOVDMyIGlEZXNjZW50ID0gcEZvbnQtPkdldERlc2NlbnQoKTsNCisgICAgRlhfSU5UMzIgaU1heEhlaWdodCA9IGlBc2NlbnQgLSBpRGVzY2VudDsNCisgICAgRlhfRkxPQVQgZkZvbnRIZWlnaHQgPSBmRm9udFNpemU7DQorICAgIEZYX0ZMT0FUIGZBc2NlbnQgPSBmRm9udEhlaWdodCAqIChGWF9GTE9BVClpQXNjZW50IC8gKEZYX0ZMT0FUKWlNYXhIZWlnaHQ7DQorICAgIEZYX0ZMT0FUIGZEZXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaURlc2NlbnQgLyAoRlhfRkxPQVQpaU1heEhlaWdodDsNCisgICAgRlhfQk9PTCBiVmVydGljYWxEb2MgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCisgICAgRlhfQk9PTCBiVmVydGljYWxDaGFyID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycykgIT0gMDsNCisgICAgRlhfQk9PTCBiQXJhYmljTnVtYmVyID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KKyAgICBGWF9CT09MIGJNQkNTQ29kZSA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSAhPSAwOw0KKyAgICBGWF9JTlQzMiBpUm90YXRpb24gPSBHZXRMaW5lUm90YXRpb24oZHdTdHlsZXMpICsgcFRleHQtPmlDaGFyUm90YXRpb247DQorICAgIEZYX0lOVDMyIGlDaGFyUm90YXRpb247DQorICAgIEZYX1dDSEFSIHdjaCwgd1ByZXYgPSAweEZFRkYsIHdOZXh0LCB3Rm9ybTsNCisgICAgRlhfSU5UMzIgaVdpZHRoLCBpQ2hhcldpZHRoLCBpQ2hhckhlaWdodDsNCisgICAgRlhfRkxPQVQgZlgsIGZZLCBmQ2hhcldpZHRoLCBmQ2hhckhlaWdodDsNCisgICAgRlhfSU5UMzIgaUhvclNjYWxlID0gcFRleHQtPmlIb3Jpem9udGFsU2NhbGU7DQorICAgIEZYX0lOVDMyIGlWZXJTY2FsZSA9IHBUZXh0LT5pVmVydGljYWxTY2FsZTsNCisgICAgRlhfQk9PTCBiRW1wdHlDaGFyOw0KKyAgICBGWF9EV09SRCBkd1Byb3BzLCBkd0NoYXJUeXBlOw0KKyAgICBmWCA9IHJ0VGV4dC5sZWZ0Ow0KKyAgICBmWSA9IHJ0VGV4dC50b3A7DQorICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgIGZYICs9IChydFRleHQud2lkdGggLSBmRm9udFNpemUpIC8gMi4wZjsNCisgICAgICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICAgICAgICBmWSA9IHJ0VGV4dC5ib3R0b20oKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICAgICAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZlkgKz0gZkFzY2VudDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDw9IGlMZW5ndGg7IGkgKyspIHsNCisgICAgICAgIHdjaCA9ICpwU3RyICsrOw0KKyAgICAgICAgaVdpZHRoID0gKnBXaWR0aHMgKys7DQorICAgICAgICBpZiAoIWJNQkNTQ29kZSkgew0KKyAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOw0KKyAgICAgICAgICAgIGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgICAgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgaVdpZHRoID09IDApIHsNCisgICAgICAgICAgICAgICAgd1ByZXYgPSAweEZFRkY7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZHdQcm9wcyA9IDA7DQorICAgICAgICAgICAgZHdDaGFyVHlwZSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaVdpZHRoICE9IDApIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gaVdpZHRoOw0KKyAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoIDwgMCkgew0KKyAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYk1CQ1NDb2RlKSB7DQorICAgICAgICAgICAgICAgIGJFbXB0eUNoYXIgPSAoZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9UYWIgJiYgZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9Db250cm9sKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBiRW1wdHlDaGFyID0gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgICAgICAgICBpQ291bnQgKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggLz0gaUZvbnRTaXplOw0KKyAgICAgICAgICAgICAgICB3Rm9ybSA9IHdjaDsNCisgICAgICAgICAgICAgICAgaWYgKCFiTUJDU0NvZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChkd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpwV2lkdGhzIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcFN0clsxXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHdjaCwgd1ByZXYsIHdOZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYlJUTFBpZWNlIHx8IGJWZXJ0aWNhbENoYXIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBiUlRMUGllY2UsIGJWZXJ0aWNhbENoYXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX051bWVyaWMgJiYgYkFyYWJpY051bWJlcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gd2NoICsgMHgwNjMwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdGb3JtKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpQ2hhclJvdGF0aW9uID0gaVJvdGF0aW9uOw0KKyAgICAgICAgICAgICAgICBpZiAoIWJNQkNTQ29kZSAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHg4MDAwKSAhPSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpQ2hhclJvdGF0aW9uICsrOw0KKyAgICAgICAgICAgICAgICAgICAgaUNoYXJSb3RhdGlvbiAlPSA0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJDaGFyQ29kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSB3Y2g7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Rm9ybSwgYk1CQ1NDb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID09IDB4RkZGRikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID0gcEZvbnQtPkdldEdseXBoSW5kZXgod2NoLCBiTUJDU0NvZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7DQorICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9Gb250Q2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwV1NGb3Jtcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICpwV1NGb3JtcyArPSB3Rm9ybTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQorICAgICAgICAgICAgICAgICAgICBpQ2hhckhlaWdodCA9IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlDaGFySGVpZ2h0ID0gMTAwMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmQ2hhcldpZHRoID0gZkZvbnRTaXplICogaUNoYXJXaWR0aCAvIDEwMDAuMGY7DQorICAgICAgICAgICAgICAgIGZDaGFySGVpZ2h0ID0gZkZvbnRTaXplICogaUNoYXJIZWlnaHQgLyAxMDAwLjBmOw0KKyAgICAgICAgICAgICAgICBpZiAoIWJNQkNTQ29kZSAmJiBiUlRMUGllY2UgJiYgZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZZIC09IGZDaGFySGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmWCAtPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdE9mZnNldDsNCisgICAgICAgICAgICAgICAgICAgIHB0T2Zmc2V0LlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGp1c3RlZCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGp1c3RQb3MpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiQWRqdXN0ZWQgPSBwQWRqdXN0UG9zKHdGb3JtLCBiTUJDU0NvZGUsIHBGb250LCBmRm9udFNpemUsIGJWZXJ0aWNhbENoYXIsIHB0T2Zmc2V0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmICghcEFkanVzdFBvcyAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHgwMDAxMDAwMCkgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCisgICAgICAgICAgICAgICAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIGJNQkNTQ29kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg4NTAgLSBydEJCb3gucmlnaHQoKSkgLyAxMDAwLjBmOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKDEwMDAgLSBydEJCb3guaGVpZ2h0KSAvIDIwMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCA9IGZYICsgcHRPZmZzZXQueDsNCisgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgPSBmWSAtIHB0T2Zmc2V0Lnk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFiUlRMUGllY2UgJiYgZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZZICs9IGZDaGFySGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNoYXJSb3RhdGlvbiA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YIC09IGZEZXNjZW50ICsgZkFzY2VudCAqIGlWZXJTY2FsZSAvIDEwMC4wZiAtIGZBc2NlbnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkFzY2VudDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50ICogaVZlclNjYWxlIC8gMTAwLjBmIC0gZkFzY2VudDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAtMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggLT0gZkRlc2NlbnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudCArIGZEZXNjZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlIb3JTY2FsZSAhPSAxMDAgfHwgaVZlclNjYWxlICE9IDEwMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSAqIGlWZXJTY2FsZSAvIDEwMC4wZjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlXaWR0aCA+IDApIHsNCisgICAgICAgICAgICB3UHJldiA9IHdjaDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gaUNvdW50Ow0KK30NCitGWF9JTlQzMiBDRlhfUlRGQnJlYWs6OkdldENoYXJSZWN0cyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSwgRlhfQk9PTCBiQ2hhckJCb3ggKSBjb25zdA0KK3sNCisgICAgaWYgKHBUZXh0ID09IE5VTEwgfHwgcFRleHQtPmlMZW5ndGggPCAxKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocFRleHQtPnBTdHIgIT0gTlVMTCAmJiBwVGV4dC0+cFdpZHRocyAhPSBOVUxMICYmIHBUZXh0LT5wRm9udCAhPSBOVUxMICYmIHBUZXh0LT5wUmVjdCAhPSBOVUxMKTsNCisgICAgRlhfTFBDV1NUUiBwU3RyID0gcFRleHQtPnBTdHI7DQorICAgIEZYX0lOVDMyICpwV2lkdGhzID0gcFRleHQtPnBXaWR0aHM7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwVGV4dC0+aUxlbmd0aDsNCisgICAgQ0ZYX1JlY3RGIHJlY3QoKnBUZXh0LT5wUmVjdCk7DQorICAgIEZYX0JPT0wgYlJUTFBpZWNlID0gRlhfSXNPZGQocFRleHQtPmlCaWRpTGV2ZWwpOw0KKyAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVGV4dC0+ZkZvbnRTaXplOw0KKyAgICBGWF9JTlQzMiBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7DQorICAgIEZYX0ZMT0FUIGZTY2FsZSA9IGZGb250U2l6ZSAvIDEwMDAuMGY7DQorICAgIElGWF9Gb250ICpwRm9udCA9IHBUZXh0LT5wRm9udDsNCisgICAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgICAgIGJDaGFyQkJveCA9IEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9SZWN0IGJib3g7DQorICAgIGJib3guU2V0KDAsIDAsIDAsIDApOw0KKyAgICBpZiAoYkNoYXJCQm94KSB7DQorICAgICAgICBiQ2hhckJCb3ggPSBwRm9udC0+R2V0QkJveChiYm94KTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmTGVmdCA9IEZYX01BWCgwLCBiYm94LmxlZnQgKiBmU2NhbGUpOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gRlhTWVNfZmFicyhiYm94LmhlaWdodCAqIGZTY2FsZSk7DQorICAgIHJ0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICAgIHJ0QXJyYXkuU2V0U2l6ZShpTGVuZ3RoKTsNCisgICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwVGV4dC0+ZHdMYXlvdXRTdHlsZXM7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpICE9IDA7DQorICAgIEZYX0JPT0wgYk1CQ1NDb2RlID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfTUJDU0NvZGUpICE9IDA7DQorICAgIEZYX0JPT0wgYlNpbmdsZUxpbmUgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9TaW5nbGVMaW5lKSAhPSAwOw0KKyAgICBGWF9CT09MIGJDb21iVGV4dCA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwOw0KKyAgICBGWF9XQ0hBUiB3Y2gsIHdMaW5lQnJlYWtDaGFyID0gcFRleHQtPndMaW5lQnJlYWtDaGFyOw0KKyAgICBGWF9JTlQzMiBpQ2hhclNpemU7DQorICAgIEZYX0ZMT0FUIGZDaGFyU2l6ZSwgZlN0YXJ0Ow0KKyAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LmJvdHRvbSgpIDogcmVjdC50b3A7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmxlZnQ7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlMZW5ndGg7IGkgKyspIHsNCisgICAgICAgIHdjaCA9ICpwU3RyICsrOw0KKyAgICAgICAgaUNoYXJTaXplID0gKnBXaWR0aHMgKys7DQorICAgICAgICBmQ2hhclNpemUgPSAoRlhfRkxPQVQpaUNoYXJTaXplIC8gMjAwMDAuMGY7DQorICAgICAgICBGWF9CT09MIGJSZXQgPSAoIWJTaW5nbGVMaW5lICYmIEZYX0lzQ3RybENvZGUod2NoKSk7DQorICAgICAgICBpZiAoISh3Y2ggPT0gTCdcdicgfHwgd2NoID09IEwnXGYnIHx8IHdjaCA9PSAweDIwMjggfHwgd2NoID09IDB4MjAyOSB8fCAod0xpbmVCcmVha0NoYXIgIT0gMHhGRUZGICYmIHdjaCA9PSB3TGluZUJyZWFrQ2hhcikpKSB7DQorICAgICAgICAgICAgYlJldCA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgICBpQ2hhclNpemUgPSBpRm9udFNpemUgKiA1MDA7DQorICAgICAgICAgICAgZkNoYXJTaXplID0gZkZvbnRTaXplIC8gMi4wZjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgICAgICByZWN0LnRvcCA9IGZTdGFydDsNCisgICAgICAgICAgICBpZiAoYlJUTFBpZWNlKSB7DQorICAgICAgICAgICAgICAgIHJlY3QudG9wIC09IGZDaGFyU2l6ZTsNCisgICAgICAgICAgICAgICAgZlN0YXJ0IC09IGZDaGFyU2l6ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBmU3RhcnQgKz0gZkNoYXJTaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZWN0LmhlaWdodCA9IGZDaGFyU2l6ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmVjdC5sZWZ0ID0gZlN0YXJ0Ow0KKyAgICAgICAgICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICAgICAgICAgICAgcmVjdC5sZWZ0IC09IGZDaGFyU2l6ZTsNCisgICAgICAgICAgICAgICAgZlN0YXJ0IC09IGZDaGFyU2l6ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBmU3RhcnQgKz0gZkNoYXJTaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZWN0LndpZHRoID0gZkNoYXJTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJDaGFyQkJveCAmJiAhYlJldCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgICAgICAgIHBGb250LT5HZXRDaGFyV2lkdGgod2NoLCBpQ2hhcldpZHRoKTsNCisgICAgICAgICAgICBGWF9GTE9BVCBmUlRMZWZ0ID0gMCwgZkNoYXJXaWR0aCA9IDA7DQorICAgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICAgICAgICAgIGZDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogZlNjYWxlOw0KKyAgICAgICAgICAgICAgICBmUlRMZWZ0ID0gZkxlZnQ7DQorICAgICAgICAgICAgICAgIGlmIChiQ29tYlRleHQpIHsNCisgICAgICAgICAgICAgICAgICAgIGZSVExlZnQgPSAocmVjdC53aWR0aCAtIGZDaGFyV2lkdGgpIC8gMi4wZjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRCQm94RjsNCisgICAgICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYudG9wID0gcmVjdC5sZWZ0ICsgZlJUTGVmdDsNCisgICAgICAgICAgICAgICAgcnRCQm94Ri5sZWZ0ID0gcmVjdC50b3AgKyAocmVjdC5oZWlnaHQgLSBmSGVpZ2h0KSAvIDIuMGY7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYuaGVpZ2h0ID0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZIZWlnaHQ7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYubGVmdCA9IEZYX01BWChydEJCb3hGLmxlZnQsIDApOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QubGVmdCArIGZSVExlZnQ7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYudG9wID0gcmVjdC50b3AgKyAocmVjdC5oZWlnaHQgLSBmSGVpZ2h0KSAvIDIuMGY7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYud2lkdGggPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZIZWlnaHQ7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYudG9wID0gRlhfTUFYKHJ0QkJveEYudG9wLCAwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcnRBcnJheS5TZXRBdChpLCBydEJCb3hGKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJ0QXJyYXkuU2V0QXQoaSwgcmVjdCk7DQorICAgIH0NCisgICAgcmV0dXJuIGlMZW5ndGg7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3J0ZmJyZWFrLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWYxZWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1JURkJSRUFLX0lNUA0KKyNkZWZpbmUgX0ZYX1JURkJSRUFLX0lNUA0KK2NsYXNzIENGWF9SVEZMaW5lOw0KK2NsYXNzIENGWF9SVEZCcmVhazsNCitjbGFzcyBDRlhfUlRGTGluZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX1JURkxpbmUoKSA6IG1fTGluZVBpZWNlcygxNikNCisgICAgICAgICwgbV9pU3RhcnQoMCkNCisgICAgICAgICwgbV9pV2lkdGgoMCkNCisgICAgICAgICwgbV9pQXJhYmljQ2hhcnMoMCkNCisgICAgICAgICwgbV9pTUJDU0NoYXJzKDApDQorICAgIHsNCisgICAgfQ0KKyAgICB+Q0ZYX1JURkxpbmUoKQ0KKyAgICB7DQorICAgICAgICBSZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBDb3VudENoYXJzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTGluZUNoYXJzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBDRlhfUlRGQ2hhciYgR2V0Q2hhcihGWF9JTlQzMiBpbmRleCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVDaGFycy5HZXRTaXplKCkpOw0KKyAgICAgICAgcmV0dXJuICptX0xpbmVDaGFycy5HZXREYXRhUHRyKGluZGV4KTsNCisgICAgfQ0KKyAgICBDRlhfUlRGQ2hhciogR2V0Q2hhclB0cihGWF9JTlQzMiBpbmRleCkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVDaGFycy5HZXRTaXplKCkpOw0KKyAgICAgICAgcmV0dXJuIG1fTGluZUNoYXJzLkdldERhdGFQdHIoaW5kZXgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIENvdW50UGllY2VzKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTGluZVBpZWNlcy5HZXRTaXplKCk7DQorICAgIH0NCisgICAgQ0ZYX1JURlBpZWNlJiBHZXRQaWVjZShGWF9JTlQzMiBpbmRleCkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVQaWVjZXMuR2V0U2l6ZSgpKTsNCisgICAgICAgIHJldHVybiBtX0xpbmVQaWVjZXMuR2V0QXQoaW5kZXgpOw0KKyAgICB9DQorICAgIENGWF9SVEZQaWVjZSogR2V0UGllY2VQdHIoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9MaW5lUGllY2VzLkdldFNpemUoKSk7DQorICAgICAgICByZXR1cm4gbV9MaW5lUGllY2VzLkdldFB0ckF0KGluZGV4KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBHZXRMaW5lRW5kKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faVN0YXJ0ICsgbV9pV2lkdGg7DQorICAgIH0NCisgICAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCisgICAgew0KKyAgICAgICAgQ0ZYX1JURkNoYXIgKnBDaGFyOw0KKyAgICAgICAgSUZYX1Vua25vd24gKnBVbmtub3duOw0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9MaW5lQ2hhcnMuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgIHBDaGFyID0gbV9MaW5lQ2hhcnMuR2V0RGF0YVB0cihpKTsNCisgICAgICAgICAgICBpZiAoKHBVbmtub3duID0gcENoYXItPm1fcFVzZXJEYXRhKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBVbmtub3duLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9MaW5lQ2hhcnMuUmVtb3ZlQWxsKCk7DQorICAgICAgICBtX0xpbmVQaWVjZXMuUmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICAgICAgICBtX2lXaWR0aCA9IDA7DQorICAgICAgICBtX2lBcmFiaWNDaGFycyA9IDA7DQorICAgICAgICBtX2lNQkNTQ2hhcnMgPSAwOw0KKyAgICB9DQorICAgIENGWF9SVEZDaGFyQXJyYXkJbV9MaW5lQ2hhcnM7DQorICAgIENGWF9SVEZQaWVjZUFycmF5CW1fTGluZVBpZWNlczsNCisgICAgRlhfSU5UMzIJCQltX2lTdGFydDsNCisgICAgRlhfSU5UMzIJCQltX2lXaWR0aDsNCisgICAgRlhfSU5UMzIJCQltX2lBcmFiaWNDaGFyczsNCisgICAgRlhfSU5UMzIJCQltX2lNQkNTQ2hhcnM7DQorfTsNCitjbGFzcyBDRlhfUlRGQnJlYWsgOiBwdWJsaWMgSUZYX1JURkJyZWFrLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9SVEZCcmVhayhGWF9EV09SRCBkd1BvbGljaWVzKTsNCisgICAgfkNGWF9SVEZCcmVhaygpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZVdpZHRoKEZYX0ZMT0FUIGZMaW5lU3RhcnQsIEZYX0ZMT0FUIGZMaW5lRW5kKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcyk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldExheW91dFN0eWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0UG9zaXRpb25lZFRhYnMoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkgJnRhYnMpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhclBvc2l0aW9uZWRUYWJzKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVCcmVha0NoYXIoRlhfV0NIQVIgd2NoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRIb3Jpem9udGFsU2NhbGUoRlhfSU5UMzIgaVNjYWxlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VmVydGljYWxTY2FsZShGWF9JTlQzMiBpU2NhbGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyUm90YXRpb24oRlhfSU5UMzIgaUNoYXJSb3RhdGlvbik7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0V29yZFNwYWNlKEZYX0JPT0wgYkRlZmF1bHQsIEZYX0ZMT0FUIGZXb3JkU3BhY2UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRBbGlnbm1lbnQoRlhfSU5UMzIgaUFsaWdubWVudCA9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFVzZXJEYXRhKElGWF9Vbmtub3duICpwVXNlckRhdGEpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJCUVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhayk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCUNvdW50QnJlYWtQaWVjZXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBjb25zdCBDRlhfUlRGUGllY2UqCQkJR2V0QnJlYWtQaWVjZShGWF9JTlQzMiBpbmRleCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJCUdldExpbmVSZWN0KENGWF9SZWN0RiAmcmVjdCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCQkJCUNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVzZXQoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0RGlzcGxheVBvcyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyA9IE5VTEwsIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgPSBOVUxMKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0Q2hhclJlY3RzKEZYX0xQQ1JURlRFWFRPQkogcFRleHQsIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdDsNCisgICAgRlhfRFdPUkQJCQkJQXBwZW5kQ2hhcl9DaGFyQ29kZShGWF9XQ0hBUiB3Y2gpOw0KKyAgICBGWF9EV09SRAkJCQlBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKTsNCisgICAgRlhfRFdPUkQJCQkJQXBwZW5kQ2hhcl9UYWIoQ0ZYX1JURkNoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pOw0KKyAgICBGWF9EV09SRAkJCQlBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX1JURkNoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pOw0KKyAgICBGWF9EV09SRAkJCQlBcHBlbmRDaGFyX0FyYWJpYyhDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbik7DQorICAgIEZYX0RXT1JECQkJCUFwcGVuZENoYXJfT3RoZXJzKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0RXT1JECQkJbV9kd1BvbGljaWVzOw0KKyAgICBJRlhfQXJhYmljQ2hhcgkJKm1fcEFyYWJpY0NoYXI7DQorICAgIEZYX0lOVDMyCQkJbV9pTGluZVN0YXJ0Ow0KKyAgICBGWF9JTlQzMgkJCW1faUxpbmVFbmQ7DQorICAgIEZYX0RXT1JECQkJbV9kd0xheW91dFN0eWxlczsNCisgICAgRlhfQk9PTAkJCQltX2JQYWdpbmF0aW9uOw0KKyAgICBGWF9CT09MCQkJCW1fYlZlcnRpY2FsOw0KKyAgICBGWF9CT09MCQkJCW1fYlNpbmdsZUxpbmU7DQorICAgIEZYX0JPT0wJCQkJbV9iQ2hhckNvZGU7DQorICAgIElGWF9Gb250CQkJKm1fcEZvbnQ7DQorICAgIEZYX0lOVDMyCQkJbV9pRm9udEhlaWdodDsNCisgICAgRlhfSU5UMzIJCQltX2lGb250U2l6ZTsNCisgICAgRlhfSU5UMzIJCQltX2lUYWJXaWR0aDsNCisgICAgQ0ZYX0ludDMyQXJyYXkJCW1fUG9zaXRpb25lZFRhYnM7DQorICAgIEZYX0JPT0wJCQkJbV9iT3JwaGFuTGluZTsNCisgICAgRlhfV0NIQVIJCQltX3dEZWZDaGFyOw0KKyAgICBGWF9JTlQzMgkJCW1faURlZkNoYXI7DQorICAgIEZYX1dDSEFSCQkJbV93TGluZUJyZWFrQ2hhcjsNCisgICAgRlhfSU5UMzIJCQltX2lIb3Jpem9udGFsU2NhbGU7DQorICAgIEZYX0lOVDMyCQkJbV9pVmVydGljYWxTY2FsZTsNCisgICAgRlhfSU5UMzIJCQltX2lMaW5lUm90YXRpb247DQorICAgIEZYX0lOVDMyCQkJbV9pQ2hhclJvdGF0aW9uOw0KKyAgICBGWF9JTlQzMgkJCW1faVJvdGF0aW9uOw0KKyAgICBGWF9JTlQzMgkJCW1faUNoYXJTcGFjZTsNCisgICAgRlhfQk9PTAkJCQltX2JXb3JkU3BhY2U7DQorICAgIEZYX0lOVDMyCQkJbV9pV29yZFNwYWNlOw0KKyAgICBGWF9CT09MCQkJCW1fYlJUTDsNCisgICAgRlhfSU5UMzIJCQltX2lBbGlnbm1lbnQ7DQorICAgIElGWF9Vbmtub3duCQkJKm1fcFVzZXJEYXRhOw0KKyAgICBGWF9EV09SRAkJCW1fZHdDaGFyVHlwZTsNCisgICAgRlhfRFdPUkQJCQltX2R3SWRlbnRpdHk7DQorICAgIENGWF9SVEZMaW5lCQkJbV9SVEZMaW5lMTsNCisgICAgQ0ZYX1JURkxpbmUJCQltX1JURkxpbmUyOw0KKyAgICBDRlhfUlRGTGluZQkJCSptX3BDdXJMaW5lOw0KKyAgICBGWF9JTlQzMgkJCW1faVJlYWR5Ow0KKyAgICBGWF9JTlQzMgkJCW1faVRvbGVyYW5jZTsNCisgICAgRlhfSU5UMzIJCQlHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCVNldEJyZWFrU3RhdHVzKCk7DQorICAgIENGWF9SVEZDaGFyKgkJR2V0TGFzdENoYXIoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICBDRlhfUlRGTGluZSoJCUdldFJURkxpbmUoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KKyAgICBDRlhfUlRGUGllY2VBcnJheSoJR2V0UlRGUGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdDsNCisgICAgRlhfRFdPUkQJCQlHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCQlHZXRMYXN0UG9zaXRpb25lZFRhYigpIGNvbnN0Ow0KKyAgICBGWF9CT09MCQkJCUdldFBvc2l0aW9uZWRUYWIoRlhfSU5UMzIgJmlUYWJQb3MpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMgkJCUdldEJyZWFrUG9zKENGWF9SVEZDaGFyQXJyYXkgJnRjYSwgRlhfSU5UMzIgJmlFbmRQb3MsIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UsIEZYX0JPT0wgYk9ubHlCcmsgPSBGQUxTRSk7DQorICAgIHZvaWQJCQkJU3BsaXRUZXh0TGluZShDRlhfUlRGTGluZSAqcEN1ckxpbmUsIENGWF9SVEZMaW5lICpwTmV4dExpbmUsIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UpOw0KKyAgICBGWF9CT09MCQkJCUVuZEJyZWFrX1NwbGl0TGluZShDRlhfUlRGTGluZSAqcE5leHRMaW5lLCBGWF9CT09MIGJBbGxDaGFycywgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgICB2b2lkCQkJCUVuZEJyZWFrX0JpZGlMaW5lKENGWF9UUE9BcnJheSAmdHBvcywgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgICB2b2lkCQkJCUVuZEJyZWFrX0FsaWdubWVudChDRlhfVFBPQXJyYXkgJnRwb3MsIEZYX0JPT0wgYkFsbENoYXJzLCBGWF9EV09SRCBkd1N0YXR1cyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI3YjY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmNwcApAQCAtMCwwICsxLDE2NTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF91bmljb2RlLmgiDQorI2luY2x1ZGUgImZ4X3RleHRicmVhay5oIg0KK2V4dGVybiBjb25zdCBGWF9EV09SRCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWzY1NTM2XTsNCitleHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcls2NF07DQorZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcls1MTJdOw0KK2V4dGVybiBjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXTsNCitJRlhfVHh0QnJlYWsqIElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGWF9UeHRCcmVhayhkd1BvbGljaWVzKTsNCit9DQorQ0ZYX1R4dEJyZWFrOjpDRlhfVHh0QnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcykNCisgICAgOiBtX2R3UG9saWNpZXMoZHdQb2xpY2llcykNCisgICAgLCBtX3BBcmFiaWNDaGFyKE5VTEwpDQorICAgICwgbV9pTGluZVdpZHRoKDIwMDAwMDApDQorICAgICwgbV9kd0xheW91dFN0eWxlcygwKQ0KKyAgICAsIG1fYlZlcnRpY2FsKEZBTFNFKQ0KKyAgICAsIG1fYkFyYWJpY0NvbnRleHQoRkFMU0UpDQorICAgICwgbV9iQXJhYmljU2hhcGVzKEZBTFNFKQ0KKyAgICAsIG1fYlJUTChGQUxTRSkNCisgICAgLCBtX2JTaW5nbGVMaW5lKEZBTFNFKQ0KKyAgICAsIG1fYkNvbWJUZXh0KEZBTFNFKQ0KKyAgICAsIG1faUFyYWJpY0NvbnRleHQoMSkNCisgICAgLCBtX2lDdXJBcmFiaWNDb250ZXh0KDEpDQorICAgICwgbV9wRm9udChOVUxMKQ0KKyAgICAsIG1faUZvbnRTaXplKDI0MCkNCisgICAgLCBtX2JFcXVpZGlzdGFudChUUlVFKQ0KKyAgICAsIG1faVRhYldpZHRoKDcyMDAwMCkNCisgICAgLCBtX3dEZWZDaGFyKDB4RkVGRikNCisgICAgLCBtX3dQYXJhZ0JyZWFrQ2hhcihMJ1xuJykNCisgICAgLCBtX2lEZWZDaGFyKDApDQorICAgICwgbV9pTGluZVJvdGF0aW9uKDApDQorICAgICwgbV9pQ2hhclJvdGF0aW9uKDApDQorICAgICwgbV9pUm90YXRpb24oMCkNCisgICAgLCBtX2lBbGlnbm1lbnQoRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0KQ0KKyAgICAsIG1fZHdDb250ZXh0Q2hhclN0eWxlcygwKQ0KKyAgICAsIG1faUNvbWJXaWR0aCgzNjAwMDApDQorICAgICwgbV9wVXNlckRhdGEoTlVMTCkNCisgICAgLCBtX2R3Q2hhclR5cGUoMCkNCisgICAgLCBtX2JBcmFiaWNOdW1iZXIoRkFMU0UpDQorICAgICwgbV9iQXJhYmljQ29tbWEoRkFMU0UpDQorICAgICwgbV9wQ3VyTGluZShOVUxMKQ0KKyAgICAsIG1faVJlYWR5KDApDQorICAgICwgbV9pVG9sZXJhbmNlKDApDQorICAgICwgbV9pSG9yU2NhbGUoMTAwKQ0KKyAgICAsIG1faVZlclNjYWxlKDEwMCkNCisgICAgLCBtX2lDaGFyU3BhY2UoMCkNCit7DQorICAgIG1fYlBhZ2luYXRpb24gPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfUGFnaW5hdGlvbikgIT0gMDsNCisgICAgbV9wQXJhYmljQ2hhciA9IElGWF9BcmFiaWNDaGFyOjpDcmVhdGUoKTsNCisgICAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCisgICAgICAgIG1fcFR4dExpbmUxID0gRlhfTkVXIENGWF9UeHRMaW5lKHNpemVvZihDRlhfQ2hhcikpOw0KKyAgICAgICAgbV9wVHh0TGluZTIgPSBGWF9ORVcgQ0ZYX1R4dExpbmUoc2l6ZW9mKENGWF9DaGFyKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BUeHRMaW5lMSA9IEZYX05FVyBDRlhfVHh0TGluZShzaXplb2YoQ0ZYX1R4dENoYXIpKTsNCisgICAgICAgIG1fcFR4dExpbmUyID0gRlhfTkVXIENGWF9UeHRMaW5lKHNpemVvZihDRlhfVHh0Q2hhcikpOw0KKyAgICB9DQorICAgIG1fcEN1ckxpbmUgPSBtX3BUeHRMaW5lMTsNCisgICAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQorfQ0KK0NGWF9UeHRCcmVhazo6fkNGWF9UeHRCcmVhaygpDQorew0KKyAgICBSZXNldCgpOw0KKyAgICBkZWxldGUgbV9wVHh0TGluZTE7DQorICAgIGRlbGV0ZSBtX3BUeHRMaW5lMjsNCisgICAgbV9wQXJhYmljQ2hhci0+UmVsZWFzZSgpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZVdpZHRoKEZYX0ZMT0FUIGZMaW5lV2lkdGgpDQorew0KKyAgICBtX2lMaW5lV2lkdGggPSBGWFNZU19yb3VuZChmTGluZVdpZHRoICogMjAwMDAuMGYpOw0KKyAgICBGWFNZU19hc3NlcnQobV9pTGluZVdpZHRoID49IDIwMDAwKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpDQorew0KKyAgICBGWF9JTlQzMiBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KKyAgICBpZiAoaUxpbmVQb3MgPCAwKSB7DQorICAgICAgICBpTGluZVBvcyA9IDA7DQorICAgIH0NCisgICAgaWYgKGlMaW5lUG9zID4gbV9pTGluZVdpZHRoKSB7DQorICAgICAgICBpTGluZVBvcyA9IG1faUxpbmVXaWR0aDsNCisgICAgfQ0KKyAgICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IGlMaW5lUG9zOw0KKyAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpTGluZVBvczsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykNCit7DQorICAgIG1fZHdMYXlvdXRTdHlsZXMgPSBkd0xheW91dFN0eWxlczsNCisgICAgbV9iVmVydGljYWwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQorICAgIG1fYkFyYWJpY0NvbnRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQpICE9IDA7DQorICAgIG1fYkFyYWJpY1NoYXBlcyA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzKSAhPSAwOw0KKyAgICBtX2JSVEwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcikgIT0gMDsNCisgICAgbV9iU2luZ2xlTGluZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsNCisgICAgbV9iQ29tYlRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwOw0KKyAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgICAgbV9pTGluZVJvdGF0aW9uID0gR2V0TGluZVJvdGF0aW9uKG1fZHdMYXlvdXRTdHlsZXMpOw0KKyAgICBtX2lSb3RhdGlvbiA9IG1faUxpbmVSb3RhdGlvbiArIG1faUNoYXJSb3RhdGlvbjsNCisgICAgbV9pUm90YXRpb24gJT0gNDsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldEZvbnQoSUZYX0ZvbnQgKnBGb250KQ0KK3sNCisgICAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9wRm9udCA9PSBwRm9udCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFNldEJyZWFrU3RhdHVzKCk7DQorICAgIG1fcEZvbnQgPSBwRm9udDsNCisgICAgbV9pRGVmQ2hhciA9IDA7DQorICAgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRiAmJiBtX3BGb250ICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpDQorew0KKyAgICBGWF9JTlQzMiBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7DQorICAgIGlmIChtX2lGb250U2l6ZSA9PSBpRm9udFNpemUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBTZXRCcmVha1N0YXR1cygpOw0KKyAgICBtX2lGb250U2l6ZSA9IGlGb250U2l6ZTsNCisgICAgbV9pRGVmQ2hhciA9IDA7DQorICAgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRiAmJiBtX3BGb250ICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KQ0KK3sNCisgICAgbV9pVGFiV2lkdGggPSBGWFNZU19yb3VuZChmVGFiV2lkdGggKiAyMDAwMC4wZik7DQorICAgIGlmIChtX2lUYWJXaWR0aCA8IEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aCkgew0KKyAgICAgICAgbV9pVGFiV2lkdGggPSBGWF9UWFRCUkVBS19NaW5pbXVtVGFiV2lkdGg7DQorICAgIH0NCisgICAgbV9iRXF1aWRpc3RhbnQgPSBiRXF1aWRpc3RhbnQ7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpDQorew0KKyAgICBtX3dEZWZDaGFyID0gd2NoOw0KKyAgICBtX2lEZWZDaGFyID0gMDsNCisgICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGICYmIG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgICAgIGlmIChtX2lEZWZDaGFyIDwgMCkgew0KKyAgICAgICAgICAgIG1faURlZkNoYXIgPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKQ0KK3sNCisgICAgaWYgKHdjaCAhPSBMJ1xyJyAmJiB3Y2ggIT0gTCdcbicpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3dQYXJhZ0JyZWFrQ2hhciA9IHdjaDsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKQ0KK3sNCisgICAgbV9pVG9sZXJhbmNlID0gRlhTWVNfcm91bmQoZlRvbGVyYW5jZSAqIDIwMDAwLjBmKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldENoYXJSb3RhdGlvbihGWF9JTlQzMiBpQ2hhclJvdGF0aW9uKQ0KK3sNCisgICAgaWYgKGlDaGFyUm90YXRpb24gPCAwKSB7DQorICAgICAgICBpQ2hhclJvdGF0aW9uICs9ICgtaUNoYXJSb3RhdGlvbiAvIDQgKyAxKSAqIDQ7DQorICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA+IDMpIHsNCisgICAgICAgIGlDaGFyUm90YXRpb24gLT0gKGlDaGFyUm90YXRpb24gLyA0KSAqIDQ7DQorICAgIH0NCisgICAgaWYgKG1faUNoYXJSb3RhdGlvbiA9PSBpQ2hhclJvdGF0aW9uKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgU2V0QnJlYWtTdGF0dXMoKTsNCisgICAgbV9pQ2hhclJvdGF0aW9uID0gaUNoYXJSb3RhdGlvbjsNCisgICAgbV9pUm90YXRpb24gPSBtX2lMaW5lUm90YXRpb24gKyBtX2lDaGFyUm90YXRpb247DQorICAgIG1faVJvdGF0aW9uICU9IDQ7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRBbGlnbm1lbnQoRlhfSU5UMzIgaUFsaWdubWVudCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChpQWxpZ25tZW50ID49IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCAmJiBpQWxpZ25tZW50IDw9IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpOw0KKyAgICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50Ow0KKyAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0Q29udGV4dENoYXJTdHlsZXMoKQ0KK3sNCisgICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzID0gbV9iQXJhYmljQ29udGV4dCA/IG1faUN1ckFsaWdubWVudCA6IG1faUFsaWdubWVudDsNCisgICAgaWYgKG1fYkFyYWJpY051bWJlcikgew0KKyAgICAgICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9BcmFiaWNOdW1iZXI7DQorICAgIH0NCisgICAgaWYgKG1fYkFyYWJpY0NvbW1hKSB7DQorICAgICAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hOw0KKyAgICB9DQorICAgIGlmICgobV9iQXJhYmljQ29udGV4dCAmJiBtX2JDdXJSVEwpIHx8ICghbV9iQXJhYmljQ29udGV4dCAmJiBtX2JSVEwpKSB7DQorICAgICAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlcjsNCisgICAgfQ0KKyAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gKG1faUFyYWJpY0NvbnRleHQgPDwgOCk7DQorfQ0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6R2V0Q29udGV4dENoYXJTdHlsZXMoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fZHdDb250ZXh0Q2hhclN0eWxlczsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldENvbnRleHRDaGFyU3R5bGVzKEZYX0RXT1JEIGR3Q2hhclN0eWxlcykNCit7DQorICAgIG1faUN1ckFsaWdubWVudCA9IGR3Q2hhclN0eWxlcyAmIDB4MEY7DQorICAgIG1fYkFyYWJpY051bWJlciA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KKyAgICBtX2JBcmFiaWNDb21tYSA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQorICAgIG1fYkN1clJUTCA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyKSAhPSAwOw0KKyAgICBtX2lDdXJBcmFiaWNDb250ZXh0ID0gbV9pQXJhYmljQ29udGV4dCA9ICgoZHdDaGFyU3R5bGVzICYgMHgwMzAwKSA+PiA4KTsNCisgICAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q29tYldpZHRoKEZYX0ZMT0FUIGZDb21iV2lkdGgpDQorew0KKyAgICBtX2lDb21iV2lkdGggPSBGWFNZU19yb3VuZChmQ29tYldpZHRoICogMjAwMDAuMGYpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0VXNlckRhdGEoRlhfTFBWT0lEIHBVc2VyRGF0YSkNCit7DQorICAgIGlmIChtX3BVc2VyRGF0YSA9PSBwVXNlckRhdGEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBTZXRCcmVha1N0YXR1cygpOw0KKyAgICBtX3BVc2VyRGF0YSA9IHBVc2VyRGF0YTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldEJyZWFrU3RhdHVzKCkNCit7DQorICAgIGlmIChtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9UeHRDaGFyICpwVEMgPSAoQ0ZYX1R4dENoYXIqKW1fcEN1ckxpbmUtPkdldENoYXJQdHIoaUNvdW50IC0gMSk7DQorICAgIGlmIChwVEMtPm1fZHdTdGF0dXMgPT0gMCkgew0KKyAgICAgICAgcFRDLT5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCisgICAgfQ0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0SG9yaXpvbnRhbFNjYWxlKEZYX0lOVDMyIGlTY2FsZSkNCit7DQorICAgIGlmIChpU2NhbGUgPCAwKSB7DQorICAgICAgICBpU2NhbGUgPSAwOw0KKyAgICB9DQorICAgIGlmIChpU2NhbGUgPT0gbV9pSG9yU2NhbGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBTZXRCcmVha1N0YXR1cygpOw0KKyAgICBtX2lIb3JTY2FsZSA9IGlTY2FsZTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoRlhfSU5UMzIgaVNjYWxlKQ0KK3sNCisgICAgaWYgKGlTY2FsZSA8IDApIHsNCisgICAgICAgIGlTY2FsZSA9IDA7DQorICAgIH0NCisgICAgaWYgKGlTY2FsZSA9PSBtX2lIb3JTY2FsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFNldEJyZWFrU3RhdHVzKCk7DQorICAgIG1faVZlclNjYWxlID0gaVNjYWxlOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpDQorew0KKyAgICBtX2lDaGFyU3BhY2UgPSBGWFNZU19yb3VuZChmQ2hhclNwYWNlICogMjAwMDAuMGYpOw0KK30NCitzdGF0aWMgY29uc3QgRlhfSU5UMzIgZ3NfRlhfVHh0TGluZVJvdGF0aW9uc1s4XSA9IHswLCAzLCAxLCAwLCAyLCAxLCAzLCAyfTsNCitGWF9JTlQzMiBDRlhfVHh0QnJlYWs6OkdldExpbmVSb3RhdGlvbihGWF9EV09SRCBkd1N0eWxlcykgY29uc3QNCit7DQorICAgIHJldHVybiBnc19GWF9UeHRMaW5lUm90YXRpb25zWyhkd1N0eWxlcyAmIDB4MEUpID4+IDFdOw0KK30NCitDRlhfVHh0Q2hhciogQ0ZYX1R4dEJyZWFrOjpHZXRMYXN0Q2hhcihGWF9JTlQzMiBpbmRleCwgRlhfQk9PTCBiT21pdENoYXIpIGNvbnN0DQorew0KKyAgICBDRlhfVHh0Q2hhckFycmF5ICZjYSA9ICptX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IGNhLkdldFNpemUoKTsNCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpQ291bnQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9UeHRDaGFyICpwVEM7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IGlDb3VudCAtIDE7DQorICAgIHdoaWxlIChpU3RhcnQgPiAtMSkgew0KKyAgICAgICAgcFRDID0gY2EuR2V0RGF0YVB0cihpU3RhcnQgLS0pOw0KKyAgICAgICAgaWYgKGJPbWl0Q2hhciAmJiBwVEMtPkdldENoYXJUeXBlKCkgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgtLWluZGV4IDwgMCkgew0KKyAgICAgICAgICAgIHJldHVybiBwVEM7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGWF9UeHRMaW5lKiBDRlhfVHh0QnJlYWs6OkdldFR4dExpbmUoRlhfQk9PTCBiUmVhZHkpIGNvbnN0DQorew0KKyAgICBpZiAoIWJSZWFkeSkgew0KKyAgICAgICAgcmV0dXJuIG1fcEN1ckxpbmU7DQorICAgIH0NCisgICAgaWYgKG1faVJlYWR5ID09IDEpIHsNCisgICAgICAgIHJldHVybiBtX3BUeHRMaW5lMTsNCisgICAgfSBlbHNlIGlmIChtX2lSZWFkeSA9PSAyKSB7DQorICAgICAgICByZXR1cm4gbV9wVHh0TGluZTI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KK30NCitDRlhfVHh0UGllY2VBcnJheSogQ0ZYX1R4dEJyZWFrOjpHZXRUeHRQaWVjZXMoRlhfQk9PTCBiUmVhZHkpIGNvbnN0DQorew0KKyAgICBDRlhfVHh0TGluZSAqcFR4dExpbmUgPSBHZXRUeHRMaW5lKGJSZWFkeSk7DQorICAgIGlmIChwVHh0TGluZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcFR4dExpbmUtPm1fcExpbmVQaWVjZXM7DQorfQ0KK2lubGluZSBGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkdldFVuaWZpZWRDaGFyVHlwZShGWF9EV09SRCBkd1R5cGUpIGNvbnN0DQorew0KKyAgICByZXR1cm4gZHdUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPyBGWF9DSEFSVFlQRV9BcmFiaWMgOiBkd1R5cGU7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpSZXNldEFyYWJpY0NvbnRleHQoKQ0KK3sNCisgICAgaWYgKG1fYkFyYWJpY0NvbnRleHQpIHsNCisgICAgICAgIG1fYkN1clJUTCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPiAxOw0KKyAgICAgICAgbV9pQ3VyQWxpZ25tZW50ID0gbV9pQ3VyQXJhYmljQ29udGV4dCA+IDEgPyBGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0IDogRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0Ow0KKyAgICAgICAgbV9pQ3VyQWxpZ25tZW50IHw9IChtX2lBbGlnbm1lbnQgJiBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2spOw0KKyAgICAgICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+PSAxICYmIG1fYkFyYWJpY1NoYXBlczsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgICAgICAgbV9iQ3VyUlRMID0gRkFMU0U7DQorICAgICAgICAgICAgbV9pQ3VyQWxpZ25tZW50ID0gMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9iQ3VyUlRMID0gbV9iUlRMOw0KKyAgICAgICAgICAgIG1faUN1ckFsaWdubWVudCA9IG1faUFsaWdubWVudDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX2JSVEwpIHsNCisgICAgICAgICAgICBtX2JBcmFiaWNOdW1iZXIgPSBtX2lBcmFiaWNDb250ZXh0ID49IDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fYkFyYWJpY051bWJlciA9IG1faUFyYWJpY0NvbnRleHQgPiAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9iQXJhYmljTnVtYmVyID0gbV9iQXJhYmljTnVtYmVyICYmIG1fYkFyYWJpY1NoYXBlczsNCisgICAgfQ0KKyAgICBtX2JBcmFiaWNDb21tYSA9IG1fYkFyYWJpY051bWJlcjsNCisgICAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9QYWdlTG9hZChDRlhfQ2hhciAqcEN1ckNoYXIsIEZYX0RXT1JEIGR3UHJvcHMpDQorew0KKyAgICBpZiAoIW1fYlBhZ2luYXRpb24pIHsNCisgICAgICAgICgoQ0ZYX1R4dENoYXIqKXBDdXJDaGFyKS0+bV9kd1N0YXR1cyA9IDA7DQorICAgICAgICAoKENGWF9UeHRDaGFyKilwQ3VyQ2hhciktPm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7DQorICAgIH0NCisgICAgaWYgKG1fYkFyYWJpY0NvbnRleHQgfHwgbV9iQXJhYmljU2hhcGVzKSB7DQorICAgICAgICBGWF9JTlQzMiBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7DQorICAgICAgICBGWF9JTlQzMiBpQXJhYmljQ29udGV4dCA9IChpQmlkaUNscyA9PSBGWF9CSURJQ0xBU1NfUiB8fCBpQmlkaUNscyA9PSBGWF9CSURJQ0xBU1NfQUwpID8gMiA6ICgoaUJpZGlDbHMgPT0gRlhfQklESUNMQVNTX0wgfHwgaUJpZGlDbHMgPT0gRlhfQklESUNMQVNTX1MpID8gMCA6IDEpOw0KKyAgICAgICAgaWYgKGlBcmFiaWNDb250ZXh0ICE9IG1faUFyYWJpY0NvbnRleHQgJiYgaUFyYWJpY0NvbnRleHQgIT0gMSkgew0KKyAgICAgICAgICAgIG1faUFyYWJpY0NvbnRleHQgPSBpQXJhYmljQ29udGV4dDsNCisgICAgICAgICAgICBpZiAobV9pQ3VyQXJhYmljQ29udGV4dCA9PSAxKSB7DQorICAgICAgICAgICAgICAgIG1faUN1ckFyYWJpY0NvbnRleHQgPSBpQXJhYmljQ29udGV4dDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQorICAgICAgICAgICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgICAgICAgICAgIENGWF9UeHRDaGFyICpwTGFzdENoYXIgPSAoQ0ZYX1R4dENoYXIqKUdldExhc3RDaGFyKDEsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMICYmIHBMYXN0Q2hhci0+bV9kd1N0YXR1cyA8IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIHBMYXN0Q2hhci0+bV9kd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gbV9kd0NvbnRleHRDaGFyU3R5bGVzOw0KK30NCitGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQ29tYmluYXRpb24oQ0ZYX0NoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pDQorew0KKyAgICBGWFNZU19hc3NlcnQocEN1ckNoYXIgIT0gTlVMTCk7DQorICAgIEZYX1dDSEFSIHdjaCA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgRlhfV0NIQVIgd0Zvcm07DQorICAgIEZYX0lOVDMyIGlDaGFyV2lkdGggPSAwOw0KKyAgICBDRlhfQ2hhciAqcExhc3RDaGFyOw0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gLTE7DQorICAgIGlmIChtX2JDb21iVGV4dCkgew0KKyAgICAgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgICAgICAgIGlmICghbV9iUGFnaW5hdGlvbikgew0KKyAgICAgICAgICAgICAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigwLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCAmJiAoKChDRlhfVHh0Q2hhciopcExhc3RDaGFyKS0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkZGEgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gMHgwNjUxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0xhc3QgPSBwTGFzdENoYXItPm1fd0NoYXJDb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3TGFzdCA+PSAweDA2NEMgJiYgd0xhc3QgPD0gMHgwNjUwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdMYXN0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocExhc3RDaGFyLT5tX3dDaGFyQ29kZSA9PSAweDA2NTEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJTaGFkZGEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAoKENGWF9UeHRDaGFyKilwTGFzdENoYXIpLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZYX1R4dENoYXIqKXBMYXN0Q2hhciktPm1faUNoYXJXaWR0aCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgKChDRlhfVHh0Q2hhciopcEN1ckNoYXIpLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICAgIH0NCisgICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KKyAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX1RhYihDRlhfQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbikNCit7DQorICAgIG1fZHdDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX1RhYjsNCisgICAgaWYgKChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiAmaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICBGWF9JTlQzMiBpQ2hhcldpZHRoOw0KKyAgICBpZiAobV9iQ29tYlRleHQpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9iRXF1aWRpc3RhbnQpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gaUxpbmVXaWR0aDsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGggKiAoaUNoYXJXaWR0aCAvIG1faVRhYldpZHRoICsgMSkgLSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoIDwgRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoKSB7DQorICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggKz0gbV9pVGFiV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGg7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGlMaW5lV2lkdGggPj0gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfVFhUQlJFQUtfTGluZUJyZWFrKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX0NoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pDQorew0KKyAgICBtX2R3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Db250cm9sOw0KKyAgICBGWF9EV09SRCBkd1JldCA9IEZYX1RYVEJSRUFLX05vbmU7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSkgew0KKyAgICAgICAgRlhfV0NIQVIgd2NoID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgICAgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICAgICAgICBjYXNlIEwnXHYnOg0KKyAgICAgICAgICAgIGNhc2UgMHgyMDI4Og0KKyAgICAgICAgICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX0xpbmVCcmVhazsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBMJ1xmJzoNCisgICAgICAgICAgICAgICAgZHdSZXQgPSBGWF9UWFRCUkVBS19QYWdlQnJlYWs7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMHgyMDI5Og0KKyAgICAgICAgICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBpZiAod2NoID09IG1fd1BhcmFnQnJlYWtDaGFyKSB7DQorICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3UmV0ICE9IEZYX1RYVEJSRUFLX05vbmUpIHsNCisgICAgICAgICAgICBkd1JldCA9IEVuZEJyZWFrKGR3UmV0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZHdSZXQ7DQorfQ0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pDQorew0KKyAgICBGWF9EV09SRCBkd1R5cGUgPSAocEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCisgICAgRlhfSU5UMzIgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCisgICAgRlhfV0NIQVIgd0Zvcm07DQorICAgIEZYX0lOVDMyIGlDaGFyV2lkdGggPSAwOw0KKyAgICBDRlhfQ2hhciAqcExhc3RDaGFyID0gTlVMTDsNCisgICAgRlhfQk9PTCBiQWxlZiA9IEZBTFNFOw0KKyAgICBpZiAoIW1fYkNvbWJUZXh0ICYmIG1fZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIG1fZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7DQorICAgICAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxKTsNCisgICAgICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwTGFzdENoYXItPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgaUxpbmVXaWR0aCAtPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfQ2hhciAqcFByZXZDaGFyID0gR2V0TGFzdENoYXIoMik7DQorICAgICAgICAgICAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcihwTGFzdENoYXIsIHBQcmV2Q2hhciwgcEN1ckNoYXIpOw0KKyAgICAgICAgICAgIGJBbGVmID0gKHdGb3JtID09IDB4RkVGRiAmJiBwTGFzdENoYXItPkdldENoYXJUeXBlKCkgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZik7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxhc3RSb3RhdGlvbiA9IHBMYXN0Q2hhci0+bV9uUm90YXRpb24gKyBtX2lMaW5lUm90YXRpb247DQorICAgICAgICAgICAgaWYgKG1fYlZlcnRpY2FsICYmIChwTGFzdENoYXItPm1fZHdDaGFyUHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgICAgICAgICAgaUxhc3RSb3RhdGlvbiArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlMYXN0Um90YXRpb24pKSB7DQorICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKSB7DQorICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICAgICAgICAgICAgcExhc3RDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX2R3Q2hhclR5cGUgPSBkd1R5cGU7DQorICAgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIocEN1ckNoYXIsIGJBbGVmID8gTlVMTCA6IHBMYXN0Q2hhciwgTlVMTCk7DQorICAgIGlmIChtX2JDb21iVGV4dCkgew0KKyAgICAgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdGb3JtID09IDB4RkVGRikgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICAgIH0NCisgICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgKys7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiBpTGluZVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfVFhUQlJFQUtfTGluZUJyZWFrKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycyhDRlhfQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbikNCit7DQorICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wczsNCisgICAgRlhfRFdPUkQgZHdUeXBlID0gKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCisgICAgRlhfSU5UMzIgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCisgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCA9IDA7DQorICAgIG1fZHdDaGFyVHlwZSA9IGR3VHlwZTsNCisgICAgRlhfV0NIQVIgd2NoID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgICBGWF9XQ0hBUiB3Rm9ybSA9IHdjaDsNCisgICAgaWYgKGR3VHlwZSA9PSBGWF9DSEFSVFlQRV9OdW1lcmljKSB7DQorICAgICAgICBpZiAobV9iQXJhYmljTnVtYmVyKSB7DQorICAgICAgICAgICAgd0Zvcm0gPSB3Y2ggKyAweDA2MzA7DQorICAgICAgICAgICAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYzsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmICh3Y2ggPT0gTCcsJykgew0KKyAgICAgICAgaWYgKG1fYkFyYWJpY1NoYXBlcyAmJiBtX2lDdXJBcmFiaWNDb250ZXh0ID4gMCkgew0KKyAgICAgICAgICAgIHdGb3JtID0gMHgwNjBDOw0KKyAgICAgICAgICAgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWE7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9iQ3VyUlRMIHx8IG1fYlZlcnRpY2FsKSB7DQorICAgICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBtX2JDdXJSVEwsIG1fYlZlcnRpY2FsKTsNCisgICAgfQ0KKyAgICBpZiAobV9iQ29tYlRleHQpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgICAgfSBlbHNlIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSkpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCisgICAgICAgIH0NCisgICAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggKz0gbV9pQ2hhclNwYWNlOw0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICBGWF9CT09MIGJCcmVhayA9IChkd1R5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDApOw0KKyAgICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgYkJyZWFrICYmIGlMaW5lV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgICAgIHJldHVybiBFbmRCcmVhayhGWF9UWFRCUkVBS19MaW5lQnJlYWspOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KK30NCit0eXBlZGVmIEZYX0RXT1JEIChDRlhfVHh0QnJlYWs6OipGWF9UeHRCcmVha19MUEZBcHBlbmRDaGFyKShDRlhfQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbik7DQorc3RhdGljIGNvbnN0IEZYX1R4dEJyZWFrX0xQRkFwcGVuZENoYXIgZ19GWF9UeHRCcmVha19scGZBcHBlbmRDaGFyWzE2XSA9IHsNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfVGFiLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorfTsNCitGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsNCisgICAgRlhfRFdPUkQgZHdUeXBlID0gKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCisgICAgQ0ZYX1R4dENoYXIgKnBDdXJDaGFyID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLT5BZGRTcGFjZSgpOw0KKyAgICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSAoRlhfV09SRCl3Y2g7DQorICAgIHBDdXJDaGFyLT5tX25Sb3RhdGlvbiA9IG1faUNoYXJSb3RhdGlvbjsNCisgICAgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgPSBkd1Byb3BzOw0KKyAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSAwOw0KKyAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCisgICAgcEN1ckNoYXItPm1faUhvcml6b250YWxTY2FsZSA9IG1faUhvclNjYWxlOw0KKyAgICBwQ3VyQ2hhci0+bV9pVmVydGlhbFNjYWxlID0gbV9pVmVyU2NhbGU7DQorICAgIHBDdXJDaGFyLT5tX2R3U3RhdHVzID0gMDsNCisgICAgcEN1ckNoYXItPm1faUJpZGlDbGFzcyA9IDA7DQorICAgIHBDdXJDaGFyLT5tX2lCaWRpTGV2ZWwgPSAwOw0KKyAgICBwQ3VyQ2hhci0+bV9pQmlkaVBvcyA9IDA7DQorICAgIHBDdXJDaGFyLT5tX2lCaWRpT3JkZXIgPSAwOw0KKyAgICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBOVUxMOw0KKyAgICBBcHBlbmRDaGFyX1BhZ2VMb2FkKHBDdXJDaGFyLCBkd1Byb3BzKTsNCisgICAgRlhfRFdPUkQgZHdSZXQxID0gRlhfVFhUQlJFQUtfTm9uZTsNCisgICAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJiBHZXRVbmlmaWVkQ2hhclR5cGUobV9kd0NoYXJUeXBlKSAhPSBHZXRVbmlmaWVkQ2hhclR5cGUoZHdUeXBlKSkgew0KKyAgICAgICAgaWYgKG1fZHdDaGFyVHlwZSA+IDAgJiYgbV9wQ3VyTGluZS0+bV9pV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UgJiYgIW1fYlNpbmdsZUxpbmUpIHsNCisgICAgICAgICAgICBpZiAobV9kd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db250cm9sKSB7DQorICAgICAgICAgICAgICAgIGR3UmV0MSA9IEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgICAgICAgICAgICAgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHBDdXJDaGFyID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLT5HZXREYXRhUHRyKGlDb3VudCAtIDEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSb3RhdGlvbiA9IG1faVJvdGF0aW9uOw0KKyAgICBpZiAobV9iVmVydGljYWwgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgIGlSb3RhdGlvbiA9IChpUm90YXRpb24gKyAxKSAlIDQ7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdSZXQyID0gKHRoaXMtPipnX0ZYX1R4dEJyZWFrX2xwZkFwcGVuZENoYXJbZHdUeXBlID4+IEZYX0NIQVJUWVBFQklUU10pKHBDdXJDaGFyLCBpUm90YXRpb24pOw0KKyAgICByZXR1cm4gRlhfTUFYKGR3UmV0MSwgZHdSZXQyKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX1VwZGF0ZUFyYWJpY1NoYXBlcygpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9iQXJhYmljU2hhcGVzKTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBpZiAoaUNvdW50IDwgMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyICZpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIENGWF9DaGFyICpwQ3VyLCAqcE5leHQ7DQorICAgIHBDdXIgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKDApOw0KKyAgICBGWF9CT09MIGJQcmV2TnVtID0gKHBDdXItPm1fZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljKSAhPSAwOw0KKyAgICBwQ3VyID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cigxKTsNCisgICAgRlhfV0NIQVIgd2NoLCB3Rm9ybTsNCisgICAgRlhfQk9PTCBiTmV4dE51bTsNCisgICAgRlhfSU5UMzIgaSA9IDEsIGlDaGFyV2lkdGgsIGlSb3RhdGlvbjsNCisgICAgZG8gew0KKyAgICAgICAgaSArKzsNCisgICAgICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgICAgICAgcE5leHQgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGkpOw0KKyAgICAgICAgICAgIGJOZXh0TnVtID0gKHBOZXh0LT5tX2R3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYykgIT0gMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcE5leHQgPSBOVUxMOw0KKyAgICAgICAgICAgIGJOZXh0TnVtID0gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3Y2ggPSBwQ3VyLT5tX3dDaGFyQ29kZTsNCisgICAgICAgIGlmICh3Y2ggPT0gTCcuJykgew0KKyAgICAgICAgICAgIGlmIChiUHJldk51bSAmJiBiTmV4dE51bSkgew0KKyAgICAgICAgICAgICAgICBpUm90YXRpb24gPSBtX2lSb3RhdGlvbjsNCisgICAgICAgICAgICAgICAgaWYgKG1fYlZlcnRpY2FsICYmIChwQ3VyLT5tX2R3Q2hhclByb3BzICYgMHg4MDAwKSAhPSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpUm90YXRpb24gPSAoKGlSb3RhdGlvbiArIDEpICYgMHgwMyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd0Zvcm0gPSB3Y2ggPT0gTCcuJyA/IDB4MDY2QiA6IDB4MDY2QzsNCisgICAgICAgICAgICAgICAgaUxpbmVXaWR0aCAtPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgIGlmIChtX2JDb21iVGV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEN1ci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJQcmV2TnVtID0gKHBDdXItPm1fZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljKSAhPSAwOw0KKyAgICAgICAgcEN1ciA9IHBOZXh0Ow0KKyAgICB9IHdoaWxlIChpIDwgaUNvdW50KTsNCit9DQorRlhfQk9PTCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX1NwbGl0TGluZShDRlhfVHh0TGluZSAqcE5leHRMaW5lLCBGWF9CT09MIGJBbGxDaGFycywgRlhfRFdPUkQgZHdTdGF0dXMpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgIEZYX0JPT0wgYkRvbmUgPSBGQUxTRTsNCisgICAgQ0ZYX0NoYXIgKnBUQzsNCisgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIG1fcEN1ckxpbmUtPm1faVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgICBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOw0KKyAgICAgICAgc3dpdGNoIChwVEMtPkdldENoYXJUeXBlKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZYX0NIQVJUWVBFX1RhYjoNCisgICAgICAgICAgICBjYXNlIEZYX0NIQVJUWVBFX0NvbnRyb2w6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfU3BhY2U6DQorICAgICAgICAgICAgICAgIGlmICgobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQorICAgICAgICAgICAgICAgICAgICBiRG9uZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQorICAgICAgICAgICAgICAgIGJEb25lID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBDRlhfVHh0UGllY2VBcnJheSAqcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQorICAgIENGWF9UeHRQaWVjZSB0cDsNCisgICAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCisgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgICAgICB0cC5tX2lXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gMDsNCisgICAgICAgIHRwLm1faUNoYXJzID0gaUNvdW50Ow0KKyAgICAgICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICAgICAgICB0cC5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOw0KKyAgICAgICAgcFRDID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cigwKTsNCisgICAgICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsNCisgICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7DQorICAgICAgICBtX2R3Q2hhclR5cGUgPSAwOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsNCisgICAgICAgIEZYX0lOVDMyIGlFbmRQb3MgPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCisgICAgICAgIEdldEJyZWFrUG9zKCptX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnMsIGlFbmRQb3MsIGJBbGxDaGFycywgVFJVRSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6RW5kQnJlYWtfQmlkaUxpbmUoQ0ZYX1RQT0FycmF5ICZ0cG9zLCBGWF9EV09SRCBkd1N0YXR1cykNCit7DQorICAgIENGWF9UeHRQaWVjZSB0cDsNCisgICAgRlhfVFBPIHRwbzsNCisgICAgQ0ZYX1R4dENoYXIgKnBUQzsNCisgICAgRlhfSU5UMzIgaSwgajsNCisgICAgQ0ZYX1R4dENoYXJBcnJheSAmY2hhcnMgPSAqbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgIEZYX0JPT0wgYkRvbmUgPSAobV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwIHx8IG1fYkN1clJUTCk7DQorICAgIGlmICghbV9iUGFnaW5hdGlvbiAmJiBiRG9uZSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUJpZGlOdW0gPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgICAgICAgcFRDLT5tX2lCaWRpUG9zID0gaTsNCisgICAgICAgICAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgICAgICAgICAgaUJpZGlOdW0gPSBpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9CaWRpTGluZShjaGFycywgaUJpZGlOdW0gKyAxLCBtX2JDdXJSVEwgPyAxIDogMCk7DQorICAgIH0NCisgICAgQ0ZYX1R4dFBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KKyAgICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgKGJEb25lIHx8IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfTXV0aXBsZUZvcm1hdCkgIT0gMCkpIHsNCisgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrOw0KKyAgICAgICAgdHAubV9pU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsNCisgICAgICAgIHRwLm1fcENoYXJzID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzOw0KKyAgICAgICAgRlhfSU5UMzIgaUJpZGlMZXZlbCA9IC0xLCBpQ2hhcldpZHRoOw0KKyAgICAgICAgaSA9IDAsIGogPSAtMTsNCisgICAgICAgIHdoaWxlIChpIDwgaUNvdW50KSB7DQorICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsNCisgICAgICAgICAgICBpZiAoaUJpZGlMZXZlbCA8IDApIHsNCisgICAgICAgICAgICAgICAgaUJpZGlMZXZlbCA9IHBUQy0+bV9pQmlkaUxldmVsOw0KKyAgICAgICAgICAgICAgICB0cC5tX2lXaWR0aCA9IDA7DQorICAgICAgICAgICAgICAgIHRwLm1faUJpZGlMZXZlbCA9IGlCaWRpTGV2ZWw7DQorICAgICAgICAgICAgICAgIHRwLm1faUJpZGlQb3MgPSBwVEMtPm1faUJpZGlPcmRlcjsNCisgICAgICAgICAgICAgICAgdHAubV9kd0NoYXJTdHlsZXMgPSBwVEMtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICAgICAgICAgICAgICB0cC5tX3BVc2VyRGF0YSA9IHBUQy0+bV9wVXNlckRhdGE7DQorICAgICAgICAgICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICAgICAgICAgICAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWFsU2NhbGU7DQorICAgICAgICAgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaUJpZGlMZXZlbCAhPSBwVEMtPm1faUJpZGlMZXZlbCB8fCBwVEMtPm1fZHdTdGF0dXMgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBpZiAoaUJpZGlMZXZlbCA9PSBwVEMtPm1faUJpZGlMZXZlbCkgew0KKyAgICAgICAgICAgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsNCisgICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpICsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHRwLm1faUNoYXJzID0gaSAtIHRwLm1faVN0YXJ0Q2hhcjsNCisgICAgICAgICAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgICAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQorICAgICAgICAgICAgICAgIHRwLm1faVN0YXJ0Q2hhciA9IGk7DQorICAgICAgICAgICAgICAgIHRwby5pbmRleCA9ICsrIGo7DQorICAgICAgICAgICAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOw0KKyAgICAgICAgICAgICAgICB0cG9zLkFkZCh0cG8pOw0KKyAgICAgICAgICAgICAgICBpQmlkaUxldmVsID0gLTE7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaSArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaSA+IHRwLm1faVN0YXJ0Q2hhcikgew0KKyAgICAgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7DQorICAgICAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgICAgICB0cG8uaW5kZXggPSArKyBqOw0KKyAgICAgICAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOw0KKyAgICAgICAgICAgIHRwb3MuQWRkKHRwbyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaiA+IC0xKSB7DQorICAgICAgICAgICAgaWYgKGogPiAwKSB7DQorICAgICAgICAgICAgICAgIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KHRwb3MsIDAsIGopOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU3RhcnRQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQorICAgICAgICAgICAgICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgICAgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnRQb3M7DQorICAgICAgICAgICAgICAgICAgICBpU3RhcnRQb3MgKz0gdHRwLm1faVdpZHRoOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9UeHRQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQoaik7DQorICAgICAgICAgICAgdHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgICAgICB0cC5tX2lXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gMDsNCisgICAgICAgIHRwLm1faUNoYXJzID0gaUNvdW50Ow0KKyAgICAgICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICAgICAgICB0cC5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOw0KKyAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cigwKTsNCisgICAgICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsNCisgICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgIHRwby5pbmRleCA9IDA7DQorICAgICAgICB0cG8ucG9zID0gMDsNCisgICAgICAgIHRwb3MuQWRkKHRwbyk7DQorICAgIH0NCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChDRlhfVFBPQXJyYXkgJnRwb3MsIEZYX0JPT0wgYkFsbENoYXJzLCBGWF9EV09SRCBkd1N0YXR1cykNCit7DQorICAgIEZYX0lOVDMyIGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoLCBpR2FwQ2hhcnMgPSAwLCBpQ2hhcldpZHRoOw0KKyAgICBDRlhfVHh0UGllY2VBcnJheSAqcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQorICAgIEZYX0lOVDMyIGksIGosIGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOw0KKyAgICBGWF9UUE8gdHBvOw0KKyAgICBDRlhfVHh0Q2hhciAqcFRDOw0KKyAgICBGWF9EV09SRCBkd0NoYXJUeXBlOw0KKyAgICBmb3IgKGkgPSBpQ291bnQgLSAxOyBpID4gLTE7IGkgLS0pIHsNCisgICAgICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQorICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgICBpZiAoIWJGaW5kKSB7DQorICAgICAgICAgICAgaU5ldFdpZHRoID0gdHRwLkdldEVuZFBvcygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiQXJhYmljID0gRlhfSXNPZGQodHRwLm1faUJpZGlMZXZlbCk7DQorICAgICAgICBqID0gYkFyYWJpYyA/IDAgOiB0dHAubV9pQ2hhcnMgLSAxOw0KKyAgICAgICAgd2hpbGUgKGogPiAtMSAmJiBqIDwgdHRwLm1faUNoYXJzKSB7DQorICAgICAgICAgICAgcFRDID0gdHRwLkdldENoYXJQdHIoaik7DQorICAgICAgICAgICAgaWYgKHBUQy0+bV9uQnJlYWtUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQorICAgICAgICAgICAgICAgIGlHYXBDaGFycyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFiRmluZCB8fCAhYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgICAgIGR3Q2hhclR5cGUgPSBwVEMtPkdldENoYXJUeXBlKCk7DQorICAgICAgICAgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmluZCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkFsbENoYXJzICYmIGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlOZXRXaWR0aCAtPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaiArPSBiQXJhYmljID8gMSA6IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiQWxsQ2hhcnMgJiYgYkZpbmQpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpT2Zmc2V0ID0gbV9pTGluZVdpZHRoIC0gaU5ldFdpZHRoOw0KKyAgICBGWF9JTlQzMiBpTG93ZXJBbGlnbm1lbnQgPSAobV9pQ3VyQWxpZ25tZW50ICYgRlhfVFhUTElORUFMSUdOTUVOVF9Mb3dlck1hc2spOw0KKyAgICBGWF9JTlQzMiBpSGlnaGVyQWxpZ25tZW50ID0gKG1faUN1ckFsaWdubWVudCAmIEZYX1RYVExJTkVBTElHTk1FTlRfSGlnaGVyTWFzayk7DQorICAgIGlmIChpR2FwQ2hhcnMgPiAwICYmIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgfHwgKGlIaWdoZXJBbGlnbm1lbnQgPT0gRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgJiYgZHdTdGF0dXMgIT0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gLTE7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgICAgICAgaWYgKGlTdGFydCA8IC0xKSB7DQorICAgICAgICAgICAgICAgIGlTdGFydCA9IHR0cC5tX2lTdGFydFBvczsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIGs7DQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHR0cC5tX2lDaGFyczsgaiArKykgew0KKyAgICAgICAgICAgICAgICBwVEMgPSB0dHAuR2V0Q2hhclB0cihqKTsNCisgICAgICAgICAgICAgICAgaWYgKHBUQy0+bV9uQnJlYWtUeXBlICE9IEZYX0xCVF9ESVJFQ1RfQlJLIHx8IHBUQy0+bV9pQ2hhcldpZHRoIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgayA9IGlPZmZzZXQgLyBpR2FwQ2hhcnM7DQorICAgICAgICAgICAgICAgIHBUQy0+bV9pQ2hhcldpZHRoICs9IGs7DQorICAgICAgICAgICAgICAgIHR0cC5tX2lXaWR0aCArPSBrOw0KKyAgICAgICAgICAgICAgICBpT2Zmc2V0IC09IGs7DQorICAgICAgICAgICAgICAgIGlHYXBDaGFycyAtLTsNCisgICAgICAgICAgICAgICAgaWYgKGlHYXBDaGFycyA8IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlTdGFydCArPSB0dHAubV9pV2lkdGg7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoaUxvd2VyQWxpZ25tZW50ID4gRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0KSB7DQorICAgICAgICBpZiAoaUxvd2VyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyKSB7DQorICAgICAgICAgICAgaU9mZnNldCAvPSAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlPZmZzZXQgPiAwKSB7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KGkpOw0KKyAgICAgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgKz0gaU9mZnNldDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cykNCit7DQorICAgIEZYU1lTX2Fzc2VydChkd1N0YXR1cyA+PSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrICYmIGR3U3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BhZ2VCcmVhayk7DQorICAgIENGWF9UeHRQaWVjZUFycmF5ICpwQ3VyUGllY2VzID0gbV9wQ3VyTGluZS0+bV9wTGluZVBpZWNlczsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOw0KKyAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgQ0ZYX1R4dFBpZWNlICpwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoLS0gaUNvdW50KTsNCisgICAgICAgIGlmIChkd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgICAgICBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gcExhc3RQaWVjZS0+bV9kd1N0YXR1czsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9UeHRMaW5lICpwTGFzdExpbmUgPSBHZXRUeHRMaW5lKFRSVUUpOw0KKyAgICAgICAgaWYgKHBMYXN0TGluZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcEN1clBpZWNlcyA9IHBMYXN0TGluZS0+bV9wTGluZVBpZWNlczsNCisgICAgICAgICAgICBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICAgICAgICAgICAgaWYgKGlDb3VudCAtLSA+IDApIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1R4dFBpZWNlICpwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoaUNvdW50KTsNCisgICAgICAgICAgICAgICAgaWYgKGR3U3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgICAgICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorICAgICAgICB9DQorICAgICAgICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgICAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgICAgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgICAgICAgQ0ZYX1R4dENoYXIgKnBUQyA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoaUNvdW50IC0gMSk7DQorICAgICAgICAgICAgcFRDLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdTdGF0dXMgPD0gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX2lSZWFkeSA9IChtX3BDdXJMaW5lID09IG1fcFR4dExpbmUxKSA/IDEgOiAyOw0KKyAgICBDRlhfVHh0TGluZSAqcE5leHRMaW5lID0gKG1fcEN1ckxpbmUgPT0gbV9wVHh0TGluZTEpID8gbV9wVHh0TGluZTIgOiBtX3BUeHRMaW5lMTsNCisgICAgRlhfQk9PTCBiQWxsQ2hhcnMgPSAobV9pQ3VyQWxpZ25tZW50ID4gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodCk7DQorICAgIENGWF9UUE9BcnJheSB0cG9zOw0KKyAgICBDRlhfQ2hhciAqcFRDOw0KKyAgICBpZiAobV9iQXJhYmljU2hhcGVzKSB7DQorICAgICAgICBFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsNCisgICAgfQ0KKyAgICBpZiAoRW5kQnJlYWtfU3BsaXRMaW5lKHBOZXh0TGluZSwgYkFsbENoYXJzLCBkd1N0YXR1cykpIHsNCisgICAgICAgIGdvdG8gRW5kQnJlYWtfUmV0Ow0KKyAgICB9DQorICAgIEVuZEJyZWFrX0JpZGlMaW5lKHRwb3MsIGR3U3RhdHVzKTsNCisgICAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1faUN1ckFsaWdubWVudCA+IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICAgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOw0KKyAgICB9DQorRW5kQnJlYWtfUmV0Og0KKyAgICBtX3BDdXJMaW5lID0gcE5leHRMaW5lOw0KKyAgICBwVEMgPSBHZXRMYXN0Q2hhcigwLCBGQUxTRSk7DQorICAgIG1fZHdDaGFyVHlwZSA9IHBUQyA9PSBOVUxMID8gMCA6IHBUQy0+R2V0Q2hhclR5cGUoKTsNCisgICAgaWYgKGR3U3RhdHVzID09IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKSB7DQorICAgICAgICBtX2lBcmFiaWNDb250ZXh0ID0gbV9pQ3VyQXJhYmljQ29udGV4dCA9IDE7DQorICAgICAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdTdGF0dXM7DQorfQ0KK0ZYX0lOVDMyIENGWF9UeHRCcmVhazo6R2V0QnJlYWtQb3MoQ0ZYX1R4dENoYXJBcnJheSAmY2EsIEZYX0lOVDMyICZpRW5kUG9zLCBGWF9CT09MIGJBbGxDaGFycywgRlhfQk9PTCBiT25seUJyaykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBjYS5HZXRTaXplKCkgLSAxOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlCcmVhayA9IC0xLCBpQnJlYWtQb3MgPSAtMSwgaUluZGlyZWN0ID0gLTEsIGlJbmRpcmVjdFBvcyA9IC0xLCBpTGFzdCA9IC0xLCBpTGFzdFBvcyA9IC0xOw0KKyAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCkgew0KKyAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCisgICAgICAgICAgICByZXR1cm4gaUxlbmd0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlCcmVhayA9IGlMZW5ndGg7DQorICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlNwYWNlQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMDsNCisgICAgRlhfQk9PTCBiTnVtYmVyQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWspICE9IDA7DQorICAgIEZYX0xJTkVCUkVBS1RZUEUgZVR5cGU7DQorICAgIEZYX0RXT1JEIG5Db2RlUHJvcCwgbkN1ciwgbk5leHQ7DQorICAgIENGWF9DaGFyICpwQ3VyID0gY2EuR2V0RGF0YVB0cihpTGVuZ3RoIC0tKTsNCisgICAgaWYgKGJBbGxDaGFycykgew0KKyAgICAgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICAgIH0NCisgICAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsNCisgICAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgIEZYX0lOVDMyIGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KKyAgICB9DQorICAgIHdoaWxlIChpTGVuZ3RoID49IDApIHsNCisgICAgICAgIHBDdXIgPSBjYS5HZXREYXRhUHRyKGlMZW5ndGgpOw0KKyAgICAgICAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsNCisgICAgICAgIG5DdXIgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgICAgICBpZiAobkN1ciA9PSBGWF9DQlBfU1ApIHsNCisgICAgICAgICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1NQKSB7DQorICAgICAgICAgICAgICAgIGVUeXBlID0gYlNwYWNlQnJlYWsgPyBGWF9MQlRfRElSRUNUX0JSSyA6IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlVHlwZSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUgKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsgKG5DdXIgPDwgNSkgKyBuTmV4dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChiTnVtYmVyQnJlYWsgJiYgbkN1ciA9PSBGWF9DQlBfTlUgJiYgbk5leHQgPT0gRlhfQ0JQX05VKSB7DQorICAgICAgICAgICAgZVR5cGUgPSBGWF9MQlRfRElSRUNUX0JSSzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgICAgICAgICBlVHlwZSA9IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlVHlwZSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUgKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsgKG5DdXIgPDwgNSkgKyBuTmV4dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJBbGxDaGFycykgew0KKyAgICAgICAgICAgIHBDdXItPm1fbkJyZWFrVHlwZSA9IChGWF9CWVRFKWVUeXBlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiT25seUJyaykgew0KKyAgICAgICAgICAgIGlmIChtX2JTaW5nbGVMaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZVdpZHRoIHx8IChuQ3VyID09IEZYX0NCUF9TUCAmJiAhYlNwYWNlQnJlYWspKSB7DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSyAmJiBpQnJlYWsgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpQnJlYWsgPSBpTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgaUJyZWFrUG9zID0gaUVuZFBvczsNCisgICAgICAgICAgICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRlhfTEJUX0lORElSRUNUX0JSSyAmJiBpSW5kaXJlY3QgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpSW5kaXJlY3QgPSBpTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgaUluZGlyZWN0UG9zID0gaUVuZFBvczsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaUxhc3QgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpTGFzdCA9IGlMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICBpTGFzdFBvcyA9IGlFbmRQb3M7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KKyAgICAgICAgaUxlbmd0aCAtLTsNCisgICAgfQ0KKyAgICBpZiAoYk9ubHlCcmspIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmIChpQnJlYWsgPiAtMSkgew0KKyAgICAgICAgaUVuZFBvcyA9IGlCcmVha1BvczsNCisgICAgICAgIHJldHVybiBpQnJlYWs7DQorICAgIH0NCisgICAgaWYgKGlJbmRpcmVjdCA+IC0xKSB7DQorICAgICAgICBpRW5kUG9zID0gaUluZGlyZWN0UG9zOw0KKyAgICAgICAgcmV0dXJuIGlJbmRpcmVjdDsNCisgICAgfQ0KKyAgICBpZiAoaUxhc3QgPiAtMSkgew0KKyAgICAgICAgaUVuZFBvcyA9IGlMYXN0UG9zOw0KKyAgICAgICAgcmV0dXJuIGlMYXN0Ow0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U3BsaXRUZXh0TGluZShDRlhfVHh0TGluZSAqcEN1ckxpbmUsIENGWF9UeHRMaW5lICpwTmV4dExpbmUsIEZYX0JPT0wgYkFsbENoYXJzKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBDdXJMaW5lICE9IE5VTEwgJiYgcE5leHRMaW5lICE9IE5VTEwpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBpZiAoaUNvdW50IDwgMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlFbmRQb3MgPSBwQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIENGWF9UeHRDaGFyQXJyYXkgJmN1ckNoYXJzID0gKnBDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICAgIEZYX0lOVDMyIGlDaGFyUG9zID0gR2V0QnJlYWtQb3MoY3VyQ2hhcnMsIGlFbmRQb3MsIGJBbGxDaGFycywgRkFMU0UpOw0KKyAgICBpZiAoaUNoYXJQb3MgPCAwKSB7DQorICAgICAgICBpQ2hhclBvcyA9IDA7DQorICAgIH0NCisgICAgaUNoYXJQb3MgKys7DQorICAgIGlmIChpQ2hhclBvcyA+PSBpQ291bnQpIHsNCisgICAgICAgIHBOZXh0TGluZS0+UmVtb3ZlQWxsKFRSVUUpOw0KKyAgICAgICAgQ0ZYX0NoYXIgKnBUQyA9IGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MgLSAxKTsNCisgICAgICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1R4dENoYXJBcnJheSAmbmV4dENoYXJzID0gKnBOZXh0TGluZS0+bV9wTGluZUNoYXJzOw0KKyAgICBpbnQgY3VyX3NpemUgPSBjdXJDaGFycy5HZXRTaXplKCk7DQorICAgIG5leHRDaGFycy5TZXRTaXplKGN1cl9zaXplIC0gaUNoYXJQb3MpOw0KKyAgICBGWFNZU19tZW1jcHkobmV4dENoYXJzLkdldERhdGEoKSwgY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyksIChjdXJfc2l6ZSAtIGlDaGFyUG9zKSAqIHNpemVvZihDRlhfVHh0Q2hhcikpOw0KKyAgICBpQ291bnQgLT0gaUNoYXJQb3M7DQorICAgIGN1cl9zaXplID0gY3VyQ2hhcnMuR2V0U2l6ZSgpOw0KKyAgICBjdXJDaGFycy5SZW1vdmVBdChjdXJfc2l6ZSAtIGlDb3VudCwgaUNvdW50KTsNCisgICAgcEN1ckxpbmUtPm1faVdpZHRoID0gaUVuZFBvczsNCisgICAgQ0ZYX1R4dENoYXIgKnBUQyA9IGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MgLSAxKTsNCisgICAgcFRDLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCisgICAgaUNvdW50ID0gbmV4dENoYXJzLkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaUNoYXJXaWR0aCwgaVdpZHRoID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgcFRDID0gbmV4dENoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCisgICAgICAgICAgICBwQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgLS07DQorICAgICAgICAgICAgcE5leHRMaW5lLT5tX2lBcmFiaWNDaGFycyArKzsNCisgICAgICAgIH0NCisgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgIGlXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHBUQy0+bV9kd1N0YXR1cyA9IDA7DQorICAgIH0NCisgICAgcE5leHRMaW5lLT5tX2lXaWR0aCA9IGlXaWR0aDsNCit9DQorRlhfSU5UMzIgQ0ZYX1R4dEJyZWFrOjpDb3VudEJyZWFrQ2hhcnMoKSBjb25zdA0KK3sNCisgICAgQ0ZYX1R4dExpbmUgKnBUeHRMaW5lID0gR2V0VHh0TGluZShUUlVFKTsNCisgICAgcmV0dXJuIHBUeHRMaW5lID09IE5VTEwgPyAwIDogcFR4dExpbmUtPkNvdW50Q2hhcnMoKTsNCit9DQorRlhfSU5UMzIgQ0ZYX1R4dEJyZWFrOjpDb3VudEJyZWFrUGllY2VzKCkgY29uc3QNCit7DQorICAgIENGWF9UeHRQaWVjZUFycmF5ICpwVHh0UGllY2VzID0gR2V0VHh0UGllY2VzKFRSVUUpOw0KKyAgICBpZiAocFR4dFBpZWNlcyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gcFR4dFBpZWNlcy0+R2V0U2l6ZSgpOw0KK30NCitjb25zdCBDRlhfVHh0UGllY2UqIENGWF9UeHRCcmVhazo6R2V0QnJlYWtQaWVjZShGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIENGWF9UeHRQaWVjZUFycmF5ICpwVHh0UGllY2VzID0gR2V0VHh0UGllY2VzKFRSVUUpOw0KKyAgICBpZiAocFR4dFBpZWNlcyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBUeHRQaWVjZXMtPkdldFNpemUoKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBUeHRQaWVjZXMtPkdldFB0ckF0KGluZGV4KTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OkNsZWFyQnJlYWtQaWVjZXMoKQ0KK3sNCisgICAgQ0ZYX1R4dExpbmUgKnBUeHRMaW5lID0gR2V0VHh0TGluZShUUlVFKTsNCisgICAgaWYgKHBUeHRMaW5lICE9IE5VTEwpIHsNCisgICAgICAgIHBUeHRMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQorICAgIH0NCisgICAgbV9pUmVhZHkgPSAwOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6UmVzZXQoKQ0KK3sNCisgICAgbV9kd0NoYXJUeXBlID0gMDsNCisgICAgbV9pQXJhYmljQ29udGV4dCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPSAxOw0KKyAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgICAgbV9wVHh0TGluZTEtPlJlbW92ZUFsbChUUlVFKTsNCisgICAgbV9wVHh0TGluZTItPlJlbW92ZUFsbChUUlVFKTsNCit9DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZPUk1DSEFSIHsNCisgICAgRlhfV09SRAkJd2NoOw0KKyAgICBGWF9XT1JECQl3Rm9ybTsNCisgICAgRlhfSU5UMzIJaVdpZHRoOw0KK30gRlhfRk9STUNIQVIsICogRlhfTFBGT1JNQ0hBUjsNCit0eXBlZGVmIEZYX0ZPUk1DSEFSIGNvbnN0ICogRlhfTFBDRk9STUNIQVI7DQorRlhfSU5UMzIgQ0ZYX1R4dEJyZWFrOjpHZXREaXNwbGF5UG9zKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlICwgQ0ZYX1dpZGVTdHJpbmcgKnBXU0Zvcm1zICwgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyApIGNvbnN0DQorew0KKyAgICBpZiAocFR4dFJ1biA9PSBOVUxMIHx8IHBUeHRSdW4tPmlMZW5ndGggPCAxKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBJRlhfVHh0QWNjZXNzICpwQWNjZXNzID0gcFR4dFJ1bi0+cEFjY2VzczsNCisgICAgRlhfTFBWT0lEIHBJZGVudGl0eSA9IHBUeHRSdW4tPnBJZGVudGl0eTsNCisgICAgRlhfTFBDV1NUUiBwU3RyID0gcFR4dFJ1bi0+cFN0cjsNCisgICAgRlhfSU5UMzIgKnBXaWR0aHMgPSBwVHh0UnVuLT5wV2lkdGhzOw0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcFR4dFJ1bi0+aUxlbmd0aCAtIDE7DQorICAgIElGWF9Gb250ICpwRm9udCA9IHBUeHRSdW4tPnBGb250Ow0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IHBUeHRSdW4tPmR3U3R5bGVzOw0KKyAgICBDRlhfUmVjdEYgcnRUZXh0KCpwVHh0UnVuLT5wUmVjdCk7DQorICAgIEZYX0JPT0wgYlJUTFBpZWNlID0gKHBUeHRSdW4tPmR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwpICE9IDA7DQorICAgIEZYX0JPT0wgYkFyYWJpY051bWJlciA9IChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KKyAgICBGWF9CT09MIGJBcmFiaWNDb21tYSA9IChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUeHRSdW4tPmZGb250U2l6ZTsNCisgICAgRlhfSU5UMzIgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgICBGWF9JTlQzMiBpQXNjZW50ID0gcEZvbnQtPkdldEFzY2VudCgpOw0KKyAgICBGWF9JTlQzMiBpRGVzY2VudCA9IHBGb250LT5HZXREZXNjZW50KCk7DQorICAgIEZYX0lOVDMyIGlNYXhIZWlnaHQgPSBpQXNjZW50IC0gaURlc2NlbnQ7DQorICAgIEZYX0ZMT0FUIGZGb250SGVpZ2h0ID0gZkZvbnRTaXplOw0KKyAgICBGWF9GTE9BVCBmQXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaUFzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgICBGWF9GTE9BVCBmRGVzY2VudCA9IGZGb250SGVpZ2h0ICogKEZYX0ZMT0FUKWlEZXNjZW50IC8gKEZYX0ZMT0FUKWlNYXhIZWlnaHQ7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsRG9jID0gKGR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpICE9IDA7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsQ2hhciA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQorICAgIEZYX0lOVDMyIGlSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihkd1N0eWxlcykgKyBwVHh0UnVuLT5pQ2hhclJvdGF0aW9uOw0KKyAgICBGWF9JTlQzMiBpQ2hhclJvdGF0aW9uOw0KKyAgICBGWF9XQ0hBUiB3Y2gsIHdQcmV2ID0gMHhGRUZGLCB3TmV4dCwgd0Zvcm0sIHdMYXN0ID0gMHhGRUZGOw0KKyAgICBGWF9JTlQzMiBpV2lkdGgsIGlDaGFyV2lkdGgsIGlDaGFySGVpZ2h0Ow0KKyAgICBGWF9GTE9BVCBmWCwgZlksIGZDaGFyV2lkdGgsIGZDaGFySGVpZ2h0Ow0KKyAgICBGWF9JTlQzMiBpSG9yU2NhbGUgPSBwVHh0UnVuLT5pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICBGWF9JTlQzMiBpVmVyU2NhbGUgPSBwVHh0UnVuLT5pVmVydGljYWxTY2FsZTsNCisgICAgRlhfQk9PTCBiU2tpcFNwYWNlID0gcFR4dFJ1bi0+YlNraXBTcGFjZTsNCisgICAgRlhfQk9PTCBiRW1wdHlDaGFyLCBiU2hhZGRhID0gRkFMU0UsIGJMYW0gPSBGQUxTRTsNCisgICAgRlhfRFdPUkQgZHdQcm9wcywgZHdDaGFyVHlwZTsNCisgICAgRlhfRk9STUNIQVIgZm9ybUNoYXJzWzNdOw0KKyAgICBGWF9GTE9BVCBmWUJhc2U7DQorICAgIGZYID0gcnRUZXh0LmxlZnQ7DQorICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgIGZYICs9IChydFRleHQud2lkdGggLSBmRm9udFNpemUpIC8gMi4wZjsNCisgICAgICAgIGZZQmFzZSA9IGJSVExQaWVjZSA/IHJ0VGV4dC5ib3R0b20oKSA6IHJ0VGV4dC50b3A7DQorICAgICAgICBmWSA9IGZZQmFzZTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICAgICAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZllCYXNlID0gcnRUZXh0LnRvcCArIChydFRleHQuaGVpZ2h0IC0gZkZvbnRTaXplKSAvIDIuMGY7DQorICAgICAgICBmWSA9IGZZQmFzZSArIGZBc2NlbnQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMCwgaU5leHQsIGlGb3JtczsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8PSBpTGVuZ3RoOyBpICsrKSB7DQorICAgICAgICBpZiAocEFjY2VzcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgd2NoID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGkpOw0KKyAgICAgICAgICAgIGlXaWR0aCA9IHBBY2Nlc3MtPkdldFdpZHRoKHBJZGVudGl0eSwgaSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdjaCA9ICpwU3RyICsrOw0KKyAgICAgICAgICAgIGlXaWR0aCA9ICpwV2lkdGhzICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7DQorICAgICAgICBkd0NoYXJUeXBlID0gKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCisgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgaVdpZHRoID09IDApIHsNCisgICAgICAgICAgICB3UHJldiA9IDB4RkVGRjsNCisgICAgICAgICAgICB3TGFzdCA9IHdjaDsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCisgICAgICAgICAgICBpZiAoaSA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaU5leHQgPSBpICsgMTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpTmV4dCA8PSBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd05leHQgPSBwQWNjZXNzLT5HZXRDaGFyKHBJZGVudGl0eSwgaU5leHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TmV4dCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlOZXh0ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlOZXh0ID4gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaiA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgZG8gew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGogKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcFN0cltqXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod05leHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbik7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIod2NoLCB3UHJldiwgd05leHQpOw0KKyAgICAgICAgICAgIGJMYW0gPSAod1ByZXYgPT0gMHgwNjQ0ICYmIHdjaCA9PSAweDA2NDQgJiYgd05leHQgPT0gMHgwNjQ3KTsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgICAgICAgIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTEpIHsNCisgICAgICAgICAgICAgICAgaWYgKGJTaGFkZGEpIHsNCisgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gMHhGRUZGOw0KKyAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEFjY2VzcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaU5leHQgPSBpICsgMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TmV4dCA9IHBBY2Nlc3MtPkdldENoYXIocElkZW50aXR5LCBpTmV4dCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAod2NoID09IDB4MDY1MSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3TmV4dCA+PSAweDA2NEMgJiYgd05leHQgPD0gMHgwNjUwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdOZXh0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod05leHQgPT0gMHgwNjUxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdjaCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTaGFkZGEgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJTaGFkZGEgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgew0KKyAgICAgICAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgICAgICAgIGlmIChiQXJhYmljTnVtYmVyKSB7DQorICAgICAgICAgICAgICAgIHdGb3JtICs9IDB4MDYzMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJy4nKSB7DQorICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgICAgICAgaWYgKGJBcmFiaWNOdW1iZXIpIHsNCisgICAgICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQorICAgICAgICAgICAgICAgIGlmIChwQWNjZXNzICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIGlOZXh0ID0gaSArIDE7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gKnBTdHI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHdOZXh0ID49IEwnMCcgJiYgd05leHQgPD0gTCc5Jykgew0KKyAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSAweDA2NkI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJywnKSB7DQorICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgICAgICAgaWYgKGJBcmFiaWNDb21tYSkgew0KKyAgICAgICAgICAgICAgICB3Rm9ybSA9IDB4MDYwQzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGJSVExQaWVjZSB8fCBiVmVydGljYWxDaGFyKSB7DQorICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHdjaCwgZHdQcm9wcywgYlJUTFBpZWNlLCBiVmVydGljYWxDaGFyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICAgIGJTaGFkZGEgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd0NoYXJUeXBlIDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgICAgICAgIGJMYW0gPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Rm9ybSk7DQorICAgICAgICBpQ2hhclJvdGF0aW9uID0gaVJvdGF0aW9uOw0KKyAgICAgICAgaWYgKGJWZXJ0aWNhbENoYXIgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgICAgICBpQ2hhclJvdGF0aW9uICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNoYXJSb3RhdGlvbiAlPSA0Ow0KKyAgICAgICAgYkVtcHR5Q2hhciA9IChkd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX1RhYiAmJiBkd0NoYXJUeXBlIDw9IEZYX0NIQVJUWVBFX0NvbnRyb2wpOw0KKyAgICAgICAgaWYgKHdGb3JtID09IDB4RkVGRikgew0KKyAgICAgICAgICAgIGJFbXB0eUNoYXIgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUZvcm1zID0gYkxhbSA/IDMgOiAxOw0KKyAgICAgICAgaUNvdW50ICs9IChiRW1wdHlDaGFyICYmIGJTa2lwU3BhY2UpID8gMCA6IGlGb3JtczsNCisgICAgICAgIGlmIChwQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgICAgICAgICAgaWYgKGlXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgd1ByZXYgPSB3Y2g7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdMYXN0ID0gd2NoOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNoYXJXaWR0aCA9IGlXaWR0aDsNCisgICAgICAgIGlmIChpQ2hhcldpZHRoIDwgMCkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSAtaUNoYXJXaWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlDaGFyV2lkdGggLz0gaUZvbnRTaXplOw0KKyAgICAgICAgZm9ybUNoYXJzWzBdLndjaCA9IHdjaDsNCisgICAgICAgIGZvcm1DaGFyc1swXS53Rm9ybSA9IHdGb3JtOw0KKyAgICAgICAgZm9ybUNoYXJzWzBdLmlXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgICAgICBpZiAoYkxhbSkgew0KKyAgICAgICAgICAgIGZvcm1DaGFyc1sxXS53Rm9ybSA9IDB4MDY1MTsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gMDsNCisgICAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKDB4MDY1MSwgaUNoYXJXaWR0aCwgRkFMU0UpOw0KKyAgICAgICAgICAgIGZvcm1DaGFyc1sxXS5pV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIGZvcm1DaGFyc1syXS53Rm9ybSA9IDB4MDY3MDsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gMDsNCisgICAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKDB4MDY3MCwgaUNoYXJXaWR0aCwgRkFMU0UpOw0KKyAgICAgICAgICAgIGZvcm1DaGFyc1syXS5pV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlGb3JtczsgaiArKykgew0KKyAgICAgICAgICAgIHdGb3JtID0gKEZYX1dDSEFSKWZvcm1DaGFyc1tqXS53Rm9ybTsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gZm9ybUNoYXJzW2pdLmlXaWR0aDsNCisgICAgICAgICAgICBpZiAoaiA+IDApIHsNCisgICAgICAgICAgICAgICAgZHdDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOw0KKyAgICAgICAgICAgICAgICB3Y2ggPSB3Rm9ybTsNCisgICAgICAgICAgICAgICAgd0xhc3QgPSAoRlhfV0NIQVIpZm9ybUNoYXJzW2ogLSAxXS53Rm9ybTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFiRW1wdHlDaGFyIHx8IChiRW1wdHlDaGFyICYmICFiU2tpcFNwYWNlKSkgew0KKyAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID0gYkNoYXJDb2RlID8gd2NoIDogcEZvbnQtPkdldEdseXBoSW5kZXgod0Zvcm0sIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fRXh0R0lEID0gcENoYXJQb3MtPm1fR2x5cGhJbmRleDsNCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fRm9udENoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgIGlmIChwV1NGb3Jtcykgew0KKyAgICAgICAgICAgICAgICAgICAgKnBXU0Zvcm1zICs9IHdGb3JtOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgICAgICAgaUNoYXJIZWlnaHQgPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpQ2hhckhlaWdodCA9IDEwMDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsNCisgICAgICAgICAgICBmQ2hhckhlaWdodCA9IGZGb250U2l6ZSAqIGlDaGFySGVpZ2h0IC8gMTAwMC4wZjsNCisgICAgICAgICAgICBpZiAoYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgICAgICAgICAgZlkgLT0gZkNoYXJIZWlnaHQ7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBmWCAtPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhciB8fCAoYkVtcHR5Q2hhciAmJiAhYlNraXBTcGFjZSkpIHsNCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCA9IGZYOw0KKyAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZID0gZlk7DQorICAgICAgICAgICAgICAgIGlmICgoZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dCkgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUZvcm1XaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpRm9ybVdpZHRoLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmT2Zmc2V0ID0gZkZvbnRTaXplICogKGlDaGFyV2lkdGggLSBpRm9ybVdpZHRoKSAvIDIwMDAuMGY7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmT2Zmc2V0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZPZmZzZXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCisgICAgICAgICAgICAgICAgICAgIHJ0QkJveC5SZXNldCgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgcnRCQm94LCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZID0gZllCYXNlICsgZkZvbnRTaXplIC0gZkZvbnRTaXplICogKEZYX0ZMT0FUKXJ0QkJveC5oZWlnaHQgLyAoRlhfRkxPQVQpaU1heEhlaWdodDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmICh3Rm9ybSA9PSB3Y2ggJiYgd0xhc3QgIT0gMHhGRUZGKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdMYXN0UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TGFzdCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkd0xhc3RQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRCQm94LlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god0xhc3QsIHJ0QkJveCwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IGZGb250U2l6ZSAqIHJ0QkJveC5oZWlnaHQgLyBpTWF4SGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcHRPZmZzZXQ7DQorICAgICAgICAgICAgICAgIHB0T2Zmc2V0LlJlc2V0KCk7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkanVzdGVkID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIGlmIChwQWRqdXN0UG9zKSB7DQorICAgICAgICAgICAgICAgICAgICBiQWRqdXN0ZWQgPSBwQWRqdXN0UG9zKHdGb3JtLCBiQ2hhckNvZGUsIHBGb250LCBmRm9udFNpemUsIGJWZXJ0aWNhbENoYXIsIHB0T2Zmc2V0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoIWJBZGp1c3RlZCAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHgwMDAxMDAwMCkgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QgcnRCQm94Ow0KKyAgICAgICAgICAgICAgICAgICAgcnRCQm94LlJlc2V0KCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0T2Zmc2V0LnggPSBmRm9udFNpemUgKiAoODUwIC0gcnRCQm94LnJpZ2h0KCkpIC8gaU1heEhlaWdodDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKGlBc2NlbnQgLSBydEJCb3gudG9wIC0gMTUwKSAvIGlNYXhIZWlnaHQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBwdE9mZnNldC54Ow0KKyAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IHB0T2Zmc2V0Lnk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgICAgICAgICAgZlkgKz0gZkNoYXJIZWlnaHQ7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhciB8fCAoYkVtcHR5Q2hhciAmJiAhYlNraXBTcGFjZSkpIHsNCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgKz0gZkFzY2VudDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAtMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAtMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggLT0gZkRlc2NlbnQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQXNjZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCAtPSBmRGVzY2VudDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IGZBc2NlbnQgKyBmRGVzY2VudDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gLTE7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGlIb3JTY2FsZSAhPSAxMDAgfHwgaVZlclNjYWxlICE9IDEwMCkgew0KKyAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICogaUhvclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdICogaUhvclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBDaGFyUG9zICsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpV2lkdGggPiAwKSB7DQorICAgICAgICAgICAgd1ByZXYgPSAoRlhfV0NIQVIpZm9ybUNoYXJzWzBdLndjaDsNCisgICAgICAgIH0NCisgICAgICAgIHdMYXN0ID0gd2NoOw0KKyAgICB9DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK0ZYX0lOVDMyIENGWF9UeHRCcmVhazo6R2V0Q2hhclJlY3RzKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSwgRlhfQk9PTCBiQ2hhckJCb3ggKSBjb25zdA0KK3sNCisgICAgaWYgKHBUeHRSdW4gPT0gTlVMTCB8fCBwVHh0UnVuLT5pTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgSUZYX1R4dEFjY2VzcyAqcEFjY2VzcyA9IHBUeHRSdW4tPnBBY2Nlc3M7DQorICAgIEZYX0xQVk9JRCBwSWRlbnRpdHkgPSBwVHh0UnVuLT5wSWRlbnRpdHk7DQorICAgIEZYX0xQQ1dTVFIgcFN0ciA9IHBUeHRSdW4tPnBTdHI7DQorICAgIEZYX0lOVDMyICpwV2lkdGhzID0gcFR4dFJ1bi0+cFdpZHRoczsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBUeHRSdW4tPmlMZW5ndGg7DQorICAgIENGWF9SZWN0RiByZWN0KCpwVHh0UnVuLT5wUmVjdCk7DQorICAgIEZYX0JPT0wgYlJUTFBpZWNlID0gKHBUeHRSdW4tPmR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwpICE9IDA7DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUeHRSdW4tPmZGb250U2l6ZTsNCisgICAgRlhfSU5UMzIgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgICBGWF9GTE9BVCBmU2NhbGUgPSBmRm9udFNpemUgLyAxMDAwLjBmOw0KKyAgICBJRlhfRm9udCAqcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsNCisgICAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgICAgIGJDaGFyQkJveCA9IEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9SZWN0IGJib3g7DQorICAgIGJib3guU2V0KDAsIDAsIDAsIDApOw0KKyAgICBpZiAoYkNoYXJCQm94KSB7DQorICAgICAgICBiQ2hhckJCb3ggPSBwRm9udC0+R2V0QkJveChiYm94KTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmTGVmdCA9IEZYX01BWCgwLCBiYm94LmxlZnQgKiBmU2NhbGUpOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gRlhTWVNfZmFicyhiYm94LmhlaWdodCAqIGZTY2FsZSk7DQorICAgIHJ0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICAgIHJ0QXJyYXkuU2V0U2l6ZShpTGVuZ3RoKTsNCisgICAgRlhfQk9PTCBiVmVydGljYWwgPSAocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCisgICAgRlhfQk9PTCBiU2luZ2xlTGluZSA9IChwVHh0UnVuLT5kd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1NpbmdsZUxpbmUpICE9IDA7DQorICAgIEZYX0JPT0wgYkNvbWJUZXh0ID0gKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDA7DQorICAgIEZYX1dDSEFSIHdjaCwgd0xpbmVCcmVha0NoYXIgPSBwVHh0UnVuLT53TGluZUJyZWFrQ2hhcjsNCisgICAgRlhfSU5UMzIgaUNoYXJTaXplOw0KKyAgICBGWF9GTE9BVCBmQ2hhclNpemUsIGZTdGFydDsNCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgZlN0YXJ0ID0gYlJUTFBpZWNlID8gcmVjdC5ib3R0b20oKSA6IHJlY3QudG9wOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZlN0YXJ0ID0gYlJUTFBpZWNlID8gcmVjdC5yaWdodCgpIDogcmVjdC5sZWZ0Ow0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpICsrKSB7DQorICAgICAgICBpZiAocEFjY2VzcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgd2NoID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGkpOw0KKyAgICAgICAgICAgIGlDaGFyU2l6ZSA9IHBBY2Nlc3MtPkdldFdpZHRoKHBJZGVudGl0eSwgaSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdjaCA9ICpwU3RyICsrOw0KKyAgICAgICAgICAgIGlDaGFyU2l6ZSA9ICpwV2lkdGhzICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkNoYXJTaXplID0gKEZYX0ZMT0FUKWlDaGFyU2l6ZSAvIDIwMDAwLjBmOw0KKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gKCFiU2luZ2xlTGluZSAmJiBGWF9Jc0N0cmxDb2RlKHdjaCkpOw0KKyAgICAgICAgaWYgKCEod2NoID09IEwnXHYnIHx8IHdjaCA9PSBMJ1xmJyB8fCB3Y2ggPT0gMHgyMDI4IHx8IHdjaCA9PSAweDIwMjkgfHwgKHdMaW5lQnJlYWtDaGFyICE9IDB4RkVGRiAmJiB3Y2ggPT0gd0xpbmVCcmVha0NoYXIpKSkgew0KKyAgICAgICAgICAgIGJSZXQgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgICAgaUNoYXJTaXplID0gaUZvbnRTaXplICogNTAwOw0KKyAgICAgICAgICAgIGZDaGFyU2l6ZSA9IGZGb250U2l6ZSAvIDIuMGY7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICAgICAgcmVjdC50b3AgPSBmU3RhcnQ7DQorICAgICAgICAgICAgaWYgKGJSVExQaWVjZSkgew0KKyAgICAgICAgICAgICAgICByZWN0LnRvcCAtPSBmQ2hhclNpemU7DQorICAgICAgICAgICAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZlN0YXJ0ICs9IGZDaGFyU2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVjdC5oZWlnaHQgPSBmQ2hhclNpemU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJlY3QubGVmdCA9IGZTdGFydDsNCisgICAgICAgICAgICBpZiAoYlJUTFBpZWNlKSB7DQorICAgICAgICAgICAgICAgIHJlY3QubGVmdCAtPSBmQ2hhclNpemU7DQorICAgICAgICAgICAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZlN0YXJ0ICs9IGZDaGFyU2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVjdC53aWR0aCA9IGZDaGFyU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiQ2hhckJCb3ggJiYgIWJSZXQpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKHdjaCwgaUNoYXJXaWR0aCk7DQorICAgICAgICAgICAgRlhfRkxPQVQgZlJUTGVmdCA9IDAsIGZDaGFyV2lkdGggPSAwOw0KKyAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgICBmQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIGZTY2FsZTsNCisgICAgICAgICAgICAgICAgZlJUTGVmdCA9IGZMZWZ0Ow0KKyAgICAgICAgICAgICAgICBpZiAoYkNvbWJUZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICBmUlRMZWZ0ID0gKHJlY3Qud2lkdGggLSBmQ2hhcldpZHRoKSAvIDIuMGY7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QkJveEY7DQorICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QubGVmdCArIGZSVExlZnQ7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KKyAgICAgICAgICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZDaGFyV2lkdGg7DQorICAgICAgICAgICAgICAgIHJ0QkJveEYud2lkdGggPSBmSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBydEJCb3hGLmxlZnQgPSBGWF9NQVgocnRCQm94Ri5sZWZ0LCAwKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBydEJCb3hGLmxlZnQgPSByZWN0LmxlZnQgKyBmUlRMZWZ0Ow0KKyAgICAgICAgICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KKyAgICAgICAgICAgICAgICBydEJCb3hGLndpZHRoID0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBydEJCb3hGLnRvcCA9IEZYX01BWChydEJCb3hGLnRvcCwgMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJ0QXJyYXkuU2V0QXQoaSwgcnRCQm94Rik7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBydEFycmF5LlNldEF0KGksIHJlY3QpOw0KKyAgICB9DQorICAgIHJldHVybiBpTGVuZ3RoOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuaCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmJjNDAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuaApAQCAtMCwwICsxLDE3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9URVhUQlJFQUtfSU1QDQorI2RlZmluZSBfRlhfVEVYVEJSRUFLX0lNUA0KK2NsYXNzIENGWF9UeHRMaW5lOw0KK2NsYXNzIENGWF9UeHRicmVhazsNCitjbGFzcyBDRlhfVHh0TGluZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX1R4dExpbmUoRlhfSU5UMzIgaUJsb2NrU2l6ZSkgOiBtX2lTdGFydCgwKQ0KKyAgICAgICAgLCBtX2lXaWR0aCgwKQ0KKyAgICAgICAgLCBtX2lBcmFiaWNDaGFycygwKQ0KKyAgICB7DQorICAgICAgICBtX3BMaW5lQ2hhcnMgPSBGWF9ORVcgQ0ZYX1R4dENoYXJBcnJheTsNCisgICAgICAgIG1fcExpbmVQaWVjZXMgPSBGWFRBUkdFVF9OZXcgQ0ZYX1R4dFBpZWNlQXJyYXkoMTYpOw0KKyAgICB9DQorICAgIH5DRlhfVHh0TGluZSgpDQorICAgIHsNCisgICAgICAgIFJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIG1fcExpbmVDaGFyczsNCisgICAgICAgIEZYVEFSR0VUX0RlbGV0ZSBtX3BMaW5lUGllY2VzOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIENvdW50Q2hhcnMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wTGluZUNoYXJzLT5HZXRTaXplKCk7DQorICAgIH0NCisgICAgQ0ZYX1R4dENoYXIqIEdldENoYXJQdHIoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9wTGluZUNoYXJzLT5HZXRTaXplKCkpOw0KKyAgICAgICAgcmV0dXJuIG1fcExpbmVDaGFycy0+R2V0RGF0YVB0cihpbmRleCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgQ291bnRQaWVjZXMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wTGluZVBpZWNlcy0+R2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIENGWF9UeHRQaWVjZSogR2V0UGllY2VQdHIoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9wTGluZVBpZWNlcy0+R2V0U2l6ZSgpKTsNCisgICAgICAgIHJldHVybiBtX3BMaW5lUGllY2VzLT5HZXRQdHJBdChpbmRleCk7DQorICAgIH0NCisgICAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgJndzU3RyKSBjb25zdA0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBtX3BMaW5lQ2hhcnMtPkdldFNpemUoKTsNCisgICAgICAgIEZYX0xQV1NUUiBwQnVmID0gd3NTdHIuR2V0QnVmZmVyKGlDb3VudCk7DQorICAgICAgICBDRlhfQ2hhciAqcENoYXI7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgcENoYXIgPSBtX3BMaW5lQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgICAgICAgKnBCdWYgKysgPSAoRlhfV0NIQVIpcENoYXItPm1fd0NoYXJDb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NTdHIuUmVsZWFzZUJ1ZmZlcihpQ291bnQpOw0KKyAgICB9DQorICAgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQorICAgIHsNCisgICAgICAgIG1fcExpbmVDaGFycy0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBtX3BMaW5lUGllY2VzLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgICAgICAgIG1faVdpZHRoID0gMDsNCisgICAgICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCisgICAgfQ0KKyAgICBDRlhfVHh0Q2hhckFycmF5CSptX3BMaW5lQ2hhcnM7DQorICAgIENGWF9UeHRQaWVjZUFycmF5CSptX3BMaW5lUGllY2VzOw0KKyAgICBGWF9JTlQzMgkJCW1faVN0YXJ0Ow0KKyAgICBGWF9JTlQzMgkJCW1faVdpZHRoOw0KKyAgICBGWF9JTlQzMgkJCW1faUFyYWJpY0NoYXJzOw0KK307DQorY2xhc3MgQ0ZYX1R4dEJyZWFrIDogcHVibGljIElGWF9UeHRCcmVhaywgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfVHh0QnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcyk7DQorICAgIH5DRlhfVHh0QnJlYWsoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVdpZHRoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcyk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldExheW91dFN0eWxlcygpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldEhvcml6b250YWxTY2FsZShGWF9JTlQzMiBpU2NhbGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRWZXJ0aWNhbFNjYWxlKEZYX0lOVDMyIGlTY2FsZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldENoYXJSb3RhdGlvbihGWF9JTlQzMiBpQ2hhclJvdGF0aW9uKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRBbGlnbm1lbnQoRlhfSU5UMzIgaUFsaWdubWVudCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENvbnRleHRDaGFyU3R5bGVzKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldENvbnRleHRDaGFyU3R5bGVzKEZYX0RXT1JEIGR3Q2hhclN0eWxlcyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVNldENvbWJXaWR0aChGWF9GTE9BVCBmQ29tYldpZHRoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0VXNlckRhdGEoRlhfTFBWT0lEIHBVc2VyRGF0YSk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCUVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhayk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRCcmVha0NoYXJzKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJQ291bnRCcmVha1BpZWNlcygpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIGNvbnN0IENGWF9UeHRQaWVjZSoJCUdldEJyZWFrUGllY2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCUNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVzZXQoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0RGlzcGxheVBvcyhGWF9MUENUWFRSVU4gcFR4dFJ1biwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLCBDRlhfV2lkZVN0cmluZyAqcFdTRm9ybXMgPSBOVUxMLCBGWF9BZGp1c3RDaGFyRGlzcGxheVBvcyBwQWRqdXN0UG9zID0gTlVMTCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldENoYXJSZWN0cyhGWF9MUENUWFRSVU4gcFR4dFJ1biwgQ0ZYX1JlY3RGQXJyYXkgJnJ0QXJyYXksIEZYX0JPT0wgYkNoYXJCQm94ID0gRkFMU0UpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCUFwcGVuZENoYXJfUGFnZUxvYWQoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBGWF9EV09SRCBkd1Byb3BzKTsNCisgICAgRlhfRFdPUkQJCQlBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9DaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKTsNCisgICAgRlhfRFdPUkQJCQlBcHBlbmRDaGFyX1RhYihDRlhfQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbik7DQorICAgIEZYX0RXT1JECQkJQXBwZW5kQ2hhcl9Db250cm9sKENGWF9DaGFyICpwQ3VyQ2hhciwgRlhfSU5UMzIgaVJvdGF0aW9uKTsNCisgICAgRlhfRFdPUkQJCQlBcHBlbmRDaGFyX0FyYWJpYyhDRlhfQ2hhciAqcEN1ckNoYXIsIEZYX0lOVDMyIGlSb3RhdGlvbik7DQorICAgIEZYX0RXT1JECQkJQXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBGWF9JTlQzMiBpUm90YXRpb24pOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfRFdPUkQJCQltX2R3UG9saWNpZXM7DQorICAgIEZYX0JPT0wJCQkJbV9iUGFnaW5hdGlvbjsNCisgICAgSUZYX0FyYWJpY0NoYXIJCSptX3BBcmFiaWNDaGFyOw0KKyAgICBGWF9JTlQzMgkJCW1faUxpbmVXaWR0aDsNCisgICAgRlhfRFdPUkQJCQltX2R3TGF5b3V0U3R5bGVzOw0KKyAgICBGWF9CT09MCQkJCW1fYlZlcnRpY2FsOw0KKyAgICBGWF9CT09MCQkJCW1fYkFyYWJpY0NvbnRleHQ7DQorICAgIEZYX0JPT0wJCQkJbV9iQXJhYmljU2hhcGVzOw0KKyAgICBGWF9CT09MCQkJCW1fYlJUTDsNCisgICAgRlhfQk9PTAkJCQltX2JTaW5nbGVMaW5lOw0KKyAgICBGWF9CT09MCQkJCW1fYkNvbWJUZXh0Ow0KKyAgICBGWF9JTlQzMgkJCW1faUFyYWJpY0NvbnRleHQ7DQorICAgIEZYX0lOVDMyCQkJbV9pQ3VyQXJhYmljQ29udGV4dDsNCisgICAgSUZYX0ZvbnQJCQkqbV9wRm9udDsNCisgICAgRlhfSU5UMzIJCQltX2lGb250U2l6ZTsNCisgICAgRlhfQk9PTAkJCQltX2JFcXVpZGlzdGFudDsNCisgICAgRlhfSU5UMzIJCQltX2lUYWJXaWR0aDsNCisgICAgRlhfV0NIQVIJCQltX3dEZWZDaGFyOw0KKyAgICBGWF9XQ0hBUgkJCW1fd1BhcmFnQnJlYWtDaGFyOw0KKyAgICBGWF9JTlQzMgkJCW1faURlZkNoYXI7DQorICAgIEZYX0lOVDMyCQkJbV9pTGluZVJvdGF0aW9uOw0KKyAgICBGWF9JTlQzMgkJCW1faUNoYXJSb3RhdGlvbjsNCisgICAgRlhfSU5UMzIJCQltX2lSb3RhdGlvbjsNCisgICAgRlhfSU5UMzIJCQltX2lBbGlnbm1lbnQ7DQorICAgIEZYX0RXT1JECQkJbV9kd0NvbnRleHRDaGFyU3R5bGVzOw0KKyAgICBGWF9JTlQzMgkJCW1faUNvbWJXaWR0aDsNCisgICAgRlhfTFBWT0lECQkJbV9wVXNlckRhdGE7DQorICAgIEZYX0RXT1JECQkJbV9kd0NoYXJUeXBlOw0KKyAgICBGWF9CT09MCQkJCW1fYkN1clJUTDsNCisgICAgRlhfSU5UMzIJCQltX2lDdXJBbGlnbm1lbnQ7DQorICAgIEZYX0JPT0wJCQkJbV9iQXJhYmljTnVtYmVyOw0KKyAgICBGWF9CT09MCQkJCW1fYkFyYWJpY0NvbW1hOw0KKyAgICBDRlhfVHh0TGluZQkJCSptX3BUeHRMaW5lMTsNCisgICAgQ0ZYX1R4dExpbmUJCQkqbV9wVHh0TGluZTI7DQorICAgIENGWF9UeHRMaW5lCQkJKm1fcEN1ckxpbmU7DQorICAgIEZYX0lOVDMyCQkJbV9pUmVhZHk7DQorICAgIEZYX0lOVDMyCQkJbV9pVG9sZXJhbmNlOw0KKyAgICBGWF9JTlQzMgkJCW1faUhvclNjYWxlOw0KKyAgICBGWF9JTlQzMgkJCW1faVZlclNjYWxlOw0KKyAgICBGWF9JTlQzMgkJCW1faUNoYXJTcGFjZTsNCisgICAgdm9pZAkJCQlTZXRCcmVha1N0YXR1cygpOw0KKyAgICBGWF9JTlQzMgkJCUdldExpbmVSb3RhdGlvbihGWF9EV09SRCBkd1N0eWxlcykgY29uc3Q7DQorICAgIENGWF9UeHRDaGFyKgkJR2V0TGFzdENoYXIoRlhfSU5UMzIgaW5kZXgsIEZYX0JPT0wgYk9taXRDaGFyID0gVFJVRSkgY29uc3Q7DQorICAgIENGWF9UeHRMaW5lKgkJR2V0VHh0TGluZShGWF9CT09MIGJSZWFkeSkgY29uc3Q7DQorICAgIENGWF9UeHRQaWVjZUFycmF5KglHZXRUeHRQaWVjZXMoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KKyAgICBGWF9EV09SRAkJCUdldFVuaWZpZWRDaGFyVHlwZShGWF9EV09SRCBkd1R5cGUpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCVJlc2V0QXJhYmljQ29udGV4dCgpOw0KKyAgICB2b2lkCQkJCVJlc2V0Q29udGV4dENoYXJTdHlsZXMoKTsNCisgICAgdm9pZAkJCQlFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsNCisgICAgRlhfQk9PTAkJCQlFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1R4dExpbmUgKnBOZXh0TGluZSwgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgICAgdm9pZAkJCQlFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkgJnRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgICAgdm9pZAkJCQlFbmRCcmVha19BbGlnbm1lbnQoQ0ZYX1RQT0FycmF5ICZ0cG9zLCBGWF9CT09MIGJBbGxDaGFycywgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgICBGWF9JTlQzMgkJCUdldEJyZWFrUG9zKENGWF9UeHRDaGFyQXJyYXkgJmNhLCBGWF9JTlQzMiAmaUVuZFBvcywgRlhfQk9PTCBiQWxsQ2hhcnMgPSBGQUxTRSwgRlhfQk9PTCBiT25seUJyayA9IEZBTFNFKTsNCisgICAgdm9pZAkJCQlTcGxpdFRleHRMaW5lKENGWF9UeHRMaW5lICpwQ3VyTGluZSwgQ0ZYX1R4dExpbmUgKnBOZXh0TGluZSwgRlhfQk9PTCBiQWxsQ2hhcnMgPSBGQUxTRSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjVkNzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X3VuaWNvZGUuaCINCit2b2lkIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KENGWF9UUE9BcnJheSAmdHBvcywgRlhfSU5UMzIgaVN0YXJ0LCBGWF9JTlQzMiBpRW5kKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IHRwb3MuR2V0U2l6ZSgpKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlFbmQgPiAtMSAmJiBpRW5kIDwgdHBvcy5HZXRTaXplKCkpOw0KKyAgICBpZiAoaVN0YXJ0ID49IGlFbmQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpID0gaVN0YXJ0LCBqID0gaUVuZDsNCisgICAgRlhfVFBPICpwQ3VyID0gdHBvcy5HZXRQdHJBdChpU3RhcnQpLCAqcFNvcnQ7DQorICAgIEZYX0lOVDMyIHYgPSBwQ3VyLT5wb3M7DQorICAgIHdoaWxlIChpIDwgaikgew0KKyAgICAgICAgd2hpbGUgKGogPiBpKSB7DQorICAgICAgICAgICAgcFNvcnQgPSB0cG9zLkdldFB0ckF0KGopOw0KKyAgICAgICAgICAgIGlmIChwU29ydC0+cG9zIDwgdikgew0KKyAgICAgICAgICAgICAgICBGWF9UUE8gdCA9ICpwU29ydDsNCisgICAgICAgICAgICAgICAgKnBTb3J0ID0gKnBDdXI7DQorICAgICAgICAgICAgICAgICpwQ3VyID0gdDsNCisgICAgICAgICAgICAgICAgcEN1ciA9IHBTb3J0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaiAtLTsNCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlIChpIDwgaikgew0KKyAgICAgICAgICAgIHBTb3J0ID0gdHBvcy5HZXRQdHJBdChpKTsNCisgICAgICAgICAgICBpZiAocFNvcnQtPnBvcyA+IHYpIHsNCisgICAgICAgICAgICAgICAgRlhfVFBPIHQgPSAqcFNvcnQ7DQorICAgICAgICAgICAgICAgICpwU29ydCA9ICpwQ3VyOw0KKyAgICAgICAgICAgICAgICAqcEN1ciA9IHQ7DQorICAgICAgICAgICAgICAgIHBDdXIgPSBwU29ydDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGkgKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaSAtLSwgaiArKzsNCisgICAgaWYgKGlTdGFydCA8IGkpIHsNCisgICAgICAgIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KHRwb3MsIGlTdGFydCwgaSk7DQorICAgIH0NCisgICAgaWYgKGogPCBpRW5kKSB7DQorICAgICAgICBGWF9URVhUTEFZT1VUX1BpZWNlU29ydCh0cG9zLCBqLCBpRW5kKTsNCisgICAgfQ0KK30NCitzdGF0aWMgY29uc3QgRlhfSkFQQ0hBUlBST1BFUlRZRVggZ3NfRlhfSmFwQ2hhclByb3BlcnR5c0V4W10gPSB7DQorICAgIHsweDMwMDEsIDB4MTN9LA0KKyAgICB7MHgzMDAyLCAweDEzfSwNCisgICAgezB4MzA0MSwgMHgyM30sDQorICAgIHsweDMwNDMsIDB4MjN9LA0KKyAgICB7MHgzMDQ1LCAweDIzfSwNCisgICAgezB4MzA0NywgMHgyM30sDQorICAgIHsweDMwNDksIDB4MjN9LA0KKyAgICB7MHgzMDYzLCAweDIzfSwNCisgICAgezB4MzA4MywgMHgyM30sDQorICAgIHsweDMwODUsIDB4MjN9LA0KKyAgICB7MHgzMDg3LCAweDIzfSwNCisgICAgezB4MzA4RSwgMHgyM30sDQorICAgIHsweDMwOTUsIDB4MjN9LA0KKyAgICB7MHgzMDk2LCAweDIzfSwNCisgICAgezB4MzBBMSwgMHgyM30sDQorICAgIHsweDMwQTMsIDB4MjN9LA0KKyAgICB7MHgzMEE1LCAweDIzfSwNCisgICAgezB4MzBBNywgMHgyM30sDQorICAgIHsweDMwQTksIDB4MjN9LA0KKyAgICB7MHgzMEMzLCAweDIzfSwNCisgICAgezB4MzBFMywgMHgyM30sDQorICAgIHsweDMwRTUsIDB4MjN9LA0KKyAgICB7MHgzMEU3LCAweDIzfSwNCisgICAgezB4MzBFRSwgMHgyM30sDQorICAgIHsweDMwRjUsIDB4MjN9LA0KKyAgICB7MHgzMEY2LCAweDIzfSwNCisgICAgezB4MzBGQiwgMHgyMn0sDQorICAgIHsweDMxRjAsIDB4MjN9LA0KKyAgICB7MHgzMUYxLCAweDIzfSwNCisgICAgezB4MzFGMiwgMHgyM30sDQorICAgIHsweDMxRjMsIDB4MjN9LA0KKyAgICB7MHgzMUY0LCAweDIzfSwNCisgICAgezB4MzFGNSwgMHgyM30sDQorICAgIHsweDMxRjYsIDB4MjN9LA0KKyAgICB7MHgzMUY3LCAweDIzfSwNCisgICAgezB4MzFGOCwgMHgyM30sDQorICAgIHsweDMxRjksIDB4MjN9LA0KKyAgICB7MHgzMUZBLCAweDIzfSwNCisgICAgezB4MzFGQiwgMHgyM30sDQorICAgIHsweDMxRkMsIDB4MjN9LA0KKyAgICB7MHgzMUZELCAweDIzfSwNCisgICAgezB4MzFGRSwgMHgyM30sDQorICAgIHsweDMxRkYsIDB4MjN9LA0KK307DQorRlhfTFBDSkFQQ0hBUlBST1BFUlRZRVggRlhfR2V0SmFwQ2hhclByb3BlcnR5RXgoRlhfV0NIQVIgd2NoKQ0KK3sNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsNCisgICAgRlhfSU5UMzIgaUVuZCA9IHNpemVvZihnc19GWF9KYXBDaGFyUHJvcGVydHlzRXgpIC8gc2l6ZW9mKEZYX0pBUENIQVJQUk9QRVJUWUVYKTsNCisgICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7DQorICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIEZYX1dDSEFSIHdKYXBDaGFyID0gZ3NfRlhfSmFwQ2hhclByb3BlcnR5c0V4W2lNaWRdLndDaGFyOw0KKyAgICAgICAgaWYgKHdjaCA9PSB3SmFwQ2hhcikgew0KKyAgICAgICAgICAgIHJldHVybiBnc19GWF9KYXBDaGFyUHJvcGVydHlzRXggKyBpTWlkOw0KKyAgICAgICAgfSBlbHNlIGlmICh3Y2ggPCB3SmFwQ2hhcikgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgRlhfQWRqdXN0SmFwQ2hhckRpc3BsYXlQb3MoRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJNQkNTQ29kZSwgSUZYX0ZvbnQgKnBGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlZlcnRpY2FsLCBDRlhfUG9pbnRGICZwdE9mZnNldCkNCit7DQorICAgIGlmIChwRm9udCA9PSBOVUxMIHx8ICFiVmVydGljYWwpCXsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAod2NoIDwgMHgzMDAxIHx8IHdjaCA+IDB4MzFGRikJew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQQ0pBUENIQVJQUk9QRVJUWUVYIHBKYXBDaGFyID0gRlhfR2V0SmFwQ2hhclByb3BlcnR5RXgod2NoKTsNCisgICAgaWYgKHBKYXBDaGFyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdCBydEJCb3g7DQorICAgIHJ0QkJveC5SZXNldCgpOw0KKyAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdjaCwgcnRCQm94LCBiTUJDU0NvZGUpKSB7DQorICAgICAgICBzd2l0Y2ggKHBKYXBDaGFyLT51QWxpZ24gJiAweEYwKSB7DQorICAgICAgICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9Ub3A6DQorICAgICAgICAgICAgICAgIHB0T2Zmc2V0LnkgPSBmRm9udFNpemUgKiAoMTAwMCAtIHJ0QkJveC5oZWlnaHQpIC8gMTIwMC4wZjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9NaWRkbGU6DQorICAgICAgICAgICAgICAgIHB0T2Zmc2V0LnkgPSBmRm9udFNpemUgKiAoMTAwMCAtIHJ0QkJveC5oZWlnaHQpIC8gNjAwMC4wZjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKHBKYXBDaGFyLT51QWxpZ24gJiAweDBGKSB7DQorICAgICAgICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9DZW50ZXI6DQorICAgICAgICAgICAgICAgIHB0T2Zmc2V0LnggPSBmRm9udFNpemUgKiAoNjAwIC0gcnRCQm94LnJpZ2h0KCkpIC8gMTAwMC4wZjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9SaWdodDoNCisgICAgICAgICAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg5NTAgLSBydEJCb3gucmlnaHQoKSkgLyAxMDAwLjBmOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdW5pY29kZS5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdW5pY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYWRiNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmgKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GR0FTX1VOSUNPREVfSU1QDQorI2RlZmluZSBfRkdBU19VTklDT0RFX0lNUA0KK3R5cGVkZWYgc3RydWN0IF9GWF9UUE8gew0KKyAgICBGWF9JTlQzMiBpbmRleDsNCisgICAgRlhfSU5UMzIgcG9zOw0KK30gRlhfVFBPOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX1RQTz4JQ0ZYX1RQT0FycmF5Ow0KK3ZvaWQgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQoQ0ZYX1RQT0FycmF5ICZ0cG9zLCBGWF9JTlQzMiBpU3RhcnQsIEZYX0lOVDMyIGlFbmQpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2RhdGV0aW1lLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2RhdGV0aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2VjYjViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfZGF0ZXRpbWUuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCitjb25zdCBGWF9CWVRFCWdfRlhEYXlzUGVyTW9udGhbMTJdID0gezMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KK2NvbnN0IEZYX0JZVEUJZ19GWERheXNQZXJMZWFwTW9udGhbMTJdID0gezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KK2NvbnN0IEZYX0lOVDMyCWdfRlhEYXlzQmVmb3JlTW9udGhbMTJdID0gezAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0fTsNCitjb25zdCBGWF9JTlQzMglnX0ZYRGF5c0JlZm9yZUxlYXBNb250aFsxMl0gPSB7MCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzV9Ow0KK2NvbnN0IEZYX0lOVDMyCWdfRlhEYXlzUGVyWWVhciA9IDM2NTsNCitjb25zdCBGWF9JTlQzMglnX0ZYRGF5c1BlckxlYXBZZWFyID0gMzY2Ow0KK2NvbnN0IEZYX0lOVDMyCWdfRlhEYXlzUGVyNFllYXJzID0gMTQ2MTsNCitjb25zdCBGWF9JTlQzMglnX0ZYRGF5c1BlcjEwMFllYXJzID0gMzY1MjQ7DQorY29uc3QgRlhfSU5UMzIJZ19GWERheXNQZXI0MDBZZWFycyA9IDE0NjA5NzsNCitjb25zdCBGWF9JTlQ2NAlnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kID0gMTAwMDsNCitjb25zdCBGWF9JTlQ2NAlnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlID0gNjAwMDA7DQorY29uc3QgRlhfSU5UNjQJZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIgPSAzNjAwMDAwOw0KK2NvbnN0IEZYX0lOVDY0CWdfRlhNaWxsaXNlY29uZHNQZXJEYXkgPSA4NjQwMDAwMDsNCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCitjb25zdCBGWF9JTlQ2NAlnX0ZYTWlsbGlzZWNvbmRzUGVyWWVhciA9IDB4MDc1N0IxMkMwMDsNCitjb25zdCBGWF9JTlQ2NAlnX0ZYTWlsbGlzZWNvbmRzUGVyTGVhcFllYXIgPSAweDA3NUNENzg4MDA7DQorY29uc3QgRlhfSU5UNjQJZ19GWE1pbGxpc2Vjb25kc1BlcjRZZWFycyA9IDB4MUQ2M0VCMEMwMDsNCitjb25zdCBGWF9JTlQ2NAlnX0ZYTWlsbGlzZWNvbmRzUGVyMTAwWWVhcnMgPSAweDAyREVCQ0NERDAwMDsNCitjb25zdCBGWF9JTlQ2NAlnX0ZYTWlsbGlzZWNvbmRzUGVyNDAwWWVhcnMgPSAweDBCN0FGODVEOUMwMDsNCisjZW5kaWYNCitGWF9CT09MIEZYX0lzTGVhcFllYXIoRlhfSU5UMzIgaVllYXIpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQorICAgIHJldHVybiAoKGlZZWFyICUgNCkgPT0gMCAmJiAoaVllYXIgJSAxMDApICE9IDApIHx8IChpWWVhciAlIDQwMCkgPT0gMDsNCit9DQorRlhfSU5UMzIgRlhfRGF5c0luWWVhcihGWF9JTlQzMiBpWWVhcikNCit7DQorICAgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCisgICAgcmV0dXJuIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNQZXJMZWFwWWVhciA6IGdfRlhEYXlzUGVyWWVhcjsNCit9DQorRlhfQllURSBGWF9EYXlzSW5Nb250aChGWF9JTlQzMiBpWWVhciwgRlhfQllURSBpTW9udGgpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQorICAgIEZYU1lTX2Fzc2VydChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOw0KKyAgICBjb25zdCBGWF9CWVRFICpwID0gRlhfSXNMZWFwWWVhcihpWWVhcikgPyBnX0ZYRGF5c1BlckxlYXBNb250aCA6IGdfRlhEYXlzUGVyTW9udGg7DQorICAgIHJldHVybiBwW2lNb250aCAtIDFdOw0KK30NCitzdGF0aWMgRlhfSU5UMzIgRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKEZYX0lOVDMyIGlZZWFyLCBGWF9CWVRFIGlNb250aCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlNb250aCA+PSAxICYmIGlNb250aCA8PSAxMik7DQorICAgIGNvbnN0IEZYX0lOVDMyICpwID0gRlhfSXNMZWFwWWVhcihpWWVhcikgPyBnX0ZYRGF5c0JlZm9yZUxlYXBNb250aCA6IGdfRlhEYXlzQmVmb3JlTW9udGg7DQorICAgIHJldHVybiBwW2lNb250aCAtIDFdOw0KK30NCitzdGF0aWMgRlhfSU5UNjQgRlhfRGF0ZVRvRGF5cyhGWF9JTlQzMiBpWWVhciwgRlhfQllURSBpTW9udGgsIEZYX0JZVEUgaURheSwgRlhfQk9PTCBiSW5jbHVkZVRoaXNEYXkgPSBGQUxTRSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlNb250aCA+PSAxICYmIGlNb250aCA8PSAxMik7DQorICAgIEZYU1lTX2Fzc2VydChpRGF5ID49IDEgJiYgaURheSA8PSBGWF9EYXlzSW5Nb250aChpWWVhciwgaU1vbnRoKSk7DQorICAgIEZYX0lOVDY0IGlEYXlzID0gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGlZZWFyLCBpTW9udGgpOw0KKyAgICBpRGF5cyArPSBpRGF5Ow0KKyAgICBpZiAoIWJJbmNsdWRlVGhpc0RheSkgew0KKyAgICAgICAgaURheXMgLS07DQorICAgIH0NCisgICAgaWYgKGlZZWFyID4gMCkgew0KKyAgICAgICAgaVllYXIgLS07DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpRGF5cyAtPSBGWF9EYXlzSW5ZZWFyKGlZZWFyKTsNCisgICAgICAgIGlZZWFyICsrOw0KKyAgICB9DQorICAgIHJldHVybiBpRGF5cyArIChGWF9JTlQ2NClpWWVhciAqIDM2NSArIGlZZWFyIC8gNCAtIGlZZWFyIC8gMTAwICsgaVllYXIgLyA0MDA7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX0RheXNUb0RhdGUoRlhfSU5UNjQgaURheXMsIEZYX0lOVDMyICZpWWVhciwgRlhfQllURSAmaU1vbnRoLCBGWF9CWVRFICZpRGF5KQ0KK3sNCisgICAgRlhfQk9PTCBiQkMgPSBpRGF5cyA8IDA7DQorICAgIGlmIChiQkMpIHsNCisgICAgICAgIGlEYXlzID0gLWlEYXlzOw0KKyAgICB9DQorICAgIGlZZWFyID0gMTsNCisgICAgaU1vbnRoID0gMTsNCisgICAgaURheSA9IDE7DQorICAgIGlmIChpRGF5cyA+PSBnX0ZYRGF5c1BlcjQwMFllYXJzKSB7DQorICAgICAgICBpWWVhciArPSAoRlhfSU5UMzIpKGlEYXlzIC8gZ19GWERheXNQZXI0MDBZZWFycyAqIDQwMCk7DQorICAgICAgICBpRGF5cyAlPSBnX0ZYRGF5c1BlcjQwMFllYXJzOw0KKyAgICB9DQorICAgIGlmIChpRGF5cyA+PSBnX0ZYRGF5c1BlcjEwMFllYXJzKSB7DQorICAgICAgICBpZiAoaURheXMgPT0gZ19GWERheXNQZXIxMDBZZWFycyAqIDQpIHsNCisgICAgICAgICAgICBpWWVhciArPSAzMDA7DQorICAgICAgICAgICAgaURheXMgLT0gZ19GWERheXNQZXIxMDBZZWFycyAqIDM7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlZZWFyICs9IChGWF9JTlQzMikoaURheXMgLyBnX0ZYRGF5c1BlcjEwMFllYXJzICogMTAwKTsNCisgICAgICAgICAgICBpRGF5cyAlPSBnX0ZYRGF5c1BlcjEwMFllYXJzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpRGF5cyA+PSBnX0ZYRGF5c1BlcjRZZWFycykgew0KKyAgICAgICAgaVllYXIgKz0gKEZYX0lOVDMyKShpRGF5cyAvIGdfRlhEYXlzUGVyNFllYXJzICogNCk7DQorICAgICAgICBpRGF5cyAlPSBnX0ZYRGF5c1BlcjRZZWFyczsNCisgICAgfQ0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgRlhfSU5UMzIgaVllYXJEYXlzID0gRlhfRGF5c0luWWVhcihpWWVhcik7DQorICAgICAgICBpZiAoaURheXMgPCBpWWVhckRheXMpIHsNCisgICAgICAgICAgICBpZiAoYkJDKSB7DQorICAgICAgICAgICAgICAgIGlZZWFyID0gLWlZZWFyOw0KKyAgICAgICAgICAgICAgICBpRGF5cyA9IGlZZWFyRGF5cyAtIGlEYXlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlZZWFyICsrOw0KKyAgICAgICAgaURheXMgLT0gaVllYXJEYXlzOw0KKyAgICB9DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBGWF9JTlQzMiBpTW9udGhEYXlzID0gRlhfRGF5c0luTW9udGgoaVllYXIsIGlNb250aCk7DQorICAgICAgICBpZiAoaURheXMgPCBpTW9udGhEYXlzKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpTW9udGggKys7DQorICAgICAgICBpRGF5cyAtPSBpTW9udGhEYXlzOw0KKyAgICB9DQorICAgIGlEYXkgKz0gKEZYX0JZVEUpaURheXM7DQorfQ0KKyNpZiBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9MSU5VWF9FTUJFRERFRF8gfHwgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8gfHwgX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9JT1NfDQorI2luY2x1ZGUgPHRpbWUuaD4NCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4NCisjZW5kaWYNCit0eXBlZGVmIHN0cnVjdCBfRlhVVF9TWVNURU1USU1FIHsNCisgICAgRlhfV09SRCB3WWVhcjsNCisgICAgRlhfV09SRCB3TW9udGg7DQorICAgIEZYX1dPUkQgd0RheU9mV2VlazsNCisgICAgRlhfV09SRCB3RGF5Ow0KKyAgICBGWF9XT1JEIHdIb3VyOw0KKyAgICBGWF9XT1JEIHdNaW51dGU7DQorICAgIEZYX1dPUkQgd1NlY29uZDsNCisgICAgRlhfV09SRCB3TWlsbGlzZWNvbmRzOw0KK30gRlhVVF9TWVNURU1USU1FOw0KK3ZvaWQgQ0ZYX1VuaXRpbWU6Ok5vdygpDQorew0KKyAgICBGWFVUX1NZU1RFTVRJTUUgdXRMb2NhbDsNCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCisgICAgOjpHZXRMb2NhbFRpbWUoKExQU1lTVEVNVElNRSkmdXRMb2NhbCk7DQorI2VsaWYgX0ZYX09TXyAhPSBfRlhfRU1CRURERURfDQorI2lmIDENCisgICAgdGltZXZhbCBjdXJUaW1lOw0KKyAgICBnZXR0aW1lb2ZkYXkoJmN1clRpbWUsIE5VTEwpOw0KKyNlbHNlDQorICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJUaW1lOw0KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJmN1clRpbWUpOw0KKyNlbmRpZg0KKyAgICBzdHJ1Y3QgdG0gc3Q7DQorICAgIGxvY2FsdGltZV9yKCZjdXJUaW1lLnR2X3NlYywgJnN0KTsNCisgICAgdXRMb2NhbC53WWVhciA9IHN0LnRtX3llYXIgKyAxOTAwOw0KKyAgICB1dExvY2FsLndNb250aCA9IHN0LnRtX21vbiArIDE7DQorICAgIHV0TG9jYWwud0RheU9mV2VlayA9IHN0LnRtX3dkYXk7DQorICAgIHV0TG9jYWwud0RheSA9IHN0LnRtX21kYXk7DQorICAgIHV0TG9jYWwud0hvdXIgPSBzdC50bV9ob3VyOw0KKyAgICB1dExvY2FsLndNaW51dGUgPSBzdC50bV9taW47DQorICAgIHV0TG9jYWwud1NlY29uZCA9IHN0LnRtX3NlYzsNCisgICAgdXRMb2NhbC53TWlsbGlzZWNvbmRzID0gY3VyVGltZS50dl91c2VjIC8gMTAwMDsNCisjZW5kaWYNCisgICAgU2V0KHV0TG9jYWwud1llYXIsIChGWF9CWVRFKXV0TG9jYWwud01vbnRoLCAoRlhfQllURSl1dExvY2FsLndEYXksDQorICAgICAgICAoRlhfQllURSl1dExvY2FsLndIb3VyLCAoRlhfQllURSl1dExvY2FsLndNaW51dGUsIChGWF9CWVRFKXV0TG9jYWwud1NlY29uZCwgKEZYX1dPUkQpdXRMb2NhbC53TWlsbGlzZWNvbmRzKTsNCit9DQordm9pZCBDRlhfVW5pdGltZTo6U2V0R01UaW1lKCkNCit7DQorICAgIEZYVVRfU1lTVEVNVElNRSB1dExvY2FsOw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyAgICA6OkdldFN5c3RlbVRpbWUoKExQU1lTVEVNVElNRSkmdXRMb2NhbCk7DQorI2VsaWYgX0ZYX09TXyAhPSBfRlhfRU1CRURERURfDQorI2lmIDENCisgICAgdGltZXZhbCBjdXJUaW1lOw0KKyAgICBnZXR0aW1lb2ZkYXkoJmN1clRpbWUsIE5VTEwpOw0KKyNlbHNlDQorICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJUaW1lOw0KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJmN1clRpbWUpOw0KKyNlbmRpZg0KKyAgICBzdHJ1Y3QgdG0gc3Q7DQorICAgIGdtdGltZV9yKCZjdXJUaW1lLnR2X3NlYywgJnN0KTsNCisgICAgdXRMb2NhbC53WWVhciA9IHN0LnRtX3llYXIgKyAxOTAwOw0KKyAgICB1dExvY2FsLndNb250aCA9IHN0LnRtX21vbiArIDE7DQorICAgIHV0TG9jYWwud0RheU9mV2VlayA9IHN0LnRtX3dkYXk7DQorICAgIHV0TG9jYWwud0RheSA9IHN0LnRtX21kYXk7DQorICAgIHV0TG9jYWwud0hvdXIgPSBzdC50bV9ob3VyOw0KKyAgICB1dExvY2FsLndNaW51dGUgPSBzdC50bV9taW47DQorICAgIHV0TG9jYWwud1NlY29uZCA9IHN0LnRtX3NlYzsNCisgICAgdXRMb2NhbC53TWlsbGlzZWNvbmRzID0gY3VyVGltZS50dl91c2VjIC8gMTAwMDsNCisjZW5kaWYNCisgICAgU2V0KHV0TG9jYWwud1llYXIsIChGWF9CWVRFKXV0TG9jYWwud01vbnRoLCAoRlhfQllURSl1dExvY2FsLndEYXksDQorICAgICAgICAoRlhfQllURSl1dExvY2FsLndIb3VyLCAoRlhfQllURSl1dExvY2FsLndNaW51dGUsIChGWF9CWVRFKXV0TG9jYWwud1NlY29uZCwgKEZYX1dPUkQpdXRMb2NhbC53TWlsbGlzZWNvbmRzKTsNCit9DQordm9pZCBDRlhfVW5pdGltZTo6U2V0KEZYX0lOVDMyIHllYXIsIEZYX0JZVEUgbW9udGgsIEZYX0JZVEUgZGF5LCBGWF9CWVRFIGhvdXIsIEZYX0JZVEUgbWludXRlLCBGWF9CWVRFIHNlY29uZCwgRlhfV09SRCBtaWxsaXNlY29uZCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChob3VyIDw9IDIzKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1pbnV0ZSA8PSA1OSk7DQorICAgIEZYU1lTX2Fzc2VydChzZWNvbmQgPD0gNTkpOw0KKyAgICBGWFNZU19hc3NlcnQobWlsbGlzZWNvbmQgPD0gOTk5KTsNCisgICAgbV9pVW5pdGltZSA9IChGWF9JTlQ2NClob3VyICogZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIgKyAoRlhfSU5UNjQpbWludXRlICogZ19GWE1pbGxpc2Vjb25kc1Blck1pbnV0ZSArIChGWF9JTlQ2NClzZWNvbmQgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kICsgbWlsbGlzZWNvbmQ7DQorICAgIGlmICh5ZWFyID4gMCkgew0KKyAgICAgICAgbV9pVW5pdGltZSA9IG1faVVuaXRpbWUgKyBGWF9EYXRlVG9EYXlzKHllYXIsIG1vbnRoLCBkYXksIEZBTFNFKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICAgIH0NCit9DQordm9pZCBDRlhfVW5pdGltZTo6U2V0KEZYX1VOSVRJTUUgdCkNCit7DQorICAgIG1faVVuaXRpbWUgPSB0Ow0KK30NCitGWF9JTlQzMiBDRlhfVW5pdGltZTo6R2V0WWVhcigpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpWWVhcjsNCisgICAgRlhfQllURSBpTW9udGgsIGlEYXk7DQorICAgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgcmV0dXJuIGlZZWFyOw0KK30NCitGWF9CWVRFIENGWF9Vbml0aW1lOjpHZXRNb250aCgpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiBpWWVhcjsNCisgICAgRlhfQllURSBpTW9udGgsIGlEYXk7DQorICAgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgcmV0dXJuIGlNb250aDsNCit9DQorRlhfQllURSBDRlhfVW5pdGltZTo6R2V0RGF5KCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlZZWFyOw0KKyAgICBGWF9CWVRFIGlNb250aCwgaURheTsNCisgICAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgICByZXR1cm4gaURheTsNCit9DQorRlhfV0VFS0RBWSBDRlhfVW5pdGltZTo6R2V0RGF5T2ZXZWVrKCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIHYgPSAoRlhfSU5UMzIpKChtX2lVbml0aW1lIC8gZ19GWE1pbGxpc2Vjb25kc1BlckRheSArIDEpICUgNyk7DQorICAgIGlmICh2IDwgMCkgew0KKyAgICAgICAgdiArPSA3Ow0KKyAgICB9DQorICAgIHJldHVybiAoRlhfV0VFS0RBWSl2Ow0KK30NCitGWF9XT1JEIENGWF9Vbml0aW1lOjpHZXREYXlPZlllYXIoKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaVllYXI7DQorICAgIEZYX0JZVEUgaU1vbnRoLCBpRGF5Ow0KKyAgICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7DQorICAgIHJldHVybiBGWF9EYXlzQmVmb3JlTW9udGhJblllYXIoaVllYXIsIGlNb250aCkgKyBpRGF5Ow0KK30NCitGWF9JTlQ2NCBDRlhfVW5pdGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0DQorew0KKyAgICBGWF9CT09MIGJCQyA9IG1faVVuaXRpbWUgPCAwOw0KKyAgICBGWF9JTlQ2NCBpRGF5cyA9IG1faVVuaXRpbWUgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgICBpRGF5cyArPSBiQkMgPyAtMSA6IDA7DQorICAgIGlmIChiQkMgJiYgKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5KSA9PSAwKSB7DQorICAgICAgICBpRGF5cyArKzsNCisgICAgfQ0KKyAgICByZXR1cm4gaURheXM7DQorfQ0KK0ZYX0JZVEUgQ0ZYX1VuaXRpbWU6OkdldEhvdXIoKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgdiA9IChGWF9JTlQzMikobV9pVW5pdGltZSAlIGdfRlhNaWxsaXNlY29uZHNQZXJEYXkpOw0KKyAgICBpZiAodiA8IDApIHsNCisgICAgICAgIHYgKz0gZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgICAgfQ0KKyAgICByZXR1cm4gKEZYX0JZVEUpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVySG91cik7DQorfQ0KK0ZYX0JZVEUgQ0ZYX1VuaXRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiB2ID0gKEZYX0lOVDMyKShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIpOw0KKyAgICBpZiAodiA8IDApIHsNCisgICAgICAgIHYgKz0gZ19GWE1pbGxpc2Vjb25kc1BlckhvdXI7DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9CWVRFKSh2IC8gZ19GWE1pbGxpc2Vjb25kc1Blck1pbnV0ZSk7DQorfQ0KK0ZYX0JZVEUgQ0ZYX1VuaXRpbWU6OkdldFNlY29uZCgpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiB2ID0gKEZYX0lOVDMyKShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1Blck1pbnV0ZSk7DQorICAgIGlmICh2IDwgMCkgew0KKyAgICAgICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlOw0KKyAgICB9DQorICAgIHJldHVybiAoRlhfQllURSkodiAvIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOw0KK30NCitGWF9XT1JEIENGWF9Vbml0aW1lOjpHZXRNaWxsaXNlY29uZCgpIGNvbnN0DQorew0KKyAgICBGWF9JTlQzMiB2ID0gKEZYX0lOVDMyKShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCk7DQorICAgIGlmICh2IDwgMCkgew0KKyAgICAgICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOw0KKyAgICB9DQorICAgIHJldHVybiAoRlhfV09SRCl2Ow0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRZZWFycyhGWF9JTlQzMiBpWWVhcnMpDQorew0KKyAgICBGWF9VTklUSU1FIHV0ID0gbV9pVW5pdGltZTsNCisgICAgaWYgKHV0IDwgMCkgew0KKyAgICAgICAgdXQgPSAtdXQ7DQorICAgIH0NCisgICAgRlhfVU5JVElNRSByID0gdXQgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgICBGWF9JTlQzMiBpWWVhcjsNCisgICAgRlhfQllURSBpTW9udGgsIGlEYXk7DQorICAgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgaVllYXIgKz0gaVllYXJzOw0KKyAgICBpZiAoaVllYXIgPT0gMCkgew0KKyAgICAgICAgaVllYXIgPSBpWWVhcnMgPiAwID8gMSA6IC0xOw0KKyAgICB9DQorICAgIG1faVVuaXRpbWUgPSBGWF9EYXRlVG9EYXlzKGlZZWFyLCBpTW9udGgsIGlEYXksIEZBTFNFKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICAgIG1faVVuaXRpbWUgKz0gKGlZZWFyIDwgMCkgPyAtciA6IHI7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNb250aHMoRlhfSU5UMzIgaU1vbnRocykNCit7DQorICAgIEZYX0JPT0wgYiA9IGlNb250aHMgPiAwOw0KKyAgICBGWF9VTklUSU1FIHV0ID0gbV9pVW5pdGltZTsNCisgICAgaWYgKHV0IDwgMCkgew0KKyAgICAgICAgdXQgPSAtdXQ7DQorICAgIH0NCisgICAgRlhfVU5JVElNRSByID0gdXQgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgICBGWF9JTlQzMiBpWWVhcjsNCisgICAgRlhfQllURSBpTW9udGgsIGlEYXk7DQorICAgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgaU1vbnRocyArPSBpTW9udGg7DQorICAgIHdoaWxlIChpTW9udGhzIDwgMSkgew0KKyAgICAgICAgaVllYXIgLS0sIGlNb250aHMgKz0gMTI7DQorICAgIH0NCisgICAgd2hpbGUgKGlNb250aHMgPiAxMikgew0KKyAgICAgICAgaVllYXIgKyssIGlNb250aHMgLT0gMTI7DQorICAgIH0NCisgICAgaWYgKGlZZWFyID09IDApIHsNCisgICAgICAgIGlZZWFyID0gYiA/IDEgOiAtMTsNCisgICAgfQ0KKyAgICBtX2lVbml0aW1lID0gRlhfRGF0ZVRvRGF5cyhpWWVhciwgKEZYX0JZVEUpaU1vbnRocywgaURheSwgRkFMU0UpICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgICAgbV9pVW5pdGltZSArPSAoaVllYXIgPCAwKSA/IC1yIDogcjsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZERheXMoRlhfSU5UMzIgaURheXMpDQorew0KKyAgICBtX2lVbml0aW1lICs9IChGWF9JTlQ2NClpRGF5cyAqIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRIb3VycyhGWF9JTlQzMiBpSG91cnMpDQorew0KKyAgICBtX2lVbml0aW1lICs9IChGWF9JTlQ2NClpSG91cnMgKiBnX0ZYTWlsbGlzZWNvbmRzUGVySG91cjsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZE1pbnV0ZXMoRlhfSU5UMzIgaU1pbnV0ZXMpDQorew0KKyAgICBtX2lVbml0aW1lICs9IChGWF9JTlQ2NClpTWludXRlcyAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGU7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRTZWNvbmRzKEZYX0lOVDMyIGlTZWNvbmRzKQ0KK3sNCisgICAgbV9pVW5pdGltZSArPSAoKEZYX0lOVDY0KWlTZWNvbmRzKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNaWxsaXNlY29uZHMoRlhfSU5UMzIgaU1pbGxpc2Vjb25kcykNCit7DQorICAgIG1faVVuaXRpbWUgKz0gaU1pbGxpc2Vjb25kczsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpTZXQoRlhfSU5UMzIgeWVhciwgRlhfQllURSBtb250aCwgRlhfQllURSBkYXksIEZYX0JZVEUgaG91ciwgRlhfQllURSBtaW51dGUsIEZYX0JZVEUgc2Vjb25kLCBGWF9XT1JEIG1pbGxpc2Vjb25kKQ0KK3sNCisgICAgQVNTRVJUKHllYXIgIT0gMCk7DQorICAgIEFTU0VSVChtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyKTsNCisgICAgQVNTRVJUKGRheSA+PSAxICYmIGRheSA8PSBGWF9EYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpOw0KKyAgICBBU1NFUlQoaG91ciA8PSAyMyk7DQorICAgIEFTU0VSVChtaW51dGUgPD0gNTkpOw0KKyAgICBBU1NFUlQoc2Vjb25kIDw9IDU5KTsNCisgICAgQVNTRVJUKG1pbGxpc2Vjb25kIDw9IDk5OSk7DQorICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0geWVhcjsNCisgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoID0gbW9udGg7DQorICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgPSBkYXk7DQorICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5ob3VyID0gaG91cjsNCisgICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSA9IG1pbnV0ZTsNCisgICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCA9IHNlY29uZDsNCisgICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9EYXRlVGltZTo6RnJvbVVuaXRpbWUoRlhfVU5JVElNRSB0KQ0KK3sNCisgICAgQ0ZYX1VuaXRpbWUgdXQodCk7DQorICAgIEZYX0RheXNUb0RhdGUodXQuR2V0RGF5T2ZBRCgpLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5KTsNCisgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSA9IHV0LkdldEhvdXIoKTsNCisgICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSA9IHV0LkdldE1pbnV0ZSgpOw0KKyAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gdXQuR2V0U2Vjb25kKCk7DQorICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZCA9IHV0LkdldE1pbGxpc2Vjb25kKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9VTklUSU1FIENGWF9EYXRlVGltZTo6VG9Vbml0aW1lKCkgY29uc3QNCit7DQorICAgIEZYX1VOSVRJTUUgdiA9IChGWF9JTlQ2NCltX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ICogZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIgKyAoRlhfSU5UNjQpbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGUgKyAoRlhfSU5UNjQpbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCAqIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQgKyBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQ7DQorICAgIHYgKz0gRlhfRGF0ZVRvRGF5cyhtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBGQUxTRSkgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgICByZXR1cm4gdjsNCit9DQorRlhfSU5UMzIgQ0ZYX0RhdGVUaW1lOjpHZXRZZWFyKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhcjsNCit9DQorRlhfQllURSBDRlhfRGF0ZVRpbWU6OkdldE1vbnRoKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGg7DQorfQ0KK0ZYX0JZVEUgQ0ZYX0RhdGVUaW1lOjpHZXREYXkoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXk7DQorfQ0KK0ZYX1dFRUtEQVkgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZldlZWsoKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgdiA9IChGWF9JTlQzMikoRlhfRGF0ZVRvRGF5cyhtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKSAlIDcpOw0KKyAgICBpZiAodiA8IDApIHsNCisgICAgICAgIHYgKz0gNzsNCisgICAgfQ0KKyAgICByZXR1cm4gKEZYX1dFRUtEQVkpdjsNCit9DQorRlhfV09SRCBDRlhfRGF0ZVRpbWU6OkdldERheU9mWWVhcigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgpICsgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCit9DQorRlhfSU5UNjQgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZkFEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXksIFRSVUUpOw0KK30NCitGWF9CWVRFIENGWF9EYXRlVGltZTo6R2V0SG91cigpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCit9DQorRlhfQllURSBDRlhfRGF0ZVRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZTsNCit9DQorRlhfQllURSBDRlhfRGF0ZVRpbWU6OkdldFNlY29uZCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZDsNCit9DQorRlhfV09SRCBDRlhfRGF0ZVRpbWU6OkdldE1pbGxpc2Vjb25kKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRZZWFycyhGWF9JTlQzMiBpWWVhcnMpDQorew0KKyAgICBpZiAoaVllYXJzID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB2ID0gbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgKyBpWWVhcnM7DQorICAgIGlmICh2ID49IDAgJiYgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPCAwKSB7DQorICAgICAgICB2ICsrOw0KKyAgICB9IGVsc2UgaWYgKHYgPD0gMCAmJiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA+IDApIHsNCisgICAgICAgIHYgLS07DQorICAgIH0NCisgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSB2Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkFkZE1vbnRocyhGWF9JTlQzMiBpTW9udGhzKQ0KK3sNCisgICAgaWYgKGlNb250aHMgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYiA9IGlNb250aHMgPiAwOw0KKyAgICBpTW9udGhzICs9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aDsNCisgICAgd2hpbGUgKGlNb250aHMgPCAxKSB7DQorICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciAtLTsNCisgICAgICAgIGlmIChtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9PSAwKSB7DQorICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSAtMTsNCisgICAgICAgIH0NCisgICAgICAgIGlNb250aHMgKz0gMTI7DQorICAgIH0NCisgICAgd2hpbGUgKGlNb250aHMgPiAxMikgew0KKyAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgKys7DQorICAgICAgICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgew0KKyAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGlNb250aHMgLT0gMTI7DQorICAgIH0NCisgICAgaWYgKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID09IDApIHsNCisgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gYiA/IDEgOiAtMTsNCisgICAgfQ0KKyAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGggPSAoRlhfQllURSlpTW9udGhzOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkFkZERheXMoRlhfSU5UMzIgaURheXMpDQorew0KKyAgICBpZiAoaURheXMgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDY0IHYxID0gRlhfRGF0ZVRvRGF5cyhtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKTsNCisgICAgRlhfSU5UNjQgdjIgPSB2MSArIGlEYXlzOw0KKyAgICBpZiAodjIgPD0gMCAmJiB2MSA+IDApIHsNCisgICAgICAgIHYyIC0tOw0KKyAgICB9IGVsc2UgaWYgKHYyID49IDAgJiYgdjEgPCAwKSB7DQorICAgICAgICB2MiArKzsNCisgICAgfQ0KKyAgICBGWF9EYXlzVG9EYXRlKHYyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRIb3VycyhGWF9JTlQzMiBpSG91cnMpDQorew0KKyAgICBpZiAoaUhvdXJzID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpSG91cnMgKz0gbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCisgICAgRlhfSU5UMzIgaURheXMgPSBpSG91cnMgLyAyNDsNCisgICAgaUhvdXJzICU9IDI0Ow0KKyAgICBpZiAoaUhvdXJzIDwgMCkgew0KKyAgICAgICAgaURheXMgLS0sIGlIb3VycyArPSAyNDsNCisgICAgfQ0KKyAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ID0gKEZYX0JZVEUpaUhvdXJzOw0KKyAgICBpZiAoaURheXMgIT0gMCkgew0KKyAgICAgICAgQWRkRGF5cyhpRGF5cyk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRNaW51dGVzKEZYX0lOVDMyIGlNaW51dGVzKQ0KK3sNCisgICAgaWYgKGlNaW51dGVzID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpTWludXRlcyArPSBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlOw0KKyAgICBGWF9JTlQzMiBpSG91cnMgPSBpTWludXRlcyAvIDYwOw0KKyAgICBpTWludXRlcyAlPSA2MDsNCisgICAgaWYgKGlNaW51dGVzIDwgMCkgew0KKyAgICAgICAgaUhvdXJzIC0tLCBpTWludXRlcyArPSA2MDsNCisgICAgfQ0KKyAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlID0gKEZYX0JZVEUpaU1pbnV0ZXM7DQorICAgIGlmIChpSG91cnMgIT0gMCkgew0KKyAgICAgICAgQWRkSG91cnMoaUhvdXJzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkFkZFNlY29uZHMoRlhfSU5UMzIgaVNlY29uZHMpDQorew0KKyAgICBpZiAoaVNlY29uZHMgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlTZWNvbmRzICs9IG1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQ7DQorICAgIEZYX0lOVDMyIGlNaW51dGVzID0gaVNlY29uZHMgLyA2MDsNCisgICAgaVNlY29uZHMgJT0gNjA7DQorICAgIGlmIChpU2Vjb25kcyA8IDApIHsNCisgICAgICAgIGlNaW51dGVzIC0tLCBpU2Vjb25kcyArPSA2MDsNCisgICAgfQ0KKyAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gKEZYX0JZVEUpaVNlY29uZHM7DQorICAgIGlmIChpTWludXRlcyAhPSAwKSB7DQorICAgICAgICBBZGRNaW51dGVzKGlNaW51dGVzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkFkZE1pbGxpc2Vjb25kcyhGWF9JTlQzMiBpTWlsbGlzZWNvbmRzKQ0KK3sNCisgICAgaWYgKGlNaWxsaXNlY29uZHMgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlNaWxsaXNlY29uZHMgKz0gbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kOw0KKyAgICBGWF9JTlQzMiBpU2Vjb25kcyA9IChGWF9JTlQzMikoaU1pbGxpc2Vjb25kcyAvIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOw0KKyAgICBpTWlsbGlzZWNvbmRzICU9IGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7DQorICAgIGlmIChpTWlsbGlzZWNvbmRzIDwgMCkgew0KKyAgICAgICAgaVNlY29uZHMgLS0sIGlNaWxsaXNlY29uZHMgKz0gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZDsNCisgICAgfQ0KKyAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQgPSAoRlhfV09SRClpTWlsbGlzZWNvbmRzOw0KKyAgICBpZiAoaVNlY29uZHMgIT0gMCkgew0KKyAgICAgICAgQWRkU2Vjb25kcyhpU2Vjb25kcyk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzJhNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwCkBAIC0wLDAgKzEsNDk1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X2xvY2FsZWltcC5oIg0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2gJCQkweGJkZTlhYmRlDQorI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lSGFzaAkJCTB4MmQ3MWIwMGYNCisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lSGFzaAkJMHgxNThjNzJlZA0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfTnVtSGFzaAkJCTB4MGI0ZmY4NzANCisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHRIYXNoCQkJMHgyZDA4YWY4NQ0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfWmVyb0hhc2gJCQkweDU2OGNiNTAwDQorI2RlZmluZQlGWF9MT0NBTEVDQVRFR09SWV9OdWxsSGFzaAkJCTB4MDUyOTMxYmINCit0eXBlZGVmIHN0cnVjdCBfRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIHsNCisgICAgRlhfVUlOVDMyCQkJCQl1SGFzaDsNCisgICAgRlhfTFBDV1NUUgkJCQkJcE5hbWU7DQorICAgIEZYX0lOVDMyCQkJCQllU3ViQ2F0ZWdvcnk7DQorfSBGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8sICogRlhfTFBMT0NBTEVTVUJDQVRFR09SWUlORk87DQordHlwZWRlZiBGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8gY29uc3QgKiBGWF9MUENMT0NBTEVTVUJDQVRFR09SWUlORk87DQorY29uc3Qgc3RhdGljIEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyBnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW10gPSB7DQorICAgIHsweDE0ZGEyMTI1LCAoRlhfTFBDV1NUUilMImRlZmF1bHQiLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHR9LA0KKyAgICB7MHg5MDQxZDRiMCwgKEZYX0xQQ1dTVFIpTCJzaG9ydCIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnR9LA0KKyAgICB7MHhhMDg0YTM4MSwgKEZYX0xQQ1dTVFIpTCJtZWRpdW0iLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bX0sDQorICAgIHsweGNkY2U1NmIzLCAoRlhfTFBDV1NUUilMImZ1bGwiLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGx9LA0KKyAgICB7MHhmNmI0YWZiMCwgKEZYX0xQQ1dTVFIpTCJsb25nIiwgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nfSwNCit9Ow0KK2NvbnN0IHN0YXRpYyBGWF9JTlQzMiBnX2lGWExvY2FsZURhdGVUaW1lU3ViQ2F0Q291bnQgPSBzaXplb2YoZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YSkgLyBzaXplb2YoRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPKTsNCitjb25zdCBzdGF0aWMgRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIGdfRlhMb2NhbGVOdW1TdWJDYXREYXRhW10gPSB7DQorICAgIHsweDQ2Zjk1NTMxLCAoRlhfTFBDV1NUUilMInBlcmNlbnQiLCBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnR9LA0KKyAgICB7MHg0YzRlOGFjYiwgKEZYX0xQQ1dTVFIpTCJjdXJyZW5jeSIsIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3l9LA0KKyAgICB7MHg1NDAzNGMyZiwgKEZYX0xQQ1dTVFIpTCJkZWNpbWFsIiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsfSwNCisgICAgezB4NzU2OGU2YWUsIChGWF9MUENXU1RSKUwiaW50ZWdlciIsIEZYX0xPQ0FMRU5VTVBBVFRFUk5fSW50ZWdlcn0sDQorfTsNCitjb25zdCBzdGF0aWMgRlhfSU5UMzIgZ19pRlhMb2NhbGVOdW1TdWJDYXRDb3VudCA9IHNpemVvZihnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YSkgLyBzaXplb2YoRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPKTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfTE9DQUxFVElNRVpPTkVJTkZPIHsNCisgICAgRlhfRFdPUkQJCQkJCXVIYXNoOw0KKyAgICBGWF9JTlQxNgkJCQkJaUhvdXI7DQorICAgIEZYX0lOVDE2CQkJCQlpTWludXRlOw0KK30gRlhfTE9DQUxFVElNRVpPTkVJTkZPLCAqIEZYX0xQTE9DQUxFVElNRVpPTkVJTkZPOw0KK3R5cGVkZWYgRlhfTE9DQUxFVElNRVpPTkVJTkZPIGNvbnN0ICogRlhfTFBDTE9DQUxFVElNRVpPTkVJTkZPOw0KK2NvbnN0IHN0YXRpYyBGWF9MT0NBTEVUSU1FWk9ORUlORk8gZ19GWExvY2FsZVRpbWVab25lRGF0YVtdID0gew0KKyAgICB7RlhCU1RSX0lEKDAsICdDJywgJ0QnLCAnVCcpLCAtNSwgMH0sIHtGWEJTVFJfSUQoMCwgJ0MnLCAnUycsICdUJyksIC02LCAwfSwNCisgICAge0ZYQlNUUl9JRCgwLCAnRScsICdEJywgJ1QnKSwgLTQsIDB9LCB7RlhCU1RSX0lEKDAsICdFJywgJ1MnLCAnVCcpLCAtNSwgMH0sDQorICAgIHtGWEJTVFJfSUQoMCwgJ00nLCAnRCcsICdUJyksIC02LCAwfSwge0ZYQlNUUl9JRCgwLCAnTScsICdTJywgJ1QnKSwgLTcsIDB9LA0KKyAgICB7RlhCU1RSX0lEKDAsICdQJywgJ0QnLCAnVCcpLCAtNywgMH0sIHtGWEJTVFJfSUQoMCwgJ1AnLCAnUycsICdUJyksIC04LCAwfSwNCit9Ow0KK2NvbnN0IHN0YXRpYyBGWF9JTlQzMiBnX2lGWExvY2FsZVRpbWVab25lQ291bnQgPSBzaXplb2YoZ19GWExvY2FsZVRpbWVab25lRGF0YSkgLyBzaXplb2YoRlhfTE9DQUxFVElNRVpPTkVJTkZPKTsNCitjb25zdCBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmdDIGdzX3dzVGV4dFN5bWJvbHMgPSBGWF9XU1RSQyhMIkFYTzA5Iik7DQorY29uc3Qgc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc193c1RpbWVTeW1ib2xzID0gRlhfV1NUUkMoTCJoSGtLTVNGQXpaIik7DQorY29uc3Qgc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc193c0RhdGVTeW1ib2xzID0gRlhfV1NUUkMoTCJESk1FZUdnWXdXIik7DQorY29uc3Qgc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc193c0NvbnN0Q2hhcnMgPSBGWF9XU1RSQyhMIiwtOi8uICIpOw0KK3N0YXRpYyBGWF9TVFJTSVpFIEZYX0xvY2FsX0ZpbmQoRlhfV1NUUiB3c1N5bWJvbHMsIEZYX1dDSEFSIGNoLCBGWF9TVFJTSVpFIG5TdGFydCA9IDApDQorew0KKyAgICBGWF9TVFJTSVpFIG5MZW5ndGggPSB3c1N5bWJvbHMuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChuTGVuZ3RoIDwgMSB8fCBuU3RhcnQgPiBuTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgRlhfTFBDV1NUUiBscHN6ID0gKEZYX0xQQ1dTVFIpRlhTWVNfd2NzY2hyKHdzU3ltYm9scy5HZXRQdHIoKSArIG5TdGFydCwgY2gpOw0KKyAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCkgPyAtMSA6IChGWF9TVFJTSVpFKShscHN6IC0gd3NTeW1ib2xzLkdldFB0cigpKTsNCit9DQorY29uc3Qgc3RhdGljIEZYX0xQQ1dTVFIgZ3NfTG9jYWxOdW1iZXJTeW1ib2xzW10gPSB7DQorICAgIChGWF9MUENXU1RSKUwiZGVjaW1hbCIsIChGWF9MUENXU1RSKUwiZ3JvdXBpbmciLCAoRlhfTFBDV1NUUilMInBlcmNlbnQiLCAoRlhfTFBDV1NUUilMIm1pbnVzIiwgKEZYX0xQQ1dTVFIpTCJ6ZXJvIiwNCisgICAgKEZYX0xQQ1dTVFIpTCJjdXJyZW5jeVN5bWJvbCIsIChGWF9MUENXU1RSKUwiY3VycmVuY3lOYW1lIiwNCit9Ow0KK0lGWF9Mb2NhbGUqIElGWF9Mb2NhbGU6OkNyZWF0ZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDRlhfTG9jYWxlKHBMb2NhbGVEYXRhKTsNCit9DQorQ0ZYX0xvY2FsZTo6Q0ZYX0xvY2FsZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKQ0KK3sNCisgICAgbV9wRWxlbWVudCA9IHBMb2NhbGVEYXRhOw0KK30NCitDRlhfTG9jYWxlOjp+Q0ZYX0xvY2FsZSgpDQorew0KK30NCitDRlhfV2lkZVN0cmluZyBDRlhfTG9jYWxlOjpHZXROYW1lKCkNCit7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOw0KK30NCitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRlhfR2V0WE1MQ29udGVudChGWF9CU1RSIGJzU3BhY2UsIENYTUxfRWxlbWVudCogcHhtbEVsZW1lbnQsIEZYX0JTVFIgYnNUYWcsIEZYX1dTVFIgd3NOYW1lKQ0KK3sNCisgICAgQ1hNTF9FbGVtZW50KiBwRGF0ZVBhdHRlcm4gPSBOVUxMOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBweG1sRWxlbWVudC0+Q291bnRFbGVtZW50cyhic1NwYWNlLCBic1RhZyk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgICAgICBwRGF0ZVBhdHRlcm4gPSBweG1sRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCBic1RhZywgaSk7DQorICAgICAgICBpZiAocERhdGVQYXR0ZXJuLT5HZXRBdHRyVmFsdWUoRlhfQlNUUkMoIm5hbWUiKSkgPT0gd3NOYW1lKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGkgPCBuQ291bnQgJiYgcERhdGVQYXR0ZXJuKSB7DQorICAgICAgICByZXR1cm4gcERhdGVQYXR0ZXJuLT5HZXRDb250ZW50KDApOw0KKyAgICB9DQorICAgIHJldHVybiBMIiI7DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBnc19Mb2NhbE51bWJlclN5bWJvbHNbZVR5cGVdOw0KKyAgICBDWE1MX0VsZW1lbnQqIHBOdW1iZXJTeW1ib2xzID0gbV9wRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCBGWF9CU1RSQygibnVtYmVyU3ltYm9scyIpKTsNCisgICAgaWYgKCFwTnVtYmVyU3ltYm9scykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHdzTnVtU3ltYm9sID0gRlhfR2V0WE1MQ29udGVudChic1NwYWNlLCBwTnVtYmVyU3ltYm9scywgRlhfQlNUUkMoIm51bWJlclN5bWJvbCIpLCB3c05hbWUpOw0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3QNCit7DQorICAgIGlmICghbV9wRWxlbWVudCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQorICAgIENYTUxfRWxlbWVudCogcE51bWJlclN5bWJvbHMgPSBtX3BFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIEZYX0JTVFJDKCJkYXRlVGltZVN5bWJvbHMiKSk7DQorICAgIGlmICghcE51bWJlclN5bWJvbHMpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB3c0R0U3ltYm9sID0gcE51bWJlclN5bWJvbHMtPkdldENvbnRlbnQoMCk7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX0dldENhbGVuZGFyU3ltYm9sKENYTUxfRWxlbWVudCogcFhtbEVsZW1lbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZzeW1ib2xfdHlwZSwgRlhfSU5UMzIgaW5kZXgsIEZYX0JPT0wgYkFiYnIsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBwc3RyU3ltYm9sTmFtZXMgPSBzeW1ib2xfdHlwZSArIEZYX0JTVFJDKCJOYW1lcyIpOw0KKyAgICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9IHBYbWxFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIEZYX0JTVFJDKCJjYWxlbmRhclN5bWJvbHMiKSk7DQorICAgIGlmICghcENoaWxkKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hNTF9FbGVtZW50KiBwU3ltYm9sTmFtZXMgPSBwQ2hpbGQtPkdldEVsZW1lbnQoYnNTcGFjZSwgcHN0clN5bWJvbE5hbWVzKTsNCisgICAgaWYgKCFwU3ltYm9sTmFtZXMpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAocFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcihGWF9CU1RSQygiYWJiciIpKSAhPSBiQWJicikgew0KKyAgICAgICAgcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KGJzU3BhY2UsIHBzdHJTeW1ib2xOYW1lcywgMSk7DQorICAgIH0NCisgICAgaWYgKHBTeW1ib2xOYW1lcyAmJiBwU3ltYm9sTmFtZXMtPkdldEF0dHJJbnRlZ2VyKEZYX0JTVFJDKCJhYmJyIikpID09IGJBYmJyKSB7DQorICAgICAgICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lID0gcFN5bWJvbE5hbWVzLT5HZXRFbGVtZW50KGJzU3BhY2UsIHN5bWJvbF90eXBlLCBpbmRleCk7DQorICAgICAgICBpZiAocFN5bWJvbE5hbWUpIHsNCisgICAgICAgICAgICB3c05hbWUgPSBwU3ltYm9sTmFtZS0+R2V0Q29udGVudCgwKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldE1vbnRoTmFtZShGWF9JTlQzMiBuTW9udGgsIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwgRlhfQk9PTCBiQWJiciApIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9HZXRDYWxlbmRhclN5bWJvbChtX3BFbGVtZW50LCAibW9udGgiLCBuTW9udGgsIGJBYmJyLCB3c01vbnRoTmFtZSk7DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0RGF5TmFtZShGWF9JTlQzMiBuV2VlaywgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwgRlhfQk9PTCBiQWJiciApIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9HZXRDYWxlbmRhclN5bWJvbChtX3BFbGVtZW50LCAiZGF5IiwgbldlZWssIGJBYmJyLCB3c0RheU5hbWUpOw0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsIEZYX0JPT0wgYkFNICkgY29uc3QNCit7DQorICAgIGlmICghbV9wRWxlbWVudCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJtZXJpZGllbSIsIGJBTSA/IDAgOiAxLCBGQUxTRSwgd3NNZXJpZGllbU5hbWUpOw0KK30NCitzdGF0aWMgRlhfSU5UMzIgRlhfUGFyc2VUaW1lWm9uZShGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW4sIEZYX1RJTUVaT05FJiB0eikNCit7DQorICAgIHR6LnR6SG91ciA9IDA7DQorICAgIHR6LnR6TWludXRlID0gMDsNCisgICAgaWYgKGlMZW4gPCAwKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAxOw0KKyAgICBGWF9JTlQzMiBpRW5kID0gaVN0YXJ0ICsgMjsNCisgICAgd2hpbGUgKGlTdGFydCA8IGlMZW4gJiYgaVN0YXJ0IDwgaUVuZCkgew0KKyAgICAgICAgdHoudHpIb3VyID0gdHoudHpIb3VyICogMTAgKyBwU3RyW2lTdGFydCsrXSAtICcwJzsNCisgICAgfQ0KKyAgICBpZiAoaVN0YXJ0IDwgaUxlbiAmJiBwU3RyW2lTdGFydF0gPT0gJzonKSB7DQorICAgICAgICBpU3RhcnQrKzsNCisgICAgfQ0KKyAgICBpRW5kID0gaVN0YXJ0ICsgMjsNCisgICAgd2hpbGUgKGlTdGFydCA8IGlMZW4gJiYgaVN0YXJ0IDwgaUVuZCkgew0KKyAgICAgICAgdHoudHpNaW51dGUgPSB0ei50ek1pbnV0ZSAqIDEwICsgcFN0cltpU3RhcnQrK10gLSAnMCc7DQorICAgIH0NCisgICAgaWYgKHBTdHJbMF0gPT0gJy0nKSB7DQorICAgICAgICB0ei50ekhvdXIgPSAtdHoudHpIb3VyOw0KKyAgICB9DQorICAgIHJldHVybiBpU3RhcnQ7DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdA0KK3sNCisgICAgdHoudHpIb3VyID0gMDsNCisgICAgdHoudHpNaW51dGUgPSAwOw0KKyAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWE1MX0VsZW1lbnQqIHB4bWxUaW1lWm9uZSA9IG1fcEVsZW1lbnQtPkdldEVsZW1lbnQoIiIsIEZYX0JTVFJDKCJ0aW1lWm9uZSIpKTsNCisgICAgaWYgKHB4bWxUaW1lWm9uZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lWm9uZSA9IHB4bWxUaW1lWm9uZS0+R2V0Q29udGVudCgwKTsNCisgICAgICAgIEZYX1BhcnNlVGltZVpvbmUod3NUaW1lWm9uZSwgd3NUaW1lWm9uZS5HZXRMZW5ndGgoKSwgdHopOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCApIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9HZXRDYWxlbmRhclN5bWJvbChtX3BFbGVtZW50LCAiZXJhIiwgYkFEID8gMCA6IDEsIEZBTFNFLCB3c0VyYU5hbWUpOw0KK30NCitzdGF0aWMgdm9pZCBGWF9HZXRQYXR0ZXJuKENYTUxfRWxlbWVudCogcFhtbEVsZW1lbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0NhdGVnb3J5LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdWJDYXRlZ29yeSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQorICAgIENYTUxfRWxlbWVudCogcERhdGVQYXR0ZXJucyA9IHBYbWxFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIGJzQ2F0ZWdvcnkgKyAicyIpOw0KKyAgICBpZiAoIXBEYXRlUGF0dGVybnMpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB3c1BhdHRlcm4gPSBGWF9HZXRYTUxDb250ZW50KGJzU3BhY2UsIHBEYXRlUGF0dGVybnMsIGJzQ2F0ZWdvcnksIHdzU3ViQ2F0ZWdvcnkpOw0KK30NCitzdGF0aWMgdm9pZCBGWF9HZXREYXRlVGltZVBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwWG1sRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzQ2F0ZWdvcnksIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW2VUeXBlXS5wTmFtZTsNCisgICAgRlhfR2V0UGF0dGVybihwWG1sRWxlbWVudCwgYnNDYXRlZ29yeSwgd3NUeXBlLCB3c1BhdHRlcm4pOw0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9HZXREYXRlVGltZVBhdHRlcm4obV9wRWxlbWVudCwgImRhdGVQYXR0ZXJuIiwgZVR5cGUsIHdzUGF0dGVybik7DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCit7DQorICAgIGlmICghbV9wRWxlbWVudCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0dldERhdGVUaW1lUGF0dGVybihtX3BFbGVtZW50LCAidGltZVBhdHRlcm4iLCBlVHlwZSwgd3NQYXR0ZXJuKTsNCit9DQordm9pZCBDRlhfTG9jYWxlOjpHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdA0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlID0gZ19GWExvY2FsZU51bVN1YkNhdERhdGFbZVR5cGVdLnBOYW1lOw0KKyAgICBGWF9HZXRQYXR0ZXJuKG1fcEVsZW1lbnQsICJudW1iZXJQYXR0ZXJuIiwgd3NUeXBlLCB3c1BhdHRlcm4pOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9Jc0RpZ2l0KEZYX1dDSEFSIGMpDQorew0KKyAgICByZXR1cm4gYyA+PSAnMCcgJiYgYyA8PSAnOSc7DQorfQ0KK3N0YXRpYyBGWF9CT09MIEZYX0lzQWxwaGEoRlhfV0NIQVIgYykNCit7DQorICAgIHJldHVybiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJyk7DQorfQ0KK3N0YXRpYyBGWF9CT09MIEZYX0lzU3BhY2UoRlhfV0NIQVIgYykNCit7DQorICAgIHJldHVybiAoYyA9PSAweDIwKSB8fCAoYyA9PSAweDBkKSB8fCAoYyA9PSAweDBhKSB8fCAoYyA9PSAweDA5KTsNCit9DQorc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGdzX2ZyYWN0aW9uX3NjYWxlc1tdID0gezAuMWYsIDAuMDFmLCAwLjAwMWYsIDAuMDAwMWYsIDAuMDAwMDFmLCAwLjAwMDAwMWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMWYsIDAuMDAwMDAwMDFmLCAwLjAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMDFmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCitzdGF0aWMgY29uc3QgRlhfSU5UMzIgZ3NfZnJhY3Rpb25fY291bnQgPSBzaXplb2YoZ3NfZnJhY3Rpb25fc2NhbGVzKSAvIHNpemVvZihGWF9GTE9BVCk7DQorY2xhc3MgQ0ZYX0xDTnVtZXJpYyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0xDTnVtZXJpYygpOw0KKyAgICBDRlhfTENOdW1lcmljKEZYX0lOVDY0IGludGVncmFsLCBGWF9EV09SRCBmcmFjdGlvbmFsID0gMCwgRlhfSU5UMzIgZXhwb25lbnQgPSAwKTsNCisgICAgQ0ZYX0xDTnVtZXJpYyhGWF9GTE9BVCBkYlJldFZhbHVlKTsNCisgICAgQ0ZYX0xDTnVtZXJpYyhkb3VibGUgZGJ2YWx1ZSk7DQorICAgIENGWF9MQ051bWVyaWMoQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtZXJpYyk7DQorDQorICAgIEZYX0ZMT0FUCQkJCUdldEZsb2F0KCkgY29uc3Q7DQorICAgIGRvdWJsZQkJCQkJR2V0RG91YmxlKCkgY29uc3Q7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJVG9TdHJpbmcoKSBjb25zdDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQlUb1N0cmluZyhGWF9JTlQzMiBuVHJlYWRpbmcsIEZYX0JPT0wgYlRyaW1UYWlsWmVyb3MpIGNvbnN0Ow0KKyAgICBGWF9JTlQ2NAkJCQltX0ludGVncmFsOw0KKyAgICBGWF9EV09SRAkJCQltX0ZyYWN0aW9uYWw7DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzVmFsdWU7DQorI2VuZGlmDQorICAgIEZYX0lOVDMyCQkJCW1fRXhwb25lbnQ7DQorfTsNCitzdGF0aWMgRlhfQk9PTCBGWF9XU3RyaW5nVG9OdW1lcmljKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBDRlhfTENOdW1lcmljJiBsY251bSkNCit7DQorICAgIEZYX0lOVDY0ICpwSW50ZWdyYWwgPSAmbGNudW0ubV9JbnRlZ3JhbDsNCisgICAgRlhfRFdPUkQgKnBGcmFjdGlvbmFsID0gJmxjbnVtLm1fRnJhY3Rpb25hbDsNCisgICAgRlhfSU5UMzIgKnBFeHBvbmVudCA9ICZsY251bS5tX0V4cG9uZW50Ow0KKyAgICAqcEludGVncmFsID0gMDsNCisgICAgKnBGcmFjdGlvbmFsID0gMDsNCisgICAgKnBFeHBvbmVudCA9IDA7DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgICAgbGNudW0ubV93c1ZhbHVlLkVtcHR5KCk7DQorI2VuZGlmDQorICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGNvbnN0IEZYX0lOVDMyIG5JbnRlZ3JhbE1heExlbiA9IDE3Ow0KKyAgICBGWF9JTlQzMiBjYyA9IDA7DQorICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQorICAgIEZYX0xQQ1dTVFIgc3RyID0gKEZYX0xQQ1dTVFIpd3NWYWx1ZTsNCisgICAgRlhfSU5UMzIgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzU3BhY2Uoc3RyW2NjXSkpIHsNCisgICAgICAgIGNjKys7DQorICAgIH0NCisgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgY2MrKzsNCisgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgICAgIGNjKys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkludGVncmFsTGVuID0gMDsNCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGlmICgoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobkludGVncmFsTGVuIDwgbkludGVncmFsTWF4TGVuKSB7DQorICAgICAgICAgICAgKnBJbnRlZ3JhbCA9ICpwSW50ZWdyYWwgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgICAgICAgbkludGVncmFsTGVuKys7DQorICAgICAgICB9DQorICAgICAgICBjYyArKzsNCisgICAgfQ0KKyAgICAqcEludGVncmFsID0gYk5lZ2F0aXZlID8gLSpwSW50ZWdyYWwgOiAqcEludGVncmFsOw0KKyAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICAgIGludCBzY2FsZSA9IDA7DQorICAgICAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7DQorICAgICAgICBjYyArKzsNCisgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmIChzY2FsZSA+PSBnc19mcmFjdGlvbl9jb3VudCkgew0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgaWYgKChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZyYWN0aW9uICs9IGdzX2ZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7DQorICAgICAgICAgICAgc2NhbGUgKys7DQorICAgICAgICAgICAgY2MgKys7DQorICAgICAgICB9DQorICAgICAgICAqcEZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsNCisgICAgfQ0KKyAgICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICAgICAgY2MgKys7DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICpwRXhwb25lbnQgPSAqcEV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKnBFeHBvbmVudCA9IGJFeHBTaWduID8gLSpwRXhwb25lbnQgOiAqcEV4cG9uZW50Ow0KKyAgICB9DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgICAgZWxzZSB7DQorICAgICAgICBsY251bS5tX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICB9DQorI2VuZGlmDQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKCkNCit7DQorICAgIG1fSW50ZWdyYWwgPSAwOw0KKyAgICBtX0ZyYWN0aW9uYWwgPSAwOw0KKyAgICBtX0V4cG9uZW50ID0gMDsNCit9DQorQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhGWF9JTlQ2NCBpbnRlZ3JhbCwgRlhfRFdPUkQgZnJhY3Rpb25hbCAsIEZYX0lOVDMyIGV4cG9uZW50ICkNCit7DQorICAgIG1fSW50ZWdyYWwgPSBpbnRlZ3JhbDsNCisgICAgbV9GcmFjdGlvbmFsID0gZnJhY3Rpb25hbDsNCisgICAgbV9FeHBvbmVudCA9IGV4cG9uZW50Ow0KK30NCitDRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKEZYX0ZMT0FUIGRiUmV0VmFsdWUpDQorew0KKyAgICBtX0ludGVncmFsID0gKEZYX0lOVDY0KWRiUmV0VmFsdWU7DQorICAgIG1fRnJhY3Rpb25hbCA9IChGWF9EV09SRCkoKChkYlJldFZhbHVlID4gMCkgPyAoZGJSZXRWYWx1ZSAtIG1fSW50ZWdyYWwpIDogKG1fSW50ZWdyYWwgLSBkYlJldFZhbHVlKSkgKiA0Mjk0OTY3Mjk2KTsNCisgICAgbV9FeHBvbmVudCA9IDA7DQorfQ0KK0NGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoZG91YmxlIGRidmFsdWUpDQorew0KKyAgICBtX0ludGVncmFsID0gKEZYX0lOVDY0KWRidmFsdWU7DQorICAgIG1fRnJhY3Rpb25hbCA9IChGWF9EV09SRCkoKChkYnZhbHVlID4gMCkgPyAoZGJ2YWx1ZSAtIG1fSW50ZWdyYWwpIDogKG1fSW50ZWdyYWwgLSBkYnZhbHVlKSkgKiA0Mjk0OTY3Mjk2KTsNCisgICAgbV9FeHBvbmVudCA9IDA7DQorfQ0KK0NGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtZXJpYykNCit7DQorICAgIEZYX1dTdHJpbmdUb051bWVyaWMod3NOdW1lcmljLCAqdGhpcyk7DQorfQ0KK0ZYX0ZMT0FUIENGWF9MQ051bWVyaWM6OkdldEZsb2F0KCkgY29uc3QNCit7DQorICAgIEZYX0ZMT0FUIGRiUmV0VmFsdWUgPSBtX0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjBmOw0KKyAgICBkYlJldFZhbHVlID0gbV9JbnRlZ3JhbCArIChtX0ludGVncmFsID49IDAgPyBkYlJldFZhbHVlIDogLWRiUmV0VmFsdWUpOw0KKyAgICBpZiAobV9FeHBvbmVudCAhPSAwKSB7DQorICAgICAgICBkYlJldFZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW1fRXhwb25lbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBkYlJldFZhbHVlOw0KK30NCitkb3VibGUgQ0ZYX0xDTnVtZXJpYzo6R2V0RG91YmxlKCkgY29uc3QNCit7DQorICAgIGRvdWJsZSB2YWx1ZSA9IG1fRnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMDsNCisgICAgdmFsdWUgPSBtX0ludGVncmFsICsgKG1fSW50ZWdyYWwgPj0gMCA/IHZhbHVlIDogLXZhbHVlKTsNCisgICAgaWYgKG1fRXhwb25lbnQgIT0gMCkgew0KKyAgICAgICAgdmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbV9FeHBvbmVudCk7DQorICAgIH0NCisgICAgcmV0dXJuIHZhbHVlOw0KK30NCitDRlhfV2lkZVN0cmluZyBDRlhfTENOdW1lcmljOjpUb1N0cmluZygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gVG9TdHJpbmcoOCwgVFJVRSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENGWF9MQ051bWVyaWM6OlRvU3RyaW5nKEZYX0lOVDMyIG5UcmVhZGluZywgRlhfQk9PTCBiVHJpbVRhaWxaZXJvcykgY29uc3QNCit7DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXN1bHQ7DQorICAgIGlmICghbV93c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgY29uc3QgRlhfSU5UMzIgbkludGVncmFsTWF4TGVuID0gMTc7DQorICAgICAgICBGWF9JTlQzMiBjYyA9IDA7DQorICAgICAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICAgICAgRlhfTFBDV1NUUiBzdHIgPSAoRlhfTFBDV1NUUiltX3dzVmFsdWU7DQorICAgICAgICBGWF9JTlQzMiBsZW4gPSBtX3dzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNTcGFjZShzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2MgPj0gbGVuKSB7DQorICAgICAgICAgICAgcmV0dXJuIHdzUmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgaWYgKChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdzUmVzdWx0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChuSW50ZWdyYWxMZW4gPCBuSW50ZWdyYWxNYXhMZW4pIHsNCisgICAgICAgICAgICAgICAgKnBJbnRlZ3JhbCA9ICpwSW50ZWdyYWwgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgICAgICAgICAgIG5JbnRlZ3JhbExlbisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgIH0NCisgICAgICAgICpwSW50ZWdyYWwgPSBiTmVnYXRpdmUgPyAtKnBJbnRlZ3JhbCA6ICpwSW50ZWdyYWw7DQorICAgICAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICAgICAgICBpbnQgc2NhbGUgPSAwOw0KKyAgICAgICAgICAgIGRvdWJsZSBmcmFjdGlvbiA9IDAuMDsNCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgaWYgKHNjYWxlID49IGdzX2ZyYWN0aW9uX2NvdW50KSB7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZnJhY3Rpb24gKz0gZ3NfZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICAgICAgICAgICAgc2NhbGUgKys7DQorICAgICAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAqcEZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBkb3VibGUgZGJWYWxldSA9IEdldERvdWJsZSgpOw0KKyAgICBGWF9JTlQ2NCBpSW50ZSA9IChGWF9JTlQ2NClkYlZhbGV1Ow0KKyAgICB3c1Jlc3VsdC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlbCIsIChGWF9JTlQ2NClpSW50ZSk7DQorICAgIGlmIChtX0ZyYWN0aW9uYWwpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgICAgICAgd3NGb3JtYXQuRm9ybWF0KChGWF9MUENXU1RSKUwiJSUuJWRHIiwgblRyZWFkaW5nKTsNCisgICAgICAgIGRvdWJsZSBkYmxNYW50aXNzYSA9IChkYlZhbGV1ID4gMCkgPyAoZGJWYWxldSAtIGlJbnRlKSA6IChpSW50ZSAtIGRiVmFsZXUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGcmFjOw0KKyAgICAgICAgd3NGcmFjLkZvcm1hdCgoRlhfTFBDV1NUUil3c0Zvcm1hdCwgZGJsTWFudGlzc2EpOw0KKyAgICAgICAgd3NSZXN1bHQgKz0gQ0ZYX1dpZGVTdHJpbmdDKChGWF9MUENXU1RSKXdzRnJhYyArIDEsIHdzRnJhYy5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgICAgaWYgKGJUcmltVGFpbFplcm9zICYmIG5UcmVhZGluZyA+IDApIHsNCisgICAgICAgICAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIwIik7DQorICAgICAgICAgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiLiIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorI2VuZGlmDQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgICB3c0Zvcm1hdC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlJS4lZGYiLCBuVHJlYWRpbmcpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1Jlc3VsdDsNCisgICAgd3NSZXN1bHQuRm9ybWF0KEZYX0xQQ1dTVFIod3NGb3JtYXQpLCBHZXREb3VibGUoKSk7DQorICAgIGlmIChiVHJpbVRhaWxaZXJvcyAmJiBuVHJlYWRpbmcgPiAwKSB7DQorICAgICAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIwIik7DQorICAgICAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIuIik7DQorICAgIH0NCisgICAgcmV0dXJuIHdzUmVzdWx0Ow0KK30NCitJRlhfRm9ybWF0U3RyaW5nKiBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUoSUZYX0xvY2FsZU1nciogcExvY2FsZU1nciwgRlhfQk9PTCBiVXNlTENJRCkNCit7DQorICAgIGlmICghcExvY2FsZU1ncikgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZYX05FVyBDRlhfRm9ybWF0U3RyaW5nKHBMb2NhbGVNZ3IsIGJVc2VMQ0lEKTsNCit9DQorQ0ZYX0Zvcm1hdFN0cmluZzo6Q0ZYX0Zvcm1hdFN0cmluZyhJRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyLCBGWF9CT09MIGJVc2VMQ0lEKQ0KKyAgICA6IG1fcExvY2FsZU1ncihwTG9jYWxlTWdyKQ0KKyAgICAsIG1fYlVzZUxDSUQoYlVzZUxDSUQpDQorew0KK30NCitDRlhfRm9ybWF0U3RyaW5nOjp+Q0ZYX0Zvcm1hdFN0cmluZygpDQorew0KK30NCit2b2lkIENGWF9Gb3JtYXRTdHJpbmc6OlNwbGl0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdFN0cmluZywgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXR0ZXJucykNCit7DQorICAgIEZYX0lOVDMyIGlTdHJMZW4gPSB3c0Zvcm1hdFN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDV1NUUiBwU3RyID0gKEZYX0xQQ1dTVFIpd3NGb3JtYXRTdHJpbmc7DQorICAgIEZYX0xQQ1dTVFIgcFRva2VuID0gcFN0cjsNCisgICAgRlhfTFBDV1NUUiBwRW5kID0gcFN0ciArIGlTdHJMZW47DQorICAgIEZYX0JPT0wgaVF1b3RlID0gRkFMU0U7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBpZiAocFN0ciA+PSBwRW5kKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3ViKHBUb2tlbiwgcFN0ciAtIHBUb2tlbik7DQorICAgICAgICAgICAgd3NQYXR0ZXJucy5BZGQoc3ViKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9IGVsc2UgaWYgKCpwU3RyID09ICdcJycpIHsNCisgICAgICAgICAgICBpUXVvdGUgPSAhaVF1b3RlOw0KKyAgICAgICAgfSBlbHNlIGlmICgqcFN0ciA9PSBMJ3wnICYmICFpUXVvdGUpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdWIocFRva2VuLCBwU3RyIC0gcFRva2VuKTsNCisgICAgICAgICAgICB3c1BhdHRlcm5zLkFkZChzdWIpOw0KKyAgICAgICAgICAgIHBUb2tlbiA9IHBTdHIgKyAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFN0ciArKzsNCisgICAgfQ0KK30NCitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRlhfR2V0TGl0ZXJhbFRleHQoRlhfTFBDV1NUUiBwU3RyUGF0dGVybiwgRlhfSU5UMzIgJmlQYXR0ZXJuLCBGWF9JTlQzMiBpTGVuUGF0dGVybikNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9ICdcJycpIHsNCisgICAgICAgIHJldHVybiB3c091dHB1dDsNCisgICAgfQ0KKyAgICBpUGF0dGVybisrOw0KKyAgICBGWF9JTlQzMiBpUXVvdGUgPSAxOw0KKyAgICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgew0KKyAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgaVF1b3RlKys7DQorICAgICAgICAgICAgaWYgKChpUGF0dGVybiArIDEgPj0gaUxlblBhdHRlcm4pIHx8ICgocFN0clBhdHRlcm5baVBhdHRlcm4gKyAxXSAhPSAnXCcnKSAmJiAoaVF1b3RlICUgMiA9PSAwKSkpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaVF1b3RlKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXFwnICYmIChpUGF0dGVybiArIDEgPCBpTGVuUGF0dGVybikgJiYgcFN0clBhdHRlcm5baVBhdHRlcm4gKyAxXSA9PSAndScpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpS2V5VmFsdWUgPSAwOw0KKyAgICAgICAgICAgIGlQYXR0ZXJuICs9IDI7DQorICAgICAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaSsrIDwgNCkgew0KKyAgICAgICAgICAgICAgICBGWF9XQ0hBUiBjaCA9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KKyAgICAgICAgICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpKSB7DQorICAgICAgICAgICAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJzAnOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdhJyArIDEwOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdBJyArIDEwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChpS2V5VmFsdWUgIT0gMCkgew0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSAoRlhfV0NIQVIpKGlLZXlWYWx1ZSAmIDB4MDAwMEZGRkYpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KKyAgICB9DQorICAgIHJldHVybiB3c091dHB1dDsNCit9DQorc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShGWF9MUENXU1RSIHBTdHJQYXR0ZXJuLCBGWF9JTlQzMiAmaVBhdHRlcm4pDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSAnXCcnKSB7DQorICAgICAgICByZXR1cm4gd3NPdXRwdXQ7DQorICAgIH0NCisgICAgaVBhdHRlcm4tLTsNCisgICAgRlhfSU5UMzIgaVF1b3RlID0gMTsNCisgICAgd2hpbGUgKGlQYXR0ZXJuID49IDApIHsNCisgICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KKyAgICAgICAgICAgIGlRdW90ZSsrOw0KKyAgICAgICAgICAgIGlmIChpUGF0dGVybiAtIDEgPj0gMCB8fCAoKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuIC0gMV0gIT0gJ1wnJykgJiYgKGlRdW90ZSAlIDIgPT0gMCkpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlRdW90ZSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpUGF0dGVybi0tOw0KKyAgICAgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1xcJyAmJiBwU3RyUGF0dGVybltpUGF0dGVybiArIDFdID09ICd1Jykgew0KKyAgICAgICAgICAgIGlQYXR0ZXJuLS07DQorICAgICAgICAgICAgRlhfSU5UMzIgaUtleVZhbHVlID0gMDsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVuID0gd3NPdXRwdXQuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaSA9IDE7DQorICAgICAgICAgICAgZm9yICg7IGkgPCBpTGVuICYmIGkgPCA1OyBpKyspIHsNCisgICAgICAgICAgICAgICAgRlhfV0NIQVIgY2ggPSB3c091dHB1dFtpXTsNCisgICAgICAgICAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICcwJzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnYScgKyAxMDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnQScgKyAxMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaUtleVZhbHVlICE9IDApIHsNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQuRGVsZXRlKDAsIGkpOw0KKyAgICAgICAgICAgICAgICB3c091dHB1dCA9IChGWF9XQ0hBUikoaUtleVZhbHVlICYgMHgwMDAwRkZGRikgKyB3c091dHB1dDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICB3c091dHB1dCA9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuLS1dICsgd3NPdXRwdXQ7DQorICAgIH0NCisgICAgcmV0dXJuIHdzT3V0cHV0Ow0KK30NCitGWF9MT0NBTEVDQVRFR09SWSBDRlhfRm9ybWF0U3RyaW5nOjpHZXRDYXRlZ29yeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKQ0KK3sNCisgICAgRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93bjsNCisgICAgRlhfSU5UMzIgY2NmID0gMDsNCisgICAgRlhfSU5UMzIgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICAgIEZYX0xQQ1dTVFIgcFN0ciA9IChGWF9MUENXU1RSKXdzUGF0dGVybjsNCisgICAgRlhfQk9PTCBiQnJhY2VPcGVuID0gRkFMU0U7DQorICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0ciwgY2NmLCBpTGVuZik7DQorICAgICAgICB9IGVsc2UgaWYgKCFiQnJhY2VPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgICAgICAgICBpZiAoY2NmID09IGlMZW5mKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNhdGVnb3J5Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICggcFN0cltjY2ZdID09ICcuJyB8fCBwU3RyW2NjZl0gPT0gJygnKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocFN0cltjY2ZdID09ICd7Jykgew0KKyAgICAgICAgICAgICAgICAgICAgYkJyYWNlT3BlbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3c0NhdGVnb3J5ICs9IHBTdHJbY2NmXTsNCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQ2F0ZWdvcnksIHdzQ2F0ZWdvcnkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lSGFzaCkgew0KKyAgICAgICAgICAgICAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lSGFzaCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfVGV4dEhhc2gpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfTnVtSGFzaCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfTnVtOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX1plcm9IYXNoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX051bGxIYXNoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd9Jykgew0KKyAgICAgICAgICAgIGJCcmFjZU9wZW4gPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICB9DQorICAgIHJldHVybiBlQ2F0ZWdvcnk7DQorfQ0KK3N0YXRpYyBGWF9XT1JEIEZYX1dTdHJpbmdUb0xDSUQoRlhfTFBDV1NUUiBwc3RyTENJRCkNCit7DQorICAgIGlmICghcHN0ckxDSUQpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHdjaGFyX3QqIHBFbmQ7DQorICAgIHJldHVybiAoRlhfV09SRCl3Y3N0b2woKHdjaGFyX3QqKXBzdHJMQ0lELCAmcEVuZCwgMTYpOw0KK30NCitGWF9XT1JECUNGWF9Gb3JtYXRTdHJpbmc6OkdldExDSUQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikNCit7DQorICAgIHJldHVybiBGWF9XU3RyaW5nVG9MQ0lEKEdldExvY2FsZU5hbWUod3NQYXR0ZXJuKSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENGWF9Gb3JtYXRTdHJpbmc6OkdldExvY2FsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikNCit7DQorICAgIEZYX0lOVDMyIGNjZiA9IDA7DQorICAgIEZYX0lOVDMyIGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHBTdHIgPSAoRlhfTFBDV1NUUil3c1BhdHRlcm47DQorICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0ciwgY2NmLCBpTGVuZik7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnKCcpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQorICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKScpIHsNCisgICAgICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gd3NMQ0lEOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgIH0NCisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK0lGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldFRleHRGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGF0dGVybiwgRlhfV1NUUiB3c0NhdGVnb3J5LCBDRlhfV2lkZVN0cmluZyYgd3NQdXJnZVBhdHRlcm4pDQorew0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgICAgRlhfSU5UMzIgY2NmID0gMDsNCisgICAgRlhfSU5UMzIgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICAgIEZYX0xQQ1dTVFIgcFN0ciA9IChGWF9MUENXU1RSKXdzUGF0dGVybjsNCisgICAgRlhfQk9PTCBiQnJhY2tPcGVuID0gRkFMU0U7DQorICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUN1ckNoYXIgPSBjY2Y7DQorICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0ciwgY2NmLCBpTGVuZik7DQorICAgICAgICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gQ0ZYX1dpZGVTdHJpbmdDKHBTdHIgKyBpQ3VyQ2hhciwgY2NmIC0gaUN1ckNoYXIgKyAxKTsNCisgICAgICAgIH0gZWxzZSBpZiAoIWJCcmFja09wZW4gJiYgRlhfTG9jYWxfRmluZChnc193c0NvbnN0Q2hhcnMsIHBTdHJbY2NmXSkgPCAwKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTZWFyY2hDYXRlZ29yeShwU3RyW2NjZl0pOw0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYgcFN0cltjY2ZdICE9ICcoJykgew0KKyAgICAgICAgICAgICAgICB3c1NlYXJjaENhdGVnb3J5ICs9IHBTdHJbY2NmXTsNCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh3c1NlYXJjaENhdGVnb3J5ICE9IHdzQ2F0ZWdvcnkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcpJykJew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzTENJRCArPSBwU3RyW2NjZisrXTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUgPSBHZXRQYXR0ZXJuTG9jYWxlKHdzTENJRCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd7Jykgew0KKyAgICAgICAgICAgICAgICAgICAgYkJyYWNrT3BlbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsNCisgICAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQorICAgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgfQ0KKyAgICBpZiAoIWJCcmFja09wZW4pIHsNCisgICAgICAgIHdzUHVyZ2VQYXR0ZXJuID0gd3NQYXR0ZXJuOw0KKyAgICB9DQorICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIHBMb2NhbGU7DQorfQ0KKyNkZWZpbmUgRlhfTlVNU1RZTEVfUGVyY2VudAkJMHgwMQ0KKyNkZWZpbmUgRlhfTlVNU1RZTEVfRXhwb25lbnQJMHgwMg0KKyNkZWZpbmUgRlhfTlVNU1RZTEVfRG90Vm9ydgkJMHgwNA0KK0lGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldE51bWVyaWNGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfSU5UMzImIGlEb3RJbmRleCwgRlhfRFdPUkQmIGR3U3R5bGUsIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybikNCit7DQorICAgIGR3U3R5bGUgPSAwOw0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgICAgRlhfSU5UMzIgY2NmID0gMDsNCisgICAgRlhfSU5UMzIgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICAgIEZYX0xQQ1dTVFIgcFN0ciA9IChGWF9MUENXU1RSKXdzUGF0dGVybjsNCisgICAgRlhfQk9PTCBiRmluZERvdCA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGJCcmFja09wZW4gPSBGQUxTRTsNCisgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgICAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpQ3VyQ2hhciA9IGNjZjsNCisgICAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSBDRlhfV2lkZVN0cmluZ0MocFN0ciArIGlDdXJDaGFyLCBjY2YgLSBpQ3VyQ2hhciArIDEpOw0KKyAgICAgICAgfSBlbHNlIGlmICghYkJyYWNrT3BlbiAmJiBGWF9Mb2NhbF9GaW5kKGdzX3dzQ29uc3RDaGFycywgcFN0cltjY2ZdKSA8IDApIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NhdGVnb3J5KHBTdHJbY2NmXSk7DQorICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAneycgJiYgcFN0cltjY2ZdICE9ICcuJyAmJiBwU3RyW2NjZl0gIT0gJygnKSB7DQorICAgICAgICAgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHdzQ2F0ZWdvcnkgIT0gRlhfV1NUUkMoTCJudW0iKSkgew0KKyAgICAgICAgICAgICAgICBiQnJhY2tPcGVuID0gVFJVRTsNCisgICAgICAgICAgICAgICAgY2NmID0gMDsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcpJykJew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzTENJRCArPSBwU3RyW2NjZisrXTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUgPSBHZXRQYXR0ZXJuTG9jYWxlKHdzTENJRCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd7Jykgew0KKyAgICAgICAgICAgICAgICAgICAgYkJyYWNrT3BlbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJy4nKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N1YkNhdGVnb3J5Ow0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcoJyAmJiBwU3RyW2NjZl0gIT0gJ3snKQl7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NTdWJDYXRlZ29yeSArPSBwU3RyW2NjZisrXTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3ViSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzU3ViQ2F0ZWdvcnksIHdzU3ViQ2F0ZWdvcnkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVN1YkNhdGVnb3J5ID0gRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGdfaUZYTG9jYWxlTnVtU3ViQ2F0Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0gKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZKWdfRlhMb2NhbGVOdW1TdWJDYXREYXRhW2ldLmVTdWJDYXRlZ29yeTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3NTdWJDYXRlZ29yeS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocExvY2FsZSAhPSBOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c1N1YkNhdGVnb3J5KTsNCisgICAgICAgICAgICAgICAgICAgIGlEb3RJbmRleCA9IHdzU3ViQ2F0ZWdvcnkuRmluZCgnLicpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlEb3RJbmRleCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpRG90SW5kZXggKz0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCkgOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kRG90ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0RvdFZvcnY7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSB3c1N1YkNhdGVnb3J5Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVTdWJDYXRlZ29yeSA9PSBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX1BlcmNlbnQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnRScpIHsNCisgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0V4cG9uZW50Ow0KKyAgICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsNCisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICclJykgew0KKyAgICAgICAgICAgIGR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfUGVyY2VudDsNCisgICAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsNCisgICAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJGaW5kRG90KSB7DQorICAgICAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICdWJyB8fCBwU3RyW2NjZl0gPT0gJ3YnKSB7DQorICAgICAgICAgICAgICAgIGJGaW5kRG90ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCkgLSAxOw0KKyAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0RvdFZvcnY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgIH0NCisgICAgaWYgKCFiRmluZERvdCkgew0KKyAgICAgICAgaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICAgIH0NCisgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcExvY2FsZTsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfR2V0TnVtZXJpY0RvdEluZGV4KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRG90U3ltYm9sLCBGWF9JTlQzMiAmaURvdEluZGV4KQ0KK3sNCisgICAgRlhfSU5UMzIgY2NmID0gMDsNCisgICAgRlhfSU5UMzIgaUxlbmYgPSB3c051bS5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDV1NUUiBwU3RyID0gKEZYX0xQQ1dTVFIpd3NOdW07DQorICAgIEZYX0lOVDMyIGlMZW5Eb3QgPSB3c0RvdFN5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgICAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCisgICAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICAgIH0gZWxzZSBpZiAoY2NmICsgaUxlbkRvdCA8PSBpTGVuZiAmJiAhRlhTWVNfd2NzbmNtcChwU3RyICsgY2NmLCAoRlhfTFBDV1NUUil3c0RvdFN5bWJvbCwgaUxlbkRvdCkpIHsNCisgICAgICAgICAgICBpRG90SW5kZXggPSBjY2Y7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgfQ0KKyAgICBpRG90SW5kZXggPSB3c051bS5GaW5kKCcuJyk7DQorICAgIGlmIChpRG90SW5kZXggPCAwKSB7DQorICAgICAgICBpRG90SW5kZXggPSBpTGVuZjsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpDQorew0KKyAgICB3c1ZhbHVlLkVtcHR5KCk7DQorICAgIGlmICh3c1NyY1RleHQuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgRlhfV1NUUkMoTCJ0ZXh0IiksIHdzVGV4dEZvcm1hdCk7DQorICAgIGlmICh3c1RleHRGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcFN0clRleHQgPSAoRlhfTFBDV1NUUil3c1NyY1RleHQ7DQorICAgIEZYX0lOVDMyIGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHBTdHJQYXR0ZXJuID0gKEZYX0xQQ1dTVFIpd3NUZXh0Rm9ybWF0Ow0KKyAgICBGWF9JTlQzMiBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgew0KKyAgICAgICAgc3dpdGNoIChwU3RyUGF0dGVybltpUGF0dGVybl0pIHsNCisgICAgICAgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8IEZYU1lTX3djc25jbXAocFN0clRleHQgKyBpVGV4dCwgKEZYX0xQQ1dTVFIpd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gd3NTcmNUZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlUZXh0ICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAnQSc6DQorICAgICAgICAgICAgICAgIGlmIChGWF9Jc0FscGhhKHBTdHJUZXh0W2lUZXh0XSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gcFN0clRleHRbaVRleHRdOw0KKyAgICAgICAgICAgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdYJzoNCisgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07DQorICAgICAgICAgICAgICAgIGlUZXh0Kys7DQorICAgICAgICAgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ08nOg0KKyAgICAgICAgICAgIGNhc2UgJzAnOg0KKyAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChwU3RyVGV4dFtpVGV4dF0pIHx8IEZYX0lzQWxwaGEocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07DQorICAgICAgICAgICAgICAgICAgICBpVGV4dCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChwU3RyVGV4dFtpVGV4dF0pKSB7DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCisgICAgICAgICAgICAgICAgICAgIGlUZXh0Kys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSBwU3RyVGV4dFtpVGV4dF0pIHsNCisgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSB3c1NyY1RleHQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KK30NCitGWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfRkxPQVQgJmZWYWx1ZSkNCit7DQorICAgIGZWYWx1ZSA9IDAuMGY7DQorICAgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGRvdF9pbmRleF9mID0gLTE7DQorICAgIEZYX0RXT1JEIGR3Rm9ybWF0U3R5bGUgPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c051bUZvcm1hdDsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldE51bWVyaWNGb3JtYXQod3NQYXR0ZXJuLCBkb3RfaW5kZXhfZiwgZHdGb3JtYXRTdHlsZSwgd3NOdW1Gb3JtYXQpOw0KKyAgICBpZiAoIXBMb2NhbGUgfHwgd3NOdW1Gb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUV4cG9uZW50ID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3RTeW1ib2w7DQorICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c0RvdFN5bWJvbCk7DQorICAgIEZYX0lOVDMyIGlEb3RMZW4gPSB3c0RvdFN5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgICAgRlhfSU5UMzIgaUdyb3VwTGVuID0gd3NHcm91cFN5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51czsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzKTsNCisgICAgRlhfSU5UMzIgaU1pbnVzTGVuID0gd3NNaW51cy5HZXRMZW5ndGgoKTsNCisgICAgaW50IGNjID0gMCwgY2NmID0gMDsNCisgICAgRlhfTFBDV1NUUiBzdHIgPSAoRlhfTFBDV1NUUil3c1NyY051bTsNCisgICAgaW50IGxlbiA9IHdzU3JjTnVtLkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHN0cmYgPSAoRlhfTFBDV1NUUil3c051bUZvcm1hdDsNCisgICAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsNCisgICAgZG91YmxlIGRiUmV0VmFsdWUgPSAwOw0KKyAgICBkb3VibGUgY29lZmYgPSAxOw0KKyAgICBGWF9CT09MIGJIYXZlUGVyY2VudFN5bWJvbCA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGJOZWcgPSBGQUxTRTsNCisgICAgRlhfQk9PTCBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIGRvdF9pbmRleCA9IDA7DQorICAgIGlmICghRlhfR2V0TnVtZXJpY0RvdEluZGV4KHdzU3JjTnVtLCB3c0RvdFN5bWJvbCwgZG90X2luZGV4KSAmJiAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQorICAgICAgICBiUmV2ZXJzZVBhcnNlID0gVFJVRTsNCisgICAgfQ0KKyAgICBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICAgIGlmIChiUmV2ZXJzZVBhcnNlKSB7DQorICAgICAgICBjY2YgPSBsZW5mIC0gMTsNCisgICAgICAgIGNjID0gbGVuIC0gMTsNCisgICAgICAgIHdoaWxlIChjY2YgPiBkb3RfaW5kZXhfZiAmJiBjYyA+PSAwKSB7DQorICAgICAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICAgICAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaUxpdGVyYWxMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlICc5JzoNCisgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgICAgICAgICBjb2VmZiAqPSAwLjE7DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAneic6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdICE9ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA+PSBkb3RfaW5kZXgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICsgKHN0cltjY10gLSAnMCcpICogMTA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYyAtIGlNaW51c0xlbiArIDEgPiAwICYmICFGWFNZU193Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLCAoRlhfTFBDV1NUUil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGlTeW1ib2xMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NTeW1ib2wsIGlTeW1ib2xMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdyJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmIC0tOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ1InOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnYic6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZiAtLTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdCJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgICAgICAgICBjYXNlICdWJzoNCisgICAgICAgICAgICAgICAgY2FzZSAndic6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIGNhc2UgJyUnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGlTeXNtYm9sTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwICB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c1N5bWJvbCwgaVN5c21ib2xMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJzgnOg0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gKHN0cltjY10gLSAnMCcpICogY29lZmYgKyBkYlJldFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJywnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IDAgJiYgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NHcm91cFN5bWJvbCwgaUdyb3VwTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBkb3RfaW5kZXggPSBjYyArIDE7DQorICAgIH0NCisgICAgY2NmID0gZG90X2luZGV4X2YgLSAxOw0KKyAgICBjYyA9IGRvdF9pbmRleCAtIDE7DQorICAgIGNvZWZmID0gMTsNCisgICAgd2hpbGUgKGNjZiA+PSAwICYmIGNjID49IDApIHsNCisgICAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dFJldmVyc2Uoc3RyZiwgY2NmKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgY2MgLT0gaUxpdGVyYWxMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQorICAgICAgICAgICAgICAgIGNvZWZmICo9IDEwOw0KKyAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAneic6DQorICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMTA7DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMTA7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdzJzoNCisgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjYyA+PSBkb3RfaW5kZXgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICsgKHN0cltjY10gLSAnMCcpICogMTA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYyAtIGlNaW51c0xlbiArIDEgPiAwICYmICFGWFNZU193Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLCAoRlhfTFBDV1NUUil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYyAtLTsNCisgICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgY2MgLT0gaVN5bWJvbExlbiAtIDE7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdyJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNjZiAtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdSJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnYic6DQorICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjY2YgLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnQic6DQorICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgICAgIGNhc2UgJ1YnOg0KKyAgICAgICAgICAgIGNhc2UgJ3YnOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlTeXNtYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICBjYyAtPSBpU3lzbWJvbExlbiAtIDE7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwICB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c1N5bWJvbCwgaVN5c21ib2xMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgYkhhdmVQZXJjZW50U3ltYm9sID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICc4JzoNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIGNhc2UgJywnOiB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IDAgJiYgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NHcm91cFN5bWJvbCwgaUdyb3VwTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcoJykgew0KKyAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJyknKSB7DQorICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoIWJSZXZlcnNlUGFyc2UpIHsNCisgICAgICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsNCisgICAgICAgIGNjID0gKGRvdF9pbmRleCA9PSBsZW4pID8gbGVuIDogZG90X2luZGV4ICsgMTsNCisgICAgICAgIGNvZWZmID0gMC4xOw0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgICAgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUxpdGVyYWxMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiAqPSAwLjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnUyc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgKyBpTWludXNMZW4gPiBsZW4gfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ3MnOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA+PSBsZW4gfHwgKHN0cltjY10gIT0gJ0UnICYmIHN0cltjY10gIT0gJ2UnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkV4cFNpZ24gPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICckJzogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgKyBpU3ltYm9sTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlTeW1ib2xMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnYyc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnQycgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnQyc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ2QnOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ0QnOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdEJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICcuJzoNCisgICAgICAgICAgICAgICAgY2FzZSAnVic6DQorICAgICAgICAgICAgICAgIGNhc2UgJ3YnOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICBjYXNlICclJzogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgKyBpU3lzbWJvbExlbiA8PSBsZW4gJiYgIUZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaVN5c21ib2xMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnOCc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gJzgnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gKHN0cltjY10gLSAnMCcpICogY29lZmYgKyBkYlJldFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiAqPSAwLjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJywnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaUdyb3VwTGVuIDw9IGxlbiAmJiBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c0dyb3VwU3ltYm9sLCBpR3JvdXBMZW4pID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2MgIT0gbGVuKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpRXhwb25lbnQpIHsNCisgICAgICAgIGRiUmV0VmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpaUV4cG9uZW50KTsNCisgICAgfQ0KKyAgICBpZiAoYkhhdmVQZXJjZW50U3ltYm9sKSB7DQorICAgICAgICBkYlJldFZhbHVlIC89IDEwMC4wOw0KKyAgICB9DQorICAgIGlmIChiTmVnKSB7DQorICAgICAgICBkYlJldFZhbHVlID0gLWRiUmV0VmFsdWU7DQorICAgIH0NCisgICAgZlZhbHVlID0gKEZYX0ZMT0FUKWRiUmV0VmFsdWU7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkICBGWF9QYXJzZU51bVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHdzTnVtLkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHBTdHIgPSAoRlhfTFBDV1NUUil3c051bTsNCisgICAgRlhfTFBXU1RSIHBEc3QgPSB3c1Jlc3VsdC5HZXRCdWZmZXIoaUNvdW50KTsNCisgICAgRlhfSU5UMzIgbkluZGV4ID0gMDsNCisgICAgRlhfQk9PTCBiTWludXMgPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgRlhfV0NIQVIgd2MgPSBwU3RyW2ldOw0KKyAgICAgICAgaWYgKHdjID09ICcuJykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCh3YyA9PSBMJzAnIHx8IHdjID09IEwnICcgfHwgd2MgPT0gJysnKSAmJiBuSW5kZXggPT0gMCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdjID09ICctJykgew0KKyAgICAgICAgICAgIHBEc3RbbkluZGV4KytdID0gd2M7DQorICAgICAgICAgICAgYk1pbnVzID0gVFJVRTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh3YyA9PSBMJzAnICYmIG5JbmRleCA9PSAxICYmIGJNaW51cykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcERzdFtuSW5kZXgrK10gPSB3YzsNCisgICAgfQ0KKyAgICBpZiAoYk1pbnVzICYmIG5JbmRleCA9PSAxKSB7DQorICAgICAgICBwRHN0W25JbmRleCsrXSA9ICcwJzsNCisgICAgfQ0KKyAgICBpZiAobkluZGV4ID09IDApIHsNCisgICAgICAgIHdzUmVzdWx0LlJlbGVhc2VCdWZmZXIoMCk7DQorICAgICAgICBwRHN0ID0gd3NSZXN1bHQuR2V0QnVmZmVyKGlDb3VudCArIDEpOw0KKyAgICAgICAgcERzdFtuSW5kZXgrK10gPSAnMCc7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaiA9IDA7DQorICAgIGZvciAoaiA9IGlDb3VudCAtIDE7IGogPiBpOyBqLS0pIHsNCisgICAgICAgIEZYX1dDSEFSIHdjID0gcFN0cltqXTsNCisgICAgICAgIGlmICh3YyAhPSBMJzAnICYmIHdjICE9IEwnICcpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaiA+IGkpIHsNCisgICAgICAgIHBEc3RbbkluZGV4KytdID0gJy4nOw0KKyAgICAgICAgRlhTWVNfd2NzbmNweShwRHN0ICsgbkluZGV4LCBwU3RyICsgaSArIDEsIGogLSBpKTsNCisgICAgICAgIG5JbmRleCArPSBqIC0gaTsNCisgICAgfQ0KKyAgICB3c1Jlc3VsdC5SZWxlYXNlQnVmZmVyKG5JbmRleCk7DQorfQ0KK0ZYX0JPT0wJQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkNCit7DQorICAgIHdzVmFsdWUuRW1wdHkoKTsNCisgICAgaWYgKHdzU3JjTnVtLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZG90X2luZGV4X2YgPSAtMTsNCisgICAgRlhfRFdPUkQgZHdGb3JtYXRTdHlsZSA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7DQorICAgIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpRXhwb25lbnQgPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RvdFN5bWJvbDsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsNCisgICAgRlhfSU5UMzIgaURvdExlbiA9IHdzRG90U3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sOw0KKyAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsIHdzR3JvdXBTeW1ib2wpOw0KKyAgICBGWF9JTlQzMiBpR3JvdXBMZW4gPSB3c0dyb3VwU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOw0KKyAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXMpOw0KKyAgICBGWF9JTlQzMiBpTWludXNMZW4gPSB3c01pbnVzLkdldExlbmd0aCgpOw0KKyAgICBpbnQgY2MgPSAwLCBjY2YgPSAwOw0KKyAgICBGWF9MUENXU1RSIHN0ciA9IChGWF9MUENXU1RSKXdzU3JjTnVtOw0KKyAgICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQorICAgIEZYX0xQQ1dTVFIgc3RyZiA9IChGWF9MUENXU1RSKXdzTnVtRm9ybWF0Ow0KKyAgICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgICBGWF9CT09MIGJIYXZlUGVyY2VudFN5bWJvbCA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGJOZWcgPSBGQUxTRTsNCisgICAgRlhfQk9PTCBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIGRvdF9pbmRleCA9IDA7DQorICAgIGlmICghRlhfR2V0TnVtZXJpY0RvdEluZGV4KHdzU3JjTnVtLCB3c0RvdFN5bWJvbCwgZG90X2luZGV4KSAmJiAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQorICAgICAgICBiUmV2ZXJzZVBhcnNlID0gVFJVRTsNCisgICAgfQ0KKyAgICBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICAgIGNjZiA9IGRvdF9pbmRleF9mIC0gMTsNCisgICAgY2MgPSBkb3RfaW5kZXggLSAxOw0KKyAgICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgew0KKyAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICAgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTGl0ZXJhbExlbiAtIDE7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlICc5JzoNCisgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzVmFsdWU7DQorICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdICE9ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnUyc6DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ3MnOg0KKyAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkV4cFNpZ24gPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjYyA+PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRXhwb25lbnQgPSBpRXhwb25lbnQgKyAoc3RyW2NjXSAtICcwJykgKiAxMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYgIUZYU1lTX3djc25jbXAoc3RyICsgKGNjIC0gaU1pbnVzTGVuICsgMSksIChGWF9MUENXU1RSKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjIC0tOw0KKyAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NTeW1ib2wsIGlTeW1ib2xMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2MnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1InOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdiJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNjZiAtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdCJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLic6DQorICAgICAgICAgICAgY2FzZSAnVic6DQorICAgICAgICAgICAgY2FzZSAndic6DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICBjYXNlICclJzogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgIGNjIC09IGlTeXNtYm9sTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJzgnOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgY2FzZSAnLCc6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCAmJiBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c0dyb3VwU3ltYm9sLCBpR3JvdXBMZW4pID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSBpR3JvdXBMZW4gLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJygnOg0KKyAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJygnKSB7DQorICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnKSc6DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLS07DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZG90X2luZGV4IDwgbGVuICYmIChkd0Zvcm1hdFN0eWxlICYgRlhfTlVNU1RZTEVfRG90Vm9ydikpIHsNCisgICAgICAgIHdzVmFsdWUgKz0gJy4nOw0KKyAgICB9DQorICAgIGlmICghYlJldmVyc2VQYXJzZSkgew0KKyAgICAgICAgY2NmID0gZG90X2luZGV4X2YgKyAxOw0KKyAgICAgICAgY2MgPSAoZG90X2luZGV4ID09IGxlbikgPyBsZW4gOiBkb3RfaW5kZXggKyAxOw0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgICAgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUxpdGVyYWxMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBzdHJbY2NdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdICE9ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdTJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlNaW51c0xlbiA+IGxlbiB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaU1pbnVzTGVuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgKyBpTWludXNMZW4gPiBsZW4gfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlTeW1ib2xMZW4gPiBsZW4gfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NTeW1ib2wsIGlTeW1ib2xMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaVN5bWJvbExlbjsNCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdjJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdDJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdDJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQycgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnZCc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnYicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRCcgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdCJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnRCc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgICAgICAgICBjYXNlICdWJzoNCisgICAgICAgICAgICAgICAgY2FzZSAndic6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIGNhc2UgJyUnOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlTeXNtYm9sTGVuIDw9IGxlbiAmJiAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKEZYX0xQQ1dTVFIpd3NTeW1ib2wsIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSBpU3lzbWJvbExlbjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgYkhhdmVQZXJjZW50U3ltYm9sID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICc4Jzogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgKyBpR3JvdXBMZW4gPD0gbGVuICYmIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzR3JvdXBTeW1ib2wsIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSBpR3JvdXBMZW47DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJygnOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcoJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnKSc6DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJyknKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChjYyAhPSBsZW4pIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlFeHBvbmVudCB8fCBiSGF2ZVBlcmNlbnRTeW1ib2wpIHsNCisgICAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwgPSBDRlhfRGVjaW1hbCh3c1ZhbHVlKTsNCisgICAgICAgIGlmIChpRXhwb25lbnQpIHsNCisgICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKWlFeHBvbmVudCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJIYXZlUGVyY2VudFN5bWJvbCkgew0KKyAgICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsIC8gQ0ZYX0RlY2ltYWwoMTAwKTsNCisgICAgICAgIH0NCisgICAgICAgIHdzVmFsdWUgPSBkZWNpbWFsOw0KKyAgICB9DQorICAgIGlmIChiTmVnKSB7DQorICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKCctJykgKyB3c1ZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9EQVRFVElNRVRZUEUgQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0RGF0ZVRpbWVGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgSUZYX0xvY2FsZSomIHBMb2NhbGUsIENGWF9XaWRlU3RyaW5nICZ3c0RhdGVQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyAmd3NUaW1lUGF0dGVybikNCit7DQorICAgIHBMb2NhbGUgPSBOVUxMOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXBQYXR0ZXJuOw0KKyAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duOw0KKyAgICBGWF9JTlQzMiBjY2YgPSAwOw0KKyAgICBGWF9JTlQzMiBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDV1NUUiBwU3RyID0gKEZYX0xQQ1dTVFIpd3NQYXR0ZXJuOw0KKyAgICBGWF9JTlQzMiBpRmluZENhdGVnb3J5ID0gMDsNCisgICAgRlhfQk9PTCBiQnJhY2VPcGVuID0gRkFMU0U7DQorICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUN1ckNoYXIgPSBjY2Y7DQorICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0ciwgY2NmLCBpTGVuZik7DQorICAgICAgICAgICAgd3NUZW1wUGF0dGVybiArPSBDRlhfV2lkZVN0cmluZ0MocFN0ciArIGlDdXJDaGFyLCBjY2YgLSBpQ3VyQ2hhciArIDEpOw0KKyAgICAgICAgfSBlbHNlIGlmICghYkJyYWNlT3BlbiAmJiBpRmluZENhdGVnb3J5ICE9IDMgJiYgRlhfTG9jYWxfRmluZChnc193c0NvbnN0Q2hhcnMsIHBTdHJbY2NmXSkgPCAwKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRlZ29yeShwU3RyW2NjZl0pOw0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYgcFN0cltjY2ZdICE9ICcoJykgew0KKyAgICAgICAgICAgICAgICBpZiAocFN0cltjY2ZdID09ICdUJykgew0KKyAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzUGF0dGVybi5MZWZ0KGNjZik7DQorICAgICAgICAgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuID0gd3NQYXR0ZXJuLlJpZ2h0KHdzUGF0dGVybi5HZXRMZW5ndGgoKSAtIGNjZik7DQorICAgICAgICAgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuLlNldEF0KDAsICcgJyk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3NDYXRlZ29yeSArPSBwU3RyW2NjZl07DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIShpRmluZENhdGVnb3J5ICYgMSkgJiYgd3NDYXRlZ29yeSA9PSBGWF9XU1RSQyhMImRhdGUiKSkgew0KKyAgICAgICAgICAgICAgICBpRmluZENhdGVnb3J5IHw9IDE7DQorICAgICAgICAgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU7DQorICAgICAgICAgICAgICAgIGlmIChpRmluZENhdGVnb3J5ICYgMikgew0KKyAgICAgICAgICAgICAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoaUZpbmRDYXRlZ29yeSAmIDIpICYmIHdzQ2F0ZWdvcnkgPT0gRlhfV1NUUkMoTCJ0aW1lIikpIHsNCisgICAgICAgICAgICAgICAgaUZpbmRDYXRlZ29yeSB8PSAyOw0KKyAgICAgICAgICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod3NDYXRlZ29yeSA9PSBGWF9XU1RSQyhMImRhdGV0aW1lIikpIHsNCisgICAgICAgICAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDM7DQorICAgICAgICAgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnKCcpIHsNCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKScpCXsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c0xDSUQgKz0gcFN0cltjY2YrK107DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwTG9jYWxlID0gR2V0UGF0dGVybkxvY2FsZSh3c0xDSUQpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsNCisgICAgICAgICAgICAgICAgICAgIGJCcmFjZU9wZW4gPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICcuJykgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdWJDYXRlZ29yeTsNCisgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKCcgJiYgcFN0cltjY2ZdICE9ICd7JykJew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzU3ViQ2F0ZWdvcnkgKz0gcFN0cltjY2YrK107DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N1Ykhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1N1YkNhdGVnb3J5LCB3c1N1YkNhdGVnb3J5LkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVN1YkNhdGVnb3J5ID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZ19pRlhMb2NhbGVEYXRlVGltZVN1YkNhdENvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0gKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkpZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS5lU3ViQ2F0ZWdvcnk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBMb2NhbGUgIT0gTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c0RhdGVQYXR0ZXJuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzVGVtcFBhdHRlcm4gKyB3c0RhdGVQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NUaW1lUGF0dGVybik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c0RhdGVQYXR0ZXJuKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzVGVtcFBhdHRlcm4gKyB3c0RhdGVQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihlU3ViQ2F0ZWdvcnksIHdzVGltZVBhdHRlcm4pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4uRW1wdHkoKTsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd9Jykgew0KKyAgICAgICAgICAgIGJCcmFjZU9wZW4gPSBGQUxTRTsNCisgICAgICAgICAgICBpZiAoIXdzVGVtcFBhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KKyAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzVGVtcFBhdHRlcm47DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4uRW1wdHkoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgIH0NCisgICAgaWYgKCF3c1RlbXBQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlKSB7DQorICAgICAgICAgICAgd3NEYXRlUGF0dGVybiArPSB3c1RlbXBQYXR0ZXJuOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IHdzVGVtcFBhdHRlcm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgfQ0KKyAgICBpZiAoIWlGaW5kQ2F0ZWdvcnkpIHsNCisgICAgICAgIHdzVGltZVBhdHRlcm4uRW1wdHkoKTsNCisgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1BhdHRlcm47DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9EQVRFVElNRVRZUEUpaUZpbmRDYXRlZ29yeTsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfUGFyc2VMb2NhbGVEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDRlhfVW5pdGltZSAmZGF0ZXRpbWUsIEZYX0lOVDMyICZjYykNCit7DQorICAgIEZYX0lOVDMyIHllYXIgPSAxOTAwOw0KKyAgICBGWF9JTlQzMiBtb250aCA9IDE7DQorICAgIEZYX0lOVDMyIGRheSA9IDE7DQorICAgIEZYX0lOVDMyIGNjZiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgc3RyID0gKEZYX0xQQ1dTVFIpd3NEYXRlOw0KKyAgICBGWF9JTlQzMiBsZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0xQQ1dTVFIgc3RyZiA9IChGWF9MUENXU1RSKXdzRGF0ZVBhdHRlcm47DQorICAgIEZYX0lOVDMyIGxlbmYgPSB3c0RhdGVQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2NmIDwgbGVuZikgew0KKyAgICAgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoRlhfTFBDV1NUUil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzRGF0ZVN5bWJvbHMsIHN0cmZbY2NmXSkgPCAwKSB7DQorICAgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0RXT1JEIGR3U3ltYm9sTnVtID0gMTsNCisgICAgICAgIEZYX0RXT1JEIGR3U3ltYm9sID0gc3RyZltjY2YrK107DQorICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdTeW1ib2wpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICBkd1N5bWJvbE51bSsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZHdTeW1ib2wgPSAoZHdTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOw0KKyAgICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRCcsICcxJykpIHsNCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkYXkgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgZGF5ID0gZGF5ICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMicpKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGF5ID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICBkYXkgPSBkYXkgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICcxJykpIHsNCisgICAgICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGkgPCAzICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdKJywgJzMnKSkgew0KKyAgICAgICAgICAgIGNjICs9IDM7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtb250aCA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICBtb250aCA9IG1vbnRoICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMicpKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbW9udGggPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIG1vbnRoID0gbW9udGggKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICczJykpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoTmFtZUFiYnI7DQorICAgICAgICAgICAgRlhfV09SRCBpID0gMDsNCisgICAgICAgICAgICBmb3IgKDsgaSA8IDEyOyBpKyspIHsNCisgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHdzTW9udGhOYW1lQWJiciwgVFJVRSk7DQorICAgICAgICAgICAgICAgIGlmICh3c01vbnRoTmFtZUFiYnIuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKEZYX0xQQ1dTVFIpd3NNb250aE5hbWVBYmJyLCBzdHIgKyBjYywgd3NNb250aE5hbWVBYmJyLkdldExlbmd0aCgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGkgPCAxMikgew0KKyAgICAgICAgICAgICAgICBjYyArPSB3c01vbnRoTmFtZUFiYnIuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgIG1vbnRoID0gaSArIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnNCcpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNb250aE5hbWU7DQorICAgICAgICAgICAgRlhfV09SRCBpID0gMDsNCisgICAgICAgICAgICBmb3IgKDsgaSA8IDEyOyBpKyspIHsNCisgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHdzTW9udGhOYW1lLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIGlmICh3c01vbnRoTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghRlhTWVNfd2NzbmNtcCgoRlhfTFBDV1NUUil3c01vbnRoTmFtZSwgc3RyICsgY2MsIHdzTW9udGhOYW1lLkdldExlbmd0aCgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGkgPCAxMikgew0KKyAgICAgICAgICAgICAgICBjYyArPSB3c01vbnRoTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgbW9udGggPSBpICsgMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICcxJykpIHsNCisgICAgICAgICAgICBjYyArPSAxOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMycpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXlOYW1lQWJicjsNCisgICAgICAgICAgICBGWF9XT1JEIGkgPSAwOw0KKyAgICAgICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERheU5hbWUoaSwgd3NEYXlOYW1lQWJiciwgVFJVRSk7DQorICAgICAgICAgICAgICAgIGlmICh3c0RheU5hbWVBYmJyLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChGWF9MUENXU1RSKXdzRGF5TmFtZUFiYnIsIHN0ciArIGNjLCB3c0RheU5hbWVBYmJyLkdldExlbmd0aCgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGkgPCAxMikgew0KKyAgICAgICAgICAgICAgICBjYyArPSB3c0RheU5hbWVBYmJyLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzQnKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5TmFtZTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykgew0KKyAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKGksIHdzRGF5TmFtZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBpZiAod3NEYXlOYW1lID09IEwiIikgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChGWF9MUENXU1RSKXdzRGF5TmFtZSwgc3RyICsgY2MsIHdzRGF5TmFtZS5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChpIDwgMTIpIHsNCisgICAgICAgICAgICAgICAgY2MgKz0gd3NEYXlOYW1lLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdlJywgJzEnKSkgew0KKyAgICAgICAgICAgIGNjICs9IDE7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRycsICcxJykpIHsNCisgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnMicpKSB7DQorICAgICAgICAgICAgaWYgKGNjICsgMiA+IGxlbikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHllYXIgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAhRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHllYXIgPSB5ZWFyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKHllYXIgPD0gMjkpIHsNCisgICAgICAgICAgICAgICAgeWVhciArPSAyMDAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHllYXIgKz0gMTkwMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWScsICc0JykpIHsNCisgICAgICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICAgICAgeWVhciA9IDA7DQorICAgICAgICAgICAgaWYgKGNjICsgNCA+IGxlbikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlIChpIDwgNCkgew0KKyAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB5ZWFyID0geWVhciAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd3JywgJzEnKSkgew0KKyAgICAgICAgICAgIGNjICs9IDE7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnVycsICcyJykpIHsNCisgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9Vbml0aW1lIHV0Ow0KKyAgICB1dC5TZXQoeWVhciwgbW9udGgsIGRheSk7DQorICAgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgICAgcmV0dXJuIGNjOw0KK30NCitzdGF0aWMgdm9pZCBGWF9SZXNvbHZlWm9uZShGWF9CWVRFJiB3SG91ciwgRlhfQllURSYgd01pbnV0ZSwgRlhfVElNRVpPTkUgdHpEaWZmLCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KK3sNCisgICAgRlhfSU5UMzIgaU1pbnV0ZURpZmYgPSB3SG91ciAqIDYwICsgd01pbnV0ZTsNCisgICAgRlhfVElNRVpPTkUgdHpMb2NhbGU7DQorICAgIHBMb2NhbGUtPkdldFRpbWVab25lKHR6TG9jYWxlKTsNCisgICAgaU1pbnV0ZURpZmYgKz0gdHpMb2NhbGUudHpIb3VyICogNjAgKyAodHpMb2NhbGUudHpIb3VyIDwgMCA/IC10ekxvY2FsZS50ek1pbnV0ZSA6IHR6TG9jYWxlLnR6TWludXRlKTsNCisgICAgaU1pbnV0ZURpZmYgLT0gdHpEaWZmLnR6SG91ciAqIDYwICsgKHR6RGlmZi50ekhvdXIgPCAwID8gLXR6RGlmZi50ek1pbnV0ZSA6IHR6RGlmZi50ek1pbnV0ZSk7DQorICAgIHdoaWxlIChpTWludXRlRGlmZiA+IDE0NDApIHsNCisgICAgICAgIGlNaW51dGVEaWZmIC09IDE0NDA7DQorICAgIH0NCisgICAgd2hpbGUgKGlNaW51dGVEaWZmIDwgMCkgew0KKyAgICAgICAgaU1pbnV0ZURpZmYgKz0gMTQ0MDsNCisgICAgfQ0KKyAgICB3SG91ciA9IGlNaW51dGVEaWZmIC8gNjA7DQorICAgIHdNaW51dGUgPSBpTWludXRlRGlmZiAlIDYwOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9QYXJzZUxvY2FsZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZVBhdHRlcm4sIElGWF9Mb2NhbGUqIHBMb2NhbGUsIENGWF9Vbml0aW1lICZkYXRldGltZSwgRlhfSU5UMzIgJmNjKQ0KK3sNCisgICAgRlhfQllURSBob3VyID0gMDsNCisgICAgRlhfQllURSBtaW51dGUgPSAwOw0KKyAgICBGWF9CWVRFIHNlY29uZCA9IDA7DQorICAgIEZYX1dPUkQgbWlsbGlzZWNvbmQgPSAwOw0KKyAgICBGWF9JTlQzMiBjY2YgPSAwOw0KKyAgICBGWF9MUENXU1RSIHN0ciA9IChGWF9MUENXU1RSKXdzVGltZTsNCisgICAgaW50IGxlbiA9IHdzVGltZS5HZXRMZW5ndGgoKTsNCisgICAgRlhfTFBDV1NUUiBzdHJmID0gKEZYX0xQQ1dTVFIpd3NUaW1lUGF0dGVybjsNCisgICAgaW50IGxlbmYgPSB3c1RpbWVQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgICBGWF9CT09MIGJIYXNBID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYlBNID0gRkFMU0U7DQorICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjY2YgPCBsZW5mKSB7DQorICAgICAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChGWF9MUENXU1RSKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2MgKz0gaUxpdGVyYWxMZW47DQorICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9IGVsc2UgaWYgKEZYX0xvY2FsX0ZpbmQoZ3Nfd3NUaW1lU3ltYm9scywgc3RyZltjY2ZdKSA9PSAtMSkgew0KKyAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQorICAgICAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KKyAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3U3ltYm9sKSB7DQorICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgZHdTeW1ib2xOdW0rKzsNCisgICAgICAgIH0NCisgICAgICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCisgICAgICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2snLCAnMScpIHx8IGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcxJykgfHwgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdoJywgJzEnKSB8fCBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0snLCAnMScpKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaG91ciA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICBob3VyID0gaG91ciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSAmJiBob3VyID09IDI0KSB7DQorICAgICAgICAgICAgICAgIGhvdXIgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzInKSB8fCBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0gnLCAnMicpIHx8IGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykgfHwgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzInKSkgew0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGhvdXIgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGhvdXIgPSBob3VyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykgJiYgaG91ciA9PSAyNCkgew0KKyAgICAgICAgICAgICAgICBob3VyID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtaW51dGUgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMicpKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWludXRlID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgICAgIGlmIChjYyA+PSBsZW4pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtaW51dGUgPSBtaW51dGUgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdTJywgJzEnKSkgew0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNlY29uZCA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICBzZWNvbmQgPSBzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcyJykpIHsNCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzZWNvbmQgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0YnLCAnMycpKSB7DQorICAgICAgICAgICAgaWYgKGNjICsgMyA+PSBsZW4pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGkgPCAzKSB7DQorICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdBJywgJzEnKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQU07DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzQU0sIFRSVUUpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUE07DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzUE0sIEZBTFNFKTsNCisgICAgICAgICAgICBpZiAoKGNjICsgd3NBTS5HZXRMZW5ndGgoKSA8PSBsZW4pICYmIChDRlhfV2lkZVN0cmluZ0Moc3RyICsgY2MsIHdzQU0uR2V0TGVuZ3RoKCkpID09IHdzQU0pKSB7DQorICAgICAgICAgICAgICAgIGNjICs9IHdzQU0uR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgIGJIYXNBID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKChjYyArIHdzUE0uR2V0TGVuZ3RoKCkgPD0gbGVuKSAmJiAoQ0ZYX1dpZGVTdHJpbmdDKHN0ciArIGNjLCB3c1BNLkdldExlbmd0aCgpKSA9PSB3c1BNKSkgew0KKyAgICAgICAgICAgICAgICBjYyArPSB3c1BNLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICBiSGFzQSA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJQTSA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1onLCAnMScpKSB7DQorICAgICAgICAgICAgaWYgKGNjICsgMyA+IGxlbikgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdIYXNoID0gc3RyW2NjKytdOw0KKyAgICAgICAgICAgIGR3SGFzaCA9IChkd0hhc2ggPDwgOCkgfCBzdHJbY2MrK107DQorICAgICAgICAgICAgZHdIYXNoID0gKGR3SGFzaCA8PCA4KSB8IHN0cltjYysrXTsNCisgICAgICAgICAgICBpZiAoZHdIYXNoID09IEZYQlNUUl9JRCgwLCAnRycsICdNJywgJ1QnKSkgew0KKyAgICAgICAgICAgICAgICBGWF9USU1FWk9ORSB0ekRpZmY7DQorICAgICAgICAgICAgICAgIHR6RGlmZi50ekhvdXIgPSAwOw0KKyAgICAgICAgICAgICAgICB0ekRpZmYudHpNaW51dGUgPSAwOw0KKyAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJy0nIHx8IHN0cltjY10gPT0gJysnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0xQQ0xPQ0FMRVRJTUVaT05FSU5GTyBwVGltZVpvbmVJbmZvID0gTlVMTDsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaUZYTG9jYWxlVGltZVpvbmVDb3VudCAtIDE7DQorICAgICAgICAgICAgICAgIGRvIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfTFBDTE9DQUxFVElNRVpPTkVJTkZPIHBJbmZvID0gZ19GWExvY2FsZVRpbWVab25lRGF0YSArIGlNaWQ7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZHdIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lWm9uZUluZm8gPSBwSW5mbzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICAgICAgICAgICAgICBpZiAocFRpbWVab25lSW5mbykgew0KKyAgICAgICAgICAgICAgICAgICAgaG91ciArPSBwVGltZVpvbmVJbmZvLT5pSG91cjsNCisgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSArPSBwVGltZVpvbmVJbmZvLT5pSG91ciA+IDAgPyBwVGltZVpvbmVJbmZvLT5pTWludXRlIDogLXBUaW1lWm9uZUluZm8tPmlNaW51dGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAneicsICcxJykpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnWicpIHsNCisgICAgICAgICAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmOw0KKyAgICAgICAgICAgICAgICBjYyArPSBGWF9QYXJzZVRpbWVab25lKHN0ciArIGNjLCBsZW4gLSBjYywgdHpEaWZmKTsNCisgICAgICAgICAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiSGFzQSkgew0KKyAgICAgICAgaWYgKGJQTSkgew0KKyAgICAgICAgICAgIGhvdXIgKz0gMTI7DQorICAgICAgICAgICAgaWYgKGhvdXIgPT0gMjQpIHsNCisgICAgICAgICAgICAgICAgaG91ciA9IDEyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGhvdXIgPT0gMTIpIHsNCisgICAgICAgICAgICAgICAgaG91ciA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9Vbml0aW1lIHV0Ow0KKyAgICB1dC5TZXQoMCwgMCwgMCwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKTsNCisgICAgZGF0ZXRpbWUgPSBkYXRldGltZSArIHV0Ow0KKyAgICByZXR1cm4gY2M7DQorfQ0KK0ZYX0JPT0wJQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfREFURVRJTUVUWVBFIGVEYXRlVGltZVR5cGUsIENGWF9Vbml0aW1lJiBkdFZhbHVlKQ0KK3sNCisgICAgZHRWYWx1ZS5TZXQoMCk7DQorICAgIGlmICh3c1NyY0RhdGVUaW1lLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICAgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPSBHZXREYXRlVGltZUZvcm1hdCh3c1BhdHRlcm4sIHBMb2NhbGUsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4pOw0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQorICAgICAgICBlQ2F0ZWdvcnkgPSBlRGF0ZVRpbWVUeXBlOw0KKyAgICB9DQorICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSkgew0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsNCisgICAgICAgIGlmICghRlhfUGFyc2VMb2NhbGVUaW1lKHdzU3JjRGF0ZVRpbWUsIHdzVGltZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsIGlTdGFydCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIUZYX1BhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLCBpU3RhcnQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsNCisgICAgICAgIGlmICgoZUNhdGVnb3J5ICYgRlhfREFURVRJTUVUWVBFX0RhdGUpICYmICFGWF9QYXJzZUxvY2FsZURhdGUod3NTcmNEYXRlVGltZSwgd3NEYXRlUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwgaVN0YXJ0KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoZUNhdGVnb3J5ICYgRlhfREFURVRJTUVUWVBFX1RpbWUpICYmICFGWF9QYXJzZUxvY2FsZVRpbWUod3NTcmNEYXRlVGltZSwgd3NUaW1lUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwgaVN0YXJ0KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInplcm8iKSwgd3NUZXh0Rm9ybWF0KTsNCisgICAgRlhfSU5UMzIgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcFN0clRleHQgPSAoRlhfTFBDV1NUUil3c1NyY1RleHQ7DQorICAgIEZYX0lOVDMyIGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHBTdHJQYXR0ZXJuID0gKEZYX0xQQ1dTVFIpd3NUZXh0Rm9ybWF0Ow0KKyAgICBGWF9JTlQzMiBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgew0KKyAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fCBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIChGWF9MUENXU1RSKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaVRleHQgKz0gaUxpdGVyYWxMZW47DQorICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZU51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMIm51bGwiKSwgd3NUZXh0Rm9ybWF0KTsNCisgICAgRlhfSU5UMzIgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcFN0clRleHQgPSAoRlhfTFBDV1NUUil3c1NyY1RleHQ7DQorICAgIEZYX0lOVDMyIGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHBTdHJQYXR0ZXJuID0gKEZYX0xQQ1dTVFIpd3NUZXh0Rm9ybWF0Ow0KKyAgICBGWF9JTlQzMiBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgew0KKyAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fCBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIChGWF9MUENXU1RSKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaVRleHQgKz0gaUxpdGVyYWxMZW47DQorICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsNCit9DQorRlhfQk9PTAlDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxlblRleHQgPSB3c1NyY1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuVGV4dCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwidGV4dCIpLCB3c1RleHRGb3JtYXQpOw0KKyAgICBGWF9JTlQzMiBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsNCisgICAgRlhfTFBDV1NUUiBwU3RyVGV4dCA9IChGWF9MUENXU1RSKXdzU3JjVGV4dDsNCisgICAgRlhfTFBDV1NUUiBwU3RyUGF0dGVybiA9IChGWF9MUENXU1RSKXdzVGV4dEZvcm1hdDsNCisgICAgRlhfSU5UMzIgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7DQorICAgICAgICBzd2l0Y2ggKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSkgew0KKyAgICAgICAgICAgIGNhc2UgJ1wnJzogew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlICdBJzoNCisgICAgICAgICAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0IHx8ICFGWF9Jc0FscGhhKHBTdHJUZXh0W2lUZXh0XSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsNCisgICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnWCc6DQorICAgICAgICAgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOw0KKyAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdPJzoNCisgICAgICAgICAgICBjYXNlICcwJzoNCisgICAgICAgICAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0IHx8ICghRlhfSXNEaWdpdChwU3RyVGV4dFtpVGV4dF0pICYmICFGWF9Jc0FscGhhKHBTdHJUZXh0W2lUZXh0XSkpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107DQorICAgICAgICAgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICBpZiAoaVRleHQgPj0gaUxlblRleHQgfHwgIUZYX0lzRGlnaXQocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOw0KKyAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGlUZXh0ID09IGlMZW5UZXh0Ow0KK30NCitzdGF0aWMgRlhfSU5UMzIgRlhfR2V0TnVtVHJhaWxpbmdMaW1pdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIGludCBpRG90UG9zLCBGWF9CT09MICZiVHJpbVRhaWxaZXJvcykNCit7DQorICAgIGlmIChpRG90UG9zIDwgMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gd3NGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIGlUcmVhZGluZyA9IDA7DQorICAgIGZvciAoaURvdFBvcyArKzsgaURvdFBvcyA8IGlDb3VudDsgaURvdFBvcyArKykgew0KKyAgICAgICAgRlhfV0NIQVIgd2MgPSB3c0Zvcm1hdFtpRG90UG9zXTsNCisgICAgICAgIGlmICh3YyA9PSBMJ3onIHx8IHdjID09IEwnOScgfHwgd2MgPT0gJ1onKSB7DQorICAgICAgICAgICAgaVRyZWFkaW5nICsrOw0KKyAgICAgICAgICAgIGJUcmltVGFpbFplcm9zID0gKHdjID09IEwnOScgPyBGQUxTRSA6IFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpVHJlYWRpbmc7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0U3RyTnVtKEZYX1dTVFIgd3NJbnB1dE51bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KQ0KK3sNCisgICAgaWYgKHdzSW5wdXROdW0uSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBkb3RfaW5kZXhfZiA9IC0xOw0KKyAgICBGWF9EV09SRCBkd051bVN0eWxlID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgZG90X2luZGV4X2YsIGR3TnVtU3R5bGUsIHdzTnVtRm9ybWF0KTsNCisgICAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGNjID0gMCwgY2NmID0gMDsNCisgICAgRlhfTFBDV1NUUiBzdHJmID0gKEZYX0xQQ1dTVFIpd3NOdW1Gb3JtYXQ7DQorICAgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NJbnB1dE51bTsNCisgICAgd3NTcmNOdW0uVHJpbUxlZnQoJzAnKTsNCisgICAgaWYgKHdzU3JjTnVtLklzRW1wdHkoKSB8fCB3c1NyY051bVswXSA9PSAnLicpIHsNCisgICAgICAgIHdzU3JjTnVtLkluc2VydCgwLCAnMCcpOw0KKyAgICB9DQorICAgIENGWF9EZWNpbWFsIGRlY2ltYWwgPSBDRlhfRGVjaW1hbCh3c1NyY051bSk7DQorICAgIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfUGVyY2VudCkgew0KKyAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbCgxMDApOw0KKyAgICAgICAgd3NTcmNOdW0gPSBkZWNpbWFsOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGV4cG9uZW50ID0gMDsNCisgICAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9FeHBvbmVudCkgew0KKyAgICAgICAgaW50IGZpeGVkX2NvdW50ID0gMDsNCisgICAgICAgIHdoaWxlIChjY2YgPCBkb3RfaW5kZXhfZikgew0KKyAgICAgICAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgZG90X2luZGV4X2YpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgICAgICAgICAgICBmaXhlZF9jb3VudCsrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50IHRocmVzaG9sZCA9IDE7DQorICAgICAgICB3aGlsZSAoZml4ZWRfY291bnQgPiAxKSB7DQorICAgICAgICAgICAgdGhyZXNob2xkICo9IDEwOw0KKyAgICAgICAgICAgIGZpeGVkX2NvdW50LS07DQorICAgICAgICB9DQorICAgICAgICBpZiAoZGVjaW1hbCAhPSBDRlhfRGVjaW1hbCgwKSkgew0KKyAgICAgICAgICAgIGlmIChkZWNpbWFsIDwgQ0ZYX0RlY2ltYWwodGhyZXNob2xkKSkgew0KKyAgICAgICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKDEwKTsNCisgICAgICAgICAgICAgICAgZXhwb25lbnQgPSAtMTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGRlY2ltYWwgPCBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKDEwKTsNCisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50IC09IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlY2ltYWwgPiBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQorICAgICAgICAgICAgICAgIHRocmVzaG9sZCAqPSAxMDsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGRlY2ltYWwgPiBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAvIENGWF9EZWNpbWFsKDEwKTsNCisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50ICs9IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiVHJpbVRhaWxaZXJvcyA9IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBpVHJlYWRpbmcgPSBGWF9HZXROdW1UcmFpbGluZ0xpbWl0KHdzTnVtRm9ybWF0LCBkb3RfaW5kZXhfZiwgYlRyaW1UYWlsWmVyb3MpOw0KKyAgICBGWF9JTlQzMiBzY2FsZSA9IGRlY2ltYWwuR2V0U2NhbGUoKTsNCisgICAgaWYgKGlUcmVhZGluZyA8IHNjYWxlKSB7DQorICAgICAgICBkZWNpbWFsLlNldFNjYWxlKGlUcmVhZGluZyk7DQorICAgICAgICB3c1NyY051bSA9IGRlY2ltYWw7DQorICAgIH0NCisgICAgaWYgKGJUcmltVGFpbFplcm9zICYmIHNjYWxlID4gMCAmJiBpVHJlYWRpbmcgPiAwKSB7DQorICAgICAgICB3c1NyY051bS5UcmltUmlnaHQoKEZYX0xQQ1dTVFIpTCIwIik7DQorICAgICAgICB3c1NyY051bS5UcmltUmlnaHQoKEZYX0xQQ1dTVFIpTCIuIik7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQorICAgIGlmICh3c1NyY051bVswXSA9PSAnLScpIHsNCisgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkFkZE5lZyA9IEZBTFNFOw0KKyAgICBGWF9MUENXU1RSIHN0ciA9IChGWF9MUENXU1RSKXdzU3JjTnVtOw0KKyAgICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQorICAgIGludCBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7DQorICAgIGlmIChkb3RfaW5kZXggPT0gLTEpIHsNCisgICAgICAgIGRvdF9pbmRleCA9IGxlbjsNCisgICAgfQ0KKyAgICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQorICAgIGNjID0gZG90X2luZGV4IC0gMTsNCisgICAgd2hpbGUgKGNjZiA+PSAwKSB7DQorICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJzAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMF0gIT0gJzAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0clswXSA9PSAnMCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cDsNCisgICAgICAgICAgICAgICAgICAgIHdzRXhwLkZvcm1hdCgoRlhfTFBDV1NUUilMIkUlK2QiLCBleHBvbmVudCk7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzRXhwICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdyJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1InOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJDUiIgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdiJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiZGIiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ0InOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJEQiIgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICclJzogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcsJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NHcm91cFN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIoIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcpJzoNCisgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIpIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBGWF9HZXRMaXRlcmFsVGV4dFJldmVyc2Uoc3RyZiwgY2NmKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyZltjY2ZdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgaW50IG5Qb3MgPSBkb3RfaW5kZXggJSAzOw0KKyAgICAgICAgd3NPdXRwdXQuRW1wdHkoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3c091dHB1dCArPSB3c1NyY051bVtpXTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGRvdF9pbmRleF9mID09IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpKSB7DQorICAgICAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KKyAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOw0KKyAgICBpZiAoc3RyZltkb3RfaW5kZXhfZl0gPT0gJ1YnKSB7DQorICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCisgICAgfSBlbHNlIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnLicpIHsNCisgICAgICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKHN0cmZbZG90X2luZGV4X2YgKyAxXSA9PSAnOScgfHwgc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICdaJykgew0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgY2NmID0gZG90X2luZGV4X2YgKyAxOw0KKyAgICBjYyA9IGRvdF9pbmRleCArIDE7DQorICAgIHdoaWxlIChjY2YgPCBsZW5mKSB7DQorICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAneic6DQorICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOw0KKyAgICAgICAgICAgICAgICAgICAgd3NFeHAuRm9ybWF0KChGWF9MUENXU1RSKUwiRSUrZCIsIGV4cG9uZW50KTsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzRXhwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICckJzogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdjJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdDJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnZCc6DQorICAgICAgICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdiJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMImRiIjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnRCc6DQorICAgICAgICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdCJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMIkRCIjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCIgICI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyUnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnOCc6IHsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJywnOg0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnKCc6DQorICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSAnKCc7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSAnICc7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcpJzoNCisgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcpJzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiQWRkTmVnICYmIGJOZWcpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXRbMF0gKyB3c091dHB1dC5NaWQoMSwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXRMQ051bWVyaWMoQ0ZYX0xDTnVtZXJpYyYgbGNOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIEZYX0lOVDMyIGRvdF9pbmRleF9mID0gLTE7DQorICAgIEZYX0RXT1JEIGR3TnVtU3R5bGUgPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c051bUZvcm1hdDsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldE51bWVyaWNGb3JtYXQod3NQYXR0ZXJuLCBkb3RfaW5kZXhfZiwgZHdOdW1TdHlsZSwgd3NOdW1Gb3JtYXQpOw0KKyAgICBpZiAoIXBMb2NhbGUgfHwgd3NOdW1Gb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY2MgPSAwLCBjY2YgPSAwOw0KKyAgICBGWF9MUENXU1RSIHN0cmYgPSAoRlhfTFBDV1NUUil3c051bUZvcm1hdDsNCisgICAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsNCisgICAgZG91YmxlIGRiT3JnUmF3ID0gbGNOdW0uR2V0RG91YmxlKCk7DQorICAgIGRvdWJsZSBkYlJldFZhbHVlID0gZGJPcmdSYXc7DQorICAgIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfUGVyY2VudCkgew0KKyAgICAgICAgZGJSZXRWYWx1ZSAqPSAxMDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZXhwb25lbnQgPSAwOw0KKyAgICBpZiAoZHdOdW1TdHlsZSAmIEZYX05VTVNUWUxFX0V4cG9uZW50KSB7DQorICAgICAgICBpbnQgZml4ZWRfY291bnQgPSAwOw0KKyAgICAgICAgd2hpbGUgKGNjZiA8IGRvdF9pbmRleF9mKSB7DQorICAgICAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICAgICAgICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBkb3RfaW5kZXhfZik7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgICAgICAgICAgIGZpeGVkX2NvdW50Kys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmKys7DQorICAgICAgICB9DQorICAgICAgICBpbnQgdGhyZXNob2xkID0gMTsNCisgICAgICAgIHdoaWxlIChmaXhlZF9jb3VudCA+IDEpIHsNCisgICAgICAgICAgICB0aHJlc2hvbGQgKj0gMTA7DQorICAgICAgICAgICAgZml4ZWRfY291bnQtLTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkYlJldFZhbHVlICE9IDApIHsNCisgICAgICAgICAgICBpZiAoZGJSZXRWYWx1ZSA8IHRocmVzaG9sZCkgew0KKyAgICAgICAgICAgICAgICBkYlJldFZhbHVlICo9IDEwOw0KKyAgICAgICAgICAgICAgICBleHBvbmVudCA9IC0xOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoZGJSZXRWYWx1ZSA8IHRocmVzaG9sZCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGJSZXRWYWx1ZSAqPSAxMDsNCisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50IC09IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKGRiUmV0VmFsdWUgPiB0aHJlc2hvbGQpIHsNCisgICAgICAgICAgICAgICAgdGhyZXNob2xkICo9IDEwOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoZGJSZXRWYWx1ZSA+IHRocmVzaG9sZCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGJSZXRWYWx1ZSAvPSAxMDsNCisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50ICs9IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGR3TnVtU3R5bGUgJiAoRlhfTlVNU1RZTEVfUGVyY2VudCB8IEZYX05VTVNUWUxFX0V4cG9uZW50KSkgew0KKyAgICAgICAgbGNOdW0gPSBDRlhfTENOdW1lcmljKGRiUmV0VmFsdWUpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlRyaW1UYWlsWmVyb3MgPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgaVRyZWFkaW5nID0gRlhfR2V0TnVtVHJhaWxpbmdMaW1pdCh3c051bUZvcm1hdCwgZG90X2luZGV4X2YsIGJUcmltVGFpbFplcm9zKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1lcmljID0gbGNOdW0uVG9TdHJpbmcoaVRyZWFkaW5nLCBiVHJpbVRhaWxaZXJvcyk7DQorICAgIGlmICh3c051bWVyaWMuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQorICAgIGlmICh3c051bWVyaWNbMF0gPT0gJy0nKSB7DQorICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgIHdzTnVtZXJpYy5EZWxldGUoMCwgMSk7DQorICAgIH0NCisgICAgRlhfQk9PTCBiQWRkTmVnID0gRkFMU0U7DQorICAgIEZYX0xQQ1dTVFIgc3RyID0gKEZYX0xQQ1dTVFIpd3NOdW1lcmljOw0KKyAgICBpbnQgbGVuID0gd3NOdW1lcmljLkdldExlbmd0aCgpOw0KKyAgICBpbnQgZG90X2luZGV4ID0gd3NOdW1lcmljLkZpbmQoJy4nKTsNCisgICAgaWYgKGRvdF9pbmRleCA9PSAtMSkgew0KKyAgICAgICAgZG90X2luZGV4ID0gbGVuOw0KKyAgICB9DQorICAgIGNjZiA9IGRvdF9pbmRleF9mIC0gMTsNCisgICAgY2MgPSBkb3RfaW5kZXggLSAxOw0KKyAgICB3aGlsZSAoY2NmID49IDApIHsNCisgICAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnMCcpICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxjTnVtLm1fSW50ZWdyYWwgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChsY051bS5tX0ludGVncmFsID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cDsNCisgICAgICAgICAgICAgICAgICAgIHdzRXhwLkZvcm1hdCgoRlhfTFBDV1NUUilMIkUlK2QiLCBleHBvbmVudCk7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzRXhwICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdyJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1InOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJDUiIgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdiJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiZGIiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ0InOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJEQiIgKyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICclJzogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcsJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NHcm91cFN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIoIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcpJzoNCisgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIpIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBGWF9HZXRMaXRlcmFsVGV4dFJldmVyc2Uoc3RyZiwgY2NmKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyZltjY2ZdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgaW50IG5Qb3MgPSBkb3RfaW5kZXggJSAzOw0KKyAgICAgICAgd3NPdXRwdXQuRW1wdHkoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3c091dHB1dCArPSB3c051bWVyaWNbaV07DQorICAgICAgICB9DQorICAgICAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzU3ltYm9sKTsNCisgICAgICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCisgICAgICAgICAgICB3c091dHB1dCArPSB3c051bWVyaWMuUmlnaHQobGVuIC0gZG90X2luZGV4IC0gMSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoZG90X2luZGV4X2YgPT0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3RTeW1ib2w7DQorICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c0RvdFN5bWJvbCk7DQorICAgIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnVicpIHsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KKyAgICB9IGVsc2UgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICcuJykgew0KKyAgICAgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICc5JyB8fCBzdHJmW2RvdF9pbmRleF9mICsgMV0gPT0gJ1onKSB7DQorICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBjY2YgPSBkb3RfaW5kZXhfZiArIDE7DQorICAgIGNjID0gZG90X2luZGV4ICsgMTsNCisgICAgd2hpbGUgKGNjZiA8IGxlbmYpIHsNCisgICAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgICAgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7DQorICAgICAgICAgICAgICAgICAgICB3c0V4cC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCJFJStkIiwgZXhwb25lbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NFeHA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ2MnOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ0MnOg0KKyAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiICAiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdkJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiZGIiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdEJzoNCisgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiREIiOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICc4Jzogew0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLCc6DQorICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcoJzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gJyknOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gJyAnOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KKyAgICAgICAgd3NPdXRwdXQgPSB3c091dHB1dFswXSArIHdzTWludXN5bWJvbCArIHdzT3V0cHV0Lk1pZCgxLCB3c091dHB1dC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBGb3JtYXRTdHJOdW0od3NTcmNOdW0sIHdzUGF0dGVybiwgd3NPdXRwdXQpOw0KK30NCitGWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bShGWF9GTE9BVCBmTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpDQorew0KKyAgICBpZiAod3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9MQ051bWVyaWMgbGNOdW0oZk51bSk7DQorICAgIHJldHVybiBGb3JtYXRMQ051bWVyaWMobGNOdW0sIHdzUGF0dGVybiwgd3NPdXRwdXQpOw0KK30NCitGWF9CT09MIEZYX0RhdGVGcm9tQ2Fub25pY2FsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIENGWF9Vbml0aW1lJiBkYXRldGltZSkNCit7DQorICAgIEZYX0lOVDMyIHllYXIgPSAxOTAwOw0KKyAgICBGWF9JTlQzMiBtb250aCA9IDE7DQorICAgIEZYX0lOVDMyIGRheSA9IDE7DQorICAgIEZYX1dPUkQgd1llYXIgPSAwOw0KKyAgICBpbnQgY2Nfc3RhcnQgPSAwLCBjYyA9IDA7DQorICAgIEZYX0xQQ1dTVFIgc3RyID0gKEZYX0xQQ1dTVFIpd3NEYXRlOw0KKyAgICBpbnQgbGVuID0gd3NEYXRlLkdldExlbmd0aCgpOw0KKyAgICBpZihsZW4gPiAxMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IDQpIHsNCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdZZWFyID0gd1llYXIgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgfQ0KKyAgICB5ZWFyICA9IHdZZWFyOw0KKyAgICBpZiAoY2MgPCA0IHx8IHdZZWFyIDwgMTkwMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2Nfc3RhcnQgPSBjYzsNCisgICAgICAgIEZYX0JZVEUgdG1wTSA9IDA7DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsNCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0bXBNID0gdG1wTSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbW9udGggPSB0bXBNOw0KKyAgICAgICAgaWYgKGNjID09IGNjX3N0YXJ0ICsgMSB8fCB0bXBNID4gMTIgfHwgdG1wTSA8IDEpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZihjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9CWVRFIHRtcEQgPSAwOw0KKyAgICAgICAgICAgIGNjX3N0YXJ0ID0gY2M7DQorICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQorICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHRtcEQgPSB0bXBEICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRheSA9IHRtcEQ7DQorICAgICAgICAgICAgaWYgKHRtcEQgPCAxKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCh0bXBNID09IDEgfHwgdG1wTSA9PSAzIHx8IHRtcE0gPT0gNSB8fCB0bXBNID09IDcgfHwgdG1wTSA9PSA4IHx8IHRtcE0gPT0gMTAgfHwgdG1wTSA9PSAxMikgJiYgdG1wRCA+IDMxKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoKHRtcE0gPT0gNCB8fCB0bXBNID09IDYgfHwgdG1wTSA9PSA5IHx8IHRtcE0gPT0gMTEpICYmIHRtcEQgPiAzMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0JPT0wgaUxlYXBZZWFyOw0KKyAgICAgICAgICAgIGlmKCh3WWVhciAlIDQgPT0gMCAmJiB3WWVhciAlIDEwMCAhPSAwICkgfHwgd1llYXIgJSA0MDAgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBpTGVhcFllYXIgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlMZWFwWWVhciA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoKGlMZWFwWWVhciAmJiB0bXBNID09IDIgJiYgdG1wRCA+IDI5KSB8fCAoIWlMZWFwWWVhciAmJiB0bXBNID09IDIgJiYgdG1wRCA+IDI4KSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9Vbml0aW1lIHV0Ow0KKyAgICB1dC5TZXQoeWVhciwgbW9udGgsIGRheSk7DQorICAgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgRlhfVGltZUZyb21DYW5vbmljYWwoRlhfV1NUUiB3c1RpbWUsIENGWF9Vbml0aW1lJiBkYXRldGltZSwgSUZYX0xvY2FsZSogcExvY2FsZSkNCit7DQorICAgIGlmICh3c1RpbWUuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JZVEUgaG91ciA9IDA7DQorICAgIEZYX0JZVEUgbWludXRlID0gMDsNCisgICAgRlhfQllURSBzZWNvbmQgPSAwOw0KKyAgICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMDsNCisgICAgaW50IGNjX3N0YXJ0ID0gMCwgY2MgPSBjY19zdGFydDsNCisgICAgRlhfTFBDV1NUUiBzdHIgPSAoRlhfTFBDV1NUUil3c1RpbWUuR2V0UHRyKCk7DQorICAgIGludCBsZW4gPSB3c1RpbWUuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IDIpIHsNCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGhvdXIgPSBob3VyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgIH0NCisgICAgaWYgKGNjIDwgMiB8fCBob3VyID49IDI0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYoY2MgPCBsZW4pIHsNCisgICAgICAgIGlmIChzdHJbY2NdID09ICc6Jykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgICBjY19zdGFydCA9IGNjOw0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2MgPT0gY2Nfc3RhcnQgKyAxIHx8IG1pbnV0ZSA+PSA2MCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJzonKSB7DQorICAgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjX3N0YXJ0ID0gY2M7DQorICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQorICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoY2MgPT0gY2Nfc3RhcnQgKyAxIHx8IHNlY29uZCA+PSA2MCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgICAgIGNjX3N0YXJ0ID0gY2M7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCBjY19zdGFydCArIDMgfHwgbWlsbGlzZWNvbmQgPj0gMTAwMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZihjYyA8IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmOw0KKyAgICAgICAgICAgICAgICAgICAgdHpEaWZmLnR6SG91ciA9IDA7DQorICAgICAgICAgICAgICAgICAgICB0ekRpZmYudHpNaW51dGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gIT0gJ1onKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9SZXNvbHZlWm9uZShob3VyLCBtaW51dGUsIHR6RGlmZiwgcExvY2FsZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1VuaXRpbWUgdXQ7DQorICAgIHV0LlNldCgwLCAwLCAwLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpOw0KKyAgICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitzdGF0aWMgRlhfV09SRCBGWF9HZXRTb2xhck1vbnRoRGF5cyhGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgpDQorew0KKyAgICBpZiAobW9udGggJSAyKSB7DQorICAgICAgICByZXR1cm4gMzE7DQorICAgIH0gZWxzZSBpZiAobW9udGggPT0gMikgew0KKyAgICAgICAgcmV0dXJuIEZYX0lzTGVhcFllYXIoeWVhcikgPyAyOSA6IDI4Ow0KKyAgICB9DQorICAgIHJldHVybiAzMDsNCit9DQorc3RhdGljIEZYX1dPUkQgRlhfR2V0V2Vla0RheShGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KQ0KK3sNCisgICAgRlhfV09SRCBnX21vbnRoX2RheVtdID0geyAwLCAzLCAzLCA2LCAxLCA0LCA2LCAyLCA1LCAwLCAzLCA1IH07DQorICAgIEZYX1dPUkQgbkRheXMgPSAoeWVhciAtIDEpICUgNyArICh5ZWFyIC0gMSkgLyA0IC0gKHllYXIgLSAxKSAvIDEwMCArICh5ZWFyIC0gMSkgLyA0MDA7DQorICAgIG5EYXlzICs9IGdfbW9udGhfZGF5W21vbnRoIC0gMV0gKyBkYXk7DQorICAgIGlmIChGWF9Jc0xlYXBZZWFyKHllYXIpICYmIG1vbnRoID4gMikgew0KKyAgICAgICAgbkRheXMrKzsNCisgICAgfQ0KKyAgICByZXR1cm4gbkRheXMgJSA3Ow0KK30NCitzdGF0aWMgRlhfV09SRCBGWF9HZXRXZWVrT2ZNb250aChGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KQ0KK3sNCisgICAgRlhfV09SRCB3ZWVrX2RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIDEpOw0KKyAgICBGWF9XT1JEIHdlZWtfaW5kZXggPSAwOw0KKyAgICB3ZWVrX2luZGV4ICs9IGRheSAvIDc7DQorICAgIGRheSA9IGRheSAlIDc7DQorICAgIGlmICh3ZWVrX2RheSArIGRheSA+IDcpIHsNCisgICAgICAgIHdlZWtfaW5kZXgrKzsNCisgICAgfQ0KKyAgICByZXR1cm4gd2Vla19pbmRleDsNCit9DQorc3RhdGljIEZYX1dPUkQgRlhfR2V0V2Vla09mWWVhcihGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KQ0KK3sNCisgICAgRlhfV09SRCBuRGF5cyA9IDA7DQorICAgIGZvciAoRlhfV09SRCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsNCisgICAgICAgIG5EYXlzICs9IEZYX0dldFNvbGFyTW9udGhEYXlzKHllYXIsIGkpOw0KKyAgICB9DQorICAgIG5EYXlzICs9IGRheTsNCisgICAgRlhfV09SRCB3ZWVrX2RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgMSwgMSk7DQorICAgIEZYX1dPUkQgd2Vla19pbmRleCA9IDE7DQorICAgIHdlZWtfaW5kZXggKz0gbkRheXMgLyA3Ow0KKyAgICBuRGF5cyA9IG5EYXlzICUgNzsNCisgICAgaWYgKHdlZWtfZGF5ICsgbkRheXMgPiA3KSB7DQorICAgICAgICB3ZWVrX2luZGV4Kys7DQorICAgIH0NCisgICAgcmV0dXJuIHdlZWtfaW5kZXg7DQorfQ0KK3N0YXRpYyBGWF9CT09MIEZYX0RhdGVGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sIElGWF9Mb2NhbGUgKnBMb2NhbGUsIGNvbnN0IENGWF9Vbml0aW1lICZkYXRldGltZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0KQ0KK3sNCisgICAgRlhfQk9PTCBiUmV0ID0gVFJVRTsNCisgICAgRlhfSU5UMzIgeWVhciA9IGRhdGV0aW1lLkdldFllYXIoKTsNCisgICAgRlhfQllURSBtb250aCA9IGRhdGV0aW1lLkdldE1vbnRoKCk7DQorICAgIEZYX0JZVEUgZGF5ID0gZGF0ZXRpbWUuR2V0RGF5KCk7DQorICAgIEZYX0lOVDMyIGNjZiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgc3RyZiA9IChGWF9MUENXU1RSKXdzRGF0ZVBhdHRlcm47DQorICAgIEZYX0lOVDMyIGxlbmYgPSB3c0RhdGVQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgICB3aGlsZSAoY2NmIDwgbGVuZikgew0KKyAgICAgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZiAoRlhfTG9jYWxfRmluZChnc193c0RhdGVTeW1ib2xzLCBzdHJmW2NjZl0pIDwgMCkgew0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHN0cmZbY2NmKytdOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRFdPUkQgZHdTeW1ib2xOdW0gPSAxOw0KKyAgICAgICAgRlhfRFdPUkQgZHdTeW1ib2wgPSBzdHJmW2NjZisrXTsNCisgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSBkd1N5bWJvbCkgew0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIGR3U3ltYm9sTnVtKys7DQorICAgICAgICB9DQorICAgICAgICBkd1N5bWJvbCA9IChkd1N5bWJvbCA8PCA4KSB8IChkd1N5bWJvbE51bSArICcwJyk7DQorICAgICAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdEJywgJzEnKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgICAgICAgICAgIHdzRGF5LkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgZGF5KTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0RheTsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdEJywgJzInKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgICAgICAgICAgIHdzRGF5LkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQiLCBkYXkpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzRGF5Ow0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMScpKSB7DQorICAgICAgICAgICAgRlhfV09SRCBuRGF5cyA9IDA7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtb250aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIG5EYXlzICs9IEZYX0dldFNvbGFyTW9udGhEYXlzKHllYXIsIGkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBuRGF5cyArPSBkYXk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXlzOw0KKyAgICAgICAgICAgIHdzRGF5cy5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCIsIG5EYXlzKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0RheXM7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICczJykpIHsNCisgICAgICAgICAgICBGWF9XT1JEIG5EYXlzID0gMDsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgbkRheXMgKz0gRlhfR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG5EYXlzICs9IGRheTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RheXM7DQorICAgICAgICAgICAgd3NEYXlzLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwM2QiLCBuRGF5cyk7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NEYXlzOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMScpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNb250aDsNCisgICAgICAgICAgICB3c01vbnRoLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgbW9udGgpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzTW9udGg7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcyJykpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoOw0KKyAgICAgICAgICAgIHdzTW9udGguRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsIG1vbnRoKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c01vbnRoOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMycpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldE1vbnRoTmFtZShtb250aCAtIDEsIHdzVGVtcCwgVFJVRSk7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnNCcpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldE1vbnRoTmFtZShtb250aCAtIDEsIHdzVGVtcCwgRkFMU0UpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzEnKSkgew0KKyAgICAgICAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0RheTsNCisgICAgICAgICAgICB3c1dlZWtEYXkuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCB3V2Vla0RheSArIDEpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0RheTsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzMnKSkgew0KKyAgICAgICAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKHdXZWVrRGF5LCB3c1RlbXAsIFRSVUUpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzQnKSkgew0KKyAgICAgICAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgICAgICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF5TmFtZSh3V2Vla0RheSwgd3NUZW1wLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnZScsICcxJykpIHsNCisgICAgICAgICAgICBGWF9XT1JEIHdXZWVrRGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtEYXk7DQorICAgICAgICAgICAgd3NXZWVrRGF5LkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgd1dlZWtEYXkgPyB3V2Vla0RheSA6IDcpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0RheTsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdHJywgJzEnKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXRFcmFOYW1lKHdzVGVtcCwgeWVhciA8IDApOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzInKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzWWVhcjsNCisgICAgICAgICAgICB3c1llYXIuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsIHllYXIgJSAxMDApOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzWWVhcjsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzQnKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzWWVhcjsNCisgICAgICAgICAgICB3c1llYXIuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCB5ZWFyKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c1llYXI7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAndycsICcxJykpIHsNCisgICAgICAgICAgICBGWF9XT1JEIHdlZWtfaW5kZXggPSBGWF9HZXRXZWVrT2ZNb250aCh5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtJbk1vbnRoOw0KKyAgICAgICAgICAgIHdzV2Vla0luTW9udGguRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCB3ZWVrX2luZGV4KTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c1dlZWtJbk1vbnRoOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1cnLCAnMicpKSB7DQorICAgICAgICAgICAgRlhfV09SRCB3ZWVrX2luZGV4ID0gRlhfR2V0V2Vla09mWWVhcih5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtJblllYXI7DQorICAgICAgICAgICAgd3NXZWVrSW5ZZWFyLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQiLCB3ZWVrX2luZGV4KTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c1dlZWtJblllYXI7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK3N0YXRpYyBGWF9CT09MIEZYX1RpbWVGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZVBhdHRlcm4sIElGWF9Mb2NhbGUgKnBMb2NhbGUsIGNvbnN0IENGWF9Vbml0aW1lICZkYXRldGltZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0KQ0KK3sNCisgICAgRlhfQk9PTCBiR01UID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7DQorICAgIEZYX0JZVEUgaG91ciA9IGRhdGV0aW1lLkdldEhvdXIoKTsNCisgICAgRlhfQllURSBtaW51dGUgPSBkYXRldGltZS5HZXRNaW51dGUoKTsNCisgICAgRlhfQllURSBzZWNvbmQgPSBkYXRldGltZS5HZXRTZWNvbmQoKTsNCisgICAgRlhfV09SRCBtaWxsaXNlY29uZCA9IGRhdGV0aW1lLkdldE1pbGxpc2Vjb25kKCk7DQorICAgIEZYX0lOVDMyIGNjZiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgc3RyZiA9IChGWF9MUENXU1RSKXdzVGltZVBhdHRlcm47DQorICAgIEZYX0lOVDMyIGxlbmYgPSB3c1RpbWVQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgICBGWF9XT1JEIHdIb3VyID0gaG91cjsNCisgICAgRlhfQk9PTCBiUE0gPSBGQUxTRTsNCisgICAgaWYgKHdzVGltZVBhdHRlcm4uRmluZCgnQScpICE9IC0xKSB7DQorICAgICAgICBpZiAod0hvdXIgPj0gMTIpIHsNCisgICAgICAgICAgICBiUE0gPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHdoaWxlIChjY2YgPCBsZW5mKSB7DQorICAgICAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzVGltZVN5bWJvbHMsIHN0cmZbY2NmXSkgPCAwKSB7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gc3RyZltjY2YrK107DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQorICAgICAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KKyAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3U3ltYm9sKSB7DQorICAgICAgICAgICAgY2NmKys7DQorICAgICAgICAgICAgZHdTeW1ib2xOdW0rKzsNCisgICAgICAgIH0NCisgICAgICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCisgICAgICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnMScpKSB7DQorICAgICAgICAgICAgaWYgKHdIb3VyID4gMTIpIHsNCisgICAgICAgICAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICAgICAgICB3c0hvdXIuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCB3SG91ciA9PSAwID8gMTIgOiB3SG91cik7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnMicpKSB7DQorICAgICAgICAgICAgaWYgKHdIb3VyID4gMTIpIHsNCisgICAgICAgICAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICAgICAgICB3c0hvdXIuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsIHdIb3VyID09IDAgPyAxMiA6IHdIb3VyKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcxJykpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgICAgICAgd3NIb3VyLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgd0hvdXIgPT0gMCA/IDI0IDogd0hvdXIpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzInKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICAgICAgICB3c0hvdXIuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsIHdIb3VyID09IDAgPyAyNCA6IHdIb3VyKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcxJykpIHsNCisgICAgICAgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgICAgICAgICB3SG91ciAtPSAxMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOw0KKyAgICAgICAgICAgIHdzSG91ci5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCIsIHdIb3VyKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcxJykpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgICAgICAgd3NIb3VyLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgd0hvdXIpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzInKSkgew0KKyAgICAgICAgICAgIGlmICh3SG91ciA+IDEyKSB7DQorICAgICAgICAgICAgICAgIHdIb3VyIC09IDEyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgICAgICAgd3NIb3VyLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQiLCB3SG91cik7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0gnLCAnMicpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOw0KKyAgICAgICAgICAgIHdzSG91ci5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlMDJkIiwgd0hvdXIpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzEnKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXRlOw0KKyAgICAgICAgICAgIHdzTWludXRlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgbWludXRlKTsNCisgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c01pbnV0ZTsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXRlOw0KKyAgICAgICAgICAgIHdzTWludXRlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQiLCBtaW51dGUpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzTWludXRlOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1MnLCAnMScpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTZWNvbmQ7DQorICAgICAgICAgICAgd3NTZWNvbmQuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCBzZWNvbmQpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzU2Vjb25kOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1MnLCAnMicpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTZWNvbmQ7DQorICAgICAgICAgICAgd3NTZWNvbmQuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsIHNlY29uZCk7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NTZWNvbmQ7DQorICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRicsICczJykpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbGxpc2Vjb25kczsNCisgICAgICAgICAgICB3c01pbGxpc2Vjb25kcy5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlMDNkIiwgbWlsbGlzZWNvbmQpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzTWlsbGlzZWNvbmRzOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0EnLCAnMScpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXJpZGllbTsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXRNZXJpZGllbU5hbWUod3NNZXJpZGllbSwgIWJQTSk7DQorICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NNZXJpZGllbTsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdaJywgJzEnKSkgew0KKyAgICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX1dTVFJDKEwiR01UIik7DQorICAgICAgICAgICAgRlhfVElNRVpPTkUgdHo7DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVpvbmUodHopOw0KKyAgICAgICAgICAgIGlmICghYkdNVCAmJiAodHoudHpIb3VyICE9IDAgfHwgdHoudHpNaW51dGUgIT0gMCkpIHsNCisgICAgICAgICAgICAgICAgaWYgKHR6LnR6SG91ciA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX1dTVFJDKEwiLSIpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfV1NUUkMoTCIrIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lem9uZTsNCisgICAgICAgICAgICAgICAgd3NUaW1lem9uZS5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlMDJkOiUwMmQiLCBGWFNZU19hYnModHoudHpIb3VyKSwgdHoudHpNaW51dGUpOw0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdCArPSB3c1RpbWV6b25lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd6JywgJzEnKSkgew0KKyAgICAgICAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVab25lKHR6KTsNCisgICAgICAgICAgICBpZiAoIWJHTVQgJiYgdHoudHpIb3VyICE9IDAgJiYgdHoudHpNaW51dGUgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBpZiAodHoudHpIb3VyIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfV1NUUkMoTCItIik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIisiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWV6b25lOw0KKyAgICAgICAgICAgICAgICB3c1RpbWV6b25lLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQ6JTAyZCIsIEZYU1lTX2Ficyh0ei50ekhvdXIpLCB0ei50ek1pbnV0ZSk7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzVGltZXpvbmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9Gb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEYXRlRmlyc3QsIElGWF9Mb2NhbGUqIHBMb2NhbGUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZU91dCwgd3NUaW1lT3V0Ow0KKyAgICBpZiAoIXdzRGF0ZVBhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICBiUmV0ICY9IEZYX0RhdGVGb3JtYXQod3NEYXRlUGF0dGVybiwgcExvY2FsZSwgZHQsIHdzRGF0ZU91dCk7DQorICAgIH0NCisgICAgaWYgKCF3c1RpbWVQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICAgICAgYlJldCAmPSBGWF9UaW1lRm9ybWF0KHdzVGltZVBhdHRlcm4sIHBMb2NhbGUsIGR0LCB3c1RpbWVPdXQpOw0KKyAgICB9DQorICAgIHdzT3V0cHV0ID0gYkRhdGVGaXJzdCA/IHdzRGF0ZU91dCArIHdzVGltZU91dCA6IHdzVGltZU91dCArIHdzRGF0ZU91dDsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wJQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1NyY0RhdGVUaW1lLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICAgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPSBHZXREYXRlVGltZUZvcm1hdCh3c1BhdHRlcm4sIHBMb2NhbGUsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4pOw0KKyAgICBpZiAocExvY2FsZSA9PSBOVUxMIHx8IGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9Vbml0aW1lIGR0KDApOw0KKyAgICBGWF9JTlQzMiBpVCA9IHdzU3JjRGF0ZVRpbWUuRmluZChMIlQiKTsNCisgICAgaWYgKGlUIDwgMCkgew0KKyAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfRGF0ZSkgew0KKyAgICAgICAgICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZVRpbWUsIGR0KTsNCisgICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7DQorICAgICAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQsIHBMb2NhbGUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5MZWZ0KGlUKSwgZHQpOw0KKyAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5SaWdodCh3c1NyY0RhdGVUaW1lLkdldExlbmd0aCgpIC0gaVQgLSAxKSwgZHQsIHBMb2NhbGUpOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KK30NCitGWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKQ0KK3sNCisgICAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuOw0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgICAgRlhfREFURVRJTUVUWVBFIGVDYXRlZ29yeSA9IEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgcExvY2FsZSwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybik7DQorICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCisgICAgICAgIGlmIChlRGF0ZVRpbWVUeXBlID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7DQorICAgICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm47DQorICAgICAgICAgICAgd3NEYXRlUGF0dGVybi5FbXB0eSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZUNhdGVnb3J5ID0gZURhdGVUaW1lVHlwZTsNCisgICAgfQ0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1VuaXRpbWUgZHQoMCk7DQorICAgIEZYX0lOVDMyIGlUID0gd3NTcmNEYXRlVGltZS5GaW5kKEwiVCIpOw0KKyAgICBpZiAoaVQgPCAwKSB7DQorICAgICAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9EYXRlICYmIEZYX0RhdGVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZVRpbWUsIGR0KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgVFJVRSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1RpbWUgJiYgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQsIHBMb2NhbGUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLCBUUlVFLCBwTG9jYWxlLCB3c091dHB1dCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTcmNEYXRlKChGWF9MUENXU1RSKXdzU3JjRGF0ZVRpbWUsIGlUKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1NyY1RpbWUoKEZYX0xQQ1dTVFIpd3NTcmNEYXRlVGltZSArIGlUICsgMSwgd3NTcmNEYXRlVGltZS5HZXRMZW5ndGgoKSAtIGlUIC0gMSk7DQorICAgICAgICBpZih3c1NyY0RhdGUuSXNFbXB0eSgpIHx8IHdzU3JjVGltZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZihGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGUsIGR0KSAmJiBGWF9UaW1lRnJvbUNhbm9uaWNhbCh3c1NyY1RpbWUsIGR0LCBwTG9jYWxlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICAgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPSBHZXREYXRlVGltZUZvcm1hdCh3c1BhdHRlcm4sIHBMb2NhbGUsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4pOw0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KQ0KK3sNCisgICAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgRlhfV1NUUkMoTCJ6ZXJvIiksIHdzVGV4dEZvcm1hdCk7DQorICAgIEZYX0lOVDMyIGlQYXR0ZXJuID0gMDsNCisgICAgRlhfTFBDV1NUUiBwU3RyUGF0dGVybiA9IChGWF9MUENXU1RSKXdzVGV4dEZvcm1hdDsNCisgICAgRlhfSU5UMzIgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7DQorICAgICAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsNCisgICAgICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXROdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwibnVsbCIpLCB3c1RleHRGb3JtYXQpOw0KKyAgICBGWF9JTlQzMiBpUGF0dGVybiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcFN0clBhdHRlcm4gPSAoRlhfTFBDV1NUUil3c1RleHRGb3JtYXQ7DQorICAgIEZYX0lOVDMyIGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOw0KKyAgICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgew0KKyAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0lGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldFBhdHRlcm5Mb2NhbGUoRlhfV1NUUiB3c0xvY2FsZSkNCit7DQorICAgIGlmIChtX2JVc2VMQ0lEKSB7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcExvY2FsZU1nci0+R2V0TG9jYWxlQnlOYW1lKHdzTG9jYWxlKTsNCit9DQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUCQkJCTB4MWMNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX05FR01BU0sJCQkJCSgweDgwMDAwMDAwTCkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0ZPUkNFQk9PTCh4KQkJCQkoISghKHgpKSkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhORUcsIFNDQUxFKQkoKChTQ0FMRSkgPDwgMHgxMCkgfCAoKE5FRykgPyBGWE1BVEhfREVDSU1BTF9ORUdNQVNLIDogMCkpDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcoRkxBR1MpCQkJRlhNQVRIX0RFQ0lNQUxfRk9SQ0VCT09MKChGTEFHUykgJiBGWE1BVEhfREVDSU1BTF9ORUdNQVNLKQ0KKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUoRkxBR1MpCQkoKEZYX1VJTlQ4KSgoKEZMQUdTKSAmIH5GWE1BVEhfREVDSU1BTF9ORUdNQVNLKSA+PiAweDEwKSkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHgpCQkJKCh4KT4+MHgxMD4+MHgxMCkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHgpCQkJKCh4KTw8MHgxMDw8MHgxMCkNCitzdGF0aWMgaW5saW5lIEZYX1VJTlQ4IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChGWF9VSU5UNjQmIHBoaSwgRlhfVUlOVDY0JiBwbWlkLCBGWF9VSU5UNjQmIHBsbykNCit7DQorICAgIEZYX1VJTlQ4IHJldFZhbDsNCisgICAgcG1pZCArPSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVChwaGkgJSAweEEpOw0KKyAgICBwaGkgIC89IDB4QTsNCisgICAgcGxvICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHBtaWQgJSAweEEpOw0KKyAgICBwbWlkIC89IDB4QTsNCisgICAgcmV0VmFsID0gcGxvICUgMHhBOw0KKyAgICBwbG8gLz0gMHhBOw0KKyAgICByZXR1cm4gcmV0VmFsOw0KK30NCitzdGF0aWMgaW5saW5lIEZYX1VJTlQ4IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkoRlhfVUlOVDY0IG51bXNbXSwgRlhfVUlOVDggbnVtY291bnQpDQorew0KKyAgICBGWF9VSU5UOCByZXRWYWwgPSAwOw0KKyAgICBmb3IoaW50IGkgPSBudW1jb3VudCAtIDE7IGkgPiAwOyBpIC0tKSB7DQorICAgICAgICBudW1zW2kgLSAxXSArPSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVChudW1zW2ldICUgMHhBKTsNCisgICAgICAgIG51bXNbaV0gICAvPSAweEE7DQorICAgIH0NCisgICAgaWYobnVtY291bnQpIHsNCisgICAgICAgIHJldFZhbCAgPSAgbnVtc1swXSAlIDB4QTsNCisgICAgICAgIG51bXNbMF0gLz0gMHhBOw0KKyAgICB9DQorICAgIHJldHVybiByZXRWYWw7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTAoRlhfVUlOVDY0JiBwaGksIEZYX1VJTlQ2NCYgcG1pZCwgRlhfVUlOVDY0JiBwbG8pDQorew0KKyAgICBwbG8gICo9IDB4QTsNCisgICAgcG1pZCA9IHBtaWQgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbG8pOw0KKyAgICBwbG8gID0gKEZYX1VJTlQzMilwbG87DQorICAgIHBoaSAgPSBwaGkgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsNCisgICAgcG1pZCA9IChGWF9VSU5UMzIpcG1pZDsNCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMF9hbnkoRlhfVUlOVDY0IG51bXNbXSwgRlhfVUlOVDggbnVtY291bnQpDQorew0KKyAgICBudW1zWzBdICo9IDB4QTsNCisgICAgZm9yKGludCBpID0gMTsgaSA8IG51bWNvdW50OyBpKyspIHsNCisgICAgICAgIG51bXNbaV0gPSBudW1zW2ldICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQgKG51bXNbaSAtIDFdKTsNCisgICAgICAgIG51bXNbaSAtIDFdID0gKEZYX1VJTlQzMiludW1zW2kgLSAxXTsNCisgICAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZShGWF9VSU5UNjQmIHBoaSwgRlhfVUlOVDY0JiBwbWlkLCBGWF9VSU5UNjQmIHBsbykNCit7DQorICAgIHBoaSAgKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocG1pZCk7DQorICAgIHBtaWQgPSAoRlhfVUlOVDMyKXBtaWQ7DQorICAgIHBtaWQgKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGxvKTsNCisgICAgcGxvICA9IChGWF9VSU5UMzIpcGxvOw0KKyAgICBwaGkgICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOw0KKyAgICBwbWlkID0gKEZYX1VJTlQzMilwbWlkOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZV9hbnkoRlhfVUlOVDY0IG51bXNbXSwgRlhfVUlOVDggbGVuKQ0KK3sNCisgICAgew0KKyAgICAgICAgZm9yKGludCBpID0gbGVuIC0gMjsgaSA+IDA7IGkgLS0pIHsNCisgICAgICAgICAgICBudW1zW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChudW1zW2ldKTsNCisgICAgICAgICAgICBudW1zW2ldID0gKEZYX1VJTlQzMiludW1zW2ldOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHsNCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpICsrKSB7DQorICAgICAgICAgICAgbnVtc1tpICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobnVtc1tpXSk7DQorICAgICAgICAgICAgbnVtc1tpXSA9IChGWF9VSU5UMzIpbnVtc1tpXTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitzdGF0aWMgaW5saW5lIEZYX0lOVDggZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlKEZYX1VJTlQzMiBoaTEsIEZYX1VJTlQzMiBtaWQxLCBGWF9VSU5UMzIgbG8xLCBGWF9VSU5UMzIgaGkyLCBGWF9VSU5UMzIgbWlkMiwgRlhfVUlOVDMyIGxvMikNCit7DQorICAgIEZYX0lOVDggcmV0VmFsID0gMDsNCisgICAgaWYgKCFyZXRWYWwpIHsNCisgICAgICAgIHJldFZhbCArPSAoaGkxID4gaGkyID8gMSA6IChoaTEgPCBoaTIgPyAtMSA6IDApKTsNCisgICAgfQ0KKyAgICBpZiAoIXJldFZhbCkgew0KKyAgICAgICAgcmV0VmFsICs9IChtaWQxID4gbWlkMiA/IDEgOiAobWlkMSA8IG1pZDIgPyAtMSA6IDApKTsNCisgICAgfQ0KKyAgICBpZiAoIXJldFZhbCkgew0KKyAgICAgICAgcmV0VmFsICs9IChsbzEgPiBsbzIgPyAxIDogKGxvMSA8IGxvMiA/IC0xIDogMCkpOw0KKyAgICB9DQorICAgIHJldHVybiByZXRWYWw7DQorfQ0KK3N0YXRpYyBpbmxpbmUgRlhfSU5UOCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmVfYW55KEZYX1VJTlQ2NCBhW10sIEZYX1VJTlQ4IGFsLCBGWF9VSU5UNjQgYltdLCBGWF9VSU5UOCBibCkNCit7DQorICAgIEZYX0lOVDggcmV0VmFsID0gMDsNCisgICAgZm9yKGludCBpID0gRlhfTUFYKGFsIC0gMSwgYmwgLSAxKTsgaSA+PSAwOyBpIC0tKSB7DQorICAgICAgICBGWF9VSU5UNjQgbCA9IChpID49IGFsID8gMCA6IGFbaV0pLCByID0gKGkgPj0gYmwgPyAwIDogYltpXSk7DQorICAgICAgICByZXRWYWwgKz0gKGwgPiByID8gMSA6IChsIDwgciA/IC0xIDogMCkpOw0KKyAgICAgICAgaWYocmV0VmFsKSB7DQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcmV0VmFsOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RlY19hbnkoRlhfVUlOVDY0IGFbXSwgRlhfVUlOVDggYWwpDQorew0KKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWw7IGkgKyspIHsNCisgICAgICAgIGlmKGFbaV0tLSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2luY19hbnkoRlhfVUlOVDY0IGFbXSwgRlhfVUlOVDggYWwpDQorew0KKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWw7IGkgKyspIHsNCisgICAgICAgIGFbaV0rKzsNCisgICAgICAgIGlmKChGWF9VSU5UMzIpYVtpXSA9PSBhW2ldKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYVtpXSA9IDA7DQorICAgIH0NCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfbXVsKEZYX1VJTlQ2NCBhW10sIEZYX1VJTlQ4IGFsLCBGWF9VSU5UNjQgYltdLCBGWF9VSU5UOCBibCwgRlhfVUlOVDY0IGNbXSwgRlhfVUlOVDggY2wpDQorew0KKyAgICBhc3NlcnQoYWwgKyBibCA8PSBjbCk7DQorICAgIHsNCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgICAgICAgY1tpXSA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgew0KKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgYmw7IGorKykgew0KKyAgICAgICAgICAgICAgICBGWF9VSU5UNjQgbSA9IChGWF9VSU5UNjQpYVtpXSAqIGJbal07DQorICAgICAgICAgICAgICAgIGNbaSArIGpdICs9IChGWF9VSU5UMzIpbTsNCisgICAgICAgICAgICAgICAgY1tpICsgaiArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKG0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB7DQorICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY2wgLSAxOyBpKyspIHsNCisgICAgICAgICAgICBjW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChjW2ldKTsNCisgICAgICAgICAgICBjW2ldID0gKEZYX1VJTlQzMiljW2ldOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHsNCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgICAgICAgY1tpXSA9IChGWF9VSU5UMzIpY1tpXTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19kaXYoRlhfVUlOVDY0IGFbXSwgRlhfVUlOVDggYWwsIEZYX1VJTlQ2NCBiW10sIEZYX1VJTlQ4IGJsLCBGWF9VSU5UNjQgY1tdLCBGWF9VSU5UOCBjbCkNCit7DQorICAgIGludCBpOw0KKyAgICBmb3IoaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgICBjW2ldID0gMDsNCisgICAgfQ0KKyAgICBGWF9VSU5UNjQgbGVmdFsxNl0gPSB7MH0sIHJpZ2h0WzE2XSA9IHswfTsNCisgICAgbGVmdFswXSA9IDA7DQorICAgIGZvcihpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgICAgIHJpZ2h0W2ldID0gYVtpXTsNCisgICAgfQ0KKyAgICBGWF9VSU5UNjQgdG1wWzE2XTsNCisgICAgd2hpbGUoZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueShsZWZ0LCBhbCwgcmlnaHQsIGFsKSA8PSAwKSB7DQorICAgICAgICBGWF9VSU5UNjQgY3VyWzE2XTsNCisgICAgICAgIGZvcihpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgICAgICAgICBjdXJbaV0gPSBsZWZ0W2ldICsgcmlnaHRbaV07DQorICAgICAgICB9DQorICAgICAgICBmb3IoaSA9IGFsIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgICAgICBpZihpKSB7DQorICAgICAgICAgICAgICAgIGN1cltpIC0gMV0gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQoY3VyW2ldICUgMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGN1cltpXSAvPSAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19tdWwoY3VyLCBhbCwgYiwgYmwsIHRtcCwgMTYpOw0KKyAgICAgICAgc3dpdGNoKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkodG1wLCAxNiwgYSwgYWwpKSB7DQorICAgICAgICAgICAgY2FzZSAtMToNCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgbGVmdFtpXSA9IGN1cltpXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBsZWZ0WzBdKys7DQorICAgICAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KGxlZnQsIGFsKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICByaWdodFtpXSA9IGN1cltpXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGVjX2FueShyaWdodCwgYWwpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IEZYX01JTihhbCwgY2wpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIGNbaV0gPSBjdXJbaV07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZvcihpID0gMDsgaSA8IEZYX01JTihhbCwgY2wpOyBpKyspIHsNCisgICAgICAgIGNbaV0gPSBsZWZ0W2ldOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgRlhfQk9PTCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfb3V0b2ZyYW5nZShGWF9VSU5UNjQgYVtdLCBGWF9VSU5UOCBhbCwgRlhfVUlOVDggZ29hbCkNCit7DQorICAgIGZvcihpbnQgaSA9IGdvYWw7IGkgPCBhbDsgaSsrKSB7DQorICAgICAgICBpZihhW2ldKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShGWF9VSU5UNjQgYVtdLCBGWF9VSU5UOCBhbCwgRlhfVUlOVDggZ29hbCwgRlhfVUlOVDgmIHNjYWxlKQ0KK3sNCisgICAgRlhfQk9PTCBiUm91bmRVcCA9IEZBTFNFOw0KKyAgICB3aGlsZShzY2FsZSAhPSAwICYmIChzY2FsZSA+IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgfHwgZnhtYXRoX2RlY2ltYWxfaGVscGVyX291dG9mcmFuZ2UoYSwgYWwsIGdvYWwpKSkgew0KKyAgICAgICAgYlJvdW5kVXAgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KGEsIGFsKSA+PSA1Ow0KKyAgICAgICAgc2NhbGUgLS07DQorICAgIH0NCisgICAgaWYoYlJvdW5kVXApIHsNCisgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KGEsIGdvYWwpOw0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2luY19hbnkoYSwgZ29hbCk7DQorICAgIH0NCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZShGWF9VSU5UNjQmIHBoaSwgRlhfVUlOVDY0JiBwbWlkLCBGWF9VSU5UNjQmIHBsbywgRlhfVUlOVDgmIHNjYWxlLCBGWF9VSU5UOCBtaW5zY2FsZSA9IDApDQorew0KKyAgICB3aGlsZShzY2FsZSA+IG1pbnNjYWxlKSB7DQorICAgICAgICBGWF9VSU5UNjQgdGhpID0gcGhpLCB0bWlkID0gcG1pZCwgdGxvID0gcGxvOw0KKyAgICAgICAgaWYoZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHRoaSwgdG1pZCwgdGxvKSAhPSAwKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwaGkgPSB0aGksIHBtaWQgPSB0bWlkLCBwbG8gPSB0bG87DQorICAgICAgICBzY2FsZS0tOw0KKyAgICB9DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCgpDQorew0KKyAgICBtX3VMbyA9IG1fdU1pZCA9IG1fdUhpID0gbV91RmxhZ3MgPSAwOw0KK30NCitDRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoRlhfVUlOVDY0IHZhbCkNCit7DQorICAgIG1fdUxvICA9IChGWF9VSU5UMzIpdmFsOw0KKyAgICBtX3VNaWQgPSAoRlhfVUlOVDMyKUZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHZhbCk7DQorICAgIG1fdUhpICA9IDA7DQorICAgIG1fdUZsYWdzID0gMDsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKEZYX1VJTlQzMiB2YWwpDQorew0KKyAgICBtX3VMbyA9ICAoRlhfVUlOVDMyKXZhbDsNCisgICAgbV91TWlkID0gbV91SGkgPSAwOw0KKyAgICBtX3VGbGFncyA9IDA7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChGWF9VSU5UMzIgbG8sIEZYX1VJTlQzMiBtaWQsIEZYX1VJTlQzMiBoaSwgRlhfQk9PTCBuZWcsIEZYX1VJTlQ4IHNjYWxlKQ0KK3sNCisgICAgc2NhbGUgPSAoc2NhbGUgPiBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUID8gMCA6IHNjYWxlKTsNCisgICAgbV91TG8gPSBsbzsNCisgICAgbV91TWlkID0gbWlkOw0KKyAgICBtX3VIaSA9IGhpOw0KKyAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhuZWcgJiYgSXNOb3RaZXJvKCksIHNjYWxlKTsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKEZYX0lOVDMyIHZhbCkNCit7DQorICAgIGlmKHZhbCA+PSAwKSB7DQorICAgICAgICAqdGhpcyA9IENGWF9EZWNpbWFsKChGWF9VSU5UMzIpdmFsKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKEZYX1VJTlQzMikgLSB2YWwpOw0KKyAgICAgICAgU2V0TmVnYXRlKCk7DQorICAgIH0NCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKEZYX0lOVDY0IHZhbCkNCit7DQorICAgIGlmKHZhbCA+PSAwKSB7DQorICAgICAgICAqdGhpcyA9IENGWF9EZWNpbWFsKChGWF9VSU5UNjQpdmFsKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKEZYX1VJTlQ2NCkgLSB2YWwpOw0KKyAgICAgICAgU2V0TmVnYXRlKCk7DQorICAgIH0NCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKEZYX0ZMT0FUIHZhbCwgRlhfVUlOVDggc2NhbGUgKQ0KK3sNCisgICAgRlhfRkxPQVQgbmV3dmFsID0gZmFicyh2YWwpOw0KKyAgICBGWF9VSU5UNjQgcGhpLCBwbWlkLCBwbG87DQorICAgIHBsbyA9ICAoRlhfVUlOVDY0KW5ld3ZhbDsNCisgICAgcG1pZCA9IChGWF9VSU5UNjQpKG5ld3ZhbCAvIDFlMzIpOw0KKyAgICBwaGkgPSAgKEZYX1VJTlQ2NCkobmV3dmFsIC8gMWU2NCk7DQorICAgIG5ld3ZhbCA9IEZYU1lTX2Ztb2QobmV3dmFsLCAxLjBmKTsNCisgICAgZm9yKEZYX1VJTlQ4IGl0ZXIgPSAwOyBpdGVyIDwgc2NhbGU7IGl0ZXIrKykgew0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICAgIG5ld3ZhbCAqPSAxMDsNCisgICAgICAgIHBsbyArPSAoRlhfVUlOVDY0KW5ld3ZhbDsNCisgICAgICAgIG5ld3ZhbCA9IEZYU1lTX2Ztb2QobmV3dmFsLCAxLjBmKTsNCisgICAgfQ0KKyAgICBwbG8gKz0gRlhTWVNfcm91bmQobmV3dmFsKTsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZShwaGksIHBtaWQsIHBsbyk7DQorICAgIG1fdUhpID0gKEZYX1VJTlQzMilwaGk7DQorICAgIG1fdU1pZCA9IChGWF9VSU5UMzIpcG1pZDsNCisgICAgbV91TG8gPSAoRlhfVUlOVDMyKXBsbzsNCisgICAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1ModmFsIDwgMCAmJiBJc05vdFplcm8oKSwgc2NhbGUpOw0KK30NCitDRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoRlhfV1NUUiBzdHJPYmopDQorew0KKyAgICBGWF9MUENXU1RSIHN0ciA9IHN0ck9iai5HZXRQdHIoKTsNCisgICAgRlhfTFBDV1NUUiBzdHJCb3VuZCA9IHN0ciArIHN0ck9iai5HZXRMZW5ndGgoKTsNCisgICAgRlhfQk9PTCBwb2ludG1ldCA9IDA7DQorICAgIEZYX0JPT0wgbmVnbWV0ID0gMDsNCisgICAgRlhfVUlOVDggc2NhbGUgPSAwOw0KKyAgICBtX3VIaSA9IG1fdU1pZCA9IG1fdUxvID0gMDsNCisgICAgd2hpbGUgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICcgJykgew0KKyAgICAgICAgc3RyKys7DQorICAgIH0NCisgICAgaWYgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICctJykgew0KKyAgICAgICAgbmVnbWV0ID0gMTsNCisgICAgICAgIHN0cisrOw0KKyAgICB9IGVsc2UgaWYgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICcrJykgew0KKyAgICAgICAgc3RyKys7DQorICAgIH0NCisgICAgd2hpbGUgKHN0ciAhPSBzdHJCb3VuZCAmJiAoKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKSB8fCAqc3RyID09ICcuJykgJiYgc2NhbGUgPCBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUKSB7DQorICAgICAgICBpZiAoKnN0ciA9PSAnLicpIHsNCisgICAgICAgICAgICBpZihwb2ludG1ldCkgew0KKyAgICAgICAgICAgICAgICBnb3RvIGNvbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBvaW50bWV0ID0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV91SGkgPSBtX3VIaSAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKChGWF9VSU5UNjQpbV91TWlkICogMHhBKTsNCisgICAgICAgICAgICBtX3VNaWQgPSBtX3VNaWQgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCgoRlhfVUlOVDY0KW1fdUxvICAqIDB4QSk7DQorICAgICAgICAgICAgbV91TG8gPSBtX3VMbyAqIDB4QSArICgqc3RyIC0gJzAnKTsNCisgICAgICAgICAgICBpZihwb2ludG1ldCkgew0KKyAgICAgICAgICAgICAgICBzY2FsZSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCitjb250Og0KKyAgICAgICAgc3RyKys7DQorICAgIH0NCisgICAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnbWV0ICYmIElzTm90WmVybygpLCBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChGWF9CU1RSIHN0ck9iaikNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzdHJPYmo7DQorICAgIHdzdHJPYmouQ29udmVydEZyb20oc3RyT2JqKTsNCisgICAgKnRoaXMgPSBDRlhfRGVjaW1hbCh3c3RyT2JqKTsNCit9DQorQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkgY29uc3QNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHJldFN0cmluZzsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgdG1wYnVmOw0KKyAgICBGWF9VSU5UNjQgcGhpID0gbV91SGksIHBtaWQgPSBtX3VNaWQsIHBsbyA9IG1fdUxvOw0KKyAgICB3aGlsZShwaGkgfHwgcG1pZCB8fCBwbG8pIHsNCisgICAgICAgIHRtcGJ1ZiArPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTAocGhpLCBwbWlkLCBwbG8pICsgJzAnOw0KKyAgICB9DQorICAgIEZYX1VJTlQ4IG91dHB1dGxlbiA9IChGWF9VSU5UOCl0bXBidWYuR2V0TGVuZ3RoKCk7DQorICAgIEZYX1VJTlQ4IHNjYWxlID0gKEZYX1VJTlQ4KUZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsNCisgICAgd2hpbGUgKHNjYWxlID49IG91dHB1dGxlbikgew0KKyAgICAgICAgdG1wYnVmICs9ICcwJzsNCisgICAgICAgIG91dHB1dGxlbisrOw0KKyAgICB9DQorICAgIGlmIChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpKSB7DQorICAgICAgICByZXRTdHJpbmcgKz0gJy0nOw0KKyAgICB9DQorICAgIGZvciAoRlhfVUlOVDggaWR4ID0gMDsgaWR4IDwgb3V0cHV0bGVuOyBpZHgrKykgew0KKyAgICAgICAgaWYgKGlkeCA9PSAob3V0cHV0bGVuIC0gc2NhbGUpICYmIHNjYWxlICE9IDApIHsNCisgICAgICAgICAgICByZXRTdHJpbmcgKz0gJy4nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0U3RyaW5nICs9IHRtcGJ1ZltvdXRwdXRsZW4gLSAxIC0gaWR4XTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmV0U3RyaW5nOw0KK30NCitDRlhfRGVjaW1hbDo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QNCit7DQorICAgIGRvdWJsZSBwb3cgPSAoZG91YmxlKSgxIDw8IDE2KSAqICgxIDw8IDE2KTsNCisgICAgZG91YmxlIGJhc2UgPSAoKGRvdWJsZSltX3VIaSkgKiBwb3cgKiBwb3cgKyAoKGRvdWJsZSltX3VNaWQpICogcG93ICsgKChkb3VibGUpbV91TG8pOw0KKyAgICBGWF9JTlQ4IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOw0KKyAgICBGWF9CT09MIGJOZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpOw0KKyAgICByZXR1cm4gKGJOZWcgPyAtMSA6IDEpICogYmFzZSAqIDo6cG93KDEwLjAsIC1zY2FsZSk7DQorfQ0KK3ZvaWQgQ0ZYX0RlY2ltYWw6OlNldFNjYWxlKEZYX1VJTlQ4IG5ld3NjYWxlKQ0KK3sNCisgICAgRlhfVUlOVDggb2xkc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQorICAgIGlmIChuZXdzY2FsZSA+IG9sZHNjYWxlKSB7DQorICAgICAgICBGWF9VSU5UNjQgcGhpID0gbV91SGksIHBtaWQgPSBtX3VNaWQsIHBsbyA9IG1fdUxvOw0KKyAgICAgICAgZm9yIChGWF9VSU5UOCBpdGVyID0gMDsgaXRlciA8IG5ld3NjYWxlIC0gb2xkc2NhbGU7IGl0ZXIrKykgew0KKyAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMChwaGksIHBtaWQsIHBsbyk7DQorICAgICAgICB9DQorICAgICAgICBtX3VIaSA9IChGWF9VSU5UMzIpcGhpOw0KKyAgICAgICAgbV91TWlkID0gKEZYX1VJTlQzMilwbWlkOw0KKyAgICAgICAgbV91TG8gPSAoRlhfVUlOVDMyKXBsbzsNCisgICAgICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIG5ld3NjYWxlKTsNCisgICAgfSBlbHNlIGlmIChuZXdzY2FsZSA8IG9sZHNjYWxlKSB7DQorICAgICAgICBGWF9VSU5UNjQgcGhpLCBwbWlkLCBwbG87DQorICAgICAgICBwaGkgPSAwLCBwbWlkID0gMCwgcGxvID0gNTsNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3IoRlhfVUlOVDggaXRlciA9IDA7IGl0ZXIgPCBvbGRzY2FsZSAtIG5ld3NjYWxlIC0gMTsgaXRlcisrKSB7DQorICAgICAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMChwaGksIHBtaWQsIHBsbyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcGhpICs9IG1fdUhpOw0KKyAgICAgICAgcG1pZCArPSBtX3VNaWQ7DQorICAgICAgICBwbG8gKz0gbV91TG87DQorICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3IoRlhfVUlOVDggaXRlciA9IDA7IGl0ZXIgPCBvbGRzY2FsZSAtIG5ld3NjYWxlOyBpdGVyKyspIHsNCisgICAgICAgICAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3VIaSA9IChGWF9VSU5UMzIpcGhpOw0KKyAgICAgICAgbV91TWlkID0gKEZYX1VJTlQzMilwbWlkOw0KKyAgICAgICAgbV91TG8gPSAoRlhfVUlOVDMyKXBsbzsNCisgICAgICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIG5ld3NjYWxlKTsNCisgICAgfQ0KK30NCitGWF9VSU5UOCBDRlhfRGVjaW1hbDo6R2V0U2NhbGUoKQ0KK3sNCisgICAgRlhfVUlOVDggb2xkc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQorICAgIHJldHVybiBvbGRzY2FsZTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0QWJzKCkNCit7DQorICAgIG1fdUZsYWdzICY9IH5GWE1BVEhfREVDSU1BTF9ORUdNQVNLOw0KK30NCit2b2lkIENGWF9EZWNpbWFsOjpTZXROZWdhdGUoKQ0KK3sNCisgICAgaWYoSXNOb3RaZXJvKCkpIHsNCisgICAgICAgIG1fdUZsYWdzIF49IEZYTUFUSF9ERUNJTUFMX05FR01BU0s7DQorICAgIH0NCit9DQordm9pZCBDRlhfRGVjaW1hbDo6Rmxvb3JPckNlaWwoRlhfQk9PTCBiRmxvb3IpDQorew0KKyAgICBGWF9VSU5UNjQgbnVtc1szXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX07DQorICAgIEZYX0JPT0wgYkRhdGFMb3NzID0gRkFMU0U7DQorICAgIGZvcihpbnQgaSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsgaSA+IDA7IGkgLS0pIHsNCisgICAgICAgIGJEYXRhTG9zcyA9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkobnVtcywgMykgfHwgYkRhdGFMb3NzOw0KKyAgICB9DQorICAgIGlmKGJEYXRhTG9zcyAmJiAoYkZsb29yID8gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSA6ICFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKSkgew0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2luY19hbnkobnVtcywgMyk7DQorICAgIH0NCisgICAgbV91SGkgPSAoRlhfVUlOVDMyKW51bXNbMl07DQorICAgIG1fdU1pZCA9IChGWF9VSU5UMzIpbnVtc1sxXTsNCisgICAgbV91TG8gPSAoRlhfVUlOVDMyKW51bXNbMF07DQorICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIDApOw0KK30NCit2b2lkIENGWF9EZWNpbWFsOjpTZXRGbG9vcigpDQorew0KKyAgICBGbG9vck9yQ2VpbChUUlVFKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0Q2VpbGluZygpDQorew0KKyAgICBGbG9vck9yQ2VpbChGQUxTRSk7DQorfQ0KK3ZvaWQgQ0ZYX0RlY2ltYWw6OlNldFRydW5jYXRlKCkNCit7DQorICAgIEZsb29yT3JDZWlsKCFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U3dhcChDRlhfRGVjaW1hbCYgdmFsKQ0KK3sNCisgICAgRlhfVUlOVDMyIHRtcDsNCisgICAgdG1wID0gbV91SGk7DQorICAgIG1fdUhpID0gdmFsLm1fdUhpOw0KKyAgICB2YWwubV91SGkgPSB0bXA7DQorICAgIHRtcCA9IG1fdU1pZDsNCisgICAgbV91TWlkID0gdmFsLm1fdU1pZDsNCisgICAgdmFsLm1fdU1pZCA9IHRtcDsNCisgICAgdG1wID0gbV91TG87DQorICAgIG1fdUxvID0gdmFsLm1fdUxvOw0KKyAgICB2YWwubV91TG8gPSB0bXA7DQorICAgIHRtcCA9IG1fdUZsYWdzOw0KKyAgICBtX3VGbGFncyA9IHZhbC5tX3VGbGFnczsNCisgICAgdmFsLm1fdUZsYWdzID0gdG1wOw0KK30NCitGWF9JTlQ4IENGWF9EZWNpbWFsOjpDb21wYXJlIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgQ0ZYX0RlY2ltYWwgbGhzID0gKnRoaXMsIHJocyA9IHZhbDsNCisgICAgRlhfSU5UOCByZXRWYWwgPSAwOw0KKyAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKSB7DQorICAgICAgICBGWF9VSU5UOCBzY2FsZSA9IEZYX01JTihGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShsaHMubV91RmxhZ3MpLCBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKTsNCisgICAgICAgIGxocy5TZXRTY2FsZShzY2FsZSk7DQorICAgICAgICByaHMuU2V0U2NhbGUoc2NhbGUpOw0KKyAgICB9DQorICAgIHJldFZhbCA9IC0gKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhsaHMubV91RmxhZ3MpIC0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHJocy5tX3VGbGFncykpOw0KKyAgICBpZiAocmV0VmFsKSB7DQorICAgICAgICByZXR1cm4gcmV0VmFsOw0KKyAgICB9DQorICAgIHJldFZhbCA9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZShsaHMubV91SGksIGxocy5tX3VNaWQsIGxocy5tX3VMbywgcmhzLm1fdUhpLCByaHMubV91TWlkLCByaHMubV91TG8pOw0KKyAgICByZXR1cm4gKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhsaHMubV91RmxhZ3MpID8gLSByZXRWYWwgOiByZXRWYWwpOw0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6QWRkT3JNaW51cyhjb25zdCBDRlhfRGVjaW1hbCYgdmFsLCBGWF9CT09MIGlzQWRkaW5nKSBjb25zdA0KK3sNCisgICAgQ0ZYX0RlY2ltYWwgbGhzID0gKnRoaXMsIHJocyA9IHZhbDsNCisgICAgaWYgKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncykgIT0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUocmhzLm1fdUZsYWdzKSkgew0KKyAgICAgICAgRlhfVUlOVDggc2NhbGUgPSBGWF9NQVgoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSwgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUocmhzLm1fdUZsYWdzKSk7DQorICAgICAgICBsaHMuU2V0U2NhbGUoc2NhbGUpOw0KKyAgICAgICAgcmhzLlNldFNjYWxlKHNjYWxlKTsNCisgICAgfQ0KKyAgICBpZighaXNBZGRpbmcpIHsNCisgICAgICAgIHJocy5TZXROZWdhdGUoKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGRvUmF3QWRkID0gKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhsaHMubV91RmxhZ3MpID09IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhyaHMubV91RmxhZ3MpKTsNCisgICAgaWYgKGRvUmF3QWRkKSB7DQorICAgICAgICBGWF9VSU5UNjQgcGhpID0gbGhzLm1fdUhpLCBwbWlkID0gbGhzLm1fdU1pZCwgcGxvID0gbGhzLm1fdUxvOw0KKyAgICAgICAgcGhpICs9IHJocy5tX3VIaTsNCisgICAgICAgIHBtaWQgKz0gcmhzLm1fdU1pZDsNCisgICAgICAgIHBsbyArPSByaHMubV91TG87DQorICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICAgIGlmKEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBoaSkgJiYgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSAwKSB7DQorICAgICAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICAgICAgICBsaHMubV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncyksIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncykgLSAxKTsNCisgICAgICAgIH0NCisgICAgICAgIGxocy5tX3VIaSA9IChGWF9VSU5UMzIpcGhpOw0KKyAgICAgICAgbGhzLm1fdU1pZCA9IChGWF9VSU5UMzIpcG1pZDsNCisgICAgICAgIGxocy5tX3VMbyA9IChGWF9VSU5UMzIpcGxvOw0KKyAgICAgICAgcmV0dXJuIGxoczsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZShsaHMubV91SGksIGxocy5tX3VNaWQsIGxocy5tX3VMbywgcmhzLm1fdUhpLCByaHMubV91TWlkLCByaHMubV91TG8pIDwgMCkgew0KKyAgICAgICAgICAgIGxocy5Td2FwKHJocyk7DQorICAgICAgICB9DQorICAgICAgICBsaHMubV91SGkgLT0gcmhzLm1fdUhpOw0KKyAgICAgICAgaWYobGhzLm1fdU1pZCA8IHJocy5tX3VNaWQpIHsNCisgICAgICAgICAgICBsaHMubV91SGktLTsNCisgICAgICAgIH0NCisgICAgICAgIGxocy5tX3VNaWQgLT0gcmhzLm1fdU1pZDsNCisgICAgICAgIGlmKGxocy5tX3VMbyA8IHJocy5tX3VMbykgew0KKyAgICAgICAgICAgIGlmKCFsaHMubV91TWlkKSB7DQorICAgICAgICAgICAgICAgIGxocy5tX3VIaS0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBsaHMubV91TWlkLS07DQorICAgICAgICB9DQorICAgICAgICBsaHMubV91TG8gLT0gcmhzLm1fdUxvOw0KKyAgICAgICAgcmV0dXJuIGxoczsNCisgICAgfQ0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6TXVsdGlwbHkoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCit7DQorICAgIEZYX1VJTlQ2NCBhWzNdID0ge21fdUxvLCBtX3VNaWQsIG1fdUhpfSwgYlszXSA9IHt2YWwubV91TG8sIHZhbC5tX3VNaWQsIHZhbC5tX3VIaX07DQorICAgIEZYX1VJTlQ2NCBjWzZdOw0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X211bChhLCAzLCBiLCAzLCBjLCA2KTsNCisgICAgRlhfQk9PTCBuZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpIF4gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHZhbC5tX3VGbGFncyk7DQorICAgIEZYX1VJTlQ4IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpICsgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKTsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShjLCA2LCAzLCBzY2FsZSk7DQorICAgIHJldHVybiBDRlhfRGVjaW1hbCgoRlhfVUlOVDMyKWNbMF0sIChGWF9VSU5UMzIpY1sxXSwgKEZYX1VJTlQzMiljWzJdLCBuZWcsIHNjYWxlKTsNCit9DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6OkRpdmlkZShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgaWYoIXZhbC5Jc05vdFplcm8oKSkgew0KKyAgICAgICAgcmV0dXJuIENGWF9EZWNpbWFsKCk7DQorICAgIH0NCisgICAgRlhfQk9PTCBuZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpIF4gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHZhbC5tX3VGbGFncyk7DQorICAgIEZYX1VJTlQ2NCBhWzddID0ge21fdUxvLCBtX3VNaWQsIG1fdUhpfSwgYlszXSA9IHt2YWwubV91TG8sIHZhbC5tX3VNaWQsIHZhbC5tX3VIaX0sIGNbN10gPSB7MH07DQorICAgIEZYX1VJTlQ4IHNjYWxlID0gMDsNCisgICAgaWYoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpIDwgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKSkgew0KKyAgICAgICAgZm9yKGludCBpID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKSAtIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsgaSA+IDA7IGktLSkgew0KKyAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMF9hbnkoYSwgNyk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKSAtIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncyk7DQorICAgIH0NCisgICAgRlhfVUlOVDggbWluc2NhbGUgPSBzY2FsZTsNCisgICAgaWYoIUlzTm90WmVybygpKSB7DQorICAgICAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoMCwgMCwgMCwgMCwgbWluc2NhbGUpOw0KKyAgICB9DQorICAgIHdoaWxlKCFhWzZdKSB7DQorICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KGEsIDcpOw0KKyAgICAgICAgc2NhbGUrKzsNCisgICAgfQ0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KGEsIDcpOw0KKyAgICBzY2FsZS0tOw0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2RpdihhLCA2LCBiLCAzLCBjLCA3KTsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShjLCA2LCAzLCBzY2FsZSk7DQorICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZShjWzJdLCBjWzFdLCBjWzBdLCBzY2FsZSwgbWluc2NhbGUpOw0KKyAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoKEZYX1VJTlQzMiljWzBdLCAoRlhfVUlOVDMyKWNbMV0sIChGWF9VSU5UMzIpY1syXSwgbmVnLCBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpNb2R1bHVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0DQorew0KKyAgICBDRlhfRGVjaW1hbCBsaHMgPSAqdGhpcywgcmhzX2FicyA9IHZhbDsNCisgICAgcmhzX2Ficy5TZXRBYnMoKTsNCisgICAgaWYoIXJoc19hYnMuSXNOb3RaZXJvKCkpIHsNCisgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICB3aGlsZShUUlVFKSB7DQorICAgICAgICBDRlhfRGVjaW1hbCBsaHNfYWJzID0gbGhzOw0KKyAgICAgICAgbGhzX2Ficy5TZXRBYnMoKTsNCisgICAgICAgIGlmKGxoc19hYnMgPCByaHNfYWJzKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDRlhfRGVjaW1hbCBxdW90ID0gbGhzIC8gcmhzX2FiczsNCisgICAgICAgIHF1b3QuU2V0VHJ1bmNhdGUoKTsNCisgICAgICAgIGxocyA9IGxocyAtIHF1b3QgKiByaHNfYWJzOw0KKyAgICB9DQorICAgIHJldHVybiBsaHM7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yID09IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIENvbXBhcmUodmFsKSA9PSAwOw0KK30NCitGWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvciA8PSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCit7DQorICAgIHJldHVybiBDb21wYXJlKHZhbCkgPD0gMDsNCit9DQorRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgPj0gKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0DQorew0KKyAgICByZXR1cm4gQ29tcGFyZSh2YWwpID49IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yICE9IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIENvbXBhcmUodmFsKSAhPSAwOw0KK30NCitGWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvciA8ICAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCit7DQorICAgIHJldHVybiBDb21wYXJlKHZhbCkgPCAwOw0KK30NCitGWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvciA+ICAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCit7DQorICAgIHJldHVybiBDb21wYXJlKHZhbCkgPiAwOw0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCit7DQorICAgIHJldHVybiBBZGRPck1pbnVzKHZhbCwgVFJVRSk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciAtIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEFkZE9yTWludXModmFsLCBGQUxTRSk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciAqIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIE11bHRpcGx5KHZhbCk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciAvIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIERpdmlkZSh2YWwpOw0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgJSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCit7DQorICAgIHJldHVybiBNb2R1bHVzKHZhbCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZWltcC5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ODM4OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZWltcC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfTE9DQUxFX0lNUF9IXw0KKyNkZWZpbmUgX0ZYX0xPQ0FMRV9JTVBfSF8NCitjbGFzcyBDRlhfTENOdW1lcmljOw0KK2NsYXNzIENGWF9Mb2NhbGUgOiBwdWJsaWMgSUZYX0xvY2FsZSwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfTG9jYWxlKENYTUxfRWxlbWVudCogcExvY2FsZURhdGEpOw0KKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQgR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkIEdldE1vbnRoTmFtZShGWF9JTlQzMiBuTW9udGgsIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQgR2V0RGF5TmFtZShGWF9JTlQzMiBuV2VlaywgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkIEdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZCBHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEID0gVFJVRSkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgdm9pZCBHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkIEdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorcHJvdGVjdGVkOg0KKyAgICB2aXJ0dWFsIH5DRlhfTG9jYWxlKCk7DQorICAgIENYTUxfRWxlbWVudCogbV9wRWxlbWVudDsNCit9Ow0KK2NsYXNzIENGWF9Gb3JtYXRTdHJpbmcgOiBwdWJsaWMgSUZYX0Zvcm1hdFN0cmluZywgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfRm9ybWF0U3RyaW5nKElGWF9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IsIEZYX0JPT0wgYlVzZUxDSUQpOw0KKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgdm9pZCBTcGxpdEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0dGVybnMpOw0KKyAgICB2aXJ0dWFsIEZYX0xPQ0FMRUNBVEVHT1JZIEdldENhdGVnb3J5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJR2V0TENJRChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKTsNCisgICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRMb2NhbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJUGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCVBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfRkxPQVQgJmZWYWx1ZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCVBhcnNlRGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlLCBDRlhfVW5pdGltZSYgZHRWYWx1ZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJRm9ybWF0TnVtKEZYX0ZMT0FUIGZOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgICAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgICAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCitwcm90ZWN0ZWQ6DQorICAgIHZpcnR1YWwgfkNGWF9Gb3JtYXRTdHJpbmcoKTsNCisgICAgSUZYX0xvY2FsZSogR2V0VGV4dEZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXR0ZXJuLCBGWF9XU1RSIHdzQ2F0ZWdvcnksIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQorICAgIElGWF9Mb2NhbGUqIEdldE51bWVyaWNGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfSU5UMzImIGlEb3RJbmRleCwgRlhfRFdPUkQmIGR3U3R5bGUsIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQorICAgIEZYX0JPT0wgCUZvcm1hdFN0ck51bShGWF9XU1RSIHdzSW5wdXROdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICAgIEZYX0JPT0wJCUZvcm1hdExDTnVtZXJpYyhDRlhfTENOdW1lcmljJiBsY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgICAgRlhfREFURVRJTUVUWVBFIEdldERhdGVUaW1lRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIElGWF9Mb2NhbGUqJiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyAmd3NEYXRlUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcgJndzVGltZVBhdHRlcm4pOw0KKyAgICBJRlhfTG9jYWxlKgkJR2V0UGF0dGVybkxvY2FsZShGWF9XU1RSIHdzTG9jYWxlKTsNCisgICAgSUZYX0xvY2FsZU1ncioJbV9wTG9jYWxlTWdyOw0KKyAgICBGWF9CT09MCQkJbV9iVXNlTENJRDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTNmMTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfbG9jYWxlbWdyLmgiDQorSUZYX0xvY2FsZU1ncioJRlhfTG9jYWxlTWdyX0NyZWF0ZShGWF9MUENXU1RSIHBzekxvY2FsUGF0aCwgRlhfV09SRCB3RGVmYXVsdExDSUQpDQorew0KKyAgICB2b2lkKiBwUGF0aEhhbmRsZSA9IEZYX09wZW5Gb2xkZXIocHN6TG9jYWxQYXRoKTsNCisgICAgaWYgKCFwUGF0aEhhbmRsZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX0xvY2FsZU1nciogcExvY2FsZU1nciA9IEZYX05FVyBDRlhfTG9jYWxlTWdyKHdEZWZhdWx0TENJRCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWU7DQorICAgIEZYX0JPT0wgYkZvbGRlciA9IEZBTFNFOw0KKyAgICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUocFBhdGhIYW5kbGUsIHdzRmlsZU5hbWUsIGJGb2xkZXIpKSB7DQorICAgICAgICBpZiAoIWJGb2xkZXIpIHsNCisgICAgICAgICAgICBpZiAod3NGaWxlTmFtZS5HZXRMZW5ndGgoKSA8IDQpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXh0ID0gd3NGaWxlTmFtZS5SaWdodCg0KTsNCisgICAgICAgICAgICB3c0V4dC5NYWtlTG93ZXIoKTsNCisgICAgICAgICAgICBpZiAod3NFeHQgIT0gTCIueG1sIikgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGdWxsUGF0aChwc3pMb2NhbFBhdGgpOw0KKyAgICAgICAgICAgIHdzRnVsbFBhdGggKz0gTCJcXCIgKyB3c0ZpbGVOYW1lOw0KKyAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcFJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0Z1bGxQYXRoKTsNCisgICAgICAgICAgICBpZiAoIXBSZWFkKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBYbWxMb2NhbGUgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBSZWFkKTsNCisgICAgICAgICAgICBwUmVhZC0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzc3AgPSBwWG1sTG9jYWxlLT5HZXROYW1lc3BhY2UoKTsNCisgICAgICAgICAgICBpZiAoYnNzcCA9PSAiaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbS9sb2NhbGl6YXRpb24iKSB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRCA9IHBYbWxMb2NhbGUtPkdldEF0dHJWYWx1ZSgiIiwgImxjaWQiKTsNCisgICAgICAgICAgICAgICAgd2NoYXJfdCogcEVuZCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TENJRCA9IHdjc3RvbCh3c0xDSUQsICZwRW5kLCAxNik7DQorICAgICAgICAgICAgICAgIGlmIChwTG9jYWxlTWdyLT5tX2xjaWQyeG1sLkdldFZhbHVlQXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd0xDSUQpKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFhtbExvY2FsZTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBMb2NhbGVNZ3ItPm1fbGNpZDJ4bWwuU2V0QXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd0xDSUQsIHBYbWxMb2NhbGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBYbWxMb2NhbGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0Nsb3NlRm9sZGVyKHBQYXRoSGFuZGxlKTsNCisgICAgcmV0dXJuIHBMb2NhbGVNZ3I7DQorfQ0KK0NGWF9Mb2NhbGVNZ3I6OkNGWF9Mb2NhbGVNZ3IoRlhfV09SRCB3RGVmTENJRCkNCisgICAgOiBtX3dEZWZMQ0lEKHdEZWZMQ0lEKQ0KK3sNCit9DQorQ0ZYX0xvY2FsZU1ncjo6fkNGWF9Mb2NhbGVNZ3IoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcHMgPSBtX2xjaWQybG9jYWxlLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBGWF9MUFZPSUQgcGxjaWQ7DQorICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgICAgICAgIG1fbGNpZDJsb2NhbGUuR2V0TmV4dEFzc29jKHBzLCBwbGNpZCwgKHZvaWQqJilwTG9jYWxlKTsNCisgICAgICAgIHBMb2NhbGUtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBtX2xjaWQybG9jYWxlLlJlbW92ZUFsbCgpOw0KKyAgICBwcyA9IG1fbGNpZDJ4bWwuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHMpIHsNCisgICAgICAgIEZYX0xQVk9JRCBwbGNpZDsNCisgICAgICAgIENYTUxfRWxlbWVudCogcHhtbCA9IE5VTEw7DQorICAgICAgICBtX2xjaWQyeG1sLkdldE5leHRBc3NvYyhwcywgcGxjaWQsICh2b2lkKiYpcHhtbCk7DQorICAgICAgICBkZWxldGUgcHhtbDsNCisgICAgfQ0KKyAgICBtX2xjaWQyeG1sLlJlbW92ZUFsbCgpOw0KK30NCitGWF9XT1JECUNGWF9Mb2NhbGVNZ3I6OkdldERlZkxvY2FsZUlEKCkNCit7DQorICAgIHJldHVybiBtX3dEZWZMQ0lEOw0KK30NCitJRlhfTG9jYWxlKiBDRlhfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGUoKQ0KK3sNCisgICAgcmV0dXJuIEdldExvY2FsZShtX3dEZWZMQ0lEKTsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0xvY2FsZU1ncjo6R2V0TG9jYWxlKEZYX1dPUkQgbGNpZCkNCit7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSAoSUZYX0xvY2FsZSopbV9sY2lkMmxvY2FsZS5HZXRWYWx1ZUF0KChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpbGNpZCk7DQorICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgQ1hNTF9FbGVtZW50KiBweG1sID0gKENYTUxfRWxlbWVudCopbV9sY2lkMnhtbC5HZXRWYWx1ZUF0KChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpbGNpZCk7DQorICAgICAgICBpZiAocHhtbCkgew0KKyAgICAgICAgICAgIHBMb2NhbGUgPSBJRlhfTG9jYWxlOjpDcmVhdGUocHhtbCk7DQorICAgICAgICAgICAgbV9sY2lkMmxvY2FsZS5TZXRBdCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWxjaWQsIHBMb2NhbGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwTG9jYWxlOw0KK30NCitJRlhfTG9jYWxlKiBDRlhfTG9jYWxlTWdyOjpHZXRMb2NhbGVCeU5hbWUoRlhfV1NUUiB3c0xvY2FsZU5hbWUpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM5NDBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9MT0NBTEVNR1JfSU1QX0hfDQorI2RlZmluZSBfRlhfTE9DQUxFTUdSX0lNUF9IXw0KK2NsYXNzIENGWF9Mb2NhbGVNZ3IgOiBwdWJsaWMgSUZYX0xvY2FsZU1nciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfTG9jYWxlTWdyKEZYX1dPUkQgd0RlZkxDSUQpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9XT1JECQkJR2V0RGVmTG9jYWxlSUQoKTsNCisgICAgdmlydHVhbCBJRlhfTG9jYWxlKiAJR2V0RGVmTG9jYWxlKCk7DQorICAgIHZpcnR1YWwgSUZYX0xvY2FsZSogCUdldExvY2FsZShGWF9XT1JEIGxjaWQpOw0KKyAgICB2aXJ0dWFsIElGWF9Mb2NhbGUqIAlHZXRMb2NhbGVCeU5hbWUoRlhfV1NUUiB3c0xvY2FsZU5hbWUpOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIgbV9sY2lkMnhtbDsNCitwcm90ZWN0ZWQ6DQorICAgIH5DRlhfTG9jYWxlTWdyKCk7DQorICAgIENGWF9NYXBQdHJUb1B0ciBtX2xjaWQybG9jYWxlOw0KKyAgICBGWF9XT1JECQkJbV93RGVmTENJRDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy94bWwvZnhfc2F4X2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZWUzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwCkBAIC0wLDAgKzEsNzIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfc2F4X2ltcC5oIg0KK0lGWF9TQVhSZWFkZXIqIEZYX1NBWFJlYWRlcl9DcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDRlhfU0FYUmVhZGVyOw0KK30NCitDRlhfU0FYRmlsZTo6Q0ZYX1NBWEZpbGUoKQ0KKyAgICA6IG1fcEZpbGUoTlVMTCkNCisgICAgLCBtX2R3U3RhcnQoMCkNCisgICAgLCBtX2R3RW5kKDApDQorICAgICwgbV9kd0N1cigwKQ0KKyAgICAsIG1fcEJ1ZihOVUxMKQ0KKyAgICAsIG1fZHdCdWZTaXplKDApDQorICAgICwgbV9kd0J1ZkluZGV4KDApDQorew0KK30NCitGWF9CT09MIENGWF9TQVhGaWxlOjpTdGFydEZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfRFdPUkQgZHdTdGFydCwgRlhfRFdPUkQgZHdMZW4pDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRmlsZSA9PSBOVUxMICYmIHBGaWxlICE9IE5VTEwpOw0KKyAgICBGWF9EV09SRCBkd1NpemUgPSBwRmlsZS0+R2V0U2l6ZSgpOw0KKyAgICBpZiAoZHdTdGFydCA+PSBkd1NpemUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoZHdMZW4gPT0gLTEgfHwgZHdTdGFydCArIGR3TGVuID4gZHdTaXplKSB7DQorICAgICAgICBkd0xlbiA9IGR3U2l6ZSAtIGR3U3RhcnQ7DQorICAgIH0NCisgICAgaWYgKGR3TGVuID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2R3QnVmU2l6ZSA9IEZYX01JTihkd0xlbiwgRlhfU0FYRklMRV9CVUZTSVpFKTsNCisgICAgbV9wQnVmID0gRlhfQWxsb2MoRlhfQllURSwgbV9kd0J1ZlNpemUpOw0KKyAgICBpZiAoIW1fcEJ1Zikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghcEZpbGUtPlJlYWRCbG9jayhtX3BCdWYsIGR3U3RhcnQsIG1fZHdCdWZTaXplKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fZHdTdGFydCA9IGR3U3RhcnQ7DQorICAgIG1fZHdFbmQgPSBkd1N0YXJ0ICsgZHdMZW47DQorICAgIG1fZHdDdXIgPSBkd1N0YXJ0Ow0KKyAgICBtX3BGaWxlID0gcEZpbGU7DQorICAgIG1fZHdCdWZJbmRleCA9IDA7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9TQVhGaWxlOjpSZWFkTmV4dEJsb2NrKCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BGaWxlICE9IE5VTEwpOw0KKyAgICBGWF9EV09SRCBkd1NpemUgPSBtX2R3RW5kIC0gbV9kd0N1cjsNCisgICAgaWYgKGR3U2l6ZSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9kd0J1ZlNpemUgPSBGWF9NSU4oZHdTaXplLCBGWF9TQVhGSUxFX0JVRlNJWkUpOw0KKyAgICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BCdWYsIG1fZHdDdXIsIG1fZHdCdWZTaXplKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fZHdCdWZJbmRleCA9IDA7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGWF9TQVhGaWxlOjpSZXNldCgpDQorew0KKyAgICBpZiAobV9wQnVmKSB7DQorICAgICAgICBGWF9GcmVlKG1fcEJ1Zik7DQorICAgICAgICBtX3BCdWYgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fcEZpbGUgPSBOVUxMOw0KK30NCisjZGVmaW5lIEZYX1NBWENIQVJUWVBFX05vcm1hbAkJMA0KKyNkZWZpbmUgRlhfU0FYQ0hBUlRZUEVfU3BhY2UJCTENCitzdGF0aWMgRlhfQllURSBnX1NBWF9DaGFyVHlwZVsyNTZdID0gew0KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLA0KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLA0KKyAgICAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KK307DQorQ0ZYX1NBWFJlYWRlcjo6Q0ZYX1NBWFJlYWRlcigpDQorICAgIDogbV9GaWxlKCkNCisgICAgLCBtX3BIYW5kbGVyKE5VTEwpDQorICAgICwgbV9pU3RhdGUoLTEpDQorICAgICwgbV9wUm9vdChOVUxMKQ0KKyAgICAsIG1fcEN1ckl0ZW0oTlVMTCkNCisgICAgLCBtX2R3SXRlbUlEKDApDQorICAgICwgbV9pRGF0YVNpemUoMjU2KQ0KKyAgICAsIG1faU5hbWVTaXplKDI1NikNCisgICAgLCBtX3BDb21tZW50Q29udGV4dChOVUxMKQ0KKyAgICAsIG1fZHdQYXJzZU1vZGUoMCkNCit7DQorICAgIG1fcHN6RGF0YSA9IChGWF9MUEJZVEUpRlhfQWxsb2MoRlhfQllURSwgbV9pRGF0YVNpemUpOw0KKyAgICBtX3Bzek5hbWUgPSAoRlhfTFBCWVRFKUZYX0FsbG9jKEZYX0JZVEUsIG1faU5hbWVTaXplKTsNCit9DQorQ0ZYX1NBWFJlYWRlcjo6fkNGWF9TQVhSZWFkZXIoKQ0KK3sNCisgICAgUmVzZXQoKTsNCisgICAgaWYgKG1fcHN6RGF0YSkgew0KKyAgICAgICAgRlhfRnJlZShtX3BzekRhdGEpOw0KKyAgICAgICAgbV9wc3pEYXRhID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wc3pOYW1lKSB7DQorICAgICAgICBGWF9GcmVlKG1fcHN6TmFtZSk7DQorICAgICAgICBtX3Bzek5hbWUgPSBOVUxMOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UmVzZXQoKQ0KK3sNCisgICAgbV9GaWxlLlJlc2V0KCk7DQorICAgIENGWF9TQVhJdGVtICpwSXRlbSA9IG1fcFJvb3Q7DQorICAgIHdoaWxlIChwSXRlbSkgew0KKyAgICAgICAgQ0ZYX1NBWEl0ZW0gKnBOZXh0ID0gcEl0ZW0tPm1fcE5leHQ7DQorICAgICAgICBkZWxldGUgcEl0ZW07DQorICAgICAgICBwSXRlbSA9IHBOZXh0Ow0KKyAgICB9DQorICAgIG1fcFJvb3QgPSBOVUxMOw0KKyAgICBtX3BDdXJJdGVtID0gTlVMTDsNCisgICAgbV9kd0l0ZW1JRCA9IDA7DQorICAgIG1fU2tpcFN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgICBtX1NraXBDaGFyID0gMDsNCisgICAgbV9pRGF0YUxlbmd0aCA9IDA7DQorICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7DQorICAgIG1faU5hbWVMZW5ndGggPSAwOw0KKyAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgaWYgKG1fcENvbW1lbnRDb250ZXh0KSB7DQorICAgICAgICBkZWxldGUgbV9wQ29tbWVudENvbnRleHQ7DQorICAgICAgICBtX3BDb21tZW50Q29udGV4dCA9IE5VTEw7DQorICAgIH0NCit9DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6UHVzaCgpDQorew0KKyAgICBDRlhfU0FYSXRlbSAqcE5ldyA9IEZYX05FVyBDRlhfU0FYSXRlbTsNCisgICAgcE5ldy0+bV9kd0lEID0gKyttX2R3SXRlbUlEOw0KKyAgICBwTmV3LT5tX2JTa2lwID0gbV9wQ3VySXRlbS0+bV9iU2tpcDsNCisgICAgcE5ldy0+bV9wUHJldiA9IG1fcEN1ckl0ZW07DQorICAgIG1fcEN1ckl0ZW0tPm1fcE5leHQgPSBwTmV3Ow0KKyAgICBtX3BDdXJJdGVtID0gcE5ldzsNCit9DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6UG9wKCkNCit7DQorICAgIGlmICghbV9wQ3VySXRlbSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9TQVhJdGVtICpwUHJldiA9IG1fcEN1ckl0ZW0tPm1fcFByZXY7DQorICAgIHBQcmV2LT5tX3BOZXh0ID0gTlVMTDsNCisgICAgZGVsZXRlIG1fcEN1ckl0ZW07DQorICAgIG1fcEN1ckl0ZW0gPSBwUHJldjsNCit9DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6QXBwZW5kRGF0YShGWF9CWVRFIGNoKQ0KK3sNCisgICAgUmVhbGxvY0RhdGFCdWZmZXIoKTsNCisgICAgbV9wc3pEYXRhW21faURhdGFQb3MrK10gPSBjaDsNCit9DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6QXBwZW5kTmFtZShGWF9CWVRFIGNoKQ0KK3sNCisgICAgUmVhbGxvY05hbWVCdWZmZXIoKTsNCisgICAgbV9wc3pOYW1lW21faURhdGFQb3MrK10gPSBjaDsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpSZWFsbG9jRGF0YUJ1ZmZlcigpDQorew0KKyAgICBpZiAobV9pRGF0YVBvcyA8IG1faURhdGFTaXplKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1faURhdGFTaXplIDw9IDEwMjQgKiAxMDI0KSB7DQorICAgICAgICBtX2lEYXRhU2l6ZSAqPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9pRGF0YVNpemUgKz0gMTAyNCAqIDEwMjQ7DQorICAgIH0NCisgICAgbV9wc3pEYXRhID0gKEZYX0xQQllURSlGWF9SZWFsbG9jKEZYX0JZVEUsIG1fcHN6RGF0YSwgbV9pRGF0YVNpemUpOw0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlJlYWxsb2NOYW1lQnVmZmVyKCkNCit7DQorICAgIGlmIChtX2lEYXRhUG9zIDwgbV9pTmFtZVNpemUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9pTmFtZVNpemUgPD0gMTAyNCAqIDEwMjQpIHsNCisgICAgICAgIG1faU5hbWVTaXplICo9IDI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2lOYW1lU2l6ZSArPSAxMDI0ICogMTAyNDsNCisgICAgfQ0KKyAgICBtX3Bzek5hbWUgPSAoRlhfTFBCWVRFKUZYX1JlYWxsb2MoRlhfQllURSwgbV9wc3pOYW1lLCBtX2lOYW1lU2l6ZSk7DQorfQ0KK2lubGluZSBGWF9CT09MIENGWF9TQVhSZWFkZXI6OlNraXBTcGFjZShGWF9CWVRFIGNoKQ0KK3sNCisgICAgcmV0dXJuIChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdFNraXBTcGFjZSkgPT0gMCAmJiBjaCA8IDB4MjE7DQorfQ0KK0ZYX0lOVDMyIENGWF9TQVhSZWFkZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfRFdPUkQgZHdTdGFydCAsIEZYX0RXT1JEIGR3TGVuICwgRlhfRFdPUkQgZHdQYXJzZU1vZGUgKQ0KK3sNCisgICAgbV9pU3RhdGUgPSAtMTsNCisgICAgUmVzZXQoKTsNCisgICAgaWYgKCFtX0ZpbGUuU3RhcnRGaWxlKHBGaWxlLCBkd1N0YXJ0LCBkd0xlbikpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBtX2lTdGF0ZSA9IDA7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICBtX2JDaGFyRGF0YSA9IEZBTFNFOw0KKyAgICBtX2R3RGF0YU9mZnNldCA9IDA7DQorICAgIG1fcFJvb3QgPSBtX3BDdXJJdGVtID0gRlhfTkVXIENGWF9TQVhJdGVtOw0KKyAgICBtX3BDdXJJdGVtLT5tX2R3SUQgPSArK21fZHdJdGVtSUQ7DQorICAgIG1fZHdQYXJzZU1vZGUgPSBkd1BhcnNlTW9kZTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK3R5cGVkZWYgdm9pZCAoQ0ZYX1NBWFJlYWRlcjo6KkZYX1NBWFJlYWRlcl9MUEZQYXJzZSkoKTsNCitzdGF0aWMgY29uc3QgRlhfU0FYUmVhZGVyX0xQRlBhcnNlIGdfRlhfU0FYUmVhZGVyX0xQRlBhcnNlW0ZYX1NBWE1PREVfTUFYXSA9IHsNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGV4dCwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlTm9kZVN0YXJ0LA0KKyAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsT3JDb21tZW50LA0KKyAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsTm9kZSwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudCwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudENvbnRlbnQsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZUVxdWFsLA0KKyAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVWYWx1ZSwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlTWF5YmVDbG9zZSwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQ2xvc2UsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0VuZCwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFyZ2V0RGF0YSwNCit9Ow0KK0ZYX0lOVDMyIENGWF9TQVhSZWFkZXI6OkNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgKQ0KK3sNCisgICAgaWYgKG1faVN0YXRlIDwgMCB8fCBtX2lTdGF0ZSA+IDk5KSB7DQorICAgICAgICByZXR1cm4gbV9pU3RhdGU7DQorICAgIH0NCisgICAgd2hpbGUobV9GaWxlLm1fZHdDdXIgPCBtX0ZpbGUubV9kd0VuZCkgew0KKyAgICAgICAgRlhfRFdPUkQgJmluZGV4ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX0ZpbGUubV9kd0J1ZlNpemU7DQorICAgICAgICBGWF9MUENCWVRFIHBCdWYgPSBtX0ZpbGUubV9wQnVmOw0KKyAgICAgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgICAgICAgIG1fQ3VyQnl0ZSA9IHBCdWZbaW5kZXhdOw0KKyAgICAgICAgICAgICh0aGlzLT4qZ19GWF9TQVhSZWFkZXJfTFBGUGFyc2VbbV9lTW9kZV0pKCk7DQorICAgICAgICAgICAgaW5kZXggKys7DQorICAgICAgICB9DQorICAgICAgICBtX0ZpbGUubV9kd0N1ciArPSBpbmRleDsNCisgICAgICAgIG1faVN0YXRlID0gKG1fRmlsZS5tX2R3Q3VyIC0gbV9GaWxlLm1fZHdTdGFydCkgKiAxMDAgLyAobV9GaWxlLm1fZHdFbmQgLSBtX0ZpbGUubV9kd1N0YXJ0KTsNCisgICAgICAgIGlmIChtX0ZpbGUubV9kd0N1ciA+PSBtX0ZpbGUubV9kd0VuZCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFtX0ZpbGUuUmVhZE5leHRCbG9jaygpKSB7DQorICAgICAgICAgICAgbV9pU3RhdGUgPSAtMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fZHdEYXRhT2Zmc2V0ID0gMDsNCisgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1faVN0YXRlOw0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlQ2hhcihGWF9CWVRFIGNoKQ0KK3sNCisgICAgUmVhbGxvY0RhdGFCdWZmZXIoKTsNCisgICAgbV9wc3pEYXRhW21faURhdGFQb3NdID0gY2g7DQorICAgIGlmIChtX2lFbnRpdHlTdGFydCA+IC0xICYmIGNoID09ICc7Jykgew0KKyAgICAgICAgRlhfSU5UMzIgaVNhdmVFbnRpdHlTdGFydCA9IG1faUVudGl0eVN0YXJ0Ow0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRpdHkobV9wc3pEYXRhICsgbV9pRW50aXR5U3RhcnQgKyAxLCBtX2lEYXRhUG9zIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsNCisgICAgICAgIEZYX0lOVDMyIGlMZW4gPSBjc0VudGl0eS5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgIGlmIChjc0VudGl0eVswXSA9PSAnIycpIHsNCisgICAgICAgICAgICAgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfc2hhcnApID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gMDsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdzsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpTGVuID4gMSAmJiBjc0VudGl0eVsxXSA9PSAneCcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlbjsgaSArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ID49ICcwJyAmJiB3IDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gJzAnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gJ0EnICYmIHcgPD0gJ0YnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49ICdhJyAmJiB3IDw9ICdmJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gODc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IGlMZW47IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA8ICcwJyB8fCB3ID4gJzknKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGNoICogMTAgKyB3IC0gJzAnOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0ICsrXSA9IGNoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoImFtcCIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2FtcCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnJic7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgibHQiKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9sdCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnPCc7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiZ3QiKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnPic7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiYXBvcyIpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQgKytdID0gJ1wnJzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKCJxdW90IikgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfcXVvdCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnXCInOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlTYXZlRW50aXR5U3RhcnQgIT0gbV9pRW50aXR5U3RhcnQpIHsNCisgICAgICAgICAgICBtX2lEYXRhUG9zID0gbV9pRW50aXR5U3RhcnQ7DQorICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9pRGF0YVBvcyArKzsNCisgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0IDwgMCAmJiBjaCA9PSAnJicpIHsNCisgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IG1faURhdGFQb3M7DQorICAgICAgICB9DQorICAgICAgICBtX2lEYXRhUG9zICsrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUZXh0KCkNCit7DQorICAgIGlmIChtX0N1ckJ5dGUgPT0gJzwnKSB7DQorICAgICAgICBpZiAobV9pRGF0YVBvcyA+IDApIHsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgICAgICAgICBOb3RpZnlEYXRhKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgUHVzaCgpOw0KKyAgICAgICAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9Ob2RlU3RhcnQ7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1faURhdGFQb3MgPCAxICYmIFNraXBTcGFjZShtX0N1ckJ5dGUpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VOb2RlU3RhcnQoKQ0KK3sNCisgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPSBGWF9TQVhOT0RFX0luc3RydWN0aW9uOw0KKyAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTmFtZTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9DdXJCeXRlID09ICchJykgew0KKyAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfRGVjbE9yQ29tbWVudDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9DdXJCeXRlID09ICcvJykgew0KKyAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnRW5kOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgICAgICBQb3AoKTsNCisgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1fQ3VyQnl0ZSA+IDB4MjApIHsNCisgICAgICAgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPSBGWF9TQVhOT0RFX1RhZzsNCisgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ05hbWU7DQorICAgICAgICBBcHBlbmREYXRhKG1fQ3VyQnl0ZSk7DQorICAgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xPckNvbW1lbnQoKQ0KK3sNCisgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnLScpIHsNCisgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX0NvbW1lbnQ7DQorICAgICAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID0gRlhfU0FYTk9ERV9Db21tZW50Ow0KKyAgICAgICAgaWYgKG1fcENvbW1lbnRDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BDb21tZW50Q29udGV4dCA9IEZYX05FVyBDRlhfU0FYQ29tbWVudENvbnRleHQ7DQorICAgICAgICB9DQorICAgICAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pSGVhZGVyQ291bnQgPSAxOw0KKyAgICAgICAgbV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudCA9IDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9EZWNsTm9kZTsNCisgICAgICAgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgICAgIG1fU2tpcENoYXIgPSAnPic7DQorICAgICAgICBtX1NraXBTdGFjay5BZGQoJz4nKTsNCisgICAgICAgIFNraXBOb2RlKCk7DQorICAgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZUNvbW1lbnQoKQ0KK3sNCisgICAgbV9wQ29tbWVudENvbnRleHQtPm1faUhlYWRlckNvdW50ID0gMjsNCisgICAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX0NvbW1lbnRDb250ZW50Ow0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudENvbnRlbnQoKQ0KK3sNCisgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnLScpIHsNCisgICAgICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQrKzsNCisgICAgfSBlbHNlIGlmIChtX0N1ckJ5dGUgPT0gJz4nICYmIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQgPT0gMikgew0KKyAgICAgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgICAgICAgTm90aWZ5VGFyZ2V0RGF0YSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgUG9wKCk7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgd2hpbGUgKG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgQXBwZW5kRGF0YSgnLScpOw0KKyAgICAgICAgICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQtLTsNCisgICAgICAgIH0NCisgICAgICAgIEFwcGVuZERhdGEobV9DdXJCeXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlRGVjbE5vZGUoKQ0KK3sNCisgICAgU2tpcE5vZGUoKTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUoKQ0KK3sNCisgICAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEgfHwgbV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz4nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgICAgIE5vdGlmeUVudGVyKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9DdXJCeXRlIDwgMHgyMSkgew0KKyAgICAgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWU7DQorICAgICAgICB9IGVsc2UgaWYgKG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc/Jykgew0KKyAgICAgICAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsNCisgICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgICAgICAgICBOb3RpZnlCcmVhaygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVOYW1lKCkNCit7DQorICAgIGlmIChtX0N1ckJ5dGUgPCAweDIxIHx8IG1fQ3VyQnl0ZSA9PSAnPScpIHsNCisgICAgICAgIGlmIChtX2lEYXRhUG9zIDwgMSAmJiBtX0N1ckJ5dGUgPCAweDIxKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9pTmFtZUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgIG1fU2tpcENoYXIgPSAwOw0KKyAgICAgICAgbV9lTW9kZSA9IG1fQ3VyQnl0ZSA9PSAnPScgPyBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZVZhbHVlIDogRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVFcXVhbDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz4nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICAgIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICAgICAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7DQorICAgICAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTWF5YmVDbG9zZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgICAgICAgICAgICAgTm90aWZ5QnJlYWsoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCisgICAgICAgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgfQ0KKyAgICBBcHBlbmROYW1lKG1fQ3VyQnl0ZSk7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpDQorew0KKyAgICBpZiAobV9DdXJCeXRlID09ICc9Jykgew0KKyAgICAgICAgbV9Ta2lwQ2hhciA9IDA7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVWYWx1ZTsNCisgICAgICAgIHJldHVybjsNCisgICAgfSBlbHNlIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgIG1faURhdGFQb3MgPSBtX2lOYW1lTGVuZ3RoOw0KKyAgICAgICAgQXBwZW5kTmFtZSgweDIwKTsNCisgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICBQYXJzZVRhcmdldERhdGEoKTsNCisgICAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlVmFsdWUoKQ0KK3sNCisgICAgaWYgKG1fU2tpcENoYXIpIHsNCisgICAgICAgIGlmIChtX1NraXBDaGFyID09IG1fQ3VyQnl0ZSkgew0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgICAgICAgICAgICAgTm90aWZ5QXR0cmlidXRlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IDA7DQorICAgICAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlTmFtZTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBQYXJzZUNoYXIobV9DdXJCeXRlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9DdXJCeXRlIDwgMHgyMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX2lEYXRhUG9zIDwgMSkgew0KKyAgICAgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnXCcnIHx8IG1fQ3VyQnl0ZSA9PSAnXCInKSB7DQorICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IG1fQ3VyQnl0ZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlTWF5YmVDbG9zZSgpDQorew0KKyAgICBpZiAobV9DdXJCeXRlID09ICc+Jykgew0KKyAgICAgICAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgIG1faU5hbWVMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgICAgICAgICAgIE5vdGlmeVRhcmdldERhdGEoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBQYXJzZVRhZ0Nsb3NlKCk7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICB9IGVsc2UgaWYgKG1fZVByZXZNb2RlID09IEZYX1NBWE1PREVfVGFnTmFtZSkgew0KKyAgICAgICAgQXBwZW5kRGF0YSgnLycpOw0KKyAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTmFtZTsNCisgICAgICAgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICAgICAgUGFyc2VUYWdOYW1lKCk7DQorICAgIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lKSB7DQorICAgICAgICBBcHBlbmROYW1lKCcvJyk7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lOw0KKyAgICAgICAgbV9lUHJldk1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgICAgICBQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsNCisgICAgfSBlbHNlIGlmIChtX2VQcmV2TW9kZSA9PSBGWF9TQVhNT0RFX1RhcmdldERhdGEpIHsNCisgICAgICAgIEFwcGVuZE5hbWUoJz8nKTsNCisgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICBtX2VQcmV2TW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgICAgIFBhcnNlVGFyZ2V0RGF0YSgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdDbG9zZSgpDQorew0KKyAgICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgICAgIE5vdGlmeUNsb3NlKCk7DQorICAgIH0NCisgICAgUG9wKCk7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdFbmQoKQ0KK3sNCisgICAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9DdXJCeXRlID09ICc+Jykgew0KKyAgICAgICAgUG9wKCk7DQorICAgICAgICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgICAgIE5vdGlmeUVuZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgUG9wKCk7DQorICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQorICAgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhcmdldERhdGEoKQ0KK3sNCisgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsNCisgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ01heWJlQ2xvc2U7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBBcHBlbmROYW1lKG1fQ3VyQnl0ZSk7DQorICAgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpTa2lwTm9kZSgpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuID0gbV9Ta2lwU3RhY2suR2V0U2l6ZSgpOw0KKyAgICBpZiAobV9Ta2lwQ2hhciA9PSAnXCcnIHx8IG1fU2tpcENoYXIgPT0gJ1wiJykgew0KKyAgICAgICAgaWYgKG1fQ3VyQnl0ZSAhPSBtX1NraXBDaGFyKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUxlbiAtLTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChpTGVuID4gLTEpOw0KKyAgICAgICAgbV9Ta2lwU3RhY2suUmVtb3ZlQXQoaUxlbiwgMSk7DQorICAgICAgICBtX1NraXBDaGFyID0gaUxlbiA/IG1fU2tpcFN0YWNrW2lMZW4gLSAxXSA6IDA7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgc3dpdGNoIChtX0N1ckJ5dGUpIHsNCisgICAgICAgIGNhc2UgJzwnOg0KKyAgICAgICAgICAgIG1fU2tpcENoYXIgPSAnPic7DQorICAgICAgICAgICAgbV9Ta2lwU3RhY2suQWRkKCc+Jyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdbJzoNCisgICAgICAgICAgICBtX1NraXBDaGFyID0gJ10nOw0KKyAgICAgICAgICAgIG1fU2tpcFN0YWNrLkFkZCgnXScpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKCc6DQorICAgICAgICAgICAgbV9Ta2lwQ2hhciA9ICcpJzsNCisgICAgICAgICAgICBtX1NraXBTdGFjay5BZGQoJyknKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICBtX1NraXBDaGFyID0gJ1wnJzsNCisgICAgICAgICAgICBtX1NraXBTdGFjay5BZGQoJ1wnJyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdcIic6DQorICAgICAgICAgICAgbV9Ta2lwQ2hhciA9ICdcIic7DQorICAgICAgICAgICAgbV9Ta2lwU3RhY2suQWRkKCdcIicpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBpZiAobV9DdXJCeXRlID09IG1fU2tpcENoYXIpIHsNCisgICAgICAgICAgICAgICAgaUxlbiAtLTsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUmVtb3ZlQXQoaUxlbiwgMSk7DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBpTGVuID8gbV9Ta2lwU3RhY2tbaUxlbiAtIDFdIDogMDsNCisgICAgICAgICAgICAgICAgaWYgKGlMZW4gPT0gMCAmJiBtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBGWFNZU19tZW1jbXAobV9wc3pEYXRhLCAiW0NEQVRBWyIsIDcgKiBzaXplb2YoRlhfQllURSkpID09IDANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgRlhTWVNfbWVtY21wKG1fcHN6RGF0YSArIG1faURhdGFMZW5ndGggLSAyLCAiXV0iLCAyICogc2l6ZW9mKEZYX0JZVEUpKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUG9wKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCAtPSA5Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdEYXRhT2Zmc2V0ICs9IDc7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtbW92ZShtX3BzekRhdGEgLCBtX3BzekRhdGEgKyA3LCBtX2lEYXRhTGVuZ3RoICogc2l6ZW9mKEZYX0JZVEUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyRGF0YSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZ5RGF0YSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyRGF0YSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBQb3AoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgICBQYXJzZUNoYXIobV9DdXJCeXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeURhdGEoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKQ0KKyAgICAgICAgbV9wSGFuZGxlci0+T25UYWdEYXRhKG1fcEN1ckl0ZW0tPm1fcE5vZGUsIG1fYkNoYXJEYXRhID8gRlhfU0FYTk9ERV9DaGFyRGF0YSA6IEZYX1NBWE5PREVfVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwgbV9GaWxlLm1fZHdDdXIgKyBtX2R3RGF0YU9mZnNldCk7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5RW50ZXIoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnIHx8IG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgbV9wQ3VySXRlbS0+bV9wTm9kZSA9IG1fcEhhbmRsZXItPk9uVGFnRW50ZXIoQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCksIG1fcEN1ckl0ZW0tPm1fZU5vZGUsIG1fZHdOb2RlUG9zKTsNCisgICAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUF0dHJpYnV0ZSgpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wSGFuZGxlciAhPSBOVUxMKTsNCisgICAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9UYWcgfHwgbV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0F0dHJpYnV0ZShtX3BDdXJJdGVtLT5tX3BOb2RlLCBDRlhfQnl0ZVN0cmluZ0MobV9wc3pOYW1lLCBtX2lOYW1lTGVuZ3RoKSwgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5QnJlYWsoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKSB7DQorICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0JyZWFrKG1fcEN1ckl0ZW0tPm1fcE5vZGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5Q2xvc2UoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnIHx8IG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgbV9wSGFuZGxlci0+T25UYWdDbG9zZShtX3BDdXJJdGVtLT5tX3BOb2RlLCBtX2R3Tm9kZVBvcyk7DQorICAgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbmQoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKSB7DQorICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VuZChtX3BDdXJJdGVtLT5tX3BOb2RlLCBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwgbV9kd05vZGVQb3MpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5VGFyZ2V0RGF0YSgpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wSGFuZGxlciAhPSBOVUxMKTsNCisgICAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgbV9wSGFuZGxlci0+T25UYXJnZXREYXRhKG1fcEN1ckl0ZW0tPm1fcE5vZGUsIG1fcEN1ckl0ZW0tPm1fZU5vZGUsIENGWF9CeXRlU3RyaW5nQyhtX3Bzek5hbWUsIG1faU5hbWVMZW5ndGgpLCBtX2R3Tm9kZVBvcyk7DQorICAgIH0gZWxzZSBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0NvbW1lbnQpIHsNCisgICAgICAgIG1fcEhhbmRsZXItPk9uVGFyZ2V0RGF0YShtX3BDdXJJdGVtLT5tX3BOb2RlLCBtX3BDdXJJdGVtLT5tX2VOb2RlLCBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwgbV9kd05vZGVQb3MpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2tpcEN1cnJlbnROb2RlKCkNCit7DQorICAgIGlmICghbV9wQ3VySXRlbSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fcEN1ckl0ZW0tPm1fYlNraXAgPSBUUlVFOw0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlNldEhhbmRsZXIoSUZYX1NBWFJlYWRlckhhbmRsZXIgKnBIYW5kbGVyKQ0KK3sNCisgICAgbV9wSGFuZGxlciA9IHBIYW5kbGVyOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmggYi94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MTczMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuaApAQCAtMCwwICsxLDE0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9TQVhfSU1QXw0KKyNkZWZpbmUgX0ZYX1NBWF9JTVBfDQorI2RlZmluZSBGWF9TQVhGSUxFX0JVRlNJWkUJMzI3NjgNCitjbGFzcyBDRlhfU0FYRmlsZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX1NBWEZpbGUoKTsNCisgICAgRlhfQk9PTAkJU3RhcnRGaWxlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0RXT1JEIGR3U3RhcnQsIEZYX0RXT1JEIGR3TGVuKTsNCisgICAgRlhfQk9PTAkJUmVhZE5leHRCbG9jaygpOw0KKyAgICB2b2lkCQlSZXNldCgpOw0KKyAgICBJRlhfRmlsZVJlYWQqCW1fcEZpbGU7DQorICAgIEZYX0RXT1JECQltX2R3U3RhcnQ7DQorICAgIEZYX0RXT1JECQltX2R3RW5kOw0KKyAgICBGWF9EV09SRAkJbV9kd0N1cjsNCisgICAgRlhfTFBCWVRFCQltX3BCdWY7DQorICAgIEZYX0RXT1JECQltX2R3QnVmU2l6ZTsNCisgICAgRlhfRFdPUkQJCW1fZHdCdWZJbmRleDsNCit9Ow0KK2VudW0gRlhfU0FYTU9ERSB7DQorICAgIEZYX1NBWE1PREVfVGV4dCA9IDAsDQorICAgIEZYX1NBWE1PREVfTm9kZVN0YXJ0LA0KKyAgICBGWF9TQVhNT0RFX0RlY2xPckNvbW1lbnQsDQorICAgIEZYX1NBWE1PREVfRGVjbE5vZGUsDQorICAgIEZYX1NBWE1PREVfQ29tbWVudCwNCisgICAgRlhfU0FYTU9ERV9Db21tZW50Q29udGVudCwNCisgICAgRlhfU0FYTU9ERV9UYWdOYW1lLA0KKyAgICBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWUsDQorICAgIEZYX1NBWE1PREVfVGFnQXR0cmlidXRlRXF1YWwsDQorICAgIEZYX1NBWE1PREVfVGFnQXR0cmlidXRlVmFsdWUsDQorICAgIEZYX1NBWE1PREVfVGFnTWF5YmVDbG9zZSwNCisgICAgRlhfU0FYTU9ERV9UYWdDbG9zZSwNCisgICAgRlhfU0FYTU9ERV9UYWdFbmQsDQorICAgIEZYX1NBWE1PREVfVGFyZ2V0RGF0YSwNCisgICAgRlhfU0FYTU9ERV9NQVgsDQorfTsNCitjbGFzcyBDRlhfU0FYSXRlbSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX1NBWEl0ZW0oKSA6IG1fcE5vZGUoTlVMTCkNCisgICAgICAgICwgbV9lTm9kZShGWF9TQVhOT0RFX1Vua25vd24pDQorICAgICAgICAsIG1fZHdJRCgwKQ0KKyAgICAgICAgLCBtX2JTa2lwKEZBTFNFKQ0KKyAgICAgICAgLCBtX3BQcmV2KE5VTEwpDQorICAgICAgICAsIG1fcE5leHQoTlVMTCkNCisgICAge30NCisgICAgRlhfTFBWT0lECQltX3BOb2RlOw0KKyAgICBGWF9TQVhOT0RFCQltX2VOb2RlOw0KKyAgICBGWF9EV09SRAkJbV9kd0lEOw0KKyAgICBGWF9CT09MCQkJbV9iU2tpcDsNCisgICAgQ0ZYX1NBWEl0ZW0qCW1fcFByZXY7DQorICAgIENGWF9TQVhJdGVtKgltX3BOZXh0Ow0KK307DQorY2xhc3MgQ0ZYX1NBWENvbW1lbnRDb250ZXh0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRlhfU0FYQ29tbWVudENvbnRleHQoKSA6IG1faUhlYWRlckNvdW50KDApDQorICAgICAgICAsIG1faVRhaWxDb3VudCgwKQ0KKyAgICB7DQorICAgIH0NCisgICAgRlhfSU5UMzIJCW1faUhlYWRlckNvdW50Ow0KKyAgICBGWF9JTlQzMgkJbV9pVGFpbENvdW50Ow0KK307DQorY2xhc3MgQ0ZYX1NBWFJlYWRlciA6IHB1YmxpYyBJRlhfU0FYUmVhZGVyLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9TQVhSZWFkZXIoKTsNCisgICAgfkNGWF9TQVhSZWFkZXIoKTsNCisgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMglTdGFydFBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0RXT1JEIGR3U3RhcnQgPSAwLCBGWF9EV09SRCBkd0xlbiA9IC0xLCBGWF9EV09SRCBkd1BhcnNlTW9kZSA9IDApOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCisgICAgdmlydHVhbCB2b2lkCQlTa2lwQ3VycmVudE5vZGUoKTsNCisgICAgdmlydHVhbCB2b2lkCQlTZXRIYW5kbGVyKElGWF9TQVhSZWFkZXJIYW5kbGVyICpwSGFuZGxlcik7DQorICAgIHZvaWQJCUFwcGVuZERhdGEoRlhfQllURSBjaCk7DQorICAgIHZvaWQJCUFwcGVuZE5hbWUoRlhfQllURSBjaCk7DQorICAgIHZvaWQJCVBhcnNlVGV4dCgpOw0KKyAgICB2b2lkCQlQYXJzZU5vZGVTdGFydCgpOw0KKyAgICB2b2lkCQlQYXJzZUluc3RydWN0aW9uKCk7DQorICAgIHZvaWQJCVBhcnNlRGVjbE9yQ29tbWVudCgpOw0KKyAgICB2b2lkCQlQYXJzZURlY2xOb2RlKCk7DQorICAgIHZvaWQJCVBhcnNlQ29tbWVudCgpOw0KKyAgICB2b2lkCQlQYXJzZUNvbW1lbnRDb250ZW50KCk7DQorICAgIHZvaWQJCVBhcnNlVGFnTmFtZSgpOw0KKyAgICB2b2lkCQlQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsNCisgICAgdm9pZAkJUGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpOw0KKyAgICB2b2lkCQlQYXJzZVRhZ0F0dHJpYnV0ZVZhbHVlKCk7DQorICAgIHZvaWQJCVBhcnNlTWF5YmVDbG9zZSgpOw0KKyAgICB2b2lkCQlQYXJzZVRhZ0Nsb3NlKCk7DQorICAgIHZvaWQJCVBhcnNlVGFnRW5kKCk7DQorICAgIHZvaWQJCVBhcnNlVGFyZ2V0RGF0YSgpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX1NBWEZpbGUJCQkJbV9GaWxlOw0KKyAgICBJRlhfU0FYUmVhZGVySGFuZGxlcioJbV9wSGFuZGxlcjsNCisgICAgRlhfSU5UMzIJCQkJbV9pU3RhdGU7DQorICAgIENGWF9TQVhJdGVtKgkJCW1fcFJvb3Q7DQorICAgIENGWF9TQVhJdGVtKgkJCW1fcEN1ckl0ZW07DQorICAgIEZYX0RXT1JECQkJCW1fZHdJdGVtSUQ7DQorICAgIEZYX1NBWE1PREUJCQkJbV9lTW9kZTsNCisgICAgRlhfU0FYTU9ERQkJCQltX2VQcmV2TW9kZTsNCisgICAgRlhfQk9PTAkJCQkJbV9iQ2hhckRhdGE7DQorICAgIEZYX0JZVEUJCQkJCW1fQ3VyQnl0ZTsNCisgICAgRlhfRFdPUkQJCQkJbV9kd0RhdGFPZmZzZXQ7DQorICAgIENGWF9CeXRlQXJyYXkJCQltX1NraXBTdGFjazsNCisgICAgRlhfQllURQkJCQkJbV9Ta2lwQ2hhcjsNCisgICAgRlhfRFdPUkQJCQkJbV9kd05vZGVQb3M7DQorICAgIEZYX0xQQllURQkJCQltX3BzekRhdGE7DQorICAgIEZYX0lOVDMyCQkJCW1faURhdGFTaXplOw0KKyAgICBGWF9JTlQzMgkJCQltX2lEYXRhTGVuZ3RoOw0KKyAgICBGWF9JTlQzMgkJCQltX2lFbnRpdHlTdGFydDsNCisgICAgRlhfSU5UMzIJCQkJbV9pRGF0YVBvczsNCisgICAgRlhfTFBCWVRFCQkJCW1fcHN6TmFtZTsNCisgICAgRlhfSU5UMzIJCQkJbV9pTmFtZVNpemU7DQorICAgIEZYX0lOVDMyCQkJCW1faU5hbWVMZW5ndGg7DQorICAgIEZYX0RXT1JECQkJCW1fZHdQYXJzZU1vZGU7DQorICAgIENGWF9TQVhDb21tZW50Q29udGV4dAkqbV9wQ29tbWVudENvbnRleHQ7DQorICAgIHZvaWQJCVJlc2V0KCk7DQorICAgIHZvaWQJCVB1c2goKTsNCisgICAgdm9pZAkJUG9wKCk7DQorICAgIEZYX0JPT0wJCVNraXBTcGFjZShGWF9CWVRFIGNoKTsNCisgICAgdm9pZAkJU2tpcE5vZGUoKTsNCisgICAgdm9pZAkJTm90aWZ5RGF0YSgpOw0KKyAgICB2b2lkCQlOb3RpZnlFbnRlcigpOw0KKyAgICB2b2lkCQlOb3RpZnlBdHRyaWJ1dGUoKTsNCisgICAgdm9pZAkJTm90aWZ5QnJlYWsoKTsNCisgICAgdm9pZAkJTm90aWZ5Q2xvc2UoKTsNCisgICAgdm9pZAkJTm90aWZ5RW5kKCk7DQorICAgIHZvaWQJCU5vdGlmeVRhcmdldERhdGEoKTsNCisgICAgdm9pZAkJUmVhbGxvY0RhdGFCdWZmZXIoKTsNCisgICAgdm9pZAkJUmVhbGxvY05hbWVCdWZmZXIoKTsNCisgICAgdm9pZAkJUGFyc2VDaGFyKEZYX0JZVEUgY2gpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mb3hpdGxpYi5oIGIveGZhL3NyYy9mb3hpdGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MGMwNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZveGl0bGliLmgKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmCV9GT1hJVF9MSUJfSF8NCisjZGVmaW5lIF9GT1hJVF9MSUJfSF8NCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9mb3hpdHhmYS5oIg0KKyNpbmNsdWRlICIuL2ZnYXMvaW5jbHVkZS9mZ2FzLmgiDQorI2luY2x1ZGUgIi4vZmRwL2luY2x1ZGUvZmRlLmgiDQorI2luY2x1ZGUgIi4vZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaCINCisjaW5jbHVkZSAiLi9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaCINCisjaW5jbHVkZSAiLi9mZWUvaW5jbHVkZS9meF93b3JkYnJlYWsuaCINCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfYmFyY29kZWltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfYmFyY29kZWltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMTQxYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlaW1wLmNwcApAQCAtMCwwICsxLDI0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2VkaXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfYmFyY29kZWltcC5oIg0KK0lGV0xfQmFyY29kZSogSUZXTF9CYXJjb2RlOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX0JhcmNvZGU7DQorfQ0KK0lGV0xfQmFyY29kZTo6SUZXTF9CYXJjb2RlKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0JhcmNvZGU6On5JRldMX0JhcmNvZGUoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBJRldMX0JhcmNvZGU6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9CYXJjb2RlSW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9CYXJjb2RlOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9CYXJjb2RlSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK3ZvaWQJSUZXTF9CYXJjb2RlOjpTZXRUeXBlKEJDX1RZUEUgdHlwZSkNCit7DQorICAgICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+U2V0VHlwZSh0eXBlKTsNCit9DQorRlhfQk9PTAlJRldMX0JhcmNvZGU6OklzUHJvdGVjdGVkVHlwZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5Jc1Byb3RlY3RlZFR5cGUoKTsNCit9DQorQ0ZXTF9CYXJjb2RlSW1wOjpDRldMX0JhcmNvZGVJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9FZGl0SW1wKHBPdXRlcikNCisgICAgLCBtX3BCYXJjb2RlRW5naW5lKE5VTEwpDQorICAgICwgbV9kd1N0YXR1cygwKQ0KKyAgICAsIG1fdHlwZShCQ19VTktOT1dOKQ0KK3sNCit9DQorQ0ZXTF9CYXJjb2RlSW1wOjpDRldMX0JhcmNvZGVJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX0VkaXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fcEJhcmNvZGVFbmdpbmUoTlVMTCkNCisgICAgLCBtX2R3U3RhdHVzKDApDQorICAgICwgbV90eXBlKEJDX1VOS05PV04pDQorew0KK30NCitDRldMX0JhcmNvZGVJbXA6On5DRldMX0JhcmNvZGVJbXAoKQ0KK3sNCisgICAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCit9DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCit7DQorICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfQmFyY29kZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0JhcmNvZGVJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfQmFyY29kZTsNCit9DQorRldMX0VSUglDRldMX0JhcmNvZGVJbXA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgaWYgKCFtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopIEZYX05FVyBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgICAgfQ0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0VkaXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfQmFyY29kZUltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfQmFyY29kZUltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICBSZWxlYXNlQmFyY29kZUVuZ2luZSgpOw0KKyAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfQmFyY29kZUltcDo6VXBkYXRlKCkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIEZXTF9FUlIgcmV0ID0gQ0ZXTF9FZGl0SW1wOjpVcGRhdGUoKTsNCisgICAgR2VuZXJhdGVCYXJjb2RlSW1hZ2VDYWNoZSgpOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfQmFyY29kZUltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICAgICAgR2VuZXJhdGVCYXJjb2RlSW1hZ2VDYWNoZSgpOw0KKyAgICAgICAgaWYgKCFtX3BCYXJjb2RlRW5naW5lIHx8IChtX2R3U3RhdHVzICYgWEZBX0JDU19FbmNvZGVTdWNjZXNzKSA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICAgIG10LmUgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICBtdC5mID0gbV9ydENsaWVudC50b3A7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBlcnJvckNvZGUgPSAwOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BCYXJjb2RlRW5naW5lLT5SZW5kZXJEZXZpY2UocEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKSwgcE1hdHJpeCwgZXJyb3JDb2RlKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpHZW5lcmF0ZUJhcmNvZGVJbWFnZUNhY2hlKCkNCit7DQorICAgIGlmICgobV9kd1N0YXR1cyAmIFhGQV9CQ1NfTmVlZFVwZGF0ZSkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fZHdTdGF0dXMgPSAwOzsNCisgICAgQ3JlYXRlQmFyY29kZUVuZ2luZSgpOw0KKyAgICBJRldMX0JhcmNvZGVEUCAqcERhdGEgPSAoSUZXTF9CYXJjb2RlRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRGF0YSk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wQmFyY29kZUVuZ2luZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChHZXRUZXh0KHdzVGV4dCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgICBwYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9Gb250KTsNCisgICAgQ0ZYX0ZvbnQqIHBDWEZvbnQgPSAoQ0ZYX0ZvbnQqKShwRm9udCA/IHBGb250LT5HZXREZXZGb250KCkgOiBOVUxMKTsNCisgICAgaWYocENYRm9udCkgew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Rm9udChwQ1hGb250KTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCogcEZvbnRTaXplID0gKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUpOw0KKyAgICBpZihwRm9udFNpemUpIHsNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldEZvbnRTaXplKCpwRm9udFNpemUpOw0KKyAgICB9DQorICAgIEZYX0FSR0IqIHBGb250Q29sb3IgPSAoRlhfQVJHQiopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX1RleHRDb2xvcik7DQorICAgIGlmKHBGb250Q29sb3IpIHsNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldEZvbnRDb2xvcigqcEZvbnRDb2xvcik7DQorICAgIH0NCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0SGVpZ2h0KEZYX0lOVDMyKG1fcnRDbGllbnQuaGVpZ2h0KSk7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFdpZHRoKEZYX0lOVDMyKG1fcnRDbGllbnQud2lkdGgpKTsNCisgICAgRlhfRFdPUkQgZHdBdHRyaWJ1dGVNYXNrID0gcERhdGEtPkdldEJhcmNvZGVBdHRyaWJ1dGVNYXNrKCk7DQorICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0NIQVJFTkNPRElORykJew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Q2hhckVuY29kaW5nCQkJKHBEYXRhLT5HZXRDaGFyRW5jb2RpbmcoKSk7DQorICAgIH0NCisgICAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFSEVJR0hUKQl7DQorICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRNb2R1bGVIZWlnaHQJCQkocERhdGEtPkdldE1vZHVsZUhlaWdodCgpKTsNCisgICAgfQ0KKyAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSCkgew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0TW9kdWxlV2lkdGgJCQkocERhdGEtPkdldE1vZHVsZVdpZHRoKCkpOw0KKyAgICB9DQorICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0RBVEFMRU5HVEgpIHsNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldERhdGFMZW5ndGgJCQkJKHBEYXRhLT5HZXREYXRhTGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0NBTENIRUNLU1VNKSB7DQorICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRDYWxDaGVja3N1bQkJCShwRGF0YS0+R2V0Q2FsQ2hlY2tzdW0oKSk7DQorICAgIH0NCisgICAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTSkJew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0UHJpbnRDaGVja3N1bQkJCShwRGF0YS0+R2V0UHJpbnRDaGVja3N1bSgpKTsNCisgICAgfQ0KKyAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9URVhUTE9DQVRJT04pCXsNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFRleHRMb2NhdGlvbgkJCShwRGF0YS0+R2V0VGV4dExvY2F0aW9uKCkpOw0KKyAgICB9DQorICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1dJREVOQVJST1dSQVRJTykJew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0V2lkZU5hcnJvd1JhdGlvCQkocERhdGEtPkdldFdpZGVOYXJyb3dSYXRpbygpKTsNCisgICAgfQ0KKyAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVIpIHsNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFN0YXJ0Q2hhcgkJCQkocERhdGEtPkdldFN0YXJ0Q2hhcigpKTsNCisgICAgfQ0KKyAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9FTkRDSEFSKSB7DQorICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFbmRDaGFyCQkJCShwRGF0YS0+R2V0RW5kQ2hhcigpKTsNCisgICAgfQ0KKyAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9WRVJTSU9OKSB7DQorICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRWZXJzaW9uCQkJCShwRGF0YS0+R2V0VmVyc2lvbigpKTsNCisgICAgfQ0KKyAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9FQ0xFVkVMKSB7DQorICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbAkocERhdGEtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkpOw0KKyAgICB9DQorICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1RSVU5DQVRFRCkgew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0VHJ1bmNhdGVkCQkJCShwRGF0YS0+R2V0VHJ1bmNhdGVkKCkpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGVycm9yQ29kZSA9IDA7DQorICAgIG1fZHdTdGF0dXMgPSBtX3BCYXJjb2RlRW5naW5lLT5FbmNvZGUod3NUZXh0LCBUUlVFLCBlcnJvckNvZGUpID8gWEZBX0JDU19FbmNvZGVTdWNjZXNzIDogMDsNCit9DQordm9pZCBDRldMX0JhcmNvZGVJbXA6OkNyZWF0ZUJhcmNvZGVFbmdpbmUoKQ0KK3sNCisgICAgaWYgKChtX3BCYXJjb2RlRW5naW5lID09IE5VTEwpICYmIChtX3R5cGUgIT0gQkNfVU5LTk9XTikpIHsNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUgPSBGWF9CYXJjb2RlX0NyZWF0ZShtX3R5cGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpSZWxlYXNlQmFyY29kZUVuZ2luZSgpDQorew0KKyAgICBpZiAobV9wQmFyY29kZUVuZ2luZSkgew0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wQmFyY29kZUVuZ2luZSA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDRldMX0JhcmNvZGVJbXA6OlNldFR5cGUoQkNfVFlQRSB0eXBlKQ0KK3sNCisgICAgaWYgKG1fdHlwZSA9PSB0eXBlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCisgICAgbV90eXBlID0gdHlwZTsNCisgICAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsNCit9DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCit7DQorICAgIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICAgIG1fZHdTdGF0dXMgPSBYRkFfQkNTX05lZWRVcGRhdGU7DQorICAgIHJldHVybiBDRldMX0VkaXRJbXA6OlNldFRleHQod3NUZXh0KTsNCit9DQorRlhfQk9PTCBDRldMX0JhcmNvZGVJbXA6OklzUHJvdGVjdGVkVHlwZSgpDQorew0KKyAgICBpZiAoIW1fcEJhcmNvZGVFbmdpbmUpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIEJDX1RZUEUgdEVuZ2luZVR5cGUgPSBtX3BCYXJjb2RlRW5naW5lLT5HZXRUeXBlKCk7DQorICAgIGlmICh0RW5naW5lVHlwZSA9PSBCQ19RUl9DT0RFIHx8IHRFbmdpbmVUeXBlID09IEJDX1BERjQxNyB8fCB0RW5naW5lVHlwZSA9PSBCQ19EQVRBTUFUUklYKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NGV0xfQmFyY29kZUltcERlbGVnYXRlOjpDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZShDRldMX0JhcmNvZGVJbXAgKnBPd25lcikNCisgICAgOiBDRldMX0VkaXRJbXBEZWxlZ2F0ZShwT3duZXIpDQorew0KK30NCitGV0xfRVJSCUNGV0xfQmFyY29kZUltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGR3RmxhZyA9PSBGV0xfRVZUSEFTSF9FRFRfVGV4dENoYW5nZWQpIHsNCisgICAgICAgIENGV0xfQmFyY29kZUltcCogcE93bmVyID0gKENGV0xfQmFyY29kZUltcCopbV9wT3duZXI7DQorICAgICAgICBwT3duZXItPlJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICAgICAgICBwT3duZXItPm1fZHdTdGF0dXMgPSBYRkFfQkNTX05lZWRVcGRhdGU7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2FyZXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NhcmV0aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM3ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NhcmV0aW1wLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2NhcmV0aW1wLmgiDQorSUZXTF9DYXJldCogSUZXTF9DYXJldDo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBuZXcgSUZXTF9DYXJldDsNCit9DQorSUZXTF9DYXJldDo6SUZXTF9DYXJldCgpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9DYXJldDo6fklGV0xfQ2FyZXQoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9DYXJldEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgSUZXTF9DYXJldDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NhcmV0SW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX0NhcmV0OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DYXJldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9DYXJldDo6U2hvd0NhcmV0KEZYX0JPT0wgYkZsYWcpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NhcmV0SW1wKiltX3BEYXRhKS0+U2hvd0NhcmV0KGJGbGFnKTsNCit9DQorRldMX0VSUiBJRldMX0NhcmV0OjpHZXRGcmVxdWVuY3koRlhfRFdPUkQgJmVsYXBzZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5HZXRGcmVxdWVuY3koZWxhcHNlKTsNCit9DQorRldMX0VSUiBJRldMX0NhcmV0OjpTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPlNldEZyZXF1ZW5jeShlbGFwc2UpOw0KK30NCitGV0xfRVJSIElGV0xfQ2FyZXQ6OlNldENvbG9yKENGWF9Db2xvciBjckZpbGwpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NhcmV0SW1wKiltX3BEYXRhKS0+U2V0Q29sb3IoY3JGaWxsKTsNCit9DQorQ0ZXTF9DYXJldEltcDo6Q0ZXTF9DYXJldEltcChJRldMX1dpZGdldCAqcE91dGVyKQ0KKyAgICA6IG1faFRpbWVyKE5VTEwpDQorew0KKyAgICBtX2R3RWxhcHNlID0gNDAwOw0KKyAgICBtX3BUaW1lciA9IEZYX05FVyBDRldMX0NhcmV0VGltZXIodGhpcyk7DQorICAgIG1fYlNldENvbG9yID0gRkFMU0U7DQorICAgIFNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOw0KK30NCitDRldMX0NhcmV0SW1wOjpDRldMX0NhcmV0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcik6IG1faFRpbWVyKE5VTEwpDQorew0KKyAgICBtX2R3RWxhcHNlID0gNDAwOw0KKyAgICBtX3BUaW1lciA9IEZYX05FVyBDRldMX0NhcmV0VGltZXIodGhpcyk7DQorICAgIG1fYlNldENvbG9yID0gRkFMU0U7DQorICAgIFNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOw0KK30NCitDRldMX0NhcmV0SW1wOjp+Q0ZXTF9DYXJldEltcCgpDQorew0KKyAgICBpZiAobV9wVGltZXIpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BUaW1lcjsNCisgICAgICAgIG1fcFRpbWVyID0gTlVMTDsNCisgICAgfQ0KK30NCitGV0xfRVJSCUNGV0xfQ2FyZXRJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCit7DQorICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfQ2FyZXQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9DYXJldEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9DYXJldDsNCit9DQorRldMX0VSUglDRldMX0NhcmV0SW1wOjpJbml0aWFsaXplKCkNCit7DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9DYXJldEltcERlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DYXJldEltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKG1faFRpbWVyKSB7DQorICAgICAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgICAgICAgIG1faFRpbWVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9DYXJldEltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DYXJldEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICB9DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgRHJhd0NhcmV0QksocEdyYXBoaWNzLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBwTWF0cml4KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfQ2FyZXRJbXA6OlNob3dDYXJldChGWF9CT09MIGJGbGFnKQ0KK3sNCisgICAgaWYgKG1faFRpbWVyKSB7DQorICAgICAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgICAgICAgIG1faFRpbWVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoYkZsYWcpIHsNCisgICAgICAgIG1faFRpbWVyID0gRldMX1N0YXJ0VGltZXIoKElGV0xfVGltZXIgKiltX3BUaW1lciwgbV9kd0VsYXBzZSk7DQorICAgIH0NCisgICAgcmV0dXJuIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkZsYWcpOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkdldEZyZXF1ZW5jeShGWF9EV09SRCAmZWxhcHNlKQ0KK3sNCisgICAgZWxhcHNlID0gbV9kd0VsYXBzZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpDQorew0KKyAgICBtX2R3RWxhcHNlID0gZWxhcHNlOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkNCit7DQorICAgIG1fYlNldENvbG9yID0gVFJVRTsNCisgICAgbV9jckZpbGwgPSBjckZpbGw7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBDRldMX0NhcmV0SW1wOjpEcmF3Q2FyZXRCSyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgR2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgcmVjdC5TZXQoMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSByZWN0Ow0KKyAgICBpZiAobV9iU2V0Q29sb3IpIHsNCisgICAgICAgIHBhcmFtLm1fcERhdGEgPSAgJm1fY3JGaWxsOw0KKyAgICB9DQorICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NBVF9CYWNrZ3JvdW5kOw0KKyAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DQVRfSGlnaHRMaWdodDsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfQ2FyZXRJbXA6OkNGV0xfQ2FyZXRUaW1lcjo6Q0ZXTF9DYXJldFRpbWVyKENGV0xfQ2FyZXRJbXAgKm1fcENhcmV0KQ0KK3sNCisgICAgdGhpcy0+bV9wQ2FyZXQgPSBtX3BDYXJldDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9DYXJldEltcDo6Q0ZXTF9DYXJldFRpbWVyOjpSdW4oRldMX0hUSU1FUiBoVGltZXIpDQorew0KKyAgICBpZiAobV9wQ2FyZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0KSB7DQorICAgICAgICBtX3BDYXJldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wQ2FyZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydDsNCisgICAgbV9wQ2FyZXQtPkdldFdpZGdldFJlY3QocnQpOw0KKyAgICBydC5TZXQoMCwgMCwgcnQud2lkdGggKyAxLCBydC5oZWlnaHQpOw0KKyAgICBtX3BDYXJldC0+UmVwYWludCgmcnQpOw0KKyAgICByZXR1cm4gMTsNCit9DQorQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpDRldMX0NhcmV0SW1wRGVsZWdhdGUoQ0ZXTF9DYXJldEltcCAqcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ2FyZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzMTFiMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveGltcC5jcHAKQEAgLTAsMCArMSw2MDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9jaGVja2JveGltcC5oIg0KKyNkZWZpbmUgRldMX0NLQl9DYXB0aW9uTWFyZ2luCTUNCitJRldMX0NoZWNrQm94KiBJRldMX0NoZWNrQm94OjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX0NoZWNrQm94Ow0KK30NCitJRldMX0NoZWNrQm94OjpJRldMX0NoZWNrQm94KCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0NoZWNrQm94Ojp+SUZXTF9DaGVja0JveCgpDQorew0KKyAgICBpZiAobV9wRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBJRldMX0NoZWNrQm94OjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ2hlY2tCb3hJbXAocE91dGVyKTsNCisgICAgKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfQ2hlY2tCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NoZWNrQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRlhfSU5UMzIgSUZXTF9DaGVja0JveDo6R2V0Q2hlY2tTdGF0ZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+R2V0Q2hlY2tTdGF0ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfQ2hlY2tCb3g6OlNldENoZWNrU3RhdGUoRlhfSU5UMzIgaUNoZWNrKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPlNldENoZWNrU3RhdGUoaUNoZWNrKTsNCit9DQorSUZXTF9SYWRpb0J1dHRvbiogSUZXTF9SYWRpb0J1dHRvbjo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBuZXcgSUZXTF9SYWRpb0J1dHRvbjsNCit9DQorSUZXTF9SYWRpb0J1dHRvbjo6SUZXTF9SYWRpb0J1dHRvbigpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9SYWRpb0J1dHRvbjo6fklGV0xfUmFkaW9CdXR0b24oKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgSUZXTF9SYWRpb0J1dHRvbjo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NoZWNrQm94SW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX1JhZGlvQnV0dG9uOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DaGVja0JveEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0NGV0xfQ2hlY2tCb3hJbXA6OkNGV0xfQ2hlY2tCb3hJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fZHdUVE9TdHlsZXMoRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpDQorICAgICwgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpDQorICAgICwgbV9iQnRuRG93bihGQUxTRSkNCit7DQorICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgICAgbV9ydEJveC5SZXNldCgpOw0KKyAgICBtX3J0Q2FwdGlvbi5SZXNldCgpOw0KKyAgICBtX3J0Rm9jdXMuUmVzZXQoKTsNCit9DQorQ0ZXTF9DaGVja0JveEltcDo6Q0ZXTF9DaGVja0JveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCisgICAgLCBtX2R3VFRPU3R5bGVzKEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKQ0KKyAgICAsIG1faVRUT0FsaWduKEZERV9UVE9BTElHTk1FTlRfQ2VudGVyKQ0KKyAgICAsIG1fYkJ0bkRvd24oRkFMU0UpDQorew0KKyAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICAgIG1fcnRCb3guUmVzZXQoKTsNCisgICAgbV9ydENhcHRpb24uUmVzZXQoKTsNCisgICAgbV9ydEZvY3VzLlJlc2V0KCk7DQorfQ0KK0NGV0xfQ2hlY2tCb3hJbXA6On5DRldMX0NoZWNrQm94SW1wKCkNCit7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbikgPyBGV0xfQ0xBU1NfUmFkaW9CdXR0b24gOiBGV0xfQ0xBU1NfQ2hlY2tCb3g7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9DaGVja0JveEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfUmFkaW9CdXR0b24gPyBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uIDogRldMX0NMQVNTSEFTSF9DaGVja0JveDsNCit9DQorRldMX0VSUglDRldMX0NoZWNrQm94SW1wOjpJbml0aWFsaXplKCkNCit7DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DaGVja0JveEltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0NoZWNrQm94SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KK3sNCisgICAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICAgICAgcmVjdC5TZXQoMCwgMCwgMCwgMCk7DQorICAgICAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgICAgIH0NCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uOw0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgICAgICAgIGlmICh3c0NhcHRpb24uR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKHdzQ2FwdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfTXVsdGlMaW5lKTsNCisgICAgICAgICAgICByZWN0LlNldCgwLCAwLCBzei54LCBzei55KTsNCisgICAgICAgIH0NCisgICAgICAgIHJlY3QuSW5mbGF0ZShGV0xfQ0tCX0NhcHRpb25NYXJnaW4sIEZXTF9DS0JfQ2FwdGlvbk1hcmdpbik7DQorICAgICAgICBJRldMX0NoZWNrQm94RFAgKnBEYXRhID0gKElGV0xfQ2hlY2tCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgRlhfRkxPQVQgZkNoZWNrQm94ID0gcERhdGEtPkdldEJveFNpemUobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIHJlY3Qud2lkdGggKz0gZkNoZWNrQm94Ow0KKyAgICAgICAgaWYgKHJlY3QuaGVpZ2h0IDwgZkNoZWNrQm94KSB7DQorICAgICAgICAgICAgcmVjdC5oZWlnaHQgPSBmQ2hlY2tCb3g7DQorICAgICAgICB9DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpVcGRhdGUoKQ0KK3sNCisgICAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICAgIExheW91dCgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX0NLQl9Cb3JkZXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfQ0tCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZHdTdGF0ZXMgPSBHZXRQYXJ0U3RhdGVzKCk7DQorICAgIHsNCisgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NLQl9CYWNrZ3JvdW5kOw0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGR3U3RhdGVzOw0KKyAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgICAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Rm9jdXM7DQorICAgICAgICB9DQorICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ0tCX0NoZWNrQm94Ow0KKyAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Qm94Ow0KKyAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXItPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgICAgICAgRlhfSU5UMzIgaUxlbiA9IHdzQ2FwdGlvbi5HZXRMZW5ndGgoKTsNCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaUxlbiA+IDAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgICAgICBDRldMX1RoZW1lVGV4dCB0ZXh0UGFyYW07DQorICAgICAgICB0ZXh0UGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgdGV4dFBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DS0JfQ2FwdGlvbjsNCisgICAgICAgIHRleHRQYXJhbS5tX2R3U3RhdGVzID0gZHdTdGF0ZXM7DQorICAgICAgICB0ZXh0UGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgICAgICBpZihwTWF0cml4KSB7DQorICAgICAgICAgICAgdGV4dFBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICB0ZXh0UGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgICAgICAgIHRleHRQYXJhbS5tX3dzVGV4dCA9IHdzQ2FwdGlvbjsNCisgICAgICAgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gbV9kd1RUT1N0eWxlczsNCisgICAgICAgIHRleHRQYXJhbS5tX2lUVE9BbGlnbiA9IG1faVRUT0FsaWduOw0KKyAgICAgICAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ2hlY2tCb3hJbXA6OkdldENoZWNrU3RhdGUoKQ0KK3sNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl8zU3RhdGUpDQorICAgICAgICAgICAgJiYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09IEZXTF9TVEFURV9DS0JfTmV1dHJhbCkpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3hJbXA6OlNldENoZWNrU3RhdGUoRlhfSU5UMzIgaUNoZWNrKQ0KK3sNCisgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9DaGVja01hc2s7DQorICAgIHN3aXRjaChpQ2hlY2spIHsNCisgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIDE6IHsNCisgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgMjogew0KKyAgICAgICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfTmV1dHJhbDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcDo6TGF5b3V0KCkNCit7DQorICAgIEZYX0lOVDMyIHdpZHRoID0gRlhfSU5UMzIobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCArIDAuNWYpOw0KKyAgICBGWF9JTlQzMiBoZWlnaHQgPSBGWF9JTlQzMihtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCArIDAuNWYpOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoID0gKEZYX0ZMT0FUKXdpZHRoOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCA9IChGWF9GTE9BVCloZWlnaHQ7DQorICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICAgIEZYX0ZMT0FUIGZCb3hUb3AgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgRlhfRkxPQVQgZkJveExlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgIEZYX0ZMT0FUIGZUZXh0TGVmdCA9IDAuMCwgZlRleHRSaWdodCA9IDAuMDsNCisgICAgRlhfRkxPQVQgZkNsaWVudFJpZ2h0ID0gbV9ydENsaWVudC5yaWdodCgpOw0KKyAgICBGWF9GTE9BVCBmQ2xpZW50Qm90dG9tID0gbV9ydENsaWVudC5ib3R0b20oKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBJRldMX0NoZWNrQm94RFAgKnBEYXRhID0gKElGV0xfQ2hlY2tCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9GTE9BVCBmQ2hlY2tCb3ggPSBwRGF0YS0+R2V0Qm94U2l6ZShtX3BJbnRlcmZhY2UpOw0KKyAgICBzd2l0Y2ggKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX1ZMYXlvdXRNYXNrKSB7DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfVG9wOiB7DQorICAgICAgICAgICAgICAgIGZCb3hUb3AgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KKyAgICAgICAgICAgICAgICBmQm94VG9wID0gZkNsaWVudEJvdHRvbSAtIGZDaGVja0JveDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXI6DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIGZCb3hUb3AgPSBtX3J0Q2xpZW50LnRvcCArIChtX3J0Q2xpZW50LmhlaWdodCAtIGZDaGVja0JveCkgLyAyOw0KKyAgICAgICAgICAgICAgICBmQm94VG9wID0gRlhTWVNfZmxvb3IoZkJveFRvcCk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9MZWZ0VGV4dCkgew0KKyAgICAgICAgZkJveExlZnQgPSBmQ2xpZW50UmlnaHQgLSBmQ2hlY2tCb3g7DQorICAgICAgICBmVGV4dExlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICBmVGV4dFJpZ2h0ID0gZkJveExlZnQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmVGV4dExlZnQgPSBmQm94TGVmdCArIGZDaGVja0JveDsNCisgICAgICAgIGZUZXh0UmlnaHQgPSBmQ2xpZW50UmlnaHQ7DQorICAgIH0NCisgICAgbV9ydEJveC5TZXQoZkJveExlZnQsIGZCb3hUb3AsIGZDaGVja0JveCwgZkNoZWNrQm94KTsNCisgICAgbV9ydENhcHRpb24uU2V0KGZUZXh0TGVmdCwgbV9ydENsaWVudC50b3AsIGZUZXh0UmlnaHQgLSBmVGV4dExlZnQsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgbV9ydENhcHRpb24uSW5mbGF0ZSgtRldMX0NLQl9DYXB0aW9uTWFyZ2luLCAtRldMX0NLQl9DYXB0aW9uTWFyZ2luKTsNCisgICAgQ0ZYX1JlY3RGIHJ0Rm9jdXM7DQorICAgIHJ0Rm9jdXMuU2V0KG1fcnRDYXB0aW9uLmxlZnQsIG1fcnRDYXB0aW9uLnRvcCwgbV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgICAgaWYgKHdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIG1fcnRGb2N1cy5TZXQoMCwgMCwgMCwgMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDYWxjVGV4dFJlY3Qod3NDYXB0aW9uLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBtX2R3VFRPU3R5bGVzLCBtX2lUVE9BbGlnbiwgcnRGb2N1cyk7DQorICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX011bHRpTGluZSkgPT0gMCkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IEZYX01BWChtX3J0Q2FwdGlvbi53aWR0aCwgcnRGb2N1cy53aWR0aCk7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IEZYX01JTihtX3J0Q2FwdGlvbi5oZWlnaHQsIHJ0Rm9jdXMuaGVpZ2h0KTsNCisgICAgICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IG1fcnRDYXB0aW9uLmxlZnQ7DQorICAgICAgICAgICAgRlhfRkxPQVQgZlRvcCA9IG1fcnRDYXB0aW9uLnRvcDsNCisgICAgICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX0hMYXlvdXRNYXNrKSA9PSBGV0xfU1RZTEVFWFRfQ0tCX0NlbnRlcikgew0KKyAgICAgICAgICAgICAgICBmTGVmdCA9IG1fcnRDYXB0aW9uLmxlZnQgKyAobV9ydENhcHRpb24ud2lkdGggLSBmV2lkdGgpIC8gMjsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9ITGF5b3V0TWFzaykgPT0gRldMX1NUWUxFRVhUX0NLQl9SaWdodCkgew0KKyAgICAgICAgICAgICAgICBmTGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfVkxheW91dE1hc2spID09IEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcikgew0KKyAgICAgICAgICAgICAgICBmVG9wID0gbV9ydENhcHRpb24udG9wICsgKG1fcnRDYXB0aW9uLmhlaWdodCAtIGZIZWlnaHQpIC8gMjsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykgPT0gRldMX1NUWUxFRVhUX0NLQl9Cb3R0b20pIHsNCisgICAgICAgICAgICAgICAgZlRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkhlaWdodDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9ydEZvY3VzLlNldChmTGVmdCwgZlRvcCwgZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9ydEZvY3VzLlNldChydEZvY3VzLmxlZnQsIHJ0Rm9jdXMudG9wLCBydEZvY3VzLndpZHRoLCBydEZvY3VzLmhlaWdodCk7DQorICAgICAgICB9DQorICAgICAgICBtX3J0Rm9jdXMuSW5mbGF0ZSgxLCAxKTsNCisgICAgfQ0KK30NCitGWF9EV09SRCBDRldMX0NoZWNrQm94SW1wOjpHZXRQYXJ0U3RhdGVzKCkNCit7DQorICAgIEZYX0lOVDMyIGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DS0JfVW5DaGVja2VkOw0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9OZXV0cmFsKSB7DQorICAgICAgICBkd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWw7DQorICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgICAgICBkd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ0tCX0NoZWNrZWQ7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkOw0KKyAgICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQgKSB7DQorICAgICAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQgKSB7DQorICAgICAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfTm9ybWFsOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX0ZvY3VzZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIGR3U3RhdGVzOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXA6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKQ0KK3sNCisgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgICAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgKEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2sgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZMYXlvdXRNYXNrKSkgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnQgfCBGV0xfU1RZTEVFWFRfQ0tCX1RvcDogew0KKyAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9DS0JfVG9wOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9DS0JfVG9wOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnQgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXI6IHsNCisgICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXI6IHsNCisgICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnQgfCBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KKyAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21DZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21SaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX2R3VFRPU3R5bGVzID0gMDsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfUlRMUmVhZGluZykgew0KKyAgICAgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfUlRMOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9NdWx0aUxpbmUpIHsNCisgICAgICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXA6Ok5leHRTdGF0ZXMoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdGaXJzdHN0YXRlID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX1JhZGlvQnV0dG9uKSB7DQorICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9VbmNoZWNrZWQpIHsNCisgICAgICAgICAgICBJRldMX1dpZGdldE1nciAqcFdNZ3IgPSBGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgICAgICAgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqIClwV01ncjsNCisgICAgICAgICAgICBpZiAoIXBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5IHJhZGlvYXJyOw0KKyAgICAgICAgICAgICAgICBwV2lkZ2V0TWdyLT5HZXRTYW1lR3JvdXBSYWRpb0J1dHRvbihtX3BJbnRlcmZhY2UsIHJhZGlvYXJyKTsNCisgICAgICAgICAgICAgICAgSUZXTF9DaGVja0JveCAqcENoZWNrQm94ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gcmFkaW9hcnIuR2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIHBDaGVja0JveCA9IChJRldMX0NoZWNrQm94ICopcmFkaW9hcnJbaV07DQorICAgICAgICAgICAgICAgICAgICBpZiAocENoZWNrQm94ICE9IG1fcEludGVyZmFjZSAmJiBwQ2hlY2tCb3gtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrQm94LT5TZXRDaGVja1N0YXRlKDApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2tCb3gtPkdldFdpZGdldFJlY3QocnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0LmxlZnQgPSBydC50b3AgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFdpZGdldE1nci0+UmVwYWludFdpZGdldChwQ2hlY2tCb3gsICZydCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQ7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9OZXV0cmFsKSB7DQorICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9DaGVja01hc2s7DQorICAgICAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSkgew0KKyAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfQ2hlY2tlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09IEZXTF9TVEFURV9DS0JfQ2hlY2tlZCkgew0KKyAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQorICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9OZXV0cmFsOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9DaGVja2VkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCisgICAgRlhfRFdPUkQgZHdMYXN0c3RhdGUgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgICBpZiAoZHdGaXJzdHN0YXRlICE9IGR3TGFzdHN0YXRlKSB7DQorICAgICAgICBDRldMX0V2dENrYkNoZWNrU3RhdGVDaGFuZ2VkIHdtQ2hlY2tCb3hTdGF0ZTsNCisgICAgICAgIHdtQ2hlY2tCb3hTdGF0ZS5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBEaXNwYXRjaEV2ZW50KCZ3bUNoZWNrQm94U3RhdGUpOw0KKyAgICB9DQorfQ0KK0NGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9DaGVja0JveEltcERlbGVnYXRlKENGV0xfQ2hlY2tCb3hJbXAgKnBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpDQorew0KK30NCitGWF9JTlQzMiBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9JTlQzMiBpUmV0ID0gMTsNCisgICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICAgICAgICAgICAgT25BY3RpdmF0ZShwTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgICAgICAgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgICAgICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgICAgICAgICAgICBDRldMX01zZ0tleSAqcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICAgICAgICAgICAgICAgICAgT25LZXlEb3duKChDRldMX01zZ0tleSopcEtleSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSCUNGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkFjdGl2YXRlKENGV0xfTWVzc2FnZSAqcE1zZykNCit7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRDbGllbnQpKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIGlmIChiU2V0KSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0Q2xpZW50KSk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRGb2N1cyhUUlVFKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9iQnRuRG93biA9IFRSVUU7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH4gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRDbGllbnQpKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAoIW1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCisgICAgaWYgKCFtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfSG92ZXJlZDsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgbV9wT3duZXItPk5leHRTdGF0ZXMoKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICAgIGlmIChtX3BPd25lci0+bV9iQnRuRG93bikgew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfUHJlc3NlZCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkpIHsNCisgICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9QcmVzc2VkKSB7DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfSG92ZXJlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9Ib3ZlcmVkKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYlJlcGFpbnQpIHsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRCb3gpKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fYkJ0bkRvd24pIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfSG92ZXJlZDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQorICAgIH0NCisgICAgbV9wT3duZXItPlJlcGFpbnQoJihtX3BPd25lci0+bV9ydEJveCkpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25LZXlEb3duKENGV0xfTXNnS2V5ICpwTXNnKQ0KK3sNCisgICAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgew0KKyAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoS2V5RXZlbnQocE1zZyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1JldHVybiB8fCBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9TcGFjZSkgew0KKyAgICAgICAgbV9wT3duZXItPk5leHRTdGF0ZXMoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY29tYm9ib3hpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjAwZjkyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94aW1wLmNwcApAQCAtMCwwICsxLDE5OTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uLy4uL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oIg0KKyNpbmNsdWRlICIuLi8uLi9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9lZGl0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2xpc3Rib3hpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfZm9ybXByb3h5aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2NvbWJvYm94aW1wLmgiDQorSUZXTF9Db21ib0JveCogSUZXTF9Db21ib0JveDo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBuZXcgSUZXTF9Db21ib0JveDsNCit9DQorSUZXTF9Db21ib0JveDo6SUZXTF9Db21ib0JveCgpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9Db21ib0JveDo6fklGV0xfQ29tYm9Cb3goKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgSUZXTF9Db21ib0JveDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NvbWJvQm94SW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX0NvbWJvQm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Db21ib0JveEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZYX0lOVDMyIElGV0xfQ29tYm9Cb3g6OkdldEN1clNlbCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0Q3VyU2VsKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9Db21ib0JveDo6U2V0Q3VyU2VsKEZYX0lOVDMyIGlTZWwpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+U2V0Q3VyU2VsKGlTZWwpOw0KK30NCitGV0xfRVJSCUlGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCit9DQorRlhfSU5UMzIgSUZXTF9Db21ib0JveDo6R2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldEVkaXRUZXh0TGVuZ3RoKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9Db21ib0JveDo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0RWRpdFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9Db21ib0JveDo6U2V0RWRpdFNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPlNldEVkaXRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorfQ0KK0ZYX0lOVDMyIElGV0xfQ29tYm9Cb3g6OkdldEVkaXRTZWxSYW5nZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyICZuU3RhcnQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0RWRpdFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRlhfSU5UMzIgSUZXTF9Db21ib0JveDo6R2V0RWRpdExpbWl0KCkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5HZXRFZGl0TGltaXQoKTsNCit9DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpTZXRFZGl0TGltaXQoRlhfSU5UMzIgbkxpbWl0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPlNldEVkaXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OkVkaXREb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXREb0NsaXBib2FyZChpQ21kKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0UmVkbyhGWF9CU1RSIGJzUmVjb3JkKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0VW5kbyhGWF9CU1RSIGJzUmVjb3JkKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRVbmRvKGJzUmVjb3JkKTsNCit9DQorSUZXTF9MaXN0Qm94KiAgSUZXTF9Db21ib0JveDo6R2V0TGlzdEJveHQoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldExpc3RCb3h0KCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6QWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+QWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpOw0KK30NCitGWF9FUlIgSUZXTF9Db21ib0JveDo6T3BlbkRyb3BEb3duTGlzdChGWF9CT09MIGJBY3RpdmF0ZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5PcGVuRHJvcERvd25MaXN0KGJBY3RpdmF0ZSk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdENhblVuZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdENhblJlZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdFVuZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRVbmRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdFJlZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRSZWRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdENhbkNvcHkoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5Db3B5KCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdENhbkN1dCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdENhbkN1dCgpOw0KK30NCitGWF9CT09MCUlGV0xfQ29tYm9Cb3g6OkVkaXRDYW5TZWxlY3RBbGwoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDb3B5KHdzQ29weSk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdEN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdEN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0U2VsZWN0QWxsKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0U2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdERlbGV0ZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdERlbGV0ZSgpOw0KK30NCitGWF9CT09MCUlGV0xfQ29tYm9Cb3g6OkVkaXREZVNlbGVjdCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdERlU2VsZWN0KCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9Db21ib0JveDo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0QkJveChyZWN0KTsNCit9DQorRldMX0VSUglJRldMX0NvbWJvQm94OjpFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdE1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0NGV0xfQ29tYm9FZGl0OjpDRldMX0NvbWJvRWRpdChJRldMX1dpZGdldCAqcE91dGVyKQ0KKyAgICA6IENGV0xfRWRpdEltcChwT3V0ZXIpDQorew0KKyAgICBGWFNZU19hc3NlcnQocE91dGVyICE9IE5VTEwpOw0KKyAgICBtX3BPdXRlciA9IChDRldMX0NvbWJvQm94SW1wKikoKChJRldMX1RhcmdldERhdGEqKXBPdXRlciktPkdldERhdGEoKSk7DQorfQ0KK0NGV0xfQ29tYm9FZGl0OjpDRldMX0NvbWJvRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCit7DQorICAgIEZYU1lTX2Fzc2VydChwT3V0ZXIgIT0gTlVMTCk7DQorICAgIG1fcE91dGVyID0gKENGV0xfQ29tYm9Cb3hJbXAqKSgoKElGV0xfVGFyZ2V0RGF0YSopcE91dGVyKS0+R2V0RGF0YSgpKTsNCit9DQorDQorQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTo6Q0ZXTF9Db21ib0VkaXREZWxlZ2F0ZShDRldMX0NvbWJvRWRpdCAqcE93bmVyKQ0KKyAgICA6IENGV0xfRWRpdEltcERlbGVnYXRlKHBPd25lcikNCisgICAgLCBtX3BPd25lcihwT3duZXIpDQorew0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvRWRpdERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgRlhfQk9PTCBiYWNrRGVmYXVsdCA9IFRSVUU7DQorICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICAgICAgICAgICAgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cykgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgICAgICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBpZiAoKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duKSAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3RlZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPlNldENvbWJvQm94Rm9jdXMoVFJVRSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJhY2tEZWZhdWx0KSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9FZGl0OjpDbGVhclNlbGVjdGVkKCkNCit7DQorICAgIENsZWFyU2VsZWN0aW9ucygpOw0KKyAgICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX0NvbWJvRWRpdDo6U2V0U2VsZWN0ZWQoKQ0KK3sNCisgICAgRmxhZ0ZvY3VzKFRSVUUpOw0KKyAgICBFbmRDYXJldCgpOw0KKyAgICBBZGRTZWxSYW5nZSgwKTsNCit9DQordm9pZCBDRldMX0NvbWJvRWRpdDo6RW5kQ2FyZXQoKQ0KK3sNCisgICAgbV9wRWR0RW5naW5lLT5Nb3ZlQ2FyZXRQb3MoTUNfRW5kKTsNCit9DQordm9pZCBDRldMX0NvbWJvRWRpdDo6RmxhZ0ZvY3VzKEZYX0JPT0wgYlNldCkNCit7DQorICAgIGlmIChiU2V0KSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICBTaG93Q2FyZXQoRkFMU0UpOw0KKyAgICB9DQorfTsNCit2b2lkIENGV0xfQ29tYm9FZGl0OjpTZXRDb21ib0JveEZvY3VzKEZYX0JPT0wgYlNldCkNCit7DQorICAgIG1fcE91dGVyLT5TZXRGb2N1cyhiU2V0KTsNCit9DQorQ0ZXTF9Db21ib0xpc3Q6OkNGV0xfQ29tYm9MaXN0KElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorICAgIDogQ0ZXTF9MaXN0Qm94SW1wKHBPdXRlcikNCisgICAgLCBtX2JOb3RpZnlPd25lcihUUlVFKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBPdXRlciAhPSBOVUxMKTsNCit9DQorQ0ZXTF9Db21ib0xpc3Q6OkNGV0xfQ29tYm9MaXN0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCisgICAgOiBDRldMX0xpc3RCb3hJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fYk5vdGlmeU93bmVyKFRSVUUpDQorew0KKyAgICBGWFNZU19hc3NlcnQocE91dGVyICE9IE5VTEwpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9MaXN0OjpJbml0aWFsaXplKCkNCit7DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfTGlzdEJveEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICAgIH0NCisgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfQ29tYm9MaXN0RGVsZWdhdGUodGhpcyk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvTGlzdDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0NvbWJvTGlzdERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9MaXN0Qm94SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvTGlzdDo6TWF0Y2hJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c01hdGNoKQ0KK3sNCisgICAgaWYgKHdzTWF0Y2guSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIC0xKTsNCisgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQorICAgICAgICBGWF9TVFJTSVpFIHBvcyA9IHdzVGV4dC5GaW5kKChGWF9MUENXU1RSKXdzTWF0Y2gpOw0KKyAgICAgICAgaWYgKCFwb3MpIHsNCisgICAgICAgICAgICByZXR1cm4gaTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gLTE7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3Q6OkNoYW5nZVNlbGVjdGVkKEZYX0lOVDMyIGlTZWwpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU2VsKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgcnRJbnZhbGlkYXRlLlJlc2V0KCk7DQorICAgIEZXTF9ITElTVElURU0gaE9sZCA9IEdldFNlbEl0ZW0oMCk7DQorICAgIEZYX0lOVDMyIGlPbGQgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaE9sZCk7DQorICAgIGlmIChpT2xkID09IGlTZWwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfSBlbHNlIGlmIChpT2xkID4gLTEpIHsNCisgICAgICAgIEdldEl0ZW1SZWN0KGlPbGQsIHJ0SW52YWxpZGF0ZSk7DQorICAgICAgICBTZXRTZWxJdGVtKGhPbGQsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBpZiAoaEl0ZW0pIHsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgR2V0SXRlbVJlY3QoaVNlbCwgcmVjdCk7DQorICAgICAgICBydEludmFsaWRhdGUuVW5pb24ocmVjdCk7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhTZWwgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlTZWwpOw0KKyAgICAgICAgU2V0U2VsSXRlbShoU2VsLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAoIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIFJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0xpc3Q6OkNvdW50SXRlbXMoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIDApOw0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgcmV0dXJuIHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3Q6OkdldEl0ZW1SZWN0KEZYX0lOVDMyIG5JbmRleCwgQ0ZYX1JlY3RGICZydEl0ZW0pDQorew0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbkluZGV4KTsNCisgICAgcERhdGEtPkdldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3Q6OkNsaWVudFRvT3V0ZXIoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQorew0KKyAgICBmeCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQsIGZ5ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KKyAgICBJRldMX1dpZGdldCAqcE93bmVyID0gR2V0T3duZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwT3duZXIpOw0KKyAgICBwT3duZXItPlRyYW5zZm9ybVRvKG1fcE91dGVyLCBmeCwgZnkpOw0KK30NCit2b2lkIENGV0xfQ29tYm9MaXN0OjpTZXRGb2N1cyhGWF9CT09MIGJTZXQpDQorew0KKyAgICBDRldMX1dpZGdldEltcDo6U2V0Rm9jdXMoYlNldCk7DQorfQ0KK0NGV0xfQ29tYm9MaXN0RGVsZWdhdGU6OkNGV0xfQ29tYm9MaXN0RGVsZWdhdGUoQ0ZXTF9Db21ib0xpc3QgKnBPd25lcikNCisgICAgOiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZShwT3duZXIpDQorICAgICwgbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9CT09MIGJhY2tEZWZhdWx0ID0gVFJVRTsNCisgICAgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMgfHwgZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9LaWxsRm9jdXMpIHsNCisgICAgICAgIE9uRHJvcExpc3RGb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICB9IGVsc2UgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCisgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgICBpZiAobV9wT3duZXItPklzU2hvd1Njcm9sbEJhcihUUlVFKSAmJiBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICAgICAgICAgIHBNc2ctPm1fZnggLT0gcmVjdC5sZWZ0Ow0KKyAgICAgICAgICAgICAgICBwTXNnLT5tX2Z5IC09IHJlY3QudG9wOw0KKyAgICAgICAgICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICAgICAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIE9uRHJvcExpc3RNb3VzZU1vdmUocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgICAgICAgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgT25Ecm9wTGlzdExCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgICAgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICBPbkRyb3BMaXN0TEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX0tleSkgew0KKyAgICAgICAgQ0ZXTF9Nc2dLZXkgKnBNc2cgPSAoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlOw0KKyAgICAgICAgYmFja0RlZmF1bHQgPSAhT25Ecm9wTGlzdEtleShwTXNnKTsNCisgICAgfQ0KKyAgICBpZiAoIWJhY2tEZWZhdWx0KSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9MaXN0RGVsZWdhdGU6Ok9uRHJvcExpc3RGb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgKQ0KK3sNCisgICAgaWYgKCFiU2V0KSB7DQorICAgICAgICBDRldMX01zZ0tpbGxGb2N1cyAqcEtpbGwgPSAoQ0ZXTF9Nc2dLaWxsRm9jdXMqKXBNc2c7DQorICAgICAgICBDRldMX0NvbWJvQm94SW1wICpwT3V0ZXIgPSAoQ0ZXTF9Db21ib0JveEltcCopKCgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCkpOw0KKyAgICAgICAgaWYgKHBLaWxsLT5tX3BTZXRGb2N1cyA9PSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BPdXRlciB8fAkoSUZXTF9XaWRnZXQqKXBLaWxsLT5tX3BTZXRGb2N1cyA9PSAoSUZXTF9XaWRnZXQqKXBPdXRlci0+bV9wRWRpdCkgew0KKyAgICAgICAgICAgIHBPdXRlci0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpPbkRyb3BMaXN0TW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIGlmIChtX3BPd25lci0+bV9iTm90aWZ5T3duZXIpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+bV9iTm90aWZ5T3duZXIgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgIGlmIChoSXRlbSkgew0KKyAgICAgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgMCk7DQorICAgICAgICAgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlTZWwgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgICAgICAgICBDRldMX0V2dENtYkhvdmVyQ2hhbmdlZCBldmVudDsNCisgICAgICAgICAgICBldmVudC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wT3V0ZXI7DQorICAgICAgICAgICAgZXZlbnQubV9pQ3VySG92ZXIgPSBpU2VsOw0KKyAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldmVudCk7DQorICAgICAgICAgICAgbV9wT3duZXItPkNoYW5nZVNlbGVjdGVkKGlTZWwpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2JOb3RpZnlPd25lcikgew0KKyAgICAgICAgbV9wT3duZXItPkNsaWVudFRvT3V0ZXIocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICBDRldMX0NvbWJvQm94SW1wICpwT3V0ZXIgPSAoQ0ZXTF9Db21ib0JveEltcCopKCgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCkpOw0KKyAgICAgICAgcE91dGVyLT5tX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdExCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIENGV0xfQ29tYm9Cb3hJbXAgKnBPdXRlciA9IChDRldMX0NvbWJvQm94SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgICBwT3V0ZXItPlNob3dEcm9wTGlzdChGQUxTRSk7DQorICAgIHJldHVybiAxOw0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpPbkRyb3BMaXN0TEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBDRldMX0NvbWJvQm94SW1wICpwT3V0ZXIgPSAoQ0ZXTF9Db21ib0JveEltcCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BPdXRlciktPkdldERhdGEoKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX2JOb3RpZnlPd25lcikgew0KKyAgICAgICAgbV9wT3duZXItPkNsaWVudFRvT3V0ZXIocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICBwT3V0ZXItPm1fcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5Jc1Nob3dTY3JvbGxCYXIoVFJVRSkgJiYgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICAgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgICAgICBpZiAocmVjdC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwT3V0ZXItPlNob3dEcm9wTGlzdChGQUxTRSk7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW1BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICAgICAgaWYgKGhJdGVtKSB7DQorICAgICAgICAgICAgcE91dGVyLT5Qcm9jZXNzU2VsQ2hhbmdlZChUUlVFKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdEtleShDRldMX01zZ0tleSAqcEtleSkNCit7DQorICAgIENGV0xfQ29tYm9Cb3hJbXAgKnBPdXRlciA9IChDRldMX0NvbWJvQm94SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgICBGWF9CT09MIGJQcm9wYWdhdGUgPSBGQUxTRTsNCisgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICBGWF9EV09SRCBkd0tleUNvZGUgPSBwS2V5LT5tX2R3S2V5Q29kZTsNCisgICAgICAgIHN3aXRjaCAoZHdLZXlDb2RlKSB7DQorICAgICAgICAgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46DQorICAgICAgICAgICAgY2FzZSBGV0xfVktFWV9Fc2NhcGU6IHsNCisgICAgICAgICAgICAgICAgICAgIHBPdXRlci0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfVktFWV9VcDoNCisgICAgICAgICAgICBjYXNlIEZXTF9WS0VZX0Rvd246IHsNCisgICAgICAgICAgICAgICAgICAgIE9uRHJvcExpc3RLZXlEb3duKHBLZXkpOw0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgIHBPdXRlci0+UHJvY2Vzc1NlbENoYW5nZWQoRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICBiUHJvcGFnYXRlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9DaGFyKSB7DQorICAgICAgICBiUHJvcGFnYXRlID0gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoYlByb3BhZ2F0ZSkgew0KKyAgICAgICAgcEtleS0+bV9wRHN0VGFyZ2V0ID0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wT3V0ZXI7DQorICAgICAgICBwT3V0ZXItPm1fcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBLZXkpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdEtleURvd24oQ0ZXTF9Nc2dLZXkgKnBLZXkpDQorew0KKyAgICBGWF9EV09SRCBkd0tleUNvZGUgPSBwS2V5LT5tX2R3S2V5Q29kZTsNCisgICAgc3dpdGNoKGR3S2V5Q29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9VcDoNCisgICAgICAgIGNhc2UgRldMX1ZLRVlfRG93bjoNCisgICAgICAgIGNhc2UgRldMX1ZLRVlfSG9tZToNCisgICAgICAgIGNhc2UgRldMX1ZLRVlfRW5kOiB7DQorICAgICAgICAgICAgICAgIENGV0xfQ29tYm9Cb3hJbXAgKnBPdXRlciA9IChDRldMX0NvbWJvQm94SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgICAgICAgICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BPd25lci0+bV9wSW50ZXJmYWNlLCBwT3V0ZXItPm1faUN1clNlbCk7DQorICAgICAgICAgICAgICAgIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW0oaEl0ZW0sIGR3S2V5Q29kZSk7DQorICAgICAgICAgICAgICAgIGlmICghaEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQorICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NGV0xfQ29tYm9Cb3hJbXA6OkNGV0xfQ29tYm9Cb3hJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fcEVkaXQoTlVMTCkNCisgICAgLCBtX3BMaXN0Qm94KE5VTEwpDQorICAgICwgbV9wRm9ybShOVUxMKQ0KKyAgICAsIG1fYkxCdXR0b25Eb3duKEZBTFNFKQ0KKyAgICAsIG1faUN1clNlbCgtMSkNCisgICAgLCBtX2lCdG5TdGF0ZShGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWwpDQorICAgICwgbV9mQ29tYm9Gb3JtSGFuZGxlcigwKQ0KKyAgICAsIG1fYk5lZWRTaG93TGlzdChGQUxTRSkNCit7DQorICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgICAgbV9ydEJ0bi5SZXNldCgpOw0KKyAgICBtX3J0SGFuZGxlci5SZXNldCgpOw0KK30NCitDRldMX0NvbWJvQm94SW1wOjpDRldMX0NvbWJvQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fcEVkaXQoTlVMTCkNCisgICAgLCBtX3BMaXN0Qm94KE5VTEwpDQorICAgICwgbV9wRm9ybShOVUxMKQ0KKyAgICAsIG1fYkxCdXR0b25Eb3duKEZBTFNFKQ0KKyAgICAsIG1faUN1clNlbCgtMSkNCisgICAgLCBtX2lCdG5TdGF0ZShGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWwpDQorICAgICwgbV9mQ29tYm9Gb3JtSGFuZGxlcigwKQ0KKyAgICAsIG1fYk5lZWRTaG93TGlzdChGQUxTRSkNCit7DQorICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgICAgbV9ydEJ0bi5SZXNldCgpOw0KKyAgICBtX3J0SGFuZGxlci5SZXNldCgpOw0KK30NCitDRldMX0NvbWJvQm94SW1wOjp+Q0ZXTF9Db21ib0JveEltcCgpDQorew0KKyAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgbV9wRWRpdC0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wRWRpdCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcExpc3RCb3gpIHsNCisgICAgICAgIG1fcExpc3RCb3gtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcExpc3RCb3ggPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19Db21ib0JveDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0NvbWJvQm94SW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0NvbWJvQm94Ow0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fSW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9XR1RTVEFURV9JbnZpc2libGUpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgcHJvcC5tX2R3U3R5bGVzIHw9IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtSWNvblRleHQpIHsNCisgICAgICAgIHByb3AubV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICAgIH0NCisgICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIENGV0xfQ29tYm9MaXN0ICpwTGlzdCA9IEZYX05FVyBDRldMX0NvbWJvTGlzdChwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgICBtX3BMaXN0Qm94ID0gSUZXTF9MaXN0Qm94OjpDcmVhdGUoKTsNCisgICAgcExpc3QtPlNldEludGVyZmFjZShtX3BMaXN0Qm94KTsNCisgICAgKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5TZXREYXRhKHBMaXN0KTsNCisgICAgcExpc3QtPkluaXRpYWxpemUoKTsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bikgJiYgIW1fcEVkaXQpIHsNCisgICAgICAgIENGV0xfQ29tYm9FZGl0ICpwRWRpdCA9IEZYX05FVyBDRldMX0NvbWJvRWRpdChtX3BJbnRlcmZhY2UpOw0KKyAgICAgICAgbV9wRWRpdCA9IElGV0xfRWRpdDo6Q3JlYXRlKCk7DQorICAgICAgICBwRWRpdC0+U2V0SW50ZXJmYWNlKG1fcEVkaXQpOw0KKyAgICAgICAgKChJRldMX1RhcmdldERhdGEqKW1fcEVkaXQpLT5TZXREYXRhKHBFZGl0KTsNCisgICAgICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7DQorICAgICAgICBwRWRpdC0+U2V0T3V0ZXIobV9wSW50ZXJmYWNlKTsNCisgICAgfQ0KKyAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgbV9wRWRpdC0+U2V0UGFyZW50KG1fcEludGVyZmFjZSk7DQorICAgIH0NCisgICAgU2V0U3RhdGVzKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKG1fcEVkaXQpIHsNCisgICAgICAgIG1fcEVkaXQtPkZpbmFsaXplKCk7DQorICAgIH0NCisgICAgbV9wTGlzdEJveC0+RmluYWxpemUoKTsNCisgICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KK3sNCisgICAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICAgICAgcmVjdC5SZXNldCgpOw0KKyAgICAgICAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgICAgICAgaWYgKGJJc0Ryb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgICAgICAgICBtX3BFZGl0LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZWN0LndpZHRoID0gMTAwOw0KKyAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID0gMTY7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgICAgICAgICBSZVNldFRoZW1lKCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCAqcEZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRldpZHRoLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgcmVjdC5JbmZsYXRlKDAsIDAsICpwRldpZHRoLCAwKTsNCisgICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQorew0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gRGlzRm9ybV9Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJBZGREcm9wRG93biA9IGR3U3R5bGVzRXhBZGRlZCAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICAgIEZYX0JPT0wgYlJlbW92ZURyb3BEb3duID0gZHdTdHlsZXNFeFJlbW92ZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgICBpZiAoYkFkZERyb3BEb3duICYmICFtX3BFZGl0KSB7DQorICAgICAgICBDRldMX0NvbWJvRWRpdCAqcEVkaXQgPSBGWF9ORVcgQ0ZXTF9Db21ib0VkaXQobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIG1fcEVkaXQgPSBJRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgICAgICAgcEVkaXQtPlNldEludGVyZmFjZShtX3BFZGl0KTsNCisgICAgICAgICgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+U2V0RGF0YShwRWRpdCk7DQorICAgICAgICBwRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgICAgICAgcEVkaXQtPlNldE91dGVyKG1fcEludGVyZmFjZSk7DQorICAgICAgICBtX3BFZGl0LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCisgICAgfSBlbHNlIGlmIChiUmVtb3ZlRHJvcERvd24gJiYgbV9wRWRpdCkgew0KKyAgICAgICAgbV9wRWRpdC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6VXBkYXRlKCkNCit7DQorICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIHJldHVybiBEaXNGb3JtX1VwZGF0ZSgpOw0KKyAgICB9DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIFJlU2V0VGhlbWUoKTsNCisgICAgRlhfQk9PTCBiRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgaWYgKGJEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgICAgICBSZVNldEVkaXRBbGlnbm1lbnQoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9PSBOVUxMKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBMYXlvdXQoKTsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgICAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIG1fZkNvbWJvRm9ybUhhbmRsZXIgPSAqKEZYX0ZMT0FUICopIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXItPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfQ01CX0NvbWJvRm9ybUhhbmRsZXIpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfQ29tYm9Cb3hJbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fSGl0VGVzdChmeCwgZnkpOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6SGl0VGVzdChmeCwgZnkpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9DTUJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfQ01CX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgaWYgKCFiSXNEcm9wRG93bikgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0VGV4dEJrKG1fcnRDbGllbnQpOw0KKyAgICAgICAgcnRUZXh0Qmsud2lkdGggLT0gbV9ydEJ0bi53aWR0aDsNCisgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NNQl9CYWNrZ3JvdW5kOw0KKyAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0VGV4dEJrOw0KKyAgICAgICAgaWYgKG1faUN1clNlbCA+PSAwKSB7DQorICAgICAgICAgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKikoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICBGWF9MUFZPSUQgcCA9IHBEYXRhLT5HZXRJdGVtRGF0YShtX3BMaXN0Qm94LCBwRGF0YS0+R2V0SXRlbShtX3BMaXN0Qm94LCBtX2lDdXJTZWwpKTsNCisgICAgICAgICAgICBpZiAocCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fcERhdGEgPSBwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSB7DQorICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkOw0KKyAgICAgICAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSAmJiAobV9pQ3VyU2VsID49IDApKSB7DQorICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICAgICAgaWYgKG1faUN1clNlbCA+PSAwKSB7DQorICAgICAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BMaXN0Qm94LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQorICAgICAgICAgICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW07DQorICAgICAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfQ2FwdGlvbjsNCisgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9pQnRuU3RhdGU7DQorICAgICAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgICAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0VGV4dEJrOw0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA/IEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkIDogRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICAgICAgICAgIHBhcmFtLm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgICAgICAgICBwYXJhbS5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgICAgICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgew0KKyAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ01CX0Ryb3BEb3duQnV0dG9uOw0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/IEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkIDogbV9pQnRuU3RhdGU7DQorICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRCdG47DQorICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWVQcm92aWRlcjsNCisgICAgaWYgKG1fcExpc3RCb3ggJiYgcFRoZW1lUHJvdmlkZXItPklzVmFsaWRXaWRnZXQobV9wTGlzdEJveCkpIHsNCisgICAgICAgIG1fcExpc3RCb3gtPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lUHJvdmlkZXIpOw0KKyAgICB9DQorICAgIGlmIChtX3BFZGl0ICYmIHBUaGVtZVByb3ZpZGVyLT5Jc1ZhbGlkV2lkZ2V0KG1fcEVkaXQpKSB7DQorICAgICAgICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Cb3hJbXA6OkdldEN1clNlbCgpDQorew0KKyAgICByZXR1cm4gbV9pQ3VyU2VsOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEN1clNlbChGWF9JTlQzMiBpU2VsKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5Db3VudEl0ZW1zKCk7DQorICAgIEZYX0JPT0wgYkNsZWFyU2VsID0gaVNlbCA8IDAgfHwgaVNlbCA+PSBpQ291bnQ7DQorICAgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICAgIGlmIChiRHJvcERvd24gJiYgbV9wRWRpdCkgew0KKyAgICAgICAgaWYgKGJDbGVhclNlbCkgew0KKyAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQoQ0ZYX1dpZGVTdHJpbmcoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU2VsKTsNCisgICAgICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICB9DQorICAgIG1faUN1clNlbCA9IGJDbGVhclNlbCA/IC0xIDogaVNlbDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgaWYgKGJJc0Ryb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgICAgIG1fcEVkaXQtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorICAgIH0NCisgICAgaWYgKG1fcExpc3RCb3gpIHsNCisgICAgICAgIG1fcExpc3RCb3gtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgICAgcmV0dXJuIG1fcEVkaXQtPlVwZGF0ZSgpOw0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0DQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIC0xKTsNCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQgLCBGWF9JTlQzMiBuQ291bnQgKSBjb25zdA0KK3sNCisgICAgaWYgKG1fcEVkaXQpIHsNCisgICAgICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICB9IGVsc2UgaWYgKG1fcExpc3RCb3gpIHsNCisgICAgICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbV9pQ3VyU2VsKTsNCisgICAgICAgIHJldHVybiBtX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRTZWxSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+R2V0RGF0YSgpKS0+Q2xlYXJTZWxlY3RlZCgpOw0KKyAgICBtX3BFZGl0LT5BZGRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0JveEltcDo6R2V0RWRpdFNlbFJhbmdlKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgJm5TdGFydCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgLTEpOw0KKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0TGltaXQoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZGl0LCAtMSk7DQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRMaW1pdCgpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRMaW1pdChGWF9JTlQzMiBuTGltaXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBtX3BFZGl0LT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXREb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZGl0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wRWRpdC0+RG9DbGlwYm9hcmQoaUNtZCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdFJlZG8oRlhfQlNUUiBic1JlY29yZCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRkFMU0UpOw0KKyAgICByZXR1cm4gbV9wRWRpdC0+UmVkbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdFVuZG8oRlhfQlNUUiBic1JlY29yZCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRkFMU0UpOw0KKyAgICByZXR1cm4gbV9wRWRpdC0+VW5kbyhic1JlY29yZCk7DQorfQ0KK0lGV0xfTGlzdEJveCogQ0ZXTF9Db21ib0JveEltcDo6R2V0TGlzdEJveHQoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BMaXN0Qm94LCBGQUxTRSk7DQorICAgIHJldHVybiBtX3BMaXN0Qm94Ow0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKQ0KK3sNCisgICAgaWYgKCFtX2JOZWVkU2hvd0xpc3QpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgTWF0Y2hFZGl0VGV4dCgpOw0KKyAgICB9DQorICAgIFNob3dEcm9wTGlzdChUUlVFKTsNCisgICAgbV9iTmVlZFNob3dMaXN0ID0gRkFMU0U7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6T3BlbkRyb3BEb3duTGlzdChGWF9CT09MIGJBY3RpdmF0ZSkNCit7DQorICAgIFNob3dEcm9wTGlzdChiQWN0aXZhdGUpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdENhblVuZG8oKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0Q2FuUmVkbygpDQorew0KKyAgICByZXR1cm4gbV9wRWRpdC0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRVbmRvKCkNCit7DQorICAgIHJldHVybiBtX3BFZGl0LT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdFJlZG8oKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0Q2FuQ29weSgpDQorew0KKyAgICByZXR1cm4gbV9wRWRpdC0+Q291bnRTZWxSYW5nZXMoKSA+IDA7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdENhbkN1dCgpDQorew0KKyAgICBpZiAobV9wRWRpdC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wRWRpdC0+Q291bnRTZWxSYW5nZXMoKSA+IDA7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdENhblNlbGVjdEFsbCgpDQorew0KKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dExlbmd0aCgpID4gMDsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCkNCit7DQorICAgIHJldHVybiBtX3BFZGl0LT5DdXQod3NDdXQpOw0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIHJldHVybiBtX3BFZGl0LT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0U2VsZWN0QWxsKCkNCit7DQorICAgIHJldHVybiAobV9wRWRpdC0+QWRkU2VsUmFuZ2UoMCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXREZWxldGUoKQ0KK3sNCisgICAgcmV0dXJuIChtX3BFZGl0LT5DbGVhclRleHQoKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgPyBUUlVFIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdERlU2VsZWN0KCkNCit7DQorICAgIHJldHVybiAobV9wRWRpdC0+Q2xlYXJTZWxlY3Rpb25zKCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KK30NCitGV0xfRVJSCUNGV0xfQ29tYm9Cb3hJbXA6OkdldEJCb3goQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fR2V0QkJveChyZWN0KTsNCisgICAgfQ0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgaWYgKG1fcExpc3RCb3ggJiYgSXNEcm9wTGlzdFNob3dlZCgpKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KKyAgICAgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChydExpc3QpOw0KKyAgICAgICAgcnRMaXN0Lk9mZnNldChyZWN0LmxlZnQsIHJlY3QudG9wKTsNCisgICAgICAgIHJlY3QuVW5pb24ocnRMaXN0KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Db21ib0JveEltcDo6RWRpdE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KK3sNCisgICAgaWYgKG1fcEVkaXQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICAgIH0NCit9DQorRlhfRkxPQVQgQ0ZXTF9Db21ib0JveEltcDo6R2V0TGlzdEhlaWdodCgpDQorew0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciktPkdldExpc3RIZWlnaHQobV9wSW50ZXJmYWNlKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpEcmF3U3RyZXRjaEhhbmRsZXIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1faVBhcnQgPQlGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXI7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0SGFuZGxlcjsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpTaG93RHJvcExpc3QoRlhfQk9PTCBiQWN0aXZhdGUpDQorew0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gRGlzRm9ybV9TaG93RHJvcExpc3QoYkFjdGl2YXRlKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJEcm9wTGlzdCA9IElzRHJvcExpc3RTaG93ZWQoKTsNCisgICAgaWYoYkRyb3BMaXN0ID09IGJBY3RpdmF0ZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmICghbV9wRm9ybSkgew0KKyAgICAgICAgSW5pdFByb3h5Rm9ybSgpOw0KKyAgICB9DQorICAgIG1fcExpc3RQcm94eURlbGVnYXRlLT5SZXNldCgpOw0KKyAgICBpZiAoYkFjdGl2YXRlKSB7DQorICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPkNoYW5nZVNlbGVjdGVkKG1faUN1clNlbCk7DQorICAgICAgICBSZVNldExpc3RJdGVtQWxpZ25tZW50KCk7DQorICAgICAgICBGWF9EV09SRCBkd1N0eWxlQWRkID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIChGV0xfU1RZTEVFWFRfQ01CX1NvcnQgfCBGV0xfU1RZTEVFWFRfQ01CX093bmVyRHJhdyk7DQorICAgICAgICBtX3BMaXN0Qm94LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlQWRkLCAwKTsNCisgICAgICAgIG1fcExpc3RCb3gtPkdldFdpZGdldFJlY3QobV9ydExpc3QsIFRSVUUpOw0KKyAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IEdldExpc3RIZWlnaHQoKTsNCisgICAgICAgIGlmIChmSGVpZ2h0ID4gMCkgew0KKyAgICAgICAgICAgIGlmIChtX3J0TGlzdC5oZWlnaHQgPiBHZXRMaXN0SGVpZ2h0KCkpIHsNCisgICAgICAgICAgICAgICAgbV9ydExpc3QuaGVpZ2h0ID0gR2V0TGlzdEhlaWdodCgpOw0KKyAgICAgICAgICAgICAgICBtX3BMaXN0Qm94LT5Nb2RpZnlTdHlsZXMoRldMX1dHVFNUWUxFX1ZTY3JvbGwsIDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIENGWF9SZWN0RiBydEFuY2hvcjsNCisgICAgICAgIHJ0QW5jaG9yLlNldCgwLA0KKyAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgICAgICBGWF9GTE9BVCBmTWluSGVpZ2h0ID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQgPSBtX3J0TGlzdC5oZWlnaHQ7DQorICAgICAgICBpZiAobV9ydExpc3Qud2lkdGggPCBtX3J0Q2xpZW50LndpZHRoKSB7DQorICAgICAgICAgICAgbV9ydExpc3Qud2lkdGggPSBtX3J0Q2xpZW50LndpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9ydFByb3h5ID0gbV9ydExpc3Q7DQorICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfTGlzdERyYWcpIHsNCisgICAgICAgICAgICBtX3J0UHJveHkuaGVpZ2h0ICs9IG1fZkNvbWJvRm9ybUhhbmRsZXI7DQorICAgICAgICB9DQorICAgICAgICBHZXRQb3B1cFBvcyhmTWluSGVpZ2h0LCBtX3J0UHJveHkuaGVpZ2h0LCBydEFuY2hvciwgbV9ydFByb3h5KTsNCisgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0RHJhZykgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgICAgICAgICAgICBGWF9GTE9BVCBmeSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICAgICAgICAgICAgbV9iVXBGb3JtSGFuZGxlciA9IGZ5ID4gbV9ydFByb3h5LnRvcDsNCisgICAgICAgICAgICBpZiAobV9iVXBGb3JtSGFuZGxlcikgew0KKyAgICAgICAgICAgICAgICBtX3J0SGFuZGxlci5TZXQoMCwgMCwgbV9ydExpc3Qud2lkdGgsIG1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KKyAgICAgICAgICAgICAgICBtX3J0TGlzdC50b3AgPSBtX2ZDb21ib0Zvcm1IYW5kbGVyOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcnRIYW5kbGVyLlNldCgwLCBtX3J0TGlzdC5oZWlnaHQsIG1fcnRMaXN0LndpZHRoLCBtX2ZDb21ib0Zvcm1IYW5kbGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3BGb3JtLT5TZXRXaWRnZXRSZWN0KG1fcnRQcm94eSk7DQorICAgICAgICBtX3BGb3JtLT5VcGRhdGUoKTsNCisgICAgICAgIG1fcExpc3RCb3gtPlNldFdpZGdldFJlY3QobV9ydExpc3QpOw0KKyAgICAgICAgbV9wTGlzdEJveC0+VXBkYXRlKCk7DQorICAgICAgICBDRldMX0V2dENtYlByZURyb3BEb3duIGV2Ow0KKyAgICAgICAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KKyAgICAgICAgbV9mSXRlbUhlaWdodCA9ICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+bV9mSXRlbUhlaWdodDsNCisgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+U2V0Rm9jdXMoVFJVRSk7DQorICAgICAgICBtX3BGb3JtLT5Eb01vZGFsKCk7DQorICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPlNldEZvY3VzKEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcEZvcm0tPkVuZERvTW9kYWwoKTsNCisgICAgICAgIENGV0xfRXZ0Q21iQ2xvc2VVcCBldjsNCisgICAgICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgICAgIG1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQorICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPm1fYk5vdGlmeU93bmVyID0gVFJVRTsNCisgICAgICAgIFNldEZvY3VzKFRSVUUpOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6SXNEcm9wTGlzdFNob3dlZCgpDQorew0KKyAgICByZXR1cm4gbV9wRm9ybSAmJiAhKG1fcEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6SXNEcm9wRG93blN0eWxlKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpNYXRjaEVkaXRUZXh0KCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgbV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICBGWF9JTlQzMiBpTWF0Y2ggPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPk1hdGNoSXRlbSh3c1RleHQpOw0KKyAgICBpZiAoaU1hdGNoICE9IG1faUN1clNlbCkgew0KKyAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5DaGFuZ2VTZWxlY3RlZChpTWF0Y2gpOw0KKyAgICAgICAgaWYgKGlNYXRjaCA+PSAwKSB7DQorICAgICAgICAgICAgU3luY2hyRWRpdFRleHQoaU1hdGNoKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChpTWF0Y2ggPj0gMCkgew0KKyAgICAgICAgKChDRldMX0NvbWJvRWRpdCopKChJRldMX1RhcmdldERhdGEqKW1fcEVkaXQpLT5HZXREYXRhKCkpLT5TZXRTZWxlY3RlZCgpOw0KKyAgICB9DQorICAgIG1faUN1clNlbCA9IGlNYXRjaDsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpTeW5jaHJFZGl0VGV4dChGWF9JTlQzMiBpTGlzdEl0ZW0pDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpTGlzdEl0ZW0pOw0KKyAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICAoKENGV0xfQ29tYm9FZGl0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wRWRpdCktPkdldERhdGEoKSktPlNldFNlbGVjdGVkKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6TGF5b3V0KCkNCit7DQorICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIHJldHVybiBEaXNGb3JtX0xheW91dCgpOw0KKyAgICB9DQorICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICAgIEZYX0ZMT0FUICpwRldpZHRoID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZXaWR0aCk7DQorICAgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCisgICAgbV9ydEJ0bi5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AsIGZCdG4sIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgICBpZiAoYklzRHJvcERvd24gJiYgbV9wRWRpdCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RWRpdDsNCisgICAgICAgIHJ0RWRpdC5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LnRvcCwgbV9ydENsaWVudC53aWR0aCAtIGZCdG4sIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgICAgIG1fcEVkaXQtPlNldFdpZGdldFJlY3QocnRFZGl0KTsNCisgICAgICAgIGlmIChtX2lDdXJTZWwgPj0gMCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQorICAgICAgICAgICAgbV9wRWRpdC0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgICAgICAgICAgICBtX3BFZGl0LT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6UmVTZXRUaGVtZSgpDQorew0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIGlmICghcFRoZW1lKSB7DQorICAgICAgICBwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZTsNCisgICAgfQ0KKyAgICBpZiAobV9wTGlzdEJveCkgew0KKyAgICAgICAgaWYgKCFtX3BMaXN0Qm94LT5HZXRUaGVtZVByb3ZpZGVyKCkgJiYgcFRoZW1lLT5Jc1ZhbGlkV2lkZ2V0KG1fcExpc3RCb3gpKSB7DQorICAgICAgICAgICAgbV9wTGlzdEJveC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BFZGl0KSB7DQorICAgICAgICBpZiAoIW1fcEVkaXQtPkdldFRoZW1lUHJvdmlkZXIoKSAmJiBwVGhlbWUtPklzVmFsaWRXaWRnZXQobV9wRWRpdCkpIHsNCisgICAgICAgICAgICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpSZVNldEVkaXRBbGlnbm1lbnQoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BFZGl0KTsNCisgICAgRlhfRFdPUkQgZHdTdHlsRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICAgIEZYX0RXT1JEIGR3QWRkID0gMDsNCisgICAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9FZGl0SEFsaWduTWFzaykgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyOiB7DQorICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIRmFyOiB7DQorICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSEZhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hOZWFyOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBzd2l0Y2ggKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQWxpZ25NYXNrKSB7DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZDZW50ZXI6IHsNCisgICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXI6IHsNCisgICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WRmFyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVk5lYXI7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkKSB7DQorICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRWRpdERpc3RyaWJ1dGVkKSB7DQorICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkOw0KKyAgICB9DQorICAgIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KGR3QWRkLCBGV0xfU1RZTEVFWFRfRURUX0hBbGlnbk1hc2sgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX0hBbGlnbk1vZGVNYXNrIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9WQWxpZ25NYXNrKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpSZVNldExpc3RJdGVtQWxpZ25tZW50KCkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wTGlzdEJveCk7DQorICAgIEZYX0RXT1JEIGR3U3R5bEV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgICBGWF9EV09SRCBkd0FkZCA9IDA7DQorICAgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1BbGlnbk1hc2spIHsNCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUNlbnRlckFsaWduOiB7DQorICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ247DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtUmlnaHRBbGlnbjogew0KKyAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ247DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbjsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgbV9wTGlzdEJveC0+TW9kaWZ5U3R5bGVzRXgoZHdBZGQsIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1BbGlnbk1hc2spOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlByb2Nlc3NTZWxDaGFuZ2VkKEZYX0JPT0wgYkxCdXR0b25VcCkNCit7DQorICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGFzID0gKElGV0xfQ29tYm9Cb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBtX2lDdXJTZWwgPSBwRGF0YXMtPkdldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIG1fcExpc3RCb3gtPkdldFNlbEl0ZW0oMCkpOw0KKyAgICBGWF9CT09MIGJEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgICBpZiAoYkRyb3BEb3duKSB7DQorICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbV9pQ3VyU2VsKTsNCisgICAgICAgIGlmIChoSXRlbSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgICAgICAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgICAgICAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgICAgICAgICAgICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICAgICAgICAgICAgICAoKENGV0xfQ29tYm9FZGl0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wRWRpdCktPkdldERhdGEoKSktPlNldFNlbGVjdGVkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCBldjsNCisgICAgICAgICAgICBldi5iTEJ1dHRvblVwID0gYkxCdXR0b25VcDsNCisgICAgICAgICAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgZXYuaUFycmF5U2Vscy5BZGQobV9pQ3VyU2VsKTsNCisgICAgICAgICAgICBEaXNwYXRjaEV2ZW50KCZldik7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkluaXRQcm94eUZvcm0oKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTCghbV9wRm9ybSk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wTGlzdEJveCk7DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wRm9ybTsNCisgICAgcHJvcEZvcm0ubV9wT3duZXIgPSBtX3BJbnRlcmZhY2U7DQorICAgIHByb3BGb3JtLm1fZHdTdHlsZXMgPSBGV0xfV0dUU1RZTEVfUG9wdXA7DQorICAgIHByb3BGb3JtLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KKyAgICBtX3BQcm94eSA9IEZYX05FVyBDRldMX0Zvcm1Qcm94eUltcChwcm9wRm9ybSwgbV9wTGlzdEJveCk7DQorICAgIG1fcEZvcm0gPSBJRldMX0Zvcm06OkNyZWF0ZSgpOw0KKyAgICBtX3BQcm94eS0+U2V0SW50ZXJmYWNlKG1fcEZvcm0pOw0KKyAgICAoKElGV0xfVGFyZ2V0RGF0YSopbV9wRm9ybSktPlNldERhdGEobV9wUHJveHkpOw0KKyAgICBtX3BQcm94eS0+SW5pdGlhbGl6ZSgpOw0KKyAgICBtX3BMaXN0Qm94LT5TZXRQYXJlbnQoKElGV0xfV2lkZ2V0KiltX3BGb3JtKTsNCisgICAgbV9wTGlzdFByb3h5RGVsZWdhdGUgPSBGWF9ORVcgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGUobV9wRm9ybSwgdGhpcyk7DQorICAgIG1fcFByb3h5LT5TZXREZWxlZ2F0ZSgoSUZXTF9XaWRnZXREZWxlZ2F0ZSopbV9wTGlzdFByb3h5RGVsZWdhdGUpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKTsNCisgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgICAgRGlzRm9ybV9Jbml0Q29tYm9MaXN0KCk7DQorICAgIERpc0Zvcm1fSW5pdENvbWJvRWRpdCgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Jbml0Q29tYm9MaXN0KCkNCit7DQorICAgIGlmIChtX3BMaXN0Qm94KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9wUGFyZW50ID0gKElGV0xfV2lkZ2V0Kil0aGlzLT5tX3BJbnRlcmZhY2U7DQorICAgIHByb3AubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIENGV0xfQ29tYm9MaXN0ICpwTGlzdCA9IEZYX05FVyBDRldMX0NvbWJvTGlzdChwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgICBtX3BMaXN0Qm94ID0gSUZXTF9MaXN0Qm94OjpDcmVhdGUoKTsNCisgICAgcExpc3QtPlNldEludGVyZmFjZShtX3BMaXN0Qm94KTsNCisgICAgKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5TZXREYXRhKHBMaXN0KTsNCisgICAgcExpc3QtPkluaXRpYWxpemUoKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0luaXRDb21ib0VkaXQoKQ0KK3sNCisgICAgaWYgKG1fcEVkaXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXMtPm1fcEludGVyZmFjZTsNCisgICAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bikgPT0gMCkgew0KKyAgICB9DQorICAgIENGV0xfQ29tYm9FZGl0ICpwRWRpdCA9IEZYX05FVyBDRldMX0NvbWJvRWRpdChwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgICBtX3BFZGl0ID0gSUZXTF9FZGl0OjpDcmVhdGUoKTsNCisgICAgcEVkaXQtPlNldEludGVyZmFjZShtX3BFZGl0KTsNCisgICAgKChJRldMX1RhcmdldERhdGEqKW1fcEVkaXQpLT5TZXREYXRhKHBFZGl0KTsNCisgICAgcEVkaXQtPkluaXRpYWxpemUoKTsNCisgICAgcEVkaXQtPlNldE91dGVyKG1fcEludGVyZmFjZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9TaG93RHJvcExpc3QoRlhfQk9PTCBiQWN0aXZhdGUpDQorew0KKyAgICBGWF9CT09MIGJEcm9wTGlzdCA9IERpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgICBpZihiRHJvcExpc3QgPT0gYkFjdGl2YXRlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJBY3RpdmF0ZSkgew0KKyAgICAgICAgQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biBwcmVFdmVudDsNCisgICAgICAgIHByZUV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgIERpc3BhdGNoRXZlbnQoJnByZUV2ZW50KTsNCisgICAgICAgIENGV0xfQ29tYm9MaXN0KiBwQ29tYm9MaXN0ID0gKENGV0xfQ29tYm9MaXN0KikoKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpOw0KKyAgICAgICAgRlhfSU5UMzIgaUl0ZW1zID0gcENvbWJvTGlzdC0+Q291bnRJdGVtcygpOw0KKyAgICAgICAgaWYgKGlJdGVtcyA8IDEpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBSZVNldExpc3RJdGVtQWxpZ25tZW50KCk7DQorICAgICAgICBwQ29tYm9MaXN0LT5DaGFuZ2VTZWxlY3RlZChtX2lDdXJTZWwpOw0KKyAgICAgICAgRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSBwQ29tYm9MaXN0LT5HZXRJdGVtSGVpZ3QoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZCb3JkZXIgPSBHZXRCb3JkZXJTaXplKCk7DQorICAgICAgICBGWF9EV09SRCBuV2hlcmUgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgZlBvcHVwUmV0ID0gMC4wZjsNCisgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiA9IDAuMGY7DQorICAgICAgICBpZiAoaUl0ZW1zID4gMykgew0KKyAgICAgICAgICAgIGZQb3B1cE1pbiA9IGZJdGVtSGVpZ2h0ICogMyArIGZCb3JkZXIgKiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWF4ID0gZkl0ZW1IZWlnaHQgKiBpSXRlbXMgKyBmQm9yZGVyICogMjsNCisgICAgICAgIENGWF9SZWN0RiBydExpc3Q7DQorICAgICAgICBydExpc3QubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgIHJ0TGlzdC53aWR0aCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQorICAgICAgICBydExpc3QudG9wID0gMDsNCisgICAgICAgIHJ0TGlzdC5oZWlnaHQgPSAwOw0KKyAgICAgICAgR2V0UG9wdXBQb3MoZlBvcHVwTWluLCBmUG9wdXBNYXgsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQsIHJ0TGlzdCk7DQorICAgICAgICBtX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KHJ0TGlzdCk7DQorICAgICAgICBtX3BMaXN0Qm94LT5VcGRhdGUoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFNldEZvY3VzKFRSVUUpOw0KKyAgICB9DQorICAgIG1fcExpc3RCb3gtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkFjdGl2YXRlKTsNCisgICAgaWYgKGJBY3RpdmF0ZSkgew0KKyAgICAgICAgQ0ZXTF9FdnRDbWJQb3N0RHJvcERvd24gcG9zdEV2ZW50Ow0KKyAgICAgICAgcG9zdEV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgIERpc3BhdGNoRXZlbnQoJnBvc3RFdmVudCk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIG1fcExpc3RCb3gtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIHJlY3QuSW5mbGF0ZSgyLCAyKTsNCisgICAgUmVwYWludCgmcmVjdCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkNCit7DQorICAgIHJldHVybiAhKG1fcExpc3RCb3gtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Nb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KK3sNCisgICAgaWYgKCFtX3BFZGl0KSB7DQorICAgICAgICBEaXNGb3JtX0luaXRDb21ib0VkaXQoKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJBZGREcm9wRG93biA9IGR3U3R5bGVzRXhBZGRlZCAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICAgIEZYX0JPT0wgYkRlbERyb3BEb3duID0gZHdTdHlsZXNFeFJlbW92ZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgICBkd1N0eWxlc0V4UmVtb3ZlZCAmPSB+RldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCisgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgICBpZiAoYkFkZERyb3BEb3duKSB7DQorICAgICAgICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeCgwLCBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KTsNCisgICAgfSBlbHNlIGlmIChiRGVsRHJvcERvd24pIHsNCisgICAgICAgIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHksIDApOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9VcGRhdGUoKQ0KK3sNCisgICAgaWYgKG1faUxvY2spIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgaWYgKG1fcEVkaXQpIHsNCisgICAgICAgIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KKyAgICB9DQorICAgIFJlU2V0VGhlbWUoKTsNCisgICAgTGF5b3V0KCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICByZWN0LlNldCgwLA0KKyAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoIC0gbV9ydEJ0bi53aWR0aCwNCisgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfRWRpdDsNCisgICAgfQ0KKyAgICBpZiAobV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICAgIGlmIChEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKSkgew0KKyAgICAgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgQ0ZYX01hdHJpeCBtdE9yZzsNCisgICAgbXRPcmcuU2V0KDEsIDAsIDAsIDEsIDAsIDApOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRPcmcgPSAqcE1hdHJpeDsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJMaXN0U2hvd2VkID0gbV9wTGlzdEJveCAmJiBEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBwR3JhcGhpY3MtPkNvbmNhdE1hdHJpeCgmbXRPcmcpOw0KKyAgICBpZiAoIW1fcnRCdG4uSXNFbXB0eSgwLjFmKSkgew0KKyAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSAoSUZXTF9XaWRnZXQqKXRoaXMtPm1fcEludGVyZmFjZTsNCisgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfRHJvcERvd25CdXR0b247DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9pQnRuU3RhdGU7DQorICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJ0bjsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIGlmIChtX3BFZGl0KSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KKyAgICAgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydEVkaXQubGVmdCwgcnRFZGl0LnRvcCk7DQorICAgICAgICBtdC5Db25jYXQobXRPcmcpOw0KKyAgICAgICAgbV9wRWRpdC0+RHJhd1dpZGdldChwR3JhcGhpY3MsICZtdCk7DQorICAgIH0NCisgICAgaWYgKGJMaXN0U2hvd2VkKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KKyAgICAgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChydExpc3QpOw0KKyAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydExpc3QubGVmdCwgcnRMaXN0LnRvcCk7DQorICAgICAgICBtdC5Db25jYXQobXRPcmcpOw0KKyAgICAgICAgbV9wTGlzdEJveC0+RHJhd1dpZGdldChwR3JhcGhpY3MsICZtdCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgaWYgKG1fcExpc3RCb3ggJiYgRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgICAgIENGWF9SZWN0RiBydExpc3Q7DQorICAgICAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KHJ0TGlzdCk7DQorICAgICAgICBydExpc3QuT2Zmc2V0KHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICAgICAgcmVjdC5VbmlvbihydExpc3QpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0xheW91dCgpDQorew0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICBtX3J0Q29udGVudCA9IG1fcnRDbGllbnQ7DQorICAgIEZYX0ZMT0FUICpwRldpZHRoID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZXaWR0aCk7DQorICAgIEZYX0ZMT0FUIGJvcmRlcldpZHRoID0gMDsNCisgICAgew0KKyAgICAgICAgYm9yZGVyV2lkdGggPSBGV0xfUEFSVF9DTUJfQm9yZGVyOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCisgICAgaWYgKCEodGhpcy0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9DTUJfUmVhZE9ubHkpKSB7DQorICAgICAgICBtX3J0QnRuLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmQnRuLCBtX3J0Q2xpZW50LnRvcCArIGJvcmRlcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgZkJ0biAtIGJvcmRlcldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAtIDIgKiBib3JkZXJXaWR0aCk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGKiBwVUlNYXJnaW4gPSAoQ0ZYX1JlY3RGKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbik7DQorICAgIGlmIChwVUlNYXJnaW4pIHsNCisgICAgICAgIG1fcnRDb250ZW50LkRlZmxhdGUocFVJTWFyZ2luLT5sZWZ0LCBwVUlNYXJnaW4tPnRvcCwgcFVJTWFyZ2luLT53aWR0aCwgcFVJTWFyZ2luLT5oZWlnaHQpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgaWYgKGJJc0Ryb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgICAgIENGWF9SZWN0RiBydEVkaXQ7DQorICAgICAgICBydEVkaXQuU2V0KG1fcnRDb250ZW50LmxlZnQsDQorICAgICAgICAgICAgICAgICAgIG1fcnRDb250ZW50LnRvcCwgbV9ydENvbnRlbnQud2lkdGggLSBmQnRuLCBtX3J0Q29udGVudC5oZWlnaHQpOw0KKyAgICAgICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICAgICAgaWYgKG1faUN1clNlbCA+PSAwKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIG1faUN1clNlbCk7DQorICAgICAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCisgICAgICAgICAgICBtX3BFZGl0LT5Mb2NrVXBkYXRlKCk7DQorICAgICAgICAgICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgICAgIG1fcEVkaXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICAgIH0NCit9DQorQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUoQ0ZXTF9Db21ib0JveEltcCAqcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgaWYgKG1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIHJldHVybiBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICB9DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9CT09MIGlSZXQgPSAxOw0KKyAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICAgICAgICAgICAgc3dpdGNoKGR3Q21kKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICAgICAgICAgICAgT25LZXkoKENGV0xfTXNnS2V5KilwTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgaVJldCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUglDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCit7DQorICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSkgew0KKyAgICAgICAgQ0ZXTF9FdnRDbWJEcmF3SXRlbSBwVGVtcDsNCisgICAgICAgIHBUZW1wLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgICAgICBwVGVtcC5tX3BHcmFwaGljcyA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSAqKXBFdmVudCktPm1fcEdyYXBoaWNzOw0KKyAgICAgICAgcFRlbXAubV9pbmRleCA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSAqKXBFdmVudCktPm1faW5kZXg7DQorICAgICAgICBwVGVtcC5tX3J0SXRlbSA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSAqKXBFdmVudCktPm1fcmVjdDsNCisgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQorICAgIH0gZWxzZSBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX1Njcm9sbCkgew0KKyAgICAgICAgRlhfRFdPUkQgZHdTY3JvbGxDb2RlID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9pU2Nyb2xsQ29kZTsNCisgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSAoKENGV0xfRXZ0U2Nyb2xsKilwRXZlbnQpLT5tX2ZQb3M7DQorICAgICAgICBDRldMX0V2dFNjcm9sbCBwU2Nyb2xsRXY7DQorICAgICAgICBwU2Nyb2xsRXYubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgICAgIHBTY3JvbGxFdi5tX2lTY3JvbGxDb2RlID0gZHdTY3JvbGxDb2RlOw0KKyAgICAgICAgcFNjcm9sbEV2Lm1fZlBvcyA9IGZQb3M7DQorICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmcFNjcm9sbEV2KTsNCisgICAgfSBlbHNlIGlmIChkd0ZsYWcgPT0gRldMX0VWVEhBU0hfRURUX1RleHRDaGFuZ2VkKSB7DQorICAgICAgICBDRldMX0V2dENtYkVkaXRDaGFuZ2VkIHBUZW1wOw0KKyAgICAgICAgcFRlbXAubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgICAgIHBUZW1wLndzSW5zZXJ0ID0gKChDRldMX0V2dEVkdFRleHRDaGFuZ2VkICopcEV2ZW50KS0+d3NJbnNlcnQ7DQorICAgICAgICBwVGVtcC53c0RlbGV0ZSA9ICgoQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCAqKXBFdmVudCktPndzRGVsZXRlOw0KKyAgICAgICAgcFRlbXAubkNoYW5nZVR5cGUgPSAoKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQgKilwRXZlbnQpLT5uQ2hhbmdlVHlwZTsNCisgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCApDQorew0KKyAgICBJRldMX1RhcmdldCAqcERzdFRhcmdldCA9IHBNc2ctPm1fcERzdFRhcmdldDsNCisgICAgSUZXTF9UYXJnZXQgKnBTcmNUYXJnZXQgPSBwTXNnLT5tX3BTcmNUYXJnZXQ7DQorICAgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPklzRHJvcERvd25TdHlsZSgpOw0KKyAgICBpZiAoYlNldCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICBpZiAoYkRyb3BEb3duICYmIHBTcmNUYXJnZXQgIT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wTGlzdEJveCkgew0KKyAgICAgICAgICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkaXQpOw0KKyAgICAgICAgICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wRWRpdCktPkdldERhdGEoKSktPlNldFNlbGVjdGVkKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICBpZiAoYkRyb3BEb3duICYmIHBEc3RUYXJnZXQgIT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wTGlzdEJveCkgew0KKyAgICAgICAgICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkaXQpOw0KKyAgICAgICAgICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wRWRpdCktPkdldERhdGEoKSktPkZsYWdGb2N1cyhGQUxTRSk7DQorICAgICAgICAgICAgKChDRldMX0NvbWJvRWRpdCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BFZGl0KS0+R2V0RGF0YSgpKS0+Q2xlYXJTZWxlY3RlZCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgQ0ZYX1JlY3RGJiBydEJ0biA9IGJEcm9wRG93biA/IG1fcE93bmVyLT5tX3J0QnRuIDogbV9wT3duZXItPm1fcnRDbGllbnQ7DQorICAgIEZYX0JPT0wgYkNsaWNrQnRuID0gcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIGlmIChiQ2xpY2tCdG4pIHsNCisgICAgICAgIGlmIChiRHJvcERvd24gJiYgbV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+TWF0Y2hFZGl0VGV4dCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gVFJVRTsNCisgICAgICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX1ByZXNzZWQ7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICAgICAgbV9wT3duZXItPlNob3dEcm9wTGlzdChUUlVFKTsNCisgICAgICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbDsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEJ0bik7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgRlhfSU5UMzIgaU9sZFN0YXRlID0gbV9wT3duZXItPm1faUJ0blN0YXRlOw0KKyAgICBpZiAobV9wT3duZXItPm1fcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA/IEZXTF9QQVJUU1RBVEVfQ01CX1ByZXNzZWQgOiBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICB9DQorICAgIGlmICggIChpT2xkU3RhdGUgIT0gbV9wT3duZXItPm1faUJ0blN0YXRlKSAmJg0KKyAgICAgICAgICAgICEoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmICghbV9wT3duZXItPklzRHJvcExpc3RTaG93ZWQoKSAmJg0KKyAgICAgICAgICAgICEoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbktleShDRldMX01zZ0tleSAqcE1zZykNCit7DQorICAgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgICBpZiAoZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgew0KKyAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoS2V5RXZlbnQocE1zZyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiU3ViQ3RybEtleSA9IHBNc2ctPm1fcERzdFRhcmdldCA9PSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBpZiAoYlN1YkN0cmxLZXkpIHsNCisgICAgICAgIERvU3ViQ3RybEtleShwTXNnKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6RG9TdWJDdHJsS2V5KENGV0xfTXNnS2V5ICpwTXNnKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcE1zZy0+bV9kd0tleUNvZGU7DQorICAgIEZYX0JPT0wgYlVwID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwOw0KKyAgICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICAgIGlmIChiVXAgfHwgYkRvd24pIHsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9ICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wTGlzdEJveCktPkdldERhdGEoKSktPkNvdW50SXRlbXMoKTsNCisgICAgICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiTWF0Y2hFcXVhbCA9IEZBTFNFOw0KKyAgICAgICAgRlhfSU5UMzIgaUN1clNlbCA9IG1fcE93bmVyLT5tX2lDdXJTZWw7DQorICAgICAgICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgICAgIGlmIChiRHJvcERvd24gJiYgbV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICAgICAgbV9wT3duZXItPm1fcEVkaXQtPkdldFRleHQod3NUZXh0KTsNCisgICAgICAgICAgICBpQ3VyU2VsID0gKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+TWF0Y2hJdGVtKHdzVGV4dCk7DQorICAgICAgICAgICAgaWYgKGlDdXJTZWwgPj0gMCkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICAgICAgICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQICopbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIGlDdXJTZWwpOw0KKyAgICAgICAgICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZW1wKTsNCisgICAgICAgICAgICAgICAgYk1hdGNoRXF1YWwgPSB3c1RleHQuRXF1YWwod3NUZW1wKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUN1clNlbCA8IDApIHsNCisgICAgICAgICAgICBpQ3VyU2VsID0gMDsNCisgICAgICAgIH0gZWxzZSBpZiAoIWJEcm9wRG93biB8fCBiTWF0Y2hFcXVhbCkgew0KKyAgICAgICAgICAgIGlmICgoYlVwICYmIGlDdXJTZWwgPT0gMCkgfHwgKGJEb3duICYmIGlDdXJTZWwgPT0gaUNvdW50IC0gMSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoYlVwKSB7DQorICAgICAgICAgICAgICAgIGlDdXJTZWwgLS07DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUN1clNlbCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3BPd25lci0+bV9pQ3VyU2VsID0gaUN1clNlbDsNCisgICAgICAgIGlmIChiRHJvcERvd24gJiYgbV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+U3luY2hyRWRpdFRleHQobV9wT3duZXItPm1faUN1clNlbCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiRHJvcERvd24gPSBtX3BPd25lci0+SXNEcm9wRG93blN0eWxlKCk7DQorICAgIGlmIChiRHJvcERvd24pIHsNCisgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICAgIEZYX0JPT0wgYmFja0RlZmF1bHQgPSBUUlVFOw0KKyAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIERpc0Zvcm1fT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICAgICAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgICAgICAgICAgICBzd2l0Y2goZHdDbWQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc0Zvcm1fT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgICAgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnS2V5ICpwS2V5ID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlVcCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5EaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKSAmJiBwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcEtleS0+bV9kd0tleUNvZGU7DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMaXN0S2V5ID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd24gfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0tleUNvZGUgPT0gRldMX1ZLRVlfUmV0dXJuIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX0VzY2FwZTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiTGlzdEtleSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BMaXN0Qm94LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIERpc0Zvcm1fT25LZXkoKENGV0xfTXNnS2V5KilwTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiYWNrRGVmYXVsdCkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5EaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKTsNCisgICAgQ0ZYX1JlY3RGJiBydEJ0biA9IGJEcm9wRG93biA/IG1fcE93bmVyLT5tX3J0QnRuIDogbV9wT3duZXItPm1fcnRDbGllbnQ7DQorICAgIEZYX0JPT0wgYkNsaWNrQnRuID0gcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIGlmIChiQ2xpY2tCdG4pIHsNCisgICAgICAgIGlmIChtX3BPd25lci0+RGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+RGlzRm9ybV9TaG93RHJvcExpc3QoRkFMU0UpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAobV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPk1hdGNoRWRpdFRleHQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0KQ0KK3sNCisgICAgSUZXTF9UYXJnZXQgKnBEc3RUYXJnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgIElGV0xfVGFyZ2V0ICpwU3JjVGFyZ2V0ID0gcE1zZy0+bV9wU3JjVGFyZ2V0Ow0KKyAgICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgaWYgKGJTZXQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgICAgaWYgKChtX3BPd25lci0+bV9wRWRpdC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICAgICAgICAgIENGV0xfTXNnU2V0Rm9jdXMgbXNnOw0KKyAgICAgICAgICAgIG1zZy5tX3BEc3RUYXJnZXQgPSBtX3BPd25lci0+bV9wRWRpdDsNCisgICAgICAgICAgICBtc2cubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgICAgICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKCZtc2cpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgIENGV0xfTXNnS2lsbEZvY3VzIG1zZzsNCisgICAgICAgIG1zZy5tX3BEc3RUYXJnZXQgPSBOVUxMOw0KKyAgICAgICAgbXNnLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0Ow0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKCZtc2cpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEaXNGb3JtX09uS2V5KENGV0xfTXNnS2V5ICpwTXNnKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcE1zZy0+bV9kd0tleUNvZGU7DQorICAgIEZYX0JPT0wgYlVwID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwOw0KKyAgICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICAgIGlmIChiVXAgfHwgYkRvd24pIHsNCisgICAgICAgIENGV0xfQ29tYm9MaXN0KiBwQ29tYm9MaXN0ID0gKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKShtX3BPd25lci0+bV9wTGlzdEJveCkpLT5HZXREYXRhKCkpOw0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gcENvbWJvTGlzdC0+Q291bnRJdGVtcygpOw0KKyAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJNYXRjaEVxdWFsID0gRkFMU0U7DQorICAgICAgICBGWF9JTlQzMiBpQ3VyU2VsID0gbV9wT3duZXItPm1faUN1clNlbDsNCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgICAgIGlDdXJTZWwgPSBwQ29tYm9MaXN0LT5NYXRjaEl0ZW0od3NUZXh0KTsNCisgICAgICAgICAgICBpZiAoaUN1clNlbCA+PSAwKSB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBpdGVtID0gbV9wT3duZXItPm1fcExpc3RCb3gtPkdldFNlbEl0ZW0oaUN1clNlbCk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChpdGVtLCB3c1RlbXApOw0KKyAgICAgICAgICAgICAgICBiTWF0Y2hFcXVhbCA9IHdzVGV4dC5FcXVhbCh3c1RlbXApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQ3VyU2VsIDwgMCkgew0KKyAgICAgICAgICAgIGlDdXJTZWwgPSAwOw0KKyAgICAgICAgfSBlbHNlIGlmIChiTWF0Y2hFcXVhbCkgew0KKyAgICAgICAgICAgIGlmICgoYlVwICYmIGlDdXJTZWwgPT0gMCkgfHwgKGJEb3duICYmIGlDdXJTZWwgPT0gaUNvdW50IC0gMSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoYlVwKSB7DQorICAgICAgICAgICAgICAgIGlDdXJTZWwgLS07DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUN1clNlbCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3BPd25lci0+bV9pQ3VyU2VsID0gaUN1clNlbDsNCisgICAgICAgIG1fcE93bmVyLT5TeW5jaHJFZGl0VGV4dChtX3BPd25lci0+bV9pQ3VyU2VsKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgICAgfQ0KK30NCitDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6Q0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGUoSUZXTF9Gb3JtICpwRm9ybSwgQ0ZXTF9Db21ib0JveEltcCAqcENvbWJvQm94KQ0KKyAgICA6IG1fcEZvcm0ocEZvcm0pDQorICAgICwgbV9wQ29tYm9Cb3gocENvbWJvQm94KQ0KKyAgICAsIG1fYkxCdXR0b25Eb3duKEZBTFNFKQ0KKyAgICAsIG1fYkxCdXR0b25VcFNlbGYoRkFMU0UpDQorICAgICwgbV9mU3RhcnRQb3MoMCkNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KKyAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICAgIHN3aXRjaChkd0NtZCkgew0KKyAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX0RlYWN0aXZhdGUpIHsNCisgICAgICAgIE9uRGVhY3RpdmUoKENGV0xfTXNnRGVhY3RpdmF0ZSopcE1lc3NhZ2UpOw0KKyAgICB9DQorICAgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfS2lsbEZvY3VzIHx8IGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cykgew0KKyAgICAgICAgT25Gb2N1c0NoYW5nZWQoKENGV0xfTXNnS2lsbEZvY3VzKilwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIG1fcENvbWJvQm94LT5EcmF3U3RyZXRjaEhhbmRsZXIocEdyYXBoaWNzLCBwTWF0cml4KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgbV9wRm9ybS0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC50b3AgPSAwOw0KKyAgICBpZiAocnRXaWRnZXQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fYkxCdXR0b25Eb3duID0gVFJVRTsNCisgICAgICAgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgICAgICAgcERyaXZlci0+U2V0R3JhYihtX3BGb3JtLCBGQUxTRSk7DQorICAgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IgKnBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCisgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTlMpOw0KKyAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgIG1fcEZvcm0tPlRyYW5zZm9ybVRvKE5VTEwsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBtX2ZTdGFydFBvcyA9IHBNc2ctPm1fZnk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBtX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgRkFMU0UpOw0KKyAgICBpZiAobV9iTEJ1dHRvblVwU2VsZikgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgICBtX3BGb3JtLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgICAgICAgaWYgKCFyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpICYmIG1fcENvbWJvQm94LT5Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgICAgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fYkxCdXR0b25VcFNlbGYgPSBUUlVFOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IgKnBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCisgICAgRldMX0NVUlNPUlRZUEUgY3Vyc29yVHlwZSA9IEZXTF9DVVJTT1JUWVBFX0Fycm93Ow0KKyAgICBpZiAobV9wQ29tYm9Cb3gtPm1fcnRIYW5kbGVyLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBjdXJzb3JUeXBlID0gRldMX0NVUlNPUlRZUEVfU2l6ZU5TOw0KKyAgICB9DQorICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoY3Vyc29yVHlwZSk7DQorICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgaWYgKCFtX2JMQnV0dG9uRG93bikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fcEZvcm0tPlRyYW5zZm9ybVRvKE5VTEwsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBGWF9GTE9BVCBmQ2hhbmdlZCA9IHBNc2ctPm1fZnkgLSBtX2ZTdGFydFBvczsNCisgICAgaWYgKG1fcENvbWJvQm94LT5tX2JVcEZvcm1IYW5kbGVyKSB7DQorICAgICAgICBmQ2hhbmdlZCA9IG1fZlN0YXJ0UG9zIC0gcE1zZy0+bV9meTsNCisgICAgfQ0KKyAgICBpZiAobV9wQ29tYm9Cb3gtPm1fcnRMaXN0LmhlaWdodCArIGZDaGFuZ2VkIDwgbV9wQ29tYm9Cb3gtPm1fZkl0ZW1IZWlnaHQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BDb21ib0JveC0+bV9ydExpc3QuaGVpZ2h0ICs9IGZDaGFuZ2VkOw0KKyAgICBtX3BDb21ib0JveC0+bV9ydFByb3h5LmhlaWdodCArPSBmQ2hhbmdlZDsNCisgICAgaWYgKG1fcENvbWJvQm94LT5tX2JVcEZvcm1IYW5kbGVyKSB7DQorICAgICAgICBtX3BDb21ib0JveC0+bV9ydFByb3h5LnRvcCAtPSBmQ2hhbmdlZDsNCisgICAgICAgIG1fcENvbWJvQm94LT5tX3J0SGFuZGxlci5TZXQoMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tYm9Cb3gtPm1fcnRMaXN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21ib0JveC0+bV9mQ29tYm9Gb3JtSGFuZGxlcik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BDb21ib0JveC0+bV9ydEhhbmRsZXIuU2V0KDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbWJvQm94LT5tX3J0TGlzdC5oZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbWJvQm94LT5tX3J0TGlzdC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tYm9Cb3gtPm1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KKyAgICB9DQorICAgIG1fcEZvcm0tPlNldFdpZGdldFJlY3QobV9wQ29tYm9Cb3gtPm1fcnRQcm94eSk7DQorICAgIG1fcENvbWJvQm94LT5tX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KG1fcENvbWJvQm94LT5tX3J0TGlzdCk7DQorICAgIG1fcENvbWJvQm94LT5tX3BMaXN0Qm94LT5VcGRhdGUoKTsNCisgICAgbV9mU3RhcnRQb3MgPSBwTXNnLT5tX2Z5Ow0KK30NCit2b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkRlYWN0aXZlKENGV0xfTXNnRGVhY3RpdmF0ZSAqcE1zZykNCit7DQorICAgIG1fcENvbWJvQm94LT5TaG93RHJvcExpc3QoRkFMU0UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01zZ0tpbGxGb2N1cyAqcE1zZywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIGlmICghYlNldCkgew0KKyAgICAgICAgaWYgKHBNc2ctPm1fcFNldEZvY3VzID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyaW1wLmNwcApAQCAtMCwwICsxLDEyMDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfZWRpdGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2RhdGV0aW1lcGlja2VyaW1wLmgiDQorI2RlZmluZSBGV0xfRFRQX1dJRFRICQkxMDANCisjZGVmaW5lIEZXTF9EVFBfSEVJR0hUCQkyMA0KK0lGV0xfRGF0ZVRpbWVQaWNrZXIqIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gbmV3IElGV0xfRGF0ZVRpbWVQaWNrZXI7DQorfQ0KK0ZXTF9FUlIJSUZXTF9EYXRlVGltZUZvcm06OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1Qcm94eUltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfRm9ybVByb3h5SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0Zvcm1Qcm94eUltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX0RhdGVUaW1lQ2FsZW5kZXI6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0RhdGVUaW1lQ2FsZW5kYXIocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX0RhdGVUaW1lQ2FsZW5kYXIqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVDYWxlbmRhciopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX0RhdGVUaW1lRWRpdDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVFZGl0KHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9EYXRlVGltZUVkaXQqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVFZGl0KiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitJRldMX0RhdGVUaW1lUGlja2VyOjpJRldMX0RhdGVUaW1lUGlja2VyKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0RhdGVUaW1lUGlja2VyOjp+SUZXTF9EYXRlVGltZVBpY2tlcigpDQorew0KKyAgICBpZiAobV9wRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAocE91dGVyKTsNCisgICAgKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0RhdGVUaW1lUGlja2VySW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRlhfSU5UMzIJSUZXTF9EYXRlVGltZVBpY2tlcjo6Q291bnRTZWxSYW5nZXMoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkdldERhdGFUaW1lRWRpdCgpLT5Db3VudFNlbFJhbmdlcygpOw0KK30NCitGWF9JTlQzMglJRldMX0RhdGVUaW1lUGlja2VyOjpHZXRTZWxSYW5nZShGWF9JTlQzMiBuSW5kZXgsIEZYX0lOVDMyICZuU3RhcnQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+R2V0RGF0YVRpbWVFZGl0KCktPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpHZXRDdXJTZWwoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5HZXRDdXJTZWwoaVllYXIsIGlNb250aCwgaURheSk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2V0Q3VyU2VsKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+U2V0Q3VyU2VsKGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KK30NCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCit9DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5HZXRFZGl0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5VbmRvKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuUmVkbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OlVuZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlVuZG8oKTsNCit9DQorRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpSZWRvKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuQ29weSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q2FuQ29weSgpOw0KK30NCitGWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhbkN1dCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuU2VsZWN0QWxsKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q29weSh3c0NvcHkpOw0KK30NCitGWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpTZWxlY3RBbGwoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkRlbGV0ZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6RGVTZWxlY3QoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkRlU2VsZWN0KCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+R2V0QkJveChyZWN0KTsNCit9DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpTZXRFZGl0TGltaXQoRlhfSU5UMzIgbkxpbWl0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEVkaXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPk1vZGlmeUVkaXRTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQorQ0ZXTF9EYXRlVGltZUVkaXQ6OkNGV0xfRGF0ZVRpbWVFZGl0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCisgICAgOiBDRldMX0VkaXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KK3sNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lRWRpdDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZSh0aGlzKTsNCisgICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lRWRpdDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOjpDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlKENGV0xfRGF0ZVRpbWVFZGl0ICpwT3duZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wRGVsZWdhdGUocE93bmVyKQ0KKyAgICAsIG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gRGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMgfHwgZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9LaWxsRm9jdXMpIHsNCisgICAgICAgIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBtX3BPd25lci0+R2V0T3V0ZXIoKTsNCisgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICB9DQorICAgIHJldHVybiAxOw0KK30NCitGWF9JTlQzMiBDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOjpEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCisgICAgICAgICAgICBDRldMX01zZ01vdXNlICpwTW91c2UgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgaWYgKHBNb3VzZS0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24gfHwgcE1vdXNlLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bikgew0KKyAgICAgICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKnBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VySW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZiAocERhdGVUaW1lLT5Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgICAgICAgICAgICAgICAgIHBEYXRlVGltZS0+R2V0V2lkZ2V0UmVjdChydEludmFsaWRhdGUpOw0KKyAgICAgICAgICAgICAgICAgICAgcERhdGVUaW1lLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICBydEludmFsaWRhdGUuT2Zmc2V0KC1ydEludmFsaWRhdGUubGVmdCwgLXJ0SW52YWxpZGF0ZS50b3ApOw0KKyAgICAgICAgICAgICAgICAgICAgcERhdGVUaW1lLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX0tleSkgew0KKyAgICAgICAgICAgIHJldHVybiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpDRldMX0RhdGVUaW1lQ2FsZW5kYXIoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KKyAgICA6IENGV0xfTW9udGhDYWxlbmRhckltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorew0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVDYWxlbmRhcjo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgfQ0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUodGhpcyk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lQ2FsZW5kYXI6OkZpbmFsaXplKCkNCit7DQorICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0NGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZShDRldMX0RhdGVUaW1lQ2FsZW5kYXIgKnBPd25lcikNCisgICAgOiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZShwT3duZXIpDQorICAgICwgbV9wT3duZXIocE93bmVyKQ0KK3sNCisgICAgbV9iRmxhZyA9IEZBTFNFOw0KK30NCitGWF9JTlQzMiBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGR3Q29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyB8fCBkd0NvZGUgPT0gRldMX01TR0hBU0hfS2lsbEZvY3VzKSB7DQorICAgICAgICBJRldMX1dpZGdldCAqcE91dGVyID0gbV9wT3duZXItPkdldE91dGVyKCk7DQorICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBwT3V0ZXItPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgIH0gZWxzZSBpZiAoZHdDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duKSB7DQorICAgICAgICAgICAgT25MQnV0dG9uRG93bkV4KHBNc2cpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfSBlbHNlIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXApIHsNCisgICAgICAgICAgICBPbkxCdXR0b25VcEV4KHBNc2cpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd25FeChDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0TEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgbV9wT3duZXItPm1faUxCdG5QYXJ0U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZDsNCisgICAgICAgIG1fcE93bmVyLT5QcmV2TW9udGgoKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnRSQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZDsNCisgICAgICAgIG1fcE93bmVyLT5OZXh0TW9udGgoKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnRUb2RheS5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSApID09IDApIHsNCisgICAgICAgICAgICBtX3BPd25lci0+SnVtcFRvVG9kYXkoKTsNCisgICAgICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgSUZXTF9EYXRlVGltZVBpY2tlciAqcElQaWNrZXIgPSAoSUZXTF9EYXRlVGltZVBpY2tlciAqKW1fcE93bmVyLT5tX3BPdXRlcjsNCisgICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKnBQaWNrZXIgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqKSgoSUZXTF9UYXJnZXREYXRhICopcElQaWNrZXIpLT5HZXREYXRhKCk7DQorICAgICAgICBpZiAocFBpY2tlci0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgICAgICAgICBtX2JGbGFnID0gMTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpPbkxCdXR0b25VcEV4KENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fT25MQnV0dG9uVXBFeChwTXNnKTsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcnRMQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0TEJ0bik7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgbV9wT3duZXItPm1faVJCdG5QYXJ0U3RhdGVzID0gMDsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydFJCdG4pOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9ydFRvZGF5LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaU9sZFNlbCA9IDA7DQorICAgIGlmIChtX3BPd25lci0+bV9hcnJTZWxEYXlzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIGlPbGRTZWwgPSBtX3BPd25lci0+bV9hcnJTZWxEYXlzWzBdOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICBJRldMX0RhdGVUaW1lUGlja2VyICpwSVBpY2tlciA9IChJRldMX0RhdGVUaW1lUGlja2VyICopbV9wT3duZXItPm1fcE91dGVyOw0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wICpwUGlja2VyID0gKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKikoKElGV0xfVGFyZ2V0RGF0YSAqKXBJUGlja2VyKS0+R2V0RGF0YSgpOw0KKyAgICBwUGlja2VyLT5tX3BGb3JtLT5HZXRXaWRnZXRSZWN0KHJ0KTsNCisgICAgcnQuU2V0KDAsIDAsIHJ0LndpZHRoLCBydC5oZWlnaHQpOw0KKyAgICBpZiAoaUN1clNlbCA+IDApIHsNCisgICAgICAgIExQREFURUlORk8gbHBEYXRlc0luZm8gPSAoTFBEQVRFSU5GTyltX3BPd25lci0+bV9hcnJEYXRlcy5HZXRBdChpQ3VyU2VsIC0gMSk7DQorICAgICAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlKGxwRGF0ZXNJbmZvLT5yZWN0KTsNCisgICAgICAgIGlmIChpT2xkU2VsID4gMCAmJiBpT2xkU2VsIDw9IG1fcE93bmVyLT5tX2FyckRhdGVzLkdldFNpemUoKSkgew0KKyAgICAgICAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KKyAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlDdXJTZWwpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wT3V0ZXIpOw0KKyAgICAgICAgcFBpY2tlci0+UHJvY2Vzc1NlbENoYW5nZWQobV9wT3duZXItPm1faUN1clllYXIsIG1fcE93bmVyLT5tX2lDdXJNb250aCwgaUN1clNlbCk7DQorICAgICAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICAgIH0gZWxzZSBpZiAobV9iRmxhZyAmJiAoIXJ0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSkgew0KKyAgICAgICAgSUZXTF9EYXRlVGltZVBpY2tlciAqcElQaWNrZXIgPSAoSUZXTF9EYXRlVGltZVBpY2tlciAqKW1fcE93bmVyLT5tX3BPdXRlcjsNCisgICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKnBQaWNrZXIgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqKSgoSUZXTF9UYXJnZXREYXRhICopcElQaWNrZXIpLT5HZXREYXRhKCk7DQorICAgICAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICAgIH0NCisgICAgbV9iRmxhZyA9IDA7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6Ok9uTW91c2VNb3ZlRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgMCwgMCk7DQorICAgIGlmIChtX3BPd25lci0+bV9ydERhdGVzLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBGWF9JTlQzMiBpSG92ZXIgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgIGJSZXBhaW50ID0gbV9wT3duZXItPm1faUhvdmVyZWQgIT0gaUhvdmVyOw0KKyAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMCkgew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChtX3BPd25lci0+bV9pSG92ZXJlZCwgcnRJbnZhbGlkYXRlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGlIb3ZlciA+IDApIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RGF5Ow0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChpSG92ZXIsIHJ0RGF5KTsNCisgICAgICAgICAgICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHJ0RGF5Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHJ0RGF5KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5tX2lIb3ZlcmVkID0gaUhvdmVyOw0KKyAgICAgICAgQ0ZXTF9FdmVudF9EdHBIb3ZlckNoYW5nZWQgZXY7DQorICAgICAgICBldi5ob3ZlcmRheSA9IGlIb3ZlcjsNCisgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMDsNCisgICAgICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5HZXREYXlSZWN0KG1fcE93bmVyLT5tX2lIb3ZlcmVkLCBydEludmFsaWRhdGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSAtMTsNCisgICAgfQ0KKyAgICBpZiAoYlJlcGFpbnQgJiYgIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyCUNGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcCkgew0KKyAgICAgICAgICAgIERpc0Zvcm1fT25MQnV0dG9uVXBFeChwTXNnKTsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpEaXNGb3JtX09uTEJ1dHRvblVwRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lMQnRuUGFydFN0YXRlcyA9IDA7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0TEJ0bikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lSQnRuUGFydFN0YXRlcyA9IDA7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0UkJ0bikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9ydFRvZGF5LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaU9sZFNlbCA9IDA7DQorICAgIGlmIChtX3BPd25lci0+bV9hcnJTZWxEYXlzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIGlPbGRTZWwgPSBtX3BPd25lci0+bV9hcnJTZWxEYXlzWzBdOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgaWYgKGlDdXJTZWwgPiAwKSB7DQorICAgICAgICBMUERBVEVJTkZPIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaUN1clNlbCAtIDEpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShscERhdGVzSW5mby0+cmVjdCk7DQorICAgICAgICBpZiAoaU9sZFNlbCA+IDAgJiYgaU9sZFNlbCA8PSBtX3BPd25lci0+bV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICBscERhdGVzSW5mbyA9IChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlPbGRTZWwgLSAxKTsNCisgICAgICAgICAgICBydEludmFsaWRhdGUuVW5pb24obHBEYXRlc0luZm8tPnJlY3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCisgICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKnBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VySW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgICAgICAgcERhdGVUaW1lLT5Qcm9jZXNzU2VsQ2hhbmdlZChtX3BPd25lci0+bV9pQ3VyWWVhciwgbV9wT3duZXItPm1faUN1ck1vbnRoLCBpQ3VyU2VsKTsNCisgICAgICAgIHBEYXRlVGltZS0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KKyAgICB9DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fYkxCdG5Eb3duKEZBTFNFKQ0KKyAgICAsIG1faUJ0blN0YXRlKDEpDQorICAgICwgbV9pWWVhcigtMSkNCisgICAgLCBtX2lNb250aCgtMSkNCisgICAgLCBtX2lEYXkoLTEpDQorICAgICwgbV9wRWRpdChOVUxMKQ0KKyAgICAsIG1fcE1vbnRoQ2FsKE5VTEwpDQorICAgICwgbV9wRm9ybShGQUxTRSkNCit7DQorICAgIG1fcnRCdG4uU2V0KDAsIDAsIDAsIDApOw0KK30NCitDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDRldMX0RhdGVUaW1lUGlja2VySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9iTEJ0bkRvd24oRkFMU0UpDQorICAgICwgbV9pQnRuU3RhdGUoMSkNCisgICAgLCBtX2lZZWFyKC0xKQ0KKyAgICAsIG1faU1vbnRoKC0xKQ0KKyAgICAsIG1faURheSgtMSkNCisgICAgLCBtX3BFZGl0KE5VTEwpDQorICAgICwgbV9wTW9udGhDYWwoTlVMTCkNCisgICAgLCBtX3BGb3JtKEZBTFNFKQ0KK3sNCisgICAgbV9ydEJ0bi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6On5DRldMX0RhdGVUaW1lUGlja2VySW1wKCkNCit7DQorICAgIGlmIChtX3BFZGl0KSB7DQorICAgICAgICBtX3BFZGl0LT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BFZGl0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wTW9udGhDYWwpIHsNCisgICAgICAgIG1fcE1vbnRoQ2FsLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BNb250aENhbCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcEZvcm0pIHsNCisgICAgICAgIG1fcEZvcm0tPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcEZvcm0gPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19EYXRlVGltZVBpY2tlcjsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyA9IEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0Ow0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcE1vbnRoOw0KKyAgICBwcm9wTW9udGgubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cCB8IEZXTF9XR1RTVFlMRV9Cb3JkZXI7DQorICAgIHByb3BNb250aC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgICAgcHJvcE1vbnRoLm1fcERhdGFQcm92aWRlciA9ICZtX01vbnRoQ2FsZW5kYXJEUDsNCisgICAgcHJvcE1vbnRoLm1fcFBhcmVudCA9IG1fcEludGVyZmFjZTsNCisgICAgcHJvcE1vbnRoLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgICBtX3BNb250aENhbCA9IG5ldyBJRldMX0RhdGVUaW1lQ2FsZW5kZXIoKTsNCisgICAgbV9wTW9udGhDYWwtPkluaXRpYWxpemUocHJvcE1vbnRoLCBtX3BJbnRlcmZhY2UpOw0KKyAgICBDRlhfUmVjdEYgcnRNb250aENhbDsNCisgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQorICAgIHJ0TW9udGhDYWwuU2V0KDAsIDAsIHJ0TW9udGhDYWwud2lkdGgsIHJ0TW9udGhDYWwuaGVpZ2h0KTsNCisgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aENhbCk7DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wRWRpdDsNCisgICAgcHJvcEVkaXQubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwcm9wRWRpdC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgbV9wRWRpdCA9IG5ldyBJRldMX0RhdGVUaW1lRWRpdCgpOw0KKyAgICBtX3BFZGl0LT5Jbml0aWFsaXplKHByb3BFZGl0LCBtX3BJbnRlcmZhY2UpOw0KKyAgICBSZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE1vbnRoQ2FsKTsNCisgICAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BFZGl0KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkZpbmFsaXplKCkNCit7DQorICAgIGlmIChtX3BFZGl0KSB7DQorICAgICAgICBtX3BFZGl0LT5GaW5hbGl6ZSgpOw0KKyAgICB9DQorICAgIGlmIChtX3BNb250aENhbCkgew0KKyAgICAgICAgbV9wTW9udGhDYWwtPkZpbmFsaXplKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEZvcm0pIHsNCisgICAgICAgIG1fcEZvcm0tPkZpbmFsaXplKCk7DQorICAgIH0NCisgICAgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KCk7DQorICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIHJldHVybiBEaXNGb3JtX0dldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCisgICAgfQ0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LlNldCgwLCAwLCBGV0xfRFRQX1dJRFRILCBGV0xfRFRQX0hFSUdIVCk7DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpVcGRhdGUoKQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fVXBkYXRlKCk7DQorICAgIH0NCisgICAgaWYgKG1faUxvY2spIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICBGWF9GTE9BVCAqcEZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBGV2lkdGgsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCisgICAgbV9ydEJ0bi5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AsIGZCdG4gLSAxLCBtX3J0Q2xpZW50LmhlaWdodCAtIDEpOw0KKyAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KKyAgICBydEVkaXQuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLSBmQnRuLCBtX3J0Q2xpZW50LmhlaWdodCk7DQorICAgIG1fcEVkaXQtPlNldFdpZGdldFJlY3QocnRFZGl0KTsNCisgICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQorICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICBpZiAoIShtX3BNb250aENhbC0+R2V0VGhlbWVQcm92aWRlcigpKSkgew0KKyAgICAgICAgbV9wTW9udGhDYWwtPlNldFRoZW1lUHJvdmlkZXIobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikgew0KKyAgICAgICAgSUZXTF9EYXRlVGltZVBpY2tlckRQICpwRGF0YSA9IChJRldMX0RhdGVUaW1lUGlja2VyRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgIHBEYXRhLT5HZXRUb2RheShtX3BJbnRlcmZhY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9Nb250aENhbGVuZGFyRFAubV9pQ3VyWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJEYXkpOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCisgICAgQ0ZYX1JlY3RGIHJ0UG9wVXA7DQorICAgIHJ0UG9wVXAuU2V0KHJ0TW9udGhDYWwubGVmdCwgcnRNb250aENhbC50b3AgKyBGV0xfRFRQX0hFSUdIVCwgcnRNb250aENhbC53aWR0aCwgcnRNb250aENhbC5oZWlnaHQpOw0KKyAgICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydFBvcFVwKTsNCisgICAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fSGl0VGVzdChmeCwgZnkpOw0KKyAgICB9DQorICAgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICAgIH0NCisgICAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICAgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX0RUUF9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICAgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9EVFBfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoIW1fcnRCdG4uSXNFbXB0eSgpKSB7DQorICAgICAgICBEcmF3RHJvcERvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIHJldHVybiBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUUCkNCit7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVFA7DQorICAgIG1fcE1vbnRoQ2FsLT5TZXRUaGVtZVByb3ZpZGVyKHBUUCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRDdXJTZWwoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSkNCit7DQorICAgIGlZZWFyID0gbV9pWWVhcjsNCisgICAgaU1vbnRoID0gbV9pTW9udGg7DQorICAgIGlEYXkgPSBtX2lEYXk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpTZXRDdXJTZWwoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaVllYXIgPiAwICYmIGlZZWFyIDwgMzAwMCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpTW9udGggPiAwICYmIGlNb250aCA8IDEzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlEYXkgPiAwICYmIGlEYXkgPCAzMiwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgbV9pWWVhciA9IGlZZWFyOw0KKyAgICBtX2lNb250aCA9IGlNb250aDsNCisgICAgbV9pRGF5ID0gaURheTsNCisgICAgbV9wTW9udGhDYWwtPlNldFNlbGVjdChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgICBDRldMX0V2ZW50X0R0cEVkaXRDaGFuZ2VkIGV2Ow0KKyAgICBldi5tX3dzVGV4dCA9IHdzVGV4dDsNCisgICAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCkgY29uc3QNCit7DQorICAgIGlmIChtX3BFZGl0KSB7DQorICAgICAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhblVuZG8oKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5SZWRvKCkNCit7DQorICAgIHJldHVybiBtX3BFZGl0LT5DYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6VW5kbygpDQorew0KKyAgICByZXR1cm4gbV9wRWRpdC0+VW5kbygpOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlJlZG8oKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5Db3B5KCkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgIHJldHVybiBuQ291bnQgPiAwOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhbkN1dCgpDQorew0KKyAgICBpZiAobV9wRWRpdC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX3BFZGl0LT5Db3VudFNlbFJhbmdlcygpOw0KKyAgICByZXR1cm4gbkNvdW50ID4gMDsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5TZWxlY3RBbGwoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKSA+IDA7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpDQorew0KKyAgICByZXR1cm4gbV9wRWRpdC0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2VsZWN0QWxsKCkNCit7DQorICAgIHJldHVybiAobV9wRWRpdC0+QWRkU2VsUmFuZ2UoMCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRlbGV0ZSgpDQorew0KKyAgICByZXR1cm4gKG1fcEVkaXQtPkNsZWFyVGV4dCgpID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEZVNlbGVjdCgpDQorew0KKyAgICByZXR1cm4gKG1fcEVkaXQtPkNsZWFyU2VsZWN0aW9ucygpID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRCQm94KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIHJldHVybiBEaXNGb3JtX0dldEJCb3gocmVjdCk7DQorICAgIH0NCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0TW9udGg7DQorICAgICAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgICAgIHJ0TW9udGguT2Zmc2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICAgICAgcmVjdC5VbmlvbihydE1vbnRoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCkNCit7DQorICAgIHJldHVybiBtX3BFZGl0LT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRyYXdEcm9wRG93bkJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1NwaW4pID09IEZXTF9TVFlMRUVYVF9EVFBfU3Bpbikgew0KKyAgICAgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgICAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhFX1NQQl9WZXJ0Ow0KKyAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBwcm9wLm1fcnRXaWRnZXQgPSBtX3J0QnRuOw0KKyAgICAgICAgSUZXTF9TcGluQnV0dG9uICpwU3BpbiA9IElGV0xfU3BpbkJ1dHRvbjo6Q3JlYXRlKCk7DQorICAgICAgICBwU3Bpbi0+SW5pdGlhbGl6ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRFRQX0Ryb3BEb3duQnV0dG9uOw0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1faUJ0blN0YXRlOw0KKyAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRCdG47DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpGb3JtYXREYXRlU3RyaW5nKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXksIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdCkgPT0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQpIHsNCisgICAgICAgIHdzVGV4dC5Gb3JtYXQoRlhfTFBDV1NUUihMIiVkLSVkLSVkIiksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCkgPT0gRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCkgew0KKyAgICAgICAgd3NUZXh0LkZvcm1hdChGWF9MUENXU1RSKEwiJWQgWWVhciAlZCBNb250aCAlZCBEYXkiKSwgaVllYXIsIGlNb250aCwgaURheSk7DQorICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpID09IEZXTF9TVFlMRUVYVF9EVFBfVGltZUZvcm1hdCkgew0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2hvd01vbnRoQ2FsZW5kYXIoRlhfQk9PTCBiQWN0aXZhdGUpDQorew0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gRGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihiQWN0aXZhdGUpOw0KKyAgICB9DQorICAgIGlmKElzTW9udGhDYWxlbmRhclNob3dlZCgpID09IGJBY3RpdmF0ZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmICghbV9wRm9ybSkgew0KKyAgICAgICAgSW5pdFByb3h5Rm9ybSgpOw0KKyAgICB9DQorICAgIGlmIChiQWN0aXZhdGUpIHsNCisgICAgICAgIENGWF9SZWN0RiBydE1vbnRoOw0KKyAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgICAgICBDRlhfUmVjdEYgcnRBbmNob3I7DQorICAgICAgICBydEFuY2hvci5TZXQoMCwNCisgICAgICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgICAgICAgR2V0UG9wdXBQb3MoMCwgcnRNb250aC5oZWlnaHQsIHJ0QW5jaG9yLCBydE1vbnRoKTsNCisgICAgICAgIG1fcEZvcm0tPlNldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgICAgICBydE1vbnRoLmxlZnQgPSBydE1vbnRoLnRvcCA9IDA7DQorICAgICAgICBtX3BNb250aENhbC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KKyAgICAgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgICAgICBtX3BNb250aENhbC0+VXBkYXRlKCk7DQorICAgICAgICBtX3BGb3JtLT5Eb01vZGFsKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BGb3JtLT5FbmREb01vZGFsKCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIERpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQorICAgIH0NCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BGb3JtLCBGQUxTRSk7DQorICAgIHJldHVybiAhKG1fcEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UmVTZXRFZGl0QWxpZ25tZW50KCkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wRWRpdCk7DQorICAgIEZYX0RXT1JEIGR3U3R5bEV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgICBGWF9EV09SRCBkd0FkZCA9IDA7DQorICAgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhBbGlnbk1hc2spIHsNCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0RUUF9FZGl0SENlbnRlcjogew0KKyAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEZhcjogew0KKyAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hGYXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkFsaWduTWFzaykgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWQ2VudGVyOiB7DQorICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkNlbnRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOiB7DQorICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkZhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX1ZOZWFyOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEp1c3RpZmllZCkgew0KKyAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQ7DQorICAgIH0NCisgICAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX0VkaXREaXN0cmlidXRlZCkgew0KKyAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9EaXN0cmlidXRlZDsNCisgICAgfQ0KKyAgICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd0FkZCwgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25NYXNrIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfVkFsaWduTWFzayk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UHJvY2Vzc1NlbENoYW5nZWQoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkNCit7DQorICAgIG1faVllYXIgPSBpWWVhcjsNCisgICAgbV9pTW9udGggPSBpTW9udGg7DQorICAgIG1faURheSA9IGlEYXk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgRm9ybWF0RGF0ZVN0cmluZyhtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5LCB3c1RleHQpOw0KKyAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCisgICAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkIGV2Ow0KKyAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIGV2LmlZZWFyID0gbV9pWWVhcjsNCisgICAgZXYuaU1vbnRoID0gbV9pTW9udGg7DQorICAgIGV2LmlEYXkgPSBtX2lEYXk7DQorICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpJbml0UHJveHlGb3JtKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwoIW1fcEZvcm0pOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE1vbnRoQ2FsKTsNCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BGb3JtOw0KKyAgICBwcm9wRm9ybS5tX2R3U3R5bGVzID0gRldMX1dHVFNUWUxFX1BvcHVwOw0KKyAgICBwcm9wRm9ybS5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgICAgcHJvcEZvcm0ubV9wT3duZXIgPSBtX3BJbnRlcmZhY2U7DQorICAgIG1fcEZvcm0gPSBuZXcgSUZXTF9EYXRlVGltZUZvcm0oKTsNCisgICAgbV9wRm9ybS0+SW5pdGlhbGl6ZShwcm9wRm9ybSwgbV9wTW9udGhDYWwpOw0KKyAgICBtX3BNb250aENhbC0+U2V0UGFyZW50KChJRldMX1dpZGdldCopbV9wRm9ybSk7DQorfQ0KK0lGV0xfRGF0ZVRpbWVFZGl0KglDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXREYXRhVGltZUVkaXQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEVkaXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9Jbml0aWFsaXplKCkNCit7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgPSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdDsNCisgICAgRGlzRm9ybV9Jbml0RGF0ZVRpbWVDYWxlbmRhcigpOw0KKyAgICBEaXNGb3JtX0luaXREYXRlVGltZUVkaXQoKTsNCisgICAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BNb250aENhbCk7DQorICAgIFJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wRWRpdCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0luaXREYXRlVGltZUNhbGVuZGFyKCkNCit7DQorICAgIGlmIChtX3BNb250aENhbCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wTW9udGg7DQorICAgIHByb3BNb250aC5tX2R3U3R5bGVzID0gRldMX1dHVFNUWUxFX1BvcHVwIHwgRldMX1dHVFNUWUxFX0JvcmRlciB8IEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOw0KKyAgICBwcm9wTW9udGgubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQorICAgIHByb3BNb250aC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXM7DQorICAgIHByb3BNb250aC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9Nb250aENhbGVuZGFyRFA7DQorICAgIHByb3BNb250aC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgbV9wTW9udGhDYWwgPSBuZXcgSUZXTF9EYXRlVGltZUNhbGVuZGVyKCk7DQorICAgIG1fcE1vbnRoQ2FsLT5Jbml0aWFsaXplKHByb3BNb250aCwgbV9wSW50ZXJmYWNlKTsNCisgICAgQ0ZYX1JlY3RGIHJ0TW9udGhDYWw7DQorICAgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwsIFRSVUUpOw0KKyAgICBydE1vbnRoQ2FsLlNldCgwLCAwLCBydE1vbnRoQ2FsLndpZHRoLCBydE1vbnRoQ2FsLmhlaWdodCk7DQorICAgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSW5pdERhdGVUaW1lRWRpdCgpDQorew0KKyAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wRWRpdDsNCisgICAgcHJvcEVkaXQubV9wUGFyZW50ID0gKElGV0xfV2lkZ2V0Kil0aGlzOw0KKyAgICBwcm9wRWRpdC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgbV9wRWRpdCA9IG5ldyBJRldMX0RhdGVUaW1lRWRpdCgpOw0KKyAgICBtX3BFZGl0LT5Jbml0aWFsaXplKHByb3BFZGl0LCBtX3BJbnRlcmZhY2UpOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wTW9udGhDYWwsIEZBTFNFKTsNCisgICAgcmV0dXJuICEobV9wTW9udGhDYWwtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSkNCit7DQorICAgIEZYX0JPT0wgYlNob3dlZCA9IElzTW9udGhDYWxlbmRhclNob3dlZCgpOw0KKyAgICBpZihiU2hvd2VkID09IGJBY3RpdmF0ZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChiQWN0aXZhdGUpIHsNCisgICAgICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KKyAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQorICAgICAgICBGWF9EV09SRCBkd1BvcyA9IDA7DQorICAgICAgICBGWF9GTE9BVCBmUG9wdXBIZWlnaHQgPSAwLjBmOw0KKyAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWluID0gcnRNb250aENhbC5oZWlnaHQ7DQorICAgICAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBydE1vbnRoQ2FsLmhlaWdodDsNCisgICAgICAgIENGWF9SZWN0RiBydEFuY2hvcihtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0KTsNCisgICAgICAgIHJ0QW5jaG9yLndpZHRoID0gcnRNb250aENhbC53aWR0aDsNCisgICAgICAgIHJ0TW9udGhDYWwubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgIHJ0TW9udGhDYWwudG9wID0gcnRBbmNob3IuSGVpZ2h0KCk7DQorICAgICAgICBHZXRQb3B1cFBvcyhmUG9wdXBNaW4sIGZQb3B1cE1heCwgcnRBbmNob3IsIHJ0TW9udGhDYWwpOw0KKyAgICAgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aENhbCk7DQorICAgICAgICBpZiAobV9pWWVhciA+IDAgJiYgIG1faU1vbnRoID4gMCAmJiBtX2lEYXkgPiAwKSB7DQorICAgICAgICAgICAgbV9wTW9udGhDYWwtPlNldFNlbGVjdChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5KTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcE1vbnRoQ2FsLT5VcGRhdGUoKTsNCisgICAgfQ0KKyAgICBtX3BNb250aENhbC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KKyAgICBpZiAoYkFjdGl2YXRlKSB7DQorICAgICAgICBDRldMX01zZ1NldEZvY3VzIG1zZzsNCisgICAgICAgIG1zZy5tX3BEc3RUYXJnZXQgPSBtX3BNb250aENhbDsNCisgICAgICAgIG1zZy5tX3BTcmNUYXJnZXQgPSBtX3BFZGl0Ow0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zZyk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZSwgcnRDYWw7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCisgICAgICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydENhbCk7DQorICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihydENhbCk7DQorICAgIHJ0SW52YWxpZGF0ZS5JbmZsYXRlKDIsIDIpOw0KKyAgICBSZXBhaW50KCZydEludmFsaWRhdGUpOw0KK30NCitGWF9EV09SRCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0hpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIHJlY3QuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0VkaXQ7DQorICAgIH0NCisgICAgaWYgKERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpKSB7DQorICAgICAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCisgICAgfQ0KKyAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICAgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKQ0KK3sNCisgICAgRlhfQk9PTCBiRm9jdXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQgfHwNCisgICAgICAgICAgICAgICAgICAgICBtX3BNb250aENhbC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCB8fA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIHJldHVybiBiRm9jdXMgOw0KK30NCitGV0xfRVJSCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fVXBkYXRlKCkNCit7DQorICAgIGlmIChtX2lMb2NrKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgbV9wRWRpdC0+U2V0VGhlbWVQcm92aWRlcihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChtX3J0Q2xpZW50KTsNCisgICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQorICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgICBpZiAobV9wTW9udGhDYWwtPkdldFRoZW1lUHJvdmlkZXIoKSA9PSBOVUxMKSB7DQorICAgICAgICBtX3BNb250aENhbC0+U2V0VGhlbWVQcm92aWRlcihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKSB7DQorICAgICAgICBJRldMX0RhdGVUaW1lUGlja2VyRFAgKnBEYXRhID0gKElGV0xfRGF0ZVRpbWVQaWNrZXJEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgcERhdGEtPkdldFRvZGF5KChJRldMX1dpZGdldCopdGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9udGhDYWxlbmRhckRQLm1faUN1ck1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9udGhDYWxlbmRhckRQLm1faUN1ckRheSk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgKnBXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWR0aCwgMCk7DQorICAgIG1fZkJ0biA9ICpwV2lkdGg7DQorICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCisgICAgQ0ZYX1JlY3RGIHJ0UG9wVXA7DQorICAgIHJ0UG9wVXAuU2V0KHJ0TW9udGhDYWwubGVmdCwgcnRNb250aENhbC50b3AgKyBGV0xfRFRQX0hFSUdIVCwgcnRNb250aENhbC53aWR0aCwgcnRNb250aENhbC5oZWlnaHQpOw0KKyAgICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydFBvcFVwKTsNCisgICAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9HZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpDQorew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgaWYgKERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpKSB7DQorICAgICAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9HZXRCQm94KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICBpZiAoRGlzRm9ybV9Jc05lZWRTaG93QnV0dG9uKCkpIHsNCisgICAgICAgIHJlY3Qud2lkdGggKz0gbV9mQnRuOw0KKyAgICB9DQorICAgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0TW9udGg7DQorICAgICAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgICAgIHJ0TW9udGguT2Zmc2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICAgICAgcmVjdC5VbmlvbihydE1vbnRoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChtX3BFZGl0KSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KKyAgICAgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydEVkaXQubGVmdCwgcnRFZGl0LnRvcCk7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BFZGl0LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsNCisgICAgfQ0KKyAgICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgICAgIENGWF9SZWN0RiBydE1vbnRoOw0KKyAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgICAgICBDRlhfTWF0cml4IG10Ow0KKyAgICAgICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0TW9udGgubGVmdCwgcnRNb250aC50b3ApOw0KKyAgICAgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wTW9udGhDYWwtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGUoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSAxOw0KKyAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNb3VzZSA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTW91c2UtPm1fZHdDbWQ7DQorICAgICAgICAgICAgICAgIHN3aXRjaChkd0NtZCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihwTW91c2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1vdXNlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNb3VzZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZUxlYXZlKHBNb3VzZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgaWYoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX0tleSAmJiBtX3BPd25lci0+bV9wRWRpdC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgcmV0dXJuCXBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE1zZyk7DQorICAgIGlmIChtX3BPd25lci0+bV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChwTXNnLCBiU2V0KTsNCisgICAgfQ0KKyAgICBpZiAoYlNldCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gKEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+KEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0NCisgICAgaWYocE1zZy0+bV9wU3JjVGFyZ2V0ID09IChJRldMX1dpZGdldCopbV9wT3duZXItPm1fcE1vbnRoQ2FsICYmIG1fcE93bmVyLT5Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgICAgbV9wT3duZXItPlNob3dNb250aENhbGVuZGFyKEZBTFNFKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTXNnKTsNCisgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBpZiAobV9wT3duZXItPklzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlNob3dNb250aENhbGVuZGFyKEZBTFNFKTsNCisgICAgICAgICAgICBDRldMX0V2ZW50X0R0cENsb3NlVXAgZXY7DQorICAgICAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKCEobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihUUlVFKTsNCisgICAgICAgICAgICAgICAgQ0ZXTF9FdmVudF9EdHBEcm9wRG93biBldjsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BPd25lci0+bV9iTEJ0bkRvd24gPSBUUlVFOw0KKyAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBNc2cpOw0KKyAgICBtX3BPd25lci0+bV9iTEJ0bkRvd24gPSBGQUxTRTsNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEJ0bik7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWw7DQorICAgIH0NCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTXNnKTsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCkNCit7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGUobV9wT3duZXItPm1fcnRCdG4pOw0KKyAgICBpZiAoYlNldCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICBpZiAoIG1fcE93bmVyLT5tX3BFZGl0ICYmICEobV9wT3duZXItPm1fcEVkaXQtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSkgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX3J0QnRuLlNldChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fZkJ0biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0IC0gMSk7DQorICAgICAgICB9DQorICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9ydEJ0bjsNCisgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0Ow0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgICAgbV9wT3duZXItPm1fcnRCdG4uU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5EaXNGb3JtX0lzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlNob3dNb250aENhbGVuZGFyKEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wRWRpdC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICAgICAgICAgIHBNc2ctPm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0Ow0KKyAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcnRJbnZhbGlkYXRlLkluZmxhdGUoMiwgMik7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZWRpdGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZWRpdGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZDkyMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9lZGl0aW1wLmNwcApAQCAtMCwwICsxLDIyNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfZWRpdGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9jYXJldGltcC5oIg0KK0lGV0xfRWRpdCogSUZXTF9FZGl0OjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX0VkaXQ7DQorfQ0KK0lGV0xfRWRpdDo6SUZXTF9FZGl0KCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0VkaXQ6On5JRldMX0VkaXQoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9FZGl0SW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRUZXh0KHdzVGV4dCk7DQorfQ0KK0ZYX0lOVDMyIElGV0xfRWRpdDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5HZXRUZXh0TGVuZ3RoKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50KSBjb25zdA0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUglJRldMX0VkaXQ6OkNsZWFyVGV4dCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5DbGVhclRleHQoKTsNCit9DQorRlhfSU5UMzIgSUZXTF9FZGl0OjpHZXRDYXJldFBvcygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5HZXRDYXJldFBvcygpOw0KK30NCitGWF9JTlQzMiBJRldMX0VkaXQ6OlNldENhcmV0UG9zKEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OkFkZFNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCitGWF9JTlQzMiBJRldMX0VkaXQ6OkNvdW50U2VsUmFuZ2VzKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNvdW50U2VsUmFuZ2VzKCk7DQorfQ0KK0ZYX0lOVDMyIElGV0xfRWRpdDo6R2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGV0xfRVJSCUlGV0xfRWRpdDo6Q2xlYXJTZWxlY3Rpb25zKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNsZWFyU2VsZWN0aW9ucygpOw0KK30NCitGWF9JTlQzMiBJRldMX0VkaXQ6OkdldExpbWl0KCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkdldExpbWl0KCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpTZXRMaW1pdChGWF9JTlQzMiBuTGltaXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSCUlGV0xfRWRpdDo6U2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldEFsaWFzQ2hhcih3QWxpYXMpOw0KK30NCitGV0xfRVJSCUlGV0xfRWRpdDo6U2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldEZvcm1hdFN0cmluZyh3c0Zvcm1hdCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpJbnNlcnQoRlhfSU5UMzIgblN0YXJ0LCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbikNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbik7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpEZWxldGVTZWxlY3Rpb25zKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkRlbGV0ZVNlbGVjdGlvbnMoKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OkRlbGV0ZVJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+RGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCitGV0xfRVJSIElGV0xfRWRpdDo6UmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5SZXBsYWNlU2VsZWN0aW9ucyh3c1JlcGxhY2UpOw0KK30NCitGV0xfRVJSIElGV0xfRWRpdDo6UmVwbGFjZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5MZW4sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZXBsYWNlKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+UmVwbGFjZShuU3RhcnQsIG5MZW4sIHdzUmVwbGFjZSk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpEb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+RG9DbGlwYm9hcmQoaUNtZCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9FZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Db3B5KHdzQ29weSk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9FZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTAlJRldMX0VkaXQ6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9FZGl0OjpEZWxldGUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9FZGl0OjpSZWRvKEZYX0JTVFIgYnNSZWNvcmQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5SZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTAlJRldMX0VkaXQ6OlVuZG8oRlhfQlNUUiBic1JlY29yZCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlVuZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MCUlGV0xfRWRpdDo6VW5kbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9FZGl0OjpSZWRvKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlJlZG8oKTsNCit9DQorRlhfQk9PTAlJRldMX0VkaXQ6OkNhblVuZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q2FuVW5kbygpOw0KK30NCitGWF9CT09MCUlGV0xfRWRpdDo6Q2FuUmVkbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5DYW5SZWRvKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0VGFiV2lkdGgoZlRhYldpZHRoLCBiRXF1aWRpc3RhbnQpOw0KK30NCitGV0xfRVJSCUlGV0xfRWRpdDo6U2V0T3V0ZXIoSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldE91dGVyKHBPdXRlcik7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpTZXROdW1iZXJSYW5nZShGWF9JTlQzMiBpTWluLCBGWF9JTlQzMiBpTWF4KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0TnVtYmVyUmFuZ2UoaU1pbiwgaU1heCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9FZGl0OjpTZXRCYWNrQ29sb3IoRlhfRFdPUkQgZHdDb2xvcikNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldEJhY2tncm91bmRDb2xvcihkd0NvbG9yKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9udCwgRlhfRkxPQVQgZlNpemUpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRGb250KHdzRm9udCwgZlNpemUpOw0KK30NCit2b2lkIElGV0xfRWRpdDo6U2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0U3VnZ2VzdFdvcmRzKHBvaW50Ziwgc1N1Z2dlc3QpOw0KK30NCitGWF9CT09MIElGV0xfRWRpdDo6UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBGWF9CU1RSIGJzUmVwbGFjZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlJlcGxhY2VTcGVsbENoZWNrV29yZChwb2ludGYsIGJzUmVwbGFjZSk7DQorfQ0KKyNkZWZpbmUgRldMX0VESVRfTWFyZ2luIDMNCitDRldMX0VkaXRJbXA6OkNGV0xfRWRpdEltcChJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpDQorICAgICwgbV9mVkFsaWduT2Zmc2V0KDAuMGYpDQorICAgICwgbV9mU2Nyb2xsT2Zmc2V0WCgwLjBmKQ0KKyAgICAsIG1fZlNjcm9sbE9mZnNldFkoMC4wZikNCisgICAgLCBtX3BFZHRFbmdpbmUoTlVMTCkNCisgICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCisgICAgLCBtX25TZWxTdGFydCgwKQ0KKyAgICAsIG1fbkxpbWl0KC0xKQ0KKyAgICAsIG1fZkZvbnRTaXplKDApDQorICAgICwgbV9wVmVydFNjcm9sbEJhcihOVUxMKQ0KKyAgICAsIG1fcEhvcnpTY3JvbGxCYXIoTlVMTCkNCisgICAgLCBtX3BDYXJldChOVUxMKQ0KKyAgICAsIG1faU1pbigtMSkNCisgICAgLCBtX2lNYXgoMHhGRkZGRkZGKQ0KKyAgICAsIG1fYlNldFJhbmdlKEZBTFNFKQ0KKyAgICAsIG1fcFRleHRGaWVsZChOVUxMKQ0KKyAgICAsIG1fYmFja0NvbG9yKDApDQorICAgICwgbV91cGRhdGVCYWNrQ29sb3IoRkFMU0UpDQorICAgICwgbV9pQ3VyUmVjb3JkKC0xKQ0KKyAgICAsIG1faU1heFJlY29yZCgxMjgpDQorICAgICwgbV9mU3BhY2VBYm92ZSgwKQ0KKyAgICAsIG1fZlNwYWNlQmVsb3coMCkNCit7DQorICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgICAgbV9ydEVuZ2luZS5SZXNldCgpOw0KKyAgICBtX3J0U3RhdGljLlJlc2V0KCk7DQorfQ0KK0NGV0xfRWRpdEltcDo6Q0ZXTF9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fZlZBbGlnbk9mZnNldCgwLjBmKQ0KKyAgICAsIG1fZlNjcm9sbE9mZnNldFgoMC4wZikNCisgICAgLCBtX2ZTY3JvbGxPZmZzZXRZKDAuMGYpDQorICAgICwgbV9wRWR0RW5naW5lKE5VTEwpDQorICAgICwgbV9iTEJ1dHRvbkRvd24oRkFMU0UpDQorICAgICwgbV9uU2VsU3RhcnQoMCkNCisgICAgLCBtX25MaW1pdCgtMSkNCisgICAgLCBtX2ZGb250U2l6ZSgwKQ0KKyAgICAsIG1fcFZlcnRTY3JvbGxCYXIoTlVMTCkNCisgICAgLCBtX3BIb3J6U2Nyb2xsQmFyKE5VTEwpDQorICAgICwgbV9wQ2FyZXQoTlVMTCkNCisgICAgLCBtX2lNaW4oLTEpDQorICAgICwgbV9pTWF4KDB4RkZGRkZGRikNCisgICAgLCBtX2JTZXRSYW5nZShGQUxTRSkNCisgICAgLCBtX3BUZXh0RmllbGQoTlVMTCkNCisgICAgLCBtX2JhY2tDb2xvcigwKQ0KKyAgICAsIG1fdXBkYXRlQmFja0NvbG9yKEZBTFNFKQ0KKyAgICAsIG1faUN1clJlY29yZCgtMSkNCisgICAgLCBtX2lNYXhSZWNvcmQoMTI4KQ0KKyAgICAsIG1fZlNwYWNlQWJvdmUoMCkNCisgICAgLCBtX2ZTcGFjZUJlbG93KDApDQorew0KKyAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICAgIG1fcnRFbmdpbmUuUmVzZXQoKTsNCisgICAgbV9ydFN0YXRpYy5SZXNldCgpOw0KK30NCitDRldMX0VkaXRJbXA6On5DRldMX0VkaXRJbXAoKQ0KK3sNCisgICAgaWYgKG1fcEVkdEVuZ2luZSkgew0KKyAgICAgICAgbV9wRWR0RW5naW5lLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BFZHRFbmdpbmUgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcENhcmV0KSB7DQorICAgICAgICBtX3BDYXJldC0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wQ2FyZXQgPSBOVUxMOw0KKyAgICB9DQorICAgIENsZWFyUmVjb3JkKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICB3c0NsYXNzID0gRldMX0NMQVNTX0VkaXQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9FZGl0SW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0VkaXQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCkNCit7DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmICghbV9wRGVsZWdhdGUpIHsNCisgICAgICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgICAgfQ0KKyAgICBJbml0Q2FyZXQoKTsNCisgICAgaWYgKCFtX3BFZHRFbmdpbmUpIHsNCisgICAgICAgIEluaXRFbmdpbmUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgICAgICBTaG93Q2FyZXQoRkFMU0UpOw0KKyAgICB9DQorICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KKyAgICB9DQorICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KKyAgICB9DQorICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9FZGl0SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgICAgIGlmIChtX3BFZHRFbmdpbmUpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpVGV4dExlbiA9IG1fcEVkdEVuZ2luZS0+R2V0VGV4dExlbmd0aCgpOw0KKyAgICAgICAgICAgIGlmIChpVGV4dExlbiA+IDApIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgICAgICAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCAwKTsNCisgICAgICAgICAgICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpOw0KKyAgICAgICAgICAgICAgICByZWN0LlNldCgwLCAwLCBzei54LCBzei55KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyKSB7DQorICAgICAgICAgICAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCAqcGZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICAgICAgICAgICAgICByZWN0LndpZHRoICs9ICpwZldpZHRoOw0KKyAgICAgICAgICAgICAgICByZWN0LndpZHRoICs9IEZXTF9FRElUX01hcmdpbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgKnBmV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCisgICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgKz0gKnBmV2lkdGg7DQorICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0ICs9IEZXTF9FRElUX01hcmdpbjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgKQ0KK3sNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgfHwgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgICAgICBTaG93Q2FyZXQoRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCit9DQorRldMX0VSUglDRldMX0VkaXRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgcmV0dXJuCUNGV0xfV2lkZ2V0SW1wOjpTZXRXaWRnZXRSZWN0KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6VXBkYXRlKCkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgTGF5b3V0KCk7DQorICAgIGlmIChtX3J0Q2xpZW50LklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBVcGRhdGVFZGl0RW5naW5lKCk7DQorICAgIFVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgICAgVXBkYXRlU2Nyb2xsKCk7DQorICAgIEluaXRDYXJldCgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRWRpdEltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCisgICAgICAgIGlmIChJc1Nob3dTY3JvbGxCYXIoVFJVRSkpIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1ZTY3JvbGxCYXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0hTY3JvbGxCYXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9FZGl0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCisjZGVmaW5lIEZYX0VESVRfSVNMQVRJTldPUkQodSkJKHUgPT0gMHgyRCB8fCAodSA8PSAweDAwNUEgJiYgdSA+PSAweDAwNDEpIHx8ICh1IDw9IDB4MDA3QSAmJiB1ID49IDB4MDA2MSkgfHwgKHUgPD0gMHgwMkFGICYmIHUgPj0gMHgwMEMwKSB8fCB1ID09IDB4MDAyNykNCitzdGF0aWMgdm9pZCBBZGRTcXVpZ2dseVBhdGgoQ0ZYX1BhdGgmIFBhdGhEYXRhLCBGWF9GTE9BVCBmU3RhcnRYLCBGWF9GTE9BVCBmRW5kWCwgRlhfRkxPQVQgZlksIEZYX0ZMT0FUIGZTdGVwKQ0KK3sNCisgICAgUGF0aERhdGEuTW92ZVRvKGZTdGFydFgsIGZZKTsNCisgICAgRlhfRkxPQVQgZng7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIGZvciAoaSA9IDEsIGZ4ID0gZlN0YXJ0WCArIGZTdGVwOyBmeCA8IGZFbmRYOyBmeCArPSBmU3RlcCwgaSsrKSB7DQorICAgICAgICBQYXRoRGF0YS5MaW5lVG8oZngsIGZZICsgKGkgJiAxKSpmU3RlcCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkFkZFNwZWxsQ2hlY2tPYmooQ0ZYX1BhdGgmIFBhdGhEYXRhLCBGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCwgRlhfRkxPQVQgZk9mZlNldFgsIEZYX0ZMT0FUIGZPZmZTZXRZKQ0KK3sNCisgICAgRlhfRkxPQVQgZlN0YXJ0WCA9IDAuMGY7DQorICAgIEZYX0ZMT0FUIGZFbmRYID0gMC4wZjsNCisgICAgRlhfRkxPQVQgZlkgPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmU3RlcCA9IDAuMGY7DQorICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICAgIENGWF9SZWN0RkFycmF5IHJlY3RBcnJheTsNCisgICAgQ0ZYX1JlY3RGIHJlY3RUZXh0Ow0KKyAgICBjb25zdCBGREVfVFhURURUUEFSQU1TKiB0eHRFZHRQYXJhbXMgPSBtX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgICAgRlhfRkxPQVQgZkFzZW50ID0gKEZYX0ZMT0FUKXR4dEVkdFBhcmFtcy0+cEZvbnQtPkdldEFzY2VudCgpICogdHh0RWR0UGFyYW1zLT5mRm9udFNpemUgLyAxMDAwOw0KKyAgICBwUGFnZS0+Q2FsY1JhbmdlUmVjdEFycmF5KG5TdGFydCwgbkNvdW50LCByZWN0QXJyYXkpOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgcmVjdFRleHQgPSByZWN0QXJyYXkuR2V0QXQoaSk7DQorICAgICAgICBmWSA9IHJlY3RUZXh0LnRvcCArIGZBc2VudCArIGZPZmZTZXRZOw0KKyAgICAgICAgZlN0ZXAgPSB0eHRFZHRQYXJhbXMtPmZGb250U2l6ZSAvIDE2LjBmOw0KKyAgICAgICAgZlN0YXJ0WCA9IHJlY3RUZXh0LmxlZnQgKyBmT2ZmU2V0WDsNCisgICAgICAgIGZFbmRYID0gZlN0YXJ0WCArIHJlY3RUZXh0LldpZHRoKCk7DQorICAgICAgICBBZGRTcXVpZ2dseVBhdGgoUGF0aERhdGEsIGZTdGFydFgsIGZFbmRYLCBmWSwgZlN0ZXApOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdEltcDo6R2V0V29yZEF0UG9pbnQoQ0ZYX1BvaW50RiBwb2ludGYsIEZYX0lOVDMyJiBuQ291bnQpDQorew0KKyAgICByZXR1cm4gMDsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OkdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmc1N1Z2dlc3QpDQorew0KKyAgICBGWF9JTlQzMiBuV29yZENvdW50ID0gMDsNCisgICAgRlhfSU5UMzIgbldvcmRTdGFydCA9IEdldFdvcmRBdFBvaW50KHBvaW50ZiwgbldvcmRDb3VudCk7DQorICAgIGlmIChuV29yZENvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzU3BlbGw7DQorICAgIEdldFRleHQod3NTcGVsbCwgbldvcmRTdGFydCwgbldvcmRDb3VudCk7DQorICAgIENGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbldvcmRDb3VudDsgaSsrKSB7DQorICAgICAgICBpZiAoIUZYX0VESVRfSVNMQVRJTldPUkQod3NTcGVsbFtpXSkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHNMYXRpbldvcmQgKz0gKEZYX0NIQVIpd3NTcGVsbFtpXTsNCisgICAgfQ0KKyAgICBpZiAoc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRldMX0V2dEVkdENoZWNrV29yZCBjaGVja1dvcmRFdmVudDsNCisgICAgY2hlY2tXb3JkRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBjaGVja1dvcmRFdmVudC5ic1dvcmQgPSBzTGF0aW5Xb3JkOw0KKyAgICBjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkID0gVFJVRTsNCisgICAgRGlzcGF0Y2hFdmVudCgmY2hlY2tXb3JkRXZlbnQpOw0KKyAgICBpZiAoY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfRXZ0RWR0R2V0U3VnZ2VzdFdvcmRzIHN1Z2dlc3RXb3Jkc0V2ZW50Ow0KKyAgICBzdWdnZXN0V29yZHNFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHN1Z2dlc3RXb3Jkc0V2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQorICAgIHN1Z2dlc3RXb3Jkc0V2ZW50LmJzQXJyYXlTdWdnZXN0V29yZHMgPSBzU3VnZ2VzdDsNCisgICAgc3VnZ2VzdFdvcmRzRXZlbnQuYlN1Z2dlc3RXb3JkcyA9IEZBTFNFOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZjaGVja1dvcmRFdmVudCk7DQorICAgIHJldHVybiBzdWdnZXN0V29yZHNFdmVudC5iU3VnZ2VzdFdvcmRzOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBGWF9CU1RSIGJzUmVwbGFjZSkNCit7DQorICAgIEZYX0lOVDMyIG5Xb3JkQ291bnQgPSAwOw0KKyAgICBGWF9JTlQzMiBuV29yZFN0YXJ0ID0gR2V0V29yZEF0UG9pbnQocG9pbnRmLCBuV29yZENvdW50KTsNCisgICAgaWYgKG5Xb3JkQ291bnQgPCAxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcGVsbDsNCisgICAgR2V0VGV4dCh3c1NwZWxsLCBuV29yZFN0YXJ0LCBuV29yZENvdW50KTsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuV29yZENvdW50OyBpKyspIHsNCisgICAgICAgIGlmICghRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgew0KKyAgICAgICAgICAgIG5Xb3JkQ291bnQgPSBpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5EZXN0TGVuID0gYnNSZXBsYWNlLkdldExlbmd0aCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Rlc3Q7DQorICAgIEZYX0xQV1NUUiBwQnVmZmVyID0gd3NEZXN0LkdldEJ1ZmZlcihuRGVzdExlbik7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuRGVzdExlbjsgaSsrKSB7DQorICAgICAgICBwQnVmZmVyW2ldID0gYnNSZXBsYWNlW2ldOw0KKyAgICB9DQorICAgIHdzRGVzdC5SZWxlYXNlQnVmZmVyKG5EZXN0TGVuKTsNCisgICAgUmVwbGFjZShuV29yZFN0YXJ0LCBuV29yZENvdW50LCB3c0Rlc3QpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkRyYXdTcGVsbENoZWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBHcmFwaGljcy0+Q29uY2F0TWF0cml4KChDRlhfTWF0cml4KilwTWF0cml4KTsNCisgICAgfQ0KKyAgICBGWF9BUkdCIGNyID0gMHhGRkZGMDAwMDsNCisgICAgQ0ZYX0NvbG9yIGNyTGluZShjcik7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDEuMGY7DQorICAgIENGV0xfRXZ0RWR0Q2hlY2tXb3JkIGNoZWNrV29yZEV2ZW50Ow0KKyAgICBjaGVja1dvcmRFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIENGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7DQorICAgIENGWF9QYXRoIHBhdGhTcGVsbDsNCisgICAgcGF0aFNwZWxsLkNyZWF0ZSgpOw0KKyAgICBGWF9JTlQzMiBuU3RhcnQgPSAwOw0KKyAgICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7DQorICAgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1NwZWxsOw0KKyAgICB0aGlzLT5HZXRUZXh0KHdzU3BlbGwpOw0KKyAgICBGWF9JTlQzMiBuQ29udGVudExlbiA9IHdzU3BlbGwuR2V0TGVuZ3RoKCk7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbnRlbnRMZW47IGkrKykgew0KKyAgICAgICAgaWYgKEZYX0VESVRfSVNMQVRJTldPUkQod3NTcGVsbFtpXSkpIHsNCisgICAgICAgICAgICBpZiAoc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgblN0YXJ0ID0gaTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc0xhdGluV29yZCArPSAoRlhfQ0hBUil3c1NwZWxsW2ldOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjaGVja1dvcmRFdmVudC5ic1dvcmQgPSBzTGF0aW5Xb3JkOw0KKyAgICAgICAgICAgIGNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQgPSBUUlVFOw0KKyAgICAgICAgICAgIERpc3BhdGNoRXZlbnQoJmNoZWNrV29yZEV2ZW50KTsNCisgICAgICAgICAgICBpZiAoIXNMYXRpbldvcmQuSXNFbXB0eSgpICYmICFjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkKSB7DQorICAgICAgICAgICAgICAgIEFkZFNwZWxsQ2hlY2tPYmoocGF0aFNwZWxsLCBuU3RhcnQsIHNMYXRpbldvcmQuR2V0TGVuZ3RoKCksIGZPZmZTZXRYLCBmT2ZmU2V0WSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNMYXRpbldvcmQuRW1wdHkoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBjaGVja1dvcmRFdmVudC5ic1dvcmQgPSBzTGF0aW5Xb3JkOw0KKyAgICBjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkID0gVFJVRTsNCisgICAgRGlzcGF0Y2hFdmVudCgmY2hlY2tXb3JkRXZlbnQpOw0KKyAgICBpZiAoIXNMYXRpbldvcmQuSXNFbXB0eSgpICYmICFjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkKSB7DQorICAgICAgICBBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCwgblN0YXJ0LCBzTGF0aW5Xb3JkLkdldExlbmd0aCgpLCBmT2ZmU2V0WCwgZk9mZlNldFkpOw0KKyAgICB9DQorICAgIGlmICghcGF0aFNwZWxsLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IG1fcnRFbmdpbmU7DQorICAgICAgICBDRlhfTWF0cml4IG10Ow0KKyAgICAgICAgbXQuU2V0KDEsIDAsIDAsIDEsIGZPZmZTZXRYLCBmT2ZmU2V0WSk7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgICAgICAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRDbGlwUmVjdChydENsaXApOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JMaW5lKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDApOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoU3BlbGwsIE5VTEwpOw0KKyAgICB9DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKG1fcnRDbGllbnQuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgaWYgKCFtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIERyYXdUZXh0QmsocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmIChtX3BFZHRFbmdpbmUpIHsNCisgICAgICAgIERyYXdDb250ZW50KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgJiYgIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkpIHsNCisgICAgICAgIERyYXdTcGVsbENoZWNrKHBHcmFwaGljcywgcE1hdHJpeCk7DQorICAgIH0NCisgICAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgICAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfRURUX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoSGFzRWRnZSgpKSB7DQorICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0VEVF9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCisgICAgfQ0KKyAgICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICAgIH0NCisgICAgaWYgKG1fcENhcmV0KSB7DQorICAgICAgICBtX3BDYXJldC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICAgIH0NCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBtX3BFZHRFbmdpbmUtPlNldFRleHQod3NUZXh0KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX0VkaXRJbXA6OkdldFRleHRMZW5ndGgoKSBjb25zdA0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIC0xKTsNCisgICAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+R2V0VGV4dExlbmd0aCgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQgLCBGWF9JTlQzMiBuQ291bnQgKSBjb25zdA0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCisgICAgbV9wRWR0RW5naW5lLT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpDbGVhclRleHQoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCisgICAgbV9wRWR0RW5naW5lLT5DbGVhclRleHQoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX0VkaXRJbXA6OkdldENhcmV0UG9zKCkgY29uc3QNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCAtMSk7DQorICAgIHJldHVybiBtX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdEltcDo6U2V0Q2FyZXRQb3MoRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIC0xKTsNCisgICAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkFkZFNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIG1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdEltcDo6Q291bnRTZWxSYW5nZXMoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIDApOw0KKyAgICByZXR1cm4gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdEltcDo6R2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIC0xKTsNCisgICAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6Q2xlYXJTZWxlY3Rpb25zKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIG1fcEVkdEVuZ2luZS0+Q2xlYXJTZWxlY3Rpb24oKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX0VkaXRJbXA6OkdldExpbWl0KCkNCit7DQorICAgIHJldHVybiBtX25MaW1pdDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldExpbWl0KEZYX0lOVDMyIG5MaW1pdCkNCit7DQorICAgIG1fbkxpbWl0ID0gbkxpbWl0Ow0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgICBtX3BFZHRFbmdpbmUtPlNldExpbWl0KG5MaW1pdCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgbV9wRWR0RW5naW5lLT5TZXRBbGlhc0NoYXIod0FsaWFzKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIG1fcEVkdEVuZ2luZS0+U2V0Rm9ybWF0QmxvY2soMCwgd3NGb3JtYXQpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpJbnNlcnQoRlhfSU5UMzIgblN0YXJ0LCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIGlmICgJKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KQ0KKyAgICAgICAgICAgIHx8IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBtX3BFZHRFbmdpbmUtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbik7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRlbGV0ZVNlbGVjdGlvbnMoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgbV9wRWR0RW5naW5lLT5EZWxldGUoLTEpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRlbGV0ZVJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIG1fcEVkdEVuZ2luZS0+RGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpSZXBsYWNlU2VsZWN0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIEZYX0lOVDMyIG5TdGFydDsNCisgICAgICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgICAgIG1fcEVkdEVuZ2luZS0+UmVwbGFjZShuU3RhcnQsIG5Db3VudCwgd3NSZXBsYWNlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpSZXBsYWNlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkxlbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgICBtX3BFZHRFbmdpbmUtPlJlcGxhY2UoblN0YXJ0LCBuTGVuLCB3c1JlcGxhY2UpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpEb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCisgICAgaWYgKAkobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpDQorICAgICAgICAgICAgfHwJKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgSUZXTF9BZGFwdGVyTmF0aXZlICpwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IgKnBDbGlwQm9yZGVyID0gcE5hdGl2ZS0+R2V0Q2xpcGJvYXJkTWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENsaXBCb3JkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgc3dpdGNoKGlDbWQpIHsNCisgICAgICAgIGNhc2UgMTogew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBuU3RhcnQ7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoMCwgblN0YXJ0KTsNCisgICAgICAgICAgICAgICAgaWYgKG5Db3VudCA8IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgICAgICAgICAgICAgcENsaXBCb3JkZXItPlNldFN0cmluZ0RhdGEod3NUZXh0KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSAyOiB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIG5TdGFydDsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZSgwLCBuU3RhcnQpOw0KKyAgICAgICAgICAgICAgICBpZiAobkNvdW50IDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wRWR0RW5naW5lLT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICAgICAgICAgICAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgICAgICAgICAgICAgICAgbV9wRWR0RW5naW5lLT5DbGVhclNlbGVjdGlvbigpOw0KKyAgICAgICAgICAgICAgICBwQ2xpcEJvcmRlci0+U2V0U3RyaW5nRGF0YSh3c1RleHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIDM6IHsNCisgICAgICAgICAgICAgICAgcENsaXBCb3JkZXItPkdldFN0cmluZ0RhdGEod3NUZXh0KTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgaWYgKGlMZW4gPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAod3NUZXh0W2lMZW5dID09IEwnXDAnKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaUxlbiA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpTGVuIC0tOw0KKyAgICAgICAgICAgICAgICAgICAgd3NUZXh0ID0gd3NUZXh0LkxlZnQoaUxlbik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgblBvcyA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgICAgICAgICAgICAgICAgbV9wRWR0RW5naW5lLT5JbnNlcnQoblBvcywgd3NUZXh0LCBpTGVuKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdzQ29weS5FbXB0eSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIEZYX0lOVDMyIG5TdGFydCwgbkxlbmd0aDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgbkxlbmd0aCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RlbXAsIG5TdGFydCwgbkxlbmd0aCk7DQorICAgICAgICB3c0NvcHkgKz0gd3NUZW1wOw0KKyAgICAgICAgd3NUZW1wLkVtcHR5KCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZBTFNFKTsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgICBpZiAobkNvdW50ID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3c0N1dC5FbXB0eSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIEZYX0lOVDMyIG5TdGFydCwgbkxlbmd0aDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgbkxlbmd0aCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RlbXAsIG5TdGFydCwgbkxlbmd0aCk7DQorICAgICAgICB3c0N1dCArPSB3c1RlbXA7DQorICAgICAgICB3c1RlbXAuRW1wdHkoKTsNCisgICAgfQ0KKyAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZSgwKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQorICAgIEZYX0lOVDMyIG5DYXJldCA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgICAgRlhfSU5UMzIgaUVycm9yID0gbV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCBGWF9MUENXU1RSKHdzUGFzdGUpLCB3c1Bhc3RlLkdldExlbmd0aCgpKTsNCisgICAgaWYgKGlFcnJvciA8IDApIHsNCisgICAgICAgIFByb2Nlc3NJbnNlcnRFcnJvcihpRXJyb3IpOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6RGVsZXRlKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKG5Db3VudCA8IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZSgwKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpSZWRvKEZYX0JTVFIgYnNSZWNvcmQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTm9SZWRvVW5kbykgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+UmVkbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpVbmRvKEZYX0JTVFIgYnNSZWNvcmQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTm9SZWRvVW5kbykgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+VW5kbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpVbmRvKCkNCit7DQorICAgIGlmICghQ2FuVW5kbygpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNSZWNvcmQgPSBtX1JlY29yZEFyclttX2lDdXJSZWNvcmQtLV07DQorICAgIHJldHVybiBVbmRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTAlDRldMX0VkaXRJbXA6OlJlZG8oKQ0KK3sNCisgICAgaWYgKCFDYW5SZWRvKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1JlY29yZCA9IG1fUmVjb3JkQXJyWysrbV9pQ3VyUmVjb3JkXTsNCisgICAgcmV0dXJuIFJlZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MCUNGV0xfRWRpdEltcDo6Q2FuVW5kbygpDQorew0KKyAgICByZXR1cm4gbV9pQ3VyUmVjb3JkID49IDA7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpDYW5SZWRvKCkNCit7DQorICAgIHJldHVybiBtX2lDdXJSZWNvcmQgPCBtX1JlY29yZEFyci5HZXRTaXplKCkgLSAxOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIEZERV9MUFRYVEVEVFBBUkFNUyBwUGFyYW1zID0gKEZERV9MUFRYVEVEVFBBUkFNUyltX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgICAgcFBhcmFtcy0+ZlRhYldpZHRoID0gZlRhYldpZHRoOw0KKyAgICBwUGFyYW1zLT5iVGFiRXF1aWRpc3RhbnQgPSBiRXF1aWRpc3RhbnQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX0VkaXRJbXA6OlNldE91dGVyKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BPdXRlciA9IHBPdXRlcjsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfRWRpdEltcDo6U2V0TnVtYmVyUmFuZ2UoRlhfSU5UMzIgaU1pbiwgRlhfSU5UMzIgaU1heCkNCit7DQorICAgIG1faU1pbiA9IGlNaW47DQorICAgIG1faU1heCA9IGlNYXg7DQorICAgIG1fYlNldFJhbmdlID0gVFJVRTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6T25fQ2FyZXRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRlhfSU5UMzIgblBhZ2UsIEZYX0JPT0wgYlZpc2libGUgKQ0KK3sNCisgICAgaWYgKG1fcnRFbmdpbmUuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSZXBhaW50Q29udGVudCA9IFVwZGF0ZU9mZnNldCgpOw0KKyAgICBVcGRhdGVDYXJldCgpOw0KKyAgICBDRlhfUmVjdEYgcnRJbnZhbGlkOw0KKyAgICBydEludmFsaWQuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBGWF9CT09MIGJSZXBhaW50U2Nyb2xsID0gRkFMU0U7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpIHsNCisgICAgICAgIElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsID0gVXBkYXRlU2Nyb2xsKCk7DQorICAgICAgICBpZiAocFNjcm9sbCkgew0KKyAgICAgICAgICAgIHBTY3JvbGwtPkdldFdpZGdldFJlY3QocnRJbnZhbGlkKTsNCisgICAgICAgICAgICBiUmVwYWludFNjcm9sbCA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJSZXBhaW50Q29udGVudCB8fCBiUmVwYWludFNjcm9sbCkgew0KKyAgICAgICAgaWYgKGJSZXBhaW50Q29udGVudCkgew0KKyAgICAgICAgICAgIHJ0SW52YWxpZC5VbmlvbihtX3J0RW5naW5lKTsNCisgICAgICAgIH0NCisgICAgICAgIFJlcGFpbnQoJnJ0SW52YWxpZCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6Ok9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8gJkNoYW5nZUluZm8pDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlRXggPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgICBpZiAoZHdTdHlsZUV4ICYgRldMX1NUWUxFRVhUX0VEVF9WQWxpZ25NYXNrKSB7DQorICAgICAgICBVcGRhdGVWQWxpZ25tZW50KCk7DQorICAgIH0NCisgICAgSUZERV9UeHRFZHRQYWdlICpwYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBGWF9GTE9BVCBmQ29udGVudFdpZHRoID0gcGFnZS0+R2V0Q29udGVudHNCb3goKS53aWR0aDsNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRIZWlnaHQgPSBwYWdlLT5HZXRDb250ZW50c0JveCgpLmhlaWdodDsNCisgICAgQ0ZYX1JlY3RGIHJ0VGVtcDsNCisgICAgR2V0Q2xpZW50UmVjdChydFRlbXApOw0KKyAgICBGWF9CT09MIGJIU2VsZkFkYXB0aW9uID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbjsNCisgICAgRlhfQk9PTCBiVlNlbGZBZGFwdGlvbiA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb247DQorICAgIEZYX0JPT0wgYk5lZWRVcGRhdGUgPSBGQUxTRTsNCisgICAgaWYgKGJIU2VsZkFkYXB0aW9uIHx8IGJWU2VsZkFkYXB0aW9uKSB7DQorICAgICAgICBDRldMX0V2dEVkdFByZVNlbGZBZGFwdGlvbiBldnQ7DQorICAgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgZXZ0LmJIU2VsZkFkYXB0aW9uID0gVFJVRTsNCisgICAgICAgIGV2dC5iVlNlbGZBZGFwdGlvbiA9IFRSVUU7DQorICAgICAgICBGWF9GTE9BVCBmV2lkdGg7DQorICAgICAgICBGWF9GTE9BVCBmSGlnaHQ7DQorICAgICAgICBmV2lkdGggPSBiSFNlbGZBZGFwdGlvbiA/IGZDb250ZW50V2lkdGggOiBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoOw0KKyAgICAgICAgZkhpZ2h0ID0gYlZTZWxmQWRhcHRpb24gPyBmQ29udGVudEhlaWdodCA6IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICAgICAgZXZ0LnJ0QWZ0ZXJDaGFuZ2UuU2V0KDAsIDAsIGZXaWR0aCwgZkhpZ2h0KTsNCisgICAgICAgIERpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgICAgICBpZiAoIWV2dC5iSFNlbGZBZGFwdGlvbikgew0KKyAgICAgICAgICAgIE1vZGlmeVN0eWxlc0V4KDAsIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbiB8IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFldnQuYlZTZWxmQWRhcHRpb24pIHsNCisgICAgICAgICAgICBNb2RpZnlTdHlsZXNFeCgwLCBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb24gfCBGV0xfU1RZTEVFWFRfRURUX0F1dG9WU2Nyb2xsKTsNCisgICAgICAgIH0NCisgICAgICAgIGJOZWVkVXBkYXRlID0gKGJIU2VsZkFkYXB0aW9uICYmICFldnQuYkhTZWxmQWRhcHRpb24pIHx8IChiVlNlbGZBZGFwdGlvbiAmJiAhZXZ0LmJWU2VsZkFkYXB0aW9uKTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmQ29udGVudFdpZHRoMSA9IGZDb250ZW50V2lkdGg7DQorICAgIEZYX0ZMT0FUIGZDb250ZW50SGVpZ2h0MSA9IGZDb250ZW50SGVpZ2h0Ow0KKyAgICBpZiAoYk5lZWRVcGRhdGUpIHsNCisgICAgICAgIFVwZGF0ZUVkaXRQYXJhbXMoKTsNCisgICAgICAgIFVwZGF0ZUVkaXRMYXlvdXQoKTsNCisgICAgICAgIElGREVfVHh0RWR0UGFnZSAqcGFnZTEgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICAgICAgICBmQ29udGVudFdpZHRoMSA9IHBhZ2UxLT5HZXRDb250ZW50c0JveCgpLndpZHRoOw0KKyAgICAgICAgZkNvbnRlbnRIZWlnaHQxID0gcGFnZTEtPkdldENvbnRlbnRzQm94KCkuaGVpZ2h0Ow0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uKSB7DQorICAgICAgICBydFRlbXAud2lkdGggPSBGWF9NQVgobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwgZkNvbnRlbnRXaWR0aDEpOw0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCA9IGZDb250ZW50V2lkdGgxOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WU2VsZkFkYXB0aW9uKSB7DQorICAgICAgICBydFRlbXAuaGVpZ2h0ID0gRlhfTUFYKG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0LCBmQ29udGVudEhlaWdodDEpOw0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQgPSBmQ29udGVudEhlaWdodDE7DQorICAgIH0NCisgICAgQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCBldmVudDsNCisgICAgZXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBldmVudC5uQ2hhbmdlVHlwZSA9IENoYW5nZUluZm8ubkNoYW5nZVR5cGU7DQorICAgIGV2ZW50LndzSW5zZXJ0ID0gQ2hhbmdlSW5mby53c0luc2VydDsNCisgICAgZXZlbnQud3NEZWxldGUgPSBDaGFuZ2VJbmZvLndzRGVsZXRlOw0KKyAgICBldmVudC53c1ByZXZUZXh0ID0gQ2hhbmdlSW5mby53c1ByZXZUZXh0Ow0KKyAgICBEaXNwYXRjaEV2ZW50KCZldmVudCk7DQorICAgIExheW91dFNjcm9sbEJhcigpOw0KKyAgICBSZXBhaW50KCZydFRlbXApOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6T25fU2VsQ2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQpDQorew0KKyAgICBDRlhfUmVjdEYgcnRUZW1wOw0KKyAgICBHZXRDbGllbnRSZWN0KHJ0VGVtcCk7DQorICAgIFJlcGFpbnQoJnJ0VGVtcCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpPbl9QYWdlTG9hZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIEZYX0lOVDMyIG5QYWdlSW5kZXgsIEZYX0lOVDMyIG5QdXJwb3NlKQ0KK3sNCisgICAgSUZERV9UeHRFZHRFbmdpbmUgKnBFZHRFbmdpbmUgPSBtX3BFZHRFbmdpbmU7DQorICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBwRWR0RW5naW5lLT5HZXRQYWdlKG5QYWdlSW5kZXgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBGQUxTRSk7DQorICAgIHBQYWdlLT5Mb2FkUGFnZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6Ok9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBGWF9JTlQzMiBuUGFnZUluZGV4LCBGWF9JTlQzMiBuUHVycG9zZSkNCit7DQorICAgIElGREVfVHh0RWR0RW5naW5lICpwRWR0RW5naW5lID0gbV9wRWR0RW5naW5lOw0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gcEVkdEVuZ2luZS0+R2V0UGFnZShuUGFnZUluZGV4KTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFnZSwgRkFMU0UpOw0KKyAgICBwUGFnZS0+VW5sb2FkUGFnZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6Ok9uX0FkZERvUmVjb3JkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRlhfQlNUUiBic0RvUmVjb3JkKQ0KK3sNCisgICAgQWRkRG9SZWNvcmQoYnNEb1JlY29yZCk7DQorICAgIENGV0xfV2lkZ2V0SW1wICpwU3JjVGFyZ2V0ID0gR2V0Um9vdE91dGVyKCk7DQorICAgIGlmICghcFNyY1RhcmdldCkgew0KKyAgICAgICAgcFNyY1RhcmdldCA9IHRoaXM7DQorICAgIH0NCisgICAgQ0ZXTF9FdnRFZHRBZGREb1JlY29yZCBldnQ7DQorICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIGV2dC5tX3dzRG9SZWNvcmQgPSBic0RvUmVjb3JkOw0KKyAgICBtX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQoJmV2dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRlhfSU5UMzIgbkJsb2NrSW5kZXgsIEZYX0lOVDMyIG5GaWVsZEluZGV4LCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGRUZXh0LCBGWF9JTlQzMiBuQ2hhckluZGV4KQ0KK3sNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZUJsb2NrKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRlhfSU5UMzIgbkJsb2NrSW5kZXgpDQorew0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6Ok9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIEZYX0lOVDMyIG5CbG9ja0luZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja1RleHQpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgSUZXTF9XaWRnZXQgKnBEc3QgPSBHZXRPdXRlcigpOw0KKyAgICBpZiAoIXBEc3QpIHsNCisgICAgICAgIHBEc3QgPSAoSUZXTF9XaWRnZXQqKXRoaXM7DQorICAgIH0NCisgICAgQ0ZXTF9FdnRFZHRWYWxpZGF0ZSBldmVudDsNCisgICAgZXZlbnQucERzdFdpZGdldCA9IHBEc3Q7DQorICAgIGV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgZXZlbnQud3NJbnNlcnQgPSB3c1RleHQ7DQorICAgIGV2ZW50LmJWYWxpZGF0ZSA9IFRSVUU7DQorICAgIERpc3BhdGNoRXZlbnQoJmV2ZW50KTsNCisgICAgcmV0dXJuIGV2ZW50LmJWYWxpZGF0ZTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEJhY2tncm91bmRDb2xvcihGWF9EV09SRCBjb2xvcikNCit7DQorICAgIG1fYmFja0NvbG9yID0gY29sb3I7DQorICAgIG1fdXBkYXRlQmFja0NvbG9yID0gVFJVRTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb250LCBGWF9GTE9BVCBmU2l6ZSkNCit7DQorICAgIG1fd3NGb250ID0gd3NGb250Ow0KKyAgICBtX2ZGb250U2l6ZSA9IGZTaXplOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpTZXRTY3JvbGxPZmZzZXQoRlhfRkxPQVQgZlNjcm9sbE9mZnNldCkNCit7DQorICAgIG1fZlNjcm9sbE9mZnNldFkgPSBmU2Nyb2xsT2Zmc2V0Ow0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6RHJhd1RleHRCayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0VEVF9CYWNrZ3JvdW5kOw0KKyAgICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZDsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5ID8NCisgICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfRURUX1JlYWRPbmx5IDogRldMX1BBUlRTVEFURV9FRFRfTm9ybWFsOw0KKyAgICBGWF9EV09SRCBkd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKTsNCisgICAgaWYgKCBkd1N0YXRlcykgew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRURUX0Rpc2FibGU7DQorICAgIH0NCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICBpZiAoIUlzU2hvd1Njcm9sbEJhcihUUlVFKSB8fCAhSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFNjb3JsbDsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChydFNjb3JsbCk7DQorICAgIEZYX0ZMT0FUIGZTdGF0aWNXaWR0aCA9IHJ0U2NvcmxsLmhlaWdodDsNCisgICAgQ0ZYX1JlY3RGIHJ0U3RhdGljOw0KKyAgICBydFN0YXRpYy5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gcnRTY29ybGwuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5ib3R0b20oKSAtIHJ0U2NvcmxsLmhlaWdodCwNCisgICAgICAgICAgICAgICAgIHJ0U2NvcmxsLmhlaWdodCwNCisgICAgICAgICAgICAgICAgIHJ0U2NvcmxsLmhlaWdodCk7DQorICAgIHBhcmFtLm1fZHdEYXRhID0gRldMX1BBUlREQVRBX0VEVF9TdGF0aWNCYWNrZ3JvdW5kOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IHJ0U3RhdGljOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpEcmF3Q29udGVudChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BFZHRFbmdpbmUpOw0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBQYWdlKTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQpIHsNCisgICAgICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRDbGlwID0gbV9ydEVuZ2luZTsNCisgICAgRlhfRkxPQVQgZk9mZlNldFggPSBtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYOw0KKyAgICBGWF9GTE9BVCBmT2ZmU2V0WSA9IG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldDsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIGZPZmZTZXRYLCBmT2ZmU2V0WSk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlNob3dTZWwgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsKSB8fCAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgaWYgKGJTaG93U2VsKSB7DQorICAgICAgICBJRldMX1dpZGdldCAqcEZvcm0gPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgICAgICAgIGlmIChwRm9ybSkgew0KKyAgICAgICAgICAgIGJTaG93U2VsID0gKHBGb3JtLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZCkgIT0gRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5TZWxDb3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKGJTaG93U2VsICYmIG5TZWxDb3VudCA+IDApIHsNCisgICAgICAgIEZYX0lOVDMyIG5QYWdlQ2hhclN0YXJ0ID0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KKyAgICAgICAgRlhfSU5UMzIgblBhZ2VDaGFyQ291bnQgPSBwUGFnZS0+R2V0Q2hhckNvdW50KCk7DQorICAgICAgICBGWF9JTlQzMiBuUGFnZUNoYXJFbmQJPSBuUGFnZUNoYXJTdGFydCArIG5QYWdlQ2hhckNvdW50IC0gMTsNCisgICAgICAgIEZYX0lOVDMyIG5DaGFyQ291bnQ7DQorICAgICAgICBGWF9JTlQzMiBuQ2hhclN0YXJ0Ow0KKyAgICAgICAgQ0ZYX1JlY3RGQXJyYXkgcmVjdEFycjsNCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5TZWxDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgIG5DaGFyQ291bnQgPSBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKGksIG5DaGFyU3RhcnQpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5DaGFyRW5kID0gbkNoYXJTdGFydCArIG5DaGFyQ291bnQgLSAxOw0KKyAgICAgICAgICAgIGlmIChuQ2hhckVuZCA8IG5QYWdlQ2hhclN0YXJ0IHx8IG5DaGFyU3RhcnQgPiBuUGFnZUNoYXJFbmQpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5CZ24gPSBGWF9NQVgobkNoYXJTdGFydCwgblBhZ2VDaGFyU3RhcnQpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5FbmQgPSBGWF9NSU4obkNoYXJFbmQsIG5QYWdlQ2hhckVuZCk7DQorICAgICAgICAgICAgcFBhZ2UtPkNhbGNSYW5nZVJlY3RBcnJheShuQmduIC0gblBhZ2VDaGFyU3RhcnQsIG5FbmQgLSBuQmduICsgMSwgcmVjdEFycik7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBuQ291bnQgPSByZWN0QXJyLkdldFNpemUoKTsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgICAgIHJlY3RBcnJbaV0ubGVmdCArPSBmT2ZmU2V0WDsNCisgICAgICAgICAgICByZWN0QXJyW2ldLnRvcCArPSBmT2ZmU2V0WTsNCisgICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0QXJyW2ldLmxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdEFycltpXS50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdEFycltpXS53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0QXJyW2ldLmhlaWdodCk7DQorICAgICAgICB9DQorICAgICAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICAgICAgcGFyYW0ubV9tYXRyaXggPSAqcE1hdHJpeDsNCisgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9FRFRfQmFja2dyb3VuZDsNCisgICAgICAgIHBhcmFtLm1fcFBhdGggPSAmcGF0aDsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBDRlhfUmVuZGVyRGV2aWNlICpwUmVuZGVyRGV2ID0gcEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVuZGVyRGV2KTsNCisgICAgSUZERV9SZW5kZXJEZXZpY2UgKnBSZW5kZXJEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBSZW5kZXJEZXYpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZW5kZXJEZXZpY2UpOw0KKyAgICBJRkRFX1JlbmRlckNvbnRleHQgKnBSZW5kZXJDb250ZXh0ID0gSUZERV9SZW5kZXJDb250ZXh0OjpDcmVhdGUoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVuZGVyQ29udGV4dCk7DQorICAgIHBSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICAgIHBSZW5kZXJDb250ZXh0LT5TdGFydFJlbmRlcihwUmVuZGVyRGV2aWNlLCAoSUZERV9DYW52YXNTZXQqKXBQYWdlLCBtdCk7DQorICAgIHBSZW5kZXJDb250ZXh0LT5Eb1JlbmRlcihOVUxMKTsNCisgICAgcFJlbmRlckNvbnRleHQtPlJlbGVhc2UoKTsNCisgICAgcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQpIHsNCisgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgRlhfSU5UMzIgaUxpbWl0ID0gbV9uTGltaXQgPiAwID8gbV9uTGltaXQgOiAxOw0KKyAgICAgICAgRlhfRkxPQVQgZlN0ZXAgPSBtX3J0RW5naW5lLndpZHRoIC8gaUxpbWl0Ow0KKyAgICAgICAgRlhfRkxPQVQgZkxlZnQgPSBtX3J0RW5naW5lLmxlZnQgKyAxOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IGlMaW1pdDsgaSsrKSB7DQorICAgICAgICAgICAgZkxlZnQgKz0gZlN0ZXA7DQorICAgICAgICAgICAgcGF0aC5BZGRMaW5lKGZMZWZ0LCBtX3J0Q2xpZW50LnRvcCwgZkxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRURUX0NvbWJUZXh0TGluZTsNCisgICAgICAgIHBhcmFtLm1fcFBhdGggPSAmcGF0aDsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0RW5naW5lKCkNCit7DQorICAgIFVwZGF0ZUVkaXRQYXJhbXMoKTsNCisgICAgVXBkYXRlRWRpdExheW91dCgpOw0KKyAgICBpZiAobV9uTGltaXQgPiAtMSkgew0KKyAgICAgICAgbV9wRWR0RW5naW5lLT5TZXRMaW1pdChtX25MaW1pdCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlVwZGF0ZUVkaXRQYXJhbXMoKQ0KK3sNCisgICAgRkRFX1RYVEVEVFBBUkFNUyBwYXJhbXM7DQorICAgIHBhcmFtcy5uSG9yelNjYWxlID0gMTAwOw0KKyAgICBwYXJhbXMuZlBsYXRlV2lkdGggPSBtX3J0RW5naW5lLndpZHRoOw0KKyAgICBwYXJhbXMuZlBsYXRlSGVpZ2h0ID0gbV9ydEVuZ2luZS5oZWlnaHQ7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX1JUTExheW91dCkgew0KKyAgICAgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9SVEw7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZlcnRpY2FsTGF5b3V0KSB7DQorICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WZXJ0aWNhbENoYXJzKSB7DQorICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0NoYXJWZXJ0aWFsOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZXZlcnNlTGluZSkgew0KKyAgICAgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXJhYmljU2hhcGVzKSB7DQorICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0FyYWJpY1NoYXBlczsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfRXhwYW5kVGFiKSB7DQorICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0V4cGFuZFRhYjsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQpIHsNCisgICAgICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQ7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0KSB7DQorICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WYWxpZGF0ZSkgew0KKyAgICAgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9QYXNzd29yZCkgew0KKyAgICAgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkOw0KKyAgICB9DQorICAgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzaykgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0hOZWFyOiB7DQorICAgICAgICAgICAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9MZWZ0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjogew0KKyAgICAgICAgICAgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fQ2VudGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSEZhcjogew0KKyAgICAgICAgICAgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fUmlnaHQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzaykgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDogew0KKyAgICAgICAgICAgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fSnVzdGlmaWVkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfRGlzdHJpYnV0ZWQ6IHsNCisgICAgICAgICAgICAgICAgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9Ob3JtYWw7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpIHsNCisgICAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzOw0KKyAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpID09IDAgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsKSA9PSAwKSB7DQorICAgICAgICAgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCB8IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcno7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgPT0gMCAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpID09IDApIHsNCisgICAgICAgICAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBhcmFtcy5mUGxhdGVIZWlnaHQgPSAweDAwRkZGRkZGOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCkgPT0gMCkgew0KKyAgICAgICAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yejsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoCShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkNCisgICAgICAgICAgICB8fAkobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9SZWFkT25seTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCAqcEZvbnRTaXplID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZSk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZvbnRTaXplKTsNCisgICAgbV9mRm9udFNpemUgPSAqcEZvbnRTaXplOw0KKyAgICBGWF9EV09SRCAqcEZvbnRDb2xvciA9IChGWF9EV09SRCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRm9udENvbG9yKTsNCisgICAgcGFyYW1zLmR3Rm9udENvbG9yID0gKnBGb250Q29sb3I7DQorICAgIEZYX0ZMT0FUICpwTGluZUhlaWdodCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocExpbmVIZWlnaHQpOw0KKyAgICBwYXJhbXMuZkxpbmVTcGFjZSA9ICpwTGluZUhlaWdodDsNCisgICAgSUZYX0ZvbnQgKnBGb250ID0gKElGWF9Gb250KilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9Gb250KTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRm9udCk7DQorICAgIHBhcmFtcy5wRm9udAkJCT0gcEZvbnQ7DQorICAgIHBhcmFtcy5mRm9udFNpemUJCT0gbV9mRm9udFNpemU7DQorICAgIHBhcmFtcy5uTGluZUNvdW50CQk9IChGWF9JTlQzMikocGFyYW1zLmZQbGF0ZUhlaWdodCAvIHBhcmFtcy5mTGluZVNwYWNlKTsNCisgICAgaWYgKHBhcmFtcy5uTGluZUNvdW50IDw9IDApIHsNCisgICAgICAgIHBhcmFtcy5uTGluZUNvdW50ID0gMTsNCisgICAgfQ0KKyAgICBwYXJhbXMuZlRhYldpZHRoCQk9IHBhcmFtcy5mRm9udFNpemUgKiAxOw0KKyAgICBwYXJhbXMuYlRhYkVxdWlkaXN0YW50CT0gVFJVRTsNCisgICAgcGFyYW1zLndMaW5lQnJlYWtDaGFyCT0gTCdcbic7DQorICAgIHBhcmFtcy5uQ2hhclJvdGF0aW9uCT0gMDsNCisgICAgcGFyYW1zLnBFdmVudFNpbmsJCT0gdGhpczsNCisgICAgbV9wRWR0RW5naW5lLT5TZXRFZGl0UGFyYW1zKHBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0TGF5b3V0KCkNCit7DQorICAgIGlmIChtX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKSA8PSAwKSB7DQorICAgICAgICBtX3BFZHRFbmdpbmUtPlNldFRleHRCeVN0cmVhbShOVUxMKTsNCisgICAgfQ0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBpZiAocFBhZ2UpIHsNCisgICAgICAgIHBQYWdlLT5VbmxvYWRQYWdlKCk7DQorICAgICAgICBwUGFnZSA9IE5VTEw7DQorICAgIH0NCisgICAgbV9wRWR0RW5naW5lLT5TdGFydExheW91dCgpOw0KKyAgICBtX3BFZHRFbmdpbmUtPkRvTGF5b3V0KE5VTEwpOw0KKyAgICBtX3BFZHRFbmdpbmUtPkVuZExheW91dCgpOw0KKyAgICBwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgICAgaWYgKHBQYWdlKSB7DQorICAgICAgICBwUGFnZS0+TG9hZFBhZ2UoKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6VXBkYXRlT2Zmc2V0KCkNCit7DQorICAgIENGWF9SZWN0RiBydENhcmV0Ow0KKyAgICBtX3BFZHRFbmdpbmUtPkdldENhcmV0UmVjdChydENhcmV0KTsNCisgICAgRlhfRkxPQVQgZk9mZlNldFggPSBtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYOw0KKyAgICBGWF9GTE9BVCBmT2ZmU2V0WSA9IG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldDsNCisgICAgcnRDYXJldC5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsNCisgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEVpZHQgPSBtX3J0RW5naW5lOw0KKyAgICBpZiAocnRFaWR0LkNvbnRhaW5zKHJ0Q2FyZXQpKSB7DQorICAgICAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFnZSwgRkFMU0UpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RkRFID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICAgICAgICBydEZERS5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsNCisgICAgICAgIGlmIChydEZERS5yaWdodCgpIDwgcnRFaWR0LnJpZ2h0KCkgJiYgbV9mU2Nyb2xsT2Zmc2V0WCA+IDApIHsNCisgICAgICAgICAgICBtX2ZTY3JvbGxPZmZzZXRYICs9IHJ0RkRFLnJpZ2h0KCkgLSBydEVpZHQucmlnaHQoKTsNCisgICAgICAgICAgICBpZiAobV9mU2Nyb2xsT2Zmc2V0WCA8IDApIHsNCisgICAgICAgICAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJ0RkRFLmJvdHRvbSgpIDwgcnRFaWR0LmJvdHRvbSgpICYmIG1fZlNjcm9sbE9mZnNldFkgPiAwKSB7DQorICAgICAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBydEZERS5ib3R0b20oKSAtIHJ0RWlkdC5ib3R0b20oKTsNCisgICAgICAgICAgICBpZiAobV9mU2Nyb2xsT2Zmc2V0WSA8IDApIHsNCisgICAgICAgICAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgb2Zmc2V0WCA9IDAuMDsNCisgICAgICAgIEZYX0ZMT0FUIG9mZnNldFkgPSAwLjA7DQorICAgICAgICBpZiAocnRDYXJldC5sZWZ0IDwgcnRFaWR0LmxlZnQpIHsNCisgICAgICAgICAgICBvZmZzZXRYID0gcnRDYXJldC5sZWZ0IC0gcnRFaWR0LmxlZnQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAocnRDYXJldC5yaWdodCgpID4gcnRFaWR0LnJpZ2h0KCkpIHsNCisgICAgICAgICAgICBvZmZzZXRYID0gcnRDYXJldC5yaWdodCgpIC0gcnRFaWR0LnJpZ2h0KCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocnRDYXJldC50b3AgPCBydEVpZHQudG9wKSB7DQorICAgICAgICAgICAgb2Zmc2V0WSA9ICBydENhcmV0LnRvcCAtIHJ0RWlkdC50b3A7DQorICAgICAgICB9DQorICAgICAgICBpZiAocnRDYXJldC5ib3R0b20oKSA+IHJ0RWlkdC5ib3R0b20oKSkgew0KKyAgICAgICAgICAgIG9mZnNldFkgPSBydENhcmV0LmJvdHRvbSgpIC0gcnRFaWR0LmJvdHRvbSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbikpIHsNCisgICAgICAgICAgICBtX2ZTY3JvbGxPZmZzZXRYICs9IG9mZnNldFg7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WU2VsZkFkYXB0aW9uKSkgew0KKyAgICAgICAgICAgIG1fZlNjcm9sbE9mZnNldFkgKz0gb2Zmc2V0WTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX2ZGb250U2l6ZSA+IG1fcnRFbmdpbmUuaGVpZ2h0KSB7DQorICAgICAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSA9IDA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KK30NCitGWF9CT09MCUNGV0xfRWRpdEltcDo6VXBkYXRlT2Zmc2V0KElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyLCBGWF9GTE9BVCBmUG9zQ2hhbmdlZCkNCit7DQorICAgIGlmIChwU2Nyb2xsQmFyID09IChJRldMX1Njcm9sbEJhciopbV9wSG9yelNjcm9sbEJhcikgew0KKyAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WCArPSBmUG9zQ2hhbmdlZDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fZlNjcm9sbE9mZnNldFkgKz0gZlBvc0NoYW5nZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVWQWxpZ25tZW50KCkNCit7DQorICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFBhZ2UpOw0KKyAgICBjb25zdCBDRlhfUmVjdEYmIHJ0RkRFID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICAgIEZYX0ZMT0FUIGZPZmZzZXRZID0gMC4wZjsNCisgICAgRlhfRkxPQVQgZlNwYWNlQWJvdmUgPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmU3BhY2VCZWxvdyA9IDAuMGY7DQorICAgIENGWF9TaXplRiogcFNwYWNlID0gKENGWF9TaXplRiopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93KTsNCisgICAgaWYgKHBTcGFjZSkgew0KKyAgICAgICAgZlNwYWNlQWJvdmUgPSBwU3BhY2UtPng7DQorICAgICAgICBmU3BhY2VCZWxvdyA9IHBTcGFjZS0+eTsNCisgICAgfQ0KKyAgICBpZiAoZlNwYWNlQWJvdmUgPCAwLjFmKSB7DQorICAgICAgICBmU3BhY2VBYm92ZSA9IDA7DQorICAgIH0NCisgICAgaWYgKGZTcGFjZUJlbG93IDwgMC4xZikgew0KKyAgICAgICAgZlNwYWNlQmVsb3cgPSAwOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyKSB7DQorICAgICAgICBmT2Zmc2V0WSA9IChtX3J0RW5naW5lLmhlaWdodCAtIHJ0RkRFLmhlaWdodCkgLyAyOw0KKyAgICAgICAgaWYgKGZPZmZzZXRZIDwgKGZTcGFjZUFib3ZlICsgZlNwYWNlQmVsb3cpIC8gMiAmJiBmU3BhY2VBYm92ZSA8IGZTcGFjZUJlbG93KSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZk9mZnNldFkgKz0gKGZTcGFjZUFib3ZlIC0gZlNwYWNlQmVsb3cpIC8gMjsNCisgICAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WRmFyKSB7DQorICAgICAgICBmT2Zmc2V0WSA9IChtX3J0RW5naW5lLmhlaWdodCAtIHJ0RkRFLmhlaWdodCk7DQorICAgICAgICBmT2Zmc2V0WSAtPSBmU3BhY2VCZWxvdzsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGZPZmZzZXRZICs9IGZTcGFjZUFib3ZlOw0KKyAgICB9DQorICAgIG1fZlZBbGlnbk9mZnNldCA9IGZPZmZzZXRZOw0KKyAgICBpZiAobV9mVkFsaWduT2Zmc2V0IDwgMCkgew0KKyAgICAgICAgbV9mVkFsaWduT2Zmc2V0ID0gMDsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlQ2FyZXQoKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0RkRFOw0KKyAgICBtX3BFZHRFbmdpbmUtPkdldENhcmV0UmVjdChydEZERSk7DQorICAgIHJ0RkRFLk9mZnNldChtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYLCBtX3J0RW5naW5lLnRvcCAtIG1fZlNjcm9sbE9mZnNldFkgKyBtX2ZWQWxpZ25PZmZzZXQpOw0KKyAgICBDRlhfUmVjdEYgcnRDYXJldDsNCisgICAgcnRDYXJldC5TZXQocnRGREUubGVmdCwgcnRGREUudG9wLCBydEZERS53aWR0aCwgcnRGREUuaGVpZ2h0KTsNCisgICAgQ0ZYX1JlY3RGIHRlbXAgPSBydENhcmV0Ow0KKyAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICAgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgICBydENhcmV0LkludGVyc2VjdChydENsaWVudCk7DQorICAgIGlmIChydENhcmV0LmxlZnQgPiBydENsaWVudC5yaWdodCgpKSB7DQorICAgICAgICBGWF9GTE9BVCByaWdodCA9IHJ0Q2FyZXQucmlnaHQoKTsNCisgICAgICAgIHJ0Q2FyZXQubGVmdCA9IHJ0Q2xpZW50LnJpZ2h0KCkgLSAxOw0KKyAgICAgICAgcnRDYXJldC53aWR0aCA9IHJpZ2h0IC0gcnRDYXJldC5sZWZ0Ow0KKyAgICB9DQorICAgIEZYX0JPT0wgYkludGVyc2VjdCA9ICFydENhcmV0LklzRW1wdHkoKTsNCisgICAgRlhfQk9PTCBiU2hvdyA9IFRSVUU7DQorICAgIEZYX0JPT0wgYlNob3dXaG9sZSA9IEZBTFNFOw0KKyAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHx8ICFiSW50ZXJzZWN0KSB7DQorICAgICAgICBiU2hvdyA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uICYmIHRlbXAucmlnaHQoKSA+IG1fcnRFbmdpbmUucmlnaHQoKSkgew0KKyAgICAgICAgYlNob3dXaG9sZSA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb24gJiYgdGVtcC5ib3R0b20oKSA+IG1fcnRFbmdpbmUuYm90dG9tKCkpIHsNCisgICAgICAgIGJTaG93V2hvbGUgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgYlNob3cgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkICYmIGJJbnRlcnNlY3QpOw0KKyAgICB9DQorICAgIGlmIChiU2hvd1dob2xlKSB7DQorICAgICAgICBydENhcmV0ID0gdGVtcDsNCisgICAgfQ0KKyAgICBTaG93Q2FyZXQoYlNob3csICZydENhcmV0KTsNCit9DQorSUZXTF9TY3JvbGxCYXIqIENGV0xfRWRpdEltcDo6VXBkYXRlU2Nyb2xsKCkNCit7DQorICAgIEZYX0JPT0wgYlNob3dIb3J6ID0gbV9wSG9yelNjcm9sbEJhciAmJiAoKG1fcEhvcnpTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgPT0gMCk7DQorICAgIEZYX0JPT0wgYlNob3dWZXJ0ID0gbV9wVmVydFNjcm9sbEJhciAmJiAoKG1fcFZlcnRTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgPT0gMCk7DQorICAgIGlmICghYlNob3dIb3J6ICYmICFiU2hvd1ZlcnQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhZ2UsIE5VTEwpOw0KKyAgICBjb25zdCBDRlhfUmVjdEYgJnJ0RkRFID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICAgIElGV0xfU2Nyb2xsQmFyICpwUmVwYWludCA9IE5VTEw7DQorICAgIGlmIChiU2hvd0hvcnopIHsNCisgICAgICAgIENGWF9SZWN0RiBydFNjcm9sbDsNCisgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocnRTY3JvbGwpOw0KKyAgICAgICAgaWYgKHJ0U2Nyb2xsLndpZHRoIDwgcnRGREUud2lkdGgpIHsNCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5Mb2NrVXBkYXRlKCk7DQorICAgICAgICAgICAgRlhfRkxPQVQgZlJhbmdlID0gcnRGREUud2lkdGggLSBydFNjcm9sbC53aWR0aDsNCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRSYW5nZSgwLjBmLCBmUmFuZ2UpOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtX2ZTY3JvbGxPZmZzZXRYOw0KKyAgICAgICAgICAgIGlmIChmUG9zIDwgMC4wZikgew0KKyAgICAgICAgICAgICAgICBmUG9zID0gMC4wZjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGZQb3MgPiBmUmFuZ2UpIHsNCisgICAgICAgICAgICAgICAgZlBvcyA9IGZSYW5nZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KKyAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsLndpZHRoKTsNCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGVwU2l6ZShydFNjcm9sbC53aWR0aCAvIDEwKTsNCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0Rpc2FibGVkLCBGQUxTRSk7DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VW5sb2NrVXBkYXRlKCk7DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgICAgICAgICAgcFJlcGFpbnQgPSAoSUZXTF9TY3JvbGxCYXIqKW1fcEhvcnpTY3JvbGxCYXI7DQorICAgICAgICB9IGVsc2UgaWYgKChtX3BIb3J6U2Nyb2xsQmFyLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgPT0gMCkgew0KKyAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPkxvY2tVcGRhdGUoKTsNCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRSYW5nZSgwLCAtMSk7DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9EaXNhYmxlZCwgVFJVRSk7DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VW5sb2NrVXBkYXRlKCk7DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgICAgICAgICAgcFJlcGFpbnQgPSAoSUZXTF9TY3JvbGxCYXIqKW1fcEhvcnpTY3JvbGxCYXI7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJTaG93VmVydCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0U2Nyb2xsOw0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChydFNjcm9sbCk7DQorICAgICAgICBpZiAocnRTY3JvbGwuaGVpZ2h0IDwgcnRGREUuaGVpZ2h0KSB7DQorICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZTdGVwID0gbV9wRWR0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmZMaW5lU3BhY2U7DQorICAgICAgICAgICAgRlhfRkxPQVQgZlJhbmdlID0gcnRGREUuaGVpZ2h0IC0gbV9ydEVuZ2luZS5oZWlnaHQ7DQorICAgICAgICAgICAgaWYgKGZSYW5nZSA8IGZTdGVwKSB7DQorICAgICAgICAgICAgICAgIGZSYW5nZSA9IGZTdGVwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRSYW5nZSgwLjBmLCBmUmFuZ2UpOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtX2ZTY3JvbGxPZmZzZXRZOw0KKyAgICAgICAgICAgIGlmIChmUG9zIDwgMC4wZikgew0KKyAgICAgICAgICAgICAgICBmUG9zID0gMC4wZjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGZQb3MgPiBmUmFuZ2UpIHsNCisgICAgICAgICAgICAgICAgZlBvcyA9IGZSYW5nZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KKyAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsLmhlaWdodCk7DQorICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUoZlN0ZXApOw0KKyAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIEZBTFNFKTsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgICAgICAgICBwUmVwYWludCA9IChJRldMX1Njcm9sbEJhciopbV9wVmVydFNjcm9sbEJhcjsNCisgICAgICAgIH0gZWxzZSBpZiAoKG1fcFZlcnRTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSAwKSB7DQorICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFJhbmdlKDAsIC0xKTsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0Rpc2FibGVkLCBUUlVFKTsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgICAgICAgICBwUmVwYWludCA9IChJRldMX1Njcm9sbEJhciopbV9wVmVydFNjcm9sbEJhcjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcFJlcGFpbnQ7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpJc1Nob3dTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCkNCit7DQorICAgIEZYX0JPT0wgYlNob3cgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzKSA/IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IEZXTF9XR1RTVEFURV9Gb2N1c2VkIDogVFJVRTsNCisgICAgaWYgKGJWZXJ0KSB7DQorICAgICAgICByZXR1cm4gYlNob3cgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgJiYNCisgICAgICAgICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lKSAmJiBJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpOw0KKyAgICB9DQorICAgIHJldHVybiAgYlNob3cgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSFNjcm9sbCkgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBGQUxTRSk7DQorICAgIHJldHVybiBwUGFnZS0+R2V0Q29udGVudHNCb3goKS5oZWlnaHQgPiBtX3J0RW5naW5lLmhlaWdodCArIDEuMGY7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdEltcDo6QWRkRG9SZWNvcmQoRlhfQlNUUiBic0RvUmVjb3JkKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9SZWNvcmRBcnIuR2V0U2l6ZSgpOw0KKyAgICBpZiAobV9pQ3VyUmVjb3JkID09IG5Db3VudCAtIDEpIHsNCisgICAgICAgIGlmIChuQ291bnQgPT0gbV9pTWF4UmVjb3JkKSB7DQorICAgICAgICAgICAgbV9SZWNvcmRBcnIuUmVtb3ZlQXQoMCk7DQorICAgICAgICAgICAgbV9pQ3VyUmVjb3JkIC0tOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gbkNvdW50IC0gMTsgaSA+IG1faUN1clJlY29yZDsgaSAtLSkgew0KKyAgICAgICAgICAgIG1fUmVjb3JkQXJyLlJlbW92ZUF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fUmVjb3JkQXJyLkFkZChic0RvUmVjb3JkKTsNCisgICAgcmV0dXJuIG1faUN1clJlY29yZCA9IG1fUmVjb3JkQXJyLkdldFNpemUoKSAtIDE7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpMYXlvdXQoKQ0KK3sNCisgICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgICAgbV9ydEVuZ2luZSA9IG1fcnRDbGllbnQ7DQorICAgIEZYX0ZMT0FUICpwZldpZHRoID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocGZXaWR0aCk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9ICpwZldpZHRoOw0KKyAgICBpZiAoIW1fcE91dGVyKSB7DQorICAgICAgICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9IChDRlhfUmVjdEYqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luKTsNCisgICAgICAgIGlmIChwVUlNYXJnaW4pIHsNCisgICAgICAgICAgICBtX3J0RW5naW5lLkRlZmxhdGUocFVJTWFyZ2luLT5sZWZ0LCBwVUlNYXJnaW4tPnRvcCwgcFVJTWFyZ2luLT53aWR0aCwgcFVJTWFyZ2luLT5oZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE91dGVyLT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlcikgew0KKyAgICAgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgICAgICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wT3V0ZXI7DQorICAgICAgICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9IChDRlhfUmVjdEYqKW1fcE91dGVyLT5HZXRUaGVtZVByb3ZpZGVyKCktPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pOw0KKyAgICAgICAgaWYgKHBVSU1hcmdpbikgew0KKyAgICAgICAgICAgIG1fcnRFbmdpbmUuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLCBwVUlNYXJnaW4tPmhlaWdodCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiU2hvd1ZlcnRTY3JvbGxiYXIgPSBJc1Nob3dTY3JvbGxCYXIoVFJVRSk7DQorICAgIEZYX0JPT0wgYlNob3dIb3J6U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKEZBTFNFKTsNCisgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICAgICAgSW5pdFNjcm9sbEJhcigpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0VmVydFNjcjsNCisgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgICAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpICsgRldMX0VESVRfTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AsIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBydFZlcnRTY3IuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIGZXaWR0aCwgbV9ydENsaWVudC50b3AsIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgICAgICAgIGlmIChiU2hvd0hvcnpTY3JvbGxiYXIpIHsNCisgICAgICAgICAgICAgICAgcnRWZXJ0U2NyLmhlaWdodCAtPSBmV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcnRFbmdpbmUud2lkdGggLT0gZldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFZlcnRTY3IpOw0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgICB9IGVsc2UgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAoYlNob3dIb3J6U2Nyb2xsYmFyKSB7DQorICAgICAgICBJbml0U2Nyb2xsQmFyKEZBTFNFKTsNCisgICAgICAgIENGWF9SZWN0RiBydEhvcmlTY3I7DQorICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCisgICAgICAgICAgICBydEhvcmlTY3IuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC5ib3R0b20oKSArIEZXTF9FRElUX01hcmdpbiwgbV9ydENsaWVudC53aWR0aCwgZldpZHRoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgLSBmV2lkdGgsIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgICAgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICAgICAgICAgICAgICBydEhvcmlTY3Iud2lkdGggLT0gZldpZHRoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3J0RW5naW5lLmhlaWdodCAtPSBmV2lkdGg7DQorICAgICAgICB9DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0SG9yaVNjcik7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgIH0gZWxzZSBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpMYXlvdXRTY3JvbGxCYXIoKQ0KK3sNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMpID09IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCogcGZXaWR0aCA9IE5VTEw7DQorICAgIEZYX0JPT0wgYlNob3dWZXJ0U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKFRSVUUpOw0KKyAgICBGWF9CT09MIGJTaG93SG9yelNjcm9sbGJhciA9IElzU2hvd1Njcm9sbEJhcihGQUxTRSk7DQorICAgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsNCisgICAgICAgIGlmICghbV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgICAgIHBmV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCisgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBwZldpZHRoID8gKnBmV2lkdGggOiAwOw0KKyAgICAgICAgICAgIEluaXRTY3JvbGxCYXIoKTsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRWZXJ0U2NyOw0KKyAgICAgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgICAgICAgICAgICBydFZlcnRTY3IuU2V0KG1fcnRDbGllbnQucmlnaHQoKSArIEZXTF9FRElUX01hcmdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCwgZldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcnRWZXJ0U2NyLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmV2lkdGgsIG1fcnRDbGllbnQudG9wLCBmV2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgaWYgKGJTaG93SG9yelNjcm9sbGJhcikgew0KKyAgICAgICAgICAgICAgICAgICAgcnRWZXJ0U2NyLmhlaWdodCAtPSBmV2lkdGg7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFZlcnRTY3IpOw0KKyAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgfSBlbHNlIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICAgIH0NCisgICAgaWYgKGJTaG93SG9yelNjcm9sbGJhcikgew0KKyAgICAgICAgaWYgKCFtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICAgICAgcGZXaWR0aCA9ICFwZldpZHRoID8gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCkgOiBwZldpZHRoOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBmV2lkdGggPyAqcGZXaWR0aCA6IDA7DQorICAgICAgICAgICAgSW5pdFNjcm9sbEJhcihGQUxTRSk7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SG9yaVNjcjsNCisgICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCisgICAgICAgICAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgKyBGV0xfRURJVF9NYXJnaW4sIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgLSBmV2lkdGgsIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgICAgICAgICAgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0SG9yaVNjci53aWR0aCAtPSAoZldpZHRoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0SG9yaVNjcik7DQorICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgICB9IGVsc2UgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAoYlNob3dWZXJ0U2Nyb2xsYmFyIHx8IGJTaG93SG9yelNjcm9sbGJhcikgew0KKyAgICAgICAgVXBkYXRlU2Nyb2xsKCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkRldmljZVRvRW5naW5lKENGWF9Qb2ludEYgJnB0KQ0KK3sNCisgICAgcHQueCArPSAtbV9ydEVuZ2luZS5sZWZ0ICsgbV9mU2Nyb2xsT2Zmc2V0WDsNCisgICAgcHQueSArPSAtbV9ydEVuZ2luZS50b3AgLSBtX2ZWQWxpZ25PZmZzZXQgKyBtX2ZTY3JvbGxPZmZzZXRZOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6SW5pdFNjcm9sbEJhcihGWF9CT09MIGJWZXJ0ICkNCit7DQorICAgIGlmICgoYlZlcnQgJiYgbV9wVmVydFNjcm9sbEJhcikgfHwgKCFiVmVydCAmJiBtX3BIb3J6U2Nyb2xsQmFyKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBiVmVydCA/IEZXTF9TVFlMRUVYVF9TQ0JfVmVydCA6IEZXTF9TVFlMRUVYVF9TQ0JfSG9yejsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0Rpc2FibGVkIHwgRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KKyAgICBwU2Nyb2xsQmFyLT5Jbml0aWFsaXplKHByb3AsIG1fcEludGVyZmFjZSk7DQorICAgIGJWZXJ0ID8gKG1fcFZlcnRTY3JvbGxCYXIgPSBwU2Nyb2xsQmFyKSA6IChtX3BIb3J6U2Nyb2xsQmFyID0gcFNjcm9sbEJhcik7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpJbml0RW5naW5lKCkNCit7DQorICAgIGlmIChtX3BFZHRFbmdpbmUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BFZHRFbmdpbmUgPSBJRkRFX1R4dEVkdEVuZ2luZTo6Q3JlYXRlKCk7DQorfQ0KK2V4dGVybiAJRlhfQk9PTAlGV0xfU2hvd0NhcmV0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDRlhfUmVjdEYgKnBSdEFuY2hvcik7DQordm9pZCBDRldMX0VkaXRJbXA6OlNob3dDYXJldChGWF9CT09MIGJWaXNpYmxlLCBDRlhfUmVjdEYgKnBSZWN0ICkNCit7DQorICAgIGlmIChtX3BDYXJldCkgew0KKyAgICAgICAgbV9wQ2FyZXQtPlNob3dDYXJldChiVmlzaWJsZSk7DQorICAgICAgICBpZiAoYlZpc2libGUgJiYgIXBSZWN0LT5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBtX3BDYXJldC0+U2V0V2lkZ2V0UmVjdCgqcFJlY3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgUmVwYWludCgmbV9ydEVuZ2luZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBJRldMX1dpZGdldCAqcE91dGVyID0gKElGV0xfV2lkZ2V0KiltX3BJbnRlcmZhY2U7DQorICAgICAgICBpZiAoYlZpc2libGUpIHsNCisgICAgICAgICAgICBwUmVjdC0+T2Zmc2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKHBPdXRlci0+R2V0T3V0ZXIoKSkgew0KKyAgICAgICAgICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCisgICAgICAgICAgICBpZiAoYlZpc2libGUpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0T3V0ZXI7DQorICAgICAgICAgICAgICAgIHBPdXRlci0+R2V0V2lkZ2V0UmVjdChydE91dGVyKTsNCisgICAgICAgICAgICAgICAgcFJlY3QtPk9mZnNldChydE91dGVyLmxlZnQsIHJ0T3V0ZXIudG9wKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGV0xfU2hvd0NhcmV0KHBPdXRlciwgYlZpc2libGUsIHBSZWN0KTsNCisgICAgfQ0KK30NCitGWF9CT09MCUNGV0xfRWRpdEltcDo6VmFsaWRhdGVOdW1iZXJDaGFyKEZYX1dDSEFSIGNOdW0pDQorew0KKyAgICBpZiAoIW1fcEVkdEVuZ2luZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghbV9iU2V0UmFuZ2UpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzT2xkLCB3c1RleHQ7DQorICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIDApOw0KKyAgICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICAgICAgaWYgKGNOdW0gPT0gTCcwJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGNhcmV0UG9zID0gbV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyAgICBGWF9JTlQzMiBpU2VsID0JQ291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKGlTZWwgPT0gMCkgew0KKyAgICAgICAgaWYgKGNOdW0gPT0gTCcwJyAmJiBjYXJldFBvcyA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgbkxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIGwgPSB3c1RleHQuTWlkKDAsIGNhcmV0UG9zKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHIgPSB3c1RleHQuTWlkKGNhcmV0UG9zLCBuTGVuIC0gY2FyZXRQb3MpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXcgPSBsICsgY051bSArIHI7DQorICAgICAgICBpZiAod3NOZXcuR2V0SW50ZWdlcigpIDw9IG1faU1heCkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHdzVGV4dC5HZXRJbnRlZ2VyKCkgPD0gbV9pTWF4KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6SW5pdENhcmV0KCkNCit7DQorICAgIGlmICghbV9wQ2FyZXQpIHsNCisgICAgICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSW5uZXJDYXJldCkpIHsNCisgICAgICAgICAgICBtX3BDYXJldCA9IElGV0xfQ2FyZXQ6OkNyZWF0ZSgpOw0KKyAgICAgICAgICAgIG1fcENhcmV0LT5Jbml0aWFsaXplKG1fcEludGVyZmFjZSk7DQorICAgICAgICAgICAgbV9wQ2FyZXQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KKyAgICAgICAgICAgIG1fcENhcmV0LT5TZXRTdGF0ZXMobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQpID09IDApIHsNCisgICAgICAgIG1fcENhcmV0LT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BDYXJldCA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkNsZWFyUmVjb3JkKCkNCit7DQorICAgIG1faUN1clJlY29yZCA9IC0xOw0KKyAgICBtX1JlY29yZEFyci5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlByb2Nlc3NJbnNlcnRFcnJvcihGWF9JTlQzMiBpRXJyb3IpDQorew0KKyAgICBzd2l0Y2ggKGlFcnJvcikgew0KKyAgICAgICAgY2FzZSAtMjogew0KKyAgICAgICAgICAgICAgICBDRldMX0V2dEVkdFRleHRGdWxsIHRleHRGdWxsRXZlbnQ7DQorICAgICAgICAgICAgICAgIHRleHRGdWxsRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgICAgICBEaXNwYXRjaEV2ZW50KCZ0ZXh0RnVsbEV2ZW50KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9FZGl0SW1wRGVsZWdhdGUoQ0ZXTF9FZGl0SW1wICpwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9JTlQzMiBpUmV0ID0gMTsNCisgICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICAgICAgICAgICAgRG9BY3RpdmF0ZSgoQ0ZXTF9Nc2dBY3RpdmF0ZSopcE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGU6IHsNCisgICAgICAgICAgICAgICAgRG9EZWFjdGl2YXRlKChDRldMX01zZ0RlYWN0aXZhdGUqKXBNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICAgICAgICAgICAgc3dpdGNoKGR3Q21kKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25EYmxDbGs6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25CdXR0b25EYmxDbGsocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRvd246IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9CdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnS2V5ICpwS2V5ID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwS2V5LT5tX2R3Q21kOw0KKyAgICAgICAgICAgICAgICBpZiAoZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICAgICAgICAgICAgICBPbktleURvd24ocEtleSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdDbWQgPT0gRldMX01TR0tFWUNNRF9DaGFyKSB7DQorICAgICAgICAgICAgICAgICAgICBPbkNoYXIocEtleSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBFdmVudCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZHdIYXNoQ29kZSAhPSBGV0xfRVZUSEFTSF9TY3JvbGwpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldCAqcFNyY1RhcmdldCA9IHBFdmVudC0+bV9wU3JjVGFyZ2V0Ow0KKyAgICBpZiAoKHBTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wVmVydFNjcm9sbEJhciAmJiBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgfHwgKHBTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wSG9yelNjcm9sbEJhciAmJiBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhcikpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3U2Nyb2xsQ29kZSA9ICgoQ0ZXTF9FdnRTY3JvbGwqKXBFdmVudCktPm1faVNjcm9sbENvZGU7DQorICAgICAgICBGWF9GTE9BVCBmUG9zID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9mUG9zOw0KKyAgICAgICAgT25TY3JvbGwoKElGV0xfU2Nyb2xsQmFyKilwU3JjVGFyZ2V0LCBkd1Njcm9sbENvZGUsIGZQb3MpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSAqcE1zZykNCit7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUgKnBNc2cpDQorew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICAgIH0NCisgICAgaWYgKCFtX3BPd25lci0+bV9wRWR0RW5naW5lKSB7DQorICAgICAgICBtX3BPd25lci0+VXBkYXRlRWRpdEVuZ2luZSgpOw0KKyAgICB9DQorICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBQYWdlKTsNCisgICAgQ0ZYX1BvaW50RiBwdDsNCisgICAgcHQuU2V0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBtX3BPd25lci0+RGV2aWNlVG9FbmdpbmUocHQpOw0KKyAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgICBGWF9JTlQzMiBuSW5kZXggPSBwUGFnZS0+R2V0Q2hhckluZGV4KHB0LCBiQmVmb3JlKTsNCisgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICAgIG5JbmRleCA9IDA7DQorICAgIH0NCisgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQpDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlRXggPSBtX3BPd25lci0+R2V0U3R5bGVzRXgoKTsNCisgICAgRlhfQk9PTCBiUmVwYWludCA9IGR3U3R5bGVFeCAmIEZXTF9TVFlMRUVYVF9FRFRfSW5uZXJDYXJldDsNCisgICAgaWYgKGJTZXQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgICAgaWYgKCFtX3BPd25lci0+bV9wRWR0RW5naW5lKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlVwZGF0ZUVkaXRFbmdpbmUoKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5VcGRhdGVWQWxpZ25tZW50KCk7DQorICAgICAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KCk7DQorICAgICAgICBtX3BPd25lci0+VXBkYXRlQ2FyZXQoKTsNCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgICBtX3BPd25lci0+U2hvd0NhcmV0KEZBTFNFKTsNCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wRWR0RW5naW5lICYmIChkd1N0eWxlRXggJiBGV0xfU1RZTEVFWFRfRURUX05vSGlkZVNlbCkgPT0gMCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5TZWwgPSBtX3BPd25lci0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgICAgICAgICBpZiAoblNlbCA+IDApIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkNsZWFyU2VsZWN0aW9ucygpOw0KKyAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcE93bmVyLT5TZXRDYXJldFBvcygwKTsNCisgICAgICAgICAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BPd25lci0+Q2xlYXJSZWNvcmQoKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+TGF5b3V0U2Nyb2xsQmFyKCk7DQorICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBEb0N1cnNvcihwTXNnKTsNCisgICAgaWYobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KKyAgICBtX3BPd25lci0+U2V0R3JhYihUUlVFKTsNCisgICAgRG9CdXR0b25Eb3duKHBNc2cpOw0KKyAgICBGWF9JTlQzMiBuSW5kZXggPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5DbGVhclNlbGVjdGlvbigpOw0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlNoaWZ0ID0gcE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQ7DQorICAgIGlmIChiU2hpZnQgJiYgbV9wT3duZXItPm1fblNlbFN0YXJ0ICE9IG5JbmRleCkgew0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gRlhfTUlOKG1fcE93bmVyLT5tX25TZWxTdGFydCwgbkluZGV4KTsNCisgICAgICAgIEZYX0lOVDMyIGlFbmQgPSBGWF9NQVgobV9wT3duZXItPm1fblNlbFN0YXJ0LCBuSW5kZXgpOw0KKyAgICAgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KTsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5tX25TZWxTdGFydCA9IG5JbmRleDsNCisgICAgfQ0KKyAgICBpZiAoYlJlcGFpbnQpIHsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEVuZ2luZSk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIERvQ3Vyc29yKHBNc2cpOw0KKyAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCisgICAgbV9wT3duZXItPlNldEdyYWIoRkFMU0UpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkJ1dHRvbkRibENsayhDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wRWR0RW5naW5lKTsNCisgICAgRG9DdXJzb3IocE1zZyk7DQorICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBQYWdlKTsNCisgICAgQ0ZYX1BvaW50RiBwdDsNCisgICAgcHQuU2V0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBtX3BPd25lci0+RGV2aWNlVG9FbmdpbmUocHQpOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSAwOw0KKyAgICBGWF9JTlQzMiBuSW5kZXggPSBwUGFnZS0+U2VsZWN0V29yZChwdCwgbkNvdW50KTsNCisgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZShuSW5kZXgsIG5Db3VudCk7DQorICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPlNldENhcmV0UG9zKG5JbmRleCArIG5Db3VudCAtIDEsIEZBTFNFKTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0RW5naW5lKTsNCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkdEVuZ2luZSk7DQorICAgIERvQ3Vyc29yKHBNc2cpOw0KKyAgICBpZiAobV9wT3duZXItPm1fblNlbFN0YXJ0ID09IC0xIHx8ICFtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUGFnZSk7DQorICAgIENGWF9Qb2ludEYgcHQ7DQorICAgIHB0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgbV9wT3duZXItPkRldmljZVRvRW5naW5lKHB0KTsNCisgICAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgICAgRlhfSU5UMzIgbkluZGV4ID0gcFBhZ2UtPkdldENoYXJJbmRleChwdCwgYkJlZm9yZSk7DQorICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQorICAgIG5JbmRleCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICAgIGlmIChuSW5kZXggIT0gbV9wT3duZXItPm1fblNlbFN0YXJ0KSB7DQorICAgICAgICBGWF9JTlQzMiBuTGVuID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0VGV4dExlbmd0aCgpOw0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX25TZWxTdGFydCA+PSBuTGVuKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPm1fblNlbFN0YXJ0ID0gbkxlbjsNCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkFkZFNlbFJhbmdlKEZYX01JTihtX3BPd25lci0+bV9uU2VsU3RhcnQsIG5JbmRleCksIEZYU1lTX2FicyhuSW5kZXggLSBtX3BPd25lci0+bV9uU2VsU3RhcnQpKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpOw0KKyAgICBGREVfVFhURURUTU9WRUNBUkVUIE1vdmVDYXJldCA9IE1DX01vdmVOb25lOw0KKyAgICBGWF9CT09MIGJTaGlmdCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0Ow0KKyAgICBGWF9CT09MIGJDdHJsID0gcE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ3RybDsNCisgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcE1zZy0+bV9kd0tleUNvZGU7DQorICAgIHN3aXRjaCAoZHdLZXlDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6IHsNCisgICAgICAgICAgICAgICAgTW92ZUNhcmV0ID0gTUNfTGVmdDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9SaWdodDogew0KKyAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19SaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9VcDogew0KKyAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19VcDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOiB7DQorICAgICAgICAgICAgICAgIE1vdmVDYXJldCA9IE1DX0Rvd247DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1ZLRVlfSG9tZTogew0KKyAgICAgICAgICAgICAgICBpZiAoYkN0cmwpIHsNCisgICAgICAgICAgICAgICAgICAgIE1vdmVDYXJldCA9IE1DX0hvbWU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19MaW5lU3RhcnQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9FbmQ6IHsNCisgICAgICAgICAgICAgICAgaWYgKGJDdHJsKSB7DQorICAgICAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19FbmQ7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19MaW5lRW5kOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OiB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOiB7DQorICAgICAgICAgICAgICAgIGlmICgJKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkNCisgICAgICAgICAgICAgICAgICAgICAgICB8fAkobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBuQ2FyZXQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQsIFRSVUUpOw0KKyNlbHNlDQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9WS0VZX0YyOiB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1ZLRVlfVGFiOiB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisgICAgICAgICAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0NvbW1hbmQpDQorI2Vsc2UNCisgICAgICAgICAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpDQorI2VuZGlmDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChkd0tleUNvZGUgPT0gMHg0MyB8fCBkd0tleUNvZGUgPT0gMHg2Mykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb0NsaXBib2FyZCgxKTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoZHdLZXlDb2RlID09IDB4NTggfHwgZHdLZXlDb2RlID09IDB4NzgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9DbGlwYm9hcmQoMik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGR3S2V5Q29kZSA9PSAweDU2IHx8IGR3S2V5Q29kZSA9PSAweDc2KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvQ2xpcGJvYXJkKDMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoTW92ZUNhcmV0ICE9IE1DX01vdmVOb25lKSB7DQorICAgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5Nb3ZlQ2FyZXRQb3MoTW92ZUNhcmV0LCBiU2hpZnQsIGJDdHJsKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkNoYXIoQ0ZXTF9Nc2dLZXkgKnBNc2cpDQorew0KKyAgICBpZiAoCShtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpDQorICAgICAgICAgICAgfHwJKCBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpOw0KKyAgICBGWF9JTlQzMiBpRXJyb3IgPSAwOw0KKyAgICBGWF9XQ0hBUiBjID0gKEZYX1dDSEFSKXBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgICBGWF9JTlQzMiBuQ2FyZXQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyAgICBzd2l0Y2ggKGMpIHsNCisgICAgICAgIGNhc2UgRldMX1ZLRVlfQmFjazogew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5EZWxldGUobkNhcmV0LCBUUlVFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSAweDBBOiB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOiB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1ZLRVlfVGFiOiB7DQorICAgICAgICAgICAgICAgIGlFcnJvciA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkluc2VydChuQ2FyZXQsIEZYX0xQQ1dTVFIoTCJcdCIpLCAxKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46IHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9XYW50UmV0dXJuKSB7DQorICAgICAgICAgICAgICAgICAgICBpRXJyb3IgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCBGWF9MUENXU1RSKEwiXG4iKSwgMSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBpZiAoIW1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTnVtYmVyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocE1zZy0+bV9kd0tleUNvZGUgPCBGV0xfVktFWV8wKSAmJiAocE1zZy0+bV9kd0tleUNvZGUgIT0gMHgyRSAmJiBwTXNnLT5tX2R3S2V5Q29kZSAhPSAweDJEKSkgfHwgcE1zZy0+bV9kd0tleUNvZGUgPiBGV0xfVktFWV85KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcE93bmVyLT5WYWxpZGF0ZU51bWJlckNoYXIoYykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisgICAgICAgICAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0NvbW1hbmQpDQorI2Vsc2UNCisgICAgICAgICAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpDQorI2VuZGlmDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlFcnJvciA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkluc2VydChuQ2FyZXQsICZjLCAxKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpRXJyb3IgPCAwKSB7DQorICAgICAgICBtX3BPd25lci0+UHJvY2Vzc0luc2VydEVycm9yKGlFcnJvcik7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25TY3JvbGwoSUZXTF9TY3JvbGxCYXIgKnBTY3JvbGxCYXIsIEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykNCit7DQorICAgIENGWF9TaXplRiBmczsNCisgICAgcFNjcm9sbEJhci0+R2V0UmFuZ2UoZnMueCwgZnMueSk7DQorICAgIEZYX0ZMT0FUIGlDdXJQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgRlhfRkxPQVQgZlN0ZXAgPSBwU2Nyb2xsQmFyLT5HZXRTdGVwU2l6ZSgpOw0KKyAgICBzd2l0Y2ggKGR3Q29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9NaW46IHsNCisgICAgICAgICAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfTWF4OiB7DQorICAgICAgICAgICAgICAgIGZQb3MgPSBmcy55Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZDogew0KKyAgICAgICAgICAgICAgICBmUG9zIC09IGZTdGVwOw0KKyAgICAgICAgICAgICAgICBpZiAoZlBvcyA8IGZzLnggKyBmU3RlcCAvIDIpIHsNCisgICAgICAgICAgICAgICAgICAgIGZQb3MgPSBmcy54Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEZvcndhcmQ6IHsNCisgICAgICAgICAgICAgICAgZlBvcyArPSBmU3RlcDsNCisgICAgICAgICAgICAgICAgaWYgKGZQb3MgPiBmcy55IC0gZlN0ZXAgLyAyKSB7DQorICAgICAgICAgICAgICAgICAgICBmUG9zID0gZnMueTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1BhZ2VCYWNrd2FyZDogew0KKyAgICAgICAgICAgICAgICBmUG9zIC09IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgICAgICAgICAgIGlmIChmUG9zIDwgZnMueCkgew0KKyAgICAgICAgICAgICAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZDogew0KKyAgICAgICAgICAgICAgICBmUG9zICs9IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgICAgICAgICAgIGlmIChmUG9zID4gZnMueSkgew0KKyAgICAgICAgICAgICAgICAgICAgZlBvcyA9IGZzLnk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9Qb3M6DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1RyYWNrUG9zOiB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfRW5kU2Nyb2xsOiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQ3VyUG9zICE9IGZQb3MpIHsNCisgICAgICAgIHBTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCisgICAgICAgIHBTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgICAgbV9wT3duZXItPlVwZGF0ZU9mZnNldChwU2Nyb2xsQmFyLCBmUG9zIC0gaUN1clBvcyk7DQorICAgICAgICBpZiAobV9wT3duZXItPm1fcEVkdEVuZ2luZSkgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5VcGRhdGVDYXJldCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgICBtX3BPd25lci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgICAgICBydEludmFsaWRhdGUuU2V0KDAsIDAsIHJlY3Qud2lkdGggKyAyLCByZWN0LmhlaWdodCArIDIpOw0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQ3Vyc29yKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICAgICAgICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IgKnBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCisgICAgICAgIGlmIChOVUxMICE9IHBDdXJzb3JNZ3IpIHsNCisgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX0lucHV0QmVhbSk7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2Zvcm1wcm94eWltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZm9ybXByb3h5aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQxZmJlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2Zvcm1wcm94eWltcC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIg0KK0NGV0xfRm9ybVByb3h5SW1wOjpDRldMX0Zvcm1Qcm94eUltcChJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX0Zvcm1JbXAocE91dGVyKQ0KK3sNCit9DQorQ0ZXTF9Gb3JtUHJveHlJbXA6OkNGV0xfRm9ybVByb3h5SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCit7DQorfQ0KK0NGV0xfRm9ybVByb3h5SW1wOjp+Q0ZXTF9Gb3JtUHJveHlJbXAoKQ0KK3sNCit9DQorRldMX0VSUiBDRldMX0Zvcm1Qcm94eUltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19Gb3JtUHJveHk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Gb3JtUHJveHlJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfRm9ybVByb3h5Ow0KK30NCitGWF9CT09MIENGV0xfRm9ybVByb3h5SW1wOjpJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3QNCit7DQorICAgIGlmICh3c0NsYXNzID09IENGWF9XaWRlU3RyaW5nQyhGV0xfQ0xBU1NfRm9ybVByb3h5KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfRm9ybUltcDo6SXNJbnN0YW5jZSh3c0NsYXNzKTsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1Qcm94eUltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlICopRlhfTkVXIENGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGUodGhpcyk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1Qcm94eUltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OlVwZGF0ZSgpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlOjpDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlKENGV0xfRm9ybVByb3h5SW1wICpwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgcmV0dXJuIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZiOTY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3hpbXAuY3BwCkBAIC0wLDAgKzEsMTI1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgiDQorI2RlZmluZSBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbiAyDQorSUZXTF9MaXN0Qm94KiBJRldMX0xpc3RCb3g6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gbmV3IElGV0xfTGlzdEJveDsNCit9DQorSUZXTF9MaXN0Qm94OjpJRldMX0xpc3RCb3goKQ0KK3sNCisgICAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfTGlzdEJveDo6fklGV0xfTGlzdEJveCgpDQorew0KKyAgICBpZiAobV9wRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGE7DQorICAgICAgICBtX3BEYXRhID0gTlVMTDsNCisgICAgfQ0KK30NCitGV0xfRVJSIElGV0xfTGlzdEJveDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0xpc3RCb3hJbXAocE91dGVyKTsNCisgICAgKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX0xpc3RCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0xpc3RCb3hJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRlhfSU5UMzIgSUZXTF9MaXN0Qm94OjpDb3VudFNlbEl0ZW1zKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkNvdW50U2VsSXRlbXMoKTsNCit9DQorRldMX0hMSVNUSVRFTSBJRldMX0xpc3RCb3g6OkdldFNlbEl0ZW0oRlhfSU5UMzIgbkluZGV4U2VsKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhKS0+R2V0U2VsSXRlbShuSW5kZXhTZWwpOw0KK30NCitGWF9JTlQzMiBJRldMX0xpc3RCb3g6OkdldFNlbEluZGV4KEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldFNlbEluZGV4KG5JbmRleCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9MaXN0Qm94OjpTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPlNldFNlbEl0ZW0oaEl0ZW0sIGJTZWxlY3QpOw0KK30NCitGV0xfRVJSCUlGV0xfTGlzdEJveDo6R2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCit7DQorICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KK30NCitGV0xfRVJSCUlGV0xfTGlzdEJveDo6R2V0U2Nyb2xsUG9zKEZYX0ZMT0FUICZmUG9zLCBGWF9CT09MIGJWZXJ0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhKS0+R2V0U2Nyb2xsUG9zKGZQb3MsIGJWZXJ0KTsNCit9DQorRldMX0VSUiogSUZXTF9MaXN0Qm94OjpTb3J0KElGV0xfTGlzdEJveENvbXBhcmUgKnBDb20pDQorew0KKyAgICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5Tb3J0KHBDb20pOw0KK30NCitDRldMX0xpc3RCb3hJbXA6OkNGV0xfTGlzdEJveEltcChJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpDQorICAgICwgbV9wSG9yelNjcm9sbEJhcihOVUxMKQ0KKyAgICAsIG1fcFZlcnRTY3JvbGxCYXIoTlVMTCkNCisgICAgLCBtX2R3VFRPU3R5bGVzKDApDQorICAgICwgbV9pVFRPQWxpZ25zKDApDQorICAgICwgbV9oQW5jaG9yKE5VTEwpDQorICAgICwgbV9mU2NvcmxsQmFyV2lkdGgoMCkNCisgICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCisgICAgLCBtX3BTY3JvbGxCYXJUUChOVUxMKQ0KK3sNCisgICAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgICBtX3J0Q29uZW50LlJlc2V0KCk7DQorICAgIG1fcnRTdGF0aWMuUmVzZXQoKTsNCit9DQorQ0ZXTF9MaXN0Qm94SW1wOjpDRldMX0xpc3RCb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9wSG9yelNjcm9sbEJhcihOVUxMKQ0KKyAgICAsIG1fcFZlcnRTY3JvbGxCYXIoTlVMTCkNCisgICAgLCBtX2R3VFRPU3R5bGVzKDApDQorICAgICwgbV9pVFRPQWxpZ25zKDApDQorICAgICwgbV9oQW5jaG9yKE5VTEwpDQorICAgICwgbV9mU2NvcmxsQmFyV2lkdGgoMCkNCisgICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCisgICAgLCBtX3BTY3JvbGxCYXJUUChOVUxMKQ0KK3sNCisgICAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgICBtX3J0Q29uZW50LlJlc2V0KCk7DQorICAgIG1fcnRTdGF0aWMuUmVzZXQoKTsNCit9DQorQ0ZXTF9MaXN0Qm94SW1wOjp+Q0ZXTF9MaXN0Qm94SW1wKCkNCit7DQorICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhciA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCit7DQorICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfTGlzdEJveDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0xpc3RCb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfTGlzdEJveDsNCit9DQorRldMX0VSUglDRldMX0xpc3RCb3hJbXA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfTGlzdEJveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+RmluYWxpemUoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+RmluYWxpemUoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1NpemVGIGZzID0gQ2FsY1NpemUoVFJVRSk7DQorICAgICAgICByZWN0LlNldCgwLCAwLCBmcy54LCBmcy55KTsNCisgICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6VXBkYXRlKCkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgbV9pVFRPQWxpZ25zID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgIHN3aXRjaChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9BbGlnbk1hc2spIHsNCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0xUQl9MZWZ0QWxpZ246IHsNCisgICAgICAgICAgICAgICAgbV9pVFRPQWxpZ25zID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjogew0KKyAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlclJpZ2h0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ246DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgICAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9SVEw7DQorICAgIH0NCisgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgbV9mU2NvcmxsQmFyV2lkdGggPSBHZXRTY3JvbGxXaWR0aCgpOw0KKyAgICBTb3J0SXRlbSgpOw0KKyAgICBDYWxjU2l6ZSgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfTGlzdEJveEltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChJc1Nob3dTY3JvbGxCYXIoVFJVRSkpIHsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhcjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9ydENsaWVudC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgICAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfTFRCX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoSGFzRWRnZSgpKSB7DQorICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0xUQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydENsaXAobV9ydENvbmVudCk7DQorICAgIGlmIChJc1Nob3dTY3JvbGxCYXIoRkFMU0UpKSB7DQorICAgICAgICBydENsaXAuaGVpZ2h0IC09IG1fZlNjb3JsbEJhcldpZHRoOw0KKyAgICB9DQorICAgIGlmIChJc1Nob3dTY3JvbGxCYXIoVFJVRSkpIHsNCisgICAgICAgIHJ0Q2xpcC53aWR0aCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCisgICAgfQ0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICB9DQorICAgIHBHcmFwaGljcy0+U2V0Q2xpcFJlY3QocnRDbGlwKTsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX05vQmFja2dyb3VuZCkgPT0gMCkgew0KKyAgICAgICAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBEcmF3SXRlbXMocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmICghcFRoZW1lUHJvdmlkZXItPklzVmFsaWRXaWRnZXQobV9wSW50ZXJmYWNlKSkgew0KKyAgICAgICAgbV9wU2Nyb2xsQmFyVFAgPSBwVGhlbWVQcm92aWRlcjsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9MaXN0Qm94SW1wOjpDb3VudFNlbEl0ZW1zKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCAwKTsNCisgICAgRlhfSU5UMzIgaVJldCA9IDA7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICAgIGlmICghaEl0ZW0pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgICAgIGlmIChkd1N0eWxlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpIHsNCisgICAgICAgICAgICBpUmV0ICsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveEltcDo6R2V0U2VsSXRlbShGWF9JTlQzMiBuSW5kZXhTZWwpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgTlVMTCk7DQorICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgICAgaWYgKCFoSXRlbSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICAgICAgaWYgKGR3U3R5bGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkgew0KKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBuSW5kZXhTZWwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGhJdGVtOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGluZGV4ICsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRTZWxJbmRleChGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgLTEpOw0KKyAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICAgIGlmICghaEl0ZW0pIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgICAgICBpZiAoZHdTdHlsZSAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQorICAgICAgICAgICAgaWYgKGluZGV4ID09IG5JbmRleCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpbmRleCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6U2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmICghaEl0ZW0pIHsNCisgICAgICAgIGlmIChiU2VsZWN0KSB7DQorICAgICAgICAgICAgU2VsZWN0QWxsKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENsZWFyU2VsZWN0aW9uKCk7DQorICAgICAgICAgICAgU2V0Rm9jdXNJdGVtKE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb24pIHsNCisgICAgICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgYlNlbGVjdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBTZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBiU2VsZWN0KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtVGV4dChGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfTGlzdEJveEltcDo6R2V0U2Nyb2xsUG9zKEZYX0ZMT0FUICZmUG9zLCBGWF9CT09MIGJWZXJ0ICkNCit7DQorICAgIGlmICgoYlZlcnQgJiYgSXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB8fCAoIWJWZXJ0ICYmIElzU2hvd1Njcm9sbEJhcihGQUxTRSkpKSB7DQorICAgICAgICBJRldMX1Njcm9sbEJhciAqcFNjcm9sbEJhciA9IGJWZXJ0ID8gbV9wVmVydFNjcm9sbEJhciA6IG1fcEhvcnpTY3JvbGxCYXI7DQorICAgICAgICBmUG9zID0gcFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorRldMX0VSUiogQ0ZXTF9MaXN0Qm94SW1wOjpTb3J0KElGV0xfTGlzdEJveENvbXBhcmUgKnBDb20pDQorew0KKyAgICBGV0xfSExJU1RJVEVNIGhUZW1wOw0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgRlhfSU5UMzIgc3ogPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc3ogLSAxOyBpKyspIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IGkgKyAxOyBqIDwgc3o7IGorKykgew0KKyAgICAgICAgICAgIGlmIChwQ29tLT5Db21wYXJlKHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSksIHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaikpID4gMCkgew0KKyAgICAgICAgICAgICAgICBoVGVtcCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgICAgICAgICAgIHBEYXRhLT5TZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGopLCBpKTsNCisgICAgICAgICAgICAgICAgcERhdGEtPlNldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIGhUZW1wLCBqKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveEltcDo6R2V0SXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd0tleUNvZGUpDQorew0KKyAgICBGV0xfSExJU1RJVEVNIGhSZXQgPSBOVUxMOw0KKyAgICBzd2l0Y2goZHdLZXlDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9WS0VZX1VwOg0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOg0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9Ib21lOg0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9FbmQ6IHsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXAgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXA7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvd24gPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfRG93bjsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiSG9tZSA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9Ib21lOw0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmQgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfRW5kOw0KKyAgICAgICAgICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaURzdEl0ZW0gPSAtMTsNCisgICAgICAgICAgICAgICAgaWYgKGJVcCB8fCBiRG93bikgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaW5kZXggPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICAgICAgICAgICAgICAgICAgaURzdEl0ZW0gPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXAgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkhvbWUpIHsNCisgICAgICAgICAgICAgICAgICAgIGlEc3RJdGVtID0gMDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgICAgICAgICAgICAgICAgICBpRHN0SXRlbSA9IGlDb3VudCAtIDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaFJldCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaURzdEl0ZW0pOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBoUmV0Ow0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2V0U2VsZWN0aW9uKEZXTF9ITElTVElURU0gaFN0YXJ0LCBGV0xfSExJU1RJVEVNIGhFbmQsIEZYX0JPT0wgYlNlbGVjdGVkKQ0KK3sNCisgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoU3RhcnQpOw0KKyAgICBGWF9JTlQzMiBpRW5kID0gcERhdGEtPkdldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIGhFbmQpOw0KKyAgICBpZiAoaVN0YXJ0ID4gaUVuZCkgew0KKyAgICAgICAgRlhfSU5UMzIgaVRlbXAgPSBpU3RhcnQ7DQorICAgICAgICBpU3RhcnQgPSBpRW5kOw0KKyAgICAgICAgaUVuZCA9IGlUZW1wOw0KKyAgICB9DQorICAgIGlmIChiU2VsZWN0ZWQpIHsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKysgKSB7DQorICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgICAgICAgU2V0U2VsZWN0aW9uRGlyZWN0KGhJdGVtLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yICg7IGlTdGFydCA8PSBpRW5kOyBpU3RhcnQrKykgew0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaVN0YXJ0KTsNCisgICAgICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgYlNlbGVjdGVkKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2V0U2VsZWN0aW9uRGlyZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCkNCit7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9EV09SRCBkd09sZFN0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIGJTZWxlY3QgPyBkd09sZFN0eWxlIHw9IEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZHdPbGRTdHlsZSAmPSB+RldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQ7DQorICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0sIGR3T2xkU3R5bGUpOw0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveEltcDo6SXNJdGVtU2VsZWN0ZWQoRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9EV09SRCBkd1N0YXRlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIHJldHVybiAoZHdTdGF0ZSAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSAhPSAwOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6Q2xlYXJTZWxlY3Rpb24oKQ0KK3sNCisgICAgRlhfQk9PTCBiTXVsdGkgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsNCisgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKyApIHsNCisgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICAgICAgRlhfQk9PTCBiRmluZFNlbCA9IGR3U3RhdGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZDsNCisgICAgICAgIGlmICghYkZpbmRTZWwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgRkFMU0UpOw0KKyAgICAgICAgaWYgKCFiTXVsdGkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OlNlbGVjdEFsbCgpDQorew0KKyAgICBGWF9CT09MIGJNdWx0aSA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uOw0KKyAgICBpZiAoIWJNdWx0aSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbVN0YXJ0ID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCAwKTsNCisgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW1FbmQgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlDb3VudCAtIDEpOw0KKyAgICAgICAgU2V0U2VsZWN0aW9uKGhJdGVtU3RhcnQsIGhJdGVtRW5kLCBGQUxTRSk7DQorICAgIH0NCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldEZvY3VzZWRJdGVtKCkNCit7DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgTlVMTCk7DQorICAgICAgICBpZiAocERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSkgJiBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkKSB7DQorICAgICAgICAgICAgcmV0dXJuIGhJdGVtOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgRldMX0hMSVNUSVRFTSBoRm9jdXMgPSBHZXRGb2N1c2VkSXRlbSgpOw0KKyAgICBpZiAoaEl0ZW0gIT0gaEZvY3VzKSB7DQorICAgICAgICBpZiAoaEZvY3VzKSB7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzKTsNCisgICAgICAgICAgICBkd1N0eWxlICY9IH5GV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICAgICAgICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzLCBkd1N0eWxlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChoSXRlbSkgew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgICAgICAgICBkd1N0eWxlIHw9IEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQ7DQorICAgICAgICAgICAgcERhdGEtPlNldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSwgZHdTdHlsZSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGZ4IC09IG1fcnRDb25lbnQubGVmdCwgZnkgLT0gbV9ydENvbmVudC50b3A7DQorICAgIEZYX0ZMT0FUIGZQb3NYID0gMC4wZjsNCisgICAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgICAgIGZQb3NYID0gbV9wSG9yelNjcm9sbEJhci0+R2V0UG9zKCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlBvc1kgPSAwLjA7DQorICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgICBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgICB9DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICAgIGlmICghaEl0ZW0pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9SZWN0RiBydEl0ZW07DQorICAgICAgICBwRGF0YS0+R2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCisgICAgICAgIHJ0SXRlbS5PZmZzZXQoLWZQb3NYLCAtZlBvc1kpOw0KKyAgICAgICAgaWYgKHJ0SXRlbS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIGhJdGVtOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveEltcDo6R2V0SXRlbUNoZWNrUmVjdChGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYgJnJ0Q2hlY2spDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgRkFMU0UpOw0KKyAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9DaGVjaykpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgcERhdGEtPkdldEl0ZW1DaGVja1JlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRDaGVjayk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveEltcDo6R2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGQUxTRSk7DQorICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICByZXR1cm4gKHBEYXRhLT5HZXRJdGVtQ2hlY2tTdGF0ZShtX3BJbnRlcmZhY2UsIGhJdGVtKSAmIEZXTF9JVEVNU1RBVEVfTFRCX0NoZWNrZWQpOw0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveEltcDo6U2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiQ2hlY2tlZCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGQUxTRSk7DQorICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9EV09SRCBkd0NoZWNrU3RhdGUgPSBwRGF0YS0+R2V0SXRlbUNoZWNrU3RhdGUobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIGlmIChiQ2hlY2tlZCkgew0KKyAgICAgICAgcERhdGEtPlNldEl0ZW1DaGVja1N0YXRlKG1fcEludGVyZmFjZSwgaEl0ZW0sIEZXTF9JVEVNU1RBVEVfTFRCX0NoZWNrZWQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcERhdGEtPlNldEl0ZW1DaGVja1N0YXRlKG1fcEludGVyZmFjZSwgaEl0ZW0sIDApOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveEltcDo6U2Nyb2xsVG9WaXNpYmxlKEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFZlcnRTY3JvbGxCYXIsIEZBTFNFKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KKyAgICBGWF9CT09MIGJTY3JvbGwgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZlBvc1kgPSBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgcnRJdGVtLk9mZnNldCgwLCAtIGZQb3NZICsgbV9ydENvbmVudC50b3ApOw0KKyAgICBpZiAocnRJdGVtLnRvcCA8IG1fcnRDb25lbnQudG9wKSB7DQorICAgICAgICBmUG9zWSArPSBydEl0ZW0udG9wIC0gbV9ydENvbmVudC50b3A7DQorICAgICAgICBiU2Nyb2xsID0gVFJVRTsNCisgICAgfSBlbHNlIGlmIChydEl0ZW0uYm90dG9tKCkgPiBtX3J0Q29uZW50LmJvdHRvbSgpKSB7DQorICAgICAgICBmUG9zWSArPSBydEl0ZW0uYm90dG9tKCkgLSBtX3J0Q29uZW50LmJvdHRvbSgpOw0KKyAgICAgICAgYlNjcm9sbCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKCFiU2Nyb2xsKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3NZKTsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvc1kpOw0KKyAgICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhlbWUpOw0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0JhY2tncm91bmQ7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSAwOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2xpZW50Ow0KKyAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSAmJiBJc1Nob3dTY3JvbGxCYXIoVFJVRSkpIHsNCisgICAgICAgIHBhcmFtLm1fcERhdGEgPSAmbV9ydFN0YXRpYzsNCisgICAgfQ0KKyAgICBpZiAoIUlzRW5hYmxlZCgpKSB7DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9MVEJfRGlzYWJsZWQ7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6RHJhd0l0ZW1zKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBGWF9GTE9BVCBmUG9zWCA9IDAuMGY7DQorICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICBmUG9zWCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZQb3NZID0gMC4wZjsNCisgICAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICAgIGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0VmlldyhtX3J0Q29uZW50KTsNCisgICAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgICAgIHJ0Vmlldy5oZWlnaHQgLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQorICAgIH0NCisgICAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICAgIHJ0Vmlldy53aWR0aCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJNdWx0aUNvbCA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpQ29sdW1uOw0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUmVjdEYgcnRJdGVtOw0KKyAgICAgICAgcERhdGEtPkdldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQorICAgICAgICBydEl0ZW0uT2Zmc2V0KG1fcnRDb25lbnQubGVmdCAtIGZQb3NYLCBtX3J0Q29uZW50LnRvcCAtIGZQb3NZKTsNCisgICAgICAgIGlmIChydEl0ZW0uYm90dG9tKCkgPCBtX3J0Q29uZW50LnRvcCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJ0SXRlbS50b3AgPj0gbV9ydENvbmVudC5ib3R0b20oKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJNdWx0aUNvbCAmJiBydEl0ZW0ubGVmdCA+IG1fcnRDb25lbnQucmlnaHQoKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX093bmVyRHJhdykgew0KKyAgICAgICAgICAgIENGV0xfRXZ0THRiRHJhd0l0ZW0gZXY7DQorICAgICAgICAgICAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgIGV2Lm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICAgICAgICAgIGV2Lm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICAgICAgICAgICAgZXYubV9pbmRleCA9IGk7DQorICAgICAgICAgICAgZXYubV9yZWN0ID0gcnRJdGVtOw0KKyAgICAgICAgICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRHJhd0l0ZW0ocEdyYXBoaWNzLCBwVGhlbWUsIGhJdGVtLCBpLCBydEl0ZW0sIHBNYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3SXRlbShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0lOVDMyIEluZGV4LCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgRlhfRFdPUkQgZHdJdGVtU3R5bGVzID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIEZYX0RXT1JEIGR3UGFydFN0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX05vcm1hbDsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICAgIGR3UGFydFN0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX0Rpc2FibGVkOw0KKyAgICB9IGVsc2UgaWYgKGR3SXRlbVN0eWxlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQorICAgICAgICBkd1BhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9TZWxlY3RlZDsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkICYmIGR3SXRlbVN0eWxlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgICAgIGR3UGFydFN0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICB9DQorICAgIEZXTF9MaXN0Qm94SXRlbURhdGEgaXRlbURhdGE7DQorICAgIGl0ZW1EYXRhLnBEYXRhUHJvdmlkZXIgPSBwRGF0YTsNCisgICAgaXRlbURhdGEuaUluZGV4ID0gSW5kZXg7DQorICAgIHsNCisgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9MaXN0SXRlbTsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBkd1BhcnRTdGF0ZXM7DQorICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0SXRlbTsNCisgICAgICAgIHBhcmFtLm1fZHdEYXRhID0gKEZYX0RXT1JEKShGWF9VSU5UUFRSKSgmaXRlbURhdGEpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0Rm9jdXMocnRJdGVtKTsNCisgICAgICAgIHBhcmFtLm1fcERhdGEgPSAmcnRGb2N1czsNCisgICAgICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyICYmICFtX3BIb3J6U2Nyb2xsQmFyICYmIChkd1BhcnRTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0xUQl9Gb2N1c2VkKSkgew0KKyAgICAgICAgICAgIHBhcmFtLm1fcnRQYXJ0LmxlZnQgKz0gMTsNCisgICAgICAgICAgICBwYXJhbS5tX3J0UGFydC53aWR0aCAtPSAobV9mU2NvcmxsQmFyV2lkdGggKyAxKTsNCisgICAgICAgICAgICBydEZvY3VzLkRlZmxhdGUoMC41LCAwLjUsIDEgKyBtX2ZTY29ybGxCYXJXaWR0aCwgMSk7DQorICAgICAgICB9DQorICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCisgICAgew0KKyAgICAgICAgRlhfQk9PTCBiSGFzSWNvbiA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICAgICAgICBpZiAoYkhhc0ljb24pIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRESUI7DQorICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwRGliID0gcERhdGEtPkdldEl0ZW1JY29uKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICAgICAgICAgIHJ0RElCLlNldChydEl0ZW0ubGVmdCwgcnRJdGVtLnRvcCwgcnRJdGVtLmhlaWdodCwgcnRJdGVtLmhlaWdodCk7DQorICAgICAgICAgICAgaWYgKHBEaWIpIHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9JY29uOw0KKyAgICAgICAgICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgICAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydERJQjsNCisgICAgICAgICAgICAgICAgcGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKEZYX1VJTlRQVFIpKCZpdGVtRGF0YSk7DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fcEltYWdlID0gcERpYjsNCisgICAgICAgICAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYkhhc0NoZWNrID0gR2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9MVEJfQ2hlY2s7DQorICAgICAgICBpZiAoYkhhc0NoZWNrKSB7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2hlY2s7DQorICAgICAgICAgICAgcnRDaGVjay5TZXQocnRJdGVtLmxlZnQsIHJ0SXRlbS50b3AsIHJ0SXRlbS5oZWlnaHQsIHJ0SXRlbS5oZWlnaHQpOw0KKyAgICAgICAgICAgIHJ0Q2hlY2suRGVmbGF0ZSgyLCAyLCAyLCAyKTsNCisgICAgICAgICAgICBwRGF0YS0+U2V0SXRlbUNoZWNrUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydENoZWNrKTsNCisgICAgICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9DaGVjazsNCisgICAgICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgICAgICBpZiAoR2V0SXRlbUNoZWNrZWQoaEl0ZW0pKSB7DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9DaGVja2VkOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9VbkNoZWNrZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydENoZWNrOw0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdEYXRhID0gKEZYX0RXT1JEKShGWF9VSU5UUFRSKSgmaXRlbURhdGEpOw0KKyAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIHBEYXRhLT5HZXRJdGVtVGV4dChtX3BJbnRlcmZhY2UsIGhJdGVtLCB3c1RleHQpOw0KKyAgICAgICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA8PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0VGV4dChydEl0ZW0pOw0KKyAgICAgICAgcnRUZXh0LkRlZmxhdGUoRldMX0xJU1RCT1hfSXRlbVRleHRNYXJnaW4sIEZXTF9MSVNUQk9YX0l0ZW1UZXh0TWFyZ2luKTsNCisgICAgICAgIGlmIChiSGFzSWNvbiB8fCBiSGFzQ2hlY2spIHsNCisgICAgICAgICAgICBydFRleHQuRGVmbGF0ZShydEl0ZW0uaGVpZ2h0LCAwLCAwLCAwKTsNCisgICAgICAgIH0NCisgICAgICAgIENGV0xfVGhlbWVUZXh0IHRleHRQYXJhbTsNCisgICAgICAgIHRleHRQYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICB0ZXh0UGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9MaXN0SXRlbTsNCisgICAgICAgIHRleHRQYXJhbS5tX2R3U3RhdGVzID0gZHdQYXJ0U3RhdGVzOw0KKyAgICAgICAgdGV4dFBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICAgICAgdGV4dFBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB0ZXh0UGFyYW0ubV9ydFBhcnQgPSBydFRleHQ7DQorICAgICAgICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c1RleHQ7DQorICAgICAgICB0ZXh0UGFyYW0ubV9kd1RUT1N0eWxlcyA9IG1fZHdUVE9TdHlsZXM7DQorICAgICAgICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBtX2lUVE9BbGlnbnM7DQorICAgICAgICB0ZXh0UGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKEZYX1VJTlRQVFIpKCZpdGVtRGF0YSk7DQorICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KKyAgICB9DQorfQ0KK0NGWF9TaXplRiBDRldMX0xpc3RCb3hJbXA6OkNhbGNTaXplKEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIENGWF9TaXplRiBmczsNCisgICAgZnMuU2V0KDAsIDApOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIGZzKTsNCisgICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgICAgbV9ydENvbmVudCA9IG1fcnRDbGllbnQ7DQorICAgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgICBydFVJTWFyZ2luLlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKCFtX3BPdXRlcikgew0KKyAgICAgICAgQ0ZYX1JlY3RGKiBwVUlNYXJnaW4gPSAoQ0ZYX1JlY3RGKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbik7DQorICAgICAgICBpZiAocFVJTWFyZ2luKSB7DQorICAgICAgICAgICAgbV9ydENvbmVudC5EZWZsYXRlKHBVSU1hcmdpbi0+bGVmdCwgcFVJTWFyZ2luLT50b3AsIHBVSU1hcmdpbi0+d2lkdGgsIHBVSU1hcmdpbi0+aGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+SXNDdXN0b21pemVkTGF5b3V0KG1fcEludGVyZmFjZSkpIHsNCisgICAgICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgaWYgKCFiQXV0b1NpemUpIHsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgICAgICAgQ0ZXTF9UaGVtZVBhcnQgaXRlbVBhcnQ7DQorICAgICAgICAgICAgaXRlbVBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgIGl0ZW1QYXJ0Lm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfTGlzdEl0ZW07DQorICAgICAgICAgICAgaXRlbVBhcnQubV9wRGF0YSA9IG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICBpdGVtUGFydC5tX2R3RGF0YSA9IGk7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHI7DQorICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+R2V0UGFydFJlY3QoJml0ZW1QYXJ0LCByKTsNCisgICAgICAgICAgICBpZiAoIWJBdXRvU2l6ZSkgew0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRJdGVtOw0KKyAgICAgICAgICAgICAgICBydEl0ZW0uU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AgKyBmcy55LCByLndpZHRoLCByLmhlaWdodCk7DQorICAgICAgICAgICAgICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgICAgICAgICBwRGF0YS0+U2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZnMueSArPSByLmhlaWdodDsNCisgICAgICAgICAgICBpZiAoZnMueCA8IHIud2lkdGgpIHsNCisgICAgICAgICAgICAgICAgZnMueCA9IHIud2lkdGg7DQorICAgICAgICAgICAgICAgIGZXaWR0aCA9IHIud2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZldpZHRoID0gR2V0TWF4VGV4dFdpZHRoKCk7DQorICAgICAgICBmV2lkdGggKz0gMiAqIEZXTF9MSVNUQk9YX0l0ZW1UZXh0TWFyZ2luOw0KKyAgICAgICAgaWYgKCFiQXV0b1NpemUpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmQWN0dWFsV2lkdGggPSBtX3J0Q2xpZW50LndpZHRoIC0gcnRVSU1hcmdpbi5sZWZ0IC0gcnRVSU1hcmdpbi53aWR0aDsNCisgICAgICAgICAgICBpZiAoZldpZHRoIDwgZkFjdHVhbFdpZHRoKSB7DQorICAgICAgICAgICAgICAgIGZXaWR0aCA9IGZBY3R1YWxXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgIG1fZkl0ZW1IZWlnaHQgPSBHZXRJdGVtSGVpZ3QoKTsNCisgICAgICAgIEZYX0JPT0wgYkhhc0ljb247DQorICAgICAgICBiSGFzSWNvbiA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICAgICAgICBpZiAoYkhhc0ljb24pIHsNCisgICAgICAgICAgICBmV2lkdGggKz0gbV9mSXRlbUhlaWdodDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBodGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICAgICAgICBHZXRJdGVtU2l6ZShmcywgaHRlbSwgZldpZHRoLCBtX2ZJdGVtSGVpZ2h0LCBiQXV0b1NpemUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQXV0b1NpemUpIHsNCisgICAgICAgIHJldHVybiBmczsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBpV2lkdGggPSBtX3J0Q2xpZW50LndpZHRoIC0gcnRVSU1hcmdpbi5sZWZ0IC0gcnRVSU1hcmdpbi53aWR0aDsNCisgICAgRlhfRkxPQVQgaUhlaWdodCA9IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgICBGWF9CT09MIGJTaG93VmVydFNjciA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyQWxhd2F5cykgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKTsNCisgICAgRlhfQk9PTCBiU2hvd0hvcnpTY3IgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckFsYXdheXMpICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSFNjcm9sbCk7DQorICAgIGlmICghYlNob3dWZXJ0U2NyICYmIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCAmJg0KKyAgICAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aUNvbHVtbikgPT0gMCkgew0KKyAgICAgICAgYlNob3dWZXJ0U2NyID0gKGZzLnkgPiBpSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBpZiAoIWJTaG93SG9yelNjciAmJiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpIHsNCisgICAgICAgIGJTaG93SG9yelNjciA9IChmcy54ID4gaVdpZHRoKTsNCisgICAgfQ0KKyAgICBDRlhfU2l6ZUYgc3pSYW5nZTsNCisgICAgaWYgKGJTaG93VmVydFNjcikgew0KKyAgICAgICAgaWYgKCFtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgICAgICAgSW5pdFNjcm9sbEJhcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0U2Nyb2xsQmFyOw0KKyAgICAgICAgcnRTY3JvbGxCYXIuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIG1fZlNjb3JsbEJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0IC0gMSk7DQorICAgICAgICBpZiAoYlNob3dIb3J6U2NyKSB7DQorICAgICAgICAgICAgcnRTY3JvbGxCYXIuaGVpZ2h0IC09IG1fZlNjb3JsbEJhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFNjcm9sbEJhcik7DQorICAgICAgICBzelJhbmdlLnggPSAwLCBzelJhbmdlLnkgPSBmcy55IC0gbV9ydENvbmVudC5oZWlnaHQ7DQorICAgICAgICBpZiAoc3pSYW5nZS55IDwgbV9mSXRlbUhlaWdodCkgew0KKyAgICAgICAgICAgIHN6UmFuZ2UueSA9IG1fZkl0ZW1IZWlnaHQ7DQorICAgICAgICB9DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRSYW5nZShzelJhbmdlLngsIHN6UmFuZ2UueSk7DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRQYWdlU2l6ZShydFNjcm9sbEJhci5oZWlnaHQgKiA5IC8gMTApOw0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUobV9mSXRlbUhlaWdodCk7DQorICAgICAgICBGWF9GTE9BVCBmUG9zID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICAgICAgICBpZiAoZlBvcyA8IDApIHsNCisgICAgICAgICAgICBmUG9zID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChmUG9zID4gc3pSYW5nZS55KSB7DQorICAgICAgICAgICAgZlBvcyA9IHN6UmFuZ2UueTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCisgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMpID09IDAgfHwgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkpIHsNCisgICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgIH0gZWxzZSBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKDApOw0KKyAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoMCk7DQorICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICAgIH0NCisgICAgaWYgKGJTaG93SG9yelNjcikgew0KKyAgICAgICAgaWYgKCFtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICAgICAgSW5pdFNjcm9sbEJhcihGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUmVjdEYgcnRTY3JvbGxCYXI7DQorICAgICAgICBydFNjcm9sbEJhci5TZXQobV9ydENsaWVudC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuYm90dG9tKCkgLSBtX2ZTY29ybGxCYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoKTsNCisgICAgICAgIGlmIChiU2hvd1ZlcnRTY3IpIHsNCisgICAgICAgICAgICBydFNjcm9sbEJhci53aWR0aCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRTY3JvbGxCYXIpOw0KKyAgICAgICAgc3pSYW5nZS54ID0gMCwgc3pSYW5nZS55ID0gZnMueCAtIHJ0U2Nyb2xsQmFyLndpZHRoOw0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UmFuZ2Uoc3pSYW5nZS54LCBzelJhbmdlLnkpOw0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UGFnZVNpemUoZldpZHRoICogOSAvIDEwKTsNCisgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0ZXBTaXplKGZXaWR0aCAvIDEwKTsNCisgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgICAgIGlmIChmUG9zIDwgMCkgew0KKyAgICAgICAgICAgIGZQb3MgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZQb3MgPiBzelJhbmdlLnkpIHsNCisgICAgICAgICAgICBmUG9zID0gc3pSYW5nZS55Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KKyAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQorICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgPT0gMCB8fCAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSkgew0KKyAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgfSBlbHNlIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQb3MoMCk7DQorICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRUcmFja1BvcygwKTsNCisgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAoYlNob3dWZXJ0U2NyICYmIGJTaG93SG9yelNjcikgew0KKyAgICAgICAgbV9ydFN0YXRpYy5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gbV9mU2NvcmxsQmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9mU2NvcmxsQmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBtX2ZTY29ybGxCYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZnM7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtU2l6ZShDRlhfU2l6ZUYgJnNpemUsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgbV9mSXRlbUhlaWdodCwgRlhfQk9PTCBiQXV0b1NpemUpDQorew0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW4pIHsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICghYkF1dG9TaXplKSB7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgICAgICAgICBydEl0ZW0uU2V0KDAsIHNpemUueSwgZldpZHRoLCBtX2ZJdGVtSGVpZ2h0KTsNCisgICAgICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgICAgICBwRGF0YS0+U2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUueCA9IGZXaWR0aDsNCisgICAgICAgIHNpemUueSArPSBtX2ZJdGVtSGVpZ2h0Ow0KKyAgICB9DQorfQ0KK0ZYX0ZMT0FUIENGV0xfTGlzdEJveEltcDo6R2V0TWF4VGV4dFdpZHRoKCkNCit7DQorICAgIEZYX0ZMT0FUIGZSZXQgPSAwLjBmOw0KKyAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgICAgaWYgKHN6LnggPiBmUmV0KSB7DQorICAgICAgICAgICAgZlJldCA9IHN6Lng7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGZSZXQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfTGlzdEJveEltcDo6R2V0U2Nyb2xsV2lkdGgoKQ0KK3sNCisgICAgRlhfRkxPQVQgKnBmV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwZldpZHRoLCAwKTsNCisgICAgcmV0dXJuICpwZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1IZWlndCgpDQorew0KKyAgICBGWF9GTE9BVCAqcGZGb250ID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZGb250LCAyMCk7DQorICAgIHJldHVybiAqcGZGb250ICsgMiAqIEZXTF9MSVNUQk9YX0l0ZW1UZXh0TWFyZ2luOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6SW5pdFNjcm9sbEJhcihGWF9CT09MIGJWZXJ0ICkNCit7DQorICAgIGlmICgoYlZlcnQgJiYgbV9wVmVydFNjcm9sbEJhcikgfHwgKCFiVmVydCAmJiBtX3BIb3J6U2Nyb2xsQmFyKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBiVmVydCA/IEZXTF9TVFlMRUVYVF9TQ0JfVmVydCA6IEZXTF9TVFlMRUVYVF9TQ0JfSG9yejsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFNjcm9sbEJhclRQOw0KKyAgICBJRldMX1Njcm9sbEJhciAqcFNjcm9sbEJhciA9IElGV0xfU2Nyb2xsQmFyOjpDcmVhdGUoKTsNCisgICAgcFNjcm9sbEJhci0+SW5pdGlhbGl6ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgICBiVmVydCA/IChtX3BWZXJ0U2Nyb2xsQmFyID0gcFNjcm9sbEJhcikgOiAobV9wSG9yelNjcm9sbEJhciA9IHBTY3JvbGxCYXIpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U29ydEl0ZW0oKQ0KK3sNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OklzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KQ0KK3sNCisgICAgSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGxiYXIgPSBiVmVydCA/IG1fcFZlcnRTY3JvbGxCYXIgOiBtX3BIb3J6U2Nyb2xsQmFyOw0KKyAgICBpZiAoIXBTY3JvbGxiYXIgfHwgKHBTY3JvbGxiYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMpIHx8IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6UHJvY2Vzc1NlbENoYW5nZWQoKQ0KK3sNCisgICAgQ0ZXTF9FdnRMdGJTZWxDaGFuZ2VkIHNlbEV2ZW50Ow0KKyAgICBzZWxFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIENGWF9JbnQzMkFycmF5IGFyclNlbHM7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IENvdW50U2VsSXRlbXMoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBpdGVtID0gR2V0U2VsSXRlbShpKTsNCisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHNlbEV2ZW50LmlhcnJheVNlbHMuQWRkKGkpOw0KKyAgICB9DQorICAgIERpc3BhdGNoRXZlbnQoJnNlbEV2ZW50KTsNCit9DQorQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6OkNGV0xfTGlzdEJveEltcERlbGVnYXRlKENGV0xfTGlzdEJveEltcCAqcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgICAgaWYgKCFtX3BPd25lci0+SXNFbmFibGVkKCkpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSAxOw0KKyAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2VXaGVlbDogew0KKyAgICAgICAgICAgICAgICBPbk1vdXNlV2hlZWwoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgICAgICAgICAgICBDRldMX01zZ0tleSAqcE1zZyA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICAgICAgICAgICAgaWYgKGR3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICAgICAgICAgICAgICAgICAgT25LZXlEb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgaVJldCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRXZlbnQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKHBFdmVudC0+R2V0Q2xhc3NJRCgpICE9IEZXTF9FVlRIQVNIX1Njcm9sbCkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0ICpwU3JjVGFyZ2V0ID0gcEV2ZW50LT5tX3BTcmNUYXJnZXQ7DQorICAgIGlmICgocFNyY1RhcmdldCA9PSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB8fCAocFNyY1RhcmdldCA9PSAgKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wSG9yelNjcm9sbEJhciAmJiBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhcikpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3U2Nyb2xsQ29kZSA9ICgoQ0ZXTF9FdnRTY3JvbGwqKXBFdmVudCktPm1faVNjcm9sbENvZGU7DQorICAgICAgICBGWF9GTE9BVCBmUG9zID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9mUG9zOw0KKyAgICAgICAgT25TY3JvbGwoKElGV0xfU2Nyb2xsQmFyKilwU3JjVGFyZ2V0LCBkd1Njcm9sbENvZGUsIGZQb3MpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0KQ0KK3sNCisgICAgaWYgKG1fcE93bmVyLT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMpIHsNCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgIWJTZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPm1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYlNldCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJTZXQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IChGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+KEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRGb2N1cyhUUlVFKTsNCisgICAgfQ0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW1BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbikgew0KKyAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpIHsNCisgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCA9IG1fcE93bmVyLT5Jc0l0ZW1TZWxlY3RlZChoSXRlbSk7DQorICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgIWJTZWxlY3RlZCk7DQorICAgICAgICAgICAgbV9wT3duZXItPm1faEFuY2hvciA9IGhJdGVtOw0KKyAgICAgICAgfSBlbHNlIGlmIChwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19TaGlmdCkgew0KKyAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9oQW5jaG9yKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24obV9wT3duZXItPm1faEFuY2hvciwgaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihoSXRlbSwgaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX2hBbmNob3IgPSBoSXRlbTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSB7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhTZWxlY3RlZEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICBDRlhfUmVjdEYgcnRDaGVjazsNCisgICAgICAgIG1fcE93bmVyLT5HZXRJdGVtQ2hlY2tSZWN0KGhTZWxlY3RlZEl0ZW0sIHJ0Q2hlY2spOw0KKyAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IG1fcE93bmVyLT5HZXRJdGVtQ2hlY2tlZChoSXRlbSk7DQorICAgICAgICBpZiAocnRDaGVjay5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgICAgIGlmIChiQ2hlY2tlZCkgew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+U2V0SXRlbUNoZWNrZWQoaEl0ZW0sIEZBTFNFKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+U2V0SXRlbUNoZWNrZWQoaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9wT3duZXItPlNldEZvY3VzSXRlbShoSXRlbSk7DQorICAgIG1fcE93bmVyLT5TY3JvbGxUb1Zpc2libGUoaEl0ZW0pOw0KKyAgICBtX3BPd25lci0+U2V0R3JhYihUUlVFKTsNCisgICAgbV9wT3duZXItPlByb2Nlc3NTZWxDaGFuZ2VkKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAobV9wT3duZXItPm1fYkxCdXR0b25Eb3duKSB7DQorICAgICAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCisgICAgICAgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCisgICAgICAgIERpc3BhdGNoU2VsQ2hhbmdlZEV2KCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZVdoZWVsKENGV0xfTXNnTW91c2VXaGVlbCAqcE1zZykNCit7DQorICAgIGlmICghbV9wT3duZXItPklzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpDQorew0KKyAgICBGWF9EV09SRCBkd0tleUNvZGUgPSBwTXNnLT5tX2R3S2V5Q29kZTsNCisgICAgc3dpdGNoKGR3S2V5Q29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9UYWI6DQorICAgICAgICBjYXNlIEZXTF9WS0VZX1VwOg0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOg0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9Ib21lOg0KKyAgICAgICAgY2FzZSBGV0xfVktFWV9FbmQ6IHsNCisgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IG1fcE93bmVyLT5HZXRGb2N1c2VkSXRlbSgpOw0KKyAgICAgICAgICAgICAgICBoSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtKGhJdGVtLCBkd0tleUNvZGUpOw0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0Ow0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsID0gcE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ3RybDsNCisgICAgICAgICAgICAgICAgT25WSyhoSXRlbSwgYlNoaWZ0LCBiQ3RybCk7DQorICAgICAgICAgICAgICAgIERpc3BhdGNoU2VsQ2hhbmdlZEV2KCk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Qcm9jZXNzU2VsQ2hhbmdlZCgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uVksoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpDQorew0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbikgew0KKyAgICAgICAgaWYgKGJDdHJsKSB7DQorICAgICAgICB9IGVsc2UgaWYgKGJTaGlmdCkgew0KKyAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9oQW5jaG9yKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24obV9wT3duZXItPm1faEFuY2hvciwgaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihoSXRlbSwgaEl0ZW0sIFRSVUUpOw0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX2hBbmNob3IgPSBoSXRlbTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+U2V0Rm9jdXNJdGVtKGhJdGVtKTsNCisgICAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQorICAgIHsNCisgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgICAgICBydEludmFsaWRhdGUuU2V0KDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25TY3JvbGwoSUZXTF9TY3JvbGxCYXIgKnBTY3JvbGxCYXIsIEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykNCit7DQorICAgIENGWF9TaXplRiBmczsNCisgICAgcFNjcm9sbEJhci0+R2V0UmFuZ2UoZnMueCwgZnMueSk7DQorICAgIEZYX0ZMT0FUIGlDdXJQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgRlhfRkxPQVQgZlN0ZXAgPSBwU2Nyb2xsQmFyLT5HZXRTdGVwU2l6ZSgpOw0KKyAgICBzd2l0Y2ggKGR3Q29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9NaW46IHsNCisgICAgICAgICAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfTWF4OiB7DQorICAgICAgICAgICAgICAgIGZQb3MgPSBmcy55Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZDogew0KKyAgICAgICAgICAgICAgICBmUG9zIC09IGZTdGVwOw0KKyAgICAgICAgICAgICAgICBpZiAoZlBvcyA8IGZzLnggKyBmU3RlcCAvIDIpIHsNCisgICAgICAgICAgICAgICAgICAgIGZQb3MgPSBmcy54Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEZvcndhcmQ6IHsNCisgICAgICAgICAgICAgICAgZlBvcyArPSBmU3RlcDsNCisgICAgICAgICAgICAgICAgaWYgKGZQb3MgPiBmcy55IC0gZlN0ZXAgLyAyKSB7DQorICAgICAgICAgICAgICAgICAgICBmUG9zID0gZnMueTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1BhZ2VCYWNrd2FyZDogew0KKyAgICAgICAgICAgICAgICBmUG9zIC09IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgICAgICAgICAgIGlmIChmUG9zIDwgZnMueCkgew0KKyAgICAgICAgICAgICAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZDogew0KKyAgICAgICAgICAgICAgICBmUG9zICs9IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgICAgICAgICAgIGlmIChmUG9zID4gZnMueSkgew0KKyAgICAgICAgICAgICAgICAgICAgZlBvcyA9IGZzLnk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9Qb3M6DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1RyYWNrUG9zOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9FbmRTY3JvbGw6DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChpQ3VyUG9zICE9IGZQb3MpIHsNCisgICAgICAgIHBTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCisgICAgICAgIHBTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6RGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKQ0KK3sNCisgICAgQ0ZXTF9FdnRMdGJTZWxDaGFuZ2VkIGV2Ow0KKyAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmZXYpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbW9udGhjYWxlbmRhcmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbW9udGhjYWxlbmRhcmltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4ZGViOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyaW1wLmNwcApAQCAtMCwwICsxLDExMTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmgiDQorI2RlZmluZSBNT05USENBTF9IU0VQX0hFSUdIVAkJCTENCisjZGVmaW5lIE1PTlRIQ0FMX1ZTRVBfV0lEVEgJCQkJMQ0KKyNkZWZpbmUgTU9OVEhDQUxfSE1BUkdJTgkJCQkzDQorI2RlZmluZSBNT05USENBTF9WTUFSR0lOCQkJCTINCisjZGVmaW5lIE1PTlRIQ0FMX1JPV1MJCQkJCTkNCisjZGVmaW5lIE1PTlRIQ0FMX0NPTFVNTlMJCQkJNw0KKyNkZWZpbmUgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOCQk3DQorI2RlZmluZSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4JCTUNCitJRldMX01vbnRoQ2FsZW5kYXIqIElGV0xfTW9udGhDYWxlbmRhcjo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBuZXcgSUZXTF9Nb250aENhbGVuZGFyOw0KK30NCitJRldMX01vbnRoQ2FsZW5kYXI6OklGV0xfTW9udGhDYWxlbmRhcigpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9Nb250aENhbGVuZGFyOjp+SUZXTF9Nb250aENhbGVuZGFyKCkNCit7DQorICAgIGlmIChtX3BEYXRhKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgSUZXTF9Nb250aENhbGVuZGFyOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfTW9udGhDYWxlbmRhckltcChwT3V0ZXIpOw0KKyAgICAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfTW9udGhDYWxlbmRhcjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfTW9udGhDYWxlbmRhckltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGWF9JTlQzMiBJRldMX01vbnRoQ2FsZW5kYXI6OkNvdW50U2VsZWN0KCkNCit7DQorICAgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPkNvdW50U2VsZWN0KCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Nb250aENhbGVuZGFyOjpHZXRTZWxlY3QoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSwgRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhKS0+R2V0U2VsZWN0KGlZZWFyLCBpTW9udGgsIGlEYXksIG5JbmRleCk7DQorfQ0KK0ZYX0JPT0wJSUZXTF9Nb250aENhbGVuZGFyOjpTZXRTZWxlY3QoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkNCit7DQorICAgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPlNldFNlbGVjdChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCit9DQorQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDRldMX01vbnRoQ2FsZW5kYXJJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1faUxCdG5QYXJ0U3RhdGVzKEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbCkNCisgICAgLCBtX2lSQnRuUGFydFN0YXRlcyhGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWwpDQorICAgICwgbV9pQ3VyTW9udGgoMSkNCisgICAgLCBtX2lDdXJZZWFyKDIwMTEpDQorICAgICwgbV9pWWVhcigyMDExKQ0KKyAgICAsIG1faU1vbnRoKDEpDQorICAgICwgbV9pRGF5KDEpDQorICAgICwgbV9pSG92ZXJlZCgtMSkNCit7DQorICAgIG1fcnRIZWFkLlJlc2V0KCk7DQorICAgIG1fcnRXZWVrLlJlc2V0KCk7DQorICAgIG1fcnRMQnRuLlJlc2V0KCk7DQorICAgIG1fcnRSQnRuLlJlc2V0KCk7DQorICAgIG1fcnREYXRlcy5SZXNldCgpOw0KKyAgICBtX3J0SFNlcC5SZXNldCgpOw0KKyAgICBtX3J0SGVhZFRleHQuUmVzZXQoKTsNCisgICAgbV9ydFRvZGF5LlJlc2V0KCk7DQorICAgIG1fcnRUb2RheUZsYWcuUmVzZXQoKTsNCisgICAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgICBtX3J0V2Vla051bS5SZXNldCgpOw0KKyAgICBtX3J0V2Vla051bVNlcC5SZXNldCgpOw0KKyAgICBtX3N6SGVhZC5SZXNldCgpOw0KKyAgICBtX3N6Q2VsbC5SZXNldCgpOw0KKyAgICBtX3N6VG9kYXkuUmVzZXQoKTsNCisgICAgbV9wRGF0ZVRpbWUgPSBuZXcgQ0ZYX0RhdGVUaW1lOw0KKyAgICBtX2JJbml0ID0gRkFMU0U7DQorICAgIG1faU1heFNlbCA9IDE7DQorfQ0KK0NGV0xfTW9udGhDYWxlbmRhckltcDo6Q0ZXTF9Nb250aENhbGVuZGFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9pTEJ0blBhcnRTdGF0ZXMoRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsKQ0KKyAgICAsIG1faVJCdG5QYXJ0U3RhdGVzKEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbCkNCisgICAgLCBtX2lDdXJNb250aCgxKQ0KKyAgICAsIG1faUN1clllYXIoMjAxMSkNCisgICAgLCBtX2lZZWFyKDIwMTEpDQorICAgICwgbV9pTW9udGgoMSkNCisgICAgLCBtX2lEYXkoMSkNCisgICAgLCBtX2lIb3ZlcmVkKC0xKQ0KK3sNCisgICAgbV9ydEhlYWQuUmVzZXQoKTsNCisgICAgbV9ydFdlZWsuUmVzZXQoKTsNCisgICAgbV9ydExCdG4uUmVzZXQoKTsNCisgICAgbV9ydFJCdG4uUmVzZXQoKTsNCisgICAgbV9ydERhdGVzLlJlc2V0KCk7DQorICAgIG1fcnRIU2VwLlJlc2V0KCk7DQorICAgIG1fcnRIZWFkVGV4dC5SZXNldCgpOw0KKyAgICBtX3J0VG9kYXkuUmVzZXQoKTsNCisgICAgbV9ydFRvZGF5RmxhZy5SZXNldCgpOw0KKyAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICAgIG1fcnRXZWVrTnVtLlJlc2V0KCk7DQorICAgIG1fcnRXZWVrTnVtU2VwLlJlc2V0KCk7DQorICAgIG1fc3pIZWFkLlJlc2V0KCk7DQorICAgIG1fc3pDZWxsLlJlc2V0KCk7DQorICAgIG1fc3pUb2RheS5SZXNldCgpOw0KKyAgICBtX3BEYXRlVGltZSA9IG5ldyBDRlhfRGF0ZVRpbWU7DQorICAgIG1fYkluaXQgPSBGQUxTRTsNCisgICAgbV9pTWF4U2VsID0gMTsNCit9DQorQ0ZXTF9Nb250aENhbGVuZGFySW1wOjp+Q0ZXTF9Nb250aENhbGVuZGFySW1wKCkNCit7DQorICAgIENsZWFyRGF0ZUl0ZW0oKTsNCisgICAgZGVsZXRlIG1fcERhdGVUaW1lOw0KKyAgICBtX2FyclNlbERheXMuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICB3c0NsYXNzID0gRldMX0NMQVNTX01vbnRoQ2FsZW5kYXI7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXI7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpJbml0aWFsaXplKCkNCit7DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIGlmIChiQXV0b1NpemUpIHsNCisgICAgICAgIENGWF9TaXplRiBmcyA9IENhbGNTaXplKFRSVUUpOw0KKyAgICAgICAgcmVjdC5TZXQoMCwgMCwgZnMueCwgZnMueSk7DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlVwZGF0ZSgpDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICB9DQorICAgIEdldENhcFZhbHVlKCk7DQorICAgIGlmICghbV9iSW5pdCkgew0KKyAgICAgICAgbV9iSW5pdCA9IEluaXREYXRlKCk7DQorICAgIH0NCisgICAgQ2xlYXJEYXRlSXRlbSgpOw0KKyAgICBSZVNldERhdGVJdGVtKCk7DQorICAgIExheU91dCgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9PSBOVUxMKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX01DRF9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICAgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9NQ0RfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3SGVhZEJLKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgRHJhd0xCdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3UkJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIERyYXdTZXBlcmF0b3IocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3RGF0ZXNJbkJLKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgRHJhd0RhdGVzSW5DaXJjbGUocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3Q2FwdGlvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIERyYXdXZWVrKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgRHJhd0RhdGVzSW4ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3RGF0ZXNPdXQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3VG9kYXkocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfV2Vla051bWJlcnMpIHsNCisgICAgICAgIERyYXdXZWVrTnVtYmVyU2VwKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgICAgIERyYXdXZWVrTnVtYmVyKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfTW9udGhDYWxlbmRhckltcDo6Q291bnRTZWxlY3QoKQ0KK3sNCisgICAgcmV0dXJuIG1fYXJyU2VsRGF5cy5HZXRTaXplKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRTZWxlY3QoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSwgRlhfSU5UMzIgbkluZGV4ICkNCit7DQorICAgIGlmIChuSW5kZXggPj0gbV9hcnJTZWxEYXlzLkdldFNpemUoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlZZWFyID0gbV9pQ3VyWWVhcjsNCisgICAgaU1vbnRoID0gbV9pQ3VyTW9udGg7DQorICAgIGlEYXkgPSBtX2FyclNlbERheXNbbkluZGV4XTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpTZXRTZWxlY3QoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkNCit7DQorICAgIENoYW5nZVRvTW9udGgoaVllYXIsIGlNb250aCk7DQorICAgIHJldHVybiBBZGRTZWxEYXkoaURheSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9CYWNrZ3JvdW5kOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0Q2xpZW50Ow0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9IZWFkZXI7DQorICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRIZWFkOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdMQnV0dG9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfTEJ0bjsNCisgICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbXMubV9kd1N0YXRlcyA9IG1faUxCdG5QYXJ0U3RhdGVzOw0KKyAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0TEJ0bjsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3UkJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1JCdG47DQorICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2lSQnRuUGFydFN0YXRlczsNCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFJCdG47DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZVRleHQgdGV4dFBhcmFtOw0KKyAgICB0ZXh0UGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICB0ZXh0UGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX01DRF9DYXB0aW9uOw0KKyAgICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgICAgdGV4dFBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBGWF9JTlQzMiBpWWVhcjsNCisgICAgRlhfSU5UMzIgaU1vbnRoOw0KKyAgICBpWWVhciA9IG1faUN1clllYXI7DQorICAgIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhdGlvbjsNCisgICAgR2V0SGVhZFRleHQoaVllYXIsIGlNb250aCwgd3NDYXRpb24pOw0KKyAgICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c0NhdGlvbjsNCisgICAgbV9zekhlYWQgPSBDYWxjVGV4dFNpemUodGV4dFBhcmFtLm1fd3NUZXh0LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgQ2FsY0hlYWRTaXplKCk7DQorICAgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRIZWFkVGV4dDsNCisgICAgdGV4dFBhcmFtLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1NlcGVyYXRvcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0hTZXBhcmF0b3I7DQorICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRIU2VwOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdEYXRlc0luQksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlSW5CSzsNCisgICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpQ291bnQ7IGogKyspIHsNCisgICAgICAgIExQREFURUlORk8gcERhdGFJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChqKTsNCisgICAgICAgIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQpIHsNCisgICAgICAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICAgICAgICBpZiAoKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlKSA9PSAwKSAmJiBwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgew0KKyAgICAgICAgICAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9GbGFnZ2VkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocERhdGFJbmZvLT5kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZvY3VzZWQpIHsNCisgICAgICAgICAgICAgICAgcGFyYW1zLm1fZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfRm9jdXNlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGogPT0gbV9pSG92ZXJlZCAtIDEpIHsNCisgICAgICAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkOw0KKyAgICAgICAgfSBlbHNlIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgew0KKyAgICAgICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfRmxhZ2dlZDsNCisgICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGFyYW1zLm1fcnRQYXJ0ID0gcERhdGFJbmZvLT5yZWN0Ow0KKyAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCisgICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gMDsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1dlZWsoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9XZWVrOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgICAgRlhfSU5UMzIgaVdlZWs7DQorICAgIGlXZWVrID0gbV9wRGF0ZVRpbWUtPkdldERheU9mV2VlaygpOw0KKyAgICBDRlhfUmVjdEYgcnREYXlPZldlZWs7DQorICAgIGNvbnN0IEZYX1dDSEFSKiBwV2Vla0RheVtdID0gew0KKyAgICAgICAgKEZYX1dDSEFSICopTCJTdW4iLCAoRlhfV0NIQVIgKilMIk1vbiIsIChGWF9XQ0hBUiAqKUwiVHVlIiwNCisgICAgICAgIChGWF9XQ0hBUiAqKUwiV2VkIiwgKEZYX1dDSEFSICopTCJUaHUiLCAoRlhfV0NIQVIgKilMIkZyaSIsIChGWF9XQ0hBUiAqKUwiU2F0Ig0KKyAgICB9Ow0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDc7IGkrKykgew0KKyAgICAgICAgcnREYXlPZldlZWsuU2V0KG1fcnRXZWVrLmxlZnQgKyBpICogKG1fc3pDZWxsLnggKyBNT05USENBTF9ITUFSR0lOICogMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9ydFdlZWsudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLngsDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyAqd3NXZWVrRGF5ID0gTlVMTDsNCisgICAgICAgIHdzV2Vla0RheSA9IChDRlhfV2lkZVN0cmluZyAqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcmFtcywgaSArIEZXTF9NQ0NBUEFDSVRZX1N1bik7DQorICAgICAgICBwYXJhbXMubV9ydFBhcnQgPSBydERheU9mV2VlazsNCisgICAgICAgIHBhcmFtcy5tX3dzVGV4dCA9ICp3c1dlZWtEYXk7DQorICAgICAgICBwYXJhbXMubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgICAgICAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1dlZWtOdW1iZXIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9XZWVrTnVtOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla051bTsNCisgICAgcGFyYW1zLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpV2Vla051bSA9IDA7DQorICAgIEZYX0lOVDMyIGlNb250aE51bSA9IG1fcERhdGVUaW1lLT5HZXRNb250aCgpOw0KKyAgICBGWF9JTlQzMiBpRGF5TnVtID0gRlhfRGF5c0luTW9udGgobV9pQ3VyWWVhciwgaU1vbnRoTnVtKTsNCisgICAgRlhfSU5UMzIgaVRlbXAgPSAwOw0KKyAgICBGWF9GTE9BVCBmVlN0YXJ0UG9zID0gbV9ydENsaWVudC50b3AgKyBtX2ZIZWFkSGVpICsgbV9mSFNlcEhlaTsNCisgICAgRlhfRkxPQVQgZkhTdGFydFBvcyA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8PSBpRGF5TnVtOyBpICs9IDcpIHsNCisgICAgICAgIGlUZW1wICsrOw0KKyAgICAgICAgaVdlZWtOdW0gPSBDYWxXZWVrTnVtYmVyKG1faUN1clllYXIsIGlNb250aE51bSwgaSk7DQorICAgICAgICBtX3J0V2Vla051bS5TZXQoZkhTdGFydFBvcywgZlZTdGFydFBvcyArIG1fZkRhdGVDZWxsSGVpICogaVRlbXAsIG1fZldlZWtOdW1XaWQsIG1fZkRhdGVDZWxsSGVpKTsNCisgICAgICAgIHdzV2Vla051bS5Gb3JtYXQoRlhfTFBDV1NUUihMIiVkIiksIGlXZWVrTnVtKTsNCisgICAgICAgIHBhcmFtcy5tX3dzVGV4dCA9IHdzV2Vla051bTsNCisgICAgICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRXZWVrTnVtOw0KKyAgICAgICAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1dlZWtOdW1iZXJTZXAoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9XZWVrTnVtU2VwOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0V2Vla051bVNlcDsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3VG9kYXkoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRldMX1RoZW1lVGV4dCBwYXJhbXM7DQorICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1RvZGF5Ow0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICAgIENGWF9XaWRlU3RyaW5nICp3c0RheSA9IE5VTEw7DQorICAgIHdzRGF5ID0gKENGWF9XaWRlU3RyaW5nICopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCBGV0xfTUNDQVBBQ0lUWV9Ub2RheSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgR2V0VG9kYXlUZXh0KG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXksIHdzVGV4dCk7DQorICAgIHBhcmFtcy5tX3dzVGV4dCA9ICp3c0RheSArIHdzVGV4dDsNCisgICAgbV9zelRvZGF5ID0gQ2FsY1RleHRTaXplKHBhcmFtcy5tX3dzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgIENhbGNUb2RheVNpemUoKTsNCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFRvZGF5Ow0KKyAgICBwYXJhbXMubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdEYXRlc0luKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIENGV0xfVGhlbWVUZXh0IHBhcmFtczsNCisgICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbjsNCisgICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgICAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlDb3VudDsgaiArKykgew0KKyAgICAgICAgTFBEQVRFSU5GTyBwRGF0YUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGopOw0KKyAgICAgICAgcGFyYW1zLm1fd3NUZXh0ID0gcERhdGFJbmZvLT53c0RheTsNCisgICAgICAgIHBhcmFtcy5tX3J0UGFydCA9IHBEYXRhSW5mby0+cmVjdDsNCisgICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gcERhdGFJbmZvLT5kd1N0YXRlczsNCisgICAgICAgIGlmIChqICsgMSA9PSBtX2lIb3ZlcmVkKSB7DQorICAgICAgICAgICAgcGFyYW1zLm1fZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZDsNCisgICAgICAgIH0NCisgICAgICAgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3RGF0ZXNPdXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlc091dDsNCisgICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgICAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW5DaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXlDaXJjbGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9pTW9udGggIT0gbV9pQ3VyTW9udGggfHwgbV9pWWVhciAhPSBtX2lDdXJZZWFyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1faURheSA8IDEgfHwgbV9pRGF5ID4gbV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBMUERBVEVJTkZPIHBEYXRlID0gKExQREFURUlORk8pbV9hcnJEYXRlc1ttX2lEYXkgLSAxXTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRGF0ZSk7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfRGF0ZUluQ2lyY2xlOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX3J0UGFydCA9IHBEYXRlLT5yZWN0Ow0KKyAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3VG9kYXlDaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheUNpcmNsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfVG9kYXlDaXJjbGU7DQorICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRUb2RheUZsYWc7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCitDRlhfU2l6ZUYgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxjU2l6ZShGWF9CT09MIGJBdXRvU2l6ZSkNCit7DQorICAgIENGWF9TaXplRiBmczsNCisgICAgZnMuU2V0KDAsIDApOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIGZzKTsNCisgICAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICAgICAgQ0ZXTF9UaGVtZVBhcnQgcGFyYW1zOw0KKyAgICAgICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nICp3c1RleHQgPSBOVUxMOw0KKyAgICAgICAgRlhfRkxPQVQgZk1heFdlZWtXID0gMC4wZjsNCisgICAgICAgIEZYX0ZMT0FUIGZNYXhXZWVrSCA9IDAuMGY7DQorICAgICAgICBmb3IgKEZYX0RXT1JEIHdlZWsgPSBGV0xfTUNDQVBBQ0lUWV9TdW47IHdlZWsgPD0gRldMX01DQ0FQQUNJVFlfU2F0OyB3ZWVrKyspIHsNCisgICAgICAgICAgICB3c1RleHQgPSAoQ0ZYX1dpZGVTdHJpbmcgKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJhbXMsIHdlZWspOw0KKyAgICAgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSgqd3NUZXh0LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgICAgICAgICBmTWF4V2Vla1cgPSAoZk1heFdlZWtXID49IHN6LngpID8gZk1heFdlZWtXIDogc3oueDsNCisgICAgICAgICAgICBmTWF4V2Vla0ggPSAoZk1heFdlZWtIID49IHN6LnkpID8gZk1heFdlZWtIIDogc3oueTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZEYXlNYXhXID0gMC4wZjsNCisgICAgICAgIEZYX0ZMT0FUIGZEYXlNYXhIID0gMC4wZjsNCisgICAgICAgIGZvciAoaW50IGRheSA9IDEwOyBkYXkgPD0gMzE7IGRheSsrKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQorICAgICAgICAgICAgd3NEYXkuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCBkYXkpOw0KKyAgICAgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0RheSwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgICAgICAgICAgZkRheU1heFcgPSAoZkRheU1heFcgPj0gc3oueCkgPyBmRGF5TWF4VyA6IHN6Lng7DQorICAgICAgICAgICAgZkRheU1heEggPSAoZkRheU1heEggPj0gc3oueSkgPyBmRGF5TWF4SCA6IHN6Lnk7DQorICAgICAgICB9DQorICAgICAgICBtX3N6Q2VsbC54ID0gRlhfRkxPQVQoKGZNYXhXZWVrVyA+PSBmRGF5TWF4VykgPyAoaW50KShmTWF4V2Vla1cgKyAwLjUpIDogKGludCkoZkRheU1heFcgKyAwLjUpKTsNCisgICAgICAgIG1fc3pDZWxsLnkgPSAoZk1heFdlZWtIID49IGZEYXlNYXhIKSA/IGZNYXhXZWVrSCA6IGZEYXlNYXhIOw0KKyAgICAgICAgZnMueCA9IG1fc3pDZWxsLnggKiBNT05USENBTF9DT0xVTU5TICsgTU9OVEhDQUxfSE1BUkdJTiAqIE1PTlRIQ0FMX0NPTFVNTlMgKiAyICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMjsNCisgICAgICAgIEZYX0ZMT0FUIGZNb250aE1heFcgPSAwLjBmOw0KKyAgICAgICAgRlhfRkxPQVQgZk1vbnRoTWF4SCA9IDAuMGY7DQorICAgICAgICBmb3IgKEZYX0RXT1JEIG1vbnRoID0gRldMX01DQ0FQQUNJVFlfSmFudWFyeTsgbW9udGggPD0gRldMX01DQ0FQQUNJVFlfRGVjZW1iZXI7IG1vbnRoKyspIHsNCisgICAgICAgICAgICB3c1RleHQgPSAoQ0ZYX1dpZGVTdHJpbmcgKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJhbXMsIG1vbnRoKTsNCisgICAgICAgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoKndzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgICAgICAgICAgZk1vbnRoTWF4VyA9IChmTW9udGhNYXhXID49IHN6LngpID8gZk1vbnRoTWF4VyA6IHN6Lng7DQorICAgICAgICAgICAgZk1vbnRoTWF4SCA9IChmTW9udGhNYXhIID49IHN6LnkpID8gZk1vbnRoTWF4SCA6IHN6Lnk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1llYXI7DQorICAgICAgICBHZXRIZWFkVGV4dChtX2lZZWFyLCBtX2lNb250aCwgd3NZZWFyKTsNCisgICAgICAgIENGWF9TaXplRiBzelllYXIgPSBDYWxjVGV4dFNpemUod3NZZWFyLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgICAgIGZNb250aE1heEggPSAoZk1vbnRoTWF4SCA+PSBzelllYXIueSkgPyBmTW9udGhNYXhIIDogc3pZZWFyLnk7DQorICAgICAgICBtX3N6SGVhZC5TZXQoZk1vbnRoTWF4VyArIHN6WWVhci54LCBmTW9udGhNYXhIKTsNCisgICAgICAgIGZNb250aE1heFcgPSBtX3N6SGVhZC54ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMiArIG1fc3pDZWxsLnggKiAyOw0KKyAgICAgICAgZnMueCA9IChmcy54ID49IGZNb250aE1heFcpID8gZnMueCA6IGZNb250aE1heFc7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RvZGF5Ow0KKyAgICAgICAgR2V0VG9kYXlUZXh0KG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXksIHdzVG9kYXkpOw0KKyAgICAgICAgd3NUZXh0ID0gKENGWF9XaWRlU3RyaW5nICopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCBGV0xfTUNDQVBBQ0lUWV9Ub2RheSk7DQorICAgICAgICBtX3dzVG9kYXkgPSAqd3NUZXh0ICsgd3NUb2RheTsNCisgICAgICAgIG1fc3pUb2RheSA9IENhbGNUZXh0U2l6ZSh3c1RvZGF5LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgICAgIG1fc3pUb2RheS55ID0gKG1fc3pUb2RheS55ID49IG1fc3pDZWxsLnkpID8gbV9zelRvZGF5LnkgOiBtX3N6Q2VsbC55Ow0KKyAgICAgICAgZnMueSA9IG1fc3pDZWxsLnggKyBtX3N6Q2VsbC55ICogKE1PTlRIQ0FMX1JPV1MgLSAyKSArIG1fc3pUb2RheS55ICsgTU9OVEhDQUxfVk1BUkdJTiAqIE1PTlRIQ0FMX1JPV1MgKiAyICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICogNDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICAgICAgICBmcy5TZXQobV9ydENsaWVudC53aWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICB9DQorICAgIHJldHVybiBmczsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNhbGNIZWFkU2l6ZSgpDQorew0KKyAgICBGWF9GTE9BVCBmSGVhZEhNYXJnaW4gPSAobV9ydENsaWVudC53aWR0aCAtIG1fc3pIZWFkLngpIC8gMjsNCisgICAgRlhfRkxPQVQgZkhlYWRWTWFyZ2luID0gKG1fc3pDZWxsLnggLSBtX3N6SGVhZC55KSAvIDI7DQorICAgIG1fcnRIZWFkVGV4dC5TZXQobV9ydENsaWVudC5sZWZ0ICsgZkhlYWRITWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsgTU9OVEhDQUxfVk1BUkdJTiArIGZIZWFkVk1hcmdpbiwNCisgICAgICAgICAgICAgICAgICAgICBtX3N6SGVhZC54LA0KKyAgICAgICAgICAgICAgICAgICAgIG1fc3pIZWFkLnkpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6Q2FsY1RvZGF5U2l6ZSgpDQorew0KKyAgICBtX3J0VG9kYXlGbGFnLlNldChtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKyBNT05USENBTF9ITUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3J0RGF0ZXMuYm90dG9tKCkgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4gKyBNT05USENBTF9WTUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54LA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3N6VG9kYXkueSk7DQorICAgIG1fcnRUb2RheS5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgbV9zekNlbGwueCArIE1PTlRIQ0FMX0hNQVJHSU4gKiAyICwNCisgICAgICAgICAgICAgICAgICBtX3J0RGF0ZXMuYm90dG9tKCkgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4gKyBNT05USENBTF9WTUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgIG1fc3pUb2RheS54LA0KKyAgICAgICAgICAgICAgICAgIG1fc3pUb2RheS55KTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkxheU91dCgpDQorew0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICB7DQorICAgICAgICBtX3J0SGVhZC5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLnggKyAoTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsgTU9OVEhDQUxfVk1BUkdJTikgKiAyKTsNCisgICAgICAgIG1fcnRXZWVrLlNldChtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgbV9ydEhlYWQuYm90dG9tKCksDQorICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDIsDQorICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueSArIE1PTlRIQ0FMX1ZNQVJHSU4gKiAyKTsNCisgICAgICAgIG1fcnRMQnRuLlNldChtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueCwNCisgICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54KTsNCisgICAgICAgIG1fcnRSQnRuLlNldChtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOIC0gbV9zekNlbGwueCwNCisgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiwNCisgICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54LA0KKyAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLngpOw0KKyAgICAgICAgbV9ydEhTZXAuU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiArIE1PTlRIQ0FMX0hNQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgbV9ydFdlZWsuYm90dG9tKCkgLSBNT05USENBTF9WTUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSAoTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgTU9OVEhDQUxfSE1BUkdJTikgKiAyLA0KKyAgICAgICAgICAgICAgICAgICAgIE1PTlRIQ0FMX0hTRVBfSEVJR0hUKTsNCisgICAgICAgIG1fcnREYXRlcy5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3J0V2Vlay5ib3R0b20oKSwNCisgICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDIsDQorICAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLnkgKiAoTU9OVEhDQUxfUk9XUyAtIDMpICsgTU9OVEhDQUxfVk1BUkdJTiAqIChNT05USENBTF9ST1dTIC0gMykgKiAyKTsNCisgICAgfQ0KKyAgICBDYWxEYXRlSXRlbSgpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6Q2FsRGF0ZUl0ZW0oKQ0KK3sNCisgICAgRlhfQk9PTCBiTmV3V2VlayA9IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBpV2Vla09mTW9udGggPSAwOw0KKyAgICBGWF9GTE9BVCBmTGVmdCA9IG1fcnREYXRlcy5sZWZ0Ow0KKyAgICBGWF9GTE9BVCBmVG9wID0gbV9ydERhdGVzLnRvcDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpKTsNCisgICAgICAgIGlmIChiTmV3V2Vlaykgew0KKyAgICAgICAgICAgIGlXZWVrT2ZNb250aCArKzsNCisgICAgICAgICAgICBiTmV3V2VlayA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcERhdGVJbmZvLT5yZWN0LlNldChmTGVmdCArIHBEYXRlSW5mby0+aURheU9mV2VlayAqIChtX3N6Q2VsbC54ICsgKE1PTlRIQ0FMX0hNQVJHSU4gKiAyKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZUb3AgKyBpV2Vla09mTW9udGggKiAobV9zekNlbGwueSArIChNT05USENBTF9WTUFSR0lOICogMikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54ICsgKE1PTlRIQ0FMX0hNQVJHSU4gKiAyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueSArIChNT05USENBTF9WTUFSR0lOICogMikpOw0KKyAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX1dlZWtOdW1iZXJzKSB7DQorICAgICAgICAgICAgcERhdGVJbmZvLT5yZWN0Lk9mZnNldChtX2ZXZWVrTnVtV2lkLCAwKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRGF0ZUluZm8tPmlEYXlPZldlZWsgPj0gNikgew0KKyAgICAgICAgICAgIGJOZXdXZWVrID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0Q2FwVmFsdWUoKQ0KK3sNCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQorICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBtX2ZIZWFkV2lkID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9XSURUSCk7DQorICAgIG1fZkhlYWRIZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0hlaWdodCk7DQorICAgIG1fZkhlYWRCdG5XaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9XSURUSCk7DQorICAgIG1fZkhlYWRCdG5IZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQpOw0KKyAgICBtX2ZIZWFkQnRuSE1hcmdpbiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hNQVJHSU4pOw0KKyAgICBtX2ZIZWFkQnRuVk1hcmdpbiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1ZNQVJHSU4pOw0KKyAgICBtX2ZIZWFkVGV4dFdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUKTsNCisgICAgbV9mSGVhZFRleHRIZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQpOw0KKyAgICBtX2ZIZWFkVGV4dEhNYXJnaW4gPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfSE1BUkdJTik7DQorICAgIG1fZkhlYWRUZXh0Vk1hcmdpbiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOKTsNCisgICAgbV9mSFNlcFdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX1dJRFRIKTsNCisgICAgbV9mSFNlcEhlaSA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVCk7DQorICAgIG1fZldlZWtOdW1XaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSCk7DQorICAgIG1fZlNlcERPZmZzZXQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQpOw0KKyAgICBtX2ZTZXBYID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1NFUF9YKTsNCisgICAgbV9mU2VwWSA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWSk7DQorICAgIG1fZldlZWtOdW1IZWlnaCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVCk7DQorICAgIG1fZldlZWtXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19XSURUSCk7DQorICAgIG1fZldlZWtIZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQpOw0KKyAgICBtX2ZEYXRlQ2VsbFdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIKTsNCisgICAgbV9mRGF0ZUNlbGxIZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQpOw0KKyAgICBtX2ZUb2RheVdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVCk7DQorICAgIG1fZlRvZGF5SGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0hFSUdIVCk7DQorICAgIG1fZlRvZGF5RmxhZ1dpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9GTEFHX1dJREhUKTsNCisgICAgbV9mTUNXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0lEVEgpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfV2Vla051bWJlcnMpIHsNCisgICAgICAgIG1fZk1DV2lkICs9IG1fZldlZWtOdW1XaWQ7DQorICAgIH0NCisgICAgbV9mTUNIZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVJR0hUKTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxXZWVrTnVtYmVyKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpDQorew0KKyAgICByZXR1cm4gMDsNCit9DQorRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldE1pbkRhdGUoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSkNCit7DQorICAgIGlZZWFyID0gbV9kdE1pbi5pWWVhcjsNCisgICAgaU1vbnRoID0gbV9kdE1pbi5pTW9udGg7DQorICAgIGlEYXkgPSBtX2R0TWluLmlEYXk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6U2V0TWluRGF0ZShGWF9JTlQzMiBpWWVhciwgRlhfSU5UMzIgaU1vbnRoLCBGWF9JTlQzMiBpRGF5KQ0KK3sNCisgICAgbV9kdE1pbiA9IERBVEUoaVllYXIsIGlNb250aCwgaURheSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0TWF4RGF0ZShGWF9JTlQzMiAmaVllYXIsIEZYX0lOVDMyICZpTW9udGgsIEZYX0lOVDMyICZpRGF5KQ0KK3sNCisgICAgaVllYXIgPSBtX2R0TWF4LmlZZWFyOw0KKyAgICBpTW9udGggPSBtX2R0TWF4LmlNb250aDsNCisgICAgaURheSA9IG1fZHRNYXguaURheTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpTZXRNYXhEYXRlKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpDQorew0KKyAgICBtX2R0TWF4ID0gREFURShpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpJbml0RGF0ZSgpDQorew0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKSB7DQorICAgICAgICBJRldMX01vbnRoQ2FsZW5kYXJEUCAqcERhdGVQcm92ID0gKElGV0xfTW9udGhDYWxlbmRhckRQKikobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICAgIG1faVllYXIgPSBwRGF0ZVByb3YtPkdldEN1clllYXIobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIG1faU1vbnRoID0gcERhdGVQcm92LT5HZXRDdXJNb250aChtX3BJbnRlcmZhY2UpOw0KKyAgICAgICAgbV9pRGF5ID0gcERhdGVQcm92LT5HZXRDdXJEYXkobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIG1faUN1clllYXIgPSBtX2lZZWFyOw0KKyAgICAgICAgbV9pQ3VyTW9udGggPSBtX2lNb250aDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1faURheSA9IDE7DQorICAgICAgICBtX2lNb250aCA9IDE7DQorICAgICAgICBtX2lZZWFyID0gMTsNCisgICAgICAgIG1faUN1clllYXIgPSBtX2lZZWFyOw0KKyAgICAgICAgbV9pQ3VyTW9udGggPSBtX2lNb250aDsNCisgICAgfQ0KKyAgICBHZXRUb2RheVRleHQobV9pWWVhciwgbV9pTW9udGgsIG1faURheSwgbV93c1RvZGF5KTsNCisgICAgR2V0SGVhZFRleHQobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIG1fd3NIZWFkKTsNCisgICAgew0KKyAgICAgICAgbV9kdE1pbiA9IERBVEUoMTUwMCwgMTIsIDEpOw0KKyAgICAgICAgbV9kdE1heCA9IERBVEUoMjIwMCwgMSwgMSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDbGVhckRhdGVJdGVtKCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBMUERBVEVJTkZPIHBEYXRhID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpKTsNCisgICAgICAgIGRlbGV0ZSBwRGF0YTsNCisgICAgfQ0KKyAgICBtX2FyckRhdGVzLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6UmVTZXREYXRlSXRlbSgpDQorew0KKyAgICBtX3BEYXRlVGltZS0+U2V0KG1faUN1clllYXIsIG1faUN1ck1vbnRoLCAxKTsNCisgICAgRlhfSU5UMzIgaURheXMgPSBGWF9EYXlzSW5Nb250aChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCk7DQorICAgIEZYX0lOVDMyIGlEYXlPZldlZWsgPSBtX3BEYXRlVGltZS0+R2V0RGF5T2ZXZWVrKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpRGF5czsgaSArKykgew0KKyAgICAgICAgaWYgKGlEYXlPZldlZWsgPj0gNykgew0KKyAgICAgICAgICAgIGlEYXlPZldlZWsgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQorICAgICAgICB3c0RheS5Gb3JtYXQoRlhfTFBDV1NUUihMIiVkIiksIGkgKyAxKTsNCisgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzID0gMDsNCisgICAgICAgIGlmIChtX2lZZWFyID09IG1faUN1clllYXIgJiYgbV9pTW9udGggPT0gbV9pQ3VyTW9udGggJiYgbV9pRGF5ID09IChpICsgMSkpIHsNCisgICAgICAgICAgICBkd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX01DRF9GbGFnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fYXJyU2VsRGF5cy5GaW5kKGkgKyAxKSAhPSAtMSkgew0KKyAgICAgICAgICAgIGR3U3RhdGVzIHw9IEZXTF9JVEVNU1RBVEVfTUNEX1NlbGVjdGVkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RGF0ZTsNCisgICAgICAgIHJ0RGF0ZS5TZXQoMCwgMCwgMCwgMCk7DQorICAgICAgICBMUERBVEVJTkZPIHBEYXRhID0gbmV3IERBVEVJTkZPKGkgKyAxLCBpRGF5T2ZXZWVrLCBkd1N0YXRlcywgcnREYXRlLCB3c0RheSk7DQorICAgICAgICBtX2FyckRhdGVzLkFkZChwRGF0YSk7DQorICAgICAgICBpRGF5T2ZXZWVrKys7DQorICAgIH0NCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6Ok5leHRNb250aCgpDQorew0KKyAgICBGWF9JTlQzMiBpWWVhciA9IG1faUN1clllYXIsIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgICBpZiAoaU1vbnRoID49IDEyKSB7DQorICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgaVllYXIrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlNb250aCArKzsNCisgICAgfQ0KKyAgICBEQVRFIGR0KG1faUN1clllYXIsIG1faUN1ck1vbnRoLCAxKTsNCisgICAgaWYgKCEoZHQgPCBtX2R0TWF4KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1faUN1clllYXIgPSBpWWVhciwgbV9pQ3VyTW9udGggPSBpTW9udGg7DQorICAgIENoYW5nZVRvTW9udGgobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlByZXZNb250aCgpDQorew0KKyAgICBGWF9JTlQzMiBpWWVhciA9IG1faUN1clllYXIsIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgICBpZiAoaU1vbnRoIDw9IDEpIHsNCisgICAgICAgIGlNb250aCA9IDEyOw0KKyAgICAgICAgaVllYXIgLS07DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpTW9udGggLS07DQorICAgIH0NCisgICAgREFURSBkdChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgMSk7DQorICAgIGlmICghKGR0ID4gbV9kdE1pbikpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2lDdXJZZWFyID0gaVllYXIsIG1faUN1ck1vbnRoID0gaU1vbnRoOw0KKyAgICBDaGFuZ2VUb01vbnRoKG1faUN1clllYXIsIG1faUN1ck1vbnRoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDaGFuZ2VUb01vbnRoKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgpDQorew0KKyAgICBtX2lDdXJZZWFyID0gaVllYXI7DQorICAgIG1faUN1ck1vbnRoID0gaU1vbnRoOw0KKyAgICBtX2lIb3ZlcmVkID0gLTE7DQorICAgIENsZWFyRGF0ZUl0ZW0oKTsNCisgICAgUmVTZXREYXRlSXRlbSgpOw0KKyAgICBDYWxEYXRlSXRlbSgpOw0KKyAgICBHZXRIZWFkVGV4dChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgbV93c0hlYWQpOw0KK30NCitGWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6UmVtb3ZlU2VsRGF5KEZYX0lOVDMyIGlEYXksIEZYX0JPT0wgYkFsbCkNCit7DQorICAgIGlmIChpRGF5ID09IC0xICYmICFiQWxsKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGJBbGwpIHsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fYXJyU2VsRGF5cy5HZXRTaXplKCk7DQorICAgICAgICBGWF9JTlQzMiBpRGF0ZXNDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlTZWxEYXkgPSBtX2FyclNlbERheXMuR2V0QXQoaSk7DQorICAgICAgICAgICAgaWYgKGlTZWxEYXkgPD0gaURhdGVzQ291bnQpIHsNCisgICAgICAgICAgICAgICAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGlTZWxEYXkgLSAxKTsNCisgICAgICAgICAgICAgICAgcERhdGVJbmZvLT5kd1N0YXRlcyAmPSB+RldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9hcnJTZWxEYXlzLlJlbW92ZUFsbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgaW5kZXggPSBtX2FyclNlbERheXMuRmluZChpRGF5KTsNCisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlTZWxEYXkgPSBtX2FyclNlbERheXMuR2V0QXQoaURheSk7DQorICAgICAgICBGWF9JTlQzMiBpRGF0ZXNDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgaWYgKGlTZWxEYXkgPD0gaURhdGVzQ291bnQpIHsNCisgICAgICAgICAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaVNlbERheSAtIDEpOw0KKyAgICAgICAgICAgIHBEYXRlSW5mby0+ZHdTdGF0ZXMgJj0gfkZXTF9JVEVNU1RBVEVfTUNEX1NlbGVjdGVkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9hcnJTZWxEYXlzLlJlbW92ZUF0KGluZGV4KTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkFkZFNlbERheShGWF9JTlQzMiBpRGF5KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KGlEYXkgPiAwKTsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9hcnJTZWxEYXlzLkZpbmQoaURheSkgPT0gLTEpIHsNCisgICAgICAgICAgICBSZW1vdmVTZWxEYXkoLTEsIFRSVUUpOw0KKyAgICAgICAgICAgIGlmIChpRGF5IDw9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpRGF5IC0gMSk7DQorICAgICAgICAgICAgICAgIHBEYXRlSW5mby0+ZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fYXJyU2VsRGF5cy5BZGQoaURheSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpKdW1wVG9Ub2RheSgpDQorew0KKyAgICBpZiAobV9pWWVhciAhPSBtX2lDdXJZZWFyIHx8IG1faU1vbnRoICE9IG1faUN1ck1vbnRoKSB7DQorICAgICAgICBtX2lDdXJZZWFyID0gbV9pWWVhcjsNCisgICAgICAgIG1faUN1ck1vbnRoID0gbV9pTW9udGg7DQorICAgICAgICBDaGFuZ2VUb01vbnRoKG1faVllYXIsIG1faU1vbnRoKTsNCisgICAgICAgIEFkZFNlbERheShtX2lEYXkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fYXJyU2VsRGF5cy5GaW5kKG1faURheSkgPT0gLTEpIHsNCisgICAgICAgICAgICBBZGRTZWxEYXkobV9pRGF5KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldEhlYWRUZXh0KEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIENGWF9XaWRlU3RyaW5nICZ3c0hlYWQpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaU1vbnRoID4gMCAmJiBpTW9udGggPCAxMyk7DQorICAgIHN0YXRpYyBGWF9MUFdTVFIgcE1vbnRoW10gPSB7DQorICAgICAgICBGWF9MUFdTVFIoTCJKYW51YXJ5IiksDQorICAgICAgICBGWF9MUFdTVFIoTCJGZWJydWFyeSIpLA0KKyAgICAgICAgRlhfTFBXU1RSKEwiTWFyY2giKSwNCisgICAgICAgIEZYX0xQV1NUUihMIkFwcmlsIiksDQorICAgICAgICBGWF9MUFdTVFIoTCJNYXkiKSwNCisgICAgICAgIEZYX0xQV1NUUihMIkp1bmUiKSwNCisgICAgICAgIEZYX0xQV1NUUihMIkp1bHkiKSwNCisgICAgICAgIEZYX0xQV1NUUihMIkF1Z3VzdCIpLA0KKyAgICAgICAgRlhfTFBXU1RSKEwiU2VwdGVtYmVyIiksDQorICAgICAgICBGWF9MUFdTVFIoTCJPY3RvYmVyIiksDQorICAgICAgICBGWF9MUFdTVFIoTCJOb3ZlbWJlciIpLA0KKyAgICAgICAgRlhfTFBXU1RSKEwiRGVjZW1iZXIiKQ0KKyAgICB9Ow0KKyAgICB3c0hlYWQuRm9ybWF0KEZYX0xQQ1dTVFIoTCIlcywgJWQiKSwgcE1vbnRoW2lNb250aCAtIDFdLCBpWWVhcik7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRUb2RheVRleHQoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSwgQ0ZYX1dpZGVTdHJpbmcgJndzVG9kYXkpDQorew0KKyAgICB3c1RvZGF5LkZvcm1hdChGWF9MUENXU1RSKEwiLCAlZC8lZC8lZCIpLCBpRGF5LCBpTW9udGgsIGlZZWFyKTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlBdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaSk7DQorICAgICAgICBpZiAocERhdGVJbmZvLT5yZWN0LkNvbnRhaW5zKHgsIHkpKSB7DQorICAgICAgICAgICAgcmV0dXJuICsraTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gLTE7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlSZWN0KEZYX0lOVDMyIGlEYXksIENGWF9SZWN0RiAmcnREYXkpDQorew0KKyAgICBpZiAoaURheSA8PSAwIHx8IGlEYXkgPiBtX2FyckRhdGVzLkdldFNpemUoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlc1tpRGF5IC0gMV07DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERhdGVJbmZvLCBGQUxTRSk7DQorICAgIHJ0RGF5ID0gcERhdGVJbmZvLT5yZWN0Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6OkNGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKENGV0xfTW9udGhDYWxlbmRhckltcCAqcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgRlhfSU5UMzIgaVJldCA9IDE7DQorICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICAgICAgICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1vdXNlID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNb3VzZS0+bV9kd0NtZDsNCisgICAgICAgICAgICAgICAgc3dpdGNoKGR3Q21kKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNb3VzZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTW91c2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZU1vdmUoKENGV0xfTXNnTW91c2UqKXBNb3VzZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZUxlYXZlKChDRldMX01zZ01vdXNlKilwTW91c2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIGlSZXQgPSAwOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25BY3RpdmF0ZShDRldMX01lc3NhZ2UgKnBNc2cpDQorew0KKyAgICByZXR1cm47DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0KQ0KK3sNCisgICAgaWYgKGJTZXQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lMQnRuUGFydFN0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQ7DQorICAgICAgICBtX3BPd25lci0+UHJldk1vbnRoKCk7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgbV9wT3duZXItPm1faVJCdG5QYXJ0U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQ7DQorICAgICAgICBtX3BPd25lci0+TmV4dE1vbnRoKCk7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXkgKSA9PSAwKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPkp1bXBUb1RvZGF5KCk7DQorICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QpIHsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU9sZFNlbCA9IDA7DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2FyclNlbERheXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgICBpT2xkU2VsID0gbV9wT3duZXItPm1fYXJyU2VsRGF5c1swXTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgICAgICBGWF9CT09MIGJTZWxDaGFuZ2VkID0gaUN1clNlbCA+IDAgJiYgaUN1clNlbCAhPSBpT2xkU2VsOw0KKyAgICAgICAgICAgIGlmIChiU2VsQ2hhbmdlZCkgew0KKyAgICAgICAgICAgICAgICBMUERBVEVJTkZPIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaUN1clNlbCAtIDEpOw0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlKGxwRGF0ZXNJbmZvLT5yZWN0KTsNCisgICAgICAgICAgICAgICAgaWYgKGlPbGRTZWwgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICBscERhdGVzSW5mbyA9IChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlPbGRTZWwgLSAxKTsNCisgICAgICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCisgICAgICAgICAgICAgICAgQ0ZXTF9FdnRDbGljayB3bUNsaWNrOw0KKyAgICAgICAgICAgICAgICB3bUNsaWNrLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bUNsaWNrKTsNCisgICAgICAgICAgICAgICAgQ0ZXTF9FdmVudE1jZERhdGVDaGFuZ2VkIHdtRGF0ZVNlbGVjdGVkOw0KKyAgICAgICAgICAgICAgICB3bURhdGVTZWxlY3RlZC5tX2lTdGFydERheSA9IGlDdXJTZWw7DQorICAgICAgICAgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faUVuZERheSA9IGlDdXJTZWw7DQorICAgICAgICAgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faU9sZE1vbnRoID0gbV9wT3duZXItPm1faUN1ck1vbnRoOw0KKyAgICAgICAgICAgICAgICB3bURhdGVTZWxlY3RlZC5tX2lPbGRZZWFyID0gbV9wT3duZXItPm1faUN1clllYXI7DQorICAgICAgICAgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1fcFNyY1RhcmdldCA9IChJRldMX01vbnRoQ2FsZW5kYXIgKiltX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21EYXRlU2VsZWN0ZWQpOw0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lMQnRuUGFydFN0YXRlcyA9IDA7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRMQnRuKTsNCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lSQnRuUGFydFN0YXRlcyA9IDA7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSQnRuKTsNCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydERhdGVzLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBGWF9JTlQzMiBpRGF5ID0gbV9wT3duZXItPkdldERheUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICBpZiAoaURheSAhPQktMSkgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5BZGRTZWxEYXkoaURheSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgMCwgMCk7DQorICAgIGlmIChtX3BPd25lci0+bV9ydERhdGVzLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBGWF9JTlQzMiBpSG92ZXIgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgIGJSZXBhaW50ID0gbV9wT3duZXItPm1faUhvdmVyZWQgIT0gaUhvdmVyOw0KKyAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMCkgew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChtX3BPd25lci0+bV9pSG92ZXJlZCwgcnRJbnZhbGlkYXRlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGlIb3ZlciA+IDApIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RGF5Ow0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChpSG92ZXIsIHJ0RGF5KTsNCisgICAgICAgICAgICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHJ0RGF5Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHJ0RGF5KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5tX2lIb3ZlcmVkID0gaUhvdmVyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgYlJlcGFpbnQgPSBtX3BPd25lci0+bV9pSG92ZXJlZCA+IDA7DQorICAgICAgICBpZiAoYlJlcGFpbnQpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChtX3BPd25lci0+bV9pSG92ZXJlZCwgcnRJbnZhbGlkYXRlKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5tX2lIb3ZlcmVkID0gLTE7DQorICAgIH0NCisgICAgaWYgKGJSZXBhaW50ICYmICFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCisgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgICAgICBydEludmFsaWRhdGUuU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgICAgICBtX3BPd25lci0+bV9pSG92ZXJlZCA9IC0xOw0KKyAgICAgICAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjgyMTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcGljdHVyZWJveGltcC5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmgiDQorSUZXTF9QaWN0dXJlQm94KiBJRldMX1BpY3R1cmVCb3g6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gbmV3IElGV0xfUGljdHVyZUJveDsNCit9DQorSUZXTF9QaWN0dXJlQm94OjpJRldMX1BpY3R1cmVCb3goKQ0KK3sNCisgICAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfUGljdHVyZUJveDo6fklGV0xfUGljdHVyZUJveCgpDQorew0KKyAgICBpZiAobV9wRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX1BpY3R1cmVCb3hJbXAqKW1fcERhdGE7DQorICAgICAgICBtX3BEYXRhID0gTlVMTDsNCisgICAgfQ0KK30NCitGV0xfRVJSIElGV0xfUGljdHVyZUJveDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hJbXAocE91dGVyKTsNCisgICAgKChDRldMX1BpY3R1cmVCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfUGljdHVyZUJveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX1BpY3R1cmVCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX1BpY3R1cmVCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfUGljdHVyZUJveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorQ0ZXTF9QaWN0dXJlQm94SW1wOjpDRldMX1BpY3R1cmVCb3hJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fYlRvcChGQUxTRSkNCisgICAgLCBtX2JWQ2VudGVyKEZBTFNFKQ0KKyAgICAsIG1fYkJ1dHRvbihGQUxTRSkNCit7DQorICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgICAgbV9ydEltYWdlLlJlc2V0KCk7DQorICAgIG1fbWF0cml4LlJlc2V0KCk7DQorfQ0KK0NGV0xfUGljdHVyZUJveEltcDo6Q0ZXTF9QaWN0dXJlQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fYlRvcChGQUxTRSkNCisgICAgLCBtX2JWQ2VudGVyKEZBTFNFKQ0KKyAgICAsIG1fYkJ1dHRvbihGQUxTRSkNCit7DQorICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgICAgbV9ydEltYWdlLlJlc2V0KCk7DQorICAgIG1fbWF0cml4LlJlc2V0KCk7DQorfQ0KK0NGV0xfUGljdHVyZUJveEltcDo6fkNGV0xfUGljdHVyZUJveEltcCgpDQorew0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19QaWN0dXJlQm94Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfUGljdHVyZUJveEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94Ow0KK30NCitGV0xfRVJSCUNGV0xfUGljdHVyZUJveEltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9QaWN0dXJlQm94SW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KK3sNCisgICAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICAgICAgcmVjdC5TZXQoMCwgMCwgMCwgMCk7DQorICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICAgIENGWF9ESUJpdG1hcCAqcEJpdG1hcCA9ICgoSUZXTF9QaWN0dXJlQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciktPkdldFBpY3R1cmUobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIGlmIChwQml0bWFwKSB7DQorICAgICAgICAgICAgcmVjdC5TZXQoMCwgMCwgKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVClwQml0bWFwLT5HZXRIZWlnaHQoKSk7DQorICAgICAgICB9DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OlVwZGF0ZSgpDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX1BUQl9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCApOw0KKyAgICB9DQorICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfUFRCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfUGljdHVyZUJveEltcDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgQ0ZYX0RJQml0bWFwICpwUGljdHVyZSA9ICgoSUZXTF9QaWN0dXJlQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciktPkdldFBpY3R1cmUobV9wSW50ZXJmYWNlKTsNCisgICAgQ0ZYX01hdHJpeCBtYXRyaXg7DQorICAgICgoSUZXTF9QaWN0dXJlQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciktPkdldE1hdHJpeChtX3BJbnRlcmZhY2UsIG1hdHJpeCk7DQorICAgIGlmICghcFBpY3R1cmUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgRlhfRkxPQVQgZnggPSAoRlhfRkxPQVQpcFBpY3R1cmUtPkdldFdpZHRoKCk7DQorICAgIEZYX0ZMT0FUIGZ5ID0gKEZYX0ZMT0FUKXBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgaWYgKGZ4ID4gbV9ydENsaWVudC53aWR0aCkgew0KKyAgICAgICAgZnggPSBtX3J0Q2xpZW50LndpZHRoOw0KKyAgICB9DQorICAgIGlmIChmeSA+IG1fcnRDbGllbnQuaGVpZ2h0KSB7DQorICAgICAgICBmeSA9IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgICB9DQorICAgIENGWF9Qb2ludEYgcHQ7DQorICAgIHB0LlNldCgobV9ydENsaWVudC53aWR0aCAtIGZ4KSAvIDIsIChtX3J0Q2xpZW50LmhlaWdodCAtIGZ5KSAvIDIpOw0KKyAgICBwR3JhcGhpY3MtPkRyYXdJbWFnZShwUGljdHVyZSwgcHQsICZtYXRyaXgpOw0KK30NCitGWF9CT09MIENGV0xfUGljdHVyZUJveEltcDo6VlN0eWxlKEZYX0JPT0wgZHdTdHlsZSkNCit7DQorICAgIHN3aXRjaChkd1N0eWxlICYgRldMX1NUWUxFRVhUX1BUQl9WQWxpZ25NYXNrKSB7DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QVEJfVG9wOiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2JUb3AgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QVEJfVmNlbnRlcjogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9iVkNlbnRlciA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BUQl9Cb3R0b206IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fYkJ1dHRvbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NGV0xfUGljdHVyZUJveEltcERlbGVnYXRlOjpDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZShDRldMX1BpY3R1cmVCb3hJbXAgKnBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpDQorew0KK30NCitGV0xfRVJSCUNGV0xfUGljdHVyZUJveEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b25pbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b25pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjI4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbmltcC5jcHAKQEAgLTAsMCArMSw1NDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgiDQorSUZXTF9QdXNoQnV0dG9uICpJRldMX1B1c2hCdXR0b246OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gbmV3IElGV0xfUHVzaEJ1dHRvbjsNCit9DQorRldMX0VSUiBJRldMX1B1c2hCdXR0b246OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QdXNoQnV0dG9uSW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX1B1c2hCdXR0b25JbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9QdXNoQnV0dG9uOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QdXNoQnV0dG9uSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX1B1c2hCdXR0b25JbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0lGV0xfUHVzaEJ1dHRvbjo6SUZXTF9QdXNoQnV0dG9uKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX1B1c2hCdXR0b246On5JRldMX1B1c2hCdXR0b24oKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorQ0ZXTF9QdXNoQnV0dG9uSW1wOjpDRldMX1B1c2hCdXR0b25JbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fYkJ0bkRvd24oRkFMU0UpDQorICAgICwgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkNCisgICAgLCBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikNCit7DQorICAgIG1fcnRDbGllbnQuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbkltcDo6Q0ZXTF9QdXNoQnV0dG9uSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fYkJ0bkRvd24oRkFMU0UpDQorICAgICwgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkNCisgICAgLCBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikNCit7DQorICAgIG1fcnRDbGllbnQuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbkltcDo6fkNGV0xfUHVzaEJ1dHRvbkltcCgpDQorew0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19QdXNoQnV0dG9uOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfUHVzaEJ1dHRvbkltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9QdXNoQnV0dG9uOw0KK30NCitGV0xfRVJSCUNGV0xfUHVzaEJ1dHRvbkltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9QdXNoQnV0dG9uSW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiggbV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgICAgICAgIElGV0xfUHVzaEJ1dHRvbkRQICpwRGF0YSA9IChJRldMX1B1c2hCdXR0b25EUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgaWYgKHBEYXRhKSB7DQorICAgICAgICAgICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaUxlbiA9IHdzQ2FwdGlvbi5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgKmZjYXB0aW9uID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9QU0JfTWFyZ2luKTsNCisgICAgICAgIHJlY3QuSW5mbGF0ZSgqZmNhcHRpb24sICpmY2FwdGlvbik7DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIGlmICgoZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpICYmIGJTZXQpIHsNCisgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQ7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6VXBkYXRlKCkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICBtX3J0Q2FwdGlvbiA9IG1fcnRDbGllbnQ7DQorICAgIEZYX0ZMT0FUICpmY2FwdGlvbiA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfUFNCX01hcmdpbik7DQorICAgIG1fcnRDYXB0aW9uLkluZmxhdGUoLSpmY2FwdGlvbiwgLSpmY2FwdGlvbik7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgSUZXTF9QdXNoQnV0dG9uRFAgKnBEYXRhID0gKElGV0xfUHVzaEJ1dHRvbkRQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIENGWF9ESUJpdG1hcCAqcFBpY3R1cmUgPSBOVUxMOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX1BTQl9Cb3JkZXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfUFNCX0VkZ2UsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KKyAgICBDRlhfTWF0cml4IG1hdHJpeDsNCisgICAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIEZYX0ZMT0FUIGlQaWN3aWR0aCA9IDA7DQorICAgIEZYX0ZMT0FUIGlwaWNoZWlnaHQgPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgIGlmIChwRGF0YSkgew0KKyAgICAgICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgIHJ0VGV4dC5TZXQoMCwgMCwgMCAsIDApOw0KKyAgICBpZiAoIXdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIENhbGNUZXh0UmVjdCh3c0NhcHRpb24sIHBUaGVtZSwgMCwgbV9pVFRPQWxpZ24sIHJ0VGV4dCk7DQorICAgIH0NCisgICAgc3dpdGNoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfUFNCX01vZGVNYXNrKSB7DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfVGV4dE9ubHk6DQorICAgICAgICAgICAgRHJhd1RleHQocEdyYXBoaWNzLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCAmbWF0cml4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9JY29uT25seToNCisgICAgICAgICAgICBpZiAocERhdGEpIHsNCisgICAgICAgICAgICAgICAgcFBpY3R1cmUgPSBwRGF0YS0+R2V0UGljdHVyZShtX3BJbnRlcmZhY2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocFBpY3R1cmUpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludDsNCisgICAgICAgICAgICAgICAgc3dpdGNoKG1faVRUT0FsaWduKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyAobV9ydENsaWVudC53aWR0aCAvIDIgLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAvIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gIG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyAobV9ydENsaWVudC53aWR0aCAvIDIgLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAvIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcFBpY3R1cmUtPkdldFdpZHRoKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDg6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDk6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC8gMik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC0gcFBpY3R1cmUtPkdldEhlaWdodCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCAgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPkRyYXdJbWFnZShwUGljdHVyZSwgcG9pbnQsICZtYXRyaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9UZXh0SWNvbjoNCisgICAgICAgICAgICBpZiAocFBpY3R1cmUpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludDsNCisgICAgICAgICAgICAgICAgc3dpdGNoKG1faVRUT0FsaWduKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gKEZYX0ZMT0FUKShwUGljdHVyZS0+R2V0V2lkdGgoKSAtIDcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGljaGVpZ2h0ID0gcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMiAtIG1fcnRDYXB0aW9uLnRvcCAtIHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIChwUGljdHVyZS0+R2V0V2lkdGgoKSArIHJ0VGV4dC53aWR0aCkgLyAyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLSAoKG1fcnRDbGllbnQud2lkdGgpIC8gMiAtIHJ0VGV4dC53aWR0aCAvIDIgLSBwb2ludC54KSArIHJ0VGV4dC53aWR0aCAvIDIgLSA3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGljaGVpZ2h0ID0gcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMiAtIG1fcnRDYXB0aW9uLnRvcCAtIHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQorICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gIG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwb2ludC54IC0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGggKyA3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlwaWNoZWlnaHQgPSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyIC0gbV9ydENhcHRpb24udG9wIC0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlQaWN3aWR0aCA9IG1fcnRDbGllbnQubGVmdCArIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gNzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0gKHBQaWN0dXJlLT5HZXRXaWR0aCgpICsgcnRUZXh0LndpZHRoKSAvIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlQaWN3aWR0aCA9IHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gKChtX3J0Q2xpZW50LndpZHRoKSAvIDIgLSBydFRleHQud2lkdGggLyAyIC0gcG9pbnQueCkgKyBydFRleHQud2lkdGggLyAyIC0gNzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCAgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlQaWN3aWR0aCA9ICBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcG9pbnQueCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoICsgNzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpUGljd2lkdGggPSAoRlhfRkxPQVQpKHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gNyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaXBpY2hlaWdodCAtPSBydFRleHQuaGVpZ2h0IC8gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgOToNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0gKHBQaWN0dXJlLT5HZXRXaWR0aCgpICsgcnRUZXh0LndpZHRoKSAvIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpUGljd2lkdGggPSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtICgobV9ydENsaWVudC53aWR0aCkgLyAyIC0gcnRUZXh0LndpZHRoIC8gMiAtIHBvaW50LngpICsgcnRUZXh0LndpZHRoIC8gMiAtIDc7DQorICAgICAgICAgICAgICAgICAgICAgICAgaXBpY2hlaWdodCAtPSBydFRleHQuaGVpZ2h0IC8gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6DQorICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gIG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwb2ludC54IC0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGggKyA3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlwaWNoZWlnaHQgLT0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5EcmF3SW1hZ2UocFBpY3R1cmUsIHBvaW50LCAmbWF0cml4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWF0cml4LmUgKz0gbV9ydENsaWVudC5sZWZ0ICsgaVBpY3dpZHRoOw0KKyAgICAgICAgICAgIG1hdHJpeC5mICs9IG1fcnRDbGllbnQudG9wICsgaXBpY2hlaWdodDsNCisgICAgICAgICAgICBEcmF3VGV4dChwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsICZtYXRyaXgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXA6OkRyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfUFNCX0JhY2tncm91bmQ7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBHZXRQYXJ0U3RhdGVzKCk7DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgICAgIHBhcmFtLm1fcERhdGEgPSAmbV9ydENhcHRpb247DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcDo6RHJhd1RleHQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICAgIGlmICh3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1BTQl9DYXB0aW9uOw0KKyAgICBwYXJhbS5tX2R3U3RhdGVzID0gR2V0UGFydFN0YXRlcygpOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgICAgcGFyYW0ubV93c1RleHQgPSB3c0NhcHRpb247DQorICAgIHBhcmFtLm1fZHdUVE9TdHlsZXMgPSBtX2R3VFRPU3R5bGVzOw0KKyAgICBwYXJhbS5tX2lUVE9BbGlnbiA9IG1faVRUT0FsaWduOw0KKyAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbSk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfUHVzaEJ1dHRvbkltcDo6R2V0UGFydFN0YXRlcygpDQorew0KKyAgICBGWF9EV09SRCBkd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfUFNCX05vcm1hbDsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICAgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9QU0JfRm9jdXNlZDsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICAgICAgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX1BTQl9EaXNhYmxlZDsNCisgICAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSB7DQorICAgICAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX1BTQl9QcmVzc2VkOw0KKyAgICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpIHsNCisgICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfRGVmYXVsdCkgew0KKyAgICAgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9QU0JfRGVmYXVsdDsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdTdGF0ZXM7DQorfQ0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpVcGRhdGVUZXh0T3V0U3R5bGVzKCkNCit7DQorICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgIHN3aXRjaChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgKEZXTF9TVFlMRUVYVF9QU0JfSExheW91dE1hc2sgfCBGV0xfU1RZTEVFWFRfUFNCX1ZMYXlvdXRNYXNrKSkgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0xlZnQgfCBGV0xfU1RZTEVFWFRfUFNCX1RvcDogew0KKyAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0xlZnQgfCBGV0xfU1RZTEVFWFRfUFNCX1ZDZW50ZXI6IHsNCisgICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfUFNCX1ZDZW50ZXI6IHsNCisgICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX1BTQl9WQ2VudGVyOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0xlZnQgfCBGV0xfU1RZTEVFWFRfUFNCX0JvdHRvbTogew0KKyAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21DZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tOiB7DQorICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21SaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1dHVFNUWUxFX1JUTFJlYWRpbmcpIHsNCisgICAgICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1JUTDsNCisgICAgfQ0KK30NCitDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6Q0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9QdXNoQnV0dG9uSW1wICpwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgICBpZiAoIW1fcE93bmVyLT5Jc0VuYWJsZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVJldCA9IDE7DQorICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICAgICAgICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9Nc2dLZXkgKnBLZXkgPSAoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBpZiAocEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgICAgICAgICAgICAgICAgIE9uS2V5RG93bigoQ0ZXTF9Nc2dLZXkqKXBLZXkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgaVJldCA9IDA7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgICAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCApDQorew0KKyAgICBpZiAoYlNldCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIH0NCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICAgIH0NCisgICAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBUUlVFOw0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfUHJlc3NlZDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIG1fcE93bmVyLT5tX2JCdG5Eb3duID0gRkFMU0U7DQorICAgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9QU0JfUHJlc3NlZDsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgQ0ZXTF9FdnRDbGljayB3bUNsaWNrOw0KKyAgICAgICAgd21DbGljay5tX3BTcmNUYXJnZXQgPSAoSUZXTF9QdXNoQnV0dG9uKiltX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtQ2xpY2spOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICAgIGlmIChtX3BPd25lci0+bV9iQnRuRG93bikgew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpID09IDApIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KKyAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKCFtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpID09IDApIHsNCisgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIG1fcE93bmVyLT5tX2JCdG5Eb3duID0gRkFMU0U7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZykNCit7DQorICAgIGlmIChwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SZXR1cm4pIHsNCisgICAgICAgIENGV0xfRXZ0TW91c2Ugd21Nb3VzZTsNCisgICAgICAgIHdtTW91c2UubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgICAgIHdtTW91c2UubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQorICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21Nb3VzZSk7DQorICAgICAgICBDRldMX0V2dENsaWNrIHdtQ2xpY2s7DQorICAgICAgICB3bUNsaWNrLm1fcFNyY1RhcmdldCA9IChJRldMX1B1c2hCdXR0b24qKW1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21DbGljayk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlICE9IEZXTF9WS0VZX1RhYikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXJpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjJjOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyaW1wLmNwcApAQCAtMCwwICsxLDg1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIg0KKyNkZWZpbmUgRldMX1NDUk9MTEJBUl9FbGFwc2UJNTAwDQorI2RlZmluZSBGV0xfU0NST0xMQkFSX01pblRodW1iCTUNCitJRldMX1Njcm9sbEJhciogSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gbmV3IElGV0xfU2Nyb2xsQmFyOw0KK30NCitJRldMX1Njcm9sbEJhcjo6SUZXTF9TY3JvbGxCYXIoKQ0KK3sNCisgICAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfU2Nyb2xsQmFyOjp+SUZXTF9TY3JvbGxCYXIoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGE7DQorICAgICAgICBtX3BEYXRhID0gTlVMTDsNCisgICAgfQ0KK30NCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfU2Nyb2xsQmFySW1wKHBPdXRlcik7DQorICAgICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9TY3JvbGxCYXI6OklzVmVydGljYWwoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5Jc1ZlcnRpY2FsKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OkdldFJhbmdlKEZYX0ZMT0FUICZmTWluLCBGWF9GTE9BVCAmZk1heCkNCit7DQorICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+R2V0UmFuZ2UoZk1pbiwgZk1heCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpDQorew0KKyAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldFJhbmdlKGZNaW4sIGZNYXgpOw0KK30NCitGWF9GTE9BVCBJRldMX1Njcm9sbEJhcjo6R2V0UGFnZVNpemUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRQYWdlU2l6ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpTZXRQYWdlU2l6ZShGWF9GTE9BVCBmUGFnZVNpemUpDQorew0KKyAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldFBhZ2VTaXplKGZQYWdlU2l6ZSk7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfU2Nyb2xsQmFyOjpHZXRTdGVwU2l6ZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPkdldFN0ZXBTaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+U2V0U3RlcFNpemUoZlN0ZXBTaXplKTsNCit9DQorRlhfRkxPQVQgSUZXTF9TY3JvbGxCYXI6OkdldFBvcygpDQorew0KKyAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPkdldFBvcygpOw0KK30NCitGV0xfRVJSCUlGV0xfU2Nyb2xsQmFyOjpTZXRQb3MoRlhfRkxPQVQgZlBvcykNCit7DQorICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+U2V0UG9zKGZQb3MpOw0KK30NCitGWF9GTE9BVCBJRldMX1Njcm9sbEJhcjo6R2V0VHJhY2tQb3MoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRUcmFja1BvcygpOw0KK30NCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpDQorew0KKyAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldFRyYWNrUG9zKGZUcmFja1Bvcyk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9TY3JvbGxCYXI6OkRvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykNCit7DQorICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+RG9TY3JvbGwoZHdDb2RlLCBmUG9zKTsNCit9DQorQ0ZXTF9TY3JvbGxCYXJJbXA6OkNGV0xfU2Nyb2xsQmFySW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCisgICAgLCBtX2hUaW1lcihOVUxMKQ0KKyAgICAsIG1fZlJhbmdlTWluKDApDQorICAgICwgbV9mUmFuZ2VNYXgoLTEpDQorICAgICwgbV9mUGFnZVNpemUoMCkNCisgICAgLCBtX2ZTdGVwU2l6ZSgwKQ0KKyAgICAsIG1fZlBvcygwKQ0KKyAgICAsIG1fZlRyYWNrUG9zKDApDQorICAgICwgbV9pTWluQnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KKyAgICAsIG1faU1heEJ1dHRvblN0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCkNCisgICAgLCBtX2lUaHVtYkJ1dHRvblN0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCkNCisgICAgLCBtX2ZMYXN0VHJhY2tQb3MoMCkNCisgICAgLCBtX2NwVHJhY2tQb2ludFgoMCkNCisgICAgLCBtX2NwVHJhY2tQb2ludFkoMCkNCisgICAgLCBtX2lNaW5UcmFja1N0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCkNCisgICAgLCBtX2lNYXhUcmFja1N0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCkNCisgICAgLCBtX2lNb3VzZVdoZWVsKDApDQorICAgICwgbV9iVHJhY2tNb3VzZUxlYXZlKEZBTFNFKQ0KKyAgICAsIG1fYk1vdXNlSG92ZXIoRkFMU0UpDQorICAgICwgbV9iUmVwYWludFRodW1iKEZBTFNFKQ0KKyAgICAsIG1fYk1vdXNlRG93bihGQUxTRSkNCisgICAgLCBtX2ZCdXR0b25MZW4oMCkNCisgICAgLCBtX2JNaW5TaXplKEZBTFNFKQ0KKyAgICAsIG1fYkN1c3RvbUxheW91dChGQUxTRSkNCisgICAgLCBtX2ZNaW5UaHVtYihGV0xfU0NST0xMQkFSX01pblRodW1iKQ0KK3sNCisgICAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgICBtX3J0VGh1bWIuUmVzZXQoKTsNCisgICAgbV9ydE1pbkJ0bi5SZXNldCgpOw0KKyAgICBtX3J0TWF4QnRuLlJlc2V0KCk7DQorICAgIG1fcnRNaW5UcmFjay5SZXNldCgpOw0KKyAgICBtX3J0TWF4VHJhY2suUmVzZXQoKTsNCit9DQorQ0ZXTF9TY3JvbGxCYXJJbXA6OkNGV0xfU2Nyb2xsQmFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQqIHBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1faFRpbWVyKE5VTEwpDQorICAgICwgbV9mUmFuZ2VNaW4oMCkNCisgICAgLCBtX2ZSYW5nZU1heCgtMSkNCisgICAgLCBtX2ZQYWdlU2l6ZSgwKQ0KKyAgICAsIG1fZlN0ZXBTaXplKDApDQorICAgICwgbV9mUG9zKDApDQorICAgICwgbV9mVHJhY2tQb3MoMCkNCisgICAgLCBtX2lNaW5CdXR0b25TdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpDQorICAgICwgbV9pTWF4QnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KKyAgICAsIG1faVRodW1iQnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KKyAgICAsIG1fZkxhc3RUcmFja1BvcygwKQ0KKyAgICAsIG1fY3BUcmFja1BvaW50WCgwKQ0KKyAgICAsIG1fY3BUcmFja1BvaW50WSgwKQ0KKyAgICAsIG1faU1pblRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KKyAgICAsIG1faU1heFRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KKyAgICAsIG1faU1vdXNlV2hlZWwoMCkNCisgICAgLCBtX2JUcmFja01vdXNlTGVhdmUoRkFMU0UpDQorICAgICwgbV9iTW91c2VIb3ZlcihGQUxTRSkNCisgICAgLCBtX2JSZXBhaW50VGh1bWIoRkFMU0UpDQorICAgICwgbV9iTW91c2VEb3duKEZBTFNFKQ0KKyAgICAsIG1fZkJ1dHRvbkxlbigwKQ0KKyAgICAsIG1fYk1pblNpemUoRkFMU0UpDQorICAgICwgbV9iQ3VzdG9tTGF5b3V0KEZBTFNFKQ0KKyAgICAsIG1fZk1pblRodW1iKEZXTF9TQ1JPTExCQVJfTWluVGh1bWIpDQorew0KKyAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICAgIG1fcnRUaHVtYi5SZXNldCgpOw0KKyAgICBtX3J0TWluQnRuLlJlc2V0KCk7DQorICAgIG1fcnRNYXhCdG4uUmVzZXQoKTsNCisgICAgbV9ydE1pblRyYWNrLlJlc2V0KCk7DQorICAgIG1fcnRNYXhUcmFjay5SZXNldCgpOw0KK30NCitDRldMX1Njcm9sbEJhckltcDo6fkNGV0xfU2Nyb2xsQmFySW1wKCkNCit7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCit7DQorICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfU2Nyb2xsQmFyOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX1Njcm9sbEJhcjsNCit9DQorRldMX0VSUglDRldMX1Njcm9sbEJhckltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIGlmIChiQXV0b1NpemUpIHsNCisgICAgICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgRlhfRkxPQVQgKnBmTWluV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZNaW5XaWR0aCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICAgICAgICByZWN0LlNldCgwLCAwLCAoKnBmTWluV2lkdGgpLCAoKnBmTWluV2lkdGgpICogMyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsICgqcGZNaW5XaWR0aCkgKiAzLCAoKnBmTWluV2lkdGgpKTsNCisgICAgICAgIH0NCisgICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpVcGRhdGUoKQ0KK3sNCisgICAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBMYXlvdXQoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgICAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfU0NCX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoSGFzRWRnZSgpKSB7DQorICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX1NDQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgVFJVRSwgcE1hdHJpeCk7DQorICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgRkFMU0UsIHBNYXRyaXgpOw0KKyAgICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIFRSVUUsIHBNYXRyaXgpOw0KKyAgICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIEZBTFNFLCBwTWF0cml4KTsNCisgICAgRHJhd1RodW1iKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbmxpbmUgRlhfQk9PTCBDRldMX1Njcm9sbEJhckltcDo6SXNWZXJ0aWNhbCgpDQorew0KKyAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9TQ0JfVmVydDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6R2V0UmFuZ2UoRlhfRkxPQVQgJmZNaW4sIEZYX0ZMT0FUICZmTWF4KQ0KK3sNCisgICAgZk1pbiA9IG1fZlJhbmdlTWluOw0KKyAgICBmTWF4ID0gbV9mUmFuZ2VNYXg7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCkNCit7DQorICAgIG1fZlJhbmdlTWluID0gZk1pbjsNCisgICAgbV9mUmFuZ2VNYXggPSBmTWF4Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRQYWdlU2l6ZSgpDQorew0KKyAgICByZXR1cm4gbV9mUGFnZVNpemU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkNCit7DQorICAgIG1fZlBhZ2VTaXplID0gZlBhZ2VTaXplOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRTdGVwU2l6ZSgpDQorew0KKyAgICByZXR1cm4gbV9mU3RlcFNpemU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSkNCit7DQorICAgIG1fZlN0ZXBTaXplID0gZlN0ZXBTaXplOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRQb3MoKQ0KK3sNCisgICAgcmV0dXJuIG1fZlBvczsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0UG9zKEZYX0ZMT0FUIGZQb3MpDQorew0KKyAgICBtX2ZQb3MgPSBmUG9zOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRUcmFja1BvcygpDQorew0KKyAgICByZXR1cm4gbV9mVHJhY2tQb3M7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1BvcykNCit7DQorICAgIG1fZlRyYWNrUG9zID0gZlRyYWNrUG9zOw0KKyAgICBDYWxjVGh1bWJCdXR0b25SZWN0KG1fcnRUaHVtYik7DQorICAgIENhbGNNaW5UcmFja1JlY3QobV9ydE1pblRyYWNrKTsNCisgICAgQ2FsY01heFRyYWNrUmVjdChtX3J0TWF4VHJhY2spOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyApDQorew0KKyAgICBzd2l0Y2ggKGR3Q29kZSkgew0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9NaW46DQorICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX01heDoNCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkOg0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZDoNCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfUG9zOg0KKyAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9UcmFja1BvczoNCisgICAgICAgIGNhc2UgRldMX1NDQkNPREVfRW5kU2Nyb2xsOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBPblNjcm9sbChkd0NvZGUsIGZQb3MpOw0KK30NCitGWF9JTlQzMiBDRldMX1Njcm9sbEJhckltcDo6UnVuKEZXTF9IVElNRVIgaFRpbWVyKQ0KK3sNCisgICAgaWYgKG1faFRpbWVyKSB7DQorICAgICAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgICAgfQ0KKyAgICBpZiAoIVNlbmRFdmVudCgpKSB7DQorICAgICAgICBtX2hUaW1lciA9IEZXTF9TdGFydFRpbWVyKHRoaXMsIDApOw0KKyAgICB9DQorICAgIHJldHVybiAxOw0KK30NCitGV0xfRVJSCUNGV0xfU2Nyb2xsQmFySW1wOjpTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wT3V0ZXIgPSBwT3V0ZXI7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRlhfQk9PTCBiTG93ZXIgLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBiTG93ZXIgPyBGV0xfUEFSVF9TQ0JfTG93ZXJUcmFjayA6IEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrOw0KKyAgICBwYXJhbS5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID8NCisgICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkIDogKGJMb3dlciA/IG1faU1pblRyYWNrU3RhdGUgOiBtX2lNYXhUcmFja1N0YXRlKTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gYkxvd2VyID8gbV9ydE1pblRyYWNrIDogbV9ydE1heFRyYWNrOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIEZYX0JPT0wgYk1pbkJ0biAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IGJNaW5CdG4gPyBGV0xfUEFSVF9TQ0JfRm9yZUFycm93IDogRldMX1BBUlRfU0NCX0JhY2tBcnJvdzsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/DQorICAgICAgICAgICAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZCA6IChiTWluQnRuID8gbV9pTWluQnV0dG9uU3RhdGUgOiBtX2lNYXhCdXR0b25TdGF0ZSk7DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IGJNaW5CdG4gPyBtX3J0TWluQnRuIDogbV9ydE1heEJ0bjsNCisgICAgaWYgKHBhcmFtLm1fcnRQYXJ0LmhlaWdodCA+IDAgJiYgcGFyYW0ubV9ydFBhcnQud2lkdGggPiAwKSB7DQorICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6RHJhd1RodW1iKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBpZiAoIUlzRW5hYmxlZCgpKSB7DQorICAgIH0NCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1NDQl9UaHVtYjsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/DQorICAgICAgICAgICAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZCA6IG1faVRodW1iQnV0dG9uU3RhdGU7DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRUaHVtYjsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpMYXlvdXQoKQ0KK3sNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgICBwYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgbV9mTWluVGh1bWIgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfQ0FQQUNJVFlfU0NCX1NpemUpOw0KKyAgICBtX2JDdXN0b21MYXlvdXQgPSBwVGhlbWUtPklzQ3VzdG9taXplZExheW91dChtX3BJbnRlcmZhY2UpOw0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICBDYWxjQnV0dG9uTGVuKCk7DQorICAgIENhbGNNaW5CdXR0b25SZWN0KG1fcnRNaW5CdG4pOw0KKyAgICBDYWxjTWF4QnV0dG9uUmVjdChtX3J0TWF4QnRuKTsNCisgICAgQ2FsY1RodW1iQnV0dG9uUmVjdChtX3J0VGh1bWIpOw0KKyAgICBDYWxjTWluVHJhY2tSZWN0KG1fcnRNaW5UcmFjayk7DQorICAgIENhbGNNYXhUcmFja1JlY3QobV9ydE1heFRyYWNrKTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6Q2FsY0J1dHRvbkxlbigpDQorew0KKyAgICBtX2ZCdXR0b25MZW4gPSBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LndpZHRoIDogbV9ydENsaWVudC5oZWlnaHQ7DQorICAgIEZYX0ZMT0FUIGZMZW5ndGggPSBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LmhlaWdodCA6IG1fcnRDbGllbnQud2lkdGg7DQorICAgIGlmIChmTGVuZ3RoIDwgbV9mQnV0dG9uTGVuICogMikgew0KKyAgICAgICAgbV9mQnV0dG9uTGVuID0gZkxlbmd0aCAvIDI7DQorICAgICAgICBtX2JNaW5TaXplID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fYk1pblNpemUgPSBGQUxTRTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWluQnV0dG9uUmVjdChDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgICAgICBDRldMX1RoZW1lUGFydCBwUGFydDsNCisgICAgICAgIHBQYXJ0Lm1fcnRQYXJ0ID0gbV9ydE1pbkJ0bjsNCisgICAgICAgIHBQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgIHBQYXJ0Lm1faVBhcnQgPSBGV0xfUEFSVF9TQ0JfRm9yZUFycm93Ow0KKyAgICAgICAgcFBhcnQubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkIDogbV9pTWluQnV0dG9uU3RhdGU7DQorICAgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwUGFydCwgcmVjdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0LmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICByZWN0LnRvcCA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQud2lkdGggOiBtX2ZCdXR0b25MZW47DQorICAgICAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNNYXhCdXR0b25SZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgICAgIENGV0xfVGhlbWVQYXJ0IHBQYXJ0Ow0KKyAgICAgICAgcFBhcnQubV9ydFBhcnQgPSBtX3J0TWF4QnRuOw0KKyAgICAgICAgcFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgcFBhcnQubV9pUGFydCA9IEZXTF9QQVJUX1NDQl9CYWNrQXJyb3c7DQorICAgICAgICBwUGFydC5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID8gRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQgOiBtX2lNYXhCdXR0b25TdGF0ZTsNCisgICAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBQYXJ0LCByZWN0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QubGVmdCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQubGVmdCA6IG1fcnRDbGllbnQucmlnaHQoKSAtIG1fZkJ1dHRvbkxlbjsNCisgICAgICAgIHJlY3QudG9wID0gSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC5ib3R0b20oKSAtIG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQud2lkdGggOiBtX2ZCdXR0b25MZW47DQorICAgICAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNUaHVtYkJ1dHRvblJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgaWYgKCFJc0VuYWJsZWQoKSkgew0KKyAgICAgICAgbV9ydFRodW1iLlJlc2V0KCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG1fYk1pblNpemUpIHsNCisgICAgICAgIG1fcnRUaHVtYi5FbXB0eSgpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZSYW5nZSA9IG1fZlJhbmdlTWF4IC0gbV9mUmFuZ2VNaW47DQorICAgIG1lbXNldCgmcmVjdCwgMCwgc2l6ZW9mKENGWF9SZWN0KSk7DQorICAgIGlmIChmUmFuZ2UgPCAwKSB7DQorICAgICAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgICAgICAgcmVjdC5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0TWF4QnRuLmJvdHRvbSgpLCBtX3J0Q2xpZW50LndpZHRoLCAwKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmVjdC5TZXQobV9ydE1heEJ0bi5yaWdodCgpLCBtX3J0Q2xpZW50LnRvcCwgMCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydENsaWVudCA9IG1fcnRDbGllbnQ7DQorICAgIEZYX0ZMT0FUIGZMZW5ndGggPSBJc1ZlcnRpY2FsKCkgPyBydENsaWVudC5oZWlnaHQgOiBydENsaWVudC53aWR0aDsNCisgICAgRlhfRkxPQVQgZlNpemUgPSBtX2ZCdXR0b25MZW47DQorICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICAgICAgICBmTGVuZ3RoID0gZkxlbmd0aCAtIG1fcnRNaW5CdG4uaGVpZ2h0IC0gbV9ydE1heEJ0bi5oZWlnaHQ7DQorICAgICAgICAgICAgaWYgKGZMZW5ndGggPCBtX3J0TWluQnRuLmhlaWdodCB8fCBmTGVuZ3RoIDwgbV9ydE1heEJ0bi5oZWlnaHQpIHsNCisgICAgICAgICAgICAgICAgZkxlbmd0aCA9IDAuMGY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmTGVuZ3RoID0gZkxlbmd0aCAtIG1fcnRNaW5CdG4ud2lkdGggLSBtX3J0TWF4QnRuLndpZHRoOw0KKyAgICAgICAgICAgIGlmIChmTGVuZ3RoIDwgbV9ydE1pbkJ0bi53aWR0aCB8fCBmTGVuZ3RoIDwgbV9ydE1heEJ0bi53aWR0aCkgew0KKyAgICAgICAgICAgICAgICBmTGVuZ3RoID0gMC4wZjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmTGVuZ3RoIC09IGZTaXplICogMi4wZjsNCisgICAgICAgIGlmIChmTGVuZ3RoIDwgZlNpemUpIHsNCisgICAgICAgICAgICBmTGVuZ3RoID0gMC4wZjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVGh1bWJTaXplID0gZkxlbmd0aCAqIGZMZW5ndGggLyAoZlJhbmdlICsgZkxlbmd0aCk7DQorICAgIGlmIChmVGh1bWJTaXplIDwgbV9mTWluVGh1bWIpIHsNCisgICAgICAgIGZUaHVtYlNpemUgPSBtX2ZNaW5UaHVtYjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmRGlmZiA9IGZMZW5ndGggLSBmVGh1bWJTaXplOw0KKyAgICBpZiAoZkRpZmYgPCAwLjBmKSB7DQorICAgICAgICBmRGlmZiA9IDAuMGY7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlRyYWNrUG9zID0gbV9mVHJhY2tQb3M7DQorICAgIGlmIChmVHJhY2tQb3MgPiBtX2ZSYW5nZU1heCkgew0KKyAgICAgICAgZlRyYWNrUG9zID0gbV9mUmFuZ2VNYXg7DQorICAgIH0NCisgICAgaWYgKGZUcmFja1BvcyA8IG1fZlJhbmdlTWluKSB7DQorICAgICAgICBmVHJhY2tQb3MgPSBtX2ZSYW5nZU1pbjsNCisgICAgfQ0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKGZSYW5nZSk7DQorICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgICAgIEZYX0ZMT0FUIGlQb3MgPSBmRGlmZiAqIChmVHJhY2tQb3MgLSBtX2ZSYW5nZU1pbikgLyBmUmFuZ2U7DQorICAgICAgICByZWN0LmxlZnQgPSBydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgaWYgKCFJc1ZlcnRpY2FsKCkpIHsNCisgICAgICAgICAgICBpZiAoKG1fcnRNaW5CdG4ucmlnaHQoKSA9PSBtX3J0TWF4QnRuLmxlZnQgJiYgbV9ydE1pbkJ0bi53aWR0aCA+IDAgJiYgbV9ydE1heEJ0bi53aWR0aCA+IDApIHx8ICgwID09IG1fcnRNaW5CdG4ud2lkdGggJiYgMCA9PSBtX3J0TWF4QnRuLndpZHRoKSkgew0KKyAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gaVBvczsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gbV9ydE1pbkJ0bi5yaWdodCgpICsgaVBvczsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZWN0LnRvcCA9IHJ0Q2xpZW50LnRvcDsNCisgICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICAgICAgICBpZiAoKG1fcnRNaW5CdG4uYm90dG9tKCkgPT0gbV9ydE1heEJ0bi50b3AgJiYgbV9ydE1pbkJ0bi5oZWlnaHQgPiAwICYmIG1fcnRNYXhCdG4uaGVpZ2h0ID4gMCkgfHwgKDAgPT0gbV9ydE1pbkJ0bi5oZWlnaHQgJiYgMCA9PSBtX3J0TWF4QnRuLmhlaWdodCkpIHsNCisgICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gaVBvczsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZWN0LnRvcCArPSBtX3J0TWluQnRuLmJvdHRvbSgpICsgaVBvczsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZWN0LndpZHRoID0gSXNWZXJ0aWNhbCgpID8gcnRDbGllbnQud2lkdGggOiBmVGh1bWJTaXplOw0KKyAgICAgICAgcmVjdC5oZWlnaHQgPSBJc1ZlcnRpY2FsKCkgPyBmVGh1bWJTaXplIDogcnRDbGllbnQuaGVpZ2h0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgaVBvcyA9IGZTaXplICsgZkRpZmYgKiAoZlRyYWNrUG9zIC0gbV9mUmFuZ2VNaW4pIC8gZlJhbmdlOw0KKyAgICAgICAgcmVjdC5sZWZ0ID0gcnRDbGllbnQubGVmdDsNCisgICAgICAgIGlmICghSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGlQb3M7DQorICAgICAgICB9DQorICAgICAgICByZWN0LnRvcCA9IHJ0Q2xpZW50LnRvcDsNCisgICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICAgICAgICByZWN0LnRvcCArPSBpUG9zOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IHJ0Q2xpZW50LndpZHRoIDogZlRodW1iU2l6ZTsNCisgICAgICAgIHJlY3QuaGVpZ2h0ID0gSXNWZXJ0aWNhbCgpID8gZlRodW1iU2l6ZSA6IHJ0Q2xpZW50LmhlaWdodDsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWluVHJhY2tSZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIGlmIChtX2JNaW5TaXplKSB7DQorICAgICAgICByZWN0LkVtcHR5KCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IG1fcnRUaHVtYi5ib3R0b20oKTsNCisgICAgRlhfRkxPQVQgZlJpZ2h0ID0gbV9ydFRodW1iLnJpZ2h0KCk7DQorICAgIEZYX0ZMT0FUIGl4ID0gKG1fcnRUaHVtYi5sZWZ0ICsgZlJpZ2h0KSAvIDI7DQorICAgIEZYX0ZMT0FUIGl5ID0gKG1fcnRUaHVtYi50b3AgKyBmQm90dG9tKSAvIDI7DQorICAgIHJlY3QubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgcmVjdC50b3AgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgRlhfQk9PTCBiVmVydGljYWwgPSBJc1ZlcnRpY2FsKCk7DQorICAgIHJlY3Qud2lkdGggPSBiVmVydGljYWwgPyBtX3J0Q2xpZW50LndpZHRoIDogaXg7DQorICAgIHJlY3QuaGVpZ2h0ID0gYlZlcnRpY2FsID8gaXkgOiBtX3J0Q2xpZW50LmhlaWdodDsNCisgICAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgICAgIGlmICgwID09IG1fcnRNaW5CdG4uaGVpZ2h0ICYmIDAgPT0gbV9ydE1heEJ0bi5oZWlnaHQpIHsNCisgICAgICAgICAgICAgICAgcmVjdC50b3AgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcnRNaW5CdG4udG9wIDwgbV9ydFRodW1iLnRvcCkgew0KKyAgICAgICAgICAgICAgICByZWN0LnRvcCA9IG1fcnRNaW5CdG4uYm90dG9tKCk7DQorICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0IC09IChtX3J0TWluQnRuLmJvdHRvbSgpIC0gbV9ydENsaWVudC50b3ApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKDAgPT0gbV9ydE1pbkJ0bi53aWR0aCAmJiAwID09IG1fcnRNYXhCdG4ud2lkdGgpIHsNCisgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5sZWZ0IDwgbV9ydFRodW1iLmxlZnQpIHsNCisgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gbV9ydE1pbkJ0bi5yaWdodCgpOw0KKyAgICAgICAgICAgICAgICByZWN0LndpZHRoIC09IChtX3J0TWluQnRuLnJpZ2h0KCkgLSBtX3J0Q2xpZW50LmxlZnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWF4VHJhY2tSZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIGlmIChtX2JNaW5TaXplKSB7DQorICAgICAgICByZWN0LkVtcHR5KCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRkxPQVQgaXggPSAobV9ydFRodW1iLmxlZnQgKyBtX3J0VGh1bWIucmlnaHQoKSkgLyAyOw0KKyAgICBGWF9GTE9BVCBpeSA9IChtX3J0VGh1bWIudG9wICsgbV9ydFRodW1iLmJvdHRvbSgpKSAvIDI7DQorICAgIEZYX0JPT0wgYlZlcnRpY2FsID0gSXNWZXJ0aWNhbCgpOw0KKyAgICByZWN0LmxlZnQgPSBiVmVydGljYWwgPyBtX3J0Q2xpZW50LmxlZnQgOiBpeDsNCisgICAgcmVjdC50b3AgPSBiVmVydGljYWwgPyBpeSA6IG1fcnRDbGllbnQudG9wOw0KKyAgICByZWN0LndpZHRoID0gYlZlcnRpY2FsID8gbV9ydENsaWVudC53aWR0aCA6IG1fcnRDbGllbnQucmlnaHQoKSAtIGl4Ow0KKyAgICByZWN0LmhlaWdodCA9IGJWZXJ0aWNhbCA/IG1fcnRDbGllbnQuYm90dG9tKCkgLSBpeSA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICAgICAgaWYgKG1fcnRNaW5CdG4udG9wID4gbV9ydFRodW1iLnRvcCAmJiBtX3J0TWluQnRuLmhlaWdodCA+IDAgJiYgbV9ydE1heEJ0bi5oZWlnaHQgPiAwKSB7DQorICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0IC09IChtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9ydE1pbkJ0bi50b3ApOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5oZWlnaHQgPiAwICYmIG1fcnRNYXhCdG4uaGVpZ2h0ID4gMCkgew0KKyAgICAgICAgICAgICAgICByZWN0LmhlaWdodCAtPSAobV9ydENsaWVudC5ib3R0b20oKSAtIG1fcnRNYXhCdG4udG9wKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtX3J0TWluQnRuLmxlZnQgPiBtX3J0VGh1bWIubGVmdCAmJiBtX3J0TWluQnRuLndpZHRoID4gMCAmJiBtX3J0TWF4QnRuLndpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgICByZWN0LndpZHRoIC09IChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBtX3J0TWluQnRuLmxlZnQpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi53aWR0aCA+IDAgJiYgbV9ydE1heEJ0bi53aWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgcmVjdC53aWR0aCAtPSAobV9ydENsaWVudC5yaWdodCgpIC0gbV9ydE1heEJ0bi5sZWZ0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFRyYWNrUG9pbnRQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgRlhfRkxPQVQgZkRpZmZYID0gZnggLSBtX2NwVHJhY2tQb2ludFg7DQorICAgIEZYX0ZMT0FUIGZEaWZmWSA9IGZ5IC0gbV9jcFRyYWNrUG9pbnRZOw0KKyAgICBGWF9GTE9BVCBmUmFuZ2UgPSBtX2ZSYW5nZU1heCAtIG1fZlJhbmdlTWluOw0KKyAgICBGWF9GTE9BVCBmUG9zOw0KKyAgICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgICAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgICAgICAgaWYgKDAgPT0gbV9ydE1pbkJ0bi5oZWlnaHQgJiYgMCA9PSBtX3J0TWF4QnRuLmhlaWdodCkgew0KKyAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZZIC8gKG1fcnRDbGllbnQuaGVpZ2h0IC0gbV9ydFRodW1iLmhlaWdodCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLmJvdHRvbSgpID09IG1fcnRNYXhCdG4udG9wKSB7DQorICAgICAgICAgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLyAobV9ydE1pbkJ0bi50b3AgLSBtX3J0Q2xpZW50LnRvcCAtIG1fcnRUaHVtYi5oZWlnaHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLyAobV9ydE1heEJ0bi50b3AgLSBtX3J0TWluQnRuLmJvdHRvbSgpIC0gbV9ydFRodW1iLmhlaWdodCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoMCA9PSBtX3J0TWluQnRuLndpZHRoICYmIDAgPT0gbV9ydE1heEJ0bi53aWR0aCkgew0KKyAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8gKG1fcnRDbGllbnQud2lkdGggLSBtX3J0VGh1bWIud2lkdGgpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5yaWdodCgpID09IG1fcnRNYXhCdG4ubGVmdCkgew0KKyAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8gKG1fcnRNaW5CdG4ubGVmdCAtIG1fcnRDbGllbnQubGVmdCAtIG1fcnRUaHVtYi53aWR0aCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWCAvIChtX3J0TWF4QnRuLmxlZnQgLSBtX3J0TWluQnRuLnJpZ2h0KCkgLSBtX3J0VGh1bWIud2lkdGgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZZIC8gKG1fcnRNYXhCdG4udG9wIC0gbV9ydE1pbkJ0bi5ib3R0b20oKSAtIG1fcnRUaHVtYi5oZWlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8gKG1fcnRNYXhCdG4ubGVmdCAtIG1fcnRNaW5CdG4ucmlnaHQoKSAtIG1fcnRUaHVtYi53aWR0aCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZlBvcyArPSBtX2ZMYXN0VHJhY2tQb3M7DQorICAgIGlmIChmUG9zIDwgbV9mUmFuZ2VNaW4pIHsNCisgICAgICAgIGZQb3MgPSBtX2ZSYW5nZU1pbjsNCisgICAgfQ0KKyAgICBpZiAoZlBvcyA+IG1fZlJhbmdlTWF4KSB7DQorICAgICAgICBmUG9zID0gbV9mUmFuZ2VNYXg7DQorICAgIH0NCisgICAgcmV0dXJuIGZQb3M7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFRyYWNrUmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkxvd2VyICkNCit7DQorICAgIEZYX0JPT0wgYkRpc2FibGVkID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZDsNCisgICAgaWYgKGJEaXNhYmxlZCB8fCBtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgICAgIHJlY3QgPSBiTG93ZXIgPyBtX3J0TWluVHJhY2sgOiBtX3J0TWF4VHJhY2s7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9GTE9BVCBmVyA9IG1fcnRUaHVtYi53aWR0aCAvIDI7DQorICAgICAgICBGWF9GTE9BVCBmSCA9IG1fcnRUaHVtYi5oZWlnaHQgLyAyOw0KKyAgICAgICAgRlhfQk9PTCBiVmVydCA9IElzVmVydGljYWwoKTsNCisgICAgICAgIGlmIChiTG93ZXIpIHsNCisgICAgICAgICAgICBpZiAoYlZlcnQpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblRyYWNrSGVpZ2h0ID0gbV9ydE1pblRyYWNrLmhlaWdodCAtIGZIIC0gbV9ydE1pbkJ0bi5oZWlnaHQ7DQorICAgICAgICAgICAgICAgIGZNaW5UcmFja0hlaWdodCA9IChmTWluVHJhY2tIZWlnaHQgPj0gMC4wZikgPyBmTWluVHJhY2tIZWlnaHQgOiAwLjBmOw0KKyAgICAgICAgICAgICAgICByZWN0LlNldChtX3J0TWluVHJhY2subGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydE1pblRyYWNrLnRvcCArIG1fcnRNaW5CdG4uaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0TWluVHJhY2sud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGZNaW5UcmFja0hlaWdodCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblRyYWNrV2lkdGggPSBtX3J0TWluVHJhY2sud2lkdGggLSBmVyAtIG1fcnRNaW5CdG4ud2lkdGggKyAyOw0KKyAgICAgICAgICAgICAgICBmTWluVHJhY2tXaWR0aCA9IChmTWluVHJhY2tXaWR0aCA+PSAwLjBmKSA/IGZNaW5UcmFja1dpZHRoIDogMC4wZjsNCisgICAgICAgICAgICAgICAgcmVjdC5TZXQobV9ydE1pblRyYWNrLmxlZnQgKyBtX3J0TWluQnRuLndpZHRoIC0gMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydE1pblRyYWNrLnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgZk1pblRyYWNrV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRNaW5UcmFjay5oZWlnaHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGJWZXJ0KSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhUcmFja0hlaWdodCA9IG1fcnRNYXhUcmFjay5oZWlnaHQgLSBmSCAtIG1fcnRNYXhCdG4uaGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBmTWF4VHJhY2tIZWlnaHQgPSAoZk1heFRyYWNrSGVpZ2h0ID49IDAuMGYpID8gZk1heFRyYWNrSGVpZ2h0IDogMC4wZjsNCisgICAgICAgICAgICAgICAgcmVjdC5TZXQobV9ydE1heFRyYWNrLmxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRNYXhUcmFjay50b3AgKyBmSCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydE1heFRyYWNrLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmTWF4VHJhY2tIZWlnaHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhUcmFja1dpZHRoID0gbV9ydE1heFRyYWNrLndpZHRoIC0gZlcgLSBtX3J0TWF4QnRuLndpZHRoICsgMjsNCisgICAgICAgICAgICAgICAgZk1heFRyYWNrV2lkdGggPSAoZk1heFRyYWNrV2lkdGggPj0gMC4wZikgPyBmTWF4VHJhY2tXaWR0aCA6IDAuMGY7DQorICAgICAgICAgICAgICAgIHJlY3QuU2V0KG1fcnRNYXhUcmFjay5sZWZ0ICsgZlcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRNYXhUcmFjay50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXhUcmFja1dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0TWF4VHJhY2suaGVpZ2h0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhckltcDo6U2VuZEV2ZW50KCkNCit7DQorICAgIGlmIChtX2lNaW5CdXR0b25TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQorICAgICAgICBEb1Njcm9sbChGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQsIG1fZlRyYWNrUG9zKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAobV9pTWF4QnV0dG9uU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KKyAgICAgICAgRG9TY3JvbGwoRldMX1NDQkNPREVfU3RlcEZvcndhcmQsIG1fZlRyYWNrUG9zKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAobV9pTWluVHJhY2tTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQorICAgICAgICBEb1Njcm9sbChGV0xfU0NCQ09ERV9QYWdlQmFja3dhcmQsIG1fZlRyYWNrUG9zKTsNCisgICAgICAgIHJldHVybiBtX3J0VGh1bWIuQ29udGFpbnMobV9jcFRyYWNrUG9pbnRYLCBtX2NwVHJhY2tQb2ludFkpOw0KKyAgICB9DQorICAgIGlmIChtX2lNYXhUcmFja1N0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpIHsNCisgICAgICAgIERvU2Nyb2xsKEZXTF9TQ0JDT0RFX1BhZ2VGb3J3YXJkLCBtX2ZUcmFja1Bvcyk7DQorICAgICAgICByZXR1cm4gbV9ydFRodW1iLkNvbnRhaW5zKG1fY3BUcmFja1BvaW50WCwgbV9jcFRyYWNrUG9pbnRZKTsNCisgICAgfQ0KKyAgICBpZiAobV9pTW91c2VXaGVlbCkgew0KKyAgICAgICAgRlhfV09SRCBkd0NvZGUgPSBtX2lNb3VzZVdoZWVsIDwgMCA/IEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkIDogRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkOw0KKyAgICAgICAgRG9TY3JvbGwoZHdDb2RlLCBtX2ZUcmFja1Bvcyk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9TY3JvbGxCYXJJbXA6Ok9uU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykNCit7DQorICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7DQorICAgIENGV0xfRXZ0U2Nyb2xsIGV2Ow0KKyAgICBldi5tX2lTY3JvbGxDb2RlID0gZHdDb2RlOw0KKyAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIGV2Lm1fZlBvcyA9IGZQb3M7DQorICAgIGV2Lm1fcFJldCA9ICZiUmV0Ow0KKyAgICBEaXNwYXRjaEV2ZW50KCZldik7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpDRldMX1Njcm9sbEJhckltcERlbGVnYXRlKENGV0xfU2Nyb2xsQmFySW1wICpwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSAxOw0KKyAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2ctPm1fZHdGbGFncywgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnLT5tX2R3RmxhZ3MsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTGVhdmUoKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgaVJldCA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfTW91c2VXaGVlbCkgew0KKyAgICAgICAgQ0ZXTF9Nc2dNb3VzZVdoZWVsICpwTXNnID0gKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2U7DQorICAgICAgICBPbk1vdXNlV2hlZWwocE1zZy0+bV9meCwgcE1zZy0+bV9meSwgcE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2ZEZWx0YVgsIHBNc2ctPm1fZkRlbHRhWSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpUmV0ID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wT3duZXItPklzRW5hYmxlZCgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wT3duZXItPm1fYk1vdXNlRG93biA9IFRSVUU7DQorICAgIG1fcE93bmVyLT5TZXRHcmFiKFRSVUUpOw0KKyAgICBtX3BPd25lci0+bV9jcFRyYWNrUG9pbnRYID0gZng7DQorICAgIG1fcE93bmVyLT5tX2NwVHJhY2tQb2ludFkgPSBmeTsNCisgICAgbV9wT3duZXItPm1fZkxhc3RUcmFja1BvcyA9IG1fcE93bmVyLT5tX2ZUcmFja1BvczsNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0TWluQnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIERvTW91c2VEb3duKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9wT3duZXItPm1fcnRUaHVtYi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgRG9Nb3VzZURvd24oMSwgbV9wT3duZXItPm1fcnRUaHVtYiwgbV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9ydE1heEJ0bi5Db250YWlucyhmeCwgIGZ5KSkgew0KKyAgICAgICAgICAgICAgICBEb01vdXNlRG93bigyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9ydE1pblRyYWNrLkNvbnRhaW5zKGZ4LCAgZnkpKSB7DQorICAgICAgICAgICAgICAgICAgICBEb01vdXNlRG93bigzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSwgZngsIGZ5KTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIERvTW91c2VEb3duKDQsIG1fcE93bmVyLT5tX3J0TWF4VHJhY2ssIG1fcE93bmVyLT5tX2lNYXhUcmFja1N0YXRlLCBmeCwgZnkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghbV9wT3duZXItPlNlbmRFdmVudCgpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9oVGltZXIgPSBGV0xfU3RhcnRUaW1lcihtX3BPd25lciwgRldMX1NDUk9MTEJBUl9FbGFwc2UpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgRldMX1N0b3BUaW1lcihtX3BPd25lci0+bV9oVGltZXIpOw0KKyAgICBtX3BPd25lci0+bV9iTW91c2VEb3duID0gRkFMU0U7DQorICAgIERvTW91c2VVcCgwLCBtX3BPd25lci0+bV9ydE1pbkJ0biwgbV9wT3duZXItPm1faU1pbkJ1dHRvblN0YXRlLCBmeCwgIGZ5KTsNCisgICAgRG9Nb3VzZVVwKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlLCBmeCwgIGZ5KTsNCisgICAgRG9Nb3VzZVVwKDIsIG1fcE93bmVyLT5tX3J0TWF4QnRuLCBtX3BPd25lci0+bV9pTWF4QnV0dG9uU3RhdGUsIGZ4LCAgZnkpOw0KKyAgICBEb01vdXNlVXAoMywgbV9wT3duZXItPm1fcnRNaW5UcmFjaywgbV9wT3duZXItPm1faU1pblRyYWNrU3RhdGUsIGZ4LCAgZnkpOw0KKyAgICBEb01vdXNlVXAoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUsIGZ4LCAgZnkpOw0KKyAgICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgRG9Nb3VzZU1vdmUoMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgICAgRG9Nb3VzZU1vdmUoMSwgbV9wT3duZXItPm1fcnRUaHVtYiwgbV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQorICAgIERvTW91c2VNb3ZlKDIsIG1fcE93bmVyLT5tX3J0TWF4QnRuLCBtX3BPd25lci0+bV9pTWF4QnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQorICAgIERvTW91c2VNb3ZlKDMsIG1fcE93bmVyLT5tX3J0TWluVHJhY2ssIG1fcE93bmVyLT5tX2lNaW5UcmFja1N0YXRlLCBmeCwgZnkpOw0KKyAgICBEb01vdXNlTW92ZSg0LCBtX3BPd25lci0+bV9ydE1heFRyYWNrLCBtX3BPd25lci0+bV9pTWF4VHJhY2tTdGF0ZSwgZngsIGZ5KTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoKQ0KK3sNCisgICAgRG9Nb3VzZUxlYXZlKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUpOw0KKyAgICBEb01vdXNlTGVhdmUoMSwgbV9wT3duZXItPm1fcnRUaHVtYiwgbV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUpOw0KKyAgICBEb01vdXNlTGVhdmUoMiwgbV9wT3duZXItPm1fcnRNYXhCdG4sIG1fcE93bmVyLT5tX2lNYXhCdXR0b25TdGF0ZSk7DQorICAgIERvTW91c2VMZWF2ZSgzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSk7DQorICAgIERvTW91c2VMZWF2ZSg0LCBtX3BPd25lci0+bV9ydE1heFRyYWNrLCBtX3BPd25lci0+bV9pTWF4VHJhY2tTdGF0ZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZVdoZWVsKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSwgRlhfRFdPUkQJZHdGbGFncywgRlhfRkxPQVQgZkRlbHRhWCwgRlhfRkxPQVQJZkRlbHRhWSkNCit7DQorICAgIG1fcE93bmVyLT5tX2lNb3VzZVdoZWVsID0gKEZYX0lOVDMyKWZEZWx0YVg7DQorICAgIG1fcE93bmVyLT5TZW5kRXZlbnQoKTsNCisgICAgbV9wT3duZXItPm1faU1vdXNlV2hlZWwgPSAwOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VEb3duKEZYX0lOVDMyIGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgRlhfSU5UMzIgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKCFydEl0ZW0uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChpU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VVcChGWF9JTlQzMiBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIEZYX0lOVDMyICZpU3RhdGUsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIEZYX0lOVDMyIGlOZXdTdGF0ZSA9IHJ0SXRlbS5Db250YWlucyhmeCwgZnkpID8gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZCA6IEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbDsNCisgICAgaWYgKGlTdGF0ZSA9PSBpTmV3U3RhdGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpU3RhdGUgPSBpTmV3U3RhdGU7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KKyAgICBtX3BPd25lci0+T25TY3JvbGwoRldMX1NDQkNPREVfRW5kU2Nyb2xsLCBtX3BPd25lci0+bV9mVHJhY2tQb3MpOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VNb3ZlKEZYX0lOVDMyIGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgRlhfSU5UMzIgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKCFtX3BPd25lci0+bV9iTW91c2VEb3duKSB7DQorICAgICAgICBGWF9JTlQzMiBpTmV3U3RhdGUgPSBydEl0ZW0uQ29udGFpbnMoZngsIGZ5KSA/IEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQgOiBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWw7DQorICAgICAgICBpZiAoaVN0YXRlID09IGlOZXdTdGF0ZSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGlTdGF0ZSA9IGlOZXdTdGF0ZTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KKyAgICB9IGVsc2UgaWYgKCgyID09IGlJdGVtKSAmJiAobV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtX3BPd25lci0+R2V0VHJhY2tQb2ludFBvcyhmeCwgZnkpOw0KKyAgICAgICAgbV9wT3duZXItPm1fZlRyYWNrUG9zID0gZlBvczsNCisgICAgICAgIG1fcE93bmVyLT5PblNjcm9sbChGV0xfU0NCQ09ERV9UcmFja1BvcywgZlBvcyk7DQorICAgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpEb01vdXNlTGVhdmUoRlhfSU5UMzIgaUl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBGWF9JTlQzMiAmaVN0YXRlKQ0KK3sNCisgICAgaWYgKGlTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWw7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VIb3ZlcihGWF9JTlQzMiBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIEZYX0lOVDMyICZpU3RhdGUpDQorew0KKyAgICBpZiAoaVN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NDQl9Ib3ZlcmVkOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmcnRJdGVtKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3NwaW5idXR0b25pbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3NwaW5idXR0b25pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAKQEAgLTAsMCArMSw0NTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF9zcGluYnV0dG9uaW1wLmgiDQorI2RlZmluZSAgRldMX1NQTl9NaW5XaWR0aCAgIDE4DQorI2RlZmluZSAgRldMX1NQTl9NaW5IZWlnaHQgIDMyDQorI2RlZmluZSAgRldMX1NQSU5fRWxhcHNlCTIwMA0KK0lGV0xfU3BpbkJ1dHRvbiogSUZXTF9TcGluQnV0dG9uOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX1NwaW5CdXR0b247DQorfQ0KK0lGV0xfU3BpbkJ1dHRvbjo6SUZXTF9TcGluQnV0dG9uKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX1NwaW5CdXR0b246On5JRldMX1NwaW5CdXR0b24oKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBJRldMX1NwaW5CdXR0b246OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9TcGluQnV0dG9uSW1wOw0KKyAgICAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfU3BpbkJ1dHRvbjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfU3BpbkJ1dHRvbkltcChwcm9wZXJ0aWVzKTsNCisgICAgKChDRldMX1NwaW5CdXR0b25JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBJRldMX1NwaW5CdXR0b246OkVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhKS0+RW5hYmxlQnV0dG9uKGJFbmFibGUsIGJVcCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9TcGluQnV0dG9uOjpJc0J1dHRvbkVuYWJsZShGWF9CT09MIGJVcCkNCit7DQorICAgIHJldHVybiAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPklzQnV0dG9uRW5hYmxlKGJVcCk7DQorfQ0KK0NGV0xfU3BpbkJ1dHRvbkltcDo6Q0ZXTF9TcGluQnV0dG9uSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCisgICAgLCBtX2R3VXBTdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpDQorICAgICwgbV9kd0RuU3RhdGUoRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKQ0KKyAgICAsIG1fYkxCdXR0b25Ed24oRkFMU0UpDQorICAgICwgbV9pQnV0dG9uSW5kZXgoMCkNCisgICAgLCBtX2hUaW1lcihOVUxMKQ0KK3sNCisgICAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgICBtX3J0VXBCdXR0b24uUmVzZXQoKTsNCisgICAgbV9ydERuQnV0dG9uLlJlc2V0KCk7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhFX1NQQl9WZXJ0Ow0KK30NCitDRldMX1NwaW5CdXR0b25JbXA6OkNGV0xfU3BpbkJ1dHRvbkltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fZHdVcFN0YXRlKEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkNCisgICAgLCBtX2R3RG5TdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpDQorICAgICwgbV9iTEJ1dHRvbkR3bihGQUxTRSkNCisgICAgLCBtX2lCdXR0b25JbmRleCgwKQ0KKyAgICAsIG1faFRpbWVyKE5VTEwpDQorew0KKyAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICAgIG1fcnRVcEJ1dHRvbi5SZXNldCgpOw0KKyAgICBtX3J0RG5CdXR0b24uUmVzZXQoKTsNCisgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWEVfU1BCX1ZlcnQ7DQorfQ0KK0NGV0xfU3BpbkJ1dHRvbkltcDo6fkNGV0xfU3BpbkJ1dHRvbkltcCgpDQorew0KK30NCitGV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19TcGluQnV0dG9uOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU3BpbkJ1dHRvbkltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9TcGluQnV0dG9uOw0KK30NCitGV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9TcGluQnV0dG9uSW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9TcGluQnV0dG9uSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpDQorew0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LlNldCgwLCAwLCBGV0xfU1BOX01pbldpZHRoLCBGV0xfU1BOX01pbkhlaWdodCk7DQorICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX1NwaW5CdXR0b25JbXA6OlVwZGF0ZSgpDQorew0KKyAgICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYRV9TUEJfVmVydCkgew0KKyAgICAgICAgbV9ydFVwQnV0dG9uLlNldChtX3J0Q2xpZW50LnRvcCwgbV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LndpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAvIDIpOw0KKyAgICAgICAgbV9ydERuQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyLCBtX3J0Q2xpZW50LndpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAvIDIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9ydFVwQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wLCBtX3J0Q2xpZW50LndpZHRoIC8gMiwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgICAgbV9ydERuQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC8gMiwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLyAyLCBtX3J0Q2xpZW50LmhlaWdodCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1NwaW5CdXR0b25JbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgICAgfQ0KKyAgICBpZiAoSGFzQm9yZGVyKCkgJiYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3JkZXI7DQorICAgIH0NCisgICAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCisgICAgICAgIEdldEVkZ2VSZWN0KHJ0RWRnZSk7DQorICAgICAgICBpZiAocnRFZGdlLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX1BBUlRfU1BCX0VkZ2U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fcnRVcEJ1dHRvbi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfU1BCX1VwQnV0dG9uOw0KKyAgICB9DQorICAgIGlmIChtX3J0RG5CdXR0b24uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1NQQl9Eb3duQnV0dG9uOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRlhfUmVjdEYgcnRDbGlwKG1fcnRDbGllbnQpOw0KKyAgICBpZiAocE1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICAgIH0NCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9TUEJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfU1BCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgRHJhd1VwQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgICAgRHJhd0Rvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfU3BpbkJ1dHRvbkltcDo6UnVuKEZXTF9IVElNRVIgaFRpbWVyKQ0KK3sNCisgICAgaWYgKG1faFRpbWVyKSB7DQorICAgICAgICBDRldMX0V2dFNwYkNsaWNrIHdtUG9zQ2hhbmdlZDsNCisgICAgICAgIHdtUG9zQ2hhbmdlZC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICB3bVBvc0NoYW5nZWQubV9iVXAgPSBtX2lCdXR0b25JbmRleCA9PSAwOw0KKyAgICAgICAgRGlzcGF0Y2hFdmVudCgmd21Qb3NDaGFuZ2VkKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQorRldMX0VSUiBDRldMX1NwaW5CdXR0b25JbXA6OkVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwKQ0KK3sNCisgICAgaWYgKGJVcCkgew0KKyAgICAgICAgaWYgKGJFbmFibGUpIHsNCisgICAgICAgICAgICBtX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChiRW5hYmxlKSB7DQorICAgICAgICAgICAgbV9kd0RuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfU3BpbkJ1dHRvbkltcDo6SXNCdXR0b25FbmFibGUoRlhfQk9PTCBiVXApDQorew0KKyAgICBpZiAoYlVwKSB7DQorICAgICAgICByZXR1cm4gKG1fZHdVcFN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKG1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkKTsNCit9DQordm9pZCBDRldMX1NwaW5CdXR0b25JbXA6OkRyYXdVcEJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfU1BCX1VwQnV0dG9uOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gbV9kd1VwU3RhdGUgKyAxOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFVwQnV0dG9uOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcDo6RHJhd0Rvd25CdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX1NQQl9Eb3duQnV0dG9uOw0KKyAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gbV9kd0RuU3RhdGUgKyAxOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydERuQnV0dG9uOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCitDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6Q0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9TcGluQnV0dG9uSW1wICpwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgICBGWF9JTlQzMiBpUmV0ID0gMTsNCisgICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgICAgICAgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgICAgICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgICAgICAgICAgICBDRldMX01zZ0tleSAqcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICAgICAgICAgICAgICAgICAgT25LZXlEb3duKChDRldMX01zZ0tleSopcEtleSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUglDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIGlmIChiU2V0KSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSAoRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfihGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgbV9wT3duZXItPm1fYkxCdXR0b25Ed24gPSBUUlVFOw0KKyAgICBtX3BPd25lci0+U2V0R3JhYihUUlVFKTsNCisgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBGWF9CT09MIGJVcFByZXNzID0gKG1fcE93bmVyLT5tX3J0VXBCdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpOw0KKyAgICBGWF9CT09MIGJEblByZXNzID0gKG1fcE93bmVyLT5tX3J0RG5CdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKTsNCisgICAgaWYgKCFiVXBQcmVzcyAmJiAhYkRuUHJlc3MpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlVwUHJlc3MpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2lCdXR0b25JbmRleCA9IDA7DQorICAgICAgICBtX3BPd25lci0+bV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkOw0KKyAgICB9DQorICAgIGlmIChiRG5QcmVzcykgew0KKyAgICAgICAgbV9wT3duZXItPm1faUJ1dHRvbkluZGV4ID0gMTsNCisgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX1ByZXNzZWQ7DQorICAgIH0NCisgICAgQ0ZXTF9FdnRTcGJDbGljayB3bVBvc0NoYW5nZWQ7DQorICAgIHdtUG9zQ2hhbmdlZC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICB3bVBvc0NoYW5nZWQubV9iVXAgPSBiVXBQcmVzczsNCisgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtUG9zQ2hhbmdlZCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KGJVcFByZXNzID8gJm1fcE93bmVyLT5tX3J0VXBCdXR0b24gOiAmbV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQorICAgIG1fcE93bmVyLT5tX2hUaW1lciA9IEZXTF9TdGFydFRpbWVyKG1fcE93bmVyLCBGV0xfU1BJTl9FbGFwc2UpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkR3biA9IEZBTFNFOw0KKyAgICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQorICAgIG1fcE93bmVyLT5TZXRGb2N1cyhGQUxTRSk7DQorICAgIGlmIChtX3BPd25lci0+bV9oVGltZXIpIHsNCisgICAgICAgIEZXTF9TdG9wVGltZXIobV9wT3duZXItPm1faFRpbWVyKTsNCisgICAgICAgIG1fcE93bmVyLT5tX2hUaW1lciA9IE5VTEw7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlOw0KKyAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlID09IEZXTF9QQVJUU1RBVEVfU1BCX1ByZXNzZWQgJiYgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKFRSVUUpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0RG5CdXR0b247DQorICAgIH0NCisgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX2JMQnV0dG9uRHduKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgICBDRlhfUmVjdEYgcnRJbnZsaWRhdGU7DQorICAgIHJ0SW52bGlkYXRlLlJlc2V0KCk7DQorICAgIGlmIChtX3BPd25lci0+bV9ydFVwQnV0dG9uLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBpZiAobV9wT3duZXItPklzQnV0dG9uRW5hYmxlKFRSVUUpKSB7DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NQQl9Ib3ZlcmVkKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQ7DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCAmJiBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgICAgICAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgICAgICAgICAgICBydEludmxpZGF0ZS5VbmlvbihtX3BPd25lci0+bV9ydERuQnV0dG9uKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnREbkJ1dHRvbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPkVuYWJsZUJ1dHRvbihGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0RG5CdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIGlmIChtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ib3ZlcmVkKSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQ7DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydERuQnV0dG9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCAmJiBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICAgICAgICAgICAgICBpZiAoYlJlcGFpbnQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3J0VXBCdXR0b24pOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCB8fCBtX3BPd25lci0+bV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKSB7DQorICAgICAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+bV9kd0RuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQorICAgICAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnREbkJ1dHRvbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52bGlkYXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE1zZyk7DQorICAgIGlmIChtX3BPd25lci0+bV9kd1VwU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKSkgew0KKyAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBGWF9CT09MIGJVcCA9IHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwIHx8IHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX0xlZnQ7DQorICAgIEZYX0JPT0wgYkRvd24gPSBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9Eb3duIHx8IHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1JpZ2h0Ow0KKyAgICBpZiAoIWJVcCAmJiAhYkRvd24pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJVcEVuYWJsZSA9IG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKTsNCisgICAgRlhfQk9PTCBiRG93bkVuYWJsZSA9IG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSk7DQorICAgIGlmICghYlVwRW5hYmxlICYmICFiRG93bkVuYWJsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfRXZ0U3BiQ2xpY2sgd21Qb3NDaGFuZ2VkOw0KKyAgICB3bVBvc0NoYW5nZWQubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgd21Qb3NDaGFuZ2VkLm1fYlVwID0gYlVwRW5hYmxlOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21Qb3NDaGFuZ2VkKTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoYlVwRW5hYmxlID8gJm1fcE93bmVyLT5tX3J0VXBCdXR0b24gOiAmbV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmxpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1N2QyZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmxpbXAuY3BwCkBAIC0wLDAgKzEsMzM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oIg0KKyNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdG9vbHRpcGN0cmxpbXAuaCINCitJRldMX1Rvb2xUaXAgKklGV0xfVG9vbFRpcDo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBuZXcgSUZXTF9Ub29sVGlwOw0KK30NCitGV0xfRVJSIElGV0xfVG9vbFRpcDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1Rvb2xUaXBJbXAocE91dGVyKTsNCisgICAgKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX1Rvb2xUaXA6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1Rvb2xUaXBJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBJRldMX1Rvb2xUaXA6OlNldEFuY2hvcihjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Ub29sVGlwSW1wKiltX3BEYXRhKS0+U2V0QW5jaG9yKCBydEFuY2hvcik7DQorfQ0KK0ZXTF9FUlIgSUZXTF9Ub29sVGlwOjpTaG93KCkNCit7DQorICAgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPlNob3coKTsNCit9DQorRldMX0VSUiBJRldMX1Rvb2xUaXA6OkhpZGUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Ub29sVGlwSW1wKiltX3BEYXRhKS0+SGlkZSgpOw0KK30NCitJRldMX1Rvb2xUaXA6OklGV0xfVG9vbFRpcCgpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9Ub29sVGlwOjp+SUZXTF9Ub29sVGlwKCkNCit7DQorICAgIGlmIChtX3BEYXRhKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0NGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KKyAgICA6IENGV0xfRm9ybUltcChwT3V0ZXIpDQorICAgICwgbV9iQnRuRG93bihGQUxTRSkNCisgICAgLCBtX2R3VFRPU3R5bGVzKEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKQ0KKyAgICAsIG1faVRUT0FsaWduKEZERV9UVE9BTElHTk1FTlRfQ2VudGVyKQ0KKyAgICAsIG1faFRpbWVyU2hvdyhOVUxMKQ0KKyAgICAsIG1faFRpbWVySGlkZShOVUxMKQ0KKyAgICAsIG1fcFRpbWVyKE5VTEwpDQorew0KKyAgICBtX3J0Q2xpZW50LlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KKyAgICBtX3BUaW1lciA9IE5VTEw7DQorICAgIG1fVGltZXJTaG93Lm1fcFRvb2xUaXAgPSB0aGlzOw0KKyAgICBtX1RpbWVySGlkZS5tX3BUb29sVGlwID0gdGhpczsNCit9DQorQ0ZXTF9Ub29sVGlwSW1wOjpDRldMX1Rvb2xUaXBJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX0Zvcm1JbXAocHJvcGVydGllcywgcE91dGVyKQ0KKyAgICAsIG1fYkJ0bkRvd24oRkFMU0UpDQorICAgICwgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkNCisgICAgLCBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikNCisgICAgLCBtX2hUaW1lclNob3coTlVMTCkNCisgICAgLCBtX2hUaW1lckhpZGUoTlVMTCkNCisgICAgLCBtX3BUaW1lcihOVUxMKQ0KK3sNCisgICAgbV9ydENsaWVudC5TZXQoMCwgMCwgMCwgMCk7DQorICAgIG1fcnRDYXB0aW9uLlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9ydEFuY2hvci5TZXQoMCwgMCwgMCwgMCk7DQorICAgIG1fVGltZXJTaG93Lm1fcFRvb2xUaXAgPSB0aGlzOw0KKyAgICBtX1RpbWVySGlkZS5tX3BUb29sVGlwID0gdGhpczsNCit9DQorQ0ZXTF9Ub29sVGlwSW1wOjp+Q0ZXTF9Ub29sVGlwSW1wKCkNCit7DQorICAgIGlmIChtX3BUaW1lcikgew0KKyAgICAgICAgZGVsZXRlIG1fcFRpbWVyOw0KKyAgICAgICAgbV9wVGltZXIgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICB3c0NsYXNzID0gRldMX0NMQVNTX1Rvb2xUaXA7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Ub29sVGlwSW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX1Rvb2xUaXA7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Ub29sVGlwSW1wOjpJbml0aWFsaXplKCkNCit7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgfD0gRldMX1dHVFNUWUxFX1BvcHVwOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICY9IH5GV0xfV0dUU1RZTEVfQ2hpbGQ7DQorICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUodGhpcyk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX1Rvb2xUaXBJbXA6OkZpbmFsaXplKCkNCit7DQorICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgICAgICAgIElGV0xfVG9vbFRpcERQICpwRGF0YSA9IChJRldMX1Rvb2xUaXBEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgaWYgKHBEYXRhKSB7DQorICAgICAgICAgICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaUxlbiA9IHdzQ2FwdGlvbi5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgICAgICAgICAgIHJlY3Qud2lkdGggKz0gRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyICogMjU7DQorICAgICAgICAgICAgcmVjdC5oZWlnaHQgKz0gRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyICogODsNCisgICAgICAgIH0NCisgICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6VXBkYXRlKCkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KKyAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgICBtX3J0Q2FwdGlvbiA9IG1fcnRDbGllbnQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX1Rvb2xUaXBJbXA6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgRlhfRkxPQVQgeCA9IDA7DQorICAgIEZYX0ZMT0FUIHkgPSAwOw0KKyAgICBGWF9GTE9BVCB0ID0gMDsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgICBpZiAocFRoZW1lKSB7DQorICAgICAgICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgICAgICAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBGWF9GTE9BVCAqIHZhbHVlID0gTlVMTDsNCisgICAgICAgIHZhbHVlID0gKEZYX0ZMT0FUICopIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlcik7DQorICAgICAgICB4ID0gKnZhbHVlOw0KKyAgICAgICAgdmFsdWUgPSAoRlhfRkxPQVQgKikgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKTsNCisgICAgICAgIHkgPSAqdmFsdWU7DQorICAgIH0NCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIHJlY3QuT2Zmc2V0KC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7DQorICAgIHJlY3QuRGVmbGF0ZSh4LCB0LCB4LCB5KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBJRldMX1Rvb2xUaXBUYXJnZXQgKiB0b29sVGlwVGFyZ2V0ID0gQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5HZXRDdXJyZW50VG9vbFRpcFRhcmdldCgpOw0KKyAgICBpZiAodG9vbFRpcFRhcmdldCAmJiAhdG9vbFRpcFRhcmdldC0+VXNlRGVmYXVsdFRoZW1lKCkpIHsNCisgICAgICAgIHJldHVybiB0b29sVGlwVGFyZ2V0LT5EcmF3VG9vbFRpcChwR3JhcGhpY3MsIHBNYXRyaXgsIG1fcEludGVyZmFjZSk7DQorICAgIH0NCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3VGV4dChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1Rvb2xUaXBJbXA6OkRyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfVFRQX0JhY2tncm91bmQ7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2xpZW50Ow0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgICAgICBwYXJhbS5tX3BEYXRhID0gJm1fcnRDYXB0aW9uOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX1Rvb2xUaXBJbXA6OkRyYXdUZXh0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXItPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgICBpZiAod3NDYXB0aW9uLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGV0xfVGhlbWVUZXh0IHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9UVFBfQ2FwdGlvbjsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KKyAgICBwYXJhbS5tX3dzVGV4dCA9IHdzQ2FwdGlvbjsNCisgICAgcGFyYW0ubV9kd1RUT1N0eWxlcyA9IG1fZHdUVE9TdHlsZXM7DQorICAgIHBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ247DQorICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX1Rvb2xUaXBJbXA6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKQ0KK3sNCisgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgICAgbV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgICAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9SVEw7DQorICAgIH0NCisgICAgaWYgKCBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUpIHsNCisgICAgICAgIG1fZHdUVE9TdHlsZXMgJj0gfkZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvcikNCit7DQorICAgIG1fcnRBbmNob3IgPSBydEFuY2hvcjsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpTaG93KCkNCit7DQorICAgIElGV0xfVG9vbFRpcERQICpwRGF0YSA9IChJRldMX1Rvb2xUaXBEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9JTlQzMiBuSW5pdERlbGF5ID0gcERhdGEtPkdldEluaXRpYWxEZWxheShtX3BJbnRlcmZhY2UpOw0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KKyAgICAgICAgbV9oVGltZXJTaG93ID0gRldMX1N0YXJ0VGltZXIoICZtX1RpbWVyU2hvdywgbkluaXREZWxheSwgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6SGlkZSgpDQorew0KKyAgICBTZXRTdGF0ZXMoIEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgICBpZiAoIG1faFRpbWVySGlkZSkgew0KKyAgICAgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lckhpZGUpOw0KKyAgICAgICAgbV9oVGltZXJIaWRlID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIG1faFRpbWVyU2hvdykgew0KKyAgICAgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lclNob3cpOw0KKyAgICAgICAgbV9oVGltZXJTaG93ID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIGlmICggKGR3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgJiYgIWJTZXQpIHsNCisgICAgICAgIElGV0xfVG9vbFRpcERQICpwRGF0YSA9IChJRldMX1Rvb2xUaXBEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgICAgRlhfSU5UMzIgbkF1dG9Qb3BEZWxheSA9IHBEYXRhLT5HZXRBdXRvUG9wRGVsYXkobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIG1faFRpbWVySGlkZSA9IEZXTF9TdGFydFRpbWVyKCAmbV9UaW1lckhpZGUsIG5BdXRvUG9wRGVsYXksIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Ub29sVGlwSW1wOjpSZWZyZXNoVG9vbFRpcFBvcygpDQorew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfVFRQX05vQW5jaG9yKSA9PSAwKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRQb3B1cDsNCisgICAgICAgIENGWF9SZWN0RiBydFdpZGdldChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0KTsNCisgICAgICAgIENGWF9SZWN0RiBydEFuY2hvcihtX3J0QW5jaG9yKTsNCisgICAgICAgIHJ0UG9wdXAuU2V0KCAwLCAwLCAwLCAwKTsNCisgICAgICAgIEZYX0ZMT0FUIGZ4ID0gcnRBbmNob3IuQ2VudGVyKCkueCArIDIwOw0KKyAgICAgICAgRlhfRkxPQVQgZnkgPSBydEFuY2hvci5DZW50ZXIoKS55ICsgMjA7DQorICAgICAgICBydFBvcHVwLlNldCggZngsIGZ5LCBydFdpZGdldC5XaWR0aCgpLCBydFdpZGdldC5IZWlnaHQoKSk7DQorICAgICAgICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgZlNjcmVlbkhlaWdodCA9IDA7DQorICAgICAgICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQorICAgICAgICBpZiAocnRQb3B1cC5ib3R0b20oKSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgICAgICAgICBydFBvcHVwLk9mZnNldCggMCwgZlNjcmVlbkhlaWdodCAtIHJ0UG9wdXAuYm90dG9tKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCBydFBvcHVwLnJpZ2h0KCkgPiBmU2NyZWVuV2lkdGgpIHsNCisgICAgICAgICAgICBydFBvcHVwLk9mZnNldCggZlNjcmVlbldpZHRoIC0gcnRQb3B1cC5yaWdodCgpLCAwKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICggcnRQb3B1cC5sZWZ0IDwgMCkgew0KKyAgICAgICAgICAgIHJ0UG9wdXAuT2Zmc2V0KDAgLSBydFBvcHVwLmxlZnQsIDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCBydFBvcHVwLnRvcCA8IDApIHsNCisgICAgICAgICAgICBydFBvcHVwLk9mZnNldCggMCwgMCAtIHJ0UG9wdXAudG9wKTsNCisgICAgICAgIH0NCisgICAgICAgIFNldFdpZGdldFJlY3QocnRQb3B1cCk7DQorICAgICAgICBVcGRhdGUoKTsNCisgICAgfQ0KK30NCitDRldMX1Rvb2xUaXBJbXA6OkNGV0xfVG9vbFRpcFRpbWVyOjpDRldMX1Rvb2xUaXBUaW1lcihDRldMX1Rvb2xUaXBJbXAgKiBwVG9vbFRpcCkNCisgICAgOiBtX3BUb29sVGlwKHBUb29sVGlwKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9Ub29sVGlwSW1wOjpDRldMX1Rvb2xUaXBUaW1lcjo6UnVuKEZXTF9IVElNRVIgaFRpbWVyKQ0KK3sNCisgICAgaWYgKG1fcFRvb2xUaXAtPm1faFRpbWVyU2hvdyA9PSBoVGltZXIgJiYgbV9wVG9vbFRpcC0+bV9oVGltZXJTaG93KSB7DQorICAgICAgICBpZiAobV9wVG9vbFRpcC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSB7DQorICAgICAgICAgICAgbV9wVG9vbFRpcC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgICAgICAgICBtX3BUb29sVGlwLT5SZWZyZXNoVG9vbFRpcFBvcygpOw0KKyAgICAgICAgICAgIEZXTF9TdG9wVGltZXIobV9wVG9vbFRpcC0+bV9oVGltZXJTaG93KTsNCisgICAgICAgICAgICBtX3BUb29sVGlwLT5tX2hUaW1lclNob3cgPSBOVUxMOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BUb29sVGlwLT5tX2hUaW1lckhpZGUgPT0gaFRpbWVyICYmIG1fcFRvb2xUaXAtPm1faFRpbWVySGlkZSkgew0KKyAgICAgICAgbV9wVG9vbFRpcC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgICAgICAgRldMX1N0b3BUaW1lcihtX3BUb29sVGlwLT5tX2hUaW1lckhpZGUpOw0KKyAgICAgICAgbV9wVG9vbFRpcC0+bV9oVGltZXJIaWRlID0gTlVMTDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6Q0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUoQ0ZXTF9Ub29sVGlwSW1wICpwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIHJldHVybglDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUglDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfVG9vbFRpcEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY5MzJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGVpbXAuY3BwCkBAIC0wLDAgKzEsNDAwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z4bWF0aF9iYXJjb2RlaW1wLmgiDQorc3RhdGljIENCQ19Db2RlQmFzZSogRlhfQmFyY29kZV9DcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KEJDX1RZUEUgdHlwZSkNCit7DQorICAgIHN3aXRjaCh0eXBlKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db2RlMzkoKTsNCisgICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db2RhYmFyKCk7DQorICAgICAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29kZTEyOChCQ19DT0RFMTI4X0IpOw0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29kZTEyOChCQ19DT0RFMTI4X0IpOw0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29kZTEyOChCQ19DT0RFMTI4X0MpOw0KKyAgICAgICAgY2FzZSBCQ19FQU44Og0KKyAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0VBTjgoKTsNCisgICAgICAgIGNhc2UgQkNfVVBDQToNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19VUENBKCk7DQorICAgICAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0VBTjEzKCk7DQorICAgICAgICBjYXNlIEJDX1FSX0NPREU6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfUVJDb2RlKCk7DQorICAgICAgICBjYXNlIEJDX1BERjQxNzoNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19QREY0MTdJKCk7DQorICAgICAgICBjYXNlIEJDX0RBVEFNQVRSSVg6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfRGF0YU1hdHJpeCgpOw0KKyAgICAgICAgY2FzZSBCQ19VTktOT1dOOg0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KK30NCitDRlhfQmFyY29kZTo6Q0ZYX0JhcmNvZGUoKQ0KK3sNCit9DQorQ0ZYX0JhcmNvZGU6On5DRlhfQmFyY29kZSgpDQorew0KKyAgICBpZihtX3BCQ0VuZ2luZSkgew0KKyAgICAgICAgZGVsZXRlIG1fcEJDRW5naW5lOw0KKyAgICAgICAgbV9wQkNFbmdpbmUgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OkNycmVhdGUoQkNfVFlQRSB0eXBlKQ0KK3sNCisgICAgbV9wQkNFbmdpbmUgPSBGWF9CYXJjb2RlX0NyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QodHlwZSk7DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZSAhPSBOVUxMOw0KK30NCit2b2lkIENGWF9CYXJjb2RlOjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitCQ19UWVBFIENGWF9CYXJjb2RlOjpHZXRUeXBlKCkNCit7DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5HZXRUeXBlKCkgOiBCQ19VTktOT1dOOw0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRDaGFyRW5jb2RpbmcoQkNfQ0hBUl9FTkNPRElORyBlbmNvZGluZykNCit7DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRDaGFyRW5jb2RpbmcoZW5jb2RpbmcpIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldE1vZHVsZUhlaWdodChGWF9JTlQzMiBtb2R1bGVIZWlnaHQpDQorew0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0TW9kdWxlSGVpZ2h0KG1vZHVsZUhlaWdodCkgOiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0TW9kdWxlV2lkdGgoRlhfSU5UMzIgbW9kdWxlV2lkdGgpDQorew0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0TW9kdWxlV2lkdGgobW9kdWxlV2lkdGgpIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEhlaWdodChGWF9JTlQzMiBoZWlnaHQpDQorew0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0SGVpZ2h0KGhlaWdodCkgOiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0V2lkdGgoRlhfSU5UMzIgd2lkdGgpDQorew0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0V2lkdGgod2lkdGgpIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ0ZYX0JhcmNvZGU6OkNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgICAgICBjYXNlIEJDX0VBTjg6DQorICAgICAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICAgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+Q2hlY2tDb250ZW50VmFsaWRpdHkoY29udGVudHMpDQorICAgICAgICAgICAgICAgICAgIDogVFJVRTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKQ0KK3sNCisgICAgc3dpdGNoKEdldFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICAgICAgY2FzZSBCQ19FQU44Og0KKyAgICAgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgICAgIGNhc2UgQkNfVVBDQToNCisgICAgICAgICAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyAoKChDQkNfT25lQ29kZSopbV9wQkNFbmdpbmUpLT5TZXRQcmludENoZWNrc3VtKGNoZWNrc3VtKSwgVFJVRSkNCisgICAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKQ0KK3sNCisgICAgc3dpdGNoKEdldFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICAgICAgY2FzZSBCQ19FQU44Og0KKyAgICAgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgICAgIGNhc2UgQkNfVVBDQToNCisgICAgICAgICAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyAoKChDQkNfT25lQ29kZSopbV9wQkNFbmdpbmUpLT5TZXREYXRhTGVuZ3RoKGxlbmd0aCksIFRSVUUpDQorICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KK30NCitGWF9CT09MCUNGWF9CYXJjb2RlOjpTZXRDYWxDaGVja3N1bShGWF9JTlQzMiBzdGF0ZSkNCit7DQorICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCisgICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgICAgIGNhc2UgQkNfRUFOODoNCisgICAgICAgIGNhc2UgQkNfRUFOMTM6DQorICAgICAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgICAgICAgcmV0dXJuIG1fcEJDRW5naW5lID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0Q2FsQ2hlY2tzdW0oc3RhdGUpLCBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Rm9udChDRlhfRm9udCogcEZvbnQpDQorew0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgICAgICBjYXNlIEJDX0VBTjg6DQorICAgICAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICAgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0Rm9udChwRm9udCkNCisgICAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpDQorew0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgICAgICBjYXNlIEJDX0VBTjg6DQorICAgICAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICAgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnRTaXplKHNpemUpLCBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Rm9udFN0eWxlKEZYX0lOVDMyIHN0eWxlKQ0KK3sNCisgICAgc3dpdGNoKEdldFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICAgICAgY2FzZSBCQ19FQU44Og0KKyAgICAgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgICAgIGNhc2UgQkNfVVBDQToNCisgICAgICAgICAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyAoKChDQkNfT25lQ29kZSopbV9wQkNFbmdpbmUpLT5TZXRGb250U3R5bGUoc3R5bGUpLCBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpDQorew0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgICAgICBjYXNlIEJDX0VBTjg6DQorICAgICAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICAgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnRDb2xvcihjb2xvciksIFRSVUUpDQorICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KK30NCitGWF9CT09MCUNGWF9CYXJjb2RlOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQorew0KKyAgICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKEJDX1RFWFRfTE9DKTsNCisgICAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGUzOTo6U2V0VGV4dExvY2F0aW9uOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kYWJhcjo6U2V0VGV4dExvY2F0aW9uOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgICAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgICAgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGUxMjg6OlNldFRleHRMb2NhdGlvbjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikobG9jYXRpb24pDQorICAgICAgICAgICA6IEZBTFNFOw0KK30NCitGWF9CT09MCUNGWF9CYXJjb2RlOjpTZXRXaWRlTmFycm93UmF0aW8oRlhfSU5UMzIgcmF0aW8pDQorew0KKyAgICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKEZYX0lOVDMyKTsNCisgICAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICAgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGUzOTo6U2V0V2lkZU5hcnJvd1JhdGlvOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kYWJhcjo6U2V0V2lkZU5hcnJvd1JhdGlvOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShyYXRpbykNCisgICAgICAgICAgIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KQ0KK3sNCisgICAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShGWF9DSEFSKTsNCisgICAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRTdGFydENoYXI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKHN0YXJ0KQ0KKyAgICAgICAgICAgOiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkNCit7DQorICAgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQ0hBUik7DQorICAgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCisgICAgc3dpdGNoKEdldFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kYWJhcjo6U2V0RW5kQ2hhcjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikoZW5kKQ0KKyAgICAgICAgICAgOiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0VmVyc2lvbihGWF9JTlQzMiB2ZXJzaW9uKQ0KK3sNCisgICAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShGWF9JTlQzMik7DQorICAgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCisgICAgc3dpdGNoKEdldFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBCQ19RUl9DT0RFOg0KKyAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfUVJDb2RlOjpTZXRWZXJzaW9uOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKSh2ZXJzaW9uKQ0KKyAgICAgICAgICAgOiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoRlhfSU5UMzIgbGV2ZWwpDQorew0KKyAgICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKEZYX0lOVDMyKTsNCisgICAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX1FSX0NPREU6DQorICAgICAgICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19RUkNvZGU6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCQ19QREY0MTc6DQorICAgICAgICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19QREY0MTdJOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKGxldmVsKQ0KKyAgICAgICAgICAgOiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKQ0KK3sNCisgICAgdHlwZWRlZiB2b2lkIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShGWF9CT09MKTsNCisgICAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEJDX1BERjQxNzoNCisgICAgICAgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX1BERjQxN0k6OlNldFRydW5jYXRlZDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/ICgobV9wQkNFbmdpbmUtPiptZW1wdHIpKHRydW5jYXRlZCksIFRSVUUpDQorICAgICAgICAgICA6IEZBTFNFOw0KK30NCisjaWZuZGVmIEJDRXhjZXB0aW9uTk8NCisjZGVmaW5lCUJDRXhjZXB0aW9uTk8JCQkJCQkJCQkJCSAgICAgICAgICAgMA0KKyNlbmRpZg0KKyNpZm5kZWYgQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24NCisjZGVmaW5lCUJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uCQkJCQkJCQkgICAgICAgICAgIDgNCisjZW5kaWYNCisjaWZuZGVmIEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlDQorI2RlZmluZQlCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkQmFyY29kZQkJCQkJCQkgICAgICAgICAgMTgNCisjZW5kaWYNCitGWF9CT09MIENGWF9CYXJjb2RlOjpFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZighbV9wQkNFbmdpbmUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQkNFbmdpbmUtPkVuY29kZShjb250ZW50cywgaXNEZXZpY2UsIGUpOw0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKCFtX3BCQ0VuZ2luZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZS0+UmVuZGVyRGV2aWNlKGRldmljZSwgbWF0aXJ4LCBlKTsNCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKCFtX3BCQ0VuZ2luZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BCQ0VuZ2luZS0+UmVuZGVyQml0bWFwKHBPdXRCaXRtYXAsIGUpOw0KK30NCisjZGVmaW5lIEJDX1RZUEVfTUlOIEJDX0NPREUzOQ0KKyNkZWZpbmUgQkNfVFlQRV9NQVggQkNfREFUQU1BVFJJWA0KK0NGWF9XaWRlU3RyaW5nCUNGWF9CYXJjb2RlOjpEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0LCBGWF9JTlQzMiAmZXJyb3JDb2RlKQ0KK3sNCisgICAgZm9yKEJDX1RZUEUgdCA9IEJDX1RZUEVfTUlOOyB0IDw9IEJDX1RZUEVfTUFYOyB0ID0gKEJDX1RZUEUpKChGWF9JTlQzMil0ICsgMSkpIHsNCisgICAgICAgIENCQ19Db2RlQmFzZSogcFRtcEVuZ2luZSA9IEZYX0JhcmNvZGVfQ3JlYXRlQmFyQ29kZUVuZ2luZU9iamVjdCh0KTsNCisgICAgICAgIGlmKCFwVG1wRW5naW5lKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyByZXQgPSBwVG1wRW5naW5lLT5EZWNvZGUoYnVmLCB3aWR0aCwgaGVpZ2h0LCBlcnJvckNvZGUpOw0KKyAgICAgICAgaWYoZXJyb3JDb2RlID09IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcJQ0ZYX0JhcmNvZGU6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlcnJvckNvZGUpDQorew0KKyAgICBmb3IoQkNfVFlQRSB0ID0gQkNfVFlQRV9NSU47IHQgPD0gQkNfVFlQRV9NQVg7IHQgPSAoQkNfVFlQRSkoKEZYX0lOVDMyKXQgKyAxKSkgew0KKyAgICAgICAgQ0JDX0NvZGVCYXNlKiBwVG1wRW5naW5lID0gRlhfQmFyY29kZV9DcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KHQpOw0KKyAgICAgICAgaWYoIXBUbXBFbmdpbmUpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHJldCA9IHBUbXBFbmdpbmUtPkRlY29kZShwQml0bWFwLCBlcnJvckNvZGUpOw0KKyAgICAgICAgaWYoZXJyb3JDb2RlID09IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorSUZYX0JhcmNvZGUqIEZYX0JhcmNvZGVfQ3JlYXRlKEJDX1RZUEUgdHlwZSkNCit7DQorICAgIENGWF9CYXJjb2RlKiBwQmFyY29kZSA9IEZYX05FVyBDRlhfQmFyY29kZTsNCisgICAgaWYgKHBCYXJjb2RlLT5DcnJlYXRlKHR5cGUpKSB7DQorICAgICAgICByZXR1cm4gcEJhcmNvZGU7DQorICAgIH0NCisgICAgcEJhcmNvZGUtPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ2ODFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfYmFyY29kZWltcC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0JBUkNPREVfSU1QX0gNCisjZGVmaW5lIF9GV0xfQkFSQ09ERV9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRWRpdEltcDsNCitjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX0JhcmNvZGVFZGl0Ow0KK2NsYXNzIENGV0xfQmFyY29kZUVkaXREZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0JhcmNvZGVJbXA7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU7DQorI2RlZmluZSBYRkFfQkNTX05lZWRVcGRhdGUJCTB4MDAwMQ0KKyNkZWZpbmUgWEZBX0JDU19FbmNvZGVTdWNjZXNzCTB4MDAwMg0KK2NsYXNzIENGV0xfQmFyY29kZUltcCA6IHB1YmxpYyBDRldMX0VkaXRJbXANCit7DQorcHVibGljOg0KKyAgICBDRldMX0JhcmNvZGVJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX0JhcmNvZGVJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQmFyY29kZUltcCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldFR5cGUoQkNfVFlQRSB0eXBlKTsNCisgICAgRlhfQk9PTAkJCQlJc1Byb3RlY3RlZFR5cGUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQlHZW5lcmF0ZUJhcmNvZGVJbWFnZUNhY2hlKCk7DQorICAgIHZvaWQJCQlDcmVhdGVCYXJjb2RlRW5naW5lKCk7DQorICAgIHZvaWQJCQlSZWxlYXNlQmFyY29kZUVuZ2luZSgpOw0KKyAgICBJRlhfQmFyY29kZQkJKm1fcEJhcmNvZGVFbmdpbmU7DQorICAgIEZYX0RXT1JECQltX2R3U3RhdHVzOw0KKyAgICBCQ19UWVBFCQkJbV90eXBlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX0VkaXRJbXBEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQmFyY29kZUltcERlbGVnYXRlKENGV0xfQmFyY29kZUltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2FyZXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhZTA4MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0FSRVRfSU1QX0gNCisjZGVmaW5lIF9GV0xfQ0FSRVRfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX0NhcmV0SW1wOw0KK2NsYXNzIENGV0xfQ2FyZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0NhcmV0SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9DYXJldEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIENGV0xfQ2FyZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIHZpcnR1YWwgfkNGV0xfQ2FyZXRJbXAoKTsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorDQorICAgIHZpcnR1YWwJRldMX0VSUglTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZyA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0RnJlcXVlbmN5KEZYX0RXT1JEICZlbGFwc2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0RnJlcXVlbmN5KEZYX0RXT1JEIGVsYXBzZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0JPT0wJCSAgRHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgY2xhc3MgQ0ZXTF9DYXJldFRpbWVyIDogcHVibGljIENGWF9PYmplY3QNCisgICAgew0KKyAgICBwdWJsaWM6DQorICAgICAgICBDRldMX0NhcmV0VGltZXIoQ0ZXTF9DYXJldEltcCAqbV9wQ2FyZXQpOw0KKyAgICAgICAgdmlydHVhbCBGWF9JTlQzMiBSdW4oRldMX0hUSU1FUiBoVGltZXIpOw0KKyAgICAgICAgQ0ZXTF9DYXJldEltcCAqbV9wQ2FyZXQ7DQorDQorICAgIH07DQorICAgIENGV0xfQ2FyZXRUaW1lciAqbV9wVGltZXI7DQorICAgIEZXTF9IVElNRVIJCW1faFRpbWVyOw0KKyAgICBGWF9EV09SRAkJbV9kd0VsYXBzZTsNCisgICAgQ0ZYX0NvbG9yCQltX2NyRmlsbDsNCisgICAgRlhfQk9PTAkJCW1fYlNldENvbG9yOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9DYXJldEltcERlbGVnYXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9DYXJldFRpbWVyOw0KKw0KK307DQorY2xhc3MgQ0ZXTF9DYXJldEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0NhcmV0SW1wRGVsZWdhdGUoQ0ZXTF9DYXJldEltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9DYXJldEltcCAqbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jaGVja2JveGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2hlY2tib3hpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTUzOGYzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2hlY2tib3hpbXAuaApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DSEVDS0JPWF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9DSEVDS0JPWF9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfQ2hlY2tCb3hJbXA7DQorY2xhc3MgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3hJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXANCit7DQorcHVibGljOg0KKyAgICBDRldMX0NoZWNrQm94SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgQ0ZXTF9DaGVja0JveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgfkNGV0xfQ2hlY2tCb3hJbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENoZWNrU3RhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRDaGVja1N0YXRlKEZYX0lOVDMyIGlDaGVjayk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQlMYXlvdXQoKTsNCisgICAgRlhfRFdPUkQJR2V0UGFydFN0YXRlcygpOw0KKyAgICB2b2lkCQlVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICAgIHZvaWQJCU5leHRTdGF0ZXMoKTsNCisgICAgQ0ZYX1JlY3RGCW1fcnRDbGllbnQ7DQorICAgIENGWF9SZWN0RgltX3J0Qm94Ow0KKyAgICBDRlhfUmVjdEYJbV9ydENhcHRpb247DQorICAgIENGWF9SZWN0RgltX3J0Rm9jdXM7DQorICAgIEZYX0RXT1JECW1fZHdUVE9TdHlsZXM7DQorICAgIEZYX0lOVDMyCW1faVRUT0FsaWduOw0KKyAgICBGWF9CT09MCQltX2JCdG5Eb3duOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGUoQ0ZXTF9DaGVja0JveEltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlPbkFjdGl2YXRlKENGV0xfTWVzc2FnZSAqcE1zZyk7DQorICAgIHZvaWQJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICBDRldMX0NoZWNrQm94SW1wICptX3BPd25lcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NvbWJvYm94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MGVmMzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oCkBAIC0wLDAgKzEsMjI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DT01CT0JPWF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9DT01CT0JPWF9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRWRpdEltcDsNCitjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0xpc3RCb3hJbXA7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXA7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9Db21ib0VkaXQ7DQorY2xhc3MgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0NvbWJvTGlzdDsNCitjbGFzcyBDRldMX0NvbWJvTGlzdERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ29tYm9Cb3hJbXA7DQorY2xhc3MgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ29tYm9FZGl0IDogcHVibGljIENGV0xfRWRpdEltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQ29tYm9FZGl0KElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KKyAgICBDRldMX0NvbWJvRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisNCisgICAgdm9pZAlDbGVhclNlbGVjdGVkKCk7DQorICAgIHZvaWQJU2V0U2VsZWN0ZWQoKTsNCisgICAgdm9pZAlFbmRDYXJldCgpOw0KKyAgICB2b2lkCUZsYWdGb2N1cyhGWF9CT09MIGJTZXQpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlTZXRDb21ib0JveEZvY3VzKEZYX0JPT0wgYlNldCk7DQorICAgIENGV0xfQ29tYm9Cb3hJbXAJKm1fcE91dGVyOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENGV0xfQ29tYm9FZGl0RGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0NvbWJvRWRpdERlbGVnYXRlKENGV0xfQ29tYm9FZGl0ICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorcHJvdGVjdGVkOg0KKyAgICBDRldMX0NvbWJvRWRpdCAqbV9wT3duZXI7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvTGlzdCA6IHB1YmxpYyBDRldMX0xpc3RCb3hJbXANCit7DQorcHVibGljOg0KKyAgICBDRldMX0NvbWJvTGlzdChJRldMX1dpZGdldCAqcE91dGVyKTsNCisgICAgQ0ZXTF9Db21ib0xpc3QoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICAgIEZYX0lOVDMyCU1hdGNoSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NNYXRjaCk7DQorICAgIHZvaWQJCUNoYW5nZVNlbGVjdGVkKEZYX0lOVDMyIGlTZWwpOw0KKyAgICBGWF9JTlQzMglDb3VudEl0ZW1zKCk7DQorICAgIHZvaWQJCUdldEl0ZW1SZWN0KEZYX0lOVDMyIG5JbmRleCwgQ0ZYX1JlY3RGICZydEl0ZW0pOw0KKyAgICB2b2lkCQlDbGllbnRUb091dGVyKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCisgICAgdm9pZAkJU2V0Rm9jdXMoRlhfQk9PTCBiU2V0KTsNCisgICAgRlhfQk9PTAkJbV9iTm90aWZ5T3duZXI7DQorICAgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvTGlzdERlbGVnYXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0JveEltcDsNCit9Ow0KK2NsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0NvbWJvTGlzdERlbGVnYXRlKENGV0xfQ29tYm9MaXN0ICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQlPbkRyb3BMaXN0Rm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICAgIEZYX0lOVDMyCU9uRHJvcExpc3RNb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIEZYX0lOVDMyCU9uRHJvcExpc3RMQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgRlhfSU5UMzIJT25Ecm9wTGlzdExCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgRlhfSU5UMzIJT25Ecm9wTGlzdEtleShDRldMX01zZ0tleSAqcEtleSk7DQorICAgIHZvaWQJCU9uRHJvcExpc3RLZXlEb3duKENGV0xfTXNnS2V5ICpwS2V5KTsNCisgICAgQ0ZXTF9Db21ib0xpc3QgKm1fcE93bmVyOw0KK307DQorY2xhc3MgQ0ZXTF9Db21ib0JveEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQ29tYm9Cb3hJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX0NvbWJvQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0NvbWJvQm94SW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lUHJvdmlkZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldEN1clNlbCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldEN1clNlbChGWF9JTlQzMiBpU2VsKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0lOVDMyIG5TdGFydCA9IDAsIEZYX0lOVDMyIG5Db3VudCA9IC0xKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRFZGl0U2VsUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgPSAtMSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0RWRpdFNlbFJhbmdlKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgJm5TdGFydCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0RWRpdExpbWl0KCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRWRpdERvQ2xpcGJvYXJkKEZYX0lOVDMyIGlDbWQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRSZWRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRVbmRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICB2aXJ0dWFsIElGV0xfTGlzdEJveCogIEdldExpc3RCb3h0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCk7DQorICAgIHZpcnR1YWwgRlhfRVJSCU9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRDYW5VbmRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdENhblJlZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlFZGl0VW5kbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRSZWRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdENhbkNvcHkoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlFZGl0Q2FuQ3V0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdENhblNlbGVjdEFsbCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlFZGl0UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRTZWxlY3RBbGwoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlFZGl0RGVsZXRlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdERlU2VsZWN0KCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCURyYXdTdHJldGNoSGFuZGxlcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0ZMT0FUCUdldExpc3RIZWlnaHQoKTsNCisgICAgdm9pZAkJU2hvd0Ryb3BMaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgICAgRlhfQk9PTAkJSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgICBGWF9CT09MCQlJc0Ryb3BEb3duU3R5bGUoKSBjb25zdDsNCisgICAgdm9pZAkJTWF0Y2hFZGl0VGV4dCgpOw0KKyAgICB2b2lkCQlTeW5jaHJFZGl0VGV4dChGWF9JTlQzMiBpTGlzdEl0ZW0pOw0KKyAgICB2b2lkCQlMYXlvdXQoKTsNCisgICAgdm9pZAkJUmVTZXRUaGVtZSgpOw0KKyAgICB2b2lkCQlSZVNldEVkaXRBbGlnbm1lbnQoKTsNCisgICAgdm9pZAkJUmVTZXRMaXN0SXRlbUFsaWdubWVudCgpOw0KKyAgICB2b2lkCQlQcm9jZXNzU2VsQ2hhbmdlZChGWF9CT09MIGJMQnV0dG9uVXApOw0KKyAgICB2b2lkCQlJbml0UHJveHlGb3JtKCk7DQorcHJvdGVjdGVkOg0KKyAgICBGV0xfRVJSCQlEaXNGb3JtX0luaXRpYWxpemUoKTsNCisgICAgdm9pZAkJRGlzRm9ybV9Jbml0Q29tYm9MaXN0KCk7DQorICAgIHZvaWQJCURpc0Zvcm1fSW5pdENvbWJvRWRpdCgpOw0KKyAgICB2b2lkCQlEaXNGb3JtX1Nob3dEcm9wTGlzdChGWF9CT09MIGJBY3RpdmF0ZSk7DQorICAgIEZYX0JPT0wJCURpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgICBGV0xfRVJSCQlEaXNGb3JtX01vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgICBGV0xfRVJSCQlEaXNGb3JtX1VwZGF0ZSgpOw0KKyAgICBGWF9EV09SRAlEaXNGb3JtX0hpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgRldMX0VSUgkJRGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIEZXTF9FUlIJCURpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2b2lkCQlEaXNGb3JtX0xheW91dCgpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX1JlY3RGCQltX3J0Q2xpZW50Ow0KKyAgICBDRlhfUmVjdEYJCW1fcnRDb250ZW50Ow0KKyAgICBDRlhfUmVjdEYJCW1fcnRCdG47DQorICAgIENGWF9SZWN0RgkJbV9ydExpc3Q7DQorICAgIENGWF9SZWN0RgkJbV9ydFByb3h5Ow0KKyAgICBDRlhfUmVjdEYJCW1fcnRIYW5kbGVyOw0KKyAgICBJRldMX0VkaXQJCSptX3BFZGl0Ow0KKyAgICBJRldMX0xpc3RCb3gJKm1fcExpc3RCb3g7DQorICAgIElGV0xfRm9ybQkJKm1fcEZvcm07DQorICAgIEZYX0JPT0wJCQltX2JMQnV0dG9uRG93bjsNCisgICAgRlhfQk9PTAkJCW1fYlVwRm9ybUhhbmRsZXI7DQorICAgIEZYX0lOVDMyCQltX2lDdXJTZWw7DQorICAgIEZYX0lOVDMyCQltX2lCdG5TdGF0ZTsNCisgICAgRlhfRkxPQVQgICAgICAgIG1fZkNvbWJvRm9ybUhhbmRsZXI7DQorICAgIEZYX0ZMT0FUICAgICAgICBtX2ZJdGVtSGVpZ2h0Ow0KKyAgICBGWF9CT09MCQkJbV9iTmVlZFNob3dMaXN0Ow0KKyAgICBDRldMX0Zvcm1Qcm94eUltcCAqbV9wUHJveHk7DQorICAgIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlICptX3BMaXN0UHJveHlEZWxlZ2F0ZTsNCisNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0Ow0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXQ7DQorICAgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvRWRpdERlbGVnYXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUoQ0ZXTF9Db21ib0JveEltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorDQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICAgIHZvaWQJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25LZXkoQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICB2b2lkCURvU3ViQ3RybEtleShDRldMX01zZ0tleSAqcE1zZyk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9JTlQzMglEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZvaWQJCURpc0Zvcm1fT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAkJRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgICB2b2lkCQlEaXNGb3JtX09uS2V5KENGV0xfTXNnS2V5ICpwTXNnKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGV0xfQ29tYm9Cb3hJbXAgKm1fcE93bmVyOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGUoSUZXTF9Gb3JtICpwRm9ybSwgQ0ZXTF9Db21ib0JveEltcCAqcENvbWJvQm94KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCVJlc2V0KCkNCisgICAgew0KKyAgICAgICAgbV9iTEJ1dHRvblVwU2VsZiA9IEZBTFNFOw0KKyAgICB9DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCU9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQgICAgT25EZWFjdGl2ZShDRldMX01zZ0RlYWN0aXZhdGUgKnBNc2cpOw0KKyAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTXNnS2lsbEZvY3VzICpwTXNnLCBGWF9CT09MIGJTZXQgKTsNCisgICAgRlhfQk9PTAkJCW1fYkxCdXR0b25Eb3duOw0KKyAgICBGWF9CT09MCQkJbV9iTEJ1dHRvblVwU2VsZjsNCisgICAgRlhfRkxPQVQJCW1fZlN0YXJ0UG9zOw0KKyAgICBJRldMX0Zvcm0JCQkqbV9wRm9ybTsNCisgICAgQ0ZXTF9Db21ib0JveEltcCAgICAqbV9wQ29tYm9Cb3g7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9kYXRldGltZXBpY2tlcmltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhkYjZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaApAQCAtMCwwICsxLDIwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfREFURVRJTUVQSUNLRVJfSU1QX0gNCisjZGVmaW5lIF9GV0xfREFURVRJTUVQSUNLRVJfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0VkaXRJbXA7DQorY2xhc3MgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wOw0KK2NsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRm9ybVByb3h5SW1wOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVFZGl0Ow0KK2NsYXNzIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVGb3JtIDogcHVibGljIElGV0xfRm9ybQ0KK3sNCitwdWJsaWM6DQorICAgIEZXTF9FUlIJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCit9Ow0KK2NsYXNzIElGV0xfRGF0ZVRpbWVDYWxlbmRlciA6IHB1YmxpYyBJRldMX01vbnRoQ2FsZW5kYXINCit7DQorcHVibGljOg0KKyAgICBGV0xfRVJSCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorfTsNCitjbGFzcyBJRldMX0RhdGVUaW1lRWRpdCA6IHB1YmxpYyBJRldMX0VkaXQNCit7DQorcHVibGljOg0KKyAgICBGV0xfRVJSCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorfTsNCitjbGFzcyBDRldMX0RhdGVUaW1lRWRpdCA6IHB1YmxpYyBDRldMX0VkaXRJbXANCit7DQorcHVibGljOg0KKyAgICBDRldMX0RhdGVUaW1lRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX0VkaXRJbXBEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGUoQ0ZXTF9EYXRlVGltZUVkaXQgKnBPd25lcik7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMglEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorDQorcHJvdGVjdGVkOg0KKyAgICBDRldMX0RhdGVUaW1lRWRpdAkqbV9wT3duZXI7DQorfTsNCitjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXIgOiBwdWJsaWMgQ0ZXTF9Nb250aENhbGVuZGFySW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcik7DQorICAgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KK3Byb3RlY3RlZDoNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZShDRldMX0RhdGVUaW1lQ2FsZW5kYXIgKnBPd25lcik7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdm9pZCBPbkxCdXR0b25Eb3duRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQgT25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZCBPbk1vdXNlTW92ZUV4KENGV0xfTXNnTW91c2UgKnBNc2cpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyCURpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdm9pZAkJRGlzRm9ybV9PbkxCdXR0b25VcEV4KENGV0xfTXNnTW91c2UgKnBNc2cpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyCSptX3BPd25lcjsNCisgICAgRlhfQk9PTCBtX2JGbGFnOw0KK307DQorY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0RhdGVUaW1lUGlja2VySW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUUCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q3VyU2VsKEZYX0lOVDMyICZpWWVhciwgRlhfSU5UMzIgJmlNb250aCwgRlhfSU5UMzIgJmlEYXkpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldEN1clNlbChGWF9JTlQzMiBpWWVhciwgRlhfSU5UMzIgaU1vbnRoLCBGWF9JTlQzMiBpRGF5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQgPSAwLCBGWF9JTlQzMiBuQ291bnQgPSAtMSkgY29uc3Q7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5SZWRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5Db3B5KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VsZWN0QWxsKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVTZWxlY3QoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRCQm94KENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJTW9kaWZ5RWRpdFN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK3B1YmxpYzoNCisgICAgSUZXTF9EYXRlVGltZUVkaXQqCUdldERhdGFUaW1lRWRpdCgpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlEcmF3RHJvcERvd25CdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAlGb3JtYXREYXRlU3RyaW5nKEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXksIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICB2b2lkCVNob3dNb250aENhbGVuZGFyKEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgICAgRlhfQk9PTAlJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKTsNCisgICAgdm9pZAlSZVNldEVkaXRBbGlnbm1lbnQoKTsNCisgICAgdm9pZAlJbml0UHJveHlGb3JtKCk7DQorICAgIHZvaWQJUHJvY2Vzc1NlbENoYW5nZWQoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSk7DQorcHJpdmF0ZToNCisgICAgRldMX0VSUgkJRGlzRm9ybV9Jbml0aWFsaXplKCk7DQorICAgIHZvaWQJCURpc0Zvcm1fSW5pdERhdGVUaW1lQ2FsZW5kYXIoKTsNCisgICAgdm9pZAkJRGlzRm9ybV9Jbml0RGF0ZVRpbWVFZGl0KCk7DQorICAgIEZYX0JPT0wJCURpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQorICAgIHZvaWQJCURpc0Zvcm1fU2hvd01vbnRoQ2FsZW5kYXIoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgICBGWF9EV09SRAlEaXNGb3JtX0hpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgRlhfQk9PTAkJRGlzRm9ybV9Jc05lZWRTaG93QnV0dG9uKCk7DQorICAgIEZXTF9FUlIJCURpc0Zvcm1fVXBkYXRlKCk7DQorICAgIEZXTF9FUlIJCURpc0Zvcm1fR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICBGV0xfRVJSCQlEaXNGb3JtX0dldEJCb3goQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgRldMX0VSUgkJRGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKw0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydEJ0bjsNCisgICAgQ0ZYX1JlY3RGCQkJCW1fcnRDbGllbnQ7DQorICAgIEZYX0lOVDMyCQkJCW1faUJ0blN0YXRlOw0KKyAgICBGWF9JTlQzMgkJCQltX2lZZWFyOw0KKyAgICBGWF9JTlQzMgkJCQltX2lNb250aDsNCisgICAgRlhfSU5UMzIJCQkJbV9pRGF5Ow0KKyAgICBGWF9CT09MCQkJCQltX2JMQnRuRG93bjsNCisgICAgSUZXTF9EYXRlVGltZUVkaXQgICAgIAkqbV9wRWRpdDsNCisgICAgSUZXTF9EYXRlVGltZUNhbGVuZGVyCSptX3BNb250aENhbDsNCisgICAgSUZXTF9EYXRlVGltZUZvcm0JCSptX3BGb3JtOw0KKyAgICBGWF9GTE9BVAkJCQltX2ZCdG47DQorICAgIGNsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcERQIDogcHVibGljIElGV0xfTW9udGhDYWxlbmRhckRQDQorICAgIHsNCisgICAgcHVibGljOg0KKyAgICAgICAgQ0ZXTF9Nb250aENhbGVuZGFySW1wRFAoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1faUN1clllYXIgPSAyMDEwOw0KKyAgICAgICAgICAgIG1faUN1ck1vbnRoID0gMzsNCisgICAgICAgICAgICBtX2lDdXJEYXkgPSAyOTsNCisgICAgICAgIH0NCisgICAgICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgIH0NCisgICAgICAgIHZpcnR1YWwgRlhfSU5UMzIgICAgCUdldEN1ckRheShJRldMX1dpZGdldCAqcFdpZGdldCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9pQ3VyRGF5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0Q3VyTW9udGgoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIG1faUN1ck1vbnRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0Q3VyWWVhcihJRldMX1dpZGdldCAqcFdpZGdldCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbV9pQ3VyWWVhcjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyCW1faUN1ckRheTsNCisgICAgICAgIEZYX0lOVDMyCW1faUN1clllYXI7DQorICAgICAgICBGWF9JTlQzMgltX2lDdXJNb250aDsNCisgICAgfTsNCisNCisgICAgQ0ZXTF9Nb250aENhbGVuZGFySW1wRFAgbV9Nb250aENhbGVuZGFyRFA7DQorICAgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU7DQorICAgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZShDRldMX0RhdGVUaW1lUGlja2VySW1wICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICAgIHZvaWQJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorDQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKm1fcE93bmVyOw0KK3ByaXZhdGU6DQorICAgIHZvaWQJCURpc0Zvcm1fT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2VkaXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2VkaXRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY3MWU2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oCkBAIC0wLDAgKzEsMTY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9FRElUX0lNUF9IDQorI2RlZmluZSBfRldMX0VESVRfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcDsNCitjbGFzcyBJRldMX0NhcmV0Ow0KK2NsYXNzIElGV0xfQWRhcHRlclRleHRGaWVsZDsNCitjbGFzcyBDRldMX0VkaXRJbXA7DQorY2xhc3MgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9FZGl0SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wLCBwdWJsaWMgSUZERV9UeHRFZHRFdmVudFNpbmsNCit7DQorcHVibGljOg0KKyAgICBDRldMX0VkaXRJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX0VkaXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIH5DRldMX0VkaXRJbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lUHJvdmlkZXIpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgblN0YXJ0ID0gMCwgRlhfSU5UMzIgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUNsZWFyVGV4dCgpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldENhcmV0UG9zKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJU2V0Q2FyZXRQb3MoRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUgPSBUUlVFKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlBZGRTZWxSYW5nZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCA9IC0xKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglDb3VudFNlbFJhbmdlcygpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldFNlbFJhbmdlKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgJm5TdGFydCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJQ2xlYXJTZWxlY3Rpb25zKCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0TGltaXQoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRMaW1pdChGWF9JTlQzMiBuTGltaXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb3JtYXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluc2VydChGWF9JTlQzMiBuU3RhcnQsIEZYX0xQQ1dTVFIgbHBUZXh0LCBGWF9JTlQzMiBuTGVuKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEZWxldGVTZWxlY3Rpb25zKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRGVsZXRlUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQgPSAtMSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVJlcGxhY2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuTGVuLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRG9DbGlwYm9hcmQoRlhfSU5UMzIgaUNtZCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVkbyhGWF9CU1RSIGJzUmVjb3JkKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlVbmRvKEZYX0JTVFIgYnNSZWNvcmQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuVW5kbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblJlZG8oKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXROdW1iZXJSYW5nZShGWF9JTlQzMiBpTWluLCBGWF9JTlQzMiBpTWF4KTsNCisgICAgdmlydHVhbCB2b2lkCQlPbl9DYXJldENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBGWF9JTlQzMiBuUGFnZSwgRlhfQk9PTCBiVmlzaWJsZSA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPICZDaGFuZ2VJbmZvKTsNCisgICAgdmlydHVhbCB2b2lkCQlPbl9QYWdlQ291bnRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCkge30NCisgICAgdmlydHVhbCB2b2lkCQlPbl9TZWxDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25fUGFnZUxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBGWF9JTlQzMiBuUGFnZUluZGV4LCBGWF9JTlQzMiBuUHVycG9zZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25fUGFnZVVubG9hZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIEZYX0lOVDMyIG5QYWdlSW5kZXgsIEZYX0lOVDMyIG5QdXJwb3NlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbl9QYWdlQ2hhbmdlKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRlhfQk9PTCBiUGFnZVVwID0gVFJVRSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQlPbl9BZGREb1JlY29yZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIEZYX0JTVFIgYnNEb1JlY29yZCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25fVmFsaWRhdGVGaWVsZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIEZYX0lOVDMyIG5CbG9ja0luZGV4LCBGWF9JTlQzMiBuRmllbGRJbmRleCwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGRUZXh0LCBGWF9JTlQzMiBuQ2hhckluZGV4KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbl9WYWxpZGF0ZUJsb2NrKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgRlhfSU5UMzIgbkJsb2NrSW5kZXgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIEZYX0lOVDMyIG5CbG9ja0luZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja1RleHQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uX1ZhbGlkYXRlKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgICAgIFNldEJhY2tncm91bmRDb2xvcihGWF9EV09SRCBjb2xvcik7DQorICAgIHZpcnR1YWwgRldMX0VSUiAgICAgU2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb250LCBGWF9GTE9BVCBmU2l6ZSk7DQorICAgIHZvaWQJCQkJU2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpOw0KKyAgICBGWF9CT09MCQkJCUdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmc1N1Z2dlc3QpOw0KKyAgICBGWF9CT09MCQkJCVJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwgRlhfQlNUUiBic1JlcGxhY2UpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJCQlEcmF3VGV4dEJrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCQkJCURyYXdDb250ZW50KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCQkJCVVwZGF0ZUVkaXRFbmdpbmUoKTsNCisgICAgdm9pZAkJCQlVcGRhdGVFZGl0UGFyYW1zKCk7DQorICAgIHZvaWQJCQkJVXBkYXRlRWRpdExheW91dCgpOw0KKyAgICBGWF9CT09MCQkJCVVwZGF0ZU9mZnNldCgpOw0KKyAgICBGWF9CT09MCQkJCVVwZGF0ZU9mZnNldChJRldMX1Njcm9sbEJhciAqcFNjcm9sbEJhciwgRlhfRkxPQVQgZlBvc0NoYW5nZWQpOw0KKyAgICB2b2lkCQkJCVVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgICAgdm9pZAkJCQlVcGRhdGVDYXJldCgpOw0KKyAgICBJRldMX1Njcm9sbEJhcioJCVVwZGF0ZVNjcm9sbCgpOw0KKyAgICB2b2lkCQkJCUxheW91dCgpOw0KKyAgICB2b2lkCQkJCUxheW91dFNjcm9sbEJhcigpOw0KKyAgICB2b2lkCQkJCURldmljZVRvRW5naW5lKENGWF9Qb2ludEYgJnB0KTsNCisgICAgdm9pZAkJCQlJbml0U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCisgICAgdm9pZAkJCQlJbml0RW5naW5lKCk7DQorICAgIHZpcnR1YWwJdm9pZAkJU2hvd0NhcmV0KEZYX0JPT0wgYlZpc2libGUsIENGWF9SZWN0RiAqcFJlY3QgPSBOVUxMKTsNCisgICAgRlhfQk9PTAkJCQlWYWxpZGF0ZU51bWJlckNoYXIoRlhfV0NIQVIgY051bSk7DQorICAgIHZvaWQJCQkJSW5pdENhcmV0KCk7DQorICAgIHZvaWQJCQkJQ2xlYXJSZWNvcmQoKTsNCisgICAgRlhfQk9PTAkJCQlJc1Nob3dTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCk7DQorICAgIEZYX0JPT0wJCQkJSXNDb250ZW50SGVpZ2h0T3ZlcmZsb3coKTsNCisgICAgRlhfSU5UMzIJCQlBZGREb1JlY29yZChGWF9CU1RSIGJzRG9SZWNvcmQpOw0KKyAgICB2b2lkCQkJCVByb2Nlc3NJbnNlcnRFcnJvcihGWF9JTlQzMiBpRXJyb3IpOw0KKw0KKyAgICB2b2lkCQkJCURyYXdTcGVsbENoZWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJCQkJQWRkU3BlbGxDaGVja09iaihDRlhfUGF0aCYgUGF0aERhdGEsIEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50LCBGWF9GTE9BVCBmT2ZmU2V0WCwgRlhfRkxPQVQgZk9mZlNldFkpOw0KKyAgICBGWF9JTlQzMgkJCUdldFdvcmRBdFBvaW50KENGWF9Qb2ludEYgcG9pbnRmLCBGWF9JTlQzMiYgbkNvdW50KTsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydENsaWVudDsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydEVuZ2luZTsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydFN0YXRpYzsNCisgICAgRlhfRkxPQVQJCQltX2ZWQWxpZ25PZmZzZXQ7DQorICAgIEZYX0ZMT0FUCQkJbV9mU2Nyb2xsT2Zmc2V0WDsNCisgICAgRlhfRkxPQVQJCQltX2ZTY3JvbGxPZmZzZXRZOw0KKyAgICBJRkRFX1R4dEVkdEVuZ2luZSoJbV9wRWR0RW5naW5lOw0KKyAgICBGWF9CT09MCQkJCW1fYkxCdXR0b25Eb3duOw0KKyAgICBGWF9JTlQzMgkJCW1fblNlbFN0YXJ0Ow0KKyAgICBGWF9JTlQzMgkJCW1fbkxpbWl0Ow0KKyAgICBGWF9GTE9BVAkJCW1fZlNwYWNlQWJvdmU7DQorICAgIEZYX0ZMT0FUCQkJbV9mU3BhY2VCZWxvdzsNCisgICAgRlhfRkxPQVQJCQltX2ZGb250U2l6ZTsNCisgICAgRlhfQVJHQgkJCQltX2FyZ2JTZWw7DQorICAgIEZYX0JPT0wgICAgICAgICAgICAgbV9iU2V0UmFuZ2U7DQorICAgIEZYX0lOVDMyCQkJbV9pTWluOw0KKyAgICBGWF9JTlQzMgkJCW1faU1heDsNCisgICAgSUZXTF9TY3JvbGxCYXIqCQltX3BWZXJ0U2Nyb2xsQmFyOw0KKyAgICBJRldMX1Njcm9sbEJhcioJCW1fcEhvcnpTY3JvbGxCYXI7DQorICAgIElGV0xfQ2FyZXQqCQkJbV9wQ2FyZXQ7DQorICAgIElGV0xfQWRhcHRlclRleHRGaWVsZCoJbV9wVGV4dEZpZWxkOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NDYWNoZTsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfVHh0RWR0RXZlbnRTaW5rOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU7DQorICAgIEZYX0RXT1JEICAgICAgICAgICAgbV9iYWNrQ29sb3I7DQorICAgIEZYX0JPT0wgICAgICAgICAgICAgbV91cGRhdGVCYWNrQ29sb3I7DQorICAgIENGWF9XaWRlU3RyaW5nICAgICAgbV93c0ZvbnQ7DQorICAgIENGWF9CeXRlU3RyaW5nQXJyYXkgbV9SZWNvcmRBcnI7DQorICAgIEZYX0lOVDMyCQkJbV9pQ3VyUmVjb3JkOw0KKyAgICBGWF9JTlQzMgkJCW1faU1heFJlY29yZDsNCit9Ow0KK2NsYXNzIENGV0xfRWRpdEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0VkaXRJbXBEZWxlZ2F0ZShDRldMX0VkaXRJbXAgKnBPd25lcik7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZCAgICBEb0FjdGl2YXRlKENGV0xfTXNnQWN0aXZhdGUgKnBNc2cpOw0KKyAgICB2b2lkICAgIERvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUgKnBNc2cpOw0KKyAgICB2b2lkCURvQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgICB2b2lkCU9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25CdXR0b25EYmxDbGsoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25LZXlEb3duKENGV0xfTXNnS2V5ICpwTXNnKTsNCisgICAgdm9pZAlPbkNoYXIoQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICBGWF9CT09MCU9uU2Nyb2xsKElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyLCBGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpOw0KKyAgICB2b2lkICAgIERvQ3Vyc29yKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICBDRldMX0VkaXRJbXAgKm1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZm9ybXByb3h5aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWY3ZWI5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZm9ybXByb3h5aW1wLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfRk9STVBST1hZX0lNUF9IDQorI2RlZmluZSBfRldMX0ZPUk1QUk9YWV9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRm9ybUltcDsNCitjbGFzcyBDRldMX0Zvcm1Qcm94eUltcDsNCitjbGFzcyBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRm9ybVByb3h5SW1wIDogcHVibGljIENGV0xfRm9ybUltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRm9ybVByb3h5SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KKyAgICBDRldMX0Zvcm1Qcm94eUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KKyAgICB+Q0ZXTF9Gb3JtUHJveHlJbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlKENGV0xfRm9ybVByb3h5SW1wICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorcHJvdGVjdGVkOg0KKyAgICBDRldMX0Zvcm1Qcm94eUltcAkqbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNjA1OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2xpc3Rib3hpbXAuaApAQCAtMCwwICsxLDk4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9MSVNUQk9YX0lNUF9IDQorI2RlZmluZSBfRldMX0xJU1RCT1hfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcDsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX0xpc3RCb3hJbXA7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9MaXN0Qm94SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgQ0ZXTF9MaXN0Qm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB+Q0ZXTF9MaXN0Qm94SW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglDb3VudFNlbEl0ZW1zKCk7DQorICAgIHZpcnR1YWwgRldMX0hMSVNUSVRFTQlHZXRTZWxJdGVtKEZYX0lOVDMyIG5JbmRleFNlbCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0U2VsSW5kZXgoRlhfSU5UMzIgbkluZGV4KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFNjcm9sbFBvcyhGWF9GTE9BVCAmZlBvcywgRlhfQk9PTCBiVmVydCA9IFRSVUUpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIqCVNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSk7DQorcHJvdGVjdGVkOg0KKyAgICBGV0xfSExJU1RJVEVNIEdldEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdLZXlDb2RlKTsNCisgICAgdm9pZAkJU2V0U2VsZWN0aW9uKEZXTF9ITElTVElURU0gaFN0YXJ0LCBGV0xfSExJU1RJVEVNIGhFbmQsIEZYX0JPT0wgYlNlbGVjdGVkKTsNCisgICAgdm9pZAkJU2V0U2VsZWN0aW9uRGlyZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCk7DQorICAgIEZYX0JPT0wJCUlzSXRlbVNlbGVjdGVkKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICB2b2lkCQlDbGVhclNlbGVjdGlvbigpOw0KKyAgICB2b2lkCQlTZWxlY3RBbGwoKTsNCisgICAgRldMX0hMSVNUSVRFTSBHZXRGb2N1c2VkSXRlbSgpOw0KKyAgICB2b2lkCQlTZXRGb2N1c0l0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIEZXTF9ITElTVElURU0JR2V0SXRlbUF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgRlhfQk9PTAkJCUdldEl0ZW1DaGVja1JlY3QoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGICZydENoZWNrKTsNCisgICAgRlhfQk9PTAkJCVNldEl0ZW1DaGVja2VkKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYkNoZWNrZWQpOw0KKyAgICBGWF9CT09MCQkJR2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIEZYX0JPT0wJCVNjcm9sbFRvVmlzaWJsZShGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdm9pZAkJRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCQlEcmF3SXRlbXMoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJCURyYXdJdGVtKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfSU5UMzIgSW5kZXgsIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJCURyYXdTdGF0aWMoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lKTsNCisgICAgQ0ZYX1NpemVGCUNhbGNTaXplKEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2b2lkCQlHZXRJdGVtU2l6ZShDRlhfU2l6ZUYgJnNpemUsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIEZYX0ZMT0FUCUdldE1heFRleHRXaWR0aCgpOw0KKyAgICBGWF9GTE9BVAlHZXRTY3JvbGxXaWR0aCgpOw0KKyAgICBGWF9GTE9BVAlHZXRJdGVtSGVpZ3QoKTsNCisgICAgdm9pZAkJSW5pdFNjcm9sbEJhcihGWF9CT09MIGJWZXJ0ID0gVFJVRSk7DQorICAgIHZvaWQJCVNvcnRJdGVtKCk7DQorICAgIEZYX0JPT0wJCUlzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KTsNCisgICAgdm9pZAkJUHJvY2Vzc1NlbENoYW5nZWQoKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9SZWN0RgkJCW1fcnRDbGllbnQ7DQorICAgIENGWF9SZWN0RgkJCW1fcnRTdGF0aWM7DQorICAgIENGWF9SZWN0RgkJCW1fcnRDb25lbnQ7DQorICAgIElGV0xfU2Nyb2xsQmFyKgkJbV9wSG9yelNjcm9sbEJhcjsNCisgICAgSUZXTF9TY3JvbGxCYXIqCQltX3BWZXJ0U2Nyb2xsQmFyOw0KKyAgICBGWF9EV09SRAkJCW1fZHdUVE9TdHlsZXM7DQorICAgIEZYX0lOVDMyCQkJbV9pVFRPQWxpZ25zOw0KKyAgICBGV0xfSExJU1RJVEVNCQltX2hBbmNob3I7DQorICAgIEZYX0ZMT0FUCQkJbV9mSXRlbUhlaWdodDsNCisgICAgRlhfRkxPQVQJCQltX2ZTY29ybGxCYXJXaWR0aDsNCisgICAgRlhfQk9PTAkJCQltX2JMQnV0dG9uRG93bjsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICptX3BTY3JvbGxCYXJUUDsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfTGlzdEJveEltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfTGlzdEJveEltcERlbGVnYXRlKENGV0xfTGlzdEJveEltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICAgIHZvaWQJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbk1vdXNlV2hlZWwoQ0ZXTF9Nc2dNb3VzZVdoZWVsICpwTXNnKTsNCisgICAgdm9pZAlPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICB2b2lkCU9uVksoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOw0KKyAgICBGWF9CT09MCU9uU2Nyb2xsKElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyLCBGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpOw0KKyAgICB2b2lkCURpc3BhdGNoU2VsQ2hhbmdlZEV2KCk7DQorICAgIENGV0xfTGlzdEJveEltcAkqbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0ZGE1OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaApAQCAtMCwwICsxLDIwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTU9OVEhDQUxFTkRBUl9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9NT05USENBTEVOREFSX0lNUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZERV9EYXRlVGltZTsNCitjbGFzcyBDRkRFX0RhdGVUaW1lOw0KK2V4dGVybiBGWF9CWVRFIEZYX0RheXNJbk1vbnRoKEZYX0lOVDMyIGlZZWFyLCBGWF9CWVRFIGlNb250aCk7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wOw0KK2NsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfTW9udGhDYWxlbmRhckltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIENGV0xfTW9udGhDYWxlbmRhckltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgfkNGV0xfTW9udGhDYWxlbmRhckltcCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJQ291bnRTZWxlY3QoKTsNCisgICAgdmlydHVhbAlGWF9CT09MCQlHZXRTZWxlY3QoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSwgRlhfSU5UMzIgbkluZGV4ID0gMCk7DQorICAgIHZpcnR1YWwJRlhfQk9PTAkJU2V0U2VsZWN0KEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQJCURyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd0xCdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd1JCdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd1NlcGVyYXRvcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICB2b2lkCQlEcmF3RGF0ZXNJbkJLKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQJCURyYXdXZWVrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQJCURyYXdXZWVrTnVtYmVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQJCURyYXdXZWVrTnVtYmVyU2VwKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQJCURyYXdUb2RheShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICB2b2lkCQlEcmF3RGF0ZXNJbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICB2b2lkCQlEcmF3RGF0ZXNPdXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd0RhdGVzSW5DaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd1RvZGF5Q2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIENGWF9TaXplRglDYWxjU2l6ZShGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgICAgdm9pZAkJTGF5T3V0KCk7DQorICAgIHZvaWQJCUNhbGNIZWFkU2l6ZSgpOw0KKyAgICB2b2lkCQlDYWxjVG9kYXlTaXplKCk7DQorICAgIHZvaWQJCUNhbERhdGVJdGVtKCk7DQorICAgIHZvaWQJCUdldENhcFZhbHVlKCk7DQorICAgIEZYX0lOVDMyCUNhbFdlZWtOdW1iZXIoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSk7DQorDQorICAgIEZYX0JPT0wJCUdldE1pbkRhdGUoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSk7DQorICAgIEZYX0JPT0wJCVNldE1pbkRhdGUoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSk7DQorICAgIEZYX0JPT0wJCUdldE1heERhdGUoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSk7DQorICAgIEZYX0JPT0wJCVNldE1heERhdGUoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSk7DQorICAgIEZYX0JPT0wgICAgIEluaXREYXRlKCk7DQorICAgIHZvaWQJCUNsZWFyRGF0ZUl0ZW0oKTsNCisgICAgdm9pZAkJUmVTZXREYXRlSXRlbSgpOw0KKyAgICBGWF9CT09MCQlOZXh0TW9udGgoKTsNCisgICAgRlhfQk9PTAkJUHJldk1vbnRoKCk7DQorICAgIHZvaWQJCUNoYW5nZVRvTW9udGgoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCk7DQorICAgIEZYX0JPT0wJCVJlbW92ZVNlbERheShGWF9JTlQzMiBpRGF5LCBGWF9CT09MIGJBbGwgPSBGQUxTRSk7DQorICAgIEZYX0JPT0wJCUFkZFNlbERheShGWF9JTlQzMiBpRGF5KTsNCisgICAgRlhfQk9PTAkJSnVtcFRvVG9kYXkoKTsNCisgICAgdm9pZAkJR2V0SGVhZFRleHQoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgQ0ZYX1dpZGVTdHJpbmcgJndzSGVhZCk7DQorICAgIHZvaWQJCUdldFRvZGF5VGV4dChGWF9JTlQzMiBpWWVhciwgRlhfSU5UMzIgaU1vbnRoLCBGWF9JTlQzMiBpRGF5LCBDRlhfV2lkZVN0cmluZyAmd3NUb2RheSk7DQorICAgIEZYX0lOVDMyCUdldERheUF0UG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQorICAgIEZYX0JPT0wJCUdldERheVJlY3QoRlhfSU5UMzIgaURheSwgQ0ZYX1JlY3RGICZydERheSk7DQorICAgIHR5cGVkZWYgc3RydWN0IF9EQVRFIHsNCisgICAgICAgIF9EQVRFKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpWWVhciA9IDA7DQorICAgICAgICAgICAgaU1vbnRoID0gMDsNCisgICAgICAgICAgICBpRGF5ID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIF9EQVRFKEZYX0lOVDMyIHllYXIsIEZYX0lOVDMyIG1vbnRoLCBGWF9JTlQzMiBkYXkpIDogaVllYXIoeWVhciksIGlNb250aChtb250aCksIGlEYXkoZGF5KSB7fQ0KKyAgICAgICAgRlhfQk9PTCBvcGVyYXRvciA8IChjb25zdCBfREFURSAmcmlnaHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGlZZWFyIDwgcmlnaHQuaVllYXIpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpWWVhciA9PSByaWdodC5pWWVhcikgew0KKyAgICAgICAgICAgICAgICBpZiAoaU1vbnRoIDwgcmlnaHQuaU1vbnRoKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpTW9udGggPT0gcmlnaHQuaU1vbnRoKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaURheSA8IHJpZ2h0LmlEYXk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBvcGVyYXRvciA+IChjb25zdCBfREFURSAmcmlnaHQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGlZZWFyID4gcmlnaHQuaVllYXIpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpWWVhciA9PSByaWdodC5pWWVhcikgew0KKyAgICAgICAgICAgICAgICBpZiAoaU1vbnRoID4gcmlnaHQuaU1vbnRoKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpTW9udGggPT0gcmlnaHQuaU1vbnRoKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaURheSA+IHJpZ2h0LmlEYXk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaVllYXI7DQorICAgICAgICBGWF9JTlQzMiBpTW9udGg7DQorICAgICAgICBGWF9JTlQzMiBpRGF5Ow0KKw0KKyAgICB9IERBVEUsICpMUERBVEU7DQorICAgIEZYX0JPT0wJCQkJbV9iSW5pdDsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydEhlYWQ7DQorICAgIENGWF9SZWN0RgkJCW1fcnRXZWVrOw0KKyAgICBDRlhfUmVjdEYJCQltX3J0TEJ0bjsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydFJCdG47DQorICAgIENGWF9SZWN0RgkJCW1fcnREYXRlczsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydEhTZXA7DQorICAgIENGWF9SZWN0RgkJCW1fcnRIZWFkVGV4dDsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydFRvZGF5Ow0KKyAgICBDRlhfUmVjdEYJCQltX3J0VG9kYXlGbGFnOw0KKyAgICBDRlhfUmVjdEYJCQltX3J0V2Vla051bTsNCisgICAgQ0ZYX1JlY3RGCQkJbV9ydFdlZWtOdW1TZXA7DQorICAgIENGWF9SZWN0RgkJCW1fcnRUZW1wOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJbV93c0hlYWQ7DQorICAgIENGWF9XaWRlU3RyaW5nCQltX3dzVG9kYXk7DQorICAgIENGWF9EYXRlVGltZQkJKm1fcERhdGVUaW1lOw0KKyAgICBDRlhfUHRyQXJyYXkJCW1fYXJyRGF0ZXM7DQorICAgIEZYX0lOVDMyCQkJbV9pQ3VyWWVhcjsNCisgICAgRlhfSU5UMzIJCQltX2lDdXJNb250aDsNCisgICAgRlhfSU5UMzIJCQltX2lZZWFyOw0KKyAgICBGWF9JTlQzMgkJCW1faU1vbnRoOw0KKyAgICBGWF9JTlQzMgkJCW1faURheTsNCisgICAgRlhfSU5UMzIJCQltX2lIb3ZlcmVkOw0KKyAgICBGWF9JTlQzMgkJCW1faUxCdG5QYXJ0U3RhdGVzOw0KKyAgICBGWF9JTlQzMgkJCW1faVJCdG5QYXJ0U3RhdGVzOw0KKyAgICBEQVRFCQkJCW1fZHRNaW47DQorICAgIERBVEUJCQkJbV9kdE1heDsNCisgICAgQ0ZYX1NpemVGCQkJbV9zekhlYWQ7DQorICAgIENGWF9TaXplRgkJCW1fc3pDZWxsOw0KKyAgICBDRlhfU2l6ZUYJCQltX3N6VG9kYXk7DQorICAgIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfSU5UMzI+CUNGV0xfSW50MzJBcnJheTsNCisgICAgQ0ZXTF9JbnQzMkFycmF5CQltX2FyclNlbERheXM7DQorICAgIEZYX0lOVDMyCQkJbV9pTWF4U2VsOw0KKyAgICBDRlhfUmVjdEYJCQltX3J0Q2xpZW50Ow0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkV2lkOw0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkSGVpOw0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkQnRuV2lkOw0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkQnRuSGVpOw0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkQnRuSE1hcmdpbjsNCisgICAgRlhfRkxPQVQgbV9mSGVhZEJ0blZNYXJnaW47DQorICAgIEZYX0ZMT0FUIG1fZkhlYWRUZXh0V2lkOw0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkVGV4dEhlaTsNCisgICAgRlhfRkxPQVQgbV9mSGVhZFRleHRITWFyZ2luOw0KKyAgICBGWF9GTE9BVCBtX2ZIZWFkVGV4dFZNYXJnaW47DQorICAgIEZYX0ZMT0FUIG1fZkhTZXBXaWQ7DQorICAgIEZYX0ZMT0FUIG1fZkhTZXBIZWk7DQorDQorICAgIEZYX0ZMT0FUIG1fZldlZWtOdW1XaWQ7DQorICAgIEZYX0ZMT0FUIG1fZlNlcERPZmZzZXQ7DQorICAgIEZYX0ZMT0FUIG1fZlNlcFg7DQorICAgIEZYX0ZMT0FUIG1fZlNlcFk7DQorDQorICAgIEZYX0ZMT0FUIG1fZldlZWtOdW1IZWlnaDsNCisgICAgRlhfRkxPQVQgbV9mV2Vla1dpZDsNCisgICAgRlhfRkxPQVQgbV9mV2Vla0hlaTsNCisgICAgRlhfRkxPQVQgbV9mRGF0ZUNlbGxXaWQ7DQorICAgIEZYX0ZMT0FUIG1fZkRhdGVDZWxsSGVpOw0KKw0KKyAgICBGWF9GTE9BVCBtX2ZUb2RheVdpZDsNCisgICAgRlhfRkxPQVQgbV9mVG9kYXlIZWk7DQorICAgIEZYX0ZMT0FUIG1fZlRvZGF5RmxhZ1dpZDsNCisNCisgICAgRlhfRkxPQVQgbV9mTUNXaWQ7DQorICAgIEZYX0ZMT0FUIG1fZk1DSGVpOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU7DQorfTsNCit0eXBlZGVmIHN0cnVjdCBfREFURUlORk8gew0KKyAgICBfREFURUlORk8oRlhfSU5UMzIgZGF5LCBGWF9JTlQzMiBkYXlvZndlZWssIEZYX0RXT1JEIGR3U3QsIENGWF9SZWN0RiByYywgQ0ZYX1dpZGVTdHJpbmcgJndzZGF5KSA6IGlEYXkoZGF5KSwgaURheU9mV2VlayhkYXlvZndlZWspLCBkd1N0YXRlcyhkd1N0KSwgcmVjdChyYyksIHdzRGF5KHdzZGF5KSB7fQ0KKyAgICBGWF9JTlQzMiBpRGF5Ow0KKyAgICBGWF9JTlQzMiBpRGF5T2ZXZWVrOw0KKyAgICBGWF9EV09SRCBkd1N0YXRlczsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KK30gREFURUlORk8sICpMUERBVEVJTkZPOw0KK2NsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCit7DQorcHVibGljOg0KKyAgICBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZShDRldMX01vbnRoQ2FsZW5kYXJJbXAgKnBPd25lcik7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCU9uQWN0aXZhdGUoQ0ZXTF9NZXNzYWdlICpwTXNnKTsNCisgICAgdm9pZAkJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgdm9pZAkJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAkJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCQlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIENGV0xfTW9udGhDYWxlbmRhckltcAkqbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZWJlYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3BpY3R1cmVib3hpbXAuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QSUNUVVJFQk9YX0lNUF9IDQorI2RlZmluZSBfRldMX1BJQ1RVUkVCT1hfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hJbXA7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9QaWN0dXJlQm94SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgQ0ZXTF9QaWN0dXJlQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB+Q0ZXTF9QaWN0dXJlQm94SW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCURyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgRlhfQk9PTCAgICAgVlN0eWxlKEZYX0JPT0wgZHdTdHlsZSk7DQorICAgIENGWF9SZWN0RgkJbV9ydENsaWVudDsNCisgICAgQ0ZYX1JlY3RGCQltX3J0SW1hZ2U7DQorICAgIENGWF9NYXRyaXgJCW1fbWF0cml4Ow0KKyAgICBGWF9CT09MICAgICAgICAgbV9iVG9wOw0KKyAgICBGWF9CT09MICAgICAgICAgbV9iVkNlbnRlcjsNCisgICAgRlhfQk9PTCAgICAgICAgIG1fYkJ1dHRvbjsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKENGV0xfUGljdHVyZUJveEltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGV0xfUGljdHVyZUJveEltcCAqbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4OGRhOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3B1c2hidXR0b25pbXAuaApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QVVNIQlVUVE9OX0lNUF9IDQorI2RlZmluZSBfRldMX1BVU0hCVVRUT05fSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1B1c2hCdXR0b25JbXA7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9QdXNoQnV0dG9uSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgQ0ZXTF9QdXNoQnV0dG9uSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b25JbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQlEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAkJRHJhd1RleHQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgRlhfRFdPUkQJR2V0UGFydFN0YXRlcygpOw0KKyAgICB2b2lkCQlVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICAgIENGWF9SZWN0RgltX3J0Q2xpZW50Ow0KKyAgICBDRlhfUmVjdEYJbV9ydENhcHRpb247DQorICAgIEZYX0JPT0wJCW1fYkJ0bkRvd247DQorICAgIEZYX0RXT1JECW1fZHdUVE9TdHlsZXM7DQorICAgIEZYX0lOVDMyCW1faVRUT0FsaWduOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9QdXNoQnV0dG9uSW1wICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICBDRldMX1B1c2hCdXR0b25JbXAgKm1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA3M2I1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NDUk9MTEJBUl9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9TQ1JPTExCQVJfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX1RpbWVyOw0KK2NsYXNzIElGV0xfVGltZXJEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcDsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFySW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wLCBwdWJsaWMgSUZXTF9UaW1lcg0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfU2Nyb2xsQmFySW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgQ0ZXTF9TY3JvbGxCYXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIH5DRldMX1Njcm9sbEJhckltcCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSICAgICBGaW5hbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWZXJ0aWNhbCgpIDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRSYW5nZShGWF9GTE9BVCAmZk1pbiwgRlhfRkxPQVQgJmZNYXgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCUdldFBhZ2VTaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKTsNCisgICAgdmlydHVhbCBGWF9GTE9BVAlHZXRTdGVwU2l6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSk7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJR2V0UG9zKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UG9zKEZYX0ZMT0FUIGZQb3MpOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCUdldFRyYWNrUG9zKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MgPSAwLjBmKTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKTsNCisgICAgdmlydHVhbAlGWF9JTlQzMglSdW4oRldMX0hUSU1FUiBoVGltZXIpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJRHJhd1RyYWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRlhfQk9PTCBiTG93ZXIgPSBUUlVFLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJCURyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIEZYX0JPT0wgYk1pbkJ0biA9IFRSVUUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAkJRHJhd1RodW1iKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCQlMYXlvdXQoKTsNCisgICAgdm9pZAkJQ2FsY0J1dHRvbkxlbigpOw0KKyAgICB2b2lkCQlDYWxjTWluQnV0dG9uUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2b2lkCQlDYWxjTWF4QnV0dG9uUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2b2lkCQlDYWxjVGh1bWJCdXR0b25SZWN0KENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZvaWQJCUNhbGNNaW5UcmFja1JlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZAkJQ2FsY01heFRyYWNrUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KKw0KKyAgICBGWF9GTE9BVAlHZXRUcmFja1BvaW50UG9zKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZvaWQJCUdldFRyYWNrUmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkxvd2VyID0gVFJVRSk7DQorICAgIEZYX0JPT0wJCVNlbmRFdmVudCgpOw0KKyAgICBGWF9CT09MCQlPblNjcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpOw0KKyAgICBGV0xfSFRJTUVSCQkJCW1faFRpbWVyOw0KKyAgICBGWF9GTE9BVAkJCQltX2ZSYW5nZU1pbjsNCisgICAgRlhfRkxPQVQJCQkJbV9mUmFuZ2VNYXg7DQorICAgIEZYX0ZMT0FUCQkJCW1fZlBhZ2VTaXplOw0KKyAgICBGWF9GTE9BVAkJCQltX2ZTdGVwU2l6ZTsNCisgICAgRlhfRkxPQVQJCQkJbV9mUG9zOw0KKyAgICBGWF9GTE9BVAkJCQltX2ZUcmFja1BvczsNCisgICAgRlhfSU5UMzIJCQkJbV9pTWluQnV0dG9uU3RhdGU7DQorICAgIEZYX0lOVDMyCQkJCW1faU1heEJ1dHRvblN0YXRlOw0KKyAgICBGWF9JTlQzMgkJCQltX2lUaHVtYkJ1dHRvblN0YXRlOw0KKyAgICBGWF9JTlQzMgkJCQltX2lNaW5UcmFja1N0YXRlOw0KKyAgICBGWF9JTlQzMgkJCQltX2lNYXhUcmFja1N0YXRlOw0KKyAgICBGWF9GTE9BVAkJCQltX2ZMYXN0VHJhY2tQb3M7DQorICAgIEZYX0ZMT0FUCQkJCW1fY3BUcmFja1BvaW50WDsNCisgICAgRlhfRkxPQVQJCQkJbV9jcFRyYWNrUG9pbnRZOw0KKyAgICBGWF9JTlQzMgkJCQltX2lNb3VzZVdoZWVsOw0KKyAgICBGWF9CT09MCQkJCQltX2JUcmFja01vdXNlTGVhdmU7DQorICAgIEZYX0JPT0wJCQkJCW1fYk1vdXNlSG92ZXI7DQorICAgIEZYX0JPT0wJCQkJCW1fYk1vdXNlRG93bjsNCisgICAgRlhfQk9PTAkJCQkJbV9iUmVwYWludFRodW1iOw0KKw0KKyAgICBGWF9GTE9BVAkJCQltX2ZCdXR0b25MZW47DQorICAgIEZYX0JPT0wJCQkJCW1fYk1pblNpemU7DQorICAgIENGWF9SZWN0RgkJCQltX3J0Q2xpZW50Ow0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydFRodW1iOw0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydE1pbkJ0bjsNCisgICAgQ0ZYX1JlY3RGCQkJCW1fcnRNYXhCdG47DQorICAgIENGWF9SZWN0RgkJCQltX3J0TWluVHJhY2s7DQorICAgIENGWF9SZWN0RgkJCQltX3J0TWF4VHJhY2s7DQorICAgIEZYX0JPT0wJCQkJCW1fYkN1c3RvbUxheW91dDsNCisgICAgRlhfRkxPQVQJCQkJbV9mTWluVGh1bWI7DQorICAgIGZyaWVuZCBjbGFzcyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZShDRldMX1Njcm9sbEJhckltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQlPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQlPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQlPbk1vdXNlTGVhdmUoKTsNCisgICAgdm9pZAkJT25Nb3VzZVdoZWVsKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSwgRlhfRFdPUkQJZHdGbGFncywgRlhfRkxPQVQgZkRlbHRhWCwgRlhfRkxPQVQJZkRlbHRhWSk7DQorICAgIHZvaWQJCURvTW91c2VEb3duKEZYX0lOVDMyIGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgRlhfSU5UMzIgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdm9pZAkJRG9Nb3VzZVVwKEZYX0lOVDMyIGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgRlhfSU5UMzIgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdm9pZAkJRG9Nb3VzZU1vdmUoRlhfSU5UMzIgaUl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBGWF9JTlQzMiAmaVN0YXRlLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQlEb01vdXNlTGVhdmUoRlhfSU5UMzIgaUl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBGWF9JTlQzMiAmaVN0YXRlKTsNCisgICAgdm9pZAkJRG9Nb3VzZUhvdmVyKEZYX0lOVDMyIGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgRlhfSU5UMzIgJmlTdGF0ZSk7DQorDQorICAgIENGV0xfU2Nyb2xsQmFySW1wICptX3BPd25lcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc1YTQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc3BpbmJ1dHRvbmltcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NQSU5CVVRUT05fSU1QX0gNCisjZGVmaW5lIF9GV0xfU1BJTkJVVFRPTl9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfVGltZXI7DQorY2xhc3MgQ0ZXTF9TcGluQnV0dG9uSW1wOw0KK2NsYXNzIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfU3BpbkJ1dHRvbkltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGV0xfVGltZXINCit7DQorcHVibGljOg0KKyAgICBDRldMX1NwaW5CdXR0b25JbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX1NwaW5CdXR0b25JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIH5DRldMX1NwaW5CdXR0b25JbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JEICAgIEdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkgICAgVXBkYXRlKCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglSdW4oRldMX0hUSU1FUiBoVGltZXIpOw0KKyAgICBGV0xfRVJSCQlFbmFibGVCdXR0b24oRlhfQk9PTCBiRW5hYmxlLCBGWF9CT09MIGJVcCA9IFRSVUUpOw0KKyAgICBGWF9CT09MCQlJc0J1dHRvbkVuYWJsZShGWF9CT09MIGJVcCA9IFRSVUUpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZCAgICAgICAgRHJhd1VwQnV0dG9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIHZvaWQgICAgICAgIERyYXdEb3duQnV0dG9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIENGWF9SZWN0RgltX3J0Q2xpZW50Ow0KKyAgICBDRlhfUmVjdEYJbV9ydFVwQnV0dG9uOw0KKyAgICBDRlhfUmVjdEYJbV9ydERuQnV0dG9uOw0KKyAgICBGWF9EV09SRCAgICBtX2R3VXBTdGF0ZTsNCisgICAgRlhfRFdPUkQgICAgbV9kd0RuU3RhdGU7DQorICAgIEZYX0lOVDMyCW1faUJ1dHRvbkluZGV4Ow0KKyAgICBGWF9CT09MICAgICBtX2JMQnV0dG9uRHduOw0KKyAgICBGV0xfSFRJTUVSCW1faFRpbWVyOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9TcGluQnV0dG9uSW1wICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICBDRldMX1NwaW5CdXR0b25JbXAgKm1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfdG9vbHRpcGN0cmxpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxN2YzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfVG9vbFRpcF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9Ub29sVGlwX0lNUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9UaW1lcjsNCitjbGFzcyBDRldMX1Rvb2xUaXBJbXA7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wIDogcHVibGljIENGV0xfRm9ybUltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfVG9vbFRpcEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIENGV0xfVG9vbFRpcEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9Ub29sVGlwSW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCApOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgRldMX0VSUgkJU2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IpOw0KKyAgICBGV0xfRVJSCQlTaG93KCk7DQorICAgIEZXTF9FUlIJCUhpZGUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCURyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICB2b2lkCQlEcmF3VGV4dChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KKyAgICB2b2lkCQlVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICAgIHZvaWQJCVJlZnJlc2hUb29sVGlwUG9zKCk7DQorICAgIGNsYXNzIENGV0xfVG9vbFRpcFRpbWVyIDogcHVibGljIElGV0xfVGltZXINCisgICAgew0KKyAgICBwdWJsaWM6DQorICAgICAgICBDRldMX1Rvb2xUaXBUaW1lcigpIHt9Ow0KKyAgICAgICAgfkNGV0xfVG9vbFRpcFRpbWVyKCkge307DQorICAgICAgICBDRldMX1Rvb2xUaXBUaW1lcihDRldMX1Rvb2xUaXBJbXAgKiBwVG9vbFRpcCk7DQorICAgICAgICB2aXJ0dWFsIEZYX0lOVDMyIFJ1bihGV0xfSFRJTUVSIGhUaW1lcik7DQorICAgICAgICBDRldMX1Rvb2xUaXBJbXAgKm1fcFRvb2xUaXA7DQorICAgIH07DQorICAgIENGWF9SZWN0RgltX3J0Q2xpZW50Ow0KKyAgICBDRlhfUmVjdEYJbV9ydENhcHRpb247DQorICAgIEZYX0JPT0wJCW1fYkJ0bkRvd247DQorICAgIEZYX0RXT1JECW1fZHdUVE9TdHlsZXM7DQorICAgIEZYX0lOVDMyCW1faVRUT0FsaWduOw0KKyAgICBDRlhfUmVjdEYJbV9ydEFuY2hvcjsNCisgICAgRldMX0hUSU1FUgltX2hUaW1lclNob3c7DQorICAgIEZXTF9IVElNRVIJbV9oVGltZXJIaWRlOw0KKyAgICBDRldMX1Rvb2xUaXBUaW1lcioJbV9wVGltZXI7DQorICAgIENGV0xfVG9vbFRpcFRpbWVyCW1fVGltZXJTaG93Ow0KKyAgICBDRldMX1Rvb2xUaXBUaW1lcgltX1RpbWVySGlkZTsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfVG9vbFRpcEltcERlbGVnYXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Ub29sVGlwVGltZXI7DQorfTsNCitjbGFzcyBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUoQ0ZXTF9Ub29sVGlwSW1wICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbktleURvd24oQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KKyAgICBDRldMX1Rvb2xUaXBJbXAgKm1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z4bWF0aF9iYXJjb2RlaW1wLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWE1BVEhfQkFSQ09ERUlNUF9IXw0KKyNkZWZpbmUgX0ZYTUFUSF9CQVJDT0RFSU1QX0hfDQorY2xhc3MgQ0ZYX0JhcmNvZGUgOiBwdWJsaWMgSUZYX0JhcmNvZGUsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX0JhcmNvZGUoKTsNCisgICAgfkNGWF9CYXJjb2RlKCk7DQorICAgIEZYX0JPT0wJCQkJCUNycmVhdGUoQkNfVFlQRSB0eXBlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIEJDX1RZUEUJCQlHZXRUeXBlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCURlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyICZlcnJvckNvZGUpOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlcnJvckNvZGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRDaGFyRW5jb2RpbmcoQkNfQ0hBUl9FTkNPRElORyBlbmNvZGluZyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldE1vZHVsZUhlaWdodChGWF9JTlQzMiBtb2R1bGVIZWlnaHQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRNb2R1bGVXaWR0aChGWF9JTlQzMiBtb2R1bGVXaWR0aCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEhlaWdodChGWF9JTlQzMiBoZWlnaHQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWR0aChGWF9JTlQzMiB3aWR0aCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXREYXRhTGVuZ3RoKEZYX0lOVDMyIGxlbmd0aCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldENhbENoZWNrc3VtKEZYX0lOVDMyIHN0YXRlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udChDRlhfRm9udCogcEZvbnQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udFN0eWxlKEZYX0lOVDMyIHN0eWxlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWRlTmFycm93UmF0aW8oRlhfSU5UMzIgcmF0aW8pOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEVuZENoYXIoRlhfQ0hBUiBlbmQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRWZXJzaW9uKEZYX0lOVDMyIHZlcnNpb24pOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChGWF9JTlQzMiBsZXZlbCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCk7DQorcHJvdGVjdGVkOg0KKyAgICBDQkNfQ29kZUJhc2UqCW1fcEJDRW5naW5lOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfYXBwaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU0NmU2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorSUZXTF9BcHAqIElGV0xfQXBwOjpDcmVhdGUoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlcikNCit7DQorICAgIHJldHVybiAoSUZXTF9BcHAqKSBGWF9ORVcgQ0ZXTF9BcHBJbXAocEFkYXB0ZXIpOw0KK30NCitDRldMX0FwcEltcDo6Q0ZXTF9BcHBJbXAoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlcikNCisgICAgOiBtX3BXaWRnZXRNZ3IoTlVMTCkNCisgICAgLCBtX3BUaGVtZVByb3ZpZGVyKE5VTEwpDQorew0KKyAgICBpZiAoIXBBZGFwdGVyKSB7DQorICAgICAgICBwQWRhcHRlciA9IEZXTF9DcmVhdGVGdWVsQWRhcHRlck5hdGl2ZSgpOw0KKyAgICAgICAgbV9iRnVlbEFkYXB0ZXIgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9iRnVlbEFkYXB0ZXIgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BBZGFwdGVyTmF0aXZlID0gcEFkYXB0ZXI7DQorfQ0KK0NGV0xfQXBwSW1wOjp+Q0ZXTF9BcHBJbXAoKQ0KK3sNCisgICAgZGVsZXRlIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKTsNCisgICAgaWYgKG1fYkZ1ZWxBZGFwdGVyKSB7DQorICAgICAgICBGV0xfUmVsZWFzZUZ1ZWxBZGFwdGVyTmF0aXZlKG1fcEFkYXB0ZXJOYXRpdmUpOw0KKyAgICAgICAgbV9wQWRhcHRlck5hdGl2ZSA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcFdpZGdldE1ncikgew0KKyAgICAgICAgZGVsZXRlIG1fcFdpZGdldE1ncjsNCisgICAgICAgIG1fcFdpZGdldE1nciA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBDRldMX0FwcEltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBpZiAoIW1fcFdpZGdldE1ncikgew0KKyAgICAgICAgbV9wV2lkZ2V0TWdyID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdyKG1fcEFkYXB0ZXJOYXRpdmUpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0FwcEltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1ncikgew0KKyAgICAgICAgZGVsZXRlIG1fcFdpZGdldE1ncjsNCisgICAgICAgIG1fcFdpZGdldE1nciA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX0FkYXB0ZXJOYXRpdmUqIENGV0xfQXBwSW1wOjpHZXRBZGFwdGVyTmF0aXZlKCkNCit7DQorICAgIHJldHVybiBtX3BBZGFwdGVyTmF0aXZlOw0KK30NCitJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCkpLT5HZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQorfQ0KK0lGV0xfV2lkZ2V0TWdyKglDRldMX0FwcEltcDo6R2V0V2lkZ2V0TWdyKCkNCit7DQorICAgIHJldHVybiAoSUZXTF9XaWRnZXRNZ3IqKW1fcFdpZGdldE1ncjsNCit9DQorRldMX0VSUiBDRldMX0FwcEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKQ0KK3sNCisgICAgbV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9BcHBJbXA6OkV4aXQoRlhfSU5UMzIgaUV4aXRDb2RlICkNCit7DQorICAgIHdoaWxlIChtX3BOb3RlRHJpdmVyLT5Qb3BOb3RlTG9vcCgpKTsNCisgICAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpLT5FeGl0KDApOw0KK30NCitJRldMX1RoZW1lUHJvdmlkZXIqCUNGV0xfQXBwSW1wOjpHZXRUaGVtZVByb3ZpZGVyKCkNCit7DQorICAgIHJldHVybiBtX3BUaGVtZVByb3ZpZGVyOw0KK30NCitJRldMX0FkYXB0ZXJOYXRpdmUqCUZXTF9HZXRBZGFwdGVyTmF0aXZlKCkNCit7DQorICAgIElGV0xfQXBwKiBwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBcHAsIE5VTEwpOw0KKyAgICByZXR1cm4gcEFwcC0+R2V0QWRhcHRlck5hdGl2ZSgpOw0KK30NCitJRldMX1RoZW1lUHJvdmlkZXIqCUZXTF9HZXRUaGVtZVByb3ZpZGVyKCkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgSUZXTF9BcHAgKl90aGVBcHAgPSBOVUxMOw0KK0lGV0xfQXBwKiBGV0xfR2V0QXBwKCkNCit7DQorICAgIHJldHVybiBfdGhlQXBwOw0KK30NCit2b2lkIEZXTF9TZXRBcHAoSUZXTF9BcHAgKnBBcHApDQorew0KKyAgICBfdGhlQXBwID0gcEFwcDsNCit9DQorRldMX0VSUiBGV0xfU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBOb3RlVHJlYWQgPSBwV2lkZ2V0LT5HZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBOb3RlVHJlYWQsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCisgICAgQ0ZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBOb3RlVHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTm90ZVRyZWFkLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICAgIHBOb3RlRHJpdmVyLT5Ob3RpZnlGdWxsU2NyZWVuTW9kZShwV2lkZ2V0LCBiRnVsbFNjcmVlbik7DQorICAgIHJldHVybiBGV0xfR2V0QWRhcHRlcldpZGdldE1ncigpLT5TZXRGdWxsU2NyZWVuKHBXaWRnZXQsIGJGdWxsU2NyZWVuKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2NvbnRlbnRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2NvbnRlbnRpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTNhZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfY29udGVudGltcC5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfY29udGVudGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCitJRldMX0NvbnRlbnQqIElGV0xfQ29udGVudDo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBuZXcgSUZXTF9Db250ZW50Ow0KK30NCitGV0xfRVJSIElGV0xfQ29udGVudDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ29udGVudEltcDsNCisgICAgKChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6Okluc2VydFdpZGdldChJRldMX1dpZGdldCAqcENoaWxkLCBGWF9JTlQzMiBuSW5kZXggKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+SW5zZXJ0V2lkZ2V0KHBDaGlsZCwgbkluZGV4KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPlJlbW92ZVdpZGdldChwV2lkZ2V0KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlJlbW92ZUFsbFdpZGdldHMoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+UmVtb3ZlQWxsV2lkZ2V0cygpOw0KK30NCitGV0xfRVJSCUlGV0xfQ29udGVudDo6R2V0TWluU2l6ZShGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCAmZkhlaWdodCkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPkdldE1pblNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCit9DQorRldMX0VSUglJRldMX0NvbnRlbnQ6OlNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+U2V0TWluU2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK30NCitGV0xfRVJSCUlGV0xfQ29udGVudDo6R2V0TWF4U2l6ZShGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCAmZkhlaWdodCkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPkdldE1heFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+U2V0TWF4U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK30NCitJRldMX0NvbnRlbnQ6OklGV0xfQ29udGVudCgpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9Db250ZW50Ojp+SUZXTF9Db250ZW50KCkNCit7DQorICAgIGlmIChtX3BEYXRhKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfQ29udGVudEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0NGV0xfQ29udGVudEltcDo6Q0ZXTF9Db250ZW50SW1wKCkNCit7DQorICAgIG1fZldpZHRoTWluID0gMDsNCisgICAgbV9mV2lkdGhNYXggPSAxMDAwMDsNCisgICAgbV9mSGVpZ2h0TWluID0gMDsNCisgICAgbV9mSGVpZ2h0TWF4ID0gMTAwMDA7DQorfQ0KK0NGV0xfQ29udGVudEltcDo6Q0ZXTF9Db250ZW50SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcykNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzKQ0KK3sNCisgICAgbV9mV2lkdGhNaW4gPSAwOw0KKyAgICBtX2ZXaWR0aE1heCA9IDEwMDAwOw0KKyAgICBtX2ZIZWlnaHRNaW4gPSAwOw0KKyAgICBtX2ZIZWlnaHRNYXggPSAxMDAwMDsNCit9DQorQ0ZXTF9Db250ZW50SW1wOjp+Q0ZXTF9Db250ZW50SW1wKCkNCit7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBDaGlsZCwgRlhfSU5UMzIgbkluZGV4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENoaWxkLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBwQ2hpbGQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KKyAgICBpZiAobkluZGV4ID09IC0xKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBwTWdyLT5TZXRXaWRnZXRJbmRleChwQ2hpbGQsIG5JbmRleCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcFdpZGdldC0+U2V0UGFyZW50KE5VTEwpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpSZW1vdmVBbGxXaWRnZXRzKCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdyICpwTWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgd2hpbGUgKElGV0xfV2lkZ2V0ICogd2lkZ2V0ID0gcE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpKSB7DQorICAgICAgICBwTWdyLT5TZXRQYXJlbnQoTlVMTCwgd2lkZ2V0KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Db250ZW50SW1wOjpHZXRNaW5TaXplKEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KQ0KK3sNCisgICAgZldpZHRoID0gbV9mV2lkdGhNaW47DQorICAgIGZIZWlnaHQgPSBtX2ZIZWlnaHRNaW47DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX0NvbnRlbnRJbXA6OlNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KQ0KK3sNCisgICAgbV9mV2lkdGhNaW4gPSBmV2lkdGg7DQorICAgIG1fZkhlaWdodE1pbiA9IGZIZWlnaHQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX0NvbnRlbnRJbXA6OkdldE1heFNpemUoRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgJmZIZWlnaHQpDQorew0KKyAgICBmV2lkdGggPSBtX2ZXaWR0aE1heDsNCisgICAgZkhlaWdodCA9IG1fZkhlaWdodE1heDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfQ29udGVudEltcDo6U2V0TWF4U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpDQorew0KKyAgICBtX2ZXaWR0aE1heCA9IGZXaWR0aDsNCisgICAgbV9mSGVpZ2h0TWF4ID0gZkhlaWdodDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZm9ybWltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZm9ybWltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5MTk5OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9mb3JtaW1wLmNwcApAQCAtMCwwICsxLDE0MzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorI2RlZmluZSBGV0xfU1lTQlROU0laRQkJMjENCisjZGVmaW5lIEZXTF9TWVNCVE5NQVJHSU4JNQ0KKyNkZWZpbmUgRldMX1NZU0JUTlNQQU4JCTINCisjZGVmaW5lIEZXTF9Db3JuZXJFbmxhcmdlCTEwDQorSUZXTF9Gb3JtKiBJRldMX0Zvcm06OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gbmV3IElGV0xfRm9ybTsNCit9DQorRldMX0VSUglJRldMX0Zvcm06OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRm9ybUltcChwT3V0ZXIpOw0KKyAgICAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfRm9ybTo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KK3sNCisgICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1JbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX0Zvcm06OkluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBDRlhfV2lkZVN0cmluZyAqY2xhc3NuYW1lLCBJRldMX1dpZGdldCAqcE91dGVyICkNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAgICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPlNldFByaXZhdGVEYXRhKHRoaXMsIGNsYXNzbmFtZSwgTlVMTCk7DQorICAgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0ZPUk1TSVpFIElGV0xfRm9ybTo6R2V0Rm9ybVNpemUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+R2V0Rm9ybVNpemUoKTsNCit9DQorRldMX0VSUglJRldMX0Zvcm06OlNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpDQorew0KKyAgICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5TZXRGb3JtU2l6ZShlRm9ybVNpemUpOw0KK30NCitJRldMX1dpZGdldCogSUZXTF9Gb3JtOjpEb01vZGFsKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkRvTW9kYWwoKTsNCit9DQorSUZXTF9XaWRnZXQqIElGV0xfRm9ybTo6RG9Nb2RhbChGWF9EV09SRCAmZHdDb21tYW5kSUQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5Eb01vZGFsKGR3Q29tbWFuZElEKTsNCit9DQorRldMX0VSUiBJRldMX0Zvcm06OkVuZERvTW9kYWwoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+RW5kRG9Nb2RhbCgpOw0KK30NCitGV0xfRVJSCUlGV0xfRm9ybTo6U2V0Qm9yZGVyUmVnaW9uKENGWF9QYXRoICpwUGF0aCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPlNldEJvcmRlclJlZ2lvbihwUGF0aCk7DQorfQ0KK0lGV0xfRm9ybTo6SUZXTF9Gb3JtKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0Zvcm06On5JRldMX0Zvcm0oKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorQ0ZXTF9Gb3JtSW1wOjpDRldMX0Zvcm1JbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9QYW5lbEltcChwT3V0ZXIpDQorICAgICwgbV9wQ2xvc2VCb3goTlVMTCkNCisgICAgLCBtX3BNaW5Cb3goTlVMTCkNCisgICAgLCBtX3BNYXhCb3goTlVMTCkNCisgICAgLCBtX3BDYXB0aW9uQm94KE5VTEwpDQorICAgICwgbV9wTm90ZUxvb3AoTlVMTCkNCisgICAgLCBtX3BTdWJGb2N1cyhOVUxMKQ0KKyAgICAsIG1fZkNYQm9yZGVyKDApDQorICAgICwgbV9mQ1lCb3JkZXIoMCkNCisgICAgLCBtX2lDYXB0dXJlQnRuKC0xKQ0KKyAgICAsIG1faVN5c0JveCgwKQ0KKyAgICAsIG1fZVJlc2l6ZVR5cGUoRk9STV9SRVNJWkVUWVBFX05vbmUpDQorICAgICwgbV9iTEJ1dHRvbkRvd24oRkFMU0UpDQorICAgICwgbV9iTWF4aW1pemVkKEZBTFNFKQ0KKyAgICAsIG1fYlNldE1heGltaXplKEZBTFNFKQ0KKyAgICAsIG1fYkN1c3RvbWl6ZUxheW91dChGQUxTRSkNCisgICAgLCBtX2VGb3JtU2l6ZShGV0xfRk9STVNJWkVfTWFudWFsKQ0KKyAgICAsIG1fYkRvTW9kYWxGbGFnKEZBTFNFKQ0KKyAgICAsIG1fcEJpZ0ljb24oTlVMTCkNCisgICAgLCBtX3BTbWFsbEljb24oTlVMTCkNCisgICAgLCBtX2JNb3VzZUluKEZBTFNFKQ0KK3sNCisgICAgbV9ydFJlbGF0aXZlLlJlc2V0KCk7DQorICAgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQorICAgIG1fcnRSZXN0b3JlLlJlc2V0KCk7DQorICAgIG1fcnRDYXB0aW9uVGV4dC5SZXNldCgpOw0KKyAgICBtX3J0SWNvbi5SZXNldCgpOw0KKyAgICBtX0luZm9TdGFydC5tX3B0U3RhcnQuUmVzZXQoKTsNCisgICAgbV9JbmZvU3RhcnQubV9zelN0YXJ0LlJlc2V0KCk7DQorfQ0KK0NGV0xfRm9ybUltcDo6Q0ZXTF9Gb3JtSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9QYW5lbEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9wQ2xvc2VCb3goTlVMTCkNCisgICAgLCBtX3BNaW5Cb3goTlVMTCkNCisgICAgLCBtX3BNYXhCb3goTlVMTCkNCisgICAgLCBtX3BDYXB0aW9uQm94KE5VTEwpDQorICAgICwgbV9wTm90ZUxvb3AoTlVMTCkNCisgICAgLCBtX3BTdWJGb2N1cyhOVUxMKQ0KKyAgICAsIG1fZkNYQm9yZGVyKDApDQorICAgICwgbV9mQ1lCb3JkZXIoMCkNCisgICAgLCBtX2lDYXB0dXJlQnRuKC0xKQ0KKyAgICAsIG1faVN5c0JveCgwKQ0KKyAgICAsIG1fZVJlc2l6ZVR5cGUoRk9STV9SRVNJWkVUWVBFX05vbmUpDQorICAgICwgbV9iTEJ1dHRvbkRvd24oRkFMU0UpDQorICAgICwgbV9iTWF4aW1pemVkKEZBTFNFKQ0KKyAgICAsIG1fYlNldE1heGltaXplKEZBTFNFKQ0KKyAgICAsIG1fYkN1c3RvbWl6ZUxheW91dChGQUxTRSkNCisgICAgLCBtX2VGb3JtU2l6ZShGV0xfRk9STVNJWkVfTWFudWFsKQ0KKyAgICAsIG1fYkRvTW9kYWxGbGFnKEZBTFNFKQ0KKyAgICAsIG1fcEJpZ0ljb24oTlVMTCkNCisgICAgLCBtX3BTbWFsbEljb24oTlVMTCkNCisgICAgLCBtX2JNb3VzZUluKEZBTFNFKQ0KK3sNCisgICAgbV9ydFJlbGF0aXZlLlJlc2V0KCk7DQorICAgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQorICAgIG1fcnRSZXN0b3JlLlJlc2V0KCk7DQorICAgIG1fcnRDYXB0aW9uVGV4dC5SZXNldCgpOw0KKyAgICBtX3J0SWNvbi5SZXNldCgpOw0KKyAgICBtX0luZm9TdGFydC5tX3B0U3RhcnQuUmVzZXQoKTsNCisgICAgbV9JbmZvU3RhcnQubV9zelN0YXJ0LlJlc2V0KCk7DQorfQ0KK0NGV0xfRm9ybUltcDo6fkNGV0xfRm9ybUltcCgpDQorew0KKyAgICBSZW1vdmVTeXNCdXR0b25zKCk7DQorICAgIGlmIChtX3BOb3RlTG9vcCkgew0KKyAgICAgICAgZGVsZXRlIG1fcE5vdGVMb29wOw0KKyAgICAgICAgbV9wTm90ZUxvb3AgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICB3c0NsYXNzID0gRldMX0NMQVNTX0Zvcm07DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Gb3JtSW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0Zvcm07DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Gb3JtSW1wOjpJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3QNCit7DQorICAgIGlmICh3c0NsYXNzID09IENGWF9XaWRlU3RyaW5nQyhGV0xfQ0xBU1NfRm9ybSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1BhbmVsSW1wOjpJc0luc3RhbmNlKHdzQ2xhc3MpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBSZWdpc3RlckZvcm0oKTsNCisgICAgUmVnaXN0ZXJFdmVudFRhcmdldCgpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfRm9ybURlbGVnYXRlKHRoaXMpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpGaW5hbGl6ZSgpDQorew0KKyAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfRm9ybURlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KKyAgICBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCisgICAgVW5SZWdpc3RlckZvcm0oKTsNCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIGlmIChiQXV0b1NpemUpIHsNCisgICAgICAgIHJlY3QuUmVzZXQoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZDYXBIZWlnaHQgPSBHZXRDYXB0aW9uSGVpZ2h0KCk7DQorICAgICAgICBGWF9GTE9BVCBmQ1hCb3JkZXIgPSBHZXRCb3JkZXJTaXplKFRSVUUpOw0KKyAgICAgICAgRlhfRkxPQVQgZkNZQm9yZGVyID0gR2V0Qm9yZGVyU2l6ZShGQUxTRSk7DQorICAgICAgICBGWF9GTE9BVCBmRWRnZSA9IEdldEVkZ2VXaWR0aCgpOw0KKyAgICAgICAgaWYgKG1fcENvbnRlbnQpIHsNCisgICAgICAgICAgICBtX3BDb250ZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVjdC5oZWlnaHQgKz0gZkNhcEhlaWdodCArIGZDWUJvcmRlciArIGZFZGdlICsgZkVkZ2U7DQorICAgICAgICByZWN0LndpZHRoICs9IGZDWEJvcmRlciArIGZDWEJvcmRlciArIGZFZGdlICsgZkVkZ2U7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Gb3JtSW1wOjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9DYXB0aW9uKSA9PSAwKSB7DQorICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgICAgIHJlY3QuT2Zmc2V0KC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgICByZWN0ID0gbV9ydFJlbGF0aXZlOw0KKyAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfQWRhcHRlcldpZGdldE1nciAqIGFkYXB0ZXJXaWRnZXRNZ3IgPSBwV2lkZ2V0TWdyLT5HZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICAgIEZYX0ZMT0FUIGwsIHQsIHIsIGI7DQorICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgICBhZGFwdGVyV2lkZ2V0TWdyLT5HZXRTeXN0ZW1Cb3JkZXIobCwgdCwgciwgYik7DQorICAgIHJlY3QuRGVmbGF0ZShsLCB0LCByLCBiKTsNCisgICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2Vsc2UNCisgICAgRlhfRkxPQVQgeCA9IDA7DQorICAgIEZYX0ZMT0FUIHkgPSAwOw0KKyAgICBGWF9GTE9BVCB0ID0gMDsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgICBpZiAocFRoZW1lKSB7DQorICAgICAgICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgICAgICAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBGWF9GTE9BVCAqIHZhbHVlID0gTlVMTDsNCisgICAgICAgIHZhbHVlID0gKEZYX0ZMT0FUICopIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlcik7DQorICAgICAgICB4ID0gKnZhbHVlOw0KKyAgICAgICAgdmFsdWUgPSAoRlhfRkxPQVQgKikgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKTsNCisgICAgICAgIHkgPSAqdmFsdWU7DQorICAgICAgICB2YWx1ZSA9IChGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0ZSTV9DWUNhcHRpb24pOw0KKyAgICAgICAgdCA9ICp2YWx1ZTsNCisgICAgfQ0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcmVjdC5PZmZzZXQoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsNCisgICAgcmVjdC5EZWZsYXRlKHgsIHQsIHgsIHkpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2VuZGlmDQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGUoKQ0KK3sNCisgICAgaWYgKG1faUxvY2sgPiAwKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorI2Vsc2UNCisgICAgU2V0VGhlbWVEYXRhKCk7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0ljb24pIHsNCisgICAgICAgIFVwZGF0ZUljb24oKTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBVcGRhdGVDYXB0aW9uKCk7DQorICAgIExheW91dCgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRm9ybUltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIGlmIChtX3BDbG9zZUJveCAmJiBtX3BDbG9zZUJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xvc2VCb3g7DQorICAgIH0NCisgICAgaWYgKG1fcE1heEJveCAmJiBtX3BNYXhCb3gtPm1fcnRCdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX01heEJveDsNCisgICAgfQ0KKyAgICBpZiAobV9wTWluQm94ICYmIG1fcE1pbkJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTWluQm94Ow0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydENhcDsNCisgICAgcnRDYXAuU2V0KG1fcnRDYXB0aW9uLmxlZnQgKyBtX2ZDWUJvcmRlciwNCisgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLnRvcCArIG1fZkNYQm9yZGVyLA0KKyAgICAgICAgICAgICAgbV9ydENhcHRpb24ud2lkdGggLSBGV0xfU1lTQlROU0laRSAqIG1faVN5c0JveCAtIDIgKiBtX2ZDWUJvcmRlciwNCisgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCAtIG1fZkNYQm9yZGVyKTsNCisgICAgaWYgKHJ0Q2FwLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9UaXRsZWJhcjsNCisgICAgfQ0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQm9yZGVyKSAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplKSkgew0KKyAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gbV9ydFJlbGF0aXZlLndpZHRoIC0gMiAqIChtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBtX3J0UmVsYXRpdmUuaGVpZ2h0IC0gMiAqIChtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgICAgIENGWF9SZWN0RiBydDsNCisgICAgICAgIHJ0LlNldCgwLCBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX2ZDWUJvcmRlciwgZkhlaWdodCk7DQorICAgICAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9MZWZ0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcnQuU2V0KG1fcnRSZWxhdGl2ZS53aWR0aCAtIG1fZkNZQm9yZGVyLCBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX2ZDWUJvcmRlciwgZkhlaWdodCk7DQorICAgICAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9SaWdodDsNCisgICAgICAgIH0NCisgICAgICAgIHJ0LlNldChtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCAwLCBmV2lkdGgsIG1fZkNYQm9yZGVyKTsNCisgICAgICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RvcDsNCisgICAgICAgIH0NCisgICAgICAgIHJ0LlNldChtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX3J0UmVsYXRpdmUuaGVpZ2h0IC0gbV9mQ1hCb3JkZXIsIGZXaWR0aCwgbV9mQ1hCb3JkZXIpOw0KKyAgICAgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQm90dG9tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcnQuU2V0KDAsIDAsIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KKyAgICAgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTGVmdFRvcDsNCisgICAgICAgIH0NCisgICAgICAgIHJ0LlNldCgwLCBtX3J0UmVsYXRpdmUuaGVpZ2h0IC0gbV9mQ1hCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwNCisgICAgICAgICAgICAgICBtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0xlZnRCb3R0b207DQorICAgICAgICB9DQorICAgICAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwgMCwNCisgICAgICAgICAgICAgICBtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1JpZ2h0VG9wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcnQuU2V0KG1fcnRSZWxhdGl2ZS53aWR0aCAtIG1fZkNZQm9yZGVyIC0gRldMX0Nvcm5lckVubGFyZ2UsDQorICAgICAgICAgICAgICAgbV9ydFJlbGF0aXZlLmhlaWdodCAtIG1fZkNYQm9yZGVyIC0gRldMX0Nvcm5lckVubGFyZ2UsDQorICAgICAgICAgICAgICAgbV9mQ1lCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwNCisgICAgICAgICAgICAgICBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1JpZ2h0Qm90dG9tOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgRlhfQk9PTCBiSW5hY3RpdmUgPSAhSXNBY3RpdmUoKTsNCisgICAgRlhfSU5UMzIgaVN0YXRlID0gYkluYWN0aXZlID8gRldMX1BBUlRTVEFURV9GUk1fSW5hY3RpdmUgOiBGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWw7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fTm9EcmF3Q2xpZW50KSA9PSAwKSB7DQorICAgICAgICBEcmF3QmFja2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSk7DQorICAgIH0NCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2VuZGlmDQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBpU3RhdGU7DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRSZWxhdGl2ZTsNCisgICAgaWYocE1hdHJpeCkgew0KKyAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpIHsNCisgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQm9yZGVyOw0KKyAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzaykgIT0gRldMX1dHVFNUWUxFX0VkZ2VOb25lKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRFZGdlOw0KKyAgICAgICAgR2V0RWRnZVJlY3QocnRFZGdlKTsNCisgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fRWRnZTsNCisgICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRFZGdlOw0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGlTdGF0ZTsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9DYXB0aW9uKSB7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0NhcHRpb247DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gaVN0YXRlOw0KKyAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIERyYXdDYXB0aW9uVGV4dChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9OYXJyb3dDYXB0aW9uKSB7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX05hcnJvd0NhcHRpb247DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gaVN0YXRlOw0KKyAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIERyYXdDYXB0aW9uVGV4dChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbikgew0KKyAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9JY29uOw0KKyAgICAgICAgaWYgKEhhc0ljb24oKSkgew0KKyAgICAgICAgICAgIERyYXdJY29uSW1hZ2UocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisgICAgew0KKyAgICAgICAgaWYgKG1fcENsb3NlQm94KSB7DQorICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DbG9zZUJveDsNCisgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wQ2xvc2VCb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSB7DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbCA9PSBwYXJhbS5tX2R3U3RhdGVzICYmIG1fYk1vdXNlSW4pIHsNCisgICAgICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0hvdmVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcENsb3NlQm94LT5tX3J0QnRuOw0KKyAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01heGltaXplQm94Ow0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSAgbV9wTWF4Qm94LT5HZXRQYXJ0U3RhdGUoKTsNCisgICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZCkgew0KKyAgICAgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fRGlzYWJsZWQ7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWwgPT0gcGFyYW0ubV9kd1N0YXRlcyAmJiBtX2JNb3VzZUluKSB7DQorICAgICAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3ZlcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BNYXhCb3gtPm1fcnRCdG47DQorICAgICAgICAgICAgcGFyYW0ubV9kd0RhdGEgPSBtX2JNYXhpbWl6ZWQ7DQorICAgICAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcE1pbkJveCkgew0KKyAgICAgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3g7DQorICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcE1pbkJveC0+R2V0UGFydFN0YXRlKCk7DQorICAgICAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQpIHsNCisgICAgICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsID09IHBhcmFtLm1fZHdTdGF0ZXMgJiYgbV9iTW91c2VJbikgew0KKyAgICAgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fSG92ZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWluQm94LT5tX3J0QnRuOw0KKyAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fYk1vdXNlSW4gPSBGQUxTRTsNCisgICAgfQ0KKyNlbHNlDQorICAgIHsNCisgICAgICAgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICAgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g7DQorICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcENsb3NlQm94LT5HZXRQYXJ0U3RhdGUoKTsNCisgICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcENsb3NlQm94LT5tX3J0QnRuOw0KKyAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01heGltaXplQm94Ow0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BNYXhCb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWF4Qm94LT5tX3J0QnRuOw0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdEYXRhID0gbV9iTWF4aW1pemVkOw0KKyAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01pbmltaXplQm94Ow0KKyAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BNaW5Cb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWluQm94LT5tX3J0QnRuOw0KKyAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyNlbmRpZg0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9GT1JNU0laRSBDRldMX0Zvcm1JbXA6OkdldEZvcm1TaXplKCkNCit7DQorICAgIHJldHVybiBtX2VGb3JtU2l6ZTsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OlNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpDQorew0KKyAgICBtX2VGb3JtU2l6ZSA9IGVGb3JtU2l6ZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9Gb3JtSW1wOjpEb01vZGFsKCkNCit7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRocmVhZCwgTlVMTCk7DQorICAgIElGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRHJpdmVyLCBOVUxMKTsNCisgICAgbV9wTm90ZUxvb3AgPSBGWF9ORVcgQ0ZXTF9Ob3RlTG9vcCh0aGlzKTsNCisgICAgcERyaXZlci0+UHVzaE5vdGVMb29wKChJRldMX05vdGVMb29wKiltX3BOb3RlTG9vcCk7DQorICAgIG1fYkRvTW9kYWxGbGFnID0gVFJVRTsNCisgICAgU2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgcERyaXZlci0+UnVuKCk7DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisjZWxzZQ0KKyAgICBwRHJpdmVyLT5Qb3BOb3RlTG9vcCgpOw0KKyNlbmRpZg0KKyAgICBkZWxldGUgbV9wTm90ZUxvb3A7DQorICAgIG1fcE5vdGVMb29wID0gTlVMTDsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX0Zvcm1JbXA6OkRvTW9kYWwoRlhfRFdPUkQgJmR3Q29tbWFuZElEKQ0KK3sNCisgICAgcmV0dXJuIERvTW9kYWwoKTsNCit9DQorRldMX0VSUglDRldMX0Zvcm1JbXA6OkVuZERvTW9kYWwoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BOb3RlTG9vcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgbV9iRG9Nb2RhbEZsYWcgPSBGQUxTRTsNCisjaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KKyAgICBtX3BOb3RlTG9vcC0+RW5kTW9kYWxMb29wKCk7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRocmVhZCwgTlVMTCk7DQorICAgIENGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRHJpdmVyLCBOVUxMKTsNCisgICAgcERyaXZlci0+UG9wTm90ZUxvb3AoKTsNCisgICAgU2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2Vsc2UNCisgICAgU2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgICByZXR1cm4gbV9wTm90ZUxvb3AtPkVuZE1vZGFsTG9vcCgpOw0KKyNlbmRpZg0KK30NCitGV0xfRVJSCUNGV0xfRm9ybUltcDo6U2V0Qm9yZGVyUmVnaW9uKENGWF9QYXRoICpwUGF0aCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkRyYXdCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSkNCit7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQmFja2dyb3VuZDsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydFJlbGF0aXZlOw0KKyAgICBwYXJhbS5tX3J0UGFydC5EZWZsYXRlKG1fZkNZQm9yZGVyLCBtX3J0Q2FwdGlvbi5oZWlnaHQsIG1fZkNZQm9yZGVyLCBtX2ZDWEJvcmRlcik7DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQorQ0ZXTF9XaWRnZXRJbXAqIENGV0xfRm9ybUltcDo6R2V0U3ViRm9jdXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFN1YkZvY3VzOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0U3ViRm9jdXMoQ0ZXTF9XaWRnZXRJbXAgKnBXaWRnZXQpDQorew0KKyAgICBtX3BTdWJGb2N1cyA9IHBXaWRnZXQ7DQorfQ0KK0NGWF9NYXBBY2NlbGVyYXRvcnMmIENGV0xfRm9ybUltcDo6R2V0QWNjZWxlcmF0b3IoKQ0KK3sNCisgICAgcmV0dXJuIG1fbWFwQWNjZWxlcmF0b3JzOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0QWNjZWxlcmF0b3IoQ0ZYX01hcEFjY2VsZXJhdG9ycyAqcEFjY2VsZXJhdG9ycykNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEFjY2VsZXJhdG9ycyk7DQorICAgIG1fbWFwQWNjZWxlcmF0b3JzLlJlbW92ZUFsbCgpOw0KKyAgICBGWF9EV09SRCB2cktleSwgclZhbHVlOw0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBwQWNjZWxlcmF0b3JzLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIHBBY2NlbGVyYXRvcnMtPkdldE5leHRBc3NvYyhwb3MsIHZyS2V5LCByVmFsdWUpOw0KKyAgICAgICAgbV9tYXBBY2NlbGVyYXRvcnMuU2V0QXQodnJLZXksIHJWYWx1ZSk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlNob3dDaGlsZFdpZGdldChJRldMX1dpZGdldCAqcFBhcmVudCkNCit7DQorICAgIElGV0xfQXBwICpwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBBcHApOw0KKyAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopcEFwcC0+R2V0V2lkZ2V0TWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFdpZGdldE1ncik7DQorICAgIElGV0xfV2lkZ2V0ICpwQ2hpbGQgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQocFBhcmVudCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBwV2lkZ2V0TWdyLT5TaG93V2lkZ2V0X05hdGl2ZShwQ2hpbGQpOw0KKyAgICAgICAgU2hvd0NoaWxkV2lkZ2V0KHBDaGlsZCk7DQorICAgICAgICBwQ2hpbGQgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQocENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpSZW1vdmVTeXNCdXR0b25zKCkNCit7DQorICAgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQorICAgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICAgICAgZGVsZXRlIG1fcENsb3NlQm94Ow0KKyAgICAgICAgbV9wQ2xvc2VCb3ggPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BNaW5Cb3g7DQorICAgICAgICBtX3BNaW5Cb3ggPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BNYXhCb3g7DQorICAgICAgICBtX3BNYXhCb3ggPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BDYXB0aW9uQm94KSB7DQorICAgICAgICBkZWxldGUgbV9wQ2FwdGlvbkJveDsNCisgICAgICAgIG1fcENhcHRpb25Cb3ggPSBOVUxMOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpDYWxjQ29udGVudFJlY3QoQ0ZYX1JlY3RGICZydENvbnRlbnQpDQorew0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICAgIHJ0Q29udGVudCA9IG1fcnRSZWxhdGl2ZTsNCisjZWxzZQ0KKyAgICBHZXRFZGdlUmVjdChydENvbnRlbnQpOw0KKyAgICBpZiAoSGFzRWRnZSgpKSB7DQorICAgICAgICBGWF9GTE9BVCBmRWRnZSA9IEdldEVkZ2VXaWR0aCgpOw0KKyAgICAgICAgcnRDb250ZW50LkRlZmxhdGUoZkVkZ2UsIGZFZGdlKTsNCisgICAgfQ0KKyNlbmRpZg0KK30NCitDRldMX1N5c0J0biogQ0ZXTF9Gb3JtSW1wOjpHZXRTeXNCdG5BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmIChtX3BDbG9zZUJveCAmJiBtX3BDbG9zZUJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gbV9wQ2xvc2VCb3g7DQorICAgIH0NCisgICAgaWYgKG1fcE1heEJveCAmJiBtX3BNYXhCb3gtPm1fcnRCdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIG1fcE1heEJveDsNCisgICAgfQ0KKyAgICBpZiAobV9wTWluQm94ICYmIG1fcE1pbkJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gbV9wTWluQm94Ow0KKyAgICB9DQorICAgIGlmIChtX3BDYXB0aW9uQm94ICYmIG1fcENhcHRpb25Cb3gtPm1fcnRCdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIG1fcENhcHRpb25Cb3g7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGV0xfU3lzQnRuKiBDRldMX0Zvcm1JbXA6OkdldFN5c0J0bkJ5U3RhdGUoRlhfRFdPUkQgZHdTdGF0ZSkNCit7DQorICAgIGlmIChtX3BDbG9zZUJveCAmJiAobV9wQ2xvc2VCb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQorICAgICAgICByZXR1cm4gbV9wQ2xvc2VCb3g7DQorICAgIH0NCisgICAgaWYgKG1fcE1heEJveCAmJiAobV9wTWF4Qm94LT5tX2R3U3RhdGUgJiBkd1N0YXRlKSkgew0KKyAgICAgICAgcmV0dXJuIG1fcE1heEJveDsNCisgICAgfQ0KKyAgICBpZiAobV9wTWluQm94ICYmIChtX3BNaW5Cb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQorICAgICAgICByZXR1cm4gbV9wTWluQm94Ow0KKyAgICB9DQorICAgIGlmIChtX3BDYXB0aW9uQm94ICYmIChtX3BDYXB0aW9uQm94LT5tX2R3U3RhdGUgJiBkd1N0YXRlKSkgew0KKyAgICAgICAgcmV0dXJuIG1fcENhcHRpb25Cb3g7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGV0xfU3lzQnRuKiBDRldMX0Zvcm1JbXA6OkdldFN5c0J0bkJ5SW5kZXgoRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheSBhcnJCdG47DQorICAgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgICAgIGFyckJ0bi5BZGQobV9wTWluQm94KTsNCisgICAgfQ0KKyAgICBpZiAobV9wTWF4Qm94KSB7DQorICAgICAgICBhcnJCdG4uQWRkKG1fcE1heEJveCk7DQorICAgIH0NCisgICAgaWYgKG1fcENsb3NlQm94KSB7DQorICAgICAgICBhcnJCdG4uQWRkKG1fcENsb3NlQm94KTsNCisgICAgfQ0KKyAgICByZXR1cm4gKENGV0xfU3lzQnRuKikgYXJyQnRuW25JbmRleF07DQorfQ0KK0ZYX0lOVDMyIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuSW5kZXgoQ0ZXTF9TeXNCdG4gKnBCdG4pDQorew0KKyAgICBDRlhfUHRyQXJyYXkgYXJyQnRuOw0KKyAgICBpZiAobV9wTWluQm94KSB7DQorICAgICAgICBhcnJCdG4uQWRkKG1fcE1pbkJveCk7DQorICAgIH0NCisgICAgaWYgKG1fcE1heEJveCkgew0KKyAgICAgICAgYXJyQnRuLkFkZChtX3BNYXhCb3gpOw0KKyAgICB9DQorICAgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICAgICAgYXJyQnRuLkFkZChtX3BDbG9zZUJveCk7DQorICAgIH0NCisgICAgcmV0dXJuIGFyckJ0bi5GaW5kKHBCdG4pOw0KK30NCitGWF9GTE9BVCBDRldMX0Zvcm1JbXA6OkdldENhcHRpb25IZWlnaHQoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdDYXBhY2l0eSA9IDA7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCisgICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbjsNCisgICAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX05hcnJvd0NhcHRpb24pIHsNCisgICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZTmFycm93Q2FwdGlvbjsNCisgICAgfQ0KKyAgICBpZiAoZHdDYXBhY2l0eSA+IDApIHsNCisgICAgICAgIEZYX0ZMT0FUICpwZkNhcEhlaWdodCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShkd0NhcGFjaXR5KTsNCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZDYXBIZWlnaHQsIDApOw0KKyAgICAgICAgcmV0dXJuICpwZkNhcEhlaWdodDsNCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkRyYXdDYXB0aW9uVGV4dChDRlhfR3JhcGhpY3MgKnBHcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBJRldMX0RhdGFQcm92aWRlciAqcERhdGEgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NUZXh0KTsNCisgICAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRldMX1RoZW1lVGV4dCB0ZXh0UGFyYW07DQorICAgIHRleHRQYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHRleHRQYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0NhcHRpb247DQorICAgIHRleHRQYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsOw0KKyAgICB0ZXh0UGFyYW0ubV9wR3JhcGhpY3MgPSBwR3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgICBpZiAobV9iQ3VzdG9taXplTGF5b3V0KSB7DQorICAgICAgICBydFRleHQgPSBtX3J0Q2FwdGlvblRleHQ7DQorICAgICAgICBydFRleHQudG9wIC09IDU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBydFRleHQgPSBtX3J0Q2FwdGlvbjsNCisgICAgICAgIEZYX0ZMT0FUIGZwb3M7DQorICAgICAgICBmcG9zID0gSGFzSWNvbigpID8gMjkuMGYgOiAxMy4wZjsNCisgICAgICAgIHJ0VGV4dC5sZWZ0ICs9IGZwb3M7DQorICAgIH0NCisgICAgdGV4dFBhcmFtLm1fcnRQYXJ0ID0gcnRUZXh0Ow0KKyAgICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c1RleHQ7DQorICAgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUgfCBGREVfVFRPU1RZTEVfRWxsaXBzaXM7DQorICAgIHRleHRQYXJhbS5tX2lUVE9BbGlnbiA9IG1fYkN1c3RvbWl6ZUxheW91dCA/IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyIDogRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KKyAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6RHJhd0ljb25JbWFnZShDRlhfR3JhcGhpY3MgKnBHcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggKQ0KK3sNCisgICAgSUZXTF9Gb3JtRFAgKnBEYXRhID0gKElGV0xfRm9ybURQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0ljb247DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdzOw0KKyAgICBwYXJhbS5tX3BJbWFnZSA9IHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRJY29uOw0KKyAgICBpZihwTWF0cml4KSB7DQorICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkdldEVkZ2VSZWN0KENGWF9SZWN0RiAmcnRFZGdlKQ0KK3sNCisgICAgcnRFZGdlID0gbV9ydFJlbGF0aXZlOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDWCA9IEdldEJvcmRlclNpemUoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZDWSA9IEdldEJvcmRlclNpemUoRkFMU0UpOw0KKyAgICAgICAgcnRFZGdlLkRlZmxhdGUoZkNYLCBtX3J0Q2FwdGlvbi5IZWlnaHQoKSwgZkNYLCBmQ1kpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRXb3JrQXJlYVJlY3QoKQ0KK3sNCisgICAgbV9ydFJlc3RvcmUgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBXaWRnZXRNZ3IpOw0KKyAgICBtX2JTZXRNYXhpbWl6ZSA9IFRSVUU7DQorICAgIHBXaWRnZXRNZ3ItPlNldE1heGltaXplX05hdGl2ZShtX3BJbnRlcmZhY2UpOw0KKyAgICBSZXBhaW50KCZtX3J0UmVsYXRpdmUpOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICAgIElGV0xfQWRhcHRlckN1cnNvck1nciAqcEN1cnNvck1nciA9IHBOYXRpdmUtPkdldEN1cnNvck1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBDdXJzb3JNZ3IpOw0KKyAgICBGWF9EV09SRCBkd0hpdFRlc3QgPSBIaXRUZXN0KGZ4LCBmeSk7DQorICAgIHN3aXRjaCAoZHdIaXRUZXN0KSB7DQorICAgICAgICBjYXNlIEZXTF9XR1RISVRURVNUX1JpZ2h0OiB7DQorICAgICAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZVdFKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RISVRURVNUX0JvdHRvbTogew0KKyAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b207DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfTGVmdDogew0KKyAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVXRSk7DQorICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9MZWZ0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RISVRURVNUX1RvcDogew0KKyAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9Ub3A7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfTGVmdFRvcDogew0KKyAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0xlZnRUb3A7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbTogew0KKyAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0xlZnRCb3R0b207DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfUmlnaHRUb3A6IHsNCisgICAgICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTkVTVyk7DQorICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9SaWdodFRvcDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9SaWdodEJvdHRvbTogew0KKyAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCisgICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfQXJyb3cpOw0KKyAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpMYXlvdXQoKQ0KK3sNCisgICAgR2V0UmVsYXRpdmVSZWN0KG1fcnRSZWxhdGl2ZSk7DQorI2lmbmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICAgIFJlU2V0U3lzQnRuKCk7DQorI2VuZGlmDQorICAgIGlmIChtX3BDb250ZW50KSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICAgICAgICBHZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCisgICAgICAgIG1fcENvbnRlbnQtPlNldFdpZGdldFJlY3QocnRDbGllbnQpOw0KKyAgICAgICAgbV9wQ29udGVudC0+VXBkYXRlKCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlJlU2V0U3lzQnRuKCkNCit7DQorICAgIG1fZkNYQm9yZGVyID0gKihGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIpOw0KKyAgICBtX2ZDWUJvcmRlciA9ICooRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKTsNCisgICAgUmVtb3ZlU3lzQnV0dG9ucygpOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIG1fYkN1c3RvbWl6ZUxheW91dCA9IHBUaGVtZS0+SXNDdXN0b21pemVkTGF5b3V0KG1fcEludGVyZmFjZSk7DQorICAgIEZYX0ZMT0FUIGZDYXBIZWlnaHQgPSBHZXRDYXB0aW9uSGVpZ2h0KCk7DQorICAgIGlmIChmQ2FwSGVpZ2h0ID4gMCkgew0KKyAgICAgICAgbV9ydENhcHRpb24gPSBtX3J0UmVsYXRpdmU7DQorICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwSGVpZ2h0Ow0KKyAgICB9DQorICAgIG1faVN5c0JveCA9IDA7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0Nsb3NlQm94KSB7DQorICAgICAgICBtX3BDbG9zZUJveCA9IEZYX05FVyBDRldMX1N5c0J0bjsNCisgICAgICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DbG9zZUJveDsNCisgICAgICAgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wQ2xvc2VCb3gtPm1fcnRCdG4pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3BDbG9zZUJveC0+bV9ydEJ0bi5TZXQobV9ydFJlbGF0aXZlLnJpZ2h0KCkgLSBGV0xfU1lTQlROTUFSR0lOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1lTQlROU0laRSk7DQorICAgICAgICB9DQorICAgICAgICBtX2lTeXNCb3ggKys7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWF4aW1pemVCb3gpIHsNCisgICAgICAgIG1fcE1heEJveCA9IEZYX05FVyBDRldMX1N5c0J0bjsNCisgICAgICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCisgICAgICAgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wTWF4Qm94LT5tX3J0QnRuKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1fcENsb3NlQm94KSB7DQorICAgICAgICAgICAgICAgIG1fcE1heEJveC0+bV9ydEJ0bi5TZXQobV9wQ2xvc2VCb3gtPm1fcnRCdG4ubGVmdCAtIEZXTF9TWVNCVE5TUEFOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2xvc2VCb3gtPm1fcnRCdG4udG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5TSVpFKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX3BNYXhCb3gtPm1fcnRCdG4uU2V0KG1fcnRSZWxhdGl2ZS5yaWdodCgpIC0gRldMX1NZU0JUTk1BUkdJTiAtIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1faVN5c0JveCArKzsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9NaW5pbWl6ZUJveCkgew0KKyAgICAgICAgbV9wTWluQm94ID0gRlhfTkVXIENGV0xfU3lzQnRuOw0KKyAgICAgICAgaWYgKG1fYkN1c3RvbWl6ZUxheW91dCkgew0KKyAgICAgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01pbmltaXplQm94Ow0KKyAgICAgICAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBhcmFtLCBtX3BNaW5Cb3gtPm1fcnRCdG4pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9wTWF4Qm94KSB7DQorICAgICAgICAgICAgICAgIG1fcE1pbkJveC0+bV9ydEJ0bi5TZXQobV9wTWF4Qm94LT5tX3J0QnRuLmxlZnQgLSBGV0xfU1lTQlROU1BBTiAtIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1heEJveC0+bV9ydEJ0bi50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wQ2xvc2VCb3gpIHsNCisgICAgICAgICAgICAgICAgbV9wTWluQm94LT5tX3J0QnRuLlNldChtX3BDbG9zZUJveC0+bV9ydEJ0bi5sZWZ0IC0gRldMX1NZU0JUTlNQQU4gLSBGV0xfU1lTQlROU0laRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbG9zZUJveC0+bV9ydEJ0bi50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcE1pbkJveC0+bV9ydEJ0bi5TZXQobV9ydFJlbGF0aXZlLnJpZ2h0KCkgLSBGV0xfU1lTQlROTUFSR0lOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTk1BUkdJTiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1lTQlROU0laRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1lTQlROU0laRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9pU3lzQm94ICsrOw0KKyAgICB9DQorICAgIElGV0xfRm9ybURQICpwRGF0YSA9IChJRldMX0Zvcm1EUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbiAmJiBwRGF0YS0+R2V0SWNvbihtX3BJbnRlcmZhY2UsIEZBTFNFKSkgew0KKyAgICAgICAgaWYgKG1fYkN1c3RvbWl6ZUxheW91dCkgew0KKyAgICAgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0ljb247DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzVGV4dCk7DQorICAgICAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZ3c1RleHQ7DQorICAgICAgICAgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcGFyYW0sIG1fcnRJY29uKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9ydEljb24uU2V0KDUsIChtX3J0Q2FwdGlvbi5oZWlnaHQgLSBtX2ZTbWFsbEljb25TeikgLyAyLCBtX2ZTbWFsbEljb25TeiwgbV9mU21hbGxJY29uU3opOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICAgIENGV0xfVGhlbWVUZXh0IHBhcm1hOw0KKyAgICAgICAgcGFybWEubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgcGFybWEubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9IZWFkVGV4dDsNCisgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHBhcm1hLm1fd3NUZXh0KTsNCisgICAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBhcm1hLCBtX3J0Q2FwdGlvblRleHQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpSZWdpc3RlckZvcm0oKQ0KK3sNCisgICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgICAgQ0ZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEcml2ZXIpOw0KKyAgICBwRHJpdmVyLT5SZWdpc3RlckZvcm0odGhpcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpVblJlZ2lzdGVyRm9ybSgpDQorew0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocERyaXZlcik7DQorICAgIHBEcml2ZXItPlVuUmVnaXN0ZXJGb3JtKHRoaXMpOw0KK30NCitGWF9CT09MIENGV0xfRm9ybUltcDo6SXNEb01vZGFsKCkNCit7DQorICAgIHJldHVybiBtX2JEb01vZGFsRmxhZzsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlNldFRoZW1lRGF0YSgpDQorew0KKyAgICBtX2ZTbWFsbEljb25TeiA9ICooRlhfRkxPQVQgKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9GUk1fU21hbGxJY29uKTsNCisgICAgbV9mQmlnSWNvblN6ID0gKihGWF9GTE9BVCAqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZSTV9CaWdJY29uKTsNCit9DQorRlhfQk9PTAlDRldMX0Zvcm1JbXA6Okhhc0ljb24oKQ0KK3sNCisgICAgSUZXTF9Gb3JtRFAgKnBEYXRhID0gKElGV0xfRm9ybURQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICByZXR1cm4gcERhdGEtPkdldEljb24obV9wSW50ZXJmYWNlLCBGQUxTRSkgPyBUUlVFIDogRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGVJY29uKCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFdpZGdldE1ncik7DQorICAgIElGV0xfRm9ybURQICpwRGF0YSA9IChJRldMX0Zvcm1EUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgQ0ZYX0RJQml0bWFwICpwQmlnSWNvbiA9IHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgVFJVRSk7DQorICAgIENGWF9ESUJpdG1hcCAqcFNtYWxsSWNvbiA9IHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpOw0KKyAgICBpZiAocEJpZ0ljb24gJiYgcEJpZ0ljb24gIT0gbV9wQmlnSWNvbikgew0KKyAgICAgICAgbV9wQmlnSWNvbiA9IHBCaWdJY29uOw0KKyAgICAgICAgcFdpZGdldE1nci0+U2V0V2lkZ2V0SWNvbl9OYXRpdmUobV9wSW50ZXJmYWNlLCBtX3BCaWdJY29uLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAocFNtYWxsSWNvbiAmJiBwU21hbGxJY29uICE9IG1fcFNtYWxsSWNvbikgew0KKyAgICAgICAgbV9wU21hbGxJY29uID0gcFNtYWxsSWNvbjsNCisgICAgICAgIHBXaWRnZXRNZ3ItPlNldFdpZGdldEljb25fTmF0aXZlKG1fcEludGVyZmFjZSwgbV9wQmlnSWNvbiwgRkFMU0UpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGVDYXB0aW9uKCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFdpZGdldE1ncik7DQorICAgIElGV0xfRm9ybURQICpwRGF0YSA9IChJRldMX0Zvcm1EUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRGF0YSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHRleHQ7DQorICAgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgdGV4dCk7DQorICAgIHBXaWRnZXRNZ3ItPlNldFdpZGdldENhcHRpb25fTmF0aXZlKG1fcEludGVyZmFjZSwgdGV4dCk7DQorfQ0KK3ZvaWQgIENGV0xfRm9ybUltcDo6RG9XaWR0aExpbWl0KEZYX0ZMT0FUICZmTGVmdCwgRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgZkN1clgsIEZYX0ZMT0FUIGZTcGFjZSwgRlhfRkxPQVQgZkxpbWl0TWluLCBGWF9GTE9BVCBmTGltaXRNYXgsIEZYX0JPT0wgYkxlZnQpDQorew0KKyAgICBGWF9GTE9BVCBmeCA9IGZDdXJYOw0KKyAgICBGWF9GTE9BVCBmeSA9IDAgOw0KKyAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgICBGWF9GTE9BVCBmVGVtcCA9IGJMZWZ0ID8gKGZXaWR0aCAtIGZ4ICsgZkxlZnQgKyBmU3BhY2UgKSA6IChmeCAtIGZMZWZ0ICsgZlNwYWNlKTsNCisgICAgaWYgKGZUZW1wID49IGZMaW1pdE1pbiAmJiBmVGVtcCA8PSBmTGltaXRNYXgpIHsNCisgICAgICAgIGZXaWR0aCA9IGZUZW1wOw0KKyAgICAgICAgZkxlZnQgKz0gYkxlZnQgPyAoZnggLSBmTGVmdCAtIGZTcGFjZSApIDogMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChmVGVtcCA8IGZMaW1pdE1pbiAmJiBmV2lkdGggPiBmTGltaXRNaW4pIHsNCisgICAgICAgICAgICBmTGVmdCArPSBiTGVmdCA/IChmV2lkdGggLSBmTGltaXRNaW4pIDogMDsNCisgICAgICAgICAgICBmV2lkdGggPSBmTGltaXRNaW47DQorICAgICAgICB9IGVsc2UgaWYgKGZUZW1wID4gZkxpbWl0TWF4ICYmIGZXaWR0aCA8IGZMaW1pdE1heCkgew0KKyAgICAgICAgICAgIGZMZWZ0IC09IGJMZWZ0ID8gKGZMaW1pdE1heCAtIGZXaWR0aCkgOiAwOw0KKyAgICAgICAgICAgIGZXaWR0aCA9IGZMaW1pdE1heDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkICBDRldMX0Zvcm1JbXA6OkRvSGVpZ2h0TGltaXQoRlhfRkxPQVQgJmZUb3AsIEZYX0ZMT0FUICZmSGVpZ2h0LCBGWF9GTE9BVCBmQ3VyWSwgRlhfRkxPQVQgZlNwYWNlLCBGWF9GTE9BVCBmTGltaXRNaW4sIEZYX0ZMT0FUIGZMaW1pdE1heCwgRlhfQk9PTCBiVG9wKQ0KK3sNCisgICAgRlhfRkxPQVQgZnggPSAwOw0KKyAgICBGWF9GTE9BVCBmeSA9IGZDdXJZIDsNCisgICAgVHJhbnNmb3JtVG8oTlVMTCwgZngsIGZ5KTsNCisgICAgRlhfRkxPQVQgZlRlbXAgPSBiVG9wID8gKGZIZWlnaHQgLSBmeSArIGZUb3AgKyBmU3BhY2UgKSA6IChmeSAtIGZUb3AgKyBmU3BhY2UpOw0KKyAgICBpZiAoZlRlbXAgPj0gZkxpbWl0TWluICYmIGZUZW1wIDw9IGZMaW1pdE1heCkgew0KKyAgICAgICAgZkhlaWdodCA9IGZUZW1wOw0KKyAgICAgICAgZlRvcCArPSBiVG9wID8gKGZ5IC0gZlRvcCAtIGZTcGFjZSApIDogMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChmVGVtcCA8IGZMaW1pdE1pbiAmJiBmSGVpZ2h0ID4gZkxpbWl0TWluKSB7DQorICAgICAgICAgICAgZlRvcCArPSBiVG9wID8gKGZIZWlnaHQgLSBmTGltaXRNaW4pIDogMDsNCisgICAgICAgICAgICBmSGVpZ2h0ID0gZkxpbWl0TWluOw0KKyAgICAgICAgfSBlbHNlIGlmIChmVGVtcCA+IGZMaW1pdE1heCAmJiBmSGVpZ2h0IDwgZkxpbWl0TWF4KSB7DQorICAgICAgICAgICAgZlRvcCAtPSBiVG9wID8gKGZMaW1pdE1heCAtIGZIZWlnaHQpIDogMDsNCisgICAgICAgICAgICBmSGVpZ2h0ID0gZkxpbWl0TWF4Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NGV0xfRm9ybURlbGVnYXRlOjpDRldMX0Zvcm1EZWxlZ2F0ZShDRldMX0Zvcm1JbXAgKnBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpDQorew0KK30NCitGWF9JTlQzMiBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgICAgRlhfSU5UMzIgaVJldCA9IDE7DQorICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0FjdGl2YXRlOiB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydFJlbGF0aXZlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlOiB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UmVsYXRpdmUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyNlbHNlDQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9JTlQzMiBpUmV0ID0gMTsNCisgICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCisgICAgICAgICAgICAgICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gbV9wT3duZXItPkdldE93bmVyVGhyZWFkKCk7DQorICAgICAgICAgICAgICAgIENGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgICAgICAgICAgICAgQ0ZXTF9XaWRnZXRJbXAgKnBTdWJGb2N1c0ltcCA9IG1fcE93bmVyLT5HZXRTdWJGb2N1cygpOw0KKyAgICAgICAgICAgICAgICBJRldMX1dpZGdldCAqcFN1YkZvY3VzID0gcFN1YkZvY3VzSW1wID8gcFN1YkZvY3VzSW1wLT5HZXRJbnRlcmZhY2UoKSA6IE5VTEw7DQorICAgICAgICAgICAgICAgIGlmIChwU3ViRm9jdXMgJiYgcFN1YkZvY3VzICE9IHBEcml2ZXItPkdldEZvY3VzKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBEcml2ZXItPlNldEZvY3VzKHBTdWJGb2N1cyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UmVsYXRpdmUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGU6IHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgICAgICAgICAgICAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BPd25lci0+R2V0T3duZXJUaHJlYWQoKTsNCisgICAgICAgICAgICAgICAgQ0ZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICAgICAgICAgICAgICBDRldMX1dpZGdldEltcCAqcFN1YkZvY3VzSW1wID0gbV9wT3duZXItPkdldFN1YkZvY3VzKCk7DQorICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0ICpwU3ViRm9jdXMgPSBwU3ViRm9jdXNJbXAgPyBwU3ViRm9jdXNJbXAtPkdldEludGVyZmFjZSgpIDogTlVMTDsNCisgICAgICAgICAgICAgICAgaWYgKHBTdWJGb2N1cykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTdWJGb2N1cyA9PSBwRHJpdmVyLT5HZXRGb2N1cygpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcERyaXZlci0+U2V0Rm9jdXMoTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfTXNnS2lsbEZvY3VzIG1zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBTdWJGb2N1cy0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZWxlZ2F0ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UmVsYXRpdmUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAocE1zZy0+bV9kd0NtZCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlSG92ZXI6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZUhvdmVyKHBNc2cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRibENsazogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25EYmxDbGsocE1zZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NpemU6IHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgICAgICAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCAwKTsNCisgICAgICAgICAgICAgICAgcFdpZGdldE1nci0+QWRkUmVkcmF3Q291bnRzKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UpOw0KKyAgICAgICAgICAgICAgICBpZiAoIW1fcE93bmVyLT5tX2JTZXRNYXhpbWl6ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fYlNldE1heGltaXplID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIENGV0xfTXNnU2l6ZSAqcE1zZyA9IChDRldMX01zZ1NpemUqKXBNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQ7DQorICAgICAgICAgICAgICAgIHBXaWRnZXRNZ3ItPkdldFdpZGdldFJlY3RfTmF0aXZlKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIHJ0KTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA9IHJ0LmxlZnQ7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcCA9IHJ0LnRvcDsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggPSAoRlhfRkxPQVQpcE1zZy0+bV9pV2lkdGg7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCA9IChGWF9GTE9BVClwTXNnLT5tX2lIZWlnaHQ7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9XaW5kb3dNb3ZlOiB7DQorICAgICAgICAgICAgICAgIE9uV2luZG93TW92ZSgoQ0ZXTF9Nc2dXaW5kb3dNb3ZlKiApcE1lc3NhZ2UpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0Nsb3NlOiB7DQorICAgICAgICAgICAgICAgIE9uQ2xvc2UoKENGV0xfTXNnQ2xvc2UqIClwTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgaVJldCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUmV0Ow0KKyNlbmRpZg0KK30NCitGV0xfRVJSCUNGV0xfRm9ybURlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBFdmVudCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0Nsb3NlICYmIHBFdmVudC0+bV9wU3JjVGFyZ2V0ID09IG1fcE93bmVyLT5tX3BJbnRlcmZhY2UpIHsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IFRSVUU7DQorICAgIG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX05vbmU7DQorICAgIENGV0xfU3lzQnRuICpwUHJlc3NCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgbV9wT3duZXItPm1faUNhcHR1cmVCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuSW5kZXgocFByZXNzQnRuKTsNCisgICAgQ0ZYX1JlY3RGIHJ0Q2FwOw0KKyAgICBydENhcC5TZXQobV9wT3duZXItPm1fcnRDYXB0aW9uLmxlZnQgKyBtX3BPd25lci0+bV9mQ1lCb3JkZXIsDQorICAgICAgICAgICAgICBtX3BPd25lci0+bV9ydENhcHRpb24udG9wICsgbV9wT3duZXItPm1fZkNYQm9yZGVyLA0KKyAgICAgICAgICAgICAgbV9wT3duZXItPm1fcnRDYXB0aW9uLndpZHRoIC0gRldMX1NZU0JUTlNJWkUgKiBtX3BPd25lci0+bV9pU3lzQm94IC0gMiAqIG1fcE93bmVyLT5tX2ZDWUJvcmRlciwNCisgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3J0Q2FwdGlvbi5oZWlnaHQgLSBtX3BPd25lci0+bV9mQ1hCb3JkZXIpOw0KKyAgICBpZiAocFByZXNzQnRuKSB7DQorICAgICAgICBwUHJlc3NCdG4tPlNldFByZXNzZWQoKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZwUHJlc3NCdG4tPm1fcnRCdG4pOw0KKyAgICB9IGVsc2UgaWYgKHJ0Q2FwLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9DYXA7DQorICAgIH0gZWxzZSBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcikgJiYNCisgICAgICAgICAgICAgICAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRlJNX1Jlc2l6ZSkgJiYNCisgICAgICAgICAgICAgICAhbV9wT3duZXItPm1fYk1heGltaXplZCkgew0KKyAgICAgICAgbV9wT3duZXItPlNldEN1cnNvcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC5TZXQobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQorICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgICBDRldMX1N5c0J0biAqcFBvaW50QnRuID0gbV9wT3duZXItPkdldFN5c0J0bkF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIENGV0xfU3lzQnRuICpwUHJlc3NlZEJ0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5CeUluZGV4KG1fcE93bmVyLT5tX2lDYXB0dXJlQnRuKTsNCisgICAgaWYgKCFwUHJlc3NlZEJ0biB8fCBwUG9pbnRCdG4gIT0gcFByZXNzZWRCdG4pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAocFByZXNzZWRCdG4gPT0gbV9wT3duZXItPkdldFN5c0J0bkJ5U3RhdGUoRldMX1NZU0JVVFRPTlNUQVRFX1ByZXNzZWQpKSB7DQorICAgICAgICBwUHJlc3NlZEJ0bi0+U2V0Tm9ybWFsKCk7DQorICAgIH0NCisgICAgaWYgKHBQcmVzc2VkQnRuID09IG1fcE93bmVyLT5tX3BNYXhCb3gpIHsNCisgICAgICAgIGlmIChtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlNldFdpZGdldFJlY3QobV9wT3duZXItPm1fcnRSZXN0b3JlKTsNCisgICAgICAgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9wT3duZXItPlNldFdvcmtBcmVhUmVjdCgpOw0KKyAgICAgICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCisgICAgfSBlbHNlIGlmIChwUHJlc3NlZEJ0biA9PSBtX3BPd25lci0+bV9wTWluQm94KSB7DQorICAgICAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwV2lkZ2V0TWdyKTsNCisgICAgICAgIHBXaWRnZXRNZ3ItPlNldE1pbmltaXplX05hdGl2ZShtX3BPd25lci0+bV9wSW50ZXJmYWNlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGV0xfRXZ0Q2xvc2UgZUNsb3NlOw0KKyAgICAgICAgZUNsb3NlLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmZUNsb3NlKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX2JMQnV0dG9uRG93bikgew0KKyAgICAgICAgSUZXTF9BZGFwdGVyTmF0aXZlICpwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgICAgIElGV0xfQWRhcHRlckN1cnNvck1nciAqcEN1cnNvck1nciA9IHBOYXRpdmUtPkdldEN1cnNvck1ncigpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwQ3Vyc29yTWdyKTsNCisgICAgICAgIENGV0xfU3lzQnRuICpwUHJlc3NlZEJ0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5CeUluZGV4KG1fcE93bmVyLT5tX2lDYXB0dXJlQnRuKTsNCisgICAgICAgIEZYX0ZMT0FUIGZUb3AsIGZMZWZ0LCBmV2lkdGgsIGZIZWlnaHQ7DQorICAgICAgICBmVG9wID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KKyAgICAgICAgZkxlZnQgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0Ow0KKyAgICAgICAgZldpZHRoID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQorICAgICAgICBmSGVpZ2h0ID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICAgICAgRlhfRkxPQVQgZldpZHRoTWF4LCBmV2lkdGhNaW4sIGZIZWlnaHRNYXgsIGZIZWlnaHRNaW47DQorICAgICAgICBpZiAobV9wT3duZXItPm1fcENvbnRlbnQpIHsNCisgICAgICAgICAgICBtX3BPd25lci0+R2V0Q29udGVudCgpLT5HZXRNYXhTaXplKGZXaWR0aE1heCwgZkhlaWdodE1heCk7DQorICAgICAgICAgICAgbV9wT3duZXItPkdldENvbnRlbnQoKS0+R2V0TWluU2l6ZShmV2lkdGhNaW4sIGZIZWlnaHRNaW4pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmV2lkdGhNYXggPSBmSGVpZ2h0TWF4ID0gMTAyNCAqIDQ7DQorICAgICAgICAgICAgZldpZHRoTWluID0gZkhlaWdodE1pbiA9IDA7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJXaWR0aGxpbWl0ID0gKGZXaWR0aE1pbiAhPSAwIHx8IGZXaWR0aE1heCAhPSAwKTsNCisgICAgICAgIEZYX0JPT0wgYkhlaWdodGxpbWl0ID0gKGZIZWlnaHRNaW4gIT0gMCB8fCBmSGVpZ2h0TWF4ICE9IDApOw0KKyAgICAgICAgRlhfQk9PTCBiU2l6ZWxpbWl0ID0gYldpZHRobGltaXQgfHwgYkhlaWdodGxpbWl0Ow0KKyAgICAgICAgaWYgKGZXaWR0aE1heCAhPSAwIHx8IGZIZWlnaHRNYXggIT0gMCB8fCBmV2lkdGhNaW4gIT0gMCB8fCBmSGVpZ2h0TWluICE9IDApIHsNCisgICAgICAgICAgICBiU2l6ZWxpbWl0ID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUHJlc3NlZEJ0bikgew0KKyAgICAgICAgICAgIGlmICghcFByZXNzZWRCdG4tPm1fcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgICAgICAgICAgcFByZXNzZWRCdG4tPlNldE5vcm1hbCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBQcmVzc2VkQnRuLT5TZXRQcmVzc2VkKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZwUHJlc3NlZEJ0bi0+bV9ydEJ0bik7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfQ2FwKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuT2Zmc2V0KHBNc2ctPm1fZnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkpOw0KKyAgICAgICAgICAgIHBXaWRnZXRNZ3ItPlNldFdpZGdldFBvc2l0aW9uX05hdGl2ZShtX3BPd25lci0+bV9wSW50ZXJmYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0KSB7DQorICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgICAgICAgIGlmICghYldpZHRobGltaXQpIHsNCisgICAgICAgICAgICAgICAgZldpZHRoICs9IHBNc2ctPm1fZnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lng7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfTGVmdCkgew0KKyAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZVdFKTsNCisgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICAgICAgICBpZiAoIWJXaWR0aGxpbWl0KSB7DQorICAgICAgICAgICAgICAgIGZMZWZ0IC09IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICAgICAgICAgIGZXaWR0aCArPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb1dpZHRoTGltaXQoZkxlZnQsIGZXaWR0aCwgcE1zZy0+bV9meCwgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54LCBmV2lkdGhNaW4sIGZXaWR0aE1heCwgVFJVRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfQm90dG9tKSB7DQorICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTlMpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgICAgICAgIGlmICghYkhlaWdodGxpbWl0KSB7DQorICAgICAgICAgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55ID0gcE1zZy0+bV9meTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9Ub3ApIHsNCisgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgICAgICAgaWYgKCFiSGVpZ2h0bGltaXQpIHsNCisgICAgICAgICAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgICAgICAgICBmSGVpZ2h0IC09IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvSGVpZ2h0TGltaXQoZlRvcCwgZkhlaWdodCwgcE1zZy0+bV9meSwgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LCBmSGVpZ2h0TWluLCBmSGVpZ2h0TWF4LCBUUlVFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9MZWZ0VG9wKSB7DQorICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTldTRSk7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICAgICAgICAgIGZMZWZ0IC09IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICAgICAgICAgIGZUb3AgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT4gbV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICAgICAgICAgIGZXaWR0aCArPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgICAgICAgICBmSGVpZ2h0IC09IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvSGVpZ2h0TGltaXQoZlRvcCwgZkhlaWdodCwgcE1zZy0+bV9meSwgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LCBmSGVpZ2h0TWluLCBmSGVpZ2h0TWF4LCBUUlVFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9MZWZ0Qm90dG9tKSB7DQorICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTkVTVyk7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICAgICAgICAgIGZMZWZ0IC09IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICAgICAgICAgIGZXaWR0aCArPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgICAgICAgICBmSGVpZ2h0ICs9IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBUUlVFKTsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvSGVpZ2h0TGltaXQoZlRvcCwgZkhlaWdodCwgcE1zZy0+bV9meSwgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC55IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LCBmSGVpZ2h0TWluLCBmSGVpZ2h0TWF4LCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfUmlnaHRUb3ApIHsNCisgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICAgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCisgICAgICAgICAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgICAgICAgICBmV2lkdGggKz0gcE1zZy0+bV9meCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueDsNCisgICAgICAgICAgICAgICAgZkhlaWdodCAtPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggPSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb1dpZHRoTGltaXQoZkxlZnQsIGZXaWR0aCwgcE1zZy0+bV9meCwgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC54IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54LCBmV2lkdGhNaW4sIGZXaWR0aE1heCwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tKSB7DQorICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTldTRSk7DQorICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICAgICAgICAgIGZXaWR0aCArPSBwTXNnLT5tX2Z4IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54Ow0KKyAgICAgICAgICAgICAgICBmSGVpZ2h0ICs9IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSwgZkhlaWdodE1pbiwgZkhlaWdodE1heCwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wQ29udGVudCkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0Rm9ybTsNCisgICAgICAgIHJ0Rm9ybS5TZXQoZkxlZnQsIGZUb3AsIGZXaWR0aCwgZkhlaWdodCk7DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0ID0gcnRGb3JtOw0KKyAgICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KKyAgICAgICAgbV9wT3duZXItPlNldFdpZGdldFJlY3QocnRGb3JtKTsNCisjZWxzZQ0KKyAgICAgICAgbV9wT3duZXItPlNldFdpZGdldFJlY3QocnRGb3JtKTsNCisgICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisjZW5kaWYNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcikgJiYNCisgICAgICAgICAgICAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRlJNX1Jlc2l6ZSkgJiYNCisgICAgICAgICAgICAhbV9wT3duZXItPm1fYk1heGltaXplZCkgew0KKyAgICAgICAgbV9wT3duZXItPlNldEN1cnNvcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlOw0KKyAgICBydEludmFsaWRhdGUuUmVzZXQoKTsNCisgICAgQ0ZXTF9TeXNCdG4gKnBQb2ludEJ0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBDRldMX1N5c0J0biAqcE9sZEhvdmVyID0gbV9wT3duZXItPkdldFN5c0J0bkJ5U3RhdGUoRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyKTsNCisjaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KKyAgICB7DQorICAgICAgICBpZiAocE9sZEhvdmVyICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICAgICAgICBwT2xkSG92ZXItPlNldE5vcm1hbCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBQb2ludEJ0biAmJiBwUG9pbnRCdG4gIT0gcE9sZEhvdmVyKSB7DQorICAgICAgICAgICAgcFBvaW50QnRuLT5TZXRIb3ZlcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BDbG9zZUJveCkgew0KKyAgICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3BDbG9zZUJveC0+bV9ydEJ0bjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BPd25lci0+bV9wTWF4Qm94KSB7DQorICAgICAgICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlID0gbV9wT3duZXItPm1fcE1heEJveC0+bV9ydEJ0bjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBydEludmFsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcE1heEJveC0+bV9ydEJ0bik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BNaW5Cb3gpIHsNCisgICAgICAgICAgICBpZiAocnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9wTWluQm94LT5tX3J0QnRuOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihtX3BPd25lci0+bV9wTWluQm94LT5tX3J0QnRuKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkgJiYgcnRJbnZhbGlkYXRlLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgICAgICAgbV9wT3duZXItPm1fYk1vdXNlSW4gPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorI2Vsc2UNCisgICAgew0KKyAgICAgICAgaWYgKHBPbGRIb3ZlciAmJiBwUG9pbnRCdG4gIT0gcE9sZEhvdmVyKSB7DQorICAgICAgICAgICAgcE9sZEhvdmVyLT5TZXROb3JtYWwoKTsNCisgICAgICAgICAgICBydEludmFsaWRhdGUgPSBwT2xkSG92ZXItPm1fcnRCdG47DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBvaW50QnRuICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICAgICAgICBwUG9pbnRCdG4tPlNldEhvdmVyKCk7DQorICAgICAgICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlID0gcFBvaW50QnRuLT5tX3J0QnRuOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihwUG9pbnRCdG4tPm1fcnRCdG4pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpZiAoIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uTW91c2VIb3ZlcihDRldMX01zZ01vdXNlICpwTXNnKQ0KK3sNCisgICAgbV9wT3duZXItPlNldEN1cnNvcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCit9DQordm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBDRldMX1N5c0J0biAqcEhvdmVyID0gbV9wT3duZXItPkdldFN5c0J0bkJ5U3RhdGUoRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyKTsNCisgICAgaWYgKHBIb3Zlcikgew0KKyAgICAgICAgcEhvdmVyLT5TZXROb3JtYWwoKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZwSG92ZXItPm1fcnRCdG4pOw0KKyAgICB9DQorICAgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlICYmICFtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRDdXJzb3IocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25MQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpICYmIG1fcE93bmVyLT5IaXRUZXN0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpID09IEZXTF9XR1RISVRURVNUX1RpdGxlYmFyKSB7DQorICAgICAgICBpZiAobV9wT3duZXItPm1fYk1heGltaXplZCkgew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5TZXRXaWRnZXRSZWN0KG1fcE93bmVyLT5tX3J0UmVzdG9yZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcE93bmVyLT5TZXRXb3JrQXJlYVJlY3QoKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisgICAgICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbldpbmRvd01vdmUoQ0ZXTF9Nc2dXaW5kb3dNb3ZlICpwTXNnKQ0KK3sNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA9IHBNc2ctPm1fZng7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcCA9IHBNc2ctPm1fZnk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uQ2xvc2UoQ0ZXTF9Nc2dDbG9zZSAqcE1zZykNCit7DQorICAgIENGV0xfRXZ0Q2xvc2UgZUNsb3NlOw0KKyAgICBlQ2xvc2UubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmVDbG9zZSk7DQorfQ0KK0ZXTF9FUlIgRldMX0FjY2VsZXJhdG9yX1NldEZvcm0oSUZXTF9Gb3JtICpwRnJvbSwgQ0ZYX01hcEFjY2VsZXJhdG9ycyAqcE1hcEFjY2VsKQ0KK3sNCisgICAgQ0ZXTF9Gb3JtSW1wICpwSW1wID0gKENGV0xfRm9ybUltcCopKChJRldMX1RhcmdldERhdGEqKXBGcm9tKS0+R2V0RGF0YSgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2dyaWRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2dyaWRpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWRlMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZ3JpZGltcC5jcHAKQEAgLTAsMCArMSwxMzU5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2NvbnRlbnRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfZ3JpZGltcC5oIg0KK0lGV0xfR3JpZCogSUZXTF9HcmlkOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX0dyaWQ7DQorfQ0KK0ZXTF9FUlIJSUZXTF9HcmlkOjpJbml0aWFsaXplKCkNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9HcmlkSW1wOw0KKyAgICAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfR3JpZDo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMpDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfR3JpZEltcChwcm9wZXJ0aWVzKTsNCisgICAgKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0hHUklEQ09MUk9XCUlGV0xfR3JpZDo6SW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgRlhfSU5UMzIgbkluZGV4ICkNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkluc2VydENvbFJvdyhiQ29sdW1uLCBuSW5kZXgpOw0KK30NCitGWF9JTlQzMiBJRldMX0dyaWQ6OkNvdW50Q29sUm93cyhGWF9CT09MIGJDb2x1bW4pDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5Db3VudENvbFJvd3MoYkNvbHVtbik7DQorfQ0KK0ZXTF9IR1JJRENPTFJPVwlJRldMX0dyaWQ6OkdldENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldENvbFJvdyhiQ29sdW1uLCBuSW5kZXgpOw0KK30NCitGWF9JTlQzMiBJRldMX0dyaWQ6OkdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0SW5kZXgoaENvbFJvdyk7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUICZlVW5pdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldFNpemUoaENvbFJvdywgZVVuaXQpOw0KK30NCitGV0xfRVJSCUlGV0xfR3JpZDo6U2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldFNpemUoaENvbFJvdywgZlNpemUsIGVVbml0KTsNCit9DQorRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQgJmVVbml0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0TWluU2l6ZShoQ29sUm93LCBlVW5pdCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9HcmlkOjpTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0TWluU2l6ZShoQ29sUm93LCBmU2l6ZSwgZVVuaXQpOw0KK30NCitGWF9GTE9BVCBJRldMX0dyaWQ6OkdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRNYXhTaXplKGhDb2xSb3csIGVVbml0KTsNCit9DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRNYXhTaXplKGhDb2xSb3csIGZTaXplLCBlVW5pdCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9HcmlkOjpEZWxldGVDb2xSb3coRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5EZWxldGVDb2xSb3coaENvbFJvdyk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9HcmlkOjpJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdykNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPklzQ29sdW1uKGhDb2xSb3cpOw0KK30NCitGWF9JTlQzMiBJRldMX0dyaWQ6OkdldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0UG9zKHBXaWRnZXQsIGJDb2x1bW4pOw0KK30NCitGV0xfRVJSIElGV0xfR3JpZDo6U2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9JTlQzMiBpUG9zLCBGWF9CT09MIGJDb2x1bW4pDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRQb3MocFdpZGdldCwgaVBvcywgYkNvbHVtbik7DQorfQ0KK0ZYX0lOVDMyIElGV0xfR3JpZDo6R2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0U3BhbihwV2lkZ2V0LCBiQ29sdW1uKTsNCit9DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyIGlTcGFuLCBGWF9CT09MIGJDb2x1bW4pDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRTcGFuKHBXaWRnZXQsIGlTcGFuICwgYkNvbHVtbik7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQgJmVVbml0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0U2l6ZShwV2lkZ2V0LCBlU2l6ZSwgZVVuaXQpOw0KK30NCitGV0xfRVJSIElGV0xfR3JpZDo6U2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURTSVpFIGVTaXplLCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVaXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRTaXplKHBXaWRnZXQsIGVTaXplLCBmU2l6ZSwgZVVpdCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9HcmlkOjpHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUICZmTWFyZ2luKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIGVNYXJnaW4sIGZNYXJnaW4pOw0KK30NCitGV0xfRVJSIElGV0xfR3JpZDo6U2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLCBGWF9GTE9BVCBmTWFyZ2luKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIGVNYXJnaW4sIGZNYXJnaW4pOw0KK30NCitGV0xfRVJSIElGV0xfR3JpZDo6UmVtb3ZlV2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+UmVtb3ZlV2lkZ2V0TWFyZ2luKHBXaWRnZXQsIGVNYXJnaW4pOw0KK30NCitGWF9GTE9BVCBJRldMX0dyaWQ6OkdldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUICZlVW5pdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldEdyaWRTaXplKGVTaXplLCBlVW5pdCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldEdyaWRTaXplKGVTaXplLCBmU2l6ZSwgZVVpdCk7DQorfQ0KK0lGV0xfR3JpZDo6SUZXTF9HcmlkKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0dyaWQ6On5JRldMX0dyaWQoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorQ0ZXTF9HcmlkSW1wOjpDRldMX0dyaWRJbXAoKQ0KK3sNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZkxlbmd0aCA9IDA7DQorfQ0KK0NGV0xfR3JpZEltcDo6Q0ZXTF9HcmlkSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcykNCisgICAgOiBDRldMX0NvbnRlbnRJbXAocHJvcGVydGllcykNCit7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGggPSAwOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGggPSAwOw0KK30NCitDRldMX0dyaWRJbXA6On5DRldMX0dyaWRJbXAoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9Db2x1bW5zLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfR3JpZENvbFJvdyAqKSBtX0NvbHVtbnNbaV07DQorICAgIH0NCisgICAgbV9Db2x1bW5zLlJlbW92ZUFsbCgpOw0KKyAgICBpQ291bnQgPSBtX1Jvd3MuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaUNvdW50OyBqKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93KikgbV9Sb3dzW2pdOw0KKyAgICB9DQorICAgIG1fUm93cy5SZW1vdmVBbGwoKTsNCisgICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHMpIHsNCisgICAgICAgIElGV0xfV2lkZ2V0ICpwV2lkZ2V0Ow0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm87DQorICAgICAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICAgICAgZGVsZXRlIHBJbmZvOw0KKyAgICB9DQorICAgIG1fbWFwV2lkZ2V0SW5mby5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfR3JpZERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgd3NDbGFzcyA9IEZXTF9DTEFTU19HcmlkOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfR3JpZEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9HcmlkOw0KK30NCitGV0xfRVJSCUNGV0xfR3JpZEltcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0NvbnRlbnRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopIEZYX05FVyBDRldMX0dyaWREZWxlZ2F0ZSh0aGlzKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfR3JpZEltcDo6RmluYWxpemUoKQ0KK3sNCisgICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9Db250ZW50SW1wOjpGaW5hbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAoYkF1dG9TaXplKSB7DQorICAgICAgICByZWN0LmxlZnQgPSAwOw0KKyAgICAgICAgcmVjdC50b3AgPSAwOw0KKyAgICAgICAgcmVjdC53aWR0aCA9IFByb2Nlc3NVbkNlcnRhaW5Db2x1bW5zKCk7DQorICAgICAgICByZWN0LmhlaWdodCA9IFByb2Nlc3NVbkNlcnRhaW5Sb3dzKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIENGV0xfV2lkZ2V0SW1wOjpTZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpVcGRhdGUoKQ0KK3sNCisgICAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgUHJvY2Vzc0NvbHVtbnMobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCk7DQorICAgIFByb2Nlc3NSb3dzKG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgU2V0QWxsV2lkZ2V0c1JlY3QoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX0dSSURTVFlMRUVYVF9TaG93R3JpZExpbmVzKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgcEdyYXBoaWNzLT5Db25jYXRNYXRyaXgoKENGWF9NYXRyaXgqKXBNYXRyaXgpOw0KKyAgICB9DQorICAgIHsNCisgICAgICAgIEZYX0JPT0wgYkRyYXdMaW5lID0gRkFMU0U7DQorICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICAgIEZYX0lOVDMyIGlDb2x1bW5zID0gbV9Db2x1bW5zLkdldFNpemUoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDE7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQorICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Db2x1bW5zW2ldOw0KKyAgICAgICAgICAgIGlmICghcENvbFJvdykgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFiRHJhd0xpbmUpIHsNCisgICAgICAgICAgICAgICAgYkRyYXdMaW5lID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGF0aC5BZGRMaW5lKHBDb2xSb3ctPm1fZkFjdHVhbFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpUm93cyA9IG1fUm93cy5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAxOyBqIDwgaVJvd3M7IGorKykgew0KKyAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fUm93c1tqXTsNCisgICAgICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkRyYXdMaW5lKSB7DQorICAgICAgICAgICAgICAgIGJEcmF3TGluZSA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhdGguQWRkTGluZSgwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sUm93LT5tX2ZBY3R1YWxQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFBvcyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkRyYXdMaW5lKSB7DQorICAgICAgICAgICAgQ0ZYX0NvbG9yIGNyKDB4RkZGRjAwMDApOw0KKyAgICAgICAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgICAgICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6SW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwQ2hpbGQsIEZYX0lOVDMyIG5JbmRleCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBDaGlsZCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgQ0ZXTF9Db250ZW50SW1wOjpJbnNlcnRXaWRnZXQocENoaWxkLCBuSW5kZXgpOw0KKyAgICBpZiAoIW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBDaGlsZCkpIHsNCisgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gRlhfTkVXIENGV0xfR3JpZFdpZGdldEluZm87DQorICAgICAgICBtX21hcFdpZGdldEluZm8uU2V0QXQocENoaWxkLCBwSW5mbyk7DQorICAgICAgICBtX1dpZGdldHMuQWRkKHBDaGlsZCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6UmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRldMX0NvbnRlbnRJbXA6OlJlbW92ZVdpZGdldChwV2lkZ2V0KTsNCisgICAgaWYgKENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBXaWRnZXQpKSB7DQorICAgICAgICBtX21hcFdpZGdldEluZm8uUmVtb3ZlS2V5KHBXaWRnZXQpOw0KKyAgICAgICAgZGVsZXRlIHBJbmZvOw0KKyAgICAgICAgRlhfSU5UMzIgbkluZGV4ID0gbV9XaWRnZXRzLkZpbmQocFdpZGdldCk7DQorICAgICAgICBtX1dpZGdldHMuUmVtb3ZlQXQobkluZGV4LCAxKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9IR1JJRENPTFJPVyBDRldMX0dyaWRJbXA6Okluc2VydENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIEZYX0lOVDMyIG5JbmRleCApDQorew0KKyAgICBpZiAoYkNvbHVtbikgew0KKyAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID4gbV9Db2x1bW5zLkdldFNpemUoKSkgew0KKyAgICAgICAgICAgIG5JbmRleCA9IG1fQ29sdW1ucy5HZXRTaXplKCk7DQorICAgICAgICB9DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2x1bW4gPSBGWF9ORVcgQ0ZXTF9HcmlkQ29sUm93Ow0KKyAgICAgICAgbV9Db2x1bW5zLkluc2VydEF0KG5JbmRleCwgcENvbHVtbiwgMSk7DQorICAgICAgICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVylwQ29sdW1uOw0KKyAgICB9DQorICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+IG1fUm93cy5HZXRTaXplKCkpIHsNCisgICAgICAgIG5JbmRleCA9IG1fUm93cy5HZXRTaXplKCk7DQorICAgIH0NCisgICAgQ0ZXTF9HcmlkQ29sUm93ICpwUm93ID0gRlhfTkVXIENGV0xfR3JpZENvbFJvdzsNCisgICAgbV9Sb3dzLkluc2VydEF0KG5JbmRleCwgcFJvdywgMSk7DQorICAgIHJldHVybiAoRldMX0hHUklEQ09MUk9XKXBSb3c7DQorfQ0KK0ZYX0lOVDMyIENGV0xfR3JpZEltcDo6Q291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbikNCit7DQorICAgIGlmIChiQ29sdW1uKSB7DQorICAgICAgICByZXR1cm4gbV9Db2x1bW5zLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9Sb3dzLkdldFNpemUoKTsNCit9DQorRldMX0hHUklEQ09MUk9XIENGV0xfR3JpZEltcDo6R2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgaWYgKGJDb2x1bW4pIHsNCisgICAgICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0NvbHVtbnMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVyltX0NvbHVtbnNbbkluZGV4XTsNCisgICAgfQ0KKyAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9Sb3dzLkdldFNpemUoKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIChGV0xfSEdSSURDT0xST1cpbV9Sb3dzW25JbmRleF07DQorfQ0KK0ZYX0lOVDMyIENGV0xfR3JpZEltcDo6R2V0SW5kZXgoRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpDQorew0KKyAgICBpZiAoSXNDb2x1bW4oaENvbFJvdykpIHsNCisgICAgICAgIHJldHVybiBtX0NvbHVtbnMuRmluZChoQ29sUm93KTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9Sb3dzLkZpbmQoaENvbFJvdyk7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6R2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUICZlVW5pdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaENvbFJvdywgLTEpOw0KKyAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KKyAgICBlVW5pdCA9IHBDb2xSb3ctPm1fU2l6ZS5lVW5pdDsNCisgICAgcmV0dXJuIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaENvbFJvdywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopaENvbFJvdzsNCisgICAgcENvbFJvdy0+bV9TaXplLmVVbml0ID0gZVVuaXQ7DQorICAgIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoID0gZlNpemU7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQgJmVVbml0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoQ29sUm93LCAtMSk7DQorICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQorICAgIGVVbml0ID0gcENvbFJvdy0+bV9NaW5TaXplLmVVbml0Ow0KKyAgICByZXR1cm4gcENvbFJvdy0+bV9NaW5TaXplLmZMZW5ndGg7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoQ29sUm93LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KKyAgICBwQ29sUm93LT5tX01pblNpemUuZVVuaXQgPSBlVW5pdDsNCisgICAgcENvbFJvdy0+bV9NaW5TaXplLmZMZW5ndGggPSBmU2l6ZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhDb2xSb3csIC0xKTsNCisgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopaENvbFJvdzsNCisgICAgZVVuaXQgPSBwQ29sUm93LT5tX01heFNpemUuZVVuaXQ7DQorICAgIHJldHVybiBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhDb2xSb3csIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQorICAgIHBDb2xSb3ctPm1fTWF4U2l6ZS5lVW5pdCA9IGVVbml0Ow0KKyAgICBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aCA9IGZTaXplOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpEZWxldGVDb2xSb3coRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpDQorew0KKyAgICBGWF9JTlQzMiBuSW5kZXggPSBtX0NvbHVtbnMuRmluZChoQ29sUm93KTsNCisgICAgaWYgKG5JbmRleCA+PSAwKSB7DQorICAgICAgICBtX0NvbHVtbnMuUmVtb3ZlQXQobkluZGV4KTsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgbkluZGV4ID0gbV9Sb3dzLkZpbmQoaENvbFJvdyk7DQorICAgIGlmIChuSW5kZXggPj0gMCkgew0KKyAgICAgICAgZGVsZXRlIChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQorICAgICAgICBtX1Jvd3MuUmVtb3ZlQXQobkluZGV4KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX0dyaWRJbXA6OklzQ29sdW1uKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KQ0KK3sNCisgICAgcmV0dXJuIG1fQ29sdW1ucy5GaW5kKGhDb2xSb3cpICE9IC0xOw0KK30NCitGWF9JTlQzMiBDRldMX0dyaWRJbXA6OkdldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICByZXR1cm4gYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW4gOiBwSW5mby0+bV9pUm93Ow0KKyAgICB9DQorICAgIHJldHVybiAtMTsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgaVBvcywgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICBiQ29sdW1uID8gcEluZm8tPm1faUNvbHVtbiA9IGlQb3MgOiBwSW5mby0+bV9pUm93ID0gaVBvczsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICByZXR1cm4gYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW5TcGFuIDogcEluZm8tPm1faVJvd1NwYW47DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9JTlQzMiBpU3BhbiwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICBiQ29sdW1uID8gcEluZm8tPm1faUNvbHVtblNwYW4gPSBpU3BhbiA6IHBJbmZvLT5tX2lSb3dTcGFuID0gaVNwYW47DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldFdpZGdldFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUICZlVW5pdCkNCit7DQorICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQorICAgIGlmIChwSW5mbykgew0KKyAgICAgICAgZVVuaXQgPSBwSW5mby0+bV9TaXplW2VTaXplXS5lVW5pdDsNCisgICAgICAgIHJldHVybiBwSW5mby0+bV9TaXplW2VTaXplXS5mTGVuZ3RoOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURTSVpFIGVTaXplLCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVaXQpDQorew0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KKyAgICBpZiAocEluZm8pIHsNCisgICAgICAgIHBJbmZvLT5tX1NpemVbZVNpemVdLmZMZW5ndGggPSBmU2l6ZTsNCisgICAgICAgIHBJbmZvLT5tX1NpemVbZVNpemVdLmVVbml0ID0gZVVpdDsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUICZmTWFyZ2luKQ0KK3sNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICBmTWFyZ2luID0gcEluZm8tPm1fTWFyZ2luW2VNYXJnaW5dOw0KKyAgICAgICAgcmV0dXJuIChwSW5mby0+bV9kd01hcmdpbkZsYWcgJiAoMSA8PCBlTWFyZ2luKSkgIT0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUIGZNYXJnaW4pDQorew0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KKyAgICBpZiAocEluZm8pIHsNCisgICAgICAgIHBJbmZvLT5tX01hcmdpbltlTWFyZ2luXSA9IGZNYXJnaW47DQorICAgICAgICBwSW5mby0+bV9kd01hcmdpbkZsYWcgfD0gKDEgPDwgZU1hcmdpbik7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6UmVtb3ZlV2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luKQ0KK3sNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICBwSW5mby0+bV9kd01hcmdpbkZsYWcgJj0gfigxIDw8IGVNYXJnaW4pOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCAmZVVuaXQpDQorew0KKyAgICBlVW5pdCA9IG1fU2l6ZVtlU2l6ZV0uZVVuaXQ7DQorICAgIHJldHVybiBtX1NpemVbZVNpemVdLmZMZW5ndGg7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCkNCit7DQorICAgIG1fU2l6ZVtlU2l6ZV0uZkxlbmd0aCA9IGZTaXplOw0KKyAgICBtX1NpemVbZVNpemVdLmVVbml0ID0gZVVpdDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX0dyaWRXaWRnZXRJbmZvKiBDRldMX0dyaWRJbXA6OkdldFdpZGdldEluZm8oSUZXTF9XaWRnZXQqIHBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKENGV0xfR3JpZFdpZGdldEluZm8qKW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBXaWRnZXQpOw0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6UHJvY0ZpeGVkQ29sUm93KENGV0xfR3JpZENvbFJvdyAqcENvbFJvdywgRlhfSU5UMzIgbkluZGV4LCBGWF9GTE9BVCBmQ29sUm93U2l6ZSwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSA9IGZDb2xSb3dTaXplOw0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgICAgIGlmIChiQ29sdW1uKSB7DQorICAgICAgICAgICAgaWYgKHBJbmZvLT5tX2lDb2x1bW4gPT0gbkluZGV4ICYmIHBJbmZvLT5tX2lDb2x1bW5TcGFuID09IDEpIHsNCisgICAgICAgICAgICAgICAgQ2FsY1dpZGdldFdpZHRoKHBXaWRnZXQsIHBJbmZvLCBwQ29sUm93LT5tX2ZBY3R1YWxTaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChwSW5mby0+bV9pUm93ID09IG5JbmRleCAmJiBwSW5mby0+bV9pUm93U3BhbiA9PSAxKSB7DQorICAgICAgICAgICAgICAgIENhbGNXaWRnZXRIZWlndChwV2lkZ2V0LCBwSW5mbywgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpQcm9jQXV0b0NvbFJvdyhDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3csIEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwQ29sUm93KTsNCisgICAgRlhfRkxPQVQgZk1heFNpemUgPSAwLCBmV2lkZ2V0U2l6ZSA9IDA7DQorICAgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJbmZvLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBJRldMX1dpZGdldCpwV2lkZ2V0ID0gTlVMTDsNCisgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gTlVMTDsNCisgICAgICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgICAgICBpZiAoIXBXaWRnZXQgfHwgIXBJbmZvKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkNvbHVtbikgew0KKyAgICAgICAgICAgIGlmIChwSW5mby0+bV9pQ29sdW1uICE9IG5JbmRleCB8fCBwSW5mby0+bV9pQ29sdW1uU3BhbiAhPSAxKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmV2lkZ2V0U2l6ZSA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0V2lkdGgocFdpZGdldCwgcEluZm8pOw0KKyAgICAgICAgICAgIGlmIChmTWF4U2l6ZSA8IGZXaWRnZXRTaXplKSB7DQorICAgICAgICAgICAgICAgIGZNYXhTaXplID0gZldpZGdldFNpemU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAocEluZm8tPm1faVJvdyAhPSBuSW5kZXggfHwgcEluZm8tPm1faVJvd1NwYW4gIT0gMSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZldpZGdldFNpemUgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQorICAgICAgICAgICAgaWYgKGZNYXhTaXplIDwgZldpZGdldFNpemUpIHsNCisgICAgICAgICAgICAgICAgZk1heFNpemUgPSBmV2lkZ2V0U2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmTWF4U2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpQcm9jU2NhbGVkQ29sUm93KENGV0xfR3JpZENvbFJvdyAqcENvbFJvdywgRlhfSU5UMzIgbkluZGV4LCBGWF9GTE9BVCBmQ29sUm93U2l6ZSwgRlhfQk9PTCBiQ29sdW1uKQ0KK3sNCisgICAgaWYgKGZDb2xSb3dTaXplID4gMCkgew0KKyAgICAgICAgUHJvY0ZpeGVkQ29sUm93KHBDb2xSb3csIG5JbmRleCwgZkNvbFJvd1NpemUsIGJDb2x1bW4pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpDYWxjV2lkZ2V0V2lkdGgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvLCBGWF9GTE9BVCBmQ29sdW5tV2lkdGgpDQorew0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KKyAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICAgICAgICBGWF9GTE9BVCBmTGVmdE1hcmdpbiA9IDAsIGZSaWdodE1hcmdpbiA9IDA7DQorICAgICAgICBGWF9CT09MIGJMZWZ0TWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0xlZnQsIGZMZWZ0TWFyZ2luKTsNCisgICAgICAgIEZYX0JPT0wgYlJpZ2h0TWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX1JpZ2h0LCBmUmlnaHRNYXJnaW4pOw0KKyAgICAgICAgaWYgKGJMZWZ0TWFyZ2luICYmIGJSaWdodE1hcmdpbikgew0KKyAgICAgICAgICAgIGZXaWR0aCA9IGZDb2x1bm1XaWR0aCAtIGZMZWZ0TWFyZ2luIC0gZlJpZ2h0TWFyZ2luOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRBdXRvOw0KKyAgICAgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCisgICAgICAgICAgICBmV2lkdGggPSBydEF1dG8uV2lkdGgoKTsNCisgICAgICAgIH0NCisgICAgICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBmV2lkdGgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpDYWxjV2lkZ2V0SGVpZ3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvLCBGWF9GTE9BVCBmUm93SGVpZ3QpDQorew0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgZlRvcE1hcmdpbiA9IDAsIGZCb3R0b21NYXJnaW4gPSAwOw0KKyAgICAgICAgRlhfQk9PTCBiVG9wTWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX1RvcCwgZlRvcE1hcmdpbik7DQorICAgICAgICBGWF9CT09MIGJCb3R0b21NYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fQm90dG9tLCBmQm90dG9tTWFyZ2luKTsNCisgICAgICAgIGlmIChiVG9wTWFyZ2luICYmIGJCb3R0b21NYXJnaW4pIHsNCisgICAgICAgICAgICBmSGVpZ2h0ID0gZlJvd0hlaWd0IC0gZlRvcE1hcmdpbiAtIGZCb3R0b21NYXJnaW47DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9SZWN0RiBydEF1dG87DQorICAgICAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KKyAgICAgICAgICAgIGZIZWlnaHQgPSBydEF1dG8uSGVpZ2h0KCk7DQorICAgICAgICB9DQorICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIGZIZWlnaHQpOw0KKyAgICB9DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6Q2FsY0F1dG9Db2x1bW5XaWRnZXRXaWR0aChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8pDQorew0KKyAgICBGWF9GTE9BVCBmTGVmdE1hcmdpbiA9IDAsIGZSaWdodE1hcmdpbiA9IDA7DQorICAgIEZYX0JPT0wgYkxlZnRNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fTGVmdCwgZkxlZnRNYXJnaW4pOw0KKyAgICBGWF9CT09MIGJSaWdodE1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9SaWdodCwgZlJpZ2h0TWFyZ2luKTsNCisgICAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRBdXRvOw0KKyAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KKyAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gcnRBdXRvLndpZHRoOw0KKyAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIGZXaWR0aCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlRvdGFsID0gcEluZm8tPm1fZkFjdHVhbFdpZHRoOw0KKyAgICBpZiAoYkxlZnRNYXJnaW4pIHsNCisgICAgICAgIGZUb3RhbCArPSBmTGVmdE1hcmdpbjsNCisgICAgfQ0KKyAgICBpZiAoYlJpZ2h0TWFyZ2luKSB7DQorICAgICAgICBmVG90YWwgKz0gZlJpZ2h0TWFyZ2luOw0KKyAgICB9DQorICAgIHJldHVybiBmVG90YWw7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6Q2FsY0F1dG9Db2x1bW5XaWRnZXRIZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvKQ0KK3sNCisgICAgRlhfRkxPQVQgZlRvcE1hcmdpbiA9IDAsIGZCb3R0b21NYXJnaW4gPSAwOw0KKyAgICBGWF9CT09MIGJUb3BNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fVG9wLCBmVG9wTWFyZ2luKTsNCisgICAgRlhfQk9PTCBiQm90dG9tTWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0JvdHRvbSwgZkJvdHRvbU1hcmdpbik7DQorICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KKyAgICAgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCisgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBydEF1dG8uaGVpZ2h0Ow0KKyAgICAgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBmSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVG90YWwgPSBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0Ow0KKyAgICBpZiAoYlRvcE1hcmdpbikgew0KKyAgICAgICAgZlRvdGFsICs9IGZUb3BNYXJnaW47DQorICAgIH0NCisgICAgaWYgKGJCb3R0b21NYXJnaW4pIHsNCisgICAgICAgIGZUb3RhbCArPSBmQm90dG9tTWFyZ2luOw0KKyAgICB9DQorICAgIHJldHVybiBmVG90YWw7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6UHJvY2Vzc0NvbHVtbnMoRlhfRkxPQVQgZldpZHRoKQ0KK3sNCisgICAgaWYgKGZXaWR0aCA8PSAwKSB7DQorICAgICAgICByZXR1cm4gUHJvY2Vzc1VuQ2VydGFpbkNvbHVtbnMoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ29sdW1ucyA9IG1fQ29sdW1ucy5HZXRTaXplKCk7DQorICAgIGlmIChpQ29sdW1ucyA8IDEpIHsNCisgICAgICAgIHJldHVybiBmV2lkdGg7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkZpeGVkV2lkdGggPSAwOw0KKyAgICBGWF9GTE9BVCBmQXV0b1dpZHRoID0gMDsNCisgICAgQ0ZYX1B0ckFycmF5IGF1dG9Db2x1bW5zOw0KKyAgICBDRlhfUHRyQXJyYXkgc2NhbGVkQ29sdW1uczsNCisgICAgRlhfRkxPQVQgZlNjYWxlZENvbHVtbk51bSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQorICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaChwQ29sUm93LT5tX1NpemUuZVVuaXQpIHsNCisgICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9GaXhlZDogew0KKyAgICAgICAgICAgICAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQorICAgICAgICAgICAgICAgICAgICBmRml4ZWRXaWR0aCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQorICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgIGF1dG9Db2x1bW5zLkFkZChwQ29sUm93KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfU2NhbGVkOg0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGZTY2FsZWRDb2x1bW5OdW0gKz0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICBzY2FsZWRDb2x1bW5zLkFkZChwQ29sUm93KTsNCisgICAgICAgICAgICAgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgMCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faUNvbHVtblNwYW4gPCAyKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Db2x1bW5zOw0KKyAgICAgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGlBdXRvQ29sUm93cyA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpU2NhbGVkQ29sUm93cyA9IDA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgcEluZm8tPm1faUNvbHVtblNwYW47IGkrKykgew0KKyAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uICsgaSk7DQorICAgICAgICAgICAgaWYgKCFwQ29sdW1uKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmU3BhblNpemUgKz0gcENvbHVtbi0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgICAgICBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9BdXRvKSB7DQorICAgICAgICAgICAgICAgIGlBdXRvQ29sUm93cysrOw0KKyAgICAgICAgICAgICAgICBzcGFuQXV0b0NvbHVtbnMuQWRkKHBDb2x1bW4pOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCisgICAgICAgICAgICAgICAgaVNjYWxlZENvbFJvd3MrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUF1dG9Db2xSb3dzIDwgMSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZldpZGdldFdpZHRoID0gQ2FsY0F1dG9Db2x1bW5XaWRnZXRXaWR0aChwV2lkZ2V0LCBwSW5mbyk7DQorICAgICAgICBpZiAoZldpZGdldFdpZHRoID4gZlNwYW5TaXplKSB7DQorICAgICAgICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCkgew0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShzcGFuQXV0b0NvbHVtbnMsIGZXaWRnZXRXaWR0aCAtIGZTcGFuU2l6ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlBdXRvQ29scyA9IGF1dG9Db2x1bW5zLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IGlBdXRvQ29sczsgaysrKSB7DQorICAgICAgICBmQXV0b1dpZHRoICs9ICgoQ0ZXTF9HcmlkQ29sUm93KilhdXRvQ29sdW1uc1trXSktPm1fZkFjdHVhbFNpemU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlNjYWxlZFdpZHRoID0gZldpZHRoIC0gZkZpeGVkV2lkdGggLSBmQXV0b1dpZHRoOw0KKyAgICBpZiAoZlNjYWxlZFdpZHRoID4gMCAmJiBmU2NhbGVkQ29sdW1uTnVtID4gMCkgew0KKyAgICAgICAgU2V0U2NhbGVkQ29sUm93c1NpemUoc2NhbGVkQ29sdW1ucywgZlNjYWxlZFdpZHRoLCBmU2NhbGVkQ29sdW1uTnVtKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlByb2Nlc3NSb3dzKEZYX0ZMT0FUIGZIZWlnaHQpDQorew0KKyAgICBpZiAoZkhlaWdodCA8PSAwKSB7DQorICAgICAgICByZXR1cm4gUHJvY2Vzc1VuQ2VydGFpblJvd3MoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUm93cyA9IG1fUm93cy5HZXRTaXplKCk7DQorICAgIGlmIChpUm93cyA8IDEpIHsNCisgICAgICAgIHJldHVybiBmSGVpZ2h0Ow0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZGaXhlZEhlaWdodCA9IDA7DQorICAgIEZYX0ZMT0FUIGZBdXRvSGVpZ3QgPSAwOw0KKyAgICBDRlhfUHRyQXJyYXkgYXV0b1Jvd3M7DQorICAgIENGWF9QdHJBcnJheSBzY2FsZWRSb3dzOw0KKyAgICBGWF9GTE9BVCBmU2NhbGVkUm93TnVtID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlSb3dzOyBpKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fUm93c1tpXTsNCisgICAgICAgIGlmICghcENvbFJvdykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICAgICAgICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgICAgIGZGaXhlZEhlaWdodCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQorICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICBhdXRvUm93cy5BZGQocENvbFJvdyk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX1NjYWxlZDoNCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICBmU2NhbGVkUm93TnVtICs9IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgc2NhbGVkUm93cy5BZGQocENvbFJvdyk7DQorICAgICAgICAgICAgICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIDApOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faVJvd1NwYW4gPCAyKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Sb3dzOw0KKyAgICAgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGlBdXRvQ29sUm93cyA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpU2NhbGVkQ29sUm93cyA9IDA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgcEluZm8tPm1faVJvd1NwYW47IGkrKykgew0KKyAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGkpOw0KKyAgICAgICAgICAgIGlmICghcFJvdykgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZlNwYW5TaXplICs9IHBSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgICAgICAgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfQXV0bykgew0KKyAgICAgICAgICAgICAgICBpQXV0b0NvbFJvd3MrKzsNCisgICAgICAgICAgICAgICAgc3BhbkF1dG9Sb3dzLkFkZChwUm93KTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfU2NhbGVkKSB7DQorICAgICAgICAgICAgICAgIGlTY2FsZWRDb2xSb3dzKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZXaWRnZXRIZWlnaHQgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQorICAgICAgICBpZiAoZldpZGdldEhlaWdodCA+IGZTcGFuU2l6ZSkgew0KKyAgICAgICAgICAgIGlmIChpU2NhbGVkQ29sUm93cyA+IDApIHsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoc3BhbkF1dG9Sb3dzLCBmV2lkZ2V0SGVpZ2h0IC0gZlNwYW5TaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUF1dG9Sb3dzID0gYXV0b1Jvd3MuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGsgPSAwOyBrIDwgaUF1dG9Sb3dzOyBrKyspIHsNCisgICAgICAgIGZBdXRvSGVpZ3QgKz0gKChDRldMX0dyaWRDb2xSb3cqKWF1dG9Sb3dzW2tdKS0+bV9mQWN0dWFsU2l6ZTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmU2NhbGVkSGVpZ2h0ID0gZkhlaWdodCAtIGZGaXhlZEhlaWdodCAtIGZBdXRvSGVpZ3Q7DQorICAgIGlmIChmU2NhbGVkSGVpZ2h0ID4gMCAmJiBmU2NhbGVkUm93TnVtID4gMCkgew0KKyAgICAgICAgU2V0U2NhbGVkQ29sUm93c1NpemUoc2NhbGVkUm93cywgZlNjYWxlZEhlaWdodCwgZlNjYWxlZFJvd051bSk7DQorICAgIH0NCisgICAgcmV0dXJuIGZIZWlnaHQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6UHJvY2Vzc1VuQ2VydGFpbkNvbHVtbnMoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaUNvbHVtbnMgPCAxKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSBuZXcgQ0ZXTF9HcmlkQ29sUm93Ow0KKyAgICAgICAgcENvbFJvdy0+bV9TaXplLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCAwLCBUUlVFKTsNCisgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgICBkZWxldGUgcENvbFJvdzsNCisgICAgICAgIHJldHVybiBmV2lkdGg7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkZpeGVkV2lkdGggPSAwOw0KKyAgICBDRlhfUHRyQXJyYXkgYXV0b0NvbHVtbnM7DQorICAgIENGWF9QdHJBcnJheSBzY2FsZWRDb2x1bW5zOw0KKyAgICBGWF9GTE9BVCBmU2NhbGVkQ29sdW1uTnVtID0gMDsNCisgICAgRlhfRkxPQVQgZlNjYWxlZE1heFBlcldpZHRoID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb2x1bW5zOyBpKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fQ29sdW1uc1tpXTsNCisgICAgICAgIGlmICghcENvbFJvdykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICAgICAgICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgICAgIGZGaXhlZFdpZHRoICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX0F1dG86IHsNCisgICAgICAgICAgICAgICAgICAgIFByb2NBdXRvQ29sUm93KHBDb2xSb3csIGksIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgYXV0b0NvbHVtbnMuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICBmU2NhbGVkQ29sdW1uTnVtICs9IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgc2NhbGVkQ29sdW1ucy5BZGQocENvbFJvdyk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocENvbFJvdy0+bV9TaXplLmZMZW5ndGggPD0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlcldpZHRoID0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSAvIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZQZXJXaWR0aCA+IGZTY2FsZWRNYXhQZXJXaWR0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZTY2FsZWRNYXhQZXJXaWR0aCA9IGZQZXJXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlDb2x1bW5zID0gc2NhbGVkQ29sdW1ucy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpQ29sdW1uczsgaisrKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilzY2FsZWRDb2x1bW5zW2pdOw0KKyAgICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIGZTY2FsZWRNYXhQZXJXaWR0aCAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faUNvbHVtblNwYW4gPCAyKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Db2x1bW5zOw0KKyAgICAgICAgQ0ZYX1B0ckFycmF5IHNwYW5TY2FsZWRDb2x1bW5zOw0KKyAgICAgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIGZTY2FsZWRTdW0gPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaUF1dG9Db2xSb3dzID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGlTY2FsZWRDb2xSb3dzID0gMDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBwSW5mby0+bV9pQ29sdW1uU3BhbjsgaSsrKSB7DQorICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sdW1uID0gKENGV0xfR3JpZENvbFJvdyopR2V0Q29sUm93KFRSVUUsIHBJbmZvLT5tX2lDb2x1bW4gKyBpKTsNCisgICAgICAgICAgICBpZiAoIXBDb2x1bW4pIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZTcGFuU2l6ZSArPSBwQ29sdW1uLT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgICAgIGlmIChwQ29sdW1uLT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0F1dG8pIHsNCisgICAgICAgICAgICAgICAgaUF1dG9Db2xSb3dzKys7DQorICAgICAgICAgICAgICAgIHNwYW5BdXRvQ29sdW1ucy5BZGQocENvbHVtbik7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwQ29sdW1uLT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX1NjYWxlZCkgew0KKyAgICAgICAgICAgICAgICBpU2NhbGVkQ29sUm93cysrOw0KKyAgICAgICAgICAgICAgICBmU2NhbGVkU3VtICs9IHBDb2x1bW4tPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICBzcGFuU2NhbGVkQ29sdW1ucy5BZGQocENvbHVtbik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEgJiYgaVNjYWxlZENvbFJvd3MgPCAxKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmV2lkZ2V0V2lkdGggPSBDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKHBXaWRnZXQsIHBJbmZvKTsNCisgICAgICAgIGlmIChmV2lkZ2V0V2lkdGggPiBmU3BhblNpemUpIHsNCisgICAgICAgICAgICBpZiAoaVNjYWxlZENvbFJvd3MgPiAwICkgew0KKyAgICAgICAgICAgICAgICBpZiAoZlNjYWxlZFN1bSA8PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShzcGFuU2NhbGVkQ29sdW1ucywgZldpZGdldFdpZHRoIC0gZlNwYW5TaXplLCBmU2NhbGVkU3VtKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoc3BhbkF1dG9Db2x1bW5zLCBmV2lkZ2V0V2lkdGggLSBmU3BhblNpemUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmQXV0b1dpZHRoID0gMDsNCisgICAgRlhfSU5UMzIgaUF1dG9Db2xzID0gYXV0b0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIG0gPSAwOyBtIDwgaUF1dG9Db2xzOyBtKyspIHsNCisgICAgICAgIGZBdXRvV2lkdGggKz0gKChDRldMX0dyaWRDb2xSb3cqKWF1dG9Db2x1bW5zW21dKS0+bV9mQWN0dWFsU2l6ZTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmU2NhbGVkV2lkdGggPSAwOw0KKyAgICBpQ29sdW1ucyA9IHNjYWxlZENvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIG4gPSAwOyBuIDwgaUNvbHVtbnM7IG4rKykgew0KKyAgICAgICAgZlNjYWxlZFdpZHRoICs9ICgoQ0ZXTF9HcmlkQ29sUm93KilzY2FsZWRDb2x1bW5zW25dKS0+bV9mQWN0dWFsU2l6ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gZkZpeGVkV2lkdGggKyBmQXV0b1dpZHRoICsgZlNjYWxlZFdpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlByb2Nlc3NVbkNlcnRhaW5Sb3dzKCkNCit7DQorICAgIEZYX0lOVDMyIGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCisgICAgaWYgKGlSb3dzIDwgMSkgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gbmV3IENGV0xfR3JpZENvbFJvdzsNCisgICAgICAgIHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgMCwgRkFMU0UpOw0KKyAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgIGRlbGV0ZSBwQ29sUm93Ow0KKyAgICAgICAgcmV0dXJuIGZXaWR0aDsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmRml4ZWRIZWlnaHQgPSAwOw0KKyAgICBDRlhfUHRyQXJyYXkgYXV0b1Jvd3M7DQorICAgIENGWF9QdHJBcnJheSBzY2FsZWRSb3dzOw0KKyAgICBGWF9GTE9BVCBmU2NhbGVkUm93TnVtID0gMDsNCisgICAgRlhfRkxPQVQgZlNjYWxlZE1heFBlckhlaWdodCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpUm93czsgaSsrKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX1Jvd3NbaV07DQorICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaChwQ29sUm93LT5tX1NpemUuZVVuaXQpIHsNCisgICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9GaXhlZDogew0KKyAgICAgICAgICAgICAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQorICAgICAgICAgICAgICAgICAgICBmRml4ZWRIZWlnaHQgKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfQXV0bzogew0KKyAgICAgICAgICAgICAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgYXV0b1Jvd3MuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgZlNjYWxlZFJvd051bSArPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgIHNjYWxlZFJvd3MuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZXJIZWlnaHQgPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplIC8gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZQZXJIZWlnaHQgPiBmU2NhbGVkTWF4UGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZTY2FsZWRNYXhQZXJIZWlnaHQgPSBmUGVySGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaVJvd3MgPSBzY2FsZWRSb3dzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlSb3dzOyBqKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKXNjYWxlZFJvd3Nbal07DQorICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgZlNjYWxlZE1heFBlckhlaWdodCAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgICAgIGlmIChwSW5mby0+bV9pUm93U3BhbiA8IDIpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9QdHJBcnJheSBzcGFuQXV0b1Jvd3M7DQorICAgICAgICBDRlhfUHRyQXJyYXkgc3BhblNjYWxlZFJvd3M7DQorICAgICAgICBGWF9GTE9BVCBmU3BhblNpemUgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgZlNjYWxlZFN1bSA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpQXV0b0NvbFJvd3MgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaVNjYWxlZENvbFJvd3MgPSAwOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHBJbmZvLT5tX2lSb3dTcGFuOyBpKyspIHsNCisgICAgICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coRkFMU0UsIHBJbmZvLT5tX2lSb3cgKyBpKTsNCisgICAgICAgICAgICBpZiAoIXBSb3cpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZTcGFuU2l6ZSArPSBwUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgICAgIGlmIChwUm93LT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0F1dG8pIHsNCisgICAgICAgICAgICAgICAgaUF1dG9Db2xSb3dzKys7DQorICAgICAgICAgICAgICAgIHNwYW5BdXRvUm93cy5BZGQocFJvdyk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwUm93LT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX1NjYWxlZCkgew0KKyAgICAgICAgICAgICAgICBpU2NhbGVkQ29sUm93cysrOw0KKyAgICAgICAgICAgICAgICBmU2NhbGVkU3VtICs9IHBSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgICAgICAgICBzcGFuU2NhbGVkUm93cy5BZGQocFJvdyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEgJiYgaVNjYWxlZENvbFJvd3MgPCAxKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmV2lkZ2V0SGVpZ2h0ID0gQ2FsY0F1dG9Db2x1bW5XaWRnZXRIZWlnaHQocFdpZGdldCwgcEluZm8pOw0KKyAgICAgICAgaWYgKGZXaWRnZXRIZWlnaHQgPiBmU3BhblNpemUpIHsNCisgICAgICAgICAgICBpZiAoaVNjYWxlZENvbFJvd3MgPiAwKSB7DQorICAgICAgICAgICAgICAgIGlmIChmU2NhbGVkU3VtIDw9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFNldFNwYW5TY2FsZWRDb2xSb3dTaXplKHNwYW5TY2FsZWRSb3dzLCBmV2lkZ2V0SGVpZ2h0IC0gZlNwYW5TaXplLCBmU2NhbGVkU3VtKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoc3BhbkF1dG9Sb3dzLCBmV2lkZ2V0SGVpZ2h0IC0gZlNwYW5TaXplKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkF1dG9IZWlndCA9IDA7DQorICAgIEZYX0lOVDMyIGlBdXRvUm93cyA9IGF1dG9Sb3dzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBtID0gMDsgbSA8IGlBdXRvUm93czsgbSsrKSB7DQorICAgICAgICBmQXV0b0hlaWd0ICs9ICgoQ0ZXTF9HcmlkQ29sUm93KilhdXRvUm93c1ttXSktPm1fZkFjdHVhbFNpemU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlNjYWxlZEhlaWdodCA9IDA7DQorICAgIGlSb3dzID0gc2NhbGVkUm93cy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgbiA9IDA7IG4gPCBpUm93czsgbisrKSB7DQorICAgICAgICBmU2NhbGVkSGVpZ2h0ICs9ICgoQ0ZXTF9HcmlkQ29sUm93KilzY2FsZWRSb3dzW25dKS0+bV9mQWN0dWFsU2l6ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gZkZpeGVkSGVpZ2h0ICsgZkF1dG9IZWlndCArIGZTY2FsZWRIZWlnaHQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpTZXRDb2xSb3dBY3R1YWxTaXplKENGV0xfR3JpZENvbFJvdyogcENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZYX0JPT0wgYlNldEJleW9uZCApDQorew0KKyAgICBpZiAocENvbFJvdy0+bV9NaW5TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCAmJiBmU2l6ZSA8IHBDb2xSb3ctPm1fTWluU2l6ZS5mTGVuZ3RoKSB7DQorICAgICAgICBwQ29sUm93LT5tX2ZBY3R1YWxTaXplID0gcENvbFJvdy0+bV9NaW5TaXplLmZMZW5ndGg7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBDb2xSb3ctPm1fTWF4U2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYgZlNpemUgPiBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aCkgew0KKyAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSA9IHBDb2xSb3ctPm1fTWF4U2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChiU2V0QmV5b25kKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBwQ29sUm93LT5tX2ZBY3R1YWxTaXplID0gZlNpemU7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlNldFdpZGdldEFjdHVhbFdpZHRoKENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvLCBGWF9GTE9BVCBmV2lkdGgpDQorew0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCAmJg0KKyAgICAgICAgICAgIGZXaWR0aCA8IHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5mTGVuZ3RoKSB7DQorICAgICAgICBmV2lkdGggPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aDsNCisgICAgfQ0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCAmJg0KKyAgICAgICAgICAgIGZXaWR0aCA+IHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5mTGVuZ3RoKSB7DQorICAgICAgICBmV2lkdGggPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZkxlbmd0aDsNCisgICAgfQ0KKyAgICBwSW5mby0+bV9mQWN0dWFsV2lkdGggPSBmV2lkdGg7DQorICAgIHJldHVybiBmV2lkdGg7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6U2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvLCBGWF9GTE9BVCBmSGVpZ2h0KQ0KK3sNCisgICAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkICYmDQorICAgICAgICAgICAgZkhlaWdodCA8IHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZkxlbmd0aCkgew0KKyAgICAgICAgZkhlaWdodCA9IHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZkxlbmd0aDsNCisgICAgfQ0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICAgICAgICBmSGVpZ2h0ID4gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoKSB7DQorICAgICAgICBmSGVpZ2h0ID0gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoOw0KKyAgICB9DQorICAgIHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQgPSBmSGVpZ2h0Ow0KKyAgICByZXR1cm4gZkhlaWdodDsNCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlNldEFsbFdpZGdldHNSZWN0KCkNCit7DQorICAgIEZYX0ZMT0FUIGZTdGFydExlZnQgPSAwOw0KKyAgICBGWF9JTlQzMiBpQ29sdW1ucyA9IG1fQ29sdW1ucy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQorICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFBvcyA9IGZTdGFydExlZnQ7DQorICAgICAgICBmU3RhcnRMZWZ0ICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlN0YXJ0VG9wID0gMDsNCisgICAgRlhfSU5UMzIgaVJvd3MgPSBtX1Jvd3MuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVJvd3M7IGorKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Sb3dzW2pdOw0KKyAgICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwQ29sUm93LT5tX2ZBY3R1YWxQb3MgPSBmU3RhcnRUb3A7DQorICAgICAgICBmU3RhcnRUb3AgKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgICAgIGlmICghcFdpZGdldCB8fCAhcEluZm8pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZDb2x1bW5TdGFydCA9IDA7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2x1bW4gPSAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coVFJVRSwgcEluZm8tPm1faUNvbHVtbik7DQorICAgICAgICBpZiAocENvbHVtbikgew0KKyAgICAgICAgICAgIGZDb2x1bW5TdGFydCA9IHBDb2x1bW4tPm1fZkFjdHVhbFBvczsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZSb3dTdGFydCA9IDA7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coRkFMU0UsIHBJbmZvLT5tX2lSb3cpOw0KKyAgICAgICAgaWYgKHBSb3cpIHsNCisgICAgICAgICAgICBmUm93U3RhcnQgPSBwUm93LT5tX2ZBY3R1YWxQb3M7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmQ29sdW1uV2lkdGggPSAwOw0KKyAgICAgICAgaWYgKGlDb2x1bW5zID4gMCkgew0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBwSW5mby0+bV9pQ29sdW1uU3BhbjsgaisrKSB7DQorICAgICAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbCA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uICsgaik7DQorICAgICAgICAgICAgICAgIGlmICghcENvbCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZkNvbHVtbldpZHRoICs9IHBDb2wtPm1fZkFjdHVhbFNpemU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmQ29sdW1uV2lkdGggPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZlJvd0hlaWdodCA9IDA7DQorICAgICAgICBpZiAoaVJvd3MgPiAwKSB7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IHBJbmZvLT5tX2lSb3dTcGFuOyBrKyspIHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwUiA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGspOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBSKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmUm93SGVpZ2h0ICs9IHBSLT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZlJvd0hlaWdodCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZkxlZnRNYXJnaW4gPSAwLCBmUmlnaHRNYXJnaW4gPSAwOw0KKyAgICAgICAgRlhfQk9PTCBiTGVmdE1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9MZWZ0LCBmTGVmdE1hcmdpbik7DQorICAgICAgICBGWF9CT09MIGJSaWdodE1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9SaWdodCwgZlJpZ2h0TWFyZ2luKTsNCisgICAgICAgIEZYX0ZMT0FUIGZUb3BNYXJnaW4gPSAwLCBmQm90dG9tTWFyZ2luID0gMDsNCisgICAgICAgIEZYX0JPT0wgYlRvcE1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Ub3AsIGZUb3BNYXJnaW4pOw0KKyAgICAgICAgRlhfQk9PTCBiQm90dG9tTWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0JvdHRvbSwgZkJvdHRvbU1hcmdpbik7DQorICAgICAgICBGV0xfTEFZT1VUREFUQSBsdGQ7DQorICAgICAgICBsdGQuZldpZHRoID0gMDsNCisgICAgICAgIGx0ZC5mSGVpZ2h0ID0gMDsNCisgICAgICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgICAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoKTsNCisgICAgICAgICAgICBsdGQuZldpZHRoID0gcEluZm8tPm1fZkFjdHVhbFdpZHRoOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoYkxlZnRNYXJnaW4gJiYgYlJpZ2h0TWFyZ2luKSB7DQorICAgICAgICAgICAgICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBmQ29sdW1uV2lkdGggLSBmTGVmdE1hcmdpbiAtIGZSaWdodE1hcmdpbik7DQorICAgICAgICAgICAgICAgIGx0ZC5mV2lkdGggPSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgICAgICAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KKyAgICAgICAgICAgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgIHJ0QXV0by53aWR0aCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgICAgICAgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGgpOw0KKyAgICAgICAgICAgIGx0ZC5mSGVpZ2h0ID0gcEluZm8tPm1fZkFjdHVhbEhlaWdodDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGJUb3BNYXJnaW4gJiYgYkJvdHRvbU1hcmdpbikgew0KKyAgICAgICAgICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIGZSb3dIZWlnaHQgLSBmVG9wTWFyZ2luIC0gZkJvdHRvbU1hcmdpbik7DQorICAgICAgICAgICAgICAgIGx0ZC5mSGVpZ2h0ID0gcEluZm8tPm1fZkFjdHVhbEhlaWdodDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRBdXRvOw0KKyAgICAgICAgICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQorICAgICAgICAgICAgICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgcnRBdXRvLmhlaWdodCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJMZWZ0TWFyZ2luICYmIGJSaWdodE1hcmdpbiAmJiBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgICAgICAgICAgZkxlZnRNYXJnaW4gPSBmQ29sdW1uU3RhcnQgKyBmTGVmdE1hcmdpbiArIChmQ29sdW1uV2lkdGggLSBmTGVmdE1hcmdpbiAtIGZSaWdodE1hcmdpbiAtIHBJbmZvLT5tX2ZBY3R1YWxXaWR0aCkgLyAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChiTGVmdE1hcmdpbikgew0KKyAgICAgICAgICAgIGZMZWZ0TWFyZ2luID0gZkNvbHVtblN0YXJ0ICsgZkxlZnRNYXJnaW47DQorICAgICAgICB9IGVsc2UgaWYgKGJSaWdodE1hcmdpbikgew0KKyAgICAgICAgICAgIGZMZWZ0TWFyZ2luID0gZkNvbHVtblN0YXJ0ICsgZkNvbHVtbldpZHRoICAtIGZSaWdodE1hcmdpbiAtIHBJbmZvLT5tX2ZBY3R1YWxXaWR0aDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZkxlZnRNYXJnaW4gPSBmQ29sdW1uU3RhcnQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlRvcE1hcmdpbiAmJiBiQm90dG9tTWFyZ2luICYmIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgICAgICAgICAgZlRvcE1hcmdpbiA9IGZSb3dTdGFydCArIGZUb3BNYXJnaW4gKyAoZlJvd0hlaWdodCAtIGZUb3BNYXJnaW4gLSBmQm90dG9tTWFyZ2luIC0gcEluZm8tPm1fZkFjdHVhbEhlaWdodCkgLyAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChiVG9wTWFyZ2luKSB7DQorICAgICAgICAgICAgZlRvcE1hcmdpbiA9IGZSb3dTdGFydCArIGZUb3BNYXJnaW47DQorICAgICAgICB9IGVsc2UgaWYgKGJCb3R0b21NYXJnaW4pIHsNCisgICAgICAgICAgICBmVG9wTWFyZ2luID0gZlJvd1N0YXJ0ICsgZlJvd0hlaWdodCAtIGZCb3R0b21NYXJnaW4gLSBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmVG9wTWFyZ2luID0gZlJvd1N0YXJ0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LCBydE9sZDsNCisgICAgICAgIHJ0V2lkZ2V0LlNldChmTGVmdE1hcmdpbiwgZlRvcE1hcmdpbiwgcEluZm8tPm1fZkFjdHVhbFdpZHRoLCBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0KTsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRPbGQpOw0KKyAgICAgICAgaWYgKHJ0V2lkZ2V0ID09IHJ0T2xkKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwV2lkZ2V0LT5TZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgICAgICAgIGlmIChydFdpZGdldC53aWR0aCA9PSBydE9sZC53aWR0aCAmJiBydFdpZGdldC5oZWlnaHQgPT0gcnRPbGQuaGVpZ2h0KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwV2lkZ2V0LT5VcGRhdGUoKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENGV0xfR3JpZEltcDo6SXNHcmlkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkOw0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6U2V0U3BhbkF1dG9Db2xSb3dTaXplKGNvbnN0IENGWF9QdHJBcnJheSAmc3BhbkF1dG9zLCBGWF9GTE9BVCBmVG90YWxTaXplKQ0KK3sNCisgICAgRlhfSU5UMzIgaUF1dG9Db2xSb3dzID0gc3BhbkF1dG9zLkdldFNpemUoKTsNCisgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgYXV0b05vTWluTWF4czsNCisgICAgRlhfRkxPQVQgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaUF1dG9Db2xSb3dzOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaUF1dG9Db2xSb3dzOyBqKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKXNwYW5BdXRvc1tqXTsNCisgICAgICAgIEZYX0ZMT0FUIGZPcmdTaXplID0gcENvbHVtbi0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgIGlmIChTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2x1bW4sIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKyBmQXV0b1BlciwgVFJVRSkpIHsNCisgICAgICAgICAgICBhdXRvTm9NaW5NYXhzLkFkZChwQ29sdW1uKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZlRvdGFsU2l6ZSAtPSBwQ29sdW1uLT5tX2ZBY3R1YWxTaXplIC0gZk9yZ1NpemU7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU5vTWluTWF4ID0gaUF1dG9Db2xSb3dzIC0gKGogKyAxIC0gYXV0b05vTWluTWF4cy5HZXRTaXplKCkpOw0KKyAgICAgICAgICAgIGlmIChpTm9NaW5NYXggPiAwICYmIGZUb3RhbFNpemUgPiAwKSB7DQorICAgICAgICAgICAgICAgIGZBdXRvUGVyID0gZlRvdGFsU2l6ZSAvIGlOb01pbk1heDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCisgICAgaWYgKGZUb3RhbFNpemUgPiAwKSB7DQorICAgICAgICBpZiAoaU5vcm1hbHMgPT0gaUF1dG9Db2xSb3dzKSB7DQorICAgICAgICAgICAgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaU5vcm1hbHM7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IGlOb3JtYWxzOyBrKyspIHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sdW1uID0gKENGV0xfR3JpZENvbFJvdyopYXV0b05vTWluTWF4c1trXTsNCisgICAgICAgICAgICAgICAgcENvbHVtbi0+bV9mQWN0dWFsU2l6ZSArPSBmQXV0b1BlcjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShhdXRvTm9NaW5NYXhzLCBmVG90YWxTaXplKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6U2V0U3BhblNjYWxlZENvbFJvd1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5ICZzcGFuU2NhbGVkcywgRlhfRkxPQVQgZlRvdGFsU2l6ZSwgRlhfRkxPQVQgZlRvdGFsU2NhbGVkTnVtKQ0KK3sNCisgICAgRlhfSU5UMzIgaVNjYWxlZENvbFJvd3MgPSBzcGFuU2NhbGVkcy5HZXRTaXplKCk7DQorICAgIGlmIChpU2NhbGVkQ29sUm93cyA8IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgYXV0b05vTWluTWF4czsNCisgICAgRlhfRkxPQVQgZlBlclNpemUgPSBmVG90YWxTaXplIC8gZlRvdGFsU2NhbGVkTnVtOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNjYWxlZENvbFJvd3M7IGkrKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopc3BhblNjYWxlZHNbaV07DQorICAgICAgICBpZiAoU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBwQ29sUm93LT5tX2ZBY3R1YWxTaXplICsgZlBlclNpemUgKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCwgVFJVRSkpIHsNCisgICAgICAgICAgICBhdXRvTm9NaW5NYXhzLkFkZChwQ29sUm93KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZlRvdGFsU2l6ZSAtPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgICAgIGZUb3RhbFNjYWxlZE51bSAtPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTm9NaW5NYXggPSBpU2NhbGVkQ29sUm93cyAtIChpICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCisgICAgICAgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KKyAgICAgICAgICAgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlOb3JtYWxzID0gYXV0b05vTWluTWF4cy5HZXRTaXplKCk7DQorICAgIGlmIChmVG90YWxTaXplID4gMCkgew0KKyAgICAgICAgaWYgKGlOb3JtYWxzID09IGlTY2FsZWRDb2xSb3dzKSB7DQorICAgICAgICAgICAgZlBlclNpemUgPSBmVG90YWxTaXplIC8gZlRvdGFsU2NhbGVkTnVtOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpTm9ybWFsczsgaisrKSB7DQorICAgICAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKWF1dG9Ob01pbk1heHNbal07DQorICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKz0gZlBlclNpemUgKiBwQ29sdW1uLT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFNldFNwYW5TY2FsZWRDb2xSb3dTaXplKGF1dG9Ob01pbk1heHMsIGZUb3RhbFNpemUsIGZUb3RhbFNjYWxlZE51bSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgIH0NCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlNldFNjYWxlZENvbFJvd3NTaXplKGNvbnN0IENGWF9QdHJBcnJheSAmc3BhblNjYWxlZHMsIEZYX0ZMT0FUIGZUb3RhbFNpemUsIEZYX0ZMT0FUIGZUb3RhbFNjYWxlZE51bSkNCit7DQorICAgIEZYX0lOVDMyIGlTY2FsZWRDb2xSb3dzID0gc3BhblNjYWxlZHMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaVNjYWxlZENvbFJvd3MgPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IGF1dG9Ob01pbk1heHM7DQorICAgIEZYX0ZMT0FUIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTY2FsZWRDb2xSb3dzOyBpKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKXNwYW5TY2FsZWRzW2ldOw0KKyAgICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmU2l6ZSA9IGZQZXJTaXplICogcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICBGWF9GTE9BVCBmT3JnU2l6ZSA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgICBpZiAoU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmU2l6ZSwgVFJVRSkpIHsNCisgICAgICAgICAgICBhdXRvTm9NaW5NYXhzLkFkZChwQ29sUm93KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZlRvdGFsU2l6ZSAtPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplIC0gZk9yZ1NpemU7DQorICAgICAgICAgICAgZlRvdGFsU2NhbGVkTnVtIC09IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlOb01pbk1heCA9IGlTY2FsZWRDb2xSb3dzIC0gKGkgKyAxIC0gYXV0b05vTWluTWF4cy5HZXRTaXplKCkpOw0KKyAgICAgICAgICAgIGlmIChpTm9NaW5NYXggPiAwICYmIGZUb3RhbFNpemUgPiAwKSB7DQorICAgICAgICAgICAgICAgIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCisgICAgaWYgKGZUb3RhbFNpemUgPiAwKSB7DQorICAgICAgICBpZiAoaU5vcm1hbHMgPT0gaVNjYWxlZENvbFJvd3MpIHsNCisgICAgICAgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlOb3JtYWxzOyBpKyspIHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopYXV0b05vTWluTWF4c1tpXTsNCisgICAgICAgICAgICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSA9IGZQZXJTaXplICogcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICAgICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBmU2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFNldFNjYWxlZENvbFJvd3NTaXplKGF1dG9Ob01pbk1heHMsIGZUb3RhbFNpemUsIGZUb3RhbFNjYWxlZE51bSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgIH0NCit9DQorQ0ZXTF9HcmlkRGVsZWdhdGU6OkNGV0xfR3JpZERlbGVnYXRlKENGV0xfR3JpZEltcCAqcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfR3JpZERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSAhPSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgaWYgKHBNc2ctPm1fZHdDbWQgIT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQorRldMX0VSUglDRldMX0dyaWREZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfbm90ZWltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfbm90ZWltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmMGMxMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ub3RlaW1wLmNwcApAQCAtMCwwICsxLDExMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2Zvcm1pbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorI2luY2x1ZGUgIi4uLy4uL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgiDQorQ0ZXTF9Ob3RlTG9vcDo6Q0ZXTF9Ob3RlTG9vcChDRldMX1dpZGdldEltcCAqcEZvcm0gKQ0KKyAgICA6IG1fcEZvcm0ocEZvcm0pDQorICAgICwgbV9iQ29udGludWVNb2RhbChUUlVFKQ0KK3sNCit9DQorRlhfQk9PTCBDRldMX05vdGVMb29wOjpQcmVQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgaWYgKCFtX3BGb3JtKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIFRyYW5zbGF0ZUFjY2VsZXJhdG9yKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUglDRldMX05vdGVMb29wOjpJZGxlKEZYX0lOVDMyIGNvdW50KQ0KK3sNCisjaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykNCisgICAgaWYgKGNvdW50IDw9IDApDQorI2VuZGlmDQorICAgIHsNCisgICAgICAgIENGV0xfRXZ0SWRsZSBldjsNCisgICAgICAgIElGV0xfQXBwICpwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQXBwLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgSUZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gcEFwcC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRHJpdmVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgcERyaXZlci0+U2VuZE5vdGUoJmV2KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCitDRldMX1dpZGdldEltcCogQ0ZXTF9Ob3RlTG9vcDo6R2V0Rm9ybSgpDQorew0KKyAgICByZXR1cm4gbV9wRm9ybTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVMb29wOjpDb250aW51ZU1vZGFsKCkNCit7DQorICAgIHJldHVybiBtX2JDb250aW51ZU1vZGFsOw0KK30NCitGV0xfRVJSCUNGV0xfTm90ZUxvb3A6OkVuZE1vZGFsTG9vcCgpDQorew0KKyAgICBtX2JDb250aW51ZU1vZGFsID0gRkFMU0U7DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyICogYWRhcHRlcldpZGdldE1nciA9IHBXaWRnZXRNZ3ItPkdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCisgICAgYWRhcHRlcldpZGdldE1nci0+RW5kTG9vcCgpOw0KKyNlbmRpZg0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlTG9vcDo6VHJhbnNsYXRlQWNjZWxlcmF0b3IoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpICE9IEZXTF9NU0dIQVNIX0tleSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICgoKENGV0xfTXNnS2V5KilwTWVzc2FnZSktPm1fZHdDbWQgIT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dLZXkgKnBNc2dLZXkgPSAoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlOw0KKyAgICBDRlhfTWFwQWNjZWxlcmF0b3JzICZhY2NlbCA9ICgoQ0ZXTF9Gb3JtSW1wKiltX3BGb3JtKS0+R2V0QWNjZWxlcmF0b3IoKTsNCisgICAgRlhfUE9TSVRJT04gcG9zID0gYWNjZWwuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICBpZiAoIXBvcykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIHZyS2V5LCByVmFsdWU7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIGFjY2VsLkdldE5leHRBc3NvYyhwb3MsIHZyS2V5LCByVmFsdWUpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9ICh2cktleSAmIDB4RkYwMCkgPj4gODsNCisgICAgICAgIEZYX0RXT1JEIG1fZHdLZXlDb2RlID0gdnJLZXkgJiAweDAwRkY7DQorICAgICAgICBpZiAocE1zZ0tleS0+bV9kd0ZsYWdzID09IGR3RmxhZ3MgJiYgcE1zZ0tleS0+bV9kd0tleUNvZGUgPT0gbV9kd0tleUNvZGUpIHsNCisgICAgICAgICAgICBHZW5lcmF0ZUNvbW1vbmRFdmVudChyVmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRldMX0VSUglDRldMX05vdGVMb29wOjpTZXRNYWluRm9ybShDRldMX1dpZGdldEltcCAqcEZvcm0pDQorew0KKyAgICBtX3BGb3JtID0gcEZvcm07DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX05vdGVMb29wOjpHZW5lcmF0ZUNvbW1vbmRFdmVudChGWF9EV09SRCBkd0NvbW1hbmQpDQorew0KKyAgICBDRldMX0V2dE1lbnVDb21tYW5kIGV2Ow0KKyAgICBldi5tX2lDb21tYW5kID0gZHdDb21tYW5kOw0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgICBJRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocERyaXZlcik7DQorICAgIHBEcml2ZXItPlNlbmROb3RlKCZldik7DQorfQ0KK0NGV0xfTm90ZURyaXZlcjo6Q0ZXTF9Ob3RlRHJpdmVyKCkNCisgICAgOiBtX3NlbmRFdmVudENhbGxlZCgwKQ0KKyAgICAsIG1fbWF4U2l6ZSg1MDApDQorICAgICwgbV9iRnVsbFNjcmVlbihGQUxTRSkNCisgICAgLCBtX3BGb2N1cyhOVUxMKQ0KKyAgICAsIG1fcEhvdmVyKE5VTEwpDQorICAgICwgbV9wR3JhYihOVUxMKQ0KKyAgICAsIG1faG9vayhOVUxMKQ0KK3sNCisgICAgbV9wTm90ZUxvb3AgPSBGWF9ORVcgQ0ZXTF9Ob3RlTG9vcDsNCisgICAgUHVzaE5vdGVMb29wKChJRldMX05vdGVMb29wKiltX3BOb3RlTG9vcCk7DQorfQ0KK0NGV0xfTm90ZURyaXZlcjo6fkNGV0xfTm90ZURyaXZlcigpDQorew0KKyAgICBpZiAobV9wTm90ZUxvb3ApIHsNCisgICAgICAgIGRlbGV0ZSBtX3BOb3RlTG9vcDsNCisgICAgICAgIG1fcE5vdGVMb29wID0gTlVMTDsNCisgICAgfQ0KKyAgICBDbGVhckludmFsaWRFdmVudFRhcmdldHMoVFJVRSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpTZW5kTm90ZShDRldMX05vdGUgKnBOb3RlKQ0KK3sNCisgICAgaWYgKHBOb3RlLT5Jc0V2ZW50KCkpIHsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fZXZlbnRUYXJnZXRzLkdldENvdW50KCk7DQorICAgICAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEZXTF9FVlRIQVNIX01vdXNlID09ICgoQ0ZXTF9FdmVudCopcE5vdGUpLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgICAgICBDRldMX0V2dE1vdXNlICogcE1vdXNlID0gKENGV0xfRXZ0TW91c2UqKXBOb3RlOw0KKyAgICAgICAgICAgIGlmIChGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlciA9PSBwTW91c2UtPm1fZHdDbWQpIHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcE5vdGVMb29wLT5HZXRGb3JtKCkgJiYgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5Qcm9jZXNzRW50ZXIocE1vdXNlLCBtX3BOb3RlTG9vcC0+R2V0Rm9ybSgpLT5HZXRJbnRlcmZhY2UoKSkpIHsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmUgPT0gcE1vdXNlLT5tX2R3Q21kKSB7DQorICAgICAgICAgICAgICAgIGlmIChDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPlByb2Nlc3NMZWF2ZShwTW91c2UpKSB7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKChGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24gPD0gcE1vdXNlLT5tX2R3Q21kKSAmJiAoRldMX01TR01PVVNFQ01EX01CdXR0b25EYmxDbGsgPj0gcE1vdXNlLT5tX2R3Q21kKSkgew0KKyAgICAgICAgICAgICAgICBpZiAoQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5Qcm9jZXNzTGVhdmUocE1vdXNlKSkgew0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9zZW5kRXZlbnRDYWxsZWQgKys7DQorICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX2V2ZW50VGFyZ2V0cy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICAgICAgRlhfTFBWT0lEIGtleSA9IE5VTEw7DQorICAgICAgICAgICAgQ0ZXTF9FdmVudFRhcmdldCAqcEV2ZW50VGFyZ2V0Ow0KKyAgICAgICAgICAgIG1fZXZlbnRUYXJnZXRzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKHZvaWQqJilwRXZlbnRUYXJnZXQpOw0KKyAgICAgICAgICAgIGlmIChwRXZlbnRUYXJnZXQgJiYgIXBFdmVudFRhcmdldC0+SXNJbnZhbGlkKCkpIHsNCisgICAgICAgICAgICAgICAgcEV2ZW50VGFyZ2V0LT5Qcm9jZXNzRXZlbnQoKENGV0xfRXZlbnQqKXBOb3RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3NlbmRFdmVudENhbGxlZCAtLTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGUtPm1fcERzdFRhcmdldCwgRkFMU0UpOw0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcE5vdGUtPm1fcERzdFRhcmdldC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKChDRldMX01lc3NhZ2UqKXBOb3RlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorZXh0ZXJuIHZvaWQgRldMX1Bvc3RNZXNzYWdlVG9NYWluUm9vcChDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6UG9zdE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIEZXTF9Qb3N0TWVzc2FnZVRvTWFpblJvb3AocE1lc3NhZ2UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorI2RlZmluZSBGV0xfTm90ZURyaXZlcl9FdmVudEtleSAxMTAwDQorRldMX0VSUiBDRldMX05vdGVEcml2ZXI6OlJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBMaXN0ZW5lciwgSUZXTF9XaWRnZXQgKnBFdmVudFNvdXJjZSAsIEZYX0RXT1JEIGR3RmlsdGVyICkNCit7DQorICAgIEZYX0RXT1JEIGR3a2V5ID0gKEZYX0RXT1JEKShGWF9VSU5UUFRSKXBMaXN0ZW5lci0+R2V0UHJpdmF0ZURhdGEoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilGV0xfTm90ZURyaXZlcl9FdmVudEtleSk7DQorICAgIGlmIChkd2tleSA9PSAwKSB7DQorICAgICAgICBGWF9MUFZPSUQgcmFuZG9tID0gRlhfUmFuZG9tX01UX1N0YXJ0KDApOw0KKyAgICAgICAgZHdrZXkgPQlyYW5kKCk7DQorICAgICAgICBGWF9SYW5kb21fTVRfQ2xvc2UocmFuZG9tKTsNCisgICAgICAgIHBMaXN0ZW5lci0+U2V0UHJpdmF0ZURhdGEoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilGV0xfTm90ZURyaXZlcl9FdmVudEtleSwgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd2tleSwgTlVMTCk7DQorICAgIH0NCisgICAgQ0ZXTF9FdmVudFRhcmdldCAqdmFsdWUgPSBOVUxMOw0KKyAgICBpZiAoIW1fZXZlbnRUYXJnZXRzLkxvb2t1cCgodm9pZCopKEZYX1VJTlRQVFIpZHdrZXksIChGWF9MUFZPSUQmKXZhbHVlKSkgew0KKyAgICAgICAgdmFsdWUgPSBGWF9ORVcgQ0ZXTF9FdmVudFRhcmdldCh0aGlzLCBwTGlzdGVuZXIpOw0KKyAgICAgICAgbV9ldmVudFRhcmdldHMuU2V0QXQoKHZvaWQqKShGWF9VSU5UUFRSKWR3a2V5LCB2YWx1ZSk7DQorICAgIH0NCisgICAgdmFsdWUtPlNldEV2ZW50U291cmNlKHBFdmVudFNvdXJjZSwgZHdGaWx0ZXIpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBMaXN0ZW5lcikNCit7DQorICAgIEZYX0RXT1JEIGR3a2V5ID0gKEZYX0RXT1JEKShGWF9VSU5UUFRSKXBMaXN0ZW5lci0+R2V0UHJpdmF0ZURhdGEoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilGV0xfTm90ZURyaXZlcl9FdmVudEtleSk7DQorICAgIGlmIChkd2tleSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIENGV0xfRXZlbnRUYXJnZXQgKnZhbHVlID0gTlVMTDsNCisgICAgaWYgKG1fZXZlbnRUYXJnZXRzLkxvb2t1cCgodm9pZCopKEZYX1VJTlRQVFIpZHdrZXksIChGWF9MUFZPSUQmKXZhbHVlKSkgew0KKyAgICAgICAgdmFsdWUtPkZsYWdJbnZhbGlkKCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Q2xlYXJFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKQ0KK3sNCisgICAgQ2xlYXJJbnZhbGlkRXZlbnRUYXJnZXRzKGJSZW1vdmVBbGwpOw0KK30NCitGWF9JTlQzMiBDRldMX05vdGVEcml2ZXI6OkdldFF1ZXVlTWF4U2l6ZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9tYXhTaXplOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6U2V0UXVldWVNYXhTaXplKGNvbnN0IEZYX0lOVDMyIHNpemUpDQorew0KKyAgICBtX21heFNpemUgPSBzaXplOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfTm90ZVRocmVhZCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRPd25lclRocmVhZCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKElGV0xfTm90ZVRocmVhZCAqKSBGV0xfR2V0QXBwKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpQdXNoTm90ZUxvb3AoSUZXTF9Ob3RlTG9vcCAqcE5vdGVMb29wKQ0KK3sNCisgICAgbV9ub3RlTG9vcFF1ZXVlLkFkZChwTm90ZUxvb3ApOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfTm90ZUxvb3AqIENGV0xfTm90ZURyaXZlcjo6UG9wTm90ZUxvb3AoKQ0KK3sNCisgICAgRlhfSU5UMzIgcG9zID0gbV9ub3RlTG9vcFF1ZXVlLkdldFNpemUoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwb3MgPiAwLCBOVUxMKTsNCisgICAgSUZXTF9Ob3RlTG9vcCAqIHAgPSAoSUZXTF9Ob3RlTG9vcCAqKSBtX25vdGVMb29wUXVldWUuR2V0QXQocG9zIC0gMSk7DQorICAgIG1fbm90ZUxvb3BRdWV1ZS5SZW1vdmVBdChwb3MgLSAxKTsNCisgICAgcmV0dXJuIHA7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRGb2N1cyhJRldMX1dpZGdldCAqcEZvY3VzLCBGWF9CT09MIGJOb3RpZnkgKQ0KK3sNCisgICAgaWYgKG1fcEZvY3VzID09IHBGb2N1cykgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXQqIHBQcmV2ID0gbV9wRm9jdXM7DQorICAgIG1fcEZvY3VzID0gcEZvY3VzOw0KKyAgICBpZiAocFByZXYpIHsNCisgICAgICAgIElGV0xfV2lkZ2V0ICpwV2lkZ2V0ID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQobV9wRm9jdXMsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgICAgICAgIENGV0xfRm9ybUltcCAqcEZvcm0gPSBwV2lkZ2V0ID8gKENGV0xfRm9ybUltcCopKChJRldMX1RhcmdldERhdGEqKXBXaWRnZXQpLT5HZXREYXRhKCkgOiBOVUxMOw0KKyAgICAgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXM7DQorICAgICAgICBtcy5tX3BEc3RUYXJnZXQgPSBwUHJldjsNCisgICAgICAgIG1zLm1fcFNyY1RhcmdldCA9IHBQcmV2Ow0KKyAgICAgICAgaWYgKGJOb3RpZnkpIHsNCisgICAgICAgICAgICBtcy5tX2R3RXh0ZW5kID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBQcmV2LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEZvY3VzKSB7DQorICAgICAgICBJRldMX1dpZGdldCAqcFdpZGdldCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBGb2N1cywgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgICAgICAgQ0ZXTF9Gb3JtSW1wICpwRm9ybSA9IHBXaWRnZXQgPyAoQ0ZXTF9Gb3JtSW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcFdpZGdldCktPkdldERhdGEoKSA6IE5VTEw7DQorICAgICAgICBpZiAocEZvcm0pIHsNCisgICAgICAgICAgICBDRldMX1dpZGdldEltcCAqcE5ld0ZvY3VzID0gKENGV0xfV2lkZ2V0SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcEZvY3VzKS0+R2V0RGF0YSgpOw0KKyAgICAgICAgICAgIHBGb3JtLT5TZXRTdWJGb2N1cyhwTmV3Rm9jdXMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtczsNCisgICAgICAgIG1zLm1fcERzdFRhcmdldCA9IHBGb2N1czsNCisgICAgICAgIGlmIChiTm90aWZ5KSB7DQorICAgICAgICAgICAgbXMubV9kd0V4dGVuZCA9IDE7DQorICAgICAgICB9DQorICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBwRm9jdXMtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgaWYgKHBEZWxlZ2F0ZSkgew0KKyAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGV0xfRVJSCUNGV0xfTm90ZURyaXZlcjo6UnVuKCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisjaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KKyAgICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IgKiBhZGFwdGVyV2lkZ2V0TWdyID0gcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KKyAgICBDRldMX05vdGVMb29wICpwVG9wTG9vcCA9IEdldFRvcExvb3AoKTsNCisgICAgaWYgKHBUb3BMb29wKSB7DQorICAgICAgICBDRldMX1dpZGdldEltcCAqZm9ybUltcCA9IHBUb3BMb29wLT5HZXRGb3JtKCk7DQorICAgICAgICBpZiAoZm9ybUltcCkgew0KKyAgICAgICAgICAgIElGV0xfV2lkZ2V0ICpwRm9ybSA9IGZvcm1JbXAtPkdldEludGVyZmFjZSgpOw0KKyAgICAgICAgICAgIGFkYXB0ZXJXaWRnZXRNZ3ItPlJ1bkxvb3AocEZvcm0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorI2VsaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQorICAgIEZYX0JPT0wJCWJJZGxlID0gVFJVRTsNCisgICAgRlhfSU5UMzIJaUlkbGVDb3VudCA9IDA7DQorICAgIENGV0xfTm90ZUxvb3AgKnBUb3BMb29wID0gTlVMTDsNCisgICAgZm9yICg7Oykgew0KKyAgICAgICAgcFRvcExvb3AgPSBHZXRUb3BMb29wKCk7DQorICAgICAgICBpZiAoIXBUb3BMb29wIHx8ICFwVG9wTG9vcC0+Q29udGludWVNb2RhbCgpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoVW5xdWV1ZU1lc3NhZ2UocFRvcExvb3ApKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoYklkbGUgJiYgIShwV2lkZ2V0TWdyLT5DaGVja01lc3NhZ2VfTmF0aXZlKCkpKSB7DQorICAgICAgICAgICAgaWYgKEZXTF9FUlJfSW5kZWZpbml0ZSA9PSBwVG9wTG9vcC0+SWRsZShpSWRsZUNvdW50KyspKSB7DQorICAgICAgICAgICAgICAgIGJJZGxlID0gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGlmIChGV0xfRVJSX0luZGVmaW5pdGUgPT0gcFdpZGdldE1nci0+RGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocFdpZGdldE1nci0+SXNJZGxlTWVzc2FnZV9OYXRpdmUoKSkgew0KKyAgICAgICAgICAgICAgICBiSWRsZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGlJZGxlQ291bnQgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKHBXaWRnZXRNZ3ItPkNoZWNrTWVzc2FnZV9OYXRpdmUoKSk7DQorICAgIH0NCisjZWxpZiAoX0ZYX09TXz09X0ZYX0xJTlVYX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX0xJTlVYX0VNQkVEREVEXykNCisgICAgQ0ZXTF9Ob3RlTG9vcCAqcFRvcExvb3AgPSBOVUxMOw0KKyAgICBmb3IgKDs7KSB7DQorICAgICAgICBwVG9wTG9vcCA9IEdldFRvcExvb3AoKTsNCisgICAgICAgIGlmICghcFRvcExvb3AgfHwgIXBUb3BMb29wLT5Db250aW51ZU1vZGFsKCkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChVbnF1ZXVlTWVzc2FnZShwVG9wTG9vcCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHBXaWRnZXRNZ3ItPkNoZWNrTWVzc2FnZV9OYXRpdmUoKSkgew0KKyAgICAgICAgICAgIHBXaWRnZXRNZ3ItPkRpc3BhdGNoTWVzc2FnZV9OYXRpdmUoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyNlbmRpZg0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX05vdGVEcml2ZXI6OkdldEZvY3VzKCkNCit7DQorICAgIHJldHVybiBtX3BGb2N1czsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0SG92ZXIoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEhvdmVyOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6U2V0SG92ZXIoSUZXTF9XaWRnZXQgKnBIb3ZlcikNCit7DQorICAgIG1fcEhvdmVyID0gcEhvdmVyOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6U2V0R3JhYihJRldMX1dpZGdldCAqcEdyYWIsIEZYX0JPT0wgYlNldCkNCit7DQorICAgIG1fcEdyYWIgPSBiU2V0ID8gcEdyYWIgOiBOVUxMOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Tm90aWZ5VGFyZ2V0SGlkZShJRldMX1dpZGdldCAqcE5vdGVUYXJnZXQpDQorew0KKyAgICBpZiAobV9wRm9jdXMgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgICAgIG1fcEZvY3VzID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wSG92ZXIgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgICAgIG1fcEhvdmVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wR3JhYiA9PSBwTm90ZVRhcmdldCkgew0KKyAgICAgICAgbV9wR3JhYiA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6Ok5vdGlmeVRhcmdldERlc3Ryb3koSUZXTF9XaWRnZXQgKnBOb3RlVGFyZ2V0KQ0KK3sNCisgICAgaWYgKG1fcEZvY3VzID09IHBOb3RlVGFyZ2V0KSB7DQorICAgICAgICBtX3BGb2N1cyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcEhvdmVyID09IHBOb3RlVGFyZ2V0KSB7DQorICAgICAgICBtX3BIb3ZlciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcEdyYWIgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgICAgIG1fcEdyYWIgPSBOVUxMOw0KKyAgICB9DQorICAgIFVucmVnaXN0ZXJFdmVudFRhcmdldChwTm90ZVRhcmdldCk7DQorICAgIEZYX0lOVDMyIGNvdW50ID0gbV9mb3Jtcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgbkluZGV4ID0gMDsgbkluZGV4IDwgY291bnQ7IG5JbmRleCArKykgew0KKyAgICAgICAgQ0ZXTF9Gb3JtSW1wICpwRm9ybSA9IChDRldMX0Zvcm1JbXAqKW1fZm9ybXNbbkluZGV4XTsNCisgICAgICAgIGlmICghcEZvcm0pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGV0xfV2lkZ2V0SW1wICpwU3ViRm9jdXMgPSBwRm9ybS0+R2V0U3ViRm9jdXMoKTsNCisgICAgICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFN1YkZvY3VzKTsNCisgICAgICAgIGlmIChwU3ViRm9jdXMgJiYgcFN1YkZvY3VzLT5HZXRJbnRlcmZhY2UoKSA9PSBwTm90ZVRhcmdldCkgew0KKyAgICAgICAgICAgIHBGb3JtLT5TZXRTdWJGb2N1cyhOVUxMKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Tm90aWZ5RnVsbFNjcmVlbk1vZGUoSUZXTF9XaWRnZXQgKnBOb3RlVGFyZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKQ0KK3sNCisgICAgbV9iRnVsbFNjcmVlbiA9IGJGdWxsU2NyZWVuOw0KK30NCitGV0xfRVJSCUNGV0xfTm90ZURyaXZlcjo6UmVnaXN0ZXJGb3JtKENGV0xfV2lkZ2V0SW1wICpwRm9ybSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZvcm0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChtX2Zvcm1zLkZpbmQocEZvcm0pID49IDApIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgbV9mb3Jtcy5BZGQocEZvcm0pOw0KKyAgICBpZiAobV9mb3Jtcy5HZXRTaXplKCkgPT0gMSkgew0KKyAgICAgICAgQ0ZXTF9Ob3RlTG9vcCAqcExvb3AgPSAoQ0ZXTF9Ob3RlTG9vcCopbV9ub3RlTG9vcFF1ZXVlLkdldEF0KDApOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTG9vcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICAgIHBMb29wLT5TZXRNYWluRm9ybShwRm9ybSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6VW5SZWdpc3RlckZvcm0oQ0ZXTF9XaWRnZXRJbXAgKnBGb3JtKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRm9ybSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgRlhfSU5UMzIgbkluZGV4ID0gbV9mb3Jtcy5GaW5kKHBGb3JtKTsNCisgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgbV9mb3Jtcy5SZW1vdmVBdChuSW5kZXgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpRdWV1ZU1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIHBNZXNzYWdlLT5SZXRhaW4oKTsNCisgICAgbV9ub3RlUXVldWUuQWRkKHBNZXNzYWdlKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpVbnF1ZXVlTWVzc2FnZShDRldMX05vdGVMb29wICpwTm90ZUxvb3ApDQorew0KKyAgICBpZiAobV9ub3RlUXVldWUuR2V0U2l6ZSgpIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UgPSAoQ0ZXTF9NZXNzYWdlKiltX25vdGVRdWV1ZVswXTsNCisgICAgbV9ub3RlUXVldWUuUmVtb3ZlQXQoMCk7DQorICAgIGlmICghSXNWYWxpZE1lc3NhZ2UocE1lc3NhZ2UpKSB7DQorICAgICAgICBwTWVzc2FnZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhfQk9PTCBiSG9va01lc3NhZ2UgPSBGQUxTRTsNCisgICAgaWYgKG1faG9vaykgew0KKyAgICAgICAgYkhvb2tNZXNzYWdlID0gKCptX2hvb2spKHBNZXNzYWdlLCBtX2hvb2tJbmZvKTsNCisgICAgfQ0KKyAgICBpZiAoIWJIb29rTWVzc2FnZSAmJiAhcE5vdGVMb29wLT5QcmVQcm9jZXNzTWVzc2FnZShwTWVzc2FnZSkpIHsNCisgICAgICAgIFByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgICAgfQ0KKyAgICBwTWVzc2FnZS0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ0ZXTF9Ob3RlTG9vcCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRUb3BMb29wKCkNCit7DQorICAgIEZYX0lOVDMyIHNpemUgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNpemUgPiAwLCBOVUxMKTsNCisgICAgcmV0dXJuIChDRldMX05vdGVMb29wKiltX25vdGVMb29wUXVldWVbc2l6ZSAtIDFdOw0KK30NCitGWF9JTlQzMiBDRldMX05vdGVEcml2ZXI6OkNvdW50TG9vcCgpDQorew0KKyAgICByZXR1cm4gbV9ub3RlTG9vcFF1ZXVlLkdldFNpemUoKTsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6OlNldEhvb2soRldMTWVzc2FnZUhvb2tDYWxsYmFjayBjYWxsYmFjaywgRlhfTFBWT0lEIGluZm8pDQorew0KKyAgICBtX2hvb2sgPSBjYWxsYmFjazsNCisgICAgbV9ob29rSW5mbyA9IGluZm87DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSA9IHBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkgPyBwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0IDogR2V0TWVzc2FnZUZvcm0ocE1lc3NhZ2UtPm1fcERzdFRhcmdldCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2VGb3JtLCBGQUxTRSk7DQorICAgIGlmIChEaXNwYXRjaE1lc3NhZ2UocE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSkpIHsNCisgICAgICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgICAgICAgTW91c2VTZWNvbmRhcnkoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRpc3BhdGNoTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KK3sNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIHN3aXRjaCAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gRG9BY3RpdmF0ZSgoQ0ZXTF9Nc2dBY3RpdmF0ZSopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gRG9EZWFjdGl2YXRlKChDRldMX01zZ0RlYWN0aXZhdGUqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBEb1NldEZvY3VzKChDRldMX01zZ1NldEZvY3VzKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IERvS2lsbEZvY3VzKChDRldMX01zZ0tpbGxGb2N1cyopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBEb0tleSgoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBEb01vdXNlKChDRldMX01zZ01vdXNlKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsOiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBEb1doZWVsKChDRldMX01zZ01vdXNlV2hlZWwqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NpemU6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IERvU2l6ZSgoQ0ZXTF9Nc2dTaXplKilwTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfQ3Vyc29yOiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1dpbmRvd01vdmU6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IERvV2luZG93TW92ZSgoQ0ZXTF9Nc2dXaW5kb3dNb3ZlKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Ecm9wRmlsZXM6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IERvRHJhZ0ZpbGVzKChDRldMX01zZ0Ryb3BGaWxlcyopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfVGFza0NsaWNrZWQ6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfQ2xvc2U6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYlJldCkgew0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcE1lc3NhZ2UtPm1fcERzdFRhcmdldC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSkNCit7DQorICAgIGlmIChtX2JGdWxsU2NyZWVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcE1lc3NhZ2VGb3JtOw0KKyAgICByZXR1cm4gKHBNc2ctPm1fcERzdFRhcmdldCktPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9EZWFjdGl2YXRlKENGV0xfTXNnRGVhY3RpdmF0ZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSkNCit7DQorICAgIGlmIChtX2JGdWxsU2NyZWVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVRyYWNrTG9vcCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaVRyYWNrTG9vcCA+IDAsIEZBTFNFKTsNCisgICAgaWYgKGlUcmFja0xvb3AgPT0gMSkgew0KKyAgICAgICAgaWYgKHBNZXNzYWdlRm9ybS0+SXNJbnN0YW5jZShGWF9XU1RSQyhMIkZXTF9GT1JNUFJPWFkiKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZiAocE1zZy0+bV9wU3JjVGFyZ2V0ICYmIHBNc2ctPm1fcFNyY1RhcmdldC0+SXNJbnN0YW5jZShGWF9XU1RSQyhMIkZXTF9GT1JNUFJPWFkiKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZiAocE1zZy0+bV9wU3JjVGFyZ2V0ICYmICBwTXNnLT5tX3BTcmNUYXJnZXQtPkdldENsYXNzSUQoKSA9PSAxMTExOTg0NzU1KSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXQgKnBEc3QgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERzdCwgRkFMU0UpOw0KKyNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQorICAgIGlmIChwRHN0ID09IHBNZXNzYWdlRm9ybSAmJiBwRHN0LT5Jc0luc3RhbmNlKEwiRldMX0ZPUk1QUk9YWSIpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICByZXR1cm4gcERzdCAhPSBwTWVzc2FnZUZvcm0gJiYNCisgICAgICAgICAgICFwRHN0LT5Jc0luc3RhbmNlKEZYX1dTVFJDKEwiRldMX0ZPUk1QUk9YWSIpKSAmJg0KKyAgICAgICAgICAgIXBNZXNzYWdlRm9ybS0+SXNJbnN0YW5jZShGWF9XU1RSQyhMIkZXTF9GT1JNUFJPWFkiKSk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpEb1NldEZvY3VzKENGV0xfTXNnU2V0Rm9jdXMgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQorew0KKyAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBpZiAocFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgbV9wRm9jdXMgPSAoSUZXTF9XaWRnZXQqKXBNc2ctPm1fcERzdFRhcmdldDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgICBDRldMX0Zvcm1JbXAgKnBGb3JtID0gcFdpZGdldCA/IChDRldMX0Zvcm1JbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwV2lkZ2V0KS0+R2V0RGF0YSgpIDogTlVMTDsNCisgICAgICAgIGlmKHBGb3JtKSB7DQorICAgICAgICAgICAgQ0ZXTF9XaWRnZXRJbXAgKnBTdWJGb2N1cyA9IHBGb3JtLT5HZXRTdWJGb2N1cygpOw0KKyAgICAgICAgICAgIGlmIChwU3ViRm9jdXMgJiYgKChwU3ViRm9jdXMtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApKSB7DQorICAgICAgICAgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBTdWJGb2N1cy0+R2V0SW50ZXJmYWNlKCk7DQorICAgICAgICAgICAgICAgIGlmKG1fcEZvY3VzICE9IHBNc2ctPm1fcERzdFRhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRm9jdXMgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpEb0tpbGxGb2N1cyhDRldMX01zZ0tpbGxGb2N1cyAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIGlmIChwV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICBpZiAobV9wRm9jdXMgPT0gcE1zZy0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgICAgICAgbV9wRm9jdXMgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBJRldMX1dpZGdldCogcFdpZGdldCA9ICBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgICBDRldMX0Zvcm1JbXAgKnBGb3JtID0gcFdpZGdldCA/IChDRldMX0Zvcm1JbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwV2lkZ2V0KS0+R2V0RGF0YSgpIDogTlVMTDsNCisgICAgICAgIGlmKHBGb3JtKSB7DQorICAgICAgICAgICAgQ0ZXTF9XaWRnZXRJbXAgKnBTdWJGb2N1cyA9IHBGb3JtLT5HZXRTdWJGb2N1cygpOw0KKyAgICAgICAgICAgIGlmIChwU3ViRm9jdXMgJiYgKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkpIHsNCisgICAgICAgICAgICAgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcFN1YkZvY3VzLT5HZXRJbnRlcmZhY2UoKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEZvY3VzID09IHBNc2ctPm1fcERzdFRhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wRm9jdXMgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNGV0xfTm90ZURyaXZlcjo6RG9LZXkoQ0ZXTF9Nc2dLZXkgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQorew0KKyNpZihfRlhfT1NfICE9IF9GWF9NQUNPU1hfKQ0KKyAgICBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24gJiYgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfVGFiKSB7DQorICAgICAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBGb3JtID0gR2V0TWVzc2FnZUZvcm0ocE1zZy0+bV9wRHN0VGFyZ2V0KTsNCisgICAgICAgIElGV0xfV2lkZ2V0ICpwRm9jdXMgPSBtX3BGb2N1czsNCisgICAgICAgIGlmIChtX3BGb2N1cykgew0KKyAgICAgICAgICAgIGlmIChwV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wRm9jdXMsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKSAhPSBwRm9ybSkgew0KKyAgICAgICAgICAgICAgICBwRm9jdXMgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsNCisgICAgICAgIElGV0xfV2lkZ2V0ICpwTmV4dFRhYlN0b3AgPSBwV2lkZ2V0TWdyLT5uZXh0VGFiKHBGb3JtLCBwRm9jdXMsIGJGaW5kKTsNCisgICAgICAgIGlmICghcE5leHRUYWJTdG9wKSB7DQorICAgICAgICAgICAgYkZpbmQgPSBGQUxTRTsNCisgICAgICAgICAgICBwTmV4dFRhYlN0b3AgPSBwV2lkZ2V0TWdyLT5uZXh0VGFiKHBGb3JtLCBOVUxMLCBiRmluZCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocE5leHRUYWJTdG9wID09IHBGb2N1cykgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBOZXh0VGFiU3RvcCkgew0KKyAgICAgICAgICAgIFNldEZvY3VzKHBOZXh0VGFiU3RvcCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpZiAoIW1fcEZvY3VzKSB7DQorICAgICAgICBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24gJiYgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfUmV0dXJuKSB7DQorICAgICAgICAgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgICAgICAgICBJRldMX1dpZGdldCAqZGVmQnV0dG9uID0gcFdpZGdldE1nci0+R2V0RGVmYXVsdEJ1dHRvbihwTWVzc2FnZUZvcm0pOw0KKyAgICAgICAgICAgIGlmIChkZWZCdXR0b24pIHsNCisgICAgICAgICAgICAgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gZGVmQnV0dG9uOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gbV9wRm9jdXM7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9Nb3VzZShDRldMX01zZ01vdXNlICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KK3sNCisgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmUgfHwNCisgICAgICAgICAgICBwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUhvdmVyIHx8DQorICAgICAgICAgICAgcE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTW91c2VFbnRlcikgew0KKyAgICAgICAgcmV0dXJuIHBNc2ctPm1fcERzdFRhcmdldCAhPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChwTXNnLT5tX3BEc3RUYXJnZXQgIT0gcE1lc3NhZ2VGb3JtKSB7DQorICAgICAgICBwTXNnLT5tX3BEc3RUYXJnZXQtPlRyYW5zZm9ybVRvKHBNZXNzYWdlRm9ybSwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIH0NCisgICAgaWYgKCFEb01vdXNlRXgocE1zZywgcE1lc3NhZ2VGb3JtKSkgew0KKyAgICAgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcE1lc3NhZ2VGb3JtOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfTm90ZURyaXZlcjo6RG9XaGVlbChDRldMX01zZ01vdXNlV2hlZWwgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQorew0KKyAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIEZBTFNFKTsNCisgICAgSUZXTF9XaWRnZXQgKnBEc3QgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXRBdFBvaW50KHBNZXNzYWdlRm9ybSwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIGlmICghcERzdCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdoaWxlIChwRHN0ICYmIHBEc3QtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0dyaWQpIHsNCisgICAgICAgIHBEc3QgPSBwRHN0LT5HZXRQYXJlbnQoKTsNCisgICAgfQ0KKyAgICBwTWVzc2FnZUZvcm0tPlRyYW5zZm9ybVRvKHBEc3QsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwRHN0Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OkRvU2l6ZShDRldMX01zZ1NpemUgKnBNc2cpDQorew0KKyAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIEZBTFNFKTsNCisgICAgcFdpZGdldE1nci0+Tm90aWZ5U2l6ZUNoYW5nZWQocE1zZy0+bV9wRHN0VGFyZ2V0LCAoRlhfRkxPQVQpcE1zZy0+bV9pV2lkdGgsIChGWF9GTE9BVClwTXNnLT5tX2lIZWlnaHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OkRvV2luZG93TW92ZShDRldMX01zZ1dpbmRvd01vdmUgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQorew0KKyAgICByZXR1cm4gcE1zZy0+bV9wRHN0VGFyZ2V0ID09IHBNZXNzYWdlRm9ybTsNCit9DQorRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OkRvRHJhZ0ZpbGVzKENGV0xfTXNnRHJvcEZpbGVzICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KK3sNCisgICAgcmV0dXJuIHBNc2ctPm1fcERzdFRhcmdldCA9PSBwTWVzc2FnZUZvcm07DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb01vdXNlRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgRkFMU0UpOw0KKyAgICBJRldMX1dpZGdldCAqcFRhcmdldCA9IE5VTEw7DQorICAgIGlmIChtX3BHcmFiKSB7DQorICAgICAgICB7DQorICAgICAgICAgICAgcFRhcmdldCA9IG1fcEdyYWI7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFwVGFyZ2V0KSB7DQorICAgICAgICBwVGFyZ2V0ID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0QXRQb2ludChwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICAgICAgd2hpbGUgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfR3JpZCkgew0KKyAgICAgICAgICAgIHBUYXJnZXQgPSBwVGFyZ2V0LT5HZXRQYXJlbnQoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFRhcmdldCkgew0KKyAgICAgICAgaWYgKHBNZXNzYWdlRm9ybSAhPSBwVGFyZ2V0KSB7DQorICAgICAgICAgICAgcE1lc3NhZ2VGb3JtLT5UcmFuc2Zvcm1UbyhwVGFyZ2V0LCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIXBUYXJnZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwVGFyZ2V0Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6Ok1vdXNlU2Vjb25kYXJ5KENGV0xfTXNnTW91c2UgKnBNc2cpDQorew0KKyAgICBJRldMX1dpZGdldCAqcFRhcmdldCA9IHBNc2ctPm1fcERzdFRhcmdldDsNCisgICAgaWYgKHBUYXJnZXQgPT0gbV9wSG92ZXIpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9wSG92ZXIpIHsNCisgICAgICAgIENGV0xfTXNnTW91c2UgbXNMZWF2ZTsNCisgICAgICAgIG1zTGVhdmUubV9wRHN0VGFyZ2V0ID0gbV9wSG92ZXI7DQorICAgICAgICBtc0xlYXZlLm1fZnggPSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgbXNMZWF2ZS5tX2Z5ID0gcE1zZy0+bV9meTsNCisgICAgICAgIHBUYXJnZXQtPlRyYW5zZm9ybVRvKG1fcEhvdmVyLCBtc0xlYXZlLm1fZngsIG1zTGVhdmUubV9meSk7DQorICAgICAgICBtc0xlYXZlLm1fZHdGbGFncyA9IDA7DQorICAgICAgICBtc0xlYXZlLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTsNCisgICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNMZWF2ZSwgTlVMTCk7DQorICAgIH0NCisgICAgaWYgKHBUYXJnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0Zvcm0pIHsNCisgICAgICAgIG1fcEhvdmVyID0gTlVMTDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BIb3ZlciA9IHBUYXJnZXQ7DQorICAgIENGV0xfTXNnTW91c2UgbXNIb3ZlcjsNCisgICAgbXNIb3Zlci5tX3BEc3RUYXJnZXQgPSBwVGFyZ2V0Ow0KKyAgICBtc0hvdmVyLm1fZnggPSBwTXNnLT5tX2Z4Ow0KKyAgICBtc0hvdmVyLm1fZnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICBtc0hvdmVyLm1fZHdGbGFncyA9IDA7DQorICAgIG1zSG92ZXIubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUhvdmVyOw0KKyAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zSG92ZXIsIE5VTEwpOw0KK30NCitGWF9CT09MCUNGV0xfTm90ZURyaXZlcjo6SXNWYWxpZE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX1Bvc3QpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGV0xfTm90ZUxvb3AgKnBOb3RlTG9vcCA9IChDRldMX05vdGVMb29wKiltX25vdGVMb29wUXVldWVbaV07DQorICAgICAgICBDRldMX1dpZGdldEltcCAqcEZvcm0gPSBwTm90ZUxvb3AtPkdldEZvcm0oKTsNCisgICAgICAgIGlmIChwRm9ybSAmJiAocEZvcm0tPkdldEludGVyZmFjZSgpID09IHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaUNvdW50ID0gbV9mb3Jtcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpQ291bnQ7IGogKyspIHsNCisgICAgICAgIENGV0xfRm9ybUltcCAqcEZvcm0gPSAoQ0ZXTF9Gb3JtSW1wKiltX2Zvcm1zW2pdOw0KKyAgICAgICAgaWYgKHBGb3JtLT5HZXRJbnRlcmZhY2UoKSA9PSBwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRNZXNzYWdlRm9ybShJRldMX1dpZGdldCAqcERzdFRhcmdldCkNCit7DQorICAgIEZYX0lOVDMyIGlUcmFja0xvb3AgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlUcmFja0xvb3AgPiAwLCBOVUxMKTsNCisgICAgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSA9IE5VTEw7DQorICAgIGlmIChpVHJhY2tMb29wID4gMSkgew0KKyAgICAgICAgQ0ZXTF9Ob3RlTG9vcCAqcE5vb3RMb29wID0gKENGV0xfTm90ZUxvb3AqKW1fbm90ZUxvb3BRdWV1ZVtpVHJhY2tMb29wIC0gMV07DQorICAgICAgICBwTWVzc2FnZUZvcm0gPSBwTm9vdExvb3AtPkdldEZvcm0oKS0+R2V0SW50ZXJmYWNlKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwTWVzc2FnZUZvcm0gPSAobV9mb3Jtcy5GaW5kKHBEc3RUYXJnZXQpIDwgMCkgPyBOVUxMIDogcERzdFRhcmdldDsNCisgICAgfQ0KKyAgICBpZiAoIXBNZXNzYWdlRm9ybSAmJiBwRHN0VGFyZ2V0KSB7DQorICAgICAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBOVUxMKTsNCisgICAgICAgIHBNZXNzYWdlRm9ybSA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwRHN0VGFyZ2V0LCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICAgIH0NCisgICAgcmV0dXJuIHBNZXNzYWdlRm9ybTsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6OkNsZWFySW52YWxpZEV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpDQorew0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBtX2V2ZW50VGFyZ2V0cy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIEZYX0xQVk9JRCBrZXkgPSBOVUxMOw0KKyAgICAgICAgQ0ZXTF9FdmVudFRhcmdldCAqcEV2ZW50VGFyZ2V0ID0gTlVMTDsNCisgICAgICAgIG1fZXZlbnRUYXJnZXRzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKHZvaWQqJilwRXZlbnRUYXJnZXQpOw0KKyAgICAgICAgaWYgKHBFdmVudFRhcmdldCAmJiAoYlJlbW92ZUFsbCB8fCBwRXZlbnRUYXJnZXQtPklzSW52YWxpZCgpKSkgew0KKyAgICAgICAgICAgIG1fZXZlbnRUYXJnZXRzLlJlbW92ZUtleShrZXkpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBwRXZlbnRUYXJnZXQ7DQorICAgICAgICB9DQorICAgIH0NCit9DQorY2xhc3MgQ0ZXTF9Db3JlVG9vcFRpcERQIDogcHVibGljIElGV0xfVG9vbFRpcERQLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIEZXTF9FUlIJCQlHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCisgICAgRlhfSU5UMzIJIAlHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBGWF9JTlQzMgkgCUdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIENGWF9ESUJpdG1hcCoJR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBDRlhfU2l6ZUYJCUdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIENGWF9SZWN0RgkJR2V0QW5jaG9yKCk7DQorICAgIENGV0xfQ29yZVRvb3BUaXBEUCgpOw0KKw0KKyAgICBDRlhfV2lkZVN0cmluZwltX3dzQ2FwdGlvbjsNCisgICAgRlhfSU5UMzIJCW1fbkluaXREZWxheVRpbWU7DQorICAgIEZYX0lOVDMyCQltX25BdXRvUG9wRGVsYXlUaW1lOw0KKyAgICBDRlhfUmVjdEYJCW1fZkFuY2hvcjsNCit9Ow0KK0NGV0xfQ29yZVRvb3BUaXBEUDo6Q0ZXTF9Db3JlVG9vcFRpcERQKCkNCit7DQorICAgIG1fbkluaXREZWxheVRpbWUgPSA1MDA7DQorICAgIG1fbkF1dG9Qb3BEZWxheVRpbWUgPSA1MDAwMDsNCisgICAgbV9mQW5jaG9yLlNldCggMC4wLCAwLjAsIDAuMCwgMC4wKTsNCit9DQorRldMX0VSUiBDRldMX0NvcmVUb29wVGlwRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQorew0KKyAgICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX0NvcmVUb29wVGlwRFA6OkdldEluaXRpYWxEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX25Jbml0RGVsYXlUaW1lOw0KK30NCitGWF9JTlQzMiBDRldMX0NvcmVUb29wVGlwRFA6OkdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX25BdXRvUG9wRGVsYXlUaW1lOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ0ZYX1NpemVGIENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0VG9vbFRpcEljb25TaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6Ow0KKyAgICBzei5TZXQoMCwgMCk7DQorICAgIHJldHVybiBzejsNCit9DQorQ0ZYX1JlY3RGIENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0QW5jaG9yKCkNCit7DQorICAgIHJldHVybiBtX2ZBbmNob3I7DQorfQ0KK0NGV0xfRXZlbnRUYXJnZXQ6On5DRldMX0V2ZW50VGFyZ2V0KCkNCit7DQorICAgIG1fZXZlbnRTb3VyY2VzLlJlbW92ZUFsbCgpOw0KK30NCitGWF9JTlQzMiBDRldMX0V2ZW50VGFyZ2V0OjpTZXRFdmVudFNvdXJjZShJRldMX1dpZGdldCAqcFNvdXJjZSwgRlhfRFdPUkQgZHdGaWx0ZXIpDQorew0KKyAgICBpZiAocFNvdXJjZSkgew0KKyAgICAgICAgbV9ldmVudFNvdXJjZXMuU2V0QXQocFNvdXJjZSwgZHdGaWx0ZXIpOw0KKyAgICAgICAgcmV0dXJuIG1fZXZlbnRTb3VyY2VzLkdldENvdW50KCk7DQorICAgIH0NCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FdmVudFRhcmdldDo6UHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCit7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcExpc3RlbmVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRGVsZWdhdGUsIEZBTFNFKTsNCisgICAgaWYgKG1fZXZlbnRTb3VyY2VzLkdldENvdW50KCkgPT0gMCkgew0KKyAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhfUE9TSVRJT04gcG9zID0gbV9ldmVudFNvdXJjZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocG9zKSB7DQorICAgICAgICBJRldMX1dpZGdldCAqcFNvdXJjZSA9IE5VTEw7DQorICAgICAgICBGWF9EV09SRCBkd0ZpbHRlciA9IDA7DQorICAgICAgICBtX2V2ZW50U291cmNlcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBTb3VyY2UsIGR3RmlsdGVyKTsNCisgICAgICAgIGlmIChwU291cmNlID09IHBFdmVudC0+bV9wU3JjVGFyZ2V0IHx8IHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0lkbGUpIHsNCisgICAgICAgICAgICBpZiAoSXNGaWx0ZXJFdmVudChwRXZlbnQsIGR3RmlsdGVyKSkgew0KKyAgICAgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FdmVudFRhcmdldDo6SXNGaWx0ZXJFdmVudChDRldMX0V2ZW50ICpwRXZlbnQsIEZYX0RXT1JEIGR3RmlsdGVyKQ0KK3sNCisgICAgaWYgKGR3RmlsdGVyID09IEZXTF9FVkVOVF9BTExfTUFTSykgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIHN3aXRjaCAocEV2ZW50LT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgIGNhc2UgRldMX0VWVEhBU0hfTW91c2U6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX01PVVNFX01BU0s7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX0VWVEhBU0hfTW91c2VXaGVlbDogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfTU9VU0VXSEVFTF9NQVNLOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0tleTogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfS0VZX01BU0s7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX0VWVEhBU0hfU2V0Rm9jdXM6DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0tpbGxGb2N1czogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfRk9DVVNDSEFOR0VEX01BU0s7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX0VWVEhBU0hfRHJhdzogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfRFJBV19NQVNLOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0Nsb3NlOiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9DTE9TRV9NQVNLOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX1NpemVDaGFuZ2VkOiB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9TSVpFQ0hBTkdFRF9NQVNLOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0lkbGU6IHsNCisgICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0lETEVfTUFTSzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfQ09OVFJPTF9NQVNLOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0NGV0xfVG9vbFRpcENvbnRhaW5lcjo6Q0ZXTF9Ub29sVGlwQ29udGFpbmVyKCkNCisgICAgOiBwQ3VyVGFyZ2V0KE5VTEwpDQorICAgICwgbV9wVG9vbFRpcEltcChOVUxMKQ0KK3sNCisgICAgbV9Ub29sVGlwRHAgPSBGWF9ORVcgQ0ZXTF9Db3JlVG9vcFRpcERQOw0KKyAgICBtX1Rvb2xUaXBEcC0+bV9uSW5pdERlbGF5VGltZSA9IDA7DQorICAgIG1fVG9vbFRpcERwLT5tX25BdXRvUG9wRGVsYXlUaW1lID0gMjAwMDsNCit9DQorQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjp+Q0ZXTF9Ub29sVGlwQ29udGFpbmVyKCkNCit7DQorICAgIGlmIChtX3BUb29sVGlwSW1wKSB7DQorICAgICAgICBJRldMX1Rvb2xUaXAgKnBUb29sVGlwID0gKElGV0xfVG9vbFRpcCopbV9wVG9vbFRpcEltcC0+R2V0SW50ZXJmYWNlKCk7DQorICAgICAgICBwVG9vbFRpcC0+RmluYWxpemUoKTsNCisgICAgICAgIHBUb29sVGlwLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BUb29sVGlwSW1wID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9Ub29sVGlwRHApIHsNCisgICAgICAgIGRlbGV0ZSBtX1Rvb2xUaXBEcDsNCisgICAgICAgIG1fVG9vbFRpcERwID0gTlVMTDsNCisgICAgfQ0KK30NCitDRldMX1Rvb2xUaXBDb250YWluZXIqIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKQ0KK3sNCisgICAgc3RhdGljIENGV0xfVG9vbFRpcENvbnRhaW5lciAqIF90b29sVGlwQ29udGFpbmVyID0gTlVMTDsNCisgICAgaWYgKCFfdG9vbFRpcENvbnRhaW5lcikgew0KKyAgICAgICAgX3Rvb2xUaXBDb250YWluZXIgPSBGWF9ORVcgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOw0KKyAgICB9DQorICAgIHJldHVybiBfdG9vbFRpcENvbnRhaW5lcjsNCit9DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6QWRkVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQgKnBUYXJnZXQpDQorew0KKyAgICBpZiAobV9hcnJXaWRnZXQuRmluZCgodm9pZCAqKXBUYXJnZXQpIDwgMCkgew0KKyAgICAgICAgbV9hcnJXaWRnZXQuQWRkKCh2b2lkICopcFRhcmdldCk7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6UmVtb3ZlVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQgKnBUYXJnZXQpDQorew0KKyAgICBpbnQgaW5kZXggPSBtX2FycldpZGdldC5GaW5kKCh2b2lkICopcFRhcmdldCk7DQorICAgIGlmIChpbmRleCA+PSAwKSB7DQorICAgICAgICBtX2FycldpZGdldC5SZW1vdmVBdChpbmRleCk7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorRlhfQk9PTCBDRldMX1Rvb2xUaXBDb250YWluZXI6Okhhc1Rvb2xUaXAoSUZXTF9XaWRnZXQgKnBXZWRnZXQpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX2FycldpZGdldC5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgSUZXTF9Ub29sVGlwVGFyZ2V0ICpwID0gKElGV0xfVG9vbFRpcFRhcmdldCAqKW1fYXJyV2lkZ2V0W2ldOw0KKyAgICAgICAgaWYgKHAtPkdldFdpZGdldCgpID09IHBXZWRnZXQpIHsNCisgICAgICAgICAgICBwQ3VyVGFyZ2V0ID0gcDsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpQcm9jZXNzRW50ZXIoQ0ZXTF9FdnRNb3VzZSAqcEV2dCwgSUZXTF9XaWRnZXQgKnBPd25lcikNCit7DQorICAgIGlmIChIYXNUb29sVGlwKHBFdnQtPm1fcERzdFRhcmdldCkpIHsNCisgICAgICAgIGlmIChOVUxMID09IG1fcFRvb2xUaXBJbXApIHsNCisgICAgICAgICAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgICAgICAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fVG9vbFRpcERwOw0KKyAgICAgICAgICAgIHByb3AubV9wT3duZXIgPSBwT3duZXI7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0VG9vbHRpcDsNCisgICAgICAgICAgICBydFRvb2x0aXAuU2V0KDE1MCwgMTUwLCAxMDAsIDUwKTsNCisgICAgICAgICAgICBwcm9wLm1fcnRXaWRnZXQgPSBydFRvb2x0aXA7DQorICAgICAgICAgICAgbV9wVG9vbFRpcEltcCA9IEZYX05FVyBDRldMX1Rvb2xUaXBJbXAocHJvcCk7DQorICAgICAgICAgICAgSUZXTF9Ub29sVGlwICpwVG9vbFRpcCA9IElGV0xfVG9vbFRpcDo6Q3JlYXRlKCk7DQorICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+U2V0SW50ZXJmYWNlKHBUb29sVGlwKTsNCisgICAgICAgICAgICAoKElGV0xfVGFyZ2V0RGF0YSopcFRvb2xUaXApLT5TZXREYXRhKG1fcFRvb2xUaXBJbXApOw0KKyAgICAgICAgICAgIG1fcFRvb2xUaXBJbXAtPkluaXRpYWxpemUoKTsNCisgICAgICAgICAgICBtX3BUb29sVGlwSW1wLT5Nb2RpZnlTdHlsZXNFeCggRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUsIDApOw0KKyAgICAgICAgICAgIG1fcFRvb2xUaXBJbXAtPlNldFN0YXRlcyggRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEN1clRhcmdldC0+SXNTaG93ZWQoKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgICAgICAgICAgICBwQ3VyVGFyZ2V0LT5HZXRDYXB0aW9uKHdzQ2FwdGlvbik7DQorICAgICAgICAgICAgaWYgKCF3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIG1fVG9vbFRpcERwLT5tX3dzQ2FwdGlvbiA9IHdzQ2FwdGlvbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICAgICAgICAgIHJ0LlJlc2V0KCk7DQorICAgICAgICAgICAgQ0ZYX1NpemVGIHN6Ow0KKyAgICAgICAgICAgIHN6LlJlc2V0KCk7DQorICAgICAgICAgICAgcEN1clRhcmdldC0+R2V0VG9vbFRpcFNpemUoc3opOw0KKyAgICAgICAgICAgIGlmIChzei54ID4gMCAmJiBzei55ID4gMCkgew0KKyAgICAgICAgICAgICAgICBydC53aWR0aCA9IHN6Lng7DQorICAgICAgICAgICAgICAgIHJ0LmhlaWdodCA9IHN6Lnk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHI7DQorICAgICAgICAgICAgICAgIG1fcFRvb2xUaXBJbXAtPkdldFdpZGdldFJlY3QociwgVFJVRSk7DQorICAgICAgICAgICAgICAgIHJ0LndpZHRoID0gci53aWR0aDsNCisgICAgICAgICAgICAgICAgcnQuaGVpZ2h0ID0gci5oZWlnaHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9Qb2ludEYgcHQ7DQorICAgICAgICAgICAgcHQuU2V0KHBFdnQtPm1fZngsIHBFdnQtPm1fZnkpOw0KKyAgICAgICAgICAgIGlmIChwQ3VyVGFyZ2V0LT5HZXRUb29sVGlwUG9zKHB0KSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICAgICAgICAgICAgICBydC5sZWZ0ID0gcHQueDsNCisgICAgICAgICAgICAgICAgcnQudG9wID0gcHQueTsNCisgICAgICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX1RUUF9Ob0FuY2hvciwgMCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yOw0KKyAgICAgICAgICAgICAgICBwQ3VyVGFyZ2V0LT5HZXRXaWRnZXQoKS0+R2V0Q2xpZW50UmVjdChydEFuY2hvcik7DQorICAgICAgICAgICAgICAgIHBDdXJUYXJnZXQtPkdldFdpZGdldCgpLT5UcmFuc2Zvcm1UbyhOVUxMLCBydEFuY2hvci5sZWZ0LCBydEFuY2hvci50b3ApOw0KKyAgICAgICAgICAgICAgICBtX3BUb29sVGlwSW1wLT5TZXRBbmNob3IocnRBbmNob3IpOw0KKyAgICAgICAgICAgICAgICBtX3BUb29sVGlwSW1wLT5Nb2RpZnlTdHlsZXNFeCgwLCBGV0xfU1RZTEVFWFRfVFRQX05vQW5jaG9yKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+U2V0V2lkZ2V0UmVjdChydCk7DQorICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+VXBkYXRlKCk7DQorICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+U2hvdygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6UHJvY2Vzc0xlYXZlKENGV0xfRXZ0TW91c2UgKnBFdnQpDQorew0KKyAgICBpZiAoSGFzVG9vbFRpcChwRXZ0LT5tX3BEc3RUYXJnZXQpICYmIE5VTEwgIT0gbV9wVG9vbFRpcEltcCkgew0KKyAgICAgICAgbV9wVG9vbFRpcEltcC0+SGlkZSgpOw0KKyAgICAgICAgcEN1clRhcmdldCA9IE5VTEw7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0lGV0xfVG9vbFRpcFRhcmdldCogQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpHZXRDdXJyZW50VG9vbFRpcFRhcmdldCgpDQorew0KKyAgICByZXR1cm4gcEN1clRhcmdldDsNCit9DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6U2V0VG9vbFRpcEluaXRpYWxEZWxheShGWF9JTlQzMiBuRGVsYXlUaW1lKQ0KK3sNCisgICAgbV9Ub29sVGlwRHAtPm1fbkluaXREZWxheVRpbWUgPSBuRGVsYXlUaW1lOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRldMX1Rvb2xUaXBDb250YWluZXI6OlNldFRvb2xUaXBBdXRvUG9wRGVsYXkoRlhfSU5UMzIgbkRlbGF5VGltZSkNCit7DQorICAgIG1fVG9vbFRpcERwLT5tX25BdXRvUG9wRGVsYXlUaW1lID0gbkRlbGF5VGltZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIEZXTF9BZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCkNCit7DQorICAgIHJldHVybglDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPkFkZFRvb2xUaXBUYXJnZXQocFRhcmdldCk7DQorfQ0KK0ZXTF9FUlIgRldMX1JlbW92ZVRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0ICpwVGFyZ2V0KQ0KK3sNCisgICAgcmV0dXJuIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+UmVtb3ZlVG9vbFRpcFRhcmdldChwVGFyZ2V0KTsNCit9DQorRldMX0VSUglGV0xfU2V0VG9vbFRpcEluaXRpYWxEZWxheShGWF9JTlQzMiBuRGVsYXlUaW1lKQ0KK3sNCisgICAgcmV0dXJuIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+U2V0VG9vbFRpcEluaXRpYWxEZWxheShuRGVsYXlUaW1lKTsNCit9DQorRldMX0VSUglGV0xfU2V0VG9vbFRpcEF1dG9Qb3BEZWxheShGWF9JTlQzMiBuRGVsYXlUaW1lKQ0KK3sNCisgICAgcmV0dXJuIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+U2V0VG9vbFRpcEF1dG9Qb3BEZWxheShuRGVsYXlUaW1lKTsNCit9DQorSUZXTF9XaWRnZXQqIEZXTF9HZXRDdXJyZW50VGhyZWFkTW9kYWxXaWRnZXQoSUZXTF9Ob3RlVGhyZWFkICpwTm90ZVRocmVhZCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGVUaHJlYWQsIE5VTEwpOw0KKyAgICBDRldMX05vdGVEcml2ZXIgKm5vdGVEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwTm90ZVRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG5vdGVEcml2ZXIsIE5VTEwpOw0KKyAgICBpZiAobm90ZURyaXZlci0+Q291bnRMb29wKCkgPT0gMSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZXTF9Ob3RlTG9vcCAqdG9wTG9vcCA9IG5vdGVEcml2ZXItPkdldFRvcExvb3AoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCh0b3BMb29wLCBOVUxMKTsNCisgICAgQ0ZXTF9XaWRnZXRJbXAgKndpZGdldCA9IHRvcExvb3AtPkdldEZvcm0oKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCh3aWRnZXQsIE5VTEwpOw0KKyAgICByZXR1cm4gd2lkZ2V0LT5HZXRJbnRlcmZhY2UoKTsNCit9DQorRldMX0VSUiBGV0xfU2V0SG9vayhJRldMX05vdGVEcml2ZXIgKmRyaXZlciwgRldMTWVzc2FnZUhvb2tDYWxsYmFjayBjYWxsYmFjaywgRlhfTFBWT0lEIGluZm8pDQorew0KKyAgICBDRldMX05vdGVEcml2ZXIgKm5vdGVEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilkcml2ZXI7DQorICAgIG5vdGVEcml2ZXItPlNldEhvb2soY2FsbGJhY2ssIGluZm8pOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9wYW5lbGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjZhMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCitJRldMX1BhbmVsKiBJRldMX1BhbmVsOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX1BhbmVsOw0KK30NCitGV0xfRVJSCUlGV0xfUGFuZWw6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfUGFuZWxJbXAocE91dGVyKTsNCisgICAgKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfUGFuZWw6OkluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QYW5lbEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0lGV0xfQ29udGVudCogSUZXTF9QYW5lbDo6R2V0Q29udGVudCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+R2V0Q29udGVudCgpOw0KK30NCitGV0xfRVJSCUlGV0xfUGFuZWw6OlNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCkNCit7DQorICAgIHJldHVybiAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRDb250ZW50KHBDb250ZW50KTsNCit9DQorSUZXTF9QYW5lbDo6SUZXTF9QYW5lbCgpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9QYW5lbDo6fklGV0xfUGFuZWwoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9QYW5lbEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0NGV0xfUGFuZWxJbXA6OkNGV0xfUGFuZWxJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fcENvbnRlbnQoTlVMTCkNCit7DQorfQ0KK0NGV0xfUGFuZWxJbXA6OkNGV0xfUGFuZWxJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9wQ29udGVudChOVUxMKQ0KK3sNCit9DQorQ0ZXTF9QYW5lbEltcDo6fkNGV0xfUGFuZWxJbXAoKQ0KK3sNCit9DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICB3c0NsYXNzID0gRldMX0NMQVNTX1BhbmVsOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfUGFuZWxJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfUGFuZWw7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QYW5lbEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIGlmIChiQXV0b1NpemUpIHsNCisgICAgICAgIGlmIChtX3BDb250ZW50KSB7DQorICAgICAgICAgICAgbV9wQ29udGVudC0+R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpVcGRhdGUoKQ0KK3sNCisgICAgaWYgKG1fcENvbnRlbnQpIHsNCisgICAgICAgIENGWF9SZWN0RiBydENsaWVudDsNCisgICAgICAgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgICAgICAgRldMX0dSSURVTklUIGVXaWR0aCA9IEZXTF9HUklEVU5JVF9GaXhlZCwgZUhlaWdodCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgICAgICAgIElGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQoKElGV0xfV2lkZ2V0Kil0aGlzLCBGV0xfV0dUUkVMQVRJT05fUGFyZW50KTsNCisgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0dyaWQpIHsNCisgICAgICAgICAgICBJRldMX0dyaWQqIHBHcmlkID0gKElGV0xfR3JpZCopcFBhcmVudDsNCisgICAgICAgICAgICBwR3JpZC0+R2V0V2lkZ2V0U2l6ZSgoSUZXTF9XaWRnZXQqKXRoaXMsIEZXTF9HUklEU0laRV9XaWR0aCwgZVdpZHRoKTsNCisgICAgICAgICAgICBwR3JpZC0+R2V0V2lkZ2V0U2l6ZSgoSUZXTF9XaWRnZXQqKXRoaXMsIEZXTF9HUklEU0laRV9IZWlnaHQsIGVIZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVXaWR0aCAhPSBGV0xfR1JJRFVOSVRfQXV0byB8fCBlSGVpZ2h0ICE9IEZXTF9HUklEVU5JVF9BdXRvKSB7DQorICAgICAgICB9DQorICAgICAgICBtX3BDb250ZW50LT5TZXRXaWRnZXRSZWN0KHJ0Q2xpZW50KTsNCisgICAgICAgIG1fcENvbnRlbnQtPlVwZGF0ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9Db250ZW50KiBDRldMX1BhbmVsSW1wOjpHZXRDb250ZW50KCkNCit7DQorICAgIHJldHVybiBtX3BDb250ZW50Ow0KK30NCitGV0xfRVJSIENGV0xfUGFuZWxJbXA6OlNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENvbnRlbnQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcENvbnRlbnQgPSBwQ29udGVudDsNCisgICAgcmV0dXJuIHBDb250ZW50LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCit9DQorY2xhc3MgQ0ZXTF9DdXN0b21QYW5lbEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfQ3VzdG9tUGFuZWxJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX0N1c3RvbVBhbmVsSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0N1c3RvbVBhbmVsSW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQkJVXBkYXRlKCk7DQorICAgIHZpcnR1YWwgSUZXTF9Db250ZW50KglHZXRDb250ZW50KCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCk7DQorICAgIEZXTF9FUlIJCQkJCVNldFByb3h5KElGV0xfUHJveHkgKnBQcm94eSk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX0NvbnRlbnQJCQkqbV9wQ29udGVudDsNCisgICAgSUZXTF9Qcm94eQkJCQkqbV9wUHJveHk7DQorfTsNCitDRldMX0N1c3RvbVBhbmVsSW1wOjpDRldMX0N1c3RvbVBhbmVsSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCisgICAgLCBtX3BDb250ZW50KE5VTEwpDQorICAgICwgbV9wUHJveHkoTlVMTCkNCit7DQorfQ0KK0NGV0xfQ3VzdG9tUGFuZWxJbXA6OkNGV0xfQ3VzdG9tUGFuZWxJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9wQ29udGVudChOVUxMKQ0KKyAgICAsIG1fcFByb3h5KE5VTEwpDQorew0KK30NCitDRldMX0N1c3RvbVBhbmVsSW1wOjp+Q0ZXTF9DdXN0b21QYW5lbEltcCgpDQorew0KK30NCitGV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAoYkF1dG9TaXplICYmIG1fcFByb3h5ICYmIChtX3BQcm94eS0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpID09IEZXTF9FUlJfU3VjY2VlZGVkKSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KK30NCitGV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OlVwZGF0ZSgpDQorew0KKyAgICBpZiAobV9wUHJveHkpIHsNCisgICAgICAgIHJldHVybiBtX3BQcm94eS0+VXBkYXRlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKTsNCit9DQorSUZXTF9Db250ZW50KiBDRldMX0N1c3RvbVBhbmVsSW1wOjpHZXRDb250ZW50KCkNCit7DQorICAgIHJldHVybiBtX3BDb250ZW50Ow0KK30NCitGV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OlNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENvbnRlbnQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIG1fcENvbnRlbnQgPSBwQ29udGVudDsNCisgICAgcmV0dXJuIHBDb250ZW50LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCit9DQorRldMX0VSUiBDRldMX0N1c3RvbVBhbmVsSW1wOjpTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpDQorew0KKyAgICBtX3BQcm94eSA9IHBQcm94eTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX0N1c3RvbVBhbmVsKiBJRldMX0N1c3RvbVBhbmVsOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX0N1c3RvbVBhbmVsOw0KK30NCitGV0xfRVJSCUlGV0xfQ3VzdG9tUGFuZWw6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorew0KKyAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ3VzdG9tUGFuZWxJbXAocE91dGVyKTsNCisgICAgKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUlGV0xfQ3VzdG9tUGFuZWw6OkluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DdXN0b21QYW5lbEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgICAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICAgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0lGV0xfQ29udGVudCogSUZXTF9DdXN0b21QYW5lbDo6R2V0Q29udGVudCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+R2V0Q29udGVudCgpOw0KK30NCitGV0xfRVJSCUlGV0xfQ3VzdG9tUGFuZWw6OlNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRDb250ZW50KHBDb250ZW50KTsNCit9DQorRldMX0VSUglJRldMX0N1c3RvbVBhbmVsOjpTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpDQorew0KKyAgICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+U2V0UHJveHkocFByb3h5KTsNCit9DQorSUZXTF9DdXN0b21QYW5lbDo6SUZXTF9DdXN0b21QYW5lbCgpDQorew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9DdXN0b21QYW5lbDo6fklGV0xfQ3VzdG9tUGFuZWwoKQ0KK3sNCisgICAgaWYgKG1fcERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZXTF9DdXN0b21QYW5lbEltcCopbV9wRGF0YTsNCisgICAgICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9zZGFkYXB0ZXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3NkYWRhcHRlcmltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlNWEyYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9zZGFkYXB0ZXJpbXAuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyKCkNCit7DQorfQ0KK0NGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjp+Q0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3IoKQ0KK3sNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRldMX1dpZGdldCAqcFBhcmVudCApDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkRlc3Ryb3lXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0V2lkZ2V0UG9zaXRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0UGFyZW50V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRldMX1dpZGdldCAqcFBhcmVudCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2hvd1dpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6SGlkZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0Tm9ybWFsKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRNYXhpbWl6ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0TWluaW1pemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJ1bldpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6UmVwYWludFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6RXhpdChGWF9JTlQzMiBpRXhpdENvZGUpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZChJRldMX1dpZGdldCAqcFdpZGdldCwgdm9pZCAqdnApDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRXaWRnZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9XU1RSIHdzQ2FwdGlvbikNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldEJvcmRlclJlZ2lvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1BhdGggKnBQYXRoKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3QWxwaGEpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q2hlY2tNZXNzYWdlKCkNCit7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6SXNJZGxlTWVzc2FnZSgpDQorew0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkRpc3BhdGNoTWVzc2FnZSgpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRXaWRnZXREQyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfTFBWT0lEICZwREMpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpSZWxlYXNlV2lkZ2V0REMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQVk9JRCBwREMsIENGWF9SZWN0RiAqcENsaXApDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0xQVk9JRAlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0V2luZG93KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0RXT1JECUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRLZXlTdGF0ZShGWF9EV09SRCBkd1ZpcnRLZXkpDQorew0KKyAgICByZXR1cm4gMDsNCit9DQorRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJ1bkxvb3AoSUZXTF9XaWRnZXQgKndpZGdldCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkVuZExvb3AoKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6SW5pdE1lbnUoSUZXTF9NZW51ICpwTWVudSwgSUZXTF9NZW51RFAgKnBNZW51RGF0YSkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlVwZGF0ZU1lbnUoSUZXTF9NZW51ICpwTWVudSwgRlhfTFBDVk9JRCBoSXRlbSwgRlhfSU5UMzIgaVR5cGUpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpUcmFja1BvcHVwTWVudShJRldMX01lbnUgKnBNZW51LCBJRldMX01lbnVEUCAqcE1lbnVEYXRhKQ0KK3sNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRNZXNzYWdlSG9vayhJRldMX0FkYXB0ZXJNZXNzYWdlSG9vayAqaG9vaykNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFN5c3RlbUJvcmRlcihGWF9GTE9BVCAmbCwgRlhfRkxPQVQgJnQsIEZYX0ZMT0FUICZyLCBGWF9GTE9BVCAmYikNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTAkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpDRldMX1NEQWRhcHRlclRocmVhZE1ncigpDQorew0KK30NCitDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6fkNGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKCkNCit7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OlN0YXJ0KElGV0xfVGhyZWFkICpwVGhyZWFkLCBGV0xfSFRIUkVBRCAmaFRocmVhZCwgRlhfQk9PTCBiU3VzcGVuZGVkKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpSZXN1bWUoRldMX0hUSFJFQUQgaFRocmVhZCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6U3VzcGVuZChGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpLaWxsKEZXTF9IVEhSRUFEIGhUaHJlYWQsIEZYX0lOVDMyIGlFeGl0Q29kZSkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6U3RvcChGV0xfSFRIUkVBRCBoVGhyZWFkLCBGWF9JTlQzMiBpRXhpdENvZGUpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfVGhyZWFkKiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6R2V0Q3VycmVudFRocmVhZCgpDQorew0KKyAgICByZXR1cm4gRldMX0dldEFwcCgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGFyZ2V0aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90YXJnZXRpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTQwZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGFyZ2V0aW1wLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorRlhfRFdPUkQgSUZXTF9UYXJnZXQ6OlJlbGVhc2UoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdSZWYgPSAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+UmVsZWFzZSgpOw0KKyAgICBpZiAoIWR3UmVmKSB7DQorICAgICAgICBtX3BEYXRhID0gTlVMTDsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHJldHVybiBkd1JlZjsNCit9DQorSUZXTF9UYXJnZXQqIElGV0xfVGFyZ2V0OjpSZXRhaW4oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5SZXRhaW4oKTsNCit9DQorRlhfRFdPUkQgSUZXTF9UYXJnZXQ6OkdldFJlZkNvdW50KCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+R2V0UmVmQ291bnQoKTsNCit9DQorRldMX0VSUglJRldMX1RhcmdldDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5HZXRDbGFzc05hbWUod3NDbGFzcyk7DQorfQ0KK0ZYX0RXT1JEIElGV0xfVGFyZ2V0OjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+R2V0Q2xhc3NJRCgpOw0KK30NCitGWF9CT09MCUlGV0xfVGFyZ2V0OjpJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+SXNJbnN0YW5jZSh3c0NsYXNzKTsNCit9DQorRldMX0VSUglJRldMX1RhcmdldDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX1RhcmdldCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUglJRldMX1RhcmdldDo6RmluYWxpemUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5GaW5hbGl6ZSgpOw0KK30NCitJRldMX1RhcmdldDo6fklGV0xfVGFyZ2V0KCkNCit7DQorfQ0KK0NGV0xfVGFyZ2V0OjpDRldMX1RhcmdldCgpDQorICAgIDogbV9kd1JlZkNvdW50KDEpDQorew0KK30NCitDRldMX1RhcmdldDo6fkNGV0xfVGFyZ2V0KCkNCit7DQorfQ0KK0ZYX0RXT1JEIENGV0xfVGFyZ2V0OjpSZWxlYXNlKCkNCit7DQorICAgIG1fZHdSZWZDb3VudC0tOw0KKyAgICBGWF9EV09SRCBkd1JldCA9IG1fZHdSZWZDb3VudDsNCisgICAgaWYgKCFtX2R3UmVmQ291bnQpIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHJldHVybiBkd1JldDsNCit9DQorSUZXTF9UYXJnZXQqIENGV0xfVGFyZ2V0OjpSZXRhaW4oKQ0KK3sNCisgICAgbV9kd1JlZkNvdW50Kys7DQorICAgIHJldHVybiAoSUZXTF9UYXJnZXQqKXRoaXM7DQorfQ0KK0ZYX0RXT1JEIENGV0xfVGFyZ2V0OjpHZXRSZWZDb3VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9kd1JlZkNvdW50Ow0KK30NCitGV0xfRVJSIENGV0xfVGFyZ2V0OjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfVGFyZ2V0OjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiAwOw0KK30NCitGWF9CT09MCUNGV0xfVGFyZ2V0OjpJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3QNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRldMX0VSUiBDRldMX1RhcmdldDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9UYXJnZXQ6OkZpbmFsaXplKCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfTFBWT0lEIElGV0xfVGFyZ2V0RGF0YTo6R2V0RGF0YSgpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YTsNCit9DQordm9pZCBJRldMX1RhcmdldERhdGE6OlNldERhdGEoRlhfTFBWT0lEIHBEYXRhKQ0KK3sNCisgICAgbV9wRGF0YSA9IHBEYXRhOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGhyZWFkaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aHJlYWRpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjQxNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGhyZWFkaW1wLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KK0NGV0xfQ29udHJvbFRocmVhZDo6fkNGV0xfQ29udHJvbFRocmVhZCgpDQorew0KK30NCitGV0xfRVJSIENGV0xfQ29udHJvbFRocmVhZDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpDQorew0KKyAgICBzdGF0aWMgaW50IGNvdW50ID0gMDsNCisgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfVGhyZWFkICogSUZXTF9UaHJlYWQ6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gKElGV0xfVGhyZWFkICopIEZYX05FVyBDRldMX1RocmVhZDsNCit9DQorQ0ZXTF9UaHJlYWQ6OkNGV0xfVGhyZWFkKCkNCit7DQorfQ0KK0NGV0xfVGhyZWFkOjp+Q0ZXTF9UaHJlYWQoKQ0KK3sNCit9DQorRldMX0VSUiBDRldMX1RocmVhZDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfQ29udHJvbFRocmVhZCAqCUNGV0xfTm90ZVRocmVhZDo6X2Fzc2lzdGFudFRocmVhZEhhbmRsZXIJPSBOVUxMOw0KK0ZXTF9IVEhSRUFECQkJCUNGV0xfTm90ZVRocmVhZDo6X2Fzc2lzdGFudFRocmVhZAkJCT0gTlVMTDsNCitGWF9JTlQzMgkJCQlDRldMX05vdGVUaHJlYWQ6Ol9yZWZDb3VudAkJCQkJPSAwOw0KK0lGV0xfTm90ZVRocmVhZCogSUZXTF9Ob3RlVGhyZWFkOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIChJRldMX05vdGVUaHJlYWQqKSBGWF9ORVcgQ0ZXTF9Ob3RlVGhyZWFkOw0KK30NCitDRldMX05vdGVUaHJlYWQ6OkNGV0xfTm90ZVRocmVhZCgpDQorICAgIDogbV9oVGhyZWFkKE5VTEwpDQorew0KKyAgICBtX3BOb3RlRHJpdmVyID0gRlhfTkVXIENGV0xfTm90ZURyaXZlcjsNCit9DQorQ0ZXTF9Ob3RlVGhyZWFkOjp+Q0ZXTF9Ob3RlVGhyZWFkKCkNCit7DQorICAgIGlmIChtX2hUaHJlYWQpIHsNCisgICAgICAgIEZXTF9TdG9wVGhyZWFkKG1faFRocmVhZCwgMCk7DQorICAgIH0NCisgICAgaWYgKG1fcE5vdGVEcml2ZXIpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BOb3RlRHJpdmVyOw0KKyAgICAgICAgbV9wTm90ZURyaXZlciA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBDRldMX05vdGVUaHJlYWQ6OlJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BOb3RlRHJpdmVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBGV0xfRVJSIHJlc3VsdCA9IG1fcE5vdGVEcml2ZXItPlJ1bigpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCitJRldMX05vdGVEcml2ZXIqIENGV0xfTm90ZVRocmVhZDo6R2V0Tm90ZURyaXZlcigpDQorew0KKyAgICByZXR1cm4gKElGV0xfTm90ZURyaXZlciopbV9wTm90ZURyaXZlcjsNCit9DQorZXh0ZXJuIElGV0xfQWRhcHRlck5hdGl2ZSogRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCitGV0xfSFRIUkVBRCBGV0xfU3RhcnRUaHJlYWQoSUZXTF9UaHJlYWQgKnBUaHJlYWQsIEZYX0JPT0wgYlN1c3BlbmRlZCApDQorew0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBOYXRpdmUsIE5VTEwpOw0KKyAgICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IgKnBUaHJlYWRNZ3IgPSBwTmF0aXZlLT5HZXRUaHJlYWRNZ3IoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhyZWFkTWdyLCBOVUxMKTsNCisgICAgRldMX0hUSFJFQUQgaFRocmVhZCA9IE5VTEw7DQorICAgIHBUaHJlYWRNZ3ItPlN0YXJ0KHBUaHJlYWQsIGhUaHJlYWQsIGJTdXNwZW5kZWQpOw0KKyAgICByZXR1cm4gaFRocmVhZDsNCit9DQorRldMX0VSUiBGV0xfUmVzdW1lVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQpDQorew0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKiBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgSUZXTF9BZGFwdGVyVGhyZWFkTWdyICogVGhyZWFkTWdyID0gTmF0aXZlLT5HZXRUaHJlYWRNZ3IoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChUaHJlYWRNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBUaHJlYWRNZ3ItPlJlc3VtZShoVGhyZWFkKTsNCit9DQorRldMX0VSUiBGV0xfU3VzcGVuZFRocmVhZChGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KK3sNCisgICAgSUZXTF9BZGFwdGVyTmF0aXZlICogTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChOYXRpdmUsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfQWRhcHRlclRocmVhZE1nciAqIFRocmVhZE1nciA9IE5hdGl2ZS0+R2V0VGhyZWFkTWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoVGhyZWFkTWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gVGhyZWFkTWdyLT5TdXNwZW5kKGhUaHJlYWQpOw0KK30NCitGV0xfRVJSIEZXTF9LaWxsVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIEZYX0lOVDMyIGlFeGl0Q29kZSkNCit7DQorICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqIE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IgKiBUaHJlYWRNZ3IgPSBOYXRpdmUtPkdldFRocmVhZE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKFRocmVhZE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIFRocmVhZE1nci0+S2lsbChoVGhyZWFkLCBpRXhpdENvZGUpOw0KK30NCitGV0xfRVJSIEZXTF9TdG9wVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIEZYX0lOVDMyIGlFeGl0Q29kZSkNCit7DQorICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqIE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IgKiBUaHJlYWRNZ3IgPSBOYXRpdmUtPkdldFRocmVhZE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKFRocmVhZE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIFRocmVhZE1nci0+U3RvcChoVGhyZWFkLCBpRXhpdENvZGUpOw0KK30NCitGV0xfSE1VVEVYIEZXTF9DcmVhdGVNdXRleCgpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRldMX0VSUglGV0xfRGVzdHJveU11dGV4KEZXTF9ITVVURVggaE11dGV4KQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUZXTF9Mb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJRldMX1RyeUxvY2tNdXRleChGV0xfSE1VVEVYIGhNdXRleCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglGV0xfVW5sb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJRldMX0lzTG9ja2VkTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgsIEZYX0JPT0wgJmJMb2NrZWQpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9IU0VNQVBIT1JFIEZXTF9DcmVhdGVTZW1hcGhvcmUoKQ0KK3sNCisgICAgcmV0dXJuIChGV0xfSFNFTUFQSE9SRSkgSUZXTF9BZGFwdGVyU2VtYXBob3JlOjpDcmVhdGUoKTsNCit9DQorRldMX0VSUglGV0xfRGVzdHJveVNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9BZGFwdGVyU2VtYXBob3JlKiloU2VtYXBob3JlKS0+RGVzdHJveSgpOw0KK30NCitGV0xfRVJSCUZXTF9XYWl0U2VtYXBob3JlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUpDQorew0KKyAgICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5XYWl0KCk7DQorfQ0KK0ZXTF9FUlIJRldMX1Bvc3RTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgRlhfSU5UMzIgZG93biApDQorew0KKyAgICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5Qb3N0KCk7DQorfQ0KK0ZXTF9FUlIJRldMX0dldFNlbWFwaG9yZVZhbHVlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUsIEZYX0lOVDMyICZ2YWx1ZSkNCit7DQorICAgIHJldHVybiAoKElGV0xfQWRhcHRlclNlbWFwaG9yZSopaFNlbWFwaG9yZSktPlZhbHVlKChGWF9EV09SRCAmKXZhbHVlKTsNCit9DQorRldMX0VSUglGV0xfUmVzZXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgRlhfSU5UMzIgaW5pdCkNCit7DQorICAgIHJldHVybiAoKElGV0xfQWRhcHRlclNlbWFwaG9yZSopaFNlbWFwaG9yZSktPlJlc2V0KGluaXQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGltZXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDMwMGY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KK0ZXTF9IVElNRVIgRldMX1N0YXJ0VGltZXIoSUZXTF9UaW1lciAqcFRpbWVyLCBGWF9EV09SRCBkd0VsYXBzZSwgRlhfQk9PTCBiSW1tZWRpYXRlbHkgKQ0KK3sNCisgICAgSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlck5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXJOYXRpdmUsIE5VTEwpOw0KKyAgICBJRldMX0FkYXB0ZXJUaW1lck1nciAqcEFkYXB0ZXJUaW1lck1nciA9IHBBZGFwdGVyTmF0aXZlLT5HZXRUaW1lck1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyVGltZXJNZ3IsIE5VTEwpOw0KKyAgICBGV0xfSFRJTUVSIGhUaW1lciA9IE5VTEw7DQorICAgIHBBZGFwdGVyVGltZXJNZ3ItPlN0YXJ0KHBUaW1lciwgZHdFbGFwc2UsIGhUaW1lciwgYkltbWVkaWF0ZWx5KTsNCisgICAgcmV0dXJuIGhUaW1lcjsNCit9DQorRlhfSU5UMzIgRldMX1N0b3BUaW1lcihGV0xfSFRJTUVSIGhUaW1lcikNCit7DQorICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXJOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX0FkYXB0ZXJUaW1lck1nciAqcEFkYXB0ZXJUaW1lck1nciA9IHBBZGFwdGVyTmF0aXZlLT5HZXRUaW1lck1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyVGltZXJNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBwQWRhcHRlclRpbWVyTWdyLT5TdG9wKGhUaW1lcik7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExODZhNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRpbXAuY3BwCkBAIC0wLDAgKzEsMTIxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorRldMX0VSUglJRldMX1dpZGdldDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0R2xvYmFsUmVjdChyZWN0KTsNCit9DQorRldMX0VSUglJRldMX1dpZGdldDo6U2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFdpZGdldFJlY3QocmVjdCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9XaWRnZXQ6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRDbGllbnRSZWN0KHJlY3QpOw0KK30NCitJRldMX1dpZGdldCogSUZXTF9XaWRnZXQ6OkdldFBhcmVudCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFBhcmVudCgpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpTZXRQYXJlbnQoSUZXTF9XaWRnZXQgKnBQYXJlbnQpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFBhcmVudChwUGFyZW50KTsNCit9DQorSUZXTF9XaWRnZXQqIElGV0xfV2lkZ2V0OjpHZXRPd25lcigpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldE93bmVyKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9XaWRnZXQ6OlNldE93bmVyKElGV0xfV2lkZ2V0ICpwT3duZXIpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldE93bmVyKHBPd25lcik7DQorfQ0KK0lGV0xfV2lkZ2V0KiBJRldMX1dpZGdldDo6R2V0T3V0ZXIoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRPdXRlcigpOw0KK30NCitGWF9EV09SRCBJRldMX1dpZGdldDo6R2V0U3R5bGVzKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0U3R5bGVzKCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLCBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPk1vZGlmeVN0eWxlcyhkd1N0eWxlc0FkZGVkLCBkd1N0eWxlc1JlbW92ZWQpOw0KK30NCitGWF9EV09SRCBJRldMX1dpZGdldDo6R2V0U3R5bGVzRXgoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRTdHlsZXNFeCgpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQorRlhfRFdPUkQgSUZXTF9XaWRnZXQ6OkdldFN0YXRlcygpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFN0YXRlcygpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCApDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9XaWRnZXQ6OlNldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQsIEZYX0xQVk9JRCBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFByaXZhdGVEYXRhKG1vZHVsZV9pZCwgcERhdGEsIGNhbGxiYWNrKTsNCit9DQorRlhfTFBWT0lEIElGV0xfV2lkZ2V0OjpHZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRQcml2YXRlRGF0YShtb2R1bGVfaWQpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpVcGRhdGUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5VcGRhdGUoKTsNCit9DQorRldMX0VSUglJRldMX1dpZGdldDo6TG9ja1VwZGF0ZSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkxvY2tVcGRhdGUoKTsNCit9DQorRldMX0VSUglJRldMX1dpZGdldDo6VW5sb2NrVXBkYXRlKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+VW5sb2NrVXBkYXRlKCk7DQorfQ0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+SGl0VGVzdChmeCwgZnkpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlRyYW5zZm9ybVRvKHBXaWRnZXQsIGZ4LCBmeSk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9XaWRnZXQ6OlRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5UcmFuc2Zvcm1UbyhwV2lkZ2V0LCBydCk7DQorfQ0KK0ZXTF9FUlIJSUZXTF9XaWRnZXQ6OkdldE1hdHJpeChDRlhfTWF0cml4ICZtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCApDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldE1hdHJpeChtYXRyaXgsIGJHbG9iYWwpOw0KK30NCitGV0xfRVJSCUlGV0xfV2lkZ2V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXRNYXRyaXgobWF0cml4KTsNCit9DQorRldMX0VSUglJRldMX1dpZGdldDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQorSUZXTF9UaGVtZVByb3ZpZGVyKglJRldMX1dpZGdldDo6R2V0VGhlbWVQcm92aWRlcigpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCit9DQorRldMX0VSUglJRldMX1dpZGdldDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCit9DQorRldMX0VSUglJRldMX1dpZGdldDo6U2V0RGF0YVByb3ZpZGVyKElGV0xfRGF0YVByb3ZpZGVyICpwRGF0YVByb3ZpZGVyKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXREYXRhUHJvdmlkZXIocERhdGFQcm92aWRlcik7DQorfQ0KK0lGV0xfV2lkZ2V0RGVsZWdhdGUqIElGV0xfV2lkZ2V0OjpTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUpDQorew0KKyAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldERlbGVnYXRlKHBEZWxlZ2F0ZSk7DQorfQ0KK0lGV0xfTm90ZVRocmVhZCogSUZXTF9XaWRnZXQ6OkdldE93bmVyVGhyZWFkKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0T3duZXJUaHJlYWQoKTsNCit9DQorQ0ZYX1NpemVGIElGV0xfV2lkZ2V0OjpHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRPZmZzZXRGcm9tUGFyZW50KHBQYXJlbnQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCkNCit7DQorICAgIElGV0xfQXBwICpwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBcHAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXIgPSBwQXBwLT5HZXRBZGFwdGVyTmF0aXZlKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfQWRhcHRlclRocmVhZE1nciAqcEFkYXB0ZXJUaHJlYWQgPSBwQWRhcHRlci0+R2V0VGhyZWFkTWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXJUaHJlYWQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIFNldE93bmVyVGhyZWFkKChDRldMX05vdGVUaHJlYWQqKXBBZGFwdGVyVGhyZWFkLT5HZXRDdXJyZW50VGhyZWFkKCkpOw0KKyAgICBJRldMX1dpZGdldCAqcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudDsNCisgICAgbV9wV2lkZ2V0TWdyLT5JbnNlcnRXaWRnZXQocFBhcmVudCwgbV9wSW50ZXJmYWNlKTsNCisgICAgaWYgKCFJc0NoaWxkKCkpIHsNCisgICAgICAgIHsNCisgICAgICAgICAgICBJRldMX1dpZGdldCAqcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXI7DQorICAgICAgICAgICAgaWYgKHBPd25lcikgew0KKyAgICAgICAgICAgICAgICBtX3BXaWRnZXRNZ3ItPlNldE93bmVyKHBPd25lciwgbV9wSW50ZXJmYWNlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3BXaWRnZXRNZ3ItPkNyZWF0ZVdpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCkNCit7DQorICAgIE5vdGlmeURyaXZlcigpOw0KKyAgICBJRldMX0Zvcm0gKnBGb3JtID0gKElGV0xfRm9ybSAqKUZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgICBpZiAocEZvcm0gJiYgcEZvcm0gIT0gbV9wSW50ZXJmYWNlKSB7DQorICAgICAgICBJRldMX0NvbnRlbnQgKnBDb250ZW50ID0gcEZvcm0tPkdldENvbnRlbnQoKTsNCisgICAgICAgIGlmIChwQ29udGVudCkgew0KKyAgICAgICAgICAgIHBDb250ZW50LT5SZW1vdmVXaWRnZXQobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIUlzQ2hpbGQoKSkgew0KKyAgICAgICAgbV9wV2lkZ2V0TWdyLT5EZXN0cm95V2lkZ2V0X05hdGl2ZShtX3BJbnRlcmZhY2UpOw0KKyAgICB9DQorICAgIG1fcFdpZGdldE1nci0+UmVtb3ZlV2lkZ2V0KG1fcEludGVyZmFjZSk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCit7DQorICAgIGlmIChiQXV0b1NpemUpIHsNCisgICAgICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmRWRnZSA9IEdldEVkZ2VXaWR0aCgpOw0KKyAgICAgICAgICAgIHJlY3QuSW5mbGF0ZShmRWRnZSwgZkVkZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkJvcmRlciA9IEdldEJvcmRlclNpemUoKTsNCisgICAgICAgICAgICByZWN0LkluZmxhdGUoZkJvcmRlciwgZkJvcmRlcik7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRJbXA6OkdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgSUZXTF9XaWRnZXQgKnBGb3JtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZvcm0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJlY3QuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgaWYgKHBGb3JtID09IG1fcEludGVyZmFjZSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHJldHVybiBUcmFuc2Zvcm1UbyhwRm9ybSwgcmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0T2xkID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9IHJlY3Q7DQorICAgIGlmIChJc0NoaWxkKCkpIHsNCisgICAgICAgIGlmIChGWFNZU19mYWJzKHJ0T2xkLndpZHRoIC0gcmVjdC53aWR0aCkgPiAwLjVmIHx8IEZYU1lTX2ZhYnMocnRPbGQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpID4gMC41Zikgew0KKyAgICAgICAgICAgIENGV0xfRXZ0U2l6ZUNoYW5nZWQgZXY7DQorICAgICAgICAgICAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgIGV2Lm1fcnRPbGQgPSBydE9sZDsNCisgICAgICAgICAgICBldi5tX3J0TmV3ID0gcmVjdDsNCisgICAgICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBTZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgICAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQoJmV2KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgbV9wV2lkZ2V0TWdyLT5TZXRXaWRnZXRSZWN0X05hdGl2ZShtX3BJbnRlcmZhY2UsIHJlY3QpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgR2V0RWRnZVJlY3QocmVjdCk7DQorICAgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQorICAgICAgICByZWN0LkRlZmxhdGUoZkVkZ2UsIGZFZGdlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldEltcDo6R2V0UGFyZW50KCkNCit7DQorICAgIHJldHVybiBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9QYXJlbnQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRQYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQpDQorew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQgPSBwUGFyZW50Ow0KKyAgICBtX3BXaWRnZXRNZ3ItPlNldFBhcmVudChwUGFyZW50LCBtX3BJbnRlcmZhY2UpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldEltcDo6R2V0T3duZXIoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX093bmVyKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0T3duZXIoSUZXTF9XaWRnZXQqIHBPd25lcikNCit7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcE93bmVyID0gcE93bmVyOw0KKyAgICBtX3BXaWRnZXRNZ3ItPlNldE93bmVyKHBPd25lciwgbV9wSW50ZXJmYWNlKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRJbXA6OkdldE91dGVyKCkNCit7DQorICAgIHJldHVybiBtX3BPdXRlcjsNCit9DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXRJbXA6OkdldFN0eWxlcygpDQorew0KKyAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkNCit7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIH5kd1N0eWxlc1JlbW92ZWQpIHwgZHdTdHlsZXNBZGRlZDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldEltcDo6R2V0U3R5bGVzRXgoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQorew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiB+ZHdTdHlsZXNFeFJlbW92ZWQpIHwgZHdTdHlsZXNFeEFkZGVkOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0SW1wOjpHZXRTdGF0ZXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorfQ0KK3N0YXRpYyB2b2lkIE5vdGlmeUhpZGVDaGlsZFdpZGdldChJRldMX1dpZGdldE1nciAqd2lkZ2V0TWdyLCBJRldMX1dpZGdldCAqd2lkZ2V0LCBDRldMX05vdGVEcml2ZXIgKm5vdGVEcml2ZXIpDQorew0KKyAgICBJRldMX1dpZGdldCAqY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldCh3aWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKGNoaWxkKSB7DQorICAgICAgICBub3RlRHJpdmVyLT5Ob3RpZnlUYXJnZXRIaWRlKGNoaWxkKTsNCisgICAgICAgIE5vdGlmeUhpZGVDaGlsZFdpZGdldCh3aWRnZXRNZ3IsIGNoaWxkLCBub3RlRHJpdmVyKTsNCisgICAgICAgIGNoaWxkID0gd2lkZ2V0TWdyLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgIH0NCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgKQ0KK3sNCisgICAgYlNldCA/IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IGR3U3RhdGVzKSA6IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5kd1N0YXRlcyk7DQorICAgIEZXTF9FUlIgcmV0ID0gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIGlmIChkd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHsNCisgICAgICAgIGlmIChiU2V0KSB7DQorICAgICAgICAgICAgcmV0ID0gbV9wV2lkZ2V0TWdyLT5IaWRlV2lkZ2V0X05hdGl2ZShtX3BJbnRlcmZhY2UpOw0KKyAgICAgICAgICAgIENGV0xfTm90ZURyaXZlciAqbm90ZURyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKUdldE93bmVyVGhyZWFkKCktPkdldE5vdGVEcml2ZXIoKTsNCisgICAgICAgICAgICBJRldMX1dpZGdldE1nciAqd2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgICAgICAgIG5vdGVEcml2ZXItPk5vdGlmeVRhcmdldEhpZGUobV9wSW50ZXJmYWNlKTsNCisgICAgICAgICAgICBJRldMX1dpZGdldCAqY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHsNCisgICAgICAgICAgICAgICAgbm90ZURyaXZlci0+Tm90aWZ5VGFyZ2V0SGlkZShjaGlsZCk7DQorICAgICAgICAgICAgICAgIE5vdGlmeUhpZGVDaGlsZFdpZGdldCh3aWRnZXRNZ3IsIGNoaWxkLCBub3RlRHJpdmVyKTsNCisgICAgICAgICAgICAgICAgY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldCA9IG1fcFdpZGdldE1nci0+U2hvd1dpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkLCBGWF9MUFZPSUQgcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKQ0KK3sNCisgICAgaWYgKCFtX3BQcml2YXRlRGF0YSkgew0KKyAgICAgICAgbV9wUHJpdmF0ZURhdGEgPSBuZXcgQ0ZYX1ByaXZhdGVEYXRhOw0KKyAgICB9DQorICAgIG1fcFByaXZhdGVEYXRhLT5TZXRQcml2YXRlRGF0YShtb2R1bGVfaWQsIHBEYXRhLCBjYWxsYmFjayk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfTFBWT0lEIENGV0xfV2lkZ2V0SW1wOjpHZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcml2YXRlRGF0YSwgTlVMTCk7DQorICAgIHJldHVybiBtX3BQcml2YXRlRGF0YS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6VXBkYXRlKCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6TG9ja1VwZGF0ZSgpDQorew0KKyAgICBtX2lMb2NrKys7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6VW5sb2NrVXBkYXRlKCkNCit7DQorICAgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgICAgICBtX2lMb2NrLS07DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldEltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICAgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgICBpZiAocnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgICAgfQ0KKyAgICBpZiAoSGFzRWRnZSgpKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRFZGdlOw0KKyAgICAgICAgR2V0RWRnZVJlY3QocnRFZGdlKTsNCisgICAgICAgIGlmIChydEVkZ2UuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9FZGdlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0UmVsYXRpdmU7DQorICAgICAgICBHZXRSZWxhdGl2ZVJlY3QocnRSZWxhdGl2ZSk7DQorICAgICAgICBpZiAocnRSZWxhdGl2ZS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0JvcmRlcjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6VHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KQ0KK3sNCisgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgQ0ZYX1NpemVGIHN6T2Zmc2V0Ow0KKyAgICAgICAgaWYgKElzUGFyZW50KHBXaWRnZXQpKSB7DQorICAgICAgICAgICAgc3pPZmZzZXQgPSBHZXRPZmZzZXRGcm9tUGFyZW50KHBXaWRnZXQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzek9mZnNldCA9ICgoSUZXTF9XaWRnZXQqKXBXaWRnZXQpLT5HZXRPZmZzZXRGcm9tUGFyZW50KG1fcEludGVyZmFjZSk7DQorICAgICAgICAgICAgc3pPZmZzZXQueCA9IC1zek9mZnNldC54Ow0KKyAgICAgICAgICAgIHN6T2Zmc2V0LnkgPSAtc3pPZmZzZXQueTsNCisgICAgICAgIH0NCisgICAgICAgIGZ4ICs9IHN6T2Zmc2V0Lng7DQorICAgICAgICBmeSArPSBzek9mZnNldC55Ow0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIENGWF9SZWN0RglyOw0KKyAgICBDRlhfTWF0cml4CW07DQorICAgIElGV0xfV2lkZ2V0ICogcGFyZW50ID0gR2V0UGFyZW50KCk7DQorICAgIGlmIChwYXJlbnQpIHsNCisgICAgICAgIEdldFdpZGdldFJlY3Qocik7DQorICAgICAgICBmeCArPSByLmxlZnQ7DQorICAgICAgICBmeSArPSByLnRvcDsNCisgICAgICAgIEdldE1hdHJpeChtLCBUUlVFKTsNCisgICAgICAgIG0uVHJhbnNmb3JtUG9pbnQoZngsIGZ5KTsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldCAqIGZvcm0xID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZm9ybTEsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgZm9ybTEtPkdldFdpZGdldFJlY3Qocik7DQorICAgICAgICBmeCArPSByLmxlZnQ7DQorICAgICAgICBmeSArPSByLnRvcDsNCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgICAgICAgaWYgKGZvcm0xLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9DYXB0aW9uKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgbCwgdCwgciwgYjsNCisgICAgICAgICAgICBsID0gdCA9IHIgPSBiID0gMDsNCisgICAgICAgICAgICBGV0xfR2V0QWRhcHRlcldpZGdldE1ncigpLT5HZXRTeXN0ZW1Cb3JkZXIobCwgdCwgciwgYik7DQorICAgICAgICAgICAgZnkgKz0gdDsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldCAqIGZvcm0yID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocFdpZGdldCwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGZvcm0yLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAoZm9ybTEgIT0gZm9ybTIpIHsNCisgICAgICAgIGZvcm0xLT5HZXRXaWRnZXRSZWN0KHIpOw0KKyAgICAgICAgZnggKz0gci5sZWZ0Ow0KKyAgICAgICAgZnkgKz0gci50b3A7DQorICAgICAgICBmb3JtMi0+R2V0V2lkZ2V0UmVjdChyKTsNCisgICAgICAgIGZ4IC09IHIubGVmdDsNCisgICAgICAgIGZ5IC09IHIudG9wOw0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICAgICAgICBpZiAoKGZvcm0xLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9DYXB0aW9uKSAhPSAoZm9ybTItPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgbCwgdCwgciwgYjsNCisgICAgICAgICAgICBsID0gdCA9IHIgPSBiID0gMDsNCisgICAgICAgICAgICBGV0xfR2V0QWRhcHRlcldpZGdldE1ncigpLT5HZXRTeXN0ZW1Cb3JkZXIobCwgdCwgciwgYik7DQorICAgICAgICAgICAgKGZvcm0xLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9DYXB0aW9uKSA/IChmeSArPSB0KSA6IChmeSAtPSB0KTsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgfQ0KKyAgICBwYXJlbnQgPSBwV2lkZ2V0LT5HZXRQYXJlbnQoKTsNCisgICAgaWYgKHBhcmVudCkgew0KKyAgICAgICAgcFdpZGdldC0+R2V0TWF0cml4KG0sIFRSVUUpOw0KKyAgICAgICAgQ0ZYX01hdHJpeCBtMTsNCisgICAgICAgIG0xLlJlc2V0KCk7DQorICAgICAgICBtMS5TZXRSZXZlcnNlKG0pOw0KKyAgICAgICAgbTEuVHJhbnNmb3JtUG9pbnQoZngsIGZ5KTsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQorICAgICAgICBmeCAtPSByLmxlZnQ7DQorICAgICAgICBmeSAtPSByLnRvcDsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KQ0KK3sNCisgICAgcmV0dXJuIFRyYW5zZm9ybVRvKHBXaWRnZXQsIHJ0LmxlZnQsIHJ0LnRvcCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRJbXA6OkdldE1hdHJpeChDRlhfTWF0cml4ICZtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChiR2xvYmFsKSB7DQorICAgICAgICBJRldMX1dpZGdldCAqIHBhcmVudCA9IEdldFBhcmVudCgpOw0KKyAgICAgICAgQ0ZYX1B0ckFycmF5CXBhcmVudHM7DQorICAgICAgICB3aGlsZSAocGFyZW50KSB7DQorICAgICAgICAgICAgcGFyZW50cy5BZGQocGFyZW50KTsNCisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPkdldFBhcmVudCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbWF0cml4LlJlc2V0KCk7DQorICAgICAgICBDRlhfTWF0cml4IGN0bU9uUGFyZW50Ow0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgICBGWF9JTlQzMiBjb3VudCA9IHBhcmVudHMuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gY291bnQgLSAyOyBpID49IDA7IGktLSkgew0KKyAgICAgICAgICAgIHBhcmVudCA9IChJRldMX1dpZGdldCAqKSBwYXJlbnRzLkdldEF0KGkpOw0KKyAgICAgICAgICAgIHBhcmVudC0+R2V0TWF0cml4KGN0bU9uUGFyZW50LCBGQUxTRSk7DQorICAgICAgICAgICAgcGFyZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgICAgICAgIG1hdHJpeC5Db25jYXQoY3RtT25QYXJlbnQsIFRSVUUpOw0KKyAgICAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgVFJVRSk7DQorICAgICAgICB9DQorICAgICAgICBtYXRyaXguQ29uY2F0KG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQsIFRSVUUpOw0KKyAgICAgICAgcGFyZW50cy5SZW1vdmVBbGwoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1hdHJpeCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0SW1wOjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1dpZGdldCAqIHBhcmVudCA9IEdldFBhcmVudCgpOw0KKyAgICBpZiAoIXBhcmVudCkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50ID0gbWF0cml4Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorSUZXTF9UaGVtZVByb3ZpZGVyKiBDRldMX1dpZGdldEltcDo6R2V0VGhlbWVQcm92aWRlcigpDQorew0KKyAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKQ0KK3sNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciAqcERhdGFQcm92aWRlcikNCit7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciA9IHBEYXRhUHJvdmlkZXI7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9XaWRnZXREZWxlZ2F0ZSogQ0ZXTF9XaWRnZXRJbXA6OlNldERlbGVnYXRlKElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSkNCit7DQorICAgIGlmICghbV9wQ3VyRGVsZWdhdGUpIHsNCisgICAgICAgIG1fcEN1ckRlbGVnYXRlID0gbV9wRGVsZWdhdGU7DQorICAgIH0NCisgICAgaWYgKCFwRGVsZWdhdGUpIHsNCisgICAgICAgIHJldHVybiBtX3BDdXJEZWxlZ2F0ZTsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlICpwT2xkRGVsZWdhdGUgPSBtX3BDdXJEZWxlZ2F0ZTsNCisgICAgbV9wQ3VyRGVsZWdhdGUgPSBwRGVsZWdhdGU7DQorICAgIHJldHVybiBwT2xkRGVsZWdhdGU7DQorfQ0KK0lGV0xfTm90ZVRocmVhZCogQ0ZXTF9XaWRnZXRJbXA6OkdldE93bmVyVGhyZWFkKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoSUZXTF9Ob3RlVGhyZWFkKiltX3BPd25lclRocmVhZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0T3duZXJUaHJlYWQoQ0ZXTF9Ob3RlVGhyZWFkICpwT3duZXJUaHJlYWQpDQorew0KKyAgICBtX3BPd25lclRocmVhZCA9IHBPd25lclRocmVhZDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0SW1wOjpHZXRQcm9wZXJ0aWVzKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcykNCit7DQorICAgIHByb3BlcnRpZXMgPSAqbV9wUHJvcGVydGllczsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0SW1wOjpTZXRQcm9wZXJ0aWVzKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcykNCit7DQorICAgICptX3BQcm9wZXJ0aWVzID0gcHJvcGVydGllczsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRJbXA6OkdldEludGVyZmFjZSgpDQorew0KKyAgICByZXR1cm4gbV9wSW50ZXJmYWNlOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpTZXRJbnRlcmZhY2UoSUZXTF9XaWRnZXQgKnBJbnRlcmZhY2UpDQorew0KKyAgICBtX3BJbnRlcmZhY2UgPSBwSW50ZXJmYWNlOw0KK30NCitDRldMX1dpZGdldEltcDo6Q0ZXTF9XaWRnZXRJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogbV9wUHJvcGVydGllcyhOVUxMKQ0KKyAgICAsIG1fcFByaXZhdGVEYXRhKE5VTEwpDQorICAgICwgbV9wRGVsZWdhdGUoTlVMTCkNCisgICAgLCBtX3BDdXJEZWxlZ2F0ZShOVUxMKQ0KKyAgICAsIG1fcE91dGVyKHBPdXRlcikNCisgICAgLCBtX3BJbnRlcmZhY2UoTlVMTCkNCisgICAgLCBtX2lMb2NrKDApDQorew0KKyAgICBtX3BQcm9wZXJ0aWVzID0gRlhfTkVXIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCisgICAgbV9wV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BXaWRnZXRNZ3IgIT0gTlVMTCk7DQorfQ0KK0NGV0xfV2lkZ2V0SW1wOjpDRldMX1dpZGdldEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KKyAgICA6IG1fcFByb3BlcnRpZXMoTlVMTCkNCisgICAgLCBtX3BQcml2YXRlRGF0YShOVUxMKQ0KKyAgICAsIG1fcERlbGVnYXRlKE5VTEwpDQorICAgICwgbV9wQ3VyRGVsZWdhdGUoTlVMTCkNCisgICAgLCBtX3BPdXRlcihwT3V0ZXIpDQorICAgICwgbV9wSW50ZXJmYWNlKE5VTEwpDQorICAgICwgbV9pTG9jaygwKQ0KK3sNCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzID0gRlhfTkVXIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCisgICAgfQ0KKyAgICAqbV9wUHJvcGVydGllcyA9IHByb3BlcnRpZXM7DQorICAgIG1fcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0TWdyICE9IE5VTEwpOw0KK30NCitDRldMX1dpZGdldEltcDo6fkNGV0xfV2lkZ2V0SW1wKCkNCit7DQorICAgIGlmIChtX3BQcml2YXRlRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIG1fcFByaXZhdGVEYXRhOw0KKyAgICAgICAgbV9wUHJpdmF0ZURhdGEgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzKSB7DQorICAgICAgICBkZWxldGUgbV9wUHJvcGVydGllczsNCisgICAgICAgIG1fcFByb3BlcnRpZXMgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9XaWRnZXRJbXA6OklzRW5hYmxlZCgpDQorew0KKyAgICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzVmlzaWJsZSgpDQorew0KKyAgICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc0FjdGl2ZSgpDQorew0KKyAgICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzT3ZlckxhcHBlcigpDQorew0KKyAgICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfV2luZG93VHlwZU1hc2spID09IEZXTF9XR1RTVFlMRV9PdmVyTGFwcGVyOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc1BvcHVwKCkNCit7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX1BvcHVwOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc0NoaWxkKCkNCit7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NoaWxkOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpJc0xvY2tlZCgpDQorew0KKyAgICByZXR1cm4gbV9pTG9jayA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzT2Zmc2NyZWVuKCkNCit7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX09mZnNjcmVlbjsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SGFzQm9yZGVyKCkNCit7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcjsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SGFzRWRnZSgpDQorew0KKyAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzazsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6R2V0RWRnZVJlY3QoQ0ZYX1JlY3RGICZydEVkZ2UpDQorew0KKyAgICBydEVkZ2UgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICBydEVkZ2UubGVmdCA9IHJ0RWRnZS50b3AgPSAwOw0KKyAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDWCA9IEdldEJvcmRlclNpemUoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZDWSA9IEdldEJvcmRlclNpemUoRkFMU0UpOw0KKyAgICAgICAgcnRFZGdlLkRlZmxhdGUoZkNYLCBmQ1kpOw0KKyAgICB9DQorfQ0KK0ZYX0ZMT0FUIENGV0xfV2lkZ2V0SW1wOjpHZXRCb3JkZXJTaXplKEZYX0JPT0wgYkNYICkNCit7DQorICAgIEZYX0ZMT0FUICpwZkJvcmRlciA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShiQ1ggPyBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIgOiBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBmQm9yZGVyLCAwKTsNCisgICAgcmV0dXJuICpwZkJvcmRlcjsNCit9DQorRlhfRkxPQVQgQ0ZXTF9XaWRnZXRJbXA6OkdldEVkZ2VXaWR0aCgpDQorew0KKyAgICBGWF9EV09SRCBkd0NhcGFjaXR5ID0gMDsNCisgICAgc3dpdGNoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfRWRnZU1hc2spIHsNCisgICAgICAgIGNhc2UgRldMX1dHVFNUWUxFX0VkZ2VGbGF0OiB7DQorICAgICAgICAgICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZUZsYXQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVFNUWUxFX0VkZ2VSYWlzZWQ6IHsNCisgICAgICAgICAgICAgICAgZHdDYXBhY2l0eSA9IEZXTF9XR1RDQVBBQ0lUWV9FZGdlUmFpc2VkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOiB7DQorICAgICAgICAgICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVN1bmtlbjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChkd0NhcGFjaXR5ID4gMCkgew0KKyAgICAgICAgRlhfRkxPQVQgKmZSZXQgPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoZHdDYXBhY2l0eSk7DQorICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGZSZXQsIDApOw0KKyAgICAgICAgcmV0dXJuICpmUmV0Ow0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpHZXRSZWxhdGl2ZVJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsNCit9DQorRlhfTFBWT0lEIENGV0xfV2lkZ2V0SW1wOjpHZXRUaGVtZUNhcGFjaXR5KEZYX0RXT1JEIGR3Q2FwYWNpdHkpDQorew0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lLCBOVUxMKTsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgICAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHJldHVybiBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorSUZXTF9UaGVtZVByb3ZpZGVyKiBDRldMX1dpZGdldEltcDo6R2V0QXZhaWxhYmxlVGhlbWUoKQ0KK3sNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0ICpwVXAgPSBtX3BJbnRlcmZhY2U7DQorICAgIGRvIHsNCisgICAgICAgIEZXTF9XR1RSRUxBVElPTiByZWxhdGlvbiA9IChwVXAtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX1BvcHVwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGV0xfV0dUUkVMQVRJT05fT3duZXIgOiBGV0xfV0dUUkVMQVRJT05fUGFyZW50Ow0KKyAgICAgICAgcFVwID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocFVwLCByZWxhdGlvbik7DQorICAgICAgICBpZiAocFVwKSB7DQorICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwUmV0ID0gcFVwLT5HZXRUaGVtZVByb3ZpZGVyKCk7DQorICAgICAgICAgICAgaWYgKHBSZXQgJiYgcFJldC0+SXNWYWxpZFdpZGdldChtX3BJbnRlcmZhY2UpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwUmV0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAocFVwKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9BcHBJbXAqKUZXTF9HZXRBcHAoKSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCit9DQorQ0ZXTF9XaWRnZXRJbXAqIENGV0xfV2lkZ2V0SW1wOjpHZXRSb290T3V0ZXIoKQ0KK3sNCisgICAgSUZXTF9XaWRnZXQgKnBSZXQgPSBtX3BPdXRlcjsNCisgICAgSUZXTF9XaWRnZXQgKnBPdXRlciA9IHBSZXQ7DQorICAgIHdoaWxlIChwT3V0ZXIpIHsNCisgICAgICAgIHBSZXQgPSBwT3V0ZXI7DQorICAgICAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7DQorICAgIH0NCisgICAgcmV0dXJuIChDRldMX1dpZGdldEltcCopcFJldDsNCit9DQorQ0ZXTF9XaWRnZXRJbXAqIENGV0xfV2lkZ2V0SW1wOjpHZXRTYW1lQW5jZXN0b3IoQ0ZXTF9XaWRnZXRJbXAgKnBXaWRnZXQpDQorew0KKyAgICBDRlhfUHRyQXJyYXkgYXJyMSwgYXJyMjsNCisgICAgQ0ZXTF9XaWRnZXRJbXAgKnBBbmNlc3RvciA9IHBXaWRnZXQ7DQorICAgIEZXTF9XR1RSRUxBVElPTiByZWxhdGlvbjsNCisgICAgZG8gew0KKyAgICAgICAgYXJyMS5BZGQocEFuY2VzdG9yKTsNCisgICAgICAgIHJlbGF0aW9uID0gIHBBbmNlc3Rvci0+SXNQb3B1cCgpID8gRldMX1dHVFJFTEFUSU9OX093bmVyIDogRldMX1dHVFJFTEFUSU9OX1BhcmVudDsNCisgICAgfSB3aGlsZSAoKHBBbmNlc3RvciA9IChDRldMX1dpZGdldEltcCopbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocEFuY2VzdG9yLT5tX3BJbnRlcmZhY2UsIHJlbGF0aW9uKSkgIT0gTlVMTCk7DQorICAgIHBBbmNlc3RvciA9IHRoaXM7DQorICAgIGRvIHsNCisgICAgICAgIGFycjIuQWRkKHBBbmNlc3Rvcik7DQorICAgICAgICByZWxhdGlvbiA9ICBwQW5jZXN0b3ItPklzUG9wdXAoKSA/IEZXTF9XR1RSRUxBVElPTl9Pd25lciA6IEZXTF9XR1RSRUxBVElPTl9QYXJlbnQ7DQorICAgIH0gd2hpbGUgKChwQW5jZXN0b3IgPSAoQ0ZXTF9XaWRnZXRJbXAqKW1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBBbmNlc3Rvci0+bV9wSW50ZXJmYWNlLCByZWxhdGlvbikpICE9IE5VTEwpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYXJyMS5HZXRTaXplKCk7IGkgKyspIHsNCisgICAgICAgIEZYX0xQVk9JRCBwVm9pZCA9IGFycjFbaV07DQorICAgICAgICBpZiAoYXJyMi5GaW5kKHBWb2lkKSA8IDApIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIChDRldMX1dpZGdldEltcCopcFZvaWQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGWF9TaXplRiBDRldMX1dpZGdldEltcDo6R2V0T2Zmc2V0RnJvbUFuY2VzdG9yKENGV0xfV2lkZ2V0SW1wICpwQW5jZXN0b3IpDQorew0KKyAgICBDRlhfU2l6ZUYgc3pSZXQ7DQorICAgIHN6UmV0LlNldCgwLCAwKTsNCisgICAgaWYgKHBBbmNlc3RvciA9PSB0aGlzKSB7DQorICAgICAgICByZXR1cm4gc3pSZXQ7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXAgKnBXaWRnZXQgPSB0aGlzOw0KKyAgICBkbyB7DQorICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgICBzelJldC54ICs9IHJlY3QubGVmdDsNCisgICAgICAgIHN6UmV0LnkgKz0gcmVjdC50b3A7DQorICAgICAgICBGV0xfV0dUUkVMQVRJT04gcmVsYXRpb24gPSBwV2lkZ2V0LT5Jc1BvcHVwKCkgPyBGV0xfV0dUUkVMQVRJT05fT3duZXIgOiBGV0xfV0dUUkVMQVRJT05fUGFyZW50Ow0KKyAgICAgICAgcFdpZGdldCA9IChDRldMX1dpZGdldEltcCopbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQoKElGV0xfV2lkZ2V0KilwV2lkZ2V0LCByZWxhdGlvbik7DQorICAgIH0gd2hpbGUocFdpZGdldCAmJiBwV2lkZ2V0ICE9IHBBbmNlc3Rvcik7DQorICAgIHJldHVybiBzelJldDsNCit9DQorRlhfQk9PTAlDRldMX1dpZGdldEltcDo6VHJhbnNmb3JtVG9PdXRlcihGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wT3V0ZXIsIEZBTFNFKTsNCisgICAgZnggKz0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0Ow0KKyAgICBmeCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9XaWRnZXRJbXA6OlRyYW5zZm9ybUZyb21PdXRlcihGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wT3V0ZXIsIEZBTFNFKTsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIG1fcE91dGVyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICBmeCAtPSByZWN0LmxlZnQ7DQorICAgIGZ4IC09IHJlY3QudG9wOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorI2RlZmluZSBGV0xfV0dUX0NhbGNIZWlnaHQJCQkJMjA0OA0KKyNkZWZpbmUgRldMX1dHVF9DYWxjV2lkdGgJCQkJMjA0OA0KKyNkZWZpbmUgRldMX1dHVF9DYWxjTXVsdGlMaW5lRGVmV2lkdGgJMTIwLjBmDQorQ0ZYX1NpemVGIENGV0xfV2lkZ2V0SW1wOjpDYWxjVGV4dFNpemUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIEZYX0JPT0wgYk11bHRpTGluZSAsIEZYX0lOVDMyIGlMaW5lV2lkdGggKQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6Ow0KKyAgICBzei5TZXQoMCwgMCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lLCBzeik7DQorICAgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7DQorICAgIGNhbFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBjYWxQYXJ0Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMgPSBiTXVsdGlMaW5lID8gRkRFX1RUT1NUWUxFX0xpbmVXcmFwIDogRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICAgIGNhbFBhcnQubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQ7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBiTXVsdGlMaW5lID8NCisgICAgICAgICAgICAgICAgICAgICAgKGlMaW5lV2lkdGggPiAwID8gKEZYX0ZMT0FUKWlMaW5lV2lkdGggOiBGV0xfV0dUX0NhbGNNdWx0aUxpbmVEZWZXaWR0aCkgOg0KKyAgICAgICAgICAgICAgICAgICAgICBGV0xfV0dUX0NhbGNXaWR0aDsNCisgICAgcmVjdC5TZXQoMCwgMCwgZldpZHRoLCBGV0xfV0dUX0NhbGNIZWlnaHQpOw0KKyAgICBwVGhlbWUtPkNhbGNUZXh0UmVjdCgmY2FsUGFydCwgcmVjdCk7DQorICAgIHN6LnggPSByZWN0LndpZHRoOw0KKyAgICBzei55ID0gcmVjdC5oZWlnaHQ7DQorICAgIHJldHVybiBzejsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6Q2FsY1RleHRSZWN0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBGWF9EV09SRCBkd1RUT1N0eWxlcywgRlhfSU5UMzIgaVRUT0FsaWduLCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBDRldMX1RoZW1lVGV4dCBjYWxQYXJ0Ow0KKyAgICBjYWxQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgY2FsUGFydC5tX3dzVGV4dCA9IHdzVGV4dDsNCisgICAgY2FsUGFydC5tX2R3VFRPU3R5bGVzID0gZHdUVE9TdHlsZXM7DQorICAgIGNhbFBhcnQubV9pVFRPQWxpZ24gPSBpVFRPQWxpZ247DQorICAgIHBUaGVtZS0+Q2FsY1RleHRSZWN0KCZjYWxQYXJ0LCByZWN0KTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6U2V0Rm9jdXMoRlhfQk9PTCBiRm9jdXMpDQorew0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEcml2ZXIpOw0KKyAgICBJRldMX1dpZGdldCAqY3VyRm9jdXMgPSAoKENGV0xfTm90ZURyaXZlciopcERyaXZlciktPkdldEZvY3VzKCk7DQorICAgIGlmIChiRm9jdXMgJiYgY3VyRm9jdXMgIT0gbV9wSW50ZXJmYWNlKSB7DQorICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhtX3BJbnRlcmZhY2UpOw0KKyAgICB9IGVsc2UgaWYgKCFiRm9jdXMgJiYgY3VyRm9jdXMgPT0gbV9wSW50ZXJmYWNlKSB7DQorICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhOVUxMKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpTZXRHcmFiKEZYX0JPT0wgYlNldCkNCit7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICAgIENGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgcERyaXZlci0+U2V0R3JhYihtX3BJbnRlcmZhY2UsIGJTZXQpOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpHZXRQb3B1cFBvcyhGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApDQorew0KKyAgICBpZiAoR2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTWVudSkgew0KKyAgICAgICAgcmV0dXJuIEdldFBvcHVwUG9zTWVudShmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3gpIHsNCisgICAgICAgICAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3BXaWRnZXRNZ3ItPkdldEFkYXB0ZXJQb3B1cFBvcyhtX3BJbnRlcmZhY2UsIGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0UG9wdXBQb3NDb21ib0JveChmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChHZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlciAmJiBtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgICAgICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRBZGFwdGVyUG9wdXBQb3MobV9wSW50ZXJmYWNlLCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBHZXRQb3B1cFBvc0dlbmVyYWwoZk1pbkhlaWdodCwgZk1heEhlaWdodCwgcnRBbmNob3IsIHJ0UG9wdXApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDRldMX1dpZGdldEltcDo6R2V0UG9wdXBQb3NNZW51KEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkNCit7DQorICAgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgICAgRlhfRkxPQVQgZnkgPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCisgICAgR2V0U2NyZWVuU2l6ZShmU2NyZWVuV2lkdGgsIGZTY3JlZW5IZWlnaHQpOw0KKyAgICBpZiAoR2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9NTlVfVmVydCkgew0KKyAgICAgICAgRlhfQk9PTCBiTGVmdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA8IDA7DQorICAgICAgICBGWF9GTE9BVCBmUmlnaHQgPSBydEFuY2hvci5yaWdodCgpICsgcnRQb3B1cC53aWR0aDsNCisgICAgICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICAgICAgICBpZiAoZlJpZ2h0ICsgZnggPiBmU2NyZWVuV2lkdGggfHwgYkxlZnQpIHsNCisgICAgICAgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0IC0gcnRQb3B1cC53aWR0aCwgcnRBbmNob3IudG9wLCBydFBvcHVwLndpZHRoLAlydFBvcHVwLmhlaWdodCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLnJpZ2h0KCksIHJ0QW5jaG9yLnRvcCwgcnRQb3B1cC53aWR0aCwgcnRQb3B1cC5oZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHJ0QW5jaG9yLmJvdHRvbSgpICsgcnRQb3B1cC5oZWlnaHQ7DQorICAgICAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgICAgICAgaWYgKGZCb3R0b20gKyBmeSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgICAgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci50b3AgLSBydFBvcHVwLmhlaWdodCwgcnRQb3B1cC53aWR0aCwgcnRQb3B1cC5oZWlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci5ib3R0b20oKSwgcnRQb3B1cC53aWR0aCwgcnRQb3B1cC5oZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJ0UG9wdXAuT2Zmc2V0KGZ4LCBmeSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpHZXRQb3B1cFBvc0NvbWJvQm94KEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkNCit7DQorICAgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgICAgRlhfRkxPQVQgZnkgPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCisgICAgR2V0U2NyZWVuU2l6ZShmU2NyZWVuV2lkdGgsIGZTY3JlZW5IZWlnaHQpOw0KKyAgICBGWF9GTE9BVCBmUG9wSGVpZ2h0ID0gcnRQb3B1cC5oZWlnaHQ7DQorICAgIGlmIChydFBvcHVwLmhlaWdodCA+IGZNYXhIZWlnaHQpIHsNCisgICAgICAgIGZQb3BIZWlnaHQgPSBmTWF4SGVpZ2h0Ow0KKyAgICB9IGVsc2UgaWYgKHJ0UG9wdXAuaGVpZ2h0IDwgZk1pbkhlaWdodCkgew0KKyAgICAgICAgZlBvcEhlaWdodCA9IGZNaW5IZWlnaHQ7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZHRoID0gRlhfTUFYKHJ0QW5jaG9yLndpZHRoLCBydFBvcHVwLndpZHRoKTsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHJ0QW5jaG9yLmJvdHRvbSgpICsgZlBvcEhlaWdodDsNCisgICAgVHJhbnNmb3JtVG8oTlVMTCwgZngsIGZ5KTsNCisgICAgaWYgKGZCb3R0b20gKyBmeSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLnRvcCAtIGZQb3BIZWlnaHQsIGZXaWR0aCwgZlBvcEhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci5ib3R0b20oKSwgZldpZHRoLCBmUG9wSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBydFBvcHVwLk9mZnNldChmeCwgZnkpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX1dpZGdldEltcDo6R2V0UG9wdXBQb3NHZW5lcmFsKEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkNCit7DQorICAgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgICAgRlhfRkxPQVQgZnkgPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCisgICAgR2V0U2NyZWVuU2l6ZShmU2NyZWVuV2lkdGgsIGZTY3JlZW5IZWlnaHQpOw0KKyAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgICBpZiAocnRBbmNob3IuYm90dG9tKCkgKyBmeSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLnRvcCAtIHJ0UG9wdXAuaGVpZ2h0LCBydFBvcHVwLndpZHRoLCBydFBvcHVwLmhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci5ib3R0b20oKSwgcnRQb3B1cC53aWR0aCwgcnRQb3B1cC5oZWlnaHQpOw0KKyAgICB9DQorICAgIHJ0UG9wdXAuT2Zmc2V0KGZ4LCBmeSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpHZXRTY3JlZW5TaXplKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KQ0KK3sNCisgICAgSUZXTF9BZGFwdGVyTmF0aXZlICpwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgSUZXTF9BZGFwdGVyTW9uaXRvck1nciAqcE1vbml0b3JNZ3IgPSBwTmF0aXZlLT5HZXRNb25pdG9yTWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1vbml0b3JNZ3IsIEZBTFNFKTsNCisgICAgRldMX0hNT05JVE9SIGhNb25pdG9yID0gcE1vbml0b3JNZ3ItPkdldE1vbml0b3JCeVBvaW50KGZ4LCBmeSk7DQorICAgIHBNb25pdG9yTWdyLT5HZXRNb25pdG9yU2l6ZShoTW9uaXRvciwgZngsIGZ5KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBFdmVudFNvdXJjZSAsIEZYX0RXT1JEIGR3RmlsdGVyICkNCit7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE5vdGVEcml2ZXIpOw0KKyAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BJbnRlcmZhY2UsIHBFdmVudFNvdXJjZSwgZHdGaWx0ZXIpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKQ0KK3sNCisgICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQorICAgIHBOb3RlRHJpdmVyLT5VbnJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wSW50ZXJmYWNlKTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6RGlzcGF0Y2hLZXlFdmVudChDRldMX01zZ0tleSAqcE5vdGUpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBOb3RlKTsNCisgICAgQ0ZXTF9Nc2dLZXkgKnBFdmVudCA9IChDRldMX01zZ0tleSopcE5vdGUtPkNsb25lVG9FdmVudCgpOw0KKyAgICBwRXZlbnQtPm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcEV2ZW50LT5tX2R3Q21kID0gcE5vdGUtPm1fZHdDbWQ7DQorICAgIHBFdmVudC0+bV9kd0tleUNvZGUgPSBwTm90ZS0+bV9kd0tleUNvZGU7DQorICAgIHBFdmVudC0+bV9kd0ZsYWdzID0gcE5vdGUtPm1fZHdGbGFnczsNCisgICAgRGlzcGF0Y2hFdmVudCgoQ0ZXTF9FdmVudCopcEV2ZW50KTsNCisgICAgcEV2ZW50LT5SZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkRpc3BhdGNoRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgaWYgKG1fcE91dGVyKSB7DQorICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBtX3BPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQorICAgIHBOb3RlRHJpdmVyLT5TZW5kTm90ZShwRXZlbnQpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpSZXBhaW50KGNvbnN0IENGWF9SZWN0RiAqcFJlY3QgKQ0KK3sNCisgICAgaWYgKHBSZWN0KSB7DQorICAgICAgICBtX3BXaWRnZXRNZ3ItPlJlcGFpbnRXaWRnZXQobV9wSW50ZXJmYWNlLCBwUmVjdCk7DQorICAgICAgICByZXR1cm4gOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgICBtX3BXaWRnZXRNZ3ItPlJlcGFpbnRXaWRnZXQobV9wSW50ZXJmYWNlLCAmcmVjdCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkRyYXdCYWNrZ3JvdW5kKENGWF9HcmFwaGljcwkJICpwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIJCQkgIGlQYXJ0QmssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyICAgKnBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4CSAqcE1hdHJpeCApDQorew0KKyAgICBDRlhfUmVjdEYgcnRSZWxhdGl2ZTsNCisgICAgR2V0UmVsYXRpdmVSZWN0KHJ0UmVsYXRpdmUpOw0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gaVBhcnRCazsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIFRSVUUpOw0KKyAgICB9DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRSZWxhdGl2ZTsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcwkJKnBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyCQkJIGlQYXJ0Qm9yZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyCSpwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4CSpwTWF0cml4ICkNCit7DQorICAgIENGWF9SZWN0RiBydFJlbGF0aXZlOw0KKyAgICBHZXRSZWxhdGl2ZVJlY3QocnRSZWxhdGl2ZSk7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBpUGFydEJvcmRlcjsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIFRSVUUpOw0KKyAgICB9DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRSZWxhdGl2ZTsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpEcmF3RWRnZShDRlhfR3JhcGhpY3MJCQkqcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyCQkJCSBpUGFydEVkZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyICAgICpwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeAkJKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCisgICAgR2V0RWRnZVJlY3QocnRFZGdlKTsNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IGlQYXJ0RWRnZTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIFRSVUUpOw0KKyAgICB9DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRFZGdlOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6Ok5vdGlmeURyaXZlcigpDQorew0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocERyaXZlcik7DQorICAgIHBEcml2ZXItPk5vdGlmeVRhcmdldERlc3Ryb3kobV9wSW50ZXJmYWNlKTsNCit9DQorQ0ZYX1NpemVGIENGV0xfV2lkZ2V0SW1wOjpHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6UmV0Ow0KKyAgICBzelJldC5TZXQoMCwgMCk7DQorICAgIGlmIChwUGFyZW50ID09IChJRldMX1dpZGdldCopdGhpcykgew0KKyAgICAgICAgcmV0dXJuIHN6UmV0Ow0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIHN6UmV0KTsNCisgICAgc3pSZXQueCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQ7DQorICAgIHN6UmV0LnkgKz0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3A7DQorICAgIElGV0xfV2lkZ2V0ICpwRHN0V2lkZ2V0ID0gR2V0UGFyZW50KCk7DQorICAgIHdoaWxlIChwRHN0V2lkZ2V0ICYmIHBEc3RXaWRnZXQgIT0gcFBhcmVudCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RHN0Ow0KKyAgICAgICAgcERzdFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydERzdCk7DQorICAgICAgICBzelJldC54ICs9IHJ0RHN0LmxlZnQ7DQorICAgICAgICBzelJldC55ICs9IHJ0RHN0LnRvcDsNCisgICAgICAgIHBEc3RXaWRnZXQgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQocERzdFdpZGdldCwgRldMX1dHVFJFTEFUSU9OX1BhcmVudCk7DQorICAgIH0NCisgICAgcmV0dXJuIHN6UmV0Ow0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpJc1BhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCkNCit7DQorICAgIGlmIChwUGFyZW50ID09IChJRldMX1dpZGdldCopdGhpcykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0ICpwVXBXaWRnZXQgPSBHZXRQYXJlbnQoKTsNCisgICAgd2hpbGUgKHBVcFdpZGdldCkgew0KKyAgICAgICAgaWYgKHBVcFdpZGdldCA9PSBwUGFyZW50KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBwVXBXaWRnZXQgPSBwVXBXaWRnZXQtPkdldFBhcmVudCgpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSgpDQorew0KK30NCitGWF9JTlQzMiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQsIDApOw0KKyAgICBDRldMX1dpZGdldEltcCAqcFdpZGdldCA9IChDRldMX1dpZGdldEltcCopKChJRldMX1RhcmdldERhdGEqKXBNZXNzYWdlLT5tX3BEc3RUYXJnZXQpLT5HZXREYXRhKCk7DQorICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfRXZ0TW91c2UgZXZ0Ow0KKyAgICAgICAgICAgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgICAgICAgICAgICBldnQubV9kd0NtZCA9ICgoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2UpLT5tX2R3Q21kOw0KKyAgICAgICAgICAgICAgICBldnQubV9kd0ZsYWdzID0gKChDRldMX01zZ01vdXNlKilwTWVzc2FnZSktPm1fZHdGbGFnczsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fZnggPSAoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKS0+bV9meDsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fZnkgPSAoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKS0+bV9meTsNCisgICAgICAgICAgICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsOiB7DQorICAgICAgICAgICAgICAgIENGV0xfRXZ0TW91c2VXaGVlbCBldnQ7DQorICAgICAgICAgICAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgICAgIGV2dC5tX2R3RmxhZ3MgPSAoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpLT5tX2R3RmxhZ3M7DQorICAgICAgICAgICAgICAgIGV2dC5tX2ZEZWx0YVggPSAoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpLT5tX2ZEZWx0YVg7DQorICAgICAgICAgICAgICAgIGV2dC5tX2ZEZWx0YVkgPSAoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpLT5tX2ZEZWx0YVk7DQorICAgICAgICAgICAgICAgIGV2dC5tX2Z4ID0gKChDRldMX01zZ01vdXNlV2hlZWwqKXBNZXNzYWdlKS0+bV9meDsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fZnkgPSAoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpLT5tX2Z5Ow0KKyAgICAgICAgICAgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgICAgICAgICAgICBDRldMX0V2dEtleSBldnQ7DQorICAgICAgICAgICAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7Ow0KKyAgICAgICAgICAgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOzsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fZHdLZXlDb2RlID0gKChDRldMX01zZ0tleSopcE1lc3NhZ2UpLT5tX2R3S2V5Q29kZTsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fZHdGbGFncyA9ICgoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlKS0+bV9kd0ZsYWdzOw0KKyAgICAgICAgICAgICAgICBldnQubV9kd0NtZCA9ICgoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlKS0+bV9kd0NtZDsNCisgICAgICAgICAgICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czogew0KKyAgICAgICAgICAgICAgICBDRldMX0V2dFNldEZvY3VzIGV2dDsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fcFNyY1RhcmdldCA9ICgoQ0ZXTF9Nc2dTZXRGb2N1cyopcE1lc3NhZ2UpLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgICAgICAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSAoKENGV0xfTXNnU2V0Rm9jdXMqKXBNZXNzYWdlKS0+bV9wRHN0VGFyZ2V0Ow0KKyAgICAgICAgICAgICAgICBldnQubV9wU2V0Rm9jdXMgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgICAgIHBXaWRnZXQtPkRpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgICAgICAgICAgIENGV0xfRXZ0S2lsbEZvY3VzIGV2dDsNCisgICAgICAgICAgICAgICAgZXZ0Lm1fcFNyY1RhcmdldCA9ICgoQ0ZXTF9Nc2dLaWxsRm9jdXMqKXBNZXNzYWdlKS0+bV9wRHN0VGFyZ2V0Ow0KKyAgICAgICAgICAgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gKChDRldMX01zZ0tpbGxGb2N1cyopcE1lc3NhZ2UpLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgICAgICAgICAgIGV2dC5tX3BLaWxsRm9jdXMgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgICAgICAgICAgIHBXaWRnZXQtPkRpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRldMX0V2dERyYXcgZXZ0Ow0KKyAgICBldnQubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorY2xhc3MgQ0ZXTF9DdXN0b20gOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXANCit7DQorcHVibGljOg0KKyAgICBDRldMX0N1c3RvbShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIENGV0xfQ3VzdG9tKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9Qcm94eQkqbV9wUHJveHk7DQorfTsNCitDRldMX0N1c3RvbTo6Q0ZXTF9DdXN0b20oSUZXTF9XaWRnZXQgKnBPdXRlciApDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KKyAgICAsIG1fcFByb3h5KE5VTEwpDQorew0KK30NCitDRldMX0N1c3RvbTo6Q0ZXTF9DdXN0b20oY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQorICAgICwgbV9wUHJveHkoTlVMTCkNCit7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DdXN0b206OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBpZiAobV9wUHJveHkgJiYgKG1fcFByb3h5LT5HZXRXaWRnZXRSZWN0KHJlY3QsIGJBdXRvU2l6ZSkgPT0gRldMX0VSUl9TdWNjZWVkZWQpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIGJBdXRvU2l6ZSk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DdXN0b206OlVwZGF0ZSgpDQorew0KKyAgICBpZiAobV9wUHJveHkpIHsNCisgICAgICAgIHJldHVybiBtX3BQcm94eS0+VXBkYXRlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKTsNCit9DQorRldMX0VSUglDRldMX0N1c3RvbTo6U2V0UHJveHkoSUZXTF9Qcm94eSAqcFByb3h5KQ0KK3sNCisgICAgbV9wUHJveHkgPSBwUHJveHk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9DdXN0b20qIElGV0xfQ3VzdG9tOjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIG5ldyBJRldMX0N1c3RvbTsNCit9DQorSUZXTF9DdXN0b206OklGV0xfQ3VzdG9tKCkNCit7DQorICAgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0N1c3RvbTo6fklGV0xfQ3VzdG9tKCkNCit7DQorICAgIGlmIChtX3BEYXRhKSB7DQorICAgICAgICBkZWxldGUgKENGV0xfQ3VzdG9tKiltX3BEYXRhOw0KKyAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRldMX0VSUiBJRldMX0N1c3RvbTo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyICkNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DdXN0b20ocE91dGVyKTsNCisgICAgKChDRldMX0N1c3RvbSopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9DdXN0b20qKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9DdXN0b206OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCit7DQorICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DdXN0b20ocHJvcGVydGllcywgcE91dGVyKTsNCisgICAgKChDRldMX0N1c3RvbSopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9DdXN0b20qKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9DdXN0b206OlNldFByb3h5KElGV0xfUHJveHkgKnBQcm94eSkNCit7DQorICAgIHJldHVybiAoKENGV0xfQ3VzdG9tKiltX3BEYXRhKS0+U2V0UHJveHkocFByb3h5KTsNCit9DQordm9pZCBGV0xfU2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCAqd2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICAoKENGV0xfV2lkZ2V0SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopd2lkZ2V0KS0+R2V0RGF0YSgpKS0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9IHJlY3Q7DQorfQ0KK3ZvaWQgRldMX1NldFdpZGdldFN0YXRlcyhJRldMX1dpZGdldCAqd2lkZ2V0LCBGWF9EV09SRCBkd1N0YXRlcykNCit7DQorICAgICgoQ0ZXTF9XaWRnZXRJbXAqKSgoSUZXTF9UYXJnZXREYXRhKil3aWRnZXQpLT5HZXREYXRhKCkpLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzID0gZHdTdGF0ZXM7DQorfQ0KK3ZvaWQgRldMX1NldFdpZGdldFN0eWxlcyhJRldMX1dpZGdldCAqd2lkZ2V0LCBGWF9EV09SRCBkd1N0eWxlcykNCit7DQorICAgICgoQ0ZXTF9XaWRnZXRJbXAqKSgoSUZXTF9UYXJnZXREYXRhKil3aWRnZXQpLT5HZXREYXRhKCkpLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzID0gZHdTdHlsZXM7DQorfQ0KK0ZXTF9FUlIgRldMX0VuYWJlbFdpZGdldChJRldMX1dpZGdldCAqd2lkZ2V0LCBGWF9CT09MIGJFbmFibGUpDQorew0KKyAgICB3aWRnZXQtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsICFiRW5hYmxlKTsNCisgICAgSUZXTF9XaWRnZXRNZ3IgKndpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgSUZXTF9XaWRnZXQgKmNoaWxkID0gd2lkZ2V0TWdyLT5HZXRXaWRnZXQod2lkZ2V0LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChjaGlsZCkgew0KKyAgICAgICAgRldMX0VuYWJlbFdpZGdldChjaGlsZCwgYkVuYWJsZSk7DQorICAgICAgICBjaGlsZCA9IHdpZGdldE1nci0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldG1ncmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfd2lkZ2V0bWdyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWUyNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldG1ncmltcC5jcHAKQEAgLTAsMCArMSwxMDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KKyNkZWZpbmUgRldMX05PUk1BTE1BVFJJWA0KK0ZYX0JPT0wgRldMX1VzZU9mZnNjcmVlbihJRldMX1dpZGdldCAqIHBXaWRnZXQpDQorew0KKyNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQorICAgIHJldHVybiBGQUxTRTsNCisjZWxzZQ0KKyAgICByZXR1cm4gcFdpZGdldC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfT2Zmc2NyZWVuOw0KKyNlbmRpZg0KK30NCitJRldMX1dpZGdldE1ncioJRldMX0dldFdpZGdldE1ncigpDQorew0KKyAgICBJRldMX0FwcCAqcEFwcCA9IEZXTF9HZXRBcHAoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQXBwLCBOVUxMKTsNCisgICAgcmV0dXJuIHBBcHAtPkdldFdpZGdldE1ncigpOw0KK30NCitDRldMX1dpZGdldE1ncjo6Q0ZXTF9XaWRnZXRNZ3IoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlck5hdGl2ZSkNCisgICAgOiBtX2R3Q2FwYWJpbGl0eSgwKQ0KK3sNCisgICAgbV9wRGVsZWdhdGUgPSBGWF9ORVcgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSh0aGlzKTsNCisgICAgbV9wQWRhcHRlciA9IHBBZGFwdGVyTmF0aXZlLT5HZXRXaWRnZXRNZ3IoKElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqKW1fcERlbGVnYXRlKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEFkYXB0ZXIpOw0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBSb290ID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdySXRlbTsNCisgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KE5VTEwsIHBSb290KTsNCisjaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pDQorICAgIG1fcnRTY3JlZW4uUmVzZXQoKTsNCisgICAgSUZXTF9BZGFwdGVyTW9uaXRvck1nciogcE1vbml0b3JNZ3IgPSBwQWRhcHRlck5hdGl2ZS0+R2V0TW9uaXRvck1ncigpOw0KKyAgICBpZiAocE1vbml0b3JNZ3IpIHsNCisgICAgICAgIEZXTF9ITU9OSVRPUiBtb25pdG9yID0gcE1vbml0b3JNZ3ItPkdldEN1cnJlbnRNb25pdG9yKCk7DQorICAgICAgICBpZiAobW9uaXRvcikgew0KKyAgICAgICAgICAgIHBNb25pdG9yTWdyLT5HZXRNb25pdG9yU2l6ZShtb25pdG9yLCBtX3J0U2NyZWVuLndpZHRoLCBtX3J0U2NyZWVuLmhlaWdodCk7DQorICAgICAgICB9DQorICAgIH0NCisjZW5kaWYNCit9DQorQ0ZXTF9XaWRnZXRNZ3I6On5DRldMX1dpZGdldE1ncigpDQorew0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SXRlbS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgRlhfTFBWT0lEIHBXaWRnZXQ7DQorICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJdGVtLkdldE5leHRBc3NvYyhwcywgcFdpZGdldCwgKHZvaWQqJilwSXRlbSk7DQorICAgICAgICBkZWxldGUgcEl0ZW07DQorICAgIH0NCisgICAgbV9tYXBXaWRnZXRJdGVtLlJlbW92ZUFsbCgpOw0KKyAgICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDRldMX1dpZGdldE1ncjo6Q291bnRXaWRnZXRzKElGV0xfV2lkZ2V0ICpwUGFyZW50ICkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KKyAgICByZXR1cm4gVHJhdmVsV2lkZ2V0TWdyKHBQYXJlbnRJdGVtLCBOVUxMLCBOVUxMKTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXQoRlhfSU5UMzIgbkluZGV4LCBJRldMX1dpZGdldCAqcFBhcmVudCApDQorew0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBQYXJlbnRJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwUGFyZW50KTsNCisgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KKyAgICBUcmF2ZWxXaWRnZXRNZ3IocFBhcmVudEl0ZW0sICZuSW5kZXgsIE5VTEwsICZwV2lkZ2V0KTsNCisgICAgcmV0dXJuIHBXaWRnZXQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfV0dUUkVMQVRJT04gZVJlbGF0aW9uKQ0KK3sNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAgIGlmICghcEl0ZW0pIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0ICpwUmV0ID0gTlVMTDsNCisgICAgc3dpdGNoIChlUmVsYXRpb24pIHsNCisgICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX1BhcmVudDogew0KKyAgICAgICAgICAgICAgICBwUmV0ID0gcEl0ZW0tPnBQYXJlbnQgPyBwSXRlbS0+cFBhcmVudC0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX093bmVyOiB7DQorICAgICAgICAgICAgICAgIHBSZXQgPSBwSXRlbS0+cE93bmVyID8gcEl0ZW0tPnBPd25lci0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZzogew0KKyAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUHJldmlvdXM7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbSAmJiBwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUHJldmlvdXM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9QcmlvclNpYmxpbmc6IHsNCisgICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtLT5wUHJldmlvdXMgPyBwSXRlbS0+cFByZXZpb3VzLT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmc6IHsNCisgICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtLT5wTmV4dCA/IHBJdGVtLT5wTmV4dC0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0xhc3RTaWJsaW5nOiB7DQorICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPnBOZXh0Ow0KKyAgICAgICAgICAgICAgICB3aGlsZSAocEl0ZW0gJiYgcEl0ZW0tPnBOZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wTmV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwUmV0ID0gcEl0ZW0gPyBwSXRlbS0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQ6IHsNCisgICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtLT5wQ2hpbGQgPyBwSXRlbS0+cENoaWxkLT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fTGFzdENoaWxkOiB7DQorICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPnBDaGlsZDsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHBJdGVtICYmIHBJdGVtLT5wTmV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+cE5leHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtOiB7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKElzQWJsZU5hdGl2ZShwSXRlbS0+cFdpZGdldCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwUmV0ID0gcEl0ZW0tPnBXaWRnZXQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBSZXQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCAtMSk7DQorICAgIHJldHVybiBUcmF2ZWxXaWRnZXRNZ3IocEl0ZW0tPnBQYXJlbnQsIE5VTEwsIHBJdGVtKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCBGQUxTRSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEl0ZW0tPnBQYXJlbnQsIEZBTFNFKTsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwQ2hpbGQgPSBwSXRlbS0+cFBhcmVudC0+cENoaWxkOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICAgICAgaWYgKHBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgICAgICAgIGlmIChpID09IG5JbmRleCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBDaGlsZC0+cFByZXZpb3VzKSB7DQorICAgICAgICAgICAgICAgIHBDaGlsZC0+cFByZXZpb3VzLT5wTmV4dCA9IHBDaGlsZC0+cE5leHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwQ2hpbGQtPnBOZXh0KSB7DQorICAgICAgICAgICAgICAgIHBDaGlsZC0+cE5leHQtPnBQcmV2aW91cyA9IHBDaGlsZC0+cFByZXZpb3VzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgICAgICAgICAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW0tPnBOZXh0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KKyAgICAgICAgICAgIHBJdGVtLT5wUHJldmlvdXMgPSBOVUxMOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoIXBDaGlsZC0+cE5leHQpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+cE5leHQ7DQorICAgICAgICArK2k7DQorICAgIH0NCisgICAgcENoaWxkID0gcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZDsNCisgICAgaWYgKHBDaGlsZCkgew0KKyAgICAgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICAgICAgICB3aGlsZShwQ2hpbGQtPnBOZXh0KSB7DQorICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+cE5leHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBDaGlsZC0+cE5leHQgPSBwSXRlbTsNCisgICAgICAgICAgICBwSXRlbS0+cFByZXZpb3VzID0gcENoaWxkOw0KKyAgICAgICAgICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpID0gMDsNCisgICAgICAgIHdoaWxlKGkgPCBuSW5kZXggJiYgcENoaWxkLT5wTmV4dCApIHsNCisgICAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghcENoaWxkLT5wTmV4dCkgew0KKyAgICAgICAgICAgIHBDaGlsZC0+cE5leHQgPSBwSXRlbTsNCisgICAgICAgICAgICBwSXRlbS0+cFByZXZpb3VzID0gcENoaWxkOw0KKyAgICAgICAgICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAocENoaWxkLT5wUHJldmlvdXMpIHsNCisgICAgICAgICAgICBwSXRlbS0+cFByZXZpb3VzID0gcENoaWxkLT5wUHJldmlvdXM7DQorICAgICAgICAgICAgcENoaWxkLT5wUHJldmlvdXMtPnBOZXh0ID0gcEl0ZW07DQorICAgICAgICB9DQorICAgICAgICBwQ2hpbGQtPnBQcmV2aW91cyA9IHBJdGVtOw0KKyAgICAgICAgcEl0ZW0tPnBOZXh0ID0gcENoaWxkOw0KKyAgICAgICAgaWYgKHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcENoaWxkKSB7DQorICAgICAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtOw0KKyAgICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IE5VTEw7DQorICAgICAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpJc1dpZGdldChGWF9MUFZPSUQgcE9iaikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE9iaiwgRkFMU0UpOw0KKyAgICByZXR1cm4gR2V0V2lkZ2V0TWdySXRlbSgoSUZXTF9XaWRnZXQqKXBPYmopICE9IE5VTEw7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BBZGFwdGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1dpZGdldCAqcE5hdGl2ZSA9IHBXaWRnZXQ7DQorICAgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQorICAgIGlmIChJc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICBJRldMX1dpZGdldCAqcE91dGVyID0gcFdpZGdldC0+R2V0T3V0ZXIoKTsNCisgICAgICAgIHdoaWxlIChwT3V0ZXIpIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRUZW1wOw0KKyAgICAgICAgICAgIHBOYXRpdmUtPkdldFdpZGdldFJlY3QocnRUZW1wKTsNCisgICAgICAgICAgICByZWN0LmxlZnQgKz0gcnRUZW1wLmxlZnQ7DQorICAgICAgICAgICAgcmVjdC50b3AgKz0gcnRUZW1wLnRvcDsNCisgICAgICAgICAgICBwTmF0aXZlID0gcE91dGVyOw0KKyAgICAgICAgICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmICghSXNBYmxlTmF0aXZlKHBXaWRnZXQpKSB7DQorICAgICAgICBwTmF0aXZlID0gR2V0V2lkZ2V0KHBXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICAgIHBXaWRnZXQtPlRyYW5zZm9ybVRvKHBOYXRpdmUsIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICB9DQorICAgIEFkZFJlZHJhd0NvdW50cyhwTmF0aXZlKTsNCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPlJlcGFpbnRXaWRnZXQocE5hdGl2ZSwgJnJlY3QpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpBZGRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBQYXJlbnRJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAgIGlmICghcEl0ZW0pIHsNCisgICAgICAgIHBJdGVtID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdySXRlbTsNCisgICAgICAgIHBJdGVtLT5wV2lkZ2V0ID0gcFdpZGdldDsNCisgICAgICAgIG1fbWFwV2lkZ2V0SXRlbS5TZXRBdChwV2lkZ2V0LCBwSXRlbSk7DQorICAgIH0NCisgICAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQorICAgICAgICBpZiAocEl0ZW0tPnBQcmV2aW91cykgew0KKyAgICAgICAgICAgIHBJdGVtLT5wUHJldmlvdXMtPnBOZXh0ID0gcEl0ZW0tPnBOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KKyAgICAgICAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwSXRlbS0+cFBhcmVudC0+cENoaWxkID09IHBJdGVtKSB7DQorICAgICAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwSXRlbS0+cFBhcmVudCA9IHBQYXJlbnRJdGVtOw0KKyAgICBTZXRXaWRnZXRJbmRleChwV2lkZ2V0LCAtMSk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6Okluc2VydFdpZGdldChJRldMX1dpZGdldCAqcFBhcmVudCwgSUZXTF9XaWRnZXQgKnBDaGlsZCwgRlhfSU5UMzIgbkluZGV4ICkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KKyAgICBpZiAoIXBQYXJlbnRJdGVtKSB7DQorICAgICAgICBwUGFyZW50SXRlbSA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQorICAgICAgICBwUGFyZW50SXRlbS0+cFdpZGdldCA9IHBQYXJlbnQ7DQorICAgICAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocFBhcmVudCwgcFBhcmVudEl0ZW0pOw0KKyAgICAgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwUm9vdCA9IEdldFdpZGdldE1nckl0ZW0oTlVMTCk7DQorICAgICAgICBwUGFyZW50SXRlbS0+cFBhcmVudCA9IHBSb290Ow0KKyAgICAgICAgU2V0V2lkZ2V0SW5kZXgocFBhcmVudCwgLTEpOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBDaGlsZCk7DQorICAgIGlmICghcEl0ZW0pIHsNCisgICAgICAgIHBJdGVtID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdySXRlbTsNCisgICAgICAgIHBJdGVtLT5wV2lkZ2V0ID0gcENoaWxkOw0KKyAgICAgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBDaGlsZCwgcEl0ZW0pOw0KKyAgICB9DQorICAgIGlmIChwSXRlbS0+cFBhcmVudCAmJiBwSXRlbS0+cFBhcmVudCAhPSBwUGFyZW50SXRlbSkgew0KKyAgICAgICAgaWYgKHBJdGVtLT5wUHJldmlvdXMpIHsNCisgICAgICAgICAgICBwSXRlbS0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwSXRlbS0+cE5leHQpIHsNCisgICAgICAgICAgICBwSXRlbS0+cE5leHQtPnBQcmV2aW91cyA9IHBJdGVtLT5wUHJldmlvdXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCisgICAgU2V0V2lkZ2V0SW5kZXgocENoaWxkLCBuSW5kZXgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgICAgaWYgKCFwSXRlbSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgICBwSXRlbS0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsNCisgICAgfQ0KKyAgICBpZiAocEl0ZW0tPnBOZXh0KSB7DQorICAgICAgICBwSXRlbS0+cE5leHQtPnBQcmV2aW91cyA9IHBJdGVtLT5wUHJldmlvdXM7DQorICAgIH0NCisgICAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcEl0ZW0pIHsNCisgICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwQ2hpbGQgPSBwSXRlbS0+cENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBOZXh0ID0gcENoaWxkLT5wTmV4dDsNCisgICAgICAgIFJlbW92ZVdpZGdldChwQ2hpbGQtPnBXaWRnZXQpOw0KKyAgICAgICAgcENoaWxkID0gcE5leHQ7DQorICAgIH0NCisgICAgbV9tYXBXaWRnZXRJdGVtLlJlbW92ZUtleShwV2lkZ2V0KTsNCisgICAgZGVsZXRlIHBJdGVtOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyLCBJRldMX1dpZGdldCAqcE93bmVkKQ0KK3sNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocE93bmVyKTsNCisgICAgaWYgKCFwUGFyZW50SXRlbSkgew0KKyAgICAgICAgcFBhcmVudEl0ZW0gPSBGWF9ORVcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgICAgICAgcFBhcmVudEl0ZW0tPnBXaWRnZXQgPSBwT3duZXI7DQorICAgICAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocE93bmVyLCBwUGFyZW50SXRlbSk7DQorICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBSb290ID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCisgICAgICAgIHBQYXJlbnRJdGVtLT5wUGFyZW50ID0gcFJvb3Q7DQorICAgICAgICBTZXRXaWRnZXRJbmRleChwT3duZXIsIC0xKTsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwT3duZWQpOw0KKyAgICBpZiAoIXBJdGVtKSB7DQorICAgICAgICBwSXRlbSA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQorICAgICAgICBwSXRlbS0+cFdpZGdldCA9IHBPd25lZDsNCisgICAgICAgIG1fbWFwV2lkZ2V0SXRlbS5TZXRBdChwT3duZWQsIHBJdGVtKTsNCisgICAgfQ0KKyAgICBwSXRlbS0+cE93bmVyID0gcFBhcmVudEl0ZW07DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OlNldFBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCwgSUZXTF9XaWRnZXQgKnBDaGlsZCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwQ2hpbGQpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBJdGVtKTsNCisgICAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQorICAgICAgICBpZiAocEl0ZW0tPnBQcmV2aW91cykgew0KKyAgICAgICAgICAgIHBJdGVtLT5wUHJldmlvdXMtPnBOZXh0ID0gcEl0ZW0tPnBOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KKyAgICAgICAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwSXRlbS0+cFBhcmVudC0+cENoaWxkID09IHBJdGVtKSB7DQorICAgICAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICAgICAgICBwSXRlbS0+cFByZXZpb3VzID0gTlVMTDsNCisgICAgfQ0KKyAgICBwSXRlbS0+cFBhcmVudCA9IHBQYXJlbnRJdGVtOw0KKyAgICBTZXRXaWRnZXRJbmRleChwQ2hpbGQsIC0xKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BBZGFwdGVyKTsNCisgICAgbV9wQWRhcHRlci0+U2V0UGFyZW50V2lkZ2V0KHBDaGlsZCwgcFBhcmVudCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9XaWRnZXRNZ3I6OklzQ2hpbGQoSUZXTF9XaWRnZXQgKnBDaGlsZCwgSUZXTF9XaWRnZXQgKnBQYXJlbnQpDQorew0KKyAgICBJRldMX1dpZGdldCAqcFRlbXAgPSBwQ2hpbGQ7DQorICAgIGRvIHsNCisgICAgICAgIGlmIChwVGVtcCA9PSBwUGFyZW50KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBwVGVtcCA9IEdldFdpZGdldChwVGVtcCwgRldMX1dHVFJFTEFUSU9OX1BhcmVudCk7DQorICAgIH0gd2hpbGUgKHBUZW1wKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpDcmVhdGVXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgaWYgKCFJc0FibGVOYXRpdmUocFdpZGdldCkpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+Q3JlYXRlV2lkZ2V0KHBXaWRnZXQsIHBXaWRnZXQtPkdldE93bmVyKCkpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpEZXN0cm95V2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIGlmICghSXNBYmxlTmF0aXZlKHBXaWRnZXQpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPkRlc3Ryb3lXaWRnZXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldFJlY3RfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBpZiAoIUlzQWJsZU5hdGl2ZShwV2lkZ2V0KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BBZGFwdGVyLT5HZXRXaWRnZXRSZWN0KHBXaWRnZXQsIHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRXaWRnZXRSZWN0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgaWYgKEZXTF9Vc2VPZmZzY3JlZW4ocFdpZGdldCkpIHsNCisgICAgICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICAgICAgcEl0ZW0tPmlSZWRyYXdDb3VudGVyICsrOw0KKyAgICAgICAgaWYgKHBJdGVtLT5wT2Zmc2NyZWVuKSB7DQorICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSA9IHBJdGVtLT5wT2Zmc2NyZWVuLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgICAgICAgICAgICBpZiAocERldmljZSAmJiBwRGV2aWNlLT5HZXRCaXRtYXAoKSkgew0KKyAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKnBCaXRtYXAgPSBwRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgICAgICAgICAgICAgaWYgKHBCaXRtYXAtPkdldFdpZHRoKCkgLSByZWN0LndpZHRoID4gMSB8fCBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIHJlY3QuaGVpZ2h0ID4gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBJdGVtLT5wT2Zmc2NyZWVuOw0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPnBPZmZzY3JlZW4gPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyNpZiAoX0ZYX09TXz09X0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXz09X0ZYX1dJTjY0XykNCisgICAgICAgIHBJdGVtLT5iT3V0c2lkZUNoYW5nZWQgPSAhbV9ydFNjcmVlbi5Db250YWlucyhyZWN0KTsNCisjZW5kaWYNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0UmVjdChwV2lkZ2V0LCByZWN0KTsNCit9DQorRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0UG9zaXRpb25fTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0UG9zaXRpb24ocFdpZGdldCwgZngsIGZ5KTsNCit9DQorRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0SWNvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9ESUJpdG1hcCAqcEljb24sIEZYX0JPT0wgYkJpZykNCit7DQorICAgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRXaWRnZXRJY29uKHBXaWRnZXQsIHBJY29uLCBiQmlnKTsNCit9DQorRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0Q2FwdGlvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX1dTVFIgd3NDYXB0aW9uKQ0KK3sNCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldFdpZGdldENhcHRpb24ocFdpZGdldCwgd3NDYXB0aW9uKTsNCit9DQorRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0Qm9yZGVyUmVnaW9uX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1BhdGggKnBQYXRoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldEJvcmRlclJlZ2lvbihwV2lkZ2V0LCBwUGF0aCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNob3dXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNob3dXaWRnZXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OkhpZGVXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPkhpZGVXaWRnZXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNldE5vcm1hbF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0Tm9ybWFsKHBXaWRnZXQpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0TWdyOjpTZXRNYXhpbWl6ZV9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0TWF4aW1pemUocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNldE1pbmltaXplX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRNaW5pbWl6ZShwV2lkZ2V0KTsNCit9DQorRlhfQk9PTAlDRldMX1dpZGdldE1ncjo6Q2hlY2tNZXNzYWdlX05hdGl2ZSgpDQorew0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+Q2hlY2tNZXNzYWdlKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OkRpc3BhdGNoTWVzc2FnZV9OYXRpdmUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEFkYXB0ZXItPkRpc3BhdGNoTWVzc2FnZSgpOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0TWdyOjpJc0lkbGVNZXNzYWdlX05hdGl2ZSgpDQorew0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+SXNJZGxlTWVzc2FnZSgpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpFeGl0X05hdGl2ZShGWF9JTlQzMiBpRXhpdENvZGUpDQorew0KKyAgICByZXR1cm4gbV9wQWRhcHRlci0+RXhpdChpRXhpdENvZGUpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0TWdyOjpDcmVhdGVXaWRnZXRXaXRoTmF0aXZlSWRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCB2b2lkICp2cCkNCit7DQorICAgIHJldHVybiBtX3BBZGFwdGVyLT5DcmVhdGVXaWRnZXRXaXRoTmF0aXZlSWQocFdpZGdldCwgdnApOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldEF0UG9pbnQoSUZXTF9XaWRnZXQgKiBwYXJlbnQsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhcmVudCwgTlVMTCk7DQorICAgIEZYX0ZMT0FUIHgxOw0KKyAgICBGWF9GTE9BVCB5MTsNCisgICAgSUZXTF9XaWRnZXQgKiBjaGlsZCA9IEdldFdpZGdldChwYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9MYXN0Q2hpbGQpOw0KKyAgICB3aGlsZSAoY2hpbGQpIHsNCisgICAgICAgIGlmICgoY2hpbGQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgPT0gMCkgew0KKyAgICAgICAgICAgIHgxID0geDsNCisgICAgICAgICAgICB5MSA9IHk7DQorICAgICAgICAgICAgQ0ZYX01hdHJpeCBtYXRyaXhPblBhcmVudDsNCisgICAgICAgICAgICBjaGlsZC0+R2V0TWF0cml4KG1hdHJpeE9uUGFyZW50KTsNCisgICAgICAgICAgICBDRlhfTWF0cml4IG07DQorICAgICAgICAgICAgbS5SZXNldCgpOw0KKyAgICAgICAgICAgIG0uU2V0UmV2ZXJzZShtYXRyaXhPblBhcmVudCk7DQorICAgICAgICAgICAgbS5UcmFuc2Zvcm1Qb2ludCh4MSwgeTEpOw0KKyAgICAgICAgICAgIENGWF9SZWN0RiBib3VuZHM7DQorICAgICAgICAgICAgY2hpbGQtPkdldFdpZGdldFJlY3QoYm91bmRzKTsNCisgICAgICAgICAgICBpZiAoYm91bmRzLkNvbnRhaW5zKHgxLCB5MSkpIHsNCisgICAgICAgICAgICAgICAgeDEgLT0gYm91bmRzLmxlZnQ7DQorICAgICAgICAgICAgICAgIHkxIC09IGJvdW5kcy50b3A7DQorICAgICAgICAgICAgICAgIHJldHVybiBHZXRXaWRnZXRBdFBvaW50KGNoaWxkLCB4MSwgeTEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNoaWxkID0gR2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fUHJpb3JTaWJsaW5nKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcGFyZW50Ow0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpOb3RpZnlTaXplQ2hhbmdlZChJRldMX1dpZGdldCAqcEZvcm0sIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghRldMX1VzZU9mZnNjcmVlbihwRm9ybSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwRm9ybSk7DQorICAgIGlmIChwSXRlbS0+cE9mZnNjcmVlbikgew0KKyAgICAgICAgZGVsZXRlIHBJdGVtLT5wT2Zmc2NyZWVuOw0KKyAgICAgICAgcEl0ZW0tPnBPZmZzY3JlZW4gPSBOVUxMOw0KKyAgICB9DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6bmV4dFRhYihJRldMX1dpZGdldCAqcGFyZW50LCBJRldMX1dpZGdldCAqZm9jdXMsIEZYX0JPT0wgJmJGaW5kKQ0KK3sNCisgICAgSUZXTF9XaWRnZXQgKmNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChjaGlsZCkgew0KKyAgICAgICAgaWYgKGZvY3VzID09IGNoaWxkKSB7DQorICAgICAgICAgICAgYkZpbmQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChjaGlsZC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfVGFiU3RvcCkgJiYgKCFmb2N1cyB8fCAoZm9jdXMgIT0gY2hpbGQgJiYgYkZpbmQpKSkgew0KKyAgICAgICAgICAgIHJldHVybiBjaGlsZDsNCisgICAgICAgIH0NCisgICAgICAgIElGV0xfV2lkZ2V0ICpiUmV0ID0gbmV4dFRhYihjaGlsZCwgZm9jdXMsIGJGaW5kKTsNCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgICAgcmV0dXJuIGJSZXQ7DQorICAgICAgICB9DQorICAgICAgICBjaGlsZCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDRldMX1dpZGdldE1ncjo6Q291bnRSYWRpb0J1dHRvbkdyb3VwKElGV0xfV2lkZ2V0ICpwRmlyc3QpDQorew0KKyAgICBGWF9JTlQzMiBpUmV0ID0gMDsNCisgICAgSUZXTF9XaWRnZXQgKnBDaGlsZCA9IHBGaXJzdDsNCisgICAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICAgICAgaWYgKChwQ2hpbGQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSAmJiBwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSAzODExMzA0NjkxKSB7DQorICAgICAgICAgICAgaVJldCArKzsNCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZCA9IEdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgIH0NCisgICAgcmV0dXJuIGlSZXQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0U2libGluZ1JhZGlvQnV0dG9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJOZXh0KQ0KK3sNCisgICAgd2hpbGUgKChwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBXaWRnZXQsIGJOZXh0ID8gRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nIDogRldMX1dHVFJFTEFUSU9OX1ByaW9yU2libGluZykpICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRNZ3I6OkdldFJhZGlvQnV0dG9uR3JvdXBIZWFkZXIoSUZXTF9XaWRnZXQgKnBSYWRpb0J1dHRvbikNCit7DQorICAgIGlmIChwUmFkaW9CdXR0b24tPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSB7DQorICAgICAgICByZXR1cm4gcFJhZGlvQnV0dG9uOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0ICpwTmV4dCA9IHBSYWRpb0J1dHRvbjsNCisgICAgd2hpbGUgKChwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgRkFMU0UpKSAhPSBOVUxMKSB7DQorICAgICAgICBpZiAocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBOZXh0ID0gR2V0V2lkZ2V0KHBSYWRpb0J1dHRvbiwgRldMX1dHVFJFTEFUSU9OX0xhc3RTaWJsaW5nKTsNCisgICAgaWYgKChwTmV4dC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApICYmIHBOZXh0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgICAgcmV0dXJuIHBOZXh0Ow0KKyAgICB9DQorICAgIHdoaWxlICgocE5leHQgPSBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIEZBTFNFKSkgJiYgcE5leHQgJiYgcE5leHQgIT0gcFJhZGlvQnV0dG9uKSB7DQorICAgICAgICBpZiAocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBOZXh0ID0gR2V0V2lkZ2V0KHBSYWRpb0J1dHRvbiwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZyk7DQorICAgIGlmIChwTmV4dCAmJiAocE5leHQtPkdldFN0eWxlcygpID09IEZXTF9XR1RTVFlMRV9Hcm91cCkgJiYgcE5leHQtPkdldENsYXNzSUQoKSA9PSAzODExMzA0NjkxKSB7DQorICAgICAgICByZXR1cm4gcE5leHQ7DQorICAgIH0NCisgICAgcmV0dXJuIEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgVFJVRSk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OkdldFNhbWVHcm91cFJhZGlvQnV0dG9uKElGV0xfV2lkZ2V0ICpwUmFkaW9CdXR0b24sIENGWF9QdHJBcnJheSAmZ3JvdXApDQorew0KKyAgICBJRldMX1dpZGdldCAqcEZpcnN0ID0gR2V0V2lkZ2V0KHBSYWRpb0J1dHRvbiwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZyk7DQorICAgIGlmICghcEZpcnN0KSB7DQorICAgICAgICBwRmlyc3QgPSBwUmFkaW9CdXR0b247DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUdyb3VwID0gQ291bnRSYWRpb0J1dHRvbkdyb3VwKHBGaXJzdCk7DQorICAgIGlmIChpR3JvdXAgPCAyKSB7DQorICAgICAgICBpZiAocEZpcnN0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgICAgICAgIGdyb3VwLkFkZChwRmlyc3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgSUZXTF9XaWRnZXQgKnBOZXh0ID0gcEZpcnN0Ow0KKyAgICAgICAgd2hpbGUgKChwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgVFJVRSkpICE9IE5VTEwpIHsNCisgICAgICAgICAgICBncm91cC5BZGQocE5leHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0ICpwTmV4dCA9IEdldFJhZGlvQnV0dG9uR3JvdXBIZWFkZXIocFJhZGlvQnV0dG9uKTsNCisgICAgZG8gew0KKyAgICAgICAgZ3JvdXAuQWRkKHBOZXh0KTsNCisgICAgICAgIHBOZXh0ID0gR2V0U2libGluZ1JhZGlvQnV0dG9uKHBOZXh0LCBUUlVFKTsNCisgICAgICAgIGlmICghcE5leHQpIHsNCisgICAgICAgICAgICBpZiAocEZpcnN0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgICAgICAgICAgICBwTmV4dCA9IHBGaXJzdDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwRmlyc3QsIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAocE5leHQgJiYgKChwTmV4dC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApID09IDApKTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXREZWZhdWx0QnV0dG9uKElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KK3sNCisgICAgaWYgKChwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gMzUyMTYxNDI0NCkgJiYgKHBQYXJlbnQtPkdldFN0YXRlcygpICYgKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkpKSB7DQorICAgICAgICByZXR1cm4gcFBhcmVudDsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldCAqY2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwUGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChjaGlsZCkgew0KKyAgICAgICAgaWYgKChjaGlsZC0+R2V0Q2xhc3NJRCgpID09IDM1MjE2MTQyNDQpICYmIChjaGlsZC0+R2V0U3RhdGVzKCkgJiAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gY2hpbGQ7DQorICAgICAgICB9DQorICAgICAgICBJRldMX1dpZGdldCAqZmluZCA9IEdldERlZmF1bHRCdXR0b24oY2hpbGQpOw0KKyAgICAgICAgaWYgKGZpbmQpIHsNCisgICAgICAgICAgICByZXR1cm4gZmluZDsNCisgICAgICAgIH0NCisgICAgICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OkFkZFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICAocEl0ZW0tPmlSZWRyYXdDb3VudGVyKSsrOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpSZXNldFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICBwSXRlbS0+aVJlZHJhd0NvdW50ZXIgPSAwOw0KK30NCitDRldMX1dpZGdldE1nckl0ZW0qIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXRNZ3JJdGVtKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIChDRldMX1dpZGdldE1nckl0ZW0qKW1fbWFwV2lkZ2V0SXRlbS5HZXRWYWx1ZUF0KHBXaWRnZXQpOw0KK30NCitGWF9JTlQzMiBDRldMX1dpZGdldE1ncjo6VHJhdmVsV2lkZ2V0TWdyKENGV0xfV2lkZ2V0TWdySXRlbSAqcFBhcmVudCwgRlhfSU5UMzIgKnBJbmRleCwgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSwgSUZXTF9XaWRnZXQgKipwV2lkZ2V0ICkNCit7DQorICAgIGlmICghcFBhcmVudCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwQ2hpbGQgPSBwUGFyZW50LT5wQ2hpbGQ7DQorICAgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgICAgIGlDb3VudCArKzsNCisgICAgICAgIGlmIChwSW5kZXgpIHsNCisgICAgICAgICAgICBpZiAoKnBJbmRleCA9PSAwKSB7DQorICAgICAgICAgICAgICAgICpwV2lkZ2V0ID0gcENoaWxkLT5wV2lkZ2V0Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gaUNvdW50Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwSW5kZXggLS07DQorICAgICAgICB9DQorICAgICAgICBpZiAocEl0ZW0gJiYgcEl0ZW0gPT0gcENoaWxkKSB7DQorICAgICAgICAgICAgcmV0dXJuIGlDb3VudCAtIDE7DQorICAgICAgICB9DQorICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KKyAgICB9DQorICAgIGlmIChwSW5kZXgpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9IGVsc2UgaWYgKHBJdGVtKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudCAtIDE7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9XaWRnZXRNZ3I6OklzQWJsZU5hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KKyAgICBpZiAoIXBXaWRnZXQtPklzSW5zdGFuY2UoRlhfV1NUUkMoRldMX0NMQVNTX0Zvcm0pKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFdpZGdldC0+R2V0U3R5bGVzKCk7DQorICAgIHJldHVybiAoKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX1dpbmRvd1R5cGVNYXNrKSA9PSBGV0xfV0dUU1RZTEVfT3ZlckxhcHBlcikgfHwgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX1BvcHVwKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNUaHJlYWRFbmFibGVkKCkNCit7DQorICAgIHJldHVybiAhKG1fZHdDYXBhYmlsaXR5ICYgRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNGb3JtRGlzYWJsZWQoKQ0KK3sNCisgICAgcmV0dXJuIG1fZHdDYXBhYmlsaXR5ICYgRldMX1dHVE1HUl9EaXNhYmxlRm9ybTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6R2V0QWRhcHRlclBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApDQorew0KKyAgICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIHBTREFwYXB0ZXIgPSBHZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICAgIHJldHVybiBwU0RBcGFwdGVyLT5HZXRQb3B1cFBvcyhwV2lkZ2V0LCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQorfQ0KK0NGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkNGV0xfV2lkZ2V0TWdyRGVsZWdhdGUoQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IpDQorICAgIDogbV9wV2lkZ2V0TWdyKHBXaWRnZXRNZ3IpDQorew0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6Ok9uU2V0Q2FwYWJpbGl0eShGWF9EV09SRCBkd0NhcGFiaWxpdHkgKQ0KK3sNCisgICAgbV9wV2lkZ2V0TWdyLT5tX2R3Q2FwYWJpbGl0eSA9IGR3Q2FwYWJpbGl0eTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlVG9Gb3JtKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0LCAwKTsNCisgICAgSUZXTF9XaWRnZXQgKnBEc3RXaWRnZXQgPSAoSUZXTF9XaWRnZXQqKXBNZXNzYWdlLT5tX3BEc3RUYXJnZXQ7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcE5vdGVUaHJlYWQgPSBwRHN0V2lkZ2V0LT5HZXRPd25lclRocmVhZCgpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBOb3RlVGhyZWFkLCAwKTsNCisgICAgQ0ZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBOb3RlVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGVEcml2ZXIsIDApOw0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc1RocmVhZEVuYWJsZWQoKSkgew0KKyAgICAgICAgcE1lc3NhZ2UgPSAoQ0ZXTF9NZXNzYWdlKilwTWVzc2FnZS0+Q2xvbmUoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICBwTm90ZURyaXZlci0+UHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcE5vdGVEcml2ZXItPlF1ZXVlTWVzc2FnZShwTWVzc2FnZSk7DQorICAgIH0NCisjaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KKyAgICBDRldMX05vdGVMb29wICpwVG9wTG9vcCA9IHBOb3RlRHJpdmVyLT5HZXRUb3BMb29wKCk7DQorICAgIGlmIChwVG9wTG9vcCkgew0KKyAgICAgICAgcE5vdGVEcml2ZXItPlVucXVldWVNZXNzYWdlKHBUb3BMb29wKTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc1RocmVhZEVuYWJsZWQoKSkgew0KKyAgICAgICAgcE1lc3NhZ2UtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0ICoJICBwV2lkZ2V0LA0KKyAgICAgICAgQ0ZYX0dyYXBoaWNzICoJICBwR3JhcGhpY3MsDQorICAgICAgICBjb25zdCBDRlhfTWF0cml4ICogcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRlhfR3JhcGhpY3MgKnBUZW1wID0gRHJhd1dpZGdldEJlZm9yZShwV2lkZ2V0LCBwR3JhcGhpY3MsIHBNYXRyaXgpOw0KKyAgICBDRlhfUmVjdEYgY2xpcENvcHk7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QoY2xpcENvcHkpOw0KKyAgICBjbGlwQ29weS5sZWZ0ID0gY2xpcENvcHkudG9wID0gMDsNCisgICAgaWYgKGJVc2VPZmZzY3JlZW5EaXJlY3QocFdpZGdldCkpIHsNCisgICAgICAgIERyYXdXaWRnZXRBZnRlcihwV2lkZ2V0LCBwR3JhcGhpY3MsIGNsaXBDb3B5LCBwTWF0cml4KTsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgY2xpcEJvdW5kczsNCisjaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pIHx8IChfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX0xJTlVYX0VNQkVEREVEXykgfHwgKF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQ0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBwV2lkZ2V0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgcERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocFRlbXAsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPkdldENsaXBSZWN0KGNsaXBCb3VuZHMpOw0KKyAgICBjbGlwQ29weSA9IGNsaXBCb3VuZHM7DQorI2VsaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KKyAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBwV2lkZ2V0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCisgICAgICAgIHBHcmFwaGljcy0+R2V0Q2xpcFJlY3QoY2xpcEJvdW5kcyk7DQorICAgICAgICBjbGlwQ29weSA9IGNsaXBCb3VuZHM7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBjbGlwQm91bmRzLlNldChwTWF0cml4LT5hLCBwTWF0cml4LT5iLCBwTWF0cml4LT5jLCBwTWF0cml4LT5kKTsNCisgICAgICAgICgoQ0ZYX01hdHJpeCopcE1hdHJpeCktPlJlc2V0KCk7DQorI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCisjZWxzZQ0KKyNlbmRpZg0KKyAgICAgICAgew0KKyAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBXaWRnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpZiAoIW1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KKyAgICAgICAgcFdpZGdldC0+R2V0Q2xpZW50UmVjdChydENsaWVudCk7DQorICAgICAgICBjbGlwQm91bmRzLkludGVyc2VjdChydENsaWVudCk7DQorICAgIH0NCisgICAgaWYgKCFjbGlwQm91bmRzLklzRW1wdHkoKSkgew0KKyAgICAgICAgRHJhd0NoaWxkKHBXaWRnZXQsIGNsaXBCb3VuZHMsIHBUZW1wLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBEcmF3V2lkZ2V0QWZ0ZXIocFdpZGdldCwgcEdyYXBoaWNzLCBjbGlwQ29weSwgcE1hdHJpeCk7DQorICAgIG1fcFdpZGdldE1nci0+UmVzZXRSZWRyYXdDb3VudHMocFdpZGdldCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpEcmF3Q2hpbGQoSUZXTF9XaWRnZXQqCSAgcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYJcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyoJIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocGFyZW50KTsNCisgICAgRlhfQk9PTCBiRm9ybURpc2FibGUgPSBtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCk7DQorICAgIElGV0xfV2lkZ2V0KiBwTmV4dENoaWxkID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChwTmV4dENoaWxkKSB7DQorICAgICAgICBJRldMX1dpZGdldCogY2hpbGQgPSBwTmV4dENoaWxkOw0KKyAgICAgICAgcE5leHRDaGlsZCA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgaWYgKGNoaWxkLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9SZWN0RglydFdpZGdldDsNCisgICAgICAgIGNoaWxkLT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgICAgICAgIGlmIChydFdpZGdldC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9NYXRyaXgJd2lkZ2V0TWF0cml4Ow0KKyAgICAgICAgQ0ZYX1JlY3RGIGNsaXBCb3VuZHMocnRXaWRnZXQpOw0KKyAgICAgICAgaWYoIWJGb3JtRGlzYWJsZSkgew0KKyAgICAgICAgICAgIGNoaWxkLT5HZXRNYXRyaXgod2lkZ2V0TWF0cml4LCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICAgICAgd2lkZ2V0TWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJGb3JtRGlzYWJsZSkgew0KKyAgICAgICAgICAgIHdpZGdldE1hdHJpeC5UcmFuc2Zvcm1Qb2ludChjbGlwQm91bmRzLmxlZnQsIGNsaXBCb3VuZHMudG9wKTsNCisgICAgICAgICAgICBjbGlwQm91bmRzLkludGVyc2VjdChydENsaXApOw0KKyAgICAgICAgICAgIGlmIChjbGlwQm91bmRzLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgICAgIHBHcmFwaGljcy0+U2V0Q2xpcFJlY3QoY2xpcEJvdW5kcyk7DQorICAgICAgICB9DQorICAgICAgICB3aWRnZXRNYXRyaXguVHJhbnNsYXRlKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgVFJVRSk7DQorICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBjaGlsZC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgICAgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSB8fCBJc05lZWRSZXBhaW50KGNoaWxkLCAmd2lkZ2V0TWF0cml4LCBydENsaXApKSB7DQorICAgICAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgJndpZGdldE1hdHJpeCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiRm9ybURpc2FibGUpIHsNCisgICAgICAgICAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgICAgICB9DQorICAgICAgICBEcmF3Q2hpbGQoY2hpbGQsIGNsaXBCb3VuZHMsIHBHcmFwaGljcywgYkZvcm1EaXNhYmxlID8gJndpZGdldE1hdHJpeCA6IHBNYXRyaXgpOw0KKyAgICAgICAgY2hpbGQgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgICAgfQ0KK30NCitDRlhfR3JhcGhpY3MqIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkRyYXdXaWRnZXRCZWZvcmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpKSB7DQorICAgICAgICByZXR1cm4gcEdyYXBoaWNzOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAgIGlmICghcEl0ZW0tPnBPZmZzY3JlZW4pIHsNCisgICAgICAgIHBJdGVtLT5wT2Zmc2NyZWVuID0gRlhfTkVXIENGWF9HcmFwaGljczsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgIHBJdGVtLT5wT2Zmc2NyZWVuLT5DcmVhdGUoKEZYX0lOVDMyKXJlY3Qud2lkdGgsIChGWF9JTlQzMilyZWN0LmhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIHBHcmFwaGljcy0+R2V0Q2xpcFJlY3QocmVjdCk7DQorICAgIHBJdGVtLT5wT2Zmc2NyZWVuLT5TZXRDbGlwUmVjdChyZWN0KTsNCisgICAgcmV0dXJuIHBJdGVtLT5wT2Zmc2NyZWVuOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkRyYXdXaWRnZXRBZnRlcihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIENGWF9SZWN0RiAmcnRDbGlwLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgaWYgKEZXTF9Vc2VPZmZzY3JlZW4ocFdpZGdldCkpIHsNCisgICAgICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAgICAgICBwR3JhcGhpY3MtPlRyYW5zZmVyKHBJdGVtLT5wT2Zmc2NyZWVuLCBydENsaXAubGVmdCwgcnRDbGlwLnRvcCwgcnRDbGlwLCAoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQorI2lmZGVmIF9XSU4zMg0KKyAgICAgICAgcEl0ZW0tPnBPZmZzY3JlZW4tPkNsZWFyQ2xpcCgpOw0KKyNlbmRpZg0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAgIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9IDA7DQorfQ0KKyNkZWZpbmUgRldMX05FRURSRVBBSU5USElUX1BvaW50CTEyDQorI2RlZmluZSBGV0xfTkVFRFJFUEFJTlRISVRfUGllY2UJMw0KK3R5cGVkZWYgc3RydWN0IF9GV0xfTmVlZFJlcGFpbnRIaXREYXRhIHsNCisgICAgQ0ZYX1BvaW50RiBoaXRQb2ludDsNCisgICAgRlhfQk9PTCBiTm90TmVlZFJlcGFpbnQ7DQorICAgIEZYX0JPT0wgYk5vdENvbnRhaW5CeURpcnR5Ow0KK30gRldMX05lZWRSZXBhaW50SGl0RGF0YTsNCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OklzTmVlZFJlcGFpbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggKnBNYXRyaXgsIGNvbnN0IENGWF9SZWN0RiAmcnREaXJ0eSkNCit7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICBpZiAocEl0ZW0gJiYgcEl0ZW0tPmlSZWRyYXdDb3VudGVyID4gMCkgew0KKyAgICAgICAgcEl0ZW0tPmlSZWRyYXdDb3VudGVyID0gMDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC50b3AgPSAwOw0KKyAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0V2lkZ2V0KTsNCisgICAgaWYgKCFydFdpZGdldC5JbnRlcnNlY3RXaXRoKHJ0RGlydHkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXQgKiBwQ2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwV2lkZ2V0LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIGlmICghcENoaWxkKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gMzE1MDI5ODY3MCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0VGVtcDsNCisgICAgICAgIHBDaGlsZC0+R2V0V2lkZ2V0UmVjdChydFRlbXApOw0KKyAgICAgICAgaWYgKHJ0VGVtcC53aWR0aCA+PSBydFdpZGdldC53aWR0aCAmJiBydFRlbXAuaGVpZ2h0ID49IHJ0V2lkZ2V0LmhlaWdodCkgew0KKyAgICAgICAgICAgIHBDaGlsZCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBDaGlsZCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgIGlmICghcENoaWxkKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRDaGlsZHM7DQorICAgIHJ0Q2hpbGRzLkVtcHR5KCk7DQorICAgIEZYX0JPT0wgYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5ID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aERpcnR5ID0gcnREaXJ0eS5Db250YWlucyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgICBzdGF0aWMgRldMX05lZWRSZXBhaW50SGl0RGF0YSBoaXRQb2ludFtGV0xfTkVFRFJFUEFJTlRISVRfUG9pbnRdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgaVNpemUgPSBzaXplb2YoRldMX05lZWRSZXBhaW50SGl0RGF0YSk7DQorICAgIEZYU1lTX21lbXNldChoaXRQb2ludCwgMCwgaVNpemUpOw0KKyAgICBGWF9GTE9BVCBmeFBpZWNlID0gcnRXaWRnZXQud2lkdGggLyBGV0xfTkVFRFJFUEFJTlRISVRfUGllY2U7DQorICAgIEZYX0ZMT0FUIGZ5UGllY2UgPSBydFdpZGdldC5oZWlnaHQgLyBGV0xfTkVFRFJFUEFJTlRISVRfUGllY2U7DQorICAgIGhpdFBvaW50WzJdLmhpdFBvaW50LnggPSBoaXRQb2ludFs2XS5oaXRQb2ludC54ID0gcnRXaWRnZXQubGVmdDsNCisgICAgaGl0UG9pbnRbMF0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzNdLmhpdFBvaW50LnggPSBoaXRQb2ludFs3XS5oaXRQb2ludC54ID0gaGl0UG9pbnRbMTBdLmhpdFBvaW50LnggPSBmeFBpZWNlICsgcnRXaWRnZXQubGVmdDsNCisgICAgaGl0UG9pbnRbMV0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzRdLmhpdFBvaW50LnggPSBoaXRQb2ludFs4XS5oaXRQb2ludC54ID0gaGl0UG9pbnRbMTFdLmhpdFBvaW50LnggPSBmeFBpZWNlICogMiArIHJ0V2lkZ2V0LmxlZnQ7DQorICAgIGhpdFBvaW50WzVdLmhpdFBvaW50LnggPSBoaXRQb2ludFs5XS5oaXRQb2ludC54ID0gcnRXaWRnZXQud2lkdGggKyBydFdpZGdldC5sZWZ0Ow0KKyAgICBoaXRQb2ludFswXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbMV0uaGl0UG9pbnQueSA9IHJ0V2lkZ2V0LnRvcDsNCisgICAgaGl0UG9pbnRbMl0uaGl0UG9pbnQueSA9IGhpdFBvaW50WzNdLmhpdFBvaW50LnkgPSBoaXRQb2ludFs0XS5oaXRQb2ludC55ID0gaGl0UG9pbnRbNV0uaGl0UG9pbnQueSA9IGZ5UGllY2UgKyBydFdpZGdldC50b3A7DQorICAgIGhpdFBvaW50WzZdLmhpdFBvaW50LnkgPSBoaXRQb2ludFs3XS5oaXRQb2ludC55ID0gaGl0UG9pbnRbOF0uaGl0UG9pbnQueSA9IGhpdFBvaW50WzldLmhpdFBvaW50LnkgPSBmeVBpZWNlICogMiArIHJ0V2lkZ2V0LnRvcDsNCisgICAgaGl0UG9pbnRbMTBdLmhpdFBvaW50LnkgPSBoaXRQb2ludFsxMV0uaGl0UG9pbnQueSA9IHJ0V2lkZ2V0LmhlaWdodCArIHJ0V2lkZ2V0LnRvcDsNCisgICAgZG8gew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgICBwQ2hpbGQtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgICBDRlhfUmVjdEYgciA9IHJlY3Q7DQorICAgICAgICByLmxlZnQgKz0gcnRXaWRnZXQubGVmdDsNCisgICAgICAgIHIudG9wICs9IHJ0V2lkZ2V0LnRvcDsNCisgICAgICAgIGlmIChyLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHIuQ29udGFpbnMocnREaXJ0eSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJDaGlsZEludGVyc2VjdFdpdGhEaXJ0eSAmJiByLkludGVyc2VjdFdpdGgocnREaXJ0eSkpIHsNCisgICAgICAgICAgICBiQ2hpbGRJbnRlcnNlY3RXaXRoRGlydHkgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJPcmdpblB0SW50ZXJzZWN0V2lkdGhEaXJ0eSAmJiAhYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkKSB7DQorICAgICAgICAgICAgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkID0gcmVjdC5Db250YWlucygwLCAwKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChydENoaWxkcy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBydENoaWxkcyA9IHJlY3Q7DQorICAgICAgICB9IGVsc2UgaWYgKCEocENoaWxkLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpKSB7DQorICAgICAgICAgICAgcnRDaGlsZHMuVW5pb24ocmVjdCk7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgRldMX05FRURSRVBBSU5USElUX1BvaW50OyBpICsrKSB7DQorICAgICAgICAgICAgaWYgKGhpdFBvaW50W2ldLmJOb3RDb250YWluQnlEaXJ0eSB8fCBoaXRQb2ludFtpXS5iTm90TmVlZFJlcGFpbnQpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghcnREaXJ0eS5Db250YWlucyhoaXRQb2ludFtpXS5oaXRQb2ludCkpIHsNCisgICAgICAgICAgICAgICAgaGl0UG9pbnRbaV0uYk5vdENvbnRhaW5CeURpcnR5ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChyLkNvbnRhaW5zKGhpdFBvaW50W2ldLmhpdFBvaW50KSkgew0KKyAgICAgICAgICAgICAgICBoaXRQb2ludFtpXS5iTm90TmVlZFJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoKHBDaGlsZCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBDaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKSkgIT0gTlVMTCk7DQorICAgIGlmICghYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5KSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoYk9yZ2luUHRJbnRlcnNlY3RXaWR0aERpcnR5ICYmICFiT3JnaW5QdEludGVyc2VjdFdpZHRoQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChydENoaWxkcy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHJlcGFpbnRQb2ludCA9IEZXTF9ORUVEUkVQQUlOVEhJVF9Qb2ludDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IEZXTF9ORUVEUkVQQUlOVEhJVF9Qb2ludDsgaSArKykgew0KKyAgICAgICAgaWYgKGhpdFBvaW50W2ldLmJOb3ROZWVkUmVwYWludCkgew0KKyAgICAgICAgICAgIHJlcGFpbnRQb2ludCAtLTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocmVwYWludFBvaW50ID4gMCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENoaWxkcyk7DQorICAgIGlmIChydENoaWxkcy5Db250YWlucyhydERpcnR5KSB8fCBydENoaWxkcy5Db250YWlucyhydFdpZGdldCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpiVXNlT2Zmc2NyZWVuRGlyZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgICAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpIHx8ICEocEl0ZW0tPnBPZmZzY3JlZW4pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisjaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pDQorICAgIGlmIChwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkKSB7DQorICAgICAgICBDRlhfUmVjdEYgcjsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQorICAgICAgICBDRlhfUmVjdEYgdGVtcChtX3BXaWRnZXRNZ3ItPm1fcnRTY3JlZW4pOw0KKyAgICAgICAgdGVtcC5EZWZsYXRlKDUwLCA1MCk7DQorICAgICAgICBpZiAoIXRlbXAuQ29udGFpbnMocikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkID0gRkFMU0U7DQorICAgIH0NCisjZW5kaWYNCisgICAgcmV0dXJuIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9PSAwOw0KK30NCitzdGF0aWMgdm9pZCBGV0xfV3JpdGVCTVAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBGWF9MUENTVFIgZmlsZW5hbWUpDQorew0KKyAgICBGSUxFKiBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOw0KKyAgICBpZiAoZmlsZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50IHNpemUgPSAxNCArIDQwICsgcEJpdG1hcC0+R2V0UGl0Y2goKSAqIHBCaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MF07DQorICAgIGJ1ZmZlclswXSA9ICdCJzsNCisgICAgYnVmZmVyWzFdID0gJ00nOw0KKyAgICBidWZmZXJbMl0gPSAodW5zaWduZWQgY2hhcilzaXplOw0KKyAgICBidWZmZXJbM10gPSAodW5zaWduZWQgY2hhcikoc2l6ZSA+PiA4KTsNCisgICAgYnVmZmVyWzRdID0gKHVuc2lnbmVkIGNoYXIpKHNpemUgPj4gMTYpOw0KKyAgICBidWZmZXJbNV0gPSAodW5zaWduZWQgY2hhcikoc2l6ZSA+PiAyNCk7DQorICAgIGJ1ZmZlcls2XSA9IGJ1ZmZlcls3XSA9IGJ1ZmZlcls4XSA9IGJ1ZmZlcls5XSA9IDA7DQorICAgIGJ1ZmZlclsxMF0gPSA1NDsNCisgICAgYnVmZmVyWzExXSA9IGJ1ZmZlclsxMl0gPSBidWZmZXJbMTNdID0gMDsNCisgICAgZndyaXRlKGJ1ZmZlciwgMTQsIDEsIGZpbGUpOw0KKyAgICBtZW1zZXQoYnVmZmVyLCAwLCA0MCk7DQorICAgIGJ1ZmZlclswXSA9IDQwOw0KKyAgICBidWZmZXJbNF0gPSAodW5zaWduZWQgY2hhcilwQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgICBidWZmZXJbNV0gPSAodW5zaWduZWQgY2hhcikocEJpdG1hcC0+R2V0V2lkdGgoKSA+PiA4KTsNCisgICAgYnVmZmVyWzZdID0gKHVuc2lnbmVkIGNoYXIpKHBCaXRtYXAtPkdldFdpZHRoKCkgPj4gMTYpOw0KKyAgICBidWZmZXJbN10gPSAodW5zaWduZWQgY2hhcikocEJpdG1hcC0+R2V0V2lkdGgoKSA+PiAyNCk7DQorICAgIGJ1ZmZlcls4XSA9ICh1bnNpZ25lZCBjaGFyKSgtcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgICBidWZmZXJbOV0gPSAodW5zaWduZWQgY2hhcikoKC1wQml0bWFwLT5HZXRIZWlnaHQoKSkgPj4gOCk7DQorICAgIGJ1ZmZlclsxMF0gPSAodW5zaWduZWQgY2hhcikoKC1wQml0bWFwLT5HZXRIZWlnaHQoKSkgPj4gMTYpOw0KKyAgICBidWZmZXJbMTFdID0gKHVuc2lnbmVkIGNoYXIpKCgtcEJpdG1hcC0+R2V0SGVpZ2h0KCkpID4+IDI0KTsNCisgICAgYnVmZmVyWzEyXSA9IDE7DQorICAgIGJ1ZmZlclsxNF0gPSBwQml0bWFwLT5HZXRCUFAoKTsNCisgICAgZndyaXRlKGJ1ZmZlciwgNDAsIDEsIGZpbGUpOw0KKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7DQorICAgICAgICBGWF9MUEJZVEUgc2Nhbl9saW5lID0gcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwQml0bWFwLT5HZXRQaXRjaCgpOw0KKyAgICAgICAgZndyaXRlKHNjYW5fbGluZSwgcEJpdG1hcC0+R2V0UGl0Y2goKSwgMSwgZmlsZSk7DQorICAgIH0NCisgICAgZmNsb3NlKGZpbGUpOw0KK30NCitGV0xfRVJSIEZXTF9XaWRnZXRNZ3JTbmFwc2hvdChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgKnNhdmVGaWxlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHI7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQorICAgIENGWF9HcmFwaGljcyBnczsNCisgICAgZ3MuQ3JlYXRlKChGWF9JTlQzMilyLndpZHRoLCAoRlhfSU5UMzIpci5oZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgICBDRldMX1dpZGdldE1nciAqd2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICAgIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUgKmRlbGVnYXRlID0gd2lkZ2V0TWdyLT5HZXREZWxlZ2F0ZSgpOw0KKyAgICBkZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBXaWRnZXQsICZncywgcE1hdHJpeCk7DQorICAgIENGWF9ESUJpdG1hcCAqZGliID0gZ3MuR2V0UmVuZGVyRGV2aWNlKCktPkdldEJpdG1hcCgpOw0KKyAgICBGV0xfV3JpdGVCTVAoZGliLCBzYXZlRmlsZS0+VVRGOEVuY29kZSgpKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIEZXTF9XaWRnZXRJc0NoaWxkKElGV0xfV2lkZ2V0ICpwYXJlbnQsIElGV0xfV2lkZ2V0ICpmaW5kKQ0KK3sNCisgICAgaWYgKCFmaW5kKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXQgKmNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChjaGlsZCkgew0KKyAgICAgICAgaWYgKGNoaWxkID09IGZpbmQpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChGV0xfV2lkZ2V0SXNDaGlsZChjaGlsZCwgZmluZCkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzIwODkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9BUFBfSU1QX0gNCisjZGVmaW5lIF9GV0xfQVBQX0lNUF9IDQorY2xhc3MgQ0ZXTF9Ob3RlVGhyZWFkOw0KK2NsYXNzIENGV0xfV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlck5hdGl2ZTsNCitjbGFzcyBJRldMX1dpZGdldE1ncjsNCitjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQorY2xhc3MgSUZXTF9BcHA7DQorY2xhc3MgQ0ZXTF9BcHBJbXA7DQorY2xhc3MgQ0ZXTF9BcHBJbXAgOiBwdWJsaWMgQ0ZXTF9Ob3RlVGhyZWFkDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9BcHBJbXAoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlcik7DQorICAgIHZpcnR1YWwgfkNGV0xfQXBwSW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlGaW5hbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlck5hdGl2ZSoJR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICB2aXJ0dWFsIElGV0xfV2lkZ2V0TWdyKgkJR2V0V2lkZ2V0TWdyKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJRXhpdChGWF9JTlQzMiBpRXhpdENvZGUgPSAwKTsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyKgkJCUdldFRoZW1lUHJvdmlkZXIoKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGV0xfV2lkZ2V0TWdyCQkqbV9wV2lkZ2V0TWdyOw0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUJKm1fcEFkYXB0ZXJOYXRpdmU7DQorICAgIElGV0xfVGhlbWVQcm92aWRlcgkqbV9wVGhlbWVQcm92aWRlcjsNCisgICAgRlhfQk9PTAkJCQltX2JGdWVsQWRhcHRlcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2NvbnRlbnRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2NvbnRlbnRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFhZjBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0NPTlRFTlRfSU1QX0gNCisjZGVmaW5lIF9GV0xfQ09OVEVOVF9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfQ29udGVudEltcDsNCitjbGFzcyBDRldMX0NvbnRlbnRJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXANCit7DQorcHVibGljOg0KKyAgICBDRldMX0NvbnRlbnRJbXAoKTsNCisgICAgQ0ZXTF9Db250ZW50SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcyk7DQorICAgIHZpcnR1YWwgfkNGV0xfQ29udGVudEltcCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJSW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwQ2hpbGQsIEZYX0lOVDMyIG5JbmRleCA9IC0xKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJCVJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJCQlSZW1vdmVBbGxXaWRnZXRzKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0TWluU2l6ZShGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCAmZkhlaWdodCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCUdldE1heFNpemUoRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgJmZIZWlnaHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0ZMT0FUIG1fZldpZHRoTWluOw0KKyAgICBGWF9GTE9BVCBtX2ZXaWR0aE1heDsNCisgICAgRlhfRkxPQVQgbV9mSGVpZ2h0TWF4Ow0KKyAgICBGWF9GTE9BVCBtX2ZIZWlnaHRNaW47DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3ZjhlOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaApAQCAtMCwwICsxLDE4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfRk9STV9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9GT1JNX0lNUF9IDQorY2xhc3MgQ0ZXTF9Ob3RlTG9vcDsNCitjbGFzcyBDRldMX1BhbmVsSW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfTXNnTW91c2U7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9UaGVtZVByb3ZpZGVyOw0KK2NsYXNzIENGV0xfU3lzQnRuOw0KK2NsYXNzIENGV0xfRm9ybUltcDsNCitjbGFzcyBDRldMX0Zvcm1EZWxlZ2F0ZTsNCisjZGVmaW5lIEZXTF9TWVNCVVRUT05TVEFURV9Ib3ZlcgkJMHgwMDAxDQorI2RlZmluZSBGV0xfU1lTQlVUVE9OU1RBVEVfUHJlc3NlZAkJMHgwMDAyDQorI2RlZmluZSBGV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQJCTB4MDAxMA0KK2NsYXNzIENGV0xfU3lzQnRuIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX1N5c0J0bigpDQorICAgIHsNCisgICAgICAgIG1fcnRCdG4uU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgbV9kd1N0YXRlID0gMDsNCisgICAgfQ0KKw0KKyAgICBGWF9CT09MIElzSG92ZXIoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd1N0YXRlICYgRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyOw0KKyAgICB9DQorICAgIEZYX0JPT0wgSXNQcmVzc2VkKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZHdTdGF0ZSAmIEZXTF9TWVNCVVRUT05TVEFURV9QcmVzc2VkOw0KKyAgICB9DQorICAgIEZYX0JPT0wgSXNEaXNhYmxlZCgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2R3U3RhdGUgJiBGV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQ7DQorICAgIH0NCisgICAgdm9pZCBTZXROb3JtYWwoKQ0KKyAgICB7DQorICAgICAgICBtX2R3U3RhdGUgJj0gMHhGRkYwOw0KKyAgICB9DQorICAgIHZvaWQgU2V0UHJlc3NlZCgpDQorICAgIHsNCisgICAgICAgIFNldE5vcm1hbCgpOw0KKyAgICAgICAgbV9kd1N0YXRlIHw9IEZXTF9TWVNCVVRUT05TVEFURV9QcmVzc2VkOw0KKyAgICB9DQorICAgIHZvaWQgU2V0SG92ZXIoKQ0KKyAgICB7DQorICAgICAgICBTZXROb3JtYWwoKTsNCisgICAgICAgIG1fZHdTdGF0ZSB8PSBGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXI7DQorICAgIH0NCisgICAgdm9pZCBTZXREaXNhYmxlZChGWF9CT09MIGJEaXNhYmxlZCkNCisgICAgew0KKyAgICAgICAgYkRpc2FibGVkID8gbV9kd1N0YXRlIHw9IEZXTF9TWVNCVVRUT05TVEFURV9EaXNhYmxlZCA6IG1fZHdTdGF0ZSAmPSB+RldMX1NZU0JVVFRPTlNUQVRFX0Rpc2FibGVkOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIEdldFBhcnRTdGF0ZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAoSXNEaXNhYmxlZCgpID8gRldMX1BBUlRTVEFURV9GUk1fRGlzYWJsZWQgOiAobV9kd1N0YXRlICsgMSkpOw0KKyAgICB9DQorDQorICAgIENGWF9SZWN0RgltX3J0QnRuOw0KKyAgICBGWF9EV09SRAltX2R3U3RhdGU7DQorfTsNCitlbnVtIEZPUk1fUkVTSVpFVFlQRSB7DQorICAgIEZPUk1fUkVTSVpFVFlQRV9Ob25lID0gMCwNCisgICAgRk9STV9SRVNJWkVUWVBFX0NhcCwNCisgICAgRk9STV9SRVNJWkVUWVBFX0xlZnQsDQorICAgIEZPUk1fUkVTSVpFVFlQRV9Ub3AsDQorICAgIEZPUk1fUkVTSVpFVFlQRV9SaWdodCwNCisgICAgRk9STV9SRVNJWkVUWVBFX0JvdHRvbSwNCisgICAgRk9STV9SRVNJWkVUWVBFX0xlZnRUb3AsDQorICAgIEZPUk1fUkVTSVpFVFlQRV9MZWZ0Qm90dG9tLA0KKyAgICBGT1JNX1JFU0laRVRZUEVfUmlnaHRUb3AsDQorICAgIEZPUk1fUkVTSVpFVFlQRV9SaWdodEJvdHRvbQ0KK307DQordHlwZWRlZiBzdHJ1Y3QgUmVzdG9yZVJlc2l6ZUluZm8gew0KKyAgICBDRlhfUG9pbnRGICBtX3B0U3RhcnQ7DQorICAgIENGWF9TaXplRiAgIG1fc3pTdGFydDsNCit9IFJlc3RvcmVJbmZvOw0KK2NsYXNzIENGV0xfRm9ybUltcCA6IHB1YmxpYyBDRldMX1BhbmVsSW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9Gb3JtSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisgICAgQ0ZXTF9Gb3JtSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0Zvcm1JbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0luc3RhbmNlKEZYX1dTVFIgd3NDbGFzcykgY29uc3Q7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCUluaXRpYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJRmluYWxpemUoKTsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCQlHZXRDbGllbnRSZWN0KENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBGV0xfRk9STVNJWkUJR2V0Rm9ybVNpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJU2V0Rm9ybVNpemUoRldMX0ZPUk1TSVpFIGVGb3JtU2l6ZSk7DQorICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCURvTW9kYWwoKTsNCisgICAgdmlydHVhbCBJRldMX1dpZGdldCoJRG9Nb2RhbChGWF9EV09SRCAmZHdDb21tYW5kSUQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQlFbmREb01vZGFsKCk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJCVNldEJvcmRlclJlZ2lvbihDRlhfUGF0aCAqcFBhdGgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUpOw0KKyAgICBDRldMX1dpZGdldEltcCogR2V0U3ViRm9jdXMoKTsNCisgICAgdm9pZAkJCVNldFN1YkZvY3VzKENGV0xfV2lkZ2V0SW1wICpwV2lkZ2V0KTsNCisgICAgQ0ZYX01hcEFjY2VsZXJhdG9ycyYJR2V0QWNjZWxlcmF0b3IoKTsNCisgICAgdm9pZAkJCQkJU2V0QWNjZWxlcmF0b3IoQ0ZYX01hcEFjY2VsZXJhdG9ycyAqcEFjY2VsZXJhdG9ycyk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQkJU2hvd0NoaWxkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCisgICAgdm9pZAkJCVJlbW92ZVN5c0J1dHRvbnMoKTsNCisgICAgdm9pZAkJCUNhbGNDb250ZW50UmVjdChDRlhfUmVjdEYgJnJ0Q29udGVudCk7DQorICAgIENGV0xfU3lzQnRuKglHZXRTeXNCdG5BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIENGV0xfU3lzQnRuKglHZXRTeXNCdG5CeVN0YXRlKEZYX0RXT1JEIGR3U3RhdGUpOw0KKyAgICBDRldMX1N5c0J0bioJR2V0U3lzQnRuQnlJbmRleChGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICBGWF9JTlQzMgkJR2V0U3lzQnRuSW5kZXgoQ0ZXTF9TeXNCdG4gKnBCdG4pOw0KKyAgICBGWF9GTE9BVAkJR2V0Q2FwdGlvbkhlaWdodCgpOw0KKyAgICB2b2lkCQkJRHJhd0NhcHRpb25UZXh0KENGWF9HcmFwaGljcyAqcEdzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgICB2b2lkCQkJRHJhd0ljb25JbWFnZShDRlhfR3JhcGhpY3MgKnBHcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAkJCUdldEVkZ2VSZWN0KENGWF9SZWN0RiAmcnRFZGdlKTsNCisgICAgdm9pZAkJCVNldFdvcmtBcmVhUmVjdCgpOw0KKyAgICB2b2lkCQkJU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZvaWQJCQlMYXlvdXQoKTsNCisgICAgdm9pZAkJCVJlU2V0U3lzQnRuKCk7DQorICAgIHZvaWQJCQlSZWdpc3RlckZvcm0oKTsNCisgICAgdm9pZAkJCVVuUmVnaXN0ZXJGb3JtKCk7DQorICAgIEZYX0JPT0wJCQlJc0RvTW9kYWwoKTsNCisgICAgdm9pZAkJCVNldFRoZW1lRGF0YSgpOw0KKyAgICBGWF9CT09MCQkJSGFzSWNvbigpOw0KKyAgICB2b2lkCQkJVXBkYXRlSWNvbigpOw0KKyAgICB2b2lkCQkJVXBkYXRlQ2FwdGlvbigpOw0KKyAgICB2b2lkICAgICAgICAgICAgRG9XaWR0aExpbWl0KEZYX0ZMT0FUICZmTGVmdCwgRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgZkN1clgsIEZYX0ZMT0FUIGZTcGFjZSwgRlhfRkxPQVQgZkxpbWl0TWluLCBGWF9GTE9BVCBmTGltaXRNYXgsIEZYX0JPT0wgYkxlZnQpOw0KKyAgICB2b2lkICAgICAgICAgICAgRG9IZWlnaHRMaW1pdChGWF9GTE9BVCAmZlRvcCwgRlhfRkxPQVQgJmZIZWlnaHQsIEZYX0ZMT0FUIGZDdXJZLCBGWF9GTE9BVCBmU3BhY2UsIEZYX0ZMT0FUIGZMaW1pdE1pbiwgRlhfRkxPQVQgZkxpbWl0TWF4LCBGWF9CT09MIGJUb3ApOw0KKyAgICBDRlhfTWFwQWNjZWxlcmF0b3JzCQltX21hcEFjY2VsZXJhdG9yczsNCisgICAgQ0ZYX1JlY3RGCQkJCW1fcnRSZXN0b3JlOw0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydENhcHRpb25UZXh0Ow0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydFJlbGF0aXZlOw0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydENhcHRpb247DQorICAgIENGWF9SZWN0RgkJCQltX3J0SWNvbjsNCisgICAgQ0ZXTF9TeXNCdG4JCQkgICAqbV9wQ2xvc2VCb3g7DQorICAgIENGV0xfU3lzQnRuCQkJICAgKm1fcE1pbkJveDsNCisgICAgQ0ZXTF9TeXNCdG4JCQkgICAqbV9wTWF4Qm94Ow0KKyAgICBDRldMX1N5c0J0bgkJCSAgICptX3BDYXB0aW9uQm94Ow0KKyAgICBDRldMX05vdGVMb29wCQkgICAqbV9wTm90ZUxvb3A7DQorICAgIENGV0xfV2lkZ2V0SW1wCQkgICAqbV9wU3ViRm9jdXM7DQorICAgIFJlc3RvcmVJbmZvCQkJCW1fSW5mb1N0YXJ0Ow0KKyAgICBGWF9GTE9BVAkJCQltX2ZDWEJvcmRlcjsNCisgICAgRlhfRkxPQVQJCQkJbV9mQ1lCb3JkZXI7DQorICAgIEZYX0lOVDMyCQkJCW1faUNhcHR1cmVCdG47DQorICAgIEZYX0lOVDMyCQkJCW1faVN5c0JveDsNCisgICAgRlhfSU5UMzIJCQkJbV9lUmVzaXplVHlwZTsNCisgICAgRlhfQk9PTAkJCQkJbV9iTEJ1dHRvbkRvd247DQorICAgIEZYX0JPT0wJCQkJCW1fYk1heGltaXplZDsNCisgICAgRlhfQk9PTAkJCQkJbV9iU2V0TWF4aW1pemU7DQorICAgIEZYX0JPT0wJCQkJCW1fYkN1c3RvbWl6ZUxheW91dDsNCisgICAgRldMX0ZPUk1TSVpFCQkJbV9lRm9ybVNpemU7DQorICAgIEZYX0JPT0wJCQkJCW1fYkRvTW9kYWxGbGFnOw0KKyAgICBGWF9GTE9BVAkJCQltX2ZTbWFsbEljb25TejsNCisgICAgRlhfRkxPQVQJCQkJbV9mQmlnSWNvblN6Ow0KKyAgICBDRlhfRElCaXRtYXAJCQkqbV9wQmlnSWNvbjsNCisgICAgQ0ZYX0RJQml0bWFwCQkJKm1fcFNtYWxsSWNvbjsNCisgICAgRlhfQk9PTAkJCQkJbV9iTW91c2VJbjsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfRm9ybURlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9Gb3JtRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfRm9ybURlbGVnYXRlKENGV0xfRm9ybUltcCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCU9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25Nb3VzZUhvdmVyKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KKyAgICB2b2lkCU9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCisgICAgdm9pZAlPbkxCdXR0b25EYmxDbGsoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIHZvaWQJT25XaW5kb3dNb3ZlKENGV0xfTXNnV2luZG93TW92ZSAqcE1zZyk7DQorICAgIHZvaWQJT25DbG9zZShDRldMX01zZ0Nsb3NlICpwTXNnKTsNCisgICAgQ0ZXTF9Gb3JtSW1wICptX3BPd25lcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2dyaWRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2dyaWRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTM4ZjFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZ3JpZGltcC5oCkBAIC0wLDAgKzEsMTYxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9HUklEX0lNUF9IDQorI2RlZmluZSBfRldMX0dSSURfSU1QX0gNCitjbGFzcyBDRldMX0NvbnRlbnQ7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9HcmlkTGVuZ3RoOw0KK2NsYXNzIENGV0xfR3JpZENvbFJvdzsNCitjbGFzcyBDRldMX0dyaWRXaWRnZXRJbmZvOw0KK2NsYXNzIENGV0xfR3JpZEltcDsNCitjbGFzcyBDRldMX0dyaWRMZW5ndGggOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfR3JpZExlbmd0aCgpDQorICAgICAgICA6IGZMZW5ndGgoMCkNCisgICAgICAgICwgZVVuaXQoRldMX0dSSURVTklUX0ZpeGVkKQ0KKyAgICB7DQorICAgIH0NCisgICAgQ0ZXTF9HcmlkTGVuZ3RoKEZYX0ZMT0FUIGZWYWx1ZSwgRldMX0dSSURVTklUIGUpDQorICAgICAgICA6IGZMZW5ndGgoZlZhbHVlKQ0KKyAgICAgICAgLCBlVW5pdChlKQ0KKyAgICB7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkxlbmd0aDsNCisgICAgRldMX0dSSURVTklUIGVVbml0Ow0KK307DQorY2xhc3MgQ0ZXTF9HcmlkQ29sUm93IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX0dyaWRDb2xSb3coKQ0KKyAgICAgICAgOiBtX1NpemUgKDEsIEZXTF9HUklEVU5JVF9TY2FsZWQpDQorICAgICAgICAsIG1fTWluU2l6ZSgwLCBGV0xfR1JJRFVOSVRfRml4ZWQpDQorICAgICAgICAsIG1fTWF4U2l6ZSgwLCBGV0xfR1JJRFVOSVRfSW5maW5pdHkpDQorICAgICAgICAsIG1fZkFjdHVhbFNpemUoMCkNCisgICAgICAgICwgbV9mQWN0dWFsUG9zKDApDQorICAgIHsNCisgICAgfQ0KKyAgICBDRldMX0dyaWRMZW5ndGgJbV9TaXplOw0KKyAgICBDRldMX0dyaWRMZW5ndGgJbV9NaW5TaXplOw0KKyAgICBDRldMX0dyaWRMZW5ndGgJbV9NYXhTaXplOw0KKyAgICBGWF9GTE9BVAkJbV9mQWN0dWFsU2l6ZTsNCisgICAgRlhfRkxPQVQJCW1fZkFjdHVhbFBvczsNCit9Ow0KK2NsYXNzIENGV0xfR3JpZFdpZGdldEluZm8gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfR3JpZFdpZGdldEluZm8oKQ0KKyAgICAgICAgOiBtX2lDb2x1bW4gKDApDQorICAgICAgICAsIG1faUNvbHVtblNwYW4oMSkNCisgICAgICAgICwgbV9pUm93KDApDQorICAgICAgICAsIG1faVJvd1NwYW4oMSkNCisgICAgICAgICwgbV9kd01hcmdpbkZsYWcoMCkNCisgICAgICAgICwgbV9mQWN0dWFsV2lkdGgoMCkNCisgICAgICAgICwgbV9mQWN0dWFsSGVpZ2h0KDApDQorICAgIHsNCisgICAgICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoID0gMDsNCisgICAgICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGggPSAwOw0KKyAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQorICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5mTGVuZ3RoID0gMDsNCisgICAgICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KKyAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZkxlbmd0aCA9IDA7DQorICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQorICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZkxlbmd0aCA9IDA7DQorICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQorICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZkxlbmd0aCA9IDA7DQorICAgICAgICBtX01hcmdpblswXSA9IG1fTWFyZ2luWzFdID0gbV9NYXJnaW5bMl0gPSBtX01hcmdpblszXSA9IDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbV9pQ29sdW1uOw0KKyAgICBGWF9JTlQzMiBtX2lDb2x1bW5TcGFuOw0KKyAgICBGWF9JTlQzMiBtX2lSb3c7DQorICAgIEZYX0lOVDMyIG1faVJvd1NwYW47DQorICAgIENGV0xfR3JpZExlbmd0aAltX1NpemVbNl07DQorICAgIEZYX0RXT1JECQltX2R3TWFyZ2luRmxhZzsNCisgICAgRlhfRkxPQVQJCW1fTWFyZ2luWzRdOw0KKyAgICBGWF9GTE9BVAkJbV9mQWN0dWFsV2lkdGg7DQorICAgIEZYX0ZMT0FUCQltX2ZBY3R1YWxIZWlnaHQ7DQorfTsNCitjbGFzcyBDRldMX0dyaWRJbXAgOiBwdWJsaWMgQ0ZXTF9Db250ZW50SW1wDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9HcmlkSW1wKCk7DQorICAgIENGV0xfR3JpZEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0dyaWRJbXAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJSW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwQ2hpbGQsIEZYX0lOVDMyIG5JbmRleCA9IC0xKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJUmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfSEdSSURDT0xST1cJCUluc2VydENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIEZYX0lOVDMyIG5JbmRleCA9IC0xKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50Q29sUm93cyhGWF9CT09MIGJDb2x1bW4pOw0KKyAgICB2aXJ0dWFsIEZXTF9IR1JJRENPTFJPVwkJR2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgRlhfSU5UMzIgbkluZGV4KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCk7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQgJmVVbml0KTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQkJCVNldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUICZlVW5pdCk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJCQlTZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCURlbGV0ZUNvbFJvdyhGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbik7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyIGlQb3MsIEZYX0JPT0wgYkNvbHVtbik7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgaVNwYW4sIEZYX0JPT0wgYkNvbHVtbik7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURTSVpFIGVTaXplLCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVaXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLCBGWF9GTE9BVCAmZk1hcmdpbik7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUIGZNYXJnaW4pOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJUmVtb3ZlV2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luKTsNCisgICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUICZlVW5pdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKglHZXRXaWRnZXRJbmZvKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdm9pZAkJCVByb2NGaXhlZENvbFJvdyhDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3csIEZYX0lOVDMyIG5JbmRleCwgRlhfRkxPQVQgZkNvbFJvd1NpemUsIEZYX0JPT0wgYkNvbHVtbik7DQorICAgIHZvaWQJCQlQcm9jQXV0b0NvbFJvdyhDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3csIEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiQ29sdW1uKTsNCisgICAgdm9pZAkJCVByb2NTY2FsZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93LCBGWF9JTlQzMiBuSW5kZXgsIEZYX0ZMT0FUIGZDb2xSb3dTaXplLCBGWF9CT09MIGJDb2x1bW4pOw0KKyAgICB2b2lkCQkJQ2FsY1dpZGdldFdpZHRoKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbywgRlhfRkxPQVQgZkNvbHVubVdpZHRoKTsNCisgICAgdm9pZAkJCUNhbGNXaWRnZXRIZWlndChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8sIEZYX0ZMT0FUIGZSb3dIZWlndCk7DQorICAgIEZYX0ZMT0FUCQlDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyk7DQorICAgIEZYX0ZMT0FUCQlDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8pOw0KKyAgICBGWF9GTE9BVAkJUHJvY2Vzc0NvbHVtbnMoRlhfRkxPQVQgZldpZHRoKTsNCisgICAgRlhfRkxPQVQJCVByb2Nlc3NSb3dzKEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgICBGWF9GTE9BVAkJUHJvY2Vzc1VuQ2VydGFpbkNvbHVtbnMoKTsNCisgICAgRlhfRkxPQVQJCVByb2Nlc3NVbkNlcnRhaW5Sb3dzKCk7DQorICAgIEZYX0JPT0wJCQlTZXRDb2xSb3dBY3R1YWxTaXplKENGV0xfR3JpZENvbFJvdyAqcENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZYX0JPT0wgYlNldEJleW9uZCA9IEZBTFNFKTsNCisgICAgRlhfRkxPQVQJCVNldFdpZGdldEFjdHVhbFdpZHRoKENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvLCBGWF9GTE9BVCBmV2lkdGgpOw0KKyAgICBGWF9GTE9BVAkJU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvLCBGWF9GTE9BVCBmSGVpZ2h0KTsNCisgICAgdm9pZAkJCVNldEFsbFdpZGdldHNSZWN0KCk7DQorICAgIEZYX0JPT0wJCQlJc0dyaWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2b2lkCQkJU2V0U3BhbkF1dG9Db2xSb3dTaXplKGNvbnN0IENGWF9QdHJBcnJheSAmc3BhbkF1dG9zLCBGWF9GTE9BVCBmVG90YWxTaXplKTsNCisgICAgdm9pZAkJCVNldFNwYW5TY2FsZWRDb2xSb3dTaXplKGNvbnN0IENGWF9QdHJBcnJheSAmc3BhblNjYWxlZHMsIEZYX0ZMT0FUIGZUb3RhbFNpemUsIEZYX0ZMT0FUIGZUb3RhbFNjYWxlZE51bSk7DQorICAgIHZvaWQJCQlTZXRTY2FsZWRDb2xSb3dzU2l6ZShjb25zdCBDRlhfUHRyQXJyYXkgJnNwYW5TY2FsZWRzLCBGWF9GTE9BVCBmVG90YWxTaXplLCBGWF9GTE9BVCBmVG90YWxTY2FsZWROdW0pOw0KKyAgICBDRlhfUHRyQXJyYXkJCQkJbV9Sb3dzOw0KKyAgICBDRlhfUHRyQXJyYXkJCQkJbV9Db2x1bW5zOw0KKyAgICBDRlhfUHRyQXJyYXkJCQkJbV9XaWRnZXRzOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQkJbV9tYXBXaWRnZXRJbmZvOw0KKyAgICBDRldMX0dyaWRMZW5ndGgJCQkJbV9TaXplWzZdOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9HcmlkRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0dyaWREZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9HcmlkRGVsZWdhdGUoQ0ZXTF9HcmlkSW1wICpwT3duZXIpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRldMX0dyaWRJbXAgKm1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzIzOTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX05PVEVfSU1QX0gNCisjZGVmaW5lIF9GV0xfTk9URV9JTVBfSA0KK2NsYXNzIENGV0xfVGFyZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfTm90ZVRocmVhZDsNCitjbGFzcyBDRldMX1Rvb2xUaXBJbXA7DQorY2xhc3MgSUZXTF9Ub29sVGlwVGFyZ2V0Ow0KK2NsYXNzIENGV0xfQ29yZVRvb3BUaXBEUDsNCitjbGFzcyBDRldMX05vdGVMb29wOw0KK2NsYXNzIENGV0xfTm90ZURyaXZlcjsNCitjbGFzcyBDRldMX0V2ZW50VGFyZ2V0Ow0KK2NsYXNzIENGV0xfVG9vbFRpcENvbnRhaW5lcjsNCitjbGFzcyBDRldMX05vdGVMb29wIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX05vdGVMb29wKENGV0xfV2lkZ2V0SW1wICpwRm9ybSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgUHJlUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUglJZGxlKEZYX0lOVDMyIGNvdW50KTsNCisgICAgQ0ZXTF9XaWRnZXRJbXAqCUdldEZvcm0oKTsNCisgICAgRlhfQk9PTAlDb250aW51ZU1vZGFsKCk7DQorICAgIEZXTF9FUlIJRW5kTW9kYWxMb29wKCk7DQorICAgIEZYX0JPT0wgVHJhbnNsYXRlQWNjZWxlcmF0b3IoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIEZXTF9FUlIJU2V0TWFpbkZvcm0oQ0ZXTF9XaWRnZXRJbXAgKnBGb3JtKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQgR2VuZXJhdGVDb21tb25kRXZlbnQoRlhfRFdPUkQgZHdDb21tYW5kKTsNCisNCisgICAgQ0ZXTF9XaWRnZXRJbXAJKm1fcEZvcm07DQorICAgIEZYX0JPT0wJCQltX2JDb250aW51ZU1vZGFsOw0KK307DQorY2xhc3MgQ0ZXTF9Ob3RlRHJpdmVyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX05vdGVEcml2ZXIoKTsNCisgICAgfkNGV0xfTm90ZURyaXZlcigpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVNlbmROb3RlKENGV0xfTm90ZSAqcE5vdGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVBvc3RNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBMaXN0ZW5lciwgSUZXTF9XaWRnZXQgKnBFdmVudFNvdXJjZSA9IE5VTEwsIEZYX0RXT1JEIGR3RmlsdGVyID0gRldMX0VWRU5UX0FMTF9NQVNLKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBMaXN0ZW5lcik7DQorICAgIHZpcnR1YWwJdm9pZAkJQ2xlYXJFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRRdWV1ZU1heFNpemUoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlTZXRRdWV1ZU1heFNpemUoY29uc3QgRlhfSU5UMzIgc2l6ZSk7DQorICAgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVB1c2hOb3RlTG9vcChJRldMX05vdGVMb29wICpwTm90ZUxvb3ApOw0KKyAgICB2aXJ0dWFsIElGV0xfTm90ZUxvb3AqIFBvcE5vdGVMb29wKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Rm9jdXMoSUZXTF9XaWRnZXQgKnBGb2N1cywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVJ1bigpOw0KKyAgICBJRldMX1dpZGdldCoJCUdldEZvY3VzKCk7DQorICAgIElGV0xfV2lkZ2V0KgkJR2V0SG92ZXIoKTsNCisgICAgdm9pZAkJCQlTZXRIb3ZlcihJRldMX1dpZGdldCAqcEhvdmVyKTsNCisgICAgdm9pZAkJCQlTZXRHcmFiKElGV0xfV2lkZ2V0ICpwR3JhYiwgRlhfQk9PTCBiU2V0KTsNCisgICAgdm9pZAkJCQlOb3RpZnlUYXJnZXRIaWRlKElGV0xfV2lkZ2V0ICpwTm90ZVRhcmdldCk7DQorICAgIHZvaWQJCQkJTm90aWZ5VGFyZ2V0RGVzdHJveShJRldMX1dpZGdldCAqcE5vdGVUYXJnZXQpOw0KKyAgICB2b2lkCQkJCU5vdGlmeUZ1bGxTY3JlZW5Nb2RlKElGV0xfV2lkZ2V0ICpwTm90ZVRhcmdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQorICAgIEZXTF9FUlIJCQkJUmVnaXN0ZXJGb3JtKENGV0xfV2lkZ2V0SW1wICpwRm9ybSk7DQorICAgIEZXTF9FUlIJCQkJVW5SZWdpc3RlckZvcm0oQ0ZXTF9XaWRnZXRJbXAgKnBGb3JtKTsNCisgICAgRlhfQk9PTAkJCQlRdWV1ZU1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIEZYX0JPT0wJCQkJVW5xdWV1ZU1lc3NhZ2UoQ0ZXTF9Ob3RlTG9vcCAqcE5vdGVMb29wKTsNCisgICAgQ0ZXTF9Ob3RlTG9vcCoJCUdldFRvcExvb3AoKTsNCisgICAgRlhfSU5UMzIgICAgICAgICAgICBDb3VudExvb3AoKTsNCisgICAgdm9pZCAgICAgICAgICAgICAgICBTZXRIb29rKEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssIEZYX0xQVk9JRCBpbmZvKTsNCisgICAgRlhfQk9PTAkJCQlQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0JPT0wJCQkJRGlzcGF0Y2hNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UsIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KKyAgICBGWF9CT09MCQkJCURvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQorICAgIEZYX0JPT0wJCQkJRG9EZWFjdGl2YXRlKENGV0xfTXNnRGVhY3RpdmF0ZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQorICAgIEZYX0JPT0wJCQkJRG9TZXRGb2N1cyhDRldMX01zZ1NldEZvY3VzICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKTsNCisgICAgRlhfQk9PTAkJCQlEb0tpbGxGb2N1cyhDRldMX01zZ0tpbGxGb2N1cyAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQorICAgIEZYX0JPT0wJCQkJRG9LZXkoQ0ZXTF9Nc2dLZXkgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KKyAgICBGWF9CT09MCQkJCURvTW91c2UoQ0ZXTF9Nc2dNb3VzZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQorICAgIEZYX0JPT0wJCQkJRG9XaGVlbChDRldMX01zZ01vdXNlV2hlZWwgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KKyAgICBGWF9CT09MCQkJCURvU2l6ZShDRldMX01zZ1NpemUgKnBNc2cpOw0KKyAgICBGWF9CT09MCQkJCURvV2luZG93TW92ZShDRldMX01zZ1dpbmRvd01vdmUgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KKyAgICBGWF9CT09MCQkJCURvRHJhZ0ZpbGVzKENGV0xfTXNnRHJvcEZpbGVzICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKTsNCisgICAgRlhfQk9PTAkJCQlEb01vdXNlRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQorICAgIHZvaWQJCQkJTW91c2VTZWNvbmRhcnkoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorICAgIEZYX0JPT0wJCQkJSXNWYWxpZE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIElGV0xfV2lkZ2V0KgkJR2V0TWVzc2FnZUZvcm0oSUZXTF9XaWRnZXQgKnBEc3RUYXJnZXQpOw0KKyAgICB2b2lkCQkJCUNsZWFySW52YWxpZEV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpOw0KKyAgICBDRlhfUHRyQXJyYXkJCW1fZm9ybXM7DQorICAgIENGWF9QdHJBcnJheQkJbV9ub3RlUXVldWU7DQorICAgIENGWF9QdHJBcnJheQkJbV9ub3RlTG9vcFF1ZXVlOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCW1fZXZlbnRUYXJnZXRzOw0KKyAgICBGWF9JTlQzMgkJCW1fc2VuZEV2ZW50Q2FsbGVkOw0KKyAgICBGWF9JTlQzMgkJCW1fbWF4U2l6ZTsNCisgICAgRlhfQk9PTAkJCQltX2JGdWxsU2NyZWVuOw0KKyAgICBJRldMX1dpZGdldAkJCSptX3BIb3ZlcjsNCisgICAgSUZXTF9XaWRnZXQJCQkqbV9wRm9jdXM7DQorICAgIElGV0xfV2lkZ2V0CQkJKm1fcEdyYWI7DQorICAgIENGV0xfTm90ZUxvb3AJCSptX3BOb3RlTG9vcDsNCisgICAgRldMTWVzc2FnZUhvb2tDYWxsYmFjayBtX2hvb2s7DQorICAgIEZYX0xQVk9JRCAgICAgICAgICAgICAgbV9ob29rSW5mbzsNCit9Ow0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0xQVk9JRCwgRlhfRFdPUkQ+IENGV0xfRXZlbnRTb3VyY2U7DQorY2xhc3MgQ0ZXTF9FdmVudFRhcmdldCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9FdmVudFRhcmdldChDRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyLCBJRldMX1dpZGdldCAqcExpc3RlbmVyKQ0KKyAgICAgICAgOiBtX3BOb3RlRHJpdmVyKHBOb3RlRHJpdmVyKQ0KKyAgICAgICAgLCBtX3BMaXN0ZW5lcihwTGlzdGVuZXIpDQorICAgICAgICAsIG1fYkludmFsaWQoRkFMU0UpDQorICAgIHsNCisgICAgfQ0KKyAgICB+Q0ZXTF9FdmVudFRhcmdldCgpOw0KKyAgICBGWF9JTlQzMiBTZXRFdmVudFNvdXJjZShJRldMX1dpZGdldCAqcFNvdXJjZSwgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KKyAgICBGWF9CT09MICBQcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgRlhfQk9PTCAgSXNGaWx0ZXJFdmVudChDRldMX0V2ZW50ICpwRXZlbnQsIEZYX0RXT1JEIGR3RmlsdGVyKTsNCisgICAgRlhfQk9PTAkgSXNJbnZhbGlkKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fYkludmFsaWQ7DQorICAgIH0NCisgICAgdm9pZAkgRmxhZ0ludmFsaWQoKQ0KKyAgICB7DQorICAgICAgICBtX2JJbnZhbGlkID0gVFJVRTsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9FdmVudFNvdXJjZSBtX2V2ZW50U291cmNlczsNCisgICAgSUZXTF9XaWRnZXQgKm1fcExpc3RlbmVyOw0KKyAgICBDRldMX05vdGVEcml2ZXIgKm1fcE5vdGVEcml2ZXI7DQorICAgIEZYX0JPT0wJbV9iSW52YWxpZDsNCit9Ow0KK2NsYXNzIENGV0xfVG9vbFRpcENvbnRhaW5lcjogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXBDb250YWluZXIoKTsNCisgICAgc3RhdGljIENGV0xfVG9vbFRpcENvbnRhaW5lciogZ2V0SW5zdGFuY2UoKTsNCisNCisgICAgRlhfRVJSCQlBZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCk7DQorICAgIEZYX0VSUgkJUmVtb3ZlVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQgKnBUYXJnZXQpOw0KKyAgICBJRldMX1Rvb2xUaXBUYXJnZXQqIEdldEN1cnJlbnRUb29sVGlwVGFyZ2V0KCk7DQorDQorICAgIEZYX0JPT0wgSGFzVG9vbFRpcChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorDQorICAgIEZYX0JPT0wgUHJvY2Vzc0VudGVyKENGV0xfRXZ0TW91c2UgKnBFdnQsIElGV0xfV2lkZ2V0ICpwT3duZXIpOw0KKyAgICBGWF9CT09MIFByb2Nlc3NMZWF2ZShDRldMX0V2dE1vdXNlICpwRXZ0KTsNCisNCisgICAgRlhfRVJSICBTZXRUb29sVGlwSW5pdGlhbERlbGF5KEZYX0lOVDMyIGlEZWxheVRpbWUpOw0KKyAgICBGWF9FUlIJU2V0VG9vbFRpcEF1dG9Qb3BEZWxheShGWF9JTlQzMiBpRGVsYXlUaW1lKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGV0xfVG9vbFRpcENvbnRhaW5lcigpOw0KKw0KKyAgICBJRldMX1Rvb2xUaXBUYXJnZXQJCSpwQ3VyVGFyZ2V0Ow0KKyAgICBDRldMX1Rvb2xUaXBJbXAJCQkqbV9wVG9vbFRpcEltcDsNCisgICAgQ0ZXTF9Db3JlVG9vcFRpcERQCQkqbV9Ub29sVGlwRHA7DQorICAgIENGWF9QdHJBcnJheQkJCW1fYXJyV2lkZ2V0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZjhiZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfUEFORUxfSU1QX0gNCisjZGVmaW5lIF9GV0xfUEFORUxfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9Db250ZW50Ow0KK2NsYXNzIENGV0xfUGFuZWxJbXA7DQorY2xhc3MgQ0ZXTF9QYW5lbEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfUGFuZWxJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICBDRldMX1BhbmVsSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1BhbmVsSW1wKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENsYXNzSUQoKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCQlVcGRhdGUoKTsNCisgICAgdmlydHVhbCBJRldMX0NvbnRlbnQqCUdldENvbnRlbnQoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJU2V0Q29udGVudChJRldMX0NvbnRlbnQgKnBDb250ZW50KTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfQ29udGVudAkJCSptX3BDb250ZW50Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU1NGNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfVEFSR0VUX0lNUF9IDQorI2RlZmluZSBfRldMX1RBUkdFVF9JTVBfSA0KK2NsYXNzIElGV0xfVGFyZ2V0Ow0KK2NsYXNzIENGV0xfVGFyZ2V0Ow0KK2NsYXNzIENGV0xfVGFyZ2V0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlSZWxlYXNlKCk7DQorICAgIHZpcnR1YWwgSUZXTF9UYXJnZXQqCVJldGFpbigpOw0KKyAgICB2aXJ0dWFsCUZYX0RXT1JECQlHZXRSZWZDb3VudCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzSW5zdGFuY2UoRlhfV1NUUiB3c0NsYXNzKSBjb25zdDsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQlGaW5hbGl6ZSgpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9UYXJnZXQoKTsNCisgICAgdmlydHVhbCB+Q0ZXTF9UYXJnZXQoKTsNCisgICAgRlhfRFdPUkQJbV9kd1JlZkNvdW50Ow0KK307DQorY2xhc3MgSUZXTF9UYXJnZXREYXRhIDogcHVibGljIElGV0xfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgRlhfTFBWT0lEIEdldERhdGEoKTsNCisgICAgdm9pZAkgIFNldERhdGEoRlhfTFBWT0lEIHBEYXRhKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhYzM2NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1RIUkVBRF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9USFJFQURfSU1QX0gNCitjbGFzcyBDRldMX1RhcmdldDsNCitjbGFzcyBDRldMX05vdGVEcml2ZXI7DQorY2xhc3MgSUZXTF9Ob3RlVGhyZWFkOw0KK2NsYXNzIElGV0xfTm90ZURyaXZlcjsNCitjbGFzcyBDRldMX1RocmVhZDsNCitjbGFzcyBDRldMX05vdGVUaHJlYWQ7DQorY2xhc3MgQ0ZXTF9Db250cm9sVGhyZWFkOw0KK2NsYXNzIENGV0xfVGhyZWFkIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX1RocmVhZCgpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1RocmVhZCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCk7DQorfTsNCitjbGFzcyBDRldMX0NvbnRyb2xUaHJlYWQgOiBwdWJsaWMgQ0ZXTF9UaHJlYWQNCit7DQorcHVibGljOg0KKyAgICBDRldMX0NvbnRyb2xUaHJlYWQoSUZXTF9UaHJlYWQgKiBkZWZIYW5kbGVyKQ0KKyAgICB7DQorICAgICAgICBfZGVmSGFuZGxlciA9IGRlZkhhbmRsZXI7DQorICAgIH0NCisgICAgdmlydHVhbCB+Q0ZXTF9Db250cm9sVGhyZWFkKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCk7DQorcHJvdGVjdGVkOg0KKyAgICBJRldMX1RocmVhZCAqCV9kZWZIYW5kbGVyOw0KK307DQorY2xhc3MgQ0ZXTF9Ob3RlVGhyZWFkIDogcHVibGljIENGV0xfVGhyZWFkDQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9Ob3RlVGhyZWFkKCk7DQorICAgIHZpcnR1YWwgfkNGV0xfTm90ZVRocmVhZCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KKyAgICB2aXJ0dWFsIElGV0xfTm90ZURyaXZlciogR2V0Tm90ZURyaXZlcigpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9Ob3RlRHJpdmVyCQkqbV9wTm90ZURyaXZlcjsNCisgICAgRldMX0hUSFJFQUQJCQkgbV9oVGhyZWFkOw0KKyAgICBzdGF0aWMgQ0ZXTF9Db250cm9sVGhyZWFkCSAqCV9hc3Npc3RhbnRUaHJlYWRIYW5kbGVyOw0KKyAgICBzdGF0aWMgRldMX0hUSFJFQUQJCQkJX2Fzc2lzdGFudFRocmVhZDsNCisgICAgc3RhdGljIEZYX0lOVDMyCQkJCQlfcmVmQ291bnQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOWJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaApAQCAtMCwwICsxLDEyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfV0lER0VUX0lNUF9IDQorI2RlZmluZSBfRldMX1dJREdFVF9JTVBfSA0KK2NsYXNzIENGV0xfTm90ZVRhcmdldDsNCitjbGFzcyBDRldMX05vdGVUaHJlYWQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBJRldMX0RhdGFQcm92aWRlcjsNCitjbGFzcyBJRldMX1dpZGdldERlbGVnYXRlOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wIDogcHVibGljIENGV0xfVGFyZ2V0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0R2xvYmFsUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdmlydHVhbAlGV0xfRVJSCQlHZXRDbGllbnRSZWN0KENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwJSUZXTF9XaWRnZXQqIEdldFBhcmVudCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCSBTZXRQYXJlbnQoSUZXTF9XaWRnZXQgKnBQYXJlbnQpOw0KKyAgICB2aXJ0dWFsCUlGV0xfV2lkZ2V0KiBHZXRPd25lcigpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCSBTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyKTsNCisgICAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0T3V0ZXIoKTsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTdHlsZXMoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKTsNCisgICAgdmlydHVhbCBGWF9EV09SRAlHZXRTdHlsZXNFeCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFN0YXRlcygpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UHJpdmF0ZURhdGEoRlhfTFBWT0lEIG1vZHVsZV9pZCwgRlhfTFBWT0lEIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQorICAgIHZpcnR1YWwgRlhfTFBWT0lECUdldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQpOw0KKyAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUxvY2tVcGRhdGUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlVbmxvY2tVcGRhdGUoKTsNCisgICAgdmlydHVhbCBGWF9EV09SRAlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJVHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZydCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0TWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRldMX1RoZW1lUHJvdmlkZXIqCUdldFRoZW1lUHJvdmlkZXIoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcik7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXREYXRhUHJvdmlkZXIoSUZXTF9EYXRhUHJvdmlkZXIgKnBEYXRhUHJvdmlkZXIpOw0KKyAgICB2aXJ0dWFsIElGV0xfV2lkZ2V0RGVsZWdhdGUqU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlKTsNCisgICAgdmlydHVhbAlJRldMX05vdGVUaHJlYWQqCUdldE93bmVyVGhyZWFkKCkgY29uc3Q7DQorICAgIEZXTF9FUlIJCQkJU2V0T3duZXJUaHJlYWQoQ0ZXTF9Ob3RlVGhyZWFkICpwT3duZXJUaHJlYWQpOw0KKyAgICBGV0xfRVJSCQkJCUdldFByb3BlcnRpZXMoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCisgICAgRldMX0VSUgkJCQlTZXRQcm9wZXJ0aWVzKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcyk7DQorICAgIElGV0xfV2lkZ2V0KgkJR2V0SW50ZXJmYWNlKCk7DQorICAgIHZvaWQJCQkJU2V0SW50ZXJmYWNlKElGV0xfV2lkZ2V0ICpwSW50ZXJmYWNlKTsNCisgICAgQ0ZYX1NpemVGCQkJR2V0T2Zmc2V0RnJvbVBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRldMX1dpZGdldEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorICAgIENGV0xfV2lkZ2V0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIH5DRldMX1dpZGdldEltcCgpOw0KKyAgICBGWF9CT09MCUlzRW5hYmxlZCgpOw0KKyAgICBGWF9CT09MCUlzVmlzaWJsZSgpOw0KKyAgICBGWF9CT09MIElzQWN0aXZlKCk7DQorICAgIEZYX0JPT0wgSXNPdmVyTGFwcGVyKCk7DQorICAgIEZYX0JPT0wgSXNQb3B1cCgpOw0KKyAgICBGWF9CT09MIElzQ2hpbGQoKTsNCisgICAgRlhfQk9PTAlJc0xvY2tlZCgpOw0KKyAgICBGWF9CT09MIElzT2Zmc2NyZWVuKCk7DQorICAgIEZYX0JPT0wJSGFzQm9yZGVyKCk7DQorICAgIEZYX0JPT0wJSGFzRWRnZSgpOw0KKyAgICB2b2lkCQlHZXRFZGdlUmVjdChDRlhfUmVjdEYgJnJ0RWRnZSk7DQorICAgIEZYX0ZMT0FUCUdldEJvcmRlclNpemUoRlhfQk9PTCBiQ1ggPSBUUlVFKTsNCisgICAgRlhfRkxPQVQJR2V0RWRnZVdpZHRoKCk7DQorICAgIHZvaWQJCUdldFJlbGF0aXZlUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KKyAgICBGWF9MUFZPSUQJR2V0VGhlbWVDYXBhY2l0eShGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICBDRldMX1dpZGdldEltcCoJR2V0Um9vdE91dGVyKCk7DQorICAgIENGV0xfV2lkZ2V0SW1wKglHZXRTYW1lQW5jZXN0b3IoQ0ZXTF9XaWRnZXRJbXAgKnBXaWRnZXQpOw0KKyAgICBDRlhfU2l6ZUYJR2V0T2Zmc2V0RnJvbUFuY2VzdG9yKENGV0xfV2lkZ2V0SW1wICpwQW5jZXN0b3IpOw0KKyAgICBGWF9CT09MCQlUcmFuc2Zvcm1Ub091dGVyKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCisgICAgRlhfQk9PTAkJVHJhbnNmb3JtRnJvbU91dGVyKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCisgICAgQ0ZYX1NpemVGCUNhbGNUZXh0U2l6ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRlhfQk9PTCBiTXVsdGlMaW5lID0gRkFMU0UsIEZYX0lOVDMyIGlMaW5lV2lkdGggPSAtMSk7DQorICAgIHZvaWQJCUNhbGNUZXh0UmVjdChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRlhfRFdPUkQgZHdUVE9TdHlsZXMsIEZYX0lOVDMyIGlUVE9BbGlnbiwgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgdm9pZAkJU2V0Rm9jdXMoRlhfQk9PTCBiRm9jdXMpOw0KKyAgICB2b2lkCQlTZXRHcmFiKEZYX0JPT0wgYlNldCk7DQorICAgIEZYX0JPT0wJCUdldFBvcHVwUG9zKEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCk7DQorICAgIEZYX0JPT0wJCUdldFBvcHVwUG9zTWVudShGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KKyAgICBGWF9CT09MCQlHZXRQb3B1cFBvc0NvbWJvQm94KEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCk7DQorICAgIEZYX0JPT0wJCUdldFBvcHVwUG9zR2VuZXJhbChGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KKyAgICBGWF9CT09MCQlHZXRTY3JlZW5TaXplKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCisgICAgdm9pZAkJUmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcEV2ZW50U291cmNlID0gTlVMTCwgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KKyAgICB2b2lkCQlVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCisgICAgdm9pZAkJRGlzcGF0Y2hLZXlFdmVudChDRldMX01zZ0tleSAqcE5vdGUpOw0KKyAgICB2b2lkCQlEaXNwYXRjaEV2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQorICAgIHZvaWQJCVJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCA9IE5VTEwpOw0KKyAgICB2b2lkCQlEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfSU5UMzIgaVBhcnRCaywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgICAgdm9pZAkJRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfSU5UMzIgaVBhcnRCb3JkZXIsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJCURyYXdFZGdlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9JTlQzMiBpUGFydEVkZ2UsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICAgIHZvaWQJCU5vdGlmeURyaXZlcigpOw0KKw0KKyAgICBGWF9CT09MCQlJc1BhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCk7DQorICAgIENGV0xfV2lkZ2V0TWdyCQkJICAgKm1fcFdpZGdldE1ncjsNCisgICAgQ0ZXTF9Ob3RlVGhyZWFkCQkJICAgKm1fcE93bmVyVGhyZWFkOw0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgICAqbV9wUHJvcGVydGllczsNCisgICAgQ0ZYX1ByaXZhdGVEYXRhCQkJICAgKm1fcFByaXZhdGVEYXRhOw0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlCQkgICAqbV9wRGVsZWdhdGU7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUJCSAgICptX3BDdXJEZWxlZ2F0ZTsNCisgICAgSUZXTF9XaWRnZXQJCQkgICAgICAgKm1fcE91dGVyOw0KKyAgICBJRldMX1dpZGdldAkJCQkgICAqbV9wSW50ZXJmYWNlOw0KKyAgICBGWF9JTlQzMgkJCQkJbV9pTG9jazsNCisgICAgZnJpZW5kIGNsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorICAgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0ICp3aWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQorICAgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRTdGF0ZXMoSUZXTF9XaWRnZXQgKndpZGdldCwgRlhfRFdPUkQgZHdTdGF0ZXMpOw0KKyAgICBmcmllbmQgdm9pZCBGV0xfU2V0V2lkZ2V0U3R5bGVzKElGV0xfV2lkZ2V0ICp3aWRnZXQsIEZYX0RXT1JEIGR3U3R5bGVzKTsNCit9Ow0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWZiNjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaApAQCAtMCwwICsxLDE0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfV0lER0VUTUdSX0lNUF9IDQorI2RlZmluZSBfRldMX1dJREdFVE1HUl9JTVBfSA0KK2NsYXNzIENGV0xfVGFyZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfQWRhcHRlcldpZGdldE1ncjsNCitjbGFzcyBDRldMX1dpZGdldE1nckl0ZW07DQorY2xhc3MgQ0ZXTF9XaWRnZXRNZ3I7DQorY2xhc3MgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX0FkYXB0ZXJOYXRpdmU7DQorY2xhc3MgQ0ZXTF9XaWRnZXRNZ3JJdGVtIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0oKQ0KKyAgICAgICAgOiBwUGFyZW50KE5VTEwpDQorICAgICAgICAsIHBPd25lcihOVUxMKQ0KKyAgICAgICAgLCBwQ2hpbGQoTlVMTCkNCisgICAgICAgICwgcFByZXZpb3VzKE5VTEwpDQorICAgICAgICAsIHBOZXh0KE5VTEwpDQorICAgICAgICAsIHBXaWRnZXQoTlVMTCkNCisgICAgICAgICwgcE9mZnNjcmVlbihOVUxMKQ0KKyAgICAgICAgLCBpUmVkcmF3Q291bnRlcigwKQ0KKyNpZiAoX0ZYX09TXz09X0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXz09X0ZYX1dJTjY0XykNCisgICAgICAgICwgYk91dHNpZGVDaGFuZ2VkKEZBTFNFKQ0KKyNlbmRpZg0KKyAgICB7DQorICAgIH0NCisgICAgfkNGV0xfV2lkZ2V0TWdySXRlbSgpDQorICAgIHsNCisgICAgICAgIGlmIChwT2Zmc2NyZWVuKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBPZmZzY3JlZW47DQorICAgICAgICAgICAgcE9mZnNjcmVlbiA9IE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtCSpwUGFyZW50Ow0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0JKnBPd25lcjsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtCSpwQ2hpbGQ7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbQkqcFByZXZpb3VzOw0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0JKnBOZXh0Ow0KKyAgICBJRldMX1dpZGdldAkJCSpwV2lkZ2V0Ow0KKyAgICBDRlhfR3JhcGhpY3MJCSpwT2Zmc2NyZWVuOw0KKyAgICBGWF9JTlQzMgkJCWlSZWRyYXdDb3VudGVyOw0KKyNpZiAoX0ZYX09TXz09X0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXz09X0ZYX1dJTjY0XykNCisgICAgRlhfQk9PTAkJCQliT3V0c2lkZUNoYW5nZWQ7DQorI2VuZGlmDQorfTsNCitjbGFzcyBDRldMX1dpZGdldE1nciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZXTF9XaWRnZXRNZ3IoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlck5hdGl2ZSk7DQorICAgIH5DRldMX1dpZGdldE1ncigpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlDb3VudFdpZGdldHMoSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRldMX1dpZGdldCoJR2V0V2lkZ2V0KEZYX0lOVDMyIG5JbmRleCwgSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBOVUxMKTsNCisgICAgdmlydHVhbCBJRldMX1dpZGdldCoJR2V0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfV0dUUkVMQVRJT04gZVJlbGF0aW9uKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgbkluZGV4KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNXaWRnZXQoRlhfTFBWT0lEIHBPYmopOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQlSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENhcGFiaWxpdHkoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd0NhcGFiaWxpdHk7DQorICAgIH0NCisgICAgdm9pZAkJCUFkZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZvaWQJCQlJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBQYXJlbnQsIElGV0xfV2lkZ2V0ICpwQ2hpbGQsIEZYX0lOVDMyIG5JbmRleCA9IC0xKTsNCisgICAgdm9pZAkJCVJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZvaWQJCQlTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyLCBJRldMX1dpZGdldCAqcE93bmVkKTsNCisgICAgdm9pZAkJCVNldFBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCwgSUZXTF9XaWRnZXQgKnBDaGlsZCk7DQorICAgIEZYX0JPT0wJCQlJc0NoaWxkKElGV0xfV2lkZ2V0ICpwQ2hpbGQsIElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCisgICAgRldMX0VSUgkJCUNyZWF0ZVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBGV0xfRVJSCQkJRGVzdHJveVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBGV0xfRVJSCQkJR2V0V2lkZ2V0UmVjdF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQorICAgIEZXTF9FUlIJCQlTZXRXaWRnZXRSZWN0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCisgICAgRldMX0VSUgkJCVNldFdpZGdldFBvc2l0aW9uX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgRldMX0VSUgkJCVNldFdpZGdldEljb25fTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpOw0KKyAgICBGV0xfRVJSCQkJU2V0V2lkZ2V0Q2FwdGlvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX1dTVFIgd3NDYXB0aW9uKTsNCisgICAgRldMX0VSUgkJCVNldEJvcmRlclJlZ2lvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9QYXRoICpwUGF0aCk7DQorICAgIEZXTF9FUlIJCQlTaG93V2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIEZXTF9FUlIJCQlIaWRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIEZXTF9FUlIJCQlTZXROb3JtYWxfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgRldMX0VSUgkJCVNldE1heGltaXplX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIEZXTF9FUlIJCQlTZXRNaW5pbWl6ZV9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBGWF9CT09MCQkJQ2hlY2tNZXNzYWdlX05hdGl2ZSgpOw0KKyAgICBGV0xfRVJSCQkJRGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpOw0KKyAgICBGWF9CT09MCQkJSXNJZGxlTWVzc2FnZV9OYXRpdmUoKTsNCisgICAgRldMX0VSUgkJCUV4aXRfTmF0aXZlKEZYX0lOVDMyIGlFeGl0Q29kZSk7DQorICAgIEZXTF9FUlIJCQlDcmVhdGVXaWRnZXRXaXRoTmF0aXZlSWRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCB2b2lkICp2cCk7DQorICAgIElGV0xfV2lkZ2V0KglHZXRXaWRnZXRBdFBvaW50KElGV0xfV2lkZ2V0ICpwUGFyZW50LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQkJTm90aWZ5U2l6ZUNoYW5nZWQoSUZXTF9XaWRnZXQgKnBGb3JtLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICBJRldMX1dpZGdldCoJbmV4dFRhYihJRldMX1dpZGdldCAqcGFyZW50LCBJRldMX1dpZGdldCAqZm9jdXMsIEZYX0JPT0wgJmJGaW5kKTsNCisgICAgRlhfSU5UMzIJCUNvdW50UmFkaW9CdXR0b25Hcm91cChJRldMX1dpZGdldCAqcEZpcnN0KTsNCisgICAgSUZXTF9XaWRnZXQqCUdldFNpYmxpbmdSYWRpb0J1dHRvbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiTmV4dCk7DQorICAgIElGV0xfV2lkZ2V0KglHZXRSYWRpb0J1dHRvbkdyb3VwSGVhZGVyKElGV0xfV2lkZ2V0ICpwUmFkaW9CdXR0b24pOw0KKyAgICB2b2lkCQkJR2V0U2FtZUdyb3VwUmFkaW9CdXR0b24oSUZXTF9XaWRnZXQgKnBSYWRpb0J1dHRvbiwgQ0ZYX1B0ckFycmF5ICZncm91cCk7DQorICAgIElGV0xfV2lkZ2V0KiAgICBHZXREZWZhdWx0QnV0dG9uKElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCisgICAgdm9pZAkJCUFkZFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZvaWQJCQlSZXNldFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIElGV0xfQWRhcHRlcldpZGdldE1ncioJR2V0QWRhcHRlcldpZGdldE1ncigpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BBZGFwdGVyOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIEdldERlbGVnYXRlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcERlbGVnYXRlOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSoJCUdldFdpZGdldE1nckl0ZW0oSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBGWF9CT09MCQkJCQlJc1RocmVhZEVuYWJsZWQoKTsNCisgICAgRlhfQk9PTAkJCQkJSXNGb3JtRGlzYWJsZWQoKTsNCisgICAgRlhfQk9PTAkJCUdldEFkYXB0ZXJQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0lOVDMyCQkJCVRyYXZlbFdpZGdldE1ncihDRldMX1dpZGdldE1nckl0ZW0gKnBQYXJlbnQsIEZYX0lOVDMyICpwSW5kZXgsIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0sIElGV0xfV2lkZ2V0ICoqcFdpZGdldCA9IE5VTEwpOw0KKyAgICBGWF9CT09MCQkJCQlJc0FibGVOYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQltX21hcFdpZGdldEl0ZW07DQorICAgIElGV0xfQWRhcHRlcldpZGdldE1nciAgKm1fcEFkYXB0ZXI7DQorICAgIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUgKm1fcERlbGVnYXRlOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTsNCisgICAgRlhfRFdPUkQJCQkJbV9kd0NhcGFiaWxpdHk7DQorI2lmIChfRlhfT1NfPT1fRlhfV0lOMzJfREVTS1RPUF8pIHx8IChfRlhfT1NfPT1fRlhfV0lONjRfKQ0KKyAgICBDRlhfUmVjdEYJCQkJbV9ydFNjcmVlbjsNCisjZW5kaWYNCit9Ow0KK2NsYXNzIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUoQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uU2V0Q2FwYWJpbGl0eShGWF9EV09SRCBkd0NhcGFiaWxpdHkgPSBGV0xfV0dUTUdSX0Rpc2FibGVUaHJlYWQpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwJRldMX0VSUgkJT25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlEcmF3Q2hpbGQoSUZXTF9XaWRnZXQgKnBQYXJlbnQsIGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwLCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApOw0KKyAgICBDRlhfR3JhcGhpY3MqIERyYXdXaWRnZXRCZWZvcmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCisgICAgdm9pZAlEcmF3V2lkZ2V0QWZ0ZXIoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBDRlhfUmVjdEYgJnJ0Q2xpcCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorICAgIEZYX0JPT0wgSXNOZWVkUmVwYWludChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgY29uc3QgQ0ZYX1JlY3RGICZydERpcnR5KTsNCisgICAgRlhfQk9PTCBiVXNlT2Zmc2NyZWVuRGlyZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisNCisgICAgQ0ZXTF9XaWRnZXRNZ3IgKm1fcFdpZGdldE1ncjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9hcHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2FwcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5YjZjOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9hcHAuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorQ0ZXTF9BcHA6OkNGV0xfQXBwKCkNCisgICAgOiBtX3BBcHBJbXAoTlVMTCkNCisgICAgLCBtX3BUaGVtZVByb3ZpZGVyKE5VTEwpDQorew0KKyAgICBtX3BBcHBJbXAgPSBJRldMX0FwcDo6Q3JlYXRlKE5VTEwpOw0KK30NCitDRldMX0FwcDo6fkNGV0xfQXBwKCkNCit7DQorICAgIGlmIChtX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgICBtX3BUaGVtZVByb3ZpZGVyLT5GaW5hbGl6ZSgpOw0KKyAgICAgICAgZGVsZXRlIG1fcFRoZW1lUHJvdmlkZXI7DQorICAgICAgICBtX3BUaGVtZVByb3ZpZGVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX3BBcHBJbXAtPlJlbGVhc2UoKTsNCit9DQorRldMX0VSUiBDRldMX0FwcDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBtX3BUaGVtZVByb3ZpZGVyID0gRlhfTkVXIENGV0xfVGhlbWU7DQorICAgIG1fcFRoZW1lUHJvdmlkZXItPkluaXRpYWxpemUoKTsNCisgICAgbV9wQXBwSW1wLT5TZXRUaGVtZVByb3ZpZGVyKChJRldMX1RoZW1lUHJvdmlkZXIqKW1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICByZXR1cm4gbV9wQXBwSW1wLT5Jbml0aWFsaXplKCk7DQorfQ0KK0NGV0xfVGhlbWUqCUNGV0xfQXBwOjpHZXRUaGVtZSgpDQorew0KKyAgICByZXR1cm4gbV9wVGhlbWVQcm92aWRlcjsNCit9DQorRldMX0VSUglDRldMX0FwcDo6RXhpdChGWF9JTlQzMiBpRXhpdENvZGUgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BBcHBJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBtX3BBcHBJbXAtPkV4aXQoaUV4aXRDb2RlKTsNCit9DQorSUZXTF9BcHAqIENGV0xfQXBwOjpHZXRBcHAoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEFwcEltcDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzcwYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYmFyY29kZS5jcHAKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX0JhcmNvZGUqIENGV0xfQmFyY29kZTo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ0ZXTF9CYXJjb2RlOw0KK30NCitGV0xfRVJSCUNGV0xfQmFyY29kZTo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9iYXJjb2RlRGF0YTsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KKyAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICAgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBtX3BJbXAgPSBJRldMX0JhcmNvZGU6OkNyZWF0ZSgpOw0KKyAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0NGV0xfQmFyY29kZTo6Q0ZXTF9CYXJjb2RlKCkNCit7DQorfQ0KK0NGV0xfQmFyY29kZTo6fkNGV0xfQmFyY29kZSgpDQorew0KK30NCit2b2lkIENGV0xfQmFyY29kZTo6U2V0VHlwZShCQ19UWVBFIHR5cGUpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEltcCk7DQorICAgICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5TZXRUeXBlKHR5cGUpOw0KK30NCitGWF9CT09MCUNGV0xfQmFyY29kZTo6SXNQcm90ZWN0ZWRUeXBlKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5Jc1Byb3RlY3RlZFR5cGUoKTsNCit9DQorRldMX0VSUiBDRldMX0JhcmNvZGU6OkNGV0xfQmFyY29kZURQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2FyZXQuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NhcmV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNlNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NhcmV0LmNwcApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KK0NGV0xfQ2FyZXQqIENGV0xfQ2FyZXQ6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfQ2FyZXQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DYXJldDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KKyAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICAgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBtX3BJbXAgPSBJRldMX0NhcmV0OjpDcmVhdGUoKTsNCisgICAgRldMX0VSUiByZXQgPSAoKElGV0xfQ2FyZXQqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQorICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICAgIH0NCisgICAgcmV0dXJuIHJldDsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0OjpTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZykNCit7DQorICAgIHJldHVybiAoKElGV0xfQ2FyZXQqKW1fcEltcCktPlNob3dDYXJldChiRmxhZyk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldDo6R2V0RnJlcXVlbmN5KEZYX0RXT1JEICZlbGFwc2UpDQorew0KKyAgICByZXR1cm4gKChJRldMX0NhcmV0KiltX3BJbXApLT5HZXRGcmVxdWVuY3koZWxhcHNlKTsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0OjpTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9DYXJldCopbV9wSW1wKS0+U2V0RnJlcXVlbmN5KGVsYXBzZSk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9DYXJldDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkNCit7DQorICAgIHJldHVybiAoKElGV0xfQ2FyZXQqKW1fcEltcCktPlNldENvbG9yKGNyRmlsbCk7DQorfQ0KK0NGV0xfQ2FyZXQ6OkNGV0xfQ2FyZXQoKQ0KK3sNCit9DQorQ0ZXTF9DYXJldDo6fkNGV0xfQ2FyZXQoKQ0KK3sNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jaGVja2JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2NTlmZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jaGVja2JveC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX0NoZWNrQm94KiBDRldMX0NoZWNrQm94OjpDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDRldMX0NoZWNrQm94Ow0KK30NCitGV0xfRVJSCUNGV0xfQ2hlY2tCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fY2hlY2tib3hEYXRhOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgICB9DQorICAgIG1fcEltcCA9IElGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpOw0KKyAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9DaGVja0JveCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgICAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICAgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3g6OlNldENhcHRpb24oRlhfV1NUUiB3c0NhcHRpb24pDQorew0KKyAgICBtX2NoZWNrYm94RGF0YS5tX3dzQ2FwdGlvbiA9IHdzQ2FwdGlvbjsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3g6OlNldEJveFNpemUoRlhfRkxPQVQgZkhlaWdodCkNCit7DQorICAgIG1fY2hlY2tib3hEYXRhLm1fZkJveEhlaWdodCA9IGZIZWlnaHQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9DaGVja0JveDo6R2V0Q2hlY2tTdGF0ZSgpDQorew0KKyAgICByZXR1cm4gKChJRldMX0NoZWNrQm94KiltX3BJbXApLT5HZXRDaGVja1N0YXRlKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveDo6U2V0Q2hlY2tTdGF0ZShGWF9JTlQzMiBpQ2hlY2spDQorew0KKyAgICByZXR1cm4gKChJRldMX0NoZWNrQm94KiltX3BJbXApLT5TZXRDaGVja1N0YXRlKGlDaGVjayk7DQorfQ0KK0NGV0xfQ2hlY2tCb3g6OkNGV0xfQ2hlY2tCb3goKQ0KK3sNCit9DQorQ0ZXTF9DaGVja0JveDo6fkNGV0xfQ2hlY2tCb3goKQ0KK3sNCit9DQorQ0ZXTF9DaGVja0JveDo6Q0ZXTF9DaGVja0JveERQOjpDRldMX0NoZWNrQm94RFAoKQ0KKyAgICA6IG1fZkJveEhlaWdodCgxNi4wZikNCisgICAgLCBtX3dzQ2FwdGlvbihMIkNoZWNrIGJveCIpDQorew0KK30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3g6OkNGV0xfQ2hlY2tCb3hEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbikNCit7DQorICAgIHdzQ2FwdGlvbiA9IG1fd3NDYXB0aW9uOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfQ2hlY2tCb3g6OkNGV0xfQ2hlY2tCb3hEUDo6R2V0Qm94U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX2ZCb3hIZWlnaHQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jb21ib2JveC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY29tYm9ib3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2RjMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY29tYm9ib3guY3BwCkBAIC0wLDAgKzEsMzYxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KK0NGV0xfQ29tYm9Cb3gqIENGV0xfQ29tYm9Cb3g6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfQ29tYm9Cb3g7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Db21ib0JveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9jb21ib0JveERhdGE7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgbV9wSW1wID0gSUZXTF9Db21ib0JveDo6Q3JlYXRlKCk7DQorICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Cb3g6OkFkZFN0cmluZyhGWF9XU1RSIHdzVGV4dCkNCit7DQorICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IEZYX05FVyBDRldMX0NvbWJvQm94SXRlbTsNCisgICAgcEl0ZW0tPm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgICBwSXRlbS0+bV9kd1N0eWxlcyA9IDA7DQorICAgIHJldHVybiBtX2NvbWJvQm94RGF0YS5tX2Fyckl0ZW0uQWRkKHBJdGVtKTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0JveDo6QWRkU3RyaW5nKEZYX1dTVFIgd3NUZXh0LCBDRlhfRElCaXRtYXAgKnBJY29uKQ0KK3sNCisgICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gRlhfTkVXIENGV0xfQ29tYm9Cb3hJdGVtOw0KKyAgICBwSXRlbS0+bV93c1RleHQgPSB3c1RleHQ7DQorICAgIHBJdGVtLT5tX2R3U3R5bGVzID0gMDsNCisgICAgcEl0ZW0tPm1fcERJQiA9IHBJY29uOw0KKyAgICByZXR1cm4gbV9jb21ib0JveERhdGEubV9hcnJJdGVtLkFkZChwSXRlbSk7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Cb3g6OlJlbW92ZUF0KEZYX0lOVDMyIGlJbmRleCkNCit7DQorICAgIHJldHVybiBtX2NvbWJvQm94RGF0YS5tX2Fyckl0ZW0uUmVtb3ZlQXQoaUluZGV4KTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0JveDo6UmVtb3ZlQWxsKCkNCit7DQorICAgIG1fY29tYm9Cb3hEYXRhLm1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Cb3g6OkNvdW50SXRlbXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fY29tYm9Cb3hEYXRhLkNvdW50SXRlbXMoR2V0V2lkZ2V0KCkpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkdldFRleHRCeUluZGV4KEZYX0lOVDMyIGlJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCit7DQorICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopKG1fY29tYm9Cb3hEYXRhLkdldEl0ZW0oKElGV0xfV2lkZ2V0ICopdGhpcywgaUluZGV4KSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHdzVGV4dCA9IHBJdGVtLT5tX3dzVGV4dDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvQm94OjpHZXRDdXJTZWwoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0Q3VyU2VsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6U2V0Q3VyU2VsKEZYX0lOVDMyIGlTZWwpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+U2V0Q3VyU2VsKGlTZWwpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KEZYX1dTVFIgd3NUZXh0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorfQ0KK0ZYX0lOVDMyIENGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdFRleHRMZW5ndGgoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCkgY29uc3QNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRFZGl0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRFZGl0U2VsUmFuZ2UoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+U2V0RWRpdFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdFNlbFJhbmdlKEZYX0lOVDMyIG5JbmRleCwgRlhfSU5UMzIgJm5TdGFydCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdExpbWl0KCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdExpbWl0KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6U2V0RWRpdExpbWl0KEZYX0lOVDMyIG5MaW1pdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5TZXRFZGl0TGltaXQobkxpbWl0KTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpFZGl0RG9DbGlwYm9hcmQoRlhfSU5UMzIgaUNtZCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0RG9DbGlwYm9hcmQoaUNtZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFJlZG8oRlhfQlNUUiBic1JlY29yZCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0VW5kbyhGWF9CU1RSIGJzUmVjb3JkKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdFVuZG8oYnNSZWNvcmQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldE1heExpc3RIZWlnaHQoRlhfRkxPQVQgZk1heEhlaWdodCkNCit7DQorICAgIG1fY29tYm9Cb3hEYXRhLm1fZk1heExpc3RIZWlnaHQgPSBmTWF4SGVpZ2h0Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Db21ib0JveDo6U2V0SXRlbURhdGEoRlhfSU5UMzIgaUluZGV4LCBGWF9MUFZPSUQgcERhdGEpDQorew0KKyAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKShtX2NvbWJvQm94RGF0YS5HZXRJdGVtKChJRldMX1dpZGdldCAqKXRoaXMsIGlJbmRleCkpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBwSXRlbS0+bV9wRGF0YSA9IHBEYXRhOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0xQVk9JRCBDRldMX0NvbWJvQm94OjpHZXRJdGVtRGF0YShGWF9JTlQzMiBpSW5kZXgpDQorew0KKyAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKShtX2NvbWJvQm94RGF0YS5HZXRJdGVtKChJRldMX1dpZGdldCAqKXRoaXMsIGlJbmRleCkpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCBOVUxMKTsNCisgICAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldExpc3RUaGVtZShJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSkNCit7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkdldExpc3RCb3h0KCktPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCkNCit7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+T3BlbkRyb3BEb3duTGlzdChiQWN0aXZhdGUpOw0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3g6OkVkaXRDYW5VbmRvKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveDo6RWRpdENhblJlZG8oKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhblJlZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0VW5kbygpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0VW5kbygpOw0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3g6OkVkaXRSZWRvKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRSZWRvKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Db21ib0JveDo6RWRpdENhbkNvcHkoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhbkNvcHkoKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q2FuQ3V0KCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDYW5DdXQoKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q2FuU2VsZWN0QWxsKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDdXQod3NDdXQpOw0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3g6OkVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0U2VsZWN0QWxsKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRTZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0RGVsZXRlKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXREZWxldGUoKTsNCit9DQorRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0RGVTZWxlY3QoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdERlU2VsZWN0KCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Db21ib0JveDo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRCQm94KHJlY3QpOw0KK30NCitGV0xfRVJSIAlDRldMX0NvbWJvQm94OjpFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0NGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3goKQ0KK3sNCit9DQorQ0ZXTF9Db21ib0JveDo6fkNGV0xfQ29tYm9Cb3goKQ0KK3sNCit9DQorQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpDRldMX0NvbWJvQm94RFAoKQ0KK3sNCisgICAgbV9mSXRlbUhlaWdodCA9IDA7DQorICAgIG1fZk1heExpc3RIZWlnaHQgPSAwOw0KK30NCitDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6On5DRldMX0NvbWJvQm94RFAoKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9hcnJJdGVtLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiltX2Fyckl0ZW1baV07DQorICAgICAgICBpZiAocEl0ZW0pIHsNCisgICAgICAgICAgICBkZWxldGUgcEl0ZW07DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9hcnJJdGVtLlJlbW92ZUFsbCgpOw0KK30NCitGWF9JTlQzMiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkNvdW50SXRlbXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9hcnJJdGVtLkdldFNpemUoKTsNCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW0oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fYXJySXRlbS5HZXRTaXplKCk7DQorICAgIGlmIChuSW5kZXggPj0gaUNvdW50IHx8IG5JbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiAoRldMX0hMSVNUSVRFTSltX2Fyckl0ZW1bbkluZGV4XTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICByZXR1cm4gbV9hcnJJdGVtLkZpbmQoaEl0ZW0pOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICByZXR1cm4gbV9hcnJJdGVtLlNldEF0KG5JbmRleCwgaEl0ZW0pOw0KK30NCitGWF9EV09SRCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCAwKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtKS0+bV9kd1N0eWxlczsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgd3NUZXh0ID0gKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX3dzVGV4dDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiYgcnRJdGVtKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbTsNCisgICAgcnRJdGVtLlNldChwSXRlbS0+bV9ydEl0ZW0ubGVmdCwNCisgICAgICAgICAgICAgICBwSXRlbS0+bV9ydEl0ZW0udG9wLA0KKyAgICAgICAgICAgICAgIHBJdGVtLT5tX3J0SXRlbS53aWR0aCwNCisgICAgICAgICAgICAgICBwSXRlbS0+bV9ydEl0ZW0uaGVpZ2h0KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9MUFZPSUQgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIE5VTEwpOw0KKyAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtOw0KKyAgICByZXR1cm4gcEl0ZW0tPm1fcERhdGE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd1N0eWxlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX2R3U3R5bGVzID0gZHdTdHlsZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0xQQ1dTVFIgcHN6VGV4dCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgICgoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtKS0+bV93c1RleHQgPSBwc3pUZXh0Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpTZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAoKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbSktPm1fcnRJdGVtID0gcnRJdGVtOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX2ZJdGVtSGVpZ2h0Ow0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtKS0+bV9wRElCOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGJiBydENoZWNrKQ0KK3sNCisgICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbTsNCisgICAgcnRDaGVjayA9IHBJdGVtLT5tX3J0Q2hlY2tCb3g7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OlNldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiYgcnRDaGVjaykNCit7DQorICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICAgIHBJdGVtLT5tX3J0Q2hlY2tCb3ggPSBydENoZWNrOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtOw0KKyAgICByZXR1cm4gcEl0ZW0tPm1fZHdDaGVja1N0YXRlOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSkNCit7DQorICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICAgIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZSA9IGR3Q2hlY2tTdGF0ZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9mTWF4TGlzdEhlaWdodDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMTRjNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorQ0ZXTF9EYXRlVGltZVBpY2tlciogQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ0ZXTF9EYXRlVGltZVBpY2tlcjsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgICBwcm9wLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KKyAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgICBwcm9wLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX0RhdGVUaW1lUGlja2VyRFA7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgbV9wSW1wID0gSUZXTF9EYXRlVGltZVBpY2tlcjo6Q3JlYXRlKCk7DQorICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6U2V0VG9kYXkoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkNCit7DQorICAgIG1fRGF0ZVRpbWVQaWNrZXJEUC5tX2lZZWFyID0gaVllYXI7DQorICAgIG1fRGF0ZVRpbWVQaWNrZXJEUC5tX2lNb250aCA9IGlNb250aDsNCisgICAgbV9EYXRlVGltZVBpY2tlckRQLm1faURheSA9IGlEYXk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q291bnRTZWxSYW5nZXMoKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q291bnRTZWxSYW5nZXMoKTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGV0xfRVJSCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRFZGl0VGV4dCh3c1RleHQpOw0KK30NCitGV0xfRVJSCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRUZXh0KEZYX1dTVFIgd3NUZXh0KQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCit9DQorRldMX0VSUglDRldMX0RhdGVUaW1lUGlja2VyOjpHZXRDdXJTZWwoRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkdldEN1clNlbChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCit9DQorRldMX0VSUglDRldMX0RhdGVUaW1lUGlja2VyOjpTZXRDdXJTZWwoRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlNldEN1clNlbChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCit9DQorQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q0ZXTF9EYXRlVGltZVBpY2tlcigpDQorew0KK30NCitDRldMX0RhdGVUaW1lUGlja2VyOjp+Q0ZXTF9EYXRlVGltZVBpY2tlcigpDQorew0KK30NCitDRldMX0RhdGVUaW1lUGlja2VyOjpDRldMX0RhdGVUaW1lUGlja2VyRFA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUCgpDQorew0KKyAgICBtX2lZZWFyID0gMjAxMTsNCisgICAgbV9pTW9udGggPSAxOw0KKyAgICBtX2lEYXkgPSAxOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbikNCit7DQorICAgIHdzQ2FwdGlvbiA9IG1fd3NEYXRhOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q0ZXTF9EYXRlVGltZVBpY2tlckRQOjpHZXRUb2RheShJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSkNCit7DQorICAgIGlZZWFyID0gbV9pWWVhcjsNCisgICAgaU1vbnRoID0gbV9pTW9udGg7DQorICAgIGlEYXkgPSBtX2lEYXk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpDYW5VbmRvKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpDYW5SZWRvKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpVbmRvKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlVuZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpSZWRvKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlJlZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpDYW5Db3B5KCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhbkNvcHkoKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpDYW5DdXQoKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuU2VsZWN0QWxsKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q29weSh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpDQorew0KKyAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpTZWxlY3RBbGwoKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+U2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6RGVsZXRlKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkRlbGV0ZSgpOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OkRlU2VsZWN0KCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkRlU2VsZWN0KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRCQm94KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRMaW1pdChGWF9JTlQzMiBuTGltaXQpDQorew0KKyAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5TZXRFZGl0TGltaXQobkxpbWl0KTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPk1vZGlmeUVkaXRTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2VkaXQuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2VkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4N2Y4M2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZWRpdC5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorQ0ZXTF9FZGl0KiBDRldMX0VkaXQ6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfRWRpdDsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgbV9wSW1wID0gSUZXTF9FZGl0OjpDcmVhdGUoKTsNCisgICAgRldMX0VSUiByZXQgPSAoKElGV0xfRWRpdCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgICAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICAgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0VGV4dCh3c1RleHQpOw0KK30NCitGWF9JTlQzMiBDRldMX0VkaXQ6OkdldFRleHRMZW5ndGgoKSBjb25zdA0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldFRleHRMZW5ndGgoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQpIGNvbnN0DQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6Q2xlYXJUZXh0KCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNsZWFyVGV4dCgpOw0KK30NCitGWF9JTlQzMiBDRldMX0VkaXQ6OkdldENhcmV0UG9zKCkgY29uc3QNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAtMSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+R2V0Q2FyZXRQb3MoKTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9FZGl0OjpTZXRDYXJldFBvcyhGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAtMSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkFkZFNlbFJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgICgoSUZXTF9FZGl0KiltX3BJbXApLT5BZGRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorICAgIEZYX0lOVDMyIHBvcyA9IDA7DQorICAgIEZYX0lOVDMyIHN1bSA9ICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRUZXh0TGVuZ3RoKCk7DQorICAgIGlmIChuQ291bnQgPT0gLTEpIHsNCisgICAgICAgIHBvcyA9IHN1bTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBvcyA9IG5TdGFydCArIG5Db3VudDsNCisgICAgfQ0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldENhcmV0UG9zKHBvcyk7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdDo6Q291bnRTZWxSYW5nZXMoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNvdW50U2VsUmFuZ2VzKCk7DQorfQ0KK0ZYX0lOVDMyIENGV0xfRWRpdDo6R2V0U2VsUmFuZ2UoRlhfSU5UMzIgbkluZGV4LCBGWF9JTlQzMiAmblN0YXJ0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkNsZWFyU2VsZWN0aW9ucygpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5DbGVhclNlbGVjdGlvbnMoKTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9FZGl0OjpHZXRMaW1pdCgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgLTEpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldExpbWl0KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRMaW1pdChGWF9JTlQzMiBuTGltaXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldEFsaWFzQ2hhcih3QWxpYXMpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldEZvcm1hdFN0cmluZyh3c0Zvcm1hdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpJbnNlcnQoRlhfSU5UMzIgblN0YXJ0LCBGWF9MUENXU1RSIGxwVGV4dCwgRlhfSU5UMzIgbkxlbikNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbik7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpEZWxldGVTZWxlY3Rpb25zKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkRlbGV0ZVNlbGVjdGlvbnMoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkRlbGV0ZVJhbmdlKEZYX0lOVDMyIG5TdGFydCwgRlhfSU5UMzIgbkNvdW50KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+RGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6UmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5SZXBsYWNlU2VsZWN0aW9ucyh3c1JlcGxhY2UpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6UmVwbGFjZShGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5MZW4sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZXBsYWNlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+UmVwbGFjZShuU3RhcnQsIG5MZW4sIHdzUmVwbGFjZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpEb0NsaXBib2FyZChGWF9JTlQzMiBpQ21kKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+RG9DbGlwYm9hcmQoaUNtZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpSZWRvKEZYX0JTVFIgYnNSZWNvcmQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlJlZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdDo6VW5kbyhGWF9CU1RSIGJzUmVjb3JkKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5VbmRvKGJzUmVjb3JkKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRUYWJXaWR0aChmVGFiV2lkdGgsIGJFcXVpZGlzdGFudCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9FZGl0OjpTZXROdW1iZXJSYW5nZShGWF9JTlQzMiBpTWluLCBGWF9JTlQzMiBpTWF4KQ0KK3sNCisgICAgaWYgKGlNaW4gPiBpTWF4KSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgICAgfQ0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldE51bWJlclJhbmdlKGlNaW4sIGlNYXgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRCYWNrQ29sb3IoZHdDb2xvcik7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0Rm9udCh3c0ZvbnQsIGZTaXplKTsNCit9DQorRlhfQk9PTAlDRldMX0VkaXQ6OkNhblVuZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0OjpDYW5SZWRvKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MCUNGV0xfRWRpdDo6VW5kbygpDQorew0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlVuZG8oKTsNCit9DQorRlhfQk9PTAlDRldMX0VkaXQ6OlJlZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQorew0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTAlDRldMX0VkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQorew0KKyAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9FZGl0OjpEZWxldGUoKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5EZWxldGUoKTsNCit9DQordm9pZCBDRldMX0VkaXQ6OlNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRTdWdnZXN0V29yZHMocG9pbnRmLCBzU3VnZ2VzdCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsIEZYX0JTVFIgYnNSZXBsYWNlKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5SZXBsYWNlU3BlbGxDaGVja1dvcmQocG9pbnRmLCBic1JlcGxhY2UpOw0KK30NCitDRldMX0VkaXQ6OkNGV0xfRWRpdCgpDQorew0KK30NCitDRldMX0VkaXQ6On5DRldMX0VkaXQoKQ0KK3sNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2xpc3Rib3guY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2xpc3Rib3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYzM4NzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvbGlzdGJveC5jcHAKQEAgLTAsMCArMSwzMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorQ0ZXTF9MaXN0Qm94KiBDRldMX0xpc3RCb3g6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfTGlzdEJveDsNCit9DQorRldMX0VSUglDRldMX0xpc3RCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fTGlzdEJveERQOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgICB9DQorICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIG1fcEltcCA9IElGV0xfTGlzdEJveDo6Q3JlYXRlKCk7DQorICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQorICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICAgIH0NCisgICAgcmV0dXJuIHJldDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkFkZERJQml0bWFwKENGWF9ESUJpdG1hcCAqcERJQiwgRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgICgoQ0ZXTF9MaXN0SXRlbSopaEl0ZW0pLT5tX3BESUIgPSBwRElCOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpBZGRTdHJpbmcoRlhfV1NUUiB3c0FkZCwgRlhfQk9PTCBiU2VsZWN0KQ0KK3sNCisgICAgQ0ZXTF9MaXN0SXRlbSAqIHBJdGVtID0gRlhfTkVXIENGV0xfTGlzdEl0ZW07DQorICAgIHBJdGVtLT5tX2R3U3RhdGVzID0gMDsNCisgICAgcEl0ZW0tPm1fd3NUZXh0ID0gd3NBZGQ7DQorICAgIHBJdGVtLT5tX2R3U3RhdGVzID0gYlNlbGVjdCA/IEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkIDogMDsNCisgICAgbV9MaXN0Qm94RFAubV9hcnJJdGVtLkFkZChwSXRlbSk7DQorICAgIHJldHVybiAoRldMX0hMSVNUSVRFTSlwSXRlbTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3g6OkRlbGV0ZVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtKQ0KK3sNCisgICAgRlhfSU5UMzIgbkluZGV4ID0gbV9MaXN0Qm94RFAuR2V0SXRlbUluZGV4KEdldFdpZGdldCgpLCBoSXRlbSk7DQorICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uR2V0U2l6ZSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZXTF9MaXN0SXRlbSAqcERlbEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopbV9MaXN0Qm94RFAuR2V0SXRlbSgoSUZXTF9MaXN0Qm94Kil0aGlzLCBuSW5kZXgpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0xpc3RCb3hEUC5Db3VudEl0ZW1zKChJRldMX0xpc3RCb3gqKXRoaXMpOw0KKyAgICBGWF9JTlQzMiBpU2VsID0gbkluZGV4ICsgMTsNCisgICAgaWYgKGlTZWwgPj0gaUNvdW50KSB7DQorICAgICAgICBpU2VsID0gbkluZGV4IC0gMTsNCisgICAgICAgIGlmIChpU2VsIDwgMCkgew0KKyAgICAgICAgICAgIGlTZWwgPSAgLTE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlTZWwgPj0gMCkgew0KKyAgICAgICAgQ0ZXTF9MaXN0SXRlbSAqcFNlbCA9IChDRldMX0xpc3RJdGVtKiltX0xpc3RCb3hEUC5HZXRJdGVtKChJRldMX0xpc3RCb3gqKXRoaXMsIGlTZWwpOw0KKyAgICAgICAgcFNlbC0+bV9kd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZDsNCisgICAgfQ0KKyAgICBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uUmVtb3ZlQXQobkluZGV4KTsNCisgICAgZGVsZXRlIHBEZWxJdGVtOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX0xpc3RCb3g6OkRlbGV0ZUFsbCgpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0xpc3RCb3hEUC5Db3VudEl0ZW1zKChJRldMX0xpc3RCb3gqKXRoaXMpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiltX0xpc3RCb3hEUC5HZXRJdGVtKChJRldMX0xpc3RCb3gqKXRoaXMsIGkpOw0KKyAgICAgICAgZGVsZXRlIHBJdGVtOw0KKyAgICB9DQorICAgIG1fTGlzdEJveERQLm1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENGV0xfTGlzdEJveDo6Q291bnRTZWxJdGVtcygpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICAgIHJldHVybiAoKElGV0xfTGlzdEJveCopbV9wSW1wKS0+Q291bnRTZWxJdGVtcygpOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0U2VsSXRlbShGWF9JTlQzMiBuSW5kZXhTZWwpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQorICAgIHJldHVybiAoKElGV0xfTGlzdEJveCopbV9wSW1wKS0+R2V0U2VsSXRlbShuSW5kZXhTZWwpOw0KK30NCitGWF9JTlQzMiBDRldMX0xpc3RCb3g6OkdldFNlbEluZGV4KEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTZWxJbmRleChuSW5kZXgpOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5TZXRTZWxJdGVtKGhJdGVtLCBiU2VsZWN0KTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldFNjcm9sbFBvcyhGWF9GTE9BVCAmZlBvcywgRlhfQk9PTCBiVmVydCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkdldFNjcm9sbFBvcyhmUG9zLCBiVmVydCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpTZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZJdGVtSGVpZ2h0KQ0KK3sNCisgICAgbV9MaXN0Qm94RFAubV9mSXRlbUhlaWdodCA9IGZJdGVtSGVpZ2h0Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRGb2N1c0l0ZW0oKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ0ZXTF9MaXN0SXRlbSAqIGhJdGVtID0gKENGV0xfTGlzdEl0ZW0gKikobV9MaXN0Qm94RFAubV9hcnJJdGVtW2ldKTsNCisgICAgICAgIGlmIChoSXRlbS0+bV9kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgICAgICAgICByZXR1cm4gKEZXTF9ITElTVElURU0paEl0ZW07DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9MaXN0Qm94OjpTZXRGb2N1c0l0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IG1fTGlzdEJveERQLkdldEl0ZW1JbmRleChHZXRXaWRnZXQoKSwgaEl0ZW0pOw0KKyAgICAoKENGV0xfTGlzdEl0ZW0gKikobV9MaXN0Qm94RFAubV9hcnJJdGVtW25JbmRleF0pKS0+bV9kd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIqIENGV0xfTGlzdEJveDo6U29ydChJRldMX0xpc3RCb3hDb21wYXJlICpwQ29tKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5Tb3J0KHBDb20pOw0KK30NCitGWF9JTlQzMiBDRldMX0xpc3RCb3g6OkNvdW50SXRlbXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtKEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7DQorICAgIGlmIChuSW5kZXggPiBuQ291bnQgLSAxICYmIG5JbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiAoRldMX0hMSVNUSVRFTSltX0xpc3RCb3hEUC5tX2Fyckl0ZW1bbkluZGV4XTsNCit9DQorRldMX0VSUglDRldMX0xpc3RCb3g6OlNldEl0ZW1TdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfV1NUUiB3c1RleHQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcEl0ZW0tPm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgd3NUZXh0ID0gcEl0ZW0tPm1fd3NUZXh0Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9MaXN0Qm94OjpTZXRJdGVtRGF0YShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9MUFZPSUQgcERhdGEpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcEl0ZW0tPm1fcERhdGEgPSBwRGF0YTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9MUFZPSUQgQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtRGF0YShGV0xfSExJU1RJVEVNIGhJdGVtKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgTlVMTCk7DQorICAgIENGV0xfTGlzdEl0ZW0gKnBJdGVtID0gKENGV0xfTGlzdEl0ZW0qKWhJdGVtOw0KKyAgICByZXR1cm4gcEl0ZW0tPm1fcERhdGE7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICAgIG1fcEltcC0+R2V0Q2xpZW50UmVjdChydENsaWVudCk7DQorICAgIGZ4IC09IHJ0Q2xpZW50LmxlZnQ7DQorICAgIGZ5IC09IHJ0Q2xpZW50LnRvcDsNCisgICAgRlhfRkxPQVQgZlBvc1ggPSAwOw0KKyAgICBGWF9GTE9BVCBmUG9zWSA9IDA7DQorICAgICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTY3JvbGxQb3MoZngpOw0KKyAgICAoKElGV0xfTGlzdEJveCopbV9wSW1wKS0+R2V0U2Nyb2xsUG9zKGZ5LCBGQUxTRSk7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IG1fTGlzdEJveERQLkNvdW50SXRlbXMoTlVMTCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCisgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX0xpc3RCb3hEUC5HZXRJdGVtKE5VTEwsIGkpOw0KKyAgICAgICAgaWYgKCFoSXRlbSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgICAgIG1fTGlzdEJveERQLkdldEl0ZW1SZWN0KE5VTEwsIGhJdGVtLCBydEl0ZW0pOw0KKyAgICAgICAgcnRJdGVtLk9mZnNldCgtZlBvc1gsIC1mUG9zWSk7DQorICAgICAgICBpZiAocnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gaEl0ZW07DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0RXT1JEIENGV0xfTGlzdEJveDo6R2V0SXRlbVN0YXRlcyhGV0xfSExJU1RJVEVNIGhJdGVtKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgMCk7DQorICAgIENGV0xfTGlzdEl0ZW0gKnBJdGVtID0gKENGV0xfTGlzdEl0ZW0qKWhJdGVtOw0KKyAgICByZXR1cm4gcEl0ZW0tPm1fZHdTdGF0ZXMgfCBwSXRlbS0+bV9kd0NoZWNrU3RhdGU7DQorfQ0KK0NGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94KCkNCit7DQorfQ0KK0NGV0xfTGlzdEJveDo6fkNGV0xfTGlzdEJveCgpDQorew0KK30NCitDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpDRldMX0xpc3RCb3hEUCgpDQorew0KK30NCitDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjp+Q0ZXTF9MaXN0Qm94RFAoKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gbV9hcnJJdGVtLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KKyAgICAgICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopbV9hcnJJdGVtW2ldOw0KKyAgICAgICAgaWYgKHBJdGVtICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgcEl0ZW07DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9hcnJJdGVtLlJlbW92ZUFsbCgpOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQorew0KKyAgICB3c0NhcHRpb24gPSBtX3dzRGF0YTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9JTlQzMiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpDb3VudEl0ZW1zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fYXJySXRlbS5HZXRTaXplKCk7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbShJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgaWYgKG5JbmRleCA+PSBtX2Fyckl0ZW0uR2V0U2l6ZSgpIHx8IG5JbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIChGV0xfSExJU1RJVEVNKW1fYXJySXRlbVtuSW5kZXhdOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1JbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgIHJldHVybiBtX2Fyckl0ZW0uRmluZChoSXRlbSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICByZXR1cm4gbV9hcnJJdGVtLlNldEF0KG5JbmRleCwgaEl0ZW0pOw0KK30NCitGWF9EV09SRCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgLTEpOw0KKyAgICByZXR1cm4gKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fZHdTdGF0ZXM7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICB3c1RleHQgPSAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV93c1RleHQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGICZydEl0ZW0pDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcnRJdGVtID0gcEl0ZW0tPm1fcnRJdGVtOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0xQVk9JRCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIE5VTEwpOw0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OlNldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3U3R5bGUpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV9kd1N0YXRlcyA9IGR3U3R5bGU7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtVGV4dChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfTFBDV1NUUiBwc3pUZXh0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fd3NUZXh0ID0gcHN6VGV4dDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OlNldEl0ZW1SZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgICgoQ0ZXTF9MaXN0SXRlbSopaEl0ZW0pLT5tX3J0SXRlbSA9IHJ0SXRlbTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtSGVpZ2h0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fZkl0ZW1IZWlnaHQ7DQorfQ0KK0NGWF9ESUJpdG1hcCoJQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICByZXR1cm4gKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fcERJQjsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYmIHJ0Q2hlY2spDQorew0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcnRDaGVjayA9IHBJdGVtLT5tX3J0Q2hlY2tCb3g7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spDQorew0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcEl0ZW0tPm1fcnRDaGVja0JveCA9IHJ0Q2hlY2s7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQorew0KKyAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgICAgcmV0dXJuIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdDaGVja1N0YXRlKQ0KK3sNCisgICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQorICAgIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZSA9IGR3Q2hlY2tTdGF0ZTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMjFkZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9waWN0dXJlYm94LmNwcApAQCAtMCwwICsxLDE0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX1BpY3R1cmVCb3gqIENGV0xfUGljdHVyZUJveDo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ0ZXTF9QaWN0dXJlQm94Ow0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9QaWN0dXJlQm94RFA7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgbV9wSW1wID0gSUZXTF9QaWN0dXJlQm94OjpDcmVhdGUoKTsNCisgICAgRldMX0VSUiByZXQgPSAoKElGV0xfUGljdHVyZUJveCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgICAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICAgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfUGljdHVyZUJveDo6R2V0UGljdHVyZSgpDQorew0KKyAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAubV9wQml0bWFwOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0UGljdHVyZShDRlhfRElCaXRtYXAgKnBCaXRtYXApDQorew0KKyAgICBtX1BpY3R1cmVCb3hEUC5tX3BCaXRtYXAgPSBwQml0bWFwOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfUGljdHVyZUJveDo6R2V0Um90YXRpb24oKQ0KK3sNCisgICAgcmV0dXJuIG1fUGljdHVyZUJveERQLm1fZlJvdGF0aW9uOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0Um90YXRpb24oRlhfRkxPQVQgZlJvdGF0aW9uKQ0KK3sNCisgICAgbV9QaWN0dXJlQm94RFAubV9mUm90YXRpb24gPSBmUm90YXRpb247DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9QaWN0dXJlQm94OjpHZXRGbGlwTW9kZSgpDQorew0KKyAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAuR2V0RmxpcE1vZGUoKElGV0xfV2lkZ2V0Kil0aGlzKTsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldEZsaXBNb2RlKEZYX0lOVDMyIGlGbGlwTW9kZSkNCit7DQorICAgIG1fUGljdHVyZUJveERQLm1faUZsaXBNb2RlID0gaUZsaXBNb2RlOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfUGljdHVyZUJveDo6R2V0T3BhY2l0eSgpDQorew0KKyAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAuR2V0T3BhY2l0eSgoSUZXTF9XaWRnZXQqKXRoaXMpOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0T3BhY2l0eShGWF9JTlQzMiBpT3BhY2l0eSkNCit7DQorICAgIG1fUGljdHVyZUJveERQLm1faU9wYWNpdHkgPSBpT3BhY2l0eTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6R2V0U2NhbGUoRlhfRkxPQVQgJmZTY2FsZVgsIEZYX0ZMT0FUICZmU2NhbGVZKQ0KK3sNCisgICAgQ0ZYX01hdHJpeCBtYXRyaXg7DQorICAgIG1fUGljdHVyZUJveERQLkdldE1hdHJpeCgoSUZXTF9XaWRnZXQqKXRoaXMsIG1hdHJpeCk7DQorICAgIG1hdHJpeC5TY2FsZShmU2NhbGVYLCBmU2NhbGVZKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0U2NhbGUoRlhfRkxPQVQgZlNjYWxlWCwgRlhfRkxPQVQgZlNjYWxlWSkNCit7DQorICAgIG1fUGljdHVyZUJveERQLm1fZlNjYWxlWCA9IGZTY2FsZVg7DQorICAgIG1fUGljdHVyZUJveERQLm1fZlNjYWxlWSA9IGZTY2FsZVk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkdldE9mZnNldChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCit7DQorICAgIENGWF9NYXRyaXggbWF0cml4Ow0KKyAgICBtX1BpY3R1cmVCb3hEUC5HZXRNYXRyaXgoKElGV0xfV2lkZ2V0Kil0aGlzLCBtYXRyaXgpOw0KKyAgICBmeCA9IG1hdHJpeC5lOw0KKyAgICBmeSA9IG1hdHJpeC5mOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRPZmZzZXQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgbV9QaWN0dXJlQm94RFAubV9mT2ZmU2V0WCA9IGZ4Ow0KKyAgICBtX1BpY3R1cmVCb3hEUC5tX2ZPZmZTZXRZID0gZnk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3goKQ0KK3sNCit9DQorQ0ZXTF9QaWN0dXJlQm94Ojp+Q0ZXTF9QaWN0dXJlQm94KCkNCit7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbikNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fcEJpdG1hcDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRFcnJvclBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9wQml0bWFwOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldEluaXRpYWxQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fcEJpdG1hcDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0T3BhY2l0eShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX2lPcGFjaXR5Ow0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldE1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIHBXaWRnZXQtPkdldENsaWVudFJlY3QocmVjdCk7DQorICAgIEZYX0ZMT0FUIGZMZW4gPSByZWN0LndpZHRoIC8gMjsNCisgICAgRlhfRkxPQVQgZldpZCA9IHJlY3QuaGVpZ2h0IC8gMjsNCisgICAgbWF0cml4LlJlc2V0KCk7DQorICAgIG1hdHJpeC5UcmFuc2xhdGUoLWZMZW4sIC1mV2lkKTsNCisgICAgbWF0cml4LlJvdGF0ZShtX2ZSb3RhdGlvbik7DQorICAgIG1hdHJpeC5UcmFuc2xhdGUoZkxlbiwgZldpZCk7DQorICAgIG1hdHJpeC5TY2FsZShtX2ZTY2FsZVgsIG1fZlNjYWxlWSk7DQorICAgIG1hdHJpeC5UcmFuc2xhdGUobV9mT2ZmU2V0WCwgbV9mT2ZmU2V0WSk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0RmxpcE1vZGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9pRmxpcE1vZGU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9wdXNoYnV0dG9uLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9wdXNoYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTRjYWUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorQ0ZXTF9QdXNoQnV0dG9uKiBDRldMX1B1c2hCdXR0b246OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfUHVzaEJ1dHRvbjsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b246OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fYnV0dG9uRGF0YTsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KKyAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgICB9DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICAgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBwcm9wLm1fcnRXaWRnZXQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICBtX3BJbXAgPSBJRldMX1B1c2hCdXR0b246OkNyZWF0ZSgpOw0KKyAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9QdXNoQnV0dG9uKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uOjpHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQorew0KKyAgICB3c0NhcHRpb24gPSBtX2J1dHRvbkRhdGEubV93c0NhcHRpb247DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b246OlNldENhcHRpb24oRlhfV1NUUiB3c0NhcHRpb24pDQorew0KKyAgICBtX2J1dHRvbkRhdGEubV93c0NhcHRpb24gPSB3c0NhcHRpb247DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX1B1c2hCdXR0b246OkdldFBpY3R1cmUoKQ0KK3sNCisgICAgcmV0dXJuIG1fYnV0dG9uRGF0YS5tX3BCaXRtYXA7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uOjpTZXRQaWN0dXJlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCkNCit7DQorICAgIG1fYnV0dG9uRGF0YS5tX3BCaXRtYXAgPSBwQml0bWFwOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uKCkNCit7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbjo6fkNGV0xfUHVzaEJ1dHRvbigpDQorew0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQorew0KKyAgICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uRFA6OkdldFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9wQml0bWFwOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9zY3JvbGxiYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmIwZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmNwcApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX1Njcm9sbEJhciogQ0ZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfU2Nyb2xsQmFyOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgICBwcm9wLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KKyAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgICBwcm9wLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgICB9DQorICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIG1fcEltcCA9IElGV0xfU2Nyb2xsQmFyOjpDcmVhdGUoKTsNCisgICAgRldMX0VSUiByZXQgPSAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXI6OklzVmVydGljYWwoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPklzVmVydGljYWwoKTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6R2V0UmFuZ2UoRlhfRkxPQVQgJmZNaW4sIEZYX0ZMT0FUICZmTWF4KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRSYW5nZShmTWluLCBmTWF4KTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+U2V0UmFuZ2UoZk1pbiwgZk1heCk7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFyOjpHZXRQYWdlU2l6ZSgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRQYWdlU2l6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRQYWdlU2l6ZShGWF9GTE9BVCBmUGFnZVNpemUpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPlNldFBhZ2VTaXplKGZQYWdlU2l6ZSk7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFyOjpHZXRTdGVwU2l6ZSgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRTdGVwU2l6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRTdGVwU2l6ZShGWF9GTE9BVCBmU3RlcFNpemUpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPlNldFN0ZXBTaXplKGZTdGVwU2l6ZSk7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFyOjpHZXRQb3MoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCisgICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkdldFBvcygpOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRQb3MoRlhfRkxPQVQgZlBvcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+U2V0UG9zKGZQb3MpOw0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0VHJhY2tQb3MoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCisgICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkdldFRyYWNrUG9zKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXI6OlNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1BvcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+U2V0VHJhY2tQb3MoZlRyYWNrUG9zKTsNCit9DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhcjo6RG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkRvU2Nyb2xsKGR3Q29kZSwgZlBvcyk7DQorfQ0KK0NGV0xfU2Nyb2xsQmFyOjpDRldMX1Njcm9sbEJhcigpDQorew0KK30NCitDRldMX1Njcm9sbEJhcjo6fkNGV0xfU2Nyb2xsQmFyKCkNCit7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC90aGVtZS5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdGhlbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzFiMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdGhlbWUuY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KK0ZYX0JPT0wgQ0ZXTF9UaGVtZTo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBXaWRnZXQpOw0KKyAgICByZXR1cm4gcFRoZW1lICE9IE5VTEw7DQorfQ0KK0ZYX0RXT1JEIENGV0xfVGhlbWU6OkdldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwV2lkZ2V0KTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICAgIHJldHVybiBwVGhlbWUtPkdldFRoZW1lSUQocFdpZGdldCk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfVGhlbWU6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgICBGWF9EV09SRCBkd0lEOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSAoQ0ZXTF9XaWRnZXRUUCopbV9hcnJUaGVtZXNbaV07DQorICAgICAgICBkd0lEID0gcFRoZW1lLT5HZXRUaGVtZUlEKHBXaWRnZXQpOw0KKyAgICAgICAgcFRoZW1lLT5TZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiBkd0lEOw0KK30NCitGV0xfRVJSCUNGV0xfVGhlbWU6OkdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfTWF0cml4ICZtYXRyaXgpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9UaGVtZTo6U2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBDRldMX1RoZW1lOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgICByZXR1cm4gcFRoZW1lLT5EcmF3QmFja2dyb3VuZChwUGFyYW1zKTsNCit9DQorRlhfQk9PTCBDRldMX1RoZW1lOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcykNCit7DQorICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgICByZXR1cm4gcFRoZW1lLT5EcmF3VGV4dChwUGFyYW1zKTsNCit9DQorRlhfTFBWT0lEIENGV0xfVGhlbWU6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KQ0KK3sNCisgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gR2V0VGhlbWUocFRoZW1lUGFydC0+bV9wV2lkZ2V0KTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICAgIHJldHVybiBwVGhlbWUtPkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBXaWRnZXQpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgICAgcmV0dXJuIHBUaGVtZS0+SXNDdXN0b21pemVkTGF5b3V0KHBXaWRnZXQpOw0KK30NCitGV0xfRVJSIENGV0xfVGhlbWU6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBDRlhfUmVjdEYgJnJ0UGFydCkNCit7DQorICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgICByZXR1cm4gcFRoZW1lLT5HZXRQYXJ0UmVjdChwVGhlbWVQYXJ0LCBydFBhcnQpOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OklzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgICAgcmV0dXJuIHBUaGVtZS0+SXNJblBhcnQocFRoZW1lUGFydCwgZngsIGZ5KTsNCit9DQorRlhfQk9PTAlDRldMX1RoZW1lOjpDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMsIENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgICByZXR1cm4gcFRoZW1lLT5DYWxjVGV4dFJlY3QocFBhcmFtcywgcmVjdCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9UaGVtZTo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IChDRldMX1dpZGdldFRQKiltX2FyclRoZW1lc1tpXTsNCisgICAgICAgIHBUaGVtZS0+SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIEZXTFRIRU1FX0luaXQoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSCUNGV0xfVGhlbWU6OkZpbmFsaXplKCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fYXJyVGhlbWVzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KKyAgICAgICAgcFRoZW1lLT5GaW5hbGl6ZSgpOw0KKyAgICB9DQorICAgIEZXTFRIRU1FX1JlbGVhc2UoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX1RoZW1lOjpDRldMX1RoZW1lKCkNCit7DQorICAgIENGV0xfRm9ybVRQICpwRm9ybVRQID0gRlhfTkVXIENGV0xfRm9ybVRQOw0KKyAgICBDRldMX1B1c2hCdXR0b25UUAkJKnBQdXNoQnV0dG9uVFAgPSBGWF9ORVcgQ0ZXTF9QdXNoQnV0dG9uVFA7DQorICAgIENGV0xfQ2hlY2tCb3hUUAkJCSpwQ2hlY2tCb3hUUCA9IEZYX05FVyBDRldMX0NoZWNrQm94VFA7DQorICAgIENGV0xfTGlzdEJveFRQCQkJKnBMaXN0Qm94VFAgPSBGWF9ORVcgQ0ZXTF9MaXN0Qm94VFA7DQorICAgIENGV0xfUGljdHVyZUJveFRQCQkqcFBpY3R1cmVCb3hUUCA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hUUDsNCisgICAgQ0ZXTF9TY3JvbGxCYXJUUAkJKnBTcm9sbEJhclRQID0gRlhfTkVXIENGV0xfU2Nyb2xsQmFyVFA7DQorICAgIENGV0xfRWRpdFRQCQkJCSpwRWRpdFRQID0gRlhfTkVXIENGV0xfRWRpdFRQOw0KKyAgICBDRldMX0NvbWJvQm94VFAJCQkqcENvbWJvQm94VFAgPSBGWF9ORVcgQ0ZXTF9Db21ib0JveFRQOw0KKyAgICBDRldMX0JhcmNvZGVUUAkJCSpwQmFyY29kZVRQID0gRlhfTkVXIENGV0xfQmFyY29kZVRQOw0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VyVFAJKnBEYXRlVGltZVBpY2tlclRQID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDsNCisgICAgQ0ZXTF9Nb250aENhbGVuZGFyVFAJKnBNb250aENhbGVuZGFyVFAgPSBGWF9ORVcgQ0ZXTF9Nb250aENhbGVuZGFyVFA7DQorICAgIENGV0xfQ2FyZXRUUAkJCSpwQ2FyZXRUUCA9IEZYX05FVyBDRldMX0NhcmV0VFA7DQorICAgIG1fYXJyVGhlbWVzLkFkZChwRm9ybVRQKTsNCisgICAgbV9hcnJUaGVtZXMuQWRkKHBQdXNoQnV0dG9uVFApOw0KKyAgICBtX2FyclRoZW1lcy5BZGQocENoZWNrQm94VFApOw0KKyAgICBtX2FyclRoZW1lcy5BZGQocExpc3RCb3hUUCk7DQorICAgIG1fYXJyVGhlbWVzLkFkZChwUGljdHVyZUJveFRQKTsNCisgICAgbV9hcnJUaGVtZXMuQWRkKHBTcm9sbEJhclRQKTsNCisgICAgbV9hcnJUaGVtZXMuQWRkKHBFZGl0VFApOw0KKyAgICBtX2FyclRoZW1lcy5BZGQocENvbWJvQm94VFApOw0KKyAgICBtX2FyclRoZW1lcy5BZGQocEJhcmNvZGVUUCk7DQorICAgIG1fYXJyVGhlbWVzLkFkZChwRGF0ZVRpbWVQaWNrZXJUUCk7DQorICAgIG1fYXJyVGhlbWVzLkFkZChwTW9udGhDYWxlbmRhclRQKTsNCisgICAgbV9hcnJUaGVtZXMuQWRkKHBDYXJldFRQKTsNCit9DQorQ0ZXTF9UaGVtZTo6fkNGV0xfVGhlbWUoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSAoQ0ZXTF9XaWRnZXRUUCopbV9hcnJUaGVtZXNbaV07DQorICAgICAgICBkZWxldGUgcFRoZW1lOw0KKyAgICB9DQorICAgIG1fYXJyVGhlbWVzLlJlbW92ZUFsbCgpOw0KK30NCitGV0xfRVJSCUNGV0xfVGhlbWU6OlNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQQ1dTVFIgc3RyRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IChDRldMX1dpZGdldFRQKiltX2FyclRoZW1lc1tpXTsNCisgICAgICAgIHBUaGVtZS0+U2V0Rm9udChwV2lkZ2V0LCBzdHJGb250LCBmRm9udFNpemUsIHJnYkZvbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9XaWRnZXRUUCogQ0ZXTF9UaGVtZTo6R2V0VGhlbWUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IChDRldMX1dpZGdldFRQKiltX2FyclRoZW1lc1tpXTsNCisgICAgICAgIGlmIChwVGhlbWUtPklzVmFsaWRXaWRnZXQocFdpZGdldCkpIHsNCisgICAgICAgICAgICByZXR1cm4gcFRoZW1lOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk3MDEzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmNwcApAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorQ0ZXTF9Ub29sVGlwKiBDRldMX1Rvb2xUaXA6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENGV0xfVG9vbFRpcDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fdG9vbHRpcERhdGE7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICAgIH0NCisgICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgbV9wSW1wID0gSUZXTF9Ub29sVGlwOjpDcmVhdGUoKTsNCisgICAgRldMX0VSUiByZXQgPSAoKElGV0xfVG9vbFRpcCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgICAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICAgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcDo6R2V0Q2FwdGlvbihDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KK3sNCisgICAgd3NDYXB0aW9uID0gbV90b29sdGlwRGF0YS5tX3dzQ2FwdGlvbjsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcDo6U2V0Q2FwdGlvbihGWF9XU1RSIHdzQ2FwdGlvbikNCit7DQorICAgIG1fdG9vbHRpcERhdGEubV93c0NhcHRpb24gPSB3c0NhcHRpb247DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Ub29sVGlwOjpHZXRJbml0aWFsRGVsYXkoKQ0KK3sNCisgICAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9uSW5pdERlbGF5VGltZTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Ub29sVGlwOjpTZXRJbml0aWFsRGVsYXkoRlhfSU5UMzIgbkRlbGF5VGltZSkNCit7DQorICAgIG1fdG9vbHRpcERhdGEubV9uSW5pdERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Ub29sVGlwOjpHZXRBdXRvUG9wRGVsYXkoKQ0KK3sNCisgICAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9uQXV0b1BvcERlbGF5VGltZTsNCit9DQorRlhfSU5UMzIgQ0ZXTF9Ub29sVGlwOjpTZXRBdXRvUG9wRGVsYXkoRlhfSU5UMzIgbkRlbGF5VGltZSkNCit7DQorICAgIG1fdG9vbHRpcERhdGEubV9uQXV0b1BvcERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX1Rvb2xUaXA6OkdldFRvb2xUaXBJY29uKCkNCit7DQorICAgIHJldHVybiBtX3Rvb2x0aXBEYXRhLm1fcEJpdG1hcDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldFRvb2xUaXBJY29uKENGWF9ESUJpdG1hcCAqcEJpdG1hcCkNCit7DQorICAgIG1fdG9vbHRpcERhdGEubV9wQml0bWFwID0gcEJpdG1hcDsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRlhfU2l6ZUYgQ0ZXTF9Ub29sVGlwOjpHZXRUb29sVGlwSWNvblNpemUoKQ0KK3sNCisgICAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9mSWNvblNpemU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRUb29sVGlwSWNvblNpemUoQ0ZYX1NpemVGIGZTaXplKQ0KK3sNCisgICAgbV90b29sdGlwRGF0YS5tX2ZJY29uU2l6ZSA9IGZTaXplOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvcikNCit7DQorICAgIHJldHVybiAoKElGV0xfVG9vbFRpcCopbV9wSW1wKS0+U2V0QW5jaG9yKHJ0QW5jaG9yKTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNob3coKQ0KK3sNCisgICAgcmV0dXJuICgoSUZXTF9Ub29sVGlwKiltX3BJbXApLT5TaG93KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpIaWRlKCkNCit7DQorICAgIHJldHVybiAoKElGV0xfVG9vbFRpcCopbV9wSW1wKS0+SGlkZSgpOw0KK30NCitDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcCgpDQorew0KK30NCitDRldMX1Rvb2xUaXA6On5DRldMX1Rvb2xUaXAoKQ0KK3sNCit9DQorQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6Q0ZXTF9Ub29sVGlwRFAoKQ0KKyAgICA6IG1fcEJpdG1hcChOVUxMKQ0KK3sNCisgICAgbV93c0NhcHRpb24gPSBMIiI7DQorICAgIG1fbkluaXREZWxheVRpbWUgPSA1MDA7DQorICAgIG1fbkF1dG9Qb3BEZWxheVRpbWUgPSA1MDAwMDsNCisgICAgbV9mSWNvblNpemUuU2V0KCAwLjAsIDAuMCk7DQorICAgIG1fZkFuY2hvci5TZXQoIDAuMCwgMC4wLCAwLjAsIDAuMCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbikNCit7DQorICAgIHdzQ2FwdGlvbiA9IG1fd3NDYXB0aW9uOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0lOVDMyIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldEluaXRpYWxEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX25Jbml0RGVsYXlUaW1lOw0KK30NCitGWF9JTlQzMiBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRBdXRvUG9wRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9uQXV0b1BvcERlbGF5VGltZTsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRUb29sVGlwSWNvbihJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX3BCaXRtYXA7DQorfQ0KK0NGWF9TaXplRiBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRUb29sVGlwSWNvblNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gbV9mSWNvblNpemU7DQorfQ0KK0NGWF9SZWN0RiBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRBbmNob3IoKQ0KK3sNCisgICAgcmV0dXJuIG1fZkFuY2hvcjsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3dpZGdldC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvd2lkZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDgwZDY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3dpZGdldC5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uLy4uL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0OjpHZXRXaWRnZXQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEltcDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OlJlbGVhc2UoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgICBGWF9EV09SRCBkd1JlZiA9IG1fcEltcC0+R2V0UmVmQ291bnQoKTsNCisgICAgaWYgKGR3UmVmID09IDEpIHsNCisgICAgICAgIG1fcEltcC0+RmluYWxpemUoKTsNCisgICAgfQ0KKyAgICBtX3BJbXAtPlJlbGVhc2UoKTsNCisgICAgaWYgKGR3UmVmID09IDEpIHsNCisgICAgICAgIG1fcEltcCA9IE5VTEw7DQorICAgICAgICBkZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdSZWYgLSAxOw0KK30NCitDRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OlJldGFpbigpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQorICAgIG1fcEltcC0+UmV0YWluKCk7DQorICAgIHJldHVybiB0aGlzOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldDo6R2V0UmVmQ291bnQoKSBjb25zdA0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDEpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5HZXRSZWZDb3VudCgpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+R2V0Q2xhc3NOYW1lKHdzQ2xhc3MpOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICAgIHJldHVybiBtX3BJbXAtPkdldENsYXNzSUQoKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldDo6SXNJbnN0YW5jZShGWF9XU1RSIHdzQ2xhc3MpIGNvbnN0DQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5Jc0luc3RhbmNlKHdzQ2xhc3MpOw0KK30NCitzdGF0aWMgRlhfTFBWT0lEIGdzX3BGV0xXaWRnZXQgPSAoRlhfTFBWT0lEKUZYQlNUUl9JRCgnbCcsICdpJywgJ2cnLCAndCcpOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+U2V0UHJpdmF0ZURhdGEoZ3NfcEZXTFdpZGdldCwgdGhpcywgTlVMTCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5HZXRHbG9iYWxSZWN0KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5TZXRXaWRnZXRSZWN0KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5HZXRDbGllbnRSZWN0KHJlY3QpOw0KK30NCitDRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OkdldFBhcmVudCgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQorICAgIElGV0xfV2lkZ2V0ICpwYXJlbnQgPSBtX3BJbXAtPkdldFBhcmVudCgpOw0KKyAgICBpZiAocGFyZW50KSB7DQorICAgICAgICByZXR1cm4gKENGV0xfV2lkZ2V0KilwYXJlbnQtPkdldFByaXZhdGVEYXRhKGdzX3BGV0xXaWRnZXQpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpTZXRQYXJlbnQoQ0ZXTF9XaWRnZXQgKnBQYXJlbnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+U2V0UGFyZW50KHBQYXJlbnQgPyBwUGFyZW50LT5HZXRXaWRnZXQoKSA6IE5VTEwpOw0KK30NCitDRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OkdldE93bmVyKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBOVUxMKTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OlNldE93bmVyKENGV0xfV2lkZ2V0ICpwT3duZXIpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldDo6R2V0U3R5bGVzKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuIG1fcEltcC0+R2V0U3R5bGVzKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLCBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+TW9kaWZ5U3R5bGVzKGR3U3R5bGVzQWRkZWQsIGR3U3R5bGVzUmVtb3ZlZCk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpHZXRTdHlsZXNFeCgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICAgIHJldHVybiBtX3BJbXAtPkdldFN0eWxlc0V4KCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQorew0KKyAgICByZXR1cm4gbV9wSW1wLT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OkdldFN0YXRlcygpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+R2V0U3RhdGVzKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5TZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpTZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkLCBGWF9MUFZPSUQgcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBtX3BJbXAtPlNldFByaXZhdGVEYXRhKG1vZHVsZV9pZCwgcERhdGEsIGNhbGxiYWNrKTsNCit9DQorRlhfTFBWT0lEIENGV0xfV2lkZ2V0OjpHZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIE5VTEwpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5HZXRQcml2YXRlRGF0YShtb2R1bGVfaWQpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpVcGRhdGUoKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBtX3BJbXAtPlVwZGF0ZSgpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpMb2NrVXBkYXRlKCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5Mb2NrVXBkYXRlKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OlVubG9ja1VwZGF0ZSgpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+VW5sb2NrVXBkYXRlKCk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgICAgcmV0dXJuIG1fcEltcC0+SGl0VGVzdChmeCwgZnkpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+VHJhbnNmb3JtVG8ocFdpZGdldCA/IHBXaWRnZXQtPkdldFdpZGdldCgpIDogTlVMTCwgZngsIGZ5KTsNCit9DQorRldMX0VSUglDRldMX1dpZGdldDo6VHJhbnNmb3JtVG8oQ0ZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgcmV0dXJuIG1fcEltcC0+VHJhbnNmb3JtVG8ocFdpZGdldCA/IHBXaWRnZXQtPkdldFdpZGdldCgpIDogTlVMTCwgcnQpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpHZXRNYXRyaXgoQ0ZYX01hdHJpeCAmbWF0cml4LCBGWF9CT09MIGJHbG9iYWwgKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBtX3BJbXAtPkdldE1hdHJpeChtYXRyaXgsIGJHbG9iYWwpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHJldHVybiBtX3BJbXAtPlNldE1hdHJpeChtYXRyaXgpOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0OjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gbV9wSW1wLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OkdldFByb3BlcnRpZXMoQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKQ0KK3sNCisgICAgcHJvcGVydGllcy5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgICAgcHJvcGVydGllcy5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcHJvcGVydGllcy5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgICAgcHJvcGVydGllcy5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgICAgcHJvcGVydGllcy5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgICAgcHJvcGVydGllcy5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQ7DQorICAgIHByb3BlcnRpZXMubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcjsNCisgICAgcHJvcGVydGllcy5tX3dzV2luZG93Y2xhc3MgPSBtX3BQcm9wZXJ0aWVzLT5tX3dzV2luZG93Y2xhc3M7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX1dpZGdldDo6U2V0UHJvcGVydGllcyhjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgJnByb3BlcnRpZXMpDQorew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50ID0gcHJvcGVydGllcy5tX2N0bU9uUGFyZW50Ow0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0ID0gcHJvcGVydGllcy5tX3J0V2lkZ2V0Ow0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzID0gcHJvcGVydGllcy5tX2R3U3R5bGVzOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzID0gcHJvcGVydGllcy5tX2R3U3R5bGVFeGVzOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzID0gcHJvcGVydGllcy5tX2R3U3RhdGVzOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQgPSBwcm9wZXJ0aWVzLm1fcFBhcmVudDsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wT3duZXIgPSBwcm9wZXJ0aWVzLm1fcE93bmVyOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3dzV2luZG93Y2xhc3MgPSBwcm9wZXJ0aWVzLm1fd3NXaW5kb3djbGFzczsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldERlbGVnYXRlKiBDRldMX1dpZGdldDo6U2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIE5VTEwpOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IG1fcEltcC0+U2V0RGVsZWdhdGUocERlbGVnYXRlKTsNCisgICAgcmV0dXJuIG1fcERlbGVnYXRlOw0KK30NCitDRldMX1dpZGdldDo6Q0ZXTF9XaWRnZXQoKQ0KKyAgICA6IG1fcEltcChOVUxMKQ0KKyAgICAsIG1fcERlbGVnYXRlKE5VTEwpDQorICAgICwgbV9wUHJvcGVydGllcyhOVUxMKQ0KK3sNCisgICAgbV9wUHJvcGVydGllcyA9IEZYX05FVyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorICAgIG1fcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0TWdyICE9IE5VTEwpOw0KK30NCitDRldMX1dpZGdldDo6fkNGV0xfV2lkZ2V0KCkNCit7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzKSB7DQorICAgICAgICBkZWxldGUgbV9wUHJvcGVydGllczsNCisgICAgICAgIG1fcFByb3BlcnRpZXMgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BJbXApIHsNCisgICAgICAgIG1fcEltcC0+RmluYWxpemUoKTsNCisgICAgICAgIG1fcEltcC0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wSW1wID0gTlVMTDsNCisgICAgfQ0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpSZXBhaW50KGNvbnN0IENGWF9SZWN0RiAqcFJlY3QpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIGlmIChwUmVjdCkgew0KKyAgICAgICAgcmVjdCA9ICpwUmVjdDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcEltcC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5SZXBhaW50V2lkZ2V0KG1fcEltcCwgJnJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRGb2N1cyhGWF9CT09MIGJGb2N1cykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BJbXAtPkdldE93bmVyVGhyZWFkKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBpZiAoYkZvY3VzKSB7DQorICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhtX3BJbXApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKCgoQ0ZXTF9Ob3RlRHJpdmVyKilwRHJpdmVyKS0+R2V0Rm9jdXMoKSA9PSBtX3BJbXApIHsNCisgICAgICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhOVUxMKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldEdyYWIoRlhfQk9PTCBiU2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IG1fcEltcC0+R2V0T3duZXJUaHJlYWQoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIENGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHBEcml2ZXItPlNldEdyYWIobV9wSW1wLCBiU2V0KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0OjpSZWdpc3RlckV2ZW50VGFyZ2V0KENGV0xfV2lkZ2V0ICpwRXZlbnRTb3VyY2UgLCBGWF9EV09SRCBkd0ZpbHRlciApDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEltcCk7DQorICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IG1fcEltcC0+R2V0T3duZXJUaHJlYWQoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQorICAgIElGV0xfV2lkZ2V0ICpwRXZlbnRTb3VyY2VJbXAgPSAhcEV2ZW50U291cmNlID8gTlVMTCA6IHBFdmVudFNvdXJjZS0+R2V0V2lkZ2V0KCk7DQorICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KEdldFdpZGdldCgpLCBwRXZlbnRTb3VyY2VJbXAsIGR3RmlsdGVyKTsNCit9DQordm9pZCBDRldMX1dpZGdldDo6RGlzcGF0Y2hFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEltcCk7DQorICAgIGlmIChtX3BJbXAtPkdldE91dGVyKCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BJbXAtPkdldE93bmVyVGhyZWFkKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE5vdGVEcml2ZXIpOw0KKyAgICBwTm90ZURyaXZlci0+U2VuZE5vdGUocEV2ZW50KTsNCit9DQorI2RlZmluZSBGV0xfV0dUX0NhbGNIZWlnaHQJCQkJMjA0OA0KKyNkZWZpbmUgRldMX1dHVF9DYWxjV2lkdGgJCQkJMjA0OA0KKyNkZWZpbmUgRldMX1dHVF9DYWxjTXVsdGlMaW5lRGVmV2lkdGgJMTIwLjBmDQorQ0ZYX1NpemVGIENGV0xfV2lkZ2V0OjpDYWxjVGV4dFNpemUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfQk9PTCBiTXVsdGlMaW5lICwgRlhfSU5UMzIgaUxpbmVXaWR0aCApDQorew0KKyAgICBDRlhfU2l6ZUYgc3o7DQorICAgIHN6LlNldCgwLCAwKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIHN6KTsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BJbXAtPkdldFRoZW1lUHJvdmlkZXIoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhlbWUsIHN6KTsNCisgICAgQ0ZXTF9UaGVtZVRleHQgY2FsUGFydDsNCisgICAgY2FsUGFydC5tX3BXaWRnZXQgPSBtX3BJbXA7DQorICAgIGNhbFBhcnQubV93c1RleHQgPSB3c1RleHQ7DQorICAgIGNhbFBhcnQubV9kd1RUT1N0eWxlcyA9IGJNdWx0aUxpbmUgPyBGREVfVFRPU1RZTEVfTGluZVdyYXAgOiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgY2FsUGFydC5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IGJNdWx0aUxpbmUgPw0KKyAgICAgICAgICAgICAgICAgICAgICAoaUxpbmVXaWR0aCA+IDAgPyAoRlhfRkxPQVQpaUxpbmVXaWR0aCA6IEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoKSA6DQorICAgICAgICAgICAgICAgICAgICAgIEZXTF9XR1RfQ2FsY1dpZHRoOw0KKyAgICByZWN0LlNldCgwLCAwLCBmV2lkdGgsIEZXTF9XR1RfQ2FsY0hlaWdodCk7DQorICAgIHBUaGVtZS0+Q2FsY1RleHRSZWN0KCZjYWxQYXJ0LCByZWN0KTsNCisgICAgc3oueCA9IHJlY3Qud2lkdGg7DQorICAgIHN6LnkgPSByZWN0LmhlaWdodDsNCisgICAgcmV0dXJuIHN6Ow0KK30NCitDRldMX1dpZGdldERlbGVnYXRlOjpDRldMX1dpZGdldERlbGVnYXRlKCkNCit7DQorfQ0KK0NGV0xfV2lkZ2V0RGVsZWdhdGU6On5DRldMX1dpZGdldERlbGVnYXRlKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENGV0xfV2lkZ2V0RGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIHJldHVybiAxOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0RGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvYmFyY29kZXRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9iYXJjb2RldHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmJmOTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvYmFyY29kZXRwLmNwcApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KK0NGV0xfQmFyY29kZVRQOjpDRldMX0JhcmNvZGVUUCgpDQorew0KK30NCitDRldMX0JhcmNvZGVUUDo6fkNGV0xfQmFyY29kZVRQKCkNCit7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9CYXJjb2RlVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0JhcmNvZGU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9CYXJjb2RlVFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0JDRF9Cb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0JDRF9FZGdlOiB7DQorICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfQkNEX0JhY2tncm91bmQ6IHsNCisgICAgICAgICAgICAgICAgRmlsbEJhY2tncm91bmQocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NhcmV0dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NhcmV0dHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzM2E5N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2FyZXR0cC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX0NhcmV0VFA6OkNGV0xfQ2FyZXRUUCgpDQorew0KK30NCitDRldMX0NhcmV0VFA6On5DRldMX0NhcmV0VFAoKQ0KK3sNCit9DQorRlhfQk9PTAlDRldMX0NhcmV0VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0NhcmV0Ow0KK30NCitGWF9CT09MCUNGV0xfQ2FyZXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCisgICAgc3dpdGNoKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgICAgIGNhc2UgRldMX1BBUlRfQ0FUX0JhY2tncm91bmQ6IHsNCisgICAgICAgICAgICAgICAgaWYgKCEocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBEcmF3Q2FyZXRCSyhwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9kd1N0YXRlcywgJihwUGFyYW1zLT5tX3J0UGFydCksIChDRlhfQ29sb3IgKilwUGFyYW1zLT5tX3BEYXRhLCAmKHBQYXJhbXMtPm1fbWF0cml4KSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX0NhcmV0VFA6OkRyYXdDYXJldEJLKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9EV09SRCBkd1N0YXRlcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX0NvbG9yICpjckZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsdGVtcDsNCisgICAgY3JGaWxsID8gY3JGaWxsdGVtcCA9ICpjckZpbGwgOiBjckZpbGx0ZW1wID0gQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApOw0KKyAgICBDRlhfUmVjdEYgcmVjdCA9ICpwUmVjdDsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsdGVtcCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NoZWNrYm94dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NoZWNrYm94dHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTc0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2hlY2tib3h0cC5jcHAKQEAgLTAsMCArMSw1MDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2RlZmluZSBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4JCTMNCisjZGVmaW5lIENIRUNLQk9YX1NJWkVfU0lHTkJPUkRFUgkJMg0KKyNkZWZpbmUgQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSAkJCTEwMA0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YTFQxCQkoQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpKQ0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YTFQyCQkoQXJnYkVuY29kZSgyNTUsIDExMywgMTExLCAxMDApKQ0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxCQkoQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMjYpKQ0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIyCQkoQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpKQ0KKyNkZWZpbmUJQ0hFQ0tCT1hfRlhHRV9Db29yZGluYXRlc0FkanVzdA0KK0NGV0xfQ2hlY2tCb3hUUDo6Q0ZXTF9DaGVja0JveFRQKCkNCisgICAgOiBtX3BDaGVja1BhdGgoTlVMTCkNCit7DQorICAgIG1fcFRoZW1lRGF0YSA9IEZYX05FVyBDS0JUaGVtZURhdGE7DQorICAgIFNldFRoZW1lRGF0YSgwKTsNCit9DQorQ0ZXTF9DaGVja0JveFRQOjp+Q0ZXTF9DaGVja0JveFRQKCkNCit7DQorICAgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BUaGVtZURhdGE7DQorICAgICAgICBtX3BUaGVtZURhdGEgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BDaGVja1BhdGgpIHsNCisgICAgICAgIG1fcENoZWNrUGF0aC0+Q2xlYXIoKTsNCisgICAgICAgIGRlbGV0ZSBtX3BDaGVja1BhdGg7DQorICAgICAgICBtX3BDaGVja1BhdGggPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9DaGVja0JveFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICAgIEZYX0RXT1JEIGR3SGFzaCA9IHBXaWRnZXQtPkdldENsYXNzSUQoKTsNCisgICAgcmV0dXJuIGR3SGFzaCA9PSBGV0xfQ0xBU1NIQVNIX0NoZWNrQm94IHx8IGR3SGFzaCA9PSBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uOw0KK30NCitGWF9EV09SRCBDRldMX0NoZWNrQm94VFA6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gKQ0KK3sNCisgICAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICAgICAgU2V0VGhlbWVEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKGR3VGhlbWVJRCkpOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCit9DQorRlhfQk9PTAlDRldMX0NoZWNrQm94VFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BUZXh0T3V0LCBGQUxTRSk7DQorICAgIEZYX0JPT0wgYkRpc2FibGUgPSAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZDsNCisgICAgRlhfQVJHQiBhcmdUZXh0ID0gYkRpc2FibGUgPyBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0RGlzQ29sb3IgOiBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3I7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihhcmdUZXh0KTsNCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KHBQYXJhbXMpOw0KK30NCitGWF9CT09MCUNGV0xfQ2hlY2tCb3hUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCisgICAgc3dpdGNoKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgICAgIGNhc2UgRldMX1BBUlRfQ0tCX0JvcmRlcjogew0KKyAgICAgICAgICAgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfQ0tCX0VkZ2U6IHsNCisgICAgICAgICAgICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9DS0JfQmFja2dyb3VuZDogew0KKyAgICAgICAgICAgICAgICBGaWxsQmFja2dyb3VuZChwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX0ZvY3VzZWQpIHsNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0ID0gKihDRlhfUmVjdEYqKXBQYXJhbXMtPm1fcERhdGE7DQorICAgICAgICAgICAgICAgICAgICBEcmF3Rm9jdXMocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0NLQl9DaGVja0JveDogew0KKyAgICAgICAgICAgICAgICBEcmF3Qm94QmsocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBpZiAoKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX0NoZWNrZWQpIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0gRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbCkpIHsNCisgICAgICAgICAgICAgICAgICAgIERyYXdTaWduKHBQYXJhbXMtPm1fcFdpZGdldCwgcFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgcFBhcmFtcy0+bV9kd1N0YXRlcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJEaXNhYmxlID0gKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQ7DQorICAgICAgICAgICAgICAgIERyYXdTaWduQm9yZGVyKHBQYXJhbXMtPm1fcFdpZGdldCwgcFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgYkRpc2FibGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUglDRldMX0NoZWNrQm94VFA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgSW5pdFRUTygpOw0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUNGV0xfQ2hlY2tCb3hUUDo6RmluYWxpemUoKQ0KK3sNCisgICAgRmluYWxpemVUVE8oKTsNCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkZpbmFsaXplKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3Qm94QmsoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9EV09SRCBkd1N0YXRlcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBkd1N0YXRlcyAmPSAweDAzOw0KKyAgICBGWF9JTlQzMiBmaWxsTW9kZSA9IEZYRklMTF9XSU5ESU5HOw0KKyAgICBGWF9EV09SRCBkd1N0eWxlRXggPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgICBkd1N0eWxlRXggJj0gRldMX1NUWUxFRVhUX0NLQl9TaGFwZU1hc2s7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgICBGWF9CT09MIGJDbGlwU2lnbiA9IChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICBpZiAoKGR3U3R5bGVFeCA9PSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRTcXVhcmUpIHx8IChkd1N0eWxlRXggPT0gRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlblNxdWFyZSkpIHsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICAgICAgaWYgKGJDbGlwU2lnbikgew0KKyAgICAgICAgICAgIGZpbGxNb2RlID0gRlhGSUxMX0FMVEVSTkFURTsNCisgICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT53aWR0aCAtIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiAqIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiAqIDIpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyNpZmRlZiBDSEVDS0JPWF9GWEdFX0Nvb3JkaW5hdGVzQWRqdXN0DQorICAgICAgICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KKyAgICAgICAgcmVjdC5EZWZsYXRlKDAsIDAsIDEsIDEpOw0KKyAgICAgICAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KKyNlbHNlDQorICAgICAgICBwYXRoLkFkZEVsbGlwc2UoKnBSZWN0KTsNCisjZW5kaWYNCisgICAgICAgIGlmIChiQ2xpcFNpZ24pIHsNCisgICAgICAgICAgICBmaWxsTW9kZSA9IEZYRklMTF9BTFRFUk5BVEU7DQorI2lmZGVmIENIRUNLQk9YX0ZYR0VfQ29vcmRpbmF0ZXNBZGp1c3QNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRDbGlwKHJlY3QpOw0KKyNlbHNlDQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCgqcFJlY3QpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIHJ0Q2xpcC5EZWZsYXRlKENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiAtIDEsIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiAtIDEpOw0KKyAgICAgICAgICAgIHBhdGguQWRkRWxsaXBzZShydENsaXApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlUaGVtZSA9IDE7DQorICAgIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfSG92ZXJlZCkgew0KKyAgICAgICAgaVRoZW1lID0gMjsNCisgICAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfUHJlc3NlZCkgew0KKyAgICAgICAgaVRoZW1lID0gMzsNCisgICAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQpIHsNCisgICAgICAgIGlUaGVtZSA9IDQ7DQorICAgIH0NCisgICAgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgICAgICBpVGhlbWUgKz0gNDsNCisgICAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0gRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbCkgew0KKyAgICAgICAgaVRoZW1lICs9IDg7DQorICAgIH0NCisgICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHBSZWN0LT5sZWZ0IC0gMSwgcFJlY3QtPnRvcCAtIDEsIGZSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICBmQm90dG9tLCBtX3BUaGVtZURhdGEtPmNsckJveEJrW2lUaGVtZV1bMF0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3hCa1tpVGhlbWVdWzFdLCAmcGF0aCwgZmlsbE1vZGUsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdEJveCwgRlhfRFdPUkQgZHdTdGF0ZXMsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0U2lnbigqcFJ0Qm94KTsNCisgICAgcnRTaWduLkRlZmxhdGUoQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOLCBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4pOw0KKyAgICBGWF9EV09SRCBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduQ2hlY2s7DQorICAgIEZYX0JPT0wgYkNoZWNrID0gVFJVRTsNCisgICAgaWYgKCgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQpICYmDQorICAgICAgICAgICAgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSkgew0KKyAgICAgICAgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGU7DQorICAgIH0gZWxzZSBpZiAoKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgICAgIHN3aXRjaCAoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgew0KKyAgICAgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DS0JfTm9ybWFsOiB7DQorICAgICAgICAgICAgICAgICAgICBiQ2hlY2sgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIGR3Q29sb3IgPSBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsTm9ybWFsOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX0hvdmVyZWQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGJDaGVjayA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkOiB7DQorICAgICAgICAgICAgICAgICAgICBiQ2hlY2sgPSBGQUxTRSwJZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkOiB7DQorICAgICAgICAgICAgICAgICAgICBiQ2hlY2sgPSBGQUxTRSwgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQ2hlY2spIHsNCisgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgICAgICAgc3dpdGNoKGR3U3R5bGUgJiBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2spIHsNCisgICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s6IHsNCisgICAgICAgICAgICAgICAgICAgIERyYXdTaWduQ2hlY2socEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNpcmNsZTogew0KKyAgICAgICAgICAgICAgICAgICAgcnRTaWduLkRlZmxhdGUoMSwgMSk7DQorICAgICAgICAgICAgICAgICAgICBEcmF3U2lnbkNpcmNsZShwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ3Jvc3M6IHsNCisgICAgICAgICAgICAgICAgICAgIERyYXdTaWduQ3Jvc3MocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZURpYW1vbmQ6IHsNCisgICAgICAgICAgICAgICAgICAgIERyYXdTaWduRGlhbW9uZChwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3F1YXJlOiB7DQorICAgICAgICAgICAgICAgICAgICBEcmF3U2lnblNxdWFyZShwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3Rhcjogew0KKyAgICAgICAgICAgICAgICAgICAgRHJhd1NpZ25TdGFyKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIEFyZ2JFbmNvZGUoMjU1LCAzMywgMTYxLCAzMyksICZydFNpZ24sIHBNYXRyaXgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbk5ldXRyYWwoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICAoKENGWF9SZWN0RiopcFJ0U2lnbiktPkluZmxhdGUoLTMsIC0zKTsNCisgICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWwsIHBSdFNpZ24sIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25DaGVjayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIGlmICghbV9wQ2hlY2tQYXRoKSB7DQorICAgICAgICBpbml0Q2hlY2tQYXRoKHBSdFNpZ24tPndpZHRoKTsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5SZXNldCgpOw0KKyAgICBtdC5UcmFuc2xhdGUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wKTsNCisgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChhcmdiRmlsbCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgobV9wQ2hlY2tQYXRoLCBGWEZJTExfV0lORElORywgJm10KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25DaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgRlhfQVJHQiBhcmdiRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBwYXRoLkFkZEVsbGlwc2UoKnBSdFNpZ24pOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkNyb3NzKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJ0U2lnbi0+cmlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSdFNpZ24tPmJvdHRvbSgpOw0KKyAgICBwYXRoLkFkZExpbmUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wLCBmUmlnaHQsIGZCb3R0b20pOw0KKyAgICBwYXRoLkFkZExpbmUocFJ0U2lnbi0+bGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBwUnRTaWduLT50b3ApOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwpOw0KKyAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxLjBmKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25EaWFtb25kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gcFJ0U2lnbi0+d2lkdGg7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwUnRTaWduLT5oZWlnaHQ7DQorICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUnRTaWduLT5ib3R0b20oKTsNCisgICAgcGF0aC5Nb3ZlVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIHBSdFNpZ24tPnRvcCk7DQorICAgIHBhdGguTGluZVRvKHBSdFNpZ24tPmxlZnQsIHBSdFNpZ24tPnRvcCArIGZIZWlnaHQgLyAyKTsNCisgICAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIGZCb3R0b20pOw0KKyAgICBwYXRoLkxpbmVUbyhwUnRTaWduLT5yaWdodCgpLCBwUnRTaWduLT50b3AgKyBmSGVpZ2h0IC8gMik7DQorICAgIHBhdGguTGluZVRvKHBSdFNpZ24tPmxlZnQgKyBmV2lkdGggLyAyLCBwUnRTaWduLT50b3ApOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnblNxdWFyZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSdFNpZ24tPmxlZnQsIHBSdFNpZ24tPnRvcCwgcFJ0U2lnbi0+d2lkdGgsIHBSdFNpZ24tPmhlaWdodCk7DQorICAgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduU3RhcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUnRTaWduLT5ib3R0b20oKTsNCisgICAgRlhfRkxPQVQgZlJhZGl1cyA9IChwUnRTaWduLT50b3AgLSBmQm90dG9tKSAvICggMSArIChGWF9GTE9BVCljb3MoRlhfUEkgLyA1LjBmKSk7DQorICAgIENGWF9Qb2ludEYgcHRDZW50ZXI7DQorICAgIHB0Q2VudGVyLlNldCgocFJ0U2lnbi0+bGVmdCArIHBSdFNpZ24tPnJpZ2h0KCkpIC8gMi4wZiwgKHBSdFNpZ24tPnRvcCArIGZCb3R0b20pIC8gMi4wZik7DQorICAgIEZYX0ZMT0FUIHB4WzVdLCBweVs1XTsNCisgICAgRlhfRkxPQVQgZkFuZ2VsID0gRlhfUEkgLyAxMC4wZjsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDU7IGkrKykgew0KKyAgICAgICAgcHhbaV0gPSBwdENlbnRlci54ICsgZlJhZGl1cyAqIChGWF9GTE9BVCljb3MoZkFuZ2VsKTsNCisgICAgICAgIHB5W2ldID0gcHRDZW50ZXIueSArIGZSYWRpdXMgKiAoRlhfRkxPQVQpc2luKGZBbmdlbCk7DQorICAgICAgICBmQW5nZWwgKz0gRlhfUEkgKiAyIC8gNS4wZjsNCisgICAgfQ0KKyAgICBwYXRoLk1vdmVUbyhweFswXSwgcHlbMF0pOw0KKyAgICBGWF9JTlQzMiBuTmV4dCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCA1OyBqKyspIHsNCisgICAgICAgIG5OZXh0ICs9IDI7DQorICAgICAgICBpZiAobk5leHQgPj0gNSkgew0KKyAgICAgICAgICAgIG5OZXh0IC09IDU7DQorICAgICAgICB9DQorICAgICAgICBwYXRoLkxpbmVUbyhweFtuTmV4dF0sIHB5W25OZXh0XSk7DQorICAgIH0NCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChhcmdiRmlsbCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25Cb3JkZXIoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdEJveCwgRlhfQk9PTCBiRGlzYWJsZSAsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgc3dpdGNoKHBXaWRnZXQtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzaykgew0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRTcXVhcmU6IHsNCisgICAgICAgICAgICAgICAgRHJhd0FubnVsdXNSZWN0KHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXNhYmxlID8gbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZSA6IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlck5vcm1hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlOiB7DQorICAgICAgICAgICAgICAgIERyYXczRFJlY3QocEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0VER0VfU3Vua2VuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX1NJWkVfU0lHTkJPUkRFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YTFQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWExUMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9DT0xPUl9CT1hSQjEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTb2xpZENpcmNsZTogew0KKyAgICAgICAgICAgICAgICBEcmF3QW5udWx1c0NpcmNsZShwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXNhYmxlID8gbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZSA6IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlck5vcm1hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuQ2lyY2xlOiB7DQorICAgICAgICAgICAgICAgIERyYXczRENpcmNsZShwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9FREdFX1N1bmtlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX1NJWkVfU0lHTkJPUkRFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWExUMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWExUMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWFJCMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWFJCMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKQ0KK3sNCisgICAgRlhfRFdPUkQgKnBEYXRhID0gKEZYX0RXT1JEKikmbV9wVGhlbWVEYXRhLT5jbHJCb3hCazsNCisgICAgaWYgKGR3SUQpIHsNCisgICAgICAgICpwRGF0YSsrID0gMCwgKnBEYXRhKysgPSAwLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyTm9ybWFsID0gQXJnYkVuY29kZSgyNTUsIDE1NCwgMTY3LCAxMTQpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDIsIDIwMCwgMTg3KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkNoZWNrID0gQXJnYkVuY29kZSgyNTUsIDE2NCwgMTgwLCAxMzgpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbCA9IEFyZ2JFbmNvZGUoMjI1NSwgMjgsIDEzNCwgMjYpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbE5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAxMTQsIDE5MiwgMTEzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlciA9IEFyZ2JFbmNvZGUoMjU1LCAzMywgMTYxLCAzMyk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsUHJlc3NlZCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gMCwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlck5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgODEsIDEyOCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJEaXNhYmxlID0gQXJnYkVuY29kZSgyNTUsIDIwMiwgMjAwLCAxODcpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQ2hlY2sgPSBBcmdiRW5jb2RlKDI1NSwgMjgsIDgxLCAxMjgpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsTm9ybWFsID0gQXJnYkVuY29kZSgyNTUsIDExNCwgMTkyLCAxMTMpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbEhvdmVyID0gQXJnYkVuY29kZSgyNTUsIDMzLCAxNjEsIDMzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkID0gQXJnYkVuY29kZSgyNTUsIDI4LCAxMzQsIDI2KTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6aW5pdENoZWNrUGF0aChGWF9GTE9BVCBmQ2hlY2tMZW4pDQorew0KKyAgICBpZiAoIW1fcENoZWNrUGF0aCkgew0KKyAgICAgICAgbV9wQ2hlY2tQYXRoID0gRlhfTkVXIENGWF9QYXRoOw0KKyAgICAgICAgbV9wQ2hlY2tQYXRoLT5DcmVhdGUoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IENIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQorICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gLUNIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQorICAgICAgICBGWF9GTE9BVCBmQm90dG9tID0gQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSDsNCisgICAgICAgIEZYX0ZMT0FUIHB4MSwgcHkxLCBweDIsIHB5MjsNCisgICAgICAgIENGWF9Qb2ludEYgcHQxOw0KKyAgICAgICAgcHQxLlNldChmV2lkdGggLyAxNS4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZik7DQorICAgICAgICBDRlhfUG9pbnRGIHB0MjsNCisgICAgICAgIHB0Mi5TZXQoZldpZHRoIC8gNC41ZiwgZkJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZik7DQorICAgICAgICBDRlhfUG9pbnRGIHB0MzsNCisgICAgICAgIHB0My5TZXQoZldpZHRoIC8gMy4wZiwgZkJvdHRvbSk7DQorICAgICAgICBDRlhfUG9pbnRGIHB0NDsNCisgICAgICAgIHB0NC5TZXQoZldpZHRoICogMTQgLyAxNS4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAxNSAvIDE2LjBmKTsNCisgICAgICAgIENGWF9Qb2ludEYgcHQ1Ow0KKyAgICAgICAgcHQ1LlNldChmV2lkdGggLyAzLjZmLCBmQm90dG9tICsgZkhlaWdodCAvIDMuNWYpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdDEyOw0KKyAgICAgICAgcHQxMi5TZXQoZldpZHRoIC8gNy4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNy4wZik7DQorICAgICAgICBDRlhfUG9pbnRGIHB0MjE7DQorICAgICAgICBwdDIxLlNldChmV2lkdGggLyA1LjBmLCBmQm90dG9tICsgZkhlaWdodCAvIDUuMGYpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdDIzOw0KKyAgICAgICAgcHQyMy5TZXQoZldpZHRoIC8gNC40ZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAwIC8gMTYuMGYpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdDMyOw0KKyAgICAgICAgcHQzMi5TZXQoZldpZHRoIC8gNC4wZiwgZkJvdHRvbSk7DQorICAgICAgICBDRlhfUG9pbnRGIHB0MzQ7DQorICAgICAgICBwdDM0LlNldChmV2lkdGggKiAoMSAvIDcuMGYgKyA3IC8gMTUuMGYpLCBmQm90dG9tICsgZkhlaWdodCAqIDQgLyA1LjBmKTsNCisgICAgICAgIENGWF9Qb2ludEYgcHQ0MzsNCisgICAgICAgIHB0NDMuU2V0KGZXaWR0aCAqICgxIC8gNy4wZiArIDcgLyAxNS4wZiksIGZCb3R0b20gKyBmSGVpZ2h0ICogNCAvIDUuMGYpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdDQ1Ow0KKyAgICAgICAgcHQ0NS5TZXQoZldpZHRoICogNyAvIDE1LjBmLCBmQm90dG9tICsgZkhlaWdodCAqIDggLyA3LjBmKTsNCisgICAgICAgIENGWF9Qb2ludEYgcHQ1NDsNCisgICAgICAgIHB0NTQuU2V0KGZXaWR0aCAvIDMuNGYsIGZCb3R0b20gKyBmSGVpZ2h0IC8gMy41Zik7DQorICAgICAgICBDRlhfUG9pbnRGIHB0NTE7DQorICAgICAgICBwdDUxLlNldChmV2lkdGggLyAzLjZmLCBmQm90dG9tICsgZkhlaWdodCAvIDQuMGYpOw0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdDE1Ow0KKyAgICAgICAgcHQxNS5TZXQoZldpZHRoIC8gMy41ZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAzLjVmIC8gNS4wZik7DQorICAgICAgICBtX3BDaGVja1BhdGgtPk1vdmVUbyhwdDEueCwgcHQxLnkpOw0KKyAgICAgICAgcHgxID0gcHQxMi54IC0gcHQxLng7DQorICAgICAgICBweTEgPSBwdDEyLnkgLSBwdDEueTsNCisgICAgICAgIHB4MiA9IHB0MjEueCAtIHB0Mi54Ow0KKyAgICAgICAgcHkyID0gcHQyMS55IC0gcHQyLnk7DQorICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0MS54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDEueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQyLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0Mi55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIueCwgcHQyLnkpOw0KKyAgICAgICAgcHgxID0gcHQyMy54IC0gcHQyLng7DQorICAgICAgICBweTEgPSBwdDIzLnkgLSBwdDIueTsNCisgICAgICAgIHB4MiA9IHB0MzIueCAtIHB0My54Ow0KKyAgICAgICAgcHkyID0gcHQzMi55IC0gcHQzLnk7DQorICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0Mi54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDIueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQzLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0My55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDMueCwgcHQzLnkpOw0KKyAgICAgICAgcHgxID0gcHQzNC54IC0gcHQzLng7DQorICAgICAgICBweTEgPSBwdDM0LnkgLSBwdDMueTsNCisgICAgICAgIHB4MiA9IHB0NDMueCAtIHB0NC54Ow0KKyAgICAgICAgcHkyID0gcHQ0My55IC0gcHQ0Lnk7DQorICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0My54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDMueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ0LnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0NC55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDQueCwgcHQ0LnkpOw0KKyAgICAgICAgcHgxID0gcHQ0NS54IC0gcHQ0Lng7DQorICAgICAgICBweTEgPSBwdDQ1LnkgLSBwdDQueTsNCisgICAgICAgIHB4MiA9IHB0NTQueCAtIHB0NS54Ow0KKyAgICAgICAgcHkyID0gcHQ1NC55IC0gcHQ1Lnk7DQorICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0NC54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDQueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ1LnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0NS55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDUueCwgcHQ1LnkpOw0KKyAgICAgICAgcHgxID0gcHQ1MS54IC0gcHQ1Lng7DQorICAgICAgICBweTEgPSBwdDUxLnkgLSBwdDUueTsNCisgICAgICAgIHB4MiA9IHB0MTUueCAtIHB0MS54Ow0KKyAgICAgICAgcHkyID0gcHQxNS55IC0gcHQxLnk7DQorICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0NS54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDUueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0MS55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDEueCwgcHQxLnkpOw0KKyAgICAgICAgRlhfRkxPQVQgZlNjYWxlID0gZkNoZWNrTGVuIC8gQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSDsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbXQ7DQorICAgICAgICBtdC5TZXQoMSwgMCwgMCwgMSwgMCwgMCk7DQorICAgICAgICBtdC5TY2FsZShmU2NhbGUsIGZTY2FsZSk7DQorICAgICAgICBDRlhfUGF0aERhdGEgKnBEYXRhID0gbV9wQ2hlY2tQYXRoLT5HZXRQYXRoRGF0YSgpOw0KKyAgICAgICAgcERhdGEtPlRyYW5zZm9ybSgmbXQpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jb21ib2JveHRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jb21ib2JveHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzIxODk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NvbWJvYm94dHAuY3BwCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQ29tYm9Gb3JtSGFuZGxlcgk4LjBmDQorQ0ZXTF9Db21ib0JveFRQOjpDRldMX0NvbWJvQm94VFAoKQ0KK3sNCisgICAgbV9kd1RoZW1lSUQgPSAwOw0KK30NCitDRldMX0NvbWJvQm94VFA6On5DRldMX0NvbWJvQm94VFAoKQ0KK3sNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0NvbWJvQm94Ow0KK30NCitGWF9CT09MCUNGV0xfQ29tYm9Cb3hUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCisgICAgc3dpdGNoKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgICAgIGNhc2UgRldMX1BBUlRfQ01CX0JvcmRlcjogew0KKyAgICAgICAgICAgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfQ01CX0VkZ2U6IHsNCisgICAgICAgICAgICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDogew0KKyAgICAgICAgICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgJiByZWN0ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgICAgICAgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yIGNyOw0KKyAgICAgICAgICAgICAgICBzd2l0Y2gocFBhcmFtcy0+bV9kd1N0YXRlcykgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9TZWxlY3RlZDoNCisgICAgICAgICAgICAgICAgICAgICAgICBjciA9IEZXTFRIRU1FX0NPTE9SX0JLU2VsZWN0ZWQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyID0gRldMVEhFTUVfQ09MT1JfRURHRVJCMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgY3IgPSAweEZGRkZGRkZGOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0NNQl9Ecm9wRG93bkJ1dHRvbjogew0KKyAgICAgICAgICAgICAgICBEcmF3RHJvcERvd25CdXR0b24ocFBhcmFtcywgcFBhcmFtcy0+bV9kd1N0YXRlcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXI6IHsNCisgICAgICAgICAgICAgICAgRHJhd1N0cmV0aEhhbmRsZXIocFBhcmFtcywgMCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hUUDo6RHJhd1N0cmV0aEhhbmRsZXIoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDEsDQorICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQorICAgIENGWF9Db2xvciBjcihBcmdiRW5jb2RlKDB4ZmYsIDB4ZmYsIDAsIDApKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KK30NCitGWF9MUFZPSUQgQ0ZXTF9Db21ib0JveFRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCit7DQorICAgIGlmIChkd0NhcGFjaXR5ID09IEZXTF9XR1RDQVBBQ0lUWV9DTUJfQ29tYm9Gb3JtSGFuZGxlcikgew0KKyAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9Db21ib0Zvcm1IYW5kbGVyOw0KKyAgICAgICAgcmV0dXJuICZtX2ZWYWx1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQorfQ0KKyNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCit2b2lkIENGV0xfQ29tYm9Cb3hUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBGWF9EV09SRCBkd1N0YXRlcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgICAgc3dpdGNoICggZHdTdGF0ZXMpIHsNCisgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOiB7DQorICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkOiB7DQorICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ01CX1ByZXNzZWQ6IHsNCisgICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfUHJlc3NlZDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9EaXNhYmxlZDogew0KKyAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBEcmF3QXJyb3dCdG4ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCit9DQorI2Vsc2UNCit2b2lkIENGV0xfQ29tYm9Cb3hUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBGWF9EV09SRCBkd1N0YXRlcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIEZYX0JPT0wgYlByZXNzZWQgPSAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfQ01CUEFSVFNUQVRFX1ByZXNzZWQpID09IEZXTF9DTUJQQVJUU1RBVEVfUHJlc3NlZCk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9ICBiUHJlc3NlZCA/IDEuMGYgOiAyLjBmOw0KKyAgICBGV0xUSEVNRV9FREdFIGVUeXBlID0gYlByZXNzZWQgPyBGV0xUSEVNRV9FREdFX0ZsYXQgOiBGV0xUSEVNRV9FREdFX1JhaXNlZDsNCisgICAgRHJhdzNEUmVjdChwUGFyYW1zLT5tX3BHcmFwaGljcywgZVR5cGUsIGZXaWR0aCwgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLCBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIxLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLCBwTWF0cml4KTsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCArIGZXaWR0aCwgcFBhcmFtcy0+bV9ydFBhcnQudG9wICsgZldpZHRoLCBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDIgKiBmV2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCAtIDIgKiBmV2lkdGgpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIEZYX0FSR0IgYXJnYkZpbGwgPSBBcmdiRW5jb2RlKDI1NSwgNzcsIDk3LCAxMzMpOw0KKyAgICBzd2l0Y2gocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCisgICAgICAgIGNhc2UgRldMX0NNQlBBUlRTVEFURV9Ob3JtYWw6IHsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9DTUJQQVJUU1RBVEVfSG92ZXJlZDogew0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX0NNQlBBUlRTVEFURV9QcmVzc2VkOiB7DQorICAgICAgICAgICAgICAgIGFyZ2JGaWxsID0gMHhGRjAwMDAwMDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX0Rpc2FibGVkOiB7DQorICAgICAgICAgICAgICAgIGFyZ2JGaWxsID0gMHhGRkYwRjBGMDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIERyYXdBcnJvdyhwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwgYXJnYkZpbGwsIGJQcmVzc2VkLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5NGVlOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9kYXRldGltZXBpY2tlcnRwLmNwcApAQCAtMCwwICsxLDEyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX0RhdGVUaW1lUGlja2VyVFA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpDQorew0KKyAgICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgRFRQVGhlbWVEYXRhOw0KKyAgICBpbml0VGhlbWVEYXRhKCk7DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6fkNGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpDQorew0KKyAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KK30NCitGWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KKyAgICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfRGF0ZVRpbWVQaWNrZXI7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlclRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgICBzd2l0Y2gocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9EVFBfQm9yZGVyOiB7DQorICAgICAgICAgICAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9EVFBfRWRnZTogew0KKyAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0RUUF9Ecm9wRG93bkJ1dHRvbjogew0KKyAgICAgICAgICAgICAgICBEcmF3RHJvcERvd25CdXR0b24ocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlclRQOjpEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBGWF9EV09SRCBkd1N0YXRlcyA9CXBQYXJhbXMtPm1fZHdTdGF0ZXM7DQorICAgIGR3U3RhdGVzICY9IDB4MDM7DQorICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgICAgc3dpdGNoIChlU3RhdGUgJiBkd1N0YXRlcykgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWw6IHsNCisgICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0hvdmVyZWQ6IHsNCisgICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfUHJlc3NlZDogew0KKyAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0Rpc2FibGVkOiB7DQorICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIERyYXdBcnJvd0J0bihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwgZVN0YXRlLCBwTWF0cml4KTsNCit9DQorI2Vsc2UNCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgRlhfQk9PTCBiUHJlc3NlZCA9ICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQpID09IEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQpOw0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSAgYlByZXNzZWQgPyAxLjBmIDogMi4wZjsNCisgICAgRldMVEhFTUVfRURHRSBlVHlwZSA9IGJQcmVzc2VkID8gRldMVEhFTUVfRURHRV9GbGF0IDogRldMVEhFTUVfRURHRV9SYWlzZWQ7DQorICAgIERyYXczRFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIGVUeXBlLCBmV2lkdGgsICZwUGFyYW1zLT5tX3J0UGFydCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBQYXJhbXMtPm1fcnRQYXJ0LmxlZnQgKyBmV2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LnRvcCArIGZXaWR0aCwgcFBhcmFtcy0+bV9ydFBhcnQud2lkdGggLSAyICogZldpZHRoLCBwUGFyYW1zLT5tX3J0UGFydC5oZWlnaHQgLSAyICogZldpZHRoKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9Db2xvciBjckZpbGwoRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgRlhfQVJHQiBhcmdiRmlsbCA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIHN3aXRjaChwUGFyYW1zLT5tX2R3U3RhdGVzICYgMHgwMykgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWw6IHsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0hvdmVyZWQ6IHsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQ6IHsNCisgICAgICAgICAgICAgICAgYXJnYkZpbGwgPSAweEZGMDAwMDAwOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0Rpc2FibGVkOiB7DQorICAgICAgICAgICAgICAgIGFyZ2JGaWxsID0gMHhGRkYwRjBGMDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIERyYXdBcnJvdyhwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwgYXJnYkZpbGwsIGJQcmVzc2VkLCBwTWF0cml4KTsNCit9DQorI2VuZGlmDQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OmluaXRUaGVtZURhdGEoKQ0KK3sNCisgICAgRlhfRFdPUkQgKnBEYXRhID0gKEZYX0RXT1JEKikmbV9wVGhlbWVEYXRhLT5Cb3hCa0NvbG9yOw0KKyAgICAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gMCwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZWRpdHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E5NmJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX0VkaXRUUDo6Q0ZXTF9FZGl0VFAoKQ0KK3sNCit9DQorQ0ZXTF9FZGl0VFA6On5DRldMX0VkaXRUUCgpDQorew0KK30NCitGWF9CT09MCUNGV0xfRWRpdFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9FZGl0Ow0KK30NCitGWF9CT09MCUNGV0xfRWRpdFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0VEVF9Cb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJiBwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9FRFRfRWRnZTogew0KKyAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0VEVF9CYWNrZ3JvdW5kOiB7DQorICAgICAgICAgICAgICAgIGlmIChwUGFyYW1zLT5tX3BQYXRoKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KKyAgICAgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yIGNyU2VsZWN0ZWQoRldMX0dldFRoZW1lQ29sb3IobV9kd1RoZW1lSUQpID09IDAgPyBGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkIDogRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCk7DQorICAgICAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JTZWxlY3RlZCk7DQorICAgICAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKHBQYXJhbXMtPm1fcFBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhdGljID0gcFBhcmFtcy0+bV9kd0RhdGEgPT0gRldMX1BBUlREQVRBX0VEVF9TdGF0aWNCYWNrZ3JvdW5kOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgICAgICAgICAgICAgICAgIHBhdGguQ3JlYXRlKCk7DQorICAgICAgICAgICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUGFyYW1zLT5tX3J0UGFydC5sZWZ0LCBwUGFyYW1zLT5tX3J0UGFydC50b3AsIHBQYXJhbXMtPm1fcnRQYXJ0LndpZHRoLCBwUGFyYW1zLT5tX3J0UGFydC5oZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yIGNyKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiU3RhdGljKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9FRFRfRGlzYWJsZSkgPT0gRldMX1BBUlRTVEFURV9FRFRfRGlzYWJsZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjci5TZXQoRldMVEhFTUVfQ09MT1JfRURHRVJCMSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9FRFRfUmVhZE9ubHkpID09IEZXTF9QQVJUU1RBVEVfRURUX1JlYWRPbmx5KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyLlNldChBcmdiRW5jb2RlKDI1NSwgMjM2LCAyMzMsIDIxNikpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyLlNldCgweEZGRkZGRkZGKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0VEVF9Db21iVGV4dExpbmU6IHsNCisgICAgICAgICAgICAgICAgRlhfQVJHQiBjciA9IDB4RkYwMDAwMDA7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDEuMGY7DQorICAgICAgICAgICAgICAgIENGWF9Db2xvciBjckxpbmUoY3IpOw0KKyAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyTGluZSk7DQorICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoZldpZHRoKTsNCisgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgocFBhcmFtcy0+bV9wUGF0aCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9FZGl0VFA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgSW5pdFRUTygpOw0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUNGV0xfRWRpdFRQOjpGaW5hbGl6ZSgpDQorew0KKyAgICBGaW5hbGl6ZVRUTygpOw0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2Zvcm10cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY2MzNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2Zvcm10cC5jcHAKQEAgLTAsMCArMSw3OTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEZvcm1Cb3JkZXIJCTMNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0NZRm9ybUJvcmRlcgkJMw0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQ1lOYXJyb3dDYXB0aW9uCTE4DQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24JCQkyOQ0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQmlnSWNvblNpemUJCTMyDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9TbWFsbEljb25TaXplCQkxNg0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfRm9ybVRleHRDb2xvcgkJMHhGRkZGRkZGRg0KKyNkZWZpbmUgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4JCQkJNQ0KKyNkZWZpbmUgRldMVEhFTUVfRk9STUJUTl9TcGFuCQkJCTINCisjZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZQkJCQkyMQ0KK0NGV0xfRm9ybVRQOjpDRldMX0Zvcm1UUCgpDQorICAgIDogbV9wQWN0aXZlQml0bWFwKE5VTEwpDQorICAgICwgbV9wRGVhY3RpdmViaXRtYXAoTlVMTCkNCit7DQorICAgIG1fcFRoZW1lRGF0YSA9IEZYX05FVyBTQlRoZW1lRGF0YTsNCisgICAgU2V0VGhlbWVEYXRhKDApOw0KKyAgICBtX3J0RGlzTEJvcmRlci5SZXNldCgpOw0KKyAgICBtX3J0RGlzUkJvcmRlci5SZXNldCgpOw0KKyAgICBtX3J0RGlzQkJvcmRlci5SZXNldCgpOw0KKyAgICBtX3J0RGlzQ2FwdGlvbi5SZXNldCgpOw0KK30NCitDRldMX0Zvcm1UUDo6fkNGV0xfRm9ybVRQKCkNCit7DQorICAgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BUaGVtZURhdGE7DQorICAgICAgICBtX3BUaGVtZURhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Gb3JtVFA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgSW5pdFRUTygpOw0KKyAgICBJbml0Q2FwdGlvbihUUlVFKTsNCisgICAgSW5pdENhcHRpb24oRkFMU0UpOw0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUNGV0xfRm9ybVRQOjpGaW5hbGl6ZSgpDQorew0KKyAgICBGaW5hbGl6ZVRUTygpOw0KKyAgICBpZiAobV9wQWN0aXZlQml0bWFwKSB7DQorICAgICAgICBkZWxldGUgbV9wQWN0aXZlQml0bWFwOw0KKyAgICAgICAgbV9wQWN0aXZlQml0bWFwID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wRGVhY3RpdmViaXRtYXApIHsNCisgICAgICAgIGRlbGV0ZSBtX3BEZWFjdGl2ZWJpdG1hcDsNCisgICAgICAgIG1fcERlYWN0aXZlYml0bWFwID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQorRlhfQk9PTAlDRldMX0Zvcm1UUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KKyAgICBGWF9EV09SRCBkd0hhc2ggPSBwV2lkZ2V0LT5HZXRDbGFzc0lEKCk7DQorICAgIHJldHVybiBkd0hhc2ggPT0gRldMX0NMQVNTSEFTSF9Gb3JtOw0KK30NCitGWF9EV09SRCBDRldMX0Zvcm1UUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiApDQorew0KKyAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgICAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorICAgIH0NCisgICAgSW5pdENhcHRpb24oVFJVRSk7DQorICAgIEluaXRDYXB0aW9uKEZBTFNFKTsNCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KK30NCitGWF9CT09MIENGV0xfRm9ybVRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgICBGWF9JTlQzMiBpQWN0aXZlID0gMDsNCisgICAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0ZSTV9JbmFjdGl2ZSkgew0KKyAgICAgICAgaUFjdGl2ZSA9IDE7DQorICAgIH0NCisgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KKyAgICBzd2l0Y2ggKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAweDAzKSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRlJNX0hvdmVyOiB7DQorICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRlJNX1ByZXNzZWQ6IHsNCisgICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfUHJlc3NlZDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDogew0KKyAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBzd2l0Y2gocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fQm9yZGVyOiB7DQorICAgICAgICAgICAgICAgIERyYXdGb3JtQm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fRWRnZTogew0KKyAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9CYWNrZ3JvdW5kOiB7DQorICAgICAgICAgICAgICAgIEZpbGxCYWNrZ3JvdW5kKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX0NhcHRpb246IHsNCisgICAgICAgICAgICAgICAgRHJhd0NhcHRpb24ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9OYXJyb3dDYXB0aW9uOiB7DQorICAgICAgICAgICAgICAgIERyYXdOYXJyb3dDYXB0aW9uKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g6IHsNCisgICAgICAgICAgICAgICAgRHJhd0Nsb3NlQm94KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3g6IHsNCisgICAgICAgICAgICAgICAgRHJhd01pbmltaXplQm94KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3g6IHsNCisgICAgICAgICAgICAgICAgRHJhd01heGltaXplQm94KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwgcFBhcmFtcy0+bV9kd0RhdGEsICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX0ljb246IHsNCisgICAgICAgICAgICAgICAgRHJhd0ljb25JbWFnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wSW1hZ2UsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfRm9ybVRQOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KKyAgICBpZiAocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9GUk1fQ2FwdGlvbikgew0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkZGRkZGRkYpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkYwMDAwMDApOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpEcmF3VGV4dChwUGFyYW1zKTsNCit9DQorRlhfTFBWT0lEIENGV0xfRm9ybVRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCit7DQorICAgIEZYX0JPT0wgYkRlZlBybyA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGJEd29yZFZhbCA9IEZBTFNFOw0KKyAgICBzd2l0Y2goZHdDYXBhY2l0eSkgew0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEZvcm1Cb3JkZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1lGb3JtQm9yZGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lDYXB0aW9uOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lOYXJyb3dDYXB0aW9uOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3I6IHsNCisgICAgICAgICAgICAgICAgYkR3b3JkVmFsID0gVFJVRTsNCisgICAgICAgICAgICAgICAgbV9kd1ZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfRm9ybVRleHRDb2xvcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0JpZ0ljb246IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9CaWdJY29uU2l6ZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX1NtYWxsSWNvbjogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX1NtYWxsSWNvblNpemU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgYkRlZlBybyA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkRlZlBybykgew0KKyAgICAgICAgaWYgKGJEd29yZFZhbCkgew0KKyAgICAgICAgICAgIHJldHVybiAmbV9kd1ZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuICZtX2ZWYWx1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Gb3JtVFA6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYmIHJ0UGFydCkNCit7DQorICAgIHN3aXRjaChwVGhlbWVQYXJ0LT5tX2lQYXJ0KSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9DbG9zZUJveDogew0KKyAgICAgICAgICAgICAgICBDYWxDbG9zZUJveChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQsIHJ0UGFydCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX01heGltaXplQm94OiB7DQorICAgICAgICAgICAgICAgIENhbE1heEJveChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQsIHJ0UGFydCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX01pbmltaXplQm94OiB7DQorICAgICAgICAgICAgICAgIENhbE1pbkJveChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQsIHJ0UGFydCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX0hlYWRUZXh0OiB7DQorICAgICAgICAgICAgICAgIENhbENhcHRpb24ocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9JY29uOiB7DQorICAgICAgICAgICAgICAgIENhbEljb24ocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6Q2FsQ2xvc2VCb3goSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCkNCit7DQorICAgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFdpZGdldC0+R2V0U3R5bGVzKCk7DQorICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIHJ0V2lkZ2V0Lk9mZnNldCgtcnRXaWRnZXQubGVmdCwgLXJ0V2lkZ2V0LnRvcCk7DQorICAgIGlmIChkd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9DbG9zZUJveCkgew0KKyAgICAgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TcGFuLA0KKyAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUsDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TcGFuLA0KKyAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQorICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgMCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0Zvcm1UUDo6Q2FsTWF4Qm94KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IHBXaWRnZXQtPkdldFN0eWxlcygpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgICBpZiAoZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWF4aW1pemVCb3gpIHsNCisgICAgICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSArIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiAqIDIsDQorICAgICAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSwNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0LlNldChydFdpZGdldC5sZWZ0ICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKyBGV0xUSEVNRV9GT1JNQlROX1NpemUgKyBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAyLA0KKyAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQorICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgMCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0Zvcm1UUDo6Q2FsTWluQm94KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IHBXaWRnZXQtPkdldFN0eWxlcygpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgICBpZiAoZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWluaW1pemVCb3gpIHsNCisgICAgICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSAqIDIgKyBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAzLA0KKyAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUsDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TaXplICogMiArIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiAqIDMsDQorICAgICAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwNCisgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAwKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpDYWxDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgICByZWN0LlNldChydFdpZGdldC5sZWZ0ICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQorICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luIC0gMiwNCisgICAgICAgICAgICAgcnRXaWRnZXQud2lkdGggLSBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiAqIDIsDQorICAgICAgICAgICAgIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSArIDIgKiBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIDQpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpDYWxJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3Rm9ybUJvcmRlcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBGWF9JTlQzMiBpQWN0aXZlKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICBydC5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIDEsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICBGWF9GTE9BVCBmQm90dG9tLCBmUmlnaHQ7DQorICAgIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICAgIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY2xyTGluZTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCk7DQorICAgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0LCBmQm90dG9tIC0gMSk7DQorICAgIHBhdGguTGluZVRvKGZSaWdodCAtIDEsIGZCb3R0b20gLSAxKTsNCisgICAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMSwgcFJlY3QtPnRvcCk7DQorICAgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bMl07DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpbmUpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguTW92ZVRvKHBSZWN0LT5sZWZ0ICsgMSwgcFJlY3QtPnRvcCk7DQorICAgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIpOw0KKyAgICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAyLCBmQm90dG9tIC0gMik7DQorICAgIHBhdGguTGluZVRvKGZSaWdodCAtIDIsIHBSZWN0LT50b3ApOw0KKyAgICBjbHJMaW5lID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyW2lBY3RpdmVdWzFdOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCArIDIsIHBSZWN0LT50b3ApOw0KKyAgICBwYXRoLkxpbmVUbyhwUmVjdC0+bGVmdCArIDIsIGZCb3R0b20gLSAzKTsNCisgICAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMywgZkJvdHRvbSAtIDMpOw0KKyAgICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAzLCBwUmVjdC0+dG9wKTsNCisgICAgY2xyTGluZSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlcltpQWN0aXZlXVswXTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5Nb3ZlVG8ocFJlY3QtPmxlZnQgKyAzLCBwUmVjdC0+dG9wKTsNCisgICAgcGF0aC5MaW5lVG8ocFJlY3QtPmxlZnQgKyAzLCBmQm90dG9tIC0gNCk7DQorICAgIHBhdGguTGluZVRvKGZSaWdodCAtIDQsIGZCb3R0b20gLSA0KTsNCisgICAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gNCwgcFJlY3QtPnRvcCk7DQorICAgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bNF07DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpbmUpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBtX3J0RGlzTEJvcmRlci5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AgKyAyOSwgNCwgcFJlY3QtPmhlaWdodCAtIDI5KTsNCisgICAgbV9ydERpc1JCb3JkZXIuU2V0KHBSZWN0LT5yaWdodCgpIC0gNCwgcFJlY3QtPnRvcCArIDI5LCA0LCBwUmVjdC0+aGVpZ2h0IC0gMjkpOw0KKyAgICBtX3J0RGlzQkJvcmRlci5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT5ib3R0b20oKSAtIDQsIHBSZWN0LT53aWR0aCwgNCk7DQorICAgIG1fcnREaXNDYXB0aW9uLlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCAyOSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdDYXB0aW9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBGWF9JTlQzMiBpQWN0aXZlKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICBGWF9GTE9BVCAgZkJvdHRvbSwgZlJpZ2h0Ow0KKyAgICBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgICBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgICAgcnQuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIDEpOw0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVswXSwgJnJ0LCBwTWF0cml4KTsNCisgICAgcnQuT2Zmc2V0KDAsIDEpOw0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVsxXSwgJnJ0LCBwTWF0cml4KTsNCisgICAgcnQuT2Zmc2V0KDAsIDEpOw0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVsyXSwgJnJ0LCBwTWF0cml4KTsNCisgICAgcnQuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+Ym90dG9tKCkgLSAxLCBwUmVjdC0+d2lkdGgsIDEpOw0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVtpQWN0aXZlXVsyXSwgJnJ0LCBwTWF0cml4KTsNCisgICAgcnQuT2Zmc2V0KDAsIC0xKTsNCisgICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21baUFjdGl2ZV1bMV0sICZydCwgcE1hdHJpeCk7DQorICAgIHJ0LlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7DQorICAgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFtpQWN0aXZlXVsyXSwgJnJ0LCBwTWF0cml4KTsNCisgICAgcnQuU2V0KHBSZWN0LT5sZWZ0ICsgMSwgcFJlY3QtPnRvcCArIDEsIDEsIGZCb3R0b20gLSAxKTsNCisgICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0W2lBY3RpdmVdWzFdLCAmcnQsIHBNYXRyaXgpOw0KKyAgICBydC5TZXQocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgMSwgZkJvdHRvbSAtIDIpOw0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbaUFjdGl2ZV1bMF0sICZydCwgcE1hdHJpeCk7DQorICAgIHJ0LlNldChmUmlnaHQgLSAxLCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0W2lBY3RpdmVdWzJdLCAmcnQsIHBNYXRyaXgpOw0KKyAgICBydC5TZXQoZlJpZ2h0IC0gMiwgcFJlY3QtPnRvcCArIDEsIDEsIGZCb3R0b20gLSAxKTsNCisgICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFtpQWN0aXZlXVsxXSwgJnJ0LCBwTWF0cml4KTsNCisgICAgcnQuU2V0KGZSaWdodCAtIDMsIHBSZWN0LT50b3AgKyAyLCAxLCBmQm90dG9tIC0gMik7DQorICAgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbaUFjdGl2ZV1bMF0sICZydCwgcE1hdHJpeCk7DQorICAgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQorICAgIHJlY3QuU2V0KHJlY3QubGVmdCArIDMsIHJlY3QudG9wICsgMywgcmVjdC53aWR0aCAtIDYsIHJlY3QuaGVpZ2h0IC0gNSk7DQorICAgIGlmIChpQWN0aXZlID09IDApIHsNCisgICAgICAgIHBHcmFwaGljcy0+U3RyZXRjaEltYWdlKG1fcEFjdGl2ZUJpdG1hcCwgcmVjdCwgcE1hdHJpeCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwR3JhcGhpY3MtPlN0cmV0Y2hJbWFnZShtX3BEZWFjdGl2ZWJpdG1hcCwgcmVjdCwgcE1hdHJpeCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX0Zvcm1UUDo6RHJhd05hcnJvd0NhcHRpb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIEZYX0lOVDMyIGlBY3RpdmUpDQorew0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3Q2xvc2VCb3goQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIEZYX0lOVDMyIGlBY3RpdmUpDQorew0KKyAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gcFJlY3QtPndpZHRoOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfUmVjdEYgcnQoKnBSZWN0KTsNCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMS4wZik7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AsIGZXaWR0aCAtIDIsIDEpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDEsIHJ0LnRvcCArIDEsIDEsIGZIZWlnaHQgLSAyKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIGZCb3R0b20gLSAxLCBmV2lkdGggLSAyLCAxKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbDsNCisgICAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0W2lBY3RpdmVdOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AgKyAxLCAxLCAxKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgcnQudG9wICsgMSwgMSwgMSk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBmQm90dG9tIC0gMiwgMSwgMSk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIGZCb3R0b20gLSAyLCAxLCAxKTsNCisgICAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFtpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMiwgcnQudG9wICsgMSwgZldpZHRoIC0gNCwgMSk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AgKyAyLCAxLCBmSGVpZ2h0IC0gNCk7DQorICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFtpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAyLCBydC50b3AgKyAyLCAxLCBmSGVpZ2h0IC0gNCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAyLCBmQm90dG9tIC0gMiwgZldpZHRoIC0gNCwgMSk7DQorICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrW2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMiwgcFJlY3QtPnRvcCArIDIsIGZXaWR0aCAtIDQsIGZIZWlnaHQgLSA0KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmxlZnQgKyAyLA0KKyAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyAyLA0KKyAgICAgICAgICAgICAgICAgICAgIGZSaWdodCAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgZkJvdHRvbSAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFtpQWN0aXZlXVtlU3RhdGUgLSAxXSwNCisgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFtpQWN0aXZlXVtlU3RhdGUgLSAxXSwNCisgICAgICAgICAgICAgICAgICAgICAmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBDRlhfUmVjdEYgcnRYKCpwUmVjdCk7DQorICAgIHJ0WC5JbmZsYXRlKC01LCAtNSk7DQorICAgIEZYX0ZMT0FUIGZSID0gcnRYLnJpZ2h0KCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgRlhfRkxPQVQgZnJ0WFJpZ2h0ID0gcnRYLnJpZ2h0KCk7DQorICAgIEZYX0ZMT0FUIGZydFhCb3R0b20gPSBydFguYm90dG9tKCk7DQorICAgIHBhdGguQWRkTGluZShydFgubGVmdCwgcnRYLnRvcCArIDEsIGZydFhSaWdodCAtIDEsIGZydFhCb3R0b20pOw0KKyAgICBwYXRoLkFkZExpbmUocnRYLmxlZnQsIHJ0WC50b3AsIGZydFhSaWdodCwgZnJ0WEJvdHRvbSk7DQorICAgIHBhdGguQWRkTGluZShydFgubGVmdCArIDEsIHJ0WC50b3AsIGZydFhSaWdodCwgZnJ0WEJvdHRvbSAtIDEpOw0KKyAgICBwYXRoLkFkZExpbmUocnRYLmxlZnQsIGZydFhCb3R0b20gLSAxLCBmcnRYUmlnaHQgLSAxLCBydFgudG9wKTsNCisgICAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0LCBmcnRYQm90dG9tLCBmcnRYUmlnaHQsIHJ0WC50b3ApOw0KKyAgICBwYXRoLkFkZExpbmUocnRYLmxlZnQgKyAxLCBmcnRYQm90dG9tLCBmcnRYUmlnaHQsIHJ0WC50b3AgKyAxKTsNCisgICAgQ0ZYX0NvbG9yIGNsckxpbmUoMHhmZmZmZmZmZik7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3TWluTWF4Qm94Q29tbW9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBGWF9JTlQzMiBpQWN0aXZlKQ0KK3sNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gcFJlY3QtPndpZHRoOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgICAgQ0ZYX1JlY3RGIHJ0KCpwUmVjdCk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wLCBmV2lkdGggLSAyLCAxKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAxLCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBmQm90dG9tIC0gMSwgZldpZHRoIC0gMiwgMSk7DQorICAgIENGWF9Db2xvciBjckZpbGw7DQorICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFtpQWN0aXZlXTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wICsgMSwgMSwgMSk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDEsIDEsIDEpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAyLCBmQm90dG9tIC0gMiwgMSwgMSk7DQorICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIHJ0LnRvcCArIDEsIGZXaWR0aCAtIDQsIDEpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wICsgMiwgMSwgZkhlaWdodCAtIDQpOw0KKyAgICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0W2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDIsIDEsIGZIZWlnaHQgLSA0KTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIGZCb3R0b20gLSAyLCBmV2lkdGggLSA0LCAxKTsNCisgICAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrW2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgZldpZHRoIC0gNCwgZkhlaWdodCAtIDQpOw0KKyAgICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+bGVmdCArIDIsDQorICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDIsDQorICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0IC0gMiwNCisgICAgICAgICAgICAgICAgICAgICBmQm90dG9tIC0gMiwNCisgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFtpQWN0aXZlXVtlU3RhdGUgLSAxXSwNCisgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sDQorICAgICAgICAgICAgICAgICAgICAgJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6RHJhd01pbmltaXplQm94KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBGWF9JTlQzMiBpQWN0aXZlKQ0KK3sNCisgICAgRHJhd01pbk1heEJveENvbW1vbihwR3JhcGhpY3MsIHBSZWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KKyAgICBDRlhfUmVjdEYgcnRNaW47DQorICAgIHJ0TWluLlNldChwUmVjdC0+bGVmdCArIDUsIHBSZWN0LT50b3AgKyAxMywgcFJlY3QtPndpZHRoIC0gMTQsIHBSZWN0LT5oZWlnaHQgLSAxOCk7DQorICAgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCAweEZGRkZGRkZGLCAmcnRNaW4sIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3TWF4aW1pemVCb3goQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYk1heCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgRlhfSU5UMzIgaUFjdGl2ZSkNCit7DQorICAgIERyYXdNaW5NYXhCb3hDb21tb24ocEdyYXBoaWNzLCBwUmVjdCwgZVN0YXRlLCBwTWF0cml4KTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gcFJlY3QtPndpZHRoOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgICAgaWYgKGJNYXgpIHsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgNywgcFJlY3QtPnRvcCArIDYsIHBSZWN0LT5sZWZ0ICsgMTQsIHBSZWN0LT50b3AgKyA2KTsNCisgICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDQsIHBSZWN0LT50b3AgKyA5LCBwUmVjdC0+bGVmdCArIDExLCBwUmVjdC0+dG9wICsgOSk7DQorICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgyKTsNCisgICAgICAgIENGWF9Db2xvciBjclN0cm9rZSgweEZGRkZGRkZGKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsNCisgICAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsNCisgICAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDQsIHBSZWN0LT50b3AgKyAxMCwgcFJlY3QtPmxlZnQgKyA0LCBwUmVjdC0+dG9wICsgMTQpOw0KKyAgICAgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgMTAsIHBSZWN0LT50b3AgKyAxMCwgcFJlY3QtPmxlZnQgKyAxMCwgcFJlY3QtPnRvcCArIDE0KTsNCisgICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDEzLCBwUmVjdC0+dG9wICsgNywgcFJlY3QtPmxlZnQgKyAxMywgcFJlY3QtPnRvcCArIDExKTsNCisgICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDQsIHBSZWN0LT50b3AgKyAxNCwgcFJlY3QtPmxlZnQgKyAxMCwgcFJlY3QtPnRvcCArIDE0KTsNCisgICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDEyLCBwUmVjdC0+dG9wICsgMTEsIHBSZWN0LT5sZWZ0ICsgMTIsIHBSZWN0LT50b3AgKyAxMSk7DQorICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0TWF4KCpwUmVjdCk7DQorICAgICAgICBydE1heC5JbmZsYXRlKC01LCAtNSk7DQorICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgNSwgcFJlY3QtPnRvcCArIDUsIGZXaWR0aCAtIDEwLCBmSGVpZ2h0IC0gMTApOw0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyA2LCBwUmVjdC0+dG9wICsgOCwgZldpZHRoIC0gMTIsIGZIZWlnaHQgLSAxNCk7DQorICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBDRlhfQ29sb3IgY3JGaWxsKDB4RkZGRkZGRkYpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBDRlhfRElCaXRtYXAgKnBESUJpdG1hcCwgIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIEZYX0lOVDMyIGlBY3RpdmUpDQorew0KKyAgICBwR3JhcGhpY3MtPlN0cmV0Y2hJbWFnZShwRElCaXRtYXAsICpwUmVjdCwgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKQ0KK3sNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlID0gQXJnYkVuY29kZSgweDY1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQwLCAxNjYsIDE0OCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMjgsIDYxLCA1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAxODQsIDE3Nik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyNTIsIDEwNywgNzEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDQ0LCAyMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMDIsIDcyLCAzMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAxMjIsIDEwNyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMTgsIDc3LCA1NCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCA5MywgNzQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjE4LCA3NCwgNTEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5MSwgNjEsIDI4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDkzLCAzMCwgMTMpOw0KKyAgICBpZiAoZHdJRCkgew0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MCwgMTg0LCAxMzEpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2OCwgMTgyLCAxMjgpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExNywgMTQxLCA5NCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTM5LCAxNjEsIDEwNSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTcxLCAxODksIDEzMyk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NSwgMTc1LCAxMjUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxMjgsIDE0NiwgMTAzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgOTQsIDExOCwgNzkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTM5LCAxNjEsIDEwNSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMzQsIDI0NSwgMjAxKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTc1LCAxODksIDEzMyApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTUzLCAxNjgsIDEyMSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNTAsIDE2OCwgMTAzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxODIsIDE5NSwgMTYyKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxNDQsIDg0KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMzQsIDI0MSwgMjA4KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY5LCAxODYsIDExMik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTk5LCAxOTksIDE5MCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzMywgMTQ4LCA4OCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNjMsIDE3NiwgMTM3KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTE4LCAxMzUsIDgzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NCwgMTc0LCAxMDUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNTQsIDE3NCwgMTA1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MiwgMTkzLCAxMjMpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNTQsIDE3NCwgMTA1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyMCwgMjIwLCAyMjApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMjUsIDIyNSwgMjI1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExNywgMTQxLCA5NCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzOSwgMTYxLCAxMDUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNzEsIDE4OSwgMTMzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY0LCAxNzgsIDEyNyk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MSwgMTg5LCAxMzMpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDMsIDExNCwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NSwgMjI2KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NSwgMjI2KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzNdID0gQXJnYkVuY29kZSgweGZmLCAzLCAxMTQsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMzIsIDIwMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNjEsIDIyMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNTQsIDIxMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDU2LCAyMzQpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA1MCwgMTkzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTksIDEzOSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4OCwgMjM4KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYzLCAxNTEsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAzLCAxMTQsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA5NiwgMjUyKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYzLCAxNTEsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA2NywgMjA3KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA0OSwgMTEyKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgODcsIDE4OCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU0LCAxODMsIDI1MCApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNywgMTEwLCAyNDgpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTk0LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyOSwgMTU4LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjgsIDEyMCwgMjQ1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQsIDcyLCAxODcpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNzIsIDEyMiwgMjQ1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMzUsIDg3LCAxOTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjAsIDExNCwgMjQ0KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjEsIDcwLCAxODUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjIwLCAyMjAsIDIyMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyNSwgMjI1LCAyMjUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNzIsIDI0MSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDYxLCAyMjApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCAzMCwgMTYwKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTksIDE0MCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyLCAxMDYsIDIzOSk7DQorICAgIH0NCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzFdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzFdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzBdWzBdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzBdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMV07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMV07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1swXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVswXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bM10gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVszXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVswXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzBdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMV07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzFdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzFdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzJdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzBdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMV07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsxXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMV07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsxXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMl07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzFdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsyXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzFdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF07DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVsxXTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bM10gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bM107DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVs0XSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVs0XTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMV0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFswXTsNCisgICAgRGVhY3RpdmVGb3JtKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRlYWN0aXZlRm9ybSgpDQorew0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzBdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsxXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzNdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFsxXVswXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMV0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMF0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFsxXVsxXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzBdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzBdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVswXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMV0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFsxXVsxXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzBdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMV1bMF0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsxXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzBdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzJdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMV0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVswXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMl0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVszXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzRdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFsxXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVswXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVsxXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVsyXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMF0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVsyXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzBdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMV0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsyXSk7DQorICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMF0pOw0KKyAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzFdWzFdKTsNCisgICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVsyXSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OlRyYW5zTW9kZUNvbG9yKEZYX0FSR0IgY2xyRm9yZSwgRlhfQVJHQiAmY2xyQmFjaykNCit7DQorICAgIEZYX0lOVDMyIGlBbGZhRiwgaVJGLCBpR0YsIGlCRjsNCisgICAgRlhfSU5UMzIgaUFsZmFCLCBpUkIsIGlHQiwgaUJCOw0KKyAgICBBcmdiRGVjb2RlKGNsckZvcmUsIGlBbGZhRiwgaVJGLCBpR0YsIGlCRik7DQorICAgIEFyZ2JEZWNvZGUoY2xyQmFjaywgaUFsZmFCLCBpUkIsIGlHQiwgaUJCKTsNCisgICAgY2xyQmFjayA9IEFyZ2JFbmNvZGUoMHhmZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaVJCICsgKGlSRiAtIGlSQikgKiBpQWxmYUYgLyAyNTUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGlHQiArIChpR0YgLSBpR0IpICogaUFsZmFGIC8gMjU1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpQkIgKyAoaUJGIC0gaUJCKSAqIGlBbGZhRiAvIDI1NSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkluaXRDYXB0aW9uKEZYX0JPT0wgYkFjdGl2ZSkNCit7DQorICAgIGlmIChiQWN0aXZlKSB7DQorICAgICAgICBDRlhfRnhnZURldmljZSBkZXY7DQorICAgICAgICBDRlhfR3JhcGhpY3MgZ3M7DQorICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICAgIGlmIChtX3BBY3RpdmVCaXRtYXApIHsNCisgICAgICAgICAgICBkZWxldGUgbV9wQWN0aXZlQml0bWFwOw0KKyAgICAgICAgICAgIG1fcEFjdGl2ZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBtX3BBY3RpdmVCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgbV9wQWN0aXZlQml0bWFwLT5DcmVhdGUoMSwgRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uLCBGWERJQl9BcmdiKTsNCisgICAgICAgIGRldi5BdHRhY2gobV9wQWN0aXZlQml0bWFwKTsNCisgICAgICAgIGdzLkNyZWF0ZSgmZGV2KTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDAsIDEsIDUpOw0KKyAgICAgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDAsIDAsIDUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzBdLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXSwgJnBhdGgpOw0KKyAgICAgICAgcGF0aC5DbGVhcigpOw0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgNSwgMSwgMTUpOw0KKyAgICAgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDUsIDAsIDIwLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl0sICZwYXRoKTsNCisgICAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDIwLCAxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24gLSAxOSk7DQorICAgICAgICBEcmF3QXhpYWxTaGFkaW5nKCZncywgMCwgMjAsIDAsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl0sIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzNdLCAmcGF0aCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfRnhnZURldmljZSBkZXY7DQorICAgICAgICBDRlhfR3JhcGhpY3MgZ3M7DQorICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICAgIGlmIChtX3BEZWFjdGl2ZWJpdG1hcCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BEZWFjdGl2ZWJpdG1hcDsNCisgICAgICAgICAgICBtX3BEZWFjdGl2ZWJpdG1hcCA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBtX3BEZWFjdGl2ZWJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7DQorICAgICAgICBtX3BEZWFjdGl2ZWJpdG1hcC0+Q3JlYXRlKDEsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiwgRlhESUJfQXJnYik7DQorICAgICAgICBkZXYuQXR0YWNoKG1fcERlYWN0aXZlYml0bWFwKTsNCisgICAgICAgIGdzLkNyZWF0ZSgmZGV2KTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDAsIDEsIDUpOw0KKyAgICAgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDAsIDAsIDUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzBdLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsxXSwgJnBhdGgpOw0KKyAgICAgICAgcGF0aC5DbGVhcigpOw0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgNSwgMSwgMTUpOw0KKyAgICAgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDUsIDAsIDIwLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsxXSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0sICZwYXRoKTsNCisgICAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDIwLCAxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24gLSAxOSk7DQorICAgICAgICBEcmF3QXhpYWxTaGFkaW5nKCZncywgMCwgMjAsIDAsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0sIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzNdLCAmcGF0aCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvbGlzdGJveHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjIzNTA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitDRldMX0xpc3RCb3hUUDo6Q0ZXTF9MaXN0Qm94VFAoKQ0KK3sNCit9DQorQ0ZXTF9MaXN0Qm94VFA6On5DRldMX0xpc3RCb3hUUCgpDQorew0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9MaXN0Qm94Ow0KK30NCitGWF9CT09MCUNGV0xfTGlzdEJveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgICBzd2l0Y2gocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9MVEJfQm9yZGVyOiB7DQorICAgICAgICAgICAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9MVEJfRWRnZTogew0KKyAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0xUQl9CYWNrZ3JvdW5kOiB7DQorICAgICAgICAgICAgICAgIEZpbGxTb2lsZFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBpZiAocFBhcmFtcy0+bV9wRGF0YSkgew0KKyAgICAgICAgICAgICAgICAgICAgRmlsbFNvaWxkUmVjdChwUGFyYW1zLT5tX3BHcmFwaGljcywgRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCwgKENGWF9SZWN0RiopcFBhcmFtcy0+bV9wRGF0YSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX0xUQl9MaXN0SXRlbTogew0KKyAgICAgICAgICAgICAgICBEcmF3TGlzdEJveEl0ZW0ocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsICZwUGFyYW1zLT5tX3J0UGFydCwgcFBhcmFtcy0+bV9wRGF0YSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9MVEJfSWNvbjogew0KKyAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3RyZXRjaEltYWdlKHBQYXJhbXMtPm1fcEltYWdlLCBwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9MVEJfQ2hlY2s6IHsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IgPSAweEZGMDAwMDAwOw0KKyAgICAgICAgICAgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyA9PSBGV0xfUEFSVFNUQVRFX0xUQl9DaGVja2VkKSB7DQorICAgICAgICAgICAgICAgICAgICBjb2xvciA9IDB4RkZGRjAwMDA7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyA9PSBGV0xfUEFSVFNUQVRFX0xUQl9VbkNoZWNrZWQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gMHhGRjAwMDBGRjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGaWxsU29pbGRSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBjb2xvciwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9MaXN0Qm94VFA6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgSW5pdFRUTygpOw0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSCUNGV0xfTGlzdEJveFRQOjpGaW5hbGl6ZSgpDQorew0KKyAgICBGaW5hbGl6ZVRUTygpOw0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hUUDo6RHJhd0xpc3RCb3hJdGVtKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9EV09SRCBkd1N0YXRlcywgY29uc3QgQ0ZYX1JlY3RGICpwcnRJdGVtLCBGWF9MUFZPSUQgcERhdGEgLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIGlmIChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQorICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBDRlhfQ29sb3IgY3JGaWxsKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSA9PSAwID8gRldMVEhFTUVfQ09MT1JfQktTZWxlY3RlZCA6IEZXTFRIRU1FX0NPTE9SX0dyZWVuX0JLU2VsZWN0ZWQpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgICAgICBDRlhfUmVjdEYgcnQoKnBydEl0ZW0pOw0KKyAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgICAgIHBhdGguQ3JlYXRlKCk7DQorI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGggLSAxLCBydC5oZWlnaHQgLSAxKTsNCisjZWxzZQ0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCwgcnQuaGVpZ2h0KTsNCisjZW5kaWYNCisgICAgICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgfQ0KKyAgICBpZiAoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0xUQl9Gb2N1c2VkKSB7DQorICAgICAgICBpZiAocERhdGEpIHsNCisgICAgICAgICAgICBEcmF3Rm9jdXMocEdyYXBoaWNzLCAoQ0ZYX1JlY3RGKilwRGF0YSwgcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvbW9udGhjYWxlbmRhcnRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTA0ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAKQEAgLTAsMCArMSw1NTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEgJCQkyMDANCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9IRUlHSFQJCQkzMA0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9XSURUSAkJMTgNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUCQkxNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOCQk1DQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1ZNQVJHSU4JCShGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUIC0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQpLzINCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUV0lESFQJCTEwMA0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQJCTIwDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9ITUFSR0lOCShGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEggLSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUKS8yDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOCShGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUIC0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQpLzINCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hTRVBfV0lEVEgJCQkJKEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfV0lEVEggLSAxMCkNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hTRVBfSEVJR0hUCQkJMQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVlNFUF9XSURUSAkJCQkxDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVAkJCUZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtOVU1fSEVJR0hUDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRICQkJMjYNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ET0ZGU0VUCQkJCS00DQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19TRVBfWAkJCQkJMw0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX1kJCQkJCShGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUICsgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQgKyBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19TRVBfRE9GRlNFVCkNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtOVU1fSEVJR0hUCQkJKDYqRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQpDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLX1dJRFRICQkJCShGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIKjcpDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVAkJCUZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRICQkoRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRILzcpDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVAkJCQkxNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQJCQlGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEgNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX0hFSUdIVAkJCUZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9GTEFHX1dJREhUCQlGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIDQorI2RlZmluZSBGV0xfTUNfV0lEVEgJCQkJCTIwMA0KKyNkZWZpbmUgRldMX01DX0hFSUdIVAkJCQkgICAgMTYwDQorQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkNGV0xfTW9udGhDYWxlbmRhclRQKCkNCit7DQorICAgIG1fcFRoZW1lRGF0YSA9IEZYX05FVyBNQ1RoZW1lRGF0YTsNCisgICAgU2V0VGhlbWVEYXRhKDApOw0KK30NCitDRldMX01vbnRoQ2FsZW5kYXJUUDo6fkNGV0xfTW9udGhDYWxlbmRhclRQKCkNCit7DQorICAgIGRlbGV0ZSBtX3BUaGVtZURhdGE7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXI7DQorfQ0KK0ZYX0RXT1JEIENGV0xfTW9udGhDYWxlbmRhclRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuICkNCit7DQorICAgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIGJDaGlsZHJlbik7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9Cb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9FZGdlOiB7DQorICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfTUNEX0JhY2tncm91bmQ6IHsNCisgICAgICAgICAgICAgICAgRHJhd1RvdGFsQksocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfSGVhZGVyOiB7DQorICAgICAgICAgICAgICAgIERyYXdIZWFkQmsocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfTEJ0bjogew0KKyNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCisgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gR2V0U3RhdGUocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQorICAgICAgICAgICAgICAgIERyYXdBcnJvd0J0bihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9ESVJFQ1RJT05fTGVmdCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyNlbHNlDQorICAgICAgICAgICAgICAgIERyYXdMQnV0dG9uKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorI2VuZGlmDQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfTUNEX1JCdG46IHsNCisjaWZkZWYgVEhFTUVfWFBTaW1pbGFyDQorICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEdldFN0YXRlKHBQYXJhbXMtPm1fZHdTdGF0ZXMpOw0KKyAgICAgICAgICAgICAgICBEcmF3QXJyb3dCdG4ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgRldMVEhFTUVfRElSRUNUSU9OX1JpZ2h0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgRHJhd1JCdXR0b24ocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfSFNlcGFyYXRvcjogew0KKyAgICAgICAgICAgICAgICBEcmF3SFNlcGVyYXRvcihwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9EYXRlc0luOiB7DQorICAgICAgICAgICAgICAgIERyYXdEYXRlc0luQksocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfVG9kYXlDaXJjbGU6IHsNCisgICAgICAgICAgICAgICAgRHJhd1RvZGF5Q2lyY2xlKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfTUNEX0RhdGVJbkNpcmNsZTogew0KKyAgICAgICAgICAgICAgICBEcmF3RGF0ZXNJbkNpcmNsZShwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9XZWVrTnVtU2VwOiB7DQorICAgICAgICAgICAgICAgIERyYXdXZWVrTnVtU2VwKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BUZXh0T3V0LCBGQUxTRSk7DQorICAgIGlmICgocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbikgJiYgIShwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgJiYNCisgICAgICAgICAgICAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIChGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkIHwgRldMX1BBUlRTVEFURV9NQ0RfU2VsZWN0ZWQpKSkgew0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkZGRkZGRkYpOw0KKyAgICB9IGVsc2UgaWYgKHBQYXJhbXMtPm1faVBhcnQgPT0gRldMX1BBUlRfTUNEX0NhcHRpb24pIHsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihtX3BUaGVtZURhdGEtPmNsckNhcHRpb24pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkYwMDAwMDApOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpEcmF3VGV4dChwUGFyYW1zKTsNCit9DQorRlhfTFBWT0lEIENGV0xfTW9udGhDYWxlbmRhclRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCit7DQorICAgIEZYX0JPT0wgYkRlZlBybyA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGJEd29yZFZhbCA9IEZBTFNFOw0KKyAgICBzd2l0Y2goZHdDYXBhY2l0eSkgew0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRIOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRIOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfSGVpZ2h0OiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9XSURUSDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fV0lEVEg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSE1BUkdJTjogew0KKyAgICAgICAgICAgICAgICBiRHdvcmRWYWwgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBtX2R3VmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hNQVJHSU47DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTjogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUV0lESFQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU46IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9ITUFSR0lOOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfVk1BUkdJTjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9XSURUSDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hTRVBfV0lEVEg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hTRVBfSEVJR0hUOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1ZTRVBfV0lEVEg6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX1dJRFRIOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1ZTRVBfSEVJR0hUOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRIOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQ6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19XSURUSDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfV0lEVEg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1dFRUtfSEVJR0hUOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gCUZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfSEVJR0hUOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfRE9GRlNFVDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ET0ZGU0VUOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9YOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWTogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ZOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQ6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQ6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9GTEFHX1dJREhUOiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfRkxBR19XSURIVDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0lEVEg6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfTUNfV0lEVEg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFSUdIVDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9NQ19IRUlHSFQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfU3VuOiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIlN1biI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX01vbjogew0KKyAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJNb24iOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9UdWU6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiVHVlIjsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfV2VkOiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIldlZCI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1RodTogew0KKyAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJUaHUiOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9Gcmk6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiRnJpIjsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfU2F0OiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIlNhdCI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0phbnVhcnk6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiSmFudWFyeSI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0ZlYnJ1YXJ5OiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIkZlYnJ1YXJ5IjsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfTWFyY2g6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiTWFyY2giOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9BcHJpbDogew0KKyAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJBcHJpbCI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX01heTogew0KKyAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJNYXkiOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9KdW5lOiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIkp1bmUiOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9KdWx5OiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIkp1bHkiOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9BdWd1c3Q6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiQXVndXN0IjsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfU2VwdGVtYmVyOiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIlNlcHRlbWJlciI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX09jdG9iZXI6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiT2N0b2JlciI7DQorICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX05vdmVtYmVyOiB7DQorICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIk5vdmVtYmVyIjsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfRGVjZW1iZXI6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9ICBMIkRlY2VtYmVyIjsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfVG9kYXk6IHsNCisgICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiVG9kYXkiOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBiRGVmUHJvID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRGVmUHJvKSB7DQorICAgICAgICBpZiAoYkR3b3JkVmFsKSB7DQorICAgICAgICAgICAgcmV0dXJuICZtX2R3VmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gJm1fZlZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorRldMX0VSUglDRldMX01vbnRoQ2FsZW5kYXJUUDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBJbml0VFRPKCk7DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkZpbmFsaXplKCkNCit7DQorICAgIEZpbmFsaXplVFRPKCk7DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZSgpOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3VG90YWxCSyhDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCit7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIENGWF9SZWN0RiBydFRvdGFsKHBQYXJhbXMtPm1fcnRQYXJ0KTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRUb3RhbC5sZWZ0LCBydFRvdGFsLnRvcCwgcnRUb3RhbC53aWR0aCwgcnRUb3RhbC5oZWlnaHQpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNsckJLKG1fcFRoZW1lRGF0YS0+Y2xyQkspOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJCSyk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdIZWFkQmsoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBDRlhfUmVjdEYgcnRIZWFkID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SGVhZC5sZWZ0LCBydEhlYWQudG9wLCBydEhlYWQud2lkdGgsIHJ0SGVhZC5oZWlnaHQpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNsckhlYWRCSyhtX3BUaGVtZURhdGEtPmNsckJLKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xySGVhZEJLKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0xCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBDRlhfUmVjdEYgcnRMQnRuOw0KKyAgICBydExCdG4gPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRMQnRuLmxlZnQsIHJ0TEJ0bi50b3AsIHJ0TEJ0bi53aWR0aCwgcnRMQnRuLmhlaWdodCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY2xyTEJ0bkVkZ2UoQXJnYkVuY29kZSgweGZmLCAyMDUsIDIxOSwgMjQzKSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTEJ0bkVkZ2UpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIGlmICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpID09IEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpIHsNCisgICAgICAgIENGWF9Db2xvciBjbHJMQnRuRmlsbChBcmdiRW5jb2RlKDB4ZmYsIDE3NCwgMTk4LCAyNDIpKTsNCisgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsckxCdG5GaWxsKTsNCisgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0NvbG9yIGNsckxCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMjI3LCAyMzUsIDI0OSkpOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyTEJ0bkZpbGwpOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIH0NCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLk1vdmVUbyhydExCdG4ubGVmdCArIHJ0TEJ0bi5XaWR0aCgpIC8gMyAqIDIsIHJ0TEJ0bi50b3AgKyBydExCdG4uaGVpZ2h0IC8gNCk7DQorICAgIHBhdGguTGluZVRvKHJ0TEJ0bi5sZWZ0ICsgcnRMQnRuLldpZHRoKCkgLyAzLCBydExCdG4udG9wICsgcnRMQnRuLmhlaWdodCAvIDIpOw0KKyAgICBwYXRoLkxpbmVUbyhydExCdG4ubGVmdCArIHJ0TEJ0bi5XaWR0aCgpIC8gMyAqIDIsIHJ0TEJ0bi5ib3R0b20oKSAtIHJ0TEJ0bi5oZWlnaHQgLyA0KTsNCisgICAgQ0ZYX0NvbG9yIGNsckZsYWcoQXJnYkVuY29kZSgweGZmLCA1MCwgMTA0LCAyMDUpKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJGbGFnKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdSQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgQ0ZYX1JlY3RGIHJ0UkJ0bjsNCisgICAgcnRSQnRuID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0UkJ0bi5sZWZ0LCBydFJCdG4udG9wLCBydFJCdG4ud2lkdGgsIHJ0UkJ0bi5oZWlnaHQpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNsclJCdG5FZGdlKEFyZ2JFbmNvZGUoMHhmZiwgMjA1LCAyMTksIDI0MykpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclJCdG5FZGdlKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBpZiAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkKSA9PSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkKSB7DQorICAgICAgICBDRlhfQ29sb3IgY2xyUkJ0bkZpbGwoQXJnYkVuY29kZSgweGZmLCAxNzQsIDE5OCwgMjQyKSk7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJSQnRuRmlsbCk7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9Db2xvciBjbHJSQnRuRmlsbChBcmdiRW5jb2RlKDB4ZmYsIDIyNywgMjM1LCAyNDkpKTsNCisgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsNCisgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5Nb3ZlVG8ocnRSQnRuLmxlZnQgKyBydFJCdG4uV2lkdGgoKSAvIDMsIHJ0UkJ0bi50b3AgKyBydFJCdG4uaGVpZ2h0IC8gNCk7DQorICAgIHBhdGguTGluZVRvKHJ0UkJ0bi5sZWZ0ICsgcnRSQnRuLldpZHRoKCkgLyAzICogMiwgcnRSQnRuLnRvcCArIHJ0UkJ0bi5oZWlnaHQgLyAyKTsNCisgICAgcGF0aC5MaW5lVG8ocnRSQnRuLmxlZnQgKyBydFJCdG4uV2lkdGgoKSAvIDMsIHJ0UkJ0bi5ib3R0b20oKSAtIHJ0UkJ0bi5oZWlnaHQgLyA0KTsNCisgICAgQ0ZYX0NvbG9yIGNsckZsYWcoQXJnYkVuY29kZSgweGZmLCA1MCwgMTA0LCAyMDUpKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJGbGFnKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdIU2VwZXJhdG9yKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SFNlcDsNCisgICAgcnRIU2VwID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgIHBhdGguTW92ZVRvKHJ0SFNlcC5sZWZ0LCBydEhTZXAudG9wICsgcnRIU2VwLmhlaWdodCAvIDIpOw0KKyAgICBwYXRoLkxpbmVUbyhydEhTZXAucmlnaHQoKSwgcnRIU2VwLnRvcCArIHJ0SFNlcC5oZWlnaHQgLyAyKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9Db2xvciBjbHJIU2VwKG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJIU2VwKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdXZWVrTnVtU2VwKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgQ0ZYX1JlY3RGIHJ0V2Vla1NlcDsNCisgICAgcnRXZWVrU2VwID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgIHBhdGguTW92ZVRvKHJ0V2Vla1NlcC5sZWZ0LCBydFdlZWtTZXAudG9wKTsNCisgICAgcGF0aC5MaW5lVG8ocnRXZWVrU2VwLmxlZnQsIHJ0V2Vla1NlcC5ib3R0b20oKSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY2xySFNlcChtX3BUaGVtZURhdGEtPmNsclNlcGVyYXRvcik7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xySFNlcCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3RGF0ZXNJbkJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KK3sNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9NQ0RfU2VsZWN0ZWQpIHsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0U2VsRGF5Ow0KKyAgICAgICAgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0U2VsRGF5LmxlZnQsIHJ0U2VsRGF5LnRvcCwgcnRTZWxEYXkud2lkdGgsIHJ0U2VsRGF5LmhlaWdodCk7DQorICAgICAgICBDRlhfQ29sb3IgY2xyU2VsRGF5Qks7DQorICAgICAgICBjbHJTZWxEYXlCSyA9IG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNTZWxlY3RlZEJLOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyU2VsRGF5QkspOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIH0gZWxzZSBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQpIHsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0U2VsRGF5Ow0KKyAgICAgICAgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0U2VsRGF5LmxlZnQsIHJ0U2VsRGF5LnRvcCwgcnRTZWxEYXkud2lkdGgsIHJ0U2VsRGF5LmhlaWdodCk7DQorICAgICAgICBDRlhfQ29sb3IgY2xyU2VsRGF5Qks7DQorICAgICAgICBjbHJTZWxEYXlCSyA9IG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNIb3ZlckJLOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyU2VsRGF5QkspOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0RhdGVzSW5DaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBDRlhfUmVjdEYgcnRTZWxEYXk7DQorICAgIHJ0U2VsRGF5ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0U2VsRGF5LmxlZnQsIHJ0U2VsRGF5LnRvcCwgcnRTZWxEYXkud2lkdGgsIHJ0U2VsRGF5LmhlaWdodCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY2xyU2VsRGF5Qks7DQorICAgIGNsclNlbERheUJLID0gbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJTZWxEYXlCSyk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3VG9kYXlDaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBDRlhfUmVjdEYgcnRUb2RheUNpcmNsZTsNCisgICAgcnRUb2RheUNpcmNsZSA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydFRvZGF5Q2lyY2xlLmxlZnQsIHJ0VG9kYXlDaXJjbGUudG9wLCBydFRvZGF5Q2lyY2xlLndpZHRoLCBydFRvZGF5Q2lyY2xlLmhlaWdodCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY2xyVG9kYXlDaXJjbGU7DQorICAgIGNsclRvZGF5Q2lyY2xlID0gbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJUb2RheUNpcmNsZSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGV0xUSEVNRV9TVEFURSBDRldMX01vbnRoQ2FsZW5kYXJUUDo6R2V0U3RhdGUoRlhfRFdPUkQgZHdGV0xTdGF0ZXMpDQorew0KKyAgICBpZiAoZHdGV0xTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkKSB7DQorICAgICAgICByZXR1cm4gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQorICAgIH0gZWxzZSBpZiAoZHdGV0xTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkKSB7DQorICAgICAgICByZXR1cm4gRldMVEhFTUVfU1RBVEVfUHJlc3NlZDsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhclRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdUaGVtZUlEKQ0KK3sNCisgICAgaWYgKGR3VGhlbWVJRCA9PSAwKSB7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNhcHRpb24gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDE1MywgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDE2MSwgMjM5KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNIb3ZlckJLID0gQXJnYkVuY29kZSgweGZmLCAxOTMsIDIxMSwgMjUxKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNTZWxlY3RlZEJLID0gQXJnYkVuY29kZSgweGZmLCAxNzMsIDE4OCwgMjM5KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNDaXJjbGUgPSBBcmdiRW5jb2RlKDB4ZmYsIDEwMywgMTQ0LCAyMDkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUb2RheSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMCwgMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJLID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2FwdGlvbiA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTZXBlcmF0b3IgPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTI4LCA2NCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzSG92ZXJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgIDIxNywgMjIwLCAxOTEpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc1NlbGVjdGVkQksgPSBBcmdiRW5jb2RlKDB4ZmYsIDIwNCwgMjA4LCAxODMpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUb2RheSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMCwgMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJLID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcGljdHVyZWJveHRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9waWN0dXJlYm94dHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOWU3ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcGljdHVyZWJveHRwLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KK0NGV0xfUGljdHVyZUJveFRQOjpDRldMX1BpY3R1cmVCb3hUUCgpDQorew0KK30NCitDRldMX1BpY3R1cmVCb3hUUDo6fkNGV0xfUGljdHVyZUJveFRQKCkNCit7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9QaWN0dXJlQm94VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX1BpY3R1cmVCb3g7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9QaWN0dXJlQm94VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICAgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9QVEJfQm9yZGVyOiB7DQorICAgICAgICAgICAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9QVEJfRWRnZTogew0KKyAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcHVzaGJ1dHRvbnRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9wdXNoYnV0dG9udHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzVlZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcHVzaGJ1dHRvbnRwLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjZGVmaW5lIFBVU0hCVVRUT05fU0laRV9Db3JuZXIJCTINCitDRldMX1B1c2hCdXR0b25UUDo6Q0ZXTF9QdXNoQnV0dG9uVFAoKQ0KK3sNCisgICAgbV9wVGhlbWVEYXRhID0gRlhfTkVXIFBCVGhlbWVEYXRhOw0KKyAgICBTZXRUaGVtZURhdGEoMCk7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvblRQOjp+Q0ZXTF9QdXNoQnV0dG9uVFAoKQ0KK3sNCisgICAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCisgICAgfQ0KK30NCitGWF9CT09MIENGV0xfUHVzaEJ1dHRvblRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX1B1c2hCdXR0b247DQorfQ0KK0ZYX0RXT1JEIENGV0xfUHVzaEJ1dHRvblRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuICkNCit7DQorICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KK30NCitGWF9CT09MCUNGV0xfUHVzaEJ1dHRvblRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUX1BTQl9Cb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX1BTQl9FZGdlOiB7DQorICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfUFNCX0JhY2tncm91bmQ6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGICZyZWN0ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQoKTsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHJlY3QuYm90dG9tKCk7DQorICAgICAgICAgICAgICAgIENGWF9QYXRoIHN0cm9rZVBhdGg7DQorICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguQ3JlYXRlKCk7DQorICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguTW92ZVRvKHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QudG9wKTsNCisgICAgICAgICAgICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8oZlJpZ2h0IC0gUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgcmVjdC50b3ApOw0KKyAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkxpbmVUbyhmUmlnaHQsIHJlY3QudG9wICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lcik7DQorICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguTGluZVRvKGZSaWdodCwgZkJvdHRvbSAtIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KKyAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkxpbmVUbyhmUmlnaHQgLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCBmQm90dG9tKTsNCisgICAgICAgICAgICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8ocmVjdC5sZWZ0ICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgZkJvdHRvbSk7DQorICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguTGluZVRvKHJlY3QubGVmdCwgZkJvdHRvbSAtIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KKyAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQsIHJlY3QudG9wICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lcik7DQorICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguTGluZVRvKHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QudG9wKTsNCisgICAgICAgICAgICAgICAgQ0ZYX1BhdGggZmlsbFBhdGg7DQorICAgICAgICAgICAgICAgIGZpbGxQYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgICAgICAgICBmaWxsUGF0aC5BZGRTdWJwYXRoKCZzdHJva2VQYXRoKTsNCisgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRJbm5lcihyZWN0KTsNCisgICAgICAgICAgICAgICAgcnRJbm5lci5EZWZsYXRlKFBVU0hCVVRUT05fU0laRV9Db3JuZXIgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lcik7DQorICAgICAgICAgICAgICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb2xvciA9IEdldENvbG9ySUQocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQorICAgICAgICAgICAgICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbaUNvbG9yXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFtpQ29sb3JdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxsUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIENGWF9Db2xvciBjclN0cm9rZShtX3BUaGVtZURhdGEtPmNsckJvcmRlcltpQ29sb3JdKTsNCisgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JTdHJva2UpOw0KKyAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnN0cm9rZVBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGZpbGxQYXRoLkNsZWFyKCk7DQorICAgICAgICAgICAgICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQorICAgICAgICAgICAgICAgIENGWF9Db2xvciBjckZpbGwobV9wVGhlbWVEYXRhLT5jbHJGaWxsW2lDb2xvcl0pOw0KKyAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfUFNCX0ZvY3VzZWQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0SW5uZXIuSW5mbGF0ZSgxLCAxLCAwLCAwKTsNCisgICAgICAgICAgICAgICAgICAgIERyYXdGb2N1cyhwR3JhcGhpY3MsICZydElubmVyLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfTFBWT0lEIENGV0xfUHVzaEJ1dHRvblRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCit7DQorICAgIGlmIChkd0NhcGFjaXR5ID09IEZXTF9XR1RDQVBBQ0lUWV9QU0JfTWFyZ2luKSB7DQorICAgICAgICBtX2ZWYWx1ZSA9IDA7DQorICAgICAgICByZXR1cm4gJm1fZlZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorRldMX0VSUglDRldMX1B1c2hCdXR0b25UUDo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBJbml0VFRPKCk7DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9QdXNoQnV0dG9uVFA6OkZpbmFsaXplKCkNCit7DQorICAgIEZpbmFsaXplVFRPKCk7DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZSgpOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvblRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCkNCit7DQorICAgIEZYX0FSR0IgKnBEYXRhID0gKEZYX0FSR0IqKSYqbV9wVGhlbWVEYXRhOw0KKyAgICBpZiAoZHdJRCkgew0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzFdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMjU1LCA1NSwgOTgsIDYpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbM10gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzRdID0gQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjQ2KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjIzLCAyMDUsIDE4MCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzJdID0gQXJnYkVuY29kZSgyNTUsIDI1MiwgMTk3LCAxNDkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxOTQsIDIwOSwgMTQzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMjE2LCAyMTYsIDIxNik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjcsIDIwOSwgMTg0KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMjQ0LCAyMjgpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjA3LCAxMTQsIDM3KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzNdID0gQXJnYkVuY29kZSgyNTUsIDE0NCwgMTkzLCA4NCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjYsIDIyNSwgMjE4KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDAsIDYwLCAxMTYpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMCwgNjAsIDExNik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA2MCwgMTE2KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzNdID0gQXJnYkVuY29kZSgyNTUsIDAsIDYwLCAxMTYpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMjAxLCAxOTksIDE4Nik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzBdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDksIDIwNCwgMTkzKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzNdID0gQXJnYkVuY29kZSgyNTUsIDIwNiwgMjMxLCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzBdID0gQXJnYkVuY29kZSgyNTUsIDIxNCwgMjA4LCAxOTcpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjQyLCAyNDEsIDIzOCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjksIDE1MSwgMCk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMDUsIDEzMCwgMjM4KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzRdID0gQXJnYkVuY29kZSgyNTUsIDI0NSwgMjQ0LCAyMzQpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzBdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzFdID0gQXJnYkVuY29kZSgyNTUsIDIyNiwgMjI1LCAyMTgpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzNdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzRdID0gQXJnYkVuY29kZSgyNTUsIDI0NSwgMjQ0LCAyMzQpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENGV0xfUHVzaEJ1dHRvblRQOjpHZXRDb2xvcklEKEZYX0RXT1JEIGR3U3RhdGVzKQ0KK3sNCisgICAgcmV0dXJuIGR3U3RhdGVzICY9IEZXTF9QQVJUU1RBVEVfUFNCX01hc2s7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9zY3JvbGxiYXJ0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvc2Nyb2xsYmFydHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGRhZmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvc2Nyb2xsYmFydHAuY3BwCkBAIC0wLDAgKzEsMzYyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNkZWZpbmUgRldMX1NDUk9MTF9QYXdMZW4JMTIuNWYNCitDRldMX1Njcm9sbEJhclRQOjpDRldMX1Njcm9sbEJhclRQKCkNCit7DQorICAgIG1fcFRoZW1lRGF0YSA9IEZYX05FVyBTQlRoZW1lRGF0YTsNCisgICAgU2V0VGhlbWVEYXRhKDApOw0KK30NCitDRldMX1Njcm9sbEJhclRQOjp+Q0ZXTF9TY3JvbGxCYXJUUCgpDQorew0KKyAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgICAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhICA9IE5VTEw7DQorICAgIH0NCit9DQorRlhfQk9PTAlDRldMX1Njcm9sbEJhclRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9TY3JvbGxCYXI7DQorfQ0KK0ZYX0xQVk9JRCBDRldMX1Njcm9sbEJhclRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCit7DQorICAgIGlmIChkd0NhcGFjaXR5ID09IEZXTF9DQVBBQ0lUWV9TQ0JfU2l6ZSkgew0KKyAgICAgICAgbV9mVmFsdWUgPSA1Ow0KKyAgICAgICAgcmV0dXJuICZtX2ZWYWx1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU2Nyb2xsQmFyVFA6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gKQ0KK3sNCisgICAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICAgICAgU2V0VGhlbWVEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKGR3VGhlbWVJRCkpOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCit9DQorRlhfQk9PTAlDRldMX1Njcm9sbEJhclRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgICBJRldMX1dpZGdldCAqcFdpZGdldCA9IHBQYXJhbXMtPm1fcFdpZGdldDsNCisgICAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gcFdpZGdldC0+R2V0U3R5bGVzRXgoKTsNCisgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KKyAgICBzd2l0Y2ggKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAweDAzKSB7DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQ6IHsNCisgICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZDogew0KKyAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkOiB7DQorICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgICAgQ0ZYX1JlY3RGICpwUmVjdCA9ICZwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgRlhfQk9PTCBiVmVydCA9IHBXaWRnZXQtPkdldFN0eWxlc0V4KCk7DQorICAgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVF9TQ0JfRm9yZUFycm93OiB7DQorICAgICAgICAgICAgICAgIERyYXdNYXhNaW5CdG4ocEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQgPyBGV0xUSEVNRV9ESVJFQ1RJT05fVXAgOiBGV0xUSEVNRV9ESVJFQ1RJT05fTGVmdCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX1NDQl9CYWNrQXJyb3c6IHsNCisgICAgICAgICAgICAgICAgRHJhd01heE1pbkJ0bihwR3JhcGhpY3MsIHBSZWN0LCBiVmVydCA/IEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duIDogRldMVEhFTUVfRElSRUNUSU9OX1JpZ2h0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1BBUlRfU0NCX1RodW1iOiB7DQorICAgICAgICAgICAgICAgIERyYXdUaHVtYkJ0bihwR3JhcGhpY3MsIHBSZWN0LCBiVmVydCwgZVN0YXRlLCBUUlVFLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX1NDQl9Mb3dlclRyYWNrOiB7DQorICAgICAgICAgICAgICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBSZWN0LCBiVmVydCwgZVN0YXRlLCBUUlVFLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrOiB7DQorICAgICAgICAgICAgICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBSZWN0LCBiVmVydCwgZVN0YXRlLCBGQUxTRSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYlBhd0J1dHRvbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBpZiAoZVN0YXRlIDwgRldMVEhFTUVfU1RBVEVfTm9ybWFsIHx8IGVTdGF0ZSA+IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgQ0ZYX1JlY3RGIHJlY3QoKnBSZWN0KTsNCisgICAgaWYgKGJWZXJ0KSB7DQorICAgICAgICByZWN0LkRlZmxhdGUoMSwgMCk7DQorICAgICAgICBpZiAocmVjdC5Jc0VtcHR5KDAuMWYpKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgICAgICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORywNCisgICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICAgICAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQorICAgICAgICByY1N0cm9rZS5TZXQobV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbZVN0YXRlIC0gMV0pOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QuRGVmbGF0ZSgwLCAxKTsNCisgICAgICAgIGlmIChyZWN0LklzRW1wdHkoMC4xZikpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgICAgICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLW2VTdGF0ZSAtIDFdWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLW2VTdGF0ZSAtIDFdWzFdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgICAgICAgQ0ZYX0NvbG9yIHJjU3Ryb2tlOw0KKyAgICAgICAgcmNTdHJva2UuU2V0KG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyW2VTdGF0ZSAtIDFdKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJnJjU3Ryb2tlKTsNCisgICAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgICAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpEcmF3UGF3KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgaWYgKGJWZXJ0KSB7DQorICAgICAgICBGWF9GTE9BVCBmUGF3TGVuID0gRldMX1NDUk9MTF9QYXdMZW47DQorICAgICAgICBpZiAocFJlY3QtPndpZHRoIC8gMiA8PSBmUGF3TGVuKSB7DQorICAgICAgICAgICAgZlBhd0xlbiA9IChwUmVjdC0+d2lkdGggLSA2KSAvIDIgOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZlggPSBwUmVjdC0+bGVmdCArIHBSZWN0LT53aWR0aCAvIDQ7DQorICAgICAgICBGWF9GTE9BVCBmWSA9IHBSZWN0LT50b3AgKyBwUmVjdC0+aGVpZ2h0IC8gMjsNCisgICAgICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDQpOw0KKyAgICAgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDQpOw0KKyAgICAgICAgcGF0aC5Nb3ZlVG8oZlgsIGZZIC0gMik7DQorICAgICAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gMik7DQorICAgICAgICBwYXRoLk1vdmVUbyhmWCAsIGZZKTsNCisgICAgICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkpOw0KKyAgICAgICAgcGF0aC5Nb3ZlVG8oZlgsIGZZICsgMik7DQorICAgICAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZICsgMik7DQorICAgICAgICBDRlhfQ29sb3IgY2xyTGlnaHQobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0W2VTdGF0ZSAtIDFdKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGlnaHQpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoKTsNCisgICAgICAgIGZYKys7DQorICAgICAgICBwYXRoLkNsZWFyKCk7DQorICAgICAgICBwYXRoLk1vdmVUbyhmWCwgZlkgLSAzKTsNCisgICAgICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkgLSAzKTsNCisgICAgICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDEpOw0KKyAgICAgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDEpOw0KKyAgICAgICAgcGF0aC5Nb3ZlVG8oZlgsIGZZICsgMSk7DQorICAgICAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZICsgMSk7DQorICAgICAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAzKTsNCisgICAgICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkgKyAzKTsNCisgICAgICAgIENGWF9Db2xvciBjbHJEYXJrKG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrW2VTdGF0ZSAtIDFdKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRGFyayk7DQorICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgZlBhd0xlbiA9IEZXTF9TQ1JPTExfUGF3TGVuOw0KKyAgICAgICAgaWYgKHBSZWN0LT5oZWlnaHQgLyAyIDw9IGZQYXdMZW4pIHsNCisgICAgICAgICAgICBmUGF3TGVuID0gKHBSZWN0LT5oZWlnaHQgLSA2KSAvIDI7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmWCA9IHBSZWN0LT5sZWZ0ICsgcFJlY3QtPndpZHRoIC8gMjsNCisgICAgICAgIEZYX0ZMT0FUIGZZID0gcFJlY3QtPnRvcCArIHBSZWN0LT5oZWlnaHQgLyA0Ow0KKyAgICAgICAgcGF0aC5Nb3ZlVG8oZlggLSA0LCBmWSk7DQorICAgICAgICBwYXRoLkxpbmVUbyhmWCAtIDQsIGZZICsgZlBhd0xlbik7DQorICAgICAgICBwYXRoLk1vdmVUbyhmWCAtIDIsIGZZKTsNCisgICAgICAgIHBhdGguTGluZVRvKGZYIC0gMiwgZlkgKyBmUGF3TGVuKTsNCisgICAgICAgIHBhdGguTW92ZVRvKGZYLCBmWSk7DQorICAgICAgICBwYXRoLkxpbmVUbyhmWCwgZlkgKyBmUGF3TGVuKTsNCisgICAgICAgIHBhdGguTW92ZVRvKGZYICsgMiwgZlkpOw0KKyAgICAgICAgcGF0aC5MaW5lVG8oZlggKyAyLCBmWSArIGZQYXdMZW4pOw0KKyAgICAgICAgQ0ZYX0NvbG9yIGNsckxpZ2h0KG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFtlU3RhdGUgLSAxXSk7DQorICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpZ2h0KTsNCisgICAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgICAgICBmWSArKzsNCisgICAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgICAgIHBhdGguTW92ZVRvKGZYIC0gMywgZlkpOw0KKyAgICAgICAgcGF0aC5MaW5lVG8oZlggLSAzLCBmWSArIGZQYXdMZW4pOw0KKyAgICAgICAgcGF0aC5Nb3ZlVG8oZlggLSAxLCBmWSk7DQorICAgICAgICBwYXRoLkxpbmVUbyhmWCAtIDEsIGZZICsgZlBhd0xlbik7DQorICAgICAgICBwYXRoLk1vdmVUbyhmWCArIDEsIGZZKTsNCisgICAgICAgIHBhdGguTGluZVRvKGZYICsgMSwgZlkgKyBmUGF3TGVuKTsNCisgICAgICAgIHBhdGguTW92ZVRvKGZYICsgMywgZlkpOw0KKyAgICAgICAgcGF0aC5MaW5lVG8oZlggKyAzLCBmWSArIGZQYXdMZW4pOw0KKyAgICAgICAgQ0ZYX0NvbG9yIGNsckRhcmsobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbZVN0YXRlIC0gMV0pOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQorICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJEYXJrKTsNCisgICAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpEcmF3VHJhY2soQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0JPT0wgYlZlcnQsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgRlhfQk9PTCBiTG93ZXJUcmFjaywgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBpZiAoZVN0YXRlIDwgRldMVEhFTUVfU1RBVEVfTm9ybWFsIHx8IGVTdGF0ZSA+IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY29sb3JMaW5lKEFyZ2JFbmNvZGUoMjU1LCAyMzgsIDIzNywgMjI5KSk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgICBpZiAoYlZlcnQpIHsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCAxLCBwUmVjdC0+aGVpZ2h0KTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDEsIHBSZWN0LT50b3AsIDEsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgMSk7DQorICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgZkJvdHRvbSAtIDEsIHBSZWN0LT53aWR0aCwgMSk7DQorICAgIH0NCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNvbG9yTGluZSk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCAtIDIsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICBGWF9GTE9BVCB4MSA9IGJWZXJ0ID8gcFJlY3QtPmxlZnQgKyAxIDogcFJlY3QtPmxlZnQ7DQorICAgIEZYX0ZMT0FUIHkxID0gYlZlcnQgPyBwUmVjdC0+dG9wIDogcFJlY3QtPnRvcCArIDE7DQorICAgIEZYX0ZMT0FUIHgyID0gYlZlcnQgPyBmUmlnaHQgLSAxIDogcFJlY3QtPmxlZnQ7DQorICAgIEZYX0ZMT0FUIHkyID0gYlZlcnQgPyBwUmVjdC0+dG9wIDogZkJvdHRvbSAtIDE7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICZwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdNYXhNaW5CdG4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBEcmF3VHJhY2socEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgcFJlY3QsDQorICAgICAgICAgICAgICBlRGljdCA9PSBGV0xUSEVNRV9ESVJFQ1RJT05fVXAgfHwgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sDQorICAgICAgICAgICAgICBlU3RhdGUsDQorICAgICAgICAgICAgICBUUlVFLA0KKyAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICAgIENGWF9SZWN0RiBydEFycm93QnRuKCpwUmVjdCk7DQorICAgIHJ0QXJyb3dCdG4uRGVmbGF0ZSgxLCAxLCAxLCAxKTsNCisgICAgRHJhd0Fycm93QnRuKHBHcmFwaGljcywgJnJ0QXJyb3dCdG4sIGVEaWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KK30NCisjZWxzZQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYlBhd0J1dHRvbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBpZiAocFJlY3QtPklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFRodW1iKCpwUmVjdCk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDI7DQorICAgIERyYXczRFJlY3QocEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFX1JhaXNlZCwgZldpZHRoLCBwUmVjdCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgZldpZHRoLCBwUmVjdC0+dG9wICsgZldpZHRoLCBwUmVjdC0+d2lkdGggLSAyICogZldpZHRoLCBwUmVjdC0+aGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdUcmFjayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfQk9PTCBiVmVydCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBGWF9CT09MIGJMb3dlclRyYWNrLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIGlmIChwUmVjdC0+SXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNsckZpbGwoMHhGRkYwRjBGMCk7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd01heE1pbkJ0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0VGh1bWIoKnBSZWN0KTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gZVN0YXRlID09IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQgPyAxLjBmIDogMi4wZjsNCisgICAgRldMVEhFTUVfRURHRSBlVHlwZSA9IGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkID8gRldMVEhFTUVfRURHRV9GbGF0IDogRldMVEhFTUVfRURHRV9SYWlzZWQ7DQorICAgIERyYXczRFJlY3QocEdyYXBoaWNzLCBlVHlwZSwgZldpZHRoLCBwUmVjdCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgZldpZHRoLCBwUmVjdC0+dG9wICsgZldpZHRoLCBwUmVjdC0+d2lkdGggLSAyICogZldpZHRoLCBwUmVjdC0+aGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICBEcmF3QXJyb3cocEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgcFJlY3QsDQorICAgICAgICAgICAgICBlRGljdCwNCisgICAgICAgICAgICAgIGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZSA/IDB4RkZBMEEwQTAgOiAweEZGMDAwMDAwLA0KKyAgICAgICAgICAgICAgZVN0YXRlID09IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQsDQorICAgICAgICAgICAgICBwTWF0cml4KTsNCit9DQorI2VuZGlmDQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCkNCit7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjA4LCAyMjMsIDE3Mik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzNdID0gQXJnYkVuY29kZSgweGZmLCAxNDAsIDE1NywgMTE1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1szXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY0LCAxODAsIDEzOSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbM11bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MSwgMTU3LCAxMTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjM2LCAyMzMsIDIxNik7DQorICAgIGlmIChkd0lEKSB7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwOCwgMjIzLCAxNzIpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MCwgMTU3LCAxMTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTYyLCAxNzksIDE0MSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDksIDE2NywgMTE3KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNDIsIDE1MywgMTI1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjM1LCAyNDUsIDIxMik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1sxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTgyLCAxOTgsIDE0Mik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMDAsIDIxMywgMTcwKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NSwgMjA4LCAxNTApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE4OSwgMjAzLCAxNTApOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzJdID0gQXJnYkVuY29kZSgweGZmLCAyMDgsIDIyMywgMTcyKTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNDAsIDE1NywgMTE1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTgwLCAxMzkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1syXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQxLCAxNTcsIDExNSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxNDYsIDEwMik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQzLCAyNDEsIDIzNik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktFbmQgPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NCwgMjU0LCAyNTEpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzBdID0gQXJnYkVuY29kZSgweGZmLCAyMzgsIDI0NCwgMjU0KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNDAsIDE3NiwgMjQ4KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NywgMjEzLCAyNTIpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTgyLCAyMDUsIDI1MSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQ4LCAxNzYsIDIyMSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1MiwgMjUzLCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NiwgMTk3LCAyNTUpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1sxXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjE2LCAyMzIsIDI1NSk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMDQsIDIyNSwgMjU1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMTgsIDIzMCwgMjU0KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjA3LCAyMjEsIDI1Myk7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1syXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTMxLCAxNTgsIDIxNik7DQorICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzJdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNjcsIDE5MCwgMjQ1KTsNCisgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0NiwgMTc5LCAyNDkpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyNCwgMTU5LCAyMTEpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLU3RhcnQgPSBBcmdiRW5jb2RlKDB4ZmYsIDI0MywgMjQxLCAyMzYpOw0KKyAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLRW5kID0gQXJnYkVuY29kZSgweGZmLCAyNTQsIDI1NCwgMjUxKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvd2lkZ2V0dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3dpZGdldHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTE4NmI3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3dpZGdldHRwLmNwcApAQCAtMCwwICsxLDgyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCitzdGF0aWMgdm9pZCBGV0xfU2V0Q2hpbGRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwUGFyZW50LCBGWF9EV09SRCBkd1RoZW1lSUQpDQorew0KKyAgICBJRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgSUZXTF9XaWRnZXQgKnBDaGlsZCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwUGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gcENoaWxkLT5HZXRUaGVtZVByb3ZpZGVyKCk7DQorICAgICAgICBpZiAocFRoZW1lKSB7DQorICAgICAgICAgICAgcFRoZW1lLT5TZXRUaGVtZUlEKHBDaGlsZCwgZHdUaGVtZUlELCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBGV0xfU2V0Q2hpbGRUaGVtZUlEKHBDaGlsZCwgZHdUaGVtZUlEKTsNCisgICAgICAgIHBDaGlsZCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgIH0NCit9DQorRlhfQk9PTAlDRldMX1dpZGdldFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldFRQOjpHZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fZHdUaGVtZUlEOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuICkNCit7DQorICAgIEZYX0RXT1JEIGR3T2xkID0gbV9kd1RoZW1lSUQ7DQorICAgIG1fZHdUaGVtZUlEID0gZHdUaGVtZUlEOw0KKyAgICBpZiAoQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKSkgew0KKyAgICAgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPlNldENvbG9yRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgICAgfQ0KKyAgICBpZiAoYkNoaWxkcmVuKSB7DQorICAgICAgICBGV0xfU2V0Q2hpbGRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCk7DQorICAgIH0NCisgICAgcmV0dXJuIGR3T2xkOw0KK30NCitGV0xfRVJSCUNGV0xfV2lkZ2V0VFA6OkdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfTWF0cml4ICZtYXRyaXgpDQorew0KKyAgICBtYXRyaXguU2V0KF9jdG0uYSwgX2N0bS5iLCBfY3RtLmMsIF9jdG0uZCwgX2N0bS5lLCBfY3RtLmYpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCit7DQorICAgIF9jdG0uU2V0KG1hdHJpeC5hLCBtYXRyaXguYiwgbWF0cml4LmMsIG1hdHJpeC5kLCBtYXRyaXguZSwgbWF0cml4LmYpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9XaWRnZXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQorew0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDRldMX1dpZGdldFRQOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcykNCit7DQorICAgIGlmICghbV9wVGV4dE91dCkgew0KKyAgICAgICAgSW5pdFRUTygpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlMZW4gPSBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpTGVuID4gMCwgRkFMU0UpDQorICAgIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQorICAgIG1fcFRleHRPdXQtPlNldFJlbmRlckRldmljZShwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpKTsNCisgICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgICBDRlhfTWF0cml4ICpwTWF0cml4ID0gJnBQYXJhbXMtPm1fbWF0cml4Ow0KKyAgICBwTWF0cml4LT5Db25jYXQoKnBHcmFwaGljcy0+R2V0TWF0cml4KCkpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgoKnBNYXRyaXgpOw0KKyAgICBtX3BUZXh0T3V0LT5EcmF3TG9naWNUZXh0KHBQYXJhbXMtPm1fd3NUZXh0LCBpTGVuLCBwUGFyYW1zLT5tX3J0UGFydCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9MUFZPSUQgQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpDQorew0KKyAgICBzd2l0Y2goZHdDYXBhY2l0eSkgew0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEJvcmRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXI6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUJvcmRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZUZsYXQ6IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlRmxhdDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VSYWlzZWQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0VkZ2VTdW5rZW46IHsNCisgICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlU3Vua2VuOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZTogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3I6IHsNCisgICAgICAgICAgICAgICAgbV9kd1ZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aDogew0KKyAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9Gb250OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3BGREVGb250Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX1RleHRTZWxDb2xvcjogew0KKyAgICAgICAgICAgICAgICBtX2R3VmFsdWUgPSAobV9kd1RoZW1lSUQgPT0gMCkgPyBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0U2VsQ29sb3IgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9MaW5lSGVpZ2h0OiB7DQorICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfTGluZUhlaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCisgICAgICAgICAgICAgICAgbV9ydE1hcmdpbi5TZXQoMCwgMCwgMCwgMCk7DQorICAgICAgICAgICAgICAgIHJldHVybiAmbV9ydE1hcmdpbjsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gJm1fZlZhbHVlOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0VFA6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBGV0xfR2V0VGhlbWVMYXlvdXQobV9kd1RoZW1lSUQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0VFA6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYgJnJlY3QpDQorew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wJQ0ZXTF9XaWRnZXRUUDo6SXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNGV0xfV2lkZ2V0VFA6OkNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcywgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyB8IEZERV9UVE9TVFlMRV9BcmFiaWNDb250ZXh0KTsNCisgICAgbV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZShwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksIHJlY3QpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUglDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCkNCit7DQorICAgIG1fZHdUaGVtZUlEID0gMDsNCisgICAgX2N0bS5SZXNldCgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIJQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYoIW1fcFRleHRPdXQpIHsNCisgICAgICAgIEZpbmFsaXplVFRPKCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX1dpZGdldFRQOjp+Q0ZXTF9XaWRnZXRUUCgpDQorew0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0VFA6OlNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0xQQ1dTVFIgc3RyRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpDQorew0KKyAgICBpZiAoIW1fcFRleHRPdXQpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBtX3BGREVGb250ID0gRldMX0dldEZvbnRNYW5hZ2VyKCktPkZpbmRGb250KHN0ckZvbnQsIDAsIDApOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250KG1fcEZERUZvbnQpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IocmdiRm9udCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUglDRldMX1dpZGdldFRQOjpTZXRGb250KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRlhfRm9udCAqcEZvbnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQVJHQiByZ2JGb250KQ0KK3sNCisgICAgaWYgKCFtX3BUZXh0T3V0KSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udChwRm9udCk7DQorICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihyZ2JGb250KTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRlhfRm9udCogQ0ZXTF9XaWRnZXRUUDo6R2V0Rm9udChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBtX3BGREVGb250Ow0KK30NCitDRldMX1dpZGdldFRQOjpDRldMX1dpZGdldFRQKCkNCisgICAgOiBtX2R3UmVmQ291bnQoMSkNCisgICAgLCBtX3BUZXh0T3V0KE5VTEwpDQorICAgICwgbV9wRkRFRm9udChOVUxMKQ0KKyAgICAsIG1fZHdUaGVtZUlEKDApDQorew0KK30NCitGWF9FUlIgQ0ZXTF9XaWRnZXRUUDo6SW5pdFRUTygpDQorew0KKyAgICBpZiAobV9wVGV4dE91dCkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIG1fcEZERUZvbnQgPSBGV0xfR2V0Rm9udE1hbmFnZXIoKS0+RmluZEZvbnQoRlhfV1NUUkMoTCJIZWx2ZXRpY2EiKSwgMCwgMCk7DQorICAgIG1fcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250KG1fcEZERUZvbnQpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZSk7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRFbGxpcHNpc1N0cmluZyhMIi4uLiIpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZVRUTygpDQorew0KKyAgICBpZiAobV9wVGV4dE91dCkgew0KKyAgICAgICAgbV9wVGV4dE91dC0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wVGV4dE91dCA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCisjaWZkZWYgVEhFTUVfWFBTaW1pbGFyDQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3RWRnZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdHlsZXMsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXgpDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9Db2xvciBjclN0cm9rZShGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkgPT0gMCA/IEFyZ2JFbmNvZGUoMjU1LCAxMjcsIDE1NywgMTg1KSA6IEZXTFRIRU1FX0NPTE9SX0dyZWVuX0JLU2VsZWN0ZWQpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjclN0cm9rZSk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGggLSAxLCBwUmVjdC0+aGVpZ2h0IC0gMSk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgY3JTdHJva2UgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wICsgMSwgcFJlY3QtPndpZHRoIC0gMywgcFJlY3QtPmhlaWdodCAtIDMpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KKyNlbHNlDQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3RWRnZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdHlsZXMsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZWN0KTsNCisgICAgRldMVEhFTUVfRURHRSBlVHlwZTsNCisgICAgRlhfRkxPQVQgZldpZHRoOw0KKyAgICBzd2l0Y2goZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfRWRnZU1hc2spIHsNCisgICAgICAgIGNhc2UgRldMX1dHVFNUWUxFX0VkZ2VSYWlzZWQ6IHsNCisgICAgICAgICAgICAgICAgZVR5cGUgPSBGV0xUSEVNRV9FREdFX1JhaXNlZCwgZldpZHRoID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfV0dUU1RZTEVfRWRnZVN1bmtlbjogew0KKyAgICAgICAgICAgICAgICBlVHlwZSA9IEZXTFRIRU1FX0VER0VfU3Vua2VuLCBmV2lkdGggPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlU3Vua2VuOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlRmxhdDoNCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBEcmF3M0RSZWN0KHBHcmFwaGljcywNCisgICAgICAgICAgICAgICBlVHlwZSwNCisgICAgICAgICAgICAgICBmV2lkdGgsDQorICAgICAgICAgICAgICAgcFJlY3QsDQorICAgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwNCisgICAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLA0KKyAgICAgICAgICAgICAgIEZXTFRIRU1FX0NPTE9SX0VER0VSQjEsDQorICAgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwNCisgICAgICAgICAgICAgICBwTWF0cml4KTsNCit9DQorI2VuZGlmDQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3M0RSZWN0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFIGVUeXBlLCBGWF9GTE9BVCBmV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0FSR0IgY3IxLCBGWF9BUkdCIGNyMiwgRlhfQVJHQiBjcjMsIEZYX0FSR0IgY3I0LCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgaWYgKGVUeXBlID09IEZXTFRIRU1FX0VER0VfRmxhdCkgew0KKyAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgICAgIHBhdGguQ3JlYXRlKCk7DQorICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0KTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoIC0gMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAyKTsNCisgICAgICAgIENGWF9Db2xvciBjcihBcmdiRW5jb2RlKDI1NSwgMTAwLCAxMDAsIDEwMCkpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoIC0gMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAyKTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoIC0gNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSA0KTsNCisgICAgICAgIGNyLlNldCgweEZGRkZGRkZGKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IHBSZWN0LT5sZWZ0Ow0KKyAgICAgICAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQorICAgICAgICBGWF9GTE9BVCBmVG9wID0gcFJlY3QtPnRvcDsNCisgICAgICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsNCisgICAgICAgIENGWF9Db2xvciBjckxUKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3I0IDogY3IxKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckxUKTsNCisgICAgICAgIENGWF9QYXRoIHBhdGhMVDsNCisgICAgICAgIHBhdGhMVC5DcmVhdGUoKTsNCisgICAgICAgIHBhdGhMVC5Nb3ZlVG8oZkxlZnQsIGZCb3R0b20gLSBmSGFsZldpZHRoKTsNCisgICAgICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQsIGZUb3ApOw0KKyAgICAgICAgcGF0aExULkxpbmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wKTsNCisgICAgICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgICAgICBwYXRoTFQuTGluZVRvKGZMZWZ0LCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoTFQsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgICAgIGNyTFQgPSBDRlhfQ29sb3IoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjMgOiBjcjIpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyTFQpOw0KKyAgICAgICAgcGF0aExULkNsZWFyKCk7DQorICAgICAgICBwYXRoTFQuTW92ZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZXaWR0aCk7DQorICAgICAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgcGF0aExULkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZldpZHRoLCBmVG9wICsgZldpZHRoKTsNCisgICAgICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQgKyBmV2lkdGgsIGZUb3AgKyBmV2lkdGgpOw0KKyAgICAgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZXaWR0aCwgZkJvdHRvbSAtIGZXaWR0aCk7DQorICAgICAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZXaWR0aCk7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoTFQsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgICAgIENGWF9Db2xvciBjclJCKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IxIDogY3IzKTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjclJCKTsNCisgICAgICAgIENGWF9QYXRoIHBhdGhSQjsNCisgICAgICAgIHBhdGhSQi5DcmVhdGUoKTsNCisgICAgICAgIHBhdGhSQi5Nb3ZlVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgICAgICBwYXRoUkIuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgcGF0aFJCLkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KKyAgICAgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KKyAgICAgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgICAgICBjclJCID0gQ0ZYX0NvbG9yKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkDQorICAgICAgICAgICAgICAgICAgICAgICAgID8gY3IyIDogY3I0KTsNCisgICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjclJCKTsNCisgICAgICAgIHBhdGhSQi5DbGVhcigpOw0KKyAgICAgICAgcGF0aFJCLk1vdmVUbyhmUmlnaHQsIGZUb3ApOw0KKyAgICAgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQsIGZCb3R0b20pOw0KKyAgICAgICAgcGF0aFJCLkxpbmVUbyhmTGVmdCwgZkJvdHRvbSk7DQorICAgICAgICBwYXRoUkIuTGluZVRvKGZMZWZ0LCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgICAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmSGFsZldpZHRoKTsNCisgICAgICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCk7DQorICAgICAgICBwYXRoUkIuTGluZVRvKGZSaWdodCwgZlRvcCk7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoUkIsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhdzNEQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFIGVUeXBlLCBGWF9GTE9BVCBmV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0FSR0IgY3IxLCBGWF9BUkdCIGNyMiwgRlhfQVJHQiBjcjMsIEZYX0FSR0IgY3I0LCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgRlhfRkxPQVQgZlJhZGl1cyA9IHBSZWN0LT53aWR0aCAvIDI7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkQXJjKHBSZWN0LT5sZWZ0LA0KKyAgICAgICAgICAgICAgICBwUmVjdC0+dG9wLA0KKyAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGgsDQorICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQsDQorICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICogMyAvIDQsDQorICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbDEoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjQgOiBjcjEpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwxKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW5uZXIoKnBSZWN0KTsNCisgICAgcnRJbm5lci5EZWZsYXRlKHBSZWN0LT53aWR0aCAvIDQsIHBSZWN0LT5oZWlnaHQgLyA0KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZEFyYyhydElubmVyLmxlZnQsDQorICAgICAgICAgICAgICAgIHJ0SW5uZXIudG9wLA0KKyAgICAgICAgICAgICAgICBydElubmVyLndpZHRoLA0KKyAgICAgICAgICAgICAgICBydElubmVyLmhlaWdodCwNCisgICAgICAgICAgICAgICAgRldMVEhFTUVfUEkgKiAzIC8gNCwNCisgICAgICAgICAgICAgICAgRldMVEhFTUVfUEkpOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsMihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMyA6IGNyMik7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyRmlsbDIpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguQWRkQXJjKHBSZWN0LT5sZWZ0LA0KKyAgICAgICAgICAgICAgICBwUmVjdC0+dG9wLA0KKyAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGgsDQorICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQsDQorICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICogNyAvIDQsDQorICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbDMoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjEgOiBjcjMpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwzKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcGF0aC5BZGRBcmMocnRJbm5lci5sZWZ0LA0KKyAgICAgICAgICAgICAgICBydElubmVyLnRvcCwNCisgICAgICAgICAgICAgICAgcnRJbm5lci53aWR0aCwNCisgICAgICAgICAgICAgICAgcnRJbm5lci5oZWlnaHQsDQorICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICAqIDcgLyA0LA0KKyAgICAgICAgICAgICAgICBGV0xUSEVNRV9QSSk7DQorICAgIENGWF9Db2xvciBjckZpbGw0KGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IyIDogY3I0KTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JGaWxsNCk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAyLCBwUmVjdC0+aGVpZ2h0IC0gMik7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCkpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpGaWxsQmFja2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCwgcFJlY3QsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkZpbGxTb2lsZFJlY3QoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0FSR0IgZmlsbENvbG9yLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChmaWxsQ29sb3IpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBeGlhbFNoYWRpbmcoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0ZMT0FUIGZ4MSwgRlhfRkxPQVQgZnkxLCBGWF9GTE9BVCBmeDIsIEZYX0ZMT0FUIGZ5MiwgRlhfQVJHQiBiZWdpbkNvbG9yLCBGWF9BUkdCIGVuZENvbG9yLCBDRlhfUGF0aCAqcGF0aCwgRlhfSU5UMzIgZmlsbE1vZGUsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBhdGgpOw0KKyAgICBDRlhfUG9pbnRGIGJlZ1BvaW50LCBlbmRQb2ludDsNCisgICAgYmVnUG9pbnQuU2V0KGZ4MSwgZnkxKTsNCisgICAgZW5kUG9pbnQuU2V0KGZ4MiwgZnkyKTsNCisgICAgQ0ZYX1NoYWRpbmcgc2hhZGluZzsNCisgICAgc2hhZGluZy5DcmVhdGVBeGlhbChiZWdQb2ludCwgZW5kUG9pbnQsIEZBTFNFLCBGQUxTRSwgYmVnaW5Db2xvciwgZW5kQ29sb3IpOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9Db2xvciBjb2xvcjEoJnNoYWRpbmcpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY29sb3IxKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aChwYXRoLCBmaWxsTW9kZSwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QW5udWx1c1JlY3QoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0FSR0IgZmlsbENvbG9yLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9GTE9BVCBmUmluZ1dpZHRoICwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9Db2xvciBjcihmaWxsQ29sb3IpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW5uZXIoKnBSZWN0KTsNCisgICAgcnRJbm5lci5EZWZsYXRlKGZSaW5nV2lkdGgsIGZSaW5nV2lkdGgpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBbm51bHVzQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9BUkdCIGZpbGxDb2xvciwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfRkxPQVQgZldpZHRoICwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KKyAgICBpZiAoZldpZHRoID4gcFJlY3QtPndpZHRoIC8gMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyKGZpbGxDb2xvcik7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkRWxsaXBzZSgqcFJlY3QpOw0KKyAgICBDRlhfUmVjdEYgcnRJbigqcFJlY3QpOw0KKyAgICBydEluLkluZmxhdGUoLWZXaWR0aCwgLWZXaWR0aCk7DQorICAgIHBhdGguQWRkRWxsaXBzZShydEluKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Rm9jdXMoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZWN0KTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgICAgRlhfRkxPQVQgRGFzaFBhdHRlcm5bMl0gPSB7MSwgMX07DQorICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMC4wZiwgRGFzaFBhdHRlcm4sIDIpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCisjZGVmaW5lIEZXTFRIRU1FX0FSUk9XX0Rlbm9taW5hdG9yCTMNCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBcnJvdyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGWF9BUkdCIGFyZ2JGaWxsLCBGWF9CT09MIGJQcmVzc2VkLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIENGWF9SZWN0RiBydEFycm93KCpwUmVjdCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIEZYX0ZMT0FUIGZCdG4gPSBGWF9NSU4ocFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KSAvIEZXTFRIRU1FX0FSUk9XX0Rlbm9taW5hdG9yOw0KKyAgICBydEFycm93LmxlZnQgPSBwUmVjdC0+bGVmdCArIChwUmVjdC0+d2lkdGggLSBmQnRuKSAvIDI7DQorICAgIHJ0QXJyb3cudG9wID0gcFJlY3QtPnRvcCArIChwUmVjdC0+aGVpZ2h0IC0gZkJ0bikgLyAyOw0KKyAgICBydEFycm93LndpZHRoID0gZkJ0bjsNCisgICAgcnRBcnJvdy5oZWlnaHQgPSBmQnRuOw0KKyAgICBpZiAoYlByZXNzZWQpIHsNCisgICAgICAgIHJ0QXJyb3cuT2Zmc2V0KDEsIDEpOw0KKyAgICB9DQorICAgIHN3aXRjaCAoZURpY3QpIHsNCisgICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX1VwOiB7DQorICAgICAgICAgICAgICAgIHBhdGguTW92ZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCArIGZCdG4gLyAyLCBydEFycm93LnRvcCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0xlZnQ6IHsNCisgICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3AgKyBmQnRuIC8gMik7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy50b3ApOw0KKyAgICAgICAgICAgICAgICBicmVhayA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQ6IHsNCisgICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy50b3AgKyBmQnRuIC8gMik7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3ApOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duOg0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBwYXRoLk1vdmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cudG9wKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCArIGZCdG4gLyAyLCBydEFycm93LmJvdHRvbSgpKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyKGFyZ2JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZYX0FSR0IgYXJnU2lnbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBDRlhfUmVjdEYgcnRBcnJvdygqcFJlY3QpOw0KKyAgICBGWF9CT09MIGJWZXJ0ID0gKGVEaWN0ID09IEZXTFRIRU1FX0RJUkVDVElPTl9VcCB8fCBlRGljdCA9PSBGV0xUSEVNRV9ESVJFQ1RJT05fRG93bik7DQorICAgIEZYX0ZMT0FUIGZMZWZ0ID0gKEZYX0ZMT0FUKSgoKHBSZWN0LT53aWR0aCAtIChiVmVydCA/IDkgOiA2KSkgLyAyICsgcFJlY3QtPmxlZnQpICsgMC41KTsNCisgICAgRlhfRkxPQVQgZlRvcCA9IChGWF9GTE9BVCkoKChwUmVjdC0+aGVpZ2h0IC0gKGJWZXJ0ID8gNiA6IDkpKSAvIDIgKyBwUmVjdC0+dG9wKSArIDAuNSk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHN3aXRjaCAoZURpY3QpIHsNCisgICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0Rvd246IHsNCisgICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8oZkxlZnQsIGZUb3AgKyAxKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wICsgNSk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgOCwgZlRvcCArIDEpOw0KKyAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDcsIGZUb3ApOw0KKyAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDQsIGZUb3AgKyAzKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAxLCBmVG9wKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xUSEVNRV9ESVJFQ1RJT05fVXA6IHsNCisgICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8oZkxlZnQsIGZUb3AgKyA0KTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA4LCBmVG9wICsgNCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNywgZlRvcCArIDUpOw0KKyAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDQsIGZUb3AgKyAyKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAxLCBmVG9wICsgNSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX1JpZ2h0OiB7DQorICAgICAgICAgICAgICAgIHBhdGguTW92ZVRvKGZMZWZ0ICsgMSwgZlRvcCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNSwgZlRvcCArIDQpOw0KKyAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDEsIGZUb3AgKyA4KTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQsIGZUb3AgKyA3KTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAzLCBmVG9wICsgNCk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0LCBmVG9wICsgMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0xlZnQ6IHsNCisgICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8oZkxlZnQsIGZUb3AgKyA0KTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wKTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA1LCBmVG9wICsgMSk7DQorICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMiwgZlRvcCArIDQpOw0KKyAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDUsIGZUb3AgKyA3KTsNCisgICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wICsgOCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfQ29sb3IgY3IoYXJnU2lnbik7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgaWYgKCFDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpKSB7DQorICAgICAgICBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKS0+U2V0Q29sb3JEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSk7DQorICAgIH0NCisgICAgQ0ZXTF9BcnJvd0RhdGE6OkNDb2xvckRhdGEgKnBDb2xvckRhdGEgPSBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKS0+bV9wQ29sb3JEYXRhOw0KKyAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AsDQorICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgIGZCb3R0b20sDQorICAgICAgICAgICAgICAgICAgICAgcENvbG9yRGF0YS0+Y2xyU3RhcnRbZVN0YXRlIC0gMV0sDQorICAgICAgICAgICAgICAgICAgICAgcENvbG9yRGF0YS0+Y2xyRW5kW2VTdGF0ZSAtIDFdLA0KKyAgICAgICAgICAgICAgICAgICAgICZwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQorICAgIHJjU3Ryb2tlLlNldChwQ29sb3JEYXRhLT5jbHJCb3JkZXJbZVN0YXRlIC0gMV0pOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZyY1N0cm9rZSk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBEcmF3QnRuKHBHcmFwaGljcywgcFJlY3QsIGVTdGF0ZSwgcE1hdHJpeCk7DQorICAgIGlmICghQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKSkgew0KKyAgICAgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPlNldENvbG9yRGF0YShGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkpOw0KKyAgICB9DQorICAgIENGV0xfQXJyb3dEYXRhOjpDQ29sb3JEYXRhICpwQ29sb3JEYXRhID0gQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPm1fcENvbG9yRGF0YTsNCisgICAgRHJhd0Fycm93KHBHcmFwaGljcywgcFJlY3QsIGVEaWN0LCBwQ29sb3JEYXRhLT5jbHJTaWduW2VTdGF0ZSAtIDFdLCBwTWF0cml4KTsNCit9DQorRldMQ09MT1IgQ0ZXTF9XaWRnZXRUUDo6QmxlbmRDb2xvcihGV0xDT0xPUiBzcmNDb2xvciwgRldMQ09MT1IgcmVuZGVyQ29sb3IsIEZYX0JZVEUgc2NhbGUpDQorew0KKyAgICBGV0xDT0xPUiBkc3RDb2xvcjsNCisgICAgRlhfQllURSBuID0gMjU1IC0gc2NhbGU7DQorICAgIGRzdENvbG9yLmEgPSAoRlhfQllURSkoKChGWF9XT1JEKXNyY0NvbG9yLmEgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuYSAqIHNjYWxlKSA+PiA4KTsNCisgICAgZHN0Q29sb3IuciA9IChGWF9CWVRFKSgoKEZYX1dPUkQpc3JjQ29sb3IuciAqIG4gKyAoRlhfV09SRClyZW5kZXJDb2xvci5yICogc2NhbGUpID4+IDgpOw0KKyAgICBkc3RDb2xvci5nID0gKEZYX0JZVEUpKCgoRlhfV09SRClzcmNDb2xvci5nICogbiArIChGWF9XT1JEKXJlbmRlckNvbG9yLmcgKiBzY2FsZSkgPj4gOCk7DQorICAgIGRzdENvbG9yLmIgPSAoRlhfQllURSkoKChGWF9XT1JEKXNyY0NvbG9yLmIgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuYiAqIHNjYWxlKSA+PiA4KTsNCisgICAgcmV0dXJuIGRzdENvbG9yOw0KK30NCitDRldMX0Fycm93RGF0YTo6Q0ZXTF9BcnJvd0RhdGEoKQ0KKyAgICA6IG1fcENvbG9yRGF0YShOVUxMKQ0KK3sNCisgICAgU2V0Q29sb3JEYXRhKDApOw0KK30NCitDRldMX0ZvbnRNYW5hZ2VyICpGV0xfR2V0Rm9udE1hbmFnZXIoKQ0KK3sNCisgICAgc3RhdGljIENGV0xfRm9udE1hbmFnZXIgKiBfZm9udE1hbmFnZXIgPSBOVUxMOw0KKyAgICBpZiAoX2ZvbnRNYW5hZ2VyID09IE5VTEwpIHsNCisgICAgICAgIF9mb250TWFuYWdlciA9IEZYX05FVyBDRldMX0ZvbnRNYW5hZ2VyOw0KKyAgICB9DQorICAgIHJldHVybiBfZm9udE1hbmFnZXI7DQorfQ0KK3ZvaWQgRldMX1JlbGVhc2VGb250TWFuYWdlcigpDQorew0KKyAgICBDRldMX0ZvbnRNYW5hZ2VyICogZm9udE1hbmFnZXIgPSBGV0xfR2V0Rm9udE1hbmFnZXIoKTsNCisgICAgZGVsZXRlIGZvbnRNYW5hZ2VyOw0KK30NCitDRldMX0ZvbnREYXRhOjpDRldMX0ZvbnREYXRhKCkNCisgICAgOiBtX2R3U3R5bGVzKDApDQorICAgICwgbV9kd0NvZGVQYWdlKDApDQorICAgICwgbV9wRm9udCgwKQ0KKyAgICAsIG1fcEZvbnRNZ3IoTlVMTCkNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAsIG1fcEZvbnRTb3VyY2UoTlVMTCkNCisjZW5kaWYNCit7DQorfQ0KK0NGV0xfRm9udERhdGE6On5DRldMX0ZvbnREYXRhKCkNCit7DQorICAgIGlmIChtX3BGb250KSB7DQorICAgICAgICBtX3BGb250LT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEZvbnRNZ3IpIHsNCisgICAgICAgIG1fcEZvbnRNZ3ItPlJlbGVhc2UoKTsNCisgICAgfQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIGlmKG1fcEZvbnRTb3VyY2UgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorI2VuZGlmDQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb250RGF0YTo6RXF1YWwoRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpDQorew0KKyAgICByZXR1cm4gbV93c0ZhbWlseSA9PSB3c0ZvbnRGYW1pbHkgJiYgbV9kd1N0eWxlcyA9PSBkd0ZvbnRTdHlsZXMgJiYgbV9kd0NvZGVQYWdlID09IHdDb2RlUGFnZTsNCit9DQorRlhfQk9PTCBDRldMX0ZvbnREYXRhOjpMb2FkRm9udChGWF9XU1RSIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIGR3Q29kZVBhZ2UpDQorew0KKyAgICBtX3dzRmFtaWx5ID0gd3NGb250RmFtaWx5Ow0KKyAgICBtX2R3U3R5bGVzID0gZHdGb250U3R5bGVzOw0KKyAgICBtX2R3Q29kZVBhZ2UgPSBkd0NvZGVQYWdlOw0KKyAgICBpZiAoIW1fcEZvbnRNZ3IpIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgICAgbV9wRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUoRlhfR2V0RGVmRm9udEVudW1lcmF0b3IoKSk7DQorI2Vsc2UNCisgICAgICAgIG1fcEZvbnRTb3VyY2UgPSBGWF9DcmVhdGVEZWZhdWx0Rm9udFNvdXJjZUVudW0oKTsNCisgICAgICAgIG1fcEZvbnRNZ3IgPSBJRlhfRm9udE1ncjo6Q3JlYXRlKG1fcEZvbnRTb3VyY2UpOw0KKyNlbmRpZg0KKyAgICB9DQorICAgIG1fcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQod3NGb250RmFtaWx5LkdldFB0cigpLCBkd0ZvbnRTdHlsZXMsIGR3Q29kZVBhZ2UsIG1fcEZvbnRNZ3IpOw0KKyAgICByZXR1cm4gbV9wRm9udCAhPSBOVUxMOw0KK30NCitDRldMX0ZvbnRNYW5hZ2VyOjpDRldMX0ZvbnRNYW5hZ2VyKCkNCit7DQorfQ0KK0NGV0xfRm9udE1hbmFnZXI6On5DRldMX0ZvbnRNYW5hZ2VyKCkNCit7DQorICAgIEZYX0lOVDMyIGNvdW50ID0gbV9hcnJGb250cy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgew0KKyAgICAgICAgQ0ZXTF9Gb250RGF0YSAqZGF0YSA9IChDRldMX0ZvbnREYXRhKiltX2FyckZvbnRzW2ldOw0KKyAgICAgICAgZGVsZXRlIGRhdGE7DQorICAgIH0NCisgICAgbV9hcnJGb250cy5SZW1vdmVBbGwoKTsNCit9DQorSUZYX0ZvbnQqIENGV0xfRm9udE1hbmFnZXI6OkZpbmRGb250KEZYX1dTVFIgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KK3sNCisgICAgRlhfSU5UMzIgY291bnQgPSBtX2FyckZvbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7DQorICAgICAgICBDRldMX0ZvbnREYXRhICpkYXRhID0gKENGV0xfRm9udERhdGEqKW1fYXJyRm9udHNbaV07DQorICAgICAgICBpZiAoZGF0YS0+RXF1YWwod3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gZGF0YS0+R2V0Rm9udCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGV0xfRm9udERhdGEgKmZvbnREYXRhID0gRlhfTkVXIENGV0xfRm9udERhdGE7DQorICAgIGlmICghZm9udERhdGEtPkxvYWRGb250KHdzRm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpKSB7DQorICAgICAgICBkZWxldGUgZm9udERhdGE7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBtX2FyckZvbnRzLkFkZChmb250RGF0YSk7DQorICAgIHJldHVybiBmb250RGF0YS0+R2V0Rm9udCgpOw0KK30NCitGWF9CT09MCUZXTFRIRU1FX0luaXQoKQ0KK3sNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgRldMVEhFTUVfUmVsZWFzZSgpDQorew0KKyAgICBDRldMX0Fycm93RGF0YTo6RGVzdHJveUluc3RhbmNlKCk7DQorICAgIEZXTF9SZWxlYXNlRm9udE1hbmFnZXIoKTsNCit9DQorRlhfRFdPUkQgRldMX0dldFRoZW1lTGF5b3V0KEZYX0RXT1JEIGR3VGhlbWVJRCkNCit7DQorICAgIHJldHVybiAweGZmZmYwMDAwICYgZHdUaGVtZUlEOw0KK30NCitGWF9EV09SRCBGV0xfR2V0VGhlbWVDb2xvcihGWF9EV09SRCBkd1RoZW1lSUQpDQorew0KKyAgICByZXR1cm4gMHgwMDAwZmZmZiAmIGR3VGhlbWVJRDsNCit9DQorRlhfRFdPUkQgRldMX01ha2VUaGVtZUlEKEZYX0RXT1JEIGR3TGF5b3V0LCBGWF9EV09SRCBkd0NvbG9yKQ0KK3sNCisgICAgcmV0dXJuIChkd0xheW91dCA8PCAxNikgfCAoMHgwMDAwRkZGRiAmIGR3Q29sb3IpOw0KK30NCitDRldMX0Fycm93RGF0YSAqQ0ZXTF9BcnJvd0RhdGE6Om1fcEluc3RhbmNlID0gTlVMTDsNCitDRldMX0Fycm93RGF0YSogQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCkNCit7DQorICAgIGlmICghbV9wSW5zdGFuY2UpIHsNCisgICAgICAgIG1fcEluc3RhbmNlID0gRlhfTkVXIENGV0xfQXJyb3dEYXRhOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BJbnN0YW5jZTsNCit9DQorRlhfQk9PTCBDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpDQorew0KKyAgICByZXR1cm4gKG1fcEluc3RhbmNlICE9IE5VTEwpOw0KK30NCit2b2lkIENGV0xfQXJyb3dEYXRhOjpEZXN0cm95SW5zdGFuY2UoKQ0KK3sNCisgICAgaWYgKG1fcEluc3RhbmNlKSB7DQorICAgICAgICBkZWxldGUgbV9wSW5zdGFuY2U7DQorICAgICAgICBtX3BJbnN0YW5jZSA9IE5VTEw7DQorICAgIH0NCit9DQorQ0ZXTF9BcnJvd0RhdGE6On5DRldMX0Fycm93RGF0YSgpDQorew0KKyAgICBpZiAobV9wQ29sb3JEYXRhKSB7DQorICAgICAgICBkZWxldGUgbV9wQ29sb3JEYXRhOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhID0gTlVMTDsNCisgICAgfQ0KK30NCit2b2lkIENGV0xfQXJyb3dEYXRhOjpTZXRDb2xvckRhdGEoRlhfRFdPUkQJZHdJRCkNCit7DQorICAgIGlmICghbV9wQ29sb3JEYXRhKSB7DQorICAgICAgICBtX3BDb2xvckRhdGEgPSBGWF9ORVcgQ0NvbG9yRGF0YTsNCisgICAgfQ0KKyAgICBpZiAoZHdJRCkgew0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMTQyLCAxNTMsIDEyNSk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNTcsIDE3MSwgMTE5KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzJdID0gQXJnYkVuY29kZSgyNTUsIDExOCwgMTMxLCA5Nyk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjAzLCAyMTUsIDE4Nik7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsclN0YXJ0WzFdID0gQXJnYkVuY29kZSgyNTUsIDIxOCwgMjMyLCAxODUpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDMsIDIxNSwgMTg2KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU0LCAyNTQsIDI1MSk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNDksIDE2NywgMTE3KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDE5OCwgMjExLCAxNTUpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMTQ5LCAxNjcsIDExNyk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDMsIDI0MSwgMjM2KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMjgsIDEyOCwgMTI4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDIwMiwgMjE2LCAyNDkpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMTcxLCAxOTAsIDIzMyk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMzUsIDE0NywgMjE5KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzNdID0gQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjUsIDIzNCwgMjU0KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjUzLCAyNTUsIDI1NSk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsclN0YXJ0WzJdID0gQXJnYkVuY29kZSgyNTUsIDExMCwgMTQyLCAyNDEpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTQsIDI1NCwgMjUxKTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzBdID0gQXJnYkVuY29kZSgyNTUsIDE3NSwgMjA0LCAyNTEpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMTg1LCAyMTgsIDI1MSk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMTAsIDIyMiwgMjM1KTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzNdID0gQXJnYkVuY29kZSgyNTUsIDI0MywgMjQxLCAyMzYpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTaWduWzBdID0gQXJnYkVuY29kZSgyNTUsIDc3LCA5NywgMTMzKTsNCisgICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsxXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgICAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMl0gPSBBcmdiRW5jb2RlKDI1NSwgNzcsIDk3LCAxMzMpOw0KKyAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTaWduWzNdID0gQXJnYkVuY29kZSgyNTUsIDEyOCwgMTI4LCAxMjgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19BU0NJSUVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0FTQ0lJRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmZWMzNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19BU0NJSUVuY29kZXIuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfU3ltYm9sU2hhcGVIaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0FTQ0lJRW5jb2Rlci5oIg0KK0NCQ19BU0NJSUVuY29kZXI6OkNCQ19BU0NJSUVuY29kZXIoKQ0KK3sNCit9DQorQ0JDX0FTQ0lJRW5jb2Rlcjo6fkNCQ19BU0NJSUVuY29kZXIoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX0FTQ0lJRW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkNCit7DQorICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOw0KK30NCit2b2lkIENCQ19BU0NJSUVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbiA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoY29udGV4dC5tX21zZywgY29udGV4dC5tX3Bvcyk7DQorICAgIGlmIChuID49IDIpIHsNCisgICAgICAgIEZYX1dDSEFSIGNvZGUgPSBlbmNvZGVBU0NJSURpZ2l0cyhjb250ZXh0Lm1fbXNnLkdldEF0KGNvbnRleHQubV9wb3MpLCBjb250ZXh0Lm1fbXNnLkdldEF0KGNvbnRleHQubV9wb3MgKyAxKSwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKGNvZGUpOw0KKyAgICAgICAgY29udGV4dC5tX3BvcyArPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCisgICAgICAgIEZYX0lOVDMyIG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KKyAgICAgICAgICAgIHN3aXRjaCAobmV3TW9kZSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIEJBU0UyNTZfRU5DT0RBVElPTjoNCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQkFTRTI1Nik7DQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQkFTRTI1Nl9FTkNPREFUSU9OKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgY2FzZSBDNDBfRU5DT0RBVElPTjoNCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwKTsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShDNDBfRU5DT0RBVElPTik7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIGNhc2UgWDEyX0VOQ09EQVRJT046DQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0FOU0lYMTIpOw0KKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFgxMl9FTkNPREFUSU9OKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFRFWFRfRU5DT0RBVElPTjoNCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fVEVYVCk7DQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoVEVYVF9FTkNPREFUSU9OKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEVESUZBQ1RfRU5DT0RBVElPTjoNCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fRURJRkFDVCk7DQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoRURJRkFDVF9FTkNPREFUSU9OKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlSWxsZWdhbE1vZGU7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQorICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpVUFBFUl9TSElGVCk7DQorICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKChGWF9XQ0hBUikgKGMgLSAxMjggKyAxKSk7DQorICAgICAgICAgICAgY29udGV4dC5tX3BvcysrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoKEZYX1dDSEFSKSAoYyArIDEpKTsNCisgICAgICAgICAgICBjb250ZXh0Lm1fcG9zKys7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfV0NIQVIgQ0JDX0FTQ0lJRW5jb2Rlcjo6ZW5jb2RlQVNDSUlEaWdpdHMoRlhfV0NIQVIgZGlnaXQxLCBGWF9XQ0hBUiBkaWdpdDIsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KGRpZ2l0MSkgJiYgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQoZGlnaXQyKSkgew0KKyAgICAgICAgRlhfSU5UMzIgbnVtID0gKGRpZ2l0MSAtIDQ4KSAqIDEwICsgKGRpZ2l0MiAtIDQ4KTsNCisgICAgICAgIEZYX1dDSEFSIGEgPSAoRlhfV0NIQVIpIChudW0gKyAxMzApOw0KKyAgICAgICAgcmV0dXJuIChGWF9XQ0hBUikgKG51bSArIDEzMCk7DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Tm90R2lnaXRzOw0KKyAgICByZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0JhckNvZGUuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0JhckNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmMxMGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQmFyQ29kZS5jcHAKQEAgLTAsMCArMSw4NTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRGltUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGUzOVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RlMzlXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kYUJhclJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RhQmFyV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGUxMjhSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRFQU44UmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZEVBTjhXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkRUFOMTNSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkRUFOMTNXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkVVBDQVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRVUENBV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29tcGFjdGlvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxNy5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN1dyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4V3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfTHVtaW5hbmNlU291cmNlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0JpbmFyaXplci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0JpbmFyeUJpdG1hcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdG9yLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EZWNvZGVyUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29kZXdvcmQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c0dGLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN1JlYWRlci5oIg0KK0NCQ19Db2RlQmFzZSA6OiBDQkNfQ29kZUJhc2UoKQ0KK3sNCit9DQorQ0JDX0NvZGVCYXNlIDo6IH5DQkNfQ29kZUJhc2UoKQ0KK3sNCit9DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldENoYXJFbmNvZGluZyhGWF9JTlQzMiBlbmNvZGluZykNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgcmV0dXJuIG1fcEJDV3JpdGVyLT5TZXRDaGFyRW5jb2RpbmcoZW5jb2RpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldE1vZHVsZUhlaWdodChGWF9JTlQzMiBtb2R1bGVIZWlnaHQpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0TW9kdWxlSGVpZ2h0KG1vZHVsZUhlaWdodCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RlQmFzZTo6U2V0TW9kdWxlV2lkdGgoRlhfSU5UMzIgbW9kdWxlV2lkdGgpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0TW9kdWxlV2lkdGgobW9kdWxlV2lkdGgpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldEhlaWdodChGWF9JTlQzMiBoZWlnaHQpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0SGVpZ2h0KGhlaWdodCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RlQmFzZTo6U2V0V2lkdGgoRlhfSU5UMzIgd2lkdGgpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0V2lkdGgod2lkdGgpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDQkNfQ29kZUJhc2U6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgbV9wQkNXcml0ZXItPlNldEJhY2tncm91bmRDb2xvcihiYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX0NvZGVCYXNlOjpTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIG1fcEJDV3JpdGVyLT5TZXRCYXJjb2RlQ29sb3IoZm9yZWdyb3VuZENvbG9yKTsNCisgICAgfQ0KK30NCitDQkNfT25lQ29kZTo6Q0JDX09uZUNvZGUoKQ0KK3sNCit9Ow0KK0NCQ19PbmVDb2RlOjp+Q0JDX09uZUNvZGUoKQ0KK3sNCit9DQorRlhfQk9PTCBDQkNfT25lQ29kZTo6Q2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgcmV0dXJuICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5DaGVja0NvbnRlbnRWYWxpZGl0eShjb250ZW50cyk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lQ29kZTo6RmlsdGVyQ29udGVudHMoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHRtcDsNCisgICAgaWYgKG1fcEJDV3JpdGVyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiB0bXA7DQorICAgIH0NCisgICAgcmV0dXJuICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSkNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFByaW50Q2hlY2tzdW0oY2hlY2tzdW0pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKQ0KK3sNCisgICAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RGF0YUxlbmd0aChsZW5ndGgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldENhbENoZWNrc3VtKEZYX0JPT0wgY2FsYykNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldENhbGNDaGVja3N1bShjYWxjKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENCQ19PbmVDb2RlOjpTZXRGb250KENGWF9Gb250KiBjRm9udCkNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgcmV0dXJuICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRGb250KGNGb250KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRGb250U2l6ZShzaXplKTsNCisgICAgfQ0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXRGb250U3R5bGUoRlhfSU5UMzIgc3R5bGUpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRGb250U3R5bGUoc3R5bGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKQ0KK3sNCisgICAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0Rm9udENvbG9yKGNvbG9yKTsNCisgICAgfQ0KK30NCitDQkNfQ29kZTM5OjpDQkNfQ29kZTM5KCkNCit7DQorICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgKENCQ19PbmVkQ29kZTM5UmVhZGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyAoQ0JDX09uZWRDb2RlMzlXcml0ZXIpOw0KK30NCitDQkNfQ29kZTM5OjpDQkNfQ29kZTM5KEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0KQ0KK3sNCisgICAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopIEZYX05FVyBDQkNfT25lZENvZGUzOVJlYWRlcih1c2luZ0NoZWNrRGlnaXQpOw0KKyAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKikgRlhfTkVXIENCQ19PbmVkQ29kZTM5V3JpdGVyOw0KK30NCitDQkNfQ29kZTM5OjpDQkNfQ29kZTM5KEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSkNCit7DQorICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgQ0JDX09uZWRDb2RlMzlSZWFkZXIodXNpbmdDaGVja0RpZ2l0LCBleHRlbmRlZE1vZGUpOw0KKyAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKikgRlhfTkVXIENCQ19PbmVkQ29kZTM5V3JpdGVyKGV4dGVuZGVkTW9kZSk7DQorfQ0KK0NCQ19Db2RlMzk6On5DQkNfQ29kZTM5KCkNCit7DQorICAgIGlmKG1fcEJDUmVhZGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KKyAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KKyAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUzOTo6RW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoY29udGVudHMuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEJDRk9STUFUIGZvcm1hdAk9IEJDRk9STUFUX0NPREVfMzk7DQorICAgIEZYX0lOVDMyIG91dFdpZHRoID0gMDsNCisgICAgRlhfSU5UMzIgb3V0SGVpZ2h0ID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHMgPSAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29udGVudHMgPSAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclRleHRDb250ZW50cyhjb250ZW50cyk7DQorICAgIG1fcmVuZGVyQ29udGVudHMgPSByZW5kZXJDb250ZW50czsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9ICBmaWx0ZXJjb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICAgIEZYX0JZVEUgKmRhdGEgPSBtX3BCQ1dyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQocmVuZGVyQ29udGVudHMsIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7DQorICAgIEZYX0ZyZWUoZGF0YSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNCQ19Db2RlMzk6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPmVuY29kZWRDb250ZW50cyhtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgcmVuZGVyQ29uLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX0NvZGUzOTo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cywgZSk7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgcmVuZGVyQ29uLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMzk6OkRlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7DQorICAgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMzk6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK30NCitGWF9CT09MIENCQ19Db2RlMzk6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RlMzlXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0VGV4dExvY2F0aW9uKGxvY2F0aW9uKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUzOTo6U2V0V2lkZU5hcnJvd1JhdGlvKEZYX0lOVDMyIHJhdGlvKQ0KK3sNCisgICAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICByZXR1cm4gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRXaWRlTmFycm93UmF0aW8ocmF0aW8pOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorQ0JDX0NvZGFiYXI6OkNCQ19Db2RhYmFyKCkNCit7DQorICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgKENCQ19PbmVkQ29kYUJhclJlYWRlcik7DQorICAgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKSBGWF9ORVcgKENCQ19PbmVkQ29kYUJhcldyaXRlcik7DQorfQ0KK0NCQ19Db2RhYmFyOjp+Q0JDX0NvZGFiYXIoKQ0KK3sNCisgICAgaWYobV9wQkNSZWFkZXIpIHsNCisgICAgICAgIGRlbGV0ZShtX3BCQ1JlYWRlcik7DQorICAgICAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIGRlbGV0ZShtX3BCQ1dyaXRlcik7DQorICAgICAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICAgIH0NCit9DQorRlhfQk9PTCBDQkNfQ29kYWJhcjo6U2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpDQorew0KKyAgICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRTdGFydENoYXIoc3RhcnQpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kYWJhcjo6U2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RhQmFyV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEVuZENoYXIoZW5kKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikNCit7DQorICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopIG1fcEJDV3JpdGVyKS0+U2V0VGV4dExvY2F0aW9uKGxvY2F0aW9uKTsNCit9DQorRlhfQk9PTCBDQkNfQ29kYWJhcjo6U2V0V2lkZU5hcnJvd1JhdGlvKEZYX0lOVDMyIHJhdGlvKQ0KK3sNCisgICAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICByZXR1cm4gKChDQkNfT25lZENvZGFCYXJXcml0ZXIqKSBtX3BCQ1dyaXRlciktPlNldFdpZGVOYXJyb3dSYXRpbyhyYXRpbyk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihjb250ZW50cy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQkNGT1JNQVQgZm9ybWF0CT0gQkNGT1JNQVRfQ09EQUJBUjsNCisgICAgRlhfSU5UMzIgb3V0V2lkdGggPSAwOw0KKyAgICBGWF9JTlQzMiBvdXRIZWlnaHQgPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50cyA9ICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBmaWx0ZXJjb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICAgIG1fcmVuZGVyQ29udGVudHMgPSBmaWx0ZXJjb250ZW50czsNCisgICAgRlhfQllURSAqZGF0YSA9IG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclJlc3VsdChmaWx0ZXJjb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgICAgRlhfRnJlZShkYXRhKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX0NvZGFiYXI6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngsIHJlbmRlckNvbiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNCQ19Db2RhYmFyOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgcmVuZGVyQ29uLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RhYmFyOjpEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQ29kYWJhcjo6RGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICAgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgICBDQkNfQmluYXJ5Qml0bWFwICBiaXRtYXAoJmJpbmFyaXplcik7DQorICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorfQ0KK0NCQ19Db2RlMTI4OjpDQkNfQ29kZTEyOChCQ19UWVBFIHR5cGUpDQorew0KKyAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyICopIEZYX05FVyAoQ0JDX09uZWRDb2RlMTI4UmVhZGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciAqKSBGWF9ORVcgQ0JDX09uZWRDb2RlMTI4V3JpdGVyKHR5cGUpOw0KK30NCitDQkNfQ29kZTEyODo6fkNCQ19Db2RlMTI4KCkNCit7DQorICAgIGlmKG1fcEJDUmVhZGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KKyAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KKyAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUxMjg6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikNCit7DQorICAgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgcmV0dXJuICgoIENCQ19PbmVkQ29kZTEyOFdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZTEyODo6RW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoY29udGVudHMuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEJDRk9STUFUIGZvcm1hdAk9IEJDRk9STUFUX0NPREVfMTI4Ow0KKyAgICBGWF9JTlQzMiBvdXRXaWR0aCA9IDA7DQorICAgIEZYX0lOVDMyIG91dEhlaWdodCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBjb250ZW50czsNCisgICAgaWYgKGNvbnRlbnRzLkdldExlbmd0aCgpICUgMiAmJiAoKENCQ19PbmVkQ29kZTEyOFdyaXRlciAqKW1fcEJDV3JpdGVyKS0+R2V0VHlwZSgpID09IEJDX0NPREUxMjhfQykgew0KKyAgICAgICAgY29udGVudCArPSAnMCc7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSAoKENCQ19PbmVkQ29kZTEyOFdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50KTsNCisgICAgbV9yZW5kZXJDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgICBGWF9CWVRFICpkYXRhID0gbV9wQkNXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KKyAgICBGWF9GcmVlKGRhdGEpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDQkNfQ29kZTEyODo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBGWF9JTlQzMiAmZSkNCit7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDQkNfQ29kZTEyODo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMTI4OjpEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQ29kZTEyODo6RGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICAgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgICBDQkNfQmluYXJ5Qml0bWFwICBiaXRtYXAoJmJpbmFyaXplcik7DQorICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorfQ0KK0NCQ19FQU44OjpDQkNfRUFOOCgpDQorew0KKyAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKikgRlhfTkVXIChDQkNfT25lZEVBTjhSZWFkZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKikgRlhfTkVXIChDQkNfT25lZEVBTjhXcml0ZXIpOw0KK30NCitDQkNfRUFOODo6fkNCQ19FQU44KCkNCit7DQorICAgIGlmKG1fcEJDUmVhZGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KKyAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KKyAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0NGWF9XaWRlU3RyaW5nCUNCQ19FQU44OjpQcmVwcm9jZXNzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9ICgoQ0JDX09uZWRFQU44V3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gZW5jb2RlQ29udGVudHMuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChsZW5ndGggPD0gNykgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDcgLSBsZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgICAgICAgIEZYX0lOVDMyIGNoZWNrc3VtID0gKChDQkNfT25lZEVBTjhXcml0ZXIgKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgICAgIGVuY29kZUNvbnRlbnRzICs9IEZYX1dDSEFSKGNoZWNrc3VtIC0gMCArICcwJyk7DQorICAgIH0NCisgICAgaWYgKGxlbmd0aCA+IDgpIHsNCisgICAgICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTWlkKDAsIDgpOw0KKyAgICB9DQorICAgIHJldHVybiBlbmNvZGVDb250ZW50czsNCit9DQorRlhfQk9PTCBDQkNfRUFOODo6RW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoY29udGVudHMuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEJDRk9STUFUIGZvcm1hdAk9IEJDRk9STUFUX0VBTl84Ow0KKyAgICBGWF9JTlQzMiBvdXRXaWR0aCA9IDA7DQorICAgIEZYX0lOVDMyIG91dEhlaWdodCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICAgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsNCisgICAgRlhfQllURSAqZGF0YSA9IG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgICAgRlhfRnJlZShkYXRhKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX0VBTjg6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX0VBTjg6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSkNCit7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOODo6RGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgICAgcmV0dXJuIHN0cjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VBTjg6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK30NCitDQkNfRUFOMTM6OkNCQ19FQU4xMygpDQorew0KKyAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKikgRlhfTkVXIChDQkNfT25lZEVBTjEzUmVhZGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyAoQ0JDX09uZWRFQU4xM1dyaXRlcik7DQorfQ0KK0NCQ19FQU4xMzo6fkNCQ19FQU4xMygpDQorew0KKyAgICBpZihtX3BCQ1JlYWRlcikgew0KKyAgICAgICAgZGVsZXRlKG1fcEJDUmVhZGVyKTsNCisgICAgICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgZGVsZXRlKG1fcEJDV3JpdGVyKTsNCisgICAgICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgICAgfQ0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOMTM6OlByZXByb2Nlc3MoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gKChDQkNfT25lZEVBTjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOw0KKyAgICBGWF9JTlQzMiBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGxlbmd0aCA8PSAxMikgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDEyIC0gbGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBlbmNvZGVDb250ZW50cyA9IEZYX1dDSEFSKCcwJykgKyBlbmNvZGVDb250ZW50czsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICAgICAgICBGWF9JTlQzMiBjaGVja3N1bSA9ICgoQ0JDX09uZWRFQU4xM1dyaXRlciAqKW1fcEJDV3JpdGVyKS0+Q2FsY0NoZWNrc3VtKGJ5dGVTdHJpbmcpOw0KKyAgICAgICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7DQorICAgICAgICBlbmNvZGVDb250ZW50cyA9IGJ5dGVTdHJpbmcuVVRGOERlY29kZSgpOw0KKyAgICB9DQorICAgIGlmIChsZW5ndGggPiAxMykgew0KKyAgICAgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTMpOw0KKyAgICB9DQorICAgIHJldHVybiBlbmNvZGVDb250ZW50czsNCit9DQorRlhfQk9PTCBDQkNfRUFOMTM6OkVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBCQ0ZPUk1BVCBmb3JtYXQJPSBCQ0ZPUk1BVF9FQU5fMTM7DQorICAgIEZYX0lOVDMyIG91dFdpZHRoID0gMDsNCisgICAgRlhfSU5UMzIgb3V0SGVpZ2h0ID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBQcmVwcm9jZXNzKGNvbnRlbnRzKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgICAgbV9yZW5kZXJDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzOw0KKyAgICBGWF9CWVRFICpkYXRhID0gbV9wQkNXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KKyAgICBGWF9GcmVlKGRhdGEpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDQkNfRUFOMTM6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX0VBTjEzOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VBTjEzOjpEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOMTM6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK30NCitDQkNfVVBDQTo6Q0JDX1VQQ0EoKQ0KK3sNCisgICAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopIEZYX05FVyAoQ0JDX09uZWRVUENBUmVhZGVyKTsNCisgICAgKChDQkNfT25lZFVQQ0FSZWFkZXIgKiltX3BCQ1JlYWRlciktPkluaXQoKTsNCisgICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyAoQ0JDX09uZWRVUENBV3JpdGVyKTsNCit9DQorQ0JDX1VQQ0E6On5DQkNfVVBDQSgpDQorew0KKyAgICBpZihtX3BCQ1JlYWRlcikgew0KKyAgICAgICAgZGVsZXRlKG1fcEJDUmVhZGVyKTsNCisgICAgICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgZGVsZXRlKG1fcEJDV3JpdGVyKTsNCisgICAgICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgICAgfQ0KK30NCitDRlhfV2lkZVN0cmluZwlDQkNfVVBDQTo6UHJlcHJvY2VzcyhGWF9XU1RSIGNvbnRlbnRzKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSAoKENCQ19PbmVkRUFOOFdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICAgIEZYX0lOVDMyIGxlbmd0aCA9IGVuY29kZUNvbnRlbnRzLkdldExlbmd0aCgpOw0KKyAgICBpZiAobGVuZ3RoIDw9IDExKSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMTEgLSBsZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgICAgICAgIEZYX0lOVDMyIGNoZWNrc3VtID0gKChDQkNfT25lZFVQQ0FXcml0ZXIgKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgICAgIGJ5dGVTdHJpbmcgKz0gY2hlY2tzdW0gLSAwICsgJzAnOw0KKyAgICAgICAgZW5jb2RlQ29udGVudHMgPSBieXRlU3RyaW5nLlVURjhEZWNvZGUoKTsNCisgICAgfQ0KKyAgICBpZiAobGVuZ3RoID4gMTIpIHsNCisgICAgICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTWlkKDAsIDEyKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZW5jb2RlQ29udGVudHM7DQorfQ0KK0ZYX0JPT0wgQ0JDX1VQQ0E6OkVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBCQ0ZPUk1BVCBmb3JtYXQJPSBCQ0ZPUk1BVF9VUENfQTsNCisgICAgRlhfSU5UMzIgb3V0V2lkdGggPSAwOw0KKyAgICBGWF9JTlQzMiBvdXRIZWlnaHQgPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQorICAgICgoQ0JDX09uZWRVUENBV3JpdGVyKiltX3BCQ1dyaXRlciktPkluaXQoKTsNCisgICAgRlhfQllURSAqZGF0YSA9IG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgICAgRlhfRnJlZShkYXRhKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX1VQQ0E6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX1VQQ0E6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSkNCit7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfVVBDQTo6RGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgICAgcmV0dXJuIHN0cjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1VQQ0E6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK30NCitDQkNfUVJDb2RlOjpDQkNfUVJDb2RlKCkNCit7DQorICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIgKikgRlhfTkVXIChDQkNfUVJDb2RlUmVhZGVyKTsNCisgICAgKChDQkNfUVJDb2RlUmVhZGVyKiltX3BCQ1JlYWRlciktPkluaXQoKTsNCisgICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciAqKSBGWF9ORVcgKENCQ19RUkNvZGVXcml0ZXIpOw0KK30NCitDQkNfUVJDb2RlIDo6fkNCQ19RUkNvZGUoKQ0KK3sNCisgICAgaWYobV9wQkNSZWFkZXIpIHsNCisgICAgICAgIGRlbGV0ZShtX3BCQ1JlYWRlcik7DQorICAgICAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYobV9wQkNXcml0ZXIpIHsNCisgICAgICAgIGRlbGV0ZShtX3BCQ1dyaXRlcik7DQorICAgICAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICAgIH0NCit9DQorRlhfQk9PTCBDQkNfUVJDb2RlOjpTZXRWZXJzaW9uKEZYX0lOVDMyIHZlcnNpb24pDQorew0KKyAgICBpZiAodmVyc2lvbiA8IDAgfHwgdmVyc2lvbiA+IDQwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcEJDV3JpdGVyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4oKENCQ19RUkNvZGVXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0VmVyc2lvbih2ZXJzaW9uKTsNCit9DQorRlhfQk9PTCBDQkNfUVJDb2RlOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoRlhfSU5UMzIgbGV2ZWwpDQorew0KKyAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gMykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChtX3BCQ1dyaXRlciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChsZXZlbCk7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZTo6RW5jb2RlKEZYX1dTVFIgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgb3V0V2lkdGggPSAwOw0KKyAgICBGWF9JTlQzMiBvdXRIZWlnaHQgPSAwOw0KKyAgICBGWF9CWVRFICpkYXRhID0gKChDQkNfUVJDb2RlV3JpdGVyKiltX3BCQ1dyaXRlciktPkVuY29kZShjb250ZW50cywgKChDQkNfUVJDb2RlV3JpdGVyKiltX3BCQ1dyaXRlciktPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCksIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgICBGWF9GcmVlKGRhdGEpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDQkNfUVJDb2RlOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNCQ19RUkNvZGU6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSkNCit7DQorICAgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfUVJDb2RlOjpEZWNvZGUoRlhfQllURSogYnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfUVJDb2RlOjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgICAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICAgIENCQ19CaW5hcnlCaXRtYXAgIGJpdG1hcCgmYmluYXJpemVyKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0U3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHJldFN0ciwgcmV0U3RyLkdldExlbmd0aCgpKTsNCit9DQorQ0JDX1BERjQxN0k6OkNCQ19QREY0MTdJKCkNCit7DQorICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgKENCQ19QREY0MTdSZWFkZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKikgRlhfTkVXIChDQkNfUERGNDE3V3JpdGVyKTsNCit9DQorQ0JDX1BERjQxN0k6On5DQkNfUERGNDE3SSgpDQorew0KKyAgICBpZihtX3BCQ1JlYWRlcikgew0KKyAgICAgICAgZGVsZXRlKG1fcEJDUmVhZGVyKTsNCisgICAgICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX3BCQ1dyaXRlcikgew0KKyAgICAgICAgZGVsZXRlKG1fcEJDV3JpdGVyKTsNCisgICAgICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgICAgfQ0KK30NCitGWF9CT09MIENCQ19QREY0MTdJOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoRlhfSU5UMzIgbGV2ZWwpDQorew0KKyAgICAoKENCQ19QREY0MTdXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwobGV2ZWwpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQkNfUERGNDE3STo6U2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKQ0KK3sNCisgICAgKChDQkNfUERGNDE3V3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFRydW5jYXRlZCh0cnVuY2F0ZWQpOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdJOjpFbmNvZGUoRlhfV1NUUiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBCQ0ZPUk1BVCBmb3JtYXQJPSBCQ0ZPUk1BVF9QREZfNDE3Ow0KKyAgICBGWF9JTlQzMiBvdXRXaWR0aCA9IDA7DQorICAgIEZYX0lOVDMyIG91dEhlaWdodCA9IDA7DQorICAgIEZYX0JZVEUgKmRhdGEgPSAoKENCQ19QREY0MTdXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclJlc3VsdChkYXRhLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgICAgRlhfRnJlZShkYXRhKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX1BERjQxN0k6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX1BERjQxN0k6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiAmZSkNCit7DQorICAgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfUERGNDE3STo6RGVjb2RlKEZYX0JZVEUqIGJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgICAgcmV0dXJuIHN0cjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0k6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJ5dGVzdHJpbmcsIGJ5dGVzdHJpbmcuR2V0TGVuZ3RoKCkpOw0KK30NCitDQkNfRGF0YU1hdHJpeDo6Q0JDX0RhdGFNYXRyaXgoKQ0KK3sNCisgICAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopIEZYX05FVyAoQ0JDX0RhdGFNYXRyaXhSZWFkZXIpOw0KKyAgICAoKENCQ19EYXRhTWF0cml4UmVhZGVyKiltX3BCQ1JlYWRlciktPkluaXQoKTsNCisgICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyAoQ0JDX0RhdGFNYXRyaXhXcml0ZXIpOw0KK30NCitDQkNfRGF0YU1hdHJpeDo6fkNCQ19EYXRhTWF0cml4KCkNCit7DQorICAgIGlmKG1fcEJDUmVhZGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KKyAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcEJDV3JpdGVyKSB7DQorICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KKyAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0RhdGFNYXRyaXg6OkVuY29kZShGWF9XU1RSIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIG91dFdpZHRoID0gMDsNCisgICAgRlhfSU5UMzIgb3V0SGVpZ2h0ID0gMDsNCisgICAgRlhfQllURSAqZGF0YSA9ICgoQ0JDX0RhdGFNYXRyaXhXcml0ZXIgKiltX3BCQ1dyaXRlciktPkVuY29kZShjb250ZW50cywgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICAgIEZYX0ZyZWUoZGF0YSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNCQ19EYXRhTWF0cml4OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNCQ19EYXRhTWF0cml4OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXg6OkRlY29kZShGWF9CWVRFKiBidWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7DQorICAgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19EYXRhTWF0cml4OjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgICAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICAgIENCQ19CaW5hcnlCaXRtYXAgIGJpdG1hcCgmYmluYXJpemVyKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0U3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHJldFN0ciwgcmV0U3RyLkdldExlbmd0aCgpKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19CYXNlMjU2RW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlMWY0NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19CYXNlMjU2RW5jb2Rlci5jcHAKQEAgLTAsMCArMSw3OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmFzZTI1NkVuY29kZXIuaCINCitDQkNfQmFzZTI1NkVuY29kZXI6OkNCQ19CYXNlMjU2RW5jb2RlcigpDQorew0KK30NCitDQkNfQmFzZTI1NkVuY29kZXI6On5DQkNfQmFzZTI1NkVuY29kZXIoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX0Jhc2UyNTZFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKQ0KK3sNCisgICAgcmV0dXJuIEJBU0UyNTZfRU5DT0RBVElPTjsNCit9DQordm9pZCBDQkNfQmFzZTI1NkVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KKyAgICBidWZmZXIgKz0gKEZYX1dDSEFSKSdcMCc7DQorICAgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICAgICAgICBidWZmZXIgKz0gYzsNCisgICAgICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgICAgIEZYX0lOVDMyIG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KKyAgICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShuZXdNb2RlKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBkYXRhQ291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCkgLSAxOw0KKyAgICBGWF9DSEFSIGJ1ZlsxMjhdOw0KKyNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQorICAgIG1lbXNldChidWYsIDAsIHNpemVvZihGWF9DSEFSKSAqIDEyOCk7DQorICAgIF9pdG9hX3MoZGF0YUNvdW50LCBidWYsIDEyOCwgMTApOw0KKyNlbHNlDQorICAgIEZYU1lTX2l0b2EoZGF0YUNvdW50LCBidWYsIDEwKTsNCisjZW5kaWYNCisgICAgYnVmZmVyLlNldEF0KDAsIEZYX1dDSEFSKCpidWYpIC0gJzAnKTsNCisgICAgRlhfSU5UMzIgbGVuZ3RoRmllbGRTaXplID0gMTsNCisgICAgRlhfSU5UMzIgY3VycmVudFNpemUgPSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIGRhdGFDb3VudCArIGxlbmd0aEZpZWxkU2l6ZTsNCisgICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1cnJlbnRTaXplLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgbXVzdFBhZCA9IChjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJyZW50U2l6ZSkgPiAwOw0KKyAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpIHx8IG11c3RQYWQpIHsNCisgICAgICAgIGlmIChkYXRhQ291bnQgPD0gMjQ5KSB7DQorICAgICAgICAgICAgYnVmZmVyLlNldEF0KDAsIChGWF9XQ0hBUikgZGF0YUNvdW50KTsNCisgICAgICAgIH0gZWxzZSBpZiAoZGF0YUNvdW50ID4gMjQ5ICYmIGRhdGFDb3VudCA8PSAxNTU1KSB7DQorICAgICAgICAgICAgYnVmZmVyLlNldEF0KDAsIChGWF9XQ0hBUikgKChkYXRhQ291bnQgLyAyNTApICsgMjQ5KSk7DQorICAgICAgICAgICAgYnVmZmVyLkluc2VydCgxLCAoRlhfV0NIQVIpIChkYXRhQ291bnQgJSAyNTApKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlTWVzc2FnZUxlbmd0aEludmFsaWQ7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDAsIGMgPSBidWZmZXIuR2V0TGVuZ3RoKCk7IGkgPCBjOyBpKyspIHsNCisgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChyYW5kb21pemUyNTVTdGF0ZShidWZmZXIuR2V0QXQoaSksIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgMSkpOw0KKyAgICB9DQorfQ0KK0ZYX1dDSEFSIENCQ19CYXNlMjU2RW5jb2Rlcjo6cmFuZG9taXplMjU1U3RhdGUoRlhfV0NIQVIgY2gsIEZYX0lOVDMyIGNvZGV3b3JkUG9zaXRpb24pDQorew0KKyAgICBGWF9JTlQzMiBwc2V1ZG9SYW5kb20gPSAoKDE0OSAqIGNvZGV3b3JkUG9zaXRpb24pICUgMjU1KSArIDE7DQorICAgIEZYX0lOVDMyIHRlbXBWYXJpYWJsZSA9IGNoICsgcHNldWRvUmFuZG9tOw0KKyAgICBpZiAodGVtcFZhcmlhYmxlIDw9IDI1NSkgew0KKyAgICAgICAgcmV0dXJuIChGWF9XQ0hBUikgdGVtcFZhcmlhYmxlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIChGWF9XQ0hBUikgKHRlbXBWYXJpYWJsZSAtIDI1Nik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0JpbmFyaXplci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQmluYXJpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMThlZmUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0JpbmFyaXplci5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0x1bWluYW5jZVNvdXJjZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJpemVyLmgiDQorQ0JDX0JpbmFyaXplcjo6Q0JDX0JpbmFyaXplcihDQkNfTHVtaW5hbmNlU291cmNlICpzb3VyY2UpDQorew0KKyAgICBtX3NvdXJjZSA9IHNvdXJjZTsNCit9DQorQ0JDX0JpbmFyaXplcjo6fkNCQ19CaW5hcml6ZXIoKQ0KK3sNCit9DQorQ0JDX0x1bWluYW5jZVNvdXJjZSAqQ0JDX0JpbmFyaXplcjo6R2V0THVtaW5hbmNlU291cmNlKCkNCit7DQorICAgIHJldHVybiBtX3NvdXJjZTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0JpbmFyeUJpdG1hcC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQmluYXJ5Qml0bWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGY2NGJmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0JpbmFyeUJpdG1hcC5jcHAKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0JpbmFyaXplci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0x1bWluYW5jZVNvdXJjZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorQ0JDX0JpbmFyeUJpdG1hcDo6Q0JDX0JpbmFyeUJpdG1hcChDQkNfQmluYXJpemVyICpiaW5hcml6ZXIpOiBtX2JpbmFyaXplcihiaW5hcml6ZXIpLCBtX21hdHJpeChOVUxMKQ0KK3sNCit9DQorQ0JDX0JpbmFyeUJpdG1hcDo6fkNCQ19CaW5hcnlCaXRtYXAoKQ0KK3sNCisgICAgaWYgIChtX21hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9tYXRyaXg7DQorICAgIH0NCisgICAgbV9tYXRyaXggPSBOVUxMOw0KK30NCitGWF9JTlQzMiBDQkNfQmluYXJ5Qml0bWFwOjpHZXRIZWlnaHQoKQ0KK3sNCisgICAgcmV0dXJuIG1fYmluYXJpemVyLT5HZXRMdW1pbmFuY2VTb3VyY2UoKS0+R2V0SGVpZ2h0KCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19CaW5hcnlCaXRtYXA6OkdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPkdldFdpZHRoKCk7DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXggKkNCQ19CaW5hcnlCaXRtYXA6OkdldE1hdHJpeChGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChtX21hdHJpeCA9PSBOVUxMKSB7DQorICAgICAgICBtX21hdHJpeCA9IG1fYmluYXJpemVyLT5HZXRCbGFja01hdHJpeChlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9tYXRyaXg7DQorfQ0KK0ZYX0JPT0wgQ0JDX0JpbmFyeUJpdG1hcDo6SXNDcm9wU3VwcG9ydGVkKCkNCit7DQorICAgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPklzQ3JvcFN1cHBvcnRlZCgpOw0KK30NCitGWF9CT09MIENCQ19CaW5hcnlCaXRtYXA6OklzUm90YXRlU3VwcG9ydGVkKCkNCit7DQorICAgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPklzUm90YXRlU3VwcG9ydGVkKCk7DQorfQ0KK0NCQ19Db21tb25CaXRBcnJheSAqQ0JDX0JpbmFyeUJpdG1hcDo6R2V0QmxhY2tSb3coRlhfSU5UMzIgeSwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5ICp0ZW1wID0gbV9iaW5hcml6ZXItPkdldEJsYWNrUm93KHksIHJvdywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXggKkNCQ19CaW5hcnlCaXRtYXA6OkdldEJsYWNrTWF0cml4KEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKG1fbWF0cml4ID09IE5VTEwpIHsNCisgICAgICAgIG1fbWF0cml4ID0gbV9iaW5hcml6ZXItPkdldEJsYWNrTWF0cml4KGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIHJldHVybiBtX21hdHJpeDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjUyNjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiDQorY2xhc3MgQ0JDX1BhdXNlIDogcHVibGljIElGWF9QYXVzZQ0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfQk9PTAlOZWVkVG9QYXVzZU5vdygpDQorICAgIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorfTsNCitzdGF0aWMgQ0ZYX0RJQml0bWFwKiBDcmVhdGVESUJTb3VyY2UoSUZYX0ZpbGVSZWFkKiBmaWxlcmVhZCkNCit7DQorICAgIENGWF9ESUJpdG1hcCogYml0bWFwID0gTlVMTDsNCisgICAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyCT0gTlVMTDsNCisgICAgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcEltYWdlQ29kZWMgPSBOVUxMOw0KKyAgICBwQ29kZWNNZ3IgPSBDQ29kZWNfTW9kdWxlTWdyOjpDcmVhdGUoKTsNCisgICAgcEltYWdlQ29kZWMgPSBwQ29kZWNNZ3ItPkNyZWF0ZVByb2dyZXNzaXZlRGVjb2RlcigpOw0KKyAgICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICBzdGF0dXMgPSBwSW1hZ2VDb2RlYy0+TG9hZEltYWdlSW5mbyhmaWxlcmVhZCwgRlhDT0RFQ19JTUFHRV9VTktOT1dOKTsNCisgICAgaWYgKHN0YXR1cyAhPSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgYml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgICAgYml0bWFwLT5DcmVhdGUocEltYWdlQ29kZWMtPkdldFdpZHRoKCksIHBJbWFnZUNvZGVjLT5HZXRIZWlnaHQoKSwgRlhESUJfQXJnYik7DQorICAgIGJpdG1hcC0+Q2xlYXIoRlhBUkdCX01BS0UoMHhGRiwgMHhGRiwgMHhGRiwgMHhGRikpOw0KKyAgICBDQkNfUGF1c2UgcGF1c2U7DQorICAgIEZYX0lOVDMyIGZyYW1lczsNCisgICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkdldEZyYW1lcyhmcmFtZXMsICZwYXVzZSk7DQorICAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFKSB7DQorICAgICAgICBzdGF0dXMgPSBwSW1hZ2VDb2RlYy0+R2V0RnJhbWVzKGZyYW1lcywgJnBhdXNlKTsNCisgICAgfQ0KKyAgICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSkgew0KKyAgICAgICAgZ290byBleGNlcHQ7DQorICAgIH0NCisgICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPlN0YXJ0RGVjb2RlKGJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5HZXRIZWlnaHQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQorICAgIGlmIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUykgew0KKyAgICAgICAgZ290byBleGNlcHQ7DQorICAgIH0NCisgICAgaWYgKHN0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7DQorICAgICAgICBnb3RvIGV4Y2VwdDsNCisgICAgfQ0KKyAgICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsNCisgICAgICAgIHN0YXR1cyA9IHBJbWFnZUNvZGVjLT5Db250aW51ZURlY29kZSgmcGF1c2UpOw0KKyAgICB9DQorICAgIGlmIChzdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgew0KKyAgICAgICAgZ290byBleGNlcHQ7DQorICAgIH0NCisgICAgaWYgKHBJbWFnZUNvZGVjKSB7DQorICAgICAgICBkZWxldGUgcEltYWdlQ29kZWM7DQorICAgICAgICBwSW1hZ2VDb2RlYyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKHBDb2RlY01ncikgew0KKyAgICAgICAgcENvZGVjTWdyLT5EZXN0cm95KCk7DQorICAgICAgICBwQ29kZWNNZ3IgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBiaXRtYXA7DQorZXhjZXB0Og0KKyAgICBpZiAocEltYWdlQ29kZWMpIHsNCisgICAgICAgIGRlbGV0ZSBwSW1hZ2VDb2RlYzsNCisgICAgICAgIHBJbWFnZUNvZGVjID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAocENvZGVjTWdyKSB7DQorICAgICAgICBwQ29kZWNNZ3ItPkRlc3Ryb3koKTsNCisgICAgICAgIHBDb2RlY01nciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKGJpdG1hcCkgew0KKyAgICAgICAgZGVsZXRlIGJpdG1hcDsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmaWxlbmFtZSk6IENCQ19MdW1pbmFuY2VTb3VyY2UoMCwgMCksIG1fZmlsZW5hbWUoZmlsZW5hbWUpDQorew0KKyAgICBtX2hlaWdodCA9IDA7DQorICAgIG1fd2lkdGggPSAwOw0KKyAgICBtX2J5dGVzUGVyTGluZSA9IDA7DQorICAgIG1fdG9wID0gMDsNCisgICAgbV9sZWZ0ID0gMDsNCit9DQordm9pZCBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6SW5pdChGWF9JTlQzMiAmZSkNCit7DQorICAgIElGWF9GaWxlUmVhZCogZmlsZXJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZChtX2ZpbGVuYW1lKTsNCisgICAgbV9wQml0bWFwID0gQ3JlYXRlRElCU291cmNlKGZpbGVyZWFkKTsNCisgICAgaWYgKG1fcEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Mb2FkRmlsZTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYik7DQorICAgIG1faGVpZ2h0ID0gbV9wQml0bWFwLT5HZXRIZWlnaHQoKTsNCisgICAgbV93aWR0aCA9IG1fcEJpdG1hcC0+R2V0V2lkdGgoKTsNCisgICAgbV9yZ2JEYXRhLlNldFNpemUobV9oZWlnaHQgKiBtX3dpZHRoKTsNCisgICAgbV9ieXRlc1BlckxpbmUgPSBtX3dpZHRoICogNDsNCisgICAgbV90b3AgPSAwOw0KKyAgICBtX2xlZnQgPSAwOw0KK30NCitDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6Q0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UoQ0ZYX0RJQml0bWFwICpwQml0bWFwKTogQ0JDX0x1bWluYW5jZVNvdXJjZSgwLCAwKQ0KK3sNCisgICAgbV9wQml0bWFwID0gcEJpdG1hcC0+Q2xvbmUoKTsNCisgICAgbV9wQml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX0FyZ2IpOw0KKyAgICBtX2hlaWdodCA9IG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICAgIG1fd2lkdGggPSBtX3BCaXRtYXAtPkdldFdpZHRoKCk7DQorICAgIG1fcmdiRGF0YS5TZXRTaXplKG1faGVpZ2h0ICogbV93aWR0aCk7DQorICAgIG1fYnl0ZXNQZXJMaW5lID0gbV93aWR0aCAqIDQ7DQorICAgIG1fdG9wID0gMDsNCisgICAgbV9sZWZ0ID0gMDsNCit9DQorQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6On5DQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSgpDQorew0KKyAgICBkZWxldGUgbV9wQml0bWFwOw0KKyAgICBtX3BCaXRtYXAgPSBOVUxMOw0KK30NCitDRlhfQnl0ZUFycmF5ICpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6R2V0Um93KEZYX0lOVDMyIHksIENGWF9CeXRlQXJyYXkgJnJvdywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoeSA8IDAgfHwgeSA+PSBtX2hlaWdodCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVxdWVzdGVkUm93SXNPdXRTaXplVGhlSW1hZ2U7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB3aWR0aCA9IG1fd2lkdGg7DQorICAgIGlmKHJvdy5HZXRTaXplKCkgPT0gMCB8fCByb3cuR2V0U2l6ZSgpIDwgd2lkdGgpIHsNCisgICAgICAgIHJvdy5TZXRTaXplKHdpZHRoKTsNCisgICAgfQ0KKyAgICBpZihtX3JnYkRhdGEuR2V0U2l6ZSgpID09IDAgfHwgbV9yZ2JEYXRhLkdldFNpemUoKSA8IHdpZHRoKSB7DQorICAgICAgICBtX3JnYkRhdGEuU2V0U2l6ZSh3aWR0aCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIqIHJvd0xpbmUgPSAoRlhfSU5UMzIqKW1fcEJpdG1hcC0+R2V0U2NhbmxpbmUoeSk7DQorICAgIEZYX0lOVDMyIHg7DQorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7DQorICAgICAgICBGWF9JTlQzMiBwaXhlbCA9IHJvd0xpbmVbeF07DQorICAgICAgICBGWF9JTlQzMiBsdW1pbmFuY2UgPSAoMzA2ICogKChwaXhlbCA+PiAxNikgJiAweEZGKSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAxICogKChwaXhlbCA+PiA4KSAmIDB4RkYpICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcgKiAocGl4ZWwgJiAweEZGKSkgPj4gMTA7DQorICAgICAgICByb3dbeF0gPSAoRlhfQllURSkgbHVtaW5hbmNlOw0KKyAgICB9DQorICAgIHJldHVybiAmcm93Ow0KK30NCitDRlhfQnl0ZUFycmF5ICpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6R2V0TWF0cml4KCkNCit7DQorICAgIENGWF9CeXRlQXJyYXkgKm1hdGlyeCA9IEZYX05FVyBDRlhfQnl0ZUFycmF5KCk7DQorICAgIG1hdGlyeC0+U2V0U2l6ZShtX2J5dGVzUGVyTGluZSAqIG1faGVpZ2h0KTsNCisgICAgRlhfSU5UMzIgKnJnYiA9IChGWF9JTlQzMiopbV9wQml0bWFwLT5HZXRCdWZmZXIoKTsNCisgICAgRlhfSU5UMzIgeTsNCisgICAgZm9yKHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgb2Zmc2V0ID0geSAqIG1fd2lkdGg7DQorICAgICAgICBGWF9JTlQzMiB4Ow0KKyAgICAgICAgZm9yKHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgcGl4ZWwgPSByZ2Jbb2Zmc2V0ICsgeF07DQorICAgICAgICAgICAgRlhfSU5UMzIgbHVtaW5hbmNlID0gKDMwNiAqICgocGl4ZWwgPj4gMTYpICYgMHhGRikgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MDEgKiAoKHBpeGVsID4+IDgpICYgMHhGRikgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcgKiAocGl4ZWwgJiAweEZGKSkgPj4gMTA7DQorICAgICAgICAgICAgKCptYXRpcngpW29mZnNldCArIHhdID0gKEZYX0JZVEUpIGx1bWluYW5jZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbWF0aXJ4Ow0KK30NCitGWF9CT09MIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpJc0Nyb3BTdXBwb3J0ZWQoKQ0KK3sNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OklzUm90YXRlU3VwcG9ydGVkKCkNCit7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDQkNfTHVtaW5hbmNlU291cmNlICpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6Q3JvcChGWF9JTlQzMiBsZWZ0LCBGWF9JTlQzMiB0b3AsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX0x1bWluYW5jZVNvdXJjZSAqQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OlJvdGF0ZUNvdW50ZXJDbG9ja3dpc2UoRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoIUlzUm90YXRlU3VwcG9ydGVkKCkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJvdGF0ZU5vdFN1cHBvcnRlZDsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHNvdXJjZVdpZHRoID0gbV93aWR0aDsNCisgICAgRlhfSU5UMzIgc291cmNlSGVpZ2h0ID0gbV9oZWlnaHQ7DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQzQwRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQzQwRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYThlZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19DNDBFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE4MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQzQwRW5jb2Rlci5oIg0KK0NCQ19DNDBFbmNvZGVyOjpDQkNfQzQwRW5jb2RlcigpDQorew0KK30NCitDQkNfQzQwRW5jb2Rlcjo6fkNCQ19DNDBFbmNvZGVyKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19DNDBFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKQ0KK3sNCisgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KK30NCit2b2lkIENCQ19DNDBFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsNCisgICAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICAgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCisgICAgICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgICAgIEZYX0lOVDMyIGxhc3RDaGFyU2l6ZSA9IGVuY29kZUNoYXIoYywgYnVmZmVyLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOw0KKyAgICAgICAgRlhfSU5UMzIgY3VyQ29kZXdvcmRDb3VudCA9IGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgdW53cml0dGVuOw0KKyAgICAgICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1ckNvZGV3b3JkQ291bnQsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGF2YWlsYWJsZSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGN1ckNvZGV3b3JkQ291bnQ7DQorICAgICAgICBpZiAoIWNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHJlbW92ZWQ7DQorICAgICAgICAgICAgaWYgKChidWZmZXIuR2V0TGVuZ3RoKCkgJSAzKSA9PSAyKSB7DQorICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCAyIHx8IGF2YWlsYWJsZSA+IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIGxhc3RDaGFyU2l6ZSA9IGJhY2t0cmFja09uZUNoYXJhY3Rlcihjb250ZXh0LCBidWZmZXIsIHJlbW92ZWQsIGxhc3RDaGFyU2l6ZSwgZSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlICgoYnVmZmVyLkdldExlbmd0aCgpICUgMykgPT0gMQ0KKyAgICAgICAgICAgICAgICAgICAgJiYgKChsYXN0Q2hhclNpemUgPD0gMyAmJiBhdmFpbGFibGUgIT0gMSkgfHwgbGFzdENoYXJTaXplID4gMykpIHsNCisgICAgICAgICAgICAgICAgbGFzdENoYXJTaXplID0gYmFja3RyYWNrT25lQ2hhcmFjdGVyKGNvbnRleHQsIGJ1ZmZlciwgcmVtb3ZlZCwgbGFzdENoYXJTaXplLCBlKTsNCisgICAgICAgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQorICAgICAgICBpZiAoKGNvdW50ICUgMykgPT0gMCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgICAgICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaGFuZGxlRU9EKGNvbnRleHQsIGJ1ZmZlciwgZSk7DQorfQ0KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OndyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBDRlhfV2lkZVN0cmluZyAmYnVmZmVyKQ0KK3sNCisgICAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhlbmNvZGVUb0NvZGV3b3JkcyhidWZmZXIsIDApKTsNCisgICAgYnVmZmVyLkRlbGV0ZSgwLCAzKTsNCit9DQordm9pZCBDQkNfQzQwRW5jb2Rlcjo6aGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOw0KKyAgICBGWF9JTlQzMiByZXN0ID0gYnVmZmVyLkdldExlbmd0aCgpICUgMzsNCisgICAgRlhfSU5UMzIgY3VyQ29kZXdvcmRDb3VudCA9IGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgdW53cml0dGVuOw0KKyAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY3VyQ29kZXdvcmRDb3VudCwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJDb2Rld29yZENvdW50Ow0KKyAgICBpZiAocmVzdCA9PSAyKSB7DQorICAgICAgICBidWZmZXIgKz0gKEZYX1dDSEFSKSdcMCc7DQorICAgICAgICB3aGlsZSAoYnVmZmVyLkdldExlbmd0aCgpID49IDMpIHsNCisgICAgICAgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IDEgJiYgcmVzdCA9PSAxKSB7DQorICAgICAgICB3aGlsZSAoYnVmZmVyLkdldExlbmd0aCgpID49IDMpIHsNCisgICAgICAgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQorICAgICAgICB9DQorICAgICAgICBjb250ZXh0Lm1fcG9zLS07DQorICAgIH0gZWxzZSBpZiAocmVzdCA9PSAwKSB7DQorICAgICAgICB3aGlsZSAoYnVmZmVyLkdldExlbmd0aCgpID49IDMpIHsNCisgICAgICAgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXZhaWxhYmxlID4gMCB8fCBjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkM0MF9VTkxBVENIKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZVVuZXhwZWN0ZWRDYXNlOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCit9DQorRlhfSU5UMzIgQ0JDX0M0MEVuY29kZXI6OmVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChjID09ICcgJykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMyc7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfSBlbHNlIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDQ4ICsgNCk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfSBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDY1ICsgMTQpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0gZWxzZSBpZiAoKGMgPj0gJ1wwJykgJiYgKGMgPD0gMHgxZikpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDAnOw0KKyAgICAgICAgc2IgKz0gYzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9IGVsc2UgaWYgKChjID49ICchJykgJiYgKGMgPD0gJy8nKSkgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSAzMyk7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfSBlbHNlIGlmICgoYyA+PSAnOicpICYmIChjIDw9ICdAJykpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNTggKyAxNSk7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfSBlbHNlIGlmICgoYyA+PSAnWycpICYmIChjIDw9ICdfJykpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTEgKyAyMik7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfSBlbHNlIGlmICgoYyA+PSA2MCkgJiYgKGMgPD0gMHg3ZikpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDInOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTYpOw0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgIH0gZWxzZSBpZiAoYyA+PSA4MCkgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpMHgwMDFlOw0KKyAgICAgICAgRlhfSU5UMzIgbGVuID0gMjsNCisgICAgICAgIGxlbiArPSBlbmNvZGVDaGFyKChjIC0gMTI4KSwgc2IsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICAwKTsNCisgICAgICAgIHJldHVybiBsZW47DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfQzQwRW5jb2Rlcjo6YmFja3RyYWNrT25lQ2hhcmFjdGVyKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgQ0ZYX1dpZGVTdHJpbmcgJnJlbW92ZWQsIEZYX0lOVDMyIGxhc3RDaGFyU2l6ZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsNCisgICAgYnVmZmVyLkRlbGV0ZShjb3VudCAtIGxhc3RDaGFyU2l6ZSwgY291bnQpOw0KKyAgICBjb250ZXh0Lm1fcG9zLS07DQorICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICAgIGxhc3RDaGFyU2l6ZSA9IGVuY29kZUNoYXIoYywgcmVtb3ZlZCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgLTEpOw0KKyAgICBjb250ZXh0LnJlc2V0U3ltYm9sSW5mbygpOw0KKyAgICByZXR1cm4gbGFzdENoYXJTaXplOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQzQwRW5jb2Rlcjo6ZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsIEZYX0lOVDMyIHN0YXJ0UG9zKQ0KK3sNCisgICAgRlhfV0NIQVIgYzEgPSBzYi5HZXRBdChzdGFydFBvcyk7DQorICAgIEZYX1dDSEFSIGMyID0gc2IuR2V0QXQoc3RhcnRQb3MgKyAxKTsNCisgICAgRlhfV0NIQVIgYzMgPSBzYi5HZXRBdChzdGFydFBvcyArIDIpOw0KKyAgICBGWF9JTlQzMiB2ID0gKDE2MDAgKiBjMSkgKyAoNDAgKiBjMikgKyBjMyArIDE7DQorICAgIEZYX1dDSEFSIGN3MSA9IChGWF9XQ0hBUikgKHYgLyAyNTYpOw0KKyAgICBGWF9XQ0hBUiBjdzIgPSAoRlhfV0NIQVIpICh2ICUgMjU2KTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgYjEoY3cxKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgYjIoY3cyKTsNCisgICAgcmV0dXJuIGIxICsgYjI7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25CaXRBcnJheS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQml0QXJyYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmY0NDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQml0QXJyYXkuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0QXJyYXkuaCINCitDQkNfQ29tbW9uQml0QXJyYXk6OkNCQ19Db21tb25CaXRBcnJheShDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5KQ0KK3sNCisgICAgbV9zaXplID0gYXJyYXktPkdldFNpemUoKTsNCisgICAgbV9iaXRzLkNvcHkoYXJyYXktPkdldEJpdHMoKSk7DQorfQ0KK0NCQ19Db21tb25CaXRBcnJheTo6Q0JDX0NvbW1vbkJpdEFycmF5KCkNCit7DQorICAgIG1fYml0cy5TZXRTaXplKDEpOw0KKyAgICBtX3NpemUgPSAwOw0KK30NCitDQkNfQ29tbW9uQml0QXJyYXk6OkNCQ19Db21tb25CaXRBcnJheShGWF9JTlQzMiBzaXplKQ0KK3sNCisgICAgbV9iaXRzLlNldFNpemUoKHNpemUgKyAzMSkgPj4gNSk7DQorICAgIG1fc2l6ZSA9IHNpemU7DQorfQ0KK0NCQ19Db21tb25CaXRBcnJheTo6fkNCQ19Db21tb25CaXRBcnJheSgpDQorew0KKyAgICBtX3NpemUgPSAwOw0KK30NCitGWF9JTlQzMiBDQkNfQ29tbW9uQml0QXJyYXk6OkdldFNpemUoKQ0KK3sNCisgICAgcmV0dXJuIG1fc2l6ZTsNCit9DQorQ0ZYX0ludDMyQXJyYXkmIENCQ19Db21tb25CaXRBcnJheTo6R2V0Qml0cygpDQorew0KKyAgICByZXR1cm4gbV9iaXRzOw0KK30NCitGWF9JTlQzMiBDQkNfQ29tbW9uQml0QXJyYXk6OkdldFNpemVJbkJ5dGVzKCkNCit7DQorICAgIHJldHVybiAobV9zaXplICsgNykgPj4gMzsNCit9DQorRlhfQk9PTCBDQkNfQ29tbW9uQml0QXJyYXk6OkdldChGWF9JTlQzMiBpKQ0KK3sNCisgICAgcmV0dXJuIChtX2JpdHNbaSA+PiA1XSAmICgxIDw8IChpICYgMHgxZikpKSAhPSAwOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6U2V0KEZYX0lOVDMyIGkpDQorew0KKyAgICBtX2JpdHNbaSA+PiA1XSB8PSAxIDw8IChpICYgMHgxRik7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpGbGlwKEZYX0lOVDMyIGkpDQorew0KKyAgICBtX2JpdHNbaSA+PiA1XSBePSAxIDw8IChpICYgMHgxRik7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpTZXRCdWxrKEZYX0lOVDMyIGksIEZYX0lOVDMyIG5ld0JpdHMpDQorew0KKyAgICBtX2JpdHNbaSA+PiA1XSA9IG5ld0JpdHM7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpDbGVhcigpDQorew0KKyAgICBGWFNZU19tZW1zZXQzMigmbV9iaXRzWzBdLCAweDAwLCBtX2JpdHMuR2V0U2l6ZSgpICogc2l6ZW9mKEZYX0lOVDMyKSk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvbW1vbkJpdEFycmF5OjpJc1JhbmdlKEZYX0lOVDMyIHN0YXJ0LCBGWF9JTlQzMiBlbmQsIEZYX0JPT0wgdmFsdWUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGVuZCA8IHN0YXJ0KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25FbmRMZXNzVGhhblN0YXJ0Ow0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChlbmQgPT0gc3RhcnQpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGVuZC0tOw0KKyAgICBGWF9JTlQzMiBmaXJzdEludCA9IHN0YXJ0ID4+IDU7DQorICAgIEZYX0lOVDMyIGxhc3RJbnQgPSBlbmQgPj4gNTsNCisgICAgRlhfSU5UMzIgaTsNCisgICAgZm9yIChpID0gZmlyc3RJbnQ7IGkgPD0gbGFzdEludDsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBmaXJzdEJpdCA9IGkgPiBmaXJzdEludCA/IDAgOiBzdGFydCAmIDB4MUY7DQorICAgICAgICBGWF9JTlQzMiBsYXN0Qml0ID0gaSA8IGxhc3RJbnQgPyAzMSA6IGVuZCAmIDB4MUY7DQorICAgICAgICBGWF9JTlQzMiBtYXNrOw0KKyAgICAgICAgaWYgKGZpcnN0Qml0ID09IDAgJiYgbGFzdEJpdCA9PSAzMSkgew0KKyAgICAgICAgICAgIG1hc2sgPSAtMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbWFzayA9IDA7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gZmlyc3RCaXQ7IGogPD0gbGFzdEJpdDsgaisrKSB7DQorICAgICAgICAgICAgICAgIG1hc2sgfD0gMSA8PCBqOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICgobV9iaXRzW2ldICYgbWFzaykgIT0gKHZhbHVlID8gbWFzayA6IDApKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9JTlQzMiogQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRCaXRBcnJheSgpDQorew0KKyAgICByZXR1cm4gJm1fYml0c1swXTsNCit9DQordm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OlJldmVyc2UoKQ0KK3sNCisgICAgRlhfSU5UMzIqIG5ld0JpdHMgPSBGWF9BbGxvYyhGWF9JTlQzMiwgbV9iaXRzLkdldFNpemUoKSk7DQorICAgIEZYU1lTX21lbXNldDMyKG5ld0JpdHMsIDB4MDAsIG1fYml0cy5HZXRTaXplKCkgKiBzaXplb2YoRlhfSU5UMzIpKTsNCisgICAgRlhfSU5UMzIgc2l6ZSA9IG1fc2l6ZTsNCisgICAgRlhfSU5UMzIgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICAgICAgaWYgKEdldChzaXplIC0gaSAtIDEpKSB7DQorICAgICAgICAgICAgbmV3Qml0c1tpID4+IDVdIHw9IDEgPDwgKGkgJiAweDFGKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWFNZU19tZW1jcHkzMigmbV9iaXRzWzBdLCBuZXdCaXRzLCBtX2JpdHMuR2V0U2l6ZSgpICogc2l6ZW9mKEZYX0lOVDMyKSk7DQorICAgIEZYX0ZyZWUobmV3Qml0cyk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25CaXRNYXRyaXguY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJpdE1hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzNzU3MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25CaXRNYXRyaXguY3BwCkBAIC0wLDAgKzEsMTQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCitDQkNfQ29tbW9uQml0TWF0cml4OjpDQkNfQ29tbW9uQml0TWF0cml4KCkNCit7DQorICAgIG1fd2lkdGggPSAwOw0KKyAgICBtX2hlaWdodCA9IDA7DQorICAgIG1fcm93U2l6ZSA9IDA7DQorICAgIG1fYml0cyA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6SW5pdChGWF9JTlQzMiBkaW1lbnNpb24pDQorew0KKyAgICBtX3dpZHRoID0gZGltZW5zaW9uOw0KKyAgICBtX2hlaWdodCA9IGRpbWVuc2lvbjsNCisgICAgRlhfSU5UMzIgcm93U2l6ZSA9IChtX2hlaWdodCArIDMxKSA+PiA1Ow0KKyAgICBtX3Jvd1NpemUgPSByb3dTaXplOw0KKyAgICBtX2JpdHMgPSBGWF9BbGxvYyhGWF9JTlQzMiwgbV9yb3dTaXplICogbV9oZWlnaHQpOw0KKyAgICBGWFNZU19tZW1zZXQzMihtX2JpdHMsIDAsIG1fcm93U2l6ZSAqIG1faGVpZ2h0ICogc2l6ZW9mKEZYX0lOVDMyKSk7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6SW5pdChGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0KQ0KK3sNCisgICAgbV93aWR0aCA9IHdpZHRoOw0KKyAgICBtX2hlaWdodCA9IGhlaWdodDsNCisgICAgRlhfSU5UMzIgcm93U2l6ZSA9ICh3aWR0aCArIDMxKSA+PiA1Ow0KKyAgICBtX3Jvd1NpemUgPSByb3dTaXplOw0KKyAgICBtX2JpdHMgPSBGWF9BbGxvYyhGWF9JTlQzMiwgbV9yb3dTaXplICogbV9oZWlnaHQpOw0KKyAgICBGWFNZU19tZW1zZXQzMihtX2JpdHMsIDAsIG1fcm93U2l6ZSAqIG1faGVpZ2h0ICogc2l6ZW9mKEZYX0lOVDMyKSk7DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXg6On5DQkNfQ29tbW9uQml0TWF0cml4KCkNCit7DQorICAgIGlmIChtX2JpdHMgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX2JpdHMpOw0KKyAgICB9DQorICAgIG1fYml0cyA9IE5VTEw7DQorICAgIG1faGVpZ2h0ID0gbV93aWR0aCA9IG1fcm93U2l6ZSA9IDA7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0KEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpDQorew0KKyAgICBGWF9JTlQzMiBvZmZzZXQgPSB5ICogbV9yb3dTaXplICsgKHggPj4gNSk7DQorICAgIGlmIChvZmZzZXQgPj0gbV9yb3dTaXplICogbV9oZWlnaHQgfHwgb2Zmc2V0IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIHJldHVybiAoKCgoRlhfRFdPUkQpbV9iaXRzW29mZnNldF0pID4+ICh4ICYgMHgxZikpICYgMSkgIT0gMDsNCit9DQorRlhfSU5UMzIqIENCQ19Db21tb25CaXRNYXRyaXg6OkdldEJpdHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fYml0czsNCit9DQordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkNCit7DQorICAgIEZYX0lOVDMyIG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCisgICAgaWYgKG9mZnNldCA+PSBtX3Jvd1NpemUgKiBtX2hlaWdodCB8fCBvZmZzZXQgPCAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9iaXRzW29mZnNldF0gfD0gMSA8PCAoeCAmIDB4MWYpOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkZsaXAoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkNCit7DQorICAgIEZYX0lOVDMyIG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCisgICAgbV9iaXRzW29mZnNldF0gXj0gMSA8PCAoeCAmIDB4MWYpOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkNsZWFyKCkNCit7DQorICAgIEZYU1lTX21lbXNldDMyKG1fYml0cywgMCwgbV9yb3dTaXplICogbV9oZWlnaHQgKiBzaXplb2YoRlhfSU5UMzIpKTsNCit9DQordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXRSZWdpb24oRlhfSU5UMzIgbGVmdCwgRlhfSU5UMzIgdG9wLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmICh0b3AgPCAwIHx8IGxlZnQgPCAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25MZWZ0QW5kVG9wTXVzdEJlTm9ubmVnYXRpdmU7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGhlaWdodCA8IDEgfHwgd2lkdGggPCAxKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHJpZ2h0ID0gbGVmdCArIHdpZHRoOw0KKyAgICBGWF9JTlQzMiBib3R0b20gPSB0b3AgKyBoZWlnaHQ7DQorICAgIGlmIChtX2hlaWdodCA8IGJvdHRvbSB8fCBtX3dpZHRoIDwgcmlnaHQpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlZ2lvbk11c3RGaXRJbnNpZGVNYXRyaXg7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgeTsNCisgICAgZm9yICh5ID0gdG9wOyB5IDwgYm90dG9tOyB5KyspIHsNCisgICAgICAgIEZYX0lOVDMyIG9mZnNldCA9IHkgKiBtX3Jvd1NpemU7DQorICAgICAgICBGWF9JTlQzMiB4Ow0KKyAgICAgICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspIHsNCisgICAgICAgICAgICBtX2JpdHNbb2Zmc2V0ICsgKHggPj4gNSldIHw9IDEgPDwgKHggJiAweDFmKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitDQkNfQ29tbW9uQml0QXJyYXkqIENCQ19Db21tb25CaXRNYXRyaXg6OkdldFJvdyhGWF9JTlQzMiB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdykNCit7DQorICAgIENCQ19Db21tb25CaXRBcnJheSogcm93QXJyYXkgPSBOVUxMOw0KKyAgICBpZiAocm93ID09IE5VTEwgfHwgcm93LT5HZXRTaXplKCkgPCBtX3dpZHRoKSB7DQorICAgICAgICByb3dBcnJheSA9IEZYX05FVyBDQkNfQ29tbW9uQml0QXJyYXkobV93aWR0aCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByb3dBcnJheSA9IEZYX05FVyBDQkNfQ29tbW9uQml0QXJyYXkocm93KTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBvZmZzZXQgPSB5ICogbV9yb3dTaXplOw0KKyAgICBGWF9JTlQzMiB4Ow0KKyAgICBmb3IgKHggPSAwOyB4IDwgbV9yb3dTaXplOyB4KyspIHsNCisgICAgICAgIHJvd0FycmF5LT5TZXRCdWxrKHggPDwgNSwgbV9iaXRzW29mZnNldCArIHhdKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcm93QXJyYXk7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Um93KEZYX0lOVDMyIHksIENCQ19Db21tb25CaXRBcnJheSogcm93KQ0KK3sNCisgICAgRlhfSU5UMzIgbCA9IHkgKiBtX3Jvd1NpemU7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX3Jvd1NpemU7IGkrKykgew0KKyAgICAgICAgbV9iaXRzW2xdID0gcm93LT5HZXRCaXRBcnJheSgpW2ldOw0KKyAgICAgICAgbCsrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Q29sKEZYX0lOVDMyIHksIENCQ19Db21tb25CaXRBcnJheSogY29sKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvbC0+R2V0Qml0cygpLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBtX2JpdHNbaSAqIG1fcm93U2l6ZSArIHldID0gY29sLT5HZXRCaXRBcnJheSgpW2ldOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENCQ19Db21tb25CaXRNYXRyaXg6OkdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX3dpZHRoOw0KK30NCitGWF9JTlQzMiBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRIZWlnaHQoKQ0KK3sNCisgICAgcmV0dXJuIG1faGVpZ2h0Ow0KK30NCitGWF9JTlQzMiBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRSb3dTaXplKCkNCit7DQorICAgIHJldHVybiBtX3Jvd1NpemU7DQorfQ0KK0ZYX0lOVDMyIENCQ19Db21tb25CaXRNYXRyaXg6OkdldERpbWVuc2lvbihGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChtX3dpZHRoICE9IG1faGVpZ2h0KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25DYW5Ob3RDYWxsR2V0RGltZW5zaW9uT25Ob25TcXVhcmVNYXRyaXg7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV93aWR0aDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJpdFNvdXJjZS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQml0U291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTI5MDAyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJpdFNvdXJjZS5jcHAKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdFNvdXJjZS5oIg0KK0NCQ19Db21tb25CaXRTb3VyY2U6OkNCQ19Db21tb25CaXRTb3VyY2UoQ0ZYX0J5dGVBcnJheSogYnl0ZXMpDQorew0KKyAgICBtX2J5dGVzLkNvcHkoKCpieXRlcykpOw0KKyAgICBtX2JpdE9mZnNldCA9IDA7DQorICAgIG1fYnl0ZU9mZnNldCA9IDA7DQorfQ0KK0NCQ19Db21tb25CaXRTb3VyY2U6On5DQkNfQ29tbW9uQml0U291cmNlKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19Db21tb25CaXRTb3VyY2U6OlJlYWRCaXRzKEZYX0lOVDMyIG51bUJpdHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKG51bUJpdHMgPCAxIHx8IG51bUJpdHMgPiAzMikgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgcmVzdWx0ID0gMDsNCisgICAgaWYgKG1fYml0T2Zmc2V0ID4gMCkgew0KKyAgICAgICAgRlhfSU5UMzIgYml0c0xlZnQgPSA4IC0gbV9iaXRPZmZzZXQ7DQorICAgICAgICBGWF9JTlQzMiB0b1JlYWQgPSBudW1CaXRzIDwgYml0c0xlZnQgPyBudW1CaXRzIDogYml0c0xlZnQ7DQorICAgICAgICBGWF9JTlQzMiBiaXRzVG9Ob3RSZWFkID0gYml0c0xlZnQgLSB0b1JlYWQ7DQorICAgICAgICBGWF9JTlQzMiBtYXNrID0gKDB4ZmYgPj4gKDggLSB0b1JlYWQpKSA8PCBiaXRzVG9Ob3RSZWFkOw0KKyAgICAgICAgcmVzdWx0ID0gKG1fYnl0ZXNbbV9ieXRlT2Zmc2V0XSAmIG1hc2spID4+IGJpdHNUb05vdFJlYWQ7DQorICAgICAgICBudW1CaXRzIC09IHRvUmVhZDsNCisgICAgICAgIG1fYml0T2Zmc2V0ICs9IHRvUmVhZDsNCisgICAgICAgIGlmIChtX2JpdE9mZnNldCA9PSA4KSB7DQorICAgICAgICAgICAgbV9iaXRPZmZzZXQgPSAwOw0KKyAgICAgICAgICAgIG1fYnl0ZU9mZnNldCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChudW1CaXRzID4gMCkgew0KKyAgICAgICAgd2hpbGUobnVtQml0cyA+PSA4KSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8IChtX2J5dGVzW21fYnl0ZU9mZnNldF0gJiAweGZmKTsNCisgICAgICAgICAgICBtX2J5dGVPZmZzZXQrKzsNCisgICAgICAgICAgICBudW1CaXRzIC09IDg7DQorICAgICAgICB9DQorICAgICAgICBpZiAobnVtQml0cyA+IDApIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBiaXRzVG9Ob3RSZWFkID0gOCAtIG51bUJpdHM7DQorICAgICAgICAgICAgRlhfSU5UMzIgbWFzayA9ICgweGZmID4+IGJpdHNUb05vdFJlYWQpIDw8IGJpdHNUb05vdFJlYWQ7DQorICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCBudW1CaXRzKSB8ICgobV9ieXRlc1ttX2J5dGVPZmZzZXRdICYgbWFzaykgPj4gYml0c1RvTm90UmVhZCk7DQorICAgICAgICAgICAgbV9iaXRPZmZzZXQgKz0gbnVtQml0czsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCitGWF9JTlQzMiBDQkNfQ29tbW9uQml0U291cmNlOjpBdmFpbGFibGUoKQ0KK3sNCisgICAgcmV0dXJuIDggKiAobV9ieXRlcy5HZXRTaXplKCkgLSBtX2J5dGVPZmZzZXQpIC0gbV9iaXRPZmZzZXQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19Db21tb25CaXRTb3VyY2U6OmdldEJ5dGVPZmZzZXQoKQ0KK3sNCisgICAgcmV0dXJuIG1fYnl0ZU9mZnNldDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQnl0ZUFycmF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGY5ZGQyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAKQEAgLTAsMCArMSw5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJ5dGVBcnJheS5oIg0KK0NCQ19Db21tb25CeXRlQXJyYXk6OkNCQ19Db21tb25CeXRlQXJyYXkoKQ0KK3sNCisgICAgbV9ieXRlcyA9IE5VTEw7DQorICAgIG1fc2l6ZSA9IDA7DQorICAgIG1faW5kZXggPSAwOw0KK30NCitDQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KEZYX0lOVDMyIHNpemUpDQorew0KKyAgICBtX3NpemUgPSBzaXplOw0KKyAgICBtX2J5dGVzID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7DQorICAgIEZYU1lTX21lbXNldDMyKG1fYnl0ZXMsIDAsIHNpemUpOw0KKyAgICBtX2luZGV4ID0gMDsNCit9DQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheShGWF9CWVRFKiBieXRlQXJyYXksIEZYX0lOVDMyIHNpemUpDQorew0KKyAgICBtX3NpemUgPSBzaXplOw0KKyAgICBtX2J5dGVzID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7DQorICAgIEZYU1lTX21lbWNweTMyKG1fYnl0ZXMsIGJ5dGVBcnJheSwgc2l6ZSk7DQorICAgIG1faW5kZXggPSBzaXplOw0KK30NCitDQkNfQ29tbW9uQnl0ZUFycmF5Ojp+Q0JDX0NvbW1vbkJ5dGVBcnJheSgpDQorew0KKyAgICBpZiAoIG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZSggbV9ieXRlcyApOw0KKyAgICAgICAgbV9ieXRlcyA9IE5VTEw7DQorICAgIH0NCisgICAgbV9pbmRleCA9IDA7DQorICAgIG1fc2l6ZSA9IDA7DQorfQ0KK0ZYX0lOVDMyIENCQ19Db21tb25CeXRlQXJyYXk6OkF0KEZYX0lOVDMyIGluZGV4KQ0KK3sNCisgICAgcmV0dXJuIG1fYnl0ZXNbaW5kZXhdICYgMHhmZjsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQoRlhfSU5UMzIgaW5kZXgsIEZYX0lOVDMyIHZhbHVlKQ0KK3sNCisgICAgbV9ieXRlc1tpbmRleF0gPSAoRlhfQllURSkgdmFsdWU7DQorfQ0KK0ZYX0lOVDMyIENCQ19Db21tb25CeXRlQXJyYXk6OlNpemUoKQ0KK3sNCisgICAgcmV0dXJuIG1fc2l6ZTsNCit9DQorRlhfQk9PTCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpJc0VtcHR5KCkNCit7DQorICAgIHJldHVybiBtX3NpemUgPT0gMDsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpBcHBlbmRCeXRlKEZYX0lOVDMyIHZhbHVlKQ0KK3sNCisgICAgaWYgKG1fc2l6ZSA9PSAwIHx8IG1faW5kZXggPj0gbV9zaXplKSB7DQorICAgICAgICBGWF9JTlQzMiBuZXdTaXplID0gRlhfTUFYKDMyLCBtX3NpemUgPDwgMSk7DQorICAgICAgICBSZXNlcnZlKG5ld1NpemUpOw0KKyAgICB9DQorICAgIG1fYnl0ZXNbbV9pbmRleF0gPSAoRlhfQllURSl2YWx1ZTsNCisgICAgbV9pbmRleCsrOw0KK30NCit2b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlJlc2VydmUoRlhfSU5UMzIgY2FwYWNpdHkpDQorew0KKyAgICBpZiAobV9ieXRlcyA9PSBOVUxMIHx8IG1fc2l6ZSA8IGNhcGFjaXR5KSB7DQorICAgICAgICBGWF9CWVRFICpuZXdBcnJheSA9IEZYX0FsbG9jKEZYX0JZVEUsIGNhcGFjaXR5KTsNCisgICAgICAgIEZYU1lTX21lbXNldDMyKG5ld0FycmF5LCAwLCBjYXBhY2l0eSk7DQorICAgICAgICBpZiAobV9ieXRlcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobmV3QXJyYXksIG1fYnl0ZXMsIG1fc2l6ZSk7DQorICAgICAgICAgICAgRlhfRnJlZSggbV9ieXRlcyApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9ieXRlcyA9IG5ld0FycmF5Ow0KKyAgICAgICAgbV9zaXplID0gY2FwYWNpdHk7DQorICAgIH0NCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQoRlhfQllURSogc291cmNlLCBGWF9JTlQzMiBvZmZzZXQsIEZYX0lOVDMyIGNvdW50KQ0KK3sNCisgICAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZSggbV9ieXRlcyApOw0KKyAgICB9DQorICAgIG1fYnl0ZXMgPSBGWF9BbGxvYyhGWF9CWVRFLCBjb3VudCk7DQorICAgIG1fc2l6ZSA9IGNvdW50Ow0KKyAgICBGWFNZU19tZW1jcHkzMihtX2J5dGVzLCBzb3VyY2UgKyBvZmZzZXQsIGNvdW50KTsNCisgICAgbV9pbmRleCA9IGNvdW50Ow0KK30NCit2b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChDRlhfQnl0ZUFycmF5KiBzb3VyY2UsIEZYX0lOVDMyIG9mZnNldCwgRlhfSU5UMzIgY291bnQpDQorew0KKyAgICBpZiAobV9ieXRlcyAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKCBtX2J5dGVzICk7DQorICAgIH0NCisgICAgbV9ieXRlcyA9ICBGWF9BbGxvYyhGWF9CWVRFLCBjb3VudCk7DQorICAgIG1fc2l6ZSA9IGNvdW50Ow0KKyAgICBGWF9JTlQzMiBpOw0KKyAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgICAgICBtX2J5dGVzW2ldID0gc291cmNlLT5vcGVyYXRvciBbXShpICsgb2Zmc2V0KTsNCisgICAgfQ0KKyAgICBtX2luZGV4ID0gbV9zaXplOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlODllNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25CeXRlTWF0cml4LmNwcApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KK0NCQ19Db21tb25CeXRlTWF0cml4OjpDQkNfQ29tbW9uQnl0ZU1hdHJpeChGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0KQ0KK3sNCisgICAgbV9oZWlnaHQgPSBoZWlnaHQ7DQorICAgIG1fd2lkdGggPSB3aWR0aDsNCisgICAgbV9ieXRlcyA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkluaXQoKQ0KK3sNCisgICAgbV9ieXRlcyA9IEZYX0FsbG9jKEZYX0JZVEUsIG1faGVpZ2h0ICogbV93aWR0aCk7DQorICAgIEZYU1lTX21lbXNldDgobV9ieXRlcywgMHhmZiwgbV9oZWlnaHQgKiBtX3dpZHRoKTsNCit9DQorQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6On5DQkNfQ29tbW9uQnl0ZU1hdHJpeCgpDQorew0KKyAgICBpZihtX2J5dGVzICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUobV9ieXRlcyk7DQorICAgICAgICBtX2J5dGVzID0gTlVMTDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6R2V0SGVpZ2h0KCkNCit7DQorICAgIHJldHVybiBtX2hlaWdodDsNCit9DQorRlhfSU5UMzIgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX3dpZHRoOw0KK30NCitGWF9CWVRFIENCQ19Db21tb25CeXRlTWF0cml4OjpHZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkNCit7DQorICAgIHJldHVybiBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF07DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OlNldChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9IChGWF9CWVRFKXZhbHVlOw0KK30NCit2b2lkIENCQ19Db21tb25CeXRlTWF0cml4OjpTZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfQllURSB2YWx1ZSkNCit7DQorICAgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9IHZhbHVlOw0KK30NCit2b2lkIENCQ19Db21tb25CeXRlTWF0cml4OjpjbGVhcihGWF9CWVRFIHZhbHVlKQ0KK3sNCisgICAgRlhfSU5UMzIgeTsNCisgICAgZm9yKHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgeDsNCisgICAgICAgIGZvcih4ID0gMDsgeCA8IG1fd2lkdGg7IHgrKykgew0KKyAgICAgICAgICAgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9IHZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0JZVEUqIENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRBcnJheSgpDQorew0KKyAgICByZXR1cm4gbV9ieXRlczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTEwYTdjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkVDSS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIg0KK3ZvaWQgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6aW5pdGlhbGl6ZSgpDQorew0KK30NCitDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKEZYX0lOVDMyIHZhbHVlLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZ05hbWUpOg0KKyAgICBDQkNfQ29tbW9uRUNJKHZhbHVlKSwgbV9lbmNvZGluZ05hbWUoZW5jb2RpbmdOYW1lKQ0KK3sNCit9DQorQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6fkNCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0koKQ0KK3sNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6R2V0RW5jb2RpbmdOYW1lKCkNCit7DQorICAgIHJldHVybiBtX2VuY29kaW5nTmFtZTsNCit9DQordm9pZCBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpBZGRDaGFyYWN0ZXJTZXQoRlhfSU5UMzIgdmFsdWUsIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nTmFtZSkNCit7DQorfQ0KK0NCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OkdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUoRlhfSU5UMzIgdmFsdWUpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6R2V0Q2hhcmFjdGVyU2V0RUNJQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFiMjNlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKQ0KK3sNCit9DQordm9pZCBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6SW5pdChjb25zdCBDRlhfQnl0ZUFycmF5ICZyYXdCeXRlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJnRleHQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZieXRlU2VnbWVudHMsICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKHRleHQuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9yYXdCeXRlcy5Db3B5KHJhd0J5dGVzKTsNCisgICAgbV90ZXh0ID0gdGV4dDsNCisgICAgbV9ieXRlU2VnbWVudHMuQ29weShieXRlU2VnbWVudHMpOw0KKyAgICBtX2VjTGV2ZWwgPSBlY0xldmVsOw0KKyAgICBtX290aGVyID0gTlVMTDsNCit9DQordm9pZCBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6SW5pdChjb25zdCBDRlhfQnl0ZUFycmF5ICZyYXdCeXRlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJnRleHQsIGNvbnN0IENGWF9QdHJBcnJheSAmYnl0ZVNlZ21lbnRzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyAmZWNMZXZlbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZih0ZXh0LklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fcmF3Qnl0ZXMuQ29weShyYXdCeXRlcyk7DQorICAgIG1fdGV4dCA9IHRleHQ7DQorICAgIG1fcGRmNDE3Ynl0ZVNlZ21lbnRzLkNvcHkoYnl0ZVNlZ21lbnRzKTsNCisgICAgbV9wZGY0MTdlY0xldmVsID0gZWNMZXZlbDsNCisgICAgbV9vdGhlciA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OnNldE90aGVyKENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogb3RoZXIpDQorew0KKyAgICBtX290aGVyID0gb3RoZXI7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0Ojp+Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKQ0KK3sNCisgICAgaWYgKG1fb3RoZXIgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fb3RoZXI7DQorICAgIH0NCit9DQorY29uc3QgQ0ZYX0J5dGVBcnJheSYgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkdldFJhd0J5dGVzKCkNCit7DQorICAgIHJldHVybiBtX3Jhd0J5dGVzOw0KK30NCitjb25zdCBDRlhfSW50MzJBcnJheSYgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkdldEJ5dGVTZWdtZW50cygpDQorew0KKyAgICByZXR1cm4gbV9ieXRlU2VnbWVudHM7DQorfQ0KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6R2V0VGV4dCgpDQorew0KKyAgICByZXR1cm4gbV90ZXh0Ow0KK30NCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6R2V0RUNMZXZlbCgpDQorew0KKyAgICByZXR1cm4gbV9lY0xldmVsOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uRUNJLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Db21tb25FQ0kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmE3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uRUNJLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uRUNJLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgiDQorQ0JDX0NvbW1vbkVDSTo6Q0JDX0NvbW1vbkVDSShGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIG1fdmFsdWUgPSB2YWx1ZTsNCit9DQorQ0JDX0NvbW1vbkVDSTo6fkNCQ19Db21tb25FQ0koKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX0NvbW1vbkVDSTo6R2V0VmFsdWUoKQ0KK3sNCisgICAgcmV0dXJuIG1fdmFsdWU7DQorfQ0KK0NCQ19Db21tb25FQ0kqIENCQ19Db21tb25FQ0k6OkdldEVJQ0J5VmFsdWUoRlhfSU5UMzIgdmFsdWUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYodmFsdWUgPCAwIHx8IHZhbHVlID4gOTk5OTk5KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25CYWRFQ0k7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZih2YWx1ZSA8IDkwMCkgew0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODIzNDcyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmgiDQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oRlhfRkxPQVQgYTExLCBGWF9GTE9BVCBhMjEsIEZYX0ZMT0FUIGEzMSwNCisgICAgICAgIEZYX0ZMT0FUIGExMiwgRlhfRkxPQVQgYTIyLCBGWF9GTE9BVCBhMzIsDQorICAgICAgICBGWF9GTE9BVCBhMTMsIEZYX0ZMT0FUIGEyMywgRlhfRkxPQVQgYTMzKSA6DQorICAgIG1fYTExKGExMSksIG1fYTIxKGEyMSksIG1fYTMxKGEzMSksDQorICAgIG1fYTEyKGExMiksIG1fYTIyKGEyMiksIG1fYTMyKGEzMiksDQorICAgIG1fYTEzKGExMyksIG1fYTIzKGEyMyksIG1fYTMzKGEzMykNCit7DQorfQ0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6fkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSgpDQorew0KK30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gKkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6UXVhZHJpbGF0ZXJhbFRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwgRlhfRkxPQVQgeTAsDQorICAgICAgICBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsDQorICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsDQorICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsDQorICAgICAgICBGWF9GTE9BVCB4MHAsIEZYX0ZMT0FUIHkwcCwNCisgICAgICAgIEZYX0ZMT0FUIHgxcCwgRlhfRkxPQVQgeTFwLA0KKyAgICAgICAgRlhfRkxPQVQgeDJwLCBGWF9GTE9BVCB5MnAsDQorICAgICAgICBGWF9GTE9BVCB4M3AsIEZYX0ZMT0FUIHkzcCkNCit7DQorICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gcVRvUyhRdWFkcmlsYXRlcmFsVG9TcXVhcmUoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSk7DQorICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gc1RvUShTcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDBwLCB5MHAsIHgxcCwgeTFwLCB4MnAsIHkycCwgeDNwLCB5M3ApKTsNCisgICAgcmV0dXJuIHNUb1EtPlRpbWVzKCoocVRvUy5nZXQoKSkpOw0KK30NCit2b2lkIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6VHJhbnNmb3JtUG9pbnRzKENGWF9GbG9hdEFycmF5ICpwb2ludHMpDQorew0KKyAgICBGWF9JTlQzMiBtYXggPSBwb2ludHMtPkdldFNpemUoKTsNCisgICAgRlhfRkxPQVQgYTExID0gbV9hMTE7DQorICAgIEZYX0ZMT0FUIGExMiA9IG1fYTEyOw0KKyAgICBGWF9GTE9BVCBhMTMgPSBtX2ExMzsNCisgICAgRlhfRkxPQVQgYTIxID0gbV9hMjE7DQorICAgIEZYX0ZMT0FUIGEyMiA9IG1fYTIyOw0KKyAgICBGWF9GTE9BVCBhMjMgPSBtX2EyMzsNCisgICAgRlhfRkxPQVQgYTMxID0gbV9hMzE7DQorICAgIEZYX0ZMT0FUIGEzMiA9IG1fYTMyOw0KKyAgICBGWF9GTE9BVCBhMzMgPSBtX2EzMzsNCisgICAgRlhfSU5UMzIgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSAyKSB7DQorICAgICAgICBGWF9GTE9BVCB4ID0gKCpwb2ludHMpW2ldOw0KKyAgICAgICAgRlhfRkxPQVQgeSA9ICgqcG9pbnRzKVtpICsgMV07DQorICAgICAgICBGWF9GTE9BVCBkZW5vbWluYXRvciA9IGExMyAqIHggKyBhMjMgKiB5ICsgYTMzOw0KKyAgICAgICAgKCpwb2ludHMpW2ldID0gKGExMSAqIHggKyBhMjEgKiB5ICsgYTMxKSAvIGRlbm9taW5hdG9yOw0KKyAgICAgICAgKCpwb2ludHMpW2kgKyAxXSA9IChhMTIgKiB4ICsgYTIyICogeSArIGEzMikgLyBkZW5vbWluYXRvcjsNCisgICAgfQ0KK30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gKkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6U3F1YXJlVG9RdWFkcmlsYXRlcmFsKEZYX0ZMT0FUIHgwLCBGWF9GTE9BVCB5MCwNCisgICAgICAgIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwNCisgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwNCisgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MykNCit7DQorICAgIEZYX0ZMT0FUIGR5MiA9IHkzIC0geTI7DQorICAgIEZYX0ZMT0FUIGR5MyA9IHkwIC0geTEgKyB5MiAtIHkzOw0KKyAgICBpZiAoKGR5MiA9PSAwLjBmKSAmJiAoZHkzID09IDAuMGYpKSB7DQorICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSh4MSAtIHgwLCB4MiAtIHgxLCB4MCwNCisgICAgICAgICAgICAgICAgeTEgLSB5MCwgeTIgLSB5MSwgeTAsDQorICAgICAgICAgICAgICAgIDAuMGYsIDAuMGYsIDEuMGYpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgZHgxID0geDEgLSB4MjsNCisgICAgICAgIEZYX0ZMT0FUIGR4MiA9IHgzIC0geDI7DQorICAgICAgICBGWF9GTE9BVCBkeDMgPSB4MCAtIHgxICsgeDIgLSB4MzsNCisgICAgICAgIEZYX0ZMT0FUIGR5MSA9IHkxIC0geTI7DQorICAgICAgICBGWF9GTE9BVCBkZW5vbWluYXRvciA9IGR4MSAqIGR5MiAtIGR4MiAqIGR5MTsNCisgICAgICAgIEZYX0ZMT0FUIGExMyA9IChkeDMgKiBkeTIgLSBkeDIgKiBkeTMpIC8gZGVub21pbmF0b3I7DQorICAgICAgICBGWF9GTE9BVCBhMjMgPSAoZHgxICogZHkzIC0gZHgzICogZHkxKSAvIGRlbm9taW5hdG9yOw0KKyAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oeDEgLSB4MCArIGExMyAqIHgxLCB4MyAtIHgwICsgYTIzICogeDMsIHgwLA0KKyAgICAgICAgICAgICAgICB5MSAtIHkwICsgYTEzICogeTEsIHkzIC0geTAgKyBhMjMgKiB5MywgeTAsDQorICAgICAgICAgICAgICAgIGExMywgYTIzLCAxLjBmKTsNCisgICAgfQ0KK30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gKkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6UXVhZHJpbGF0ZXJhbFRvU3F1YXJlKEZYX0ZMT0FUIHgwLCBGWF9GTE9BVCB5MCwNCisgICAgICAgIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwNCisgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwNCisgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MykNCit7DQorICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gdGVtcDEoU3F1YXJlVG9RdWFkcmlsYXRlcmFsKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykpOw0KKyAgICByZXR1cm4gdGVtcDEtPkJ1aWxkQWRqb2ludCgpOw0KK30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gKkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6QnVpbGRBZGpvaW50KCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKG1fYTIyICogbV9hMzMgLSBtX2EyMyAqIG1fYTMyLA0KKyAgICAgICAgICAgIG1fYTIzICogbV9hMzEgLSBtX2EyMSAqIG1fYTMzLA0KKyAgICAgICAgICAgIG1fYTIxICogbV9hMzIgLSBtX2EyMiAqIG1fYTMxLA0KKyAgICAgICAgICAgIG1fYTEzICogbV9hMzIgLSBtX2ExMiAqIG1fYTMzLA0KKyAgICAgICAgICAgIG1fYTExICogbV9hMzMgLSBtX2ExMyAqIG1fYTMxLA0KKyAgICAgICAgICAgIG1fYTEyICogbV9hMzEgLSBtX2ExMSAqIG1fYTMyLA0KKyAgICAgICAgICAgIG1fYTEyICogbV9hMjMgLSBtX2ExMyAqIG1fYTIyLA0KKyAgICAgICAgICAgIG1fYTEzICogbV9hMjEgLSBtX2ExMSAqIG1fYTIzLA0KKyAgICAgICAgICAgIG1fYTExICogbV9hMjIgLSBtX2ExMiAqIG1fYTIxKTsNCit9DQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlRpbWVzKENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSAmb3RoZXIpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybShtX2ExMSAqIG90aGVyLm1fYTExICsgbV9hMjEgKiBvdGhlci5tX2ExMiArIG1fYTMxICogb3RoZXIubV9hMTMsDQorICAgICAgICAgICAgbV9hMTEgKiBvdGhlci5tX2EyMSArIG1fYTIxICogb3RoZXIubV9hMjIgKyBtX2EzMSAqIG90aGVyLm1fYTIzLA0KKyAgICAgICAgICAgIG1fYTExICogb3RoZXIubV9hMzEgKyBtX2EyMSAqIG90aGVyLm1fYTMyICsgbV9hMzEgKiBvdGhlci5tX2EzMywNCisgICAgICAgICAgICBtX2ExMiAqIG90aGVyLm1fYTExICsgbV9hMjIgKiBvdGhlci5tX2ExMiArIG1fYTMyICogb3RoZXIubV9hMTMsDQorICAgICAgICAgICAgbV9hMTIgKiBvdGhlci5tX2EyMSArIG1fYTIyICogb3RoZXIubV9hMjIgKyBtX2EzMiAqIG90aGVyLm1fYTIzLA0KKyAgICAgICAgICAgIG1fYTEyICogb3RoZXIubV9hMzEgKyBtX2EyMiAqIG90aGVyLm1fYTMyICsgbV9hMzIgKiBvdGhlci5tX2EzMywNCisgICAgICAgICAgICBtX2ExMyAqIG90aGVyLm1fYTExICsgbV9hMjMgKiBvdGhlci5tX2ExMiArIG1fYTMzICogb3RoZXIubV9hMTMsDQorICAgICAgICAgICAgbV9hMTMgKiBvdGhlci5tX2EyMSArIG1fYTIzICogb3RoZXIubV9hMjIgKyBtX2EzMyAqIG90aGVyLm1fYTIzLA0KKyAgICAgICAgICAgIG1fYTEzICogb3RoZXIubV9hMzEgKyBtX2EyMyAqIG90aGVyLm1fYTMyICsgbV9hMzMgKiBvdGhlci5tX2EzMyk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE3OWFhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMzUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeFZlcnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgiDQorQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCkNCit7DQorICAgIG1fbWFwcGluZ0JpdE1hdHJpeCA9IE5VTEw7DQorICAgIG1fdmVyc2lvbiA9IE5VTEw7DQorICAgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBOVUxMOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpJbml0KENCQ19Db21tb25CaXRNYXRyaXggKmJpdE1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBkaW1lbnNpb24gPSBiaXRNYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgICBpZiAoZGltZW5zaW9uIDwgOCB8fCBkaW1lbnNpb24gPiAxNDQgfHwgKGRpbWVuc2lvbiAmIDB4MDEpICE9IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3ZlcnNpb24gPSBSZWFkVmVyc2lvbihiaXRNYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgbV9tYXBwaW5nQml0TWF0cml4ID0gRXh0cmFjdERhdGFSZWdpb24oYml0TWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgICBtX3JlYWRNYXBwaW5nTWF0cml4LT5Jbml0KG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0V2lkdGgoKSwgbV9tYXBwaW5nQml0TWF0cml4LT5HZXRIZWlnaHQoKSk7DQorfQ0KK0NCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjp+Q0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIoKQ0KK3sNCisgICAgaWYobV9tYXBwaW5nQml0TWF0cml4ICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX21hcHBpbmdCaXRNYXRyaXg7DQorICAgIH0NCisgICAgbV9tYXBwaW5nQml0TWF0cml4ID0gTlVMTDsNCisgICAgaWYobV9yZWFkTWFwcGluZ01hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9yZWFkTWFwcGluZ01hdHJpeDsNCisgICAgfQ0KKyAgICBtX3JlYWRNYXBwaW5nTWF0cml4ID0gTlVMTDsNCit9DQorQ0JDX0RhdGFNYXRyaXhWZXJzaW9uICpDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6R2V0VmVyc2lvbigpDQorew0KKyAgICByZXR1cm4gbV92ZXJzaW9uOw0KK30NCitDQkNfRGF0YU1hdHJpeFZlcnNpb24gKkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkVmVyc2lvbihDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgcm93cyA9IGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICAgIEZYX0lOVDMyIGNvbHVtbnMgPSBiaXRNYXRyaXgtPkdldFdpZHRoKCk7DQorICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqdGVtcCA9IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0VmVyc2lvbkZvckRpbWVuc2lvbnMocm93cywgY29sdW1ucywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0NGWF9CeXRlQXJyYXkgKkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29kZXdvcmRzKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gcmVzdWx0KEZYX05FVyBDRlhfQnl0ZUFycmF5KCkpOw0KKyAgICByZXN1bHQtPlNldFNpemUobV92ZXJzaW9uLT5HZXRUb3RhbENvZGV3b3JkcygpKTsNCisgICAgRlhfSU5UMzIgcmVzdWx0T2Zmc2V0ID0gMDsNCisgICAgRlhfSU5UMzIgcm93ID0gNDsNCisgICAgRlhfSU5UMzIgY29sdW1uID0gMDsNCisgICAgRlhfSU5UMzIgbnVtUm93cyA9IG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICAgIEZYX0lOVDMyIG51bUNvbHVtbnMgPSBtX21hcHBpbmdCaXRNYXRyaXgtPkdldFdpZHRoKCk7DQorICAgIEZYX0JPT0wgY29ybmVyMVJlYWQgPSBGQUxTRTsNCisgICAgRlhfQk9PTCBjb3JuZXIyUmVhZCA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGNvcm5lcjNSZWFkID0gRkFMU0U7DQorICAgIEZYX0JPT0wgY29ybmVyNFJlYWQgPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgaWYgKChyb3cgPT0gbnVtUm93cykgJiYgKGNvbHVtbiA9PSAwKSAmJiAhY29ybmVyMVJlYWQpIHsNCisgICAgICAgICAgICAoKnJlc3VsdClbcmVzdWx0T2Zmc2V0KytdID0gKEZYX0JZVEUpIFJlYWRDb3JuZXIxKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgICAgICAgIHJvdyAtPSAyOw0KKyAgICAgICAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgICAgICAgIGNvcm5lcjFSZWFkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoKHJvdyA9PSBudW1Sb3dzIC0gMikgJiYgKGNvbHVtbiA9PSAwKSAmJiAoKG51bUNvbHVtbnMgJiAweDAzKSAhPSAwKSAmJiAhY29ybmVyMlJlYWQpIHsNCisgICAgICAgICAgICAoKnJlc3VsdClbcmVzdWx0T2Zmc2V0KytdID0gKEZYX0JZVEUpIFJlYWRDb3JuZXIyKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgICAgICAgIHJvdyAtPSAyOw0KKyAgICAgICAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgICAgICAgIGNvcm5lcjJSZWFkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoKHJvdyA9PSBudW1Sb3dzICsgNCkgJiYgKGNvbHVtbiA9PSAyKSAmJiAoKG51bUNvbHVtbnMgJiAweDA3KSA9PSAwKSAmJiAhY29ybmVyM1JlYWQpIHsNCisgICAgICAgICAgICAoKnJlc3VsdClbcmVzdWx0T2Zmc2V0KytdID0gKEZYX0JZVEUpIFJlYWRDb3JuZXIzKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgICAgICAgIHJvdyAtPSAyOw0KKyAgICAgICAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgICAgICAgIGNvcm5lcjNSZWFkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoKHJvdyA9PSBudW1Sb3dzIC0gMikgJiYgKGNvbHVtbiA9PSAwKSAmJiAoKG51bUNvbHVtbnMgJiAweDA3KSA9PSA0KSAmJiAhY29ybmVyNFJlYWQpIHsNCisgICAgICAgICAgICAoKnJlc3VsdClbcmVzdWx0T2Zmc2V0KytdID0gKEZYX0JZVEUpIFJlYWRDb3JuZXI0KG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgICAgICAgIHJvdyAtPSAyOw0KKyAgICAgICAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgICAgICAgIGNvcm5lcjRSZWFkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZG8gew0KKyAgICAgICAgICAgICAgICBpZiAoKHJvdyA8IG51bVJvd3MpICYmIChjb2x1bW4gPj0gMCkgJiYgIW1fcmVhZE1hcHBpbmdNYXRyaXgtPkdldChjb2x1bW4sIHJvdykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPCAoKnJlc3VsdCkuR2V0U2l6ZSgpICkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAoRlhfQllURSkgUmVhZFV0YWgocm93LCBjb2x1bW4sIG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJvdyAtPSAyOw0KKyAgICAgICAgICAgICAgICBjb2x1bW4gKz0gMjsNCisgICAgICAgICAgICB9IHdoaWxlICgocm93ID49IDApICYmIChjb2x1bW4gPCBudW1Db2x1bW5zKSk7DQorICAgICAgICAgICAgcm93ICs9IDE7DQorICAgICAgICAgICAgY29sdW1uICs9IDM7DQorICAgICAgICAgICAgZG8gew0KKyAgICAgICAgICAgICAgICBpZiAoKHJvdyA+PSAwKSAmJiAoY29sdW1uIDwgbnVtQ29sdW1ucykgJiYgIW1fcmVhZE1hcHBpbmdNYXRyaXgtPkdldChjb2x1bW4sIHJvdykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPCAoKnJlc3VsdCkuR2V0U2l6ZSgpICkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAoRlhfQllURSkgUmVhZFV0YWgocm93LCBjb2x1bW4sIG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJvdyArPSAyOw0KKyAgICAgICAgICAgICAgICBjb2x1bW4gLT0gMjsNCisgICAgICAgICAgICB9IHdoaWxlICgocm93IDwgbnVtUm93cykgJiYgKGNvbHVtbiA+PSAwKSk7DQorICAgICAgICAgICAgcm93ICs9IDM7DQorICAgICAgICAgICAgY29sdW1uICs9IDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKChyb3cgPCBudW1Sb3dzKSB8fCAoY29sdW1uIDwgbnVtQ29sdW1ucykpOw0KKyAgICBpZiAocmVzdWx0T2Zmc2V0ICE9IG1fdmVyc2lvbi0+R2V0VG90YWxDb2Rld29yZHMoKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRNb2R1bGUoRlhfSU5UMzIgcm93LCBGWF9JTlQzMiBjb2x1bW4sIEZYX0lOVDMyIG51bVJvd3MsIEZYX0lOVDMyIG51bUNvbHVtbnMpDQorew0KKyAgICBpZiAocm93IDwgMCkgew0KKyAgICAgICAgcm93ICs9IG51bVJvd3M7DQorICAgICAgICBjb2x1bW4gKz0gNCAtICgobnVtUm93cyArIDQpICYgMHgwNyk7DQorICAgIH0NCisgICAgaWYgKGNvbHVtbiA8IDApIHsNCisgICAgICAgIGNvbHVtbiArPSBudW1Db2x1bW5zOw0KKyAgICAgICAgcm93ICs9IDQgLSAoKG51bUNvbHVtbnMgKyA0KSAmIDB4MDcpOw0KKyAgICB9DQorICAgIG1fcmVhZE1hcHBpbmdNYXRyaXgtPlNldChjb2x1bW4sIHJvdyk7DQorICAgIHJldHVybiBtX21hcHBpbmdCaXRNYXRyaXgtPkdldChjb2x1bW4sIHJvdyk7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkVXRhaChGWF9JTlQzMiByb3csIEZYX0lOVDMyIGNvbHVtbiwgRlhfSU5UMzIgbnVtUm93cywgRlhfSU5UMzIgbnVtQ29sdW1ucykNCit7DQorICAgIEZYX0lOVDMyIGN1cnJlbnRCeXRlID0gMDsNCisgICAgaWYgKFJlYWRNb2R1bGUocm93IC0gMiwgY29sdW1uIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKHJvdyAtIDIsIGNvbHVtbiAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZShyb3cgLSAxLCBjb2x1bW4gLSAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUocm93IC0gMSwgY29sdW1uIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKHJvdyAtIDEsIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKHJvdywgY29sdW1uIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKHJvdywgY29sdW1uIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKHJvdywgY29sdW1uLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gY3VycmVudEJ5dGU7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyMShGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zKQ0KK3sNCisgICAgRlhfSU5UMzIgY3VycmVudEJ5dGUgPSAwOw0KKyAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgyLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDMsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gY3VycmVudEJ5dGU7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyMihGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zKQ0KK3sNCisgICAgRlhfSU5UMzIgY3VycmVudEJ5dGUgPSAwOw0KKyAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMywgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAyLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gNCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAzLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gY3VycmVudEJ5dGU7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyMyhGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zKQ0KK3sNCisgICAgRlhfSU5UMzIgY3VycmVudEJ5dGUgPSAwOw0KKyAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAzLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAzLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KK30NCitGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvcm5lcjQoRlhfSU5UMzIgbnVtUm93cywgRlhfSU5UMzIgbnVtQ29sdW1ucykNCit7DQorICAgIEZYX0lOVDMyIGN1cnJlbnRCeXRlID0gMDsNCisgICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDMsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMiwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgfQ0KKyAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgaWYgKFJlYWRNb2R1bGUoMiwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICB9DQorICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICBpZiAoUmVhZE1vZHVsZSgzLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgIH0NCisgICAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4ICpDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6RXh0cmFjdERhdGFSZWdpb24oQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0TWF0cml4ICwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBzeW1ib2xTaXplUm93cyA9IG1fdmVyc2lvbi0+R2V0U3ltYm9sU2l6ZVJvd3MoKTsNCisgICAgRlhfSU5UMzIgc3ltYm9sU2l6ZUNvbHVtbnMgPSBtX3ZlcnNpb24tPkdldFN5bWJvbFNpemVDb2x1bW5zKCk7DQorICAgIGlmIChiaXRNYXRyaXgtPkdldEhlaWdodCgpICE9IHN5bWJvbFNpemVSb3dzKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25DYW5Ob3RDYWxsR2V0RGltZW5zaW9uT25Ob25TcXVhcmVNYXRyaXg7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBkYXRhUmVnaW9uU2l6ZVJvd3MgPSBtX3ZlcnNpb24tPkdldERhdGFSZWdpb25TaXplUm93cygpOw0KKyAgICBGWF9JTlQzMiBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMgPSBtX3ZlcnNpb24tPkdldERhdGFSZWdpb25TaXplQ29sdW1ucygpOw0KKyAgICBGWF9JTlQzMiBudW1EYXRhUmVnaW9uc1JvdyA9IHN5bWJvbFNpemVSb3dzIC8gZGF0YVJlZ2lvblNpemVSb3dzOw0KKyAgICBGWF9JTlQzMiBudW1EYXRhUmVnaW9uc0NvbHVtbiA9IHN5bWJvbFNpemVDb2x1bW5zIC8gZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgICBGWF9JTlQzMiBzaXplRGF0YVJlZ2lvblJvdyA9IG51bURhdGFSZWdpb25zUm93ICogZGF0YVJlZ2lvblNpemVSb3dzOw0KKyAgICBGWF9JTlQzMiBzaXplRGF0YVJlZ2lvbkNvbHVtbiA9IG51bURhdGFSZWdpb25zQ29sdW1uICogZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50ID0gRlhfTkVXIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgICAgYml0TWF0cml4V2l0aG91dEFsaWdubWVudC0+SW5pdChzaXplRGF0YVJlZ2lvbkNvbHVtbiwgc2l6ZURhdGFSZWdpb25Sb3cpOw0KKyAgICBGWF9JTlQzMiBkYXRhUmVnaW9uUm93Ow0KKyAgICBmb3IgKGRhdGFSZWdpb25Sb3cgPSAwOyBkYXRhUmVnaW9uUm93IDwgbnVtRGF0YVJlZ2lvbnNSb3c7ICsrZGF0YVJlZ2lvblJvdykgew0KKyAgICAgICAgRlhfSU5UMzIgZGF0YVJlZ2lvblJvd09mZnNldCA9IGRhdGFSZWdpb25Sb3cgKiBkYXRhUmVnaW9uU2l6ZVJvd3M7DQorICAgICAgICBGWF9JTlQzMiBkYXRhUmVnaW9uQ29sdW1uOw0KKyAgICAgICAgZm9yIChkYXRhUmVnaW9uQ29sdW1uID0gMDsgZGF0YVJlZ2lvbkNvbHVtbiA8IG51bURhdGFSZWdpb25zQ29sdW1uOyArK2RhdGFSZWdpb25Db2x1bW4pIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBkYXRhUmVnaW9uQ29sdW1uT2Zmc2V0ID0gZGF0YVJlZ2lvbkNvbHVtbiAqIGRhdGFSZWdpb25TaXplQ29sdW1uczsNCisgICAgICAgICAgICBGWF9JTlQzMiBpOw0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhUmVnaW9uU2l6ZVJvd3M7ICsraSkgew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiByZWFkUm93T2Zmc2V0ID0gZGF0YVJlZ2lvblJvdyAqIChkYXRhUmVnaW9uU2l6ZVJvd3MgKyAyKSArIDEgKyBpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiB3cml0ZVJvd09mZnNldCA9IGRhdGFSZWdpb25Sb3dPZmZzZXQgKyBpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBqOw0KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGF0YVJlZ2lvblNpemVDb2x1bW5zOyArK2opIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHJlYWRDb2x1bW5PZmZzZXQgPSBkYXRhUmVnaW9uQ29sdW1uICogKGRhdGFSZWdpb25TaXplQ29sdW1ucyArIDIpICsgMSArIGo7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYml0TWF0cml4LT5HZXQocmVhZENvbHVtbk9mZnNldCwgcmVhZFJvd09mZnNldCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiB3cml0ZUNvbHVtbk9mZnNldCA9IGRhdGFSZWdpb25Db2x1bW5PZmZzZXQgKyBqOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdE1hdHJpeFdpdGhvdXRBbGlnbm1lbnQtPlNldCh3cml0ZUNvbHVtbk9mZnNldCwgd3JpdGVSb3dPZmZzZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjNjFkZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeFZlcnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmgiDQorQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6On5DQkNfRGF0YU1hdHJpeERhdGFCbG9jaygpDQorew0KK30NCitDQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6Q0JDX0RhdGFNYXRyaXhEYXRhQmxvY2soRlhfSU5UMzIgbnVtRGF0YUNvZGV3b3JkcywgQ0ZYX0J5dGVBcnJheSAqY29kZXdvcmRzKQ0KK3sNCisgICAgbV9jb2Rld29yZHMuQ29weSgqY29kZXdvcmRzKTsNCisgICAgbV9udW1EYXRhQ29kZXdvcmRzID0gbnVtRGF0YUNvZGV3b3JkczsNCit9DQorQ0ZYX1B0ckFycmF5ICpDQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6R2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqdmVyc2lvbiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBFQ0Jsb2NrcyAqZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2NrcygpOw0KKyAgICBGWF9JTlQzMiB0b3RhbEJsb2NrcyA9IDA7DQorICAgIGNvbnN0IENGWF9QdHJBcnJheSAmZWNCbG9ja0FycmF5ID0gZWNCbG9ja3MtPkdldEVDQmxvY2tzKCk7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBlY0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIHRvdGFsQmxvY2tzICs9ICgoRUNCKillY0Jsb2NrQXJyYXlbaV0pLT5HZXRDb3VudCgpOw0KKyAgICB9DQorICAgIENCQ19BdXRvUHRyPENGWF9QdHJBcnJheT5yZXN1bHQoRlhfTkVXIENGWF9QdHJBcnJheSgpKTsNCisgICAgcmVzdWx0LT5TZXRTaXplKHRvdGFsQmxvY2tzKTsNCisgICAgRlhfSU5UMzIgbnVtUmVzdWx0QmxvY2tzID0gMDsNCisgICAgRlhfSU5UMzIgajsNCisgICAgZm9yIChqID0gMDsgaiA8IGVjQmxvY2tBcnJheS5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICgoRUNCKillY0Jsb2NrQXJyYXlbal0pLT5HZXRDb3VudCgpOyBpKyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBudW1EYXRhQ29kZXdvcmRzID0gKChFQ0IqKWVjQmxvY2tBcnJheVtqXSktPkdldERhdGFDb2Rld29yZHMoKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBudW1CbG9ja0NvZGV3b3JkcyA9IGVjQmxvY2tzLT5HZXRFQ0NvZGV3b3JkcygpICsgbnVtRGF0YUNvZGV3b3JkczsNCisgICAgICAgICAgICBDRlhfQnl0ZUFycmF5IGNvZGV3b3JkczsNCisgICAgICAgICAgICBjb2Rld29yZHMuU2V0U2l6ZShudW1CbG9ja0NvZGV3b3Jkcyk7DQorICAgICAgICAgICAgKCpyZXN1bHQpW251bVJlc3VsdEJsb2NrcysrXSA9IEZYX05FVyBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayhudW1EYXRhQ29kZXdvcmRzLCAmY29kZXdvcmRzKTsNCisgICAgICAgICAgICBjb2Rld29yZHMuU2V0U2l6ZSgwKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBsb25nZXJCbG9ja3NUb3RhbENvZGV3b3JkcyA9ICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVswXSktPkdldENvZGV3b3JkcygpLT5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgPSBsb25nZXJCbG9ja3NUb3RhbENvZGV3b3JkcyAtIGVjQmxvY2tzLT5HZXRFQ0NvZGV3b3JkcygpOw0KKyAgICBGWF9JTlQzMiBzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3JkcyA9IGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgLSAxOw0KKyAgICBGWF9JTlQzMiByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgajsNCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1SZXN1bHRCbG9ja3M7IGorKykgew0KKyAgICAgICAgICAgIGlmIChyYXdDb2Rld29yZHNPZmZzZXQgPCByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKnJlc3VsdClbal0pLT5HZXRDb2Rld29yZHMoKS0+b3BlcmF0b3IgW10oaSkgPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CT09MIHNwZWNpYWxWZXJzaW9uID0gdmVyc2lvbi0+R2V0VmVyc2lvbk51bWJlcigpID09IDI0Ow0KKyAgICBGWF9JTlQzMiBudW1Mb25nZXJCbG9ja3MgPSBzcGVjaWFsVmVyc2lvbiA/IDggOiBudW1SZXN1bHRCbG9ja3M7DQorICAgIGZvciAoaiA9IDA7IGogPCBudW1Mb25nZXJCbG9ja3M7IGorKykgew0KKyAgICAgICAgaWYgKHJhd0NvZGV3b3Jkc09mZnNldCA8IHJhd0NvZGV3b3Jkcy0+R2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpW2pdKS0+R2V0Q29kZXdvcmRzKCktPm9wZXJhdG9yIFtdKGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgLSAxKSA9ICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgbWF4ID0gKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpWzBdKS0+R2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsNCisgICAgZm9yIChpID0gbG9uZ2VyQmxvY2tzTnVtRGF0YUNvZGV3b3JkczsgaSA8IG1heDsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBqOw0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVJlc3VsdEJsb2NrczsgaisrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU9mZnNldCA9IHNwZWNpYWxWZXJzaW9uICYmIGogPiA3ID8gaSAtIDEgOiBpOw0KKyAgICAgICAgICAgIGlmIChyYXdDb2Rld29yZHNPZmZzZXQgPCByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKnJlc3VsdClbal0pLT5HZXRDb2Rld29yZHMoKS0+b3BlcmF0b3IgW10oaU9mZnNldCkgPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocmF3Q29kZXdvcmRzT2Zmc2V0ICE9IHJhd0NvZGV3b3Jkcy0+R2V0U2l6ZSgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCit9DQorRlhfSU5UMzIgQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldE51bURhdGFDb2Rld29yZHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fbnVtRGF0YUNvZGV3b3JkczsNCit9DQorQ0ZYX0J5dGVBcnJheSAqQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldENvZGV3b3JkcygpDQorew0KKyAgICByZXR1cm4gJm1fY29kZXdvcmRzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODgwZjI0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApAQCAtMCwwICsxLDQ1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdFNvdXJjZS5oIg0KK2NvbnN0IEZYX0NIQVIgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpDNDBfQkFTSUNfU0VUX0NIQVJTW10gPSB7DQorICAgICcqJywgJyonLCAnKicsICcgJywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLA0KKyAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywNCisgICAgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJw0KK307DQorY29uc3QgRlhfQ0hBUiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkM0MF9TSElGVDJfU0VUX0NIQVJTW10gPSB7DQorICAgICchJywgJyInLCAnIycsICckJywgJyUnLCAnJicsICdcJycsICcoJywgJyknLCAnKicsICAnKycsICcsJywgJy0nLCAnLicsDQorICAgICcvJywgJzonLCAnOycsICc8JywgJz0nLCAnPicsICc/JywgICdAJywgJ1snLCAnXFwnLCAnXScsICdeJywgJ18nDQorfTsNCitjb25zdCBGWF9DSEFSIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6VEVYVF9CQVNJQ19TRVRfQ0hBUlNbXSA9IHsNCisgICAgJyonLCAnKicsICcqJywgJyAnLCAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsDQorICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLA0KKyAgICAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onDQorfTsNCitjb25zdCBGWF9DSEFSIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6VEVYVF9TSElGVDNfU0VUX0NIQVJTW10gPSB7DQorICAgICdcJycsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLA0KKyAgICAnTycsICAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ3snLCAnfCcsICd9JywgJ34nLCAoRlhfQ0hBUikgMTI3DQorfTsNCitjb25zdCBGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlBBRF9FTkNPREUgPSAwOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QVNDSUlfRU5DT0RFID0gMTsNCitjb25zdCBGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkM0MF9FTkNPREUgPSAyOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6VEVYVF9FTkNPREUgPSAzOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QU5TSVgxMl9FTkNPREUgPSA0Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RURJRkFDVF9FTkNPREUgPSA1Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QkFTRTI1Nl9FTkNPREUgPSA2Ow0KK0NCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6Q0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCkNCit7DQorfQ0KK0NCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6fkNCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpDQorew0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCAqQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUoQ0ZYX0J5dGVBcnJheSAmYnl0ZXMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSBiaXRzKCZieXRlcyk7DQorICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0VHJhaWxlcjsNCisgICAgQ0ZYX0ludDMyQXJyYXkgYnl0ZVNlZ21lbnRzOw0KKyAgICBGWF9JTlQzMiBtb2RlID0gQVNDSUlfRU5DT0RFOw0KKyAgICBkbyB7DQorICAgICAgICBpZiAobW9kZSA9PSAxKSB7DQorICAgICAgICAgICAgbW9kZSA9IERlY29kZUFzY2lpU2VnbWVudCgmYml0cywgcmVzdWx0LCByZXN1bHRUcmFpbGVyLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgICAgICBEZWNvZGVDNDBTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICAgICAgICAgIERlY29kZVRleHRTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICAgICAgICAgIERlY29kZUFuc2lYMTJTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgNToNCisgICAgICAgICAgICAgICAgICAgIERlY29kZUVkaWZhY3RTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICAgICAgICAgIERlY29kZUJhc2UyNTZTZWdtZW50KCZiaXRzLCByZXN1bHQsIGJ5dGVTZWdtZW50cywgZSk7DQorICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIE5VTEw7DQorICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbW9kZSA9IEFTQ0lJX0VOQ09ERTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAobW9kZSAhPSBQQURfRU5DT0RFICYmIGJpdHMuQXZhaWxhYmxlKCkgPiAwKTsNCisgICAgaWYgKHJlc3VsdFRyYWlsZXIuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICByZXN1bHQgKz0gcmVzdWx0VHJhaWxlcjsNCisgICAgfQ0KKyAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCAqdGVtcENwID0gIEZYX05FVyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KKyAgICB0ZW1wQ3AtPkluaXQoYnl0ZXMsIHJlc3VsdCwgKGJ5dGVTZWdtZW50cy5HZXRTaXplKCkgPD0gMCkgPyBDRlhfSW50MzJBcnJheSgpIDogYnl0ZVNlZ21lbnRzLCBOVUxMLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gdGVtcENwOw0KK30NCitGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUFzY2lpU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlICpiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0VHJhaWxlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9DSEFSIGJ1ZmZlclsxMjhdOw0KKyAgICBGWF9CT09MIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgRlhfSU5UMzIgb25lQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICAgICAgaWYgKG9uZUJ5dGUgPT0gMCkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA8PSAxMjgpIHsNCisgICAgICAgICAgICBvbmVCeXRlID0gdXBwZXJTaGlmdCA/IG9uZUJ5dGUgKyAxMjggOiBvbmVCeXRlOw0KKyAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgICByZXN1bHQgKz0gKChGWF9DSEFSKSAob25lQnl0ZSAtIDEpKTsNCisgICAgICAgICAgICByZXR1cm4gQVNDSUlfRU5DT0RFOw0KKyAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDEyOSkgew0KKyAgICAgICAgICAgIHJldHVybiBQQURfRU5DT0RFOw0KKyAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlIDw9IDIyOSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIHZhbHVlID0gb25lQnl0ZSAtIDEzMDsNCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgICAgICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihGWF9DSEFSKSAqIDEyOCk7DQorICAgICAgICAgICAgX2l0b2Ffcyh2YWx1ZSwgYnVmZmVyLCAxMjgsIDEwKTsNCisjZWxzZQ0KKyAgICAgICAgICAgIEZYU1lTX2l0b2EodmFsdWUsIGJ1ZmZlciwgMTApOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIGlmICh2YWx1ZSA8IDEwKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7DQorICAgICAgICAgICAgICAgIGJ1ZmZlclsxXSA9ICdcMCc7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyWzJdID0gJ1wwJzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0ICs9IGJ1ZmZlcjsNCisgICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzApIHsNCisgICAgICAgICAgICByZXR1cm4gQzQwX0VOQ09ERTsNCisgICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzEpIHsNCisgICAgICAgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREU7DQorICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjMyIHx8IG9uZUJ5dGUgPT0gMjMzIHx8IG9uZUJ5dGUgPT0gMjM0KSB7DQorICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjM1KSB7DQorICAgICAgICAgICAgdXBwZXJTaGlmdCA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjM2KSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9ICJbKT4iOw0KKyAgICAgICAgICAgIHJlc3VsdCArPSAweDFFOw0KKyAgICAgICAgICAgIHJlc3VsdCArPSAiMDUiOw0KKyAgICAgICAgICAgIHJlc3VsdCArPSAweDFEOw0KKyAgICAgICAgICAgIHJlc3VsdFRyYWlsZXIuSW5zZXJ0KDAsIDB4MUUpOw0KKyAgICAgICAgICAgIHJlc3VsdFRyYWlsZXIuSW5zZXJ0KDAgKyAxLCAweDA0KTsNCisgICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzcpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gIlspPiI7DQorICAgICAgICAgICAgcmVzdWx0ICs9IDB4MUU7DQorICAgICAgICAgICAgcmVzdWx0ICs9ICIwNiI7DQorICAgICAgICAgICAgcmVzdWx0ICs9IDB4MUQ7DQorICAgICAgICAgICAgcmVzdWx0VHJhaWxlci5JbnNlcnQoMCwgMHgxRSk7DQorICAgICAgICAgICAgcmVzdWx0VHJhaWxlci5JbnNlcnQoMCArIDEsIDB4MDQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzOCkgew0KKyAgICAgICAgICAgIHJldHVybiBBTlNJWDEyX0VOQ09ERTsNCisgICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzkpIHsNCisgICAgICAgICAgICByZXR1cm4gVEVYVF9FTkNPREU7DQorICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjQwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEVESUZBQ1RfRU5DT0RFOw0KKyAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDI0MSkgew0KKyAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID49IDI0Mikgew0KKyAgICAgICAgICAgIGlmIChvbmVCeXRlID09IDI1NCAmJiBiaXRzLT5BdmFpbGFibGUoKSA9PSAwKSB7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQorICAgIHJldHVybiBBU0NJSV9FTkNPREU7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVDNDBTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfQk9PTCB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgIENGWF9JbnQzMkFycmF5IGNWYWx1ZXM7DQorICAgIGNWYWx1ZXMuU2V0U2l6ZSgzKTsNCisgICAgZG8gew0KKyAgICAgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpID09IDgpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgaWYgKGZpcnN0Qnl0ZSA9PSAyNTQpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiB0ZW1wcCA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBQYXJzZVR3b0J5dGVzKGZpcnN0Qnl0ZSwgdGVtcHAsIGNWYWx1ZXMpOw0KKyAgICAgICAgRlhfSU5UMzIgc2hpZnQgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaTsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBjVmFsdWUgPSBjVmFsdWVzW2ldOw0KKyAgICAgICAgICAgIHN3aXRjaCAoc2hpZnQpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNWYWx1ZSA8IDMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNWYWx1ZSArIDE7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA8IDI3KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiBjNDBjaGFyID0gQzQwX0JBU0lDX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKGM0MGNoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGM0MGNoYXI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKGNWYWx1ZSArIDEyOCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjVmFsdWUgPCAyNykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgYzQwY2hhciA9IEM0MF9TSElGVDJfU0VUX0NIQVJTW2NWYWx1ZV07DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoYzQwY2hhciArIDEyOCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYzQwY2hhcjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyNykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAzMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoY1ZhbHVlICsgMjI0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKGNWYWx1ZSArIDk2KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChiaXRzLT5BdmFpbGFibGUoKSA+IDApOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlVGV4dFNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9CT09MIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgY1ZhbHVlczsNCisgICAgY1ZhbHVlcy5TZXRTaXplKDMpOw0KKyAgICBGWF9JTlQzMiBzaGlmdCA9IDA7DQorICAgIGRvIHsNCisgICAgICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA9PSA4KSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgZmlyc3RCeXRlID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIGlmIChmaXJzdEJ5dGUgPT0gMjU0KSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaW5UcCA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBQYXJzZVR3b0J5dGVzKGZpcnN0Qnl0ZSwgaW5UcCwgY1ZhbHVlcyk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgY1ZhbHVlID0gY1ZhbHVlc1tpXTsNCisgICAgICAgICAgICBzd2l0Y2ggKHNoaWZ0KSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICAgICAgICAgIGlmIChjVmFsdWUgPCAzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBjVmFsdWUgKyAxOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPCA0MCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgdGV4dENoYXIgPSBURVhUX0JBU0lDX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKHRleHRDaGFyICsgMTI4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0Q2hhcjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIChjVmFsdWUgKyAxMjgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY1ZhbHVlIDwgMjcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGM0MGNoYXIgPSBDNDBfU0hJRlQyX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKGM0MGNoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGM0MGNoYXI7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPT0gMjcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPT0gMzApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgICAgICAgICBpZiAoY1ZhbHVlIDwgMTkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIHRleHRDaGFyID0gVEVYVF9TSElGVDNfU0VUX0NIQVJTW2NWYWx1ZV07DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAodGV4dENoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHRDaGFyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUFuc2lYMTJTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0ludDMyQXJyYXkgY1ZhbHVlczsNCisgICAgY1ZhbHVlcy5TZXRTaXplKDMpOw0KKyAgICBkbyB7DQorICAgICAgICBpZiAoYml0cy0+QXZhaWxhYmxlKCkgPT0gOCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGZpcnN0Qnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBpZiAoZmlyc3RCeXRlID09IDI1NCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlUZW1wMSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBQYXJzZVR3b0J5dGVzKGZpcnN0Qnl0ZSwgaVRlbXAxLCBjVmFsdWVzKTsNCisgICAgICAgIEZYX0lOVDMyIGk7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgY1ZhbHVlID0gY1ZhbHVlc1tpXTsNCisgICAgICAgICAgICBpZiAoY1ZhbHVlID09IDApIHsNCisgICAgICAgICAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAnXHInKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAxKSB7DQorICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJyonKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyKSB7DQorICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJz4nKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAzKSB7DQorICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJyAnKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA8IDE0KSB7DQorICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgKEZYX0NIQVIpIChjVmFsdWUgKyA0NCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlIDwgNDApIHsNCisgICAgICAgICAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAoRlhfQ0hBUikgKGNWYWx1ZSArIDUxKSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChiaXRzLT5BdmFpbGFibGUoKSA+IDApOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6UGFyc2VUd29CeXRlcyhGWF9JTlQzMiBmaXJzdEJ5dGUsIEZYX0lOVDMyIHNlY29uZEJ5dGUsIENGWF9JbnQzMkFycmF5ICZyZXN1bHQpDQorew0KKyAgICBGWF9JTlQzMiBmdWxsQml0VmFsdWUgPSAoZmlyc3RCeXRlIDw8IDgpICsgc2Vjb25kQnl0ZSAtIDE7DQorICAgIEZYX0lOVDMyIHRlbXAgPSBmdWxsQml0VmFsdWUgLyAxNjAwOw0KKyAgICByZXN1bHRbMF0gPSB0ZW1wOw0KKyAgICBmdWxsQml0VmFsdWUgLT0gdGVtcCAqIDE2MDA7DQorICAgIHRlbXAgPSBmdWxsQml0VmFsdWUgLyA0MDsNCisgICAgcmVzdWx0WzFdID0gdGVtcDsNCisgICAgcmVzdWx0WzJdID0gZnVsbEJpdFZhbHVlIC0gdGVtcCAqIDQwOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlRWRpZmFjdFNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9DSEFSIGJ1ZmZlclsxMjhdOw0KKyAgICBGWF9CT09MIHVubGF0Y2ggPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpIDw9IDE2KSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaTsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBlZGlmYWN0VmFsdWUgPSBiaXRzLT5SZWFkQml0cyg2LCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICBpZiAoZWRpZmFjdFZhbHVlID09IDB4MUYpIHsNCisgICAgICAgICAgICAgICAgdW5sYXRjaCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghdW5sYXRjaCkgew0KKyAgICAgICAgICAgICAgICBpZiAoKGVkaWZhY3RWYWx1ZSAmIDMyKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBlZGlmYWN0VmFsdWUgfD0gNjQ7DQorICAgICAgICAgICAgICAgIH0NCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoRlhfQ0hBUikgKiAxMjgpOw0KKyAgICAgICAgICAgICAgICBfaXRvYV9zKGVkaWZhY3RWYWx1ZSwgYnVmZmVyLCAxMjgsIDEwKTsNCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ1ZmZlcjsNCisjZWxzZQ0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gRlhTWVNfaXRvYShlZGlmYWN0VmFsdWUsIGJ1ZmZlciwgMTApOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoIXVubGF0Y2ggJiYgYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUJhc2UyNTZTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIENGWF9JbnQzMkFycmF5ICZieXRlU2VnbWVudHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgY29kZXdvcmRQb3NpdGlvbiA9IDEgKyBiaXRzLT5nZXRCeXRlT2Zmc2V0KCk7DQorICAgIEZYX0lOVDMyIGlUbXAgPSAgYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBGWF9JTlQzMiBkMSA9IFVucmFuZG9taXplMjU1U3RhdGUoaVRtcCwgY29kZXdvcmRQb3NpdGlvbisrKTsNCisgICAgRlhfSU5UMzIgY291bnQ7DQorICAgIGlmIChkMSA9PSAwKSB7DQorICAgICAgICBjb3VudCA9IGJpdHMtPkF2YWlsYWJsZSgpIC8gODsNCisgICAgfSBlbHNlIGlmIChkMSA8IDI1MCkgew0KKyAgICAgICAgY291bnQgPSBkMTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0lOVDMyIGlUbXAzID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIGNvdW50ID0gMjUwICogKGQxIC0gMjQ5KSArIFVucmFuZG9taXplMjU1U3RhdGUoaVRtcDMsIGNvZGV3b3JkUG9zaXRpb24rKyk7DQorICAgIH0NCisgICAgaWYgKGNvdW50IDwgMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlQXJyYXkgKmJ5dGVzID0gRlhfTkVXIENGWF9CeXRlQXJyYXkoKTsNCisgICAgYnl0ZXMtPlNldFNpemUoY291bnQpOw0KKyAgICBGWF9JTlQzMiBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICAgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpIDwgOCkgew0KKyAgICAgICAgICAgIGUgID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgZGVsZXRlIGJ5dGVzOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlUZW1wNSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGRlbGV0ZSBieXRlczsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBieXRlcy0+U2V0QXQoaSwgVW5yYW5kb21pemUyNTVTdGF0ZShpVGVtcDUsIGNvZGV3b3JkUG9zaXRpb24rKykpOw0KKyAgICB9DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgKmJ5dGVzKTsNCisgICAgZGVsZXRlIGJ5dGVzOw0KK30NCitGWF9CWVRFIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6VW5yYW5kb21pemUyNTVTdGF0ZShGWF9JTlQzMiByYW5kb21pemVkQmFzZTI1NkNvZGV3b3JkLCBGWF9JTlQzMiBiYXNlMjU2Q29kZXdvcmRQb3NpdGlvbikNCit7DQorICAgIEZYX0lOVDMyIHBzZXVkb1JhbmRvbU51bWJlciA9ICgoMTQ5ICogYmFzZTI1NkNvZGV3b3JkUG9zaXRpb24pICUgMjU1KSArIDE7DQorICAgIEZYX0lOVDMyIHRlbXBWYXJpYWJsZSA9IHJhbmRvbWl6ZWRCYXNlMjU2Q29kZXdvcmQgLSBwc2V1ZG9SYW5kb21OdW1iZXI7DQorICAgIHJldHVybiAoRlhfQllURSkgKHRlbXBWYXJpYWJsZSA+PSAwID8gdGVtcFZhcmlhYmxlIDogdGVtcFZhcmlhYmxlICsgMjU2KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhEZWNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4RGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjNDMyMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4RGVjb2Rlci5jcHAKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhEZWNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25EZWNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4VmVyc2lvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhEYXRhQmxvY2suaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KK0NCQ19EYXRhTWF0cml4RGVjb2Rlcjo6Q0JDX0RhdGFNYXRyaXhEZWNvZGVyKCkNCit7DQorICAgIG1fcnNEZWNvZGVyID0gTlVMTDsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZXI6OkluaXQoKQ0KK3sNCisgICAgbV9yc0RlY29kZXIgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkKTsNCit9DQorQ0JDX0RhdGFNYXRyaXhEZWNvZGVyOjp+Q0JDX0RhdGFNYXRyaXhEZWNvZGVyKCkNCit7DQorICAgIGlmKG1fcnNEZWNvZGVyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX3JzRGVjb2RlcjsNCisgICAgfQ0KKyAgICBtX3JzRGVjb2RlciA9IE5VTEw7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0ICpDQkNfRGF0YU1hdHJpeERlY29kZXI6OkRlY29kZShDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyIHBhcnNlcjsNCisgICAgcGFyc2VyLkluaXQoYml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uICp2ZXJzaW9uID0gcGFyc2VyLkdldFZlcnNpb24oKTsNCisgICAgQ0ZYX0J5dGVBcnJheSogYnl0ZVRlbXAgPSBwYXJzZXIuUmVhZENvZGV3b3JkcyhlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfQnl0ZUFycmF5PiBjb2Rld29yZHMoYnl0ZVRlbXApOw0KKyAgICBDRlhfUHRyQXJyYXkgKmRhdGFCbG9ja3MgPSBDQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6R2V0RGF0YUJsb2Nrcyhjb2Rld29yZHMuZ2V0KCksIHZlcnNpb24sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0lOVDMyIGRhdGFCbG9ja3NDb3VudCA9IGRhdGFCbG9ja3MtPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgdG90YWxCeXRlcyA9IDA7DQorICAgIEZYX0lOVDMyIGksIGo7DQorICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhQmxvY2tzQ291bnQ7IGkrKykgew0KKyAgICAgICAgdG90YWxCeXRlcyArPSAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2ldKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgICB9DQorICAgIENGWF9CeXRlQXJyYXkgcmVzdWx0Qnl0ZXM7DQorICAgIHJlc3VsdEJ5dGVzLlNldFNpemUodG90YWxCeXRlcyk7DQorICAgIGZvciAoaiA9IDA7IGogPCBkYXRhQmxvY2tzQ291bnQ7IGorKykgew0KKyAgICAgICAgQ0ZYX0J5dGVBcnJheSAqY29kZXdvcmRCeXRlcyA9ICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqZGF0YUJsb2Nrcylbal0pLT5HZXRDb2Rld29yZHMoKTsNCisgICAgICAgIEZYX0lOVDMyIG51bURhdGFDb2Rld29yZHMgPSAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2pdKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgICAgICAgQ29ycmVjdEVycm9ycygqY29kZXdvcmRCeXRlcywgbnVtRGF0YUNvZGV3b3JkcywgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtpXTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVsZXRlIGRhdGFCbG9ja3M7DQorICAgICAgICAgICAgZGF0YUJsb2NrcyA9IE5VTEw7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bURhdGFDb2Rld29yZHM7IGkrKykgew0KKyAgICAgICAgICAgIHJlc3VsdEJ5dGVzW2kgKiBkYXRhQmxvY2tzQ291bnQgKyBqXSA9ICgqY29kZXdvcmRCeXRlcylbaV07DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yKGkgPSAwOyBpIDwgKGRhdGFCbG9ja3MtPkdldFNpemUoKSk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtpXTsNCisgICAgfQ0KKyAgICBkZWxldGUgZGF0YUJsb2NrczsNCisgICAgZGF0YUJsb2NrcyA9IE5VTEw7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0ICpyZXN1bHRSID0gQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUocmVzdWx0Qnl0ZXMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiByZXN1bHRSOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2Rlcjo6Q29ycmVjdEVycm9ycyhDRlhfQnl0ZUFycmF5ICZjb2Rld29yZEJ5dGVzLCBGWF9JTlQzMiBudW1EYXRhQ29kZXdvcmRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIG51bUNvZGV3b3JkcyA9IGNvZGV3b3JkQnl0ZXMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBjb2Rld29yZHNJbnRzOw0KKyAgICBjb2Rld29yZHNJbnRzLlNldFNpemUobnVtQ29kZXdvcmRzKTsNCisgICAgRlhfSU5UMzIgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGV3b3JkczsgaSsrKSB7DQorICAgICAgICBjb2Rld29yZHNJbnRzW2ldID0gY29kZXdvcmRCeXRlc1tpXSAmIDB4RkY7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbnVtRUNDb2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLkdldFNpemUoKSAtIG51bURhdGFDb2Rld29yZHM7DQorICAgIG1fcnNEZWNvZGVyLT5EZWNvZGUoJmNvZGV3b3Jkc0ludHMsIG51bUVDQ29kZXdvcmRzLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgICAgICByZXR1cm4gOw0KKyAgICB9DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspIHsNCisgICAgICAgIGNvZGV3b3JkQnl0ZXNbaV0gPSAoRlhfQllURSkgY29kZXdvcmRzSW50c1tpXTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERldGVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmI3YTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeERldGVjdG9yLmNwcApAQCAtMCwwICsxLDM1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkdyaWRTYW1wbGVyLmgiDQorY29uc3QgRlhfSU5UMzIgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6SU5URUdFUlNbNV0gPSB7MCwgMSwgMiwgMywgNH07DQorQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6Q0JDX0RhdGFNYXRyaXhEZXRlY3RvcihDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSk6DQorICAgIG1faW1hZ2UoaW1hZ2UpLCBtX3JlY3RhbmdsZURldGVjdG9yKE5VTEwpDQorew0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkluaXQoRlhfSU5UMzIgJmUpDQorew0KKyAgICBtX3JlY3RhbmdsZURldGVjdG9yID0gRlhfTkVXIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKG1faW1hZ2UpOw0KKyAgICBtX3JlY3RhbmdsZURldGVjdG9yLT5Jbml0KGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit9DQorQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6fkNCQ19EYXRhTWF0cml4RGV0ZWN0b3IoKQ0KK3sNCisgICAgaWYobV9yZWN0YW5nbGVEZXRlY3RvciAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9yZWN0YW5nbGVEZXRlY3RvcjsNCisgICAgfQ0KKyAgICBtX3JlY3RhbmdsZURldGVjdG9yID0gTlVMTDsNCit9DQoraW5saW5lIEZYX0JPT0wgUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnNDb21wYXJhdG9yKEZYX0xQVk9JRCBhLCBGWF9MUFZPSUQgYikNCit7DQorICAgIHJldHVybiAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqKWIpLT5HZXRUcmFuc2l0aW9ucygpID4gKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKilhKS0+R2V0VHJhbnNpdGlvbnMoKTsNCit9DQorQ0JDX1FSRGV0ZWN0b3JSZXN1bHQgKkNCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkRldGVjdChGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9QdHJBcnJheSogY29ybmVyUG9pbnRzID0gbV9yZWN0YW5nbGVEZXRlY3Rvci0+RGV0ZWN0KGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19SZXN1bHRQb2ludCAqcG9pbnRBID0gKENCQ19SZXN1bHRQb2ludCopKCpjb3JuZXJQb2ludHMpWzBdOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQgKnBvaW50QiA9IChDQkNfUmVzdWx0UG9pbnQqKSgqY29ybmVyUG9pbnRzKVsxXTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICpwb2ludEMgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKmNvcm5lclBvaW50cylbMl07DQorICAgIENCQ19SZXN1bHRQb2ludCAqcG9pbnREID0gKENCQ19SZXN1bHRQb2ludCopKCpjb3JuZXJQb2ludHMpWzNdOw0KKyAgICBkZWxldGUgY29ybmVyUG9pbnRzOw0KKyAgICBjb3JuZXJQb2ludHMgPSBOVUxMOw0KKyAgICBDRlhfUHRyQXJyYXkgdHJhbnNpdGlvbnM7DQorICAgIHRyYW5zaXRpb25zLkFkZChUcmFuc2l0aW9uc0JldHdlZW4ocG9pbnRBLCBwb2ludEIpKTsNCisgICAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEEsIHBvaW50QykpOw0KKyAgICB0cmFuc2l0aW9ucy5BZGQoVHJhbnNpdGlvbnNCZXR3ZWVuKHBvaW50QiwgcG9pbnREKSk7DQorICAgIHRyYW5zaXRpb25zLkFkZChUcmFuc2l0aW9uc0JldHdlZW4ocG9pbnRDLCBwb2ludEQpKTsNCisgICAgQkNfRlhfUHRyQXJyYXlfU29ydCh0cmFuc2l0aW9ucywgJlJlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zQ29tcGFyYXRvcik7DQorICAgIGRlbGV0ZSAoIChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKil0cmFuc2l0aW9uc1syXSApOw0KKyAgICBkZWxldGUgKCAoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zICopdHJhbnNpdGlvbnNbM10gKTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zICpsU2lkZU9uZSA9IChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKXRyYW5zaXRpb25zWzBdOw0KKyAgICBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKmxTaWRlVHdvID0gKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbMV07DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBGWF9JTlQzMj4gcG9pbnRDb3VudDsNCisgICAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlT25lLT5HZXRGcm9tKCkpOw0KKyAgICBJbmNyZW1lbnQocG9pbnRDb3VudCwgbFNpZGVPbmUtPkdldFRvKCkpOw0KKyAgICBJbmNyZW1lbnQocG9pbnRDb3VudCwgbFNpZGVUd28tPkdldEZyb20oKSk7DQorICAgIEluY3JlbWVudChwb2ludENvdW50LCBsU2lkZVR3by0+R2V0VG8oKSk7DQorICAgIGRlbGV0ZSAoIChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKil0cmFuc2l0aW9uc1sxXSApOw0KKyAgICBkZWxldGUgKCAoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zICopdHJhbnNpdGlvbnNbMF0gKTsNCisgICAgdHJhbnNpdGlvbnMuUmVtb3ZlQWxsKCk7DQorICAgIENCQ19SZXN1bHRQb2ludCAqbWF5YmVUb3BMZWZ0ID0gTlVMTDsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0ID0gTlVMTDsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICptYXliZUJvdHRvbVJpZ2h0ID0gTlVMTDsNCisgICAgRlhfUE9TSVRJT04gaXRCZWdpbiA9IHBvaW50Q291bnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZShpdEJlZ2luICE9IE5VTEwpIHsNCisgICAgICAgIENCQ19SZXN1bHRQb2ludCAqa2V5ID0gMDsNCisgICAgICAgIEZYX0lOVDMyIHZhbHVlID0gMDsNCisgICAgICAgIHBvaW50Q291bnQuR2V0TmV4dEFzc29jKGl0QmVnaW4sIGtleSwgdmFsdWUpOw0KKyAgICAgICAgaWYodmFsdWUgPT0gMikgew0KKyAgICAgICAgICAgIGJvdHRvbUxlZnQgPSBrZXk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtYXliZUJvdHRvbVJpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgbWF5YmVCb3R0b21SaWdodCA9IGtleTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtYXliZVRvcExlZnQgPSBrZXk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtYXliZVRvcExlZnQgPT0gTlVMTCB8fCBib3R0b21MZWZ0ID09IE5VTEwgfHwgbWF5YmVCb3R0b21SaWdodCA9PSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgcG9pbnRBOw0KKyAgICAgICAgZGVsZXRlIHBvaW50QjsNCisgICAgICAgIGRlbGV0ZSBwb2ludEM7DQorICAgICAgICBkZWxldGUgcG9pbnREOw0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgY29ybmVyczsNCisgICAgY29ybmVycy5TZXRTaXplKDMpOw0KKyAgICBjb3JuZXJzWzBdID0gbWF5YmVUb3BMZWZ0Ow0KKyAgICBjb3JuZXJzWzFdID0gYm90dG9tTGVmdDsNCisgICAgY29ybmVyc1syXSA9IG1heWJlQm90dG9tUmlnaHQ7DQorICAgIE9yZGVyQmVzdFBhdHRlcm5zKCZjb3JuZXJzKTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21SaWdodCA9IChDQkNfUmVzdWx0UG9pbnQqKWNvcm5lcnNbMF07DQorICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50Kiljb3JuZXJzWzFdOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50Kiljb3JuZXJzWzJdOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcFJpZ2h0ID0gTlVMTDsNCisgICAgRlhfSU5UMzIgdmFsdWU7DQorICAgIGlmICghcG9pbnRDb3VudC5Mb29rdXAocG9pbnRBLCB2YWx1ZSkpIHsNCisgICAgICAgIHRvcFJpZ2h0ID0gcG9pbnRBOw0KKyAgICB9IGVsc2UgaWYgKCFwb2ludENvdW50Lkxvb2t1cChwb2ludEIsIHZhbHVlKSkgew0KKyAgICAgICAgdG9wUmlnaHQgPSBwb2ludEI7DQorICAgIH0gZWxzZSBpZiAoIXBvaW50Q291bnQuTG9va3VwKHBvaW50QywgdmFsdWUpKSB7DQorICAgICAgICB0b3BSaWdodCA9IHBvaW50QzsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHRvcFJpZ2h0ID0gcG9pbnREOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGRpbWVuc2lvblRvcCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIHRvcFJpZ2h0KSktPkdldFRyYW5zaXRpb25zKCk7DQorICAgIEZYX0lOVDMyIGRpbWVuc2lvblJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIHRvcFJpZ2h0KSktPkdldFRyYW5zaXRpb25zKCk7DQorICAgIGlmICgoZGltZW5zaW9uVG9wICYgMHgwMSkgPT0gMSkgew0KKyAgICAgICAgZGltZW5zaW9uVG9wKys7DQorICAgIH0NCisgICAgZGltZW5zaW9uVG9wICs9IDI7DQorICAgIGlmICgoZGltZW5zaW9uUmlnaHQgJiAweDAxKSA9PSAxKSB7DQorICAgICAgICBkaW1lbnNpb25SaWdodCsrOw0KKyAgICB9DQorICAgIGRpbWVuc2lvblJpZ2h0ICs9IDI7DQorICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+IGJpdHMoTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4gY29ycmVjdGVkVG9wUmlnaHQoTlVMTCk7DQorICAgIGlmICg0ICogZGltZW5zaW9uVG9wID49IDcgKiBkaW1lbnNpb25SaWdodCB8fCA0ICogZGltZW5zaW9uUmlnaHQgPj0gNyAqIGRpbWVuc2lvblRvcCkgew0KKyAgICAgICAgY29ycmVjdGVkVG9wUmlnaHQgPQ0KKyAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oQ29ycmVjdFRvcFJpZ2h0UmVjdGFuZ3VsYXIoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIHRvcExlZnQsIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uVG9wLCBkaW1lbnNpb25SaWdodCkpOw0KKyAgICAgICAgaWYgKGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4odG9wUmlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkZWxldGUgdG9wUmlnaHQ7DQorICAgICAgICAgICAgdG9wUmlnaHQgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGltZW5zaW9uVG9wID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKTsNCisgICAgICAgIGRpbWVuc2lvblJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpKSktPkdldFRyYW5zaXRpb25zKCk7DQorICAgICAgICBpZiAoKGRpbWVuc2lvblRvcCAmIDB4MDEpID09IDEpIHsNCisgICAgICAgICAgICBkaW1lbnNpb25Ub3ArKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoZGltZW5zaW9uUmlnaHQgJiAweDAxKSA9PSAxKSB7DQorICAgICAgICAgICAgZGltZW5zaW9uUmlnaHQrKzsNCisgICAgICAgIH0NCisgICAgICAgIGJpdHMgPSBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PihTYW1wbGVHcmlkKG1faW1hZ2UsIHRvcExlZnQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpLCBkaW1lbnNpb25Ub3AsIGRpbWVuc2lvblJpZ2h0LCBlKSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9JTlQzMiBkaW1lbnNpb24gPSBGWF9NSU4oZGltZW5zaW9uUmlnaHQsIGRpbWVuc2lvblRvcCk7DQorICAgICAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oQ29ycmVjdFRvcFJpZ2h0KGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0LCB0b3BSaWdodCwgZGltZW5zaW9uKSk7DQorICAgICAgICBpZiAoY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGNvcnJlY3RlZFRvcFJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50Pih0b3BSaWdodCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRlbGV0ZSB0b3BSaWdodDsNCisgICAgICAgICAgICB0b3BSaWdodCA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBkaW1lbnNpb25Db3JyZWN0ZWQgPSBGWF9NQVgoQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICAgICAgICBkaW1lbnNpb25Db3JyZWN0ZWQrKzsNCisgICAgICAgIGlmICgoZGltZW5zaW9uQ29ycmVjdGVkICYgMHgwMSkgPT0gMSkgew0KKyAgICAgICAgICAgIGRpbWVuc2lvbkNvcnJlY3RlZCsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYml0cyA9IENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+KFNhbXBsZUdyaWQobV9pbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uQ29ycmVjdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbkNvcnJlY3RlZCwgZSkpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgICAgcmVzdWx0LT5TZXRTaXplKDQpOw0KKyAgICByZXN1bHQtPkFkZCh0b3BMZWZ0KTsNCisgICAgcmVzdWx0LT5BZGQoYm90dG9tTGVmdCk7DQorICAgIHJlc3VsdC0+QWRkKGJvdHRvbVJpZ2h0KTsNCisgICAgcmVzdWx0LT5BZGQoY29ycmVjdGVkVG9wUmlnaHQucmVsZWFzZSgpKTsNCisgICAgcmV0dXJuIEZYX05FVyBDQkNfUVJEZXRlY3RvclJlc3VsdChiaXRzLnJlbGVhc2UoKSwgcmVzdWx0KTsNCit9DQorQ0JDX1Jlc3VsdFBvaW50ICpDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpDb3JyZWN0VG9wUmlnaHRSZWN0YW5ndWxhcihDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCAqYm90dG9tUmlnaHQsIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwgRlhfSU5UMzIgZGltZW5zaW9uVG9wLCBGWF9JTlQzMiBkaW1lbnNpb25SaWdodCkNCit7DQorICAgIEZYX0ZMT0FUIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCBib3R0b21SaWdodCkgLyAoRlhfRkxPQVQpZGltZW5zaW9uVG9wOw0KKyAgICBGWF9JTlQzMiBub3JtID0gRGlzdGFuY2UodG9wTGVmdCwgdG9wUmlnaHQpOw0KKyAgICBGWF9GTE9BVCBjb3MgPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgLyBub3JtOw0KKyAgICBGWF9GTE9BVCBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgLyBub3JtOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMxKEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQorICAgIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCB0b3BMZWZ0KSAvIChGWF9GTE9BVClkaW1lbnNpb25SaWdodDsNCisgICAgbm9ybSA9IERpc3RhbmNlKGJvdHRvbVJpZ2h0LCB0b3BSaWdodCk7DQorICAgIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gYm90dG9tUmlnaHQtPkdldFgoKSkgLyBub3JtOw0KKyAgICBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIGJvdHRvbVJpZ2h0LT5HZXRZKCkpIC8gbm9ybTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiBjMihGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRvcFJpZ2h0LT5HZXRYKCkgKyBjb3JyICogY29zLCB0b3BSaWdodC0+R2V0WSgpICsgY29yciAqIHNpbikpOw0KKyAgICBpZiAoIUlzVmFsaWQoYzEuZ2V0KCkpKSB7DQorICAgICAgICBpZiAoSXNWYWxpZChjMi5nZXQoKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gYzIucmVsZWFzZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0gZWxzZSBpZiAoIUlzVmFsaWQoYzIuZ2V0KCkpKSB7DQorICAgICAgICByZXR1cm4gYzEucmVsZWFzZSgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGwxID0gRlhTWVNfYWJzKGRpbWVuc2lvblRvcCAtIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMxLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkpICsNCisgICAgICAgICAgICAgICAgICBGWFNZU19hYnMoZGltZW5zaW9uUmlnaHQgLSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzEuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICAgIEZYX0lOVDMyIGwyID0gRlhTWVNfYWJzKGRpbWVuc2lvblRvcCAtIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMyLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkpICsNCisgICAgICAgICAgICAgICAgICBGWFNZU19hYnMoZGltZW5zaW9uUmlnaHQgLSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzIuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICAgIGlmIChsMSA8PSBsMikgew0KKyAgICAgICAgcmV0dXJuIGMxLnJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYzIucmVsZWFzZSgpOw0KK30NCitDQkNfUmVzdWx0UG9pbnQgKkNCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkNvcnJlY3RUb3BSaWdodChDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCAqYm90dG9tUmlnaHQsIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwgRlhfSU5UMzIgZGltZW5zaW9uKQ0KK3sNCisgICAgRlhfRkxPQVQgY29yciA9IERpc3RhbmNlKGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSAvIChGWF9GTE9BVCkgZGltZW5zaW9uOw0KKyAgICBGWF9JTlQzMiBub3JtID0gRGlzdGFuY2UodG9wTGVmdCwgdG9wUmlnaHQpOw0KKyAgICBGWF9GTE9BVCBjb3MgPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgLyBub3JtOw0KKyAgICBGWF9GTE9BVCBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgLyBub3JtOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMxKEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQorICAgIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCBib3R0b21SaWdodCkgLyAoRlhfRkxPQVQpIGRpbWVuc2lvbjsNCisgICAgbm9ybSA9IERpc3RhbmNlKGJvdHRvbVJpZ2h0LCB0b3BSaWdodCk7DQorICAgIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gYm90dG9tUmlnaHQtPkdldFgoKSkgLyBub3JtOw0KKyAgICBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIGJvdHRvbVJpZ2h0LT5HZXRZKCkpIC8gbm9ybTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiBjMihGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRvcFJpZ2h0LT5HZXRYKCkgKyBjb3JyICogY29zLCB0b3BSaWdodC0+R2V0WSgpICsgY29yciAqIHNpbikpOw0KKyAgICBpZiAoIUlzVmFsaWQoYzEuZ2V0KCkpKSB7DQorICAgICAgICBpZiAoSXNWYWxpZChjMi5nZXQoKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gYzIucmVsZWFzZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0gZWxzZSBpZiAoIUlzVmFsaWQoYzIuZ2V0KCkpKSB7DQorICAgICAgICByZXR1cm4gYzEucmVsZWFzZSgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGwxID0gRlhTWVNfYWJzKENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMxLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzEuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICAgIEZYX0lOVDMyIGwyID0gRlhTWVNfYWJzKENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMyLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzIuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICAgIHJldHVybiBsMSA8PSBsMiA/IGMxLnJlbGVhc2UoKSA6IGMyLnJlbGVhc2UoKTsNCit9DQorRlhfQk9PTCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpJc1ZhbGlkKENCQ19SZXN1bHRQb2ludCAqcCkNCit7DQorICAgIHJldHVybiBwLT5HZXRYKCkgPj0gMCAmJiBwLT5HZXRYKCkgPCBtX2ltYWdlLT5HZXRXaWR0aCgpICYmIHAtPkdldFkoKSA+IDAgJiYgcC0+R2V0WSgpIDwgbV9pbWFnZS0+R2V0SGVpZ2h0KCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OlJvdW5kKEZYX0ZMT0FUIGQpDQorew0KKyAgICByZXR1cm4gKEZYX0lOVDMyKSAoZCArIDAuNWYpOw0KK30NCitGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQgKmEsIENCQ19SZXN1bHRQb2ludCAqYikNCit7DQorICAgIHJldHVybiBSb3VuZCgoRlhfRkxPQVQpIHNxcnQoKGEtPkdldFgoKSAtIGItPkdldFgoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhLT5HZXRYKCkgLSBiLT5HZXRYKCkpICsgKGEtPkdldFkoKSAtIGItPkdldFkoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhLT5HZXRZKCkgLSBiLT5HZXRZKCkpKSk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6SW5jcmVtZW50KENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBGWF9JTlQzMj4gJnRhYmxlLCBDQkNfUmVzdWx0UG9pbnQgKmtleSkNCit7DQorICAgIEZYX0lOVDMyIHZhbHVlOw0KKyAgICBpZih0YWJsZS5Mb29rdXAoa2V5LCB2YWx1ZSkpIHsNCisgICAgICAgIHRhYmxlLlNldEF0KGtleSwgSU5URUdFUlNbdmFsdWUgKyAxXSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB0YWJsZS5TZXRBdChrZXksIElOVEVHRVJTWzFdKTsNCisgICAgfQ0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4ICpDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLA0KKyAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICp0b3BMZWZ0LA0KKyAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0LA0KKyAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21SaWdodCwNCisgICAgICAgIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQorICAgICAgICBGWF9JTlQzMiBkaW1lbnNpb25YLCBGWF9JTlQzMiBkaW1lbnNpb25ZLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19RUkdyaWRTYW1wbGVyICZzYW1wbGVyID0gQ0JDX1FSR3JpZFNhbXBsZXI6OkdldEluc3RhbmNlKCk7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGNibSA9IHNhbXBsZXIuU2FtcGxlR3JpZChpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uWCAtIDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvblggLSAwLjVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25ZIC0gMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uWSAtIDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQtPkdldFgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdC0+R2V0WSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodC0+R2V0WCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodC0+R2V0WSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodC0+R2V0WCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodC0+R2V0WSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21MZWZ0LT5HZXRYKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQtPkdldFkoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIGNibTsNCit9DQorQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zICpDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpUcmFuc2l0aW9uc0JldHdlZW4oQ0JDX1Jlc3VsdFBvaW50ICpmcm9tLCBDQkNfUmVzdWx0UG9pbnQgKnRvKQ0KK3sNCisgICAgRlhfSU5UMzIgZnJvbVggPSAoRlhfSU5UMzIpIGZyb20tPkdldFgoKTsNCisgICAgRlhfSU5UMzIgZnJvbVkgPSAoRlhfSU5UMzIpIGZyb20tPkdldFkoKTsNCisgICAgRlhfSU5UMzIgdG9YID0gKEZYX0lOVDMyKSB0by0+R2V0WCgpOw0KKyAgICBGWF9JTlQzMiB0b1kgPSAoRlhfSU5UMzIpIHRvLT5HZXRZKCk7DQorICAgIEZYX0JPT0wgc3RlZXAgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpID4gRlhTWVNfYWJzKHRvWCAtIGZyb21YKTsNCisgICAgaWYgKHN0ZWVwKSB7DQorICAgICAgICBGWF9JTlQzMiB0ZW1wID0gZnJvbVg7DQorICAgICAgICBmcm9tWCA9IGZyb21ZOw0KKyAgICAgICAgZnJvbVkgPSB0ZW1wOw0KKyAgICAgICAgdGVtcCA9IHRvWDsNCisgICAgICAgIHRvWCA9IHRvWTsNCisgICAgICAgIHRvWSA9IHRlbXA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZHggPSBGWFNZU19hYnModG9YIC0gZnJvbVgpOw0KKyAgICBGWF9JTlQzMiBkeSA9IEZYU1lTX2Ficyh0b1kgLSBmcm9tWSk7DQorICAgIEZYX0lOVDMyIGVycm9yID0gLWR4ID4+IDE7DQorICAgIEZYX0lOVDMyIHlzdGVwID0gZnJvbVkgPCB0b1kgPyAxIDogLTE7DQorICAgIEZYX0lOVDMyIHhzdGVwID0gZnJvbVggPCB0b1ggPyAxIDogLTE7DQorICAgIEZYX0lOVDMyIHRyYW5zaXRpb25zID0gMDsNCisgICAgRlhfQk9PTCBpbkJsYWNrID0gbV9pbWFnZS0+R2V0KHN0ZWVwID8gZnJvbVkgOiBmcm9tWCwgc3RlZXAgPyBmcm9tWCA6IGZyb21ZKTsNCisgICAgZm9yIChGWF9JTlQzMiB4ID0gZnJvbVgsIHkgPSBmcm9tWTsgeCAhPSB0b1g7IHggKz0geHN0ZXApIHsNCisgICAgICAgIEZYX0JPT0wgaXNCbGFjayA9IG1faW1hZ2UtPkdldChzdGVlcCA/IHkgOiB4LCBzdGVlcCA/IHggOiB5KTsNCisgICAgICAgIGlmIChpc0JsYWNrICE9IGluQmxhY2spIHsNCisgICAgICAgICAgICB0cmFuc2l0aW9ucysrOw0KKyAgICAgICAgICAgIGluQmxhY2sgPSBpc0JsYWNrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZXJyb3IgKz0gZHk7DQorICAgICAgICBpZiAoZXJyb3IgPiAwKSB7DQorICAgICAgICAgICAgaWYgKHkgPT0gdG9ZKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB5ICs9IHlzdGVwOw0KKyAgICAgICAgICAgIGVycm9yIC09IGR4Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKGZyb20sIHRvLCB0cmFuc2l0aW9ucyk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6T3JkZXJCZXN0UGF0dGVybnMoQ0ZYX1B0ckFycmF5ICpwYXR0ZXJucykNCit7DQorICAgIEZYX0ZMT0FUIGFiRGlzdGFuY2UgPSAoRlhfRkxPQVQpRGlzdGFuY2UoKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF0sIChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdKTsNCisgICAgRlhfRkxPQVQgYmNEaXN0YW5jZSA9IChGWF9GTE9BVClEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSwgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KKyAgICBGWF9GTE9BVCBhY0Rpc3RhbmNlID0gKEZYX0ZMT0FUKURpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdLCAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXSk7DQorICAgIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgKnRvcFJpZ2h0LCAqYm90dG9tTGVmdDsNCisgICAgaWYgKGJjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSAmJiBiY0Rpc3RhbmNlID49IGFjRGlzdGFuY2UpIHsNCisgICAgICAgIHRvcExlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXTsNCisgICAgICAgIHRvcFJpZ2h0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV07DQorICAgICAgICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl07DQorICAgIH0gZWxzZSBpZiAoYWNEaXN0YW5jZSA+PSBiY0Rpc3RhbmNlICYmIGFjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSkgew0KKyAgICAgICAgdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdOw0KKyAgICAgICAgdG9wUmlnaHQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXTsNCisgICAgICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHRvcExlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXTsNCisgICAgICAgIHRvcFJpZ2h0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF07DQorICAgICAgICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV07DQorICAgIH0NCisgICAgaWYgKChib3R0b21MZWZ0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpICogKHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkpIDwgKGJvdHRvbUxlZnQtPkdldFgoKQ0KKyAgICAgICAgICAgIC0gdG9wTGVmdC0+R2V0WCgpKSAqICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSkgew0KKyAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICp0ZW1wID0gdG9wUmlnaHQ7DQorICAgICAgICB0b3BSaWdodCA9IGJvdHRvbUxlZnQ7DQorICAgICAgICBib3R0b21MZWZ0ID0gdGVtcDsNCisgICAgfQ0KKyAgICAoKnBhdHRlcm5zKVswXSA9IGJvdHRvbUxlZnQ7DQorICAgICgqcGF0dGVybnMpWzFdID0gdG9wTGVmdDsNCisgICAgKCpwYXR0ZXJucylbMl0gPSB0b3BSaWdodDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDNhZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeFJlYWRlci5jcHAKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhEZWNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeERldGVjdG9yLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4UmVhZGVyLmgiDQorQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkNCQ19EYXRhTWF0cml4UmVhZGVyKCkNCit7DQorICAgIG1fZGVjb2RlciA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkluaXQoKQ0KK3sNCisgICAgbV9kZWNvZGVyID0gRlhfTkVXIENCQ19EYXRhTWF0cml4RGVjb2RlcjsNCisgICAgbV9kZWNvZGVyLT5Jbml0KCk7DQorfQ0KK0NCQ19EYXRhTWF0cml4UmVhZGVyOjp+Q0JDX0RhdGFNYXRyaXhSZWFkZXIoKQ0KK3sNCisgICAgaWYobV9kZWNvZGVyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX2RlY29kZXI7DQorICAgIH0NCisgICAgbV9kZWNvZGVyID0gTlVMTDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqY2RyID0gaW1hZ2UtPkdldEJsYWNrTWF0cml4KGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBDQkNfRGF0YU1hdHJpeERldGVjdG9yIGRldGVjdG9yKGNkcik7DQorICAgIGRldGVjdG9yLkluaXQoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIENCQ19RUkRldGVjdG9yUmVzdWx0KiBkZHIgPSBkZXRlY3Rvci5EZXRlY3QoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIENCQ19BdXRvUHRyPENCQ19RUkRldGVjdG9yUmVzdWx0PiBkZXRlY3RvclJlc3VsdChkZHIpOw0KKyAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogUmVzdWx0VGVtcCA9IG1fZGVjb2Rlci0+RGVjb2RlKGRldGVjdG9yUmVzdWx0LT5HZXRCaXRzKCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uRGVjb2RlclJlc3VsdD4gZGVjb2RlUmVzdWx0KFJlc3VsdFRlbXApOw0KKyAgICByZXR1cm4gZGVjb2RlUmVzdWx0LT5HZXRUZXh0KCk7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19EYXRhTWF0cml4UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gYnM7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTIyOTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfU3ltYm9sU2hhcGVIaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiDQorQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKSA6IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxNTU4LCA2MjAsIDIyLCAyMiwgMzYpDQorew0KKyAgICBtX3JzQmxvY2tEYXRhID0gLTE7DQorICAgIG1fcnNCbG9ja0Vycm9yID0gNjI7DQorfQ0KK0NCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NDo6fkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpDQorew0KK30NCitGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQ6OmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpDQorew0KKyAgICByZXR1cm4gMTA7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NGdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKEZYX0lOVDMyIGluZGV4KQ0KK3sNCisgICAgcmV0dXJuIChpbmRleCA8PSA4KSA/IDE1NiA6IDE1NTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhWZXJzaW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4VmVyc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5ODYxYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4VmVyc2lvbi5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4VmVyc2lvbi5oIg0KK0NGWF9QdHJBcnJheSogQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpWRVJTSU9OUyA9IE5VTEw7DQordm9pZCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkluaXRpYWxpemUoKQ0KK3sNCisgICAgVkVSU0lPTlMgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpGaW5hbGl6ZSgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgVkVSU0lPTlMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBkZWxldGUgKCAoQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKikoVkVSU0lPTlMtPkdldEF0KGkpKSApOw0KKyAgICB9DQorICAgIFZFUlNJT05TLT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIFZFUlNJT05TOw0KK30NCitDQkNfRGF0YU1hdHJpeFZlcnNpb246OkNCQ19EYXRhTWF0cml4VmVyc2lvbihGWF9JTlQzMiB2ZXJzaW9uTnVtYmVyLA0KKyAgICAgICAgRlhfSU5UMzIgc3ltYm9sU2l6ZVJvd3MsDQorICAgICAgICBGWF9JTlQzMiBzeW1ib2xTaXplQ29sdW1ucywNCisgICAgICAgIEZYX0lOVDMyIGRhdGFSZWdpb25TaXplUm93cywNCisgICAgICAgIEZYX0lOVDMyIGRhdGFSZWdpb25TaXplQ29sdW1ucywNCisgICAgICAgIEVDQmxvY2tzICplY0Jsb2NrcykNCit7DQorICAgIG1fdmVyc2lvbk51bWJlciA9IHZlcnNpb25OdW1iZXI7DQorICAgIG1fc3ltYm9sU2l6ZVJvd3MgPSBzeW1ib2xTaXplUm93czsNCisgICAgbV9zeW1ib2xTaXplQ29sdW1ucyA9IHN5bWJvbFNpemVDb2x1bW5zOw0KKyAgICBtX2RhdGFSZWdpb25TaXplUm93cyA9IGRhdGFSZWdpb25TaXplUm93czsNCisgICAgbV9kYXRhUmVnaW9uU2l6ZUNvbHVtbnMgPSBkYXRhUmVnaW9uU2l6ZUNvbHVtbnM7DQorICAgIG1fZWNCbG9ja3MgPSBlY0Jsb2NrczsNCisgICAgRlhfSU5UMzIgdG90YWwgPSAwOw0KKyAgICBGWF9JTlQzMiBlY0NvZGV3b3JkcyA9IGVjQmxvY2tzLT5HZXRFQ0NvZGV3b3JkcygpOw0KKyAgICBjb25zdCBDRlhfUHRyQXJyYXkgJmVjYkFycmF5ID0gZWNCbG9ja3MtPkdldEVDQmxvY2tzKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBlY2JBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgdG90YWwgKz0gKChFQ0IqKWVjYkFycmF5W2ldKS0+R2V0Q291bnQoKSAqICgoKEVDQiopZWNiQXJyYXlbaV0pLT5HZXREYXRhQ29kZXdvcmRzKCkgKyBlY0NvZGV3b3Jkcyk7DQorICAgIH0NCisgICAgbV90b3RhbENvZGV3b3JkcyA9IHRvdGFsOw0KK30NCitDQkNfRGF0YU1hdHJpeFZlcnNpb246On5DQkNfRGF0YU1hdHJpeFZlcnNpb24oKQ0KK3sNCisgICAgaWYobV9lY0Jsb2NrcyAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9lY0Jsb2NrczsNCisgICAgfQ0KKyAgICBtX2VjQmxvY2tzID0gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRWZXJzaW9uTnVtYmVyKCkNCit7DQorICAgIHJldHVybiBtX3ZlcnNpb25OdW1iZXI7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0U3ltYm9sU2l6ZVJvd3MoKQ0KK3sNCisgICAgcmV0dXJuIG1fc3ltYm9sU2l6ZVJvd3M7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0U3ltYm9sU2l6ZUNvbHVtbnMoKQ0KK3sNCisgICAgcmV0dXJuIG1fc3ltYm9sU2l6ZUNvbHVtbnM7DQorfQ0KK0ZYX0lOVDMyIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0RGF0YVJlZ2lvblNpemVSb3dzKCkNCit7DQorICAgIHJldHVybiBtX2RhdGFSZWdpb25TaXplUm93czsNCit9DQorRlhfSU5UMzIgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXREYXRhUmVnaW9uU2l6ZUNvbHVtbnMoKQ0KK3sNCisgICAgcmV0dXJuIG1fZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KK30NCitGWF9JTlQzMiBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFRvdGFsQ29kZXdvcmRzKCkNCit7DQorICAgIHJldHVybiBtX3RvdGFsQ29kZXdvcmRzOw0KK30NCitFQ0Jsb2NrcyAqQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRFQ0Jsb2NrcygpDQorew0KKyAgICByZXR1cm4gbV9lY0Jsb2NrczsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OlJlbGVhc2VBbGwoKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IFZFUlNJT05TLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeFZlcnNpb24qKVZFUlNJT05TLT5HZXRBdChpKTsNCisgICAgfQ0KKyAgICBWRVJTSU9OUy0+UmVtb3ZlQWxsKCk7DQorfQ0KK0NCQ19EYXRhTWF0cml4VmVyc2lvbiAqQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRWZXJzaW9uRm9yRGltZW5zaW9ucyhGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmICgobnVtUm93cyAmIDB4MDEpICE9IDAgfHwgKG51bUNvbHVtbnMgJiAweDAxKSAhPSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmKFZFUlNJT05TLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDEsIDEwLCAxMCwgOCwgOCwgRlhfTkVXIEVDQmxvY2tzKDUsIEZYX05FVyBFQ0IoMSwgMykpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMiwgMTIsIDEyLCAxMCwgMTAsIEZYX05FVyBFQ0Jsb2Nrcyg3LCBGWF9ORVcgRUNCKDEsIDUpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDMsIDE0LCAxNCwgMTIsIDEyLCBGWF9ORVcgRUNCbG9ja3MoMTAsIEZYX05FVyBFQ0IoMSwgOCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNCwgMTYsIDE2LCAxNCwgMTQsIEZYX05FVyBFQ0Jsb2NrcygxMiwgRlhfTkVXIEVDQigxLCAxMikpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNSwgMTgsIDE4LCAxNiwgMTYsIEZYX05FVyBFQ0Jsb2NrcygxNCwgRlhfTkVXIEVDQigxLCAxOCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNiwgMjAsIDIwLCAxOCwgMTgsIEZYX05FVyBFQ0Jsb2NrcygxOCwgRlhfTkVXIEVDQigxLCAyMikpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNywgMjIsIDIyLCAyMCwgMjAsIEZYX05FVyBFQ0Jsb2NrcygyMCwgRlhfTkVXIEVDQigxLCAzMCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oOCwgMjQsIDI0LCAyMiwgMjIsIEZYX05FVyBFQ0Jsb2NrcygyNCwgRlhfTkVXIEVDQigxLCAzNikpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oOSwgMjYsIDI2LCAyNCwgMjQsIEZYX05FVyBFQ0Jsb2NrcygyOCwgRlhfTkVXIEVDQigxLCA0NCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTAsIDMyLCAzMiwgMTQsIDE0LCBGWF9ORVcgRUNCbG9ja3MoMzYsIEZYX05FVyBFQ0IoMSwgNjIpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDExLCAzNiwgMzYsIDE2LCAxNiwgRlhfTkVXIEVDQmxvY2tzKDQyLCBGWF9ORVcgRUNCKDEsIDg2KSkpKTsNCisgICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigxMiwgNDAsIDQwLCAxOCwgMTgsIEZYX05FVyBFQ0Jsb2Nrcyg0OCwgRlhfTkVXIEVDQigxLCAxMTQpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDEzLCA0NCwgNDQsIDIwLCAyMCwgRlhfTkVXIEVDQmxvY2tzKDU2LCBGWF9ORVcgRUNCKDEsIDE0NCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTQsIDQ4LCA0OCwgMjIsIDIyLCBGWF9ORVcgRUNCbG9ja3MoNjgsIEZYX05FVyBFQ0IoMSwgMTc0KSkpKTsNCisgICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigxNSwgNTIsIDUyLCAyNCwgMjQsIEZYX05FVyBFQ0Jsb2Nrcyg0MiwgRlhfTkVXIEVDQigyLCAxMDIpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDE2LCA2NCwgNjQsIDE0LCAxNCwgRlhfTkVXIEVDQmxvY2tzKDU2LCBGWF9ORVcgRUNCKDIsIDE0MCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTcsIDcyLCA3MiwgMTYsIDE2LCBGWF9ORVcgRUNCbG9ja3MoMzYsIEZYX05FVyBFQ0IoNCwgOTIpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDE4LCA4MCwgODAsIDE4LCAxOCwgRlhfTkVXIEVDQmxvY2tzKDQ4LCBGWF9ORVcgRUNCKDQsIDExNCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTksIDg4LCA4OCwgMjAsIDIwLCBGWF9ORVcgRUNCbG9ja3MoNTYsIEZYX05FVyBFQ0IoNCwgMTQ0KSkpKTsNCisgICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigyMCwgOTYsIDk2LCAyMiwgMjIsIEZYX05FVyBFQ0Jsb2Nrcyg2OCwgRlhfTkVXIEVDQig0LCAxNzQpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDIxLCAxMDQsIDEwNCwgMjQsIDI0LCBGWF9ORVcgRUNCbG9ja3MoNTYsIEZYX05FVyBFQ0IoNiwgMTM2KSkpKTsNCisgICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigyMiwgMTIwLCAxMjAsIDE4LCAxOCwgRlhfTkVXIEVDQmxvY2tzKDY4LCBGWF9ORVcgRUNCKDYsIDE3NSkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjMsIDEzMiwgMTMyLCAyMCwgMjAsIEZYX05FVyBFQ0Jsb2Nrcyg2MiwgRlhfTkVXIEVDQig4LCAxNjMpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDI0LCAxNDQsIDE0NCwgMjIsIDIyLCBGWF9ORVcgRUNCbG9ja3MoNjIsIEZYX05FVyBFQ0IoOCwgMTU2KSwgRlhfTkVXIEVDQigyLCAxNTUpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDI1LCA4LCAxOCwgNiwgMTYsIEZYX05FVyBFQ0Jsb2Nrcyg3LCBGWF9ORVcgRUNCKDEsIDUpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDI2LCA4LCAzMiwgNiwgMTQsIEZYX05FVyBFQ0Jsb2NrcygxMSwgRlhfTkVXIEVDQigxLCAxMCkpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjcsIDEyLCAyNiwgMTAsIDI0LCBGWF9ORVcgRUNCbG9ja3MoMTQsIEZYX05FVyBFQ0IoMSwgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDI4LCAxMiwgMzYsIDEwLCAxNiwgRlhfTkVXIEVDQmxvY2tzKDE4LCBGWF9ORVcgRUNCKDEsIDIyKSkpKTsNCisgICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigyOSwgMTYsIDM2LCAxNCwgMTYsIEZYX05FVyBFQ0Jsb2NrcygyNCwgRlhfTkVXIEVDQigxLCAzMikpKSk7DQorICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMzAsIDE2LCA0OCwgMTQsIDIyLCBGWF9ORVcgRUNCbG9ja3MoMjgsIEZYX05FVyBFQ0IoMSwgNDkpKSkpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bVZlcnNpb25zID0gVkVSU0lPTlMtPkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG51bVZlcnNpb25zOyArK2kpIHsNCisgICAgICAgIGlmICgoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCgqVkVSU0lPTlMpW2ldKSktPm1fc3ltYm9sU2l6ZVJvd3MgPT0gbnVtUm93cyAmJiAoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCgqVkVSU0lPTlMpW2ldKSktPm1fc3ltYm9sU2l6ZUNvbHVtbnMgPT0gbnVtQ29sdW1ucykgew0KKyAgICAgICAgICAgIHJldHVybiAoQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKikoKlZFUlNJT05TKVtpXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEyMjAzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfVHdvRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RlZmF1bHRQbGFjZW1lbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FcnJvckNvcnJlY3Rpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyQ29udGV4dC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0M0MEVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19UZXh0RW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1gxMkVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FZGlmYWN0RW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0Jhc2UyNTZFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQVNDSUlFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4V3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCINCitDQkNfRGF0YU1hdHJpeFdyaXRlcjo6Q0JDX0RhdGFNYXRyaXhXcml0ZXIoKQ0KK3sNCit9DQorQ0JDX0RhdGFNYXRyaXhXcml0ZXI6On5DQkNfRGF0YU1hdHJpeFdyaXRlcigpDQorew0KK30NCitGWF9CT09MIENCQ19EYXRhTWF0cml4V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoRlhfSU5UMzIgbGV2ZWwpDQorew0KKyAgICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JZVEUqIENCQ19EYXRhTWF0cml4V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmNvbnRlbnRzLCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKG91dFdpZHRoIDwgMCB8fCBvdXRIZWlnaHQgPCAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENCQ19TeW1ib2xTaGFwZUhpbnQ6OlN5bWJvbFNoYXBlSGludCBzaGFwZSA9IENCQ19TeW1ib2xTaGFwZUhpbnQ6OkZPUkNFX1NRVUFSRTsNCisgICAgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSA9IE5VTEw7DQorICAgIENCQ19EaW1lbnNpb24qIG1heFNpemUgPSBOVUxMOw0KKyAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsOw0KKyAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChjb250ZW50cywgZWNMZXZlbCwgc2hhcGUsIG1pblNpemUsIG1heFNpemUsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIE5VTEwpOw0KKyAgICBDQkNfU3ltYm9sSW5mbyogc3ltYm9sSW5mbyA9IENCQ19TeW1ib2xJbmZvOjpsb29rdXAoZW5jb2RlZC5HZXRMZW5ndGgoKSwgc2hhcGUsIG1pblNpemUsIG1heFNpemUsIFRSVUUsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIE5VTEwpOw0KKyAgICBDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMgPSBDQkNfRXJyb3JDb3JyZWN0aW9uOjplbmNvZGVFQ0MyMDAoZW5jb2RlZCwgc3ltYm9sSW5mbywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgTlVMTCk7DQorICAgIENCQ19EZWZhdWx0UGxhY2VtZW50KiBwbGFjZW1lbnQgPSBGWF9ORVcgQ0JDX0RlZmF1bHRQbGFjZW1lbnQoY29kZXdvcmRzLCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhV2lkdGgoZSksIHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFIZWlnaHQoZSkpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIE5VTEwpOw0KKyAgICBwbGFjZW1lbnQtPnBsYWNlKCk7DQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBieXRlbWF0cml4ID0gZW5jb2RlTG93TGV2ZWwocGxhY2VtZW50LCBzeW1ib2xJbmZvLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCisgICAgb3V0V2lkdGggPSBieXRlbWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgICBvdXRIZWlnaHQgPSBieXRlbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgICAgRlhfQllURSogcmVzdWx0ID0gRlhfQWxsb2MoRlhfQllURSwgb3V0V2lkdGggKiBvdXRIZWlnaHQpOw0KKyAgICBGWFNZU19tZW1jcHkzMihyZXN1bHQsIGJ5dGVtYXRyaXgtPkdldEFycmF5KCksIG91dFdpZHRoICogb3V0SGVpZ2h0KTsNCisgICAgZGVsZXRlIGJ5dGVtYXRyaXg7DQorICAgIGRlbGV0ZSBwbGFjZW1lbnQ7DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0JZVEUgKkNCQ19EYXRhTWF0cml4V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfQllURSAqQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIENCQ19EYXRhTWF0cml4V3JpdGVyOjplbmNvZGVMb3dMZXZlbChDQkNfRGVmYXVsdFBsYWNlbWVudCogcGxhY2VtZW50LCBDQkNfU3ltYm9sSW5mbyogc3ltYm9sSW5mbywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBzeW1ib2xXaWR0aCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFXaWR0aChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCisgICAgRlhfSU5UMzIgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YUhlaWdodChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCA9IEZYX05FVyBDQkNfQ29tbW9uQnl0ZU1hdHJpeChzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKSwgc3ltYm9sSW5mby0+Z2V0U3ltYm9sSGVpZ2h0KGUpKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCisgICAgbWF0cml4LT5Jbml0KCk7DQorICAgIEZYX0lOVDMyIG1hdHJpeFkgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIHkgPSAwOyB5IDwgc3ltYm9sSGVpZ2h0OyB5KyspIHsNCisgICAgICAgIEZYX0lOVDMyIG1hdHJpeFg7DQorICAgICAgICBpZiAoKHkgJSBzeW1ib2xJbmZvLT5tX21hdHJpeEhlaWdodCkgPT0gMCkgew0KKyAgICAgICAgICAgIG1hdHJpeFggPSAwOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgeCA9IDA7IHggPCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKTsgeCsrKSB7DQorICAgICAgICAgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksICh4ICUgMikgPT0gMCk7DQorICAgICAgICAgICAgICAgIG1hdHJpeFgrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWF0cml4WSsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbWF0cml4WCA9IDA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgc3ltYm9sV2lkdGg7IHgrKykgew0KKyAgICAgICAgICAgIGlmICgoeCAlIHN5bWJvbEluZm8tPm1fbWF0cml4V2lkdGgpID09IDApIHsNCisgICAgICAgICAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgVFJVRSk7DQorICAgICAgICAgICAgICAgIG1hdHJpeFgrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgcGxhY2VtZW50LT5nZXRCaXQoeCwgeSkpOw0KKyAgICAgICAgICAgIG1hdHJpeFgrKzsNCisgICAgICAgICAgICBpZiAoKHggJSBzeW1ib2xJbmZvLT5tX21hdHJpeFdpZHRoKSA9PSBzeW1ib2xJbmZvLT5tX21hdHJpeFdpZHRoIC0gMSkgew0KKyAgICAgICAgICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCAoeSAlIDIpID09IDApOw0KKyAgICAgICAgICAgICAgICBtYXRyaXhYKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbWF0cml4WSsrOw0KKyAgICAgICAgaWYgKCh5ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQpID09IHN5bWJvbEluZm8tPm1fbWF0cml4SGVpZ2h0IC0gMSkgew0KKyAgICAgICAgICAgIG1hdHJpeFggPSAwOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgeCA9IDA7IHggPCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKTsgeCsrKSB7DQorICAgICAgICAgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksIFRSVUUpOw0KKyAgICAgICAgICAgICAgICBtYXRyaXhYKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1hdHJpeFkrKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbWF0cml4Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGVmYXVsdFBsYWNlbWVudC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRGVmYXVsdFBsYWNlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0M2YwOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcApAQCAtMCwwICsxLDE1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EZWZhdWx0UGxhY2VtZW50LmgiDQorQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OkNCQ19EZWZhdWx0UGxhY2VtZW50KENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywgRlhfSU5UMzIgbnVtY29scywgRlhfSU5UMzIgbnVtcm93cykNCit7DQorICAgIG1fY29kZXdvcmRzID0gY29kZXdvcmRzOw0KKyAgICBtX251bWNvbHMgPSBudW1jb2xzOw0KKyAgICBtX251bXJvd3MgPSBudW1yb3dzOw0KKyAgICBtX2JpdHMuU2V0U2l6ZShudW1jb2xzICogbnVtcm93cyk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1jb2xzICogbnVtcm93czsgaSsrKSB7DQorICAgICAgICBtX2JpdHNbaV0gPSAoRlhfQllURSkgMjsNCisgICAgfQ0KK30NCitDQkNfRGVmYXVsdFBsYWNlbWVudDo6fkNCQ19EZWZhdWx0UGxhY2VtZW50KCkNCit7DQorICAgIG1fYml0cy5SZW1vdmVBbGwoKTsNCit9DQorRlhfSU5UMzIgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldE51bXJvd3MoKQ0KK3sNCisgICAgcmV0dXJuIG1fbnVtcm93czsNCit9DQorRlhfSU5UMzIgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldE51bWNvbHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fbnVtY29sczsNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldEJpdHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fYml0czsNCit9DQorRlhfQk9PTCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0Qml0KEZYX0lOVDMyIGNvbCwgRlhfSU5UMzIgcm93KQ0KK3sNCisgICAgcmV0dXJuIG1fYml0c1tyb3cgKiBtX251bWNvbHMgKyBjb2xdID09IDE7DQorfQ0KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OnNldEJpdChGWF9JTlQzMiBjb2wsIEZYX0lOVDMyIHJvdywgRlhfQk9PTCBiaXQpDQorew0KKyAgICBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSA9IGJpdCA/IChGWF9CWVRFKSAxIDogKEZYX0JZVEUpIDA7DQorfQ0KK0ZYX0JPT0wgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6Omhhc0JpdChGWF9JTlQzMiBjb2wsIEZYX0lOVDMyIHJvdykNCit7DQorICAgIHJldHVybiBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSAhPSAyOw0KK30NCit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50OjpwbGFjZSgpDQorew0KKyAgICBGWF9JTlQzMiBwb3MgPSAwOw0KKyAgICBGWF9JTlQzMiByb3cgPSA0Ow0KKyAgICBGWF9JTlQzMiBjb2wgPSAwOw0KKyAgICBkbyB7DQorICAgICAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MpICYmIChjb2wgPT0gMCkpIHsNCisgICAgICAgICAgICBjb3JuZXIxKHBvcysrKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgocm93ID09IG1fbnVtcm93cyAtIDIpICYmIChjb2wgPT0gMCkgJiYgKChtX251bWNvbHMgJSA0KSAhPSAwKSkgew0KKyAgICAgICAgICAgIGNvcm5lcjIocG9zKyspOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzIC0gMikgJiYgKGNvbCA9PSAwKSAmJiAobV9udW1jb2xzICUgOCA9PSA0KSkgew0KKyAgICAgICAgICAgIGNvcm5lcjMocG9zKyspOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzICsgNCkgJiYgKGNvbCA9PSAyKSAmJiAoKG1fbnVtY29scyAlIDgpID09IDApKSB7DQorICAgICAgICAgICAgY29ybmVyNChwb3MrKyk7DQorICAgICAgICB9DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgaWYgKChyb3cgPCBtX251bXJvd3MpICYmIChjb2wgPj0gMCkgJiYgIWhhc0JpdChjb2wsIHJvdykpIHsNCisgICAgICAgICAgICAgICAgdXRhaChyb3csIGNvbCwgcG9zKyspOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByb3cgLT0gMjsNCisgICAgICAgICAgICBjb2wgKz0gMjsNCisgICAgICAgIH0gd2hpbGUgKHJvdyA+PSAwICYmIChjb2wgPCBtX251bWNvbHMpKTsNCisgICAgICAgIHJvdysrOw0KKyAgICAgICAgY29sICs9IDM7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgaWYgKChyb3cgPj0gMCkgJiYgKGNvbCA8IG1fbnVtY29scykgJiYgIWhhc0JpdChjb2wsIHJvdykpIHsNCisgICAgICAgICAgICAgICAgdXRhaChyb3csIGNvbCwgcG9zKyspOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByb3cgKz0gMjsNCisgICAgICAgICAgICBjb2wgLT0gMjsNCisgICAgICAgIH0gd2hpbGUgKChyb3cgPCBtX251bXJvd3MpICYmIChjb2wgPj0gMCkpOw0KKyAgICAgICAgcm93ICs9IDM7DQorICAgICAgICBjb2wrKzsNCisgICAgfSB3aGlsZSAoKHJvdyA8IG1fbnVtcm93cykgfHwgKGNvbCA8IG1fbnVtY29scykpOw0KKyAgICBpZiAoIWhhc0JpdChtX251bWNvbHMgLSAxLCBtX251bXJvd3MgLSAxKSkgew0KKyAgICAgICAgc2V0Qml0KG1fbnVtY29scyAtIDEsIG1fbnVtcm93cyAtIDEsIFRSVUUpOw0KKyAgICAgICAgc2V0Qml0KG1fbnVtY29scyAtIDIsIG1fbnVtcm93cyAtIDIsIFRSVUUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6Om1vZHVsZShGWF9JTlQzMiByb3csIEZYX0lOVDMyIGNvbCwgRlhfSU5UMzIgcG9zLCBGWF9JTlQzMiBiaXQpDQorew0KKyAgICBpZiAocm93IDwgMCkgew0KKyAgICAgICAgcm93ICs9IG1fbnVtcm93czsNCisgICAgICAgIGNvbCArPSA0IC0gKChtX251bXJvd3MgKyA0KSAlIDgpOw0KKyAgICB9DQorICAgIGlmIChjb2wgPCAwKSB7DQorICAgICAgICBjb2wgKz0gbV9udW1jb2xzOw0KKyAgICAgICAgcm93ICs9IDQgLSAoKG1fbnVtY29scyArIDQpICUgOCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgdiA9IG1fY29kZXdvcmRzLkdldEF0KHBvcyk7DQorICAgIHYgJj0gMSA8PCAoOCAtIGJpdCk7DQorICAgIHNldEJpdChjb2wsIHJvdywgdiAhPSAwKTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6dXRhaChGWF9JTlQzMiByb3csIEZYX0lOVDMyIGNvbCwgRlhfSU5UMzIgcG9zKQ0KK3sNCisgICAgbW9kdWxlKHJvdyAtIDIsIGNvbCAtIDIsIHBvcywgMSk7DQorICAgIG1vZHVsZShyb3cgLSAyLCBjb2wgLSAxLCBwb3MsIDIpOw0KKyAgICBtb2R1bGUocm93IC0gMSwgY29sIC0gMiwgcG9zLCAzKTsNCisgICAgbW9kdWxlKHJvdyAtIDEsIGNvbCAtIDEsIHBvcywgNCk7DQorICAgIG1vZHVsZShyb3cgLSAxLCBjb2wsIHBvcywgNSk7DQorICAgIG1vZHVsZShyb3csIGNvbCAtIDIsIHBvcywgNik7DQorICAgIG1vZHVsZShyb3csIGNvbCAtIDEsIHBvcywgNyk7DQorICAgIG1vZHVsZShyb3csIGNvbCwgcG9zLCA4KTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMShGWF9JTlQzMiBwb3MpDQorew0KKyAgICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAxKTsNCisgICAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDEsIHBvcywgMik7DQorICAgIG1vZHVsZShtX251bXJvd3MgLSAxLCAyLCBwb3MsIDMpOw0KKyAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsNCisgICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNSk7DQorICAgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDYpOw0KKyAgICBtb2R1bGUoMiwgbV9udW1jb2xzIC0gMSwgcG9zLCA3KTsNCisgICAgbW9kdWxlKDMsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7DQorfQ0KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmNvcm5lcjIoRlhfSU5UMzIgcG9zKQ0KK3sNCisgICAgbW9kdWxlKG1fbnVtcm93cyAtIDMsIDAsIHBvcywgMSk7DQorICAgIG1vZHVsZShtX251bXJvd3MgLSAyLCAwLCBwb3MsIDIpOw0KKyAgICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAzKTsNCisgICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDQsIHBvcywgNCk7DQorICAgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAzLCBwb3MsIDUpOw0KKyAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA2KTsNCisgICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7DQorICAgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOw0KK30NCit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojpjb3JuZXIzKEZYX0lOVDMyIHBvcykNCit7DQorICAgIG1vZHVsZShtX251bXJvd3MgLSAzLCAwLCBwb3MsIDEpOw0KKyAgICBtb2R1bGUobV9udW1yb3dzIC0gMiwgMCwgcG9zLCAyKTsNCisgICAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMyk7DQorICAgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAyLCBwb3MsIDQpOw0KKyAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCisgICAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgNik7DQorICAgIG1vZHVsZSgyLCBtX251bWNvbHMgLSAxLCBwb3MsIDcpOw0KKyAgICBtb2R1bGUoMywgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyNChGWF9JTlQzMiBwb3MpDQorew0KKyAgICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAxKTsNCisgICAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIG1fbnVtY29scyAtIDEsIHBvcywgMik7DQorICAgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAzLCBwb3MsIDMpOw0KKyAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsNCisgICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNSk7DQorICAgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAzLCBwb3MsIDYpOw0KKyAgICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMiwgcG9zLCA3KTsNCisgICAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EaW1lbnNpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0RpbWVuc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YjNhYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19EaW1lbnNpb24uY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGltZW5zaW9uLmgiDQorQ0JDX0RpbWVuc2lvbjo6Q0JDX0RpbWVuc2lvbigpDQorew0KK30NCitDQkNfRGltZW5zaW9uOjpDQkNfRGltZW5zaW9uKEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxOw0KKyAgICB9DQorICAgIG1fd2lkdGggPSB3aWR0aDsNCisgICAgbV9oZWlnaHQgPSBoZWlnaHQ7DQorfQ0KK0NCQ19EaW1lbnNpb246On5DQkNfRGltZW5zaW9uKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19EaW1lbnNpb246OmdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX3dpZHRoOw0KK30NCitGWF9JTlQzMiBDQkNfRGltZW5zaW9uOjpnZXRIZWlnaHQoKQ0KK3sNCisgICAgcmV0dXJuIG1faGVpZ2h0Ow0KK30NCitGWF9JTlQzMiBDQkNfRGltZW5zaW9uOjpoYXNoQ29kZSgpDQorew0KKyAgICByZXR1cm4gbV93aWR0aCAqIDMyNzEzICsgbV9oZWlnaHQ7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19EaW1lbnNpb246OnRvU3RyaW5nKCkNCit7DQorICAgIHJldHVybiAoRlhfV0NIQVIpKG1fd2lkdGggKyAoRlhfV0NIQVIpJ3gnICsgbV9oZWlnaHQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRWRpZmFjdEVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0VkaWZhY3RFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRlNDg0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0VkaWZhY3RFbmNvZGVyLmNwcApAQCAtMCwwICsxLDEzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRWRpZmFjdEVuY29kZXIuaCINCitDQkNfRWRpZmFjdEVuY29kZXI6OkNCQ19FZGlmYWN0RW5jb2RlcigpDQorew0KK30NCitDQkNfRWRpZmFjdEVuY29kZXI6On5DQkNfRWRpZmFjdEVuY29kZXIoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX0VkaWZhY3RFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKQ0KK3sNCisgICAgcmV0dXJuIEVESUZBQ1RfRU5DT0RBVElPTjsNCit9DQordm9pZCBDQkNfRWRpZmFjdEVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KKyAgICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KKyAgICAgICAgZW5jb2RlQ2hhcihjLCBidWZmZXIsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgICAgIEZYX0lOVDMyIGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKGNvdW50ID49IDQpIHsNCisgICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmRzKGVuY29kZVRvQ29kZXdvcmRzKGJ1ZmZlciwgMCwgZSkpOw0KKyAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBidWZmZXIuRGVsZXRlKDAsIDQpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgICAgICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgYnVmZmVyICs9IChGWF9XQ0hBUikzMTsNCisgICAgaGFuZGxlRU9EKGNvbnRleHQsIGJ1ZmZlciwgZSk7DQorfQ0KK3ZvaWQgQ0JDX0VkaWZhY3RFbmNvZGVyOjpoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBDRlhfV2lkZVN0cmluZyBidWZmZXIsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChjb3VudCA9PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGNvdW50ID09IDEpIHsNCisgICAgICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKTsNCisgICAgICAgIEZYX0lOVDMyIHJlbWFpbmluZyA9IGNvbnRleHQuZ2V0UmVtYWluaW5nQ2hhcmFjdGVycygpOw0KKyAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwICYmIGF2YWlsYWJsZSA8PSAyKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChjb3VudCA+IDQpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZUNvdW50TXVzdE5vdEV4Y2VlZDQ7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgcmVzdENoYXJzID0gY291bnQgLSAxOw0KKyAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkID0gZW5jb2RlVG9Db2Rld29yZHMoYnVmZmVyLCAwLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgZW5kT2ZTeW1ib2xSZWFjaGVkID0gIWNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKTsNCisgICAgRlhfQk9PTCByZXN0SW5Bc2NpaSA9IGVuZE9mU3ltYm9sUmVhY2hlZCAmJiByZXN0Q2hhcnMgPD0gMjsNCisgICAgaWYgKHJlc3RDaGFycyA8PSAyKSB7DQorICAgICAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyByZXN0Q2hhcnMsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGF2YWlsYWJsZSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOw0KKyAgICAgICAgaWYgKGF2YWlsYWJsZSA+PSAzKSB7DQorICAgICAgICAgICAgcmVzdEluQXNjaWkgPSBGQUxTRTsNCisgICAgICAgICAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyBlbmNvZGVkLkdldExlbmd0aCgpLCBlKTsNCisgICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHJlc3RJbkFzY2lpKSB7DQorICAgICAgICBjb250ZXh0LnJlc2V0U3ltYm9sSW5mbygpOw0KKyAgICAgICAgY29udGV4dC5tX3BvcyAtPSByZXN0Q2hhcnM7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmRzKGVuY29kZWQpOw0KKyAgICB9DQorICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCit9DQordm9pZCBDQkNfRWRpZmFjdEVuY29kZXI6OmVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChjID49ICcgJyAmJiBjIDw9ICc/Jykgew0KKyAgICAgICAgc2IgKz0gYzsNCisgICAgfSBlbHNlIGlmIChjID49ICdAJyAmJiBjIDw9ICdeJykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNjQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlsbGVnYWxDaGFyYWN0ZXIoYywgZSk7DQorICAgIH0NCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VkaWZhY3RFbmNvZGVyOjplbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwgRlhfSU5UMzIgc3RhcnRQb3MsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbGVuID0gc2IuR2V0TGVuZ3RoKCkgLSBzdGFydFBvczsNCisgICAgaWYgKGxlbiA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICAgICAgcmV0dXJuIChGWF9MUFdTVFIpIiI7DQorICAgIH0NCisgICAgRlhfV0NIQVIgYzEgPSBzYi5HZXRBdChzdGFydFBvcyk7DQorICAgIEZYX1dDSEFSIGMyID0gbGVuID49IDIgPyBzYi5HZXRBdChzdGFydFBvcyArIDEpIDogMDsNCisgICAgRlhfV0NIQVIgYzMgPSBsZW4gPj0gMyA/IHNiLkdldEF0KHN0YXJ0UG9zICsgMikgOiAwOw0KKyAgICBGWF9XQ0hBUiBjNCA9IGxlbiA+PSA0ID8gc2IuR2V0QXQoc3RhcnRQb3MgKyAzKSA6IDA7DQorICAgIEZYX0lOVDMyIHYgPSAoYzEgPDwgMTgpICsgKGMyIDw8IDEyKSArIChjMyA8PCA2KSArIGM0Ow0KKyAgICBGWF9XQ0hBUiBjdzEgPSAoRlhfV0NIQVIpICgodiA+PiAxNikgJiAyNTUpOw0KKyAgICBGWF9XQ0hBUiBjdzIgPSAoRlhfV0NIQVIpICgodiA+PiA4KSAmIDI1NSk7DQorICAgIEZYX1dDSEFSIGN3MyA9IChGWF9XQ0hBUikgKHYgJiAyNTUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyByZXM7DQorICAgIHJlcyArPSBjdzE7DQorICAgIGlmIChsZW4gPj0gMikgew0KKyAgICAgICAgcmVzICs9IGN3MjsNCisgICAgfQ0KKyAgICBpZiAobGVuID49IDMpIHsNCisgICAgICAgIHJlcyArPSBjdzM7DQorICAgIH0NCisgICAgcmV0dXJuIHJlczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0VuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0VuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjIyNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCitDQkNfRW5jb2Rlcjo6Q0JDX0VuY29kZXIoKQ0KK3sNCit9DQorQ0JDX0VuY29kZXI6On5DQkNfRW5jb2RlcigpDQorew0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRW5jb2RlckNvbnRleHQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0VuY29kZXJDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWM3ZWJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0VuY29kZXJDb250ZXh0LmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KK0NCQ19FbmNvZGVyQ29udGV4dDo6Q0JDX0VuY29kZXJDb250ZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBkc3RzdHI7DQorICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChtc2csIGRzdHN0cik7DQorICAgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgICBGWF9JTlQzMiBjID0gZHN0c3RyLkdldExlbmd0aCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYzsgaSsrKSB7DQorICAgICAgICBGWF9XQ0hBUiBjaCA9ICAoRlhfV0NIQVIpKGRzdHN0ci5HZXRBdChpKSAmIDB4ZmYpOw0KKyAgICAgICAgaWYgKGNoID09ICc/JyAmJiBkc3RzdHIuR2V0QXQoaSkgIT0gJz8nKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2IgKz0gY2g7DQorICAgIH0NCisgICAgbV9tc2cgPSBzYjsNCisgICAgbV9zaGFwZSA9IEZPUkNFX05PTkU7DQorICAgIG1fbmV3RW5jb2RpbmcgPSAtMTsNCisgICAgbV9wb3MgPSAwOw0KKyAgICBtX3N5bWJvbEluZm8gPSBOVUxMOw0KKyAgICBtX3NraXBBdEVuZCA9IDA7DQorICAgIG1fbWF4U2l6ZSA9IE5VTEw7DQorICAgIG1fbWluU2l6ZSA9IE5VTEw7DQorfQ0KK0NCQ19FbmNvZGVyQ29udGV4dDo6fkNCQ19FbmNvZGVyQ29udGV4dCgpDQorew0KK30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U3ltYm9sU2hhcGUoU3ltYm9sU2hhcGVIaW50IHNoYXBlKQ0KK3sNCisgICAgbV9zaGFwZSA9IHNoYXBlOw0KK30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U2l6ZUNvbnN0cmFpbnRzKENCQ19EaW1lbnNpb24qIG1pblNpemUsIENCQ19EaW1lbnNpb24qIG1heFNpemUpDQorew0KKyAgICBtX21heFNpemUgPSBtYXhTaXplOw0KKyAgICBtX21pblNpemUgPSBtaW5TaXplOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRW5jb2RlckNvbnRleHQ6OmdldE1lc3NhZ2UoKQ0KK3sNCisgICAgcmV0dXJuIG1fbXNnOw0KK30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U2tpcEF0RW5kKEZYX0lOVDMyIGNvdW50KQ0KK3sNCisgICAgbV9za2lwQXRFbmQgPSBjb3VudDsNCit9DQorRlhfV0NIQVIgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDdXJyZW50Q2hhcigpDQorew0KKyAgICByZXR1cm4gbV9tc2cuR2V0QXQobV9wb3MpOw0KK30NCitGWF9XQ0hBUiBDQkNfRW5jb2RlckNvbnRleHQ6OmdldEN1cnJlbnQoKQ0KK3sNCisgICAgcmV0dXJuIG1fbXNnLkdldEF0KG1fcG9zKTsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OndyaXRlQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcykNCit7DQorICAgIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkczsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OndyaXRlQ29kZXdvcmQoRlhfV0NIQVIgY29kZXdvcmQpDQorew0KKyAgICBtX2NvZGV3b3JkcyArPSBjb2Rld29yZDsNCit9DQorRlhfSU5UMzIgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDb2Rld29yZENvdW50KCkNCit7DQorICAgIHJldHVybiBtX2NvZGV3b3Jkcy5HZXRMZW5ndGgoKTsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnNpZ25hbEVuY29kZXJDaGFuZ2UoRlhfSU5UMzIgZW5jb2RpbmcpDQorew0KKyAgICBtX25ld0VuY29kaW5nID0gZW5jb2Rpbmc7DQorfQ0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpyZXNldEVuY29kZXJTaWduYWwoKQ0KK3sNCisgICAgbV9uZXdFbmNvZGluZyA9IC0xOw0KK30NCitGWF9CT09MIENCQ19FbmNvZGVyQ29udGV4dDo6aGFzTW9yZUNoYXJhY3RlcnMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcG9zIDwgZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0UmVtYWluaW5nQ2hhcmFjdGVycygpDQorew0KKyAgICByZXR1cm4gZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkgLSBtX3BvczsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnVwZGF0ZVN5bWJvbEluZm8oRlhfSU5UMzIgJmUpDQorew0KKyAgICB1cGRhdGVTeW1ib2xJbmZvKGdldENvZGV3b3JkQ291bnQoKSwgZSk7DQorfQ0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp1cGRhdGVTeW1ib2xJbmZvKEZYX0lOVDMyIGxlbiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAobV9zeW1ib2xJbmZvID09IE5VTEwgfHwgbGVuID4gbV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSkgew0KKyAgICAgICAgbV9zeW1ib2xJbmZvID0gQ0JDX1N5bWJvbEluZm86Omxvb2t1cChsZW4sIG1fc2hhcGUsIG1fbWluU2l6ZSwgbV9tYXhTaXplLCB0cnVlLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpyZXNldFN5bWJvbEluZm8oKQ0KK3sNCisgICAgbV9zaGFwZSA9IEZPUkNFX05PTkU7DQorfQ0KK0ZYX0lOVDMyIENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkNCit7DQorICAgIHJldHVybiBtX21zZy5HZXRMZW5ndGgoKSAtIG1fc2tpcEF0RW5kOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19FcnJvckNvcnJlY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTczOGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRXJyb3JDb3JyZWN0aW9uLmgiDQorRlhfSU5UMzIgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6RkFDVE9SX1NFVFNbXSA9IHs1LCA3LCAxMCwgMTEsIDEyLCAxNCwgMTgsIDIwLCAyNCwgMjgsIDM2LCA0MiwgNDgsIDU2LCA2MiwgNjh9Ow0KK0ZYX0lOVDMyIENCQ19FcnJvckNvcnJlY3Rpb246OkZBQ1RPUlNbXVsxMDBdID0gew0KKyAgICB7MjI4LCA0OCwgMTUsIDExMSwgNjJ9LA0KKyAgICB7MjMsIDY4LCAxNDQsIDEzNCwgMjQwLCA5MiwgMjU0fSwNCisgICAgezI4LCAyNCwgMTg1LCAxNjYsIDIyMywgMjQ4LCAxMTYsIDI1NSwgMTEwLCA2MX0sDQorICAgIHsxNzUsIDEzOCwgMjA1LCAxMiwgMTk0LCAxNjgsIDM5LCAyNDUsIDYwLCA5NywgMTIwfSwNCisgICAgezQxLCAxNTMsIDE1OCwgOTEsIDYxLCA0MiwgMTQyLCAyMTMsIDk3LCAxNzgsIDEwMCwgMjQyfSwNCisgICAgezE1NiwgOTcsIDE5MiwgMjUyLCA5NSwgOSwgMTU3LCAxMTksIDEzOCwgNDUsIDE4LCAxODYsIDgzLCAxODV9LA0KKyAgICB7ODMsIDE5NSwgMTAwLCAzOSwgMTg4LCA3NSwgNjYsIDYxLCAyNDEsIDIxMywgMTA5LCAxMjksIDk0LCAyNTQsIDIyNSwgNDgsIDkwLCAxODh9LA0KKyAgICB7MTUsIDE5NSwgMjQ0LCA5LCAyMzMsIDcxLCAxNjgsIDIsIDE4OCwgMTYwLCAxNTMsIDE0NSwgMjUzLCA3OSwgMTA4LCA4MiwgMjcsIDE3NCwgMTg2LCAxNzJ9LA0KKyAgICB7DQorICAgICAgICA1MiwgMTkwLCA4OCwgMjA1LCAxMDksIDM5LCAxNzYsIDIxLCAxNTUsIDE5NywgMjUxLCAyMjMsIDE1NSwgMjEsIDUsIDE3MiwNCisgICAgICAgIDI1NCwgMTI0LCAxMiwgMTgxLCAxODQsIDk2LCA1MCwgMTkzDQorICAgIH0sDQorICAgIHsNCisgICAgICAgIDIxMSwgMjMxLCA0MywgOTcsIDcxLCA5NiwgMTAzLCAxNzQsIDM3LCAxNTEsIDE3MCwgNTMsIDc1LCAzNCwgMjQ5LCAxMjEsDQorICAgICAgICAxNywgMTM4LCAxMTAsIDIxMywgMTQxLCAxMzYsIDEyMCwgMTUxLCAyMzMsIDE2OCwgOTMsIDI1NQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAyNDUsIDEyNywgMjQyLCAyMTgsIDEzMCwgMjUwLCAxNjIsIDE4MSwgMTAyLCAxMjAsIDg0LCAxNzksIDIyMCwgMjUxLCA4MCwgMTgyLA0KKyAgICAgICAgMjI5LCAxOCwgMiwgNCwgNjgsIDMzLCAxMDEsIDEzNywgOTUsIDExOSwgMTE1LCA0NCwgMTc1LCAxODQsIDU5LCAyNSwNCisgICAgICAgIDIyNSwgOTgsIDgxLCAxMTINCisgICAgfSwNCisgICAgew0KKyAgICAgICAgNzcsIDE5MywgMTM3LCAzMSwgMTksIDM4LCAyMiwgMTUzLCAyNDcsIDEwNSwgMTIyLCAyLCAyNDUsIDEzMywgMjQyLCA4LA0KKyAgICAgICAgMTc1LCA5NSwgMTAwLCA5LCAxNjcsIDEwNSwgMjE0LCAxMTEsIDU3LCAxMjEsIDIxLCAxLCAyNTMsIDU3LCA1NCwgMTAxLA0KKyAgICAgICAgMjQ4LCAyMDIsIDY5LCA1MCwgMTUwLCAxNzcsIDIyNiwgNSwgOSwgNQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAyNDUsIDEzMiwgMTcyLCAyMjMsIDk2LCAzMiwgMTE3LCAyMiwgMjM4LCAxMzMsIDIzOCwgMjMxLCAyMDUsIDE4OCwgMjM3LCA4NywNCisgICAgICAgIDE5MSwgMTA2LCAxNiwgMTQ3LCAxMTgsIDIzLCAzNywgOTAsIDE3MCwgMjA1LCAxMzEsIDg4LCAxMjAsIDEwMCwgNjYsIDEzOCwNCisgICAgICAgIDE4NiwgMjQwLCA4MiwgNDQsIDE3NiwgODcsIDE4NywgMTQ3LCAxNjAsIDE3NSwgNjksIDIxMywgOTIsIDI1MywgMjI1LCAxOQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAxNzUsIDksIDIyMywgMjM4LCAxMiwgMTcsIDIyMCwgMjA4LCAxMDAsIDI5LCAxNzUsIDE3MCwgMjMwLCAxOTIsIDIxNSwgMjM1LA0KKyAgICAgICAgMTUwLCAxNTksIDM2LCAyMjMsIDM4LCAyMDAsIDEzMiwgNTQsIDIyOCwgMTQ2LCAyMTgsIDIzNCwgMTE3LCAyMDMsIDI5LCAyMzIsDQorICAgICAgICAxNDQsIDIzOCwgMjIsIDE1MCwgMjAxLCAxMTcsIDYyLCAyMDcsIDE2NCwgMTMsIDEzNywgMjQ1LCAxMjcsIDY3LCAyNDcsIDI4LA0KKyAgICAgICAgMTU1LCA0MywgMjAzLCAxMDcsIDIzMywgNTMsIDE0MywgNDYNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgMjQyLCA5MywgMTY5LCA1MCwgMTQ0LCAyMTAsIDM5LCAxMTgsIDIwMiwgMTg4LCAyMDEsIDE4OSwgMTQzLCAxMDgsIDE5NiwgMzcsDQorICAgICAgICAxODUsIDExMiwgMTM0LCAyMzAsIDI0NSwgNjMsIDE5NywgMTkwLCAyNTAsIDEwNiwgMTg1LCAyMjEsIDE3NSwgNjQsIDExNCwgNzEsDQorICAgICAgICAxNjEsIDQ0LCAxNDcsIDYsIDI3LCAyMTgsIDUxLCA2MywgODcsIDEwLCA0MCwgMTMwLCAxODgsIDE3LCAxNjMsIDMxLA0KKyAgICAgICAgMTc2LCAxNzAsIDQsIDEwNywgMjMyLCA3LCA5NCwgMTY2LCAyMjQsIDEyNCwgODYsIDQ3LCAxMSwgMjA0DQorICAgIH0sDQorICAgIHsNCisgICAgICAgIDIyMCwgMjI4LCAxNzMsIDg5LCAyNTEsIDE0OSwgMTU5LCA1NiwgODksIDMzLCAxNDcsIDI0NCwgMTU0LCAzNiwgNzMsIDEyNywNCisgICAgICAgIDIxMywgMTM2LCAyNDgsIDE4MCwgMjM0LCAxOTcsIDE1OCwgMTc3LCA2OCwgMTIyLCA5MywgMjEzLCAxNSwgMTYwLCAyMjcsIDIzNiwNCisgICAgICAgIDY2LCAxMzksIDE1MywgMTg1LCAyMDIsIDE2NywgMTc5LCAyNSwgMjIwLCAyMzIsIDk2LCAyMTAsIDIzMSwgMTM2LCAyMjMsIDIzOSwNCisgICAgICAgIDE4MSwgMjQxLCA1OSwgNTIsIDE3MiwgMjUsIDQ5LCAyMzIsIDIxMSwgMTg5LCA2NCwgNTQsIDEwOCwgMTUzLCAxMzIsIDYzLA0KKyAgICAgICAgOTYsIDEwMywgODIsIDE4Ng0KKyAgICB9DQorfTsNCitGWF9JTlQzMiBDQkNfRXJyb3JDb3JyZWN0aW9uOjpNT0RVTE9fVkFMVUUgPSAweDEyRDsNCitGWF9JTlQzMiBDQkNfRXJyb3JDb3JyZWN0aW9uOjpMT0dbMjU2XSA9IHswfTsNCitGWF9JTlQzMiBDQkNfRXJyb3JDb3JyZWN0aW9uOjpBTE9HWzI1Nl0gPSB7MH07DQordm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCkNCit7DQorICAgIEZYX0lOVDMyIHAgPSAxOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMjU1OyBpKyspIHsNCisgICAgICAgIEFMT0dbaV0gPSBwOw0KKyAgICAgICAgTE9HW3BdID0gaTsNCisgICAgICAgIHAgPDw9IDE7DQorICAgICAgICBpZiAocCA+PSAyNTYpIHsNCisgICAgICAgICAgICBwIF49IE1PRFVMT19WQUxVRTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENCQ19FcnJvckNvcnJlY3Rpb246OkZpbmFsaXplKCkNCit7DQorfQ0KK0NCQ19FcnJvckNvcnJlY3Rpb246OkNCQ19FcnJvckNvcnJlY3Rpb24oKQ0KK3sNCit9DQorQ0JDX0Vycm9yQ29ycmVjdGlvbjo6fkNCQ19FcnJvckNvcnJlY3Rpb24oKQ0KK3sNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSAhPSBzeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICAgICAgcmV0dXJuIChGWF9MUFdTVFIpIiI7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQorICAgIHNiICs9IGNvZGV3b3JkczsNCisgICAgRlhfSU5UMzIgYmxvY2tDb3VudCA9IHN5bWJvbEluZm8tPmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOw0KKyAgICBpZiAoYmxvY2tDb3VudCA9PSAxKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBlY2MgPSBjcmVhdGVFQ0NCbG9jayhjb2Rld29yZHMsIHN5bWJvbEluZm8tPm1fZXJyb3JDb2Rld29yZHMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9MUFdTVFIpIiIpOw0KKyAgICAgICAgc2IgKz0gZWNjOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkgZGF0YVNpemVzOw0KKyAgICAgICAgZGF0YVNpemVzLlNldFNpemUoYmxvY2tDb3VudCk7DQorICAgICAgICBDRlhfSW50MzJBcnJheSBlcnJvclNpemVzOw0KKyAgICAgICAgZXJyb3JTaXplcy5TZXRTaXplKGJsb2NrQ291bnQpOw0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkgc3RhcnRQb3M7DQorICAgICAgICBzdGFydFBvcy5TZXRTaXplKGJsb2NrQ291bnQpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGRhdGFTaXplc1tpXSA9IHN5bWJvbEluZm8tPmdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGkgKyAxKTsNCisgICAgICAgICAgICBlcnJvclNpemVzW2ldID0gc3ltYm9sSW5mby0+Z2V0RXJyb3JMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGkgKyAxKTsNCisgICAgICAgICAgICBzdGFydFBvc1tpXSA9IDA7DQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHN0YXJ0UG9zW2ldID0gc3RhcnRQb3NbaSAtIDFdICsgZGF0YVNpemVzW2ldOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGZvciAoRlhfSU5UMzIgYmxvY2sgPSAwOyBibG9jayA8IGJsb2NrQ291bnQ7IGJsb2NrKyspIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgZCA9IGJsb2NrOyBkIDwgc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHk7IGQgKz0gYmxvY2tDb3VudCkgew0KKyAgICAgICAgICAgICAgICB0ZW1wICs9IChGWF9XQ0hBUiljb2Rld29yZHMuR2V0QXQoZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGVjYyA9IGNyZWF0ZUVDQ0Jsb2NrKHRlbXAsIGVycm9yU2l6ZXNbYmxvY2tdLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX0xQV1NUUikiIik7DQorICAgICAgICAgICAgRlhfSU5UMzIgcG9zID0gMDsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGwgPSBibG9jazsgbCA8IGVycm9yU2l6ZXNbYmxvY2tdICogYmxvY2tDb3VudDsgbCArPSBibG9ja0NvdW50KSB7DQorICAgICAgICAgICAgICAgIHNiLlNldEF0KHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5ICsgbCwgZWNjLkdldEF0KHBvcysrKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBzYjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6Y3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLCBGWF9JTlQzMiBudW1FQ1dvcmRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIHJldHVybiBjcmVhdGVFQ0NCbG9jayhjb2Rld29yZHMsIDAsIGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSwgbnVtRUNXb3JkcywgZSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmNyZWF0ZUVDQ0Jsb2NrKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywgRlhfSU5UMzIgc3RhcnQsIEZYX0lOVDMyIGxlbiwgRlhfSU5UMzIgbnVtRUNXb3JkcywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiB0YWJsZSA9IC0xOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc2l6ZW9mKEZBQ1RPUl9TRVRTKSAvIHNpemVvZihGWF9JTlQzMik7IGkrKykgew0KKyAgICAgICAgaWYgKEZBQ1RPUl9TRVRTW2ldID09IG51bUVDV29yZHMpIHsNCisgICAgICAgICAgICB0YWJsZSA9IGk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHRhYmxlIDwgMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICAgICAgcmV0dXJuIChGWF9MUFdTVFIpIiI7DQorICAgIH0NCisgICAgRlhfV09SRCogZWNjID0gRlhfQWxsb2MoRlhfV09SRCwgbnVtRUNXb3Jkcyk7DQorICAgIEZYU1lTX21lbXNldDMyKGVjYywgMCwgbnVtRUNXb3JkcyAqIHNpemVvZihGWF9XT1JEKSk7DQorICAgIGZvciAoRlhfSU5UMzIgbCA9IHN0YXJ0OyBsIDwgc3RhcnQgKyBsZW47IGwrKykgew0KKyAgICAgICAgRlhfQllURSBBID0gKEZYX0JZVEUpY29kZXdvcmRzLkdldEF0KGwpOw0KKyAgICAgICAgRlhfV09SRCBCID0gZWNjW251bUVDV29yZHMgLSAxXTsNCisgICAgICAgIEZYX1dPUkQgbSA9IGVjY1tudW1FQ1dvcmRzIC0gMV0gXiBjb2Rld29yZHMuR2V0QXQobCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGsgPSBudW1FQ1dvcmRzIC0gMTsgayA+IDA7IGstLSkgew0KKyAgICAgICAgICAgIGlmIChtICE9IDAgJiYgRkFDVE9SU1t0YWJsZV1ba10gIT0gMCkgew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBhID0gTE9HW0ZBQ1RPUlNbdGFibGVdW2tdXTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgYiA9IEFMT0dbKExPR1ttXSArIExPR1tGQUNUT1JTW3RhYmxlXVtrXV0pICUgMjU1XTsNCisgICAgICAgICAgICAgICAgRlhfV09SRCBjID0gZWNjW2sgLSAxXTsNCisgICAgICAgICAgICAgICAgRlhfV09SRCBEID0gKGVjY1trIC0gMV0gXiBBTE9HWyhMT0dbbV0gKyBMT0dbRkFDVE9SU1t0YWJsZV1ba11dKSAlIDI1NV0pOw0KKyAgICAgICAgICAgICAgICBlY2Nba10gPSAoRlhfV09SRCApIChlY2NbayAtIDFdIF4gQUxPR1soTE9HW21dICsgTE9HW0ZBQ1RPUlNbdGFibGVdW2tdXSkgJSAyNTVdKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlY2Nba10gPSBlY2NbayAtIDFdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChtICE9IDAgJiYgRkFDVE9SU1t0YWJsZV1bMF0gIT0gMCkgew0KKyAgICAgICAgICAgIGVjY1swXSA9IChGWF9XT1JEKSBBTE9HWyhMT0dbbV0gKyBMT0dbRkFDVE9SU1t0YWJsZV1bMF1dKSAlIDI1NV07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVjY1swXSA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyZWNjOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbnVtRUNXb3JkczsgaisrKSB7DQorICAgICAgICBzdHJlY2MgKz0gKEZYX1dDSEFSKWVjY1tudW1FQ1dvcmRzIC0gaiAtIDFdOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoZWNjKTsNCisgICAgcmV0dXJuIHN0cmVjYzsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19GaW5kZXJQYXR0ZXJuSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2ZWQwNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19GaW5kZXJQYXR0ZXJuSW5mby5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRmluZGVyUGF0dGVybkluZm8uaCINCitDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6Q0JDX1FSRmluZGVyUGF0dGVybkluZm8oQ0ZYX1B0ckFycmF5ICpwYXR0ZXJuQ2VudGVycykNCit7DQorICAgIG1fYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5DZW50ZXJzKVswXTsNCisgICAgbV90b3BMZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybkNlbnRlcnMpWzFdOw0KKyAgICBtX3RvcFJpZ2h0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybkNlbnRlcnMpWzJdOw0KK30NCitDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6fkNCQ19RUkZpbmRlclBhdHRlcm5JbmZvKCkNCit7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm4qIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjpHZXRCb3R0b21MZWZ0KCkNCit7DQorICAgIHJldHVybiBtX2JvdHRvbUxlZnQ7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm4qIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjpHZXRUb3BMZWZ0KCkNCit7DQorICAgIHJldHVybiBtX3RvcExlZnQ7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm4qIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjpHZXRUb3BSaWdodCgpDQorew0KKyAgICByZXR1cm4gbV90b3BSaWdodDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBhZDY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CaW5hcml6ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oIg0KK2NvbnN0IEZYX0lOVDMyIExVTUlOQU5DRV9CSVRTID0gNTsNCitjb25zdCBGWF9JTlQzMiBMVU1JTkFOQ0VfU0hJRlQgPSA4IC0gTFVNSU5BTkNFX0JJVFM7DQorY29uc3QgRlhfSU5UMzIgTFVNSU5BTkNFX0JVQ0tFVFMgPSAxIDw8IExVTUlOQU5DRV9CSVRTOw0KK0NCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkNCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSAqc291cmNlKTogQ0JDX0JpbmFyaXplcihzb3VyY2UpDQorew0KK30NCitDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyOjp+Q0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcigpDQorew0KK30NCitDQkNfQ29tbW9uQml0QXJyYXkgKkNCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkdldEJsYWNrUm93KEZYX0lOVDMyIHksIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19MdW1pbmFuY2VTb3VyY2UgKnNvdXJjZSA9IEdldEx1bWluYW5jZVNvdXJjZSgpOw0KKyAgICBGWF9JTlQzMiB3aWR0aCA9IHNvdXJjZS0+R2V0V2lkdGgoKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdEFycmF5PiByZXN1bHQoRlhfTkVXIENCQ19Db21tb25CaXRBcnJheSh3aWR0aCkpOw0KKyAgICBJbml0QXJyYXlzKHdpZHRoKTsNCisgICAgQ0ZYX0J5dGVBcnJheSAqbG9jYWxMdW1pbmFuY2VzID0gc291cmNlLT5HZXRSb3coeSwgbV9sdW1pbmFuY2UsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBDRlhfSW50MzJBcnJheSBsb2NhbEJ1Y2tldHM7DQorICAgIGxvY2FsQnVja2V0cy5Db3B5KG1fYnVja2V0cyk7DQorICAgIEZYX0lOVDMyIHg7DQorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7DQorICAgICAgICBGWF9JTlQzMiBwaXhlbCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4XSAmIDB4ZmY7DQorICAgICAgICBsb2NhbEJ1Y2tldHNbcGl4ZWwgPj4gTFVNSU5BTkNFX1NISUZUXSsrOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGJsYWNrUG9pbnQgPSBFc3RpbWF0ZUJsYWNrUG9pbnQobG9jYWxCdWNrZXRzLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbGVmdCA9ICgqbG9jYWxMdW1pbmFuY2VzKVswXSAmIDB4ZmY7DQorICAgIEZYX0lOVDMyIGNlbnRlciA9ICgqbG9jYWxMdW1pbmFuY2VzKVsxXSAmIDB4ZmY7DQorICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aCAtIDE7IHgrKykgew0KKyAgICAgICAgRlhfSU5UMzIgcmlnaHQgPSAoKmxvY2FsTHVtaW5hbmNlcylbeCArIDFdICYgMHhmZjsNCisgICAgICAgIEZYX0lOVDMyIGx1bWluYW5jZSA9ICgoY2VudGVyIDw8IDIpIC0gbGVmdCAtIHJpZ2h0KSA+PiAxOw0KKyAgICAgICAgaWYgKGx1bWluYW5jZSA8IGJsYWNrUG9pbnQpIHsNCisgICAgICAgICAgICByZXN1bHQtPlNldCh4KTsNCisgICAgICAgIH0NCisgICAgICAgIGxlZnQgPSBjZW50ZXI7DQorICAgICAgICBjZW50ZXIgPSByaWdodDsNCisgICAgfQ0KKyAgICByZXR1cm4gIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXggKkNCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkdldEJsYWNrTWF0cml4KEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0x1bWluYW5jZVNvdXJjZSAqc291cmNlID0gR2V0THVtaW5hbmNlU291cmNlKCk7DQorICAgIEZYX0lOVDMyIHdpZHRoID0gc291cmNlLT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBoZWlnaHQgPSBzb3VyY2UtPkdldEhlaWdodCgpOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpCaXRNYXRyaXhUZW1wID0gRlhfTkVXIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgICAgQml0TWF0cml4VGVtcC0+SW5pdCh3aWR0aCwgaGVpZ2h0KTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeD4gbWF0cml4KEJpdE1hdHJpeFRlbXApOw0KKyAgICBJbml0QXJyYXlzKHdpZHRoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgbG9jYWxCdWNrZXRzOw0KKyAgICBsb2NhbEJ1Y2tldHMuQ29weShtX2J1Y2tldHMpOw0KKyAgICBGWF9JTlQzMiB5Ow0KKyAgICBmb3IgKHkgPSAxOyB5IDwgNTsgeSsrKSB7DQorICAgICAgICBGWF9JTlQzMiByb3cgPSBoZWlnaHQgKiB5IC8gNTsNCisgICAgICAgIENGWF9CeXRlQXJyYXkgKmxvY2FsTHVtaW5hbmNlcyA9IHNvdXJjZS0+R2V0Um93KHJvdywgbV9sdW1pbmFuY2UsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgRlhfSU5UMzIgcmlnaHQgPSAod2lkdGggPDwgMikgLyA1Ow0KKyAgICAgICAgRlhfSU5UMzIgeDsNCisgICAgICAgIGZvciAoeCA9IHdpZHRoIC8gNTsgeCA8IHJpZ2h0OyB4KyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBwaXhlbCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4XSAmIDB4ZmY7DQorICAgICAgICAgICAgbG9jYWxCdWNrZXRzW3BpeGVsID4+IExVTUlOQU5DRV9TSElGVF0rKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBibGFja1BvaW50ID0gRXN0aW1hdGVCbGFja1BvaW50KGxvY2FsQnVja2V0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gbG9jYWxMdW1pbmFuY2VzKHNvdXJjZS0+R2V0TWF0cml4KCkpOw0KKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsNCisgICAgICAgIEZYX0lOVDMyIG9mZnNldCA9IHkgKiB3aWR0aDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgcGl4ZWwgPSAoKmxvY2FsTHVtaW5hbmNlcylbb2Zmc2V0ICsgeF0gJiAweGZmOw0KKyAgICAgICAgICAgIGlmIChwaXhlbCA8IGJsYWNrUG9pbnQpIHsNCisgICAgICAgICAgICAgICAgbWF0cml4LT5TZXQoeCwgeSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBtYXRyaXgucmVsZWFzZSgpOw0KK30NCit2b2lkIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkluaXRBcnJheXMoRlhfSU5UMzIgbHVtaW5hbmNlU2l6ZSkNCit7DQorICAgIGlmKG1fbHVtaW5hbmNlLkdldFNpemUoKSA8IGx1bWluYW5jZVNpemUpIHsNCisgICAgICAgIG1fbHVtaW5hbmNlLlNldFNpemUobHVtaW5hbmNlU2l6ZSk7DQorICAgIH0NCisgICAgaWYobV9idWNrZXRzLkdldFNpemUoKSA8PSAwKSB7DQorICAgICAgICBtX2J1Y2tldHMuU2V0U2l6ZShMVU1JTkFOQ0VfQlVDS0VUUyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9JTlQzMiB4Ow0KKyAgICAgICAgZm9yKHggPSAwOyB4IDwgTFVNSU5BTkNFX0JVQ0tFVFM7IHgrKykgew0KKyAgICAgICAgICAgIG1fYnVja2V0c1t4XSA9IDA7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6RXN0aW1hdGVCbGFja1BvaW50KENGWF9JbnQzMkFycmF5ICZidWNrZXRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIG51bUJ1Y2tldHMgPSBidWNrZXRzLkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgbWF4QnVja2V0Q291bnQgPSAwOw0KKyAgICBGWF9JTlQzMiBmaXJzdFBlYWsgPSAwOw0KKyAgICBGWF9JTlQzMiBmaXJzdFBlYWtTaXplID0gMDsNCisgICAgRlhfSU5UMzIgeDsNCisgICAgZm9yICh4ID0gMDsgeCA8IG51bUJ1Y2tldHM7IHgrKykgew0KKyAgICAgICAgaWYgKGJ1Y2tldHNbeF0gPiBmaXJzdFBlYWtTaXplKSB7DQorICAgICAgICAgICAgZmlyc3RQZWFrID0geDsNCisgICAgICAgICAgICBmaXJzdFBlYWtTaXplID0gYnVja2V0c1t4XTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChidWNrZXRzW3hdID4gbWF4QnVja2V0Q291bnQpIHsNCisgICAgICAgICAgICBtYXhCdWNrZXRDb3VudCA9IGJ1Y2tldHNbeF07DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgc2Vjb25kUGVhayA9IDA7DQorICAgIEZYX0lOVDMyIHNlY29uZFBlYWtTY29yZSA9IDA7DQorICAgIGZvciAoeCA9IDA7IHggPCBudW1CdWNrZXRzOyB4KyspIHsNCisgICAgICAgIEZYX0lOVDMyIGRpc3RhbmNlVG9CaWdnZXN0ID0geCAtIGZpcnN0UGVhazsNCisgICAgICAgIEZYX0lOVDMyIHNjb3JlID0gYnVja2V0c1t4XSAqIGRpc3RhbmNlVG9CaWdnZXN0ICogZGlzdGFuY2VUb0JpZ2dlc3Q7DQorICAgICAgICBpZiAoc2NvcmUgPiBzZWNvbmRQZWFrU2NvcmUpIHsNCisgICAgICAgICAgICBzZWNvbmRQZWFrID0geDsNCisgICAgICAgICAgICBzZWNvbmRQZWFrU2NvcmUgPSBzY29yZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZmlyc3RQZWFrID4gc2Vjb25kUGVhaykgew0KKyAgICAgICAgRlhfSU5UMzIgdGVtcCA9IGZpcnN0UGVhazsNCisgICAgICAgIGZpcnN0UGVhayA9IHNlY29uZFBlYWs7DQorICAgICAgICBzZWNvbmRQZWFrID0gdGVtcDsNCisgICAgfQ0KKyAgICBpZiAoc2Vjb25kUGVhayAtIGZpcnN0UGVhayA8PSBudW1CdWNrZXRzID4+IDQpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBiZXN0VmFsbGV5ID0gc2Vjb25kUGVhayAtIDE7DQorICAgIEZYX0lOVDMyIGJlc3RWYWxsZXlTY29yZSA9IC0xOw0KKyAgICBmb3IgKHggPSBzZWNvbmRQZWFrIC0gMTsgeCA+IGZpcnN0UGVhazsgeC0tKSB7DQorICAgICAgICBGWF9JTlQzMiBmcm9tRmlyc3QgPSB4IC0gZmlyc3RQZWFrOw0KKyAgICAgICAgRlhfSU5UMzIgc2NvcmUgPSBmcm9tRmlyc3QgKiBmcm9tRmlyc3QgKiAoc2Vjb25kUGVhayAtIHgpICogKG1heEJ1Y2tldENvdW50IC0gYnVja2V0c1t4XSk7DQorICAgICAgICBpZiAoc2NvcmUgPiBiZXN0VmFsbGV5U2NvcmUpIHsNCisgICAgICAgICAgICBiZXN0VmFsbGV5ID0geDsNCisgICAgICAgICAgICBiZXN0VmFsbGV5U2NvcmUgPSBzY29yZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gYmVzdFZhbGxleSA8PCBMVU1JTkFOQ0VfU0hJRlQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJlZGI2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1N5bWJvbEluZm8uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyQ29udGV4dC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0M0MEVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19UZXh0RW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1gxMkVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FZGlmYWN0RW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0Jhc2UyNTZFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQVNDSUlFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2RlZmluZSAgSW50ZWdlcl9NQVhfVkFMVUUgICAyMTQ3NDgzNjQ3DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0M0MCA9IDIzMDsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQkFTRTI1NiA9IDIzMTsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6VVBQRVJfU0hJRlQgPSAyMzU7DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0FOU0lYMTIgPSAyMzg7DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX1RFWFQgPSAyMzk7DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0VESUZBQ1QgPSAyNDA7DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkM0MF9VTkxBVENIID0gMjU0Ow0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpYMTJfVU5MQVRDSCA9IDI1NDsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6UEFEID0gMTI5Ow0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpNQUNST18wNSA9IDIzNjsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fMDYgPSAyMzc7DQorY29uc3Qgd2NoYXJfdCogQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA1X0hFQURFUiA9IEwiWyk+HjA1IjsNCitjb25zdCB3Y2hhcl90KiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fMDZfSEVBREVSID0gTCJbKT4eMDYiOw0KK2NvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPX1RSQUlMRVIgPSAweDAwMDQ7DQorQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCkNCit7DQorfQ0KK0NCQ19IaWdoTGV2ZWxFbmNvZGVyOjp+Q0JDX0hpZ2hMZXZlbEVuY29kZXIoKQ0KK3sNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmdldEJ5dGVzRm9yTWVzc2FnZShDRlhfV2lkZVN0cmluZyBtc2cpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyOw0KKyAgICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgobXNnLCBieXRlc3RyKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGJ5dGVzdHIuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICAgICAgbV9ieXRlYXJyYXkuQWRkKGJ5dGVzdHIuR2V0QXQoaSkpOw0KKyAgICB9DQorICAgIHJldHVybiBtX2J5dGVhcnJheTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChDRlhfV2lkZVN0cmluZyBtc2csIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIGVuY29kZUhpZ2hMZXZlbChtc2csIGVjTGV2ZWwsIEZPUkNFX05PTkUsIE5VTEwsIE5VTEwsIGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfRW5jb2RlckNvbnRleHQgY29udGV4dChtc2csIGVjTGV2ZWwsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX0xQV1NUUikiIik7DQorICAgIGNvbnRleHQuc2V0U3ltYm9sU2hhcGUoc2hhcGUpOw0KKyAgICBjb250ZXh0LnNldFNpemVDb25zdHJhaW50cyhtaW5TaXplLCBtYXhTaXplKTsNCisgICAgaWYgKChtc2cuTWlkKDAsIDYpID09IE1BQ1JPXzA1X0hFQURFUikgJiYgKG1zZy5NaWQobXNnLkdldExlbmd0aCgpIC0gMSwgMSkgPT0gTUFDUk9fVFJBSUxFUikpIHsNCisgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChNQUNST18wNSk7DQorICAgICAgICBjb250ZXh0LnNldFNraXBBdEVuZCgyKTsNCisgICAgICAgIGNvbnRleHQubV9wb3MgKz0gNjsNCisgICAgfSBlbHNlIGlmICgobXNnLk1pZCgwLCA2KSA9PSBNQUNST18wNl9IRUFERVIpICYmIChtc2cuTWlkKG1zZy5HZXRMZW5ndGgoKSAtIDEsIDEpID09IE1BQ1JPX1RSQUlMRVIpKSB7DQorICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoTUFDUk9fMDYpOw0KKyAgICAgICAgY29udGV4dC5zZXRTa2lwQXRFbmQoMik7DQorICAgICAgICBjb250ZXh0Lm1fcG9zICs9IDY7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IGVuY29kZXJzOw0KKyAgICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19BU0NJSUVuY29kZXIoKSk7DQorICAgIGVuY29kZXJzLkFkZChGWF9ORVcgQ0JDX0M0MEVuY29kZXIoKSk7DQorICAgIGVuY29kZXJzLkFkZChGWF9ORVcgQ0JDX1RleHRFbmNvZGVyKCkpOw0KKyAgICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19YMTJFbmNvZGVyKCkpOw0KKyAgICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19FZGlmYWN0RW5jb2RlcigpKTsNCisgICAgZW5jb2RlcnMuQWRkKEZYX05FVyBDQkNfQmFzZTI1NkVuY29kZXIoKSk7DQorICAgIEZYX0lOVDMyIGVuY29kaW5nTW9kZSA9IEFTQ0lJX0VOQ09EQVRJT047DQorICAgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgICAgICgoQ0JDX0VuY29kZXIqKWVuY29kZXJzLkdldEF0KGVuY29kaW5nTW9kZSkpLT5FbmNvZGUoY29udGV4dCwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGVuY29kZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSAoQ0JDX0VuY29kZXIqKWVuY29kZXJzLkdldEF0KGkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbmNvZGVycy5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICByZXR1cm4gKEZYX0xQV1NUUikiIjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChjb250ZXh0Lm1fbmV3RW5jb2RpbmcgPj0gMCkgew0KKyAgICAgICAgICAgIGVuY29kaW5nTW9kZSA9IGNvbnRleHQubV9uZXdFbmNvZGluZzsNCisgICAgICAgICAgICBjb250ZXh0LnJlc2V0RW5jb2RlclNpZ25hbCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGxlbiA9IGNvbnRleHQubV9jb2Rld29yZHMuR2V0TGVuZ3RoKCk7DQorICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGVuY29kZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgZGVsZXRlIChDQkNfRW5jb2RlciopZW5jb2RlcnMuR2V0QXQoaSk7DQorICAgICAgICB9DQorICAgICAgICBlbmNvZGVycy5SZW1vdmVBbGwoKTsNCisgICAgICAgIHJldHVybiAoRlhfTFBXU1RSKSIiOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGNhcGFjaXR5ID0gY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5Ow0KKyAgICBpZiAobGVuIDwgY2FwYWNpdHkpIHsNCisgICAgICAgIGlmIChlbmNvZGluZ01vZGUgIT0gQVNDSUlfRU5DT0RBVElPTiAmJiBlbmNvZGluZ01vZGUgIT0gQkFTRTI1Nl9FTkNPREFUSU9OKSB7DQorICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKDB4MDBmZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzID0gY29udGV4dC5tX2NvZGV3b3JkczsNCisgICAgaWYgKGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSA8IGNhcGFjaXR5KSB7DQorICAgICAgICBjb2Rld29yZHMgKz0gUEFEOw0KKyAgICB9DQorICAgIHdoaWxlIChjb2Rld29yZHMuR2V0TGVuZ3RoKCkgPCBjYXBhY2l0eSkgew0KKyAgICAgICAgY29kZXdvcmRzICs9IChyYW5kb21pemUyNTNTdGF0ZShQQUQsIGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSArIDEpKTsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZW5jb2RlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0JDX0VuY29kZXIqKWVuY29kZXJzLkdldEF0KGkpOw0KKyAgICB9DQorICAgIGVuY29kZXJzLlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm4gY29kZXdvcmRzOw0KK30NCitGWF9JTlQzMiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChDRlhfV2lkZVN0cmluZyBtc2csIEZYX0lOVDMyIHN0YXJ0cG9zLCBGWF9JTlQzMiBjdXJyZW50TW9kZSkNCit7DQorICAgIGlmIChzdGFydHBvcyA+PSBtc2cuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgIHJldHVybiBjdXJyZW50TW9kZTsNCisgICAgfQ0KKyAgICBDRlhfRmxvYXRBcnJheSBjaGFyQ291bnRzOw0KKyAgICBpZiAoY3VycmVudE1vZGUgPT0gQVNDSUlfRU5DT0RBVElPTikgew0KKyAgICAgICAgY2hhckNvdW50cy5BZGQoMCk7DQorICAgICAgICBjaGFyQ291bnRzLkFkZCgxKTsNCisgICAgICAgIGNoYXJDb3VudHMuQWRkKDEpOw0KKyAgICAgICAgY2hhckNvdW50cy5BZGQoMSk7DQorICAgICAgICBjaGFyQ291bnRzLkFkZCgxKTsNCisgICAgICAgIGNoYXJDb3VudHMuQWRkKDEuMjVmKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGNoYXJDb3VudHMuQWRkKDEpOw0KKyAgICAgICAgY2hhckNvdW50cy5BZGQoMik7DQorICAgICAgICBjaGFyQ291bnRzLkFkZCgyKTsNCisgICAgICAgIGNoYXJDb3VudHMuQWRkKDIpOw0KKyAgICAgICAgY2hhckNvdW50cy5BZGQoMik7DQorICAgICAgICBjaGFyQ291bnRzLkFkZCgyLjI1Zik7DQorICAgICAgICBjaGFyQ291bnRzW2N1cnJlbnRNb2RlXSA9IDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY2hhcnNQcm9jZXNzZWQgPSAwOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgaWYgKChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKSA9PSBtc2cuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBGWF9EV09SRCBtaW4gPSBJbnRlZ2VyX01BWF9WQUxVRTsNCisgICAgICAgICAgICBDRlhfQnl0ZUFycmF5IG1pbnM7DQorICAgICAgICAgICAgbWlucy5TZXRTaXplKDYpOw0KKyAgICAgICAgICAgIENGWF9JbnQzMkFycmF5IGludENoYXJDb3VudHM7DQorICAgICAgICAgICAgaW50Q2hhckNvdW50cy5TZXRTaXplKDYpOw0KKyAgICAgICAgICAgIG1pbiA9IGZpbmRNaW5pbXVtcyhjaGFyQ291bnRzLCBpbnRDaGFyQ291bnRzLCBtaW4sIG1pbnMpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG1pbkNvdW50ID0gZ2V0TWluaW11bUNvdW50KG1pbnMpOw0KKyAgICAgICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dID09IG1pbikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQVNDSUlfRU5DT0RBVElPTjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tCQVNFMjU2X0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREFUSU9OOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW0VESUZBQ1RfRU5DT0RBVElPTl0gPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBFRElGQUNUX0VOQ09EQVRJT047DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbVEVYVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRFWFRfRU5DT0RBVElPTjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tYMTJfRU5DT0RBVElPTl0gPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfV0NIQVIgYyA9IG1zZy5HZXRBdChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKTsNCisgICAgICAgIGNoYXJzUHJvY2Vzc2VkKys7DQorICAgICAgICBpZiAoaXNEaWdpdChjKSkgew0KKyAgICAgICAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gKz0gMC41Ow0KKyAgICAgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dID0gKEZYX0ZMT0FUKSBjZWlsKGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0pOw0KKyAgICAgICAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gKz0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA9IChGWF9GTE9BVCkgY2VpbChjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dKTsNCisgICAgICAgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dKys7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaXNOYXRpdmVDNDAoYykpIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsNCisgICAgICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQorICAgICAgICAgICAgY2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKz0gOC4wZiAvIDMuMGY7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICs9IDQuMGYgLyAzLjBmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlzTmF0aXZlVGV4dChjKSkgew0KKyAgICAgICAgICAgIGNoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsNCisgICAgICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQorICAgICAgICAgICAgY2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dICs9IDguMGYgLyAzLjBmOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaXNOYXRpdmVYMTIoYykpIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsNCisgICAgICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQorICAgICAgICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMTMuMGYgLyAzLjBmOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSArPSAxMC4wZiAvIDMuMGY7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaXNOYXRpdmVFRElGQUNUKGMpKSB7DQorICAgICAgICAgICAgY2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICs9IDMuMGYgLyA0LjBmOw0KKyAgICAgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gKz0gMTcuMGYgLyA0LjBmOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gKz0gMTMuMGYgLyA0LjBmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlzU3BlY2lhbEIyNTYoYykpIHsNCisgICAgICAgICAgICBjaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0gKz0gNDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dKys7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2hhcnNQcm9jZXNzZWQgPj0gNCkgew0KKyAgICAgICAgICAgIENGWF9JbnQzMkFycmF5IGludENoYXJDb3VudHM7DQorICAgICAgICAgICAgaW50Q2hhckNvdW50cy5TZXRTaXplKDYpOw0KKyAgICAgICAgICAgIENGWF9CeXRlQXJyYXkgbWluczsNCisgICAgICAgICAgICBtaW5zLlNldFNpemUoNik7DQorICAgICAgICAgICAgZmluZE1pbmltdW1zKGNoYXJDb3VudHMsIGludENoYXJDb3VudHMsIEludGVnZXJfTUFYX1ZBTFVFLCBtaW5zKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBtaW5Db3VudCA9IGdldE1pbmltdW1Db3VudChtaW5zKTsNCisgICAgICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXQ0KKyAgICAgICAgICAgICAgICAgICAgJiYgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dDQorICAgICAgICAgICAgICAgICAgICAmJiBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dDQorICAgICAgICAgICAgICAgICAgICAmJiBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0NCisgICAgICAgICAgICAgICAgICAgICYmIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEFTQ0lJX0VOQ09EQVRJT047DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dDQorICAgICAgICAgICAgICAgICAgICB8fCAobWluc1tDNDBfRU5DT0RBVElPTl0gKyBtaW5zW1RFWFRfRU5DT0RBVElPTl0gKyBtaW5zW1gxMl9FTkNPREFUSU9OXSArIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREFUSU9OOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW0VESUZBQ1RfRU5DT0RBVElPTl0gPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBFRElGQUNUX0VOQ09EQVRJT047DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbVEVYVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRFWFRfRU5DT0RBVElPTjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tYMTJfRU5DT0RBVElPTl0gPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICsgMSA8IGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0NCisgICAgICAgICAgICAgICAgICAgICYmIGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICsgMSA8IGludENoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXQ0KKyAgICAgICAgICAgICAgICAgICAgJiYgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dDQorICAgICAgICAgICAgICAgICAgICAmJiBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPCBpbnRDaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0pIHsNCisgICAgICAgICAgICAgICAgaWYgKGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0pIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDNDBfRU5DT0RBVElPTjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gPT0gaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0pIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHAgPSBzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkICsgMTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwIDwgbXNnLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgdGMgPSBtc2cuR2V0QXQocCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzWDEyVGVybVNlcCh0YykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmF0aXZlWDEyKHRjKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcCsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQoRlhfV0NIQVIgY2gpDQorew0KKyAgICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JzsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNFeHRlbmRlZEFTQ0lJKEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIGNoID49IDEyOCAmJiBjaCA8PSAyNTU7DQorfQ0KK0ZYX0lOVDMyIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBGWF9JTlQzMiBzdGFydHBvcykNCit7DQorICAgIEZYX0lOVDMyIGNvdW50ID0gMDsNCisgICAgRlhfSU5UMzIgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBpZHggPSBzdGFydHBvczsNCisgICAgaWYgKGlkeCA8IGxlbikgew0KKyAgICAgICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgICAgIHdoaWxlIChpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsNCisgICAgICAgICAgICBjb3VudCsrOw0KKyAgICAgICAgICAgIGlkeCsrOw0KKyAgICAgICAgICAgIGlmIChpZHggPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGNvdW50Ow0KK30NCit2b2lkIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKEZYX1dDSEFSIGMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KK30NCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6cmFuZG9taXplMjUzU3RhdGUoRlhfV0NIQVIgY2gsIEZYX0lOVDMyIGNvZGV3b3JkUG9zaXRpb24pDQorew0KKyAgICBGWF9JTlQzMiBwc2V1ZG9SYW5kb20gPSAoKDE0OSAqIGNvZGV3b3JkUG9zaXRpb24pICUgMjUzKSArIDE7DQorICAgIEZYX0lOVDMyIHRlbXBWYXJpYWJsZSA9IGNoICsgcHNldWRvUmFuZG9tOw0KKyAgICByZXR1cm4gdGVtcFZhcmlhYmxlIDw9IDI1NCA/IChGWF9XQ0hBUikgdGVtcFZhcmlhYmxlIDogKEZYX1dDSEFSKSAodGVtcFZhcmlhYmxlIC0gMjU0KTsNCit9DQorRlhfSU5UMzIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmZpbmRNaW5pbXVtcyhDRlhfRmxvYXRBcnJheSAmY2hhckNvdW50cywgQ0ZYX0ludDMyQXJyYXkgJmludENoYXJDb3VudHMsIEZYX0lOVDMyIG1pbiwgQ0ZYX0J5dGVBcnJheSAmbWlucykNCit7DQorICAgIGZvciAoRlhfSU5UMzIgbCA9IDA7IGwgPCBtaW5zLkdldFNpemUoKTsgbCsrKSB7DQorICAgICAgICBtaW5zW2xdID0gKEZYX0JZVEUpMDsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgNjsgaSsrKSB7DQorICAgICAgICBpbnRDaGFyQ291bnRzW2ldID0gKEZYX0lOVDMyKWNlaWwoY2hhckNvdW50c1tpXSk7DQorICAgICAgICBGWF9JTlQzMiBjdXJyZW50ID0gaW50Q2hhckNvdW50c1tpXTsNCisgICAgICAgIGlmIChtaW4gPiBjdXJyZW50KSB7DQorICAgICAgICAgICAgbWluID0gY3VycmVudDsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbWlucy5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgICAgICAgICBtaW5zW2pdID0gKEZYX0JZVEUpMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobWluID09IGN1cnJlbnQpIHsNCisgICAgICAgICAgICBtaW5zW2ldKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1pbjsNCit9DQorRlhfSU5UMzIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmdldE1pbmltdW1Db3VudChDRlhfQnl0ZUFycmF5ICZtaW5zKQ0KK3sNCisgICAgRlhfSU5UMzIgbWluQ291bnQgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgNjsgaSsrKSB7DQorICAgICAgICBtaW5Db3VudCArPSBtaW5zW2ldOw0KKyAgICB9DQorICAgIHJldHVybiBtaW5Db3VudDsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVDNDAoRlhfV0NIQVIgY2gpDQorew0KKyAgICByZXR1cm4gKGNoID09ICcgJykgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVUZXh0KEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzTmF0aXZlWDEyKEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIGlzWDEyVGVybVNlcChjaCkgfHwgKGNoID09ICcgJykgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNYMTJUZXJtU2VwKEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIChjaCA9PSAnXHInKSB8fCAoY2ggPT0gJyonKSB8fCAoY2ggPT0gJz4nKTsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVFRElGQUNUKEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIGNoID49ICcgJyAmJiBjaCA8PSAnXic7DQorfQ0KK0ZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzU3BlY2lhbEIyNTYoRlhfV0NIQVIgY2gpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19MaWJyYXJ5LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjEyNjA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX0xpYnJhcnkuY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeFZlcnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJpemVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGUxMjhSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kZTM5UmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRGltUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZEVBTjEzUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZEVBTjhSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkVVBDQVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RhQmFyUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1dyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGUzOVdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRFQU4xM1dyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRFQU44V3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZFVQQ0FXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyTW9kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJEYXRhTWFzay5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGVmYXVsdFBsYWNlbWVudC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1N5bWJvbEluZm8uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0Vycm9yQ29ycmVjdGlvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQzQwRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1RleHRFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfWDEyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VkaWZhY3RFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmFzZTI1NkVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19BU0NJSUVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RhdGFNYXRyaXhXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21wYWN0aW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0JpbmFyeUJpdG1hcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3IuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JvdW5kaW5nQm94LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3UmVhZGVyLmgiDQordm9pZCBCQ19MaWJyYXJ5X0luaXQoKQ0KK3sNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SW5pdGlhbGl6ZSgpOw0KKyAgICBDQkNfUVJDb2Rlck1vZGU6OkluaXRpYWxpemUoKTsNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpJbml0aWFsaXplKCk7DQorICAgIENCQ19RUkRhdGFNYXNrOjpJbml0aWFsaXplKCk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2OjpJbml0aWFsaXplKCk7DQorICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6SW5pdGlhbGl6ZSgpOw0KKyAgICBDQkNfU3ltYm9sSW5mbzo6SW5pdGlhbGl6ZSgpOw0KKyAgICBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCk7DQorICAgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCk7DQorICAgIEZYX0lOVDMyIGUgPSAwOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OkluaXRpYWxpemUoZSk7DQorICAgIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkluaXRpYWxpemUoKTsNCisgICAgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpOw0KKyAgICBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OkluaXRpYWxpemUoZSk7DQorICAgIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkluaXRpYWxpemUoKTsNCit9DQordm9pZCBCQ19MaWJyYXJ5X0Rlc3RvcnkoKQ0KK3sNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RmluYWxpemUoKTsNCisgICAgQ0JDX1FSQ29kZXJNb2RlOjpGaW5hbGl6ZSgpOw0KKyAgICBDQkNfUVJDb2RlclZlcnNpb246OkZpbmFsaXplKCk7DQorICAgIENCQ19RUkRhdGFNYXNrOjpGaW5hbGl6ZSgpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RmluYWxpemUoKTsNCisgICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpGaW5hbGl6ZSgpOw0KKyAgICBDQkNfU3ltYm9sSW5mbzo6RmluYWxpemUoKTsNCisgICAgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6RmluYWxpemUoKTsNCisgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7DQorICAgIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkZpbmFsaXplKCk7DQorICAgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkZpbmFsaXplKCk7DQorICAgIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6RmluYWxpemUoKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpGaW5hbGl6ZSgpOw0KKyAgICBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpGaW5hbGl6ZSgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfTHVtaW5hbmNlU291cmNlLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19MdW1pbmFuY2VTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjFjOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfTHVtaW5hbmNlU291cmNlLmNwcApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfTHVtaW5hbmNlU291cmNlLmgiDQorQ0JDX0x1bWluYW5jZVNvdXJjZTo6Q0JDX0x1bWluYW5jZVNvdXJjZShGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0KTogbV93aWR0aCh3aWR0aCksIG1faGVpZ2h0KGhlaWdodCkNCit7DQorfQ0KK0NCQ19MdW1pbmFuY2VTb3VyY2U6On5DQkNfTHVtaW5hbmNlU291cmNlKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19MdW1pbmFuY2VTb3VyY2U6OkdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX3dpZHRoOw0KK30NCitGWF9JTlQzMiBDQkNfTHVtaW5hbmNlU291cmNlOjpHZXRIZWlnaHQoKQ0KK3sNCisgICAgcmV0dXJuIG1faGVpZ2h0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lRFJlYWRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lRFJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5ZDBmZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVEUmVhZGVyLmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oIg0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVEUmVhZGVyOjpJTlRFR0VSX01BVEhfU0hJRlQgPSA4Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVEUmVhZGVyOjpQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1IgPSAxIDw8IDg7DQorQ0JDX09uZURSZWFkZXI6OkNCQ19PbmVEUmVhZGVyKCkNCit7DQorfQ0KK0NCQ19PbmVEUmVhZGVyOjp+Q0JDX09uZURSZWFkZXIoKQ0KK3sNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHJ0ZW1wID0gRGVjb2RlKGltYWdlLCAwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgcmV0dXJuIHN0cnRlbXA7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVEUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIHN0cnRlbXAgPSBEZURlY29kZShpbWFnZSwgaGludHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gc3RydGVtcDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiB3aWR0aCA9IGltYWdlLT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBoZWlnaHQgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQorICAgIENCQ19Db21tb25CaXRBcnJheSAqcm93ID0gTlVMTDsNCisgICAgRlhfSU5UMzIgbWlkZGxlID0gaGVpZ2h0ID4+IDE7DQorICAgIEZYX0JPT0wgdHJ5SGFyZGVyID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIHJvd1N0ZXAgPSBGWF9NQVgoMSwgaGVpZ2h0ID4+ICh0cnlIYXJkZXIgPyA4IDogNSkpOw0KKyAgICBGWF9JTlQzMiBtYXhMaW5lczsNCisgICAgaWYgKHRyeUhhcmRlcikgew0KKyAgICAgICAgbWF4TGluZXMgPSBoZWlnaHQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtYXhMaW5lcyA9IDE1Ow0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgeCA9IDA7IHggPCBtYXhMaW5lczsgeCsrKSB7DQorICAgICAgICBGWF9JTlQzMiByb3dTdGVwc0Fib3ZlT3JCZWxvdyA9ICh4ICsgMSkgPj4gMTsNCisgICAgICAgIEZYX0JPT0wgaXNBYm92ZSA9ICh4ICYgMHgwMSkgPT0gMDsNCisgICAgICAgIEZYX0lOVDMyIHJvd051bWJlciA9IG1pZGRsZSArIHJvd1N0ZXAgKiAoaXNBYm92ZSA/IHJvd1N0ZXBzQWJvdmVPckJlbG93IDogLXJvd1N0ZXBzQWJvdmVPckJlbG93KTsNCisgICAgICAgIGlmIChyb3dOdW1iZXIgPCAwIHx8IHJvd051bWJlciA+PSBoZWlnaHQpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHJvdyA9IGltYWdlLT5HZXRCbGFja1Jvdyhyb3dOdW1iZXIsIE5VTEwsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5POw0KKyAgICAgICAgICAgIGlmKHJvdyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSByb3c7DQorICAgICAgICAgICAgICAgIHJvdyA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykgew0KKyAgICAgICAgICAgIGlmIChhdHRlbXB0ID09IDEpIHsNCisgICAgICAgICAgICAgICAgcm93LT5SZXZlcnNlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdCA9IERlY29kZVJvdyhyb3dOdW1iZXIsIHJvdywgaGludHMsIGUpOw0KKyAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTk87DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihyb3cgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgcm93Ow0KKyAgICAgICAgICAgICAgICByb3cgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYocm93ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgcm93Ow0KKyAgICAgICAgICAgIHJvdyA9IE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIHJldHVybiAiIjsNCit9DQordm9pZCBDQkNfT25lRFJlYWRlcjo6UmVjb3JkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgc3RhcnQsIENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBudW1Db3VudGVycyA9IGNvdW50ZXJzLT5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgICAgICAoKmNvdW50ZXJzKVtpXSA9IDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICAgIGlmIChzdGFydCA+PSBlbmQpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgaXNXaGl0ZSA9ICFyb3ctPkdldChzdGFydCk7DQorICAgIEZYX0lOVDMyIGNvdW50ZXJQb3NpdGlvbiA9IDA7DQorICAgIEZYX0lOVDMyIGogPSBzdGFydDsNCisgICAgd2hpbGUgKGogPCBlbmQpIHsNCisgICAgICAgIEZYX0JPT0wgcGl4ZWwgPSByb3ctPkdldChqKTsNCisgICAgICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICAgICAgICAoKmNvdW50ZXJzKVtjb3VudGVyUG9zaXRpb25dKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgICAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gbnVtQ291bnRlcnMpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgKCpjb3VudGVycylbY291bnRlclBvc2l0aW9uXSA9IDE7DQorICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBqKys7DQorICAgIH0NCisgICAgaWYgKCEoY291bnRlclBvc2l0aW9uID09IG51bUNvdW50ZXJzIHx8IChjb3VudGVyUG9zaXRpb24gPT0gbnVtQ291bnRlcnMgLSAxICYmIGogPT0gZW5kKSkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX09uZURSZWFkZXI6OlJlY29yZFBhdHRlcm5JblJldmVyc2UoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyIHN0YXJ0LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbnVtVHJhbnNpdGlvbnNMZWZ0ID0gY291bnRlcnMtPkdldFNpemUoKTsNCisgICAgRlhfQk9PTCBsYXN0ID0gcm93LT5HZXQoc3RhcnQpOw0KKyAgICB3aGlsZSAoc3RhcnQgPiAwICYmIG51bVRyYW5zaXRpb25zTGVmdCA+PSAwKSB7DQorICAgICAgICBpZiAocm93LT5HZXQoLS1zdGFydCkgIT0gbGFzdCkgew0KKyAgICAgICAgICAgIG51bVRyYW5zaXRpb25zTGVmdC0tOw0KKyAgICAgICAgICAgIGxhc3QgPSAhbGFzdDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobnVtVHJhbnNpdGlvbnNMZWZ0ID49IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFJlY29yZFBhdHRlcm4ocm93LCBzdGFydCArIDEsIGNvdW50ZXJzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK0ZYX0lOVDMyIENCQ19PbmVEUmVhZGVyOjpQYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIGNvbnN0IEZYX0lOVDMyICpwYXR0ZXJuLCBGWF9JTlQzMiBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpDQorew0KKyAgICBGWF9JTlQzMiBudW1Db3VudGVycyA9IGNvdW50ZXJzLT5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIHRvdGFsID0gMDsNCisgICAgRlhfSU5UMzIgcGF0dGVybkxlbmd0aCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgICAgICB0b3RhbCArPSAoKmNvdW50ZXJzKVtpXTsNCisgICAgICAgIHBhdHRlcm5MZW5ndGggKz0gcGF0dGVybltpXTsNCisgICAgfQ0KKyAgICBpZiAodG90YWwgPCBwYXR0ZXJuTGVuZ3RoKSB7DQorI3VuZGVmIG1heA0KKyAgICAgICAgcmV0dXJuIEZYU1lTX0ludE1heDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB1bml0QmFyV2lkdGggPSAodG90YWwgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIHBhdHRlcm5MZW5ndGg7DQorICAgIG1heEluZGl2aWR1YWxWYXJpYW5jZSA9IChtYXhJbmRpdmlkdWFsVmFyaWFuY2UgKiB1bml0QmFyV2lkdGgpID4+IElOVEVHRVJfTUFUSF9TSElGVDsNCisgICAgRlhfSU5UMzIgdG90YWxWYXJpYW5jZSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgeCA9IDA7IHggPCBudW1Db3VudGVyczsgeCsrKSB7DQorICAgICAgICBGWF9JTlQzMiBjb3VudGVyID0gKCpjb3VudGVycylbeF0gPDwgSU5URUdFUl9NQVRIX1NISUZUOw0KKyAgICAgICAgRlhfSU5UMzIgc2NhbGVkUGF0dGVybiA9IHBhdHRlcm5beF0gKiB1bml0QmFyV2lkdGg7DQorICAgICAgICBGWF9JTlQzMiB2YXJpYW5jZSA9IGNvdW50ZXIgPiBzY2FsZWRQYXR0ZXJuID8gY291bnRlciAtIHNjYWxlZFBhdHRlcm4gOiBzY2FsZWRQYXR0ZXJuIC0gY291bnRlcjsNCisgICAgICAgIGlmICh2YXJpYW5jZSA+IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KKyN1bmRlZiBtYXgNCisgICAgICAgICAgICByZXR1cm4gRlhTWVNfSW50TWF4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgdG90YWxWYXJpYW5jZSArPSB2YXJpYW5jZTsNCisgICAgfQ0KKyAgICByZXR1cm4gdG90YWxWYXJpYW5jZSAvIHRvdGFsOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lRGltUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVEaW1SZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDQwZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lRGltUmVhZGVyLmNwcApAQCAtMCwwICsxLDIxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVJlYWRlci5oIg0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVEaW1SZWFkZXI6Ok1BWF9BVkdfVkFSSUFOQ0UgPSAoRlhfSU5UMzIpKDI1NiAqIDAuNDhmKTsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lRGltUmVhZGVyOjpNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSA9IChGWF9JTlQzMikoMjU2ICogMC43Zik7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZURpbVJlYWRlcjo6U1RBUlRfRU5EX1BBVFRFUk5bM10gPSB7MSwgMSwgMX07DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNV0gPSB7MSwgMSwgMSwgMSwgMX07DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1sxMF1bNF0gPSB7DQorICAgIHszLCAyLCAxLCAxfSwNCisgICAgezIsIDIsIDIsIDF9LA0KKyAgICB7MiwgMSwgMiwgMn0sDQorICAgIHsxLCA0LCAxLCAxfSwNCisgICAgezEsIDEsIDMsIDJ9LA0KKyAgICB7MSwgMiwgMywgMX0sDQorICAgIHsxLCAxLCAxLCA0fSwNCisgICAgezEsIDMsIDEsIDJ9LA0KKyAgICB7MSwgMiwgMSwgM30sDQorICAgIHszLCAxLCAxLCAyfQ0KK307DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZURpbVJlYWRlcjo6TF9BTkRfR19QQVRURVJOU1syMF1bNF0gPSB7DQorICAgIHszLCAyLCAxLCAxfSwNCisgICAgezIsIDIsIDIsIDF9LA0KKyAgICB7MiwgMSwgMiwgMn0sDQorICAgIHsxLCA0LCAxLCAxfSwNCisgICAgezEsIDEsIDMsIDJ9LA0KKyAgICB7MSwgMiwgMywgMX0sDQorICAgIHsxLCAxLCAxLCA0fSwNCisgICAgezEsIDMsIDEsIDJ9LA0KKyAgICB7MSwgMiwgMSwgM30sDQorICAgIHszLCAxLCAxLCAyfSwNCisgICAgezEsIDEsIDIsIDN9LA0KKyAgICB7MSwgMiwgMiwgMn0sDQorICAgIHsyLCAyLCAxLCAyfSwNCisgICAgezEsIDEsIDQsIDF9LA0KKyAgICB7MiwgMywgMSwgMX0sDQorICAgIHsxLCAzLCAyLCAxfSwNCisgICAgezQsIDEsIDEsIDF9LA0KKyAgICB7MiwgMSwgMywgMX0sDQorICAgIHszLCAxLCAyLCAxfSwNCisgICAgezIsIDEsIDEsIDN9DQorfTsNCitDQkNfT25lRGltUmVhZGVyOjpDQkNfT25lRGltUmVhZGVyKCkNCit7DQorfQ0KK0NCQ19PbmVEaW1SZWFkZXI6On5DQkNfT25lRGltUmVhZGVyKCkNCit7DQorfQ0KK0NGWF9JbnQzMkFycmF5ICpDQkNfT25lRGltUmVhZGVyOjpGaW5kU3RhcnRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfQk9PTCBmb3VuZFN0YXJ0ID0gRkFMU0U7DQorICAgIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlID0gTlVMTDsNCisgICAgQ0ZYX0ludDMyQXJyYXkgc3RhcnRFbmRQYXR0ZXJuOw0KKyAgICBzdGFydEVuZFBhdHRlcm4uU2V0U2l6ZSgzKTsNCisgICAgc3RhcnRFbmRQYXR0ZXJuWzBdID0gU1RBUlRfRU5EX1BBVFRFUk5bMF07DQorICAgIHN0YXJ0RW5kUGF0dGVyblsxXSA9IFNUQVJUX0VORF9QQVRURVJOWzFdOw0KKyAgICBzdGFydEVuZFBhdHRlcm5bMl0gPSBTVEFSVF9FTkRfUEFUVEVSTlsyXTsNCisgICAgRlhfSU5UMzIgbmV4dFN0YXJ0ID0gMDsNCisgICAgd2hpbGUgKCFmb3VuZFN0YXJ0KSB7DQorICAgICAgICBpZihzdGFydFJhbmdlICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgc3RhcnRSYW5nZTsNCisgICAgICAgICAgICBzdGFydFJhbmdlID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHN0YXJ0UmFuZ2UgPSBGaW5kR3VhcmRQYXR0ZXJuKHJvdywgbmV4dFN0YXJ0LCBGQUxTRSwgJnN0YXJ0RW5kUGF0dGVybiwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBGWF9JTlQzMiBzdGFydCA9ICgqc3RhcnRSYW5nZSlbMF07DQorICAgICAgICBuZXh0U3RhcnQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KKyAgICAgICAgaWYgKHN0YXJ0IDw9IDEpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIHF1aWV0U3RhcnQgPSBzdGFydCAtIChuZXh0U3RhcnQgLSBzdGFydCk7DQorICAgICAgICBpZiAocXVpZXRTdGFydCA+PSAwKSB7DQorICAgICAgICAgICAgRlhfQk9PTCBib29UID0gcm93LT5Jc1JhbmdlKHF1aWV0U3RhcnQsIHN0YXJ0LCBGQUxTRSwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgIGZvdW5kU3RhcnQgPSBib29UOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBzdGFydFJhbmdlOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVSb3coRlhfSU5UMzIgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0ludDMyQXJyYXkqIFN0YXJ0UGF0dGVybiA9IEZpbmRTdGFydEd1YXJkUGF0dGVybihyb3csIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IHJlc3VsdChTdGFydFBhdHRlcm4pOw0KKyAgICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gRGVjb2RlUm93KHJvd051bWJlciwgcm93LCByZXN1bHQuZ2V0KCksIGhpbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVEaW1SZWFkZXI6OkRlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRHdWFyZFJhbmdlLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIEZYX0lOVDMyIGVuZFN0YXJ0ID0gRGVjb2RlTWlkZGxlKHJvdywgc3RhcnRHdWFyZFJhbmdlLCByZXN1bHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBGWF9CT09MIGIgPSBDaGVja0NoZWNrc3VtKHJlc3VsdCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIGlmICghYikgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQorRlhfQk9PTCBDQkNfT25lRGltUmVhZGVyOjpDaGVja0NoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0JPT0wgdGVtcCA9IENoZWNrU3RhbmRhcmRVUENFQU5DaGVja3N1bShzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZURpbVJlYWRlcjo6Q2hlY2tTdGFuZGFyZFVQQ0VBTkNoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIGxlbmd0aCA9IHMuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChsZW5ndGggPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHN1bSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IGxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7DQorICAgICAgICBGWF9JTlQzMiBkaWdpdCA9IChGWF9JTlQzMikgc1tpXSAtIChGWF9JTlQzMikgJzAnOw0KKyAgICAgICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+IDkpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3VtICs9IGRpZ2l0Ow0KKyAgICB9DQorICAgIHN1bSAqPSAzOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSBsZW5ndGggLSAxOyBqID49IDA7IGogLT0gMikgew0KKyAgICAgICAgRlhfSU5UMzIgZGlnaXQgPSAoRlhfSU5UMzIpIHNbal0gLSAoRlhfSU5UMzIpICcwJzsNCisgICAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHN1bSArPSBkaWdpdDsNCisgICAgfQ0KKyAgICByZXR1cm4gc3VtICUgMTAgPT0gMDsNCit9DQorQ0ZYX0ludDMyQXJyYXkgKkNCQ19PbmVEaW1SZWFkZXI6OkRlY29kZUVuZChDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywgRlhfSU5UMzIgZW5kU3RhcnQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0ludDMyQXJyYXkgc3RhcnRFbmRQYXR0ZXJuOw0KKyAgICBzdGFydEVuZFBhdHRlcm4uQWRkKFNUQVJUX0VORF9QQVRURVJOWzBdKTsNCisgICAgc3RhcnRFbmRQYXR0ZXJuLkFkZChTVEFSVF9FTkRfUEFUVEVSTlsxXSk7DQorICAgIHN0YXJ0RW5kUGF0dGVybi5BZGQoU1RBUlRfRU5EX1BBVFRFUk5bMl0pOw0KKyAgICBDRlhfSW50MzJBcnJheSogRmluZEd1YXJkID0gRmluZEd1YXJkUGF0dGVybihyb3csIGVuZFN0YXJ0LCBGQUxTRSwgJnN0YXJ0RW5kUGF0dGVybiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIEZpbmRHdWFyZDsNCit9DQorQ0ZYX0ludDMyQXJyYXkgKkNCQ19PbmVEaW1SZWFkZXI6OkZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyIHJvd09mZnNldCwgRlhfQk9PTCB3aGl0ZUZpcnN0LCBDRlhfSW50MzJBcnJheSAqcGF0dGVybiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi0+R2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCisgICAgY291bnRlcnMuU2V0U2l6ZShwYXR0ZXJuTGVuZ3RoKTsNCisgICAgRlhfSU5UMzIgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgICAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICAgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KKyAgICAgICAgaXNXaGl0ZSA9ICFyb3ctPkdldChyb3dPZmZzZXQpOw0KKyAgICAgICAgaWYgKHdoaXRlRmlyc3QgPT0gaXNXaGl0ZSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcm93T2Zmc2V0Kys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY291bnRlclBvc2l0aW9uID0gMDsNCisgICAgRlhfSU5UMzIgcGF0dGVyblN0YXJ0ID0gcm93T2Zmc2V0Ow0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSByb3dPZmZzZXQ7IHggPCB3aWR0aDsgeCsrKSB7DQorICAgICAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoeCk7DQorICAgICAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQorICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQorICAgICAgICAgICAgICAgIGlmIChQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgmY291bnRlcnMsICYoKnBhdHRlcm4pWzBdLCBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSkgPCBNQVhfQVZHX1ZBUklBTkNFKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5KCk7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQtPlNldFNpemUoMik7DQorICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQorICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMV0gPSB4Ow0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgY291bnRlcnNbeSAtIDJdID0gY291bnRlcnNbeV07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDJdID0gMDsNCisgICAgICAgICAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDFdID0gMDsNCisgICAgICAgICAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0JDX09uZURpbVJlYWRlcjo6RGVjb2RlRGlnaXQoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgRlhfSU5UMzIgcm93T2Zmc2V0LCBjb25zdCBGWF9JTlQzMiogcGF0dGVybnMsIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgUmVjb3JkUGF0dGVybihyb3csIHJvd09mZnNldCwgY291bnRlcnMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIEZYX0lOVDMyIGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQorICAgIEZYX0lOVDMyIGJlc3RNYXRjaCA9IC0xOw0KKyAgICBGWF9JTlQzMiBtYXggPSBwYXR0ZXJuTGVuZ3RoOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIHZhcmlhbmNlID0gUGF0dGVybk1hdGNoVmFyaWFuY2UoY291bnRlcnMsICZwYXR0ZXJuc1tpICogNF0sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKTsNCisgICAgICAgIGlmICh2YXJpYW5jZSA8IGJlc3RWYXJpYW5jZSkgew0KKyAgICAgICAgICAgIGJlc3RWYXJpYW5jZSA9IHZhcmlhbmNlOw0KKyAgICAgICAgICAgIGJlc3RNYXRjaCA9IGk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJlc3RNYXRjaCA+PSAwKSB7DQorICAgICAgICByZXR1cm4gYmVzdE1hdGNoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZURpbVdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lRGltV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjBlYjYxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZURpbVdyaXRlci5jcHAKQEAgLTAsMCArMSwzOTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Xcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEaW1Xcml0ZXIuaCINCitDQkNfT25lRGltV3JpdGVyOjpDQkNfT25lRGltV3JpdGVyKCkNCit7DQorICAgIG1fbG9jVGV4dExvYwkJCT0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDsNCisgICAgbV9iUHJpbnRDaGVja3N1bQkJPSBUUlVFOw0KKyAgICBtX2lEYXRhTGVudGgJCQk9IDA7DQorICAgIG1fYkNhbGNDaGVja3N1bQkJCT0gRkFMU0U7DQorICAgIG1fcEZvbnQJCQkJCT0gTlVMTDsNCisgICAgbV9mRm9udFNpemUJCQkJPSAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsNCisgICAgbV9pRm9udFN0eWxlCQkJPSAwOw0KKyAgICBtX2ZvbnRDb2xvcgkJCQk9IDB4ZmYwMDAwMDA7DQorICAgIG1faUNvbnRlbnRMZW4JCQk9IDA7DQorICAgIG1fYkxlZnRQYWRkaW5nCQkJPSBGQUxTRTsNCisgICAgbV9iUmlnaHRQYWRkaW5nCQkJPSBGQUxTRTsNCisgICAgbV9vdXRwdXQgICAgICAgICAgICAgICAgPSBOVUxMOw0KK30NCitDQkNfT25lRGltV3JpdGVyOjp+Q0JDX09uZURpbVdyaXRlcigpDQorew0KKyAgICBpZiAobV9vdXRwdXQgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fb3V0cHV0Ow0KKyAgICAgICAgbV9vdXRwdXQgPSBOVUxMOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKQ0KK3sNCisgICAgbV9iUHJpbnRDaGVja3N1bSA9IGNoZWNrc3VtOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKQ0KK3sNCisgICAgbV9pRGF0YUxlbnRoID0gbGVuZ3RoOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldENhbGNDaGVja3N1bShGWF9JTlQzMiBzdGF0ZSkNCit7DQorICAgIG1fYkNhbGNDaGVja3N1bSA9IHN0YXRlOw0KK30NCitGWF9CT09MCUNCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnQoQ0ZYX0ZvbnQgKiBjRm9udCkNCit7DQorICAgIGlmIChjRm9udCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9wRm9udCA9IGNGb250Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKQ0KK3sNCisgICAgbV9mRm9udFNpemUgPSBzaXplOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnRTdHlsZShGWF9JTlQzMiBzdHlsZSkNCit7DQorICAgIG1faUZvbnRTdHlsZSA9IHN0eWxlOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKQ0KK3sNCisgICAgbV9mb250Q29sb3IgPSBjb2xvcjsNCit9DQorRlhfV0NIQVIgQ0JDX09uZURpbVdyaXRlcjo6VXBwZXIoRlhfV0NIQVIgY2gpDQorew0KKyAgICBpZihjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7DQorICAgICAgICBjaCA9IGNoIC0gKCdhJyAtICdBJyk7DQorICAgIH0NCisgICAgcmV0dXJuIGNoOw0KK30NCitGWF9CWVRFKiBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfQllURSAqcmV0ID0gTlVMTDsNCisgICAgb3V0SGVpZ2h0ID0gMTsNCisgICAgaWYgKG1fV2lkdGggPj0gMjApIHsNCisgICAgICAgIHJldCA9IEVuY29kZShjb250ZW50cywgb3V0V2lkdGgsIGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgZSk7DQorICAgIH0NCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGWF9CWVRFICpDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9CWVRFICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorRlhfSU5UMzIgQ0JDX09uZURpbVdyaXRlcjo6QXBwZW5kUGF0dGVybihGWF9CWVRFKiB0YXJnZXQsIEZYX0lOVDMyIHBvcywgY29uc3QgRlhfSU5UMzIqIHBhdHRlcm4gLCBGWF9JTlQzMiBwYXR0ZXJuTGVuZ3RoLCBGWF9JTlQzMiBzdGFydENvbG9yLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChzdGFydENvbG9yICE9IDAgJiYgc3RhcnRDb2xvciAhPSAxKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25WYWx1ZU11c3RCZUVpdGhlcjBvcjE7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9CWVRFIGNvbG9yID0gKEZYX0JZVEUpIHN0YXJ0Q29sb3I7DQorICAgIEZYX0lOVDMyIG51bUFkZGVkID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHBhdHRlcm5MZW5ndGg7IGkrKykgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IHBhdHRlcm5baV07IGorKykgew0KKyAgICAgICAgICAgIHRhcmdldFtwb3NdID0gY29sb3I7DQorICAgICAgICAgICAgcG9zICs9IDE7DQorICAgICAgICAgICAgbnVtQWRkZWQgKz0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGNvbG9yIF49IDE7DQorICAgIH0NCisgICAgcmV0dXJuIG51bUFkZGVkOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OkNhbGNUZXh0SW5mbyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmdGV4dCwgRlhURVhUX0NIQVJQT1MgKmNoYXJQb3MsIENGWF9Gb250ICpjRm9udCwgRlhfRkxPQVQgZ2VXaWR0aCwgRlhfSU5UMzIgZm9udFNpemUsIEZYX0ZMT0FUICZjaGFyc0xlbikNCit7DQorI2lmZGVmIEZYRk1fRU5DT0RJTkdfTk9ORQ0KKyAgICBJRlhfRm9udEVuY29kaW5nRXgqIGVuY29kaW5nID0gRlhfQ3JlYXRlRm9udEVuY29kaW5nRXgoY0ZvbnQpOw0KKyNlbHNlDQorICAgIElGWF9Gb250RW5jb2RpbmcgKiBlbmNvZGluZyA9IEZYR0VfQ3JlYXRlVW5pY29kZUVuY29kaW5nKGNGb250KTsNCisjZW5kaWYNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgICAgRlhfRFdPUkQgKnBDaGFyQ29kZSA9IEZYX0FsbG9jKEZYX0RXT1JELCB0ZXh0LkdldExlbmd0aCgpKTsNCisgICAgRlhfRkxPQVQgY2hhcldpZHRoID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IHRleHQuR2V0TGVuZ3RoKCk7IGorKykgew0KKyAgICAgICAgcENoYXJDb2RlW2pdID0gZW5jb2RpbmctPkNoYXJDb2RlRnJvbVVuaWNvZGUodGV4dFtqXSk7DQorICAgICAgICBGWF9JTlQzMiBnbHlwX2NvZGUgPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJDb2RlW2pdKTsNCisgICAgICAgIEZYX0lOVDMyIGdseXBfdmFsdWUgPSBjRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwX2NvZGUpOw0KKyAgICAgICAgRlhfRkxPQVQgdGVtcCA9IChGWF9GTE9BVCkoKGdseXBfdmFsdWUpICogZm9udFNpemUgLyAxMDAwLjApOw0KKyAgICAgICAgY2hhcldpZHRoICs9IHRlbXA7DQorICAgIH0NCisgICAgY2hhcnNMZW4gPSBjaGFyV2lkdGg7DQorICAgIEZYX0ZMT0FUIGxlZnRQb3NpdG9uID0gKEZYX0ZMT0FUKShnZVdpZHRoIC0gY2hhcnNMZW4pIC8gMi4wZjsNCisgICAgaWYgKGxlZnRQb3NpdG9uIDwgMCAmJiBnZVdpZHRoID09IDApIHsNCisgICAgICAgIGxlZnRQb3NpdG9uID0gMDsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBwZW5YID0gMC4wOw0KKyAgICBGWF9GTE9BVCBwZW5ZID0gKEZYX0ZMT0FUKUZYU1lTX2FicyhjRm9udC0+R2V0RGVzY2VudCgpKSAqIChGWF9GTE9BVClmb250U2l6ZSAvIDEwMDAuMGY7DQorICAgIEZYX0ZMT0FUIGxlZnQgPSBsZWZ0UG9zaXRvbjsNCisgICAgRlhfRkxPQVQgdG9wICA9IDAuMDsNCisgICAgY2hhclBvc1swXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCisgICAgY2hhclBvc1swXS5tX09yaWdpblkgPSBwZW5ZICsgdG9wOw0KKyAgICBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleCA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwQ2hhckNvZGVbMF0pOw0KKyAgICBjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4KTsNCisjaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfDQorICAgIGNoYXJQb3NbMF0ubV9FeHRHSUQgPSBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleDsNCisjZW5kaWYNCisgICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoKSAqIChGWF9GTE9BVClmb250U2l6ZSAvIDEwMDAuMGY7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgew0KKyAgICAgICAgY2hhclBvc1tpXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCisgICAgICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCisgICAgICAgIGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBDaGFyQ29kZVtpXSk7DQorICAgICAgICBjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4KTsNCisjaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfDQorICAgICAgICBjaGFyUG9zW2ldLm1fRXh0R0lEID0gY2hhclBvc1tpXS5tX0dseXBoSW5kZXg7DQorI2VuZGlmDQorICAgICAgICBwZW5YICs9IChGWF9GTE9BVCkoY2hhclBvc1tpXS5tX0ZvbnRDaGFyV2lkdGgpICogKEZYX0ZMT0FUKWZvbnRTaXplIC8gMTAwMC4wZjsNCisgICAgfQ0KKyAgICBGWF9GcmVlIChwQ2hhckNvZGUpOw0KKyAgICBkZWxldGUgZW5jb2Rpbmc7DQorICAgIGVuY29kaW5nID0gTlVMTDsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSAqZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwgRlhfRkxPQVQgZ2VXaWR0aCwgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBGWF9GTE9BVCBsb2NYLCBGWF9GTE9BVCBsb2NZLCAgRlhfSU5UMzIgYmFyV2lkdGgpDQorew0KKyAgICBGWF9JTlQzMiBpRm9udFNpemUgPSAoRlhfSU5UMzIpZmFicyhtX2ZGb250U2l6ZSk7DQorICAgIEZYX0lOVDMyIGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsNCisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsb2NYLCAoRlhfRkxPQVQpbG9jWSwgKEZYX0ZMT0FUKShsb2NYICsgZ2VXaWR0aCksIChGWF9GTE9BVCkobG9jWSArIGlUZXh0SGVpZ2h0KSk7DQorICAgIGlmIChnZVdpZHRoICE9IG1fV2lkdGgpIHsNCisgICAgICAgIHJlY3QucmlnaHQgLT0gMTsNCisgICAgfQ0KKyAgICBtYXRyaXgtPlRyYW5zZm9ybVJlY3QocmVjdCk7DQorICAgIEZYX1JFQ1QgcmUgPSByZWN0LkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVClsb2NYLCAoRlhfRkxPQVQpKGxvY1kgKyBpRm9udFNpemUpKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgICBhZmZpbmVfbWF0cml4LkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBGWF9CT09MIHJldCA9IGRldmljZS0+RHJhd05vcm1hbFRleHQoc3RyLkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2hvd0JpdG1hcENoYXJzKENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgc3RyLCBGWF9GTE9BVCBnZVdpZHRoLCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIEZYX0ZMT0FUIGxvY1gsIEZYX0ZMT0FUIGxvY1ksIEZYX0lOVDMyIGJhcldpZHRoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUZvbnRTaXplID0gKEZYX0lOVDMyKWZhYnMobV9mRm9udFNpemUpOw0KKyAgICBGWF9JTlQzMiBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICAgIENGWF9GeGdlRGV2aWNlIGdlOw0KKyAgICBnZS5DcmVhdGUoKGludClnZVdpZHRoLCBpVGV4dEhlaWdodCAsIG1fY29sb3JTcGFjZSk7DQorICAgIEZYX1JFQ1QgZ2VSZWN0KDAsIDAsIChpbnQpZ2VXaWR0aCwgaVRleHRIZWlnaHQpOw0KKyAgICBnZS5GaWxsUmVjdCgmZ2VSZWN0LCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsIChGWF9GTE9BVClpRm9udFNpemUpOw0KKyAgICBGWF9CT09MIHJldCA9IGdlLkRyYXdOb3JtYWxUZXh0KHN0ci5HZXRMZW5ndGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIChpbnQpbG9jWCwgKGludClsb2NZKTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTaG93Q2hhcnMoRlhfV1NUUiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlICpkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgYmFyV2lkdGgsIEZYX0lOVDMyIG11bHRpcGxlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAobV9wRm9udCA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsNCisgICAgRlhfSU5UMzIgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsNCisgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgICBpZiAoIXBDaGFyUG9zKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuKTsNCisgICAgRlhfRkxPQVQgY2hhcnNMZW4gPSAwOw0KKyAgICBGWF9GTE9BVCBnZVdpZHRoID0gMDsNCisgICAgaWYgKCBtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfQUJPVkVFTUJFRCB8fA0KKyAgICAgICAgICAgIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEICkgew0KKyAgICAgICAgZ2VXaWR0aCA9IDA7DQorICAgIH0gZWxzZSBpZiAoIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19BQk9WRSB8fA0KKyAgICAgICAgICAgICAgICBtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfQkVMT1cgKSB7DQorICAgICAgICBnZVdpZHRoID0gKEZYX0ZMT0FUKWJhcldpZHRoOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlGb250U2l6ZSA9IChGWF9JTlQzMilmYWJzKG1fZkZvbnRTaXplKTsNCisgICAgRlhfSU5UMzIgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KKyAgICBDYWxjVGV4dEluZm8oc3RyLCBwQ2hhclBvcywgbV9wRm9udCwgZ2VXaWR0aCwgaUZvbnRTaXplLCBjaGFyc0xlbik7DQorICAgIGlmIChjaGFyc0xlbiA8IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBsb2NYID0gMDsNCisgICAgRlhfSU5UMzIgbG9jWSA9IDA7DQorICAgIHN3aXRjaCAobV9sb2NUZXh0TG9jKSB7DQorICAgICAgICBjYXNlIEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ6DQorICAgICAgICAgICAgbG9jWCA9IChGWF9JTlQzMikoYmFyV2lkdGggLSBjaGFyc0xlbikgLyAyOw0KKyAgICAgICAgICAgIGxvY1kgPSAwOw0KKyAgICAgICAgICAgIGdlV2lkdGggPSBjaGFyc0xlbjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgQkNfVEVYVF9MT0NfQUJPVkU6DQorICAgICAgICAgICAgbG9jWCA9IDA7DQorICAgICAgICAgICAgbG9jWSA9IDA7DQorICAgICAgICAgICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDoNCisgICAgICAgICAgICBsb2NYID0gKEZYX0lOVDMyKShiYXJXaWR0aCAtIGNoYXJzTGVuKSAvIDI7DQorICAgICAgICAgICAgbG9jWSA9IG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQ7DQorICAgICAgICAgICAgZ2VXaWR0aCA9IGNoYXJzTGVuOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCQ19URVhUX0xPQ19CRUxPVzoNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgbG9jWCA9IDA7DQorICAgICAgICAgICAgbG9jWSA9IG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQ7DQorICAgICAgICAgICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoZGV2aWNlICE9IE5VTEwpIHsNCisgICAgICAgIFNob3dEZXZpY2VDaGFycyhkZXZpY2UsIG1hdHJpeCwgc3RyLCBnZVdpZHRoLCBwQ2hhclBvcywgKEZYX0ZMT0FUKWxvY1gsIChGWF9GTE9BVClsb2NZLCBiYXJXaWR0aCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBTaG93Qml0bWFwQ2hhcnMocE91dEJpdG1hcCwgc3RyLCBnZVdpZHRoLCBwQ2hhclBvcywgKEZYX0ZMT0FUKWxvY1gsIChGWF9GTE9BVClsb2NZLCBiYXJXaWR0aCk7DQorICAgIH0NCisgICAgRlhfRnJlZShwQ2hhclBvcyk7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX1dTVFIgY29udGVudHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKG1fb3V0cHV0ID09IE5VTEwpIHsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIHBPdXRCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChtX291dHB1dC0+R2V0V2lkdGgoKSwgbV9vdXRwdXQtPkdldEhlaWdodCgpKTsNCisgICAgcE91dEJpdG1hcC0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBpZiAoIXBPdXRCaXRtYXApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZhaWxUb0NyZWF0ZUJpdG1hcDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB5ID0gMDsgeSA8IG1fb3V0cHV0LT5HZXRIZWlnaHQoKTsgeSsrKSB7DQorICAgICAgICAgICAgaWYgKG1fb3V0cHV0LT5HZXQoeCwgeSkpIHsNCisgICAgICAgICAgICAgICAgcE91dEJpdG1hcC0+U2V0UGl4ZWwoeCwgeSwgbV9iYXJDb2xvcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspDQorICAgICAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgIT0gJyAnKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIGlmIChtX2xvY1RleHRMb2MgIT0gQkNfVEVYVF9MT0NfTk9ORSAmJiBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgIFNob3dDaGFycyhjb250ZW50cywgcE91dEJpdG1hcCwgTlVMTCwgTlVMTCwgbV9iYXJXaWR0aCwgbV9tdWx0aXBsZSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBDRlhfRElCaXRtYXAgKiBwU3RyZXRjaEJpdG1hcCA9IHBPdXRCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7DQorICAgIGlmIChwT3V0Qml0bWFwKSB7DQorICAgICAgICBkZWxldGUgcE91dEJpdG1hcDsNCisgICAgfQ0KKyAgICBwT3V0Qml0bWFwID0gcFN0cmV0Y2hCaXRtYXA7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyRGV2aWNlUmVzdWx0KENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LCBGWF9XU1RSIGNvbnRlbnRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChtX291dHB1dCA9PSBOVUxMKSB7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgICBDRlhfUGF0aERhdGEgcGF0aDsNCisgICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBkZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBtYXRyaXgsICZzdGF0ZURhdGEsIG1fYmFja2dyb3VuZENvbG9yLCBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7DQorICAgIENGWF9NYXRyaXggbWF0cmkobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAoRlhfRkxPQVQpbV9IZWlnaHQsIDAuMCwgMC4wKTsNCisgICAgbWF0cmkuQ29uY2F0KCptYXRyaXgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB5ID0gMDsgeSA8IG1fb3V0cHV0LT5HZXRIZWlnaHQoKTsgeSsrKSB7DQorICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHJlY3Q7DQorICAgICAgICAgICAgcmVjdC5BcHBlbmRSZWN0KChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgKEZYX0ZMT0FUKSh4ICsgMSksIChGWF9GTE9BVCkoeSArIDEpKTsNCisgICAgICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgICAgICAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICAgICAgICAgIGRldmljZS0+RHJhd1BhdGgoJnJlY3QsICZtYXRyaSwgJnN0YXRlRGF0YSwgbV9iYXJDb2xvciwgMCwgRlhGSUxMX1dJTkRJTkcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQ0KKyAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpICE9ICcgJykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICBpZiAobV9sb2NUZXh0TG9jICE9IEJDX1RFWFRfTE9DX05PTkUgJiYgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQorICAgICAgICBTaG93Q2hhcnMoY29udGVudHMsIE5VTEwsIGRldmljZSwgbWF0cml4LCBtX2JhcldpZHRoLCBtX211bHRpcGxlLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsICBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChjb2RlTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgaWYgKG1fTW9kdWxlSGVpZ2h0IDwgMjAuMCkgew0KKyAgICAgICAgbV9Nb2R1bGVIZWlnaHQgPSAyMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBjb2RlT2xkTGVuZ3RoID0gY29kZUxlbmd0aDsNCisgICAgRlhfSU5UMzIgbGVmdFBhZGRpbmcgPSAwOw0KKyAgICBGWF9JTlQzMiByaWdodFBhZGRpbmcgPSAwOw0KKyAgICBpZiAobV9iTGVmdFBhZGRpbmcpIHsNCisgICAgICAgIGxlZnRQYWRkaW5nID0gNzsNCisgICAgfQ0KKyAgICBpZiAobV9iUmlnaHRQYWRkaW5nKSB7DQorICAgICAgICByaWdodFBhZGRpbmcgPSA3Ow0KKyAgICB9DQorICAgIGNvZGVMZW5ndGggKz0gbGVmdFBhZGRpbmc7DQorICAgIGNvZGVMZW5ndGggKz0gcmlnaHRQYWRkaW5nOw0KKyAgICBtX291dHB1dEhTY2FsZSA9IDEuMDsNCisgICAgaWYgKG1fV2lkdGggPiAwKSB7DQorICAgICAgICBtX291dHB1dEhTY2FsZSA9IChGWF9GTE9BVCltX1dpZHRoIC8gKEZYX0ZMT0FUKWNvZGVMZW5ndGg7DQorICAgIH0NCisgICAgaWYgKCFpc0RldmljZSkgew0KKyAgICAgICAgbV9vdXRwdXRIU2NhbGUgPSBGWF9NQVgobV9vdXRwdXRIU2NhbGUsIG1fTW9kdWxlV2lkdGgpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGRhdGFMZW5ndGhTY2FsZSA9IDEuMDsNCisgICAgaWYgKG1faURhdGFMZW50aCA+IDAgJiYgY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gMCkgew0KKyAgICAgICAgZGF0YUxlbmd0aFNjYWxlID0gRlhfRkxPQVQoY29udGVudHMuR2V0TGVuZ3RoKCkpIC8gRlhfRkxPQVQobV9pRGF0YUxlbnRoKTsNCisgICAgfQ0KKyAgICBpZiAobV9pRGF0YUxlbnRoID4gMCAmJiBjb250ZW50cy5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgICAgICBkYXRhTGVuZ3RoU2NhbGUgPSBGWF9GTE9BVCgxKSAvIEZYX0ZMT0FUKG1faURhdGFMZW50aCk7DQorICAgIH0NCisgICAgbV9tdWx0aXBsZSA9IDE7DQorICAgIGlmICghaXNEZXZpY2UpIHsNCisgICAgICAgIG1fbXVsdGlwbGUgPSAoRlhfSU5UMzIpY2VpbChtX291dHB1dEhTY2FsZSAqIGRhdGFMZW5ndGhTY2FsZSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgb3V0cHV0SGVpZ2h0ID0gMTsNCisgICAgaWYgKCFpc0RldmljZSkgew0KKyAgICAgICAgaWYgKG1fSGVpZ2h0ID09IDApIHsNCisgICAgICAgICAgICBvdXRwdXRIZWlnaHQgPSBGWF9NQVgoMjAsIG1fTW9kdWxlSGVpZ2h0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgb3V0cHV0SGVpZ2h0ID0gbV9IZWlnaHQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgb3V0cHV0V2lkdGggPSBjb2RlTGVuZ3RoOw0KKyAgICBpZiAoIWlzRGV2aWNlKSB7DQorICAgICAgICBvdXRwdXRXaWR0aCA9IChGWF9JTlQzMikoY29kZUxlbmd0aCAqIG1fbXVsdGlwbGUgLyBkYXRhTGVuZ3RoU2NhbGUpOw0KKyAgICB9DQorICAgIG1fYmFyV2lkdGggPSBtX1dpZHRoOw0KKyAgICBpZiAoIWlzRGV2aWNlKSB7DQorICAgICAgICBtX2JhcldpZHRoID0gY29kZUxlbmd0aCAqIG1fbXVsdGlwbGU7DQorICAgIH0NCisgICAgbV9vdXRwdXQgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCisgICAgbV9vdXRwdXQtPkluaXQob3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7DQorICAgIEZYX0lOVDMyIG91dHB1dFggPSBsZWZ0UGFkZGluZyAqIG1fbXVsdGlwbGU7DQorICAgIGZvciAoRlhfSU5UMzIgaW5wdXRYID0gMDsgaW5wdXRYIDwgY29kZU9sZExlbmd0aDsgaW5wdXRYKyspIHsNCisgICAgICAgIGlmIChjb2RlW2lucHV0WF0gPT0gMSkgew0KKyAgICAgICAgICAgIGlmIChvdXRwdXRYID49IG91dHB1dFdpZHRoICkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG91dHB1dFggKyBtX211bHRpcGxlID4gb3V0cHV0V2lkdGggJiYgb3V0cHV0V2lkdGggLSBvdXRwdXRYID4gMCkgew0KKyAgICAgICAgICAgICAgICBtX291dHB1dC0+U2V0UmVnaW9uKG91dHB1dFgsIDAsIG91dHB1dFdpZHRoIC0gb3V0cHV0WCAsIG91dHB1dEhlaWdodCwgZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX291dHB1dC0+U2V0UmVnaW9uKG91dHB1dFgsIDAsIG1fbXVsdGlwbGUsIG91dHB1dEhlaWdodCwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9DQorICAgICAgICBvdXRwdXRYICs9IG1fbXVsdGlwbGU7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RhQmFyUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kYUJhclJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyZjkzOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kYUJhclJlYWRlci5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGUzOVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGFCYXJSZWFkZXIuaCINCitGWF9MUENTVFIgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpBTFBIQUJFVF9TVFJJTkcgPSAiMDEyMzQ1Njc4OS0kOi8uK0FCQ0RUTiI7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTWzIyXSA9IHsNCisgICAgMHgwMDMsIDB4MDA2LCAweDAwOSwgMHgwNjAsIDB4MDEyLCAweDA0MiwgMHgwMjEsIDB4MDI0LCAweDAzMCwgMHgwNDgsDQorICAgIDB4MDBjLCAweDAxOCwgMHgwNDUsIDB4MDUxLCAweDA1NCwgMHgwMTUsIDB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFLA0KKyAgICAweDAxQSwgMHgwMjkNCit9Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6bWluQ2hhcmFjdGVyTGVuZ3RoID0gMzsNCitjb25zdCBGWF9DSEFSIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6U1RBUlRFTkRfRU5DT0RJTkdbOF0gPSB7J0UnLCAnKicsICdBJywgJ0InLCAnQycsICdEJywgJ1QnLCAnTid9Ow0KK0NCQ19PbmVkQ29kYUJhclJlYWRlcjo6Q0JDX09uZWRDb2RhQmFyUmVhZGVyKCkNCit7DQorfQ0KK0NCQ19PbmVkQ29kYUJhclJlYWRlcjo6fkNCQ19PbmVkQ29kYUJhclJlYWRlcigpDQorew0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkRlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfSW50MzJBcnJheSAqaW50MzJQdHIgPSBGaW5kQXN0ZXJpc2tQYXR0ZXJuKHJvdywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiBzdGFydChpbnQzMlB0cik7DQorICAgICgqc3RhcnQpWzFdID0gMDsNCisgICAgRlhfSU5UMzIgbmV4dFN0YXJ0ID0gKCpzdGFydClbMV07DQorICAgIEZYX0lOVDMyIGVuZCA9IHJvdy0+R2V0U2l6ZSgpOw0KKyAgICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgICAgICBuZXh0U3RhcnQrKzsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgICBjb3VudGVycy5TZXRTaXplKDcpOw0KKyAgICBGWF9DSEFSIGRlY29kZWRDaGFyOw0KKyAgICBGWF9JTlQzMiBsYXN0U3RhcnQ7DQorICAgIGRvIHsNCisgICAgICAgIFJlY29yZFBhdHRlcm4ocm93LCBuZXh0U3RhcnQsICZjb3VudGVycywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICAgICAgZGVjb2RlZENoYXIgPSBUb05hcnJvd1dpZGVQYXR0ZXJuKCZjb3VudGVycyk7DQorICAgICAgICBpZiAoZGVjb2RlZENoYXIgPT0gJyEnKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0ICs9IGRlY29kZWRDaGFyOw0KKyAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0Ow0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IGNvdW50ZXJzW2ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKG5leHRTdGFydCA8IGVuZCAmJiAhcm93LT5HZXQobmV4dFN0YXJ0KSkgew0KKyAgICAgICAgICAgIG5leHRTdGFydCsrOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChuZXh0U3RhcnQgPCBlbmQpOw0KKyAgICBGWF9JTlQzMiBsYXN0UGF0dGVyblNpemUgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgIGxhc3RQYXR0ZXJuU2l6ZSArPSBjb3VudGVyc1tqXTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB3aGl0ZVNwYWNlQWZ0ZXJFbmQgPSBuZXh0U3RhcnQgLSBsYXN0U3RhcnQgLSBsYXN0UGF0dGVyblNpemU7DQorICAgIGlmIChuZXh0U3RhcnQgIT0gZW5kICYmICh3aGl0ZVNwYWNlQWZ0ZXJFbmQgLyAyIDwgbGFzdFBhdHRlcm5TaXplKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA8IDIpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIEZYX0NIQVIgc3RhcnRjaGFyID0gcmVzdWx0WzBdOw0KKyAgICBpZiAoIUFycmF5Q29udGFpbnMoU1RBUlRFTkRfRU5DT0RJTkcsIHN0YXJ0Y2hhcikpIHsNCisgICAgICAgIGUgPSAgQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgIHJldHVybiAiIjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBsZW4gPSByZXN1bHQuR2V0TGVuZ3RoKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSByZXN1bHQ7DQorICAgIGZvciAoRlhfSU5UMzIgayA9IDE7IGsgPCByZXN1bHQuR2V0TGVuZ3RoKCk7IGsrKykgew0KKyAgICAgICAgaWYgKEFycmF5Q29udGFpbnMoU1RBUlRFTkRfRU5DT0RJTkcsIHJlc3VsdFtrXSkpIHsNCisgICAgICAgICAgICBpZiAoKGsgKyAxKSAhPSByZXN1bHQuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LkRlbGV0ZSgxLCBrKTsNCisgICAgICAgICAgICAgICAgayA9IDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPCA1KSB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IHRlbXAuRmluZChyZXN1bHQuTWlkKDEsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpKTsNCisgICAgICAgIGlmIChpbmRleCA9PSBsZW4gLSAocmVzdWx0LkdldExlbmd0aCgpIC0gMSkpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA+IG1pbkNoYXJhY3Rlckxlbmd0aCkgew0KKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lk1pZCgxLCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9JbnQzMkFycmF5ICpDQkNfT25lZENvZGFCYXJSZWFkZXI6OkZpbmRBc3Rlcmlza1BhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgcm93T2Zmc2V0ID0gMDsNCisgICAgd2hpbGUgKHJvd09mZnNldCA8IHdpZHRoKSB7DQorICAgICAgICBpZiAocm93LT5HZXQocm93T2Zmc2V0KSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcm93T2Zmc2V0Kys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY291bnRlclBvc2l0aW9uID0gMDsNCisgICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICAgIGNvdW50ZXJzLlNldFNpemUoNyk7DQorICAgIEZYX0lOVDMyIHBhdHRlcm5TdGFydCA9IHJvd09mZnNldDsNCisgICAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGggPSBjb3VudGVycy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IHJvd09mZnNldDsgaSA8IHdpZHRoOyBpKyspIHsNCisgICAgICAgIEZYX0JPT0wgcGl4ZWwgPSByb3ctPkdldChpKTsNCisgICAgICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCisgICAgICAgICAgICAgICAgaWYgKEFycmF5Q29udGFpbnMoU1RBUlRFTkRfRU5DT0RJTkcsIFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYnRlbXAzID0gcm93LT5Jc1JhbmdlKEZYX01BWCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQorICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYnRlbXAzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgKnJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+U2V0U2l6ZSgyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzFdID0gaTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyc1swXSArIGNvdW50ZXJzWzFdOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHkgPSAyOyB5IDwgcGF0dGVybkxlbmd0aDsgeSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMl0gPSAwOw0KKyAgICAgICAgICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KKyAgICAgICAgICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjb3VudGVyUG9zaXRpb24rKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSA9IDE7DQorICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkFycmF5Q29udGFpbnMoY29uc3QgRlhfQ0hBUiBhcnJheVtdLCBGWF9DSEFSIGtleSkNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IDg7IGkrKykgew0KKyAgICAgICAgaWYoYXJyYXlbaV0gPT0ga2V5KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9DSEFSIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6VG9OYXJyb3dXaWRlUGF0dGVybihDRlhfSW50MzJBcnJheSAqY291bnRlcikNCit7DQorICAgIEZYX0lOVDMyIG51bUNvdW50ZXJzID0gY291bnRlci0+R2V0U2l6ZSgpOw0KKyAgICBpZiAobnVtQ291bnRlcnMgPCAxKSB7DQorICAgICAgICByZXR1cm4gJyEnOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGF2ZXJhZ2VDb3VudGVyID0gMDsNCisgICAgRlhfSU5UMzIgdG90YWxDb3VudGVycyA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgICAgICB0b3RhbENvdW50ZXJzICs9ICgqY291bnRlcilbaV07DQorICAgIH0NCisgICAgYXZlcmFnZUNvdW50ZXIgPSB0b3RhbENvdW50ZXJzIC8gbnVtQ291bnRlcnM7DQorICAgIEZYX0lOVDMyIHBhdHRlcm4gPSAwOw0KKyAgICBGWF9JTlQzMiB3aWRlQ291bnRlcnMgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbnVtQ291bnRlcnM7IGorKykgew0KKyAgICAgICAgaWYgKCgqY291bnRlcilbal0gPiBhdmVyYWdlQ291bnRlcikgew0KKyAgICAgICAgICAgIHBhdHRlcm4gfD0gMSA8PCAobnVtQ291bnRlcnMgLSAxIC0gaik7DQorICAgICAgICAgICAgd2lkZUNvdW50ZXJzKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCh3aWRlQ291bnRlcnMgPT0gMikgfHwgKHdpZGVDb3VudGVycyA9PSAzKSkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IDIyOyBrKyspIHsNCisgICAgICAgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1trXSA9PSBwYXR0ZXJuKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAoQUxQSEFCRVRfU1RSSU5HKVtrXTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuICchJzsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kYUJhcldyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkZjdjOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kYUJhcldyaXRlci5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Xcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kYUJhclJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RhQmFyV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorY29uc3QgRlhfQ0hBUiBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNUQVJUX0VORF9DSEFSU1tdID0geydBJywgJ0InLCAnQycsICdEJywgJ1QnLCAnTicsICcqJywgJ0UnLCAnYScsICdiJywgJ2MnLCAnZCcsICd0JywgJ24nLCAnZSd9Ow0KK2NvbnN0IEZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDT05URU5UX0NIQVJTW10gPSB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnLScsICckJywgJy8nLCAnOicsICcrJywgJy4nfTsNCitDQkNfT25lZENvZGFCYXJXcml0ZXI6OkNCQ19PbmVkQ29kYUJhcldyaXRlcigpDQorew0KKyAgICBtX2NoU3RhcnQJCQk9ICdBJzsNCisgICAgbV9jaEVuZAkJCQk9ICdCJzsNCisgICAgbV9pV2lkZU5hcnJSYXRpbwk9IDI7DQorfQ0KK0NCQ19PbmVkQ29kYUJhcldyaXRlcjo6fkNCQ19PbmVkQ29kYUJhcldyaXRlcigpDQorew0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc2l6ZW9mKFNUQVJUX0VORF9DSEFSUykgLyBzaXplb2YoRlhfQ0hBUik7IGkrKykgew0KKyAgICAgICAgaWYgKFNUQVJUX0VORF9DSEFSU1tpXSA9PSBzdGFydCkgew0KKyAgICAgICAgICAgIG1fY2hTdGFydCA9IHN0YXJ0Ow0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmQpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc2l6ZW9mKFNUQVJUX0VORF9DSEFSUykgLyBzaXplb2YoRlhfQ0hBUik7IGkrKykgew0KKyAgICAgICAgaWYgKFNUQVJUX0VORF9DSEFSU1tpXSA9PSBlbmQpIHsNCisgICAgICAgICAgICBtX2NoRW5kID0gZW5kOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKQ0KK3sNCisgICAgbV9pRGF0YUxlbnRoID0gbGVuZ3RoICsgMjsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikNCit7DQorICAgIGlmICggbG9jYXRpb24gPCBCQ19URVhUX0xPQ19OT05FIHx8IGxvY2F0aW9uID4gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldFdpZGVOYXJyb3dSYXRpbyhGWF9JTlQzMiByYXRpbykNCit7DQorICAgIGlmKHJhdGlvIDwgMiB8fCByYXRpbyA+IDMpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2lXaWRlTmFyclJhdGlvID0gcmF0aW87DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RmluZENoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgaXNDb250ZW50KQ0KK3sNCisgICAgaWYoaXNDb250ZW50KSB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDAgOyBpIDwgc2l6ZW9mKENPTlRFTlRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpIDsgaSsrKSB7DQorICAgICAgICAgICAgaWYoY2ggPT0gKEZYX1dDSEFSKUNPTlRFTlRfQ0hBUlNbaV0pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwIDsgaiA8IHNpemVvZihTVEFSVF9FTkRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpIDsgaisrKSB7DQorICAgICAgICAgICAgaWYoY2ggPT0gKEZYX1dDSEFSKVNUQVJUX0VORF9DSEFSU1tqXSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDAgOyBpIDwgc2l6ZW9mKENPTlRFTlRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpIDsgaSsrKSB7DQorICAgICAgICAgICAgaWYoY2ggPT0gKEZYX1dDSEFSKUNPTlRFTlRfQ0hBUlNbaV0pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShGWF9XU1RSIGNvbnRlbnRzKQ0KK3sNCisgICAgRlhfV0NIQVIgY2g7DQorICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCisgICAgICAgIGNoID0gY29udGVudHMuR2V0QXQoaW5kZXgpOw0KKyAgICAgICAgaWYgKEZpbmRDaGFyKGNoLCBGQUxTRSkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkZpbHRlckNvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgICAgRlhfV0NIQVIgY2g7DQorICAgIGZvciAoRlhfSU5UMzIgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpbmRleCArKykgew0KKyAgICAgICAgY2ggPSBjb250ZW50cy5HZXRBdChpbmRleCk7DQorICAgICAgICBpZihjaCA+IDE3NSkgew0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoRmluZENoYXIoY2gsIFRSVUUpKSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQorRlhfQllURSAqQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9CWVRFICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JZVEUgKkNCQ19PbmVkQ29kYUJhcldyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RBQkFSKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERUJBUjsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JZVEUgKnJldCA9IENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorRlhfQllURSogQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBGWF9JTlQzMiAmb3V0TGVuZ3RoLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19PbmVkQ29kYUJhclJlYWRlciBDb2RhQmFyUjsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZGF0YSA9IG1fY2hTdGFydCArIGNvbnRlbnRzICsgbV9jaEVuZDsNCisgICAgbV9pQ29udGVudExlbiA9IGRhdGEuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0JZVEUgKnJlc3VsdCA9IEZYX0FsbG9jKEZYX0JZVEUsIG1faVdpZGVOYXJyUmF0aW8gKiA3ICogZGF0YS5HZXRMZW5ndGgoKSk7DQorICAgIEZYX0NIQVIgY2g7DQorICAgIEZYX0lOVDMyIHBvc2l0aW9uID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5HZXRMZW5ndGgoKTsgaW5kZXgrKykgew0KKyAgICAgICAgY2ggPSBkYXRhLkdldEF0KGluZGV4KTsNCisgICAgICAgIGlmICgoKGNoID49ICdhJykgJiYgKGNoIDw9ICd6JykpKSB7DQorICAgICAgICAgICAgY2ggPSBjaCAtIDMyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChjaCkgew0KKyAgICAgICAgICAgIGNhc2UgJ1QnOg0KKyAgICAgICAgICAgICAgICBjaCA9ICdBJzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnTic6DQorICAgICAgICAgICAgICAgIGNoID0gJ0InOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcqJzoNCisgICAgICAgICAgICAgICAgY2ggPSAnQyc7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ0UnOg0KKyAgICAgICAgICAgICAgICBjaCA9ICdEJzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBjb2RlID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGxlbiA9ICAoRlhfSU5UMzIpc3RybGVuKENvZGFCYXJSLkFMUEhBQkVUX1NUUklORyk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoY2ggPT0gQ29kYUJhclIuQUxQSEFCRVRfU1RSSU5HW2ldKSB7DQorICAgICAgICAgICAgICAgIGNvZGUgPSBDb2RhQmFyUi5DSEFSQUNURVJfRU5DT0RJTkdTW2ldOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9CWVRFIGNvbG9yID0gMTsNCisgICAgICAgIEZYX0lOVDMyIGNvdW50ZXIgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgYml0ID0gMDsNCisgICAgICAgIHdoaWxlIChiaXQgPCA3KSB7DQorICAgICAgICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IGNvbG9yOw0KKyAgICAgICAgICAgIHBvc2l0aW9uKys7DQorICAgICAgICAgICAgaWYgKCgoY29kZSA+PiAoNiAtIGJpdCkpICYgMSkgPT0gMCB8fCBjb3VudGVyID09IG1faVdpZGVOYXJyUmF0aW8gLSAxKSB7DQorICAgICAgICAgICAgICAgIGNvbG9yID0gIWNvbG9yOw0KKyAgICAgICAgICAgICAgICBiaXQrKzsNCisgICAgICAgICAgICAgICAgY291bnRlciA9IDA7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY291bnRlcisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpbmRleCA8IGRhdGEuR2V0TGVuZ3RoKCkgLSAxKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IDA7DQorICAgICAgICAgICAgcG9zaXRpb24gKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgb3V0TGVuZ3RoID0gcG9zaXRpb247DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6ZW5jb2RlZENvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJTdGFydChtX2NoU3RhcnQpOw0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJFbmQobV9jaEVuZCk7DQorICAgIHJldHVybiBzdHJTdGFydCArIGNvbnRlbnRzICsgc3RyRW5kOw0KK30NCit2b2lkIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6UmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGVuY29kZWRDb250ZW50cyhjb250ZW50cyksIGNvZGUsIGNvZGVMZW5ndGgsIGlzRGV2aWNlLCBlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RlMTI4UmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kZTEyOFJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczY2U3YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kZTEyOFJlYWRlci5jcHAKQEAgLTAsMCArMSw0MTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFJlYWRlci5oIg0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1sxMDddWzddID0gIHsNCisgICAgezIsIDEsIDIsIDIsIDIsIDIsIDB9LA0KKyAgICB7MiwgMiwgMiwgMSwgMiwgMiwgMH0sDQorICAgIHsyLCAyLCAyLCAyLCAyLCAxLCAwfSwNCisgICAgezEsIDIsIDEsIDIsIDIsIDMsIDB9LA0KKyAgICB7MSwgMiwgMSwgMywgMiwgMiwgMH0sDQorICAgIHsxLCAzLCAxLCAyLCAyLCAyLCAwfSwNCisgICAgezEsIDIsIDIsIDIsIDEsIDMsIDB9LA0KKyAgICB7MSwgMiwgMiwgMywgMSwgMiwgMH0sDQorICAgIHsxLCAzLCAyLCAyLCAxLCAyLCAwfSwNCisgICAgezIsIDIsIDEsIDIsIDEsIDMsIDB9LA0KKyAgICB7MiwgMiwgMSwgMywgMSwgMiwgMH0sDQorICAgIHsyLCAzLCAxLCAyLCAxLCAyLCAwfSwNCisgICAgezEsIDEsIDIsIDIsIDMsIDIsIDB9LA0KKyAgICB7MSwgMiwgMiwgMSwgMywgMiwgMH0sDQorICAgIHsxLCAyLCAyLCAyLCAzLCAxLCAwfSwNCisgICAgezEsIDEsIDMsIDIsIDIsIDIsIDB9LA0KKyAgICB7MSwgMiwgMywgMSwgMiwgMiwgMH0sDQorICAgIHsxLCAyLCAzLCAyLCAyLCAxLCAwfSwNCisgICAgezIsIDIsIDMsIDIsIDEsIDEsIDB9LA0KKyAgICB7MiwgMiwgMSwgMSwgMywgMiwgMH0sDQorICAgIHsyLCAyLCAxLCAyLCAzLCAxLCAwfSwNCisgICAgezIsIDEsIDMsIDIsIDEsIDIsIDB9LA0KKyAgICB7MiwgMiwgMywgMSwgMSwgMiwgMH0sDQorICAgIHszLCAxLCAyLCAxLCAzLCAxLCAwfSwNCisgICAgezMsIDEsIDEsIDIsIDIsIDIsIDB9LA0KKyAgICB7MywgMiwgMSwgMSwgMiwgMiwgMH0sDQorICAgIHszLCAyLCAxLCAyLCAyLCAxLCAwfSwNCisgICAgezMsIDEsIDIsIDIsIDEsIDIsIDB9LA0KKyAgICB7MywgMiwgMiwgMSwgMSwgMiwgMH0sDQorICAgIHszLCAyLCAyLCAyLCAxLCAxLCAwfSwNCisgICAgezIsIDEsIDIsIDEsIDIsIDMsIDB9LA0KKyAgICB7MiwgMSwgMiwgMywgMiwgMSwgMH0sDQorICAgIHsyLCAzLCAyLCAxLCAyLCAxLCAwfSwNCisgICAgezEsIDEsIDEsIDMsIDIsIDMsIDB9LA0KKyAgICB7MSwgMywgMSwgMSwgMiwgMywgMH0sDQorICAgIHsxLCAzLCAxLCAzLCAyLCAxLCAwfSwNCisgICAgezEsIDEsIDIsIDMsIDEsIDMsIDB9LA0KKyAgICB7MSwgMywgMiwgMSwgMSwgMywgMH0sDQorICAgIHsxLCAzLCAyLCAzLCAxLCAxLCAwfSwNCisgICAgezIsIDEsIDEsIDMsIDEsIDMsIDB9LA0KKyAgICB7MiwgMywgMSwgMSwgMSwgMywgMH0sDQorICAgIHsyLCAzLCAxLCAzLCAxLCAxLCAwfSwNCisgICAgezEsIDEsIDIsIDEsIDMsIDMsIDB9LA0KKyAgICB7MSwgMSwgMiwgMywgMywgMSwgMH0sDQorICAgIHsxLCAzLCAyLCAxLCAzLCAxLCAwfSwNCisgICAgezEsIDEsIDMsIDEsIDIsIDMsIDB9LA0KKyAgICB7MSwgMSwgMywgMywgMiwgMSwgMH0sDQorICAgIHsxLCAzLCAzLCAxLCAyLCAxLCAwfSwNCisgICAgezMsIDEsIDMsIDEsIDIsIDEsIDB9LA0KKyAgICB7MiwgMSwgMSwgMywgMywgMSwgMH0sDQorICAgIHsyLCAzLCAxLCAxLCAzLCAxLCAwfSwNCisgICAgezIsIDEsIDMsIDEsIDEsIDMsIDB9LA0KKyAgICB7MiwgMSwgMywgMywgMSwgMSwgMH0sDQorICAgIHsyLCAxLCAzLCAxLCAzLCAxLCAwfSwNCisgICAgezMsIDEsIDEsIDEsIDIsIDMsIDB9LA0KKyAgICB7MywgMSwgMSwgMywgMiwgMSwgMH0sDQorICAgIHszLCAzLCAxLCAxLCAyLCAxLCAwfSwNCisgICAgezMsIDEsIDIsIDEsIDEsIDMsIDB9LA0KKyAgICB7MywgMSwgMiwgMywgMSwgMSwgMH0sDQorICAgIHszLCAzLCAyLCAxLCAxLCAxLCAwfSwNCisgICAgezMsIDEsIDQsIDEsIDEsIDEsIDB9LA0KKyAgICB7MiwgMiwgMSwgNCwgMSwgMSwgMH0sDQorICAgIHs0LCAzLCAxLCAxLCAxLCAxLCAwfSwNCisgICAgezEsIDEsIDEsIDIsIDIsIDQsIDB9LA0KKyAgICB7MSwgMSwgMSwgNCwgMiwgMiwgMH0sDQorICAgIHsxLCAyLCAxLCAxLCAyLCA0LCAwfSwNCisgICAgezEsIDIsIDEsIDQsIDIsIDEsIDB9LA0KKyAgICB7MSwgNCwgMSwgMSwgMiwgMiwgMH0sDQorICAgIHsxLCA0LCAxLCAyLCAyLCAxLCAwfSwNCisgICAgezEsIDEsIDIsIDIsIDEsIDQsIDB9LA0KKyAgICB7MSwgMSwgMiwgNCwgMSwgMiwgMH0sDQorICAgIHsxLCAyLCAyLCAxLCAxLCA0LCAwfSwNCisgICAgezEsIDIsIDIsIDQsIDEsIDEsIDB9LA0KKyAgICB7MSwgNCwgMiwgMSwgMSwgMiwgMH0sDQorICAgIHsxLCA0LCAyLCAyLCAxLCAxLCAwfSwNCisgICAgezIsIDQsIDEsIDIsIDEsIDEsIDB9LA0KKyAgICB7MiwgMiwgMSwgMSwgMSwgNCwgMH0sDQorICAgIHs0LCAxLCAzLCAxLCAxLCAxLCAwfSwNCisgICAgezIsIDQsIDEsIDEsIDEsIDIsIDB9LA0KKyAgICB7MSwgMywgNCwgMSwgMSwgMSwgMH0sDQorICAgIHsxLCAxLCAxLCAyLCA0LCAyLCAwfSwNCisgICAgezEsIDIsIDEsIDEsIDQsIDIsIDB9LA0KKyAgICB7MSwgMiwgMSwgMiwgNCwgMSwgMH0sDQorICAgIHsxLCAxLCA0LCAyLCAxLCAyLCAwfSwNCisgICAgezEsIDIsIDQsIDEsIDEsIDIsIDB9LA0KKyAgICB7MSwgMiwgNCwgMiwgMSwgMSwgMH0sDQorICAgIHs0LCAxLCAxLCAyLCAxLCAyLCAwfSwNCisgICAgezQsIDIsIDEsIDEsIDEsIDIsIDB9LA0KKyAgICB7NCwgMiwgMSwgMiwgMSwgMSwgMH0sDQorICAgIHsyLCAxLCAyLCAxLCA0LCAxLCAwfSwNCisgICAgezIsIDEsIDQsIDEsIDIsIDEsIDB9LA0KKyAgICB7NCwgMSwgMiwgMSwgMiwgMSwgMH0sDQorICAgIHsxLCAxLCAxLCAxLCA0LCAzLCAwfSwNCisgICAgezEsIDEsIDEsIDMsIDQsIDEsIDB9LA0KKyAgICB7MSwgMywgMSwgMSwgNCwgMSwgMH0sDQorICAgIHsxLCAxLCA0LCAxLCAxLCAzLCAwfSwNCisgICAgezEsIDEsIDQsIDMsIDEsIDEsIDB9LA0KKyAgICB7NCwgMSwgMSwgMSwgMSwgMywgMH0sDQorICAgIHs0LCAxLCAxLCAzLCAxLCAxLCAwfSwNCisgICAgezEsIDEsIDMsIDEsIDQsIDEsIDB9LA0KKyAgICB7MSwgMSwgNCwgMSwgMywgMSwgMH0sDQorICAgIHszLCAxLCAxLCAxLCA0LCAxLCAwfSwNCisgICAgezQsIDEsIDEsIDEsIDMsIDEsIDB9LA0KKyAgICB7MiwgMSwgMSwgNCwgMSwgMiwgMH0sDQorICAgIHsyLCAxLCAxLCAyLCAxLCA0LCAwfSwNCisgICAgezIsIDEsIDEsIDIsIDMsIDIsIDB9LA0KKyAgICB7MiwgMywgMywgMSwgMSwgMSwgMn0NCit9Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6TUFYX0FWR19WQVJJQU5DRSA9IChGWF9JTlQzMikgKDI1NiAqIDAuMjVmKTsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhSZWFkZXI6Ok1BWF9JTkRJVklEVUFMX1ZBUklBTkNFID0gKEZYX0lOVDMyKSAoMjU2ICogMC43Zik7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NISUZUID0gOTg7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0NPREVfQyA9IDk5Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9DT0RFX0IgPSAxMDA7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0NPREVfQSA9IDEwMTsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfRk5DXzEgPSAxMDI7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0ZOQ18yID0gOTc7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0ZOQ18zID0gOTY7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0ZOQ180X0EgPSAxMDE7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0ZOQ180X0IgPSAxMDA7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUQVJUX0EgPSAxMDM7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUQVJUX0IgPSAxMDQ7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUQVJUX0MgPSAxMDU7DQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUT1AgPSAxMDY7DQorQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDQkNfT25lZENvZGUxMjhSZWFkZXIoKQ0KK3sNCit9DQorQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjp+Q0JDX09uZWRDb2RlMTI4UmVhZGVyKCkNCit7DQorfQ0KK0NGWF9JbnQzMkFycmF5ICpDQkNfT25lZENvZGUxMjhSZWFkZXI6OkZpbmRTdGFydFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgcm93T2Zmc2V0ID0gMDsNCisgICAgd2hpbGUgKHJvd09mZnNldCA8IHdpZHRoKSB7DQorICAgICAgICBpZiAocm93LT5HZXQocm93T2Zmc2V0KSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcm93T2Zmc2V0Kys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY291bnRlclBvc2l0aW9uID0gMDsNCisgICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICAgIGNvdW50ZXJzLlNldFNpemUoNik7DQorICAgIEZYX0lOVDMyIHBhdHRlcm5TdGFydCA9IHJvd09mZnNldDsNCisgICAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGggPSBjb3VudGVycy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IHJvd09mZnNldDsgaSA8IHdpZHRoOyBpKyspIHsNCisgICAgICAgIEZYX0JPT0wgcGl4ZWwgPSByb3ctPkdldChpKTsNCisgICAgICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgYmVzdFZhcmlhbmNlID0gTUFYX0FWR19WQVJJQU5DRTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgYmVzdE1hdGNoID0gLTE7DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgc3RhcnRDb2RlID0gQ09ERV9TVEFSVF9BOyBzdGFydENvZGUgPD0gQ09ERV9TVEFSVF9DOyBzdGFydENvZGUrKykgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgdmFyaWFuY2UgPSBQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgmY291bnRlcnMsICZDT0RFX1BBVFRFUk5TW3N0YXJ0Q29kZV1bMF0sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW5jZSA8IGJlc3RWYXJpYW5jZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RWYXJpYW5jZSA9IHZhcmlhbmNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IHN0YXJ0Q29kZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYnRlbXAyID0gcm93LT5Jc1JhbmdlKEZYX01BWCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQorICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYnRlbXAyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgKnJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPlNldFNpemUoMyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzBdID0gcGF0dGVyblN0YXJ0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVzdWx0KVsxXSA9IGk7DQorICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzJdID0gYmVzdE1hdGNoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJzWzBdICsgY291bnRlcnNbMV07DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgeSA9IDI7IHkgPCBwYXR0ZXJuTGVuZ3RoOyB5KyspIHsNCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbi0tOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkRlY29kZUNvZGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgRlhfSU5UMzIgcm93T2Zmc2V0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIFJlY29yZFBhdHRlcm4ocm93LCByb3dPZmZzZXQsIGNvdW50ZXJzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICBGWF9JTlQzMiBiZXN0VmFyaWFuY2UgPSBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgICBGWF9JTlQzMiBiZXN0TWF0Y2ggPSAtMTsNCisgICAgZm9yIChGWF9JTlQzMiBkID0gMDsgZCA8IDEwNzsgZCsrKSB7DQorICAgICAgICBGWF9JTlQzMiB2YXJpYW5jZSA9IFBhdHRlcm5NYXRjaFZhcmlhbmNlKGNvdW50ZXJzLCAmQ09ERV9QQVRURVJOU1tkXVswXSwgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpOw0KKyAgICAgICAgaWYgKHZhcmlhbmNlIDwgYmVzdFZhcmlhbmNlKSB7DQorICAgICAgICAgICAgYmVzdFZhcmlhbmNlID0gdmFyaWFuY2U7DQorICAgICAgICAgICAgYmVzdE1hdGNoID0gZDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYmVzdE1hdGNoID49IDApIHsNCisgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkRlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfSW50MzJBcnJheSAqc3RhcnRQYXR0ZXJuSW5mbyA9IEZpbmRTdGFydFBhdHRlcm4ocm93LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgRlhfSU5UMzIgc3RhcnRDb2RlID0gKCpzdGFydFBhdHRlcm5JbmZvKVsyXTsNCisgICAgRlhfSU5UMzIgY29kZVNldDsNCisgICAgc3dpdGNoIChzdGFydENvZGUpIHsNCisgICAgICAgIGNhc2UgMTAzOg0KKyAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMTA0Og0KKyAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMTA1Og0KKyAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgaWYoc3RhcnRQYXR0ZXJuSW5mbyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHN0YXJ0UGF0dGVybkluZm8tPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgc3RhcnRQYXR0ZXJuSW5mbzsNCisgICAgICAgICAgICAgICAgc3RhcnRQYXR0ZXJuSW5mbyA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgRlhfQk9PTCBkb25lID0gRkFMU0U7DQorICAgIEZYX0JPT0wgaXNOZXh0U2hpZnRlZCA9IEZBTFNFOw0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIEZYX0lOVDMyIGxhc3RTdGFydCA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMF07DQorICAgIEZYX0lOVDMyIG5leHRTdGFydCA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMV07DQorICAgIGlmKHN0YXJ0UGF0dGVybkluZm8gIT0gTlVMTCkgew0KKyAgICAgICAgc3RhcnRQYXR0ZXJuSW5mby0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgc3RhcnRQYXR0ZXJuSW5mbzsNCisgICAgICAgIHN0YXJ0UGF0dGVybkluZm8gPSBOVUxMOw0KKyAgICB9DQorICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgICBjb3VudGVycy5TZXRTaXplKDYpOw0KKyAgICBGWF9JTlQzMiBsYXN0Q29kZSA9IDA7DQorICAgIEZYX0lOVDMyIGNvZGUgPSAwOw0KKyAgICBGWF9JTlQzMiBjaGVja3N1bVRvdGFsID0gc3RhcnRDb2RlOw0KKyAgICBGWF9JTlQzMiBtdWx0aXBsaWVyID0gMDsNCisgICAgRlhfQk9PTCBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gVFJVRTsNCisgICAgd2hpbGUgKCFkb25lKSB7DQorICAgICAgICBGWF9CT09MIHVuc2hpZnQgPSBpc05leHRTaGlmdGVkOw0KKyAgICAgICAgaXNOZXh0U2hpZnRlZCA9IEZBTFNFOw0KKyAgICAgICAgbGFzdENvZGUgPSBjb2RlOw0KKyAgICAgICAgY29kZSA9IERlY29kZUNvZGUocm93LCAmY291bnRlcnMsIG5leHRTdGFydCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICAgICAgaWYgKGNvZGUgIT0gQ09ERV9TVE9QKSB7DQorICAgICAgICAgICAgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCisgICAgICAgICAgICBtdWx0aXBsaWVyKys7DQorICAgICAgICAgICAgY2hlY2tzdW1Ub3RhbCArPSBtdWx0aXBsaWVyICogY29kZTsNCisgICAgICAgIH0NCisgICAgICAgIGxhc3RTdGFydCA9IG5leHRTdGFydDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIG5leHRTdGFydCArPSBjb3VudGVyc1tpXTsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgICAgIGNhc2UgMTAzOg0KKyAgICAgICAgICAgIGNhc2UgMTA0Og0KKyAgICAgICAgICAgIGNhc2UgMTA1Og0KKyAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoY29kZVNldCkgew0KKyAgICAgICAgICAgIGNhc2UgMTAxOg0KKyAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDY0KSB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpICgnICcgKyBjb2RlKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlIDwgOTYpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKGNvZGUgLSA2NCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk3Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTY6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDE6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTg6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTmV4dFNoaWZ0ZWQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTk6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDY6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPCA5Nikgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoJyAnICsgY29kZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMjoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk3Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTY6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTg6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTmV4dFNoaWZ0ZWQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAxOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTk6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDY6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDk5Og0KKyAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDEwMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPCAxMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIHRlbXBbMTI4XTsNCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zl9zKHRlbXAsIDEyOCwgIiVkIiwgY29kZSk7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGVtcCwgIiVkIiwgY29kZSk7DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGVtcDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAyOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9BOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9COw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHVuc2hpZnQpIHsNCisgICAgICAgICAgICBjb2RlU2V0ID0gY29kZVNldCA9PSBDT0RFX0NPREVfQSA/IENPREVfQ09ERV9CIDogQ09ERV9DT0RFX0E7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgICAgd2hpbGUgKG5leHRTdGFydCA8IHdpZHRoICYmIHJvdy0+R2V0KG5leHRTdGFydCkpIHsNCisgICAgICAgIG5leHRTdGFydCsrOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYm9vbFQxID0gcm93LT5Jc1JhbmdlKG5leHRTdGFydCwgRlhfTUlOKHdpZHRoLCBuZXh0U3RhcnQgKyAobmV4dFN0YXJ0IC0gbGFzdFN0YXJ0KSAvIDIpLCBGQUxTRSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIGlmICghYm9vbFQxKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgIHJldHVybiAiIjsNCisgICAgfQ0KKyAgICBjaGVja3N1bVRvdGFsIC09IG11bHRpcGxpZXIgKiBsYXN0Q29kZTsNCisgICAgaWYgKGNoZWNrc3VtVG90YWwgJSAxMDMgIT0gbGFzdENvZGUpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHJlc3VsdExlbmd0aCA9IHJlc3VsdC5HZXRMZW5ndGgoKTsNCisgICAgaWYgKHJlc3VsdExlbmd0aCA+IDAgJiYgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSkgew0KKyAgICAgICAgaWYgKGNvZGVTZXQgPT0gQ09ERV9DT0RFX0MpIHsNCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kZTEyOFdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2RhMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RlMTI4UmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZENvZGUxMjhXcml0ZXIuaCINCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNPREVfQ09ERV9CID0gMTAwOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q09ERV9DT0RFX0MgPSA5OTsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNPREVfU1RBUlRfQiA9IDEwNDsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNPREVfU1RBUlRfQyA9IDEwNTsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNPREVfU1RPUCA9IDEwNjsNCitDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNCQ19PbmVkQ29kZTEyOFdyaXRlcigpDQorew0KKyAgICBtX2NvZGVGb3JtYXQgPSBCQ19DT0RFMTI4X0I7DQorfQ0KK0NCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q0JDX09uZWRDb2RlMTI4V3JpdGVyKEJDX1RZUEUgdHlwZSkNCit7DQorICAgIG1fY29kZUZvcm1hdCA9IHR5cGU7DQorfQ0KK0NCQ19PbmVkQ29kZTEyOFdyaXRlcjo6fkNCQ19PbmVkQ29kZTEyOFdyaXRlcigpDQorew0KK30NCitCQ19UWVBFIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6R2V0VHlwZSgpDQorew0KKyAgICByZXR1cm4gbV9jb2RlRm9ybWF0Ow0KK30NCitGWF9CT09MCUNCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsNCisgICAgRlhfSU5UMzIgcG9zaXRpb24gPSAwOw0KKyAgICBGWF9JTlQzMiBwYXR0ZXJuSW5kZXggPSAtMTsNCisgICAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IgfHwgbV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgew0KKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBwYXR0ZXJuSW5kZXggPSAoRlhfSU5UMzIpY29udGVudHMuR2V0QXQocG9zaXRpb24pOw0KKyAgICAgICAgICAgIGlmIChwYXR0ZXJuSW5kZXggPj0gMzIgJiYgcGF0dGVybkluZGV4IDw9IDEyNiAmJiBwYXR0ZXJuSW5kZXggIT0gMzQpIHsNCisgICAgICAgICAgICAgICAgcG9zaXRpb24rKzsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwb3NpdGlvbiArKzsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJldCA9IEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RmlsdGVyQ29udGVudHMoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIGZpbHRlckNoaW5lc2VDaGFyOw0KKyAgICBGWF9XQ0hBUiBjaDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZihjaCA+IDE3NSkgew0KKyAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGZpbHRlckNoaW5lc2VDaGFyICs9IGNoOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOw0KKyAgICBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQikgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGZpbHRlckNoaW5lc2VDaGFyLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgICAgICBjaCA9IGZpbHRlckNoaW5lc2VDaGFyLkdldEF0KGkpOw0KKyAgICAgICAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0MpIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBmaWx0ZXJDaGluZXNlQ2hhci5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICAgICAgY2ggPSBmaWx0ZXJDaGluZXNlQ2hhci5HZXRBdChpKTsNCisgICAgICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTA2KSB7DQorICAgICAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGZpbHRlcmNvbnRlbnRzID0gY29udGVudHM7DQorICAgIH0NCisgICAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKQ0KK3sNCisgICAgaWYgKCBsb2NhdGlvbiA8IEJDX1RFWFRfTE9DX05PTkUgfHwgbG9jYXRpb24gPiBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9sb2NUZXh0TG9jID0gbG9jYXRpb247DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CWVRFICpDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihmb3JtYXQgIT0gQkNGT1JNQVRfQ09ERV8xMjgpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVDT0RFXzEyODsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JZVEUgKnJldCA9IENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorRlhfQllURSAqQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9CWVRFICpyZXQgPSAgRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpJc0RpZ2l0cyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyIHN0YXJ0LCBGWF9JTlQzMiBsZW5ndGgpDQorew0KKyAgICBGWF9JTlQzMiBlbmQgPSBzdGFydCArIGxlbmd0aDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgew0KKyAgICAgICAgaWYgKGNvbnRlbnRzW2ldIDwgJzAnIHx8IGNvbnRlbnRzW2ldID4gJzknKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CWVRFICpDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRMZW5ndGgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gY29udGVudHMuR2V0TGVuZ3RoKCk7DQorICAgIGlmKGNvbnRlbnRzLkdldExlbmd0aCgpIDwgMSB8fCBjb250ZW50cy5HZXRMZW5ndGgoKSA+IDgwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgcGF0dGVybnM7DQorICAgIEZYX0lOVDMyIGNoZWNrU3VtID0gMDsNCisgICAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IpIHsNCisgICAgICAgIGNoZWNrU3VtID0gRW5jb2RlMTI4Qihjb250ZW50cywgcGF0dGVybnMpOw0KKyAgICB9IGVsc2UgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0MpIAl7DQorICAgICAgICBjaGVja1N1bSA9IEVuY29kZTEyOEMoY29udGVudHMsIHBhdHRlcm5zKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGNoZWNrU3VtICU9IDEwMzsNCisgICAgcGF0dGVybnMuQWRkKChGWF9JTlQzMiopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW2NoZWNrU3VtXSk7DQorICAgIHBhdHRlcm5zLkFkZCgoRlhfSU5UMzIqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUT1BdKTsNCisgICAgbV9pQ29udGVudExlbiA9IGNvbnRlbnRzLkdldExlbmd0aCgpICsgMzsNCisgICAgRlhfSU5UMzIgY29kZVdpZHRoID0gMDsNCisgICAgZm9yKEZYX0lOVDMyIGsgPSAwOyBrIDwgcGF0dGVybnMuR2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICAgIEZYX0lOVDMyICpwYXR0ZXJuID0gKEZYX0lOVDMyKilwYXR0ZXJuc1trXTsNCisgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IDc7IGorKykgew0KKyAgICAgICAgICAgIGNvZGVXaWR0aCArPSBwYXR0ZXJuW2pdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG91dExlbmd0aCA9IGNvZGVXaWR0aDsNCisgICAgRlhfQllURSAqcmVzdWx0ID0gRlhfQWxsb2MoRlhfQllURSwgb3V0TGVuZ3RoKTsNCisgICAgRlhfSU5UMzIgcG9zID0gMDsNCisgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgcGF0dGVybnMuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgIEZYX0lOVDMyKiBwYXR0ZXJuID0gKEZYX0lOVDMyKilwYXR0ZXJuc1tqXTsNCisgICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBwYXR0ZXJuLCA3LCAxLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlMTI4Qihjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsICBDRlhfUHRyQXJyYXkgJnBhdHRlcm5zKQ0KK3sNCisgICAgRlhfSU5UMzIgY2hlY2tTdW0gPSAwOw0KKyAgICBGWF9JTlQzMiBjaGVja1dlaWdodCA9IDE7DQorICAgIEZYX0lOVDMyIHBvc2l0aW9uID0gMDsNCisgICAgcGF0dGVybnMuQWRkKChGWF9JTlQzMiopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW0NPREVfU1RBUlRfQl0pOw0KKyAgICBjaGVja1N1bSArPSBDT0RFX1NUQVJUX0IgKiBjaGVja1dlaWdodDsNCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgIEZYX0lOVDMyIHBhdHRlcm5JbmRleCA9IDA7DQorICAgICAgICBwYXR0ZXJuSW5kZXggPSBjb250ZW50c1twb3NpdGlvbl0gLSAnICc7DQorICAgICAgICBwb3NpdGlvbiArPSAxOw0KKyAgICAgICAgcGF0dGVybnMuQWRkKChGWF9JTlQzMiopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW3BhdHRlcm5JbmRleF0pOw0KKyAgICAgICAgY2hlY2tTdW0gKz0gcGF0dGVybkluZGV4ICogY2hlY2tXZWlnaHQ7DQorICAgICAgICBpZiAocG9zaXRpb24gIT0gMCkgew0KKyAgICAgICAgICAgIGNoZWNrV2VpZ2h0Kys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGNoZWNrU3VtOw0KK30NCitGWF9JTlQzMiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZTEyOEMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCAgQ0ZYX1B0ckFycmF5ICZwYXR0ZXJucykNCit7DQorICAgIEZYX0lOVDMyIGNoZWNrU3VtID0gMDsNCisgICAgRlhfSU5UMzIgY2hlY2tXZWlnaHQgPSAxOw0KKyAgICBGWF9JTlQzMiBwb3NpdGlvbiA9IDA7DQorICAgIHBhdHRlcm5zLkFkZCgoRlhfSU5UMzIqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUQVJUX0NdKTsNCisgICAgY2hlY2tTdW0gKz0gQ09ERV9TVEFSVF9DICogY2hlY2tXZWlnaHQ7DQorICAgIHdoaWxlIChwb3NpdGlvbiA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQorICAgICAgICBGWF9JTlQzMiBwYXR0ZXJuSW5kZXggPSAwOw0KKyAgICAgICAgRlhfQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KHBvc2l0aW9uKTsNCisgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5Jykgew0KKyAgICAgICAgICAgIHBhdHRlcm5JbmRleCA9IChGWF9JTlQzMiljaDsNCisgICAgICAgICAgICBwb3NpdGlvbisrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwYXR0ZXJuSW5kZXggPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChwb3NpdGlvbiwgMikpOw0KKyAgICAgICAgICAgIGlmIChjb250ZW50cy5HZXRBdChwb3NpdGlvbiArIDEpIDwgJzAnIHx8IGNvbnRlbnRzLkdldEF0KHBvc2l0aW9uICsgMSkgPiAnOScpIHsNCisgICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gMTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBhdHRlcm5zLkFkZCgoRlhfSU5UMzIqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1twYXR0ZXJuSW5kZXhdKTsNCisgICAgICAgIGNoZWNrU3VtICs9IHBhdHRlcm5JbmRleCAqIGNoZWNrV2VpZ2h0Ow0KKyAgICAgICAgaWYgKHBvc2l0aW9uICE9IDApIHsNCisgICAgICAgICAgICBjaGVja1dlaWdodCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBjaGVja1N1bTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RlMzlSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RlMzlSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTVhMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZENvZGUzOVJlYWRlci5jcHAKQEAgLTAsMCArMSwyNzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kZTM5UmVhZGVyLmgiDQorRlhfTFBDU1RSIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkcgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gKiQvKyUiOw0KK0ZYX0xQQ1NUUiBDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hFQ0tTVU1fU1RSSU5HID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICQvKyUiOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTWzQ0XSA9IHsNCisgICAgMHgwMzQsIDB4MTIxLCAweDA2MSwgMHgxNjAsIDB4MDMxLCAweDEzMCwgMHgwNzAsIDB4MDI1LCAweDEyNCwgMHgwNjQsDQorICAgIDB4MTA5LCAweDA0OSwgMHgxNDgsIDB4MDE5LCAweDExOCwgMHgwNTgsIDB4MDBELCAweDEwQywgMHgwNEMsIDB4MDFDLA0KKyAgICAweDEwMywgMHgwNDMsIDB4MTQyLCAweDAxMywgMHgxMTIsIDB4MDUyLCAweDAwNywgMHgxMDYsIDB4MDQ2LCAweDAxNiwNCisgICAgMHgxODEsIDB4MEMxLCAweDFDMCwgMHgwOTEsIDB4MTkwLCAweDBEMCwgMHgwODUsIDB4MTg0LCAweDBDNCwgMHgwOTQsDQorICAgIDB4MEE4LCAweDBBMiwgMHgwOEEsIDB4MDJBDQorfTsNCitjb25zdCBGWF9JTlQzMiBDQkNfT25lZENvZGUzOVJlYWRlcjo6QVNURVJJU0tfRU5DT0RJTkcgPSAweDA5NDsNCitDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0JDX09uZWRDb2RlMzlSZWFkZXIoKTogbV9leHRlbmRlZE1vZGUoRkFMU0UpLCBtX3VzaW5nQ2hlY2tEaWdpdChGQUxTRSkNCit7DQorfQ0KK0NCQ19PbmVkQ29kZTM5UmVhZGVyOjpDQkNfT25lZENvZGUzOVJlYWRlcihGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCkNCit7DQorICAgIG1fdXNpbmdDaGVja0RpZ2l0ID0gdXNpbmdDaGVja0RpZ2l0Ow0KKyAgICBtX2V4dGVuZGVkTW9kZSA9IEZBTFNFOw0KK30NCitDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0JDX09uZWRDb2RlMzlSZWFkZXIoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQsIEZYX0JPT0wgZXh0ZW5kZWRNb2RlKQ0KK3sNCisgICAgbV9leHRlbmRlZE1vZGUgPSBleHRlbmRlZE1vZGU7DQorICAgIG1fdXNpbmdDaGVja0RpZ2l0ID0gdXNpbmdDaGVja0RpZ2l0Ow0KK30NCitDQkNfT25lZENvZGUzOVJlYWRlcjo6fkNCQ19PbmVkQ29kZTM5UmVhZGVyKCkNCit7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpEZWNvZGVSb3coRlhfSU5UMzIgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0ludDMyQXJyYXkgKnN0YXJ0ID0gRmluZEFzdGVyaXNrUGF0dGVybihyb3csIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBGWF9JTlQzMiBuZXh0U3RhcnQgPSAoKnN0YXJ0KVsxXTsNCisgICAgaWYoc3RhcnQgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIHN0YXJ0Ow0KKyAgICAgICAgc3RhcnQgPSBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGVuZCA9IHJvdy0+R2V0U2l6ZSgpOw0KKyAgICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgICAgICBuZXh0U3RhcnQrKzsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgICBjb3VudGVycy5TZXRTaXplKDkpOw0KKyAgICBGWF9DSEFSIGRlY29kZWRDaGFyOw0KKyAgICBGWF9JTlQzMiBsYXN0U3RhcnQ7DQorICAgIGRvIHsNCisgICAgICAgIFJlY29yZFBhdHRlcm4ocm93LCBuZXh0U3RhcnQsICZjb3VudGVycywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICAgICAgRlhfSU5UMzIgcGF0dGVybiA9IFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKTsNCisgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgIH0NCisgICAgICAgIGRlY29kZWRDaGFyID0gUGF0dGVyblRvQ2hhcihwYXR0ZXJuLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgICAgICByZXN1bHQgKz0gZGVjb2RlZENoYXI7DQorICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnNbaV07DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgICAgICAgICAgbmV4dFN0YXJ0Kys7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9ICcqJyk7DQorICAgIHJlc3VsdCA9IHJlc3VsdC5NaWQoMCwgcmVzdWx0LkdldExlbmd0aCgpIC0gMSk7DQorICAgIEZYX0lOVDMyIGxhc3RQYXR0ZXJuU2l6ZSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBjb3VudGVycy5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgbGFzdFBhdHRlcm5TaXplICs9IGNvdW50ZXJzW2pdOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHdoaXRlU3BhY2VBZnRlckVuZCA9IG5leHRTdGFydCAtIGxhc3RTdGFydCAtIGxhc3RQYXR0ZXJuU2l6ZTsNCisgICAgaWYobV91c2luZ0NoZWNrRGlnaXQpIHsNCisgICAgICAgIEZYX0lOVDMyIG1heCA9IHJlc3VsdC5HZXRMZW5ndGgoKSAtIDE7DQorICAgICAgICBGWF9JTlQzMiB0b3RhbCA9IDA7DQorICAgICAgICBGWF9JTlQzMiBsZW4gPSAoRlhfSU5UMzIpc3RybGVuKEFMUEhBQkVUX1NUUklORyk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGsgPSAwOyBrIDwgbWF4OyBrKyspIHsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbGVuOyBqKyspDQorICAgICAgICAgICAgICAgIGlmIChBTFBIQUJFVF9TVFJJTkdbal0gPT0gcmVzdWx0W2tdKSB7DQorICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBqOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocmVzdWx0W21heF0gIT0gKEFMUEhBQkVUX1NUUklORylbdG90YWwgJSA0M10pIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICB9DQorICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgZSAgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIGlmKG1fZXh0ZW5kZWRNb2RlKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyID0gRGVjb2RlRXh0ZW5kZWQocmVzdWx0LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgICAgICByZXR1cm4gYnl0ZXN0cjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCit9DQorQ0ZYX0ludDMyQXJyYXkgKkNCQ19PbmVkQ29kZTM5UmVhZGVyOjpGaW5kQXN0ZXJpc2tQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIHJvd09mZnNldCA9IDA7DQorICAgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KKyAgICAgICAgaWYgKHJvdy0+R2V0KHJvd09mZnNldCkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHJvd09mZnNldCsrOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGNvdW50ZXJQb3NpdGlvbiA9IDA7DQorICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgICBjb3VudGVycy5TZXRTaXplKDkpOw0KKyAgICBGWF9JTlQzMiBwYXR0ZXJuU3RhcnQgPSByb3dPZmZzZXQ7DQorICAgIEZYX0JPT0wgaXNXaGl0ZSA9IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBwYXR0ZXJuTGVuZ3RoID0gY291bnRlcnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSByb3dPZmZzZXQ7IGkgPCB3aWR0aDsgaSsrKSB7DQorICAgICAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoaSk7DQorICAgICAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQorICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQorICAgICAgICAgICAgICAgIGlmIChUb05hcnJvd1dpZGVQYXR0ZXJuKCZjb3VudGVycykgPT0gQVNURVJJU0tfRU5DT0RJTkcpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlQxID0gIHJvdy0+SXNSYW5nZShGWF9NQVgoMCwgcGF0dGVyblN0YXJ0IC0gKGkgLSBwYXR0ZXJuU3RhcnQpIC8gMiksIHBhdHRlcm5TdGFydCwgRkFMU0UsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJUMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5ICpyZXN1bHQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5TZXRTaXplKDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVzdWx0KVswXSA9IHBhdHRlcm5TdGFydDsNCisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMV0gPSBpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJzWzBdICsgY291bnRlcnNbMV07DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgeSA9IDI7IHkgPCBwYXR0ZXJuTGVuZ3RoOyB5KyspIHsNCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbi0tOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDQkNfT25lZENvZGUzOVJlYWRlcjo6VG9OYXJyb3dXaWRlUGF0dGVybihDRlhfSW50MzJBcnJheSAqY291bnRlcnMpDQorew0KKyAgICBGWF9JTlQzMiBudW1Db3VudGVycyA9IGNvdW50ZXJzLT5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIG1heE5hcnJvd0NvdW50ZXIgPSAwOw0KKyAgICBGWF9JTlQzMiB3aWRlQ291bnRlcnM7DQorICAgIGRvIHsNCisjdW5kZWYgbWF4DQorICAgICAgICBGWF9JTlQzMiBtaW5Db3VudGVyID0gRlhTWVNfSW50TWF4Ow0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBjb3VudGVyID0gKCpjb3VudGVycylbaV07DQorICAgICAgICAgICAgaWYgKGNvdW50ZXIgPCBtaW5Db3VudGVyICYmIGNvdW50ZXIgPiBtYXhOYXJyb3dDb3VudGVyKSB7DQorICAgICAgICAgICAgICAgIG1pbkNvdW50ZXIgPSBjb3VudGVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1heE5hcnJvd0NvdW50ZXIgPSBtaW5Db3VudGVyOw0KKyAgICAgICAgd2lkZUNvdW50ZXJzID0gMDsNCisgICAgICAgIEZYX0lOVDMyIHRvdGFsV2lkZUNvdW50ZXJzV2lkdGggPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgcGF0dGVybiA9IDA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbnVtQ291bnRlcnM7IGorKykgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGNvdW50ZXIgPSAoKmNvdW50ZXJzKVtqXTsNCisgICAgICAgICAgICBpZiAoKCpjb3VudGVycylbal0gPiBtYXhOYXJyb3dDb3VudGVyKSB7DQorICAgICAgICAgICAgICAgIHBhdHRlcm4gfD0gMSA8PCAobnVtQ291bnRlcnMgLSAxIC0gaik7DQorICAgICAgICAgICAgICAgIHdpZGVDb3VudGVycysrOw0KKyAgICAgICAgICAgICAgICB0b3RhbFdpZGVDb3VudGVyc1dpZHRoICs9IGNvdW50ZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdpZGVDb3VudGVycyA9PSAzKSB7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IG51bUNvdW50ZXJzICYmIHdpZGVDb3VudGVycyA+IDA7IGsrKykgew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBjb3VudGVyID0gKCpjb3VudGVycylba107DQorICAgICAgICAgICAgICAgIGlmICgoKmNvdW50ZXJzKVtrXSA+IG1heE5hcnJvd0NvdW50ZXIpIHsNCisgICAgICAgICAgICAgICAgICAgIHdpZGVDb3VudGVycy0tOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChjb3VudGVyIDw8IDEpID49IHRvdGFsV2lkZUNvdW50ZXJzV2lkdGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKHdpZGVDb3VudGVycyA+IDMpOw0KKyAgICByZXR1cm4gLTE7DQorfQ0KK0ZYX0NIQVIgQ0JDX09uZWRDb2RlMzlSZWFkZXI6OlBhdHRlcm5Ub0NoYXIoRlhfSU5UMzIgcGF0dGVybiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgNDQ7IGkrKykgew0KKyAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT0gcGF0dGVybikgew0KKyAgICAgICAgICAgIHJldHVybiAoQUxQSEFCRVRfU1RSSU5HKVtpXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuIDA7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpEZWNvZGVFeHRlbmRlZChDRlhfQnl0ZVN0cmluZyAmZW5jb2RlZCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBsZW5ndGggPSBlbmNvZGVkLkdldExlbmd0aCgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBkZWNvZGVkOw0KKyAgICBGWF9DSEFSIGMsIG5leHQ7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorICAgICAgICBjID0gZW5jb2RlZFtpXTsNCisgICAgICAgIGlmKGMgPT0gJysnIHx8IGMgPT0gJyQnIHx8IGMgPT0gJyUnIHx8IGMgPT0gJy8nKSB7DQorICAgICAgICAgICAgbmV4dCA9IGVuY29kZWRbaSArIDFdOw0KKyAgICAgICAgICAgIEZYX0NIQVIgZGVjb2RlZENoYXIgPSAnXDAnOw0KKyAgICAgICAgICAgIHN3aXRjaCAoYykgew0KKyAgICAgICAgICAgICAgICBjYXNlICcrJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID49ICdBJyAmJiBuZXh0IDw9ICdaJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIChuZXh0ICsgMzIpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJyQnOg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPj0gJ0EnICYmIG5leHQgPD0gJ1onKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikgKG5leHQgLSA2NCk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnJSc6DQorICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA+PSAnQScgJiYgbmV4dCA8PSAnRScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKSAobmV4dCAtIDM4KTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA+PSAnRicgJiYgbmV4dCA8PSAnSicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKSAobmV4dCAtIDExKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA+PSAnSycgJiYgbmV4dCA8PSAnTycgJiYgbmV4dCAhPSAnTScgJiYgbmV4dCAhPSAnTicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKSAobmV4dCArIDE2KTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA+PSAnUCcgJiYgbmV4dCA8PSAnUycpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKSAobmV4dCArIDQzKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSAnVScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKSAwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdWJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIDY0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdXJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIDk2Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdUJyB8fCBuZXh0ID09ICdYJyB8fCBuZXh0ID09ICdZJyB8fCBuZXh0ID09ICdaJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIDEyNzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID49ICdBJyAmJiBuZXh0IDw9ICdPJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIChuZXh0IC0gMzIpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdaJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gJzonOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlY29kZWQgKz0gZGVjb2RlZENoYXI7DQorICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkZWNvZGVkICs9IGM7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGRlY29kZWQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVjNmU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRDb2RlMzlSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkQ29kZTM5V3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNCQ19PbmVkQ29kZTM5V3JpdGVyKCkNCit7DQorICAgIG1fZXh0ZW5kZWRNb2RlID0gRkFMU0U7DQorICAgIG1faVdpZGVOYXJyUmF0aW8gPSAzOw0KK30NCitDQkNfT25lZENvZGUzOVdyaXRlcjo6Q0JDX09uZWRDb2RlMzlXcml0ZXIoRlhfQk9PTCBleHRlbmRlZE1vZGUpDQorew0KKyAgICBtX2lXaWRlTmFyclJhdGlvID0gMzsNCisgICAgbV9leHRlbmRlZE1vZGUgPSBleHRlbmRlZE1vZGU7DQorfQ0KK0NCQ19PbmVkQ29kZTM5V3JpdGVyOjp+Q0JDX09uZWRDb2RlMzlXcml0ZXIoKQ0KK3sNCit9DQorRlhfQk9PTAlDQkNfT25lZENvZGUzOVdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIGlmIChtX2V4dGVuZGVkTW9kZSkgew0KKyAgICAgICAgcmV0dXJuIENoZWNrRXh0ZW5kZWRDb250ZW50VmFsaWRpdHkoY29udGVudHMpOw0KKyAgICB9DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoKGNoID49IChGWF9XQ0hBUiknMCcgJiYgY2ggPD0gKEZYX1dDSEFSKSc5JykgfHwgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykNCisgICAgICAgICAgICAgICAgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy4nIHx8IGNoID09IChGWF9XQ0hBUiknICcgfHwgY2ggPT0gKEZYX1dDSEFSKScqJw0KKyAgICAgICAgICAgICAgICB8fCBjaCA9PSAoRlhfV0NIQVIpJyQnIHx8IGNoID09IChGWF9XQ0hBUiknLycgfHwgY2ggPT0gKEZYX1dDSEFSKScrJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNoZWNrRXh0ZW5kZWRDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoY2ggPiAxMjcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpGaWx0ZXJDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKQ0KK3sNCisgICAgaWYgKG1fZXh0ZW5kZWRNb2RlKSB7DQorICAgICAgICByZXR1cm4gRmlsdGVyRXh0ZW5kZWRDb250ZW50cyhjb250ZW50cyk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoIGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkgKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihjaCA+IDE3NSkgew0KKyAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2ggPSBVcHBlcihjaCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKGNoID49IChGWF9XQ0hBUiknMCcgJiYgY2ggPD0gKEZYX1dDSEFSKSc5JykgfHwgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykNCisgICAgICAgICAgICAgICAgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy4nIHx8IGNoID09IChGWF9XQ0hBUiknICcgfHwgY2ggPT0gKEZYX1dDSEFSKScqJw0KKyAgICAgICAgICAgICAgICB8fCBjaCA9PSAoRlhfV0NIQVIpJyQnIHx8IGNoID09IChGWF9XQ0hBUiknLycgfHwgY2ggPT0gKEZYX1dDSEFSKScrJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6RmlsdGVyRXh0ZW5kZWRDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoIGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkgKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihjaCA+IDE3NSkgew0KKyAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChjaCA+IDEyNyAmJiBjaCA8IDE3Nikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoID09IDApIHsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJ1UnOw0KKyAgICAgICAgfSBlbHNlIGlmKGNoID49IDEgJiYgY2ggPD0gMjYpIHsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJCc7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gKGNoICsgNjQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAyNyAmJiBjaCA8PSAzMSkgew0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAoY2ggKyAzOCk7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID49IDMzICYmIGNoIDw9IDQ3ICYmIGNoICE9IDQ1ICYmIGNoICE9IDQ2KSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJy8nOw0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IChjaCArIDMyKTsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gNTgpIHsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnLyc7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJ1onOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSA1OSAmJiBjaCA8PSA2Mykgew0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaCArIDExOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSA2NCkgew0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVic7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID49IDkxICYmIGNoIDw9IDk1KSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoIC0gMTY7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID09IDk2KSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdXJzsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gOTcgJiYgY2ggPD0gMTIyKSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJysnOw0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoIC0gMzI7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID49IDEyMyAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2ggLSA0MzsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMTI3KSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdUJzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyVGV4dENvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBpZiAobV9leHRlbmRlZE1vZGUpIHsNCisgICAgICAgIHJldHVybiBSZW5kZXJFeHRlbmRlZFRleHRDb250ZW50cyhjb250ZW50cyk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29udGVudHM7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoIGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkgKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihjaCA+IDE3NSkgew0KKyAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoY2ggPj0gKEZYX1dDSEFSKScwJyAmJiBjaCA8PSAoRlhfV0NIQVIpJzknKSB8fCAoY2ggPj0gKEZYX1dDSEFSKSdBJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ1onKQ0KKyAgICAgICAgICAgICAgICB8fCAoY2ggPj0gKEZYX1dDSEFSKSdhJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ3onKSB8fCBjaCA9PSAoRlhfV0NIQVIpJy0nIHx8IGNoID09IChGWF9XQ0hBUiknLicNCisgICAgICAgICAgICAgICAgfHwgY2ggPT0gKEZYX1dDSEFSKScgJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyonIHx8IGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJw0KKyAgICAgICAgICAgICAgICB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8IGNoID09IChGWF9XQ0hBUiknJScpIHsNCisgICAgICAgICAgICByZW5kZXJDb250ZW50cyArPSBjaDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcmVuZGVyQ29udGVudHM7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpSZW5kZXJFeHRlbmRlZFRleHRDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29udGVudHM7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoIGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkgKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihjaCA+IDE3NSkgew0KKyAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChjaCA+IDEyNyAmJiBjaCA8IDE3Nikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7DQorICAgIH0NCisgICAgcmV0dXJuIHJlbmRlckNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQorew0KKyAgICBpZiAoIGxvY2F0aW9uIDwgQkNfVEVYVF9MT0NfTk9ORSB8fCBsb2NhdGlvbiA+IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlNldFdpZGVOYXJyb3dSYXRpbyhGWF9JTlQzMiByYXRpbykNCit7DQorICAgIGlmICggcmF0aW8gPCAyIHx8IHJhdGlvID4gMykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1faVdpZGVOYXJyUmF0aW8gPSByYXRpbzsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JZVEUgKkNCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9CWVRFICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JZVEUgKkNCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoZm9ybWF0ICE9IEJDRk9STUFUX0NPREVfMzkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVDT0RFXzM5Ow0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfQllURSAqcmV0ID0gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCit2b2lkIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpUb0ludEFycmF5KEZYX0lOVDMyIGEsIEZYX0lOVDMyICp0b1JldHVybikNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IDk7IGkrKykgew0KKyAgICAgICAgdG9SZXR1cm5baV0gPSAoYSAmICgxIDw8IGkpICkgPT0gMCA/IDEgOiBtX2lXaWRlTmFyclJhdGlvOw0KKyAgICB9DQorfQ0KK0ZYX0NIQVIgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNhbGNDaGVja1N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gY29udGVudHMuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChsZW5ndGggPiA4MCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ29udGVudHNMZW5ndGhTaG91bGRCZXR3ZWVuMWFuZDgwOw0KKyAgICAgICAgcmV0dXJuICcqJzsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBjaGVja3N1bSA9IDA7DQorICAgIEZYX0lOVDMyIGxlbiA9IChGWF9JTlQzMilzdHJsZW4oQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkFMUEhBQkVUX1NUUklORyk7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGogPSAwOw0KKyAgICAgICAgZm9yICg7IGogPCBsZW47IGorKykgew0KKyAgICAgICAgICAgIGlmIChDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HW2pdID09IGNvbnRlbnRzW2ldKSB7DQorICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRzW2ldICE9ICcqJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gKz0gajsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaiA+PSBsZW4pIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRlZFN0cmluZzsNCisgICAgICAgICAgICByZXR1cm4gJyonOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gJSA0MzsNCisgICAgcmV0dXJuIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEVDS1NVTV9TVFJJTkdbY2hlY2tzdW1dOw0KK30NCitGWF9CWVRFICpDQkNfT25lZENvZGUzOVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgRlhfSU5UMzIgJm91dGxlbmd0aCAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfQ0hBUiBjaGVja3N1bSA9IENhbGNDaGVja1N1bShjb250ZW50cywgZSk7DQorICAgIGlmIChjaGVja3N1bSA9PSAnKicpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHdpZHRoc1s5XSA9IHswfTsNCisgICAgRlhfSU5UMzIgd2lkZVN0cmlkZU51bSA9IDM7DQorICAgIEZYX0lOVDMyIG5hcnJTdHJpZGVOdW0gPSA5IC0gd2lkZVN0cmlkZU51bTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZENvbnRlbnRzID0gY29udGVudHM7DQorICAgIGlmICggbV9iQ2FsY0NoZWNrc3VtICkgew0KKyAgICAgICAgZW5jb2RlZENvbnRlbnRzICs9IGNoZWNrc3VtOw0KKyAgICB9DQorICAgIG1faUNvbnRlbnRMZW4gPSBlbmNvZGVkQ29udGVudHMuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIGNvZGVXaWR0aCA9ICh3aWRlU3RyaWRlTnVtICogbV9pV2lkZU5hcnJSYXRpbyArIG5hcnJTdHJpZGVOdW0pICogMiArIDEgKyBtX2lDb250ZW50TGVuOw0KKyAgICBGWF9JTlQzMiBsZW4gPSAoRlhfSU5UMzIpc3RybGVuKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkcpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbV9pQ29udGVudExlbjsgaisrKSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkFMUEhBQkVUX1NUUklOR1tpXSA9PSBlbmNvZGVkQ29udGVudHNbal0pIHsNCisgICAgICAgICAgICAgICAgVG9JbnRBcnJheShDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1tpXSwgd2lkdGhzKTsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGsgPSAwOyBrIDwgOTsgaysrKSB7DQorICAgICAgICAgICAgICAgICAgICBjb2RlV2lkdGggKz0gd2lkdGhzW2tdOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG91dGxlbmd0aCA9IGNvZGVXaWR0aDsNCisgICAgRlhfQllURSAqcmVzdWx0ID0gRlhfQWxsb2MoRlhfQllURSwgY29kZVdpZHRoKTsNCisgICAgVG9JbnRBcnJheShDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1szOV0sIHdpZHRocyk7DQorICAgIEZYX0lOVDMyIHBvcyA9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCAwLCB3aWR0aHMsIDksIDEgLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5hcnJvd1doaXRlW10gPSB7MX07DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBuYXJyb3dXaGl0ZSwgMSwgMCwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBmb3IoRlhfSU5UMzIgbCA9IG1faUNvbnRlbnRMZW4gLSAxOyBsID49IDA7IGwtLSkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkdbaV0gPT0gZW5jb2RlZENvbnRlbnRzW2xdKSB7DQorICAgICAgICAgICAgICAgIFRvSW50QXJyYXkoQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIQVJBQ1RFUl9FTkNPRElOR1NbaV0sIHdpZHRocyk7DQorICAgICAgICAgICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCB3aWR0aHMsIDksIDEsIGUpOw0KKyAgICAgICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgbmFycm93V2hpdGUsIDEsIDAsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgVG9JbnRBcnJheShDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1szOV0sIHdpZHRocyk7DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCB3aWR0aHMsIDksIDEsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvZGVXaWR0aCAvIDI7IGkrKykgew0KKyAgICAgICAgcmVzdWx0W2ldIF49IHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV07DQorICAgICAgICByZXN1bHRbY29kZVdpZHRoIC0gMSAtIGldIF49IHJlc3VsdFtpXTsNCisgICAgICAgIHJlc3VsdFtpXSBePSByZXN1bHRbY29kZVdpZHRoIC0gMSAtIGldOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjplbmNvZGVkQ29udGVudHMoRlhfV1NUUiBjb250ZW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkQ29udGVudHMgPSBjb250ZW50czsNCisgICAgaWYgKG1fYkNhbGNDaGVja3N1bSAmJiBtX2JQcmludENoZWNrc3VtKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBjaGVja3N1bUNvbnRlbnQgPSBGaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBjaGVja3N1bUNvbnRlbnQuVVRGOEVuY29kZSgpOw0KKyAgICAgICAgRlhfQ0hBUiBjaGVja3N1bTsNCisgICAgICAgIGNoZWNrc3VtID0gQ2FsY0NoZWNrU3VtKHN0ciwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICAgICAgICBzdHIgKz0gY2hlY2tzdW07DQorICAgICAgICBlbmNvZGVkQ29udGVudHMgKz0gY2hlY2tzdW07DQorICAgIH0NCisgICAgcmV0dXJuIGVuY29kZWRDb250ZW50czsNCit9DQordm9pZCBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZENvbiA9IGVuY29kZWRDb250ZW50cyhjb250ZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoZW5jb2RlZENvbiwgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZEVBTjEzUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkRUFOMTNSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMmU5MzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZEVBTjEzUmVhZGVyLmNwcApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZEVBTjEzUmVhZGVyLmgiDQorY29uc3QgRlhfSU5UMzIgQ0JDX09uZWRFQU4xM1JlYWRlcjo6RklSU1RfRElHSVRfRU5DT0RJTkdTWzEwXSA9IHsNCisgICAgMHgwMCwgMHgwQiwgMHgwRCwgMHhFLCAweDEzLCAweDE5LCAweDFDLCAweDE1LCAweDE2LCAweDFBDQorfTsNCitDQkNfT25lZEVBTjEzUmVhZGVyOjpDQkNfT25lZEVBTjEzUmVhZGVyKCkNCit7DQorfQ0KK0NCQ19PbmVkRUFOMTNSZWFkZXI6On5DQkNfT25lZEVBTjEzUmVhZGVyKCkNCit7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU4xM1JlYWRlcjo6RGV0ZXJtaW5lRmlyc3REaWdpdChDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiBsZ1BhdHRlcm5Gb3VuZCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGQgPSAwOyBkIDwgMTA7IGQrKykgew0KKyAgICAgICAgaWYgKGxnUGF0dGVybkZvdW5kID09IEZJUlNUX0RJR0lUX0VOQ09ESU5HU1tkXSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5JbnNlcnQoMCwgKEZYX0NIQVIpICgnMCcgKyBkKSk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit9DQorRlhfSU5UMzIgQ0JDX09uZWRFQU4xM1JlYWRlcjo6RGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRSYW5nZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFN0cmluZywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCisgICAgY291bnRlcnMuQWRkKDApOw0KKyAgICBjb3VudGVycy5BZGQoMCk7DQorICAgIGNvdW50ZXJzLkFkZCgwKTsNCisgICAgY291bnRlcnMuQWRkKDApOw0KKyAgICBGWF9JTlQzMiBlbmQgPSByb3ctPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgcm93T2Zmc2V0ID0gKCpzdGFydFJhbmdlKVsxXTsNCisgICAgRlhfSU5UMzIgbGdQYXR0ZXJuRm91bmQgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgNiAmJiByb3dPZmZzZXQgPCBlbmQ7IHgrKykgew0KKyAgICAgICAgRlhfSU5UMzIgYmVzdE1hdGNoID0gRGVjb2RlRGlnaXQocm93LCAmY291bnRlcnMsIHJvd09mZnNldCwgJihDQkNfT25lRGltUmVhZGVyOjpMX0FORF9HX1BBVFRFUk5TWzBdWzBdKSwgMjAsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICAgICAgcmVzdWx0U3RyaW5nICs9IChGWF9DSEFSKSAoJzAnICsgYmVzdE1hdGNoICUgMTApOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJlc3RNYXRjaCA+PSAxMCkgew0KKyAgICAgICAgICAgIGxnUGF0dGVybkZvdW5kIHw9IDEgPDwgKDUgLSB4KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBEZXRlcm1pbmVGaXJzdERpZ2l0KHJlc3VsdFN0cmluZywgbGdQYXR0ZXJuRm91bmQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIENGWF9JbnQzMkFycmF5IHJlc3VsdDsNCisgICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlswXSk7DQorICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMV0pOw0KKyAgICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzJdKTsNCisgICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlszXSk7DQorICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNF0pOw0KKyAgICBDRlhfSW50MzJBcnJheSAqbWlkZGxlUmFuZ2UgPSBGaW5kR3VhcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBUUlVFLCAmcmVzdWx0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICByb3dPZmZzZXQgPSAoKm1pZGRsZVJhbmdlKVsxXTsNCisgICAgaWYobWlkZGxlUmFuZ2UgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1pZGRsZVJhbmdlOw0KKyAgICAgICAgbWlkZGxlUmFuZ2UgPSBOVUxMOw0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgWSA9IDA7IFkgPCA2ICYmIHJvd09mZnNldCA8IGVuZDsgWSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBiZXN0TWF0Y2ggPSBEZWNvZGVEaWdpdChyb3csICZjb3VudGVycywgcm93T2Zmc2V0LCAmKENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbMF1bMF0pLCAxMCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgICAgICByZXN1bHRTdHJpbmcgKz0gKEZYX0NIQVIpICgnMCcgKyBiZXN0TWF0Y2gpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IGNvdW50ZXJzLkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2tdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByb3dPZmZzZXQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkRUFOMTNXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU4xM1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5YTJkYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkRUFOMTNXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRFQU4xM1JlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRFQU4xM1dyaXRlci5oIg0KK0NCQ19PbmVkRUFOMTNXcml0ZXI6OkNCQ19PbmVkRUFOMTNXcml0ZXIoKQ0KK3sNCisgICAgbV9iTGVmdFBhZGRpbmcgPSBUUlVFOw0KKyAgICBtX2NvZGVXaWR0aCA9IDMgKw0KKyAgICAgICAgICAgICAgICAgICg3ICogNikgKw0KKyAgICAgICAgICAgICAgICAgIDUgKw0KKyAgICAgICAgICAgICAgICAgICg3ICogNikgKw0KKyAgICAgICAgICAgICAgICAgIDM7DQorfQ0KK0NCQ19PbmVkRUFOMTNXcml0ZXI6On5DQkNfT25lZEVBTjEzV3JpdGVyKCkNCit7DQorfQ0KK0ZYX0JPT0wJQ0JDX09uZWRFQU4xM1dyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgPj0gJzAnICYmIGNvbnRlbnRzLkdldEF0KGkpIDw9ICc5Jykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nCUNCQ19PbmVkRUFOMTNXcml0ZXI6OkZpbHRlckNvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgICAgRlhfV0NIQVIgY2g7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICAgICAgaWYoY2ggPiAxNzUpIHsNCisgICAgICAgICAgICBpKys7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQorRlhfSU5UMzIgQ0JDX09uZWRFQU4xM1dyaXRlcjo6Q2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cykNCit7DQorICAgIEZYX0lOVDMyIG9kZCA9IDA7DQorICAgIEZYX0lOVDMyIGV2ZW4gPSAwOw0KKyAgICBGWF9JTlQzMiBqID0gMTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgICBpZihqICUgMikgew0KKyAgICAgICAgICAgIG9kZCArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGV2ZW4gKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaisrOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGNoZWNrc3VtID0gKG9kZCAqIDMgKyBldmVuKSAlIDEwOw0KKyAgICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOw0KKyAgICByZXR1cm4gKGNoZWNrc3VtKTsNCit9DQorRlhfQllURSAqQ0JDX09uZWRFQU4xM1dyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfQllURSAqcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JZVEUgKkNCQ19PbmVkRUFOMTNXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihmb3JtYXQgIT0gQkNGT1JNQVRfRUFOXzEzKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzEzOw0KKyAgICB9DQorICAgIEZYX0JZVEUgKnJldCA9IENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorRlhfQllURSAqQ0JDX09uZWRFQU4xM1dyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgRlhfSU5UMzIgJm91dExlbmd0aCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gMTMpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkMTM7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBtX2lEYXRhTGVudGggPSAxMzsNCisgICAgRlhfSU5UMzIgZmlyc3REaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKDAsIDEpKTsNCisgICAgRlhfSU5UMzIgcGFyaXRpZXMgPSBDQkNfT25lZEVBTjEzUmVhZGVyOjpGSVJTVF9ESUdJVF9FTkNPRElOR1NbZmlyc3REaWdpdF07DQorICAgIG91dExlbmd0aCA9IG1fY29kZVdpZHRoOw0KKyAgICBGWF9CWVRFICpyZXN1bHQgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX2NvZGVXaWR0aCk7DQorICAgIEZYX0lOVDMyIHBvcyA9IDA7DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yICggaSA9IDE7IGkgPD0gNjsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgICAgIGlmICgocGFyaXRpZXMgPj4gKDYgLSBpKSAmIDEpID09IDEpIHsNCisgICAgICAgICAgICBkaWdpdCArPSAxMDsNCisgICAgICAgIH0NCisgICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX0FORF9HX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMCwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk4sIDUsIDAsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZm9yIChpID0gNzsgaSA8PSAxMjsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMSwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6U1RBUlRfRU5EX1BBVFRFUk4sIDMsIDEsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQordm9pZCBDQkNfT25lZEVBTjEzV3JpdGVyOjpTaG93Q2hhcnMoRlhfV1NUUiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgYmFyV2lkdGgsIEZYX0lOVDMyIG11bHRpcGxlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBsZWZ0UGFkZGluZyA9IDcgKiBtdWx0aXBsZTsNCisgICAgRlhfSU5UMzIgbGVmdFBvc2l0aW9uID0gMyAqIG11bHRpcGxlICsgbGVmdFBhZGRpbmc7DQorICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbik7DQorICAgIGlmICghcENoYXJQb3MpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1zZXQzMihwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW4pOw0KKyAgICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgICAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlGb250U2l6ZSA9IChGWF9JTlQzMilmYWJzKG1fZkZvbnRTaXplKTsNCisgICAgRlhfSU5UMzIgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KKyAgICBDRlhfQnl0ZVN0cmluZyB0ZW1wU3RyID0gc3RyLk1pZCgxLCA2KTsNCisgICAgRlhfSU5UMzIgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDQyOw0KKyAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCisgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCgoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLCAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgICAgbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgICAgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlKSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlICsgc3RyV2lkdGggLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICAgICAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICAgICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQorICAgICAgICByZSA9IHJlY3QxLkdldE91dHRlclJlY3QoKTsNCisgICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgICAgICBGWF9JTlQzMiBzdHJXaWR0aDEgPSBtdWx0aXBsZSAqIDc7DQorICAgICAgICBDRlhfTWF0cml4IG1hdHIyKG1fb3V0cHV0SFNjYWxlLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsNCisgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdDIoMC4wZiwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKXN0cldpZHRoMSAtIDAuNWYsIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgICAgICBtYXRyMi5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICBtYXRyMi5UcmFuc2Zvcm1SZWN0KHJlY3QyKTsNCisgICAgICAgIHJlID0gcmVjdDIuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBibGFuayA9IDAuMDsNCisgICAgRlhfRkxPQVQgY2hhcnNXaWR0aCA9IDA7DQorICAgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICBzdHJXaWR0aCA9IChGWF9JTlQzMikoc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZSk7DQorICAgIH0NCisgICAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgMSwgbV9wRm9udCwgKEZYX0ZMT0FUKXN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsNCisgICAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7DQorICAgIENGWF9GeGdlRGV2aWNlIGdlOw0KKyAgICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgICAgICBnZS5DcmVhdGUoc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBzdHJXaWR0aCwgaVRleHRIZWlnaHQpOw0KKyAgICAgICAgZ2UuRmlsbFJlY3QoJnJlY3QsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24sIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uICogbV9vdXRwdXRIU2NhbGUsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCkgKyBpRm9udFNpemUpOw0KKyAgICAgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIH0NCisgICAgdGVtcFN0ciA9IHN0ci5NaWQoNywgNik7DQorICAgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgICBjaGFyc1dpZHRoID0gMC4wZjsNCisgICAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgNywgbV9wRm9udCwgKEZYX0ZMT0FUKXN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsNCisgICAgaWYocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgICAgICBGWF9SRUNUIHJlY3QxKDAsIDAsIHN0cldpZHRoLCBpVGV4dEhlaWdodCk7DQorICAgICAgICBnZS5GaWxsUmVjdCgmcmVjdDEsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIH0NCisgICAgICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyA3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICB9DQorICAgIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDEpOw0KKyAgICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgICAgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDc7DQorICAgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgIHN0cldpZHRoID0gKEZYX0lOVDMyKShzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlKTsNCisgICAgfQ0KKyAgICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICAgIGlmKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KKyAgICAgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICB9DQorICAgIEZYX0ZyZWUocENoYXJQb3MpOw0KK30NCit2b2lkIENCQ19PbmVkRUFOMTNXcml0ZXI6OlJlbmRlclJlc3VsdChGWF9XU1RSIGNvbnRlbnRzLCBGWF9CWVRFKiBjb2RlLCBGWF9JTlQzMiBjb2RlTGVuZ3RoLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZEVBTjhSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU44UmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNmZjZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU44UmVhZGVyLmNwcApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVJlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZEVBTjhSZWFkZXIuaCINCitDQkNfT25lZEVBTjhSZWFkZXI6OkNCQ19PbmVkRUFOOFJlYWRlcigpDQorew0KK30NCitDQkNfT25lZEVBTjhSZWFkZXI6On5DQkNfT25lZEVBTjhSZWFkZXIoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX09uZWRFQU44UmVhZGVyOjpEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0UmVzdWx0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgICBjb3VudGVycy5BZGQoMCk7DQorICAgIGNvdW50ZXJzLkFkZCgwKTsNCisgICAgY291bnRlcnMuQWRkKDApOw0KKyAgICBjb3VudGVycy5BZGQoMCk7DQorICAgIEZYX0lOVDMyIGVuZCA9IHJvdy0+R2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiByb3dPZmZzZXQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KKyAgICBGWF9JTlQzMiByb3dPZmZzZXRMZWZ0ID0gcm93T2Zmc2V0Ow0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgNCAmJiByb3dPZmZzZXQgPCBlbmQ7IHgrKykgew0KKyAgICAgICAgRlhfSU5UMzIgYmVzdE1hdGNoID0gRGVjb2RlRGlnaXQocm93LCAmY291bnRlcnMsIHJvd09mZnNldCwgJihDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TWzBdWzBdKSwgMTAsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICAgICAgcmVzdWx0UmVzdWx0ICs9IChGWF9DSEFSKSAoJzAnICsgYmVzdE1hdGNoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1tpXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBSb3dPZmZzZXRMZW4gPSAocm93T2Zmc2V0IC0gcm93T2Zmc2V0TGVmdCkgLyA0Ow0KKyAgICBDRlhfSW50MzJBcnJheSByZXN1bHQ7DQorICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMF0pOw0KKyAgICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzFdKTsNCisgICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlsyXSk7DQorICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bM10pOw0KKyAgICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzRdKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgKm1pZGRsZVJhbmdlID0gRmluZEd1YXJkUGF0dGVybihyb3csIHJvd09mZnNldCwgVFJVRSwgJnJlc3VsdCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgRlhfSU5UMzIgcm93T2Zmc2V0TWlkID0gcm93T2Zmc2V0Ow0KKyAgICByb3dPZmZzZXQgPSAoKm1pZGRsZVJhbmdlKVsxXTsNCisgICAgaWYoKHJvd09mZnNldCAtIHJvd09mZnNldE1pZCkgPiBSb3dPZmZzZXRMZW4pIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICAgIGlmKG1pZGRsZVJhbmdlICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtaWRkbGVSYW5nZTsNCisgICAgICAgIG1pZGRsZVJhbmdlID0gTlVMTDsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIHkgPSAwOyB5IDwgNCAmJiByb3dPZmZzZXQgPCBlbmQ7IHkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgYmVzdE1hdGNoID0gRGVjb2RlRGlnaXQocm93LCAmIGNvdW50ZXJzLCByb3dPZmZzZXQsICYoQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1swXVswXSksIDEwLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgICAgIHJlc3VsdFJlc3VsdCArPSAoRlhfQ0hBUikgKCcwJyArIGJlc3RNYXRjaCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICByb3dPZmZzZXQgKz0gY291bnRlcnNbaV07DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHJvd09mZnNldDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRFQU44V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkRUFOOFdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3YTUwYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkRUFOOFdyaXRlci5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Xcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lRGltUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfT25lZEVBTjhXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCitDQkNfT25lZEVBTjhXcml0ZXI6OkNCQ19PbmVkRUFOOFdyaXRlcigpDQorew0KKyAgICBtX2lEYXRhTGVudGggPSA4Ow0KKyAgICBtX2NvZGVXaWR0aCA9IDMgKw0KKyAgICAgICAgICAgICAgICAgICg3ICogNCkgKw0KKyAgICAgICAgICAgICAgICAgIDUgKw0KKyAgICAgICAgICAgICAgICAgICg3ICogNCkgKw0KKyAgICAgICAgICAgICAgICAgIDM7DQorfQ0KK0NCQ19PbmVkRUFOOFdyaXRlcjo6fkNCQ19PbmVkRUFOOFdyaXRlcigpDQorew0KK30NCit2b2lkIENCQ19PbmVkRUFOOFdyaXRlcjo6U2V0RGF0YUxlbmd0aChGWF9JTlQzMiBsZW5ndGgpDQorew0KKyAgICBtX2lEYXRhTGVudGggPSA4Ow0KK30NCitGWF9CT09MIENCQ19PbmVkRUFOOFdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKQ0KK3sNCisgICAgaWYgKCBsb2NhdGlvbiA9PSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7DQorICAgICAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDQkNfT25lZEVBTjhXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpID49ICcwJyAmJiBjb250ZW50cy5HZXRBdChpKSA8PSAnOScpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZwlDQkNfT25lZEVBTjhXcml0ZXI6OkZpbHRlckNvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgICAgRlhfV0NIQVIgY2g7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICAgICAgaWYoY2ggPiAxNzUpIHsNCisgICAgICAgICAgICBpKys7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQorRlhfSU5UMzIgQ0JDX09uZWRFQU44V3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgb2RkID0gMDsNCisgICAgRlhfSU5UMzIgZXZlbiA9IDA7DQorICAgIEZYX0lOVDMyIGogPSAxOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgIGlmKGogJSAyKSB7DQorICAgICAgICAgICAgb2RkICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZXZlbiArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgICAgICB9DQorICAgICAgICBqKys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY2hlY2tzdW0gPSAob2RkICogMyArIGV2ZW4pICUgMTA7DQorICAgIGNoZWNrc3VtID0gKDEwIC0gY2hlY2tzdW0pICUgMTA7DQorICAgIHJldHVybiAoY2hlY2tzdW0pOw0KK30NCitGWF9CWVRFICpDQkNfT25lZEVBTjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0ICwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9CWVRFICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorRlhfQllURSAqQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cyAsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9FQU5fOCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUVBTl84Ow0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfQllURSAqcmV0ID0gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGWF9CWVRFICpDQkNfT25lZEVBTjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRMZW5ndGggLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSAhPSA4KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTg7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBvdXRMZW5ndGggPSBtX2NvZGVXaWR0aDsNCisgICAgRlhfQllURSAqcmVzdWx0ID0gRlhfQWxsb2MoRlhfQllURSwgbV9jb2RlV2lkdGgpOw0KKyAgICBGWF9JTlQzMiBwb3MgPSAwOw0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6U1RBUlRfRU5EX1BBVFRFUk4sIDMsIDEsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPD0gMzsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMCwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk4sIDUsIDAsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZm9yIChpID0gNDsgaSA8PSA3OyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGRpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KKyAgICAgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbZGlnaXRdLCA0LCAxLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCit2b2lkIENCQ19PbmVkRUFOOFdyaXRlcjo6U2hvd0NoYXJzKEZYX1dTVFIgY29udGVudHMsIENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyIGJhcldpZHRoLCBGWF9JTlQzMiBtdWx0aXBsZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoZGV2aWNlID09IE5VTEwgJiYgcE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgbGVmdFBvc2l0aW9uID0gMyAqIG11bHRpcGxlOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHN0ci5HZXRMZW5ndGgoKTsNCisgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW5ndGgpOw0KKyAgICBpZiAoIXBDaGFyUG9zKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuZ3RoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMCwgNCk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBzdHJXaWR0aCA9IDcgKiBtdWx0aXBsZSAqIDQ7DQorICAgIEZYX0ZMT0FUIGJsYW5rID0gMC4wOw0KKyAgICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgICAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGNoYXJzV2lkdGggPSAwOw0KKyAgICBGWF9JTlQzMiBpRm9udFNpemUgPSAoRlhfSU5UMzIpZmFicyhtX2ZGb250U2l6ZSk7DQorICAgIEZYX0lOVDMyIGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsNCisgICAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QoKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyBzdHJXaWR0aCAtIDAuNSksIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgICAgICBtYXRyLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIG1hdHIuVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgICAgICAgIEZYX1JFQ1QgcmUgPSByZWN0LkdldE91dHRlclJlY3QoKTsNCisgICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgICAgICBDRlhfTWF0cml4IG1hdHIxKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgMzMgKiBtdWx0aXBsZSksIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgMzMgKiBtdWx0aXBsZSArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgICAgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIG1hdHIxLlRyYW5zZm9ybVJlY3QocmVjdDEpOw0KKyAgICAgICAgcmUgPSByZWN0MS5HZXRPdXR0ZXJSZWN0KCk7DQorICAgICAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICB9DQorICAgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgIHN0cldpZHRoID0gKEZYX0lOVDMyKShzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlKTsNCisgICAgfQ0KKyAgICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsIChGWF9GTE9BVClpRm9udFNpemUpOw0KKyAgICBDRlhfRnhnZURldmljZSBnZTsNCisgICAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KKyAgICAgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiAqIG1fb3V0cHV0SFNjYWxlLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIEZYX0JPT0wgcmV0ID0gZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICB9DQorICAgIHRlbXBTdHIgPSBzdHIuTWlkKDQsIDQpOw0KKyAgICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgICAgY2hhcnNXaWR0aCA9IDAuMGY7DQorICAgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDQsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICAgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgICAgIGdlLkNyZWF0ZShzdHJXaWR0aCwgaVRleHRIZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgICAgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyAzMyAqIG11bHRpcGxlLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyAzMyAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgcmV0ID0gZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIH0NCisgICAgRlhfRnJlZShwQ2hhclBvcyk7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpSZW5kZXJSZXN1bHQoRlhfV1NUUiBjb250ZW50cywgRlhfQllURSogY29kZSwgRlhfSU5UMzIgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoY29udGVudHMsIGNvZGUsIGNvZGVMZW5ndGgsIGlzRGV2aWNlLCBlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRVUENBUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkVVBDQVJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljOTkxNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19PbmVkVVBDQVJlYWRlci5jcHAKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVEaW1SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkRUFOMTNSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19PbmVkVVBDQVJlYWRlci5oIg0KK0NCQ19PbmVkVVBDQVJlYWRlcjo6Q0JDX09uZWRVUENBUmVhZGVyKCkNCit7DQorICAgIG1fZWFuMTNSZWFkZXIgPSBOVUxMOw0KK30NCit2b2lkIENCQ19PbmVkVVBDQVJlYWRlcjo6SW5pdCgpDQorew0KKyAgICBtX2VhbjEzUmVhZGVyID0gRlhfTkVXIENCQ19PbmVkRUFOMTNSZWFkZXI7DQorfQ0KK0NCQ19PbmVkVVBDQVJlYWRlcjo6fkNCQ19PbmVkVVBDQVJlYWRlcigpDQorew0KKyAgICBpZihtX2VhbjEzUmVhZGVyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX2VhbjEzUmVhZGVyOw0KKyAgICB9DQorICAgIG1fZWFuMTNSZWFkZXIgPSBOVUxMOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6OkRlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlUm93KHJvd051bWJlciwgcm93LCBoaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSBNYXliZVJldHVyblJlc3VsdChieXRlc3RyaW5nLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkVVBDQVJlYWRlcjo6RGVjb2RlUm93KEZYX0lOVDMyIHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydEd1YXJkUmFuZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHJpbmcgPSBtX2VhbjEzUmVhZGVyLT5EZWNvZGVSb3cocm93TnVtYmVyLCByb3csIHN0YXJ0R3VhcmRSYW5nZSwgaGludHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gTWF5YmVSZXR1cm5SZXN1bHQoYnl0ZXN0cmluZywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIHJldHVybiB0ZW1wOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlKGltYWdlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IE1heWJlUmV0dXJuUmVzdWx0KGJ5dGVzdHJpbmcsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gdGVtcDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHJpbmcgPSBtX2VhbjEzUmVhZGVyLT5EZWNvZGUoaW1hZ2UsIGhpbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IE1heWJlUmV0dXJuUmVzdWx0KGJ5dGVzdHJpbmcsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gdGVtcDsNCit9DQorRlhfSU5UMzIgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0U3RyaW5nLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIHRlbXAgPSBtX2VhbjEzUmVhZGVyLT5EZWNvZGVNaWRkbGUocm93LCBzdGFydFJhbmdlLCByZXN1bHRTdHJpbmcsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIHJldHVybiB0ZW1wOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6Ok1heWJlUmV0dXJuUmVzdWx0KENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYocmVzdWx0WzBdID09ICcwJykgew0KKyAgICAgICAgcmVzdWx0LkRlbGV0ZSgwKTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgcmV0dXJuICIiOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfT25lZFVQQ0FXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRVUENBV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhkZWU3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX09uZWRVUENBV3JpdGVyLmNwcApAQCAtMCwwICsxLDI2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1dyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRFQU4xM1dyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX09uZWRVUENBV3JpdGVyLmgiDQorQ0JDX09uZWRVUENBV3JpdGVyOjpDQkNfT25lZFVQQ0FXcml0ZXIoKQ0KK3sNCisgICAgbV9zdWJXcml0ZXIgPSBOVUxMOw0KKyAgICBtX2JMZWZ0UGFkZGluZyA9IFRSVUU7DQorICAgIG1fYlJpZ2h0UGFkZGluZyA9IFRSVUU7DQorfQ0KK3ZvaWQgQ0JDX09uZWRVUENBV3JpdGVyOjpJbml0KCkNCit7DQorICAgIG1fc3ViV3JpdGVyID0gRlhfTkVXIENCQ19PbmVkRUFOMTNXcml0ZXI7DQorfQ0KK0NCQ19PbmVkVVBDQVdyaXRlcjo6fkNCQ19PbmVkVVBDQVdyaXRlcigpDQorew0KKyAgICBpZihtX3N1YldyaXRlciAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9zdWJXcml0ZXI7DQorICAgIH0NCisgICAgbV9zdWJXcml0ZXIgPSBOVUxMOw0KK30NCitGWF9CT09MCUNCQ19PbmVkVVBDQVdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCit7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpID49ICcwJyAmJiBjb250ZW50cy5HZXRBdChpKSA8PSAnOScpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZwlDQkNfT25lZFVQQ0FXcml0ZXI6OkZpbHRlckNvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgICAgRlhfV0NIQVIgY2g7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICAgICAgaWYoY2ggPiAxNzUpIHsNCisgICAgICAgICAgICBpKys7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQorRlhfSU5UMzIgQ0JDX09uZWRVUENBV3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgb2RkID0gMDsNCisgICAgRlhfSU5UMzIgZXZlbiA9IDA7DQorICAgIEZYX0lOVDMyIGogPSAxOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgIGlmKGogJSAyKSB7DQorICAgICAgICAgICAgb2RkICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZXZlbiArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgICAgICB9DQorICAgICAgICBqKys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgY2hlY2tzdW0gPSAob2RkICogMyArIGV2ZW4pICUgMTA7DQorICAgIGNoZWNrc3VtID0gKDEwIC0gY2hlY2tzdW0pICUgMTA7DQorICAgIHJldHVybiAoY2hlY2tzdW0pOw0KK30NCitGWF9CWVRFICpDQkNfT25lZFVQQ0FXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0JZVEUgKnJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCitGWF9CWVRFICpDQkNfT25lZFVQQ0FXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX1VQQ19BKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlVVBDX0E7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyB0b0VBTjEzU3RyaW5nID0gJzAnICsgY29udGVudHM7DQorICAgIG1faURhdGFMZW50aCA9IDEzOw0KKyAgICBGWF9CWVRFICpyZXQgPSBtX3N1YldyaXRlci0+RW5jb2RlKHRvRUFOMTNTdHJpbmcsIEJDRk9STUFUX0VBTl8xMywgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KK3ZvaWQgQ0JDX09uZWRVUENBV3JpdGVyOjpTaG93Q2hhcnMoRlhfV1NUUiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgYmFyV2lkdGgsIEZYX0lOVDMyIG11bHRpcGxlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBsZWZ0UGFkZGluZyA9IDcgKiBtdWx0aXBsZTsNCisgICAgRlhfSU5UMzIgbGVmdFBvc2l0aW9uID0gMTAgKiBtdWx0aXBsZSArIGxlZnRQYWRkaW5nOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsNCisgICAgRlhfSU5UMzIgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsNCisgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgICBpZiAoIXBDaGFyUG9zKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhTWVNfbWVtc2V0MzIocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMSwgNSk7DQorICAgIEZYX0ZMT0FUIHN0cldpZHRoID0gKEZYX0ZMT0FUKTM1ICogbXVsdGlwbGU7DQorICAgIEZYX0ZMT0FUIGJsYW5rID0gMC4wOw0KKyAgICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgICAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGNoYXJzV2lkdGggPSAwOw0KKyAgICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaUZvbnRTaXplID0gKEZYX0lOVDMyKWZhYnMobV9mRm9udFNpemUpOw0KKyAgICBGWF9JTlQzMiBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICAgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgIENGWF9NYXRyaXggbWF0cihtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsZWZ0UG9zaXRpb24sIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgICAgbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgICAgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIENGWF9NYXRyaXggbWF0cjEobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCisgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlKSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKSgobGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSkgKyBzdHJXaWR0aCAtIDAuNSksIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgICAgICBtYXRyMS5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKTsNCisgICAgICAgIHJlID0gcmVjdDEuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIEZYX0ZMT0FUIHN0cldpZHRoMSA9IChGWF9GTE9BVCltdWx0aXBsZSAqIDc7DQorICAgICAgICBDRlhfTWF0cml4IG1hdHIyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QyKDAuMCwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKXN0cldpZHRoMSAtIDEsIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgICAgICBtYXRyMi5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICBtYXRyMi5UcmFuc2Zvcm1SZWN0KHJlY3QyKTsNCisgICAgICAgIHJlID0gcmVjdDIuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIENGWF9NYXRyaXggbWF0cjMobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCisgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdDMoKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlKSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKSgobGVmdFBvc2l0aW9uICsgODUgKiBtdWx0aXBsZSkgKyBzdHJXaWR0aDEgLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICAgICAgbWF0cjMuQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgICAgbWF0cjMuVHJhbnNmb3JtUmVjdChyZWN0Myk7DQorICAgICAgICByZSA9IHJlY3QzLkdldE91dHRlclJlY3QoKTsNCisgICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIH0NCisgICAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgc3RyV2lkdGggPSBzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlOw0KKyAgICB9DQorICAgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsIHN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsNCisgICAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7DQorICAgIENGWF9GeGdlRGV2aWNlIGdlOw0KKyAgICBpZihwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgICAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgfQ0KKyAgICB0ZW1wU3RyID0gc3RyLk1pZCg2LCA1KTsNCisgICAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICAgIGNoYXJzV2lkdGggPSAwLjBmOw0KKyAgICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyA2LCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICAgIGlmKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfUkVDVCByZWN0MigwLCAwLCAoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCk7DQorICAgICAgICBnZS5GaWxsUmVjdCgmcmVjdDIsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIH0NCisgICAgICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyA2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICB9DQorICAgIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDEpOw0KKyAgICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgICAgc3RyV2lkdGggPSAoRlhfRkxPQVQpbXVsdGlwbGUgKiA3Ow0KKyAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICBzdHJXaWR0aCA9IHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGU7DQorICAgIH0NCisgICAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zLCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICAgIGlmKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KKyAgICAgICAgZ2UuQ3JlYXRlKChpbnQpc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgICAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCAwLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMCwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICB9DQorICAgIHRlbXBTdHIgPSBzdHIuTWlkKDExLCAxKTsNCisgICAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICAgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDExLCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICAgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgMTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIH0NCisgICAgICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyAxMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKHBDaGFyUG9zKTsNCit9DQordm9pZCBDQkNfT25lZFVQQ0FXcml0ZXI6OlJlbmRlclJlc3VsdChGWF9XU1RSIGNvbnRlbnRzLCBGWF9CWVRFKiBjb2RlLCBGWF9JTlQzMiBjb2RlTGVuZ3RoLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK30NCisNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNmNlYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3LmNwcApAQCAtMCwwICsxLDY3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbXBhY3Rpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlUm93LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTcuaCINCitGWF9JTlQzMiBDQkNfUERGNDE3OjpTVEFSVF9QQVRURVJOID0gMHgxZmVhODsNCitGWF9JTlQzMiBDQkNfUERGNDE3OjpTVE9QX1BBVFRFUk4gPSAweDNmYTI5Ow0KK0ZYX0lOVDMyIENCQ19QREY0MTc6OkNPREVXT1JEX1RBQkxFW11bMTAwMF0gPSB7DQorICAgIHsNCisgICAgICAgIDB4MWQ1YzAsIDB4MWVhZjAsIDB4MWY1N2MsIDB4MWQ0ZTAsIDB4MWVhNzgsIDB4MWY1M2UsDQorICAgICAgICAweDFhOGMwLCAweDFkNDcwLCAweDFhODYwLCAweDE1MDQwLCAweDFhODMwLCAweDE1MDIwLA0KKyAgICAgICAgMHgxYWRjMCwgMHgxZDZmMCwgMHgxZWI3YywgMHgxYWNlMCwgMHgxZDY3OCwgMHgxZWIzZSwNCisgICAgICAgIDB4MTU4YzAsIDB4MWFjNzAsIDB4MTU4NjAsIDB4MTVkYzAsIDB4MWFlZjAsIDB4MWQ3N2MsDQorICAgICAgICAweDE1Y2UwLCAweDFhZTc4LCAweDFkNzNlLCAweDE1YzcwLCAweDFhZTNjLCAweDE1ZWYwLA0KKyAgICAgICAgMHgxYWY3YywgMHgxNWU3OCwgMHgxYWYzZSwgMHgxNWY3YywgMHgxZjVmYSwgMHgxZDJlMCwNCisgICAgICAgIDB4MWU5NzgsIDB4MWY0YmUsIDB4MWE0YzAsIDB4MWQyNzAsIDB4MWU5M2MsIDB4MWE0NjAsDQorICAgICAgICAweDFkMjM4LCAweDE0ODQwLCAweDFhNDMwLCAweDFkMjFjLCAweDE0ODIwLCAweDFhNDE4LA0KKyAgICAgICAgMHgxNDgxMCwgMHgxYTZlMCwgMHgxZDM3OCwgMHgxZTliZSwgMHgxNGNjMCwgMHgxYTY3MCwNCisgICAgICAgIDB4MWQzM2MsIDB4MTRjNjAsIDB4MWE2MzgsIDB4MWQzMWUsIDB4MTRjMzAsIDB4MWE2MWMsDQorICAgICAgICAweDE0ZWUwLCAweDFhNzc4LCAweDFkM2JlLCAweDE0ZTcwLCAweDFhNzNjLCAweDE0ZTM4LA0KKyAgICAgICAgMHgxYTcxZSwgMHgxNGY3OCwgMHgxYTdiZSwgMHgxNGYzYywgMHgxNGYxZSwgMHgxYTJjMCwNCisgICAgICAgIDB4MWQxNzAsIDB4MWU4YmMsIDB4MWEyNjAsIDB4MWQxMzgsIDB4MWU4OWUsIDB4MTQ0NDAsDQorICAgICAgICAweDFhMjMwLCAweDFkMTFjLCAweDE0NDIwLCAweDFhMjE4LCAweDE0NDEwLCAweDE0NDA4LA0KKyAgICAgICAgMHgxNDZjMCwgMHgxYTM3MCwgMHgxZDFiYywgMHgxNDY2MCwgMHgxYTMzOCwgMHgxZDE5ZSwNCisgICAgICAgIDB4MTQ2MzAsIDB4MWEzMWMsIDB4MTQ2MTgsIDB4MTQ2MGMsIDB4MTQ3NzAsIDB4MWEzYmMsDQorICAgICAgICAweDE0NzM4LCAweDFhMzllLCAweDE0NzFjLCAweDE0N2JjLCAweDFhMTYwLCAweDFkMGI4LA0KKyAgICAgICAgMHgxZTg1ZSwgMHgxNDI0MCwgMHgxYTEzMCwgMHgxZDA5YywgMHgxNDIyMCwgMHgxYTExOCwNCisgICAgICAgIDB4MWQwOGUsIDB4MTQyMTAsIDB4MWExMGMsIDB4MTQyMDgsIDB4MWExMDYsIDB4MTQzNjAsDQorICAgICAgICAweDFhMWI4LCAweDFkMGRlLCAweDE0MzMwLCAweDFhMTljLCAweDE0MzE4LCAweDFhMThlLA0KKyAgICAgICAgMHgxNDMwYywgMHgxNDMwNiwgMHgxYTFkZSwgMHgxNDM4ZSwgMHgxNDE0MCwgMHgxYTBiMCwNCisgICAgICAgIDB4MWQwNWMsIDB4MTQxMjAsIDB4MWEwOTgsIDB4MWQwNGUsIDB4MTQxMTAsIDB4MWEwOGMsDQorICAgICAgICAweDE0MTA4LCAweDFhMDg2LCAweDE0MTA0LCAweDE0MWIwLCAweDE0MTk4LCAweDE0MThjLA0KKyAgICAgICAgMHgxNDBhMCwgMHgxZDAyZSwgMHgxYTA0YywgMHgxYTA0NiwgMHgxNDA4MiwgMHgxY2FlMCwNCisgICAgICAgIDB4MWU1NzgsIDB4MWYyYmUsIDB4MTk0YzAsIDB4MWNhNzAsIDB4MWU1M2MsIDB4MTk0NjAsDQorICAgICAgICAweDFjYTM4LCAweDFlNTFlLCAweDEyODQwLCAweDE5NDMwLCAweDEyODIwLCAweDE5NmUwLA0KKyAgICAgICAgMHgxY2I3OCwgMHgxZTViZSwgMHgxMmNjMCwgMHgxOTY3MCwgMHgxY2IzYywgMHgxMmM2MCwNCisgICAgICAgIDB4MTk2MzgsIDB4MTJjMzAsIDB4MTJjMTgsIDB4MTJlZTAsIDB4MTk3NzgsIDB4MWNiYmUsDQorICAgICAgICAweDEyZTcwLCAweDE5NzNjLCAweDEyZTM4LCAweDEyZTFjLCAweDEyZjc4LCAweDE5N2JlLA0KKyAgICAgICAgMHgxMmYzYywgMHgxMmZiZSwgMHgxZGFjMCwgMHgxZWQ3MCwgMHgxZjZiYywgMHgxZGE2MCwNCisgICAgICAgIDB4MWVkMzgsIDB4MWY2OWUsIDB4MWI0NDAsIDB4MWRhMzAsIDB4MWVkMWMsIDB4MWI0MjAsDQorICAgICAgICAweDFkYTE4LCAweDFlZDBlLCAweDFiNDEwLCAweDFkYTBjLCAweDE5MmMwLCAweDFjOTcwLA0KKyAgICAgICAgMHgxZTRiYywgMHgxYjZjMCwgMHgxOTI2MCwgMHgxYzkzOCwgMHgxZTQ5ZSwgMHgxYjY2MCwNCisgICAgICAgIDB4MWRiMzgsIDB4MWVkOWUsIDB4MTZjNDAsIDB4MTI0MjAsIDB4MTkyMTgsIDB4MWM5MGUsDQorICAgICAgICAweDE2YzIwLCAweDFiNjE4LCAweDE2YzEwLCAweDEyNmMwLCAweDE5MzcwLCAweDFjOWJjLA0KKyAgICAgICAgMHgxNmVjMCwgMHgxMjY2MCwgMHgxOTMzOCwgMHgxYzk5ZSwgMHgxNmU2MCwgMHgxYjczOCwNCisgICAgICAgIDB4MWRiOWUsIDB4MTZlMzAsIDB4MTI2MTgsIDB4MTZlMTgsIDB4MTI3NzAsIDB4MTkzYmMsDQorICAgICAgICAweDE2ZjcwLCAweDEyNzM4LCAweDE5MzllLCAweDE2ZjM4LCAweDFiNzllLCAweDE2ZjFjLA0KKyAgICAgICAgMHgxMjdiYywgMHgxNmZiYywgMHgxMjc5ZSwgMHgxNmY5ZSwgMHgxZDk2MCwgMHgxZWNiOCwNCisgICAgICAgIDB4MWY2NWUsIDB4MWIyNDAsIDB4MWQ5MzAsIDB4MWVjOWMsIDB4MWIyMjAsIDB4MWQ5MTgsDQorICAgICAgICAweDFlYzhlLCAweDFiMjEwLCAweDFkOTBjLCAweDFiMjA4LCAweDFiMjA0LCAweDE5MTYwLA0KKyAgICAgICAgMHgxYzhiOCwgMHgxZTQ1ZSwgMHgxYjM2MCwgMHgxOTEzMCwgMHgxYzg5YywgMHgxNjY0MCwNCisgICAgICAgIDB4MTIyMjAsIDB4MWQ5OWMsIDB4MWM4OGUsIDB4MTY2MjAsIDB4MTIyMTAsIDB4MTkxMGMsDQorICAgICAgICAweDE2NjEwLCAweDFiMzBjLCAweDE5MTA2LCAweDEyMjA0LCAweDEyMzYwLCAweDE5MWI4LA0KKyAgICAgICAgMHgxYzhkZSwgMHgxNjc2MCwgMHgxMjMzMCwgMHgxOTE5YywgMHgxNjczMCwgMHgxYjM5YywNCisgICAgICAgIDB4MTkxOGUsIDB4MTY3MTgsIDB4MTIzMGMsIDB4MTIzMDYsIDB4MTIzYjgsIDB4MTkxZGUsDQorICAgICAgICAweDE2N2I4LCAweDEyMzljLCAweDE2NzljLCAweDEyMzhlLCAweDE2NzhlLCAweDE2N2RlLA0KKyAgICAgICAgMHgxYjE0MCwgMHgxZDhiMCwgMHgxZWM1YywgMHgxYjEyMCwgMHgxZDg5OCwgMHgxZWM0ZSwNCisgICAgICAgIDB4MWIxMTAsIDB4MWQ4OGMsIDB4MWIxMDgsIDB4MWQ4ODYsIDB4MWIxMDQsIDB4MWIxMDIsDQorICAgICAgICAweDEyMTQwLCAweDE5MGIwLCAweDFjODVjLCAweDE2MzQwLCAweDEyMTIwLCAweDE5MDk4LA0KKyAgICAgICAgMHgxYzg0ZSwgMHgxNjMyMCwgMHgxYjE5OCwgMHgxZDhjZSwgMHgxNjMxMCwgMHgxMjEwOCwNCisgICAgICAgIDB4MTkwODYsIDB4MTYzMDgsIDB4MWIxODYsIDB4MTYzMDQsIDB4MTIxYjAsIDB4MTkwZGMsDQorICAgICAgICAweDE2M2IwLCAweDEyMTk4LCAweDE5MGNlLCAweDE2Mzk4LCAweDFiMWNlLCAweDE2MzhjLA0KKyAgICAgICAgMHgxMjE4NiwgMHgxNjM4NiwgMHgxNjNkYywgMHgxNjNjZSwgMHgxYjBhMCwgMHgxZDg1OCwNCisgICAgICAgIDB4MWVjMmUsIDB4MWIwOTAsIDB4MWQ4NGMsIDB4MWIwODgsIDB4MWQ4NDYsIDB4MWIwODQsDQorICAgICAgICAweDFiMDgyLCAweDEyMGEwLCAweDE5MDU4LCAweDFjODJlLCAweDE2MWEwLCAweDEyMDkwLA0KKyAgICAgICAgMHgxOTA0YywgMHgxNjE5MCwgMHgxYjBjYywgMHgxOTA0NiwgMHgxNjE4OCwgMHgxMjA4NCwNCisgICAgICAgIDB4MTYxODQsIDB4MTIwODIsIDB4MTIwZDgsIDB4MTYxZDgsIDB4MTYxY2MsIDB4MTYxYzYsDQorICAgICAgICAweDFkODJjLCAweDFkODI2LCAweDFiMDQyLCAweDE5MDJjLCAweDEyMDQ4LCAweDE2MGM4LA0KKyAgICAgICAgMHgxNjBjNCwgMHgxNjBjMiwgMHgxOGFjMCwgMHgxYzU3MCwgMHgxZTJiYywgMHgxOGE2MCwNCisgICAgICAgIDB4MWM1MzgsIDB4MTE0NDAsIDB4MThhMzAsIDB4MWM1MWMsIDB4MTE0MjAsIDB4MThhMTgsDQorICAgICAgICAweDExNDEwLCAweDExNDA4LCAweDExNmMwLCAweDE4YjcwLCAweDFjNWJjLCAweDExNjYwLA0KKyAgICAgICAgMHgxOGIzOCwgMHgxYzU5ZSwgMHgxMTYzMCwgMHgxOGIxYywgMHgxMTYxOCwgMHgxMTYwYywNCisgICAgICAgIDB4MTE3NzAsIDB4MThiYmMsIDB4MTE3MzgsIDB4MThiOWUsIDB4MTE3MWMsIDB4MTE3YmMsDQorICAgICAgICAweDExNzllLCAweDFjZDYwLCAweDFlNmI4LCAweDFmMzVlLCAweDE5YTQwLCAweDFjZDMwLA0KKyAgICAgICAgMHgxZTY5YywgMHgxOWEyMCwgMHgxY2QxOCwgMHgxZTY4ZSwgMHgxOWExMCwgMHgxY2QwYywNCisgICAgICAgIDB4MTlhMDgsIDB4MWNkMDYsIDB4MTg5NjAsIDB4MWM0YjgsIDB4MWUyNWUsIDB4MTliNjAsDQorICAgICAgICAweDE4OTMwLCAweDFjNDljLCAweDEzNjQwLCAweDExMjIwLCAweDFjZDljLCAweDFjNDhlLA0KKyAgICAgICAgMHgxMzYyMCwgMHgxOWIxOCwgMHgxODkwYywgMHgxMzYxMCwgMHgxMTIwOCwgMHgxMzYwOCwNCisgICAgICAgIDB4MTEzNjAsIDB4MTg5YjgsIDB4MWM0ZGUsIDB4MTM3NjAsIDB4MTEzMzAsIDB4MWNkZGUsDQorICAgICAgICAweDEzNzMwLCAweDE5YjljLCAweDE4OThlLCAweDEzNzE4LCAweDExMzBjLCAweDEzNzBjLA0KKyAgICAgICAgMHgxMTNiOCwgMHgxODlkZSwgMHgxMzdiOCwgMHgxMTM5YywgMHgxMzc5YywgMHgxMTM4ZSwNCisgICAgICAgIDB4MTEzZGUsIDB4MTM3ZGUsIDB4MWRkNDAsIDB4MWVlYjAsIDB4MWY3NWMsIDB4MWRkMjAsDQorICAgICAgICAweDFlZTk4LCAweDFmNzRlLCAweDFkZDEwLCAweDFlZThjLCAweDFkZDA4LCAweDFlZTg2LA0KKyAgICAgICAgMHgxZGQwNCwgMHgxOTk0MCwgMHgxY2NiMCwgMHgxZTY1YywgMHgxYmI0MCwgMHgxOTkyMCwNCisgICAgICAgIDB4MWVlZGMsIDB4MWU2NGUsIDB4MWJiMjAsIDB4MWRkOTgsIDB4MWVlY2UsIDB4MWJiMTAsDQorICAgICAgICAweDE5OTA4LCAweDFjYzg2LCAweDFiYjA4LCAweDFkZDg2LCAweDE5OTAyLCAweDExMTQwLA0KKyAgICAgICAgMHgxODhiMCwgMHgxYzQ1YywgMHgxMzM0MCwgMHgxMTEyMCwgMHgxODg5OCwgMHgxYzQ0ZSwNCisgICAgICAgIDB4MTc3NDAsIDB4MTMzMjAsIDB4MTk5OTgsIDB4MWNjY2UsIDB4MTc3MjAsIDB4MWJiOTgsDQorICAgICAgICAweDFkZGNlLCAweDE4ODg2LCAweDE3NzEwLCAweDEzMzA4LCAweDE5OTg2LCAweDE3NzA4LA0KKyAgICAgICAgMHgxMTEwMiwgMHgxMTFiMCwgMHgxODhkYywgMHgxMzNiMCwgMHgxMTE5OCwgMHgxODhjZSwNCisgICAgICAgIDB4MTc3YjAsIDB4MTMzOTgsIDB4MTk5Y2UsIDB4MTc3OTgsIDB4MWJiY2UsIDB4MTExODYsDQorICAgICAgICAweDEzMzg2LCAweDExMWRjLCAweDEzM2RjLCAweDExMWNlLCAweDE3N2RjLCAweDEzM2NlLA0KKyAgICAgICAgMHgxZGNhMCwgMHgxZWU1OCwgMHgxZjcyZSwgMHgxZGM5MCwgMHgxZWU0YywgMHgxZGM4OCwNCisgICAgICAgIDB4MWVlNDYsIDB4MWRjODQsIDB4MWRjODIsIDB4MTk4YTAsIDB4MWNjNTgsIDB4MWU2MmUsDQorICAgICAgICAweDFiOWEwLCAweDE5ODkwLCAweDFlZTZlLCAweDFiOTkwLCAweDFkY2NjLCAweDFjYzQ2LA0KKyAgICAgICAgMHgxYjk4OCwgMHgxOTg4NCwgMHgxYjk4NCwgMHgxOTg4MiwgMHgxYjk4MiwgMHgxMTBhMCwNCisgICAgICAgIDB4MTg4NTgsIDB4MWM0MmUsIDB4MTMxYTAsIDB4MTEwOTAsIDB4MTg4NGMsIDB4MTczYTAsDQorICAgICAgICAweDEzMTkwLCAweDE5OGNjLCAweDE4ODQ2LCAweDE3MzkwLCAweDFiOWNjLCAweDExMDg0LA0KKyAgICAgICAgMHgxNzM4OCwgMHgxMzE4NCwgMHgxMTA4MiwgMHgxMzE4MiwgMHgxMTBkOCwgMHgxODg2ZSwNCisgICAgICAgIDB4MTMxZDgsIDB4MTEwY2MsIDB4MTczZDgsIDB4MTMxY2MsIDB4MTEwYzYsIDB4MTczY2MsDQorICAgICAgICAweDEzMWM2LCAweDExMGVlLCAweDE3M2VlLCAweDFkYzUwLCAweDFlZTJjLCAweDFkYzQ4LA0KKyAgICAgICAgMHgxZWUyNiwgMHgxZGM0NCwgMHgxZGM0MiwgMHgxOTg1MCwgMHgxY2MyYywgMHgxYjhkMCwNCisgICAgICAgIDB4MTk4NDgsIDB4MWNjMjYsIDB4MWI4YzgsIDB4MWRjNjYsIDB4MWI4YzQsIDB4MTk4NDIsDQorICAgICAgICAweDFiOGMyLCAweDExMDUwLCAweDE4ODJjLCAweDEzMGQwLCAweDExMDQ4LCAweDE4ODI2LA0KKyAgICAgICAgMHgxNzFkMCwgMHgxMzBjOCwgMHgxOTg2NiwgMHgxNzFjOCwgMHgxYjhlNiwgMHgxMTA0MiwNCisgICAgICAgIDB4MTcxYzQsIDB4MTMwYzIsIDB4MTcxYzIsIDB4MTMwZWMsIDB4MTcxZWMsIDB4MTcxZTYsDQorICAgICAgICAweDFlZTE2LCAweDFkYzIyLCAweDFjYzE2LCAweDE5ODI0LCAweDE5ODIyLCAweDExMDI4LA0KKyAgICAgICAgMHgxMzA2OCwgMHgxNzBlOCwgMHgxMTAyMiwgMHgxMzA2MiwgMHgxODU2MCwgMHgxMGE0MCwNCisgICAgICAgIDB4MTg1MzAsIDB4MTBhMjAsIDB4MTg1MTgsIDB4MWMyOGUsIDB4MTBhMTAsIDB4MTg1MGMsDQorICAgICAgICAweDEwYTA4LCAweDE4NTA2LCAweDEwYjYwLCAweDE4NWI4LCAweDFjMmRlLCAweDEwYjMwLA0KKyAgICAgICAgMHgxODU5YywgMHgxMGIxOCwgMHgxODU4ZSwgMHgxMGIwYywgMHgxMGIwNiwgMHgxMGJiOCwNCisgICAgICAgIDB4MTg1ZGUsIDB4MTBiOWMsIDB4MTBiOGUsIDB4MTBiZGUsIDB4MThkNDAsIDB4MWM2YjAsDQorICAgICAgICAweDFlMzVjLCAweDE4ZDIwLCAweDFjNjk4LCAweDE4ZDEwLCAweDFjNjhjLCAweDE4ZDA4LA0KKyAgICAgICAgMHgxYzY4NiwgMHgxOGQwNCwgMHgxMDk0MCwgMHgxODRiMCwgMHgxYzI1YywgMHgxMWI0MCwNCisgICAgICAgIDB4MTA5MjAsIDB4MWM2ZGMsIDB4MWMyNGUsIDB4MTFiMjAsIDB4MThkOTgsIDB4MWM2Y2UsDQorICAgICAgICAweDExYjEwLCAweDEwOTA4LCAweDE4NDg2LCAweDExYjA4LCAweDE4ZDg2LCAweDEwOTAyLA0KKyAgICAgICAgMHgxMDliMCwgMHgxODRkYywgMHgxMWJiMCwgMHgxMDk5OCwgMHgxODRjZSwgMHgxMWI5OCwNCisgICAgICAgIDB4MThkY2UsIDB4MTFiOGMsIDB4MTA5ODYsIDB4MTA5ZGMsIDB4MTFiZGMsIDB4MTA5Y2UsDQorICAgICAgICAweDExYmNlLCAweDFjZWEwLCAweDFlNzU4LCAweDFmM2FlLCAweDFjZTkwLCAweDFlNzRjLA0KKyAgICAgICAgMHgxY2U4OCwgMHgxZTc0NiwgMHgxY2U4NCwgMHgxY2U4MiwgMHgxOGNhMCwgMHgxYzY1OCwNCisgICAgICAgIDB4MTlkYTAsIDB4MThjOTAsIDB4MWM2NGMsIDB4MTlkOTAsIDB4MWNlY2MsIDB4MWM2NDYsDQorICAgICAgICAweDE5ZDg4LCAweDE4Yzg0LCAweDE5ZDg0LCAweDE4YzgyLCAweDE5ZDgyLCAweDEwOGEwLA0KKyAgICAgICAgMHgxODQ1OCwgMHgxMTlhMCwgMHgxMDg5MCwgMHgxYzY2ZSwgMHgxM2JhMCwgMHgxMTk5MCwNCisgICAgICAgIDB4MThjY2MsIDB4MTg0NDYsIDB4MTNiOTAsIDB4MTlkY2MsIDB4MTA4ODQsIDB4MTNiODgsDQorICAgICAgICAweDExOTg0LCAweDEwODgyLCAweDExOTgyLCAweDEwOGQ4LCAweDE4NDZlLCAweDExOWQ4LA0KKyAgICAgICAgMHgxMDhjYywgMHgxM2JkOCwgMHgxMTljYywgMHgxMDhjNiwgMHgxM2JjYywgMHgxMTljNiwNCisgICAgICAgIDB4MTA4ZWUsIDB4MTE5ZWUsIDB4MTNiZWUsIDB4MWVmNTAsIDB4MWY3YWMsIDB4MWVmNDgsDQorICAgICAgICAweDFmN2E2LCAweDFlZjQ0LCAweDFlZjQyLCAweDFjZTUwLCAweDFlNzJjLCAweDFkZWQwLA0KKyAgICAgICAgMHgxZWY2YywgMHgxZTcyNiwgMHgxZGVjOCwgMHgxZWY2NiwgMHgxZGVjNCwgMHgxY2U0MiwNCisgICAgICAgIDB4MWRlYzIsIDB4MThjNTAsIDB4MWM2MmMsIDB4MTljZDAsIDB4MThjNDgsIDB4MWM2MjYsDQorICAgICAgICAweDFiZGQwLCAweDE5Y2M4LCAweDFjZTY2LCAweDFiZGM4LCAweDFkZWU2LCAweDE4YzQyLA0KKyAgICAgICAgMHgxYmRjNCwgMHgxOWNjMiwgMHgxYmRjMiwgMHgxMDg1MCwgMHgxODQyYywgMHgxMThkMCwNCisgICAgICAgIDB4MTA4NDgsIDB4MTg0MjYsIDB4MTM5ZDAsIDB4MTE4YzgsIDB4MThjNjYsIDB4MTdiZDAsDQorICAgICAgICAweDEzOWM4LCAweDE5Y2U2LCAweDEwODQyLCAweDE3YmM4LCAweDFiZGU2LCAweDExOGMyLA0KKyAgICAgICAgMHgxN2JjNCwgMHgxMDg2YywgMHgxMThlYywgMHgxMDg2NiwgMHgxMzllYywgMHgxMThlNiwNCisgICAgICAgIDB4MTdiZWMsIDB4MTM5ZTYsIDB4MTdiZTYsIDB4MWVmMjgsIDB4MWY3OTYsIDB4MWVmMjQsDQorICAgICAgICAweDFlZjIyLCAweDFjZTI4LCAweDFlNzE2LCAweDFkZTY4LCAweDFlZjM2LCAweDFkZTY0LA0KKyAgICAgICAgMHgxY2UyMiwgMHgxZGU2MiwgMHgxOGMyOCwgMHgxYzYxNiwgMHgxOWM2OCwgMHgxOGMyNCwNCisgICAgICAgIDB4MWJjZTgsIDB4MTljNjQsIDB4MThjMjIsIDB4MWJjZTQsIDB4MTljNjIsIDB4MWJjZTIsDQorICAgICAgICAweDEwODI4LCAweDE4NDE2LCAweDExODY4LCAweDE4YzM2LCAweDEzOGU4LCAweDExODY0LA0KKyAgICAgICAgMHgxMDgyMiwgMHgxNzllOCwgMHgxMzhlNCwgMHgxMTg2MiwgMHgxNzllNCwgMHgxMzhlMiwNCisgICAgICAgIDB4MTc5ZTIsIDB4MTE4NzYsIDB4MTc5ZjYsIDB4MWVmMTIsIDB4MWRlMzQsIDB4MWRlMzIsDQorICAgICAgICAweDE5YzM0LCAweDFiYzc0LCAweDFiYzcyLCAweDExODM0LCAweDEzODc0LCAweDE3OGY0LA0KKyAgICAgICAgMHgxNzhmMiwgMHgxMDU0MCwgMHgxMDUyMCwgMHgxODI5OCwgMHgxMDUxMCwgMHgxMDUwOCwNCisgICAgICAgIDB4MTA1MDQsIDB4MTA1YjAsIDB4MTA1OTgsIDB4MTA1OGMsIDB4MTA1ODYsIDB4MTA1ZGMsDQorICAgICAgICAweDEwNWNlLCAweDE4NmEwLCAweDE4NjkwLCAweDFjMzRjLCAweDE4Njg4LCAweDFjMzQ2LA0KKyAgICAgICAgMHgxODY4NCwgMHgxODY4MiwgMHgxMDRhMCwgMHgxODI1OCwgMHgxMGRhMCwgMHgxODZkOCwNCisgICAgICAgIDB4MTgyNGMsIDB4MTBkOTAsIDB4MTg2Y2MsIDB4MTBkODgsIDB4MTg2YzYsIDB4MTBkODQsDQorICAgICAgICAweDEwNDgyLCAweDEwZDgyLCAweDEwNGQ4LCAweDE4MjZlLCAweDEwZGQ4LCAweDE4NmVlLA0KKyAgICAgICAgMHgxMGRjYywgMHgxMDRjNiwgMHgxMGRjNiwgMHgxMDRlZSwgMHgxMGRlZSwgMHgxYzc1MCwNCisgICAgICAgIDB4MWM3NDgsIDB4MWM3NDQsIDB4MWM3NDIsIDB4MTg2NTAsIDB4MThlZDAsIDB4MWM3NmMsDQorICAgICAgICAweDFjMzI2LCAweDE4ZWM4LCAweDFjNzY2LCAweDE4ZWM0LCAweDE4NjQyLCAweDE4ZWMyLA0KKyAgICAgICAgMHgxMDQ1MCwgMHgxMGNkMCwgMHgxMDQ0OCwgMHgxODIyNiwgMHgxMWRkMCwgMHgxMGNjOCwNCisgICAgICAgIDB4MTA0NDQsIDB4MTFkYzgsIDB4MTBjYzQsIDB4MTA0NDIsIDB4MTFkYzQsIDB4MTBjYzIsDQorICAgICAgICAweDEwNDZjLCAweDEwY2VjLCAweDEwNDY2LCAweDExZGVjLCAweDEwY2U2LCAweDExZGU2LA0KKyAgICAgICAgMHgxZTdhOCwgMHgxZTdhNCwgMHgxZTdhMiwgMHgxYzcyOCwgMHgxY2Y2OCwgMHgxZTdiNiwNCisgICAgICAgIDB4MWNmNjQsIDB4MWM3MjIsIDB4MWNmNjIsIDB4MTg2MjgsIDB4MWMzMTYsIDB4MThlNjgsDQorICAgICAgICAweDFjNzM2LCAweDE5ZWU4LCAweDE4ZTY0LCAweDE4NjIyLCAweDE5ZWU0LCAweDE4ZTYyLA0KKyAgICAgICAgMHgxOWVlMiwgMHgxMDQyOCwgMHgxODIxNiwgMHgxMGM2OCwgMHgxODYzNiwgMHgxMWNlOCwNCisgICAgICAgIDB4MTBjNjQsIDB4MTA0MjIsIDB4MTNkZTgsIDB4MTFjZTQsIDB4MTBjNjIsIDB4MTNkZTQsDQorICAgICAgICAweDExY2UyLCAweDEwNDM2LCAweDEwYzc2LCAweDExY2Y2LCAweDEzZGY2LCAweDFmN2Q0LA0KKyAgICAgICAgMHgxZjdkMiwgMHgxZTc5NCwgMHgxZWZiNCwgMHgxZTc5MiwgMHgxZWZiMiwgMHgxYzcxNCwNCisgICAgICAgIDB4MWNmMzQsIDB4MWM3MTIsIDB4MWRmNzQsIDB4MWNmMzIsIDB4MWRmNzIsIDB4MTg2MTQsDQorICAgICAgICAweDE4ZTM0LCAweDE4NjEyLCAweDE5ZTc0LCAweDE4ZTMyLCAweDFiZWY0DQorICAgIH0sDQorICAgIHsNCisgICAgICAgIDB4MWY1NjAsIDB4MWZhYjgsIDB4MWVhNDAsIDB4MWY1MzAsIDB4MWZhOWMsIDB4MWVhMjAsDQorICAgICAgICAweDFmNTE4LCAweDFmYThlLCAweDFlYTEwLCAweDFmNTBjLCAweDFlYTA4LCAweDFmNTA2LA0KKyAgICAgICAgMHgxZWEwNCwgMHgxZWI2MCwgMHgxZjViOCwgMHgxZmFkZSwgMHgxZDY0MCwgMHgxZWIzMCwNCisgICAgICAgIDB4MWY1OWMsIDB4MWQ2MjAsIDB4MWViMTgsIDB4MWY1OGUsIDB4MWQ2MTAsIDB4MWViMGMsDQorICAgICAgICAweDFkNjA4LCAweDFlYjA2LCAweDFkNjA0LCAweDFkNzYwLCAweDFlYmI4LCAweDFmNWRlLA0KKyAgICAgICAgMHgxYWU0MCwgMHgxZDczMCwgMHgxZWI5YywgMHgxYWUyMCwgMHgxZDcxOCwgMHgxZWI4ZSwNCisgICAgICAgIDB4MWFlMTAsIDB4MWQ3MGMsIDB4MWFlMDgsIDB4MWQ3MDYsIDB4MWFlMDQsIDB4MWFmNjAsDQorICAgICAgICAweDFkN2I4LCAweDFlYmRlLCAweDE1ZTQwLCAweDFhZjMwLCAweDFkNzljLCAweDE1ZTIwLA0KKyAgICAgICAgMHgxYWYxOCwgMHgxZDc4ZSwgMHgxNWUxMCwgMHgxYWYwYywgMHgxNWUwOCwgMHgxYWYwNiwNCisgICAgICAgIDB4MTVmNjAsIDB4MWFmYjgsIDB4MWQ3ZGUsIDB4MTVmMzAsIDB4MWFmOWMsIDB4MTVmMTgsDQorICAgICAgICAweDFhZjhlLCAweDE1ZjBjLCAweDE1ZmI4LCAweDFhZmRlLCAweDE1ZjljLCAweDE1ZjhlLA0KKyAgICAgICAgMHgxZTk0MCwgMHgxZjRiMCwgMHgxZmE1YywgMHgxZTkyMCwgMHgxZjQ5OCwgMHgxZmE0ZSwNCisgICAgICAgIDB4MWU5MTAsIDB4MWY0OGMsIDB4MWU5MDgsIDB4MWY0ODYsIDB4MWU5MDQsIDB4MWU5MDIsDQorICAgICAgICAweDFkMzQwLCAweDFlOWIwLCAweDFmNGRjLCAweDFkMzIwLCAweDFlOTk4LCAweDFmNGNlLA0KKyAgICAgICAgMHgxZDMxMCwgMHgxZTk4YywgMHgxZDMwOCwgMHgxZTk4NiwgMHgxZDMwNCwgMHgxZDMwMiwNCisgICAgICAgIDB4MWE3NDAsIDB4MWQzYjAsIDB4MWU5ZGMsIDB4MWE3MjAsIDB4MWQzOTgsIDB4MWU5Y2UsDQorICAgICAgICAweDFhNzEwLCAweDFkMzhjLCAweDFhNzA4LCAweDFkMzg2LCAweDFhNzA0LCAweDFhNzAyLA0KKyAgICAgICAgMHgxNGY0MCwgMHgxYTdiMCwgMHgxZDNkYywgMHgxNGYyMCwgMHgxYTc5OCwgMHgxZDNjZSwNCisgICAgICAgIDB4MTRmMTAsIDB4MWE3OGMsIDB4MTRmMDgsIDB4MWE3ODYsIDB4MTRmMDQsIDB4MTRmYjAsDQorICAgICAgICAweDFhN2RjLCAweDE0Zjk4LCAweDFhN2NlLCAweDE0ZjhjLCAweDE0Zjg2LCAweDE0ZmRjLA0KKyAgICAgICAgMHgxNGZjZSwgMHgxZThhMCwgMHgxZjQ1OCwgMHgxZmEyZSwgMHgxZTg5MCwgMHgxZjQ0YywNCisgICAgICAgIDB4MWU4ODgsIDB4MWY0NDYsIDB4MWU4ODQsIDB4MWU4ODIsIDB4MWQxYTAsIDB4MWU4ZDgsDQorICAgICAgICAweDFmNDZlLCAweDFkMTkwLCAweDFlOGNjLCAweDFkMTg4LCAweDFlOGM2LCAweDFkMTg0LA0KKyAgICAgICAgMHgxZDE4MiwgMHgxYTNhMCwgMHgxZDFkOCwgMHgxZThlZSwgMHgxYTM5MCwgMHgxZDFjYywNCisgICAgICAgIDB4MWEzODgsIDB4MWQxYzYsIDB4MWEzODQsIDB4MWEzODIsIDB4MTQ3YTAsIDB4MWEzZDgsDQorICAgICAgICAweDFkMWVlLCAweDE0NzkwLCAweDFhM2NjLCAweDE0Nzg4LCAweDFhM2M2LCAweDE0Nzg0LA0KKyAgICAgICAgMHgxNDc4MiwgMHgxNDdkOCwgMHgxYTNlZSwgMHgxNDdjYywgMHgxNDdjNiwgMHgxNDdlZSwNCisgICAgICAgIDB4MWU4NTAsIDB4MWY0MmMsIDB4MWU4NDgsIDB4MWY0MjYsIDB4MWU4NDQsIDB4MWU4NDIsDQorICAgICAgICAweDFkMGQwLCAweDFlODZjLCAweDFkMGM4LCAweDFlODY2LCAweDFkMGM0LCAweDFkMGMyLA0KKyAgICAgICAgMHgxYTFkMCwgMHgxZDBlYywgMHgxYTFjOCwgMHgxZDBlNiwgMHgxYTFjNCwgMHgxYTFjMiwNCisgICAgICAgIDB4MTQzZDAsIDB4MWExZWMsIDB4MTQzYzgsIDB4MWExZTYsIDB4MTQzYzQsIDB4MTQzYzIsDQorICAgICAgICAweDE0M2VjLCAweDE0M2U2LCAweDFlODI4LCAweDFmNDE2LCAweDFlODI0LCAweDFlODIyLA0KKyAgICAgICAgMHgxZDA2OCwgMHgxZTgzNiwgMHgxZDA2NCwgMHgxZDA2MiwgMHgxYTBlOCwgMHgxZDA3NiwNCisgICAgICAgIDB4MWEwZTQsIDB4MWEwZTIsIDB4MTQxZTgsIDB4MWEwZjYsIDB4MTQxZTQsIDB4MTQxZTIsDQorICAgICAgICAweDFlODE0LCAweDFlODEyLCAweDFkMDM0LCAweDFkMDMyLCAweDFhMDc0LCAweDFhMDcyLA0KKyAgICAgICAgMHgxZTU0MCwgMHgxZjJiMCwgMHgxZjk1YywgMHgxZTUyMCwgMHgxZjI5OCwgMHgxZjk0ZSwNCisgICAgICAgIDB4MWU1MTAsIDB4MWYyOGMsIDB4MWU1MDgsIDB4MWYyODYsIDB4MWU1MDQsIDB4MWU1MDIsDQorICAgICAgICAweDFjYjQwLCAweDFlNWIwLCAweDFmMmRjLCAweDFjYjIwLCAweDFlNTk4LCAweDFmMmNlLA0KKyAgICAgICAgMHgxY2IxMCwgMHgxZTU4YywgMHgxY2IwOCwgMHgxZTU4NiwgMHgxY2IwNCwgMHgxY2IwMiwNCisgICAgICAgIDB4MTk3NDAsIDB4MWNiYjAsIDB4MWU1ZGMsIDB4MTk3MjAsIDB4MWNiOTgsIDB4MWU1Y2UsDQorICAgICAgICAweDE5NzEwLCAweDFjYjhjLCAweDE5NzA4LCAweDFjYjg2LCAweDE5NzA0LCAweDE5NzAyLA0KKyAgICAgICAgMHgxMmY0MCwgMHgxOTdiMCwgMHgxY2JkYywgMHgxMmYyMCwgMHgxOTc5OCwgMHgxY2JjZSwNCisgICAgICAgIDB4MTJmMTAsIDB4MTk3OGMsIDB4MTJmMDgsIDB4MTk3ODYsIDB4MTJmMDQsIDB4MTJmYjAsDQorICAgICAgICAweDE5N2RjLCAweDEyZjk4LCAweDE5N2NlLCAweDEyZjhjLCAweDEyZjg2LCAweDEyZmRjLA0KKyAgICAgICAgMHgxMmZjZSwgMHgxZjZhMCwgMHgxZmI1OCwgMHgxNmJmMCwgMHgxZjY5MCwgMHgxZmI0YywNCisgICAgICAgIDB4MTY5ZjgsIDB4MWY2ODgsIDB4MWZiNDYsIDB4MTY4ZmMsIDB4MWY2ODQsIDB4MWY2ODIsDQorICAgICAgICAweDFlNGEwLCAweDFmMjU4LCAweDFmOTJlLCAweDFlZGEwLCAweDFlNDkwLCAweDFmYjZlLA0KKyAgICAgICAgMHgxZWQ5MCwgMHgxZjZjYywgMHgxZjI0NiwgMHgxZWQ4OCwgMHgxZTQ4NCwgMHgxZWQ4NCwNCisgICAgICAgIDB4MWU0ODIsIDB4MWVkODIsIDB4MWM5YTAsIDB4MWU0ZDgsIDB4MWYyNmUsIDB4MWRiYTAsDQorICAgICAgICAweDFjOTkwLCAweDFlNGNjLCAweDFkYjkwLCAweDFlZGNjLCAweDFlNGM2LCAweDFkYjg4LA0KKyAgICAgICAgMHgxYzk4NCwgMHgxZGI4NCwgMHgxYzk4MiwgMHgxZGI4MiwgMHgxOTNhMCwgMHgxYzlkOCwNCisgICAgICAgIDB4MWU0ZWUsIDB4MWI3YTAsIDB4MTkzOTAsIDB4MWM5Y2MsIDB4MWI3OTAsIDB4MWRiY2MsDQorICAgICAgICAweDFjOWM2LCAweDFiNzg4LCAweDE5Mzg0LCAweDFiNzg0LCAweDE5MzgyLCAweDFiNzgyLA0KKyAgICAgICAgMHgxMjdhMCwgMHgxOTNkOCwgMHgxYzllZSwgMHgxNmZhMCwgMHgxMjc5MCwgMHgxOTNjYywNCisgICAgICAgIDB4MTZmOTAsIDB4MWI3Y2MsIDB4MTkzYzYsIDB4MTZmODgsIDB4MTI3ODQsIDB4MTZmODQsDQorICAgICAgICAweDEyNzgyLCAweDEyN2Q4LCAweDE5M2VlLCAweDE2ZmQ4LCAweDEyN2NjLCAweDE2ZmNjLA0KKyAgICAgICAgMHgxMjdjNiwgMHgxNmZjNiwgMHgxMjdlZSwgMHgxZjY1MCwgMHgxZmIyYywgMHgxNjVmOCwNCisgICAgICAgIDB4MWY2NDgsIDB4MWZiMjYsIDB4MTY0ZmMsIDB4MWY2NDQsIDB4MTY0N2UsIDB4MWY2NDIsDQorICAgICAgICAweDFlNDUwLCAweDFmMjJjLCAweDFlY2QwLCAweDFlNDQ4LCAweDFmMjI2LCAweDFlY2M4LA0KKyAgICAgICAgMHgxZjY2NiwgMHgxZWNjNCwgMHgxZTQ0MiwgMHgxZWNjMiwgMHgxYzhkMCwgMHgxZTQ2YywNCisgICAgICAgIDB4MWQ5ZDAsIDB4MWM4YzgsIDB4MWU0NjYsIDB4MWQ5YzgsIDB4MWVjZTYsIDB4MWQ5YzQsDQorICAgICAgICAweDFjOGMyLCAweDFkOWMyLCAweDE5MWQwLCAweDFjOGVjLCAweDFiM2QwLCAweDE5MWM4LA0KKyAgICAgICAgMHgxYzhlNiwgMHgxYjNjOCwgMHgxZDllNiwgMHgxYjNjNCwgMHgxOTFjMiwgMHgxYjNjMiwNCisgICAgICAgIDB4MTIzZDAsIDB4MTkxZWMsIDB4MTY3ZDAsIDB4MTIzYzgsIDB4MTkxZTYsIDB4MTY3YzgsDQorICAgICAgICAweDFiM2U2LCAweDE2N2M0LCAweDEyM2MyLCAweDE2N2MyLCAweDEyM2VjLCAweDE2N2VjLA0KKyAgICAgICAgMHgxMjNlNiwgMHgxNjdlNiwgMHgxZjYyOCwgMHgxZmIxNiwgMHgxNjJmYywgMHgxZjYyNCwNCisgICAgICAgIDB4MTYyN2UsIDB4MWY2MjIsIDB4MWU0MjgsIDB4MWYyMTYsIDB4MWVjNjgsIDB4MWY2MzYsDQorICAgICAgICAweDFlYzY0LCAweDFlNDIyLCAweDFlYzYyLCAweDFjODY4LCAweDFlNDM2LCAweDFkOGU4LA0KKyAgICAgICAgMHgxYzg2NCwgMHgxZDhlNCwgMHgxYzg2MiwgMHgxZDhlMiwgMHgxOTBlOCwgMHgxYzg3NiwNCisgICAgICAgIDB4MWIxZTgsIDB4MWQ4ZjYsIDB4MWIxZTQsIDB4MTkwZTIsIDB4MWIxZTIsIDB4MTIxZTgsDQorICAgICAgICAweDE5MGY2LCAweDE2M2U4LCAweDEyMWU0LCAweDE2M2U0LCAweDEyMWUyLCAweDE2M2UyLA0KKyAgICAgICAgMHgxMjFmNiwgMHgxNjNmNiwgMHgxZjYxNCwgMHgxNjE3ZSwgMHgxZjYxMiwgMHgxZTQxNCwNCisgICAgICAgIDB4MWVjMzQsIDB4MWU0MTIsIDB4MWVjMzIsIDB4MWM4MzQsIDB4MWQ4NzQsIDB4MWM4MzIsDQorICAgICAgICAweDFkODcyLCAweDE5MDc0LCAweDFiMGY0LCAweDE5MDcyLCAweDFiMGYyLCAweDEyMGY0LA0KKyAgICAgICAgMHgxNjFmNCwgMHgxMjBmMiwgMHgxNjFmMiwgMHgxZjYwYSwgMHgxZTQwYSwgMHgxZWMxYSwNCisgICAgICAgIDB4MWM4MWEsIDB4MWQ4M2EsIDB4MTkwM2EsIDB4MWIwN2EsIDB4MWUyYTAsIDB4MWYxNTgsDQorICAgICAgICAweDFmOGFlLCAweDFlMjkwLCAweDFmMTRjLCAweDFlMjg4LCAweDFmMTQ2LCAweDFlMjg0LA0KKyAgICAgICAgMHgxZTI4MiwgMHgxYzVhMCwgMHgxZTJkOCwgMHgxZjE2ZSwgMHgxYzU5MCwgMHgxZTJjYywNCisgICAgICAgIDB4MWM1ODgsIDB4MWUyYzYsIDB4MWM1ODQsIDB4MWM1ODIsIDB4MThiYTAsIDB4MWM1ZDgsDQorICAgICAgICAweDFlMmVlLCAweDE4YjkwLCAweDFjNWNjLCAweDE4Yjg4LCAweDFjNWM2LCAweDE4Yjg0LA0KKyAgICAgICAgMHgxOGI4MiwgMHgxMTdhMCwgMHgxOGJkOCwgMHgxYzVlZSwgMHgxMTc5MCwgMHgxOGJjYywNCisgICAgICAgIDB4MTE3ODgsIDB4MThiYzYsIDB4MTE3ODQsIDB4MTE3ODIsIDB4MTE3ZDgsIDB4MThiZWUsDQorICAgICAgICAweDExN2NjLCAweDExN2M2LCAweDExN2VlLCAweDFmMzUwLCAweDFmOWFjLCAweDEzNWY4LA0KKyAgICAgICAgMHgxZjM0OCwgMHgxZjlhNiwgMHgxMzRmYywgMHgxZjM0NCwgMHgxMzQ3ZSwgMHgxZjM0MiwNCisgICAgICAgIDB4MWUyNTAsIDB4MWYxMmMsIDB4MWU2ZDAsIDB4MWUyNDgsIDB4MWYxMjYsIDB4MWU2YzgsDQorICAgICAgICAweDFmMzY2LCAweDFlNmM0LCAweDFlMjQyLCAweDFlNmMyLCAweDFjNGQwLCAweDFlMjZjLA0KKyAgICAgICAgMHgxY2RkMCwgMHgxYzRjOCwgMHgxZTI2NiwgMHgxY2RjOCwgMHgxZTZlNiwgMHgxY2RjNCwNCisgICAgICAgIDB4MWM0YzIsIDB4MWNkYzIsIDB4MTg5ZDAsIDB4MWM0ZWMsIDB4MTliZDAsIDB4MTg5YzgsDQorICAgICAgICAweDFjNGU2LCAweDE5YmM4LCAweDFjZGU2LCAweDE5YmM0LCAweDE4OWMyLCAweDE5YmMyLA0KKyAgICAgICAgMHgxMTNkMCwgMHgxODllYywgMHgxMzdkMCwgMHgxMTNjOCwgMHgxODllNiwgMHgxMzdjOCwNCisgICAgICAgIDB4MTliZTYsIDB4MTM3YzQsIDB4MTEzYzIsIDB4MTM3YzIsIDB4MTEzZWMsIDB4MTM3ZWMsDQorICAgICAgICAweDExM2U2LCAweDEzN2U2LCAweDFmYmE4LCAweDE3NWYwLCAweDFiYWZjLCAweDFmYmE0LA0KKyAgICAgICAgMHgxNzRmOCwgMHgxYmE3ZSwgMHgxZmJhMiwgMHgxNzQ3YywgMHgxNzQzZSwgMHgxZjMyOCwNCisgICAgICAgIDB4MWY5OTYsIDB4MTMyZmMsIDB4MWY3NjgsIDB4MWZiYjYsIDB4MTc2ZmMsIDB4MTMyN2UsDQorICAgICAgICAweDFmNzY0LCAweDFmMzIyLCAweDE3NjdlLCAweDFmNzYyLCAweDFlMjI4LCAweDFmMTE2LA0KKyAgICAgICAgMHgxZTY2OCwgMHgxZTIyNCwgMHgxZWVlOCwgMHgxZjc3NiwgMHgxZTIyMiwgMHgxZWVlNCwNCisgICAgICAgIDB4MWU2NjIsIDB4MWVlZTIsIDB4MWM0NjgsIDB4MWUyMzYsIDB4MWNjZTgsIDB4MWM0NjQsDQorICAgICAgICAweDFkZGU4LCAweDFjY2U0LCAweDFjNDYyLCAweDFkZGU0LCAweDFjY2UyLCAweDFkZGUyLA0KKyAgICAgICAgMHgxODhlOCwgMHgxYzQ3NiwgMHgxOTllOCwgMHgxODhlNCwgMHgxYmJlOCwgMHgxOTllNCwNCisgICAgICAgIDB4MTg4ZTIsIDB4MWJiZTQsIDB4MTk5ZTIsIDB4MWJiZTIsIDB4MTExZTgsIDB4MTg4ZjYsDQorICAgICAgICAweDEzM2U4LCAweDExMWU0LCAweDE3N2U4LCAweDEzM2U0LCAweDExMWUyLCAweDE3N2U0LA0KKyAgICAgICAgMHgxMzNlMiwgMHgxNzdlMiwgMHgxMTFmNiwgMHgxMzNmNiwgMHgxZmI5NCwgMHgxNzJmOCwNCisgICAgICAgIDB4MWI5N2UsIDB4MWZiOTIsIDB4MTcyN2MsIDB4MTcyM2UsIDB4MWYzMTQsIDB4MTMxN2UsDQorICAgICAgICAweDFmNzM0LCAweDFmMzEyLCAweDE3MzdlLCAweDFmNzMyLCAweDFlMjE0LCAweDFlNjM0LA0KKyAgICAgICAgMHgxZTIxMiwgMHgxZWU3NCwgMHgxZTYzMiwgMHgxZWU3MiwgMHgxYzQzNCwgMHgxY2M3NCwNCisgICAgICAgIDB4MWM0MzIsIDB4MWRjZjQsIDB4MWNjNzIsIDB4MWRjZjIsIDB4MTg4NzQsIDB4MTk4ZjQsDQorICAgICAgICAweDE4ODcyLCAweDFiOWY0LCAweDE5OGYyLCAweDFiOWYyLCAweDExMGY0LCAweDEzMWY0LA0KKyAgICAgICAgMHgxMTBmMiwgMHgxNzNmNCwgMHgxMzFmMiwgMHgxNzNmMiwgMHgxZmI4YSwgMHgxNzE3YywNCisgICAgICAgIDB4MTcxM2UsIDB4MWYzMGEsIDB4MWY3MWEsIDB4MWUyMGEsIDB4MWU2MWEsIDB4MWVlM2EsDQorICAgICAgICAweDFjNDFhLCAweDFjYzNhLCAweDFkYzdhLCAweDE4ODNhLCAweDE5ODdhLCAweDFiOGZhLA0KKyAgICAgICAgMHgxMTA3YSwgMHgxMzBmYSwgMHgxNzFmYSwgMHgxNzBiZSwgMHgxZTE1MCwgMHgxZjBhYywNCisgICAgICAgIDB4MWUxNDgsIDB4MWYwYTYsIDB4MWUxNDQsIDB4MWUxNDIsIDB4MWMyZDAsIDB4MWUxNmMsDQorICAgICAgICAweDFjMmM4LCAweDFlMTY2LCAweDFjMmM0LCAweDFjMmMyLCAweDE4NWQwLCAweDFjMmVjLA0KKyAgICAgICAgMHgxODVjOCwgMHgxYzJlNiwgMHgxODVjNCwgMHgxODVjMiwgMHgxMGJkMCwgMHgxODVlYywNCisgICAgICAgIDB4MTBiYzgsIDB4MTg1ZTYsIDB4MTBiYzQsIDB4MTBiYzIsIDB4MTBiZWMsIDB4MTBiZTYsDQorICAgICAgICAweDFmMWE4LCAweDFmOGQ2LCAweDExYWZjLCAweDFmMWE0LCAweDExYTdlLCAweDFmMWEyLA0KKyAgICAgICAgMHgxZTEyOCwgMHgxZjA5NiwgMHgxZTM2OCwgMHgxZTEyNCwgMHgxZTM2NCwgMHgxZTEyMiwNCisgICAgICAgIDB4MWUzNjIsIDB4MWMyNjgsIDB4MWUxMzYsIDB4MWM2ZTgsIDB4MWMyNjQsIDB4MWM2ZTQsDQorICAgICAgICAweDFjMjYyLCAweDFjNmUyLCAweDE4NGU4LCAweDFjMjc2LCAweDE4ZGU4LCAweDE4NGU0LA0KKyAgICAgICAgMHgxOGRlNCwgMHgxODRlMiwgMHgxOGRlMiwgMHgxMDllOCwgMHgxODRmNiwgMHgxMWJlOCwNCisgICAgICAgIDB4MTA5ZTQsIDB4MTFiZTQsIDB4MTA5ZTIsIDB4MTFiZTIsIDB4MTA5ZjYsIDB4MTFiZjYsDQorICAgICAgICAweDFmOWQ0LCAweDEzYWY4LCAweDE5ZDdlLCAweDFmOWQyLCAweDEzYTdjLCAweDEzYTNlLA0KKyAgICAgICAgMHgxZjE5NCwgMHgxMTk3ZSwgMHgxZjNiNCwgMHgxZjE5MiwgMHgxM2I3ZSwgMHgxZjNiMiwNCisgICAgICAgIDB4MWUxMTQsIDB4MWUzMzQsIDB4MWUxMTIsIDB4MWU3NzQsIDB4MWUzMzIsIDB4MWU3NzIsDQorICAgICAgICAweDFjMjM0LCAweDFjNjc0LCAweDFjMjMyLCAweDFjZWY0LCAweDFjNjcyLCAweDFjZWYyLA0KKyAgICAgICAgMHgxODQ3NCwgMHgxOGNmNCwgMHgxODQ3MiwgMHgxOWRmNCwgMHgxOGNmMiwgMHgxOWRmMiwNCisgICAgICAgIDB4MTA4ZjQsIDB4MTE5ZjQsIDB4MTA4ZjIsIDB4MTNiZjQsIDB4MTE5ZjIsIDB4MTNiZjIsDQorICAgICAgICAweDE3YWYwLCAweDFiZDdjLCAweDE3YTc4LCAweDFiZDNlLCAweDE3YTNjLCAweDE3YTFlLA0KKyAgICAgICAgMHgxZjljYSwgMHgxMzk3YywgMHgxZmJkYSwgMHgxN2I3YywgMHgxMzkzZSwgMHgxN2IzZSwNCisgICAgICAgIDB4MWYxOGEsIDB4MWYzOWEsIDB4MWY3YmEsIDB4MWUxMGEsIDB4MWUzMWEsIDB4MWU3M2EsDQorICAgICAgICAweDFlZjdhLCAweDFjMjFhLCAweDFjNjNhLCAweDFjZTdhLCAweDFkZWZhLCAweDE4NDNhLA0KKyAgICAgICAgMHgxOGM3YSwgMHgxOWNmYSwgMHgxYmRmYSwgMHgxMDg3YSwgMHgxMThmYSwgMHgxMzlmYSwNCisgICAgICAgIDB4MTc5NzgsIDB4MWJjYmUsIDB4MTc5M2MsIDB4MTc5MWUsIDB4MTM4YmUsIDB4MTc5YmUsDQorICAgICAgICAweDE3OGJjLCAweDE3ODllLCAweDE3ODVlLCAweDFlMGE4LCAweDFlMGE0LCAweDFlMGEyLA0KKyAgICAgICAgMHgxYzE2OCwgMHgxZTBiNiwgMHgxYzE2NCwgMHgxYzE2MiwgMHgxODJlOCwgMHgxYzE3NiwNCisgICAgICAgIDB4MTgyZTQsIDB4MTgyZTIsIDB4MTA1ZTgsIDB4MTgyZjYsIDB4MTA1ZTQsIDB4MTA1ZTIsDQorICAgICAgICAweDEwNWY2LCAweDFmMGQ0LCAweDEwZDdlLCAweDFmMGQyLCAweDFlMDk0LCAweDFlMWI0LA0KKyAgICAgICAgMHgxZTA5MiwgMHgxZTFiMiwgMHgxYzEzNCwgMHgxYzM3NCwgMHgxYzEzMiwgMHgxYzM3MiwNCisgICAgICAgIDB4MTgyNzQsIDB4MTg2ZjQsIDB4MTgyNzIsIDB4MTg2ZjIsIDB4MTA0ZjQsIDB4MTBkZjQsDQorICAgICAgICAweDEwNGYyLCAweDEwZGYyLCAweDFmOGVhLCAweDExZDdjLCAweDExZDNlLCAweDFmMGNhLA0KKyAgICAgICAgMHgxZjFkYSwgMHgxZTA4YSwgMHgxZTE5YSwgMHgxZTNiYSwgMHgxYzExYSwgMHgxYzMzYSwNCisgICAgICAgIDB4MWM3N2EsIDB4MTgyM2EsIDB4MTg2N2EsIDB4MThlZmEsIDB4MTA0N2EsIDB4MTBjZmEsDQorICAgICAgICAweDExZGZhLCAweDEzZDc4LCAweDE5ZWJlLCAweDEzZDNjLCAweDEzZDFlLCAweDExY2JlLA0KKyAgICAgICAgMHgxM2RiZSwgMHgxN2Q3MCwgMHgxYmViYywgMHgxN2QzOCwgMHgxYmU5ZSwgMHgxN2QxYywNCisgICAgICAgIDB4MTdkMGUsIDB4MTNjYmMsIDB4MTdkYmMsIDB4MTNjOWUsIDB4MTdkOWUsIDB4MTdjYjgsDQorICAgICAgICAweDFiZTVlLCAweDE3YzljLCAweDE3YzhlLCAweDEzYzVlLCAweDE3Y2RlLCAweDE3YzVjLA0KKyAgICAgICAgMHgxN2M0ZSwgMHgxN2MyZSwgMHgxYzBiNCwgMHgxYzBiMiwgMHgxODE3NCwgMHgxODE3MiwNCisgICAgICAgIDB4MTAyZjQsIDB4MTAyZjIsIDB4MWUwZGEsIDB4MWMwOWEsIDB4MWMxYmEsIDB4MTgxM2EsDQorICAgICAgICAweDE4MzdhLCAweDEwMjdhLCAweDEwNmZhLCAweDEwZWJlLCAweDExZWJjLCAweDExZTllLA0KKyAgICAgICAgMHgxM2ViOCwgMHgxOWY1ZSwgMHgxM2U5YywgMHgxM2U4ZSwgMHgxMWU1ZSwgMHgxM2VkZSwNCisgICAgICAgIDB4MTdlYjAsIDB4MWJmNWMsIDB4MTdlOTgsIDB4MWJmNGUsIDB4MTdlOGMsIDB4MTdlODYsDQorICAgICAgICAweDEzZTVjLCAweDE3ZWRjLCAweDEzZTRlLCAweDE3ZWNlLCAweDE3ZTU4LCAweDFiZjJlLA0KKyAgICAgICAgMHgxN2U0YywgMHgxN2U0NiwgMHgxM2UyZSwgMHgxN2U2ZSwgMHgxN2UyYywgMHgxN2UyNiwNCisgICAgICAgIDB4MTBmNWUsIDB4MTFmNWMsIDB4MTFmNGUsIDB4MTNmNTgsIDB4MTlmYWUsIDB4MTNmNGMsDQorICAgICAgICAweDEzZjQ2LCAweDExZjJlLCAweDEzZjZlLCAweDEzZjJjLCAweDEzZjI2DQorICAgIH0sDQorICAgIHsNCisgICAgICAgIDB4MWFiZTAsIDB4MWQ1ZjgsIDB4MTUzYzAsIDB4MWE5ZjAsIDB4MWQ0ZmMsIDB4MTUxZTAsDQorICAgICAgICAweDFhOGY4LCAweDFkNDdlLCAweDE1MGYwLCAweDFhODdjLCAweDE1MDc4LCAweDFmYWQwLA0KKyAgICAgICAgMHgxNWJlMCwgMHgxYWRmOCwgMHgxZmFjOCwgMHgxNTlmMCwgMHgxYWNmYywgMHgxZmFjNCwNCisgICAgICAgIDB4MTU4ZjgsIDB4MWFjN2UsIDB4MWZhYzIsIDB4MTU4N2MsIDB4MWY1ZDAsIDB4MWZhZWMsDQorICAgICAgICAweDE1ZGY4LCAweDFmNWM4LCAweDFmYWU2LCAweDE1Y2ZjLCAweDFmNWM0LCAweDE1YzdlLA0KKyAgICAgICAgMHgxZjVjMiwgMHgxZWJkMCwgMHgxZjVlYywgMHgxZWJjOCwgMHgxZjVlNiwgMHgxZWJjNCwNCisgICAgICAgIDB4MWViYzIsIDB4MWQ3ZDAsIDB4MWViZWMsIDB4MWQ3YzgsIDB4MWViZTYsIDB4MWQ3YzQsDQorICAgICAgICAweDFkN2MyLCAweDFhZmQwLCAweDFkN2VjLCAweDFhZmM4LCAweDFkN2U2LCAweDFhZmM0LA0KKyAgICAgICAgMHgxNGJjMCwgMHgxYTVmMCwgMHgxZDJmYywgMHgxNDllMCwgMHgxYTRmOCwgMHgxZDI3ZSwNCisgICAgICAgIDB4MTQ4ZjAsIDB4MWE0N2MsIDB4MTQ4NzgsIDB4MWE0M2UsIDB4MTQ4M2MsIDB4MWZhNjgsDQorICAgICAgICAweDE0ZGYwLCAweDFhNmZjLCAweDFmYTY0LCAweDE0Y2Y4LCAweDFhNjdlLCAweDFmYTYyLA0KKyAgICAgICAgMHgxNGM3YywgMHgxNGMzZSwgMHgxZjRlOCwgMHgxZmE3NiwgMHgxNGVmYywgMHgxZjRlNCwNCisgICAgICAgIDB4MTRlN2UsIDB4MWY0ZTIsIDB4MWU5ZTgsIDB4MWY0ZjYsIDB4MWU5ZTQsIDB4MWU5ZTIsDQorICAgICAgICAweDFkM2U4LCAweDFlOWY2LCAweDFkM2U0LCAweDFkM2UyLCAweDFhN2U4LCAweDFkM2Y2LA0KKyAgICAgICAgMHgxYTdlNCwgMHgxYTdlMiwgMHgxNDVlMCwgMHgxYTJmOCwgMHgxZDE3ZSwgMHgxNDRmMCwNCisgICAgICAgIDB4MWEyN2MsIDB4MTQ0NzgsIDB4MWEyM2UsIDB4MTQ0M2MsIDB4MTQ0MWUsIDB4MWZhMzQsDQorICAgICAgICAweDE0NmY4LCAweDFhMzdlLCAweDFmYTMyLCAweDE0NjdjLCAweDE0NjNlLCAweDFmNDc0LA0KKyAgICAgICAgMHgxNDc3ZSwgMHgxZjQ3MiwgMHgxZThmNCwgMHgxZThmMiwgMHgxZDFmNCwgMHgxZDFmMiwNCisgICAgICAgIDB4MWEzZjQsIDB4MWEzZjIsIDB4MTQyZjAsIDB4MWExN2MsIDB4MTQyNzgsIDB4MWExM2UsDQorICAgICAgICAweDE0MjNjLCAweDE0MjFlLCAweDFmYTFhLCAweDE0MzdjLCAweDE0MzNlLCAweDFmNDNhLA0KKyAgICAgICAgMHgxZTg3YSwgMHgxZDBmYSwgMHgxNDE3OCwgMHgxYTBiZSwgMHgxNDEzYywgMHgxNDExZSwNCisgICAgICAgIDB4MTQxYmUsIDB4MTQwYmMsIDB4MTQwOWUsIDB4MTJiYzAsIDB4MTk1ZjAsIDB4MWNhZmMsDQorICAgICAgICAweDEyOWUwLCAweDE5NGY4LCAweDFjYTdlLCAweDEyOGYwLCAweDE5NDdjLCAweDEyODc4LA0KKyAgICAgICAgMHgxOTQzZSwgMHgxMjgzYywgMHgxZjk2OCwgMHgxMmRmMCwgMHgxOTZmYywgMHgxZjk2NCwNCisgICAgICAgIDB4MTJjZjgsIDB4MTk2N2UsIDB4MWY5NjIsIDB4MTJjN2MsIDB4MTJjM2UsIDB4MWYyZTgsDQorICAgICAgICAweDFmOTc2LCAweDEyZWZjLCAweDFmMmU0LCAweDEyZTdlLCAweDFmMmUyLCAweDFlNWU4LA0KKyAgICAgICAgMHgxZjJmNiwgMHgxZTVlNCwgMHgxZTVlMiwgMHgxY2JlOCwgMHgxZTVmNiwgMHgxY2JlNCwNCisgICAgICAgIDB4MWNiZTIsIDB4MTk3ZTgsIDB4MWNiZjYsIDB4MTk3ZTQsIDB4MTk3ZTIsIDB4MWI1ZTAsDQorICAgICAgICAweDFkYWY4LCAweDFlZDdlLCAweDE2OWMwLCAweDFiNGYwLCAweDFkYTdjLCAweDE2OGUwLA0KKyAgICAgICAgMHgxYjQ3OCwgMHgxZGEzZSwgMHgxNjg3MCwgMHgxYjQzYywgMHgxNjgzOCwgMHgxYjQxZSwNCisgICAgICAgIDB4MTY4MWMsIDB4MTI1ZTAsIDB4MTkyZjgsIDB4MWM5N2UsIDB4MTZkZTAsIDB4MTI0ZjAsDQorICAgICAgICAweDE5MjdjLCAweDE2Y2YwLCAweDFiNjdjLCAweDE5MjNlLCAweDE2Yzc4LCAweDEyNDNjLA0KKyAgICAgICAgMHgxNmMzYywgMHgxMjQxZSwgMHgxNmMxZSwgMHgxZjkzNCwgMHgxMjZmOCwgMHgxOTM3ZSwNCisgICAgICAgIDB4MWZiNzQsIDB4MWY5MzIsIDB4MTZlZjgsIDB4MTI2N2MsIDB4MWZiNzIsIDB4MTZlN2MsDQorICAgICAgICAweDEyNjNlLCAweDE2ZTNlLCAweDFmMjc0LCAweDEyNzdlLCAweDFmNmY0LCAweDFmMjcyLA0KKyAgICAgICAgMHgxNmY3ZSwgMHgxZjZmMiwgMHgxZTRmNCwgMHgxZWRmNCwgMHgxZTRmMiwgMHgxZWRmMiwNCisgICAgICAgIDB4MWM5ZjQsIDB4MWRiZjQsIDB4MWM5ZjIsIDB4MWRiZjIsIDB4MTkzZjQsIDB4MTkzZjIsDQorICAgICAgICAweDE2NWMwLCAweDFiMmYwLCAweDFkOTdjLCAweDE2NGUwLCAweDFiMjc4LCAweDFkOTNlLA0KKyAgICAgICAgMHgxNjQ3MCwgMHgxYjIzYywgMHgxNjQzOCwgMHgxYjIxZSwgMHgxNjQxYywgMHgxNjQwZSwNCisgICAgICAgIDB4MTIyZjAsIDB4MTkxN2MsIDB4MTY2ZjAsIDB4MTIyNzgsIDB4MTkxM2UsIDB4MTY2NzgsDQorICAgICAgICAweDFiMzNlLCAweDE2NjNjLCAweDEyMjFlLCAweDE2NjFlLCAweDFmOTFhLCAweDEyMzdjLA0KKyAgICAgICAgMHgxZmIzYSwgMHgxNjc3YywgMHgxMjMzZSwgMHgxNjczZSwgMHgxZjIzYSwgMHgxZjY3YSwNCisgICAgICAgIDB4MWU0N2EsIDB4MWVjZmEsIDB4MWM4ZmEsIDB4MWQ5ZmEsIDB4MTkxZmEsIDB4MTYyZTAsDQorICAgICAgICAweDFiMTc4LCAweDFkOGJlLCAweDE2MjcwLCAweDFiMTNjLCAweDE2MjM4LCAweDFiMTFlLA0KKyAgICAgICAgMHgxNjIxYywgMHgxNjIwZSwgMHgxMjE3OCwgMHgxOTBiZSwgMHgxNjM3OCwgMHgxMjEzYywNCisgICAgICAgIDB4MTYzM2MsIDB4MTIxMWUsIDB4MTYzMWUsIDB4MTIxYmUsIDB4MTYzYmUsIDB4MTYxNzAsDQorICAgICAgICAweDFiMGJjLCAweDE2MTM4LCAweDFiMDllLCAweDE2MTFjLCAweDE2MTBlLCAweDEyMGJjLA0KKyAgICAgICAgMHgxNjFiYywgMHgxMjA5ZSwgMHgxNjE5ZSwgMHgxNjBiOCwgMHgxYjA1ZSwgMHgxNjA5YywNCisgICAgICAgIDB4MTYwOGUsIDB4MTIwNWUsIDB4MTYwZGUsIDB4MTYwNWMsIDB4MTYwNGUsIDB4MTE1ZTAsDQorICAgICAgICAweDE4YWY4LCAweDFjNTdlLCAweDExNGYwLCAweDE4YTdjLCAweDExNDc4LCAweDE4YTNlLA0KKyAgICAgICAgMHgxMTQzYywgMHgxMTQxZSwgMHgxZjhiNCwgMHgxMTZmOCwgMHgxOGI3ZSwgMHgxZjhiMiwNCisgICAgICAgIDB4MTE2N2MsIDB4MTE2M2UsIDB4MWYxNzQsIDB4MTE3N2UsIDB4MWYxNzIsIDB4MWUyZjQsDQorICAgICAgICAweDFlMmYyLCAweDFjNWY0LCAweDFjNWYyLCAweDE4YmY0LCAweDE4YmYyLCAweDEzNWMwLA0KKyAgICAgICAgMHgxOWFmMCwgMHgxY2Q3YywgMHgxMzRlMCwgMHgxOWE3OCwgMHgxY2QzZSwgMHgxMzQ3MCwNCisgICAgICAgIDB4MTlhM2MsIDB4MTM0MzgsIDB4MTlhMWUsIDB4MTM0MWMsIDB4MTM0MGUsIDB4MTEyZjAsDQorICAgICAgICAweDE4OTdjLCAweDEzNmYwLCAweDExMjc4LCAweDE4OTNlLCAweDEzNjc4LCAweDE5YjNlLA0KKyAgICAgICAgMHgxMzYzYywgMHgxMTIxZSwgMHgxMzYxZSwgMHgxZjg5YSwgMHgxMTM3YywgMHgxZjliYSwNCisgICAgICAgIDB4MTM3N2MsIDB4MTEzM2UsIDB4MTM3M2UsIDB4MWYxM2EsIDB4MWYzN2EsIDB4MWUyN2EsDQorICAgICAgICAweDFlNmZhLCAweDFjNGZhLCAweDFjZGZhLCAweDE4OWZhLCAweDFiYWUwLCAweDFkZDc4LA0KKyAgICAgICAgMHgxZWViZSwgMHgxNzRjMCwgMHgxYmE3MCwgMHgxZGQzYywgMHgxNzQ2MCwgMHgxYmEzOCwNCisgICAgICAgIDB4MWRkMWUsIDB4MTc0MzAsIDB4MWJhMWMsIDB4MTc0MTgsIDB4MWJhMGUsIDB4MTc0MGMsDQorICAgICAgICAweDEzMmUwLCAweDE5OTc4LCAweDFjY2JlLCAweDE3NmUwLCAweDEzMjcwLCAweDE5OTNjLA0KKyAgICAgICAgMHgxNzY3MCwgMHgxYmIzYywgMHgxOTkxZSwgMHgxNzYzOCwgMHgxMzIxYywgMHgxNzYxYywNCisgICAgICAgIDB4MTMyMGUsIDB4MTc2MGUsIDB4MTExNzgsIDB4MTg4YmUsIDB4MTMzNzgsIDB4MTExM2MsDQorICAgICAgICAweDE3Nzc4LCAweDEzMzNjLCAweDExMTFlLCAweDE3NzNjLCAweDEzMzFlLCAweDE3NzFlLA0KKyAgICAgICAgMHgxMTFiZSwgMHgxMzNiZSwgMHgxNzdiZSwgMHgxNzJjMCwgMHgxYjk3MCwgMHgxZGNiYywNCisgICAgICAgIDB4MTcyNjAsIDB4MWI5MzgsIDB4MWRjOWUsIDB4MTcyMzAsIDB4MWI5MWMsIDB4MTcyMTgsDQorICAgICAgICAweDFiOTBlLCAweDE3MjBjLCAweDE3MjA2LCAweDEzMTcwLCAweDE5OGJjLCAweDE3MzcwLA0KKyAgICAgICAgMHgxMzEzOCwgMHgxOTg5ZSwgMHgxNzMzOCwgMHgxYjk5ZSwgMHgxNzMxYywgMHgxMzEwZSwNCisgICAgICAgIDB4MTczMGUsIDB4MTEwYmMsIDB4MTMxYmMsIDB4MTEwOWUsIDB4MTczYmMsIDB4MTMxOWUsDQorICAgICAgICAweDE3MzllLCAweDE3MTYwLCAweDFiOGI4LCAweDFkYzVlLCAweDE3MTMwLCAweDFiODljLA0KKyAgICAgICAgMHgxNzExOCwgMHgxYjg4ZSwgMHgxNzEwYywgMHgxNzEwNiwgMHgxMzBiOCwgMHgxOTg1ZSwNCisgICAgICAgIDB4MTcxYjgsIDB4MTMwOWMsIDB4MTcxOWMsIDB4MTMwOGUsIDB4MTcxOGUsIDB4MTEwNWUsDQorICAgICAgICAweDEzMGRlLCAweDE3MWRlLCAweDE3MGIwLCAweDFiODVjLCAweDE3MDk4LCAweDFiODRlLA0KKyAgICAgICAgMHgxNzA4YywgMHgxNzA4NiwgMHgxMzA1YywgMHgxNzBkYywgMHgxMzA0ZSwgMHgxNzBjZSwNCisgICAgICAgIDB4MTcwNTgsIDB4MWI4MmUsIDB4MTcwNGMsIDB4MTcwNDYsIDB4MTMwMmUsIDB4MTcwNmUsDQorICAgICAgICAweDE3MDJjLCAweDE3MDI2LCAweDEwYWYwLCAweDE4NTdjLCAweDEwYTc4LCAweDE4NTNlLA0KKyAgICAgICAgMHgxMGEzYywgMHgxMGExZSwgMHgxMGI3YywgMHgxMGIzZSwgMHgxZjBiYSwgMHgxZTE3YSwNCisgICAgICAgIDB4MWMyZmEsIDB4MTg1ZmEsIDB4MTFhZTAsIDB4MThkNzgsIDB4MWM2YmUsIDB4MTFhNzAsDQorICAgICAgICAweDE4ZDNjLCAweDExYTM4LCAweDE4ZDFlLCAweDExYTFjLCAweDExYTBlLCAweDEwOTc4LA0KKyAgICAgICAgMHgxODRiZSwgMHgxMWI3OCwgMHgxMDkzYywgMHgxMWIzYywgMHgxMDkxZSwgMHgxMWIxZSwNCisgICAgICAgIDB4MTA5YmUsIDB4MTFiYmUsIDB4MTNhYzAsIDB4MTlkNzAsIDB4MWNlYmMsIDB4MTNhNjAsDQorICAgICAgICAweDE5ZDM4LCAweDFjZTllLCAweDEzYTMwLCAweDE5ZDFjLCAweDEzYTE4LCAweDE5ZDBlLA0KKyAgICAgICAgMHgxM2EwYywgMHgxM2EwNiwgMHgxMTk3MCwgMHgxOGNiYywgMHgxM2I3MCwgMHgxMTkzOCwNCisgICAgICAgIDB4MThjOWUsIDB4MTNiMzgsIDB4MTE5MWMsIDB4MTNiMWMsIDB4MTE5MGUsIDB4MTNiMGUsDQorICAgICAgICAweDEwOGJjLCAweDExOWJjLCAweDEwODllLCAweDEzYmJjLCAweDExOTllLCAweDEzYjllLA0KKyAgICAgICAgMHgxYmQ2MCwgMHgxZGViOCwgMHgxZWY1ZSwgMHgxN2E0MCwgMHgxYmQzMCwgMHgxZGU5YywNCisgICAgICAgIDB4MTdhMjAsIDB4MWJkMTgsIDB4MWRlOGUsIDB4MTdhMTAsIDB4MWJkMGMsIDB4MTdhMDgsDQorICAgICAgICAweDFiZDA2LCAweDE3YTA0LCAweDEzOTYwLCAweDE5Y2I4LCAweDFjZTVlLCAweDE3YjYwLA0KKyAgICAgICAgMHgxMzkzMCwgMHgxOWM5YywgMHgxN2IzMCwgMHgxYmQ5YywgMHgxOWM4ZSwgMHgxN2IxOCwNCisgICAgICAgIDB4MTM5MGMsIDB4MTdiMGMsIDB4MTM5MDYsIDB4MTdiMDYsIDB4MTE4YjgsIDB4MThjNWUsDQorICAgICAgICAweDEzOWI4LCAweDExODljLCAweDE3YmI4LCAweDEzOTljLCAweDExODhlLCAweDE3YjljLA0KKyAgICAgICAgMHgxMzk4ZSwgMHgxN2I4ZSwgMHgxMDg1ZSwgMHgxMThkZSwgMHgxMzlkZSwgMHgxN2JkZSwNCisgICAgICAgIDB4MTc5NDAsIDB4MWJjYjAsIDB4MWRlNWMsIDB4MTc5MjAsIDB4MWJjOTgsIDB4MWRlNGUsDQorICAgICAgICAweDE3OTEwLCAweDFiYzhjLCAweDE3OTA4LCAweDFiYzg2LCAweDE3OTA0LCAweDE3OTAyLA0KKyAgICAgICAgMHgxMzhiMCwgMHgxOWM1YywgMHgxNzliMCwgMHgxMzg5OCwgMHgxOWM0ZSwgMHgxNzk5OCwNCisgICAgICAgIDB4MWJjY2UsIDB4MTc5OGMsIDB4MTM4ODYsIDB4MTc5ODYsIDB4MTE4NWMsIDB4MTM4ZGMsDQorICAgICAgICAweDExODRlLCAweDE3OWRjLCAweDEzOGNlLCAweDE3OWNlLCAweDE3OGEwLCAweDFiYzU4LA0KKyAgICAgICAgMHgxZGUyZSwgMHgxNzg5MCwgMHgxYmM0YywgMHgxNzg4OCwgMHgxYmM0NiwgMHgxNzg4NCwNCisgICAgICAgIDB4MTc4ODIsIDB4MTM4NTgsIDB4MTljMmUsIDB4MTc4ZDgsIDB4MTM4NGMsIDB4MTc4Y2MsDQorICAgICAgICAweDEzODQ2LCAweDE3OGM2LCAweDExODJlLCAweDEzODZlLCAweDE3OGVlLCAweDE3ODUwLA0KKyAgICAgICAgMHgxYmMyYywgMHgxNzg0OCwgMHgxYmMyNiwgMHgxNzg0NCwgMHgxNzg0MiwgMHgxMzgyYywNCisgICAgICAgIDB4MTc4NmMsIDB4MTM4MjYsIDB4MTc4NjYsIDB4MTc4MjgsIDB4MWJjMTYsIDB4MTc4MjQsDQorICAgICAgICAweDE3ODIyLCAweDEzODE2LCAweDE3ODM2LCAweDEwNTc4LCAweDE4MmJlLCAweDEwNTNjLA0KKyAgICAgICAgMHgxMDUxZSwgMHgxMDViZSwgMHgxMGQ3MCwgMHgxODZiYywgMHgxMGQzOCwgMHgxODY5ZSwNCisgICAgICAgIDB4MTBkMWMsIDB4MTBkMGUsIDB4MTA0YmMsIDB4MTBkYmMsIDB4MTA0OWUsIDB4MTBkOWUsDQorICAgICAgICAweDExZDYwLCAweDE4ZWI4LCAweDFjNzVlLCAweDExZDMwLCAweDE4ZTljLCAweDExZDE4LA0KKyAgICAgICAgMHgxOGU4ZSwgMHgxMWQwYywgMHgxMWQwNiwgMHgxMGNiOCwgMHgxODY1ZSwgMHgxMWRiOCwNCisgICAgICAgIDB4MTBjOWMsIDB4MTFkOWMsIDB4MTBjOGUsIDB4MTFkOGUsIDB4MTA0NWUsIDB4MTBjZGUsDQorICAgICAgICAweDExZGRlLCAweDEzZDQwLCAweDE5ZWIwLCAweDFjZjVjLCAweDEzZDIwLCAweDE5ZTk4LA0KKyAgICAgICAgMHgxY2Y0ZSwgMHgxM2QxMCwgMHgxOWU4YywgMHgxM2QwOCwgMHgxOWU4NiwgMHgxM2QwNCwNCisgICAgICAgIDB4MTNkMDIsIDB4MTFjYjAsIDB4MThlNWMsIDB4MTNkYjAsIDB4MTFjOTgsIDB4MThlNGUsDQorICAgICAgICAweDEzZDk4LCAweDE5ZWNlLCAweDEzZDhjLCAweDExYzg2LCAweDEzZDg2LCAweDEwYzVjLA0KKyAgICAgICAgMHgxMWNkYywgMHgxMGM0ZSwgMHgxM2RkYywgMHgxMWNjZSwgMHgxM2RjZSwgMHgxYmVhMCwNCisgICAgICAgIDB4MWRmNTgsIDB4MWVmYWUsIDB4MWJlOTAsIDB4MWRmNGMsIDB4MWJlODgsIDB4MWRmNDYsDQorICAgICAgICAweDFiZTg0LCAweDFiZTgyLCAweDEzY2EwLCAweDE5ZTU4LCAweDFjZjJlLCAweDE3ZGEwLA0KKyAgICAgICAgMHgxM2M5MCwgMHgxOWU0YywgMHgxN2Q5MCwgMHgxYmVjYywgMHgxOWU0NiwgMHgxN2Q4OCwNCisgICAgICAgIDB4MTNjODQsIDB4MTdkODQsIDB4MTNjODIsIDB4MTdkODIsIDB4MTFjNTgsIDB4MThlMmUsDQorICAgICAgICAweDEzY2Q4LCAweDExYzRjLCAweDE3ZGQ4LCAweDEzY2NjLCAweDExYzQ2LCAweDE3ZGNjLA0KKyAgICAgICAgMHgxM2NjNiwgMHgxN2RjNiwgMHgxMGMyZSwgMHgxMWM2ZSwgMHgxM2NlZSwgMHgxN2RlZSwNCisgICAgICAgIDB4MWJlNTAsIDB4MWRmMmMsIDB4MWJlNDgsIDB4MWRmMjYsIDB4MWJlNDQsIDB4MWJlNDIsDQorICAgICAgICAweDEzYzUwLCAweDE5ZTJjLCAweDE3Y2QwLCAweDEzYzQ4LCAweDE5ZTI2LCAweDE3Y2M4LA0KKyAgICAgICAgMHgxYmU2NiwgMHgxN2NjNCwgMHgxM2M0MiwgMHgxN2NjMiwgMHgxMWMyYywgMHgxM2M2YywNCisgICAgICAgIDB4MTFjMjYsIDB4MTdjZWMsIDB4MTNjNjYsIDB4MTdjZTYsIDB4MWJlMjgsIDB4MWRmMTYsDQorICAgICAgICAweDFiZTI0LCAweDFiZTIyLCAweDEzYzI4LCAweDE5ZTE2LCAweDE3YzY4LCAweDEzYzI0LA0KKyAgICAgICAgMHgxN2M2NCwgMHgxM2MyMiwgMHgxN2M2MiwgMHgxMWMxNiwgMHgxM2MzNiwgMHgxN2M3NiwNCisgICAgICAgIDB4MWJlMTQsIDB4MWJlMTIsIDB4MTNjMTQsIDB4MTdjMzQsIDB4MTNjMTIsIDB4MTdjMzIsDQorICAgICAgICAweDEwMmJjLCAweDEwMjllLCAweDEwNmI4LCAweDE4MzVlLCAweDEwNjljLCAweDEwNjhlLA0KKyAgICAgICAgMHgxMDI1ZSwgMHgxMDZkZSwgMHgxMGViMCwgMHgxODc1YywgMHgxMGU5OCwgMHgxODc0ZSwNCisgICAgICAgIDB4MTBlOGMsIDB4MTBlODYsIDB4MTA2NWMsIDB4MTBlZGMsIDB4MTA2NGUsIDB4MTBlY2UsDQorICAgICAgICAweDExZWEwLCAweDE4ZjU4LCAweDFjN2FlLCAweDExZTkwLCAweDE4ZjRjLCAweDExZTg4LA0KKyAgICAgICAgMHgxOGY0NiwgMHgxMWU4NCwgMHgxMWU4MiwgMHgxMGU1OCwgMHgxODcyZSwgMHgxMWVkOCwNCisgICAgICAgIDB4MThmNmUsIDB4MTFlY2MsIDB4MTBlNDYsIDB4MTFlYzYsIDB4MTA2MmUsIDB4MTBlNmUsDQorICAgICAgICAweDExZWVlLCAweDE5ZjUwLCAweDFjZmFjLCAweDE5ZjQ4LCAweDFjZmE2LCAweDE5ZjQ0LA0KKyAgICAgICAgMHgxOWY0MiwgMHgxMWU1MCwgMHgxOGYyYywgMHgxM2VkMCwgMHgxOWY2YywgMHgxOGYyNiwNCisgICAgICAgIDB4MTNlYzgsIDB4MTFlNDQsIDB4MTNlYzQsIDB4MTFlNDIsIDB4MTNlYzIsIDB4MTBlMmMsDQorICAgICAgICAweDExZTZjLCAweDEwZTI2LCAweDEzZWVjLCAweDExZTY2LCAweDEzZWU2LCAweDFkZmE4LA0KKyAgICAgICAgMHgxZWZkNiwgMHgxZGZhNCwgMHgxZGZhMiwgMHgxOWYyOCwgMHgxY2Y5NiwgMHgxYmY2OCwNCisgICAgICAgIDB4MTlmMjQsIDB4MWJmNjQsIDB4MTlmMjIsIDB4MWJmNjIsIDB4MTFlMjgsIDB4MThmMTYsDQorICAgICAgICAweDEzZTY4LCAweDExZTI0LCAweDE3ZWU4LCAweDEzZTY0LCAweDExZTIyLCAweDE3ZWU0LA0KKyAgICAgICAgMHgxM2U2MiwgMHgxN2VlMiwgMHgxMGUxNiwgMHgxMWUzNiwgMHgxM2U3NiwgMHgxN2VmNiwNCisgICAgICAgIDB4MWRmOTQsIDB4MWRmOTIsIDB4MTlmMTQsIDB4MWJmMzQsIDB4MTlmMTIsIDB4MWJmMzIsDQorICAgICAgICAweDExZTE0LCAweDEzZTM0LCAweDExZTEyLCAweDE3ZTc0LCAweDEzZTMyLCAweDE3ZTcyLA0KKyAgICAgICAgMHgxZGY4YSwgMHgxOWYwYSwgMHgxYmYxYSwgMHgxMWUwYSwgMHgxM2UxYSwgMHgxN2UzYSwNCisgICAgICAgIDB4MTAzNWMsIDB4MTAzNGUsIDB4MTA3NTgsIDB4MTgzYWUsIDB4MTA3NGMsIDB4MTA3NDYsDQorICAgICAgICAweDEwMzJlLCAweDEwNzZlLCAweDEwZjUwLCAweDE4N2FjLCAweDEwZjQ4LCAweDE4N2E2LA0KKyAgICAgICAgMHgxMGY0NCwgMHgxMGY0MiwgMHgxMDcyYywgMHgxMGY2YywgMHgxMDcyNiwgMHgxMGY2NiwNCisgICAgICAgIDB4MThmYTgsIDB4MWM3ZDYsIDB4MThmYTQsIDB4MThmYTIsIDB4MTBmMjgsIDB4MTg3OTYsDQorICAgICAgICAweDExZjY4LCAweDE4ZmI2LCAweDExZjY0LCAweDEwZjIyLCAweDExZjYyLCAweDEwNzE2LA0KKyAgICAgICAgMHgxMGYzNiwgMHgxMWY3NiwgMHgxY2ZkNCwgMHgxY2ZkMiwgMHgxOGY5NCwgMHgxOWZiNCwNCisgICAgICAgIDB4MThmOTIsIDB4MTlmYjIsIDB4MTBmMTQsIDB4MTFmMzQsIDB4MTBmMTIsIDB4MTNmNzQsDQorICAgICAgICAweDExZjMyLCAweDEzZjcyLCAweDFjZmNhLCAweDE4ZjhhLCAweDE5ZjlhLCAweDEwZjBhLA0KKyAgICAgICAgMHgxMWYxYSwgMHgxM2YzYSwgMHgxMDNhYywgMHgxMDNhNiwgMHgxMDdhOCwgMHgxODNkNiwNCisgICAgICAgIDB4MTA3YTQsIDB4MTA3YTIsIDB4MTAzOTYsIDB4MTA3YjYsIDB4MTg3ZDQsIDB4MTg3ZDIsDQorICAgICAgICAweDEwNzk0LCAweDEwZmI0LCAweDEwNzkyLCAweDEwZmIyLCAweDFjN2VhDQorICAgIH0NCit9Ow0KK0ZYX0ZMT0FUIENCQ19QREY0MTc6OlBSRUZFUlJFRF9SQVRJTyA9IDMuMGY7DQorRlhfRkxPQVQgQ0JDX1BERjQxNzo6REVGQVVMVF9NT0RVTEVfV0lEVEggPSAwLjM1N2Y7DQorRlhfRkxPQVQgQ0JDX1BERjQxNzo6SEVJR0hUID0gMi4wZjsNCitDQkNfUERGNDE3OjpDQkNfUERGNDE3KCkNCit7DQorICAgIG1fY29tcGFjdCA9IEZBTFNFOw0KKyAgICBtX2NvbXBhY3Rpb24gPSBBVVRPOw0KKyAgICBtX21pbkNvbHMgPSAxOw0KKyAgICBtX21heENvbHMgPSAzMDsNCisgICAgbV9tYXhSb3dzID0gOTA7DQorICAgIG1fbWluUm93cyA9IDM7DQorICAgIG1fYmFyY29kZU1hdHJpeCA9IE5VTEw7DQorfQ0KK0NCQ19QREY0MTc6OkNCQ19QREY0MTcoRlhfQk9PTCBjb21wYWN0KQ0KK3sNCisgICAgbV9jb21wYWN0ID0gY29tcGFjdDsNCisgICAgbV9jb21wYWN0aW9uID0gQVVUTzsNCisgICAgbV9taW5Db2xzID0gMTsNCisgICAgbV9tYXhDb2xzID0gMzA7DQorICAgIG1fbWF4Um93cyA9IDkwOw0KKyAgICBtX21pblJvd3MgPSAzOw0KKyAgICBtX2JhcmNvZGVNYXRyaXggPSBOVUxMOw0KK30NCitDQkNfUERGNDE3Ojp+Q0JDX1BERjQxNygpDQorew0KKyAgICBpZiAobV9iYXJjb2RlTWF0cml4KSB7DQorICAgICAgICBkZWxldGUgbV9iYXJjb2RlTWF0cml4Ow0KKyAgICB9DQorfQ0KK0NCQ19CYXJjb2RlTWF0cml4KiBDQkNfUERGNDE3OjpnZXRCYXJjb2RlTWF0cml4KCkNCit7DQorICAgIHJldHVybiBtX2JhcmNvZGVNYXRyaXg7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxNzo6Z2VuZXJhdGVCYXJjb2RlTG9naWMoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBGWF9JTlQzMiBlcnJvckNvcnJlY3Rpb25MZXZlbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMgPSBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIGhpZ2hMZXZlbCA9IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwobXNnLCBtX2NvbXBhY3Rpb24sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRlhfSU5UMzIgc291cmNlQ29kZVdvcmRzID0gaGlnaExldmVsLkdldExlbmd0aCgpOw0KKyAgICBDRlhfSW50MzJBcnJheSogZGltZW5zaW9uID0gZGV0ZXJtaW5lRGltZW5zaW9ucyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBGWF9JTlQzMiBjb2xzID0gZGltZW5zaW9uLT5HZXRBdCgwKTsNCisgICAgRlhfSU5UMzIgcm93cyA9IGRpbWVuc2lvbi0+R2V0QXQoMSk7DQorICAgIGRlbGV0ZSBkaW1lbnNpb247DQorICAgIEZYX0lOVDMyIHBhZCA9IGdldE51bWJlck9mUGFkQ29kZXdvcmRzKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBjb2xzLCByb3dzKTsNCisgICAgaWYgKHNvdXJjZUNvZGVXb3JkcyArIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcyArIDEgPiA5MjkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkVuY29kZWRNZXNzYWdlQ29udGFpbnNUb29NYW55Q29kZVdvcmRzOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG4gPSBzb3VyY2VDb2RlV29yZHMgKyBwYWQgKyAxOw0KKyAgICBDRlhfV2lkZVN0cmluZyBzYjsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSBuOw0KKyAgICBzYiArPSBoaWdoTGV2ZWw7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBwYWQ7IGkrKykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSA5MDA7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgZGF0YUNvZGV3b3JkcyhzYik7DQorICAgIENGWF9XaWRlU3RyaW5nIGVjID0gQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2VuZXJhdGVFcnJvckNvcnJlY3Rpb24oZGF0YUNvZGV3b3JkcywgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHMgKyBlYzsNCisgICAgbV9iYXJjb2RlTWF0cml4ID0gRlhfTkVXIENCQ19CYXJjb2RlTWF0cml4KHJvd3MsIGNvbHMpOw0KKyAgICBlbmNvZGVMb3dMZXZlbChmdWxsQ29kZXdvcmRzLCBjb2xzLCByb3dzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgbV9iYXJjb2RlTWF0cml4KTsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXREaW1lbnNpb25zKEZYX0lOVDMyIG1heENvbHMsIEZYX0lOVDMyIG1pbkNvbHMsIEZYX0lOVDMyIG1heFJvd3MsIEZYX0lOVDMyIG1pblJvd3MpDQorew0KKyAgICBtX21heENvbHMgPSBtYXhDb2xzOw0KKyAgICBtX21pbkNvbHMgPSBtaW5Db2xzOw0KKyAgICBtX21heFJvd3MgPSBtYXhSb3dzOw0KKyAgICBtX21pblJvd3MgPSBtaW5Sb3dzOw0KK30NCit2b2lkIENCQ19QREY0MTc6OnNldENvbXBhY3Rpb24oQ29tcGFjdGlvbiBjb21wYWN0aW9uKQ0KK3sNCisgICAgbV9jb21wYWN0aW9uID0gY29tcGFjdGlvbjsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXRDb21wYWN0KEZYX0JPT0wgY29tcGFjdCkNCit7DQorICAgIG1fY29tcGFjdCA9IGNvbXBhY3Q7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTc6OmNhbGN1bGF0ZU51bWJlck9mUm93cyhGWF9JTlQzMiBtLCBGWF9JTlQzMiBrLCBGWF9JTlQzMiBjKQ0KK3sNCisgICAgRlhfSU5UMzIgciA9ICgobSArIDEgKyBrKSAvIGMpICsgMTsNCisgICAgaWYgKGMgKiByID49IChtICsgMSArIGsgKyBjKSkgew0KKyAgICAgICAgci0tOw0KKyAgICB9DQorICAgIHJldHVybiByOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3OjpnZXROdW1iZXJPZlBhZENvZGV3b3JkcyhGWF9JTlQzMiBtLCBGWF9JTlQzMiBrLCBGWF9JTlQzMiBjLCBGWF9JTlQzMiByKQ0KK3sNCisgICAgRlhfSU5UMzIgbiA9IGMgKiByIC0gazsNCisgICAgcmV0dXJuIG4gPiBtICsgMSA/IG4gLSBtIC0gMSA6IDA7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxNzo6ZW5jb2RlQ2hhcihGWF9JTlQzMiBwYXR0ZXJuLCBGWF9JTlQzMiBsZW4sIENCQ19CYXJjb2RlUm93KiBsb2dpYykNCit7DQorICAgIEZYX0lOVDMyIG1hcCA9IDEgPDwgKGxlbiAtIDEpOw0KKyAgICBGWF9CT09MIGxhc3QgPSAoKHBhdHRlcm4gJiBtYXApICE9IDApOw0KKyAgICBGWF9JTlQzMiB3aWR0aCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgICAgRlhfQk9PTCBibGFjayA9ICgocGF0dGVybiAmIG1hcCkgIT0gMCk7DQorICAgICAgICBpZiAobGFzdCA9PSBibGFjaykgew0KKyAgICAgICAgICAgIHdpZHRoKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGxvZ2ljLT5hZGRCYXIobGFzdCwgd2lkdGgpOw0KKyAgICAgICAgICAgIGxhc3QgPSBibGFjazsNCisgICAgICAgICAgICB3aWR0aCA9IDE7DQorICAgICAgICB9DQorICAgICAgICBtYXAgPj49IDE7DQorICAgIH0NCisgICAgbG9naWMtPmFkZEJhcihsYXN0LCB3aWR0aCk7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxNzo6ZW5jb2RlTG93TGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcywgRlhfSU5UMzIgYywgRlhfSU5UMzIgciwgRlhfSU5UMzIgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIENCQ19CYXJjb2RlTWF0cml4KiBsb2dpYykNCit7DQorICAgIEZYX0lOVDMyIGlkeCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgeSA9IDA7IHkgPCByOyB5KyspIHsNCisgICAgICAgIEZYX0lOVDMyIGNsdXN0ZXIgPSB5ICUgMzsNCisgICAgICAgIGxvZ2ljLT5zdGFydFJvdygpOw0KKyAgICAgICAgRlhfSU5UMzIgYSA9IFNUQVJUX1BBVFRFUk47DQorICAgICAgICBlbmNvZGVDaGFyKFNUQVJUX1BBVFRFUk4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgICAgIEZYX0lOVDMyIGxlZnQ7DQorICAgICAgICBGWF9JTlQzMiByaWdodDsNCisgICAgICAgIGlmIChjbHVzdGVyID09IDApIHsNCisgICAgICAgICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoKHIgLSAxKSAvIDMpOw0KKyAgICAgICAgICAgIHJpZ2h0ID0gKDMwICogKHkgLyAzKSkgKyAoYyAtIDEpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyID09IDEpIHsNCisgICAgICAgICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgKiAzKSArICgociAtIDEpICUgMyk7DQorICAgICAgICAgICAgcmlnaHQgPSAoMzAgKiAoeSAvIDMpKSArICgociAtIDEpIC8gMyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGxlZnQgPSAoMzAgKiAoeSAvIDMpKSArIChjIC0gMSk7DQorICAgICAgICAgICAgcmlnaHQgPSAoMzAgKiAoeSAvIDMpKSArIChlcnJvckNvcnJlY3Rpb25MZXZlbCAqIDMpICsgKChyIC0gMSkgJSAzKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIHBhdHRlcm4gPSBDT0RFV09SRF9UQUJMRVtjbHVzdGVyXVtsZWZ0XTsNCisgICAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB4ID0gMDsgeCA8IGM7IHgrKykgew0KKyAgICAgICAgICAgIHBhdHRlcm4gPSBDT0RFV09SRF9UQUJMRVtjbHVzdGVyXVtmdWxsQ29kZXdvcmRzLkdldEF0KGlkeCldOw0KKyAgICAgICAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KKyAgICAgICAgICAgIGlkeCsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fY29tcGFjdCkgew0KKyAgICAgICAgICAgIGVuY29kZUNoYXIoU1RPUF9QQVRURVJOLCAxLCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW3JpZ2h0XTsNCisgICAgICAgICAgICBlbmNvZGVDaGFyKHBhdHRlcm4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgICAgICAgICBlbmNvZGVDaGFyKFNUT1BfUEFUVEVSTiwgMTgsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3OjpkZXRlcm1pbmVEaW1lbnNpb25zKEZYX0lOVDMyIHNvdXJjZUNvZGVXb3JkcywgRlhfSU5UMzIgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0ZMT0FUIHJhdGlvID0gMC4wZjsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGRpbWVuc2lvbiA9IE5VTEw7DQorICAgIGZvciAoRlhfSU5UMzIgY29scyA9IG1fbWluQ29sczsgY29scyA8PSBtX21heENvbHM7IGNvbHMrKykgew0KKyAgICAgICAgRlhfSU5UMzIgcm93cyA9IGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgY29scyk7DQorICAgICAgICBpZiAocm93cyA8IG1fbWluUm93cykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJvd3MgPiBtX21heFJvd3MpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIG5ld1JhdGlvID0gKCgxNyAqIGNvbHMgKyA2OSkgKiBERUZBVUxUX01PRFVMRV9XSURUSCkgLyAocm93cyAqIEhFSUdIVCk7DQorICAgICAgICBpZiAoZGltZW5zaW9uICE9IE5VTEwgJiYgZmFic2YobmV3UmF0aW8gLSBQUkVGRVJSRURfUkFUSU8pID4gZmFic2YocmF0aW8gLSBQUkVGRVJSRURfUkFUSU8pKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICByYXRpbyA9IG5ld1JhdGlvOw0KKyAgICAgICAgaWYgKGRpbWVuc2lvbikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBkaW1lbnNpb247DQorICAgICAgICB9DQorICAgICAgICBkaW1lbnNpb24gPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgICBkaW1lbnNpb24tPkFkZChjb2xzKTsNCisgICAgICAgIGRpbWVuc2lvbi0+QWRkKHJvd3MpOw0KKyAgICB9DQorICAgIGlmIChkaW1lbnNpb24gPT0gTlVMTCkgew0KKyAgICAgICAgRlhfSU5UMzIgcm93cyA9IGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgbV9taW5Db2xzKTsNCisgICAgICAgIGlmIChyb3dzIDwgbV9taW5Sb3dzKSB7DQorICAgICAgICAgICAgZGltZW5zaW9uID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICAgICAgICAgIGRpbWVuc2lvbi0+QWRkKG1fbWluQ29scyk7DQorICAgICAgICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Sb3dzKTsNCisgICAgICAgIH0gZWxzZSBpZiAocm93cyA+PSAzICYmIHJvd3MgPD0gOTApIHsNCisgICAgICAgICAgICBkaW1lbnNpb24gPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Db2xzKTsNCisgICAgICAgICAgICBkaW1lbnNpb24tPkFkZChyb3dzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZGltZW5zaW9uID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuYWJsZVRvRml0TWVzc2FnZUluQ29sdW1uczsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBkaW1lbnNpb247DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjY1ODgxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlUm93LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIg0KK0NCQ19CYXJjb2RlTWF0cml4OjpDQkNfQmFyY29kZU1hdHJpeChGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHdpZHRoKQ0KK3sNCisgICAgbV9tYXRyaXguU2V0U2l6ZShoZWlnaHQgKyAyKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMCwgbWF0cml4TGVuZ3RoID0gbV9tYXRyaXguR2V0U2l6ZSgpOyBpIDwgbWF0cml4TGVuZ3RoOyBpKyspIHsNCisgICAgICAgIG1fbWF0cml4W2ldID0gRlhfTkVXIENCQ19CYXJjb2RlUm93KCh3aWR0aCArIDQpICogMTcgKyAxKTsNCisgICAgfQ0KKyAgICBtX3dpZHRoID0gd2lkdGggKiAxNzsNCisgICAgbV9oZWlnaHQgPSBoZWlnaHQgKyAyOw0KKyAgICBtX2N1cnJlbnRSb3cgPSAwOw0KKyAgICBtX291dEhlaWdodCA9IDA7DQorICAgIG1fb3V0V2lkdGggPSAwOw0KK30NCitDQkNfQmFyY29kZU1hdHJpeDo6fkNCQ19CYXJjb2RlTWF0cml4KCkNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX21hdHJpeC5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXguR2V0QXQoaSk7DQorICAgIH0NCisgICAgbV9tYXRyaXguUmVtb3ZlQWxsKCk7DQorICAgIG1fbWF0cml4T3V0LlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfQllURSB2YWx1ZSkNCit7DQorICAgICgoQ0JDX0JhcmNvZGVSb3cqKW1fbWF0cml4W3ldKS0+c2V0KHgsIHZhbHVlKTsNCit9DQordm9pZCBDQkNfQmFyY29kZU1hdHJpeDo6c2V0TWF0cml4KEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0JPT0wgYmxhY2spDQorew0KKyAgICBzZXQoeCwgeSwgKEZYX0JZVEUpIChibGFjayA/IDEgOiAwKSk7DQorfQ0KK3ZvaWQgQ0JDX0JhcmNvZGVNYXRyaXg6OnN0YXJ0Um93KCkNCit7DQorICAgICsrbV9jdXJyZW50Um93Ow0KK30NCitDQkNfQmFyY29kZVJvdyogQ0JDX0JhcmNvZGVNYXRyaXg6OmdldEN1cnJlbnRSb3coKQ0KK3sNCisgICAgcmV0dXJuIChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXhbbV9jdXJyZW50Um93XTsNCit9DQorRlhfSU5UMzIgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX291dFdpZHRoOw0KK30NCitGWF9JTlQzMiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0SGVpZ2h0KCkNCit7DQorICAgIHJldHVybiBtX291dEhlaWdodDsNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldE1hdHJpeCgpDQorew0KKyAgICByZXR1cm4gZ2V0U2NhbGVkTWF0cml4KDEsIDEpOw0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KEZYX0lOVDMyIHNjYWxlKQ0KK3sNCisgICAgcmV0dXJuIGdldFNjYWxlZE1hdHJpeChzY2FsZSwgc2NhbGUpOw0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KEZYX0lOVDMyIHhTY2FsZSwgRlhfSU5UMzIgeVNjYWxlKQ0KK3sNCisgICAgRlhfSU5UMzIgeU1heCA9IG1faGVpZ2h0ICogeVNjYWxlOw0KKyAgICBDRlhfQnl0ZUFycmF5IGJ5dGVhcnJheTsNCisgICAgYnl0ZWFycmF5LkNvcHkoKChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXhbMF0pLT5nZXRTY2FsZWRSb3coeFNjYWxlKSk7DQorICAgIEZYX0lOVDMyIHhNYXggPSBieXRlYXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBtX21hdHJpeE91dC5TZXRTaXplKHhNYXggKiB5TWF4KTsNCisgICAgbV9vdXRXaWR0aCA9IHhNYXg7DQorICAgIG1fb3V0SGVpZ2h0ID0geU1heDsNCisgICAgRlhfSU5UMzIgayA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCB5TWF4OyBpKyspIHsNCisgICAgICAgIGlmIChpICE9IDApIHsNCisgICAgICAgICAgICBieXRlYXJyYXkuQ29weSgoKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFtpIC8geVNjYWxlXSktPmdldFNjYWxlZFJvdyh4U2NhbGUpKTsNCisgICAgICAgIH0NCisgICAgICAgIGsgPSBpICogeE1heDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgbCA9IDA7IGwgPCB4TWF4OyBsKyspIHsNCisgICAgICAgICAgICBtX21hdHJpeE91dFtrICsgbF0gPSBieXRlYXJyYXkuR2V0QXQobCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1fbWF0cml4T3V0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2RlYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmNwcApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmgiDQorQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Q0JDX0JhcmNvZGVNZXRhZGF0YShGWF9JTlQzMiBjb2x1bW5Db3VudCwgRlhfSU5UMzIgcm93Q291bnRVcHBlclBhcnQsIEZYX0lOVDMyIHJvd0NvdW50TG93ZXJQYXJ0LCBGWF9JTlQzMiBlcnJvckNvcnJlY3Rpb25MZXZlbCkNCit7DQorICAgIG1fY29sdW1uQ291bnQgPSBjb2x1bW5Db3VudDsNCisgICAgbV9yb3dDb3VudFVwcGVyUGFydCA9IHJvd0NvdW50VXBwZXJQYXJ0Ow0KKyAgICBtX3Jvd0NvdW50TG93ZXJQYXJ0ID0gcm93Q291bnRMb3dlclBhcnQ7DQorICAgIG1fZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPSBlcnJvckNvcnJlY3Rpb25MZXZlbDsNCisgICAgbV9yb3dDb3VudCA9IG1fcm93Q291bnRVcHBlclBhcnQgKyBtX3Jvd0NvdW50TG93ZXJQYXJ0Ow0KK30NCitDQkNfQmFyY29kZU1ldGFkYXRhOjp+Q0JDX0JhcmNvZGVNZXRhZGF0YSgpDQorew0KK30NCitGWF9JTlQzMiBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRDb2x1bW5Db3VudCgpDQorew0KKyAgICByZXR1cm4gbV9jb2x1bW5Db3VudDsNCit9DQorRlhfSU5UMzIgQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKQ0KK3sNCisgICAgcmV0dXJuIG1fZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorfQ0KK0ZYX0lOVDMyIENCQ19CYXJjb2RlTWV0YWRhdGE6OmdldFJvd0NvdW50KCkNCit7DQorICAgIHJldHVybiBtX3Jvd0NvdW50Ow0KK30NCitGWF9JTlQzMiBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRSb3dDb3VudFVwcGVyUGFydCgpDQorew0KKyAgICByZXR1cm4gbV9yb3dDb3VudFVwcGVyUGFydDsNCit9DQorRlhfSU5UMzIgQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Z2V0Um93Q291bnRMb3dlclBhcnQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcm93Q291bnRMb3dlclBhcnQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDYyNTZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlUm93LmgiDQorQ0JDX0JhcmNvZGVSb3c6OkNCQ19CYXJjb2RlUm93KEZYX0lOVDMyIHdpZHRoKQ0KK3sNCisgICAgbV9yb3cuU2V0U2l6ZSh3aWR0aCk7DQorICAgIG1fY3VycmVudExvY2F0aW9uID0gMDsNCit9DQorQ0JDX0JhcmNvZGVSb3c6On5DQkNfQmFyY29kZVJvdygpDQorew0KKyAgICBtX291dHB1dC5SZW1vdmVBbGwoKTsNCisgICAgbV9yb3cuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0JDX0JhcmNvZGVSb3c6OnNldChGWF9JTlQzMiB4LCBGWF9CWVRFIHZhbHVlKQ0KK3sNCisgICAgbV9yb3cuU2V0QXQoeCwgdmFsdWUpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlUm93OjpzZXQoRlhfSU5UMzIgeCwgRlhfQk9PTCBibGFjaykNCit7DQorICAgIG1fcm93LlNldEF0KHgsIChGWF9CWVRFKSAoYmxhY2sgPyAxIDogMCkpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlUm93OjphZGRCYXIoRlhfQk9PTCBibGFjaywgRlhfSU5UMzIgd2lkdGgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGlpID0gMDsgaWkgPCB3aWR0aDsgaWkrKykgew0KKyAgICAgICAgc2V0KG1fY3VycmVudExvY2F0aW9uKyssIGJsYWNrKTsNCisgICAgfQ0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZVJvdzo6Z2V0Um93KCkNCit7DQorICAgIHJldHVybiBtX3JvdzsNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0JhcmNvZGVSb3c6OmdldFNjYWxlZFJvdyhGWF9JTlQzMiBzY2FsZSkNCit7DQorICAgIG1fb3V0cHV0LlNldFNpemUobV9yb3cuR2V0U2l6ZSgpICogc2NhbGUpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9vdXRwdXQuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIG1fb3V0cHV0W2ldID0gKG1fcm93W2kgLyBzY2FsZV0pOw0KKyAgICB9DQorICAgIHJldHVybiBtX291dHB1dDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3QmFyY29kZVZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjVmMTVhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oIg0KK0NCQ19CYXJjb2RlVmFsdWU6OkNCQ19CYXJjb2RlVmFsdWUoKQ0KK3sNCit9DQorQ0JDX0JhcmNvZGVWYWx1ZTo6fkNCQ19CYXJjb2RlVmFsdWUoKQ0KK3sNCit9DQordm9pZCBDQkNfQmFyY29kZVZhbHVlOjpzZXRWYWx1ZShGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIEZYX0lOVDMyIGNvbmZpZGVuY2UgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9rZXlzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBpZiAobV9rZXlzLkdldEF0KGkpID09IHZhbHVlKSB7DQorICAgICAgICAgICAgY29uZmlkZW5jZSA9IG1fdmFsdWVzLkdldEF0KGkpOw0KKyAgICAgICAgICAgIG1fdmFsdWVzLlNldEF0KGksIGNvbmZpZGVuY2UgKyAxKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgY29uZmlkZW5jZSA9IDE7DQorICAgIG1fa2V5cy5BZGQodmFsdWUpOw0KKyAgICBtX3ZhbHVlcy5BZGQoY29uZmlkZW5jZSk7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfQmFyY29kZVZhbHVlOjpnZXRWYWx1ZSgpDQorew0KKyAgICBGWF9JTlQzMiBtYXhDb25maWRlbmNlID0gLTE7DQorICAgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX2tleXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChtX3ZhbHVlcy5HZXRBdChpKSA+IG1heENvbmZpZGVuY2UpIHsNCisgICAgICAgICAgICBtYXhDb25maWRlbmNlID0gbV92YWx1ZXMuR2V0QXQoaSk7DQorICAgICAgICAgICAgcmVzdWx0LT5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICByZXN1bHQtPkFkZChtX2tleXMuR2V0QXQoaSkpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3ZhbHVlcy5HZXRBdChpKSA9PSBtYXhDb25maWRlbmNlKSB7DQorICAgICAgICAgICAgcmVzdWx0LT5BZGQobV9rZXlzLkdldEF0KGkpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCitGWF9JTlQzMiBDQkNfQmFyY29kZVZhbHVlOjpnZXRDb25maWRlbmNlKEZYX0lOVDMyIHZhbHVlKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1fa2V5cy5HZXRTaXplKCk7IGkrKykNCisgICAgICAgIGlmIChtX2tleXMuR2V0QXQoaSkgPT0gdmFsdWUpIHsNCisgICAgICAgICAgICByZXR1cm4gbV92YWx1ZXMuR2V0QXQoaSk7DQorICAgICAgICB9DQorICAgIHJldHVybiAtMTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0JvdW5kaW5nQm94LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCb3VuZGluZ0JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwODQwZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdCb3VuZGluZ0JveC5jcHAKQEAgLTAsMCArMSwxNzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JvdW5kaW5nQm94LmgiDQorQ0JDX0JvdW5kaW5nQm94OjpDQkNfQm91bmRpbmdCb3goQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmICgodG9wTGVmdCA9PSBOVUxMICYmIHRvcFJpZ2h0ID09IE5VTEwpIHx8DQorICAgICAgICAgICAgKGJvdHRvbUxlZnQgPT0gTlVMTCAmJiBib3R0b21SaWdodCA9PSBOVUxMKSB8fA0KKyAgICAgICAgICAgICh0b3BMZWZ0ICE9IE5VTEwgJiYgYm90dG9tTGVmdCA9PSBOVUxMKSB8fA0KKyAgICAgICAgICAgICh0b3BSaWdodCAhPSBOVUxMICYmIGJvdHRvbVJpZ2h0ID09IE5VTEwpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZEluc3RhbmNlOw0KKyAgICB9DQorICAgIGluaXQoaW1hZ2UsIHRvcExlZnQsIGJvdHRvbUxlZnQsIHRvcFJpZ2h0LCBib3R0b21SaWdodCk7DQorfQ0KK0NCQ19Cb3VuZGluZ0JveDo6Q0JDX0JvdW5kaW5nQm94KENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpDQorew0KKyAgICBpbml0KGJvdW5kaW5nQm94LT5tX2ltYWdlLCBib3VuZGluZ0JveC0+bV90b3BMZWZ0LCBib3VuZGluZ0JveC0+bV9ib3R0b21MZWZ0LCBib3VuZGluZ0JveC0+bV90b3BSaWdodCwgYm91bmRpbmdCb3gtPm1fYm90dG9tUmlnaHQpOw0KK30NCitDQkNfQm91bmRpbmdCb3g6On5DQkNfQm91bmRpbmdCb3goKQ0KK3sNCisgICAgaWYgKG1fdG9wTGVmdCkgew0KKyAgICAgICAgZGVsZXRlIG1fdG9wTGVmdDsNCisgICAgfQ0KKyAgICBpZiAobV9ib3R0b21MZWZ0KSB7DQorICAgICAgICBkZWxldGUgbV9ib3R0b21MZWZ0Ow0KKyAgICB9DQorICAgIGlmIChtX3RvcFJpZ2h0KSB7DQorICAgICAgICBkZWxldGUgbV90b3BSaWdodDsNCisgICAgfQ0KKyAgICBpZiAobV9ib3R0b21SaWdodCkgew0KKyAgICAgICAgZGVsZXRlIG1fYm90dG9tUmlnaHQ7DQorICAgIH0NCit9DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfQm91bmRpbmdCb3g6Om1lcmdlKENCQ19Cb3VuZGluZ0JveCogbGVmdEJveCwgQ0JDX0JvdW5kaW5nQm94KiByaWdodEJveCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94ID0gTlVMTDsNCisgICAgaWYgKGxlZnRCb3ggPT0gTlVMTCkgew0KKyAgICAgICAgYm91bmRpbmdCb3ggPSBGWF9ORVcgQ0JDX0JvdW5kaW5nQm94KHJpZ2h0Qm94KTsNCisgICAgICAgIHJldHVybiBib3VuZGluZ0JveDsNCisgICAgfQ0KKyAgICBpZiAocmlnaHRCb3ggPT0gTlVMTCkgew0KKyAgICAgICAgYm91bmRpbmdCb3ggPSBGWF9ORVcgQ0JDX0JvdW5kaW5nQm94KGxlZnRCb3gpOw0KKyAgICAgICAgcmV0dXJuIGJvdW5kaW5nQm94Ow0KKyAgICB9DQorICAgIGJvdW5kaW5nQm94ID0gRlhfTkVXIENCQ19Cb3VuZGluZ0JveChsZWZ0Qm94LT5tX2ltYWdlLCBsZWZ0Qm94LT5tX3RvcExlZnQsIGxlZnRCb3gtPm1fYm90dG9tTGVmdCwgcmlnaHRCb3gtPm1fdG9wUmlnaHQsIHJpZ2h0Qm94LT5tX2JvdHRvbVJpZ2h0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gYm91bmRpbmdCb3g7DQorfQ0KK0NCQ19Cb3VuZGluZ0JveCogQ0JDX0JvdW5kaW5nQm94OjphZGRNaXNzaW5nUm93cyhGWF9JTlQzMiBtaXNzaW5nU3RhcnRSb3dzLCBGWF9JTlQzMiBtaXNzaW5nRW5kUm93cywgRlhfQk9PTCBpc0xlZnQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3BMZWZ0ID0gbV90b3BMZWZ0Ow0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIG5ld0JvdHRvbUxlZnQgPSBtX2JvdHRvbUxlZnQ7DQorICAgIENCQ19SZXN1bHRQb2ludCogbmV3VG9wUmlnaHQgPSBtX3RvcFJpZ2h0Ow0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIG5ld0JvdHRvbVJpZ2h0ID0gbV9ib3R0b21SaWdodDsNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3AgPSBOVUxMOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIG5ld0JvdHRvbSA9IE5VTEw7DQorICAgIGlmIChtaXNzaW5nU3RhcnRSb3dzID4gMCkgew0KKyAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3AgPSBpc0xlZnQgPyBtX3RvcExlZnQgOiBtX3RvcFJpZ2h0Ow0KKyAgICAgICAgRlhfSU5UMzIgbmV3TWluWSA9IChGWF9JTlQzMikgdG9wLT5HZXRZKCkgLSBtaXNzaW5nU3RhcnRSb3dzOw0KKyAgICAgICAgaWYgKG5ld01pblkgPCAwKSB7DQorICAgICAgICAgICAgbmV3TWluWSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBuZXdUb3AgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVCl0b3AtPkdldFgoKSwgKEZYX0ZMT0FUKW5ld01pblkpOw0KKyAgICAgICAgaWYgKGlzTGVmdCkgew0KKyAgICAgICAgICAgIG5ld1RvcExlZnQgPSBuZXdUb3A7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG5ld1RvcFJpZ2h0ID0gbmV3VG9wOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtaXNzaW5nRW5kUm93cyA+IDApIHsNCisgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tID0gaXNMZWZ0ID8gbV9ib3R0b21MZWZ0IDogbV9ib3R0b21SaWdodDsNCisgICAgICAgIEZYX0lOVDMyIG5ld01heFkgPSAoRlhfSU5UMzIpIGJvdHRvbS0+R2V0WSgpICsgbWlzc2luZ0VuZFJvd3M7DQorICAgICAgICBpZiAobmV3TWF4WSA+PSBtX2ltYWdlLT5HZXRIZWlnaHQoKSkgew0KKyAgICAgICAgICAgIG5ld01heFkgPSBtX2ltYWdlLT5HZXRIZWlnaHQoKSAtIDE7DQorICAgICAgICB9DQorICAgICAgICBuZXdCb3R0b20gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVClib3R0b20tPkdldFgoKSwgKEZYX0ZMT0FUKW5ld01heFkpOw0KKyAgICAgICAgaWYgKGlzTGVmdCkgew0KKyAgICAgICAgICAgIG5ld0JvdHRvbUxlZnQgPSBuZXdCb3R0b207DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG5ld0JvdHRvbVJpZ2h0ID0gbmV3Qm90dG9tOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGNhbGN1bGF0ZU1pbk1heFZhbHVlcygpOw0KKyAgICBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94ID0gRlhfTkVXIENCQ19Cb3VuZGluZ0JveChtX2ltYWdlLCBuZXdUb3BMZWZ0LCBuZXdCb3R0b21MZWZ0LCBuZXdUb3BSaWdodCwgbmV3Qm90dG9tUmlnaHQsIGUpOw0KKyAgICBkZWxldGUgbmV3VG9wOw0KKyAgICBkZWxldGUgbmV3Qm90dG9tOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBib3VuZGluZ0JveDsNCit9DQordm9pZCBDQkNfQm91bmRpbmdCb3g6OnNldFRvcFJpZ2h0KENCQ19SZXN1bHRQb2ludCB0b3BSaWdodCkNCit7DQorICAgIGlmIChtX3RvcFJpZ2h0KSB7DQorICAgICAgICBkZWxldGUgbV90b3BSaWdodDsNCisgICAgfQ0KKyAgICBtX3RvcFJpZ2h0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh0b3BSaWdodC5HZXRYKCksIHRvcFJpZ2h0LkdldFkoKSk7DQorICAgIGNhbGN1bGF0ZU1pbk1heFZhbHVlcygpOw0KK30NCit2b2lkIENCQ19Cb3VuZGluZ0JveDo6c2V0Qm90dG9tUmlnaHQoQ0JDX1Jlc3VsdFBvaW50IGJvdHRvbVJpZ2h0KQ0KK3sNCisgICAgaWYgKG1fYm90dG9tUmlnaHQpIHsNCisgICAgICAgIGRlbGV0ZSBtX2JvdHRvbVJpZ2h0Ow0KKyAgICB9DQorICAgIG1fYm90dG9tUmlnaHQgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KGJvdHRvbVJpZ2h0LkdldFgoKSwgYm90dG9tUmlnaHQuR2V0WSgpKTsNCisgICAgY2FsY3VsYXRlTWluTWF4VmFsdWVzKCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19Cb3VuZGluZ0JveDo6Z2V0TWluWCgpDQorew0KKyAgICByZXR1cm4gbV9taW5YOw0KK30NCitGWF9JTlQzMiBDQkNfQm91bmRpbmdCb3g6OmdldE1heFgoKQ0KK3sNCisgICAgcmV0dXJuIG1fbWF4WDsNCit9DQorRlhfSU5UMzIgQ0JDX0JvdW5kaW5nQm94OjpnZXRNaW5ZKCkNCit7DQorICAgIHJldHVybiBtX21pblk7DQorfQ0KK0ZYX0lOVDMyIENCQ19Cb3VuZGluZ0JveDo6Z2V0TWF4WSgpDQorew0KKyAgICByZXR1cm4gbV9tYXhZOw0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0VG9wTGVmdCgpDQorew0KKyAgICByZXR1cm4gbV90b3BMZWZ0Ow0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0VG9wUmlnaHQoKQ0KK3sNCisgICAgcmV0dXJuIG1fdG9wUmlnaHQ7DQorfQ0KK0NCQ19SZXN1bHRQb2ludCogQ0JDX0JvdW5kaW5nQm94OjpnZXRCb3R0b21MZWZ0KCkNCit7DQorICAgIHJldHVybiBtX2JvdHRvbUxlZnQ7DQorfQ0KK0NCQ19SZXN1bHRQb2ludCogQ0JDX0JvdW5kaW5nQm94OjpnZXRCb3R0b21SaWdodCgpDQorew0KKyAgICByZXR1cm4gbV9ib3R0b21SaWdodDsNCit9DQordm9pZCBDQkNfQm91bmRpbmdCb3g6OmluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0KQ0KK3sNCisgICAgbV90b3BMZWZ0ID0gTlVMTDsNCisgICAgbV9ib3R0b21MZWZ0ID0gTlVMTDsNCisgICAgbV90b3BSaWdodCA9IE5VTEw7DQorICAgIG1fYm90dG9tUmlnaHQgPSBOVUxMOw0KKyAgICBtX2ltYWdlID0gaW1hZ2U7DQorICAgIGlmICh0b3BMZWZ0KSB7DQorICAgICAgICBtX3RvcExlZnQgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRvcExlZnQtPkdldFgoKSwgdG9wTGVmdC0+R2V0WSgpKTsNCisgICAgfQ0KKyAgICBpZiAoYm90dG9tTGVmdCkgew0KKyAgICAgICAgbV9ib3R0b21MZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludChib3R0b21MZWZ0LT5HZXRYKCksIGJvdHRvbUxlZnQtPkdldFkoKSk7DQorICAgIH0NCisgICAgaWYgKHRvcFJpZ2h0KSB7DQorICAgICAgICBtX3RvcFJpZ2h0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh0b3BSaWdodC0+R2V0WCgpLCB0b3BSaWdodC0+R2V0WSgpKTsNCisgICAgfQ0KKyAgICBpZiAoYm90dG9tUmlnaHQpIHsNCisgICAgICAgIG1fYm90dG9tUmlnaHQgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KGJvdHRvbVJpZ2h0LT5HZXRYKCksIGJvdHRvbVJpZ2h0LT5HZXRZKCkpOw0KKyAgICB9DQorICAgIGNhbGN1bGF0ZU1pbk1heFZhbHVlcygpOw0KK30NCit2b2lkIENCQ19Cb3VuZGluZ0JveDo6Y2FsY3VsYXRlTWluTWF4VmFsdWVzKCkNCit7DQorICAgIGlmIChtX3RvcExlZnQgPT0gTlVMTCkgew0KKyAgICAgICAgbV90b3BMZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgwLCBtX3RvcFJpZ2h0LT5HZXRZKCkpOw0KKyAgICAgICAgbV9ib3R0b21MZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgwLCBtX2JvdHRvbVJpZ2h0LT5HZXRZKCkpOw0KKyAgICB9IGVsc2UgaWYgKG1fdG9wUmlnaHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV90b3BSaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKW1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLCAoRlhfRkxPQVQpbV90b3BMZWZ0LT5HZXRZKCkpOw0KKyAgICAgICAgbV9ib3R0b21SaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKW1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLCAoRlhfRkxPQVQpbV9ib3R0b21MZWZ0LT5HZXRZKCkpOw0KKyAgICB9DQorICAgIG1fbWluWCA9IChGWF9JTlQzMikgKG1fdG9wTGVmdC0+R2V0WCgpIDwgbV9ib3R0b21MZWZ0LT5HZXRYKCkgPyBtX3RvcExlZnQtPkdldFgoKSA6IG1fYm90dG9tTGVmdC0+R2V0WCgpKTsNCisgICAgbV9tYXhYID0gKEZYX0lOVDMyKSAobV90b3BSaWdodC0+R2V0WCgpID4gbV9ib3R0b21SaWdodC0+R2V0WCgpID8gbV90b3BSaWdodC0+R2V0WCgpIDogbV9ib3R0b21SaWdodC0+R2V0WCgpKTsNCisgICAgbV9taW5ZID0gKEZYX0lOVDMyKSAobV90b3BMZWZ0LT5HZXRZKCkgPCAgbV90b3BSaWdodC0+R2V0WSgpID8gbV90b3BMZWZ0LT5HZXRZKCkgOiBtX3RvcFJpZ2h0LT5HZXRZKCkpOw0KKyAgICBtX21heFkgPSAoRlhfSU5UMzIpIChtX2JvdHRvbUxlZnQtPkdldFkoKSA+ICBtX2JvdHRvbVJpZ2h0LT5HZXRZKCkgPyBtX2JvdHRvbUxlZnQtPkdldFkoKSA6IG1fYm90dG9tUmlnaHQtPkdldFkoKSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdDb2Rld29yZC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Q29kZXdvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDY5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Q29kZXdvcmQuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZC5oIg0KK0ZYX0lOVDMyIENCQ19Db2Rld29yZDo6QkFSQ09ERV9ST1dfVU5LTk9XTiA9IC0xOw0KK0NCQ19Db2Rld29yZDo6Q0JDX0NvZGV3b3JkKEZYX0lOVDMyIHN0YXJ0WCwgRlhfSU5UMzIgZW5kWCwgRlhfSU5UMzIgYnVja2V0LCBGWF9JTlQzMiBjdmFsdWUpDQorew0KKyAgICBtX3N0YXJ0WCA9IHN0YXJ0WDsNCisgICAgbV9lbmRYID0gZW5kWDsNCisgICAgbV9idWNrZXQgPSBidWNrZXQ7DQorICAgIG1fdmFsdWUgPSBjdmFsdWU7DQorICAgIG1fcm93TnVtYmVyID0gQkFSQ09ERV9ST1dfVU5LTk9XTjsNCit9DQorQ0JDX0NvZGV3b3JkOjp+Q0JDX0NvZGV3b3JkKCkNCit7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGV3b3JkOjpoYXNWYWxpZFJvd051bWJlcigpDQorew0KKyAgICByZXR1cm4gaXNWYWxpZFJvd051bWJlcihtX3Jvd051bWJlcik7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGV3b3JkOjppc1ZhbGlkUm93TnVtYmVyKEZYX0lOVDMyIHJvd051bWJlcikNCit7DQorICAgIHJldHVybiBtX3Jvd051bWJlciAhPSBCQVJDT0RFX1JPV19VTktOT1dOICYmIG1fYnVja2V0ID09IChtX3Jvd051bWJlciAlIDMpICogMzsNCit9DQordm9pZCBDQkNfQ29kZXdvcmQ6OnNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCkNCit7DQorICAgIG1fcm93TnVtYmVyID0gKG1fdmFsdWUgLyAzMCkgKiAzICsgbV9idWNrZXQgLyAzOw0KK30NCitGWF9JTlQzMiBDQkNfQ29kZXdvcmQ6OmdldFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX2VuZFggLSBtX3N0YXJ0WDsNCit9DQorRlhfSU5UMzIgQ0JDX0NvZGV3b3JkOjpnZXRTdGFydFgoKQ0KK3sNCisgICAgcmV0dXJuIG1fc3RhcnRYOw0KK30NCitGWF9JTlQzMiBDQkNfQ29kZXdvcmQ6OmdldEVuZFgoKQ0KK3sNCisgICAgcmV0dXJuIG1fZW5kWDsNCit9DQorRlhfSU5UMzIgQ0JDX0NvZGV3b3JkOjpnZXRCdWNrZXQoKQ0KK3sNCisgICAgcmV0dXJuIG1fYnVja2V0Ow0KK30NCitGWF9JTlQzMiBDQkNfQ29kZXdvcmQ6OmdldFZhbHVlKCkNCit7DQorICAgIHJldHVybiBtX3ZhbHVlOw0KK30NCitGWF9JTlQzMiBDQkNfQ29kZXdvcmQ6OmdldFJvd051bWJlcigpDQorew0KKyAgICByZXR1cm4gbV9yb3dOdW1iZXI7DQorfQ0KK3ZvaWQgQ0JDX0NvZGV3b3JkOjpzZXRSb3dOdW1iZXIoRlhfSU5UMzIgcm93TnVtYmVyKQ0KK3sNCisgICAgbV9yb3dOdW1iZXIgPSByb3dOdW1iZXI7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19Db2Rld29yZDo6dG9TdHJpbmcoKQ0KK3sNCisgICAgcmV0dXJuIG1fcm93TnVtYmVyICsgKEZYX0NIQVIpJ3wnICsgbV92YWx1ZTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWEwNGQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaCINCisjZGVmaW5lICAgICBTWU1CT0xfVEFCTEVfTGVuZ3RoICAgICAgIDI3ODcNCisjZGVmaW5lICAgICBGbG9hdF9NQVhfVkFMVUUgICAgICAgICAgIDIxNDc0ODM2NDcNCitGWF9GTE9BVCBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpSQVRJT1NfVEFCTEVbMjc4N11bOF0gPSB7MH07DQorQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6Q0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlcigpDQorew0KK30NCitDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjp+Q0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlcigpDQorew0KK30NCit2b2lkIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IFNZTUJPTF9UQUJMRV9MZW5ndGg7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgY3VycmVudFN5bWJvbCA9IENCQ19QREY0MTdDb21tb246OlNZTUJPTF9UQUJMRVtpXTsNCisgICAgICAgIEZYX0lOVDMyIGN1cnJlbnRCaXQgPSBjdXJyZW50U3ltYm9sICYgMHgxOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFOyBqKyspIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBzaXplID0gMC4wZjsNCisgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRTeW1ib2wgJiAweDEpID09IGN1cnJlbnRCaXQpIHsNCisgICAgICAgICAgICAgICAgc2l6ZSArPSAxLjBmOw0KKyAgICAgICAgICAgICAgICBjdXJyZW50U3ltYm9sID4+PSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjdXJyZW50Qml0ID0gY3VycmVudFN5bWJvbCAmIDB4MTsNCisgICAgICAgICAgICBSQVRJT1NfVEFCTEVbaV1bQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEUgLSBqIC0gMV0gPSBzaXplIC8gQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkZpbmFsaXplKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpDQorew0KKyAgICBDRlhfSW50MzJBcnJheSogYXJyYXkgPSBzYW1wbGVCaXRDb3VudHMobW9kdWxlQml0Q291bnQpOw0KKyAgICBGWF9JTlQzMiBkZWNvZGVkVmFsdWUgPSBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZSgqYXJyYXkpOw0KKyAgICBkZWxldGUgYXJyYXk7DQorICAgIGlmIChkZWNvZGVkVmFsdWUgIT0gLTEpIHsNCisgICAgICAgIHJldHVybiBkZWNvZGVkVmFsdWU7DQorICAgIH0NCisgICAgcmV0dXJuIGdldENsb3Nlc3REZWNvZGVkVmFsdWUobW9kdWxlQml0Q291bnQpOw0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6c2FtcGxlQml0Q291bnRzKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkNCit7DQorICAgIEZYX0ZMT0FUIGJpdENvdW50U3VtID0gKEZYX0ZMT0FUKUNCQ19QREY0MTdDb21tb246OmdldEJpdENvdW50U3VtKG1vZHVsZUJpdENvdW50KTsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGJpdENvdW50ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5KCk7DQorICAgIGJpdENvdW50LT5TZXRTaXplKENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFKTsNCisgICAgRlhfSU5UMzIgYml0Q291bnRJbmRleCA9IDA7DQorICAgIEZYX0lOVDMyIHN1bVByZXZpb3VzQml0cyA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEOyBpKyspIHsNCisgICAgICAgIEZYX0ZMT0FUIHNhbXBsZUluZGV4ID0gYml0Q291bnRTdW0gLyAoMiAqIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQpICsgKGkgKiBiaXRDb3VudFN1bSkgLyBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEOw0KKyAgICAgICAgaWYgKHN1bVByZXZpb3VzQml0cyArIG1vZHVsZUJpdENvdW50LkdldEF0KGJpdENvdW50SW5kZXgpIDw9IHNhbXBsZUluZGV4KSB7DQorICAgICAgICAgICAgc3VtUHJldmlvdXNCaXRzICs9IG1vZHVsZUJpdENvdW50LkdldEF0KGJpdENvdW50SW5kZXgpOw0KKyAgICAgICAgICAgIGJpdENvdW50SW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICAgIGJpdENvdW50LT5TZXRBdChiaXRDb3VudEluZGV4LCBiaXRDb3VudC0+R2V0QXQoYml0Q291bnRJbmRleCkgKyAxKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYml0Q291bnQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRDb2Rld29yZFZhbHVlKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkNCit7DQorICAgIEZYX0lOVDMyIGRlY29kZWRWYWx1ZSA9IGdldEJpdFZhbHVlKG1vZHVsZUJpdENvdW50KTsNCisgICAgcmV0dXJuIENCQ19QREY0MTdDb21tb246OmdldENvZGV3b3JkKGRlY29kZWRWYWx1ZSkgPT0gLTEgPyAtMSA6IGRlY29kZWRWYWx1ZTsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6Z2V0Qml0VmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KQ0KK3sNCisgICAgRlhfSU5UNjQgcmVzdWx0ID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1vZHVsZUJpdENvdW50LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGJpdCA9IDA7IGJpdCA8IG1vZHVsZUJpdENvdW50LkdldEF0KGkpOyBiaXQrKykgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgMSkgfCAoaSAlIDIgPT0gMCA/IDEgOiAwKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gKEZYX0lOVDMyKSByZXN1bHQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldENsb3Nlc3REZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KQ0KK3sNCisgICAgRlhfSU5UMzIgYml0Q291bnRTdW0gPSBDQkNfUERGNDE3Q29tbW9uOjpnZXRCaXRDb3VudFN1bShtb2R1bGVCaXRDb3VudCk7DQorICAgIENGWF9GbG9hdEFycmF5IGJpdENvdW50UmF0aW9zOw0KKyAgICBiaXRDb3VudFJhdGlvcy5TZXRTaXplKENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGJpdENvdW50UmF0aW9zLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBiaXRDb3VudFJhdGlvc1tpXSA9IG1vZHVsZUJpdENvdW50LkdldEF0KGkpIC8gKEZYX0ZMT0FUKSBiaXRDb3VudFN1bTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBiZXN0TWF0Y2hFcnJvciA9IChGWF9GTE9BVClGbG9hdF9NQVhfVkFMVUU7DQorICAgIEZYX0lOVDMyIGJlc3RNYXRjaCA9IC0xOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgU1lNQk9MX1RBQkxFX0xlbmd0aDsgaisrKSB7DQorICAgICAgICBGWF9GTE9BVCBlcnJvciA9IDAuMGY7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGsgPSAwOyBrIDwgQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEU7IGsrKykgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGRpZmYgPSBSQVRJT1NfVEFCTEVbal1ba10gLSBiaXRDb3VudFJhdGlvc1trXTsNCisgICAgICAgICAgICBlcnJvciArPSBkaWZmICogZGlmZjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaEVycm9yKSB7DQorICAgICAgICAgICAgYmVzdE1hdGNoRXJyb3IgPSBlcnJvcjsNCisgICAgICAgICAgICBiZXN0TWF0Y2ggPSBDQkNfUERGNDE3Q29tbW9uOjpTWU1CT0xfVEFCTEVbal07DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJlc3RNYXRjaDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvbW1vbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Q29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTdlMDc4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0NvbW1vbi5jcHAKQEAgLTAsMCArMSw0MzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21tb24uaCINCitGWF9JTlQzMiBDQkNfUERGNDE3Q29tbW9uOjpOVU1CRVJfT0ZfQ09ERVdPUkRTID0gOTI5Ow0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb21tb246Ok1BWF9DT0RFV09SRFNfSU5fQkFSQ09ERSA9IE5VTUJFUl9PRl9DT0RFV09SRFMgLSAxOw0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb21tb246Ok1JTl9ST1dTX0lOX0JBUkNPREUgPSAzOw0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb21tb246Ok1BWF9ST1dTX0lOX0JBUkNPREUgPSA5MDsNCitGWF9JTlQzMiBDQkNfUERGNDE3Q29tbW9uOjpNQVhfQ09ERVdPUkRTX0lOX1JPVyA9IDMyOw0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQgPSAxNzsNCitGWF9JTlQzMiBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTiA9IDE4Ow0KK0ZYX0lOVDMyIENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFID0gODsNCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0NvbW1vbjo6RU1QVFlfSU5UX0FSUkFZID0gTlVMTDsNCitGWF9JTlQzMiBDQkNfUERGNDE3Q29tbW9uOjpTWU1CT0xfVEFCTEVbXSA9IHsNCisgICAgMHgxMDI1ZSwgMHgxMDI3YSwgMHgxMDI5ZSwgMHgxMDJiYywgMHgxMDJmMiwgMHgxMDJmNCwgMHgxMDMyZSwgMHgxMDM0ZSwgMHgxMDM1YywgMHgxMDM5NiwgMHgxMDNhNiwgMHgxMDNhYywNCisgICAgMHgxMDQyMiwgMHgxMDQyOCwgMHgxMDQzNiwgMHgxMDQ0MiwgMHgxMDQ0NCwgMHgxMDQ0OCwgMHgxMDQ1MCwgMHgxMDQ1ZSwgMHgxMDQ2NiwgMHgxMDQ2YywgMHgxMDQ3YSwgMHgxMDQ4MiwNCisgICAgMHgxMDQ5ZSwgMHgxMDRhMCwgMHgxMDRiYywgMHgxMDRjNiwgMHgxMDRkOCwgMHgxMDRlZSwgMHgxMDRmMiwgMHgxMDRmNCwgMHgxMDUwNCwgMHgxMDUwOCwgMHgxMDUxMCwgMHgxMDUxZSwNCisgICAgMHgxMDUyMCwgMHgxMDUzYywgMHgxMDU0MCwgMHgxMDU3OCwgMHgxMDU4NiwgMHgxMDU4YywgMHgxMDU5OCwgMHgxMDViMCwgMHgxMDViZSwgMHgxMDVjZSwgMHgxMDVkYywgMHgxMDVlMiwNCisgICAgMHgxMDVlNCwgMHgxMDVlOCwgMHgxMDVmNiwgMHgxMDYyZSwgMHgxMDY0ZSwgMHgxMDY1YywgMHgxMDY4ZSwgMHgxMDY5YywgMHgxMDZiOCwgMHgxMDZkZSwgMHgxMDZmYSwgMHgxMDcxNiwNCisgICAgMHgxMDcyNiwgMHgxMDcyYywgMHgxMDc0NiwgMHgxMDc0YywgMHgxMDc1OCwgMHgxMDc2ZSwgMHgxMDc5MiwgMHgxMDc5NCwgMHgxMDdhMiwgMHgxMDdhNCwgMHgxMDdhOCwgMHgxMDdiNiwNCisgICAgMHgxMDgyMiwgMHgxMDgyOCwgMHgxMDg0MiwgMHgxMDg0OCwgMHgxMDg1MCwgMHgxMDg1ZSwgMHgxMDg2NiwgMHgxMDg2YywgMHgxMDg3YSwgMHgxMDg4MiwgMHgxMDg4NCwgMHgxMDg5MCwNCisgICAgMHgxMDg5ZSwgMHgxMDhhMCwgMHgxMDhiYywgMHgxMDhjNiwgMHgxMDhjYywgMHgxMDhkOCwgMHgxMDhlZSwgMHgxMDhmMiwgMHgxMDhmNCwgMHgxMDkwMiwgMHgxMDkwOCwgMHgxMDkxZSwNCisgICAgMHgxMDkyMCwgMHgxMDkzYywgMHgxMDk0MCwgMHgxMDk3OCwgMHgxMDk4NiwgMHgxMDk5OCwgMHgxMDliMCwgMHgxMDliZSwgMHgxMDljZSwgMHgxMDlkYywgMHgxMDllMiwgMHgxMDllNCwNCisgICAgMHgxMDllOCwgMHgxMDlmNiwgMHgxMGEwOCwgMHgxMGExMCwgMHgxMGExZSwgMHgxMGEyMCwgMHgxMGEzYywgMHgxMGE0MCwgMHgxMGE3OCwgMHgxMGFmMCwgMHgxMGIwNiwgMHgxMGIwYywNCisgICAgMHgxMGIxOCwgMHgxMGIzMCwgMHgxMGIzZSwgMHgxMGI2MCwgMHgxMGI3YywgMHgxMGI4ZSwgMHgxMGI5YywgMHgxMGJiOCwgMHgxMGJjMiwgMHgxMGJjNCwgMHgxMGJjOCwgMHgxMGJkMCwNCisgICAgMHgxMGJkZSwgMHgxMGJlNiwgMHgxMGJlYywgMHgxMGMyZSwgMHgxMGM0ZSwgMHgxMGM1YywgMHgxMGM2MiwgMHgxMGM2NCwgMHgxMGM2OCwgMHgxMGM3NiwgMHgxMGM4ZSwgMHgxMGM5YywNCisgICAgMHgxMGNiOCwgMHgxMGNjMiwgMHgxMGNjNCwgMHgxMGNjOCwgMHgxMGNkMCwgMHgxMGNkZSwgMHgxMGNlNiwgMHgxMGNlYywgMHgxMGNmYSwgMHgxMGQwZSwgMHgxMGQxYywgMHgxMGQzOCwNCisgICAgMHgxMGQ3MCwgMHgxMGQ3ZSwgMHgxMGQ4MiwgMHgxMGQ4NCwgMHgxMGQ4OCwgMHgxMGQ5MCwgMHgxMGQ5ZSwgMHgxMGRhMCwgMHgxMGRiYywgMHgxMGRjNiwgMHgxMGRjYywgMHgxMGRkOCwNCisgICAgMHgxMGRlZSwgMHgxMGRmMiwgMHgxMGRmNCwgMHgxMGUxNiwgMHgxMGUyNiwgMHgxMGUyYywgMHgxMGU0NiwgMHgxMGU1OCwgMHgxMGU2ZSwgMHgxMGU4NiwgMHgxMGU4YywgMHgxMGU5OCwNCisgICAgMHgxMGViMCwgMHgxMGViZSwgMHgxMGVjZSwgMHgxMGVkYywgMHgxMGYwYSwgMHgxMGYxMiwgMHgxMGYxNCwgMHgxMGYyMiwgMHgxMGYyOCwgMHgxMGYzNiwgMHgxMGY0MiwgMHgxMGY0NCwNCisgICAgMHgxMGY0OCwgMHgxMGY1MCwgMHgxMGY1ZSwgMHgxMGY2NiwgMHgxMGY2YywgMHgxMGZiMiwgMHgxMGZiNCwgMHgxMTAyMiwgMHgxMTAyOCwgMHgxMTA0MiwgMHgxMTA0OCwgMHgxMTA1MCwNCisgICAgMHgxMTA1ZSwgMHgxMTA3YSwgMHgxMTA4MiwgMHgxMTA4NCwgMHgxMTA5MCwgMHgxMTA5ZSwgMHgxMTBhMCwgMHgxMTBiYywgMHgxMTBjNiwgMHgxMTBjYywgMHgxMTBkOCwgMHgxMTBlZSwNCisgICAgMHgxMTBmMiwgMHgxMTBmNCwgMHgxMTEwMiwgMHgxMTExZSwgMHgxMTEyMCwgMHgxMTEzYywgMHgxMTE0MCwgMHgxMTE3OCwgMHgxMTE4NiwgMHgxMTE5OCwgMHgxMTFiMCwgMHgxMTFiZSwNCisgICAgMHgxMTFjZSwgMHgxMTFkYywgMHgxMTFlMiwgMHgxMTFlNCwgMHgxMTFlOCwgMHgxMTFmNiwgMHgxMTIwOCwgMHgxMTIxZSwgMHgxMTIyMCwgMHgxMTI3OCwgMHgxMTJmMCwgMHgxMTMwYywNCisgICAgMHgxMTMzMCwgMHgxMTMzZSwgMHgxMTM2MCwgMHgxMTM3YywgMHgxMTM4ZSwgMHgxMTM5YywgMHgxMTNiOCwgMHgxMTNjMiwgMHgxMTNjOCwgMHgxMTNkMCwgMHgxMTNkZSwgMHgxMTNlNiwNCisgICAgMHgxMTNlYywgMHgxMTQwOCwgMHgxMTQxMCwgMHgxMTQxZSwgMHgxMTQyMCwgMHgxMTQzYywgMHgxMTQ0MCwgMHgxMTQ3OCwgMHgxMTRmMCwgMHgxMTVlMCwgMHgxMTYwYywgMHgxMTYxOCwNCisgICAgMHgxMTYzMCwgMHgxMTYzZSwgMHgxMTY2MCwgMHgxMTY3YywgMHgxMTZjMCwgMHgxMTZmOCwgMHgxMTcxYywgMHgxMTczOCwgMHgxMTc3MCwgMHgxMTc3ZSwgMHgxMTc4MiwgMHgxMTc4NCwNCisgICAgMHgxMTc4OCwgMHgxMTc5MCwgMHgxMTc5ZSwgMHgxMTdhMCwgMHgxMTdiYywgMHgxMTdjNiwgMHgxMTdjYywgMHgxMTdkOCwgMHgxMTdlZSwgMHgxMTgyZSwgMHgxMTgzNCwgMHgxMTg0ZSwNCisgICAgMHgxMTg1YywgMHgxMTg2MiwgMHgxMTg2NCwgMHgxMTg2OCwgMHgxMTg3NiwgMHgxMTg4ZSwgMHgxMTg5YywgMHgxMThiOCwgMHgxMThjMiwgMHgxMThjOCwgMHgxMThkMCwgMHgxMThkZSwNCisgICAgMHgxMThlNiwgMHgxMThlYywgMHgxMThmYSwgMHgxMTkwZSwgMHgxMTkxYywgMHgxMTkzOCwgMHgxMTk3MCwgMHgxMTk3ZSwgMHgxMTk4MiwgMHgxMTk4NCwgMHgxMTk5MCwgMHgxMTk5ZSwNCisgICAgMHgxMTlhMCwgMHgxMTliYywgMHgxMTljNiwgMHgxMTljYywgMHgxMTlkOCwgMHgxMTllZSwgMHgxMTlmMiwgMHgxMTlmNCwgMHgxMWEwZSwgMHgxMWExYywgMHgxMWEzOCwgMHgxMWE3MCwNCisgICAgMHgxMWE3ZSwgMHgxMWFlMCwgMHgxMWFmYywgMHgxMWIwOCwgMHgxMWIxMCwgMHgxMWIxZSwgMHgxMWIyMCwgMHgxMWIzYywgMHgxMWI0MCwgMHgxMWI3OCwgMHgxMWI4YywgMHgxMWI5OCwNCisgICAgMHgxMWJiMCwgMHgxMWJiZSwgMHgxMWJjZSwgMHgxMWJkYywgMHgxMWJlMiwgMHgxMWJlNCwgMHgxMWJlOCwgMHgxMWJmNiwgMHgxMWMxNiwgMHgxMWMyNiwgMHgxMWMyYywgMHgxMWM0NiwNCisgICAgMHgxMWM0YywgMHgxMWM1OCwgMHgxMWM2ZSwgMHgxMWM4NiwgMHgxMWM5OCwgMHgxMWNiMCwgMHgxMWNiZSwgMHgxMWNjZSwgMHgxMWNkYywgMHgxMWNlMiwgMHgxMWNlNCwgMHgxMWNlOCwNCisgICAgMHgxMWNmNiwgMHgxMWQwNiwgMHgxMWQwYywgMHgxMWQxOCwgMHgxMWQzMCwgMHgxMWQzZSwgMHgxMWQ2MCwgMHgxMWQ3YywgMHgxMWQ4ZSwgMHgxMWQ5YywgMHgxMWRiOCwgMHgxMWRjNCwNCisgICAgMHgxMWRjOCwgMHgxMWRkMCwgMHgxMWRkZSwgMHgxMWRlNiwgMHgxMWRlYywgMHgxMWRmYSwgMHgxMWUwYSwgMHgxMWUxMiwgMHgxMWUxNCwgMHgxMWUyMiwgMHgxMWUyNCwgMHgxMWUyOCwNCisgICAgMHgxMWUzNiwgMHgxMWU0MiwgMHgxMWU0NCwgMHgxMWU1MCwgMHgxMWU1ZSwgMHgxMWU2NiwgMHgxMWU2YywgMHgxMWU4MiwgMHgxMWU4NCwgMHgxMWU4OCwgMHgxMWU5MCwgMHgxMWU5ZSwNCisgICAgMHgxMWVhMCwgMHgxMWViYywgMHgxMWVjNiwgMHgxMWVjYywgMHgxMWVkOCwgMHgxMWVlZSwgMHgxMWYxYSwgMHgxMWYyZSwgMHgxMWYzMiwgMHgxMWYzNCwgMHgxMWY0ZSwgMHgxMWY1YywNCisgICAgMHgxMWY2MiwgMHgxMWY2NCwgMHgxMWY2OCwgMHgxMWY3NiwgMHgxMjA0OCwgMHgxMjA1ZSwgMHgxMjA4MiwgMHgxMjA4NCwgMHgxMjA5MCwgMHgxMjA5ZSwgMHgxMjBhMCwgMHgxMjBiYywNCisgICAgMHgxMjBkOCwgMHgxMjBmMiwgMHgxMjBmNCwgMHgxMjEwOCwgMHgxMjExZSwgMHgxMjEyMCwgMHgxMjEzYywgMHgxMjE0MCwgMHgxMjE3OCwgMHgxMjE4NiwgMHgxMjE5OCwgMHgxMjFiMCwNCisgICAgMHgxMjFiZSwgMHgxMjFlMiwgMHgxMjFlNCwgMHgxMjFlOCwgMHgxMjFmNiwgMHgxMjIwNCwgMHgxMjIxMCwgMHgxMjIxZSwgMHgxMjIyMCwgMHgxMjI3OCwgMHgxMjJmMCwgMHgxMjMwNiwNCisgICAgMHgxMjMwYywgMHgxMjMzMCwgMHgxMjMzZSwgMHgxMjM2MCwgMHgxMjM3YywgMHgxMjM4ZSwgMHgxMjM5YywgMHgxMjNiOCwgMHgxMjNjMiwgMHgxMjNjOCwgMHgxMjNkMCwgMHgxMjNlNiwNCisgICAgMHgxMjNlYywgMHgxMjQxZSwgMHgxMjQyMCwgMHgxMjQzYywgMHgxMjRmMCwgMHgxMjVlMCwgMHgxMjYxOCwgMHgxMjYzZSwgMHgxMjY2MCwgMHgxMjY3YywgMHgxMjZjMCwgMHgxMjZmOCwNCisgICAgMHgxMjczOCwgMHgxMjc3MCwgMHgxMjc3ZSwgMHgxMjc4MiwgMHgxMjc4NCwgMHgxMjc5MCwgMHgxMjc5ZSwgMHgxMjdhMCwgMHgxMjdiYywgMHgxMjdjNiwgMHgxMjdjYywgMHgxMjdkOCwNCisgICAgMHgxMjdlZSwgMHgxMjgyMCwgMHgxMjgzYywgMHgxMjg0MCwgMHgxMjg3OCwgMHgxMjhmMCwgMHgxMjllMCwgMHgxMmJjMCwgMHgxMmMxOCwgMHgxMmMzMCwgMHgxMmMzZSwgMHgxMmM2MCwNCisgICAgMHgxMmM3YywgMHgxMmNjMCwgMHgxMmNmOCwgMHgxMmRmMCwgMHgxMmUxYywgMHgxMmUzOCwgMHgxMmU3MCwgMHgxMmU3ZSwgMHgxMmVlMCwgMHgxMmVmYywgMHgxMmYwNCwgMHgxMmYwOCwNCisgICAgMHgxMmYxMCwgMHgxMmYyMCwgMHgxMmYzYywgMHgxMmY0MCwgMHgxMmY3OCwgMHgxMmY4NiwgMHgxMmY4YywgMHgxMmY5OCwgMHgxMmZiMCwgMHgxMmZiZSwgMHgxMmZjZSwgMHgxMmZkYywNCisgICAgMHgxMzAyZSwgMHgxMzA0ZSwgMHgxMzA1YywgMHgxMzA2MiwgMHgxMzA2OCwgMHgxMzA4ZSwgMHgxMzA5YywgMHgxMzBiOCwgMHgxMzBjMiwgMHgxMzBjOCwgMHgxMzBkMCwgMHgxMzBkZSwNCisgICAgMHgxMzBlYywgMHgxMzBmYSwgMHgxMzEwZSwgMHgxMzEzOCwgMHgxMzE3MCwgMHgxMzE3ZSwgMHgxMzE4MiwgMHgxMzE4NCwgMHgxMzE5MCwgMHgxMzE5ZSwgMHgxMzFhMCwgMHgxMzFiYywNCisgICAgMHgxMzFjNiwgMHgxMzFjYywgMHgxMzFkOCwgMHgxMzFmMiwgMHgxMzFmNCwgMHgxMzIwZSwgMHgxMzIxYywgMHgxMzI3MCwgMHgxMzI3ZSwgMHgxMzJlMCwgMHgxMzJmYywgMHgxMzMwOCwNCisgICAgMHgxMzMxZSwgMHgxMzMyMCwgMHgxMzMzYywgMHgxMzM0MCwgMHgxMzM3OCwgMHgxMzM4NiwgMHgxMzM5OCwgMHgxMzNiMCwgMHgxMzNiZSwgMHgxMzNjZSwgMHgxMzNkYywgMHgxMzNlMiwNCisgICAgMHgxMzNlNCwgMHgxMzNlOCwgMHgxMzNmNiwgMHgxMzQwZSwgMHgxMzQxYywgMHgxMzQzOCwgMHgxMzQ3MCwgMHgxMzQ3ZSwgMHgxMzRlMCwgMHgxMzRmYywgMHgxMzVjMCwgMHgxMzVmOCwNCisgICAgMHgxMzYwOCwgMHgxMzYxMCwgMHgxMzYxZSwgMHgxMzYyMCwgMHgxMzYzYywgMHgxMzY0MCwgMHgxMzY3OCwgMHgxMzZmMCwgMHgxMzcwYywgMHgxMzcxOCwgMHgxMzczMCwgMHgxMzczZSwNCisgICAgMHgxMzc2MCwgMHgxMzc3YywgMHgxMzc5YywgMHgxMzdiOCwgMHgxMzdjMiwgMHgxMzdjNCwgMHgxMzdjOCwgMHgxMzdkMCwgMHgxMzdkZSwgMHgxMzdlNiwgMHgxMzdlYywgMHgxMzgxNiwNCisgICAgMHgxMzgyNiwgMHgxMzgyYywgMHgxMzg0NiwgMHgxMzg0YywgMHgxMzg1OCwgMHgxMzg2ZSwgMHgxMzg3NCwgMHgxMzg4NiwgMHgxMzg5OCwgMHgxMzhiMCwgMHgxMzhiZSwgMHgxMzhjZSwNCisgICAgMHgxMzhkYywgMHgxMzhlMiwgMHgxMzhlNCwgMHgxMzhlOCwgMHgxMzkwNiwgMHgxMzkwYywgMHgxMzkzMCwgMHgxMzkzZSwgMHgxMzk2MCwgMHgxMzk3YywgMHgxMzk4ZSwgMHgxMzk5YywNCisgICAgMHgxMzliOCwgMHgxMzljOCwgMHgxMzlkMCwgMHgxMzlkZSwgMHgxMzllNiwgMHgxMzllYywgMHgxMzlmYSwgMHgxM2EwNiwgMHgxM2EwYywgMHgxM2ExOCwgMHgxM2EzMCwgMHgxM2EzZSwNCisgICAgMHgxM2E2MCwgMHgxM2E3YywgMHgxM2FjMCwgMHgxM2FmOCwgMHgxM2IwZSwgMHgxM2IxYywgMHgxM2IzOCwgMHgxM2I3MCwgMHgxM2I3ZSwgMHgxM2I4OCwgMHgxM2I5MCwgMHgxM2I5ZSwNCisgICAgMHgxM2JhMCwgMHgxM2JiYywgMHgxM2JjYywgMHgxM2JkOCwgMHgxM2JlZSwgMHgxM2JmMiwgMHgxM2JmNCwgMHgxM2MxMiwgMHgxM2MxNCwgMHgxM2MyMiwgMHgxM2MyNCwgMHgxM2MyOCwNCisgICAgMHgxM2MzNiwgMHgxM2M0MiwgMHgxM2M0OCwgMHgxM2M1MCwgMHgxM2M1ZSwgMHgxM2M2NiwgMHgxM2M2YywgMHgxM2M4MiwgMHgxM2M4NCwgMHgxM2M5MCwgMHgxM2M5ZSwgMHgxM2NhMCwNCisgICAgMHgxM2NiYywgMHgxM2NjNiwgMHgxM2NjYywgMHgxM2NkOCwgMHgxM2NlZSwgMHgxM2QwMiwgMHgxM2QwNCwgMHgxM2QwOCwgMHgxM2QxMCwgMHgxM2QxZSwgMHgxM2QyMCwgMHgxM2QzYywNCisgICAgMHgxM2Q0MCwgMHgxM2Q3OCwgMHgxM2Q4NiwgMHgxM2Q4YywgMHgxM2Q5OCwgMHgxM2RiMCwgMHgxM2RiZSwgMHgxM2RjZSwgMHgxM2RkYywgMHgxM2RlNCwgMHgxM2RlOCwgMHgxM2RmNiwNCisgICAgMHgxM2UxYSwgMHgxM2UyZSwgMHgxM2UzMiwgMHgxM2UzNCwgMHgxM2U0ZSwgMHgxM2U1YywgMHgxM2U2MiwgMHgxM2U2NCwgMHgxM2U2OCwgMHgxM2U3NiwgMHgxM2U4ZSwgMHgxM2U5YywNCisgICAgMHgxM2ViOCwgMHgxM2VjMiwgMHgxM2VjNCwgMHgxM2VjOCwgMHgxM2VkMCwgMHgxM2VkZSwgMHgxM2VlNiwgMHgxM2VlYywgMHgxM2YyNiwgMHgxM2YyYywgMHgxM2YzYSwgMHgxM2Y0NiwNCisgICAgMHgxM2Y0YywgMHgxM2Y1OCwgMHgxM2Y2ZSwgMHgxM2Y3MiwgMHgxM2Y3NCwgMHgxNDA4MiwgMHgxNDA5ZSwgMHgxNDBhMCwgMHgxNDBiYywgMHgxNDEwNCwgMHgxNDEwOCwgMHgxNDExMCwNCisgICAgMHgxNDExZSwgMHgxNDEyMCwgMHgxNDEzYywgMHgxNDE0MCwgMHgxNDE3OCwgMHgxNDE4YywgMHgxNDE5OCwgMHgxNDFiMCwgMHgxNDFiZSwgMHgxNDFlMiwgMHgxNDFlNCwgMHgxNDFlOCwNCisgICAgMHgxNDIwOCwgMHgxNDIxMCwgMHgxNDIxZSwgMHgxNDIyMCwgMHgxNDIzYywgMHgxNDI0MCwgMHgxNDI3OCwgMHgxNDJmMCwgMHgxNDMwNiwgMHgxNDMwYywgMHgxNDMxOCwgMHgxNDMzMCwNCisgICAgMHgxNDMzZSwgMHgxNDM2MCwgMHgxNDM3YywgMHgxNDM4ZSwgMHgxNDNjMiwgMHgxNDNjNCwgMHgxNDNjOCwgMHgxNDNkMCwgMHgxNDNlNiwgMHgxNDNlYywgMHgxNDQwOCwgMHgxNDQxMCwNCisgICAgMHgxNDQxZSwgMHgxNDQyMCwgMHgxNDQzYywgMHgxNDQ0MCwgMHgxNDQ3OCwgMHgxNDRmMCwgMHgxNDVlMCwgMHgxNDYwYywgMHgxNDYxOCwgMHgxNDYzMCwgMHgxNDYzZSwgMHgxNDY2MCwNCisgICAgMHgxNDY3YywgMHgxNDZjMCwgMHgxNDZmOCwgMHgxNDcxYywgMHgxNDczOCwgMHgxNDc3MCwgMHgxNDc3ZSwgMHgxNDc4MiwgMHgxNDc4NCwgMHgxNDc4OCwgMHgxNDc5MCwgMHgxNDdhMCwNCisgICAgMHgxNDdiYywgMHgxNDdjNiwgMHgxNDdjYywgMHgxNDdkOCwgMHgxNDdlZSwgMHgxNDgxMCwgMHgxNDgyMCwgMHgxNDgzYywgMHgxNDg0MCwgMHgxNDg3OCwgMHgxNDhmMCwgMHgxNDllMCwNCisgICAgMHgxNGJjMCwgMHgxNGMzMCwgMHgxNGMzZSwgMHgxNGM2MCwgMHgxNGM3YywgMHgxNGNjMCwgMHgxNGNmOCwgMHgxNGRmMCwgMHgxNGUzOCwgMHgxNGU3MCwgMHgxNGU3ZSwgMHgxNGVlMCwNCisgICAgMHgxNGVmYywgMHgxNGYwNCwgMHgxNGYwOCwgMHgxNGYxMCwgMHgxNGYxZSwgMHgxNGYyMCwgMHgxNGYzYywgMHgxNGY0MCwgMHgxNGY3OCwgMHgxNGY4NiwgMHgxNGY4YywgMHgxNGY5OCwNCisgICAgMHgxNGZiMCwgMHgxNGZjZSwgMHgxNGZkYywgMHgxNTAyMCwgMHgxNTA0MCwgMHgxNTA3OCwgMHgxNTBmMCwgMHgxNTFlMCwgMHgxNTNjMCwgMHgxNTg2MCwgMHgxNTg3YywgMHgxNThjMCwNCisgICAgMHgxNThmOCwgMHgxNTlmMCwgMHgxNWJlMCwgMHgxNWM3MCwgMHgxNWM3ZSwgMHgxNWNlMCwgMHgxNWNmYywgMHgxNWRjMCwgMHgxNWRmOCwgMHgxNWUwOCwgMHgxNWUxMCwgMHgxNWUyMCwNCisgICAgMHgxNWU0MCwgMHgxNWU3OCwgMHgxNWVmMCwgMHgxNWYwYywgMHgxNWYxOCwgMHgxNWYzMCwgMHgxNWY2MCwgMHgxNWY3YywgMHgxNWY4ZSwgMHgxNWY5YywgMHgxNWZiOCwgMHgxNjA0ZSwNCisgICAgMHgxNjA1YywgMHgxNjA4ZSwgMHgxNjA5YywgMHgxNjBiOCwgMHgxNjBjMiwgMHgxNjBjNCwgMHgxNjBjOCwgMHgxNjBkZSwgMHgxNjEwZSwgMHgxNjExYywgMHgxNjEzOCwgMHgxNjE3MCwNCisgICAgMHgxNjE3ZSwgMHgxNjE4NCwgMHgxNjE4OCwgMHgxNjE5MCwgMHgxNjE5ZSwgMHgxNjFhMCwgMHgxNjFiYywgMHgxNjFjNiwgMHgxNjFjYywgMHgxNjFkOCwgMHgxNjFmMiwgMHgxNjFmNCwNCisgICAgMHgxNjIwZSwgMHgxNjIxYywgMHgxNjIzOCwgMHgxNjI3MCwgMHgxNjI3ZSwgMHgxNjJlMCwgMHgxNjJmYywgMHgxNjMwNCwgMHgxNjMwOCwgMHgxNjMxMCwgMHgxNjMxZSwgMHgxNjMyMCwNCisgICAgMHgxNjMzYywgMHgxNjM0MCwgMHgxNjM3OCwgMHgxNjM4NiwgMHgxNjM4YywgMHgxNjM5OCwgMHgxNjNiMCwgMHgxNjNiZSwgMHgxNjNjZSwgMHgxNjNkYywgMHgxNjNlMiwgMHgxNjNlNCwNCisgICAgMHgxNjNlOCwgMHgxNjNmNiwgMHgxNjQwZSwgMHgxNjQxYywgMHgxNjQzOCwgMHgxNjQ3MCwgMHgxNjQ3ZSwgMHgxNjRlMCwgMHgxNjRmYywgMHgxNjVjMCwgMHgxNjVmOCwgMHgxNjYxMCwNCisgICAgMHgxNjYxZSwgMHgxNjYyMCwgMHgxNjYzYywgMHgxNjY0MCwgMHgxNjY3OCwgMHgxNjZmMCwgMHgxNjcxOCwgMHgxNjczMCwgMHgxNjczZSwgMHgxNjc2MCwgMHgxNjc3YywgMHgxNjc4ZSwNCisgICAgMHgxNjc5YywgMHgxNjdiOCwgMHgxNjdjMiwgMHgxNjdjNCwgMHgxNjdjOCwgMHgxNjdkMCwgMHgxNjdkZSwgMHgxNjdlNiwgMHgxNjdlYywgMHgxNjgxYywgMHgxNjgzOCwgMHgxNjg3MCwNCisgICAgMHgxNjhlMCwgMHgxNjhmYywgMHgxNjljMCwgMHgxNjlmOCwgMHgxNmJmMCwgMHgxNmMxMCwgMHgxNmMxZSwgMHgxNmMyMCwgMHgxNmMzYywgMHgxNmM0MCwgMHgxNmM3OCwgMHgxNmNmMCwNCisgICAgMHgxNmRlMCwgMHgxNmUxOCwgMHgxNmUzMCwgMHgxNmUzZSwgMHgxNmU2MCwgMHgxNmU3YywgMHgxNmVjMCwgMHgxNmVmOCwgMHgxNmYxYywgMHgxNmYzOCwgMHgxNmY3MCwgMHgxNmY3ZSwNCisgICAgMHgxNmY4NCwgMHgxNmY4OCwgMHgxNmY5MCwgMHgxNmY5ZSwgMHgxNmZhMCwgMHgxNmZiYywgMHgxNmZjNiwgMHgxNmZjYywgMHgxNmZkOCwgMHgxNzAyNiwgMHgxNzAyYywgMHgxNzA0NiwNCisgICAgMHgxNzA0YywgMHgxNzA1OCwgMHgxNzA2ZSwgMHgxNzA4NiwgMHgxNzA4YywgMHgxNzA5OCwgMHgxNzBiMCwgMHgxNzBiZSwgMHgxNzBjZSwgMHgxNzBkYywgMHgxNzBlOCwgMHgxNzEwNiwNCisgICAgMHgxNzEwYywgMHgxNzExOCwgMHgxNzEzMCwgMHgxNzEzZSwgMHgxNzE2MCwgMHgxNzE3YywgMHgxNzE4ZSwgMHgxNzE5YywgMHgxNzFiOCwgMHgxNzFjMiwgMHgxNzFjNCwgMHgxNzFjOCwNCisgICAgMHgxNzFkMCwgMHgxNzFkZSwgMHgxNzFlNiwgMHgxNzFlYywgMHgxNzFmYSwgMHgxNzIwNiwgMHgxNzIwYywgMHgxNzIxOCwgMHgxNzIzMCwgMHgxNzIzZSwgMHgxNzI2MCwgMHgxNzI3YywNCisgICAgMHgxNzJjMCwgMHgxNzJmOCwgMHgxNzMwZSwgMHgxNzMxYywgMHgxNzMzOCwgMHgxNzM3MCwgMHgxNzM3ZSwgMHgxNzM4OCwgMHgxNzM5MCwgMHgxNzM5ZSwgMHgxNzNhMCwgMHgxNzNiYywNCisgICAgMHgxNzNjYywgMHgxNzNkOCwgMHgxNzNlZSwgMHgxNzNmMiwgMHgxNzNmNCwgMHgxNzQwYywgMHgxNzQxOCwgMHgxNzQzMCwgMHgxNzQzZSwgMHgxNzQ2MCwgMHgxNzQ3YywgMHgxNzRjMCwNCisgICAgMHgxNzRmOCwgMHgxNzVmMCwgMHgxNzYwZSwgMHgxNzYxYywgMHgxNzYzOCwgMHgxNzY3MCwgMHgxNzY3ZSwgMHgxNzZlMCwgMHgxNzZmYywgMHgxNzcwOCwgMHgxNzcxMCwgMHgxNzcxZSwNCisgICAgMHgxNzcyMCwgMHgxNzczYywgMHgxNzc0MCwgMHgxNzc3OCwgMHgxNzc5OCwgMHgxNzdiMCwgMHgxNzdiZSwgMHgxNzdkYywgMHgxNzdlMiwgMHgxNzdlNCwgMHgxNzdlOCwgMHgxNzgyMiwNCisgICAgMHgxNzgyNCwgMHgxNzgyOCwgMHgxNzgzNiwgMHgxNzg0MiwgMHgxNzg0NCwgMHgxNzg0OCwgMHgxNzg1MCwgMHgxNzg1ZSwgMHgxNzg2NiwgMHgxNzg2YywgMHgxNzg4MiwgMHgxNzg4NCwNCisgICAgMHgxNzg4OCwgMHgxNzg5MCwgMHgxNzg5ZSwgMHgxNzhhMCwgMHgxNzhiYywgMHgxNzhjNiwgMHgxNzhjYywgMHgxNzhkOCwgMHgxNzhlZSwgMHgxNzhmMiwgMHgxNzhmNCwgMHgxNzkwMiwNCisgICAgMHgxNzkwNCwgMHgxNzkwOCwgMHgxNzkxMCwgMHgxNzkxZSwgMHgxNzkyMCwgMHgxNzkzYywgMHgxNzk0MCwgMHgxNzk3OCwgMHgxNzk4NiwgMHgxNzk4YywgMHgxNzk5OCwgMHgxNzliMCwNCisgICAgMHgxNzliZSwgMHgxNzljZSwgMHgxNzlkYywgMHgxNzllMiwgMHgxNzllNCwgMHgxNzllOCwgMHgxNzlmNiwgMHgxN2EwNCwgMHgxN2EwOCwgMHgxN2ExMCwgMHgxN2ExZSwgMHgxN2EyMCwNCisgICAgMHgxN2EzYywgMHgxN2E0MCwgMHgxN2E3OCwgMHgxN2FmMCwgMHgxN2IwNiwgMHgxN2IwYywgMHgxN2IxOCwgMHgxN2IzMCwgMHgxN2IzZSwgMHgxN2I2MCwgMHgxN2I3YywgMHgxN2I4ZSwNCisgICAgMHgxN2I5YywgMHgxN2JiOCwgMHgxN2JjNCwgMHgxN2JjOCwgMHgxN2JkMCwgMHgxN2JkZSwgMHgxN2JlNiwgMHgxN2JlYywgMHgxN2MyZSwgMHgxN2MzMiwgMHgxN2MzNCwgMHgxN2M0ZSwNCisgICAgMHgxN2M1YywgMHgxN2M2MiwgMHgxN2M2NCwgMHgxN2M2OCwgMHgxN2M3NiwgMHgxN2M4ZSwgMHgxN2M5YywgMHgxN2NiOCwgMHgxN2NjMiwgMHgxN2NjNCwgMHgxN2NjOCwgMHgxN2NkMCwNCisgICAgMHgxN2NkZSwgMHgxN2NlNiwgMHgxN2NlYywgMHgxN2QwZSwgMHgxN2QxYywgMHgxN2QzOCwgMHgxN2Q3MCwgMHgxN2Q4MiwgMHgxN2Q4NCwgMHgxN2Q4OCwgMHgxN2Q5MCwgMHgxN2Q5ZSwNCisgICAgMHgxN2RhMCwgMHgxN2RiYywgMHgxN2RjNiwgMHgxN2RjYywgMHgxN2RkOCwgMHgxN2RlZSwgMHgxN2UyNiwgMHgxN2UyYywgMHgxN2UzYSwgMHgxN2U0NiwgMHgxN2U0YywgMHgxN2U1OCwNCisgICAgMHgxN2U2ZSwgMHgxN2U3MiwgMHgxN2U3NCwgMHgxN2U4NiwgMHgxN2U4YywgMHgxN2U5OCwgMHgxN2ViMCwgMHgxN2VjZSwgMHgxN2VkYywgMHgxN2VlMiwgMHgxN2VlNCwgMHgxN2VlOCwNCisgICAgMHgxN2VmNiwgMHgxODEzYSwgMHgxODE3MiwgMHgxODE3NCwgMHgxODIxNiwgMHgxODIyNiwgMHgxODIzYSwgMHgxODI0YywgMHgxODI1OCwgMHgxODI2ZSwgMHgxODI3MiwgMHgxODI3NCwNCisgICAgMHgxODI5OCwgMHgxODJiZSwgMHgxODJlMiwgMHgxODJlNCwgMHgxODJlOCwgMHgxODJmNiwgMHgxODM1ZSwgMHgxODM3YSwgMHgxODNhZSwgMHgxODNkNiwgMHgxODQxNiwgMHgxODQyNiwNCisgICAgMHgxODQyYywgMHgxODQzYSwgMHgxODQ0NiwgMHgxODQ1OCwgMHgxODQ2ZSwgMHgxODQ3MiwgMHgxODQ3NCwgMHgxODQ4NiwgMHgxODRiMCwgMHgxODRiZSwgMHgxODRjZSwgMHgxODRkYywNCisgICAgMHgxODRlMiwgMHgxODRlNCwgMHgxODRlOCwgMHgxODRmNiwgMHgxODUwNiwgMHgxODUwYywgMHgxODUxOCwgMHgxODUzMCwgMHgxODUzZSwgMHgxODU2MCwgMHgxODU3YywgMHgxODU4ZSwNCisgICAgMHgxODU5YywgMHgxODViOCwgMHgxODVjMiwgMHgxODVjNCwgMHgxODVjOCwgMHgxODVkMCwgMHgxODVkZSwgMHgxODVlNiwgMHgxODVlYywgMHgxODVmYSwgMHgxODYxMiwgMHgxODYxNCwNCisgICAgMHgxODYyMiwgMHgxODYyOCwgMHgxODYzNiwgMHgxODY0MiwgMHgxODY1MCwgMHgxODY1ZSwgMHgxODY3YSwgMHgxODY4MiwgMHgxODY4NCwgMHgxODY4OCwgMHgxODY5MCwgMHgxODY5ZSwNCisgICAgMHgxODZhMCwgMHgxODZiYywgMHgxODZjNiwgMHgxODZjYywgMHgxODZkOCwgMHgxODZlZSwgMHgxODZmMiwgMHgxODZmNCwgMHgxODcyZSwgMHgxODc0ZSwgMHgxODc1YywgMHgxODc5NiwNCisgICAgMHgxODdhNiwgMHgxODdhYywgMHgxODdkMiwgMHgxODdkNCwgMHgxODgyNiwgMHgxODgyYywgMHgxODgzYSwgMHgxODg0NiwgMHgxODg0YywgMHgxODg1OCwgMHgxODg2ZSwgMHgxODg3MiwNCisgICAgMHgxODg3NCwgMHgxODg4NiwgMHgxODg5OCwgMHgxODhiMCwgMHgxODhiZSwgMHgxODhjZSwgMHgxODhkYywgMHgxODhlMiwgMHgxODhlNCwgMHgxODhlOCwgMHgxODhmNiwgMHgxODkwYywNCisgICAgMHgxODkzMCwgMHgxODkzZSwgMHgxODk2MCwgMHgxODk3YywgMHgxODk4ZSwgMHgxODliOCwgMHgxODljMiwgMHgxODljOCwgMHgxODlkMCwgMHgxODlkZSwgMHgxODllNiwgMHgxODllYywNCisgICAgMHgxODlmYSwgMHgxOGExOCwgMHgxOGEzMCwgMHgxOGEzZSwgMHgxOGE2MCwgMHgxOGE3YywgMHgxOGFjMCwgMHgxOGFmOCwgMHgxOGIxYywgMHgxOGIzOCwgMHgxOGI3MCwgMHgxOGI3ZSwNCisgICAgMHgxOGI4MiwgMHgxOGI4NCwgMHgxOGI4OCwgMHgxOGI5MCwgMHgxOGI5ZSwgMHgxOGJhMCwgMHgxOGJiYywgMHgxOGJjNiwgMHgxOGJjYywgMHgxOGJkOCwgMHgxOGJlZSwgMHgxOGJmMiwNCisgICAgMHgxOGJmNCwgMHgxOGMyMiwgMHgxOGMyNCwgMHgxOGMyOCwgMHgxOGMzNiwgMHgxOGM0MiwgMHgxOGM0OCwgMHgxOGM1MCwgMHgxOGM1ZSwgMHgxOGM2NiwgMHgxOGM3YSwgMHgxOGM4MiwNCisgICAgMHgxOGM4NCwgMHgxOGM5MCwgMHgxOGM5ZSwgMHgxOGNhMCwgMHgxOGNiYywgMHgxOGNjYywgMHgxOGNmMiwgMHgxOGNmNCwgMHgxOGQwNCwgMHgxOGQwOCwgMHgxOGQxMCwgMHgxOGQxZSwNCisgICAgMHgxOGQyMCwgMHgxOGQzYywgMHgxOGQ0MCwgMHgxOGQ3OCwgMHgxOGQ4NiwgMHgxOGQ5OCwgMHgxOGRjZSwgMHgxOGRlMiwgMHgxOGRlNCwgMHgxOGRlOCwgMHgxOGUyZSwgMHgxOGUzMiwNCisgICAgMHgxOGUzNCwgMHgxOGU0ZSwgMHgxOGU1YywgMHgxOGU2MiwgMHgxOGU2NCwgMHgxOGU2OCwgMHgxOGU4ZSwgMHgxOGU5YywgMHgxOGViOCwgMHgxOGVjMiwgMHgxOGVjNCwgMHgxOGVjOCwNCisgICAgMHgxOGVkMCwgMHgxOGVmYSwgMHgxOGYxNiwgMHgxOGYyNiwgMHgxOGYyYywgMHgxOGY0NiwgMHgxOGY0YywgMHgxOGY1OCwgMHgxOGY2ZSwgMHgxOGY4YSwgMHgxOGY5MiwgMHgxOGY5NCwNCisgICAgMHgxOGZhMiwgMHgxOGZhNCwgMHgxOGZhOCwgMHgxOGZiNiwgMHgxOTAyYywgMHgxOTAzYSwgMHgxOTA0NiwgMHgxOTA0YywgMHgxOTA1OCwgMHgxOTA3MiwgMHgxOTA3NCwgMHgxOTA4NiwNCisgICAgMHgxOTA5OCwgMHgxOTBiMCwgMHgxOTBiZSwgMHgxOTBjZSwgMHgxOTBkYywgMHgxOTBlMiwgMHgxOTBlOCwgMHgxOTBmNiwgMHgxOTEwNiwgMHgxOTEwYywgMHgxOTEzMCwgMHgxOTEzZSwNCisgICAgMHgxOTE2MCwgMHgxOTE3YywgMHgxOTE4ZSwgMHgxOTE5YywgMHgxOTFiOCwgMHgxOTFjMiwgMHgxOTFjOCwgMHgxOTFkMCwgMHgxOTFkZSwgMHgxOTFlNiwgMHgxOTFlYywgMHgxOTFmYSwNCisgICAgMHgxOTIxOCwgMHgxOTIzZSwgMHgxOTI2MCwgMHgxOTI3YywgMHgxOTJjMCwgMHgxOTJmOCwgMHgxOTMzOCwgMHgxOTM3MCwgMHgxOTM3ZSwgMHgxOTM4MiwgMHgxOTM4NCwgMHgxOTM5MCwNCisgICAgMHgxOTM5ZSwgMHgxOTNhMCwgMHgxOTNiYywgMHgxOTNjNiwgMHgxOTNjYywgMHgxOTNkOCwgMHgxOTNlZSwgMHgxOTNmMiwgMHgxOTNmNCwgMHgxOTQzMCwgMHgxOTQzZSwgMHgxOTQ2MCwNCisgICAgMHgxOTQ3YywgMHgxOTRjMCwgMHgxOTRmOCwgMHgxOTVmMCwgMHgxOTYzOCwgMHgxOTY3MCwgMHgxOTY3ZSwgMHgxOTZlMCwgMHgxOTZmYywgMHgxOTcwMiwgMHgxOTcwNCwgMHgxOTcwOCwNCisgICAgMHgxOTcxMCwgMHgxOTcyMCwgMHgxOTczYywgMHgxOTc0MCwgMHgxOTc3OCwgMHgxOTc4NiwgMHgxOTc4YywgMHgxOTc5OCwgMHgxOTdiMCwgMHgxOTdiZSwgMHgxOTdjZSwgMHgxOTdkYywNCisgICAgMHgxOTdlMiwgMHgxOTdlNCwgMHgxOTdlOCwgMHgxOTgyMiwgMHgxOTgyNCwgMHgxOTg0MiwgMHgxOTg0OCwgMHgxOTg1MCwgMHgxOTg1ZSwgMHgxOTg2NiwgMHgxOTg3YSwgMHgxOTg4MiwNCisgICAgMHgxOTg4NCwgMHgxOTg5MCwgMHgxOTg5ZSwgMHgxOThhMCwgMHgxOThiYywgMHgxOThjYywgMHgxOThmMiwgMHgxOThmNCwgMHgxOTkwMiwgMHgxOTkwOCwgMHgxOTkxZSwgMHgxOTkyMCwNCisgICAgMHgxOTkzYywgMHgxOTk0MCwgMHgxOTk3OCwgMHgxOTk4NiwgMHgxOTk5OCwgMHgxOTljZSwgMHgxOTllMiwgMHgxOTllNCwgMHgxOTllOCwgMHgxOWEwOCwgMHgxOWExMCwgMHgxOWExZSwNCisgICAgMHgxOWEyMCwgMHgxOWEzYywgMHgxOWE0MCwgMHgxOWE3OCwgMHgxOWFmMCwgMHgxOWIxOCwgMHgxOWIzZSwgMHgxOWI2MCwgMHgxOWI5YywgMHgxOWJjMiwgMHgxOWJjNCwgMHgxOWJjOCwNCisgICAgMHgxOWJkMCwgMHgxOWJlNiwgMHgxOWMyZSwgMHgxOWMzNCwgMHgxOWM0ZSwgMHgxOWM1YywgMHgxOWM2MiwgMHgxOWM2NCwgMHgxOWM2OCwgMHgxOWM4ZSwgMHgxOWM5YywgMHgxOWNiOCwNCisgICAgMHgxOWNjMiwgMHgxOWNjOCwgMHgxOWNkMCwgMHgxOWNlNiwgMHgxOWNmYSwgMHgxOWQwZSwgMHgxOWQxYywgMHgxOWQzOCwgMHgxOWQ3MCwgMHgxOWQ3ZSwgMHgxOWQ4MiwgMHgxOWQ4NCwNCisgICAgMHgxOWQ4OCwgMHgxOWQ5MCwgMHgxOWRhMCwgMHgxOWRjYywgMHgxOWRmMiwgMHgxOWRmNCwgMHgxOWUxNiwgMHgxOWUyNiwgMHgxOWUyYywgMHgxOWU0NiwgMHgxOWU0YywgMHgxOWU1OCwNCisgICAgMHgxOWU3NCwgMHgxOWU4NiwgMHgxOWU4YywgMHgxOWU5OCwgMHgxOWViMCwgMHgxOWViZSwgMHgxOWVjZSwgMHgxOWVlMiwgMHgxOWVlNCwgMHgxOWVlOCwgMHgxOWYwYSwgMHgxOWYxMiwNCisgICAgMHgxOWYxNCwgMHgxOWYyMiwgMHgxOWYyNCwgMHgxOWYyOCwgMHgxOWY0MiwgMHgxOWY0NCwgMHgxOWY0OCwgMHgxOWY1MCwgMHgxOWY1ZSwgMHgxOWY2YywgMHgxOWY5YSwgMHgxOWZhZSwNCisgICAgMHgxOWZiMiwgMHgxOWZiNCwgMHgxYTA0NiwgMHgxYTA0YywgMHgxYTA3MiwgMHgxYTA3NCwgMHgxYTA4NiwgMHgxYTA4YywgMHgxYTA5OCwgMHgxYTBiMCwgMHgxYTBiZSwgMHgxYTBlMiwNCisgICAgMHgxYTBlNCwgMHgxYTBlOCwgMHgxYTBmNiwgMHgxYTEwNiwgMHgxYTEwYywgMHgxYTExOCwgMHgxYTEzMCwgMHgxYTEzZSwgMHgxYTE2MCwgMHgxYTE3YywgMHgxYTE4ZSwgMHgxYTE5YywNCisgICAgMHgxYTFiOCwgMHgxYTFjMiwgMHgxYTFjNCwgMHgxYTFjOCwgMHgxYTFkMCwgMHgxYTFkZSwgMHgxYTFlNiwgMHgxYTFlYywgMHgxYTIxOCwgMHgxYTIzMCwgMHgxYTIzZSwgMHgxYTI2MCwNCisgICAgMHgxYTI3YywgMHgxYTJjMCwgMHgxYTJmOCwgMHgxYTMxYywgMHgxYTMzOCwgMHgxYTM3MCwgMHgxYTM3ZSwgMHgxYTM4MiwgMHgxYTM4NCwgMHgxYTM4OCwgMHgxYTM5MCwgMHgxYTM5ZSwNCisgICAgMHgxYTNhMCwgMHgxYTNiYywgMHgxYTNjNiwgMHgxYTNjYywgMHgxYTNkOCwgMHgxYTNlZSwgMHgxYTNmMiwgMHgxYTNmNCwgMHgxYTQxOCwgMHgxYTQzMCwgMHgxYTQzZSwgMHgxYTQ2MCwNCisgICAgMHgxYTQ3YywgMHgxYTRjMCwgMHgxYTRmOCwgMHgxYTVmMCwgMHgxYTYxYywgMHgxYTYzOCwgMHgxYTY3MCwgMHgxYTY3ZSwgMHgxYTZlMCwgMHgxYTZmYywgMHgxYTcwMiwgMHgxYTcwNCwNCisgICAgMHgxYTcwOCwgMHgxYTcxMCwgMHgxYTcxZSwgMHgxYTcyMCwgMHgxYTczYywgMHgxYTc0MCwgMHgxYTc3OCwgMHgxYTc4NiwgMHgxYTc4YywgMHgxYTc5OCwgMHgxYTdiMCwgMHgxYTdiZSwNCisgICAgMHgxYTdjZSwgMHgxYTdkYywgMHgxYTdlMiwgMHgxYTdlNCwgMHgxYTdlOCwgMHgxYTgzMCwgMHgxYTg2MCwgMHgxYTg3YywgMHgxYThjMCwgMHgxYThmOCwgMHgxYTlmMCwgMHgxYWJlMCwNCisgICAgMHgxYWM3MCwgMHgxYWM3ZSwgMHgxYWNlMCwgMHgxYWNmYywgMHgxYWRjMCwgMHgxYWRmOCwgMHgxYWUwNCwgMHgxYWUwOCwgMHgxYWUxMCwgMHgxYWUyMCwgMHgxYWUzYywgMHgxYWU0MCwNCisgICAgMHgxYWU3OCwgMHgxYWVmMCwgMHgxYWYwNiwgMHgxYWYwYywgMHgxYWYxOCwgMHgxYWYzMCwgMHgxYWYzZSwgMHgxYWY2MCwgMHgxYWY3YywgMHgxYWY4ZSwgMHgxYWY5YywgMHgxYWZiOCwNCisgICAgMHgxYWZjNCwgMHgxYWZjOCwgMHgxYWZkMCwgMHgxYWZkZSwgMHgxYjA0MiwgMHgxYjA1ZSwgMHgxYjA3YSwgMHgxYjA4MiwgMHgxYjA4NCwgMHgxYjA4OCwgMHgxYjA5MCwgMHgxYjA5ZSwNCisgICAgMHgxYjBhMCwgMHgxYjBiYywgMHgxYjBjYywgMHgxYjBmMiwgMHgxYjBmNCwgMHgxYjEwMiwgMHgxYjEwNCwgMHgxYjEwOCwgMHgxYjExMCwgMHgxYjExZSwgMHgxYjEyMCwgMHgxYjEzYywNCisgICAgMHgxYjE0MCwgMHgxYjE3OCwgMHgxYjE4NiwgMHgxYjE5OCwgMHgxYjFjZSwgMHgxYjFlMiwgMHgxYjFlNCwgMHgxYjFlOCwgMHgxYjIwNCwgMHgxYjIwOCwgMHgxYjIxMCwgMHgxYjIxZSwNCisgICAgMHgxYjIyMCwgMHgxYjIzYywgMHgxYjI0MCwgMHgxYjI3OCwgMHgxYjJmMCwgMHgxYjMwYywgMHgxYjMzZSwgMHgxYjM2MCwgMHgxYjM5YywgMHgxYjNjMiwgMHgxYjNjNCwgMHgxYjNjOCwNCisgICAgMHgxYjNkMCwgMHgxYjNlNiwgMHgxYjQxMCwgMHgxYjQxZSwgMHgxYjQyMCwgMHgxYjQzYywgMHgxYjQ0MCwgMHgxYjQ3OCwgMHgxYjRmMCwgMHgxYjVlMCwgMHgxYjYxOCwgMHgxYjY2MCwNCisgICAgMHgxYjY3YywgMHgxYjZjMCwgMHgxYjczOCwgMHgxYjc4MiwgMHgxYjc4NCwgMHgxYjc4OCwgMHgxYjc5MCwgMHgxYjc5ZSwgMHgxYjdhMCwgMHgxYjdjYywgMHgxYjgyZSwgMHgxYjg0ZSwNCisgICAgMHgxYjg1YywgMHgxYjg4ZSwgMHgxYjg5YywgMHgxYjhiOCwgMHgxYjhjMiwgMHgxYjhjNCwgMHgxYjhjOCwgMHgxYjhkMCwgMHgxYjhlNiwgMHgxYjhmYSwgMHgxYjkwZSwgMHgxYjkxYywNCisgICAgMHgxYjkzOCwgMHgxYjk3MCwgMHgxYjk3ZSwgMHgxYjk4MiwgMHgxYjk4NCwgMHgxYjk4OCwgMHgxYjk5MCwgMHgxYjk5ZSwgMHgxYjlhMCwgMHgxYjljYywgMHgxYjlmMiwgMHgxYjlmNCwNCisgICAgMHgxYmEwZSwgMHgxYmExYywgMHgxYmEzOCwgMHgxYmE3MCwgMHgxYmE3ZSwgMHgxYmFlMCwgMHgxYmFmYywgMHgxYmIwOCwgMHgxYmIxMCwgMHgxYmIyMCwgMHgxYmIzYywgMHgxYmI0MCwNCisgICAgMHgxYmI5OCwgMHgxYmJjZSwgMHgxYmJlMiwgMHgxYmJlNCwgMHgxYmJlOCwgMHgxYmMxNiwgMHgxYmMyNiwgMHgxYmMyYywgMHgxYmM0NiwgMHgxYmM0YywgMHgxYmM1OCwgMHgxYmM3MiwNCisgICAgMHgxYmM3NCwgMHgxYmM4NiwgMHgxYmM4YywgMHgxYmM5OCwgMHgxYmNiMCwgMHgxYmNiZSwgMHgxYmNjZSwgMHgxYmNlMiwgMHgxYmNlNCwgMHgxYmNlOCwgMHgxYmQwNiwgMHgxYmQwYywNCisgICAgMHgxYmQxOCwgMHgxYmQzMCwgMHgxYmQzZSwgMHgxYmQ2MCwgMHgxYmQ3YywgMHgxYmQ5YywgMHgxYmRjMiwgMHgxYmRjNCwgMHgxYmRjOCwgMHgxYmRkMCwgMHgxYmRlNiwgMHgxYmRmYSwNCisgICAgMHgxYmUxMiwgMHgxYmUxNCwgMHgxYmUyMiwgMHgxYmUyNCwgMHgxYmUyOCwgMHgxYmU0MiwgMHgxYmU0NCwgMHgxYmU0OCwgMHgxYmU1MCwgMHgxYmU1ZSwgMHgxYmU2NiwgMHgxYmU4MiwNCisgICAgMHgxYmU4NCwgMHgxYmU4OCwgMHgxYmU5MCwgMHgxYmU5ZSwgMHgxYmVhMCwgMHgxYmViYywgMHgxYmVjYywgMHgxYmVmNCwgMHgxYmYxYSwgMHgxYmYyZSwgMHgxYmYzMiwgMHgxYmYzNCwNCisgICAgMHgxYmY0ZSwgMHgxYmY1YywgMHgxYmY2MiwgMHgxYmY2NCwgMHgxYmY2OCwgMHgxYzA5YSwgMHgxYzBiMiwgMHgxYzBiNCwgMHgxYzExYSwgMHgxYzEzMiwgMHgxYzEzNCwgMHgxYzE2MiwNCisgICAgMHgxYzE2NCwgMHgxYzE2OCwgMHgxYzE3NiwgMHgxYzFiYSwgMHgxYzIxYSwgMHgxYzIzMiwgMHgxYzIzNCwgMHgxYzI0ZSwgMHgxYzI1YywgMHgxYzI2MiwgMHgxYzI2NCwgMHgxYzI2OCwNCisgICAgMHgxYzI3NiwgMHgxYzI4ZSwgMHgxYzJjMiwgMHgxYzJjNCwgMHgxYzJjOCwgMHgxYzJkMCwgMHgxYzJkZSwgMHgxYzJlNiwgMHgxYzJlYywgMHgxYzJmYSwgMHgxYzMxNiwgMHgxYzMyNiwNCisgICAgMHgxYzMzYSwgMHgxYzM0NiwgMHgxYzM0YywgMHgxYzM3MiwgMHgxYzM3NCwgMHgxYzQxYSwgMHgxYzQyZSwgMHgxYzQzMiwgMHgxYzQzNCwgMHgxYzQ0ZSwgMHgxYzQ1YywgMHgxYzQ2MiwNCisgICAgMHgxYzQ2NCwgMHgxYzQ2OCwgMHgxYzQ3NiwgMHgxYzQ4ZSwgMHgxYzQ5YywgMHgxYzRiOCwgMHgxYzRjMiwgMHgxYzRjOCwgMHgxYzRkMCwgMHgxYzRkZSwgMHgxYzRlNiwgMHgxYzRlYywNCisgICAgMHgxYzRmYSwgMHgxYzUxYywgMHgxYzUzOCwgMHgxYzU3MCwgMHgxYzU3ZSwgMHgxYzU4MiwgMHgxYzU4NCwgMHgxYzU4OCwgMHgxYzU5MCwgMHgxYzU5ZSwgMHgxYzVhMCwgMHgxYzViYywNCisgICAgMHgxYzVjNiwgMHgxYzVjYywgMHgxYzVkOCwgMHgxYzVlZSwgMHgxYzVmMiwgMHgxYzVmNCwgMHgxYzYxNiwgMHgxYzYyNiwgMHgxYzYyYywgMHgxYzYzYSwgMHgxYzY0NiwgMHgxYzY0YywNCisgICAgMHgxYzY1OCwgMHgxYzY2ZSwgMHgxYzY3MiwgMHgxYzY3NCwgMHgxYzY4NiwgMHgxYzY4YywgMHgxYzY5OCwgMHgxYzZiMCwgMHgxYzZiZSwgMHgxYzZjZSwgMHgxYzZkYywgMHgxYzZlMiwNCisgICAgMHgxYzZlNCwgMHgxYzZlOCwgMHgxYzcxMiwgMHgxYzcxNCwgMHgxYzcyMiwgMHgxYzcyOCwgMHgxYzczNiwgMHgxYzc0MiwgMHgxYzc0NCwgMHgxYzc0OCwgMHgxYzc1MCwgMHgxYzc1ZSwNCisgICAgMHgxYzc2NiwgMHgxYzc2YywgMHgxYzc3YSwgMHgxYzdhZSwgMHgxYzdkNiwgMHgxYzdlYSwgMHgxYzgxYSwgMHgxYzgyZSwgMHgxYzgzMiwgMHgxYzgzNCwgMHgxYzg0ZSwgMHgxYzg1YywNCisgICAgMHgxYzg2MiwgMHgxYzg2NCwgMHgxYzg2OCwgMHgxYzg3NiwgMHgxYzg4ZSwgMHgxYzg5YywgMHgxYzhiOCwgMHgxYzhjMiwgMHgxYzhjOCwgMHgxYzhkMCwgMHgxYzhkZSwgMHgxYzhlNiwNCisgICAgMHgxYzhlYywgMHgxYzhmYSwgMHgxYzkwZSwgMHgxYzkzOCwgMHgxYzk3MCwgMHgxYzk3ZSwgMHgxYzk4MiwgMHgxYzk4NCwgMHgxYzk5MCwgMHgxYzk5ZSwgMHgxYzlhMCwgMHgxYzliYywNCisgICAgMHgxYzljNiwgMHgxYzljYywgMHgxYzlkOCwgMHgxYzllZSwgMHgxYzlmMiwgMHgxYzlmNCwgMHgxY2EzOCwgMHgxY2E3MCwgMHgxY2E3ZSwgMHgxY2FlMCwgMHgxY2FmYywgMHgxY2IwMiwNCisgICAgMHgxY2IwNCwgMHgxY2IwOCwgMHgxY2IxMCwgMHgxY2IyMCwgMHgxY2IzYywgMHgxY2I0MCwgMHgxY2I3OCwgMHgxY2I4NiwgMHgxY2I4YywgMHgxY2I5OCwgMHgxY2JiMCwgMHgxY2JiZSwNCisgICAgMHgxY2JjZSwgMHgxY2JkYywgMHgxY2JlMiwgMHgxY2JlNCwgMHgxY2JlOCwgMHgxY2JmNiwgMHgxY2MxNiwgMHgxY2MyNiwgMHgxY2MyYywgMHgxY2MzYSwgMHgxY2M0NiwgMHgxY2M1OCwNCisgICAgMHgxY2M3MiwgMHgxY2M3NCwgMHgxY2M4NiwgMHgxY2NiMCwgMHgxY2NiZSwgMHgxY2NjZSwgMHgxY2NlMiwgMHgxY2NlNCwgMHgxY2NlOCwgMHgxY2QwNiwgMHgxY2QwYywgMHgxY2QxOCwNCisgICAgMHgxY2QzMCwgMHgxY2QzZSwgMHgxY2Q2MCwgMHgxY2Q3YywgMHgxY2Q5YywgMHgxY2RjMiwgMHgxY2RjNCwgMHgxY2RjOCwgMHgxY2RkMCwgMHgxY2RkZSwgMHgxY2RlNiwgMHgxY2RmYSwNCisgICAgMHgxY2UyMiwgMHgxY2UyOCwgMHgxY2U0MiwgMHgxY2U1MCwgMHgxY2U1ZSwgMHgxY2U2NiwgMHgxY2U3YSwgMHgxY2U4MiwgMHgxY2U4NCwgMHgxY2U4OCwgMHgxY2U5MCwgMHgxY2U5ZSwNCisgICAgMHgxY2VhMCwgMHgxY2ViYywgMHgxY2VjYywgMHgxY2VmMiwgMHgxY2VmNCwgMHgxY2YyZSwgMHgxY2YzMiwgMHgxY2YzNCwgMHgxY2Y0ZSwgMHgxY2Y1YywgMHgxY2Y2MiwgMHgxY2Y2NCwNCisgICAgMHgxY2Y2OCwgMHgxY2Y5NiwgMHgxY2ZhNiwgMHgxY2ZhYywgMHgxY2ZjYSwgMHgxY2ZkMiwgMHgxY2ZkNCwgMHgxZDAyZSwgMHgxZDAzMiwgMHgxZDAzNCwgMHgxZDA0ZSwgMHgxZDA1YywNCisgICAgMHgxZDA2MiwgMHgxZDA2NCwgMHgxZDA2OCwgMHgxZDA3NiwgMHgxZDA4ZSwgMHgxZDA5YywgMHgxZDBiOCwgMHgxZDBjMiwgMHgxZDBjNCwgMHgxZDBjOCwgMHgxZDBkMCwgMHgxZDBkZSwNCisgICAgMHgxZDBlNiwgMHgxZDBlYywgMHgxZDBmYSwgMHgxZDExYywgMHgxZDEzOCwgMHgxZDE3MCwgMHgxZDE3ZSwgMHgxZDE4MiwgMHgxZDE4NCwgMHgxZDE4OCwgMHgxZDE5MCwgMHgxZDE5ZSwNCisgICAgMHgxZDFhMCwgMHgxZDFiYywgMHgxZDFjNiwgMHgxZDFjYywgMHgxZDFkOCwgMHgxZDFlZSwgMHgxZDFmMiwgMHgxZDFmNCwgMHgxZDIxYywgMHgxZDIzOCwgMHgxZDI3MCwgMHgxZDI3ZSwNCisgICAgMHgxZDJlMCwgMHgxZDJmYywgMHgxZDMwMiwgMHgxZDMwNCwgMHgxZDMwOCwgMHgxZDMxMCwgMHgxZDMxZSwgMHgxZDMyMCwgMHgxZDMzYywgMHgxZDM0MCwgMHgxZDM3OCwgMHgxZDM4NiwNCisgICAgMHgxZDM4YywgMHgxZDM5OCwgMHgxZDNiMCwgMHgxZDNiZSwgMHgxZDNjZSwgMHgxZDNkYywgMHgxZDNlMiwgMHgxZDNlNCwgMHgxZDNlOCwgMHgxZDNmNiwgMHgxZDQ3MCwgMHgxZDQ3ZSwNCisgICAgMHgxZDRlMCwgMHgxZDRmYywgMHgxZDVjMCwgMHgxZDVmOCwgMHgxZDYwNCwgMHgxZDYwOCwgMHgxZDYxMCwgMHgxZDYyMCwgMHgxZDY0MCwgMHgxZDY3OCwgMHgxZDZmMCwgMHgxZDcwNiwNCisgICAgMHgxZDcwYywgMHgxZDcxOCwgMHgxZDczMCwgMHgxZDczZSwgMHgxZDc2MCwgMHgxZDc3YywgMHgxZDc4ZSwgMHgxZDc5YywgMHgxZDdiOCwgMHgxZDdjMiwgMHgxZDdjNCwgMHgxZDdjOCwNCisgICAgMHgxZDdkMCwgMHgxZDdkZSwgMHgxZDdlNiwgMHgxZDdlYywgMHgxZDgyNiwgMHgxZDgyYywgMHgxZDgzYSwgMHgxZDg0NiwgMHgxZDg0YywgMHgxZDg1OCwgMHgxZDg3MiwgMHgxZDg3NCwNCisgICAgMHgxZDg4NiwgMHgxZDg4YywgMHgxZDg5OCwgMHgxZDhiMCwgMHgxZDhiZSwgMHgxZDhjZSwgMHgxZDhlMiwgMHgxZDhlNCwgMHgxZDhlOCwgMHgxZDhmNiwgMHgxZDkwYywgMHgxZDkxOCwNCisgICAgMHgxZDkzMCwgMHgxZDkzZSwgMHgxZDk2MCwgMHgxZDk3YywgMHgxZDk5YywgMHgxZDljMiwgMHgxZDljNCwgMHgxZDljOCwgMHgxZDlkMCwgMHgxZDllNiwgMHgxZDlmYSwgMHgxZGEwYywNCisgICAgMHgxZGExOCwgMHgxZGEzMCwgMHgxZGEzZSwgMHgxZGE2MCwgMHgxZGE3YywgMHgxZGFjMCwgMHgxZGFmOCwgMHgxZGIzOCwgMHgxZGI4MiwgMHgxZGI4NCwgMHgxZGI4OCwgMHgxZGI5MCwNCisgICAgMHgxZGI5ZSwgMHgxZGJhMCwgMHgxZGJjYywgMHgxZGJmMiwgMHgxZGJmNCwgMHgxZGMyMiwgMHgxZGM0MiwgMHgxZGM0NCwgMHgxZGM0OCwgMHgxZGM1MCwgMHgxZGM1ZSwgMHgxZGM2NiwNCisgICAgMHgxZGM3YSwgMHgxZGM4MiwgMHgxZGM4NCwgMHgxZGM4OCwgMHgxZGM5MCwgMHgxZGM5ZSwgMHgxZGNhMCwgMHgxZGNiYywgMHgxZGNjYywgMHgxZGNmMiwgMHgxZGNmNCwgMHgxZGQwNCwNCisgICAgMHgxZGQwOCwgMHgxZGQxMCwgMHgxZGQxZSwgMHgxZGQyMCwgMHgxZGQzYywgMHgxZGQ0MCwgMHgxZGQ3OCwgMHgxZGQ4NiwgMHgxZGQ5OCwgMHgxZGRjZSwgMHgxZGRlMiwgMHgxZGRlNCwNCisgICAgMHgxZGRlOCwgMHgxZGUyZSwgMHgxZGUzMiwgMHgxZGUzNCwgMHgxZGU0ZSwgMHgxZGU1YywgMHgxZGU2MiwgMHgxZGU2NCwgMHgxZGU2OCwgMHgxZGU4ZSwgMHgxZGU5YywgMHgxZGViOCwNCisgICAgMHgxZGVjMiwgMHgxZGVjNCwgMHgxZGVjOCwgMHgxZGVkMCwgMHgxZGVlNiwgMHgxZGVmYSwgMHgxZGYxNiwgMHgxZGYyNiwgMHgxZGYyYywgMHgxZGY0NiwgMHgxZGY0YywgMHgxZGY1OCwNCisgICAgMHgxZGY3MiwgMHgxZGY3NCwgMHgxZGY4YSwgMHgxZGY5MiwgMHgxZGY5NCwgMHgxZGZhMiwgMHgxZGZhNCwgMHgxZGZhOCwgMHgxZTA4YSwgMHgxZTA5MiwgMHgxZTA5NCwgMHgxZTBhMiwNCisgICAgMHgxZTBhNCwgMHgxZTBhOCwgMHgxZTBiNiwgMHgxZTBkYSwgMHgxZTEwYSwgMHgxZTExMiwgMHgxZTExNCwgMHgxZTEyMiwgMHgxZTEyNCwgMHgxZTEyOCwgMHgxZTEzNiwgMHgxZTE0MiwNCisgICAgMHgxZTE0NCwgMHgxZTE0OCwgMHgxZTE1MCwgMHgxZTE2NiwgMHgxZTE2YywgMHgxZTE3YSwgMHgxZTE5YSwgMHgxZTFiMiwgMHgxZTFiNCwgMHgxZTIwYSwgMHgxZTIxMiwgMHgxZTIxNCwNCisgICAgMHgxZTIyMiwgMHgxZTIyNCwgMHgxZTIyOCwgMHgxZTIzNiwgMHgxZTI0MiwgMHgxZTI0OCwgMHgxZTI1MCwgMHgxZTI1ZSwgMHgxZTI2NiwgMHgxZTI2YywgMHgxZTI3YSwgMHgxZTI4MiwNCisgICAgMHgxZTI4NCwgMHgxZTI4OCwgMHgxZTI5MCwgMHgxZTJhMCwgMHgxZTJiYywgMHgxZTJjNiwgMHgxZTJjYywgMHgxZTJkOCwgMHgxZTJlZSwgMHgxZTJmMiwgMHgxZTJmNCwgMHgxZTMxYSwNCisgICAgMHgxZTMzMiwgMHgxZTMzNCwgMHgxZTM1YywgMHgxZTM2MiwgMHgxZTM2NCwgMHgxZTM2OCwgMHgxZTNiYSwgMHgxZTQwYSwgMHgxZTQxMiwgMHgxZTQxNCwgMHgxZTQyMiwgMHgxZTQyOCwNCisgICAgMHgxZTQzNiwgMHgxZTQ0MiwgMHgxZTQ0OCwgMHgxZTQ1MCwgMHgxZTQ1ZSwgMHgxZTQ2NiwgMHgxZTQ2YywgMHgxZTQ3YSwgMHgxZTQ4MiwgMHgxZTQ4NCwgMHgxZTQ5MCwgMHgxZTQ5ZSwNCisgICAgMHgxZTRhMCwgMHgxZTRiYywgMHgxZTRjNiwgMHgxZTRjYywgMHgxZTRkOCwgMHgxZTRlZSwgMHgxZTRmMiwgMHgxZTRmNCwgMHgxZTUwMiwgMHgxZTUwNCwgMHgxZTUwOCwgMHgxZTUxMCwNCisgICAgMHgxZTUxZSwgMHgxZTUyMCwgMHgxZTUzYywgMHgxZTU0MCwgMHgxZTU3OCwgMHgxZTU4NiwgMHgxZTU4YywgMHgxZTU5OCwgMHgxZTViMCwgMHgxZTViZSwgMHgxZTVjZSwgMHgxZTVkYywNCisgICAgMHgxZTVlMiwgMHgxZTVlNCwgMHgxZTVlOCwgMHgxZTVmNiwgMHgxZTYxYSwgMHgxZTYyZSwgMHgxZTYzMiwgMHgxZTYzNCwgMHgxZTY0ZSwgMHgxZTY1YywgMHgxZTY2MiwgMHgxZTY2OCwNCisgICAgMHgxZTY4ZSwgMHgxZTY5YywgMHgxZTZiOCwgMHgxZTZjMiwgMHgxZTZjNCwgMHgxZTZjOCwgMHgxZTZkMCwgMHgxZTZlNiwgMHgxZTZmYSwgMHgxZTcxNiwgMHgxZTcyNiwgMHgxZTcyYywNCisgICAgMHgxZTczYSwgMHgxZTc0NiwgMHgxZTc0YywgMHgxZTc1OCwgMHgxZTc3MiwgMHgxZTc3NCwgMHgxZTc5MiwgMHgxZTc5NCwgMHgxZTdhMiwgMHgxZTdhNCwgMHgxZTdhOCwgMHgxZTdiNiwNCisgICAgMHgxZTgxMiwgMHgxZTgxNCwgMHgxZTgyMiwgMHgxZTgyNCwgMHgxZTgyOCwgMHgxZTgzNiwgMHgxZTg0MiwgMHgxZTg0NCwgMHgxZTg0OCwgMHgxZTg1MCwgMHgxZTg1ZSwgMHgxZTg2NiwNCisgICAgMHgxZTg2YywgMHgxZTg3YSwgMHgxZTg4MiwgMHgxZTg4NCwgMHgxZTg4OCwgMHgxZTg5MCwgMHgxZTg5ZSwgMHgxZThhMCwgMHgxZThiYywgMHgxZThjNiwgMHgxZThjYywgMHgxZThkOCwNCisgICAgMHgxZThlZSwgMHgxZThmMiwgMHgxZThmNCwgMHgxZTkwMiwgMHgxZTkwNCwgMHgxZTkwOCwgMHgxZTkxMCwgMHgxZTkyMCwgMHgxZTkzYywgMHgxZTk0MCwgMHgxZTk3OCwgMHgxZTk4NiwNCisgICAgMHgxZTk4YywgMHgxZTk5OCwgMHgxZTliMCwgMHgxZTliZSwgMHgxZTljZSwgMHgxZTlkYywgMHgxZTllMiwgMHgxZTllNCwgMHgxZTllOCwgMHgxZTlmNiwgMHgxZWEwNCwgMHgxZWEwOCwNCisgICAgMHgxZWExMCwgMHgxZWEyMCwgMHgxZWE0MCwgMHgxZWE3OCwgMHgxZWFmMCwgMHgxZWIwNiwgMHgxZWIwYywgMHgxZWIxOCwgMHgxZWIzMCwgMHgxZWIzZSwgMHgxZWI2MCwgMHgxZWI3YywNCisgICAgMHgxZWI4ZSwgMHgxZWI5YywgMHgxZWJiOCwgMHgxZWJjMiwgMHgxZWJjNCwgMHgxZWJjOCwgMHgxZWJkMCwgMHgxZWJkZSwgMHgxZWJlNiwgMHgxZWJlYywgMHgxZWMxYSwgMHgxZWMyZSwNCisgICAgMHgxZWMzMiwgMHgxZWMzNCwgMHgxZWM0ZSwgMHgxZWM1YywgMHgxZWM2MiwgMHgxZWM2NCwgMHgxZWM2OCwgMHgxZWM4ZSwgMHgxZWM5YywgMHgxZWNiOCwgMHgxZWNjMiwgMHgxZWNjNCwNCisgICAgMHgxZWNjOCwgMHgxZWNkMCwgMHgxZWNlNiwgMHgxZWNmYSwgMHgxZWQwZSwgMHgxZWQxYywgMHgxZWQzOCwgMHgxZWQ3MCwgMHgxZWQ3ZSwgMHgxZWQ4MiwgMHgxZWQ4NCwgMHgxZWQ4OCwNCisgICAgMHgxZWQ5MCwgMHgxZWQ5ZSwgMHgxZWRhMCwgMHgxZWRjYywgMHgxZWRmMiwgMHgxZWRmNCwgMHgxZWUxNiwgMHgxZWUyNiwgMHgxZWUyYywgMHgxZWUzYSwgMHgxZWU0NiwgMHgxZWU0YywNCisgICAgMHgxZWU1OCwgMHgxZWU2ZSwgMHgxZWU3MiwgMHgxZWU3NCwgMHgxZWU4NiwgMHgxZWU4YywgMHgxZWU5OCwgMHgxZWViMCwgMHgxZWViZSwgMHgxZWVjZSwgMHgxZWVkYywgMHgxZWVlMiwNCisgICAgMHgxZWVlNCwgMHgxZWVlOCwgMHgxZWYxMiwgMHgxZWYyMiwgMHgxZWYyNCwgMHgxZWYyOCwgMHgxZWYzNiwgMHgxZWY0MiwgMHgxZWY0NCwgMHgxZWY0OCwgMHgxZWY1MCwgMHgxZWY1ZSwNCisgICAgMHgxZWY2NiwgMHgxZWY2YywgMHgxZWY3YSwgMHgxZWZhZSwgMHgxZWZiMiwgMHgxZWZiNCwgMHgxZWZkNiwgMHgxZjA5NiwgMHgxZjBhNiwgMHgxZjBhYywgMHgxZjBiYSwgMHgxZjBjYSwNCisgICAgMHgxZjBkMiwgMHgxZjBkNCwgMHgxZjExNiwgMHgxZjEyNiwgMHgxZjEyYywgMHgxZjEzYSwgMHgxZjE0NiwgMHgxZjE0YywgMHgxZjE1OCwgMHgxZjE2ZSwgMHgxZjE3MiwgMHgxZjE3NCwNCisgICAgMHgxZjE4YSwgMHgxZjE5MiwgMHgxZjE5NCwgMHgxZjFhMiwgMHgxZjFhNCwgMHgxZjFhOCwgMHgxZjFkYSwgMHgxZjIxNiwgMHgxZjIyNiwgMHgxZjIyYywgMHgxZjIzYSwgMHgxZjI0NiwNCisgICAgMHgxZjI1OCwgMHgxZjI2ZSwgMHgxZjI3MiwgMHgxZjI3NCwgMHgxZjI4NiwgMHgxZjI4YywgMHgxZjI5OCwgMHgxZjJiMCwgMHgxZjJiZSwgMHgxZjJjZSwgMHgxZjJkYywgMHgxZjJlMiwNCisgICAgMHgxZjJlNCwgMHgxZjJlOCwgMHgxZjJmNiwgMHgxZjMwYSwgMHgxZjMxMiwgMHgxZjMxNCwgMHgxZjMyMiwgMHgxZjMyOCwgMHgxZjM0MiwgMHgxZjM0NCwgMHgxZjM0OCwgMHgxZjM1MCwNCisgICAgMHgxZjM1ZSwgMHgxZjM2NiwgMHgxZjM3YSwgMHgxZjM5YSwgMHgxZjNhZSwgMHgxZjNiMiwgMHgxZjNiNCwgMHgxZjQxNiwgMHgxZjQyNiwgMHgxZjQyYywgMHgxZjQzYSwgMHgxZjQ0NiwNCisgICAgMHgxZjQ0YywgMHgxZjQ1OCwgMHgxZjQ2ZSwgMHgxZjQ3MiwgMHgxZjQ3NCwgMHgxZjQ4NiwgMHgxZjQ4YywgMHgxZjQ5OCwgMHgxZjRiMCwgMHgxZjRiZSwgMHgxZjRjZSwgMHgxZjRkYywNCisgICAgMHgxZjRlMiwgMHgxZjRlNCwgMHgxZjRlOCwgMHgxZjRmNiwgMHgxZjUwNiwgMHgxZjUwYywgMHgxZjUxOCwgMHgxZjUzMCwgMHgxZjUzZSwgMHgxZjU2MCwgMHgxZjU3YywgMHgxZjU4ZSwNCisgICAgMHgxZjU5YywgMHgxZjViOCwgMHgxZjVjMiwgMHgxZjVjNCwgMHgxZjVjOCwgMHgxZjVkMCwgMHgxZjVkZSwgMHgxZjVlNiwgMHgxZjVlYywgMHgxZjVmYSwgMHgxZjYwYSwgMHgxZjYxMiwNCisgICAgMHgxZjYxNCwgMHgxZjYyMiwgMHgxZjYyNCwgMHgxZjYyOCwgMHgxZjYzNiwgMHgxZjY0MiwgMHgxZjY0NCwgMHgxZjY0OCwgMHgxZjY1MCwgMHgxZjY1ZSwgMHgxZjY2NiwgMHgxZjY3YSwNCisgICAgMHgxZjY4MiwgMHgxZjY4NCwgMHgxZjY4OCwgMHgxZjY5MCwgMHgxZjY5ZSwgMHgxZjZhMCwgMHgxZjZiYywgMHgxZjZjYywgMHgxZjZmMiwgMHgxZjZmNCwgMHgxZjcxYSwgMHgxZjcyZSwNCisgICAgMHgxZjczMiwgMHgxZjczNCwgMHgxZjc0ZSwgMHgxZjc1YywgMHgxZjc2MiwgMHgxZjc2NCwgMHgxZjc2OCwgMHgxZjc3NiwgMHgxZjc5NiwgMHgxZjdhNiwgMHgxZjdhYywgMHgxZjdiYSwNCisgICAgMHgxZjdkMiwgMHgxZjdkNCwgMHgxZjg5YSwgMHgxZjhhZSwgMHgxZjhiMiwgMHgxZjhiNCwgMHgxZjhkNiwgMHgxZjhlYSwgMHgxZjkxYSwgMHgxZjkyZSwgMHgxZjkzMiwgMHgxZjkzNCwNCisgICAgMHgxZjk0ZSwgMHgxZjk1YywgMHgxZjk2MiwgMHgxZjk2NCwgMHgxZjk2OCwgMHgxZjk3NiwgMHgxZjk5NiwgMHgxZjlhNiwgMHgxZjlhYywgMHgxZjliYSwgMHgxZjljYSwgMHgxZjlkMiwNCisgICAgMHgxZjlkNCwgMHgxZmExYSwgMHgxZmEyZSwgMHgxZmEzMiwgMHgxZmEzNCwgMHgxZmE0ZSwgMHgxZmE1YywgMHgxZmE2MiwgMHgxZmE2NCwgMHgxZmE2OCwgMHgxZmE3NiwgMHgxZmE4ZSwNCisgICAgMHgxZmE5YywgMHgxZmFiOCwgMHgxZmFjMiwgMHgxZmFjNCwgMHgxZmFjOCwgMHgxZmFkMCwgMHgxZmFkZSwgMHgxZmFlNiwgMHgxZmFlYywgMHgxZmIxNiwgMHgxZmIyNiwgMHgxZmIyYywNCisgICAgMHgxZmIzYSwgMHgxZmI0NiwgMHgxZmI0YywgMHgxZmI1OCwgMHgxZmI2ZSwgMHgxZmI3MiwgMHgxZmI3NCwgMHgxZmI4YSwgMHgxZmI5MiwgMHgxZmI5NCwgMHgxZmJhMiwgMHgxZmJhNCwNCisgICAgMHgxZmJhOCwgMHgxZmJiNiwgMHgxZmJkYQ0KK307DQorRlhfSU5UMzIgQ0JDX1BERjQxN0NvbW1vbjo6Q09ERVdPUkRfVEFCTEVbXSA9IHsNCisgICAgMjYyNywgMTgxOSwgMjYyMiwgMjYyMSwgMTgxMywgMTgxMiwgMjcyOSwgMjcyNCwgMjcyMywgMjc3OSwgMjc3NCwgMjc3MywgOTAyLCA4OTYsIDkwOCwgODY4LCA4NjUsIDg2MSwgODU5LCAyNTExLA0KKyAgICA4NzMsIDg3MSwgMTc4MCwgODM1LCAyNDkzLCA4MjUsIDI0OTEsIDg0MiwgODM3LCA4NDQsIDE3NjQsIDE3NjIsIDgxMSwgODEwLCA4MDksIDI0ODMsIDgwNywgMjQ4MiwgODA2LCAyNDgwLCA4MTUsDQorICAgIDgxNCwgODEzLCA4MTIsIDI0ODQsIDgxNywgODE2LCAxNzQ1LCAxNzQ0LCAxNzQyLCAxNzQ2LCAyNjU1LCAyNjM3LCAyNjM1LCAyNjI2LCAyNjI1LCAyNjIzLCAyNjI4LCAxODIwLCAyNzUyLA0KKyAgICAyNzM5LCAyNzM3LCAyNzI4LCAyNzI3LCAyNzI1LCAyNzMwLCAyNzg1LCAyNzgzLCAyNzc4LCAyNzc3LCAyNzc1LCAyNzgwLCA3ODcsIDc4MSwgNzQ3LCA3MzksIDczNiwgMjQxMywgNzU0LCA3NTIsDQorICAgIDE3MTksIDY5MiwgNjg5LCA2ODEsIDIzNzEsIDY3OCwgMjM2OSwgNzAwLCA2OTcsIDY5NCwgNzAzLCAxNjg4LCAxNjg2LCA2NDIsIDYzOCwgMjM0MywgNjMxLCAyMzQxLCA2MjcsIDIzMzgsIDY1MSwNCisgICAgNjQ2LCA2NDMsIDIzNDUsIDY1NCwgNjUyLCAxNjUyLCAxNjUwLCAxNjQ3LCAxNjU0LCA2MDEsIDU5OSwgMjMyMiwgNTk2LCAyMzIxLCA1OTQsIDIzMTksIDIzMTcsIDYxMSwgNjEwLCA2MDgsIDYwNiwNCisgICAgMjMyNCwgNjAzLCAyMzIzLCA2MTUsIDYxNCwgNjEyLCAxNjE3LCAxNjE2LCAxNjE0LCAxNjEyLCA2MTYsIDE2MTksIDE2MTgsIDI1NzUsIDI1MzgsIDI1MzYsIDkwNSwgOTAxLCA4OTgsIDkwOSwNCisgICAgMjUwOSwgMjUwNywgMjUwNCwgODcwLCA4NjcsIDg2NCwgODYwLCAyNTEyLCA4NzUsIDg3MiwgMTc4MSwgMjQ5MCwgMjQ4OSwgMjQ4NywgMjQ4NSwgMTc0OCwgODM2LCA4MzQsIDgzMiwgODMwLA0KKyAgICAyNDk0LCA4MjcsIDI0OTIsIDg0MywgODQxLCA4MzksIDg0NSwgMTc2NSwgMTc2MywgMjcwMSwgMjY3NiwgMjY3NCwgMjY1MywgMjY0OCwgMjY1NiwgMjYzNCwgMjYzMywgMjYzMSwgMjYyOSwNCisgICAgMTgyMSwgMjYzOCwgMjYzNiwgMjc3MCwgMjc2MywgMjc2MSwgMjc1MCwgMjc0NSwgMjc1MywgMjczNiwgMjczNSwgMjczMywgMjczMSwgMTg0OCwgMjc0MCwgMjczOCwgMjc4NiwgMjc4NCwgNTkxLA0KKyAgICA1ODgsIDU3NiwgNTY5LCA1NjYsIDIyOTYsIDE1OTAsIDUzNywgNTM0LCA1MjYsIDIyNzYsIDUyMiwgMjI3NCwgNTQ1LCA1NDIsIDUzOSwgNTQ4LCAxNTcyLCAxNTcwLCA0ODEsIDIyNDUsIDQ2NiwNCisgICAgMjI0MiwgNDYyLCAyMjM5LCA0OTIsIDQ4NSwgNDgyLCAyMjQ5LCA0OTYsIDQ5NCwgMTUzNCwgMTUzMSwgMTUyOCwgMTUzOCwgNDEzLCAyMTk2LCA0MDYsIDIxOTEsIDIxODgsIDQyNSwgNDE5LA0KKyAgICAyMjAyLCA0MTUsIDIxOTksIDQzMiwgNDMwLCA0MjcsIDE0NzIsIDE0NjcsIDE0NjQsIDQzMywgMTQ3NiwgMTQ3NCwgMzY4LCAzNjcsIDIxNjAsIDM2NSwgMjE1OSwgMzYyLCAyMTU3LCAyMTU1LA0KKyAgICAyMTUyLCAzNzgsIDM3NywgMzc1LCAyMTY2LCAzNzIsIDIxNjUsIDM2OSwgMjE2MiwgMzgzLCAzODEsIDM3OSwgMjE2OCwgMTQxOSwgMTQxOCwgMTQxNiwgMTQxNCwgMzg1LCAxNDExLCAzODQsDQorICAgIDE0MjMsIDE0MjIsIDE0MjAsIDE0MjQsIDI0NjEsIDgwMiwgMjQ0MSwgMjQzOSwgNzkwLCA3ODYsIDc4MywgNzk0LCAyNDA5LCAyNDA2LCAyNDAzLCA3NTAsIDc0MiwgNzM4LCAyNDE0LCA3NTYsDQorICAgIDc1MywgMTcyMCwgMjM2NywgMjM2NSwgMjM2MiwgMjM1OSwgMTY2MywgNjkzLCA2OTEsIDY4NCwgMjM3MywgNjgwLCAyMzcwLCA3MDIsIDY5OSwgNjk2LCA3MDQsIDE2OTAsIDE2ODcsIDIzMzcsDQorICAgIDIzMzYsIDIzMzQsIDIzMzIsIDE2MjQsIDIzMjksIDE2MjIsIDY0MCwgNjM3LCAyMzQ0LCA2MzQsIDIzNDIsIDYzMCwgMjM0MCwgNjUwLCA2NDgsIDY0NSwgMjM0NiwgNjU1LCA2NTMsIDE2NTMsDQorICAgIDE2NTEsIDE2NDksIDE2NTUsIDI2MTIsIDI1OTcsIDI1OTUsIDI1NzEsIDI1NjgsIDI1NjUsIDI1NzYsIDI1MzQsIDI1MjksIDI1MjYsIDE3ODcsIDI1NDAsIDI1MzcsIDkwNywgOTA0LCA5MDAsDQorICAgIDkxMCwgMjUwMywgMjUwMiwgMjUwMCwgMjQ5OCwgMTc2OCwgMjQ5NSwgMTc2NywgMjUxMCwgMjUwOCwgMjUwNiwgODY5LCA4NjYsIDg2MywgMjUxMywgODc2LCA4NzQsIDE3ODIsIDI3MjAsIDI3MTMsDQorICAgIDI3MTEsIDI2OTcsIDI2OTQsIDI2OTEsIDI3MDIsIDI2NzIsIDI2NzAsIDI2NjQsIDE4MjgsIDI2NzgsIDI2NzUsIDI2NDcsIDI2NDYsIDI2NDQsIDI2NDIsIDE4MjMsIDI2MzksIDE4MjIsIDI2NTQsDQorICAgIDI2NTIsIDI2NTAsIDI2NTcsIDI3NzEsIDE4NTUsIDI3NjUsIDI3NjIsIDE4NTAsIDE4NDksIDI3NTEsIDI3NDksIDI3NDcsIDI3NTQsIDM1MywgMjE0OCwgMzQ0LCAzNDIsIDMzNiwgMjE0MiwNCisgICAgMzMyLCAyMTQwLCAzNDUsIDEzNzUsIDEzNzMsIDMwNiwgMjEzMCwgMjk5LCAyMTI4LCAyOTUsIDIxMjUsIDMxOSwgMzE0LCAzMTEsIDIxMzIsIDEzNTQsIDEzNTIsIDEzNDksIDEzNTYsIDI2MiwNCisgICAgMjU3LCAyMTAxLCAyNTMsIDIwOTYsIDIwOTMsIDI3NCwgMjczLCAyNjcsIDIxMDcsIDI2MywgMjEwNCwgMjgwLCAyNzgsIDI3NSwgMTMxNiwgMTMxMSwgMTMwOCwgMTMyMCwgMTMxOCwgMjA1MiwNCisgICAgMjAyLCAyMDUwLCAyMDQ0LCAyMDQwLCAyMTksIDIwNjMsIDIxMiwgMjA2MCwgMjA4LCAyMDU1LCAyMjQsIDIyMSwgMjA2NiwgMTI2MCwgMTI1OCwgMTI1MiwgMjMxLCAxMjQ4LCAyMjksIDEyNjYsDQorICAgIDEyNjQsIDEyNjEsIDEyNjgsIDE1NSwgMTk5OCwgMTUzLCAxOTk2LCAxOTk0LCAxOTkxLCAxOTg4LCAxNjUsIDE2NCwgMjAwNywgMTYyLCAyMDA2LCAxNTksIDIwMDMsIDIwMDAsIDE3MiwgMTcxLA0KKyAgICAxNjksIDIwMTIsIDE2NiwgMjAxMCwgMTE4NiwgMTE4NCwgMTE4MiwgMTE3OSwgMTc1LCAxMTc2LCAxNzMsIDExOTIsIDExOTEsIDExODksIDExODcsIDE3NiwgMTE5NCwgMTE5MywgMjMxMywNCisgICAgMjMwNywgMjMwNSwgNTkyLCA1ODksIDIyOTQsIDIyOTIsIDIyODksIDU3OCwgNTcyLCA1NjgsIDIyOTcsIDU4MCwgMTU5MSwgMjI3MiwgMjI2NywgMjI2NCwgMTU0NywgNTM4LCA1MzYsIDUyOSwNCisgICAgMjI3OCwgNTI1LCAyMjc1LCA1NDcsIDU0NCwgNTQxLCAxNTc0LCAxNTcxLCAyMjM3LCAyMjM1LCAyMjI5LCAxNDkzLCAyMjI1LCAxNDg5LCA0NzgsIDIyNDcsIDQ3MCwgMjI0NCwgNDY1LCAyMjQxLA0KKyAgICA0OTMsIDQ4OCwgNDg0LCAyMjUwLCA0OTgsIDQ5NSwgMTUzNiwgMTUzMywgMTUzMCwgMTUzOSwgMjE4NywgMjE4NiwgMjE4NCwgMjE4MiwgMTQzMiwgMjE3OSwgMTQzMCwgMjE3NiwgMTQyNywgNDE0LA0KKyAgICA0MTIsIDIxOTcsIDQwOSwgMjE5NSwgNDA1LCAyMTkzLCAyMTkwLCA0MjYsIDQyNCwgNDIxLCAyMjAzLCA0MTgsIDIyMDEsIDQzMSwgNDI5LCAxNDczLCAxNDcxLCAxNDY5LCAxNDY2LCA0MzQsDQorICAgIDE0NzcsIDE0NzUsIDI0NzgsIDI0NzIsIDI0NzAsIDI0NTksIDI0NTcsIDI0NTQsIDI0NjIsIDgwMywgMjQzNywgMjQzMiwgMjQyOSwgMTcyNiwgMjQ0MywgMjQ0MCwgNzkyLCA3ODksIDc4NSwNCisgICAgMjQwMSwgMjM5OSwgMjM5MywgMTcwMiwgMjM4OSwgMTY5OSwgMjQxMSwgMjQwOCwgMjQwNSwgNzQ1LCA3NDEsIDI0MTUsIDc1OCwgNzU1LCAxNzIxLCAyMzU4LCAyMzU3LCAyMzU1LCAyMzUzLA0KKyAgICAxNjYxLCAyMzUwLCAxNjYwLCAyMzQ3LCAxNjU3LCAyMzY4LCAyMzY2LCAyMzY0LCAyMzYxLCAxNjY2LCA2OTAsIDY4NywgMjM3NCwgNjgzLCAyMzcyLCA3MDEsIDY5OCwgNzA1LCAxNjkxLCAxNjg5LA0KKyAgICAyNjE5LCAyNjE3LCAyNjEwLCAyNjA4LCAyNjA1LCAyNjEzLCAyNTkzLCAyNTg4LCAyNTg1LCAxODAzLCAyNTk5LCAyNTk2LCAyNTYzLCAyNTYxLCAyNTU1LCAxNzk3LCAyNTUxLCAxNzk1LCAyNTczLA0KKyAgICAyNTcwLCAyNTY3LCAyNTc3LCAyNTI1LCAyNTI0LCAyNTIyLCAyNTIwLCAxNzg2LCAyNTE3LCAxNzg1LCAyNTE0LCAxNzgzLCAyNTM1LCAyNTMzLCAyNTMxLCAyNTI4LCAxNzg4LCAyNTQxLCAyNTM5LA0KKyAgICA5MDYsIDkwMywgOTExLCAyNzIxLCAxODQ0LCAyNzE1LCAyNzEyLCAxODM4LCAxODM2LCAyNjk5LCAyNjk2LCAyNjkzLCAyNzAzLCAxODI3LCAxODI2LCAxODI0LCAyNjczLCAyNjcxLCAyNjY5LA0KKyAgICAyNjY2LCAxODI5LCAyNjc5LCAyNjc3LCAxODU4LCAxODU3LCAyNzcyLCAxODU0LCAxODUzLCAxODUxLCAxODU2LCAyNzY2LCAyNzY0LCAxNDMsIDE5ODcsIDEzOSwgMTk4NiwgMTM1LCAxMzMsDQorICAgIDEzMSwgMTk4NCwgMTI4LCAxOTgzLCAxMjUsIDE5ODEsIDEzOCwgMTM3LCAxMzYsIDE5ODUsIDExMzMsIDExMzIsIDExMzAsIDExMiwgMTEwLCAxOTc0LCAxMDcsIDE5NzMsIDEwNCwgMTk3MSwNCisgICAgMTk2OSwgMTIyLCAxMjEsIDExOSwgMTE3LCAxOTc3LCAxMTQsIDE5NzYsIDEyNCwgMTExNSwgMTExNCwgMTExMiwgMTExMCwgMTExNywgMTExNiwgODQsIDgzLCAxOTUzLCA4MSwgMTk1MiwgNzgsDQorICAgIDE5NTAsIDE5NDgsIDE5NDUsIDk0LCA5MywgOTEsIDE5NTksIDg4LCAxOTU4LCA4NSwgMTk1NSwgOTksIDk3LCA5NSwgMTk2MSwgMTA4NiwgMTA4NSwgMTA4MywgMTA4MSwgMTA3OCwgMTAwLA0KKyAgICAxMDkwLCAxMDg5LCAxMDg3LCAxMDkxLCA0OSwgNDcsIDE5MTcsIDQ0LCAxOTE1LCAxOTEzLCAxOTEwLCAxOTA3LCA1OSwgMTkyNiwgNTYsIDE5MjUsIDUzLCAxOTIyLCAxOTE5LCA2NiwgNjQsDQorICAgIDE5MzEsIDYxLCAxOTI5LCAxMDQyLCAxMDQwLCAxMDM4LCA3MSwgMTAzNSwgNzAsIDEwMzIsIDY4LCAxMDQ4LCAxMDQ3LCAxMDQ1LCAxMDQzLCAxMDUwLCAxMDQ5LCAxMiwgMTAsIDE4NjksIDE4NjcsDQorICAgIDE4NjQsIDE4NjEsIDIxLCAxODgwLCAxOSwgMTg3NywgMTg3NCwgMTg3MSwgMjgsIDE4ODgsIDI1LCAxODg2LCAyMiwgMTg4MywgOTgyLCA5ODAsIDk3NywgOTc0LCAzMiwgMzAsIDk5MSwgOTg5LA0KKyAgICA5ODcsIDk4NCwgMzQsIDk5NSwgOTk0LCA5OTIsIDIxNTEsIDIxNTAsIDIxNDcsIDIxNDYsIDIxNDQsIDM1NiwgMzU1LCAzNTQsIDIxNDksIDIxMzksIDIxMzgsIDIxMzYsIDIxMzQsIDEzNTksDQorICAgIDM0MywgMzQxLCAzMzgsIDIxNDMsIDMzNSwgMjE0MSwgMzQ4LCAzNDcsIDM0NiwgMTM3NiwgMTM3NCwgMjEyNCwgMjEyMywgMjEyMSwgMjExOSwgMTMyNiwgMjExNiwgMTMyNCwgMzEwLCAzMDgsDQorICAgIDMwNSwgMjEzMSwgMzAyLCAyMTI5LCAyOTgsIDIxMjcsIDMyMCwgMzE4LCAzMTYsIDMxMywgMjEzMywgMzIyLCAzMjEsIDEzNTUsIDEzNTMsIDEzNTEsIDEzNTcsIDIwOTIsIDIwOTEsIDIwODksDQorICAgIDIwODcsIDEyNzYsIDIwODQsIDEyNzQsIDIwODEsIDEyNzEsIDI1OSwgMjEwMiwgMjU2LCAyMTAwLCAyNTIsIDIwOTgsIDIwOTUsIDI3MiwgMjY5LCAyMTA4LCAyNjYsIDIxMDYsIDI4MSwgMjc5LA0KKyAgICAyNzcsIDEzMTcsIDEzMTUsIDEzMTMsIDEzMTAsIDI4MiwgMTMyMSwgMTMxOSwgMjAzOSwgMjAzNywgMjAzNSwgMjAzMiwgMTIwMywgMjAyOSwgMTIwMCwgMTE5NywgMjA3LCAyMDUzLCAyMDUsDQorICAgIDIwNTEsIDIwMSwgMjA0OSwgMjA0NiwgMjA0MywgMjIwLCAyMTgsIDIwNjQsIDIxNSwgMjA2MiwgMjExLCAyMDU5LCAyMjgsIDIyNiwgMjIzLCAyMDY5LCAxMjU5LCAxMjU3LCAxMjU0LCAyMzIsDQorICAgIDEyNTEsIDIzMCwgMTI2NywgMTI2NSwgMTI2MywgMjMxNiwgMjMxNSwgMjMxMiwgMjMxMSwgMjMwOSwgMjMxNCwgMjMwNCwgMjMwMywgMjMwMSwgMjI5OSwgMTU5MywgMjMwOCwgMjMwNiwgNTkwLA0KKyAgICAyMjg4LCAyMjg3LCAyMjg1LCAyMjgzLCAxNTc4LCAyMjgwLCAxNTc3LCAyMjk1LCAyMjkzLCAyMjkxLCA1NzksIDU3NywgNTc0LCA1NzEsIDIyOTgsIDU4MiwgNTgxLCAxNTkyLCAyMjYzLCAyMjYyLA0KKyAgICAyMjYwLCAyMjU4LCAxNTQ1LCAyMjU1LCAxNTQ0LCAyMjUyLCAxNTQxLCAyMjczLCAyMjcxLCAyMjY5LCAyMjY2LCAxNTUwLCA1MzUsIDUzMiwgMjI3OSwgNTI4LCAyMjc3LCA1NDYsIDU0MywgNTQ5LA0KKyAgICAxNTc1LCAxNTczLCAyMjI0LCAyMjIyLCAyMjIwLCAxNDg2LCAyMjE3LCAxNDg1LCAyMjE0LCAxNDgyLCAxNDc5LCAyMjM4LCAyMjM2LCAyMjM0LCAyMjMxLCAxNDk2LCAyMjI4LCAxNDkyLCA0ODAsDQorICAgIDQ3NywgMjI0OCwgNDczLCAyMjQ2LCA0NjksIDIyNDMsIDQ5MCwgNDg3LCAyMjUxLCA0OTcsIDE1MzcsIDE1MzUsIDE1MzIsIDI0NzcsIDI0NzYsIDI0NzQsIDI0NzksIDI0NjksIDI0NjgsIDI0NjYsDQorICAgIDI0NjQsIDE3MzAsIDI0NzMsIDI0NzEsIDI0NTMsIDI0NTIsIDI0NTAsIDI0NDgsIDE3MjksIDI0NDUsIDE3MjgsIDI0NjAsIDI0NTgsIDI0NTYsIDI0NjMsIDgwNSwgODA0LCAyNDI4LCAyNDI3LA0KKyAgICAyNDI1LCAyNDIzLCAxNzI1LCAyNDIwLCAxNzI0LCAyNDE3LCAxNzIyLCAyNDM4LCAyNDM2LCAyNDM0LCAyNDMxLCAxNzI3LCAyNDQ0LCAyNDQyLCA3OTMsIDc5MSwgNzg4LCA3OTUsIDIzODgsDQorICAgIDIzODYsIDIzODQsIDE2OTcsIDIzODEsIDE2OTYsIDIzNzgsIDE2OTQsIDE2OTIsIDI0MDIsIDI0MDAsIDIzOTgsIDIzOTUsIDE3MDMsIDIzOTIsIDE3MDEsIDI0MTIsIDI0MTAsIDI0MDcsIDc1MSwNCisgICAgNzQ4LCA3NDQsIDI0MTYsIDc1OSwgNzU3LCAxODA3LCAyNjIwLCAyNjE4LCAxODA2LCAxODA1LCAyNjExLCAyNjA5LCAyNjA3LCAyNjE0LCAxODAyLCAxODAxLCAxNzk5LCAyNTk0LCAyNTkyLA0KKyAgICAyNTkwLCAyNTg3LCAxODA0LCAyNjAwLCAyNTk4LCAxNzk0LCAxNzkzLCAxNzkxLCAxNzg5LCAyNTY0LCAyNTYyLCAyNTYwLCAyNTU3LCAxNzk4LCAyNTU0LCAxNzk2LCAyNTc0LCAyNTcyLCAyNTY5LA0KKyAgICAyNTc4LCAxODQ3LCAxODQ2LCAyNzIyLCAxODQzLCAxODQyLCAxODQwLCAxODQ1LCAyNzE2LCAyNzE0LCAxODM1LCAxODM0LCAxODMyLCAxODMwLCAxODM5LCAxODM3LCAyNzAwLCAyNjk4LCAyNjk1LA0KKyAgICAyNzA0LCAxODE3LCAxODExLCAxODEwLCA4OTcsIDg2MiwgMTc3NywgODI5LCA4MjYsIDgzOCwgMTc2MCwgMTc1OCwgODA4LCAyNDgxLCAxNzQxLCAxNzQwLCAxNzM4LCAxNzQzLCAyNjI0LCAxODE4LA0KKyAgICAyNzI2LCAyNzc2LCA3ODIsIDc0MCwgNzM3LCAxNzE1LCA2ODYsIDY3OSwgNjk1LCAxNjgyLCAxNjgwLCA2MzksIDYyOCwgMjMzOSwgNjQ3LCA2NDQsIDE2NDUsIDE2NDMsIDE2NDAsIDE2NDgsDQorICAgIDYwMiwgNjAwLCA1OTcsIDU5NSwgMjMyMCwgNTkzLCAyMzE4LCA2MDksIDYwNywgNjA0LCAxNjExLCAxNjEwLCAxNjA4LCAxNjA2LCA2MTMsIDE2MTUsIDE2MTMsIDIzMjgsIDkyNiwgOTI0LCA4OTIsDQorICAgIDg4NiwgODk5LCA4NTcsIDg1MCwgMjUwNSwgMTc3OCwgODI0LCA4MjMsIDgyMSwgODE5LCAyNDg4LCA4MTgsIDI0ODYsIDgzMywgODMxLCA4MjgsIDg0MCwgMTc2MSwgMTc1OSwgMjY0OSwgMjYzMiwNCisgICAgMjYzMCwgMjc0NiwgMjczNCwgMjczMiwgMjc4MiwgMjc4MSwgNTcwLCA1NjcsIDE1ODcsIDUzMSwgNTI3LCA1MjMsIDU0MCwgMTU2NiwgMTU2NCwgNDc2LCA0NjcsIDQ2MywgMjI0MCwgNDg2LA0KKyAgICA0ODMsIDE1MjQsIDE1MjEsIDE1MTgsIDE1MjksIDQxMSwgNDAzLCAyMTkyLCAzOTksIDIxODksIDQyMywgNDE2LCAxNDYyLCAxNDU3LCAxNDU0LCA0MjgsIDE0NjgsIDE0NjUsIDIyMTAsIDM2NiwNCisgICAgMzYzLCAyMTU4LCAzNjAsIDIxNTYsIDM1NywgMjE1MywgMzc2LCAzNzMsIDM3MCwgMjE2MywgMTQxMCwgMTQwOSwgMTQwNywgMTQwNSwgMzgyLCAxNDAyLCAzODAsIDE0MTcsIDE0MTUsIDE0MTIsDQorICAgIDE0MjEsIDIxNzUsIDIxNzQsIDc3NywgNzc0LCA3NzEsIDc4NCwgNzMyLCA3MjUsIDcyMiwgMjQwNCwgNzQzLCAxNzE2LCA2NzYsIDY3NCwgNjY4LCAyMzYzLCA2NjUsIDIzNjAsIDY4NSwgMTY4NCwNCisgICAgMTY4MSwgNjI2LCA2MjQsIDYyMiwgMjMzNSwgNjIwLCAyMzMzLCA2MTcsIDIzMzAsIDY0MSwgNjM1LCA2NDksIDE2NDYsIDE2NDQsIDE2NDIsIDI1NjYsIDkyOCwgOTI1LCAyNTMwLCAyNTI3LA0KKyAgICA4OTQsIDg5MSwgODg4LCAyNTAxLCAyNDk5LCAyNDk2LCA4NTgsIDg1NiwgODU0LCA4NTEsIDE3NzksIDI2OTIsIDI2NjgsIDI2NjUsIDI2NDUsIDI2NDMsIDI2NDAsIDI2NTEsIDI3NjgsIDI3NTksDQorICAgIDI3NTcsIDI3NDQsIDI3NDMsIDI3NDEsIDI3NDgsIDM1MiwgMTM4MiwgMzQwLCAzMzcsIDMzMywgMTM3MSwgMTM2OSwgMzA3LCAzMDAsIDI5NiwgMjEyNiwgMzE1LCAzMTIsIDEzNDcsIDEzNDIsDQorICAgIDEzNTAsIDI2MSwgMjU4LCAyNTAsIDIwOTcsIDI0NiwgMjA5NCwgMjcxLCAyNjgsIDI2NCwgMTMwNiwgMTMwMSwgMTI5OCwgMjc2LCAxMzEyLCAxMzA5LCAyMTE1LCAyMDMsIDIwNDgsIDE5NSwNCisgICAgMjA0NSwgMTkxLCAyMDQxLCAyMTMsIDIwOSwgMjA1NiwgMTI0NiwgMTI0NCwgMTIzOCwgMjI1LCAxMjM0LCAyMjIsIDEyNTYsIDEyNTMsIDEyNDksIDEyNjIsIDIwODAsIDIwNzksIDE1NCwgMTk5NywNCisgICAgMTUwLCAxOTk1LCAxNDcsIDE5OTIsIDE5ODksIDE2MywgMTYwLCAyMDA0LCAxNTYsIDIwMDEsIDExNzUsIDExNzQsIDExNzIsIDExNzAsIDExNjcsIDE3MCwgMTE2NCwgMTY3LCAxMTg1LCAxMTgzLA0KKyAgICAxMTgwLCAxMTc3LCAxNzQsIDExOTAsIDExODgsIDIwMjUsIDIwMjQsIDIwMjIsIDU4NywgNTg2LCA1NjQsIDU1OSwgNTU2LCAyMjkwLCA1NzMsIDE1ODgsIDUyMCwgNTE4LCA1MTIsIDIyNjgsDQorICAgIDUwOCwgMjI2NSwgNTMwLCAxNTY4LCAxNTY1LCA0NjEsIDQ1NywgMjIzMywgNDUwLCAyMjMwLCA0NDYsIDIyMjYsIDQ3OSwgNDcxLCA0ODksIDE1MjYsIDE1MjMsIDE1MjAsIDM5NywgMzk1LA0KKyAgICAyMTg1LCAzOTIsIDIxODMsIDM4OSwgMjE4MCwgMjE3NywgNDEwLCAyMTk0LCA0MDIsIDQyMiwgMTQ2MywgMTQ2MSwgMTQ1OSwgMTQ1NiwgMTQ3MCwgMjQ1NSwgNzk5LCAyNDMzLCAyNDMwLCA3NzksDQorICAgIDc3NiwgNzczLCAyMzk3LCAyMzk0LCAyMzkwLCA3MzQsIDcyOCwgNzI0LCA3NDYsIDE3MTcsIDIzNTYsIDIzNTQsIDIzNTEsIDIzNDgsIDE2NTgsIDY3NywgNjc1LCA2NzMsIDY3MCwgNjY3LCA2ODgsDQorICAgIDE2ODUsIDE2ODMsIDI2MDYsIDI1ODksIDI1ODYsIDI1NTksIDI1NTYsIDI1NTIsIDkyNywgMjUyMywgMjUyMSwgMjUxOCwgMjUxNSwgMTc4NCwgMjUzMiwgODk1LCA4OTMsIDg5MCwgMjcxOCwNCisgICAgMjcwOSwgMjcwNywgMjY4OSwgMjY4NywgMjY4NCwgMjY2MywgMjY2MiwgMjY2MCwgMjY1OCwgMTgyNSwgMjY2NywgMjc2OSwgMTg1MiwgMjc2MCwgMjc1OCwgMTQyLCAxNDEsIDExMzksIDExMzgsDQorICAgIDEzNCwgMTMyLCAxMjksIDEyNiwgMTk4MiwgMTEyOSwgMTEyOCwgMTEyNiwgMTEzMSwgMTEzLCAxMTEsIDEwOCwgMTA1LCAxOTcyLCAxMDEsIDE5NzAsIDEyMCwgMTE4LCAxMTUsIDExMDksIDExMDgsDQorICAgIDExMDYsIDExMDQsIDEyMywgMTExMywgMTExMSwgODIsIDc5LCAxOTUxLCA3NSwgMTk0OSwgNzIsIDE5NDYsIDkyLCA4OSwgODYsIDE5NTYsIDEwNzcsIDEwNzYsIDEwNzQsIDEwNzIsIDk4LA0KKyAgICAxMDY5LCA5NiwgMTA4NCwgMTA4MiwgMTA3OSwgMTA4OCwgMTk2OCwgMTk2NywgNDgsIDQ1LCAxOTE2LCA0MiwgMTkxNCwgMzksIDE5MTEsIDE5MDgsIDYwLCA1NywgNTQsIDE5MjMsIDUwLCAxOTIwLA0KKyAgICAxMDMxLCAxMDMwLCAxMDI4LCAxMDI2LCA2NywgMTAyMywgNjUsIDEwMjAsIDYyLCAxMDQxLCAxMDM5LCAxMDM2LCAxMDMzLCA2OSwgMTA0NiwgMTA0NCwgMTk0NCwgMTk0MywgMTk0MSwgMTEsIDksDQorICAgIDE4NjgsIDcsIDE4NjUsIDE4NjIsIDE4NTksIDIwLCAxODc4LCAxNiwgMTg3NSwgMTMsIDE4NzIsIDk3MCwgOTY4LCA5NjYsIDk2MywgMjksIDk2MCwgMjYsIDIzLCA5ODMsIDk4MSwgOTc4LCA5NzUsDQorICAgIDMzLCA5NzEsIDMxLCA5OTAsIDk4OCwgOTg1LCAxOTA2LCAxOTA0LCAxOTAyLCA5OTMsIDM1MSwgMjE0NSwgMTM4MywgMzMxLCAzMzAsIDMyOCwgMzI2LCAyMTM3LCAzMjMsIDIxMzUsIDMzOSwNCisgICAgMTM3MiwgMTM3MCwgMjk0LCAyOTMsIDI5MSwgMjg5LCAyMTIyLCAyODYsIDIxMjAsIDI4MywgMjExNywgMzA5LCAzMDMsIDMxNywgMTM0OCwgMTM0NiwgMTM0NCwgMjQ1LCAyNDQsIDI0MiwgMjA5MCwNCisgICAgMjM5LCAyMDg4LCAyMzYsIDIwODUsIDIwODIsIDI2MCwgMjA5OSwgMjQ5LCAyNzAsIDEzMDcsIDEzMDUsIDEzMDMsIDEzMDAsIDEzMTQsIDE4OSwgMjAzOCwgMTg2LCAyMDM2LCAxODMsIDIwMzMsDQorICAgIDIwMzAsIDIwMjYsIDIwNiwgMTk4LCAyMDQ3LCAxOTQsIDIxNiwgMTI0NywgMTI0NSwgMTI0MywgMTI0MCwgMjI3LCAxMjM3LCAxMjU1LCAyMzEwLCAyMzAyLCAyMzAwLCAyMjg2LCAyMjg0LA0KKyAgICAyMjgxLCA1NjUsIDU2MywgNTYxLCA1NTgsIDU3NSwgMTU4OSwgMjI2MSwgMjI1OSwgMjI1NiwgMjI1MywgMTU0MiwgNTIxLCA1MTksIDUxNywgNTE0LCAyMjcwLCA1MTEsIDUzMywgMTU2OSwNCisgICAgMTU2NywgMjIyMywgMjIyMSwgMjIxOCwgMjIxNSwgMTQ4MywgMjIxMSwgMTQ4MCwgNDU5LCA0NTYsIDQ1MywgMjIzMiwgNDQ5LCA0NzQsIDQ5MSwgMTUyNywgMTUyNSwgMTUyMiwgMjQ3NSwgMjQ2NywNCisgICAgMjQ2NSwgMjQ1MSwgMjQ0OSwgMjQ0NiwgODAxLCA4MDAsIDI0MjYsIDI0MjQsIDI0MjEsIDI0MTgsIDE3MjMsIDI0MzUsIDc4MCwgNzc4LCA3NzUsIDIzODcsIDIzODUsIDIzODIsIDIzNzksDQorICAgIDE2OTUsIDIzNzUsIDE2OTMsIDIzOTYsIDczNSwgNzMzLCA3MzAsIDcyNywgNzQ5LCAxNzE4LCAyNjE2LCAyNjE1LCAyNjA0LCAyNjAzLCAyNjAxLCAyNTg0LCAyNTgzLCAyNTgxLCAyNTc5LA0KKyAgICAxODAwLCAyNTkxLCAyNTUwLCAyNTQ5LCAyNTQ3LCAyNTQ1LCAxNzkyLCAyNTQyLCAxNzkwLCAyNTU4LCA5MjksIDI3MTksIDE4NDEsIDI3MTAsIDI3MDgsIDE4MzMsIDE4MzEsIDI2OTAsIDI2ODgsDQorICAgIDI2ODYsIDE4MTUsIDE4MDksIDE4MDgsIDE3NzQsIDE3NTYsIDE3NTQsIDE3MzcsIDE3MzYsIDE3MzQsIDE3MzksIDE4MTYsIDE3MTEsIDE2NzYsIDE2NzQsIDYzMywgNjI5LCAxNjM4LCAxNjM2LA0KKyAgICAxNjMzLCAxNjQxLCA1OTgsIDE2MDUsIDE2MDQsIDE2MDIsIDE2MDAsIDYwNSwgMTYwOSwgMTYwNywgMjMyNywgODg3LCA4NTMsIDE3NzUsIDgyMiwgODIwLCAxNzU3LCAxNzU1LCAxNTg0LCA1MjQsDQorICAgIDE1NjAsIDE1NTgsIDQ2OCwgNDY0LCAxNTE0LCAxNTExLCAxNTA4LCAxNTE5LCA0MDgsIDQwNCwgNDAwLCAxNDUyLCAxNDQ3LCAxNDQ0LCA0MTcsIDE0NTgsIDE0NTUsIDIyMDgsIDM2NCwgMzYxLA0KKyAgICAzNTgsIDIxNTQsIDE0MDEsIDE0MDAsIDEzOTgsIDEzOTYsIDM3NCwgMTM5MywgMzcxLCAxNDA4LCAxNDA2LCAxNDAzLCAxNDEzLCAyMTczLCAyMTcyLCA3NzIsIDcyNiwgNzIzLCAxNzEyLCA2NzIsDQorICAgIDY2OSwgNjY2LCA2ODIsIDE2NzgsIDE2NzUsIDYyNSwgNjIzLCA2MjEsIDYxOCwgMjMzMSwgNjM2LCA2MzIsIDE2MzksIDE2MzcsIDE2MzUsIDkyMCwgOTE4LCA4ODQsIDg4MCwgODg5LCA4NDksDQorICAgIDg0OCwgODQ3LCA4NDYsIDI0OTcsIDg1NSwgODUyLCAxNzc2LCAyNjQxLCAyNzQyLCAyNzg3LCAxMzgwLCAzMzQsIDEzNjcsIDEzNjUsIDMwMSwgMjk3LCAxMzQwLCAxMzM4LCAxMzM1LCAxMzQzLA0KKyAgICAyNTUsIDI1MSwgMjQ3LCAxMjk2LCAxMjkxLCAxMjg4LCAyNjUsIDEzMDIsIDEyOTksIDIxMTMsIDIwNCwgMTk2LCAxOTIsIDIwNDIsIDEyMzIsIDEyMzAsIDEyMjQsIDIxNCwgMTIyMCwgMjEwLA0KKyAgICAxMjQyLCAxMjM5LCAxMjM1LCAxMjUwLCAyMDc3LCAyMDc1LCAxNTEsIDE0OCwgMTk5MywgMTQ0LCAxOTkwLCAxMTYzLCAxMTYyLCAxMTYwLCAxMTU4LCAxMTU1LCAxNjEsIDExNTIsIDE1NywNCisgICAgMTE3MywgMTE3MSwgMTE2OCwgMTE2NSwgMTY4LCAxMTgxLCAxMTc4LCAyMDIxLCAyMDIwLCAyMDE4LCAyMDIzLCA1ODUsIDU2MCwgNTU3LCAxNTg1LCA1MTYsIDUwOSwgMTU2MiwgMTU1OSwgNDU4LA0KKyAgICA0NDcsIDIyMjcsIDQ3MiwgMTUxNiwgMTUxMywgMTUxMCwgMzk4LCAzOTYsIDM5MywgMzkwLCAyMTgxLCAzODYsIDIxNzgsIDQwNywgMTQ1MywgMTQ1MSwgMTQ0OSwgMTQ0NiwgNDIwLCAxNDYwLA0KKyAgICAyMjA5LCA3NjksIDc2NCwgNzIwLCA3MTIsIDIzOTEsIDcyOSwgMTcxMywgNjY0LCA2NjMsIDY2MSwgNjU5LCAyMzUyLCA2NTYsIDIzNDksIDY3MSwgMTY3OSwgMTY3NywgMjU1MywgOTIyLCA5MTksDQorICAgIDI1MTksIDI1MTYsIDg4NSwgODgzLCA4ODEsIDI2ODUsIDI2NjEsIDI2NTksIDI3NjcsIDI3NTYsIDI3NTUsIDE0MCwgMTEzNywgMTEzNiwgMTMwLCAxMjcsIDExMjUsIDExMjQsIDExMjIsIDExMjcsDQorICAgIDEwOSwgMTA2LCAxMDIsIDExMDMsIDExMDIsIDExMDAsIDEwOTgsIDExNiwgMTEwNywgMTEwNSwgMTk4MCwgODAsIDc2LCA3MywgMTk0NywgMTA2OCwgMTA2NywgMTA2NSwgMTA2MywgOTAsIDEwNjAsDQorICAgIDg3LCAxMDc1LCAxMDczLCAxMDcwLCAxMDgwLCAxOTY2LCAxOTY1LCA0NiwgNDMsIDQwLCAxOTEyLCAzNiwgMTkwOSwgMTAxOSwgMTAxOCwgMTAxNiwgMTAxNCwgNTgsIDEwMTEsIDU1LCAxMDA4LA0KKyAgICA1MSwgMTAyOSwgMTAyNywgMTAyNCwgMTAyMSwgNjMsIDEwMzcsIDEwMzQsIDE5NDAsIDE5MzksIDE5MzcsIDE5NDIsIDgsIDE4NjYsIDQsIDE4NjMsIDEsIDE4NjAsIDk1NiwgOTU0LCA5NTIsDQorICAgIDk0OSwgOTQ2LCAxNywgMTQsIDk2OSwgOTY3LCA5NjQsIDk2MSwgMjcsIDk1NywgMjQsIDk3OSwgOTc2LCA5NzIsIDE5MDEsIDE5MDAsIDE4OTgsIDE4OTYsIDk4NiwgMTkwNSwgMTkwMywgMzUwLA0KKyAgICAzNDksIDEzODEsIDMyOSwgMzI3LCAzMjQsIDEzNjgsIDEzNjYsIDI5MiwgMjkwLCAyODcsIDI4NCwgMjExOCwgMzA0LCAxMzQxLCAxMzM5LCAxMzM3LCAxMzQ1LCAyNDMsIDI0MCwgMjM3LCAyMDg2LA0KKyAgICAyMzMsIDIwODMsIDI1NCwgMTI5NywgMTI5NSwgMTI5MywgMTI5MCwgMTMwNCwgMjExNCwgMTkwLCAxODcsIDE4NCwgMjAzNCwgMTgwLCAyMDMxLCAxNzcsIDIwMjcsIDE5OSwgMTIzMywgMTIzMSwNCisgICAgMTIyOSwgMTIyNiwgMjE3LCAxMjIzLCAxMjQxLCAyMDc4LCAyMDc2LCA1ODQsIDU1NSwgNTU0LCA1NTIsIDU1MCwgMjI4MiwgNTYyLCAxNTg2LCA1MDcsIDUwNiwgNTA0LCA1MDIsIDIyNTcsIDQ5OSwNCisgICAgMjI1NCwgNTE1LCAxNTYzLCAxNTYxLCA0NDUsIDQ0MywgNDQxLCAyMjE5LCA0MzgsIDIyMTYsIDQzNSwgMjIxMiwgNDYwLCA0NTQsIDQ3NSwgMTUxNywgMTUxNSwgMTUxMiwgMjQ0NywgNzk4LA0KKyAgICA3OTcsIDI0MjIsIDI0MTksIDc3MCwgNzY4LCA3NjYsIDIzODMsIDIzODAsIDIzNzYsIDcyMSwgNzE5LCA3MTcsIDcxNCwgNzMxLCAxNzE0LCAyNjAyLCAyNTgyLCAyNTgwLCAyNTQ4LCAyNTQ2LA0KKyAgICAyNTQzLCA5MjMsIDkyMSwgMjcxNywgMjcwNiwgMjcwNSwgMjY4MywgMjY4MiwgMjY4MCwgMTc3MSwgMTc1MiwgMTc1MCwgMTczMywgMTczMiwgMTczMSwgMTczNSwgMTgxNCwgMTcwNywgMTY3MCwNCisgICAgMTY2OCwgMTYzMSwgMTYyOSwgMTYyNiwgMTYzNCwgMTU5OSwgMTU5OCwgMTU5NiwgMTU5NCwgMTYwMywgMTYwMSwgMjMyNiwgMTc3MiwgMTc1MywgMTc1MSwgMTU4MSwgMTU1NCwgMTU1MiwgMTUwNCwNCisgICAgMTUwMSwgMTQ5OCwgMTUwOSwgMTQ0MiwgMTQzNywgMTQzNCwgNDAxLCAxNDQ4LCAxNDQ1LCAyMjA2LCAxMzkyLCAxMzkxLCAxMzg5LCAxMzg3LCAxMzg0LCAzNTksIDEzOTksIDEzOTcsIDEzOTQsDQorICAgIDE0MDQsIDIxNzEsIDIxNzAsIDE3MDgsIDE2NzIsIDE2NjksIDYxOSwgMTYzMiwgMTYzMCwgMTYyOCwgMTc3MywgMTM3OCwgMTM2MywgMTM2MSwgMTMzMywgMTMyOCwgMTMzNiwgMTI4NiwgMTI4MSwNCisgICAgMTI3OCwgMjQ4LCAxMjkyLCAxMjg5LCAyMTExLCAxMjE4LCAxMjE2LCAxMjEwLCAxOTcsIDEyMDYsIDE5MywgMTIyOCwgMTIyNSwgMTIyMSwgMTIzNiwgMjA3MywgMjA3MSwgMTE1MSwgMTE1MCwNCisgICAgMTE0OCwgMTE0NiwgMTUyLCAxMTQzLCAxNDksIDExNDAsIDE0NSwgMTE2MSwgMTE1OSwgMTE1NiwgMTE1MywgMTU4LCAxMTY5LCAxMTY2LCAyMDE3LCAyMDE2LCAyMDE0LCAyMDE5LCAxNTgyLA0KKyAgICA1MTAsIDE1NTYsIDE1NTMsIDQ1MiwgNDQ4LCAxNTA2LCAxNTAwLCAzOTQsIDM5MSwgMzg3LCAxNDQzLCAxNDQxLCAxNDM5LCAxNDM2LCAxNDUwLCAyMjA3LCA3NjUsIDcxNiwgNzEzLCAxNzA5LA0KKyAgICA2NjIsIDY2MCwgNjU3LCAxNjczLCAxNjcxLCA5MTYsIDkxNCwgODc5LCA4NzgsIDg3NywgODgyLCAxMTM1LCAxMTM0LCAxMTIxLCAxMTIwLCAxMTE4LCAxMTIzLCAxMDk3LCAxMDk2LCAxMDk0LA0KKyAgICAxMDkyLCAxMDMsIDExMDEsIDEwOTksIDE5NzksIDEwNTksIDEwNTgsIDEwNTYsIDEwNTQsIDc3LCAxMDUxLCA3NCwgMTA2NiwgMTA2NCwgMTA2MSwgMTA3MSwgMTk2NCwgMTk2MywgMTAwNywNCisgICAgMTAwNiwgMTAwNCwgMTAwMiwgOTk5LCA0MSwgOTk2LCAzNywgMTAxNywgMTAxNSwgMTAxMiwgMTAwOSwgNTIsIDEwMjUsIDEwMjIsIDE5MzYsIDE5MzUsIDE5MzMsIDE5MzgsIDk0MiwgOTQwLA0KKyAgICA5MzgsIDkzNSwgOTMyLCA1LCAyLCA5NTUsIDk1MywgOTUwLCA5NDcsIDE4LCA5NDMsIDE1LCA5NjUsIDk2MiwgOTU4LCAxODk1LCAxODk0LCAxODkyLCAxODkwLCA5NzMsIDE4OTksIDE4OTcsDQorICAgIDEzNzksIDMyNSwgMTM2NCwgMTM2MiwgMjg4LCAyODUsIDEzMzQsIDEzMzIsIDEzMzAsIDI0MSwgMjM4LCAyMzQsIDEyODcsIDEyODUsIDEyODMsIDEyODAsIDEyOTQsIDIxMTIsIDE4OCwgMTg1LA0KKyAgICAxODEsIDE3OCwgMjAyOCwgMTIxOSwgMTIxNywgMTIxNSwgMTIxMiwgMjAwLCAxMjA5LCAxMjI3LCAyMDc0LCAyMDcyLCA1ODMsIDU1MywgNTUxLCAxNTgzLCA1MDUsIDUwMywgNTAwLCA1MTMsDQorICAgIDE1NTcsIDE1NTUsIDQ0NCwgNDQyLCA0MzksIDQzNiwgMjIxMywgNDU1LCA0NTEsIDE1MDcsIDE1MDUsIDE1MDIsIDc5NiwgNzYzLCA3NjIsIDc2MCwgNzY3LCA3MTEsIDcxMCwgNzA4LCA3MDYsDQorICAgIDIzNzcsIDcxOCwgNzE1LCAxNzEwLCAyNTQ0LCA5MTcsIDkxNSwgMjY4MSwgMTYyNywgMTU5NywgMTU5NSwgMjMyNSwgMTc2OSwgMTc0OSwgMTc0NywgMTQ5OSwgMTQzOCwgMTQzNSwgMjIwNCwNCisgICAgMTM5MCwgMTM4OCwgMTM4NSwgMTM5NSwgMjE2OSwgMjE2NywgMTcwNCwgMTY2NSwgMTY2MiwgMTYyNSwgMTYyMywgMTYyMCwgMTc3MCwgMTMyOSwgMTI4MiwgMTI3OSwgMjEwOSwgMTIxNCwgMTIwNywNCisgICAgMTIyMiwgMjA2OCwgMjA2NSwgMTE0OSwgMTE0NywgMTE0NCwgMTE0MSwgMTQ2LCAxMTU3LCAxMTU0LCAyMDEzLCAyMDExLCAyMDA4LCAyMDE1LCAxNTc5LCAxNTQ5LCAxNTQ2LCAxNDk1LCAxNDg3LA0KKyAgICAxNDMzLCAxNDMxLCAxNDI4LCAxNDI1LCAzODgsIDE0NDAsIDIyMDUsIDE3MDUsIDY1OCwgMTY2NywgMTY2NCwgMTExOSwgMTA5NSwgMTA5MywgMTk3OCwgMTA1NywgMTA1NSwgMTA1MiwgMTA2MiwNCisgICAgMTk2MiwgMTk2MCwgMTAwNSwgMTAwMywgMTAwMCwgOTk3LCAzOCwgMTAxMywgMTAxMCwgMTkzMiwgMTkzMCwgMTkyNywgMTkzNCwgOTQxLCA5MzksIDkzNiwgOTMzLCA2LCA5MzAsIDMsIDk1MSwNCisgICAgOTQ4LCA5NDQsIDE4ODksIDE4ODcsIDE4ODQsIDE4ODEsIDk1OSwgMTg5MywgMTg5MSwgMzUsIDEzNzcsIDEzNjAsIDEzNTgsIDEzMjcsIDEzMjUsIDEzMjIsIDEzMzEsIDEyNzcsIDEyNzUsDQorICAgIDEyNzIsIDEyNjksIDIzNSwgMTI4NCwgMjExMCwgMTIwNSwgMTIwNCwgMTIwMSwgMTE5OCwgMTgyLCAxMTk1LCAxNzksIDEyMTMsIDIwNzAsIDIwNjcsIDE1ODAsIDUwMSwgMTU1MSwgMTU0OCwNCisgICAgNDQwLCA0MzcsIDE0OTcsIDE0OTQsIDE0OTAsIDE1MDMsIDc2MSwgNzA5LCA3MDcsIDE3MDYsIDkxMywgOTEyLCAyMTk4LCAxMzg2LCAyMTY0LCAyMTYxLCAxNjIxLCAxNzY2LCAyMTAzLCAxMjA4LA0KKyAgICAyMDU4LCAyMDU0LCAxMTQ1LCAxMTQyLCAyMDA1LCAyMDAyLCAxOTk5LCAyMDA5LCAxNDg4LCAxNDI5LCAxNDI2LCAyMjAwLCAxNjk4LCAxNjU5LCAxNjU2LCAxOTc1LCAxMDUzLCAxOTU3LCAxOTU0LA0KKyAgICAxMDAxLCA5OTgsIDE5MjQsIDE5MjEsIDE5MTgsIDE5MjgsIDkzNywgOTM0LCA5MzEsIDE4NzksIDE4NzYsIDE4NzMsIDE4NzAsIDk0NSwgMTg4NSwgMTg4MiwgMTMyMywgMTI3MywgMTI3MCwNCisgICAgMjEwNSwgMTIwMiwgMTE5OSwgMTE5NiwgMTIxMSwgMjA2MSwgMjA1NywgMTU3NiwgMTU0MywgMTU0MCwgMTQ4NCwgMTQ4MSwgMTQ3OCwgMTQ5MSwgMTcwMA0KK307DQorQ0JDX1BERjQxN0NvbW1vbjo6Q0JDX1BERjQxN0NvbW1vbigpDQorew0KK30NCitDQkNfUERGNDE3Q29tbW9uOjp+Q0JDX1BERjQxN0NvbW1vbigpDQorew0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3Q29tbW9uOjpnZXRCaXRDb3VudFN1bShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpDQorew0KKyAgICBGWF9JTlQzMiBiaXRDb3VudFN1bSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtb2R1bGVCaXRDb3VudC5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgY291bnQgPSBtb2R1bGVCaXRDb3VudC5HZXRBdChpKTsNCisgICAgICAgIGJpdENvdW50U3VtICs9IGNvdW50Ow0KKyAgICB9DQorICAgIHJldHVybiBiaXRDb3VudFN1bTsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Q29kZXdvcmQoRlhfRFdPUkQgc3ltYm9sKQ0KK3sNCisgICAgRlhfRFdPUkQgc3ltID0gc3ltYm9sICYgMHgzRkZGRjsNCisgICAgRlhfSU5UMzIgaSA9IGZpbmRDb2Rld29yZEluZGV4KHN5bSk7DQorICAgIGlmIChpID09IC0xKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgcmV0dXJuIChDT0RFV09SRF9UQUJMRVtpXSAtIDEpICUgTlVNQkVSX09GX0NPREVXT1JEUzsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0NvbW1vbjo6ZmluZENvZGV3b3JkSW5kZXgoRlhfRFdPUkQgc3ltYm9sKQ0KK3sNCisgICAgRlhfSU5UMzIgZmlyc3QgPSAwOw0KKyAgICBGWF9JTlQzMiB1cHRvID0gc2l6ZW9mKFNZTUJPTF9UQUJMRSkgLyBzaXplb2YoU1lNQk9MX1RBQkxFWzBdKTsNCisgICAgd2hpbGUgKGZpcnN0IDwgdXB0bykgew0KKyAgICAgICAgRlhfSU5UMzIgbWlkID0gKChGWF9EV09SRCkoZmlyc3QgKyB1cHRvKSkgPj4gMTsNCisgICAgICAgIGlmIChzeW1ib2wgPCAoRlhfRFdPUkQpU1lNQk9MX1RBQkxFW21pZF0pIHsNCisgICAgICAgICAgICB1cHRvID0gbWlkOw0KKyAgICAgICAgfSBlbHNlIGlmIChzeW1ib2wgPiAoRlhfRFdPUkQpU1lNQk9MX1RBQkxFW21pZF0pIHsNCisgICAgICAgICAgICBmaXJzdCA9IG1pZCArIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBtaWQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhODFiMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdDb21wYWN0aW9uLmNwcApAQCAtMCwwICsxLDE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29tcGFjdGlvbi5oIg0KK0NCQ19Db21wYWN0aW9uOjpDQkNfQ29tcGFjdGlvbigpDQorew0KK30NCitDQkNfQ29tcGFjdGlvbjo6fkNCQ19Db21wYWN0aW9uKCkNCit7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBhMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwCkBAIC0wLDAgKzEsNDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2RlZmluZSAgICBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCAgICAgICAgICAgIDkwMA0KKyNkZWZpbmUgICAgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0ggICAgICAgICAgICA5MDENCisjZGVmaW5lICAgIE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIICAgICAgICAgOTAyDQorI2RlZmluZSAgICBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82ICAgICAgICAgIDkyNA0KKyNkZWZpbmUgICAgQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgICAgICA5MjgNCisjZGVmaW5lICAgIEJFR0lOX01BQ1JPX1BERjQxN19PUFRJT05BTF9GSUVMRCAgICAgOTIzDQorI2RlZmluZSAgICBNQUNST19QREY0MTdfVEVSTUlOQVRPUiAgICAgICAgICAgICAgIDkyMg0KKyNkZWZpbmUgICAgTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSAgICA5MTMNCitGWF9JTlQzMiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpNQVhfTlVNRVJJQ19DT0RFV09SRFMgPSAxNTsNCitGWF9JTlQzMiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpFWFA5MDBbMTZdID0gezB9Ow0KK0ZYX0lOVDMyIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6Ok5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFMgPSAyOw0KK0ZYX0lOVDMyIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OlBMID0gMjU7DQorRlhfSU5UMzIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6TEwgPSAyNzsNCitGWF9JTlQzMiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpBUyA9IDI3Ow0KK0ZYX0lOVDMyIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6Ok1MID0gMjg7DQorRlhfSU5UMzIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6QUwgPSAyODsNCitGWF9JTlQzMiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpQUyA9IDI5Ow0KK0ZYX0lOVDMyIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OlBBTCA9IDI5Ow0KK0ZYX0NIQVIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6UFVOQ1RfQ0hBUlNbMjldID0gew0KKyAgICAnOycsICc8JywgJz4nLCAnQCcsICdbJywgJ1xcJywgJ30nLCAnXycsICdgJywgJ34nLCAnIScsDQorICAgICdccicsICdcdCcsICcsJywgJzonLCAnXG4nLCAnLScsICcuJywgJyQnLCAnLycsICciJywgJ3wnLCAnKicsDQorICAgICcoJywgJyknLCAnPycsICd7JywgJ30nLCAnXCcnDQorfTsNCitGWF9DSEFSIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6Ok1JWEVEX0NIQVJTWzMwXSA9IHsNCisgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnJicsDQorICAgICdccicsICdcdCcsICcsJywgJzonLCAnIycsICctJywgJy4nLCAnJCcsICcvJywgJysnLCAnJScsICcqJywNCisgICAgJz0nLCAnXicNCit9Ow0KK3ZvaWQgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBFWFA5MDBbMF0gPSAxOw0KKyAgICBGWF9JTlQzMiBuaW5lSHVuZHJlZCA9IDkwMDsNCisgICAgRVhQOTAwWzFdID0gbmluZUh1bmRyZWQ7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDI7IGkgPCBzaXplb2YoRVhQOTAwKSAvIHNpemVvZihGWF9JTlQzMik7IGkrKykgew0KKyAgICAgICAgRVhQOTAwW2ldID0gRVhQOTAwW2kgLSAxXSAqIG5pbmVIdW5kcmVkOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6RmluYWxpemUoKQ0KK3sNCit9DQorQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6Q0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpDQorew0KK30NCitDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjp+Q0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpDQorew0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIENGWF9CeXRlU3RyaW5nIGVjTGV2ZWwsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgICBGWF9JTlQzMiBjb2RlSW5kZXggPSAxOw0KKyAgICBGWF9JTlQzMiBjb2RlID0gY29kZXdvcmRzLkdldEF0KGNvZGVJbmRleCk7DQorICAgIGNvZGVJbmRleCsrOw0KKyAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIHJlc3VsdE1ldGFkYXRhID0gRlhfTkVXIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTsNCisgICAgd2hpbGUgKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgew0KKyAgICAgICAgc3dpdGNoIChjb2RlKSB7DQorICAgICAgICAgICAgY2FzZSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgICAgICAgY29kZUluZGV4ID0gdGV4dENvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0g6DQorICAgICAgICAgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIOg0KKyAgICAgICAgICAgICAgICBjb2RlSW5kZXggPSBudW1lcmljQ29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0LCBlKTsNCisgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREU6DQorICAgICAgICAgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzY6DQorICAgICAgICAgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLOg0KKyAgICAgICAgICAgICAgICBjb2RlSW5kZXggPSBkZWNvZGVNYWNyb0Jsb2NrKGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHRNZXRhZGF0YSwgZSk7DQorICAgICAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICAgICAgICBjb2RlSW5kZXggPSB0ZXh0Q29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY29kZUluZGV4IDwgY29kZXdvcmRzLkdldFNpemUoKSkgew0KKyAgICAgICAgICAgIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICAgICAgICBkZWxldGUgcmVzdWx0TWV0YWRhdGE7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9CeXRlQXJyYXkgcmF3Qnl0ZXM7DQorICAgIENGWF9QdHJBcnJheSBieXRlU2VnbWVudHM7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0ICp0ZW1wQ2QgPSBGWF9ORVcgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgICAgdGVtcENkLT5Jbml0KHJhd0J5dGVzLCByZXN1bHQsIGJ5dGVTZWdtZW50cywgZWNMZXZlbCwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHRlbXBDZC0+c2V0T3RoZXIocmVzdWx0TWV0YWRhdGEpOw0KKyAgICByZXR1cm4gdGVtcENkOw0KK30NCitGWF9JTlQzMiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpkZWNvZGVNYWNyb0Jsb2NrKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIEZYX0lOVDMyIGNvZGVJbmRleCwgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiByZXN1bHRNZXRhZGF0YSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoY29kZUluZGV4ICsgTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUyA+IGNvZGV3b3Jkc1swXSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgc2VnbWVudEluZGV4QXJyYXk7DQorICAgIHNlZ21lbnRJbmRleEFycmF5LlNldFNpemUoTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUyk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTOyBpKyssIGNvZGVJbmRleCsrKSB7DQorICAgICAgICBzZWdtZW50SW5kZXhBcnJheS5TZXRBdChpLCBjb2Rld29yZHNbY29kZUluZGV4XSk7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZGVjb2RlQmFzZTkwMHRvQmFzZTEwKHNlZ21lbnRJbmRleEFycmF5LCBOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgICAgcmVzdWx0TWV0YWRhdGEtPnNldFNlZ21lbnRJbmRleChhdG9pKHN0ci5HZXRCdWZmZXIoc3RyLkdldExlbmd0aCgpKSkpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBmaWxlSWQ7DQorICAgIGNvZGVJbmRleCA9IHRleHRDb21wYWN0aW9uKGNvZGV3b3JkcywgY29kZUluZGV4LCBmaWxlSWQpOw0KKyAgICByZXN1bHRNZXRhZGF0YS0+c2V0RmlsZUlkKGZpbGVJZCk7DQorICAgIGlmIChjb2Rld29yZHNbY29kZUluZGV4XSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQpIHsNCisgICAgICAgIGNvZGVJbmRleCsrOw0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3JkczsNCisgICAgICAgIGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHMuU2V0U2l6ZShjb2Rld29yZHNbMF0gLSBjb2RlSW5kZXgpOw0KKyAgICAgICAgRlhfSU5UMzIgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkc0luZGV4ID0gMDsNCisgICAgICAgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQorICAgICAgICB3aGlsZSAoKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgJiYgIWVuZCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICAgICAgICAgIGlmIChjb2RlIDwgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkc1thZGRpdGlvbmFsT3B0aW9uQ29kZVdvcmRzSW5kZXgrK10gPSBjb2RlOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNQUNST19QREY0MTdfVEVSTUlOQVRPUjoNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRNZXRhZGF0YS0+c2V0TGFzdFNlZ21lbnQoVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkgYXJyYXk7DQorICAgICAgICBhcnJheS5TZXRTaXplKGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHNJbmRleCk7DQorICAgICAgICBhcnJheS5Db3B5KGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHMpOw0KKyAgICAgICAgcmVzdWx0TWV0YWRhdGEtPnNldE9wdGlvbmFsRGF0YShhcnJheSk7DQorICAgIH0gZWxzZSBpZiAoY29kZXdvcmRzW2NvZGVJbmRleF0gPT0gTUFDUk9fUERGNDE3X1RFUk1JTkFUT1IpIHsNCisgICAgICAgIHJlc3VsdE1ldGFkYXRhLT5zZXRMYXN0U2VnbWVudChUUlVFKTsNCisgICAgICAgIGNvZGVJbmRleCsrOw0KKyAgICB9DQorICAgIHJldHVybiBjb2RlSW5kZXg7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OnRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIEZYX0lOVDMyIGNvZGVJbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCkNCit7DQorICAgIENGWF9JbnQzMkFycmF5IHRleHRDb21wYWN0aW9uRGF0YTsNCisgICAgdGV4dENvbXBhY3Rpb25EYXRhLlNldFNpemUoKGNvZGV3b3Jkc1swXSAtIGNvZGVJbmRleCkgPDwgMSk7DQorICAgIENGWF9JbnQzMkFycmF5IGJ5dGVDb21wYWN0aW9uRGF0YTsNCisgICAgYnl0ZUNvbXBhY3Rpb25EYXRhLlNldFNpemUoKGNvZGV3b3Jkc1swXSAtIGNvZGVJbmRleCkgPDwgMSk7DQorICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgICAgd2hpbGUgKChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0pICYmICFlbmQpIHsNCisgICAgICAgIEZYX0lOVDMyIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICAgICAgaWYgKGNvZGUgPCBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgICAgIHRleHRDb21wYWN0aW9uRGF0YVtpbmRleF0gPSBjb2RlIC8gMzA7DQorICAgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4ICsgMV0gPSBjb2RlICUgMzA7DQorICAgICAgICAgICAgaW5kZXggKz0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0g6DQorICAgICAgICAgICAgICAgICAgICB0ZXh0Q29tcGFjdGlvbkRhdGFbaW5kZXgrK10gPSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIOg0KKyAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0g6DQorICAgICAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSzoNCisgICAgICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICAgICAgICAgICAgZW5kID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIEJFR0lOX01BQ1JPX1BERjQxN19PUFRJT05BTF9GSUVMRDoNCisgICAgICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICAgICAgICAgICAgZW5kID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIE1BQ1JPX1BERjQxN19URVJNSU5BVE9SOg0KKyAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERToNCisgICAgICAgICAgICAgICAgICAgIHRleHRDb21wYWN0aW9uRGF0YVtpbmRleF0gPSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFOw0KKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgICAgICAgICAgICAgICAgICBieXRlQ29tcGFjdGlvbkRhdGFbaW5kZXhdID0gY29kZTsNCisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82Og0KKyAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGRlY29kZVRleHRDb21wYWN0aW9uKHRleHRDb21wYWN0aW9uRGF0YSwgYnl0ZUNvbXBhY3Rpb25EYXRhLCBpbmRleCwgcmVzdWx0KTsNCisgICAgcmV0dXJuIGNvZGVJbmRleDsNCit9DQordm9pZCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpkZWNvZGVUZXh0Q29tcGFjdGlvbihDRlhfSW50MzJBcnJheSAmdGV4dENvbXBhY3Rpb25EYXRhLCBDRlhfSW50MzJBcnJheSAmYnl0ZUNvbXBhY3Rpb25EYXRhLCBGWF9JTlQzMiBsZW5ndGgsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQpDQorew0KKyAgICBNb2RlIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgTW9kZSBwcmlvclRvU2hpZnRNb2RlID0gQUxQSEE7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICB3aGlsZSAoaSA8IGxlbmd0aCkgew0KKyAgICAgICAgRlhfSU5UMzIgc3ViTW9kZUNoID0gdGV4dENvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgRlhfQ0hBUiBjaCA9IDA7DQorICAgICAgICBzd2l0Y2ggKHN1Yk1vZGUpIHsNCisgICAgICAgICAgICBjYXNlIEFMUEhBOg0KKyAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoIDwgMjYpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gKEZYX0NIQVIpICgnQScgKyBzdWJNb2RlQ2gpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSAyNikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJyAnOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gTE9XRVI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBNSVhFRDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFBTKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JUb1NoaWZ0TW9kZSA9IHN1Yk1vZGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IFBVTkNUX1NISUZUOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBMT1dFUjoNCisgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IDI2KSB7DQorICAgICAgICAgICAgICAgICAgICBjaCA9IChGWF9DSEFSKSAoJ2EnICsgc3ViTW9kZUNoKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gMjYpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9ICcgJzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IEFTKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JUb1NoaWZ0TW9kZSA9IHN1Yk1vZGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBX1NISUZUOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTUwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gTUlYRUQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBQUykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yVG9TaGlmdE1vZGUgPSBzdWJNb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBQVU5DVF9TSElGVDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIGJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgTUlYRUQ6DQorICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPCBQTCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBNSVhFRF9DSEFSU1tzdWJNb2RlQ2hdOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSBQTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBQVU5DVDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnICc7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBMT1dFUjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IEFMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gUFMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gUFVOQ1RfU0hJRlQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSBieXRlQ29tcGFjdGlvbkRhdGFbaV07DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFBVTkNUOg0KKyAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoIDwgUEFMKSB7DQorICAgICAgICAgICAgICAgICAgICBjaCA9IFBVTkNUX0NIQVJTW3N1Yk1vZGVDaF07DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoID09IFBBTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIGJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgQUxQSEFfU0hJRlQ6DQorICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBwcmlvclRvU2hpZnRNb2RlOw0KKyAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoIDwgMjYpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gKEZYX0NIQVIpICgnQScgKyBzdWJNb2RlQ2gpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSAyNikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJyAnOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBQVU5DVF9TSElGVDoNCisgICAgICAgICAgICAgICAgc3ViTW9kZSA9IHByaW9yVG9TaGlmdE1vZGU7DQorICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPCBQQUwpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gUFVOQ1RfQ0hBUlNbc3ViTW9kZUNoXTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gUEFMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2ggIT0gMCkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSBjaDsNCisgICAgICAgIH0NCisgICAgICAgIGkrKzsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpieXRlQ29tcGFjdGlvbihGWF9JTlQzMiBtb2RlLCBDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBGWF9JTlQzMiBjb2RlSW5kZXgsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQpDQorew0KKyAgICBpZiAobW9kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgRlhfSU5UMzIgY291bnQgPSAwOw0KKyAgICAgICAgRlhfSU5UNjQgdmFsdWUgPSAwOw0KKyAgICAgICAgRlhfV09SRCogZGVjb2RlZERhdGEgPSBGWF9BbGxvYyhGWF9XT1JELCA2ICogc2l6ZW9mKEZYX1dPUkQpKTsNCisgICAgICAgIENGWF9JbnQzMkFycmF5IGJ5dGVDb21wYWN0ZWRDb2Rld29yZHM7DQorICAgICAgICBieXRlQ29tcGFjdGVkQ29kZXdvcmRzLlNldFNpemUoNik7DQorICAgICAgICBGWF9CT09MIGVuZCA9IEZBTFNFOw0KKyAgICAgICAgRlhfSU5UMzIgbmV4dENvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICAgICAgd2hpbGUgKChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0pICYmICFlbmQpIHsNCisgICAgICAgICAgICBieXRlQ29tcGFjdGVkQ29kZXdvcmRzW2NvdW50KytdID0gbmV4dENvZGU7DQorICAgICAgICAgICAgdmFsdWUgPSA5MDAgKiB2YWx1ZSArIG5leHRDb2RlOw0KKyAgICAgICAgICAgIG5leHRDb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCisgICAgICAgICAgICBpZiAobmV4dENvZGUgPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgICAgICAgICAgIG5leHRDb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgICAgICAgICAgICBuZXh0Q29kZSA9PSBOVU1FUklDX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fA0KKyAgICAgICAgICAgICAgICAgICAgbmV4dENvZGUgPT0gQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0hfNiB8fA0KKyAgICAgICAgICAgICAgICAgICAgbmV4dENvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCisgICAgICAgICAgICAgICAgICAgIG5leHRDb2RlID09IEJFR0lOX01BQ1JPX1BERjQxN19PUFRJT05BTF9GSUVMRCB8fA0KKyAgICAgICAgICAgICAgICAgICAgbmV4dENvZGUgPT0gTUFDUk9fUERGNDE3X1RFUk1JTkFUT1IpIHsNCisgICAgICAgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKChjb3VudCAlIDUgPT0gMCkgJiYgKGNvdW50ID4gMCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGogPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGogPCA2OyArK2opIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YVs1IC0gal0gPSAoRlhfV09SRCkgKHZhbHVlICUgMjU2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gODsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyArK2opIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpZGVjb2RlZERhdGFbal07DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKGRlY29kZWREYXRhKTsNCisgICAgICAgIGlmIChjb2RlSW5kZXggPT0gY29kZXdvcmRzWzBdICYmIG5leHRDb2RlIDwgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICBieXRlQ29tcGFjdGVkQ29kZXdvcmRzW2NvdW50KytdID0gbmV4dENvZGU7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoRlhfV09SRCkgYnl0ZUNvbXBhY3RlZENvZGV3b3Jkc1tpXTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChtb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYpIHsNCisgICAgICAgIEZYX0lOVDMyIGNvdW50ID0gMDsNCisgICAgICAgIEZYX0lOVDY0IHZhbHVlID0gMDsNCisgICAgICAgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQorICAgICAgICB3aGlsZSAoY29kZUluZGV4IDwgY29kZXdvcmRzWzBdICYmICFlbmQpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBjb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCisgICAgICAgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgICAgIGNvdW50Kys7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gOTAwICogdmFsdWUgKyBjb2RlOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQorICAgICAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKChjb3VudCAlIDUgPT0gMCkgJiYgKGNvdW50ID4gMCkpIHsNCisgICAgICAgICAgICAgICAgRlhfV09SRCogZGVjb2RlZERhdGEgPSBGWF9BbGxvYyhGWF9XT1JELCA2ICogc2l6ZW9mKEZYX1dPUkQpKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaiA9IDA7DQorICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YVs1IC0gal0gPSAoRlhfV09SRCkgKHZhbHVlICYgMHhGRik7DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gODsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpZGVjb2RlZERhdGFbal07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY291bnQgPSAwOw0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKGRlY29kZWREYXRhKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGNvZGVJbmRleDsNCit9DQorRlhfSU5UMzIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6bnVtZXJpY0NvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgRlhfSU5UMzIgY29kZUluZGV4LCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIGNvdW50ID0gMDsNCisgICAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgbnVtZXJpY0NvZGV3b3JkczsNCisgICAgbnVtZXJpY0NvZGV3b3Jkcy5TZXRTaXplKE1BWF9OVU1FUklDX0NPREVXT1JEUyk7DQorICAgIHdoaWxlIChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0gJiYgIWVuZCkgew0KKyAgICAgICAgRlhfSU5UMzIgY29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgICAgICBpZiAoY29kZUluZGV4ID09IGNvZGV3b3Jkc1swXSkgew0KKyAgICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgbnVtZXJpY0NvZGV3b3Jkc1tjb3VudF0gPSBjb2RlOw0KKyAgICAgICAgICAgIGNvdW50Kys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCisgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCisgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIHx8DQorICAgICAgICAgICAgICAgICAgICBjb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQorICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChjb3VudCAlIE1BWF9OVU1FUklDX0NPREVXT1JEUyA9PSAwIHx8DQorICAgICAgICAgICAgICAgIGNvZGUgPT0gTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgICAgICAgZW5kKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcyA9IGRlY29kZUJhc2U5MDB0b0Jhc2UxMChudW1lcmljQ29kZXdvcmRzLCBjb3VudCwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgICAgICAgICAgICByZXN1bHQgKz0gczsNCisgICAgICAgICAgICBjb3VudCA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGNvZGVJbmRleDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlQmFzZTkwMHRvQmFzZTEwKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIEZYX0lOVDMyIGNvdW50LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIHJlc3VsdCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgICAgICByZXN1bHQgKz0gRVhQOTAwW2NvdW50IC0gaSAtIDFdICogY29kZXdvcmRzW2ldOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdFN0cmluZzsNCisgICAgcmVzdWx0U3RyaW5nID0gcmVzdWx0U3RyaW5nLkZvcm1hdEludGVnZXIocmVzdWx0KTsNCisgICAgaWYgKHJlc3VsdFN0cmluZy5HZXRBdCgwKSAhPSAnMScpIHsNCisgICAgICAgIGUgPSAgQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICAgIHJldHVybiAnICc7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdFN0cmluZy5NaWQoMSwgcmVzdWx0U3RyaW5nLkdldExlbmd0aCgpIC0gMSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZmFlZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuY3BwCkBAIC0wLDAgKzEsMjY3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29kZXdvcmQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oIg0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OkFESlVTVF9ST1dfTlVNQkVSX1NLSVAgPSAyOw0KK0NCQ19EZXRlY3Rpb25SZXN1bHQ6OkNCQ19EZXRlY3Rpb25SZXN1bHQoQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhLCBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KQ0KK3sNCisgICAgbV9iYXJjb2RlTWV0YWRhdGEgPSBiYXJjb2RlTWV0YWRhdGE7DQorICAgIG1fYmFyY29kZUNvbHVtbkNvdW50ID0gYmFyY29kZU1ldGFkYXRhLT5nZXRDb2x1bW5Db3VudCgpOw0KKyAgICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQorICAgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5TZXRTaXplKG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMik7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDI7IGkrKykgew0KKyAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2ldID0gTlVMTDsNCisgICAgfQ0KK30NCitDQkNfRGV0ZWN0aW9uUmVzdWx0Ojp+Q0JDX0RldGVjdGlvblJlc3VsdCgpDQorew0KKyAgICBkZWxldGUgbV9ib3VuZGluZ0JveDsNCisgICAgZGVsZXRlIG1fYmFyY29kZU1ldGFkYXRhOw0KKyAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnMuUmVtb3ZlQWxsKCk7DQorfQ0KK0NGWF9QdHJBcnJheSYgQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1ucygpDQorew0KKyAgICBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQoMCkpOw0KKyAgICBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQobV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxKSk7DQorICAgIEZYX0lOVDMyIHVuYWRqdXN0ZWRDb2Rld29yZENvdW50ID0gQ0JDX1BERjQxN0NvbW1vbjo6TUFYX0NPREVXT1JEU19JTl9CQVJDT0RFOw0KKyAgICBGWF9JTlQzMiBwcmV2aW91c1VuYWRqdXN0ZWRDb3VudDsNCisgICAgZG8gew0KKyAgICAgICAgcHJldmlvdXNVbmFkanVzdGVkQ291bnQgPSB1bmFkanVzdGVkQ29kZXdvcmRDb3VudDsNCisgICAgICAgIHVuYWRqdXN0ZWRDb2Rld29yZENvdW50ID0gYWRqdXN0Um93TnVtYmVycygpOw0KKyAgICB9IHdoaWxlICh1bmFkanVzdGVkQ29kZXdvcmRDb3VudCA+IDAgJiYgdW5hZGp1c3RlZENvZGV3b3JkQ291bnQgPCBwcmV2aW91c1VuYWRqdXN0ZWRDb3VudCk7DQorICAgIHJldHVybiBtX2RldGVjdGlvblJlc3VsdENvbHVtbnM7DQorfQ0KK3ZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdDo6c2V0Qm91bmRpbmdCb3goQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCkNCit7DQorICAgIG1fYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveDsNCit9DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXRCb3VuZGluZ0JveCgpDQorew0KKyAgICByZXR1cm4gbV9ib3VuZGluZ0JveDsNCit9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpzZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oRlhfSU5UMzIgYmFyY29kZUNvbHVtbiwgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKQ0KK3sNCisgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dID0gZGV0ZWN0aW9uUmVzdWx0Q29sdW1uOw0KK30NCitDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oRlhfSU5UMzIgYmFyY29kZUNvbHVtbikNCit7DQorICAgIHJldHVybiAoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfRGV0ZWN0aW9uUmVzdWx0Ojp0b1N0cmluZygpDQorew0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4gPSAoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zWzBdOw0KKyAgICBpZiAocm93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwpIHsNCisgICAgICAgIHJvd0luZGljYXRvckNvbHVtbiA9IChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXTsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIGZvciAoRlhfSU5UMzIgY29kZXdvcmRzUm93ID0gMDsgY29kZXdvcmRzUm93IDwgcm93SW5kaWNhdG9yQ29sdW1uLT5nZXRDb2Rld29yZHMoKS0+R2V0U2l6ZSgpOyBjb2Rld29yZHNSb3crKykgew0KKyAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSBjb2Rld29yZHNSb3c7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGJhcmNvZGVDb2x1bW4gPSAwOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAyOyBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICAgICAgICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgICAgfCAgICI7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pLT5nZXRDb2Rld29yZHMoKS0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgICAgICAgICAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiAgICB8ICAgIjsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdCArPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgICAgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0SW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycyhDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pDQorew0KKyAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0Q29sdW1uICE9IE5VTEwpIHsNCisgICAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiopZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKS0+YWRqdXN0Q29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKCptX2JhcmNvZGVNZXRhZGF0YSk7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVycygpDQorew0KKyAgICBGWF9JTlQzMiB1bmFkanVzdGVkQ291bnQgPSBhZGp1c3RSb3dOdW1iZXJzQnlSb3coKTsNCisgICAgaWYgKHVuYWRqdXN0ZWRDb3VudCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxOyBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pLT5nZXRDb2Rld29yZHMoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgY29kZXdvcmRzUm93ID0gMDsgY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCk7IGNvZGV3b3Jkc1JvdysrKSB7DQorICAgICAgICAgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoISgoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICAgICAgICAgIGFkanVzdFJvd051bWJlcnMoYmFyY29kZUNvbHVtbiwgY29kZXdvcmRzUm93LCBjb2Rld29yZHMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KK30NCitGWF9JTlQzMiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJzQnlSb3coKQ0KK3sNCisgICAgYWRqdXN0Um93TnVtYmVyc0Zyb21Cb3RoUkkoKTsNCisgICAgRlhfSU5UMzIgdW5hZGp1c3RlZENvdW50ID0gYWRqdXN0Um93TnVtYmVyc0Zyb21MUkkoKTsNCisgICAgcmV0dXJuIHVuYWRqdXN0ZWRDb3VudCArIGFkanVzdFJvd051bWJlcnNGcm9tUlJJKCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnNGcm9tQm90aFJJKCkNCit7DQorICAgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0gPT0gTlVMTCB8fCBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkqIExSSWNvZGV3b3JkcyA9ICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zWzBdKS0+Z2V0Q29kZXdvcmRzKCk7DQorICAgIENGWF9QdHJBcnJheSogUlJJY29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXSktPmdldENvZGV3b3JkcygpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IExSSWNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBjb2Rld29yZHNSb3crKykgew0KKyAgICAgICAgaWYgKExSSWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSAhPSBOVUxMICYmDQorICAgICAgICAgICAgICAgIFJSSWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSAhPSBOVUxMICYmDQorICAgICAgICAgICAgICAgICgoQ0JDX0NvZGV3b3JkKilMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKSA9PSAoKENCQ19Db2Rld29yZCopUlJJY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKS0+Z2V0Um93TnVtYmVyKCkpIHsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDw9IG1fYmFyY29kZUNvbHVtbkNvdW50OyBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKSgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKS0+Z2V0Q29kZXdvcmRzKCktPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgICAgICAgICAgICAgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyKCgoQ0JDX0NvZGV3b3JkKilMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKSk7DQorICAgICAgICAgICAgICAgIGlmICghY29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKS0+Z2V0Q29kZXdvcmRzKCktPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnNGcm9tUlJJKCkNCit7DQorICAgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB1bmFkanVzdGVkQ291bnQgPSAwOw0KKyAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9ICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdChtX2JhcmNvZGVDb2x1bW5Db3VudCArIDEpKS0+Z2V0Q29kZXdvcmRzKCk7DQorICAgIGZvciAoRlhfSU5UMzIgY29kZXdvcmRzUm93ID0gMDsgY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCk7IGNvZGV3b3Jkc1JvdysrKSB7DQorICAgICAgICBpZiAoY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIHJvd0luZGljYXRvclJvd051bWJlciA9ICgoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgICAgIEZYX0lOVDMyIGludmFsaWRSb3dDb3VudHMgPSAwOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBiYXJjb2RlQ29sdW1uID0gbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxOyBiYXJjb2RlQ29sdW1uID4gMCAmJiBpbnZhbGlkUm93Q291bnRzIDwgQURKVVNUX1JPV19OVU1CRVJfU0tJUDsgYmFyY29kZUNvbHVtbi0tKSB7DQorICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKSgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KGJhcmNvZGVDb2x1bW4pKS0+Z2V0Q29kZXdvcmRzKCktPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgICAgICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgaW52YWxpZFJvd0NvdW50cyA9IGFkanVzdFJvd051bWJlcklmVmFsaWQocm93SW5kaWNhdG9yUm93TnVtYmVyLCBpbnZhbGlkUm93Q291bnRzLCBjb2Rld29yZCk7DQorICAgICAgICAgICAgICAgIGlmICghY29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHVuYWRqdXN0ZWRDb3VudCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiB1bmFkanVzdGVkQ291bnQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnNGcm9tTFJJKCkNCit7DQorICAgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgdW5hZGp1c3RlZENvdW50ID0gMDsNCisgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPSAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgwKSktPmdldENvZGV3b3JkcygpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBjb2Rld29yZHNSb3crKykgew0KKyAgICAgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiByb3dJbmRpY2F0b3JSb3dOdW1iZXIgPSAoKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKS0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgICBGWF9JTlQzMiBpbnZhbGlkUm93Q291bnRzID0gMDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgYmFyY29kZUNvbHVtbiA9IDE7IGJhcmNvZGVDb2x1bW4gPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDEgJiYgaW52YWxpZFJvd0NvdW50cyA8IEFESlVTVF9ST1dfTlVNQkVSX1NLSVA7IGJhcmNvZGVDb2x1bW4rKykgew0KKyAgICAgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKikoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uXSktPmdldENvZGV3b3JkcygpLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgICAgICAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGludmFsaWRSb3dDb3VudHMgPSBhZGp1c3RSb3dOdW1iZXJJZlZhbGlkKHJvd0luZGljYXRvclJvd051bWJlciwgaW52YWxpZFJvd0NvdW50cywgY29kZXdvcmQpOw0KKyAgICAgICAgICAgICAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICAgICAgICAgICAgICB1bmFkanVzdGVkQ291bnQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KK30NCitGWF9JTlQzMiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJJZlZhbGlkKEZYX0lOVDMyIHJvd0luZGljYXRvclJvd051bWJlciwgRlhfSU5UMzIgaW52YWxpZFJvd0NvdW50cywgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCkNCit7DQorICAgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gaW52YWxpZFJvd0NvdW50czsNCisgICAgfQ0KKyAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICBpZiAoY29kZXdvcmQtPmlzVmFsaWRSb3dOdW1iZXIocm93SW5kaWNhdG9yUm93TnVtYmVyKSkgew0KKyAgICAgICAgICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXIocm93SW5kaWNhdG9yUm93TnVtYmVyKTsNCisgICAgICAgICAgICBpbnZhbGlkUm93Q291bnRzID0gMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgKytpbnZhbGlkUm93Q291bnRzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpbnZhbGlkUm93Q291bnRzOw0KK30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnMoRlhfSU5UMzIgYmFyY29kZUNvbHVtbiwgRlhfSU5UMzIgY29kZXdvcmRzUm93LCBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcykNCit7DQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgIENGWF9QdHJBcnJheSogcHJldmlvdXNDb2x1bW5Db2Rld29yZHMgPSAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdChiYXJjb2RlQ29sdW1uIC0gMSkpLT5nZXRDb2Rld29yZHMoKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBuZXh0Q29sdW1uQ29kZXdvcmRzID0gcHJldmlvdXNDb2x1bW5Db2Rld29yZHM7DQorICAgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbiArIDFdICE9IE5VTEwpIHsNCisgICAgICAgIG5leHRDb2x1bW5Db2Rld29yZHMgPSAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uICsgMV0pLT5nZXRDb2Rld29yZHMoKTsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgb3RoZXJDb2Rld29yZHM7DQorICAgIG90aGVyQ29kZXdvcmRzLlNldFNpemUoMTQpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1syXSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1szXSA9IG5leHRDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgIGlmIChjb2Rld29yZHNSb3cgPiAwKSB7DQorICAgICAgICBvdGhlckNvZGV3b3Jkc1swXSA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMSk7DQorICAgICAgICBvdGhlckNvZGV3b3Jkc1s0XSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAxKTsNCisgICAgICAgIG90aGVyQ29kZXdvcmRzWzVdID0gbmV4dENvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMSk7DQorICAgIH0NCisgICAgaWYgKGNvZGV3b3Jkc1JvdyA+IDEpIHsNCisgICAgICAgIG90aGVyQ29kZXdvcmRzWzhdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCisgICAgICAgIG90aGVyQ29kZXdvcmRzWzEwXSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCisgICAgICAgIG90aGVyQ29kZXdvcmRzWzExXSA9IG5leHRDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyAtIDIpOw0KKyAgICB9DQorICAgIGlmIChjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKSAtIDEpIHsNCisgICAgICAgIG90aGVyQ29kZXdvcmRzWzFdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCisgICAgICAgIG90aGVyQ29kZXdvcmRzWzZdID0gcHJldmlvdXNDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyArIDEpOw0KKyAgICAgICAgb3RoZXJDb2Rld29yZHNbN10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCisgICAgfQ0KKyAgICBpZiAoY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCkgLSAyKSB7DQorICAgICAgICBvdGhlckNvZGV3b3Jkc1s5XSA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMik7DQorICAgICAgICBvdGhlckNvZGV3b3Jkc1sxMl0gPSBwcmV2aW91c0NvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMik7DQorICAgICAgICBvdGhlckNvZGV3b3Jkc1sxM10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAyKTsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgb3RoZXJDb2Rld29yZHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENCQ19Db2Rld29yZCogb3RoZXJDb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW90aGVyQ29kZXdvcmRzLkdldEF0KGkpOw0KKyAgICAgICAgaWYgKGFkanVzdFJvd051bWJlcihjb2Rld29yZCwgb3RoZXJDb2Rld29yZCkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfQk9PTCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXIoQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCwgQ0JDX0NvZGV3b3JkKiBvdGhlckNvZGV3b3JkKQ0KK3sNCisgICAgaWYgKG90aGVyQ29kZXdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChvdGhlckNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpICYmIG90aGVyQ29kZXdvcmQtPmdldEJ1Y2tldCgpID09IGNvZGV3b3JkLT5nZXRCdWNrZXQoKSkgew0KKyAgICAgICAgY29kZXdvcmQtPnNldFJvd051bWJlcihvdGhlckNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldEJhcmNvZGVDb2x1bW5Db3VudCgpDQorew0KKyAgICByZXR1cm4gbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldEJhcmNvZGVSb3dDb3VudCgpDQorew0KKyAgICByZXR1cm4gbV9iYXJjb2RlTWV0YWRhdGEtPmdldFJvd0NvdW50KCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldEJhcmNvZGVFQ0xldmVsKCkNCit7DQorICAgIHJldHVybiBtX2JhcmNvZGVNZXRhZGF0YS0+Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2NiYzU4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvZGV3b3JkLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Qm91bmRpbmdCb3guaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCINCitGWF9JTlQzMiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpNQVhfTkVBUkJZX0RJU1RBTkNFID0gNTsNCitDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpDQorew0KKyAgICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQorICAgIG1fY29kZXdvcmRzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgICAgbV9jb2Rld29yZHMtPlNldFNpemUoYm91bmRpbmdCb3gtPmdldE1heFkoKSAtIGJvdW5kaW5nQm94LT5nZXRNaW5ZKCkgKyAxKTsNCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6fkNCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1fY29kZXdvcmRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCisgICAgfQ0KKyAgICBtX2NvZGV3b3Jkcy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX2NvZGV3b3JkczsNCit9DQorQ0JDX0NvZGV3b3JkKiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRDb2Rld29yZE5lYXJieShGWF9JTlQzMiBpbWFnZVJvdykNCit7DQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSBnZXRDb2Rld29yZChpbWFnZVJvdyk7DQorICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gY29kZXdvcmQ7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IE1BWF9ORUFSQllfRElTVEFOQ0U7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgbmVhckltYWdlUm93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpIC0gaTsNCisgICAgICAgIGlmIChuZWFySW1hZ2VSb3cgPj0gMCkgew0KKyAgICAgICAgICAgIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopbV9jb2Rld29yZHMtPkdldEF0KG5lYXJJbWFnZVJvdyk7DQorICAgICAgICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGV3b3JkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG5lYXJJbWFnZVJvdyA9IGltYWdlUm93VG9Db2Rld29yZEluZGV4KGltYWdlUm93KSArIGk7DQorICAgICAgICBpZiAobmVhckltYWdlUm93IDwgbV9jb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgICAgICAgIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopbV9jb2Rld29yZHMtPkdldEF0KG5lYXJJbWFnZVJvdyk7DQorICAgICAgICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGV3b3JkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6aW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoRlhfSU5UMzIgaW1hZ2VSb3cpDQorew0KKyAgICByZXR1cm4gaW1hZ2VSb3cgLSBtX2JvdW5kaW5nQm94LT5nZXRNaW5ZKCk7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmNvZGV3b3JkSW5kZXhUb0ltYWdlUm93KEZYX0lOVDMyIGNvZGV3b3JkSW5kZXgpDQorew0KKyAgICByZXR1cm4gbV9ib3VuZGluZ0JveC0+Z2V0TWluWSgpICsgY29kZXdvcmRJbmRleDsNCit9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpzZXRDb2Rld29yZChGWF9JTlQzMiBpbWFnZVJvdywgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCkNCit7DQorICAgIG1fY29kZXdvcmRzLT5TZXRBdChpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbWFnZVJvdyksIGNvZGV3b3JkKTsNCit9DQorQ0JDX0NvZGV3b3JkKiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRDb2Rld29yZChGWF9JTlQzMiBpbWFnZVJvdykNCit7DQorICAgIHJldHVybiAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpKTsNCit9DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRCb3VuZGluZ0JveCgpDQorew0KKyAgICByZXR1cm4gbV9ib3VuZGluZ0JveDsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRDb2Rld29yZHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fY29kZXdvcmRzOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjp0b1N0cmluZygpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIEZYX0lOVDMyIHJvdyA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaSk7DQorICAgICAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgcm93Ow0KKyAgICAgICAgICAgIHJvdysrOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSByb3c7DQorICAgICAgICByZXN1bHQgKz0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICAgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpOw0KKyAgICAgICAgcm93Kys7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIwMDExCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JvdW5kaW5nQm94LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29kZXdvcmQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCINCitDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjpDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsIEZYX0JPT0wgaXNMZWZ0KQ0KKyAgICA6IENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oYm91bmRpbmdCb3gpDQorew0KKyAgICBtX2lzTGVmdCA9IGlzTGVmdDsNCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6fkNCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oKQ0KK3sNCit9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjpzZXRSb3dOdW1iZXJzKCkNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENCQ19Db2Rld29yZCAqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopbV9jb2Rld29yZHMtPkdldEF0KGkpOw0KKyAgICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjphZGp1c3RDb21wbGV0ZUluZGljYXRvckNvbHVtblJvd051bWJlcnMoQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpDQorew0KKyAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9IGdldENvZGV3b3JkcygpOw0KKyAgICBzZXRSb3dOdW1iZXJzKCk7DQorICAgIHJlbW92ZUluY29ycmVjdENvZGV3b3Jkcyhjb2Rld29yZHMsIGJhcmNvZGVNZXRhZGF0YSk7DQorICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBnZXRCb3VuZGluZ0JveCgpOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9IG1faXNMZWZ0ID8gYm91bmRpbmdCb3gtPmdldFRvcExlZnQoKSA6IGJvdW5kaW5nQm94LT5nZXRUb3BSaWdodCgpOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbSA9IG1faXNMZWZ0ID8gYm91bmRpbmdCb3gtPmdldEJvdHRvbUxlZnQoKSA6IGJvdW5kaW5nQm94LT5nZXRCb3R0b21SaWdodCgpOw0KKyAgICBGWF9JTlQzMiBmaXJzdFJvdyA9IGltYWdlUm93VG9Db2Rld29yZEluZGV4KChGWF9JTlQzMikgdG9wLT5HZXRZKCkpOw0KKyAgICBGWF9JTlQzMiBsYXN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKEZYX0lOVDMyKSBib3R0b20tPkdldFkoKSk7DQorICAgIEZYX0ZMT0FUIGF2ZXJhZ2VSb3dIZWlnaHQgPSAobGFzdFJvdyAtIGZpcnN0Um93KSAvIChGWF9GTE9BVCkgYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCk7DQorICAgIEZYX0lOVDMyIGJhcmNvZGVSb3cgPSAtMTsNCisgICAgRlhfSU5UMzIgbWF4Um93SGVpZ2h0ID0gMTsNCisgICAgRlhfSU5UMzIgY3VycmVudFJvd0hlaWdodCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgY29kZXdvcmRzUm93ID0gZmlyc3RSb3c7IGNvZGV3b3Jkc1JvdyA8IGxhc3RSb3c7IGNvZGV3b3Jkc1JvdysrKSB7DQorICAgICAgICBpZiAoY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgICAgICBGWF9JTlQzMiByb3dEaWZmZXJlbmNlID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpIC0gYmFyY29kZVJvdzsNCisgICAgICAgIGlmIChyb3dEaWZmZXJlbmNlID09IDApIHsNCisgICAgICAgICAgICBjdXJyZW50Um93SGVpZ2h0Kys7DQorICAgICAgICB9IGVsc2UgaWYgKHJvd0RpZmZlcmVuY2UgPT0gMSkgew0KKyAgICAgICAgICAgIG1heFJvd0hlaWdodCA9IG1heFJvd0hlaWdodCA+IGN1cnJlbnRSb3dIZWlnaHQgPyBtYXhSb3dIZWlnaHQgOiBjdXJyZW50Um93SGVpZ2h0Ow0KKyAgICAgICAgICAgIGN1cnJlbnRSb3dIZWlnaHQgPSAxOw0KKyAgICAgICAgICAgIGJhcmNvZGVSb3cgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgICB9IGVsc2UgaWYgKHJvd0RpZmZlcmVuY2UgPCAwKSB7DQorICAgICAgICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZHNSb3csIE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPj0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKHJvd0RpZmZlcmVuY2UgPiBjb2Rld29yZHNSb3cpIHsNCisgICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGNoZWNrZWRSb3dzOw0KKyAgICAgICAgICAgIGlmIChtYXhSb3dIZWlnaHQgPiAyKSB7DQorICAgICAgICAgICAgICAgIGNoZWNrZWRSb3dzID0gKG1heFJvd0hlaWdodCAtIDIpICogcm93RGlmZmVyZW5jZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjaGVja2VkUm93cyA9IHJvd0RpZmZlcmVuY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0JPT0wgY2xvc2VQcmV2aW91c0NvZGV3b3JkRm91bmQgPSBjaGVja2VkUm93cyA+PSBjb2Rld29yZHNSb3c7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8PSBjaGVja2VkUm93cyAmJiAhY2xvc2VQcmV2aW91c0NvZGV3b3JkRm91bmQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICBjbG9zZVByZXZpb3VzQ29kZXdvcmRGb3VuZCA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gaSkgIT0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGNsb3NlUHJldmlvdXNDb2Rld29yZEZvdW5kKSB7DQorICAgICAgICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRzUm93LCBOVUxMKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBiYXJjb2RlUm93ID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICAgICAgICAgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9JTlQzMikgKGF2ZXJhZ2VSb3dIZWlnaHQgKyAwLjUpOw0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6Z2V0Um93SGVpZ2h0cyhGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19CYXJjb2RlTWV0YWRhdGEqIGJhcmNvZGVNZXRhZGF0YSA9IGdldEJhcmNvZGVNZXRhZGF0YSgpOw0KKyAgICBpZiAoYmFyY29kZU1ldGFkYXRhID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdE1ldGFkYXRhOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgYWRqdXN0SW5jb21wbGV0ZUluZGljYXRvckNvbHVtblJvd051bWJlcnMoKmJhcmNvZGVNZXRhZGF0YSk7DQorICAgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgIHJlc3VsdC0+U2V0U2l6ZShiYXJjb2RlTWV0YWRhdGEtPmdldFJvd0NvdW50KCkpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZ2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopZ2V0Q29kZXdvcmRzKCktPkdldEF0KGkpOw0KKyAgICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXN1bHQtPlNldEF0KGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSwgIHJlc3VsdC0+R2V0QXQoY29kZXdvcmQtPmdldFJvd051bWJlcigpKSArIDEpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmFkanVzdEluY29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKQ0KK3sNCisgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IGdldEJvdW5kaW5nQm94KCk7DQorICAgIENCQ19SZXN1bHRQb2ludCogdG9wID0gbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0VG9wTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldFRvcFJpZ2h0KCk7DQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tID0gbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0Qm90dG9tTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldEJvdHRvbVJpZ2h0KCk7DQorICAgIEZYX0lOVDMyIGZpcnN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKEZYX0lOVDMyKSB0b3AtPkdldFkoKSk7DQorICAgIEZYX0lOVDMyIGxhc3RSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleCgoRlhfSU5UMzIpIGJvdHRvbS0+R2V0WSgpKTsNCisgICAgRlhfRkxPQVQgYXZlcmFnZVJvd0hlaWdodCA9IChsYXN0Um93IC0gZmlyc3RSb3cpIC8gKEZYX0ZMT0FUKSBiYXJjb2RlTWV0YWRhdGEuZ2V0Um93Q291bnQoKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPSBnZXRDb2Rld29yZHMoKTsNCisgICAgRlhfSU5UMzIgYmFyY29kZVJvdyA9IC0xOw0KKyAgICBGWF9JTlQzMiBtYXhSb3dIZWlnaHQgPSAxOw0KKyAgICBGWF9JTlQzMiBjdXJyZW50Um93SGVpZ2h0ID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBjb2Rld29yZHNSb3cgPSBmaXJzdFJvdzsgY29kZXdvcmRzUm93IDwgbGFzdFJvdzsgY29kZXdvcmRzUm93KyspIHsNCisgICAgICAgIGlmIChjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgICAgICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXJBc1Jvd0luZGljYXRvckNvbHVtbigpOw0KKyAgICAgICAgRlhfSU5UMzIgcm93RGlmZmVyZW5jZSA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSAtIGJhcmNvZGVSb3c7DQorICAgICAgICBpZiAocm93RGlmZmVyZW5jZSA9PSAwKSB7DQorICAgICAgICAgICAgY3VycmVudFJvd0hlaWdodCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChyb3dEaWZmZXJlbmNlID09IDEpIHsNCisgICAgICAgICAgICBtYXhSb3dIZWlnaHQgPSBtYXhSb3dIZWlnaHQgPiBjdXJyZW50Um93SGVpZ2h0ID8gbWF4Um93SGVpZ2h0IDogY3VycmVudFJvd0hlaWdodDsNCisgICAgICAgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCisgICAgICAgICAgICBiYXJjb2RlUm93ID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPj0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJhcmNvZGVSb3cgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChGWF9JTlQzMikgKGF2ZXJhZ2VSb3dIZWlnaHQgKyAwLjUpOw0KK30NCitDQkNfQmFyY29kZU1ldGFkYXRhKiBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjpnZXRCYXJjb2RlTWV0YWRhdGEoKQ0KK3sNCisgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPSBnZXRDb2Rld29yZHMoKTsNCisgICAgQ0JDX0JhcmNvZGVWYWx1ZSBiYXJjb2RlQ29sdW1uQ291bnQ7DQorICAgIENCQ19CYXJjb2RlVmFsdWUgYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0Ow0KKyAgICBDQkNfQmFyY29kZVZhbHVlIGJhcmNvZGVSb3dDb3VudExvd2VyUGFydDsNCisgICAgQ0JDX0JhcmNvZGVWYWx1ZSBiYXJjb2RlRUNMZXZlbDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGkpOw0KKyAgICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXJBc1Jvd0luZGljYXRvckNvbHVtbigpOw0KKyAgICAgICAgRlhfSU5UMzIgcm93SW5kaWNhdG9yVmFsdWUgPSBjb2Rld29yZC0+Z2V0VmFsdWUoKSAlIDMwOw0KKyAgICAgICAgRlhfSU5UMzIgY29kZXdvcmRSb3dOdW1iZXIgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgICBpZiAoIW1faXNMZWZ0KSB7DQorICAgICAgICAgICAgY29kZXdvcmRSb3dOdW1iZXIgKz0gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoY29kZXdvcmRSb3dOdW1iZXIgJSAzKSB7DQorICAgICAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgICAgICBiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuc2V0VmFsdWUocm93SW5kaWNhdG9yVmFsdWUgKiAzICsgMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICAgICAgYmFyY29kZUVDTGV2ZWwuc2V0VmFsdWUocm93SW5kaWNhdG9yVmFsdWUgLyAzKTsNCisgICAgICAgICAgICAgICAgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LnNldFZhbHVlKHJvd0luZGljYXRvclZhbHVlICUgMyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICAgICAgYmFyY29kZUNvbHVtbkNvdW50LnNldFZhbHVlKHJvd0luZGljYXRvclZhbHVlICsgMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICgoYmFyY29kZUNvbHVtbkNvdW50LmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB8fA0KKyAgICAgICAgICAgIChiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuZ2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHx8DQorICAgICAgICAgICAgKGJhcmNvZGVSb3dDb3VudExvd2VyUGFydC5nZXRWYWx1ZSgpLT5HZXRTaXplKCkgPT0gMCkgfHwNCisgICAgICAgICAgICAoYmFyY29kZUVDTGV2ZWwuZ2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHx8DQorICAgICAgICAgICAgYmFyY29kZUNvbHVtbkNvdW50LmdldFZhbHVlKCktPkdldEF0KDApIDwgMSB8fA0KKyAgICAgICAgICAgIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSArIGJhcmNvZGVSb3dDb3VudExvd2VyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSA8IENCQ19QREY0MTdDb21tb246Ok1JTl9ST1dTX0lOX0JBUkNPREUgfHwNCisgICAgICAgICAgICBiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgKyBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgPiBDQkNfUERGNDE3Q29tbW9uOjpNQVhfUk9XU19JTl9CQVJDT0RFKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEgPSBGWF9ORVcgQ0JDX0JhcmNvZGVNZXRhZGF0YShiYXJjb2RlQ29sdW1uQ291bnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCksIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSwgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApLCBiYXJjb2RlRUNMZXZlbC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSk7DQorICAgIHJlbW92ZUluY29ycmVjdENvZGV3b3Jkcyhjb2Rld29yZHMsICpiYXJjb2RlTWV0YWRhdGEpOw0KKyAgICByZXR1cm4gYmFyY29kZU1ldGFkYXRhOw0KK30NCitGWF9CT09MIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmlzTGVmdCgpDQorew0KKyAgICByZXR1cm4gbV9pc0xlZnQ7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnRvU3RyaW5nKCkNCit7DQorICAgIHJldHVybiAoQ0ZYX0J5dGVTdHJpbmcpIklzTGVmdDogIiArIChDRlhfQnl0ZVN0cmluZyltX2lzTGVmdCArICdcbicgKyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjp0b1N0cmluZygpOw0KK30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnJlbW92ZUluY29ycmVjdENvZGV3b3JkcyhDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcywgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGNvZGV3b3JkUm93ID0gMDsgY29kZXdvcmRSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKTsgY29kZXdvcmRSb3crKykgew0KKyAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRSb3cpOw0KKyAgICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIHJvd0luZGljYXRvclZhbHVlID0gY29kZXdvcmQtPmdldFZhbHVlKCkgJSAzMDsNCisgICAgICAgIEZYX0lOVDMyIGNvZGV3b3JkUm93TnVtYmVyID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICAgICAgaWYgKGNvZGV3b3JkUm93TnVtYmVyID4gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghbV9pc0xlZnQpIHsNCisgICAgICAgICAgICBjb2Rld29yZFJvd051bWJlciArPSAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChjb2Rld29yZFJvd051bWJlciAlIDMpIHsNCisgICAgICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgICAgIGlmIChyb3dJbmRpY2F0b3JWYWx1ZSAqIDMgKyAxICE9IGJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudFVwcGVyUGFydCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgICAgIGlmIChyb3dJbmRpY2F0b3JWYWx1ZSAvIDMgIT0gYmFyY29kZU1ldGFkYXRhLmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRpY2F0b3JWYWx1ZSAlIDMgIT0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50TG93ZXJQYXJ0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRSb3csIE5VTEwpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICAgICAgaWYgKHJvd0luZGljYXRvclZhbHVlICsgMSAhPSBiYXJjb2RlTWV0YWRhdGEuZ2V0Q29sdW1uQ291bnQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZFJvdywgTlVMTCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmNjdiNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3Rvci5jcHAKQEAgLTAsMCArMSwyOTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rvci5oIg0KKyNkZWZpbmUgIElOVEVSR0VSX01BWCAgICAgMjE0NzQ4MzY0Nw0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rvcjo6SU5ERVhFU19TVEFSVF9QQVRURVJOW10gPSB7MCwgNCwgMSwgNX07DQorRlhfSU5UMzIgQ0JDX0RldGVjdG9yOjpJTkRFWEVTX1NUT1BfUEFUVEVSTltdID0gezYsIDIsIDcsIDN9Ow0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rvcjo6SU5URUdFUl9NQVRIX1NISUZUID0gODsNCitGWF9JTlQzMiBDQkNfRGV0ZWN0b3I6OlBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUiA9IDEgPDwgSU5URUdFUl9NQVRIX1NISUZUOw0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rvcjo6TUFYX0FWR19WQVJJQU5DRSA9IChGWF9JTlQzMikgKFBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUiAqIDAuNDJmKTsNCitGWF9JTlQzMiBDQkNfRGV0ZWN0b3I6Ok1BWF9JTkRJVklEVUFMX1ZBUklBTkNFID0gKEZYX0lOVDMyKSAoUEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SICogMC44Zik7DQorRlhfSU5UMzIgQ0JDX0RldGVjdG9yOjpTVEFSVF9QQVRURVJOW10gPSB7OCwgMSwgMSwgMSwgMSwgMSwgMSwgM307DQorRlhfSU5UMzIgQ0JDX0RldGVjdG9yOjpTVE9QX1BBVFRFUk5bXSA9IHs3LCAxLCAxLCAzLCAxLCAxLCAxLCAyLCAxfTsNCitGWF9JTlQzMiBDQkNfRGV0ZWN0b3I6Ok1BWF9QSVhFTF9EUklGVCA9IDM7DQorRlhfSU5UMzIgQ0JDX0RldGVjdG9yOjpNQVhfUEFUVEVSTl9EUklGVCA9IDU7DQorRlhfSU5UMzIgQ0JDX0RldGVjdG9yOjpTS0lQUEVEX1JPV19DT1VOVF9NQVggPSAyNTsNCitGWF9JTlQzMiBDQkNfRGV0ZWN0b3I6OlJPV19TVEVQID0gNTsNCitGWF9JTlQzMiBDQkNfRGV0ZWN0b3I6OkJBUkNPREVfTUlOX0hFSUdIVCA9IDEwOw0KK0NCQ19EZXRlY3Rvcjo6Q0JDX0RldGVjdG9yKCkNCit7DQorfQ0KK0NCQ19EZXRlY3Rvcjo6fkNCQ19EZXRlY3RvcigpDQorew0KK30NCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBGWF9JTlQzMiBoaW50cywgRlhfQk9PTCBtdWx0aXBsZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXggPSBpbWFnZS0+R2V0QmxhY2tNYXRyaXgoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlQ29vcmRpbmF0ZXMgPSBkZXRlY3QobXVsdGlwbGUsIGJpdE1hdHJpeCk7DQorICAgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZXMtPkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICByb3RhdGUxODAoYml0TWF0cml4KTsNCisgICAgICAgIGJhcmNvZGVDb29yZGluYXRlcyA9IGRldGVjdChtdWx0aXBsZSwgYml0TWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoYmFyY29kZUNvb3JkaW5hdGVzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENCQ19QREY0MTdEZXRlY3RvclJlc3VsdCogZGV0ZWN0b3JSZXN1bHQgPSBGWF9ORVcgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KGJpdE1hdHJpeCwgYmFyY29kZUNvb3JkaW5hdGVzKTsNCisgICAgcmV0dXJuIGRldGVjdG9yUmVzdWx0Ow0KK30NCit2b2lkIENCQ19EZXRlY3Rvcjo6cm90YXRlMTgwKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCkNCit7DQorICAgIEZYX0lOVDMyIHdpZHRoID0gYml0TWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBoZWlnaHQgPSBiaXRNYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIGZpcnN0Um93Qml0QXJyYXkgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KHdpZHRoKTsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiBzZWNvbmRSb3dCaXRBcnJheSA9IEZYX05FVyBDQkNfQ29tbW9uQml0QXJyYXkod2lkdGgpOw0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHRtcEJpdEFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheSh3aWR0aCk7DQorICAgIGZvciAoRlhfSU5UMzIgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgPj4gMTsgeSsrKSB7DQorICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHRlbXAgPSBiaXRNYXRyaXgtPkdldFJvdyhoZWlnaHQgLSAxIC0geSwgc2Vjb25kUm93Qml0QXJyYXkpOw0KKyAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiB0ZW1wZmlyc3RSb3cgPSBmaXJzdFJvd0JpdEFycmF5Ow0KKyAgICAgICAgZmlyc3RSb3dCaXRBcnJheSA9IGJpdE1hdHJpeC0+R2V0Um93KHksIHRlbXBmaXJzdFJvdyk7DQorICAgICAgICBkZWxldGUgdGVtcGZpcnN0Um93Ow0KKyAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cgPSBtaXJyb3IodGVtcCwgdG1wQml0QXJyYXkpOw0KKyAgICAgICAgZGVsZXRlIHRlbXA7DQorICAgICAgICBiaXRNYXRyaXgtPlNldFJvdyh5LCByb3cpOw0KKyAgICAgICAgZGVsZXRlIHJvdzsNCisgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93Zmlyc3RSb3cgPSBtaXJyb3IoZmlyc3RSb3dCaXRBcnJheSwgdG1wQml0QXJyYXkpOw0KKyAgICAgICAgYml0TWF0cml4LT5TZXRSb3coaGVpZ2h0IC0gMSAtIHksIHJvd2ZpcnN0Um93KTsNCisgICAgICAgIGRlbGV0ZSByb3dmaXJzdFJvdzsNCisgICAgfQ0KKyAgICBkZWxldGUgdG1wQml0QXJyYXk7DQorICAgIGRlbGV0ZSBmaXJzdFJvd0JpdEFycmF5Ow0KKyAgICBkZWxldGUgc2Vjb25kUm93Qml0QXJyYXk7DQorfQ0KK0NCQ19Db21tb25CaXRBcnJheSogQ0JDX0RldGVjdG9yOjptaXJyb3IoQ0JDX0NvbW1vbkJpdEFycmF5KiBpbnB1dCwgQ0JDX0NvbW1vbkJpdEFycmF5KiByZXN1bHQpDQorew0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheShyZXN1bHQtPkdldFNpemUoKSk7DQorICAgIGFycmF5LT5DbGVhcigpOw0KKyAgICBGWF9JTlQzMiBzaXplID0gaW5wdXQtPkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICAgICAgaWYgKGlucHV0LT5HZXQoaSkpIHsNCisgICAgICAgICAgICBhcnJheS0+U2V0KHNpemUgLSAxIC0gaSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGFycmF5Ow0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KEZYX0JPT0wgbXVsdGlwbGUsIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCkNCit7DQorICAgIENGWF9QdHJBcnJheSogYmFyY29kZUNvb3JkaW5hdGVzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgICAgRlhfSU5UMzIgcm93ID0gMDsNCisgICAgRlhfSU5UMzIgY29sdW1uID0gMDsNCisgICAgRlhfQk9PTCBmb3VuZEJhcmNvZGVJblJvdyA9IEZBTFNFOw0KKyAgICB3aGlsZSAocm93IDwgYml0TWF0cml4LT5HZXRIZWlnaHQoKSkgew0KKyAgICAgICAgQ0ZYX1B0ckFycmF5KiB2ZXJ0aWNlcyA9IGZpbmRWZXJ0aWNlcyhiaXRNYXRyaXgsIHJvdywgY29sdW1uKTsNCisgICAgICAgIGlmICh2ZXJ0aWNlcy0+R2V0QXQoMCkgPT0gTlVMTCAmJiB2ZXJ0aWNlcy0+R2V0QXQoMykgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlmICghZm91bmRCYXJjb2RlSW5Sb3cpIHsNCisgICAgICAgICAgICAgICAgaWYgKHZlcnRpY2VzKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUodmVydGljZXMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3VuZEJhcmNvZGVJblJvdyA9IEZBTFNFOw0KKyAgICAgICAgICAgIGNvbHVtbiA9IDA7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGJhcmNvZGVDb29yZGluYXRlcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlQ29vcmRpbmF0ZSA9IChDRlhfUHRyQXJyYXkqKWJhcmNvZGVDb29yZGluYXRlcy0+R2V0QXQoaSk7DQorICAgICAgICAgICAgICAgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZS0+R2V0QXQoMSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgcm93ID0gcm93ID4gKChDQkNfUmVzdWx0UG9pbnQqKWJhcmNvZGVDb29yZGluYXRlLT5HZXRBdCgxKSktPkdldFkoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoYmFyY29kZUNvb3JkaW5hdGUtPkdldEF0KDMpICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIHJvdyA9IHJvdyA+ICgoQ0JDX1Jlc3VsdFBvaW50KiliYXJjb2RlQ29vcmRpbmF0ZS0+R2V0QXQoMykpLT5HZXRZKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcm93ICs9IFJPV19TVEVQOw0KKyAgICAgICAgICAgIGlmICh2ZXJ0aWNlcykgew0KKyAgICAgICAgICAgICAgICBkZWxldGUodmVydGljZXMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvdW5kQmFyY29kZUluUm93ID0gVFJVRTsNCisgICAgICAgIGJhcmNvZGVDb29yZGluYXRlcy0+QWRkKHZlcnRpY2VzKTsNCisgICAgICAgIGlmICghbXVsdGlwbGUpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh2ZXJ0aWNlcy0+R2V0QXQoMikgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGNvbHVtbiA9IChGWF9JTlQzMikgKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCgyKSktPkdldFgoKTsNCisgICAgICAgICAgICByb3cgPSAoRlhfSU5UMzIpICgoQ0JDX1Jlc3VsdFBvaW50Kil2ZXJ0aWNlcy0+R2V0QXQoMikpLT5HZXRZKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNvbHVtbiA9IChGWF9JTlQzMikgKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCg0KSktPkdldFgoKTsNCisgICAgICAgICAgICByb3cgPSAoRlhfSU5UMzIpICgoQ0JDX1Jlc3VsdFBvaW50Kil2ZXJ0aWNlcy0+R2V0QXQoNCkpLT5HZXRZKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJhcmNvZGVDb29yZGluYXRlczsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyIHN0YXJ0Um93LCBGWF9JTlQzMiBzdGFydENvbHVtbikNCit7DQorICAgIEZYX0lOVDMyIGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICAgIEZYX0lOVDMyIHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgICBDRlhfUHRyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgIHJlc3VsdC0+U2V0U2l6ZSg4KTsNCisgICAgQ0ZYX1B0ckFycmF5KiBzdGFydHB0ciA9ICBmaW5kUm93c1dpdGhQYXR0ZXJuKG1hdHJpeCwgaGVpZ2h0LCB3aWR0aCwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBTVEFSVF9QQVRURVJOLCBzaXplb2YoU1RBUlRfUEFUVEVSTikgLyBzaXplb2YoU1RBUlRfUEFUVEVSTlswXSkpOw0KKyAgICBjb3B5VG9SZXN1bHQocmVzdWx0LCBzdGFydHB0ciwgSU5ERVhFU19TVEFSVF9QQVRURVJOLCBzaXplb2YoSU5ERVhFU19TVEFSVF9QQVRURVJOKSAvIHNpemVvZihJTkRFWEVTX1NUQVJUX1BBVFRFUk5bMF0pKTsNCisgICAgc3RhcnRwdHItPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgc3RhcnRwdHI7DQorICAgIGlmIChyZXN1bHQtPkdldEF0KDQpICE9IE5VTEwpIHsNCisgICAgICAgIHN0YXJ0Q29sdW1uID0gKEZYX0lOVDMyKSAoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCg0KSktPkdldFgoKTsNCisgICAgICAgIHN0YXJ0Um93ID0gKEZYX0lOVDMyKSAoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCg0KSktPkdldFkoKTsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkqICBzdG9wcHRyID0gZmluZFJvd3NXaXRoUGF0dGVybihtYXRyaXgsIGhlaWdodCwgd2lkdGgsIHN0YXJ0Um93LCBzdGFydENvbHVtbiwgU1RPUF9QQVRURVJOLCBzaXplb2YoU1RPUF9QQVRURVJOKSAvIHNpemVvZihTVE9QX1BBVFRFUk5bMF0pKTsNCisgICAgY29weVRvUmVzdWx0KHJlc3VsdCwgc3RvcHB0ciwgSU5ERVhFU19TVE9QX1BBVFRFUk4sIHNpemVvZihJTkRFWEVTX1NUT1BfUEFUVEVSTikgLyBzaXplb2YoSU5ERVhFU19TVE9QX1BBVFRFUk5bMF0pKTsNCisgICAgc3RvcHB0ci0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBzdG9wcHRyOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCit2b2lkIENCQ19EZXRlY3Rvcjo6Y29weVRvUmVzdWx0KENGWF9QdHJBcnJheSAqcmVzdWx0LCBDRlhfUHRyQXJyYXkqIHRtcFJlc3VsdCwgRlhfSU5UMzIqIGRlc3RpbmF0aW9uSW5kZXhlcywgRlhfSU5UMzIgZGVzdGluYXRpb25MZW5ndGgpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZGVzdGluYXRpb25MZW5ndGg7IGkrKykgew0KKyAgICAgICAgcmVzdWx0LT5TZXRBdChkZXN0aW5hdGlvbkluZGV4ZXNbaV0sIHRtcFJlc3VsdC0+R2V0QXQoaSkpOw0KKyAgICB9DQorfQ0KK0NGWF9QdHJBcnJheSogQ0JDX0RldGVjdG9yOjpmaW5kUm93c1dpdGhQYXR0ZXJuKENCQ19Db21tb25CaXRNYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgaGVpZ2h0LCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgc3RhcnRSb3csIEZYX0lOVDMyIHN0YXJ0Q29sdW1uLCBGWF9JTlQzMiogcGF0dGVybiwgRlhfSU5UMzIgcGF0dGVybkxlbmd0aCkNCit7DQorICAgIENGWF9QdHJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgICAgcmVzdWx0LT5TZXRTaXplKDQpOw0KKyAgICBGWF9CT09MIGZvdW5kID0gRkFMU0U7DQorICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgICBjb3VudGVycy5TZXRTaXplKHBhdHRlcm5MZW5ndGgpOw0KKyAgICBmb3IgKDsgc3RhcnRSb3cgPCBoZWlnaHQ7IHN0YXJ0Um93ICs9IFJPV19TVEVQKSB7DQorICAgICAgICBDRlhfSW50MzJBcnJheSogbG9jID0gZmluZEd1YXJkUGF0dGVybihtYXRyaXgsIHN0YXJ0Q29sdW1uLCBzdGFydFJvdywgd2lkdGgsIEZBTFNFLCBwYXR0ZXJuLCBwYXR0ZXJuTGVuZ3RoLCBjb3VudGVycyk7DQorICAgICAgICBpZiAobG9jICE9IE5VTEwpIHsNCisgICAgICAgICAgICB3aGlsZSAoc3RhcnRSb3cgPiAwKSB7DQorICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBwcmV2aW91c1Jvd0xvYyA9IGZpbmRHdWFyZFBhdHRlcm4obWF0cml4LCBzdGFydENvbHVtbiwgLS1zdGFydFJvdywgd2lkdGgsIEZBTFNFLCBwYXR0ZXJuLCBwYXR0ZXJuTGVuZ3RoLCBjb3VudGVycyk7DQorICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1Jvd0xvYyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jOw0KKyAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJldmlvdXNSb3dMb2M7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBzdGFydFJvdysrOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0LT5TZXRBdCgwLCBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVClsb2MtPkdldEF0KDApLCAoRlhfRkxPQVQpc3RhcnRSb3cpKTsNCisgICAgICAgICAgICByZXN1bHQtPlNldEF0KDEsIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKWxvYy0+R2V0QXQoMSksIChGWF9GTE9BVClzdGFydFJvdykpOw0KKyAgICAgICAgICAgIGZvdW5kID0gVFJVRTsNCisgICAgICAgICAgICBkZWxldGUgbG9jOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIHN0b3BSb3cgPSBzdGFydFJvdyArIDE7DQorICAgIGlmIChmb3VuZCkgew0KKyAgICAgICAgRlhfSU5UMzIgc2tpcHBlZFJvd0NvdW50ID0gMDsNCisgICAgICAgIENGWF9JbnQzMkFycmF5IHByZXZpb3VzUm93TG9jOw0KKyAgICAgICAgcHJldmlvdXNSb3dMb2MuQWRkKChGWF9JTlQzMikoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCgwKSktPkdldFgoKSk7DQorICAgICAgICBwcmV2aW91c1Jvd0xvYy5BZGQoKEZYX0lOVDMyKSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDEpKS0+R2V0WCgpKTsNCisgICAgICAgIGZvciAoOyBzdG9wUm93IDwgaGVpZ2h0OyBzdG9wUm93KyspIHsNCisgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogbG9jID0gZmluZEd1YXJkUGF0dGVybihtYXRyaXgsIHByZXZpb3VzUm93TG9jWzBdLCBzdG9wUm93LCB3aWR0aCwgRkFMU0UsIHBhdHRlcm4sIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCisgICAgICAgICAgICBpZiAobG9jICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICAgICAgIGFicyhwcmV2aW91c1Jvd0xvY1swXSAtIGxvYy0+R2V0QXQoMCkpIDwgTUFYX1BBVFRFUk5fRFJJRlQgJiYNCisgICAgICAgICAgICAgICAgICAgIGFicyhwcmV2aW91c1Jvd0xvY1sxXSAtIGxvYy0+R2V0QXQoMSkpIDwgTUFYX1BBVFRFUk5fRFJJRlQpIHsNCisgICAgICAgICAgICAgICAgcHJldmlvdXNSb3dMb2MuQ29weSgqbG9jKTsNCisgICAgICAgICAgICAgICAgc2tpcHBlZFJvd0NvdW50ID0gMDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZFJvd0NvdW50ID4gU0tJUFBFRF9ST1dfQ09VTlRfTUFYKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBza2lwcGVkUm93Q291bnQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWxldGUgbG9jOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RvcFJvdyAtPSBza2lwcGVkUm93Q291bnQgKyAxOw0KKyAgICAgICAgcmVzdWx0LT5TZXRBdCgyLCBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVClwcmV2aW91c1Jvd0xvYy5HZXRBdCgwKSwgKEZYX0ZMT0FUKXN0b3BSb3cpKTsNCisgICAgICAgIHJlc3VsdC0+U2V0QXQoMywgRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpcHJldmlvdXNSb3dMb2MuR2V0QXQoMSksIChGWF9GTE9BVClzdG9wUm93KSk7DQorICAgIH0NCisgICAgaWYgKHN0b3BSb3cgLSBzdGFydFJvdyA8IEJBUkNPREVfTUlOX0hFSUdIVCkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHJlc3VsdC0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICByZXN1bHQtPlNldEF0KGksIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiBjb2x1bW4sIEZYX0lOVDMyIHJvdywgRlhfSU5UMzIgd2lkdGgsIEZYX0JPT0wgd2hpdGVGaXJzdCwgRlhfSU5UMzIqIHBhdHRlcm4sIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGgsIENGWF9JbnQzMkFycmF5ICZjb3VudGVycykNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgY291bnRlcnMuU2V0QXQoaSwgMCk7DQorICAgIH0NCisgICAgRlhfQk9PTCBpc1doaXRlID0gd2hpdGVGaXJzdDsNCisgICAgRlhfSU5UMzIgcGF0dGVyblN0YXJ0ID0gY29sdW1uOw0KKyAgICBGWF9JTlQzMiBwaXhlbERyaWZ0ID0gMDsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGludGFycmF5ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICB3aGlsZSAobWF0cml4LT5HZXQocGF0dGVyblN0YXJ0LCByb3cpICYmIHBhdHRlcm5TdGFydCA+IDAgJiYgcGl4ZWxEcmlmdCsrIDwgTUFYX1BJWEVMX0RSSUZUKSB7DQorICAgICAgICBwYXR0ZXJuU3RhcnQtLTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB4ID0gcGF0dGVyblN0YXJ0Ow0KKyAgICBGWF9JTlQzMiBjb3VudGVyUG9zaXRpb24gPSAwOw0KKyAgICBmb3IgKDsgeCA8IHdpZHRoOyB4KyspIHsNCisgICAgICAgIEZYX0JPT0wgcGl4ZWwgPSBtYXRyaXgtPkdldCh4LCByb3cpOw0KKyAgICAgICAgaWYgKHBpeGVsIF4gaXNXaGl0ZSkgew0KKyAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0rKzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICAgICAgICAgICAgICBpZiAocGF0dGVybk1hdGNoVmFyaWFuY2UoY291bnRlcnMsIHBhdHRlcm4sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8IE1BWF9BVkdfVkFSSUFOQ0UpIHsNCisgICAgICAgICAgICAgICAgICAgIGludGFycmF5LT5BZGQocGF0dGVyblN0YXJ0KTsNCisgICAgICAgICAgICAgICAgICAgIGludGFycmF5LT5BZGQoeCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50YXJyYXk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJzWzBdICsgY291bnRlcnNbMV07DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgbCA9IDIsIGsgPSAwOyBsIDwgcGF0dGVybkxlbmd0aDsgbCsrLCBrKyspIHsNCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzLlNldEF0KGssIGNvdW50ZXJzLkdldEF0KGwpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb3VudGVycy5TZXRBdChwYXR0ZXJuTGVuZ3RoIC0gMiwgMCk7DQorICAgICAgICAgICAgICAgIGNvdW50ZXJzLlNldEF0KHBhdHRlcm5MZW5ndGggLSAxLCAwKTsNCisgICAgICAgICAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQorICAgICAgICBpZiAocGF0dGVybk1hdGNoVmFyaWFuY2UoY291bnRlcnMsIHBhdHRlcm4sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8IE1BWF9BVkdfVkFSSUFOQ0UpIHsNCisgICAgICAgICAgICBpbnRhcnJheS0+QWRkKHBhdHRlcm5TdGFydCk7DQorICAgICAgICAgICAgaW50YXJyYXktPkFkZCh4IC0gMSk7DQorICAgICAgICAgICAgcmV0dXJuIGludGFycmF5Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGRlbGV0ZSBpbnRhcnJheTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0lOVDMyIENCQ19EZXRlY3Rvcjo6cGF0dGVybk1hdGNoVmFyaWFuY2UoQ0ZYX0ludDMyQXJyYXkgJmNvdW50ZXJzLCBGWF9JTlQzMiogcGF0dGVybiwgRlhfSU5UMzIgbWF4SW5kaXZpZHVhbFZhcmlhbmNlKQ0KK3sNCisgICAgRlhfSU5UMzIgbnVtQ291bnRlcnMgPSBjb3VudGVycy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIHRvdGFsID0gMDsNCisgICAgRlhfSU5UMzIgcGF0dGVybkxlbmd0aCA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgICAgICB0b3RhbCArPSBjb3VudGVyc1tpXTsNCisgICAgICAgIHBhdHRlcm5MZW5ndGggKz0gcGF0dGVybltpXTsNCisgICAgfQ0KKyAgICBpZiAodG90YWwgPCBwYXR0ZXJuTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gSU5URVJHRVJfTUFYOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHVuaXRCYXJXaWR0aCA9ICh0b3RhbCA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gcGF0dGVybkxlbmd0aDsNCisgICAgbWF4SW5kaXZpZHVhbFZhcmlhbmNlID0gKG1heEluZGl2aWR1YWxWYXJpYW5jZSAqIHVuaXRCYXJXaWR0aCkgPj4gSU5URUdFUl9NQVRIX1NISUZUOw0KKyAgICBGWF9JTlQzMiB0b3RhbFZhcmlhbmNlID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiB4ID0gMDsgeCA8IG51bUNvdW50ZXJzOyB4KyspIHsNCisgICAgICAgIEZYX0lOVDMyIGNvdW50ZXIgPSBjb3VudGVyc1t4XSA8PCBJTlRFR0VSX01BVEhfU0hJRlQ7DQorICAgICAgICBGWF9JTlQzMiBzY2FsZWRQYXR0ZXJuID0gcGF0dGVyblt4XSAqIHVuaXRCYXJXaWR0aDsNCisgICAgICAgIEZYX0lOVDMyIHZhcmlhbmNlID0gY291bnRlciA+IHNjYWxlZFBhdHRlcm4gPyBjb3VudGVyIC0gc2NhbGVkUGF0dGVybiA6IHNjYWxlZFBhdHRlcm4gLSBjb3VudGVyOw0KKyAgICAgICAgaWYgKHZhcmlhbmNlID4gbWF4SW5kaXZpZHVhbFZhcmlhbmNlKSB7DQorICAgICAgICAgICAgcmV0dXJuIElOVEVSR0VSX01BWDsNCisgICAgICAgIH0NCisgICAgICAgIHRvdGFsVmFyaWFuY2UgKz0gdmFyaWFuY2U7DQorICAgIH0NCisgICAgcmV0dXJuIHRvdGFsVmFyaWFuY2UgLyB0b3RhbDsNCit9DQorDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1MWY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCINCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6OkNCQ19QREY0MTdEZXRlY3RvclJlc3VsdChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLCBDRlhfUHRyQXJyYXkqIHBvaW50cykNCit7DQorICAgIG1fYml0cyA9IGJpdHM7DQorICAgIG1fcG9pbnRzID0gcG9pbnRzOw0KK30NCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6On5DQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1fcG9pbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gKENGWF9QdHJBcnJheSopbV9wb2ludHMtPkdldEF0KGkpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IHRlbXAtPkdldFNpemUoKTsgaisrKSB7DQorICAgICAgICAgICAgZGVsZXRlIChDQkNfUmVzdWx0UG9pbnQqKXRlbXAtPkdldEF0KGopOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGVtcC0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgdGVtcDsNCisgICAgfQ0KKyAgICBtX3BvaW50cy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BvaW50czsNCit9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0OjpnZXRCaXRzKCkNCit7DQorICAgIHJldHVybiBtX2JpdHM7DQorfQ0KKw0KK0NGWF9QdHJBcnJheSogQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0OjpnZXRQb2ludHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcG9pbnRzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGltZW5zaW9ucy5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RGltZW5zaW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1NDAwYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdEaW1lbnNpb25zLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGltZW5zaW9ucy5oIg0KK0NCQ19EaW1lbnNpb25zOjpDQkNfRGltZW5zaW9ucyhGWF9JTlQzMiBtaW5Db2xzLCBGWF9JTlQzMiBtYXhDb2xzLCBGWF9JTlQzMiBtaW5Sb3dzLCBGWF9JTlQzMiBtYXhSb3dzKQ0KK3sNCisgICAgbV9taW5Db2xzID0gbWluQ29sczsNCisgICAgbV9tYXhDb2xzID0gbWF4Q29sczsNCisgICAgbV9taW5Sb3dzID0gbWluUm93czsNCisgICAgbV9tYXhSb3dzID0gbWF4Um93czsNCit9DQorQ0JDX0RpbWVuc2lvbnM6On5DQkNfRGltZW5zaW9ucygpDQorew0KK30NCitGWF9JTlQzMiBDQkNfRGltZW5zaW9uczo6Z2V0TWluQ29scygpDQorew0KKyAgICByZXR1cm4gbV9taW5Db2xzOw0KK30NCitGWF9JTlQzMiBDQkNfRGltZW5zaW9uczo6Z2V0TWF4Q29scygpDQorew0KKyAgICByZXR1cm4gbV9tYXhDb2xzOw0KK30NCitGWF9JTlQzMiBDQkNfRGltZW5zaW9uczo6Z2V0TWluUm93cygpDQorew0KKyAgICByZXR1cm4gbV9taW5Sb3dzOw0KK30NCitGWF9JTlQzMiBDQkNfRGltZW5zaW9uczo6Z2V0TWF4Um93cygpDQorew0KKyAgICByZXR1cm4gbV9tYXhSb3dzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDIyZDc3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmNwcApAQCAtMCwwICsxLDM1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ01vZHVsdXNHRi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgiDQorQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246Om1fZmllbGQgPSBOVUxMOw0KK3ZvaWQgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgbV9maWVsZCA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzR0YoQ0JDX1BERjQxN0NvbW1vbjo6TlVNQkVSX09GX0NPREVXT1JEUywgMywgZSk7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpDQorew0KKyAgICBkZWxldGUgbV9maWVsZDsNCit9DQorQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24oKQ0KK3sNCit9DQorQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjp+Q0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZGVjb2RlKENGWF9JbnQzMkFycmF5ICZyZWNlaXZlZCwgRlhfSU5UMzIgbnVtRUNDb2Rld29yZHMsIENGWF9JbnQzMkFycmF5ICZlcmFzdXJlcywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSBwb2x5KG1fZmllbGQsIHJlY2VpdmVkLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgUzsNCisgICAgUy5TZXRTaXplKG51bUVDQ29kZXdvcmRzKTsNCisgICAgRlhfQk9PTCBlcnJvciA9IEZBTFNFOw0KKyAgICBmb3IgKEZYX0lOVDMyIGwgPSBudW1FQ0NvZGV3b3JkczsgbCA+IDA7IGwtLSkgew0KKyAgICAgICAgRlhfSU5UMzIgZXZhbCA9IHBvbHkuZXZhbHVhdGVBdChtX2ZpZWxkLT5leHAobCkpOw0KKyAgICAgICAgU1tudW1FQ0NvZGV3b3JkcyAtIGxdID0gZXZhbDsNCisgICAgICAgIGlmIChldmFsICE9IDApIHsNCisgICAgICAgICAgICBlcnJvciA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFlcnJvcikgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHN5bmRyb21lID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIFMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYnVpbGRtb25vbWlhbCA9IG1fZmllbGQtPmJ1aWxkTW9ub21pYWwobnVtRUNDb2Rld29yZHMsIDEsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBkZWxldGUgc3luZHJvbWU7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5KiBzaWdtYU9tZWdhID0gcnVuRXVjbGlkZWFuQWxnb3JpdGhtKGJ1aWxkbW9ub21pYWwsIHN5bmRyb21lLCBudW1FQ0NvZGV3b3JkcywgZSk7DQorICAgIGRlbGV0ZSBidWlsZG1vbm9taWFsOw0KKyAgICBkZWxldGUgc3luZHJvbWU7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAtMSk7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzaWdtYSA9IChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoMCk7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvbWVnYSA9IChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoMSk7DQorICAgIENGWF9JbnQzMkFycmF5KiBlcnJvckxvY2F0aW9ucyA9IGZpbmRFcnJvckxvY2F0aW9ucyhzaWdtYSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGRlbGV0ZSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgc2lnbWFPbWVnYTsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBDRlhfSW50MzJBcnJheSogZXJyb3JNYWduaXR1ZGVzID0gZmluZEVycm9yTWFnbml0dWRlcyhvbWVnYSwgc2lnbWEsICplcnJvckxvY2F0aW9ucywgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGRlbGV0ZSBlcnJvckxvY2F0aW9uczsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGRlbGV0ZSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgc2lnbWFPbWVnYTsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZXJyb3JMb2NhdGlvbnMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBsb2cgPSBtX2ZpZWxkLT5sb2coZXJyb3JMb2NhdGlvbnMtPkdldEF0KGkpLCBlKTs7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICAgICAgRlhfSU5UMzIgcG9zaXRpb24gPSByZWNlaXZlZC5HZXRTaXplKCkgLSAxIC0gbG9nOw0KKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICAgICAgICAgIGRlbGV0ZSBlcnJvckxvY2F0aW9uczsNCisgICAgICAgICAgICBkZWxldGUgZXJyb3JNYWduaXR1ZGVzOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdChqKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgZGVsZXRlIHNpZ21hT21lZ2E7DQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVjZWl2ZWRbcG9zaXRpb25dID0gbV9maWVsZC0+c3VidHJhY3QocmVjZWl2ZWRbcG9zaXRpb25dLCBlcnJvck1hZ25pdHVkZXMtPkdldEF0KGkpKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiByZXN1bHQgPSBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOw0KKyAgICBkZWxldGUgZXJyb3JMb2NhdGlvbnM7DQorICAgIGRlbGV0ZSBlcnJvck1hZ25pdHVkZXM7DQorICAgIGZvciAoRlhfSU5UMzIgayA9IDA7IGsgPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGsrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoayk7DQorICAgIH0NCisgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBzaWdtYU9tZWdhOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6cnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBhLCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYiwgRlhfSU5UMzIgUiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoYS0+Z2V0RGVncmVlKCkgPCBiLT5nZXREZWdyZWUoKSkgew0KKyAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRlbXAgPSBhOw0KKyAgICAgICAgYSA9IGI7DQorICAgICAgICBiID0gdGVtcDsNCisgICAgfQ0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogckxhc3QgPSBhOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogciA9IGI7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0TGFzdCA9IG1fZmllbGQtPmdldFplcm8oKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHQgPSBtX2ZpZWxkLT5nZXRPbmUoKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHF0ZW1wID0gTlVMTDsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHJ0ZW1wID0gTlVMTDsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHR0ZW1wID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIEZYX0lOVDMyIGogPSAwOw0KKyAgICBGWF9JTlQzMiBtID0gMDsNCisgICAgRlhfSU5UMzIgbiA9IDA7DQorICAgIHdoaWxlIChyLT5nZXREZWdyZWUoKSA+PSBSIC8gMikgew0KKyAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHJMYXN0TGFzdCA9IHJMYXN0Ow0KKyAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRMYXN0TGFzdCA9IHRMYXN0Ow0KKyAgICAgICAgckxhc3QgPSByOw0KKyAgICAgICAgdExhc3QgPSB0Ow0KKyAgICAgICAgbSA9IGk7DQorICAgICAgICBuID0gajsNCisgICAgICAgIGlmIChyTGFzdC0+aXNaZXJvKCkpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCisgICAgICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHIgPSByTGFzdExhc3Q7DQorICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcSA9IG1fZmllbGQtPmdldFplcm8oKTsNCisgICAgICAgIEZYX0lOVDMyIGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSByTGFzdC0+Z2V0Q29lZmZpY2llbnQockxhc3QtPmdldERlZ3JlZSgpKTsNCisgICAgICAgIEZYX0lOVDMyIGRsdEludmVyc2UgPSBtX2ZpZWxkLT5pbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGlmIChxdGVtcCkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKHItPmdldERlZ3JlZSgpID49IHJMYXN0LT5nZXREZWdyZWUoKSAmJiAhci0+aXNaZXJvKCkpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBkZWdyZWVEaWZmID0gci0+Z2V0RGVncmVlKCkgLSByTGFzdC0+Z2V0RGVncmVlKCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgc2NhbGUgPSBtX2ZpZWxkLT5tdWx0aXBseShyLT5nZXRDb2VmZmljaWVudChyLT5nZXREZWdyZWUoKSksIGRsdEludmVyc2UpOw0KKyAgICAgICAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBidWlsZG1vbm9taWFsID0gbV9maWVsZC0+YnVpbGRNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSwgZSk7DQorICAgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBxdGVtcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcSA9IHEtPmFkZChidWlsZG1vbm9taWFsLCBlKTsNCisgICAgICAgICAgICBkZWxldGUgYnVpbGRtb25vbWlhbDsNCisgICAgICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBxdGVtcCA9IHE7DQorICAgICAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG11bHRpcGx5ICA9IHJMYXN0LT5tdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICAgICAgaWYgKHF0ZW1wKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0ZW1wID0gcjsNCisgICAgICAgICAgICByID0gdGVtcC0+c3VidHJhY3QobXVsdGlwbHksIGUpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBtdWx0aXBseTsNCisgICAgICAgICAgICBpZiAobSA+IDEgJiYgaSA+IG0pIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHRlbXA7DQorICAgICAgICAgICAgICAgIHRlbXAgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgICAgIGlmIChxdGVtcCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBydGVtcCA9IHI7DQorICAgICAgICAgICAgaSA9IG0gKyAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdHRlbXAgPSBxLT5tdWx0aXBseSh0TGFzdCwgZSk7DQorICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgICAgICAgcXRlbXAgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdCA9IHR0ZW1wLT5zdWJ0cmFjdCh0TGFzdExhc3QsIGUpOw0KKyAgICAgICAgaWYgKG4gPiAxICYmIGogPiBuKSB7DQorICAgICAgICAgICAgZGVsZXRlIHRMYXN0TGFzdDsNCisgICAgICAgIH0NCisgICAgICAgIGRlbGV0ZSB0dGVtcDsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHR0ZW1wID0gdDsNCisgICAgICAgIHQgPSB0dGVtcC0+bmVnYXRpdmUoZSk7DQorICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICB0dGVtcCA9IHQ7DQorICAgICAgICBqKys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgYWEgPSB0LT5nZXRDb2VmZmljaWVudCgxKTsNCisgICAgRlhfSU5UMzIgc2lnbWFUaWxkZUF0WmVybyA9IHQtPmdldENvZWZmaWNpZW50KDApOw0KKyAgICBpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCisgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGludmVyc2UgPSBtX2ZpZWxkLT5pbnZlcnNlKHNpZ21hVGlsZGVBdFplcm8sIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICB9DQorICAgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogc2lnbWEgPSB0LT5tdWx0aXBseShpbnZlcnNlLCBlKTsNCisgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgIH0NCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG9tZWdhID0gci0+bXVsdGlwbHkoaW52ZXJzZSwgZSk7DQorICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICB9DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBtb2R1bHVzUG9seSA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgIG1vZHVsdXNQb2x5LT5BZGQoc2lnbWEpOw0KKyAgICBtb2R1bHVzUG9seS0+QWRkKG9tZWdhKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpmaW5kRXJyb3JMb2NhdGlvbnMoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGVycm9yTG9jYXRvciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBudW1FcnJvcnMgPSBlcnJvckxvY2F0b3ItPmdldERlZ3JlZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICByZXN1bHQtPlNldFNpemUobnVtRXJyb3JzKTsNCisgICAgRlhfSU5UMzIgZWUgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAxOyBpIDwgbV9maWVsZC0+Z2V0U2l6ZSgpICYmIGVlIDwgbnVtRXJyb3JzOyBpKyspIHsNCisgICAgICAgIGlmIChlcnJvckxvY2F0b3ItPmV2YWx1YXRlQXQoaSkgPT0gMCkgew0KKyAgICAgICAgICAgIHJlc3VsdC0+U2V0QXQoZWUsIG1fZmllbGQtPmludmVyc2UoaSwgZSkpOw0KKyAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVlKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGVlICE9IG51bUVycm9ycykgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgICAgICBkZWxldGUgcmVzdWx0Ow0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZmluZEVycm9yTWFnbml0dWRlcyhDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JFdmFsdWF0b3IsIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckxvY2F0b3IsIENGWF9JbnQzMkFycmF5ICZlcnJvckxvY2F0aW9ucywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBlcnJvckxvY2F0b3JEZWdyZWUgPSBlcnJvckxvY2F0b3ItPmdldERlZ3JlZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBmb3JtYWxEZXJpdmF0aXZlQ29lZmZpY2llbnRzOw0KKyAgICBmb3JtYWxEZXJpdmF0aXZlQ29lZmZpY2llbnRzLlNldFNpemUoZXJyb3JMb2NhdG9yRGVncmVlKTsNCisgICAgZm9yIChGWF9JTlQzMiBsID0gMTsgbCA8PSBlcnJvckxvY2F0b3JEZWdyZWU7IGwrKykgew0KKyAgICAgICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50c1tlcnJvckxvY2F0b3JEZWdyZWUgLSBsXSA9IG1fZmllbGQtPm11bHRpcGx5KGwsIGVycm9yTG9jYXRvci0+Z2V0Q29lZmZpY2llbnQobCkpOw0KKyAgICB9DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5IGZvcm1hbERlcml2YXRpdmUobV9maWVsZCwgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgRlhfSU5UMzIgcyA9IGVycm9yTG9jYXRpb25zLkdldFNpemUoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgICAgcmVzdWx0LT5TZXRTaXplKHMpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgczsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiB4aUludmVyc2UgPSBtX2ZpZWxkLT5pbnZlcnNlKGVycm9yTG9jYXRpb25zW2ldLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBkZWxldGUgcmVzdWx0Ow0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgbnVtZXJhdG9yID0gbV9maWVsZC0+c3VidHJhY3QoMCwgZXJyb3JFdmFsdWF0b3ItPmV2YWx1YXRlQXQoeGlJbnZlcnNlKSk7DQorICAgICAgICBGWF9JTlQzMiBkZW5vbWluYXRvciA9IG1fZmllbGQtPmludmVyc2UoZm9ybWFsRGVyaXZhdGl2ZS5ldmFsdWF0ZUF0KHhpSW52ZXJzZSksIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHQtPlNldEF0KGksIG1fZmllbGQtPm11bHRpcGx5KG51bWVyYXRvciwgZGVub21pbmF0b3IpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RUNNb2R1bHVzR0YuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDTW9kdWx1c0dGLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M0ZjQxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDTW9kdWx1c0dGLmNwcApAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ01vZHVsdXNHRi5oIg0KK0NCQ19QREY0MTdFQ01vZHVsdXNHRiogQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpQREY0MTdfR0YgPSBOVUxMOw0KK3ZvaWQgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpJbml0aWFsaXplKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgUERGNDE3X0dGID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNHRihDQkNfUERGNDE3Q29tbW9uOjpOVU1CRVJfT0ZfQ09ERVdPUkRTLCAzLCBlKTsNCit9DQordm9pZCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OkZpbmFsaXplKCkNCit7DQorICAgIGRlbGV0ZSBQREY0MTdfR0Y7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNHRjo6Q0JDX1BERjQxN0VDTW9kdWx1c0dGKEZYX0lOVDMyIG1vZHVsdXMsIEZYX0lOVDMyIGdlbmVyYXRvciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBtX21vZHVsdXMgPSBtb2R1bHVzOw0KKyAgICBtX2V4cFRhYmxlLlNldFNpemUobW9kdWx1cyk7DQorICAgIG1fbG9nVGFibGUuU2V0U2l6ZShtb2R1bHVzKTsNCisgICAgRlhfSU5UMzIgeCA9IDE7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBtb2R1bHVzOyBpKyspIHsNCisgICAgICAgIG1fZXhwVGFibGVbaV0gPSB4Ow0KKyAgICAgICAgeCA9ICh4ICogZ2VuZXJhdG9yKSAlIG1vZHVsdXM7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IG1vZHVsdXMgLSAxOyBqKyspIHsNCisgICAgICAgIG1fbG9nVGFibGVbbV9leHBUYWJsZVtqXV0gPSBqOw0KKyAgICB9DQorICAgIENGWF9JbnQzMkFycmF5IHplcm87DQorICAgIHplcm8uQWRkKDApOw0KKyAgICBtX3plcm8gPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkodGhpcywgemVybywgZSk7DQorICAgIENGWF9JbnQzMkFycmF5IG9uZTsNCisgICAgb25lLkFkZCgxKTsNCisgICAgbV9vbmUgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkodGhpcywgb25lLCBlKTsNCit9DQorQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjp+Q0JDX1BERjQxN0VDTW9kdWx1c0dGKCkNCit7DQorICAgIGRlbGV0ZSBtX3plcm87DQorICAgIGRlbGV0ZSBtX29uZTsNCit9DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6Z2V0WmVybygpDQorew0KKyAgICByZXR1cm4gbV96ZXJvOw0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpnZXRPbmUoKQ0KK3sNCisgICAgcmV0dXJuIG1fb25lOw0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpidWlsZE1vbm9taWFsKEZYX0lOVDMyIGRlZ3JlZSwgRlhfSU5UMzIgY29lZmZpY2llbnQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGRlZ3JlZSA8IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICAgIGlmIChjb2VmZmljaWVudCA9PSAwKSB7DQorICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX3plcm8tPmdldEZpZWxkKCksIG1femVyby0+Z2V0Q29lZmZpY2llbnRzKCksIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgICB9DQorICAgIENGWF9JbnQzMkFycmF5IGNvZWZmaWNpZW50czsNCisgICAgY29lZmZpY2llbnRzLlNldFNpemUoZGVncmVlICsgMSk7DQorICAgIGNvZWZmaWNpZW50c1swXSA9IGNvZWZmaWNpZW50Ow0KKyAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSh0aGlzLCBjb2VmZmljaWVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBtb2R1bHVzUG9seTsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjphZGQoRlhfSU5UMzIgYSwgRlhfSU5UMzIgYikNCit7DQorICAgIHJldHVybiAoYSArIGIpICUgbV9tb2R1bHVzOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OnN1YnRyYWN0KEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIpDQorew0KKyAgICByZXR1cm4gKG1fbW9kdWx1cyArIGEgLSBiKSAlIG1fbW9kdWx1czsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpleHAoRlhfSU5UMzIgYSkNCit7DQorICAgIHJldHVybiBtX2V4cFRhYmxlW2FdOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmxvZyhGWF9JTlQzMiBhLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChhID09IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9sb2dUYWJsZVthXTsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjppbnZlcnNlKEZYX0lOVDMyIGEsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGEgPT0gMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIHJldHVybiBtX2V4cFRhYmxlW21fbW9kdWx1cyAtIG1fbG9nVGFibGVbYV0gLSAxXTsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjptdWx0aXBseShGWF9JTlQzMiBhLCBGWF9JTlQzMiBiKQ0KK3sNCisgICAgaWYgKGEgPT0gMCB8fCBiID09IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiBtX2V4cFRhYmxlWyhtX2xvZ1RhYmxlW2FdICsgbV9sb2dUYWJsZVtiXSkgJSAobV9tb2R1bHVzIC0gMSldOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmdldFNpemUoKQ0KK3sNCisgICAgcmV0dXJuIG1fbW9kdWx1czsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2RjYzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5jcHAKQEAgLTAsMCArMSwzMDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ01vZHVsdXNHRi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Q0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBmaWVsZCwgQ0ZYX0ludDMyQXJyYXkgJmNvZWZmaWNpZW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoY29lZmZpY2llbnRzLkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIH0NCisgICAgbV9maWVsZCA9IGZpZWxkOw0KKyAgICBGWF9JTlQzMiBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoY29lZmZpY2llbnRzTGVuZ3RoID4gMSAmJiBjb2VmZmljaWVudHNbMF0gPT0gMCkgew0KKyAgICAgICAgRlhfSU5UMzIgZmlyc3ROb25aZXJvID0gMTsNCisgICAgICAgIHdoaWxlIChmaXJzdE5vblplcm8gPCBjb2VmZmljaWVudHNMZW5ndGggJiYgY29lZmZpY2llbnRzW2ZpcnN0Tm9uWmVyb10gPT0gMCkgew0KKyAgICAgICAgICAgIGZpcnN0Tm9uWmVybysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZpcnN0Tm9uWmVybyA9PSBjb2VmZmljaWVudHNMZW5ndGgpIHsNCisgICAgICAgICAgICBtX2NvZWZmaWNpZW50cyA9IGZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2NvZWZmaWNpZW50cy5TZXRTaXplKGNvZWZmaWNpZW50c0xlbmd0aCAtIGZpcnN0Tm9uWmVybyk7DQorICAgICAgICAgICAgRlhfSU5UMzIgbCA9IDA7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gZmlyc3ROb25aZXJvOyBpIDwgZmlyc3ROb25aZXJvICsgbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgbV9jb2VmZmljaWVudHMuU2V0QXQobCwgY29lZmZpY2llbnRzLkdldEF0KGkpKTsNCisgICAgICAgICAgICAgICAgbCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fY29lZmZpY2llbnRzLkNvcHkoY29lZmZpY2llbnRzKTsNCisgICAgfQ0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6fkNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KCkNCit7DQorfQ0KK0NGWF9JbnQzMkFycmF5JiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0Q29lZmZpY2llbnRzKCkNCit7DQorICAgIHJldHVybiBtX2NvZWZmaWNpZW50czsNCit9DQorQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0RmllbGQoKQ0KK3sNCisgICAgcmV0dXJuIG1fZmllbGQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXREZWdyZWUoKQ0KK3sNCisgICAgcmV0dXJuIG1fY29lZmZpY2llbnRzLkdldFNpemUoKSAtIDE7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmlzWmVybygpDQorew0KKyAgICByZXR1cm4gbV9jb2VmZmljaWVudHNbMF0gPT0gMDsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmdldENvZWZmaWNpZW50KEZYX0lOVDMyIGRlZ3JlZSkNCit7DQorICAgIHJldHVybiBtX2NvZWZmaWNpZW50c1ttX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxIC0gZGVncmVlXTsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmV2YWx1YXRlQXQoRlhfSU5UMzIgYSkNCit7DQorICAgIGlmIChhID09IDApIHsNCisgICAgICAgIHJldHVybiBnZXRDb2VmZmljaWVudCgwKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoYSA9PSAxKSB7DQorICAgICAgICBGWF9JTlQzMiByZXN1bHQgPSAwOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBsID0gMDsgbCA8IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsgbCsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgY29lZmZpY2llbnQgPSBtX2NvZWZmaWNpZW50cy5HZXRBdChsKTsNCisgICAgICAgICAgICByZXN1bHQgPSBtX2ZpZWxkLT5hZGQocmVzdWx0LCBjb2VmZmljaWVudCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorICAgIEZYX0lOVDMyIHJlc3VsdCA9IG1fY29lZmZpY2llbnRzWzBdOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgICAgICByZXN1bHQgPSBtX2ZpZWxkLT5hZGQobV9maWVsZC0+bXVsdGlwbHkoYSwgcmVzdWx0KSwgbV9jb2VmZmljaWVudHNbaV0pOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6YWRkKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgICBpZiAoaXNaZXJvKCkpIHsNCisgICAgICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG90aGVyLT5nZXRGaWVsZCgpLCBvdGhlci0+Z2V0Q29lZmZpY2llbnRzKCksIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgICB9DQorICAgIGlmIChvdGhlci0+aXNaZXJvKCkpIHsNCisgICAgICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG1fY29lZmZpY2llbnRzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIHJldHVybiBtb2R1bHVzUG9seTsNCisgICAgfQ0KKyAgICBDRlhfSW50MzJBcnJheSBzbWFsbGVyQ29lZmZpY2llbnRzOw0KKyAgICBzbWFsbGVyQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOw0KKyAgICBDRlhfSW50MzJBcnJheSBsYXJnZXJDb2VmZmljaWVudHM7DQorICAgIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KG90aGVyLT5tX2NvZWZmaWNpZW50cyk7DQorICAgIGlmIChzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKSA+IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkpIHsNCisgICAgICAgIENGWF9JbnQzMkFycmF5IHRlbXA7DQorICAgICAgICB0ZW1wLkNvcHkoc21hbGxlckNvZWZmaWNpZW50cyk7DQorICAgICAgICBzbWFsbGVyQ29lZmZpY2llbnRzLkNvcHkobGFyZ2VyQ29lZmZpY2llbnRzKTsNCisgICAgICAgIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KHRlbXApOw0KKyAgICB9DQorICAgIENGWF9JbnQzMkFycmF5IHN1bURpZmY7DQorICAgIHN1bURpZmYuU2V0U2l6ZShsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpKTsNCisgICAgRlhfSU5UMzIgbGVuZ3RoRGlmZiA9IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBsID0gMDsgbCA8IGxlbmd0aERpZmY7IGwrKykgew0KKyAgICAgICAgc3VtRGlmZi5TZXRBdChsLCBsYXJnZXJDb2VmZmljaWVudHMuR2V0QXQobCkpOw0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IGxlbmd0aERpZmY7IGkgPCBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIHN1bURpZmZbaV0gPSBtX2ZpZWxkLT5hZGQoc21hbGxlckNvZWZmaWNpZW50c1tpIC0gbGVuZ3RoRGlmZl0sIGxhcmdlckNvZWZmaWNpZW50c1tpXSk7DQorICAgIH0NCisgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgc3VtRGlmZiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OnN1YnRyYWN0KENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgICBpZiAob3RoZXItPmlzWmVybygpKSB7DQorICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICAgIH0NCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHBvbHkgID0gb3RoZXItPm5lZ2F0aXZlKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIG1vZHVsdXNQb2x5ID0gYWRkKHBvbHksIGUpOw0KKyAgICBkZWxldGUgcG9seTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6bXVsdGlwbHkoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICAgIGlmIChpc1plcm8oKSB8fCBvdGhlci0+aXNaZXJvKCkpIHsNCisgICAgICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQtPmdldFplcm8oKS0+Z2V0RmllbGQoKSwgbV9maWVsZC0+Z2V0WmVybygpLT5nZXRDb2VmZmljaWVudHMoKSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgYUNvZWZmaWNpZW50czsNCisgICAgYUNvZWZmaWNpZW50cy5Db3B5KG1fY29lZmZpY2llbnRzKTsNCisgICAgRlhfSU5UMzIgYUxlbmd0aCA9IGFDb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBiQ29lZmZpY2llbnRzOw0KKyAgICBiQ29lZmZpY2llbnRzLkNvcHkob3RoZXItPm1fY29lZmZpY2llbnRzKTsNCisgICAgRlhfSU5UMzIgYkxlbmd0aCA9IGJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgICBwcm9kdWN0LlNldFNpemUoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgYUNvZWZmID0gYUNvZWZmaWNpZW50c1tpXTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBiTGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICBwcm9kdWN0W2kgKyBqXSA9IG1fZmllbGQtPmFkZChwcm9kdWN0W2kgKyBqXSwgbV9maWVsZC0+bXVsdGlwbHkoYUNvZWZmLCBiQ29lZmZpY2llbnRzW2pdKSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgcHJvZHVjdCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om5lZ2F0aXZlKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgbmVnYXRpdmVDb2VmZmljaWVudHM7DQorICAgIG5lZ2F0aXZlQ29lZmZpY2llbnRzLlNldFNpemUoc2l6ZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgICAgIG5lZ2F0aXZlQ29lZmZpY2llbnRzW2ldID0gbV9maWVsZC0+c3VidHJhY3QoMCwgbV9jb2VmZmljaWVudHNbaV0pOw0KKyAgICB9DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBuZWdhdGl2ZUNvZWZmaWNpZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om11bHRpcGx5KEZYX0lOVDMyIHNjYWxhciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgICBpZiAoc2NhbGFyID09IDApIHsNCisgICAgICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQtPmdldFplcm8oKS0+Z2V0RmllbGQoKSwgbV9maWVsZC0+Z2V0WmVybygpLT5nZXRDb2VmZmljaWVudHMoKSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICAgIH0NCisgICAgaWYgKHNjYWxhciA9PSAxKSB7DQorICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCisgICAgcHJvZHVjdC5TZXRTaXplKHNpemUpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgICAgICBwcm9kdWN0W2ldID0gbV9maWVsZC0+bXVsdGlwbHkobV9jb2VmZmljaWVudHNbaV0sIHNjYWxhcik7DQorICAgIH0NCisgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgcHJvZHVjdCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om11bHRpcGx5QnlNb25vbWlhbChGWF9JTlQzMiBkZWdyZWUsIEZYX0lOVDMyIGNvZWZmaWNpZW50LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChkZWdyZWUgPCAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgICBpZiAoY29lZmZpY2llbnQgPT0gMCkgew0KKyAgICAgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZC0+Z2V0WmVybygpLT5tX2ZpZWxkLCBtX2ZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIHJldHVybiBtb2R1bHVzUG9seTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgICBwcm9kdWN0LlNldFNpemUoc2l6ZSArIGRlZ3JlZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgICAgIHByb2R1Y3RbaV0gPSBtX2ZpZWxkLT5tdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgY29lZmZpY2llbnQpOw0KKyAgICB9DQorICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBtb2R1bHVzUG9seTsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6ZGl2aWRlKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAob3RoZXItPmlzWmVybygpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25EaXZpZGVCeVplcm87DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcXVvdGllbnQgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZC0+Z2V0WmVybygpLT5tX2ZpZWxkLCBtX2ZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcmVtYWluZGVyID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG1fY29lZmZpY2llbnRzLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZGVsZXRlIHF1b3RpZW50Ow0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZGVub21pbmF0b3JMZWFkaW5nVGVybSA9IG90aGVyLT5nZXRDb2VmZmljaWVudChvdGhlci0+Z2V0RGVncmVlKCkpOw0KKyAgICBGWF9JTlQzMiBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVybSA9IG1fZmllbGQtPmludmVyc2UoZGVub21pbmF0b3JMZWFkaW5nVGVybSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgICAgIGRlbGV0ZSByZW1haW5kZXI7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICB3aGlsZSAocmVtYWluZGVyLT5nZXREZWdyZWUoKSA+PSBvdGhlci0+Z2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+aXNaZXJvKCkpIHsNCisgICAgICAgIEZYX0lOVDMyIGRlZ3JlZURpZmZlcmVuY2UgPSByZW1haW5kZXItPmdldERlZ3JlZSgpIC0gb3RoZXItPmdldERlZ3JlZSgpOw0KKyAgICAgICAgRlhfSU5UMzIgc2NhbGUgPSBtX2ZpZWxkLT5tdWx0aXBseShyZW1haW5kZXItPmdldENvZWZmaWNpZW50KHJlbWFpbmRlci0+Z2V0RGVncmVlKCkpLCBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVybSk7DQorICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdGVybSA9IG90aGVyLT5tdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgICAgICAgICBkZWxldGUgcmVtYWluZGVyOw0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGl0ZXJhdGlvblF1b3RpZW50ID0gbV9maWVsZC0+YnVpbGRNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgZGVsZXRlIHF1b3RpZW50Ow0KKyAgICAgICAgICAgIGRlbGV0ZSByZW1haW5kZXI7DQorICAgICAgICAgICAgZGVsZXRlIHRlcm07DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdGVtcCA9IHF1b3RpZW50Ow0KKyAgICAgICAgcXVvdGllbnQgPSB0ZW1wLT5hZGQoaXRlcmF0aW9uUXVvdGllbnQsIGUpOw0KKyAgICAgICAgZGVsZXRlIGl0ZXJhdGlvblF1b3RpZW50Ow0KKyAgICAgICAgZGVsZXRlIHRlbXA7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgZGVsZXRlIHJlbWFpbmRlcjsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHRlbXAgPSByZW1haW5kZXI7DQorICAgICAgICByZW1haW5kZXIgPSB0ZW1wLT5zdWJ0cmFjdCh0ZXJtLCBlKTsNCisgICAgICAgIGRlbGV0ZSB0ZXJtOw0KKyAgICAgICAgZGVsZXRlIHRlbXA7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgZGVsZXRlIHF1b3RpZW50Ow0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheSogbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgICBtb2R1bHVzUG9seS0+QWRkKHF1b3RpZW50KTsNCisgICAgbW9kdWx1c1BvbHktPkFkZChyZW1haW5kZXIpOw0KKyAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ojp0b1N0cmluZygpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIGZvciAoRlhfSU5UMzIgZGVncmVlID0gZ2V0RGVncmVlKCk7IGRlZ3JlZSA+PSAwOyBkZWdyZWUtLSkgew0KKyAgICAgICAgRlhfSU5UMzIgY29lZmZpY2llbnQgPSBnZXRDb2VmZmljaWVudChkZWdyZWUpOw0KKyAgICAgICAgaWYgKGNvZWZmaWNpZW50ICE9IDApIHsNCisgICAgICAgICAgICBpZiAoY29lZmZpY2llbnQgPCAwKSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiIC0gIjsNCisgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgPSAtY29lZmZpY2llbnQ7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICsgIjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZGVncmVlID09IDAgfHwgY29lZmZpY2llbnQgIT0gMSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gY29lZmZpY2llbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChkZWdyZWUgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBpZiAoZGVncmVlID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAneCc7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gInheIjsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBkZWdyZWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmUxNTEyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCINCitGWF9JTlQzMiBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpFQ19DT0VGRklDSUVOVFNbXVsyNTAwXSA9IHsNCisgICAgezI3LCA5MTd9LA0KKyAgICB7NTIyLCA1NjgsIDcyMywgODA5fSwNCisgICAgezIzNywgMzA4LCA0MzYsIDI4NCwgNjQ2LCA2NTMsIDQyOCwgMzc5fSwNCisgICAgew0KKyAgICAgICAgMjc0LCA1NjIsIDIzMiwgNzU1LCA1OTksIDUyNCwgODAxLCAxMzIsIDI5NSwgMTE2LCA0NDIsIDQyOCwgMjk1LA0KKyAgICAgICAgNDIsIDE3NiwgNjUNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgMzYxLCA1NzUsIDkyMiwgNTI1LCAxNzYsIDU4NiwgNjQwLCAzMjEsIDUzNiwgNzQyLCA2NzcsIDc0MiwgNjg3LA0KKyAgICAgICAgMjg0LCAxOTMsIDUxNywgMjczLCA0OTQsIDI2MywgMTQ3LCA1OTMsIDgwMCwgNTcxLCAzMjAsIDgwMywNCisgICAgICAgIDEzMywgMjMxLCAzOTAsIDY4NSwgMzMwLCA2MywgNDEwDQorICAgIH0sDQorICAgIHsNCisgICAgICAgIDUzOSwgNDIyLCA2LCA5MywgODYyLCA3NzEsIDQ1MywgMTA2LCA2MTAsIDI4NywgMTA3LCA1MDUsIDczMywNCisgICAgICAgIDg3NywgMzgxLCA2MTIsIDcyMywgNDc2LCA0NjIsIDE3MiwgNDMwLCA2MDksIDg1OCwgODIyLCA1NDMsDQorICAgICAgICAzNzYsIDUxMSwgNDAwLCA2NzIsIDc2MiwgMjgzLCAxODQsIDQ0MCwgMzUsIDUxOSwgMzEsIDQ2MCwNCisgICAgICAgIDU5NCwgMjI1LCA1MzUsIDUxNywgMzUyLCA2MDUsIDE1OCwgNjUxLCAyMDEsIDQ4OCwgNTAyLCA2NDgsDQorICAgICAgICA3MzMsIDcxNywgODMsIDQwNCwgOTcsIDI4MCwgNzcxLCA4NDAsIDYyOSwgNCwgMzgxLCA4NDMsDQorICAgICAgICA2MjMsIDI2NCwgNTQzDQorICAgIH0sDQorICAgIHsNCisgICAgICAgIDUyMSwgMzEwLCA4NjQsIDU0NywgODU4LCA1ODAsIDI5NiwgMzc5LCA1MywgNzc5LCA4OTcsIDQ0NCwgNDAwLA0KKyAgICAgICAgOTI1LCA3NDksIDQxNSwgODIyLCA5MywgMjE3LCAyMDgsIDkyOCwgMjQ0LCA1ODMsIDYyMCwgMjQ2LA0KKyAgICAgICAgMTQ4LCA0NDcsIDYzMSwgMjkyLCA5MDgsIDQ5MCwgNzA0LCA1MTYsIDI1OCwgNDU3LCA5MDcsIDU5NCwNCisgICAgICAgIDcyMywgNjc0LCAyOTIsIDI3MiwgOTYsIDY4NCwgNDMyLCA2ODYsIDYwNiwgODYwLCA1NjksIDE5MywNCisgICAgICAgIDIxOSwgMTI5LCAxODYsIDIzNiwgMjg3LCAxOTIsIDc3NSwgMjc4LCAxNzMsIDQwLCAzNzksIDcxMiwNCisgICAgICAgIDQ2MywgNjQ2LCA3NzYsIDE3MSwgNDkxLCAyOTcsIDc2MywgMTU2LCA3MzIsIDk1LCAyNzAsIDQ0NywNCisgICAgICAgIDkwLCA1MDcsIDQ4LCAyMjgsIDgyMSwgODA4LCA4OTgsIDc4NCwgNjYzLCA2MjcsIDM3OCwgMzgyLA0KKyAgICAgICAgMjYyLCAzODAsIDYwMiwgNzU0LCAzMzYsIDg5LCA2MTQsIDg3LCA0MzIsIDY3MCwgNjE2LCAxNTcsDQorICAgICAgICAzNzQsIDI0MiwgNzI2LCA2MDAsIDI2OSwgMzc1LCA4OTgsIDg0NSwgNDU0LCAzNTQsIDEzMCwgODE0LA0KKyAgICAgICAgNTg3LCA4MDQsIDM0LCAyMTEsIDMzMCwgNTM5LCAyOTcsIDgyNywgODY1LCAzNywgNTE3LCA4MzQsDQorICAgICAgICAzMTUsIDU1MCwgODYsIDgwMSwgNCwgMTA4LCA1MzkNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgNTI0LCA4OTQsIDc1LCA3NjYsIDg4MiwgODU3LCA3NCwgMjA0LCA4MiwgNTg2LCA3MDgsIDI1MCwgOTA1LA0KKyAgICAgICAgNzg2LCAxMzgsIDcyMCwgODU4LCAxOTQsIDMxMSwgOTEzLCAyNzUsIDE5MCwgMzc1LCA4NTAsIDQzOCwNCisgICAgICAgIDczMywgMTk0LCAyODAsIDIwMSwgMjgwLCA4MjgsIDc1NywgNzEwLCA4MTQsIDkxOSwgODksIDY4LA0KKyAgICAgICAgNTY5LCAxMSwgMjA0LCA3OTYsIDYwNSwgNTQwLCA5MTMsIDgwMSwgNzAwLCA3OTksIDEzNywgNDM5LA0KKyAgICAgICAgNDE4LCA1OTIsIDY2OCwgMzUzLCA4NTksIDM3MCwgNjk0LCAzMjUsIDI0MCwgMjE2LCAyNTcsIDI4NCwNCisgICAgICAgIDU0OSwgMjA5LCA4ODQsIDMxNSwgNzAsIDMyOSwgNzkzLCA0OTAsIDI3NCwgODc3LCAxNjIsIDc0OSwNCisgICAgICAgIDgxMiwgNjg0LCA0NjEsIDMzNCwgMzc2LCA4NDksIDUyMSwgMzA3LCAyOTEsIDgwMywgNzEyLCAxOSwNCisgICAgICAgIDM1OCwgMzk5LCA5MDgsIDEwMywgNTExLCA1MSwgOCwgNTE3LCAyMjUsIDI4OSwgNDcwLCA2MzcsDQorICAgICAgICA3MzEsIDY2LCAyNTUsIDkxNywgMjY5LCA0NjMsIDgzMCwgNzMwLCA0MzMsIDg0OCwgNTg1LCAxMzYsDQorICAgICAgICA1MzgsIDkwNiwgOTAsIDIsIDI5MCwgNzQzLCAxOTksIDY1NSwgOTAzLCAzMjksIDQ5LCA4MDIsDQorICAgICAgICA1ODAsIDM1NSwgNTg4LCAxODgsIDQ2MiwgMTAsIDEzNCwgNjI4LCAzMjAsIDQ3OSwgMTMwLCA3MzksDQorICAgICAgICA3MSwgMjYzLCAzMTgsIDM3NCwgNjAxLCAxOTIsIDYwNSwgMTQyLCA2NzMsIDY4NywgMjM0LCA3MjIsDQorICAgICAgICAzODQsIDE3NywgNzUyLCA2MDcsIDY0MCwgNDU1LCAxOTMsIDY4OSwgNzA3LCA4MDUsIDY0MSwgNDgsDQorICAgICAgICA2MCwgNzMyLCA2MjEsIDg5NSwgNTQ0LCAyNjEsIDg1MiwgNjU1LCAzMDksIDY5NywgNzU1LCA3NTYsDQorICAgICAgICA2MCwgMjMxLCA3NzMsIDQzNCwgNDIxLCA3MjYsIDUyOCwgNTAzLCAxMTgsIDQ5LCA3OTUsIDMyLA0KKyAgICAgICAgMTQ0LCA1MDAsIDIzOCwgODM2LCAzOTQsIDI4MCwgNTY2LCAzMTksIDksIDY0NywgNTUwLCA3MywNCisgICAgICAgIDkxNCwgMzQyLCAxMjYsIDMyLCA2ODEsIDMzMSwgNzkyLCA2MjAsIDYwLCA2MDksIDQ0MSwgMTgwLA0KKyAgICAgICAgNzkxLCA4OTMsIDc1NCwgNjA1LCAzODMsIDIyOCwgNzQ5LCA3NjAsIDIxMywgNTQsIDI5NywgMTM0LA0KKyAgICAgICAgNTQsIDgzNCwgMjk5LCA5MjIsIDE5MSwgOTEwLCA1MzIsIDYwOSwgODI5LCAxODksIDIwLCAxNjcsDQorICAgICAgICAyOSwgODcyLCA0NDksIDgzLCA0MDIsIDQxLCA2NTYsIDUwNSwgNTc5LCA0ODEsIDE3MywgNDA0LA0KKyAgICAgICAgMjUxLCA2ODgsIDk1LCA0OTcsIDU1NSwgNjQyLCA1NDMsIDMwNywgMTU5LCA5MjQsIDU1OCwgNjQ4LA0KKyAgICAgICAgNTUsIDQ5NywgMTANCisgICAgfSwNCisgICAgew0KKyAgICAgICAgMzUyLCA3NywgMzczLCA1MDQsIDM1LCA1OTksIDQyOCwgMjA3LCA0MDksIDU3NCwgMTE4LCA0OTgsIDI4NSwNCisgICAgICAgIDM4MCwgMzUwLCA0OTIsIDE5NywgMjY1LCA5MjAsIDE1NSwgOTE0LCAyOTksIDIyOSwgNjQzLCAyOTQsDQorICAgICAgICA4NzEsIDMwNiwgODgsIDg3LCAxOTMsIDM1MiwgNzgxLCA4NDYsIDc1LCAzMjcsIDUyMCwgNDM1LA0KKyAgICAgICAgNTQzLCAyMDMsIDY2NiwgMjQ5LCAzNDYsIDc4MSwgNjIxLCA2NDAsIDI2OCwgNzk0LCA1MzQsIDUzOSwNCisgICAgICAgIDc4MSwgNDA4LCAzOTAsIDY0NCwgMTAyLCA0NzYsIDQ5OSwgMjkwLCA2MzIsIDU0NSwgMzcsIDg1OCwNCisgICAgICAgIDkxNiwgNTUyLCA0MSwgNTQyLCAyODksIDEyMiwgMjcyLCAzODMsIDgwMCwgNDg1LCA5OCwgNzUyLA0KKyAgICAgICAgNDcyLCA3NjEsIDEwNywgNzg0LCA4NjAsIDY1OCwgNzQxLCAyOTAsIDIwNCwgNjgxLCA0MDcsIDg1NSwNCisgICAgICAgIDg1LCA5OSwgNjIsIDQ4MiwgMTgwLCAyMCwgMjk3LCA0NTEsIDU5MywgOTEzLCAxNDIsIDgwOCwNCisgICAgICAgIDY4NCwgMjg3LCA1MzYsIDU2MSwgNzYsIDY1MywgODk5LCA3MjksIDU2NywgNzQ0LCAzOTAsIDUxMywNCisgICAgICAgIDE5MiwgNTE2LCAyNTgsIDI0MCwgNTE4LCA3OTQsIDM5NSwgNzY4LCA4NDgsIDUxLCA2MTAsIDM4NCwNCisgICAgICAgIDE2OCwgMTkwLCA4MjYsIDMyOCwgNTk2LCA3ODYsIDMwMywgNTcwLCAzODEsIDQxNSwgNjQxLCAxNTYsDQorICAgICAgICAyMzcsIDE1MSwgNDI5LCA1MzEsIDIwNywgNjc2LCA3MTAsIDg5LCAxNjgsIDMwNCwgNDAyLCA0MCwNCisgICAgICAgIDcwOCwgNTc1LCAxNjIsIDg2NCwgMjI5LCA2NSwgODYxLCA4NDEsIDUxMiwgMTY0LCA0NzcsIDIyMSwNCisgICAgICAgIDkyLCAzNTgsIDc4NSwgMjg4LCAzNTcsIDg1MCwgODM2LCA4MjcsIDczNiwgNzA3LCA5NCwgOCwNCisgICAgICAgIDQ5NCwgMTE0LCA1MjEsIDIsIDQ5OSwgODUxLCA1NDMsIDE1MiwgNzI5LCA3NzEsIDk1LCAyNDgsDQorICAgICAgICAzNjEsIDU3OCwgMzIzLCA4NTYsIDc5NywgMjg5LCA1MSwgNjg0LCA0NjYsIDUzMywgODIwLCA2NjksDQorICAgICAgICA0NSwgOTAyLCA0NTIsIDE2NywgMzQyLCAyNDQsIDE3MywgMzUsIDQ2MywgNjUxLCA1MSwgNjk5LA0KKyAgICAgICAgNTkxLCA0NTIsIDU3OCwgMzcsIDEyNCwgMjk4LCAzMzIsIDU1MiwgNDMsIDQyNywgMTE5LCA2NjIsDQorICAgICAgICA3NzcsIDQ3NSwgODUwLCA3NjQsIDM2NCwgNTc4LCA5MTEsIDI4MywgNzExLCA0NzIsIDQyMCwgMjQ1LA0KKyAgICAgICAgMjg4LCA1OTQsIDM5NCwgNTExLCAzMjcsIDU4OSwgNzc3LCA2OTksIDY4OCwgNDMsIDQwOCwgODQyLA0KKyAgICAgICAgMzgzLCA3MjEsIDUyMSwgNTYwLCA2NDQsIDcxNCwgNTU5LCA2MiwgMTQ1LCA4NzMsIDY2MywgNzEzLA0KKyAgICAgICAgMTU5LCA2NzIsIDcyOSwgNjI0LCA1OSwgMTkzLCA0MTcsIDE1OCwgMjA5LCA1NjMsIDU2NCwgMzQzLA0KKyAgICAgICAgNjkzLCAxMDksIDYwOCwgNTYzLCAzNjUsIDE4MSwgNzcyLCA2NzcsIDMxMCwgMjQ4LCAzNTMsIDcwOCwNCisgICAgICAgIDQxMCwgNTc5LCA4NzAsIDYxNywgODQxLCA2MzIsIDg2MCwgMjg5LCA1MzYsIDM1LCA3NzcsIDYxOCwNCisgICAgICAgIDU4NiwgNDI0LCA4MzMsIDc3LCA1OTcsIDM0NiwgMjY5LCA3NTcsIDYzMiwgNjk1LCA3NTEsIDMzMSwNCisgICAgICAgIDI0NywgMTg0LCA0NSwgNzg3LCA2ODAsIDE4LCA2NiwgNDA3LCAzNjksIDU0LCA0OTIsIDIyOCwNCisgICAgICAgIDYxMywgODMwLCA5MjIsIDQzNywgNTE5LCA2NDQsIDkwNSwgNzg5LCA0MjAsIDMwNSwgNDQxLCAyMDcsDQorICAgICAgICAzMDAsIDg5MiwgODI3LCAxNDEsIDUzNywgMzgxLCA2NjIsIDUxMywgNTYsIDI1MiwgMzQxLCAyNDIsDQorICAgICAgICA3OTcsIDgzOCwgODM3LCA3MjAsIDIyNCwgMzA3LCA2MzEsIDYxLCA4NywgNTYwLCAzMTAsIDc1NiwNCisgICAgICAgIDY2NSwgMzk3LCA4MDgsIDg1MSwgMzA5LCA0NzMsIDc5NSwgMzc4LCAzMSwgNjQ3LCA5MTUsIDQ1OSwNCisgICAgICAgIDgwNiwgNTkwLCA3MzEsIDQyNSwgMjE2LCA1NDgsIDI0OSwgMzIxLCA4ODEsIDY5OSwgNTM1LCA2NzMsDQorICAgICAgICA3ODIsIDIxMCwgODE1LCA5MDUsIDMwMywgODQzLCA5MjIsIDI4MSwgNzMsIDQ2OSwgNzkxLCA2NjAsDQorICAgICAgICAxNjIsIDQ5OCwgMzA4LCAxNTUsIDQyMiwgOTA3LCA4MTcsIDE4NywgNjIsIDE2LCA0MjUsIDUzNSwNCisgICAgICAgIDMzNiwgMjg2LCA0MzcsIDM3NSwgMjczLCA2MTAsIDI5NiwgMTgzLCA5MjMsIDExNiwgNjY3LCA3NTEsDQorICAgICAgICAzNTMsIDYyLCAzNjYsIDY5MSwgMzc5LCA2ODcsIDg0MiwgMzcsIDM1NywgNzIwLCA3NDIsIDMzMCwNCisgICAgICAgIDUsIDM5LCA5MjMsIDMxMSwgNDI0LCAyNDIsIDc0OSwgMzIxLCA1NCwgNjY5LCAzMTYsIDM0MiwNCisgICAgICAgIDI5OSwgNTM0LCAxMDUsIDY2NywgNDg4LCA2NDAsIDY3MiwgNTc2LCA1NDAsIDMxNiwgNDg2LCA3MjEsDQorICAgICAgICA2MTAsIDQ2LCA2NTYsIDQ0NywgMTcxLCA2MTYsIDQ2NCwgMTkwLCA1MzEsIDI5NywgMzIxLCA3NjIsDQorICAgICAgICA3NTIsIDUzMywgMTc1LCAxMzQsIDE0LCAzODEsIDQzMywgNzE3LCA0NSwgMTExLCAyMCwgNTk2LA0KKyAgICAgICAgMjg0LCA3MzYsIDEzOCwgNjQ2LCA0MTEsIDg3NywgNjY5LCAxNDEsIDkxOSwgNDUsIDc4MCwgNDA3LA0KKyAgICAgICAgMTY0LCAzMzIsIDg5OSwgMTY1LCA3MjYsIDYwMCwgMzI1LCA0OTgsIDY1NSwgMzU3LCA3NTIsIDc2OCwNCisgICAgICAgIDIyMywgODQ5LCA2NDcsIDYzLCAzMTAsIDg2MywgMjUxLCAzNjYsIDMwNCwgMjgyLCA3MzgsIDY3NSwNCisgICAgICAgIDQxMCwgMzg5LCAyNDQsIDMxLCAxMjEsIDMwMywgMjYzDQorICAgIH0NCit9Ow0KK0NCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKQ0KK3sNCit9DQorQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6fkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudChGWF9JTlQzMiBlcnJvckNvcnJlY3Rpb25MZXZlbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPCAwIHx8IGVycm9yQ29ycmVjdGlvbkxldmVsID4gOCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRXJyb3JDb3JyZWN0aW9uTGV2ZWxNdXN0QmVCZXR3ZWVuMEFuZDg7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgcmV0dXJuIDEgPDwgKGVycm9yQ29ycmVjdGlvbkxldmVsICsgMSk7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldFJlY29tbWVuZGVkTWluaW11bUVycm9yQ29ycmVjdGlvbkxldmVsKEZYX0lOVDMyIG4sIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKG4gPD0gMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50bk11c3RCZUFib3ZlMDsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAobiA8PSA0MCkgew0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgaWYgKG4gPD0gMTYwKSB7DQorICAgICAgICByZXR1cm4gMzsNCisgICAgfQ0KKyAgICBpZiAobiA8PSAzMjApIHsNCisgICAgICAgIHJldHVybiA0Ow0KKyAgICB9DQorICAgIGlmIChuIDw9IDg2Mykgew0KKyAgICAgICAgcmV0dXJuIDU7DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uTm9SZWNvbW1lbmRhdGlvblBvc3NpYmxlOw0KKyAgICByZXR1cm4gLTE7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdlbmVyYXRlRXJyb3JDb3JyZWN0aW9uKENGWF9XaWRlU3RyaW5nIGRhdGFDb2Rld29yZHMsIEZYX0lOVDMyIGVycm9yQ29ycmVjdGlvbkxldmVsLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIGsgPSBnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICAoRlhfV0NIQVIpJyAnKTsNCisgICAgRlhfV0NIQVIqIGVjaCA9IEZYX0FsbG9jKEZYX1dDSEFSLCBrICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIEZYU1lTX21lbXNldDMyKGVjaCwgMCwgayAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBGWF9JTlQzMiBzbGQgPSBkYXRhQ29kZXdvcmRzLkdldExlbmd0aCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc2xkOyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIHQxID0gKGRhdGFDb2Rld29yZHMuR2V0QXQoaSkgKyBlY2hbayAtIDFdKSAlIDkyOTsNCisgICAgICAgIEZYX0lOVDMyIHQyOw0KKyAgICAgICAgRlhfSU5UMzIgdDM7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSBrIC0gMTsgaiA+PSAxOyBqLS0pIHsNCisgICAgICAgICAgICB0MiA9ICh0MSAqIEVDX0NPRUZGSUNJRU5UU1tlcnJvckNvcnJlY3Rpb25MZXZlbF1bal0pICUgOTI5Ow0KKyAgICAgICAgICAgIHQzID0gOTI5IC0gdDI7DQorICAgICAgICAgICAgZWNoW2pdID0gKEZYX1dDSEFSKSAoKGVjaFtqIC0gMV0gKyB0MykgJSA5MjkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdDIgPSAodDEgKiBFQ19DT0VGRklDSUVOVFNbZXJyb3JDb3JyZWN0aW9uTGV2ZWxdWzBdKSAlIDkyOTsNCisgICAgICAgIHQzID0gOTI5IC0gdDI7DQorICAgICAgICBlY2hbMF0gPSAoRlhfV0NIQVIpICh0MyAlIDkyOSk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IGsgLSAxOyBqID49IDA7IGotLSkgew0KKyAgICAgICAgaWYgKGVjaFtqXSAhPSAwKSB7DQorICAgICAgICAgICAgZWNoW2pdID0gKEZYX1dDSEFSKSAoOTI5IC0gZWNoW2pdKTsNCisgICAgICAgIH0NCisgICAgICAgIHNiICs9IChGWF9XQ0hBUillY2hbal07DQorICAgIH0NCisgICAgRlhfRnJlZSAoZWNoKTsNCisgICAgcmV0dXJuIHNiOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlNjk3NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcApAQCAtMCwwICsxLDQyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbXBhY3Rpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCINCisjZGVmaW5lICBTVUJNT0RFX0FMUEhBICAwDQorI2RlZmluZSAgU1VCTU9ERV9MT1dFUiAgMQ0KKyNkZWZpbmUgIFNVQk1PREVfTUlYRUQgIDINCitGWF9JTlQzMiBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OID0gMDsNCitGWF9JTlQzMiBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6QllURV9DT01QQUNUSU9OID0gMTsNCitGWF9JTlQzMiBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TlVNRVJJQ19DT01QQUNUSU9OID0gMjsNCitGWF9JTlQzMiBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6U1VCTU9ERV9QVU5DVFVBVElPTiA9IDM7DQorRlhfSU5UMzIgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX1RFWFQgPSA5MDA7DQorRlhfSU5UMzIgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0JZVEVfUEFEREVEID0gOTAxOw0KK0ZYX0lOVDMyIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19OVU1FUklDID0gOTAyOw0KK0ZYX0lOVDMyIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpTSElGVF9UT19CWVRFID0gOTEzOw0KK0ZYX0lOVDMyIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CWVRFID0gOTI0Ow0KK0ZYX0JZVEUgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfTUlYRURfUkFXW10gPSB7NDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDM4LCAxMywgOSwgNDQsIDU4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzUsIDQ1LCA0NiwgMzYsIDQ3LCA0MywgMzcsIDQyLCA2MSwgOTQsIDAsIDMyLCAwLCAwLCAwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQorRlhfQllURSBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9QVU5DVFVBVElPTl9SQVdbXSA9IHs1OSwgNjAsIDYyLCA2NCwgOTEsIDkyLCA5MywgOTUsIDk2LCAxMjYsIDMzLCAxMywgOSwgNDQsIDU4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDQ1LCA0NiwgMzYsIDQ3LCAzNCwgMTI0LCA0MiwgNDAsIDQxLCA2MywgMTIzLCAxMjUsIDM5LCAwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQorRlhfSU5UMzIgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6Ok1JWEVEWzEyOF0gPSB7MH07DQorRlhfSU5UMzIgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlBVTkNUVUFUSU9OWzEyOF0gPSB7MH07DQordm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBJbnZlcnNlKCk7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCkNCit7DQorfQ0KK0NCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpDQkNfUERGNDE3SGlnaExldmVsRW5jb2RlcigpDQorew0KK30NCitDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6fkNCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyKCkNCit7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgd2lkZU1zZywgQ29tcGFjdGlvbiBjb21wYWN0aW9uLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzOw0KKyAgICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgod2lkZU1zZywgYnl0ZXMpOw0KKyAgICBDRlhfV2lkZVN0cmluZyBtc2c7DQorICAgIEZYX0lOVDMyIGxlbiA9IGJ5dGVzLkdldExlbmd0aCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gIChGWF9XQ0hBUikoYnl0ZXMuR2V0QXQoaSkgJiAweGZmKTsNCisgICAgICAgIGlmIChjaCA9PSAnPycgJiYgYnl0ZXMuR2V0QXQoaSkgIT0gJz8nKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOw0KKyAgICAgICAgICAgIHJldHVybiAoRlhfTFBXU1RSKSIiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbXNnICs9IGNoOw0KKyAgICB9DQorICAgIENGWF9CeXRlQXJyYXkgYnl0ZUFycjsNCisgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IGJ5dGVzLkdldExlbmd0aCgpOyBrKyspIHsNCisgICAgICAgIGJ5dGVBcnIuQWRkKGJ5dGVzLkdldEF0KGspKTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyBzYjsNCisgICAgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBwID0gMDsNCisgICAgRlhfSU5UMzIgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KKyAgICBpZiAoY29tcGFjdGlvbiA9PSBURVhUKSB7DQorICAgICAgICBlbmNvZGVUZXh0KG1zZywgcCwgbGVuLCBzYiwgdGV4dFN1Yk1vZGUpOw0KKyAgICB9IGVsc2UgaWYgKGNvbXBhY3Rpb24gPT0gQllURVMpIHsNCisgICAgICAgIGVuY29kZUJpbmFyeSgmYnl0ZUFyciwgcCwgYnl0ZUFyci5HZXRTaXplKCksIEJZVEVfQ09NUEFDVElPTiwgc2IpOw0KKyAgICB9IGVsc2UgaWYgKGNvbXBhY3Rpb24gPT0gTlVNRVJJQykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSBMQVRDSF9UT19OVU1FUklDOw0KKyAgICAgICAgZW5jb2RlTnVtZXJpYyhtc2csIHAsIGxlbiwgc2IpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgZW5jb2RpbmdNb2RlID0gTEFUQ0hfVE9fVEVYVDsNCisgICAgICAgIHdoaWxlIChwIDwgbGVuKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgbiA9IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChtc2csIHApOw0KKyAgICAgICAgICAgIGlmIChuID49IDEzKSB7DQorICAgICAgICAgICAgICAgIHNiICs9IChGWF9XQ0hBUikgTEFUQ0hfVE9fTlVNRVJJQzsNCisgICAgICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gTlVNRVJJQ19DT01QQUNUSU9OOw0KKyAgICAgICAgICAgICAgICB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICAgICAgICAgICAgICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBuLCBzYik7DQorICAgICAgICAgICAgICAgIHAgKz0gbjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiB0ID0gZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQobXNnLCBwKTsNCisgICAgICAgICAgICAgICAgaWYgKHQgPj0gNSB8fCBuID09IGxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nTW9kZSAhPSBURVhUX0NPTVBBQ1RJT04pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzYiArPSAoRlhfV0NIQVIpIExBVENIX1RPX1RFWFQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gVEVYVF9DT01QQUNUSU9OOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHRleHRTdWJNb2RlID0gZW5jb2RlVGV4dChtc2csIHAsIHQsIHNiLCB0ZXh0U3ViTW9kZSk7DQorICAgICAgICAgICAgICAgICAgICBwICs9IHQ7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBiID0gZGV0ZXJtaW5lQ29uc2VjdXRpdmVCaW5hcnlDb3VudChtc2csICZieXRlQXJyLCBwLCBlKTsNCisgICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgKEZYX1dDSEFSKScgJyk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYiA9IDE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSAxICYmIGVuY29kaW5nTW9kZSA9PSBURVhUX0NPTVBBQ1RJT04pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIDEsIFRFWFRfQ09NUEFDVElPTiwgc2IpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIGIsIGVuY29kaW5nTW9kZSwgc2IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nTW9kZSA9IEJZVEVfQ09NUEFDVElPTjsNCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwICs9IGI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHNiOw0KK30NCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbnZlcnNlKCkNCit7DQorICAgIEZYX0JZVEUgaSA9IDA7DQorICAgIEZYX0lOVDMyIGwgPSAwOw0KKyAgICBmb3IgKGwgPSAwOyBsIDwgc2l6ZW9mKE1JWEVEKSAvIHNpemVvZihNSVhFRFswXSk7IGwrKykgew0KKyAgICAgICAgTUlYRURbbF0gPSAtMTsNCisgICAgfQ0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFRFWFRfTUlYRURfUkFXKSAvIHNpemVvZihURVhUX01JWEVEX1JBV1swXSk7IGkrKykgew0KKyAgICAgICAgRlhfQllURSBiID0gVEVYVF9NSVhFRF9SQVdbaV07DQorICAgICAgICBpZiAoYiA+IDApIHsNCisgICAgICAgICAgICBNSVhFRFtiXSA9IGk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yIChsID0gMDsgbCA8IHNpemVvZihQVU5DVFVBVElPTikgLyBzaXplb2YoUFVOQ1RVQVRJT05bMF0pOyBsKyspIHsNCisgICAgICAgIFBVTkNUVUFUSU9OW2xdID0gLTE7DQorICAgIH0NCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihURVhUX1BVTkNUVUFUSU9OX1JBVykgLyBzaXplb2YoVEVYVF9QVU5DVFVBVElPTl9SQVdbMF0pOyBpKyspIHsNCisgICAgICAgIEZYX0JZVEUgYiA9IFRFWFRfUFVOQ1RVQVRJT05fUkFXW2ldOw0KKyAgICAgICAgaWYgKGIgPiAwKSB7DQorICAgICAgICAgICAgUFVOQ1RVQVRJT05bYl0gPSBpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NGWF9CeXRlQXJyYXkqIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKQ0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZzsNCisgICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KG1zZywgYnl0ZXN0cmluZyk7DQorICAgIENGWF9CeXRlQXJyYXkqIGJ5dGVhcnJheSA9IEZYX05FVyBDRlhfQnl0ZUFycmF5Ow0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYnl0ZXN0cmluZy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICBieXRlYXJyYXktPkFkZChieXRlc3RyaW5nLkdldEF0KGkpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYnl0ZWFycmF5Ow0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlVGV4dChDRlhfV2lkZVN0cmluZyBtc2csIEZYX0lOVDMyIHN0YXJ0cG9zLCBGWF9JTlQzMiBjb3VudCwgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBGWF9JTlQzMiBpbml0aWFsU3VibW9kZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHRtcDsNCisgICAgRlhfSU5UMzIgc3VibW9kZSA9IGluaXRpYWxTdWJtb2RlOw0KKyAgICBGWF9JTlQzMiBpZHggPSAwOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoc3RhcnRwb3MgKyBpZHgpOw0KKyAgICAgICAgc3dpdGNoIChzdWJtb2RlKSB7DQorICAgICAgICAgICAgY2FzZSBTVUJNT0RFX0FMUEhBOg0KKyAgICAgICAgICAgICAgICBpZiAoaXNBbHBoYVVwcGVyKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI2Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAoY2ggLSA2NSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0xPV0VSOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI3Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc01peGVkKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX01JWEVEOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI4Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyOTsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgU1VCTU9ERV9MT1dFUjoNCisgICAgICAgICAgICAgICAgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyNjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgKGNoIC0gOTcpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWxwaGFVcHBlcihjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyNzsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAoY2ggLSA2NSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTWl4ZWQoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTUlYRUQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjg7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI5Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBTVUJNT0RFX01JWEVEOg0KKyAgICAgICAgICAgICAgICBpZiAoaXNNaXhlZChjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGEgPSAgTUlYRURbY2hdOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgYiA9IChGWF9JTlQzMilhOw0KKyAgICAgICAgICAgICAgICAgICAgdG1wICs9IE1JWEVEW2NoXTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjg7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9MT1dFUjsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyNzsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0cG9zICsgaWR4ICsgMSA8IGNvdW50KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHQgPSBtc2cuR2V0QXQoc3RhcnRwb3MgKyBpZHggKyAxKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHVuY3R1YXRpb24obmV4dCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX1BVTkNUVUFUSU9OOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyOTsNCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKGNoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgdG1wICs9IFBVTkNUVUFUSU9OW2NoXTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KKyAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjk7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWR4Kys7DQorICAgICAgICBpZiAoaWR4ID49IGNvdW50KSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfV0NIQVIgaCA9IDA7DQorICAgIEZYX0lOVDMyIGxlbiA9IHRtcC5HZXRMZW5ndGgoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICBGWF9CT09MIG9kZCA9IChpICUgMikgIT0gMDsNCisgICAgICAgIGlmIChvZGQpIHsNCisgICAgICAgICAgICBoID0gKEZYX1dDSEFSKSAoKGggKiAzMCkgKyB0bXAuR2V0QXQoaSkpOw0KKyAgICAgICAgICAgIHNiICs9IGg7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGggPSB0bXAuR2V0QXQoaSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKChsZW4gJSAyKSAhPSAwKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpICgoaCAqIDMwKSArIDI5KTsNCisgICAgfQ0KKyAgICByZXR1cm4gc3VibW9kZTsNCit9DQordm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlQmluYXJ5KENGWF9CeXRlQXJyYXkqIGJ5dGVzLCBGWF9JTlQzMiBzdGFydHBvcywgRlhfSU5UMzIgY291bnQsIEZYX0lOVDMyIHN0YXJ0bW9kZSwgQ0ZYX1dpZGVTdHJpbmcgJnNiKQ0KK3sNCisgICAgaWYgKGNvdW50ID09IDEgJiYgc3RhcnRtb2RlID09IFRFWFRfQ09NUEFDVElPTikgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSBTSElGVF9UT19CWVRFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlkeCA9IHN0YXJ0cG9zOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgaWYgKGNvdW50ID49IDYpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgTEFUQ0hfVE9fQllURTsNCisgICAgICAgIEZYX1dDSEFSIGNoYXJzWzVdOw0KKyAgICAgICAgd2hpbGUgKChzdGFydHBvcyArIGNvdW50IC0gaWR4KSA+PSA2KSB7DQorICAgICAgICAgICAgRlhfSU5UNjQgdCA9IDA7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgew0KKyAgICAgICAgICAgICAgICB0IDw8PSA4Ow0KKyAgICAgICAgICAgICAgICB0ICs9IGJ5dGVzLT5HZXRBdChpZHggKyBpKSAmIDB4ZmY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsNCisgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSAoRlhfV0NIQVIpICh0ICUgOTAwKTsNCisgICAgICAgICAgICAgICAgdCAvPSA5MDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgICAgICAgICAgIHNiICs9IChjaGFyc1tpXSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlkeCArPSA2Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpZHggPCBzdGFydHBvcyArIGNvdW50KSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpIExBVENIX1RPX0JZVEVfUEFEREVEOw0KKyAgICB9DQorICAgIGZvciAoaSA9IGlkeDsgaSA8IHN0YXJ0cG9zICsgY291bnQ7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgY2ggPSBieXRlcy0+R2V0QXQoaSkgJiAweGZmOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSBjaDsNCisgICAgfQ0KK30NCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywgRlhfSU5UMzIgc3RhcnRwb3MsIEZYX0lOVDMyIGNvdW50LCBDRlhfV2lkZVN0cmluZyAmc2IpDQorew0KKyAgICBGWF9JTlQzMiBpZHggPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyB0bXA7DQorICAgIEZYX0lOVDMyIG51bTkwMCA9IDkwMDsNCisgICAgRlhfSU5UMzIgbnVtMCA9IDA7DQorICAgIHdoaWxlIChpZHggPCBjb3VudCAtIDEpIHsNCisgICAgICAgIEZYX0lOVDMyIGxlbiA9IDQ0IDwgY291bnQgLSBpZHggPyA0NCA6IGNvdW50IC0gaWR4Ow0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcGFydCA9IChGWF9XQ0hBUiknMScgKyBtc2cuTWlkKHN0YXJ0cG9zICsgaWR4LCBsZW4pOw0KKyAgICAgICAgRlhfSU5UMzIgYmlnaW50ID0gcGFydC5HZXRJbnRlZ2VyKCk7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgRlhfSU5UMzIgYyA9IGJpZ2ludCAlIG51bTkwMDsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAoYyk7DQorICAgICAgICAgICAgYmlnaW50ID0gYmlnaW50IC8gbnVtOTAwOw0KKyAgICAgICAgfSB3aGlsZSAoYmlnaW50ICE9IG51bTApOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gdG1wLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgICAgICBzYiArPSAodG1wLkdldEF0KGkpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlkeCArPSBsZW47DQorICAgIH0NCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNEaWdpdChGWF9XQ0hBUiBjaCkNCit7DQorICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc0FscGhhVXBwZXIoRlhfV0NIQVIgY2gpDQorew0KKyAgICByZXR1cm4gY2ggPT0gJyAnIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYUxvd2VyKEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIGNoID09ICcgJyB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzTWl4ZWQoRlhfV0NIQVIgY2gpDQorew0KKyAgICByZXR1cm4gTUlYRURbY2hdICE9IC0xOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc1B1bmN0dWF0aW9uKEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIFBVTkNUVUFUSU9OW2NoXSAhPSAtMTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNUZXh0KEZYX1dDSEFSIGNoKQ0KK3sNCisgICAgcmV0dXJuIGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgRlhfSU5UMzIgc3RhcnRwb3MpDQorew0KKyAgICBGWF9JTlQzMiBjb3VudCA9IDA7DQorICAgIEZYX0lOVDMyIGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaWR4ID0gc3RhcnRwb3M7DQorICAgIGlmIChpZHggPCBsZW4pIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgICAgICB3aGlsZSAoaXNEaWdpdChjaCkgJiYgaWR4IDwgbGVuKSB7DQorICAgICAgICAgICAgY291bnQrKzsNCisgICAgICAgICAgICBpZHgrKzsNCisgICAgICAgICAgICBpZiAoaWR4IDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBjb3VudDsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgRlhfSU5UMzIgc3RhcnRwb3MpDQorew0KKyAgICBGWF9JTlQzMiBsZW4gPSBtc2cuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIGlkeCA9IHN0YXJ0cG9zOw0KKyAgICB3aGlsZSAoaWR4IDwgbGVuKSB7DQorICAgICAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICAgICAgRlhfSU5UMzIgbnVtZXJpY0NvdW50ID0gMDsNCisgICAgICAgIHdoaWxlIChudW1lcmljQ291bnQgPCAxMyAmJiBpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsNCisgICAgICAgICAgICBudW1lcmljQ291bnQrKzsNCisgICAgICAgICAgICBpZHgrKzsNCisgICAgICAgICAgICBpZiAoaWR4IDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG51bWVyaWNDb3VudCA+PSAxMykgew0KKyAgICAgICAgICAgIHJldHVybiBpZHggLSBzdGFydHBvcyAtIG51bWVyaWNDb3VudDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChudW1lcmljQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICAgICAgaWYgKCFpc1RleHQoY2gpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZHgrKzsNCisgICAgfQ0KKyAgICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX0J5dGVBcnJheSogYnl0ZXMsIEZYX0lOVDMyIHN0YXJ0cG9zLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaWR4ID0gc3RhcnRwb3M7DQorICAgIHdoaWxlIChpZHggPCBsZW4pIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgICAgICBGWF9JTlQzMiBudW1lcmljQ291bnQgPSAwOw0KKyAgICAgICAgd2hpbGUgKG51bWVyaWNDb3VudCA8IDEzICYmIGlzRGlnaXQoY2gpKSB7DQorICAgICAgICAgICAgbnVtZXJpY0NvdW50Kys7DQorICAgICAgICAgICAgRlhfSU5UMzIgaSA9IGlkeCArIG51bWVyaWNDb3VudDsNCisgICAgICAgICAgICBpZiAoaSA+PSBsZW4pIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNoID0gbXNnLkdldEF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG51bWVyaWNDb3VudCA+PSAxMykgew0KKyAgICAgICAgICAgIHJldHVybiBpZHggLSBzdGFydHBvczsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIHRleHRDb3VudCA9IDA7DQorICAgICAgICB3aGlsZSAodGV4dENvdW50IDwgNSAmJiBpc1RleHQoY2gpKSB7DQorICAgICAgICAgICAgdGV4dENvdW50Kys7DQorICAgICAgICAgICAgRlhfSU5UMzIgaSA9IGlkeCArIHRleHRDb3VudDsNCisgICAgICAgICAgICBpZiAoaSA+PSBsZW4pIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNoID0gbXNnLkdldEF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHRleHRDb3VudCA+PSA1KSB7DQorICAgICAgICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgICAgIGlmIChieXRlcy0+R2V0QXQoaWR4KSA9PSA2MyAmJiBjaCAhPSAnPycpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob25FbmNvZGFibGVDaGFyYWN0ZXJEZXRlY3RlZDsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBpZHgrKzsNCisgICAgfQ0KKyAgICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN1JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1OTliYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdSZWFkZXIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0JpbmFyeUJpdG1hcC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3IuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0RlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JvdW5kaW5nQm94LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3UmVhZGVyLmgiDQorI2RlZmluZSAgICBJbnRlZ2VyX01BWF9WQUxVRSAgIDIxNDc0ODM2NDcNCitDQkNfUERGNDE3UmVhZGVyOjpDQkNfUERGNDE3UmVhZGVyKCkNCit7DQorfQ0KK0NCQ19QREY0MTdSZWFkZXI6On5DQkNfUERGNDE3UmVhZGVyKCkNCit7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICByZXR1cm4gRGVjb2RlKGltYWdlLCAwLCBlKTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1BERjQxN1JlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBGWF9CT09MIG11bHRpcGxlLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHRzOw0KKyAgICBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIGRldGVjdG9yUmVzdWx0ID0gQ0JDX0RldGVjdG9yOjpkZXRlY3QoaW1hZ2UsIGhpbnRzLCBtdWx0aXBsZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBkZXRlY3RvclJlc3VsdC0+Z2V0UG9pbnRzKCktPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDRlhfUHRyQXJyYXkqIHBvaW50cyA9IChDRlhfUHRyQXJyYXkqKWRldGVjdG9yUmVzdWx0LT5nZXRQb2ludHMoKS0+R2V0QXQoaSk7DQorICAgICAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogUmVzdWx0VGVtcCA9IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmRlY29kZShkZXRlY3RvclJlc3VsdC0+Z2V0Qml0cygpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDQpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDYpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDcpLCBnZXRNaW5Db2Rld29yZFdpZHRoKCpwb2ludHMpLCBnZXRNYXhDb2Rld29yZFdpZHRoKCpwb2ludHMpLCBlKTsNCisgICAgICAgIGlmIChSZXN1bHRUZW1wID09IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgZGV0ZWN0b3JSZXN1bHQ7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2U7DQorICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0cyArPSBSZXN1bHRUZW1wLT5HZXRUZXh0KCk7DQorICAgICAgICBkZWxldGUgUmVzdWx0VGVtcDsNCisgICAgfQ0KKyAgICBkZWxldGUgZGV0ZWN0b3JSZXN1bHQ7DQorICAgIHJldHVybiByZXN1bHRzOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKGltYWdlLCBGQUxTRSwgMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIHJldHVybiBiczsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN1JlYWRlcjo6Z2V0TWF4V2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwgQ0JDX1Jlc3VsdFBvaW50KiBwMikNCit7DQorICAgIGlmIChwMSA9PSBOVUxMIHx8IHAyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiAoRlhfSU5UMzIpIEZYU1lTX2ZhYnMocDEtPkdldFgoKSAtIHAyLT5HZXRYKCkpOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3UmVhZGVyOjpnZXRNaW5XaWR0aChDQkNfUmVzdWx0UG9pbnQqIHAxLCBDQkNfUmVzdWx0UG9pbnQqIHAyKQ0KK3sNCisgICAgaWYgKHAxID09IE5VTEwgfHwgcDIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEludGVnZXJfTUFYX1ZBTFVFOw0KKyAgICB9DQorICAgIHJldHVybiAoRlhfSU5UMzIpIEZYU1lTX2ZhYnMocDEtPkdldFgoKSAtIHAyLT5HZXRYKCkpOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3UmVhZGVyOjpnZXRNYXhDb2Rld29yZFdpZHRoKENGWF9QdHJBcnJheSYgcCkNCit7DQorICAgIEZYX0lOVDMyIGEgPSBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDYpLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDIpKSAqIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQgLyBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgICAgRlhfSU5UMzIgYiA9IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNyksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMykpICogQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fU1RPUF9QQVRURVJOOw0KKyAgICBGWF9JTlQzMiBjID0gZ2V0TWF4V2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgwKSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg0KSkgPCBhID8gZ2V0TWF4V2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgwKSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg0KSkgOiBhOw0KKyAgICBGWF9JTlQzMiBkID0gZ2V0TWF4V2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgxKSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg1KSkgPCBiID8gZ2V0TWF4V2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgxKSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg1KSkgOiBiOw0KKyAgICByZXR1cm4gYyA8IGQgPyBjIDogZDsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN1JlYWRlcjo6Z2V0TWluQ29kZXdvcmRXaWR0aChDRlhfUHRyQXJyYXkmIHApDQorew0KKyAgICBGWF9JTlQzMiBhID0gZ2V0TWluV2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg2KSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgyKSkgKiBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEIC8gQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQorICAgIEZYX0lOVDMyIGIgPSBnZXRNaW5XaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDcpLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDMpKSAqIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQgLyBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgICAgRlhfSU5UMzIgYyA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNCkpIDwgYSA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNCkpIDogYTsNCisgICAgRlhfSU5UMzIgZCA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNSkpIDwgYiA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNSkpIDogYjsNCisgICAgcmV0dXJuIGMgPCBkID8gYyA6IGQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MjhiYTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIg0KK0NCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Q0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCkNCit7DQorfQ0KK0NCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6fkNCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSgpDQorew0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OmdldFNlZ21lbnRJbmRleCgpDQorew0KKyAgICByZXR1cm4gbV9zZWdtZW50SW5kZXg7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpzZXRTZWdtZW50SW5kZXgoRlhfSU5UMzIgc2VnbWVudEluZGV4KQ0KK3sNCisgICAgbV9zZWdtZW50SW5kZXggPSBzZWdtZW50SW5kZXg7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Z2V0RmlsZUlkKCkNCit7DQorICAgIHJldHVybiBtX2ZpbGVJZDsNCit9DQordm9pZCBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OnNldEZpbGVJZChDRlhfQnl0ZVN0cmluZyBmaWxlSWQpDQorew0KKyAgICBtX2ZpbGVJZCA9IGZpbGVJZDsNCit9DQorQ0ZYX0ludDMyQXJyYXkmIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Z2V0T3B0aW9uYWxEYXRhKCkNCit7DQorICAgIHJldHVybiBtX29wdGlvbmFsRGF0YTsNCit9DQordm9pZCBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OnNldE9wdGlvbmFsRGF0YShDRlhfSW50MzJBcnJheSAmb3B0aW9uYWxEYXRhKQ0KK3sNCisgICAgbV9vcHRpb25hbERhdGEuQ29weShvcHRpb25hbERhdGEpOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6aXNMYXN0U2VnbWVudCgpDQorew0KKyAgICByZXR1cm4gbV9sYXN0U2VnbWVudDsNCit9DQordm9pZCBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OnNldExhc3RTZWdtZW50KEZYX0JPT0wgbGFzdFNlZ21lbnQpDQorew0KKyAgICBtX2xhc3RTZWdtZW50ID0gbGFzdFNlZ21lbnQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0NjdhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuY3BwCkBAIC0wLDAgKzEsNTgwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29kZXdvcmQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c0dGLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgiDQorRlhfSU5UMzIgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Q09ERVdPUkRfU0tFV19TSVpFID0gMjsNCitGWF9JTlQzMiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpNQVhfRVJST1JTID0gMzsNCitGWF9JTlQzMiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpNQVhfRUNfQ09ERVdPUkRTID0gNTEyOw0KK0NCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbiogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZXJyb3JDb3JyZWN0aW9uID0gTlVMTDsNCitDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyKCkNCit7DQorfQ0KK0NCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6On5DQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyKCkNCit7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBlcnJvckNvcnJlY3Rpb24gPSBGWF9ORVcgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOw0KK30NCit2b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkZpbmFsaXplKCkNCit7DQorICAgIGRlbGV0ZSBlcnJvckNvcnJlY3Rpb247DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpkZWNvZGUoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BMZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIGltYWdlQm90dG9tTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZVRvcFJpZ2h0LA0KKyAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbVJpZ2h0LCBGWF9JTlQzMiBtaW5Db2Rld29yZFdpZHRoLCBGWF9JTlQzMiBtYXhDb2Rld29yZFdpZHRoLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBGWF9ORVcgQ0JDX0JvdW5kaW5nQm94KGltYWdlLCBpbWFnZVRvcExlZnQsIGltYWdlQm90dG9tTGVmdCwgaW1hZ2VUb3BSaWdodCwgaW1hZ2VCb3R0b21SaWdodCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiA9IE5VTEw7DQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID0gTlVMTDsNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0ID0gTlVMTDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDI7IGkrKykgew0KKyAgICAgICAgaWYgKGltYWdlVG9wTGVmdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbGVmdFJvd0luZGljYXRvckNvbHVtbiA9IGdldFJvd0luZGljYXRvckNvbHVtbihpbWFnZSwgYm91bmRpbmdCb3gsICppbWFnZVRvcExlZnQsIFRSVUUsIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGltYWdlVG9wUmlnaHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID0gZ2V0Um93SW5kaWNhdG9yQ29sdW1uKGltYWdlLCBib3VuZGluZ0JveCwgKmltYWdlVG9wUmlnaHQsIEZBTFNFLCBtaW5Db2Rld29yZFdpZHRoLCBtYXhDb2Rld29yZFdpZHRoKTsNCisgICAgICAgIH0NCisgICAgICAgIGRldGVjdGlvblJlc3VsdCA9IG1lcmdlKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4sIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb250Tm90Rm91bmRJbnN0YW5jZTsNCisgICAgICAgICAgICBkZWxldGUgbGVmdFJvd0luZGljYXRvckNvbHVtbjsNCisgICAgICAgICAgICBkZWxldGUgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW47DQorICAgICAgICAgICAgZGVsZXRlIGJvdW5kaW5nQm94Ow0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGkgPT0gMCAmJiAoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNaW5ZKCkgPCBib3VuZGluZ0JveC0+Z2V0TWluWSgpIHx8IGRldGVjdGlvblJlc3VsdC0+Z2V0Qm91bmRpbmdCb3goKS0+Z2V0TWF4WSgpID4gYm91bmRpbmdCb3gtPmdldE1heFkoKSkpIHsNCisgICAgICAgICAgICBkZWxldGUgYm91bmRpbmdCb3g7DQorICAgICAgICAgICAgYm91bmRpbmdCb3ggPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRldGVjdGlvblJlc3VsdC0+c2V0Qm91bmRpbmdCb3goYm91bmRpbmdCb3gpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG1heEJhcmNvZGVDb2x1bW4gPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICsgMTsNCisgICAgZGV0ZWN0aW9uUmVzdWx0LT5zZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oMCwgbGVmdFJvd0luZGljYXRvckNvbHVtbik7DQorICAgIGRldGVjdGlvblJlc3VsdC0+c2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKG1heEJhcmNvZGVDb2x1bW4sIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uKTsNCisgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCA9IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gIT0gTlVMTDsNCisgICAgZm9yIChGWF9JTlQzMiBiYXJjb2RlQ29sdW1uQ291bnQgPSAxOyBiYXJjb2RlQ29sdW1uQ291bnQgPD0gbWF4QmFyY29kZUNvbHVtbjsgYmFyY29kZUNvbHVtbkNvdW50KyspIHsNCisgICAgICAgIEZYX0lOVDMyIGJhcmNvZGVDb2x1bW4gPSBsZWZ0VG9SaWdodCA/IGJhcmNvZGVDb2x1bW5Db3VudCA6IG1heEJhcmNvZGVDb2x1bW4gLSBiYXJjb2RlQ29sdW1uQ291bnQ7DQorICAgICAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbikgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0gTlVMTDsNCisgICAgICAgIGlmIChiYXJjb2RlQ29sdW1uID09IDAgfHwgYmFyY29kZUNvbHVtbiA9PSBtYXhCYXJjb2RlQ29sdW1uKSB7DQorICAgICAgICAgICAgZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0gRlhfTkVXIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oYm91bmRpbmdCb3gsIGJhcmNvZGVDb2x1bW4gPT0gMCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IEZYX05FVyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJvdW5kaW5nQm94KTsNCisgICAgICAgIH0NCisgICAgICAgIGRldGVjdGlvblJlc3VsdC0+c2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4sIGRldGVjdGlvblJlc3VsdENvbHVtbik7DQorICAgICAgICBGWF9JTlQzMiBzdGFydENvbHVtbiA9IC0xOw0KKyAgICAgICAgRlhfSU5UMzIgcHJldmlvdXNTdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpbWFnZVJvdyA9IGJvdW5kaW5nQm94LT5nZXRNaW5ZKCk7IGltYWdlUm93IDw9IGJvdW5kaW5nQm94LT5nZXRNYXhZKCk7IGltYWdlUm93KyspIHsNCisgICAgICAgICAgICBzdGFydENvbHVtbiA9IGdldFN0YXJ0Q29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiwgaW1hZ2VSb3csIGxlZnRUb1JpZ2h0KTsNCisgICAgICAgICAgICBpZiAoc3RhcnRDb2x1bW4gPCAwIHx8IHN0YXJ0Q29sdW1uID4gYm91bmRpbmdCb3gtPmdldE1heFgoKSkgew0KKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGFydENvbHVtbiA9PSAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3RhcnRDb2x1bW4gPSBwcmV2aW91c1N0YXJ0Q29sdW1uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gZGV0ZWN0Q29kZXdvcmQoaW1hZ2UsIGJvdW5kaW5nQm94LT5nZXRNaW5YKCksIGJvdW5kaW5nQm94LT5nZXRNYXhYKCksIGxlZnRUb1JpZ2h0LCBzdGFydENvbHVtbiwgaW1hZ2VSb3csIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICAgICAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGRldGVjdGlvblJlc3VsdENvbHVtbi0+c2V0Q29kZXdvcmQoaW1hZ2VSb3csIGNvZGV3b3JkKTsNCisgICAgICAgICAgICAgICAgcHJldmlvdXNTdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KKyAgICAgICAgICAgICAgICBtaW5Db2Rld29yZFdpZHRoID0gbWluQ29kZXdvcmRXaWR0aCA8IGNvZGV3b3JkLT5nZXRXaWR0aCgpID8gbWluQ29kZXdvcmRXaWR0aCA6IGNvZGV3b3JkLT5nZXRXaWR0aCgpOw0KKyAgICAgICAgICAgICAgICBtYXhDb2Rld29yZFdpZHRoID0gbWF4Q29kZXdvcmRXaWR0aCA+IGNvZGV3b3JkLT5nZXRXaWR0aCgpID8gbWF4Q29kZXdvcmRXaWR0aCA6IGNvZGV3b3JkLT5nZXRXaWR0aCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlcnJlc3VsdCA9IGNyZWF0ZURlY29kZXJSZXN1bHQoZGV0ZWN0aW9uUmVzdWx0LCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZGVsZXRlIGRldGVjdGlvblJlc3VsdDsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBkZWNvZGVycmVzdWx0Ow0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjp0b1N0cmluZyhDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICAgIGZvciAoRlhfSU5UMzIgcm93ID0gMDsgcm93IDwgYmFyY29kZU1hdHJpeC0+R2V0U2l6ZSgpOyByb3crKykgew0KKyAgICAgICAgcmVzdWx0ICs9IHJvdzsNCisgICAgICAgIEZYX0lOVDMyIGwgPSAwOw0KKyAgICAgICAgZm9yICg7IGwgPCAoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQocm93KSktPkdldFNpemUoKTsgbCsrKSB7DQorICAgICAgICAgICAgQ0JDX0JhcmNvZGVWYWx1ZSogYmFyY29kZVZhbHVlID0gKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChyb3cpKS0+R2V0QXQobCk7DQorICAgICAgICAgICAgaWYgKGJhcmNvZGVWYWx1ZS0+Z2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICAiIjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gYmFyY29kZVZhbHVlLT5nZXRWYWx1ZSgpLT5HZXRBdCgwKTsNCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJhcmNvZGVWYWx1ZS0+Z2V0Q29uZmlkZW5jZShiYXJjb2RlVmFsdWUtPmdldFZhbHVlKCktPkdldEF0KDApKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6bWVyZ2UoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4sIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCAmJiByaWdodFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEgPSBnZXRCYXJjb2RlTWV0YWRhdGEobGVmdFJvd0luZGljYXRvckNvbHVtbiwgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KKyAgICBpZiAoYmFyY29kZU1ldGFkYXRhID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdE1ldGFkYXRhOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0JDX0JvdW5kaW5nQm94KiBsZWZ0Ym91bmRpbmdCb3ggPSBhZGp1c3RCb3VuZGluZ0JveChsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZGVsZXRlIGJhcmNvZGVNZXRhZGF0YTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENCQ19Cb3VuZGluZ0JveCogcmlnaHRib3VuZGluZ0JveCA9IGFkanVzdEJvdW5kaW5nQm94KHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZGVsZXRlIGJhcmNvZGVNZXRhZGF0YTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBDQkNfQm91bmRpbmdCb3g6Om1lcmdlKGxlZnRib3VuZGluZ0JveCwgcmlnaHRib3VuZGluZ0JveCwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGRlbGV0ZSBiYXJjb2RlTWV0YWRhdGE7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25yZXN1bHQgPSBGWF9ORVcgQ0JDX0RldGVjdGlvblJlc3VsdChiYXJjb2RlTWV0YWRhdGEsIGJvdW5kaW5nQm94KTsNCisgICAgcmV0dXJuIGRldGVjdGlvbnJlc3VsdDsNCit9DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjphZGp1c3RCb3VuZGluZ0JveChDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4sIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKHJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfSW50MzJBcnJheSogcm93SGVpZ2h0cyA9IHJvd0luZGljYXRvckNvbHVtbi0+Z2V0Um93SGVpZ2h0cyhlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBGWF9JTlQzMiBtYXhSb3dIZWlnaHQgPSBnZXRNYXgoKnJvd0hlaWdodHMpOw0KKyAgICBGWF9JTlQzMiBtaXNzaW5nU3RhcnRSb3dzID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHJvd0hlaWdodHMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiByb3dIZWlnaHQgPSByb3dIZWlnaHRzLT5HZXRBdChpKTsNCisgICAgICAgIG1pc3NpbmdTdGFydFJvd3MgKz0gbWF4Um93SGVpZ2h0IC0gcm93SGVpZ2h0Ow0KKyAgICAgICAgaWYgKHJvd0hlaWdodCA+IDApIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9IHJvd0luZGljYXRvckNvbHVtbi0+Z2V0Q29kZXdvcmRzKCk7DQorICAgIGZvciAoRlhfSU5UMzIgcm93ID0gMDsgbWlzc2luZ1N0YXJ0Um93cyA+IDAgJiYgY29kZXdvcmRzLT5HZXRBdChyb3cpID09IE5VTEw7IHJvdysrKSB7DQorICAgICAgICBtaXNzaW5nU3RhcnRSb3dzLS07DQorICAgIH0NCisgICAgRlhfSU5UMzIgbWlzc2luZ0VuZFJvd3MgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIHJvdzEgPSByb3dIZWlnaHRzLT5HZXRTaXplKCkgLSAxOyByb3cxID49IDA7IHJvdzEtLSkgew0KKyAgICAgICAgbWlzc2luZ0VuZFJvd3MgKz0gbWF4Um93SGVpZ2h0IC0gcm93SGVpZ2h0cy0+R2V0QXQocm93MSk7DQorICAgICAgICBpZiAocm93SGVpZ2h0cy0+R2V0QXQocm93MSkgPiAwKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiByb3cyID0gY29kZXdvcmRzLT5HZXRTaXplKCkgLSAxOyBtaXNzaW5nRW5kUm93cyA+IDAgJiYgY29kZXdvcmRzLT5HZXRBdChyb3cyKSA9PSBOVUxMOyByb3cyLS0pIHsNCisgICAgICAgIG1pc3NpbmdFbmRSb3dzLS07DQorICAgIH0NCisgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IHJvd0luZGljYXRvckNvbHVtbi0+Z2V0Qm91bmRpbmdCb3goKS0+YWRkTWlzc2luZ1Jvd3MobWlzc2luZ1N0YXJ0Um93cywgbWlzc2luZ0VuZFJvd3MsIHJvd0luZGljYXRvckNvbHVtbi0+aXNMZWZ0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBib3VuZGluZ0JveDsNCit9DQorRlhfSU5UMzIgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0TWF4KENGWF9JbnQzMkFycmF5JiB2YWx1ZXMpDQorew0KKyAgICBGWF9JTlQzMiBtYXhWYWx1ZSA9IC0xOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgdmFsdWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiB2YWx1ZSA9IHZhbHVlcy5HZXRBdChpKTsNCisgICAgICAgIG1heFZhbHVlID0gbWF4VmFsdWUgPiB2YWx1ZSA/IG1heFZhbHVlIDogdmFsdWU7DQorICAgIH0NCisgICAgcmV0dXJuIG1heFZhbHVlOw0KK30NCitDQkNfQmFyY29kZU1ldGFkYXRhKiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRCYXJjb2RlTWV0YWRhdGEoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uKQ0KK3sNCisgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogbGVmdEJhcmNvZGVNZXRhZGF0YSA9IE5VTEw7DQorICAgIENCQ19CYXJjb2RlTWV0YWRhdGEqIHJpZ2h0QmFyY29kZU1ldGFkYXRhID0gTlVMTDsNCisgICAgaWYgKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCB8fCAobGVmdEJhcmNvZGVNZXRhZGF0YSA9IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpKSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCA/IE5VTEwgOiByaWdodFJvd0luZGljYXRvckNvbHVtbi0+Z2V0QmFyY29kZU1ldGFkYXRhKCk7DQorICAgIH0NCisgICAgaWYgKHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwgfHwgKHJpZ2h0QmFyY29kZU1ldGFkYXRhID0gcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpKSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gbGVmdFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMID8gTlVMTCA6IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpOw0KKyAgICB9DQorICAgIGlmIChsZWZ0QmFyY29kZU1ldGFkYXRhLT5nZXRDb2x1bW5Db3VudCgpICE9IHJpZ2h0QmFyY29kZU1ldGFkYXRhLT5nZXRDb2x1bW5Db3VudCgpICYmDQorICAgICAgICAgICAgbGVmdEJhcmNvZGVNZXRhZGF0YS0+Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSAhPSByaWdodEJhcmNvZGVNZXRhZGF0YS0+Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSAmJg0KKyAgICAgICAgICAgIGxlZnRCYXJjb2RlTWV0YWRhdGEtPmdldFJvd0NvdW50KCkgIT0gcmlnaHRCYXJjb2RlTWV0YWRhdGEtPmdldFJvd0NvdW50KCkpIHsNCisgICAgICAgIGRlbGV0ZSBsZWZ0QmFyY29kZU1ldGFkYXRhOw0KKyAgICAgICAgZGVsZXRlIHJpZ2h0QmFyY29kZU1ldGFkYXRhOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZGVsZXRlIHJpZ2h0QmFyY29kZU1ldGFkYXRhOw0KKyAgICByZXR1cm4gbGVmdEJhcmNvZGVNZXRhZGF0YTsNCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0Um93SW5kaWNhdG9yQ29sdW1uKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94LCBDQkNfUmVzdWx0UG9pbnQgc3RhcnRQb2ludCwNCisgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsIEZYX0lOVDMyIG1pbkNvZGV3b3JkV2lkdGgsIEZYX0lOVDMyIG1heENvZGV3b3JkV2lkdGgpDQorew0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4gPSBGWF9ORVcgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbihib3VuZGluZ0JveCwgbGVmdFRvUmlnaHQpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMjsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBpbmNyZW1lbnQgPSBpID09IDAgPyAxIDogLTE7DQorICAgICAgICBGWF9JTlQzMiBzdGFydENvbHVtbiA9IChGWF9JTlQzMikgc3RhcnRQb2ludC5HZXRYKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGltYWdlUm93ID0gKEZYX0lOVDMyKSBzdGFydFBvaW50LkdldFkoKTsgaW1hZ2VSb3cgPD0gYm91bmRpbmdCb3gtPmdldE1heFkoKSAmJiBpbWFnZVJvdyA+PSBib3VuZGluZ0JveC0+Z2V0TWluWSgpOyBpbWFnZVJvdyArPSBpbmNyZW1lbnQpIHsNCisgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gZGV0ZWN0Q29kZXdvcmQoaW1hZ2UsIDAsIGltYWdlLT5HZXRXaWR0aCgpLCBsZWZ0VG9SaWdodCwgc3RhcnRDb2x1bW4sIGltYWdlUm93LCBtaW5Db2Rld29yZFdpZHRoLCBtYXhDb2Rld29yZFdpZHRoKTsNCisgICAgICAgICAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByb3dJbmRpY2F0b3JDb2x1bW4tPnNldENvZGV3b3JkKGltYWdlUm93LCBjb2Rld29yZCk7DQorICAgICAgICAgICAgICAgIGlmIChsZWZ0VG9SaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgc3RhcnRDb2x1bW4gPSBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBzdGFydENvbHVtbiA9IGNvZGV3b3JkLT5nZXRFbmRYKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHJvd0luZGljYXRvckNvbHVtbjsNCit9DQordm9pZCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjphZGp1c3RDb2Rld29yZENvdW50KENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlTWF0cml4LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9JbnQzMkFycmF5KiBudW1iZXJPZkNvZGV3b3JkcyA9ICgoQ0JDX0JhcmNvZGVWYWx1ZSopKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KDApKS0+R2V0QXQoMSkpLT5nZXRWYWx1ZSgpOw0KKyAgICBGWF9JTlQzMiBjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMgPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKSAtIGdldE51bWJlck9mRUNDb2RlV29yZHMoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlRUNMZXZlbCgpKTsNCisgICAgaWYgKG51bWJlck9mQ29kZXdvcmRzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgaWYgKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3JkcyA8IDEgfHwgY2FsY3VsYXRlZE51bWJlck9mQ29kZXdvcmRzID4gQ0JDX1BERjQxN0NvbW1vbjo6TUFYX0NPREVXT1JEU19JTl9CQVJDT0RFKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2U7DQorICAgICAgICAgICAgZGVsZXRlIG51bWJlck9mQ29kZXdvcmRzOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoMCkpLT5HZXRBdCgxKSktPnNldFZhbHVlKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcyk7DQorICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZDb2Rld29yZHMtPkdldEF0KDApICE9IGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcykgew0KKyAgICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoMCkpLT5HZXRBdCgxKSktPnNldFZhbHVlKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcyk7DQorICAgIH0NCisgICAgZGVsZXRlIG51bWJlck9mQ29kZXdvcmRzOw0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y3JlYXRlRGVjb2RlclJlc3VsdChDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlTWF0cml4ID0gY3JlYXRlQmFyY29kZU1hdHJpeChkZXRlY3Rpb25SZXN1bHQpOw0KKyAgICBhZGp1c3RDb2Rld29yZENvdW50KGRldGVjdGlvblJlc3VsdCwgYmFyY29kZU1hdHJpeCwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBiYXJjb2RlTWF0cml4LT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIENGWF9QdHJBcnJheSogdGVtcCA9IChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KGkpOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCB0ZW1wLT5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgKENCQ19CYXJjb2RlVmFsdWUqKXRlbXAtPkdldEF0KGopOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0ZW1wLT5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICBkZWxldGUgdGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGJhcmNvZGVNYXRyaXgtPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIGJhcmNvZGVNYXRyaXg7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfSW50MzJBcnJheSBlcmFzdXJlczsNCisgICAgQ0ZYX0ludDMyQXJyYXkgY29kZXdvcmRzOw0KKyAgICBjb2Rld29yZHMuU2V0U2l6ZShkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVSb3dDb3VudCgpICogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSk7DQorICAgIENGWF9QdHJBcnJheSBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3Q7DQorICAgIENGWF9JbnQzMkFycmF5IGFtYmlndW91c0luZGV4ZXNMaXN0Ow0KKyAgICBmb3IgKEZYX0lOVDMyIHJvdyA9IDA7IHJvdyA8IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZVJvd0NvdW50KCk7IHJvdysrKSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGwgPSAwOyBsIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKTsgbCsrKSB7DQorICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHZhbHVlcyA9ICgoQ0JDX0JhcmNvZGVWYWx1ZSopKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KHJvdykpLT5HZXRBdChsICsgMSkpLT5nZXRWYWx1ZSgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGNvZGV3b3JkSW5kZXggPSByb3cgKiBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICsgbDsNCisgICAgICAgICAgICBpZiAodmFsdWVzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBlcmFzdXJlcy5BZGQoY29kZXdvcmRJbmRleCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXMtPkdldFNpemUoKSA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGNvZGV3b3Jkc1tjb2Rld29yZEluZGV4XSA9IHZhbHVlcy0+R2V0QXQoMCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYW1iaWd1b3VzSW5kZXhlc0xpc3QuQWRkKGNvZGV3b3JkSW5kZXgpOw0KKyAgICAgICAgICAgICAgICBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuQWRkKHZhbHVlcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheSBhbWJpZ3VvdXNJbmRleFZhbHVlczsNCisgICAgYW1iaWd1b3VzSW5kZXhWYWx1ZXMuU2V0U2l6ZShhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuR2V0U2l6ZSgpKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGFtYmlndW91c0luZGV4VmFsdWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBhbWJpZ3VvdXNJbmRleFZhbHVlcy5TZXRBdChpLCBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuR2V0QXQoaSkpOw0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgbCA9IDA7IGwgPCBiYXJjb2RlTWF0cml4LT5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQobCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgdGVtcC0+R2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgICAgICBkZWxldGUgKENCQ19CYXJjb2RlVmFsdWUqKXRlbXAtPkdldEF0KGopOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGVtcC0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgdGVtcDsNCisgICAgfQ0KKyAgICBiYXJjb2RlTWF0cml4LT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIGJhcmNvZGVNYXRyaXg7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGVyUmVzdWx0ID0gY3JlYXRlRGVjb2RlclJlc3VsdEZyb21BbWJpZ3VvdXNWYWx1ZXMoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlRUNMZXZlbCgpLCBjb2Rld29yZHMsIGVyYXN1cmVzLCBhbWJpZ3VvdXNJbmRleGVzTGlzdCwgYW1iaWd1b3VzSW5kZXhWYWx1ZXMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBkZWNvZGVyUmVzdWx0Ow0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y3JlYXRlRGVjb2RlclJlc3VsdEZyb21BbWJpZ3VvdXNWYWx1ZXMoRlhfSU5UMzIgZWNMZXZlbCwgQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVBcnJheSwgQ0ZYX0ludDMyQXJyYXkgJmFtYmlndW91c0luZGV4ZXMsDQorICAgICAgICBDRlhfUHRyQXJyYXkmIGFtYmlndW91c0luZGV4VmFsdWVzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9JbnQzMkFycmF5IGFtYmlndW91c0luZGV4Q291bnQ7DQorICAgIGFtYmlndW91c0luZGV4Q291bnQuU2V0U2l6ZShhbWJpZ3VvdXNJbmRleGVzLkdldFNpemUoKSk7DQorICAgIEZYX0lOVDMyIHRyaWVzID0gMTAwOw0KKyAgICB3aGlsZSAodHJpZXMtLSA+IDApIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgbCA9IDA7IGwgPCBhbWJpZ3VvdXNJbmRleENvdW50LkdldFNpemUoKTsgbCsrKSB7DQorICAgICAgICAgICAgY29kZXdvcmRzW2FtYmlndW91c0luZGV4ZXNbbF1dID0gKChDRlhfSW50MzJBcnJheSopYW1iaWd1b3VzSW5kZXhWYWx1ZXMuR2V0QXQobCkpLT5HZXRBdChhbWJpZ3VvdXNJbmRleENvdW50W2xdKTsNCisgICAgICAgIH0NCisgICAgICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGVyUmVzdWx0ID0gZGVjb2RlQ29kZXdvcmRzKGNvZGV3b3JkcywgZWNMZXZlbCwgZXJhc3VyZUFycmF5LCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25OTzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZXJSZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2U7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChhbWJpZ3VvdXNJbmRleENvdW50W2ldIDwgKChDRlhfSW50MzJBcnJheSopKGFtYmlndW91c0luZGV4VmFsdWVzLkdldEF0KGkpKSktPkdldFNpemUoKSAtIDEpIHsNCisgICAgICAgICAgICAgICAgYW1iaWd1b3VzSW5kZXhDb3VudFtpXSsrOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBhbWJpZ3VvdXNJbmRleENvdW50W2ldID0gMDsNCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCkgLSAxKSB7DQorICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUluc3RhbmNlOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGWF9QdHJBcnJheSogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y3JlYXRlQmFyY29kZU1hdHJpeChDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQpDQorew0KKyAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXggPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgICBiYXJjb2RlTWF0cml4LT5TZXRTaXplKGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZVJvd0NvdW50KCkpOw0KKyAgICBDRlhfUHRyQXJyYXkqIHRlbXAgPSBOVUxMOw0KKyAgICBGWF9JTlQzMiBjb2x1bWUgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIHJvdyA9IDA7IHJvdyA8IGJhcmNvZGVNYXRyaXgtPkdldFNpemUoKTsgcm93KyspIHsNCisgICAgICAgIHRlbXAgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgICAgICAgdGVtcC0+U2V0U2l6ZShkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICsgMik7DQorICAgICAgICBmb3IgKGNvbHVtZSA9IDA7IGNvbHVtZSA8IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAyOyBjb2x1bWUrKykgew0KKyAgICAgICAgICAgIHRlbXAtPlNldEF0KGNvbHVtZSwgRlhfTkVXIENCQ19CYXJjb2RlVmFsdWUoKSk7DQorICAgICAgICB9DQorICAgICAgICBiYXJjb2RlTWF0cml4LT5TZXRBdChyb3csIHRlbXApOw0KKyAgICB9DQorICAgIGNvbHVtZSA9IC0xOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCkuR2V0QXQoaSk7DQorICAgICAgICBjb2x1bWUrKzsNCisgICAgICAgIGlmIChkZXRlY3Rpb25SZXN1bHRDb2x1bW4gPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gZGV0ZWN0aW9uUmVzdWx0Q29sdW1uLT5nZXRDb2Rld29yZHMoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgbCA9IDA7IGwgPCB0ZW1wLT5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKikgdGVtcC0+R2V0QXQobCk7DQorICAgICAgICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwgfHwgY29kZXdvcmQtPmdldFJvd051bWJlcigpID09IC0xKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAoKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkpKS0+R2V0QXQoY29sdW1lKSktPnNldFZhbHVlKGNvZGV3b3JkLT5nZXRWYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gYmFyY29kZU1hdHJpeDsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjppc1ZhbGlkQmFyY29kZUNvbHVtbihDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsIEZYX0lOVDMyIGJhcmNvZGVDb2x1bW4pDQorew0KKyAgICByZXR1cm4gYmFyY29kZUNvbHVtbiA+PSAwICYmIGJhcmNvZGVDb2x1bW4gPD0gZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSArIDE7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldFN0YXJ0Q29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgRlhfSU5UMzIgYmFyY29kZUNvbHVtbiwgRlhfSU5UMzIgaW1hZ2VSb3csIEZYX0JPT0wgbGVmdFRvUmlnaHQpDQorew0KKyAgICBGWF9JTlQzMiBvZmZzZXQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IE5VTEw7DQorICAgIGlmIChpc1ZhbGlkQmFyY29kZUNvbHVtbihkZXRlY3Rpb25SZXN1bHQsIGJhcmNvZGVDb2x1bW4gLSBvZmZzZXQpKSB7DQorICAgICAgICBjb2Rld29yZCA9IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4gLSBvZmZzZXQpLT5nZXRDb2Rld29yZChpbWFnZVJvdyk7DQorICAgIH0NCisgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGNvZGV3b3JkLT5nZXRFbmRYKCkgOiBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQorICAgIH0NCisgICAgY29kZXdvcmQgPSBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uKS0+Z2V0Q29kZXdvcmROZWFyYnkoaW1hZ2VSb3cpOw0KKyAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIGxlZnRUb1JpZ2h0ID8gY29kZXdvcmQtPmdldFN0YXJ0WCgpIDogY29kZXdvcmQtPmdldEVuZFgoKTsNCisgICAgfQ0KKyAgICBpZiAoaXNWYWxpZEJhcmNvZGVDb2x1bW4oZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KSkgew0KKyAgICAgICAgY29kZXdvcmQgPSBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KS0+Z2V0Q29kZXdvcmROZWFyYnkoaW1hZ2VSb3cpOw0KKyAgICB9DQorICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gbGVmdFRvUmlnaHQgPyBjb2Rld29yZC0+Z2V0RW5kWCgpIDogY29kZXdvcmQtPmdldFN0YXJ0WCgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHNraXBwZWRDb2x1bW5zID0gMDsNCisgICAgd2hpbGUgKGlzVmFsaWRCYXJjb2RlQ29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiAtIG9mZnNldCkpIHsNCisgICAgICAgIGJhcmNvZGVDb2x1bW4gLT0gb2Zmc2V0Ow0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4pLT5nZXRDb2Rld29yZHMoKS0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIHByZXZpb3VzUm93Q29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKikgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbiktPmdldENvZGV3b3JkcygpLT5HZXRBdChpKTsNCisgICAgICAgICAgICBpZiAocHJldmlvdXNSb3dDb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAobGVmdFRvUmlnaHQgPyBwcmV2aW91c1Jvd0NvZGV3b3JkLT5nZXRFbmRYKCkgOiBwcmV2aW91c1Jvd0NvZGV3b3JkLT5nZXRTdGFydFgoKSkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICogc2tpcHBlZENvbHVtbnMgKiAocHJldmlvdXNSb3dDb2Rld29yZC0+Z2V0RW5kWCgpIC0gcHJldmlvdXNSb3dDb2Rld29yZC0+Z2V0U3RhcnRYKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHNraXBwZWRDb2x1bW5zKys7DQorICAgIH0NCisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0ID8gZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNaW5YKCkgOiBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCktPmdldE1heFgoKTsNCit9DQorQ0JDX0NvZGV3b3JkKiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpkZXRlY3RDb2Rld29yZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwgRlhfSU5UMzIgbWluQ29sdW1uLCBGWF9JTlQzMiBtYXhDb2x1bW4sIEZYX0JPT0wgbGVmdFRvUmlnaHQsIEZYX0lOVDMyIHN0YXJ0Q29sdW1uLA0KKyAgICAgICAgRlhfSU5UMzIgaW1hZ2VSb3csIEZYX0lOVDMyIG1pbkNvZGV3b3JkV2lkdGgsIEZYX0lOVDMyIG1heENvZGV3b3JkV2lkdGgpDQorew0KKyAgICBzdGFydENvbHVtbiA9IGFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oaW1hZ2UsIG1pbkNvbHVtbiwgbWF4Q29sdW1uLCBsZWZ0VG9SaWdodCwgc3RhcnRDb2x1bW4sIGltYWdlUm93KTsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIG1vZHVsZUJpdENvdW50ID0gZ2V0TW9kdWxlQml0Q291bnQoaW1hZ2UsIG1pbkNvbHVtbiwgbWF4Q29sdW1uLCBsZWZ0VG9SaWdodCwgc3RhcnRDb2x1bW4sIGltYWdlUm93KTsNCisgICAgaWYgKG1vZHVsZUJpdENvdW50ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGVuZENvbHVtbjsNCisgICAgRlhfSU5UMzIgY29kZXdvcmRCaXRDb3VudCA9IENCQ19QREY0MTdDb21tb246OmdldEJpdENvdW50U3VtKCptb2R1bGVCaXRDb3VudCk7DQorICAgIGlmIChsZWZ0VG9SaWdodCkgew0KKyAgICAgICAgZW5kQ29sdW1uID0gc3RhcnRDb2x1bW4gKyBjb2Rld29yZEJpdENvdW50Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgPj4gMTsgaSsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgdG1wQ291bnQgPSBtb2R1bGVCaXRDb3VudC0+R2V0QXQoaSk7DQorICAgICAgICAgICAgbW9kdWxlQml0Q291bnQtPlNldEF0KGksIG1vZHVsZUJpdENvdW50LT5HZXRBdChtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSAtIGkpKTsNCisgICAgICAgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQobW9kdWxlQml0Q291bnQtPkdldFNpemUoKSAtIDEgLSBpLCB0bXBDb3VudCk7DQorICAgICAgICB9DQorICAgICAgICBlbmRDb2x1bW4gPSBzdGFydENvbHVtbjsNCisgICAgICAgIHN0YXJ0Q29sdW1uID0gZW5kQ29sdW1uIC0gY29kZXdvcmRCaXRDb3VudDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBkZWNvZGVkVmFsdWUgPSBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpnZXREZWNvZGVkVmFsdWUoKm1vZHVsZUJpdENvdW50KTsNCisgICAgRlhfSU5UMzIgY29kZXdvcmQgPSBDQkNfUERGNDE3Q29tbW9uOjpnZXRDb2Rld29yZChkZWNvZGVkVmFsdWUpOw0KKyAgICBkZWxldGUgbW9kdWxlQml0Q291bnQ7DQorICAgIGlmIChjb2Rld29yZCA9PSAtMSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29kZXdvcmQoc3RhcnRDb2x1bW4sIGVuZENvbHVtbiwgZ2V0Q29kZXdvcmRCdWNrZXROdW1iZXIoZGVjb2RlZFZhbHVlKSwgY29kZXdvcmQpOw0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0TW9kdWxlQml0Q291bnQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIEZYX0lOVDMyIG1pbkNvbHVtbiwgRlhfSU5UMzIgbWF4Q29sdW1uLCBGWF9CT09MIGxlZnRUb1JpZ2h0LCBGWF9JTlQzMiBzdGFydENvbHVtbiwgRlhfSU5UMzIgaW1hZ2VSb3cpDQorew0KKyAgICBGWF9JTlQzMiBpbWFnZUNvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KKyAgICBDRlhfSW50MzJBcnJheSogbW9kdWxlQml0Q291bnQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgIG1vZHVsZUJpdENvdW50LT5TZXRTaXplKDgpOw0KKyAgICBGWF9JTlQzMiBtb2R1bGVOdW1iZXIgPSAwOw0KKyAgICBGWF9JTlQzMiBpbmNyZW1lbnQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCisgICAgRlhfQk9PTCBwcmV2aW91c1BpeGVsVmFsdWUgPSBsZWZ0VG9SaWdodDsNCisgICAgd2hpbGUgKCgobGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPCBtYXhDb2x1bW4pIHx8ICghbGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPj0gbWluQ29sdW1uKSkgJiYgbW9kdWxlTnVtYmVyIDwgbW9kdWxlQml0Q291bnQtPkdldFNpemUoKSkgew0KKyAgICAgICAgaWYgKGltYWdlLT5HZXQoaW1hZ2VDb2x1bW4sIGltYWdlUm93KSA9PSBwcmV2aW91c1BpeGVsVmFsdWUpIHsNCisgICAgICAgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQobW9kdWxlTnVtYmVyLCBtb2R1bGVCaXRDb3VudC0+R2V0QXQobW9kdWxlTnVtYmVyKSArIDEpOw0KKyAgICAgICAgICAgIGltYWdlQ29sdW1uICs9IGluY3JlbWVudDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbW9kdWxlTnVtYmVyKys7DQorICAgICAgICAgICAgcHJldmlvdXNQaXhlbFZhbHVlID0gIXByZXZpb3VzUGl4ZWxWYWx1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobW9kdWxlTnVtYmVyID09IG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgfHwgKCgobGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPT0gbWF4Q29sdW1uKSB8fCAoIWxlZnRUb1JpZ2h0ICYmIGltYWdlQ29sdW1uID09IG1pbkNvbHVtbikpICYmIG1vZHVsZU51bWJlciA9PSBtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSkpIHsNCisgICAgICAgIHJldHVybiBtb2R1bGVCaXRDb3VudDsNCisgICAgfQ0KKyAgICBkZWxldGUgbW9kdWxlQml0Q291bnQ7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXROdW1iZXJPZkVDQ29kZVdvcmRzKEZYX0lOVDMyIGJhcmNvZGVFQ0xldmVsKQ0KK3sNCisgICAgcmV0dXJuIDIgPDwgYmFyY29kZUVDTGV2ZWw7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIEZYX0lOVDMyIG1pbkNvbHVtbiwgRlhfSU5UMzIgbWF4Q29sdW1uLCBGWF9CT09MIGxlZnRUb1JpZ2h0LCBGWF9JTlQzMiBjb2Rld29yZFN0YXJ0Q29sdW1uLCBGWF9JTlQzMiBpbWFnZVJvdykNCit7DQorICAgIEZYX0lOVDMyIGNvcnJlY3RlZFN0YXJ0Q29sdW1uID0gY29kZXdvcmRTdGFydENvbHVtbjsNCisgICAgRlhfSU5UMzIgaW5jcmVtZW50ID0gbGVmdFRvUmlnaHQgPyAtMSA6IDE7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCAyOyBpKyspIHsNCisgICAgICAgIEZYX0JPT0wgbCA9IGltYWdlLT5HZXQoY29ycmVjdGVkU3RhcnRDb2x1bW4sIGltYWdlUm93KTsNCisgICAgICAgIHdoaWxlICgoKGxlZnRUb1JpZ2h0ICYmIGNvcnJlY3RlZFN0YXJ0Q29sdW1uID49IG1pbkNvbHVtbikgfHwgKCFsZWZ0VG9SaWdodCAmJiBjb3JyZWN0ZWRTdGFydENvbHVtbiA8IG1heENvbHVtbikpICYmIGxlZnRUb1JpZ2h0ID09IGltYWdlLT5HZXQoY29ycmVjdGVkU3RhcnRDb2x1bW4sIGltYWdlUm93KSkgew0KKyAgICAgICAgICAgIGlmIChhYnMoY29kZXdvcmRTdGFydENvbHVtbiAtIGNvcnJlY3RlZFN0YXJ0Q29sdW1uKSA+IENPREVXT1JEX1NLRVdfU0laRSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZXdvcmRTdGFydENvbHVtbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY29ycmVjdGVkU3RhcnRDb2x1bW4gKz0gaW5jcmVtZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaW5jcmVtZW50ID0gLWluY3JlbWVudDsNCisgICAgICAgIGxlZnRUb1JpZ2h0ID0gIWxlZnRUb1JpZ2h0Ow0KKyAgICB9DQorICAgIHJldHVybiBjb3JyZWN0ZWRTdGFydENvbHVtbjsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjaGVja0NvZGV3b3JkU2tldyhGWF9JTlQzMiBjb2Rld29yZFNpemUsIEZYX0lOVDMyIG1pbkNvZGV3b3JkV2lkdGgsIEZYX0lOVDMyIG1heENvZGV3b3JkV2lkdGgpDQorew0KKyAgICByZXR1cm4gbWluQ29kZXdvcmRXaWR0aCAtIENPREVXT1JEX1NLRVdfU0laRSA8PSBjb2Rld29yZFNpemUgJiYgY29kZXdvcmRTaXplIDw9IG1heENvZGV3b3JkV2lkdGggKyBDT0RFV09SRF9TS0VXX1NJWkU7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpkZWNvZGVDb2Rld29yZHMoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgRlhfSU5UMzIgZWNMZXZlbCwgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChjb2Rld29yZHMuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbnVtRUNDb2Rld29yZHMgPSAxIDw8IChlY0xldmVsICsgMSk7DQorICAgIEZYX0lOVDMyIGNvcnJlY3RlZEVycm9yc0NvdW50ID0gY29ycmVjdEVycm9ycyhjb2Rld29yZHMsIGVyYXN1cmVzLCBudW1FQ0NvZGV3b3JkcywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlICwgTlVMTCk7DQorICAgIHZlcmlmeUNvZGV3b3JkQ291bnQoY29kZXdvcmRzLCBudW1FQ0NvZGV3b3JkcywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZzsNCisgICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZXJSZXN1bHQgPSBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpkZWNvZGUoY29kZXdvcmRzLCBieXRlc3RyaW5nLkZvcm1hdEludGVnZXIoZWNMZXZlbCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBkZWNvZGVyUmVzdWx0Ow0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjb3JyZWN0RXJyb3JzKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIENGWF9JbnQzMkFycmF5ICZlcmFzdXJlcywgRlhfSU5UMzIgbnVtRUNDb2Rld29yZHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKChlcmFzdXJlcy5HZXRTaXplKCkgIT0gMCAmJiBlcmFzdXJlcy5HZXRTaXplKCkgPiAobnVtRUNDb2Rld29yZHMgLyAyICsgTUFYX0VSUk9SUykpIHx8IG51bUVDQ29kZXdvcmRzIDwgMCB8fCBudW1FQ0NvZGV3b3JkcyA+IE1BWF9FQ19DT0RFV09SRFMpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2U7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgRlhfSU5UMzIgcmVzdWx0ID0gQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpkZWNvZGUoY29kZXdvcmRzLCBudW1FQ0NvZGV3b3JkcywgZXJhc3VyZXMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCit2b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OnZlcmlmeUNvZGV3b3JkQ291bnQoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgRlhfSU5UMzIgbnVtRUNDb2Rld29yZHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGNvZGV3b3Jkcy5HZXRTaXplKCkgPCA0KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBudW1iZXJPZkNvZGV3b3JkcyA9IGNvZGV3b3Jkcy5HZXRBdCgwKTsNCisgICAgaWYgKG51bWJlck9mQ29kZXdvcmRzID4gY29kZXdvcmRzLkdldFNpemUoKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKG51bWJlck9mQ29kZXdvcmRzID09IDApIHsNCisgICAgICAgIGlmIChudW1FQ0NvZGV3b3JkcyA8IGNvZGV3b3Jkcy5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICBjb2Rld29yZHNbMF0gPSBjb2Rld29yZHMuR2V0U2l6ZSgpIC0gbnVtRUNDb2Rld29yZHM7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0Qml0Q291bnRGb3JDb2Rld29yZChGWF9JTlQzMiBjb2Rld29yZCkNCit7DQorICAgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgIHJlc3VsdC0+U2V0U2l6ZSg4KTsNCisgICAgRlhfSU5UMzIgcHJldmlvdXNWYWx1ZSA9IDA7DQorICAgIEZYX0lOVDMyIGkgPSByZXN1bHQtPkdldFNpemUoKSAtIDE7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBpZiAoKGNvZGV3b3JkICYgMHgxKSAhPSBwcmV2aW91c1ZhbHVlKSB7DQorICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IGNvZGV3b3JkICYgMHgxOw0KKyAgICAgICAgICAgIGktLTsNCisgICAgICAgICAgICBpZiAoaSA8IDApIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0LT5TZXRBdChpLCByZXN1bHQtPkdldEF0KGkpICsgMSk7DQorICAgICAgICBjb2Rld29yZCA+Pj0gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCitGWF9JTlQzMiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihGWF9JTlQzMiBjb2Rld29yZCkNCit7DQorICAgIENGWF9JbnQzMkFycmF5KiBhcnJheSA9IGdldEJpdENvdW50Rm9yQ29kZXdvcmQoY29kZXdvcmQpOw0KKyAgICBGWF9JTlQzMiByZXN1bHQgPSBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcigqYXJyYXkpOw0KKyAgICBkZWxldGUgYXJyYXk7DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0lOVDMyIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldENvZGV3b3JkQnVja2V0TnVtYmVyKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkNCit7DQorICAgIHJldHVybiAobW9kdWxlQml0Q291bnQuR2V0QXQoMCkgLSBtb2R1bGVCaXRDb3VudC5HZXRBdCgyKSArIG1vZHVsZUJpdENvdW50LkdldEF0KDQpIC0gbW9kdWxlQml0Q291bnQuR2V0QXQoNikgKyA5KSAlIDk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1BERjQxN1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5Mjc5YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19QREY0MTdXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfVHdvRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUERGNDE3Q29tcGFjdGlvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxNy5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1BERjQxN1dyaXRlci5oIg0KK0NCQ19QREY0MTdXcml0ZXI6OkNCQ19QREY0MTdXcml0ZXIoKQ0KK3sNCisgICAgbV9iRml4ZWRTaXplID0gRkFMU0U7DQorfQ0KK0NCQ19QREY0MTdXcml0ZXI6On5DQkNfUERGNDE3V3JpdGVyKCkNCit7DQorICAgIG1fYlRydW5jYXRlZCA9IFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ0JDX1BERjQxN1dyaXRlcjo6IFNldEVycm9yQ29ycmVjdGlvbkxldmVsKEZYX0lOVDMyIGxldmVsKQ0KK3sNCisgICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDgpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1dyaXRlcjo6U2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKQ0KK3sNCisgICAgbV9iVHJ1bmNhdGVkID0gdHJ1bmNhdGVkOw0KK30NCitGWF9CWVRFKiBDQkNfUERGNDE3V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoIGZvcm1hdCAhPSBCQ0ZPUk1BVF9QREZfNDE3KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IGNvbnRlbnRzLlVURjhEZWNvZGUoKTsNCisgICAgcmV0dXJuIEVuY29kZShlbmNvZGVDb250ZW50cywgb3V0V2lkdGgsIG91dEhlaWdodCwgZSApOw0KK30NCitGWF9CWVRFKiBDQkNfUERGNDE3V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JZVEUqIENCQ19QREY0MTdXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUERGNDE3IGVuY29kZXI7DQorICAgIEZYX0lOVDMyIGNvbCA9IChtX1dpZHRoIC8gbV9Nb2R1bGVXaWR0aCAtIDY5KSAvIDE3Ow0KKyAgICBGWF9JTlQzMiByb3cgPSBtX0hlaWdodCAvIChtX01vZHVsZVdpZHRoICogMjApOw0KKyAgICBpZiAocm93ID49IDMgJiYgcm93IDw9IDkwICYmIGNvbCA+PSAxICYmIGNvbCA8PSAzMCkgew0KKyAgICAgICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKGNvbCwgY29sLCByb3csIHJvdyk7DQorICAgIH0gZWxzZSBpZiAoY29sID49IDEgJiYgY29sIDw9IDMwKSB7DQorICAgICAgICBlbmNvZGVyLnNldERpbWVuc2lvbnMoY29sLCBjb2wsIDkwLCAzKTsNCisgICAgfSBlbHNlIGlmIChyb3cgPj0gMyAmJiByb3cgPD0gOTApIHsNCisgICAgICAgIGVuY29kZXIuc2V0RGltZW5zaW9ucygzMCwgMSwgcm93LCByb3cpOw0KKyAgICB9DQorICAgIGVuY29kZXIuZ2VuZXJhdGVCYXJjb2RlTG9naWMoY29udGVudHMsIG1faUNvcnJlY3RMZXZlbCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgTlVMTCk7DQorICAgIEZYX0lOVDMyIGxpbmVUaGlja25lc3MgPSAyOw0KKyAgICBGWF9JTlQzMiBhc3BlY3RSYXRpbyA9IDQ7DQorICAgIENCQ19CYXJjb2RlTWF0cml4KiBiYXJjb2RlTWF0cml4ID0gZW5jb2Rlci5nZXRCYXJjb2RlTWF0cml4KCk7DQorICAgIENGWF9CeXRlQXJyYXkgb3JpZ2luYWxTY2FsZTsNCisgICAgb3JpZ2luYWxTY2FsZS5Db3B5KGJhcmNvZGVNYXRyaXgtPmdldFNjYWxlZE1hdHJpeChsaW5lVGhpY2tuZXNzLCBhc3BlY3RSYXRpbyAqIGxpbmVUaGlja25lc3MpKTsNCisgICAgRlhfSU5UMzIgd2lkdGggPSBvdXRXaWR0aDsNCisgICAgRlhfSU5UMzIgaGVpZ2h0ID0gb3V0SGVpZ2h0Ow0KKyAgICBvdXRXaWR0aCA9IGJhcmNvZGVNYXRyaXgtPmdldFdpZHRoKCk7DQorICAgIG91dEhlaWdodCA9IGJhcmNvZGVNYXRyaXgtPmdldEhlaWdodCgpOw0KKyAgICBGWF9CT09MIHJvdGF0ZWQgPSBGQUxTRTsNCisgICAgaWYgKChoZWlnaHQgPiB3aWR0aCkgXiAob3V0V2lkdGggPCBvdXRIZWlnaHQpKSB7DQorICAgICAgICByb3RhdGVBcnJheShvcmlnaW5hbFNjYWxlLCBvdXRIZWlnaHQsIG91dFdpZHRoKTsNCisgICAgICAgIHJvdGF0ZWQgPSBUUlVFOw0KKyAgICAgICAgRlhfSU5UMzIgdGVtcCA9IG91dEhlaWdodDsNCisgICAgICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KKyAgICAgICAgb3V0V2lkdGggPSB0ZW1wOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHNjYWxlWCA9IHdpZHRoIC8gb3V0V2lkdGg7DQorICAgIEZYX0lOVDMyIHNjYWxlWSA9IGhlaWdodCAvIG91dEhlaWdodDsNCisgICAgRlhfSU5UMzIgc2NhbGU7DQorICAgIGlmIChzY2FsZVggPCBzY2FsZVkpIHsNCisgICAgICAgIHNjYWxlID0gc2NhbGVYOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgc2NhbGUgPSBzY2FsZVk7DQorICAgIH0NCisgICAgaWYgKHNjYWxlID4gMSkgew0KKyAgICAgICAgb3JpZ2luYWxTY2FsZS5SZW1vdmVBbGwoKTsNCisgICAgICAgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoc2NhbGUgKiBsaW5lVGhpY2tuZXNzLCBzY2FsZSAqIGFzcGVjdFJhdGlvICogbGluZVRoaWNrbmVzcykpOw0KKyAgICAgICAgaWYgKHJvdGF0ZWQpIHsNCisgICAgICAgICAgICByb3RhdGVBcnJheShvcmlnaW5hbFNjYWxlLCBvdXRIZWlnaHQsIG91dFdpZHRoKTsNCisgICAgICAgICAgICBGWF9JTlQzMiB0ZW1wID0gb3V0SGVpZ2h0Ow0KKyAgICAgICAgICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KKyAgICAgICAgICAgIG91dFdpZHRoID0gdGVtcDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CWVRFKiByZXN1bHQgPSAoRlhfQllURSopRlhfQWxsb2MoRlhfQllURSwgb3V0SGVpZ2h0ICogb3V0V2lkdGgpOw0KKyAgICBGWFNZU19tZW1jcHkzMihyZXN1bHQsIG9yaWdpbmFsU2NhbGUuR2V0RGF0YSgpLCBvdXRIZWlnaHQgKiBvdXRXaWR0aCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1dyaXRlcjo6cm90YXRlQXJyYXkoQ0ZYX0J5dGVBcnJheSYgYml0YXJyYXksIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgd2lkdGgpDQorew0KKyAgICBDRlhfQnl0ZUFycmF5IHRlbXA7DQorICAgIHRlbXAuQ29weShiaXRhcnJheSk7DQorICAgIGZvciAoRlhfSU5UMzIgaWkgPSAwOyBpaSA8IGhlaWdodDsgaWkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgaW52ZXJzZWlpID0gaGVpZ2h0IC0gaWkgLSAxOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBqaiA9IDA7IGpqIDwgd2lkdGg7IGpqKyspIHsNCisgICAgICAgICAgICBiaXRhcnJheVtqaiAqIGhlaWdodCArIGludmVyc2VpaV0gPSB0ZW1wW2lpICogd2lkdGggKyBqal07DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk0OGNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgiDQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6Q0JDX1FSQWxpZ25tZW50UGF0dGVybihGWF9GTE9BVCBwb3NYLCBGWF9GTE9BVCBwb3NZLCBGWF9GTE9BVCBlc3RpbWF0ZU1vZHVsZVNpemUpOg0KKyAgICBDQkNfUmVzdWx0UG9pbnQocG9zWCwgcG9zWSksIG1fbW9kdWxlU2l6ZShlc3RpbWF0ZU1vZHVsZVNpemUpDQorew0KK30NCitDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjp+Q0JDX1FSQWxpZ25tZW50UGF0dGVybigpDQorew0KK30NCitGWF9GTE9BVCBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjpHZXRYKCkNCit7DQorICAgIHJldHVybiBtX3g7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkFsaWdubWVudFBhdHRlcm46OkdldFkoKQ0KK3sNCisgICAgcmV0dXJuIG1feTsNCit9DQorRlhfQk9PTCBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjpBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKQ0KK3sNCisgICAgaWYgKChGWFNZU19mYWJzKGkgLSBHZXRZKCkpIDw9IG1vZHVsZVNpemUpICYmIChGWFNZU19mYWJzKGogLSBHZXRYKCkpIDw9IG1vZHVsZVNpemUpKSB7DQorICAgICAgICBGWF9GTE9BVCBtb2R1bGVTaXplRGlmZiA9IEZYU1lTX2ZhYnMobW9kdWxlU2l6ZSAtIG1fbW9kdWxlU2l6ZSk7DQorICAgICAgICByZXR1cm4gKG1vZHVsZVNpemVEaWZmIDw9IDEuMGYpIHx8IChtb2R1bGVTaXplRGlmZiAvIG1fbW9kdWxlU2l6ZSA8PSAxLjBmKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4gKkNCQ19RUkFsaWdubWVudFBhdHRlcm46OkNsb25lKCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ0JDX1FSQWxpZ25tZW50UGF0dGVybihtX3gsIG1feSwgbV9tb2R1bGVTaXplKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRhYmQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5jcHAKQEAgLTAsMCArMSwxNzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsDQorICAgICAgICBGWF9JTlQzMiBzdGFydFgsDQorICAgICAgICBGWF9JTlQzMiBzdGFydFksDQorICAgICAgICBGWF9JTlQzMiB3aWR0aCwNCisgICAgICAgIEZYX0lOVDMyIGhlaWdodCwNCisgICAgICAgIEZYX0ZMT0FUIG1vZHVsZVNpemUpOiBtX2ltYWdlKGltYWdlKSwNCisgICAgbV9zdGFydFgoc3RhcnRYKSwNCisgICAgbV9zdGFydFkoc3RhcnRZKSwNCisgICAgbV93aWR0aCh3aWR0aCksDQorICAgIG1faGVpZ2h0KGhlaWdodCksDQorICAgIG1fbW9kdWxlU2l6ZShtb2R1bGVTaXplKQ0KKw0KK3sNCisgICAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudC5TZXRTaXplKDMpOw0KK30NCitDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOjp+Q0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcigpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0JDX1FSQWxpZ25tZW50UGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQorICAgIH0NCisgICAgbV9wb3NzaWJsZUNlbnRlcnMuUmVtb3ZlQWxsKCk7DQorfQ0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4gICpDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOjpGaW5kKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgc3RhcnRYID0gbV9zdGFydFg7DQorICAgIEZYX0lOVDMyIGhlaWdodCA9IG1faGVpZ2h0Ow0KKyAgICBGWF9JTlQzMiBtYXhKID0gc3RhcnRYICsgbV93aWR0aDsNCisgICAgRlhfSU5UMzIgbWlkZGxlSSA9IG1fc3RhcnRZICsgKGhlaWdodCA+PiAxKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgc3RhdGVDb3VudDsNCisgICAgc3RhdGVDb3VudC5TZXRTaXplKDMpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGlHZW4gPSAwOyBpR2VuIDwgaGVpZ2h0OyBpR2VuKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGkgPSBtaWRkbGVJICsgKChpR2VuICYgMHgwMSkgPT0gMCA/ICgoaUdlbiArIDEpID4+IDEpIDogLSgoaUdlbiArIDEpID4+IDEpKTsNCisgICAgICAgIHN0YXRlQ291bnRbMF0gPSAwOw0KKyAgICAgICAgc3RhdGVDb3VudFsxXSA9IDA7DQorICAgICAgICBzdGF0ZUNvdW50WzJdID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGogPSBzdGFydFg7DQorICAgICAgICB3aGlsZSAoaiA8IG1heEogJiYgIW1faW1hZ2UtPkdldChqLCBpKSkgew0KKyAgICAgICAgICAgIGorKzsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGN1cnJlbnRTdGF0ZSA9IDA7DQorICAgICAgICB3aGlsZSAoaiA8IG1heEopIHsNCisgICAgICAgICAgICBpZiAobV9pbWFnZS0+R2V0KGosIGkpKSB7DQorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAgKmNvbmZpcm1lZCA9IEhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIGopOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlybWVkICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maXJtZWQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFswXSA9IHN0YXRlQ291bnRbMl07DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsxXSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gMTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsrK2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGorKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgew0KKyAgICAgICAgICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4gKmNvbmZpcm1lZCA9IEhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIG1heEopOw0KKyAgICAgICAgICAgIGlmIChjb25maXJtZWQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlybWVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpICE9IDApIHsNCisgICAgICAgIHJldHVybgkoKENCQ19RUkFsaWdubWVudFBhdHRlcm4qKSAobV9wb3NzaWJsZUNlbnRlcnNbMF0pICktPkNsb25lKCk7DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfRkxPQVQgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6Q2VudGVyRnJvbUVuZChjb25zdCBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCwgRlhfSU5UMzIgZW5kKQ0KK3sNCisgICAgcmV0dXJuIChGWF9GTE9BVCkgKGVuZCAtIHN0YXRlQ291bnRbMl0pIC0gc3RhdGVDb3VudFsxXSAvIDIuMGY7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6Rm91bmRQYXR0ZXJuQ3Jvc3MoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQpDQorew0KKyAgICBGWF9GTE9BVCBtb2R1bGVTaXplID0gbV9tb2R1bGVTaXplOw0KKyAgICBGWF9GTE9BVCBtYXhWYXJpYW5jZSA9IG1vZHVsZVNpemUgLyAyLjBmOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICBpZiAoZmFicyhtb2R1bGVTaXplIC0gc3RhdGVDb3VudFtpXSkgPj0gbWF4VmFyaWFuY2UpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNyb3NzQ2hlY2tWZXJ0aWNhbChGWF9JTlQzMiBzdGFydEksIEZYX0lOVDMyIGNlbnRlckosIEZYX0lOVDMyIG1heENvdW50LCBGWF9JTlQzMiBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkNCit7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlID0gbV9pbWFnZTsNCisgICAgRlhfSU5UMzIgbWF4SSA9IG1faW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KKyAgICBzdGF0ZUNvdW50LkNvcHkobV9jcm9zc0NoZWNrU3RhdGVDb3VudCk7DQorICAgIHN0YXRlQ291bnRbMF0gPSAwOw0KKyAgICBzdGF0ZUNvdW50WzFdID0gMDsNCisgICAgc3RhdGVDb3VudFsyXSA9IDA7DQorICAgIEZYX0lOVDMyIGkgPSBzdGFydEk7DQorICAgIHdoaWxlIChpID49IDAgJiYgbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMV0gPD0gbWF4Q291bnQpIHsNCisgICAgICAgIHN0YXRlQ291bnRbMV0rKzsNCisgICAgICAgIGktLTsNCisgICAgfQ0KKyAgICBpZiAoaSA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICAgIH0NCisgICAgd2hpbGUgKGkgPj0gMCAmJiAhbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpIHsNCisgICAgICAgIHN0YXRlQ291bnRbMF0rKzsNCisgICAgICAgIGktLTsNCisgICAgfQ0KKyAgICBpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KSB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICAgIH0NCisgICAgaSA9IHN0YXJ0SSArIDE7DQorICAgIHdoaWxlIChpIDwgbWF4SSAmJiBtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KKyAgICAgICAgc3RhdGVDb3VudFsxXSsrOw0KKyAgICAgICAgaSsrOw0KKyAgICB9DQorICAgIGlmIChpID09IG1heEkgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICAgIH0NCisgICAgd2hpbGUgKGkgPCBtYXhJICYmICFtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsyXSA8PSBtYXhDb3VudCkgew0KKyAgICAgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICAgICAgaSsrOw0KKyAgICB9DQorICAgIGlmIChzdGF0ZUNvdW50WzJdID4gbWF4Q291bnQpIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl07DQorICAgIGlmICg1ICogYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA+PSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgICB9DQorICAgIHJldHVybiBGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSA/IENlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaSkgOiBGWFNZU19uYW4oKTsNCit9DQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6SGFuZGxlUG9zc2libGVDZW50ZXIoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIEZYX0lOVDMyIGksIEZYX0lOVDMyIGopDQorew0KKyAgICBGWF9JTlQzMiBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl07DQorICAgIEZYX0ZMT0FUIGNlbnRlckogPSBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOw0KKyAgICBGWF9GTE9BVCBjZW50ZXJJID0gQ3Jvc3NDaGVja1ZlcnRpY2FsKGksIChGWF9JTlQzMikgY2VudGVySiwgMiAqIHN0YXRlQ291bnRbMV0sIHN0YXRlQ291bnRUb3RhbCk7DQorICAgIGlmICghRlhTWVNfaXNuYW4oY2VudGVySSkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUgPSAoRlhfRkxPQVQpIChzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0pIC8gMy4wZjsNCisgICAgICAgIEZYX0lOVDMyIG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaW5kZXggPSAwOyBpbmRleCA8IG1heDsgaW5kZXgrKykgew0KKyAgICAgICAgICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4gKmNlbnRlciA9IChDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICopKG1fcG9zc2libGVDZW50ZXJzW2luZGV4XSk7DQorICAgICAgICAgICAgaWYgKGNlbnRlci0+QWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksIGVzdGltYXRlZE1vZHVsZVNpemUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1fcG9zc2libGVDZW50ZXJzLkFkZChGWF9ORVcgQ0JDX1FSQWxpZ25tZW50UGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKSk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkJpdE1hdHJpeFBhcnNlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJCaXRNYXRyaXhQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmIwMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJCaXRNYXRyaXhQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlclZlcnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkRhdGFNYXNrLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaCINCitDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OkNCQ19RUkJpdE1hdHJpeFBhcnNlcigpDQorew0KK30NCit2b2lkIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6SW5pdChDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgbV9kaW1lbnNpb24gPSBiaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIG1fdGVtcEJpdE1hdHJpeCA9IGJpdE1hdHJpeDsNCisgICAgaWYobV9kaW1lbnNpb24gPCAyMSB8fCAobV9kaW1lbnNpb24gJiAweDAzKSAhPSAxKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgbV9iaXRNYXRyaXggPSBtX3RlbXBCaXRNYXRyaXg7DQorICAgIG1fcGFyc2VkRm9ybWF0SW5mbyA9IE5VTEw7DQorICAgIG1fdmVyc2lvbiA9IE5VTEw7DQorfQ0KK0NCQ19RUkJpdE1hdHJpeFBhcnNlcjo6fkNCQ19RUkJpdE1hdHJpeFBhcnNlcigpDQorew0KKyAgICBpZihtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgICAgICAgIG1fcGFyc2VkRm9ybWF0SW5mbyA9IE5VTEw7DQorICAgIH0NCisgICAgbV92ZXJzaW9uID0gTlVMTDsNCit9DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpSZWFkRm9ybWF0SW5mb3JtYXRpb24oRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBmb3JtYXRJbmZvQml0cyA9IDA7DQorICAgIEZYX0lOVDMyIGo7DQorICAgIGZvciggaiA9IDA7IGogPCA2OyBqKyspIHsNCisgICAgICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg4LCBqLCBmb3JtYXRJbmZvQml0cyk7DQorICAgIH0NCisgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDgsIDcsIGZvcm1hdEluZm9CaXRzKTsNCisgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDgsIDgsIGZvcm1hdEluZm9CaXRzKTsNCisgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDcsIDgsIGZvcm1hdEluZm9CaXRzKTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSA1OyBpID49IDA7IGktLSkgew0KKyAgICAgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KGksIDgsIGZvcm1hdEluZm9CaXRzKTsNCisgICAgfQ0KKyAgICBtX3BhcnNlZEZvcm1hdEluZm8gPSBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihmb3JtYXRJbmZvQml0cyk7DQorICAgIGlmKG1fcGFyc2VkRm9ybWF0SW5mbyAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gbV9wYXJzZWRGb3JtYXRJbmZvOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGRpbWVuc2lvbiA9IG1fYml0TWF0cml4LT5HZXREaW1lbnNpb24oZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgZm9ybWF0SW5mb0JpdHMgPSAwOw0KKyAgICBGWF9JTlQzMiBpTWluID0gZGltZW5zaW9uIC0gODsNCisgICAgZm9yKGogPSBkaW1lbnNpb24gLSAxOyBqID49IGlNaW47IGotLSkgew0KKyAgICAgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KGosIDgsIGZvcm1hdEluZm9CaXRzKTsNCisgICAgfQ0KKyAgICBmb3IoRlhfSU5UMzIgayA9IGRpbWVuc2lvbiAtIDc7IGsgPCBkaW1lbnNpb247IGsrKykgew0KKyAgICAgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDgsIGsgLCBmb3JtYXRJbmZvQml0cyk7DQorICAgIH0NCisgICAgbV9wYXJzZWRGb3JtYXRJbmZvID0gQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6RGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oZm9ybWF0SW5mb0JpdHMpOw0KKyAgICBpZihtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgICAgfQ0KKyAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6UmVhZFZlcnNpb24oRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtX3ZlcnNpb24gIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIG1fdmVyc2lvbjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBkaW1lbnNpb24gPSBtX2JpdE1hdHJpeC0+R2V0RGltZW5zaW9uKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0lOVDMyIHByb3Zpc2lvblZlcnNpb24gPSAoZGltZW5zaW9uIC0gMTcpID4+IDI7DQorICAgIGlmKHByb3Zpc2lvblZlcnNpb24gPD0gNikgew0KKyAgICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxcnYgPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIocHJvdmlzaW9uVmVyc2lvbiwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gcXJ2Ow0KKyAgICB9DQorICAgIEZYX0lOVDMyIHZlcnNpb25CaXRzID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gNTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgIEZYX0lOVDMyIGpNaW4gPSBkaW1lbnNpb24gLSAxMTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IGRpbWVuc2lvbiAtIDk7IGogPj0gak1pbjsgai0tKSB7DQorICAgICAgICAgICAgdmVyc2lvbkJpdHMgPSBDb3B5Qml0KGksIGosIHZlcnNpb25CaXRzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3ZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkRlY29kZVZlcnNpb25JbmZvcm1hdGlvbih2ZXJzaW9uQml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgaWYgKG1fdmVyc2lvbiAhPSBOVUxMICYmIG1fdmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpID09IGRpbWVuc2lvbikgew0KKyAgICAgICAgcmV0dXJuIG1fdmVyc2lvbjsNCisgICAgfQ0KKyAgICB2ZXJzaW9uQml0cyA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaiA9IDU7IGogPj0gMDsgai0tKSB7DQorICAgICAgICBGWF9JTlQzMiBpTWluID0gZGltZW5zaW9uIC0gMTE7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBkaW1lbnNpb24gLSA5OyBpID49IGlNaW47IGktLSkgew0KKyAgICAgICAgICAgIHZlcnNpb25CaXRzID0gQ29weUJpdChpLCBqLCB2ZXJzaW9uQml0cyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV92ZXJzaW9uID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24odmVyc2lvbkJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGlmIChtX3ZlcnNpb24gIT0gTlVMTCAmJiBtX3ZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSA9PSBkaW1lbnNpb24pIHsNCisgICAgICAgIHJldHVybiBtX3ZlcnNpb247DQorICAgIH0NCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpDb3B5Qml0KEZYX0lOVDMyIGksIEZYX0lOVDMyIGosIEZYX0lOVDMyIHZlcnNpb25CaXRzKQ0KK3sNCisgICAgcmV0dXJuIG1fYml0TWF0cml4LT5HZXQoaiwgaSkgPyAodmVyc2lvbkJpdHMgPDwgMSkgfCAweDEgOiB2ZXJzaW9uQml0cyA8PCAxOw0KK30NCitDRlhfQnl0ZUFycmF5KiBDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb2Rld29yZHMoRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uICpmb3JtYXRJbmZvICAgPSBSZWFkRm9ybWF0SW5mb3JtYXRpb24oZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKQ0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24JCQkgICp2ZXJzaW9uCQk9IFJlYWRWZXJzaW9uKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19RUkRhdGFNYXNrCQkgICpkYXRhTWFzawkJPSBDQkNfUVJEYXRhTWFzazo6Rm9yUmVmZXJlbmNlKChGWF9JTlQzMikoZm9ybWF0SW5mby0+R2V0RGF0YU1hc2soKSksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0lOVDMyCQkJCSAgZGltZW5zaW9uCQk9IG1fYml0TWF0cml4LT5HZXREaW1lbnNpb24oZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgZGF0YU1hc2stPlVubWFza0JpdE1hdGlyeChtX2JpdE1hdHJpeCwgZGltZW5zaW9uKTsNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogY2JtID0gdmVyc2lvbi0+QnVpbGRGdW5jdGlvblBhdHRlcm4oZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeCA+IGZ1bmN0aW9uUGF0dGVybihjYm0pOw0KKyAgICBGWF9CT09MCQkJICByZWFkaW5nVXAJCT0gVFJVRTsNCisgICAgQ0ZYX0J5dGVBcnJheSAqIHRlbXAgPSBGWF9ORVcgQ0ZYX0J5dGVBcnJheTsNCisgICAgdGVtcC0+U2V0U2l6ZSh2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gcmVzdWx0KHRlbXApOw0KKyAgICBGWF9JTlQzMgkJCQkgICByZXN1bHRPZmZzZXQgPSAwOw0KKyAgICBGWF9JTlQzMgkJCQkgICBjdXJyZW50Qnl0ZQk9IDA7DQorICAgIEZYX0lOVDMyCQkJCSAgIGJpdHNSZWFkCQk9IDA7DQorICAgIGZvcihGWF9JTlQzMiBqID0gZGltZW5zaW9uIC0gMTsgaiA+IDA7IGogLT0gMikgew0KKyAgICAgICAgaWYoaiA9PSA2KSB7DQorICAgICAgICAgICAgai0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGNvdW50ID0gMDsgY291bnQgPCBkaW1lbnNpb247IGNvdW50KyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpID0gcmVhZGluZ1VwID8gZGltZW5zaW9uIC0gMSAtIGNvdW50IDogY291bnQ7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGNvbCA9IDA7IGNvbCA8IDI7IGNvbCsrKSB7DQorICAgICAgICAgICAgICAgIGlmKCFmdW5jdGlvblBhdHRlcm4tPkdldChqIC0gY29sLCBpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYml0c1JlYWQrKzsNCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgICAgICAgICAgICAgICAgICAgaWYobV9iaXRNYXRyaXgtPkdldChqIC0gY29sLCBpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihiaXRzUmVhZCA9PSA4KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9IChGWF9CWVRFKSBjdXJyZW50Qnl0ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUmVhZCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ5dGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVhZGluZ1VwIF49IFRSVUU7DQorICAgIH0NCisgICAgaWYocmVzdWx0T2Zmc2V0ICE9IHZlcnNpb24tPkdldFRvdGFsQ29kZVdvcmRzKCkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZVJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZDU0OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVSZWFkZXIuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVSZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJpemVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJEZWNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJEZXRlY3Rvci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkRhdGFNYXNrLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZVJlYWRlci5oIg0KK0NCQ19RUkNvZGVSZWFkZXI6OkNCQ19RUkNvZGVSZWFkZXIoKTogbV9kZWNvZGVyKE5VTEwpDQorew0KK30NCit2b2lkIENCQ19RUkNvZGVSZWFkZXI6OkluaXQoKQ0KK3sNCisgICAgbV9kZWNvZGVyID0gRlhfTkVXIENCQ19RUkNvZGVyRGVjb2RlcjsNCisgICAgbV9kZWNvZGVyLT5Jbml0KCk7DQorfQ0KK0NCQ19RUkNvZGVSZWFkZXI6On5DQkNfUVJDb2RlUmVhZGVyKCkNCit7DQorICAgIGlmKG1fZGVjb2RlciAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9kZWNvZGVyOw0KKyAgICB9DQorICAgIG1fZGVjb2RlciA9IE5VTEw7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbWF0cml4ID0gaW1hZ2UtPkdldE1hdHJpeChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgQ0JDX1FSRGV0ZWN0b3IgZGV0ZWN0b3IobWF0cml4KTsNCisgICAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIHFkciA9IGRldGVjdG9yLkRldGVjdChoaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIENCQ19BdXRvUHRyPENCQ19RUkRldGVjdG9yUmVzdWx0PiBkZXRlY3RvclJlc3VsdChxZHIpOw0KKyAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogcWRyMiA9IG1fZGVjb2Rlci0+RGVjb2RlKGRldGVjdG9yUmVzdWx0LT5HZXRCaXRzKCksIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uRGVjb2RlclJlc3VsdD4gZGVjb2RlUmVzdWx0KHFkcjIpOw0KKyAgICByZXR1cm4gKGRlY29kZVJlc3VsdC0+R2V0VGV4dCgpKTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZVJlYWRlcjo6RGVjb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmaWxlbmFtZSwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyIGJ5dGVNb2RlRGVjb2RlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShmaWxlbmFtZSk7DQorICAgIHNvdXJjZS5Jbml0KGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKCZiaXRtYXAsIGhpbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgcmV0dXJuIGJzOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlUmVhZGVyOjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgYnl0ZU1vZGVEZWNvZGUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgICAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKCZiaXRtYXAsIGhpbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgcmV0dXJuIGJzOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gYnM7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZVJlYWRlcjo6UmVsZWFzZUFsbCgpDQorew0KKyAgICBpZihDQkNfUmVlZFNvbG9tb25HRjI1NiA6OlFSQ29kZUZpbGQpIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1NiA6OlFSQ29kZUZpbGQ7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NiA6OlFSQ29kZUZpbGQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKENCQ19SZWVkU29sb21vbkdGMjU2IDo6RGF0YU1hdHJpeEZpZWxkKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgOjpEYXRhTWF0cml4RmllbGQ7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NiA6OkRhdGFNYXRyaXhGaWVsZCA9IE5VTEw7DQorICAgIH0NCisgICAgQ0JDX1FSQ29kZXJNb2RlOjpEZXN0cm95KCk7DQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKTsNCisgICAgQ0JDX1FSRGF0YU1hc2s6OkRlc3Ryb3koKTsNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZXN0cm95KCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyZTA4YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVXcml0ZXIuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Ud29EaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVXcml0ZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CeXRlTWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlUmVhZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQorQ0JDX1FSQ29kZVdyaXRlcjo6Q0JDX1FSQ29kZVdyaXRlcigpDQorew0KKyAgICBtX2JGaXhlZFNpemUgPSBUUlVFOw0KKyAgICBtX2lDb3JyZWN0TGV2ZWwgPSAxOw0KKyAgICBtX2lWZXJzaW9uID0gMDsNCit9DQorQ0JDX1FSQ29kZVdyaXRlcjo6fkNCQ19RUkNvZGVXcml0ZXIoKQ0KK3sNCit9DQordm9pZCBDQkNfUVJDb2RlV3JpdGVyOjpSZWxlYXNlQWxsKCkNCit7DQorICAgIENCQ19RUkNvZGVSZWFkZXI6OlJlbGVhc2VBbGwoKTsNCit9DQorRlhfQk9PTCBDQkNfUVJDb2RlV3JpdGVyOjpTZXRWZXJzaW9uKEZYX0lOVDMyIHZlcnNpb24pDQorew0KKyAgICBpZiAodmVyc2lvbiA8IDAgfHwgdmVyc2lvbiA+IDQwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9pVmVyc2lvbiA9IHZlcnNpb247DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVXcml0ZXI6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKEZYX0lOVDMyIGxldmVsKQ0KK3sNCisgICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDMpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JZVEUqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsIEZYX0lOVDMyIGVjTGV2ZWwsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsICplYyA9IE5VTEw7DQorICAgIHN3aXRjaChlY0xldmVsKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGVjID0gQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlE7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRFY2xldmVsOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIENCQ19RUkNvZGVyIHFyOw0KKyAgICBpZiAobV9pVmVyc2lvbiA+IDAgJiYgbV9pVmVyc2lvbiA8IDQxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyID0gY29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgICAgICAgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoYnl0ZVN0ciwgZWMsICZxciwgZSwgbV9pVmVyc2lvbik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb250ZW50cywgZWMsICZxciwgZSk7DQorICAgIH0NCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBvdXRXaWR0aCA9IHFyLkdldE1hdHJpeFdpZHRoKCk7DQorICAgIG91dEhlaWdodCA9IHFyLkdldE1hdHJpeFdpZHRoKCk7DQorICAgIEZYX0JZVEUqIHJlc3VsdCA9IEZYX0FsbG9jKEZYX0JZVEUsIG91dFdpZHRoICogb3V0V2lkdGgpOw0KKyAgICBGWFNZU19tZW1jcHkzMihyZXN1bHQsIHFyLkdldE1hdHJpeCgpLT5HZXRBcnJheSgpLCBvdXRXaWR0aCAqIG91dEhlaWdodCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0JZVEUgKkNCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfQllURSogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQyOTIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXIuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CeXRlTWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlci5oIg0KK0NCQ19RUkNvZGVyOjpDQkNfUVJDb2RlcigpDQorew0KKyAgICBtX21vZGUgPSBOVUxMOw0KKyAgICBtX2VjTGV2ZWwgPSBOVUxMOw0KKyAgICBtX3ZlcnNpb24gPSAtMTsNCisgICAgbV9tYXRyaXhXaWR0aCA9IC0xOw0KKyAgICBtX21hc2tQYXR0ZXJuID0gLTE7DQorICAgIG1fbnVtVG90YWxCeXRlcyA9IC0xOw0KKyAgICBtX251bURhdGFCeXRlcyA9IC0xOw0KKyAgICBtX251bUVDQnl0ZXMgPSAtMTsNCisgICAgbV9udW1SU0Jsb2NrcyA9IC0xOw0KKyAgICBtX21hdHJpeCA9IE5VTEw7DQorfQ0KK0NCQ19RUkNvZGVyOjp+Q0JDX1FSQ29kZXIoKQ0KK3sNCisgICAgaWYobV9tYXRyaXggIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fbWF0cml4Ow0KKyAgICAgICAgbV9tYXRyaXggPSBOVUxMOw0KKyAgICB9DQorICAgIG1fbW9kZSA9IE5VTEw7DQorICAgIG1fZWNMZXZlbCA9IE5VTEw7DQorICAgIG1fdmVyc2lvbiA9IC0xOw0KKyAgICBtX21hdHJpeFdpZHRoID0gLTE7DQorICAgIG1fbWFza1BhdHRlcm4gPSAtMTsNCisgICAgbV9udW1Ub3RhbEJ5dGVzID0gLTE7DQorICAgIG1fbnVtRGF0YUJ5dGVzID0gLTE7DQorICAgIG1fbnVtRUNCeXRlcyA9IC0xOw0KKyAgICBtX251bVJTQmxvY2tzID0gLTE7DQorfQ0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXI6OkdldE1vZGUoKQ0KK3sNCisgICAgcmV0dXJuIG1fbW9kZTsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXI6OkdldEVDTGV2ZWwoKQ0KK3sNCisgICAgcmV0dXJuIG1fZWNMZXZlbDsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXI6OkdldFZlcnNpb24oKQ0KK3sNCisgICAgcmV0dXJuIG1fdmVyc2lvbjsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXI6OkdldE1hdHJpeFdpZHRoKCkNCit7DQorICAgIHJldHVybiBtX21hdHJpeFdpZHRoOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlcjo6R2V0TWFza1BhdHRlcm4oKQ0KK3sNCisgICAgcmV0dXJuIG1fbWFza1BhdHRlcm47DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkNvZGVyOjpHZXROdW1Ub3RhbEJ5dGVzKCkNCit7DQorICAgIHJldHVybiBtX251bVRvdGFsQnl0ZXM7DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkNvZGVyOjpHZXROdW1EYXRhQnl0ZXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fbnVtRGF0YUJ5dGVzOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlcjo6R2V0TnVtRUNCeXRlcygpDQorew0KKyAgICByZXR1cm4gbV9udW1FQ0J5dGVzOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlcjo6R2V0TnVtUlNCbG9ja3MoKQ0KK3sNCisgICAgcmV0dXJuIG1fbnVtUlNCbG9ja3M7DQorfQ0KK0NCQ19Db21tb25CeXRlTWF0cml4KiBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4KCkNCit7DQorICAgIHJldHVybiBtX21hdHJpeDsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXI6OkF0KEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgdmFsdWUgPSBtX21hdHJpeC0+R2V0KHgsIHkpOw0KKyAgICBpZighKHZhbHVlID09IDAgfHwgdmFsdWUgPT0gMSkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblZhbHVlTXVzdEJlRWl0aGVyMG9yMTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgfQ0KKyAgICByZXR1cm4gdmFsdWU7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZXI6OklzVmFsaWQoKQ0KK3sNCisgICAgcmV0dXJuDQorICAgICAgICBtX21vZGUgIT0gTlVMTCAmJg0KKyAgICAgICAgbV9lY0xldmVsICE9IE5VTEwgJiYNCisgICAgICAgIG1fdmVyc2lvbiAhPSAtMSAmJg0KKyAgICAgICAgbV9tYXRyaXhXaWR0aCAhPSAtMSAmJg0KKyAgICAgICAgbV9tYXNrUGF0dGVybiAhPSAtMSAmJg0KKyAgICAgICAgbV9udW1Ub3RhbEJ5dGVzICE9IC0xICYmDQorICAgICAgICBtX251bURhdGFCeXRlcyAhPSAtMSAmJg0KKyAgICAgICAgbV9udW1FQ0J5dGVzICE9IC0xICYmDQorICAgICAgICBtX251bVJTQmxvY2tzICE9IC0xICYmDQorICAgICAgICBJc1ZhbGlkTWFza1BhdHRlcm4obV9tYXNrUGF0dGVybikgJiYNCisgICAgICAgIG1fbnVtVG90YWxCeXRlcyA9PSBtX251bURhdGFCeXRlcyArIG1fbnVtRUNCeXRlcyAmJg0KKyAgICAgICAgbV9tYXRyaXggIT0gTlVMTCAmJg0KKyAgICAgICAgbV9tYXRyaXhXaWR0aCA9PSBtX21hdHJpeC0+R2V0V2lkdGgoKSAmJg0KKyAgICAgICAgbV9tYXRyaXgtPkdldFdpZHRoKCkgPT0gbV9tYXRyaXgtPkdldEhlaWdodCgpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXRNb2RlKENCQ19RUkNvZGVyTW9kZSogdmFsdWUpDQorew0KKyAgICBtX21vZGUgPSB2YWx1ZTsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0RUNMZXZlbChDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKQ0KK3sNCisgICAgbV9lY0xldmVsID0gZWNMZXZlbDsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0VmVyc2lvbihGWF9JTlQzMiB2ZXJzaW9uKQ0KK3sNCisgICAgbV92ZXJzaW9uID0gdmVyc2lvbjsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TWF0cml4V2lkdGgoRlhfSU5UMzIgd2lkdGgpDQorew0KKyAgICBtX21hdHJpeFdpZHRoID0gd2lkdGg7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hc2tQYXR0ZXJuKEZYX0lOVDMyIHBhdHRlcm4pDQorew0KKyAgICBtX21hc2tQYXR0ZXJuID0gcGF0dGVybjsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtRGF0YUJ5dGVzKEZYX0lOVDMyIGJ5dGVzKQ0KK3sNCisgICAgbV9udW1EYXRhQnl0ZXMgPSBieXRlczsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtVG90YWxCeXRlcyhGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIG1fbnVtVG90YWxCeXRlcyA9IHZhbHVlOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXROdW1SU0Jsb2NrcyhGWF9JTlQzMiBibG9jaykNCit7DQorICAgIG1fbnVtUlNCbG9ja3MgPSBibG9jazsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtRUNCeXRlcyhGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIG1fbnVtRUNCeXRlcyA9IHZhbHVlOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4oRlhfSU5UMzIgbWFza1BhdHRlcm4pDQorew0KKyAgICByZXR1cm4gbWFza1BhdHRlcm4gPj0gMCAmJiBtYXNrUGF0dGVybiA8IE5VTV9NQVNLX1BBVFRFUk5TOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXRNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHZhbHVlKQ0KK3sNCisgICAgbV9tYXRyaXggPSB2YWx1ZTsNCit9DQorY29uc3QgRlhfSU5UMzIgQ0JDX1FSQ29kZXI6Ok5VTV9NQVNLX1BBVFRFUk5TID0gODsNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckJpdFZlY3Rvci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckJpdFZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiZTgxYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCINCitDQkNfUVJDb2RlckJpdFZlY3Rvcjo6Q0JDX1FSQ29kZXJCaXRWZWN0b3IoKQ0KK3sNCisgICAgbV9zaXplSW5CaXRzID0gMDsNCisgICAgbV9zaXplID0gMzI7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkluaXQoKQ0KK3sNCisgICAgbV9hcnJheSA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fc2l6ZSk7DQorfQ0KK0NCQ19RUkNvZGVyQml0VmVjdG9yOjp+Q0JDX1FSQ29kZXJCaXRWZWN0b3IoKQ0KK3sNCisgICAgaWYobV9hcnJheSAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKG1fYXJyYXkpOw0KKyAgICB9DQorICAgIG1fc2l6ZSA9IDA7DQorICAgIG1fc2l6ZUluQml0cyA9IDA7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkNsZWFyKCkNCit7DQorICAgIGlmKG1fYXJyYXkgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX2FycmF5KTsNCisgICAgICAgIG1fYXJyYXkgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fc2l6ZUluQml0cyA9IDA7DQorICAgIG1fc2l6ZSA9IDMyOw0KKyAgICBtX2FycmF5ID0gRlhfQWxsb2MoRlhfQllURSwgbV9zaXplKTsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkF0KEZYX0lOVDMyIGluZGV4LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX3NpemVJbkJpdHMpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHZhbHVlID0gbV9hcnJheVtpbmRleCA+PiAzXSAmIDB4ZmY7DQorICAgIHJldHVybiAodmFsdWUgPj4gKDcgLSAoaW5kZXggJiAweDcpKSkgJiAxOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6c2l6ZUluQnl0ZXMoKQ0KK3sNCisgICAgcmV0dXJuIChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6U2l6ZSgpDQorew0KKyAgICByZXR1cm4gbV9zaXplSW5CaXRzOw0KK30NCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCaXQoRlhfSU5UMzIgYml0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKCEoYml0ID09IDAgfHwgYml0ID09IDEpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25CYWRWYWx1ZUV4Y2VwdGlvbjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bUJpdHNJbkxhc3RCeXRlID0gbV9zaXplSW5CaXRzICYgMHg3Ow0KKyAgICBpZihudW1CaXRzSW5MYXN0Qnl0ZSA9PSAwKSB7DQorICAgICAgICBBcHBlbmRCeXRlKDApOw0KKyAgICAgICAgbV9zaXplSW5CaXRzIC09IDg7DQorICAgIH0NCisgICAgbV9hcnJheVttX3NpemVJbkJpdHMgPj4gM10gfD0gKGJpdCA8PCAoNyAtIG51bUJpdHNJbkxhc3RCeXRlKSk7DQorICAgICsrbV9zaXplSW5CaXRzOw0KK30NCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCaXRzKEZYX0lOVDMyIHZhbHVlLCBGWF9JTlQzMiBudW1CaXRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmIChudW1CaXRzIDwgMCB8fCBudW1CaXRzID4gMzIpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZE51bUJpdHNFeGNlcHRpb247DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBudW1CaXRzTGVmdCA9IG51bUJpdHM7DQorICAgIHdoaWxlIChudW1CaXRzTGVmdCA+IDApIHsNCisgICAgICAgIGlmICgobV9zaXplSW5CaXRzICYgMHg3KSA9PSAwICYmIG51bUJpdHNMZWZ0ID49IDgpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBuZXdCeXRlID0gKHZhbHVlID4+IChudW1CaXRzTGVmdCAtIDgpKSAmIDB4ZmY7DQorICAgICAgICAgICAgQXBwZW5kQnl0ZShuZXdCeXRlKTsNCisgICAgICAgICAgICBudW1CaXRzTGVmdCAtPSA4Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBiaXQgPSAodmFsdWUgPj4gKG51bUJpdHNMZWZ0IC0gMSkpICYgMTsNCisgICAgICAgICAgICBBcHBlbmRCaXQoYml0LCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICAtLW51bUJpdHNMZWZ0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdFZlY3RvcihDQkNfUVJDb2RlckJpdFZlY3RvciAqYml0cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBzaXplID0gYml0cy0+U2l6ZSgpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIG51bSA9IGJpdHMtPkF0KGksIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBBcHBlbmRCaXQobnVtLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6WE9SKENCQ19RUkNvZGVyQml0VmVjdG9yICpvdGhlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtX3NpemVJbkJpdHMgIT0gb3RoZXItPlNpemUoKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uY2FuTm90T3BlcmF0ZXhvck9wZXJhdG9yOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgc2l6ZUluQnl0ZXMgPSAobV9zaXplSW5CaXRzICsgNykgPj4gMzsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgc2l6ZUluQnl0ZXM7ICsraSkgew0KKyAgICAgICAgbV9hcnJheVtpXSBePSAob3RoZXItPkdldEFycmF5KCkpW2ldOw0KKyAgICB9DQorfQ0KK0ZYX0JZVEUqIENCQ19RUkNvZGVyQml0VmVjdG9yOjpHZXRBcnJheSgpDQorew0KKyAgICByZXR1cm4gbV9hcnJheTsNCit9DQordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQnl0ZShGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIGlmKChtX3NpemVJbkJpdHMgPj4gMykgPT0gbV9zaXplKSB7DQorICAgICAgICBGWF9CWVRFKiBuZXdBcnJheSA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fc2l6ZSA8PCAxKTsNCisgICAgICAgIEZYU1lTX21lbWNweTMyKG5ld0FycmF5LCBtX2FycmF5LCBtX3NpemUpOw0KKyAgICAgICAgaWYobV9hcnJheSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRlhfRnJlZShtX2FycmF5KTsNCisgICAgICAgIH0NCisgICAgICAgIG1fYXJyYXkgPSBuZXdBcnJheTsNCisgICAgICAgIG1fc2l6ZSA9IG1fc2l6ZSA8PCAxOw0KKyAgICB9DQorICAgIG1fYXJyYXlbbV9zaXplSW5CaXRzID4+IDNdID0gKEZYX0JZVEUpIHZhbHVlOw0KKyAgICBtX3NpemVJbkJpdHMgKz0gODsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWZmMGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckJsb2NrUGFpci5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJ5dGVBcnJheS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaCINCitDQkNfUVJDb2RlckJsb2NrUGFpcjo6Q0JDX1FSQ29kZXJCbG9ja1BhaXIoQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YSwgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZXJyb3JDb3JyZWN0aW9uKQ0KK3sNCisgICAgbV9kYXRhQnl0ZXMgPSBkYXRhOw0KKyAgICBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzID0gZXJyb3JDb3JyZWN0aW9uOw0KK30NCitDQkNfUVJDb2RlckJsb2NrUGFpcjo6fkNCQ19RUkNvZGVyQmxvY2tQYWlyKCkNCit7DQorICAgIGlmKG1fZGF0YUJ5dGVzICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX2RhdGFCeXRlczsNCisgICAgICAgIG1fZGF0YUJ5dGVzID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KKyAgICAgICAgbV9lcnJvckNvcnJlY3Rpb25CeXRlcyA9IE5VTEw7DQorICAgIH0NCit9DQorQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJCbG9ja1BhaXI6OkdldERhdGFCeXRlcygpDQorew0KKyAgICByZXR1cm4gbV9kYXRhQnl0ZXM7DQorfQ0KK0NCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyQmxvY2tQYWlyOjpHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpDQorew0KKyAgICByZXR1cm4gbV9lcnJvckNvcnJlY3Rpb25CeXRlczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJEZWNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzNjEzMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZWVkU29sb21vbkRlY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkRhdGFCbG9jay5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJEZWNvZGVyLmgiDQorQ0JDX1FSQ29kZXJEZWNvZGVyOjpDQkNfUVJDb2RlckRlY29kZXIoKQ0KK3sNCisgICAgbV9yc0RlY29kZXIgPSBOVUxMOw0KK30NCisNCit2b2lkIENCQ19RUkNvZGVyRGVjb2Rlcjo6SW5pdCgpDQorew0KKyAgICBtX3JzRGVjb2RlciA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25EZWNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWxkKTsNCit9DQorQ0JDX1FSQ29kZXJEZWNvZGVyOjp+Q0JDX1FSQ29kZXJEZWNvZGVyKCkNCit7DQorICAgIGlmKG1fcnNEZWNvZGVyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX3JzRGVjb2RlcjsNCisgICAgfQ0KKyAgICBtX3JzRGVjb2RlciA9IE5VTEw7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUVJDb2RlckRlY29kZXI6OkRlY29kZShGWF9CT09MKiBpbWFnZSwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICBiaXRzOw0KKyAgICBiaXRzLkluaXQod2lkdGgpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgew0KKyAgICAgICAgICAgIGlmKGltYWdlW2kgKiB3aWR0aCArIGpdKSB7DQorICAgICAgICAgICAgICAgIGJpdHMuU2V0KGosIGkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY2RyID0gRGVjb2RlKCZiaXRzLCBoZWlnaHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBjZHI7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUVJDb2RlckRlY29kZXI6OkRlY29kZShDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLCBGWF9JTlQzMiBieXRlTW9kZURlY29kZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUVJCaXRNYXRyaXhQYXJzZXIgcGFyc2VyOw0KKyAgICBwYXJzZXIuSW5pdChiaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24gKnZlcnNpb24gPSBwYXJzZXIuUmVhZFZlcnNpb24oZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogdGVtcCA9IHBhcnNlci5SZWFkRm9ybWF0SW5mb3JtYXRpb24oZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCA9IHRlbXAtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorICAgIENGWF9CeXRlQXJyYXkqIGJhID0gcGFyc2VyLlJlYWRDb2Rld29yZHMoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheSA+IGNvZGV3b3JkcyhiYSk7DQorICAgIENGWF9QdHJBcnJheSAqZGF0YUJsb2NrcyA9IENCQ19RUkRhdGFCbG9jazo6R2V0RGF0YUJsb2Nrcyhjb2Rld29yZHMuZ2V0KCksIHZlcnNpb24sIGVjTGV2ZWwsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0lOVDMyIHRvdGFsQnl0ZXMgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIHRvdGFsQnl0ZXMgKz0gKChDQkNfUVJEYXRhQmxvY2sqKSAoKCpkYXRhQmxvY2tzKVtpXSkpLT5HZXROdW1EYXRhQ29kZXdvcmRzKCk7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVBcnJheSByZXN1bHRCeXRlczsNCisgICAgRlhfSU5UMzIgcmVzdWx0T2Zmc2V0ID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaisrKSB7DQorICAgICAgICBDQkNfUVJEYXRhQmxvY2sgKmRhdGFCbG9jayA9IChDQkNfUVJEYXRhQmxvY2sgKikoKCpkYXRhQmxvY2tzKVtqXSk7DQorICAgICAgICBDRlhfQnl0ZUFycmF5KiBjb2Rld29yZEJ5dGVzID0gZGF0YUJsb2NrLT5HZXRDb2Rld29yZHMoKTsNCisgICAgICAgIEZYX0lOVDMyIG51bURhdGFDb2Rld29yZHMgPSBkYXRhQmxvY2stPkdldE51bURhdGFDb2Rld29yZHMoKTsNCisgICAgICAgIENvcnJlY3RFcnJvcnMoY29kZXdvcmRCeXRlcywgbnVtRGF0YUNvZGV3b3JkcywgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGsgPSAwOyBrIDwgZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIChDQkNfUVJEYXRhQmxvY2sqKSgqZGF0YUJsb2Nrcylba107DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRhdGFCbG9ja3MtPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBkYXRhQmxvY2tzOw0KKyAgICAgICAgICAgIGRhdGFCbG9ja3MgPSBOVUxMOw0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgbnVtRGF0YUNvZGV3b3JkczsgaSsrKSB7DQorICAgICAgICAgICAgcmVzdWx0Qnl0ZXMuQWRkKCgqY29kZXdvcmRCeXRlcylbaV0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZvcihGWF9JTlQzMiBrID0gMDsgayA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICBkZWxldGUgIChDQkNfUVJEYXRhQmxvY2sqKSgqZGF0YUJsb2Nrcylba10gOw0KKyAgICB9DQorICAgIGRhdGFCbG9ja3MtPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgZGF0YUJsb2NrczsNCisgICAgZGF0YUJsb2NrcyA9IE5VTEw7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBjZHIgPSBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUoJnJlc3VsdEJ5dGVzLCB2ZXJzaW9uLCBlY0xldmVsLCBieXRlTW9kZURlY29kZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIGNkcjsNCit9DQordm9pZCBDQkNfUVJDb2RlckRlY29kZXI6OkNvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcywgRlhfSU5UMzIgbnVtRGF0YUNvZGV3b3JkcywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBudW1Db2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLT5HZXRTaXplKCk7DQorICAgIENGWF9JbnQzMkFycmF5IGNvZGV3b3Jkc0ludHM7DQorICAgIGNvZGV3b3Jkc0ludHMuU2V0U2l6ZShudW1Db2Rld29yZHMpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1Db2Rld29yZHM7IGkrKykgew0KKyAgICAgICAgY29kZXdvcmRzSW50c1tpXSA9IChGWF9JTlQzMikoKCpjb2Rld29yZEJ5dGVzKVtpXSAmIDB4ZmYpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bUVDQ29kZXdvcmRzID0gY29kZXdvcmRCeXRlcy0+R2V0U2l6ZSgpIC0gbnVtRGF0YUNvZGV3b3JkczsNCisgICAgbV9yc0RlY29kZXItPkRlY29kZSgmY29kZXdvcmRzSW50cywgbnVtRUNDb2Rld29yZHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgZm9yKEZYX0lOVDMyIGsgPSAwOyBrIDwgbnVtRGF0YUNvZGV3b3JkczsgaysrKSB7DQorICAgICAgICAoKmNvZGV3b3JkQnl0ZXMpW2tdID0gKEZYX0JZVEUpIGNvZGV3b3Jkc0ludHNba107DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJFQ0IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJFQ0IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTk3MWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVDQi5jcHAKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJFQ0IuaCINCitDQkNfUVJDb2RlckVDQjo6Q0JDX1FSQ29kZXJFQ0IoRlhfSU5UMzIgY291bnQsIEZYX0lOVDMyIGRhdGFDb2RlV29yZHMpDQorew0KKyAgICBtX2RhdGFDb2RlV29yZHMgPSBkYXRhQ29kZVdvcmRzOw0KKyAgICBtX2NvdW50ID0gY291bnQ7DQorfQ0KK0NCQ19RUkNvZGVyRUNCOjp+Q0JDX1FSQ29kZXJFQ0IoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXJFQ0I6OkdldENvdW50KCkNCit7DQorICAgIHJldHVybiBtX2NvdW50Ow0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckVDQjo6R2V0RGF0YUNvZGVXb3JkcygpDQorew0KKyAgICByZXR1cm4gbV9kYXRhQ29kZVdvcmRzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVDQmxvY2tzLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRUNCbG9ja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODk5NzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVDQmxvY2tzLmNwcApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckVDQi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIg0KK0NCQ19RUkNvZGVyRUNCbG9ja3M6OkNCQ19RUkNvZGVyRUNCbG9ja3MoRlhfSU5UMzIgZWNDb2RlV29yZHNQZXJCbG9jaywgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzKQ0KK3sNCisgICAgbV9lY0NvZGVXb3Jkc1BlckJsb2NrID0gZWNDb2RlV29yZHNQZXJCbG9jazsNCisgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MpOw0KK30NCitDQkNfUVJDb2RlckVDQmxvY2tzOjpDQkNfUVJDb2RlckVDQmxvY2tzKEZYX0lOVDMyIGVjQ29kZVdvcmRzUGVyQmxvY2ssDQorICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MxLA0KKyAgICAgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzMikNCit7DQorICAgIG1fZWNDb2RlV29yZHNQZXJCbG9jayA9IGVjQ29kZVdvcmRzUGVyQmxvY2s7DQorICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMSk7DQorICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMik7DQorfQ0KK0NCQ19RUkNvZGVyRUNCbG9ja3M6On5DQkNfUVJDb2RlckVDQmxvY2tzKCkNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDAgOyBpIDwgbV9lY0Jsb2Nrcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlICggKENCQ19RUkNvZGVyRUNCKikobV9lY0Jsb2Nrc1tpXSkgKSA7DQorICAgIH0NCisgICAgbV9lY0Jsb2Nrcy5SZW1vdmVBbGwoKTsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpDQorew0KKyAgICByZXR1cm4gbV9lY0NvZGVXb3Jkc1BlckJsb2NrOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXROdW1CbG9ja3MoKQ0KK3sNCisgICAgRlhfSU5UMzIgdG90YWwgPSAwOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX2VjQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICB0b3RhbCArPSAoIChDQkNfUVJDb2RlckVDQiopKG1fZWNCbG9ja3NbaV0pICktPkdldENvdW50KCk7DQorICAgIH0NCisgICAgcmV0dXJuIHRvdGFsOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXRUb3RhbEVDQ29kZVdvcmRzKCkNCit7DQorICAgIHJldHVybiBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgKiBHZXROdW1CbG9ja3MoKTsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXRFQ0Jsb2NrcygpDQorew0KKyAgICByZXR1cm4gJm1fZWNCbG9ja3M7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTNmYjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckVuY29kZXIuY3BwCkBAIC0wLDAgKzEsODYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQnl0ZUFycmF5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CeXRlTWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oIg0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkNvZGVyRW5jb2Rlcjo6bV9hbHBoYU51bWJlcmljVGFibGVbXSA9IHsNCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsDQorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLA0KKyAgICAzNiwgLTEsIC0xLCAtMSwgMzcsIDM4LCAtMSwgLTEsIC0xLCAtMSwgMzksIDQwLCAtMSwgNDEsIDQyLCA0MywNCisgICAgMCwgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDQ0LCAtMSwgLTEsIC0xLCAtMSwgLTEsDQorICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LA0KKyAgICAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMQ0KK307DQorQ0JDX1FSQ29kZXJFbmNvZGVyOjpDQkNfUVJDb2RlckVuY29kZXIoKQ0KK3sNCit9DQorQ0JDX1FSQ29kZXJFbmNvZGVyOjp+Q0JDX1FSQ29kZXJFbmNvZGVyKCkNCit7DQorfQ0KK2NsYXNzIE1ha2VfUGFpciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1FSQ29kZXJNb2RlKiBtX21vZGU7DQorICAgIENGWF9CeXRlU3RyaW5nIG1fc3RyaW5nOw0KK3ByaXZhdGU6DQorICAgIE1ha2VfUGFpcihjb25zdCBNYWtlX1BhaXIgJm1vZGVfc3RyaW5nKSB7fQ0KKyAgICBNYWtlX1BhaXIgJm9wZXJhdG9yID0gKE1ha2VfUGFpciAmbW9kZV9zdHJpbmcpDQorICAgIHsNCisgICAgICAgIGlmICh0aGlzID09ICZtb2RlX3N0cmluZykgew0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIG1fbW9kZSA9IG1vZGVfc3RyaW5nLm1fbW9kZTsNCisgICAgICAgIG1fc3RyaW5nID0gbW9kZV9zdHJpbmcubV9zdHJpbmc7DQorICAgICAgICByZXR1cm4gKnRoaXM7DQorICAgIH0NCitwdWJsaWM6DQorICAgIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGUgKm1vZGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZzdHIpOiBtX21vZGUobW9kZSksIG1fc3RyaW5nKHN0cikge30NCisgICAgfk1ha2VfUGFpcigpIHt9DQorfTsNCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgRlhfSU5UMzIgJmUsIEZYX0lOVDMyIHZlcnNpb25TcGVjaWZ5KQ0KK3sNCisgICAgaWYodmVyc2lvblNwZWNpZnkgPT0gMCkgew0KKyAgICAgICAgRW5jb2RlV2l0aEF1dG9WZXJzaW9uKGNvbnRlbnQsIGVjTGV2ZWwsIHFyQ29kZSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KKyAgICB9IGVsc2UgaWYodmVyc2lvblNwZWNpZnkgPiAwICYmIHZlcnNpb25TcGVjaWZ5IDw9IDQwKSB7DQorICAgICAgICBFbmNvZGVXaXRoU3BlY2lmeVZlcnNpb24oY29udGVudCwgZWNMZXZlbCwgcXJDb2RlLCB2ZXJzaW9uU3BlY2lmeSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblZlcnNpb25NdXN0MV80MDsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRFQ0koQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMpDQorew0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kRGF0YU1vZGVMZW5naEluZm8oQ0ZYX1B0ckFycmF5ICZzcGxpdFJlc3VsdCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgJmhlYWRlckFuZERhdGFCaXRzLA0KKyAgICAgICAgQ0JDX1FSQ29kZXJNb2RlICp0ZW1wTW9kZSwgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgQ0ZYX0J5dGVTdHJpbmcgJmVuY29kaW5nLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICB0ZW1wTW9kZSA9ICgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fbW9kZTsNCisgICAgICAgIGlmKHRlbXBNb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICAgICAgICAgIEFwcGVuZE1vZGVJbmZvKHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIEFwcGVuZExlbmd0aEluZm8oKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcuR2V0TGVuZ3RoKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZW5jb2RpbmcsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfSBlbHNlIGlmKHRlbXBNb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZUFycmF5IGJ5dGVzOw0KKyAgICAgICAgICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCBieXRlcyk7DQorICAgICAgICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgQXBwZW5kTGVuZ3RoSW5mbyhieXRlcy5HZXRTaXplKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICBBcHBlbmQ4Qml0Qnl0ZXMoYnl0ZXMsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9IGVsc2UgaWYodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSB7DQorICAgICAgICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgQXBwZW5kTGVuZ3RoSW5mbygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZy5HZXRMZW5ndGgoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIEFwcGVuZEJ5dGVzKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9IGVsc2UgaWYodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KKyAgICAgICAgICAgIEFwcGVuZE1vZGVJbmZvKHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIEFwcGVuZExlbmd0aEluZm8oKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcuR2V0TGVuZ3RoKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZW5jb2RpbmcsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Vbmtub3duOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpTcGxpdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0ZYX1B0ckFycmF5ICZyZXN1bHQpDQorew0KKyAgICBGWF9JTlQzMiBpbmRleCA9IDAsIGZsYWcgPSAwOw0KKyAgICB3aGlsZSgoKChGWF9CWVRFKWNvbnRlbnRbaW5kZXhdID49IDB4QTEgJiYgKEZYX0JZVEUpY29udGVudFtpbmRleF0gPD0gMHhBQSkgfHwNCisgICAgICAgICAgICAoKEZYX0JZVEUpY29udGVudFtpbmRleF0gPj0gMHhCMCAmJiAoRlhfQllURSljb250ZW50W2luZGV4XSA8PSAweEZBKSkgJiYgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgIGluZGV4ICs9IDI7DQorICAgIH0NCisgICAgaWYoaW5kZXggIT0gZmxhZykgew0KKyAgICAgICAgcmVzdWx0LkFkZChGWF9ORVcgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZTo6c0dCSywgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKSkpOw0KKyAgICB9DQorICAgIGZsYWcgPSBpbmRleDsNCisgICAgaWYoaW5kZXggPj0gY29udGVudC5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHdoaWxlKEdldEFscGhhTnVtZXJpY0NvZGUoKEZYX0JZVEUpY29udGVudFtpbmRleF0pID09IC0xDQorICAgICAgICAgICAgJiYgISgoKEZYX0JZVEUpY29udGVudFtpbmRleF0gPj0gMHhBMSAmJiAoRlhfQllURSljb250ZW50W2luZGV4XSA8PSAweEFBKSB8fA0KKyAgICAgICAgICAgICAgICAgKChGWF9CWVRFKWNvbnRlbnRbaW5kZXhdID49IDB4QjAgJiYgKEZYX0JZVEUpY29udGVudFtpbmRleF0gPD0gMHhGQSkpDQorICAgICAgICAgICAgJiYgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkpIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgICAgaWYoSXNEQkNTTGVhZEJ5dGUoKEZYX0JZVEUpY29udGVudFtpbmRleF0pKQ0KKyNlbHNlDQorICAgICAgICBpZigoRlhfQllURSljb250ZW50W2luZGV4XSA+IDEyNykNCisjZW5kaWYNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbmRleCArPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGluZGV4ICE9IGZsYWcpIHsNCisgICAgICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLCBjb250ZW50Lk1pZChmbGFnLCBpbmRleCAtIGZsYWcpKSk7DQorICAgIH0NCisgICAgZmxhZyA9IGluZGV4Ow0KKyAgICBpZihpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgd2hpbGUoRlhTWVNfSXNkaWdpdCgoRlhfQllURSljb250ZW50W2luZGV4XSkgJiYgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgIGluZGV4Kys7DQorICAgIH0NCisgICAgaWYoaW5kZXggIT0gZmxhZykgew0KKyAgICAgICAgcmVzdWx0LkFkZChGWF9ORVcgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMsIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCisgICAgfQ0KKyAgICBmbGFnID0gaW5kZXg7DQorICAgIGlmKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB3aGlsZShHZXRBbHBoYU51bWVyaWNDb2RlKChGWF9CWVRFKWNvbnRlbnRbaW5kZXhdKSAhPSAtMSAgJiYgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgIGluZGV4Kys7DQorICAgIH0NCisgICAgaWYoaW5kZXggIT0gZmxhZykgew0KKyAgICAgICAgcmVzdWx0LkFkZChGWF9ORVcgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKSkpOw0KKyAgICB9DQorICAgIGZsYWcgPSBpbmRleDsNCisgICAgaWYoaW5kZXggPj0gY29udGVudC5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFNwbGl0U3RyaW5nKGNvbnRlbnQuTWlkKGluZGV4LCBjb250ZW50LkdldExlbmd0aCgpIC0gaW5kZXgpLCByZXN1bHQpOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckVuY29kZXI6OkdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlICptb2RlRmlyc3QsIENCQ19RUkNvZGVyTW9kZSAqbW9kZVNlY29uZCwgRlhfSU5UMzIgdmVyc2lvbk51bSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZih2ZXJzaW9uTnVtID09IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmKChtb2RlRmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKQ0KKyAgICAgICAgICAgICYmIChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpKSB7DQorICAgICAgICBpZih2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KSB7DQorICAgICAgICAgICAgcmV0dXJuIDExOw0KKyAgICAgICAgfSBlbHNlIGlmKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikgew0KKyAgICAgICAgICAgIHJldHVybiAxNTsNCisgICAgICAgIH0gZWxzZSBpZih2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gNDApIHsNCisgICAgICAgICAgICByZXR1cm4gMTY7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb247DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYoKG1vZGVTZWNvbmQgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKQ0KKyAgICAgICAgICAgICAgJiYgKG1vZGVGaXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSkgew0KKyAgICAgICAgaWYodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkgew0KKyAgICAgICAgICAgIHJldHVybiAxMzsNCisgICAgICAgIH0gZWxzZSBpZih2ZXJzaW9uTnVtID49IDEwICYmIHZlcnNpb25OdW0gPD0gMjYpIHsNCisgICAgICAgICAgICByZXR1cm4gMTU7DQorICAgICAgICB9IGVsc2UgaWYodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IDQwKSB7DQorICAgICAgICAgICAgcmV0dXJuIDE3Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmKChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpDQorICAgICAgICAgICAgICAmJiAobW9kZUZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpKSB7DQorICAgICAgICBpZih2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KSB7DQorICAgICAgICAgICAgcmV0dXJuIDY7DQorICAgICAgICB9IGVsc2UgaWYodmVyc2lvbk51bSA+PSAxMCAmJiB2ZXJzaW9uTnVtIDw9IDI2KSB7DQorICAgICAgICAgICAgcmV0dXJuIDg7DQorICAgICAgICB9IGVsc2UgaWYodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IDQwKSB7DQorICAgICAgICAgICAgcmV0dXJuIDk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb247DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAtMTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6Ok1lcmdlU3RyaW5nKENGWF9QdHJBcnJheSAmcmVzdWx0LCBGWF9JTlQzMiB2ZXJzaW9uTnVtLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIE1ha2VfUGFpciAqZmlyc3QgPSBOVUxMOw0KKyAgICBNYWtlX1BhaXIgKnNlY29uZCA9IE5VTEw7DQorICAgIHNpemVfdCBtZXJnZU51bSA9IDA7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIGZvcihpID0gMDsgKChpIDwgcmVzdWx0LkdldFNpemUoKSkgJiYgKGkgKyAxIDwgcmVzdWx0LkdldFNpemUoKSkpOyBpKyspIHsNCisgICAgICAgIGZpcnN0ID0gKE1ha2VfUGFpciopcmVzdWx0W2ldOw0KKyAgICAgICAgc2Vjb25kID0gKE1ha2VfUGFpciopcmVzdWx0W2kgKyAxXTsNCisgICAgICAgIGlmKGZpcnN0LT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgdG1wID0gR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsIENCQ19RUkNvZGVyTW9kZTo6c0JZVEUsIHZlcnNpb25OdW0sIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIGlmKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKQ0KKyAgICAgICAgICAgICAgICAgICAgJiYgKGZpcnN0LT5tX3N0cmluZy5HZXRMZW5ndGgoKSA8IHRtcCkpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZmlyc3QtPm1fc3RyaW5nICsgc2Vjb25kLT5tX3N0cmluZzsNCisgICAgICAgICAgICAgICAgc2Vjb25kLT5tX3N0cmluZyA9IHN0cjsNCisgICAgICAgICAgICAgICAgZGVsZXRlIGZpcnN0Ow0KKyAgICAgICAgICAgICAgICByZXN1bHQuUmVtb3ZlQXQoaSk7DQorICAgICAgICAgICAgICAgIGktLTsNCisgICAgICAgICAgICAgICAgbWVyZ2VOdW0rKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYoZmlyc3QtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7DQorICAgICAgICAgICAgaWYoc2Vjb25kLT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KKyAgICAgICAgICAgICAgICBmaXJzdC0+bV9zdHJpbmcgKz0gc2Vjb25kLT5tX3N0cmluZzsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHNlY29uZDsNCisgICAgICAgICAgICAgICAgcmVzdWx0LlJlbW92ZUF0KGkgKyAxKTsNCisgICAgICAgICAgICAgICAgaS0tOw0KKyAgICAgICAgICAgICAgICBtZXJnZU51bSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZihmaXJzdC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMsIENCQ19RUkNvZGVyTW9kZTo6c0JZVEUsIHZlcnNpb25OdW0sIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIGlmKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKQ0KKyAgICAgICAgICAgICAgICAgICAgJiYgKGZpcnN0LT5tX3N0cmluZy5HZXRMZW5ndGgoKSA8IHRtcCkpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZmlyc3QtPm1fc3RyaW5nICsgc2Vjb25kLT5tX3N0cmluZzsNCisgICAgICAgICAgICAgICAgc2Vjb25kLT5tX3N0cmluZyA9IHN0cjsNCisgICAgICAgICAgICAgICAgZGVsZXRlIGZpcnN0Ow0KKyAgICAgICAgICAgICAgICByZXN1bHQuUmVtb3ZlQXQoaSk7DQorICAgICAgICAgICAgICAgIGktLTsNCisgICAgICAgICAgICAgICAgbWVyZ2VOdW0rKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdG1wID0gR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDLCBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsIHZlcnNpb25OdW0sIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIGlmKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpDQorICAgICAgICAgICAgICAgICAgICAmJiAoZmlyc3QtPm1fc3RyaW5nLkdldExlbmd0aCgpIDwgdG1wKSkgew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBmaXJzdC0+bV9zdHJpbmcgKyBzZWNvbmQtPm1fc3RyaW5nOw0KKyAgICAgICAgICAgICAgICBzZWNvbmQtPm1fc3RyaW5nID0gc3RyOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgZmlyc3Q7DQorICAgICAgICAgICAgICAgIHJlc3VsdC5SZW1vdmVBdChpKTsNCisgICAgICAgICAgICAgICAgaS0tOw0KKyAgICAgICAgICAgICAgICBtZXJnZU51bSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihtZXJnZU51bSA9PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgTWVyZ2VTdHJpbmcocmVzdWx0LCB2ZXJzaW9uTnVtLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpJbml0UVJDb2RlKEZYX0lOVDMyIG51bUlucHV0Qnl0ZXMsIEZYX0lOVDMyIHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlciogcXJDb2RlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIHFyQ29kZS0+U2V0RUNMZXZlbChlY0xldmVsKTsNCisgICAgcXJDb2RlLT5TZXRNb2RlKG1vZGUpOw0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bWJlciwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBGWF9JTlQzMiBudW1CeXRlcyA9IHZlcnNpb24tPkdldFRvdGFsQ29kZVdvcmRzKCk7DQorICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzID0gdmVyc2lvbi0+R2V0RUNCbG9ja3NGb3JMZXZlbChlY0xldmVsKTsNCisgICAgRlhfSU5UMzIgbnVtRWNCeXRlcyA9IGVjQmxvY2tzLT5HZXRUb3RhbEVDQ29kZVdvcmRzKCk7DQorICAgIEZYX0lOVDMyIG51bVJTQmxvY2tzID0gZWNCbG9ja3MtPkdldE51bUJsb2NrcygpOw0KKyAgICBGWF9JTlQzMiBudW1EYXRhQnl0ZXMgPSBudW1CeXRlcyAtIG51bUVjQnl0ZXM7DQorICAgIGlmKG51bURhdGFCeXRlcyA+PSBudW1JbnB1dEJ5dGVzICsgMykgew0KKyAgICAgICAgcXJDb2RlLT5TZXRWZXJzaW9uKHZlcnNpb25OdW1iZXIpOw0KKyAgICAgICAgcXJDb2RlLT5TZXROdW1Ub3RhbEJ5dGVzKG51bUJ5dGVzKTsNCisgICAgICAgIHFyQ29kZS0+U2V0TnVtRGF0YUJ5dGVzKG51bURhdGFCeXRlcyk7DQorICAgICAgICBxckNvZGUtPlNldE51bVJTQmxvY2tzKG51bVJTQmxvY2tzKTsNCisgICAgICAgIHFyQ29kZS0+U2V0TnVtRUNCeXRlcyhudW1FY0J5dGVzKTsNCisgICAgICAgIHFyQ29kZS0+U2V0TWF0cml4V2lkdGgodmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RGaW5kQmxvY2tJbmZvOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZVdpdGhTcGVjaWZ5VmVyc2lvbihjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgIENCQ19RUkNvZGVyICpxckNvZGUsIEZYX0lOVDMyIHZlcnNpb25TcGVjaWZ5LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nID0gInV0ZjgiOw0KKyAgICBDQkNfUVJDb2Rlck1vZGUgKm1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KKyAgICBDRlhfUHRyQXJyYXkgc3BsaXRSZXN1bHQ7DQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIGRhdGFCaXRzOw0KKyAgICBkYXRhQml0cy5Jbml0KCk7DQorICAgIFNwbGl0U3RyaW5nKGNvbnRlbnQsIHNwbGl0UmVzdWx0KTsNCisgICAgTWVyZ2VTdHJpbmcoc3BsaXRSZXN1bHQsIHZlcnNpb25TcGVjaWZ5LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgQ0JDX1FSQ29kZXJNb2RlICp0ZW1wTW9kZSA9IE5VTEw7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywgKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9tb2RlLCAmZGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgICAgIGlmKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGZvcihGWF9JTlQzMiB5ID0gMDsgeSA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgeSsrKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFt5XTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bUlucHV0Qnl0ZXMgPSBkYXRhQml0cy5zaXplSW5CeXRlcygpOw0KKyAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsNCisgICAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KKyAgICBJbml0UVJDb2RlKG51bUlucHV0Qnl0ZXMsIHZlcnNpb25TcGVjaWZ5LCBlY0xldmVsLCBtb2RlLCBxckNvZGUsIGUpOw0KKyAgICBpZihlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2tdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgICAgICByZXR1cm4gOw0KKyAgICB9DQorICAgIEFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKHNwbGl0UmVzdWx0LCBoZWFkZXJBbmREYXRhQml0cywgdGVtcE1vZGUsIHFyQ29kZSwgZW5jb2RpbmcsIGUpOw0KKyAgICBpZihlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2tdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgICAgICByZXR1cm4gOw0KKyAgICB9DQorICAgIG51bUlucHV0Qnl0ZXMgPSBoZWFkZXJBbmREYXRhQml0cy5zaXplSW5CeXRlcygpOw0KKyAgICBUZXJtaW5hdGVCaXRzKHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgIGlmKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGsgPSAwOyBrIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQorICAgICAgICB9DQorICAgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgICAgIHJldHVybiA7DQorICAgIH0NCisgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtqXTsNCisgICAgfQ0KKyAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzIDsNCisgICAgZmluYWxCaXRzLkluaXQoKTsNCisgICAgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKCZoZWFkZXJBbmREYXRhQml0cywgcXJDb2RlLT5HZXROdW1Ub3RhbEJ5dGVzKCksIHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksICZmaW5hbEJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHBEZWNvZGVyID0gRlhfTkVXIENCQ19Db21tb25CeXRlTWF0cml4KHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKTsNCisgICAgcERlY29kZXItPkluaXQoKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IG1hdHJpeChwRGVjb2Rlcik7DQorICAgIEZYX0lOVDMyIG1hc2tQYXR0ZXJuID0gQ2hvb3NlTWFza1BhdHRlcm4oJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgcXJDb2RlLT5TZXRNYXNrUGF0dGVybihtYXNrUGF0dGVybik7DQorICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBxckNvZGUtPkdldE1hc2tQYXR0ZXJuKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBxckNvZGUtPlNldE1hdHJpeChtYXRyaXgucmVsZWFzZSgpKTsNCisgICAgaWYoIXFyQ29kZS0+SXNWYWxpZCgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZVdpdGhBdXRvVmVyc2lvbihjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsNCisgICAgQ0JDX1FSQ29kZXJNb2RlICptb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCisgICAgQ0ZYX1B0ckFycmF5IHNwbGl0UmVzdWx0Ow0KKyAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBkYXRhQml0czsNCisgICAgZGF0YUJpdHMuSW5pdCgpOw0KKyAgICBTcGxpdFN0cmluZyhjb250ZW50LCBzcGxpdFJlc3VsdCk7DQorICAgIE1lcmdlU3RyaW5nKHNwbGl0UmVzdWx0LCA4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19RUkNvZGVyTW9kZSAqdGVtcE1vZGUgPSBOVUxMOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsICgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICAgICAgICBpZihlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgICBmb3IoRlhfSU5UMzIgbCA9IDA7IGwgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbbF07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBudW1JbnB1dEJ5dGVzID0gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgICAgSW5pdFFSQ29kZShudW1JbnB1dEJ5dGVzLCBlY0xldmVsLCBtb2RlLCBxckNvZGUsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KKyAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsNCisgICAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KKyAgICB0ZW1wTW9kZSA9IE5VTEw7DQorICAgIEZYX0lOVDMyIHZlcnNpb25OdW0gPSBxckNvZGUtPkdldFZlcnNpb24oKTsNCitzaWduOg0KKyAgICBBcHBlbmREYXRhTW9kZUxlbmdoSW5mbyhzcGxpdFJlc3VsdCwgaGVhZGVyQW5kRGF0YUJpdHMsIHRlbXBNb2RlLCBxckNvZGUsIGVuY29kaW5nLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZ290byBjYXRjaEV4Y2VwdGlvbjsNCisgICAgfQ0KKyAgICBudW1JbnB1dEJ5dGVzID0gaGVhZGVyQW5kRGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgICAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBnb3RvIGNhdGNoRXhjZXB0aW9uOw0KKyAgICB9DQorY2F0Y2hFeGNlcHRpb246DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIEZYX0lOVDMyIGUxID0gQkNFeGNlcHRpb25OTzsNCisgICAgICAgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlMSk7DQorICAgICAgICBpZiAoZTEgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIGUgPSBlMTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICB2ZXJzaW9uTnVtKys7DQorICAgICAgICBpZiAodmVyc2lvbk51bSA8PSA0MCkgew0KKyAgICAgICAgICAgIGhlYWRlckFuZERhdGFCaXRzLkNsZWFyKCk7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTk87DQorICAgICAgICAgICAgZ290byBzaWduOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2pdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQorICAgIH0NCisgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIGZpbmFsQml0cyA7DQorICAgIGZpbmFsQml0cy5Jbml0KCk7DQorICAgIEludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLCBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXROdW1SU0Jsb2NrcygpLCAmZmluYWxCaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBwRGVjb2RlciA9IEZYX05FVyBDQkNfQ29tbW9uQnl0ZU1hdHJpeChxckNvZGUtPkdldE1hdHJpeFdpZHRoKCksIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSk7DQorICAgIHBEZWNvZGVyLT5Jbml0KCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25CeXRlTWF0cml4PiBtYXRyaXgocERlY29kZXIpOw0KKyAgICBGWF9JTlQzMiBtYXNrUGF0dGVybiA9IENob29zZU1hc2tQYXR0ZXJuKCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbWF0cml4LmdldCgpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOw0KKyAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgcXJDb2RlLT5HZXRNYXNrUGF0dGVybigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KKyAgICBxckNvZGUtPlNldE1hdHJpeChtYXRyaXgucmVsZWFzZSgpKTsNCisgICAgaWYoIXFyQ29kZS0+SXNWYWxpZCgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdXRmOERhdGE7DQorICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb250ZW50LCB1dGY4RGF0YSk7DQorICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSA9IENob29zZU1vZGUodXRmOERhdGEsIGVuY29kaW5nKTsNCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZGF0YUJpdHM7DQorICAgIGRhdGFCaXRzLkluaXQoKTsNCisgICAgQXBwZW5kQnl0ZXModXRmOERhdGEsIG1vZGUsICZkYXRhQml0cywgZW5jb2RpbmcsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRlhfSU5UMzIgbnVtSW5wdXRCeXRlcyA9IGRhdGFCaXRzLnNpemVJbkJ5dGVzKCk7DQorICAgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIGhlYWRlckFuZERhdGFCaXRzOw0KKyAgICBoZWFkZXJBbmREYXRhQml0cy5Jbml0KCk7DQorICAgIEFwcGVuZE1vZGVJbmZvKG1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBGWF9JTlQzMiBudW1MZXR0ZXJzID0gbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFID8gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKSA6IGNvbnRlbnQuR2V0TGVuZ3RoKCk7DQorICAgIEFwcGVuZExlbmd0aEluZm8obnVtTGV0dGVycywgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBoZWFkZXJBbmREYXRhQml0cy5BcHBlbmRCaXRWZWN0b3IoJmRhdGFCaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzIDsNCisgICAgZmluYWxCaXRzLkluaXQoKTsNCisgICAgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKCZoZWFkZXJBbmREYXRhQml0cywgcXJDb2RlLT5HZXROdW1Ub3RhbEJ5dGVzKCksIHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksICZmaW5hbEJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHBEZWNvZGVyID0gRlhfTkVXIENCQ19Db21tb25CeXRlTWF0cml4KHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKTsNCisgICAgcERlY29kZXItPkluaXQoKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IG1hdHJpeChwRGVjb2Rlcik7DQorICAgIEZYX0lOVDMyIG1hc2tQYXR0ZXJuID0gQ2hvb3NlTWFza1BhdHRlcm4oJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgcXJDb2RlLT5TZXRNYXNrUGF0dGVybihtYXNrUGF0dGVybik7DQorICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBxckNvZGUtPkdldE1hc2tQYXR0ZXJuKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICAgIHFyQ29kZS0+U2V0TWF0cml4KG1hdHJpeC5yZWxlYXNlKCkpOw0KKyAgICBpZighcXJDb2RlLT5Jc1ZhbGlkKCkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRRUkNvZGU7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6VGVybWluYXRlQml0cyhGWF9JTlQzMiBudW1EYXRhQnl0ZXMsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIGNhcGFjaXR5ID0gbnVtRGF0YUJ5dGVzIDw8IDM7DQorICAgIGlmKGJpdHMtPlNpemUoKSA+IGNhcGFjaXR5KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25EYXRhVG9vTWFueTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCA0ICYmIGJpdHMtPlNpemUoKSA8IGNhcGFjaXR5OyArK2kpIHsNCisgICAgICAgIGJpdHMtPkFwcGVuZEJpdCgwLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bUJpdHNJbkxhc3RCeXRlID0gYml0cy0+U2l6ZSgpICUgODsNCisgICAgaWYgKG51bUJpdHNJbkxhc3RCeXRlID4gMCkgew0KKyAgICAgICAgRlhfSU5UMzIgbnVtUGFkZGluZ0JpdHMgPSA4IC0gbnVtQml0c0luTGFzdEJ5dGU7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgbnVtUGFkZGluZ0JpdHM7ICsraikgew0KKyAgICAgICAgICAgIGJpdHMtPkFwcGVuZEJpdCgwLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiaXRzLT5TaXplKCkgJSA4ICE9IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoTXVzdEJlODsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bVBhZGRpbmdCeXRlcyA9IG51bURhdGFCeXRlcyAtIGJpdHMtPnNpemVJbkJ5dGVzKCk7DQorICAgIGZvciAoRlhfSU5UMzIgayA9IDA7IGsgPCBudW1QYWRkaW5nQnl0ZXM7ICsraykgew0KKyAgICAgICAgaWYgKGsgJSAyID09IDApIHsNCisgICAgICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKDB4ZWMsIDgsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKDB4MTEsIDgsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiaXRzLT5TaXplKCkgIT0gY2FwYWNpdHkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdHNOb3RFcXVhbENhY2l0eTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkNvZGVyRW5jb2Rlcjo6Q2hvb3NlTWFza1BhdHRlcm4oQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIEZYX0lOVDMyIHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbWluUGVuYWx0eSA9IDY1NTM1Ow0KKyAgICBGWF9JTlQzMiBiZXN0TWFza1BhdHRlcm4gPSAtMTsNCisgICAgZm9yKEZYX0lOVDMyIG1hc2tQYXR0ZXJuID0gMDsgbWFza1BhdHRlcm4gPCBDQkNfUVJDb2Rlcjo6TlVNX01BU0tfUEFUVEVSTlM7IG1hc2tQYXR0ZXJuKyspIHsNCisgICAgICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoYml0cywgZWNMZXZlbCwgdmVyc2lvbiwgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgICAgICBGWF9JTlQzMiBwZW5hbHR5ID0gQ2FsY3VsYXRlTWFza1BlbmFsdHkobWF0cml4KTsNCisgICAgICAgIGlmKHBlbmFsdHkgPCBtaW5QZW5hbHR5KSB7DQorICAgICAgICAgICAgbWluUGVuYWx0eSA9IHBlbmFsdHk7DQorICAgICAgICAgICAgYmVzdE1hc2tQYXR0ZXJuID0gbWFza1BhdHRlcm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJlc3RNYXNrUGF0dGVybjsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXJFbmNvZGVyOjpDYWxjdWxhdGVNYXNrUGVuYWx0eShDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KQ0KK3sNCisgICAgRlhfSU5UMzIgcGVuYWx0eSA9IDA7DQorICAgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxKG1hdHJpeCk7DQorICAgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUyKG1hdHJpeCk7DQorICAgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUzKG1hdHJpeCk7DQorICAgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGU0KG1hdHJpeCk7DQorICAgIHJldHVybiBwZW5hbHR5Ow0KK30NCitDQkNfUVJDb2Rlck1vZGUgKkNCQ19RUkNvZGVyRW5jb2Rlcjo6Q2hvb3NlTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcpDQorew0KKyAgICBpZihlbmNvZGluZy5Db21wYXJlKCJTSElGVF9KSVMiKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkk7DQorICAgIH0NCisgICAgRlhfQk9PTCBoYXNOdW1lcmljID0gRkFMU0U7DQorICAgIEZYX0JPT0wgaGFzQWxwaGFOdW1lcmljID0gRkFMU0U7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGNvbnRlbnQuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICAgICAgaWYoaXNkaWdpdCgoRlhfQllURSljb250ZW50W2ldKSkgew0KKyAgICAgICAgICAgIGhhc051bWVyaWMgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmKEdldEFscGhhTnVtZXJpY0NvZGUoKEZYX0JZVEUpY29udGVudFtpXSkgIT0gLTEpIHsNCisgICAgICAgICAgICBoYXNBbHBoYU51bWVyaWMgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihoYXNBbHBoYU51bWVyaWMpIHsNCisgICAgICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7DQorICAgIH0gZWxzZSBpZihoYXNOdW1lcmljKSB7DQorICAgICAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQzsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZXRBbHBoYU51bWVyaWNDb2RlKEZYX0lOVDMyIGNvZGUpDQorew0KKyAgICBpZihjb2RlIDwgOTYgJiYgY29kZSA+PSAwKSB7DQorICAgICAgICByZXR1cm4gbV9hbHBoYU51bWJlcmljVGFibGVbY29kZV07DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyTW9kZSogbW9kZSwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KKyAgICAgICAgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0gZWxzZSBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KKyAgICAgICAgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29udGVudCwgYml0cywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KKyAgICAgICAgQXBwZW5kOEJpdEJ5dGVzKGNvbnRlbnQsIGJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSSkgew0KKyAgICAgICAgQXBwZW5kS2FuamlCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspIHsNCisgICAgICAgIEFwcGVuZEdCS0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25VbnN1cHBvcnRlZE1vZGU7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBsZW5ndGggPSBjb250ZW50LkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgd2hpbGUoaSA8IGxlbmd0aCkgew0KKyAgICAgICAgRlhfSU5UMzIgbnVtMSA9IGNvbnRlbnRbaV0gLSAnMCc7DQorICAgICAgICBpZihpICsgMiA8IGxlbmd0aCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG51bTIgPSBjb250ZW50W2kgKyAxXSAtICcwJzsNCisgICAgICAgICAgICBGWF9JTlQzMiBudW0zID0gY29udGVudFtpICsgMl0gLSAnMCc7DQorICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cyhudW0xICogMTAwICsgbnVtMiAqIDEwICsgbnVtMywgMTAsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICAgICAgICAgICAgaSArPSAzOw0KKyAgICAgICAgfSBlbHNlIGlmKGkgKyAxIDwgbGVuZ3RoKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgbnVtMiA9IGNvbnRlbnRbaSArIDFdIC0gJzAnOw0KKyAgICAgICAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSAqIDEwICsgbnVtMiwgNywgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgICAgICAgICBpICs9IDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSwgNCwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRBbHBoYU51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIHdoaWxlKGkgPCBsZW5ndGgpIHsNCisgICAgICAgIEZYX0lOVDMyIGNvZGUxID0gR2V0QWxwaGFOdW1lcmljQ29kZShjb250ZW50W2ldKTsNCisgICAgICAgIGlmKGNvZGUxID09IC0xKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGkgKyAxIDwgbGVuZ3RoKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgY29kZTIgPSBHZXRBbHBoYU51bWVyaWNDb2RlKGNvbnRlbnRbaSArIDFdKTsNCisgICAgICAgICAgICBpZihjb2RlMiA9PSAtMSkgew0KKyAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cyhjb2RlMSAqIDQ1ICsgY29kZTIsIDExLCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICBpICs9IDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJpdHMtPkFwcGVuZEJpdHMoY29kZTEsIDYsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRHQktCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsNCisgICAgRlhfRFdPUkQgdmFsdWUgPSAwOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMikgew0KKyAgICAgICAgdmFsdWUgPSAoRlhfRFdPUkQpKChGWF9CWVRFKWNvbnRlbnRbaV0gPDwgOCB8IChGWF9CWVRFKWNvbnRlbnRbaSArIDFdKTsNCisgICAgICAgIGlmKHZhbHVlIDw9IDB4QUFGRSAmJiB2YWx1ZSA+PSAweEExQTEpIHsNCisgICAgICAgICAgICB2YWx1ZSAtPSAweEExQTE7DQorICAgICAgICB9IGVsc2UgaWYodmFsdWUgPD0gMHhGQUZFICYmIHZhbHVlID49IDB4QjBBMSkgew0KKyAgICAgICAgICAgIHZhbHVlIC09IDB4QTZBMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIHZhbHVlID0gKEZYX0RXT1JEKSgodmFsdWUgPj4gOCApICogMHg2MCkgKyAoRlhfRFdPUkQpKHZhbHVlICYgMHhmZik7DQorICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKHZhbHVlLCAxMywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kOEJpdEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgY29udGVudC5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKGNvbnRlbnRbaV0sIDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZDhCaXRCeXRlcyhDRlhfQnl0ZUFycmF5ICZieXRlcywgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgKmJpdHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgYnl0ZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGJpdHMtPkFwcGVuZEJpdHMoYnl0ZXNbaV0sIDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEthbmppQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIENGWF9CeXRlQXJyYXkgYnl0ZXM7DQorICAgIEZYX0RXT1JEIHZhbHVlID0gMCwgaCA9IDA7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGJ5dGVzLkdldFNpemUoKTsgaSArPSAyKSB7DQorICAgICAgICB2YWx1ZSA9IChGWF9EV09SRCkoKEZYX0JZVEUpKGNvbnRlbnRbaV0gPDwgOCkgfCAoRlhfQllURSljb250ZW50W2kgKyAxXSk7DQorICAgICAgICBpZih2YWx1ZSA8PSAweDlmZmMgJiYgdmFsdWUgPj0gMHg4MTQwKSB7DQorICAgICAgICAgICAgdmFsdWUgLT0gMHg4MTQwOw0KKyAgICAgICAgfSBlbHNlIGlmKHZhbHVlIDw9IDB4ZWJiZiAmJiB2YWx1ZSA+PSAweGUwNDApIHsNCisgICAgICAgICAgICB2YWx1ZSAtPSAweGMxNDA7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9DQorICAgICAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHZhbHVlID4+IDggKSAqIDB4YzApICsgKEZYX0RXT1JEKSh2YWx1ZSAmIDB4ZmYpOw0KKyAgICAgICAgYml0cy0+QXBwZW5kQml0cyh2YWx1ZSwgMTMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkluaXRRUkNvZGUoRlhfSU5UMzIgbnVtSW5wdXRCeXRlcywgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyKiBxckNvZGUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcXJDb2RlLT5TZXRFQ0xldmVsKGVjTGV2ZWwpOw0KKyAgICBxckNvZGUtPlNldE1vZGUobW9kZSk7DQorICAgIGZvcihGWF9JTlQzMiB2ZXJzaW9uTnVtID0gMTsgdmVyc2lvbk51bSA8PSA0MDsgdmVyc2lvbk51bSsrKSB7DQorICAgICAgICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIEZYX0lOVDMyIG51bUJ5dGVzID0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKTsNCisgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzID0gdmVyc2lvbi0+R2V0RUNCbG9ja3NGb3JMZXZlbChlY0xldmVsKTsNCisgICAgICAgIEZYX0lOVDMyIG51bUVjQnl0ZXMgPSBlY0Jsb2Nrcy0+R2V0VG90YWxFQ0NvZGVXb3JkcygpOw0KKyAgICAgICAgRlhfSU5UMzIgbnVtUlNCbG9ja3MgPSBlY0Jsb2Nrcy0+R2V0TnVtQmxvY2tzKCk7DQorICAgICAgICBGWF9JTlQzMiBudW1EYXRhQnl0ZXMgPSBudW1CeXRlcyAtIG51bUVjQnl0ZXM7DQorICAgICAgICBpZihudW1EYXRhQnl0ZXMgPj0gbnVtSW5wdXRCeXRlcyArIDMpIHsNCisgICAgICAgICAgICBxckNvZGUtPlNldFZlcnNpb24odmVyc2lvbk51bSk7DQorICAgICAgICAgICAgcXJDb2RlLT5TZXROdW1Ub3RhbEJ5dGVzKG51bUJ5dGVzKTsNCisgICAgICAgICAgICBxckNvZGUtPlNldE51bURhdGFCeXRlcyhudW1EYXRhQnl0ZXMpOw0KKyAgICAgICAgICAgIHFyQ29kZS0+U2V0TnVtUlNCbG9ja3MobnVtUlNCbG9ja3MpOw0KKyAgICAgICAgICAgIHFyQ29kZS0+U2V0TnVtRUNCeXRlcyhudW1FY0J5dGVzKTsNCisgICAgICAgICAgICBxckNvZGUtPlNldE1hdHJpeFdpZHRoKHZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdEZpbmRCbG9ja0luZm87DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kTW9kZUluZm8oQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBiaXRzLT5BcHBlbmRCaXRzKG1vZGUtPkdldEJpdHMoKSwgNCwgZSk7DQorICAgIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQorICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKDEsIDQsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZExlbmd0aEluZm8oRlhfSU5UMzIgbnVtTGV0dGVycywgRlhfSU5UMzIgdmVyc2lvbiwgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24qIHFjdiA9IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbkZvck51bWJlcih2ZXJzaW9uLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEZYX0lOVDMyIG51bUJpdHMgPSBtb2RlLT5HZXRDaGFyYWN0ZXJDb3VudEJpdHMocWN2LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGlmKG51bUJpdHMgPiAoKDEgPDwgbnVtQml0cykgLSAxKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQorICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMgLyAyLCBudW1CaXRzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtTGV0dGVycywgbnVtQml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBGWF9JTlQzMiBudW1Ub3RhbEJ5dGVzLCBGWF9JTlQzMiBudW1EYXRhQnl0ZXMsIEZYX0lOVDMyIG51bVJTQmxvY2tzLCBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGJpdHMtPnNpemVJbkJ5dGVzKCkgIT0gbnVtRGF0YUJ5dGVzKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25CaXRzQnl0ZXNOb3RNYXRjaDsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGRhdGFCeXRlc09mZnNldCA9IDA7DQorICAgIEZYX0lOVDMyIG1heE51bURhdGFCeXRlcyA9IDA7DQorICAgIEZYX0lOVDMyIG1heE51bUVjQnl0ZXMgPSAwOw0KKyAgICBDRlhfUHRyQXJyYXkgYmxvY2tzOw0KKyAgICBGWF9JTlQzMiBpOw0KKyAgICBmb3IoaSA9IDA7IGkgPCBudW1SU0Jsb2NrczsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBudW1EYXRhQnl0ZXNJbkJsb2NrOw0KKyAgICAgICAgRlhfSU5UMzIgbnVtRWNCeXRlc0luQmxvc2s7DQorICAgICAgICBHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRChudW1Ub3RhbEJ5dGVzLCBudW1EYXRhQnl0ZXMsIG51bVJTQmxvY2tzLCBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRGF0YUJ5dGVzSW5CbG9jaywgbnVtRWNCeXRlc0luQmxvc2spOw0KKyAgICAgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzID0gRlhfTkVXIENCQ19Db21tb25CeXRlQXJyYXk7DQorICAgICAgICBkYXRhQnl0ZXMtPlNldChiaXRzLT5HZXRBcnJheSgpLCBkYXRhQnl0ZXNPZmZzZXQsIG51bURhdGFCeXRlc0luQmxvY2spOw0KKyAgICAgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZWNCeXRlcyA9IEdlbmVyYXRlRUNCeXRlcyhkYXRhQnl0ZXMsIG51bUVjQnl0ZXNJbkJsb3NrLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgYmxvY2tzLkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJCbG9ja1BhaXIoZGF0YUJ5dGVzLCBlY0J5dGVzKSk7DQorICAgICAgICBtYXhOdW1EYXRhQnl0ZXMgPSBGWF9NQVgobWF4TnVtRGF0YUJ5dGVzLCBkYXRhQnl0ZXMtPlNpemUoKSk7DQorICAgICAgICBtYXhOdW1FY0J5dGVzID0gRlhfTUFYKG1heE51bUVjQnl0ZXMsIGVjQnl0ZXMtPlNpemUoKSk7DQorICAgICAgICBkYXRhQnl0ZXNPZmZzZXQgKz0gbnVtRGF0YUJ5dGVzSW5CbG9jazsNCisgICAgfQ0KKyAgICBpZihudW1EYXRhQnl0ZXMgIT0gZGF0YUJ5dGVzT2Zmc2V0KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25CeXRlc05vdE1hdGNoT2Zmc2V0Ow0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgZm9yKEZYX0lOVDMyIHggPSAwOyB4IDwgbWF4TnVtRGF0YUJ5dGVzOyB4KyspIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IGJsb2Nrcy5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGFCeXRlcyA9ICgoQ0JDX1FSQ29kZXJCbG9ja1BhaXIqKWJsb2Nrc1tqXSktPkdldERhdGFCeXRlcygpOw0KKyAgICAgICAgICAgIGlmKHggPCBkYXRhQnl0ZXMtPlNpemUoKSkgew0KKyAgICAgICAgICAgICAgICByZXN1bHQtPkFwcGVuZEJpdHMoZGF0YUJ5dGVzLT5BdCh4KSwgOCwgZSk7DQorICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBmb3IoRlhfSU5UMzIgeSA9IDA7IHkgPCBtYXhOdW1FY0J5dGVzOyB5KyspIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBsID0gMDsgbCA8IGJsb2Nrcy5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgICAgICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGVjQnl0ZXMgPSAoKENCQ19RUkNvZGVyQmxvY2tQYWlyKilibG9ja3NbbF0pLT5HZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpOw0KKyAgICAgICAgICAgIGlmKHkgPCBlY0J5dGVzLT5TaXplKCkpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LT5BcHBlbmRCaXRzKGVjQnl0ZXMtPkF0KHkpLCA4LCBlKTsNCisgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZvcihGWF9JTlQzMiBrID0gMDsgayA8IGJsb2Nrcy5HZXRTaXplKCk7IGsrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfUVJDb2RlckJsb2NrUGFpciopYmxvY2tzW2tdOw0KKyAgICB9DQorICAgIGlmKG51bVRvdGFsQnl0ZXMgIT0gcmVzdWx0LT5zaXplSW5CeXRlcygpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25TaXplSW5CeXRlc0RpZmZlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRChGWF9JTlQzMiBudW1Ub3RhbEJ5dGVzLCBGWF9JTlQzMiBudW1EYXRhQnl0ZXMsDQorICAgICAgICBGWF9JTlQzMiBudW1SU0Jsb2NrcywgRlhfSU5UMzIgYmxvY2tJRCwNCisgICAgICAgIEZYX0lOVDMyICZudW1EYXRhQnl0ZXNJbkJsb2NrLCBGWF9JTlQzMiYgbnVtRUNCeXRlc0luQmxvY2spDQorew0KKyAgICBpZihibG9ja0lEID49IG51bVJTQmxvY2tzKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgbnVtUnNCbG9ja3NJbkdyb3VwMiA9IG51bVRvdGFsQnl0ZXMgJSBudW1SU0Jsb2NrczsNCisgICAgRlhfSU5UMzIgbnVtUnNCbG9ja3NJbkdyb3VwMSA9IG51bVJTQmxvY2tzIC0gbnVtUnNCbG9ja3NJbkdyb3VwMjsNCisgICAgRlhfSU5UMzIgbnVtVG90YWxCeXRlc0luR3JvdXAxID0gbnVtVG90YWxCeXRlcyAvIG51bVJTQmxvY2tzOw0KKyAgICBGWF9JTlQzMiBudW1Ub3RhbEJ5dGVzSW5Hcm91cDIgPSBudW1Ub3RhbEJ5dGVzSW5Hcm91cDEgKyAxOw0KKyAgICBGWF9JTlQzMiBudW1EYXRhQnl0ZXNJbkdyb3VwMSA9IG51bURhdGFCeXRlcyAvIG51bVJTQmxvY2tzOw0KKyAgICBGWF9JTlQzMiBudW1EYXRhQnl0ZXNJbkdyb3VwMiA9IG51bURhdGFCeXRlc0luR3JvdXAxICsgMTsNCisgICAgRlhfSU5UMzIgbnVtRWNCeXRlc0luR3JvdXAxID0gbnVtVG90YWxCeXRlc0luR3JvdXAxIC0gbnVtRGF0YUJ5dGVzSW5Hcm91cDE7DQorICAgIEZYX0lOVDMyIG51bUVjQnl0ZXNJbkdyb3VwMiA9IG51bVRvdGFsQnl0ZXNJbkdyb3VwMiAtIG51bURhdGFCeXRlc0luR3JvdXAyOw0KKyAgICBpZiAoYmxvY2tJRCA8IG51bVJzQmxvY2tzSW5Hcm91cDEpIHsNCisgICAgICAgIG51bURhdGFCeXRlc0luQmxvY2sgPSBudW1EYXRhQnl0ZXNJbkdyb3VwMTsNCisgICAgICAgIG51bUVDQnl0ZXNJbkJsb2NrID0gbnVtRWNCeXRlc0luR3JvdXAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbnVtRGF0YUJ5dGVzSW5CbG9jayA9IG51bURhdGFCeXRlc0luR3JvdXAyOw0KKyAgICAgICAgbnVtRUNCeXRlc0luQmxvY2sgPSBudW1FY0J5dGVzSW5Hcm91cDI7DQorICAgIH0NCit9DQorQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZW5lcmF0ZUVDQnl0ZXMoQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzLCBGWF9JTlQzMiBudW1FY0J5dGVzSW5CbG9jaywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBudW1EYXRhQnl0ZXMgPSBkYXRhQnl0ZXMtPlNpemUoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgdG9FbmNvZGU7DQorICAgIHRvRW5jb2RlLlNldFNpemUobnVtRGF0YUJ5dGVzICsgbnVtRWNCeXRlc0luQmxvY2spOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1EYXRhQnl0ZXM7IGkrKykgew0KKyAgICAgICAgdG9FbmNvZGVbaV0gPSAoZGF0YUJ5dGVzLT5BdChpKSk7DQorICAgIH0NCisgICAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciBlbmNvZGUoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQpOw0KKyAgICBlbmNvZGUuSW5pdCgpOw0KKyAgICBlbmNvZGUuRW5jb2RlKCZ0b0VuY29kZSwgbnVtRWNCeXRlc0luQmxvY2ssIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGVjQnl0ZXMgPSBGWF9ORVcgQ0JDX0NvbW1vbkJ5dGVBcnJheShudW1FY0J5dGVzSW5CbG9jayk7DQorICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IG51bUVjQnl0ZXNJbkJsb2NrOyBqKyspIHsNCisgICAgICAgIGVjQnl0ZXMtPlNldChqLCB0b0VuY29kZVtudW1EYXRhQnl0ZXMgKyBqXSk7DQorICAgIH0NCisgICAgcmV0dXJuIGVjQnl0ZXM7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzYWEyZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpRID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKEZYX0lOVDMyIG9yZGluYWwsIEZYX0lOVDMyIGJpdHMsIEZYX0NIQVIqIG5hbWUpDQorew0KKyAgICBtX25hbWUgKz0gbmFtZTsNCisgICAgbV9vcmRpbmFsID0gb3JkaW5hbDsNCisgICAgbV9iaXRzID0gYml0czsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6fkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoKQ0KK3sNCit9DQordm9pZCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpJbml0aWFsaXplKCkNCit7DQorICAgIEwgPSBGWF9ORVcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgwLCAweDAxLCAoRlhfQ0hBUiopIkwiKTsNCisgICAgTSA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDEsIDB4MDAsIChGWF9DSEFSKikiTSIpOw0KKyAgICBRID0gRlhfTkVXIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoMiwgMHgwMywgKEZYX0NIQVIqKSJRIik7DQorICAgIEggPSBGWF9ORVcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgzLCAweDAyLCAoRlhfQ0hBUiopIkgiKTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGaW5hbGl6ZSgpDQorew0KKyAgICBkZWxldGUgTDsNCisgICAgZGVsZXRlIE07DQorICAgIGRlbGV0ZSBROw0KKyAgICBkZWxldGUgSDsNCit9DQorRlhfSU5UMzIgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6T3JkaW5hbCgpDQorew0KKyAgICByZXR1cm4gbV9vcmRpbmFsOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpHZXRCaXRzKCkNCit7DQorICAgIHJldHVybiBtX2JpdHM7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkdldE5hbWUoKQ0KK3sNCisgICAgcmV0dXJuIG1fbmFtZTsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6Rm9yQml0cyhGWF9JTlQzMiBiaXRzKQ0KK3sNCisgICAgc3dpdGNoKGJpdHMpIHsNCisgICAgICAgIGNhc2UgMHgwMDoNCisgICAgICAgICAgICByZXR1cm4gTTsNCisgICAgICAgIGNhc2UgMHgwMToNCisgICAgICAgICAgICByZXR1cm4gTDsNCisgICAgICAgIGNhc2UgMHgwMjoNCisgICAgICAgICAgICByZXR1cm4gSDsNCisgICAgICAgIGNhc2UgMHgwMzoNCisgICAgICAgICAgICByZXR1cm4gUTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpEZXN0cm95KCkNCit7DQorICAgIGlmKEwpIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMOw0KKyAgICAgICAgTCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYoTSkgew0KKyAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok07DQorICAgICAgICBNID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihIKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SDsNCisgICAgICAgIEggPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKFEpIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpROw0KKyAgICAgICAgUSA9IE5VTEw7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWEyZWMxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCINCitjb25zdCBGWF9JTlQzMiBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpGT1JNQVRfSU5GT19NQVNLX1FSID0gMFg1NDEyOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVBbMzJdWzJdID0gew0KKyAgICB7MHg1NDEyLCAweDAwfSwNCisgICAgezB4NTEyNSwgMHgwMX0sDQorICAgIHsweDVFN0MsIDB4MDJ9LA0KKyAgICB7MHg1QjRCLCAweDAzfSwNCisgICAgezB4NDVGOSwgMHgwNH0sDQorICAgIHsweDQwQ0UsIDB4MDV9LA0KKyAgICB7MHg0Rjk3LCAweDA2fSwNCisgICAgezB4NEFBMCwgMHgwN30sDQorICAgIHsweDc3QzQsIDB4MDh9LA0KKyAgICB7MHg3MkYzLCAweDA5fSwNCisgICAgezB4N0RBQSwgMHgwQX0sDQorICAgIHsweDc4OUQsIDB4MEJ9LA0KKyAgICB7MHg2NjJGLCAweDBDfSwNCisgICAgezB4NjMxOCwgMHgwRH0sDQorICAgIHsweDZDNDEsIDB4MEV9LA0KKyAgICB7MHg2OTc2LCAweDBGfSwNCisgICAgezB4MTY4OSwgMHgxMH0sDQorICAgIHsweDEzQkUsIDB4MTF9LA0KKyAgICB7MHgxQ0U3LCAweDEyfSwNCisgICAgezB4MTlEMCwgMHgxM30sDQorICAgIHsweDA3NjIsIDB4MTR9LA0KKyAgICB7MHgwMjU1LCAweDE1fSwNCisgICAgezB4MEQwQywgMHgxNn0sDQorICAgIHsweDA4M0IsIDB4MTd9LA0KKyAgICB7MHgzNTVGLCAweDE4fSwNCisgICAgezB4MzA2OCwgMHgxOX0sDQorICAgIHsweDNGMzEsIDB4MUF9LA0KKyAgICB7MHgzQTA2LCAweDFCfSwNCisgICAgezB4MjRCNCwgMHgxQ30sDQorICAgIHsweDIxODMsIDB4MUR9LA0KKyAgICB7MHgyRURBLCAweDFFfSwNCisgICAgezB4MkJFRCwgMHgxRn0sDQorfTsNCitjb25zdCBGWF9JTlQzMiBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpCSVRTX1NFVF9JTl9IQUxGX0JZVEVbXSA9DQorezAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDR9Ow0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oRlhfSU5UMzIgZm9ybWF0SW5mbykNCit7DQorICAgIG1fZXJyb3JDb3JyZWN0TGV2bCA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkZvckJpdHMoKGZvcm1hdEluZm8gPj4gMykgJiAweDAzKTsNCisgICAgbV9kYXRhTWFzayA9IChGWF9CWVRFKSAoZm9ybWF0SW5mbyAmIDB4MDcpOw0KK30NCitDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjp+Q0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbigpDQorew0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpOdW1CaXRzRGlmZmVyaW5nKEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIpDQorew0KKyAgICBhIF49IGI7DQorICAgIHJldHVybiBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbYSAmIDB4MEZdICsNCisgICAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiA0KSAmIDB4MEZdICsNCisgICAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiA4KSAmIDB4MEZdICsNCisgICAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAxMikgJiAweDBGXSArDQorICAgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMTYpICYgMHgwRl0gKw0KKyAgICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDIwKSAmIDB4MEZdICsNCisgICAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAyNCkgJiAweDBGXSArDQorICAgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMjgpICYgMHgwRl07DQorfQ0KK0ZYX0JZVEUgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6R2V0RGF0YU1hc2soKQ0KK3sNCisgICAgcmV0dXJuIG1fZGF0YU1hc2s7DQorfQ0KK0NCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwgKkNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkNCit7DQorICAgIHJldHVybiBtX2Vycm9yQ29ycmVjdExldmw7DQorfQ0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkRlY29kZUZvcm1hdEluZm9ybWF0aW9uKEZYX0lOVDMyIG1hc2tlZEZvcm1hdEluZm8pDQorew0KKyAgICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBmb3JtYXRJbmZvID0gRG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvKTsNCisgICAgaWYoZm9ybWF0SW5mbyAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gZm9ybWF0SW5mbzsNCisgICAgfQ0KKyAgICByZXR1cm4gRG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvIF4gRk9STUFUX0lORk9fTUFTS19RUik7DQorfQ0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkRvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oRlhfSU5UMzIgbWFza2VkRm9ybWF0SW5mbykNCit7DQorICAgIEZYX0lOVDMyIGJlc3REaWZmZXJlbmNlID0gKEZYX0lOVDMyKUZYU1lTX25hbigpOw0KKyAgICBGWF9JTlQzMiBiZXN0Rm9ybWF0SW5mbyA9IDA7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IDMyOyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGNvbnN0KiBkZWNvZGVJbmZvID0gJkZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVBbaV1bMF07DQorICAgICAgICBGWF9JTlQzMiB0YXJnZXRJbmZvID0gZGVjb2RlSW5mb1swXTsNCisgICAgICAgIGlmKHRhcmdldEluZm8gPT0gbWFza2VkRm9ybWF0SW5mbykgew0KKyAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbihkZWNvZGVJbmZvWzFdKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGJpdHNEaWZmZXJlbmNlID0gTnVtQml0c0RpZmZlcmluZyhtYXNrZWRGb3JtYXRJbmZvLCB0YXJnZXRJbmZvKTsNCisgICAgICAgIGlmKGJpdHNEaWZmZXJlbmNlIDwgYmVzdERpZmZlcmVuY2UpIHsNCisgICAgICAgICAgICBiZXN0Rm9ybWF0SW5mbyA9IGRlY29kZUluZm9bMV07DQorICAgICAgICAgICAgYmVzdERpZmZlcmVuY2UgPSBiaXRzRGlmZmVyZW5jZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihiZXN0RGlmZmVyZW5jZSA8PSAzKSB7DQorICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oYmVzdEZvcm1hdEluZm8pOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyTWFza1V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTRhOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmgiDQorQ0JDX1FSQ29kZXJNYXNrVXRpbDo6Q0JDX1FSQ29kZXJNYXNrVXRpbCgpDQorew0KK30NCitDQkNfUVJDb2Rlck1hc2tVdGlsOjp+Q0JDX1FSQ29kZXJNYXNrVXRpbCgpDQorew0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTEoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkNCit7DQorICAgIHJldHVybiBBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbChtYXRyaXgsIFRSVUUpICsNCisgICAgICAgICAgIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgRkFMU0UpOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTIoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkNCit7DQorICAgIEZYX0lOVDMyIHBlbmFsdHkgPSAwOw0KKyAgICBGWF9CWVRFKiBhcnJheSA9IG1hdHJpeC0+R2V0QXJyYXkoKTsNCisgICAgRlhfSU5UMzIgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7DQorICAgIEZYX0lOVDMyIGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICAgIGZvcihGWF9JTlQzMiB5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIHggPSAwOyB4IDwgd2lkdGggLSAxOyB4KyspIHsNCisgICAgICAgICAgICBGWF9JTlQzMiB2YWx1ZSA9IGFycmF5W3kgKiB3aWR0aCArIHhdOw0KKyAgICAgICAgICAgIGlmKHZhbHVlID09IGFycmF5W3kgKiB3aWR0aCArIHggKyAxXSAmJg0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT0gYXJyYXlbKHkgKyAxKSAqIHdpZHRoICsgeF0gJiYNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID09IGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHggKyAxXSkgew0KKyAgICAgICAgICAgICAgICBwZW5hbHR5ICsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMyAqIHBlbmFsdHk7DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KQ0KK3sNCisgICAgRlhfSU5UMzIgcGVuYWx0eSA9IDA7DQorICAgIEZYX0JZVEUqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgICBGWF9JTlQzMiB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgICAgZm9yIChGWF9JTlQzMiB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgd2lkdGg7ICsreCkgew0KKyAgICAgICAgICAgIGlmICh4ID09IDAgJiYgKCh5ID49IDAgJiYgeSA8PSA2KSB8fCAoeSA+PSBoZWlnaHQgLSA3ICYmIHkgPD0gaGVpZ2h0IC0gMSkpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoeCA9PSB3aWR0aCAtIDcgJiYgKHkgPj0gMCAmJiB5IDw9IDYpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoeSA9PSAwICYmICgoeCA+PSAwICYmIHggPD0gNikgfHwgKHggPj0gd2lkdGggLSA3ICYmIHggPD0gd2lkdGggLSAxKSkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh5ID09IGhlaWdodCAtIDcgJiYgKHggPj0gMCAmJiB4IDw9IDYpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoeCArIDYgPCB3aWR0aCAmJg0KKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSAmJg0KKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArICAxXSA9PSAwICYmDQorICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgIDJdID09IDEgJiYNCisgICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAgM10gPT0gMSAmJg0KKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArICA0XSA9PSAxICYmDQorICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgIDVdID09IDAgJiYNCisgICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAgNl0gPT0gMSAmJg0KKyAgICAgICAgICAgICAgICAgICAgKCh4ICsgMTAgPCB3aWR0aCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgIDddID09IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArICA4XSA9PSAwICYmDQorICAgICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAgOV0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgMTBdID09IDApIHx8DQorICAgICAgICAgICAgICAgICAgICAgKHggLSA0ID49IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCAtICAxXSA9PSAwICYmDQorICAgICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggLSAgMl0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4IC0gIDNdID09IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCAtICA0XSA9PSAwKSkpIHsNCisgICAgICAgICAgICAgICAgcGVuYWx0eSArPSA0MDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHkgKyA2IDwgaGVpZ2h0ICYmDQorICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxICAmJg0KKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbKHkgKyAgMSkgKiB3aWR0aCArIHhdID09IDAgICYmDQorICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICAyKSAqIHdpZHRoICsgeF0gPT0gMSAgJiYNCisgICAgICAgICAgICAgICAgICAgIGFycmF5Wyh5ICsgIDMpICogd2lkdGggKyB4XSA9PSAxICAmJg0KKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbKHkgKyAgNCkgKiB3aWR0aCArIHhdID09IDEgICYmDQorICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA1KSAqIHdpZHRoICsgeF0gPT0gMCAgJiYNCisgICAgICAgICAgICAgICAgICAgIGFycmF5Wyh5ICsgIDYpICogd2lkdGggKyB4XSA9PSAxICYmDQorICAgICAgICAgICAgICAgICAgICAoKHkgKyAxMCA8IGhlaWdodCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA3KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA4KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA5KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArIDEwKSAqIHdpZHRoICsgeF0gPT0gMCkgfHwNCisgICAgICAgICAgICAgICAgICAgICAoeSAtIDQgPj0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICAxKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICAyKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICAzKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICA0KSAqIHdpZHRoICsgeF0gPT0gMCkpKSB7DQorICAgICAgICAgICAgICAgIHBlbmFsdHkgKz0gNDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwZW5hbHR5Ow0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTQoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkNCit7DQorICAgIEZYX0lOVDMyIG51bURhcmtDZWxscyA9IDA7DQorICAgIEZYX0JZVEUqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgICBGWF9JTlQzMiB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgICAgZm9yIChGWF9JTlQzMiB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgd2lkdGg7ICsreCkgew0KKyAgICAgICAgICAgIGlmIChhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxKSB7DQorICAgICAgICAgICAgICAgIG51bURhcmtDZWxscyArPSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBudW1Ub3RhbENlbGxzID0gbWF0cml4LT5HZXRIZWlnaHQoKSAqIG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgICAgZG91YmxlIGRhcmtSYXRpbyA9IChkb3VibGUpIG51bURhcmtDZWxscyAvIG51bVRvdGFsQ2VsbHM7DQorICAgIHJldHVybiBhYnMoIChGWF9JTlQzMikgKGRhcmtSYXRpbyAqIDEwMCAtIDUwKSAvIDUgKSAqIDUgKiAxMDsNCit9DQorRlhfQk9PTCBDQkNfUVJDb2Rlck1hc2tVdGlsOjpHZXREYXRhTWFza0JpdChGWF9JTlQzMiBtYXNrUGF0dGVybiwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZighQ0JDX1FSQ29kZXI6OklzVmFsaWRNYXNrUGF0dGVybihtYXNrUGF0dGVybikpIHsNCisgICAgICAgIGUgPSAoQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm4pOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpbnRlcm1lZGlhdGUgPSAwLCB0ZW1wID0gMDsNCisgICAgc3dpdGNoKG1hc2tQYXR0ZXJuKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgaW50ZXJtZWRpYXRlID0gKHkgKyB4KSAmIDB4MTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSB5ICYgMHgxOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIGludGVybWVkaWF0ZSA9IHggJSAzOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICAgIGludGVybWVkaWF0ZSA9ICh5ICsgeCkgJSAzOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgIGludGVybWVkaWF0ZSA9ICgoeSA+PiAxKSArICh4IC8gMykpICYgMHgxOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICAgIHRlbXAgPSB5ICogeDsNCisgICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSAodGVtcCAmIDB4MSkgKyAodGVtcCAlIDMpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA2Og0KKyAgICAgICAgICAgIHRlbXAgPSB5ICogeDsNCisgICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSAoKCh0ZW1wICYgMHgxKSArICh0ZW1wICUgMykpICYgMHgxKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNzoNCisgICAgICAgICAgICB0ZW1wID0geSAqIHg7DQorICAgICAgICAgICAgaW50ZXJtZWRpYXRlID0gKCgodGVtcCAlIDMpICsgKCh5ICsgeCkgJiAweDEpKSAmIDB4MSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVNYXNrUGF0dGVybjsNCisgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGludGVybWVkaWF0ZSA9PSAwOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9CT09MIGlzSG9yaXpvbnRhbCkNCit7DQorICAgIEZYX0lOVDMyIHBlbmFsdHkgPSAwOw0KKyAgICBGWF9JTlQzMiBudW1TYW1lQml0Q2VsbHMgPSAwOw0KKyAgICBGWF9JTlQzMiBwcmV2Qml0ID0gLTE7DQorICAgIEZYX0lOVDMyIHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgICBGWF9JTlQzMiBpTGltaXQgPSBpc0hvcml6b250YWwgPyBoZWlnaHQgOiB3aWR0aDsNCisgICAgRlhfSU5UMzIgakxpbWl0ID0gaXNIb3Jpem9udGFsID8gd2lkdGggOiBoZWlnaHQ7DQorICAgIEZYX0JZVEUqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxpbWl0OyArK2kpIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBqTGltaXQ7ICsraikgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGJpdCA9IGlzSG9yaXpvbnRhbCA/IGFycmF5W2kgKiB3aWR0aCArIGpdIDogYXJyYXlbaiAqIHdpZHRoICsgaV07DQorICAgICAgICAgICAgaWYgKGJpdCA9PSBwcmV2Qml0KSB7DQorICAgICAgICAgICAgICAgIG51bVNhbWVCaXRDZWxscyArPSAxOw0KKyAgICAgICAgICAgICAgICBpZiAobnVtU2FtZUJpdENlbGxzID09IDUpIHsNCisgICAgICAgICAgICAgICAgICAgIHBlbmFsdHkgKz0gMzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1TYW1lQml0Q2VsbHMgPiA1KSB7DQorICAgICAgICAgICAgICAgICAgICBwZW5hbHR5ICs9IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBudW1TYW1lQml0Q2VsbHMgPSAxOw0KKyAgICAgICAgICAgICAgICBwcmV2Qml0ID0gYml0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG51bVNhbWVCaXRDZWxscyA9IDA7DQorICAgIH0NCisgICAgcmV0dXJuIHBlbmFsdHk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTZlNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwCkBAIC0wLDAgKzEsNDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyTWFza1V0aWwuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCINCitjb25zdCBGWF9JTlQzMiBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOWzddWzddID0gew0KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLA0KKyAgICAxLCAwLCAwLCAwLCAwLCAwLCAxLA0KKyAgICAxLCAwLCAxLCAxLCAxLCAwLCAxLA0KKyAgICAxLCAwLCAxLCAxLCAxLCAwLCAxLA0KKyAgICAxLCAwLCAxLCAxLCAxLCAwLCAxLA0KKyAgICAxLCAwLCAwLCAwLCAwLCAwLCAxLA0KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxDQorfTsNCitjb25zdCBGWF9JTlQzMiBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdID0gew0KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwDQorfTsNCitjb25zdCBGWF9JTlQzMiBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXSA9IHsNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMA0KK307DQorY29uc3QgRlhfSU5UMzIgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5bNV1bNV0gPSB7DQorICAgIDEsIDEsIDEsIDEsIDEsDQorICAgIDEsIDAsIDAsIDAsIDEsDQorICAgIDEsIDAsIDEsIDAsIDEsDQorICAgIDEsIDAsIDAsIDAsIDEsDQorICAgIDEsIDEsIDEsIDEsIDENCit9Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddID0gew0KKyAgICB7IC0xLCAtMSwgLTEsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAxOCwgLTEsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyMiwgLTEsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgLTEsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgLTEsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzNCwgLTEsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyMiwgMzgsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNCwgNDIsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgNDYsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyOCwgNTAsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTQsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMiwgNTgsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzNCwgNjIsIC0xLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgNDYsIDY2LCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgNDgsIDcwLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgNTAsIDc0LCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTQsIDc4LCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTYsIDgyLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTgsIDg2LCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzNCwgNjIsIDkwLCAgLTEsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyOCwgNTAsIDcyLCAgOTQsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgNTAsIDc0LCAgOTgsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTQsIDc4LCAxMDIsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyOCwgNTQsIDgwLCAxMDYsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMiwgNTgsIDg0LCAxMTAsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTgsIDg2LCAxMTQsICAtMSwgIC0xfSwNCisgICAgeyA2LCAzNCwgNjIsIDkwLCAxMTgsICAtMSwgIC0xfSwNCisgICAgeyA2LCAyNiwgNTAsIDc0LCAgOTgsIDEyMiwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTQsIDc4LCAxMDIsIDEyNiwgIC0xfSwNCisgICAgeyA2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMCwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTYsIDgyLCAxMDgsIDEzNCwgIC0xfSwNCisgICAgeyA2LCAzNCwgNjAsIDg2LCAxMTIsIDEzOCwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgIC0xfSwNCisgICAgeyA2LCAzNCwgNjIsIDkwLCAxMTgsIDE0NiwgIC0xfSwNCisgICAgeyA2LCAzMCwgNTQsIDc4LCAxMDIsIDEyNiwgMTUwfSwNCisgICAgeyA2LCAyNCwgNTAsIDc2LCAxMDIsIDEyOCwgMTU0fSwNCisgICAgeyA2LCAyOCwgNTQsIDgwLCAxMDYsIDEzMiwgMTU4fSwNCisgICAgeyA2LCAzMiwgNTgsIDg0LCAxMTAsIDEzNiwgMTYyfSwNCisgICAgeyA2LCAyNiwgNTQsIDgyLCAxMTAsIDEzOCwgMTY2fSwNCisgICAgeyA2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgMTcwfSwNCit9Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXSA9IHsNCisgICAgezgsIDB9LA0KKyAgICB7OCwgMX0sDQorICAgIHs4LCAyfSwNCisgICAgezgsIDN9LA0KKyAgICB7OCwgNH0sDQorICAgIHs4LCA1fSwNCisgICAgezgsIDd9LA0KKyAgICB7OCwgOH0sDQorICAgIHs3LCA4fSwNCisgICAgezUsIDh9LA0KKyAgICB7NCwgOH0sDQorICAgIHszLCA4fSwNCisgICAgezIsIDh9LA0KKyAgICB7MSwgOH0sDQorICAgIHswLCA4fSwNCit9Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VkVSU0lPTl9JTkZPX1BPTFkgPSAweDFmMjU7DQorY29uc3QgRlhfSU5UMzIgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpUWVBFX0lORk9fUE9MWSA9IDB4MDUzNzsNCitjb25zdCBGWF9JTlQzMiBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlRZUEVfSU5GT19NQVNLX1BBVFRFUk4gPSAweDU0MTI7DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNsZWFyTWF0cml4KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYobWF0cml4ID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgbWF0cml4LT5jbGVhcigoRlhfQllURSkgLSAxKTsNCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgdmVyc2lvbiwgRlhfSU5UMzIgbWFza1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYobWF0cml4ID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgQ2xlYXJNYXRyaXgobWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEVtYmVkQmFzaWNQYXR0ZXJucyh2ZXJzaW9uLCBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRW1iZWRUeXBlSW5mbyhlY0xldmVsLCBtYXNrUGF0dGVybiwgbWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIE1heWJlRW1iZWRWZXJzaW9uSW5mbyh2ZXJzaW9uLCBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRW1iZWREYXRhQml0cyhkYXRhQml0cywgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRCYXNpY1BhdHRlcm5zKEZYX0lOVDMyIHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYobWF0cml4ID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycyhtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKG1hdHJpeCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBNYXliZUVtYmVkUG9zaXRpb25BZGp1c3RtZW50UGF0dGVybnModmVyc2lvbiwgbWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEVtYmVkVGltaW5nUGF0dGVybnMobWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFR5cGVJbmZvKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICBGWF9JTlQzMiBtYXNrUGF0dGVybiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXggKm1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBDQkNfUVJDb2RlckJpdFZlY3RvciB0eXBlSW5mb0JpdHM7DQorICAgIHR5cGVJbmZvQml0cy5Jbml0KCk7DQorICAgIE1ha2VUeXBlSW5mb0JpdHMoZWNMZXZlbCwgbWFza1BhdHRlcm4sICZ0eXBlSW5mb0JpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgdHlwZUluZm9CaXRzLlNpemUoKTsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBiaXQgPSB0eXBlSW5mb0JpdHMuQXQodHlwZUluZm9CaXRzLlNpemUoKSAtIDEgLSBpLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgRlhfSU5UMzIgeDEgPSBUWVBFX0lORk9fQ09PUkRJTkFURVNbaV1bMF07DQorICAgICAgICBGWF9JTlQzMiB5MSA9IFRZUEVfSU5GT19DT09SRElOQVRFU1tpXVsxXTsNCisgICAgICAgIG1hdHJpeC0+U2V0KHgxLCB5MSwgYml0KTsNCisgICAgICAgIGlmKGkgPCA4KSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgeDIgPSBtYXRyaXgtPkdldFdpZHRoKCkgLSBpIC0gMTsNCisgICAgICAgICAgICBGWF9JTlQzMiB5MiA9IDg7DQorICAgICAgICAgICAgbWF0cml4LT5TZXQoeDIsIHkyLCBiaXQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiB4MiA9IDg7DQorICAgICAgICAgICAgRlhfSU5UMzIgeTIgPSBtYXRyaXgtPkdldEhlaWdodCgpIC0gNyArIChpIC0gOCk7DQorICAgICAgICAgICAgbWF0cml4LT5TZXQoeDIsIHkyLCBiaXQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpNYXliZUVtYmVkVmVyc2lvbkluZm8oRlhfSU5UMzIgdmVyc2lvbiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBpZih2ZXJzaW9uIDwgNykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIHZlcnNpb25JbmZvQml0czsNCisgICAgdmVyc2lvbkluZm9CaXRzLkluaXQoKTsNCisgICAgTWFrZVZlcnNpb25JbmZvQml0cyh2ZXJzaW9uLCAmdmVyc2lvbkluZm9CaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEZYX0lOVDMyIGJpdEluZGV4ID0gNiAqIDMgLSAxOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCA2OyBpKyspIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IDM7IGorKykgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGJpdCA9IHZlcnNpb25JbmZvQml0cy5BdChiaXRJbmRleCwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgYml0SW5kZXgtLTsNCisgICAgICAgICAgICBtYXRyaXgtPlNldChpLCBtYXRyaXgtPkdldEhlaWdodCgpIC0gMTEgKyBqLCBiaXQpOw0KKyAgICAgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxMSArIGosIGksIGJpdCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkRGF0YUJpdHMoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGRhdGFCaXRzLA0KKyAgICAgICAgRlhfSU5UMzIgbWFza1BhdHRlcm4sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYobWF0cml4ID09IE5VTEwgfHwgZGF0YUJpdHMgPT0gTlVMTCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBiaXRJbmRleCA9IDA7DQorICAgIEZYX0lOVDMyIGRpcmVjdGlvbiA9IC0xOw0KKyAgICBGWF9JTlQzMiB4ID0gbWF0cml4LT5HZXRXaWR0aCgpIC0gMTsNCisgICAgRlhfSU5UMzIgeSA9IG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxOw0KKyAgICB3aGlsZSh4ID4gMCkgew0KKyAgICAgICAgaWYgKHggPT0gNikgew0KKyAgICAgICAgICAgIHggLT0gMTsNCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlKHkgPj0gMCAmJiB5IDwgbWF0cml4LT5HZXRIZWlnaHQoKSkgew0KKyAgICAgICAgICAgIGlmICh5ID09IDYpIHsNCisgICAgICAgICAgICAgICAgeSArPSBkaXJlY3Rpb247DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAyOyBpKyspIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgeHggPSB4IC0gaTsNCisgICAgICAgICAgICAgICAgaWYoIUlzRW1wdHkobWF0cml4LT5HZXQoeHgsIHkpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgYml0Ow0KKyAgICAgICAgICAgICAgICBpZihiaXRJbmRleCA8IGRhdGFCaXRzLT5TaXplKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGJpdCA9IGRhdGFCaXRzLT5BdChiaXRJbmRleCwgZSk7DQorICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICAgICAgICAgIGJpdEluZGV4Kys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBiaXQgPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKCBtYXNrUGF0dGVybiAhPSAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBib2wgPSBDQkNfUVJDb2Rlck1hc2tVdGlsOjpHZXREYXRhTWFza0JpdChtYXNrUGF0dGVybiwgeHgsIHksIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgICAgICAgICBpZihib2wpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiaXQgXj0gMHgwMTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtYXRyaXgtPlNldCh4eCwgeSwgYml0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgeSArPSBkaXJlY3Rpb247DQorICAgICAgICB9DQorICAgICAgICBkaXJlY3Rpb24gPSAtZGlyZWN0aW9uOw0KKyAgICAgICAgeSArPSBkaXJlY3Rpb247DQorICAgICAgICB4IC09IDI7DQorICAgIH0NCisgICAgaWYoYml0SW5kZXggIT0gZGF0YUJpdHMtPlNpemUoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6Q2FsY3VsYXRlQkNIQ29kZShGWF9JTlQzMiB2YWx1ZSwgRlhfSU5UMzIgcG9seSkNCit7DQorICAgIEZYX0lOVDMyIG1zYlNldEluUG9seSA9IEZpbmRNU0JTZXQocG9seSk7DQorICAgIHZhbHVlIDw8PSBtc2JTZXRJblBvbHkgLSAxOw0KKyAgICB3aGlsZShGaW5kTVNCU2V0KHZhbHVlKSA+PSBtc2JTZXRJblBvbHkpIHsNCisgICAgICAgIHZhbHVlIF49IHBvbHkgPDwgKEZpbmRNU0JTZXQodmFsdWUpIC0gbXNiU2V0SW5Qb2x5KTsNCisgICAgfQ0KKyAgICByZXR1cm4gdmFsdWU7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpNYWtlVHlwZUluZm9CaXRzKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICBGWF9JTlQzMiBtYXNrUGF0dGVybiwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoYml0cyA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGlmKCFDQkNfUVJDb2Rlcjo6SXNWYWxpZE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQmFkTWFzazsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHR5cGVJbmZvID0gKGVjTGV2ZWwtPkdldEJpdHMoKSA8PCAzKSB8IG1hc2tQYXR0ZXJuOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgYml0cy0+QXBwZW5kQml0cyh0eXBlSW5mbywgNSwgZSk7DQorICAgIEZYX0lOVDMyIGJjaENvZGUgPSBDYWxjdWxhdGVCQ0hDb2RlKHR5cGVJbmZvLCBUWVBFX0lORk9fUE9MWSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBiaXRzLT5BcHBlbmRCaXRzKGJjaENvZGUsIDEwLCBlKTsNCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgbWFza0JpdHM7DQorICAgIG1hc2tCaXRzLkluaXQoKTsNCisgICAgbWFza0JpdHMuQXBwZW5kQml0cyhUWVBFX0lORk9fTUFTS19QQVRURVJOLCAxNSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBiaXRzLT5YT1IoJm1hc2tCaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGlmKGJpdHMtPlNpemUoKSAhPSAxNSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQml0U2l6ZU5vdDE1Ow0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1ha2VWZXJzaW9uSW5mb0JpdHMoRlhfSU5UMzIgdmVyc2lvbiwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoYml0cyA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGJpdHMtPkFwcGVuZEJpdHModmVyc2lvbiwgNiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBGWF9JTlQzMiBiY2hDb2RlID0gQ2FsY3VsYXRlQkNIQ29kZSh2ZXJzaW9uLCBWRVJTSU9OX0lORk9fUE9MWSk7DQorICAgIGJpdHMtPkFwcGVuZEJpdHMoYmNoQ29kZSwgMTIsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaWYoYml0cy0+U2l6ZSgpICE9IDE4KSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25CaXRTaXplTm90MTg7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SXNFbXB0eShGWF9JTlQzMiB2YWx1ZSkNCit7DQorICAgIHJldHVybiAoRlhfQllURSl2YWx1ZSA9PSAweGZmOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SXNWYWxpZFZhbHVlKEZYX0lOVDMyIHZhbHVlKQ0KK3sNCisgICAgcmV0dXJuICgoRlhfQllURSl2YWx1ZSA9PSAweGZmIHx8IChGWF9CWVRFKXZhbHVlID09IDB4MDAgfHwgKEZYX0JZVEUpdmFsdWUgPT0gMHgwMSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFRpbWluZ1BhdHRlcm5zKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYobWF0cml4ID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgZm9yKEZYX0lOVDMyIGkgPSA4OyBpIDwgbWF0cml4LT5HZXRXaWR0aCgpIC0gODsgaSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBiaXQgPSAoaSArIDEpICUgMjsNCisgICAgICAgIGlmKCFJc1ZhbGlkVmFsdWUobWF0cml4LT5HZXQoaSwgNikpKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUltYWdlRGF0YTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKElzRW1wdHkobWF0cml4LT5HZXQoaSAsIDYpKSkgew0KKyAgICAgICAgICAgIG1hdHJpeC0+U2V0KGksIDYsIGJpdCk7DQorICAgICAgICB9DQorICAgICAgICBpZighSXNWYWxpZFZhbHVlKG1hdHJpeC0+R2V0KDYsIGkpKSkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGE7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9DQorICAgICAgICBpZihJc0VtcHR5KG1hdHJpeC0+R2V0KDYsIGkpKSkgew0KKyAgICAgICAgICAgIG1hdHJpeC0+U2V0KDYsIGksIGJpdCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGlmKG1hdHJpeC0+R2V0KDgsIG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSA4KSA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRfOEJlWmVybzsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIG1hdHJpeC0+U2V0KDgsIG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSA4LCAxKTsNCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKEZYX0lOVDMyIHhTdGFydCwgRlhfSU5UMzIgeVN0YXJ0LA0KKyAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBmb3IoRlhfSU5UMzIgeCA9IDA7IHggPCA4OyB4KyspIHsNCisgICAgICAgIGlmKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCArIHgsIHlTdGFydCkpKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgICAgIH0NCisgICAgICAgIG1hdHJpeC0+U2V0KHhTdGFydCArIHgsIHlTdGFydCwgSE9SSVpPTlRBTF9TRVBBUkFUSU9OX1BBVFRFUk5bMF1beF0pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4oRlhfSU5UMzIgeFN0YXJ0LCBGWF9JTlQzMiB5U3RhcnQsDQorICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGZvcihGWF9JTlQzMiB5ID0gMDsgeSA8IDc7IHkrKykgew0KKyAgICAgICAgaWYoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0LCB5U3RhcnQgKyB5KSkpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIG1hdHJpeC0+U2V0KHhTdGFydCwgeVN0YXJ0ICsgeSwgVkVSVElDQUxfU0VQQVJBVElPTl9QQVRURVJOW3ldWzBdKTsNCisgICAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKEZYX0lOVDMyIHhTdGFydCwgRlhfSU5UMzIgeVN0YXJ0LA0KKyAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KKyAgICAgICAgZSAgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgZm9yKEZYX0lOVDMyIHkgPSAwOyB5IDwgNTsgeSsrKSB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgeCA9IDA7IHggPCA1OyB4KyspIHsNCisgICAgICAgICAgICBpZighSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQgKyB4LCB5ICsgeVN0YXJ0KSkpIHsNCisgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQorICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5LCBQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5beV1beF0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybiAoRlhfSU5UMzIgeFN0YXJ0LCBGWF9JTlQzMiB5U3RhcnQsDQorICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGZvcihGWF9JTlQzMiB5ID0gMDsgeSA8IDc7IHkrKykgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIHggPSAwOyB4IDwgNzsgeCsrKSB7DQorICAgICAgICAgICAgaWYoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0ICsgeSkpKSB7DQorICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWF0cml4LT5TZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0ICsgeSwgUE9TSVRJT05fREVURUNUSU9OX1BBVFRFUk5beV1beF0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYobWF0cml4ID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgcGRwV2lkdGggPSA3Ow0KKyAgICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigwLCAwLCBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4obWF0cml4LT5HZXRXaWR0aCgpIC0gcGRwV2lkdGgsIDAsIG1hdHJpeCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigwLCBtYXRyaXgtPkdldFdpZHRoKCkgLSBwZHBXaWR0aCwgbWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEZYX0lOVDMyIGhzcFdpZHRoID0gODsNCisgICAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgaHNwV2lkdGggLSAxLCBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4obWF0cml4LT5HZXRXaWR0aCgpIC0gaHNwV2lkdGgsIGhzcFdpZHRoIC0gMSwgbWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKDAsIG1hdHJpeC0+R2V0V2lkdGgoKSAtIGhzcFdpZHRoLCBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRlhfSU5UMzIgdnNwU2l6ZSA9IDc7DQorICAgIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybih2c3BTaXplLCAwLCBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgRW1iZWRWZXJ0aWNhbFNlcGFyYXRpb25QYXR0ZXJuKG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSB2c3BTaXplIC0gMSwgMCwgbWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybih2c3BTaXplLCBtYXRyaXgtPkdldEhlaWdodCgpIC0gdnNwU2l6ZSwgbWF0cml4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpNYXliZUVtYmVkUG9zaXRpb25BZGp1c3RtZW50UGF0dGVybnMoRlhfSU5UMzIgdmVyc2lvbiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBpZih2ZXJzaW9uIDwgMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGluZGV4ID0gdmVyc2lvbiAtIDE7DQorICAgIEZYX0lOVDMyIGNvbnN0KiBjb29yZGluYXRlcyA9ICYoUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbaW5kZXhdWzBdKTsNCisgICAgRlhfSU5UMzIgbnVtQ29vcmRpbmF0ZSA9IDc7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IG51bUNvb3JkaW5hdGU7IGkrKykgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgbnVtQ29vcmRpbmF0ZTsgaisrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgeSA9IGNvb3JkaW5hdGVzW2ldOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIHggPSBjb29yZGluYXRlc1tqXTsNCisgICAgICAgICAgICBpZih4ID09IC0xIHx8IHkgPT0gLTEpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKElzRW1wdHkobWF0cml4LT5HZXQoeCwgeSkpKSB7DQorICAgICAgICAgICAgICAgIEVtYmVkUG9zaXRpb25BZGp1c3RtZW50UGF0dGVybih4IC0gMiwgeSAtIDIsIG1hdHJpeCwgZSk7DQorICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkZpbmRNU0JTZXQoRlhfSU5UMzIgdmFsdWUpDQorew0KKyAgICBGWF9JTlQzMiBudW1EaWdpdHMgPSAwOw0KKyAgICB3aGlsZSh2YWx1ZSAhPSAwKSB7DQorICAgICAgICB2YWx1ZSA+Pj0gMTsNCisgICAgICAgICsrbnVtRGlnaXRzOw0KKyAgICB9DQorICAgIHJldHVybiBudW1EaWdpdHM7DQorfQ0KK0NCQ19RUkNvZGVyTWF0cml4VXRpbDo6Q0JDX1FSQ29kZXJNYXRyaXhVdGlsKCkNCit7DQorfQ0KK0NCQ19RUkNvZGVyTWF0cml4VXRpbDo6fkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpDQorew0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2Rlck1vZGUuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJNb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGE1NjEwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSQ29kZXJNb2RlLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaCINCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0JZVEUgPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQyA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMgPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkkgPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzRUNJID0gTlVMTDsNCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0dCSyA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SID0gTlVMTDsNCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfRklSU1RfUE9TSVRJT04gPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9TRUNPTkRfUE9TSVRJT04gPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzU1RSVUNUVVJFRF9BUFBFTkQgPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZTo6Q0JDX1FSQ29kZXJNb2RlKEZYX0lOVDMyICpjaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiB4MSwgRlhfSU5UMzIgeDIsIEZYX0lOVDMyIHgzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGJpdHMsIENGWF9CeXRlU3RyaW5nIG5hbWUpDQorew0KKyAgICBtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zID0gY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnM7DQorICAgIGlmIChtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zICE9IE5VTEwpIHsNCisgICAgICAgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbMF0gPSB4MTsNCisgICAgICAgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbMV0gPSB4MjsNCisgICAgICAgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbMl0gPSB4MzsNCisgICAgfQ0KKyAgICBtX25hbWUgKz0gbmFtZTsNCisgICAgbV9iaXRzID0gYml0czsNCit9DQorQ0JDX1FSQ29kZXJNb2RlOjp+Q0JDX1FSQ29kZXJNb2RlKCkNCit7DQorICAgIGlmKG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zKTsNCisgICAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBzQllURSA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoRlhfSU5UMzIsIDMpLCA4LCAxNiwgMTYsIDB4NCwgIkJZVEUiKTsNCisgICAgc0FMUEhBTlVNRVJJQyA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoRlhfSU5UMzIsIDMpLCA5LCAxMSwgMTMsIDB4MiwgIkFMUEhBTlVNRVJJQyIpOw0KKyAgICBzRUNJID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDcsICJFQ0kiKTsNCisgICAgc0tBTkpJID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhGWF9JTlQzMiwgMyksIDgsIDEwLCAxMiwgMHg4LCAiS0FOSkkiKTsNCisgICAgc05VTUVSSUMgPSBGWF9ORVcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKEZYX0lOVDMyLCAzKSwgMTAsIDEyLCAxNCwgMHgxLCAiTlVNRVJJQyIpOw0KKyAgICBzR0JLID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhGWF9JTlQzMiwgMyksIDgsIDEwLCAxMiwgMHgwRCwgIkdCSyIpOw0KKyAgICBzVEVSTUlOQVRPUiA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoRlhfSU5UMzIsIDMpLCAwLCAwLCAwLCAweDAwLCAiVEVSTUlOQVRPUiIpOw0KKyAgICBzRk5DMV9GSVJTVF9QT1NJVElPTiA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoTlVMTCwgMCwgMCwgMCwgMHgwNSwgIkZOQzFfRklSU1RfUE9TSVRJT04iKTsNCisgICAgc0ZOQzFfU0VDT05EX1BPU0lUSU9OID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDA5LCAiRk5DMV9TRUNPTkRfUE9TSVRJT04iKTsNCisgICAgc1NUUlVDVFVSRURfQVBQRU5EID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhGWF9JTlQzMiwgMyksIDAsIDAsIDAsIDB4MDMsICJTVFJVQ1RVUkVEX0FQUEVORCIpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6RmluYWxpemUoKQ0KK3sNCisgICAgZGVsZXRlIHNCWVRFOw0KKyAgICBkZWxldGUgc0FMUEhBTlVNRVJJQzsNCisgICAgZGVsZXRlIHNFQ0k7DQorICAgIGRlbGV0ZSBzS0FOSkk7DQorICAgIGRlbGV0ZSBzTlVNRVJJQzsNCisgICAgZGVsZXRlIHNHQks7DQorICAgIGRlbGV0ZSBzVEVSTUlOQVRPUjsNCisgICAgZGVsZXRlIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KKyAgICBkZWxldGUgc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KKyAgICBkZWxldGUgc1NUUlVDVFVSRURfQVBQRU5EOw0KK30NCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6Rm9yQml0cyhGWF9JTlQzMiBiaXRzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIHN3aXRjaCAoYml0cykgew0KKyAgICAgICAgY2FzZSAweDA6DQorICAgICAgICAgICAgcmV0dXJuIHNURVJNSU5BVE9SOw0KKyAgICAgICAgY2FzZSAweDE6DQorICAgICAgICAgICAgcmV0dXJuIHNOVU1FUklDOw0KKyAgICAgICAgY2FzZSAweDI6DQorICAgICAgICAgICAgcmV0dXJuIHNBTFBIQU5VTUVSSUM7DQorICAgICAgICBjYXNlIDB4MzoNCisgICAgICAgICAgICByZXR1cm4gc1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgICAgICAgY2FzZSAweDQ6DQorICAgICAgICAgICAgcmV0dXJuIHNCWVRFOw0KKyAgICAgICAgY2FzZSAweDU6DQorICAgICAgICAgICAgcmV0dXJuIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KKyAgICAgICAgY2FzZSAweDc6DQorICAgICAgICAgICAgcmV0dXJuIHNFQ0k7DQorICAgICAgICBjYXNlIDB4ODoNCisgICAgICAgICAgICByZXR1cm4gc0tBTkpJOw0KKyAgICAgICAgY2FzZSAweDk6DQorICAgICAgICAgICAgcmV0dXJuIHNGTkMxX1NFQ09ORF9QT1NJVElPTjsNCisgICAgICAgIGNhc2UgMHgwRDoNCisgICAgICAgICAgICByZXR1cm4gc0dCSzsNCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uVW5zdXBwb3J0ZWRNb2RlOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2Rlck1vZGU6OkdldEJpdHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fYml0czsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZXJNb2RlOjpHZXROYW1lKCkNCit7DQorICAgIHJldHVybiBtX25hbWU7DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkNvZGVyTW9kZTo6R2V0Q2hhcmFjdGVyQ291bnRCaXRzKENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoYXJhY3Rlck5vdFRoaXNNb2RlOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG51bWJlciA9IHZlcnNpb24tPkdldFZlcnNpb25OdW1iZXIoKTsNCisgICAgRlhfSU5UMzIgb2Zmc2V0Ow0KKyAgICBpZihudW1iZXIgPD0gOSkgew0KKyAgICAgICAgb2Zmc2V0ID0gMDsNCisgICAgfSBlbHNlIGlmKG51bWJlciA8PSAyNikgew0KKyAgICAgICAgb2Zmc2V0ID0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG9mZnNldCA9IDI7DQorICAgIH0NCisgICAgcmV0dXJuIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbb2Zmc2V0XTsNCit9DQordm9pZCBDQkNfUVJDb2Rlck1vZGU6OkRlc3Ryb3koKQ0KK3sNCisgICAgaWYoc0JZVEUpIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KKyAgICAgICAgc0JZVEUgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKHNOVU1FUklDKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQzsNCisgICAgICAgIHNOVU1FUklDID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihzQUxQSEFOVU1FUklDKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDOw0KKyAgICAgICAgc0FMUEhBTlVNRVJJQyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYoc0tBTkpJKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkk7DQorICAgICAgICBzS0FOSkkgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKHNFQ0kpIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNFQ0k7DQorICAgICAgICBzRUNJID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihzR0JLKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzR0JLOw0KKyAgICAgICAgc0dCSyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYoc1RFUk1JTkFUT1IpIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SOw0KKyAgICAgICAgc1RFUk1JTkFUT1IgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKHNGTkMxX0ZJUlNUX1BPU0lUSU9OKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9GSVJTVF9QT1NJVElPTjsNCisgICAgICAgIHNGTkMxX0ZJUlNUX1BPU0lUSU9OID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihzRk5DMV9TRUNPTkRfUE9TSVRJT04pIHsNCisgICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTjsNCisgICAgICAgIHNGTkMxX1NFQ09ORF9QT1NJVElPTiA9IE5VTEw7DQorICAgIH0NCisgICAgaWYoc1NUUlVDVFVSRURfQVBQRU5EKSB7DQorICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzU1RSVUNUVVJFRF9BUFBFTkQ7DQorICAgICAgICBzU1RSVUNUVVJFRF9BUFBFTkQgPSBOVUxMOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkNvZGVyVmVyc2lvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlclZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWUzOWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJDb2RlclZlcnNpb24uY3BwCkBAIC0wLDAgKzEsNzYxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvdXRpbHMuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyRUNCLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorY29uc3QgRlhfSU5UMzIgQ0JDX1FSQ29kZXJWZXJzaW9uOjpWRVJTSU9OX0RFQ09ERV9JTkZPW10gPSB7DQorICAgIDB4MDdDOTQsIDB4MDg1QkMsIDB4MDlBOTksIDB4MEE0RDMsIDB4MEJCRjYsDQorICAgIDB4MEM3NjIsIDB4MEQ4NDcsIDB4MEU2MEQsIDB4MEY5MjgsIDB4MTBCNzgsDQorICAgIDB4MTE0NUQsIDB4MTJBMTcsIDB4MTM1MzIsIDB4MTQ5QTYsIDB4MTU2ODMsDQorICAgIDB4MTY4QzksIDB4MTc3RUMsIDB4MThFQzQsIDB4MTkxRTEsIDB4MUFGQUIsDQorICAgIDB4MUIwOEUsIDB4MUNDMUEsIDB4MUQzM0YsIDB4MUVENzUsIDB4MUYyNTAsDQorICAgIDB4MjA5RDUsIDB4MjE2RjAsIDB4MjI4QkEsIDB4MjM3OUYsIDB4MjRCMEIsDQorICAgIDB4MjU0MkUsIDB4MjZBNjQsIDB4Mjc1NDEsIDB4MjhDNjkNCit9Ow0KK0NGWF9QdHJBcnJheSAqQ0JDX1FSQ29kZXJWZXJzaW9uOjpWRVJTSU9OID0gTlVMTDsNCit2b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBWRVJTSU9OID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6RmluYWxpemUoKQ0KK3sNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwIDsgaSA8IFZFUlNJT04tPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDQkNfUVJDb2RlclZlcnNpb24qIHYgPSAoQ0JDX1FSQ29kZXJWZXJzaW9uKikoVkVSU0lPTi0+R2V0QXQoaSkpOw0KKyAgICAgICAgZGVsZXRlIHY7DQorICAgIH0NCisgICAgZGVsZXRlIFZFUlNJT047DQorfQ0KK0NCQ19RUkNvZGVyVmVyc2lvbjo6Q0JDX1FSQ29kZXJWZXJzaW9uKEZYX0lOVDMyIHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KQ0KK3sNCisgICAgbV92ZXJzaW9uTnVtYmVyID0gdmVyc2lvbk51bWJlcjsNCisgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCisgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MyKTsNCisgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MzKTsNCisgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3M0KTsNCisgICAgRlhfSU5UMzIgdG90YWwgPSAwOw0KKyAgICBGWF9JTlQzMiBlY0NvZGVXb3JkcyA9IGVjQmxvY2tzMS0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpOw0KKyAgICBDRlhfUHRyQXJyYXkqIGVjYkFycmF5ID0gZWNCbG9ja3MxLT5HZXRFQ0Jsb2NrcygpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBlY2JBcnJheS0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrID0gKENCQ19RUkNvZGVyRUNCKikoKCplY2JBcnJheSlbaV0pOw0KKyAgICAgICAgdG90YWwgKz0gZWNCbG9jay0+R2V0Q291bnQoKSAqIChlY0Jsb2NrLT5HZXREYXRhQ29kZVdvcmRzKCkgKyBlY0NvZGVXb3Jkcyk7DQorICAgIH0NCisgICAgbV90b3RhbENvZGVXb3JkcyA9IHRvdGFsOw0KKyAgICBzd2l0Y2godmVyc2lvbk51bWJlcikgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyMik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDc6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjIpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNDIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA5Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Nik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDEwOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDExOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDEyOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDEzOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDE0Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Nik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjYpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxNToNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNDgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDcwKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMTY6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDE3Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxODoNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMTk6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDIwOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTApOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyMToNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyOCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDcyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5NCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDIyOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzQpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjM6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTAyKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjQ6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4MCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA2KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjU6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzIpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4NCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEwKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjY6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjc6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzQpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5MCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjg6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEyMik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI5Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI2KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzA6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3OCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzApOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzMToNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzNCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDMyOg0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2MCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzM6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzNDoNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjIpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDkwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE0Nik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM1Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNTApOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzNjoNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDIpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEyOCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTU0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzc6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjgpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4MCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzIpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE1OCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM4Og0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODQpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNjIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzOToNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTQpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzOCk7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTY2KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNDA6DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCisgICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDIpOw0KKyAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE3MCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQorQ0JDX1FSQ29kZXJWZXJzaW9uOjp+Q0JDX1FSQ29kZXJWZXJzaW9uKCkNCit7DQorICAgIGlmKG1fZWNCbG9ja3MuR2V0U2l6ZSgpICE9IDApIHsNCisgICAgICAgIEZYX0lOVDMyIGl0QmVnID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGl0RW5kID0gbV9lY0Jsb2Nrcy5HZXRTaXplKCk7DQorICAgICAgICB3aGlsZShpdEJlZyAhPSBpdEVuZCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSAoIChDQkNfUVJDb2RlckVDQmxvY2tzKikobV9lY0Jsb2Nrc1tpdEJlZ10pICk7DQorICAgICAgICAgICAgaXRCZWcrKzsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25OdW1iZXIoKQ0KK3sNCisgICAgcmV0dXJuIG1fdmVyc2lvbk51bWJlcjsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKQ0KK3sNCisgICAgcmV0dXJuICZtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlclZlcnNpb246OkdldFRvdGFsQ29kZVdvcmRzKCkNCit7DQorICAgIHJldHVybiBtX3RvdGFsQ29kZVdvcmRzOw0KK30NCitGWF9JTlQzMiBDQkNfUVJDb2RlclZlcnNpb246OkdldERpbWVuc2lvbkZvclZlcnNpb24oKQ0KK3sNCisgICAgcmV0dXJuIDE3ICsgNCAqIG1fdmVyc2lvbk51bWJlcjsNCit9DQorQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRFQ0Jsb2Nrc0ZvckxldmVsKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwgKmVjTGV2ZWwpDQorew0KKyAgICByZXR1cm4gKENCQ19RUkNvZGVyRUNCbG9ja3MqKW1fZWNCbG9ja3NbZWNMZXZlbC0+T3JkaW5hbCgpXTsNCit9DQorQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJDb2RlclZlcnNpb246OkdldFByb3Zpc2lvbmFsVmVyc2lvbkZvckRpbWVuc2lvbihGWF9JTlQzMiBkaW1lbnNpb24sIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoKGRpbWVuc2lvbiAlIDQpICE9IDEpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKChkaW1lbnNpb24gLSAxNykgPj4gMiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHFjdjsNCit9DQorQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJDb2RlclZlcnNpb246OkRlY29kZVZlcnNpb25JbmZvcm1hdGlvbihGWF9JTlQzMiB2ZXJzaW9uQml0cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBiZXN0RGlmZmVyZW5jZSA9IEZYU1lTX0ludE1heDsNCisgICAgRlhfSU5UMzIgYmVzdFZlcnNpb24gPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzQ7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgdGFyZ2V0VmVyc2lvbiA9IFZFUlNJT05fREVDT0RFX0lORk9baV07DQorICAgICAgICBpZih0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKSB7DQorICAgICAgICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKGkgKyA3LCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgcmV0dXJuIHFjdjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGJpdHNEaWZmZXJlbmNlID0gQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6TnVtQml0c0RpZmZlcmluZyh2ZXJzaW9uQml0cywgdGFyZ2V0VmVyc2lvbik7DQorICAgICAgICBpZihiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKSB7DQorICAgICAgICAgICAgYmVzdFZlcnNpb24gPSBpICsgNzsNCisgICAgICAgICAgICBiZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGJlc3REaWZmZXJlbmNlIDw9IDMpIHsNCisgICAgICAgIENCQ19RUkNvZGVyVmVyc2lvbiogcWN2ID0gR2V0VmVyc2lvbkZvck51bWJlcihiZXN0VmVyc2lvbiwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gcWN2Ow0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJDb2RlclZlcnNpb246OkJ1aWxkRnVuY3Rpb25QYXR0ZXJuKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgZGltZW5zaW9uID0gR2V0RGltZW5zaW9uRm9yVmVyc2lvbigpOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXggPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgICBiaXRNYXRyaXgtPkluaXQoZGltZW5zaW9uKTsNCisgICAgYml0TWF0cml4LT5TZXRSZWdpb24oMCwgMCAsIDksIDksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKGRpbWVuc2lvbiAtIDgsIDAsIDgsIDksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDgsIDksIDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0lOVDMyIG1heCA9IG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgbWF4OyB4KyspIHsNCisgICAgICAgIEZYX0lOVDMyIGkgPSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzW3hdIC0gMjsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgeSA9IDA7IHkgPCBtYXg7IHkrKykgew0KKyAgICAgICAgICAgIGlmICgoeCA9PSAwICYmICh5ID09IDAgfHwgeSA9PSBtYXggLSAxKSkgfHwgKHggPT0gbWF4IC0gMSAmJiB5ID09IDApKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiaXRNYXRyaXgtPlNldFJlZ2lvbihtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzW3ldIC0gMiwgaSwgNSwgNSwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDYsIDksIDEsIGRpbWVuc2lvbiAtIDE3LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBiaXRNYXRyaXgtPlNldFJlZ2lvbig5LCA2LCBkaW1lbnNpb24gLSAxNywgMSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgaWYgKG1fdmVyc2lvbk51bWJlciA+IDYpIHsNCisgICAgICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKGRpbWVuc2lvbiAtIDExLCAwLCAzLCA2LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDExLCA2LCAzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYml0TWF0cml4Ow0KK30NCitDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbkZvck51bWJlcihGWF9JTlQzMiB2ZXJzaW9uTnVtYmVyLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKFZFUlNJT04tPkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoNywgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDE5KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMywgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDEzKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxNywgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDkpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDEwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzQpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjIpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE1LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDQpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTMpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgODApKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzIpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjQpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgOSkpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbig1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxMDgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgNDMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTIpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgNjgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTkpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oNywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgNzgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMzEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTQpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzkpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTkpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oOSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDM2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDM3KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE3KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEzKSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDEwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA2OCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA2OSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0MyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA0NCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxOSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAyMCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgODEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgNTEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTMpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDkyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDkzKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDM2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDM3KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDIwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDIxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE1KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDEzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMDcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMzcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMjApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjEpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDExKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyKSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDE0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDQwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQxKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig1LCAxNykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTMpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMTUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDg3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDg4KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQyKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAxMykpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgOTgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgOTkpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgNDUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgNDYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE5KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDIwKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxNywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTA3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDEwOCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDIzKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCAxNSkpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTIwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDEyMSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig5LCA0MyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDE5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE0KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDQ0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCA0NSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgMjEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjIpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOSwgMTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDE0KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDIwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTA4KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDQxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCA0MikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMjUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDExNykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgNDIpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDIzKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE5LCAxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxNykpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTExKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDExMikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgNDYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCAxMykpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDEyMikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNCwgNDgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDE2KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDI0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxMTcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE4KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDQ1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMwLCAxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxNykpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyNSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTA2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEwNykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCA0NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgNDgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMjYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxMTQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE5LCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyOCwgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMjMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzMsIDE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE3KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDI3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAxMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIzKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCA0NSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCA0NikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAyMyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyNiwgMjQpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI4LCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxMTgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgNDUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMxLCAyNSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzEsIDE2KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDI5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAxMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMTE3KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIxLCA0NSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCA0NikpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAyMyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNywgMjQpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI2LCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxMTYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCA0OCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjUsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIzLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyNSwgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI5LCA0NykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MiwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI4LCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDExNSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ3KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNSwgMjUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM1LCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDExNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxMTYpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIxLCA0NykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyOSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE2KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMywgNDcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDQsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDU5LCAxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxNykpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzNSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDEyMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAxMjIpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI2LCA0OCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzOSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MSwgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDEyMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNCwgMTIyKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCA0OCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDY0LCAxNikpKSk7DQorICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzNywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDEyMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMjMpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjksIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NykpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0OSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDI1KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI0LCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOw0KKyAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOCwgMTIzKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzMiwgNDcpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDgsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzIsIDE2KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDM5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMCwgMTE3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDExOCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MCwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgNDgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDMsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAyNSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNjcsIDE2KSkpKTsNCisgICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDQwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgMTE4KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDExOSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOCwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzEsIDQ4KSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNCwgMjUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjAsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYxLCAxNikpKSk7DQorICAgIH0NCisgICAgaWYodmVyc2lvbk51bWJlciA8IDEgfHwgdmVyc2lvbk51bWJlciA+IDQwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgcmV0dXJuICAoQ0JDX1FSQ29kZXJWZXJzaW9uKikoKlZFUlNJT04pW3ZlcnNpb25OdW1iZXIgLSAxXTsNCit9DQordm9pZCBDQkNfUVJDb2RlclZlcnNpb246OkRlc3Ryb3koKQ0KK3sNCisgICAgRlhfSU5UMzIgaTsNCisgICAgZm9yKGkgPSAwOyBpIDwgVkVSU0lPTi0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGRlbGV0ZSAoIChDQkNfUVJDb2RlclZlcnNpb24qKSgqVkVSU0lPTilbaV0gKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJEYXRhQmxvY2suY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGF0YUJsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJlOTFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGF0YUJsb2NrLmNwcApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlckVDQi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGF0YUJsb2NrLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJDb2RlclZlcnNpb24uaCINCitDQkNfUVJEYXRhQmxvY2s6OkNCQ19RUkRhdGFCbG9jayhGWF9JTlQzMiBudW1EYXRhQ29kZXdvcmRzLCBDRlhfQnl0ZUFycmF5ICpjb2Rld29yZHMpDQorICAgIDogbV9udW1EYXRhQ29kZXdvcmRzKG51bURhdGFDb2Rld29yZHMpDQorICAgICwgbV9jb2Rld29yZHMoY29kZXdvcmRzKQ0KK3sNCit9DQorQ0JDX1FSRGF0YUJsb2NrOjp+Q0JDX1FSRGF0YUJsb2NrKCkNCit7DQorICAgIGlmKG1fY29kZXdvcmRzICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX2NvZGV3b3JkczsNCisgICAgICAgIG1fY29kZXdvcmRzID0gTlVMTDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfUVJEYXRhQmxvY2s6OkdldE51bURhdGFDb2Rld29yZHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fbnVtRGF0YUNvZGV3b3JkczsNCit9DQorQ0ZYX0J5dGVBcnJheSAqQ0JDX1FSRGF0YUJsb2NrOjpHZXRDb2Rld29yZHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fY29kZXdvcmRzOw0KK30NCitDRlhfUHRyQXJyYXkgKkNCQ19RUkRhdGFCbG9jazo6R2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsIENCQ19RUkNvZGVyVmVyc2lvbiAqdmVyc2lvbiwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihyYXdDb2Rld29yZHMtPkdldFNpemUoKSAhPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyAqZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KKyAgICBGWF9JTlQzMiB0b3RhbEJsb2NrcyA9IDA7DQorICAgIENGWF9QdHJBcnJheSogZWNCbG9ja0FycmF5ID0gZWNCbG9ja3MtPkdldEVDQmxvY2tzKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IoaSA9IDA7IGkgPCBlY0Jsb2NrQXJyYXktPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICB0b3RhbEJsb2NrcyArPSAoKENCQ19RUkNvZGVyRUNCKikoKmVjQmxvY2tBcnJheSlbaV0pLT5HZXRDb3VudCgpOw0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheSAqZGF0YWJsb2NrID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KKyAgICBkYXRhYmxvY2stPlNldFNpemUodG90YWxCbG9ja3MpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXkgPiByZXN1bHQoZGF0YWJsb2NrKTsNCisgICAgRlhfSU5UMzIgbnVtUmVzdWx0QmxvY2tzID0gMDsNCisgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgZWNCbG9ja0FycmF5LT5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgQ0JDX1FSQ29kZXJFQ0IgKmVjQmxvY2sgPSAoQ0JDX1FSQ29kZXJFQ0IqKSgqZWNCbG9ja0FycmF5KVtqXTsNCisgICAgICAgIGZvcihGWF9JTlQzMiBrID0gMDsgayA8IGVjQmxvY2stPkdldENvdW50KCk7IGsrKykgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG51bURhdGFDb2Rld29yZHMgPSBlY0Jsb2NrLT5HZXREYXRhQ29kZVdvcmRzKCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgbnVtQmxvY2tDb2Rld29yZHMgPSBlY0Jsb2Nrcy0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpICsgbnVtRGF0YUNvZGV3b3JkczsNCisgICAgICAgICAgICBDRlhfQnl0ZUFycmF5ICpieXRlYXJyYXkgPSBGWF9ORVcgQ0ZYX0J5dGVBcnJheSgpOw0KKyAgICAgICAgICAgIGJ5dGVhcnJheS0+U2V0U2l6ZShudW1CbG9ja0NvZGV3b3Jkcyk7DQorICAgICAgICAgICAgKCpyZXN1bHQpW251bVJlc3VsdEJsb2NrcysrXSA9IEZYX05FVyBDQkNfUVJEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgYnl0ZWFycmF5KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgPSAoKENCQ19RUkRhdGFCbG9jayopKCpyZXN1bHQpWzBdKS0+bV9jb2Rld29yZHMtPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgbG9uZ2VyQmxvY2tzU3RhcnRBdCA9IHJlc3VsdC0+R2V0U2l6ZSgpIC0gMTsNCisgICAgd2hpbGUobG9uZ2VyQmxvY2tzU3RhcnRBdCA+PSAwKSB7DQorICAgICAgICBGWF9JTlQzMiBudW1Db2Rld29yZHMgPSAoKENCQ19RUkRhdGFCbG9jayopKCpyZXN1bHQpW2xvbmdlckJsb2Nrc1N0YXJ0QXRdKS0+bV9jb2Rld29yZHMtPkdldFNpemUoKTsNCisgICAgICAgIGlmKG51bUNvZGV3b3JkcyA9PSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGxvbmdlckJsb2Nrc1N0YXJ0QXQtLTsNCisgICAgfQ0KKyAgICBsb25nZXJCbG9ja3NTdGFydEF0Kys7DQorICAgIEZYX0lOVDMyIHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzID0gc2hvcnRlckJsb2Nrc1RvdGFsQ29kZXdvcmRzIC0gZWNCbG9ja3MtPkdldEVDQ29kZVdvcmRzUGVyQmxvY2soKTsNCisgICAgRlhfSU5UMzIgcmF3Q29kZXdvcmRzT2Zmc2V0ID0gMDsNCisgICAgRlhfSU5UMzIgeCA9IDA7DQorICAgIGZvcihGWF9JTlQzMiBrID0gMDsgayA8IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzOyBrKyspIHsNCisgICAgICAgIGZvcih4ID0gMDsgeCA8IG51bVJlc3VsdEJsb2NrczsgeCsrKSB7DQorICAgICAgICAgICAgKCooKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVt4XSktPm1fY29kZXdvcmRzKSlba10gPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZvcih4ID0gbG9uZ2VyQmxvY2tzU3RhcnRBdDsgeCA8IG51bVJlc3VsdEJsb2NrczsgeCsrKSB7DQorICAgICAgICAoKigoKENCQ19RUkRhdGFCbG9jayopKCpyZXN1bHQpW3hdKS0+bV9jb2Rld29yZHMpKVtzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3Jkc10gPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG1heCA9ICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbMF0pLT5tX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgICBmb3IoaSA9IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzOyBpIDwgbWF4OyBpKyspIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiB5ID0gMDsgeSA8IG51bVJlc3VsdEJsb2NrczsgeSsrKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU9mZnNldCA9IHkgPCBsb25nZXJCbG9ja3NTdGFydEF0ID8gaSA6IGkgKyAxOw0KKyAgICAgICAgICAgICgqKCgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbeV0pLT5tX2NvZGV3b3JkcykpW2lPZmZzZXRdID0gKCpyYXdDb2Rld29yZHMpW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGF0YU1hc2suY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGF0YU1hc2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDgwN2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJEYXRhTWFzay5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkRhdGFNYXNrLmgiDQorc3RhdGljIEZYX0lOVDMyIE5fREFUQV9NQVNLUyA9IDA7DQorQ0ZYX1B0ckFycmF5KiBDQkNfUVJEYXRhTWFzazo6REFUQV9NQVNLUyA9IE5VTEw7DQordm9pZCBDQkNfUVJEYXRhTWFzazo6SW5pdGlhbGl6ZSgpDQorew0KKyAgICBEQVRBX01BU0tTID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KKyAgICBOX0RBVEFfTUFTS1MgPSBCdWlsZERhdGFNYXNrcygpOw0KK30NCit2b2lkIENCQ19RUkRhdGFNYXNrOjpGaW5hbGl6ZSgpDQorew0KKyAgICBEZXN0cm95KCk7DQorICAgIGRlbGV0ZSBEQVRBX01BU0tTOw0KK30NCit2b2lkIENCQ19RUkRhdGFNYXNrOjpEZXN0cm95KCkNCit7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIGZvcihpID0gMDsgaSA8IE5fREFUQV9NQVNLUzsgaSsrKSB7DQorICAgICAgICBDQkNfUVJEYXRhTWFzayogcCA9IChDQkNfUVJEYXRhTWFzayopKCpEQVRBX01BU0tTKVtpXTsNCisgICAgICAgIGlmIChwKSB7DQorICAgICAgICAgICAgZGVsZXRlIHA7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJEYXRhTWFzazo6VW5tYXNrQml0TWF0aXJ4KENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIEZYX0lOVDMyIGRpbWVuc2lvbikNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGRpbWVuc2lvbjsgaSsrKSB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykgew0KKyAgICAgICAgICAgIGlmKElzTWFza2VkKGksIGopKSB7DQorICAgICAgICAgICAgICAgIGJpdHMtPkZsaXAoaiwgaSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NCQ19RUkRhdGFNYXNrKiBDQkNfUVJEYXRhTWFzazo6Rm9yUmVmZXJlbmNlKEZYX0lOVDMyIHJlZmVyZW5jZSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihyZWZlcmVuY2UgPCAwIHx8IHJlZmVyZW5jZSA+IDcpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlZmVyZW5jZU11c3RCZUJldHdlZW4wQW5kNzsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKENCQ19RUkRhdGFNYXNrKikoKkRBVEFfTUFTS1MpW3JlZmVyZW5jZV07DQorfQ0KK2NsYXNzIERhdGFNYXNrMDAwIDogcHVibGljIENCQ19RUkRhdGFNYXNrDQorew0KK3B1YmxpYzoNCisgICAgRlhfQk9PTCBJc01hc2tlZChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKCh4ICsgeSkgJSAyKSA9PSAwOw0KKyAgICB9DQorfTsNCitjbGFzcyBEYXRhTWFzazAwMSA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzaw0KK3sNCitwdWJsaWM6DQorICAgIEZYX0JPT0wgSXNNYXNrZWQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICh4ICUgMikgPT0gMDsNCisgICAgfQ0KK307DQorY2xhc3MgRGF0YU1hc2swMTAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCit7DQorcHVibGljOg0KKyAgICBGWF9CT09MIElzTWFza2VkKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpDQorICAgIHsNCisgICAgICAgIHJldHVybiB5ICUgMyA9PSAwOw0KKyAgICB9DQorfTsNCitjbGFzcyBEYXRhTWFzazAxMSA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzaw0KK3sNCitwdWJsaWM6DQorICAgIEZYX0JPT0wgSXNNYXNrZWQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICh4ICsgeSkgJSAzID09IDA7DQorICAgIH0NCit9Ow0KK2NsYXNzIERhdGFNYXNrMTAwIDogcHVibGljIENCQ19RUkRhdGFNYXNrDQorew0KK3B1YmxpYzoNCisgICAgRlhfQk9PTCBJc01hc2tlZChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKCgoeCA+PiAxKSArICh5IC8gMykpICUgMikgPT0gMDsNCisgICAgfQ0KK307DQorY2xhc3MgRGF0YU1hc2sxMDEgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCit7DQorcHVibGljOg0KKyAgICBGWF9CT09MIElzTWFza2VkKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpDQorICAgIHsNCisgICAgICAgIHNpemVfdCB0ZW1wID0geCAqIHk7DQorICAgICAgICByZXR1cm4gKHRlbXAgJSAyKSArICh0ZW1wICUgMykgPT0gMDsNCisgICAgfQ0KK307DQorY2xhc3MgRGF0YU1hc2sxMTAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCit7DQorcHVibGljOg0KKyAgICBGWF9CT09MIElzTWFza2VkKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpDQorICAgIHsNCisgICAgICAgIHNpemVfdCB0ZW1wID0geCAqIHk7DQorICAgICAgICByZXR1cm4gKCgodGVtcCAlIDIpICsgKHRlbXAgJSAzKSkgJSAyKSA9PSAwOw0KKyAgICB9DQorfTsNCitjbGFzcyBEYXRhTWFzazExMSA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzaw0KK3sNCitwdWJsaWM6DQorICAgIEZYX0JPT0wgSXNNYXNrZWQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICgoKCh4ICsgeSkgJSAyKSArICgoeCAqIHkpICUgMykpICUgMikgPT0gMDsNCisgICAgfQ0KK307DQorRlhfSU5UMzIgQ0JDX1FSRGF0YU1hc2s6OkJ1aWxkRGF0YU1hc2tzKCkNCit7DQorICAgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2swMDApOw0KKyAgICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMDAxKTsNCisgICAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazAxMCk7DQorICAgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2swMTEpOw0KKyAgICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMTAwKTsNCisgICAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazEwMSk7DQorICAgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2sxMTApOw0KKyAgICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMTExKTsNCisgICAgcmV0dXJuIERBVEFfTUFTS1MtPkdldFNpemUoKTsNCit9DQorQ0JDX1FSRGF0YU1hc2s6OkNCQ19RUkRhdGFNYXNrKCkNCit7DQorfQ0KK0NCQ19RUkRhdGFNYXNrOjp+Q0JDX1FSRGF0YU1hc2soKQ0KK3sNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFjZmIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAKQEAgLTAsMCArMSwyMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyTW9kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdFNvdXJjZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkVDSS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KK0ZYX0xQQ1NUUiBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpVVEZfOCA9ICJ1dGY4IjsNCitjb25zdCBGWF9DSEFSIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkFMUEhBTlVNRVJJQ19DSEFSU1s0NV0gPSB7DQorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsDQorICAgICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsDQorICAgICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsDQorICAgICcgJywgJyQnLCAnJScsICcqJywgJysnLCAnLScsICcuJywgJy8nLCAnOicNCit9Ow0KK0NCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKQ0KK3sNCit9DQorQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6fkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKQ0KK3sNCit9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZShDRlhfQnl0ZUFycmF5ICpieXRlcywgQ0JDX1FSQ29kZXJWZXJzaW9uICp2ZXJzaW9uLA0KKyAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgRlhfSU5UMzIgYnl0ZU1vZGVEZWNvZGUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSBiaXRzKGJ5dGVzKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgICBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKiBjdXJyZW50Q2hhcmFjdGVyU2V0RUNJID0gTlVMTDsNCisgICAgRlhfQk9PTCBmYzFJbmZhY3QgPSBGQUxTRTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgYnl0ZVNlZ21lbnRzOw0KKyAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUgPSBOVUxMOw0KKyAgICBkbyB7DQorICAgICAgICBpZihiaXRzLkF2YWlsYWJsZSgpIDwgNCkgew0KKyAgICAgICAgICAgIG1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpVGVtcDEgPSBiaXRzLlJlYWRCaXRzKDQsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpGb3JCaXRzKGlUZW1wMSwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgIGlmKG1vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRNb2RlOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoIShtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1IpKSB7DQorICAgICAgICAgICAgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OIHx8IG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9TRUNPTkRfUE9TSVRJT04pIHsNCisgICAgICAgICAgICAgICAgZmMxSW5mYWN0ID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNTVFJVQ1RVUkVEX0FQUEVORCkgew0KKyAgICAgICAgICAgICAgICBiaXRzLlJlYWRCaXRzKDE2LCBlKTsNCisgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0VDSSkgew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiB2YWx1ZSA9IFBhcnNlRUNJVmFsdWUoJmJpdHMsIGUpOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0kgPSBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRDaGFyYWN0ZXJTZXRFQ0lCeVZhbHVlKHZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICAgICAgICAgICAgICAgICAgYml0cy5SZWFkQml0cyg0LCBlKTsNCisgICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBudW1CaXRzID0gbW9kZS0+R2V0Q2hhcmFjdGVyQ291bnRCaXRzKHZlcnNpb24sIGUpOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGNvdW50ID0gYml0cy5SZWFkQml0cyhudW1CaXRzLCBlKTsNCisgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsNCisgICAgICAgICAgICAgICAgICAgIERlY29kZU51bWVyaWNTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBlKTsNCisgICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSB7DQorICAgICAgICAgICAgICAgICAgICBEZWNvZGVBbHBoYW51bWVyaWNTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBmYzFJbmZhY3QsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7DQorICAgICAgICAgICAgICAgICAgICBEZWNvZGVCeXRlU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgY3VycmVudENoYXJhY3RlclNldEVDSSwgJmJ5dGVTZWdtZW50cywgYnl0ZU1vZGVEZWNvZGUsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspIHsNCisgICAgICAgICAgICAgICAgICAgIERlY29kZUdCS1NlZ21lbnQoJmJpdHMsIHJlc3VsdCwgY291bnQsIGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSSkgew0KKyAgICAgICAgICAgICAgICAgICAgRGVjb2RlS2FuamlTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBlKTsNCisgICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGU7DQorICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKCEobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SKSk7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0ICp0ZW1wQ2QgPSBGWF9ORVcgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgICAgdGVtcENkLT5Jbml0KCpieXRlcywgcmVzdWx0LCBieXRlU2VnbWVudHMsIGVjTGV2ZWwsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiB0ZW1wQ2Q7DQorfQ0KK3ZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlR0JLU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiBjb3VudCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBidWZmZXI7DQorICAgIEZYX0lOVDMyIG9mZnNldCA9IDA7DQorICAgIHdoaWxlIChjb3VudCA+IDApIHsNCisgICAgICAgIEZYX0lOVDMyIHR3b0J5dGVzID0gYml0cy0+UmVhZEJpdHMoMTMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBGWF9JTlQzMiBhc3NlbWJsZWRUd29CeXRlcyA9ICgodHdvQnl0ZXMgLyAweDA2MCkgPDwgOCkgfCAodHdvQnl0ZXMgJSAweDA2MCk7DQorICAgICAgICBpZiAoYXNzZW1ibGVkVHdvQnl0ZXMgPD0gMHgwMDk1ZCkgew0KKyAgICAgICAgICAgIGFzc2VtYmxlZFR3b0J5dGVzICs9IDB4MGExYTE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGFzc2VtYmxlZFR3b0J5dGVzICs9IDB4MGE2YTE7DQorICAgICAgICB9DQorICAgICAgICBidWZmZXIgKz0gKEZYX0JZVEUpIChhc3NlbWJsZWRUd29CeXRlcyA+PiA4KTsNCisgICAgICAgIGJ1ZmZlciArPSAoRlhfQllURSkgYXNzZW1ibGVkVHdvQnl0ZXM7DQorICAgICAgICBjb3VudC0tOw0KKyAgICB9DQorICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KGJ1ZmZlciwgcmVzdWx0KTsNCit9DQordm9pZCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVLYW5qaVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgY291bnQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOw0KKyAgICB3aGlsZSAoY291bnQgPiAwKSB7DQorICAgICAgICBGWF9JTlQzMiB0d29CeXRlcyA9IGJpdHMtPlJlYWRCaXRzKDEzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgRlhfSU5UMzIgYXNzZW1ibGVkVHdvQnl0ZXMgPSAoKHR3b0J5dGVzIC8gMHgwYzApIDw8IDgpIHwgKHR3b0J5dGVzICUgMHgwYzApOw0KKyAgICAgICAgaWYgKGFzc2VtYmxlZFR3b0J5dGVzIDw9IDB4MDFmMDApIHsNCisgICAgICAgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDA4MTQwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBjMTQwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnVmZmVyICs9IChGWF9CWVRFKSAoYXNzZW1ibGVkVHdvQnl0ZXMgPj4gOCk7DQorICAgICAgICBidWZmZXIgKz0gKEZYX0JZVEUpIGFzc2VtYmxlZFR3b0J5dGVzOw0KKyAgICAgICAgY291bnQtLTsNCisgICAgfQ0KKyAgICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChidWZmZXIsIHJlc3VsdCk7DQorfQ0KK3ZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQnl0ZVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgY291bnQsDQorICAgICAgICBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJICpjdXJyZW50Q2hhcmFjdGVyU2V0RUNJLA0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkgKmJ5dGVTZWdtZW50cywgRlhfSU5UMzIgYnl0ZU1vZGVEZWNvZGUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoY291bnQgPCAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGlmKChjb3VudCA8PCAzKSA+IGJpdHMtPkF2YWlsYWJsZSgpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgRlhfQllURSAqcmVhZEJ5dGVzID0gRlhfQWxsb2MoRlhfQllURSwgY291bnQpOw0KKyAgICBGWFNZU19tZW1zZXQzMihyZWFkQnl0ZXMsIDB4MDAsIGNvdW50KTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICAgICAgcmVhZEJ5dGVzW2ldID0gKEZYX0JZVEUpIGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnMocmVhZEJ5dGVzLCBjb3VudCk7DQorICAgIHJlc3VsdCArPSBiczsNCisgICAgRlhfRnJlZShyZWFkQnl0ZXMpOw0KK30NCit2b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUFscGhhbnVtZXJpY1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyIGNvdW50LCBGWF9CT09MIGZhYzFJbkVmZmVjdCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBzdGFydCA9IHJlc3VsdC5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUoY291bnQgPiAxKSB7DQorICAgICAgICBGWF9JTlQzMiBuZXh0VHdvQ2hhcnNCaXRzID0gYml0cy0+UmVhZEJpdHMoMTEsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1tuZXh0VHdvQ2hhcnNCaXRzIC8gNDVdKTsNCisgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW25leHRUd29DaGFyc0JpdHMgJSA0NV0pOw0KKyAgICAgICAgY291bnQgLT0gMjsNCisgICAgfQ0KKyAgICBpZihjb3VudCA9PSAxKSB7DQorICAgICAgICBGWF9JTlQzMiBpdGVtcCA9IGJpdHMtPlJlYWRCaXRzKDYsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsICAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbaXRlbXBdKTsNCisgICAgfQ0KKyAgICBpZihmYWMxSW5FZmZlY3QpIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBpID0gc3RhcnQ7IGkgPCByZXN1bHQuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmKHJlc3VsdFtpXSA9PSAnJScpIHsNCisgICAgICAgICAgICAgICAgaWYoKGkgPCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKSAmJiByZXN1bHRbaSArIDFdID09ICclJykgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LkRlbGV0ZShpICsgMSwgMSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuU2V0QXQoaSwgKEZYX0NIQVIpMHgxZCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVOdW1lcmljU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiBjb3VudCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICB3aGlsZShjb3VudCA+PSAzKSB7DQorICAgICAgICBGWF9JTlQzMiB0aHJlZURpZ2l0c0JpdHMgPSBiaXRzLT5SZWFkQml0cygxMCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIGlmKHRocmVlRGlnaXRzQml0cyA+PSAxMDAwKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW3RocmVlRGlnaXRzQml0cyAvIDEwMF0pOw0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbKHRocmVlRGlnaXRzQml0cyAvIDEwKSAlIDEwXSk7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1t0aHJlZURpZ2l0c0JpdHMgJSAxMF0pOw0KKyAgICAgICAgY291bnQgLT0gMzsNCisgICAgfQ0KKyAgICBpZihjb3VudCA9PSAyKSB7DQorICAgICAgICBGWF9JTlQzMiB0d29EaWdpdEJpdHMgPSBiaXRzLT5SZWFkQml0cyg3LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgaWYodHdvRGlnaXRCaXRzID49IDEwMCkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1t0d29EaWdpdEJpdHMgLyAxMF0pOw0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbdHdvRGlnaXRCaXRzICUgMTBdKTsNCisgICAgfSBlbHNlIGlmKGNvdW50ID09IDEpIHsNCisgICAgICAgIEZYX0lOVDMyIGRpZ2l0Qml0cyA9IGJpdHMtPlJlYWRCaXRzKDQsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBpZihkaWdpdEJpdHMgPj0gMTApIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbZGlnaXRCaXRzXSk7DQorICAgIH0NCit9DQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6R3Vlc3NFbmNvZGluZyhDRlhfQnl0ZUFycmF5ICpieXRlcykNCit7DQorICAgIHJldHVybiAqVVRGXzg7DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlBhcnNlRUNJVmFsdWUoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICBpZigoZmlyc3RCeXRlICYgMHg4MCkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIGZpcnN0Qnl0ZSAmIDB4N2Y7DQorICAgIH0gZWxzZSBpZigoZmlyc3RCeXRlICYgMHhjMCkgPT0gMHg4MCkgew0KKyAgICAgICAgRlhfSU5UMzIgc2Vjb25kQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICAgICAgcmV0dXJuICgoZmlyc3RCeXRlICYgMHgzZikgPDwgOCkgfCBzZWNvbmRCeXRlOw0KKyAgICB9IGVsc2UgaWYoKGZpcnN0Qnl0ZSAmIDB4ZTApID09IDB4YzApIHsNCisgICAgICAgIEZYX0lOVDMyIHNlY29uZFRoaXJkQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDE2LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgICAgIHJldHVybiAoKGZpcnN0Qnl0ZSAmIDB4MWYpIDw8IDE2KSB8IHNlY29uZFRoaXJkQnl0ZTsNCisgICAgfQ0KKyAgICBlID0gQkNFeGNlcHRpb25CYWRFQ0k7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkRldGVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkRldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFiYWFlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRGV0ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMjQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkZpbmRlclBhdHRlcm4uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkNvZGVyVmVyc2lvbi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJHcmlkU2FtcGxlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkRldGVjdG9yLmgiDQorQ0JDX1FSRGV0ZWN0b3I6OkNCQ19RUkRldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlKTogbV9pbWFnZShpbWFnZSkNCit7DQorfQ0KK0NCQ19RUkRldGVjdG9yOjp+Q0JDX1FSRGV0ZWN0b3IoKQ0KK3sNCit9DQorQ0JDX1FSRGV0ZWN0b3JSZXN1bHQgKkNCQ19RUkRldGVjdG9yOjpEZXRlY3QoRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlciBmaW5kZXIobV9pbWFnZSk7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBxcGkgPSBmaW5kZXIuRmluZChoaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1FSRmluZGVyUGF0dGVybkluZm8+IGluZm8ocXBpKTsNCisgICAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIHFkciA9IFByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyhpbmZvLmdldCgpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gcWRyOw0KK30NCitDQkNfUVJEZXRlY3RvclJlc3VsdCogQ0JDX1FSRGV0ZWN0b3I6OlByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyhDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyAqaW5mbywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUVJGaW5kZXJQYXR0ZXJuPiB0b3BMZWZ0KGluZm8tPkdldFRvcExlZnQoKSk7DQorICAgIENCQ19BdXRvUHRyPENCQ19RUkZpbmRlclBhdHRlcm4+IHRvcFJpZ2h0KGluZm8tPkdldFRvcFJpZ2h0KCkpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUVJGaW5kZXJQYXR0ZXJuPiBib3R0b21MZWZ0KGluZm8tPkdldEJvdHRvbUxlZnQoKSk7DQorICAgIEZYX0ZMT0FUIG1vZHVsZVNpemUgPSBDYWxjdWxhdGVNb2R1bGVTaXplKHRvcExlZnQuZ2V0KCksIHRvcFJpZ2h0LmdldCgpLCBib3R0b21MZWZ0LmdldCgpKTsNCisgICAgaWYobW9kdWxlU2l6ZSA8IDEuMGYpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZGltZW5zaW9uID0gQ29tcHV0ZURpbWVuc2lvbih0b3BMZWZ0LmdldCgpLCB0b3BSaWdodC5nZXQoKSwgYm90dG9tTGVmdC5nZXQoKSwgbW9kdWxlU2l6ZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uICpwcm92aXNpb25hbFZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFByb3Zpc2lvbmFsVmVyc2lvbkZvckRpbWVuc2lvbihkaW1lbnNpb24sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0lOVDMyIG1vZHVsZXNCZXR3ZWVuRlBDZW50ZXJzID0gcHJvdmlzaW9uYWxWZXJzaW9uLT5HZXREaW1lbnNpb25Gb3JWZXJzaW9uKCkgLSA3Ow0KKyAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICogYWxpZ25tZW50UGF0dGVybiA9IE5VTEw7DQorICAgIGlmKHByb3Zpc2lvbmFsVmVyc2lvbi0+R2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKS0+R2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgRlhfRkxPQVQgIGJvdHRvbVJpZ2h0WCA9IHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkgKyBib3R0b21MZWZ0LT5HZXRYKCk7DQorICAgICAgICBGWF9GTE9BVCBib3R0b21SaWdodFkgPSB0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpICsgYm90dG9tTGVmdC0+R2V0WSgpOw0KKyAgICAgICAgRlhfRkxPQVQgY29ycmVjdGlvblRvVG9wTGVmdCA9IDEuMGYgLSAzLjBmIC8gKEZYX0ZMT0FUKSBtb2R1bGVzQmV0d2VlbkZQQ2VudGVyczsNCisgICAgICAgIEZYX0ZMT0FUIHh0ZW1wID0gKHRvcExlZnQtPkdldFgoKSArIGNvcnJlY3Rpb25Ub1RvcExlZnQgKiAoYm90dG9tUmlnaHRYIC0gdG9wTGVmdC0+R2V0WCgpKSk7DQorICAgICAgICBGWF9JTlQzMiBlc3RBbGlnbm1lbnRYID0gKEZYX0lOVDMyKXh0ZW1wIDsNCisgICAgICAgIEZYX0ZMT0FUIHl0ZW1wID0gICh0b3BMZWZ0LT5HZXRZKCkgKyBjb3JyZWN0aW9uVG9Ub3BMZWZ0ICogKGJvdHRvbVJpZ2h0WSAtIHRvcExlZnQtPkdldFkoKSkpOw0KKyAgICAgICAgRlhfSU5UMzIgZXN0QWxpZ25tZW50WSA9IChGWF9JTlQzMil5dGVtcDsNCisgICAgICAgIGZvcihGWF9JTlQzMiBpID0gNDsgaSA8PSAxNjsgaSA8PD0gMSkgew0KKyAgICAgICAgICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4gKnRlbXAgPSBGaW5kQWxpZ25tZW50SW5SZWdpb24obW9kdWxlU2l6ZSwgZXN0QWxpZ25tZW50WCwgZXN0QWxpZ25tZW50WSwgKEZYX0ZMT0FUKSBpLCBlKTsNCisgICAgICAgICAgICBhbGlnbm1lbnRQYXR0ZXJuID0gdGVtcDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRzID0gU2FtcGxlR3JpZChtX2ltYWdlLCB0b3BMZWZ0LmdldCgpLCB0b3BSaWdodC5nZXQoKSwgYm90dG9tTGVmdC5nZXQoKSwgKENCQ19SZXN1bHRQb2ludCopKGFsaWdubWVudFBhdHRlcm4pLCBkaW1lbnNpb24sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENGWF9QdHJBcnJheSAqcG9pbnRzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgICAgaWYoYWxpZ25tZW50UGF0dGVybiA9PSBOVUxMKSB7DQorICAgICAgICBwb2ludHMtPkFkZChib3R0b21MZWZ0LnJlbGVhc2UoKSk7DQorICAgICAgICBwb2ludHMtPkFkZCh0b3BMZWZ0LnJlbGVhc2UoKSk7DQorICAgICAgICBwb2ludHMtPkFkZCh0b3BSaWdodC5yZWxlYXNlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcG9pbnRzLT5BZGQoYm90dG9tTGVmdC5yZWxlYXNlKCkpOw0KKyAgICAgICAgcG9pbnRzLT5BZGQodG9wTGVmdC5yZWxlYXNlKCkpOw0KKyAgICAgICAgcG9pbnRzLT5BZGQodG9wUmlnaHQucmVsZWFzZSgpKTsNCisgICAgICAgIHBvaW50cy0+QWRkKGFsaWdubWVudFBhdHRlcm4pOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9ORVcgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQoYml0cywgcG9pbnRzKTsNCit9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCAqQ0JDX1FSRGV0ZWN0b3I6OlNhbXBsZUdyaWQoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwNCisgICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBhbGlnbm1lbnRQYXR0ZXJuLA0KKyAgICAgICAgRlhfSU5UMzIgZGltZW5zaW9uLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0ZMT0FUIGRpbU1pbnVzVGhyZWUgPSAoRlhfRkxPQVQpIGRpbWVuc2lvbiAtIDMuNWY7DQorICAgIEZYX0ZMT0FUIGJvdHRvbVJpZ2h0WDsNCisgICAgRlhfRkxPQVQgYm90dG9tUmlnaHRZOw0KKyAgICBGWF9GTE9BVCBzb3VyY2VCb3R0b21SaWdodFg7DQorICAgIEZYX0ZMT0FUIHNvdXJjZUJvdHRvbVJpZ2h0WTsNCisgICAgaWYgKGFsaWdubWVudFBhdHRlcm4gIT0gTlVMTCkgew0KKyAgICAgICAgYm90dG9tUmlnaHRYID0gYWxpZ25tZW50UGF0dGVybi0+R2V0WCgpOw0KKyAgICAgICAgYm90dG9tUmlnaHRZID0gYWxpZ25tZW50UGF0dGVybi0+R2V0WSgpOw0KKyAgICAgICAgc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZSAtIDMuMGY7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBib3R0b21SaWdodFggPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgKyBib3R0b21MZWZ0LT5HZXRYKCk7DQorICAgICAgICBib3R0b21SaWdodFkgPSAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgKyBib3R0b21MZWZ0LT5HZXRZKCk7DQorICAgICAgICBzb3VyY2VCb3R0b21SaWdodFggPSBzb3VyY2VCb3R0b21SaWdodFkgPSBkaW1NaW51c1RocmVlOw0KKyAgICB9DQorICAgIENCQ19RUkdyaWRTYW1wbGVyICZzYW1wbGVyID0gQ0JDX1FSR3JpZFNhbXBsZXI6OkdldEluc3RhbmNlKCk7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGNibSA9IHNhbXBsZXIuU2FtcGxlR3JpZChpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uLCBkaW1lbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbU1pbnVzVGhyZWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUJvdHRvbVJpZ2h0WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQm90dG9tUmlnaHRZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1NaW51c1RocmVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0LT5HZXRYKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQtPkdldFkoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQtPkdldFgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQtPkdldFkoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodFksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQtPkdldFgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdC0+R2V0WSgpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gY2JtOw0KK30NCitGWF9JTlQzMiBDQkNfUVJEZXRlY3Rvcjo6Q29tcHV0ZURpbWVuc2lvbihDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQorICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsIEZYX0ZMT0FUIG1vZHVsZVNpemUsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgdGx0ckNlbnRlcnNEaW1lbnNpb24gPSBSb3VuZChDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpEaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCkgLyBtb2R1bGVTaXplKTsNCisgICAgRlhfSU5UMzIgdGxibENlbnRlcnNEaW1lbnNpb24gPSBSb3VuZChDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpEaXN0YW5jZSh0b3BMZWZ0LCBib3R0b21MZWZ0KSAvIG1vZHVsZVNpemUpOw0KKyAgICBGWF9JTlQzMiBkaW1lbnNpb24gPSAoKHRsdHJDZW50ZXJzRGltZW5zaW9uICsgdGxibENlbnRlcnNEaW1lbnNpb24pID4+IDEpICsgNzsNCisgICAgc3dpdGNoKGRpbWVuc2lvbiAmIDB4MDMpIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICBkaW1lbnNpb24rKzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBkaW1lbnNpb24tLTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzogew0KKyAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBkaW1lbnNpb247DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkRldGVjdG9yOjpDYWxjdWxhdGVNb2R1bGVTaXplKENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0KQ0KK3sNCisgICAgcmV0dXJuIChDYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KHRvcExlZnQsIHRvcFJpZ2h0KSArIENhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgYm90dG9tTGVmdCkpIC8gMi4wZjsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRGV0ZWN0b3I6OkNhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkoQ0JDX1Jlc3VsdFBvaW50ICpwYXR0ZXJuLCBDQkNfUmVzdWx0UG9pbnQgKm90aGVyUGF0dGVybikNCit7DQorICAgIEZYX0ZMT0FUIG1vZHVsZVNpemVFc3QxID0gU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuQm90aFdheXMoKEZYX0lOVDMyKSBwYXR0ZXJuLT5HZXRYKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSBwYXR0ZXJuLT5HZXRZKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSBvdGhlclBhdHRlcm4tPkdldFgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfSU5UMzIpIG90aGVyUGF0dGVybi0+R2V0WSgpKTsNCisgICAgRlhfRkxPQVQgbW9kdWxlU2l6ZUVzdDIgPSBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cygoRlhfSU5UMzIpIG90aGVyUGF0dGVybi0+R2V0WCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9JTlQzMikgb3RoZXJQYXR0ZXJuLT5HZXRZKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSBwYXR0ZXJuLT5HZXRYKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSBwYXR0ZXJuLT5HZXRZKCkpOw0KKyAgICBpZiAoRlhTWVNfaXNuYW4obW9kdWxlU2l6ZUVzdDEpKSB7DQorICAgICAgICByZXR1cm4gbW9kdWxlU2l6ZUVzdDI7DQorICAgIH0NCisgICAgaWYgKEZYU1lTX2lzbmFuKG1vZHVsZVNpemVFc3QyKSkgew0KKyAgICAgICAgcmV0dXJuIG1vZHVsZVNpemVFc3QxOw0KKyAgICB9DQorICAgIHJldHVybiAobW9kdWxlU2l6ZUVzdDEgKyBtb2R1bGVTaXplRXN0MikgLyAxNC4wZjsNCit9DQorRlhfSU5UMzIgQ0JDX1FSRGV0ZWN0b3I6OlJvdW5kKEZYX0ZMT0FUIGQpDQorew0KKyAgICByZXR1cm4gKEZYX0lOVDMyKShkICsgMC41Zik7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkRldGVjdG9yOjpTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cyhGWF9JTlQzMiBmcm9tWCwgRlhfSU5UMzIgZnJvbVksIEZYX0lOVDMyIHRvWCwgRlhfSU5UMzIgdG9ZKQ0KK3sNCisgICAgRlhfRkxPQVQgcmVzdWx0ID0gU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuKGZyb21YLCBmcm9tWSwgdG9YLCB0b1kpOw0KKyAgICBGWF9JTlQzMiBvdGhlclRvWCA9IGZyb21YIC0gKHRvWCAtIGZyb21YKTsNCisgICAgaWYgKG90aGVyVG9YIDwgMCkgew0KKyAgICAgICAgb3RoZXJUb1ggPSAtMTsNCisgICAgfSBlbHNlIGlmIChvdGhlclRvWCA+PSBtX2ltYWdlLT5HZXRXaWR0aCgpKSB7DQorICAgICAgICBvdGhlclRvWCA9IG1faW1hZ2UtPkdldFdpZHRoKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgb3RoZXJUb1kgPSBmcm9tWSAtICh0b1kgLSBmcm9tWSk7DQorICAgIGlmIChvdGhlclRvWSA8IDApIHsNCisgICAgICAgIG90aGVyVG9ZID0gLTE7DQorICAgIH0gZWxzZSBpZiAob3RoZXJUb1kgPj0gbV9pbWFnZS0+R2V0SGVpZ2h0KCkpIHsNCisgICAgICAgIG90aGVyVG9ZID0gbV9pbWFnZS0+R2V0SGVpZ2h0KCk7DQorICAgIH0NCisgICAgcmVzdWx0ICs9IFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihmcm9tWCwgZnJvbVksIG90aGVyVG9YLCBvdGhlclRvWSk7DQorICAgIHJldHVybiByZXN1bHQgLSAxLjBmOw0KK30NCitGWF9GTE9BVCBDQkNfUVJEZXRlY3Rvcjo6U2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuKEZYX0lOVDMyIGZyb21YLCBGWF9JTlQzMiBmcm9tWSwgRlhfSU5UMzIgdG9YLCBGWF9JTlQzMiB0b1kpDQorew0KKyAgICBGWF9CT09MIHN0ZWVwID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKSA+IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQorICAgIGlmIChzdGVlcCkgew0KKyAgICAgICAgRlhfSU5UMzIgdGVtcCA9IGZyb21YOw0KKyAgICAgICAgZnJvbVggPSBmcm9tWTsNCisgICAgICAgIGZyb21ZID0gdGVtcDsNCisgICAgICAgIHRlbXAgPSB0b1g7DQorICAgICAgICB0b1ggPSB0b1k7DQorICAgICAgICB0b1kgPSB0ZW1wOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGR4ID0gRlhTWVNfYWJzKHRvWCAtIGZyb21YKTsNCisgICAgRlhfSU5UMzIgZHkgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpOw0KKyAgICBGWF9JTlQzMiBlcnJvciA9IC1keCA+PiAxOw0KKyAgICBGWF9JTlQzMiB5c3RlcCA9IGZyb21ZIDwgdG9ZID8gMSA6IC0xOw0KKyAgICBGWF9JTlQzMiB4c3RlcCA9IGZyb21YIDwgdG9YID8gMSA6IC0xOw0KKyAgICBGWF9JTlQzMiBzdGF0ZSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgeCA9IGZyb21YLCB5ID0gZnJvbVk7IHggIT0gdG9YOyB4ICs9IHhzdGVwKSB7DQorICAgICAgICBGWF9JTlQzMiByZWFsWCA9IHN0ZWVwID8geSA6IHg7DQorICAgICAgICBGWF9JTlQzMiByZWFsWSA9IHN0ZWVwID8geCA6IHk7DQorICAgICAgICBpZiAoc3RhdGUgPT0gMSkgew0KKyAgICAgICAgICAgIGlmIChtX2ltYWdlLT5HZXQocmVhbFgsIHJlYWxZKSkgew0KKyAgICAgICAgICAgICAgICBzdGF0ZSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKCFtX2ltYWdlLT5HZXQocmVhbFgsIHJlYWxZKSkgew0KKyAgICAgICAgICAgICAgICBzdGF0ZSsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChzdGF0ZSA9PSAzKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgZGlmZlggPSB4IC0gZnJvbVg7DQorICAgICAgICAgICAgRlhfSU5UMzIgZGlmZlkgPSB5IC0gZnJvbVk7DQorICAgICAgICAgICAgcmV0dXJuIChGWF9GTE9BVCkgc3FydCgoZG91YmxlKSAoZGlmZlggKiBkaWZmWCArIGRpZmZZICogZGlmZlkpKTsNCisgICAgICAgIH0NCisgICAgICAgIGVycm9yICs9IGR5Ow0KKyAgICAgICAgaWYgKGVycm9yID4gMCkgew0KKyAgICAgICAgICAgIHkgKz0geXN0ZXA7DQorICAgICAgICAgICAgZXJyb3IgLT0gZHg7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgZGlmZlggPSB0b1ggLSBmcm9tWDsNCisgICAgRlhfSU5UMzIgZGlmZlkgPSB0b1kgLSBmcm9tWTsNCisgICAgcmV0dXJuIChGWF9GTE9BVCkgc3FydCgoZG91YmxlKSAoZGlmZlggKiBkaWZmWCArIGRpZmZZICogZGlmZlkpKTsNCit9DQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqQ0JDX1FSRGV0ZWN0b3I6OkZpbmRBbGlnbm1lbnRJblJlZ2lvbihGWF9GTE9BVCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSwgRlhfSU5UMzIgZXN0QWxpZ25tZW50WCwNCisgICAgICAgIEZYX0lOVDMyIGVzdEFsaWdubWVudFksIEZYX0ZMT0FUIGFsbG93YW5jZUZhY3RvciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBhbGxvd2FuY2UgPSAoRlhfSU5UMzIpIChhbGxvd2FuY2VGYWN0b3IgKiBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7DQorICAgIEZYX0lOVDMyIGFsaWdubWVudEFyZWFMZWZ0WCA9IEZYX01BWCgwLCBlc3RBbGlnbm1lbnRYIC0gYWxsb3dhbmNlKTsNCisgICAgRlhfSU5UMzIgYWxpZ25tZW50QXJlYVJpZ2h0WCA9IEZYX01JTihtX2ltYWdlLT5HZXRXaWR0aCgpIC0gMSwgZXN0QWxpZ25tZW50WCArIGFsbG93YW5jZSk7DQorICAgIGlmIChhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYIDwgb3ZlcmFsbEVzdE1vZHVsZVNpemUgKiAzKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGFsaWdubWVudEFyZWFUb3BZID0gRlhfTUFYKDAsIGVzdEFsaWdubWVudFkgLSBhbGxvd2FuY2UpOw0KKyAgICBGWF9JTlQzMiBhbGlnbm1lbnRBcmVhQm90dG9tWSA9IEZYX01JTihtX2ltYWdlLT5HZXRIZWlnaHQoKSAtIDEsIGVzdEFsaWdubWVudFkgKyBhbGxvd2FuY2UpOw0KKyAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyIGFsaWdubWVudEZpbmRlcihtX2ltYWdlLA0KKyAgICAgICAgICAgIGFsaWdubWVudEFyZWFMZWZ0WCwNCisgICAgICAgICAgICBhbGlnbm1lbnRBcmVhVG9wWSwNCisgICAgICAgICAgICBhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYLA0KKyAgICAgICAgICAgIGFsaWdubWVudEFyZWFCb3R0b21ZIC0gYWxpZ25tZW50QXJlYVRvcFksDQorICAgICAgICAgICAgb3ZlcmFsbEVzdE1vZHVsZVNpemUpOw0KKyAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICpxYXAgPSBhbGlnbm1lbnRGaW5kZXIuRmluZChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gcWFwOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3YjAzOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkRldGVjdG9yUmVzdWx0LmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgiDQorQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ6OkNCQ19RUkRldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIENGWF9QdHJBcnJheSAqcG9pbnRzKToNCisgICAgbV9iaXRzKGJpdHMpLCBtX3BvaW50cyhwb2ludHMpDQorew0KK30NCitDQkNfUVJEZXRlY3RvclJlc3VsdDo6fkNCQ19RUkRldGVjdG9yUmVzdWx0KCkNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IG1fcG9pbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfUmVzdWx0UG9pbnQqKSAoKm1fcG9pbnRzKVtpXTsNCisgICAgfQ0KKyAgICBtX3BvaW50cy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BvaW50czsNCisgICAgbV9wb2ludHMgPSBOVUxMOw0KKyAgICBpZihtX2JpdHMgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fYml0czsNCisgICAgfQ0KKyAgICBtX2JpdHMgPSBOVUxMOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJEZXRlY3RvclJlc3VsdDo6R2V0Qml0cygpDQorew0KKyAgICByZXR1cm4gbV9iaXRzOw0KK30NCitDRlhfUHRyQXJyYXkgKkNCQ19RUkRldGVjdG9yUmVzdWx0OjpHZXRQb2ludHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcG9pbnRzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkZpbmRlclBhdHRlcm4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjIyZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkZpbmRlclBhdHRlcm4uaCINCitDQkNfUVJGaW5kZXJQYXR0ZXJuOjpDQkNfUVJGaW5kZXJQYXR0ZXJuKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHBvc1ksIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUpOg0KKyAgICBDQkNfUmVzdWx0UG9pbnQoeCwgcG9zWSksDQorICAgIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZShlc3RpbWF0ZWRNb2R1bGVTaXplKSwgbV9jb3VudCgxKQ0KK3sNCit9DQorQ0JDX1FSRmluZGVyUGF0dGVybjo6fkNCQ19RUkZpbmRlclBhdHRlcm4oKQ0KK3sNCisgICAgbV9jb3VudCA9IDA7DQorICAgIG1feCA9IDAuMGY7DQorICAgIG1feSA9IDAuMGY7DQorICAgIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IDAuMGY7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm4gKkNCQ19RUkZpbmRlclBhdHRlcm46OkNsb25lKCkNCit7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKnRlbXAgPSBGWF9ORVcgQ0JDX1FSRmluZGVyUGF0dGVybihtX3gsIG1feSwgbV9lc3RpbWF0ZWRNb2R1bGVTaXplKTsNCisgICAgdGVtcC0+bV9jb3VudCA9IG1fY291bnQ7DQorICAgIHJldHVybiB0ZW1wOw0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkNCit7DQorICAgIHJldHVybiBtX2VzdGltYXRlZE1vZHVsZVNpemU7DQorfQ0KK0ZYX0lOVDMyIENCQ19RUkZpbmRlclBhdHRlcm46OkdldENvdW50KCkNCit7DQorICAgIHJldHVybiBtX2NvdW50Ow0KK30NCit2b2lkIENCQ19RUkZpbmRlclBhdHRlcm46OkluY3JlbWVudENvdW50KCkNCit7DQorICAgIG1fY291bnQrKzsNCit9DQorRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKQ0KK3sNCisgICAgaWYoKGZhYnMoaSAtIEdldFkoKSkgPD0gbW9kdWxlU2l6ZSkgJiYgKGZhYnMoaiAtIEdldFgoKSkgPD0gbW9kdWxlU2l6ZSkpIHsNCisgICAgICAgIEZYX0ZMT0FUIG1vZHVsZVNpemVEaWZmID0gZmFicyhtb2R1bGVTaXplIC0gbV9lc3RpbWF0ZWRNb2R1bGVTaXplKTsNCisgICAgICAgIHJldHVybiAobW9kdWxlU2l6ZURpZmYgPD0gMS4wZikgfHwgKG1vZHVsZVNpemVEaWZmIC8gbV9lc3RpbWF0ZWRNb2R1bGVTaXplIDw9IDEuMGYpOw0KKyAgICB9DQorICAgIHJldHVybiBmYWxzZTsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybjo6R2V0WCgpDQorew0KKyAgICByZXR1cm4gbV94Ow0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRZKCkNCit7DQorICAgIHJldHVybiBtX3k7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1ZjA1YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuY3BwCkBAIC0wLDAgKzEsNDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1FSRmluZGVyUGF0dGVybi5oIg0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNFTlRFUl9RVU9SVU0gPSAyOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6Ok1JTl9TS0lQID0gMzsNCitjb25zdCBGWF9JTlQzMiBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpNQVhfTU9EVUxFUyA9IDU3Ow0KK2NvbnN0IEZYX0lOVDMyIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OklOVEVHRVJfTUFUSF9TSElGVCA9IDg7DQorQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6Q0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcihDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSkNCit7DQorICAgIG1faW1hZ2UgPSBpbWFnZTsNCisgICAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudC5TZXRTaXplKDUpOw0KKyAgICBtX2hhc1NraXBwZWQgPSBGQUxTRTsNCit9DQorQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6fkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoKQ0KK3sNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQorICAgIH0NCisgICAgbV9wb3NzaWJsZUNlbnRlcnMuUmVtb3ZlQWxsKCk7DQorfQ0KK2NsYXNzIENsb3Nlc3RUb0F2ZXJhZ2VDb21wYXJhdG9yDQorew0KK3ByaXZhdGU6DQorICAgIEZYX0ZMT0FUIG1fYXZlcmFnZU1vZHVsZVNpemU7DQorcHVibGljOg0KKyAgICBDbG9zZXN0VG9BdmVyYWdlQ29tcGFyYXRvcihGWF9GTE9BVCBhdmVyYWdlTW9kdWxlU2l6ZSkgOiBtX2F2ZXJhZ2VNb2R1bGVTaXplKGF2ZXJhZ2VNb2R1bGVTaXplKQ0KKyAgICB7DQorICAgIH0NCisgICAgRlhfSU5UMzIgb3BlcmF0b3IoKShGaW5kZXJQYXR0ZXJuICphLCBGaW5kZXJQYXR0ZXJuICpiKQ0KKyAgICB7DQorICAgICAgICBGWF9GTE9BVCBkQSA9IChGWF9GTE9BVClmYWJzKGEtPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIG1fYXZlcmFnZU1vZHVsZVNpemUpOw0KKyAgICAgICAgRlhfRkxPQVQgZEIgPSAoRlhfRkxPQVQpZmFicyhiLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBtX2F2ZXJhZ2VNb2R1bGVTaXplKTsNCisgICAgICAgIHJldHVybiBkQSA8IGRCID8gLTEgOiBkQSA+IGRCID8gMSA6IDA7DQorICAgIH0NCit9Ow0KK2NsYXNzIENlbnRlckNvbXBhcmF0b3INCit7DQorcHVibGljOg0KKyAgICBGWF9JTlQzMiBvcGVyYXRvcigpKEZpbmRlclBhdHRlcm4gKmEsIEZpbmRlclBhdHRlcm4gKmIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBiLT5HZXRDb3VudCgpIC0gYS0+R2V0Q291bnQoKTsNCisgICAgfQ0KK307DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCAqQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6R2V0SW1hZ2UoKQ0KK3sNCisgICAgcmV0dXJuIG1faW1hZ2U7DQorfQ0KK0NGWF9JbnQzMkFycmF5ICZDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpHZXRDcm9zc0NoZWNrU3RhdGVDb3VudCgpDQorew0KKyAgICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzBdID0gMDsNCisgICAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFsxXSA9IDA7DQorICAgIG1fY3Jvc3NDaGVja1N0YXRlQ291bnRbMl0gPSAwOw0KKyAgICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzNdID0gMDsNCisgICAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFs0XSA9IDA7DQorICAgIHJldHVybiBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KK30NCitDRlhfUHRyQXJyYXkgKkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkdldFBvc3NpYmxlQ2VudGVycygpDQorew0KKyAgICByZXR1cm4gJm1fcG9zc2libGVDZW50ZXJzOw0KK30NCitDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyogQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6RmluZChGWF9JTlQzMiBoaW50LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIG1heEkgPSBtX2ltYWdlLT5HZXRIZWlnaHQoKTsNCisgICAgRlhfSU5UMzIgbWF4SiA9IG1faW1hZ2UtPkdldFdpZHRoKCk7DQorICAgIEZYX0lOVDMyIGlTa2lwID0gKDMgKiBtYXhJKSAvICg0ICogTUFYX01PRFVMRVMpOw0KKyAgICBpZihpU2tpcCA8IE1JTl9TS0lQIHx8IDApIHsNCisgICAgICAgIGlTa2lwID0gTUlOX1NLSVA7DQorICAgIH0NCisgICAgRlhfQk9PTCBkb25lID0gRkFMU0U7DQorICAgIENGWF9JbnQzMkFycmF5IHN0YXRlQ291bnQ7DQorICAgIHN0YXRlQ291bnQuU2V0U2l6ZSg1KTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSBpU2tpcCAtIDE7IGkgPCBtYXhJICYmICFkb25lOyBpICs9IGlTa2lwKSB7DQorICAgICAgICBzdGF0ZUNvdW50WzBdID0gMDsNCisgICAgICAgIHN0YXRlQ291bnRbMV0gPSAwOw0KKyAgICAgICAgc3RhdGVDb3VudFsyXSA9IDA7DQorICAgICAgICBzdGF0ZUNvdW50WzNdID0gMDsNCisgICAgICAgIHN0YXRlQ291bnRbNF0gPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgY3VycmVudFN0YXRlID0gMDsNCisgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IG1heEo7IGorKykgew0KKyAgICAgICAgICAgIGlmKG1faW1hZ2UtPkdldChqLCBpKSkgew0KKyAgICAgICAgICAgICAgICBpZigoY3VycmVudFN0YXRlICYgMSkgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYoKGN1cnJlbnRTdGF0ZSAmIDEpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRTdGF0ZSA9PSA0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlybWVkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU2tpcCA9IDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtX2hhc1NraXBwZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gSGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiByb3dTa2lwID0gRmluZFJvd1NraXAoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyb3dTa2lwID4gc3RhdGVDb3VudFsyXSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHJvd1NraXAgLSBzdGF0ZUNvdW50WzJdIC0gaVNraXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBtYXhKIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaiA8IG1heEogJiYgIW1faW1hZ2UtPkdldChqLCBpKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFswXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzJdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFszXSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbNF0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gc3RhdGVDb3VudFszXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IHN0YXRlQ291bnRbNF07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzRdID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gMzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbKytjdXJyZW50U3RhdGVdKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKSB7DQorICAgICAgICAgICAgRlhfQk9PTCBjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKKTsNCisgICAgICAgICAgICBpZihjb25maXJtZWQpIHsNCisgICAgICAgICAgICAgICAgaVNraXAgPSBzdGF0ZUNvdW50WzBdOw0KKyAgICAgICAgICAgICAgICBpZihtX2hhc1NraXBwZWQpIHsNCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBIYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5KiBwdHIgPSBTZWxlY3RCZXN0cGF0dGVybnMoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX1B0ckFycmF5ID4gcGF0dGVybkluZm8ocHRyKTsNCisgICAgT3JkZXJCZXN0UGF0dGVybnMocGF0dGVybkluZm8uZ2V0KCkpOw0KKyAgICByZXR1cm4gbmV3IENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKHBhdHRlcm5JbmZvLmdldCgpKTsNCit9DQordm9pZCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkgKnBhdHRlcm5zKQ0KK3sNCisgICAgRlhfRkxPQVQgYWJEaXN0YW5jZSA9IERpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdLCAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSk7DQorICAgIEZYX0ZMT0FUIGJjRGlzdGFuY2UgPSBEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSwgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KKyAgICBGWF9GTE9BVCBhY0Rpc3RhbmNlID0gRGlzdGFuY2UoKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF0sIChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzJdKTsNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqdG9wTGVmdCwgKnRvcFJpZ2h0LCAqYm90dG9tTGVmdDsNCisgICAgaWYgKGJjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSAmJiBiY0Rpc3RhbmNlID49IGFjRGlzdGFuY2UpIHsNCisgICAgICAgIHRvcExlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiAqKSgqcGF0dGVybnMpWzBdOw0KKyAgICAgICAgdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiAqKSgqcGF0dGVybnMpWzFdOw0KKyAgICAgICAgYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMl07DQorICAgIH0gZWxzZSBpZiAoYWNEaXN0YW5jZSA+PSBiY0Rpc3RhbmNlICYmIGFjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSkgew0KKyAgICAgICAgdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMV07DQorICAgICAgICB0b3BSaWdodCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMF07DQorICAgICAgICBib3R0b21MZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4gKikoKnBhdHRlcm5zKVsyXTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHRvcExlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiAqKSgqcGF0dGVybnMpWzJdOw0KKyAgICAgICAgdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiAqKSgqcGF0dGVybnMpWzBdOw0KKyAgICAgICAgYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMV07DQorICAgIH0NCisgICAgaWYgKChib3R0b21MZWZ0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpICogKHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkpIDwgKGJvdHRvbUxlZnQtPkdldFgoKQ0KKyAgICAgICAgICAgIC0gdG9wTGVmdC0+R2V0WCgpKSAqICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSkgew0KKyAgICAgICAgQ0JDX1FSRmluZGVyUGF0dGVybiogdGVtcCA9IHRvcFJpZ2h0Ow0KKyAgICAgICAgdG9wUmlnaHQgPSBib3R0b21MZWZ0Ow0KKyAgICAgICAgYm90dG9tTGVmdCA9IHRlbXA7DQorICAgIH0NCisgICAgKCpwYXR0ZXJucylbMF0gPSBib3R0b21MZWZ0Ow0KKyAgICAoKnBhdHRlcm5zKVsxXSA9IHRvcExlZnQ7DQorICAgICgqcGF0dGVybnMpWzJdID0gdG9wUmlnaHQ7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkRpc3RhbmNlKENCQ19SZXN1bHRQb2ludCogcG9pbnQxLCBDQkNfUmVzdWx0UG9pbnQqIHBvaW50MikNCit7DQorICAgIEZYX0ZMT0FUIGR4ID0gcG9pbnQxLT5HZXRYKCkgLSBwb2ludDItPkdldFgoKTsNCisgICAgRlhfRkxPQVQgZHkgPSBwb2ludDEtPkdldFkoKSAtIHBvaW50Mi0+R2V0WSgpOw0KKyAgICByZXR1cm4gKEZYX0ZMT0FUKUZYU1lTX3NxcnQoZHggKiBkeCArIGR5ICogZHkpOw0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpDZW50ZXJGcm9tRW5kKGNvbnN0IENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50LCBGWF9JTlQzMiBlbmQpDQorew0KKyAgICByZXR1cm4gKEZYX0ZMT0FUKShlbmQgLSBzdGF0ZUNvdW50WzRdIC0gc3RhdGVDb3VudFszXSkgLSBzdGF0ZUNvdW50WzJdIC8gMi4wZjsNCit9DQorRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpGb3VuZFBhdHRlcm5Dcm9zcyhjb25zdCBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCkNCit7DQorICAgIEZYX0lOVDMyIHRvdGFsTW9kdWxlU2l6ZSA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCA1OyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGNvdW50ID0gc3RhdGVDb3VudFtpXTsNCisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdG90YWxNb2R1bGVTaXplICs9IGNvdW50Ow0KKyAgICB9DQorICAgIGlmICh0b3RhbE1vZHVsZVNpemUgPCA3KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbW9kdWxlU2l6ZSA9ICh0b3RhbE1vZHVsZVNpemUgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIDc7DQorICAgIEZYX0lOVDMyIG1heFZhcmlhbmNlID0gbW9kdWxlU2l6ZSAvIDI7DQorICAgIHJldHVybiBGWFNZU19hYnMobW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzBdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwgbWF4VmFyaWFuY2UgJiYNCisgICAgICAgICAgIEZYU1lTX2Ficyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMV0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJg0KKyAgICAgICAgICAgRlhTWVNfYWJzKDMgKiBtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMl0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCAzICogbWF4VmFyaWFuY2UgJiYNCisgICAgICAgICAgIEZYU1lTX2Ficyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbM10gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJg0KKyAgICAgICAgICAgRlhTWVNfYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFs0XSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlOw0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpDcm9zc0NoZWNrVmVydGljYWwoRlhfSU5UMzIgc3RhcnRJLCBGWF9JTlQzMiBjZW50ZXJKLCBGWF9JTlQzMiBtYXhDb3VudCwNCisgICAgICAgIEZYX0lOVDMyIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UgPSBtX2ltYWdlOw0KKyAgICBGWF9JTlQzMiBtYXhJID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgICBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCA9IEdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7DQorICAgIEZYX0lOVDMyIGkgPSBzdGFydEk7DQorICAgIHdoaWxlKGkgPj0gMCAmJiBpbWFnZS0+R2V0KGNlbnRlckosIGkpKSB7DQorICAgICAgICBzdGF0ZUNvdW50WzJdKys7DQorICAgICAgICBpLS07DQorICAgIH0NCisgICAgaWYoaSA8IDApIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICB3aGlsZShpID49IDAgJiYgIWltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KKyAgICAgICAgc3RhdGVDb3VudFsxXSsrOw0KKyAgICAgICAgaS0tOw0KKyAgICB9DQorICAgIGlmKGkgPCAwIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgICB9DQorICAgIHdoaWxlKGkgPj0gMCAmJiBpbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpIHsNCisgICAgICAgIHN0YXRlQ291bnRbMF0rKzsNCisgICAgICAgIGktLTsNCisgICAgfQ0KKyAgICBpZihzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICBpID0gc3RhcnRJICsgMTsNCisgICAgd2hpbGUoaSA8IG1heEkgJiYgaW1hZ2UtPkdldChjZW50ZXJKLCBpKSkgew0KKyAgICAgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICAgICAgaSsrOw0KKyAgICB9DQorICAgIGlmKGkgPT0gbWF4SSkgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgICB9DQorICAgIHdoaWxlIChpIDwgbWF4SSAmJiAhaW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzNdIDwgbWF4Q291bnQpIHsNCisgICAgICAgIHN0YXRlQ291bnRbM10rKzsNCisgICAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBpZiAoaSA9PSBtYXhJIHx8IHN0YXRlQ291bnRbM10gPj0gbWF4Q291bnQpIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICB3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpIHsNCisgICAgICAgIHN0YXRlQ291bnRbNF0rKzsNCisgICAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KKyAgICBpZiAoNSAqIEZYU1lTX2FicyhzdGF0ZUNvdW50VG90YWwgLSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgPj0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkgPyBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGkpIDogRlhTWVNfbmFuKCk7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNyb3NzQ2hlY2tIb3Jpem9udGFsKEZYX0lOVDMyIHN0YXJ0SiwgRlhfSU5UMzIgY2VudGVySSwgRlhfSU5UMzIgbWF4Q291bnQsIEZYX0lOVDMyIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKQ0KK3sNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UgPSBtX2ltYWdlOw0KKyAgICBGWF9JTlQzMiBtYXhKID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICAgIENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50ID0gR2V0Q3Jvc3NDaGVja1N0YXRlQ291bnQoKTsNCisgICAgRlhfSU5UMzIgaiA9IHN0YXJ0SjsNCisgICAgd2hpbGUgKGogPj0gMCAmJiBpbWFnZS0+R2V0KGosIGNlbnRlckkpKSB7DQorICAgICAgICBzdGF0ZUNvdW50WzJdKys7DQorICAgICAgICBqLS07DQorICAgIH0NCisgICAgaWYgKGogPCAwKSB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICAgIH0NCisgICAgd2hpbGUgKGogPj0gMCAmJiAhaW1hZ2UtPkdldChqLCBjZW50ZXJJKSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KSB7DQorICAgICAgICBzdGF0ZUNvdW50WzFdKys7DQorICAgICAgICBqLS07DQorICAgIH0NCisgICAgaWYgKGogPCAwIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgICB9DQorICAgIHdoaWxlIChqID49IDAgJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KSB7DQorICAgICAgICBzdGF0ZUNvdW50WzBdKys7DQorICAgICAgICBqLS07DQorICAgIH0NCisgICAgaWYgKHN0YXRlQ291bnRbMF0gPiBtYXhDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgICB9DQorICAgIGogPSBzdGFydEogKyAxOw0KKyAgICB3aGlsZSAoaiA8IG1heEogJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSkgew0KKyAgICAgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICAgICAgaisrOw0KKyAgICB9DQorICAgIGlmIChqID09IG1heEopIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICB3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlLT5HZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFszXSA8IG1heENvdW50KSB7DQorICAgICAgICBzdGF0ZUNvdW50WzNdKys7DQorICAgICAgICBqKys7DQorICAgIH0NCisgICAgaWYgKGogPT0gbWF4SiB8fCBzdGF0ZUNvdW50WzNdID49IG1heENvdW50KSB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICAgIH0NCisgICAgd2hpbGUgKGogPCBtYXhKICYmIGltYWdlLT5HZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFs0XSA8IG1heENvdW50KSB7DQorICAgICAgICBzdGF0ZUNvdW50WzRdKys7DQorICAgICAgICBqKys7DQorICAgIH0NCisgICAgaWYgKHN0YXRlQ291bnRbNF0gPj0gbWF4Q291bnQpIHsNCisgICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gKyBzdGF0ZUNvdW50WzNdICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFs0XTsNCisgICAgaWYgKDUgKiBGWFNZU19hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQorICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBqKSA6IEZYU1lTX25hbigpOw0KK30NCitGWF9CT09MIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkhhbmRsZVBvc3NpYmxlQ2VudGVyKGNvbnN0IENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50LCBGWF9JTlQzMiBpLCBGWF9JTlQzMiBqKQ0KK3sNCisgICAgRlhfSU5UMzIgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdICsgc3RhdGVDb3VudFszXSArIHN0YXRlQ291bnRbNF07DQorICAgIEZYX0ZMT0FUIGNlbnRlckogPSBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOw0KKyAgICBGWF9GTE9BVCBjZW50ZXJJID0gQ3Jvc3NDaGVja1ZlcnRpY2FsKGksIChGWF9JTlQzMikgY2VudGVySiwgc3RhdGVDb3VudFsyXSwgc3RhdGVDb3VudFRvdGFsKTsNCisgICAgaWYoIUZYU1lTX2lzbmFuKGNlbnRlckkpKSB7DQorICAgICAgICBjZW50ZXJKID0gQ3Jvc3NDaGVja0hvcml6b250YWwoKEZYX0lOVDMyKSBjZW50ZXJKLCAoRlhfSU5UMzIpIGNlbnRlckksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7DQorICAgICAgICBpZighRlhTWVNfaXNuYW4oY2VudGVySikpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZWRNb2R1bGVTaXplID0gKEZYX0ZMT0FUKSBzdGF0ZUNvdW50VG90YWwgLyA3LjBmOw0KKyAgICAgICAgICAgIEZYX0JPT0wgZm91bmQgPSBGQUxTRTsNCisgICAgICAgICAgICBGWF9JTlQzMiBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGluZGV4ID0gMDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHsNCisgICAgICAgICAgICAgICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqY2VudGVyID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKShtX3Bvc3NpYmxlQ2VudGVyc1tpbmRleF0pOw0KKyAgICAgICAgICAgICAgICBpZihjZW50ZXItPkFib3V0RXF1YWxzKGVzdGltYXRlZE1vZHVsZVNpemUsIGNlbnRlckksIGNlbnRlckopKSB7DQorICAgICAgICAgICAgICAgICAgICBjZW50ZXItPkluY3JlbWVudENvdW50KCk7DQorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZighZm91bmQpIHsNCisgICAgICAgICAgICAgICAgbV9wb3NzaWJsZUNlbnRlcnMuQWRkKEZYX05FVyBDQkNfUVJGaW5kZXJQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksIGVzdGltYXRlZE1vZHVsZVNpemUpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9JTlQzMiBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpGaW5kUm93U2tpcCgpDQorew0KKyAgICBGWF9JTlQzMiBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICAgIGlmIChtYXggPD0gMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRmluZGVyUGF0dGVybiAqZmlyc3RDb25maXJtZWRDZW50ZXIgPSBOVUxMOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKmNlbnRlciA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCisgICAgICAgIGlmIChjZW50ZXItPkdldENvdW50KCkgPj0gQ0VOVEVSX1FVT1JVTSkgew0KKyAgICAgICAgICAgIGlmIChmaXJzdENvbmZpcm1lZENlbnRlciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGZpcnN0Q29uZmlybWVkQ2VudGVyID0gY2VudGVyOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1faGFzU2tpcHBlZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIHJldHVybiAoRlhfSU5UMzIpICgoZmFicyhmaXJzdENvbmZpcm1lZENlbnRlci0+R2V0WCgpIC0gY2VudGVyLT5HZXRYKCkpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWJzKGZpcnN0Q29uZmlybWVkQ2VudGVyLT5HZXRZKCkgLSBjZW50ZXItPkdldFkoKSkpIC8gMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitGWF9CT09MIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkhhdmVNdWx0aXBseUNvbmZpcm1lZENlbnRlcnMoKQ0KK3sNCisgICAgRlhfSU5UMzIgY29uZmlybWVkQ291bnQgPSAwOw0KKyAgICBGWF9GTE9BVCB0b3RhbE1vZHVsZVNpemUgPSAwLjBmOw0KKyAgICBGWF9JTlQzMiBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKyAgICAgICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqcGF0dGVybiA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCisgICAgICAgIGlmIChwYXR0ZXJuLT5HZXRDb3VudCgpID49IENFTlRFUl9RVU9SVU0pIHsNCisgICAgICAgICAgICBjb25maXJtZWRDb3VudCsrOw0KKyAgICAgICAgICAgIHRvdGFsTW9kdWxlU2l6ZSArPSBwYXR0ZXJuLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGNvbmZpcm1lZENvdW50IDwgMykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGF2ZXJhZ2UgPSB0b3RhbE1vZHVsZVNpemUgLyAoRlhfRkxPQVQpIG1heDsNCisgICAgRlhfRkxPQVQgdG90YWxEZXZpYXRpb24gPSAwLjBmOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKnBhdHRlcm4gPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQorICAgICAgICB0b3RhbERldmlhdGlvbiArPSBmYWJzKHBhdHRlcm4tPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIGF2ZXJhZ2UpOw0KKyAgICB9DQorICAgIHJldHVybiB0b3RhbERldmlhdGlvbiA8PSAwLjA1ZiAqIHRvdGFsTW9kdWxlU2l6ZTsNCit9DQoraW5saW5lIEZYX0JPT0wgY2VudGVyQ29tcGFyYXRvcihGWF9MUFZPSUQgYSwgRlhfTFBWT0lEIGIpDQorew0KKyAgICByZXR1cm4gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiliKS0+R2V0Q291bnQoKSA8ICgoQ0JDX1FSRmluZGVyUGF0dGVybiopYSktPkdldENvdW50KCk7DQorfQ0KK0NGWF9QdHJBcnJheSAqQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6U2VsZWN0QmVzdHBhdHRlcm5zKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgc3RhcnRTaXplID0gbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOw0KKyAgICBpZihtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCkgPCAzKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGF2ZXJhZ2UgPSAwLjBmOw0KKyAgICBpZihzdGFydFNpemUgPiAzKSB7DQorICAgICAgICBGWF9GTE9BVCB0b3RhbE1vZHVsZVNpemUgPSAwLjBmOw0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgc3RhcnRTaXplOyBpKyspIHsNCisgICAgICAgICAgICB0b3RhbE1vZHVsZVNpemUgKz0gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXSktPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKTsNCisgICAgICAgIH0NCisgICAgICAgIGF2ZXJhZ2UgPSB0b3RhbE1vZHVsZVNpemUgLyAoRlhfRkxPQVQpc3RhcnRTaXplOw0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpICYmIG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSA+IDM7IGorKykgew0KKyAgICAgICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKnBhdHRlcm4gPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbal07DQorICAgICAgICAgICAgaWYoZmFicyhwYXR0ZXJuLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBhdmVyYWdlKSA+IDAuMmYgKiBhdmVyYWdlKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICBtX3Bvc3NpYmxlQ2VudGVycy5SZW1vdmVBdChqKTsNCisgICAgICAgICAgICAgICAgai0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCkgPiAzKSB7DQorICAgICAgICBCQ19GWF9QdHJBcnJheV9Tb3J0KG1fcG9zc2libGVDZW50ZXJzLCBjZW50ZXJDb21wYXJhdG9yKTsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgKnZlYyA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCisgICAgdmVjLT5TZXRTaXplKDMpOw0KKyAgICAoKnZlYylbMF0gPSAoKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzWzBdKS0+Q2xvbmUoKTsNCisgICAgKCp2ZWMpWzFdID0gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1sxXSktPkNsb25lKCk7DQorICAgICgqdmVjKVsyXSA9ICgoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbMl0pLT5DbG9uZSgpOw0KKyAgICByZXR1cm4gdmVjOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJHcmlkU2FtcGxlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUVJHcmlkU2FtcGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZjZhMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19RUkdyaWRTYW1wbGVyLmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUVJHcmlkU2FtcGxlci5oIg0KK0NCQ19RUkdyaWRTYW1wbGVyIENCQ19RUkdyaWRTYW1wbGVyOjptX2dyaWRTYW1wbGVyOw0KK0NCQ19RUkdyaWRTYW1wbGVyOjpDQkNfUVJHcmlkU2FtcGxlcigpDQorew0KK30NCitDQkNfUVJHcmlkU2FtcGxlcjo6fkNCQ19RUkdyaWRTYW1wbGVyKCkNCit7DQorfQ0KK0NCQ19RUkdyaWRTYW1wbGVyICZDQkNfUVJHcmlkU2FtcGxlcjo6R2V0SW5zdGFuY2UoKQ0KK3sNCisgICAgcmV0dXJuIG1fZ3JpZFNhbXBsZXI7DQorfQ0KK3ZvaWQgQ0JDX1FSR3JpZFNhbXBsZXI6OkNoZWNrQW5kTnVkZ2VQb2ludHMoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsIENGWF9GbG9hdEFycmF5ICpwb2ludHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgd2lkdGggPSBpbWFnZS0+R2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIgaGVpZ2h0ID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgICBGWF9CT09MIG51ZGdlZCA9IFRSVUU7DQorICAgIEZYX0lOVDMyIG9mZnNldDsNCisgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBwb2ludHMtPkdldFNpemUoKSAmJiBudWRnZWQ7IG9mZnNldCArPSAyKSB7DQorICAgICAgICBGWF9JTlQzMiB4ID0gKEZYX0lOVDMyKSAoKnBvaW50cylbb2Zmc2V0XTsNCisgICAgICAgIEZYX0lOVDMyIHkgPSAoRlhfSU5UMzIpICgqcG9pbnRzKVtvZmZzZXQgKyAxXTsNCisgICAgICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIG51ZGdlZCA9IEZBTFNFOw0KKyAgICAgICAgaWYgKHggPT0gLTEpIHsNCisgICAgICAgICAgICAoKnBvaW50cylbb2Zmc2V0XSA9IDAuMGY7DQorICAgICAgICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoeCA9PSB3aWR0aCkgew0KKyAgICAgICAgICAgICgqcG9pbnRzKVtvZmZzZXRdID0gKEZYX0ZMT0FUKSh3aWR0aCAtIDEpOw0KKyAgICAgICAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoeSA9PSAtMSkgew0KKyAgICAgICAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IDAuMGY7DQorICAgICAgICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoeSA9PSBoZWlnaHQpIHsNCisgICAgICAgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAoRlhfRkxPQVQpKGhlaWdodCAtIDEpOw0KKyAgICAgICAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgZm9yIChvZmZzZXQgPSAoKnBvaW50cykuR2V0U2l6ZSgpIC0gMjsgb2Zmc2V0ID49IDAgJiYgbnVkZ2VkOyBvZmZzZXQgLT0gMikgew0KKyAgICAgICAgRlhfSU5UMzIgeCA9IChGWF9JTlQzMikgKCpwb2ludHMpW29mZnNldF07DQorICAgICAgICBGWF9JTlQzMiB5ID0gKEZYX0lOVDMyKSAoKnBvaW50cylbb2Zmc2V0ICsgMV07DQorICAgICAgICBpZiAoeCA8IC0xIHx8IHggPiB3aWR0aCB8fCB5IDwgLTEgfHwgeSA+IGhlaWdodCkgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICB9DQorICAgICAgICBudWRnZWQgPSBGQUxTRTsNCisgICAgICAgIGlmICh4ID09IC0xKSB7DQorICAgICAgICAgICAgKCpwb2ludHMpW29mZnNldF0gPSAwLjBmOw0KKyAgICAgICAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHggPT0gd2lkdGgpIHsNCisgICAgICAgICAgICAoKnBvaW50cylbb2Zmc2V0XSA9IChGWF9GTE9BVCkod2lkdGggLSAxKTsNCisgICAgICAgICAgICBudWRnZWQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHkgPT0gLTEpIHsNCisgICAgICAgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAwLjBmOw0KKyAgICAgICAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHkgPT0gaGVpZ2h0KSB7DQorICAgICAgICAgICAgKCpwb2ludHMpW29mZnNldCArIDFdID0gKEZYX0ZMT0FUKShoZWlnaHQgLSAxKTsNCisgICAgICAgICAgICBudWRnZWQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXggKkNCQ19RUkdyaWRTYW1wbGVyOjpTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBGWF9JTlQzMiBkaW1lbnNpb25YLCBGWF9JTlQzMiBkaW1lbnNpb25ZLA0KKyAgICAgICAgRlhfRkxPQVQgcDFUb1gsIEZYX0ZMT0FUIHAxVG9ZLA0KKyAgICAgICAgRlhfRkxPQVQgcDJUb1gsIEZYX0ZMT0FUIHAyVG9ZLA0KKyAgICAgICAgRlhfRkxPQVQgcDNUb1gsIEZYX0ZMT0FUIHAzVG9ZLA0KKyAgICAgICAgRlhfRkxPQVQgcDRUb1gsIEZYX0ZMT0FUIHA0VG9ZLA0KKyAgICAgICAgRlhfRkxPQVQgcDFGcm9tWCwgRlhfRkxPQVQgcDFGcm9tWSwNCisgICAgICAgIEZYX0ZMT0FUIHAyRnJvbVgsIEZYX0ZMT0FUIHAyRnJvbVksDQorICAgICAgICBGWF9GTE9BVCBwM0Zyb21YLCBGWF9GTE9BVCBwM0Zyb21ZLA0KKyAgICAgICAgRlhfRkxPQVQgcDRGcm9tWCwgRlhfRkxPQVQgcDRGcm9tWSwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0+IHRyYW5zZm9ybShDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWwoDQorICAgICAgICAgICAgICAgIHAxVG9YLCBwMVRvWSwgcDJUb1gsIHAyVG9ZLCBwM1RvWCwgcDNUb1ksIHA0VG9YLCBwNFRvWSwNCisgICAgICAgICAgICAgICAgcDFGcm9tWCwgcDFGcm9tWSwgcDJGcm9tWCwgcDJGcm9tWSwgcDNGcm9tWCwgcDNGcm9tWSwgcDRGcm9tWCwgcDRGcm9tWSkpOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICp0ZW1wQml0TSA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4KCk7DQorICAgIHRlbXBCaXRNLT5Jbml0KGRpbWVuc2lvblgsIGRpbWVuc2lvblkpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBiaXRzKHRlbXBCaXRNKTsNCisgICAgQ0ZYX0Zsb2F0QXJyYXkgcG9pbnRzOw0KKyAgICBwb2ludHMuU2V0U2l6ZShkaW1lbnNpb25YIDw8IDEpOw0KKyAgICBmb3IgKEZYX0lOVDMyIHkgPSAwOyB5IDwgZGltZW5zaW9uWTsgeSsrKSB7DQorICAgICAgICBGWF9JTlQzMiBtYXggPSBwb2ludHMuR2V0U2l6ZSgpOw0KKyAgICAgICAgRlhfRkxPQVQgaVZhbHVlID0gKEZYX0ZMT0FUKSAoeSArIDAuNWYpOw0KKyAgICAgICAgRlhfSU5UMzIgeDsNCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYXg7IHggKz0gMikgew0KKyAgICAgICAgICAgIHBvaW50c1t4XSA9IChGWF9GTE9BVCkgKCh4ID4+IDEpICsgMC41Zik7DQorICAgICAgICAgICAgcG9pbnRzW3ggKyAxXSA9IGlWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHRyYW5zZm9ybS0+VHJhbnNmb3JtUG9pbnRzKCZwb2ludHMpOw0KKyAgICAgICAgQ2hlY2tBbmROdWRnZVBvaW50cyhpbWFnZSwgJnBvaW50cywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgbWF4OyB4ICs9IDIpIHsNCisgICAgICAgICAgICBpZiAoaW1hZ2UtPkdldCgoRlhfSU5UMzIpIHBvaW50c1t4XSwgKEZYX0lOVDMyKSBwb2ludHNbeCArIDFdKSkgew0KKyAgICAgICAgICAgICAgICBiaXRzLT5TZXQoeCA+PiAxLCB5KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJpdHMucmVsZWFzZSgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjcxODgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVhZGVyLmNwcApAQCAtMCwwICsxLDE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVhZGVyLmgiDQorQ0JDX1JlYWRlcjo6Q0JDX1JlYWRlcigpDQorew0KK30NCitDQkNfUmVhZGVyOjp+Q0JDX1JlYWRlcigpDQorew0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVlZFNvbG9tb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1JlZWRTb2xvbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE0ZGRkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1JlZWRTb2xvbW9uLmNwcApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb24uaCINCitDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpDQkNfUmVlZFNvbG9tb25FbmNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkNCit7DQorICAgIG1fZmllbGQgPSBmaWVsZDsNCit9DQordm9pZCBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpJbml0KCkNCit7DQorICAgIG1fY2FjaGVkR2VuZXJhdG9ycy5BZGQoRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seShtX2ZpZWxkLCAxKSk7DQorfQ0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6QnVpbGRHZW5lcmF0b3IoRlhfSU5UMzIgZGVncmVlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGRlZ3JlZSA+PSBtX2NhY2hlZEdlbmVyYXRvcnMuR2V0U2l6ZSgpKSB7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGxhc3RHZW5lcmF0b3IgPSAoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikobV9jYWNoZWRHZW5lcmF0b3JzW21fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCkgLSAxXSk7DQorICAgICAgICBmb3IoRlhfSU5UMzIgZCA9IG1fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCk7IGQgPD0gZGVncmVlOyBkKyspIHsNCisgICAgICAgICAgICBDRlhfSW50MzJBcnJheSB0ZW1wOw0KKyAgICAgICAgICAgIHRlbXAuQWRkKDEpOw0KKyAgICAgICAgICAgIHRlbXAuQWRkKG1fZmllbGQtPkV4cChkIC0gMSkpOw0KKyAgICAgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSB0ZW1wX3BvbHk7DQorICAgICAgICAgICAgdGVtcF9wb2x5LkluaXQobV9maWVsZCwgJnRlbXAsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG5leHRHZW5lcmF0b3IgPSBsYXN0R2VuZXJhdG9yLT5NdWx0aXBseSgmdGVtcF9wb2x5LCBlKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgbV9jYWNoZWRHZW5lcmF0b3JzLkFkZChuZXh0R2VuZXJhdG9yKTsNCisgICAgICAgICAgICBsYXN0R2VuZXJhdG9yID0gbmV4dEdlbmVyYXRvcjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKG1fY2FjaGVkR2VuZXJhdG9yc1tkZWdyZWVdKTsNCit9DQordm9pZCBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpFbmNvZGUoQ0ZYX0ludDMyQXJyYXkgKnRvRW5jb2RlLCBGWF9JTlQzMiBlY0J5dGVzLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGVjQnl0ZXMgPT0gMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm9Db3JyZWN0aW9uQnl0ZXM7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBkYXRhQnl0ZXMgPSB0b0VuY29kZS0+R2V0U2l6ZSgpIC0gZWNCeXRlczsNCisgICAgaWYoZGF0YUJ5dGVzIDw9IDApIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vRGF0YUJ5dGVzUHJvdmlkZWQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGdlbmVyYXRvciA9IEJ1aWxkR2VuZXJhdG9yKGVjQnl0ZXMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgaW5mb0NvZWZmaWNpZW50czsNCisgICAgaW5mb0NvZWZmaWNpZW50cy5TZXRTaXplKGRhdGFCeXRlcyk7DQorICAgIGZvcihGWF9JTlQzMiB4ID0gMDsgeCA8IGRhdGFCeXRlczsgeCsrKSB7DQorICAgICAgICBpbmZvQ29lZmZpY2llbnRzW3hdID0gdG9FbmNvZGUtPm9wZXJhdG9yIFtdKHgpOw0KKyAgICB9DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSBpbmZvOw0KKyAgICBpbmZvLkluaXQobV9maWVsZCwgJmluZm9Db2VmZmljaWVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cgPSBpbmZvLk11bHRpcGx5QnlNb25vbWlhbChlY0J5dGVzLCAxLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gaW5mb1RlbXAocnNnKTsNCisgICAgQ0ZYX1B0ckFycmF5ICpwYSA9IGluZm9UZW1wLT5EaXZpZGUoZ2VuZXJhdG9yLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19BdXRvUHRyPENGWF9QdHJBcnJheSA+IHRlbXAocGEpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJlbWFpbmRlciA9IChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKSh0ZW1wLT5vcGVyYXRvciBbXSgxKSk7DQorICAgIENGWF9JbnQzMkFycmF5KiBjb2VmZmljaWVudHMgPSByZW1haW5kZXItPkdldENvZWZmaWNpZW50cygpOw0KKyAgICBGWF9JTlQzMiBudW1aZXJvQ29lZmZpY2llbnRzID0gZWNCeXRlcyAtIGNvZWZmaWNpZW50cy0+R2V0U2l6ZSgpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBudW1aZXJvQ29lZmZpY2llbnRzOyBpKyspIHsNCisgICAgICAgICgqdG9FbmNvZGUpW2RhdGFCeXRlcyArIGldID0gMDsNCisgICAgfQ0KKyAgICBmb3IoRlhfSU5UMzIgeSA9IDA7IHkgPCBjb2VmZmljaWVudHMtPkdldFNpemUoKTsgeSsrKSB7DQorICAgICAgICAoKnRvRW5jb2RlKVtkYXRhQnl0ZXMgKyBudW1aZXJvQ29lZmZpY2llbnRzICsgeV0gPQ0KKyAgICAgICAgICAgIGNvZWZmaWNpZW50cy0+b3BlcmF0b3IgW10oeSk7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBrID0gMDsgayA8IHRlbXAtPkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICBkZWxldGUgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKCp0ZW1wKVtrXTsNCisgICAgfQ0KK30NCitDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjp+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBkZWxldGUgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopbV9jYWNoZWRHZW5lcmF0b3JzW2ldOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWVkU29sb21vbkRlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMTMwNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWVkU29sb21vbkRlY29kZXIuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25EZWNvZGVyLmgiDQorQ0JDX1JlZWRTb2xvbW9uRGVjb2Rlcjo6Q0JDX1JlZWRTb2xvbW9uRGVjb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQpDQorew0KKyAgICBtX2ZpZWxkID0gZmllbGQ7DQorfQ0KK0NCQ19SZWVkU29sb21vbkRlY29kZXI6On5DQkNfUmVlZFNvbG9tb25EZWNvZGVyKCkNCit7DQorfQ0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uRGVjb2Rlcjo6RGVjb2RlKENGWF9JbnQzMkFycmF5KiByZWNlaXZlZCwgRlhfSU5UMzIgdHdvUywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgcG9seTsNCisgICAgcG9seS5Jbml0KG1fZmllbGQsIHJlY2VpdmVkLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENGWF9JbnQzMkFycmF5IHN5bmRyb21lQ29lZmZpY2llbnRzOw0KKyAgICBzeW5kcm9tZUNvZWZmaWNpZW50cy5TZXRTaXplKHR3b1MpOw0KKyAgICBGWF9CT09MIGRhdGFNYXRyaXggPSBGQUxTRTsNCisgICAgRlhfQk9PTCBub0Vycm9yID0gVFJVRTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHR3b1M7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgZXZhbCA9IHBvbHkuRXZhbHVhdGVBdChtX2ZpZWxkLT5FeHAoZGF0YU1hdHJpeCA/IGkgKyAxIDogaSkpOw0KKyAgICAgICAgc3luZHJvbWVDb2VmZmljaWVudHNbdHdvUyAtIDEgLSBpXSA9IGV2YWw7DQorICAgICAgICBpZiAoZXZhbCAhPSAwKSB7DQorICAgICAgICAgICAgbm9FcnJvciA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKG5vRXJyb3IpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgc3luZHJvbWU7DQorICAgIHN5bmRyb21lLkluaXQobV9maWVsZCwgJnN5bmRyb21lQ29lZmZpY2llbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnID0gbV9maWVsZC0+QnVpbGRNb25vbWlhbCh0d29TLCAxLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2cpOw0KKyAgICBDRlhfUHRyQXJyYXkqIHBhID0gUnVuRXVjbGlkZWFuQWxnb3JpdGhtKHRlbXAuZ2V0KCksICZzeW5kcm9tZSwgdHdvUywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXkgPiBzaWdtYU9tZWdhKHBhKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzaWdtYSgoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnNpZ21hT21lZ2EpWzBdKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBvbWVnYSgoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnNpZ21hT21lZ2EpWzFdKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGlhMSA9IEZpbmRFcnJvckxvY2F0aW9ucyhzaWdtYS5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IGVycm9yTG9jYXRpb25zKGlhMSk7DQorICAgIENGWF9JbnQzMkFycmF5KiBpYTIgPSBGaW5kRXJyb3JNYWduaXR1ZGVzKG9tZWdhLmdldCgpLCBlcnJvckxvY2F0aW9ucy5nZXQoKSwgZGF0YU1hdHJpeCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IGVycm9yTWFnbml0dWRlcyhpYTIpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGsgPSAwOyBrIDwgZXJyb3JMb2NhdGlvbnMtPkdldFNpemUoKTsgaysrKSB7DQorICAgICAgICBGWF9JTlQzMiBwb3NpdGlvbiA9IHJlY2VpdmVkLT5HZXRTaXplKCkgLSAxIC0gbV9maWVsZC0+TG9nKCgqZXJyb3JMb2NhdGlvbnMpW2tdLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgaWYocG9zaXRpb24gPCAwKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQmFkRXJyb3JMb2NhdGlvbjsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgIH0NCisgICAgICAgICgqcmVjZWl2ZWQpW3Bvc2l0aW9uXSA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KCgqcmVjZWl2ZWQpW3Bvc2l0aW9uXSwgKCplcnJvck1hZ25pdHVkZXMpW2tdKTsNCisgICAgfQ0KK30NCitDRlhfUHRyQXJyYXkgKkNCQ19SZWVkU29sb21vbkRlY29kZXI6OlJ1bkV1Y2xpZGVhbkFsZ29yaXRobShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGEsIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYiwgRlhfSU5UMzIgUiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoYS0+R2V0RGVncmVlKCkgPCBiLT5HZXREZWdyZWUoKSkgew0KKyAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gYTsNCisgICAgICAgIGEgPSBiOw0KKyAgICAgICAgYiA9IHRlbXA7DQorICAgIH0NCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxID0gYS0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByTGFzdChyc2cxKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cyID0gYi0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByKHJzZzIpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzMgPSBtX2ZpZWxkLT5HZXRPbmUoKS0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzTGFzdChyc2czKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c0ID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHMocnNnNCk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNSA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0TGFzdChyc2c1KTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c2ID0gbV9maWVsZC0+R2V0T25lKCktPkNsb25lKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdChyc2c2KTsNCisgICAgd2hpbGUgKHItPkdldERlZ3JlZSgpID49IFIgLyAyKSB7DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJMYXN0TGFzdCA9IHJMYXN0Ow0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzTGFzdExhc3QgPSBzTGFzdDsNCisgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdExhc3RsYXN0ID0gdExhc3Q7DQorICAgICAgICByTGFzdCA9IHI7DQorICAgICAgICBzTGFzdCA9IHM7DQorICAgICAgICB0TGFzdCA9IHQ7DQorICAgICAgICBpZiAockxhc3QtPklzWmVybygpKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uUl9JXzFJc1plcm87DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c3ID0gIHJMYXN0TGFzdC0+Q2xvbmUoZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJUZW1wKHJzZzcpOw0KKyAgICAgICAgciA9IHJUZW1wOw0KKyAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c4ID0gIG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHEocnNnOCk7DQorICAgICAgICBGWF9JTlQzMiBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gckxhc3QtPkdldENvZWZmaWNpZW50cyhyTGFzdC0+R2V0RGVncmVlKCkpOw0KKyAgICAgICAgRlhfSU5UMzIgZGx0SW52ZXJzZSA9IG1fZmllbGQtPkludmVyc2UoZGVub21pbmF0b3JMZWFkaW5nVGVybSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB3aGlsZSAoci0+R2V0RGVncmVlKCkgPj0gckxhc3QtPkdldERlZ3JlZSgpICYmICEoci0+SXNaZXJvKCkpKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgZGVncmVlRGlmZiA9IHItPkdldERlZ3JlZSgpIC0gckxhc3QtPkdldERlZ3JlZSgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIHNjYWxlID0gbV9maWVsZC0+TXVsdGlwbHkoci0+R2V0Q29lZmZpY2llbnRzKHItPkdldERlZ3JlZSgpKSwgZGx0SW52ZXJzZSk7DQorICAgICAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2dwMSA9IG1fZmllbGQtPkJ1aWxkTW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IGJ1aWxkKHJzZ3AxKTsNCisgICAgICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3AyID0gcS0+QWRkT3JTdWJ0cmFjdChidWlsZC5nZXQoKSwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2dwMik7DQorICAgICAgICAgICAgcSA9IHRlbXA7DQorICAgICAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2dwMyA9IHJMYXN0LT5NdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG11bHRpcGx5KHJzZ3AzKTsNCisgICAgICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3A0ID0gci0+QWRkT3JTdWJ0cmFjdChtdWx0aXBseS5nZXQoKSwgZSk7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDMocnNncDQpOw0KKyAgICAgICAgICAgIHIgPSB0ZW1wMzsNCisgICAgICAgIH0NCisgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnOSA9IHEtPk11bHRpcGx5KHNMYXN0LmdldCgpLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDEocnNnOSk7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzEwID0gdGVtcDEtPkFkZE9yU3VidHJhY3Qoc0xhc3RMYXN0LmdldCgpLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDIocnNnMTApOw0KKyAgICAgICAgcyA9IHRlbXAyOw0KKyAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMSA9IHEtPk11bHRpcGx5KHRMYXN0LmdldCgpLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDUocnNnMTEpOw0KKyAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMiA9IHRlbXA1LT5BZGRPclN1YnRyYWN0KHRMYXN0bGFzdC5nZXQoKSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlbXA2KHJzZzEyKTsNCisgICAgICAgIHQgPSB0ZW1wNjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaWdtYVRpbGRlQXRaZXJvID0gdC0+R2V0Q29lZmZpY2llbnRzKDApOw0KKyAgICBpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Jc1plcm87DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaW52ZXJzZSA9IG1fZmllbGQtPkludmVyc2Uoc2lnbWFUaWxkZUF0WmVybywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMyA9IHQtPk11bHRpcGx5KGludmVyc2UsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gc2lnbWEocnNnMTMpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzE0ID0gci0+TXVsdGlwbHkoaW52ZXJzZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBvbWVnYShyc2cxNCk7DQorICAgIENGWF9QdHJBcnJheSAqdGVtcCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgIHRlbXAtPkFkZChzaWdtYS5yZWxlYXNlKCkpOw0KKyAgICB0ZW1wLT5BZGQob21lZ2EucmVsZWFzZSgpKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0NGWF9JbnQzMkFycmF5ICpDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpGaW5kRXJyb3JMb2NhdGlvbnMoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBlcnJvckxvY2F0b3IsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgRlhfSU5UMzIgbnVtRXJyb3JzID0gZXJyb3JMb2NhdG9yLT5HZXREZWdyZWUoKTsNCisgICAgaWYgKG51bUVycm9ycyA9PSAxKSB7DQorICAgICAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IHRlbXAoRlhfTkVXIENGWF9JbnQzMkFycmF5KTsNCisgICAgICAgIHRlbXAtPkFkZChlcnJvckxvY2F0b3ItPkdldENvZWZmaWNpZW50cygxKSk7DQorICAgICAgICByZXR1cm4gdGVtcC5yZWxlYXNlKCk7DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgKnRlbXBUID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICB0ZW1wVC0+U2V0U2l6ZShudW1FcnJvcnMpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IHJlc3VsdCh0ZW1wVCk7DQorICAgIEZYX0lOVDMyIGllID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IDI1NiAmJiBpZSA8IG51bUVycm9yczsgaSsrKSB7DQorICAgICAgICBpZihlcnJvckxvY2F0b3ItPkV2YWx1YXRlQXQoaSkgPT0gMCkgew0KKyAgICAgICAgICAgICgqcmVzdWx0KVtpZV0gPSBtX2ZpZWxkLT5JbnZlcnNlKGksIGllKTsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgaWUrKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaWUgIT0gbnVtRXJyb3JzKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVOb3RNYXRjaFJvb3RzOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KK30NCitDRlhfSW50MzJBcnJheSAqQ0JDX1JlZWRTb2xvbW9uRGVjb2Rlcjo6RmluZEVycm9yTWFnbml0dWRlcyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yRXZhbHVhdG9yLCBDRlhfSW50MzJBcnJheSogZXJyb3JMb2NhdGlvbnMsIEZYX0JPT0wgZGF0YU1hdHJpeCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBzID0gZXJyb3JMb2NhdGlvbnMtPkdldFNpemUoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgKiB0ZW1wID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICB0ZW1wLT5TZXRTaXplKHMpOw0KKyAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IHJlc3VsdCh0ZW1wKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHM7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgeGlJbnZlcnNlID0gbV9maWVsZC0+SW52ZXJzZShlcnJvckxvY2F0aW9ucy0+b3BlcmF0b3IgW10oaSksIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgRlhfSU5UMzIgZGVub21pbmF0b3IgPSAxOw0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgczsgaisrKSB7DQorICAgICAgICAgICAgaWYoaSAhPSBqKSB7DQorICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gbV9maWVsZC0+TXVsdGlwbHkoZGVub21pbmF0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoMSwgbV9maWVsZC0+TXVsdGlwbHkoZXJyb3JMb2NhdGlvbnMtPm9wZXJhdG9yIFtdKGopLCB4aUludmVyc2UpKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgdGVtcCA9IG1fZmllbGQtPkludmVyc2UoZGVub21pbmF0b3IsIHRlbXApOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgKCpyZXN1bHQpW2ldID0gbV9maWVsZC0+TXVsdGlwbHkoZXJyb3JFdmFsdWF0b3ItPkV2YWx1YXRlQXQoeGlJbnZlcnNlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXApOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4NTZiMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWVkU29sb21vbkdGMjU2LmNwcApAQCAtMCwwICsxLDEyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KK0NCQ19SZWVkU29sb21vbkdGMjU2ICpDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmlsZCA9IE5VTEw7DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTYgKkNCQ19SZWVkU29sb21vbkdGMjU2OjpEYXRhTWF0cml4RmllbGQgPSBOVUxMOw0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXRpYWxpemUoKQ0KK3sNCisgICAgUVJDb2RlRmlsZCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NigweDAxMUQpOw0KKyAgICBRUkNvZGVGaWxkLT5Jbml0KCk7DQorICAgIERhdGFNYXRyaXhGaWVsZCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NigweDAxMkQpOw0KKyAgICBEYXRhTWF0cml4RmllbGQtPkluaXQoKTsNCit9DQordm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RmluYWxpemUoKQ0KK3sNCisgICAgaWYgKFFSQ29kZUZpbGQpIHsNCisgICAgICAgIGRlbGV0ZSBRUkNvZGVGaWxkOw0KKyAgICB9DQorICAgIFFSQ29kZUZpbGQgPSBOVUxMOw0KKyAgICBpZiAoRGF0YU1hdHJpeEZpZWxkKSB7DQorICAgICAgICBkZWxldGUgRGF0YU1hdHJpeEZpZWxkOw0KKyAgICB9DQorICAgIERhdGFNYXRyaXhGaWVsZCA9IE5VTEw7DQorfQ0KK0NCQ19SZWVkU29sb21vbkdGMjU2OjpDQkNfUmVlZFNvbG9tb25HRjI1NihGWF9JTlQzMiBwcmltaXRpdmUpDQorew0KKyAgICBGWF9JTlQzMiB4ID0gMTsNCisgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgMjU2OyBqKyspIHsNCisgICAgICAgIG1fZXhwVGFibGVbal0gPSB4Ow0KKyAgICAgICAgeCA8PD0gMTsNCisgICAgICAgIGlmKHggPj0gMHgxMDApIHsNCisgICAgICAgICAgICB4IF49IHByaW1pdGl2ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAyNTU7IGkrKykgew0KKyAgICAgICAgbV9sb2dUYWJsZVttX2V4cFRhYmxlW2ldXSA9IGk7DQorICAgIH0NCisgICAgbV9sb2dUYWJsZVswXSA9IDA7DQorfQ0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXQoKQ0KK3sNCisgICAgbV96ZXJvID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSh0aGlzLCAwKTsNCisgICAgbV9vbmUgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KHRoaXMsIDEpOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1Njo6fkNCQ19SZWVkU29sb21vbkdGMjU2KCkNCit7DQorICAgIGlmKG1femVybyAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV96ZXJvOw0KKyAgICAgICAgbV96ZXJvID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX29uZSAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9vbmU7DQorICAgICAgICBtX29uZSA9IE5VTEw7DQorICAgIH0NCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6R2V0WmVybygpDQorew0KKyAgICByZXR1cm4gbV96ZXJvOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpHZXRPbmUoKQ0KK3sNCisgICAgcmV0dXJuIG1fb25lOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpCdWlsZE1vbm9taWFsKEZYX0lOVDMyIGRlZ3JlZSwgRlhfSU5UMzIgY29lZmZpY2llbnQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoZGVncmVlIDwgMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRGVncmVlSXNOZWdhdGl2ZTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICBpZihjb2VmZmljaWVudCA9PSAwKSB7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBtX3plcm8tPkNsb25lKGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIHRlbXA7DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgIGNvZWZmaWNpZW50czsNCisgICAgY29lZmZpY2llbnRzLlNldFNpemUoZGVncmVlICsgMSk7DQorICAgIGNvZWZmaWNpZW50c1swXSA9IGNvZWZmaWNpZW50Ow0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKnRlbXAgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICAgIHRlbXAtPkluaXQodGhpcywgJmNvZWZmaWNpZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0ZYX0lOVDMyIENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIpDQorew0KKyAgICByZXR1cm4gYSBeIGI7DQorfQ0KK0ZYX0lOVDMyIENCQ19SZWVkU29sb21vbkdGMjU2OjpFeHAoRlhfSU5UMzIgYSkNCit7DQorICAgIHJldHVybiBtX2V4cFRhYmxlW2FdOw0KK30NCitGWF9JTlQzMiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TG9nKEZYX0lOVDMyIGEsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoYSA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25BSXNaZXJvOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICAgIHJldHVybiBtX2xvZ1RhYmxlW2FdOw0KK30NCitGWF9JTlQzMiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6SW52ZXJzZShGWF9JTlQzMiBhLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKGEgPT0gMCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uQUlzWmVybzsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9leHBUYWJsZVsyNTUgLSBtX2xvZ1RhYmxlW2FdXTsNCit9DQorRlhfSU5UMzIgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6Ok11bHRpcGx5KEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIpDQorew0KKyAgICBpZihhID09IDAgfHwgYiA9PSAwKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZihhID09IDEpIHsNCisgICAgICAgIHJldHVybiBiOw0KKyAgICB9DQorICAgIGlmKGIgPT0gMSkgew0KKyAgICAgICAgcmV0dXJuIGE7DQorICAgIH0NCisgICAgcmV0dXJuIG1fZXhwVGFibGVbKG1fbG9nVGFibGVbYV0gKyBtX2xvZ1RhYmxlW2JdKSAlIDI1NV07DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzFiNWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwCkBAIC0wLDAgKzEsMjQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiDQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLCBGWF9JTlQzMiBjb2VmZmljaWVudHMpDQorew0KKyAgICBpZihmaWVsZCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9maWVsZCA9IGZpZWxkOw0KKyAgICBtX2NvZWZmaWNpZW50cy5BZGQoY29lZmZpY2llbnRzKTsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKQ0KK3sNCisgICAgbV9maWVsZCA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpJbml0KENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCwgQ0ZYX0ludDMyQXJyYXkqIGNvZWZmaWNpZW50cywgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihjb2VmZmljaWVudHMgPT0gTlVMTCB8fCBjb2VmZmljaWVudHMtPkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Db2VmZmljaWVudHNTaXplSXNOdWxsOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgbV9maWVsZCA9IGZpZWxkOw0KKyAgICBGWF9JTlQzMiBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMtPkdldFNpemUoKTsNCisgICAgaWYoKGNvZWZmaWNpZW50c0xlbmd0aCA+IDEgJiYgKCpjb2VmZmljaWVudHMpWzBdID09IDApKSB7DQorICAgICAgICBGWF9JTlQzMiBmaXJzdE5vblplcm8gPSAxOw0KKyAgICAgICAgd2hpbGUoKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCkgJiYgKCgqY29lZmZpY2llbnRzKVtmaXJzdE5vblplcm9dID09IDApKSB7DQorICAgICAgICAgICAgZmlyc3ROb25aZXJvKys7DQorICAgICAgICB9DQorICAgICAgICBpZihmaXJzdE5vblplcm8gPT0gY29lZmZpY2llbnRzTGVuZ3RoKSB7DQorICAgICAgICAgICAgbV9jb2VmZmljaWVudHMuQ29weSggKihtX2ZpZWxkLT5HZXRaZXJvKCktPkdldENvZWZmaWNpZW50cygpKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fY29lZmZpY2llbnRzLlNldFNpemUoY29lZmZpY2llbnRzTGVuZ3RoIC0gZmlyc3ROb25aZXJvKTsNCisgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IGZpcnN0Tm9uWmVybywgaiA9IDA7IGkgPCBjb2VmZmljaWVudHNMZW5ndGg7IGkrKywgaisrKSB7DQorICAgICAgICAgICAgICAgIG1fY29lZmZpY2llbnRzW2pdID0gY29lZmZpY2llbnRzLT5vcGVyYXRvciBbXShpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX2NvZWZmaWNpZW50cy5Db3B5KCpjb2VmZmljaWVudHMpOw0KKyAgICB9DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldENvZWZmaWNpZW50cygpDQorew0KKyAgICByZXR1cm4gJm1fY29lZmZpY2llbnRzOw0KK30NCitGWF9JTlQzMiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldERlZ3JlZSgpDQorew0KKyAgICByZXR1cm4gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gMTsNCit9DQorRlhfQk9PTCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OklzWmVybygpDQorew0KKyAgICByZXR1cm4gbV9jb2VmZmljaWVudHNbMF0gPT0gMDsNCit9DQorRlhfSU5UMzIgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpHZXRDb2VmZmljaWVudHMoRlhfSU5UMzIgZGVncmVlKQ0KK3sNCisgICAgcmV0dXJuIG1fY29lZmZpY2llbnRzW21fY29lZmZpY2llbnRzLkdldFNpemUoKSAtIDEgLSBkZWdyZWVdOw0KK30NCitGWF9JTlQzMiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkV2YWx1YXRlQXQoRlhfSU5UMzIgYSkNCit7DQorICAgIGlmKGEgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEdldENvZWZmaWNpZW50cygwKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBpZihhID09IDEpIHsNCisgICAgICAgIEZYX0lOVDMyIHJlc3VsdCA9IDA7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgICAgICAgICByZXN1bHQgPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdChyZXN1bHQsIG1fY29lZmZpY2llbnRzW2ldKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIgcmVzdWx0ID0gbV9jb2VmZmljaWVudHNbMF07DQorICAgIGZvcihGWF9JTlQzMiBqID0gMTsgaiA8IHNpemU7IGorKykgew0KKyAgICAgICAgcmVzdWx0ID0gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoDQorICAgICAgICAgICAgICAgICAgICAgbV9maWVsZC0+TXVsdGlwbHkoYSwgcmVzdWx0KSwNCisgICAgICAgICAgICAgICAgICAgICBtX2NvZWZmaWNpZW50c1tqXSk7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNsb25lKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICp0ZW1wICA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgICAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmbV9jb2VmZmljaWVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiB0ZW1wOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6QWRkT3JTdWJ0cmFjdChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKElzWmVybygpKSB7DQorICAgICAgICByZXR1cm4gb3RoZXItPkNsb25lKGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIGlmKG90aGVyLT5Jc1plcm8oKSkgew0KKyAgICAgICAgcmV0dXJuIHRoaXMtPkNsb25lKGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENGWF9JbnQzMkFycmF5IHNtYWxsZXJDb2VmZmljaWVudHM7DQorICAgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7DQorICAgIENGWF9JbnQzMkFycmF5IGxhcmdlckNvZWZmaWNpZW50czsNCisgICAgbGFyZ2VyQ29lZmZpY2llbnRzLkNvcHkoICoob3RoZXItPkdldENvZWZmaWNpZW50cygpKSk7DQorICAgIGlmKHNtYWxsZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpID4gbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSkgew0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkgdGVtcDsNCisgICAgICAgIHRlbXAuQ29weShzbWFsbGVyQ29lZmZpY2llbnRzKTsNCisgICAgICAgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShsYXJnZXJDb2VmZmljaWVudHMpOw0KKyAgICAgICAgbGFyZ2VyQ29lZmZpY2llbnRzLkNvcHkodGVtcCk7DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgc3VtRGlmZjsNCisgICAgc3VtRGlmZi5TZXRTaXplKGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgKTsNCisgICAgRlhfSU5UMzIgbGVuZ3RoRGlmZiA9IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgbGVuZ3RoRGlmZjsgaSsrKSB7DQorICAgICAgICBzdW1EaWZmW2ldID0gbGFyZ2VyQ29lZmZpY2llbnRzW2ldOw0KKyAgICB9DQorICAgIGZvcihGWF9JTlQzMiBqID0gbGVuZ3RoRGlmZjsgaiA8IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgc3VtRGlmZltqXSA9IChDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdChzbWFsbGVyQ29lZmZpY2llbnRzW2ogLSBsZW5ndGhEaWZmXSwNCisgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyQ29lZmZpY2llbnRzW2pdKSk7DQorICAgIH0NCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICp0ZW1wID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgICB0ZW1wLT5Jbml0KG1fZmllbGQsICZzdW1EaWZmLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gdGVtcDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5KENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYoSXNaZXJvKCkgfHwgb3RoZXItPklzWmVybygpKSB7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKnRlbXAgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIHRlbXA7DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgYUNvZWZmaWNpZW50cyA7DQorICAgIGFDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7DQorICAgIEZYX0lOVDMyIGFMZW5ndGggPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICAgIENGWF9JbnQzMkFycmF5IGJDb2VmZmljaWVudHM7DQorICAgIGJDb2VmZmljaWVudHMuQ29weSgqKG90aGVyLT5HZXRDb2VmZmljaWVudHMoKSkpOw0KKyAgICBGWF9JTlQzMiBiTGVuZ3RoID0gb3RoZXItPkdldENvZWZmaWNpZW50cygpLT5HZXRTaXplKCk7DQorICAgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICAgIHByb2R1Y3QuU2V0U2l6ZShhTGVuZ3RoICsgYkxlbmd0aCAtIDEpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGFDb2VmZiA9IG1fY29lZmZpY2llbnRzW2ldOw0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgYkxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgcHJvZHVjdFtpICsgal0gPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0W2kgKyBqXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZpZWxkLT5NdWx0aXBseShhQ29lZmYsIG90aGVyLT5HZXRDb2VmZmljaWVudHMoKS0+b3BlcmF0b3IgW10oaikpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKnRlbXAgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICAgIHRlbXAtPkluaXQobV9maWVsZCwgJnByb2R1Y3QsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiB0ZW1wOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6TXVsdGlwbHkoRlhfSU5UMzIgc2NhbGFyLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIGlmKHNjYWxhciA9PSAwKSB7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKnRlbXAgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIHRlbXA7DQorICAgIH0NCisgICAgaWYoc2NhbGFyID09IDEpIHsNCisgICAgICAgIHJldHVybiB0aGlzLT5DbG9uZShlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgICBwcm9kdWN0LlNldFNpemUoc2l6ZSk7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICAgICAgcHJvZHVjdFtpXSA9IG1fZmllbGQtPk11bHRpcGx5KG1fY29lZmZpY2llbnRzW2ldLCBzY2FsYXIpOw0KKyAgICB9DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgICAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmcHJvZHVjdCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHRlbXA7DQorfQ0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpNdWx0aXBseUJ5TW9ub21pYWwoRlhfSU5UMzIgZGVncmVlLCBGWF9JTlQzMiBjb2VmZmljaWVudCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZihkZWdyZWUgPCAwKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVJc05lZ2F0aXZlOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIGlmKGNvZWZmaWNpZW50ID09IDApIHsNCisgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICByZXR1cm4gdGVtcDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgICBwcm9kdWN0LlNldFNpemUoc2l6ZSArIGRlZ3JlZSk7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICAgICAgcHJvZHVjdFtpXSA9IChtX2ZpZWxkLT5NdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgY29lZmZpY2llbnQpKTsNCisgICAgfQ0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKnRlbXAgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICAgIHRlbXAtPkluaXQobV9maWVsZCwgJnByb2R1Y3QsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiB0ZW1wOw0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6RGl2aWRlKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqb3RoZXIsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYob3RoZXItPklzWmVybygpKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25EaXZpZGVCeVplcm87DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHF1b3RpZW50KHJzZzEpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzIgPSB0aGlzLT5DbG9uZShlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJlbWFpbmRlcihyc2cyKTsNCisgICAgRlhfSU5UMzIgZGVub21pbmF0b3JMZWFkaW5nVGVybSA9IG90aGVyLT5HZXRDb2VmZmljaWVudHMob3RoZXItPkdldERlZ3JlZSgpKTsNCisgICAgRlhfSU5UMzIgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1RlYW0gPSBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsNCisgICAgd2hpbGUocmVtYWluZGVyLT5HZXREZWdyZWUoKSA+PSBvdGhlci0+R2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+SXNaZXJvKCkpIHsNCisgICAgICAgIEZYX0lOVDMyIGRlZ3JlZURpZmZlcmVuY2UgPSByZW1haW5kZXItPkdldERlZ3JlZSgpIC0gb3RoZXItPkdldERlZ3JlZSgpOw0KKyAgICAgICAgRlhfSU5UMzIgc2NhbGUgPSBtX2ZpZWxkLT5NdWx0aXBseShyZW1haW5kZXItPkdldENvZWZmaWNpZW50cygocmVtYWluZGVyLT5HZXREZWdyZWUoKSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSk7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzMgPSBvdGhlci0+TXVsdGlwbHlCeU1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVybShyc2czKTsNCisgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNCA9IG1fZmllbGQtPkJ1aWxkTW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBpdGVyYXRvclF1b3RpZW50KHJzZzQpOw0KKyAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c1ID0gcXVvdGllbnQtPkFkZE9yU3VidHJhY3QoaXRlcmF0b3JRdW90aWVudC5nZXQoKSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlbXAocnNnNSk7DQorICAgICAgICBxdW90aWVudCA9IHRlbXA7DQorICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzYgPSByZW1haW5kZXItPkFkZE9yU3VidHJhY3QodGVybS5nZXQoKSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlbXAxKHJzZzYpOw0KKyAgICAgICAgcmVtYWluZGVyID0gdGVtcDE7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wUHRyQSA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgIHRlbXBQdHJBLT5BZGQocXVvdGllbnQucmVsZWFzZSgpKTsNCisgICAgdGVtcFB0ckEtPkFkZChyZW1haW5kZXIucmVsZWFzZSgpKTsNCisgICAgcmV0dXJuIHRlbXBQdHJBOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6On5DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKQ0KK3sNCisgICAgbV9jb2VmZmljaWVudHMuUmVtb3ZlQWxsKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19SZXN1bHRQb2ludC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVzdWx0UG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWI3MmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfUmVzdWx0UG9pbnQuY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19SZXN1bHRQb2ludC5oIg0KK0NCQ19SZXN1bHRQb2ludDo6Q0JDX1Jlc3VsdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOiBtX3goeCksIG1feSh5KQ0KK3sNCit9DQorRlhfRkxPQVQgQ0JDX1Jlc3VsdFBvaW50OjpHZXRYKCkNCit7DQorICAgIHJldHVybiBtX3g7DQorfQ0KK0ZYX0ZMT0FUIENCQ19SZXN1bHRQb2ludDo6R2V0WSgpDQorew0KKyAgICByZXR1cm4gbV95Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfU3ltYm9sSW5mby5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfU3ltYm9sSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwZGE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19TeW1ib2xJbmZvLmNwcApAQCAtMCwwICsxLDIyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCINCisjZGVmaW5lICBTWU1CT0xTX0NPVU5UICAzMA0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bV9QUk9EX1NZTUJPTFNbMzBdID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Ow0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bV9zeW1ib2xzWzMwXSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsNCit2b2lkIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCkNCit7DQorICAgIG1fUFJPRF9TWU1CT0xTWzBdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzLCA1LCA4LCA4LCAxKTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDUsIDcsIDEwLCAxMCwgMSk7DQorICAgIG1fUFJPRF9TWU1CT0xTWzJdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKFRSVUUsIDUsIDcsIDE2LCA2LCAxKTsNCisgICAgbV9QUk9EX1NZTUJPTFNbM10gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDgsIDEwLCAxMiwgMTIsIDEpOw0KKyAgICBtX1BST0RfU1lNQk9MU1s0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCAxMCwgMTEsIDE0LCA2LCAyKTsNCisgICAgbV9QUk9EX1NZTUJPTFNbNV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDEyLCAxMiwgMTQsIDE0LCAxKTsNCisgICAgbV9QUk9EX1NZTUJPTFNbNl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgMTYsIDE0LCAyNCwgMTAsIDEpOw0KKyAgICBtX1BST0RfU1lNQk9MU1s3XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTgsIDE0LCAxNiwgMTYsIDEpOw0KKyAgICBtX1BST0RfU1lNQk9MU1s4XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMjIsIDE4LCAxOCwgMTgsIDEpOw0KKyAgICBtX1BST0RfU1lNQk9MU1s5XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCAyMiwgMTgsIDE2LCAxMCwgMik7DQorICAgIG1fUFJPRF9TWU1CT0xTWzEwXSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMzAsIDIwLCAyMCwgMjAsIDEpOw0KKyAgICBtX1BST0RfU1lNQk9MU1sxMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgMzIsIDI0LCAxNiwgMTQsIDIpOw0KKyAgICBtX1BST0RfU1lNQk9MU1sxMl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDM2LCAyNCwgMjIsIDIyLCAxKTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMTNdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NCwgMjgsIDI0LCAyNCwgMSk7DQorICAgIG1fUFJPRF9TWU1CT0xTWzE0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCA0OSwgMjgsIDIyLCAxNCwgMik7DQorICAgIG1fUFJPRF9TWU1CT0xTWzE1XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNjIsIDM2LCAxNCwgMTQsIDQpOw0KKyAgICBtX1BST0RfU1lNQk9MU1sxNl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDg2LCA0MiwgMTYsIDE2LCA0KTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMTddID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMTQsIDQ4LCAxOCwgMTgsIDQpOw0KKyAgICBtX1BST0RfU1lNQk9MU1sxOF0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDE0NCwgNTYsIDIwLCAyMCwgNCk7DQorICAgIG1fUFJPRF9TWU1CT0xTWzE5XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTc0LCA2OCwgMjIsIDIyLCA0KTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMjBdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAyMDQsIDg0LCAyNCwgMjQsIDQsIDEwMiwgNDIpOw0KKyAgICBtX1BST0RfU1lNQk9MU1syMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDI4MCwgMTEyLCAxNCwgMTQsIDE2LCAxNDAsIDU2KTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMjJdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzNjgsIDE0NCwgMTYsIDE2LCAxNiwgOTIsIDM2KTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMjNdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NTYsIDE5MiwgMTgsIDE4LCAxNiwgMTE0LCA0OCk7DQorICAgIG1fUFJPRF9TWU1CT0xTWzI0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNTc2LCAyMjQsIDIwLCAyMCwgMTYsIDE0NCwgNTYpOw0KKyAgICBtX1BST0RfU1lNQk9MU1syNV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDY5NiwgMjcyLCAyMiwgMjIsIDE2LCAxNzQsIDY4KTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMjZdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA4MTYsIDMzNiwgMjQsIDI0LCAxNiwgMTM2LCA1Nik7DQorICAgIG1fUFJPRF9TWU1CT0xTWzI3XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTA1MCwgNDA4LCAxOCwgMTgsIDM2LCAxNzUsIDY4KTsNCisgICAgbV9QUk9EX1NZTUJPTFNbMjhdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMzA0LCA0OTYsIDIwLCAyMCwgMzYsIDE2MywgNjIpOw0KKyAgICBtX1BST0RfU1lNQk9MU1syOV0gPSBGWF9ORVcgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0KCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBTWU1CT0xTX0NPVU5UOyBpKyspIHsNCisgICAgICAgIG1fc3ltYm9sc1tpXSA9IG1fUFJPRF9TWU1CT0xTW2ldOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0JDX1N5bWJvbEluZm86OkZpbmFsaXplKCkNCit7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBTWU1CT0xTX0NPVU5UOyBpKyspIHsNCisgICAgICAgIGRlbGV0ZSBtX1BST0RfU1lNQk9MU1tpXTsNCisgICAgICAgIG1fUFJPRF9TWU1CT0xTW2ldID0gTlVMTDsNCisgICAgICAgIG1fc3ltYm9sc1tpXSA9IE5VTEw7DQorICAgIH0NCit9DQorQ0JDX1N5bWJvbEluZm86OkNCQ19TeW1ib2xJbmZvKEZYX0JPT0wgcmVjdGFuZ3VsYXIsIEZYX0lOVDMyIGRhdGFDYXBhY2l0eSwgRlhfSU5UMzIgZXJyb3JDb2Rld29yZHMsIEZYX0lOVDMyIG1hdHJpeFdpZHRoLCBGWF9JTlQzMiBtYXRyaXhIZWlnaHQsIEZYX0lOVDMyIGRhdGFSZWdpb25zKQ0KK3sNCisgICAgbV9yZWN0YW5ndWxhciA9IHJlY3Rhbmd1bGFyOw0KKyAgICBtX2RhdGFDYXBhY2l0eSA9IGRhdGFDYXBhY2l0eTsNCisgICAgbV9lcnJvckNvZGV3b3JkcyA9IGVycm9yQ29kZXdvcmRzOw0KKyAgICBtX21hdHJpeFdpZHRoID0gbWF0cml4V2lkdGg7DQorICAgIG1fbWF0cml4SGVpZ2h0ID0gbWF0cml4SGVpZ2h0Ow0KKyAgICBtX2RhdGFSZWdpb25zID0gZGF0YVJlZ2lvbnM7DQorICAgIG1fcnNCbG9ja0RhdGEgPSBkYXRhQ2FwYWNpdHk7DQorICAgIG1fcnNCbG9ja0Vycm9yID0gZXJyb3JDb2Rld29yZHM7DQorfQ0KK0NCQ19TeW1ib2xJbmZvOjpDQkNfU3ltYm9sSW5mbyhGWF9CT09MIHJlY3Rhbmd1bGFyLCBGWF9JTlQzMiBkYXRhQ2FwYWNpdHksIEZYX0lOVDMyIGVycm9yQ29kZXdvcmRzLCBGWF9JTlQzMiBtYXRyaXhXaWR0aCwgRlhfSU5UMzIgbWF0cml4SGVpZ2h0LCBGWF9JTlQzMiBkYXRhUmVnaW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgcnNCbG9ja0RhdGEsIEZYX0lOVDMyIHJzQmxvY2tFcnJvcikNCit7DQorICAgIG1fcmVjdGFuZ3VsYXIgPSByZWN0YW5ndWxhcjsNCisgICAgbV9kYXRhQ2FwYWNpdHkgPSBkYXRhQ2FwYWNpdHk7DQorICAgIG1fZXJyb3JDb2Rld29yZHMgPSBlcnJvckNvZGV3b3JkczsNCisgICAgbV9tYXRyaXhXaWR0aCA9IG1hdHJpeFdpZHRoOw0KKyAgICBtX21hdHJpeEhlaWdodCA9IG1hdHJpeEhlaWdodDsNCisgICAgbV9kYXRhUmVnaW9ucyA9IGRhdGFSZWdpb25zOw0KKyAgICBtX3JzQmxvY2tEYXRhID0gcnNCbG9ja0RhdGE7DQorICAgIG1fcnNCbG9ja0Vycm9yID0gcnNCbG9ja0Vycm9yOw0KK30NCitDQkNfU3ltYm9sSW5mbzo6fkNCQ19TeW1ib2xJbmZvKCkNCit7DQorfQ0KKw0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKEZYX0lOVDMyIGRhdGFDb2Rld29yZHMsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIGxvb2t1cChkYXRhQ29kZXdvcmRzLCBGT1JDRV9OT05FLCBUUlVFLCBlKTsNCit9DQorQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjpsb29rdXAoRlhfSU5UMzIgZGF0YUNvZGV3b3JkcywgU3ltYm9sU2hhcGVIaW50IHNoYXBlLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIFRSVUUsIGUpOw0KK30NCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChGWF9JTlQzMiBkYXRhQ29kZXdvcmRzLCBGWF9CT09MIGFsbG93UmVjdGFuZ3VsYXIsIEZYX0JPT0wgZmFpbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUgPSBhbGxvd1JlY3Rhbmd1bGFyID8gRk9SQ0VfTk9ORSA6IEZPUkNFX1NRVUFSRTsNCisgICAgcmV0dXJuIGxvb2t1cChkYXRhQ29kZXdvcmRzLCBzaGFwZSwgZmFpbCwgZSk7DQorfQ0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKEZYX0lOVDMyIGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgRlhfQk9PTCBmYWlsLCBGWF9JTlQzMiAmZSkNCit7DQorICAgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIE5VTEwsIE5VTEwsIGZhaWwsIGUpOw0KK30NCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChGWF9JTlQzMiBkYXRhQ29kZXdvcmRzLCBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsIENCQ19EaW1lbnNpb24qIG1pblNpemUsIENCQ19EaW1lbnNpb24qIG1heFNpemUsIEZYX0JPT0wgZmFpbCwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgU1lNQk9MU19DT1VOVDsgaSsrKSB7DQorICAgICAgICBDQkNfU3ltYm9sSW5mbyogc3ltYm9sID0gbV9zeW1ib2xzW2ldOw0KKyAgICAgICAgaWYgKHNoYXBlID09IEZPUkNFX1NRVUFSRSAmJiBzeW1ib2wtPm1fcmVjdGFuZ3VsYXIpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChzaGFwZSA9PSBGT1JDRV9SRUNUQU5HTEUgJiYgIXN5bWJvbC0+bV9yZWN0YW5ndWxhcikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1pblNpemUgIT0gTlVMTCAmJiAoc3ltYm9sLT5nZXRTeW1ib2xXaWR0aChlKSA8IG1pblNpemUtPmdldFdpZHRoKCkgfHwgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPCBtaW5TaXplLT5nZXRIZWlnaHQoKSkpIHsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAobWF4U2l6ZSAhPSBOVUxMICYmIChzeW1ib2wtPmdldFN5bWJvbFdpZHRoKGUpID4gbWF4U2l6ZS0+Z2V0V2lkdGgoKSB8fCBzeW1ib2wtPmdldFN5bWJvbEhlaWdodChlKSA+IG1heFNpemUtPmdldEhlaWdodCgpKSkgew0KKyAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkYXRhQ29kZXdvcmRzIDw9IHN5bWJvbC0+bV9kYXRhQ2FwYWNpdHkpIHsNCisgICAgICAgICAgICByZXR1cm4gc3ltYm9sOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChmYWlsKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsRGF0YUNvZGV3b3JkczsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDQkNfU3ltYm9sSW5mbzo6Z2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICBjYXNlIDE2Og0KKyAgICAgICAgICAgIHJldHVybiA0Ow0KKyAgICAgICAgY2FzZSAzNjoNCisgICAgICAgICAgICByZXR1cm4gNjsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnM7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ0JDX1N5bWJvbEluZm86OmdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoRlhfSU5UMzIgJmUpDQorew0KKyAgICBzd2l0Y2ggKG1fZGF0YVJlZ2lvbnMpIHsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIGNhc2UgMTY6DQorICAgICAgICAgICAgcmV0dXJuIDQ7DQorICAgICAgICBjYXNlIDM2Og0KKyAgICAgICAgICAgIHJldHVybiA2Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RIYW5kbGVUaGlzTnVtYmVyT2ZEYXRhUmVnaW9uczsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sRGF0YVdpZHRoKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhlKSAqIG1fbWF0cml4V2lkdGg7DQorfQ0KK0ZYX0lOVDMyIENCQ19TeW1ib2xJbmZvOjpnZXRTeW1ib2xEYXRhSGVpZ2h0KEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoZSkgKiBtX21hdHJpeEhlaWdodDsNCit9DQorRlhfSU5UMzIgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbFdpZHRoKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgcmV0dXJuIGdldFN5bWJvbERhdGFXaWR0aChlKSArIChnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoZSkgKiAyKTsNCit9DQorRlhfSU5UMzIgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbEhlaWdodChGWF9JTlQzMiAmZSkNCit7DQorICAgIHJldHVybiBnZXRTeW1ib2xEYXRhSGVpZ2h0KGUpICsgKGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoZSkgKiAyKTsNCit9DQorRlhfSU5UMzIgQ0JDX1N5bWJvbEluZm86OmdldENvZGV3b3JkQ291bnQoKQ0KK3sNCisgICAgcmV0dXJuIG1fZGF0YUNhcGFjaXR5ICsgbV9lcnJvckNvZGV3b3JkczsNCit9DQorRlhfSU5UMzIgQ0JDX1N5bWJvbEluZm86OmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpDQorew0KKyAgICByZXR1cm4gbV9kYXRhQ2FwYWNpdHkgLyBtX3JzQmxvY2tEYXRhOw0KK30NCitGWF9JTlQzMiBDQkNfU3ltYm9sSW5mbzo6Z2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soRlhfSU5UMzIgaW5kZXgpDQorew0KKyAgICByZXR1cm4gbV9yc0Jsb2NrRGF0YTsNCit9DQorRlhfSU5UMzIgQ0JDX1N5bWJvbEluZm86OmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhGWF9JTlQzMiBpbmRleCkNCit7DQorICAgIHJldHVybiBtX3JzQmxvY2tFcnJvcjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1N5bWJvbEluZm86OnRvU3RyaW5nKEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQorICAgIHNiICs9IChGWF9MUFdTVFIpKG1fcmVjdGFuZ3VsYXIgPyAiUmVjdGFuZ3VsYXIgU3ltYm9sOiIgOiAiU3F1YXJlIFN5bWJvbDoiKTsNCisgICAgc2IgKz0gKEZYX0xQV1NUUikiIGRhdGEgcmVnaW9uICI7DQorICAgIHNiICs9IG1fbWF0cml4V2lkdGg7DQorICAgIHNiICs9IChGWF9XQ0hBUikneCc7DQorICAgIHNiICs9IG1fbWF0cml4SGVpZ2h0Ow0KKyAgICBzYiArPSAoRlhfTFBXU1RSKSIsIHN5bWJvbCBzaXplICI7DQorICAgIHNiICs9IGdldFN5bWJvbFdpZHRoKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX0xQV1NUUikiIik7DQorICAgIHNiICs9IChGWF9XQ0hBUikneCc7DQorICAgIHNiICs9IGdldFN5bWJvbEhlaWdodChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9MUFdTVFIpIiIpOw0KKyAgICBzYiArPSAoRlhfTFBXU1RSKSIsIHN5bWJvbCBkYXRhIHNpemUgIjsNCisgICAgc2IgKz0gZ2V0U3ltYm9sRGF0YVdpZHRoKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX0xQV1NUUikiIik7DQorICAgIHNiICs9IChGWF9XQ0hBUikneCc7DQorICAgIHNiICs9IGdldFN5bWJvbERhdGFIZWlnaHQoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfTFBXU1RSKSIiKTsNCisgICAgc2IgKz0gKEZYX0xQV1NUUikiLCBjb2Rld29yZHMgIjsNCisgICAgc2IgKz0gbV9kYXRhQ2FwYWNpdHk7DQorICAgIHNiICs9IChGWF9XQ0hBUiknKyc7DQorICAgIHNiICs9IG1fZXJyb3JDb2Rld29yZHM7DQorICAgIHJldHVybiBzYjsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1N5bWJvbFNoYXBlSGludC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfU3ltYm9sU2hhcGVIaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRhY2JmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1N5bWJvbFNoYXBlSGludC5jcHAKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1N5bWJvbFNoYXBlSGludC5oIg0KK0NCQ19TeW1ib2xTaGFwZUhpbnQ6OkNCQ19TeW1ib2xTaGFwZUhpbnQoKQ0KK3sNCit9DQorQ0JDX1N5bWJvbFNoYXBlSGludDo6fkNCQ19TeW1ib2xTaGFwZUhpbnQoKQ0KK3sNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1RleHRFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19UZXh0RW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3YTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19UZXh0RW5jb2Rlci5jcHAKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQzQwRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1RleHRFbmNvZGVyLmgiDQorQ0JDX1RleHRFbmNvZGVyOjpDQkNfVGV4dEVuY29kZXIoKQ0KK3sNCit9DQorQ0JDX1RleHRFbmNvZGVyOjp+Q0JDX1RleHRFbmNvZGVyKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENCQ19UZXh0RW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkNCit7DQorICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQorfQ0KK0ZYX0lOVDMyIENCQ19UZXh0RW5jb2Rlcjo6ZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyAmc2IsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgaWYgKGMgPT0gJyAnKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wzJzsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5Jykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDQ4ICsgNCk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA5NyArIDE0KTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmIChjID49ICdcMCcgJiYgYyA8PSAweDFmKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wwJzsNCisgICAgICAgIHNiICs9IGM7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBpZiAoYyA+PSAnIScgJiYgYyA8PSAnLycpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgJ1wxJzsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSAzMyk7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBpZiAoYyA+PSAnOicgJiYgYyA8PSAnQCcpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDU4ICsgMTUpOw0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgaWYgKGMgPj0gJ1snICYmIGMgPD0gJ18nKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpICdcMSc7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpIChjIC0gOTEgKyAyMik7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBpZiAoYyA9PSAweDAwNjApIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgJ1wyJzsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA5Nik7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDInOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDY1ICsgMSk7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBpZiAoYyA+PSAneycgJiYgYyA8PSAweDAwN2YpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDInOw0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDEyMyArIDI3KTsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGlmIChjID49IDB4MDA4MCkgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpMHgwMDFlOw0KKyAgICAgICAgRlhfSU5UMzIgbGVuID0gMjsNCisgICAgICAgIGxlbiArPSBlbmNvZGVDaGFyKChGWF9XQ0hBUikgKGMgLSAxMjgpLCBzYiwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICAgICAgcmV0dXJuIGxlbjsNCisgICAgfQ0KKyAgICBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aWxsZWdhbENoYXJhY3RlcihjLCBlKTsNCisgICAgcmV0dXJuIC0xOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVHdvRGltV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Ud29EaW1Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzgwMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVHdvRGltV3JpdGVyLmNwcApAQCAtMCwwICsxLDEzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1dyaXRlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1R3b0RpbVdyaXRlci5oIg0KK0NCQ19Ud29EaW1Xcml0ZXI6OkNCQ19Ud29EaW1Xcml0ZXIoKQ0KK3sNCisgICAgbV9pQ29ycmVjdExldmVsCQk9IDE7DQorICAgIG1fYkZpeGVkU2l6ZQkJPSBUUlVFOw0KKyAgICBtX291dHB1dCA9IE5VTEw7DQorfQ0KK0NCQ19Ud29EaW1Xcml0ZXI6On5DQkNfVHdvRGltV3JpdGVyKCkNCit7DQorICAgIGlmIChtX291dHB1dCAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9vdXRwdXQ7DQorICAgICAgICBtX291dHB1dCA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpDQorew0KKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgICBDRlhfUGF0aERhdGEgcGF0aDsNCisgICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBkZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBtYXRyaXgsICZzdGF0ZURhdGEsIG1fYmFja2dyb3VuZENvbG9yLCBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7DQorICAgIEZYX0lOVDMyIGxlZnRQb3MgPSAwOw0KKyAgICBGWF9JTlQzMiB0b3BQb3MgPSAwOw0KKyAgICBpZiAoIG1fYkZpeGVkU2l6ZSkgew0KKyAgICAgICAgbGVmdFBvcyA9IChtX1dpZHRoIC0gbV9vdXRwdXQtPkdldFdpZHRoKCkpIC8gMjsNCisgICAgICAgIHRvcFBvcyA9IChtX0hlaWdodCAtIG1fb3V0cHV0LT5HZXRIZWlnaHQoKSkgLyAyOw0KKyAgICB9DQorICAgIENGWF9NYXRyaXggbWF0cmkgPSAqbWF0cml4Ow0KKyAgICBpZiAobV9XaWR0aCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpICYmIG1fSGVpZ2h0IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpKSB7DQorICAgICAgICBDRlhfTWF0cml4IG1hdHJpU2NhbGUoKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldFdpZHRoKCksIDAuMCwgMC4wLCAoRlhfRkxPQVQpbV9IZWlnaHQgLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldEhlaWdodCgpLCAwLjAsIDAuMCk7DQorICAgICAgICBtYXRyaVNjYWxlLkNvbmNhdCgqbWF0cml4KTsNCisgICAgICAgIG1hdHJpID0gbWF0cmlTY2FsZTsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB5ID0gMDsgeSA8IG1fb3V0cHV0LT5HZXRIZWlnaHQoKTsgeSsrKSB7DQorICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHJlY3Q7DQorICAgICAgICAgICAgcmVjdC5BcHBlbmRSZWN0KChGWF9GTE9BVClsZWZ0UG9zICsgeCwgKEZYX0ZMT0FUKXRvcFBvcyArIHksIChGWF9GTE9BVCkobGVmdFBvcyArIHggKyAxKSwgKEZYX0ZMT0FUKSh0b3BQb3MgKyB5ICsgMSkpOw0KKyAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBzdGF0ZURhdGE7DQorICAgICAgICAgICAgaWYobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KKyAgICAgICAgICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZzdGF0ZURhdGEsIG1fYmFyQ29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJCaXRtYXBSZXN1bHQoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgRlhfSU5UMzImIGUpDQorew0KKyAgICBpZiAobV9iRml4ZWRTaXplKSB7DQorICAgICAgICBwT3V0Qml0bWFwID0gQ3JlYXRlRElCaXRtYXAobV9XaWR0aCwgbV9IZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcE91dEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKG1fb3V0cHV0LT5HZXRXaWR0aCgpLCBtX291dHB1dC0+R2V0SGVpZ2h0KCkpOw0KKyAgICB9DQorICAgIGlmICghcE91dEJpdG1hcCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRmFpbFRvQ3JlYXRlQml0bWFwOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBPdXRCaXRtYXAtPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgRlhfSU5UMzIgbGVmdFBvcyA9IDA7DQorICAgIEZYX0lOVDMyIHRvcFBvcyA9IDA7DQorICAgIGlmICggbV9iRml4ZWRTaXplKSB7DQorICAgICAgICBsZWZ0UG9zID0gKG1fV2lkdGggLSBtX291dHB1dC0+R2V0V2lkdGgoKSkgLyAyOw0KKyAgICAgICAgdG9wUG9zID0gKG1fSGVpZ2h0IC0gbV9vdXRwdXQtPkdldEhlaWdodCgpKSAvIDI7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiB4ID0gMDsgeCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpOyB4KyspIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KKyAgICAgICAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICAgICAgICAgIHBPdXRCaXRtYXAtPlNldFBpeGVsKGxlZnRQb3MgKyB4LCB0b3BQb3MgKyB5LCBtX2JhckNvbG9yKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFtX2JGaXhlZFNpemUpIHsNCisgICAgICAgIENGWF9ESUJpdG1hcCAqIHBTdHJldGNoQml0bWFwID0gcE91dEJpdG1hcC0+U3RyZXRjaFRvKG1fV2lkdGgsIG1fSGVpZ2h0KTsNCisgICAgICAgIGlmIChwT3V0Qml0bWFwKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBPdXRCaXRtYXA7DQorICAgICAgICB9DQorICAgICAgICBwT3V0Qml0bWFwID0gcFN0cmV0Y2hCaXRtYXA7DQorICAgIH0NCit9DQordm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoRlhfQllURSAqY29kZSwgRlhfSU5UMzIgY29kZVdpZHRoLCBGWF9JTlQzMiBjb2RlSGVpZ2h0LCBGWF9JTlQzMiAmZSkNCit7DQorICAgIEZYX0lOVDMyIGlucHV0V2lkdGggPSBjb2RlV2lkdGg7DQorICAgIEZYX0lOVDMyIGlucHV0SGVpZ2h0ID0gY29kZUhlaWdodDsNCisgICAgRlhfSU5UMzIgdGVtcFdpZHRoID0gaW5wdXRXaWR0aCArICgxIDw8IDEpOw0KKyAgICBGWF9JTlQzMiB0ZW1wSGVpZ2h0ID0gaW5wdXRIZWlnaHQgKyAoMSA8PCAxKTsNCisgICAgRlhfRkxPQVQgbW9kdWxlSFNpemUgPSAoRlhfRkxPQVQpRlhfTUlOKG1fTW9kdWxlV2lkdGgsIG1fTW9kdWxlSGVpZ2h0KTsNCisgICAgaWYgKG1vZHVsZUhTaXplID4gOCkgew0KKyAgICAgICAgbW9kdWxlSFNpemUgPSA4Ow0KKyAgICB9IGVsc2UgaWYgKG1vZHVsZUhTaXplIDwgMSkgew0KKyAgICAgICAgbW9kdWxlSFNpemUgPSAxOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG91dHB1dFdpZHRoID0gKEZYX0lOVDMyKUZYX01BWCh0ZW1wV2lkdGggKiBtb2R1bGVIU2l6ZSwgdGVtcFdpZHRoKTsNCisgICAgRlhfSU5UMzIgb3V0cHV0SGVpZ2h0ID0gKEZYX0lOVDMyKUZYX01BWCh0ZW1wSGVpZ2h0ICogbW9kdWxlSFNpemUsIHRlbXBIZWlnaHQpOw0KKyAgICBGWF9JTlQzMiBtdWx0aVggPSAxOw0KKyAgICBGWF9JTlQzMiBtdWx0aVkgPSAxOw0KKyAgICBpZiAobV9iRml4ZWRTaXplKSB7DQorICAgICAgICBpZiAobV9XaWR0aCA8IG91dHB1dFdpZHRoIHx8IG1fSGVpZ2h0IDwgb3V0cHV0SGVpZ2h0KSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX1dpZHRoID4gb3V0cHV0V2lkdGggfHwgbV9IZWlnaHQgPiBvdXRwdXRIZWlnaHQpIHsNCisgICAgICAgICAgICBvdXRwdXRXaWR0aCA9IChGWF9JTlQzMikob3V0cHV0V2lkdGggKiBjZWlsICggKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpb3V0cHV0V2lkdGgpKTsNCisgICAgICAgICAgICBvdXRwdXRIZWlnaHQgPSAoRlhfSU5UMzIpKG91dHB1dEhlaWdodCAqIGNlaWwgKCAoRlhfRkxPQVQpbV9IZWlnaHQgLyAoRlhfRkxPQVQpb3V0cHV0SGVpZ2h0KSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbXVsdGlYID0gKEZYX0lOVDMyKWNlaWwoKEZYX0ZMT0FUKW91dHB1dFdpZHRoIC8gKEZYX0ZMT0FUKXRlbXBXaWR0aCk7DQorICAgIG11bHRpWSA9IChGWF9JTlQzMiljZWlsKChGWF9GTE9BVClvdXRwdXRIZWlnaHQgLyAoRlhfRkxPQVQpIHRlbXBIZWlnaHQpOw0KKyAgICBpZiAobV9iRml4ZWRTaXplKSB7DQorICAgICAgICBtdWx0aVggPSBGWF9NSU4obXVsdGlYLCBtdWx0aVkpOw0KKyAgICAgICAgbXVsdGlZID0gbXVsdGlYOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGxlZnRQYWRkaW5nID0gKG91dHB1dFdpZHRoIC0gKGlucHV0V2lkdGggKiBtdWx0aVgpKSAvIDI7DQorICAgIEZYX0lOVDMyIHRvcFBhZGRpbmcgPSAob3V0cHV0SGVpZ2h0IC0gKGlucHV0SGVpZ2h0ICogbXVsdGlZKSkgLyAyOw0KKyAgICBpZiAobGVmdFBhZGRpbmcgPCAwKSB7DQorICAgICAgICBsZWZ0UGFkZGluZyA9IDA7DQorICAgIH0NCisgICAgaWYgKHRvcFBhZGRpbmcgPCAwKSB7DQorICAgICAgICB0b3BQYWRkaW5nID0gMDsNCisgICAgfQ0KKyAgICBtX291dHB1dCA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KKyAgICBtX291dHB1dC0+SW5pdChvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsNCisgICAgZm9yIChGWF9JTlQzMiBpbnB1dFkgPSAwLCBvdXRwdXRZID0gdG9wUGFkZGluZzsgKGlucHV0WSA8IGlucHV0SGVpZ2h0KSAmJiAob3V0cHV0WSA8IG91dHB1dEhlaWdodCAtIG11bHRpWSk7IGlucHV0WSsrLCBvdXRwdXRZICs9IG11bHRpWSkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpbnB1dFggPSAwLCBvdXRwdXRYID0gbGVmdFBhZGRpbmc7IChpbnB1dFggPCBpbnB1dFdpZHRoKSAmJiAob3V0cHV0WCA8IG91dHB1dFdpZHRoIC0gbXVsdGlYKTsgaW5wdXRYKyssIG91dHB1dFggKz0gbXVsdGlYKSB7DQorICAgICAgICAgICAgaWYgKGNvZGVbaW5wdXRYICsgaW5wdXRZICogaW5wdXRXaWR0aF0gPT0gMSkgew0KKyAgICAgICAgICAgICAgICBtX291dHB1dC0+U2V0UmVnaW9uKG91dHB1dFgsIG91dHB1dFksIG11bHRpWCwgbXVsdGlZLCBlKTsNCisgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5M2ZjNzkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KK0NCQ19VdGlsQ29kaW5nQ29udmVydDo6Q0JDX1V0aWxDb2RpbmdDb252ZXJ0KCkNCit7DQorfQ0KK0NCQ19VdGlsQ29kaW5nQ29udmVydDo6fkNCQ19VdGlsQ29kaW5nQ29udmVydCgpDQorew0KK30NCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZzcmMsIENGWF9CeXRlU3RyaW5nICZkc3QpDQorew0KKyAgICBkc3QuQ29udmVydEZyb20oc3JjKTsNCit9DQordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyAmc3JjLCBDRlhfQnl0ZVN0cmluZyAmZHN0KQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLCBzcmMuR2V0TGVuZ3RoKCkpOw0KKyAgICBkc3QgPSB1bmljb2RlLlVURjhFbmNvZGUoKTsNCit9DQordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyAmc3JjLCBDRlhfQnl0ZUFycmF5ICZkc3QpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzcmMsIHNyYy5HZXRMZW5ndGgoKSk7DQorICAgIENGWF9CeXRlU3RyaW5nIHV0ZjggPSB1bmljb2RlLlVURjhFbmNvZGUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHV0ZjguR2V0TGVuZ3RoKCk7IGkgKyspIHsNCisgICAgICAgIGRzdC5BZGQodXRmOFtpXSk7DQorICAgIH0NCit9DQordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlV0ZjhUb0xvY2FsZShjb25zdCBDRlhfQnl0ZUFycmF5ICZzcmMsIENGWF9CeXRlU3RyaW5nICZkc3QpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyB1dGY4Ow0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc3JjLkdldFNpemUoKTsgaSArKykgew0KKyAgICAgICAgdXRmOCArPSBzcmNbaV07DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCh1dGY4LCB1dGY4LkdldExlbmd0aCgpKTsNCisgICAgZHN0LkNvbnZlcnRGcm9tKHVuaWNvZGUpOw0KK30NCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VXRmOFRvTG9jYWxlKGNvbnN0IEZYX0JZVEUgKnNyYywgRlhfSU5UMzIgY291bnQsIENGWF9CeXRlU3RyaW5nICZkc3QpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChjb25zdCBjaGFyKilzcmMsIGNvdW50KTsNCisgICAgZHN0LkNvbnZlcnRGcm9tKHVuaWNvZGUpOw0KK30NCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyAmc3JjLCBDRlhfQnl0ZVN0cmluZyAmZHN0KQ0KK3sNCisgICAgZHN0ID0gc3JjLlVURjhFbmNvZGUoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1V0aWxSU1MuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1V0aWxSU1MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTA2OGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvQkNfVXRpbFJTUy5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19VdGlsUlNTLmgiDQorQ0JDX1V0aWxSU1M6OkNCQ19VdGlsUlNTKCkNCit7DQorfQ0KK0NCQ19VdGlsUlNTOjp+Q0JDX1V0aWxSU1MoKQ0KK3sNCit9DQorQ0ZYX0ludDMyQXJyYXkgKkNCQ19VdGlsUlNTOjpHZXRSc3NXaWR0aHMoRlhfSU5UMzIgdmFsLCBGWF9JTlQzMiBuLCBGWF9JTlQzMiBlbGVtZW50cywgRlhfSU5UMzIgbWF4V2lkdGgsIEZYX0JPT0wgbm9OYXJyb3cpDQorew0KKyAgICBDRlhfSW50MzJBcnJheSAqaVRlbXAgPSAgRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICBpVGVtcC0+U2V0U2l6ZShlbGVtZW50cyk7DQorICAgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5ID4gd2lkdGhzKGlUZW1wKTsNCisgICAgRlhfSU5UMzIgYmFyOw0KKyAgICBGWF9JTlQzMiBuYXJyb3dNYXNrID0gMDsNCisgICAgZm9yIChiYXIgPSAwOyBiYXIgPCBlbGVtZW50cyAtIDE7IGJhcisrKSB7DQorICAgICAgICBuYXJyb3dNYXNrIHw9ICgxIDw8IGJhcik7DQorICAgICAgICBGWF9JTlQzMiBlbG1XaWR0aCA9IDE7DQorICAgICAgICBGWF9JTlQzMiBzdWJWYWw7DQorICAgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgICAgIHN1YlZhbCA9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gMSwgZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICAgICAgICBpZiAobm9OYXJyb3cgJiYgKG5hcnJvd01hc2sgPT0gMCkgJiYNCisgICAgICAgICAgICAgICAgICAgIChuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIgLSAxKSA+PSBlbGVtZW50cyAtIGJhciAtIDEpKSB7DQorICAgICAgICAgICAgICAgIHN1YlZhbCAtPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciksIGVsZW1lbnRzIC0gYmFyIC0gMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChlbGVtZW50cyAtIGJhciAtIDEgPiAxKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGxlc3NWYWwgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIG14d0VsZW1lbnQgPSBuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBteHdFbGVtZW50ID4gbWF4V2lkdGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgbXh3RWxlbWVudC0tKSB7DQorICAgICAgICAgICAgICAgICAgICBsZXNzVmFsICs9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gbXh3RWxlbWVudCAtIDEsIGVsZW1lbnRzIC0gYmFyIC0gMyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3ViVmFsIC09IGxlc3NWYWwgKiAoZWxlbWVudHMgLSAxIC0gYmFyKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gLSBlbG1XaWR0aCA+IG1heFdpZHRoKSB7DQorICAgICAgICAgICAgICAgIHN1YlZhbC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB2YWwgLT0gc3ViVmFsOw0KKyAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbG1XaWR0aCsrOw0KKyAgICAgICAgICAgIG5hcnJvd01hc2sgJj0gfigxIDw8IGJhcik7DQorICAgICAgICB9DQorICAgICAgICB2YWwgKz0gc3ViVmFsOw0KKyAgICAgICAgbiAtPSBlbG1XaWR0aDsNCisgICAgICAgICgqd2lkdGhzKVtiYXJdID0gZWxtV2lkdGg7DQorICAgIH0NCisgICAgKCp3aWR0aHMpW2Jhcl0gPSBuOw0KKyAgICByZXR1cm4gd2lkdGhzLnJlbGVhc2UoKTsNCit9DQorRlhfSU5UMzIgQ0JDX1V0aWxSU1M6OkdldFJTU3ZhbHVlKENGWF9JbnQzMkFycmF5ICZ3aWR0aHMsIEZYX0lOVDMyIG1heFdpZHRoLCBGWF9CT09MIG5vTmFycm93KQ0KK3sNCisgICAgRlhfSU5UMzIgZWxlbWVudHMgPSB3aWR0aHMuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBuID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGVsZW1lbnRzOyBpKyspIHsNCisgICAgICAgIG4gKz0gd2lkdGhzW2ldOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIHZhbCA9IDA7DQorICAgIEZYX0lOVDMyIG5hcnJvd01hc2sgPSAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGJhciA9IDA7IGJhciA8IGVsZW1lbnRzIC0gMTsgYmFyKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGVsbVdpZHRoOw0KKyAgICAgICAgZm9yIChlbG1XaWR0aCA9IDEsIG5hcnJvd01hc2sgfD0gKDEgPDwgYmFyKTsNCisgICAgICAgICAgICAgICAgZWxtV2lkdGggPCB3aWR0aHNbYmFyXTsNCisgICAgICAgICAgICAgICAgZWxtV2lkdGgrKywgbmFycm93TWFzayAmPSB+KDEgPDwgYmFyKSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIHN1YlZhbCA9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gMSwgZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICAgICAgICBpZiAobm9OYXJyb3cgJiYgKG5hcnJvd01hc2sgPT0gMCkgJiYNCisgICAgICAgICAgICAgICAgICAgIChuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIgLSAxKSA+PSBlbGVtZW50cyAtIGJhciAtIDEpKSB7DQorICAgICAgICAgICAgICAgIHN1YlZhbCAtPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIC0gYmFyIC0gMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChlbGVtZW50cyAtIGJhciAtIDEgPiAxKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGxlc3NWYWwgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIG14d0VsZW1lbnQgPSBuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBteHdFbGVtZW50ID4gbWF4V2lkdGg7IG14d0VsZW1lbnQtLSkgew0KKyAgICAgICAgICAgICAgICAgICAgbGVzc1ZhbCArPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIG14d0VsZW1lbnQgLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIC0gYmFyIC0gMyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3ViVmFsIC09IGxlc3NWYWwgKiAoZWxlbWVudHMgLSAxIC0gYmFyKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gLSBlbG1XaWR0aCA+IG1heFdpZHRoKSB7DQorICAgICAgICAgICAgICAgIHN1YlZhbC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB2YWwgKz0gc3ViVmFsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbiAtPSBlbG1XaWR0aDsNCisgICAgfQ0KKyAgICByZXR1cm4gdmFsOw0KK30NCitGWF9JTlQzMiBDQkNfVXRpbFJTUzo6Q29tYmlucyhGWF9JTlQzMiBuLCBGWF9JTlQzMiByKQ0KK3sNCisgICAgRlhfSU5UMzIgbWF4RGVub207DQorICAgIEZYX0lOVDMyIG1pbkRlbm9tOw0KKyAgICBpZiAobiAtIHIgPiByKSB7DQorICAgICAgICBtaW5EZW5vbSA9IHI7DQorICAgICAgICBtYXhEZW5vbSA9IG4gLSByOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbWluRGVub20gPSBuIC0gcjsNCisgICAgICAgIG1heERlbm9tID0gcjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiB2YWwgPSAxOw0KKyAgICBGWF9JTlQzMiBqID0gMTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gbjsgaSA+IG1heERlbm9tOyBpLS0pIHsNCisgICAgICAgIHZhbCAqPSBpOw0KKyAgICAgICAgaWYgKGogPD0gbWluRGVub20pIHsNCisgICAgICAgICAgICB2YWwgLz0gajsNCisgICAgICAgICAgICBqKys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgd2hpbGUgKGogPD0gbWluRGVub20pIHsNCisgICAgICAgIHZhbCAvPSBqOw0KKyAgICAgICAgaisrOw0KKyAgICB9DQorICAgIHJldHVybiB2YWw7DQorfQ0KK0NGWF9JbnQzMkFycmF5ICpDQkNfVXRpbFJTUzo6RWxlbWVudHMoQ0ZYX0ludDMyQXJyYXkgJmVEaXN0LCBGWF9JTlQzMiBOLCBGWF9JTlQzMiBLKQ0KK3sNCisgICAgQ0ZYX0ludDMyQXJyYXkgKndpZHRocyA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgICAgd2lkdGhzLT5TZXRTaXplKGVEaXN0LkdldFNpemUoKSArIDIpOw0KKyAgICBGWF9JTlQzMiB0d29LID0gSyA8PCAxOw0KKyAgICAoKndpZHRocylbMF0gPSAxOw0KKyAgICBGWF9JTlQzMiBpOw0KKyAgICBGWF9JTlQzMiBtaW5FdmVuID0gMTA7DQorICAgIEZYX0lOVDMyIGJhclN1bSA9IDE7DQorICAgIGZvciAoaSA9IDE7IGkgPCB0d29LIC0gMjsgaSArPSAyKSB7DQorICAgICAgICAoKndpZHRocylbaV0gPSBlRGlzdFtpIC0gMV0gLSAoKndpZHRocylbaSAtIDFdOw0KKyAgICAgICAgKCp3aWR0aHMpW2kgKyAxXSA9IGVEaXN0W2ldIC0gKCp3aWR0aHMpW2ldOw0KKyAgICAgICAgYmFyU3VtICs9ICgqd2lkdGhzKVtpXSArICgqd2lkdGhzKVtpICsgMV07DQorICAgICAgICBpZiAoKCp3aWR0aHMpW2ldIDwgbWluRXZlbikgew0KKyAgICAgICAgICAgIG1pbkV2ZW4gPSAoKndpZHRocylbaV07DQorICAgICAgICB9DQorICAgIH0NCisgICAgKCp3aWR0aHMpW3R3b0sgLSAxXSA9IE4gLSBiYXJTdW07DQorICAgIGlmICgoKndpZHRocylbdHdvSyAtIDFdIDwgbWluRXZlbikgew0KKyAgICAgICAgbWluRXZlbiA9ICgqd2lkdGhzKVt0d29LIC0gMV07DQorICAgIH0NCisgICAgaWYgKG1pbkV2ZW4gPiAxKSB7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHdvSzsgaSArPSAyKSB7DQorICAgICAgICAgICAgKCp3aWR0aHMpW2ldICs9IG1pbkV2ZW4gLSAxOw0KKyAgICAgICAgICAgICgqd2lkdGhzKVtpICsgMV0gLT0gbWluRXZlbiAtIDE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHdpZHRoczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1V0aWxzLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwNGViZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19VdGlscy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KK0ZYX0JPT0wgQkNfRlhfQnl0ZVN0cmluZ19SZXBsYWNlKENGWF9CeXRlU3RyaW5nICZkc3QsIEZYX0RXT1JEIGZpcnN0LCBGWF9EV09SRCBsYXN0LCBGWF9JTlQzMiBjb3VudCwgRlhfQ0hBUiBjKQ0KK3sNCisgICAgaWYgKGZpcnN0ID4gbGFzdCB8fCBjb3VudCA8PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgZHN0LkRlbGV0ZShmaXJzdCwgbGFzdCAtIGZpcnN0KTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7DQorICAgICAgICBkc3QuSW5zZXJ0KDAsIGMpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nICZkc3QsIEZYX0lOVDMyIGNvdW50LCBGWF9DSEFSIGMpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsNCisgICAgICAgIGRzdCArPSBjOw0KKyAgICB9DQorfQ0KK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcgJmRzdCwgY29uc3QgQ0ZYX0J5dGVBcnJheSAmYmEpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYmEuR2V0U2l6ZSgpOyBpICsrKSB7DQorICAgICAgICBkc3QgKz0gYmFbaV07DQorICAgIH0NCit9DQordm9pZCBCQ19GWF9QdHJBcnJheV9Tb3J0KENGWF9QdHJBcnJheSAmc3JjLCBCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjayBmdW4pDQorew0KKyAgICBGWF9JTlQzMiBuTGVuZ3RoID0gc3JjLkdldFNpemUoKTsNCisgICAgRlhfQk9PTCBjaGFuZ2VkID0gdHJ1ZTsNCisgICAgZG8gew0KKyAgICAgICAgY2hhbmdlZCA9IGZhbHNlOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5MZW5ndGggLSAxOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoIGZ1bihzcmNbaSArIDFdLCBzcmNbaV0pICkgew0KKyAgICAgICAgICAgICAgICB2b2lkICp0ZW1wID0gc3JjW2ldOw0KKyAgICAgICAgICAgICAgICBzcmMuU2V0QXQoaSwgc3JjW2kgKyAxXSk7DQorICAgICAgICAgICAgICAgIHNyYy5TZXRBdChpICsgMSwgdGVtcCk7DQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoY2hhbmdlZCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ2Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMjI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgiDQorY29uc3QgRlhfSU5UMzIgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OklOSVRfU0laRSA9IDMwOw0KK2NvbnN0IEZYX0lOVDMyIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpDT1JSID0gMTsNCitDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Q0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UpDQorew0KKyAgICBtX2ltYWdlID0gaW1hZ2U7DQorICAgIG1faGVpZ2h0ID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgICBtX3dpZHRoID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICAgIG1fbGVmdEluaXQgPSAobV93aWR0aCAtIElOSVRfU0laRSkgPj4gMTsNCisgICAgbV9yaWdodEluaXQgPSAobV93aWR0aCArIElOSVRfU0laRSkgPj4gMTsNCisgICAgbV91cEluaXQgPSAobV9oZWlnaHQgLSBJTklUX1NJWkUpID4+IDE7DQorICAgIG1fZG93bkluaXQgPSAobV9oZWlnaHQgKyBJTklUX1NJWkUpID4+IDE7DQorfQ0KK3ZvaWQgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkluaXQoRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAobV91cEluaXQgPCAwIHx8IG1fbGVmdEluaXQgPCAwIHx8IG1fZG93bkluaXQgPj0gbV9oZWlnaHQgfHwgbV9yaWdodEluaXQgPj0gbV93aWR0aCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KK30NCitDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Q0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsIEZYX0lOVDMyIGluaXRTaXplLCBGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KQ0KK3sNCisgICAgbV9pbWFnZSA9IGltYWdlOw0KKyAgICBtX2hlaWdodCA9IGltYWdlLT5HZXRIZWlnaHQoKTsNCisgICAgbV93aWR0aCA9IGltYWdlLT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBoYWxmc2l6ZSA9IGluaXRTaXplID4+IDE7DQorICAgIG1fbGVmdEluaXQgPSB4IC0gaGFsZnNpemU7DQorICAgIG1fcmlnaHRJbml0ID0geCArIGhhbGZzaXplOw0KKyAgICBtX3VwSW5pdCA9IHkgLSBoYWxmc2l6ZTsNCisgICAgbV9kb3duSW5pdCA9IHkgKyBoYWxmc2l6ZTsNCit9DQorQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6On5DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigpDQorew0KK30NCitDRlhfUHRyQXJyYXkgKkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpEZXRlY3QoRlhfSU5UMzIgJmUpDQorew0KKyAgICBGWF9JTlQzMiBsZWZ0ID0gbV9sZWZ0SW5pdDsNCisgICAgRlhfSU5UMzIgcmlnaHQgPSBtX3JpZ2h0SW5pdDsNCisgICAgRlhfSU5UMzIgdXAgPSBtX3VwSW5pdDsNCisgICAgRlhfSU5UMzIgZG93biA9IG1fZG93bkluaXQ7DQorICAgIEZYX0JPT0wgc2l6ZUV4Y2VlZGVkID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCisgICAgRlhfQk9PTCBhdExlYXN0T25lQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBGQUxTRTsNCisgICAgd2hpbGUgKGFCbGFja1BvaW50Rm91bmRPbkJvcmRlcikgew0KKyAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gRkFMU0U7DQorICAgICAgICBGWF9CT09MIHJpZ2h0Qm9yZGVyTm90V2hpdGUgPSBUUlVFOw0KKyAgICAgICAgd2hpbGUgKHJpZ2h0Qm9yZGVyTm90V2hpdGUgJiYgcmlnaHQgPCBtX3dpZHRoKSB7DQorICAgICAgICAgICAgcmlnaHRCb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludCh1cCwgZG93biwgcmlnaHQsIEZBTFNFKTsNCisgICAgICAgICAgICBpZiAocmlnaHRCb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgICAgICAgICByaWdodCsrOw0KKyAgICAgICAgICAgICAgICBhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChyaWdodCA+PSBtX3dpZHRoKSB7DQorICAgICAgICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYm90dG9tQm9yZGVyTm90V2hpdGUgPSBUUlVFOw0KKyAgICAgICAgd2hpbGUgKGJvdHRvbUJvcmRlck5vdFdoaXRlICYmIGRvd24gPCBtX2hlaWdodCkgew0KKyAgICAgICAgICAgIGJvdHRvbUJvcmRlck5vdFdoaXRlID0gQ29udGFpbnNCbGFja1BvaW50KGxlZnQsIHJpZ2h0LCBkb3duLCBUUlVFKTsNCisgICAgICAgICAgICBpZiAoYm90dG9tQm9yZGVyTm90V2hpdGUpIHsNCisgICAgICAgICAgICAgICAgZG93bisrOw0KKyAgICAgICAgICAgICAgICBhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChkb3duID49IG1faGVpZ2h0KSB7DQorICAgICAgICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgbGVmdEJvcmRlck5vdFdoaXRlID0gVFJVRTsNCisgICAgICAgIHdoaWxlIChsZWZ0Qm9yZGVyTm90V2hpdGUgJiYgbGVmdCA+PSAwKSB7DQorICAgICAgICAgICAgbGVmdEJvcmRlck5vdFdoaXRlID0gQ29udGFpbnNCbGFja1BvaW50KHVwLCBkb3duLCBsZWZ0LCBGQUxTRSk7DQorICAgICAgICAgICAgaWYgKGxlZnRCb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgICAgICAgICBsZWZ0LS07DQorICAgICAgICAgICAgICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGxlZnQgPCAwKSB7DQorICAgICAgICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgdG9wQm9yZGVyTm90V2hpdGUgPSBUUlVFOw0KKyAgICAgICAgd2hpbGUgKHRvcEJvcmRlck5vdFdoaXRlICYmIHVwID49IDApIHsNCisgICAgICAgICAgICB0b3BCb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludChsZWZ0LCByaWdodCwgdXAsIFRSVUUpOw0KKyAgICAgICAgICAgIGlmICh0b3BCb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgICAgICAgICB1cC0tOw0KKyAgICAgICAgICAgICAgICBhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh1cCA8IDApIHsNCisgICAgICAgICAgICBzaXplRXhjZWVkZWQgPSBUUlVFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFCbGFja1BvaW50Rm91bmRPbkJvcmRlcikgew0KKyAgICAgICAgICAgIGF0TGVhc3RPbmVCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFzaXplRXhjZWVkZWQgJiYgYXRMZWFzdE9uZUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyKSB7DQorICAgICAgICBGWF9JTlQzMiBtYXhTaXplID0gcmlnaHQgLSBsZWZ0Ow0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB6KE5VTEwpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IG1heFNpemU7IGkrKykgew0KKyAgICAgICAgICAgIHogPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KEdldEJsYWNrUG9pbnRPblNlZ21lbnQoKEZYX0ZMT0FUKWxlZnQsIChGWF9GTE9BVCkoZG93biAtIGkpLCAoRlhfRkxPQVQpKGxlZnQgKyBpKSwgKEZYX0ZMT0FUKShkb3duKSkgKTsNCisgICAgICAgICAgICBpZiAoei5nZXQoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh6LmdldCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB9DQorICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IHQoTlVMTCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAxOyBqIDwgbWF4U2l6ZTsgaisrKSB7DQorICAgICAgICAgICAgdCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oR2V0QmxhY2tQb2ludE9uU2VnbWVudCgoRlhfRkxPQVQpbGVmdCwgKEZYX0ZMT0FUKSh1cCArIGopLCAoRlhfRkxPQVQpKGxlZnQgKyBqKSwgKEZYX0ZMT0FUKXVwKSk7DQorICAgICAgICAgICAgaWYgKHQuZ2V0KCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAodC5nZXQoKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB4KE5VTEwpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBrID0gMTsgayA8IG1heFNpemU7IGsrKykgew0KKyAgICAgICAgICAgIHggPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KEdldEJsYWNrUG9pbnRPblNlZ21lbnQoKEZYX0ZMT0FUKXJpZ2h0LCAoRlhfRkxPQVQpKHVwICsgayksIChGWF9GTE9BVCkocmlnaHQgLSBrKSwgKEZYX0ZMT0FUKXVwKSk7DQorICAgICAgICAgICAgaWYgKHguZ2V0KCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoeC5nZXQoKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB5KE5VTEwpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBtID0gMTsJbSA8IG1heFNpemU7IG0rKykgew0KKyAgICAgICAgICAgIHkgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KEdldEJsYWNrUG9pbnRPblNlZ21lbnQoKEZYX0ZMT0FUKXJpZ2h0LCAoRlhfRkxPQVQpKGRvd24gLSBtKSwgKEZYX0ZMT0FUKShyaWdodCAtIG0pLCAoRlhfRkxPQVQpIGRvd24pKTsNCisgICAgICAgICAgICBpZiAoeS5nZXQoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh5LmdldCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gQ2VudGVyRWRnZXMoeS5nZXQoKSwgei5nZXQoKSwgeC5nZXQoKSwgdC5nZXQoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OlJvdW5kKEZYX0ZMT0FUIGQpDQorew0KKyAgICByZXR1cm4gKEZYX0lOVDMyKSAoZCArIDAuNWYpOw0KK30NCitDQkNfUmVzdWx0UG9pbnQgKkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpHZXRCbGFja1BvaW50T25TZWdtZW50KEZYX0ZMT0FUIGFYLCBGWF9GTE9BVCBhWSwgRlhfRkxPQVQgYlgsIEZYX0ZMT0FUIGJZKQ0KK3sNCisgICAgRlhfSU5UMzIgZGlzdCA9IERpc3RhbmNlTDIoYVgsIGFZLCBiWCwgYlkpOw0KKyAgICBmbG9hdCB4U3RlcCA9IChiWCAtIGFYKSAvIGRpc3Q7DQorICAgIGZsb2F0IHlTdGVwID0gKGJZIC0gYVkpIC8gZGlzdDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGRpc3Q7IGkrKykgew0KKyAgICAgICAgRlhfSU5UMzIgeCA9IFJvdW5kKGFYICsgaSAqIHhTdGVwKTsNCisgICAgICAgIEZYX0lOVDMyIHkgPSBSb3VuZChhWSArIGkgKiB5U3RlcCk7DQorICAgICAgICBpZiAobV9pbWFnZS0+R2V0KHgsIHkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCkgeSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0lOVDMyIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpEaXN0YW5jZUwyKEZYX0ZMT0FUIGFYLCBGWF9GTE9BVCBhWSwgRlhfRkxPQVQgYlgsIEZYX0ZMT0FUIGJZKQ0KK3sNCisgICAgZmxvYXQgeERpZmYgPSBhWCAtIGJYOw0KKyAgICBmbG9hdCB5RGlmZiA9IGFZIC0gYlk7DQorICAgIHJldHVybiBSb3VuZCgoZmxvYXQpc3FydCh4RGlmZiAqIHhEaWZmICsgeURpZmYgKiB5RGlmZikpOw0KK30NCitDRlhfUHRyQXJyYXkgKkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpDZW50ZXJFZGdlcyhDQkNfUmVzdWx0UG9pbnQgKnksIENCQ19SZXN1bHRQb2ludCAqeiwgQ0JDX1Jlc3VsdFBvaW50ICp4LCBDQkNfUmVzdWx0UG9pbnQgKnQpDQorew0KKyAgICBmbG9hdCB5aSA9IHktPkdldFgoKTsNCisgICAgZmxvYXQgeWogPSB5LT5HZXRZKCk7DQorICAgIGZsb2F0IHppID0gei0+R2V0WCgpOw0KKyAgICBmbG9hdCB6aiA9IHotPkdldFkoKTsNCisgICAgZmxvYXQgeGkgPSB4LT5HZXRYKCk7DQorICAgIGZsb2F0IHhqID0geC0+R2V0WSgpOw0KKyAgICBmbG9hdCB0aSA9IHQtPkdldFgoKTsNCisgICAgZmxvYXQgdGogPSB0LT5HZXRZKCk7DQorICAgIGlmICh5aSA8IG1fd2lkdGggLyAyKSB7DQorICAgICAgICBDRlhfUHRyQXJyYXkgKnJlc3VsdCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgICAgICByZXN1bHQtPlNldFNpemUoNCk7DQorICAgICAgICAoKnJlc3VsdClbMF0gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRpIC0gQ09SUiwgdGogKyBDT1JSKTsNCisgICAgICAgICgqcmVzdWx0KVsxXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoemkgKyBDT1JSLCB6aiArIENPUlIpOw0KKyAgICAgICAgKCpyZXN1bHQpWzJdID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh4aSAtIENPUlIsIHhqIC0gQ09SUik7DQorICAgICAgICAoKnJlc3VsdClbM10gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHlpICsgQ09SUiwgeWogLSBDT1JSKTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfUHRyQXJyYXkgKnJlc3VsdCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgICAgICByZXN1bHQtPlNldFNpemUoNCk7DQorICAgICAgICAoKnJlc3VsdClbMF0gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRpICsgQ09SUiwgdGogKyBDT1JSKTsNCisgICAgICAgICgqcmVzdWx0KVsxXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoemkgKyBDT1JSLCB6aiAtIENPUlIpOw0KKyAgICAgICAgKCpyZXN1bHQpWzJdID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh4aSAtIENPUlIsIHhqICsgQ09SUik7DQorICAgICAgICAoKnJlc3VsdClbM10gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHlpIC0gQ09SUiwgeWogLSBDT1JSKTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCit9DQorRlhfQk9PTCBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Q29udGFpbnNCbGFja1BvaW50KEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIsIEZYX0lOVDMyIGZpeGVkLCBGWF9CT09MIGhvcml6b250YWwpDQorew0KKyAgICBpZiAoaG9yaXpvbnRhbCkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB4ID0gYTsgeCA8PSBiOyB4KyspIHsNCisgICAgICAgICAgICBpZiAobV9pbWFnZS0+R2V0KHgsIGZpeGVkKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIHkgPSBhOyB5IDw9IGI7IHkrKykgew0KKyAgICAgICAgICAgIGlmIChtX2ltYWdlLT5HZXQoZml4ZWQsIHkpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Xcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3MmM5NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19Xcml0ZXIuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19Xcml0ZXIuaCINCitDQkNfV3JpdGVyOjpDQkNfV3JpdGVyKCkNCit7DQorICAgIG1fQ2hhckVuY29kaW5nCQk9IDA7DQorICAgIG1fTW9kdWxlSGVpZ2h0CQk9IDE7DQorICAgIG1fTW9kdWxlV2lkdGgJCT0gMTsNCisgICAgbV9IZWlnaHQJCQk9IDMyMDsNCisgICAgbV9XaWR0aAkJCQk9IDY0MDsNCisgICAgbV9jb2xvclNwYWNlCQk9IEZYRElCX0FyZ2I7DQorICAgIG1fYmFyQ29sb3IJCQk9IDB4ZmYwMDAwMDA7DQorICAgIG1fYmFja2dyb3VuZENvbG9yCT0gMHhmZmZmZmZmZjsNCit9DQorQ0JDX1dyaXRlcjo6fkNCQ19Xcml0ZXIoKQ0KK3sNCit9DQorRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRDaGFyRW5jb2RpbmcoRlhfSU5UMzIgZW5jb2RpbmcpDQorew0KKyAgICBtX0NoYXJFbmNvZGluZyA9IGVuY29kaW5nOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVIZWlnaHQoRlhfSU5UMzIgbW9kdWxlSGVpZ2h0KQ0KK3sNCisgICAgaWYgKG1vZHVsZUhlaWdodCA+IDEwIHx8IG1vZHVsZUhlaWdodCA8IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX01vZHVsZUhlaWdodCA9IG1vZHVsZUhlaWdodDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX1dyaXRlcjo6U2V0TW9kdWxlV2lkdGgoRlhfSU5UMzIgbW9kdWxlV2lkdGgpDQorew0KKyAgICBpZiAoIG1vZHVsZVdpZHRoID4gMTAgfHwgbW9kdWxlV2lkdGggPCAxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9Nb2R1bGVXaWR0aCA9IG1vZHVsZVdpZHRoOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRIZWlnaHQoRlhfSU5UMzIgaGVpZ2h0KQ0KK3sNCisgICAgbV9IZWlnaHQgPSBoZWlnaHQ7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Xcml0ZXI6OlNldFdpZHRoKEZYX0lOVDMyIHdpZHRoKQ0KK3sNCisgICAgbV9XaWR0aCA9IHdpZHRoOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQkNfV3JpdGVyOjpTZXRCYWNrZ3JvdW5kQ29sb3IoRlhfQVJHQiBiYWNrZ3JvdW5kQ29sb3IpDQorew0KKyAgICBtX2JhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsNCit9DQordm9pZCBDQkNfV3JpdGVyOjpTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpDQorew0KKyAgICBtX2JhckNvbG9yID0gZm9yZWdyb3VuZENvbG9yOw0KK30NCitDRlhfRElCaXRtYXAqIENCQ19Xcml0ZXI6OkNyZWF0ZURJQml0bWFwKEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQpDQorew0KKyAgICBDRlhfRElCaXRtYXAgKnBESUJpdG1hcCA9IE5VTEw7DQorICAgIHBESUJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7DQorICAgIGlmKHBESUJpdG1hcCAhPSBOVUxMKSB7DQorICAgICAgICBwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX2NvbG9yU3BhY2UpOw0KKyAgICB9DQorICAgIHJldHVybiBwRElCaXRtYXA7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19YMTJFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9CQ19YMTJFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU4N2MzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL0JDX1gxMkVuY29kZXIuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfU3ltYm9sU2hhcGVIaW50LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgImluY2x1ZGUvQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL0JDX0M0MEVuY29kZXIuaCINCisjaW5jbHVkZSAiaW5jbHVkZS9CQ19YMTJFbmNvZGVyLmgiDQorQ0JDX1gxMkVuY29kZXI6OkNCQ19YMTJFbmNvZGVyKCkNCit7DQorfQ0KK0NCQ19YMTJFbmNvZGVyOjp+Q0JDX1gxMkVuY29kZXIoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ0JDX1gxMkVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpDQorew0KKyAgICByZXR1cm4gWDEyX0VOQ09EQVRJT047DQorfQ0KK3ZvaWQgQ0JDX1gxMkVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KKyAgICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KKyAgICAgICAgY29udGV4dC5tX3BvcysrOw0KKyAgICAgICAgZW5jb2RlQ2hhcihjLCBidWZmZXIsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKChjb3VudCAlIDMpID09IDApIHsNCisgICAgICAgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7DQorICAgICAgICAgICAgRlhfSU5UMzIgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsNCisgICAgICAgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KKyAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UobmV3TW9kZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsNCit9DQordm9pZCBDQkNfWDEyRW5jb2Rlcjo6aGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKTsNCisgICAgRlhfSU5UMzIgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChjb3VudCA9PSAyKSB7DQorICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlgxMl9VTkxBVENIKTsNCisgICAgICAgIGNvbnRleHQubV9wb3MgLT0gMjsNCisgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCisgICAgfSBlbHNlIGlmIChjb3VudCA9PSAxKSB7DQorICAgICAgICBjb250ZXh0Lm1fcG9zLS07DQorICAgICAgICBpZiAoYXZhaWxhYmxlID4gMSkgew0KKyAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6WDEyX1VOTEFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENCQ19YMTJFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nICZzYiwgRlhfSU5UMzIgJmUpDQorew0KKyAgICBpZiAoYyA9PSAnXHInKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wwJzsNCisgICAgfSBlbHNlIGlmIChjID09ICcqJykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDInOw0KKyAgICB9IGVsc2UgaWYgKGMgPT0gJyAnKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wzJzsNCisgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5Jykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDQ4ICsgNCk7DQorICAgIH0gZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsNCisgICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA2NSArIDE0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKGMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2JhcmNvZGUuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9iYXJjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhZDIxMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9iYXJjb2RlLmgKQEAgLTAsMCArMSw4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJpbmNsdWRlL3V0aWxzLmgiDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQVNDSUlFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19BU0NJSUVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ4Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQVNDSUlFbmNvZGVyLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19BU0NJSUVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19BU0NJSUVOQ09ERVJfSF8NCitjbGFzcyBDQkNfRW5jb2RlcjsNCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQ7DQorY2xhc3MgQ0JDX0FTQ0lJRW5jb2RlcjsNCitjbGFzcyBDQkNfQVNDSUlFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0FTQ0lJRW5jb2RlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQVNDSUlFbmNvZGVyKCk7DQorICAgIEZYX0lOVDMyIGdldEVuY29kaW5nTW9kZSgpOw0KKyAgICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfV0NIQVIgZW5jb2RlQVNDSUlEaWdpdHMoRlhfV0NIQVIgZGlnaXQxLCBGWF9XQ0hBUiBkaWdpdDIsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0Jhc2UyNTZFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CYXNlMjU2RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTEwYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CYXNlMjU2RW5jb2Rlci5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQkFTRTI1NkVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19CQVNFMjU2RU5DT0RFUl9IXw0KK2NsYXNzIENCQ19FbmNvZGVyOw0KK2NsYXNzIENCQ19CYXNlMjU2RW5jb2RlcjsNCitjbGFzcyBDQkNfQmFzZTI1NkVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXINCit7DQorcHVibGljOg0KKyAgICBDQkNfQmFzZTI1NkVuY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX0Jhc2UyNTZFbmNvZGVyKCk7DQorICAgIEZYX0lOVDMyIGdldEVuY29kaW5nTW9kZSgpOw0KKyAgICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfV0NIQVIgcmFuZG9taXplMjU1U3RhdGUoRlhfV0NIQVIgY2gsIEZYX0lOVDMyIGNvZGV3b3JkUG9zaXRpb24pOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQmluYXJpemVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CaW5hcml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdhZWY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQmluYXJpemVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CSU5BUklaRVJfSF8NCisjZGVmaW5lIF9CQ19CSU5BUklaRVJfSF8NCitjbGFzcyBDQkNfTHVtaW5hbmNlU291cmNlOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX0JpbmFyaXplciAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSAqc291cmNlKTsNCisgICAgdmlydHVhbCB+Q0JDX0JpbmFyaXplcigpOw0KKyAgICBDQkNfTHVtaW5hbmNlU291cmNlICpHZXRMdW1pbmFuY2VTb3VyY2UoKTsNCisgICAgdmlydHVhbCBDQkNfQ29tbW9uQml0TWF0cml4ICpHZXRCbGFja01hdHJpeChGWF9JTlQzMiAmZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENCQ19Db21tb25CaXRBcnJheSAqR2V0QmxhY2tSb3coRlhfSU5UMzIgeSwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKSA9IDA7DQorcHJpdmF0ZToNCisgICAgQ0JDX0x1bWluYW5jZVNvdXJjZSAqbV9zb3VyY2U7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0JpbmFyeUJpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOGQxNmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CaW5hcnlCaXRtYXAuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0JJTkFSWUJJVE1BUF9IXw0KKyNkZWZpbmUgX0JDX0JJTkFSWUJJVE1BUF9IXw0KK2NsYXNzIENCQ19CaW5hcml6ZXI7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcDsNCitjbGFzcyBDQkNfQmluYXJ5Qml0bWFwIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfQmluYXJ5Qml0bWFwKENCQ19CaW5hcml6ZXIgKmJpbmFyaXplcik7DQorICAgIHZpcnR1YWwgfkNCQ19CaW5hcnlCaXRtYXAoKTsNCisgICAgRlhfSU5UMzIJCQkJR2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIJCQkJR2V0SGVpZ2h0KCk7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKglHZXRNYXRyaXgoRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkgKglHZXRCbGFja1JvdyhGWF9JTlQzMiB5LCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICoJR2V0QmxhY2tNYXRyaXgoRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJCQlJc0Nyb3BTdXBwb3J0ZWQoKTsNCisgICAgRlhfQk9PTAkJCQkJSXNSb3RhdGVTdXBwb3J0ZWQoKTsNCitwcml2YXRlOg0KKyAgICBDQkNfQmluYXJpemVyICoJCQltX2JpbmFyaXplcjsNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqCW1fbWF0cml4Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmYxNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CVUZGRVJFRElNQUdFTFVNSU5BTkNFU09VUkNFX0hfDQorI2RlZmluZSBfQkNfQlVGRkVSRURJTUFHRUxVTUlOQU5DRVNPVVJDRV9IXw0KK2NsYXNzIENCQ19MdW1pbmFuY2VTb3VyY2U7DQorY2xhc3MgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U7DQorY2xhc3MgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UgOiBwdWJsaWMgQ0JDX0x1bWluYW5jZVNvdXJjZQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmaWxlbmFtZSk7DQorICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCk7DQorICAgIHZpcnR1YWwgfkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKCk7DQorICAgIENCQ19MdW1pbmFuY2VTb3VyY2UgKlJvdGF0ZUNvdW50ZXJDbG9ja3dpc2UoRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfTHVtaW5hbmNlU291cmNlICpDcm9wKEZYX0lOVDMyIGxlZnQsIEZYX0lOVDMyIHRvcCwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCk7DQorDQorICAgIENGWF9CeXRlQXJyYXkgKkdldFJvdyhGWF9JTlQzMiB5LCBDRlhfQnl0ZUFycmF5ICZyb3csIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX0J5dGVBcnJheSAqR2V0TWF0cml4KCk7DQorICAgIEZYX0JPT0wgSXNDcm9wU3VwcG9ydGVkKCk7DQorICAgIEZYX0JPT0wgSXNSb3RhdGVTdXBwb3J0ZWQoKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoRlhfSU5UMzIgJmUpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fYnl0ZXNQZXJMaW5lOw0KKyAgICBGWF9JTlQzMiBtX2xlZnQ7DQorICAgIEZYX0lOVDMyIG1fdG9wOw0KKyAgICBDRlhfSW50MzJBcnJheSBtX3JnYkRhdGE7DQorICAgIENGWF9ESUJpdG1hcCAqbV9wQml0bWFwOw0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyBtX2ZpbGVuYW1lOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQzQwRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQzQwRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmQyZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19DNDBFbmNvZGVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DNDBFTkNPREVSX0hfDQorI2RlZmluZSBfQkNfQzQwRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19DNDBFbmNvZGVyOw0KK2NsYXNzIENCQ19DNDBFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0M0MEVuY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX0M0MEVuY29kZXIoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMiBnZXRFbmNvZGluZ01vZGUoKTsNCisgICAgdmlydHVhbCB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgd3JpdGVOZXh0VHJpcGxldChDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIENGWF9XaWRlU3RyaW5nICZidWZmZXIpOw0KKyAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyIGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBGWF9JTlQzMiAmZSk7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgYmFja3RyYWNrT25lQ2hhcmFjdGVyKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgQ0ZYX1dpZGVTdHJpbmcgJnJlbW92ZWQsIEZYX0lOVDMyIGxhc3RDaGFyU2l6ZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsIEZYX0lOVDMyIHN0YXJ0UG9zKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkJpdEFycmF5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NGQ4N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25CaXRBcnJheS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NTU9OQklUQVJSQVlfSF8NCisjZGVmaW5lIF9CQ19DT01NT05CSVRBUlJBWV9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXkgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkoQ0JDX0NvbW1vbkJpdEFycmF5KiBhcnJheSk7DQorICAgIENCQ19Db21tb25CaXRBcnJheShGWF9JTlQzMiBzaXplKTsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KCk7DQorICAgIHZpcnR1YWwgfkNCQ19Db21tb25CaXRBcnJheSgpOw0KKyAgICBGWF9JTlQzMiBHZXRTaXplKCk7DQorICAgIENGWF9JbnQzMkFycmF5JiBHZXRCaXRzKCk7DQorICAgIEZYX0lOVDMyIEdldFNpemVJbkJ5dGVzKCk7DQorICAgIEZYX0JPT0wgR2V0KEZYX0lOVDMyIGkpOw0KKyAgICB2b2lkIFNldChGWF9JTlQzMiBpKTsNCisgICAgdm9pZCBGbGlwKEZYX0lOVDMyIGkpOw0KKyAgICB2b2lkIFNldEJ1bGsoRlhfSU5UMzIgaSwgRlhfSU5UMzIgbmV3Qml0cyk7DQorICAgIEZYX0JPT0wgSXNSYW5nZShGWF9JTlQzMiBzdGFydCwgRlhfSU5UMzIgZW5kLCBGWF9CT09MIHZhbHVlLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyICpHZXRCaXRBcnJheSgpOw0KKyAgICB2b2lkIFJldmVyc2UoKTsNCisgICAgdm9pZCBDbGVhcigpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyICBtX3NpemU7DQorICAgIENGWF9JbnQzMkFycmF5IG1fYml0czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQml0TWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ZDdhMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkJpdE1hdHJpeC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NTU9OQklUTUFUUklYX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OQklUTUFUUklYX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeCAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgICAgdmlydHVhbCB+Q0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgICBGWF9CT09MIEdldChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KTsNCisgICAgdm9pZCBTZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSk7DQorICAgIHZvaWQgRmxpcChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KTsNCisgICAgdm9pZCBDbGVhcigpOw0KKyAgICB2b2lkIFNldFJlZ2lvbihGWF9JTlQzMiBsZWZ0LCBGWF9JTlQzMiB0b3AsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiBHZXRSb3coRlhfSU5UMzIgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpOw0KKyAgICB2b2lkIFNldFJvdyhGWF9JTlQzMiB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyk7DQorICAgIENCQ19Db21tb25CaXRBcnJheSogR2V0Q29sKEZYX0lOVDMyIHksIENCQ19Db21tb25CaXRBcnJheSogcm93KTsNCisgICAgdm9pZCBTZXRDb2woRlhfSU5UMzIgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiBjb2wpOw0KKyAgICBGWF9JTlQzMiBHZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBHZXRIZWlnaHQoKTsNCisgICAgRlhfSU5UMzIgR2V0Um93U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBHZXREaW1lbnNpb24oRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdChGWF9JTlQzMiBkaW1lbnNpb24pOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdChGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0KTsNCisgICAgRlhfSU5UMzIqIEdldEJpdHMoKTsNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiBtX3dpZHRoOw0KKyAgICBGWF9JTlQzMiBtX2hlaWdodDsNCisgICAgRlhfSU5UMzIgbV9yb3dTaXplOw0KKyAgICBGWF9JTlQzMiogbV9iaXRzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQml0U291cmNlLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25CaXRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg5MWNmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQml0U291cmNlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05CSVRTT1VSQ0VfSF8NCisjZGVmaW5lIF9CQ19DT01NT05CSVRTT1VSQ0VfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0U291cmNlOw0KK2NsYXNzIENCQ19Db21tb25CaXRTb3VyY2UgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfQ29tbW9uQml0U291cmNlKENGWF9CeXRlQXJyYXkgKmJ5dGVzKTsNCisgICAgdmlydHVhbCB+Q0JDX0NvbW1vbkJpdFNvdXJjZSgpOw0KKyAgICBGWF9JTlQzMiBSZWFkQml0cyhGWF9JTlQzMiBudW1CaXRzLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIEF2YWlsYWJsZSgpOw0KKyAgICBGWF9JTlQzMiBnZXRCeXRlT2Zmc2V0KCk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX0J5dGVBcnJheSBtX2J5dGVzOw0KKyAgICBGWF9JTlQzMiBtX2J5dGVPZmZzZXQ7DQorICAgIEZYX0lOVDMyIG1fYml0T2Zmc2V0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQnl0ZUFycmF5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25CeXRlQXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBhNjdmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQnl0ZUFycmF5LmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05CWVRFQVJSQVlfSF8NCisjZGVmaW5lIF9CQ19DT01NT05CWVRFQVJSQVlfSF8NCitjbGFzcyBDQkNfQ29tbW9uQnl0ZUFycmF5Ow0KK2NsYXNzIENCQ19Db21tb25CeXRlQXJyYXkgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9zaXplOw0KKyAgICBGWF9JTlQzMiBtX2luZGV4Ow0KKyAgICBGWF9CWVRFKiBtX2J5dGVzOw0KK3B1YmxpYzoNCisgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSgpOw0KKyAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KEZYX0lOVDMyIHNpemUpOw0KKyAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KEZYX0JZVEUqIGJ5dGVBcnJheSwgRlhfSU5UMzIgc2l6ZSk7DQorICAgIHZpcnR1YWwgfkNCQ19Db21tb25CeXRlQXJyYXkoKTsNCisgICAgRlhfSU5UMzIgQXQoRlhfSU5UMzIgaW5kZXgpOw0KKyAgICB2b2lkIFNldChGWF9JTlQzMiBpbmRleCwgRlhfSU5UMzIgdmFsdWUpOw0KKyAgICBGWF9JTlQzMiBTaXplKCk7DQorICAgIEZYX0JPT0wgSXNFbXB0eSgpOw0KKyAgICB2b2lkIEFwcGVuZEJ5dGUoRlhfSU5UMzIgdmFsdWUpOw0KKyAgICB2b2lkIFJlc2VydmUoRlhfSU5UMzIgY2FwYWNpdHkpOw0KKyAgICB2b2lkIFNldChGWF9CWVRFKiBzb3VyY2UsIEZYX0lOVDMyIG9mZnNldCwgRlhfSU5UMzIgY291bnQpOw0KKyAgICB2b2lkIFNldChDRlhfQnl0ZUFycmF5KiBzb3VyY2UsIEZYX0lOVDMyIG9mZnNldCwgRlhfSU5UMzIgY291bnQpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQnl0ZU1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODMxZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25CeXRlTWF0cml4LmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05CWVRFTUFUUklYX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OQllURU1BVFJJWF9IXw0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4ICA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgoRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCk7DQorICAgIHZpcnR1YWwgfkNCQ19Db21tb25CeXRlTWF0cml4KCk7DQorICAgIEZYX0lOVDMyIEdldEhlaWdodCgpOw0KKyAgICBGWF9JTlQzMiBHZXRXaWR0aCgpOw0KKyAgICBGWF9CWVRFIEdldChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KTsNCisgICAgRlhfQllURSogR2V0QXJyYXkoKTsNCisNCisgICAgdm9pZCBTZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSU5UMzIgdmFsdWUpOw0KKyAgICB2b2lkIFNldChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBGWF9CWVRFIHZhbHVlKTsNCisgICAgdm9pZCBjbGVhcihGWF9CWVRFIHZhbHVlKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCitwcml2YXRlOg0KKyAgICBGWF9CWVRFICptX2J5dGVzOw0KKyAgICBGWF9JTlQzMiBtX3dpZHRoOw0KKyAgICBGWF9JTlQzMiBtX2hlaWdodDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5ZjlhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NTU9OQ0hBUkFDVEVSU0VURUNJX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OQ0hBUkFDVEVSU0VURUNJX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkVDSTsNCitjbGFzcyBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOw0KK2NsYXNzIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kgOiBwdWJsaWMgQ0JDX0NvbW1vbkVDSQ0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0koRlhfSU5UMzIgdmFsdWUsIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nTmFtZSk7DQorICAgIHZpcnR1YWwgfkNCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0koKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgR2V0RW5jb2RpbmdOYW1lKCk7DQorICAgIHN0YXRpYyB2b2lkIEFkZENoYXJhY3RlclNldChGWF9JTlQzMiB2YWx1ZSwgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmdOYW1lKTsNCisgICAgRlhfSU5UMzIgR2V0VmFsdWUoKTsNCisgICAgc3RhdGljIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIEdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUoRlhfSU5UMzIgdmFsdWUpOw0KKyAgICBzdGF0aWMgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogR2V0Q2hhcmFjdGVyU2V0RUNJQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsNCitwcml2YXRlOg0KKyAgICBDRlhfQnl0ZVN0cmluZyBtX2VuY29kaW5nTmFtZTsNCisgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODIwM2IKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05ERUNPREVSUkVTVUxUX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OREVDT0RFUlJFU1VMVF9IXw0KK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorY2xhc3MgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0ICA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgICAgdmlydHVhbCB+Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgICAgY29uc3QgQ0ZYX0J5dGVBcnJheSYgR2V0UmF3Qnl0ZXMoKTsNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldFRleHQoKTsNCisgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIEdldEJ5dGVTZWdtZW50cygpOw0KKyAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBHZXRFQ0xldmVsKCk7DQorICAgIHZpcnR1YWwgdm9pZCBJbml0KGNvbnN0IENGWF9CeXRlQXJyYXkgJnJhd0J5dGVzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyAmdGV4dCwgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmJ5dGVTZWdtZW50cywgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdChjb25zdCBDRlhfQnl0ZUFycmF5ICZyYXdCeXRlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJnRleHQsIGNvbnN0IENGWF9QdHJBcnJheSAmYnl0ZVNlZ21lbnRzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyAmZWNMZXZlbCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2b2lkIHNldE90aGVyKENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogb3RoZXIpOw0KK3ByaXZhdGU6DQorICAgIENGWF9CeXRlQXJyYXkgbV9yYXdCeXRlczsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbV90ZXh0Ow0KKyAgICBDRlhfSW50MzJBcnJheSBtX2J5dGVTZWdtZW50czsNCisgICAgQ0ZYX1B0ckFycmF5ICAgbV9wZGY0MTdieXRlU2VnbWVudHM7DQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIG1fZWNMZXZlbDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbV9wZGY0MTdlY0xldmVsOw0KKyAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIG1fb3RoZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25FQ0kuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vbkVDSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDcwNjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25FQ0kuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0NPTU1PTkVDSV9IXw0KKyNkZWZpbmUgX0JDX0NPTU1PTkVDSV9IXw0KK2NsYXNzIENCQ19Db21tb25FQ0k7DQorY2xhc3MgQ0JDX0NvbW1vbkVDSSAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Db21tb25FQ0koRlhfSU5UMzIgdmFsdWUpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uRUNJKCk7DQorDQorICAgIEZYX0lOVDMyIEdldFZhbHVlKCk7DQorICAgIHN0YXRpYyBDQkNfQ29tbW9uRUNJKiBHZXRFSUNCeVZhbHVlKEZYX0lOVDMyIHZhbHVlLCBGWF9JTlQzMiAmZSk7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV92YWx1ZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDJhMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NTU9OUEVSU1BFQ1RJVkVUUkFOU0ZPUk1fSF8NCisjZGVmaW5lIF9CQ19DT01NT05QRVJTUEVDVElWRVRSQU5TRk9STV9IXw0KK2NsYXNzIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTsNCitjbGFzcyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybShGWF9GTE9BVCBhMTEsIEZYX0ZMT0FUIGEyMSwgRlhfRkxPQVQgYTMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEyLCBGWF9GTE9BVCBhMjIsIEZYX0ZMT0FUIGEzMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGExMywgRlhfRkxPQVQgYTIzLCBGWF9GTE9BVCBhMzMpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oKTsNCisgICAgc3RhdGljIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSAqUXVhZHJpbGF0ZXJhbFRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwgRlhfRkxPQVQgeTAsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwNCisgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDBwLCBGWF9GTE9BVCB5MHAsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDFwLCBGWF9GTE9BVCB5MXAsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDJwLCBGWF9GTE9BVCB5MnAsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDNwLCBGWF9GTE9BVCB5M3ApOw0KKyAgICBzdGF0aWMgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpTcXVhcmVUb1F1YWRyaWxhdGVyYWwoRlhfRkxPQVQgeDAsIEZYX0ZMT0FUIHkwLA0KKyAgICAgICAgICAgIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwNCisgICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzKTsNCisgICAgc3RhdGljIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSAqUXVhZHJpbGF0ZXJhbFRvU3F1YXJlKEZYX0ZMT0FUIHgwLCBGWF9GTE9BVCB5MCwNCisgICAgICAgICAgICBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsDQorICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLA0KKyAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5Myk7DQorICAgIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSAqQnVpbGRBZGpvaW50KCk7DQorICAgIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSAqVGltZXMoQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICZvdGhlcik7DQorICAgIHZvaWQgVHJhbnNmb3JtUG9pbnRzKENGWF9GbG9hdEFycmF5ICpwb2ludHMpOw0KK3ByaXZhdGU6DQorICAgIEZYX0ZMT0FUIG1fYTExLCBtX2ExMiwgbV9hMTMsIG1fYTIxLCBtX2EyMiwgbV9hMjMsIG1fYTMxLCBtX2EzMiwgbV9hMzM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMWYzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhCSVRNQVRSSVhQQVJTRVJfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYQklUTUFUUklYUEFSU0VSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFZlcnNpb247DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCk7DQorICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqR2V0VmVyc2lvbigpOw0KKyAgICBDRlhfQnl0ZUFycmF5ICpSZWFkQ29kZXdvcmRzKEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTCBSZWFkTW9kdWxlKEZYX0lOVDMyIHJvdywgRlhfSU5UMzIgY29sdW1uLCBGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zKTsNCisgICAgRlhfSU5UMzIgUmVhZFV0YWgoRlhfSU5UMzIgcm93LCBGWF9JTlQzMiBjb2x1bW4sIEZYX0lOVDMyIG51bVJvd3MsIEZYX0lOVDMyIG51bUNvbHVtbnMpOw0KKyAgICBGWF9JTlQzMiBSZWFkQ29ybmVyMShGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zKTsNCisgICAgRlhfSU5UMzIgUmVhZENvcm5lcjIoRlhfSU5UMzIgbnVtUm93cywgRlhfSU5UMzIgbnVtQ29sdW1ucyk7DQorICAgIEZYX0lOVDMyIFJlYWRDb3JuZXIzKEZYX0lOVDMyIG51bVJvd3MsIEZYX0lOVDMyIG51bUNvbHVtbnMpOw0KKyAgICBGWF9JTlQzMiBSZWFkQ29ybmVyNChGWF9JTlQzMiBudW1Sb3dzLCBGWF9JTlQzMiBudW1Db2x1bW5zKTsNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqRXh0cmFjdERhdGFSZWdpb24oQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0TWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgdm9pZCBJbml0KENCQ19Db21tb25CaXRNYXRyaXggKmJpdE1hdHJpeCwgRlhfSU5UMzIgJmUpOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIFJlYWRWZXJzaW9uKENCQ19Db21tb25CaXRNYXRyaXggKmJpdE1hdHJpeCwgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICptX21hcHBpbmdCaXRNYXRyaXg7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1fcmVhZE1hcHBpbmdNYXRyaXg7DQorICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqbV92ZXJzaW9uOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDYyZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19EQVRBTUFUUklYREFUQUJMT0NLX0hfDQorI2RlZmluZSBfQkNfREFUQU1BVFJJWERBVEFCTE9DS19IXw0KK2NsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbjsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERhdGFCbG9jazsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhEYXRhQmxvY2soKTsNCisNCisgICAgRlhfSU5UMzIgR2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgICBDRlhfQnl0ZUFycmF5KiBHZXRDb2Rld29yZHMoKTsNCisNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSAqR2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqdmVyc2lvbiwgRlhfSU5UMzIgJmUpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fbnVtRGF0YUNvZGV3b3JkczsNCisgICAgQ0ZYX0J5dGVBcnJheSBtX2NvZGV3b3JkczsNCisNCisgICAgQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2soRlhfSU5UMzIgbnVtRGF0YUNvZGV3b3JkcywgQ0ZYX0J5dGVBcnJheSAqY29kZXdvcmRzKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDk3MmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfREFUQU1BVFJJWERFQ09ERURCSVRTVFJFQU1QQVJTRVJfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYREVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19Db21tb25CaXRTb3VyY2U7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOw0KK2NsYXNzIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KKyAgICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQgKkRlY29kZShDRlhfQnl0ZUFycmF5ICZieXRlcywgRlhfSU5UMzIgJmUpOw0KKw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBGWF9JTlQzMiBEZWNvZGVBc2NpaVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFRyYWlsZXIsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQzQwU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlICpiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIERlY29kZVRleHRTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQW5zaVgxMlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBQYXJzZVR3b0J5dGVzKEZYX0lOVDMyIGZpcnN0Qnl0ZSwgRlhfSU5UMzIgc2Vjb25kQnl0ZSwgQ0ZYX0ludDMyQXJyYXkgJnJlc3VsdCk7DQorICAgIHN0YXRpYyB2b2lkIERlY29kZUVkaWZhY3RTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQmFzZTI1NlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgQ0ZYX0ludDMyQXJyYXkgJmJ5dGVTZWdtZW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgRlhfQllURSBVbnJhbmRvbWl6ZTI1NVN0YXRlKEZYX0lOVDMyIHJhbmRvbWl6ZWRCYXNlMjU2Q29kZXdvcmQsIEZYX0lOVDMyIGJhc2UyNTZDb2Rld29yZFBvc2l0aW9uKTsNCisNCisgICAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQzQwX0JBU0lDX1NFVF9DSEFSU1tdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBDNDBfU0hJRlQyX1NFVF9DSEFSU1tdOw0KKw0KKw0KKyAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBURVhUX0JBU0lDX1NFVF9DSEFSU1tdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBURVhUX1NISUZUM19TRVRfQ0hBUlNbXTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIFBBRF9FTkNPREU7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBBU0NJSV9FTkNPREU7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDNDBfRU5DT0RFOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgVEVYVF9FTkNPREU7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBBTlNJWDEyX0VOQ09ERTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIEVESUZBQ1RfRU5DT0RFOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgQkFTRTI1Nl9FTkNPREU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY3ZWZjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERlY29kZXIuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhERUNPREVSX0hfDQorI2RlZmluZSBfQkNfREFUQU1BVFJJWERFQ09ERVJfSF8NCitjbGFzcyBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgIENCQ19EYXRhTWF0cml4RGVjb2RlcjsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERlY29kZXIgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfRGF0YU1hdHJpeERlY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhEZWNvZGVyKCk7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0ICpEZWNvZGUoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK3ByaXZhdGU6DQorICAgIHZvaWQgQ29ycmVjdEVycm9ycyhDRlhfQnl0ZUFycmF5ICZjb2Rld29yZEJ5dGVzLCBGWF9JTlQzMiBudW1EYXRhQ29kZXdvcmRzLCBGWF9JTlQzMiAmZSk7DQorICAgIENCQ19SZWVkU29sb21vbkRlY29kZXIgKm1fcnNEZWNvZGVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERldGVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDNjYTc0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeERldGVjdG9yLmgKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19EQVRBTUFUUklYREVURUNUT1JfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYREVURUNUT1JfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOw0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfUVJEZXRlY3RvclJlc3VsdDsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERldGVjdG9yOw0KK2NsYXNzIFJlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zOw0KK2NsYXNzIENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKENCQ19SZXN1bHRQb2ludCAqZnJvbSwgQ0JDX1Jlc3VsdFBvaW50ICp0bywgRlhfSU5UMzIgdHJhbnNpdGlvbnMpDQorICAgIHsNCisgICAgICAgIG1fZnJvbSA9IGZyb207DQorICAgICAgICBtX3RvID0gdG87DQorICAgICAgICBtX3RyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7DQorICAgIH0NCisgICAgfkNCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucygpDQorICAgIHsNCisgICAgfQ0KKyAgICBDQkNfUmVzdWx0UG9pbnQgKkdldEZyb20oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9mcm9tOw0KKyAgICB9DQorICAgIENCQ19SZXN1bHRQb2ludCAqR2V0VG8oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV90bzsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBHZXRUcmFuc2l0aW9ucygpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3RyYW5zaXRpb25zOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICptX2Zyb207DQorICAgIENCQ19SZXN1bHRQb2ludCAqbV90bzsNCisgICAgRlhfSU5UMzIgbV90cmFuc2l0aW9uczsNCit9Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4RGV0ZWN0b3INCit7DQorcHVibGljOg0KKyAgICBDQkNfRGF0YU1hdHJpeERldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlKTsNCisgICAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhEZXRlY3RvcigpOw0KKyAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCAqRGV0ZWN0KEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICpDb3JyZWN0VG9wUmlnaHRSZWN0YW5ndWxhcihDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsDQorICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21SaWdodCwNCisgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsDQorICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwNCisgICAgICAgICAgICBGWF9JTlQzMiBkaW1lbnNpb25Ub3AsIEZYX0lOVDMyIGRpbWVuc2lvblJpZ2h0KTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICpDb3JyZWN0VG9wUmlnaHQoQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGRpbWVuc2lvbik7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKlNhbXBsZUdyaWQoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICp0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgZGltZW5zaW9uWCwgRlhfSU5UMzIgZGltZW5zaW9uWSwgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKlRyYW5zaXRpb25zQmV0d2VlbihDQkNfUmVzdWx0UG9pbnQgKmZyb20sIENCQ19SZXN1bHRQb2ludCAqdG8pOw0KKyAgICBGWF9CT09MIElzVmFsaWQoQ0JDX1Jlc3VsdFBvaW50ICpwKTsNCisgICAgRlhfSU5UMzIgRGlzdGFuY2UoQ0JDX1Jlc3VsdFBvaW50ICphLCBDQkNfUmVzdWx0UG9pbnQgKmIpOw0KKyAgICB2b2lkIEluY3JlbWVudChDRlhfTWFwUHRyVGVtcGxhdGU8Q0JDX1Jlc3VsdFBvaW50KiwgRlhfSU5UMzI+ICZ0YWJsZSwgQ0JDX1Jlc3VsdFBvaW50ICprZXkpOw0KKyAgICBGWF9JTlQzMiBSb3VuZChGWF9GTE9BVCBkKTsNCisgICAgdm9pZCBPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkgKnBhdHRlcm5zKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoRlhfSU5UMzIgJmUpOw0KK3ByaXZhdGU6DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1faW1hZ2U7DQorICAgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yICptX3JlY3RhbmdsZURldGVjdG9yOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgSU5URUdFUlNbNV07DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4UmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMTUxMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhSZWFkZXIuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYUkVBREVSX0hfDQorY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcDsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERlY29kZXI7DQorY2xhc3MgQ0JDX1JlYWRlcjsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFJlYWRlcjsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFJlYWRlciAgOiBwdWJsaWMgQ0JDX1JlYWRlcg0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EYXRhTWF0cml4UmVhZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4UmVhZGVyKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludCBoaW50cywgRlhfSU5UMzIgJmUpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK3ByaXZhdGU6DQorICAgIENCQ19EYXRhTWF0cml4RGVjb2RlciAqbV9kZWNvZGVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0OWIyNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19EQVRBTUFUUklYU1lNQk9MSU5GTzE0NF9IXw0KKyNkZWZpbmUgX0JDX0RBVEFNQVRSSVhTWU1CT0xJTkZPMTQ0X0hfDQorY2xhc3MgQ0JDX1N5bWJvbEluZm87DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCA6IHB1YmxpYyBDQkNfU3ltYm9sSW5mbw0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKTsNCisgICAgRlhfSU5UMzIgZ2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCk7DQorICAgIEZYX0lOVDMyIGdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKEZYX0lOVDMyIGluZGV4KTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhWZXJzaW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4VmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDJmMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4VmVyc2lvbi5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhWRVJTSU9OX0hfDQorI2RlZmluZSBfQkNfREFUQU1BVFJJWFZFUlNJT05fSF8NCitjbGFzcyBFQ0I7DQorY2xhc3MgRUNCbG9ja3M7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOw0KK2NsYXNzIEVDQiA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgRUNCKEZYX0lOVDMyIGNvdW50LCBGWF9JTlQzMiBkYXRhQ29kZXdvcmRzKQ0KKyAgICB7DQorICAgICAgICBtX2NvdW50ID0gY291bnQ7DQorICAgICAgICBtX2RhdGFDb2Rld29yZHMgPSBkYXRhQ29kZXdvcmRzOw0KKyAgICB9DQorDQorICAgIEZYX0lOVDMyIEdldENvdW50KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fY291bnQ7DQorICAgIH0NCisNCisgICAgRlhfSU5UMzIgR2V0RGF0YUNvZGV3b3JkcygpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2RhdGFDb2Rld29yZHM7DQorICAgIH0NCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiBtX2NvdW50Ow0KKyAgICBGWF9JTlQzMiBtX2RhdGFDb2Rld29yZHM7DQorfTsNCitjbGFzcyBFQ0Jsb2NrcyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgRUNCbG9ja3MoRlhfSU5UMzIgZWNDb2Rld29yZHMsIEVDQiAqZWNCbG9ja3MpDQorICAgIHsNCisgICAgICAgIG1fZWNDb2Rld29yZHMgPSBlY0NvZGV3b3JkczsNCisgICAgICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzKTsNCisgICAgfQ0KKw0KKyAgICBFQ0Jsb2NrcyhGWF9JTlQzMiBlY0NvZGV3b3JkcywgRUNCICplY0Jsb2NrczEsIEVDQiAqZWNCbG9ja3MyKQ0KKyAgICB7DQorICAgICAgICBtX2VjQ29kZXdvcmRzID0gZWNDb2Rld29yZHM7DQorICAgICAgICBtX2VjQmxvY2tzLkFkZChlY0Jsb2NrczEpOw0KKyAgICAgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MyKTsNCisgICAgfQ0KKyAgICB+RUNCbG9ja3MoKQ0KKyAgICB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBtX2VjQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgZGVsZXRlIChFQ0IqKW1fZWNCbG9ja3NbaV07DQorICAgICAgICB9DQorICAgICAgICBtX2VjQmxvY2tzLlJlbW92ZUFsbCgpOw0KKyAgICB9DQorDQorICAgIEZYX0lOVDMyIEdldEVDQ29kZXdvcmRzKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZWNDb2Rld29yZHM7DQorICAgIH0NCisNCisgICAgY29uc3QgQ0ZYX1B0ckFycmF5ICZHZXRFQ0Jsb2NrcygpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2VjQmxvY2tzOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9lY0NvZGV3b3JkczsNCisgICAgQ0ZYX1B0ckFycmF5IG1fZWNCbG9ja3M7DQorfTsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFZlcnNpb24gIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfRGF0YU1hdHJpeFZlcnNpb24oRlhfSU5UMzIgdmVyc2lvbk51bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHN5bWJvbFNpemVSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgc3ltYm9sU2l6ZUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBkYXRhUmVnaW9uU2l6ZVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0Jsb2NrcyAqZWNCbG9ja3MpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFZlcnNpb24oKTsNCisgICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgICBGWF9JTlQzMiBHZXRWZXJzaW9uTnVtYmVyKCk7DQorICAgIEZYX0lOVDMyIEdldFN5bWJvbFNpemVSb3dzKCk7DQorICAgIEZYX0lOVDMyIEdldFN5bWJvbFNpemVDb2x1bW5zKCk7DQorICAgIEZYX0lOVDMyIEdldERhdGFSZWdpb25TaXplUm93cygpOw0KKyAgICBGWF9JTlQzMiBHZXREYXRhUmVnaW9uU2l6ZUNvbHVtbnMoKTsNCisgICAgRlhfSU5UMzIgR2V0VG90YWxDb2Rld29yZHMoKTsNCisgICAgRUNCbG9ja3MgKkdldEVDQmxvY2tzKCk7DQorICAgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24gKkdldFZlcnNpb25Gb3JEaW1lbnNpb25zKEZYX0lOVDMyIG51bVJvd3MsIEZYX0lOVDMyIG51bUNvbHVtbnMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fdmVyc2lvbk51bWJlcjsNCisgICAgRlhfSU5UMzIgbV9zeW1ib2xTaXplUm93czsNCisgICAgRlhfSU5UMzIgbV9zeW1ib2xTaXplQ29sdW1uczsNCisgICAgRlhfSU5UMzIgbV9kYXRhUmVnaW9uU2l6ZVJvd3M7DQorICAgIEZYX0lOVDMyIG1fZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgICBFQ0Jsb2NrcyAqbV9lY0Jsb2NrczsNCisgICAgRlhfSU5UMzIgbV90b3RhbENvZGV3b3JkczsNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSogVkVSU0lPTlM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EYXRhTWF0cml4V3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhNmJkZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RhdGFNYXRyaXhXcml0ZXIuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhXUklURVJfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYV1JJVEVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfRGVmYXVsdFBsYWNlbWVudDsNCitjbGFzcyBDQkNfU3ltYm9sU2hhcGVIaW50Ow0KK2NsYXNzIENCQ19TeW1ib2xJbmZvOw0KK2NsYXNzIENCQ19Ud29EaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhXcml0ZXI7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlcg0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EYXRhTWF0cml4V3JpdGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4V3JpdGVyKCk7DQorICAgIEZYX0JZVEUqCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CWVRFICoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSAqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQlTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoRlhfSU5UMzIgbGV2ZWwpOw0KKw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogZW5jb2RlTG93TGV2ZWwoQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCwgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sIEZYX0lOVDMyICZlKTsNCisgICAgRlhfSU5UMzIJbV9pQ29ycmVjdExldmVsOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGVjb2RlclJlc3VsdC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGVjb2RlclJlc3VsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOThiMmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EZWNvZGVyUmVzdWx0LmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19ERUNPREVSUkVTVUxUX0hfDQorI2RlZmluZSBfQkNfREVDT0RFUlJFU1VMVF9IXw0KK2NsYXNzIENCQ19EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19EZWNvZGVyUmVzdWx0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfRGVjb2RlclJlc3VsdChDRlhfQnl0ZUFycmF5KiByYXdCeXRlcywgQ0ZYX0J5dGVTdHJpbmcgdGV4dCwgIENGWF9CeXRlU3RyaW5nIGVjTGV2ZWwpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRGVjb2RlclJlc3VsdCgpOw0KKyAgICBDRlhfQnl0ZUFycmF5KiBnZXRSYXdCeXRlcygpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBnZXRUZXh0KCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGdldEVDTGV2ZWwoKTsNCisgICAgRlhfSU5UMzIgZ2V0RXJyb3JzQ29ycmVjdGVkKCk7DQorICAgIHZvaWQgc2V0RXJyb3JzQ29ycmVjdGVkKEZYX0lOVDMyIGVycm9yc0NvcnJlY3RlZCk7DQorICAgIEZYX0lOVDMyIGdldEVyYXN1cmVzKCk7DQorICAgIHZvaWQgc2V0RXJhc3VyZXMoRlhfSU5UMzIgZXJhc3VyZXMpOw0KKyAgICBDRlhfT2JqZWN0KiBnZXRPdGhlcigpOw0KKyAgICB2b2lkIHNldE90aGVyKENGWF9PYmplY3QqIG90aGVyKTsNCitwcml2YXRlOg0KKyAgICBDRlhfQnl0ZUFycmF5KiBtX3Jhd0J5dGVzOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBtX3RleHQ7DQorICAgIENGWF9CeXRlU3RyaW5nIG1fZWNMZXZlbDsNCisgICAgRlhfSU5UMzIgbV9lcnJvcnNDb3JyZWN0ZWQ7DQorICAgIEZYX0lOVDMyIG1fZXJhc3VyZXM7DQorICAgIENGWF9PYmplY3QqIG1fb3RoZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EZWZhdWx0UGxhY2VtZW50LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19EZWZhdWx0UGxhY2VtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyZGEwMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RlZmF1bHRQbGFjZW1lbnQuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RFRkFVTFRQTEFDRU1FTlRfSF8NCisjZGVmaW5lIF9CQ19ERUZBVUxUUExBQ0VNRU5UX0hfDQorY2xhc3MgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ7DQorY2xhc3MgQ0JDX0RlZmF1bHRQbGFjZW1lbnQgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EZWZhdWx0UGxhY2VtZW50KENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywgRlhfSU5UMzIgbnVtY29scywgRlhfSU5UMzIgbnVtcm93cyk7DQorICAgIHZpcnR1YWwgfkNCQ19EZWZhdWx0UGxhY2VtZW50KCk7DQorDQorICAgIEZYX0lOVDMyIGdldE51bXJvd3MoKTsNCisgICAgRlhfSU5UMzIgZ2V0TnVtY29scygpOw0KKyAgICBDRlhfQnl0ZUFycmF5JiBnZXRCaXRzKCk7DQorICAgIEZYX0JPT0wgZ2V0Qml0KEZYX0lOVDMyIGNvbCwgRlhfSU5UMzIgcm93KTsNCisgICAgdm9pZCBzZXRCaXQoRlhfSU5UMzIgY29sLCBGWF9JTlQzMiByb3csIEZYX0JPT0wgYml0KTsNCisgICAgRlhfQk9PTCBoYXNCaXQoRlhfSU5UMzIgY29sLCBGWF9JTlQzMiByb3cpOw0KKyAgICB2b2lkIHBsYWNlKCk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbV9jb2Rld29yZHM7DQorICAgIEZYX0lOVDMyIG1fbnVtcm93czsNCisgICAgRlhfSU5UMzIgbV9udW1jb2xzOw0KKyAgICBDRlhfQnl0ZUFycmF5IG1fYml0czsNCisgICAgdm9pZCBtb2R1bGUoRlhfSU5UMzIgcm93LCBGWF9JTlQzMiBjb2wsIEZYX0lOVDMyIHBvcywgRlhfSU5UMzIgYml0KTsNCisgICAgdm9pZCB1dGFoKEZYX0lOVDMyIHJvdywgRlhfSU5UMzIgY29sLCBGWF9JTlQzMiBwb3MpOw0KKyAgICB2b2lkIGNvcm5lcjEoRlhfSU5UMzIgcG9zKTsNCisgICAgdm9pZCBjb3JuZXIyKEZYX0lOVDMyIHBvcyk7DQorICAgIHZvaWQgY29ybmVyMyhGWF9JTlQzMiBwb3MpOw0KKyAgICB2b2lkIGNvcm5lcjQoRlhfSU5UMzIgcG9zKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RpbWVuc2lvbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRGltZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0YWVjYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0RpbWVuc2lvbi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfRElNRU5TSU9OX0hfDQorI2RlZmluZSBfQkNfRElNRU5TSU9OX0hfDQorY2xhc3MgQ0JDX0RpbWVuc2lvbjsNCitjbGFzcyBDQkNfRGltZW5zaW9uIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfRGltZW5zaW9uKCk7DQorICAgIENCQ19EaW1lbnNpb24oRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRGltZW5zaW9uKCk7DQorICAgIEZYX0lOVDMyIGdldFdpZHRoKCk7DQorICAgIEZYX0lOVDMyIGdldEhlaWdodCgpOw0KKyAgICBGWF9JTlQzMiBoYXNoQ29kZSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB0b1N0cmluZygpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fd2lkdGg7DQorICAgIEZYX0lOVDMyIG1faGVpZ2h0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRWRpZmFjdEVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0VkaWZhY3RFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyNDUzYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0VkaWZhY3RFbmNvZGVyLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FRElGQUNURU5DT0RFUl9IXw0KKyNkZWZpbmUgX0JDX0VESUZBQ1RFTkNPREVSX0hfDQorY2xhc3MgQ0JDX0VuY29kZXJDb250ZXh0Ow0KK2NsYXNzIENCQ19FZGlmYWN0RW5jb2RlcjsNCitjbGFzcyBDQkNfRWRpZmFjdEVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXINCit7DQorcHVibGljOg0KKyAgICBDQkNfRWRpZmFjdEVuY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX0VkaWZhY3RFbmNvZGVyKCk7DQorICAgIEZYX0lOVDMyIGdldEVuY29kaW5nTW9kZSgpOw0KKyAgICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBDRlhfV2lkZVN0cmluZyBidWZmZXIsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyAmc2IsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZVRvQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIHNiLCBGWF9JTlQzMiBzdGFydFBvcywgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWM4NzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19FbmNvZGVyLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FTkNPREVSX0hfDQorI2RlZmluZSBfQkNfRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsNCitjbGFzcyBDQkNfRW5jb2RlcjsNCitjbGFzcyBDQkNfRW5jb2RlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0VuY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX0VuY29kZXIoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMiBnZXRFbmNvZGluZ01vZGUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBGWF9JTlQzMiAmZSkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRW5jb2RlckNvbnRleHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0VuY29kZXJDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5OWRiYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0VuY29kZXJDb250ZXh0LmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FTkNPREVSQ09OVEVYVF9IXw0KKyNkZWZpbmUgX0JDX0VOQ09ERVJDT05URVhUX0hfDQorY2xhc3MgQ0JDX1N5bWJvbFNoYXBlSGludDsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCitjbGFzcyBDQkNfRGltZW5zaW9uOw0KK2NsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsNCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQgOiBwdWJsaWMgQ0JDX1N5bWJvbFNoYXBlSGludA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19FbmNvZGVyQ29udGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyBtc2csIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB+Q0JDX0VuY29kZXJDb250ZXh0KCk7DQorICAgIHZvaWQgc2V0U3ltYm9sU2hhcGUoU3ltYm9sU2hhcGVIaW50IHNoYXBlKTsNCisgICAgdm9pZCBzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIGdldE1lc3NhZ2UoKTsNCisgICAgdm9pZCBzZXRTa2lwQXRFbmQoRlhfSU5UMzIgY291bnQpOw0KKyAgICBGWF9XQ0hBUiBnZXRDdXJyZW50Q2hhcigpOw0KKyAgICBGWF9XQ0hBUiBnZXRDdXJyZW50KCk7DQorICAgIHZvaWQgd3JpdGVDb2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzKTsNCisgICAgdm9pZCB3cml0ZUNvZGV3b3JkKEZYX1dDSEFSIGNvZGV3b3JkKTsNCisgICAgRlhfSU5UMzIgZ2V0Q29kZXdvcmRDb3VudCgpOw0KKyAgICB2b2lkIHNpZ25hbEVuY29kZXJDaGFuZ2UoRlhfSU5UMzIgZW5jb2RpbmcpOw0KKyAgICB2b2lkIHJlc2V0RW5jb2RlclNpZ25hbCgpOw0KKyAgICBGWF9CT09MIGhhc01vcmVDaGFyYWN0ZXJzKCk7DQorICAgIEZYX0lOVDMyIGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKTsNCisgICAgdm9pZCB1cGRhdGVTeW1ib2xJbmZvKEZYX0lOVDMyICZlKTsNCisgICAgdm9pZCB1cGRhdGVTeW1ib2xJbmZvKEZYX0lOVDMyIGxlbiwgRlhfSU5UMzIgJmUpOw0KKyAgICB2b2lkIHJlc2V0U3ltYm9sSW5mbygpOw0KK3B1YmxpYzoNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbV9tc2c7DQorICAgIENGWF9XaWRlU3RyaW5nIG1fY29kZXdvcmRzOw0KKyAgICBGWF9JTlQzMiBtX3BvczsNCisgICAgRlhfSU5UMzIgbV9uZXdFbmNvZGluZzsNCisgICAgQ0JDX1N5bWJvbEluZm8qIG1fc3ltYm9sSW5mbzsNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsNCitwcml2YXRlOg0KKyAgICBTeW1ib2xTaGFwZUhpbnQgbV9zaGFwZTsNCisgICAgQ0JDX0RpbWVuc2lvbiogbV9taW5TaXplOw0KKyAgICBDQkNfRGltZW5zaW9uKiBtX21heFNpemU7DQorICAgIEZYX0lOVDMyIG1fc2tpcEF0RW5kOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRXJyb3JDb3JyZWN0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19FcnJvckNvcnJlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzNmZjMzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfRXJyb3JDb3JyZWN0aW9uLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FUlJPUkNPUlJFQ1RJT05fSF8NCisjZGVmaW5lIF9CQ19FUlJPUkNPUlJFQ1RJT05fSF8NCitjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCitjbGFzcyBDQkNfRXJyb3JDb3JyZWN0aW9uOw0KK2NsYXNzIENCQ19FcnJvckNvcnJlY3Rpb24gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19FcnJvckNvcnJlY3Rpb24oKTsNCisgICAgdmlydHVhbCB+Q0JDX0Vycm9yQ29ycmVjdGlvbigpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVFQ0MyMDAoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLCBDQkNfU3ltYm9sSW5mbyogc3ltYm9sSW5mbywgRlhfSU5UMzIgJmUpOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBGWF9JTlQzMiBGQUNUT1JfU0VUU1tdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgRkFDVE9SU1tdWzEwMF07DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNT0RVTE9fVkFMVUU7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBMT0dbMjU2XTsNCisgICAgc3RhdGljIEZYX0lOVDMyIEFMT0dbMjU2XTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgY3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLCBGWF9JTlQzMiBudW1FQ1dvcmRzLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsIEZYX0lOVDMyIHN0YXJ0LCBGWF9JTlQzMiBsZW4sIEZYX0lOVDMyIG51bUVDV29yZHMsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzkyOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfRklOREVSUEFUVEVSTklORk9fSF8NCisjZGVmaW5lIF9CQ19GSU5ERVJQQVRURVJOSU5GT19IXw0KK2NsYXNzIENCQ19RUkZpbmRlclBhdHRlcm47DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkluZm87DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkluZm8gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuICptX2JvdHRvbUxlZnQ7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKm1fdG9wTGVmdDsNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqbV90b3BSaWdodDsNCitwdWJsaWM6DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKENGWF9QdHJBcnJheSAqcGF0dGVybkNlbnRlcnMpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbygpOw0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBHZXRCb3R0b21MZWZ0KCk7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm4qIEdldFRvcExlZnQoKTsNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybiogR2V0VG9wUmlnaHQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwODRjMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfR0xPQkFMSElTVE9HUkFNQklOQVJJWkVSX0hfDQorI2RlZmluZSBfQkNfR0xPQkFMSElTVE9HUkFNQklOQVJJWkVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpbmFyaXplcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfTHVtaW5hbmNlU291cmNlOw0KK2NsYXNzIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI7DQorY2xhc3MgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciAgOiBwdWJsaWMgQ0JDX0JpbmFyaXplcg0KK3sNCitwdWJsaWM6DQorICAgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSAqc291cmNlKTsNCisgICAgdmlydHVhbCB+Q0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcigpOw0KKw0KKyAgICB2b2lkIEluaXRBcnJheXMoRlhfSU5UMzIgbHVtaW5hbmNlU2l6ZSk7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKkdldEJsYWNrTWF0cml4KEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5ICpHZXRCbGFja1JvdyhGWF9JTlQzMiB5LCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgRXN0aW1hdGVCbGFja1BvaW50KENGWF9JbnQzMkFycmF5ICZidWNrZXRzLCBGWF9JTlQzMiAmZSk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX0J5dGVBcnJheSBtX2x1bWluYW5jZTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgbV9idWNrZXRzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfSGlnaExldmVsRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfSGlnaExldmVsRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MGNhOWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19ISUdITEVWQUxFTkNPREVSX0hfDQorI2RlZmluZSBfQkNfSElHSExFVkFMRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQ7DQorY2xhc3MgQ0JDX0hpZ2hMZXZlbEVuY29kZXI7DQorI2RlZmluZSAgQVNDSUlfRU5DT0RBVElPTiAgICAgMA0KKyNkZWZpbmUgIEM0MF9FTkNPREFUSU9OICAgICAgIDENCisjZGVmaW5lICBURVhUX0VOQ09EQVRJT04gICAgICAyDQorI2RlZmluZSAgWDEyX0VOQ09EQVRJT04gICAgICAgMw0KKyNkZWZpbmUgIEVESUZBQ1RfRU5DT0RBVElPTiAgIDQNCisjZGVmaW5lICBCQVNFMjU2X0VOQ09EQVRJT04gICA1DQorY2xhc3MgQ0JDX0hpZ2hMZXZlbEVuY29kZXIgOiBwdWJsaWMgQ0JDX1N5bWJvbFNoYXBlSGludA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCk7DQorICAgIENGWF9CeXRlQXJyYXkmIGdldEJ5dGVzRm9yTWVzc2FnZShDRlhfV2lkZVN0cmluZyBtc2cpOw0KKyAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwgU3ltYm9sU2hhcGVIaW50IHNoYXBlLCBDQkNfRGltZW5zaW9uKiBtaW5TaXplLCBDQkNfRGltZW5zaW9uKiBtYXhTaXplLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBsb29rQWhlYWRUZXN0KENGWF9XaWRlU3RyaW5nIG1zZywgRlhfSU5UMzIgc3RhcnRwb3MsIEZYX0lOVDMyIGN1cnJlbnRNb2RlKTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNEaWdpdChGWF9XQ0hBUiBjaCk7DQorICAgIHN0YXRpYyBGWF9CT09MIGlzRXh0ZW5kZWRBU0NJSShGWF9XQ0hBUiBjaCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBGWF9JTlQzMiBzdGFydHBvcyk7DQorICAgIHN0YXRpYyB2b2lkIGlsbGVnYWxDaGFyYWN0ZXIoRlhfV0NIQVIgYywgRlhfSU5UMzIgJmUpOw0KKw0KK3B1YmxpYzoNCisgICAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX0M0MDsNCisgICAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX0JBU0UyNTY7DQorICAgIHN0YXRpYyBGWF9XQ0hBUiBVUFBFUl9TSElGVDsNCisgICAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX0FOU0lYMTI7DQorICAgIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19URVhUOw0KKyAgICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fRURJRkFDVDsNCisgICAgc3RhdGljIEZYX1dDSEFSIEM0MF9VTkxBVENIOw0KKyAgICBzdGF0aWMgRlhfV0NIQVIgWDEyX1VOTEFUQ0g7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIEZYX1dDSEFSIFBBRDsNCisgICAgc3RhdGljIEZYX1dDSEFSIE1BQ1JPXzA1Ow0KKyAgICBzdGF0aWMgRlhfV0NIQVIgTUFDUk9fMDY7DQorICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90KiBNQUNST18wNV9IRUFERVI7DQorICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90KiBNQUNST18wNl9IRUFERVI7DQorICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90IE1BQ1JPX1RSQUlMRVI7DQorICAgIENGWF9CeXRlQXJyYXkgbV9ieXRlYXJyYXk7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIEZYX1dDSEFSIHJhbmRvbWl6ZTI1M1N0YXRlKEZYX1dDSEFSIGNoLCBGWF9JTlQzMiBjb2Rld29yZFBvc2l0aW9uKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGZpbmRNaW5pbXVtcyhDRlhfRmxvYXRBcnJheSAmY2hhckNvdW50cywgQ0ZYX0ludDMyQXJyYXkgJmludENoYXJDb3VudHMsIEZYX0lOVDMyIG1pbiwgQ0ZYX0J5dGVBcnJheSAmbWlucyk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXRNaW5pbXVtQ291bnQoQ0ZYX0J5dGVBcnJheSAmbWlucyk7DQorICAgIHN0YXRpYyBGWF9CT09MIGlzTmF0aXZlQzQwKEZYX1dDSEFSIGNoKTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVUZXh0KEZYX1dDSEFSIGNoKTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVYMTIoRlhfV0NIQVIgY2gpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc1gxMlRlcm1TZXAoRlhfV0NIQVIgY2gpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc05hdGl2ZUVESUZBQ1QoRlhfV0NIQVIgY2gpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc1NwZWNpYWxCMjU2KEZYX1dDSEFSIGNoKTsNCisNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0x1bWluYW5jZVNvdXJjZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfTHVtaW5hbmNlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhODUxMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX0x1bWluYW5jZVNvdXJjZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfTFVNSU5BTkNFU09VUkNFX0gNCisjZGVmaW5lIF9CQ19MVU1JTkFOQ0VTT1VSQ0VfSA0KK2NsYXNzIENCQ19MdW1pbmFuY2VTb3VyY2U7DQorY2xhc3MgQ0JDX0x1bWluYW5jZVNvdXJjZSAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19MdW1pbmFuY2VTb3VyY2UoRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCk7DQorICAgIHZpcnR1YWwgfkNCQ19MdW1pbmFuY2VTb3VyY2UoKTsNCisgICAgRlhfSU5UMzIgR2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIgR2V0SGVpZ2h0KCk7DQorDQorICAgIHZpcnR1YWwgQ0ZYX0J5dGVBcnJheSAqR2V0Um93KEZYX0lOVDMyIHksIENGWF9CeXRlQXJyYXkgJnJvdywgRlhfSU5UMzIgJmUpID0gMDsNCisgICAgdmlydHVhbCBDRlhfQnl0ZUFycmF5ICpHZXRNYXRyaXgoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBJc0Nyb3BTdXBwb3J0ZWQoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MIElzUm90YXRlU3VwcG9ydGVkKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgQ0JDX0x1bWluYW5jZVNvdXJjZSAqUm90YXRlQ291bnRlckNsb2Nrd2lzZShGWF9JTlQzMiAmZSkgPSAwOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfSU5UMzIgbV93aWR0aDsNCisgICAgRlhfSU5UMzIgbV9oZWlnaHQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVEUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0NWM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURSZWFkZXIuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEUkVBREVSX0hfDQorY2xhc3MgQ0JDX1JlYWRlcjsNCitjbGFzcyBDQkNfQmluYXJ5Qml0bWFwOw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfT25lRFJlYWRlcjsNCitjbGFzcyBDQkNfT25lRFJlYWRlciA6IHB1YmxpYyBDQkNfUmVhZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZURSZWFkZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX09uZURSZWFkZXIoKTsNCisgICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KEZYX0lOVDMyIHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgQ0ZYX0J5dGVTdHJpbmcgRGVEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorDQorcHJvdGVjdGVkOg0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgSU5URUdFUl9NQVRIX1NISUZUOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgUEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SOw0KKyAgICB2b2lkIFJlY29yZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyIHN0YXJ0LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIEZYX0lOVDMyICZlKTsNCisgICAgdm9pZCBSZWNvcmRQYXR0ZXJuSW5SZXZlcnNlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiBzdGFydCwgQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXJzLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIFBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgY29uc3QgRlhfSU5UMzIgKnBhdHRlcm4sIEZYX0lOVDMyIG1heEluZGl2aWR1YWxWYXJpYW5jZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVEaW1SZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURpbVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTAwNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVEaW1SZWFkZXIuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURVUENFQU5SRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEVVBDRUFOUkVBREVSX0hfDQorY2xhc3MgQ0JDX09uZURSZWFkZXI7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVEaW1SZWFkZXI7DQorY2xhc3MgQ0JDX09uZURpbVJlYWRlciA6IHB1YmxpYyBDQkNfT25lRFJlYWRlcg0KK3sNCitwcml2YXRlOg0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgTUFYX0FWR19WQVJJQU5DRTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFOw0KKw0KKyAgICBGWF9CT09MIENoZWNrU3RhbmRhcmRVUENFQU5DaGVja3N1bShDRlhfQnl0ZVN0cmluZyAmcywgRlhfSU5UMzIgJmUpOw0KK3B1YmxpYzoNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIFNUQVJUX0VORF9QQVRURVJOWzNdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgTUlERExFX1BBVFRFUk5bNV07DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBMX1BBVFRFUk5TWzEwXVs0XTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIExfQU5EX0dfUEFUVEVSTlNbMjBdWzRdOw0KKyAgICBDQkNfT25lRGltUmVhZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19PbmVEaW1SZWFkZXIoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KEZYX0lOVDMyIHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRHdWFyZFJhbmdlLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX0ludDMyQXJyYXkgKkZpbmRTdGFydEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tDaGVja3N1bShDRlhfQnl0ZVN0cmluZyAmcywgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfSW50MzJBcnJheSAqRmluZEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgcm93T2Zmc2V0LCBGWF9CT09MIHdoaXRlRmlyc3QsIENGWF9JbnQzMkFycmF5ICpwYXR0ZXJuLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIERlY29kZURpZ2l0KENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIEZYX0lOVDMyIHJvd09mZnNldCwgY29uc3QgRlhfSU5UMzIqIHBhdHRlcm5zLCBGWF9JTlQzMiBwYXR0ZXJuTGVuZ3RoLCBGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRSYW5nZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFJlc3VsdCwgRlhfSU5UMzIgJmUpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgQ0ZYX0ludDMyQXJyYXkgKkRlY29kZUVuZChDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgZW5kU3RhcnQsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURpbVdyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lRGltV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1ZDkzNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZURpbVdyaXRlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRElNV1JJVEVSX0hfDQorI2RlZmluZSBfQkNfT05FRElNV1JJVEVSX0hfDQorY2xhc3MgQ0JDX1dyaXRlcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX09uZURpbVdyaXRlciA6IHB1YmxpYyBDQkNfV3JpdGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZURpbVdyaXRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfT25lRGltV3JpdGVyKCk7DQorICAgIEZYX0JZVEUJCQkqRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURQkJCSpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCBGWF9CWVRFICpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBGWF9JTlQzMiAmb3V0TGVuZ3RoLCBGWF9JTlQzMiAmZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH07DQorICAgIHZpcnR1YWwgdm9pZCAgICAgUmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsICBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgdm9pZCAgICAgUmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIEZYX1dTVFIgY29udGVudHMsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB2b2lkICAgICBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIEZYX1dTVFIgY29udGVudHMsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH07DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJRmlsdGVyQ29udGVudHMoRlhfV1NUUiBjb250ZW50cykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorICAgIH0NCisgICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlSZW5kZXJUZXh0Q29udGVudHMoRlhfV1NUUiBjb250ZW50cykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJU2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0RGF0YUxlbmd0aChGWF9JTlQzMiBsZW5ndGgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDYWxjQ2hlY2tzdW0oRlhfSU5UMzIgc3RhdGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFN0eWxlKEZYX0lOVDMyIHN0eWxlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRGb250KENGWF9Gb250ICogY0ZvbnQpOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfQk9PTAkJCW1fYlByaW50Q2hlY2tzdW07DQorICAgIEZYX0lOVDMyCQltX2lEYXRhTGVudGg7DQorICAgIEZYX0JPT0wJCQltX2JDYWxjQ2hlY2tzdW07DQorICAgIENGWF9Gb250KgkJbV9wRm9udDsNCisgICAgRlhfRkxPQVQJCW1fZkZvbnRTaXplOw0KKyAgICBGWF9JTlQzMgkJbV9pRm9udFN0eWxlOw0KKyAgICBGWF9EV09SRAkJbV9mb250Q29sb3I7DQorICAgIEJDX1RFWFRfTE9DCQltX2xvY1RleHRMb2M7DQorICAgIEZYX0lOVDMyCQltX2lDb250ZW50TGVuOw0KKyAgICBGWF9CT09MICAgICAgICAgbV9iTGVmdFBhZGRpbmc7DQorICAgIEZYX0JPT0wgICAgICAgICBtX2JSaWdodFBhZGRpbmc7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqICAgbV9vdXRwdXQ7DQorICAgIEZYX0lOVDMyICAgICAgICAgICAgICAgbV9iYXJXaWR0aDsNCisgICAgRlhfSU5UMzIgICAgICAgICAgICAgICBtX211bHRpcGxlOw0KKyAgICBGWF9GTE9BVCAgICAgICAgICAgICAgIG1fb3V0cHV0SFNjYWxlOw0KKyAgICB2b2lkCQkJQ2FsY1RleHRJbmZvKGNvbnN0IENGWF9CeXRlU3RyaW5nICZ0ZXh0LCBGWFRFWFRfQ0hBUlBPUyAqY2hhclBvcywgQ0ZYX0ZvbnQgKmNGb250LCBGWF9GTE9BVCBnZVdpZHRoLCBGWF9JTlQzMiBmb250U2l6ZSwgRlhfRkxPQVQgJmNoYXJzTGVuKTsNCisgICAgdmlydHVhbCB2b2lkCVNob3dDaGFycyhGWF9XU1RSIGNvbnRlbnRzLCBDRlhfRElCaXRtYXAgKnBPdXRCaXRtYXAsIENGWF9SZW5kZXJEZXZpY2UgKmRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LCBGWF9JTlQzMiBiYXJXaWR0aCwgRlhfSU5UMzIgbXVsdGlwbGUsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB2b2lkCVNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAgKnBPdXRCaXRtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwgRlhfRkxPQVQgZ2VXaWR0aCwgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBGWF9GTE9BVCBsb2NYLCBGWF9GTE9BVCBsb2NZLCBGWF9JTlQzMiBiYXJXaWR0aCk7DQorICAgIHZpcnR1YWwgdm9pZCAgICBTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSAqZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwgRlhfRkxPQVQgZ2VXaWR0aCwgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBGWF9GTE9BVCBsb2NYLCBGWF9GTE9BVCBsb2NZLCAgRlhfSU5UMzIgYmFyV2lkdGgpOw0KKyAgICBGWF9JTlQzMgkJQXBwZW5kUGF0dGVybihGWF9CWVRFKiB0YXJnZXQsIEZYX0lOVDMyIHBvcywgY29uc3QgRlhfSU5UMzIqIHBhdHRlcm4sIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGgsIEZYX0lOVDMyIHN0YXJ0Q29sb3IsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfV0NIQVIJCVVwcGVyKEZYX1dDSEFSIGNoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RhQmFyUmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kYUJhclJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDM0OTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kYUJhclJlYWRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREFCQVJSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQUJBUlJFQURFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfT25lRFJlYWRlcjsNCitjbGFzcyBDQkNfT25lZENvZGFCYXJSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RhQmFyUmVhZGVyIDogcHVibGljIENCQ19PbmVEUmVhZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRDb2RhQmFyUmVhZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19PbmVkQ29kYUJhclJlYWRlcigpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coRlhfSU5UMzIgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgKkZpbmRBc3Rlcmlza1BhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTCBBcnJheUNvbnRhaW5zKGNvbnN0IEZYX0NIQVIgYXJyYXlbXSwgRlhfQ0hBUiBrZXkpOw0KKyAgICBGWF9DSEFSIFRvTmFycm93V2lkZVBhdHRlcm4oQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXIpOw0KKyAgICBzdGF0aWMgRlhfTFBDU1RSIEFMUEhBQkVUX1NUUklORzsNCisNCisNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIENIQVJBQ1RFUl9FTkNPRElOR1NbMjJdOw0KKw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgbWluQ2hhcmFjdGVyTGVuZ3RoOw0KKw0KKyAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBTVEFSVEVORF9FTkNPRElOR1s4XTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RhQmFyV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kYUJhcldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTgzOWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kYUJhcldyaXRlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREFCQVJXUklURVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQUJBUldSSVRFUl9IXw0KK2VudW0gQkNfVEVYVF9MT0M7DQorY2xhc3MgQ0JDX09uZURpbVdyaXRlcjsNCitjbGFzcyBDQkNfT25lZENvZGFCYXJXcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RhQmFyV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXINCit7DQorcHVibGljOg0KKyAgICBDQkNfT25lZENvZGFCYXJXcml0ZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCk7DQorICAgIEZYX0JZVEUqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRMZW5ndGgsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSAqRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSAqRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nICAgICAgICAgIGVuY29kZWRDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgRlhfQk9PTAkJCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJRmlsdGVyQ29udGVudHMoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIEZYX0JPT0wJCQkJCVNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsNCisgICAgRlhfQk9PTAkJCQkJU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCk7DQorICAgIHZvaWQJCQkJCVNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKTsNCisgICAgRlhfQk9PTAkJCQkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsNCisgICAgRlhfQk9PTAkJCQkJU2V0V2lkZU5hcnJvd1JhdGlvKEZYX0lOVDMyIHJhdGlvKTsNCisgICAgRlhfQk9PTAkJCQkJRmluZENoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgaXNDb250ZW50KTsNCitwcml2YXRlOg0KKyAgICB2b2lkIFJlbmRlclJlc3VsdChGWF9XU1RSIGNvbnRlbnRzLCBGWF9CWVRFKiBjb2RlLCBGWF9JTlQzMiBjb2RlTGVuZ3RoLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFNUQVJUX0VORF9DSEFSU1tdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBDT05URU5UX0NIQVJTW107DQorICAgIEZYX0NIQVIJCQltX2NoU3RhcnQ7DQorICAgIEZYX0NIQVIJCQltX2NoRW5kOw0KKyAgICBGWF9JTlQzMgkJbV9pV2lkZU5hcnJSYXRpbzsNCisNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMTI4UmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTFhNjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFJlYWRlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREExMjhSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQTEyOFJFQURFUl9IXw0KK2NsYXNzIENCQ19PbmVEUmVhZGVyOw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfT25lZENvZGExMjhSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RlMTI4UmVhZGVyIDogcHVibGljIENCQ19PbmVEUmVhZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRDb2RlMTI4UmVhZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19PbmVkQ29kZTEyOFJlYWRlcigpOw0KKyAgICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgQ09ERV9QQVRURVJOU1sxMDddWzddOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgTUFYX0FWR19WQVJJQU5DRTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFOw0KKw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgQ09ERV9TSElGVDsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIENPREVfQ09ERV9DOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgQ09ERV9DT0RFX0I7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDT0RFX0NPREVfQTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIENPREVfRk5DXzE7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDT0RFX0ZOQ18yOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgQ09ERV9GTkNfMzsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIENPREVfRk5DXzRfQTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIENPREVfRk5DXzRfQiA7DQorDQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDT0RFX1NUQVJUX0E7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDT0RFX1NUQVJUX0I7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDT0RFX1NUQVJUX0M7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDT0RFX1NUT1A7DQorcHJpdmF0ZToNCisgICAgQ0ZYX0ludDMyQXJyYXkgKkZpbmRTdGFydFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyICZlKTsNCisgICAgRlhfSU5UMzIgRGVjb2RlQ29kZShDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXJzLCBGWF9JTlQzMiByb3dPZmZzZXQsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMTI4V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYTQ4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkQ29kZTEyOFdyaXRlci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREExMjhXUklURVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQTEyOFdSSVRFUl9IXw0KK2NsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RhMTI4V3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kZTEyOFdyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRDb2RlMTI4V3JpdGVyKCk7DQorICAgIENCQ19PbmVkQ29kZTEyOFdyaXRlcihCQ19UWVBFIHR5cGUpOw0KKyAgICB2aXJ0dWFsIH5DQkNfT25lZENvZGUxMjhXcml0ZXIoKTsNCisgICAgRlhfQllURSAqCQkJCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CWVRFICoJCQkJCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSAqCQkJCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBGWF9JTlQzMiAmb3V0TGVuZ3RoICwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJCUZpbHRlckNvbnRlbnRzKEZYX1dTVFIgY29udGVudHMpOw0KKyAgICBGWF9CT09MCQkJCQkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsNCisgICAgQkNfVFlQRQkJCQkJCUdldFR5cGUoKTsNCitwcml2YXRlOg0KKyAgICBGWF9CT09MIElzRGlnaXRzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgRlhfSU5UMzIgc3RhcnQsIEZYX0lOVDMyIGxlbmd0aCk7DQorICAgIEZYX0lOVDMyIEVuY29kZTEyOEIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBDRlhfUHRyQXJyYXkgJnBhdHRlcm5zKTsNCisgICAgRlhfSU5UMzIgRW5jb2RlMTI4Qyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIENGWF9QdHJBcnJheSAmcGF0dGVybnMpOw0KKyAgICBCQ19UWVBFCQkJCQkJbV9jb2RlRm9ybWF0Ow0KKyAgICBjb25zdCBzdGF0aWMJRlhfSU5UMzIJQ09ERV9TVEFSVF9COw0KKyAgICBjb25zdCBzdGF0aWMJRlhfSU5UMzIJQ09ERV9TVEFSVF9DOw0KKyAgICBjb25zdCBzdGF0aWMJRlhfSU5UMzIJQ09ERV9DT0RFX0I7DQorICAgIGNvbnN0IHN0YXRpYwlGWF9JTlQzMglDT0RFX0NPREVfQzsNCisgICAgY29uc3Qgc3RhdGljCUZYX0lOVDMyCUNPREVfU1RPUDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMzlSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMzlSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZkNmI3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZENvZGUzOVJlYWRlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREEzOVJFQURFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURDT0RBMzlSRUFERVJfSF8NCitjbGFzcyBDQkNfT25lRFJlYWRlcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX09uZWRDb2RhMzlSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RlMzlSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXINCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgRlhfTFBDU1RSIEFMUEhBQkVUX1NUUklORzsNCisgICAgc3RhdGljIEZYX0xQQ1NUUiBDSEVDS1NVTV9TVFJJTkc7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDSEFSQUNURVJfRU5DT0RJTkdTWzQ0XTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIEFTVEVSSVNLX0VOQ09ESU5HOw0KKyAgICBDQkNfT25lZENvZGUzOVJlYWRlcigpOw0KKyAgICBDQkNfT25lZENvZGUzOVJlYWRlcihGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCk7DQorICAgIENCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSk7DQorICAgIHZpcnR1YWwgfkNCQ19PbmVkQ29kZTM5UmVhZGVyKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KK3ByaXZhdGU6DQorICAgIEZYX0JPT0wgbV91c2luZ0NoZWNrRGlnaXQ7DQorICAgIEZYX0JPT0wgbV9leHRlbmRlZE1vZGU7DQorICAgIENGWF9JbnQzMkFycmF5ICpGaW5kQXN0ZXJpc2tQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIFRvTmFycm93V2lkZVBhdHRlcm4oQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXJzKTsNCisgICAgRlhfQ0hBUiBQYXR0ZXJuVG9DaGFyKEZYX0lOVDMyIHBhdHRlcm4sIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlRXh0ZW5kZWQoQ0ZYX0J5dGVTdHJpbmcgJmVuY29kZWQsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMzlXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRDb2RlMzlXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdkOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZENvZGUzOVdyaXRlci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREEzOVdSSVRFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURDT0RBMzlXUklURVJfSF8NCitlbnVtIEJDX1RFWFRfTE9DOw0KK2NsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RhMzlXcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RlMzlXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlcg0KK3sNCitwdWJsaWM6DQorICAgIENCQ19PbmVkQ29kZTM5V3JpdGVyKCk7DQorICAgIENCQ19PbmVkQ29kZTM5V3JpdGVyKEZYX0JPT0wgZXh0ZW5kZWRNb2RlKTsNCisgICAgdmlydHVhbCB+Q0JDX09uZWRDb2RlMzlXcml0ZXIoKTsNCisgICAgRlhfQllURQkJCSpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CWVRFCQkJKkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CWVRFCQkJKkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRMZW5ndGgsIEZYX0lOVDMyICZlKTsNCisgICAgdm9pZAkJCVJlbmRlclJlc3VsdChGWF9XU1RSIGNvbnRlbnRzLCBGWF9CWVRFKiBjb2RlLCBGWF9JTlQzMiBjb2RlTGVuZ3RoLCBGWF9CT09MIGlzRGV2aWNlLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9XaWRlU3RyaW5nICBlbmNvZGVkQ29udGVudHMoRlhfV1NUUiBjb250ZW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIEZYX0JPT0wgICAgICAgICBDaGVja0V4dGVuZGVkQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgIEZpbHRlckV4dGVuZGVkQ29udGVudHMoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIENGWF9XaWRlU3RyaW5nICBSZW5kZXJUZXh0Q29udGVudHMoRlhfV1NUUiBjb250ZW50cyk7DQorICAgIENGWF9XaWRlU3RyaW5nICBSZW5kZXJFeHRlbmRlZFRleHRDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2N0aW9uKTsNCisgICAgRlhfQk9PTAkJCVNldFdpZGVOYXJyb3dSYXRpbyhGWF9JTlQzMiByYXRpbyk7DQorcHJpdmF0ZToNCisgICAgdm9pZAkJCVRvSW50QXJyYXkoRlhfSU5UMzIgYSwgRlhfSU5UMzIgKnRvUmV0dXJuKTsNCisgICAgRlhfQ0hBUgkJCUNhbGNDaGVja1N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfSU5UMzIJCW1faVdpZGVOYXJyUmF0aW87DQorICAgIEZYX0JPT0wgICAgICAgICBtX2V4dGVuZGVkTW9kZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRFQU4xM1JlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjEzUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmYjliNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRFQU4xM1JlYWRlci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FREVBTjEzUkVBREVSX0hfDQorI2RlZmluZSBfQkNfT05FREVBTjEzUkVBREVSX0hfDQorY2xhc3MgQ0JDX09uZURpbVJlYWRlcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1JlYWRlcjsNCitjbGFzcyBDQkNfT25lZEVBTjEzUmVhZGVyIDogcHVibGljIENCQ19PbmVEaW1SZWFkZXINCit7DQorcHVibGljOg0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgRklSU1RfRElHSVRfRU5DT0RJTkdTWzEwXTsNCisgICAgQ0JDX09uZWRFQU4xM1JlYWRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfT25lZEVBTjEzUmVhZGVyKCk7DQorcHJpdmF0ZToNCisgICAgdm9pZCBEZXRlcm1pbmVGaXJzdERpZ2l0KENGWF9CeXRlU3RyaW5nICZyZXN1bHQsICBGWF9JTlQzMiBsZ1BhdHRlcm5Gb3VuZCwgRlhfSU5UMzIgJmUpOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfSU5UMzIgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRSYW5nZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFN0cmluZywgRlhfSU5UMzIgJmUpOw0KKyAgICBmcmllbmQgY2xhc3MgQ0JDX09uZWRVUENBUmVhZGVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjEzV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkRUFOMTNXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUzY2ZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjEzV3JpdGVyLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19PTkVERUFOMTNXUklURVJfSF8NCisjZGVmaW5lIF9CQ19PTkVERUFOMTNXUklURVJfSF8NCitjbGFzcyBDQkNfT25lRGltV3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkRUFOMTNXcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1dyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyDQorew0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fY29kZVdpZHRoOw0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRFQU4xM1dyaXRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfT25lZEVBTjEzV3JpdGVyKCk7DQorDQorICAgIEZYX0JZVEUqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CWVRFKglFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JZVEUqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEZYX0lOVDMyICZvdXRMZW5ndGgsIEZYX0lOVDMyICZlKTsNCisgICAgdm9pZAkJUmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCUNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgRlhfSU5UMzIJCUNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAkJU2hvd0NoYXJzKEZYX1dTVFIgY29udGVudHMsIENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyIGJhcldpZHRoLCBGWF9JTlQzMiBtdWx0aXBsZSwgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjhSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRFQU44UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRFQU44UmVhZGVyLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19PTkVERUFOOFJFQURFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURFQU44UkVBREVSX0hfDQorY2xhc3MgQ0JDX09uZURpbVJlYWRlcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX09uZWRFQU44UmVhZGVyOw0KK2NsYXNzIENCQ19PbmVkRUFOOFJlYWRlciA6IHB1YmxpYyBDQkNfT25lRGltUmVhZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRFQU44UmVhZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19PbmVkRUFOOFJlYWRlcigpOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfSU5UMzIgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSosIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkRUFOOFdyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjhXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU1NzM0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZEVBTjhXcml0ZXIuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURFQU44V1JJVEVSX0hfDQorI2RlZmluZSBfQkNfT05FREVBTjhXUklURVJfSF8NCitlbnVtIEJDX1RFWFRfTE9DOw0KK2NsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRFQU44V3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkRUFOOFdyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyDQorew0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fY29kZVdpZHRoOw0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRFQU44V3JpdGVyKCk7DQorICAgIHZpcnR1YWwJCX5DQkNfT25lZEVBTjhXcml0ZXIoKTsNCisgICAgRlhfQllURQkqCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCAsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSAqCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMgLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JZVEUgKgkJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgRlhfSU5UMzIgJm91dExlbmd0aCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2b2lkCQkJUmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCUNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgdm9pZAkJCVNldERhdGFMZW5ndGgoRlhfSU5UMzIgbGVuZ3RoKTsNCisgICAgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICAgIEZYX0lOVDMyCQlDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzKTsNCitwcm90ZWN0ZWQ6DQorDQorICAgIHZvaWQJCVNob3dDaGFycyhGWF9XU1RSIGNvbnRlbnRzLCBDRlhfRElCaXRtYXAgKnBPdXRCaXRtYXAsIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LCBGWF9JTlQzMiBiYXJXaWR0aCwgRlhfSU5UMzIgbXVsdGlwbGUsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX09uZWRVUENBUmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkVVBDQVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjZjNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkVVBDQVJlYWRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRFVQQ0FSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEVVBDQVJFQURFUl9IXw0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVEaW1SZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1JlYWRlcjsNCitjbGFzcyBDQkNfT25lZFVQQ0FSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRVUENBUmVhZGVyIDogcHVibGljIENCQ19PbmVEaW1SZWFkZXINCit7DQorcHJpdmF0ZToNCisgICAgQ0JDX09uZWRFQU4xM1JlYWRlciAqbV9lYW4xM1JlYWRlcjsNCitwdWJsaWM6DQorICAgIENCQ19PbmVkVVBDQVJlYWRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfT25lZFVQQ0FSZWFkZXIoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KEZYX0lOVDMyIHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhGWF9JTlQzMiByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRHdWFyZFJhbmdlLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfSU5UMzIgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRSYW5nZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFN0cmluZywgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBNYXliZVJldHVyblJlc3VsdChDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19PbmVkVVBDQVdyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZFVQQ0FXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTc0Y2ViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfT25lZFVQQ0FXcml0ZXIuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURVUENBV1JJVEVSX0hfDQorI2RlZmluZSBfQkNfT05FRFVQQ0FXUklURVJfSF8NCitjbGFzcyBDQkNfV3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkRUFOMTNXcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRVUENBV3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkVVBDQVdyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyDQorew0KK3ByaXZhdGU6DQorICAgIENCQ19PbmVkRUFOMTNXcml0ZXIgKm1fc3ViV3JpdGVyOw0KK3B1YmxpYzoNCisgICAgQ0JDX09uZWRVUENBV3JpdGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19PbmVkVVBDQVdyaXRlcigpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KKyAgICBGWF9CWVRFKglFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CWVRFKglFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKTsNCisgICAgdm9pZAkJUmVuZGVyUmVzdWx0KEZYX1dTVFIgY29udGVudHMsIEZYX0JZVEUqIGNvZGUsIEZYX0lOVDMyIGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJCUNoZWNrQ29udGVudFZhbGlkaXR5KEZYX1dTVFIgY29udGVudHMpOw0KKyAgICBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhGWF9XU1RSIGNvbnRlbnRzKTsNCisgICAgRlhfSU5UMzIJQ2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cyk7DQorDQorcHJvdGVjdGVkOg0KKw0KKyAgICB2b2lkCQlTaG93Q2hhcnMoRlhfV1NUUiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgYmFyV2lkdGgsIEZYX0lOVDMyIG11bHRpcGxlLCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTcuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzEyNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTcuaApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1BERjQxN19IXw0KKyNkZWZpbmUgX0JDX1BERjQxN19IXw0KK2NsYXNzIENCQ19Db21wYWN0aW9uOw0KK2NsYXNzIENCQ19CYXJjb2RlUm93Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWF0cml4Ow0KK2NsYXNzIENCQ19QREY0MTc7DQorY2xhc3MgQ0JDX1BERjQxNyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1BERjQxNygpOw0KKyAgICBDQkNfUERGNDE3KEZYX0JPT0wgY29tcGFjdCk7DQorICAgIHZpcnR1YWwgfkNCQ19QREY0MTcoKTsNCisgICAgQ0JDX0JhcmNvZGVNYXRyaXgqIGdldEJhcmNvZGVNYXRyaXgoKTsNCisgICAgdm9pZCBnZW5lcmF0ZUJhcmNvZGVMb2dpYyhDRlhfV2lkZVN0cmluZyBtc2csIEZYX0lOVDMyIGVycm9yQ29ycmVjdGlvbkxldmVsLCBGWF9JTlQzMiAmZSk7DQorICAgIHZvaWQgc2V0RGltZW5zaW9ucyhGWF9JTlQzMiBtYXhDb2xzLCBGWF9JTlQzMiBtaW5Db2xzLCBGWF9JTlQzMiBtYXhSb3dzLCBGWF9JTlQzMiBtaW5Sb3dzKTsNCisgICAgdm9pZCBzZXRDb21wYWN0aW9uKENvbXBhY3Rpb24gY29tcGFjdGlvbik7DQorICAgIHZvaWQgc2V0Q29tcGFjdChGWF9CT09MIGNvbXBhY3QpOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBGWF9JTlQzMiBTVEFSVF9QQVRURVJOOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgU1RPUF9QQVRURVJOOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQ09ERVdPUkRfVEFCTEVbXVsxMDAwXTsNCisgICAgc3RhdGljIEZYX0ZMT0FUIFBSRUZFUlJFRF9SQVRJTzsNCisgICAgc3RhdGljIEZYX0ZMT0FUIERFRkFVTFRfTU9EVUxFX1dJRFRIOw0KKyAgICBzdGF0aWMgRlhfRkxPQVQgSEVJR0hUOw0KKyAgICBDQkNfQmFyY29kZU1hdHJpeCogbV9iYXJjb2RlTWF0cml4Ow0KKyAgICBGWF9CT09MIG1fY29tcGFjdDsNCisgICAgQ29tcGFjdGlvbiBtX2NvbXBhY3Rpb247DQorICAgIEZYX0lOVDMyIG1fbWluQ29sczsNCisgICAgRlhfSU5UMzIgbV9tYXhDb2xzOw0KKyAgICBGWF9JTlQzMiBtX21heFJvd3M7DQorICAgIEZYX0lOVDMyIG1fbWluUm93czsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfSU5UMzIgY2FsY3VsYXRlTnVtYmVyT2ZSb3dzKEZYX0lOVDMyIG0sIEZYX0lOVDMyIGssIEZYX0lOVDMyIGMpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgZ2V0TnVtYmVyT2ZQYWRDb2Rld29yZHMoRlhfSU5UMzIgbSwgRlhfSU5UMzIgaywgRlhfSU5UMzIgYywgRlhfSU5UMzIgcik7DQorICAgIHN0YXRpYyB2b2lkIGVuY29kZUNoYXIoRlhfSU5UMzIgcGF0dGVybiwgRlhfSU5UMzIgbGVuLCBDQkNfQmFyY29kZVJvdyogbG9naWMpOw0KKyAgICB2b2lkIGVuY29kZUxvd0xldmVsKENGWF9XaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsIEZYX0lOVDMyIGMsIEZYX0lOVDMyIHIsIEZYX0lOVDMyIGVycm9yQ29ycmVjdGlvbkxldmVsLCBDQkNfQmFyY29kZU1hdHJpeCogbG9naWMpOw0KKyAgICBDRlhfSW50MzJBcnJheSogZGV0ZXJtaW5lRGltZW5zaW9ucyhGWF9JTlQzMiBzb3VyY2VDb2RlV29yZHMsIEZYX0lOVDMyIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTBjNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CQVJDT0RFTUFUUklYX0hfDQorI2RlZmluZSBfQkNfQkFSQ09ERU1BVFJJWF9IXw0KK2NsYXNzIENCQ19CYXJjb2RlUm93Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWF0cml4Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWF0cml4IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfQmFyY29kZU1hdHJpeCgpOw0KKyAgICBDQkNfQmFyY29kZU1hdHJpeChGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHdpZHRoKTsNCisgICAgdmlydHVhbCB+Q0JDX0JhcmNvZGVNYXRyaXgoKTsNCisgICAgdm9pZCBzZXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfQllURSB2YWx1ZSk7DQorICAgIHZvaWQgc2V0TWF0cml4KEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0JPT0wgYmxhY2spOw0KKyAgICB2b2lkIHN0YXJ0Um93KCk7DQorICAgIENCQ19CYXJjb2RlUm93KiBnZXRDdXJyZW50Um93KCk7DQorICAgIENGWF9CeXRlQXJyYXkmIGdldE1hdHJpeCgpOw0KKyAgICBDRlhfQnl0ZUFycmF5JiBnZXRTY2FsZWRNYXRyaXgoRlhfSU5UMzIgc2NhbGUpOw0KKyAgICBDRlhfQnl0ZUFycmF5JiBnZXRTY2FsZWRNYXRyaXgoRlhfSU5UMzIgeFNjYWxlLCBGWF9JTlQzMiB5U2NhbGUpOw0KKyAgICBGWF9JTlQzMiBnZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBnZXRIZWlnaHQoKTsNCitwcml2YXRlOg0KKyAgICBDRlhfUHRyQXJyYXkgbV9tYXRyaXg7DQorICAgIENGWF9CeXRlQXJyYXkgbV9tYXRyaXhPdXQ7DQorICAgIEZYX0lOVDMyIG1fY3VycmVudFJvdzsNCisgICAgRlhfSU5UMzIgbV9oZWlnaHQ7DQorICAgIEZYX0lOVDMyIG1fd2lkdGg7DQorICAgIEZYX0lOVDMyIG1fb3V0V2lkdGg7DQorICAgIEZYX0lOVDMyIG1fb3V0SGVpZ2h0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIxMjgyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CQVJDT0RFTUVUQURBVEFfSF8NCisjZGVmaW5lIF9CQ19CQVJDT0RFTUVUQURBVEFfSF8NCitjbGFzcyBDQkNfQmFyY29kZU1ldGFkYXRhOw0KK2NsYXNzIENCQ19CYXJjb2RlTWV0YWRhdGEgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19CYXJjb2RlTWV0YWRhdGEoRlhfSU5UMzIgY29sdW1uQ291bnQsIEZYX0lOVDMyIHJvd0NvdW50VXBwZXJQYXJ0LCBGWF9JTlQzMiByb3dDb3VudExvd2VyUGFydCwgRlhfSU5UMzIgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQmFyY29kZU1ldGFkYXRhKCk7DQorICAgIEZYX0lOVDMyIGdldENvbHVtbkNvdW50KCk7DQorICAgIEZYX0lOVDMyIGdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorICAgIEZYX0lOVDMyIGdldFJvd0NvdW50KCk7DQorICAgIEZYX0lOVDMyIGdldFJvd0NvdW50VXBwZXJQYXJ0KCk7DQorICAgIEZYX0lOVDMyIGdldFJvd0NvdW50TG93ZXJQYXJ0KCk7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9jb2x1bW5Db3VudDsNCisgICAgRlhfSU5UMzIgbV9lcnJvckNvcnJlY3Rpb25MZXZlbDsNCisgICAgRlhfSU5UMzIgbV9yb3dDb3VudFVwcGVyUGFydDsNCisgICAgRlhfSU5UMzIgbV9yb3dDb3VudExvd2VyUGFydDsNCisgICAgRlhfSU5UMzIgbV9yb3dDb3VudDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVSb3cuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVSb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZkMTViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3QmFyY29kZVJvdy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQkFSQ09ERVJPV19IXw0KKyNkZWZpbmUgX0JDX0JBUkNPREVST1dfSF8NCitjbGFzcyBDQkNfQmFyY29kZVJvdzsNCitjbGFzcyBDQkNfQmFyY29kZVJvdyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0JhcmNvZGVSb3coRlhfSU5UMzIgd2lkdGgpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQmFyY29kZVJvdygpOw0KKyAgICB2b2lkIHNldChGWF9JTlQzMiB4LCBGWF9CWVRFIHZhbHVlKTsNCisgICAgdm9pZCBzZXQoRlhfSU5UMzIgeCwgRlhfQk9PTCBibGFjayk7DQorICAgIHZvaWQgYWRkQmFyKEZYX0JPT0wgYmxhY2ssIEZYX0lOVDMyIHdpZHRoKTsNCisgICAgQ0ZYX0J5dGVBcnJheSYgZ2V0Um93KCk7DQorICAgIENGWF9CeXRlQXJyYXkmIGdldFNjYWxlZFJvdyhGWF9JTlQzMiBzY2FsZSk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX0J5dGVBcnJheSBtX3JvdzsNCisgICAgQ0ZYX0J5dGVBcnJheSBtX291dHB1dDsNCisgICAgRlhfSU5UMzIgbV9jdXJyZW50TG9jYXRpb247DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTVjOGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0JBUkNPREVWQUxVRV9IXw0KKyNkZWZpbmUgX0JDX0JBUkNPREVWQUxVRV9IXw0KK2NsYXNzIENCQ19CYXJjb2RlVmFsdWU7DQorY2xhc3MgQ0JDX0JhcmNvZGVWYWx1ZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX0JhcmNvZGVWYWx1ZSgpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQmFyY29kZVZhbHVlKCk7DQorICAgIHZvaWQgc2V0VmFsdWUoRlhfSU5UMzIgdmFsdWUpOw0KKyAgICBDRlhfSW50MzJBcnJheSogZ2V0VmFsdWUoKTsNCisgICAgRlhfSU5UMzIgZ2V0Q29uZmlkZW5jZShGWF9JTlQzMiB2YWx1ZSk7DQorcHJpdmF0ZToNCisgICAgQ0ZYX0ludDMyQXJyYXkgbV9rZXlzOw0KKyAgICBDRlhfSW50MzJBcnJheSBtX3ZhbHVlczsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0JvdW5kaW5nQm94LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCb3VuZGluZ0JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYWUyYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdCb3VuZGluZ0JveC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQk9VTkRJTkdCT1hfSF8NCisjZGVmaW5lIF9CQ19CT1VORElOR0JPWF9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19Cb3VuZGluZ0JveDsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3ggOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Cb3VuZGluZ0JveChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX0JvdW5kaW5nQm94KENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQm91bmRpbmdCb3goKTsNCisgICAgc3RhdGljIENCQ19Cb3VuZGluZ0JveCogbWVyZ2UoQ0JDX0JvdW5kaW5nQm94KiBsZWZ0Qm94LCBDQkNfQm91bmRpbmdCb3gqIHJpZ2h0Qm94LCBGWF9JTlQzMiAmZSk7DQorICAgIENCQ19Cb3VuZGluZ0JveCogYWRkTWlzc2luZ1Jvd3MoRlhfSU5UMzIgbWlzc2luZ1N0YXJ0Um93cywgRlhfSU5UMzIgbWlzc2luZ0VuZFJvd3MsIEZYX0JPT0wgaXNMZWZ0LCBGWF9JTlQzMiAmZSk7DQorICAgIHZvaWQgc2V0VG9wUmlnaHQoQ0JDX1Jlc3VsdFBvaW50IHRvcFJpZ2h0KTsNCisgICAgdm9pZCBzZXRCb3R0b21SaWdodChDQkNfUmVzdWx0UG9pbnQgYm90dG9tUmlnaHQpOw0KKyAgICBGWF9JTlQzMiBnZXRNaW5YKCk7DQorICAgIEZYX0lOVDMyIGdldE1heFgoKTsNCisgICAgRlhfSU5UMzIgZ2V0TWluWSgpOw0KKyAgICBGWF9JTlQzMiBnZXRNYXhZKCk7DQorICAgIENCQ19SZXN1bHRQb2ludCogZ2V0VG9wTGVmdCgpOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGdldFRvcFJpZ2h0KCk7DQorICAgIENCQ19SZXN1bHRQb2ludCogZ2V0Qm90dG9tTGVmdCgpOw0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGdldEJvdHRvbVJpZ2h0KCk7DQorcHJpdmF0ZToNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9pbWFnZTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBtX3RvcExlZnQ7DQorICAgIENCQ19SZXN1bHRQb2ludCogbV9ib3R0b21MZWZ0Ow0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIG1fdG9wUmlnaHQ7DQorICAgIENCQ19SZXN1bHRQb2ludCogbV9ib3R0b21SaWdodDsNCisgICAgRlhfSU5UMzIgbV9taW5YOw0KKyAgICBGWF9JTlQzMiBtX21heFg7DQorICAgIEZYX0lOVDMyIG1fbWluWTsNCisgICAgRlhfSU5UMzIgbV9tYXhZOw0KKyAgICB2b2lkIGluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0KTsNCisgICAgdm9pZCBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0NvZGV3b3JkLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjNjZjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09ERVdPUkRfSF8NCisjZGVmaW5lIF9CQ19DT0RFV09SRF9IXw0KK2NsYXNzIENCQ19Db2Rld29yZDsNCitjbGFzcyBDQkNfQ29kZXdvcmQgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19Db2Rld29yZChGWF9JTlQzMiBzdGFydFgsIEZYX0lOVDMyIGVuZFgsIEZYX0lOVDMyIGJ1Y2tldCwgRlhfSU5UMzIgdmFsdWUpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQ29kZXdvcmQoKTsNCisgICAgRlhfQk9PTCBoYXNWYWxpZFJvd051bWJlcigpIDsNCisgICAgRlhfQk9PTCBpc1ZhbGlkUm93TnVtYmVyKEZYX0lOVDMyIHJvd051bWJlcik7DQorICAgIHZvaWQgc2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCisgICAgRlhfSU5UMzIgZ2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIgZ2V0U3RhcnRYKCk7DQorICAgIEZYX0lOVDMyIGdldEVuZFgoKTsNCisgICAgRlhfSU5UMzIgZ2V0QnVja2V0KCk7DQorICAgIEZYX0lOVDMyIGdldFZhbHVlKCk7DQorICAgIEZYX0lOVDMyIGdldFJvd051bWJlcigpOw0KKyAgICB2b2lkIHNldFJvd051bWJlcihGWF9JTlQzMiByb3dOdW1iZXIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZygpOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBGWF9JTlQzMiBCQVJDT0RFX1JPV19VTktOT1dOOw0KKyAgICBGWF9JTlQzMiBtX3N0YXJ0WDsNCisgICAgRlhfSU5UMzIgbV9lbmRYOw0KKyAgICBGWF9JTlQzMiBtX2J1Y2tldDsNCisgICAgRlhfSU5UMzIgbV92YWx1ZTsNCisgICAgRlhfSU5UMzIgbV9yb3dOdW1iZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjI2ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1BERjQxN0NPREVXT1JEREVDT0RFUl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0NPREVXT1JEREVDT0RFUl9IXw0KK2NsYXNzIENCQ19QREY0MTdDb21tb247DQorY2xhc3MgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlcjsNCisjZGVmaW5lICAgIGNvbHVtbiAgICAgOA0KK2NsYXNzIENCQ19QREY0MTdDb2Rld29yZERlY29kZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlcigpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXREZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfRkxPQVQgUkFUSU9TX1RBQkxFW11bOF07DQorICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogc2FtcGxlQml0Q291bnRzKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgZ2V0Qml0VmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldENsb3Nlc3REZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3Q29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllM2ZlNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0NvbW1vbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3Q09NTU9OX0hfDQorI2RlZmluZSBfQkNfUERGNDE3Q09NTU9OX0hfDQorY2xhc3MgQ0JDX1BERjQxN0NvbW1vbjsNCitjbGFzcyBDQkNfUERGNDE3Q29tbW9uIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfUERGNDE3Q29tbW9uKCk7DQorICAgIHZpcnR1YWwgfkNCQ19QREY0MTdDb21tb24oKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldEJpdENvdW50U3VtKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXRDb2Rld29yZChGWF9EV09SRCBzeW1ib2wpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTlVNQkVSX09GX0NPREVXT1JEUzsNCisgICAgc3RhdGljIEZYX0lOVDMyIE1BWF9DT0RFV09SRFNfSU5fQkFSQ09ERTsNCisgICAgc3RhdGljIEZYX0lOVDMyIE1JTl9ST1dTX0lOX0JBUkNPREU7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNQVhfUk9XU19JTl9CQVJDT0RFOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTUFYX0NPREVXT1JEU19JTl9ST1c7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNT0RVTEVTX0lOX0NPREVXT1JEOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQorICAgIHN0YXRpYyBGWF9JTlQzMiBCQVJTX0lOX01PRFVMRTsNCisgICAgc3RhdGljIEZYX0lOVDMyIFNZTUJPTF9UQUJMRVtdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQ09ERVdPUkRfVEFCTEVbXTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIEVNUFRZX0lOVF9BUlJBWTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGZpbmRDb2Rld29yZEluZGV4KEZYX0RXT1JEIHN5bWJvbCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdDb21wYWN0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdDb21wYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YTIzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0NvbXBhY3Rpb24uaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0NPTVBBQ1RJT05fSF8NCisjZGVmaW5lIF9CQ19DT01QQUNUSU9OX0hfDQorY2xhc3MgQ0JDX0NvbXBhY3Rpb247DQorZW51bSBDb21wYWN0aW9uIHsNCisgICAgQVVUTywNCisgICAgVEVYVCwNCisgICAgQllURVMsDQorICAgIE5VTUVSSUMNCit9Ow0KK2NsYXNzIENCQ19Db21wYWN0aW9uIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfQ29tcGFjdGlvbigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfQ29tcGFjdGlvbigpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MTI3NjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19ERUNPREVEQklUU1RSRUFNUEFSU0VSX0hfDQorI2RlZmluZSBfQkNfREVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTsNCitjbGFzcyBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOw0KK2NsYXNzIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICAgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIENGWF9CeXRlU3RyaW5nIGVjTGV2ZWwsIEZYX0lOVDMyICZlKTsNCisNCitwcml2YXRlOg0KKyAgICBlbnVtIE1vZGUgew0KKyAgICAgICAgQUxQSEEsDQorICAgICAgICBMT1dFUiwNCisgICAgICAgIE1JWEVELA0KKyAgICAgICAgUFVOQ1QsDQorICAgICAgICBBTFBIQV9TSElGVCwNCisgICAgICAgIFBVTkNUX1NISUZUDQorICAgIH07DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNQVhfTlVNRVJJQ19DT0RFV09SRFM7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBQTDsNCisgICAgc3RhdGljIEZYX0lOVDMyIExMOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQVM7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNTDsNCisgICAgc3RhdGljIEZYX0lOVDMyIEFMOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgUFM7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBQQUw7DQorICAgIHN0YXRpYyBGWF9DSEFSIFBVTkNUX0NIQVJTWzI5XTsNCisgICAgc3RhdGljIEZYX0NIQVIgTUlYRURfQ0hBUlNbMzBdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgRVhQOTAwWzE2XTsNCisgICAgc3RhdGljIEZYX0lOVDMyIE5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFM7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBkZWNvZGVNYWNyb0Jsb2NrKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIEZYX0lOVDMyIGNvZGVJbmRleCwgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiByZXN1bHRNZXRhZGF0YSwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgdGV4dENvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgRlhfSU5UMzIgY29kZUluZGV4LCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCisgICAgc3RhdGljIHZvaWQgZGVjb2RlVGV4dENvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkgJnRleHRDb21wYWN0aW9uRGF0YSwgQ0ZYX0ludDMyQXJyYXkgJmJ5dGVDb21wYWN0aW9uRGF0YSwgRlhfSU5UMzIgbGVuZ3RoLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGJ5dGVDb21wYWN0aW9uKEZYX0lOVDMyIG1vZGUsIENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIEZYX0lOVDMyIGNvZGVJbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBudW1lcmljQ29tcGFjdGlvbihDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBGWF9JTlQzMiBjb2RlSW5kZXgsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nIGRlY29kZUJhc2U5MDB0b0Jhc2UxMChDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBGWF9JTlQzMiBjb3VudCwgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzM0MDE0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FRFRFQ1RJT05SRVNVTFRfSF8NCisjZGVmaW5lIF9CQ19FRFRFQ1RJT05SRVNVTFRfSF8NCitjbGFzcyBDQkNfQmFyY29kZU1ldGFkYXRhOw0KK2NsYXNzIENCQ19Cb3VuZGluZ0JveDsNCitjbGFzcyBDQkNfQ29kZXdvcmQ7DQorY2xhc3MgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Ow0KK2NsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHQgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHQoQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhLCBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KTsNCisgICAgdmlydHVhbCB+Q0JDX0RldGVjdGlvblJlc3VsdCgpOw0KKyAgICBDRlhfUHRyQXJyYXkmIGdldERldGVjdGlvblJlc3VsdENvbHVtbnMoKTsNCisgICAgdm9pZCBzZXRCb3VuZGluZ0JveChDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KTsNCisgICAgQ0JDX0JvdW5kaW5nQm94KiBnZXRCb3VuZGluZ0JveCgpOw0KKyAgICB2b2lkIHNldERldGVjdGlvblJlc3VsdENvbHVtbihGWF9JTlQzMiBiYXJjb2RlQ29sdW1uLCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pOw0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oRlhfSU5UMzIgYmFyY29kZUNvbHVtbik7DQorICAgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQorDQorICAgIEZYX0lOVDMyIGdldEJhcmNvZGVDb2x1bW5Db3VudCgpOw0KKyAgICBGWF9JTlQzMiBnZXRCYXJjb2RlUm93Q291bnQoKTsNCisgICAgRlhfSU5UMzIgZ2V0QmFyY29kZUVDTGV2ZWwoKTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQURKVVNUX1JPV19OVU1CRVJfU0tJUDsNCisgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogbV9iYXJjb2RlTWV0YWRhdGE7DQorICAgIENGWF9QdHJBcnJheSBtX2RldGVjdGlvblJlc3VsdENvbHVtbnM7DQorICAgIENCQ19Cb3VuZGluZ0JveCogbV9ib3VuZGluZ0JveDsNCisgICAgRlhfSU5UMzIgbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQorcHJpdmF0ZToNCisgICAgdm9pZCBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbik7DQorICAgIEZYX0lOVDMyIGFkanVzdFJvd051bWJlcnMoKTsNCisgICAgRlhfSU5UMzIgYWRqdXN0Um93TnVtYmVyc0J5Um93KCk7DQorICAgIEZYX0lOVDMyIGFkanVzdFJvd051bWJlcnNGcm9tQm90aFJJKCk7DQorICAgIEZYX0lOVDMyIGFkanVzdFJvd051bWJlcnNGcm9tUlJJKCk7DQorICAgIEZYX0lOVDMyIGFkanVzdFJvd051bWJlcnNGcm9tTFJJKCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBhZGp1c3RSb3dOdW1iZXJJZlZhbGlkKEZYX0lOVDMyIHJvd0luZGljYXRvclJvd051bWJlciwgRlhfSU5UMzIgaW52YWxpZFJvd0NvdW50cywgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCk7DQorICAgIHZvaWQgYWRqdXN0Um93TnVtYmVycyhGWF9JTlQzMiBiYXJjb2RlQ29sdW1uLCBGWF9JTlQzMiBjb2Rld29yZHNSb3csIENGWF9QdHJBcnJheSogY29kZXdvcmRzKTsNCisgICAgc3RhdGljIEZYX0JPT0wgYWRqdXN0Um93TnVtYmVyKENCQ19Db2Rld29yZCogY29kZXdvcmQsIENCQ19Db2Rld29yZCogb3RoZXJDb2Rld29yZCk7DQorDQorDQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGMzYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RFVEVDVElPTlJFU1VMVENPTFVNTl9IXw0KKyNkZWZpbmUgX0JDX0RFVEVDVElPTlJFU1VMVENPTFVNTl9IXw0KK2NsYXNzIENCQ19Db2Rld29yZDsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3g7DQorY2xhc3MgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKCk7DQorICAgIENCQ19Db2Rld29yZCogZ2V0Q29kZXdvcmROZWFyYnkoRlhfSU5UMzIgaW1hZ2VSb3cpOw0KKyAgICBGWF9JTlQzMiBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChGWF9JTlQzMiBpbWFnZVJvdyk7DQorICAgIEZYX0lOVDMyIGNvZGV3b3JkSW5kZXhUb0ltYWdlUm93KEZYX0lOVDMyIGNvZGV3b3JkSW5kZXgpOw0KKyAgICB2b2lkIHNldENvZGV3b3JkKEZYX0lOVDMyIGltYWdlUm93LCBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkKTsNCisgICAgQ0JDX0NvZGV3b3JkKiBnZXRDb2Rld29yZChGWF9JTlQzMiBpbWFnZVJvdyk7DQorICAgIENCQ19Cb3VuZGluZ0JveCogZ2V0Qm91bmRpbmdCb3goKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBnZXRDb2Rld29yZHMoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCitwdWJsaWM6DQorICAgIENCQ19Cb3VuZGluZ0JveCogbV9ib3VuZGluZ0JveDsNCisgICAgQ0ZYX1B0ckFycmF5KiBtX2NvZGV3b3JkczsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTUFYX05FQVJCWV9ESVNUQU5DRTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkZDBmMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfREVURUNUSU9OUkVTVUxUUk9XSU5ESUNBVE9SQ09MVU1OX0hfDQorI2RlZmluZSBfQkNfREVURUNUSU9OUkVTVUxUUk9XSU5ESUNBVE9SQ09MVU1OX0hfDQorY2xhc3MgQ0JDX0JhcmNvZGVNZXRhZGF0YTsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3g7DQorY2xhc3MgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uIDogcHVibGljIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4NCit7DQorcHVibGljOg0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsIEZYX0JPT0wgaXNMZWZ0KTsNCisgICAgdmlydHVhbCB+Q0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbigpOw0KKyAgICB2b2lkIHNldFJvd051bWJlcnMoKTsNCisgICAgRlhfSU5UMzIgYWRqdXN0Q29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGdldFJvd0hlaWdodHMoRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBhZGp1c3RJbmNvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycyhDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSk7DQorICAgIENCQ19CYXJjb2RlTWV0YWRhdGEqIGdldEJhcmNvZGVNZXRhZGF0YSgpOw0KKyAgICBGWF9CT09MIGlzTGVmdCgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZygpOw0KK3ByaXZhdGU6DQorICAgIEZYX0JPT0wgbV9pc0xlZnQ7DQorICAgIHZvaWQgcmVtb3ZlSW5jb3JyZWN0Q29kZXdvcmRzKENGWF9QdHJBcnJheSogY29kZXdvcmRzLCBDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEZXRlY3Rvci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTc1NTllCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3IuaApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RFVEVDVE9SX0hfDQorI2RlZmluZSBfQkNfREVURUNUT1JfSF8NCitjbGFzcyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ7DQorY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcDsNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfRGV0ZWN0b3I7DQorY2xhc3MgQ0JDX0RldGVjdG9yIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfRGV0ZWN0b3IoKTsNCisgICAgdmlydHVhbCB+Q0JDX0RldGVjdG9yKCk7DQorICAgIHN0YXRpYyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIGRldGVjdChDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgRlhfSU5UMzIgaGludHMsIEZYX0JPT0wgbXVsdGlwbGUsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgcm90YXRlMTgwKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCk7DQorICAgIHN0YXRpYyBDQkNfQ29tbW9uQml0QXJyYXkqIG1pcnJvcihDQkNfQ29tbW9uQml0QXJyYXkqIGlucHV0LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJlc3VsdCk7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIEZYX0lOVDMyIElOREVYRVNfU1RBUlRfUEFUVEVSTltdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgSU5ERVhFU19TVE9QX1BBVFRFUk5bXTsNCisgICAgc3RhdGljIEZYX0lOVDMyIElOVEVHRVJfTUFUSF9TSElGVDsNCisgICAgc3RhdGljIEZYX0lOVDMyIFBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUjsNCisgICAgc3RhdGljIEZYX0lOVDMyIE1BWF9BVkdfVkFSSUFOQ0U7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRTsNCisgICAgc3RhdGljIEZYX0lOVDMyIFNUQVJUX1BBVFRFUk5bXTsNCisgICAgc3RhdGljIEZYX0lOVDMyIFNUT1BfUEFUVEVSTltdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTUFYX1BJWEVMX0RSSUZUOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTUFYX1BBVFRFUk5fRFJJRlQ7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBTS0lQUEVEX1JPV19DT1VOVF9NQVg7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBST1dfU1RFUDsNCisgICAgc3RhdGljIEZYX0lOVDMyIEJBUkNPREVfTUlOX0hFSUdIVDsNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSogZGV0ZWN0KEZYX0JPT0wgbXVsdGlwbGUsIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCk7DQorICAgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIGZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyIHN0YXJ0Um93LCBGWF9JTlQzMiBzdGFydENvbHVtbik7DQorICAgIHN0YXRpYyB2b2lkIGNvcHlUb1Jlc3VsdChDRlhfUHRyQXJyYXkqIHJlc3VsdCwgQ0ZYX1B0ckFycmF5KiB0bXBSZXN1bHQsIEZYX0lOVDMyKiBkZXN0aW5hdGlvbkluZGV4ZXMsIEZYX0lOVDMyIGRlc3RpbmF0aW9uTGVuZ3RoKTsNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSogZmluZFJvd3NXaXRoUGF0dGVybihDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIHN0YXJ0Um93LCBGWF9JTlQzMiBzdGFydENvbHVtbiwgRlhfSU5UMzIqIHBhdHRlcm4sIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGgpOw0KKyAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiBjb2x1bW4sIEZYX0lOVDMyIHJvdywgRlhfSU5UMzIgd2lkdGgsIEZYX0JPT0wgd2hpdGVGaXJzdCwgRlhfSU5UMzIqIHBhdHRlcm4sIEZYX0lOVDMyIHBhdHRlcm5MZW5ndGgsIENGWF9JbnQzMkFycmF5ICZjb3VudGVycyk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBwYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSAmY291bnRlcnMsIEZYX0lOVDMyKiBwYXR0ZXJuLCBGWF9JTlQzMiBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1NTdmMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdERVRFQ1RPUlJFU1VMVF9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0RFVEVDVE9SUkVTVUxUX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ7DQorY2xhc3MgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywgQ0ZYX1B0ckFycmF5KiBwb2ludHMpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoKTsNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogZ2V0Qml0cygpIDsNCisgICAgQ0ZYX1B0ckFycmF5KiBnZXRQb2ludHMoKTsNCitwcml2YXRlOg0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBtX2JpdHM7DQorICAgIENGWF9QdHJBcnJheSogbV9wb2ludHM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEaW1lbnNpb25zLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdEaW1lbnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZWFmZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0RpbWVuc2lvbnMuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RJTUVOU0lPTlNfSF8NCisjZGVmaW5lIF9CQ19ESU1FTlNJT05TX0hfDQorY2xhc3MgQ0JDX0RpbWVuc2lvbnM7DQorY2xhc3MgQ0JDX0RpbWVuc2lvbnMgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19EaW1lbnNpb25zKEZYX0lOVDMyIG1pbkNvbHMsIEZYX0lOVDMyIG1heENvbHMsIEZYX0lOVDMyIG1pblJvd3MsIEZYX0lOVDMyIG1heFJvd3MpOw0KKyAgICB2aXJ0dWFsIH5DQkNfRGltZW5zaW9ucygpOw0KKyAgICBGWF9JTlQzMiBnZXRNaW5Db2xzKCk7DQorICAgIEZYX0lOVDMyIGdldE1heENvbHMoKTsNCisgICAgRlhfSU5UMzIgZ2V0TWluUm93cygpOw0KKyAgICBGWF9JTlQzMiBnZXRNYXhSb3dzKCk7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9taW5Db2xzOw0KKyAgICBGWF9JTlQzMiBtX21heENvbHM7DQorICAgIEZYX0lOVDMyIG1fbWluUm93czsNCisgICAgRlhfSU5UMzIgbV9tYXhSb3dzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlOGVkYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdFQ0VSUk9SQ09SUkVDVElPTl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0VDRVJST1JDT1JSRUNUSU9OX0hfDQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOw0KK2NsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ow0KK2NsYXNzIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjsNCitjbGFzcyBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24oKTsNCisgICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBkZWNvZGUoQ0ZYX0ludDMyQXJyYXkgJnJlY2VpdmVkLCBGWF9JTlQzMiBudW1FQ0NvZGV3b3JkcywgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVzLCBGWF9JTlQzMiAmZSk7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIENCQ19QREY0MTdFQ01vZHVsdXNHRiogbV9maWVsZDsNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSogcnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBhLCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYiwgRlhfSU5UMzIgUiwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRFcnJvckxvY2F0aW9ucyhDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogZmluZEVycm9yTWFnbml0dWRlcyhDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JFdmFsdWF0b3IsIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckxvY2F0b3IsIENGWF9JbnQzMkFycmF5ICZlcnJvckxvY2F0aW9ucywgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c0dGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViZTMzZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c0dGLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdFQ01PRFVMVVNHRl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0VDTU9EVUxVU0dGX0hfDQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk7DQorY2xhc3MgQ0JDX1BERjQxN0NvbW1vbjsNCitjbGFzcyBDQkNfUERGNDE3RUNNb2R1bHVzR0Y7DQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c0dGIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzR0YoRlhfSU5UMzIgbW9kdWx1cywgRlhfSU5UMzIgZ2VuZXJhdG9yLCBGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgfkNCQ19QREY0MTdFQ01vZHVsdXNHRigpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGdldFplcm8oKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGdldE9uZSgpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYnVpbGRNb25vbWlhbChGWF9JTlQzMiBkZWdyZWUsIEZYX0lOVDMyIGNvZWZmaWNpZW50LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIGFkZChGWF9JTlQzMiBhLCBGWF9JTlQzMiBiKTsNCisgICAgRlhfSU5UMzIgc3VidHJhY3QoRlhfSU5UMzIgYSwgRlhfSU5UMzIgYik7DQorICAgIEZYX0lOVDMyIGV4cChGWF9JTlQzMiBhKTsNCisgICAgRlhfSU5UMzIgbG9nKEZYX0lOVDMyIGEsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfSU5UMzIgaW52ZXJzZShGWF9JTlQzMiBhLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIG11bHRpcGx5KEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIpOw0KKyAgICBGWF9JTlQzMiBnZXRTaXplKCk7DQorICAgIHN0YXRpYyBDQkNfUERGNDE3RUNNb2R1bHVzR0YqIFBERjQxN19HRjsNCitwcml2YXRlOg0KKyAgICBDRlhfSW50MzJBcnJheSBtX2V4cFRhYmxlOw0KKyAgICBDRlhfSW50MzJBcnJheSBtX2xvZ1RhYmxlOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbV96ZXJvOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbV9vbmU7DQorICAgIEZYX0lOVDMyIG1fbW9kdWx1czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlkNmMxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3RUNNT0RVTFVTUE9MWV9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0VDTU9EVUxVU1BPTFlfSF8NCitjbGFzcyBDQkNfUERGNDE3RUNNb2R1bHVzR0Y7DQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk7DQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KENCQ19QREY0MTdFQ01vZHVsdXNHRiogZmllbGQsIENGWF9JbnQzMkFycmF5ICZjb2VmZmljaWVudHMsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB+Q0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGdldENvZWZmaWNpZW50cygpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzR0YqIGdldEZpZWxkKCk7DQorICAgIEZYX0lOVDMyIGdldERlZ3JlZSgpOw0KKyAgICBGWF9CT09MIGlzWmVybygpOw0KKyAgICBGWF9JTlQzMiBnZXRDb2VmZmljaWVudChGWF9JTlQzMiBkZWdyZWUpOw0KKyAgICBGWF9JTlQzMiBldmFsdWF0ZUF0KEZYX0lOVDMyIGEpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYWRkKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogc3VidHJhY3QoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBGWF9JTlQzMiAmZSk7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtdWx0aXBseShDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsIEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG5lZ2F0aXZlKEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG11bHRpcGx5KEZYX0lOVDMyIHNjYWxhciwgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbXVsdGlwbHlCeU1vbm9taWFsKEZYX0lOVDMyIGRlZ3JlZSwgRlhfSU5UMzIgY29lZmZpY2llbnQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBkaXZpZGUoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQorcHJpdmF0ZToNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBtX2ZpZWxkOw0KKyAgICBDRlhfSW50MzJBcnJheSBtX2NvZWZmaWNpZW50czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzYWVlOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfDQorI2RlZmluZSBfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfDQorY2xhc3MgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjsNCitjbGFzcyBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uKCk7DQorICAgIHZpcnR1YWwgfkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoRlhfSU5UMzIgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldFJlY29tbWVuZGVkTWluaW11bUVycm9yQ29ycmVjdGlvbkxldmVsKEZYX0lOVDMyIG4sIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGdlbmVyYXRlRXJyb3JDb3JyZWN0aW9uKENGWF9XaWRlU3RyaW5nIGRhdGFDb2Rld29yZHMsIEZYX0lOVDMyIGVycm9yQ29ycmVjdGlvbkxldmVsLCBGWF9JTlQzMiAmZSk7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIEZYX0lOVDMyIEVDX0NPRUZGSUNJRU5UU1tdWzI1MDBdOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2ExNzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdISUdITEVWRUxFTkNPREVSX0hfDQorI2RlZmluZSBfQkNfUERGNDE3SElHSExFVkVMRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19Db21wYWN0aW9uOw0KK2NsYXNzIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOw0KK2NsYXNzIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2RlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3SGlnaExldmVsRW5jb2RlcigpOw0KKyAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgQ29tcGFjdGlvbiBjb21wYWN0aW9uLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEludmVyc2UoKTsNCisgICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBGWF9JTlQzMiBURVhUX0NPTVBBQ1RJT047DQorICAgIHN0YXRpYyBGWF9JTlQzMiBCWVRFX0NPTVBBQ1RJT047DQorICAgIHN0YXRpYyBGWF9JTlQzMiBOVU1FUklDX0NPTVBBQ1RJT047DQorICAgIHN0YXRpYyBGWF9JTlQzMiBTVUJNT0RFX1BVTkNUVUFUSU9OOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTEFUQ0hfVE9fVEVYVDsNCisgICAgc3RhdGljIEZYX0lOVDMyIExBVENIX1RPX0JZVEVfUEFEREVEOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTEFUQ0hfVE9fTlVNRVJJQzsNCisgICAgc3RhdGljIEZYX0lOVDMyIFNISUZUX1RPX0JZVEU7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBMQVRDSF9UT19CWVRFOw0KKyAgICBzdGF0aWMgRlhfQllURSBURVhUX01JWEVEX1JBV1tdOw0KKyAgICBzdGF0aWMgRlhfQllURSBURVhUX1BVTkNUVUFUSU9OX1JBV1tdOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgTUlYRURbMTI4XTsNCisgICAgc3RhdGljIEZYX0lOVDMyIFBVTkNUVUFUSU9OWzEyOF07DQorICAgIHN0YXRpYyBDRlhfQnl0ZUFycmF5KiBnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGVuY29kZVRleHQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBGWF9JTlQzMiBzdGFydHBvcywgRlhfSU5UMzIgY291bnQsIENGWF9XaWRlU3RyaW5nICZzYiwgRlhfSU5UMzIgaW5pdGlhbFN1Ym1vZGUpOw0KKyAgICBzdGF0aWMgdm9pZCBlbmNvZGVCaW5hcnkoQ0ZYX0J5dGVBcnJheSogYnl0ZXMsIEZYX0lOVDMyIHN0YXJ0cG9zLCBGWF9JTlQzMiBjb3VudCwgRlhfSU5UMzIgc3RhcnRtb2RlLCBDRlhfV2lkZVN0cmluZyAmc2IpOw0KKyAgICBzdGF0aWMgdm9pZCBlbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywgRlhfSU5UMzIgc3RhcnRwb3MsIEZYX0lOVDMyIGNvdW50LCBDRlhfV2lkZVN0cmluZyAmc2IpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc0RpZ2l0KEZYX1dDSEFSIGNoKTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNBbHBoYVVwcGVyKEZYX1dDSEFSIGNoKTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNBbHBoYUxvd2VyKEZYX1dDSEFSIGNoKTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNNaXhlZChGWF9XQ0hBUiBjaCk7DQorICAgIHN0YXRpYyBGWF9CT09MIGlzUHVuY3R1YXRpb24oRlhfV0NIQVIgY2gpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc1RleHQoRlhfV0NIQVIgY2gpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgRlhfSU5UMzIgc3RhcnRwb3MpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBGWF9JTlQzMiBzdGFydHBvcyk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX0J5dGVBcnJheSogYnl0ZXMsIEZYX0lOVDMyIHN0YXJ0cG9zLCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YzAyMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdSZWFkZXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1BERjQxN1JFQURFUl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN1JFQURFUl9IXw0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19QREY0MTdSZWFkZXI7DQorY2xhc3MgQ0JDX1BERjQxN1JlYWRlciA6IHB1YmxpYyBDQkNfUmVhZGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1BERjQxN1JlYWRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3UmVhZGVyKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0JPT0wgbXVsdGlwbGUsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKTsNCitwcml2YXRlOg0KKyAgICBzdGF0aWMgRlhfSU5UMzIgZ2V0TWF4V2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwgQ0JDX1Jlc3VsdFBvaW50KiBwMik7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXRNaW5XaWR0aChDQkNfUmVzdWx0UG9pbnQqIHAxLCBDQkNfUmVzdWx0UG9pbnQqIHAyKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldE1heENvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldE1pbkNvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Yzc3ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3UkVBREVSX0hfDQorI2RlZmluZSBfQkNfUERGNDE3UkVBREVSX0hfDQorY2xhc3MgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOw0KK2NsYXNzIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCk7DQorICAgIHZpcnR1YWwgfkNCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSgpOw0KKyAgICBGWF9JTlQzMiBnZXRTZWdtZW50SW5kZXgoKTsNCisgICAgdm9pZCBzZXRTZWdtZW50SW5kZXgoRlhfSU5UMzIgc2VnbWVudEluZGV4KTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZ2V0RmlsZUlkKCk7DQorICAgIHZvaWQgc2V0RmlsZUlkKENGWF9CeXRlU3RyaW5nIGZpbGVJZCk7DQorICAgIENGWF9JbnQzMkFycmF5JiBnZXRPcHRpb25hbERhdGEoKTsNCisgICAgdm9pZCBzZXRPcHRpb25hbERhdGEoQ0ZYX0ludDMyQXJyYXkgJm9wdGlvbmFsRGF0YSk7DQorICAgIEZYX0JPT0wgaXNMYXN0U2VnbWVudCgpOw0KKyAgICB2b2lkIHNldExhc3RTZWdtZW50KEZYX0JPT0wgbGFzdFNlZ21lbnQpOw0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fc2VnbWVudEluZGV4Ow0KKyAgICBDRlhfQnl0ZVN0cmluZyBtX2ZpbGVJZDsNCisgICAgQ0ZYX0ludDMyQXJyYXkgbV9vcHRpb25hbERhdGE7DQorICAgIEZYX0JPT0wgbV9sYXN0U2VnbWVudDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0ZTVmNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3U0NBTk5JTkdERUNPREVSX0hfDQorI2RlZmluZSBfQkNfUERGNDE3U0NBTk5JTkdERUNPREVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfRXJyb3JDb3JyZWN0aW9uOw0KK2NsYXNzIENCQ19Db2Rld29yZDsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3g7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWV0YWRhdGE7DQorY2xhc3MgQ0JDX0JhcmNvZGVWYWx1ZTsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Ow0KK2NsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW47DQorY2xhc3MgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlcjsNCitjbGFzcyBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyICA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyKCk7DQorICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgICAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGUoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BMZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIGltYWdlQm90dG9tTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZVRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlQm90dG9tUmlnaHQsIEZYX0lOVDMyIG1pbkNvZGV3b3JkV2lkdGgsIEZYX0lOVDMyIG1heENvZGV3b3JkV2lkdGgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKENGWF9QdHJBcnJheSogYmFyY29kZU1hdHJpeCk7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIEZYX0lOVDMyIENPREVXT1JEX1NLRVdfU0laRTsNCisgICAgc3RhdGljIEZYX0lOVDMyIE1BWF9FUlJPUlM7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBNQVhfRUNfQ09ERVdPUkRTOw0KKyAgICBzdGF0aWMgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKiBlcnJvckNvcnJlY3Rpb247DQorICAgIHN0YXRpYyBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBtZXJnZShDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLCBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbiwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgQ0JDX0JvdW5kaW5nQm94KiBhZGp1c3RCb3VuZGluZ0JveChDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4sIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldE1heChDRlhfSW50MzJBcnJheSYgdmFsdWVzKTsNCisgICAgc3RhdGljIENCQ19CYXJjb2RlTWV0YWRhdGEqIGdldEJhcmNvZGVNZXRhZGF0YShDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLCBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbik7DQorICAgIHN0YXRpYyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiBnZXRSb3dJbmRpY2F0b3JDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsIENCQ19SZXN1bHRQb2ludCBzdGFydFBvaW50LA0KKyAgICAgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsIEZYX0lOVDMyIG1pbkNvZGV3b3JkV2lkdGgsIEZYX0lOVDMyIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICBzdGF0aWMgdm9pZCBhZGp1c3RDb2Rld29yZENvdW50KENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlTWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY3JlYXRlRGVjb2RlclJlc3VsdChDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBjcmVhdGVEZWNvZGVyUmVzdWx0RnJvbUFtYmlndW91c1ZhbHVlcyhGWF9JTlQzMiBlY0xldmVsLCBDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBDRlhfSW50MzJBcnJheSAmZXJhc3VyZUFycmF5LCBDRlhfSW50MzJBcnJheSAmYW1iaWd1b3VzSW5kZXhlcywNCisgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIGFtYmlndW91c0luZGV4VmFsdWVzLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIGNyZWF0ZUJhcmNvZGVNYXRyaXgoQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0KTsNCisgICAgc3RhdGljIEZYX0JPT0wgaXNWYWxpZEJhcmNvZGVDb2x1bW4oQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LCBGWF9JTlQzMiBiYXJjb2RlQ29sdW1uKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGdldFN0YXJ0Q29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgRlhfSU5UMzIgYmFyY29kZUNvbHVtbiwgRlhfSU5UMzIgaW1hZ2VSb3csIEZYX0JPT0wgbGVmdFRvUmlnaHQpOw0KKyAgICBzdGF0aWMgQ0JDX0NvZGV3b3JkKiBkZXRlY3RDb2Rld29yZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwgRlhfSU5UMzIgbWluQ29sdW1uLCBGWF9JTlQzMiBtYXhDb2x1bW4sIEZYX0JPT0wgbGVmdFRvUmlnaHQsIEZYX0lOVDMyIHN0YXJ0Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpbWFnZVJvdywgRlhfSU5UMzIgbWluQ29kZXdvcmRXaWR0aCwgRlhfSU5UMzIgbWF4Q29kZXdvcmRXaWR0aCk7DQorICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogZ2V0TW9kdWxlQml0Q291bnQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIEZYX0lOVDMyIG1pbkNvbHVtbiwgRlhfSU5UMzIgbWF4Q29sdW1uLCBGWF9CT09MIGxlZnRUb1JpZ2h0LCBGWF9JTlQzMiBzdGFydENvbHVtbiwgRlhfSU5UMzIgaW1hZ2VSb3cpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgZ2V0TnVtYmVyT2ZFQ0NvZGVXb3JkcyhGWF9JTlQzMiBiYXJjb2RlRUNMZXZlbCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBhZGp1c3RDb2Rld29yZFN0YXJ0Q29sdW1uKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBGWF9JTlQzMiBtaW5Db2x1bW4sIEZYX0lOVDMyIG1heENvbHVtbiwgRlhfQk9PTCBsZWZ0VG9SaWdodCwgRlhfSU5UMzIgY29kZXdvcmRTdGFydENvbHVtbiwgRlhfSU5UMzIgaW1hZ2VSb3cpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBjaGVja0NvZGV3b3JkU2tldyhGWF9JTlQzMiBjb2Rld29yZFNpemUsIEZYX0lOVDMyIG1pbkNvZGV3b3JkV2lkdGgsIEZYX0lOVDMyIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZUNvZGV3b3JkcyhDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBGWF9JTlQzMiBlY0xldmVsLCBDRlhfSW50MzJBcnJheSAmZXJhc3VyZXMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIGNvcnJlY3RFcnJvcnMoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVzLCBGWF9JTlQzMiBudW1FQ0NvZGV3b3JkcywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCB2ZXJpZnlDb2Rld29yZENvdW50KENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIEZYX0lOVDMyIG51bUVDQ29kZXdvcmRzLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogZ2V0Qml0Q291bnRGb3JDb2Rld29yZChGWF9JTlQzMiBjb2Rld29yZCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihGWF9JTlQzMiBjb2Rld29yZCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19QREY0MTdXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk3NGY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUERGNDE3V3JpdGVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdXUklURVJfSF8NCisjZGVmaW5lIF9CQ19QREY0MTdXUklURVJfSF8NCitjbGFzcyBDQkNfVHdvRGltV3JpdGVyOw0KK2NsYXNzIENCQ19QREY0MTdXcml0ZXI7DQorY2xhc3MgQ0JDX1BERjQxN1dyaXRlciA6IHB1YmxpYyBDQkNfVHdvRGltV3JpdGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1BERjQxN1dyaXRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUERGNDE3V3JpdGVyKCk7DQorICAgIEZYX0JZVEUgKglFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmNvbnRlbnRzLCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKTsNCisNCisgICAgRlhfQllURSAqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0JZVEUgKglFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTAkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoRlhfSU5UMzIgbGV2ZWwpOw0KKyAgICB2b2lkCQlTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpOw0KK3ByaXZhdGU6DQorICAgIHZvaWQJCXJvdGF0ZUFycmF5KENGWF9CeXRlQXJyYXkmIGJpdGFycmF5LCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0KTsNCisgICAgRlhfQk9PTAkJbV9iVHJ1bmNhdGVkOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkFsaWdubWVudFBhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI2ODdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkFMSUdOTUVOVFBBVFRFUk5fSF8NCisjZGVmaW5lIF9CQ19RUkFMSUdOTUVOVFBBVFRFUk5fSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19SRUFJMDEzeDB4MXhEZWNvZGVyOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm4gIDogcHVibGljIENCQ19SZXN1bHRQb2ludA0KK3sNCitwcml2YXRlOg0KKyAgICBGWF9GTE9BVCBtX21vZHVsZVNpemU7DQorcHVibGljOg0KKyAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKEZYX0ZMT0FUIHBvc1gsIEZYX0ZMT0FUIHBvc1ksIEZYX0ZMT0FUIGVzdGltYXRlTW9kdWxlU2l6ZSk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkFsaWdubWVudFBhdHRlcm4oKTsNCisgICAgRlhfQk9PTCBBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKTsNCisgICAgRlhfRkxPQVQgR2V0WCgpOw0KKyAgICBGWF9GTE9BVCBHZXRZKCk7DQorICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4gKkNsb25lKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzFjNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQUxJR05NRU5UUEFUVEVSTkZJTkRFUl9IXw0KKyNkZWZpbmUgX0JDX1FSQUxJR05NRU5UUEFUVEVSTkZJTkRFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjsNCitjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9pbWFnZTsNCisgICAgQ0ZYX1B0ckFycmF5IG1fcG9zc2libGVDZW50ZXJzOw0KKyAgICBGWF9JTlQzMiBtX3N0YXJ0WDsNCisgICAgRlhfSU5UMzIgbV9zdGFydFk7DQorICAgIEZYX0lOVDMyIG1fd2lkdGg7DQorICAgIEZYX0lOVDMyIG1faGVpZ2h0Ow0KKyAgICBGWF9GTE9BVCBtX21vZHVsZVNpemU7DQorICAgIENGWF9JbnQzMkFycmF5IG1fY3Jvc3NDaGVja1N0YXRlQ291bnQ7DQorcHVibGljOg0KKyAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBGWF9JTlQzMiBzdGFydFgsIEZYX0lOVDMyIHN0YXJ0WSwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCwgRlhfRkxPQVQgbW9kdWxlU2l6ZSk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoKTsNCisgICAgRlhfQk9PTCBGb3VuZFBhdHRlcm5Dcm9zcyhjb25zdCBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCk7DQorICAgIEZYX0ZMT0FUIENyb3NzQ2hlY2tWZXJ0aWNhbChGWF9JTlQzMiBzdGFydEksIEZYX0lOVDMyIHN0YXJ0SiwgRlhfSU5UMzIgbWF4Q291bnQsIEZYX0lOVDMyIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKTsNCisgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogRmluZChGWF9JTlQzMiAmZSk7DQorICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4gKkhhbmRsZVBvc3NpYmxlQ2VudGVyKGNvbnN0IENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50LCBGWF9JTlQzMiBpLCBGWF9JTlQzMiBqKTsNCisgICAgc3RhdGljIEZYX0ZMT0FUIENlbnRlckZyb21FbmQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIEZYX0lOVDMyIGVuZCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE3NmY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQUJJVE1BVFJJWFBBUlNFUl9IXw0KKyNkZWZpbmUgX0JDX1FSQUJJVE1BVFJJWFBBUlNFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXggOw0KK2NsYXNzIENCQ19RUkNvZGVyVmVyc2lvbjsNCitjbGFzcyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOw0KK2NsYXNzIENCQ19RUkRhdGFNYXNrOw0KK2NsYXNzIENCQ19RUkJpdE1hdHJpeFBhcnNlcjsNCitjbGFzcyBDQkNfUVJCaXRNYXRyaXhQYXJzZXIgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9iaXRNYXRyaXg7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1fdGVtcEJpdE1hdHJpeDsNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uICAgKm1fdmVyc2lvbjsNCisgICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiAqbV9wYXJzZWRGb3JtYXRJbmZvOw0KKyAgICBGWF9JTlQzMiBtX2RpbWVuc2lvbjsNCitwdWJsaWM6DQorICAgIENCQ19RUkJpdE1hdHJpeFBhcnNlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJCaXRNYXRyaXhQYXJzZXIoKTsNCisgICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiAqUmVhZEZvcm1hdEluZm9ybWF0aW9uKEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uCQkJICAqUmVhZFZlcnNpb24oRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMgkJCQkgICBDb3B5Qml0KEZYX0lOVDMyIGksIEZYX0lOVDMyIGosIEZYX0lOVDMyIHZlcnNpb25CaXRzKTsNCisgICAgQ0ZYX0J5dGVBcnJheQkgICpSZWFkQ29kZXdvcmRzKEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0TWF0cml4LCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTFhZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVSZWFkZXIuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJFQURFUl9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJFQURFUl9IXw0KK2NsYXNzIENCQ19RUkRldGVjdG9yOw0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX1FSQ29kZXJEZWNvZGVyOw0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NjsNCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb247DQorY2xhc3MgQ0JDX1FSRGV0ZWN0b3I7DQorY2xhc3MgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfUVJDb2Rlck1vZGU7DQorY2xhc3MgQ0JDX1FSRGF0YU1hc2s7DQorY2xhc3MgQ0JDX1FSQ29kZVJlYWRlcjsNCitjbGFzcyBDQkNfUVJDb2RlUmVhZGVyICA6IHB1YmxpYyBDQkNfUmVhZGVyDQorew0KK3ByaXZhdGU6DQorICAgIENCQ19RUkNvZGVyRGVjb2RlciAqbV9kZWNvZGVyOw0KK3B1YmxpYzoNCisgICAgQ0JDX1FSQ29kZVJlYWRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJDb2RlUmVhZGVyKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiBieXRlTW9kZURlY29kZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmZpbGVuYW1lLCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgYnl0ZU1vZGVEZWNvZGUsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIEZYX0lOVDMyIGhpbnRzLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGE0Y2JlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlV3JpdGVyLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSV1JJVEVSX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUldSSVRFUl9IXw0KKyNpbmNsdWRlICJCQ19Ud29EaW1Xcml0ZXIuaCINCitjbGFzcyBDQkNfVHdvRGltV3JpdGVyOw0KK2NsYXNzIENCQ19NdWx0aUJhckNvZGVzOw0KK2NsYXNzIENCQ19RUkNvZGVyV3JpdGVyOw0KK2NsYXNzIENCQ19RUkNvZGVXcml0ZXIgIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXINCit7DQorcHVibGljOg0KKyAgICBDQkNfUVJDb2RlV3JpdGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVXcml0ZXIoKTsNCisgICAgRlhfQllURSogRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjb250ZW50cywgRlhfSU5UMzIgZWNMZXZlbCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiAgJmUpOw0KKyAgICBGWF9CWVRFKiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBGWF9JTlQzMiAmb3V0V2lkdGgsIEZYX0lOVDMyICZvdXRIZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQk9PTCBTZXRWZXJzaW9uKEZYX0lOVDMyIHZlcnNpb24pOw0KKyAgICBGWF9CT09MIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKEZYX0lOVDMyIGxldmVsKTsNCisgICAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KK3ByaXZhdGU6DQorDQorICAgIEZYX0lOVDMyIG1faVZlcnNpb247DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljZTE0MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXIuaApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSX0hfDQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCA7DQorY2xhc3MgQ0JDX1FSQ29kZXJNb2RlOw0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19RUkNvZGVyOw0KK2NsYXNzIENCQ19RUkNvZGVyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgQ0JDX1FSQ29kZXJNb2RlKiBtX21vZGU7DQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIG1fZWNMZXZlbDsNCisgICAgRlhfSU5UMzIgbV92ZXJzaW9uOw0KKyAgICBGWF9JTlQzMiBtX21hdHJpeFdpZHRoOw0KKyAgICBGWF9JTlQzMiBtX21hc2tQYXR0ZXJuOw0KKyAgICBGWF9JTlQzMiBtX251bVRvdGFsQnl0ZXM7DQorICAgIEZYX0lOVDMyIG1fbnVtRGF0YUJ5dGVzOw0KKyAgICBGWF9JTlQzMiBtX251bUVDQnl0ZXM7DQorICAgIEZYX0lOVDMyIG1fbnVtUlNCbG9ja3M7DQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtX21hdHJpeDsNCitwdWJsaWM6DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBOVU1fTUFTS19QQVRURVJOUzsNCisgICAgQ0JDX1FSQ29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSQ29kZXIoKTsNCisgICAgQ0JDX1FSQ29kZXJNb2RlKiBHZXRNb2RlKCk7DQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEdldEVDTGV2ZWwoKTsNCisgICAgRlhfSU5UMzIgR2V0VmVyc2lvbigpOw0KKyAgICBGWF9JTlQzMiBHZXRNYXRyaXhXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBHZXRNYXNrUGF0dGVybigpOw0KKyAgICBGWF9JTlQzMiBHZXROdW1Ub3RhbEJ5dGVzKCk7DQorICAgIEZYX0lOVDMyIEdldE51bURhdGFCeXRlcygpOw0KKyAgICBGWF9JTlQzMiBHZXROdW1FQ0J5dGVzKCk7DQorICAgIEZYX0lOVDMyIEdldE51bVJTQmxvY2tzKCk7DQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBHZXRNYXRyaXgoKTsNCisgICAgRlhfSU5UMzIgQXQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9CT09MIElzVmFsaWQoKTsNCisNCisgICAgdm9pZCBTZXRNb2RlKENCQ19RUkNvZGVyTW9kZSogdmFsdWUpOw0KKyAgICB2b2lkIFNldEVDTGV2ZWwoQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCk7DQorICAgIHZvaWQgU2V0VmVyc2lvbihGWF9JTlQzMiB2ZXJzaW9uKTsNCisgICAgdm9pZCBTZXRNYXRyaXhXaWR0aChGWF9JTlQzMiB3aWR0aCk7DQorICAgIHZvaWQgU2V0TWFza1BhdHRlcm4oRlhfSU5UMzIgcGF0dGVybik7DQorICAgIHZvaWQgU2V0TnVtRGF0YUJ5dGVzKEZYX0lOVDMyIGJ5dGVzKTsNCisgICAgdm9pZCBTZXROdW1Ub3RhbEJ5dGVzKEZYX0lOVDMyIHZhbHVlKTsNCisgICAgdm9pZCBTZXROdW1FQ0J5dGVzKEZYX0lOVDMyIHZhbHVlKTsNCisgICAgdm9pZCBTZXROdW1SU0Jsb2NrcyhGWF9JTlQzMiBibG9jayk7DQorICAgIHZvaWQgU2V0TWF0cml4KENCQ19Db21tb25CeXRlTWF0cml4KiB2YWx1ZSk7DQorICAgIHN0YXRpYyBGWF9CT09MIElzVmFsaWRNYXNrUGF0dGVybihGWF9JTlQzMiBtYXNrUGF0dGVybik7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyQml0VmVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5YWJiYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSRUNPREVSQklUVkVDVE9SX0hfDQorI2RlZmluZSBfQkNfUVJFQ09ERVJCSVRWRUNUT1JfSF8NCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsNCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvciAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiBtX3NpemVJbkJpdHM7DQorICAgIEZYX0JZVEUgKm1fYXJyYXk7DQorICAgIEZYX0lOVDMyIG1fc2l6ZTsNCisNCisgICAgdm9pZCBBcHBlbmRCeXRlKEZYX0lOVDMyIHZhbHVlKTsNCitwdWJsaWM6DQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKCk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyQml0VmVjdG9yKCk7DQorICAgIEZYX0lOVDMyIEF0KEZYX0lOVDMyIGluZGV4LCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIFNpemUoKTsNCisgICAgRlhfSU5UMzIgc2l6ZUluQnl0ZXMoKTsNCisgICAgdm9pZCBBcHBlbmRCaXQoRlhfSU5UMzIgYml0LCBGWF9JTlQzMiAmZSk7DQorICAgIHZvaWQgQXBwZW5kQml0cyhGWF9JTlQzMiB2YWx1ZSwgRlhfSU5UMzIgbnVtQml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICB2b2lkIEFwcGVuZEJpdFZlY3RvcihDQkNfUVJDb2RlckJpdFZlY3RvciAqYml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICB2b2lkIFhPUihDQkNfUVJDb2RlckJpdFZlY3RvciAqb3RoZXIsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfQllURSogR2V0QXJyYXkoKTsNCisgICAgdm9pZCBDbGVhcigpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNGFjMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSQkxPQ0tQQUlSX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUkJMT0NLUEFJUl9IXw0KK2NsYXNzIENCQ19Db21tb25CeXRlQXJyYXk7DQorY2xhc3MgQ0JDX1FSQ29kZXJCbG9ja1BhaXI7DQorY2xhc3MgQ0JDX1FSQ29kZXJCbG9ja1BhaXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBtX2RhdGFCeXRlczsNCisgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogbV9lcnJvckNvcnJlY3Rpb25CeXRlczsNCitwdWJsaWM6DQorICAgIENCQ19RUkNvZGVyQmxvY2tQYWlyKENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGEsIENCQ19Db21tb25CeXRlQXJyYXkqIGVycm9yQ29ycmVjdGlvbik7DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyQmxvY2tQYWlyKCk7DQorDQorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIEdldERhdGFCeXRlcygpOw0KKyAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckRlY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1YWY3OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJEZWNvZGVyLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSREVDT0RFUl9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJERUNPREVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19RUkJpdE1hdHJpeFBhcnNlcjsNCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb247DQorY2xhc3MgQ0JDX1FSRGF0YUJsb2NrOw0KK2NsYXNzIENCQ19RUkNvZGVyRGVjb2RlcjsNCitjbGFzcyBDQkNfUVJDb2RlckRlY29kZXIgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlciAqbV9yc0RlY29kZXI7DQorcHVibGljOg0KKyAgICBDQkNfUVJDb2RlckRlY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJEZWNvZGVyKCk7DQorDQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBEZWNvZGUoRlhfQk9PTCogaW1hZ2UsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIERlY29kZShDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLCBGWF9JTlQzMiBieXRlTW9kZURlY29kZSwgRlhfSU5UMzIgJmUpOw0KKyAgICB2b2lkIENvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcywgRlhfSU5UMzIgbnVtRGF0YUNvZGV3b3JkcywgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckVDQi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckVDQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDk0YjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRUNCLmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSRUNCX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUkVDQl9IXw0KK2NsYXNzIENCQ19RUkNvZGVyRUNCOw0KK2NsYXNzIENCQ19RUkNvZGVyRUNCICA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3ByaXZhdGU6DQorICAgIEZYX0lOVDMyIG1fY291bnQ7DQorICAgIEZYX0lOVDMyIG1fZGF0YUNvZGVXb3JkczsNCitwdWJsaWM6DQorICAgIENCQ19RUkNvZGVyRUNCKEZYX0lOVDMyIGNvdW50LCBGWF9JTlQzMiBkYXRhQ29kZVdvcmRzKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFQ0IoKTsNCisgICAgRlhfSU5UMzIgR2V0Q291bnQoKTsNCisgICAgRlhfSU5UMzIgR2V0RGF0YUNvZGVXb3JkcygpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckVDQmxvY2tzLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRUNCbG9ja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU4Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSRUNCTE9DS1NfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRUNCTE9DS1NfSF8NCitjbGFzcyBDQkNfUVJDb2RlckVDQjsNCitjbGFzcyBDQkNfUVJDb2RlckVDQmxvY2tzOw0KK2NsYXNzIENCQ19RUkNvZGVyRUNCbG9ja3MgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9lY0NvZGVXb3Jkc1BlckJsb2NrOw0KKyAgICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCitwdWJsaWM6DQorICAgIENCQ19RUkNvZGVyRUNCbG9ja3MoRlhfSU5UMzIgZWNDb2RlV29yZHNQZXJCbG9jaywgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzKTsNCisgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyhGWF9JTlQzMiBlY0NvZGVXb3Jkc1BlckJsb2NrLCBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MxLCBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MyKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFQ0Jsb2NrcygpOw0KKyAgICBGWF9JTlQzMiBHZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCk7DQorICAgIEZYX0lOVDMyIEdldE51bUJsb2NrcygpOw0KKyAgICBGWF9JTlQzMiBHZXRUb3RhbEVDQ29kZVdvcmRzKCk7DQorICAgIENGWF9QdHJBcnJheSogR2V0RUNCbG9ja3MoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWEyYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRW5jb2Rlci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJDT0RFUkVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRU5DT0RFUl9IXw0KK2NsYXNzIE1ha2VfUGFpcjsNCitjbGFzcyBDQkNfUVJDb2RlcjsNCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KK2NsYXNzIENCQ19RUkNvZGVyTW9kZTsNCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsNCitjbGFzcyBDQkNfQ29tbW9uQnl0ZUFycmF5Ow0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19RUkNvZGVyRW5jb2RlcjsNCitjbGFzcyBDQkNfUVJDb2RlckVuY29kZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgbV9hbHBoYU51bWJlcmljVGFibGVbOTZdOw0KK3B1YmxpYzoNCisgICAgQ0JDX1FSQ29kZXJFbmNvZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRW5jb2RlcigpOw0KKw0KKyAgICBzdGF0aWMgdm9pZCBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyICpxckNvZGUsIEZYX0lOVDMyICZlLCBGWF9JTlQzMiB2ZXJzaW9uU3BlY2lmeSA9IDApOw0KKyAgICBzdGF0aWMgdm9pZCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyICpxckNvZGUsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRW5jb2RlV2l0aFNwZWNpZnlWZXJzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgRlhfSU5UMzIgdmVyc2lvblNwZWNpZnksIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRW5jb2RlV2l0aEF1dG9WZXJzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBDQkNfUVJDb2RlciAqcXJDb2RlLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIENob29zZU1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJiBjb250ZW50LCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBHZXRBbHBoYU51bWVyaWNDb2RlKEZYX0lOVDMyIGNvZGUpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmRFQ0koQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmRCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmRBbHBoYU51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgQXBwZW5kOEJpdEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgQXBwZW5kOEJpdEJ5dGVzKENGWF9CeXRlQXJyYXkgJmJ5dGVzLCBDQkNfUVJDb2RlckJpdFZlY3RvciAqYml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmRLYW5qaUJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmRHQktCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgSW5pdFFSQ29kZShGWF9JTlQzMiBudW1JbnB1dEJ5dGVzLCBGWF9JTlQzMiB2ZXJzaW9uTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyTW9kZSogbW9kZSwgQ0JDX1FSQ29kZXIqIHFyQ29kZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0UVJDb2RlKEZYX0lOVDMyIG51bUlucHV0Qnl0ZXMsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyTW9kZSogbW9kZSwgQ0JDX1FSQ29kZXIqIHFyQ29kZSwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmRNb2RlSW5mbyhDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEFwcGVuZExlbmd0aEluZm8oRlhfSU5UMzIgbnVtTGV0dGVycywgRlhfSU5UMzIgdmVyc2lvbiwgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpOw0KKw0KKyAgICBzdGF0aWMgdm9pZCBJbnRlcmxlYXZlV2l0aEVDQnl0ZXMoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyIG51bVRvdGFsQnl0ZXMsIEZYX0lOVDMyIG51bURhdGFCeXRlcywgRlhfSU5UMzIgbnVtUlNCbG9ja3MsIENCQ19RUkNvZGVyQml0VmVjdG9yKiByZXN1bHQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgR2V0TnVtRGF0YUJ5dGVzQW5kTnVtRUNCeXRlc0ZvckJsb2NrSUQoRlhfSU5UMzIgbnVtVG90YWxCeXRlcywgRlhfSU5UMzIgbnVtRGF0YUJ5dGVzLA0KKyAgICAgICAgICAgIEZYX0lOVDMyIG51bVJTQmxvY2tzLCBGWF9JTlQzMiBibG9ja0lELA0KKyAgICAgICAgICAgIEZYX0lOVDMyICZudW1EYXRhQnl0ZXNJbkJsb2NrLCBGWF9JTlQzMiYgbnVtRUNCeXRlc0luQmxvY2tzKTsNCisgICAgc3RhdGljIENCQ19Db21tb25CeXRlQXJyYXkqIEdlbmVyYXRlRUNCeXRlcyhDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMsIEZYX0lOVDMyIG51bUVjQnl0ZXNJbkJsb2NrLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBDaG9vc2VNYXNrUGF0dGVybihDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIENhbGN1bGF0ZU1hc2tQZW5hbHR5KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgICBzdGF0aWMgdm9pZCBUZXJtaW5hdGVCaXRzKEZYX0lOVDMyIG51bURhdGFCeXRlcywgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIEdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlICptb2RlRmlyc3QsIENCQ19RUkNvZGVyTW9kZSAqbW9kZVNlY29uZCwgRlhfSU5UMzIgdmVyc2lvbk51bSwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBNZXJnZVN0cmluZyhDRlhfUHRyQXJyYXkgJnJlc3VsdCwgRlhfSU5UMzIgdmVyc2lvbk51bSwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBTcGxpdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0ZYX1B0ckFycmF5ICZyZXN1bHQpOw0KKyAgICBzdGF0aWMgdm9pZCBBcHBlbmREYXRhTW9kZUxlbmdoSW5mbyhDRlhfUHRyQXJyYXkgJnNwbGl0UmVzdWx0LCBDQkNfUVJDb2RlckJpdFZlY3RvciAmaGVhZGVyQW5kRGF0YUJpdHMsCUNCQ19RUkNvZGVyTW9kZSAqdGVtcE1vZGUsIENCQ19RUkNvZGVyICpxckNvZGUsIENGWF9CeXRlU3RyaW5nICZlbmNvZGluZywgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBhZDdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSRVJST1JDT1JSRUNUSU9OTEVWRUxfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRVJST1JDT1JSRUNUSU9OTEVWRUxfSF8NCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9vcmRpbmFsOw0KKyAgICBGWF9JTlQzMiBtX2JpdHM7DQorICAgIENGWF9CeXRlU3RyaW5nIG1fbmFtZTsNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbChGWF9JTlQzMiBvcmRpbmFsLCBGWF9JTlQzMiBiaXRzLCBGWF9DSEFSKiBuYW1lKTsNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KK3B1YmxpYzoNCisgICAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEw7DQorICAgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBNOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogUTsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEg7DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsNCisgICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgICBGWF9JTlQzMiBPcmRpbmFsKCk7DQorICAgIEZYX0lOVDMyIEdldEJpdHMoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpOw0KKyAgICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorICAgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBGb3JCaXRzKEZYX0lOVDMyIGJpdHMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDgyOGM4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSRk9STUFUSU5GT1JNQVRJT05fSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRk9STUFUSU5GT1JNQVRJT05fSF8NCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KK2NsYXNzIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb247DQorY2xhc3MgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgRk9STUFUX0lORk9fTUFTS19RUjsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIEZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVBbMzJdWzJdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgQklUU19TRVRfSU5fSEFMRl9CWVRFWzE2XTsNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lcnJvckNvcnJlY3RMZXZsOw0KKyAgICBGWF9CWVRFIG1fZGF0YU1hc2s7DQorcHVibGljOg0KKyAgICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKEZYX0lOVDMyIGZvcm1hdEluZm8pOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKCk7DQorICAgIEZYX0JZVEUgR2V0RGF0YU1hc2soKTsNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogR2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsNCisNCisgICAgc3RhdGljIEZYX0lOVDMyIE51bUJpdHNEaWZmZXJpbmcoRlhfSU5UMzIgYSwgRlhfSU5UMzIgYik7DQorICAgIHN0YXRpYyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihGWF9JTlQzMiBtYXNrZWRGb3JtYXRJbmZvKTsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIERvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oRlhfSU5UMzIgbWFza2VkRm9ybWF0SW5mbyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyTWFza1V0aWwuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJNYXNrVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyTWFza1V0aWwuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJNQVNLVVRJTF9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJNQVNLVVRJTF9IXw0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19RUkNvZGVyTWFza1V0aWw7DQorY2xhc3MgQ0JDX1FSQ29kZXJNYXNrVXRpbCAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENCQ19RUkNvZGVyTWFza1V0aWwoKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJNYXNrVXRpbCgpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBHZXREYXRhTWFza0JpdChGWF9JTlQzMiBtYXNrUGF0dGVybiwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSU5UMzIgJmUpOw0KKw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQXBwbHlNYXNrUGVuYWx0eVJ1bGUxKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQXBwbHlNYXNrUGVuYWx0eVJ1bGUyKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQXBwbHlNYXNrUGVuYWx0eVJ1bGUzKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQXBwbHlNYXNrUGVuYWx0eVJ1bGU0KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfQk9PTCBpc0hvcml6b250YWwpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhOWQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSTUFUUklYVVRJTF9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJNQVRSSVhVVElMX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsNCitjbGFzcyBDQkNfUVJDb2Rlck1hdHJpeFV0aWw7DQorY2xhc3MgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsICA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3ByaXZhdGU6DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBQT1NJVElPTl9ERVRFQ1RJT05fUEFUVEVSTls3XVs3XTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIFZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOWzVdWzVdOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgVFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIFZFUlNJT05fSU5GT19QT0xZOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgVFlQRV9JTkZPX1BPTFk7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBUWVBFX0lORk9fTUFTS19QQVRURVJOOw0KK3B1YmxpYzoNCisgICAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsKCk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpOw0KKyAgICBzdGF0aWMgdm9pZCBDbGVhck1hdHJpeChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEJ1aWxkTWF0cml4KENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgdmVyc2lvbiwgRlhfSU5UMzIgbWFza1BhdHRlcm4sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRW1iZWRCYXNpY1BhdHRlcm5zKEZYX0lOVDMyIHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRW1iZWRUeXBlSW5mbyhDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBGWF9JTlQzMiBtYXNrUGF0dGVybiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXggKm1hdHJpeCwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBFbWJlZERhdGFCaXRzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywgRlhfSU5UMzIgbWFza1BhdHRlcm4sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgTWF5YmVFbWJlZFZlcnNpb25JbmZvKEZYX0lOVDMyIHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIEZpbmRNU0JTZXQoRlhfSU5UMzIgdmFsdWUpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgQ2FsY3VsYXRlQkNIQ29kZShGWF9JTlQzMiBjb2RlLCBGWF9JTlQzMiBwb2x5KTsNCisgICAgc3RhdGljIHZvaWQgTWFrZVR5cGVJbmZvQml0cyhDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBGWF9JTlQzMiBtYXNrUGF0dGVybiwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgTWFrZVZlcnNpb25JbmZvQml0cyhGWF9JTlQzMiB2ZXJzaW9uLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBJc0VtcHR5KEZYX0lOVDMyIHZhbHVlKTsNCisgICAgc3RhdGljIEZYX0JPT0wgSXNWYWxpZFZhbHVlKEZYX0lOVDMyIHZhbHVlKTsNCisgICAgc3RhdGljIHZvaWQgRW1iZWRUaW1pbmdQYXR0ZXJucyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKEZYX0lOVDMyIHhTdGFydCwgRlhfSU5UMzIgeVN0YXJ0LCBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihGWF9JTlQzMiB4U3RhcnQsIEZYX0lOVDMyIHlTdGFydCwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm4oRlhfSU5UMzIgeFN0YXJ0LCBGWF9JTlQzMiB5U3RhcnQsIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oRlhfSU5UMzIgeFN0YXJ0LCBGWF9JTlQzMiB5U3RhcnQsIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyB2b2lkIE1heWJlRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJucyhGWF9JTlQzMiB2ZXJzaW9uLCBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkNvZGVyTW9kZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNlYTlmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2Rlck1vZGUuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJNT0RFX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUk1PREVfSF8NCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb247DQorY2xhc3MgQ0JDX1FSQ29kZXJNb2RlOw0KK2NsYXNzIENCQ19RUkNvZGVyTW9kZSAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiogbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uczsNCisgICAgRlhfSU5UMzIgbV9iaXRzOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBtX25hbWU7DQorICAgIENCQ19RUkNvZGVyTW9kZShGWF9JTlQzMiAqY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMsIEZYX0lOVDMyIHgxLCBGWF9JTlQzMiB4MiwgRlhfSU5UMzIgeDMsIEZYX0lOVDMyIGJpdHMsIENGWF9CeXRlU3RyaW5nIG5hbWUpOw0KKyAgICBDQkNfUVJDb2Rlck1vZGUoKTsNCitwdWJsaWM6DQorICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNCWVRFOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzTlVNRVJJQzsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0FMUEhBTlVNRVJJQzsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0tBTkpJOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzRUNJOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzR0JLOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzVEVSTUlOQVRPUjsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0ZOQzFfRklSU1RfUE9TSVRJT047DQorICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNGTkMxX1NFQ09ORF9QT1NJVElPTjsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1vZGUoKTsNCisNCisgICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBGb3JCaXRzKEZYX0lOVDMyIGJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgRlhfSU5UMzIgR2V0Q2hhcmFjdGVyQ291bnRCaXRzKENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBHZXRCaXRzKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoKTsNCisgICAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJDb2RlclZlcnNpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5M2RkNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSQ29kZXJWZXJzaW9uLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSVkVSU0lPTl9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJWRVJTSU9OX0hfDQorY2xhc3MgQ0JDX1FSQ29kZXJFQ0Jsb2NrczsNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KK2NsYXNzIENCQ19RUkNvZGVyVmVyc2lvbiA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3ByaXZhdGU6DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBWRVJTSU9OX0RFQ09ERV9JTkZPWzM0XTsNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSAqVkVSU0lPTjsNCisgICAgRlhfSU5UMzIgbV92ZXJzaW9uTnVtYmVyOw0KKyAgICBGWF9JTlQzMiBtX3RvdGFsQ29kZVdvcmRzOw0KKyAgICBDRlhfSW50MzJBcnJheSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KKyAgICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCisNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKCk7DQorICAgIENCQ19RUkNvZGVyVmVyc2lvbihGWF9JTlQzMiB2ZXJzaW9uTnVtYmVyLCBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczEsIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwNCisgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMywgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KTsNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyVmVyc2lvbigpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorDQorICAgIEZYX0lOVDMyIEdldFZlcnNpb25OdW1iZXIoKTsNCisgICAgRlhfSU5UMzIgR2V0VG90YWxDb2RlV29yZHMoKTsNCisgICAgRlhfSU5UMzIgR2V0RGltZW5zaW9uRm9yVmVyc2lvbigpOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpCdWlsZEZ1bmN0aW9uUGF0dGVybihGWF9JTlQzMiAmZSk7DQorICAgIENGWF9JbnQzMkFycmF5KiBHZXRBbGlnbm1lbnRQYXR0ZXJuQ2VudGVycygpOw0KKyAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBHZXRFQ0Jsb2Nrc0ZvckxldmVsKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwgKmVjTGV2ZWwpOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJWZXJzaW9uKiBHZXRWZXJzaW9uRm9yTnVtYmVyKEZYX0lOVDMyIHZlcnNpb25OdW1iZXIsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uKEZYX0lOVDMyIGRpbWVuc2lvbiwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgQ0JDX1FSQ29kZXJWZXJzaW9uKiBEZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24oRlhfSU5UMzIgdmVyc2lvbkJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJEYXRhQmxvY2suaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGF0YUJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2OGM3YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGF0YUJsb2NrLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkRBVEFCTE9DS19IXw0KKyNkZWZpbmUgX0JDX1FSREFUQUJMT0NLX0hfDQorY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KK2NsYXNzIENCQ19RUkNvZGVyRUNCbG9ja3M7DQorY2xhc3MgQ0JDX1FSQ29kZXJFQ0I7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfUVJEYXRhQmxvY2s7DQorY2xhc3MgQ0JDX1FSRGF0YUJsb2NrIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgRlhfSU5UMzIgbV9udW1EYXRhQ29kZXdvcmRzOw0KKyAgICBDRlhfQnl0ZUFycmF5ICptX2NvZGV3b3JkczsNCisgICAgQ0JDX1FSRGF0YUJsb2NrKEZYX0lOVDMyIG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkgKmNvZGV3b3Jkcyk7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIH5DQkNfUVJEYXRhQmxvY2soKTsNCisgICAgRlhfSU5UMzIgR2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgICBDRlhfQnl0ZUFycmF5KiBHZXRDb2Rld29yZHMoKTsNCisgICAgc3RhdGljIENGWF9QdHJBcnJheSAqR2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uICp2ZXJzaW9uLCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRhdGFNYXNrLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRhdGFNYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYzA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGF0YU1hc2suaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSREFUQU1BU0tfSF8NCisjZGVmaW5lIF9CQ19RUkRBVEFNQVNLX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfUVJEYXRhTWFzazsNCitjbGFzcyBDQkNfUVJEYXRhTWFzayAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBDRlhfUHRyQXJyYXkgKkRBVEFfTUFTS1M7DQorICAgIENCQ19RUkRhdGFNYXNrKCk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkRhdGFNYXNrKCk7DQorICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MIElzTWFza2VkKEZYX0lOVDMyIGksIEZYX0lOVDMyIGopID0gMDsNCisgICAgdm9pZCBVbm1hc2tCaXRNYXRpcngoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0cywgRlhfSU5UMzIgZGltZW5zaW9uKTsNCisgICAgc3RhdGljIENCQ19RUkRhdGFNYXNrKiBGb3JSZWZlcmVuY2UoRlhfSU5UMzIgcmVmZXJlbmNlLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBCdWlsZERhdGFNYXNrcygpOw0KKyAgICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDQ4NWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSREVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KKyNkZWZpbmUgX0JDX1FSREVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdFNvdXJjZTsNCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb247DQorY2xhc3MgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTsNCitjbGFzcyBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOw0KK2NsYXNzIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIgIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHJpdmF0ZToNCisgICAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQUxQSEFOVU1FUklDX0NIQVJTWzQ1XTsNCisgICAgc3RhdGljIEZYX0xQQ1NUUiBVVEZfODsNCisgICAgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB+Q0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KKyAgICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIERlY29kZShDRlhfQnl0ZUFycmF5ICpieXRlcywgQ0JDX1FSQ29kZXJWZXJzaW9uICp2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBGWF9JTlQzMiBieXRlTW9kZURlY29kZSwgRlhfSU5UMzIgJmUpOw0KKw0KKyAgICBzdGF0aWMgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgR3Vlc3NFbmNvZGluZyhDRlhfQnl0ZUFycmF5KiBieXRlcyk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBQYXJzZUVDSVZhbHVlKENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlR0JLU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiBjb3VudCwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgdm9pZCBEZWNvZGVLYW5qaVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgY291bnQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlTnVtZXJpY1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgY291bnQsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQWxwaGFudW1lcmljU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBGWF9JTlQzMiBjb3VudCwgRlhfQk9PTCBmYWMxSW5FZmZlY3QsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQnl0ZVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgRlhfSU5UMzIgY291bnQsIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kgKmN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5ICpieXRlU2VnbWVudHMsIEZYX0lOVDMyIGJ5dGVNb2RlRGVjb2RlLCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRldGVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkRldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMzAxYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGV0ZWN0b3IuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSREVURUNUT1JfSF8NCisjZGVmaW5lIF9CQ19RUkRFVEVDVE9SX0hfDQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ7DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkluZm87DQorY2xhc3MgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjsNCitjbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOw0KK2NsYXNzIENCQ19RUkNvZGVyVmVyc2lvbjsNCitjbGFzcyBDQkNfUVJHcmlkU2FtcGxlcjsNCitjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm47DQorY2xhc3MgQ0JDX1FSRGV0ZWN0b3I7DQorY2xhc3MgQ0JDX1FSRGV0ZWN0b3INCit7DQorcHJpdmF0ZToNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9pbWFnZTsNCitwdWJsaWM6DQorICAgIENCQ19RUkRldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSRGV0ZWN0b3IoKTsNCisNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogR2V0SW1hZ2UoKTsNCisgICAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIERldGVjdChGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCogUHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvKENCQ19RUkZpbmRlclBhdHRlcm5JbmZvICppbmZvLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0ZMT0FUIENhbGN1bGF0ZU1vZHVsZVNpemUoQ0JDX1Jlc3VsdFBvaW50ICp0b3BMZWZ0LCBDQkNfUmVzdWx0UG9pbnQgKnRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQpOw0KKyAgICBGWF9GTE9BVCBDYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KENCQ19SZXN1bHRQb2ludCAqcGF0dGVybiwgQ0JDX1Jlc3VsdFBvaW50ICpvdGhlclBhdHRlcm4pOw0KKyAgICBGWF9GTE9BVCBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cyhGWF9JTlQzMiBmcm9tWCwgRlhfSU5UMzIgZnJvbVksIEZYX0lOVDMyIHRvWCwgRlhfSU5UMzIgdG9ZKTsNCisgICAgRlhfRkxPQVQgU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuKEZYX0lOVDMyIGZyb21YLCBGWF9JTlQzMiBmcm9tWSwgRlhfSU5UMzIgdG9YLCBGWF9JTlQzMiB0b1kpOw0KKyAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBGaW5kQWxpZ25tZW50SW5SZWdpb24oRlhfRkxPQVQgb3ZlcmFsbEVzdE1vZHVsZVNpemUsIEZYX0lOVDMyIGVzdEFsaWdubWVudFgsIEZYX0lOVDMyIGVzdEFsaWdubWVudFksIEZYX0ZMT0FUIGFsbG93YW5jZUZhY3RvciwgRlhfSU5UMzIgJmUpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgUm91bmQoRlhfRkxPQVQgZCk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBDb21wdXRlRGltZW5zaW9uKENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0LCBGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDQkNfQ29tbW9uQml0TWF0cml4KiBTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBhbGlnbm1lbnRQYXR0ZXJuLCBGWF9JTlQzMiBkaW1lbnNpb24sIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y2ZDNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJERVRFQ1RPUlJFU1VMVF9IXw0KKyNkZWZpbmUgX0JDX1FSREVURUNUT1JSRVNVTFRfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfUVJEZXRlY3RvclJlc3VsdDsNCitjbGFzcyBDQkNfUVJEZXRlY3RvclJlc3VsdCAgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwcml2YXRlOg0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4ICptX2JpdHM7DQorICAgIENGWF9QdHJBcnJheSAqbV9wb2ludHM7DQorcHVibGljOg0KKyAgICBDQkNfUVJEZXRlY3RvclJlc3VsdChDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRzLCBDRlhfUHRyQXJyYXkgKnBvaW50cyk7DQorICAgIHZpcnR1YWwgfkNCQ19RUkRldGVjdG9yUmVzdWx0KCk7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKkdldEJpdHMoKTsNCisgICAgQ0ZYX1B0ckFycmF5ICpHZXRQb2ludHMoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRmluZGVyUGF0dGVybi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4OGE3MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRmluZGVyUGF0dGVybi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJGSU5ERVJQQVRURVJOX0hfDQorI2RlZmluZSBfQkNfUVJGSU5ERVJQQVRURVJOX0hfDQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19RUkZpbmRlclBhdHRlcm47DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybiA6IHB1YmxpYyBDQkNfUmVzdWx0UG9pbnQNCit7DQorcHJpdmF0ZToNCisgICAgRlhfRkxPQVQgbV9lc3RpbWF0ZWRNb2R1bGVTaXplOw0KKyAgICBGWF9JTlQzMiBtX2NvdW50Ow0KK3B1YmxpYzoNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybihGWF9GTE9BVCB4LCBGWF9GTE9BVCBwb3NZLCBGWF9GTE9BVCBlc3RpbWF0ZWRNb2R1bGVTaXplKTsNCisgICAgdmlydHVhbCB+Q0JDX1FSRmluZGVyUGF0dGVybigpOw0KKw0KKyAgICBGWF9JTlQzMiBHZXRDb3VudCgpOw0KKyAgICBGWF9GTE9BVCBHZXRYKCk7DQorICAgIEZYX0ZMT0FUIEdldFkoKTsNCisgICAgRlhfRkxPQVQgR2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpOw0KKyAgICB2b2lkIEluY3JlbWVudENvdW50KCk7DQorICAgIEZYX0JPT0wgQWJvdXRFcXVhbHMoRlhfRkxPQVQgbW9kdWxlU2l6ZSwgRlhfRkxPQVQgaSwgRlhfRkxPQVQgaik7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKkNsb25lKCk7DQorfTsNCit0eXBlZGVmIENCQ19RUkZpbmRlclBhdHRlcm4gRmluZGVyUGF0dGVybjsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzBiNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSRklOREVSUEFUVEVSTkZJTkRFUl9IXw0KKyNkZWZpbmUgX0JDX1FSRklOREVSUEFUVEVSTkZJTkRFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybjsNCitjbGFzcyBDQkNfUmVzdWx0UG9pbnQ7DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkluZm87DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjsNCitjbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyICA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3ByaXZhdGU6DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBDRU5URVJfUVVPUlVNOw0KKyAgICBjb25zdCBzdGF0aWMgRlhfSU5UMzIgTUlOX1NLSVA7DQorICAgIGNvbnN0IHN0YXRpYyBGWF9JTlQzMiBNQVhfTU9EVUxFUzsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIElOVEVHRVJfTUFUSF9TSElGVDsNCisgICAgRlhfQk9PTCBtX2hhc1NraXBwZWQ7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICAgIENGWF9JbnQzMkFycmF5IG1fY3Jvc3NDaGVja1N0YXRlQ291bnQ7DQorICAgIENGWF9QdHJBcnJheSBtX3Bvc3NpYmxlQ2VudGVyczsNCitwdWJsaWM6DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyKCk7DQorICAgIEZYX0lOVDMyIEZpbmRSb3dTa2lwKCk7DQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIEdldEltYWdlKCk7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBGaW5kKEZYX0lOVDMyIGhpbnQsIEZYX0lOVDMyICZlKTsNCisNCisgICAgQ0ZYX0ludDMyQXJyYXkgJkdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7DQorICAgIENGWF9QdHJBcnJheSAqR2V0UG9zc2libGVDZW50ZXJzKCk7DQorICAgIENGWF9QdHJBcnJheSAqU2VsZWN0QmVzdHBhdHRlcm5zKEZYX0lOVDMyICZlKTsNCisNCisgICAgRlhfQk9PTCBIYW5kbGVQb3NzaWJsZUNlbnRlcihjb25zdCBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCwgRlhfSU5UMzIgaSwgRlhfSU5UMzIgaik7DQorICAgIEZYX0JPT0wgSGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KKyAgICBGWF9GTE9BVCBDZW50ZXJGcm9tRW5kKGNvbnN0IENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50LCBGWF9JTlQzMiBlbmQpOw0KKyAgICBGWF9GTE9BVCBDcm9zc0NoZWNrVmVydGljYWwoRlhfSU5UMzIgc3RhcnRJLCBGWF9JTlQzMiBjZW50ZXJKLCBGWF9JTlQzMiBtYXhDb3VudCwgRlhfSU5UMzIgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpOw0KKyAgICBGWF9GTE9BVCBDcm9zc0NoZWNrSG9yaXpvbnRhbChGWF9JTlQzMiBzdGFydEosIEZYX0lOVDMyIENlbnRlckksIEZYX0lOVDMyIG1heENPdW50LCBGWF9JTlQzMiBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCk7DQorICAgIHN0YXRpYyB2b2lkIE9yZGVyQmVzdFBhdHRlcm5zKENGWF9QdHJBcnJheSAqcGF0dGVybnMpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBGb3VuZFBhdHRlcm5Dcm9zcyhjb25zdCBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCk7DQorICAgIHN0YXRpYyBGWF9GTE9BVCBEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQqIHBvaW50MSwgQ0JDX1Jlc3VsdFBvaW50KiBwb2ludDIpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJHcmlkU2FtcGxlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUVJHcmlkU2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGM3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19RUkdyaWRTYW1wbGVyLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkdSSURTQU1QTEVSX0hfDQorI2RlZmluZSBfQkNfUVJHUklEU0FNUExFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOw0KK2NsYXNzIENCQ19Db21tb25EZWZhdWx0R3JpZFNhbXBsZXI7DQorY2xhc3MgQ0JDX1FSR3JpZFNhbXBsZXI7DQorY2xhc3MgQ0JDX1FSR3JpZFNhbXBsZXINCit7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIENCQ19RUkdyaWRTYW1wbGVyIG1fZ3JpZFNhbXBsZXI7DQorcHVibGljOg0KKyAgICBDQkNfUVJHcmlkU2FtcGxlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUVJHcmlkU2FtcGxlcigpOw0KKyAgICB2aXJ0dWFsIENCQ19Db21tb25CaXRNYXRyaXgqIFNhbXBsZUdyaWQoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsIEZYX0lOVDMyIGRpbWVuc2lvblgsIEZYX0lOVDMyIGRpbWVuc2lvblksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMVRvWCwgRlhfRkxPQVQgcDFUb1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMlRvWCwgRlhfRkxPQVQgcDJUb1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwM1RvWCwgRlhfRkxPQVQgcDNUb1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwNFRvWCwgRlhfRkxPQVQgcDRUb1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMUZyb21YLCBGWF9GTE9BVCBwMUZyb21ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDJGcm9tWCwgRlhfRkxPQVQgcDJGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzRnJvbVgsIEZYX0ZMT0FUIHAzRnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwNEZyb21YLCBGWF9GTE9BVCBwNEZyb21ZLCBGWF9JTlQzMiAmZSk7DQorDQorICAgIHN0YXRpYyBDQkNfUVJHcmlkU2FtcGxlciAmR2V0SW5zdGFuY2UoKTsNCisgICAgc3RhdGljIHZvaWQgQ2hlY2tBbmROdWRnZVBvaW50cyhDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSwgQ0ZYX0Zsb2F0QXJyYXkgKnBvaW50cywgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmIyYWExCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVhZGVyLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19SRUFERVJfSF8NCisjZGVmaW5lIF9CQ19SRUFERVJfSF8NCitjbGFzcyBDQkNfQmluYXJ5Qml0bWFwOw0KK2NsYXNzIENCQ19SZWFkZXI7DQorY2xhc3MgQ0JDX1JlYWRlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1JlYWRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfUmVhZGVyKCk7DQorICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBGWF9JTlQzMiAmZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19SZWVkU29sb21vbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUwYjhmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb24uaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1JFQURTT0xPTU9OX0hfDQorI2RlZmluZSBfQkNfUkVBRFNPTE9NT05fSF8NCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NjsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk7DQorY2xhc3MgIENCQ19SZWVkU29sb21vbkVuY29kZXI7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3ByaXZhdGU6DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2KiBtX2ZpZWxkOw0KKyAgICBDRlhfUHRyQXJyYXkgbV9jYWNoZWRHZW5lcmF0b3JzOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEJ1aWxkR2VuZXJhdG9yKEZYX0lOVDMyIGRlZ3JlZSwgRlhfSU5UMzIgJmUpOw0KK3B1YmxpYzoNCisgICAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiAqIGZpZWxkKTsNCisgICAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpOw0KKw0KKyAgICB2b2lkIEVuY29kZShDRlhfSW50MzJBcnJheSAqdG9FbmNvZGUsIEZYX0lOVDMyIGVjQnl0ZXMsIEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb25EZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkZDBmMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUkVFRFNPTE9NT05ERUNPREVSX0hfDQorI2RlZmluZSBfQkNfUkVFRFNPTE9NT05ERUNPREVSX0hfDQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Ow0KK2NsYXNzIENCQ19SZWVkU29sb21vbkRlY29kZXI7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3ByaXZhdGU6DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2ICogbV9maWVsZDsNCitwdWJsaWM6DQorICAgIENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTYgKiBmaWVsZCk7DQorICAgIHZpcnR1YWwgfkNCQ19SZWVkU29sb21vbkRlY29kZXIoKTsNCisgICAgdm9pZCBEZWNvZGUoQ0ZYX0ludDMyQXJyYXkqIHJlY2VpdmVkLCBGWF9JTlQzMiB0d29TLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9QdHJBcnJheSogUnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYSwgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBiLCBGWF9JTlQzMiBSLCBGWF9JTlQzMiAmZSk7DQorICAgIENGWF9JbnQzMkFycmF5KiBGaW5kRXJyb3JMb2NhdGlvbnMoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBlcnJvckxvY2F0b3IsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRFcnJvck1hZ25pdHVkZXMoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBlcnJvckV2YWx1YXRvciwgQ0ZYX0ludDMyQXJyYXkqIGVycm9yTG9jYXRpb25zLCBGWF9CT09MIGRhdGFNYXRyaXgsIEZYX0lOVDMyICZlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1JlZWRTb2xvbW9uR0YyNTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjg3Yjk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1Ni5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUkVFRFNPTE9NT05HRjI1Nl9IXw0KKyNkZWZpbmUgX0JDX1JFRURTT0xPTU9OR0YyNTZfSF8NCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgICAgc3RhdGljIENCQ19SZWVkU29sb21vbkdGMjU2ICpRUkNvZGVGaWxkOw0KKyAgICBzdGF0aWMgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgKkRhdGFNYXRyaXhGaWVsZDsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoRlhfSU5UMzIgcHJpbWl0aXZlKTsNCisgICAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uR0YyNTYoKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBHZXRaZXJvKCk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogR2V0T25lKCk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQnVpbGRNb25vbWlhbChGWF9JTlQzMiBkZWdyZWUsIEZYX0lOVDMyIGNvZWZmaWNpZW50LCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBGWF9JTlQzMiBBZGRPclN1YnRyYWN0KEZYX0lOVDMyIGEsIEZYX0lOVDMyIGIpOw0KKyAgICBGWF9JTlQzMiBFeHAoRlhfSU5UMzIgYSk7DQorICAgIEZYX0lOVDMyIExvZyhGWF9JTlQzMiBhLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIEludmVyc2UoRlhfSU5UMzIgYSwgRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBNdWx0aXBseShGWF9JTlQzMiBhLCBGWF9JTlQzMiBiKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiBtX2V4cFRhYmxlWzI1Nl07DQorICAgIEZYX0lOVDMyIG1fbG9nVGFibGVbMjU2XTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICptX3plcm87DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqbV9vbmU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRiMjRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1JFQURTT0xPTU9OR0YyNTZQT0xZX0hfDQorI2RlZmluZSBfQkNfUkVBRFNPTE9NT05HRjI1NlBPTFlfSF8NCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NjsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLCBGWF9JTlQzMiBjb2VmZmljaWVudHMpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgICAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICAgIEZYX0lOVDMyIEdldENvZWZmaWNpZW50cyhGWF9JTlQzMiBkZWdyZWUpOw0KKyAgICBDRlhfSW50MzJBcnJheSogR2V0Q29lZmZpY2llbnRzKCk7DQorICAgIEZYX0lOVDMyCQlHZXREZWdyZWUoKTsNCisgICAgRlhfQk9PTAkJCUlzWmVybygpOw0KKyAgICBGWF9JTlQzMgkJRXZhbHVhdGVBdChGWF9JTlQzMiBhKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBBZGRPclN1YnRyYWN0KENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsIEZYX0lOVDMyICZlKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBNdWx0aXBseShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLCBGWF9JTlQzMiAmZSk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHkoRlhfSU5UMzIgc2NhbGFyLCBGWF9JTlQzMiAmZSk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHlCeU1vbm9taWFsKEZYX0lOVDMyIGRlZ3JlZSwgRlhfSU5UMzIgY29lZmZpY2llbnQsIEZYX0lOVDMyICZlKTsNCisgICAgQ0ZYX1B0ckFycmF5KiBEaXZpZGUoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICpvdGhlciwgRlhfSU5UMzIgJmUpOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENsb25lKEZYX0lOVDMyICZlKTsNCisgICAgdmlydHVhbCB2b2lkIEluaXQoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLCBDRlhfSW50MzJBcnJheSogY29lZmZpY2llbnRzLCBGWF9JTlQzMiAmZSk7DQorcHJpdmF0ZToNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIG1fZmllbGQ7DQorICAgIENGWF9JbnQzMkFycmF5IG1fY29lZmZpY2llbnRzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfUmVzdWx0UG9pbnQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMWNmYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1Jlc3VsdFBvaW50LmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19SRVNVTFRQT0lOVF9IXw0KKyNkZWZpbmUgX0JDX1JFU1VMVFBPSU5UX0hfDQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19SZXN1bHRQb2ludCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1Jlc3VsdFBvaW50KCk7DQorICAgIENCQ19SZXN1bHRQb2ludChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgICAgdmlydHVhbCB+Q0JDX1Jlc3VsdFBvaW50KCkNCisgICAgew0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRkxPQVQgR2V0WCgpOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFkoKTsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0ZMT0FUIG1feDsNCisgICAgRlhfRkxPQVQgbV95Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfU3ltYm9sSW5mby5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfU3ltYm9sSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTBhMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19TeW1ib2xJbmZvLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19TWU1CT0xJTkZPX0hfDQorI2RlZmluZSBfQkNfU1lNQk9MSU5GT19IXw0KK2NsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQ7DQorY2xhc3MgQ0JDX0RpbWVuc2lvbjsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbyA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwgRlhfSU5UMzIgZGF0YUNhcGFjaXR5LCBGWF9JTlQzMiBlcnJvckNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgbWF0cml4V2lkdGgsIEZYX0lOVDMyIG1hdHJpeEhlaWdodCwgRlhfSU5UMzIgZGF0YVJlZ2lvbnMpOw0KKyAgICB2aXJ0dWFsIH5DQkNfU3ltYm9sSW5mbygpOw0KKyAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICAgIHN0YXRpYyB2b2lkIG92ZXJyaWRlU3ltYm9sU2V0KENCQ19TeW1ib2xJbmZvKiBvdmVycmlkZSk7DQorICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKEZYX0lOVDMyIGRhdGFDb2Rld29yZHMsIEZYX0lOVDMyICZlKTsNCisgICAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoRlhfSU5UMzIgZGF0YUNvZGV3b3JkcywgU3ltYm9sU2hhcGVIaW50IHNoYXBlLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKEZYX0lOVDMyIGRhdGFDb2Rld29yZHMsIEZYX0JPT0wgYWxsb3dSZWN0YW5ndWxhciwgRlhfQk9PTCBmYWlsLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKEZYX0lOVDMyIGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgRlhfQk9PTCBmYWlsLCBGWF9JTlQzMiAmZSk7DQorICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKEZYX0lOVDMyIGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSwgRlhfQk9PTCBmYWlsLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBnZXRTeW1ib2xEYXRhV2lkdGgoRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBnZXRTeW1ib2xEYXRhSGVpZ2h0KEZYX0lOVDMyICZlKTsNCisgICAgRlhfSU5UMzIgZ2V0U3ltYm9sV2lkdGgoRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBnZXRTeW1ib2xIZWlnaHQoRlhfSU5UMzIgJmUpOw0KKyAgICBGWF9JTlQzMiBnZXRDb2Rld29yZENvdW50KCk7DQorICAgIEZYX0lOVDMyIGdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOw0KKyAgICBGWF9JTlQzMiBnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhGWF9JTlQzMiBpbmRleCk7DQorICAgIEZYX0lOVDMyIGdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhGWF9JTlQzMiBpbmRleCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHRvU3RyaW5nKEZYX0lOVDMyICZlKTsNCitwdWJsaWM6DQorICAgIEZYX0lOVDMyIG1fZGF0YUNhcGFjaXR5Ow0KKyAgICBGWF9JTlQzMiBtX2Vycm9yQ29kZXdvcmRzOw0KKyAgICBGWF9JTlQzMiBtX21hdHJpeFdpZHRoOw0KKyAgICBGWF9JTlQzMiBtX21hdHJpeEhlaWdodDsNCisgICAgRlhfSU5UMzIgbV9yc0Jsb2NrRGF0YTsNCisgICAgRlhfSU5UMzIgbV9yc0Jsb2NrRXJyb3I7DQorICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbV9QUk9EX1NZTUJPTFNbMzBdOw0KK3ByaXZhdGU6DQorICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbV9zeW1ib2xzWzMwXTsNCisgICAgRlhfQk9PTCBtX3JlY3Rhbmd1bGFyOw0KKyAgICBGWF9JTlQzMiBtX2RhdGFSZWdpb25zOw0KK3ByaXZhdGU6DQorICAgIENCQ19TeW1ib2xJbmZvKEZYX0JPT0wgcmVjdGFuZ3VsYXIsIEZYX0lOVDMyIGRhdGFDYXBhY2l0eSwgRlhfSU5UMzIgZXJyb3JDb2Rld29yZHMsIEZYX0lOVDMyIG1hdHJpeFdpZHRoLCBGWF9JTlQzMiBtYXRyaXhIZWlnaHQsIEZYX0lOVDMyIGRhdGFSZWdpb25zLA0KKyAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiByc0Jsb2NrRGF0YSwgRlhfSU5UMzIgcnNCbG9ja0Vycm9yKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1N5bWJvbFNoYXBlSGludC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfU3ltYm9sU2hhcGVIaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwMzAwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1N5bWJvbFNoYXBlSGludC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfU1lNQk9MU0hBUEVISU5UX0hfDQorI2RlZmluZSBfQkNfU1lNQk9MU0hBUEVISU5UX0hfDQorY2xhc3MgQ0JDX1N5bWJvbFNoYXBlSGludDsNCitjbGFzcyBDQkNfU3ltYm9sU2hhcGVIaW50IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQkNfU3ltYm9sU2hhcGVIaW50KCk7DQorICAgIHZpcnR1YWwgfkNCQ19TeW1ib2xTaGFwZUhpbnQoKTsNCisgICAgZW51bSBTeW1ib2xTaGFwZUhpbnQgew0KKyAgICAgICAgRk9SQ0VfTk9ORSwNCisgICAgICAgIEZPUkNFX1NRVUFSRSwNCisgICAgICAgIEZPUkNFX1JFQ1RBTkdMRSwNCisgICAgfTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1RleHRFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19UZXh0RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTY4NjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19UZXh0RW5jb2Rlci5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfVEVYVEVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19URVhURU5DT0RFUl9IXw0KK2NsYXNzIENCQ19UZXh0RW5jb2RlcjsNCitjbGFzcyBDQkNfVGV4dEVuY29kZXIgOiBwdWJsaWMgQ0JDX0M0MEVuY29kZXINCit7DQorcHVibGljOg0KKyAgICBDQkNfVGV4dEVuY29kZXIoKTsNCisgICAgdmlydHVhbCB+Q0JDX1RleHRFbmNvZGVyKCk7DQorICAgIEZYX0lOVDMyIGdldEVuY29kaW5nTW9kZSgpOw0KKyAgICBGWF9JTlQzMiBlbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nICZzYiwgRlhfSU5UMzIgJmUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfVHdvRGltV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Ud29EaW1Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlkNDk0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfVHdvRGltV3JpdGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19UV09ESU1XUklURVJfSF8NCisjZGVmaW5lIF9CQ19UV09ESU1XUklURVJfSF8NCisjaW5jbHVkZSAiQkNfV3JpdGVyLmgiDQorY2xhc3MgQ0JDX1dyaXRlcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19Ud29EaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX1R3b0RpbVdyaXRlciA6IHB1YmxpYyBDQkNfV3JpdGVyDQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1R3b0RpbVdyaXRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfVHdvRGltV3JpdGVyKCk7DQorICAgIHZpcnR1YWwgRlhfQllURSoJRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjb250ZW50cywgRlhfSU5UMzIgZWNMZXZlbCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiAgJmUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9Ow0KKyAgICB2aXJ0dWFsIEZYX0JZVEUqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiBoaW50cywgRlhfSU5UMzIgJmUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9Ow0KKyAgICB2aXJ0dWFsIEZYX0JZVEUqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiAmZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH07DQorICAgIHZpcnR1YWwgdm9pZAkJUmVuZGVyUmVzdWx0KEZYX0JZVEUgKmNvZGUsIEZYX0lOVDMyIGNvZGVXaWR0aCwgRlhfSU5UMzIgY29kZUhlaWdodCwgRlhfSU5UMzIgJmUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIFJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBGWF9JTlQzMiYgZSk7DQorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgUmVuZGVyRGV2aWNlUmVzdWx0KENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoRlhfSU5UMzIgbGV2ZWwpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMiAgICBHZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2lDb3JyZWN0TGV2ZWw7DQorICAgIH07DQorDQorcHJvdGVjdGVkOg0KKyAgICBGWF9JTlQzMgkJbV9pQ29ycmVjdExldmVsOw0KKyAgICBGWF9CT09MCQkJbV9iRml4ZWRTaXplOw0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiAgICAgbV9vdXRwdXQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUzYThjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1VUSUxDT0RJTkdDT05WRVJUX0hfDQorI2RlZmluZSBfQkNfVVRJTENPRElOR0NPTlZFUlRfSF8NCitjbGFzcyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0Ow0KK2NsYXNzIENCQ19VdGlsQ29kaW5nQ29udmVydCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0KCk7DQorICAgIHZpcnR1YWwgfkNCQ19VdGlsQ29kaW5nQ29udmVydCgpOw0KKyAgICBzdGF0aWMgdm9pZCBVbmljb2RlVG9Mb2NhbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnNvdXJjZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQorICAgIHN0YXRpYyB2b2lkIExvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyAmc291cmNlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCisgICAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IENGWF9CeXRlU3RyaW5nICZzb3VyY2UsIENGWF9CeXRlQXJyYXkgJnJlc3VsdCk7DQorICAgIHN0YXRpYyB2b2lkIFV0ZjhUb0xvY2FsZShjb25zdCBDRlhfQnl0ZUFycmF5ICZzb3VyY2UsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQpOw0KKyAgICBzdGF0aWMgdm9pZCBVdGY4VG9Mb2NhbGUoY29uc3QgRlhfQllURSAqc291cmNlLCBGWF9JTlQzMiBjb3VudCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQorICAgIHN0YXRpYyB2b2lkIFVuaWNvZGVUb1VURjgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnNvdXJjZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19VdGlsUlNTLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19VdGlsUlNTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4MzRlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1V0aWxSU1MuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1VUSUxSRVNTX0hfDQorI2RlZmluZSBfQkNfVVRJTFJFU1NfSF8NCitjbGFzcyBDQkNfUnNzUGFpcjsNCitjbGFzcyBDQkNfVXRpbFJTUyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCB+Q0JDX1V0aWxSU1MoKTsNCisgICAgc3RhdGljIEZYX0lOVDMyIEdldFJTU3ZhbHVlKENGWF9JbnQzMkFycmF5ICZ3aWR0aHMsIEZYX0lOVDMyIG1heFdpZHRoLCBGWF9CT09MIG5vTmFycm93KTsNCisNCitwcm90ZWN0ZWQ6DQorICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSAqR2V0UnNzV2lkdGhzKEZYX0lOVDMyIHZhbCwgRlhfSU5UMzIgbiwgRlhfSU5UMzIgZWxlbWVudHMsIEZYX0lOVDMyIG1heFdpZHRoLCBGWF9CT09MIG5vTmFycm93KTsNCisgICAgc3RhdGljIEZYX0lOVDMyIENvbWJpbnMoRlhfSU5UMzIgbiwgRlhfSU5UMzIgcik7DQorICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSAqRWxlbWVudHMoQ0ZYX0ludDMyQXJyYXkgJmVEaXN0LCBGWF9JTlQzMiBOLCBGWF9JTlQzMiBLKTsNCitwcml2YXRlOg0KKyAgICBDQkNfVXRpbFJTUygpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvci5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDkxY2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19XSElURVJFQ1RBTkxFREVURUNUT1JfSF8NCisjZGVmaW5lIF9CQ19XSElURVJFQ1RBTkxFREVURUNUT1JfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcjsNCitjbGFzcyBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UpOw0KKyAgICBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcihDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSwgRlhfSU5UMzIgaW5pdFNpemUsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpOw0KKyAgICB2aXJ0dWFsIH5DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigpOw0KKyAgICBDRlhfUHRyQXJyYXkgKkRldGVjdChGWF9JTlQzMiAmZSk7DQorICAgIHZpcnR1YWwgdm9pZCBJbml0KEZYX0lOVDMyICZlKTsNCitwcml2YXRlOg0KKyAgICBGWF9JTlQzMiBSb3VuZChmbG9hdCBkKTsNCisgICAgQ0JDX1Jlc3VsdFBvaW50ICpHZXRCbGFja1BvaW50T25TZWdtZW50KEZYX0ZMT0FUIGFYLCBGWF9GTE9BVCBhWSwgRlhfRkxPQVQgYlgsIEZYX0ZMT0FUIGJZKTsNCisgICAgRlhfSU5UMzIgRGlzdGFuY2VMMihGWF9GTE9BVCBhWCwgRlhfRkxPQVQgYVksIEZYX0ZMT0FUIGJYLCBGWF9GTE9BVCBiWSk7DQorICAgIENGWF9QdHJBcnJheSAqQ2VudGVyRWRnZXMoQ0JDX1Jlc3VsdFBvaW50ICp5LCBDQkNfUmVzdWx0UG9pbnQgKnosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICp4LCBDQkNfUmVzdWx0UG9pbnQgKnQpOw0KKyAgICBGWF9CT09MIENvbnRhaW5zQmxhY2tQb2ludChGWF9JTlQzMiBhLCBGWF9JTlQzMiBiLCBGWF9JTlQzMiBmaXhlZCwgRlhfQk9PTCBob3Jpem9udGFsKTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIElOSVRfU0laRTsNCisgICAgY29uc3Qgc3RhdGljIEZYX0lOVDMyIENPUlI7DQorDQorICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1faW1hZ2U7DQorICAgIEZYX0lOVDMyIG1faGVpZ2h0Ow0KKyAgICBGWF9JTlQzMiBtX3dpZHRoOw0KKyAgICBGWF9JTlQzMiBtX2xlZnRJbml0Ow0KKyAgICBGWF9JTlQzMiBtX3JpZ2h0SW5pdDsNCisgICAgRlhfSU5UMzIgbV9kb3duSW5pdDsNCisgICAgRlhfSU5UMzIgbV91cEluaXQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Xcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjY4YzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS9CQ19Xcml0ZXIuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1dSSVRFUl9IXw0KKyNkZWZpbmUgX0JDX1dSSVRFUl9IXw0KK2NsYXNzIENCQ19Xcml0ZXI7DQorY2xhc3MgQ0JDX1dyaXRlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0JDX1dyaXRlcigpOw0KKyAgICB2aXJ0dWFsIH5DQkNfV3JpdGVyKCk7DQorICAgIHZpcnR1YWwgRlhfQllURQkJKkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgRlhfSU5UMzIgJm91dFdpZHRoLCBGWF9JTlQzMiAmb3V0SGVpZ2h0LCBGWF9JTlQzMiAmZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JZVEUJCSpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIEZYX0lOVDMyICZvdXRXaWR0aCwgRlhfSU5UMzIgJm91dEhlaWdodCwgRlhfSU5UMzIgaGludHMsIEZYX0lOVDMyICZlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Q2hhckVuY29kaW5nKEZYX0lOVDMyIGVuY29kaW5nKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRNb2R1bGVIZWlnaHQoRlhfSU5UMzIgbW9kdWxlSGVpZ2h0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRNb2R1bGVXaWR0aChGWF9JTlQzMiBtb2R1bGVXaWR0aCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0SGVpZ2h0KEZYX0lOVDMyIGhlaWdodCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0V2lkdGgoRlhfSU5UMzIgd2lkdGgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9ESUJpdG1hcCoJQ3JlYXRlRElCaXRtYXAoRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCk7DQorICAgIEZYX0lOVDMyCQltX0NoYXJFbmNvZGluZzsNCisgICAgRlhfSU5UMzIJCW1fTW9kdWxlSGVpZ2h0Ow0KKyAgICBGWF9JTlQzMgkJbV9Nb2R1bGVXaWR0aDsNCisgICAgRlhfSU5UMzIJCW1fSGVpZ2h0Ow0KKyAgICBGWF9JTlQzMgkJbV9XaWR0aDsNCisgICAgRlhESUJfRm9ybWF0CW1fY29sb3JTcGFjZTsNCisgICAgRlhfQVJHQgkJCW1fYmFyQ29sb3I7DQorICAgIEZYX0FSR0IJCQltX2JhY2tncm91bmRDb2xvcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1gxMkVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3NyYy9pbmNsdWRlL0JDX1gxMkVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTExMWJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvQkNfWDEyRW5jb2Rlci5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfWDEyRU5DT0RFUl9IXw0KKyNkZWZpbmUgX0JDX1gxMkVOQ09ERVJfSF8NCitjbGFzcyBDQkNfQzQwRW5jb2RlcjsNCitjbGFzcyBDQkNfWDEyRW5jb2RlcjsNCitjbGFzcyBDQkNfWDEyRW5jb2RlciA6IHB1YmxpYyBDQkNfQzQwRW5jb2Rlcg0KK3sNCitwdWJsaWM6DQorICAgIENCQ19YMTJFbmNvZGVyKCk7DQorICAgIHZpcnR1YWwgfkNCQ19YMTJFbmNvZGVyKCk7DQorICAgIEZYX0lOVDMyIGdldEVuY29kaW5nTW9kZSgpOw0KKyAgICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIEZYX0lOVDMyICZlKTsNCisgICAgdm9pZCBoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBDRlhfV2lkZVN0cmluZyAmYnVmZmVyLCBGWF9JTlQzMiAmZSk7DQorICAgIEZYX0lOVDMyIGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBGWF9JTlQzMiAmZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9zcmMvaW5jbHVkZS91dGlscy5oIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2FhZGNjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvc3JjL2luY2x1ZGUvdXRpbHMuaApAQCAtMCwwICsxLDIxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19VVElMU19IXw0KKyNkZWZpbmUgX0JDX1VUSUxTX0hfDQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfTFBWT0lELCBGWF9JTlQzMj4gQ0ZYX1B0clRvSW50MzI7DQorRlhfQk9PTCBCQ19GWF9CeXRlU3RyaW5nX1JlcGxhY2UoQ0ZYX0J5dGVTdHJpbmcgJmRzdCwgRlhfRFdPUkQgZmlyc3QsIEZYX0RXT1JEIGxhc3QsIEZYX0lOVDMyIGNvdW50LCBGWF9DSEFSIGMpOw0KK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcgJmRzdCwgRlhfSU5UMzIgY291bnQsIEZYX0NIQVIgYyk7DQordm9pZCBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChDRlhfQnl0ZVN0cmluZyAmZHN0LCBjb25zdCBDRlhfQnl0ZUFycmF5ICZiYSk7DQordHlwZWRlZiBGWF9CT09MICgqQkNfUHRyQXJyYXlDb21wYXJlQ2FsbGJhY2spKEZYX0xQVk9JRCBsLCBGWF9MUFZPSUQgcik7DQordm9pZCBCQ19GWF9QdHJBcnJheV9Tb3J0KENGWF9QdHJBcnJheSAmc3JjLCBCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjayBmdW4pOw0KK3RlbXBsYXRlPGNsYXNzIF9UeT4NCitjbGFzcyBDQkNfQXV0b1B0cg0KK3sNCitwdWJsaWM6DQorICAgIHR5cGVkZWYgX1R5IGVsZW1lbnRfdHlwZTsNCisgICAgZXhwbGljaXQgQ0JDX0F1dG9QdHIoX1R5ICpfUCA9IDApDQorICAgICAgICA6IF9Pd25zKF9QICE9IDApLCBfUHRyKF9QKSB7fQ0KKyAgICBDQkNfQXV0b1B0cihjb25zdCBDQkNfQXV0b1B0cjxfVHk+JiBfWSkNCisgICAgICAgIDogX093bnMoX1kuX093bnMpLCBfUHRyKF9ZLnJlbGVhc2UoKSkge30NCisgICAgQ0JDX0F1dG9QdHI8X1R5PiYgb3BlcmF0b3I9KGNvbnN0IENCQ19BdXRvUHRyPF9UeT4mIF9ZKQ0KKyAgICB7DQorICAgICAgICBpZiAodGhpcyAhPSAmX1kpIHsNCisgICAgICAgICAgICBpZiAoX1B0ciAhPSBfWS5nZXQoKSkgew0KKyAgICAgICAgICAgICAgICBpZiAoX093bnMpIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfUHRyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIF9Pd25zID0gX1kuX093bnM7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChfWS5fT3ducykgew0KKyAgICAgICAgICAgICAgICBfT3ducyA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIF9QdHIgPSBfWS5yZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gKCp0aGlzKTsNCisgICAgfQ0KKyAgICB+Q0JDX0F1dG9QdHIoKQ0KKyAgICB7DQorICAgICAgICBpZiAoX093bnMpIHsNCisgICAgICAgICAgICBkZWxldGUgX1B0cjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBfVHkmIG9wZXJhdG9yKigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoKmdldCgpKTsNCisgICAgfQ0KKyAgICBfVHkgKm9wZXJhdG9yLT4oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKGdldCgpKTsNCisgICAgfQ0KKyAgICBfVHkgKmdldCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoX1B0cik7DQorICAgIH0NCisgICAgX1R5ICpyZWxlYXNlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgKChDQkNfQXV0b1B0cjxfVHk+ICopdGhpcyktPl9Pd25zID0gRkFMU0U7DQorICAgICAgICByZXR1cm4gKF9QdHIpOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgRlhfQk9PTCBfT3duczsNCisgICAgX1R5ICpfUHRyOw0KK307DQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQorI2luY2x1ZGUgPGxpbWl0cz4NCisjZWxpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9JT1NfKQ0KKyNpbmNsdWRlIDxsaW1pdHMuaD4NCisjZW5kaWYNCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCisjZGVmaW5lIEZYU1lTX2lzbmFuKHgpIF9pc25hbih4KQ0KKyNlbGlmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18pDQorI2luY2x1ZGUgPG1hdGguaD4NCisjZGVmaW5lIEZYU1lTX2lzbmFuKHgpIHN0ZDo6aXNuYW4oeCkNCisjZWxpZiAoX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8pDQorI2luY2x1ZGUgPG1hdGguaD4NCisjZGVmaW5lIEZYU1lTX2lzbmFuKHgpIGlzbmFuKHgpDQorI2VuZGlmDQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQorI2RlZmluZSBGWFNZU19uYW4oKSAoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKQ0KKyNlbGlmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18gfHwgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8pDQorI2RlZmluZSBGWFNZU19uYW4oKSBOQU4NCisjZW5kaWYNCitlbnVtIEJDRk9STUFUIHsNCisgICAgQkNGT1JNQVRfVU5TUEVDSUZZID0gLTEsDQorICAgIEJDRk9STUFUX0NPREFCQVIsDQorICAgIEJDRk9STUFUX0NPREVfMzksDQorICAgIEJDRk9STUFUX0NPREVfMTI4LA0KKyAgICBCQ0ZPUk1BVF9DT0RFXzEyOEIsDQorICAgIEJDRk9STUFUX0NPREVfMTI4QywNCisgICAgQkNGT1JNQVRfRUFOXzgsDQorICAgIEJDRk9STUFUX1VQQ19BLA0KKyAgICBCQ0ZPUk1BVF9FQU5fMTMsDQorICAgIEJDRk9STUFUX1BERl80MTcsDQorICAgIEJDRk9STUFUX0RBVEFNQVRSSVgsDQorICAgIEJDRk9STUFUX1FSX0NPREUNCit9Ow0KKyNkZWZpbmUgQkNGT1JNQVRfRUNMRVZFTF9MIDANCisjZGVmaW5lIEJDRk9STUFUX0VDTEVWRUxfTSAxDQorI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX1EgMg0KKyNkZWZpbmUgQkNGT1JNQVRfRUNMRVZFTF9IIDMNCisjaW5jbHVkZSA8Y3R5cGUuaD4NCisjZGVmaW5lIEZYU1lTX0ludE1heCBJTlRfTUFYDQorI2RlZmluZSBGWFNZU19Jc2RpZ2l0IGlzZGlnaXQNCisjZGVmaW5lCUJDRXhjZXB0aW9uTk8JCQkJCQkJCQkJCSAgICAgICAgICAgMA0KKyNkZWZpbmUJQkNFeGNlcHRpb25Ob3RGb3VuZAkJCQkJCQkJCQkgICAgICAgICAgIDENCisjZGVmaW5lCUJDRXhjZXB0aW9uRW5kTGVzc1RoYW5TdGFydAkJCQkJCQkJICAgICAgICAgICAyDQorI2RlZmluZQlCQ0V4Y2VwdGlvblVua25vd25EZWNvZGVyCQkJCQkJCQkgICAgICAgICAgIDMNCisjZGVmaW5lCUJDRXhjZXB0aW9uUm90YXRlTm90U3VwcG9ydGVkCQkJCQkJCSAgICAgICAgICAgNA0KKyNkZWZpbmUJQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxCQkJCQkgICAgICAgICAgIDUNCisjZGVmaW5lCUJDRXhjZXB0aW9uUmVnaW9uTXVzdEZpdEluc2lkZU1hdHJpeAkJCQkgICAgICAgICAgICAgICA2DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkNhbk5vdENhbGxHZXREaW1lbnNpb25Pbk5vblNxdWFyZU1hdHJpeAkJICAgICAgICAgICA3DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbgkJCQkJCQkJICAgICAgICAgICA4DQorI2RlZmluZQlCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudE11c3RNYXRjaFZlcnNpb25TaXplCQkgICAgICAgICAgICAgICA5DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uCQkJCQkJCSAgICAgICAgICAxMA0KKyNkZWZpbmUJQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRJbnZhbGlkRmlyc3REaWdpdAkJCSAgICAgICAgICAgICAgMTENCisjZGVmaW5lCUJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50SW52YWxpZFNlY29uZERpZ2l0CQkJICAgICAgICAgIDEyDQorI2RlZmluZQlCQ0V4Y2VwdGlvblJ1bnRpbWVEZWNvZGluZ0ludmFsaWRJU09fSUVDCQkJCSAgICAgICAgICAxMw0KKyNkZWZpbmUJQkNFeGNlcHRpb25SdW50aW1lRGVjb2RpbmdJbnZhbGlkQWxwaGFudW1lcmljCQkJICAgICAgICAgIDE0DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkxlZnRBbmRUb3BNdXN0QmVOb25uZWdhdGl2ZQkJCQkJICAgICAgICAgIDE1DQorI2RlZmluZQlCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudAkJCQkJCQkJICAgICAgICAgIDE2DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkJhZEVDSQkJCQkJCQkJCQkgICAgICAgICAgMTcNCisjZGVmaW5lCUJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlCQkJCQkJCSAgICAgICAgICAxOA0KKyNkZWZpbmUJQkNFeGNlcHRpb25VblN1cHBvcnRlZFN0cmluZwkJCQkJCQkgICAgICAgICAgMTkNCisjZGVmaW5lCUJDRXhjZXB0aW9uRGlnaXRMZW5ndGhNdXN0QmU4CQkJCQkJCSAgICAgICAgICAyMA0KKyNkZWZpbmUJQkNFeGNlcHRpb25EYXRhQ2hlY2tFeGNlcHRpb24JCQkJCQkJICAgICAgICAgIDIxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkV4dHJhY3ROdW1iZXJWYWx1ZUZyb21CaXRBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAyMg0KKyNkZWZpbmUgQkNFeGNlcHRpb25SZWFkCQkJCQkJCQkJCQkgICAgICAgICAgMjMNCisjZGVmaW5lIEJDRXhjZXB0aW9uUmVxdWVzdGVkUm93SXNPdXRTaXplVGhlSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgIDI0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNg0KKyNkZWZpbmUgQkNFeGNlcHRpb25VblN1cHBvcnRFY2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcNCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0TW9kZQkJCQkJCQkJICAgICAgICAgIDI4DQorI2RlZmluZSBCQ0V4Y2VwdGlvblJlZmVyZW5jZU11c3RCZUJldHdlZW4wQW5kNwkJCQkJICAgICAgICAgIDI5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZEVycm9yTG9jYXRpb24JCQkJCQkJCSAgICAgICAgICAzMA0KKyNkZWZpbmUgQkNFeGNlcHRpb25EZWdyZWVJc05lZ2F0aXZlCQkJCQkJCSAJICAgICAgICAgIDMxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRpdmlkZUJ5WmVybwkJCQkJCQkJCSAgICAgICAgICAzMg0KKyNkZWZpbmUgQkNFeGNlcHRpb25Db2VmZmljaWVudHNTaXplSXNOdWxsCQkJCQkJICAgICAgICAgIDMzDQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vQ29ycmVjdGlvbkJ5dGVzCQkJCQkJCSAgICAgICAgICAzNA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob0RhdGFCeXRlc1Byb3ZpZGVkCQkJCQkJICAgICAgICAgICAgICAzNQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25SX0lfMUlzWmVybwkJCQkJCQkJCSAgICAgICAgICAzNg0KKyNkZWZpbmUgQkNFeGNlcHRpb25BSXNaZXJvCQkJCQkJCQkJCSAgICAgICAgICAzNw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Jc1plcm8JCQkJCQkJCQkJICAgICAgICAgIDM4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRlZ3JlZU5vdE1hdGNoUm9vdHMJCQkJCSAgICAgICAgICAgICAgICAgIDM5DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkNvbnRlbnRzTGVuZ3RoU2hvdWxkQmV0d2VlbjFhbmQ4MAkgICAgICAgICAgICAgICAgICA0MA0KKyNkZWZpbmUJQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8xMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDENCisjZGVmaW5lCUJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyDQorI2RlZmluZQlCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVFQU5fMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mw0KKyNkZWZpbmUJQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQNCisjZGVmaW5lCUJDRXhjZXB0aW9uT25seUVuY29kZUlURiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1DQorI2RlZmluZQlCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ng0KKyNkZWZpbmUJQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTZvcjhvcjEwb3IxMm9yMTRvcjE2b3IyMG9yMjRvcjQ0ICAgICAgNDcNCisjZGVmaW5lCUJDRXhjZXB0aW9uT25seUVuY29kZVVQQ19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkQmUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25WYWx1ZU11c3RCZUVpdGhlcjBvcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTANCisjZGVmaW5lIEJDRXhjZXB0aW9uUmVlZHNvbG9tbkRlY29kZUV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Mg0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWRWYWx1ZUV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMNCisjZGVmaW5lIEJDRXhjZXB0aW9uQmFkTnVtQml0c0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbmNhbk5vdE9wZXJhdGV4b3JPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25WZXJzaW9uTXVzdDFfNDAJCQkJCQkJCQkJICA1Ng0KKyNkZWZpbmUgQkNFeGNlcHRpb25Vbmtub3duCQkJCQkJCQkJCQkJICA1Nw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uCQkJCQkJICAgIAkJICAgICAgNTgNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2Fubm90RmluZEJsb2NrSW5mbwkJCQkJCQkJCSAgNTkNCisjZGVmaW5lIEJDRXhjZXB0aW9uRGF0YVRvb0JpZwkJCQkJCQkgICAgICAgICAJCSAgNjANCisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZQkJCQkJCQkJCQkgIDYxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRhdGFUb29NYW55CQkJCQkJCQkJCQkgIDYyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdHNOb3RFcXVhbENhY2l0eQkJCQkJCQkJICAgICAgNjMNCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5zdXBwb3J0ZWRNb2RlCQkJCQkJCQkJCSAgNjQNCisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcgkJCQkJICAgICAgICAgICAgICAgICAgNjUNCisjZGVmaW5lIEJDRXhjZXB0aW9uQnl0ZXNOb3RNYXRjaE9mZnNldAkJCQkJCQkJICAgICAgNjYNCisjZGVmaW5lIEJDRXhjZXB0aW9uU2l6ZUluQnl0ZXNEaWZmZXIJCQkgICAgICAgCQkJCQkgIDY3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVNYXNrUGF0dGVybgkJCQkJCQkJICA2OA0KKyNkZWZpbmUgQkNFeGNlcHRpb25OdWxsUG9pbnRlciAJCQkJCQkJCQkJCSAgNjkNCisjZGVmaW5lIEJDRXhjZXB0aW9uQmFkTWFzayAJCQkJCQkJCQkJCSAgICAgIDcwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdFNpemVOb3QxNQkJCQkJCQkJCQkgICAgICA3MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CaXRTaXplTm90MTgJCQkJCQkJCQkJCSAgNzINCisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZUltYWdlRGF0YQkJCQkJCQkJCSAgNzMNCisjZGVmaW5lIEJDRXhjZXB0aW9uSGVpZ2h0XzhCZVplcm8JCQkJCQkJCQkJICA3NA0KKyNkZWZpbmUgQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZQkJCQkJCQkJCSAgNzUNCisjZGVmaW5lIEJDRXhjZXB0aW9uQml0c0J5dGVzTm90TWF0Y2gJCQkJCQkJCQkgIDc2DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhCQkJCQkJCQkJCSAgNzcNCisjZGVmaW5lIEJDRXhjZXB0aW9uTG9hZEZpbGUJCQkJCQkJCQkJCQkgIDc4DQorI2RlZmluZSBCQ0V4Y2VwdGlvblBERjQxN0VuY29kZUZhaWwJCQkJCQkJCSAgICAgICAgICA3OQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25GYWlsVG9DcmVhdGVCaXRtYXAJCQkJCQkJCQkgIDgwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkxvYWRGb250RmFpbAkJCQkJCQkJCQkJICA4MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERUJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODINCisjZGVmaW5lIEJDRXhjZXB0aW9uQ29kYWJhclNob3VsZFN0YXJ0V2l0aE9uZU9mQUJDRCAgICAgICAgICAgICAgICAgICAgICAgIDgzDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZGFiYXJTaG91bGRFbmRXaXRoT25lT2ZUTkUgICAgICAgICAgICAgICAgICAgICAgICAgICA4NA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Db2RhYmFyRW5jb2RlQ2hhcnNJbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUNCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZURBVEFNQVRSSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg2DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNoYXJhY3RlcnNPdXRzaWRlSVNPODg1OTFFbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICA4Nw0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsRGF0YUNvZGV3b3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnMgICAgICAgICAgICAgICAgICAgIDg5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZVVuZXhwZWN0ZWRDYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MA0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVDb3VudE11c3ROb3RFeGNlZWQ0ICAgICAgICAgICAgICAgICAgICAgICAgOTENCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlTWVzc2FnZUxlbmd0aEludmFsaWQgICAgICAgICAgICAgICAgICAgICAgIDkyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudE5vdEdpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Mw0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVJbGxlZ2FsTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQNCisjZGVmaW5lCUJDRXhjZXB0aW9uT25seUVuY29kZVBERjQxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1DQorI2RlZmluZQlCQ0V4Y2VwdGlvbk5vbkVuY29kYWJsZUNoYXJhY3RlckRldGVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICA5Ng0KKyNkZWZpbmUJQkNFeGNlcHRpb25FcnJvckNvcnJlY3Rpb25MZXZlbE11c3RCZUJldHdlZW4wQW5kOCAgICAgICAgICAgICAgICAgOTcNCisjZGVmaW5lCUJDRXhjZXB0aW9uTm9SZWNvbW1lbmRhdGlvblBvc3NpYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4DQorI2RlZmluZQlCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudG5NdXN0QmVBYm92ZTAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OQ0KKyNkZWZpbmUJQkNFeGNlcHRpb25VbmFibGVUb0ZpdE1lc3NhZ2VJbkNvbHVtbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwDQorI2RlZmluZQlCQ0V4Y2VwdGlvbkVuY29kZWRNZXNzYWdlQ29udGFpbnNUb29NYW55Q29kZVdvcmRzICAgICAgICAgICAgICAgICAxMDENCisjZGVmaW5lIEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yCQkJCQkJCQkJCSAgMTAyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDINCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMw0KKyNkZWZpbmUgQkNFeGNlcHRpb250Tm90Rm91bmRJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vdEZvdW5kSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2Fubm90TWV0YWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNg0KKyNkZWZpbmUgVFdPX0RJR0lUX0RBVEFfTEVOR1RIX1NJWkUJCQkJCTI0DQorI2RlZmluZSBUSFJFRV9ESUdJVF9EQVRBX0xFTkdUSF9TSVpFCQkJCTIzDQorI2RlZmluZSBUSFJFRV9ESUdJVF9QTFVTX0RJR0lUX0RBVEFfTEVOR1RIX1NJWkUJCTU3DQorI2RlZmluZSBGT1VSX0RJR0lUX0RBVEFfTEVOR1RIX1NJWkUJCQkJCTE3DQorI2RlZmluZSBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSByZXR1cm47DQorI2RlZmluZSBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgdikgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgcmV0dXJuIHY7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2NoZWNrc3VtLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkMDdiYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9jaGVja3N1bS5oIg0KK0NYRkFfU0FYUmVhZGVySGFuZGxlcjo6Q1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0ICpwQ29udGV4dCkNCisgICAgOiBtX3BDb250ZXh0KHBDb250ZXh0KQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcENvbnRleHQpOw0KK30NCitDWEZBX1NBWFJlYWRlckhhbmRsZXI6On5DWEZBX1NBWFJlYWRlckhhbmRsZXIoKQ0KK3sNCit9DQorRlhfTFBWT0lEIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdFbnRlcihGWF9CU1RSIGJzVGFnTmFtZSwgRlhfU0FYTk9ERSBlVHlwZSwgRlhfRFdPUkQgZHdTdGFydFBvcykNCit7DQorICAgIFVwZGF0ZUNoZWNrc3VtKFRSVUUpOw0KKyAgICBpZiAoZVR5cGUgIT0gRlhfU0FYTk9ERV9UYWcgJiYgZVR5cGUgIT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgbV9TQVhDb250ZXh0Lm1fZU5vZGUgPSBlVHlwZTsNCisgICAgQ0ZYX0J5dGVUZXh0QnVmICZ0ZXh0QnVmID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZjsNCisgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPCIpOw0KKyAgICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPyIpOw0KKyAgICB9DQorICAgIHRleHRCdWYgPDwgYnNUYWdOYW1lOw0KKyAgICBtX1NBWENvbnRleHQubV9ic1RhZ05hbWUgPSBic1RhZ05hbWU7DQorICAgIHJldHVybiAmbV9TQVhDb250ZXh0Ow0KK30NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdBdHRyaWJ1dGUoRlhfTFBWT0lEIHBUYWcsIEZYX0JTVFIgYnNBdHRyaSwgRlhfQlNUUiBic1ZhbHVlKQ0KK3sNCisgICAgaWYgKHBUYWcgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlVGV4dEJ1ZiAmdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCIgIik7DQorICAgIHRleHRCdWYgPDwgYnNBdHRyaTsNCisgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPVwiIik7DQorICAgIHRleHRCdWYgPDwgYnNWYWx1ZTsNCisgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiXCIiKTsNCit9DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQnJlYWsoRlhfTFBWT0lEIHBUYWcpDQorew0KKyAgICBpZiAocFRhZyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX0J5dGVUZXh0QnVmICZ0ZXh0QnVmID0gKChDWEZBX1NBWENvbnRleHQqKXBUYWcpLT5tX1RleHRCdWY7DQorICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj4iKTsNCisgICAgVXBkYXRlQ2hlY2tzdW0oRkFMU0UpOw0KK30NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdEYXRhKEZYX0xQVk9JRCBwVGFnLCBGWF9TQVhOT0RFIGVUeXBlLCBGWF9CU1RSIGJzRGF0YSwgRlhfRFdPUkQgZHdTdGFydFBvcykNCit7DQorICAgIGlmIChwVGFnID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVRleHRCdWYgJnRleHRCdWYgPSAoKENYRkFfU0FYQ29udGV4dCopcFRhZyktPm1fVGV4dEJ1ZjsNCisgICAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfQ2hhckRhdGEpIHsNCisgICAgICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIjwhW0NEQVRBWyIpOw0KKyAgICB9DQorICAgIHRleHRCdWYgPDwgYnNEYXRhOw0KKyAgICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9DaGFyRGF0YSkgew0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiXV0+Iik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQ2xvc2UoRlhfTFBWT0lEIHBUYWcsIEZYX0RXT1JEIGR3RW5kUG9zKQ0KK3sNCisgICAgaWYgKHBUYWcgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfU0FYQ29udGV4dCAqcFNBWENvbnRleHQgPSAoQ1hGQV9TQVhDb250ZXh0KilwVGFnOw0KKyAgICBDRlhfQnl0ZVRleHRCdWYgJnRleHRCdWYgPSBwU0FYQ29udGV4dC0+bV9UZXh0QnVmOw0KKyAgICBpZiAocFNBWENvbnRleHQtPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPz4iKTsNCisgICAgfSBlbHNlIGlmIChwU0FYQ29udGV4dC0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZykgew0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPjwvIik7DQorICAgICAgICB0ZXh0QnVmIDw8IHBTQVhDb250ZXh0LT5tX2JzVGFnTmFtZTsNCisgICAgICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj4iKTsNCisgICAgfQ0KKyAgICBVcGRhdGVDaGVja3N1bShGQUxTRSk7DQorfQ0KK3ZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0VuZChGWF9MUFZPSUQgcFRhZywgRlhfQlNUUiBic1RhZ05hbWUsIEZYX0RXT1JEIGR3RW5kUG9zKQ0KK3sNCisgICAgaWYgKHBUYWcgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlVGV4dEJ1ZiAmdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI8LyIpOw0KKyAgICB0ZXh0QnVmIDw8IGJzVGFnTmFtZTsNCisgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPiIpOw0KKyAgICBVcGRhdGVDaGVja3N1bShGQUxTRSk7DQorfQ0KK3ZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhcmdldERhdGEoRlhfTFBWT0lEIHBUYWcsIEZYX1NBWE5PREUgZVR5cGUsIEZYX0JTVFIgYnNEYXRhLCBGWF9EV09SRCBkd1N0YXJ0UG9zKQ0KK3sNCisgICAgaWYgKHBUYWcgPT0gTlVMTCAmJiBlVHlwZSAhPSBGWF9TQVhOT0RFX0NvbW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9Db21tZW50KSB7DQorICAgICAgICBDRlhfQnl0ZVRleHRCdWYgJnRleHRCdWYgPSBtX1NBWENvbnRleHQubV9UZXh0QnVmOw0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPCEtLSIpOw0KKyAgICAgICAgdGV4dEJ1ZiA8PCBic0RhdGE7DQorICAgICAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCItLT4iKTsNCisgICAgICAgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiAmdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiICIpOw0KKyAgICAgICAgdGV4dEJ1ZiA8PCBic0RhdGE7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6OlVwZGF0ZUNoZWNrc3VtKEZYX0JPT0wgYkNoZWNrU3BhY2UpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfTFBCWVRFIHBCdWZmZXIgPSBtX1NBWENvbnRleHQubV9UZXh0QnVmLkdldEJ1ZmZlcigpOw0KKyAgICBGWF9CT09MIGJVcGRhdGEgPSBUUlVFOw0KKyAgICBpZiAoYkNoZWNrU3BhY2UpIHsNCisgICAgICAgIGJVcGRhdGEgPSBGQUxTRTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBiVXBkYXRhID0gKHBCdWZmZXJbaV0gPiAweDIwKTsNCisgICAgICAgICAgICBpZiAoYlVwZGF0YSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJVcGRhdGEpIHsNCisgICAgICAgIG1fcENvbnRleHQtPlVwZGF0ZShDRlhfQnl0ZVN0cmluZ0MocEJ1ZmZlciwgaUxlbmd0aCkpOw0KKyAgICB9DQorICAgIG1fU0FYQ29udGV4dC5tX1RleHRCdWYuQ2xlYXIoKTsNCit9DQorSVhGQV9DaGVja3N1bUNvbnRleHQqIFhGQV9DaGVja3N1bV9DcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX0NoZWNrc3VtQ29udGV4dDsNCit9DQorQ1hGQV9DaGVja3N1bUNvbnRleHQ6OkNYRkFfQ2hlY2tzdW1Db250ZXh0KCkNCisgICAgOiBtX3BTQVhSZWFkZXIoTlVMTCkNCisgICAgLCBtX3BCeXRlQ29udGV4dChOVUxMKQ0KK3sNCit9DQorQ1hGQV9DaGVja3N1bUNvbnRleHQ6On5DWEZBX0NoZWNrc3VtQ29udGV4dCgpDQorew0KKyAgICBGaW5pc2hDaGVja3N1bSgpOw0KK30NCitGWF9CT09MIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpTdGFydENoZWNrc3VtKCkNCit7DQorICAgIEZpbmlzaENoZWNrc3VtKCk7DQorICAgIG1fcEJ5dGVDb250ZXh0ID0gRlhfQWxsb2MoRlhfQllURSwgMTI4KTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEJ5dGVDb250ZXh0ICE9IE5VTEwpOw0KKyAgICBDUllQVF9TSEExU3RhcnQobV9wQnl0ZUNvbnRleHQpOw0KKyAgICBtX2JzQ2hlY2tzdW0uRW1wdHkoKTsNCisgICAgbV9wU0FYUmVhZGVyID0gRlhfU0FYUmVhZGVyX0NyZWF0ZSgpOw0KKyAgICByZXR1cm4gbV9wU0FYUmVhZGVyICE9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OlVwZGF0ZUNoZWNrc3VtKElGWF9GaWxlUmVhZCAqcFNyY0ZpbGUsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpDQorew0KKyAgICBpZiAobV9wU0FYUmVhZGVyID09IE5VTEwpCXsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocFNyY0ZpbGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChzaXplIDwgMSkgew0KKyAgICAgICAgc2l6ZSA9IHBTcmNGaWxlLT5HZXRTaXplKCk7DQorICAgIH0NCisgICAgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyIGhhbmRsZXIodGhpcyk7DQorICAgIG1fcFNBWFJlYWRlci0+U2V0SGFuZGxlcigmaGFuZGxlcik7DQorICAgIGlmIChtX3BTQVhSZWFkZXItPlN0YXJ0UGFyc2UocFNyY0ZpbGUsIChGWF9EV09SRClvZmZzZXQsIChGWF9EV09SRClzaXplLCBGWF9TQVhQQVJTRU1PREVfTm90U2tpcFNwYWNlIHwgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfYW1wIHwgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfbHQgfCBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCB8IEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X3NoYXJwKSA8IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wU0FYUmVhZGVyLT5Db250aW51ZVBhcnNlKE5VTEwpID4gOTk7DQorfQ0KK3ZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OkZpbmlzaENoZWNrc3VtKCkNCit7DQorICAgIGlmIChtX3BTQVhSZWFkZXIgIT0gTlVMTCkgew0KKyAgICAgICAgbV9wU0FYUmVhZGVyLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTQVhSZWFkZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BCeXRlQ29udGV4dCkgew0KKyAgICAgICAgRlhfQllURSBkaWdlc3RbMjBdOw0KKyAgICAgICAgRlhTWVNfbWVtc2V0KGRpZ2VzdCwgMCwgMjApOw0KKyAgICAgICAgQ1JZUFRfU0hBMUZpbmlzaChtX3BCeXRlQ29udGV4dCwgZGlnZXN0KTsNCisgICAgICAgIEZYX0lOVDMyIG5MZW4gPSBGWF9CYXNlNjRFbmNvZGVBKGRpZ2VzdCwgMjAsIE5VTEwpOw0KKyAgICAgICAgRlhfTFBTVFIgcEJ1ZmZlciA9IG1fYnNDaGVja3N1bS5HZXRCdWZmZXIobkxlbik7DQorICAgICAgICBGWF9CYXNlNjRFbmNvZGVBKGRpZ2VzdCwgMjAsIHBCdWZmZXIpOw0KKyAgICAgICAgbV9ic0NoZWNrc3VtLlJlbGVhc2VCdWZmZXIobkxlbik7DQorICAgICAgICBGWF9GcmVlKG1fcEJ5dGVDb250ZXh0KTsNCisgICAgICAgIG1fcEJ5dGVDb250ZXh0ID0gTlVMTDsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpHZXRDaGVja3N1bShDRlhfQnl0ZVN0cmluZyAmYnNDaGVja3N1bSkNCit7DQorICAgIGJzQ2hlY2tzdW0gPSBtX2JzQ2hlY2tzdW07DQorfQ0KK3ZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OlVwZGF0ZShGWF9CU1RSIGJzVGV4dCkNCit7DQorICAgIGlmIChtX3BCeXRlQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICBDUllQVF9TSEExVXBkYXRlKG1fcEJ5dGVDb250ZXh0LCBic1RleHQuR2V0UHRyKCksIGJzVGV4dC5HZXRMZW5ndGgoKSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2NoZWNrc3VtLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJlY2E3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2NoZWNrc3VtLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmCV9GWEZBX0ZPUk1GSUxMRVJfQ0hFQ0tTVU1fSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfQ0hFQ0tTVU1fSU1QX0gNCitjbGFzcyBDWEZBX1NBWFJlYWRlckhhbmRsZXI7DQorY2xhc3MgQ1hGQV9DaGVja3N1bUNvbnRleHQ7DQorY2xhc3MgQ1hGQV9TQVhDb250ZXh0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1NBWENvbnRleHQoKSA6IG1fZU5vZGUoRlhfU0FYTk9ERV9Vbmtub3duKQ0KKyAgICB7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVUZXh0QnVmCQltX1RleHRCdWY7DQorICAgIENGWF9CeXRlU3RyaW5nCQltX2JzVGFnTmFtZTsNCisgICAgRlhfU0FYTk9ERQkJCW1fZU5vZGU7DQorfTsNCitjbGFzcyBDWEZBX1NBWFJlYWRlckhhbmRsZXIgOiBwdWJsaWMgSUZYX1NBWFJlYWRlckhhbmRsZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0ICpwQ29udGV4dCk7DQorICAgIHZpcnR1YWwgfkNYRkFfU0FYUmVhZGVySGFuZGxlcigpOw0KKyAgICB2aXJ0dWFsIEZYX0xQVk9JRAlPblRhZ0VudGVyKEZYX0JTVFIgYnNUYWdOYW1lLCBGWF9TQVhOT0RFIGVUeXBlLCBGWF9EV09SRCBkd1N0YXJ0UG9zKTsNCisgICAgdmlydHVhbCB2b2lkCQlPblRhZ0F0dHJpYnV0ZShGWF9MUFZPSUQgcFRhZywgRlhfQlNUUiBic0F0dHJpLCBGWF9CU1RSIGJzVmFsdWUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQnJlYWsoRlhfTFBWT0lEIHBUYWcpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnRGF0YShGWF9MUFZPSUQgcFRhZywgRlhfU0FYTk9ERSBlVHlwZSwgRlhfQlNUUiBic0RhdGEsIEZYX0RXT1JEIGR3U3RhcnRQb3MpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQ2xvc2UoRlhfTFBWT0lEIHBUYWcsIEZYX0RXT1JEIGR3RW5kUG9zKTsNCisgICAgdmlydHVhbCB2b2lkCQlPblRhZ0VuZChGWF9MUFZPSUQgcFRhZywgRlhfQlNUUiBic1RhZ05hbWUsIEZYX0RXT1JEIGR3RW5kUG9zKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQlPblRhcmdldERhdGEoRlhfTFBWT0lEIHBUYWcsIEZYX1NBWE5PREUgZVR5cGUsIEZYX0JTVFIgYnNEYXRhLCBGWF9EV09SRCBkd1N0YXJ0UG9zKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJVXBkYXRlQ2hlY2tzdW0oRlhfQk9PTCBiQ2hlY2tTcGFjZSk7DQorICAgIENYRkFfQ2hlY2tzdW1Db250ZXh0CSptX3BDb250ZXh0Ow0KKyAgICBDWEZBX1NBWENvbnRleHQJCQltX1NBWENvbnRleHQ7DQorfTsNCitjbGFzcyBDWEZBX0NoZWNrc3VtQ29udGV4dCA6IHB1YmxpYyBJWEZBX0NoZWNrc3VtQ29udGV4dCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0NoZWNrc3VtQ29udGV4dCgpOw0KKyAgICB+Q1hGQV9DaGVja3N1bUNvbnRleHQoKTsNCisgICAgdmlydHVhbAl2b2lkCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQlTdGFydENoZWNrc3VtKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJVXBkYXRlQ2hlY2tzdW0oSUZYX0ZpbGVSZWFkICpwU3JjRmlsZSwgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSAwKTsNCisgICAgdmlydHVhbCB2b2lkCQlGaW5pc2hDaGVja3N1bSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCUdldENoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZic0NoZWNrc3VtKTsNCisgICAgdm9pZAkJCQlVcGRhdGUoRlhfQlNUUiBic1RleHQpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZYX1NBWFJlYWRlcgkJKm1fcFNBWFJlYWRlcjsNCisgICAgRlhfTFBCWVRFCQkJbV9wQnl0ZUNvbnRleHQ7DQorICAgIENGWF9CeXRlU3RyaW5nCQltX2JzQ2hlY2tzdW07DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQ2YTMzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmNwcApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZDb25maWdBY2MuaCINCitDWEZBX0ZGQ29uZmlnQWNjOjpDWEZBX0ZGQ29uZmlnQWNjKENYRkFfTm9kZSAqcE5vZGUpDQorICAgIDogbV9wTm9kZShwTm9kZSkNCisgICAgLCBtX3BQc01hcE5vZGUoTlVMTCkNCit7DQorfQ0KK0NYRkFfRkZDb25maWdBY2M6On5DWEZBX0ZGQ29uZmlnQWNjKCkNCit7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZDb25maWdBY2M6OkNvdW50Q2hpbGRyZW4oKQ0KK3sNCisgICAgR2V0UHNNYXBOb2RlKCk7DQorICAgIGlmIChtX3BQc01hcE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFBzTWFwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlDb3VudCsrOw0KKyAgICB9DQorICAgIHJldHVybiBpQ291bnQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbmZpZ0FjYzo6R2V0Rm9udEluZm8oRlhfSU5UMzIgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0ZvbnRGYW1pbHksIENGWF9XaWRlU3RyaW5nICZ3c1BzTmFtZSwgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljKQ0KK3sNCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudENoaWxkcmVuKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUgKnBGb250Tm9kZSA9IG1fcFBzTWFwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX0ZvbnQpOw0KKyAgICBpZiAocEZvbnROb2RlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3c0ZvbnRGYW1pbHkuRW1wdHkoKTsNCisgICAgd3NQc05hbWUuRW1wdHkoKTsNCisgICAgYkJvbGQgID0gRkFMU0U7DQorICAgIGJJdGFsaWMgPSBGQUxTRTsNCisgICAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgd3NGb250RmFtaWx5KTsNCisgICAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Qc05hbWUsIHdzUHNOYW1lKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9XZWlnaHQsIHdzVmFsdWUpOw0KKyAgICB3c1ZhbHVlLk1ha2VMb3dlcigpOw0KKyAgICBpZiAod3NWYWx1ZSA9PSBGWF9XU1RSQyhMImJvbGQiKSkgew0KKyAgICAgICAgYkJvbGQgPSBUUlVFOw0KKyAgICB9DQorICAgIHBGb250Tm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgd3NWYWx1ZSk7DQorICAgIHdzVmFsdWUuTWFrZUxvd2VyKCk7DQorICAgIGlmICh3c1ZhbHVlID09IEZYX1dTVFJDKEwiaXRhbGljIikpIHsNCisgICAgICAgIGJJdGFsaWMgPSBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiB3c0ZvbnRGYW1pbHkuR2V0TGVuZ3RoKCkgPiAwOw0KK30NCit2b2lkIENYRkFfRkZDb25maWdBY2M6OkdldFBzTWFwTm9kZSgpDQorew0KKyAgICBpZiAobV9wTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wUHNNYXBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUHNNYXApOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZkNvbmZpZ0FjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDdmYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUkNPTkZJR0FDQ19JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUkNPTkZJR0FDQ19JTVBfSA0KK2NsYXNzIENYRkFfRkZDb25maWdBY2MgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZDb25maWdBY2MoQ1hGQV9Ob2RlICpwTm9kZSk7DQorICAgIH5DWEZBX0ZGQ29uZmlnQWNjKCk7DQorICAgIEZYX0lOVDMyCQlDb3VudENoaWxkcmVuKCk7DQorICAgIEZYX0JPT0wJCQlHZXRGb250SW5mbyhGWF9JTlQzMiBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRm9udEZhbWlseSwgQ0ZYX1dpZGVTdHJpbmcgJndzUHNOYW1lLCBGWF9CT09MIGJCb2xkLCBGWF9CT09MIGJJdGFsaWMpOw0KK3ByaXZhdGU6DQorICAgIHZvaWQJCQlHZXRQc01hcE5vZGUoKTsNCisgICAgQ1hGQV9Ob2RlCQkqbV9wTm9kZTsNCisgICAgQ1hGQV9Ob2RlCQkqbV9wUHNNYXBOb2RlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYXBwLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlYzk1YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5jcHAKQEAgLTAsMCArMSwzMDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvY2hhbmRsZXIuaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZndsdGhlbWUuaCINCisjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0aGFuZGxlci5oIg0KK0NYRkFfRmlsZVJlYWQ6OkNYRkFfRmlsZVJlYWQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJlYW0qPiAmc3RyZWFtcykNCisgICAgOiBtX2R3U2l6ZSgwKQ0KK3sNCisgICAgbV9TdHJlYW1zLkNvcHkoc3RyZWFtcyk7DQorfQ0KK0NYRkFfRmlsZVJlYWQ6On5DWEZBX0ZpbGVSZWFkKCkNCit7DQorICAgIG1fU3RyZWFtcy5SZW1vdmVBbGwoKTsNCisgICAgbV9TdHJlYW1TaXplLlJlbW92ZUFsbCgpOw0KK30NCitGWF9GSUxFU0laRSBDWEZBX0ZpbGVSZWFkOjpHZXRTaXplKCkNCit7DQorICAgIGlmIChtX1N0cmVhbVNpemUuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcmV0dXJuIG1fZHdTaXplOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fU3RyZWFtcy5HZXRTaXplKCk7DQorICAgIEZYX0RXT1JEIGlCdWZmZXJTaXplID0gNDA5NjsNCisgICAgRlhfTFBCWVRFIHBCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBpQnVmZmVyU2l6ZSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ1BERl9TdHJlYW1GaWx0ZXIqIHBTdHJlYW1GaWx0ZXIgPSBtX1N0cmVhbXNbaV0tPkdldFN0cmVhbUZpbHRlcihGQUxTRSk7DQorICAgICAgICBGWF9EV09SRCBkd0N1clNpemUgPSAwOw0KKyAgICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgICAgICBGWF9EV09SRCBkd1JlYWQgPSBwU3RyZWFtRmlsdGVyLT5SZWFkQmxvY2socEJ1ZiwgaUJ1ZmZlclNpemUpOw0KKyAgICAgICAgICAgIGR3Q3VyU2l6ZSArPSBkd1JlYWQ7DQorICAgICAgICAgICAgaWYgKGR3UmVhZCA8IGlCdWZmZXJTaXplKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1fZHdTaXplICs9IGR3Q3VyU2l6ZTsNCisgICAgICAgIG1fU3RyZWFtU2l6ZS5BZGQoZHdDdXJTaXplKTsNCisgICAgICAgIGRlbGV0ZSBwU3RyZWFtRmlsdGVyOw0KKyAgICB9DQorICAgIEZYX0ZyZWUocEJ1Zik7DQorICAgIHJldHVybiBtX2R3U2l6ZTsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGVSZWFkOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQ0KK3sNCisgICAgRlhfRklMRVNJWkUgZHdMZW4gPSAwOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX1N0cmVhbXMuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgZHdMZW4gKz0gbV9TdHJlYW1TaXplW2ldOw0KKyAgICAgICAgaWYgKGR3TGVuID4gb2Zmc2V0KSB7DQorICAgICAgICAgICAgZHdMZW4gLT0gbV9TdHJlYW1TaXplW2ldOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpID49IGlDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENQREZfU3RyZWFtRmlsdGVyKiBwU3RyZWFtRmlsdGVyID0gbV9TdHJlYW1zW2ldLT5HZXRTdHJlYW1GaWx0ZXIoRkFMU0UpOw0KKyAgICBpZiAoKG9mZnNldCAtPSBkd0xlbikgPiAwKSB7DQorICAgICAgICBGWF9MUEJZVEUgcEJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIG9mZnNldCk7DQorICAgICAgICBGWF9EV09SRCBkd1JlYWQgPSBwU3RyZWFtRmlsdGVyLT5SZWFkQmxvY2socEJ1Ziwgb2Zmc2V0KTsNCisgICAgICAgIEZYX0ZyZWUocEJ1Zik7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdIYWRSZWFkID0gcFN0cmVhbUZpbHRlci0+UmVhZEJsb2NrKChGWF9MUEJZVEUpYnVmZmVyLCBzaXplKTsNCisgICAgZGVsZXRlIHBTdHJlYW1GaWx0ZXI7DQorICAgIHNpemUgLT0gZHdIYWRSZWFkOw0KKyAgICBpZiAoc2l6ZSA8PSAwKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1JlYWRTaXplID0gZHdIYWRSZWFkOw0KKyAgICBmb3IgKEZYX0lOVDMyIGlTdGFydCA9IGkgKyAxOyBpU3RhcnQgPCBpQ291bnQ7IGlTdGFydCsrKSB7DQorICAgICAgICBDUERGX1N0cmVhbUZpbHRlciogcFN0cmVhbUZpbHRlciA9IG1fU3RyZWFtc1tpU3RhcnRdLT5HZXRTdHJlYW1GaWx0ZXIoRkFMU0UpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdIYWRSZWFkID0gcFN0cmVhbUZpbHRlci0+UmVhZEJsb2NrKCgoRlhfTFBCWVRFKWJ1ZmZlcikgKyBkd1JlYWRTaXplLCBzaXplKTsNCisgICAgICAgIGRlbGV0ZSBwU3RyZWFtRmlsdGVyOw0KKyAgICAgICAgc2l6ZSAtPSBkd0hhZFJlYWQ7DQorICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBkd1JlYWRTaXplICs9IGR3SGFkUmVhZDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfRmlsZVJlYWQyOjpDWEZBX0ZpbGVSZWFkMihjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1N0cmVhbSo+ICZzdHJlYW1zKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gc3RyZWFtcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ1BERl9TdHJlYW1BY2MgJmFjYyA9IG1fRGF0YS5BZGQoKTsNCisgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShzdHJlYW1zW2ldKTsNCisgICAgfQ0KK30NCitGWF9GSUxFU0laRSBDWEZBX0ZpbGVSZWFkMjo6R2V0U2l6ZSgpDQorew0KKyAgICBGWF9EV09SRCBkd1NpemUgPSAwOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0RhdGEuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIENQREZfU3RyZWFtQWNjICZhY2MgPSBtX0RhdGFbaV07DQorICAgICAgICBkd1NpemUgKz0gYWNjLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdTaXplOw0KK30NCitGWF9CT09MIENYRkFfRmlsZVJlYWQyOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9EYXRhLkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBpQ291bnQpIHsNCisgICAgICAgIENQREZfU3RyZWFtQWNjICZhY2MgPSBtX0RhdGFbaW5kZXhdOw0KKyAgICAgICAgRlhfRklMRVNJWkUgZHdTaXplID0gYWNjLkdldFNpemUoKTsNCisgICAgICAgIGlmIChvZmZzZXQgPCBkd1NpemUpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG9mZnNldCAtPSBkd1NpemU7DQorICAgICAgICBpbmRleCsrOw0KKyAgICB9DQorICAgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgew0KKyAgICAgICAgQ1BERl9TdHJlYW1BY2MgJmFjYyA9IG1fRGF0YVtpbmRleF07DQorICAgICAgICBGWF9EV09SRCBkd1NpemUgPSBhY2MuR2V0U2l6ZSgpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdSZWFkID0gRlhfTUlOKHNpemUsIGR3U2l6ZSAtIG9mZnNldCk7DQorICAgICAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBhY2MuR2V0RGF0YSgpICsgb2Zmc2V0LCBkd1JlYWQpOw0KKyAgICAgICAgc2l6ZSAtPSBkd1JlYWQ7DQorICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBidWZmZXIgPSAoRlhfTFBCWVRFKWJ1ZmZlciArIGR3UmVhZDsNCisgICAgICAgIG9mZnNldCA9IDA7DQorICAgICAgICBpbmRleCsrOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorSVhGQV9BcHAqIElYRkFfQXBwOjpDcmVhdGUoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX0ZGQXBwKHBQcm92aWRlcik7DQorfQ0KK0NYRkFfRkZBcHA6OkNYRkFfRkZBcHAoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKQ0KKyAgICA6IG1fcERvY0hhbmRsZXIoTlVMTCkNCisgICAgLCBtX3BGV0xUaGVtZShOVUxMKQ0KKyAgICAsIG1fcFByb3ZpZGVyKHBQcm92aWRlcikNCisgICAgLCBtX3BGb250TWdyKE5VTEwpDQorICAgICwgbV9wQWRhcHRlcldpZGdldE1ncihOVUxMKQ0KKyAgICAsIG1fcEZERUZvbnRNZ3IoTlVMTCkNCisgICAgLCBtX3BNZW51SGFuZGxlcihOVUxMKQ0KKyAgICAsIG1fcEFkYXB0ZXJUaHJlYWRNZ3IoTlVMTCkNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAsIG1fcEZvbnRTb3VyY2UoTlVMTCkNCisjZW5kaWYNCit7DQorICAgIG1fcEZXTEFwcCA9IElGV0xfQXBwOjpDcmVhdGUodGhpcyk7DQorICAgIEZXTF9TZXRBcHAobV9wRldMQXBwKTsNCisgICAgbV9wRldMQXBwLT5Jbml0aWFsaXplKCk7DQorICAgIElYRkFfVGltZVpvbmVQcm92aWRlcjo6Q3JlYXRlKCk7DQorfQ0KK0NYRkFfRkZBcHA6On5DWEZBX0ZGQXBwKCkNCit7DQorICAgIGlmIChtX3BEb2NIYW5kbGVyKSB7DQorICAgICAgICBkZWxldGUgbV9wRG9jSGFuZGxlcjsNCisgICAgfQ0KKyAgICBpZiAobV9wRldMQXBwKSB7DQorICAgICAgICBtX3BGV0xBcHAtPkZpbmFsaXplKCk7DQorICAgICAgICBtX3BGV0xBcHAtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wRldMVGhlbWUpIHsNCisgICAgICAgIG1fcEZXTFRoZW1lLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEFkYXB0ZXJXaWRnZXRNZ3IpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BBZGFwdGVyV2lkZ2V0TWdyOw0KKyAgICB9DQorICAgIGlmIChtX3BBZGFwdGVyVGhyZWFkTWdyKSB7DQorICAgICAgICBkZWxldGUgbV9wQWRhcHRlclRocmVhZE1ncjsNCisgICAgICAgIG1fcEFkYXB0ZXJUaHJlYWRNZ3IgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BNZW51SGFuZGxlcikgew0KKyAgICAgICAgZGVsZXRlIG1fcE1lbnVIYW5kbGVyOw0KKyAgICAgICAgbV9wTWVudUhhbmRsZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIElYRkFfVGltZVpvbmVQcm92aWRlcjo6RGVzdHJveSgpOw0KKyAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9wRm9udE1ncjsNCisgICAgICAgIG1fcEZvbnRNZ3IgPSBOVUxMOw0KKyAgICB9DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgaWYobV9wRm9udFNvdXJjZSAhPSBOVUxMKSB7DQorICAgICAgICBtX3BGb250U291cmNlLT5SZWxlYXNlKCk7DQorICAgIH0NCisjZW5kaWYNCisgICAgaWYgKG1fcEZERUZvbnRNZ3IpIHsNCisgICAgICAgIG1fcEZERUZvbnRNZ3ItPlJlbGVhc2UoKTsNCisgICAgfQ0KK30NCitJWEZBX01lbnVIYW5kbGVyKiBDWEZBX0ZGQXBwOjpHZXRNZW51SGFuZGxlcigpDQorew0KKyAgICBpZiAoIW1fcE1lbnVIYW5kbGVyKSB7DQorICAgICAgICBtX3BNZW51SGFuZGxlciA9IEZYX05FVyBDWEZBX0ZGTWVudUhhbmRsZXI7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE1lbnVIYW5kbGVyOw0KK30NCitJWEZBX0RvY0hhbmRsZXIqIENYRkFfRkZBcHA6OkdldERvY0hhbmRsZXIoKQ0KK3sNCisgICAgaWYgKCFtX3BEb2NIYW5kbGVyKSB7DQorICAgICAgICBtX3BEb2NIYW5kbGVyID0gRlhfTkVXIENYRkFfRkZEb2NIYW5kbGVyOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BEb2NIYW5kbGVyOw0KK30NCitYRkFfSERPQyBDWEZBX0ZGQXBwOjpDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLCBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlRha2VPdmVyRmlsZSkNCit7DQorICAgIENYRkFfRkZEb2MqIHBEb2MgPSBGWF9ORVcgQ1hGQV9GRkRvYyh0aGlzLCBwUHJvdmlkZXIpOw0KKyAgICBpZiAoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlN1Y2Nlc3MgPSBwRG9jLT5PcGVuRG9jKHBTdHJlYW0sIGJUYWtlT3ZlckZpbGUpOw0KKyAgICBpZiAoIWJTdWNjZXNzKSB7DQorICAgICAgICBkZWxldGUgcERvYzsNCisgICAgICAgIHBEb2MgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiAoWEZBX0hET0MpcERvYzsNCit9DQorWEZBX0hET0MgQ1hGQV9GRkFwcDo6Q3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwgQ1BERl9Eb2N1bWVudCAqcFBERkRvYykNCit7DQorICAgIGlmIChwUERGRG9jID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENYRkFfRkZEb2MqIHBEb2MgPSBGWF9ORVcgQ1hGQV9GRkRvYyh0aGlzLCBwUHJvdmlkZXIpOw0KKyAgICBpZiAoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlN1Y2Nlc3MgPSBwRG9jLT5PcGVuRG9jKHBQREZEb2MpOw0KKyAgICBpZiAoIWJTdWNjZXNzKSB7DQorICAgICAgICBkZWxldGUgcERvYzsNCisgICAgICAgIHBEb2MgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiAoWEZBX0hET0MpcERvYzsNCit9DQorDQordm9pZCBDWEZBX0ZGQXBwOjpTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKQ0KK3sNCisgICAgaWYgKCFtX3BGb250TWdyKSB7DQorICAgICAgICBtX3BGb250TWdyID0gRlhfTkVXIENYRkFfRm9udE1ncigpOw0KKyAgICB9DQorICAgIG1fcEZvbnRNZ3ItPlNldERlZkZvbnRNZ3IocEZvbnRNZ3IpOw0KK30NCitDWEZBX0ZvbnRNZ3IqIENYRkFfRkZBcHA6OkdldFhGQUZvbnRNZ3IoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEZvbnRNZ3I7DQorfQ0KK0lGWF9Gb250TWdyKiBDWEZBX0ZGQXBwOjpHZXRGREVGb250TWdyKCkNCit7DQorICAgIGlmICghbV9wRkRFRm9udE1ncikgew0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgICBtX3BGREVGb250TWdyID0gSUZYX0ZvbnRNZ3I6OkNyZWF0ZShGWF9HZXREZWZGb250RW51bWVyYXRvcigpKTsNCisjZWxzZQ0KKyAgICAgICAgbV9wRm9udFNvdXJjZSA9IEZYX0NyZWF0ZURlZmF1bHRGb250U291cmNlRW51bSgpOw0KKyAgICAgICAgbV9wRkRFRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZSk7DQorI2VuZGlmDQorICAgIH0NCisgICAgcmV0dXJuIG1fcEZERUZvbnRNZ3I7DQorfQ0KK0NYRkFfRldMVGhlbWUqIENYRkFfRkZBcHA6OkdldEZXTFRoZW1lKCkNCit7DQorICAgIGlmICghbV9wRldMVGhlbWUpIHsNCisgICAgICAgIG1fcEZXTFRoZW1lID0gRlhfTkVXIENYRkFfRldMVGhlbWUodGhpcyk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEZXTFRoZW1lOw0KK30NCitJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIENYRkFfRkZBcHA6OkdldFdpZGdldE1ncihJRldMX1dpZGdldE1nckRlbGVnYXRlICpwRGVsZWdhdGUpDQorew0KKyAgICBpZiAoIW1fcEFkYXB0ZXJXaWRnZXRNZ3IpIHsNCisgICAgICAgIG1fcEFkYXB0ZXJXaWRnZXRNZ3IgPSBGWF9ORVcgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOw0KKyAgICAgICAgcERlbGVnYXRlLT5PblNldENhcGFiaWxpdHkoRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkIHwgRldMX1dHVE1HUl9EaXNhYmxlRm9ybSk7DQorICAgICAgICBtX3BXaWRnZXRNZ3JEZWxlZ2F0ZSA9IHBEZWxlZ2F0ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wQWRhcHRlcldpZGdldE1ncjsNCit9DQorSUZXTF9BZGFwdGVyVGhyZWFkTWdyKiBDWEZBX0ZGQXBwOjpHZXRUaHJlYWRNZ3IoKQ0KK3sNCisgICAgaWYgKCFtX3BBZGFwdGVyVGhyZWFkTWdyKSB7DQorICAgICAgICBtX3BBZGFwdGVyVGhyZWFkTWdyID0gRlhfTkVXIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BBZGFwdGVyVGhyZWFkTWdyOw0KK30NCitJRldMX0FkYXB0ZXJUaW1lck1nciogQ1hGQV9GRkFwcDo6R2V0VGltZXJNZ3IoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFByb3ZpZGVyLT5HZXRUaW1lck1ncigpOw0KK30NCitJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqCUNYRkFfRkZBcHA6OkdldEN1cnNvck1ncigpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorSUZXTF9BZGFwdGVyTW9uaXRvck1nciogQ1hGQV9GRkFwcDo6R2V0TW9uaXRvck1ncigpDQorew0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorSUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyKiBDWEZBX0ZGQXBwOjpHZXRDbGlwYm9hcmRNZ3IoKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmNWZjZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0FQUF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9BUFBfSU1QX0gNCitjbGFzcyBDWEZBX0ZpbGVSZWFkIDogcHVibGljIElGWF9GaWxlUmVhZCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZpbGVSZWFkKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4gJnN0cmVhbXMpOw0KKyAgICB+Q1hGQV9GaWxlUmVhZCgpOw0KKyAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKTsNCisgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4JCQltX1N0cmVhbXM7DQorICAgIENGWF9EV29yZEFycmF5CQkJCQkJCW1fU3RyZWFtU2l6ZTsNCisgICAgRlhfRFdPUkQJCQkJCQkJCW1fZHdTaXplOw0KK307DQorY2xhc3MgQ1hGQV9GaWxlUmVhZDIgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRmlsZVJlYWQyKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4gJnN0cmVhbXMpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorDQorcHJvdGVjdGVkOg0KKyAgICBDRlhfT2JqZWN0QXJyYXk8Q1BERl9TdHJlYW1BY2M+CQkJbV9EYXRhOw0KK307DQorY2xhc3MgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOw0KK2NsYXNzIENYRkFfRldMVGhlbWU7DQorY2xhc3MgQ1hGQV9GRkRvY0hhbmRsZXI7DQorY2xhc3MgQ1hGQV9GRk1lbnVIYW5kbGVyOw0KK2NsYXNzIENYRkFfRm9udE1ncjsNCitjbGFzcyBDWEZBX0ZGQXBwIDogcHVibGljIElYRkFfQXBwLCBwdWJsaWMgSUZXTF9BZGFwdGVyTmF0aXZlLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZBcHAoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKTsNCisgICAgfkNYRkFfRkZBcHAoKTsNCisgICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBJWEZBX0RvY0hhbmRsZXIqCUdldERvY0hhbmRsZXIoKTsNCisgICAgdmlydHVhbCBYRkFfSERPQwkJCUNyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsIElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKTsNCisgICAgdmlydHVhbCBYRkFfSERPQwkJCUNyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsIENQREZfRG9jdW1lbnQqIHBQREZEb2MpOw0KKyAgICB2aXJ0dWFsCUlYRkFfQXBwUHJvdmlkZXIqCUdldEFwcFByb3ZpZGVyKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFByb3ZpZGVyOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgICAgdmlydHVhbCBJWEZBX01lbnVIYW5kbGVyKglHZXRNZW51SGFuZGxlcigpOw0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlcldpZGdldE1ncioJR2V0V2lkZ2V0TWdyKElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSk7DQorICAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyVGhyZWFkTWdyKglHZXRUaHJlYWRNZ3IoKTsNCisgICAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1ncioJR2V0VGltZXJNZ3IoKTsNCisgICAgdmlydHVhbCBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqCUdldEN1cnNvck1ncigpOw0KKyAgICB2aXJ0dWFsIElGV0xfQWRhcHRlck1vbml0b3JNZ3IqIEdldE1vbml0b3JNZ3IoKTsNCisgICAgdmlydHVhbAlJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IqIEdldENsaXBib2FyZE1ncigpOw0KKyAgICBDWEZBX0ZvbnRNZ3IqCQlHZXRYRkFGb250TWdyKCk7DQorICAgIElGWF9Gb250TWdyKgkJR2V0RkRFRm9udE1ncigpOw0KKyAgICBDWEZBX0ZXTFRoZW1lKgkJR2V0RldMVGhlbWUoKTsNCisgICAgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogR2V0V2lkZ2V0TWdyRGVsZWdhdGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wV2lkZ2V0TWdyRGVsZWdhdGU7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfRkZEb2NIYW5kbGVyKgkJbV9wRG9jSGFuZGxlcjsNCisgICAgSUZXTF9BcHAqCQkJCW1fcEZXTEFwcDsNCisgICAgQ1hGQV9GV0xUaGVtZSoJCQltX3BGV0xUaGVtZTsNCisgICAgSVhGQV9BcHBQcm92aWRlcioJCW1fcFByb3ZpZGVyOw0KKyAgICBDWEZBX0ZvbnRNZ3IqCQkJbV9wRm9udE1ncjsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICBJRlhfRm9udFNvdXJjZUVudW0qCQltX3BGb250U291cmNlOw0KKyNlbmRpZg0KKyAgICBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IqIG1fcEFkYXB0ZXJXaWRnZXRNZ3I7DQorICAgIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqCW1fcFdpZGdldE1nckRlbGVnYXRlOw0KKyAgICBJRlhfRm9udE1ncioJCQltX3BGREVGb250TWdyOw0KKyAgICBDWEZBX0ZGTWVudUhhbmRsZXIqCQltX3BNZW51SGFuZGxlcjsNCisgICAgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3IqIG1fcEFkYXB0ZXJUaHJlYWRNZ3I7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZmUyNTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZnRleHRlZGl0LmgiDQorI2luY2x1ZGUgInhmYV9mZmJhcmNvZGUuaCINCitzdGF0aWMgWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk8gWEZBX0dldEJhcmNvZGVUeXBlQnlOYW1lKEZYX1dTVFIgd3NOYW1lKTsNCitDWEZBX0ZGQmFyY29kZTo6Q1hGQV9GRkJhcmNvZGUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCit7DQorfQ0KK0NYRkFfRkZCYXJjb2RlOjp+Q1hGQV9GRkJhcmNvZGUoKQ0KK3sNCit9DQorRlhfQk9PTCBDWEZBX0ZGQmFyY29kZTo6TG9hZFdpZGdldCgpDQorew0KKyAgICBDRldMX0JhcmNvZGUqIHBGV0xCYXJjb2RlID0gQ0ZXTF9CYXJjb2RlOjpDcmVhdGUoKTsNCisgICAgaWYocEZXTEJhcmNvZGUpCXsNCisgICAgICAgIHBGV0xCYXJjb2RlLT5Jbml0aWFsaXplKCk7DQorICAgIH0NCisgICAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEJhcmNvZGU7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgICAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIHBGV0xCYXJjb2RlLT5TZXRUZXh0KHdzVGV4dCk7DQorICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGQmFyY29kZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBGWF9JTlQzMiBpUm90YXRlICkNCit7DQorICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgICAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQorICAgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgICAgRHJhd0JvcmRlcihwR1MsIGJvcmRlclVJLCBtX3J0VUksICZtdFJvdGF0ZSk7DQorICAgIFJlbmRlckNhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIG10LlNldCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkRyYXdXaWRnZXQocEdTLCAmbXQpOw0KK30NCit2b2lkIENYRkFfRkZCYXJjb2RlOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQorew0KKyAgICBDWEZBX0ZGVGV4dEVkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIENGV0xfQmFyY29kZSogcEJhckNvZGVXaWRnZXQgPSAoQ0ZXTF9CYXJjb2RlKiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVHlwZSA9IEdldERhdGFBY2MoKS0+R2V0QmFyY29kZVR5cGUoKTsNCisgICAgWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk8gcEJhcmNvZGVUeXBlSW5mbyA9IFhGQV9HZXRCYXJjb2RlVHlwZUJ5TmFtZSh3c1R5cGUpOw0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0VHlwZShwQmFyY29kZVR5cGVJbmZvLT5lQkNUeXBlKTsNCisgICAgQ1hGQV9XaWRnZXRBY2MgKnBBY2MgPSBHZXREYXRhQWNjKCk7DQorICAgIEZYX0lOVDMyIGludFZhbDsNCisgICAgRlhfQ0hBUiAgY2hhclZhbDsNCisgICAgRlhfQk9PTCAgYm9vbFZhbDsNCisgICAgRlhfRkxPQVQgZmxvYXRWYWw7DQorICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnRWYWwpKSB7DQorICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0Q2hhckVuY29kaW5nKChCQ19DSEFSX0VOQ09ESU5HKWludFZhbCk7DQorICAgIH0NCisgICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oaW50VmFsKSkgew0KKyAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldENhbENoZWNrc3VtKGludFZhbCk7DQorICAgIH0NCisgICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnRWYWwpKSB7DQorICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0RGF0YUxlbmd0aChpbnRWYWwpOw0KKyAgICB9DQorICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihjaGFyVmFsKSkgew0KKyAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldFN0YXJ0Q2hhcihjaGFyVmFsKTsNCisgICAgfQ0KKyAgICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKGNoYXJWYWwpKSB7DQorICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0RW5kQ2hhcihjaGFyVmFsKTsNCisgICAgfQ0KKyAgICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludFZhbCkpIHsNCisgICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnRWYWwpOw0KKyAgICB9DQorICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZVdpZHRoKGludFZhbCkpIHsNCisgICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRNb2R1bGVXaWR0aChpbnRWYWwpOw0KKyAgICB9DQorICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZUhlaWdodChpbnRWYWwpKSB7DQorICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0TW9kdWxlSGVpZ2h0KGludFZhbCk7DQorICAgIH0NCisgICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfUHJpbnRDaGVja3N1bShib29sVmFsKSkgew0KKyAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldFByaW50Q2hlY2tzdW0oYm9vbFZhbCk7DQorICAgIH0NCisgICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKGludFZhbCkpIHsNCisgICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUZXh0TG9jYXRpb24oKEJDX1RFWFRfTE9DKWludFZhbCk7DQorICAgIH0NCisgICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoYm9vbFZhbCkpIHsNCisgICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUcnVuY2F0ZWQoYm9vbFZhbCk7DQorICAgIH0NCisgICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKGZsb2F0VmFsKSkJew0KKyAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldFdpZGVOYXJyb3dSYXRpbygoRlhfSU5UMzIpZmxvYXRWYWwpOw0KKyAgICB9DQorICAgIGlmIChwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjkNCisgICAgICAgICAgICB8fCBwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfZWFuOA0KKyAgICAgICAgICAgIHx8IHBCYXJjb2RlVHlwZUluZm8tPmVOYW1lID09IFhGQV9CQVJDT0RFVFlQRV9lYW4xMw0KKyAgICAgICAgICAgIHx8IHBCYXJjb2RlVHlwZUluZm8tPmVOYW1lID09IFhGQV9CQVJDT0RFVFlQRV91cGNBKSB7DQorICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0UHJpbnRDaGVja3N1bShUUlVFKTsNCisgICAgfQ0KK30NCitGWF9CT09MCUNYRkFfRkZCYXJjb2RlOjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIENGV0xfQmFyY29kZSogcEJhckNvZGVXaWRnZXQgPSAoQ0ZXTF9CYXJjb2RlKiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIGlmICghcEJhckNvZGVXaWRnZXQgfHwgcEJhckNvZGVXaWRnZXQtPklzUHJvdGVjdGVkVHlwZSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ1hGQV9GRlRleHRFZGl0OjpPbkxCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkJhcmNvZGU6Ok9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgQ0ZXTF9CYXJjb2RlKiBwQmFyQ29kZVdpZGdldCA9IChDRldMX0JhcmNvZGUqKW1fcE5vcm1hbFdpZGdldDsNCisgICAgaWYgKCFwQmFyQ29kZVdpZGdldCB8fCBwQmFyQ29kZVdpZGdldC0+SXNQcm90ZWN0ZWRUeXBlKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ1hGQV9GRlRleHRFZGl0OjpPblJCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQorfQ0KK2V4dGVybiBjb25zdCBYRkFfQkFSQ09ERVRZUEVFTlVNSU5GTyBnX1hGQUJhckNvZGVUeXBlRW51bURhdGFbXSA9IHsNCisgICAgezB4N2ZiNGExOCwgKEZYX0xQQ1dTVFIpTCJlYW4xMyIsIFhGQV9CQVJDT0RFVFlQRV9lYW4xMywgQkNfRUFOMTN9LA0KKyAgICB7MHg4ZDEzYTNkLCAoRlhfTFBDV1NUUilMImNvZGUxMSIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTEsIEJDX1VOS05PV059LA0KKyAgICB7MHg4ZDE0OWE4LCAoRlhfTFBDV1NUUilMImNvZGU0OSIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlNDksIEJDX1VOS05PV059LA0KKyAgICB7MHg4ZDE2MzQ3LCAoRlhfTFBDV1NUUilMImNvZGU5MyIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlOTMsIEJDX1VOS05PV059LA0KKyAgICB7MHg5MWE5MmUyLCAoRlhfTFBDV1NUUilMInVwc01heGljb2RlIiwgWEZBX0JBUkNPREVUWVBFX3Vwc01heGljb2RlLCBCQ19VTktOT1dOfSwNCisgICAgezB4YTdkNDhkYywgKEZYX0xQQ1dTVFIpTCJmaW0iLCBYRkFfQkFSQ09ERVRZUEVfZmltLCBCQ19VTktOT1dOfSwNCisgICAgezB4YjM1OWZlOSwgKEZYX0xQQ1dTVFIpTCJtc2kiLCBYRkFfQkFSQ09ERVRZUEVfbXNpLCBCQ19VTktOT1dOfSwNCisgICAgezB4MTIxZjczOGMsIChGWF9MUENXU1RSKUwiY29kZTJPZjVNYXRyaXgiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVNYXRyaXgsIEJDX1VOS05PV059LA0KKyAgICB7MHgxNTM1ODYxNiwgKEZYX0xQQ1dTVFIpTCJ1Y2MxMjgiLCBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4LCBCQ19VTktOT1dOfSwNCisgICAgezB4MWY0YmZhMDUsIChGWF9MUENXU1RSKUwicmZpZCIsIFhGQV9CQVJDT0RFVFlQRV9yZmlkLCBCQ19VTktOT1dOfSwNCisgICAgezB4MWZkYTcxYmMsIChGWF9MUENXU1RSKUwicnNzMTRTdGFja2VkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDIyMDY1MDg3LCAoRlhfTFBDV1NUUilMImVhbjhhZGQyIiwgWEZBX0JBUkNPREVUWVBFX2VhbjhhZGQyLCBCQ19VTktOT1dOfSwNCisgICAgezB4MjIwNjUwOGEsIChGWF9MUENXU1RSKUwiZWFuOGFkZDUiLCBYRkFfQkFSQ09ERVRZUEVfZWFuOGFkZDUsIEJDX1VOS05PV059LA0KKyAgICB7MHgyMjc4MzY2YywgKEZYX0xQQ1dTVFIpTCJjb2RhYmFyIiwgWEZBX0JBUkNPREVUWVBFX2NvZGFiYXIsIEJDX0NPREFCQVJ9LA0KKyAgICB7MHgyYTAzOWE4ZCwgKEZYX0xQQ1dTVFIpTCJ0ZWxlcGVuIiwgWEZBX0JBUkNPREVUWVBFX3RlbGVwZW4sIEJDX1VOS05PV059LA0KKyAgICB7MHgzMjNlZDMzNywgKEZYX0xQQ1dTVFIpTCJ1cGNBcHdjZCIsIFhGQV9CQVJDT0RFVFlQRV91cGNBcHdjZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDM0N2ExODQ2LCAoRlhfTFBDV1NUUilMInBvc3RVU0lNQiIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNJTUIsIEJDX1VOS05PV059LA0KKyAgICB7MHgzOTFiYjgzNiwgKEZYX0xQQ1dTVFIpTCJjb2RlMTI4IiwgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjgsIEJDX0NPREUxMjh9LA0KKyAgICB7MHgzOThlZGRhZiwgKEZYX0xQQ1dTVFIpTCJkYXRhTWF0cml4IiwgWEZBX0JBUkNPREVUWVBFX2RhdGFNYXRyaXgsIEJDX0RBVEFNQVRSSVh9LA0KKyAgICB7MHgzY2ZmNjBhOCwgKEZYX0xQQ1dTVFIpTCJ1cGNFYWRkMiIsIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkMiwgQkNfVU5LTk9XTn0sDQorICAgIHsweDNjZmY2MGFiLCAoRlhfTFBDV1NUUilMInVwY0VhZGQ1IiwgWEZBX0JBUkNPREVUWVBFX3VwY0VhZGQ1LCBCQ19VTktOT1dOfSwNCisgICAgezB4NDAyY2IxODgsIChGWF9MUENXU1RSKUwiY29kZTJPZjVTdGFuZGFyZCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNVN0YW5kYXJkLCBCQ19VTktOT1dOfSwNCisgICAgezB4NDExNzY0ZjcsIChGWF9MUENXU1RSKUwiYXp0ZWMiLCBYRkFfQkFSQ09ERVRZUEVfYXp0ZWMsIEJDX1VOS05PV059LA0KKyAgICB7MHg0NGQ0ZTg0YywgKEZYX0xQQ1dTVFIpTCJlYW44IiwgWEZBX0JBUkNPREVUWVBFX2VhbjgsIEJDX0VBTjh9LA0KKyAgICB7MHg0ODQ2ODkwMiwgKEZYX0xQQ1dTVFIpTCJ1Y2MxMjhzc2NjIiwgWEZBX0JBUkNPREVUWVBFX3VjYzEyOHNzY2MsIEJDX1VOS05PV059LA0KKyAgICB7MHg0ODgwYWVhNCwgKEZYX0xQQ1dTVFIpTCJ1cGNBYWRkMiIsIFhGQV9CQVJDT0RFVFlQRV91cGNBYWRkMiwgQkNfVU5LTk9XTn0sDQorICAgIHsweDQ4ODBhZWE3LCAoRlhfTFBDV1NUUilMInVwY0FhZGQ1IiwgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQ1LCBCQ19VTktOT1dOfSwNCisgICAgezB4NTRmMTgyNTYsIChGWF9MUENXU1RSKUwiY29kZTJPZjVJbmR1c3RyaWFsIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW5kdXN0cmlhbCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDU4ZTE1ZjI1LCAoRlhfTFBDV1NUUilMInJzczE0TGltaXRlZCIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNExpbWl0ZWQsIEJDX1VOS05PV059LA0KKyAgICB7MHg1YzA4ZDFiOSwgKEZYX0xQQ1dTVFIpTCJwb3N0QVVTUmVwbHlQYWlkIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNSZXBseVBhaWQsIEJDX1VOS05PV059LA0KKyAgICB7MHg1ZmE3MDBiZCwgKEZYX0xQQ1dTVFIpTCJyc3MxNCIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDYzMWE3ZTM1LCAoRlhfTFBDV1NUUilMImxvZ21hcnMiLCBYRkFfQkFSQ09ERVRZUEVfbG9nbWFycywgQkNfVU5LTk9XTn0sDQorICAgIHsweDZhMjM2MjM2LCAoRlhfTFBDV1NUUilMInBkZjQxNyIsIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTcsIEJDX1BERjQxN30sDQorICAgIHsweDZkMDk4ZWNlLCAoRlhfTFBDV1NUUilMInVwY2VhbjIiLCBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuMiwgQkNfVU5LTk9XTn0sDQorICAgIHsweDZkMDk4ZWQxLCAoRlhfTFBDV1NUUilMInVwY2VhbjUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuNSwgQkNfVU5LTk9XTn0sDQorICAgIHsweDc2YjA0ZWVkLCAoRlhfTFBDV1NUUilMImNvZGUzT2Y5ZXh0ZW5kZWQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjlleHRlbmRlZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDdjN2RiODRhLCAoRlhfTFBDV1NUUilMIm1heGljb2RlIiwgWEZBX0JBUkNPREVUWVBFX21heGljb2RlLCBCQ19VTktOT1dOfSwNCisgICAgezB4ODI2NmY3ZjcsIChGWF9MUENXU1RSKUwidWNjMTI4cmFuZG9tIiwgWEZBX0JBUkNPREVUWVBFX3VjYzEyOHJhbmRvbSwgQkNfVU5LTk9XTn0sDQorICAgIHsweDgzZWNhMTQ3LCAoRlhfTFBDV1NUUilMInBvc3RVU0RQQkMiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTRFBCQywgQkNfVU5LTk9XTn0sDQorICAgIHsweDhkZDcxZGUwLCAoRlhfTFBDV1NUUilMInBvc3RBVVNTdGFuZGFyZCIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTU3RhbmRhcmQsIEJDX1VOS05PV059LA0KKyAgICB7MHg5OGFkYWQ4NSwgKEZYX0xQQ1dTVFIpTCJwbGVzc2V5IiwgWEZBX0JBUkNPREVUWVBFX3BsZXNzZXksIEJDX1VOS05PV059LA0KKyAgICB7MHg5Zjg0Y2NlNiwgKEZYX0xQQ1dTVFIpTCJlYW4xM3B3Y2QiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTNwd2NkLCBCQ19VTktOT1dOfSwNCisgICAgezB4YjUxNGZiZTksIChGWF9MUENXU1RSKUwidXBjQSIsIFhGQV9CQVJDT0RFVFlQRV91cGNBLCBCQ19VUENBfSwNCisgICAgezB4YjUxNGZiZWQsIChGWF9MUENXU1RSKUwidXBjRSIsIFhGQV9CQVJDT0RFVFlQRV91cGNFLCBCQ19VTktOT1dOfSwNCisgICAgezB4YjVjNmE4NTMsIChGWF9MUENXU1RSKUwiZWFuMTNhZGQyIiwgWEZBX0JBUkNPREVUWVBFX2VhbjEzYWRkMiwgQkNfVU5LTk9XTn0sDQorICAgIHsweGI1YzZhODU2LCAoRlhfTFBDV1NUUilMImVhbjEzYWRkNSIsIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDUsIEJDX1VOS05PV059LA0KKyAgICB7MHhiODFmYzUxMiwgKEZYX0xQQ1dTVFIpTCJwb3N0VUtSTTRTQ0MiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVLUk00U0NDLCBCQ19VTktOT1dOfSwNCisgICAgezB4YmFkMzRiMjIsIChGWF9MUENXU1RSKUwiY29kZTEyOFNTQ0MiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOFNTQ0MsIEJDX1VOS05PV059LA0KKyAgICB7MHhiZmJlMGNmNiwgKEZYX0xQQ1dTVFIpTCJwb3N0VVM1WmlwIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RVUzVaaXAsIEJDX1VOS05PV059LA0KKyAgICB7MHhjNTY2MThlOCwgKEZYX0xQQ1dTVFIpTCJwZGY0MTdtYWNybyIsIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTdtYWNybywgQkNfVU5LTk9XTn0sDQorICAgIHsweGNhNzMwZjhhLCAoRlhfTFBDV1NUUilMImNvZGUyT2Y1SW50ZXJsZWF2ZWQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVJbnRlcmxlYXZlZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweGQwMDk3YWM2LCAoRlhfTFBDV1NUUilMInJzczE0RXhwYW5kZWQiLCBYRkFfQkFSQ09ERVRZUEVfcnNzMTRFeHBhbmRlZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweGQyNWEwMjQwLCAoRlhfTFBDV1NUUilMInBvc3RBVVNDdXN0MiIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDIsIEJDX1VOS05PV059LA0KKyAgICB7MHhkMjVhMDI0MSwgKEZYX0xQQ1dTVFIpTCJwb3N0QVVTQ3VzdDMiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU0N1c3QzLCBCQ19VTktOT1dOfSwNCisgICAgezB4ZDUzZWQzZTcsIChGWF9MUENXU1RSKUwicnNzMTRUcnVuY2F0ZWQiLCBYRkFfQkFSQ09ERVRZUEVfcnNzMTRUcnVuY2F0ZWQsIEJDX1VOS05PV059LA0KKyAgICB7MHhlNzJiY2Q1NywgKEZYX0xQQ1dTVFIpTCJjb2RlMTI4QSIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QSwgQkNfVU5LTk9XTn0sDQorICAgIHsweGU3MmJjZDU4LCAoRlhfTFBDV1NUUilMImNvZGUxMjhCIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhCLCBCQ19DT0RFMTI4X0J9LA0KKyAgICB7MHhlNzJiY2Q1OSwgKEZYX0xQQ1dTVFIpTCJjb2RlMTI4QyIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QywgQkNfQ09ERTEyOF9DfSwNCisgICAgezB4ZWU4M2M1MGYsIChGWF9MUENXU1RSKUwicnNzMTRTdGFja2VkT21uaSIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWRPbW5pLCBCQ19VTktOT1dOfSwNCisgICAgezB4ZjJhMThmN2UsIChGWF9MUENXU1RSKUwiUVJDb2RlIiwgWEZBX0JBUkNPREVUWVBFX1FSQ29kZSwgQkNfUVJfQ09ERX0sDQorICAgIHsweGZhZWFmMzdmLCAoRlhfTFBDV1NUUilMInBvc3RVU1N0YW5kYXJkIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU1N0YW5kYXJkLCBCQ19VTktOT1dOfSwNCisgICAgezB4ZmI0ODE1NWMsIChGWF9MUENXU1RSKUwiY29kZTNPZjkiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjksIEJDX0NPREUzOX0sDQorfTsNCitleHRlcm4gY29uc3QgRlhfSU5UMzIgZ19pWEZBQmFyY29kZVR5cGVDb3VudCA9IHNpemVvZihnX1hGQUJhckNvZGVUeXBlRW51bURhdGEpIC8gc2l6ZW9mKFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPKTsNCitzdGF0aWMgWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk8gWEZBX0dldEJhcmNvZGVUeXBlQnlOYW1lKEZYX1dTVFIgd3NOYW1lKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfVUlOVDMyIHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCBpTGVuZ3RoLCBUUlVFKTsNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQUJhcmNvZGVUeXBlQ291bnQgLSAxOw0KKyAgICBkbyB7DQorICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIHBJbmZvID0gZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhICsgaU1pZDsNCisgICAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICByZXR1cm4gcEluZm87DQorICAgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjQyMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfQkFSQ09ERV9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9CQVJDT0RFX0lNUF9IDQorY2xhc3MgQ1hGQV9GRlRleHRFZGl0Ow0KK2NsYXNzIENYRkFfRkZCYXJjb2RlIDogcHVibGljIENYRkFfRkZUZXh0RWRpdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZCYXJjb2RlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGQmFyY29kZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBGWF9JTlQzMiBpUm90YXRlID0gMCk7DQorICAgIHZpcnR1YWwgdm9pZAlVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJT25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KK307DQorZW51bSBYRkFfQkFSQ09ERVRZUEVFTlVNIHsNCisgICAgWEZBX0JBUkNPREVUWVBFX2F6dGVjLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfY29kYWJhciwNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMSwNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjgsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QSwNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhCLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEMsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4U1NDQywNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW5kdXN0cmlhbCwNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW50ZXJsZWF2ZWQsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNU1hdHJpeCwNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1U3RhbmRhcmQsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOSwNCisgICAgWEZBX0JBUkNPREVUWVBFX2NvZGUzT2Y5ZXh0ZW5kZWQsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlNDksDQorICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlOTMsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9kYXRhTWF0cml4LA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfZWFuMTMsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDIsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDUsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9lYW4xM3B3Y2QsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9lYW44LA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfZWFuOGFkZDIsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9lYW44YWRkNSwNCisgICAgWEZBX0JBUkNPREVUWVBFX2ZpbSwNCisgICAgWEZBX0JBUkNPREVUWVBFX2xvZ21hcnMsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9tYXhpY29kZSwNCisgICAgWEZBX0JBUkNPREVUWVBFX21zaSwNCisgICAgWEZBX0JBUkNPREVUWVBFX3BkZjQxNywNCisgICAgWEZBX0JBUkNPREVUWVBFX3BkZjQxN21hY3JvLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfcGxlc3NleSwNCisgICAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNDdXN0MiwNCisgICAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNDdXN0MywNCisgICAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNSZXBseVBhaWQsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTU3RhbmRhcmQsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VUtSTTRTQ0MsDQorICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVM1WmlwLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTRFBCQywNCisgICAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU0lNQiwNCisgICAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU1N0YW5kYXJkLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfUVJDb2RlLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfcmZpZCwNCisgICAgWEZBX0JBUkNPREVUWVBFX3JzczE0LA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfcnNzMTRFeHBhbmRlZCwNCisgICAgWEZBX0JBUkNPREVUWVBFX3JzczE0TGltaXRlZCwNCisgICAgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZCwNCisgICAgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZE9tbmksDQorICAgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFRydW5jYXRlZCwNCisgICAgWEZBX0JBUkNPREVUWVBFX3RlbGVwZW4sDQorICAgIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjgsDQorICAgIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhyYW5kb20sDQorICAgIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhzc2NjLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfdXBjQSwNCisgICAgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQyLA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfdXBjQWFkZDUsDQorICAgIFhGQV9CQVJDT0RFVFlQRV91cGNBcHdjZCwNCisgICAgWEZBX0JBUkNPREVUWVBFX3VwY0UsDQorICAgIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkMiwNCisgICAgWEZBX0JBUkNPREVUWVBFX3VwY0VhZGQ1LA0KKyAgICBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuMiwNCisgICAgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjUsDQorICAgIFhGQV9CQVJDT0RFVFlQRV91cHNNYXhpY29kZQ0KK307DQorc3RydWN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIHsNCisgICAgRlhfVUlOVDMyCQkJCQl1SGFzaDsNCisgICAgRlhfTFBDV1NUUgkJCQkJcE5hbWU7DQorICAgIFhGQV9CQVJDT0RFVFlQRUVOVU0JCQllTmFtZTsNCisgICAgQkNfVFlQRQkJCQkJCWVCQ1R5cGU7DQorfTsNCit0eXBlZGVmIFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIGNvbnN0ICogWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk87DQorZXh0ZXJuIGNvbnN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YVtdOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTE1ZDYxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uY3BwCkBAIC0wLDAgKzEsMzQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmY2hlY2tidXR0b24uaCINCisjaW5jbHVkZSAieGZhX2ZmZXhjbGdyb3VwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvY3ZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZDaGVja0J1dHRvbjo6Q1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpDQorICAgICwgbV9wT2xkRGVsZWdhdGUoTlVMTCkNCit7DQorICAgIG1fcnRDaGVja0JveC5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NYRkFfRkZDaGVja0J1dHRvbjo6fkNYRkFfRkZDaGVja0J1dHRvbigpDQorew0KK30NCitGWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6TG9hZFdpZGdldCgpDQorew0KKyAgICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSBDRldMX0NoZWNrQm94OjpDcmVhdGUoKTsNCisgICAgcENoZWNrQm94LT5Jbml0aWFsaXplKCk7DQorICAgIG1fcE5vcm1hbFdpZGdldCA9IHBDaGVja0JveDsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICAgIGlmIChtX3BEYXRhQWNjLT5Jc1JhZGlvQnV0dG9uKCkpIHsNCisgICAgICAgIHBDaGVja0JveC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbiwgMHhGRkZGRkZGRik7DQorICAgIH0NCisgICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwQ2hlY2tCb3g7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgdGhpcywgTlVMTCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgICBYRkFfQ0hFQ0tTVEFURSBlU3RhdGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCk7DQorICAgIFNldEZXTENoZWNrU3RhdGUoZVN0YXRlKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgICAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KK3sNCisgICAgQ0ZXTF9DaGVja0JveCogcENoZWNrQm94ID0gKENGV0xfQ2hlY2tCb3gqKW1fcE5vcm1hbFdpZGdldDsNCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmU2l6ZSA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgICBwQ2hlY2tCb3gtPlNldEJveFNpemUoZlNpemUpOw0KKyAgICBGWF9EV09SRCBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzOw0KKyAgICBGWF9JTlQzMiBpQ2hlY2tNYXJrID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25NYXJrKCk7DQorICAgIHN3aXRjaChpQ2hlY2tNYXJrKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NoZWNrOg0KKyAgICAgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NpcmNsZToNCisgICAgICAgICAgICBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNpcmNsZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3M6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RpYW1vbmQ6DQorICAgICAgICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVEaWFtb25kOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmU6DQorICAgICAgICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXI6DQorICAgICAgICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTdGFyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU2hhcGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCk7DQorICAgICAgICAgICAgICAgIGlmIChpU2hhcGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpIHsNCisgICAgICAgICAgICAgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChtX3BEYXRhQWNjLT5Jc0FsbG93TmV1dHJhbCgpKSB7DQorICAgICAgICBkd1N0eWxlRXggfD0gRldMX1NUWUxFRVhUX0NLQl8zU3RhdGU7DQorICAgIH0NCisgICAgcENoZWNrQm94LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlRXgsIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzayB8IEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OkxheW91dFdpZGdldCgpDQorew0KKyAgICBDWEZBX0ZGV2lkZ2V0OjpMYXlvdXRXaWRnZXQoKTsNCisgICAgRlhfRkxPQVQgZkNoZWNrU2l6ZSA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgICAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0V2lkZ2V0LCBtZ1dpZGdldCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNhcFBsYWNlbWVudCA9IC0xOw0KKyAgICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IDA7DQorICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KKyAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkpIHsNCisgICAgICAgIG1fcnRDYXB0aW9uLlNldChydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQpOw0KKyAgICAgICAgaUNhcFBsYWNlbWVudCA9IGNhcHRpb24uR2V0UGxhY2VtZW50VHlwZSgpOw0KKyAgICAgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsNCisgICAgICAgIGlmIChmQ2FwUmVzZXJ2ZSA8PSAwKSB7DQorICAgICAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8IGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgICAgICAgICAgIGZDYXBSZXNlcnZlID0gcnRXaWRnZXQuaGVpZ2h0IC0gZkNoZWNrU2l6ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IHJ0V2lkZ2V0LndpZHRoIC0gZkNoZWNrU2l6ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7DQorICAgIEZYX0lOVDMyIGlWZXJ0QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A7DQorICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KKyAgICAgICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICAgICAgICBpVmVydEFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgIH0NCisgICAgbV9ydFVJID0gcnRXaWRnZXQ7DQorICAgIENYRkFfTWFyZ2luIG1nQ2FwID0gY2FwdGlvbi5HZXRNYXJnaW4oKTsNCisgICAgc3dpdGNoKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDogew0KKyAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQobWdDYXApOw0KKyAgICAgICAgICAgICAgICBtX3J0VUkud2lkdGggLT0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgICAgIG1fcnRVSS5sZWZ0ICs9IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOiB7DQorICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICAgICAgICAgICAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgICAgIG1fcnRVSS50b3AgKz0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDogew0KKyAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5sZWZ0ID0gbV9ydENhcHRpb24ucmlnaHQoKSAtIGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQobWdDYXApOw0KKyAgICAgICAgICAgICAgICBtX3J0VUkud2lkdGggLT0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsNCisgICAgICAgICAgICAgICAgbV9ydENhcHRpb24udG9wID0gbV9ydENhcHRpb24uYm90dG9tKCkgLSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ID0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgICAgICAgICAgICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZToNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcikgew0KKyAgICAgICAgbV9ydFVJLmxlZnQgKz0gKG1fcnRVSS53aWR0aCAtIGZDaGVja1NpemUpIC8gMjsNCisgICAgfSBlbHNlIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICBtX3J0VUkubGVmdCA9IG1fcnRVSS5yaWdodCgpIC0gZkNoZWNrU2l6ZTsNCisgICAgfQ0KKyAgICBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUpIHsNCisgICAgICAgIG1fcnRVSS50b3AgKz0gKG1fcnRVSS5oZWlnaHQgLSBmQ2hlY2tTaXplKSAvIDI7DQorICAgIH0gZWxzZSBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsNCisgICAgICAgIG1fcnRVSS50b3AgPSBtX3J0VUkuYm90dG9tKCkgLSBmQ2hlY2tTaXplOw0KKyAgICB9DQorICAgIG1fcnRVSS53aWR0aCA9IGZDaGVja1NpemU7DQorICAgIG1fcnRVSS5oZWlnaHQgPSBmQ2hlY2tTaXplOw0KKyAgICBBZGRVSU1hcmdpbihpQ2FwUGxhY2VtZW50KTsNCisgICAgbV9ydENoZWNrQm94ID0gbV9ydFVJOw0KKyAgICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQorICAgIGlmIChib3JkZXJVSSkgew0KKyAgICAgICAgQ1hGQV9NYXJnaW4gbWFyZ2luID0gYm9yZGVyVUkuR2V0TWFyZ2luKCk7DQorICAgICAgICBpZiAobWFyZ2luLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0VUksIG1hcmdpbik7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9ydFVJLk5vcm1hbGl6ZSgpOw0KKyAgICBMYXlvdXRDYXB0aW9uKCk7DQorICAgIFNldEZXTFJlY3QoKTsNCisgICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OkNhcExlZnRSaWdodFBsYWNlbWVudChDWEZBX01hcmdpbiBtZ0NhcCkNCit7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgICAgaWYgKG1fcnRDYXB0aW9uLmhlaWdodCA8IDApIHsNCisgICAgICAgIG1fcnRDYXB0aW9uLnRvcCArPSBtX3J0Q2FwdGlvbi5oZWlnaHQ7DQorICAgIH0NCisgICAgaWYgKG1fcnRDYXB0aW9uLndpZHRoIDwgMCkgew0KKyAgICAgICAgbV9ydENhcHRpb24ubGVmdCArPSBtX3J0Q2FwdGlvbi53aWR0aDsNCisgICAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gLW1fcnRDYXB0aW9uLndpZHRoOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpBZGRVSU1hcmdpbihGWF9JTlQzMiBpQ2FwUGxhY2VtZW50KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICAgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgICBtX3J0VUkudG9wIC09IHJ0VUlNYXJnaW4udG9wIC8gMiAtIHJ0VUlNYXJnaW4uaGVpZ2h0IC8gMjsNCisgICAgRlhfRkxPQVQgZkxlZnRBZGRSaWdodCA9IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQorICAgIEZYX0ZMT0FUIGZUb3BBZGRCb3R0b20gPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgICBpZiAobV9ydFVJLndpZHRoIDwgZkxlZnRBZGRSaWdodCkgew0KKyAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQgfHwgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQorICAgICAgICAgICAgbV9ydFVJLmxlZnQgLT0gZkxlZnRBZGRSaWdodCAtIG1fcnRVSS53aWR0aDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9ydFVJLmxlZnQgLT0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcnRVSS53aWR0aCArPSAyICogKGZMZWZ0QWRkUmlnaHQgLSBtX3J0VUkud2lkdGgpOw0KKyAgICB9DQorICAgIGlmIChtX3J0VUkuaGVpZ2h0IDwgZlRvcEFkZEJvdHRvbSkgew0KKyAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCisgICAgICAgICAgICBtX3J0VUkubGVmdCAtPSBmVG9wQWRkQm90dG9tIC0gbV9ydFVJLmhlaWdodDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcnRVSS50b3AgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7DQorICAgICAgICBtX3J0VUkuaGVpZ2h0ICs9IDIgKiAoZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlLCBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQgPyBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kIDogMCk7DQorICAgIFJlbmRlckNhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgICBEcmF3SGlnaGxpZ2h0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cywgbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaGFwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kKTsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIG1fcnRDaGVja0JveC5sZWZ0LCBtX3J0Q2hlY2tCb3gudG9wKTsNCisgICAgbXQuQ29uY2F0KG10Um90YXRlKTsNCisgICAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBwR1MsICZtdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBTZXRCdXR0b25Eb3duKEZBTFNFKTsNCisgICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQorICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICAgIG1zLm1fZnggPSBmeDsNCisgICAgbXMubV9meSA9IGZ5Ow0KKyAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK1hGQV9DSEVDS1NUQVRFIENYRkFfRkZDaGVja0J1dHRvbjo6RldMU3RhdGUyWEZBU3RhdGUoKQ0KK3sNCisgICAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBYRkFfQ0hFQ0tTVEFURV9PZmY7DQorICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOw0KKyAgICBpZiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9DS0JfQ2hlY2tlZCkgew0KKyAgICAgICAgZUNoZWNrU3RhdGUgPSBYRkFfQ0hFQ0tTVEFURV9PbjsNCisgICAgfSBlbHNlIGlmIChkd1N0YXRlICYgRldMX1NUQVRFX0NLQl9OZXV0cmFsKSB7DQorICAgICAgICBlQ2hlY2tTdGF0ZSA9IFhGQV9DSEVDS1NUQVRFX05ldXRyYWw7DQorICAgIH0NCisgICAgcmV0dXJuIGVDaGVja1N0YXRlOw0KK30NCitGWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6Q29tbWl0RGF0YSgpDQorew0KKyAgICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IEZXTFN0YXRlMlhGQVN0YXRlKCk7DQorICAgIG1fcERhdGFBY2MtPlNldENoZWNrU3RhdGUoZUNoZWNrU3RhdGUsIFRSVUUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OklzRGF0YUNoYW5nZWQoKQ0KK3sNCisgICAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBGV0xTdGF0ZTJYRkFTdGF0ZSgpOw0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+R2V0Q2hlY2tTdGF0ZSgpICE9IGVDaGVja1N0YXRlOw0KK30NCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6U2V0RldMQ2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSkNCit7DQorICAgIGlmIChlQ2hlY2tTdGF0ZSA9PSBYRkFfQ0hFQ0tTVEFURV9OZXV0cmFsKSB7DQorICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0tCX05ldXRyYWwsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRTdGF0ZXMoRldMX1NUQVRFX0NLQl9DaGVja2VkLCBlQ2hlY2tTdGF0ZSA9PSBYRkFfQ0hFQ0tTVEFURV9Pbik7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OlVwZGF0ZUZXTERhdGEoKQ0KK3sNCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfQ0hFQ0tTVEFURSBlU3RhdGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCk7DQorICAgIFNldEZXTENoZWNrU3RhdGUoZVN0YXRlKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZDaGVja0J1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCit7DQorICAgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZHdFdmVudElEKSB7DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0NLQl9DaGVja1N0YXRlQ2hhbmdlZDogew0KKyAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7DQorICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzTmV3VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEZGRXhjbEdyb3VwID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7DQorICAgICAgICAgICAgICAgIGlmIChQcm9jZXNzQ29tbWl0dGVkRGF0YSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcEZGRXhjbEdyb3VwOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBGRkV4Y2xHcm91cCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHBGRkV4Y2xHcm91cCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBGRkV4Y2xHcm91cCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEZGRXhjbEdyb3VwLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwgJmVQYXJhbSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBTZXRGV0xDaGVja1N0YXRlKG1fcERhdGFBY2MtPkdldENoZWNrU3RhdGUoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBGRkV4Y2xHcm91cCkgew0KKyAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBGRkV4Y2xHcm91cDsNCisgICAgICAgICAgICAgICAgICAgIHBGRkV4Y2xHcm91cC0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzMmE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfQ0hFQ0tCVVRUT05fSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfQ0hFQ0tCVVRUT05fSU1QX0gNCitjbGFzcyBDWEZBX0ZGRXhjbEdyb3VwOw0KK2NsYXNzIENYRkFfRkZDaGVja0J1dHRvbiA6IHB1YmxpYyBDWEZBX0ZGRmllbGQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGQ2hlY2tCdXR0b24oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICAgIHZpcnR1YWwgfkNYRkFfRkZDaGVja0J1dHRvbigpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgRlhfSU5UMzIgaVJvdGF0ZSA9IDApOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRXaWRnZXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlMYXlvdXRXaWRnZXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlVcGRhdGVGV0xEYXRhKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2b2lkCQkJCVNldEZXTENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisNCitwcm90ZWN0ZWQ6DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29tbWl0RGF0YSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzRGF0YUNoYW5nZWQoKTsNCisgICAgdm9pZAkJCQlDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9NYXJnaW4gbWdDYXApOw0KKyAgICB2b2lkCQkJCUFkZFVJTWFyZ2luKEZYX0lOVDMyIGlDYXBQbGFjZW1lbnQpOw0KKyAgICBYRkFfQ0hFQ0tTVEFURQkJRldMU3RhdGUyWEZBU3RhdGUoKTsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSoJbV9wT2xkRGVsZWdhdGU7DQorICAgIENGWF9SZWN0RgkJCW1fcnRDaGVja0JveDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmYWVkYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuY3BwCkBAIC0wLDAgKzEsNTcxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZndsYWRhcHRlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaG9pY2VsaXN0LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZMaXN0Qm94OjpDWEZBX0ZGTGlzdEJveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KKyAgICAsIG1fcE9sZERlbGVnYXRlKE5VTEwpDQorew0KK30NCitDWEZBX0ZGTGlzdEJveDo6fkNYRkFfRkZMaXN0Qm94KCkNCit7DQorICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgICAgICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgICAgICAgIHBOb3RlRHJpdmVyLT5VbnJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6TG9hZFdpZGdldCgpDQorew0KKyAgICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gQ0ZXTF9MaXN0Qm94OjpDcmVhdGUoKTsNCisgICAgcExpc3RCb3gtPkluaXRpYWxpemUoKTsNCisgICAgcExpc3RCb3gtPk1vZGlmeVN0eWxlcyhGV0xfV0dUU1RZTEVfVlNjcm9sbCB8IEZXTF9XR1RTVFlMRV9Ob0JhY2tncm91bmQsIDB4RkZGRkZGRkYpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBMaXN0Qm94Ow0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQorICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgICAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQorICAgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NMYWJlbEFycmF5Ow0KKyAgICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbXMod3NMYWJlbEFycmF5LCBGQUxTRSk7DQorICAgIEZYX0lOVDMyIGlJdGVtcyA9IHdzTGFiZWxBcnJheS5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpSXRlbXM7IGkrKykgew0KKyAgICAgICAgcExpc3RCb3gtPkFkZFN0cmluZyh3c0xhYmVsQXJyYXlbaV0pOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzOw0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0Q2hvaWNlTGlzdE9wZW4oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb247DQorICAgIH0NCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQorICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgICAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgICBGWF9JTlQzMiBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVNlbENvdW50OyBqKyspIHsNCisgICAgICAgIEZXTF9ITElTVElURU0gaXRlbSA9IHBMaXN0Qm94LT5HZXRJdGVtKGlTZWxBcnJheVtqXSk7DQorICAgICAgICBwTGlzdEJveC0+U2V0U2VsSXRlbShpdGVtLCBUUlVFKTsNCisgICAgfQ0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkxpc3RCb3g6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cykNCit7DQorICAgIEZYX0JPT0wgZmxhZyA9IFByb2Nlc3NDb21taXR0ZWREYXRhKCk7DQorICAgIGlmICghZmxhZykgew0KKyAgICAgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgICB9DQorICAgIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkxpc3RCb3g6OkNvbW1pdERhdGEoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fcE5vcm1hbFdpZGdldCAhPSBOVUxMKTsNCisgICAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldDsNCisgICAgRlhfSU5UMzIgaVNlbHMgPSBwTGlzdEJveC0+Q291bnRTZWxJdGVtcygpOw0KKyAgICBDRlhfSW50MzJBcnJheSBpU2VsQXJyYXk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2VsczsgaSsrKSB7DQorICAgICAgICBpU2VsQXJyYXkuQWRkKHBMaXN0Qm94LT5HZXRTZWxJbmRleChpKSk7DQorICAgIH0NCisgICAgbV9wRGF0YUFjYy0+U2V0U2VsZWN0ZEl0ZW1zKGlTZWxBcnJheSwgVFJVRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZMaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKCkNCit7DQorICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgICAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgICBGWF9JTlQzMiBpT2xkU2VscyA9IGlTZWxBcnJheS5HZXRTaXplKCk7DQorICAgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIEZYX0lOVDMyIGlTZWxzID0gcExpc3RCb3gtPkNvdW50U2VsSXRlbXMoKTsNCisgICAgaWYgKGlPbGRTZWxzID09IGlTZWxzKSB7DQorICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSAwOw0KKyAgICAgICAgZm9yICg7IGlJbmRleCA8IGlTZWxzOyBpSW5kZXgrKykgew0KKyAgICAgICAgICAgIEZXTF9ITElTVElURU0gaGxpc3RJdGVtID0gcExpc3RCb3gtPkdldEl0ZW0oaVNlbEFycmF5W2lJbmRleF0pOw0KKyAgICAgICAgICAgIGlmKCEocExpc3RCb3gtPkdldEl0ZW1TdGF0ZXMoaGxpc3RJdGVtKSAmJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlJbmRleCA9PSBpU2Vscykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfRFdPUkQgQ1hGQV9GRkxpc3RCb3g6OkdldEFsaWdubWVudCgpDQorew0KKyAgICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCisgICAgICAgIEZYX0lOVDMyIGlIb3J6ID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCisgICAgICAgIHN3aXRjaChpSG9yeikgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXg6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ247DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6VXBkYXRlRldMRGF0YSgpDQorew0KKyAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RldMX0hMSVNUSVRFTT4gc2VsSXRlbUFycmF5Ow0KKyAgICBDRlhfSW50MzJBcnJheSBpU2VsQXJyYXk7DQorICAgIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgICAgRlhfSU5UMzIgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlTZWxDb3VudDsgaisrKSB7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGxwSXRlbVNlbCA9IHBMaXN0Qm94LT5HZXRTZWxJdGVtKGlTZWxBcnJheVtqXSk7DQorICAgICAgICBzZWxJdGVtQXJyYXkuQWRkKGxwSXRlbVNlbCk7DQorICAgIH0NCisgICAgcExpc3RCb3gtPlNldFNlbEl0ZW0ocExpc3RCb3gtPkdldFNlbEl0ZW0oLTEpLCBGQUxTRSk7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGlTZWxDb3VudDsgaSsrKSB7DQorICAgICAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0U2VsSXRlbShzZWxJdGVtQXJyYXlbaV0sIFRSVUUpOw0KKyAgICB9DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZhcnJTZWxzKQ0KK3sNCisgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2hhbmdlOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUoZVBhcmFtLm1fd3NQcmV2VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgICBGWF9JTlQzMiBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7DQorICAgIGlmIChpU2VscyA+IDApIHsNCisgICAgICAgIHBMaXN0Qm94LT5HZXRJdGVtVGV4dChwTGlzdEJveC0+R2V0U2VsSXRlbSgwKSwgZVBhcmFtLm1fd3NOZXdUZXh0KTsNCisgICAgfQ0KKyAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCit9DQordm9pZCBDWEZBX0ZGTGlzdEJveDo6U2V0SXRlbVN0YXRlKEZYX0lOVDMyIG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpDQorew0KKyAgICBGV0xfSExJU1RJVEVNIGl0ZW0gPSAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0U2VsSXRlbShuSW5kZXgpOw0KKyAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0U2VsSXRlbShpdGVtLCBiU2VsZWN0ZWQpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpJbnNlcnRJdGVtKEZYX1dTVFIgd3NMYWJlbCwgRlhfSU5UMzIgbkluZGV4ICkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcCh3c0xhYmVsKTsNCisgICAgKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCktPkFkZFN0cmluZyh3c1RlbXApOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpEZWxldGVJdGVtKEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChuSW5kZXggPCAwKSB7DQorICAgICAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlQWxsKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlU3RyaW5nKCgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRJdGVtKG5JbmRleCkpOw0KKyAgICB9DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZMaXN0Qm94OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENYRkFfRkZMaXN0Qm94OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBzd2l0Y2ggKGR3RXZlbnRJRCkgew0KKyAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9MVEJfU2VsQ2hhbmdlZDogew0KKyAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSBhcnJTZWxzOw0KKyAgICAgICAgICAgICAgICBPblNlbGVjdENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgYXJyU2Vscyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK30NCitGV0xfRVJSIENYRkFfRkZMaXN0Qm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KK3sNCisgICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQorQ1hGQV9GRkNvbWJvQm94OjpDWEZBX0ZGQ29tYm9Cb3goQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCisgICAgLCBtX3BPbGREZWxlZ2F0ZShOVUxMKQ0KK3sNCit9DQorQ1hGQV9GRkNvbWJvQm94Ojp+Q1hGQV9GRkNvbWJvQm94KCkNCit7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMpDQorew0KKyAgICBpZiAoYkRyYXdGb2N1cykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgICByZXR1cm4gQ1hGQV9GRldpZGdldDo6R2V0QkJveChydEJveCwgZHdTdGF0dXMpOw0KKyNlbmRpZg0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQorICAgICAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfRkZDb21ib0JveDo6UHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQorICAgIGlmIChydFdpZGdldC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpMb2FkV2lkZ2V0KCkNCit7DQorICAgIENGV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IENGV0xfQ29tYm9Cb3g6OkNyZWF0ZSgpOw0KKyAgICBwQ29tYm9Cb3gtPkluaXRpYWxpemUoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwQ29tYm9Cb3g7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgICAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0xhYmVsQXJyYXk7DQorICAgIG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RJdGVtcyh3c0xhYmVsQXJyYXksIEZBTFNFKTsNCisgICAgRlhfSU5UMzIgaUl0ZW1zID0gd3NMYWJlbEFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlJdGVtczsgaSsrKSB7DQorICAgICAgICBwQ29tYm9Cb3gtPkFkZFN0cmluZyh3c0xhYmVsQXJyYXlbaV0pOw0KKyAgICB9DQorICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgICAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgICBGWF9JTlQzMiBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaVNlbENvdW50ID4gMCkgew0KKyAgICAgICAgcENvbWJvQm94LT5TZXRDdXJTZWwoaVNlbEFycmF5WzBdKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgcENvbWJvQm94LT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgICB9DQorICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkNCit7DQorICAgIENGV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIGlmICghcENvbWJvQm94KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gMDsNCisgICAgRlhfRFdPUkQgZHdFZGl0U3R5bGVzID0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSB8IEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7DQorICAgIGlmIChtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpKSB7DQorICAgICAgICBkd0VkaXRTdHlsZXMgJj0gfkZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCisgICAgfQ0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5Ow0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfUmVhZE9ubHk7DQorICAgIH0NCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgICAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsNCisgICAgfQ0KKyAgICBwQ29tYm9Cb3gtPkVkaXRNb2RpZnlTdHlsZXNFeChkd0VkaXRTdHlsZXMsIDB4RkZGRkZGRkYpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6T25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKCFDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvblVwKGR3RmxhZ3MsIGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfUG9pbnRGIHB0Ow0KKyAgICBwdC5TZXQoZngsIGZ5KTsNCisgICAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPlBvcHVwTWVudSgoWEZBX0hXSURHRVQpdGhpcywgcHQsIE5VTEwpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpDQorew0KKyAgICBGWF9CT09MIGZsYWcgPSBQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOw0KKyAgICBpZiAoIWZsYWcpIHsNCisgICAgICAgIFVwZGF0ZUZXTERhdGEoKTsNCisgICAgfQ0KKyAgICBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9wZW5Ecm9wRG93bkxpc3QoKQ0KK3sNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5PcGVuRHJvcERvd25MaXN0KFRSVUUpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q29tbWl0RGF0YSgpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+U2V0VmFsdWUobV93c05ld1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpJc0RhdGFDaGFuZ2VkKCkNCit7DQorICAgIENGV0xfQ29tYm9Cb3gqIHBGV0xjb21ib2JveCA9ICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBwRldMY29tYm9ib3gtPkdldEVkaXRUZXh0KHdzVGV4dCk7DQorICAgIEZYX0lOVDMyIGlDdXJzZWwgPSBwRldMY29tYm9ib3gtPkdldEN1clNlbCgpOw0KKyAgICBpZiAoaUN1cnNlbCA+PSAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NlbDsNCisgICAgICAgIHBGV0xjb21ib2JveC0+R2V0VGV4dEJ5SW5kZXgoaUN1cnNlbCwgd3NTZWwpOw0KKyAgICAgICAgaWYgKHdzU2VsID09IHdzVGV4dCkgew0KKyAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RJdGVtKHdzVGV4dCwgaUN1cnNlbCwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsNCisgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NPbGRWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICBpZiAod3NPbGRWYWx1ZSAhPSB3c1RleHQpIHsNCisgICAgICAgIG1fd3NOZXdWYWx1ZSA9IHdzVGV4dDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OkZXTEV2ZW50U2VsQ2hhbmdlKENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKQ0KK3sNCisgICAgcFBhcmFtLT5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgICAgcFBhcmFtLT5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICBDRldMX0NvbWJvQm94KiBwRldMY29tYm9ib3ggPSAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCk7DQorICAgIHBGV0xjb21ib2JveC0+R2V0RWRpdFRleHQocFBhcmFtLT5tX3dzTmV3VGV4dCk7DQorICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsIHBQYXJhbSk7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZDb21ib0JveDo6R2V0QWxpZ25tZW50KCkNCit7DQorICAgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IDA7DQorICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICAgICAgc3dpdGNoKGlIb3J6KSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyIHwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUNlbnRlckFsaWduOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRKdXN0aWZpZWQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhOZWFyIHwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUxlZnRBbGlnbjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICAgICAgc3dpdGNoKGlWZXJ0KSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQ2VudGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWTmVhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlVwZGF0ZUZXTERhdGEoKQ0KK3sNCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfSW50MzJBcnJheSBpU2VsQXJyYXk7DQorICAgIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgICAgRlhfSU5UMzIgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsNCisgICAgaWYgKGlTZWxDb3VudCA+IDApIHsNCisgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0Q3VyU2VsKGlTZWxBcnJheVswXSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbCgtMSk7DQorICAgICAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCisgICAgfQ0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkNhblVuZG8oKQ0KK3sNCisgICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuVW5kbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuUmVkbygpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpVbmRvKCkNCit7DQorICAgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdFVuZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlJlZG8oKQ0KK3sNCisgICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0UmVkbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuQ29weSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuQ29weSgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuQ3V0KCkNCit7DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5QYXN0ZSgpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5TZWxlY3RBbGwoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDdXQod3NDdXQpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlNlbGVjdEFsbCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0U2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpEZWxldGUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdERlbGV0ZSgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6RGVTZWxlY3QoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdERlU2VsZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpTZXRJdGVtU3RhdGUoRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkNCit7DQorICAgIGlmIChiU2VsZWN0ZWQpIHsNCisgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0Q3VyU2VsKG5JbmRleCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbCgtMSk7DQorICAgIH0NCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Okluc2VydEl0ZW0oRlhfV1NUUiB3c0xhYmVsLCBGWF9JTlQzMiBuSW5kZXggKQ0KK3sNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5BZGRTdHJpbmcod3NMYWJlbCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpEZWxldGVJdGVtKEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChuSW5kZXggPCAwKSB7DQorICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlJlbW92ZUFsbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5SZW1vdmVBdChuSW5kZXgpOw0KKyAgICB9DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDaGFuZ2VkKQ0KK3sNCisgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUoZVBhcmFtLm1fd3NQcmV2VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICBlUGFyYW0ubV93c0NoYW5nZSA9IHdzQ2hhbmdlZDsNCisgICAgRldMRXZlbnRTZWxDaGFuZ2UoJmVQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZhcnJTZWxzLCBGWF9CT09MIGJMQnV0dG9uVXApDQorew0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c1ByZXZUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICAgIEZXTEV2ZW50U2VsQ2hhbmdlKCZlUGFyYW0pOw0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0Q2hvaWNlTGlzdENvbW1pdE9uKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2VsZWN0ICYmIGJMQnV0dG9uVXApIHsNCisgICAgICAgIG1fcERvY1ZpZXctPlNldEZvY3VzV2lkZ2V0QWNjKE5VTEwpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblByZU9wZW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9QcmVPcGVuOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sICZlUGFyYW0pOw0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25Qb3N0T3BlbihJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1Bvc3RPcGVuOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RPcGVuLCAmZVBhcmFtKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uQWRkRG9SZWNvcmQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+QWRkRG9SZWNvcmQoKFhGQV9IV0lER0VUKXRoaXMpOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkNvbWJvQm94OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBzd2l0Y2ggKGR3RXZlbnRJRCkgew0KKyAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9DTUJfU2VsQ2hhbmdlZDogew0KKyAgICAgICAgICAgICAgICBDRldMX0V2dENtYlNlbENoYW5nZWQgKnBvc3RFdmVudCA9IChDRldMX0V2dENtYlNlbENoYW5nZWQqKXBFdmVudDsNCisgICAgICAgICAgICAgICAgT25TZWxlY3RDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHBvc3RFdmVudC0+aUFycmF5U2VscywgcG9zdEV2ZW50LT5iTEJ1dHRvblVwKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9DTUJfRWRpdENoYW5nZWQ6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2VkOw0KKyAgICAgICAgICAgICAgICBPblRleHRDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHdzQ2hhbmdlZCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX0VWVEhBU0hfQ01CX1ByZURyb3BEb3duOiB7DQorICAgICAgICAgICAgICAgIE9uUHJlT3BlbihtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9DTUJfUG9zdERyb3BEb3duOiB7DQorICAgICAgICAgICAgICAgIE9uUG9zdE9wZW4obV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK30NCitGV0xfRVJSIENYRkFfRkZDb21ib0JveDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ2M2VjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0NIT0lDRUxJU1RfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfQ0hPSUNFTElTVF9JTVBfSA0KK2NsYXNzIENYRkFfRkZMaXN0Qm94IDogcHVibGljIENYRkFfRkZGaWVsZA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZMaXN0Qm94KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGTGlzdEJveCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRXaWRnZXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCitwcm90ZWN0ZWQ6DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29tbWl0RGF0YSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVwZGF0ZUZXTERhdGEoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0RhdGFDaGFuZ2VkKCk7DQorICAgIEZYX0RXT1JECQkJR2V0QWxpZ25tZW50KCk7DQorcHVibGljOg0KKyAgICB2b2lkCQlPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZhcnJTZWxzKTsNCisgICAgdm9pZAkJCVNldEl0ZW1TdGF0ZShGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsNCisgICAgdm9pZAkJCUluc2VydEl0ZW0oRlhfV1NUUiB3c0xhYmVsLCBGWF9JTlQzMiBuSW5kZXggPSAtMSk7DQorICAgIHZvaWQJCQlEZWxldGVJdGVtKEZYX0lOVDMyIG5JbmRleCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSoJbV9wT2xkRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDWEZBX0ZGQ29tYm9Cb3ggOiBwdWJsaWMgQ1hGQV9GRkZpZWxkDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRkNvbWJvQm94KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGQ29tYm9Cb3goKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5VbmRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUmVkbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCk7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ29weSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkN1dCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblBhc3RlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VsZWN0QWxsKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVTZWxlY3QoKTsNCisgICAgdm9pZAlPcGVuRHJvcERvd25MaXN0KCk7DQorcHJvdGVjdGVkOg0KKyAgICB2aXJ0dWFsCUZYX0JPT0wJCVB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29tbWl0RGF0YSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVwZGF0ZUZXTERhdGEoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0RhdGFDaGFuZ2VkKCk7DQorICAgIEZYX0RXT1JECQkJR2V0QWxpZ25tZW50KCk7DQorICAgIHZvaWQJCQkJRldMRXZlbnRTZWxDaGFuZ2UoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pOw0KKw0KKyAgICBDRlhfV2lkZVN0cmluZwkJbV93c05ld1ZhbHVlOw0KK3B1YmxpYzoNCisgICAgdm9pZAlPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDaGFuZ2VkKTsNCisgICAgdm9pZAlPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9JbnQzMkFycmF5ICZhcnJTZWxzLCBGWF9CT09MIGJMQnV0dG9uVXApOw0KKyAgICB2b2lkCU9uUHJlT3BlbihJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZvaWQJT25Qb3N0T3BlbihJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZvaWQJT25BZGREb1JlY29yZChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICAgIHZvaWQJCQlTZXRJdGVtU3RhdGUoRlhfSU5UMzIgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7DQorICAgIHZvaWQJCQlJbnNlcnRJdGVtKEZYX1dTVFIgd3NMYWJlbCwgRlhfSU5UMzIgbkluZGV4ID0gLTEpOw0KKyAgICB2b2lkCQkJRGVsZXRlSXRlbShGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitwcm90ZWN0ZWQ6DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqCW1fcE9sZERlbGVnYXRlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2ODYwMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5jcHAKQEAgLTAsMCArMSw0NTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2Zmbm90aWZ5LmgiDQorI2luY2x1ZGUgInhmYV9mb250bWdyLmgiDQorQ1hGQV9GRkRvYzo6Q1hGQV9GRkRvYyhDWEZBX0ZGQXBwKiBwQXBwLCBJWEZBX0RvY1Byb3ZpZGVyKiBwRG9jUHJvdmlkZXIpDQorICAgIDogbV9wRG9jUHJvdmlkZXIocERvY1Byb3ZpZGVyKQ0KKyAgICAsIG1fZHdEb2NUeXBlKFhGQV9ET0NUWVBFX1N0YXRpYykNCisgICAgLCBtX3BEb2N1bWVudChOVUxMKQ0KKyAgICAsIG1fcFN0cmVhbShOVUxMKQ0KKyAgICAsIG1fcEFwcChwQXBwKQ0KKyAgICAsIG1fcE5vdGlmeShOVUxMKQ0KKyAgICAsIG1fcFBERkRvYyhOVUxMKQ0KKyAgICAsIG1fYk93blN0cmVhbShUUlVFKQ0KK3sNCit9DQorQ1hGQV9GRkRvYzo6fkNYRkFfRkZEb2MoKQ0KK3sNCisgICAgQ2xvc2VEb2MoKTsNCit9DQorRlhfRFdPUkQgQ1hGQV9GRkRvYzo6R2V0RG9jVHlwZSgpDQorew0KKyAgICByZXR1cm4gbV9kd0RvY1R5cGU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZEb2M6OlN0YXJ0TG9hZCgpDQorew0KKyAgICBtX3BOb3RpZnkgPSBGWF9ORVcgQ1hGQV9GRk5vdGlmeSh0aGlzKTsNCisgICAgSVhGQV9Eb2NQYXJzZXIqIHBEb2NQYXJzZXIgPSBJWEZBX0RvY1BhcnNlcjo6Q3JlYXRlKG1fcE5vdGlmeSk7DQorICAgIEZYX0lOVDMyIGlTdGF0dXMgPSBwRG9jUGFyc2VyLT5TdGFydFBhcnNlKG1fcFN0cmVhbSk7DQorICAgIG1fcERvY3VtZW50ID0gcERvY1BhcnNlci0+R2V0RG9jdW1lbnQoKTsNCisgICAgcmV0dXJuIGlTdGF0dXM7DQorfQ0KK0ZYX0JPT0wgWEZBX0dldFBERkNvbnRlbnRzRnJvbVBERlhNTChJRkRFX1hNTE5vZGUgKnBQREZFbGVtZW50LCBGWF9MUEJZVEUgJnBCeXRlQnVmZmVyLCBGWF9JTlQzMiYgaUJ1ZmZlclNpemUpDQorew0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBEb2N1bWVudEVsZW1lbnQgPSBOVUxMOw0KKyAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTE5vZGUgPSBwUERGRWxlbWVudC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcFhNTE5vZGU7IHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOw0KKyAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlOw0KKyAgICAgICAgICAgIHBYTUxFbGVtZW50LT5HZXRUYWdOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgICAgICAgaWYgKHdzVGFnTmFtZS5FcXVhbChGWF9XU1RSQyhMImRvY3VtZW50IikpKSB7DQorICAgICAgICAgICAgICAgIHBEb2N1bWVudEVsZW1lbnQgPSBwWE1MRWxlbWVudDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghcERvY3VtZW50RWxlbWVudCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGREVfWE1MRWxlbWVudCogcENodW5rRWxlbWVudCA9IE5VTEw7DQorICAgIGZvciAoSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBEb2N1bWVudEVsZW1lbnQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnTmFtZTsNCisgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZTsNCisgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0VGFnTmFtZSh3c1RhZ05hbWUpOw0KKyAgICAgICAgICAgIGlmICh3c1RhZ05hbWUuRXF1YWwoRlhfV1NUUkMoTCJjaHVuayIpKSkgew0KKyAgICAgICAgICAgICAgICBwQ2h1bmtFbGVtZW50ID0gcFhNTEVsZW1lbnQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIXBDaHVua0VsZW1lbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BERkNvbnRlbnQ7DQorICAgIHBDaHVua0VsZW1lbnQtPkdldFRleHREYXRhKHdzUERGQ29udGVudCk7DQorICAgIGlCdWZmZXJTaXplID0gRlhfQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQsIHdzUERGQ29udGVudC5HZXRMZW5ndGgoKSwgTlVMTCk7DQorICAgIHBCeXRlQnVmZmVyID0gRlhfQWxsb2MoRlhfQllURSwgaUJ1ZmZlclNpemUgKyAxKTsNCisgICAgaWYgKCFwQnl0ZUJ1ZmZlcikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHBCeXRlQnVmZmVyW2lCdWZmZXJTaXplXSA9ICcwJzsNCisgICAgRlhfQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQsIHdzUERGQ29udGVudC5HZXRMZW5ndGgoKSwgcEJ5dGVCdWZmZXIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBYRkFfWFBEUGFja2V0X01lcmdlUm9vdE5vZGUoQ1hGQV9Ob2RlICpwT3JpZ2luUm9vdCwgQ1hGQV9Ob2RlKiBwTmV3Um9vdCkNCit7DQorICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOZXdSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBPcmlnaW5DaGlsZCA9IHBPcmlnaW5Sb290LT5HZXRGaXJzdENoaWxkQnlOYW1lKHBDaGlsZE5vZGUtPkdldE5hbWVIYXNoKCkpOw0KKyAgICAgICAgaWYgKHBPcmlnaW5DaGlsZCkgew0KKyAgICAgICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX05vZGUgKnBOZXh0U2libGluZyA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgcE5ld1Jvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgICAgICAgIHBPcmlnaW5Sb290LT5JbnNlcnRDaGlsZChwQ2hpbGROb2RlKTsNCisgICAgICAgICAgICBwQ2hpbGROb2RlID0gcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICAgIHBOZXh0U2libGluZyA9IE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ1hGQV9GRkRvYzo6RG9Mb2FkKElGWF9QYXVzZSAqcFBhdXNlICkNCit7DQorICAgIEZYX0lOVDMyIGlTdGF0dXMgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkRvUGFyc2UocFBhdXNlKTsNCisgICAgaWYgKGlTdGF0dXMgPT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUgJiYgIW1fcFBERkRvYykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUERGTm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9QZGYpOw0KKyAgICAgICAgaWYgKCFwUERGTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgSUZERV9YTUxOb2RlICpwUERGWE1MID0gcFBERk5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBpZiAocFBERlhNTC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlCdWZmZXJTaXplID0gMDsNCisgICAgICAgIEZYX0xQQllURSBwQnl0ZUJ1ZmZlciA9IE5VTEw7DQorICAgICAgICBJRlhfRmlsZVJlYWQqIHBYRkFSZWFkZXIgPSBOVUxMOw0KKyAgICAgICAgaWYgKFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwocFBERlhNTCwgcEJ5dGVCdWZmZXIsIGlCdWZmZXJTaXplKSkgew0KKyAgICAgICAgICAgIHBYRkFSZWFkZXIgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ5dGVCdWZmZXIsIGlCdWZmZXJTaXplLCBUUlVFKTsNCisgICAgICAgICAgICBpZiAoIXBYRkFSZWFkZXIpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBCeXRlQnVmZmVyKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKHBCeXRlQnVmZmVyKTsNCisgICAgICAgICAgICAgICAgICAgIHBCeXRlQnVmZmVyID0gTlVMTDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSHJlZjsNCisgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopcFBERlhNTCktPkdldFN0cmluZygoRlhfTFBDV1NUUilMImhyZWYiLCB3c0hyZWYpOw0KKyAgICAgICAgICAgIGlmICghd3NIcmVmLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBwWEZBUmVhZGVyID0gR2V0RG9jUHJvdmlkZXIoKS0+T3BlbkxpbmtlZEZpbGUoKFhGQV9IRE9DKXRoaXMsIHdzSHJlZik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFwWEZBUmVhZGVyKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgICAgICB9DQorICAgICAgICBDUERGX0RvY3VtZW50KiBwUERGRG9jdW1lbnQgPSBHZXREb2NQcm92aWRlcigpLT5PcGVuUERGKHJlaW50ZXJwcmV0X2Nhc3Q8WEZBX0hET0M+KHRoaXMpLCBwWEZBUmVhZGVyLCBUUlVFKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydCghbV9wUERGRG9jKTsNCisgICAgICAgIGlmICghT3BlbkRvYyhwUERGRG9jdW1lbnQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgICAgICB9DQorICAgICAgICBJWEZBX1BhcnNlciogcFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQsIFRSVUUpOw0KKyAgICAgICAgaWYgKCFwUGFyc2VyKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBSb290Tm9kZSA9IE5VTEw7DQorICAgICAgICBpZiAocFBhcnNlci0+U3RhcnRQYXJzZShtX3BTdHJlYW0pID09IFhGQV9QQVJTRVNUQVRVU19SZWFkeSAmJiBwUGFyc2VyLT5Eb1BhcnNlKE5VTEwpID09IFhGQV9QQVJTRVNUQVRVU19Eb25lKSB7DQorICAgICAgICAgICAgcFJvb3ROb2RlID0gcFBhcnNlci0+R2V0Um9vdE5vZGUoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUm9vdE5vZGUgJiYgbV9wRG9jdW1lbnQtPkdldFJvb3QoKSkgew0KKyAgICAgICAgICAgIFhGQV9YUERQYWNrZXRfTWVyZ2VSb290Tm9kZShtX3BEb2N1bWVudC0+R2V0Um9vdCgpLCBwUm9vdE5vZGUpOw0KKyAgICAgICAgICAgIGlTdGF0dXMgPSBYRkFfUEFSU0VTVEFUVVNfRG9uZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXR1cyA9IFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICAgICAgICB9DQorICAgICAgICBwUGFyc2VyLT5SZWxlYXNlKCk7DQorICAgICAgICBwUGFyc2VyID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gaVN0YXR1czsNCit9DQordm9pZCBDWEZBX0ZGRG9jOjpTdG9wTG9hZCgpDQorew0KKyAgICBtX3BBcHAtPkdldFhGQUZvbnRNZ3IoKS0+TG9hZERvY0ZvbnRzKChYRkFfSERPQyl0aGlzKTsNCisgICAgbV9kd0RvY1R5cGUgPSBYRkFfRE9DVFlQRV9TdGF0aWM7DQorICAgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Db25maWcpOw0KKyAgICBpZiAoIXBDb25maWcpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBBY3JvYmF0ID0gcENvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQWNyb2JhdCk7DQorICAgIGlmICghcEFjcm9iYXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBBY3JvYmF0NyA9IHBBY3JvYmF0LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0Nyk7DQorICAgIGlmICghcEFjcm9iYXQ3KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwRHluYW1pY1JlbmRlciA9IHBBY3JvYmF0Ny0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRHluYW1pY1JlbmRlcik7DQorICAgIGlmICghcER5bmFtaWNSZW5kZXIpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1R5cGU7DQorICAgIGlmIChwRHluYW1pY1JlbmRlci0+VHJ5Q29udGVudCh3c1R5cGUpICYmIHdzVHlwZSA9PSBGWF9XU1RSQyhMInJlcXVpcmVkIikpIHsNCisgICAgICAgIG1fZHdEb2NUeXBlID0gWEZBX0RPQ1RZUEVfRHluYW1pYzsNCisgICAgfQ0KK30NCitJWEZBX0RvY1ZpZXcqIENYRkFfRkZEb2M6OkNyZWF0ZURvY1ZpZXcoRlhfRFdPUkQgZHdWaWV3ICkNCit7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IChDWEZBX0ZGRG9jVmlldyopbV9tYXBUeXBlVG9Eb2NWaWV3LkdldFZhbHVlQXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd1ZpZXcpOw0KKyAgICBpZiAoIXBEb2NWaWV3KSB7DQorICAgICAgICBwRG9jVmlldyA9IEZYX05FVyBDWEZBX0ZGRG9jVmlldyh0aGlzKTsNCisgICAgICAgIG1fbWFwVHlwZVRvRG9jVmlldy5TZXRBdCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWR3VmlldywgcERvY1ZpZXcpOw0KKyAgICB9DQorICAgIHJldHVybiBwRG9jVmlldzsNCit9DQorQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZEb2M6OkdldERvY1ZpZXcoSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQpDQorew0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgRlhfTFBWT0lEIHBUeXBlOw0KKyAgICAgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3Ow0KKyAgICAgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LkdldE5leHRBc3NvYyhwcywgcFR5cGUsICh2b2lkKiYpcERvY1ZpZXcpOw0KKyAgICAgICAgaWYgKHBEb2NWaWV3LT5HZXRYRkFMYXlvdXQoKSA9PSBwTGF5b3V0KSB7DQorICAgICAgICAgICAgcmV0dXJuIHBEb2NWaWV3Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6R2V0RG9jVmlldygpDQorew0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIGlmIChwcykgew0KKyAgICAgICAgRlhfTFBWT0lEIHBUeXBlOw0KKyAgICAgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3Ow0KKyAgICAgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LkdldE5leHRBc3NvYyhwcywgcFR5cGUsICh2b2lkKiYpcERvY1ZpZXcpOw0KKyAgICAgICAgcmV0dXJuIHBEb2NWaWV3Ow0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2M6Ok9wZW5Eb2MoSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJUYWtlT3ZlckZpbGUpDQorew0KKyAgICBtX2JPd25TdHJlYW0gPSBiVGFrZU92ZXJGaWxlOw0KKyAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jOjpPcGVuRG9jKENQREZfRG9jdW1lbnQqIHBQREZEb2MpDQorew0KKyAgICBpZiAocFBERkRvYyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBQREZEb2MtPkdldFJvb3QoKTsNCisgICAgaWYgKHBSb290ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KEZYX0JTVFJDKCJBY3JvRm9ybSIpKTsNCisgICAgaWYgKHBBY3JvRm9ybSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50WEZBID0gcEFjcm9Gb3JtLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJYRkEiKSk7DQorICAgIGlmIChwRWxlbWVudFhGQSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaU9ialR5cGUgPSBwRWxlbWVudFhGQS0+R2V0VHlwZSgpOw0KKyAgICBpZiAoaU9ialR5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSkgew0KKyAgICAgICAgcEVsZW1lbnRYRkEgPSBwRWxlbWVudFhGQS0+R2V0RGlyZWN0KCk7DQorICAgICAgICBpT2JqVHlwZSA9IHBFbGVtZW50WEZBLT5HZXRUeXBlKCk7DQorICAgIH0NCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJlYW0qPiB4ZmFTdHJlYW1zOw0KKyAgICBpZiAoaU9ialR5cGUgPT0gUERGT0JKX0FSUkFZKSB7DQorICAgICAgICBDUERGX0FycmF5KiBwWEZBQXJyYXkgPSAoQ1BERl9BcnJheSopcEVsZW1lbnRYRkE7DQorICAgICAgICBGWF9EV09SRCBjb3VudCA9IHBYRkFBcnJheS0+R2V0Q291bnQoKSAvIDI7DQorICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcFhGQUFycmF5LT5HZXRTdHJlYW0oaSAqIDIgKyAxKTsNCisgICAgICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHhmYVN0cmVhbXMuQWRkKHBTdHJlYW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7DQorICAgICAgICB4ZmFTdHJlYW1zLkFkZCgoQ1BERl9TdHJlYW0qKXBFbGVtZW50WEZBKTsNCisgICAgfQ0KKyAgICBpZiAoeGZhU3RyZWFtcy5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBGWF9ORVcgQ1hGQV9GaWxlUmVhZDIoeGZhU3RyZWFtcyk7DQorICAgIGlmICghcEZpbGVSZWFkKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9wUERGRG9jID0gcFBERkRvYzsNCisgICAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgICB9DQorICAgIG1fcFN0cmVhbSA9IHBGaWxlUmVhZDsNCisgICAgbV9iT3duU3RyZWFtID0gVFJVRTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvYzo6Q2xvc2VEb2MoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcHNDbG9zZSA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwc0Nsb3NlKSB7DQorICAgICAgICBGWF9MUFZPSUQgcFR5cGU7DQorICAgICAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQorICAgICAgICBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0TmV4dEFzc29jKHBzQ2xvc2UsIHBUeXBlLCAodm9pZComKXBEb2NWaWV3KTsNCisgICAgICAgIHBEb2NWaWV3LT5SdW5Eb2NDbG9zZSgpOw0KKyAgICB9DQorICAgIGlmIChtX3BEb2N1bWVudCkgew0KKyAgICAgICAgbV9wRG9jdW1lbnQtPkNsZWFyTGF5b3V0RGF0YSgpOw0KKyAgICB9DQorICAgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBUeXBlVG9Eb2NWaWV3LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBGWF9MUFZPSUQgcFR5cGU7DQorICAgICAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQorICAgICAgICBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0TmV4dEFzc29jKHBzLCBwVHlwZSwgKHZvaWQqJilwRG9jVmlldyk7DQorICAgICAgICBkZWxldGUgcERvY1ZpZXc7DQorICAgIH0NCisgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LlJlbW92ZUFsbCgpOw0KKyAgICBpZiAobV9wRG9jdW1lbnQpIHsNCisgICAgICAgIElYRkFfUGFyc2VyKiBwUGFyc2VyID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpOw0KKyAgICAgICAgcFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wRG9jdW1lbnQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BOb3RpZnkpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BOb3RpZnk7DQorICAgICAgICBtX3BOb3RpZnkgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fcEFwcC0+R2V0WEZBRm9udE1ncigpLT5SZWxlYXNlRG9jRm9udHMoKFhGQV9IRE9DKXRoaXMpOw0KKyAgICBpZiAobV9kd0RvY1R5cGUgIT0gWEZBX0RPQ1RZUEVfWERQICYmIG1fcFN0cmVhbSAmJiBtX2JPd25TdHJlYW0pIHsNCisgICAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgICAgfQ0KKyAgICBwcyA9IG1fbWFwTmFtZWRJbWFnZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHMpIHsNCisgICAgICAgIEZYX0xQVk9JRCBwTmFtZTsNCisgICAgICAgIEZYX0lNQUdFRElCX0FORF9EUEkqIHBJbWFnZSA9IE5VTEw7DQorICAgICAgICBtX21hcE5hbWVkSW1hZ2VzLkdldE5leHRBc3NvYyhwcywgcE5hbWUsICh2b2lkKiYpcEltYWdlKTsNCisgICAgICAgIGlmIChwSW1hZ2UpIHsNCisgICAgICAgICAgICBkZWxldGUgcEltYWdlLT5wRGliU291cmNlOw0KKyAgICAgICAgICAgIHBJbWFnZS0+cERpYlNvdXJjZSA9IE5VTEw7DQorICAgICAgICAgICAgRlhfRnJlZShwSW1hZ2UpOw0KKyAgICAgICAgICAgIHBJbWFnZSA9IE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9tYXBOYW1lZEltYWdlcy5SZW1vdmVBbGwoKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+Q2xlYXJFdmVudFRhcmdldHMoRkFMU0UpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRG9jOjpTZXREb2NUeXBlKEZYX0RXT1JEIGR3VHlwZSkNCit7DQorICAgIG1fZHdEb2NUeXBlID0gZHdUeXBlOw0KK30NCitDUERGX0RvY3VtZW50KiBDWEZBX0ZGRG9jOjpHZXRQREZEb2MoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFBERkRvYzsNCit9DQorI2RlZmluZSBfRlhMSUJfTkVXX1ZFUlNJT05fDQorQ0ZYX0RJQml0bWFwKiBDWEZBX0ZGRG9jOjpHZXRQREZOYW1lZEltYWdlKEZYX1dTVFIgd3NOYW1lLCBGWF9JTlQzMiAmaUltYWdlWERwaSwgRlhfSU5UMzIgJmlJbWFnZVlEcGkpDQorew0KKyAgICBpZiAoIW1fcFBERkRvYykgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIEZBTFNFKTsNCisgICAgRlhfSU1BR0VESUJfQU5EX0RQSSAqaW1hZ2VESUJEcGkgPSBOVUxMOw0KKyAgICBpZiAobV9tYXBOYW1lZEltYWdlcy5Mb29rdXAoKHZvaWQqKShGWF9VSU5UUFRSKWR3SGFzaCwgKHZvaWQqJilpbWFnZURJQkRwaSkpIHsNCisgICAgICAgIGlJbWFnZVhEcGkgPSBpbWFnZURJQkRwaS0+aUltYWdlWERwaTsNCisgICAgICAgIGlJbWFnZVlEcGkgPSBpbWFnZURJQkRwaS0+aUltYWdlWURwaTsNCisgICAgICAgIHJldHVybiAoQ0ZYX0RJQml0bWFwKilpbWFnZURJQkRwaS0+cERpYlNvdXJjZTsNCisgICAgfQ0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wUERGRG9jLT5HZXRSb290KCk7DQorICAgIGlmIChwUm9vdCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBOYW1lcyA9IHBSb290LT5HZXREaWN0KCJOYW1lcyIpOw0KKyAgICBpZiAoIXBOYW1lcykgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwWEZBSW1hZ2VzID0gcE5hbWVzLT5HZXREaWN0KCJYRkFJbWFnZXMiKTsNCisgICAgaWYgKCFwWEZBSW1hZ2VzKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDUERGX05hbWVUcmVlIG5hbWV0cmVlKHBYRkFJbWFnZXMpOw0KKyNpZmRlZiBfRlhMSUJfTkVXX1ZFUlNJT05fDQorICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IFBERl9FbmNvZGVUZXh0KHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgICAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZShic05hbWUpOw0KKyAgICBpZiAoIXBPYmplY3QpIHsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IG5hbWV0cmVlLkdldENvdW50KCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1RlbXA7DQorICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBUZW1wT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUoaSwgYnNUZW1wKTsNCisgICAgICAgICAgICBpZiAoYnNUZW1wID09IGJzTmFtZSkgew0KKyAgICAgICAgICAgICAgICBwT2JqZWN0ID0gcFRlbXBPYmplY3Q7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyNlbHNlDQorICAgIENQREZfT2JqZWN0KiBwT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUod3NOYW1lKTsNCisgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBuYW1ldHJlZS5HZXRDb3VudCgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgICAgIENQREZfT2JqZWN0KiBwVGVtcE9iamVjdCA9IG5hbWV0cmVlLkxvb2t1cFZhbHVlKGksIHdzVGVtcCk7DQorICAgICAgICAgICAgaWYgKHdzVGVtcCA9PSB3c05hbWUpIHsNCisgICAgICAgICAgICAgICAgcE9iamVjdCA9IHBUZW1wT2JqZWN0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisjZW5kaWYNCisgICAgaWYgKCFwT2JqZWN0IHx8IHBPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIWltYWdlRElCRHBpKSB7DQorICAgICAgICBpbWFnZURJQkRwaSA9IEZYX0FsbG9jKEZYX0lNQUdFRElCX0FORF9EUEksIDEpOw0KKyAgICAgICAgaW1hZ2VESUJEcGktPnBEaWJTb3VyY2UgPSBOVUxMOw0KKyAgICAgICAgaW1hZ2VESUJEcGktPmlJbWFnZVhEcGkgPSAwOw0KKyAgICAgICAgaW1hZ2VESUJEcGktPmlJbWFnZVlEcGkgPSAwOw0KKyAgICAgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtQWNjOw0KKyAgICAgICAgc3RyZWFtQWNjLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcE9iamVjdCk7DQorICAgICAgICBJRlhfRmlsZVJlYWQqIHBJbWFnZUZpbGVSZWFkID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKChGWF9MUEJZVEUpc3RyZWFtQWNjLkdldERhdGEoKSwgc3RyZWFtQWNjLkdldFNpemUoKSk7DQorICAgICAgICBpbWFnZURJQkRwaS0+cERpYlNvdXJjZSA9IFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKHBJbWFnZUZpbGVSZWFkLCBGWENPREVDX0lNQUdFX1VOS05PV04sIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOw0KKyAgICAgICAgaW1hZ2VESUJEcGktPmlJbWFnZVhEcGkgPSBpSW1hZ2VYRHBpOw0KKyAgICAgICAgaW1hZ2VESUJEcGktPmlJbWFnZVlEcGkgPSBpSW1hZ2VZRHBpOw0KKyAgICAgICAgcEltYWdlRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBtX21hcE5hbWVkSW1hZ2VzLlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsIGltYWdlRElCRHBpKTsNCisgICAgcmV0dXJuIChDRlhfRElCaXRtYXAqKWltYWdlRElCRHBpLT5wRGliU291cmNlOw0KK30NCitJRkRFX1hNTEVsZW1lbnQqIENYRkFfRkZEb2M6OkdldFBhY2thZ2VEYXRhKEZYX1dTVFIgd3NQYWNrYWdlKQ0KK3sNCisgICAgRlhfRFdPUkQgcGFja2V0SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzUGFja2FnZS5HZXRQdHIoKSwgd3NQYWNrYWdlLkdldExlbmd0aCgpKTsNCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBtX3BEb2N1bWVudC0+R2V0WEZBTm9kZShwYWNrZXRIYXNoKTsNCisgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IChwT2JqZWN0ICYmIHBPYmplY3QtPklzTm9kZSgpKSA/IChDWEZBX05vZGUqKXBPYmplY3QgOiBOVUxMOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlID0gcE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIHJldHVybiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSA/IChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZSA6IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvYzo6U2F2ZVBhY2thZ2UoRlhfV1NUUiB3c1BhY2thZ2UsIElGWF9GaWxlV3JpdGUqIHBGaWxlLCBJWEZBX0NoZWNrc3VtQ29udGV4dCAqcENTQ29udGV4dCApDQorew0KKyAgICBJWEZBX1BhY2tldEV4cG9ydCAqcEV4cG9ydCA9IElYRkFfUGFja2V0RXhwb3J0OjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgICBpZiAoIXBFeHBvcnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBwYWNrZXRIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NQYWNrYWdlLkdldFB0cigpLCB3c1BhY2thZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgICBDWEZBX05vZGUgKnBOb2RlID0gTlVMTDsNCisgICAgaWYgKHBhY2tldEhhc2ggPT0gWEZBX0hBU0hDT0RFX1hmYSkgew0KKyAgICAgICAgcE5vZGUgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9PYmplY3QgKnBPYmplY3QgPSBtX3BEb2N1bWVudC0+R2V0WEZBTm9kZShwYWNrZXRIYXNoKTsNCisgICAgICAgIHBOb2RlID0gKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQorICAgIH0NCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrc3VtOw0KKyAgICAgICAgaWYgKHBDU0NvbnRleHQpIHsNCisgICAgICAgICAgICBwQ1NDb250ZXh0LT5HZXRDaGVja3N1bShic0NoZWNrc3VtKTsNCisgICAgICAgIH0NCisgICAgICAgIGJGbGFncyA9IHBFeHBvcnQtPkV4cG9ydChwRmlsZSwgcE5vZGUsIDAsIGJzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkgPyAoRlhfTFBDU1RSKWJzQ2hlY2tzdW0gOiBOVUxMKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGJGbGFncyA9IHBFeHBvcnQtPkV4cG9ydChwRmlsZSk7DQorICAgIH0NCisgICAgcEV4cG9ydC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gYkZsYWdzOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2M6OkltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJYRFAgKQ0KK3sNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIElYRkFfUGFja2V0SW1wb3J0ICpwSW1wb3J0ID0gSVhGQV9QYWNrZXRJbXBvcnQ6OkNyZWF0ZShtX3BEb2N1bWVudCk7DQorICAgIGlmIChwSW1wb3J0KSB7DQorICAgICAgICBiUmV0ID0gcEltcG9ydC0+SW1wb3J0RGF0YShwU3RyZWFtKTsNCisgICAgICAgIHBJbXBvcnQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYlJldDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTFjNjc1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRE9DX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0RPQ19JTVBfSA0KK2NsYXNzIENYRkFfRkZBcHA7DQorY2xhc3MgQ1hGQV9GRk5vdGlmeTsNCitjbGFzcyBDWEZBX0ZGRG9jVmlldzsNCitjbGFzcyBJWEZBX0xvY2FsZTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfSU1BR0VESUJfQU5EX0RQSSB7DQorICAgIENGWF9ESUJTb3VyY2UqIHBEaWJTb3VyY2U7DQorICAgIEZYX0lOVDMyCSAgIGlJbWFnZVhEcGk7DQorICAgIEZYX0lOVDMyCSAgIGlJbWFnZVlEcGk7DQorfSBGWF9JTUFHRURJQl9BTkRfRFBJOw0KK2NsYXNzIENYRkFfRkZEb2MgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZEb2MoQ1hGQV9GRkFwcCogcEFwcCwgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyKTsNCisgICAgfkNYRkFfRkZEb2MoKTsNCisgICAgSVhGQV9Eb2NQcm92aWRlcioJCUdldERvY1Byb3ZpZGVyKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcERvY1Byb3ZpZGVyOw0KKyAgICB9DQorICAgIEZYX0RXT1JECQkJCUdldERvY1R5cGUoKTsNCisgICAgRlhfSU5UMzIJCQkJU3RhcnRMb2FkKCk7DQorICAgIEZYX0lOVDMyCQkJCURvTG9hZChJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KKyAgICB2b2lkCQkJCQlTdG9wTG9hZCgpOw0KKyAgICBJWEZBX0RvY1ZpZXcqCQkJQ3JlYXRlRG9jVmlldyhGWF9EV09SRCBkd1ZpZXcgPSAwKTsNCisgICAgRlhfQk9PTAkJCQkJT3BlbkRvYyhJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlRha2VPdmVyRmlsZSk7DQorICAgIEZYX0JPT0wJCQkJCU9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYyk7DQorICAgIEZYX0JPT0wJCQkJCUNsb3NlRG9jKCk7DQorICAgIHZvaWQJCQkJCVNldERvY1R5cGUoRlhfRFdPUkQgZHdUeXBlKTsNCisgICAgQ1hGQV9Eb2N1bWVudCoJCQlHZXRYRkFEb2MoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7DQorICAgIH0NCisgICAgQ1hGQV9GRkFwcCoJCQkJR2V0QXBwKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEFwcDsNCisgICAgfQ0KKyAgICBDWEZBX0ZGRG9jVmlldyoJCQlHZXREb2NWaWV3KElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0KTsNCisgICAgQ1hGQV9GRkRvY1ZpZXcqCQkJR2V0RG9jVmlldygpOw0KKyAgICBDUERGX0RvY3VtZW50KgkJCUdldFBERkRvYygpOw0KKyAgICBDRlhfRElCaXRtYXAqCQkJR2V0UERGTmFtZWRJbWFnZShGWF9XU1RSIHdzTmFtZSwgRlhfSU5UMzIgJmlJbWFnZVhEcGksIEZYX0lOVDMyICZpSW1hZ2VZRHBpKTsNCisgICAgSUZERV9YTUxFbGVtZW50KgkJR2V0UGFja2FnZURhdGEoRlhfV1NUUiB3c1BhY2thZ2UpOw0KKyAgICBGWF9CT09MCQkJCQlTYXZlUGFja2FnZShGWF9XU1RSIHdzUGFja2FnZSwgSUZYX0ZpbGVXcml0ZSogcEZpbGUsIElYRkFfQ2hlY2tzdW1Db250ZXh0ICpwQ1NDb250ZXh0ID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCQkJCUltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJYRFAgPSBUUlVFKTsNCitwcm90ZWN0ZWQ6DQorICAgIElYRkFfRG9jUHJvdmlkZXIqCQltX3BEb2NQcm92aWRlcjsNCisgICAgQ1hGQV9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsNCisgICAgSUZYX0ZpbGVSZWFkKgkJCW1fcFN0cmVhbTsNCisgICAgQ1hGQV9GRkFwcCoJCQkJbV9wQXBwOw0KKyAgICBDWEZBX0ZGTm90aWZ5KgkJCW1fcE5vdGlmeTsNCisgICAgQ1BERl9Eb2N1bWVudCoJCQltX3BQREZEb2M7DQorICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fbWFwTmFtZWRJbWFnZXM7DQorICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fbWFwVHlwZVRvRG9jVmlldzsNCisgICAgRlhfRFdPUkQJCQkJbV9kd0RvY1R5cGU7DQorICAgIEZYX0JPT0wJCQkJCW1fYk93blN0cmVhbTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2YTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2NoYW5kbGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZEb2NIYW5kbGVyOjpDWEZBX0ZGRG9jSGFuZGxlcigpDQorew0KK30NCitDWEZBX0ZGRG9jSGFuZGxlcjo6fkNYRkFfRkZEb2NIYW5kbGVyKCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlJlbGVhc2VEb2MoWEZBX0hET0MgaERvYykNCit7DQorICAgIGRlbGV0ZSAoQ1hGQV9GRkRvYyopaERvYzsNCit9DQorSVhGQV9Eb2NQcm92aWRlciogQ1hGQV9GRkRvY0hhbmRsZXI6OkdldERvY1Byb3ZpZGVyKFhGQV9IRE9DIGhEb2MpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGRG9jKiloRG9jKS0+R2V0RG9jUHJvdmlkZXIoKTsNCit9DQorRlhfRFdPUkQgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldERvY1R5cGUoWEZBX0hET0MgaERvYykNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZEb2MqKWhEb2MpLT5HZXREb2NUeXBlKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZEb2NIYW5kbGVyOjpTdGFydExvYWQoWEZBX0hET0MgaERvYykNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZEb2MqKWhEb2MpLT5TdGFydExvYWQoKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRkRvY0hhbmRsZXI6OkRvTG9hZChYRkFfSERPQyBoRG9jLCBJRlhfUGF1c2UgKnBQYXVzZSApDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGRG9jKiloRG9jKS0+RG9Mb2FkKHBQYXVzZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlN0b3BMb2FkKFhGQV9IRE9DIGhEb2MpDQorew0KKyAgICAoKENYRkFfRkZEb2MqKWhEb2MpLT5TdG9wTG9hZCgpOw0KK30NCisNCitJWEZBX0RvY1ZpZXcqIENYRkFfRkZEb2NIYW5kbGVyOjpDcmVhdGVEb2NWaWV3KFhGQV9IRE9DIGhEb2MsIEZYX0RXT1JEIGR3VmlldyApDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGRG9jKiloRG9jKS0+Q3JlYXRlRG9jVmlldyhkd1ZpZXcpOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZGRG9jSGFuZGxlcjo6Q291bnRQYWNrYWdlcyhYRkFfSERPQyBoRG9jKQ0KK3sNCisgICAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFBhY2thZ2VOYW1lKFhGQV9IRE9DIGhEb2MsIEZYX0lOVDMyIGlQYWNrYWdlLCBDRlhfV2lkZVN0cmluZ0MgJndzUGFja2FnZSkNCit7DQorfQ0KK0lGREVfWE1MRWxlbWVudCogQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFBhY2thZ2VEYXRhKFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NQYWNrYWdlKQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRkRvYyopaERvYyktPkdldFBhY2thZ2VEYXRhKHdzUGFja2FnZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY0hhbmRsZXI6OlNhdmVQYWNrYWdlKFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NQYWNrYWdlLCBJRlhfRmlsZVdyaXRlKiBwRmlsZSwgSVhGQV9DaGVja3N1bUNvbnRleHQgKnBDU0NvbnRleHQgKQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRkRvYyopaERvYyktPlNhdmVQYWNrYWdlKHdzUGFja2FnZSwgcEZpbGUsIHBDU0NvbnRleHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2NIYW5kbGVyOjpDbG9zZURvYyhYRkFfSERPQyBoRG9jKQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRkRvYyopaERvYyktPkNsb3NlRG9jKCk7DQorfQ0KKw0KK0ZYX0JPT0wgQ1hGQV9GRkRvY0hhbmRsZXI6OkltcG9ydERhdGEoWEZBX0hET0MgaERvYywgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJYRFAgKQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRkRvYyopaERvYyktPkltcG9ydERhdGEocFN0cmVhbSwgYlhEUCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlNldEpTRVJ1bnRpbWUoWEZBX0hET0MgaERvYywgRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpDQorew0KKyAgICAoKENYRkFfRkZEb2MqKWhEb2MpLT5HZXRYRkFEb2MoKS0+SW5pdFNjcmlwdENvbnRleHQoaFJ1bnRpbWUpOw0KK30NCitGWEpTRV9IVkFMVUUgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFhGQVNjcmlwdE9iamVjdChYRkFfSERPQyBoRG9jKQ0KK3sNCisgICAgQ1hGQV9Eb2N1bWVudCogcFhGQURvYyA9ICgoQ1hGQV9GRkRvYyopaERvYyktPkdldFhGQURvYygpOw0KKyAgICBpZiAoIXBYRkFEb2MpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBwWEZBRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocFhGQURvYy0+R2V0Um9vdCgpKTsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFJlc3RvcmVTdGF0ZShYRkFfSERPQyBoRG9jKQ0KK3sNCisgICAgQ1hGQV9Eb2N1bWVudCogcFhGQURvYyA9ICgoQ1hGQV9GRkRvYyopaERvYyktPkdldFhGQURvYygpOw0KKyAgICBpZiAoIXBYRkFEb2MpIHsNCisgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEZvcm0gPSAoQ1hGQV9Ob2RlKilwWEZBRG9jLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgICAgaWYgKCFwRm9ybSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwU3ViRm9ybSA9IHBGb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgICAgaWYgKCFwU3ViRm9ybSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQorICAgIH0NCisgICAgcmV0dXJuIHBTdWJGb3JtLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlKTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRG9jSGFuZGxlcjo6UnVuRG9jU2NyaXB0KFhGQV9IRE9DIGhEb2MsIFhGQV9TQ1JJUFRUWVBFIGVTY3JpcHRUeXBlLCBGWF9XU1RSIHdzU2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWEpTRV9IVkFMVUUgaFRoaXNPYmplY3QpDQorew0KKyAgICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gKChDWEZBX0ZGRG9jKiloRG9jKS0+R2V0WEZBRG9jKCk7DQorICAgIGlmICghcFhGQURvYykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBwWEZBRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gcFNjcmlwdENvbnRleHQtPlJ1blNjcmlwdCgoWEZBX1NDUklQVExBTkdUWVBFKWVTY3JpcHRUeXBlLCB3c1NjcmlwdCwgaFJldFZhbHVlLCBoVGhpc09iamVjdCA/IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXNPYmplY3QsIE5VTEwpIDogTlVMTCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGMwODUzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0RPQ0hBTkRMRVJfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRE9DSEFORExFUl9JTVBfSA0KK2NsYXNzIENYRkFfRkZEb2NIYW5kbGVyIDogcHVibGljIElYRkFfRG9jSGFuZGxlciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGRG9jSGFuZGxlcigpOw0KKyAgICB+Q1hGQV9GRkRvY0hhbmRsZXIoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VEb2MoWEZBX0hET0MgaERvYyk7DQorICAgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlcioJR2V0RG9jUHJvdmlkZXIoWEZBX0hET0MgaERvYyk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldERvY1R5cGUoWEZBX0hET0MgaERvYyk7DQorICAgIHZpcnR1YWwJRlhfSU5UMzIJCVN0YXJ0TG9hZChYRkFfSERPQyBoRG9jKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJRG9Mb2FkKFhGQV9IRE9DIGhEb2MsIElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVN0b3BMb2FkKFhGQV9IRE9DIGhEb2MpOw0KKw0KKyAgICB2aXJ0dWFsIElYRkFfRG9jVmlldyoJQ3JlYXRlRG9jVmlldyhYRkFfSERPQyBoRG9jLCBGWF9EV09SRCBkd1ZpZXcgPSAwKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50UGFja2FnZXMoWEZBX0hET0MgaERvYyk7DQorICAgIHZpcnR1YWwJdm9pZAkJCQlHZXRQYWNrYWdlTmFtZShYRkFfSERPQyBoRG9jLCBGWF9JTlQzMiBpUGFja2FnZSwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1BhY2thZ2UpOw0KKyAgICB2aXJ0dWFsIElGREVfWE1MRWxlbWVudCoJR2V0UGFja2FnZURhdGEoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c1BhY2thZ2UpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTYXZlUGFja2FnZShYRkFfSERPQyBoRG9jLCBGWF9XU1RSIHdzUGFja2FnZSwgSUZYX0ZpbGVXcml0ZSogcEZpbGUsIElYRkFfQ2hlY2tzdW1Db250ZXh0ICpwQ1NDb250ZXh0ID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUNsb3NlRG9jKFhGQV9IRE9DIGhEb2MpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJbXBvcnREYXRhKFhGQV9IRE9DIGhEb2MsIElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiWERQID0gVFJVRSk7DQorICAgIHZpcnR1YWwJdm9pZAkJCVNldEpTRVJ1bnRpbWUoWEZBX0hET0MgaERvYywgRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KKyAgICB2aXJ0dWFsIEZYSlNFX0hWQUxVRQkJR2V0WEZBU2NyaXB0T2JqZWN0KFhGQV9IRE9DIGhEb2MpOw0KKyAgICB2aXJ0dWFsIFhGQV9BVFRSSUJVVEVFTlVNCUdldFJlc3RvcmVTdGF0ZShYRkFfSERPQyBoRG9jKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJUnVuRG9jU2NyaXB0KFhGQV9IRE9DIGhEb2MsIFhGQV9TQ1JJUFRUWVBFIGVTY3JpcHRUeXBlLCBGWF9XU1RSIHdzU2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWEpTRV9IVkFMVUUgaFRoaXNPYmplY3QpOw0KK3Byb3RlY3RlZDoNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jdmlldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2YTVjZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwCkBAIC0wLDAgKzEsOTYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZndsYWRhcHRlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldGhhbmRsZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwdXNoYnV0dG9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmNoZWNrYnV0dG9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmNob2ljZWxpc3QuaCINCisjaW5jbHVkZSAieGZhX2ZmaW1hZ2VlZGl0LmgiDQorI2luY2x1ZGUgInhmYV9mZnRleHRlZGl0LmgiDQorI2luY2x1ZGUgInhmYV9mZmJhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhX2ZmZHJhdy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0LmgiDQorI2luY2x1ZGUgInhmYV9mZnBhdGguaCINCisjaW5jbHVkZSAieGZhX2ZmaW1hZ2UuaCINCisjaW5jbHVkZSAieGZhX2ZmZXhjbGdyb3VwLmgiDQorI2luY2x1ZGUgInhmYV9mZnN1YmZvcm0uaCINCisjaW5jbHVkZSAieGZhX2Zmc2lnbmF0dXJlLmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRhY2MuaCINCitleHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUVOVU0gZ3NfRXZlbnRBY3Rpdml0eVtdID0gew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9DbGljaywNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NDbG9zZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0VudGVyLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9FeGl0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9GdWxsLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fSW5pdGlhbGl6ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VEb3duLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUVudGVyLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUV4aXQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlVXAsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RFeGVjdXRlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3BlbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFByaW50LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2F2ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTdWJtaXQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZUV4ZWN1dGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVByaW50LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTYXZlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTaWduLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTdWJtaXQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duLA0KK307DQorQ1hGQV9GRkRvY1ZpZXc6OkNYRkFfRkZEb2NWaWV3KENYRkFfRkZEb2MqIHBEb2MpDQorICAgIDogbV9wRG9jKHBEb2MpDQorICAgICwgbV9wV2lkZ2V0SGFuZGxlcihOVUxMKQ0KKyAgICAsIG1fcFhGQURvY0xheW91dChOVUxMKQ0KKyAgICAsIG1faVN0YXR1cyhYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZSkNCisgICAgLCBtX2lMb2NrKDApDQorICAgICwgbV9iTGF5b3V0RXZlbnQoRkFMU0UpDQorICAgICwgbV9wRm9jdXNBY2MoTlVMTCkNCisgICAgLCBtX3BGb2N1c1dpZGdldChOVUxMKQ0KKyAgICAsIG1fcExpc3RGb2N1c1dpZGdldChOVUxMKQ0KKyAgICAsIG1fcE9sZEZvY3VzV2lkZ2V0KE5VTEwpDQorICAgICwgbV9iSW5MYXlvdXRTdGF0dXMoRkFMU0UpDQorew0KK30NCitDWEZBX0ZGRG9jVmlldzo6fkNYRkFfRkZEb2NWaWV3KCkNCit7DQorICAgIERlc3Ryb3lEb2NWaWV3KCk7DQorICAgIGlmIChtX3BXaWRnZXRIYW5kbGVyKSB7DQorICAgICAgICBkZWxldGUgbV9wV2lkZ2V0SGFuZGxlcjsNCisgICAgfQ0KKyAgICBtX3BXaWRnZXRIYW5kbGVyID0gTlVMTDsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6SW5pdExheW91dChDWEZBX05vZGUqIHBOb2RlKQ0KK3sNCisgICAgUnVuQmluZEl0ZW1zKCk7DQorICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luZGV4Q2hhbmdlKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRkRvY1ZpZXc6OlN0YXJ0TGF5b3V0KEZYX0lOVDMyIGlTdGFydFBhZ2UgKQ0KK3sNCisgICAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1N0YXJ0Ow0KKyAgICBtX3BEb2MtPkdldFhGQURvYygpLT5Eb1Byb3RvTWVyZ2UoKTsNCisgICAgbV9wRG9jLT5HZXRYRkFEb2MoKS0+RG9EYXRhTWVyZ2UoKTsNCisgICAgbV9wWEZBRG9jTGF5b3V0ID0gR2V0WEZBTGF5b3V0KCk7DQorICAgIEZYX0lOVDMyIGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPlN0YXJ0TGF5b3V0KCk7DQorICAgIGlmIChpU3RhdHVzIDwgMCkgew0KKyAgICAgICAgcmV0dXJuIGlTdGF0dXM7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPSAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgICAgaWYgKCFwUm9vdEl0ZW0pIHsNCisgICAgICAgIHJldHVybiBpU3RhdHVzOw0KKyAgICB9DQorICAgIEluaXRMYXlvdXQocFJvb3RJdGVtKTsNCisgICAgSW5pdENhbGN1bGF0ZShwUm9vdEl0ZW0pOw0KKyAgICBJbml0VmFsaWRhdGUocFJvb3RJdGVtKTsNCisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQorICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydDsNCisgICAgcmV0dXJuIGlTdGF0dXM7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZEb2NWaWV3OjpEb0xheW91dChJRlhfUGF1c2UgKnBQYXVzZSApDQorew0KKyAgICBGWF9JTlQzMiBpU3RhdHVzID0gMTAwOw0KKyAgICBpU3RhdHVzID0gbV9wWEZBRG9jTGF5b3V0LT5Eb0xheW91dChwUGF1c2UpOw0KKyAgICBpZiAoaVN0YXR1cyAhPSAxMDApIHsNCisgICAgICAgIHJldHVybiBpU3RhdHVzOw0KKyAgICB9DQorICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Eb2luZzsNCisgICAgcmV0dXJuIGlTdGF0dXM7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlN0b3BMYXlvdXQoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPSAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgICAgaWYgKCFwUm9vdEl0ZW0pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA9IHBSb290SXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgIGlmICghcFN1YmZvcm1Ob2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPSBwU3ViZm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICBpZighcFBhZ2VTZXROb2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgUnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KKyAgICBSdW5WYWxpZGF0ZSgpOw0KKyAgICBJbml0TGF5b3V0KHBQYWdlU2V0Tm9kZSk7DQorICAgIEluaXRDYWxjdWxhdGUocFBhZ2VTZXROb2RlKTsNCisgICAgSW5pdFZhbGlkYXRlKHBQYWdlU2V0Tm9kZSk7DQorICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFBhZ2VTZXROb2RlLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KKyAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5KTsNCisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9Eb2NSZWFkeSk7DQorICAgIFJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsNCisgICAgUnVuVmFsaWRhdGUoKTsNCisgICAgaWYoUnVuTGF5b3V0KCkpIHsNCisgICAgICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfUmVhZHkpOw0KKyAgICB9DQorICAgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fcEZvY3VzQWNjICYmICFtX3BGb2N1c1dpZGdldCkgew0KKyAgICAgICAgU2V0Rm9jdXNXaWRnZXRBY2MobV9wRm9jdXNBY2MpOw0KKyAgICB9DQorICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQ7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZEb2NWaWV3OjpHZXRMYXlvdXRTdGF0dXMoKQ0KK3sNCisgICAgcmV0dXJuIG1faVN0YXR1czsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6U2hvd051bGxUZXN0TXNnKCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fYXJyTnVsbFRlc3RNc2cuR2V0U2l6ZSgpOw0KKyAgICBDWEZBX0ZGQXBwKiBwQXBwID0gbV9wRG9jLT5HZXRBcHAoKTsNCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gcEFwcC0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKHBBcHBQcm92aWRlciAmJiBpQ291bnQpIHsNCisgICAgICAgIEZYX0lOVDMyIGlSZW1haW4gPSBpQ291bnQgPiA3ID8gaUNvdW50IC0gNyA6IDA7DQorICAgICAgICBpQ291bnQgLT0gaVJlbWFpbjsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTXNnOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgd3NNc2cgKz0gbV9hcnJOdWxsVGVzdE1zZ1tpXSArIEZYX1dTVFJDKEwiXG4iKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpUmVtYWluID4gMCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGltaXQ7DQorICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVMaW1pdCwgd3NMaW1pdCk7DQorICAgICAgICAgICAgaWYgKCF3c0xpbWl0LklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICAgICAgICAgIHdzVGVtcC5Gb3JtYXQoKEZYX0xQQ1dTVFIpd3NMaW1pdCwgaVJlbWFpbik7DQorICAgICAgICAgICAgICAgIHdzTXNnICs9IEZYX1dTVFJDKEwiXG4iKSArIHdzVGVtcDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c01zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9TdGF0dXMsIFhGQV9NQl9PSyk7DQorICAgIH0NCisgICAgbV9hcnJOdWxsVGVzdE1zZy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6VXBkYXRlRG9jVmlldygpDQorew0KKyAgICBpZiAoSXNVcGRhdGVMb2NrZWQoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIExvY2tVcGRhdGUoKTsNCisgICAgRlhfSU5UMzIgaU5ld0FkZHMgPSBtX05ld0FkZGVkTm9kZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaU5ld0FkZHM7IGkrKykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IChDWEZBX05vZGUqKW1fTmV3QWRkZWROb2Rlc1tpXTsNCisgICAgICAgIEluaXRDYWxjdWxhdGUocE5vZGUpOw0KKyAgICAgICAgSW5pdFZhbGlkYXRlKHBOb2RlKTsNCisgICAgICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQorICAgIH0NCisgICAgbV9OZXdBZGRlZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICB0aGlzLT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UoKTsNCisgICAgdGhpcy0+UnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KKyAgICB0aGlzLT5SdW5WYWxpZGF0ZSgpOw0KKyAgICBTaG93TnVsbFRlc3RNc2coKTsNCisgICAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05leHQ7DQorICAgIGlmIChSdW5MYXlvdXQoKSAmJiBtX2JMYXlvdXRFdmVudCkgew0KKyAgICAgICAgUnVuRXZlbnRMYXlvdXRSZWFkeSgpOw0KKyAgICB9DQorICAgIG1fYkxheW91dEV2ZW50ID0gRkFMU0U7DQorICAgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgICAgdGhpcy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgICBVbmxvY2tVcGRhdGUoKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRkRvY1ZpZXc6OkNvdW50UGFnZVZpZXdzKCkNCit7DQorICAgIGlmICghbV9wWEZBRG9jTGF5b3V0KSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wWEZBRG9jTGF5b3V0LT5Db3VudFBhZ2VzKCk7DQorfQ0KK0lYRkFfUGFnZVZpZXcqIENYRkFfRkZEb2NWaWV3OjpHZXRQYWdlVmlldyhGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICBpZiAoIW1fcFhGQURvY0xheW91dCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIChDWEZBX0ZGUGFnZVZpZXcqKW1fcFhGQURvY0xheW91dC0+R2V0UGFnZShuSW5kZXgpOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0QnlOYW1lKEZYX1dTVFIgd3NOYW1lKQ0KK3sNCisgICAgcmV0dXJuIChYRkFfSFdJREdFVClHZXRXaWRnZXRCeU5hbWUod3NOYW1lLCBOVUxMKTsNCit9DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRBY2NCeU5hbWUoRlhfV1NUUiB3c05hbWUpDQorew0KKyAgICByZXR1cm4gR2V0V2lkZ2V0QWNjQnlOYW1lKHdzTmFtZSwgTlVMTCk7DQorfQ0KK0lYRkFfRG9jTGF5b3V0KglDWEZBX0ZGRG9jVmlldzo6R2V0WEZBTGF5b3V0KCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BEb2MtPkdldFhGQURvYygpLT5HZXREb2NMYXlvdXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6UmVzZXRTaW5nbGVXaWRnZXRBY2NEYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsNCisgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZVR5cGUgIT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiTm90aWZ5ID0gSXNTdGF0aWNOb3RpZnkoKTsNCisgICAgcFdpZGdldEFjYy0+UmVzZXREYXRhKCk7DQorICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOw0KKyAgICBpZiAoYk5vdGlmeSkgew0KKyAgICAgICAgcFdpZGdldEFjYy0+Tm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICAgIH0NCisgICAgaWYgKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUgPSBwV2lkZ2V0QWNjLT5HZXRWYWxpZGF0ZSgpKSB7DQorICAgICAgICBBZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsNCisgICAgICAgICgoQ1hGQV9Ob2RlKil2YWxpZGF0ZSktPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgVFJVRSwgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSZXNldFdpZGdldERhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgKQ0KK3sNCisgICAgbV9iTGF5b3V0RXZlbnQgPSBUUlVFOw0KKyAgICBGWF9CT09MIGJDaGFuZ2VkID0gRkFMU0U7DQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gTlVMTDsNCisgICAgaWYgKHBXaWRnZXRBY2MpIHsNCisgICAgICAgIGJDaGFuZ2VkID0gUmVzZXRTaW5nbGVXaWRnZXRBY2NEYXRhKHBXaWRnZXRBY2MpOw0KKyAgICAgICAgcEZvcm1Ob2RlID0gcFdpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZvcm1Ob2RlID0gR2V0Um9vdFN1YmZvcm0oKTsNCisgICAgfQ0KKyAgICBpZiAoIXBGb3JtTm9kZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBwRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IgSXRlcmF0b3IodGhpcywgcEZvcm1Ob2RlKTsNCisgICAgICAgIHdoaWxlIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IEl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIGJDaGFuZ2VkIHw9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwQWNjKTsNCisgICAgICAgICAgICBpZiAocEFjYy0+R2V0Tm9kZSgpLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICAgICAgICAgIEl0ZXJhdG9yLlNraXBUcmVlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQ2hhbmdlZCkgew0KKyAgICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKChYRkFfSERPQyltX3BEb2MpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZEb2NWaWV3OjpQcm9jZXNzV2lkZ2V0RXZlbnQoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0sIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjICkNCit7DQorICAgIGlmIChwUGFyYW0gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICB9DQorICAgIGlmIChwUGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX1ZhbGlkYXRlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbGlkYXRlU3RyID0gRlhfV1NUUkMoTCJwcmVTdWJtaXQiKTsNCisgICAgICAgIENYRkFfTm9kZSogcENvbmZpZ0l0ZW0gPSAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Db25maWcpOw0KKyAgICAgICAgaWYgKHBDb25maWdJdGVtKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsaWRhdGVOb2RlID0gTlVMTDsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBBY3JvYmF0Tm9kZSA9IHBDb25maWdJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgICAgICAgICAgICBwVmFsaWRhdGVOb2RlID0gcEFjcm9iYXROb2RlID8gcEFjcm9iYXROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSkgOiBOVUxMOw0KKyAgICAgICAgICAgIGlmICghcFZhbGlkYXRlTm9kZSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQcmVzZW50Tm9kZSA9IHBDb25maWdJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QcmVzZW50KTsNCisgICAgICAgICAgICAgICAgcFZhbGlkYXRlTm9kZSA9IHBQcmVzZW50Tm9kZSA/IHBQcmVzZW50Tm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsaWRhdGUpIDogTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBWYWxpZGF0ZU5vZGUpIHsNCisgICAgICAgICAgICAgICAgd3NWYWxpZGF0ZVN0ciA9IHBWYWxpZGF0ZU5vZGUtPkdldENvbnRlbnQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJWYWxpZGF0ZSA9IEZBTFNFOw0KKyAgICAgICAgc3dpdGNoIChwUGFyYW0tPm1faVZhbGlkYXRlQWN0aXZpdGllcykgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVN1Ym1pdDoNCisgICAgICAgICAgICAgICAgYlZhbGlkYXRlID0gd3NWYWxpZGF0ZVN0ci5GaW5kKEwicHJlU3VibWl0IikgIT0gLTE7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVByaW50Og0KKyAgICAgICAgICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVQcmludCIpICE9IC0xOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9WQUxJREFURV9wcmVFeGVjdXRlOg0KKyAgICAgICAgICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVFeGVjdXRlIikgIT0gLTE7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVNhdmU6DQorICAgICAgICAgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZVNhdmUiKSAhPSAtMTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJWYWxpZGF0ZSkgew0KKyAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MgPyBwV2lkZ2V0QWNjLT5HZXROb2RlKCkgOiBOVUxMOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBSb290SXRlbSA9IChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICAgICAgaWYgKCFwUm9vdEl0ZW0pIHsNCisgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZSA9IHBSb290SXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgIH0NCisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgcFBhcmFtLT5tX2VUeXBlLCBwUGFyYW0tPm1fYklzRm9ybVJlYWR5KTsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCit9DQorSVhGQV9XaWRnZXRIYW5kbGVyKiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0SGFuZGxlcigpDQorew0KKyAgICBpZiAoIW1fcFdpZGdldEhhbmRsZXIpIHsNCisgICAgICAgIG1fcFdpZGdldEhhbmRsZXIgPSBGWF9ORVcgQ1hGQV9GRldpZGdldEhhbmRsZXIodGhpcyk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFdpZGdldEhhbmRsZXI7DQorfQ0KK0lYRkFfV2lkZ2V0SXRlcmF0b3IqIENYRkFfRkZEb2NWaWV3OjpDcmVhdGVXaWRnZXRJdGVyYXRvcigpDQorew0KKyAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IEdldFJvb3RTdWJmb3JtKCk7DQorICAgIGlmICghcEZvcm1Sb290KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfTkVXIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcih0aGlzLCBwRm9ybVJvb3QpOw0KK30NCitJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBDWEZBX0ZGRG9jVmlldzo6Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoWEZBX1dJREdFVE9SREVSIGVPcmRlciApDQorew0KKyAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IEdldFJvb3RTdWJmb3JtKCk7DQorICAgIGlmICghcEZvcm1Sb290KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfTkVXIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IodGhpcywgcEZvcm1Sb290KTsNCit9DQorWEZBX0hXSURHRVQgQ1hGQV9GRkRvY1ZpZXc6OkdldEZvY3VzV2lkZ2V0KCkNCit7DQorICAgIHJldHVybiAoWEZBX0hXSURHRVQpbV9wRm9jdXNXaWRnZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OktpbGxGb2N1cygpDQorew0KKyAgICBpZiAobV9wRm9jdXNXaWRnZXQgJiYgKG1fcEZvY3VzV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZCkpIHsNCisgICAgICAgIChtX3BGb2N1c1dpZGdldCktPk9uS2lsbEZvY3VzKE5VTEwpOw0KKyAgICB9DQorICAgIG1fcEZvY3VzQWNjID0gTlVMTDsNCisgICAgbV9wRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgICBtX3BPbGRGb2N1c1dpZGdldCA9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlNldEZvY3VzKFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwTmV3Rm9jdXMgPSAoQ1hGQV9GRldpZGdldCopaFdpZGdldDsNCisgICAgaWYgKG1fcE9sZEZvY3VzV2lkZ2V0ID09IHBOZXdGb2N1cykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfRkZXaWRnZXQqIHBPbGRGb2N1cyA9IG1fcE9sZEZvY3VzV2lkZ2V0Ow0KKyAgICBtX3BPbGRGb2N1c1dpZGdldCA9IHBOZXdGb2N1czsNCisgICAgaWYgKHBPbGRGb2N1cykgew0KKyAgICAgICAgaWYgKG1fcEZvY3VzV2lkZ2V0ICE9IG1fcE9sZEZvY3VzV2lkZ2V0ICYmIChwT2xkRm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKSkgew0KKyAgICAgICAgICAgIG1fcEZvY3VzV2lkZ2V0ID0gcE9sZEZvY3VzOw0KKyAgICAgICAgICAgIHBPbGRGb2N1cy0+T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsNCisgICAgICAgIH0gZWxzZSBpZiAoKHBPbGRGb2N1cy0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQorICAgICAgICAgICAgaWYgKCFwT2xkRm9jdXMtPklzTG9hZGVkKCkpIHsNCisgICAgICAgICAgICAgICAgcE9sZEZvY3VzLT5Mb2FkV2lkZ2V0KCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBPbGRGb2N1cy0+T25TZXRGb2N1cyhtX3BGb2N1c1dpZGdldCk7DQorICAgICAgICAgICAgbV9wRm9jdXNXaWRnZXQgPSBwT2xkRm9jdXM7DQorICAgICAgICAgICAgcE9sZEZvY3VzLT5PbktpbGxGb2N1cyhwTmV3Rm9jdXMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BGb2N1c1dpZGdldCA9PSBtX3BPbGRGb2N1c1dpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHBOZXdGb2N1cyA9IG1fcE9sZEZvY3VzV2lkZ2V0Ow0KKyAgICBpZiAobV9wTGlzdEZvY3VzV2lkZ2V0ICYmIHBOZXdGb2N1cyA9PSBtX3BMaXN0Rm9jdXNXaWRnZXQpIHsNCisgICAgICAgIG1fcEZvY3VzQWNjID0gTlVMTDsNCisgICAgICAgIG1fcEZvY3VzV2lkZ2V0ID0gTlVMTDsNCisgICAgICAgIG1fcExpc3RGb2N1c1dpZGdldCA9IE5VTEw7DQorICAgICAgICBtX3BPbGRGb2N1c1dpZGdldCA9IE5VTEw7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBOZXdGb2N1cyAmJiAocE5ld0ZvY3VzLT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgICAgIGlmICghcE5ld0ZvY3VzLT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICAgICAgcE5ld0ZvY3VzLT5Mb2FkV2lkZ2V0KCk7DQorICAgICAgICB9DQorICAgICAgICBwTmV3Rm9jdXMtPk9uU2V0Rm9jdXMobV9wRm9jdXNXaWRnZXQpOw0KKyAgICB9DQorICAgIG1fcEZvY3VzQWNjID0gcE5ld0ZvY3VzID8gcE5ld0ZvY3VzLT5HZXREYXRhQWNjKCkgOiBOVUxMOw0KKyAgICBtX3BGb2N1c1dpZGdldCA9IHBOZXdGb2N1czsNCisgICAgbV9wT2xkRm9jdXNXaWRnZXQgPSBtX3BGb2N1c1dpZGdldDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGRG9jVmlldzo6R2V0Rm9jdXNXaWRnZXRBY2MoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEZvY3VzQWNjOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpTZXRGb2N1c1dpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykNCit7DQorICAgIENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cyA9IHBXaWRnZXRBY2MgPyBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpIDogTlVMTDsNCisgICAgaWYgKFNldEZvY3VzKChYRkFfSFdJREdFVClwTmV3Rm9jdXMpKSB7DQorICAgICAgICBtX3BGb2N1c0FjYyA9IHBXaWRnZXRBY2M7DQorICAgICAgICBpZiAobV9pU3RhdHVzID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCisgICAgICAgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KChYRkFfSERPQyltX3BEb2MsIChYRkFfSFdJREdFVCltX3BGb2N1c1dpZGdldCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6RGVsZXRlTGF5b3V0SXRlbShDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KQ0KK3sNCisgICAgaWYgKG1fcEZvY3VzQWNjID09IHBXaWRnZXQtPkdldERhdGFBY2MoKSkgew0KKyAgICAgICAgbV9wRm9jdXNBY2MgPSBOVUxMOw0KKyAgICAgICAgbV9wRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgICAgICAgbV9wT2xkRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBGWF9JTlQzMiBYRkFfUHJvY2Vzc0V2ZW50KENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKQ0KK3sNCisgICAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIH0NCisgICAgaWYgKCFwV2lkZ2V0QWNjIHx8IHBXaWRnZXRBY2MtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIH0NCisgICAgc3dpdGNoIChwUGFyYW0tPm1fZVR5cGUpIHsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX0NhbGN1bGF0ZToNCisgICAgICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc0NhbGN1bGF0ZSgpOw0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfVmFsaWRhdGU6DQorICAgICAgICAgICAgaWYgKCgoQ1hGQV9GRkRvYyopcERvY1ZpZXctPkdldERvYygpKS0+R2V0RG9jUHJvdmlkZXIoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQocERvY1ZpZXctPkdldERvYygpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc1ZhbGlkYXRlKDB4MDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlOiB7DQorICAgICAgICAgICAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsNCisgICAgICAgICAgICAgICAgaWYgKCFjYWxjKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KHNjcmlwdCwgcFBhcmFtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSZXQgPSBwV2lkZ2V0QWNjLT5Qcm9jZXNzRXZlbnQoZ3NfRXZlbnRBY3Rpdml0eVtwUGFyYW0tPm1fZVR5cGVdLCBwUGFyYW0pOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRkRvY1ZpZXc6OkV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwgRlhfQk9PTCBiSXNGb3JtUmVhZHksIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgQ1hGQV9Ob2RlKiBwRXhjbHVkZSkNCit7DQorICAgIEZYX0lOVDMyIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgaWYgKHBGb3JtTm9kZSA9PSBwRXhjbHVkZSkgew0KKyAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgWEZBX0VMRU1FTlQgZWxlbWVudFR5cGUgPSBwRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICBpZiAoZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfSW5kZXhDaGFuZ2UpIHsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwV2lkZ2V0QWNjID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsNCisgICAgICAgIGVQYXJhbS5tX2JJc0Zvcm1SZWFkeSA9IGJJc0Zvcm1SZWFkeTsNCisgICAgICAgIHJldHVybiBYRkFfUHJvY2Vzc0V2ZW50KHRoaXMsIHBXaWRnZXRBY2MsICZlUGFyYW0pOw0KKyAgICB9DQorICAgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSkgew0KKyAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzICYmIGVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICAgICAgICAgICAgaVJldCB8PSBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBlRXZlbnRUeXBlLCBiSXNGb3JtUmVhZHksIGJSZWN1cnNpdmUsIHBFeGNsdWRlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAocFdpZGdldEFjYyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7DQorICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBwV2lkZ2V0QWNjOw0KKyAgICBlUGFyYW0ubV9iSXNGb3JtUmVhZHkgPSBiSXNGb3JtUmVhZHk7DQorICAgIGlSZXQgfD0gWEZBX1Byb2Nlc3NFdmVudCh0aGlzLCBwV2lkZ2V0QWNjLCAmZVBhcmFtKTsNCisgICAgcmV0dXJuIGlSZXQ7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRCeU5hbWUoRlhfV1NUUiB3c05hbWUsIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQgKQ0KK3sNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZBY2MgPSBwUmVmV2lkZ2V0ID8gcFJlZldpZGdldC0+R2V0RGF0YUFjYygpIDogTlVMTDsNCisgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gR2V0V2lkZ2V0QWNjQnlOYW1lKHdzTmFtZSwgcFJlZkFjYykpIHsNCisgICAgICAgIHJldHVybiBwQWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEFjY0J5TmFtZShGWF9XU1RSIHdzTmFtZSwgQ1hGQV9XaWRnZXRBY2MqIHBSZWZXaWRnZXRBY2MgKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50Ow0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHJlZk5vZGUgPSBOVUxMOw0KKyAgICBpZihwUmVmV2lkZ2V0QWNjICE9IE5VTEwpIHsNCisgICAgICAgIHJlZk5vZGUgPSBwUmVmV2lkZ2V0QWNjLT5HZXROb2RlKCk7DQorICAgICAgICB3c0V4cHJlc3Npb24gPSB3c05hbWU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c0V4cHJlc3Npb24gPSBMIiRmb3JtLiIgKyB3c05hbWU7DQorICAgIH0NCisgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgRlhfSU5UMzIgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCB3c0V4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZHdTdHlsZSk7DQorICAgIGlmIChpUmV0IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KKyAgICAgICAgQ1hGQV9PYmplY3QqIHBOb2RlID0gcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KKyAgICAgICAgaWYocE5vZGUtPklzTm9kZSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIChDWEZBX1dpZGdldEFjYyopKChDWEZBX05vZGUqKXBOb2RlKS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpPblBhZ2VFdmVudChJWEZBX0xheW91dFBhZ2UgKnBTZW5kZXIsIFhGQV9QQUdFRVZFTlQgZUV2ZW50LCBGWF9JTlQzMiBpUGFnZUluZGV4KQ0KK3sNCisgICAgRlhfQk9PTCBiTm9maWZ5ID0gbV9pU3RhdHVzID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQ7DQorICAgIGlmIChlRXZlbnQgPT0gWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCkgew0KKyAgICAgICAgaWYgKGJOb2ZpZnkpIHsNCisgICAgICAgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlBhZ2VWaWV3RXZlbnQoKENYRkFfRkZQYWdlVmlldyopcFNlbmRlciwgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdFJlbW92ZWQpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGVFdmVudCA9PSBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCkgew0KKyAgICAgICAgaWYgKGJOb2ZpZnkpIHsNCisgICAgICAgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlBhZ2VWaWV3RXZlbnQoKENYRkFfRkZQYWdlVmlldyopcFNlbmRlciwgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdEFkZGVkKTsNCisgICAgICAgICAgICAoKENYRkFfRkZQYWdlVmlldyopcFNlbmRlciktPkxvYWRQYWdlVmlldygpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkxvY2tVcGRhdGUoKQ0KK3sNCisgICAgbV9pTG9jaysrOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpVbmxvY2tVcGRhdGUoKQ0KK3sNCisgICAgbV9pTG9jay0tOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2NWaWV3OjpJc1VwZGF0ZUxvY2tlZCgpDQorew0KKyAgICByZXR1cm4gbV9pTG9jazsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6Q2xlYXJJbnZhbGlkYXRlTGlzdCgpDQorew0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHMpIHsNCisgICAgICAgIHZvaWQqIHBQYWdlVmlldyA9IE5VTEw7DQorICAgICAgICBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTDsNCisgICAgICAgIG1fbWFwUGFnZUludmFsaWRhdGUuR2V0TmV4dEFzc29jKHBzLCBwUGFnZVZpZXcsICh2b2lkKiYpcFJlY3QpOw0KKyAgICAgICAgZGVsZXRlIHBSZWN0Ow0KKyAgICB9DQorICAgIG1fbWFwUGFnZUludmFsaWRhdGUuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEludmFsaWRhdGVSZWN0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcnRJbnZhbGlkYXRlKQ0KK3sNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QocFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgcnRJbnZhbGlkYXRlKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkSW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDRlhfUmVjdEYgJnJ0SW52YWxpZGF0ZSkNCit7DQorICAgIENGWF9SZWN0RiogcFJlY3QgPSAoQ0ZYX1JlY3RGKiltX21hcFBhZ2VJbnZhbGlkYXRlLkdldFZhbHVlQXQocFBhZ2VWaWV3KTsNCisgICAgaWYgKCFwUmVjdCkgew0KKyAgICAgICAgcFJlY3QgPSBGWF9ORVcgQ0ZYX1JlY3RGOw0KKyAgICAgICAgcFJlY3QtPlNldChydEludmFsaWRhdGUubGVmdCwgcnRJbnZhbGlkYXRlLnRvcCwgcnRJbnZhbGlkYXRlLndpZHRoLCBydEludmFsaWRhdGUuaGVpZ2h0KTsNCisgICAgICAgIG1fbWFwUGFnZUludmFsaWRhdGUuU2V0QXQocFBhZ2VWaWV3LCBwUmVjdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwUmVjdC0+VW5pb24ocnRJbnZhbGlkYXRlKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5JbnZhbGlkYXRlKCkNCit7DQorICAgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBQYWdlSW52YWxpZGF0ZS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsNCisgICAgICAgIENGWF9SZWN0RiogcFJlY3QgPSBOVUxMOw0KKyAgICAgICAgbV9tYXBQYWdlSW52YWxpZGF0ZS5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFBhZ2VWaWV3LCAodm9pZComKXBSZWN0KTsNCisgICAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+SW52YWxpZGF0ZVJlY3QocFBhZ2VWaWV3LCAqcFJlY3QpOw0KKyAgICAgICAgZGVsZXRlIHBSZWN0Ow0KKyAgICB9DQorICAgIG1fbWFwUGFnZUludmFsaWRhdGUuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkxheW91dCgpDQorew0KKyAgICBMb2NrVXBkYXRlKCk7DQorICAgIG1fYkluTGF5b3V0U3RhdHVzID0gVFJVRTsNCisgICAgaWYgKCFtX3BYRkFEb2NMYXlvdXQtPkluY3JlbWVudExheW91dCgpICYmIG1fcFhGQURvY0xheW91dC0+U3RhcnRMYXlvdXQoKSA8IDEwMCkgew0KKyAgICAgICAgbV9wWEZBRG9jTGF5b3V0LT5Eb0xheW91dCgpOw0KKyAgICAgICAgVW5sb2NrVXBkYXRlKCk7DQorICAgICAgICBtX2JJbkxheW91dFN0YXR1cyA9IEZBTFNFOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgbV9iSW5MYXlvdXRTdGF0dXMgPSBGQUxTRTsNCisgICAgVW5sb2NrVXBkYXRlKCk7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuU3ViZm9ybUluZGV4Q2hhbmdlKCkNCit7DQorICAgIEZYX0lOVDMyIGlTdWJmb3JtcyA9IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVN1YmZvcm1zOyBpKyspIHsNCisgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gKENYRkFfTm9kZSopbV9JbmRleENoYW5nZWRTdWJmb3Jtc1tpXTsNCisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwU3ViZm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0luZGV4Q2hhbmdlOw0KKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBXaWRnZXRBY2M7DQorICAgICAgICBwV2lkZ2V0QWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2UsICZlUGFyYW0pOw0KKyAgICB9DQorICAgIG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBtX05ld0FkZGVkTm9kZXMuQWRkKHBOb2RlKTsNCisgICAgdGhpcy0+SW5pdExheW91dChwTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gKTsNCisgICAgbV9JbmRleENoYW5nZWRTdWJmb3Jtcy5BZGQocE5vZGUpOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5Eb2NDbG9zZSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBSb290SXRlbSA9IChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICBpZiAoIXBSb290SXRlbSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfRG9jQ2xvc2UpOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpEZXN0cm95RG9jVmlldygpDQorew0KKyAgICBDbGVhckludmFsaWRhdGVMaXN0KCk7DQorICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Ob25lOw0KKyAgICBtX2lMb2NrID0gMDsNCisgICAgbV9WYWxpZGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQorICAgIG1fYmluZEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICBtX0NhbGN1bGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OklzU3RhdGljTm90aWZ5KCkNCit7DQorICAgIHJldHVybiAgbV9wRG9jLT5HZXREb2NUeXBlKCkgPT0gWEZBX0RPQ1RZUEVfU3RhdGljOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpDQorew0KKyAgICBGWF9JTlQzMiBpQWNjcyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwQ3VycmVudEFjYyA9IChpQWNjcyA8IDEpID8gKENYRkFfV2lkZ2V0QWNjKilOVUxMIDogKENYRkFfV2lkZ2V0QWNjKiltX0NhbGN1bGF0ZUFjY3NbaUFjY3MgLSAxXTsNCisgICAgaWYgKHBDdXJyZW50QWNjICE9IHBXaWRnZXRBY2MpIHsNCisgICAgICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFdpZGdldEFjYyk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShDWEZBX05vZGUqIHBOb2RlQ2hhbmdlKQ0KK3sNCisgICAgQ1hGQV9DYWxjRGF0YSogcEdsb2JhbERhdGEgPSAoQ1hGQV9DYWxjRGF0YSopcE5vZGVDaGFuZ2UtPkdldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHBHbG9iYWxEYXRhID8gcEdsb2JhbERhdGEtPm1fR2xvYmFscy5HZXRTaXplKCkgOiAwOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgIGlDb3VudDsgaSsrKSB7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcFJlc3VsdEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEdsb2JhbERhdGEtPm1fR2xvYmFsc1tpXTsNCisgICAgICAgIGlmIChwUmVzdWx0QWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpQWNjcyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcEN1cnJlbnRBY2MgPSAoaUFjY3MgPCAxKSA/IChDWEZBX1dpZGdldEFjYyopTlVMTCA6IChDWEZBX1dpZGdldEFjYyopbV9DYWxjdWxhdGVBY2NzW2lBY2NzIC0gMV07DQorICAgICAgICBpZiAocEN1cnJlbnRBY2MgIT0gcFJlc3VsdEFjYykgew0KKyAgICAgICAgICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFJlc3VsdEFjYyk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuQ2FsY3VsYXRlUmVjdXJzaXZlKEZYX0lOVDMyJiBpSW5kZXgpDQorew0KKyAgICB3aGlsZSAoaUluZGV4IDwgbV9DYWxjdWxhdGVBY2NzLkdldFNpemUoKSkgew0KKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpSW5kZXhdOw0KKyAgICAgICAgQWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShwQ3VyQWNjLT5HZXROb2RlKCkpOw0KKyAgICAgICAgRlhfSU5UMzIgaVJlZkNvdW50ID0gKEZYX0lOVDMyKShGWF9VSU5UUFRSKXBDdXJBY2MtPkdldE5vZGUoKS0+R2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCk7DQorICAgICAgICBpUmVmQ291bnQrKzsNCisgICAgICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilpUmVmQ291bnQpOw0KKyAgICAgICAgaWYgKGlSZWZDb3VudCA+IDExKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKHBDdXJBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKSkgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSB7DQorICAgICAgICAgICAgQWRkVmFsaWRhdGVXaWRnZXQocEN1ckFjYyk7DQorICAgICAgICB9DQorICAgICAgICBpSW5kZXgrKzsNCisgICAgICAgIFJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpSW5kZXgpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZEb2NWaWV3OjpSdW5DYWxjdWxhdGVXaWRnZXRzKCkNCit7DQorICAgIGlmICghbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5Jc0NhbGN1bGF0aW9uc0VuYWJsZWQoKFhGQV9IRE9DKW1fcERvYykpIHsNCisgICAgICAgIHJldHVybiAgWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50cyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIGlmIChpQ291bnRzID4gMCkgew0KKyAgICAgICAgUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGlJbmRleCk7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpXTsNCisgICAgICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUikwKTsNCisgICAgfQ0KKyAgICBtX0NhbGN1bGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZFZhbGlkYXRlV2lkZ2V0KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0KQ0KK3sNCisgICAgaWYgKG1fVmFsaWRhdGVBY2NzLkZpbmQocFdpZGdldCkgPCAwKSB7DQorICAgICAgICBtX1ZhbGlkYXRlQWNjcy5BZGQocFdpZGdldCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6SW5pdENhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKQ0KK3sNCisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6SW5pdFZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBpZiAoIW1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQoKFhGQV9IRE9DKW1fcERvYykpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KKyAgICBtX1ZhbGlkYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1blZhbGlkYXRlKCkNCit7DQorICAgIGlmICghbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZCgoWEZBX0hET0MpbV9wRG9jKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudHMgPSBtX1ZhbGlkYXRlQWNjcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnRzOyBpKyspIHsNCisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gKENYRkFfV2lkZ2V0QWNjKiltX1ZhbGlkYXRlQWNjc1tpXTsNCisgICAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwQWNjLT5Qcm9jZXNzVmFsaWRhdGUoKTsNCisgICAgfQ0KKyAgICBtX1ZhbGlkYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkV2ZW50TGF5b3V0UmVhZHkoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPSAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgICAgaWYgKCFwUm9vdEl0ZW0pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5KTsNCisgICAgUnVuTGF5b3V0KCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5CaW5kSXRlbXMoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9iaW5kSXRlbXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIGlmICgoKENYRkFfTm9kZSopbV9iaW5kSXRlbXNbaV0pLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSA9ICgoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBXaWRnZXROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAoIXBBY2MpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfQmluZEl0ZW1zIGJpbmRpdGVtcygoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSk7DQorICAgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gcFdpZGdldE5vZGUtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZjsNCisgICAgICAgIGJpbmRpdGVtcy5HZXRSZWYod3NSZWYpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7DQorICAgICAgICBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocFdpZGdldE5vZGUsIHdzUmVmLCBycywgZHdTdHlsZSk7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBycy5ub2Rlcy5HZXRTaXplKCk7DQorICAgICAgICBwQWNjLT5EZWxldGVJdGVtKC0xKTsNCisgICAgICAgIGlmIChycy5kd0ZsYWdzICE9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcyB8fCBpQ291bnQgPCAxKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZVJlZiwgd3NMYWJlbFJlZjsNCisgICAgICAgIGJpbmRpdGVtcy5HZXRWYWx1ZVJlZih3c1ZhbHVlUmVmKTsNCisgICAgICAgIGJpbmRpdGVtcy5HZXRMYWJlbFJlZih3c0xhYmVsUmVmKTsNCisgICAgICAgIEZYX0JPT0wgYlVzZVZhbHVlID0gd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSB3c1ZhbHVlUmVmOw0KKyAgICAgICAgRlhfQk9PTCBiTGFiZWxVc2VDb250ZW50ID0gd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSBGWF9XU1RSQyhMIiQiKTsNCisgICAgICAgIEZYX0JPT0wgYlZhbHVlVXNlQ29udGVudCA9IHdzVmFsdWVSZWYuSXNFbXB0eSgpIHx8IHdzVmFsdWVSZWYgPT0gRlhfV1NUUkMoTCIkIik7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlLCB3c0xhYmVsOw0KKyAgICAgICAgRlhfRFdPUkQgdVZhbHVlSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKENGWF9XaWRlU3RyaW5nKHdzVmFsdWVSZWYpLCB3c1ZhbHVlUmVmLkdldExlbmd0aCgpKTsNCisgICAgICAgIEZYX0RXT1JEIHVMYWJsZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhDRlhfV2lkZVN0cmluZyh3c0xhYmVsUmVmKSwgd3NMYWJlbFJlZi5HZXRMZW5ndGgoKSk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgICBDWEZBX09iamVjdCogcmVmT2JqID0gcnMubm9kZXNbaV07DQorICAgICAgICAgICAgaWYoIXJlZk9iai0+SXNOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcmVmTm9kZSA9IChDWEZBX05vZGUqKXJlZk9iajsNCisgICAgICAgICAgICBpZiAoYlZhbHVlVXNlQ29udGVudCkgew0KKyAgICAgICAgICAgICAgICB3c1ZhbHVlID0gcmVmTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogbm9kZVZhbHVlID0gcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh1VmFsdWVIYXNoKTsNCisgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gcmVmTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IG5vZGVWYWx1ZS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYlVzZVZhbHVlKSB7DQorICAgICAgICAgICAgICAgIGlmIChiTGFiZWxVc2VDb250ZW50KSB7DQorICAgICAgICAgICAgICAgICAgICB3c0xhYmVsID0gcmVmTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBub2RlTGFiZWwgPSAgcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c0xhYmVsUmVmKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTGFiZWwgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzTGFiZWwgPSBub2RlTGFiZWwtPkdldENvbnRlbnQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHdzTGFiZWwgPSB3c1ZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQWNjLT5JbnNlcnRJdGVtKHdzTGFiZWwsIHdzVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fYmluZEl0ZW1zLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpTZXRDaGFuZ2VNYXJrKCkNCit7DQorICAgIGlmIChtX2lTdGF0dXMgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKChYRkFfSERPQyltX3BEb2MpOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZEb2NWaWV3OjpHZXRSb290U3ViZm9ybSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBGb3JtUGFja2V0Tm9kZSA9IChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICBpZiAoIXBGb3JtUGFja2V0Tm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorfQ0KK0NYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCkNCisgICAgOiBtX0NvbnRlbnRJdGVyYXRvcihwVHJhdmVsUm9vdCkNCit7DQorICAgIG1fcERvY1ZpZXcgPSBwRG9jVmlldzsNCisgICAgbV9wQ3VyV2lkZ2V0ID0gTlVMTDsNCit9DQorQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjp+Q1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpSZXNldCgpDQorew0KKyAgICBtX0NvbnRlbnRJdGVyYXRvci5SZXNldCgpOw0KKyAgICBtX3BDdXJXaWRnZXQgPSBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK1hGQV9IV0lER0VUIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6TW92ZVRvTmV4dCgpDQorew0KKyAgICBDWEZBX05vZGUqIHBJdGVtID0gbV9wQ3VyV2lkZ2V0ID8gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpIDogbV9Db250ZW50SXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICB3aGlsZSAocEl0ZW0pIHsNCisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEl0ZW0tPkdldFdpZGdldERhdGEoKSkgew0KKyAgICAgICAgICAgIHdoaWxlICgobV9wQ3VyV2lkZ2V0ID0gcEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cldpZGdldC0+SXNMb2FkZWQoKSAmJiAobV9wQ3VyV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcEN1cldpZGdldC0+TG9hZFdpZGdldCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiAoWEZBX0hXSURHRVQpbV9wQ3VyV2lkZ2V0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpTZXRDdXJyZW50V2lkZ2V0KFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0lYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIFhGQV9XaWRnZXRBY2NJdGVyYXRvcl9DcmVhdGUoQ1hGQV9XaWRnZXRBY2MqIHBUcmF2ZWxSb290LCBYRkFfV0lER0VUT1JERVIgZU9yZGVyKQ0KK3sNCisgICAgaWYgKCFwVHJhdmVsUm9vdCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKHBUcmF2ZWxSb290LT5HZXREb2NWaWV3KCksIHBUcmF2ZWxSb290LT5HZXROb2RlKCkpOw0KK30NCitDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCkNCisgICAgOiBtX0NvbnRlbnRJdGVyYXRvcihwVHJhdmVsUm9vdCkNCit7DQorICAgIG1fcERvY1ZpZXcgPSBwRG9jVmlldzsNCisgICAgbV9wQ3VyV2lkZ2V0QWNjID0gTlVMTDsNCit9DQorQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6fkNYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoKQ0KK3sNCit9DQordm9pZCBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpSZXNldCgpDQorew0KKyAgICBtX3BDdXJXaWRnZXRBY2MgPSBOVUxMOw0KKyAgICBtX0NvbnRlbnRJdGVyYXRvci5SZXNldCgpOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvTmV4dCgpDQorew0KKyAgICBDWEZBX05vZGUqIHBJdGVtID0gbV9wQ3VyV2lkZ2V0QWNjID8gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpIDogbV9Db250ZW50SXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICB3aGlsZSAocEl0ZW0pIHsNCisgICAgICAgIGlmICgobV9wQ3VyV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSXRlbS0+R2V0V2lkZ2V0RGF0YSgpKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIG1fcEN1cldpZGdldEFjYzsNCisgICAgICAgIH0NCisgICAgICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvUHJldmlvdXMoKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKglDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0QWNjKCkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6U2tpcFRyZWUoKQ0KK3sNCisgICAgbV9Db250ZW50SXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KKyAgICBtX3BDdXJXaWRnZXRBY2MgPSBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3MzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuaApAQCAtMCwwICsxLDE2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRE9DVklFV19JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9ET0NWSUVXX0lNUF9IDQorY2xhc3MgQ1hGQV9GRlBhZ2VWaWV3Ow0KK2NsYXNzIENYRkFfRkZXaWRnZXRIYW5kbGVyOw0KK2NsYXNzIENYRkFfRkZEb2M7DQorY2xhc3MgQ1hGQV9GRldpZGdldDsNCitleHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUVOVU0gZ3NfRXZlbnRBY3Rpdml0eVtdOw0KK2VudW0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTIHsNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05vbmUsDQorICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydCwNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Jbml0aWFsaXplLA0KKyAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRDYWxjdWxhdGUsDQorICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdFZhbGlkYXRlLA0KKyAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUZvcm1SZWFkeSwNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0RvaW5nLA0KKyAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRpYWxpemUsDQorICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19QYWdlc2V0SW5pdENhbGN1bGF0ZSwNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0VmFsaWRhdGUsDQorICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19QYWdlc2V0Rm9ybVJlYWR5LA0KKyAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTGF5b3V0UmVhZHksDQorICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Eb2NSZWFkeSwNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCwNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05leHQsDQorfTsNCitjbGFzcyBDWEZBX0ZGRG9jVmlldyA6IHB1YmxpYyBJWEZBX0RvY1ZpZXcsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRkRvY1ZpZXcoQ1hGQV9GRkRvYyogcERvYyk7DQorICAgIH5DWEZBX0ZGRG9jVmlldygpOw0KKyAgICB2aXJ0dWFsIFhGQV9IRE9DCQlHZXREb2MoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKFhGQV9IRE9DKW1fcERvYzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsCUZYX0lOVDMyCQlTdGFydExheW91dChGWF9JTlQzMiBpU3RhcnRQYWdlID0gMCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCURvTGF5b3V0KElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVN0b3BMYXlvdXQoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0TGF5b3V0U3RhdHVzKCk7DQorICAgIHZpcnR1YWwJdm9pZAkJCVVwZGF0ZURvY1ZpZXcoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJQ291bnRQYWdlVmlld3MoKTsNCisgICAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KglHZXRQYWdlVmlldyhGWF9JTlQzMiBuSW5kZXgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQlHZXRXaWRnZXRCeU5hbWUoRlhfV1NUUiB3c05hbWUpOw0KKyAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBHZXRXaWRnZXRBY2NCeU5hbWUoRlhfV1NUUiB3c05hbWUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZXNldFdpZGdldERhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJUHJvY2Vzc1dpZGdldEV2ZW50KENYRkFfRXZlbnRQYXJhbSogcFBhcmFtLCBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0SGFuZGxlcioJCQlHZXRXaWRnZXRIYW5kbGVyKCk7DQorICAgIHZpcnR1YWwgSVhGQV9XaWRnZXRJdGVyYXRvcioJCUNyZWF0ZVdpZGdldEl0ZXJhdG9yKCk7DQorICAgIHZpcnR1YWwgSVhGQV9XaWRnZXRBY2NJdGVyYXRvcioJCUNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKFhGQV9XSURHRVRPUkRFUiBlT3JkZXIgPSBYRkFfV0lER0VUT1JERVJfUHJlT3JkZXIpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQlHZXRGb2N1c1dpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlLaWxsRm9jdXMoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9jdXMoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIENYRkFfRkZXaWRnZXQqCQlHZXRXaWRnZXRCeU5hbWUoRlhfV1NUUiB3c05hbWUsIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQgPSBOVUxMKTsNCisgICAgQ1hGQV9XaWRnZXRBY2MqCQlHZXRXaWRnZXRBY2NCeU5hbWUoRlhfV1NUUiB3c05hbWUsIENYRkFfV2lkZ2V0QWNjKiBwUmVmV2lkZ2V0QWNjID0gTlVMTCk7DQorICAgIElYRkFfRG9jTGF5b3V0KgkJR2V0WEZBTGF5b3V0KCkgY29uc3Q7DQorICAgIHZvaWQJCQkJT25QYWdlRXZlbnQoSVhGQV9MYXlvdXRQYWdlICpwU2VuZGVyLCBYRkFfUEFHRUVWRU5UIGVFdmVudCwgRlhfSU5UMzIgaVBhZ2VJbmRleCk7DQorICAgIHZvaWQJCQkJTG9ja1VwZGF0ZSgpOw0KKyAgICB2b2lkCQkJCVVubG9ja1VwZGF0ZSgpOw0KKyAgICBGWF9CT09MCQkJCUlzVXBkYXRlTG9ja2VkKCk7DQorICAgIHZvaWQJCQkJQ2xlYXJJbnZhbGlkYXRlTGlzdCgpOw0KKyAgICB2b2lkCQkJCUFkZEludmFsaWRhdGVSZWN0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcnRJbnZhbGlkYXRlKTsNCisgICAgdm9pZAkJCQlBZGRJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENGWF9SZWN0RiAmcnRJbnZhbGlkYXRlKTsNCisgICAgdm9pZAkJCQlSdW5JbnZhbGlkYXRlKCk7DQorICAgIHZvaWQJCQkJUnVuRG9jQ2xvc2UoKTsNCisgICAgdm9pZAkJCQlEZXN0cm95RG9jVmlldygpOw0KKw0KKyAgICBGWF9CT09MCQkJCUluaXRWYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCisgICAgRlhfQk9PTAkJCQlSdW5WYWxpZGF0ZSgpOw0KKw0KKyAgICB2b2lkCQkJCVNldENoYW5nZU1hcmsoKTsNCisNCisgICAgdm9pZAkJCQlBZGRWYWxpZGF0ZVdpZGdldChDWEZBX1dpZGdldEFjYyogcFdpZGdldCk7DQorICAgIHZvaWQJCQkJQWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShDWEZBX05vZGUqIHBOb2RlQ2hhbmdlKTsNCisgICAgdm9pZAkJCQlBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgICBGWF9JTlQzMgkJCVJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsNCisgICAgRlhfQk9PTAkJCQlJc1N0YXRpY05vdGlmeSgpOw0KKyAgICBGWF9CT09MCQkJCVJ1bkxheW91dCgpOw0KKyAgICB2b2lkCQkJCVJ1blN1YmZvcm1JbmRleENoYW5nZSgpOw0KKyAgICB2b2lkCQkJCUFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB2b2lkCQkJCUFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIENYRkFfV2lkZ2V0QWNjKgkJR2V0Rm9jdXNXaWRnZXRBY2MoKTsNCisgICAgdm9pZAkJCQlTZXRGb2N1c1dpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyk7DQorICAgIHZvaWQJCQkJRGVsZXRlTGF5b3V0SXRlbShDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgRlhfSU5UMzIJCQlFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsIEZYX0JPT0wgYklzRm9ybVJlYWR5ID0gRkFMU0UsIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsIENYRkFfTm9kZSogcEV4Y2x1ZGUgPSBOVUxMKTsNCisgICAgRlhfQk9PTAkJCQltX2JMYXlvdXRFdmVudDsNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheQltX2Fyck51bGxUZXN0TXNnOw0KKyAgICBDWEZBX0ZGV2lkZ2V0KgkJbV9wTGlzdEZvY3VzV2lkZ2V0Ow0KKyAgICBGWF9CT09MCQkJCW1fYkluTGF5b3V0U3RhdHVzOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfQk9PTAkJCQlSdW5FdmVudExheW91dFJlYWR5KCk7DQorICAgIHZvaWQJCQkJUnVuQmluZEl0ZW1zKCk7DQorICAgIEZYX0JPT0wJCQkJSW5pdENhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCisgICAgdm9pZAkJCQlJbml0TGF5b3V0KENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB2b2lkCQkJCVJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShGWF9JTlQzMiYgaUluZGV4KTsNCisgICAgdm9pZAkJCQlTaG93TnVsbFRlc3RNc2coKTsNCisgICAgRlhfQk9PTAkJCQlSZXNldFNpbmdsZVdpZGdldEFjY0RhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0Um9vdFN1YmZvcm0oKTsNCisgICAgQ1hGQV9GRkRvYyoJCQkJCQkJbV9wRG9jOw0KKyAgICBDWEZBX0ZGV2lkZ2V0SGFuZGxlcioJCQkJbV9wV2lkZ2V0SGFuZGxlcjsNCisgICAgSVhGQV9Eb2NMYXlvdXQqCQkJCQkJbV9wWEZBRG9jTGF5b3V0Ow0KKyAgICBDWEZBX1dpZGdldEFjYyoJCQkJCQltX3BGb2N1c0FjYzsNCisgICAgQ1hGQV9GRldpZGdldCoJCQkJCQltX3BGb2N1c1dpZGdldDsNCisgICAgQ1hGQV9GRldpZGdldCoJCQkJCQltX3BPbGRGb2N1c1dpZGdldDsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJCQkJbV9tYXBQYWdlSW52YWxpZGF0ZTsNCisgICAgQ0ZYX1B0ckFycmF5CQkJCQkJbV9WYWxpZGF0ZUFjY3M7DQorICAgIENGWF9QdHJBcnJheQkJCQkJCW1fYmluZEl0ZW1zOw0KKyAgICBDRlhfUHRyQXJyYXkJCQkJCQltX0NhbGN1bGF0ZUFjY3M7DQorDQorICAgIENGWF9QdHJBcnJheQkJCQkJCW1fTmV3QWRkZWROb2RlczsNCisgICAgQ0ZYX1B0ckFycmF5CQkJCQkJbV9JbmRleENoYW5nZWRTdWJmb3JtczsNCisgICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTCQkJbV9pU3RhdHVzOw0KKyAgICBGWF9JTlQzMgkJCQkJCQltX2lMb2NrOw0KKyAgICBmcmllbmQgY2xhc3MgQ1hGQV9GRk5vdGlmeTsNCit9Ow0KK2NsYXNzIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvciA6IHB1YmxpYyBJWEZBX1dpZGdldEl0ZXJhdG9yLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFRyYXZlbFJvb3QpOw0KKyAgICB+Q1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKCk7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0KCk7DQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQJCQlNb3ZlVG9GaXJzdCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvTGFzdCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvTmV4dCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvUHJldmlvdXMoKTsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVAkJCUdldEN1cnJlbnRXaWRnZXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEN1cnJlbnRXaWRnZXQoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorcHJvdGVjdGVkOg0KKyAgICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yCQltX0NvbnRlbnRJdGVyYXRvcjsNCisgICAgQ1hGQV9GRkRvY1ZpZXcqCQkJCW1fcERvY1ZpZXc7DQorICAgIENYRkFfRkZXaWRnZXQqCQkJCW1fcEN1cldpZGdldDsNCit9Ow0KK2NsYXNzIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IgOiBwdWJsaWMgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCk7DQorICAgIH5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0KCk7DQorICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlNb3ZlVG9GaXJzdCgpOw0KKyAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvTGFzdCgpOw0KKyAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvTmV4dCgpOw0KKyAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvUHJldmlvdXMoKTsNCisgICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJCUdldEN1cnJlbnRXaWRnZXRBY2MoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU2tpcFRyZWUoKTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfQ29udGFpbmVySXRlcmF0b3IJCW1fQ29udGVudEl0ZXJhdG9yOw0KKyAgICBDWEZBX0ZGRG9jVmlldyoJCQkJbV9wRG9jVmlldzsNCisgICAgQ1hGQV9XaWRnZXRBY2MqCQkJCW1fcEN1cldpZGdldEFjYzsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4MWMxNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkcmF3LmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitDWEZBX0ZGRHJhdzo6Q1hGQV9GRkRyYXcoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGV2lkZ2V0KHBQYWdlVmlldywgcERhdGFBY2MpDQorew0KK30NCitDWEZBX0ZGRHJhdzo6fkNYRkFfRkZEcmF3KCkNCit7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI0MTA4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0RSQVdfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRFJBV19JTVBfSA0KK2NsYXNzIENYRkFfRkZEcmF3IDogcHVibGljIENYRkFfRkZXaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGRHJhdyhDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRkRyYXcoKTsNCitwcm90ZWN0ZWQ6DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZleGNsZ3JvdXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQ1ZjdlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmNwcApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZXhjbGdyb3VwLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitDWEZBX0ZGRXhjbEdyb3VwOjpDWEZBX0ZGRXhjbEdyb3VwKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRkV4Y2xHcm91cDo6fkNYRkFfRkZFeGNsR3JvdXAoKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZGRXhjbEdyb3VwOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZleGNsZ3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzhhY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRVhDTEdST1VQX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0VYQ0xHUk9VUF9JTVBfSA0KK2NsYXNzIENYRkFfRkZFeGNsR3JvdXAgOiBwdWJsaWMgQ1hGQV9GRldpZGdldA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZFeGNsR3JvdXAoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICAgIHZpcnR1YWwgfkNYRkFfRkZFeGNsR3JvdXAoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgRlhfSU5UMzIgaVJvdGF0ZSA9IDApOw0KK3Byb3RlY3RlZDoNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMyZGI1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuY3BwCkBAIC0wLDAgKzEsODc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZndsdGhlbWUuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KK0NYRkFfRkZGaWVsZDo6Q1hGQV9GRkZpZWxkKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KKyAgICAsIG1fcE5vcm1hbFdpZGdldChOVUxMKQ0KK3sNCisgICAgbV9ydFVJLlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KK30NCitDWEZBX0ZGRmllbGQ6On5DWEZBX0ZGRmllbGQoKQ0KK3sNCisgICAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OkdldEJCb3goQ0ZYX1JlY3RGICZydEJveCwgRlhfRFdPUkQgZHdTdGF0dXMsIEZYX0JPT0wgYkRyYXdGb2N1cykNCit7DQorICAgIGlmIChiRHJhd0ZvY3VzKSB7DQorICAgICAgICBYRkFfRUxFTUVOVCB0eXBlID0gKFhGQV9FTEVNRU5UKW1fcERhdGFBY2MtPkdldFVJVHlwZSgpOw0KKyAgICAgICAgaWYgKHR5cGUgPT0gWEZBX0VMRU1FTlRfQnV0dG9uIHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24gfHwgdHlwZSA9PSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQNCisgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBYRkFfRUxFTUVOVF9TaWduYXR1cmUgfHwgdHlwZSA9PSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0KSB7DQorICAgICAgICAgICAgcnRCb3ggPSBtX3J0VUk7DQorICAgICAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICAgICAgICBHZXRSb3RhdGVNYXRyaXgobXQpOw0KKyAgICAgICAgICAgIG10LlRyYW5zZm9ybVJlY3QocnRCb3gpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgICByZXR1cm4gQ1hGQV9GRldpZGdldDo6R2V0QkJveChydEJveCwgZHdTdGF0dXMpOw0KKyNlbmRpZg0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgICAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBGWF9JTlQzMiBpUm90YXRlICkNCit7DQorICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgICAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQorICAgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgICAgRHJhd0JvcmRlcihwR1MsIGJvcmRlclVJLCBtX3J0VUksICZtdFJvdGF0ZSk7DQorICAgIFJlbmRlckNhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgICBEcmF3SGlnaGxpZ2h0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cywgRkFMU0UpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIG10LlNldCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHBHUywgJm10KTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkRyYXdIaWdobGlnaHQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJFbGxpcHNlKQ0KK3sNCisgICAgaWYgKG1fcnRVSS5Jc0VtcHR5KCkgfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKChkd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0KSAmJiBtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgICAgICBDWEZBX0ZGRG9jKiBwRG9jID0gR2V0RG9jKCk7DQorICAgICAgICBDRlhfQ29sb3IgY3JIaWdobGlnaHQocERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0SGlnaGxpZ2h0Q29sb3IoKFhGQV9IRE9DKXBEb2MpKTsNCisgICAgICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjckhpZ2hsaWdodCk7DQorICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICAgIGlmIChiRWxsaXBzZSkgew0KKyAgICAgICAgICAgIHBhdGguQWRkRWxsaXBzZShtX3J0VUkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgICAgIHBHUy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6RHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KK3sNCisgICAgaWYgKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpIHsNCisgICAgICAgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsNCisgICAgICAgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgICAgICAgIEZYX0ZMT0FUIERhc2hQYXR0ZXJuWzJdID0gezEsIDF9Ow0KKyAgICAgICAgcEdTLT5TZXRMaW5lRGFzaCgwLjBmLCBEYXNoUGF0dGVybiwgMik7DQorICAgICAgICBwR1MtPlNldExpbmVXaWR0aCgwLCBGQUxTRSk7DQorICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKG1fcnRVSS5sZWZ0LCBtX3J0VUkudG9wLCBtX3J0VUkud2lkdGgsIG1fcnRVSS5oZWlnaHQpOw0KKyAgICAgICAgcEdTLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMVGhlbWVQcm92aWRlcigpDQorew0KKyAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcC0+U2V0VGhlbWVQcm92aWRlcihHZXRBcHAoKS0+R2V0RldMVGhlbWUoKSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OklzTG9hZGVkKCkNCit7DQorICAgIHJldHVybiBtX3BOb3JtYWxXaWRnZXQgIT0gTlVMTCAmJiBDWEZBX0ZGV2lkZ2V0OjpJc0xvYWRlZCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpDQorew0KKyAgICBTZXRGV0xUaGVtZVByb3ZpZGVyKCk7DQorICAgIG1fcERhdGFBY2MtPkxvYWRDYXB0aW9uKCk7DQorICAgIExheW91dFdpZGdldCgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpDQorew0KKyAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcE5vcm1hbFdpZGdldCA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlNldEVkaXRTY3JvbGxPZmZzZXQoKQ0KK3sNCisgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCisgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1RleHRFZGl0IHx8IGVUeXBlID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0IHx8IGVUeXBlID09IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KKyAgICAgICAgRlhfRkxPQVQgZlNjcm9sbE9mZnNldCA9IDA7DQorICAgICAgICBDWEZBX0ZGRmllbGQqIHBQcmV2ID0gKENYRkFfRkZGaWVsZCopR2V0TGF5b3V0SXRlbSgpLT5HZXRQcmV2KCk7DQorICAgICAgICBpZiAocFByZXYpIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRNYXJnaW47DQorICAgICAgICAgICAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRNYXJnaW4pOw0KKyAgICAgICAgICAgIGZTY3JvbGxPZmZzZXQgPSAtcnRNYXJnaW4udG9wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUocFByZXYpIHsNCisgICAgICAgICAgICBmU2Nyb2xsT2Zmc2V0ICs9IHBQcmV2LT5tX3J0VUkuaGVpZ2h0Ow0KKyAgICAgICAgICAgIHBQcmV2ID0gKENYRkFfRkZGaWVsZCopcFByZXYtPkdldExheW91dEl0ZW0oKS0+R2V0UHJldigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldFNjcm9sbE9mZnNldChmU2Nyb2xsT2Zmc2V0KTsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6TGF5b3V0V2lkZ2V0KCkNCit7DQorICAgIENYRkFfRkZXaWRnZXQ6OkxheW91dFdpZGdldCgpOw0KKyAgICBDYXBQbGFjZW1lbnQoKTsNCisgICAgTGF5b3V0Q2FwdGlvbigpOw0KKyAgICBTZXRGV0xSZWN0KCk7DQorICAgIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCisgICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcFBsYWNlbWVudCgpDQorew0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1nV2lkZ2V0KSB7DQorICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpcy0+R2V0TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgaWYgKCFwSXRlbSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgICAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQorICAgICAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCAwKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIDAsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgICAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOw0KKyAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICAgICAgaUNhcFBsYWNlbWVudCA9IChYRkFfQVRUUklCVVRFRU5VTSljYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCisgICAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCAmJiAoR2V0TGF5b3V0SXRlbSgpLT5HZXRQcmV2KCkpKSB7DQorICAgICAgICAgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgfSBlbHNlIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSAmJiAoR2V0TGF5b3V0SXRlbSgpLT5HZXROZXh0KCkpKSB7DQorICAgICAgICAgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24uR2V0UmVzZXJ2ZSgpOw0KKyAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzLT5HZXRMYXlvdXRJdGVtKCk7DQorICAgICAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgbV9ydENhcHRpb24uU2V0KHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0Rmlyc3QoKTsNCisgICAgICAgICAgICAgICAgcEl0ZW0tPkdldFJlY3QobV9ydENhcHRpb24pOw0KKyAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5HZXROZXh0KCk7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0UmVjdDsNCisgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5HZXRSZWN0KHJ0UmVjdCk7DQorICAgICAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgKz0gcnRSZWN0LkhlaWdodCgpOw0KKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0TmV4dCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nV2lkZ2V0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7DQorICAgICAgICAgICAgaWYgKGZDYXBSZXNlcnZlIDw9IDAgJiYgcENhcFRleHRMYXlvdXQpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1NpemVGIHNpemU7DQorICAgICAgICAgICAgICAgIHNpemUuU2V0KDAsIDApOw0KKyAgICAgICAgICAgICAgICBDRlhfU2l6ZUYgbWluU2l6ZTsNCisgICAgICAgICAgICAgICAgbWluU2l6ZS5TZXQoMCwgMCk7DQorICAgICAgICAgICAgICAgIENGWF9TaXplRiBtYXhTaXplOw0KKyAgICAgICAgICAgICAgICBtYXhTaXplLlNldCgwLCAwKTsNCisgICAgICAgICAgICAgICAgcENhcFRleHRMYXlvdXQtPkNhbGNTaXplKG1pblNpemUsIG1heFNpemUsIHNpemUpOw0KKyAgICAgICAgICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgfHwgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsNCisgICAgICAgICAgICAgICAgICAgIGZDYXBSZXNlcnZlID0gc2l6ZS55Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZkNhcFJlc2VydmUgPSBzaXplLng7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9ydFVJID0gcnRXaWRnZXQ7DQorICAgIHN3aXRjaChpQ2FwUGxhY2VtZW50KSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6IHsNCisgICAgICAgICAgICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICAgICAgQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCisgICAgICAgICAgICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDogew0KKyAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCisgICAgICAgICAgICAgICAgbV9ydFVJLnRvcCArPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OiB7DQorICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLmxlZnQgPSBtX3J0Q2FwdGlvbi5yaWdodCgpIC0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gZkNhcFJlc2VydmU7DQorICAgICAgICAgICAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7DQorICAgICAgICAgICAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi50b3AgPSBtX3J0Q2FwdGlvbi5ib3R0b20oKSAtIGZDYXBSZXNlcnZlOw0KKyAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCisgICAgICAgICAgICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZToNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgICBpZiAoYm9yZGVyVUkpIHsNCisgICAgICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlclVJLkdldE1hcmdpbigpOw0KKyAgICAgICAgaWYgKG1hcmdpbi5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydFVJLCBtYXJnaW4pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcnRVSS5Ob3JtYWxpemUoKTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcFRvcEJvdHRvbVBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwgY29uc3QgQ0ZYX1JlY3RGICZydFdpZGdldCwgRlhfSU5UMzIgaUNhcFBsYWNlbWVudCkNCit7DQorICAgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCisgICAgbV9ydENhcHRpb24ubGVmdCArPSBydFVJTWFyZ2luLmxlZnQ7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCkpIHsNCisgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgICAgICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7DQorICAgICAgICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9ydENhcHRpb24uaGVpZ2h0ICsgcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCisgICAgaWYgKGZXaWR0aCA+IHJ0V2lkZ2V0LndpZHRoKSB7DQorICAgICAgICBtX3J0VUkud2lkdGggKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7DQorICAgIH0NCisgICAgaWYgKGZIZWlnaHQgPT0gWEZBX0RFRkFVTFRVSV9IRUlHSFQgJiYgbV9ydFVJLmhlaWdodCA8IFhGQV9NSU5VSV9IRUlHSFQpIHsNCisgICAgICAgIG1fcnRVSS5oZWlnaHQgPSBYRkFfTUlOVUlfSEVJR0hUOw0KKyAgICAgICAgbV9ydENhcHRpb24udG9wICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQorICAgIH0gZWxzZSBpZiAoZkhlaWdodCA+IHJ0V2lkZ2V0LmhlaWdodCkgew0KKyAgICAgICAgbV9ydFVJLmhlaWdodCArPSBmSGVpZ2h0IC0gcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgICAgICAgbV9ydENhcHRpb24udG9wICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcExlZnRSaWdodFBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwgY29uc3QgQ0ZYX1JlY3RGICZydFdpZGdldCwgRlhfSU5UMzIgaUNhcFBsYWNlbWVudCkNCit7DQorICAgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCisgICAgbV9ydENhcHRpb24udG9wICs9IHJ0VUlNYXJnaW4udG9wOw0KKyAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgLT0gcnRVSU1hcmdpbi50b3A7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCkpIHsNCisgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgICAgICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7DQorICAgICAgICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBtX3J0Q2FwdGlvbi53aWR0aCArIHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgICBpZiAoZldpZHRoID4gcnRXaWRnZXQud2lkdGgpIHsNCisgICAgICAgIG1fcnRVSS53aWR0aCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsNCisgICAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICAgICAgbV9ydENhcHRpb24ubGVmdCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZkhlaWdodCA9PSBYRkFfREVGQVVMVFVJX0hFSUdIVCAmJiBtX3J0VUkuaGVpZ2h0IDwgWEZBX01JTlVJX0hFSUdIVCkgew0KKyAgICAgICAgbV9ydFVJLmhlaWdodCA9IFhGQV9NSU5VSV9IRUlHSFQ7DQorICAgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCisgICAgfSBlbHNlIGlmIChmSGVpZ2h0ID4gcnRXaWRnZXQuaGVpZ2h0KSB7DQorICAgICAgICBtX3J0VUkuaGVpZ2h0ICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlVwZGF0ZUZXTCgpDQorew0KKyAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgICB9DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZGaWVsZDo6VXBkYXRlVUlQcm9wZXJ0eSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBVaU5vZGUgPSBtX3BEYXRhQWNjLT5HZXRVSUNoaWxkKCk7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgICBpZiAocFVpTm9kZSAmJiBwVWlOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGVmYXVsdFVpKSB7DQorICAgICAgICBkd1N0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdTdHlsZTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlNldEZXTFJlY3QoKQ0KK3sNCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRVaSA9IG1fcnRVSTsNCisgICAgaWYgKHJ0VWkud2lkdGggPCAxLjApIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChydFVpLndpZHRoIDwgMS4wKTsNCisgICAgICAgIHJ0VWkud2lkdGggPSAxLjA7DQorICAgIH0NCisgICAgaWYgKCFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gbV9wRGF0YUFjYy0+R2V0Rm9udFNpemUoKTsNCisgICAgICAgIGlmIChydFVpLmhlaWdodCA8IGZGb250U2l6ZSkgew0KKyAgICAgICAgICAgIHJ0VWkuaGVpZ2h0ID0gZkZvbnRTaXplOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0V2lkZ2V0UmVjdChydFVpKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTW91c2VFbnRlcigpDQorew0KKyAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnTW91c2UgbXM7DQorICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VFbnRlcjsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRXhpdCgpDQorew0KKyAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnTW91c2UgbXM7DQorICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpGV0xUb0NsaWVudChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBmeCAtPSBydFdpZGdldC5sZWZ0Ow0KKyAgICBmeSAtPSBydFdpZGdldC50b3A7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgU2V0QnV0dG9uRG93bihUUlVFKTsNCisgICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9meCA9IGZ4Ow0KKyAgICBtcy5tX2Z5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKCFJc0J1dHRvbkRvd24oKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFNldEJ1dHRvbkRvd24oRkFMU0UpOw0KKyAgICBDRldMX01zZ01vdXNlIG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9meCA9IGZ4Ow0KKyAgICBtcy5tX2Z5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnTW91c2UgbXM7DQorICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRibENsazsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9meCA9IGZ4Ow0KKyAgICBtcy5tX2Z5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU7DQorICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICAgIG1zLm1fZnggPSBmeDsNCisgICAgbXMubV9meSA9IGZ5Ow0KKyAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPbk1vdXNlV2hlZWwoRlhfRFdPUkQgZHdGbGFncywgRlhfU0hPUlQgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dNb3VzZVdoZWVsIG1zOw0KKyAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgICBtcy5tX2Z4ID0gZng7DQorICAgIG1zLm1fZnkgPSBmeTsNCisgICAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICAgIG1zLm1fZkRlbHRhWCA9IHpEZWx0YTsNCisgICAgbXMubV9mRGVsdGFZID0gMDsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgU2V0QnV0dG9uRG93bihUUlVFKTsNCisgICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9meCA9IGZ4Ow0KKyAgICBtcy5tX2Z5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKCFJc0J1dHRvbkRvd24oKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFNldEJ1dHRvbkRvd24oRkFMU0UpOw0KKyAgICBDRldMX01zZ01vdXNlIG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX1JCdXR0b25VcDsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9meCA9IGZ4Ow0KKyAgICBtcy5tX2Z5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnTW91c2UgbXM7DQorICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRibENsazsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9meCA9IGZ4Ow0KKyAgICBtcy5tX2Z5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorDQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkNCit7DQorICAgIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMocE9sZFdpZGdldCk7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtczsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXM7DQorICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgICAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfRkZGaWVsZDo6T25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnS2V5IG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR0tFWUNNRF9LZXlEb3duOw0KKyAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgICBtcy5tX2R3S2V5Q29kZSA9IGR3S2V5Q29kZTsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnS2V5IG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR0tFWUNNRF9LZXlVcDsNCisgICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgICAgbXMubV9kd0tleUNvZGUgPSBkd0tleUNvZGU7DQorICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfRkZGaWVsZDo6T25DaGFyKEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIGlmICghbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoZHdDaGFyID09IEZXTF9WS0VZX1RhYikgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGV0xfTXNnS2V5IG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR0tFWUNNRF9DaGFyOw0KKyAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgICBtcy5tX2R3S2V5Q29kZSA9IGR3Q2hhcjsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZGaWVsZDo6T25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZmeCA9IGZ4LCBmZnkgPSBmeTsNCisgICAgICAgIEZXTFRvQ2xpZW50KGZmeCwgZmZ5KTsNCisgICAgICAgIEZYX0RXT1JEIGR3V2lkZ2V0SGl0ID0gbV9wTm9ybWFsV2lkZ2V0LT5IaXRUZXN0KGZmeCwgZmZ5KTsNCisgICAgICAgIGlmIChkd1dpZGdldEhpdCAhPSBGV0xfV0dUSElUVEVTVF9Vbmtub3duKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRCb3g7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCisgICAgaWYgKCFydEJveC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCisgICAgfQ0KKyAgICBpZiAobV9ydENhcHRpb24uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyOw0KKyAgICB9DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3JkZXI7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBpZiAocnRXaWRnZXQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6TGF5b3V0Q2FwdGlvbigpDQorew0KKyAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgICAgaWYgKCFwQ2FwVGV4dExheW91dCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9TaXplRiBzaXplOw0KKyAgICBzaXplLlNldChtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IDA7DQorICAgIHBDYXBUZXh0TGF5b3V0LT5MYXlvdXQoc2l6ZSwgJmZIZWlnaHQpOw0KKyAgICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgZkhlaWdodCkgew0KKyAgICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ID0gZkhlaWdodDsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyQ2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCApDQorew0KKyAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgICAgaWYgKCFwQ2FwVGV4dExheW91dCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KKyAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgICAgaWYgKCFwQ2FwVGV4dExheW91dC0+SXNMb2FkZWQoKSkgew0KKyAgICAgICAgICAgIENGWF9TaXplRiBzaXplOw0KKyAgICAgICAgICAgIHNpemUuU2V0KG1fcnRDYXB0aW9uLndpZHRoLCBtX3J0Q2FwdGlvbi5oZWlnaHQpOw0KKyAgICAgICAgICAgIHBDYXBUZXh0TGF5b3V0LT5MYXlvdXQoc2l6ZSk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQorICAgICAgICBDRlhfUmVjdEYgcnRDbGlwID0gbV9ydENhcHRpb247DQorICAgICAgICBydENsaXAuSW50ZXJzZWN0KHJ0V2lkZ2V0KTsNCisgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBtX3J0Q2FwdGlvbi5sZWZ0LCBtX3J0Q2FwdGlvbi50b3ApOw0KKyAgICAgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICAgICAgICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgICAgIH0NCisgICAgICAgIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpQcm9jZXNzQ29tbWl0dGVkRGF0YSgpDQorew0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghSXNEYXRhQ2hhbmdlZCgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKENhbGN1bGF0ZU92ZXJyaWRlKCkgIT0gMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghQ29tbWl0RGF0YSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9wRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgICBtX3BEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldChtX3BEYXRhQWNjKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZGaWVsZDo6Q2FsY3VsYXRlT3ZlcnJpZGUoKQ0KK3sNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBtX3BEYXRhQWNjLT5HZXRFeGNsR3JvdXAoKTsNCisgICAgaWYgKCFwQWNjKSB7DQorICAgICAgICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QWNjKG1fcERhdGFBY2MpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlPdmVycmlkZSA9IDA7DQorICAgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocEFjYykgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBBY2MtPkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTDsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgICBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgaWYgKCFwV2lkZ2V0QWNjKSB7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9DQorICAgICAgICBpZiAoQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlID0gcFdpZGdldEFjYy0+R2V0RXhjbEdyb3VwTmV4dE1lbWJlcihwTm9kZSk7DQorICAgIH0NCisgICAgcmV0dXJuIDE7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZGaWVsZDo6Q2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwQWNjKQ0KK3sNCisgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBBY2MtPkdldENhbGN1bGF0ZSgpOw0KKyAgICBpZiAoIWNhbGMpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIFhGQV9WRVJTSU9OIHZlcnNpb24gPSBwQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICAgIGlmIChjYWxjKSB7DQorICAgICAgICBGWF9JTlQzMiBpT3ZlcnJpZGUgPSBjYWxjLkdldE92ZXJyaWRlKCk7DQorICAgICAgICBzd2l0Y2ggKGlPdmVycmlkZSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3I6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDw9IFhGQV9WRVJTSU9OXzIwNCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEFwcFByb3ZpZGVyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2FybmluZzsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19Ob3RNb2RpZnlGaWVsZCwgd3NXYXJuaW5nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c01lc3NhZ2UgKz0gd3NXYXJuaW5nOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQ2FsY092ZXJyaWRlLCB3c1RpdGxlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c01lc3NhZ2UsIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywgWEZBX01CX09LKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmc6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDw9IFhGQV9WRVJTSU9OXzIwNCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY3JpcHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQuR2V0RXhwcmVzc2lvbih3c0V4cHJlc3Npb24pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxjLkdldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c01lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTWVzc2FnZSArPSBMIlxyXG4iOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1dhcm5pbmc7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfTW9kaWZ5RmllbGQsIHdzV2FybmluZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NNZXNzYWdlICs9IHdzV2FybmluZzsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0NhbGNPdmVycmlkZSwgd3NUaXRsZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTWVzc2FnZSwgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLCBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWNjLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZToNCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZDoNCisgICAgICAgICAgICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGRmllbGQ6OkNvbW1pdERhdGEoKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6SXNEYXRhQ2hhbmdlZCgpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpUcmFuc2xhdGVGV0xNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpDQorew0KKyAgICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25Qcm9jZXNzTWVzc2FnZVRvRm9ybShwTWVzc2FnZSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KK3sNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZHdFdmVudElEKSB7DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX01vdXNlOiB7DQorICAgICAgICAgICAgICAgIENGV0xfRXZ0TW91c2UgKmV2ZW50ID0gKENGV0xfRXZ0TW91c2UqKXBFdmVudDsNCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUVudGVyKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfTW91c2VFbnRlcjsNCisgICAgICAgICAgICAgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRW50ZXIsICZlUGFyYW0pOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfTW91c2VFeGl0Ow0KKyAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0LCAmZVBhcmFtKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24pIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZURvd247DQorICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sICZlUGFyYW0pOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXApIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZVVwOw0KKyAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcCwgJmVQYXJhbSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9DbGljazogew0KKyAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DbGljazsNCisgICAgICAgICAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DbGljaywgJmVQYXJhbSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENYRkFfRkZGaWVsZDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmN2U2OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmgKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRklFTERfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRklFTERfSU1QX0gNCisjZGVmaW5lIFhGQV9NSU5VSV9IRUlHSFQJCTQuMzJmDQorI2RlZmluZSBYRkFfREVGQVVMVFVJX0hFSUdIVAkyLjBmDQorY2xhc3MgQ1hGQV9UZXh0TGF5b3V0Ow0KK2NsYXNzIENYRkFfRkZGaWVsZCA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0LCBwdWJsaWMgSUZXTF9XaWRnZXREZWxlZ2F0ZQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZGaWVsZChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRkZpZWxkKCk7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAlHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQorICAgIHZpcnR1YWwgdm9pZAlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIEZYX0lOVDMyIGlSb3RhdGUgPSAwKTsNCisgICAgdmlydHVhbAlGWF9CT09MCUlzTG9hZGVkKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlMb2FkV2lkZ2V0KCk7DQorICAgIHZpcnR1YWwgdm9pZAlVbmxvYWRXaWRnZXQoKTsNCisgICAgdmlydHVhbAlGWF9CT09MCUxheW91dFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsCXZvaWQJVXBkYXRlRldMKCk7DQorICAgIEZYX0RXT1JECVVwZGF0ZVVJUHJvcGVydHkoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRW50ZXIoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRXhpdCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX1NIT1JUIHpEZWx0YSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbAlGWF9EV09SRAlPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCBGWF9CT09MCVB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwJdm9pZAlTZXRGV0xSZWN0KCk7DQorICAgIHZvaWQJCQlTZXRGV0xUaGVtZVByb3ZpZGVyKCk7DQorICAgIENGV0xfV2lkZ2V0KglHZXROb3JtYWxXaWRnZXQoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgICB9DQorICAgIHZvaWQJCQlGV0xUb0NsaWVudChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQorICAgIHZvaWQJCQlMYXlvdXRDYXB0aW9uKCk7DQorICAgIHZvaWQJCQlSZW5kZXJDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorICAgIEZYX0lOVDMyCQlDYWxjdWxhdGVPdmVycmlkZSgpOw0KKyAgICBGWF9JTlQzMgkJQ2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwQWNjKTsNCisgICAgRlhfQk9PTAkJCVByb2Nlc3NDb21taXR0ZWREYXRhKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlDb21taXREYXRhKCk7DQorICAgIHZpcnR1YWwJRlhfQk9PTAlJc0RhdGFDaGFuZ2VkKCk7DQorICAgIHZvaWQJCQlEcmF3SGlnaGxpZ2h0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRWxsaXBzZSA9IEZBTFNFKTsNCisgICAgdm9pZAkJCURyYXdGb2N1cyhDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICAgIHZvaWQJCQlUcmFuc2xhdGVGV0xNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgICB2b2lkCQkJQ2FwUGxhY2VtZW50KCk7DQorICAgIHZvaWQJCQlDYXBUb3BCb3R0b21QbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sIGNvbnN0IENGWF9SZWN0RiAmcnRXaWRnZXQsIEZYX0lOVDMyIGlDYXBQbGFjZW1lbnQpOw0KKyAgICB2b2lkCQkJQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KENYRkFfQ2FwdGlvbiBjYXB0aW9uLCBjb25zdCBDRlhfUmVjdEYgJnJ0V2lkZ2V0LCBGWF9JTlQzMiBpQ2FwUGxhY2VtZW50KTsNCisgICAgdm9pZAkJCVNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZXTF9XaWRnZXQqCW1fcE5vcm1hbFdpZGdldDsNCisgICAgQ0ZYX1JlY3RGCQltX3J0VUk7DQorICAgIENGWF9SZWN0RgkJbV9ydENhcHRpb247DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyYjFmZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZHJhdy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZpbWFnZS5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorQ1hGQV9GRkltYWdlOjpDWEZBX0ZGSW1hZ2UoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRkltYWdlOjp+Q1hGQV9GRkltYWdlKCkNCit7DQorICAgIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlOjpJc0xvYWRlZCgpDQorew0KKyAgICByZXR1cm4gR2V0RGF0YUFjYygpLT5HZXRJbWFnZUltYWdlKCkgIT0gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGSW1hZ2U6OkxvYWRXaWRnZXQoKQ0KK3sNCisgICAgaWYgKEdldERhdGFBY2MoKS0+R2V0SW1hZ2VJbWFnZSgpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBHZXREYXRhQWNjKCktPkxvYWRJbWFnZUltYWdlKCk7DQorICAgIHJldHVybiBDWEZBX0ZGRHJhdzo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCkNCit7DQorICAgIEdldERhdGFBY2MoKS0+U2V0SW1hZ2VJbWFnZShOVUxMKTsNCit9DQordm9pZCBDWEZBX0ZGSW1hZ2U6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCAsIEZYX0RXT1JEIGR3U3RhdHVzICwgRlhfSU5UMzIgaVJvdGF0ZSApDQorew0KKyAgICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KKyAgICBpZiAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBHZXREYXRhQWNjKCktPkdldEltYWdlSW1hZ2UoKSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0SW1hZ2U7DQorICAgICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEltYWdlKTsNCisgICAgICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydEltYWdlLCBtZ1dpZGdldCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgICAgICAgIEZYX0lOVDMyIGlWZXJ0QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A7DQorICAgICAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCisgICAgICAgICAgICBpSG9yekFsaWduID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCisgICAgICAgICAgICBpVmVydEFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgICAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgIEZYX0lOVDMyIGlBc3BlY3QgPSBpbWFnZU9iai5HZXRBc3BlY3QoKTsNCisgICAgICAgIEZYX0lOVDMyIGlJbWFnZVhEcGkgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaUltYWdlWURwaSA9IDA7DQorICAgICAgICBtX3BEYXRhQWNjLT5HZXRJbWFnZURwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgICAgIFhGQV9EcmF3SW1hZ2UocEdTLCBydEltYWdlLCAmbXRSb3RhdGUsIHBESUJpdG1hcCwgaUFzcGVjdCwgaUltYWdlWERwaSwgaUltYWdlWURwaSwgaUhvcnpBbGlnbiwgaVZlcnRBbGlnbik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiOTg1YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRFJBV19JTUFHRV9JTVBfSA0KKyNkZWZpbmUgX1hGQV9EUkFXX0lNQUdFX0lNUF9IDQorY2xhc3MgQ1hGQV9GRkltYWdlIDogcHVibGljIENYRkFfRkZEcmF3DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRkltYWdlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGSW1hZ2UoKTsNCisgICAgdmlydHVhbAl2b2lkCQkJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBGWF9JTlQzMiBpUm90YXRlID0gMCk7DQorICAgIHZpcnR1YWwJRlhfQk9PTAkJCUlzTG9hZGVkKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRXaWRnZXQoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJVW5sb2FkV2lkZ2V0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDc1ZDkwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcApAQCAtMCwwICsxLDE4OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZJbWFnZUVkaXQ6OkNYRkFfRkZJbWFnZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCisgICAgLCBtX3BPbGREZWxlZ2F0ZShOVUxMKQ0KK3sNCit9DQorQ1hGQV9GRkltYWdlRWRpdDo6fkNYRkFfRkZJbWFnZUVkaXQoKQ0KK3sNCisgICAgQ1hGQV9GRkltYWdlRWRpdDo6VW5sb2FkV2lkZ2V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlRWRpdDo6TG9hZFdpZGdldCgpDQorew0KKyAgICBDRldMX1BpY3R1cmVCb3gqIHBQaWN0dXJlQm94ID0gRlhfTkVXIENGV0xfUGljdHVyZUJveDsNCisgICAgaWYgKHBQaWN0dXJlQm94KSB7DQorICAgICAgICBwUGljdHVyZUJveC0+SW5pdGlhbGl6ZSgpOw0KKyAgICB9DQorICAgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcFBpY3R1cmVCb3g7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgICAgbV9wT2xkRGVsZWdhdGUgPSBwUGljdHVyZUJveC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICAgIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0SW1hZ2VFZGl0SW1hZ2UoKSAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBVcGRhdGVGV0xEYXRhKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZJbWFnZUVkaXQ6OlVubG9hZFdpZGdldCgpDQorew0KKyAgICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShOVUxMKTsNCisgICAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsNCisgICAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICAgIGlmIChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG1fcERhdGFBY2MtPkdldEltYWdlRWRpdEltYWdlKCkpIHsNCisgICAgICAgIENGWF9SZWN0RiBydEltYWdlOw0KKyAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0SW1hZ2UpOw0KKyAgICAgICAgRlhfSU5UMzIgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7DQorICAgICAgICBGWF9JTlQzMiBpVmVydEFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wOw0KKyAgICAgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgICAgICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICAgICAgICAgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaUFzcGVjdCA9IFhGQV9BVFRSSUJVVEVFTlVNX0ZpdDsNCisgICAgICAgIGlmIChDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCkpIHsNCisgICAgICAgICAgICBpZiAoQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCkpIHsNCisgICAgICAgICAgICAgICAgaUFzcGVjdCA9IGltYWdlT2JqLkdldEFzcGVjdCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlJbWFnZVhEcGkgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaUltYWdlWURwaSA9IDA7DQorICAgICAgICBtX3BEYXRhQWNjLT5HZXRJbWFnZUVkaXREcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgICAgICBYRkFfRHJhd0ltYWdlKHBHUywgcnRJbWFnZSwgJm10Um90YXRlLCBwRElCaXRtYXAsIGlBc3BlY3QsIGlJbWFnZVhEcGksIGlJbWFnZVlEcGksIGlIb3J6QWxpZ24sIGlWZXJ0QWxpZ24pOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlRWRpdDo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghUHRJbkFjdGl2ZVJlY3QoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICAgIENGV0xfTXNnTW91c2UgbXM7DQorICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd247DQorICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICAgIG1zLm1fZnggPSBmeDsNCisgICAgbXMubV9meSA9IGZ5Ow0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsdGVyOw0KKyAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19JbWFnZUZpbHRlciwgd3NGaWx0ZXIpOw0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzUGF0aEFycmF5Ow0KKyAgICBwQXBwUHJvdmlkZXItPlNob3dGaWxlRGlhbG9nKHdzVGl0bGUsIHdzRmlsdGVyLCB3c1BhdGhBcnJheSk7DQorICAgIEZYX0lOVDMyIGlTaXplID0gd3NQYXRoQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaVNpemUgPCAxKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoID0gd3NQYXRoQXJyYXlbMF07DQorICAgIEZYX1NUUlNJWkUgbkxlbiA9IHdzRmlsZVBhdGguR2V0TGVuZ3RoKCk7DQorICAgIEZYX1NUUlNJWkUgbkluZGV4ID0gbkxlbiAtIDE7DQorICAgIHdoaWxlIChuSW5kZXggPiAwICYmIHdzRmlsZVBhdGhbbkluZGV4XSAhPSAnLicpIHsNCisgICAgICAgIG5JbmRleC0tOw0KKyAgICB9DQorICAgIGlmIChuSW5kZXggPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZShMImltYWdlLyIpOw0KKyAgICB3c0NvbnRlbnRUeXBlICs9IHdzRmlsZVBhdGguUmlnaHQobkxlbiAtIG5JbmRleCAtIDEpOw0KKyAgICB3c0NvbnRlbnRUeXBlLk1ha2VMb3dlcigpOw0KKyAgICBGWENPREVDX0lNQUdFX1RZUEUgZUltYWdlVHlwZSA9IFhGQV9HZXRJbWFnZVR5cGUod3NDb250ZW50VHlwZSk7DQorICAgIGlmIChlSW1hZ2VUeXBlID09IEZYQ09ERUNfSU1BR0VfVU5LTk9XTikgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJbWFnZTsNCisgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0ZpbGVQYXRoKTsNCisgICAgaWYgKHBGaWxlUmVhZCAhPSBOVUxMKSB7DQorICAgICAgICBGWF9JTlQzMiBuRGF0YVNpemUgPSBwRmlsZVJlYWQtPkdldFNpemUoKTsNCisgICAgICAgIGlmIChuRGF0YVNpemUgPiAwKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNCdWY7DQorICAgICAgICAgICAgRlhfTFBTVFIgcEltYWdlQnVmZmVyID0gYnNCdWYuR2V0QnVmZmVyKG5EYXRhU2l6ZSk7DQorICAgICAgICAgICAgcEZpbGVSZWFkLT5SZWFkQmxvY2socEltYWdlQnVmZmVyLCAwLCBuRGF0YVNpemUpOw0KKyAgICAgICAgICAgIGJzQnVmLlJlbGVhc2VCdWZmZXIoKTsNCisgICAgICAgICAgICBpZiAoIWJzQnVmLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBGWF9MUFNUUiBwRGF0YSA9IFhGQV9CYXNlNjRFbmNvZGUoYnNCdWYsIG5EYXRhU2l6ZSk7DQorICAgICAgICAgICAgICAgIHdzSW1hZ2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEYXRhKTsNCisgICAgICAgICAgICAgICAgaWYgKHBEYXRhICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocERhdGEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRGF0YUFjYy0+U2V0SW1hZ2VFZGl0SW1hZ2UoTlVMTCk7DQorICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXQod3NDb250ZW50VHlwZSwgQ0ZYX1dpZGVTdHJpbmdDKCksIHdzSW1hZ2UpOw0KKyAgICBtX3BEYXRhQWNjLT5Mb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgICAgbV9wRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpTZXRGV0xSZWN0KCkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICAgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgICBDRlhfUmVjdEYgcnRJbWFnZShtX3J0VUkpOw0KKyAgICBydEltYWdlLkRlZmxhdGUocnRVSU1hcmdpbi5sZWZ0LCBydFVJTWFyZ2luLnRvcCwgcnRVSU1hcmdpbi53aWR0aCwgcnRVSU1hcmdpbi5oZWlnaHQpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFdpZGdldFJlY3QocnRJbWFnZSk7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRkltYWdlRWRpdDo6Q29tbWl0RGF0YSgpDQorew0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGSW1hZ2VFZGl0OjpVcGRhdGVGV0xEYXRhKCkNCit7DQorICAgIG1fcERhdGFBY2MtPlNldEltYWdlRWRpdEltYWdlKE5VTEwpOw0KKyAgICBtX3BEYXRhQWNjLT5Mb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZJbWFnZUVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIJQ1hGQV9GRkltYWdlRWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorfQ0KK0ZXTF9FUlIJQ1hGQV9GRkltYWdlRWRpdDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCit7DQorICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlZWRpdC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhODMzMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlZWRpdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0lNQUdFRURJVF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9JTUFHRUVESVRfSU1QX0gNCitjbGFzcyBDWEZBX0ZGSW1hZ2VFZGl0IDogcHVibGljIENYRkFfRkZGaWVsZA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZJbWFnZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICAgIHZpcnR1YWwgfkNYRkFfRkZJbWFnZUVkaXQoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgRlhfSU5UMzIgaVJvdGF0ZSA9IDApOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJVW5sb2FkV2lkZ2V0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbCB2b2lkCVNldEZXTFJlY3QoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCVVwZGF0ZUZXTERhdGEoKTsNCisgICAgdmlydHVhbAlGWF9CT09MCUNvbW1pdERhdGEoKTsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZQkqbV9wT2xkRGVsZWdhdGU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmbm90aWZ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU0Y2QzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmbm90aWZ5LmNwcApAQCAtMCwwICsxLDYxMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaGVja2J1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaG9pY2VsaXN0LmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZiYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYV9mZmRyYXcuaCINCisjaW5jbHVkZSAieGZhX2ZmdGV4dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYXRoLmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlLmgiDQorI2luY2x1ZGUgInhmYV9mZmV4Y2xncm91cC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzdWJmb3JtLmgiDQorI2luY2x1ZGUgInhmYV9mZnNpZ25hdHVyZS5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0YWNjLmgiDQorI2luY2x1ZGUgInhmYV9mZm5vdGlmeS5oIg0KK3N0YXRpYyB2b2lkIFhGQV9GRkRlbGV0ZVdpZGdldEFjYyhGWF9MUFZPSUQgcERhdGEpDQorew0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ1hGQV9XaWRnZXRBY2MqKXBEYXRhOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGdzX1hGQURlbGV0ZVdpZGdldEFjYyA9IHtYRkFfRkZEZWxldGVXaWRnZXRBY2MsIE5VTEx9Ow0KK0NYRkFfRkZOb3RpZnk6OkNYRkFfRkZOb3RpZnkoQ1hGQV9GRkRvYyogcERvYykNCisgICAgOiBtX3BEb2MocERvYykNCit7DQorfQ0KK0NYRkFfRkZOb3RpZnk6On5DWEZBX0ZGTm90aWZ5KCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25QYWdlRXZlbnQoSVhGQV9MYXlvdXRQYWdlICpwU2VuZGVyLCBYRkFfUEFHRUVWRU5UIGVFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSkNCit7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwU2VuZGVyLT5HZXRMYXlvdXQoKSk7DQorICAgIGlmICghcERvY1ZpZXcpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwRG9jVmlldy0+T25QYWdlRXZlbnQocFNlbmRlciwgZUV2ZW50LCAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpcFBhcmFtKTsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbk5vZGVFdmVudChDWEZBX05vZGUgKnBTZW5kZXIsIFhGQV9OT0RFRVZFTlQgZUV2ZW50LCBGWF9MUFZPSUQgcFBhcmFtICwgRlhfTFBWT0lEIHBQYXJhbTIgLCBGWF9MUFZPSUQgcFBhcmFtMywgRlhfTFBWT0lEIHBQYXJhbTQpDQorew0KKyAgICBzd2l0Y2ggKGVFdmVudCkgew0KKyAgICAgICAgY2FzZSBYRkFfTk9ERUVWRU5UX1JlYWR5Og0KKyAgICAgICAgICAgIE9uTm9kZVJlYWR5KHBTZW5kZXIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdpbmc6DQorICAgICAgICAgICAgT25WYWx1ZUNoYW5naW5nKHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkOg0KKyAgICAgICAgICAgIE9uVmFsdWVDaGFuZ2VkKHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMiwgcFBhcmFtMywgcFBhcmFtNCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9OT0RFRVZFTlRfQ2hpbGRBZGRlZDoNCisgICAgICAgICAgICBPbkNoaWxkQWRkZWQocFNlbmRlciwgcFBhcmFtLCBwUGFyYW0yKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX05PREVFVkVOVF9DaGlsZFJlbW92ZWQ6DQorICAgICAgICAgICAgT25DaGlsZFJlbW92ZWQocFNlbmRlciwgcFBhcmFtLCBwUGFyYW0yKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uV2lkZ2V0RGF0YUV2ZW50KENYRkFfV2lkZ2V0RGF0YSogcFNlbmRlciwgRlhfRFdPUkQgZHdFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSAsIEZYX0xQVk9JRCBwQWRkaXRpb25hbCAsIEZYX0xQVk9JRCBwQWRkaXRpb25hbDIgKQ0KK3sNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBTZW5kZXI7DQorICAgIHN3aXRjaCAoZHdFdmVudCkgew0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1BZGRlZDogew0KKyAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXRpY05vdGlmeSA9IHBXaWRnZXRBY2MtPkdldERvY1ZpZXcoKS0+SXNTdGF0aWNOb3RpZnkoKTsNCisgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCk7DQorICAgICAgICAgICAgICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJTdGF0aWNOb3RpZnkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQoKFhGQV9IV0lER0VUKXBXaWRnZXQsIHBXaWRnZXRBY2MsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkLCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3aGlsZSAocFdpZGdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+SXNMaXN0Qm94KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDWEZBX0ZGTGlzdEJveCopcFdpZGdldCktPkluc2VydEl0ZW0oKEZYX1dTVFIpKEZYX0xQQ1dTVFIpcFBhcmFtLCAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpcEFkZGl0aW9uYWwyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENYRkFfRkZDb21ib0JveCopcFdpZGdldCktPkluc2VydEl0ZW0oKEZYX1dTVFIpKEZYX0xQQ1dTVFIpcFBhcmFtLCAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpcEFkZGl0aW9uYWwyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlN0YXRpY05vdGlmeSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudCgoWEZBX0hXSURHRVQpcFdpZGdldCwgcFdpZGdldEFjYywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtQWRkZWQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbVJlbW92ZWQ6IHsNCisgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGF0aWNOb3RpZnkgPSBwV2lkZ2V0QWNjLT5HZXREb2NWaWV3KCktPklzU3RhdGljTm90aWZ5KCk7DQorICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBXaWRnZXQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiU3RhdGljTm90aWZ5KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KChYRkFfSFdJREdFVClwV2lkZ2V0LCBwV2lkZ2V0QWNjLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkLCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3aGlsZSAocFdpZGdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+SXNMaXN0Qm94KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDWEZBX0ZGTGlzdEJveCopcFdpZGdldCktPkRlbGV0ZUl0ZW0oKEZYX0lOVDMyKShGWF9VSU5UUFRSKXBQYXJhbSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDWEZBX0ZGQ29tYm9Cb3gqKXBXaWRnZXQpLT5EZWxldGVJdGVtKChGWF9JTlQzMikoRlhfVUlOVFBUUilwUGFyYW0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChiU3RhdGljTm90aWZ5KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KChYRkFfSFdJREdFVClwV2lkZ2V0LCBwV2lkZ2V0QWNjLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkLCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK0NYRkFfTGF5b3V0SXRlbSogQ1hGQV9GRk5vdGlmeTo6T25DcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBJWEZBX0RvY0xheW91dCogcExheW91dCA9IG1fcERvYy0+R2V0WEZBRG9jKCktPkdldERvY0xheW91dCgpOw0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcocExheW91dCk7DQorICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKEZYX05FVyBDWEZBX0ZGUGFnZVZpZXcocERvY1ZpZXcsIHBOb2RlKSk7DQorICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoRlhfTkVXIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwocE5vZGUpKTsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwQWNjKSB7DQorICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKEZYX05FVyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChwTm9kZSkpOw0KKyAgICB9DQorICAgIENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsNCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IE5VTEw7DQorICAgIHN3aXRjaChwQWNjLT5HZXRVSVR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkJhcmNvZGUocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnV0dG9uOg0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlB1c2hCdXR0b24ocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246DQorICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGQ2hlY2tCdXR0b24ocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDogew0KKyAgICAgICAgICAgICAgICBpZiAocEFjYy0+SXNMaXN0Qm94KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkxpc3RCb3gocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkNvbWJvQm94KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCisgICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZEYXRlVGltZUVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Og0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkltYWdlRWRpdChwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCisgICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZOdW1lcmljRWRpdChwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQ6DQorICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGUGFzc3dvcmRFZGl0KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NpZ25hdHVyZToNCisgICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZTaWduYXR1cmUocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQorICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJjOg0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkFyYyhwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9MaW5lOg0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkxpbmUocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOg0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlJlY3RhbmdsZShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlRleHQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2U6DQorICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGSW1hZ2UocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZEcmF3KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGU3ViRm9ybShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGRXhjbEdyb3VwKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RlZmF1bHRVaToNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcFdpZGdldCA9IE5VTEw7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwV2lkZ2V0LT5TZXREb2NWaWV3KHBEb2NWaWV3KTsNCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldExheW91dEl0ZW0oKTsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkxheW91dEV2ZW50KElYRkFfRG9jTGF5b3V0ICpwTGF5b3V0LCBDWEZBX0xheW91dEl0ZW0gKnBTZW5kZXIsIFhGQV9MQVlPVVRFVkVOVCBlRXZlbnQsIEZYX0xQVk9JRCBwUGFyYW0gLCBGWF9MUFZPSUQgcFBhcmFtMiApDQorew0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcocExheW91dCk7DQorICAgIGlmICghcERvY1ZpZXcgfHwgIVhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwU2VuZGVyKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHN3aXRjaCAoZUV2ZW50KSB7DQorICAgICAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9JdGVtQWRkZWQ6DQorICAgICAgICAgICAgT25MYXlvdXRJdGVtQWRkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nOg0KKyAgICAgICAgICAgIE9uTGF5b3V0SXRlbVJlbW92aW5nKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFZT1VURVZFTlRfUmVjdENoYW5nZWQ6DQorICAgICAgICAgICAgT25MYXlvdXRJdGVtUmVjdENoYW5nZWQocERvY1ZpZXcsIHBMYXlvdXQsIHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9TdGF0dXNDaGFuZ2VkOg0KKyAgICAgICAgICAgIE9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6U3RhcnRGaWVsZERyYXdMYXlvdXQoQ1hGQV9Ob2RlICpwSXRlbSwgRlhfRkxPQVQgJmZDYWxjV2lkdGgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodCkNCit7DQorICAgIENYRkFfV2lkZ2V0QWNjICpwQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSXRlbS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBBY2MpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwQWNjLT5TdGFydFdpZGdldExheW91dChmQ2FsY1dpZHRoLCBmQ2FsY0hlaWdodCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk5vdGlmeTo6RmluZFNwbGl0UG9zKENYRkFfTm9kZSAqcEl0ZW0sIEZYX0lOVDMyIGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHRQb3MpDQorew0KKyAgICBDWEZBX1dpZGdldEFjYyAqcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEl0ZW0tPkdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwQWNjKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIChYRkFfTEFZT1VUUkVTVUxUKXBBY2MtPkZpbmRTcGxpdFBvcyhpQmxvY2tJbmRleCwgZkNhbGNIZWlnaHRQb3MpOw0KK30NCitGWF9CT09MIENYRkFfRkZOb3RpZnk6OlJ1blNjcmlwdChDWEZBX05vZGUqIHBTY3JpcHQsIENYRkFfTm9kZSogcEZvcm1JdGVtKQ0KK3sNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgICBpZiAoIXBEb2NWaWV3KSB7DQorICAgICAgICByZXR1cm4gYlJldDsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEZvcm1JdGVtLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgICAgcmV0dXJuIGJSZXQ7DQorICAgIH0NCisgICAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07DQorICAgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOw0KKyAgICBGWEpTRV9IVkFMVUUgcFJldFZhbHVlID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaVJldCA9IHBXaWRnZXRBY2MtPkV4ZWN1dGVTY3JpcHQoQ1hGQV9TY3JpcHQocFNjcmlwdCksICZFdmVudFBhcmFtLCAmcFJldFZhbHVlKTsNCisgICAgaWYgKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzICYmIHBSZXRWYWx1ZSkgew0KKyAgICAgICAgYlJldCA9IEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihwUmV0VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwUmV0VmFsdWUpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9JTlQzMiBDWEZBX0ZGTm90aWZ5OjpFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLCBGWF9CT09MIGJJc0Zvcm1SZWFkeSwgRlhfQk9PTCBiUmVjdXJzaXZlLCBDWEZBX1dpZGdldEFjYyogcEV4Y2x1ZGUpDQorew0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgICAgaWYgKCFwRG9jVmlldykgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICB9DQorICAgIHJldHVybiBwRG9jVmlldy0+RXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwRm9ybU5vZGUsIGVFdmVudFR5cGUsIGJJc0Zvcm1SZWFkeSwgYlJlY3Vyc2l2ZSwgcEV4Y2x1ZGUgPyBwRXhjbHVkZS0+R2V0Tm9kZSgpIDogTlVMTCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6QWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgICAgaWYgKCFwRG9jVmlldykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOw0KKyAgICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7DQorfQ0KK1hGQV9IRE9DIENYRkFfRkZOb3RpZnk6OkdldEhET0MoKQ0KK3sNCisgICAgcmV0dXJuIChYRkFfSERPQyltX3BEb2M7DQorfQ0KK0lYRkFfRG9jUHJvdmlkZXIqIENYRkFfRkZOb3RpZnk6OkdldERvY1Byb3ZpZGVyKCkNCit7DQorICAgIHJldHVybiBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCk7DQorfQ0KK0lYRkFfQXBwUHJvdmlkZXIqIENYRkFfRkZOb3RpZnk6OkdldEFwcFByb3ZpZGVyKCkNCit7DQorICAgIHJldHVybiBtX3BEb2MtPkdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KK30NCitJWEZBX1dpZGdldEhhbmRsZXIqIENYRkFfRkZOb3RpZnk6OkdldFdpZGdldEhhbmRsZXIoKQ0KK3sNCisgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICAgIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkgOiBOVUxMOw0KK30NCitYRkFfSFdJREdFVAlDWEZBX0ZGTm90aWZ5OjpHZXRIV2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pDQorew0KKyAgICByZXR1cm4gKFhGQV9IV0lER0VUKVhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwTGF5b3V0SXRlbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T3BlbkRyb3BEb3duTGlzdChYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0Ow0KKyAgICBpZiAocFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICAgIHBEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQorICAgICgoQ1hGQV9GRkNvbWJvQm94KilwV2lkZ2V0KS0+T3BlbkRyb3BEb3duTGlzdCgpOw0KKyAgICBwRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQorICAgIHBEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRkZOb3RpZnk6OkdldEN1cnJlbnREYXRlVGltZSgpDQorew0KKyAgICBDRlhfVW5pdGltZSBkYXRhVGltZTsNCisgICAgZGF0YVRpbWUuTm93KCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVRpbWU7DQorICAgIHdzRGF0ZVRpbWUuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQlMDJkJTAyZFQlMDJkJTAyZCUwMmQiLCBkYXRhVGltZS5HZXRZZWFyKCksIGRhdGFUaW1lLkdldE1vbnRoKCksIGRhdGFUaW1lLkdldERheSgpLCBkYXRhVGltZS5HZXRIb3VyKCksIGRhdGFUaW1lLkdldE1pbnV0ZSgpLCBkYXRhVGltZS5HZXRTZWNvbmQoKSk7DQorICAgIHJldHVybiB3c0RhdGVUaW1lOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhKQ0KK3sNCisgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICAgIGlmICghcERvY1ZpZXcpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwRG9jVmlldy0+UmVzZXRXaWRnZXREYXRhKChDWEZBX1dpZGdldEFjYyopcFdpZGdldERhdGEpOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZGTm90aWZ5OjpHZXRMYXlvdXRTdGF0dXMoKQ0KK3sNCisgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICAgIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA6IDA7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6UnVuTm9kZUluaXRpYWxpemUoQ1hGQV9Ob2RlKiBwTm9kZSkNCit7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgICBpZiAoIXBEb2NWaWV3KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcERvY1ZpZXctPkFkZE5ld0Zvcm1Ob2RlKHBOb2RlKTsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUpDQorew0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgICAgaWYgKCFwRG9jVmlldykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBEb2NWaWV3LT5BZGRJbmRleENoYW5nZWRTdWJmb3JtKHBTdWJmb3JtTm9kZSk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRk5vdGlmeTo6R2V0Rm9jdXNXaWRnZXROb2RlKCkNCit7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgICBpZiAoIXBEb2NWaWV3KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBEb2NWaWV3LT5HZXRGb2N1c1dpZGdldEFjYygpOw0KKyAgICByZXR1cm4gcEFjYyA/IHBBY2MtPkdldE5vZGUoKSA6IE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6U2V0Rm9jdXNXaWRnZXROb2RlKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgICAgaWYgKCFwRG9jVmlldykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcE5vZGUgPyAoQ1hGQV9XaWRnZXRBY2MqKXBOb2RlLT5HZXRXaWRnZXREYXRhKCkgOiBOVUxMOw0KKyAgICBwRG9jVmlldy0+U2V0Rm9jdXNXaWRnZXRBY2MocEFjYyk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25Ob2RlUmVhZHkoQ1hGQV9Ob2RlICpwTm9kZSkNCit7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgICBpZiAoIXBEb2NWaWV3KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0VMRU1FTlQgaVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGlUeXBlKSkgew0KKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBGWF9ORVcgQ1hGQV9XaWRnZXRBY2MocERvY1ZpZXcsIChDWEZBX05vZGUqKXBOb2RlKTsNCisgICAgICAgIHBOb2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhLCBwQWNjLCAmZ3NfWEZBRGVsZXRlV2lkZ2V0QWNjKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKGlUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JpbmRJdGVtczoNCisgICAgICAgICAgICBwRG9jVmlldy0+bV9iaW5kSXRlbXMuQWRkKHBOb2RlKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFsaWRhdGU6IHsNCisgICAgICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPblZhbHVlQ2hhbmdpbmcoQ1hGQV9Ob2RlICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMikNCit7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgICBpZiAoIXBEb2NWaWV3KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1BhY2tldCA9IHBTZW5kZXItPkdldFBhY2tldElEKCk7DQorICAgIGlmIChkd1BhY2tldCAmIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgfSBlbHNlIGlmIChwU2VuZGVyLT5Jc0Zvcm1Db250YWluZXIoKSkgew0KKyAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0ciA9IChYRkFfQVRUUklCVVRFKShGWF9VSU5UUFRSKXBQYXJhbTsNCisgICAgICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ByZXNlbmNlKSB7DQorICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBTZW5kZXItPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgICAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgICAgICAgICB3aGlsZSAoKHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5BZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25WYWx1ZUNoYW5nZWQoQ1hGQV9Ob2RlICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMiwgRlhfTFBWT0lEIHBQYXJhbTMsIEZYX0xQVk9JRCBwUGFyYW00KQ0KK3sNCisgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICAgIGlmICghcERvY1ZpZXcpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1BhY2tldCA9IHBTZW5kZXItPkdldFBhY2tldElEKCk7DQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHIgPSAoWEZBX0FUVFJJQlVURSkoRlhfVUlOVFBUUilwUGFyYW07DQorICAgIGlmIChkd1BhY2tldCAmIFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IChDWEZBX05vZGUqKXBQYXJhbTM7DQorICAgICAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gKENYRkFfTm9kZSopcFBhcmFtNDsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVQVHlwZSA9IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICBGWF9CT09MIGJJc0NvbnRhaW5lck5vZGUgPSBwUGFyZW50Tm9kZS0+SXNDb250YWluZXJOb2RlKCk7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcFdpZGdldE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYlVwZGF0ZVByb3BlcnR5ID0gRkFMU0U7DQorICAgICAgICBwRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgICAgICAgc3dpdGNoIChlUFR5cGUpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NhcHRpb246IHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfVGV4dExheW91dCogcENhcE91dCA9IHBXaWRnZXRBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBDYXBPdXQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwQ2FwT3V0LT5VbmxvYWQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1VpOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFyYToNCisgICAgICAgICAgICAgICAgYlVwZGF0ZVByb3BlcnR5ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Gb250Og0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTWFyZ2luOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFsdWU6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JdGVtczoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYklzQ29udGFpbmVyTm9kZSAmJiBlQXR0ciA9PSBYRkFfQVRUUklCVVRFX0FjY2Vzcykgew0KKyAgICAgICAgICAgIGJVcGRhdGVQcm9wZXJ0eSA9IFRSVUU7DQorICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gcERvY1ZpZXctPklzU3RhdGljTm90aWZ5KCk7DQorICAgICAgICAgICAgaWYgKGJOb3RpZnkpIHsNCisgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+Tm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX0FjY2Vzc0NoYW5nZWQsIE5VTEwsIHBQYXJhbTIsIE5VTEwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgICAgICAgICAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZU5vZGVOb3RpZnkocFNlbmRlcik7DQorICAgICAgICAgICAgaWYgKGVQVHlwZSA9PSBYRkFfRUxFTUVOVF9WYWx1ZSB8fCBiSXNDb250YWluZXJOb2RlKSB7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IHBEb2NWaWV3LT5Jc1N0YXRpY05vdGlmeSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoYklzQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+VXBkYXRlVUlEaXNwbGF5KCk7DQorICAgICAgICAgICAgICAgICAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOw0KKyAgICAgICAgICAgICAgICAgICAgcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHBXaWRnZXRBY2MpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBXaWRnZXROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+VXBkYXRlVUlEaXNwbGF5KCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPk5vdGlmeUV2ZW50KFhGQV9XSURHRVRFVkVOVF9Qb3N0Q29udGVudENoYW5nZWQsIE5VTEwsIE5VTEwsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgICAgIHdoaWxlICgocFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCkpICE9IE5VTEwpIHsNCisgICAgICAgICAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiVXBkYXRlUHJvcGVydHkpIHsNCisgICAgICAgICAgICAgICAgcFdpZGdldC0+VXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcFdpZGdldC0+TGF5b3V0V2lkZ2V0KCk7DQorICAgICAgICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgICAgICAgICAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZU5vZGVOb3RpZnkocFNlbmRlcik7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkNoaWxkQWRkZWQoQ1hGQV9Ob2RlICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMikNCit7DQorICAgIGlmICghcFNlbmRlci0+SXNGb3JtQ29udGFpbmVyKCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgICAgaWYgKCFwRG9jVmlldykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkxheW91dFJlYWR5ID0gIShwRG9jVmlldy0+bV9iSW5MYXlvdXRTdGF0dXMpICYmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCk7DQorICAgIGlmIChiTGF5b3V0UmVhZHkpIHsNCisgICAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q2hhbmdlTWFyaygoWEZBX0hET0MpbV9wRG9jKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uQ2hpbGRSZW1vdmVkKENYRkFfTm9kZSAqcFNlbmRlciwgRlhfTFBWT0lEIHBQYXJhbSwgRlhfTFBWT0lEIHBQYXJhbTIpDQorew0KKyAgICBpZiAoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCkpIHsNCisgICAgICAgIEZYX0JPT0wgYkxheW91dFJlYWR5ID0gIShwRG9jVmlldy0+bV9iSW5MYXlvdXRTdGF0dXMpICYmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCk7DQorICAgICAgICBpZiAoYkxheW91dFJlYWR5KSB7DQorICAgICAgICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKChYRkFfSERPQyltX3BEb2MpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtQWRkKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgRlhfTFBWT0lEIHBQYXJhbSwgRlhfTFBWT0lEIHBQYXJhbTIpDQorew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcFNlbmRlcjsNCisgICAgRlhfSU5UMzIgaVBhZ2VJZHggPSAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpcFBhcmFtOw0KKyAgICBJWEZBX1BhZ2VWaWV3KiBwTmV3UGFnZVZpZXcgPSBwRG9jVmlldy0+R2V0UGFnZVZpZXcoaVBhZ2VJZHgpOw0KKyAgICBGWF9EV09SRCBkd1N0YXR1cyA9IChGWF9EV09SRCkoRlhfVUlOVFBUUilwUGFyYW0yOw0KKyAgICBGWF9EV09SRCBkd0ZpbHRlciA9IFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSB8IFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUgfCBYRkFfV0lER0VUU1RBVFVTX1ByaW50YWJsZTsNCisgICAgcFdpZGdldC0+TW9kaWZ5U3RhdHVzKGR3U3RhdHVzLCBkd0ZpbHRlcik7DQorICAgIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgew0KKyAgICAgICAgSVhGQV9QYWdlVmlldyogcFByZVBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsNCisgICAgICAgIGlmIChwUHJlUGFnZVZpZXcgIT0gcE5ld1BhZ2VWaWV3IHx8IChkd1N0YXR1cyAmIChYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlKSkgPT0gKFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSB8IFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUpKSB7DQorICAgICAgICAgICAgcFdpZGdldC0+U2V0UGFnZVZpZXcocE5ld1BhZ2VWaWV3KTsNCisgICAgICAgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KChYRkFfSFdJREdFVClwV2lkZ2V0LCBwV2lkZ2V0LT5HZXREYXRhQWNjKCksIFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQsIHBOZXdQYWdlVmlldywgcFByZVBhZ2VWaWV3KTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpID09IDApIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAocFdpZGdldC0+SXNMb2FkZWQoKSkgew0KKyAgICAgICAgICAgIENGWF9SZWN0RiBydE9sZDsNCisgICAgICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0T2xkKTsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnROZXcgPSBwV2lkZ2V0LT5SZUNhY2hlV2lkZ2V0UmVjdCgpOw0KKyAgICAgICAgICAgIGlmKHJ0T2xkICE9IHJ0TmV3KSB7DQorICAgICAgICAgICAgICAgIHBXaWRnZXQtPkxheW91dFdpZGdldCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoTlVMTCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwV2lkZ2V0LT5TZXRQYWdlVmlldyhwTmV3UGFnZVZpZXcpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMikNCit7DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopcFNlbmRlcjsNCisgICAgcERvY1ZpZXctPkRlbGV0ZUxheW91dEl0ZW0ocFdpZGdldCk7DQorICAgIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudCgoWEZBX0hXSURHRVQpcFdpZGdldCwgcFdpZGdldC0+R2V0RGF0YUFjYygpLCBYRkFfV0lER0VURVZFTlRfUHJlUmVtb3ZlZCwgTlVMTCwgTlVMTCk7DQorICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KE5VTEwpOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbVJlY3RDaGFuZ2VkKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgRlhfTFBWT0lEIHBQYXJhbSwgRlhfTFBWT0lEIHBQYXJhbTIpDQorew0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgRlhfTFBWT0lEIHBQYXJhbSwgRlhfTFBWT0lEIHBQYXJhbTIpDQorew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcFNlbmRlcjsNCisgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAoRlhfRFdPUkQpKEZYX1VJTlRQVFIpcFBhcmFtOw0KKyAgICBpZiAoZHdTdGF0dXMgPT0gMCkgew0KKyAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwUHJlSXRlbSA9IHBTZW5kZXItPkdldFByZXYoKTsNCisgICAgICAgIGlmIChwUHJlSXRlbSkgew0KKyAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBQcmVXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwUHJlSXRlbTsNCisgICAgICAgICAgICBpZiAocFByZVdpZGdldCkgew0KKyAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IHBQcmVXaWRnZXQtPkdldFN0YXR1cygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd09sZFN0YXR1cyA9IHBXaWRnZXQtPkdldFN0YXR1cygpOw0KKyAgICBGWF9EV09SRCBkd0ZpbHRlciA9IFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSB8IFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUgfCBYRkFfV0lER0VUU1RBVFVTX1ByaW50YWJsZTsNCisgICAgaWYgKChkd09sZFN0YXR1cyAmIGR3RmlsdGVyKSA9PSBkd1N0YXR1cykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBXaWRnZXQtPk1vZGlmeVN0YXR1cyhkd1N0YXR1cywgZHdGaWx0ZXIpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmI4MGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRkZOT1RJRllfSF8NCisjZGVmaW5lIF9GWEZBX0ZGTk9USUZZX0hfDQorY2xhc3MgQ1hGQV9GRk5vdGlmeSA6IHB1YmxpYyBJWEZBX05vdGlmeSwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGTm90aWZ5KENYRkFfRkZEb2MqIHBEb2MpOw0KKyAgICB+Q1hGQV9GRk5vdGlmeSgpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJT25QYWdlRXZlbnQoSVhGQV9MYXlvdXRQYWdlICpwU2VuZGVyLCBYRkFfUEFHRUVWRU5UIGVFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSA9IE5VTEwpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJT25Ob2RlRXZlbnQoQ1hGQV9Ob2RlICpwU2VuZGVyLCBYRkFfTk9ERUVWRU5UIGVFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSA9IE5VTEwsIEZYX0xQVk9JRCBwUGFyYW0yID0gTlVMTCwgRlhfTFBWT0lEIHBQYXJhbTMgPSBOVUxMLCBGWF9MUFZPSUQgcFBhcmFtNCA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCSAgICAgICAgT25XaWRnZXREYXRhRXZlbnQoQ1hGQV9XaWRnZXREYXRhKiBwU2VuZGVyLCBGWF9EV09SRCBkd0V2ZW50LCBGWF9MUFZPSUQgcFBhcmFtID0gTlVMTCwgRlhfTFBWT0lEIHBBZGRpdGlvbmFsID0gTlVMTCwgRlhfTFBWT0lEIHBBZGRpdGlvbmFsMiA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIENYRkFfTGF5b3V0SXRlbSoJT25DcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSAqcE5vZGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJT25MYXlvdXRFdmVudChJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBYRkFfTEFZT1VURVZFTlQgZUV2ZW50LCBGWF9MUFZPSUQgcFBhcmFtID0gTlVMTCwgRlhfTFBWT0lEIHBQYXJhbTIgPSBOVUxMKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVN0YXJ0RmllbGREcmF3TGF5b3V0KENYRkFfTm9kZSAqcEl0ZW0sIEZYX0ZMT0FUICZmQ2FsY1dpZHRoLCBGWF9GTE9BVCAmZkNhbGNIZWlnaHQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmluZFNwbGl0UG9zKENYRkFfTm9kZSAqcEl0ZW0sIEZYX0lOVDMyIGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHRQb3MpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pOw0KKyAgICB2aXJ0dWFsCUZYX0lOVDMyCQkJRXhlY0V2ZW50QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwgRlhfQk9PTCBiSXNGb3JtUmVhZHkgPSBGQUxTRSwgRlhfQk9PTCBiUmVjdXJzaXZlID0gVFJVRSwgQ1hGQV9XaWRnZXRBY2MJKiBwRXhjbHVkZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB2aXJ0dWFsIFhGQV9IRE9DCQkJR2V0SERPQygpOw0KKyAgICB2aXJ0dWFsIElYRkFfRG9jUHJvdmlkZXIqCUdldERvY1Byb3ZpZGVyKCk7DQorICAgIHZpcnR1YWwgSVhGQV9BcHBQcm92aWRlcioJR2V0QXBwUHJvdmlkZXIoKTsNCisgICAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqCUdldFdpZGdldEhhbmRsZXIoKTsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVAkJCUdldEhXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlPcGVuRHJvcERvd25MaXN0KFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQlHZXRDdXJyZW50RGF0ZVRpbWUoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRMYXlvdXRTdGF0dXMoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJ1bk5vZGVJbml0aWFsaXplKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJUnVuU3ViZm9ybUluZGV4Q2hhbmdlKENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlKTsNCisgICAgdmlydHVhbCBDWEZBX05vZGUqCQkJR2V0Rm9jdXNXaWRnZXROb2RlKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCU9uTm9kZVJlYWR5KENYRkFfTm9kZSAqcE5vZGUpOw0KKyAgICB2b2lkCU9uVmFsdWVDaGFuZ2luZyhDWEZBX05vZGUgKnBTZW5kZXIsIEZYX0xQVk9JRCBwUGFyYW0sIEZYX0xQVk9JRCBwUGFyYW0yKTsNCisgICAgdm9pZAlPblZhbHVlQ2hhbmdlZChDWEZBX05vZGUgKnBTZW5kZXIsIEZYX0xQVk9JRCBwUGFyYW0sIEZYX0xQVk9JRCBwUGFyYW0yLCBGWF9MUFZPSUQgcFBhcmFtMywgRlhfTFBWT0lEIHBQYXJhbTQpOw0KKyAgICB2b2lkCU9uQ2hpbGRBZGRlZChDWEZBX05vZGUgKnBTZW5kZXIsIEZYX0xQVk9JRCBwUGFyYW0sIEZYX0xQVk9JRCBwUGFyYW0yKTsNCisgICAgdm9pZAlPbkNoaWxkUmVtb3ZlZChDWEZBX05vZGUgKnBTZW5kZXIsIEZYX0xQVk9JRCBwUGFyYW0sIEZYX0xQVk9JRCBwUGFyYW0yKTsNCisgICAgdm9pZAlPbkxheW91dEl0ZW1BZGQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMik7DQorICAgIHZvaWQJT25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMik7DQorICAgIHZvaWQJT25MYXlvdXRJdGVtUmVjdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMik7DQorICAgIHZvaWQJT25MYXlvdXRJdGVtU3RhdHVzdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBGWF9MUFZPSUQgcFBhcmFtLCBGWF9MUFZPSUQgcFBhcmFtMik7DQorICAgIENYRkFfRkZEb2MqCQkJbV9wRG9jOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTkxYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5jcHAKQEAgLTAsMCArMSw0MjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9md2xhZGFwdGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwdXNoYnV0dG9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmNoZWNrYnV0dG9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmNob2ljZWxpc3QuaCINCisjaW5jbHVkZSAieGZhX2ZmaW1hZ2VlZGl0LmgiDQorI2luY2x1ZGUgInhmYV9mZnRleHRlZGl0LmgiDQorQ1hGQV9GRlBhZ2VWaWV3OjpDWEZBX0ZGUGFnZVZpZXcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBDWEZBX05vZGUqIHBQYWdlQXJlYSkNCisgICAgOiBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKHBQYWdlQXJlYSkNCisgICAgLCBtX3BEb2NWaWV3KHBEb2NWaWV3KQ0KKyAgICAsIG1fYkxvYWRlZChGQUxTRSkNCit7DQorfQ0KK0NYRkFfRkZQYWdlVmlldzo6fkNYRkFfRkZQYWdlVmlldygpDQorew0KK30NCitJWEZBX0RvY1ZpZXcqIENYRkFfRkZQYWdlVmlldzo6R2V0RG9jVmlldygpDQorew0KKyAgICByZXR1cm4gbV9wRG9jVmlldzsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRlBhZ2VWaWV3OjpHZXRQYWdlVmlld0luZGV4KCkNCit7DQorICAgIHJldHVybiBHZXRMYXlvdXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KK30NCit2b2lkIENYRkFfRkZQYWdlVmlldzo6R2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiAmcnRQYWdlKQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6Ow0KKyAgICBHZXRMYXlvdXRQYWdlKCktPkdldFBhZ2VTaXplKHN6KTsNCisgICAgcnRQYWdlLlNldCgwLCAwLCBzeik7DQorfQ0KK3ZvaWQgQ1hGQV9GRlBhZ2VWaWV3OjpHZXREaXNwbGF5TWF0cml4KENGWF9NYXRyaXggJm10LCBjb25zdCBDRlhfUmVjdCAmcnREaXNwLCBGWF9JTlQzMiBpUm90YXRlKQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6Ow0KKyAgICBHZXRMYXlvdXRQYWdlKCktPkdldFBhZ2VTaXplKHN6KTsNCisgICAgQ0ZYX1JlY3RGIGZkZVBhZ2U7DQorICAgIGZkZVBhZ2UuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgICBGREVfR2V0UGFnZU1hdHJpeChtdCwgZmRlUGFnZSwgcnREaXNwLCBpUm90YXRlLCAwKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRlBhZ2VWaWV3OjpMb2FkUGFnZVZpZXcoSUZYX1BhdXNlICpwUGF1c2UgKQ0KK3sNCisgICAgaWYgKG1fYkxvYWRlZCkgew0KKyAgICAgICAgcmV0dXJuIDEwMDsNCisgICAgfQ0KKyAgICBtX2JMb2FkZWQgPSBUUlVFOw0KKyAgICByZXR1cm4gMTAwOw0KK30NCit2b2lkIENYRkFfRkZQYWdlVmlldzo6VW5sb2FkUGFnZVZpZXcoKQ0KK3sNCisgICAgaWYgKCFtX2JMb2FkZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZQYWdlVmlldzo6SXNQYWdlVmlld0xvYWRlZCgpDQorew0KKyAgICByZXR1cm4gbV9iTG9hZGVkOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGUGFnZVZpZXc6OkdldFdpZGdldEJ5UG9zKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9iTG9hZGVkKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBDcmVhdGVXaWRnZXRJdGVyYXRvcigpOw0KKyAgICB3aGlsZSAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KilwSXRlcmF0b3ItPk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgaWYgKCEocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgICAgIEZYX0lOVDMyIHR5cGUgPSBwQWNjLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICBpZiAodHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiB0eXBlICE9IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZXaWRnZXR4ID0gZngsIGZXaWRnZXR5ID0gZnk7DQorICAgICAgICBwV2lkZ2V0LT5Sb3RhdGUyTm9ybWFsKGZXaWRnZXR4LCBmV2lkZ2V0eSk7DQorICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5PbkhpdFRlc3QoZldpZGdldHgsIGZXaWRnZXR5KTsNCisgICAgICAgIGlmICgoIEZXTF9XR1RISVRURVNUX0NsaWVudCA9PSBkd0ZsYWcNCisgICAgICAgICAgICAgICAgfHwgIEZXTF9XR1RISVRURVNUX1RyYW5zcGFyZW50ID09IGR3RmxhZykpIHsNCisgICAgICAgICAgICBwSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgICAgICAgICAgICByZXR1cm4gKFhGQV9IV0lER0VUKXBXaWRnZXQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcEl0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldEl0ZXJhdG9yKiBDWEZBX0ZGUGFnZVZpZXc6OkNyZWF0ZVdpZGdldEl0ZXJhdG9yKEZYX0RXT1JEIGR3VHJhdmVyc2VXYXkgLA0KKyAgICAgICAgRlhfRFdPUkQgZHdXaWRnZXRGaWx0ZXIgKQ0KK3sNCisgICAgc3dpdGNoIChkd1RyYXZlcnNlV2F5KSB7DQorICAgICAgICBjYXNlIFhGQV9UUkFWRVJTRVdBWV9UcmFudmFsc2U6DQorICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IodGhpcywgZHdXaWRnZXRGaWx0ZXIpOw0KKyAgICAgICAgY2FzZSBYRkFfVFJBVkVSU0VXQVlfRm9ybToNCisgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IodGhpcywgZHdXaWRnZXRGaWx0ZXIpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfUGFnZVdpZGdldEZpbHRlcihDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0LCBGWF9EV09SRCBkd0ZpbHRlciwgRlhfQk9PTCBiVHJhdmVyc2FsLCBGWF9CT09MIGJJZ25vcmVyZWxldmFudCkNCit7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgICBGWF9EV09SRCBkd1R5cGUgPSBkd0ZpbHRlciAmIFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZTsNCisgICAgaWYgKChkd1R5cGUgPT0gWEZBX1dJREdFVEZJTFRFUl9GaWVsZCkgJiYgKHBXaWRnZXRBY2MtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N0YXR1cyA9IHBXaWRnZXQtPkdldFN0YXR1cygpOw0KKyAgICBpZiAoYlRyYXZlcnNhbCAmJiAoZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0Rpc2FibGVkKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChiSWdub3JlcmVsZXZhbnQpIHsNCisgICAgICAgIHJldHVybiAoZHdTdGF0dXMgJiBYRkFfV0lER0VURklMVEVSX1Zpc2libGUpICE9IDA7DQorICAgIH0NCisgICAgZHdGaWx0ZXIgJj0gKFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8IFhGQV9XSURHRVRGSUxURVJfVmlld2FibGUgfCBYRkFfV0lER0VURklMVEVSX1ByaW50YWJsZSk7DQorICAgIHJldHVybiAoZHdGaWx0ZXIgJiBkd1N0YXR1cykgPT0gZHdGaWx0ZXI7DQorfQ0KK0NYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmlsdGVyKQ0KK3sNCisgICAgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7DQorICAgIG1fZHdGaWx0ZXIgPSBkd0ZpbHRlcjsNCisgICAgbV9zSXRlcmF0b3IuSW5pdCgoQ1hGQV9MYXlvdXRJdGVtKilwUGFnZVZpZXctPkdldExheW91dFBhZ2UoKSk7DQorICAgIG1fYklnbm9yZXJlbGV2YW50ID0gKChDWEZBX0ZGRG9jKiltX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKSktPkdldFhGQURvYygpLT5HZXRDdXJWZXJzaW9uTW9kZSgpIDwgWEZBX1ZFUlNJT05fMjA1Ow0KK30NCitDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjp+Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcigpDQorew0KK30NCit2b2lkIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OlJlc2V0KCkNCit7DQorICAgIG1fc0l0ZXJhdG9yLlJlc2V0KCk7DQorfQ0KK1hGQV9IV0lER0VUIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkNCit7DQorICAgIG1fc0l0ZXJhdG9yLlJlc2V0KCk7DQorICAgIGZvcihDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIGlmIChYRkFfSFdJREdFVCBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgICAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkNCit7DQorICAgIG1fc0l0ZXJhdG9yLlNldEN1cnJlbnQoTlVMTCk7DQorICAgIHJldHVybiBNb3ZlVG9QcmV2aW91cygpOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkNCit7DQorICAgIGZvcihDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIGlmIChYRkFfSFdJREdFVCBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgICAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpDQorew0KKyAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IG1fc0l0ZXJhdG9yLk1vdmVUb1ByZXYoKTsgcExheW91dEl0ZW07IHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvUHJldigpKSB7DQorICAgICAgICBpZiAoWEZBX0hXSURHRVQgaFdpZGdldCA9IEdldFdpZGdldChwTGF5b3V0SXRlbSkpIHsNCisgICAgICAgICAgICByZXR1cm4gaFdpZGdldDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0hXSURHRVQgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0Q3VycmVudFdpZGdldCgpDQorew0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICByZXR1cm4gcExheW91dEl0ZW0gPyAoWEZBX0hXSURHRVQpWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSA6IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisgICAgaWYoaFdpZGdldCAmJiBtX3NJdGVyYXRvci5TZXRDdXJyZW50KCgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkdldExheW91dEl0ZW0oKSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorWEZBX0hXSURHRVQgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0V2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pDQorew0KKyAgICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwTGF5b3V0SXRlbSkpIHsNCisgICAgICAgIGlmICghWEZBX1BhZ2VXaWRnZXRGaWx0ZXIocFdpZGdldCwgbV9kd0ZpbHRlciwgRkFMU0UsIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpICYmIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkgIT0gMCkgew0KKyAgICAgICAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAoWEZBX0hXSURHRVQpcFdpZGdldDsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmlsdGVyKQ0KKyAgICA6IG1fcFBhZ2VWaWV3KHBQYWdlVmlldykNCisgICAgLCBtX2R3RmlsdGVyKGR3RmlsdGVyKQ0KKyAgICAsIG1faUN1cldpZGdldCgtMSkNCit7DQorICAgIG1fYklnbm9yZXJlbGV2YW50ID0gKChDWEZBX0ZGRG9jKiltX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKSktPkdldFhGQURvYygpLT5HZXRDdXJWZXJzaW9uTW9kZSgpIDwgWEZBX1ZFUlNJT05fMjA1Ow0KKyAgICBSZXNldCgpOw0KK30NCitDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6On5DWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlJlbGVhc2UoKQ0KK3sNCisgICAgZGVsZXRlIHRoaXM7DQorfQ0KK3ZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpSZXNldCgpDQorew0KKyAgICBDcmVhdGVUYWJPcmRlcldpZGdldEFycmF5KCk7DQorICAgIG1faUN1cldpZGdldCA9IC0xOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkNCit7DQorICAgIGlmIChtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChYRkFfUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIFRSVUUsIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgICAgICAgICAgICBtX2lDdXJXaWRnZXQgPSBpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gKFhGQV9IV0lER0VUKW1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0hXSURHRVQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkNCit7DQorICAgIGlmIChtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gbV9UYWJPcmRlcldpZGdldEFycmF5LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgICAgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQorICAgICAgICAgICAgICAgIG1faUN1cldpZGdldCA9IGk7DQorICAgICAgICAgICAgICAgIHJldHVybiAoWEZBX0hXSURHRVQpbV9UYWJPcmRlcldpZGdldEFycmF5W21faUN1cldpZGdldF07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKQ0KK3sNCisgICAgZm9yIChGWF9JTlQzMiBpID0gbV9pQ3VyV2lkZ2V0ICsgMTsgaSA8IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQorICAgICAgICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsNCisgICAgICAgICAgICByZXR1cm4gKFhGQV9IV0lER0VUKW1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1faUN1cldpZGdldCA9IC0xOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0hXSURHRVQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpDQorew0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSBtX2lDdXJXaWRnZXQgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICAgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQorICAgICAgICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsNCisgICAgICAgICAgICByZXR1cm4gKFhGQV9IV0lER0VUKW1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1faUN1cldpZGdldCA9IC0xOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0hXSURHRVQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0KCkNCit7DQorICAgIGlmIChtX2lDdXJXaWRnZXQgPj0gMCkgew0KKyAgICAgICAgcmV0dXJuIChYRkFfSFdJREdFVCltX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXQoWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIEZYX0lOVDMyIGlXaWRnZXRJbmRleCA9IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5GaW5kKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KTsNCisgICAgaWYgKGlXaWRnZXRJbmRleCA+PSAwKSB7DQorICAgICAgICBtX2lDdXJXaWRnZXQgPSBpV2lkZ2V0SW5kZXg7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0VHJhdmVyc2VXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCkNCit7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgICBDWEZBX05vZGUqIHBUcmF2ZXJzYWwgPSBwQWNjLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RyYXZlcnNhbCk7DQorICAgIGlmIChwVHJhdmVyc2FsICE9IE5VTEwpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFRyYXZlcnNlID0gcFRyYXZlcnNhbC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVHJhdmVyc2UpOw0KKyAgICAgICAgaWYgKHBUcmF2ZXJzZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUcmF2ZXJzZVdpZGdldE5hbWU7DQorICAgICAgICAgICAgaWYgKHBUcmF2ZXJzZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1RyYXZlcnNlV2lkZ2V0TmFtZSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbmRXaWRnZXRCeU5hbWUod3NUcmF2ZXJzZVdpZGdldE5hbWUsIHBXaWRnZXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9GRldpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpGaW5kV2lkZ2V0QnlOYW1lKEZYX1dTVFIgd3NXaWRnZXROYW1lLCBDWEZBX0ZGV2lkZ2V0KiBwUmVmV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIHBSZWZXaWRnZXQtPkdldERvY1ZpZXcoKS0+R2V0V2lkZ2V0QnlOYW1lKHdzV2lkZ2V0TmFtZSwgcFJlZldpZGdldCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDcmVhdGVUYWJPcmRlcldpZGdldEFycmF5KCkNCit7DQorICAgIG1fVGFiT3JkZXJXaWRnZXRBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgQ1hGQV9XaWRnZXRBcnJheSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXk7DQorICAgIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheShTcGFjZU9yZGVyV2lkZ2V0QXJyYXkpOw0KKyAgICBGWF9JTlQzMiBuV2lkZ2V0Q291bnQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAobldpZGdldENvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbMF07DQorICAgIGZvciAoOyBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpIDwgbldpZGdldENvdW50OyApIHsNCisgICAgICAgIGlmIChtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuRmluZChoV2lkZ2V0KSA8IDApIHsNCisgICAgICAgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuQWRkKGhXaWRnZXQpOw0KKyAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgICAgICAgICAgIGlmIChwV2lkZ2V0QWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVdpZGdldEluZGV4ID0gU3BhY2VPcmRlcldpZGdldEFycmF5LkZpbmQoaFdpZGdldCkgKyAxOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFJhZGlvID0gU3BhY2VPcmRlcldpZGdldEFycmF5WyhpV2lkZ2V0SW5kZXgpICUgbldpZGdldENvdW50XTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUmFkaW8tPkdldERhdGFBY2MoKS0+R2V0RXhjbEdyb3VwKCkgIT0gcFdpZGdldEFjYykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5GaW5kKGhXaWRnZXQpIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVGFiT3JkZXJXaWRnZXRBcnJheS5BZGQocFJhZGlvKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlXaWRnZXRJbmRleCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBoVHJhdmVyc2VXaWRnZXQgPSBHZXRUcmF2ZXJzZVdpZGdldChoV2lkZ2V0KSkgew0KKyAgICAgICAgICAgICAgICBoV2lkZ2V0ID0gaFRyYXZlcnNlV2lkZ2V0Ow0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpV2lkZ2V0SW5kZXggPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuRmluZChoV2lkZ2V0KTsNCisgICAgICAgIGhXaWRnZXQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbKGlXaWRnZXRJbmRleCArIDEpICUgbldpZGdldENvdW50XTsNCisgICAgfQ0KK30NCitzdGF0aWMgRlhfSU5UMzIgWEZBX1RhYk9yZGVyV2lkZ2V0Q29tcGFyYXRvcihjb25zdCB2b2lkKiBwaFdpZGdldDEsIGNvbnN0IHZvaWQqIHBoV2lkZ2V0MikNCit7DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQxID0gKCooQ1hGQV9UYWJQYXJhbSoqKXBoV2lkZ2V0MSktPm1fcFdpZGdldDsNCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldDIgPSAoKihDWEZBX1RhYlBhcmFtKiopcGhXaWRnZXQyKS0+bV9wV2lkZ2V0Ow0KKyAgICBDRlhfUmVjdEYgcnQxLCBydDI7DQorICAgIHBXaWRnZXQxLT5HZXRXaWRnZXRSZWN0KHJ0MSk7DQorICAgIHBXaWRnZXQyLT5HZXRXaWRnZXRSZWN0KHJ0Mik7DQorICAgIEZYX0ZMT0FUIHgxID0gcnQxLmxlZnQsIHkxID0gcnQxLnRvcCwgeDIgPSBydDIubGVmdCwgeTIgPSBydDIudG9wOw0KKyAgICBpZiAoeTEgPCB5MiB8fCAoeTEgLSB5MiA8IFhGQV9GTE9BVF9QRVJDSVNJT04gJiYgeDEgPCB4MikpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICByZXR1cm4gMTsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok9yZGVyQ29udGFpbmVyKENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsIENYRkFfTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0sIENYRkFfVGFiUGFyYW0qIHBDb250YWluZXIsIEZYX0JPT0wgJmJDdXJyZW50SXRlbSwgRlhfQk9PTCYgYkNvbnRlbnRBcmVhLCBGWF9CT09MIGJNYXJzdGVyUGFnZSkNCit7DQorICAgIENGWF9QdHJBcnJheSB0YWJQYXJhbXM7DQorICAgIENYRkFfTGF5b3V0SXRlbSogcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgd2hpbGUocFNlYXJjaEl0ZW0pIHsNCisgICAgICAgIEZYX0JPT0wgYklzQ29udGVudExheW91dEl0ZW0gPSAoKENYRkFfTGF5b3V0SXRlbUltcGwqKXBTZWFyY2hJdGVtKS0+SXNDb250ZW50TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgaWYoIWJJc0NvbnRlbnRMYXlvdXRJdGVtKSB7DQorICAgICAgICAgICAgYkNvbnRlbnRBcmVhID0gVFJVRTsNCisgICAgICAgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJNYXJzdGVyUGFnZSAmJiBiQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiTWFyc3RlclBhZ2UgfHwgYkNvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IEdldFdpZGdldChwU2VhcmNoSXRlbSk7DQorICAgICAgICAgICAgaWYgKCFoV2lkZ2V0KSB7DQorICAgICAgICAgICAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocENvbnRhaW5lckl0ZW0gJiYgKHBTZWFyY2hJdGVtLT5HZXRQYXJlbnQoKSAhPSBwQ29udGFpbmVySXRlbSkpIHsNCisgICAgICAgICAgICAgICAgYkN1cnJlbnRJdGVtID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfVGFiUGFyYW0qIHBQYXJhbSA9IEZYX05FVyBDWEZBX1RhYlBhcmFtOw0KKyAgICAgICAgICAgIHBQYXJhbS0+bV9wV2lkZ2V0ID0gaFdpZGdldDsNCisgICAgICAgICAgICB0YWJQYXJhbXMuQWRkKHBQYXJhbSk7DQorICAgICAgICAgICAgaWYgKFhGQV9Jc0xheW91dEVsZW1lbnQocFNlYXJjaEl0ZW0tPkdldEZvcm1Ob2RlKCktPkdldENsYXNzSUQoKSwgVFJVRSkpIHsNCisgICAgICAgICAgICAgICAgT3JkZXJDb250YWluZXIoc0l0ZXJhdG9yLCBwU2VhcmNoSXRlbSwgcFBhcmFtLCBiQ3VycmVudEl0ZW0sIGJDb250ZW50QXJlYSwgYk1hcnN0ZXJQYWdlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkN1cnJlbnRJdGVtKSB7DQorICAgICAgICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgICBiQ3VycmVudEl0ZW0gPSBGQUxTRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ2hpbGRyZW4gPSB0YWJQYXJhbXMuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaUNoaWxkcmVuID4gMSkgew0KKyAgICAgICAgRlhTWVNfcXNvcnQodGFiUGFyYW1zLkdldERhdGEoKSwgaUNoaWxkcmVuLCBzaXplb2YoRlhfTFBWT0lEKSwgWEZBX1RhYk9yZGVyV2lkZ2V0Q29tcGFyYXRvcik7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpU3RhcnQgPSAwOyBpU3RhcnQgPCBpQ2hpbGRyZW47IGlTdGFydCsrKSB7DQorICAgICAgICBDWEZBX1RhYlBhcmFtKiBwUGFyYW0gPSAoQ1hGQV9UYWJQYXJhbSopdGFiUGFyYW1zW2lTdGFydF07DQorICAgICAgICBwQ29udGFpbmVyLT5tX0NoaWxkcmVuLkFkZChwUGFyYW0tPm1fcFdpZGdldCk7DQorICAgICAgICBpZiAocFBhcmFtLT5tX0NoaWxkcmVuLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICBwQ29udGFpbmVyLT5tX0NoaWxkcmVuLkFwcGVuZChwUGFyYW0tPm1fQ2hpbGRyZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVsZXRlIHBQYXJhbTsNCisgICAgfQ0KKyAgICB0YWJQYXJhbXMuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDcmVhdGVTcGFjZU9yZGVyV2lkZ2V0QXJyYXkoQ1hGQV9XaWRnZXRBcnJheSYgV2lkZ2V0QXJyYXkpDQorew0KKyAgICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBzSXRlcmF0b3I7DQorICAgIHNJdGVyYXRvci5Jbml0KChDWEZBX0xheW91dEl0ZW0qKW1fcFBhZ2VWaWV3LT5HZXRMYXlvdXRQYWdlKCkpOw0KKyAgICBDWEZBX1RhYlBhcmFtKiBwUGFyYW0gPSBGWF9ORVcgQ1hGQV9UYWJQYXJhbTsNCisgICAgRlhfQk9PTCBiQ3VycmVudEl0ZW0gPSBGQUxTRTsNCisgICAgRlhfQk9PTCBiQ29udGVudEFyZWEgPSBGQUxTRTsNCisgICAgT3JkZXJDb250YWluZXIoJnNJdGVyYXRvciwgTlVMTCwgcFBhcmFtLCBiQ3VycmVudEl0ZW0sIGJDb250ZW50QXJlYSk7DQorICAgIGlmIChwUGFyYW0tPm1fQ2hpbGRyZW4uR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgV2lkZ2V0QXJyYXkuQXBwZW5kKHBQYXJhbS0+bV9DaGlsZHJlbik7DQorICAgIH0NCisgICAgc0l0ZXJhdG9yLlJlc2V0KCk7DQorICAgIGJDdXJyZW50SXRlbSA9IEZBTFNFOw0KKyAgICBiQ29udGVudEFyZWEgPSBGQUxTRTsNCisgICAgcFBhcmFtLT5tX0NoaWxkcmVuLlJlbW92ZUFsbCgpOw0KKyAgICBPcmRlckNvbnRhaW5lcigmc0l0ZXJhdG9yLCBOVUxMLCBwUGFyYW0sIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhLCBUUlVFKTsNCisgICAgaWYgKHBQYXJhbS0+bV9DaGlsZHJlbi5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICBXaWRnZXRBcnJheS5BcHBlbmQocFBhcmFtLT5tX0NoaWxkcmVuKTsNCisgICAgfQ0KKyAgICBkZWxldGUgcFBhcmFtOw0KK30NCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KK3sNCisgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pKSB7DQorICAgICAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkgJiYgKHBXaWRnZXQtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKSkgew0KKyAgICAgICAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwV2lkZ2V0Ow0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJlMWI5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuaApAQCAtMCwwICsxLDk5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9QQUdFVklFV19JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9QQUdFVklFV19JTVBfSA0KK2NsYXNzIENYRkFfRkZXaWRnZXQ7DQorY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7DQorY2xhc3MgQ1hGQV9GRlBhZ2VWaWV3IDogcHVibGljIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwsIHB1YmxpYyBJWEZBX1BhZ2VWaWV3DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRlBhZ2VWaWV3KENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEpOw0KKyAgICB+Q1hGQV9GRlBhZ2VWaWV3KCk7DQorICAgIHZpcnR1YWwgSVhGQV9Eb2NWaWV3KglHZXREb2NWaWV3KCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldFBhZ2VWaWV3SW5kZXgoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiAmcnRQYWdlKTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4ICZtdCwgY29uc3QgQ0ZYX1JlY3QgJnJ0RGlzcCwgRlhfSU5UMzIgaVJvdGF0ZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCUxvYWRQYWdlVmlldyhJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlVbmxvYWRQYWdlVmlldygpOw0KKyAgICBGWF9CT09MCQkJCQlJc1BhZ2VWaWV3TG9hZGVkKCk7DQorDQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQJCUdldFdpZGdldEJ5UG9zKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgSVhGQV9XaWRnZXRJdGVyYXRvciogQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoRlhfRFdPUkQgZHdUcmF2ZXJzZVdheSA9IFhGQV9UUkFWRVJTRVdBWV9Gb3JtLA0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3V2lkZ2V0RmlsdGVyID0gWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8IFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSk7DQorICAgIElYRkFfTGF5b3V0UGFnZSoJCUdldExheW91dFBhZ2UoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKElYRkFfTGF5b3V0UGFnZSopdGhpczsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ1hGQV9GRkRvY1ZpZXcqCQkJbV9wRG9jVmlldzsNCisgICAgRlhfQk9PTAkJCQkJbV9iTG9hZGVkOw0KK307DQordHlwZWRlZgkJQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0xheW91dEl0ZW0sIENYRkFfVHJhdmVyc2VTdHJhdGVneV9MYXlvdXRJdGVtPiBDWEZBX0xheW91dEl0ZW1JdGVyYXRvcjsNCitjbGFzcyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3IsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfRFdPUkQgZHdGaWx0ZXIpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0KCk7DQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQJCQlNb3ZlVG9GaXJzdCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvTGFzdCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvTmV4dCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUCQkJTW92ZVRvUHJldmlvdXMoKTsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVAkJCUdldEN1cnJlbnRXaWRnZXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEN1cnJlbnRXaWRnZXQoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorcHJvdGVjdGVkOg0KKyAgICBYRkFfSFdJREdFVAkJCQkJR2V0V2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pOw0KKyAgICBDWEZBX0ZGUGFnZVZpZXcqCQkJbV9wUGFnZVZpZXc7DQorICAgIFhGQV9IV0lER0VUCQkJCQltX2hDdXJXaWRnZXQ7DQorICAgIEZYX0RXT1JECQkJCQltX2R3RmlsdGVyOw0KKyAgICBGWF9CT09MCQkJCQkJbV9iSWdub3JlcmVsZXZhbnQ7DQorICAgIENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yCQltX3NJdGVyYXRvcjsNCit9Ow0KK3R5cGVkZWYgCUNGWF9BcnJheVRlbXBsYXRlPENYRkFfRkZXaWRnZXQqPiBDWEZBX1dpZGdldEFycmF5Ow0KK2NsYXNzIENYRkFfVGFiUGFyYW0gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfVGFiUGFyYW0oKSA6IG1fcFdpZGdldChOVUxMKSB7fQ0KKyAgICB+Q1hGQV9UYWJQYXJhbSgpIHt9DQorDQorICAgIENYRkFfRkZXaWRnZXQqCQltX3BXaWRnZXQ7DQorICAgIENYRkFfV2lkZ2V0QXJyYXkJCW1fQ2hpbGRyZW47DQorfTsNCitjbGFzcyBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IgOiBwdWJsaWMgSVhGQV9XaWRnZXRJdGVyYXRvciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmlsdGVyKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKCk7DQorDQorICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorDQorICAgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUIE1vdmVUb0ZpcnN0KCk7DQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQgTW92ZVRvTGFzdCgpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUIE1vdmVUb05leHQoKTsNCisgICAgdmlydHVhbCBYRkFfSFdJREdFVCBNb3ZlVG9QcmV2aW91cygpOw0KKyAgICB2aXJ0dWFsIFhGQV9IV0lER0VUIEdldEN1cnJlbnRXaWRnZXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlTZXRDdXJyZW50V2lkZ2V0KFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KK3Byb3RlY3RlZDoNCisgICAgQ1hGQV9XaWRnZXRBcnJheQkJCQkJCW1fVGFiT3JkZXJXaWRnZXRBcnJheTsNCisgICAgQ1hGQV9GRlBhZ2VWaWV3KgkJCQkJbV9wUGFnZVZpZXc7DQorICAgIEZYX0RXT1JECQkJCQkJCW1fZHdGaWx0ZXI7DQorICAgIEZYX0lOVDMyCQkJCQkJCW1faUN1cldpZGdldDsNCisgICAgRlhfQk9PTAkJCQkJCQkJbV9iSWdub3JlcmVsZXZhbnQ7DQorICAgIENYRkFfRkZXaWRnZXQqCQkJR2V0VHJhdmVyc2VXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCk7DQorICAgIENYRkFfRkZXaWRnZXQqCQkJRmluZFdpZGdldEJ5TmFtZShGWF9XU1RSIHdzV2lkZ2V0TmFtZSwgQ1hGQV9GRldpZGdldCogcFJlZldpZGdldCk7DQorICAgIHZvaWQJCQkJCUNyZWF0ZVRhYk9yZGVyV2lkZ2V0QXJyYXkoKTsNCisgICAgdm9pZAkJCQkJQ3JlYXRlU3BhY2VPcmRlcldpZGdldEFycmF5KENYRkFfV2lkZ2V0QXJyYXkmIFdpZGdldEFycmF5KTsNCisgICAgQ1hGQV9GRldpZGdldCoJCQlHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICAgIHZvaWQJCQkJCU9yZGVyQ29udGFpbmVyKENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsIENYRkFfTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0sIENYRkFfVGFiUGFyYW0qIHBDb250YWluZXIsIEZYX0JPT0wgJmJDdXJyZW50SXRlbSwgRlhfQk9PTCYgYkNvbnRlbnRBcmVhLCBGWF9CT09MIGJNYXJzdGVyUGFnZSA9IEZBTFNFKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4YjcxYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwCkBAIC0wLDAgKzEsMTYyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZHJhdy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYXRoLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCitDWEZBX0ZGTGluZTo6Q1hGQV9GRkxpbmUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRkxpbmU6On5DWEZBX0ZGTGluZSgpDQorew0KK30NCit2b2lkIENYRkFfRkZMaW5lOjpHZXRSZWN0RnJvbUhhbmQoQ0ZYX1JlY3RGICZyZWN0LCBGWF9JTlQzMiBpSGFuZCwgRlhfRkxPQVQgZkxpbmVXaWR0aCkNCit7DQorICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmTGluZVdpZHRoIC8gMi4wZjsNCisgICAgaWYgKHJlY3QuaGVpZ2h0IDwgMS4wZikgew0KKyAgICAgICAgc3dpdGNoIChpSGFuZCkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICAgICAgICAgICAgcmVjdC50b3AgLT0gZkhhbGZXaWR0aDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gZkhhbGZXaWR0aDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChyZWN0LndpZHRoIDwgMS4wZikgew0KKyAgICAgICAgc3dpdGNoIChpSGFuZCkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGZIYWxmV2lkdGg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICAgICAgICAgIHJlY3QubGVmdCArPSBmSGFsZldpZHRoOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHN3aXRjaCAoaUhhbmQpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICAgICAgICAgIHJlY3QuSW5mbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgICAgICAgcmVjdC5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZMaW5lOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgIGlmICghdmFsdWUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0xpbmUgbGluZU9iagkgPSB2YWx1ZS5HZXRMaW5lKCk7DQorICAgIEZYX0FSR0IgbGluZUNvbG9yCSA9IDB4RkYwMDAwMDA7DQorICAgIEZYX0lOVDMyIGlTdHJva2VUeXBlID0gMDsNCisgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCAgPSAxLjBmOw0KKyAgICBGWF9CT09MIGJTbG9wZSA9IGxpbmVPYmouR2V0U2xvcCgpOw0KKyAgICBGWF9JTlQzMiBpQ2FwID0gMDsNCisgICAgQ1hGQV9FZGdlIGVkZ2UgPSBsaW5lT2JqLkdldEVkZ2UoKTsNCisgICAgaWYgKGVkZ2UuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIGlmIChlZGdlLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGxpbmVDb2xvcgk9IGVkZ2UuR2V0Q29sb3IoKTsNCisgICAgICAgIGlTdHJva2VUeXBlID0gZWRnZS5HZXRTdHJva2VUeXBlKCk7DQorICAgICAgICBmTGluZVdpZHRoCT0gZWRnZS5HZXRUaGlja25lc3MoKTsNCisgICAgICAgIGlDYXAgPSBlZGdlLkdldENhcFR5cGUoKTsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRMaW5lOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydExpbmUpOw0KKyAgICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkgew0KKyAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydExpbmUsIG1nV2lkZ2V0KTsNCisgICAgfQ0KKyAgICBHZXRSZWN0RnJvbUhhbmQocnRMaW5lLCBsaW5lT2JqLkdldEhhbmQoKSwgZkxpbmVXaWR0aCk7DQorICAgIENGWF9QYXRoIGxpbmVQYXRoOw0KKyAgICBsaW5lUGF0aC5DcmVhdGUoKTsNCisgICAgaWYgKGJTbG9wZSAmJiBydExpbmUucmlnaHQoKSA+IDAuMGYgJiYgcnRMaW5lLmJvdHRvbSgpID4gMC4wZikgew0KKyAgICAgICAgbGluZVBhdGguQWRkTGluZShydExpbmUucmlnaHQoKSwgcnRMaW5lLnRvcCwgcnRMaW5lLmxlZnQsIHJ0TGluZS5ib3R0b20oKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBsaW5lUGF0aC5BZGRMaW5lKHJ0TGluZS5sZWZ0LCBydExpbmUudG9wLCBydExpbmUucmlnaHQoKSwgcnRMaW5lLmJvdHRvbSgpKTsNCisgICAgfQ0KKyAgICBDRlhfQ29sb3IgY29sb3IobGluZUNvbG9yKTsNCisgICAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBwR1MtPlNldExpbmVXaWR0aChmTGluZVdpZHRoLCBUUlVFKTsNCisgICAgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChwR1MsIGlTdHJva2VUeXBlLCBpQ2FwKTsNCisgICAgcEdTLT5TZXRTdHJva2VDb2xvcigmY29sb3IpOw0KKyAgICBwR1MtPlNldExpbmVDYXAoWEZBX0xpbmVDYXBUb0ZYR0UoaUNhcCkpOw0KKyAgICBwR1MtPlN0cm9rZVBhdGgoJmxpbmVQYXRoLCAmbXRSb3RhdGUpOw0KKyAgICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK0NYRkFfRkZBcmM6OkNYRkFfRkZBcmMoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRkFyYzo6fkNYRkFfRkZBcmMoKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZGQXJjOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgIGlmICghdmFsdWUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0FyYyBhcmNPYmogPSB2YWx1ZS5HZXRBcmMoKTsNCisgICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgICAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0QXJjOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEFyYyk7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0QXJjLCBtZ1dpZGdldCk7DQorICAgIH0NCisgICAgRHJhd0JvcmRlcihwR1MsIGFyY09iaiwgcnRBcmMsICZtdFJvdGF0ZSk7DQorfQ0KK0NYRkFfRkZSZWN0YW5nbGU6OkNYRkFfRkZSZWN0YW5nbGUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRlJlY3RhbmdsZTo6fkNYRkFfRkZSZWN0YW5nbGUoKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZGUmVjdGFuZ2xlOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgIGlmICghdmFsdWUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1JlY3RhbmdsZSBydE9iaiA9IHZhbHVlLkdldFJlY3RhbmdsZSgpOw0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocmVjdCk7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJlY3QsIG1nV2lkZ2V0KTsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBEcmF3Qm9yZGVyKHBHUywgcnRPYmosIHJlY3QsICZtdFJvdGF0ZSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgyOGYzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0RSQVdfUEFUSF9JTVBfSA0KKyNkZWZpbmUgX1hGQV9EUkFXX1BBVEhfSU1QX0gNCitjbGFzcyBDWEZBX0ZGTGluZSA6IHB1YmxpYyBDWEZBX0ZGRHJhdw0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZMaW5lKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGTGluZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIEZYX0lOVDMyIGlSb3RhdGUgPSAwKTsNCitwcml2YXRlOg0KKyAgICB2b2lkCQkJCQlHZXRSZWN0RnJvbUhhbmQoQ0ZYX1JlY3RGICZyZWN0LCBGWF9JTlQzMiBpSGFuZCwgRlhfRkxPQVQgZkxpbmVXaWR0aCk7DQorfTsNCitjbGFzcyBDWEZBX0ZGQXJjIDogcHVibGljIENYRkFfRkZEcmF3DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRkFyYyhDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRkFyYygpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIEZYX0lOVDMyIGlSb3RhdGUgPSAwKTsNCit9Ow0KK2NsYXNzIENYRkFfRkZSZWN0YW5nbGUgOiBwdWJsaWMgQ1hGQV9GRkRyYXcNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGUmVjdGFuZ2xlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGUmVjdGFuZ2xlKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgRlhfSU5UMzIgaVJvdGF0ZSA9IDApOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjVjYjRmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRhY2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCitDWEZBX0ZGUHVzaEJ1dHRvbjo6Q1hGQV9GRlB1c2hCdXR0b24oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCisgICAgLCBtX3BSb2xsb3ZlclRleHRMYXlvdXQoTlVMTCkNCisgICAgLCBtX3BEb3duVGV4dExheW91dChOVUxMKQ0KKyAgICAsIG1fcERvd25Qcm92aWRlcihOVUxMKQ0KKyAgICAsIG1fcFJvbGxQcm92aWRlcihOVUxMKQ0KKyAgICAsIG1fcE9sZERlbGVnYXRlKE5VTEwpDQorew0KK30NCitDWEZBX0ZGUHVzaEJ1dHRvbjo6fkNYRkFfRkZQdXNoQnV0dG9uKCkNCit7DQorICAgIENYRkFfRkZQdXNoQnV0dG9uOjpVbmxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBGWF9JTlQzMiBpUm90YXRlICkNCit7DQorICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgICAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQorICAgIFJlbmRlckhpZ2hsaWdodENhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCk7DQorICAgIG10LkNvbmNhdChtdFJvdGF0ZSk7DQorICAgIEdldEFwcCgpLT5HZXRXaWRnZXRNZ3JEZWxlZ2F0ZSgpLT5PbkRyYXdXaWRnZXQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgcEdTLCAmbXQpOw0KK30NCitGWF9CT09MIENYRkFfRkZQdXNoQnV0dG9uOjpMb2FkV2lkZ2V0KCkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX3BOb3JtYWxXaWRnZXQgPT0gTlVMTCk7DQorICAgIENGV0xfUHVzaEJ1dHRvbiogcFB1c2hCdXR0b24gPSBDRldMX1B1c2hCdXR0b246OkNyZWF0ZSgpOw0KKyAgICBpZiAocFB1c2hCdXR0b24pIHsNCisgICAgICAgIHBQdXNoQnV0dG9uLT5Jbml0aWFsaXplKCk7DQorICAgIH0NCisgICAgbV9wT2xkRGVsZWdhdGUgPSBwUHVzaEJ1dHRvbi0+U2V0RGVsZWdhdGUodGhpcyk7DQorICAgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcFB1c2hCdXR0b247DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQorICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIExvYWRIaWdobGlnaHRDYXB0aW9uKCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gMDsNCisgICAgc3dpdGNoKG1fcERhdGFBY2MtPkdldEJ1dHRvbkhpZ2hsaWdodCgpKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkOg0KKyAgICAgICAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlSW52ZXJ0ZWQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX091dGxpbmU6DQorICAgICAgICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVPdXRMaW5lOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QdXNoOg0KKyAgICAgICAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlUHVzaDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlRXgsIDB4RkZGRkZGRkYpOw0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpVbmxvYWRXaWRnZXQoKQ0KK3sNCisgICAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCkgew0KKyAgICAgICAgZGVsZXRlIG1fcFJvbGxvdmVyVGV4dExheW91dDsNCisgICAgICAgIG1fcFJvbGxvdmVyVGV4dExheW91dCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcERvd25UZXh0TGF5b3V0KSB7DQorICAgICAgICBkZWxldGUgbV9wRG93blRleHRMYXlvdXQ7DQorICAgICAgICBtX3BEb3duVGV4dExheW91dCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcERvd25Qcm92aWRlcikgew0KKyAgICAgICAgZGVsZXRlIG1fcERvd25Qcm92aWRlcjsNCisgICAgICAgIG1fcERvd25Qcm92aWRlciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcFJvbGxQcm92aWRlcikgew0KKyAgICAgICAgZGVsZXRlIG1fcFJvbGxQcm92aWRlcjsNCisgICAgICAgIG1fcFJvbGxQcm92aWRlciA9IE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TGF5b3V0V2lkZ2V0KCkNCit7DQorICAgIENYRkFfRkZXaWRnZXQ6OkxheW91dFdpZGdldCgpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgICAgbV9ydFVJID0gcnRXaWRnZXQ7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0V2lkZ2V0LCBtZ1dpZGdldCk7DQorICAgIH0NCisgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQorICAgIG1fcnRDYXB0aW9uLlNldChydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQpOw0KKyAgICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQorICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICAgIH0NCisgICAgTGF5b3V0SGlnaGxpZ2h0Q2FwdGlvbigpOw0KKyAgICBTZXRGV0xSZWN0KCk7DQorICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRMaW5lV2lkdGgoKQ0KK3sNCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gbV9wRGF0YUFjYy0+R2V0Qm9yZGVyKCk7DQorICAgIGlmIChib3JkZXIuSXNFeGlzdEluWE1MKCkgJiYgKGJvcmRlci5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpKSB7DQorICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKDApOw0KKyAgICAgICAgcmV0dXJuIGVkZ2UuR2V0VGhpY2tuZXNzKCk7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9GRlB1c2hCdXR0b246OkdldExpbmVDb2xvcigpDQorew0KKyAgICByZXR1cm4gMHhGRjAwMDAwMDsNCit9DQorRlhfQVJHQiBDWEZBX0ZGUHVzaEJ1dHRvbjo6R2V0RmlsbENvbG9yKCkNCit7DQorICAgIHJldHVybiAweEZGRkZGRkZGOw0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpMb2FkSGlnaGxpZ2h0Q2FwdGlvbigpDQorew0KKyAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUm9sbG92ZXI7DQorICAgICAgICAgICAgRlhfQk9PTCBiUmljaFRleHQ7DQorICAgICAgICAgICAgaWYgKG1fcERhdGFBY2MtPkdldEJ1dHRvblJvbGxvdmVyKHdzUm9sbG92ZXIsIGJSaWNoVGV4dCkpIHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcFJvbGxQcm92aWRlciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BSb2xsUHJvdmlkZXIgPSBGWF9ORVcgQ1hGQV9UZXh0UHJvdmlkZXIobV9wRGF0YUFjYywgWEZBX1RFWFRQUk9WSURFUlRZUEVfUm9sbG92ZXIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcFJvbGxvdmVyVGV4dExheW91dCA9IEZYX05FVyBDWEZBX1RleHRMYXlvdXQobV9wUm9sbFByb3ZpZGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3duOw0KKyAgICAgICAgICAgIGlmIChtX3BEYXRhQWNjLT5HZXRCdXR0b25Eb3duKHdzRG93biwgYlJpY2hUZXh0KSkgew0KKyAgICAgICAgICAgICAgICBpZiAobV9wRG93blByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcERvd25Qcm92aWRlciA9IEZYX05FVyBDWEZBX1RleHRQcm92aWRlcihtX3BEYXRhQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9Eb3duKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BEb3duVGV4dExheW91dCA9IEZYX05FVyBDWEZBX1RleHRMYXlvdXQobV9wRG93blByb3ZpZGVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TGF5b3V0SGlnaGxpZ2h0Q2FwdGlvbigpDQorew0KKyAgICBDRlhfU2l6ZUYgc3o7DQorICAgIHN6LlNldChtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCisgICAgTGF5b3V0Q2FwdGlvbigpOw0KKyAgICBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0KSB7DQorICAgICAgICBtX3BSb2xsb3ZlclRleHRMYXlvdXQtPkxheW91dChzeik7DQorICAgIH0NCisgICAgaWYgKG1fcERvd25UZXh0TGF5b3V0KSB7DQorICAgICAgICBtX3BEb3duVGV4dExheW91dC0+TGF5b3V0KHN6KTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpSZW5kZXJIaWdobGlnaHRDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICkNCit7DQorICAgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICAgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IG1fcnRDYXB0aW9uOw0KKyAgICAgICAgcnRDbGlwLkludGVyc2VjdChydFdpZGdldCk7DQorICAgICAgICBDRlhfTWF0cml4IG10Ow0KKyAgICAgICAgbXQuU2V0KDEsIDAsIDAsIDEsIG1fcnRDYXB0aW9uLmxlZnQsIG1fcnRDYXB0aW9uLnRvcCk7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgICAgICAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOw0KKyAgICAgICAgICAgIGlmIChtX3BEb3duVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgICAgICAgICAgIGlmIChtX3BEb3duVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BSb2xsb3ZlclRleHRMYXlvdXQgJiYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgICAgICAgICAgIGlmIChtX3BSb2xsb3ZlclRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ2FwVGV4dExheW91dCkgew0KKyAgICAgICAgICAgIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENYRkFfRkZQdXNoQnV0dG9uOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQorew0KKyAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSCSBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KK3sNCisgICAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorfQ0KK0ZXTF9FUlIJQ1hGQV9GRlB1c2hCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZCkgew0KKyAgICAgICAgaWYgKChtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSAmJiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRGaWxsOw0KKyAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEZpbGwpOw0KKyAgICAgICAgICAgIHJ0RmlsbC5sZWZ0ID0gcnRGaWxsLnRvcCA9IDA7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaXRoID0gIEdldExpbmVXaWR0aCgpOw0KKyAgICAgICAgICAgIHJ0RmlsbC5EZWZsYXRlKGZMaW5lV2l0aCwgZkxpbmVXaXRoKTsNCisgICAgICAgICAgICBDRlhfQ29sb3IgY3IoRlhBUkdCX01BS0UoMTI4LCAxMjgsIDI1NSwgMjU1KSk7DQorICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgICAgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgICAgICAgIHBhdGguQ3JlYXRlKCk7DQorICAgICAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3AsIHJ0RmlsbC53aWR0aCwgcnRGaWxsLmhlaWdodCk7DQorICAgICAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIChDRlhfTWF0cml4KilwTWF0cml4KTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0eWxlc0V4KCkgJiBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZU91dExpbmUpIHsNCisgICAgICAgIGlmICgobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IEdldExpbmVXaWR0aCgpOw0KKyAgICAgICAgICAgIENGWF9Db2xvciBjcihGWEFSR0JfTUFLRSgyNTUsIDEyOCwgMjU1LCAyNTUpKTsNCisgICAgICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7DQorICAgICAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgICAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCAoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoKSB7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1MDMyOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnB1c2hidXR0b24uaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9QVVNIQlVUVE9OX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1BVU0hCVVRUT05fSU1QX0gNCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlTm9uZQkJKDBMIDw8IDApDQorI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZUludmVydGVkCSgxTCA8PCAwKQ0KKyNkZWZpbmUgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoCQkoMkwgPDwgMCkNCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZQkoNEwgPDwgMCkNCitjbGFzcyBDWEZBX0ZGUHVzaEJ1dHRvbiA6IHB1YmxpYyBDWEZBX0ZGRmllbGQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGUHVzaEJ1dHRvbihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRlB1c2hCdXR0b24oKTsNCisgICAgdmlydHVhbCB2b2lkCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgRlhfSU5UMzIgaVJvdGF0ZSA9IDApOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJVW5sb2FkV2lkZ2V0KCk7DQorICAgIHZpcnR1YWwJRlhfQk9PTAlMYXlvdXRXaWRnZXQoKTsNCisgICAgdmlydHVhbCB2b2lkCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlMb2FkSGlnaGxpZ2h0Q2FwdGlvbigpOw0KKyAgICB2b2lkCUxheW91dEhpZ2hsaWdodENhcHRpb24oKTsNCisgICAgdm9pZAlSZW5kZXJIaWdobGlnaHRDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICAgIEZYX0ZMT0FUIEdldExpbmVXaWR0aCgpOw0KKyAgICBGWF9BUkdCICBHZXRMaW5lQ29sb3IoKTsNCisgICAgRlhfQVJHQgkgR2V0RmlsbENvbG9yKCk7DQorICAgIENYRkFfVGV4dExheW91dAkJKm1fcFJvbGxvdmVyVGV4dExheW91dDsNCisgICAgQ1hGQV9UZXh0TGF5b3V0CQkqbV9wRG93blRleHRMYXlvdXQ7DQorICAgIENYRkFfVGV4dFByb3ZpZGVyCSptX3BEb3duUHJvdmlkZXI7DQorICAgIENYRkFfVGV4dFByb3ZpZGVyCSptX3BSb2xsUHJvdmlkZXI7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUJKm1fcE9sZERlbGVnYXRlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiNzVkNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzaWduYXR1cmUuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQorQ1hGQV9GRlNpZ25hdHVyZTo6Q1hGQV9GRlNpZ25hdHVyZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRlNpZ25hdHVyZTo6fkNYRkFfRkZTaWduYXR1cmUoKQ0KK3sNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpMb2FkV2lkZ2V0KCkNCit7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGU2lnbmF0dXJlOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIEZYX0lOVDMyIGlSb3RhdGUgKQ0KK3sNCisgICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsNCisgICAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICAgIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLCBGQUxTRSk7DQorICAgIENGWF9SZWN0RiBydFdpZGdldCA9IG1fcnRVSTsNCisgICAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gIG1fcERhdGFBY2MtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpOw0KKyAgICBGWFNZU19hc3NlcnQocERvY1Byb3ZpZGVyKTsNCisgICAgcERvY1Byb3ZpZGVyLT5SZW5kZXJDdXN0b21XaWRnZXQoKFhGQV9IV0lER0VUKXRoaXMsIHBHUywgJm10Um90YXRlLCBydFdpZGdldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZUVudGVyKCkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbk1vdXNlRXhpdCgpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNYRkFfRkZTaWduYXR1cmU6Ok9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLCBGWF9TSE9SVCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorDQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPblNldEZvY3VzKCkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbktpbGxGb2N1cygpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICAgICAgRlhfRkxPQVQgZmZ4ID0gZngsIGZmeSA9IGZ5Ow0KKyAgICAgICAgRldMVG9DbGllbnQoZmZ4LCBmZnkpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdXaWRnZXRIaXQgPSBtX3BOb3JtYWxXaWRnZXQtPkhpdFRlc3QoZmZ4LCBmZnkpOw0KKyAgICAgICAgaWYgKGR3V2lkZ2V0SGl0ICE9IEZXTF9XR1RISVRURVNUX1Vua25vd24pIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydEJveDsNCisgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KKyAgICB9DQorICAgIGlmIChtX3J0Q2FwdGlvbi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVGl0bGViYXI7DQorICAgIH0NCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCit9DQorRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4NDhkOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX1NJR05BVFVSRV9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9TSUdOQVRVUkVfSU1QX0gNCitjbGFzcyBDWEZBX0ZGU2lnbmF0dXJlIDogcHVibGljIENYRkFfRkZGaWVsZA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZTaWduYXR1cmUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICAgIHZpcnR1YWwgfkNYRkFfRkZTaWduYXR1cmUoKTsNCisNCisgICAgdmlydHVhbCB2b2lkCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgRlhfSU5UMzIgaVJvdGF0ZSA9IDApOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VFbnRlcigpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VFeGl0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlV2hlZWwoRlhfRFdPUkQgZHdGbGFncywgRlhfU0hPUlQgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uU2V0Rm9jdXMoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbktpbGxGb2N1cygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbAlGWF9EV09SRAlPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KK3Byb3RlY3RlZDoNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnN1YmZvcm0uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZmJmYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnN1YmZvcm0uY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzdWJmb3JtLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitDWEZBX0ZGU3ViRm9ybTo6Q1hGQV9GRlN1YkZvcm0oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGV2lkZ2V0KHBQYWdlVmlldywgcERhdGFBY2MpDQorew0KK30NCitDWEZBX0ZGU3ViRm9ybTo6fkNYRkFfRkZTdWJGb3JtKCkNCit7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnN1YmZvcm0uaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnN1YmZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRlZWY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX1NVQkZPUk1fSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfU1VCRk9STV9JTVBfSA0KK2NsYXNzIENYRkFfRkZTdWJGb3JtIDogcHVibGljIENYRkFfRkZXaWRnZXQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGU3ViRm9ybShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRlN1YkZvcm0oKTsNCisNCitwcm90ZWN0ZWQ6DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTBhMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmNwcApAQCAtMCwwICsxLDE4OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmRyYXcuaCINCisjaW5jbHVkZSAieGZhX2ZmdGV4dC5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorQ1hGQV9GRlRleHQ6OkNYRkFfRkZUZXh0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkRyYXcocFBhZ2VWaWV3LCBwRGF0YUFjYykNCit7DQorfQ0KK0NYRkFfRkZUZXh0Ojp+Q1hGQV9GRlRleHQoKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZGVGV4dDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBGWF9JTlQzMiBpUm90YXRlICkNCit7DQorICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgew0KKyAgICAgICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgICAgICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgICAgICAgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7DQorICAgICAgICBpZiAocFRleHRMYXlvdXQpIHsNCisgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgICAgICAgICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0VGV4dCk7DQorICAgICAgICAgICAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXMtPkdldExheW91dEl0ZW0oKTsNCisgICAgICAgICAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRUZXh0LCBtZ1dpZGdldCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmUmlnaHRJbnNldCwgZlRvcEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgICAgICAgICAgICAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBydFRleHQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9NYXRyaXggbXQ7DQorICAgICAgICAgICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0VGV4dC5sZWZ0LCBydFRleHQudG9wKTsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnRDbGlwID0gcnRUZXh0Ow0KKyAgICAgICAgICAgIG10Um90YXRlLlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgICAgICAgICAgICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgICAgICAgICAgIHBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXAsIHRoaXMtPkdldExheW91dEl0ZW0oKS0+R2V0SW5kZXgoKSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dDo6SXNMb2FkZWQoKQ0KK3sNCisgICAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldFRleHRMYXlvdXQoKTsNCisgICAgcmV0dXJuIHBUZXh0TGF5b3V0ICE9IE5VTEwgJiYgIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jazsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dDo6TGF5b3V0V2lkZ2V0KCkNCit7DQorICAgIENYRkFfRkZEcmF3OjpMYXlvdXRXaWRnZXQoKTsNCisgICAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldFRleHRMYXlvdXQoKTsNCisgICAgaWYgKCFwVGV4dExheW91dCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghcFRleHRMYXlvdXQtPm1fYkhhc0Jsb2NrKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBwVGV4dExheW91dC0+bV9CbG9ja3MuUmVtb3ZlQWxsKCk7DQorICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzLT5HZXRMYXlvdXRJdGVtKCk7DQorICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwgJiYgcEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOw0KKyAgICB3aGlsZSAocEl0ZW0pIHsNCisgICAgICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgICAgICBwSXRlbS0+R2V0UmVjdChydFRleHQpOw0KKyAgICAgICAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCisgICAgICAgICAgICBpZiAocEl0ZW0tPkdldFByZXYoKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3BJbnNldDsNCisgICAgICAgICAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgICAgICAgICAgICAgcnRUZXh0LmhlaWdodCAtPSBmVG9wSW5zZXQ7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJvdHRvbUluc2V0Ow0KKyAgICAgICAgICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgICAgICAgICBydFRleHQuaGVpZ2h0IC09IGZCb3R0b21JbnNldDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwVGV4dExheW91dC0+SXRlbUJsb2NrcyhydFRleHQsIHBJdGVtLT5HZXRJbmRleCgpKTsNCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsNCisgICAgfQ0KKyAgICBwVGV4dExheW91dC0+bV9iSGFzQmxvY2sgPSBGQUxTRTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0Qm94Ow0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICAgIGlmICghcnRCb3guQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIgd3NVUkxDb250ZW50ID0gR2V0TGlua1VSTEF0UG9pbnQoZngsIGZ5KTsNCisgICAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgU2V0QnV0dG9uRG93bihUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlRleHQ6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIENGWF9SZWN0RiBydEJveDsNCisgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9MUENXU1RSIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQorICAgIGlmIChOVUxMID09IHdzVVJMQ29udGVudCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0OjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAoIUlzQnV0dG9uRG93bigpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQorICAgIEZYX0xQQ1dTVFIgd3NVUkxDb250ZW50ID0gR2V0TGlua1VSTEF0UG9pbnQoZngsIGZ5KTsNCisgICAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KKyAgICBwRG9jLT5HZXREb2NQcm92aWRlcigpLT5Hb3RvVVJMKChYRkFfSERPQylwRG9jLCBGWF9XU1RSQyh3c1VSTENvbnRlbnQpLCBGQUxTRSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGVGV4dDo6T25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIENGWF9SZWN0RiBydEJveDsNCisgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIgd3NVUkxDb250ZW50ID0gR2V0TGlua1VSTEF0UG9pbnQoZngsIGZ5KTsNCisgICAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVHJhbnNwYXJlbnQ7DQorfQ0KK0ZYX0xQQ1dTVFIgQ1hGQV9GRlRleHQ6OkdldExpbmtVUkxBdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7DQorICAgIGlmICggTlVMTCA9PSBwVGV4dExheW91dCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfRkxPQVQgeChmeCksIHkoZnkpOw0KKyAgICBGV0xUb0NsaWVudCh4LCB5KTsNCisgICAgY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSogcFBpZWNlTGluZXMgPSBwVGV4dExheW91dC0+R2V0UGllY2VMaW5lcygpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBwUGllY2VMaW5lcy0+R2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIENYRkFfUGllY2VMaW5lICpwUGllY2VMaW5lID0gcFBpZWNlTGluZXMtPkdldEF0KGkpOw0KKyAgICAgICAgRlhfSU5UMzIgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQorICAgICAgICAgICAgWEZBX0xQVEVYVFBJRUNFIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChqKTsNCisgICAgICAgICAgICBpZiAocFBpZWNlLT5wTGlua0RhdGEgJiYgcFBpZWNlLT5ydFBpZWNlLkNvbnRhaW5zKHgsIHkpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwUGllY2UtPnBMaW5rRGF0YS0+R2V0TGlua1VSTCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX0ZGVGV4dDo6RldMVG9DbGllbnQoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQorew0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgICAgZnggLT0gcnRXaWRnZXQubGVmdDsNCisgICAgZnkgLT0gcnRXaWRnZXQudG9wOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4NmE5NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9EUkFXVEVYVF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9EUkFXVEVYVF9JTVBfSA0KK2NsYXNzIENYRkFfVGV4dExheW91dDsNCitjbGFzcyBDWEZBX0ZGVGV4dCA6IHB1YmxpYyBDWEZBX0ZGRHJhdw0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRkZUZXh0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGVGV4dCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCU9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwJRlhfRFdPUkQJT25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgdm9pZAlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIEZYX0lOVDMyIGlSb3RhdGUgPSAwKTsNCisgICAgdmlydHVhbAlGWF9CT09MCUlzTG9hZGVkKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBMYXlvdXRXaWRnZXQoKTsNCitwcml2YXRlOg0KKyAgICB2aXJ0dWFsIEZYX0xQQ1dTVFIgR2V0TGlua1VSTEF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdm9pZCBGV0xUb0NsaWVudChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NmYyNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmNwcApAQCAtMCwwICsxLDgzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZnRleHRlZGl0LmgiDQorI2luY2x1ZGUgInhmYV90ZXh0bGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZUZXh0RWRpdDo6Q1hGQV9GRlRleHRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpDQorICAgICwgbV9wT2xkRGVsZWdhdGUoTlVMTCkNCit7DQorfQ0KK0NYRkFfRkZUZXh0RWRpdDo6fkNYRkFfRkZUZXh0RWRpdCgpDQorew0KKyAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICAgICAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICAgICAgICBwTm90ZURyaXZlci0+VW5yZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQpOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpMb2FkV2lkZ2V0KCkNCit7DQorICAgIENGV0xfRWRpdCogcEZXTEVkaXQgPSBDRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgICBwRldMRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQgPSBwRldMRWRpdDsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgICAgcEZXTEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgICAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KK3sNCisgICAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgICBpZiAoIXBXaWRnZXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCisgICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfCBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyIHwgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgICAgaWYgKG1fcERhdGFBY2MtPklzTXVsdGlMaW5lKCkpIHsNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSB8IEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybjsNCisgICAgICAgIGlmIChtX3BEYXRhQWNjLT5HZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KKyAgICAgICAgICAgIGR3U3R5bGUgfD0gRldMX1dHVFNUWUxFX1ZTY3JvbGw7DQorICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGw7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQorICAgIH0NCisgICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZTsNCisgICAgfQ0KKyAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIEZYX0lOVDMyIGlNYXhDaGFycyA9IG1fcERhdGFBY2MtPkdldE1heENoYXJzKGVUeXBlKTsNCisgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgaU1heENoYXJzID0gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTnVtQ2VsbHMgPSBtX3BEYXRhQWNjLT5HZXROdW1iZXJPZkNlbGxzKCk7DQorICAgIGlmIChpTnVtQ2VsbHMgPT0gMCkgew0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQ7DQorICAgICAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTWF4Q2hhcnMgPiAwID8gaU1heENoYXJzIDogMSk7DQorICAgIH0gZWxzZSBpZiAoaU51bUNlbGxzID4gMCkgew0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQ7DQorICAgICAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTnVtQ2VsbHMpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcFdpZGdldC0+U2V0TGltaXQoaU1heENoYXJzKTsNCisgICAgfQ0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzKGR3U3R5bGUsIDB4RkZGRkZGRkYpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghUHRJbkFjdGl2ZVJlY3QoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghSXNGb2N1c2VkKCkpIHsNCisgICAgICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KKyAgICAgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgICAgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgICAgfQ0KKyAgICBTZXRCdXR0b25Eb3duKFRSVUUpOw0KKyAgICBDRldMX01zZ01vdXNlIG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOw0KKyAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgICBtcy5tX2Z4ID0gZng7DQorICAgIG1zLm1fZnkgPSBmeTsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghUHRJbkFjdGl2ZVJlY3QoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghSXNGb2N1c2VkKCkpIHsNCisgICAgICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KKyAgICAgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgICAgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgICAgfQ0KKyAgICBTZXRCdXR0b25Eb3duKFRSVUUpOw0KKyAgICBDRldMX01zZ01vdXNlIG1zOw0KKyAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX1JCdXR0b25Eb3duOw0KKyAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgICBtcy5tX2Z4ID0gZng7DQorICAgIG1zLm1fZnkgPSBmeTsNCisgICAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICBpZiAoIUNYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAoZHdGbGFncywgZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9Qb2ludEYgcHQ7DQorICAgIHB0LlNldChmeCwgZnkpOw0KKyAgICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+UG9wdXBNZW51KChYRkFfSFdJREdFVCl0aGlzLCBwdCwgTlVMTCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6T25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KQ0KK3sNCisgICAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZDsNCisgICAgaWYgKCFJc0ZvY3VzZWQoKSkgew0KKyAgICAgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICAgICAgICBVcGRhdGVGV0xEYXRhKCk7DQorICAgICAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgICB9DQorICAgIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMocE9sZFdpZGdldCk7DQorICAgIENGV0xfTXNnU2V0Rm9jdXMgbXM7DQorICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfRkZUZXh0RWRpdDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkNCit7DQorICAgIENGV0xfTXNnS2lsbEZvY3VzIG1zOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgICAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICAgIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCisgICAgUHJvY2Vzc0NvbW1pdHRlZERhdGEoKTsNCisgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgICBDWEZBX0ZGV2lkZ2V0OjpPbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsNCisgICAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRlRleHRFZGl0OjpDb21taXREYXRhKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHQod3NUZXh0KTsNCisgICAgaWYgKG1fcERhdGFBY2MtPlNldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KSkgew0KKyAgICAgICAgbV9wRGF0YUFjYy0+VXBkYXRlVUlEaXNwbGF5KHRoaXMpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6SXNEYXRhQ2hhbmdlZCgpDQorew0KKyAgICByZXR1cm4gKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkKSAhPSAwOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGVGV4dEVkaXQ6OkdldEFsaWdubWVudCgpDQorew0KKyAgICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCisgICAgICAgIEZYX0lOVDMyIGlIb3J6ID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCisgICAgICAgIHN3aXRjaChpSG9yeikgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICAgICAgc3dpdGNoKGlWZXJ0KSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WRmFyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WTmVhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlVwZGF0ZUZXTERhdGEoKQ0KK3sNCisgICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfVkFMVUVQSUNUVVJFIGVUeXBlID0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5Ow0KKyAgICBpZiAoSXNGb2N1c2VkKCkpIHsNCisgICAgICAgIGVUeXBlID0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0Ow0KKyAgICB9DQorICAgIEZYX0JPT0wgYlVwZGF0ZSA9IEZBTFNFOw0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgPT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQgJiYgbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpIDwgMCkgew0KKyAgICAgICAgWEZBX0VMRU1FTlQgZWxlbWVudFR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgICAgICAgRlhfSU5UMzIgaU1heENoYXJzID0gbV9wRGF0YUFjYy0+R2V0TWF4Q2hhcnMoZWxlbWVudFR5cGUpOw0KKyAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgICAgIGlNYXhDaGFycyA9IGVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCA/IGlNYXhDaGFycyA6IDA7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldExpbWl0KCkgIT0gaU1heENoYXJzKSB7DQorICAgICAgICAgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldExpbWl0KGlNYXhDaGFycyk7DQorICAgICAgICAgICAgYlVwZGF0ZSA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIGVUeXBlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRUZXh0Ow0KKyAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dCh3c09sZFRleHQpOw0KKyAgICBpZiAod3NUZXh0ICE9IHdzT2xkVGV4dCB8fCAoZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0ICYmIGJVcGRhdGUpKSB7DQorICAgICAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgYlVwZGF0ZSA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGJVcGRhdGUpIHsNCisgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5VbmRvKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q2FuVW5kbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuUmVkbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlVuZG8oKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpSZWRvKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+UmVkbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuQ29weSgpDQorew0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgcmV0dXJuIG5Db3VudCA+IDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5DdXQoKQ0KK3sNCisgICAgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgcmV0dXJuIG5Db3VudCA+IDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5QYXN0ZSgpDQorew0KKyAgICByZXR1cm4gbV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbjsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNhblNlbGVjdEFsbCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHRMZW5ndGgoKSA+IDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpTZWxlY3RBbGwoKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHRMZW5ndGgoKTsNCisgICAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5BZGRTZWxSYW5nZSgwLCBuQ291bnQpOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6RGVsZXRlKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpEZVNlbGVjdCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkNsZWFyU2VsZWN0aW9ucygpOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6R2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkNCit7DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZXTFRvQ2xpZW50KHBvaW50Zi54LCBwb2ludGYueSk7DQorICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0U3VnZ2VzdFdvcmRzKHBvaW50Ziwgc1N1Z2dlc3QpOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBGWF9CU1RSIGJzUmVwbGFjZSkNCit7DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZXTFRvQ2xpZW50KHBvaW50Zi54LCBwb2ludGYueSk7DQorICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NoYW5nZWQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ByZXZUZXh0KQ0KK3sNCisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7DQorICAgIGVQYXJhbS5tX3dzQ2hhbmdlID0gd3NDaGFuZ2VkOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgZVBhcmFtLm1fd3NQcmV2VGV4dCA9IHdzUHJldlRleHQ7DQorICAgIENGV0xfRWRpdCogcEVkaXQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgICAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCkgew0KKyAgICAgICAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcERhdGVUaW1lID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKXBFZGl0Ow0KKyAgICAgICAgcERhdGVUaW1lLT5HZXRFZGl0VGV4dChlUGFyYW0ubV93c05ld1RleHQpOw0KKyAgICAgICAgRlhfSU5UMzIgaVNlbHMgPSBwRGF0ZVRpbWUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgICAgICBpZiAoaVNlbHMgKSB7DQorICAgICAgICAgICAgZVBhcmFtLm1faVNlbEVuZCA9IHBEYXRlVGltZS0+R2V0U2VsUmFuZ2UoMCwgZVBhcmFtLm1faVNlbFN0YXJ0KTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBFZGl0LT5HZXRUZXh0KGVQYXJhbS5tX3dzTmV3VGV4dCk7DQorICAgICAgICBGWF9JTlQzMiBpU2VscyA9IHBFZGl0LT5Db3VudFNlbFJhbmdlcygpOw0KKyAgICAgICAgaWYgKGlTZWxzICkgew0KKyAgICAgICAgICAgIGVQYXJhbS5tX2lTZWxFbmQgPSBwRWRpdC0+R2V0U2VsUmFuZ2UoMCwgZVBhcmFtLm1faVNlbFN0YXJ0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9GdWxsOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGwsICZlUGFyYW0pOw0KK30NCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6T25BZGREb1JlY29yZChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5BZGREb1JlY29yZCgoWEZBX0hXSURHRVQpdGhpcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDaGVja1dvcmQoRlhfQlNUUiBzV29yZCkNCit7DQorICAgIGlmIChzV29yZC5Jc0VtcHR5KCkgfHwgbV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+Q2hlY2tXb3JkKChYRkFfSERPQylHZXREb2MoKSwgc1dvcmQpOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6R2V0U3VnZ2VzdFdvcmRzKEZYX0JTVFIgc1dvcmQsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KK3sNCisgICAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX1RleHRFZGl0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5HZXRTdWdnZXN0V29yZHMoKFhGQV9IRE9DKUdldERvYygpLCBzV29yZCwgc1N1Z2dlc3QpOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBzd2l0Y2ggKGR3RXZlbnRJRCkgew0KKyAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfVGV4dENoYW5nZWQ6IHsNCisgICAgICAgICAgICAgICAgQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCAqZXZlbnQgPSAoQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCopcEV2ZW50Ow0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYW5nZTsNCisgICAgICAgICAgICAgICAgT25UZXh0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCB3c0NoYW5nZSwgZXZlbnQtPndzUHJldlRleHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9BZGREb1JlY29yZDogew0KKyAgICAgICAgICAgICAgICBPbkFkZERvUmVjb3JkKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCkpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9UZXh0RnVsbDogew0KKyAgICAgICAgICAgICAgICBPblRleHRGdWxsKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCkpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9DaGVja1dvcmQ6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0cihMIkZXTF9FVkVOVF9EVFBfU2VsZWN0Q2hhbmdlZCIpOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBoYXNoY29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzdHIsIHdzdHIuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBDRldMX0V2dEVkdENoZWNrV29yZCAqZXZlbnQgPSAoQ0ZXTF9FdnRFZHRDaGVja1dvcmQqKXBFdmVudDsNCisgICAgICAgICAgICAgICAgZXZlbnQtPmJDaGVja1dvcmQgPSBDaGVja1dvcmQoZXZlbnQtPmJzV29yZCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX0VWVEhBU0hfRURUX0dldFN1Z2dlc3RXb3Jkczogew0KKyAgICAgICAgICAgICAgICBDRldMX0V2dEVkdEdldFN1Z2dlc3RXb3JkcyAqZXZlbnQgPSAoQ0ZXTF9FdnRFZHRHZXRTdWdnZXN0V29yZHMqKXBFdmVudDsNCisgICAgICAgICAgICAgICAgZXZlbnQtPmJTdWdnZXN0V29yZHMgPSBHZXRTdWdnZXN0V29yZHMoZXZlbnQtPmJzV29yZCwgZXZlbnQtPmJzQXJyYXlTdWdnZXN0V29yZHMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCit9DQorRldMX0VSUiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQorew0KKyAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCitDWEZBX0ZGTnVtZXJpY0VkaXQ6OkNYRkFfRkZOdW1lcmljRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRk51bWVyaWNFZGl0Ojp+Q1hGQV9GRk51bWVyaWNFZGl0KCkNCit7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk51bWVyaWNFZGl0OjpMb2FkV2lkZ2V0KCkNCit7DQorICAgIENGV0xfRWRpdCogcFdpZGdldCA9IENGV0xfRWRpdDo6Q3JlYXRlKCk7DQorICAgIHBXaWRnZXQtPkluaXRpYWxpemUoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KKyAgICBJRldMX1dpZGdldCogcElXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBJV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwSVdpZGdldCwgcElXaWRnZXQpOw0KKyAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgICAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk51bWVyaWNFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQorew0KKyAgICBDRldMX0VkaXQqIHBXaWRnZXQgPSAoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8IEZXTF9TVFlMRUVYVF9FRFRfVmFsaWRhdGUgfCBGV0xfU1RZTEVFWFRfRURUX051bWJlciB8IEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTnVtQ2VsbHMgPSBtX3BEYXRhQWNjLT5HZXROdW1iZXJPZkNlbGxzKCk7DQorICAgIGlmIChpTnVtQ2VsbHMgPiAwKSB7DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsNCisgICAgICAgIHBXaWRnZXQtPlNldExpbWl0KGlOdW1DZWxscyk7DQorICAgIH0NCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5Ow0KKyAgICB9DQorICAgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGTnVtZXJpY0VkaXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCit7DQorICAgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZHdFdmVudElEID09IEZXTF9FVlRIQVNIX0VEVF9WYWxpZGF0ZSkgew0KKyAgICAgICAgQ0ZXTF9FdnRFZHRWYWxpZGF0ZSAqZXZlbnQgPSAoQ0ZXTF9FdnRFZHRWYWxpZGF0ZSopcEV2ZW50Ow0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2UgPSBldmVudC0+d3NJbnNlcnQ7DQorICAgICAgICBldmVudC0+YlZhbGlkYXRlID0gT25WYWxpZGF0ZShtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCB3c0NoYW5nZSk7DQorICAgICAgICByZXR1cm4gZXZlbnQtPmJWYWxpZGF0ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGTnVtZXJpY0VkaXQ6Ok9uVmFsaWRhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BhdHRlcm47DQorICAgIG1fcERhdGFBY2MtPkdldFBpY3R1cmVDb250ZW50KHdzUGF0dGVybiwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCisgICAgaWYgKCF3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVhZHMgPSAwOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRMZWFkRGlnaXRzKGlMZWFkcyk7DQorICAgIEZYX0lOVDMyIGlGcmFjcyA9IDA7DQorICAgIG1fcERhdGFBY2MtPkdldEZyYWNEaWdpdHMoaUZyYWNzKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7DQorICAgIHdpZGdldFZhbHVlLkdldE51bWJlcmljRm9ybWF0KHdzRm9ybWF0LCBpTGVhZHMsIGlGcmFjcyk7DQorICAgIHJldHVybiB3aWRnZXRWYWx1ZS5WYWxpZGF0ZU51bWVyaWNUZW1wKHdzVGV4dCwgd3NGb3JtYXQsIG1fcERhdGFBY2MtPkdldExvY2FsKCkpOw0KK30NCitDWEZBX0ZGUGFzc3dvcmRFZGl0OjpDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRlRleHRFZGl0KHBQYWdlVmlldywgcERhdGFBY2MpDQorew0KK30NCitDWEZBX0ZGUGFzc3dvcmRFZGl0Ojp+Q1hGQV9GRlBhc3N3b3JkRWRpdCgpDQorew0KK30NCitGWF9CT09MIENYRkFfRkZQYXNzd29yZEVkaXQ6OkxvYWRXaWRnZXQoKQ0KK3sNCisgICAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gQ0ZXTF9FZGl0OjpDcmVhdGUoKTsNCisgICAgcFdpZGdldC0+SW5pdGlhbGl6ZSgpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBXaWRnZXQ7DQorICAgIElGV0xfV2lkZ2V0KiBwSVdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocElXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBJV2lkZ2V0LCBwSVdpZGdldCk7DQorICAgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgICBwV2lkZ2V0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQorew0KKyAgICBDRldMX0VkaXQqIHBXaWRnZXQgPSAoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8IEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQgfCBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1Bhc3NXb3JkOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRQYXNzd29yZENoYXIod3NQYXNzV29yZCk7DQorICAgIGlmICghd3NQYXNzV29yZC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBXaWRnZXQtPlNldEFsaWFzQ2hhcih3c1Bhc3NXb3JkLkdldEF0KDApKTsNCisgICAgfQ0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQorICAgIH0NCisgICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgICAgfQ0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCit9DQorQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q1hGQV9GRkRhdGVUaW1lRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KK3sNCit9DQorQ1hGQV9GRkRhdGVUaW1lRWRpdDo6fkNYRkFfRkZEYXRlVGltZUVkaXQoKQ0KK3sNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMpDQorew0KKyAgICBpZiAoYkRyYXdGb2N1cykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgICByZXR1cm4gQ1hGQV9GRldpZGdldDo6R2V0QkJveChydEJveCwgZHdTdGF0dXMpOw0KKyNlbmRpZg0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgICAgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQorICAgICAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfRkZEYXRlVGltZUVkaXQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEJCb3gocnRXaWRnZXQpOw0KKyAgICBpZiAocnRXaWRnZXQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkxvYWRXaWRnZXQoKQ0KK3sNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlciAqcFdpZGdldCA9IENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpOw0KKyAgICBwV2lkZ2V0LT5Jbml0aWFsaXplKCk7DQorICAgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcFdpZGdldDsNCisgICAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwSVdpZGdldCwgdGhpcywgTlVMTCk7DQorICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgICAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCisgICAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIHBXaWRnZXQtPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorICAgIFhGQV9EQVRFVElNRVRZUEUgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX0RhdGVBbmRUaW1lOw0KKyAgICBpZiAoQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpKSB7DQorICAgICAgICBzd2l0Y2godmFsdWUuR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZTogew0KKyAgICAgICAgICAgICAgICAgICAgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX0RhdGU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXdzVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRlhfVU5JVElNRSlkYXRlICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0Q3VyU2VsKGRhdGUuR2V0WWVhcigpLCBkYXRlLkdldE1vbnRoKCksIGRhdGUuR2V0RGF5KCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RpbWU6DQorICAgICAgICAgICAgICAgIGVUeXBlID0gWEZBX0RBVEVUSU1FVFlQRV9UaW1lOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBlVHlwZSA9IFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQorew0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VyKiBwV2lkZ2V0ID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldDsNCisgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQ7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KKyAgICBGWF9EV09SRCBkd0VkaXRTdHlsZXMgPSBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgICBGWF9JTlQzMiBpTnVtQ2VsbHMgPSBtX3BEYXRhQWNjLT5HZXROdW1iZXJPZkNlbGxzKCk7DQorICAgIGlmIChpTnVtQ2VsbHMgPiAwKSB7DQorICAgICAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsNCisgICAgICAgIHBXaWRnZXQtPlNldEVkaXRMaW1pdChpTnVtQ2VsbHMpOw0KKyAgICB9DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICAgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICAgIH0NCisgICAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCisgICAgICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOw0KKyAgICB9DQorICAgIHBXaWRnZXQtPk1vZGlmeUVkaXRTdHlsZXNFeChkd0VkaXRTdHlsZXMsIDB4RkZGRkZGRkYpOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRBbGlnbm1lbnQoKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gMDsNCisgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgICBGWF9JTlQzMiBpSG9yeiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICAgICAgICBzd2l0Y2goaUhvcnopIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhDZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEp1c3RpZmllZDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0SEZhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhOZWFyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlWZXJ0ID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgICAgICBzd2l0Y2goaVZlcnQpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0VkZhcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZOZWFyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZHdFeHRlbmRlZFN0eWxlOw0KK30NCitGWF9CT09MCUNYRkFfRkZEYXRlVGltZUVkaXQ6OkNvbW1pdERhdGEoKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEVkaXRUZXh0KHdzVGV4dCk7DQorICAgIGlmIChtX3BEYXRhQWNjLT5TZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCkpIHsNCisgICAgICAgIG1fcERhdGFBY2MtPlVwZGF0ZVVJRGlzcGxheSh0aGlzKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVGV0xEYXRhKCkNCit7DQorICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgWEZBX1ZBTFVFUElDVFVSRSBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTsNCisgICAgaWYgKElzRm9jdXNlZCgpKSB7DQorICAgICAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgZVR5cGUpOw0KKyAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorICAgIGlmIChJc0ZvY3VzZWQoKSAmJiAhd3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsY1ZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcERhdGFBY2MpOw0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOw0KKyAgICAgICAgaWYgKGxjVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgaWYgKChGWF9VTklUSU1FKWRhdGUgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6SXNEYXRhQ2hhbmdlZCgpDQorew0KKyAgICBpZiAobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5HZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c09sZFZhbHVlOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c09sZFZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgICByZXR1cm4gd3NPbGRWYWx1ZSAhPSB3c1RleHQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuVW5kbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuUmVkbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6VW5kbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6UmVkbygpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuQ29weSgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5Db3B5KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuQ3V0KCkNCit7DQorICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuUGFzdGUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcERhdGFBY2MtPkdldEFjY2VzcygpID09IFhGQV9BVFRSSUJVVEVFTlVNX09wZW47DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuU2VsZWN0QWxsKCkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCit7DQorICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlBhc3RlKHdzUGFzdGUpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OlNlbGVjdEFsbCgpDQorew0KKyAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpEZWxldGUoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6RGVTZWxlY3QoKQ0KK3sNCisgICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+RGVTZWxlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0lOVDMyIGlZZWFyLCBGWF9JTlQzMiBpTW9udGgsIEZYX0lOVDMyIGlEYXkpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICAgIG1fcERhdGFBY2MtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBkYXRlKFhGQV9WVF9EQVRFLCB0aGlzLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldExvY2FsTWdyKCkpOw0KKyAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgZHQuU2V0KGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgICBkYXRlLlNldERhdGUoZHQpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGU7DQorICAgIGRhdGUuRm9ybWF0UGF0dGVybnMod3NEYXRlLCB3c1BpY3R1cmUsIG1fcERhdGFBY2MtPkdldExvY2FsKCksIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQ7DQorICAgIHBEYXRlVGltZS0+U2V0RWRpdFRleHQod3NEYXRlKTsNCisgICAgcERhdGVUaW1lLT5VcGRhdGUoKTsNCisgICAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KChYRkFfSERPQylHZXREb2MoKSwgTlVMTCk7DQorICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzTmV3VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQorew0KKyAgICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGR3RXZlbnRJRCA9PSBGV0xfRVZUSEFTSF9EVFBfU2VsZWN0Q2hhbmdlZCkgew0KKyAgICAgICAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkICpldmVudCA9IChDRldMX0V2ZW50X0R0cFNlbGVjdENoYW5nZWQqKXBFdmVudDsNCisgICAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBldmVudC0+aVllYXIsIGV2ZW50LT5pTW9udGgsIGV2ZW50LT5pRGF5KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dGVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmMyYjUwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dGVkaXQuaApAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfVEVYVEVESVRfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfVEVYVEVESVRfSU1QX0gNCitjbGFzcyBDWEZBX0ZGVGV4dEVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRlRleHRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGVGV4dEVkaXQoKTsNCisgICAgdmlydHVhbAlGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgICAgdmlydHVhbCB2b2lkCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJT25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCU9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5SZWRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5Db3B5KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUGFzdGUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5TZWxlY3RBbGwoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlTZWxlY3RBbGwoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEZWxldGUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEZVNlbGVjdCgpOw0KKyAgICBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCisgICAgRlhfQk9PTAkJUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBGWF9CU1RSIGJzUmVwbGFjZSk7DQorcHJvdGVjdGVkOg0KKyAgICBGWF9EV09SRAlHZXRBbGlnbm1lbnQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCUNvbW1pdERhdGEoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCVVwZGF0ZUZXTERhdGEoKTsNCisgICAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoKTsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSoJbV9wT2xkRGVsZWdhdGU7DQorcHVibGljOg0KKyAgICB2b2lkCU9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NoYW5nZWQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ByZXZUZXh0KTsNCisgICAgdm9pZAlPblRleHRGdWxsKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgdm9pZAlPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCisgICAgRlhfQk9PTAkJQ2hlY2tXb3JkKEZYX0JTVFIgc1dvcmQpOw0KKyAgICBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoRlhfQlNUUiBzV29yZCwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmc1N1Z2dlc3QpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCit9Ow0KK2NsYXNzIENYRkFfRkZOdW1lcmljRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICAgIHZpcnR1YWwgfkNYRkFfRkZOdW1lcmljRWRpdCgpOw0KKyAgICB2aXJ0dWFsCUZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KK3B1YmxpYzoNCisgICAgRlhfQk9PTAlPblZhbGlkYXRlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCit9Ow0KK2NsYXNzIENYRkFfRkZQYXNzd29yZEVkaXQgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRlBhc3N3b3JkRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRlBhc3N3b3JkRWRpdCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCitwcm90ZWN0ZWQ6DQorfTsNCitlbnVtIFhGQV9EQVRFVElNRVRZUEUgew0KKyAgICBYRkFfREFURVRJTUVUWVBFX0RhdGUgPSAwLA0KKyAgICBYRkFfREFURVRJTUVUWVBFX1RpbWUsDQorICAgIFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWUNCit9Ow0KK2NsYXNzIENYRkFfRkZEYXRlVGltZUVkaXQgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRkRhdGVUaW1lRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GRkRhdGVUaW1lRWRpdCgpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJR2V0QkJveChDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisNCisNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5VbmRvKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUmVkbygpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCk7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ29weSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkN1dCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblBhc3RlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VsZWN0QWxsKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVTZWxlY3QoKTsNCisNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0RXT1JECQlHZXRBbGlnbm1lbnQoKTsNCisNCisgICAgdmlydHVhbAlGWF9CT09MCVB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlDb21taXREYXRhKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAlVcGRhdGVGV0xEYXRhKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKCk7DQorcHVibGljOg0KKyAgICB2b2lkCU9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTFkOTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuY3BwCkBAIC0wLDAgKzEsMTg3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KK0NYRkFfRkZXaWRnZXQ6OkNYRkFfRkZXaWRnZXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChwRGF0YUFjYy0+R2V0Tm9kZSgpKQ0KKyAgICAsIG1fcFBhZ2VWaWV3KHBQYWdlVmlldykNCisgICAgLCBtX3BEYXRhQWNjKHBEYXRhQWNjKQ0KK3sNCisgICAgbV9ydFdpZGdldC5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NYRkFfRkZXaWRnZXQ6On5DWEZBX0ZGV2lkZ2V0KCkNCit7DQorfQ0KK0lYRkFfUGFnZVZpZXcqIENYRkFfRkZXaWRnZXQ6OkdldFBhZ2VWaWV3KCkNCit7DQorICAgIHJldHVybiBtX3BQYWdlVmlldzsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpTZXRQYWdlVmlldyhJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcpDQorew0KKyAgICBtX3BQYWdlVmlldyA9IChDWEZBX0ZGUGFnZVZpZXcqKXBQYWdlVmlldzsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcnRXaWRnZXQpDQorew0KKyAgICBpZiAoKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1JlY3RDYWNoZWQpID09IDApIHsNCisgICAgICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkOw0KKyAgICAgICAgdGhpcy0+R2V0TGF5b3V0SXRlbSgpLT5HZXRSZWN0KG1fcnRXaWRnZXQpOw0KKyAgICB9DQorICAgIHJ0V2lkZ2V0ID0gbV9ydFdpZGdldDsNCit9DQorQ0ZYX1JlY3RGIENYRkFfRkZXaWRnZXQ6OlJlQ2FjaGVXaWRnZXRSZWN0KCkNCit7DQorICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkOw0KKyAgICB0aGlzLT5HZXRMYXlvdXRJdGVtKCktPkdldFJlY3QobV9ydFdpZGdldCk7DQorICAgIHJldHVybiBtX3J0V2lkZ2V0Ow0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OkdldFJlY3RXaXRob3V0Um90YXRlKENGWF9SZWN0RiAmcnRXaWRnZXQpDQorew0KKyAgICBHZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgICAgRlhfRkxPQVQgZlZhbHVlID0gMDsNCisgICAgc3dpdGNoIChtX3BEYXRhQWNjLT5HZXRSb3RhdGUoKSkgew0KKyAgICAgICAgY2FzZSA5MDoNCisgICAgICAgICAgICBydFdpZGdldC50b3AgPSBydFdpZGdldC5ib3R0b20oKTsNCisgICAgICAgICAgICBmVmFsdWUgPSBydFdpZGdldC53aWR0aDsNCisgICAgICAgICAgICBydFdpZGdldC53aWR0aCA9IHJ0V2lkZ2V0LmhlaWdodDsNCisgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQgPSBmVmFsdWU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDE4MDoNCisgICAgICAgICAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQucmlnaHQoKTsNCisgICAgICAgICAgICBydFdpZGdldC50b3AgPSBydFdpZGdldC5ib3R0b20oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjcwOg0KKyAgICAgICAgICAgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC5yaWdodCgpOw0KKyAgICAgICAgICAgIGZWYWx1ZSA9IHJ0V2lkZ2V0LndpZHRoOw0KKyAgICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoID0gcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCA9IGZWYWx1ZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCitGWF9EV09SRCBDWEZBX0ZGV2lkZ2V0OjpHZXRTdGF0dXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6TW9kaWZ5U3RhdHVzKEZYX0RXT1JEIGR3QWRkZWQsIEZYX0RXT1JEIGR3UmVtb3ZlZCkNCit7DQorICAgIG1fZHdTdGF0dXMgPSAobV9kd1N0YXR1cyAmIH5kd1JlbW92ZWQpIHwgZHdBZGRlZDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMpDQorew0KKyAgICBpZiAoYkRyYXdGb2N1cykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgICBpZihtX3BQYWdlVmlldykgew0KKyAgICAgICAgbV9wUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdChydEJveCk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorI2VuZGlmDQorICAgIEdldFdpZGdldFJlY3QocnRCb3gpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZXaWRnZXQ6OkdldERhdGFBY2MoKQ0KK3sNCisgICAgcmV0dXJuIG1fcERhdGFBY2M7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6R2V0VG9vbFRpcChDRlhfV2lkZVN0cmluZyAmd3NUb29sVGlwKQ0KK3sNCisgICAgaWYgKENYRkFfQXNzaXN0IGFzc2lzdCA9IG1fcERhdGFBY2MtPkdldEFzc2lzdCgpKSB7DQorICAgICAgICBpZiAoQ1hGQV9Ub29sVGlwIHRvb2xUaXAgPSBhc3Npc3QuR2V0VG9vbFRpcCgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIHRvb2xUaXAuR2V0VGlwKHdzVG9vbFRpcCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEdldENhcHRpb25UZXh0KHdzVG9vbFRpcCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBGWF9JTlQzMiBpUm90YXRlICkNCit7DQorICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gbV9wRGF0YUFjYy0+R2V0Qm9yZGVyKCk7DQorICAgIGlmIChib3JkZXIpIHsNCisgICAgICAgIENGWF9SZWN0RiBydEJvcmRlcjsNCisgICAgICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm9yZGVyKTsNCisgICAgICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlci5HZXRNYXJnaW4oKTsNCisgICAgICAgIGlmIChtYXJnaW4uSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0Qm9yZGVyLCBtYXJnaW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcnRCb3JkZXIuTm9ybWFsaXplKCk7DQorICAgICAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyLCBydEJvcmRlciwgcE1hdHJpeCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc0xvYWRlZCgpDQorew0KKyAgICByZXR1cm4gbV9wUGFnZVZpZXcgIT0gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpMb2FkV2lkZ2V0KCkNCit7DQorICAgIExheW91dFdpZGdldCgpOzsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6VW5sb2FkV2lkZ2V0KCkNCit7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6TGF5b3V0V2lkZ2V0KCkNCit7DQorICAgIFJlQ2FjaGVXaWRnZXRSZWN0KCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OlVwZGF0ZUZXTERhdGEoKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6RHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHUywgQ1hGQV9Cb3ggYm94LCBjb25zdCBDRlhfUmVjdEYmIHJ0Qm9yZGVyLCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgWEZBX0RyYXdCb3goYm94LCBwR1MsIHJ0Qm9yZGVyLCBwTWF0cml4LCBkd0ZsYWdzKTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpJbnZhbGlkYXRlV2lkZ2V0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QgKQ0KK3sNCisgICAgaWYgKCFwUmVjdCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICAgICAgR2V0QkJveChydFdpZGdldCwgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKTsNCisgICAgICAgIHJ0V2lkZ2V0LkluZmxhdGUoMiwgMik7DQorICAgICAgICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+SW52YWxpZGF0ZVJlY3QobV9wUGFnZVZpZXcsIHJ0V2lkZ2V0LCBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+SW52YWxpZGF0ZVJlY3QobV9wUGFnZVZpZXcsICpwUmVjdCwgWEZBX0lOVkFMSURBVEVfQ3VycmVudFBhZ2UpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6QWRkSW52YWxpZGF0ZVJlY3QoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCApDQorew0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIGlmIChwUmVjdCkgew0KKyAgICAgICAgcnRXaWRnZXQgPSAqcFJlY3Q7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBHZXRCQm94KHJ0V2lkZ2V0LCBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpOw0KKyAgICAgICAgcnRXaWRnZXQuSW5mbGF0ZSgyLCAyKTsNCisgICAgfQ0KKyAgICBtX3BEb2NWaWV3LT5BZGRJbnZhbGlkYXRlUmVjdChtX3BQYWdlVmlldywgcnRXaWRnZXQpOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OkdldENhcHRpb25UZXh0KENGWF9XaWRlU3RyaW5nICZ3c0NhcCkNCit7DQorICAgIENYRkFfVGV4dExheW91dCogcENhcFRleHRsYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgICBpZiAoIXBDYXBUZXh0bGF5b3V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcENhcFRleHRsYXlvdXQtPkdldFRleHQod3NDYXApOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc0ZvY3VzZWQoKQ0KK3sNCisgICAgcmV0dXJuIG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25Nb3VzZUVudGVyKCkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlRXhpdCgpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLCBGWF9TSE9SVCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorDQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpDQorew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwUGFyZW50ID0gR2V0UGFyZW50KCk7DQorICAgIGlmIChwUGFyZW50ICE9IE5VTEwgJiYgIXBQYXJlbnQtPklzQW5jZXN0b3JPZihwT2xkV2lkZ2V0KSkgew0KKyAgICAgICAgcFBhcmVudC0+T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsNCisgICAgfQ0KKyAgICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfRW50ZXI7DQorICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsICZlUGFyYW0pOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KQ0KK3sNCisgICAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KKyAgICBFdmVudEtpbGxGb2N1cygpOw0KKyAgICBpZiAocE5ld1dpZGdldCAhPSBOVUxMKSB7DQorICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwUGFyZW50ID0gR2V0UGFyZW50KCk7DQorICAgICAgICBpZiAocFBhcmVudCAhPSBOVUxMICYmICFwUGFyZW50LT5Jc0FuY2VzdG9yT2YocE5ld1dpZGdldCkpIHsNCisgICAgICAgICAgICBwUGFyZW50LT5PbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXQ6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OlJvdGF0ZTJOb3JtYWwoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQorew0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXQpOw0KKyAgICBpZiAobXQuSXNJZGVudGl0eSgpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdFJldmVyc2U7DQorICAgIG10UmV2ZXJzZS5TZXRSZXZlcnNlKG10KTsNCisgICAgbXRSZXZlcnNlLlRyYW5zZm9ybVBvaW50KGZ4LCBmeSk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9HZXRNYXRyaXgoQ0ZYX01hdHJpeCAmbSwgRlhfSU5UMzIgaVJvdGF0ZSwgRlhfSU5UMzIgYXQsIGNvbnN0IENGWF9SZWN0RiYgcnQpDQorew0KKyAgICBpZiAoIWlSb3RhdGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmQW5jaG9yWCwgZkFuY2hvclk7DQorICAgIHN3aXRjaCAoYXQpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDoNCisgICAgICAgICAgICBmQW5jaG9yWCA9IHJ0LmxlZnQsIGZBbmNob3JZID0gcnQudG9wOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BDZW50ZXI6DQorICAgICAgICAgICAgZkFuY2hvclggPSAocnQubGVmdCArIHJ0LnJpZ2h0KCkpIC8gMiwgZkFuY2hvclkgPSBydC50b3A7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcFJpZ2h0Og0KKyAgICAgICAgICAgIGZBbmNob3JYID0gcnQucmlnaHQoKSwgZkFuY2hvclkgPSBydC50b3A7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnQ6DQorICAgICAgICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXI6DQorICAgICAgICAgICAgZkFuY2hvclggPSAocnQubGVmdCArIHJ0LnJpZ2h0KCkpIC8gMiwgZkFuY2hvclkgPSAocnQudG9wICsgcnQuYm90dG9tKCkpIC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQ6DQorICAgICAgICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0Og0KKyAgICAgICAgICAgIGZBbmNob3JYID0gcnQubGVmdCwgZkFuY2hvclkgPSBydC5ib3R0b20oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyOg0KKyAgICAgICAgICAgIGZBbmNob3JYID0gKHJ0LmxlZnQgKyBydC5yaWdodCgpKSAvIDIsIGZBbmNob3JZID0gcnQuYm90dG9tKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbVJpZ2h0Og0KKyAgICAgICAgICAgIGZBbmNob3JYID0gcnQucmlnaHQoKSwgZkFuY2hvclkgPSBydC5ib3R0b20oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKGlSb3RhdGUpIHsNCisgICAgICAgIGNhc2UgOTA6DQorICAgICAgICAgICAgbS5hID0gMCwgbS5iID0gLTEsIG0uYyA9IDEsIG0uZCA9IDAsIG0uZSA9IGZBbmNob3JYIC0gZkFuY2hvclksIG0uZiA9IGZBbmNob3JYICsgZkFuY2hvclk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDE4MDoNCisgICAgICAgICAgICBtLmEgPSAtMSwgbS5iID0gMCwgbS5jID0gMCwgbS5kID0gLTEsIG0uZSA9IGZBbmNob3JYICogMiwgbS5mID0gZkFuY2hvclkgKiAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyNzA6DQorICAgICAgICAgICAgbS5hID0gMCwgbS5iID0gMSwgbS5jID0gLTEsIG0uZCA9IDAsIG0uZSA9IGZBbmNob3JYICsgZkFuY2hvclksIG0uZiA9IGZBbmNob3JZIC0gZkFuY2hvclg7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRSb3RhdGVNYXRyaXgoQ0ZYX01hdHJpeCAmbXQpDQorew0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgMCwgMCk7DQorICAgIEZYX0lOVDMyIGlSb3RhdGUgPSBtX3BEYXRhQWNjLT5HZXRSb3RhdGUoKTsNCisgICAgaWYgKCFpUm90YXRlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJjV2lkZ2V0Ow0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShyY1dpZGdldCk7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGF0ID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDsNCisgICAgWEZBX0dldE1hdHJpeChtdCwgaVJvdGF0ZSwgYXQsIHJjV2lkZ2V0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc0xheW91dFJlY3RFbXB0eSgpDQorew0KKyAgICBDRlhfUmVjdEYgcnRMYXlvdXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0TGF5b3V0KTsNCisgICAgcmV0dXJuIHJ0TGF5b3V0LndpZHRoIDwgMC4xZiAmJiBydExheW91dC5oZWlnaHQgPCAwLjFmOw0KK30NCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGV2lkZ2V0OjpHZXRQYXJlbnQoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IG1fcERhdGFBY2MtPkdldE5vZGUoKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmIChwUGFyZW50Tm9kZSAhPSBOVUxMKSB7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcFBhcmVudFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcFBhcmVudE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwUGFyZW50V2lkZ2V0QWNjICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gcFBhcmVudFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc0FuY2VzdG9yT2YoQ1hGQV9GRldpZGdldCogcFdpZGdldCkNCit7DQorICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BEYXRhQWNjLT5HZXROb2RlKCk7DQorICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpOw0KKyAgICB3aGlsZSAocENoaWxkTm9kZSkgew0KKyAgICAgICAgaWYgKHBDaGlsZE5vZGUgPT0gcE5vZGUpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldDo6UHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICBHZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgICAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZXaWRnZXQ6OkdldERvY1ZpZXcoKQ0KK3sNCisgICAgcmV0dXJuIG1fcERvY1ZpZXc7DQorfQ0KK0NYRkFfRkZEb2MqIENYRkFfRkZXaWRnZXQ6OkdldERvYygpDQorew0KKyAgICByZXR1cm4gKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpOw0KK30NCitDWEZBX0ZGQXBwKiBDWEZBX0ZGV2lkZ2V0OjpHZXRBcHAoKQ0KK3sNCisgICAgcmV0dXJuIEdldERvYygpLT5HZXRBcHAoKTsNCit9DQorSVhGQV9BcHBQcm92aWRlciogQ1hGQV9GRldpZGdldDo6R2V0QXBwUHJvdmlkZXIoKQ0KK3sNCisgICAgcmV0dXJuIEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OkdldE1pbk1heFdpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCwgRlhfRkxPQVQgZk1heFdpZHRoKQ0KK3sNCisgICAgZk1pbldpZHRoID0gZk1heFdpZHRoID0gMDsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gMDsNCisgICAgaWYgKG1fcERhdGFBY2MtPkdldFdpZHRoKGZXaWR0aCkpIHsNCisgICAgICAgIGZNaW5XaWR0aCA9IGZNYXhXaWR0aCA9IGZXaWR0aDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcERhdGFBY2MtPkdldE1pbldpZHRoKGZNaW5XaWR0aCk7DQorICAgICAgICBtX3BEYXRhQWNjLT5HZXRNYXhXaWR0aChmTWF4V2lkdGgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6R2V0TWluTWF4SGVpZ2h0KEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQpDQorew0KKyAgICBmTWluSGVpZ2h0ID0gZk1heEhlaWdodCA9IDA7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwOw0KKyAgICBpZiAobV9wRGF0YUFjYy0+R2V0SGVpZ2h0KGZIZWlnaHQpKSB7DQorICAgICAgICBmTWluSGVpZ2h0ID0gZk1heEhlaWdodCA9IGZIZWlnaHQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BEYXRhQWNjLT5HZXRNaW5IZWlnaHQoZk1pbkhlaWdodCk7DQorICAgICAgICBtX3BEYXRhQWNjLT5HZXRNYXhIZWlnaHQoZk1heEhlaWdodCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc01hdGNoVmlzaWJsZVN0YXR1cyhGWF9EV09SRCBkd1N0YXR1cykNCit7DQorICAgIHJldHVybiBtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OkV2ZW50S2lsbEZvY3VzKCkNCit7DQorICAgIGlmIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19BY2Nlc3MpIHsNCisgICAgICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfQWNjZXNzOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0V4aXQ7DQorICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fRXhpdCwgJmVQYXJhbSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNCdXR0b25Eb3duKCkNCit7DQorICAgIHJldHVybiAobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfQnV0dG9uRG93bikgIT0gMDsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpTZXRCdXR0b25Eb3duKEZYX0JPT0wgYlNldCkNCit7DQorICAgIGJTZXQgPyBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfQnV0dG9uRG93biA6IG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfQnV0dG9uRG93bjsNCit9DQorRlhfSU5UMzIgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgRlhfSU5UMzIgaVN0cm9rZVR5cGUsIEZYX0lOVDMyIGlDYXBUeXBlKQ0KK3sNCisgICAgc3dpdGNoKGlTdHJva2VUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3Q6IHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMX07DQorICAgICAgICAgICAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgZGFzaEFycmF5WzNdID0gMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgNCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9EQVNIU1RZTEVfRGFzaERvdDsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3Q6IHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMSwgMiwgMX07DQorICAgICAgICAgICAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgZGFzaEFycmF5WzNdID0gMjsNCisgICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheVs1XSA9IDI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDYpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0Rhc2hEb3REb3Q7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWQ6IHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NSwgMX07DQorICAgICAgICAgICAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMCwgZGFzaEFycmF5LCAyKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9EYXNoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRG90dGVkOiB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezIsIDF9Ow0KKyAgICAgICAgICAgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KKyAgICAgICAgICAgICAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9EQVNIU1RZTEVfRG90Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaChGWF9EQVNIU1RZTEVfU29saWQpOw0KKyAgICByZXR1cm4gRlhfREFTSFNUWUxFX1NvbGlkOw0KK30NCitDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgWEZBX0xpbmVDYXBUb0ZYR0UoRlhfSU5UMzIgaUxpbmVDYXApDQorew0KKyAgICBzd2l0Y2goaUxpbmVDYXApIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQ6DQorICAgICAgICAgICAgcmV0dXJuIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0Og0KKyAgICAgICAgICAgIHJldHVybiBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOw0KK30NCitjbGFzcyBDWEZBX0ltYWdlUmVuZGVyZXINCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ltYWdlUmVuZGVyZXIoKTsNCisgICAgfkNYRkFfSW1hZ2VSZW5kZXJlcigpOw0KKyAgICBGWF9CT09MCQlTdGFydChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7DQorICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9SZW5kZXJEZXZpY2UqCQltX3BEZXZpY2U7DQorICAgIGludAkJCQkJCW1fU3RhdHVzOw0KKyAgICBDRlhfQWZmaW5lTWF0cml4CQltX0ltYWdlTWF0cml4Ow0KKyAgICBDRlhfRElCU291cmNlKgkJCW1fcERJQlNvdXJjZTsNCisgICAgQ0ZYX0RJQml0bWFwKgkJCW1fcENsb25lQ29udmVydDsNCisgICAgaW50CQkJCQkJbV9CaXRtYXBBbHBoYTsNCisgICAgRlhfQVJHQgkJCQkJbV9GaWxsQXJnYjsNCisgICAgRlhfRFdPUkQJCQkJbV9GbGFnczsNCisgICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqCW1fcFRyYW5zZm9ybWVyOw0KKyAgICBGWF9MUFZPSUQJCQkJbV9EZXZpY2VIYW5kbGU7DQorICAgIEZYX0lOVDMyCQkJCW1fQmxlbmRUeXBlOw0KKyAgICBGWF9CT09MCQkJCQltX1Jlc3VsdDsNCisgICAgRlhfQk9PTAkJCQkJbV9iUHJpbnQ7DQorICAgIEZYX0JPT0wJCQkJCVN0YXJ0RElCU291cmNlKCk7DQorICAgIHZvaWQJCQkJCUNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfQVJHQiBtYXNrX2FyZ2IsDQorICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgaW50IGJsZW5kX21vZGUsIGludCBUcmFuc3BhcmVuY3kpOw0KK307DQorQ1hGQV9JbWFnZVJlbmRlcmVyOjpDWEZBX0ltYWdlUmVuZGVyZXIoKQ0KK3sNCisgICAgbV9wRGV2aWNlID0gTlVMTDsNCisgICAgbV9TdGF0dXMgPSAwOw0KKyAgICBtX3BESUJTb3VyY2UgPSBOVUxMOw0KKyAgICBtX3BDbG9uZUNvbnZlcnQgPSBOVUxMOw0KKyAgICBtX0JpdG1hcEFscGhhID0gMjU1Ow0KKyAgICBtX0ZpbGxBcmdiID0gMDsNCisgICAgbV9GbGFncyA9IDA7DQorICAgIG1fcFRyYW5zZm9ybWVyID0gTlVMTDsNCisgICAgbV9EZXZpY2VIYW5kbGUgPSBOVUxMOw0KKyAgICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsNCisgICAgbV9SZXN1bHQgPSBUUlVFOw0KKyAgICBtX2JQcmludCA9IEZBTFNFOw0KK30NCitDWEZBX0ltYWdlUmVuZGVyZXI6On5DWEZBX0ltYWdlUmVuZGVyZXIoKQ0KK3sNCisgICAgaWYgKG1fcENsb25lQ29udmVydCkgew0KKyAgICAgICAgZGVsZXRlIG1fcENsb25lQ29udmVydDsNCisgICAgfQ0KKyAgICBpZiAobV9wVHJhbnNmb3JtZXIpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BUcmFuc2Zvcm1lcjsNCisgICAgfQ0KKyAgICBpZiAobV9EZXZpY2VIYW5kbGUpIHsNCisgICAgICAgIG1fcERldmljZS0+Q2FuY2VsRElCaXRzKG1fRGV2aWNlSGFuZGxlKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIGludCBibGVuZFR5cGUpDQorew0KKyAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOw0KKyAgICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOw0KKyAgICBtX0ZpbGxBcmdiID0gYml0bWFwX2FyZ2I7DQorICAgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7DQorICAgIG1fSW1hZ2VNYXRyaXggPSAqcEltYWdlMkRldmljZTsNCisgICAgbV9GbGFncyA9IGZsYWdzOw0KKyAgICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsNCisgICAgcmV0dXJuIFN0YXJ0RElCU291cmNlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZVJlbmRlcmVyOjpTdGFydERJQlNvdXJjZSgpDQorew0KKyAgICBpZiAobV9wRGV2aWNlLT5TdGFydERJQml0cyhtX3BESUJTb3VyY2UsIG1fQml0bWFwQWxwaGEsIG1fRmlsbEFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLCBtX0RldmljZUhhbmRsZSwgMCwgTlVMTCwgbV9CbGVuZFR5cGUpKSB7DQorICAgICAgICBpZiAobV9EZXZpY2VIYW5kbGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fU3RhdHVzID0gMzsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsNCisgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsNCisgICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7DQorICAgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7DQorICAgIGlmICgoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8DQorICAgICAgICAgICAgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguZCA9PSAwKSApIHsNCisgICAgICAgIGlmIChtX2JQcmludCAmJiAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgew0KKyAgICAgICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERpYiA9IG1fcERJQlNvdXJjZTsNCisgICAgICAgIGlmIChtX3BESUJTb3VyY2UtPkhhc0FscGhhKCkgJiYgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfSU1BR0UpICYmICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKSkgew0KKyAgICAgICAgICAgIG1fcENsb25lQ29udmVydCA9IG1fcERJQlNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYik7DQorICAgICAgICAgICAgaWYgKCFtX3BDbG9uZUNvbnZlcnQpIHsNCisgICAgICAgICAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwRGliID0gbV9wQ2xvbmVDb252ZXJ0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOw0KKyAgICAgICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOw0KKyAgICAgICAgbV9TdGF0dXMgPSAyOw0KKyAgICAgICAgbV9wVHJhbnNmb3JtZXIgPSBGWF9ORVcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7DQorICAgICAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQocERpYiwgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsICZjbGlwX2JveCk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgew0KKyAgICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOw0KKyAgICB9DQorICAgIGlmIChtX0ltYWdlTWF0cml4LmQgPiAwKSB7DQorICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsNCisgICAgfQ0KKyAgICBpbnQgZGVzdF9sZWZ0LCBkZXN0X3RvcDsNCisgICAgZGVzdF9sZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBpbWFnZV9yZWN0LmxlZnQgOiBpbWFnZV9yZWN0LnJpZ2h0Ow0KKyAgICBkZXN0X3RvcCA9IGRlc3RfaGVpZ2h0ID4gMCA/IGltYWdlX3JlY3QudG9wIDogaW1hZ2VfcmVjdC5ib3R0b207DQorICAgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSAmJiBtX0JpdG1hcEFscGhhID09IDI1NSkgew0KKyAgICAgICAgaWYgKG1fcERldmljZS0+U3RyZXRjaERJQml0cyhtX3BESUJTb3VyY2UsIGRlc3RfbGVmdCwgZGVzdF90b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgew0KKyAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7DQorICAgICAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wRGV2aWNlLT5TdHJldGNoQml0TWFzayhtX3BESUJTb3VyY2UsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZpbGxBcmdiLCBtX0ZsYWdzKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9iUHJpbnQgJiYgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsNCisgICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQorICAgIEZYX1JFQ1QgZGVzdF9yZWN0ID0gY2xpcF9ib3g7DQorICAgIGRlc3RfcmVjdC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7DQorICAgIEZYX1JFQ1QgZGVzdF9jbGlwKGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC5yaWdodCAtIGltYWdlX3JlY3QubGVmdCwgZGVzdF9yZWN0LmJvdHRvbSAtIGltYWdlX3JlY3QudG9wKTsNCisgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gbV9wRElCU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsICZkZXN0X2NsaXApOw0KKyAgICBpZiAocFN0cmV0Y2hlZCkgew0KKyAgICAgICAgQ29tcG9zaXRlRElCaXRtYXAocFN0cmV0Y2hlZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEsIG1fQmxlbmRUeXBlLCBGQUxTRSk7DQorICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsNCisgICAgICAgIHBTdHJldGNoZWQgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQ0KK3sNCisgICAgaWYgKG1fU3RhdHVzID09IDIpIHsNCisgICAgICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOw0KKyAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQorICAgICAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7DQorICAgICAgICAgICAgICAgIG1fRmlsbEFyZ2IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1Jlc3VsdCA9IG1fcERldmljZS0+U2V0Qml0TWFzayhwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgew0KKyAgICAgICAgICAgICAgICBwQml0bWFwLT5NdWx0aXBseUFscGhhKG1fQml0bWFwQWxwaGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1Jlc3VsdCA9IG1fcERldmljZS0+U2V0RElCaXRzKHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRMZWZ0LCBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRUb3AsIG1fQmxlbmRUeXBlKTsNCisgICAgICAgIH0NCisgICAgICAgIGRlbGV0ZSBwQml0bWFwOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDMpIHsNCisgICAgICAgIHJldHVybiBtX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKG1fRGV2aWNlSGFuZGxlLCBwUGF1c2UpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ltYWdlUmVuZGVyZXI6OkNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfQVJHQiBtYXNrX2FyZ2IsDQorICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBpbnQgYmxlbmRfbW9kZSwgaW50IFRyYW5zcGFyZW5jeSkNCit7DQorICAgIGlmIChwRElCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7DQorICAgIEZYX0JPT0wgYkdyb3VwID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVA7DQorICAgIGlmIChibGVuZF9tb2RlID09IEZYRElCX0JMRU5EX05PUk1BTCkgew0KKyAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsNCisgICAgICAgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7DQorICAgICAgICAgICAgICAgIHBESUJpdG1hcC0+TXVsdGlwbHlBbHBoYShiaXRtYXBfYWxwaGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCBsZWZ0LCB0b3ApKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfYXJnYiA9IChtYXNrX2FyZ2IpOw0KKyAgICAgICAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsNCisgICAgICAgICAgICAgICAgKChGWF9CWVRFKikmZmlsbF9hcmdiKVszXSA9ICgoRlhfQllURSopJmZpbGxfYXJnYilbM10gKiBiaXRtYXBfYWxwaGEgLyAyNTU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPlNldEJpdE1hc2socERJQml0bWFwLCBsZWZ0LCB0b3AsIGZpbGxfYXJnYikpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkOw0KKyAgICBGWF9CT09MIGJHZXRCYWNrR3JvdW5kID0gKChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSkgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpICYmIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOw0KKyAgICBpZiAoYkdldEJhY2tHcm91bmQpIHsNCisgICAgICAgIGlmIChiSXNvbGF0ZWQgfHwgIWJHcm91cCkgew0KKyAgICAgICAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsNCisgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBDbG9uZSA9IE5VTEw7DQorICAgICAgICAgICAgRlhfQk9PTCBiQ2xvbmUgPSBGQUxTRTsNCisgICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsNCisgICAgICAgICAgICAgICAgYkNsb25lID0gVFJVRTsNCisgICAgICAgICAgICAgICAgcENsb25lID0gbV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpLT5DbG9uZSgmcmVjdCk7DQorICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqcEZvcmVCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgICAgICAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksIHBGb3JlQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wKTsNCisgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgPj0gMCA/IDAgOiBsZWZ0Ow0KKyAgICAgICAgICAgICAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7DQorICAgICAgICAgICAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKQ0KKyAgICAgICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOw0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZU1hc2soMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19hcmdiLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBDbG9uZSA9IHBESUJpdG1hcDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fcERldmljZS0+R2V0QmFja0Ryb3AoKSkgew0KKyAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwQ2xvbmUsIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIGJsZW5kX21vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoYkNsb25lKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ2xvbmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwRElCaXRtYXAtPkhhc0FscGhhKCkgJiYgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfSU1BR0UpKSB7DQorICAgICAgICBDRlhfRElCaXRtYXAqIHBDbG9uZUNvbnZlcnQgPSBwRElCaXRtYXAtPkNsb25lQ29udmVydChGWERJQl9SZ2IpOw0KKyAgICAgICAgaWYgKCFwQ2xvbmVDb252ZXJ0KSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9JbWFnZVJlbmRlcmVyIGltYWdlUmVuZGVyOw0KKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gaW1hZ2VSZW5kZXIuU3RhcnQobV9wRGV2aWNlLCBwQ2xvbmVDb252ZXJ0LCBtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncyk7DQorICAgICAgICB3aGlsZSAoYlJldCkgew0KKyAgICAgICAgICAgIGJSZXQgPSBpbWFnZVJlbmRlci5Db250aW51ZShOVUxMKTsNCisgICAgICAgIH0NCisgICAgICAgIGRlbGV0ZSBwQ2xvbmVDb252ZXJ0Ow0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorfQ0KK3ZvaWQgWEZBX0RyYXdJbWFnZShDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX1JlY3RGICZydEltYWdlLCBDRlhfTWF0cml4KiBwTWF0cml4LCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgRlhfSU5UMzIgaUFzcGVjdCwgRlhfSU5UMzIgaUltYWdlWERwaSwgRlhfSU5UMzIgaUltYWdlWURwaSwgRlhfSU5UMzIgaUhvcnpBbGlnbiwgRlhfSU5UMzIgaVZlcnRBbGlnbikNCit7DQorICAgIGlmIChydEltYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmICghcERJQml0bWFwIHx8ICFwRElCaXRtYXAtPkdldEJ1ZmZlcigpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZHRoID0gWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcERJQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSk7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwRElCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSk7DQorICAgIENGWF9SZWN0RiBydEZpdDsNCisgICAgcnRGaXQuU2V0KHJ0SW1hZ2UubGVmdCwgcnRJbWFnZS50b3AsIGZXaWR0aCwgZkhlaWdodCk7DQorICAgIHN3aXRjaCAoaUFzcGVjdCkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9GaXQ6IHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZjEgPSBydEltYWdlLmhlaWdodCAvIHJ0Rml0LmhlaWdodDsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZjIgPSBydEltYWdlLndpZHRoIC8gcnRGaXQud2lkdGg7DQorICAgICAgICAgICAgICAgIGYxID0gRlhfTUlOKGYxLCBmMik7DQorICAgICAgICAgICAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0Rml0LmhlaWdodCAqIGYxOw0KKyAgICAgICAgICAgICAgICBydEZpdC53aWR0aCA9IHJ0Rml0LndpZHRoICogZjE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWw6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodDogew0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBmMSA9IHJ0SW1hZ2UuaGVpZ2h0IC8gcnRGaXQuaGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBydEZpdC5oZWlnaHQgPSBydEltYWdlLmhlaWdodDsNCisgICAgICAgICAgICAgICAgcnRGaXQud2lkdGggID0gZjEgKiBydEZpdC53aWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQorICAgICAgICAgICAgcnRGaXQud2lkdGggID0gcnRJbWFnZS53aWR0aDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2lkdGg6IHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZjEgPSBydEltYWdlLndpZHRoIC8gcnRGaXQud2lkdGg7DQorICAgICAgICAgICAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCisgICAgICAgICAgICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRGaXQuaGVpZ2h0ICogZjE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcikgew0KKyAgICAgICAgcnRGaXQubGVmdCArPSAocnRJbWFnZS53aWR0aCAtIHJ0Rml0LndpZHRoKSAvIDI7DQorICAgIH0gZWxzZSBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgICAgcnRGaXQubGVmdCA9IHJ0SW1hZ2UucmlnaHQoKSAtIHJ0Rml0LndpZHRoOw0KKyAgICB9DQorICAgIGlmIChpVmVydEFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZSkgew0KKyAgICAgICAgcnRGaXQudG9wICs9IChydEltYWdlLmhlaWdodCAtIHJ0Rml0LmhlaWdodCkgLyAyOw0KKyAgICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgICBydEZpdC50b3AgPSBydEltYWdlLmJvdHRvbSgpIC0gcnRJbWFnZS5oZWlnaHQ7DQorICAgIH0NCisgICAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7DQorICAgIHBSZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgICBDRlhfUGF0aERhdGEgcGF0aDsNCisgICAgcGF0aC5BcHBlbmRSZWN0KHJ0SW1hZ2UubGVmdCwgcnRJbWFnZS5ib3R0b20oKSwgcnRJbWFnZS5yaWdodCgpLCBydEltYWdlLnRvcCk7DQorICAgIHBSZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIEZYRklMTF9XSU5ESU5HKTsNCisgICAgQ0ZYX01hdHJpeCBtdEltYWdlKDEsIDAsIDAsIC0xLCAwLCAxKTsNCisgICAgbXRJbWFnZS5Db25jYXQocnRGaXQud2lkdGgsIDAsIDAsIHJ0Rml0LmhlaWdodCwgcnRGaXQubGVmdCwgcnRGaXQudG9wKTsNCisgICAgbXRJbWFnZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICBDWEZBX0ltYWdlUmVuZGVyZXIgaW1hZ2VSZW5kZXI7DQorICAgIEZYX0JPT0wgYlJldCA9IGltYWdlUmVuZGVyLlN0YXJ0KHBSZW5kZXJEZXZpY2UsIHBESUJpdG1hcCwgMCwgMjU1LCAmbXRJbWFnZSwgRlhESUJfSU5URVJQT0wpOw0KKyAgICB3aGlsZSAoYlJldCkgew0KKyAgICAgICAgYlJldCA9IGltYWdlUmVuZGVyLkNvbnRpbnVlKE5VTEwpOw0KKyAgICB9DQorICAgIHBSZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KK30NCitjb25zdCBzdGF0aWMgRlhfQllURSBnX2ludl9iYXNlNjRbMTI4XSA9IHsNCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LA0KKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LA0KKyAgICAyNTUsIDI1NSwgMjU1LCAgNjIsIDI1NSwgMjU1LCAyNTUsICA2MywNCisgICAgNTIsICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksDQorICAgIDYwLCAgIDYxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LA0KKyAgICAyNTUsICAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwNCisgICAgNywgICAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsDQorICAgIDE1LCAgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLA0KKyAgICAyMywgICAyNCwgIDI1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCisgICAgMjU1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsDQorICAgIDMzLCAgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLA0KKyAgICA0MSwgICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwNCisgICAgNDksICAgNTAsICA1MSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQorfTsNCitzdGF0aWMgRlhfTFBCWVRFIFhGQV9SZW1vdmVCYXNlNjRXaGl0ZXNwYWNlKEZYX0xQQ0JZVEUgcFN0ciwgRlhfSU5UMzIgaUxlbikNCit7DQorICAgIEZYX0xQQllURSBwQ1A7DQorICAgIEZYX0lOVDMyIGkgPSAwLCBqID0gMDsNCisgICAgaWYgKGlMZW4gPT0gMCkgew0KKyAgICAgICAgaUxlbiA9IEZYU1lTX3N0cmxlbigoRlhfQ0hBUiopcFN0cik7DQorICAgIH0NCisgICAgcENQID0gKEZYX0xQQllURSlGREVfQWxsb2MoaUxlbiArIDEpOw0KKyAgICBmb3IgKDsgaSA8IGlMZW47IGkrKykgew0KKyAgICAgICAgaWYgKChwU3RyW2ldICYgMTI4KSA9PSAwKSB7DQorICAgICAgICAgICAgaWYgKGdfaW52X2Jhc2U2NFtwU3RyW2ldXSAhPSAweEZGIHx8IHBTdHJbaV0gPT0gJz0nKSB7DQorICAgICAgICAgICAgICAgIHBDUFtqKytdID0gcFN0cltpXTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcENQW2pdID0gJ1wwJzsNCisgICAgcmV0dXJuIHBDUDsNCit9DQorc3RhdGljIEZYX0lOVDMyIFhGQV9CYXNlNjREZWNvZGUoRlhfTFBDU1RSIHBTdHIsIEZYX0xQQllURSBwT3V0QnVmZmVyKQ0KK3sNCisgICAgaWYgKHBTdHIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfTFBCWVRFIHBCdWZmZXIgPSBYRkFfUmVtb3ZlQmFzZTY0V2hpdGVzcGFjZSgoRlhfTFBCWVRFKXBTdHIsIEZYU1lTX3N0cmxlbigoRlhfQ0hBUiopcFN0cikpOw0KKyAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVuID0gRlhTWVNfc3RybGVuKChGWF9DSEFSKilwQnVmZmVyKTsNCisgICAgRlhfSU5UMzIgaSA9IDAsIGogPSAwOw0KKyAgICBGWF9EV09SRCBkd0xpbWIgPSAwOw0KKyAgICBmb3IgKDsgaSArIDMgPCBpTGVuOyBpICs9IDQpIHsNCisgICAgICAgIGlmIChwQnVmZmVyW2ldID09ICc9JyB8fCBwQnVmZmVyW2kgKyAxXSA9PSAnPScNCisgICAgICAgICAgICAgICAgfHwgcEJ1ZmZlcltpICsgMl0gPT0gJz0nIHx8IHBCdWZmZXJbaSArIDNdID09ICc9Jykgew0KKyAgICAgICAgICAgIGlmIChwQnVmZmVyW2ldID09ICc9JyB8fCBwQnVmZmVyW2kgKyAxXSA9PSAnPScpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwQnVmZmVyW2kgKyAyXSA9PSAnPScpIHsNCisgICAgICAgICAgICAgICAgZHdMaW1iID0gKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgNikNCisgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAxXV0pOw0KKyAgICAgICAgICAgICAgICBwT3V0QnVmZmVyW2pdID0gKEZYX0JZVEUpKGR3TGltYiA+PiA0KSAmIDB4RkY7DQorICAgICAgICAgICAgICAgIGorKzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkd0xpbWIgPSAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2ldXSA8PCAxMikgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAxXV0gPDwgNikgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAyXV0pOw0KKyAgICAgICAgICAgICAgICBwT3V0QnVmZmVyW2pdID0gKEZYX0JZVEUpKGR3TGltYiA+PiAxMCkgJiAweEZGOw0KKyAgICAgICAgICAgICAgICBwT3V0QnVmZmVyW2ogKyAxXSA9IChGWF9CWVRFKShkd0xpbWIgPj4gMikgJiAweEZGOw0KKyAgICAgICAgICAgICAgICBqICs9IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkd0xpbWIgPSAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2ldXSA8PCAxOCkgfA0KKyAgICAgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDFdXSA8PCAxMikgfA0KKyAgICAgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDJdXSA8PCA2KSB8DQorICAgICAgICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgM11dKTsNCisgICAgICAgICAgICBwT3V0QnVmZmVyW2pdID0gKEZYX0JZVEUpKGR3TGltYiA+PiAxNikgJiAweGZmOw0KKyAgICAgICAgICAgIHBPdXRCdWZmZXJbaiArIDFdID0gKEZYX0JZVEUpKGR3TGltYiA+PiA4KSAmIDB4ZmY7DQorICAgICAgICAgICAgcE91dEJ1ZmZlcltqICsgMl0gPSAoRlhfQllURSkoZHdMaW1iKSAmIDB4ZmY7DQorICAgICAgICAgICAgaiArPSAzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZERV9GcmVlKHBCdWZmZXIpOw0KKyAgICByZXR1cm4gajsNCit9DQorc3RhdGljIEZYX0NIQVIgZ19iYXNlNjRfY2hhcnNbXSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsNCitGWF9MUFNUUiBYRkFfQmFzZTY0RW5jb2RlKEZYX0xQQ0JZVEUgYnVmLCBGWF9JTlQzMiBidWZfbGVuKQ0KK3sNCisgICAgRlhfTFBTVFIgb3V0ID0gTlVMTDsNCisgICAgaW50IGksIGo7DQorICAgIEZYX0RXT1JEIGxpbWI7DQorICAgIG91dCA9IChGWF9MUFNUUilGWF9BbGxvYyhGWF9DSEFSLCAoKGJ1Zl9sZW4gKiA4ICsgNSkgLyA2KSArIDUpOw0KKyAgICBmb3IgKGkgPSAwLCBqID0gMCwgbGltYiA9IDA7IGkgKyAyIDwgYnVmX2xlbjsgaSArPSAzLCBqICs9IDQpIHsNCisgICAgICAgIGxpbWIgPQ0KKyAgICAgICAgICAgICgoRlhfRFdPUkQpYnVmW2ldIDw8IDE2KSB8DQorICAgICAgICAgICAgKChGWF9EV09SRClidWZbaSArIDFdIDw8IDgpIHwNCisgICAgICAgICAgICAoKEZYX0RXT1JEKWJ1ZltpICsgMl0pOw0KKyAgICAgICAgb3V0W2pdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMTgpICYgNjNdOw0KKyAgICAgICAgb3V0W2ogKyAxXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iID4+IDEyKSAmIDYzXTsNCisgICAgICAgIG91dFtqICsgMl0gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiA2KSAmIDYzXTsNCisgICAgICAgIG91dFtqICsgM10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYikgJiA2M107DQorICAgIH0NCisgICAgc3dpdGNoIChidWZfbGVuIC0gaSkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGxpbWIgPSAoKEZYX0RXT1JEKWJ1ZltpXSk7DQorICAgICAgICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAyKSAmIDYzXTsNCisgICAgICAgICAgICBvdXRbaisrXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iIDw8IDQpICYgNjNdOw0KKyAgICAgICAgICAgIG91dFtqKytdID0gJz0nOw0KKyAgICAgICAgICAgIG91dFtqKytdID0gJz0nOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIGxpbWIgPSAoKEZYX0RXT1JEKWJ1ZltpXSA8PCA4KSB8ICgoRlhfRFdPUkQpYnVmW2kgKyAxXSk7DQorICAgICAgICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAxMCkgJiA2M107DQorICAgICAgICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiA0KSAmIDYzXTsNCisgICAgICAgICAgICBvdXRbaisrXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iIDw8IDIpICYgNjNdOw0KKyAgICAgICAgICAgIG91dFtqKytdID0gJz0nOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBvdXRbal0gPSAnXDAnOw0KKyAgICByZXR1cm4gb3V0Ow0KK30NCitGWENPREVDX0lNQUdFX1RZUEUgWEZBX0dldEltYWdlVHlwZShGWF9XU1RSIHdzVHlwZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGUod3NUeXBlKTsNCisgICAgd3NDb250ZW50VHlwZS5NYWtlTG93ZXIoKTsNCisgICAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJpbWFnZS9qcGciKSkgew0KKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfSlBHOw0KKyAgICB9DQorICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvcG5nIikpIHsNCisgICAgICAgIHJldHVybiBGWENPREVDX0lNQUdFX1BORzsNCisgICAgfQ0KKyAgICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL2dpZiIpKSB7DQorICAgICAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9HSUY7DQorICAgIH0NCisgICAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJpbWFnZS9ibXAiKSkgew0KKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfQk1QOw0KKyAgICB9DQorICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvdGlmIikpIHsNCisgICAgICAgIHJldHVybiBGWENPREVDX0lNQUdFX1RJRjsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9VTktOT1dOOw0KK30NCitDRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VEYXRhKENYRkFfRkZEb2MgKnBEb2MsIENYRkFfSW1hZ2UgKnBJbWFnZSwgRlhfQk9PTCAmYk5hbWVJbWFnZSwgRlhfSU5UMzIgJmlJbWFnZVhEcGksIEZYX0lOVDMyICZpSW1hZ2VZRHBpKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIcmVmOw0KKyAgICBwSW1hZ2UtPkdldEhyZWYod3NIcmVmKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJbWFnZTsNCisgICAgcEltYWdlLT5HZXRDb250ZW50KHdzSW1hZ2UpOw0KKyAgICBpZiAod3NIcmVmLklzRW1wdHkoKSAmJiB3c0ltYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgcEltYWdlLT5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsNCisgICAgRlhDT0RFQ19JTUFHRV9UWVBFIHR5cGUgPSBYRkFfR2V0SW1hZ2VUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0NvbnRlbnQ7DQorICAgIEZYX0xQQllURSBwSW1hZ2VCdWZmZXIgPSBOVUxMOw0KKyAgICBJRlhfRmlsZVJlYWQqIHBJbWFnZUZpbGVSZWFkID0gTlVMTDsNCisgICAgaWYgKHdzSW1hZ2UuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBpRW5jb2RpbmcgPSAoWEZBX0FUVFJJQlVURUVOVU0pcEltYWdlLT5HZXRUcmFuc2ZlckVuY29kaW5nKCk7DQorICAgICAgICBpZiAoaUVuY29kaW5nID09IFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCkgew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IHdzSW1hZ2UuVVRGOEVuY29kZSgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGggPSBic0RhdGEuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgcEltYWdlQnVmZmVyID0gRkRFX0FsbG9jKGlMZW5ndGgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlSZWFkID0gWEZBX0Jhc2U2NERlY29kZSgoRlhfTFBDU1RSKWJzRGF0YSwgcEltYWdlQnVmZmVyKTsNCisgICAgICAgICAgICBpZiAoaVJlYWQgPiAwKSB7DQorICAgICAgICAgICAgICAgIHBJbWFnZUZpbGVSZWFkID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBJbWFnZUJ1ZmZlciwgaVJlYWQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYnNDb250ZW50ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzSW1hZ2UpOw0KKyAgICAgICAgICAgIHBJbWFnZUZpbGVSZWFkID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKChGWF9MUEJZVEUpKEZYX0xQQ0JZVEUpYnNDb250ZW50LCBic0NvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkwgPSB3c0hyZWY7DQorICAgICAgICBpZiAod3NVUkwuTGVmdCg3KSAhPSBGWF9XU1RSQyhMImh0dHA6Ly8iKSAmJiB3c1VSTC5MZWZ0KDYpICE9IEZYX1dTVFJDKEwiZnRwOi8vIikpIHsNCisgICAgICAgICAgICBDRlhfRElCaXRtYXAgKnBCaXRtYXAgPSBwRG9jLT5HZXRQREZOYW1lZEltYWdlKHdzVVJMLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgICAgICAgICBpZiAocEJpdG1hcCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGJOYW1lSW1hZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcEJpdG1hcDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwSW1hZ2VGaWxlUmVhZCA9IHBEb2MtPkdldERvY1Byb3ZpZGVyKCktPk9wZW5MaW5rZWRGaWxlKChYRkFfSERPQylwRG9jLCB3c1VSTCk7DQorICAgIH0NCisgICAgaWYgKCFwSW1hZ2VGaWxlUmVhZCkgew0KKyAgICAgICAgaWYgKHBJbWFnZUJ1ZmZlcikgew0KKyAgICAgICAgICAgIEZERV9GcmVlKHBJbWFnZUJ1ZmZlcik7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBiTmFtZUltYWdlID0gRkFMU0U7DQorICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgaWYgKHBJbWFnZUJ1ZmZlcikgew0KKyAgICAgICAgRkRFX0ZyZWUocEltYWdlQnVmZmVyKTsNCisgICAgfQ0KKyAgICBwSW1hZ2VGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gcEJpdG1hcDsNCit9DQorc3RhdGljIEZYRElCX0Zvcm1hdCBYRkFfR2V0RElCRm9ybWF0KEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLCBGWF9JTlQzMiBpQ29tcG9uZW50cywgRlhfSU5UMzIgaUJpdHNQZXJDb21wb25lbnQpDQorew0KKyAgICBGWERJQl9Gb3JtYXQgZGliRm9ybWF0ID0gRlhESUJfQXJnYjsNCisgICAgc3dpdGNoICh0eXBlKSB7DQorICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOg0KKyAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzoNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsNCisgICAgICAgICAgICAgICAgZGliRm9ybWF0ID0gRlhESUJfUmdiMzI7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGJwcCA9IGlDb21wb25lbnRzICogaUJpdHNQZXJDb21wb25lbnQ7DQorICAgICAgICAgICAgICAgIGlmIChicHAgPD0gMjQpIHsNCisgICAgICAgICAgICAgICAgICAgIGRpYkZvcm1hdCA9IEZYRElCX1JnYjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBkaWJGb3JtYXQ7DQorfQ0KK0NGWF9ESUJpdG1hcCogWEZBX0xvYWRJbWFnZUZyb21CdWZmZXIoSUZYX0ZpbGVSZWFkKiBwSW1hZ2VGaWxlUmVhZCwgRlhDT0RFQ19JTUFHRV9UWVBFIHR5cGUsIEZYX0lOVDMyICZpSW1hZ2VYRHBpLCBGWF9JTlQzMiAmaUltYWdlWURwaSkNCit7DQorICAgIENGWF9HRU1vZHVsZSogcEdlTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKTsNCisgICAgaWYgKCFwR2VNb2R1bGUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01nciA9IHBHZU1vZHVsZS0+R2V0Q29kZWNNb2R1bGUoKTsNCisgICAgaWYgKCFwQ29kZWNNZ3IpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9ESUJBdHRyaWJ1dGUgZGliQXR0cjsNCisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gTlVMTDsNCisgICAgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcFByb2dyZXNzaXZlRGVjb2RlciA9IHBDb2RlY01nci0+Q3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7DQorICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkxvYWRJbWFnZUluZm8ocEltYWdlRmlsZVJlYWQsIHR5cGUsICZkaWJBdHRyKTsNCisgICAgc3dpdGNoIChkaWJBdHRyLm1fd0RQSVVuaXQpIHsNCisgICAgICAgIGNhc2UgRlhDT0RFQ19SRVNVTklUX0NFTlRJTUVURVI6DQorICAgICAgICAgICAgZGliQXR0ci5tX25YRFBJID0gKEZYX0lOVDMyKShkaWJBdHRyLm1fblhEUEkgKiAyLjU0Zik7DQorICAgICAgICAgICAgZGliQXR0ci5tX25ZRFBJID0gKEZYX0lOVDMyKShkaWJBdHRyLm1fbllEUEkgKiAyLjU0Zik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ09ERUNfUkVTVU5JVF9NRVRFUjoNCisgICAgICAgICAgICBkaWJBdHRyLm1fblhEUEkgPSAoRlhfSU5UMzIpKGRpYkF0dHIubV9uWERQSSAvIChGWF9GTE9BVCkxMDAgKiAyLjU0Zik7DQorICAgICAgICAgICAgZGliQXR0ci5tX25ZRFBJID0gKEZYX0lOVDMyKShkaWJBdHRyLm1fbllEUEkgLyAoRlhfRkxPQVQpMTAwICogMi41NGYpOw0KKyAgICAgICAgICAgIGJyZWFrOzsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaUltYWdlWERwaSA9IGRpYkF0dHIubV9uWERQSSA+IDEgPyBkaWJBdHRyLm1fblhEUEkgOiAoOTYpOw0KKyAgICBpSW1hZ2VZRHBpID0gZGliQXR0ci5tX25ZRFBJID4gMSA/IGRpYkF0dHIubV9uWURQSSA6ICg5Nik7DQorICAgIGlmIChwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRXaWR0aCgpID4gMCAmJiBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRIZWlnaHQoKSA+IDApIHsNCisgICAgICAgIHR5cGUgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRUeXBlKCk7DQorICAgICAgICBGWF9JTlQzMiBpQ29tcG9uZW50cyA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkdldE51bUNvbXBvbmVudHMoKTsNCisgICAgICAgIEZYX0lOVDMyIGlCcGMgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRCUEMoKTsNCisgICAgICAgIEZYRElCX0Zvcm1hdCBkaWJGb3JtYXQgPSBYRkFfR2V0RElCRm9ybWF0KHR5cGUsIGlDb21wb25lbnRzLCBpQnBjKTsNCisgICAgICAgIHBCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwKCk7DQorICAgICAgICBwQml0bWFwLT5DcmVhdGUocFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0V2lkdGgoKSwgcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0SGVpZ2h0KCksIGRpYkZvcm1hdCk7DQorICAgICAgICBwQml0bWFwLT5DbGVhcigweGZmZmZmZmZmKTsNCisgICAgICAgIEZYX0lOVDMyIG5GcmFtZXM7DQorICAgICAgICBpZiAoKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEZyYW1lcyhuRnJhbWVzKSA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFkpICYmIChuRnJhbWVzID4gMCkpIHsNCisgICAgICAgICAgICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5TdGFydERlY29kZShwQml0bWFwLCAwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSk7DQorICAgICAgICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+Q29udGludWVEZWNvZGUoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBkZWxldGUgcFByb2dyZXNzaXZlRGVjb2RlcjsNCisgICAgcmV0dXJuIHBCaXRtYXA7DQorfQ0KK3ZvaWQgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihDRlhfUmVjdEYgJnJ0LCBjb25zdCBDWEZBX01hcmdpbiAmbWcsIEZYX0JPT0wgYlVJICkNCit7DQorICAgIGlmICghbWcpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgIG1nLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgbWcuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgbWcuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIG1nLkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIHJ0LkRlZmxhdGUoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsNCit9DQorQ1hGQV9GRldpZGdldCogWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pDQorew0KKyAgICBYRkFfRUxFTUVOVCBpVHlwZSA9IHBMYXlvdXRJdGVtLT5HZXRGb3JtTm9kZSgpLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChYRkFfSXNDcmVhdGVXaWRnZXQoaVR5cGUpKSB7DQorICAgICAgICByZXR1cm4gKENYRkFfRkZXaWRnZXQqKShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW07DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgWEZBX0lzQ3JlYXRlV2lkZ2V0KFhGQV9FTEVNRU5UIGlUeXBlKQ0KK3sNCisgICAgcmV0dXJuIGlUeXBlID09IFhGQV9FTEVNRU5UX0ZpZWxkIHx8IGlUeXBlID09IFhGQV9FTEVNRU5UX0RyYXcgfHwgaVR5cGUgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBpVHlwZSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfR2V0UGF0aF9BcmMoQ1hGQV9Cb3ggYm94LCBDRlhfUmVjdEYgcnREcmF3LCBDRlhfUGF0aCAmZmlsbFBhdGgsIEZYX0RXT1JEIGR3RmxhZ3MpDQorew0KKyAgICBGWF9GTE9BVCBhLCBiOw0KKyAgICBhID0gcnREcmF3LndpZHRoIC8gMi4wZjsNCisgICAgYiA9IHJ0RHJhdy5oZWlnaHQgLyAyLjBmOw0KKyAgICBpZiAoYm94LklzQ2lyY3VsYXIoKSB8fCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApIHsNCisgICAgICAgIGEgPSBiID0gRlhfTUlOKGEsIGIpOw0KKyAgICB9DQorICAgIENGWF9Qb2ludEYgY2VudGVyID0gcnREcmF3LkNlbnRlcigpOw0KKyAgICBydERyYXcubGVmdCA9IGNlbnRlci54IC0gYTsNCisgICAgcnREcmF3LnRvcCA9IGNlbnRlci55IC0gYjsNCisgICAgcnREcmF3LndpZHRoID0gYSArIGE7DQorICAgIHJ0RHJhdy5oZWlnaHQgPSBiICsgYjsNCisgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSA9IDAsIHN3ZWVwQW5nbGUgPSAzNjA7DQorICAgIEZYX0JPT0wgYlN0YXJ0ID0gYm94LkdldFN0YXJ0QW5nbGUoc3RhcnRBbmdsZSk7DQorICAgIEZYX0JPT0wgYkVuZCA9IGJveC5HZXRTd2VlcEFuZ2xlKHN3ZWVwQW5nbGUpOw0KKyAgICBpZiAoIWJTdGFydCAmJiAhYkVuZCkgew0KKyAgICAgICAgZmlsbFBhdGguQWRkRWxsaXBzZShydERyYXcpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHN0YXJ0QW5nbGUgPSAtc3RhcnRBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOw0KKyAgICBzd2VlcEFuZ2xlID0gLXN3ZWVwQW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsNCisgICAgZmlsbFBhdGguQWRkQXJjKHJ0RHJhdy5sZWZ0LCBydERyYXcudG9wLCBydERyYXcud2lkdGgsIHJ0RHJhdy5oZWlnaHQsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX0dldFBhdGgoQ1hGQV9Cb3ggYm94LCBjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBDRlhfUmVjdEYgcnRXaWRnZXQsIENGWF9QYXRoICZwYXRoLCBGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYlN0YXJ0LCBGWF9CT09MIGJDb3JuZXIpDQorew0KKyAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgOCk7DQorICAgIEZYX0JPT0wgYkludmVydGVkLCBiUm91bmQ7DQorICAgIEZYX0ZMT0FUIGZSYWRpdXMxLCBmUmFkaXVzMiwgc3gsIHN5LCB2eCwgdnksIG54LCBueSwgb2Zmc2V0WSwgb2Zmc2V0WCwgb2Zmc2V0RVgsIG9mZnNldEVZOw0KKyAgICBDRlhfUG9pbnRGIGNwU3RhcnQsIGNwLCBjcDEsIGNwMjsNCisgICAgQ0ZYX1JlY3RGIHJ0UmFkaXVzOw0KKyAgICBGWF9JTlQzMiBuID0gKG5JbmRleCAmIDEpID8gbkluZGV4IC0gMSA6IG5JbmRleDsNCisgICAgQ1hGQV9Db3JuZXIgY29ybmVyMSA9IChDWEZBX05vZGUqKXN0cm9rZXNbbl07DQorICAgIENYRkFfQ29ybmVyIGNvcm5lcjIgPSAoQ1hGQV9Ob2RlKilzdHJva2VzWyhuICsgMikgJSA4XTsNCisgICAgZlJhZGl1czEgPSBiQ29ybmVyID8gY29ybmVyMS5HZXRSYWRpdXMoKSA6IDA7DQorICAgIGZSYWRpdXMyID0gYkNvcm5lciA/IGNvcm5lcjIuR2V0UmFkaXVzKCkgOiAwOw0KKyAgICBiSW52ZXJ0ZWQgPSBjb3JuZXIxLklzSW52ZXJ0ZWQoKTsNCisgICAgb2Zmc2V0WSA9IDAuMGY7DQorICAgIG9mZnNldFggPSAwLjBmOw0KKyAgICBiUm91bmQgPSBjb3JuZXIxLkdldEpvaW5UeXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQ7DQorICAgIEZYX0ZMT0FUIGhhbGZBZnRlciA9IDAuMGY7DQorICAgIEZYX0ZMT0FUIGhhbGZCZWZvcmUgPSAwLjBmOw0KKyAgICBDWEZBX1N0cm9rZSBzdHJva2UgPSBzdHJva2VzW25JbmRleF07DQorICAgIGlmKHN0cm9rZS5Jc0Nvcm5lcigpKSB7DQorICAgICAgICBDWEZBX1N0cm9rZSBlZGdlQmVmb3JlID0gc3Ryb2tlc1sobkluZGV4ICsgMSAqIDggLSAxKSAlIDhdOw0KKyAgICAgICAgQ1hGQV9TdHJva2UgZWRnZUFmdGVyID0gc3Ryb2tlc1tuSW5kZXggKyAxXTsNCisgICAgICAgIGlmKCBzdHJva2UuSXNJbnZlcnRlZCgpKSB7DQorICAgICAgICAgICAgaWYoIXN0cm9rZS5TYW1lU3R5bGVzKGVkZ2VCZWZvcmUpKSB7DQorICAgICAgICAgICAgICAgIGhhbGZCZWZvcmUgPSBlZGdlQmVmb3JlLkdldFRoaWNrbmVzcygpIC8gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoIXN0cm9rZS5TYW1lU3R5bGVzKGVkZ2VBZnRlcikpIHsNCisgICAgICAgICAgICAgICAgaGFsZkFmdGVyID0gZWRnZUFmdGVyLkdldFRoaWNrbmVzcygpIC8gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX1N0cm9rZSBlZGdlQmVmb3JlID0gc3Ryb2tlc1sobkluZGV4ICsgOCAtIDIpICUgOF07DQorICAgICAgICBDWEZBX1N0cm9rZSBlZGdlQWZ0ZXIgPSBzdHJva2VzWyhuSW5kZXggKyAyKSAlIDhdOw0KKyAgICAgICAgaWYoIWJSb3VuZCAmJiAhYkludmVydGVkKSB7DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBoYWxmQmVmb3JlID0gZWRnZUJlZm9yZS5HZXRUaGlja25lc3MoKSAvIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaGFsZkFmdGVyID0gZWRnZUFmdGVyLkdldFRoaWNrbmVzcygpIC8gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgb2Zmc2V0RVggPSAwLjBmOw0KKyAgICBvZmZzZXRFWSA9IDAuMGY7DQorICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgIHN5ID0gRlhfUEkgLyAyOw0KKyAgICB9DQorICAgIHN3aXRjaCAobkluZGV4KSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KKyAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7DQorICAgICAgICAgICAgaWYgKG5JbmRleCA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gaGFsZkJlZm9yZTsNCisgICAgICAgICAgICAgICAgY3BTdGFydC55ID0gY3AxLnkgKyBmUmFkaXVzMSwgb2Zmc2V0WSA9ICAtIGhhbGZBZnRlcjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGZSYWRpdXMxIC0gaGFsZkJlZm9yZSwgY3BTdGFydC55ID0gY3AxLnksIG9mZnNldEVYID0gaGFsZkFmdGVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB2eCA9IDEsIHZ5ID0gMTsNCisgICAgICAgICAgICBueCA9IC0xLCBueSA9IDA7DQorICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHN4ID0gMSwgc3kgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KKyAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQorICAgICAgICAgICAgaWYgKG5JbmRleCA9PSAyKSB7DQorICAgICAgICAgICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gZlJhZGl1czEsIGNwU3RhcnQueSA9IGNwMS55IC0gaGFsZkJlZm9yZSwgb2Zmc2V0WCA9IGhhbGZBZnRlcjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCwgY3BTdGFydC55ID0gY3AxLnkgKyBmUmFkaXVzMSAtIGhhbGZCZWZvcmUsIG9mZnNldEVZID0gaGFsZkFmdGVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB2eCA9IC0xLCB2eSA9IDE7DQorICAgICAgICAgICAgbnggPSAwLCBueSA9IC0xOw0KKyAgICAgICAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSA6IEZYX1BJICogMyAvIDI7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgc3ggPSAwLCBzeSA9IDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQorICAgICAgICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOw0KKyAgICAgICAgICAgIGlmIChuSW5kZXggPT0gNCkgew0KKyAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGhhbGZCZWZvcmUgLCBjcFN0YXJ0LnkgPSBjcDEueSAtIGZSYWRpdXMxLCBvZmZzZXRZID0gaGFsZkFmdGVyOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gZlJhZGl1czEgKyBoYWxmQmVmb3JlLCBjcFN0YXJ0LnkgPSBjcDEueSwgb2Zmc2V0RVggPSAtaGFsZkFmdGVyIDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdnggPSAtMSwgdnkgPSAtMTsNCisgICAgICAgICAgICBueCA9IDEsIG55ID0gMDsNCisgICAgICAgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgc3ggPSAtMSwgc3kgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNjoNCisgICAgICAgIGNhc2UgNzoNCisgICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7DQorICAgICAgICAgICAgY3AyID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KKyAgICAgICAgICAgIGlmIChuSW5kZXggPT0gNikgew0KKyAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGZSYWRpdXMxLCBjcFN0YXJ0LnkgPSBjcDEueSArIGhhbGZCZWZvcmUsIG9mZnNldFggPSAtaGFsZkFmdGVyOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGNwU3RhcnQueCA9IGNwMS54LCBjcFN0YXJ0LnkgPSBjcDEueSAtIGZSYWRpdXMxICsgaGFsZkJlZm9yZSwgb2Zmc2V0RVkgPSAtaGFsZkFmdGVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB2eCA9IDEsIHZ5ID0gLTE7DQorICAgICAgICAgICAgbnggPSAwLCBueSA9IDE7DQorICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IDAgOiBGWF9QSSAvIDI7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgc3ggPSAwLCBzeSA9IC0xOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYlN0YXJ0KSB7DQorICAgICAgICBwYXRoLk1vdmVUbyhjcFN0YXJ0LngsIGNwU3RhcnQueSk7DQorICAgIH0NCisgICAgaWYgKG5JbmRleCAmIDEpIHsNCisgICAgICAgIHBhdGguTGluZVRvKGNwMi54ICsgZlJhZGl1czIgKiBueCArIG9mZnNldEVYLCBjcDIueSArIGZSYWRpdXMyICogbnkgKyBvZmZzZXRFWSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgaWYgKGZSYWRpdXMxIDwgMCkgew0KKyAgICAgICAgICAgIHN4IC09IEZYX1BJOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJJbnZlcnRlZCkgew0KKyAgICAgICAgICAgIHN5ICo9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcnRSYWRpdXMuU2V0KGNwMS54ICsgb2Zmc2V0WCAqIDIsIGNwMS55ICsgb2Zmc2V0WSAqIDIgLCBmUmFkaXVzMSAqIDIgKiB2eCAtIG9mZnNldFggKiAyLCBmUmFkaXVzMSAqIDIgKiB2eSAtIG9mZnNldFkgKiAyKTsNCisgICAgICAgIHJ0UmFkaXVzLk5vcm1hbGl6ZSgpOw0KKyAgICAgICAgaWYgKGJJbnZlcnRlZCkgew0KKyAgICAgICAgICAgIHJ0UmFkaXVzLk9mZnNldCgtZlJhZGl1czEgKiB2eCwgLWZSYWRpdXMxICogdnkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcGF0aC5BcmNUbyhydFJhZGl1cy5sZWZ0LCBydFJhZGl1cy50b3AsIHJ0UmFkaXVzLndpZHRoLCBydFJhZGl1cy5oZWlnaHQsIHN4LCBzeSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgICAgICAgY3AueCA9IGNwMS54ICsgZlJhZGl1czEgKiB2eCwgY3AueSA9IGNwMS55ICsgZlJhZGl1czEgKiB2eTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY3AgPSBjcDE7DQorICAgICAgICB9DQorICAgICAgICBwYXRoLkxpbmVUbyhjcC54LCBjcC55KTsNCisgICAgICAgIHBhdGguTGluZVRvKGNwMS54ICsgZlJhZGl1czEgKiBzeCArIG9mZnNldFgsIGNwMS55ICsgZlJhZGl1czEgKiBzeSArIG9mZnNldFkpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfR2V0RmlsbFBhdGgoQ1hGQV9Cb3ggYm94LCBjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBDRlhfUmVjdEYgcnRXaWRnZXQsIENGWF9QYXRoICZmaWxsUGF0aCwgRlhfV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgaWYgKGJveC5Jc0FyYygpIHx8IChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgIT0gMCkgew0KKyAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3guR2V0RWRnZSgwKTsNCisgICAgICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgICAgICAgaWYgKGZUaGlja25lc3MgPCAwKSB7DQorICAgICAgICAgICAgZlRoaWNrbmVzcyA9IDA7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmSGFsZiA9IGZUaGlja25lc3MgLyAyOw0KKyAgICAgICAgRlhfSU5UMzIgaUhhbmQgPSBib3guR2V0SGFuZCgpOw0KKyAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmSGFsZiwgZkhhbGYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBmaWxsUGF0aCwgZHdGbGFncyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiU2FtZVN0eWxlcyA9IFRSVUU7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSArKykgew0KKyAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQorICAgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KKyAgICAgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgICAgfQ0KKyAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgICAgICAgZm9yIChpID0gMjsgaSA8IDg7IGkgKz0gMikgew0KKyAgICAgICAgICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KKyAgICAgICAgICAgIGlmICghc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIsIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UgfCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIpKSB7DQorICAgICAgICAgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiU2FtZVN0eWxlcykgew0KKyAgICAgICAgICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgICAgICAgICAgIGlmIChzdHJva2UxLklzSW52ZXJ0ZWQoKSkgew0KKyAgICAgICAgICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoc3Ryb2tlMS5HZXRKb2luVHlwZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZSkgew0KKyAgICAgICAgICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkludmVydGVkLCBiUm91bmQ7DQorICAgIEZYX0ZMT0FUIGZSYWRpdXMxLCBmUmFkaXVzMiwgc3gsIHN5LCB2eCwgdnksIG54LCBueTsNCisgICAgQ0ZYX1BvaW50RiBjcCwgY3AxLCBjcDI7DQorICAgIENGWF9SZWN0RiBydFJhZGl1czsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDg7IGkgKz0gMikgew0KKyAgICAgICAgQ1hGQV9Db3JuZXIgY29ybmVyMSA9IChDWEZBX05vZGUqKXN0cm9rZXNbaV07DQorICAgICAgICBDWEZBX0Nvcm5lciBjb3JuZXIyID0gKENYRkFfTm9kZSopc3Ryb2tlc1soaSArIDIpICUgOF07DQorICAgICAgICBmUmFkaXVzMSA9IGNvcm5lcjEuR2V0UmFkaXVzKCk7DQorICAgICAgICBmUmFkaXVzMiA9IGNvcm5lcjIuR2V0UmFkaXVzKCk7DQorICAgICAgICBiSW52ZXJ0ZWQgPSBjb3JuZXIxLklzSW52ZXJ0ZWQoKTsNCisgICAgICAgIGJSb3VuZCA9IGNvcm5lcjEuR2V0Sm9pblR5cGUoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZDsNCisgICAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgICAgICBzeSA9IEZYX1BJIC8gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoaSkgew0KKyAgICAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KKyAgICAgICAgICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KKyAgICAgICAgICAgICAgICB2eCA9IDEsIHZ5ID0gMTsNCisgICAgICAgICAgICAgICAgbnggPSAtMSwgbnkgPSAwOw0KKyAgICAgICAgICAgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICAgICAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgc3ggPSAxLCBzeSA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KKyAgICAgICAgICAgICAgICBjcDIgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOw0KKyAgICAgICAgICAgICAgICB2eCA9IC0xLCB2eSA9IDE7DQorICAgICAgICAgICAgICAgIG54ID0gMCwgbnkgPSAtMTsNCisgICAgICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSA6IEZYX1BJICogMyAvIDI7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBzeCA9IDAsIHN5ID0gMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQorICAgICAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCisgICAgICAgICAgICAgICAgdnggPSAtMSwgdnkgPSAtMTsNCisgICAgICAgICAgICAgICAgbnggPSAxLCBueSA9IDA7DQorICAgICAgICAgICAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgICAgICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBzeCA9IC0xLCBzeSA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSA2Og0KKyAgICAgICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7DQorICAgICAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsNCisgICAgICAgICAgICAgICAgdnggPSAxLCB2eSA9IC0xOw0KKyAgICAgICAgICAgICAgICBueCA9IDAsIG55ID0gMTsNCisgICAgICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgc3ggPSAwLCBzeSA9IC0xOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgICAgICAgIGZpbGxQYXRoLk1vdmVUbyhjcDEueCwgY3AxLnkgKyBmUmFkaXVzMSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICAgICAgaWYgKGZSYWRpdXMxIDwgMCkgew0KKyAgICAgICAgICAgICAgICBzeCAtPSBGWF9QSTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGJJbnZlcnRlZCkgew0KKyAgICAgICAgICAgICAgICBzeSAqPSAtMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcnRSYWRpdXMuU2V0KGNwMS54LCBjcDEueSwgZlJhZGl1czEgKiAyICogdngsIGZSYWRpdXMxICogMiAqIHZ5KTsNCisgICAgICAgICAgICBydFJhZGl1cy5Ob3JtYWxpemUoKTsNCisgICAgICAgICAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgICAgICAgICAgIHJ0UmFkaXVzLk9mZnNldCgtZlJhZGl1czEgKiB2eCwgLWZSYWRpdXMxICogdnkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmaWxsUGF0aC5BcmNUbyhydFJhZGl1cy5sZWZ0LCBydFJhZGl1cy50b3AsIHJ0UmFkaXVzLndpZHRoLCBydFJhZGl1cy5oZWlnaHQsIHN4LCBzeSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChiSW52ZXJ0ZWQpIHsNCisgICAgICAgICAgICAgICAgY3AueCA9IGNwMS54ICsgZlJhZGl1czEgKiB2eCwgY3AueSA9IGNwMS55ICsgZlJhZGl1czEgKiB2eTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjcCA9IGNwMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmlsbFBhdGguTGluZVRvKGNwLngsIGNwLnkpOw0KKyAgICAgICAgICAgIGZpbGxQYXRoLkxpbmVUbyhjcDEueCArIGZSYWRpdXMxICogc3gsIGNwMS55ICsgZlJhZGl1czEgKiBzeSk7DQorICAgICAgICB9DQorICAgICAgICBmaWxsUGF0aC5MaW5lVG8oY3AyLnggKyBmUmFkaXVzMiAqIG54LCBjcDIueSArIGZSYWRpdXMyICogbnkpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9SYWRpYWwoQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1BhdGggJmZpbGxQYXRoLCBDRlhfUmVjdEYgcnRGaWxsLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KK3sNCisgICAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KKyAgICBjclN0YXJ0ID0gZmlsbC5HZXRDb2xvcigpOw0KKyAgICBGWF9JTlQzMiBpVHlwZSA9IGZpbGwuR2V0UmFkaWFsKGNyRW5kKTsNCisgICAgQ0ZYX1NoYWRpbmcgc2hhZGluZzsNCisgICAgaWYgKGlUeXBlICE9IFhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZSkgew0KKyAgICAgICAgRlhfQVJHQiB0ZW1wID0gY3JFbmQ7DQorICAgICAgICBjckVuZCA9IGNyU3RhcnQ7DQorICAgICAgICBjclN0YXJ0ID0gdGVtcDsNCisgICAgfQ0KKyAgICBzaGFkaW5nLkNyZWF0ZVJhZGlhbChydEZpbGwuQ2VudGVyKCksIHJ0RmlsbC5DZW50ZXIoKSwgMCwgRlhTWVNfc3FydChydEZpbGwuV2lkdGgoKSpydEZpbGwuV2lkdGgoKSArIHJ0RmlsbC5IZWlnaHQoKSpydEZpbGwuSGVpZ2h0KCkpIC8gMiwgVFJVRSwgVFJVRSwgY3JTdGFydCwgY3JFbmQpOw0KKyAgICBDRlhfQ29sb3IgY3IoJnNoYWRpbmcpOw0KKyAgICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX0ZpbGxfUGF0dGVybihDWEZBX0JveCBib3gsIENGWF9HcmFwaGljcyogcEdTLCBDRlhfUGF0aCAmZmlsbFBhdGgsIENGWF9SZWN0RiBydEZpbGwsIENGWF9NYXRyaXgqIHBNYXRyaXgpDQorew0KKyAgICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7DQorICAgIEZYX0FSR0IgY3JTdGFydCwgY3JFbmQ7DQorICAgIGNyU3RhcnQgPSBmaWxsLkdldENvbG9yKCk7DQorICAgIEZYX0lOVDMyIGlUeXBlID0gZmlsbC5HZXRQYXR0ZXJuKGNyRW5kKTsNCisgICAgRlhfSU5UMzIgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9Dcm9zczsNCisgICAgc3dpdGNoKGlUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzRGlhZ29uYWw6DQorICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9EaWFnb25hbENyb3NzOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnQ6DQorICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWw7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsUmlnaHQ6DQorICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9CYWNrd2FyZERpYWdvbmFsOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsOg0KKyAgICAgICAgICAgIGlIYXRjaCA9IEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVmVydGljYWw6DQorICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9WZXJ0aWNhbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ0ZYX1BhdHRlcm4gcGF0dGVybjsNCisgICAgcGF0dGVybi5DcmVhdGUoaUhhdGNoLCBjckVuZCwgY3JTdGFydCk7DQorICAgIENGWF9Db2xvciBjcigmcGF0dGVybik7DQorICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9MaW5lYXIoQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1BhdGggJmZpbGxQYXRoLCBDRlhfUmVjdEYgcnRGaWxsLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KK3sNCisgICAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KKyAgICBjclN0YXJ0ID0gZmlsbC5HZXRDb2xvcigpOw0KKyAgICBGWF9JTlQzMiBpVHlwZSA9IGZpbGwuR2V0TGluZWFyKGNyRW5kKTsNCisgICAgQ0ZYX1BvaW50RiBwdFN0YXJ0LCBwdEVuZDsNCisgICAgc3dpdGNoKGlUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQ6DQorICAgICAgICAgICAgcHRTdGFydC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KKyAgICAgICAgICAgIHB0RW5kLlNldChydEZpbGwucmlnaHQoKSwgcnRGaWxsLnRvcCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tOg0KKyAgICAgICAgICAgIHB0U3RhcnQuU2V0KHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsNCisgICAgICAgICAgICBwdEVuZC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC5ib3R0b20oKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvTGVmdDoNCisgICAgICAgICAgICBwdFN0YXJ0LlNldChydEZpbGwucmlnaHQoKSwgcnRGaWxsLnRvcCk7DQorICAgICAgICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9Ub3A6DQorICAgICAgICAgICAgcHRTdGFydC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC5ib3R0b20oKSk7DQorICAgICAgICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ0ZYX1NoYWRpbmcgc2hhZGluZzsNCisgICAgc2hhZGluZy5DcmVhdGVBeGlhbChwdFN0YXJ0LCBwdEVuZCwgRkFMU0UsIEZBTFNFLCBjclN0YXJ0LCBjckVuZCk7DQorICAgIENGWF9Db2xvciBjcigmc2hhZGluZyk7DQorICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbChDWEZBX0JveCBib3gsIGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkgJnN0cm9rZXMsIENGWF9HcmFwaGljcyogcEdTLCBjb25zdCBDRlhfUmVjdEYgJnJ0V2lkZ2V0LCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgICBpZiAoIWZpbGwuSXNFeGlzdEluWE1MKCkgfHwgZmlsbC5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9QYXRoIGZpbGxQYXRoOw0KKyAgICBmaWxsUGF0aC5DcmVhdGUoKTsNCisgICAgWEZBX0JPWF9HZXRGaWxsUGF0aChib3gsIHN0cm9rZXMsIHJ0V2lkZ2V0LCBmaWxsUGF0aCwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKTsNCisgICAgZmlsbFBhdGguQ2xvc2UoKTsNCisgICAgRlhfSU5UMzIgZVR5cGUgPSBmaWxsLkdldEZpbGxUeXBlKCk7DQorICAgIHN3aXRjaChlVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9SYWRpYWw6DQorICAgICAgICAgICAgWEZBX0JPWF9GaWxsX1JhZGlhbChib3gsIHBHUywgZmlsbFBhdGgsIHJ0V2lkZ2V0LCBwTWF0cml4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGF0dGVybjoNCisgICAgICAgICAgICBYRkFfQk9YX0ZpbGxfUGF0dGVybihib3gsIHBHUywgZmlsbFBhdGgsIHJ0V2lkZ2V0LCBwTWF0cml4KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZWFyOg0KKyAgICAgICAgICAgIFhGQV9CT1hfRmlsbF9MaW5lYXIoYm94LCBwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgcE1hdHJpeCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIEZYX0FSR0IgY3I7DQorICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9TdGlwcGxlKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpUmF0ZSA9IGZpbGwuR2V0U3RpcHBsZShjcik7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVJhdGUgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlSYXRlID0gMTAwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgYSA9IDA7DQorICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiByZ2I7DQorICAgICAgICAgICAgICAgICAgICBBcmdiRGVjb2RlKGNyLCBhLCByZ2IpOw0KKyAgICAgICAgICAgICAgICAgICAgY3IgPSBBcmdiRW5jb2RlKGlSYXRlICogYSAvIDEwMCwgcmdiKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNyID0gZmlsbC5HZXRDb2xvcigpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGWF9Db2xvciBmaWxsQ29sb3IoY3IpOw0KKyAgICAgICAgICAgICAgICBwR1MtPlNldEZpbGxDb2xvcigmZmlsbENvbG9yKTsNCisgICAgICAgICAgICAgICAgcEdTLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZVBhdGgoQ1hGQV9TdHJva2Ugc3Ryb2tlLCBDRlhfUGF0aCAqcFBhdGgsIENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KK3sNCisgICAgaWYgKCFzdHJva2UuSXNFeGlzdEluWE1MKCkgfHwgIXN0cm9rZS5Jc1Zpc2libGUoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBzdHJva2UuR2V0VGhpY2tuZXNzKCk7DQorICAgIGlmIChmVGhpY2tuZXNzIDwgMC4wMDFmKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBpZihzdHJva2UuSXNDb3JuZXIoKSAmJiBmVGhpY2tuZXNzID4gMiAqIHN0cm9rZS5HZXRSYWRpdXMoKSkgew0KKyAgICAgICAgZlRoaWNrbmVzcyA9IDIgKiBzdHJva2UuR2V0UmFkaXVzKCk7DQorICAgIH0NCisgICAgcEdTLT5TZXRMaW5lV2lkdGgoZlRoaWNrbmVzcywgVFJVRSk7DQorICAgIHBHUy0+U2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0KTsNCisgICAgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChwR1MsIHN0cm9rZS5HZXRTdHJva2VUeXBlKCksIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQpOw0KKyAgICBDRlhfQ29sb3IgZnhDb2xvcihzdHJva2UuR2V0Q29sb3IoKSk7DQorICAgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmZ4Q29sb3IpOw0KKyAgICBwR1MtPlN0cm9rZVBhdGgocFBhdGgsIHBNYXRyaXgpOw0KKyAgICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlQXJjKENYRkFfQm94IGJveCwgQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9SZWN0RiBydFdpZGdldCwgQ0ZYX01hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIENYRkFfRWRnZSBlZGdlID0gYm94LkdldEVkZ2UoMCk7DQorICAgIGlmICghZWRnZS5Jc0V4aXN0SW5YTUwoKSB8fCAhZWRnZS5Jc1Zpc2libGUoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlZpc2libGUgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICAgIEZYX0lOVDMyIGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQorICAgIGlmIChpM0RUeXBlKSB7DQorICAgICAgICBpZiAoYlZpc2libGUgJiYgZlRoaWNrbmVzcyA+PSAwLjAwMWYpIHsNCisgICAgICAgICAgICBkd0ZsYWdzIHw9IFhGQV9EUkFXQk9YX0xvd2VyZWQzRDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmSGFsZiA9IGVkZ2UuR2V0VGhpY2tuZXNzKCkgLyAyOw0KKyAgICBpZiAoZkhhbGYgPCAwKSB7DQorICAgICAgICBmSGFsZiA9IDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUhhbmQgPSBib3guR2V0SGFuZCgpOw0KKyAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KKyAgICAgICAgcnRXaWRnZXQuSW5mbGF0ZShmSGFsZiwgZkhhbGYpOw0KKyAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgIH0NCisgICAgaWYgKChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgPT0gMCB8fCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0xvd2VyZWQzRCkgPT0gMCkgew0KKyAgICAgICAgaWYgKGZIYWxmIDwgMC4wMDFmKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1BhdGggYXJjUGF0aDsNCisgICAgICAgIGFyY1BhdGguQ3JlYXRlKCk7DQorICAgICAgICBYRkFfQk9YX0dldFBhdGhfQXJjKGJveCwgcnRXaWRnZXQsIGFyY1BhdGgsIGR3RmxhZ3MpOw0KKyAgICAgICAgWEZBX0JPWF9TdHJva2VQYXRoKGVkZ2UsICZhcmNQYXRoLCBwR1MsIHBNYXRyaXgpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgcEdTLT5TZXRMaW5lV2lkdGgoZkhhbGYpOw0KKyAgICBGWF9GTE9BVCBhLCBiOw0KKyAgICBhID0gcnRXaWRnZXQud2lkdGggLyAyLjBmOw0KKyAgICBiID0gcnRXaWRnZXQuaGVpZ2h0IC8gMi4wZjsNCisgICAgaWYgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSB7DQorICAgICAgICBhID0gYiA9IEZYX01JTihhLCBiKTsNCisgICAgfQ0KKyAgICBDRlhfUG9pbnRGIGNlbnRlciA9IHJ0V2lkZ2V0LkNlbnRlcigpOw0KKyAgICBydFdpZGdldC5sZWZ0ID0gY2VudGVyLnggLSBhOw0KKyAgICBydFdpZGdldC50b3AgPSBjZW50ZXIueSAtIGI7DQorICAgIHJ0V2lkZ2V0LndpZHRoID0gYSArIGE7DQorICAgIHJ0V2lkZ2V0LmhlaWdodCA9IGIgKyBiOw0KKyAgICBGWF9GTE9BVCBzdGFydEFuZ2xlID0gMCwgc3dlZXBBbmdsZSA9IDM2MDsNCisgICAgc3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsNCisgICAgc3dlZXBBbmdsZSA9IC1zd2VlcEFuZ2xlICogRlhfUEkgLyAxODAuMGY7DQorICAgIENGWF9QYXRoIGFyY1BhdGg7DQorICAgIGFyY1BhdGguQ3JlYXRlKCk7DQorICAgIGFyY1BhdGguQWRkQXJjKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCwgMy4wZiAqIEZYX1BJIC8gNC4wZiwgRlhfUEkpOw0KKyAgICBDRlhfQ29sb3IgY3IoMHhGRjgwODA4MCk7DQorICAgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgICAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCBwTWF0cml4KTsNCisgICAgYXJjUGF0aC5DbGVhcigpOw0KKyAgICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQsIC0xLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQorICAgIGNyLlNldCgweEZGRkZGRkZGKTsNCisgICAgcEdTLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KKyAgICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KKyAgICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgIGFyY1BhdGguQ2xlYXIoKTsNCisgICAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LCAzLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQorICAgIGNyLlNldCgweEZGNDA0MDQwKTsNCisgICAgcEdTLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KKyAgICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KKyAgICBhcmNQYXRoLkNsZWFyKCk7DQorICAgIGFyY1BhdGguQWRkQXJjKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCwgLTEuMGYgKiBGWF9QSSAvIDQuMGYsIEZYX1BJKTsNCisgICAgY3IuU2V0KDB4RkZDMEMwQzApOw0KKyAgICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICAgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7DQorICAgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RyYXczRFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpYywgY29uc3QgQ0ZYX1JlY3RGJiBydCwgRlhfRkxPQVQgZkxpbmVXaWR0aCwgQ0ZYX01hdHJpeCogcE1hdHJpeCwgRlhfQVJHQiBhcmdiVG9wTGVmdCwgRlhfQVJHQiBhcmdiQm90dG9tUmlnaHQpDQorew0KKyAgICBDRlhfQ29sb3IgY3JMVChhcmdiVG9wTGVmdCk7DQorICAgIHBHcmFwaGljLT5TZXRGaWxsQ29sb3IoJmNyTFQpOw0KKyAgICBGWF9GTE9BVCBmQm90dG9tID0gcnQuYm90dG9tKCk7DQorICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJ0LnJpZ2h0KCk7DQorICAgIENGWF9QYXRoIHBhdGhMVDsNCisgICAgcGF0aExULkNyZWF0ZSgpOw0KKyAgICBwYXRoTFQuTW92ZVRvKHJ0LmxlZnQsIGZCb3R0b20pOw0KKyAgICBwYXRoTFQuTGluZVRvKHJ0LmxlZnQsIHJ0LnRvcCk7DQorICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0LCBydC50b3ApOw0KKyAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZMaW5lV2lkdGgsIHJ0LnRvcCArIGZMaW5lV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKHJ0LmxlZnQgKyBmTGluZVdpZHRoLCBydC50b3AgKyBmTGluZVdpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhydC5sZWZ0ICsgZkxpbmVXaWR0aCwgZkJvdHRvbSAtIGZMaW5lV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKHJ0LmxlZnQsIGZCb3R0b20pOw0KKyAgICBwR3JhcGhpYy0+RmlsbFBhdGgoJnBhdGhMVCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBDRlhfQ29sb3IgY3JSQihhcmdiQm90dG9tUmlnaHQpOw0KKyAgICBwR3JhcGhpYy0+U2V0RmlsbENvbG9yKCZjclJCKTsNCisgICAgQ0ZYX1BhdGggcGF0aFJCOw0KKyAgICBwYXRoUkIuQ3JlYXRlKCk7DQorICAgIHBhdGhSQi5Nb3ZlVG8oZlJpZ2h0LCBydC50b3ApOw0KKyAgICBwYXRoUkIuTGluZVRvKGZSaWdodCwgZkJvdHRvbSk7DQorICAgIHBhdGhSQi5MaW5lVG8ocnQubGVmdCwgZkJvdHRvbSk7DQorICAgIHBhdGhSQi5MaW5lVG8ocnQubGVmdCArIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmTGluZVdpZHRoLCBmQm90dG9tIC0gZkxpbmVXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0LCBydC50b3ApOw0KKyAgICBwR3JhcGhpYy0+RmlsbFBhdGgoJnBhdGhSQiwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfTG93ZXJlZChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1JlY3RGIHJ0LCBGWF9GTE9BVCBmVGhpY2tuZXNzLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KK3sNCisgICAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOw0KKyAgICBDRlhfUmVjdEYgcnRJbm5lcihydCk7DQorICAgIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgICAgQ0ZYX0NvbG9yIGNyKDB4RkYwMDAwMDApOw0KKyAgICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AsIHJ0LndpZHRoLCBydC5oZWlnaHQpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQorICAgIHBHUy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIHBNYXRyaXgpOw0KKyAgICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkY4MDgwODAsIDB4RkZDMEMwQzApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfUmFpc2VkKENGWF9HcmFwaGljcyogcEdTLCBDRlhfUmVjdEYgcnQsIEZYX0ZMT0FUIGZUaGlja25lc3MsIENGWF9NYXRyaXgqIHBNYXRyaXgpDQorew0KKyAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7DQorICAgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgICAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQorICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsIHJ0SW5uZXIuaGVpZ2h0KTsNCisgICAgcEdTLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICAgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRkZGRkZGRiwgMHhGRjgwODA4MCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FdGNoZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9SZWN0RiBydCwgRlhfRkxPQVQgZlRoaWNrbmVzcywgQ0ZYX01hdHJpeCogcE1hdHJpeCkNCit7DQorICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsNCisgICAgWEZBX0RyYXczRFJlY3QocEdTLCBydCwgZlRoaWNrbmVzcywgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRkZGRkZGRik7DQorICAgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgICAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkZGRkZGRkYsIDB4RkY4MDgwODApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfRW1ib3NzZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9SZWN0RiBydCwgRlhfRkxPQVQgZlRoaWNrbmVzcywgQ0ZYX01hdHJpeCogcE1hdHJpeCkNCit7DQorICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsNCisgICAgWEZBX0RyYXczRFJlY3QocEdTLCBydCwgZlRoaWNrbmVzcywgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRjAwMDAwMCk7DQorICAgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgICAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkYwMDAwMDAsIDB4RkY4MDgwODApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV9SZWN0KENYRkFfQm94IGJveCwgY29uc3QgQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcywgQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9SZWN0RiBydFdpZGdldCwgQ0ZYX01hdHJpeCogcE1hdHJpeCkNCit7DQorICAgIEZYX0JPT0wgYlZpc2libGUgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICAgIEZYX0lOVDMyIGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQorICAgIGlmIChpM0RUeXBlKSB7DQorICAgICAgICBpZiAoIWJWaXNpYmxlIHx8IGZUaGlja25lc3MgPCAwLjAwMWYpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKGkzRFR5cGUpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xvd2VyZWQ6DQorICAgICAgICAgICAgICAgIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9Mb3dlcmVkKHBHUywgcnRXaWRnZXQsIGZUaGlja25lc3MsIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZDoNCisgICAgICAgICAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X1JhaXNlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9FdGNoZWQ6DQorICAgICAgICAgICAgICAgIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FdGNoZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWQ6DQorICAgICAgICAgICAgICAgIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FbWJvc3NlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiQ2xvc2UgPSBGQUxTRTsNCisgICAgRlhfQk9PTCBiU2FtZVN0eWxlcyA9IFRSVUU7DQorICAgIEZYX0lOVDMyIGk7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSArKykgew0KKyAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQorICAgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KKyAgICAgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgICAgfQ0KKyAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgICAgICAgYkNsb3NlID0gVFJVRTsNCisgICAgICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsNCisgICAgICAgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsNCisgICAgICAgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgew0KKyAgICAgICAgICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgICAgICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgICAgICAgICAgICBpZiAoc3Ryb2tlMS5Jc0ludmVydGVkKCkpIHsNCisgICAgICAgICAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHN0cm9rZTEuR2V0Sm9pblR5cGUoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmUpIHsNCisgICAgICAgICAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiU3RhcnQgPSBUUlVFOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArKykgew0KKyAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbaV07DQorICAgICAgICBpZiAoKGkgJSAxKSA9PSAwICYmIHN0cm9rZTEuR2V0UmFkaXVzKCkgPCAwKSB7DQorICAgICAgICAgICAgRlhfQk9PTCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsNCisgICAgICAgICAgICBpZiAoIWJFbXB0eSkgew0KKyAgICAgICAgICAgICAgICBYRkFfQk9YX1N0cm9rZVBhdGgoc3Ryb2tlMSwgJnBhdGgsIHBHUywgcE1hdHJpeCk7DQorICAgICAgICAgICAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYlN0YXJ0ID0gVFJVRTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9CT1hfR2V0UGF0aChib3gsIHN0cm9rZXMsIHJ0V2lkZ2V0LCBwYXRoLCBpLCBiU3RhcnQsICFiU2FtZVN0eWxlcyk7DQorICAgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1soaSArIDEpICUgOF07DQorICAgICAgICBiU3RhcnQgPSAhc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIpOw0KKyAgICAgICAgaWYgKGJTdGFydCkgew0KKyAgICAgICAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2UxLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsNCisgICAgICAgICAgICBwYXRoLkNsZWFyKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsNCisgICAgaWYgKCFiRW1wdHkpIHsNCisgICAgICAgIGlmKGJDbG9zZSkgew0KKyAgICAgICAgICAgIHBhdGguQ2xvc2UoKTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2VzWzddLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsNCisgICAgfQ0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZShDWEZBX0JveCBib3gsIGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkgJnN0cm9rZXMsIENGWF9HcmFwaGljcyogcEdTLCBDRlhfUmVjdEYgcnRXaWRnZXQsIENGWF9NYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3RmxhZ3MpDQorew0KKyAgICBpZiAoYm94LklzQXJjKCkgfHwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKSB7DQorICAgICAgICBYRkFfQk9YX1N0cm9rZUFyYyhib3gsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgsIGR3RmxhZ3MpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlZpc2libGUgPSBGQUxTRTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IDQ7IGogKyspIHsNCisgICAgICAgIGJWaXNpYmxlIHw9IHN0cm9rZXNbaiAqIDIgKyAxXS5Jc1Zpc2libGUoKTsNCisgICAgICAgIGlmIChiVmlzaWJsZSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYlZpc2libGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAxOyBpIDwgODsgaSArPSAyKSB7DQorICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IChDWEZBX05vZGUqKXN0cm9rZXNbaV07DQorICAgICAgICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gZWRnZS5HZXRUaGlja25lc3MoKTsNCisgICAgICAgIGlmIChmVGhpY2tuZXNzIDwgMCkgew0KKyAgICAgICAgICAgIGZUaGlja25lc3MgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZkhhbGYgPSBmVGhpY2tuZXNzIC8gMjsNCisgICAgICAgIEZYX0lOVDMyIGlIYW5kID0gYm94LkdldEhhbmQoKTsNCisgICAgICAgIHN3aXRjaCAoaSkgew0KKyAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCAtPSBmSGFsZjsNCisgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCArPSBmSGFsZjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICs9IGZIYWxmOw0KKyAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0IC09IGZIYWxmOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoICs9IGZIYWxmOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICBydFdpZGdldC53aWR0aCAtPSBmSGFsZjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDU6DQorICAgICAgICAgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQorICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQgKz0gZkhhbGY7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCAtPSBmSGFsZjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDc6DQorICAgICAgICAgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQorICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5sZWZ0IC09IGZIYWxmOw0KKyAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQud2lkdGggKz0gZkhhbGY7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LmxlZnQgKz0gZkhhbGY7DQorICAgICAgICAgICAgICAgICAgICBydFdpZGdldC53aWR0aCAtPSBmSGFsZjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBYRkFfQk9YX1N0cm9rZV9SZWN0KGJveCwgc3Ryb2tlcywgcEdTLCBydFdpZGdldCwgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgWEZBX0RyYXdCb3goQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX1JlY3RGICZydFdpZGdldCwgQ0ZYX01hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIGlmICghYm94IHx8IGJveC5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpVHlwZSA9IGJveC5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChpVHlwZSAhPSBYRkFfRUxFTUVOVF9BcmMgJiYgaVR5cGUgIT0gWEZBX0VMRU1FTlRfQm9yZGVyICYmIGlUeXBlICE9IFhGQV9FTEVNRU5UX1JlY3RhbmdsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfU3Ryb2tlQXJyYXkgc3Ryb2tlczsNCisgICAgaWYgKCEoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICYmIGlUeXBlICE9IFhGQV9FTEVNRU5UX0FyYykgew0KKyAgICAgICAgYm94LkdldFN0cm9rZXMoc3Ryb2tlcyk7DQorICAgIH0NCisgICAgWEZBX0JPWF9GaWxsKGJveCwgc3Ryb2tlcywgcEdTLCBydFdpZGdldCwgcE1hdHJpeCwgZHdGbGFncyk7DQorICAgIFhGQV9CT1hfU3Ryb2tlKGJveCwgc3Ryb2tlcywgcEdTLCBydFdpZGdldCwgcE1hdHJpeCwgZHdGbGFncyk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhYzM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5oCkBAIC0wLDAgKzEsMjAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9XSURHRVRfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfV0lER0VUX0lNUF9IDQorY2xhc3MgQ1hGQV9GRlBhZ2VWaWV3Ow0KK2NsYXNzIENYRkFfRkZEb2NWaWV3Ow0KK2NsYXNzIENYRkFfRkZEb2M7DQorY2xhc3MgQ1hGQV9GRkFwcDsNCitjbGFzcyBDWEZBX0xheW91dEl0ZW07DQorI2RlZmluZSBYRkFfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSB7IGlmICghKGFyZykpIGdvdG8gcG9zOyB9DQoraW5saW5lIEZYX0ZMT0FUIFhGQV9Vbml0UHgyUHQoRlhfRkxPQVQgZlB4LCBGWF9GTE9BVCBmRHBpKQ0KK3sNCisgICAgcmV0dXJuIGZQeCAqIDcyLjBmIC8gZkRwaTsNCit9DQorI2RlZmluZSBYRkFfRkxPQVRfUEVSQ0lTSU9OIDAuMDAxZg0KK2VudW0gWEZBX1dJREdFVElURU0gew0KKyAgICBYRkFfV0lER0VUSVRFTV9QYXJlbnQsDQorICAgIFhGQV9XSURHRVRJVEVNX0ZpcnN0Q2hpbGQsDQorICAgIFhGQV9XSURHRVRJVEVNX05leHRTaWJsaW5nLA0KKyAgICBYRkFfV0lER0VUSVRFTV9QcmV2U2libGluZywNCit9Ow0KK2NsYXNzIENYRkFfQ2FsY0RhdGEgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfQ2FsY0RhdGEoKSA6IG1faVJlZkNvdW50KDApIHt9DQorICAgIH5DWEZBX0NhbGNEYXRhKCkNCisgICAgew0KKyAgICAgICAgbV9HbG9iYWxzLlJlbW92ZUFsbCgpOw0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheQkJCQltX0dsb2JhbHM7DQorICAgIEZYX0lOVDMyCQkJCQltX2lSZWZDb3VudDsNCit9Ow0KK2NsYXNzIENYRkFfRkZXaWRnZXQgOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhLCBwdWJsaWMgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGV2lkZ2V0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZGV2lkZ2V0KCk7DQorICAgIElYRkFfUGFnZVZpZXcqCUdldFBhZ2VWaWV3KCk7DQorICAgIHZvaWQJCQlTZXRQYWdlVmlldyhJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOw0KKyAgICB2b2lkCQkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJ0V2lkZ2V0KTsNCisgICAgQ0ZYX1JlY3RGCQlSZUNhY2hlV2lkZ2V0UmVjdCgpOw0KKyAgICBGWF9EV09SRAkJR2V0U3RhdHVzKCk7DQorICAgIHZvaWQJCQlNb2RpZnlTdGF0dXMoRlhfRFdPUkQgZHdBZGRlZCwgRlhfRFdPUkQgZHdSZW1vdmVkKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KKyAgICBDWEZBX1dpZGdldEFjYyoJR2V0RGF0YUFjYygpOw0KKyAgICBGWF9CT09MCQkJR2V0VG9vbFRpcChDRlhfV2lkZVN0cmluZyAmd3NUb29sVGlwKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBGWF9JTlQzMiBpUm90YXRlID0gMCk7DQorDQorICAgIHZpcnR1YWwJRlhfQk9PTAkJCUlzTG9hZGVkKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRXaWRnZXQoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJVW5sb2FkV2lkZ2V0KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxheW91dFdpZGdldCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlVcGRhdGVGV0xEYXRhKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZUVudGVyKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZUV4aXQoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLCBGWF9TSE9SVCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorDQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25DaGFyKEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncyk7DQorICAgIHZpcnR1YWwJRlhfRFdPUkQJT25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5VbmRvKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUmVkbygpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ29weSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkN1dCgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblBhc3RlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuRGVsZXRlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENhbkN1dCgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuRGVTZWxlY3QoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQ2FuQ29weSgpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VsZWN0QWxsKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVTZWxlY3QoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQlSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsIEZYX0JTVFIgYnNSZXBsYWNlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9GRkRvY1ZpZXcqCQlHZXREb2NWaWV3KCk7DQorICAgIHZvaWQJCQkJU2V0RG9jVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpDQorICAgIHsNCisgICAgICAgIG1fcERvY1ZpZXcgPSBwRG9jVmlldzsNCisgICAgfQ0KKyAgICBDWEZBX0ZGRG9jKgkJCUdldERvYygpOw0KKyAgICBDWEZBX0ZGQXBwKgkJCUdldEFwcCgpOw0KKyAgICBJWEZBX0FwcFByb3ZpZGVyKglHZXRBcHBQcm92aWRlcigpOw0KKyAgICB2b2lkCQkJCUludmFsaWRhdGVXaWRnZXQoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCA9IE5VTEwpOw0KKyAgICB2b2lkCQkJCUFkZEludmFsaWRhdGVSZWN0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QgPSBOVUxMKTsNCisgICAgRlhfQk9PTAkJCQlHZXRDYXB0aW9uVGV4dChDRlhfV2lkZVN0cmluZyAmd3NDYXApOw0KKyAgICBGWF9CT09MCQkJCUlzRm9jdXNlZCgpOw0KKyAgICBDWEZBX0xheW91dEl0ZW0qCUdldExheW91dEl0ZW0oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgICB9DQorICAgIHZvaWQJCQkJUm90YXRlMk5vcm1hbChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQorICAgIHZvaWQJCQkJR2V0Um90YXRlTWF0cml4KENGWF9NYXRyaXggJm10KTsNCisgICAgRlhfQk9PTAkJCQlJc0xheW91dFJlY3RFbXB0eSgpOw0KKyAgICBDWEZBX0ZGV2lkZ2V0KgkJR2V0UGFyZW50KCk7DQorICAgIEZYX0JPT0wJCQkJSXNBbmNlc3Rvck9mKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOw0KKw0KK3Byb3RlY3RlZDoNCisgICAgdmlydHVhbAlGWF9CT09MCVB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZvaWQJRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHUywgQ1hGQV9Cb3ggYm94LCBjb25zdCBDRlhfUmVjdEYmIHJ0Qm9yZGVyLCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0ZsYWdzID0gMCk7DQorICAgIHZvaWQJR2V0TWluTWF4V2lkdGgoRlhfRkxPQVQgZk1pbldpZHRoLCBGWF9GTE9BVCBmTWF4V2lkdGgpOw0KKyAgICB2b2lkCUdldE1pbk1heEhlaWdodChGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0KTsNCisgICAgdm9pZAlHZXRSZWN0V2l0aG91dFJvdGF0ZShDRlhfUmVjdEYgJnJ0V2lkZ2V0KTsNCisgICAgRlhfQk9PTCBJc01hdGNoVmlzaWJsZVN0YXR1cyhGWF9EV09SRCBkd1N0YXR1cyk7DQorDQorICAgIHZvaWQJCUV2ZW50S2lsbEZvY3VzKCk7DQorICAgIEZYX0JPT0wJCUlzQnV0dG9uRG93bigpOw0KKyAgICB2b2lkCQlTZXRCdXR0b25Eb3duKEZYX0JPT0wgYlNldCk7DQorICAgIENYRkFfRkZEb2NWaWV3KgkJbV9wRG9jVmlldzsNCisgICAgQ1hGQV9GRlBhZ2VWaWV3KgltX3BQYWdlVmlldzsNCisgICAgQ1hGQV9XaWRnZXRBY2MqCQltX3BEYXRhQWNjOw0KKyAgICBDRlhfUmVjdEYJCQltX3J0V2lkZ2V0Ow0KK307DQorRlhfSU5UMzIJCVhGQV9TdHJva2VUeXBlU2V0TGluZURhc2goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIEZYX0lOVDMyIGlTdHJva2VUeXBlLCBGWF9JTlQzMiBpQ2FwVHlwZSk7DQorQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIFhGQV9MaW5lQ2FwVG9GWEdFKEZYX0lOVDMyIGlMaW5lQ2FwKTsNCit2b2lkCQkJWEZBX0RyYXdJbWFnZShDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX1JlY3RGICZydEltYWdlLCBDRlhfTWF0cml4KiBwTWF0cml4LCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgRlhfSU5UMzIgaUFzcGVjdCwgRlhfSU5UMzIgaUltYWdlWERwaSwgRlhfSU5UMzIgaUltYWdlWURwaSwgRlhfSU5UMzIgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQsIEZYX0lOVDMyIGlWZXJ0QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3ApOw0KK0NGWF9ESUJpdG1hcCoJWEZBX0xvYWRJbWFnZURhdGEoQ1hGQV9GRkRvYyAqcERvYywgQ1hGQV9JbWFnZSAqcEltYWdlLCBGWF9CT09MICZiTmFtZUltYWdlLCBGWF9JTlQzMiAmaUltYWdlWERwaSwgRlhfSU5UMzIgJmlJbWFnZVlEcGkpOw0KK0NGWF9ESUJpdG1hcCoJWEZBX0xvYWRJbWFnZUZyb21CdWZmZXIoSUZYX0ZpbGVSZWFkKiBwSW1hZ2VGaWxlUmVhZCwgRlhDT0RFQ19JTUFHRV9UWVBFIHR5cGUsIEZYX0lOVDMyICZpSW1hZ2VYRHBpLCBGWF9JTlQzMiAmaUltYWdlWURwaSk7DQorRlhDT0RFQ19JTUFHRV9UWVBFIFhGQV9HZXRJbWFnZVR5cGUoRlhfV1NUUiB3c1R5cGUpOw0KK0ZYX0xQU1RSCQlYRkFfQmFzZTY0RW5jb2RlKEZYX0xQQ0JZVEUgYnVmLCBGWF9JTlQzMiBidWZfbGVuKTsNCit2b2lkCQkJWEZBX1JlY3RXaWR0aG91dE1hcmdpbihDRlhfUmVjdEYgJnJ0LCBjb25zdCBDWEZBX01hcmdpbiAmbWcsIEZYX0JPT0wgYlVJID0gRkFMU0UpOw0KK0ZYX0ZMT0FUCQlYRkFfR2V0RWRnZVRoaWNrbmVzcyhjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBGWF9CT09MIGIzRFN0eWxlLCBGWF9JTlQzMiBuSW5kZXgpOw0KK0NYRkFfRkZXaWRnZXQqCVhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKTsNCitGWF9CT09MCQkJWEZBX0lzQ3JlYXRlV2lkZ2V0KFhGQV9FTEVNRU5UIGlUeXBlKTsNCisjZGVmaW5lIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQJMQ0KKyNkZWZpbmUgWEZBX0RSQVdCT1hfTG93ZXJlZDNECTINCit2b2lkIFhGQV9EcmF3Qm94KENYRkFfQm94IGJveCwgQ0ZYX0dyYXBoaWNzKiBwR1MsIGNvbnN0IENGWF9SZWN0RiAmcnRXaWRnZXQsIENGWF9NYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjlhZDlmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcApAQCAtMCwwICsxLDE3MTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmY2hvaWNlbGlzdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaGVja2J1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRhY2MuaCINCisjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCitzdGF0aWMgdm9pZCBYRkFfRkZEZWxldGVDYWxjRGF0YShGWF9MUFZPSUQgcERhdGEpDQorew0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoKENYRkFfQ2FsY0RhdGEqKXBEYXRhKTsNCisgICAgfQ0KK30NCitzdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBnc19YRkFEZWxldGVDYWxjRGF0YSA9IHtYRkFfRkZEZWxldGVDYWxjRGF0YSwgTlVMTH07DQorY2xhc3MgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1dpZGdldExheW91dERhdGEoKQ0KKyAgICAgICAgOiBtX2ZXaWRnZXRIZWlnaHQoLTEpDQorICAgIHsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIH5DWEZBX1dpZGdldExheW91dERhdGEoKSB7fQ0KKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUCQkJbV9mV2lkZ2V0SGVpZ2h0Ow0KK307DQorY2xhc3MgQ1hGQV9UZXh0TGF5b3V0RGF0YSA6IHB1YmxpYyBDWEZBX1dpZGdldExheW91dERhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX1RleHRMYXlvdXREYXRhKCkNCisgICAgICAgIDogbV9wVGV4dExheW91dChOVUxMKQ0KKyAgICAgICAgLCBtX3BUZXh0UHJvdmlkZXIoTlVMTCkNCisgICAgew0KKyAgICB9DQorICAgIH5DWEZBX1RleHRMYXlvdXREYXRhKCkNCisgICAgew0KKyAgICAgICAgaWYgKG1fcFRleHRMYXlvdXQpIHsNCisgICAgICAgICAgICBkZWxldGUgbV9wVGV4dExheW91dDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFRleHRMYXlvdXQgPSBOVUxMOw0KKyAgICAgICAgaWYgKG1fcFRleHRQcm92aWRlcikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BUZXh0UHJvdmlkZXI7DQorICAgICAgICB9DQorICAgICAgICBtX3BUZXh0UHJvdmlkZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JPT0wgTG9hZFRleHQoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpDQorICAgIHsNCisgICAgICAgIGlmIChtX3BUZXh0TGF5b3V0KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBtX3BUZXh0UHJvdmlkZXIgPSBGWF9ORVcgQ1hGQV9UZXh0UHJvdmlkZXIocEFjYywgWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCk7DQorICAgICAgICBtX3BUZXh0TGF5b3V0ID0gRlhfTkVXIENYRkFfVGV4dExheW91dChtX3BUZXh0UHJvdmlkZXIpOw0KKyAgICAgICAgcmV0dXJuIG1fcFRleHRMYXlvdXQgIT0gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX1RleHRMYXlvdXQqCW1fcFRleHRMYXlvdXQ7DQorICAgIENYRkFfVGV4dFByb3ZpZGVyCSptX3BUZXh0UHJvdmlkZXI7DQorfTsNCitjbGFzcyBDWEZBX0ltYWdlTGF5b3V0RGF0YSA6IHB1YmxpYyBDWEZBX1dpZGdldExheW91dERhdGENCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ltYWdlTGF5b3V0RGF0YSgpDQorICAgICAgICA6IG1fcERJQml0bWFwKE5VTEwpDQorICAgICAgICAsIG1fYk5hbWVkSW1hZ2UoRkFMU0UpDQorICAgICAgICAsIG1faUltYWdlWERwaSgwKQ0KKyAgICAgICAgLCBtX2lJbWFnZVlEcGkoMCkNCisgICAgew0KKyAgICB9DQorDQorICAgIH5DWEZBX0ltYWdlTGF5b3V0RGF0YSgpDQorICAgIHsNCisgICAgICAgIGlmKG1fcERJQml0bWFwICYmICFtX2JOYW1lZEltYWdlKSB7DQorICAgICAgICAgICAgZGVsZXRlIG1fcERJQml0bWFwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgICB9DQorDQorICAgIEZYX0JPT0wgTG9hZEltYWdlRGF0YShDWEZBX1dpZGdldEFjYyogcEFjYykNCisgICAgew0KKyAgICAgICAgaWYobV9wRElCaXRtYXApIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfVmFsdWUgdmFsdWUgPSBwQWNjLT5HZXRGb3JtVmFsdWUoKTsNCisgICAgICAgIGlmICghdmFsdWUpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgIGlmICghaW1hZ2VPYmopIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0ZGRG9jICpwRkZEb2MgPSBwQWNjLT5HZXREb2MoKTsNCisgICAgICAgIHBBY2MtPlNldEltYWdlSW1hZ2UoWEZBX0xvYWRJbWFnZURhdGEocEZGRG9jLCAmaW1hZ2VPYmosIG1fYk5hbWVkSW1hZ2UsIG1faUltYWdlWERwaSwgbV9pSW1hZ2VZRHBpKSk7DQorICAgICAgICByZXR1cm4gbV9wRElCaXRtYXAgIT0gTlVMTDsNCisgICAgfQ0KKw0KKyAgICBDRlhfRElCaXRtYXAqCQkJbV9wRElCaXRtYXA7DQorICAgIEZYX0JPT0wJCQkJCW1fYk5hbWVkSW1hZ2U7DQorICAgIEZYX0lOVDMyCQkJCW1faUltYWdlWERwaTsNCisgICAgRlhfSU5UMzIJCQkJbV9pSW1hZ2VZRHBpOw0KK307DQorY2xhc3MgQ1hGQV9GaWVsZExheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GaWVsZExheW91dERhdGEoKQ0KKyAgICAgICAgOiBtX3BDYXBUZXh0TGF5b3V0KE5VTEwpDQorICAgICAgICAsIG1fcENhcFRleHRQcm92aWRlcihOVUxMKQ0KKyAgICAgICAgLCBtX3BUZXh0T3V0KE5VTEwpDQorICAgICAgICAsIG1fcEZpZWxkU3BsaXRBcnJheShOVUxMKQ0KKyAgICB7DQorICAgIH0NCisgICAgfkNYRkFfRmllbGRMYXlvdXREYXRhKCkNCisgICAgew0KKyAgICAgICAgaWYgKG1fcENhcFRleHRMYXlvdXQpIHsNCisgICAgICAgICAgICBkZWxldGUgbV9wQ2FwVGV4dExheW91dDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcENhcFRleHRMYXlvdXQgPSBOVUxMOw0KKyAgICAgICAgaWYgKG1fcENhcFRleHRQcm92aWRlcikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BDYXBUZXh0UHJvdmlkZXI7DQorICAgICAgICB9DQorICAgICAgICBtX3BDYXBUZXh0UHJvdmlkZXIgPSBOVUxMOw0KKyAgICAgICAgaWYgKG1fcFRleHRPdXQpIHsNCisgICAgICAgICAgICBtX3BUZXh0T3V0LT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BUZXh0T3V0ID0gTlVMTDsNCisgICAgICAgIGlmIChtX3BGaWVsZFNwbGl0QXJyYXkpIHsNCisgICAgICAgICAgICBtX3BGaWVsZFNwbGl0QXJyYXktPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BGaWVsZFNwbGl0QXJyYXk7DQorICAgICAgICAgICAgbV9wRmllbGRTcGxpdEFycmF5ID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CT09MIExvYWRDYXB0aW9uKENYRkFfV2lkZ2V0QWNjKiBwQWNjKQ0KKyAgICB7DQorICAgICAgICBpZiAobV9wQ2FwVGV4dExheW91dCkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBwQWNjLT5HZXRDYXB0aW9uKCk7DQorICAgICAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7DQorICAgICAgICAgICAgbV9wQ2FwVGV4dFByb3ZpZGVyID0gRlhfTkVXIENYRkFfVGV4dFByb3ZpZGVyKHBBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24pOw0KKyAgICAgICAgICAgIG1fcENhcFRleHRMYXlvdXQgPSBGWF9ORVcgQ1hGQV9UZXh0TGF5b3V0KG1fcENhcFRleHRQcm92aWRlcik7DQorICAgICAgICAgICAgcmV0dXJuIG1fcENhcFRleHRMYXlvdXQgIT0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX1RleHRMYXlvdXQJCSptX3BDYXBUZXh0TGF5b3V0Ow0KKyAgICBDWEZBX1RleHRQcm92aWRlcgkqbV9wQ2FwVGV4dFByb3ZpZGVyOw0KKyAgICBJRkRFX1RleHRPdXQJCSptX3BUZXh0T3V0Ow0KKyAgICBDRlhfRmxvYXRBcnJheQkJKm1fcEZpZWxkU3BsaXRBcnJheTsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dEVkaXREYXRhIDogcHVibGljIENYRkFfRmllbGRMYXlvdXREYXRhDQorew0KK3B1YmxpYzoNCit9Ow0KK2NsYXNzIENYRkFfSW1hZ2VFZGl0RGF0YSA6IHB1YmxpYyBDWEZBX0ZpZWxkTGF5b3V0RGF0YQ0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfSW1hZ2VFZGl0RGF0YSgpDQorICAgICAgICA6IG1fcERJQml0bWFwKE5VTEwpDQorICAgICAgICAsIG1fYk5hbWVkSW1hZ2UoRkFMU0UpDQorICAgICAgICAsIG1faUltYWdlWERwaSgwKQ0KKyAgICAgICAgLCBtX2lJbWFnZVlEcGkoMCkNCisgICAgew0KKyAgICB9DQorDQorICAgIH5DWEZBX0ltYWdlRWRpdERhdGEoKQ0KKyAgICB7DQorICAgICAgICBpZihtX3BESUJpdG1hcCAmJiAhbV9iTmFtZWRJbWFnZSkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BESUJpdG1hcDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcERJQml0bWFwID0gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9CT09MIExvYWRJbWFnZURhdGEoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpDQorICAgIHsNCisgICAgICAgIGlmKG1fcERJQml0bWFwKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX1ZhbHVlIHZhbHVlID0gcEFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgICAgICBpZiAoIXZhbHVlKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCk7DQorICAgICAgICBDWEZBX0ZGRG9jICpwRkZEb2MgPSBwQWNjLT5HZXREb2MoKTsNCisgICAgICAgIHBBY2MtPlNldEltYWdlRWRpdEltYWdlKFhGQV9Mb2FkSW1hZ2VEYXRhKHBGRkRvYywgJmltYWdlT2JqLCBtX2JOYW1lZEltYWdlLCBtX2lJbWFnZVhEcGksIG1faUltYWdlWURwaSkpOw0KKyAgICAgICAgcmV0dXJuIG1fcERJQml0bWFwICE9IE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX0RJQml0bWFwKgkJCW1fcERJQml0bWFwOw0KKyAgICBGWF9CT09MCQkJCQltX2JOYW1lZEltYWdlOw0KKyAgICBGWF9JTlQzMgkJCQltX2lJbWFnZVhEcGk7DQorICAgIEZYX0lOVDMyCQkJCW1faUltYWdlWURwaTsNCit9Ow0KK0NYRkFfV2lkZ2V0QWNjOjpDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogQ1hGQV9XaWRnZXREYXRhKHBOb2RlKQ0KKyAgICAsIG1fcERvY1ZpZXcocERvY1ZpZXcpDQorICAgICwgbV9wTGF5b3V0RGF0YShOVUxMKQ0KK3sNCit9DQorQ1hGQV9XaWRnZXRBY2M6On5DWEZBX1dpZGdldEFjYygpDQorew0KKyAgICBpZiAobV9wTGF5b3V0RGF0YSkgew0KKyAgICAgICAgbV9wTGF5b3V0RGF0YS0+UmVsZWFzZSgpOw0KKyAgICAgICAgbV9wTGF5b3V0RGF0YSA9IE5VTEw7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6R2V0TmFtZShDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBGWF9JTlQzMiBpTmFtZVR5cGUgKQ0KK3sNCisgICAgaWYgKGlOYW1lVHlwZSA9PSAwKSB7DQorICAgICAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgICByZXR1cm4gIXdzTmFtZS5Jc0VtcHR5KCk7DQorICAgIH0NCisgICAgbV9wTm9kZS0+R2V0U09NRXhwcmVzc2lvbih3c05hbWUpOw0KKyAgICBpZiAoaU5hbWVUeXBlID09IDIgJiYgd3NOYW1lLkdldExlbmd0aCgpID49IDE1KSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NQcmUgPSBGWF9XU1RSQyhMInhmYVswXS5mb3JtWzBdLiIpOw0KKyAgICAgICAgaWYgKHdzUHJlID09IENGWF9XaWRlU3RyaW5nQyh3c05hbWUsIHdzUHJlLkdldExlbmd0aCgpKSkgew0KKyAgICAgICAgICAgIHdzTmFtZS5EZWxldGUoMCwgd3NQcmUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIENYRkFfV2lkZ2V0QWNjOjpHZXREYXRhc2V0cygpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0QmluZERhdGEoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc1ZhbHVlQ2hhbmdlZCgpDQorew0KKyAgICBtX3BEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldCh0aGlzKTsNCisgICAgbV9wRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHRoaXMpOw0KKyAgICBtX3BEb2NWaWV3LT5SdW5DYWxjdWxhdGVXaWRnZXRzKCk7DQorICAgIG1fcERvY1ZpZXctPlJ1blZhbGlkYXRlKCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpSZXNldERhdGEoKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IChYRkFfRUxFTUVOVClHZXRVSVR5cGUoKTsNCisgICAgc3dpdGNoIChlVUlUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDogew0KKyAgICAgICAgICAgICAgICBDWEZBX1ZhbHVlIGltYWdlVmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgQ1hGQV9JbWFnZSBpbWFnZSA9IGltYWdlVmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZSwgd3NIcmVmOw0KKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2UpIHsNCisgICAgICAgICAgICAgICAgICAgIGltYWdlLkdldENvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBpbWFnZS5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIGltYWdlLkdldEhyZWYod3NIcmVmKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBTZXRJbWFnZUVkaXQod3NDb250ZW50VHlwZSwgd3NIcmVmLCB3c1ZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDogew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXh0Q2hpbGQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwTmV4dENoaWxkKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBOZXh0Q2hpbGQ7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcENoaWxkLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBBY2MpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENYRkFfVmFsdWUgZGVmVmFsdWUoTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkgJiYgKGRlZlZhbHVlID0gcEFjYy0+R2V0RGVmYXVsdFZhbHVlKCkpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+U2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBY2MtPlNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBwQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBJdGVtcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgaXRlbVRleHQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtcy0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKSA+IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQgPSBwSXRlbXMtPkdldENoaWxkKDEsIFhGQV9FTEVNRU5UX1VOS05PV04pLT5HZXRDb250ZW50KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBY2MtPlNldFZhbHVlKGl0ZW1UZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwTmV4dENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KKyAgICAgICAgICAgIENsZWFyQWxsU2VsZWN0aW9ucygpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBpZiAoQ1hGQV9WYWx1ZSBkZWZWYWx1ZSA9IEdldERlZmF1bHRWYWx1ZSgpKSB7DQorICAgICAgICAgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBTZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0SW1hZ2VFZGl0KEZYX1dTVFIgd3NDb250ZW50VHlwZSwgRlhfV1NUUiB3c0hyZWYsIEZYX1dTVFIgd3NEYXRhKQ0KK3sNCisgICAgQ1hGQV9JbWFnZSBpbWFnZSA9IEdldEZvcm1WYWx1ZSgpLkdldEltYWdlKCk7DQorICAgIGlmIChpbWFnZSkgew0KKyAgICAgICAgaW1hZ2UuU2V0Q29udGVudFR5cGUod3NDb250ZW50VHlwZSk7DQorICAgICAgICBpbWFnZS5TZXRIcmVmKHdzSHJlZik7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c0RhdGEpOw0KKyAgICB0aGlzLT5HZXRGb3JtYXREYXRhVmFsdWUod3NEYXRhLCB3c0Zvcm1hdFZhbHVlKTsNCisgICAgbV9wTm9kZS0+U2V0Q29udGVudCh3c0RhdGEsIHdzRm9ybWF0VmFsdWUsIFRSVUUpOw0KKyAgICBDWEZBX05vZGUqIHBCaW5kID0gR2V0RGF0YXNldHMoKTsNCisgICAgaWYgKCFwQmluZCkgew0KKyAgICAgICAgaW1hZ2UuU2V0VHJhbnNmZXJFbmNvZGluZyhYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBCaW5kLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCisgICAgQ1hGQV9Ob2RlICpwSHJlZk5vZGUgPSBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAocEhyZWZOb2RlKSB7DQorICAgICAgICBwSHJlZk5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzSHJlZik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlID0gcEJpbmQtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSktPlNldFN0cmluZyhGWF9XU1RSQyhMImhyZWYiKSwgd3NIcmVmKTsNCisgICAgfQ0KK30NCisNCitDWEZBX1dpZGdldEFjYyoJQ1hGQV9XaWRnZXRBY2M6OkdldEV4Y2xHcm91cCgpDQorew0KKyAgICBDWEZBX05vZGUqIHBFeGNsID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiAoQ1hGQV9XaWRnZXRBY2MqKXBFeGNsLT5HZXRXaWRnZXREYXRhKCk7DQorfQ0KK0NYRkFfRkZEb2NWaWV3KiBDWEZBX1dpZGdldEFjYzo6R2V0RG9jVmlldygpDQorew0KKyAgICByZXR1cm4gbV9wRG9jVmlldzsNCit9DQorQ1hGQV9GRkRvYyogQ1hGQV9XaWRnZXRBY2M6OkdldERvYygpDQorew0KKyAgICByZXR1cm4gKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpOw0KK30NCitDWEZBX0ZGQXBwKiBDWEZBX1dpZGdldEFjYzo6R2V0QXBwKCkNCit7DQorICAgIHJldHVybiBHZXREb2MoKS0+R2V0QXBwKCk7DQorfQ0KK0lYRkFfQXBwUHJvdmlkZXIqIENYRkFfV2lkZ2V0QWNjOjpHZXRBcHBQcm92aWRlcigpDQorew0KKyAgICByZXR1cm4gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzRXZlbnQoRlhfSU5UMzIgaUFjdGl2aXR5LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKQ0KK3sNCisgICAgaWYgKHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICBDWEZBX05vZGVBcnJheSBldmVudEFycmF5Ow0KKyAgICBGWF9JTlQzMiBpQ291bnRzID0gR2V0RXZlbnRCeUFjdGl2aXR5KGlBY3Rpdml0eSwgZXZlbnRBcnJheSwgcEV2ZW50UGFyYW0tPm1fYklzRm9ybVJlYWR5KTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICAgICAgQ1hGQV9FdmVudCBldmVudChldmVudEFycmF5W2ldKTsNCisgICAgICAgIEZYX0lOVDMyIHJlc3VsdCA9IFByb2Nlc3NFdmVudChldmVudCwgcEV2ZW50UGFyYW0pOw0KKyAgICAgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgICAgICAgIGlSZXQgPSByZXN1bHQ7DQorICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MpIHsNCisgICAgICAgICAgICBpUmV0ID0gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUmV0Ow0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc0V2ZW50KENYRkFfRXZlbnQmIGV2ZW50LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKQ0KK3sNCisgICAgaWYgKCFldmVudCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICB9DQorICAgIHN3aXRjaChldmVudC5HZXRFdmVudFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGVjdXRlOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TY3JpcHQ6IHsNCisgICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gZXZlbnQuR2V0U2NyaXB0KCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBFeGVjdXRlU2NyaXB0KHNjcmlwdCwgcEV2ZW50UGFyYW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2lnbkRhdGE6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1Ym1pdDogew0KKyAgICAgICAgICAgICAgICBDWEZBX1N1Ym1pdCBzdWJtaXQgPSBldmVudC5HZXRTdWJtaXQoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5TdWJtaXREYXRhKChYRkFfSERPQylHZXREb2MoKSwgc3VibWl0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NDYWxjdWxhdGUoKQ0KK3sNCisgICAgaWYgKHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIH0NCisgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHRoaXMtPkdldENhbGN1bGF0ZSgpOw0KKyAgICBpZiAoIWNhbGMpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBpZiAodGhpcy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICAgIH0NCisgICAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07DQorICAgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DYWxjdWxhdGU7DQorICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSBFeGVjdXRlU2NyaXB0KHNjcmlwdCwgJkV2ZW50UGFyYW0pOw0KKyAgICBpZiAoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MpIHsNCisgICAgICAgIGlmIChHZXRSYXdWYWx1ZSgpICE9IEV2ZW50UGFyYW0ubV93c1Jlc3VsdCkgew0KKyAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEdldERvYygpLT5HZXREb2NUeXBlKCkgPT0gWEZBX0RPQ1RZUEVfU3RhdGljOw0KKyAgICAgICAgICAgIFNldFZhbHVlKEV2ZW50UGFyYW0ubV93c1Jlc3VsdCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgICAgIFVwZGF0ZVVJRGlzcGxheSgpOw0KKyAgICAgICAgICAgIGlmIChiTm90aWZ5KSB7DQorICAgICAgICAgICAgICAgIE5vdGlmeUV2ZW50KFhGQV9XSURHRVRFVkVOVF9Qb3N0Q29udGVudENoYW5nZWQsIE5VTEwsIE5VTEwsIE5VTEwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUmV0Ow0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsIEZYX0lOVDMyIGlSZXQsIEZYSlNFX0hWQUxVRSBwUmV0VmFsdWUsIEZYX0JPT0wgYlZlcnNpb25GbGFnKQ0KK3sNCisgICAgaWYgKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzICYmIHBSZXRWYWx1ZSkgew0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihwUmV0VmFsdWUpICYmICFGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4ocFJldFZhbHVlKSkgew0KKyAgICAgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgICAgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0FwcE5hbWUsIHdzVGl0bGUpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2NyaXB0TXNnOw0KKyAgICAgICAgICAgIHZhbGlkYXRlLkdldFNjcmlwdE1lc3NhZ2VUZXh0KHdzU2NyaXB0TXNnKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBlU2NyaXB0VGVzdCA9IHZhbGlkYXRlLkdldFNjcmlwdFRlc3QoKTsNCisgICAgICAgICAgICBpZiAoZVNjcmlwdFRlc3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZykgew0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NTY3JpcHRNc2csIEZBTFNFLCBiVmVyc2lvbkZsYWcpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9PSyk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7DQorICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NTY3JpcHRNc2csIFRSVUUsIGJWZXJzaW9uRmxhZyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fRXJyb3IsIFhGQV9NQl9PSyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzRm9ybWF0VGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsIEZYX0JPT0wgYlZlcnNpb25GbGFnKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSYXdWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7DQorICAgIGlmICghd3NSYXdWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgICAgICAgIHZhbGlkYXRlLkdldFBpY3R1cmUod3NQaWN0dXJlKTsNCisgICAgICAgIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7DQorICAgICAgICBpZiAoIWxjVmFsdWUuVmFsaWRhdGVWYWx1ZShsY1ZhbHVlLkdldFZhbHVlKCksIHdzUGljdHVyZSwgcExvY2FsZSkpIHsNCisgICAgICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHBQcm92aWRlcigpOw0KKyAgICAgICAgICAgIGlmICghcEFwcFByb3ZpZGVyKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRNc2c7DQorICAgICAgICAgICAgdmFsaWRhdGUuR2V0Rm9ybWF0TWVzc2FnZVRleHQod3NGb3JtYXRNc2cpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgZUZvcm1hdFRlc3QgPSB2YWxpZGF0ZS5HZXRGb3JtYXRUZXN0KCk7DQorICAgICAgICAgICAgaWYgKGVGb3JtYXRUZXN0ID09IFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yKSB7DQorICAgICAgICAgICAgICAgIGlmICh3c0Zvcm1hdE1zZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEdldFZhbGlkYXRlTWVzc2FnZShwQXBwUHJvdmlkZXIsIHdzRm9ybWF0TXNnLCBUUlVFLCBiVmVyc2lvbkZsYWcpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodGhpcy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHdzRm9ybWF0TXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBHZXRWYWxpZGF0ZU1lc3NhZ2UocEFwcFByb3ZpZGVyLCB3c0Zvcm1hdE1zZywgRkFMU0UsIGJWZXJzaW9uRmxhZyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NGb3JtYXRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywgWEZBX01CX09LKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7DQorICAgICAgICAgICAgICAgIHRoaXMtPkdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc051bGxUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwgRlhfSU5UMzIgaUZsYWdzLCBGWF9CT09MIGJWZXJzaW9uRmxhZykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIHRoaXMtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgfQ0KKyAgICBpZiAodGhpcy0+bV9iSXNOdWxsICYmICh0aGlzLT5tX2JQcmVOdWxsID09IHRoaXMtPm1fYklzTnVsbCkpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgIH0NCisgICAgRlhfSU5UMzIgZU51bGxUZXN0ID0gdmFsaWRhdGUuR2V0TnVsbFRlc3QoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdWxsTXNnOw0KKyAgICB2YWxpZGF0ZS5HZXROdWxsTWVzc2FnZVRleHQod3NOdWxsTXNnKTsNCisgICAgaWYgKGlGbGFncyAmIDB4MDEpIHsNCisgICAgICAgIEZYX0lOVDMyIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgICBpZiAoZU51bGxUZXN0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkKSB7DQorICAgICAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCF3c051bGxNc2cuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgaWYgKGVOdWxsVGVzdCAhPSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZCkgew0KKyAgICAgICAgICAgICAgICBtX3BEb2NWaWV3LT5tX2Fyck51bGxUZXN0TXNnLkFkZCh3c051bGxNc2cpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSAmJiBiVmVyc2lvbkZsYWcgJiYgZU51bGxUZXN0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkKSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgIH0NCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCisgICAgc3dpdGNoIChlTnVsbFRlc3QpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3I6IHsNCisgICAgICAgICAgICAgICAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUod3NDYXB0aW9uTmFtZSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvciwgd3NFcnJvcik7DQorICAgICAgICAgICAgICAgICAgICB3c051bGxNc2cuRm9ybWF0KHdzRXJyb3IsIChGWF9MUENXU1RSKXdzQ2FwdGlvbk5hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9TdGF0dXMsIFhGQV9NQl9PSyk7DQorICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmc6IHsNCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUod3NDYXB0aW9uTmFtZSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2FybmluZzsNCisgICAgICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1ZhbGlkYXRlTnVsbFdhcm5pbmcsIHdzV2FybmluZyk7DQorICAgICAgICAgICAgICAgICAgICB3c051bGxNc2cuRm9ybWF0KHdzV2FybmluZywgKEZYX0xQQ1dTVFIpd3NDYXB0aW9uTmFtZSwgKEZYX0xQQ1dTVFIpd3NDYXB0aW9uTmFtZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLCBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZDoNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVDYXB0aW9uTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uTmFtZSwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpDQorew0KKyAgICBpZiAoIWJWZXJzaW9uRmxhZykgew0KKyAgICAgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBHZXRDYXB0aW9uKCk7DQorICAgICAgICBpZiAoY2FwdGlvbikgew0KKyAgICAgICAgICAgIENYRkFfVmFsdWUgY2FwVmFsdWUgPSBjYXB0aW9uLkdldFZhbHVlKCk7DQorICAgICAgICAgICAgaWYgKGNhcFZhbHVlKSB7DQorICAgICAgICAgICAgICAgIENYRkFfVGV4dCBjYXBUZXh0ID0gY2FwVmFsdWUuR2V0VGV4dCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoY2FwVGV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FwVGV4dC5HZXRDb250ZW50KHdzQ2FwdGlvbk5hbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh3c0NhcHRpb25OYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgR2V0TmFtZSh3c0NhcHRpb25OYW1lKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRWYWxpZGF0ZU1lc3NhZ2UoSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyLCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlLCBGWF9CT09MIGJFcnJvciwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOw0KKyAgICBHZXRWYWxpZGF0ZUNhcHRpb25OYW1lKHdzQ2FwdGlvbk5hbWUsIGJWZXJzaW9uRmxhZyk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1ZhbGlkYXRlRmFpbGVkLCB3c0Vycm9yKTsNCisgICAgICAgIHdzTWVzc2FnZS5Gb3JtYXQod3NFcnJvciwgKEZYX0xQQ1dTVFIpd3NDYXB0aW9uTmFtZSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJFcnJvcikgew0KKyAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVFcnJvciwgd3NFcnJvcik7DQorICAgICAgICB3c01lc3NhZ2UuRm9ybWF0KHdzRXJyb3IsIChGWF9MUENXU1RSKXdzQ2FwdGlvbk5hbWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzV2FybmluZzsNCisgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVXYXJuaW5nLCB3c1dhcm5pbmcpOw0KKyAgICB3c01lc3NhZ2UuRm9ybWF0KHdzV2FybmluZywgKEZYX0xQQ1dTVFIpd3NDYXB0aW9uTmFtZSwgKEZYX0xQQ1dTVFIpd3NDYXB0aW9uTmFtZSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzVmFsaWRhdGUoRlhfSU5UMzIgaUZsYWdzKQ0KK3sNCisgICAgaWYgKHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIH0NCisgICAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHRoaXMtPkdldFZhbGlkYXRlKCk7DQorICAgIGlmICghdmFsaWRhdGUpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJJbml0RG9jID0gKChDWEZBX05vZGUqKXZhbGlkYXRlKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfTmVlZHNJbml0QXBwKTsNCisgICAgRlhfQk9PTCBiU3RhdHVzID0gbV9wRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOw0KKyAgICBGWF9JTlQzMiBpRm9ybWF0ID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSA9IE5VTEw7DQorICAgIEZYX0lOVDMyICBpUmV0ID0gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IHZhbGlkYXRlLkdldFNjcmlwdCgpOw0KKyAgICBpZiAoc2NyaXB0KSB7DQorICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfVmFsaWRhdGU7DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gdGhpczsNCisgICAgICAgIGlSZXQgPSBFeGVjdXRlU2NyaXB0KHNjcmlwdCwgJmVQYXJhbSwgKChiSW5pdERvYyB8fCBiU3RhdHVzKSAmJiB0aGlzLT5HZXRSYXdWYWx1ZSgpLklzRW1wdHkoKSkgPyBOVUxMIDogJnBSZXRWYWx1ZSk7DQorICAgIH0NCisgICAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcgPSBGQUxTRTsNCisgICAgaWYgKHZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDgpIHsNCisgICAgICAgIGJWZXJzaW9uRmxhZyA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGJJbml0RG9jKSB7DQorICAgICAgICAoKENYRkFfTm9kZSopdmFsaWRhdGUpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19OZWVkc0luaXRBcHAsIEZBTFNFLCBGQUxTRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpRm9ybWF0ID0gUHJvY2Vzc0Zvcm1hdFRlc3RWYWxpZGF0ZSh2YWxpZGF0ZSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgIGlmICghYlZlcnNpb25GbGFnKSB7DQorICAgICAgICAgICAgYlZlcnNpb25GbGFnID0gR2V0RG9jKCktPkdldFhGQURvYygpLT5IYXNGbGFnKFhGQV9ET0NGTEFHX1NjcmlwdGluZyk7DQorICAgICAgICB9DQorICAgICAgICBpUmV0IHw9IFByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBpRmxhZ3MsIGJWZXJzaW9uRmxhZyk7DQorICAgIH0NCisgICAgaWYgKGlGb3JtYXQgIT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSB7DQorICAgICAgICBQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBpUmV0LCBwUmV0VmFsdWUsIGJWZXJzaW9uRmxhZyk7DQorICAgIH0NCisgICAgaWYgKHBSZXRWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwUmV0VmFsdWUpOw0KKyAgICB9DQorICAgIHJldHVybiBpUmV0IHwgaUZvcm1hdDsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXRBY2M6OkV4ZWN1dGVTY3JpcHQoQ1hGQV9TY3JpcHQgc2NyaXB0LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtLCBGWEpTRV9IVkFMVUUqIHBSZXRWYWx1ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChwRXZlbnRQYXJhbSk7DQorICAgIGlmICghc2NyaXB0KSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICAgIH0NCisgICAgaWYoc2NyaXB0LkdldFJ1bkF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2VydmVyKSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICBzY3JpcHQuR2V0RXhwcmVzc2lvbih3c0V4cHJlc3Npb24pOw0KKyAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICB9DQorICAgIFhGQV9TQ1JJUFRUWVBFIGVTY3JpcHRUeXBlID0gc2NyaXB0LkdldENvbnRlbnRUeXBlKCk7DQorICAgIGlmIChlU2NyaXB0VHlwZSA9PSBYRkFfU0NSSVBUVFlQRV9Vbmtvd24pIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgIH0NCisgICAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBDb250ZXh0ID0gcERvYy0+R2V0WEZBRG9jKCktPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgcENvbnRleHQtPlNldEV2ZW50UGFyYW0ocEV2ZW50UGFyYW0pOw0KKyAgICBwQ29udGV4dC0+U2V0UnVuQXRUeXBlKChYRkFfQVRUUklCVVRFRU5VTSlzY3JpcHQuR2V0UnVuQXQoKSk7DQorICAgIENYRkFfTm9kZUFycmF5IHJlZk5vZGVzOw0KKyAgICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUgfHwgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0NhbGN1bGF0ZSkgew0KKyAgICAgICAgcENvbnRleHQtPlNldE5vZGVzT2ZSdW5TY3JpcHQoJnJlZk5vZGVzKTsNCisgICAgfQ0KKyAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKHBDb250ZXh0LT5HZXRSdW50aW1lKCkpOw0KKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgICAgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoKFhGQV9TQ1JJUFRMQU5HVFlQRSllU2NyaXB0VHlwZSwgd3NFeHByZXNzaW9uLCBoUmV0VmFsdWUsIG1fcE5vZGUpOw0KKyAgICBGWF9JTlQzMiBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KKyAgICAgICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsNCisgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhSZXRWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwoaFJldFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNTdHJpbmc7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFJldFZhbHVlLCBic1N0cmluZyk7DQorICAgICAgICAgICAgICAgICAgICBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1N0cmluZywgYnNTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsNCisgICAgICAgICAgICAgICAgaWYgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzcykgJiYgKEdldFJhd1ZhbHVlKCkgIT0gcEV2ZW50UGFyYW0tPm1fd3NSZXN1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZShwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQodGhpcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfSU5UMzIgaVJlZnMgPSByZWZOb2Rlcy5HZXRTaXplKCk7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiByID0gMDsgciA8IGlSZWZzOyByKyspIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXJlZk5vZGVzW3JdLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICAgICAgICAgIGlmIChwUmVmQWNjICYmIHBSZWZBY2MgPT0gdGhpcykgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IHJlZk5vZGVzW3JdOw0KKyAgICAgICAgICAgICAgICBDWEZBX0NhbGNEYXRhKiBwR2xvYmFsRGF0YSA9IChDWEZBX0NhbGNEYXRhKilwUmVmTm9kZS0+R2V0VXNlckRhdGEoWEZBX0NhbGNEYXRhKTsNCisgICAgICAgICAgICAgICAgaWYgKCFwR2xvYmFsRGF0YSkgew0KKyAgICAgICAgICAgICAgICAgICAgcEdsb2JhbERhdGEgPSBGWF9ORVcgQ1hGQV9DYWxjRGF0YTsNCisgICAgICAgICAgICAgICAgICAgIHBSZWZOb2RlLT5TZXRVc2VyRGF0YShYRkFfQ2FsY0RhdGEsIHBHbG9iYWxEYXRhLCAmZ3NfWEZBRGVsZXRlQ2FsY0RhdGEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChwR2xvYmFsRGF0YS0+bV9HbG9iYWxzLkZpbmQodGhpcykgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBwR2xvYmFsRGF0YS0+bV9HbG9iYWxzLkFkZCh0aGlzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFJldFZhbHVlKSB7DQorICAgICAgICAqcFJldFZhbHVlID0gaFJldFZhbHVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUmV0VmFsdWUpOw0KKyAgICB9DQorICAgIHBDb250ZXh0LT5TZXROb2Rlc09mUnVuU2NyaXB0KE5VTEwpOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorQ1hGQV9GRldpZGdldCogQ1hGQV9XaWRnZXRBY2M6OkdldE5leHRXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCkNCit7DQorICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dCA9IE5VTEw7DQorICAgIGlmIChwV2lkZ2V0KSB7DQorICAgICAgICBwTGF5b3V0ID0gcFdpZGdldC0+R2V0TGF5b3V0SXRlbSgpLT5HZXROZXh0KCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwTGF5b3V0ID0gbV9wRG9jVmlldy0+R2V0WEZBTGF5b3V0KCktPkdldExheW91dEl0ZW0obV9wTm9kZSk7DQorICAgIH0NCisgICAgcmV0dXJuIChDWEZBX0ZGV2lkZ2V0KikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXQ7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlVwZGF0ZVVJRGlzcGxheShDWEZBX0ZGV2lkZ2V0KiBwRXhjZXB0ICkNCit7DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICB3aGlsZSAoKHBXaWRnZXQgPSB0aGlzLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBOVUxMKSB7DQorICAgICAgICBpZiAocFdpZGdldCA9PSBwRXhjZXB0IHx8ICFwV2lkZ2V0LT5Jc0xvYWRlZCgpIHx8IChHZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiAmJiBwV2lkZ2V0LT5Jc0ZvY3VzZWQoKSkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHBXaWRnZXQtPlVwZGF0ZUZXTERhdGEoKTsNCisgICAgICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6Tm90aWZ5RXZlbnQoRlhfRFdPUkQgZHdFdmVudCwgQ1hGQV9GRldpZGdldCogcFdpZGdldCAsIEZYX0xQVk9JRCBwUGFyYW0gLCBGWF9MUFZPSUQgcEFkZGl0aW9uYWwgKQ0KK3sNCisgICAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCk7DQorICAgIGlmIChwV2lkZ2V0KSB7DQorICAgICAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KChYRkFfSFdJREdFVClwV2lkZ2V0LCB0aGlzLCBkd0V2ZW50LCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBXaWRnZXQgPSBHZXROZXh0V2lkZ2V0KHBXaWRnZXQpOw0KKyAgICAgICAgaWYgKHBXaWRnZXQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBEb2NQcm92aWRlci0+V2lkZ2V0RXZlbnQoTlVMTCwgdGhpcywgZHdFdmVudCwgcFBhcmFtLCBwQWRkaXRpb25hbCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKHBXaWRnZXQpIHsNCisgICAgICAgICAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KChYRkFfSFdJREdFVClwV2lkZ2V0LCB0aGlzLCBkd0V2ZW50LCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgICAgICAgICAgICBwV2lkZ2V0ID0gR2V0TmV4dFdpZGdldChwV2lkZ2V0KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpDYWxjQ2FwdGlvblNpemUoQ0ZYX1NpemVGICZzekNhcCkNCit7DQorICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gdGhpcy0+R2V0Q2FwdGlvbigpOw0KKyAgICBpZiAoIWNhcHRpb24uSXNFeGlzdEluWE1MKCkgfHwgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBMb2FkQ2FwdGlvbigpOw0KKyAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gKFhGQV9FTEVNRU5UKUdldFVJVHlwZSgpOw0KKyAgICBGWF9JTlQzMiBpQ2FwUGxhY2VtZW50ID0gY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgIEZYX0ZMT0FUIGZDYXBSZXNlcnZlID0gY2FwdGlvbi5HZXRSZXNlcnZlKCk7DQorICAgIEZYX0JPT0wgYlZlcnQgPSBpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCB8fCBpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTsNCisgICAgRlhfQk9PTCBiUmVzZXJ2ZUV4aXQgPSBmQ2FwUmVzZXJ2ZSA+IDAuMDE7DQorICAgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wQ2FwVGV4dExheW91dDsNCisgICAgaWYgKHBDYXBUZXh0TGF5b3V0KSB7DQorICAgICAgICBpZiAoIWJWZXJ0ICYmIGVVSVR5cGUgIT0gWEZBX0VMRU1FTlRfQnV0dG9uKSB7DQorICAgICAgICAgICAgc3pDYXAueCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1NpemVGIG1pblNpemU7DQorICAgICAgICBtaW5TaXplLlNldCgwLCAwKTsNCisgICAgICAgIHBDYXBUZXh0TGF5b3V0LT5DYWxjU2l6ZShtaW5TaXplLCBzekNhcCwgc3pDYXApOw0KKyAgICAgICAgaWYgKGJSZXNlcnZlRXhpdCkgew0KKyAgICAgICAgICAgIGJWZXJ0ID8gc3pDYXAueSA9IGZDYXBSZXNlcnZlIDogc3pDYXAueCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTAuMGY7DQorICAgICAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBjYXB0aW9uLkdldEZvbnQoKSkgew0KKyAgICAgICAgICAgIGZGb250U2l6ZSA9IGZvbnQuR2V0Rm9udFNpemUoKTsNCisgICAgICAgIH0gZWxzZSBpZiAoQ1hGQV9Gb250IHdpZGdldGZvbnQgPSBHZXRGb250KCkpIHsNCisgICAgICAgICAgICBmRm9udFNpemUgPSB3aWRnZXRmb250LkdldEZvbnRTaXplKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlZlcnQpIHsNCisgICAgICAgICAgICBzekNhcC55ID0gZkNhcFJlc2VydmUgPiAwID8gZkNhcFJlc2VydmUgOiBmRm9udFNpemU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN6Q2FwLnggPSBmQ2FwUmVzZXJ2ZSA+IDAgPyBmQ2FwUmVzZXJ2ZSA6IDA7DQorICAgICAgICAgICAgc3pDYXAueSA9IGZGb250U2l6ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQorICAgICAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgICAgICBtZ0NhcC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQorICAgICAgICBtZ0NhcC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICAgICAgbWdDYXAuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgICAgICBtZ0NhcC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgaWYgKGJSZXNlcnZlRXhpdCkgew0KKyAgICAgICAgICAgIGJWZXJ0ID8gKHN6Q2FwLnggKz0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0KSA6IChzekNhcC55ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN6Q2FwLnggKz0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0Ow0KKyAgICAgICAgICAgIHN6Q2FwLnkgKz0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUZpZWxkQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6Q2FwOw0KKyAgICBzekNhcC5TZXQoMCwgMCk7DQorICAgIENhbGNDYXB0aW9uU2l6ZShzekNhcCk7DQorICAgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgICBHZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCisgICAgc2l6ZS54ICs9IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQorICAgIHNpemUueSArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgICBpZiAoc3pDYXAueCA+IDAgJiYgc3pDYXAueSA+IDApIHsNCisgICAgICAgIEZYX0lOVDMyIGlDYXBQbGFjZW1lbnQgPSB0aGlzLT5HZXRDYXB0aW9uKCkuR2V0UGxhY2VtZW50VHlwZSgpOw0KKyAgICAgICAgc3dpdGNoKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZTogew0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZS54ICs9IHN6Q2FwLng7DQorICAgICAgICAgICAgICAgICAgICBzaXplLnkgPSBGWF9NQVgoc2l6ZS55LCBzekNhcC55KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZS55ICs9IHN6Q2FwLnk7DQorICAgICAgICAgICAgICAgICAgICBzaXplLnggPSBGWF9NQVgoc2l6ZS54LCBzekNhcC54KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgICAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQorICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICAgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgc2l6ZS54ICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCisgICAgICAgIHNpemUueSArPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7DQorICAgIH0NCisgICAgQ1hGQV9QYXJhIHBhcmEgPSB0aGlzLT5HZXRQYXJhKCk7DQorICAgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBzaXplLnggKz0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgICAgICBzaXplLnggKz0gcGFyYS5HZXRUZXh0SW5kZW50KCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlZhbCA9IDAsIGZNaW4gPSAwLCBmTWF4ID0gMDsNCisgICAgaWYgKHRoaXMtPkdldFdpZHRoKGZWYWwpKSB7DQorICAgICAgICBzaXplLnggPSBmVmFsOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHRoaXMtPkdldE1pbldpZHRoKGZNaW4pKSB7DQorICAgICAgICAgICAgc2l6ZS54ID0gRlhfTUFYKHNpemUueCwgZk1pbik7DQorICAgICAgICB9DQorICAgICAgICBpZiAodGhpcy0+R2V0TWF4V2lkdGgoZk1heCkgJiYgZk1heCA+IDApIHsNCisgICAgICAgICAgICBzaXplLnggPSBGWF9NSU4oc2l6ZS54LCBmTWF4KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBmVmFsID0gMCwgZk1pbiA9IDAsIGZNYXggPSAwOw0KKyAgICBpZiAodGhpcy0+R2V0SGVpZ2h0KGZWYWwpKSB7DQorICAgICAgICBzaXplLnkgPSBmVmFsOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHRoaXMtPkdldE1pbkhlaWdodChmTWluKSkgew0KKyAgICAgICAgICAgIHNpemUueSA9IEZYX01BWChzaXplLnksIGZNaW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHRoaXMtPkdldE1heEhlaWdodChmTWF4KSAmJiBmTWF4ID4gMCkgew0KKyAgICAgICAgICAgIHNpemUueSA9IEZYX01JTihzaXplLnksIGZNYXgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0Q29udGVudFNpemUoQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICB0aGlzLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIGlmICh3c1RleHQuSXNFbXB0eSgpKSB7DQorICAgICAgICBzaXplLnkgKz0gZkZvbnRTaXplOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX1dDSEFSIHdjRW50ZXIgPSAnXG4nOw0KKyAgICBGWF9XQ0hBUiB3c0xhc3QgPSB3c1RleHQuR2V0QXQod3NUZXh0LkdldExlbmd0aCgpIC0gMSk7DQorICAgIGlmKHdzTGFzdCA9PSB3Y0VudGVyKSB7DQorICAgICAgICB3c1RleHQgPSB3c1RleHQgKyB3Y0VudGVyOw0KKyAgICB9DQorICAgIGlmICghKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQpIHsNCisgICAgICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0ID0gSUZERV9UZXh0T3V0OjpDcmVhdGUoKTsNCisgICAgICAgIElGREVfVGV4dE91dCogcFRleHRPdXQgPSAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dDsNCisgICAgICAgIHBUZXh0T3V0LT5TZXRGb250KEdldEZERUZvbnQoKSk7DQorICAgICAgICBwVGV4dE91dC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsNCisgICAgICAgIHBUZXh0T3V0LT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoZkZvbnRTaXplICogMC4yZik7DQorICAgICAgICBwVGV4dE91dC0+U2V0TGluZVNwYWNlKEdldExpbmVIZWlnaHQoKSk7DQorICAgICAgICBGWF9EV09SRCBkd1N0eWxlcyA9IEZERV9UVE9TVFlMRV9MYXN0TGluZUhlaWdodDsNCisgICAgICAgIGlmIChHZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9UZXh0RWRpdCAmJiBJc011bHRpTGluZSgpKSB7DQorICAgICAgICAgICAgZHdTdHlsZXMgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFRleHRPdXQtPlNldFN0eWxlcyhkd1N0eWxlcyk7DQorICAgIH0NCisgICAgKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUod3NUZXh0LCB3c1RleHQuR2V0TGVuZ3RoKCksIHNpemUpOw0KK30NCitGWF9CT09MCUNYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0RWRpdEF1dG9TaXplKENGWF9TaXplRiAmc2l6ZSkNCit7DQorICAgIGlmIChzaXplLnggPiAwKSB7DQorICAgICAgICBDRlhfU2l6ZUYgc3pPcnogPSBzaXplOw0KKyAgICAgICAgQ0ZYX1NpemVGIHN6Q2FwOw0KKyAgICAgICAgc3pDYXAuU2V0KDAsIDApOw0KKyAgICAgICAgQ2FsY0NhcHRpb25TaXplKHN6Q2FwKTsNCisgICAgICAgIEZYX0JPT0wgYkNhcEV4aXQgPSBzekNhcC54ID4gMC4wMSAmJiBzekNhcC55ID4gMC4wMTsNCisgICAgICAgIEZYX0lOVDMyIGlDYXBQbGFjZW1lbnQgPSBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KKyAgICAgICAgaWYgKGJDYXBFeGl0KSB7DQorICAgICAgICAgICAgaUNhcFBsYWNlbWVudCA9IHRoaXMtPkdldENhcHRpb24oKS5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgICAgICAgICAgc3dpdGNoKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUueCAtPSBzekNhcC54Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICAgICAgICBHZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCisgICAgICAgIHNpemUueCAtPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KKyAgICAgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgICAgICAgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0Ow0KKyAgICAgICAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgICAgICAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgICAgICAgICBzaXplLnggLT0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKHNpemUpOw0KKyAgICAgICAgc2l6ZS55ICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQorICAgICAgICBpZiAoYkNhcEV4aXQpIHsNCisgICAgICAgICAgICBzd2l0Y2goaUNhcFBsYWNlbWVudCkgew0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS55ID0gRlhfTUFYKHNpemUueSwgc3pDYXAueSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS55ICs9IHN6Q2FwLnk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzaXplLnggPSBzek9yei54Ow0KKyAgICAgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOw0KKyAgICB9DQorICAgIENhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShzaXplKTsNCisgICAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc2l6ZSk7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgRlhfRkxPQVQgZkNoZWNrU2l6ZSA9IHRoaXMtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgICBzaXplLnggPSBzaXplLnkgPSBmQ2hlY2tTaXplOw0KKyAgICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzaXplKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlUHVzaEJ1dHRvbkF1dG9TaXplKENGWF9TaXplRiAmc2l6ZSkNCit7DQorICAgIENhbGNDYXB0aW9uU2l6ZShzaXplKTsNCisgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVJbWFnZUF1dG9TaXplKENGWF9TaXplRiAmc2l6ZSkNCit7DQorICAgIGlmICghR2V0SW1hZ2VJbWFnZSgpKSB7DQorICAgICAgICBMb2FkSW1hZ2VJbWFnZSgpOw0KKyAgICB9DQorICAgIHNpemUuU2V0KDAsIDApOw0KKyAgICBpZiAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gR2V0SW1hZ2VJbWFnZSgpKSB7DQorICAgICAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gR2V0Rm9ybVZhbHVlKCkuR2V0SW1hZ2UoKTsNCisgICAgICAgIENGWF9SZWN0RiBydEltYWdlLCBydEZpdDsNCisgICAgICAgIHJ0SW1hZ2UuU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgcnRGaXQuU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgRlhfSU5UMzIgaUltYWdlWERwaSA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpSW1hZ2VZRHBpID0gMDsNCisgICAgICAgIEdldEltYWdlRHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOw0KKyAgICAgICAgcnRJbWFnZS53aWR0aCA9IFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVClpSW1hZ2VYRHBpKTsNCisgICAgICAgIHJ0SW1hZ2UuaGVpZ2h0ID0gWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIChGWF9GTE9BVClpSW1hZ2VZRHBpKTsNCisgICAgICAgIGlmKEdldFdpZHRoKHJ0Rml0LndpZHRoKSkgew0KKyAgICAgICAgICAgIEdldFdpZHRoV2l0aG91dE1hcmdpbihydEZpdC53aWR0aCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlmKEdldEhlaWdodChydEZpdC5oZWlnaHQpKSB7DQorICAgICAgICAgICAgR2V0SGVpZ2h0V2l0aG91dE1hcmdpbihydEZpdC5oZWlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBydEZpdC5oZWlnaHQgPSBydEltYWdlLmhlaWdodDsNCisgICAgICAgIH0NCisgICAgICAgIHNpemUueCA9IHJ0Rml0LndpZHRoOw0KKyAgICAgICAgc2l6ZS55ID0gcnRGaXQuaGVpZ2h0Ow0KKyAgICB9DQorICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgaWYgKCFHZXRJbWFnZUVkaXRJbWFnZSgpKSB7DQorICAgICAgICBMb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCisgICAgfQ0KKyAgICBzaXplLlNldCgwLCAwKTsNCisgICAgaWYgKENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEdldEltYWdlRWRpdEltYWdlKCkpIHsNCisgICAgICAgIENGWF9SZWN0RiBydEltYWdlLCBydEZpdDsNCisgICAgICAgIHJ0SW1hZ2UuU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgcnRGaXQuU2V0KDAsIDAsIDAsIDApOw0KKyAgICAgICAgRlhfSU5UMzIgaUltYWdlWERwaSA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpSW1hZ2VZRHBpID0gMDsNCisgICAgICAgIEdldEltYWdlRWRpdERwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgICAgIHJ0SW1hZ2Uud2lkdGggPSBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSk7DQorICAgICAgICBydEltYWdlLmhlaWdodCA9IFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSk7DQorICAgICAgICBpZihHZXRXaWR0aChydEZpdC53aWR0aCkpIHsNCisgICAgICAgICAgICBHZXRXaWR0aFdpdGhvdXRNYXJnaW4ocnRGaXQud2lkdGgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBydEZpdC53aWR0aCA9IHJ0SW1hZ2Uud2lkdGg7DQorICAgICAgICB9DQorICAgICAgICBpZihHZXRIZWlnaHQocnRGaXQuaGVpZ2h0KSkgew0KKyAgICAgICAgICAgIEdldEhlaWdodFdpdGhvdXRNYXJnaW4ocnRGaXQuaGVpZ2h0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQorICAgICAgICB9DQorICAgICAgICBzaXplLnggPSBydEZpdC53aWR0aDsNCisgICAgICAgIHNpemUueSA9IHJ0Rml0LmhlaWdodDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzaXplKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6TG9hZEltYWdlSW1hZ2UoKQ0KK3sNCisgICAgSW5pdExheW91dERhdGEoKTsNCisgICAgcmV0dXJuICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkSW1hZ2VEYXRhKHRoaXMpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpMb2FkSW1hZ2VFZGl0SW1hZ2UoKQ0KK3sNCisgICAgSW5pdExheW91dERhdGEoKTsNCisgICAgcmV0dXJuICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+TG9hZEltYWdlRGF0YSh0aGlzKTsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0SW1hZ2VEcGkoRlhfSU5UMzIgJmlJbWFnZVhEcGksIEZYX0lOVDMyICZpSW1hZ2VZRHBpKQ0KK3sNCisgICAgaUltYWdlWERwaSA9ICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX2lJbWFnZVhEcGk7DQorICAgIGlJbWFnZVlEcGkgPSAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VZRHBpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXREcGkoRlhfSU5UMzIgJmlJbWFnZVhEcGksIEZYX0lOVDMyICZpSW1hZ2VZRHBpKQ0KK3sNCisgICAgaUltYWdlWERwaSA9ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VYRHBpOw0KKyAgICBpSW1hZ2VZRHBpID0gKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX2lJbWFnZVlEcGk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVRleHRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpDQorew0KKyAgICBpZiAoIUxvYWRUZXh0KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dDsNCisgICAgaWYgKHBUZXh0TGF5b3V0KSB7DQorICAgICAgICBzaXplLnggPSBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoc2l6ZS54KTsNCisgICAgICAgIHNpemUueSA9IHBUZXh0TGF5b3V0LT5HZXRMYXlvdXRIZWlnaHQoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc2l6ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRUZXh0KCkNCit7DQorICAgIEluaXRMYXlvdXREYXRhKCk7DQorICAgIHJldHVybiAoKENYRkFfVGV4dExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkVGV4dCh0aGlzKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVdpZGdldEF1dG9XaWR0aChGWF9GTE9BVCBmV2lkdGhDYWxjKQ0KK3sNCisgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmUmlnaHRJbnNldDsNCisgICAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KKyAgICAgICAgZldpZHRoQ2FsYyArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZk1pbiA9IDAsIGZNYXggPSAwOw0KKyAgICBpZiAodGhpcy0+R2V0TWluV2lkdGgoZk1pbikpIHsNCisgICAgICAgIGZXaWR0aENhbGMgPSBGWF9NQVgoZldpZHRoQ2FsYywgZk1pbik7DQorICAgIH0NCisgICAgaWYgKHRoaXMtPkdldE1heFdpZHRoKGZNYXgpICYmIGZNYXggPiAwKSB7DQorICAgICAgICBmV2lkdGhDYWxjID0gRlhfTUlOKGZXaWR0aENhbGMsIGZNYXgpOw0KKyAgICB9DQorICAgIHJldHVybiBmV2lkdGhDYWxjOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0V2lkdGhXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZXaWR0aENhbGMpDQorew0KKyAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0Ow0KKyAgICAgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgICAgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgICAgICBmV2lkdGhDYWxjIC09IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCisgICAgfQ0KKyAgICByZXR1cm4gZldpZHRoQ2FsYzsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQoRlhfRkxPQVQgZkhlaWdodENhbGMpDQorew0KKyAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZUb3BJbnNldCwgZkJvdHRvbUluc2V0Ow0KKyAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgICAgICBmSGVpZ2h0Q2FsYyArPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZk1pbiA9IDAsIGZNYXggPSAwOw0KKyAgICBpZiAodGhpcy0+R2V0TWluSGVpZ2h0KGZNaW4pKSB7DQorICAgICAgICBmSGVpZ2h0Q2FsYyA9IEZYX01BWChmSGVpZ2h0Q2FsYywgZk1pbik7DQorICAgIH0NCisgICAgaWYgKHRoaXMtPkdldE1heEhlaWdodChmTWF4KSAmJiBmTWF4ID4gMCkgew0KKyAgICAgICAgZkhlaWdodENhbGMgPSBGWF9NSU4oZkhlaWdodENhbGMsIGZNYXgpOw0KKyAgICB9DQorICAgIHJldHVybiBmSGVpZ2h0Q2FsYzsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkdldEhlaWdodFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZkhlaWdodENhbGMpDQorew0KKyAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZUb3BJbnNldCwgZkJvdHRvbUluc2V0Ow0KKyAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgICAgICBmSGVpZ2h0Q2FsYyAtPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIGZIZWlnaHRDYWxjOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTdGFydFdpZGdldExheW91dChGWF9GTE9BVCAmZkNhbGNXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KQ0KK3sNCisgICAgSW5pdExheW91dERhdGEoKTsNCisgICAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IEdldFVJVHlwZSgpOw0KKyAgICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0KSB7DQorICAgICAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSAtMTsNCisgICAgICAgIEdldEhlaWdodChtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQpOw0KKyAgICAgICAgU3RhcnRUZXh0TGF5b3V0KGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gLTE7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICAgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgICAgIGlmICghR2V0SGVpZ2h0KGZDYWxjSGVpZ2h0KSkgew0KKyAgICAgICAgICAgIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KGVVSVR5cGUsIGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IGZDYWxjSGVpZ2h0Ow0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChmQ2FsY1dpZHRoIDwgMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgICAgIGlmICghR2V0V2lkdGgoZldpZHRoKSB8fCAhR2V0SGVpZ2h0KGZDYWxjSGVpZ2h0KSkgew0KKyAgICAgICAgICAgIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KGVVSVR5cGUsIGZXaWR0aCwgZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkNhbGNXaWR0aCA9IGZXaWR0aDsNCisgICAgfQ0KKyAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBmQ2FsY0hlaWdodDsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoWEZBX0VMRU1FTlQgZVVJVHlwZSwgRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KQ0KK3sNCisgICAgQ0ZYX1NpemVGIHN6Ow0KKyAgICBzei5TZXQoZldpZHRoLCBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQpOw0KKyAgICBzd2l0Y2goZVVJVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQorICAgICAgICAgICAgQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzeik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCisgICAgICAgICAgICBDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShzeik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCisgICAgICAgICAgICBDYWxjdWxhdGVQdXNoQnV0dG9uQXV0b1NpemUoc3opOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCisgICAgICAgICAgICBDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKHN6KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICAgICAgICBDYWxjdWxhdGVUZXh0RWRpdEF1dG9TaXplKHN6KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2U6DQorICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VBdXRvU2l6ZShzeik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0FyYzoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZToNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgICAgICAgICAgQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc3opOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBmV2lkdGggPSBzei54Ow0KKyAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBzei55Ow0KKyAgICBmQ2FsY0hlaWdodCA9IHN6Lnk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkZpbmRTcGxpdFBvcyhGWF9JTlQzMiBpQmxvY2tJbmRleCwgRlhfRkxPQVQgJmZDYWxjSGVpZ2h0KQ0KK3sNCisgICAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IChYRkFfRUxFTUVOVClHZXRVSVR5cGUoKTsNCisgICAgaWYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChlVUlUeXBlICE9IFhGQV9FTEVNRU5UX1RleHQgJiYgZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCAmJiBlVUlUeXBlICE9IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0ICYmIGVVSVR5cGUgIT0gWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0KSB7DQorICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVG9wSW5zZXQgPSAwOw0KKyAgICBGWF9GTE9BVCBmQm90dG9tSW5zZXQgPSAwOw0KKyAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICAgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgICAgICAgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICAgICAgICAgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgICAgICAgdGhpcy0+R2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQorICAgICAgICBmVG9wSW5zZXQgKz0gcnRVSU1hcmdpbi50b3A7DQorICAgICAgICBmQm90dG9tSW5zZXQgKz0gcnRVSU1hcmdpbi53aWR0aDsNCisgICAgfQ0KKyAgICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0KSB7DQorICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gZkNhbGNIZWlnaHQ7DQorICAgICAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gZkNhbGNIZWlnaHQgLSBmVG9wSW5zZXQ7DQorICAgICAgICAgICAgaWYgKGZDYWxjSGVpZ2h0IDwgMCkgew0KKyAgICAgICAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9ICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRMYXlvdXQ7DQorICAgICAgICBwVGV4dExheW91dC0+RG9MYXlvdXQoaUJsb2NrSW5kZXgsIGZDYWxjSGVpZ2h0LCBmQ2FsY0hlaWdodCwgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0IC0gZlRvcEluc2V0KTsNCisgICAgICAgIGlmIChmQ2FsY0hlaWdodCAhPSAwKSB7DQorICAgICAgICAgICAgaWYgKGlCbG9ja0luZGV4ID09IDApIHsNCisgICAgICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSBmQ2FsY0hlaWdodCArIGZUb3BJbnNldDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGZhYnMoZkhlaWdodCAtIGZDYWxjSGVpZ2h0KSAgPCBYRkFfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgICAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOw0KKyAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICAgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBHZXRDYXB0aW9uKCk7DQorICAgICAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7DQorICAgICAgICAgICAgaUNhcFBsYWNlbWVudCA9IChYRkFfQVRUUklCVVRFRU5VTSljYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCisgICAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24uR2V0UmVzZXJ2ZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wICYmIGZDYWxjSGVpZ2h0IDwgZkNhcFJlc2VydmUgKyBmVG9wSW5zZXQpIHsNCisgICAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20gJiYgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0IC0gZkNhcFJlc2VydmUgLSBmQm90dG9tSW5zZXQpIHsNCisgICAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3ApIHsNCisgICAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxpbmVzQ291bnQgPSAwOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIHRoaXMtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgICAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGlMaW5lc0NvdW50ID0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICghKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgICAgICAgICAgIEdldFdpZHRoKGZXaWR0aCk7DQorICAgICAgICAgICAgQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoZVVJVHlwZSwgZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgICAgIGlMaW5lc0NvdW50ID0gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQtPkdldFRvdGFsTGluZXMoKTsNCisgICAgfQ0KKyAgICBpZiAoISgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXkpIHsNCisgICAgICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXkgPSBGWF9ORVcgQ0ZYX0Zsb2F0QXJyYXk7DQorICAgIH0NCisgICAgQ0ZYX0Zsb2F0QXJyYXkqIHBGaWVsZEFycmF5ID0gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcEZpZWxkU3BsaXRBcnJheTsNCisgICAgRlhfSU5UMzIgaUZpZWxkU3BsaXRDb3VudCA9IHBGaWVsZEFycmF5LT5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQmxvY2tJbmRleCAqIDM7IGkgKz0gMykgew0KKyAgICAgICAgaUxpbmVzQ291bnQgLT0gKEZYX0lOVDMyKXBGaWVsZEFycmF5LT5HZXRBdChpICsgMSk7DQorICAgICAgICBmSGVpZ2h0IC09IHBGaWVsZEFycmF5LT5HZXRBdChpICsgMik7DQorICAgIH0NCisgICAgaWYgKGlMaW5lc0NvdW50ID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IEdldExpbmVIZWlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsNCisgICAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSBpTGluZXNDb3VudCAqIGZMaW5lSGVpZ2h0IC0gZkxpbmVIZWlnaHQgKyBmRm9udFNpemU7DQorICAgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlID0gMDsNCisgICAgRlhfRkxPQVQgZlN0YXJ0T2Zmc2V0ID0gMDsNCisgICAgaWYgKGZIZWlnaHQgPiAwLjFmICYmIGlCbG9ja0luZGV4ID09IDApIHsNCisgICAgICAgIGZTdGFydE9mZnNldCA9IGZUb3BJbnNldDsNCisgICAgICAgIGZIZWlnaHQgLT0gKGZUb3BJbnNldCArIGZCb3R0b21JbnNldCk7DQorICAgICAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSB0aGlzLT5HZXRQYXJhKCkpIHsNCisgICAgICAgICAgICBmU3BhY2VBYm92ZSA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7DQorICAgICAgICAgICAgZkhlaWdodCAtPSAoZlNwYWNlQWJvdmUgKyBmU3BhY2VCZWxvdyk7DQorICAgICAgICAgICAgc3dpdGNoIChwYXJhLkdldFZlcnRpY2FsQWxpZ24oKSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCisgICAgICAgICAgICAgICAgICAgIGZTdGFydE9mZnNldCArPSBmU3BhY2VBYm92ZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCisgICAgICAgICAgICAgICAgICAgIGZTdGFydE9mZnNldCArPSAoKGZIZWlnaHQgLSBmVGV4dEhlaWdodCkgLyAyICsgZlNwYWNlQWJvdmUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgICAgICAgICAgICAgZlN0YXJ0T2Zmc2V0ICs9IChmSGVpZ2h0IC0gZlRleHRIZWlnaHQgKyBmU3BhY2VBYm92ZSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZlN0YXJ0T2Zmc2V0IDwgMC4xZikgew0KKyAgICAgICAgICAgIGZTdGFydE9mZnNldCA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gaUJsb2NrSW5kZXggLSAxOyBpQmxvY2tJbmRleCA+IDAgJiYgaSA8IGlCbG9ja0luZGV4OyBpKyspIHsNCisgICAgICAgIGZTdGFydE9mZnNldCA9IHBGaWVsZEFycmF5LT5HZXRBdChpICogMykgLSBwRmllbGRBcnJheS0+R2V0QXQoaSAqIDMgKyAyKTsNCisgICAgICAgIGlmIChmU3RhcnRPZmZzZXQgPCAwLjFmKSB7DQorICAgICAgICAgICAgZlN0YXJ0T2Zmc2V0ID0gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsNCisgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdCgwLCBmU3RhcnRPZmZzZXQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZChmU3RhcnRPZmZzZXQpOw0KKyAgICB9DQorICAgIFhGQV9WRVJTSU9OIHZlcnNpb24gPSBHZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICAgIEZYX0JPT0wgYkNhblNwbGl0Tm9Db250ZW50ID0gRkFMU0U7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRNb2RlOw0KKyAgICB0aGlzLT5HZXROb2RlKCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBlTGF5b3V0TW9kZSwgVFJVRSk7DQorICAgIGlmICgoZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24gfHwgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgfHwgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93IHx8IGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSAmJiB2ZXJzaW9uID4gWEZBX1ZFUlNJT05fMjA4KSB7DQorICAgICAgICBiQ2FuU3BsaXROb0NvbnRlbnQgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmICgoZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgfHwgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93IHx8IGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSAmJiB2ZXJzaW9uIDw9IFhGQV9WRVJTSU9OXzIwOCkgew0KKyAgICAgICAgaWYgKGZTdGFydE9mZnNldCA8IGZDYWxjSGVpZ2h0KSB7DQorICAgICAgICAgICAgYkNhblNwbGl0Tm9Db250ZW50ID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQ2FuU3BsaXROb0NvbnRlbnQpIHsNCisgICAgICAgIGlmICgoZkNhbGNIZWlnaHQgLSBmVG9wSW5zZXQgLSBmU3BhY2VBYm92ZSA8IGZMaW5lSGVpZ2h0KSkgew0KKyAgICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChmU3RhcnRPZmZzZXQgKyBYRkFfRkxPQVRfUEVSQ0lTSU9OID49IGZDYWxjSGVpZ2h0KSB7DQorICAgICAgICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAxLCAwKTsNCisgICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDIsIGZDYWxjSGVpZ2h0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKDApOw0KKyAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZDYWxjSGVpZ2h0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZDYWxjSGVpZ2h0IC0gZlN0YXJ0T2Zmc2V0IDwgZkxpbmVIZWlnaHQpIHsNCisgICAgICAgICAgICBmQ2FsY0hlaWdodCA9IGZTdGFydE9mZnNldDsNCisgICAgICAgICAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsNCisgICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDEsIDApOw0KKyAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoMCk7DQorICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZUZXh0TnVtID0gZkNhbGNIZWlnaHQgKyBYRkFfRkxPQVRfUEVSQ0lTSU9OIC0gZkNhcFJlc2VydmUgLSBmU3RhcnRPZmZzZXQ7DQorICAgICAgICBGWF9JTlQzMiBpTGluZU51bSA9IChGWF9JTlQzMikoKGZUZXh0TnVtICsgKGZMaW5lSGVpZ2h0IC0gZkZvbnRTaXplKSkgLyBmTGluZUhlaWdodCk7DQorICAgICAgICBpZiAoaUxpbmVOdW0gPj0gaUxpbmVzQ291bnQpIHsNCisgICAgICAgICAgICBpZiAoZkNhbGNIZWlnaHQgLSBmU3RhcnRPZmZzZXQgLSBmVGV4dEhlaWdodCA+PSBmRm9udFNpemUpIHsNCisgICAgICAgICAgICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgICAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMSwgKEZYX0ZMT0FUKWlMaW5lc0NvdW50KTsNCisgICAgICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAyLCBmQ2FsY0hlaWdodCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKChGWF9GTE9BVClpTGluZXNDb3VudCk7DQorICAgICAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZDYWxjSGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChmSGVpZ2h0IC0gZlN0YXJ0T2Zmc2V0IC0gZlRleHRIZWlnaHQgPCBmRm9udFNpemUpIHsNCisgICAgICAgICAgICAgICAgaUxpbmVOdW0gLT0gMTsNCisgICAgICAgICAgICAgICAgaWYgKGlMaW5lTnVtID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUxpbmVOdW0gPSAoRlhfSU5UMzIpKGZUZXh0TnVtIC8gZkxpbmVIZWlnaHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpTGluZU51bSA+IDApIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmU3BsaXRIZWlnaHQgPSBpTGluZU51bSAqIGZMaW5lSGVpZ2h0ICArIGZDYXBSZXNlcnZlICsgZlN0YXJ0T2Zmc2V0Ow0KKyAgICAgICAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgew0KKyAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMSwgKEZYX0ZMT0FUKWlMaW5lTnVtKTsNCisgICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDIsIGZTcGxpdEhlaWdodCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgoRlhfRkxPQVQpaUxpbmVOdW0pOw0KKyAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZTcGxpdEhlaWdodCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChmYWJzKGZTcGxpdEhlaWdodCAtIGZDYWxjSGVpZ2h0KSAgPCBYRkFfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSBmU3BsaXRIZWlnaHQ7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZkNhbGNIZWlnaHQgPSAwOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6SW5pdExheW91dERhdGEoKQ0KK3sNCisgICAgaWYgKG1fcExheW91dERhdGEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKEdldFVJVHlwZSgpKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgICAgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX1RleHRMYXlvdXREYXRhOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQorICAgICAgICAgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX1RleHRFZGl0RGF0YTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlOg0KKyAgICAgICAgICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9JbWFnZUxheW91dERhdGE7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQorICAgICAgICAgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX0ltYWdlRWRpdERhdGE7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICBtX3BMYXlvdXREYXRhID0gRlhfTkVXIENYRkFfRmllbGRMYXlvdXREYXRhOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX1dpZGdldExheW91dERhdGE7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6U3RhcnRUZXh0TGF5b3V0KEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpDQorew0KKyAgICBMb2FkVGV4dCgpOw0KKyAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dDsNCisgICAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSAwOw0KKyAgICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7DQorICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZkNhbGNXaWR0aCk7DQorICAgICAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZldpZHRoKTsNCisgICAgICAgIGZUZXh0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7DQorICAgICAgICBmVGV4dEhlaWdodCA9IEdldEhlaWdodFdpdGhvdXRNYXJnaW4oZlRleHRIZWlnaHQpOw0KKyAgICAgICAgcFRleHRMYXlvdXQtPkRvTGF5b3V0KDAsIGZUZXh0SGVpZ2h0LCAtMSwgZlRleHRIZWlnaHQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IEdldFdpZHRoV2l0aG91dE1hcmdpbihmQ2FsY1dpZHRoKTsNCisgICAgICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOw0KKyAgICB9DQorICAgIGlmIChmQ2FsY1dpZHRoIDwgMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgICAgIEZYX0ZMT0FUIGZNYXhXaWR0aCA9IC0xOw0KKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gR2V0V2lkdGgoZk1heFdpZHRoKTsNCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZNYXhXaWR0aCk7DQorICAgICAgICAgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmTWF4V2lkdGgpOw0KKyAgICAgICAgICAgIGZNYXhXaWR0aCA9IENhbGN1bGF0ZVdpZGdldEF1dG9XaWR0aChmV2lkdGgpOw0KKyAgICAgICAgICAgIGZXaWR0aCA9IEdldFdpZHRoV2l0aG91dE1hcmdpbihmTWF4V2lkdGgpOw0KKyAgICAgICAgICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkNhbGNXaWR0aCA9IGZNYXhXaWR0aDsNCisgICAgfQ0KKyAgICBpZiAobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0IDwgMCkgew0KKyAgICAgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gcFRleHRMYXlvdXQtPkdldExheW91dEhlaWdodCgpOw0KKyAgICAgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gQ2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQpOw0KKyAgICB9DQorICAgIGZUZXh0SGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KKyAgICBmVGV4dEhlaWdodCA9IEdldEhlaWdodFdpdGhvdXRNYXJnaW4oZlRleHRIZWlnaHQpOw0KKyAgICBwVGV4dExheW91dC0+RG9MYXlvdXQoMCwgZlRleHRIZWlnaHQsIC0xLCBmVGV4dEhlaWdodCk7DQorICAgIGZDYWxjSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpMb2FkQ2FwdGlvbigpDQorew0KKyAgICBJbml0TGF5b3V0RGF0YSgpOw0KKyAgICByZXR1cm4gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPkxvYWRDYXB0aW9uKHRoaXMpOw0KK30NCitDWEZBX1RleHRMYXlvdXQqIENYRkFfV2lkZ2V0QWNjOjpHZXRDYXB0aW9uVGV4dExheW91dCgpDQorew0KKyAgICByZXR1cm4gbV9wTGF5b3V0RGF0YSA/ICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BDYXBUZXh0TGF5b3V0IDogTlVMTDsNCit9DQorQ1hGQV9UZXh0TGF5b3V0KiBDWEZBX1dpZGdldEFjYzo6R2V0VGV4dExheW91dCgpDQorew0KKyAgICByZXR1cm4gbV9wTGF5b3V0RGF0YSA/ICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRMYXlvdXQgOiBOVUxMOw0KK30NCitDRlhfRElCaXRtYXAqIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUltYWdlKCkNCit7DQorICAgIHJldHVybiBtX3BMYXlvdXREYXRhID8gKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwIDogTlVMTDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDWEZBX1dpZGdldEFjYzo6R2V0SW1hZ2VFZGl0SW1hZ2UoKQ0KK3sNCisgICAgcmV0dXJuIG1fcExheW91dERhdGEgPyAoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwIDogTlVMTDsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0SW1hZ2VJbWFnZShDRlhfRElCaXRtYXAqIG5ld0ltYWdlKQ0KK3sNCisgICAgaWYoKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID09IG5ld0ltYWdlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYoKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwICYmICEoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9iTmFtZWRJbWFnZSkgew0KKyAgICAgICAgZGVsZXRlICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcDsNCisgICAgICAgICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCA9IE5VTEw7DQorICAgIH0NCisgICAgKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gbmV3SW1hZ2U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpDQorew0KKyAgICBpZigoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID09IG5ld0ltYWdlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYoKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCAmJiAhKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX2JOYW1lZEltYWdlKSB7DQorICAgICAgICBkZWxldGUgKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcDsNCisgICAgICAgICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgICB9DQorICAgICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPSBuZXdJbWFnZTsNCit9DQorQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBDWEZBX1dpZGdldEFjYzo6R2V0V2lkZ2V0TGF5b3V0RGF0YSgpDQorew0KKyAgICByZXR1cm4gbV9wTGF5b3V0RGF0YTsNCit9DQorSUZYX0ZvbnQqIENYRkFfV2lkZ2V0QWNjOjpHZXRGREVGb250KCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0ZvbnROYW1lID0gRlhfV1NUUkMoTCJDb3VyaWVyIik7DQorICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlID0gMDsNCisgICAgaWYgKENYRkFfRm9udCBmb250ID0gdGhpcy0+R2V0Rm9udCgpKSB7DQorICAgICAgICBpZiAoZm9udC5Jc0JvbGQoKSkgew0KKyAgICAgICAgICAgIGR3Rm9udFN0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZvbnQuSXNJdGFsaWMoKSkgew0KKyAgICAgICAgICAgIGR3Rm9udFN0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgICAgICB9DQorICAgICAgICBmb250LkdldFR5cGVmYWNlKHdzRm9udE5hbWUpOw0KKyAgICB9DQorICAgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsNCisgICAgcmV0dXJuIHBEb2MtPkdldEFwcCgpLT5HZXRYRkFGb250TWdyKCktPkdldEZvbnQoKFhGQV9IRE9DKXBEb2MsIHdzRm9udE5hbWUsIGR3Rm9udFN0eWxlKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkdldEZvbnRTaXplKCkNCit7DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEwLjBmOw0KKyAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSB0aGlzLT5HZXRGb250KCkpIHsNCisgICAgICAgIGZGb250U2l6ZSA9IGZvbnQuR2V0Rm9udFNpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZkZvbnRTaXplIDwgMC4xZiA/IDEwLjBmIDogZkZvbnRTaXplOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0TGluZUhlaWdodCgpDQorew0KKyAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDA7DQorICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IHRoaXMtPkdldFBhcmEoKSkgew0KKyAgICAgICAgZkxpbmVIZWlnaHQgPSBwYXJhLkdldExpbmVIZWlnaHQoKTsNCisgICAgfQ0KKyAgICBpZiAoZkxpbmVIZWlnaHQgPCAxKSB7DQorICAgICAgICBmTGluZUhlaWdodCA9IEdldEZvbnRTaXplKCkgKiAxLjJmOw0KKyAgICB9DQorICAgIHJldHVybiBmTGluZUhlaWdodDsNCit9DQorRlhfQVJHQiBDWEZBX1dpZGdldEFjYzo6R2V0VGV4dENvbG9yKCkNCit7DQorICAgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHRoaXMtPkdldEZvbnQoKSkgew0KKyAgICAgICAgcmV0dXJuIGZvbnQuR2V0Q29sb3IoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMHhGRjAwMDAwMDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1RleHRQcm92aWRlcjo6R2V0VGV4dE5vZGUoRlhfQk9PTCAmYlJpY2hUZXh0KQ0KK3sNCisgICAgYlJpY2hUZXh0ID0gRkFMU0U7DQorICAgIGlmIChtX3BUZXh0Tm9kZSkgew0KKyAgICAgICAgaWYgKG1fcFRleHROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICAgICAgICBtX3BUZXh0Tm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIEZBTFNFKTsNCisgICAgICAgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KKyAgICAgICAgICAgICAgICBiUmljaFRleHQgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtX3BUZXh0Tm9kZTsNCisgICAgfQ0KKyAgICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7DQorICAgICAgICBDWEZBX05vZGUqIHBFbGVtZW50Tm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgICAgICAgQ1hGQV9Ob2RlICpwVmFsdWVOb2RlID0gcEVsZW1lbnROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICBpZiAoIXBWYWx1ZU5vZGUpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSAqcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGlmIChwQ2hpbGROb2RlICYmIHBDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgICAgICAgICAgYlJpY2hUZXh0ID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcENoaWxkTm9kZTsNCisgICAgfSBlbHNlIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBCaW5kID0gbV9wV2lkZ2V0QWNjLT5HZXREYXRhc2V0cygpOw0KKyAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBCaW5kLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxOb2RlKTsNCisgICAgICAgIGZvcihJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocFhNTENoaWxkLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxDaGlsZDsNCisgICAgICAgICAgICAgICAgaWYoWEZBX1JlY29nbml6ZVJpY2hUZXh0KHBFbGVtZW50KSkgew0KKyAgICAgICAgICAgICAgICAgICAgYlJpY2hUZXh0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwQmluZDsNCisgICAgfSBlbHNlIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24pIHsNCisgICAgICAgIENYRkFfTm9kZSAqcENhcHRpb25Ob2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NhcHRpb24pOw0KKyAgICAgICAgaWYgKHBDYXB0aW9uTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUgKnBWYWx1ZU5vZGUgPSBwQ2FwdGlvbk5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgIGlmIChwVmFsdWVOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSAqcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGlmIChwQ2hpbGROb2RlICYmIHBDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgICAgICAgICAgYlJpY2hUZXh0ID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcENoaWxkTm9kZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUgKnBJdGVtTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgIGlmIChwSXRlbU5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICB3aGlsZShwTm9kZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICAgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9Sb2xsb3ZlciAmJiB3c05hbWUgPT0gRlhfV1NUUkMoTCJyb2xsb3ZlciIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93biAmJiB3c05hbWUgPT0gRlhfV1NUUkMoTCJkb3duIikpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1BhcmEgQ1hGQV9UZXh0UHJvdmlkZXI6OkdldFBhcmFOb2RlKCkNCit7DQorICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpIHsNCisgICAgICAgIHJldHVybiBtX3BXaWRnZXRBY2MtPkdldFBhcmEoKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUgKnBOb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NhcHRpb24pOw0KKyAgICByZXR1cm4gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BhcmEpOw0KK30NCitDWEZBX0ZvbnQgQ1hGQV9UZXh0UHJvdmlkZXI6OkdldEZvbnROb2RlKCkNCit7DQorICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpIHsNCisgICAgICAgIHJldHVybiBtX3BXaWRnZXRBY2MtPkdldEZvbnQoKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUgKnBOb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NhcHRpb24pOw0KKyAgICBwTm9kZSA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Gb250KTsNCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFdpZGdldEFjYy0+R2V0Rm9udCgpOw0KK30NCitGWF9CT09MCUNYRkFfVGV4dFByb3ZpZGVyOjpJc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkNCit7DQorICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gbV9wV2lkZ2V0QWNjLT5HZXRVSVR5cGUoKTsNCisgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uKSB7DQorICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgICAgICAgcmV0dXJuICFtX3BXaWRnZXRBY2MtPkdldFdpZHRoKGZXaWR0aCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dFByb3ZpZGVyOjpHZXRFbWJiZWRPYmooRlhfQk9PTCBiVVJJLCBGWF9CT09MIGJSYXcsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKQ0KK3sNCisgICAgaWYgKG1fZVR5cGUgIT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChiVVJJKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCk7DQorICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgICAgIENYRkFfTm9kZSogcElETm9kZSA9IE5VTEw7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcEVtYkFjYyA9IE5VTEw7DQorICAgICAgICBpZiAocFBhcmVudCkgew0KKyAgICAgICAgICAgIHBJRE5vZGUgPSBwRG9jdW1lbnQtPkdldE5vZGVCeUlEKHBQYXJlbnQsIHdzQXR0cik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIXBJRE5vZGUpIHsNCisgICAgICAgICAgICBwSUROb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pLCB3c0F0dHIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJRE5vZGUpIHsNCisgICAgICAgICAgICBwRW1iQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSUROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEVtYkFjYykgew0KKyAgICAgICAgICAgIHBFbWJBY2MtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGFjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Zjk2NzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9XSURHRVRBQ0NfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfV0lER0VUQUNDX0lNUF9IDQorI2luY2x1ZGUgInhmYV90ZXh0bGF5b3V0LmgiDQorZW51bSBYRkFfVEVYVFBST1ZJREVSVFlQRSB7DQorICAgIFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQsDQorICAgIFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzLA0KKyAgICBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uLA0KKyAgICBYRkFfVEVYVFBST1ZJREVSVFlQRV9Sb2xsb3ZlciwNCisgICAgWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93biwNCit9Ow0KK2NsYXNzIENYRkFfVGV4dFByb3ZpZGVyIDogcHVibGljIElYRkFfVGV4dFByb3ZpZGVyLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfVGV4dFByb3ZpZGVyKENYRkFfV2lkZ2V0QWNjICpwV2lkZ2V0QWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRSBlVHlwZSwgQ1hGQV9Ob2RlKiBwVGV4dE5vZGUgPSBOVUxMKQ0KKyAgICAgICAgOiBtX3BXaWRnZXRBY2MocFdpZGdldEFjYyksIG1fZVR5cGUoZVR5cGUpLCBtX3BUZXh0Tm9kZShwVGV4dE5vZGUpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX3BXaWRnZXRBY2MgIT0gTlVMTCk7DQorICAgIH0NCisgICAgdmlydHVhbCB+Q1hGQV9UZXh0UHJvdmlkZXIoKSB7fQ0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCUdldFRleHROb2RlKEZYX0JPT0wgJmJSaWNoVGV4dCk7DQorICAgIHZpcnR1YWwgQ1hGQV9QYXJhCQlHZXRQYXJhTm9kZSgpOw0KKyAgICB2aXJ0dWFsIENYRkFfRm9udAkJR2V0Rm9udE5vZGUoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJSXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpOw0KKyAgICB2aXJ0dWFsIENYRkFfRkZEb2MqCQlHZXREb2NOb2RlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFdpZGdldEFjYy0+R2V0RG9jKCk7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQkJR2V0RW1iYmVkT2JqKEZYX0JPT0wgYlVSSSwgRlhfQk9PTCBiUmF3LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSk7DQorcHJvdGVjdGVkOg0KKyAgICBDWEZBX1dpZGdldEFjYwkJCSptX3BXaWRnZXRBY2M7DQorICAgIFhGQV9URVhUUFJPVklERVJUWVBFCW1fZVR5cGU7DQorICAgIENYRkFfTm9kZSoJCQkJbV9wVGV4dE5vZGU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZGYzYTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcApAQCAtMCwwICsxLDU5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0aGFuZGxlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmY2hvaWNlbGlzdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KK0NYRkFfRkZXaWRnZXRIYW5kbGVyOjpDWEZBX0ZGV2lkZ2V0SGFuZGxlcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpDQorICAgIDogbV9wRG9jVmlldyhwRG9jVmlldykNCit7DQorfQ0KK0NYRkFfRkZXaWRnZXRIYW5kbGVyOjp+Q1hGQV9GRldpZGdldEhhbmRsZXIoKQ0KK3sNCit9DQorSVhGQV9QYWdlVmlldyogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFBhZ2VWaWV3KFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+R2V0UGFnZVZpZXcoKTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0UmVjdChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+R2V0V2lkZ2V0UmVjdChydCk7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRTdGF0dXMoWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5HZXRTdGF0dXMoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0QkJveChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzKQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkdldEJCb3gocnRCb3gsIGR3U3RhdHVzLCBiRHJhd0ZvY3VzKTsNCit9DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXREYXRhQWNjKFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+R2V0RGF0YUFjYygpOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXROYW1lKFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIEZYX0lOVDMyIGlOYW1lVHlwZSApDQorew0KKyAgICAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5HZXREYXRhQWNjKCktPkdldE5hbWUod3NOYW1lLCBpTmFtZVR5cGUpOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRUb29sVGlwKFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c1Rvb2xUaXApDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+R2V0VG9vbFRpcCh3c1Rvb2xUaXApOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpTZXRQcml2YXRlRGF0YShYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9MUFZPSUQgbW9kdWxlX2lkLCBGWF9MUFZPSUQgcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KK30NCitGWF9MUFZPSUQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFByaXZhdGVEYXRhKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0xQVk9JRCBtb2R1bGVfaWQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZUVudGVyKFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPk9uTW91c2VFbnRlcigpOw0KKyAgICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsNCisgICAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZUV4aXQoWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgICAgRlhfQk9PTCBiUmV0ID0gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+T25Nb3VzZUV4aXQoKTsNCisgICAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQorICAgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgbV9wRG9jVmlldy0+TG9ja1VwZGF0ZSgpOw0KKyAgICAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICAgIEZYX0JPT0wgYlJldCA9ICAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5PbkxCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICAgIGlmIChiUmV0ICYmIG1fcERvY1ZpZXctPlNldEZvY3VzKGhXaWRnZXQpKSB7DQorICAgICAgICAoKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpKS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Rm9jdXNXaWRnZXQoKFhGQV9IRE9DKW1fcERvY1ZpZXctPkdldERvYygpLCAoWEZBX0hXSURHRVQpaFdpZGdldCk7DQorICAgIH0NCisgICAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQorICAgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvblVwKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICBtX3BEb2NWaWV3LT5tX2JMYXlvdXRFdmVudCA9IFRSVUU7DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPk9uTEJ1dHRvblVwKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICAgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KKyAgICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICBGWF9CT09MIGJSZXQgPSAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5PbkxCdXR0b25EYmxDbGsoZHdGbGFncywgZngsIGZ5KTsNCisgICAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZU1vdmUoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICBGWF9CT09MIGJSZXQgPSAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5Pbk1vdXNlTW92ZShkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlV2hlZWwoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfU0hPUlQgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQorew0KKyAgICAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPk9uTW91c2VXaGVlbChkd0ZsYWdzLCB6RGVsdGEsIGZ4LCBmeSk7DQorICAgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICBGWF9CT09MIGJSZXQgPSAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5PblJCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICAgIGlmIChiUmV0ICYmIG1fcERvY1ZpZXctPlNldEZvY3VzKGhXaWRnZXQpKSB7DQorICAgICAgICAoKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpKS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Rm9jdXNXaWRnZXQoKFhGQV9IRE9DKW1fcERvY1ZpZXctPkdldERvYygpLCAoWEZBX0hXSURHRVQpaFdpZGdldCk7DQorICAgIH0NCisgICAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25SQnV0dG9uVXAoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICBGWF9CT09MIGJSZXQgPSAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5PblJCdXR0b25VcChkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25EYmxDbGsoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICBGWF9CT09MIGJSZXQgPSAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5PblJCdXR0b25EYmxDbGsoZHdGbGFncywgZngsIGZ5KTsNCisgICAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25LZXlEb3duKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCit7DQorICAgIEZYX0JPT0wgYlJldCA9ICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPk9uS2V5RG93bihkd0tleUNvZGUsIGR3RmxhZ3MpOw0KKyAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICAgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5VXAoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgRlhfQk9PTCBiUmV0ID0gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+T25LZXlVcChkd0tleUNvZGUsIGR3RmxhZ3MpOw0KKyAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkNoYXIoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgRlhfQk9PTCBiUmV0ID0gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+T25DaGFyKGR3Q2hhciwgZHdGbGFncyk7DQorICAgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkhpdFRlc3QoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgaWYgKCEoKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCisgICAgfQ0KKyAgICAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5PbkhpdFRlc3QoZngsIGZ5KTsNCit9DQorRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25TZXRDdXJzb3IoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+T25TZXRDdXJzb3IoZngsIGZ5KTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6UmVuZGVyV2lkZ2V0KFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfQk9PTCBiSGlnaGxpZ2h0KQ0KK3sNCisgICAgKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+UmVuZGVyV2lkZ2V0KHBHUywgcE1hdHJpeCwgYkhpZ2hsaWdodCA/IFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0IDogMCwgMCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Okhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpDQorew0KKyAgICBpZiAoIXBXaWRnZXRBY2MgfHwgZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfVW5rbm93bikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwV2lkZ2V0QWNjLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHN3aXRjaCAoZUV2ZW50VHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOiB7DQorICAgICAgICAgICAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsNCisgICAgICAgICAgICAgICAgaWYgKCFjYWxjKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZTogew0KKyAgICAgICAgICAgICAgICBDWEZBX1ZhbGlkYXRlIHZhbCA9IHBXaWRnZXRBY2MtPkdldFZhbGlkYXRlKCk7DQorICAgICAgICAgICAgICAgIGlmICghdmFsKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHZhbC5HZXRTY3JpcHQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlQXJyYXkgZXZlbnRBcnJheTsNCisgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkdldEV2ZW50QnlBY3Rpdml0eShnc19FdmVudEFjdGl2aXR5W2VFdmVudFR5cGVdLCBldmVudEFycmF5KTsNCit9DQorRlhfSU5UMzIgQ1hGQV9GRldpZGdldEhhbmRsZXI6OlByb2Nlc3NFdmVudChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywgQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pDQorew0KKyAgICBpZiAoIXBQYXJhbSB8fCBwUGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX1Vua25vd24pIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBpZiAoIXBXaWRnZXRBY2MgfHwgcFdpZGdldEFjYy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOg0KKyAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzQ2FsY3VsYXRlKCk7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZToNCisgICAgICAgICAgICBpZiAoKChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKSktPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvY1ZpZXctPkdldERvYygpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc1ZhbGlkYXRlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGU6IHsNCisgICAgICAgICAgICAgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBXaWRnZXRBY2MtPkdldENhbGN1bGF0ZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoIWNhbGMpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gY2FsYy5HZXRTY3JpcHQoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkV4ZWN1dGVTY3JpcHQoc2NyaXB0LCBwUGFyYW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVJldCA9IHBXaWRnZXRBY2MtPlByb2Nlc3NFdmVudChnc19FdmVudEFjdGl2aXR5W3BQYXJhbS0+bV9lVHlwZV0sIHBQYXJhbSk7DQorICAgIHJldHVybiBpUmV0Ow0KK30NCitYRkFfSFdJREdFVCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlV2lkZ2V0KFhGQV9IV0lER0VUIGhQYXJlbnQsIFhGQV9XSURHRVRUWVBFIGVUeXBlLCBYRkFfSFdJREdFVCBoQmVmb3JlICkNCit7DQorICAgIENYRkFfTm9kZSogcFBhcmVudEZvcm1JdGVtID0gaFBhcmVudCA/ICgoQ1hGQV9GRldpZGdldCopaFBhcmVudCktPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpIDogTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlRm9ybUl0ZW0gPSBoQmVmb3JlID8gKChDWEZBX0ZGV2lkZ2V0KiloQmVmb3JlKS0+R2V0RGF0YUFjYygpLT5HZXROb2RlKCkgOiBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBOZXdGb3JtSXRlbSA9IENyZWF0ZVdpZGdldEZvcm1JdGVtKGVUeXBlLCBwUGFyZW50Rm9ybUl0ZW0sIHBCZWZvcmVGb3JtSXRlbSk7DQorICAgIGlmIChwTmV3Rm9ybUl0ZW0gPT0gTlVMTCkJew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcE5ld0Zvcm1JdGVtLT5HZXRUZW1wbGF0ZU5vZGUoKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICBwTmV3Rm9ybUl0ZW0tPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgbV9wRG9jVmlldy0+UnVuTGF5b3V0KCk7DQorICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dCA9IG1fcERvY1ZpZXctPkdldFhGQUxheW91dCgpLT5HZXRMYXlvdXRJdGVtKHBOZXdGb3JtSXRlbSk7DQorICAgIHJldHVybiAoWEZBX0hXSURHRVQpcExheW91dDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oWEZBX1dJREdFVFRZUEUgZVR5cGUsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9CYXJjb2RlOg0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9QdXNoQnV0dG9uOg0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVQdXNoQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9DaGVja0J1dHRvbjoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ2hlY2tCdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7DQorICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0V4Y2x1ZGVHcm91cDoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRXhjbEdyb3VwKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9SYWRpb0J1dHRvbjoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmFkaW9CdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7DQorICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0FyYzoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlQXJjKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9SZWN0YW5nbGU6DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlY3RhbmdsZShwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfSW1hZ2U6DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUltYWdlKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9MaW5lOg0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVMaW5lKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9UZXh0Og0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVUZXh0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9EYXRldGltZUVkaXQ6DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURhdGV0aW1lRWRpdChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfRGVjaW1hbEZpZWxkOg0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVEZWNpbWFsRmllbGQocFBhcmVudCwgcEJlZm9yZSk7DQorICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX051bWVyaWNGaWVsZDoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlTnVtZXJpY0ZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9TaWduYXR1cmU6DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVNpZ25hdHVyZShwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfVGV4dEVkaXQ6DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVRleHRFZGl0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9Ecm9wZG93bkxpc3Q6DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURyb3Bkb3duTGlzdChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfTGlzdEJveDoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlTGlzdEJveChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfSW1hZ2VGaWVsZDoNCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlSW1hZ2VGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUGFzc3dvcmRFZGl0Og0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVQYXNzd29yZEVkaXQocFBhcmVudCwgcEJlZm9yZSk7DQorICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1N1YmZvcm06DQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVN1YmZvcm0ocFBhcmVudCwgcEJlZm9yZSk7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9CdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBDWEZBX05vZGUqIHBDYXB0aW9uID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfQ2FwdGlvbiwgcEZpZWxkKTsNCisgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9WYWx1ZSwgcENhcHRpb24pOw0KKyAgICBDWEZBX05vZGUqIHBUZXh0ID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVGV4dCwgcFZhbHVlKTsNCisgICAgcFRleHQtPlNldENvbnRlbnQoRlhfV1NUUkMoTCJCdXR0b24iKSwgRlhfV1NUUkMoTCJCdXR0b24iKSwgRkFMU0UpOw0KKyAgICBDWEZBX05vZGUqIHBQYXJhID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfUGFyYSwgcENhcHRpb24pOw0KKyAgICBwUGFyYS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlLCBGQUxTRSk7DQorICAgIHBQYXJhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsIEZBTFNFKTsNCisgICAgQ3JlYXRlRm9udE5vZGUocENhcHRpb24pOw0KKyAgICBDWEZBX05vZGUqIHBCb3JkZXIgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9Cb3JkZXIsIHBGaWVsZCk7DQorICAgIHBCb3JkZXItPlNldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwgRkFMU0UpOw0KKyAgICBDWEZBX05vZGUqIHBFZGdlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfRWRnZSwgcEJvcmRlcik7DQorICAgIHBFZGdlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfQVRUUklCVVRFRU5VTV9SYWlzZWQsIEZBTFNFKTsNCisgICAgQ1hGQV9Ob2RlKiBwRmlsbCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ZpbGwsIHBCb3JkZXIpOw0KKyAgICBDWEZBX05vZGUqIHBDb2xvciA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0NvbG9yLCBwRmlsbCk7DQorICAgIHBDb2xvci0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgRlhfV1NUUkMoTCIyMTIsIDIwOCwgMjAwIiksIEZBTFNFKTsNCisgICAgQ1hGQV9Ob2RlKiBwQmluZCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0JpbmQsIHBGaWVsZCk7DQorICAgIHBCaW5kLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gsIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVDaGVja0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICByZXR1cm4gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlRfRXhjbEdyb3VwLCBwUGFyZW50LCBwQmVmb3JlKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUmFkaW9CdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgQ1hGQV9Ob2RlKiBwVWkgPSBwRmllbGQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1VpKTsNCisgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0ID0gcFVpLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9DaGVja0J1dHRvbik7DQorICAgIHBXaWRnZXQtPlNldEVudW0oWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEYXRldGltZUVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIENyZWF0ZVZhbHVlTm9kZShYRkFfRUxFTUVOVF9EYXRlLCBwRmllbGQpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEZWNpbWFsRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZU51bWVyaWNGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgQ3JlYXRlVmFsdWVOb2RlKFhGQV9FTEVNRU5UX0RlY2ltYWwsIHBGaWVsZCk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVTaWduYXR1cmUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX1NpZ25hdHVyZSwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRleHRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9UZXh0RWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURyb3Bkb3duTGlzdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUxpc3RCb3goQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyb3Bkb3duTGlzdChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgQ1hGQV9Ob2RlKiBwVWkgPSBwRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgQ1hGQV9Ob2RlKiBwTGlzdEJveCA9IHBVaS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBwTGlzdEJveC0+U2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9BVFRSSUJVVEVFTlVNX0Fsd2F5cyk7DQorICAgIHBMaXN0Qm94LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVJbWFnZUZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9JbWFnZUVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIENYRkFfTm9kZSogcEJpbmQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9CaW5kLCBwRmllbGQpOw0KKyAgICBwQmluZC0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25lLCBGQUxTRSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlRfRmllbGQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBDWEZBX05vZGUqIHBVaSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1VpLCBwRmllbGQpOw0KKyAgICBDWEZBX05vZGUqIHBDaGVja0J1dHRvbiA9IENyZWF0ZUNvcHlOb2RlKGVFbGVtZW50LCBwVWkpOw0KKyAgICBDcmVhdGVGb250Tm9kZShwRmllbGQpOw0KKyAgICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfQXJjLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUmVjdGFuZ2xlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FTEVNRU5UX1JlY3RhbmdsZSwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FTEVNRU5UX0ltYWdlLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgQ1hGQV9Ob2RlKiBwVWkgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9VaSwgcEZpZWxkKTsNCisgICAgQ1hGQV9Ob2RlKiBwSW1hZ2UgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9JbWFnZUVkaXQsIHBVaSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUxpbmUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfTGluZSwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRleHQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfVGV4dCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICAgIENYRkFfTm9kZSogcFVpID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVWksIHBGaWVsZCk7DQorICAgIENYRkFfTm9kZSogcFRleHRFZGl0ID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVGV4dEVkaXQsIHBVaSk7DQorICAgIENyZWF0ZUZvbnROb2RlKHBGaWVsZCk7DQorICAgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURyYXcoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRHJhdyA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UX0RyYXcsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBDcmVhdGVWYWx1ZU5vZGUoZUVsZW1lbnQsIHBEcmF3KTsNCisgICAgcmV0dXJuIHBEcmF3Ow0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVTdWJmb3JtKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybSA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UX1N1YmZvcm0sIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICByZXR1cm4gcFN1YmZvcm07DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlUGFyZW50ID0gcFBhcmVudCAhPSBOVUxMID8gcFBhcmVudC0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBOZXdGb3JtSXRlbSA9IHBUZW1wbGF0ZVBhcmVudC0+Q2xvbmVUZW1wbGF0ZVRvRm9ybShGQUxTRSk7DQorICAgIGlmIChwUGFyZW50ICE9IE5VTEwpIHsNCisgICAgICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdGb3JtSXRlbSwgcEJlZm9yZSk7DQorICAgIH0NCisgICAgcmV0dXJuIAlwTmV3Rm9ybUl0ZW07DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlUGFyZW50ID0gcFBhcmVudCAhPSBOVUxMID8gcFBhcmVudC0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gQ3JlYXRlVGVtcGxhdGVOb2RlKGVFbGVtZW50LCBwVGVtcGxhdGVQYXJlbnQsIHBCZWZvcmUgPyBwQmVmb3JlLT5HZXRUZW1wbGF0ZU5vZGUoKSA6IE5VTEwpLT5DbG9uZShGQUxTRSk7DQorICAgIGlmIChwUGFyZW50ICE9IE5VTEwpIHsNCisgICAgICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gCXBOZXdOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVUZW1wbGF0ZU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Eb2N1bWVudCogcFhGQURvYyA9IEdldFhGQURvYygpOw0KKyAgICBDWEZBX05vZGUqIHBOZXdUZW1wbGF0ZU5vZGUgPSBwWEZBRG9jLT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpLT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUsIGVFbGVtZW50KTsNCisgICAgaWYgKHBQYXJlbnQgIT0gTlVMTCkgew0KKyAgICAgICAgcFBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld1RlbXBsYXRlTm9kZSwgcEJlZm9yZSk7DQorICAgIH0NCisgICAgcmV0dXJuIHBOZXdUZW1wbGF0ZU5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSogcEZvbnQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9Gb250LCBwUGFyZW50KTsNCisgICAgcEZvbnQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIEZYX1dTVFJDKEwiTXlyaWFkIFBybyIpLCBGQUxTRSk7DQorICAgIHJldHVybiBwRm9udDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTWFyZ2luTm9kZShDWEZBX05vZGUqIHBQYXJlbnQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZJbnNldHNbNF0pIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUqIHBNYXJnaW4gPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9NYXJnaW4sIHBQYXJlbnQpOw0KKyAgICBpZiAoZHdGbGFncyAmIDB4MDEpIHsNCisgICAgICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1swXSwgWEZBX1VOSVRfUHQpLCBGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKGR3RmxhZ3MgJiAweDAyKSB7DQorICAgICAgICBwTWFyZ2luLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1sxXSwgWEZBX1VOSVRfUHQpLCBGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7DQorICAgICAgICBwTWFyZ2luLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzJdLCBYRkFfVU5JVF9QdCksIEZBTFNFKTsNCisgICAgfQ0KKyAgICBpZiAoZHdGbGFncyAmIDB4MDgpIHsNCisgICAgICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzNdLCBYRkFfVU5JVF9QdCksIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcE1hcmdpbjsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVmFsdWVOb2RlKFhGQV9FTEVNRU5UIGVWYWx1ZSwgQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9WYWx1ZSwgcFBhcmVudCk7DQorICAgIENYRkFfTm9kZSogcERhdGUgPSBDcmVhdGVDb3B5Tm9kZShlVmFsdWUsIHBWYWx1ZSk7DQorICAgIHJldHVybiBwVmFsdWU7DQorfQ0KK0lYRkFfT2JqRmFjdG9yeSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldE9iakZhY3RvcnkoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEdldFhGQURvYygpLT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KK30NCitDWEZBX0RvY3VtZW50KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0WEZBRG9jKCkgY29uc3QNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZEb2MqKShtX3BEb2NWaWV3LT5HZXREb2MoKSkpLT5HZXRYRkFEb2MoKTsNCit9DQorQ1hGQV9GRk1lbnVIYW5kbGVyOjpDWEZBX0ZGTWVudUhhbmRsZXIoKQ0KK3sNCit9DQorQ1hGQV9GRk1lbnVIYW5kbGVyOjp+Q1hGQV9GRk1lbnVIYW5kbGVyKCkNCit7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5Db3B5KFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Q2FuQ29weSgpOw0KK30NCitGWF9CT09MCUNYRkFfRkZNZW51SGFuZGxlcjo6Q2FuQ3V0KFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5QYXN0ZShYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkNhblBhc3RlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5TZWxlY3RBbGwoWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5DYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhbkRlbGV0ZShYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkNhbkRlbGV0ZSgpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuRGVTZWxlY3QoWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5DYW5EZVNlbGVjdCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q29weShYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkNvcHkod3NUZXh0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkN1dChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkN1dCh3c1RleHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6UGFzdGUoWEZBX0hXSURHRVQgaFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5QYXN0ZSh3c1RleHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6U2VsZWN0QWxsKFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+U2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpEZWxldGUoWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5EZWxldGUoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkRlU2VsZWN0KFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+RGVTZWxlY3QoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhblVuZG8oWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5SZWRvKFhGQV9IV0lER0VUIGhXaWRnZXQpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6VW5kbyhYRkFfSFdJREdFVCBoV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPlVuZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlJlZG8oWEZBX0hXSURHRVQgaFdpZGdldCkNCit7DQorICAgIHJldHVybiAoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5SZWRvKCk7DQorfQ0KKyNkZWZpbmUgRlhfRURJVF9JU0xBVElOV09SRCh1KQkodSA9PSAweDJEIHx8ICh1IDw9IDB4MDA1QSAmJiB1ID49IDB4MDA0MSkgfHwgKHUgPD0gMHgwMDdBICYmIHUgPj0gMHgwMDYxKSB8fCAodSA8PSAweDAyQUYgJiYgdSA+PSAweDAwQzApIHx8IHUgPT0gMHgwMDI3KQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpHZXRTdWdnZXN0V29yZHMoWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KK3sNCisgICAgcmV0dXJuICgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlJlcGxhY2VTcGVsbENoZWNrV29yZChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUG9pbnRGIHBvaW50ZiwgRlhfQlNUUiBic1JlcGxhY2UpDQorew0KKyAgICByZXR1cm4gKChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0KS0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTg3OTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0FOTk9USEFORExFUl9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9BTk5PVEhBTkRMRVJfSU1QX0gNCitjbGFzcyBDWEZBX0ZGRG9jVmlldzsNCitjbGFzcyBDWEZBX0ZGV2lkZ2V0SGFuZGxlciA6IHB1YmxpYyBJWEZBX1dpZGdldEhhbmRsZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GRldpZGdldEhhbmRsZXIoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KTsNCisgICAgfkNYRkFfRkZXaWRnZXRIYW5kbGVyKCk7DQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQJCUNyZWF0ZVdpZGdldChYRkFfSFdJREdFVCBoUGFyZW50LCBYRkFfV0lER0VUVFlQRSBlVHlwZSwgWEZBX0hXSURHRVQgaEJlZm9yZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIElYRkFfUGFnZVZpZXcqCUdldFBhZ2VWaWV3KFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlHZXRSZWN0KFhGQV9IV0lER0VUIGhXaWRnZXQsIENGWF9SZWN0RiAmcnQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRTdGF0dXMoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJCb3goWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1JlY3RGICZydEJveCwgRlhfRFdPUkQgZHdTdGF0dXMsIEZYX0JPT0wgYkRyYXdGb2N1cyA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJR2V0RGF0YUFjYyhYRkFfSFdJREdFVCBoV2lkZ2V0KTsNCisgICAgdmlydHVhbCB2b2lkCQkJR2V0TmFtZShYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBGWF9JTlQzMiBpTmFtZVR5cGUgPSAwKTsNCisgICAgdmlydHVhbAlGWF9CT09MCQkJR2V0VG9vbFRpcChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUb29sVGlwKTsNCisgICAgdmlydHVhbAl2b2lkCQkJU2V0UHJpdmF0ZURhdGEoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfTFBWT0lEIG1vZHVsZV9pZCwgRlhfTFBWT0lEIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQorICAgIHZpcnR1YWwJRlhfTFBWT0lECQlHZXRQcml2YXRlRGF0YShYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9MUFZPSUQgbW9kdWxlX2lkKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRW50ZXIoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZUV4aXQoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uRG93bihYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvblVwKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uRGJsQ2xrKFhGQV9IV0lER0VUIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZU1vdmUoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlV2hlZWwoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfU0hPUlQgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRvd24oWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25VcChYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRibENsayhYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5RG93bihYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5VXAoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPbkNoYXIoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgICAgdmlydHVhbAlGWF9EV09SRAlPbkhpdFRlc3QoWEZBX0hXSURHRVQgaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlPblNldEN1cnNvcihYRkFfSFdJREdFVCBoV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCVJlbmRlcldpZGdldChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0JPT0wgYkhpZ2hsaWdodCA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlIYXNFdmVudChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVdpZGdldEZvcm1JdGVtKFhGQV9XSURHRVRUWVBFIGVUeXBlLCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorDQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVB1c2hCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQlDcmVhdGVDaGVja0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZUV4Y2xHcm91cChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVJhZGlvQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlRGF0ZXRpbWVFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlRGVjaW1hbEZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlTnVtZXJpY0ZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlU2lnbmF0dXJlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlVGV4dEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQlDcmVhdGVEcm9wZG93bkxpc3QoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQlDcmVhdGVMaXN0Qm94KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlSW1hZ2VGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVBhc3N3b3JkRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZUFyYyhDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVJlY3RhbmdsZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZUltYWdlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlTGluZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVRleHQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQlDcmVhdGVEcmF3KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorDQorICAgIENYRkFfTm9kZSoJCUNyZWF0ZVN1YmZvcm0oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQlDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQkJQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlID0gTlVMTCkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCQlDcmVhdGVUZW1wbGF0ZU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJCUNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCQlDcmVhdGVNYXJnaW5Ob2RlKENYRkFfTm9kZSogcFBhcmVudCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZkluc2V0c1s0XSkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCQlDcmVhdGVWYWx1ZU5vZGUoWEZBX0VMRU1FTlQgZVZhbHVlLCBDWEZBX05vZGUqIHBQYXJlbnQpIGNvbnN0Ow0KKyAgICBJWEZBX09iakZhY3RvcnkqCUdldE9iakZhY3RvcnkoKSBjb25zdDsNCisgICAgQ1hGQV9Eb2N1bWVudCoJCUdldFhGQURvYygpIGNvbnN0Ow0KKw0KKyAgICBDWEZBX0ZGRG9jVmlldyoJCW1fcERvY1ZpZXc7DQorfTsNCitjbGFzcyBDWEZBX0ZGTWVudUhhbmRsZXIgOiBwdWJsaWMgSVhGQV9NZW51SGFuZGxlciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZGTWVudUhhbmRsZXIoKTsNCisgICAgfkNYRkFfRkZNZW51SGFuZGxlcigpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkNvcHkoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblBhc3RlKFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblNlbGVjdEFsbChYRkFfSFdJREdFVCBoV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5EZWxldGUoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuRGVTZWxlY3QoWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDdXQoWEZBX0hXSURHRVQgaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJUGFzdGUoWEZBX0hXSURHRVQgaFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VsZWN0QWxsKFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURlbGV0ZShYRkFfSFdJREdFVCBoV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEZVNlbGVjdChYRkFfSFdJREdFVCBoV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlDYW5VbmRvKFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblJlZG8oWEZBX0hXSURHRVQgaFdpZGdldCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbyhYRkFfSFdJREdFVCBoV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKFhGQV9IV0lER0VUIGhXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3JkcyhYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmc1N1Z2dlc3QpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlcGxhY2VTcGVsbENoZWNrV29yZChYRkFfSFdJREdFVCBoV2lkZ2V0LCBDRlhfUG9pbnRGIHBvaW50ZiwgRlhfQlNUUiBic1JlcGxhY2UpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTRmZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5jcHAKQEAgLTAsMCArMSwxMzc5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZm9udG1nci5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmQ29uZmlnQWNjLmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorc3RhdGljIGNvbnN0IFhGQV9GT05USU5GTyBnX1hGQUZvbnRzTWFwW10gPSB7DQorICAgIHsweDAxZDVkMzNlLAkoRlhfTFBDV1NUUilMIlNpbVN1biIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHgwMWU0ZjEwMiwJKEZYX0xQQ1dTVFIpTCJZb3VZdWFuIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTkzNn0sDQorICAgIHsweDAzMDU0OWRjLAkoRlhfTFBDV1NUUilMIkxpU3UiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMSwJOTM2fSwNCisgICAgezB4MDMyZWRkNDQsCShGWF9MUENXU1RSKUwiU2ltaGVpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTkzNn0sDQorICAgIHsweDAzZWFjNmZjLAkoRlhfTFBDV1NUUilMIlBvb3JSaWNoYXJkLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweDAzZWQ5MGU2LAkoRlhfTFBDV1NUUilMIk5pbmEiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLAkoRlhfTFBDV1NUUilMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwODliMThhOSwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4MGIyY2FkNzIsCShGWF9MUENXU1RSKUwiTW9ub3R5cGVDb3JzaXZhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTgsCTEyNTJ9LA0KKyAgICB7MHgwYmIwMDNlNywJKEZYX0xQQ1dTVFIpTCJLYXJ0aWthIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwJKEZYX0xQQ1dTVFIpTCJWaW5lckhhbmRJVEMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJOCwJMTI1Mn0sDQorICAgIHsweDBiYzFhODUxLAkoRlhfTFBDV1NUUilMIlNlZ29lVUkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDBjMTEyZWJkLAkoRlhfTFBDV1NUUilMIktvenVrYUdvdGhpY1Byby1WSU0iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLAkoRlhfTFBDV1NUUilMIkFkb2JlVGhhaSIsCShGWF9MUENXU1RSKUwiS29raWxhLEFyaWFsIE5hcnJvdyIsCTAsCTg0N30sDQorICAgIHsweDBlN2RlMGY5LAkoRlhfTFBDV1NUUilMIlBsYXliaWxsIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwZWZmNDdjMywJKEZYX0xQQ1dTVFIpTCJTVEh1cG8iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4MTA3YWQzNzQsCShGWF9MUENXU1RSKUwiQ29uc3RhbnRpYSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4MTIxOTRjMmQsCShGWF9MUENXU1RSKUwiS3Vuc3RsZXJTY3JpcHQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJOCwJMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLAkoRlhfTFBDV1NUUilMIk1pbmlvblByb1NtQmQiLAkoRlhfTFBDV1NUUilMIkJlbGwgTVQsQ29yYmVsLFRpbWVzIE5ldyBSb21hbixDYW1icmlhLEJlcmxpbiBTYW5zIEZCIiwJMCwJMTI1Mn0sDQorICAgIHsweDE1OGM0MDQ5LAkoRlhfTFBDV1NUUilMIkdhcmFtb25kIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxNjBlY2IyNCwJKEZYX0xQQ1dTVFIpTCJTVFpob25nc29uZyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHgxNjFlZDA3ZSwJKEZYX0xQQ1dTVFIpTCJNU0dvdGhpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAkxMjUyfSwNCisgICAgezB4MTcxZDFlZDEsCShGWF9MUENXU1RSKUwiU25hcElUQy1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgxOGQxMTg4ZiwJKEZYX0xQQ1dTVFIpTCJDYW1icmlhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxOGVhZjM1MCwJKEZYX0xQQ1dTVFIpTCJBcmlhbFVuaWNvZGVNUyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHgxYTkyZDExNSwJKEZYX0xQQ1dTVFIpTCJNaW5nTGlVIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTEyNTJ9LA0KKyAgICB7MHgxY2MyMTdjNiwJKEZYX0xQQ1dTVFIpTCJUcmVidWNoZXRNUyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4MWQ2NDk1OTYsCShGWF9MUENXU1RSKUwiQmFzZW1pY1RpbWVzIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgxZTM0ZWU2MCwJKEZYX0xQQ1dTVFIpTCJCZWxsTVQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweDFlYjM2OTQ1LAkoRlhfTFBDV1NUUilMIkNvb3BlckJsYWNrIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxZWY3Nzg3ZCwJKEZYX0xQQ1dTVFIpTCJCYXRhbmdDaGUiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMSwJMTI1Mn0sDQorICAgIHsweDIwYjNiZDNhLAkoRlhfTFBDV1NUUilMIkJydXNoU2NyaXB0TVQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJOCwJMTI1Mn0sDQorICAgIHsweDIyMDg3N2FhLAkoRlhfTFBDV1NUUilMIkNhbmRhcmEiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDIyMTM1MDA3LAkoRlhfTFBDV1NUUilMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyNTEwNTljMywJKEZYX0xQQ1dTVFIpTCJDaGlsbGVyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyNWJlZDZkZCwJKEZYX0xQQ1dTVFIpTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4MjgxNTRjODEsCShGWF9MUENXU1RSKUwiUGFyY2htZW50LVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJOCwJMTI1Mn0sDQorICAgIHsweDI5NzExZWI5LAkoRlhfTFBDV1NUUilMIlNUTGl0aSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwJKEZYX0xQQ1dTVFIpTCJCYXNlbWljIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyYjMxNjMzOSwJKEZYX0xQQ1dTVFIpTCJOaWFnYXJhU29saWQtUmVnIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyYzE0NzUyOSwJKEZYX0xQQ1dTVFIpTCJGb290bGlnaHRNVExpZ2h0IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwJKEZYX0xQQ1dTVFIpTCJIYXJsb3dTb2xpZCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4MmM2YWM2YjIsCShGWF9MUENXU1RSKUwiTHVjaWRhQnJpZ2h0IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgyYzlmMzhlMiwJKEZYX0xQQ1dTVFIpTCJLb3p1a2FNaW5jaG9Qcm8tVklSIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwJKEZYX0xQQ1dTVFIpTCJTVENhaXl1biIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHgyZGVmMjZiZiwJKEZYX0xQQ1dTVFIpTCJCZXJuYXJkTVQtQ29uZGVuc2VkIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyZmQ4OTMwYiwJKEZYX0xQQ1dTVFIpTCJLb3p1a2FNaW5jaG9QcjZOUiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4MzExNTUyNWEsCShGWF9MUENXU1RSKUwiRmFuZ1NvbmdfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMTMyNzgxNywJKEZYX0xQQ1dTVFIpTCJNeXJpYWRQcm8iLAkoRlhfTFBDV1NUUilMIkNhbGlicmksQ29yYmVsLENhbmRhcmEsQ2FtYnJpYSBNYXRoLEZyYW5rbGluIEdvdGhpYyBNZWRpdW0sQXJpYWwgTmFycm93LFRpbWVzIE5ldyBSb21hbiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgICAgKEZYX0xQQ1dTVFIpTCJIZWx2ZXRpY2EiLCAoRlhfTFBDV1NUUilMIkFyaWFsIiwJIDAsICAgMTI1Mn0sDQorICAgIHsweDMyYWM5OTVjLAkoRlhfTFBDV1NUUilMIlRlcm1pbmFsIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMzhkNjQ4YSwJKEZYX0xQQ1dTVFIpTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwJKEZYX0xQQ1dTVFIpTCJTeWxmYWVuIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgzNDAyYzMwZSwJKEZYX0xQQ1dTVFIpTCJNU1BNaW5jaG8iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweDM0MTJiZjMxLAkoRlhfTFBDV1NUUilMIlNpbVN1bi1QVUEiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4MzZlYjM5YjksCShGWF9MUENXU1RSKUwiQmVybGluU2Fuc0ZCIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzNmY0MjA1NSwJKEZYX0xQQ1dTVFIpTCJVbml2ZXJzQVRUIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzODY0YzRmNiwJKEZYX0xQQ1dTVFIpTCJIaWdoVG93ZXJUZXh0IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgzYTI1N2QwMywJKEZYX0xQQ1dTVFIpTCJGYW5nU29uZ19HQjIzMTIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDNjZGFlNjY4LAkoRlhfTFBDV1NUUilMIkZyZWVzdHlsZVNjcmlwdCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk4LAkxMjUyfSwNCisgICAgezB4M2Q1NWFlZDcsCShGWF9MUENXU1RSKUwiSm9rZXJtYW4iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDNkNWI0Mzg1LAkoRlhfTFBDV1NUUilMIlBNaW5nTGlVIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwJKEZYX0xQQ1dTVFIpTCJFc3RyYW5nZWxvRWRlc3NhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzZTUzMmQ3NCwJKEZYX0xQQ1dTVFIpTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4M2U2YWEzMmQsCShGWF9MUENXU1RSKUwiTlNpbVN1biIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAk5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwJKEZYX0xQQ1dTVFIpTCJHYXV0YW1pIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwJKEZYX0xQQ1dTVFIpTCJDaGlsbGVyLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDQwOWRlMzEyLAkoRlhfTFBDV1NUUilMIk1vZGVybk5vLjIwIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwJKEZYX0xQQ1dTVFIpTCJHZW9yZ2lhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MTYwYWRlNSwJKEZYX0xQQ1dTVFIpTCJCZWxsR290aGljU3RkQmxhY2siLAkoRlhfTFBDV1NUUilMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQm9vayBBbnRpcXVhLERvdHVtLEdlb3JnaWEiLAkwLAkxMjUyfSwNCisgICAgezB4NDIxOTc2YzQsCShGWF9MUENXU1RSKUwiTW9kZXJuLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweDQyMmE3MjUyLAkoRlhfTFBDV1NUUilMIlN0ZW5jaWwiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLAkoRlhfTFBDV1NUUilMIkZpeGVkc3lzIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MzVjYjQxZCwJKEZYX0xQQ1dTVFIpTCJSb21hbiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NDc4ODIzODMsCShGWF9MUENXU1RSKUwiQ291cmllck5ldyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAkxMjUyfSwNCisgICAgezB4NDgwYTIzMzgsCShGWF9MUENXU1RSKUwiQmVybGluU2Fuc0ZCRGVtaSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NDgwYmY3YTQsCShGWF9MUENXU1RSKUwiQ291cmllclN0ZCIsCShGWF9MUENXU1RSKUwiQ291cmllciBOZXcsVmVyZGFuYSIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0ODFhZDZlZCwJKEZYX0xQQ1dTVFIpTCJWbGFkaW1pclNjcmlwdCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk4LAkxMjUyfSwNCisgICAgezB4NDkxMTU3N2EsCShGWF9MUENXU1RSKUwiWW91WXVhbiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAk5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwJKEZYX0xQQ1dTVFIpTCJTVFhpbmdrYWkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4NGJmODg1NjYsCShGWF9MUENXU1RSKUwiU2Vnb2VDb25kZW5zZWQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LAkoRlhfTFBDV1NUUilMIkJlcmxpblNhbnNGQi1SZWciLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLAkoRlhfTFBDV1NUUilMIkd1bGltQ2hlIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTEyNTJ9LA0KKyAgICB7MHg0ZjY4YmQ3OSwJKEZYX0xQQ1dTVFIpTCJMZXR0ZXJHb3RoaWNTdGQiLAkoRlhfTFBDV1NUUilMIkNvdXJpZXIgTmV3LFZlcmRhbmEiLAkwLAkxMjUyfSwNCisgICAgezB4NTFhMGQwZTYsCShGWF9MUENXU1RSKUwiS296dWthR290aGljUHI2Tk0iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDUzMWIzZGVhLAkoRlhfTFBDV1NUUilMIkJhc2VtaWNTeW1ib2wiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDUzMzNmZDM5LAkoRlhfTFBDV1NUUilMIkNhbGlmb3JuaWFuRkItUmVnIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg1MzU2MWE1NCwJKEZYX0xQQ1dTVFIpTCJGWllUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweDU1ZTBkZGU2LAkoRlhfTFBDV1NUUilMIkx1Y2lkYVNhbnNUeXBld3JpdGVyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1NzRkNGQzZCwJKEZYX0xQQ1dTVFIpTCJBZG9iZUFyYWJpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93IiwJMCwJMTI1Mn0sDQorICAgIHsweDU3OTJlNzU5LAkoRlhfTFBDV1NUUilMIlNUS2FpdGkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4NTkyMTk3OGUsCShGWF9MUENXU1RSKUwiTHVjaWRhU2Fuc1VuaWNvZGUiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDU5NGUyZGE0LAkoRlhfTFBDV1NUUilMIlZyaW5kYSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NTliYWE5YTIsCShGWF9MUENXU1RSKUwiS2FpVGlfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1Y2ZlZGY0ZiwJKEZYX0xQQ1dTVFIpTCJCYXNrT2xkRmFjZSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsCShGWF9MUENXU1RSKUwiQWRvYmVNeXVuZ2pvU3RkTSIsCShGWF9MUENXU1RSKUwiQmF0YW5nLEJvb2ttYW4gT2xkIFN0eWxlLENvbnNvbGFzLFNUWmhvbmdzb25nIiwJMCwJOTM2fSwNCisgICAgezB4NWZlZmJmYWQsCShGWF9MUENXU1RSKUwiQmF0YW5nIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg2MDUzNDJiOSwJKEZYX0xQQ1dTVFIpTCJEb3R1bUNoZSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAkxMjUyfSwNCisgICAgezB4NjA4YzVmOWEsCShGWF9MUENXU1RSKUwiS2FpVGlfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweDYxZWZkMGQxLAkoRlhfTFBDV1NUUilMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDYyNjYwOGE5LAkoRlhfTFBDV1NUUilMIk1WQm9saSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NjMwNTAxYTMsCShGWF9MUENXU1RSKUwiU21hbGxGb250cyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NjVkMGUyYTksCShGWF9MUENXU1RSKUwiRlpZVEstLUdCSzEtMCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHg2NjlmMjllMSwJKEZYX0xQQ1dTVFIpTCJGWlNUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweDY3M2E5ZTVmLAkoRlhfTFBDV1NUUilMIlR1bmdhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2OTFhYTRjZSwJKEZYX0xQQ1dTVFIpTCJOaWFnYXJhU29saWQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDY5NjI1OWI3LAkoRlhfTFBDV1NUUilMIkNvcmJlbCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4Njk2ZWU5YmUsCShGWF9MUENXU1RSKUwiU1RYaWhlaSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHg2YzU5Y2Y2OSwJKEZYX0xQQ1dTVFIpTCJEb3R1bSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NzA3ZmE1NjEsCShGWF9MUENXU1RSKUwiR3VuZ3N1aCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4NzE0MTZiYjIsCShGWF9MUENXU1RSKUwiWldBZG9iZUYiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDcxYjQxODAxLAkoRlhfTFBDV1NUUilMIlZlcmRhbmEiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDczZjI1ZTRjLAkoRlhfTFBDV1NUUilMIlBhbGF0aW5vTGlub3R5cGUiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDczZjRkMTlmLAkoRlhfTFBDV1NUUilMIk5pYWdhcmFFbmdyYXZlZCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NzQwMDE2OTQsCShGWF9MUENXU1RSKUwiTXlyaWFkUHJvQmxhY2siLAkoRlhfTFBDV1NUUilMIkJvb2sgQW50aXF1YSxDb25zdGFudGlhLERvdHVtLEdlb3JnaWEiLAkwLAkxMjUyfSwNCisgICAgezB4NzRiMTRkOGYsCShGWF9MUENXU1RSKUwiSGFldHRlbnNjaHdlaWxlciIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4NzRjYjQ0ZWUsCShGWF9MUENXU1RSKUwiTlNpbVN1biIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAk5MzZ9LA0KKyAgICB7MHg3NmI0ZDdmZiwJKEZYX0xQQ1dTVFIpTCJTaHJ1dGkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDc4OGIzNTMzLAkoRlhfTFBDV1NUUilMIldlYmRpbmdzIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTYsCTQyfSwNCisgICAgezB4Nzk3ZGRlOTksCShGWF9MUENXU1RSKUwiTVNTZXJpZiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4N2EwZjllOWUsCShGWF9MUENXU1RSKUwiTVNNaW5jaG8iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMSwJMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLAkoRlhfTFBDV1NUUilMIk9sZEVuZ2xpc2hUZXh0TVQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDgyMTNhNDMzLAkoRlhfTFBDV1NUUilMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4ODJmZWM5MjksCShGWF9MUENXU1RSKUwiQWRvYmVTb25nU3RkTCIsCShGWF9MUENXU1RSKUwiQ2VudGF1cixDYWxpYnJpLFNUU29uZyxCZWxsIE1ULEdhcmFtb25kLFRpbWVzIE5ldyBSb21hbiIsCTAsCTkzNn0sDQorICAgIHsweDgzNTgxODI1LAkoRlhfTFBDV1NUUilMIk1vZGVybiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsCShGWF9MUENXU1RSKUwiQWxnZXJpYW4iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDgzZGFiOWY1LAkoRlhfTFBDV1NUUilMIlNjcmlwdCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4ODQ3YjU2ZGEsCShGWF9MUENXU1RSKUwiVGFob21hIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwJKEZYX0xQQ1dTVFIpTCJTaW1TdW4tUFVBIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4YjVjYWMwZSwJKEZYX0xQQ1dTVFIpTCJPbnl4IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4YzZhNDk5ZSwJKEZYX0xQQ1dTVFIpTCJHdWxpbSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsCShGWF9MUENXU1RSKUwiSnVpY2VJVEMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDhlOGQ0M2IyLAkoRlhfTFBDV1NUUilMIkNlbnRhdXIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweDhlZTRkY2NhLAkoRlhfTFBDV1NUUilMIkJvb2tzaGVsZlN5bWJvbDciLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLAkoRlhfTFBDV1NUUilMIkJlbGxHb3RoaWNTdGRMaWdodCIsCShGWF9MUENXU1RSKUwiQmVsbCBNVCxDYWxpYnJpLFRpbWVzIE5ldyBSb21hbiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg5MDliNTE2YSwJKEZYX0xQQ1dTVFIpTCJDZW50dXJ5IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg5MmFlMzcwZCwJKEZYX0xQQ1dTVFIpTCJNU091dGxvb2siLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJNCwJNDJ9LA0KKyAgICB7MHg5M2M5ZmJmMSwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFGYXgiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweDk1NjUwODVlLAkoRlhfTFBDV1NUUilMIkJvb2tBbnRpcXVhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg5ODU2ZDk1ZCwJKEZYX0xQQ1dTVFIpTCJBZG9iZU1pbmdTdGRMIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCxBcmlhbCBVbmljb2RlIE1TLENhbWJyaWEsQmF0YW5nQ2hlIiwJMCwJOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsCShGWF9MUENXU1RSKUwiQ29sb25uYU1UIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg5Y2JkMTZhNCwJKEZYX0xQQ1dTVFIpTCJTaG93Y2FyZEdvdGhpYy1SZWciLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweDlkNzMwMDhlLAkoRlhfTFBDV1NUUilMIk1TU2Fuc1NlcmlmIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhhMDYwN2RiMSwJKEZYX0xQQ1dTVFIpTCJHdW5nc3VoQ2hlIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTEyNTJ9LA0KKyAgICB7MHhhMGJjZjZhMSwJKEZYX0xQQ1dTVFIpTCJMYXRpbldpZGUiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LAkoRlhfTFBDV1NUUilMIlN5bWJvbCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk2LAk0Mn0sDQorICAgIHsweGExZmE1YWJjLAkoRlhfTFBDV1NUUilMIldpbmdkaW5nczIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJNiwJNDJ9LA0KKyAgICB7MHhhMWZhNWFiZCwJKEZYX0xQQ1dTVFIpTCJXaW5nZGluZ3MzIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTYsCTQyfSwNCisgICAgezB4YTQyN2JhZDQsCShGWF9MUENXU1RSKUwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTgsCTEyNTJ9LA0KKyAgICB7MHhhOGI5MmVjZSwJKEZYX0xQQ1dTVFIpTCJGWlNUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGE4ZDgzZWNlLAkoRlhfTFBDV1NUUilMIkNhbGlmb3JuaWFuRkIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMiwJMTI1Mn0sDQorICAgIHsweGFhM2UwODJjLAkoRlhfTFBDV1NUUilMIktpbmdzb2Z0LVBob25ldGljIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhhYTZiY2FiZSwJKEZYX0xQQ1dTVFIpTCJIYXJsb3dTb2xpZEl0YWxpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsCShGWF9MUENXU1RSKUwiTVNVSUdvdGhpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4YjA4ZGQ5NDEsCShGWF9MUENXU1RSKUwiV2lkZUxhdGluIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTIsCTEyNTJ9LA0KKyAgICB7MHhiMjA3ZjA1ZCwJKEZYX0xQQ1dTVFIpTCJQb29yUmljaGFyZCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4YjNiYzQ5MmYsCShGWF9MUENXU1RSKUwiSnVpY2VJVEMtUmVndWxhciIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4YjU1NDUzOTksCShGWF9MUENXU1RSKUwiTWFybGV0dCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk0LAk0Mn0sDQorICAgIHsweGI1ZGQxZWJiLAkoRlhfTFBDV1NUUilMIkJyaXRhbm5pY0JvbGQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGI2OTljMWM1LAkoRlhfTFBDV1NUUilMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4YjcyNWQ2MjksCShGWF9MUENXU1RSKUwiVGltZXNOZXdSb21hbiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4YjdlYWViZWIsCShGWF9MUENXU1RSKUwiQWRvYmVIZWl0aVN0ZFIiLAkoRlhfTFBDV1NUUilMIkJhdGFuZyxDZW50dXJ5LERvdHVtIiwJMCwJOTM2fSwNCisgICAgezB4YmQyOWM0ODYsCShGWF9MUENXU1RSKUwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhiZThhOGRiNCwJKEZYX0xQQ1dTVFIpTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4YzE2YzAxMTgsCShGWF9MUENXU1RSKUwiQWRvYmVIZWJyZXciLAkoRlhfTFBDV1NUUilMIkJlbGwgTVQsQmVybGluIFNhbnMgRkIsQ2FsaWJyaSIsCTAsCTEyNTJ9LA0KKyAgICB7MHhjMzE4YjBhZiwJKEZYX0xQQ1dTVFIpTCJNeXJpYWRQcm9MaWdodCIsCShGWF9MUENXU1RSKUwiQ2FsaWJyaSxTVEZhbmdzb25nLFRpbWVzIE5ldyBSb21hbiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhjNjVlNTY1OSwJKEZYX0xQQ1dTVFIpTCJDYW1icmlhTWF0aCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4Yzc1YzhmMDUsCShGWF9MUENXU1RSKUwiTHVjaWRhQ29uc29sZSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkxLAkxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsCShGWF9MUENXU1RSKUwiQ2FsaWJyaSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4Y2IwNTNmNTMsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0WWFIZWkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4Y2I3MTkwZjksCShGWF9MUENXU1RSKUwiTWFnbmV0by1Cb2xkIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhjY2EwMGNjNSwJKEZYX0xQQ1dTVFIpTCJTeXN0ZW0iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGNjYWQ2Zjc2LAkoRlhfTFBDV1NUUilMIkpva2VybWFuLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGNjYzU4MThjLAkoRlhfTFBDV1NUUilMIkV1cm9TaWduIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhjZjNkNzIzNCwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGNmN2I4ZmRiLAkoRlhfTFBDV1NUUilMIk1pbmlvblBybyIsCShGWF9MUENXU1RSKUwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLAkwLAkxMjUyfSwNCisgICAgezB4Y2ZlNTc1NWYsCShGWF9MUENXU1RSKUwiU2ltaGVpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTkzNn0sDQorICAgIHsweGQwMTFmNGVlLAkoRlhfTFBDV1NUUilMIk1TUEdvdGhpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4ZDA2MGU3ZWYsCShGWF9MUENXU1RSKUwiVml2YWxkaSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk4LAkxMjUyfSwNCisgICAgezB4ZDA3ZWRlYzEsCShGWF9MUENXU1RSKUwiRnJhbmtsaW5Hb3RoaWMtTWVkaXVtIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwJKEZYX0xQQ1dTVFIpTCJTaW1TdW4iLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4ZDE4ODE1NjIsCShGWF9MUENXU1RSKUwiQXJpYWxOYXJyb3ciLAkoRlhfTFBDV1NUUilMIkFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMjJiN2RjZSwJKEZYX0xQQ1dTVFIpTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGQyMmJmYTYwLAkoRlhfTFBDV1NUUilMIkNvbWljU2Fuc01TIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTgsCTEyNTJ9LA0KKyAgICB7MHhkM2JkMGUzNSwJKEZYX0xQQ1dTVFIpTCJCYXVoYXVzOTMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGQ0MjllZTdhLAkoRlhfTFBDV1NUUilMIlNURmFuZ3NvbmciLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4ZDY2NzljMTIsCShGWF9MUENXU1RSKUwiQmVybmFyZE1UQ29uZGVuc2VkIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkOGU4YTAyNywJKEZYX0xQQ1dTVFIpTCJMdWNpZGFTYW5zIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkOWZlNzc2MSwJKEZYX0xQQ1dTVFIpTCJIaWdoVG93ZXJUZXh0LVJlZyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4ZGE3ZTU1MWUsCShGWF9MUENXU1RSKUwiU1RTb25nIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGRhYTY4NDJkLAkoRlhfTFBDV1NUUilMIlNUWmhvbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGRhYWFiOTNmLAkoRlhfTFBDV1NUUilMIlNURmFuZ3NvbmciLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4ZGFlYjA3MTMsCShGWF9MUENXU1RSKUwiU1RTb25nIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGRhZmVkYmVmLAkoRlhfTFBDV1NUUilMIlNUQ2FpeXVuIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGRiMDBhM2Q5LAkoRlhfTFBDV1NUUilMIkJyb2Fkd2F5IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkYjFmNWFkNCwJKEZYX0xQQ1dTVFIpTCJTVFhpbndlaSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwJKEZYX0xQQ1dTVFIpTCJTVEthaXRpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGRiNjk1OTVhLAkoRlhfTFBDV1NUUilMIlNUSHVwbyIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYmEwMDgyYywJKEZYX0xQQ1dTVFIpTCJTVFhpaGVpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGRiZDBhYjE4LAkoRlhfTFBDV1NUUilMIlNUWGluZ2thaSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYzFhN2RiMSwJKEZYX0xQQ1dTVFIpTCJTVExpdGkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJOTM2fSwNCisgICAgezB4ZGMzMzA3NWYsCShGWF9MUENXU1RSKUwiS3Jpc3RlbklUQy1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTgsCTEyNTJ9LA0KKyAgICB7MHhkY2M3MDA5YywJKEZYX0xQQ1dTVFIpTCJIYXJyaW5ndG9uIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZDcxMjQ2NiwJKEZYX0xQQ1dTVFIpTCJBcmlhbEJsYWNrIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZGU4N2IzZSwJKEZYX0xQQ1dTVFIpTCJJbXBhY3QiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLAkoRlhfTFBDV1NUUilMIlNuYXBJVEMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGRmOGIyNWU4LAkoRlhfTFBDV1NUUilMIkNlbnR1cnlHb3RoaWMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGUwZjcwNWMwLAkoRlhfTFBDV1NUUilMIktyaXN0ZW5JVEMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJOCwJMTI1Mn0sDQorICAgIHsweGUxNDI3NTczLAkoRlhfTFBDV1NUUilMIlJhYXZpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMmNlYTBjYiwJKEZYX0xQQ1dTVFIpTCJNYWduZXRvIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMzZhOWUxNywJKEZYX0xQQ1dTVFIpTCJSYXZpZSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4ZTQzM2Y4ZTIsCShGWF9MUENXU1RSKUwiUGFyY2htZW50IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTgsCTEyNTJ9LA0KKyAgICB7MHhlNDNkZmY0YSwJKEZYX0xQQ1dTVFIpTCJXaW5nZGluZ3MiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJNCwJNDJ9LA0KKyAgICB7MHhlNGUyYzQwNSwJKEZYX0xQQ1dTVFIpTCJNVEV4dHJhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTYsCTQyfSwNCisgICAgezB4ZTYxOGNjMzUsCShGWF9MUENXU1RSKUwiSW5mb3JtYWxSb21hbiIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk4LAkxMjUyfSwNCisgICAgezB4ZTZjMjdmZmMsCShGWF9MUENXU1RSKUwiTWlzdHJhbCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAk4LAkxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksCShGWF9MUENXU1RSKUwiQ291cmllciIsCShGWF9MUENXU1RSKUwiQ291cmllciBOZXciLAkwLAkxMjUyfSwNCisgICAgezB4ZThiYzRhOWQsCShGWF9MUENXU1RSKUwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGU5MGZiMDEzLAkoRlhfTFBDV1NUUilMIlRlbXB1c1NhbnNJVEMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGVjNjM3YjQyLAkoRlhfTFBDV1NUUilMIkNvbnNvbGFzIiwJKEZYX0xQQ1dTVFIpTCJWZXJkYW5hIiwJMSwJMTI1Mn0sDQorICAgIHsweGVkM2E2ODNiLAkoRlhfTFBDV1NUUilMIlNUWGlud2VpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGVmMjY0Y2QxLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUhhbmR3cml0aW5nIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmMDg2YmNhMiwJKEZYX0xQQ1dTVFIpTCJCYXNrZXJ2aWxsZU9sZEZhY2UiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGYxMDI4MDMwLAkoRlhfTFBDV1NUUilMIk1hbmdhbCIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkyLAkxMjUyfSwNCisgICAgezB4ZjFkYTdlYjksCShGWF9MUENXU1RSKUwiU2hvd2NhcmRHb3RoaWMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGYyMTBmMDZhLAkoRlhfTFBDV1NUUilMIkFyaWFsTVQiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGY0NzdmMTZhLAkoRlhfTFBDV1NUUilMIkxhdGhhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmNjE2ZjNkZCwJKEZYX0xQQ1dTVFIpTCJMaVN1IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTEsCTkzNn0sDQorICAgIHsweGZhNDc5YWE2LAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdFlhSGVpIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCTAsCTkzNn0sDQorICAgIHsweGZjZDE5Njk3LAkoRlhfTFBDV1NUUilMIkJvb2ttYW5PbGRTdHlsZSIsCShGWF9MUENXU1RSKUwiQXJpYWwiLAkwLAkxMjUyfSwNCisgICAgezB4ZmUyMDlhODIsCShGWF9MUENXU1RSKUwiTHVjaWRhQ2FsbGlncmFwaHkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIiwJMCwJMTI1Mn0sDQorICAgIHsweGZlZjEzNWY4LAkoRlhfTFBDV1NUUilMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsCShGWF9MUENXU1RSKUwiQmF0YW5nLENlbnR1cnksRG90dW0iLAkwLAk5MzZ9LA0KK307DQorI2VsaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8NCitzdGF0aWMgY29uc3QgWEZBX0ZPTlRJTkZPIGdfWEZBRm9udHNNYXBbXSA9IHsNCisgICAgezB4MDFkNWQzM2UsCShGWF9MUENXU1RSKUwiU2ltU3VuIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSIFBMIFVNaW5nIFRXIE1CRSxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCisgICAgezB4MDFlNGYxMDIsCShGWF9MUENXU1RSKUwiWW91WXVhbiIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyBUVyBNQkUsV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQorICAgIHsweDAzMDU0OWRjLAkoRlhfTFBDV1NUUilMIkxpU3UiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQorICAgIHsweDAzMmVkZDQ0LAkoRlhfTFBDV1NUUilMIlNpbWhlaSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMSwJOTM2fSwNCisgICAgezB4MDNlYWM2ZmMsCShGWF9MUENXU1RSKUwiUG9vclJpY2hhcmQtUmVndWxhciIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmIiwJMiwJMTI1Mn0sDQorICAgIHsweDAzZWQ5MGU2LAkoRlhfTFBDV1NUUilMIk5pbmEiLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwNzdiNTZiMywJKEZYX0xQQ1dTVFIpTCJLaW5nc29mdFBob25ldGljUGxhaW4iLAkoRlhfTFBDV1NUUilMInV0a2FsLEtlZGFnZSxNYWxsaWdlLEtlZGFnZSxBUiBQTCBVS2FpIENOLEFSIFBMIFVLYWkgSEsiLAkwLAkxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwODliMThhOSwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZixXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLAkoRlhfTFBDV1NUUilMIk1vbm90eXBlQ29yc2l2YSIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmIiwJOCwJMTI1Mn0sDQorICAgIHsweDBiYjAwM2U3LAkoRlhfTFBDV1NUUilMIkthcnRpa2EiLAkoRlhfTFBDV1NUUilMIkZyZWVTYW5zLExpYmVyYXRpb24gU2FucyxOaW1idXMgU2FucyBMLEdhcnVkYSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTIsCTEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwJKEZYX0xQQ1dTVFIpTCJWaW5lckhhbmRJVEMiLAkoRlhfTFBDV1NUUilMIlVidW50dSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsCTgsCTEyNTJ9LA0KKyAgICB7MHgwYmMxYTg1MSwJKEZYX0xQQ1dTVFIpTCJTZWdvZVVJIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwYzExMmViZCwJKEZYX0xQQ1dTVFIpTCJLb3p1a2FHb3RoaWNQcm8tVklNIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4MGNmY2I5YzEsCShGWF9MUENXU1RSKUwiQWRvYmVUaGFpIiwJKEZYX0xQQ1dTVFIpTCIgV2FyZWUiLAkwLAk4NDd9LA0KKyAgICB7MHgwZTdkZTBmOSwJKEZYX0xQQ1dTVFIpTCJQbGF5YmlsbCIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDBlZmY0N2MzLAkoRlhfTFBDV1NUUilMIlNUSHVwbyIsCShGWF9MUENXU1RSKUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCisgICAgezB4MTA3YWQzNzQsCShGWF9MUENXU1RSKUwiQ29uc3RhbnRpYSIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWksVWJ1bnR1IiwJMiwJMTI1Mn0sDQorICAgIHsweDEyMTk0YzJkLAkoRlhfTFBDV1NUUilMIkt1bnN0bGVyU2NyaXB0IiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNlcmlmIiwJOCwJMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLAkoRlhfTFBDV1NUUilMIk1pbmlvblByb1NtQmQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4MTU4YzQwNDksCShGWF9MUENXU1RSKUwiR2FyYW1vbmQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxNjBlY2IyNCwJKEZYX0xQQ1dTVFIpTCJTVFpob25nc29uZyIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCisgICAgezB4MTYxZWQwN2UsCShGWF9MUENXU1RSKUwiTVNHb3RoaWMiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwJMSwJMTI1Mn0sDQorICAgIHsweDE3MWQxZWQxLAkoRlhfTFBDV1NUUilMIlNuYXBJVEMtUmVndWxhciIsCShGWF9MUENXU1RSKUwiTmltYnVzIFNhbnMgTCxEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgxOGQxMTg4ZiwJKEZYX0xQQ1dTVFIpTCJDYW1icmlhIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYsRnJlZU1vbm8iLAkyLAkxMjUyfSwNCisgICAgezB4MThlYWYzNTAsCShGWF9MUENXU1RSKUwiQXJpYWxVbmljb2RlTVMiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTkzNn0sDQorICAgIHsweDFhOTJkMTE1LAkoRlhfTFBDV1NUUilMIk1pbmdMaVUiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTEyNTJ9LA0KKyAgICB7MHgxY2MyMTdjNiwJKEZYX0xQQ1dTVFIpTCJUcmVidWNoZXRNUyIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweDFkNjQ5NTk2LAkoRlhfTFBDV1NUUilMIkJhc2VtaWNUaW1lcyIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweDFlMzRlZTYwLAkoRlhfTFBDV1NUUilMIkJlbGxNVCIsCShGWF9MUENXU1RSKUwiVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLAkyLAkxMjUyfSwNCisgICAgezB4MWViMzY5NDUsCShGWF9MUENXU1RSKUwiQ29vcGVyQmxhY2siLAkoRlhfTFBDV1NUUilMIkZyZWVNb25vLExpYmVyYXRpb24gTW9ubywgV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwJMiwJMTI1Mn0sDQorICAgIHsweDFlZjc3ODdkLAkoRlhfTFBDV1NUUilMIkJhdGFuZ0NoZSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMSwJMTI1Mn0sDQorICAgIHsweDIwYjNiZDNhLAkoRlhfTFBDV1NUUilMIkJydXNoU2NyaXB0TVQiLAkoRlhfTFBDV1NUUilMIlVSVyBDaGFuY2VyeSBMLExpYmVyYXRpb24gU2FucyIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyMjA4NzdhYSwJKEZYX0xQQ1dTVFIpTCJDYW5kYXJhIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyMjEzNTAwNywJKEZYX0xQQ1dTVFIpTCJGcmVlc3R5bGVTY3JpcHQtUmVndWxhciIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJOCwJMTI1Mn0sDQorICAgIHsweDI1MTA1OWMzLAkoRlhfTFBDV1NUUilMIkNoaWxsZXIiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyNWJlZDZkZCwJKEZYX0xQQ1dTVFIpTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEFSIFBMIFVLYWkgSEsiLAkwLAkxMjUyfSwNCisgICAgezB4MjgxNTRjODEsCShGWF9MUENXU1RSKUwiUGFyY2htZW50LVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwJKEZYX0xQQ1dTVFIpTCJTVExpdGkiLAkoRlhfTFBDV1NUUilMIkFSIFBMIFVLYWkgSEsiLAkwLAk5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwJKEZYX0xQQ1dTVFIpTCJCYXNlbWljIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4MmIzMTYzMzksCShGWF9MUENXU1RSKUwiTmlhZ2FyYVNvbGlkLVJlZyIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDJjMTQ3NTI5LAkoRlhfTFBDV1NUUilMIkZvb3RsaWdodE1UTGlnaHQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwJKEZYX0xQQ1dTVFIpTCJIYXJsb3dTb2xpZCIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDJjNmFjNmIyLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUJyaWdodCIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMiwJMTI1Mn0sDQorICAgIHsweDJjOWYzOGUyLAkoRlhfTFBDV1NUUilMIktvenVrYU1pbmNob1Byby1WSVIiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDJkNWE0N2IwLAkoRlhfTFBDV1NUUilMIlNUQ2FpeXVuIiwJKEZYX0xQQ1dTVFIpTCJBUiBQTCBVS2FpIEhLIiwJMCwJOTM2fSwNCisgICAgezB4MmRlZjI2YmYsCShGWF9MUENXU1RSKUwiQmVybmFyZE1ULUNvbmRlbnNlZCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDJmZDg5MzBiLAkoRlhfTFBDV1NUUilMIktvenVrYU1pbmNob1ByNk5SIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4MzExNTUyNWEsCShGWF9MUENXU1RSKUwiRmFuZ1NvbmdfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCisgICAgezB4MzEzMjc4MTcsCShGWF9MUENXU1RSKUwiTXlyaWFkUHJvIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4MzIyNDQ5NzUsICAgIChGWF9MUENXU1RSKUwiSGVsdmV0aWNhIiwgKEZYX0xQQ1dTVFIpTCJVYnVudHUsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLExpYmVyYXRpb24gU2FucyIsCSAwLCAgIDEyNTJ9LA0KKyAgICB7MHgzMmFjOTk1YywJKEZYX0xQQ1dTVFIpTCJUZXJtaW5hbCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDMzOGQ2NDhhLAkoRlhfTFBDV1NUUilMIk5pYWdhcmFFbmdyYXZlZC1SZWciLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwJKEZYX0xQQ1dTVFIpTCJTeWxmYWVuIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTIsCTEyNTJ9LA0KKyAgICB7MHgzNDAyYzMwZSwJKEZYX0xQQ1dTVFIpTCJNU1BNaW5jaG8iLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTIsCTEyNTJ9LA0KKyAgICB7MHgzNDEyYmYzMSwJKEZYX0xQQ1dTVFIpTCJTaW1TdW4tUFVBIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KKyAgICB7MHgzNmViMzliOSwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkIiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzNmY0MjA1NSwJKEZYX0xQQ1dTVFIpTCJVbml2ZXJzQVRUIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzODY0YzRmNiwJKEZYX0xQQ1dTVFIpTCJIaWdoVG93ZXJUZXh0IiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYiLAkyLAkxMjUyfSwNCisgICAgezB4M2EyNTdkMDMsCShGWF9MUENXU1RSKUwiRmFuZ1NvbmdfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCisgICAgezB4M2M3ZDFkMDcsCShGWF9MUENXU1RSKUwiR2FyYW1vbmQzTFRTdGQiLCAgKEZYX0xQQ1dTVFIpTCJVYnVudHUgQ29uZGVuc2VkLERlamFWdSBTYW5zIENvbmRlbnNlZCxMaWJlcmF0aW9uIFNlcmlmLFVidW50dSxGcmVlU2VyaWYiLAkyLAkxMjUyfSwNCisgICAgezB4M2NkYWU2NjgsCShGWF9MUENXU1RSKUwiRnJlZXN0eWxlU2NyaXB0IiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTgsCTEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywJKEZYX0xQQ1dTVFIpTCJKb2tlcm1hbiIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4M2Q1YjQzODUsCShGWF9MUENXU1RSKUwiUE1pbmdMaVUiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTIsCTEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwJKEZYX0xQQ1dTVFIpTCJFc3RyYW5nZWxvRWRlc3NhIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzZTUzMmQ3NCwJKEZYX0xQQ1dTVFIpTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsCShGWF9MUENXU1RSKUwiVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweDNlNmFhMzJkLAkoRlhfTFBDV1NUUilMIk5TaW1TdW4iLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQorICAgIHsweDNmNmMzNmE4LAkoRlhfTFBDV1NUUilMIkdhdXRhbWkiLAkoRlhfTFBDV1NUUilMIkZyZWVTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDNmZjMyNjYyLAkoRlhfTFBDV1NUUilMIkNoaWxsZXItUmVndWxhciIsCShGWF9MUENXU1RSKUwiRnJlZVNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4NDA5ZGUzMTIsCShGWF9MUENXU1RSKUwiTW9kZXJuTm8uMjAiLAkoRlhfTFBDV1NUUilMIk5pbWJ1cyBTYW5zIEwsTmltYnVzIFNhbnMgTCxGcmVlU2FucyIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwJKEZYX0xQQ1dTVFIpTCJHZW9yZ2lhIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2FucyIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MTYwYWRlNSwJKEZYX0xQQ1dTVFIpTCJCZWxsR290aGljU3RkQmxhY2siLAkoRlhfTFBDV1NUUilMIkZyZWVTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDQyMTk3NmM0LAkoRlhfTFBDV1NUUilMIk1vZGVybi1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2FucyIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MjJhNzI1MiwJKEZYX0xQQ1dTVFIpTCJTdGVuY2lsIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2FucyxMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4NDJjODU1NGYsCShGWF9MUENXU1RSKUwiRml4ZWRzeXMiLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MzVjYjQxZCwJKEZYX0xQQ1dTVFIpTCJSb21hbiIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDQ3ODgyMzgzLAkoRlhfTFBDV1NUUilMIkNvdXJpZXJOZXciLAkoRlhfTFBDV1NUUilMIkZyZWVNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxBUiBQTCBVS2FpIENOLEFSIFBMIFVLYWkgSEssQVIgUEwgVUthaSBUVyxBUiBQTCBVS2FpIFRXIE1CRSxEZWphVnUgU2FucyIsCTEsCTEyNTJ9LA0KKyAgICB7MHg0ODBhMjMzOCwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkJEZW1pIiwJKEZYX0xQQ1dTVFIpTCIgTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0ODBiZjdhNCwJKEZYX0xQQ1dTVFIpTCJDb3VyaWVyU3RkIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0ODFhZDZlZCwJKEZYX0xQQ1dTVFIpTCJWbGFkaW1pclNjcmlwdCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJOCwJMTI1Mn0sDQorICAgIHsweDQ5MTE1NzdhLAkoRlhfTFBDV1NUUilMIllvdVl1YW4iLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQorICAgIHsweDRhNzg4ZDcyLAkoRlhfTFBDV1NUUilMIlNUWGluZ2thaSIsCShGWF9MUENXU1RSKUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCisgICAgezB4NGJmODg1NjYsCShGWF9MUENXU1RSKUwiU2Vnb2VDb25kZW5zZWQiLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0Y2NmNTFhNCwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkItUmVnIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLAkoRlhfTFBDV1NUUilMIkd1bGltQ2hlIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMIFVLYWkgVFcgTUJFLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkxLAkxMjUyfSwNCisgICAgezB4NGY2OGJkNzksCShGWF9MUENXU1RSKUwiTGV0dGVyR290aGljU3RkIiwJKEZYX0xQQ1dTVFIpTCJGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUiLAkwLAkxMjUyfSwNCisgICAgezB4NTFhMGQwZTYsCShGWF9MUENXU1RSKUwiS296dWthR290aGljUHI2Tk0iLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwJKEZYX0xQQ1dTVFIpTCJCYXNlbWljU3ltYm9sIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4NTMzM2ZkMzksCShGWF9MUENXU1RSKUwiQ2FsaWZvcm5pYW5GQi1SZWciLAkoRlhfTFBDV1NUUilMIlVSVyBDaGFuY2VyeSBMLEZyZWVTZXJpZiIsCTIsCTEyNTJ9LA0KKyAgICB7MHg1MzU2MWE1NCwJKEZYX0xQQ1dTVFIpTCJGWllUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KKyAgICB7MHg1NWUwZGRlNiwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMgTW9ubyxOaW1idXMgTW9ubyBMLExpYmVyYXRpb24gTW9ubyxDb3VyaWVyIDEwIFBpdGNoLEZyZWVNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweDU3NGQ0ZDNkLAkoRlhfTFBDV1NUUilMIkFkb2JlQXJhYmljIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1NzkyZTc1OSwJKEZYX0xQQ1dTVFIpTCJTVEthaXRpIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLAkwLAk5MzZ9LA0KKyAgICB7MHg1OTIxOTc4ZSwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFTYW5zVW5pY29kZSIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4NTk0ZTJkYTQsCShGWF9MUENXU1RSKUwiVnJpbmRhIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2FucyxGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4NTliYWE5YTIsCShGWF9MUENXU1RSKUwiS2FpVGlfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCisgICAgezB4NWNmZWRmNGYsCShGWF9MUENXU1RSKUwiQmFza09sZEZhY2UiLAkoRlhfTFBDV1NUUilMIlVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDVlMTZhYzkxLCAgICAoRlhfTFBDV1NUUilMIlRyYWphblBybyIsICAgKEZYX0xQQ1dTVFIpTCJOaW1idXMgU2FucyBMLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgVFcsQVIgUEwgVU1pbmcgVFcgTUJFLERlamFWdSBTYW5zLERlamFWdSBTZXJpZiIsICAwLCAgMTI1Mn0sDQorICAgIHsweDVmMzg4MTk2LCAgICAoRlhfTFBDV1NUUilMIklUQ0xlZ2FjeVNhbnNTdGRNZWRpdW0iLCAgKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixGcmVlU2FucyxVYnVudHUiLCAwLCAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsCShGWF9MUENXU1RSKUwiQWRvYmVNeXVuZ2pvU3RkTSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCisgICAgezB4NWZlZmJmYWQsCShGWF9MUENXU1RSKUwiQmF0YW5nIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkyLAkxMjUyfSwNCisgICAgezB4NjA1MzQyYjksCShGWF9MUENXU1RSKUwiRG90dW1DaGUiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUsV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTEyNTJ9LA0KKyAgICB7MHg2MDhjNWY5YSwJKEZYX0xQQ1dTVFIpTCJLYWlUaV9HQjIzMTIiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTkzNn0sDQorICAgIHsweDYxZWZkMGQxLAkoRlhfTFBDV1NUUilMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZixEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2MjY2MDhhOSwJKEZYX0xQQ1dTVFIpTCJNVkJvbGkiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDYzMDUwMWEzLAkoRlhfTFBDV1NUUilMIlNtYWxsRm9udHMiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2NWQwZTJhOSwJKEZYX0xQQ1dTVFIpTCJGWllUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KKyAgICB7MHg2NjlmMjllMSwJKEZYX0xQQ1dTVFIpTCJGWlNUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJBUiBQTCBVTWluZyBDTixBUiBQTCBVS2FpIENOLCBBUiBQTCBVTWluZyBISyIsCTAsCTkzNn0sDQorICAgIHsweDY3M2E5ZTVmLAkoRlhfTFBDV1NUUilMIlR1bmdhIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4NjkxYWE0Y2UsCShGWF9MUENXU1RSKUwiTmlhZ2FyYVNvbGlkIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4Njk2MjU5YjcsCShGWF9MUENXU1RSKUwiQ29yYmVsIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2OTZlZTliZSwJKEZYX0xQQ1dTVFIpTCJTVFhpaGVpIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLAkwLAk5MzZ9LA0KKyAgICB7MHg2YzU5Y2Y2OSwJKEZYX0xQQ1dTVFIpTCJEb3R1bSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJMTI1Mn0sDQorICAgIHsweDcwN2ZhNTYxLAkoRlhfTFBDV1NUUilMIkd1bmdzdWgiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTIsCTEyNTJ9LA0KKyAgICB7MHg3MTQxNmJiMiwJKEZYX0xQQ1dTVFIpTCJaV0Fkb2JlRiIsCShGWF9MUENXU1RSKUwiRGluZ2JhdHMsRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDcxYjQxODAxLAkoRlhfTFBDV1NUUilMIlZlcmRhbmEiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zIENvbmRlbnNlZCxEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg3M2YyNWU0YywJKEZYX0xQQ1dTVFIpTCJQYWxhdGlub0xpbm90eXBlIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsCShGWF9MUENXU1RSKUwiTmlhZ2FyYUVuZ3JhdmVkIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4NzQwMDE2OTQsCShGWF9MUENXU1RSKUwiTXlyaWFkUHJvQmxhY2siLAkoRlhfTFBDV1NUUilMIkFSIFBMIFVLYWkgSEsiLAkwLAkxMjUyfSwNCisgICAgezB4NzRiMTRkOGYsCShGWF9MUENXU1RSKUwiSGFldHRlbnNjaHdlaWxlciIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweDc0Y2I0NGVlLAkoRlhfTFBDV1NUUilMIk5TaW1TdW4iLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQorICAgIHsweDc2YjRkN2ZmLAkoRlhfTFBDV1NUUilMIlNocnV0aSIsCShGWF9MUENXU1RSKUwiRnJlZVNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4Nzg4YjM1MzMsCShGWF9MUENXU1RSKUwiV2ViZGluZ3MiLAkoRlhfTFBDV1NUUilMIkZyZWVTYW5zIiwJNiwJNDJ9LA0KKyAgICB7MHg3OTdkZGU5OSwJKEZYX0xQQ1dTVFIpTCJNU1NlcmlmIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg3YTBmOWU5ZSwJKEZYX0xQQ1dTVFIpTCJNU01pbmNobyIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwJMSwJMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLAkoRlhfTFBDV1NUUilMIk9sZEVuZ2xpc2hUZXh0TVQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyxVYnVudHUiLAkwLAkxMjUyfSwNCisgICAgezB4ODIxM2E0MzMsCShGWF9MUENXU1RSKUwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIE1vbm8iLAkwLAkxMjUyfSwNCisgICAgezB4ODJmZWM5MjksCShGWF9MUENXU1RSKUwiQWRvYmVTb25nU3RkTCIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCisgICAgezB4ODM1ODE4MjUsCShGWF9MUENXU1RSKUwiTW9kZXJuIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4MzVhMjgyMywJKEZYX0xQQ1dTVFIpTCJBbGdlcmlhbiIsCShGWF9MUENXU1RSKUwiRnJlZVNhbnMsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4M2RhYjlmNSwJKEZYX0xQQ1dTVFIpTCJTY3JpcHQiLAkoRlhfTFBDV1NUUilMIkZyZWVTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLAkoRlhfTFBDV1NUUilMIlRhaG9tYSIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwJKEZYX0xQQ1dTVFIpTCJTaW1TdW4tUFVBIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCisgICAgezB4OGI1Y2FjMGUsCShGWF9MUENXU1RSKUwiT255eCIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDhjNmE0OTllLAkoRlhfTFBDV1NUUilMIkd1bGltIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsCShGWF9MUENXU1RSKUwiSnVpY2VJVEMiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4ZThkNDNiMiwJKEZYX0xQQ1dTVFIpTCJDZW50YXVyIiwJKEZYX0xQQ1dTVFIpTCJLaG1lciBPUyxLaG1lciBPUyBTeXN0ZW0iLAkyLAkxMjUyfSwNCisgICAgezB4OGVlNGRjY2EsCShGWF9MUENXU1RSKUwiQm9va3NoZWxmU3ltYm9sNyIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLAkoRlhfTFBDV1NUUilMIkJlbGxHb3RoaWNTdGRMaWdodCIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweDkwOWI1MTZhLAkoRlhfTFBDV1NUUilMIkNlbnR1cnkiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIE1vbm8sTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KKyAgICB7MHg5MmFlMzcwZCwJKEZYX0xQQ1dTVFIpTCJNU091dGxvb2siLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyIsCTQsCTQyfSwNCisgICAgezB4OTNjOWZiZjEsCShGWF9MUENXU1RSKUwiTHVjaWRhRmF4IiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNhbnMiLAkyLAkxMjUyfSwNCisgICAgezB4OTU2NTA4NWUsCShGWF9MUENXU1RSKUwiQm9va0FudGlxdWEiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwJMiwJMTI1Mn0sDQorICAgIHsweDk4NTZkOTVkLAkoRlhfTFBDV1NUUilMIkFkb2JlTWluZ1N0ZEwiLAkoRlhfTFBDV1NUUilMIkFSIFBMIFVNaW5nIEhLIiwJMCwJOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsCShGWF9MUENXU1RSKUwiQ29sb25uYU1UIiwJKEZYX0xQQ1dTVFIpTCJLaG1lciBPUyxLaG1lciBPUyBTeXN0ZW0iLAkwLAkxMjUyfSwNCisgICAgezB4OWNiZDE2YTQsCShGWF9MUENXU1RSKUwiU2hvd2NhcmRHb3RoaWMtUmVnIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweDlkNzMwMDhlLAkoRlhfTFBDV1NUUilMIk1TU2Fuc1NlcmlmIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4YTA2MDdkYjEsCShGWF9MUENXU1RSKUwiR3VuZ3N1aENoZSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMSwJMTI1Mn0sDQorICAgIHsweGEwYmNmNmExLAkoRlhfTFBDV1NUUilMIkxhdGluV2lkZSIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmIiwJMiwJMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LAkoRlhfTFBDV1NUUilMIlN5bWJvbCIsCShGWF9MUENXU1RSKUwiRnJlZVNlcmlmIiwJNiwJNDJ9LA0KKyAgICB7MHhhMWZhNWFiYywJKEZYX0xQQ1dTVFIpTCJXaW5nZGluZ3MyIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAk2LAk0Mn0sDQorICAgIHsweGExZmE1YWJkLAkoRlhfTFBDV1NUUilMIldpbmdkaW5nczMiLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZiIsCTYsCTQyfSwNCisgICAgezB4YTQyN2JhZDQsCShGWF9MUENXU1RSKUwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAk4LAkxMjUyfSwNCisgICAgezB4YThiOTJlY2UsCShGWF9MUENXU1RSKUwiRlpTVEstLUdCSzEtMCIsCShGWF9MUENXU1RSKUwiQVIgUEwgVU1pbmcgQ04iLAkwLAk5MzZ9LA0KKyAgICB7MHhhOGQ4M2VjZSwJKEZYX0xQQ1dTVFIpTCJDYWxpZm9ybmlhbkZCIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYiLAkyLAkxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsCShGWF9MUENXU1RSKUwiS2luZ3NvZnQtUGhvbmV0aWMiLAkoRlhfTFBDV1NUUilMInV0a2FsLEtlZGFnZSxNYWxsaWdlLEFSIFBMIFVLYWkgQ04iLAkwLAkxMjUyfSwNCisgICAgezB4YWE2YmNhYmUsCShGWF9MUENXU1RSKUwiSGFybG93U29saWRJdGFsaWMiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsCShGWF9MUENXU1RSKUwiTVNVSUdvdGhpYyIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJMTI1Mn0sDQorICAgIHsweGIwOGRkOTQxLAkoRlhfTFBDV1NUUilMIldpZGVMYXRpbiIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KKyAgICB7MHhiMTI3NjVlMCwgICAgKEZYX0xQQ1dTVFIpTCJJVENMZWdhY3lTYW5zU3RkQm9vayIsICAoRlhfTFBDV1NUUilMIkFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgSEssRnJlZVNlcmlmLFVidW50dSxGcmVlU2FucyIsICAgMCwgIDEyNTJ9LA0KKyAgICB7MHhiMjA3ZjA1ZCwJKEZYX0xQQ1dTVFIpTCJQb29yUmljaGFyZCIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KKyAgICB7MHhiM2JjNDkyZiwJKEZYX0xQQ1dTVFIpTCJKdWljZUlUQy1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGI1NTQ1Mzk5LAkoRlhfTFBDV1NUUilMIk1hcmxldHQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2VyaWYiLAk0LAk0Mn0sDQorICAgIHsweGI1ZGQxZWJiLAkoRlhfTFBDV1NUUilMIkJyaXRhbm5pY0JvbGQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4YjY5OWMxYzUsCShGWF9MUENXU1RSKUwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4YjcyNWQ2MjksCShGWF9MUENXU1RSKUwiVGltZXNOZXdSb21hbiIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zIiwJMiwJMTI1Mn0sDQorICAgIHsweGI3ZWFlYmViLAkoRlhfTFBDV1NUUilMIkFkb2JlSGVpdGlTdGRSIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KKyAgICB7MHhiZDI5YzQ4NiwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhiZThhOGRiNCwJKEZYX0xQQ1dTVFIpTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4YzE2YzAxMTgsCShGWF9MUENXU1RSKUwiQWRvYmVIZWJyZXciLAkoRlhfTFBDV1NUUilMIlVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLAkoRlhfTFBDV1NUUilMIk15cmlhZFByb0xpZ2h0IiwJKEZYX0xQQ1dTVFIpTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLAkwLAkxMjUyfSwNCisgICAgezB4YzY1ZTU2NTksCShGWF9MUENXU1RSKUwiQ2FtYnJpYU1hdGgiLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZixGcmVlTW9ubyIsCTIsCTEyNTJ9LA0KKyAgICB7MHhjNzVjOGYwNSwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFDb25zb2xlIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyBNb25vLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLAkxLAkxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsCShGWF9MUENXU1RSKUwiQ2FsaWJyaSIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4Y2IwNTNmNTMsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0WWFIZWkiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTkzNn0sDQorICAgIHsweGNiNzE5MGY5LAkoRlhfTFBDV1NUUilMIk1hZ25ldG8tQm9sZCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGNjYTAwY2M1LAkoRlhfTFBDV1NUUilMIlN5c3RlbSIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4Y2NhZDZmNzYsCShGWF9MUENXU1RSKUwiSm9rZXJtYW4tUmVndWxhciIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4Y2NjNTgxOGMsCShGWF9MUENXU1RSKUwiRXVyb1NpZ24iLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhjZjNkNzIzNCwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLAkoRlhfTFBDV1NUUilMIk5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGNmN2I4ZmRiLAkoRlhfTFBDV1NUUilMIk1pbmlvblBybyIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4Y2ZlNTc1NWYsCShGWF9MUENXU1RSKUwiU2ltaGVpIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkxLAk5MzZ9LA0KKyAgICB7MHhkMDExZjRlZSwJKEZYX0xQQ1dTVFIpTCJNU1BHb3RoaWMiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwJKEZYX0xQQ1dTVFIpTCJWaXZhbGRpIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwJOCwJMTI1Mn0sDQorICAgIHsweGQwN2VkZWMxLAkoRlhfTFBDV1NUUilMIkZyYW5rbGluR290aGljLU1lZGl1bSIsCShGWF9MUENXU1RSKUwiVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweGQxMDcyNDNmLAkoRlhfTFBDV1NUUilMIlNpbVN1biIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCisgICAgezB4ZDE4ODE1NjIsCShGWF9MUENXU1RSKUwiQXJpYWxOYXJyb3ciLAkoRlhfTFBDV1NUUilMIkZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMjJiN2RjZSwJKEZYX0xQQ1dTVFIpTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMjJiZmE2MCwJKEZYX0xQQ1dTVFIpTCJDb21pY1NhbnNNUyIsCShGWF9MUENXU1RSKUwiRnJlZU1vbm8sTGliZXJhdGlvbiBNb25vIiwJOCwJMTI1Mn0sDQorICAgIHsweGQzYmQwZTM1LAkoRlhfTFBDV1NUUilMIkJhdWhhdXM5MyIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTYW5zLFVidW50dSIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkNDI5ZWU3YSwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLAkwLAk5MzZ9LA0KKyAgICB7MHhkNjY3OWMxMiwJKEZYX0xQQ1dTVFIpTCJCZXJuYXJkTVRDb25kZW5zZWQiLAkoRlhfTFBDV1NUUilMIk5pbWJ1cyBTYW5zIEwsVVJXIENoYW5jZXJ5IEwsS2Fjc3RPbmUsTGliZXJhdGlvbiBTYW5zIiwJMCwJMTI1Mn0sDQorICAgIHsweGQ4ZThhMDI3LAkoRlhfTFBDV1NUUilMIkx1Y2lkYVNhbnMiLAkoRlhfTFBDV1NUUilMIk5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxMaWJlcmF0aW9uIE1vbm8sVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweGQ5ZmU3NzYxLAkoRlhfTFBDV1NUUilMIkhpZ2hUb3dlclRleHQtUmVnIiwJKEZYX0xQQ1dTVFIpTCJVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KKyAgICB7MHhkYTdlNTUxZSwJKEZYX0xQQ1dTVFIpTCJTVFNvbmciLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsCTAsCTkzNn0sDQorICAgIHsweGRhYTY4NDJkLAkoRlhfTFBDV1NUUilMIlNUWmhvbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYWFhYjkzZiwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsCTAsCTkzNn0sDQorICAgIHsweGRhZWIwNzEzLAkoRlhfTFBDV1NUUilMIlNUU29uZyIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYWZlZGJlZiwJKEZYX0xQQ1dTVFIpTCJTVENhaXl1biIsCShGWF9MUENXU1RSKUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCisgICAgezB4ZGIwMGEzZDksCShGWF9MUENXU1RSKUwiQnJvYWR3YXkiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkYjFmNWFkNCwJKEZYX0xQQ1dTVFIpTCJTVFhpbndlaSIsCShGWF9MUENXU1RSKUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCisgICAgezB4ZGIzMjZlN2YsCShGWF9MUENXU1RSKUwiU1RLYWl0aSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYjY5NTk1YSwJKEZYX0xQQ1dTVFIpTCJTVEh1cG8iLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwJMCwJOTM2fSwNCisgICAgezB4ZGJhMDA4MmMsCShGWF9MUENXU1RSKUwiU1RYaWhlaSIsCShGWF9MUENXU1RSKUwiIFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwJMCwJOTM2fSwNCisgICAgezB4ZGJkMGFiMTgsCShGWF9MUENXU1RSKUwiU1RYaW5na2FpIiwJKEZYX0xQQ1dTVFIpTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLAkwLAk5MzZ9LA0KKyAgICB7MHhkYzFhN2RiMSwJKEZYX0xQQ1dTVFIpTCJTVExpdGkiLAkoRlhfTFBDV1NUUilMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsCTAsCTkzNn0sDQorICAgIHsweGRjMzMwNzVmLAkoRlhfTFBDV1NUUilMIktyaXN0ZW5JVEMtUmVndWxhciIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLAk4LAkxMjUyfSwNCisgICAgezB4ZGNjNzAwOWMsCShGWF9MUENXU1RSKUwiSGFycmluZ3RvbiIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LAkoRlhfTFBDV1NUUilMIkFyaWFsQmxhY2siLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zLERlamFWdSBTZXJpZixGcmVlTW9ubyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZGU4N2IzZSwJKEZYX0xQQ1dTVFIpTCJJbXBhY3QiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZjY5ZmIzMiwJKEZYX0xQQ1dTVFIpTCJTbmFwSVRDIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2FucyxEZWphVnUgU2VyaWYsRnJlZU1vbm8iLAkwLAkxMjUyfSwNCisgICAgezB4ZGY4YjI1ZTgsCShGWF9MUENXU1RSKUwiQ2VudHVyeUdvdGhpYyIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGUwZjcwNWMwLAkoRlhfTFBDV1NUUilMIktyaXN0ZW5JVEMiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zIENvbmRlbnNlZCxVYnVudHUsTGliZXJhdGlvbiBTYW5zIiwJOCwJMTI1Mn0sDQorICAgIHsweGUxNDI3NTczLAkoRlhfTFBDV1NUUilMIlJhYXZpIiwJKEZYX0xQQ1dTVFIpTCJGcmVlU2VyaWYsTGliZXJhdGlvbiBTZXJpZixLaG1lciBPUyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMmNlYTBjYiwJKEZYX0xQQ1dTVFIpTCJNYWduZXRvIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMzZhOWUxNywJKEZYX0xQQ1dTVFIpTCJSYXZpZSIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmLERlamFWdSBTYW5zLEZyZWVNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGU0MzNmOGUyLAkoRlhfTFBDV1NUUilMIlBhcmNobWVudCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJOCwJMTI1Mn0sDQorICAgIHsweGU0M2RmZjRhLAkoRlhfTFBDV1NUUilMIldpbmdkaW5ncyIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJNCwJNDJ9LA0KKyAgICB7MHhlNGUyYzQwNSwJKEZYX0xQQ1dTVFIpTCJNVEV4dHJhIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYiLAk2LAk0Mn0sDQorICAgIHsweGU2MThjYzM1LAkoRlhfTFBDV1NUUilMIkluZm9ybWFsUm9tYW4iLAkoRlhfTFBDV1NUUilMIk5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLAk4LAkxMjUyfSwNCisgICAgezB4ZTZjMjdmZmMsCShGWF9MUENXU1RSKUwiTWlzdHJhbCIsCShGWF9MUENXU1RSKUwiRGVqYVZ1IFNlcmlmIiwJOCwJMTI1Mn0sDQorICAgIHsweGU3ZWJmNGI5LAkoRlhfTFBDV1NUUilMIkNvdXJpZXIiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zLERlamFWdSBTYW5zIENvbmRlbnNlZCxGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4ZThiYzRhOWQsCShGWF9MUENXU1RSKUwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlOTBmYjAxMywJKEZYX0xQQ1dTVFIpTCJUZW1wdXNTYW5zSVRDIiwJKEZYX0xQQ1dTVFIpTCJVYnVudHUsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4ZWM2MzdiNDIsCShGWF9MUENXU1RSKUwiQ29uc29sYXMiLAkoRlhfTFBDV1NUUilMIkRlamFWdSBTYW5zIENvbmRlbnNlZCxGcmVlU2VyaWYsRnJlZVNhbnMiLAkxLAkxMjUyfSwNCisgICAgezB4ZWQzYTY4M2IsCShGWF9MUENXU1RSKUwiU1RYaW53ZWkiLAkoRlhfTFBDV1NUUilMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsCTAsCTkzNn0sDQorICAgIHsweGVmMjY0Y2QxLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUhhbmR3cml0aW5nIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8sTGliZXJhdGlvbiBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLAkoRlhfTFBDV1NUUilMIkJhc2tlcnZpbGxlT2xkRmFjZSIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGYxMDI4MDMwLAkoRlhfTFBDV1NUUilMIk1hbmdhbCIsCShGWF9MUENXU1RSKUwiRnJlZVNhbnMsR2FydWRhLExpYmVyYXRpb24gU2FucyxOaW1idXMgU2FucyBMLEZyZWVTZXJpZixXZW5RdWFuWWkgTWljcm8gSGVpIiwJMiwJMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LAkoRlhfTFBDV1NUUilMIlNob3djYXJkR290aGljIiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYgQ29uZGVuc2VkLERlamFWdSBTYW5zIENvbmRlbnNlZCxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwJMCwJMTI1Mn0sDQorICAgIHsweGYyMTBmMDZhLAkoRlhfTFBDV1NUUilMIkFyaWFsTVQiLAkoRlhfTFBDV1NUUilMIkxpYmVyYXRpb24gU2FucyxGcmVlU2FucyxOaW1idXMgU2FucyBMLEtobWVyIE9TIFN5c3RlbSxLaG1lciBPUyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwJKEZYX0xQQ1dTVFIpTCJMYXRoYSIsCShGWF9MUENXU1RSKUwiTmltYnVzIFNhbnMgTCxGcmVlU2VyaWYsTmltYnVzIFNhbnMgTCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmNjE2ZjNkZCwJKEZYX0xQQ1dTVFIpTCJMaVN1IiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSIFBMIFVNaW5nIFRXIE1CRSxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMSwJOTM2fSwNCisgICAgezB4ZmE0NzlhYTYsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0WWFIZWkiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTkzNn0sDQorICAgIHsweGZjZDE5Njk3LAkoRlhfTFBDV1NUUilMIkJvb2ttYW5PbGRTdHlsZSIsCShGWF9MUENXU1RSKUwiTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwJKEZYX0xQQ1dTVFIpTCJEZWphVnUgU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8iLAkwLAkxMjUyfSwNCisgICAgezB4ZmVmMTM1ZjgsCShGWF9MUENXU1RSKUwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KK307DQorI2VsaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8NCitzdGF0aWMgY29uc3QgWEZBX0ZPTlRJTkZPIGdfWEZBRm9udHNNYXBbXSA9IHsNCisgICAgezB4MDFkNWQzM2UsCShGWF9MUENXU1RSKUwiU2ltU3VuIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkwLAk5MzZ9LA0KKyAgICB7MHgwMWU0ZjEwMiwJKEZYX0xQQ1dTVFIpTCJZb3VZdWFuIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkxLAk5MzZ9LA0KKyAgICB7MHgwMzA1NDlkYywJKEZYX0xQQ1dTVFIpTCJMaVN1IiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkxLAk5MzZ9LA0KKyAgICB7MHgwMzJlZGQ0NCwJKEZYX0xQQ1dTVFIpTCJTaW1oZWkiLAkoRlhfTFBDV1NUUilMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTEsCTkzNn0sDQorICAgIHsweDAzZWFjNmZjLAkoRlhfTFBDV1NUUilMIlBvb3JSaWNoYXJkLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgwM2VkOTBlNiwJKEZYX0xQQ1dTVFIpTCJOaW5hIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwNzdiNTZiMywJKEZYX0xQQ1dTVFIpTCJLaW5nc29mdFBob25ldGljUGxhaW4iLAkoRlhfTFBDV1NUUilMIkxhc3RSZXNvcnQsQXBwbGUgQ2hhbmNlcnksU1RJWFZhcmlhbnRzLFNUSVhTaXplT25lU3ltLFNUSVhTaXplT25lU3ltLEFwcGxlIEJyYWlsbGUiLAkwLAkxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwJKEZYX0xQQ1dTVFIpTCJTb25ndGkgU0MsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwODliMThhOSwJKEZYX0xQQ1dTVFIpTCJBcmlhbCIsCShGWF9MUENXU1RSKUwiQXJpYWwgVW5pY29kZSBNUyxNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLAkoRlhfTFBDV1NUUilMIk1vbm90eXBlQ29yc2l2YSIsCShGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93LEltcGFjdCIsCTgsCTEyNTJ9LA0KKyAgICB7MHgwYmIwMDNlNywJKEZYX0xQQ1dTVFIpTCJLYXJ0aWthIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFyaWFsIE5hcnJvdyxEYW1hc2N1cyIsCTIsCTEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwJKEZYX0xQQ1dTVFIpTCJWaW5lckhhbmRJVEMiLAkoRlhfTFBDV1NUUilMIkNvbWljIFNhbnMgTVMsU29uZ3RpIFNDLFNUU29uZyIsCTgsCTEyNTJ9LA0KKyAgICB7MHgwYmMxYTg1MSwJKEZYX0xQQ1dTVFIpTCJTZWdvZVVJIiwJKEZYX0xQQ1dTVFIpTCJBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDBjMTEyZWJkLAkoRlhfTFBDV1NUUilMIktvenVrYUdvdGhpY1Byby1WSU0iLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4MGNmY2I5YzEsCShGWF9MUENXU1RSKUwiQWRvYmVUaGFpIiwJKEZYX0xQQ1dTVFIpTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQgVWx0cmEgTGlnaHQiLAkwLAk4NDd9LA0KKyAgICB7MHgwZTdkZTBmOSwJKEZYX0xQQ1dTVFIpTCJQbGF5YmlsbCIsCShGWF9MUENXU1RSKUwiU1RJWE5vblVuaWNvZGUiLAkwLAkxMjUyfSwNCisgICAgezB4MGVmZjQ3YzMsCShGWF9MUENXU1RSKUwiU1RIdXBvIiwJKEZYX0xQQ1dTVFIpTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsCTAsCTkzNn0sDQorICAgIHsweDEwN2FkMzc0LAkoRlhfTFBDV1NUUilMIkNvbnN0YW50aWEiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsUGFsYXRpbm8sQmFza2VydmlsbGUiLAkyLAkxMjUyfSwNCisgICAgezB4MTIxOTRjMmQsCShGWF9MUENXU1RSKUwiS3Vuc3RsZXJTY3JpcHQiLAkoRlhfTFBDV1NUUilMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQXJpYWwgTmFycm93IiwJOCwJMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLAkoRlhfTFBDV1NUUilMIk1pbmlvblByb1NtQmQiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4MTU4YzQwNDksCShGWF9MUENXU1RSKUwiR2FyYW1vbmQiLAkoRlhfTFBDV1NUUilMIkltcGFjdCxBcmlhbCBOYXJyb3ciLAkyLAkxMjUyfSwNCisgICAgezB4MTYwZWNiMjQsCShGWF9MUENXU1RSKUwiU1RaaG9uZ3NvbmciLAkoRlhfTFBDV1NUUilMIlNURmFuZ3NvbmcsU29uZ3RpIFNDIiwJMCwJOTM2fSwNCisgICAgezB4MTYxZWQwN2UsCShGWF9MUENXU1RSKUwiTVNHb3RoaWMiLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTEsCTEyNTJ9LA0KKyAgICB7MHgxNzFkMWVkMSwJKEZYX0xQQ1dTVFIpTCJTbmFwSVRDLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIlNUSGVpdGksQXJpYWwgQmxhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MThkMTE4OGYsCShGWF9MUENXU1RSKUwiQ2FtYnJpYSIsCShGWF9MUENXU1RSKUwiQXJpYWwgVW5pY29kZSBNUyIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxOGVhZjM1MCwJKEZYX0xQQ1dTVFIpTCJBcmlhbFVuaWNvZGVNUyIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTkzNn0sDQorICAgIHsweDFhOTJkMTE1LAkoRlhfTFBDV1NUUilMIk1pbmdMaVUiLAkoRlhfTFBDV1NUUilMIkhlaXRpIFNDLFNUSGVpdGkiLAkxLAkxMjUyfSwNCisgICAgezB4MWNjMjE3YzYsCShGWF9MUENXU1RSKUwiVHJlYnVjaGV0TVMiLAkoRlhfTFBDV1NUUilMIkRhbWFzY3VzLEltcGFjdCxBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCisgICAgezB4MWQ2NDk1OTYsCShGWF9MUENXU1RSKUwiQmFzZW1pY1RpbWVzIiwJKEZYX0xQQ1dTVFIpTCJMaWJlcmF0aW9uIFNlcmlmLEltcGFjdCxBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCisgICAgezB4MWUzNGVlNjAsCShGWF9MUENXU1RSKUwiQmVsbE1UIiwJKEZYX0xQQ1dTVFIpTCJQYXB5cnVzLFNUSVhOb25Vbmljb2RlLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEF2ZW5pciBMaWdodCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxZWIzNjk0NSwJKEZYX0xQQ1dTVFIpTCJDb29wZXJCbGFjayIsCShGWF9MUENXU1RSKUwiTWFyaW9uLFNUSVhOb25Vbmljb2RlLEFyaWFsIFJvdW5kZWQgTVQgQm9sZCxMdWNpZGEgR3JhbmRlIiwJMiwJMTI1Mn0sDQorICAgIHsweDFlZjc3ODdkLAkoRlhfTFBDV1NUUilMIkJhdGFuZ0NoZSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTiwsQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMiLAkxLAkxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsCShGWF9MUENXU1RSKUwiQnJ1c2hTY3JpcHRNVCIsCShGWF9MUENXU1RSKUwiU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxDb2NoaW4iLAk4LAkxMjUyfSwNCisgICAgezB4MjIwODc3YWEsCShGWF9MUENXU1RSKUwiQ2FuZGFyYSIsCShGWF9MUENXU1RSKUwiQ29jaGluLEJhc2tlcnZpbGxlLE1hcmlvbiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyMjEzNTAwNywJKEZYX0xQQ1dTVFIpTCJGcmVlc3R5bGVTY3JpcHQtUmVndWxhciIsCShGWF9MUENXU1RSKUwiU1RJWE5vblVuaWNvZGUsTmFkZWVtLFphcGYgRGluZ2JhdHMiLAk4LAkxMjUyfSwNCisgICAgezB4MjUxMDU5YzMsCShGWF9MUENXU1RSKUwiQ2hpbGxlciIsCShGWF9MUENXU1RSKUwiWmFwZiBEaW5nYmF0cyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxQYXB5cnVzLEt1ZmlTdGFuZGFyZEdLLEJhZ2hkYWQiLAkwLAkxMjUyfSwNCisgICAgezB4MjViZWQ2ZGQsCShGWF9MUENXU1RSKUwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLAkoRlhfTFBDV1NUUilMIlRhaG9tYSxBcHBsZSBTeW1ib2xzLEFwcGxlIExpR290aGljLEFyaWFsIFVuaWNvZGUgTVMsTHVjaWRhIEdyYW5kZSxNaWNyb3NvZnQgU2FucyBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyODE1NGM4MSwJKEZYX0xQQ1dTVFIpTCJQYXJjaG1lbnQtUmVndWxhciIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwJKEZYX0xQQ1dTVFIpTCJTVExpdGkiLAkoRlhfTFBDV1NUUilMIkthaXRpIFNDLFNvbmd0aSBTQyIsCTAsCTkzNn0sDQorICAgIHsweDJiMTk5M2I0LAkoRlhfTFBDV1NUUilMIkJhc2VtaWMiLAkoRlhfTFBDV1NUUilMIkltcGFjdCxBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCisgICAgezB4MmIzMTYzMzksCShGWF9MUENXU1RSKUwiTmlhZ2FyYVNvbGlkLVJlZyIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyYzE0NzUyOSwJKEZYX0xQQ1dTVFIpTCJGb290bGlnaHRNVExpZ2h0IiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyxOb3Rld29ydGh5IiwJMCwJMTI1Mn0sDQorICAgIHsweDJjMTk4OTI4LAkoRlhfTFBDV1NUUilMIkhhcmxvd1NvbGlkIiwJKEZYX0xQQ1dTVFIpTCJBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSxBcmlhbCBVbmljb2RlIE1TIiwJMCwJMTI1Mn0sDQorICAgIHsweDJjNmFjNmIyLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUJyaWdodCIsCShGWF9MUENXU1RSKUwiUFQgU2FucyBOYXJyb3csUGFweXJ1cyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBSb3VuZGVkIE1UIEJvbGQsQ29taWMgU2FucyBNUyxBdmVuaXIgTmV4dCIsCTIsCTEyNTJ9LA0KKyAgICB7MHgyYzlmMzhlMiwJKEZYX0xQQ1dTVFIpTCJLb3p1a2FNaW5jaG9Qcm8tVklSIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDJkNWE0N2IwLAkoRlhfTFBDV1NUUilMIlNUQ2FpeXVuIiwJKEZYX0xQQ1dTVFIpTCJLYWl0aSBTQyxTb25ndGkgU0MiLAkwLAk5MzZ9LA0KKyAgICB7MHgyZGVmMjZiZiwJKEZYX0xQQ1dTVFIpTCJCZXJuYXJkTVQtQ29uZGVuc2VkIiwJKEZYX0xQQ1dTVFIpTCJJbXBhY3QsQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCxBbWVyaWNhbiBUeXBld3JpdGVyIiwJMCwJMTI1Mn0sDQorICAgIHsweDJmZDg5MzBiLAkoRlhfTFBDV1NUUilMIktvenVrYU1pbmNob1ByNk5SIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDMxMTU1MjVhLAkoRlhfTFBDV1NUUilMIkZhbmdTb25nX0dCMjMxMiIsCShGWF9MUENXU1RSKUwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpIiwJMCwJMTI1Mn0sDQorICAgIHsweDMxMzI3ODE3LAkoRlhfTFBDV1NUUilMIk15cmlhZFBybyIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgICAgKEZYX0xQQ1dTVFIpTCJIZWx2ZXRpY2EiLCAoRlhfTFBDV1NUUilMIkFyaWFsIE5hcnJvdyxBcmlhbCBVbmljb2RlIE1TLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLExpYmVyYXRpb24gU2FucyxOaW1idXMgU2FucyBMLEF2ZW5pciBOZXh0IE1lZGl1bSIsCSAwLCAgIDEyNTJ9LA0KKyAgICB7MHgzMmFjOTk1YywJKEZYX0xQQ1dTVFIpTCJUZXJtaW5hbCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMzhkNjQ4YSwJKEZYX0xQQ1dTVFIpTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDMzYmI2NWYyLAkoRlhfTFBDV1NUUilMIlN5bGZhZW4iLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsTWFyaW9uIiwJMiwJMTI1Mn0sDQorICAgIHsweDM0MDJjMzBlLAkoRlhfTFBDV1NUUilMIk1TUE1pbmNobyIsCShGWF9MUENXU1RSKUwiQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwJMiwJMTI1Mn0sDQorICAgIHsweDM0MTJiZjMxLAkoRlhfTFBDV1NUUilMIlNpbVN1bi1QVUEiLAkoRlhfTFBDV1NUUilMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTAsCTkzNn0sDQorICAgIHsweDM2ZWIzOWI5LAkoRlhfTFBDV1NUUilMIkJlcmxpblNhbnNGQiIsCShGWF9MUENXU1RSKUwiQW1lcmljYW4gVHlwZXdyaXRlcixJbXBhY3QiLAkwLAkxMjUyfSwNCisgICAgezB4MzZmNDIwNTUsCShGWF9MUENXU1RSKUwiVW5pdmVyc0FUVCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4Mzg2NGM0ZjYsCShGWF9MUENXU1RSKUwiSGlnaFRvd2VyVGV4dCIsCShGWF9MUENXU1RSKUwiU1RJWEdlbmVyYWwsLkhlbHZldGljYSBOZXVlIERlc2sgVUkiLAkyLAkxMjUyfSwNCisgICAgezB4M2EyNTdkMDMsCShGWF9MUENXU1RSKUwiRmFuZ1NvbmdfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLAkwLAkxMjUyfSwNCisgICAgezB4M2NkYWU2NjgsCShGWF9MUENXU1RSKUwiRnJlZXN0eWxlU2NyaXB0IiwJKEZYX0xQQ1dTVFIpTCJOYWRlZW0sWmFwZiBEaW5nYmF0cyxTVElYTm9uVW5pY29kZSIsCTgsCTEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywJKEZYX0xQQ1dTVFIpTCJKb2tlcm1hbiIsCShGWF9MUENXU1RSKUwiUGFweXJ1cyxMdWNpZGEgR3JhbmRlLEhlaXRpIFRDLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCisgICAgezB4M2Q1YjQzODUsCShGWF9MUENXU1RSKUwiUE1pbmdMaVUiLAkoRlhfTFBDV1NUUilMIkhlaXRpIFNDLFNUSGVpdGkiLAkyLAkxMjUyfSwNCisgICAgezB4M2Q5Yjc2NjksCShGWF9MUENXU1RSKUwiRXN0cmFuZ2Vsb0VkZXNzYSIsCShGWF9MUENXU1RSKUwiQW1lcmljYW4gVHlwZXdyaXRlcixNYXJpb24iLAkwLAkxMjUyfSwNCisgICAgezB4M2U1MzJkNzQsCShGWF9MUENXU1RSKUwiRnJhbmtsaW5Hb3RoaWNNZWRpdW0iLAkoRlhfTFBDV1NUUilMIkltcGFjdCxBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCisgICAgezB4M2U2YWEzMmQsCShGWF9MUENXU1RSKUwiTlNpbVN1biIsCShGWF9MUENXU1RSKUwiU1RIZWl0aSxTVEZhbmdzb25nIiwJMSwJOTM2fSwNCisgICAgezB4M2Y2YzM2YTgsCShGWF9MUENXU1RSKUwiR2F1dGFtaSIsCShGWF9MUENXU1RSKUwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RJWEdlbmVyYWwsQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwJKEZYX0xQQ1dTVFIpTCJDaGlsbGVyLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIlBhcHlydXMsS3VmaVN0YW5kYXJkR0ssQmFnaGRhZCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MDlkZTMxMiwJKEZYX0xQQ1dTVFIpTCJNb2Rlcm5Oby4yMCIsCShGWF9MUENXU1RSKUwiQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwJKEZYX0xQQ1dTVFIpTCJHZW9yZ2lhIiwJKEZYX0xQQ1dTVFIpTCIuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxBcmlhbCBVbmljb2RlIE1TIiwJMiwJMTI1Mn0sDQorICAgIHsweDQxNjBhZGU1LAkoRlhfTFBDV1NUUilMIkJlbGxHb3RoaWNTdGRCbGFjayIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwJKEZYX0xQQ1dTVFIpTCJNb2Rlcm4tUmVndWxhciIsCShGWF9MUENXU1RSKUwiSW1wYWN0IiwJMiwJMTI1Mn0sDQorICAgIHsweDQyMmE3MjUyLAkoRlhfTFBDV1NUUilMIlN0ZW5jaWwiLAkoRlhfTFBDV1NUUilMIlNUSVhOb25Vbmljb2RlLFNvbmd0aSBTQyxHZW9yZ2lhLEJhc2tlcnZpbGxlIiwJMCwJMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLAkoRlhfTFBDV1NUUilMIkZpeGVkc3lzIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDQzNWNiNDFkLAkoRlhfTFBDV1NUUilMIlJvbWFuIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCisgICAgezB4NDc4ODIzODMsCShGWF9MUENXU1RSKUwiQ291cmllck5ldyIsCShGWF9MUENXU1RSKUwiUENNeXVuZ2pvLE9zYWthLEFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwJMSwJMTI1Mn0sDQorICAgIHsweDQ4MGEyMzM4LAkoRlhfTFBDV1NUUilMIkJlcmxpblNhbnNGQkRlbWkiLAkoRlhfTFBDV1NUUilMIlNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5IiwJMCwJMTI1Mn0sDQorICAgIHsweDQ4MGJmN2E0LAkoRlhfTFBDV1NUUilMIkNvdXJpZXJTdGQiLAkoRlhfTFBDV1NUUilMIkNvdXJpZXIgTmV3IiwJMCwJMTI1Mn0sDQorICAgIHsweDQ4MWFkNmVkLAkoRlhfTFBDV1NUUilMIlZsYWRpbWlyU2NyaXB0IiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwJOCwJMTI1Mn0sDQorICAgIHsweDQ5MTE1NzdhLAkoRlhfTFBDV1NUUilMIllvdVl1YW4iLAkoRlhfTFBDV1NUUilMIlNUSGVpdGksSGVpdGkgVEMiLAkxLAk5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwJKEZYX0xQQ1dTVFIpTCJTVFhpbmdrYWkiLAkoRlhfTFBDV1NUUilMIkthaXRpIFNDLFNvbmd0aSBTQyIsCTAsCTkzNn0sDQorICAgIHsweDRiZjg4NTY2LAkoRlhfTFBDV1NUUilMIlNlZ29lQ29uZGVuc2VkIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LAkoRlhfTFBDV1NUUilMIkJlcmxpblNhbnNGQi1SZWciLAkoRlhfTFBDV1NUUilMIlNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIsSW1wYWN0IiwJMCwJMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLAkoRlhfTFBDV1NUUilMIkd1bGltQ2hlIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkxLAkxMjUyfSwNCisgICAgezB4NGY2OGJkNzksCShGWF9MUENXU1RSKUwiTGV0dGVyR290aGljU3RkIiwJKEZYX0xQQ1dTVFIpTCJDb3VyaWVyIE5ldyxBbmRhbGUgTW9ubyxBeXV0aGF5YSxQQ015dW5nam8sT3Nha2EiLAkwLAkxMjUyfSwNCisgICAgezB4NTFhMGQwZTYsCShGWF9MUENXU1RSKUwiS296dWthR290aGljUHI2Tk0iLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4NTMxYjNkZWEsCShGWF9MUENXU1RSKUwiQmFzZW1pY1N5bWJvbCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1MzMzZmQzOSwJKEZYX0xQQ1dTVFIpTCJDYWxpZm9ybmlhbkZCLVJlZyIsCShGWF9MUENXU1RSKUwiQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwJMiwJMTI1Mn0sDQorICAgIHsweDUzNTYxYTU0LAkoRlhfTFBDV1NUUilMIkZaWVRLLS1HQksxLTAiLAkoRlhfTFBDV1NUUilMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsCTAsCTkzNn0sDQorICAgIHsweDU1ZTBkZGU2LAkoRlhfTFBDV1NUUilMIkx1Y2lkYVNhbnNUeXBld3JpdGVyIiwJKEZYX0xQQ1dTVFIpTCJNZW5sbyxDb3VyaWVyIE5ldyxBbmRhbGUgTW9ubyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1NzRkNGQzZCwJKEZYX0xQQ1dTVFIpTCJBZG9iZUFyYWJpYyIsCShGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93IiwJMCwJMTI1Mn0sDQorICAgIHsweDU3OTJlNzU5LAkoRlhfTFBDV1NUUilMIlNUS2FpdGkiLAkoRlhfTFBDV1NUUilMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwJMCwJOTM2fSwNCisgICAgezB4NTkyMTk3OGUsCShGWF9MUENXU1RSKUwiTHVjaWRhU2Fuc1VuaWNvZGUiLAkoRlhfTFBDV1NUUilMIkx1Y2lkYSBHcmFuZGUsQXJpYWwgVW5pY29kZSBNUyxNZW5sbyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1OTRlMmRhNCwJKEZYX0xQQ1dTVFIpTCJWcmluZGEiLAkoRlhfTFBDV1NUUilMIkdlZXphIFBybyxEYW1hc2N1cyxTVElYR2VuZXJhbCxHaWxsIFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4NTliYWE5YTIsCShGWF9MUENXU1RSKUwiS2FpVGlfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLAkwLAkxMjUyfSwNCisgICAgezB4NWNmZWRmNGYsCShGWF9MUENXU1RSKUwiQmFza09sZEZhY2UiLAkoRlhfTFBDV1NUUilMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zLEF2ZW5pciBOZXh0IENvbmRlbnNlZCIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1ZTE2YWM5MSwgICAgKEZYX0xQQ1dTVFIpTCJUcmFqYW5Qcm8iLCAgIChGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93LFBUIFNhbnMgTmFycm93LERhbWFzY3VzIiwgIDAsICAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsCShGWF9MUENXU1RSKUwiQWRvYmVNeXVuZ2pvU3RkTSIsCShGWF9MUENXU1RSKUwiQXBwbGVNeXVuZ2pvLEFwcGxlR290aGljLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KKyAgICB7MHg1ZmVmYmZhZCwJKEZYX0xQQ1dTVFIpTCJCYXRhbmciLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwJMiwJMTI1Mn0sDQorICAgIHsweDYwNTM0MmI5LAkoRlhfTFBDV1NUUilMIkRvdHVtQ2hlIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwJMSwJMTI1Mn0sDQorICAgIHsweDYwOGM1ZjlhLAkoRlhfTFBDV1NUUilMIkthaVRpX0dCMjMxMiIsCShGWF9MUENXU1RSKUwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpLEhlaXRpIFRDIiwJMCwJOTM2fSwNCisgICAgezB4NjFlZmQwZDEsCShGWF9MUENXU1RSKUwiTWF0dXJhTVRTY3JpcHRDYXBpdGFscyIsCShGWF9MUENXU1RSKUwiS29rb25vcixEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxTVEhlaXRpLEFyaWFsIEJsYWNrLEF2ZW5pciBOZXh0IEhlYXZ5IiwJMCwJMTI1Mn0sDQorICAgIHsweDYyNjYwOGE5LAkoRlhfTFBDV1NUUilMIk1WQm9saSIsCShGWF9MUENXU1RSKUwiQXBwbGUgQnJhaWxsZSxHZWV6YSBQcm8sTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2MzA1MDFhMywJKEZYX0xQQ1dTVFIpTCJTbWFsbEZvbnRzIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDY1ZDBlMmE5LAkoRlhfTFBDV1NUUilMIkZaWVRLLS1HQksxLTAiLAkoRlhfTFBDV1NUUilMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsCTAsCTkzNn0sDQorICAgIHsweDY2OWYyOWUxLAkoRlhfTFBDV1NUUilMIkZaU1RLLS1HQksxLTAiLAkoRlhfTFBDV1NUUilMIlNUSGVpdGksSGVpdGkgVEMiLAkwLAk5MzZ9LA0KKyAgICB7MHg2NzNhOWU1ZiwJKEZYX0xQQ1dTVFIpTCJUdW5nYSIsCShGWF9MUENXU1RSKUwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBVbHRyYSBMaWdodCxGdXR1cmEiLAkwLAkxMjUyfSwNCisgICAgezB4NjkxYWE0Y2UsCShGWF9MUENXU1RSKUwiTmlhZ2FyYVNvbGlkIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDY5NjI1OWI3LAkoRlhfTFBDV1NUUilMIkNvcmJlbCIsCShGWF9MUENXU1RSKUwiQ29jaGluLEJhc2tlcnZpbGxlLE1hcmlvbiIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2OTZlZTliZSwJKEZYX0xQQ1dTVFIpTCJTVFhpaGVpIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwJMCwJOTM2fSwNCisgICAgezB4NmM1OWNmNjksCShGWF9MUENXU1RSKUwiRG90dW0iLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwJMCwJMTI1Mn0sDQorICAgIHsweDcwN2ZhNTYxLAkoRlhfTFBDV1NUUilMIkd1bmdzdWgiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMiLAkyLAkxMjUyfSwNCisgICAgezB4NzE0MTZiYjIsCShGWF9MUENXU1RSKUwiWldBZG9iZUYiLAkoRlhfTFBDV1NUUilMIlNUSVhTaXplRm91clN5bSxTVElYU2l6ZVRocmVlU3ltLFNUSVhTaXplVHdvU3ltLFNUSVhTaXplT25lU3ltIiwJMCwJMTI1Mn0sDQorICAgIHsweDcxYjQxODAxLAkoRlhfTFBDV1NUUilMIlZlcmRhbmEiLAkoRlhfTFBDV1NUUilMIlRhaG9tYSxNYXJpb24sQXBwbGUgU3ltYm9scywuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxMdWNpZGEgR3JhbmRlLENvdXJpZXIgTmV3IiwJMCwJMTI1Mn0sDQorICAgIHsweDczZjI1ZTRjLAkoRlhfTFBDV1NUUilMIlBhbGF0aW5vTGlub3R5cGUiLAkoRlhfTFBDV1NUUilMIlBhbGF0aW5vLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAkxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsCShGWF9MUENXU1RSKUwiTmlhZ2FyYUVuZ3JhdmVkIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDc0MDAxNjk0LAkoRlhfTFBDV1NUUilMIk15cmlhZFByb0JsYWNrIiwJKEZYX0xQQ1dTVFIpTCJQYWxhdGlubyxCYXNrZXJ2aWxsZSxNYXJpb24sQ29jaGluIiwJMCwJMTI1Mn0sDQorICAgIHsweDc0YjE0ZDhmLAkoRlhfTFBDV1NUUilMIkhhZXR0ZW5zY2h3ZWlsZXIiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4NzRjYjQ0ZWUsCShGWF9MUENXU1RSKUwiTlNpbVN1biIsCShGWF9MUENXU1RSKUwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMSwJOTM2fSwNCisgICAgezB4NzZiNGQ3ZmYsCShGWF9MUENXU1RSKUwiU2hydXRpIiwJKEZYX0xQQ1dTVFIpTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCisgICAgezB4Nzg4YjM1MzMsCShGWF9MUENXU1RSKUwiV2ViZGluZ3MiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk2LAk0Mn0sDQorICAgIHsweDc5N2RkZTk5LAkoRlhfTFBDV1NUUilMIk1TU2VyaWYiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4N2EwZjllOWUsCShGWF9MUENXU1RSKUwiTVNNaW5jaG8iLAkoRlhfTFBDV1NUUilMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsCTEsCTEyNTJ9LA0KKyAgICB7MHg3YjQzOWNhZiwJKEZYX0xQQ1dTVFIpTCJPbGRFbmdsaXNoVGV4dE1UIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEJhc2tlcnZpbGxlLEF2ZW5pciBOZXh0IE1lZGl1bSIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4MjEzYTQzMywJKEZYX0xQQ1dTVFIpTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLAkoRlhfTFBDV1NUUilMIkNvbWljIFNhbnMgTVMsQXZlbmlyIE5leHQsQXJpYWwgUm91bmRlZCBNVCBCb2xkIiwJMCwJMTI1Mn0sDQorICAgIHsweDgyZmVjOTI5LAkoRlhfTFBDV1NUUilMIkFkb2JlU29uZ1N0ZEwiLAkoRlhfTFBDV1NUUilMIkhlaXRpIFRDLFNUSGVpdGkiLAkwLAk5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwJKEZYX0xQQ1dTVFIpTCJNb2Rlcm4iLAkoRlhfTFBDV1NUUilMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLAkwLAkxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsCShGWF9MUENXU1RSKUwiQWxnZXJpYW4iLAkoRlhfTFBDV1NUUilMIlNUSVhOb25Vbmljb2RlLEJhc2tlcnZpbGxlLEF2ZW5pciBOZXh0IE1lZGl1bSxBbWVyaWNhbiBUeXBld3JpdGVyIiwJMCwJMTI1Mn0sDQorICAgIHsweDgzZGFiOWY1LAkoRlhfTFBDV1NUUilMIlNjcmlwdCIsCShGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93IiwJMCwJMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLAkoRlhfTFBDV1NUUilMIlRhaG9tYSIsCShGWF9MUENXU1RSKUwiU29uZ3RpIFNDLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4OGE3ODNjYjIsCShGWF9MUENXU1RSKUwiU2ltU3VuLVBVQSIsCShGWF9MUENXU1RSKUwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMCwJMTI1Mn0sDQorICAgIHsweDhiNWNhYzBlLAkoRlhfTFBDV1NUUilMIk9ueXgiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4OGM2YTQ5OWUsCShGWF9MUENXU1RSKUwiR3VsaW0iLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwJMCwJMTI1Mn0sDQorICAgIHsweDhlMGFmNzkwLAkoRlhfTFBDV1NUUilMIkp1aWNlSVRDIiwJKEZYX0xQQ1dTVFIpTCJOYWRlZW0sQWwgQmF5YW4iLAkwLAkxMjUyfSwNCisgICAgezB4OGU4ZDQzYjIsCShGWF9MUENXU1RSKUwiQ2VudGF1ciIsCShGWF9MUENXU1RSKUwiQXZlbmlyIE5leHQgQ29uZGVuc2VkLE5vdGV3b3J0aHksSW1wYWN0IiwJMiwJMTI1Mn0sDQorICAgIHsweDhlZTRkY2NhLAkoRlhfTFBDV1NUUilMIkJvb2tzaGVsZlN5bWJvbDciLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4OTA3OTQ4MDAsCShGWF9MUENXU1RSKUwiQmVsbEdvdGhpY1N0ZExpZ2h0IiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweDkwOWI1MTZhLAkoRlhfTFBDV1NUUilMIkNlbnR1cnkiLAkoRlhfTFBDV1NUUilMIkRhbWFzY3VzLEFuZGFsZSBNb25vLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwJMiwJMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLAkoRlhfTFBDV1NUUilMIk1TT3V0bG9vayIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTQsCTQyfSwNCisgICAgezB4OTNjOWZiZjEsCShGWF9MUENXU1RSKUwiTHVjaWRhRmF4IiwJKEZYX0xQQ1dTVFIpTCJQVCBTYW5zIE5hcnJvdyxQYXB5cnVzLEtva29ub3IsR2VlemEgUHJvLEFyaWFsIFJvdW5kZWQgTVQgQm9sZCxMdWNpZGEgR3JhbmRlLEZ1dHVyYSIsCTIsCTEyNTJ9LA0KKyAgICB7MHg5NTY1MDg1ZSwJKEZYX0xQQ1dTVFIpTCJCb29rQW50aXF1YSIsCShGWF9MUENXU1RSKUwiUGFsYXRpbm8sTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTIsCTEyNTJ9LA0KKyAgICB7MHg5ODU2ZDk1ZCwJKEZYX0xQQ1dTVFIpTCJBZG9iZU1pbmdTdGRMIiwJKEZYX0xQQ1dTVFIpTCJBSGlyYWdpbm8gU2FucyBHQixIZWl0aSBUQyxTVEhlaXRpIiwJMCwJOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsCShGWF9MUENXU1RSKUwiQ29sb25uYU1UIiwJKEZYX0xQQ1dTVFIpTCJOb3Rld29ydGh5LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLAkwLAkxMjUyfSwNCisgICAgezB4OWNiZDE2YTQsCShGWF9MUENXU1RSKUwiU2hvd2NhcmRHb3RoaWMtUmVnIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBVbmljb2RlIE1TLEdlb3JnaWEsQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KKyAgICB7MHg5ZDczMDA4ZSwJKEZYX0xQQ1dTVFIpTCJNU1NhbnNTZXJpZiIsCShGWF9MUENXU1RSKUwiU29uZ3RpIFNDLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4YTA2MDdkYjEsCShGWF9MUENXU1RSKUwiR3VuZ3N1aENoZSIsCShGWF9MUENXU1RSKUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyBUVyBNQkUsQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMSwJMTI1Mn0sDQorICAgIHsweGEwYmNmNmExLAkoRlhfTFBDV1NUUilMIkxhdGluV2lkZSIsCShGWF9MUENXU1RSKUwiWmFwZmlubyxBcmlhbCBCbGFjayxTVEhlaXRpIiwJMiwJMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LAkoRlhfTFBDV1NUUilMIlN5bWJvbCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTYsCTQyfSwNCisgICAgezB4YTFmYTVhYmMsCShGWF9MUENXU1RSKUwiV2luZ2RpbmdzMiIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTYsCTQyfSwNCisgICAgezB4YTFmYTVhYmQsCShGWF9MUENXU1RSKUwiV2luZ2RpbmdzMyIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTYsCTQyfSwNCisgICAgezB4YTQyN2JhZDQsCShGWF9MUENXU1RSKUwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBcmlhbCBOYXJyb3csQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCIsCTgsCTEyNTJ9LA0KKyAgICB7MHhhOGI5MmVjZSwJKEZYX0xQQ1dTVFIpTCJGWlNUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkwLAk5MzZ9LA0KKyAgICB7MHhhOGQ4M2VjZSwJKEZYX0xQQ1dTVFIpTCJDYWxpZm9ybmlhbkZCIiwJKEZYX0xQQ1dTVFIpTCJBbWVyaWNhbiBUeXBld3JpdGVyLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLAkyLAkxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsCShGWF9MUENXU1RSKUwiS2luZ3NvZnQtUGhvbmV0aWMiLAkoRlhfTFBDV1NUUilMIlNUSVhWYXJpYW50cyxTVElYU2l6ZU9uZVN5bSxBcHBsZSBCcmFpbGxlIiwJMCwJMTI1Mn0sDQorICAgIHsweGFhNmJjYWJlLAkoRlhfTFBDV1NUUilMIkhhcmxvd1NvbGlkSXRhbGljIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSxBcmlhbCBVbmljb2RlIE1TIiwJMCwJMTI1Mn0sDQorICAgIHsweGFkZTUzMzdjLAkoRlhfTFBDV1NUUilMIk1TVUlHb3RoaWMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwJKEZYX0xQQ1dTVFIpTCJXaWRlTGF0aW4iLAkoRlhfTFBDV1NUUilMIk1hcmlvbixQYXB5cnVzLE5hbnVtIFBlbiBTY3JpcHQsWmFwZiBEaW5nYmF0cyxEYW1hc2N1cyxaYXBmaW5vLEFyaWFsIEJsYWNrLFNUSGVpdGkiLAkyLAkxMjUyfSwNCisgICAgezB4YjEyNzY1ZTAsICAgIChGWF9MUENXU1RSKUwiSVRDTGVnYWN5U2Fuc1N0ZEJvb2siLCAgKEZYX0xQQ1dTVFIpTCJMYXN0UmVzb3J0LC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLEFyaWFsIFVuaWNvZGUgTVMsUGFsYXRpbm8iLCAgIDAsICAxMjUyfSwNCisgICAgezB4YjIwN2YwNWQsCShGWF9MUENXU1RSKUwiUG9vclJpY2hhcmQiLAkoRlhfTFBDV1NUUilMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsCTIsCTEyNTJ9LA0KKyAgICB7MHhiM2JjNDkyZiwJKEZYX0xQQ1dTVFIpTCJKdWljZUlUQy1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJOYWRlZW0sQWwgQmF5YW4sU1RJWE5vblVuaWNvZGUiLAkwLAkxMjUyfSwNCisgICAgezB4YjU1NDUzOTksCShGWF9MUENXU1RSKUwiTWFybGV0dCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTQsCTQyfSwNCisgICAgezB4YjVkZDFlYmIsCShGWF9MUENXU1RSKUwiQnJpdGFubmljQm9sZCIsCShGWF9MUENXU1RSKUwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMiLAkwLAkxMjUyfSwNCisgICAgezB4YjY5OWMxYzUsCShGWF9MUENXU1RSKUwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEFyaWFsIEJsYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGI3MjVkNjI5LAkoRlhfTFBDV1NUUilMIlRpbWVzTmV3Um9tYW4iLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkyLAkxMjUyfSwNCisgICAgezB4YjdlYWViZWIsCShGWF9MUENXU1RSKUwiQWRvYmVIZWl0aVN0ZFIiLAkoRlhfTFBDV1NUUilMIkhlaXRpIFRDLFNUSGVpdGkiLAkwLAk5MzZ9LA0KKyAgICB7MHhiZDI5YzQ4NiwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLAkoRlhfTFBDV1NUUilMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5IiwJMCwJMTI1Mn0sDQorICAgIHsweGJlOGE4ZGI0LAkoRlhfTFBDV1NUUilMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweGMxNmMwMTE4LAkoRlhfTFBDV1NUUilMIkFkb2JlSGVicmV3IiwJKEZYX0xQQ1dTVFIpTCIuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxQYWxhdGlubyxBbWVyaWNhbiBUeXBld3JpdGVyIiwJMCwJMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLAkoRlhfTFBDV1NUUilMIk15cmlhZFByb0xpZ2h0IiwJKEZYX0xQQ1dTVFIpTCJQYWxhdGlubyxCYXNrZXJ2aWxsZSxNYXJpb24iLAkwLAkxMjUyfSwNCisgICAgezB4YzY1ZTU2NTksCShGWF9MUENXU1RSKUwiQ2FtYnJpYU1hdGgiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMiLAkyLAkxMjUyfSwNCisgICAgezB4Yzc1YzhmMDUsCShGWF9MUENXU1RSKUwiTHVjaWRhQ29uc29sZSIsCShGWF9MUENXU1RSKUwiQ291cmllciBOZXcsTWVubG8sQW5kYWxlIE1vbm8iLAkxLAkxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsCShGWF9MUENXU1RSKUwiQ2FsaWJyaSIsCShGWF9MUENXU1RSKUwiQXBwbGUgU3ltYm9scyxIZWFkTGluZUEiLAkwLAkxMjUyfSwNCisgICAgezB4Y2IwNTNmNTMsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0WWFIZWkiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KKyAgICB7MHhjYjcxOTBmOSwJKEZYX0xQQ1dTVFIpTCJNYWduZXRvLUJvbGQiLAkoRlhfTFBDV1NUUilMIkx1Y2lkYSBHcmFuZGUiLAkwLAkxMjUyfSwNCisgICAgezB4Y2NhMDBjYzUsCShGWF9MUENXU1RSKUwiU3lzdGVtIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweGNjYWQ2Zjc2LAkoRlhfTFBDV1NUUilMIkpva2VybWFuLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIkx1Y2lkYSBHcmFuZGUiLAkwLAkxMjUyfSwNCisgICAgezB4Y2NjNTgxOGMsCShGWF9MUENXU1RSKUwiRXVyb1NpZ24iLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCisgICAgezB4Y2YzZDcyMzQsCShGWF9MUENXU1RSKUwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweGNmN2I4ZmRiLAkoRlhfTFBDV1NUUilMIk1pbmlvblBybyIsCShGWF9MUENXU1RSKUwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLAkwLAkxMjUyfSwNCisgICAgezB4Y2ZlNTc1NWYsCShGWF9MUENXU1RSKUwiU2ltaGVpIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkxLAk5MzZ9LA0KKyAgICB7MHhkMDExZjRlZSwJKEZYX0xQQ1dTVFIpTCJNU1BHb3RoaWMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwJKEZYX0xQQ1dTVFIpTCJWaXZhbGRpIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEF2ZW5pciBNZWRpdW0sQXZlbmlyIE5leHQgTWVkaXVtIiwJOCwJMTI1Mn0sDQorICAgIHsweGQwN2VkZWMxLAkoRlhfTFBDV1NUUilMIkZyYW5rbGluR290aGljLU1lZGl1bSIsCShGWF9MUENXU1RSKUwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwJKEZYX0xQQ1dTVFIpTCJTaW1TdW4iLAkoRlhfTFBDV1NUUilMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTAsCTkzNn0sDQorICAgIHsweGQxODgxNTYyLAkoRlhfTFBDV1NUUilMIkFyaWFsTmFycm93IiwJKEZYX0xQQ1dTVFIpTCJQVCBTYW5zIE5hcnJvdyxBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweGQyMmI3ZGNlLAkoRlhfTFBDV1NUUilMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMjJiZmE2MCwJKEZYX0xQQ1dTVFIpTCJDb21pY1NhbnNNUyIsCShGWF9MUENXU1RSKUwiRGFtYXNjdXMsR2VvcmdpYSwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxMdWNpZGEgR3JhbmRlLEFyaWFsIFVuaWNvZGUgTVMiLAk4LAkxMjUyfSwNCisgICAgezB4ZDNiZDBlMzUsCShGWF9MUENXU1RSKUwiQmF1aGF1czkzIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEF2ZW5pciBOZXh0LEF2ZW5pciIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkNDI5ZWU3YSwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQorICAgIHsweGQ2Njc5YzEyLAkoRlhfTFBDV1NUUilMIkJlcm5hcmRNVENvbmRlbnNlZCIsCShGWF9MUENXU1RSKUwiSW1wYWN0LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQiLAkwLAkxMjUyfSwNCisgICAgezB4ZDhlOGEwMjcsCShGWF9MUENXU1RSKUwiTHVjaWRhU2FucyIsCShGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93LEtobWVyIE1OLEtva29ub3IsRGFtYXNjdXMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkOWZlNzc2MSwJKEZYX0xQQ1dTVFIpTCJIaWdoVG93ZXJUZXh0LVJlZyIsCShGWF9MUENXU1RSKUwiU1RJWEdlbmVyYWwsLkhlbHZldGljYSBOZXVlIERlc2sgVUksVHJlYnVjaGV0IE1TIiwJMiwJMTI1Mn0sDQorICAgIHsweGRhN2U1NTFlLAkoRlhfTFBDV1NUUilMIlNUU29uZyIsCShGWF9MUENXU1RSKUwiQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQorICAgIHsweGRhYTY4NDJkLAkoRlhfTFBDV1NUUilMIlNUWmhvbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nLFNvbmd0aSBTQyxTVFNvbmciLAkwLAk5MzZ9LA0KKyAgICB7MHhkYWFhYjkzZiwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQorICAgIHsweGRhZWIwNzEzLAkoRlhfTFBDV1NUUilMIlNUU29uZyIsCShGWF9MUENXU1RSKUwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYWZlZGJlZiwJKEZYX0xQQ1dTVFIpTCJTVENhaXl1biIsCShGWF9MUENXU1RSKUwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYjAwYTNkOSwJKEZYX0xQQ1dTVFIpTCJCcm9hZHdheSIsCShGWF9MUENXU1RSKUwiUGFweXJ1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBCbGFjayxBdmVuaXIgTmV4dCBIZWF2eSxIZWl0aSBUQyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkYjFmNWFkNCwJKEZYX0xQQ1dTVFIpTCJTVFhpbndlaSIsCShGWF9MUENXU1RSKUwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwJKEZYX0xQQ1dTVFIpTCJTVEthaXRpIiwJKEZYX0xQQ1dTVFIpTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQorICAgIHsweGRiNjk1OTVhLAkoRlhfTFBDV1NUUilMIlNUSHVwbyIsCShGWF9MUENXU1RSKUwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYmEwMDgyYywJKEZYX0xQQ1dTVFIpTCJTVFhpaGVpIiwJKEZYX0xQQ1dTVFIpTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQorICAgIHsweGRiZDBhYjE4LAkoRlhfTFBDV1NUUilMIlNUWGluZ2thaSIsCShGWF9MUENXU1RSKUwiS2FpdGkgU0MsU29uZ3RpIFNDIiwJMCwJOTM2fSwNCisgICAgezB4ZGMxYTdkYjEsCShGWF9MUENXU1RSKUwiU1RMaXRpIiwJKEZYX0xQQ1dTVFIpTCJLYWl0aSBTQyxTb25ndGkgU0MiLAkwLAk5MzZ9LA0KKyAgICB7MHhkYzMzMDc1ZiwJKEZYX0xQQ1dTVFIpTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIlNUSVhOb25Vbmljb2RlLERhbWFzY3VzLFNvbmd0aSBTQyxTVFNvbmciLAk4LAkxMjUyfSwNCisgICAgezB4ZGNjNzAwOWMsCShGWF9MUENXU1RSKUwiSGFycmluZ3RvbiIsCShGWF9MUENXU1RSKUwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LE5vdGV3b3J0aHkiLAkwLAkxMjUyfSwNCisgICAgezB4ZGQ3MTI0NjYsCShGWF9MUENXU1RSKUwiQXJpYWxCbGFjayIsCShGWF9MUENXU1RSKUwiR2VlemEgUHJvLERhbWFzY3VzLFNvbmd0aSBTQyxTVFNvbmciLAkwLAkxMjUyfSwNCisgICAgezB4ZGRlODdiM2UsCShGWF9MUENXU1RSKUwiSW1wYWN0IiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBOYXJyb3csTWFyaW9uIiwJMCwJMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLAkoRlhfTFBDV1NUUilMIlNuYXBJVEMiLAkoRlhfTFBDV1NUUilMIkFyaWFsIE5hcnJvdyxQVCBTYW5zIE5hcnJvdyxNYXJpb24sU1RIZWl0aSxBcmlhbCBCbGFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZjhiMjVlOCwJKEZYX0xQQ1dTVFIpTCJDZW50dXJ5R290aGljIiwJKEZYX0xQQ1dTVFIpTCJEYW1hc2N1cyxBbmRhbGUgTW9ubyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMGY3MDVjMCwJKEZYX0xQQ1dTVFIpTCJLcmlzdGVuSVRDIiwJKEZYX0xQQ1dTVFIpTCJTb25ndGkgU0MsU1RTb25nIiwJOCwJMTI1Mn0sDQorICAgIHsweGUxNDI3NTczLAkoRlhfTFBDV1NUUilMIlJhYXZpIiwJKEZYX0xQQ1dTVFIpTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxNYXJpb24sUGFweXJ1cyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMmNlYTBjYiwJKEZYX0xQQ1dTVFIpTCJNYWduZXRvIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxHZWV6YSBQcm8sTHVjaWRhIEdyYW5kZSxHZW9yZ2lhLEhlaXRpIFRDIiwJMCwJMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LAkoRlhfTFBDV1NUUilMIlJhdmllIiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEFyaWFsIEJsYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGU0MzNmOGUyLAkoRlhfTFBDV1NUUilMIlBhcmNobWVudCIsCShGWF9MUENXU1RSKUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTgsCTEyNTJ9LA0KKyAgICB7MHhlNDNkZmY0YSwJKEZYX0xQQ1dTVFIpTCJXaW5nZGluZ3MiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk0LAk0Mn0sDQorICAgIHsweGU0ZTJjNDA1LAkoRlhfTFBDV1NUUilMIk1URXh0cmEiLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk2LAk0Mn0sDQorICAgIHsweGU2MThjYzM1LAkoRlhfTFBDV1NUUilMIkluZm9ybWFsUm9tYW4iLAkoRlhfTFBDV1NUUilMIkFyaWFsIE5hcnJvdyIsCTgsCTEyNTJ9LA0KKyAgICB7MHhlNmMyN2ZmYywJKEZYX0xQQ1dTVFIpTCJNaXN0cmFsIiwJKEZYX0xQQ1dTVFIpTCJBcHBsZSBTeW1ib2xzIiwJOCwJMTI1Mn0sDQorICAgIHsweGU3ZWJmNGI5LAkoRlhfTFBDV1NUUilMIkNvdXJpZXIiLAkoRlhfTFBDV1NUUilMIkNvdXJpZXIgTmV3IiwJMCwJMTI1Mn0sDQorICAgIHsweGU4YmM0YTlkLAkoRlhfTFBDV1NUUilMIk1TUmVmZXJlbmNlU3BlY2lhbHR5IiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQorICAgIHsweGU5MGZiMDEzLAkoRlhfTFBDV1NUUilMIlRlbXB1c1NhbnNJVEMiLAkoRlhfTFBDV1NUUilMIlNUSVhOb25Vbmljb2RlLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEF2ZW5pciBMaWdodCIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlYzYzN2I0MiwJKEZYX0xQQ1dTVFIpTCJDb25zb2xhcyIsCShGWF9MUENXU1RSKUwiQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUsQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssTWljcm9zb2Z0IFNhbnMgU2VyaWYsVGFob21hIiwJMSwJMTI1Mn0sDQorICAgIHsweGVkM2E2ODNiLAkoRlhfTFBDV1NUUilMIlNUWGlud2VpIiwJKEZYX0xQQ1dTVFIpTCJLYWl0aSBTQyxTb25ndGkgU0MsIiwJMCwJOTM2fSwNCisgICAgezB4ZWYyNjRjZDEsCShGWF9MUENXU1RSKUwiTHVjaWRhSGFuZHdyaXRpbmciLAkoRlhfTFBDV1NUUilMIkFyaWFsIE5hcnJvdyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgTWVkaXVtLFNUSGVpdGksQXJpYWwgQmxhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ZjA4NmJjYTIsCShGWF9MUENXU1RSKUwiQmFza2VydmlsbGVPbGRGYWNlIiwJKEZYX0xQQ1dTVFIpTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmMTAyODAzMCwJKEZYX0xQQ1dTVFIpTCJNYW5nYWwiLAkoRlhfTFBDV1NUUilMIkFyaWFsIFVuaWNvZGUgTVMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXJpYWwgTmFycm93LFRhaG9tYSIsCTIsCTEyNTJ9LA0KKyAgICB7MHhmMWRhN2ViOSwJKEZYX0xQQ1dTVFIpTCJTaG93Y2FyZEdvdGhpYyIsCShGWF9MUENXU1RSKUwiUGFweXJ1cyxBcmlhbCBVbmljb2RlIE1TLEdlb3JnaWEsQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmMjEwZjA2YSwJKEZYX0xQQ1dTVFIpTCJBcmlhbE1UIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBVbmljb2RlIE1TLEFyaWFsIE5hcnJvdyxTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBNZWRpdW0sQXZlbmlyIE5leHQgQ29uZGVuc2VkIiwJMCwJMTI1Mn0sDQorICAgIHsweGY0NzdmMTZhLAkoRlhfTFBDV1NUUilMIkxhdGhhIiwJKEZYX0xQQ1dTVFIpTCJBcmlhbCBOYXJyb3csRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KKyAgICB7MHhmNjE2ZjNkZCwJKEZYX0xQQ1dTVFIpTCJMaVN1IiwJKEZYX0xQQ1dTVFIpTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkxLAk5MzZ9LA0KKyAgICB7MHhmYTQ3OWFhNiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnRZYUhlaSIsCShGWF9MUENXU1RSKUwiQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQorICAgIHsweGZjZDE5Njk3LAkoRlhfTFBDV1NUUilMIkJvb2ttYW5PbGRTdHlsZSIsCShGWF9MUENXU1RSKUwiR2VlemEgUHJvLERhbWFzY3VzLEFuZGFsZSBNb25vLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwJMCwJMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwJKEZYX0xQQ1dTVFIpTCJLb2tvbm9yLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFNUSGVpdGksQXJpYWwgQmxhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ZmVmMTM1ZjgsCShGWF9MUENXU1RSKUwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJIZWl0aSBUQyxTVEhlaXRpIiwJMCwJOTM2fSwNCit9Ow0KKyNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8NCitzdGF0aWMgY29uc3QgWEZBX0ZPTlRJTkZPIGdfWEZBRm9udHNNYXBbXSA9IHsNCisgICAgezB4MDFkNWQzM2UsCShGWF9MUENXU1RSKUwiU2ltU3VuIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4MDFlNGYxMDIsCShGWF9MUENXU1RSKUwiWW91WXVhbiIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTkzNn0sDQorICAgIHsweDAzMDU0OWRjLAkoRlhfTFBDV1NUUilMIkxpU3UiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KKyAgICB7MHgwMzJlZGQ0NCwJKEZYX0xQQ1dTVFIpTCJTaW1oZWkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KKyAgICB7MHgwM2VhYzZmYywJKEZYX0xQQ1dTVFIpTCJQb29yUmljaGFyZC1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2ssRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLAkyLAkxMjUyfSwNCisgICAgezB4MDNlZDkwZTYsCShGWF9MUENXU1RSKUwiTmluYSIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLAkoRlhfTFBDV1NUUilMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBUaGFpLERyb2lkIFNhbnMgQXJtZW5pYW4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwNzhlZDUyNCwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnRTYW5zU2VyaWYiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MDg5YjE4YTksCShGWF9MUENXU1RSKUwiQXJpYWwiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MGIyY2FkNzIsCShGWF9MUENXU1RSKUwiTW9ub3R5cGVDb3JzaXZhIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk4LAkxMjUyfSwNCisgICAgezB4MGJiMDAzZTcsCShGWF9MUENXU1RSKUwiS2FydGlrYSIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyIsCTIsCTEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwJKEZYX0xQQ1dTVFIpTCJWaW5lckhhbmRJVEMiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KKyAgICB7MHgwYmMxYTg1MSwJKEZYX0xQQ1dTVFIpTCJTZWdvZVVJIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDBjMTEyZWJkLAkoRlhfTFBDV1NUUilMIktvenVrYUdvdGhpY1Byby1WSU0iLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgwY2ZjYjljMSwJKEZYX0xQQ1dTVFIpTCJBZG9iZVRoYWkiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTg0N30sDQorICAgIHsweDBlN2RlMGY5LAkoRlhfTFBDV1NUUilMIlBsYXliaWxsIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweDBlZmY0N2MzLAkoRlhfTFBDV1NUUilMIlNUSHVwbyIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDEwN2FkMzc0LAkoRlhfTFBDV1NUUilMIkNvbnN0YW50aWEiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxMjE5NGMyZCwJKEZYX0xQQ1dTVFIpTCJLdW5zdGxlclNjcmlwdCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLAkoRlhfTFBDV1NUUilMIk1pbmlvblByb1NtQmQiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgxNThjNDA0OSwJKEZYX0xQQ1dTVFIpTCJHYXJhbW9uZCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDE2MGVjYjI0LAkoRlhfTFBDV1NUUilMIlNUWmhvbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4MTYxZWQwN2UsCShGWF9MUENXU1RSKUwiTVNHb3RoaWMiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAkxMjUyfSwNCisgICAgezB4MTcxZDFlZDEsCShGWF9MUENXU1RSKUwiU25hcElUQy1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MThkMTE4OGYsCShGWF9MUENXU1RSKUwiQ2FtYnJpYSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxOGVhZjM1MCwJKEZYX0xQQ1dTVFIpTCJBcmlhbFVuaWNvZGVNUyIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDFhOTJkMTE1LAkoRlhfTFBDV1NUUilMIk1pbmdMaVUiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAkxMjUyfSwNCisgICAgezB4MWNjMjE3YzYsCShGWF9MUENXU1RSKUwiVHJlYnVjaGV0TVMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgxZDY0OTU5NiwJKEZYX0xQQ1dTVFIpTCJCYXNlbWljVGltZXMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgxZTM0ZWU2MCwJKEZYX0xQQ1dTVFIpTCJCZWxsTVQiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KKyAgICB7MHgxZWIzNjk0NSwJKEZYX0xQQ1dTVFIpTCJDb29wZXJCbGFjayIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDFlZjc3ODdkLAkoRlhfTFBDV1NUUilMIkJhdGFuZ0NoZSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KKyAgICB7MHgyMGIzYmQzYSwJKEZYX0xQQ1dTVFIpTCJCcnVzaFNjcmlwdE1UIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyMjA4NzdhYSwJKEZYX0xQQ1dTVFIpTCJDYW5kYXJhIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MjIxMzUwMDcsCShGWF9MUENXU1RSKUwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyNTEwNTljMywJKEZYX0xQQ1dTVFIpTCJDaGlsbGVyIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYiLAkwLAkxMjUyfSwNCisgICAgezB4MjViZWQ2ZGQsCShGWF9MUENXU1RSKUwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MjgxNTRjODEsCShGWF9MUENXU1RSKUwiUGFyY2htZW50LVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwJKEZYX0xQQ1dTVFIpTCJTVExpdGkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwJKEZYX0xQQ1dTVFIpTCJCYXNlbWljIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4MmIzMTYzMzksCShGWF9MUENXU1RSKUwiTmlhZ2FyYVNvbGlkLVJlZyIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDJjMTQ3NTI5LAkoRlhfTFBDV1NUUilMIkZvb3RsaWdodE1UTGlnaHQiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwJKEZYX0xQQ1dTVFIpTCJIYXJsb3dTb2xpZCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDJjNmFjNmIyLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUJyaWdodCIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwJMiwJMTI1Mn0sDQorICAgIHsweDJjOWYzOGUyLAkoRlhfTFBDV1NUUilMIktvenVrYU1pbmNob1Byby1WSVIiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwJKEZYX0xQQ1dTVFIpTCJTVENhaXl1biIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDJkZWYyNmJmLAkoRlhfTFBDV1NUUilMIkJlcm5hcmRNVC1Db25kZW5zZWQiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgyZmQ4OTMwYiwJKEZYX0xQQ1dTVFIpTCJLb3p1a2FNaW5jaG9QcjZOUiIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDMxMTU1MjVhLAkoRlhfTFBDV1NUUilMIkZhbmdTb25nX0dCMjMxMiIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMTMyNzgxNywJKEZYX0xQQ1dTVFIpTCJNeXJpYWRQcm8iLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgICAgKEZYX0xQQ1dTVFIpTCJIZWx2ZXRpY2EiLCAoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsCSAwLCAgIDEyNTJ9LA0KKyAgICB7MHgzMmFjOTk1YywJKEZYX0xQQ1dTVFIpTCJUZXJtaW5hbCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDMzOGQ2NDhhLAkoRlhfTFBDV1NUUilMIk5pYWdhcmFFbmdyYXZlZC1SZWciLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwJKEZYX0xQQ1dTVFIpTCJTeWxmYWVuIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4MzQwMmMzMGUsCShGWF9MUENXU1RSKUwiTVNQTWluY2hvIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDM0MTJiZjMxLAkoRlhfTFBDV1NUUilMIlNpbVN1bi1QVUEiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHgzNmViMzliOSwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkIiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzNmY0MjA1NSwJKEZYX0xQQ1dTVFIpTCJVbml2ZXJzQVRUIiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzODY0YzRmNiwJKEZYX0xQQ1dTVFIpTCJIaWdoVG93ZXJUZXh0IiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4M2EyNTdkMDMsCShGWF9MUENXU1RSKUwiRmFuZ1NvbmdfR0IyMzEyIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDNjZGFlNjY4LAkoRlhfTFBDV1NUUilMIkZyZWVzdHlsZVNjcmlwdCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQorICAgIHsweDNkNTVhZWQ3LAkoRlhfTFBDV1NUUilMIkpva2VybWFuIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4M2Q1YjQzODUsCShGWF9MUENXU1RSKUwiUE1pbmdMaVUiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4M2Q5Yjc2NjksCShGWF9MUENXU1RSKUwiRXN0cmFuZ2Vsb0VkZXNzYSIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDNlNTMyZDc0LAkoRlhfTFBDV1NUUilMIkZyYW5rbGluR290aGljTWVkaXVtIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4M2U2YWEzMmQsCShGWF9MUENXU1RSKUwiTlNpbVN1biIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTkzNn0sDQorICAgIHsweDNmNmMzNmE4LAkoRlhfTFBDV1NUUilMIkdhdXRhbWkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwJKEZYX0xQQ1dTVFIpTCJDaGlsbGVyLVJlZ3VsYXIiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MDlkZTMxMiwJKEZYX0xQQ1dTVFIpTCJNb2Rlcm5Oby4yMCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDQxNDQzYzVlLAkoRlhfTFBDV1NUUilMIkdlb3JnaWEiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KKyAgICB7MHg0MTYwYWRlNSwJKEZYX0xQQ1dTVFIpTCJCZWxsR290aGljU3RkQmxhY2siLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwJKEZYX0xQQ1dTVFIpTCJNb2Rlcm4tUmVndWxhciIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDQyMmE3MjUyLAkoRlhfTFBDV1NUUilMIlN0ZW5jaWwiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0MmM4NTU0ZiwJKEZYX0xQQ1dTVFIpTCJGaXhlZHN5cyIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDQzNWNiNDFkLAkoRlhfTFBDV1NUUilMIlJvbWFuIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NDc4ODIzODMsCShGWF9MUENXU1RSKUwiQ291cmllck5ldyIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KKyAgICB7MHg0ODBhMjMzOCwJKEZYX0xQQ1dTVFIpTCJCZXJsaW5TYW5zRkJEZW1pIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NDgwYmY3YTQsCShGWF9MUENXU1RSKUwiQ291cmllclN0ZCIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0ODFhZDZlZCwJKEZYX0xQQ1dTVFIpTCJWbGFkaW1pclNjcmlwdCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQorICAgIHsweDQ5MTE1NzdhLAkoRlhfTFBDV1NUUilMIllvdVl1YW4iLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwJKEZYX0xQQ1dTVFIpTCJTVFhpbmdrYWkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHg0YmY4ODU2NiwJKEZYX0xQQ1dTVFIpTCJTZWdvZUNvbmRlbnNlZCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LAkoRlhfTFBDV1NUUilMIkJlcmxpblNhbnNGQi1SZWciLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg0ZWE5NjdjZSwJKEZYX0xQQ1dTVFIpTCJHdWxpbUNoZSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KKyAgICB7MHg0ZjY4YmQ3OSwJKEZYX0xQQ1dTVFIpTCJMZXR0ZXJHb3RoaWNTdGQiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1MWEwZDBlNiwJKEZYX0xQQ1dTVFIpTCJLb3p1a2FHb3RoaWNQcjZOTSIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDUzMWIzZGVhLAkoRlhfTFBDV1NUUilMIkJhc2VtaWNTeW1ib2wiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1MzMzZmQzOSwJKEZYX0xQQ1dTVFIpTCJDYWxpZm9ybmlhbkZCLVJlZyIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDUzNTYxYTU0LAkoRlhfTFBDV1NUUilMIkZaWVRLLS1HQksxLTAiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHg1NWUwZGRlNiwJKEZYX0xQQ1dTVFIpTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBNb25vLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljIiwJMCwJMTI1Mn0sDQorICAgIHsweDU3NGQ0ZDNkLAkoRlhfTFBDV1NUUilMIkFkb2JlQXJhYmljIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NTc5MmU3NTksCShGWF9MUENXU1RSKUwiU1RLYWl0aSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDU5MjE5NzhlLAkoRlhfTFBDV1NUUilMIkx1Y2lkYVNhbnNVbmljb2RlIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDU5NGUyZGE0LAkoRlhfTFBDV1NUUilMIlZyaW5kYSIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1OWJhYTlhMiwJKEZYX0xQQ1dTVFIpTCJLYWlUaV9HQjIzMTIiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NWNmZWRmNGYsCShGWF9MUENXU1RSKUwiQmFza09sZEZhY2UiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg1Zjk3OTIxYywJKEZYX0xQQ1dTVFIpTCJBZG9iZU15dW5nam9TdGRNIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4NWZlZmJmYWQsCShGWF9MUENXU1RSKUwiQmF0YW5nIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweDYwNTM0MmI5LAkoRlhfTFBDV1NUUilMIkRvdHVtQ2hlIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJMTI1Mn0sDQorICAgIHsweDYwOGM1ZjlhLAkoRlhfTFBDV1NUUilMIkthaVRpX0dCMjMxMiIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDYxZWZkMGQxLAkoRlhfTFBDV1NUUilMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAkoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8iLAkwLAkxMjUyfSwNCisgICAgezB4NjI2NjA4YTksCShGWF9MUENXU1RSKUwiTVZCb2xpIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweDYzMDUwMWEzLAkoRlhfTFBDV1NUUilMIlNtYWxsRm9udHMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg2NWQwZTJhOSwJKEZYX0xQQ1dTVFIpTCJGWllUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4NjY5ZjI5ZTEsCShGWF9MUENXU1RSKUwiRlpTVEstLUdCSzEtMCIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDY3M2E5ZTVmLAkoRlhfTFBDV1NUUilMIlR1bmdhIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NjkxYWE0Y2UsCShGWF9MUENXU1RSKUwiTmlhZ2FyYVNvbGlkIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Njk2MjU5YjcsCShGWF9MUENXU1RSKUwiQ29yYmVsIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Njk2ZWU5YmUsCShGWF9MUENXU1RSKUwiU1RYaWhlaSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDZjNTljZjY5LAkoRlhfTFBDV1NUUilMIkRvdHVtIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDcwN2ZhNTYxLAkoRlhfTFBDV1NUUilMIkd1bmdzdWgiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4NzE0MTZiYjIsCShGWF9MUENXU1RSKUwiWldBZG9iZUYiLAkoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEFybWVuaWFuLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyBHZW9yZ2lhbixEcm9pZCBTYW5zIEhlYnJldyxEcm9pZCBTYW5zIFRoYWkiLAkwLAkxMjUyfSwNCisgICAgezB4NzFiNDE4MDEsCShGWF9MUENXU1RSKUwiVmVyZGFuYSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDczZjI1ZTRjLAkoRlhfTFBDV1NUUilMIlBhbGF0aW5vTGlub3R5cGUiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsCShGWF9MUENXU1RSKUwiTmlhZ2FyYUVuZ3JhdmVkIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4NzQwMDE2OTQsCShGWF9MUENXU1RSKUwiTXlyaWFkUHJvQmxhY2siLAkoRlhfTFBDV1NUUilMIkJvb2sgQW50aXF1YSxDb25zdGFudGlhLERvdHVtLEdlb3JnaWEiLAkwLAkxMjUyfSwNCisgICAgezB4NzRiMTRkOGYsCShGWF9MUENXU1RSKUwiSGFldHRlbnNjaHdlaWxlciIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDc0Y2I0NGVlLAkoRlhfTFBDV1NUUilMIk5TaW1TdW4iLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KKyAgICB7MHg3NmI0ZDdmZiwJKEZYX0xQQ1dTVFIpTCJTaHJ1dGkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8iLAkwLAkxMjUyfSwNCisgICAgezB4Nzg4YjM1MzMsCShGWF9MUENXU1RSKUwiV2ViZGluZ3MiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTYsCTQyfSwNCisgICAgezB4Nzk3ZGRlOTksCShGWF9MUENXU1RSKUwiTVNTZXJpZiIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDdhMGY5ZTllLAkoRlhfTFBDV1NUUilMIk1TTWluY2hvIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLAkoRlhfTFBDV1NUUilMIk9sZEVuZ2xpc2hUZXh0TVQiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4MjEzYTQzMywJKEZYX0xQQ1dTVFIpTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4MmZlYzkyOSwJKEZYX0xQQ1dTVFIpTCJBZG9iZVNvbmdTdGRMIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4ODM1ODE4MjUsCShGWF9MUENXU1RSKUwiTW9kZXJuIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsCShGWF9MUENXU1RSKUwiQWxnZXJpYW4iLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4M2RhYjlmNSwJKEZYX0xQQ1dTVFIpTCJTY3JpcHQiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4NDdiNTZkYSwJKEZYX0xQQ1dTVFIpTCJUYWhvbWEiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4OGE3ODNjYjIsCShGWF9MUENXU1RSKUwiU2ltU3VuLVBVQSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4YjVjYWMwZSwJKEZYX0xQQ1dTVFIpTCJPbnl4IiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4OGM2YTQ5OWUsCShGWF9MUENXU1RSKUwiR3VsaW0iLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsCShGWF9MUENXU1RSKUwiSnVpY2VJVEMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHg4ZThkNDNiMiwJKEZYX0xQQ1dTVFIpTCJDZW50YXVyIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4OGVlNGRjY2EsCShGWF9MUENXU1RSKUwiQm9va3NoZWxmU3ltYm9sNyIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLAkoRlhfTFBDV1NUUilMIkJlbGxHb3RoaWNTdGRMaWdodCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDkwOWI1MTZhLAkoRlhfTFBDV1NUUilMIkNlbnR1cnkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KKyAgICB7MHg5MmFlMzcwZCwJKEZYX0xQQ1dTVFIpTCJNU091dGxvb2siLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTQsCTQyfSwNCisgICAgezB4OTNjOWZiZjEsCShGWF9MUENXU1RSKUwiTHVjaWRhRmF4IiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMiwJMTI1Mn0sDQorICAgIHsweDk1NjUwODVlLAkoRlhfTFBDV1NUUilMIkJvb2tBbnRpcXVhIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4OTg1NmQ5NWQsCShGWF9MUENXU1RSKUwiQWRvYmVNaW5nU3RkTCIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTk0OX0sDQorICAgIHsweDliYmFkZDZiLAkoRlhfTFBDV1NUUilMIkNvbG9ubmFNVCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LAkoRlhfTFBDV1NUUilMIlNob3djYXJkR290aGljLVJlZyIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWMiLAkwLAkxMjUyfSwNCisgICAgezB4OWQ3MzAwOGUsCShGWF9MUENXU1RSKUwiTVNTYW5zU2VyaWYiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhhMDYwN2RiMSwJKEZYX0xQQ1dTVFIpTCJHdW5nc3VoQ2hlIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJMTI1Mn0sDQorICAgIHsweGEwYmNmNmExLAkoRlhfTFBDV1NUUilMIkxhdGluV2lkZSIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LAkoRlhfTFBDV1NUUilMIlN5bWJvbCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJNiwJNDJ9LA0KKyAgICB7MHhhMWZhNWFiYywJKEZYX0xQQ1dTVFIpTCJXaW5nZGluZ3MyIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk2LAk0Mn0sDQorICAgIHsweGExZmE1YWJkLAkoRlhfTFBDV1NUUilMIldpbmdkaW5nczMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTYsCTQyfSwNCisgICAgezB4YTQyN2JhZDQsCShGWF9MUENXU1RSKUwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsCTgsCTEyNTJ9LA0KKyAgICB7MHhhOGI5MmVjZSwJKEZYX0xQQ1dTVFIpTCJGWlNUSy0tR0JLMS0wIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4YThkODNlY2UsCShGWF9MUENXU1RSKUwiQ2FsaWZvcm5pYW5GQiIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweGFhM2UwODJjLAkoRlhfTFBDV1NUUilMIktpbmdzb2Z0LVBob25ldGljIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4YWE2YmNhYmUsCShGWF9MUENXU1RSKUwiSGFybG93U29saWRJdGFsaWMiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhhZGU1MzM3YywJKEZYX0xQQ1dTVFIpTCJNU1VJR290aGljIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4YjA4ZGQ5NDEsCShGWF9MUENXU1RSKUwiV2lkZUxhdGluIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMiwJMTI1Mn0sDQorICAgIHsweGIyMDdmMDVkLAkoRlhfTFBDV1NUUilMIlBvb3JSaWNoYXJkIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4YjNiYzQ5MmYsCShGWF9MUENXU1RSKUwiSnVpY2VJVEMtUmVndWxhciIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGI1NTQ1Mzk5LAkoRlhfTFBDV1NUUilMIk1hcmxldHQiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTQsCTQyfSwNCisgICAgezB4YjVkZDFlYmIsCShGWF9MUENXU1RSKUwiQnJpdGFubmljQm9sZCIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLAkwLAkxMjUyfSwNCisgICAgezB4YjY5OWMxYzUsCShGWF9MUENXU1RSKUwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4YjcyNWQ2MjksCShGWF9MUENXU1RSKUwiVGltZXNOZXdSb21hbiIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KKyAgICB7MHhiN2VhZWJlYiwJKEZYX0xQQ1dTVFIpTCJBZG9iZUhlaXRpU3RkUiIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGJkMjljNDg2LAkoRlhfTFBDV1NUUilMIkJlcmxpblNhbnNGQkRlbWktQm9sZCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGJlOGE4ZGI0LAkoRlhfTFBDV1NUUilMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4YzE2YzAxMTgsCShGWF9MUENXU1RSKUwiQWRvYmVIZWJyZXciLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhjMzE4YjBhZiwJKEZYX0xQQ1dTVFIpTCJNeXJpYWRQcm9MaWdodCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGM2NWU1NjU5LAkoRlhfTFBDV1NUUilMIkNhbWJyaWFNYXRoIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQorICAgIHsweGM3NWM4ZjA1LAkoRlhfTFBDV1NUUilMIkx1Y2lkYUNvbnNvbGUiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KKyAgICB7MHhjYTdjMzVkNiwJKEZYX0xQQ1dTVFIpTCJDYWxpYnJpIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGNiMDUzZjUzLAkoRlhfTFBDV1NUUilMIk1pY3Jvc29mdFlhSGVpIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4Y2I3MTkwZjksCShGWF9MUENXU1RSKUwiTWFnbmV0by1Cb2xkIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Y2NhMDBjYzUsCShGWF9MUENXU1RSKUwiU3lzdGVtIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Y2NhZDZmNzYsCShGWF9MUENXU1RSKUwiSm9rZXJtYW4tUmVndWxhciIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGNjYzU4MThjLAkoRlhfTFBDV1NUUilMIkV1cm9TaWduIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Y2YzZDcyMzQsCShGWF9MUENXU1RSKUwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Y2Y3YjhmZGIsCShGWF9MUENXU1RSKUwiTWluaW9uUHJvIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4Y2ZlNTc1NWYsCShGWF9MUENXU1RSKUwiU2ltaGVpIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJOTM2fSwNCisgICAgezB4ZDAxMWY0ZWUsCShGWF9MUENXU1RSKUwiTVNQR290aGljIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGQwNjBlN2VmLAkoRlhfTFBDV1NUUilMIlZpdmFsZGkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KKyAgICB7MHhkMDdlZGVjMSwJKEZYX0xQQ1dTVFIpTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwJKEZYX0xQQ1dTVFIpTCJTaW1TdW4iLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwJKEZYX0xQQ1dTVFIpTCJBcmlhbE5hcnJvdyIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGQyMmI3ZGNlLAkoRlhfTFBDV1NUUilMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGQyMmJmYTYwLAkoRlhfTFBDV1NUUilMIkNvbWljU2Fuc01TIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KKyAgICB7MHhkM2JkMGUzNSwJKEZYX0xQQ1dTVFIpTCJCYXVoYXVzOTMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkNDI5ZWU3YSwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4ZDY2NzljMTIsCShGWF9MUENXU1RSKUwiQmVybmFyZE1UQ29uZGVuc2VkIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ZDhlOGEwMjcsCShGWF9MUENXU1RSKUwiTHVjaWRhU2FucyIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwJMCwJMTI1Mn0sDQorICAgIHsweGQ5ZmU3NzYxLAkoRlhfTFBDV1NUUilMIkhpZ2hUb3dlclRleHQtUmVnIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCisgICAgezB4ZGE3ZTU1MWUsCShGWF9MUENXU1RSKUwiU1RTb25nIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4ZGFhNjg0MmQsCShGWF9MUENXU1RSKUwiU1RaaG9uZ3NvbmciLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHhkYWFhYjkzZiwJKEZYX0xQQ1dTVFIpTCJTVEZhbmdzb25nIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4ZGFlYjA3MTMsCShGWF9MUENXU1RSKUwiU1RTb25nIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHhkYWZlZGJlZiwJKEZYX0xQQ1dTVFIpTCJTVENhaXl1biIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGRiMDBhM2Q5LAkoRlhfTFBDV1NUUilMIkJyb2Fkd2F5IiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ZGIxZjVhZDQsCShGWF9MUENXU1RSKUwiU1RYaW53ZWkiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwJKEZYX0xQQ1dTVFIpTCJTVEthaXRpIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4ZGI2OTU5NWEsCShGWF9MUENXU1RSKUwiU1RIdXBvIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCisgICAgezB4ZGJhMDA4MmMsCShGWF9MUENXU1RSKUwiU1RYaWhlaSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGRiZDBhYjE4LAkoRlhfTFBDV1NUUilMIlNUWGluZ2thaSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGRjMWE3ZGIxLAkoRlhfTFBDV1NUUilMIlNUTGl0aSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGRjMzMwNzVmLAkoRlhfTFBDV1NUUilMIktyaXN0ZW5JVEMtUmVndWxhciIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwJOCwJMTI1Mn0sDQorICAgIHsweGRjYzcwMDljLAkoRlhfTFBDV1NUUilMIkhhcnJpbmd0b24iLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZDcxMjQ2NiwJKEZYX0xQQ1dTVFIpTCJBcmlhbEJsYWNrIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ZGRlODdiM2UsCShGWF9MUENXU1RSKUwiSW1wYWN0IiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCisgICAgezB4ZGY2OWZiMzIsCShGWF9MUENXU1RSKUwiU25hcElUQyIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhkZjhiMjVlOCwJKEZYX0xQQ1dTVFIpTCJDZW50dXJ5R290aGljIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGUwZjcwNWMwLAkoRlhfTFBDV1NUUilMIktyaXN0ZW5JVEMiLAkoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsCTgsCTEyNTJ9LA0KKyAgICB7MHhlMTQyNzU3MywJKEZYX0xQQ1dTVFIpTCJSYWF2aSIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlMmNlYTBjYiwJKEZYX0xQQ1dTVFIpTCJNYWduZXRvIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LAkoRlhfTFBDV1NUUilMIlJhdmllIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGU0MzNmOGUyLAkoRlhfTFBDV1NUUilMIlBhcmNobWVudCIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQorICAgIHsweGU0M2RmZjRhLAkoRlhfTFBDV1NUUilMIldpbmdkaW5ncyIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJNCwJNDJ9LA0KKyAgICB7MHhlNGUyYzQwNSwJKEZYX0xQQ1dTVFIpTCJNVEV4dHJhIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk2LAk0Mn0sDQorICAgIHsweGU2MThjYzM1LAkoRlhfTFBDV1NUUilMIkluZm9ybWFsUm9tYW4iLAkoRlhfTFBDV1NUUilMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsCTgsCTEyNTJ9LA0KKyAgICB7MHhlNmMyN2ZmYywJKEZYX0xQQ1dTVFIpTCJNaXN0cmFsIiwJKEZYX0xQQ1dTVFIpTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk4LAkxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksCShGWF9MUENXU1RSKUwiQ291cmllciIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlOGJjNGE5ZCwJKEZYX0xQQ1dTVFIpTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGU5MGZiMDEzLAkoRlhfTFBDV1NUUilMIlRlbXB1c1NhbnNJVEMiLAkoRlhfTFBDV1NUUilMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KKyAgICB7MHhlYzYzN2I0MiwJKEZYX0xQQ1dTVFIpTCJDb25zb2xhcyIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KKyAgICB7MHhlZDNhNjgzYiwJKEZYX0xQQ1dTVFIpTCJTVFhpbndlaSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGVmMjY0Y2QxLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUhhbmR3cml0aW5nIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLAkoRlhfTFBDV1NUUilMIkJhc2tlcnZpbGxlT2xkRmFjZSIsCShGWF9MUENXU1RSKUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGYxMDI4MDMwLAkoRlhfTFBDV1NUUilMIk1hbmdhbCIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyIsCTIsCTEyNTJ9LA0KKyAgICB7MHhmMWRhN2ViOSwJKEZYX0xQQ1dTVFIpTCJTaG93Y2FyZEdvdGhpYyIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWMiLAkwLAkxMjUyfSwNCisgICAgezB4ZjIxMGYwNmEsCShGWF9MUENXU1RSKUwiQXJpYWxNVCIsCShGWF9MUENXU1RSKUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmIiwJMCwJMTI1Mn0sDQorICAgIHsweGY0NzdmMTZhLAkoRlhfTFBDV1NUUilMIkxhdGhhIiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGY2MTZmM2RkLAkoRlhfTFBDV1NUUilMIkxpU3UiLAkoRlhfTFBDV1NUUilMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KKyAgICB7MHhmYTQ3OWFhNiwJKEZYX0xQQ1dTVFIpTCJNaWNyb3NvZnRZYUhlaSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweGZjZDE5Njk3LAkoRlhfTFBDV1NUUilMIkJvb2ttYW5PbGRTdHlsZSIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLAkoRlhfTFBDV1NUUilMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwJKEZYX0xQQ1dTVFIpTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQorICAgIHsweGZlZjEzNWY4LAkoRlhfTFBDV1NUUilMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsCShGWF9MUENXU1RSKUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorfTsNCisjZW5kaWYNCit2b2lkIFhGQV9Mb2NhbEZvbnROYW1lVG9FbmdsaXNoTmFtZShGWF9XU1RSIHdzTG9jYWxOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NFbmdsaXNoTmFtZSkNCit7DQorICAgIHdzRW5nbGlzaE5hbWUgPSB3c0xvY2FsTmFtZTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSAgX0ZYTV9QTEFURk9STV9BTkRST0lEXw0KKyAgICBGWF9EV09SRCBkd0xvY2FsTmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0xvY2FsTmFtZS5HZXRQdHIoKSwgd3NMb2NhbE5hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwOw0KKyAgICBGWF9JTlQzMiBpRW5kID0gc2l6ZW9mKGdfWEZBRm9udHNNYXApIC8gc2l6ZW9mKFhGQV9GT05USU5GTykgLSAxOw0KKyAgICBGWF9JTlQzMiBpTWlkID0gMDsNCisgICAgZG8gew0KKyAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBGWF9EV09SRCBkd0ZvbnROYW1lSGFzaCA9IGdfWEZBRm9udHNNYXBbaU1pZF0uZHdGb250TmFtZUhhc2g7DQorICAgICAgICBpZiAoZHdGb250TmFtZUhhc2ggPT0gZHdMb2NhbE5hbWVIYXNoKSB7DQorICAgICAgICAgICAgd3NFbmdsaXNoTmFtZSA9IGdfWEZBRm9udHNNYXBbaU1pZF0ucFBzTmFtZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSBpZiAoZHdGb250TmFtZUhhc2ggPCBkd0xvY2FsTmFtZUhhc2gpIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpRW5kID49IGlTdGFydCk7DQorI2VuZGlmDQorfQ0KK2NvbnN0IFhGQV9GT05USU5GTyogWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZShGWF9XU1RSIHdzRm9udE5hbWUpDQorew0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IF9GWE1fUExBVEZPUk1fID09ICBfRlhNX1BMQVRGT1JNX0FORFJPSURfDQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9udE5hbWVUZW1wID0gd3NGb250TmFtZTsNCisgICAgd3NGb250TmFtZVRlbXAuUmVtb3ZlKEwnICcpOw0KKyAgICBGWF9EV09SRCBkd0N1ckZvbnROYW1lSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udE5hbWVUZW1wLCB3c0ZvbnROYW1lVGVtcC5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDA7DQorICAgIEZYX0lOVDMyIGlFbmQgPSBzaXplb2YoZ19YRkFGb250c01hcCkgLyBzaXplb2YoWEZBX0ZPTlRJTkZPKSAtIDE7DQorICAgIEZYX0lOVDMyIGlNaWQgPSAwOw0KKyAgICBjb25zdCBYRkFfRk9OVElORk8gKnBGb250SW5mbyA9IE5VTEw7DQorICAgIGRvIHsNCisgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2ggPSBnX1hGQUZvbnRzTWFwW2lNaWRdLmR3Rm9udE5hbWVIYXNoOw0KKyAgICAgICAgaWYgKGR3Rm9udE5hbWVIYXNoID09IGR3Q3VyRm9udE5hbWVIYXNoKSB7DQorICAgICAgICAgICAgcEZvbnRJbmZvID0gJmdfWEZBRm9udHNNYXBbaU1pZF07DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKGR3Rm9udE5hbWVIYXNoIDwgZHdDdXJGb250TmFtZUhhc2gpIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpRW5kID49IGlTdGFydCk7DQorICAgIHJldHVybiBwRm9udEluZm87DQorI2Vsc2UNCisgICAgcmV0dXJuIE5VTEw7DQorI2VuZGlmDQorfQ0KK0lYRkFfRm9udE1nciogWEZBX0dldERlZmF1bHRGb250TWdyKCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ1hGQV9EZWZGb250TWdyOw0KK30NCitDWEZBX0RlZkZvbnRNZ3I6On5DWEZBX0RlZkZvbnRNZ3IoKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50cyA9IG1fQ2FjaGVGb250cy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnRzOyBpKyspIHsNCisgICAgICAgICgoSUZYX0ZvbnQqKW1fQ2FjaGVGb250c1tpXSktPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBtX0NhY2hlRm9udHMuUmVtb3ZlQWxsKCk7DQorfQ0KKyNkZWZpbmUgX0ZYRkFfVVNFR0FTRk9OVE1HUl8NCitJRlhfRm9udCogQ1hGQV9EZWZGb250TWdyOjpHZXRGb250KFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlICkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9udE5hbWUgPSB3c0ZvbnRGYW1pbHk7DQorICAgIElGWF9Gb250TWdyKiBwRkRFRm9udE1nciA9ICgoQ1hGQV9GRkRvYyopaERvYyktPkdldEFwcCgpLT5HZXRGREVGb250TWdyKCk7DQorI2lmZGVmIF9GWEZBX1VTRUdBU0ZPTlRNR1JfDQorICAgIGNvbnN0IFhGQV9GT05USU5GTyAqcEN1ckZvbnQgPSBOVUxMOw0KKyAgICBGWF9CT09MIGJHZXRGb250SW5mbyA9IFRSVUU7DQorICAgIElGWF9Gb250KiBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCgoRlhfTFBDV1NUUil3c0ZvbnROYW1lLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorI2Vsc2UNCisgICAgY29uc3QgWEZBX0ZPTlRJTkZPICpwQ3VyRm9udCA9IFhGQV9HZXRGb250SU5GT0J5Rm9udE5hbWUod3NGb250TmFtZSk7DQorICAgIEZYX0JPT0wgYkdldEZvbnRJbmZvID0gRkFMU0U7DQorICAgIElGWF9Gb250KiBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udCgoRlhfTFBDV1NUUil3c0ZvbnROYW1lLCBkd0ZvbnRTdHlsZXMgfCBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaCwgcEN1ckZvbnQgPyBwQ3VyRm9udC0+d0NvZGVQYWdlIDogd0NvZGVQYWdlLCBwRkRFRm9udE1ncik7DQorI2VuZGlmDQorICAgIGlmICghcEZvbnQgJiYgaERvYykgew0KKyAgICAgICAgaWYgKGJHZXRGb250SW5mbykgew0KKyAgICAgICAgICAgIHBDdXJGb250ID0gWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZSh3c0ZvbnROYW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ3VyRm9udCAhPSBOVUxMICYmIHBDdXJGb250LT5wUmVwbGFjZUZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgICAgICAgICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KKyAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KKyAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0xQQ1dTVFIgcFJlcGxhY2UgPSBwQ3VyRm9udC0+cFJlcGxhY2VGb250Ow0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFJlcGxhY2UpOw0KKyAgICAgICAgICAgIHdoaWxlIChpTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICAgICAgICBGWF9MUENXU1RSIHBOYW1lVGV4dCA9IHBSZXBsYWNlOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKnBOYW1lVGV4dCAhPSBMJywnICYmIGlMZW5ndGggPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICBwTmFtZVRleHQrKzsNCisgICAgICAgICAgICAgICAgICAgIGlMZW5ndGgtLTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JlcGxhY2UgPSBDRlhfV2lkZVN0cmluZyhwUmVwbGFjZSwgcE5hbWVUZXh0IC0gcFJlcGxhY2UpOw0KKyNpZmRlZiBfRlhGQV9VU0VHQVNGT05UTUdSXw0KKyAgICAgICAgICAgICAgICBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCh3c1JlcGxhY2UsIGR3U3R5bGUsIHdDb2RlUGFnZSk7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQoKEZYX0xQQ1dTVFIpd3NSZXBsYWNlLCBkd1N0eWxlIHwgRlhfRk9OVFNUWUxFX0V4YWN0TWF0Y2gsIHBDdXJGb250LT53Q29kZVBhZ2UsIHBGREVGb250TWdyKTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlMZW5ndGgtLTsNCisgICAgICAgICAgICAgICAgcE5hbWVUZXh0Kys7DQorICAgICAgICAgICAgICAgIHBSZXBsYWNlID0gcE5hbWVUZXh0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEZvbnQpIHsNCisgICAgICAgIG1fQ2FjaGVGb250cy5BZGQocEZvbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCit9DQorSUZYX0ZvbnQqIENYRkFfRGVmRm9udE1ncjo6R2V0RGVmYXVsdEZvbnQoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpDQorew0KKyAgICBJRlhfRm9udE1nciogcEZERUZvbnRNZ3IgPSAoKENYRkFfRkZEb2MqKWhEb2MpLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOw0KKyNpZmRlZiBfRlhGQV9VU0VHQVNGT05UTUdSXw0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBwRkRFRm9udE1nci0+TG9hZEZvbnQoKEZYX0xQQ1dTVFIpTCJBcmlhbCBOYXJyb3ciLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorI2Vsc2UNCisgICAgY29uc3QgWEZBX0ZPTlRJTkZPICpwQ3VyRm9udCA9IFhGQV9HZXRGb250SU5GT0J5Rm9udE5hbWUod3NGb250RmFtaWx5KTsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KChGWF9MUENXU1RSKUwiQXJpYWwgTmFycm93IiwgZHdGb250U3R5bGVzLCBwQ3VyRm9udCA/IHBDdXJGb250LT53Q29kZVBhZ2UgOiAxMjUyLCBwRkRFRm9udE1ncik7DQorI2VuZGlmDQorICAgIGlmICghcEZvbnQpDQorI2lmZGVmIF9GWEZBX1VTRUdBU0ZPTlRNR1JfDQorICAgICAgICBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCgoRlhfTFBDV1NUUilOVUxMLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorI2Vsc2UNCisgICAgICAgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KChGWF9MUENXU1RSKU5VTEwsIGR3Rm9udFN0eWxlcywgcEN1ckZvbnQgPyBwQ3VyRm9udC0+d0NvZGVQYWdlIDogMTI1MiwgcEZERUZvbnRNZ3IpOw0KKyNlbmRpZg0KKyAgICBGWFNZU19hc3NlcnQocEZvbnQgIT0gTlVMTCk7DQorICAgIGlmIChwRm9udCkgew0KKyAgICAgICAgbV9DYWNoZUZvbnRzLkFkZChwRm9udCk7DQorICAgIH0NCisgICAgcmV0dXJuIHBGb250Ow0KK30NCitzdHJ1Y3QgWEZBX1BERkZPTlROQU1FIHsNCisgICAgRlhfTFBDU1RSIGxwUHNOYW1lOw0KKyAgICBGWF9MUENTVFIgbHBOb3JtYWw7DQorICAgIEZYX0xQQ1NUUiBscEJvbGQ7DQorICAgIEZYX0xQQ1NUUiBscEl0YWxpYzsNCisgICAgRlhfTFBDU1RSIGxwQm9sZEl0YWxpYzsNCit9Ow0KK2NvbnN0IFhGQV9QREZGT05UTkFNRSBnX1hGQVBERkZvbnROYW1lW10gPSB7DQorICAgIHsiQWRvYmUgUEkgU3RkIiwgIkFkb2JlUElTdGQiLCAiQWRvYmVQSVN0ZCIsICJBZG9iZVBJU3RkIiwgIkFkb2JlUElTdGQifSwNCisgICAgeyJNeXJpYWQgUHJvIExpZ2h0IiwgIk15cmlhZFByby1MaWdodCIsICJNeXJpYWRQcm8tU2VtaWJvbGQiLCAiTXlyaWFkUHJvLUxpZ2h0SXQiLCAiTXlyaWFkUHJvLVNlbWlib2xkSXQifSwNCit9Ow0KK0NYRkFfUERGRm9udE1ncjo6Q1hGQV9QREZGb250TWdyKENYRkFfRkZEb2MqIHBEb2MpDQorew0KKyAgICBtX3BEb2MgPSBwRG9jOw0KK30NCitDWEZBX1BERkZvbnRNZ3I6On5DWEZBX1BERkZvbnRNZ3IoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcHMgPSBtX0ZERTJQREZGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBJRlhfRm9udCogcEZERUZvbnQ7DQorICAgICAgICB2b2lkKiBwUERGRm9udDsNCisgICAgICAgIG1fRkRFMlBERkZvbnQuR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBGREVGb250LCBwUERGRm9udCk7DQorICAgICAgICBwRkRFRm9udC0+U2V0Rm9udFByb3ZpZGVyKE5VTEwpOw0KKyAgICB9DQorICAgIG1fRkRFMlBERkZvbnQuUmVtb3ZlQWxsKCk7DQorICAgIHBzID0gbV9Gb250QXJyYXkuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHMpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cktleTsNCisgICAgICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICAgICAgICBtX0ZvbnRBcnJheS5HZXROZXh0QXNzb2MocHMsIHN0cktleSwgKHZvaWQqJilwRm9udCk7DQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9Gb250QXJyYXkuUmVtb3ZlQWxsKCk7DQorfQ0KK0lGWF9Gb250KiBDWEZBX1BERkZvbnRNZ3I6OkZpbmRGb250KENGWF9CeXRlU3RyaW5nIHN0clBzTmFtZSwgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljLCBDUERGX0ZvbnQqKiBwRHN0UERGRm9udCwgRlhfQk9PTCBiU3RyaWN0TWF0Y2gpDQorew0KKyAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wRG9jLT5HZXRQREZEb2MoKTsNCisgICAgaWYgKHBEb2MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udFNldERpY3QgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoRlhfQlNUUkMoIkFjcm9Gb3JtIikpLT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsNCisgICAgaWYgKCFwRm9udFNldERpY3QpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBGb250U2V0RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBGb250U2V0RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udCIpKTsNCisgICAgaWYgKCFwRm9udFNldERpY3QpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHN0clBzTmFtZS5SZW1vdmUoJyAnKTsNCisgICAgSUZYX0ZvbnRNZ3IqIHBGREVGb250TWdyID0gbV9wRG9jLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOw0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udFNldERpY3QtPkdldFN0YXJ0UG9zKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsNCisgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEZvbnRTZXREaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7DQorICAgICAgICBpZiAoIVBzTmFtZU1hdGNoRFJGb250TmFtZShzdHJQc05hbWUsIGJCb2xkLCBiSXRhbGljLCBrZXksIGJTdHJpY3RNYXRjaCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENQREZfT2JqZWN0KiBwRGlyZWN0ID0gcE9iai0+R2V0RGlyZWN0KCk7DQorICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0Ow0KKyAgICAgICAgaWYgKHBGb250RGljdC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gRlhfQlNUUkMoIkZvbnQiKSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1BERl9Gb250KiBwUERGRm9udCA9IHBEb2MtPkxvYWRGb250KHBGb250RGljdCk7DQorICAgICAgICBpZiAoIXBQREZGb250KSB7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIXBQREZGb250LT5Jc0VtYmVkZGVkKCkpIHsNCisgICAgICAgICAgICAqcERzdFBERkZvbnQgPSBwUERGRm9udDsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBJRlhfRm9udDo6TG9hZEZvbnQoJnBQREZGb250LT5tX0ZvbnQsIHBGREVGb250TWdyKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorSUZYX0ZvbnQqIENYRkFfUERGRm9udE1ncjo6R2V0Rm9udChGWF9XU1RSIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBDUERGX0ZvbnQqKiBwUERGRm9udCwgRlhfQk9PTCBiU3RyaWN0TWF0Y2ggKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udEZhbWlseS5HZXRQdHIoKSwgd3NGb250RmFtaWx5LkdldExlbmd0aCgpKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyS2V5Ow0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgICBzdHJLZXkuRm9ybWF0KCIldSV1IiwgZHdIYXNoQ29kZSwgZHdGb250U3R5bGVzKTsNCisgICAgaWYgKG1fRm9udEFycmF5Lkxvb2t1cChzdHJLZXksICh2b2lkKiYpcEZvbnQpKSB7DQorICAgICAgICByZXR1cm4gcEZvbnQ7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNQc05hbWU7DQorICAgIGJzUHNOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzRm9udEZhbWlseSk7DQorICAgIEZYX0JPT0wgYkJvbGQgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID09IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgICBGWF9CT09MIGJJdGFsaWMgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgPT0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyRm9udE5hbWUgPSBQc05hbWVUb0ZvbnROYW1lKGJzUHNOYW1lLCBiQm9sZCwgYkl0YWxpYyk7DQorICAgIHBGb250ID0gRmluZEZvbnQoc3RyRm9udE5hbWUsIGJCb2xkLCBiSXRhbGljLCBwUERGRm9udCwgYlN0cmljdE1hdGNoKTsNCisgICAgaWYgKHBGb250KSB7DQorICAgICAgICBtX0ZvbnRBcnJheS5TZXRBdChzdHJLZXksIHBGb250KTsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENYRkFfUERGRm9udE1ncjo6UHNOYW1lVG9Gb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyUHNOYW1lLA0KKyAgICAgICAgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljKQ0KK3sNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gc2l6ZW9mKGdfWEZBUERGRm9udE5hbWUpIC8gc2l6ZW9mKFhGQV9QREZGT05UTkFNRSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICAgICAgaWYgKHN0clBzTmFtZSA9PSBnX1hGQVBERkZvbnROYW1lW2ldLmxwUHNOYW1lKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaW5kZXggPSAxICsgKChiSXRhbGljIDw8IDEpIHwgYkJvbGQpOw0KKyAgICAgICAgICAgIHJldHVybiAqKCZnX1hGQVBERkZvbnROYW1lW2ldLmxwUHNOYW1lICsgaW5kZXgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBzdHJQc05hbWU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QREZGb250TWdyOjpQc05hbWVNYXRjaERSRm9udE5hbWUoRlhfQlNUUiBic1BzTmFtZSwgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNEUkZvbnROYW1lLCBGWF9CT09MIGJTdHJpY3RNYXRjaCkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRFJOYW1lID0gYnNEUkZvbnROYW1lOw0KKyAgICBic0RSTmFtZS5SZW1vdmUoJy0nKTsNCisgICAgRlhfSU5UMzIgaVBzTGVuID0gYnNQc05hbWUuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIG5JbmRleCA9IGJzRFJOYW1lLkZpbmQoYnNQc05hbWUpOw0KKyAgICBpZiAobkluZGV4ICE9IC0xICYmICFiU3RyaWN0TWF0Y2gpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChuSW5kZXggIT0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlEaWZmZXJMZW5ndGggPSBic0RSTmFtZS5HZXRMZW5ndGgoKSAtIGlQc0xlbjsNCisgICAgaWYgKGlEaWZmZXJMZW5ndGggPiAxIHx8IChiQm9sZCB8fCBiSXRhbGljKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUJvbGRJbmRleCA9IGJzRFJOYW1lLkZpbmQoRlhfQlNUUkMoIkJvbGQiKSk7DQorICAgICAgICBGWF9CT09MIGJCb2xkRm9udCA9IGlCb2xkSW5kZXggPiAwOw0KKyAgICAgICAgaWYgKGJCb2xkIF4gYkJvbGRGb250KSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJCb2xkRm9udCkgew0KKyAgICAgICAgICAgIGlEaWZmZXJMZW5ndGggPSBGWF9NSU4oaURpZmZlckxlbmd0aCAtIDQsIGJzRFJOYW1lLkdldExlbmd0aCgpIC0gaUJvbGRJbmRleCAtIDQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiSXRhbGljRm9udCA9IFRSVUU7DQorICAgICAgICBpZiAoYnNEUk5hbWUuRmluZChGWF9CU1RSQygiSXRhbGljIikpID4gMCkgew0KKyAgICAgICAgICAgIGlEaWZmZXJMZW5ndGggLT0gNjsNCisgICAgICAgIH0gZWxzZSBpZiAoYnNEUk5hbWUuRmluZChGWF9CU1RSQygiSXQiKSkgPiAwKSB7DQorICAgICAgICAgICAgaURpZmZlckxlbmd0aCAtPSAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChic0RSTmFtZS5GaW5kKEZYX0JTVFJDKCJPYmxpcXVlIikpID4gMCkgew0KKyAgICAgICAgICAgIGlEaWZmZXJMZW5ndGggLT0gNzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYkl0YWxpY0ZvbnQgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiSXRhbGljIF4gYkl0YWxpY0ZvbnQpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaURpZmZlckxlbmd0aCA+IDEpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RSVGFpbGVyID0gYnNEUk5hbWUuUmlnaHQoaURpZmZlckxlbmd0aCk7DQorICAgICAgICAgICAgaWYgKGJzRFJUYWlsZXIuRXF1YWwoRlhfQlNUUkMoIk1UIikpIHx8IGJzRFJUYWlsZXIuRXF1YWwoRlhfQlNUUkMoIlBTTVQiKSkgfHwgYnNEUlRhaWxlci5FcXVhbChGWF9CU1RSQygiUmVndWxhciIpKSB8fCBic0RSVGFpbGVyLkVxdWFsKEZYX0JTVFJDKCJSZWciKSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiQm9sZEZvbnQgfHwgYkl0YWxpY0ZvbnQpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9CT09MIGJNYXRjaCA9IEZBTFNFOw0KKyAgICAgICAgICAgIHN3aXRjaCAoYnNQc05hbWUuR2V0QXQoaVBzTGVuIC0gMSkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSAnTCc6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnNEUk5hbWUuUmlnaHQoNSkuRXF1YWwoRlhfQlNUUkMoIkxpZ2h0IikpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ1InOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBic0RSTmFtZS5SaWdodCg3KS5FcXVhbChGWF9CU1RSQygiUmVndWxhciIpKSB8fCBic0RSTmFtZS5SaWdodCgzKS5FcXVhbChGWF9CU1RSQygiUmVnIikpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgJ00nOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJzRFJOYW1lLlJpZ2h0KDUpLkVxdWFsKEZYX0JTVFJDKCJNZWRpdW0iKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gYk1hdGNoOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfUERGRm9udE1ncjo6R2V0Q2hhcldpZHRoKElGWF9Gb250KiBwRm9udCwgRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0lOVDMyICZpV2lkdGgsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KK3sNCisgICAgaWYgKHdVbmljb2RlICE9IDB4MjAgfHwgYkNoYXJDb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1BERl9Gb250KiBwUERGRm9udCA9IChDUERGX0ZvbnQqKW1fRkRFMlBERkZvbnQuR2V0VmFsdWVBdChwRm9udCk7DQorICAgIGlmICghcFBERkZvbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3VW5pY29kZSA9IChGWF9XQ0hBUilwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3VW5pY29kZSk7DQorICAgIGlXaWR0aCA9IHBQREZGb250LT5HZXRDaGFyV2lkdGhGKHdVbmljb2RlKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfRm9udE1ncjo6Q1hGQV9Gb250TWdyKCkNCisgICAgOiBtX3BEZWZGb250TWdyKE5VTEwpDQorew0KK30NCitDWEZBX0ZvbnRNZ3I6On5DWEZBX0ZvbnRNZ3IoKQ0KK3sNCisgICAgRGVsQWxsTWdyTWFwKCk7DQorfQ0KK0lGWF9Gb250KiBDWEZBX0ZvbnRNZ3I6OkdldEZvbnQoWEZBX0hET0MgaERvYywgRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlICkNCit7DQorICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udEZhbWlseS5HZXRQdHIoKSwgd3NGb250RmFtaWx5LkdldExlbmd0aCgpLCBGQUxTRSk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KKyAgICBic0tleS5Gb3JtYXQoIiV1JXUldSIsIGR3SGFzaCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgICBpZiAobV9Gb250QXJyYXkuTG9va3VwKGJzS2V5LCAodm9pZComKXBGb250KSkgew0KKyAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRW5nbGlzaE5hbWU7DQorICAgIFhGQV9Mb2NhbEZvbnROYW1lVG9FbmdsaXNoTmFtZSh3c0ZvbnRGYW1pbHksIHdzRW5nbGlzaE5hbWUpOw0KKyAgICBDWEZBX1BERkZvbnRNZ3IqIHBNZ3IgPSAoQ1hGQV9QREZGb250TWdyKiltX1BERkZvbnRNZ3JBcnJheS5HZXRWYWx1ZUF0KGhEb2MpOw0KKyAgICBDUERGX0ZvbnQqIHBQREZGb250ID0gTlVMTDsNCisgICAgaWYgKHBNZ3IgIT0gTlVMTCkgew0KKyAgICAgICAgcEZvbnQgPSBwTWdyLT5HZXRGb250KHdzRW5nbGlzaE5hbWUsIGR3Rm9udFN0eWxlcywgJnBQREZGb250KTsNCisgICAgICAgIGlmIChwRm9udCkgew0KKyAgICAgICAgICAgIHJldHVybiBwRm9udDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEZvbnQgPT0gTlVMTCAmJiBtX3BEZWZGb250TWdyICE9IE5VTEwpIHsNCisgICAgICAgIHBGb250ID0gbV9wRGVmRm9udE1nci0+R2V0Rm9udChoRG9jLCB3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgfQ0KKyAgICBpZiAocEZvbnQgPT0gTlVMTCAmJiBwTWdyICE9IE5VTEwpIHsNCisgICAgICAgIHBQREZGb250ID0gTlVMTDsNCisgICAgICAgIHBGb250ID0gcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCwgRkFMU0UpOw0KKyAgICAgICAgaWYgKHBGb250KSB7DQorICAgICAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwRm9udCA9PSBOVUxMICYmIG1fcERlZkZvbnRNZ3IgIT0gTlVMTCkgew0KKyAgICAgICAgcEZvbnQgPSBtX3BEZWZGb250TWdyLT5HZXREZWZhdWx0Rm9udChoRG9jLCB3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocEZvbnQgIT0gTlVMTCk7DQorICAgIGlmIChwRm9udCkgew0KKyAgICAgICAgaWYgKHBQREZGb250KSB7DQorICAgICAgICAgICAgcE1nci0+bV9GREUyUERGRm9udC5TZXRBdChwRm9udCwgcFBERkZvbnQpOw0KKyAgICAgICAgICAgIHBGb250LT5TZXRGb250UHJvdmlkZXIocE1ncik7DQorICAgICAgICB9DQorICAgICAgICBtX0ZvbnRBcnJheS5TZXRBdChic0tleSwgcEZvbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCit9DQordm9pZCBDWEZBX0ZvbnRNZ3I6OkxvYWREb2NGb250cyhYRkFfSERPQyBoRG9jKQ0KK3sNCisgICAgaWYgKCFtX1BERkZvbnRNZ3JBcnJheS5HZXRWYWx1ZUF0KGhEb2MpKSB7DQorICAgICAgICBtX1BERkZvbnRNZ3JBcnJheS5TZXRBdChoRG9jLCBGWF9ORVcgQ1hGQV9QREZGb250TWdyKChDWEZBX0ZGRG9jKiloRG9jKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZvbnRNZ3I6OlJlbGVhc2VEb2NGb250cyhYRkFfSERPQyBoRG9jKQ0KK3sNCisgICAgQ1hGQV9QREZGb250TWdyKiBwTWdyID0gTlVMTDsNCisgICAgaWYgKG1fUERGRm9udE1nckFycmF5Lkxvb2t1cChoRG9jLCAodm9pZComKXBNZ3IpKSB7DQorICAgICAgICBpZiAocE1nciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBNZ3I7DQorICAgICAgICB9DQorICAgICAgICBtX1BERkZvbnRNZ3JBcnJheS5SZW1vdmVLZXkoaERvYyk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZvbnRNZ3I6OkRlbEFsbE1nck1hcCgpDQorew0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fUERGRm9udE1nckFycmF5LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBYRkFfSERPQyBoRG9jID0gTlVMTDsNCisgICAgICAgIENYRkFfUERGRm9udE1nciogcE1nciA9IE5VTEw7DQorICAgICAgICBtX1BERkZvbnRNZ3JBcnJheS5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpaERvYywgKHZvaWQqJilwTWdyKTsNCisgICAgICAgIGlmIChwTWdyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgcE1ncjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX1BERkZvbnRNZ3JBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgbV9Gb250QXJyYXkuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9Gb250TWdyOjpTZXREZWZGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpDQorew0KKyAgICBtX3BEZWZGb250TWdyID0gcEZvbnRNZ3I7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzgxYzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0ZPTlRNR1JfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRk9OVE1HUl9JTVBfSA0KK3N0cnVjdCBYRkFfRk9OVElORk8gew0KKyAgICBGWF9EV09SRAlkd0ZvbnROYW1lSGFzaDsNCisgICAgRlhfTFBDV1NUUglwUHNOYW1lOw0KKyAgICBGWF9MUENXU1RSCXBSZXBsYWNlRm9udDsNCisgICAgRlhfV09SRAkJZHdTdHlsZXM7DQorICAgIEZYX1dPUkQJCXdDb2RlUGFnZTsNCit9Ow0KK2NsYXNzIENYRkFfRGVmRm9udE1nciA6IHB1YmxpYyBJWEZBX0ZvbnRNZ3IsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9EZWZGb250TWdyKCkge30NCisgICAgdmlydHVhbCB+Q1hGQV9EZWZGb250TWdyKCk7DQorICAgIHZpcnR1YWwJdm9pZAkJCVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBkZWxldGUgdGhpczsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0Rm9udChYRkFfSERPQyBoRG9jLCBGWF9XU1RSIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRik7DQorICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZhdWx0Rm9udChYRkFfSERPQyBoRG9jLCBGWF9XU1RSIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRik7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhfUHRyQXJyYXkJCQltX0NhY2hlRm9udHM7DQorfTsNCitjbGFzcyBDWEZBX1BERkZvbnRNZ3IgOiBwdWJsaWMgSUZYX0ZvbnRQcm92aWRlciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1BERkZvbnRNZ3IoQ1hGQV9GRkRvYyogcERvYyk7DQorICAgIH5DWEZBX1BERkZvbnRNZ3IoKTsNCisgICAgSUZYX0ZvbnQqCQkJCUdldEZvbnQoRlhfV1NUUiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgQ1BERl9Gb250KiogcFBERkZvbnQsIEZYX0JPT0wgYlN0cmljdE1hdGNoID0gVFJVRSk7DQorICAgIEZYX0JPT0wJCQkJCUdldENoYXJXaWR0aChJRlhfRm9udCogcEZvbnQsIEZYX1dDSEFSIHdVbmljb2RlLCBGWF9JTlQzMiAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSk7DQorICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fRkRFMlBERkZvbnQ7DQorcHJvdGVjdGVkOg0KKyAgICBJRlhfRm9udCoJCQkJRmluZEZvbnQoQ0ZYX0J5dGVTdHJpbmcgc3RyRmFtaWx5TmFtZSwgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljLCBDUERGX0ZvbnQqKiBwUERGRm9udCwgRlhfQk9PTCBiU3RyaWN0TWF0Y2ggPSBUUlVFKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcJCQlQc05hbWVUb0ZvbnROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJQc05hbWUsIEZYX0JPT0wgYkJvbGQsIEZYX0JPT0wgYkl0YWxpYyk7DQorICAgIEZYX0JPT0wJCQkJCVBzTmFtZU1hdGNoRFJGb250TmFtZShGWF9CU1RSIGJzUHNOYW1lLCBGWF9CT09MIGJCb2xkLCBGWF9CT09MIGJJdGFsaWMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0RSRm9udE5hbWUsIEZYX0JPT0wgYlN0cmljdE1hdGNoID0gVFJVRSk7DQorICAgIENYRkFfRkZEb2MqCQkJCQkJCQltX3BEb2M7DQorICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyCQkJCQltX0ZvbnRBcnJheTsNCit9Ow0KK2NsYXNzIENYRkFfRm9udE1nciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Gb250TWdyKCk7DQorICAgIH5DWEZBX0ZvbnRNZ3IoKTsNCisgICAgSUZYX0ZvbnQqCQlHZXRGb250KFhGQV9IRE9DIGhEb2MsIEZYX1dTVFIgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKTsNCisgICAgdm9pZAkJCUxvYWREb2NGb250cyhYRkFfSERPQyBoRG9jKTsNCisgICAgdm9pZAkJCVJlbGVhc2VEb2NGb250cyhYRkFfSERPQyBoRG9jKTsNCisNCisgICAgdm9pZAkJCVNldERlZkZvbnRNZ3IoSVhGQV9Gb250TWdyKiBwRm9udE1ncik7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQkJCQlEZWxBbGxNZ3JNYXAoKTsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9QREZGb250TWdyQXJyYXk7DQorICAgIElYRkFfRm9udE1ncioJCQltX3BEZWZGb250TWdyOw0KKyAgICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZvbnRBcnJheTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzVmYTAyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bGFkYXB0ZXIuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9md2xhZGFwdGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitJRldMX0FkYXB0ZXJOYXRpdmUgKiBGV0xfQ3JlYXRlRnVlbEFkYXB0ZXJOYXRpdmUoKQ0KK3sNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgRldMX1JlbGVhc2VGdWVsQWRhcHRlck5hdGl2ZShJRldMX0FkYXB0ZXJOYXRpdmUgKiBuYXRpdmUpDQorew0KK30NCit2b2lkIEZXTF9Qb3N0TWVzc2FnZVRvTWFpblJvb3AoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCit7DQorfQ0KK0lGV0xfQWRhcHRlclNlbWFwaG9yZSAqIElGV0xfQWRhcHRlclNlbWFwaG9yZTo6Q3JlYXRlKCkNCit7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MCUZXTF9TaG93Q2FyZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENGWF9SZWN0RiAqcFJ0QW5jaG9yKQ0KK3sNCisgICAgQ1hGQV9GRldpZGdldCogcFhGQVdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KilwV2lkZ2V0LT5HZXRQcml2YXRlRGF0YShwV2lkZ2V0KTsNCisgICAgaWYgKCFwWEZBV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gcFhGQVdpZGdldC0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCk7DQorICAgIGlmICghcERvY1Byb3ZpZGVyKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGJWaXNpYmxlKSB7DQorICAgICAgICBDRlhfTWF0cml4IG10Ow0KKyAgICAgICAgcFhGQVdpZGdldC0+R2V0Um90YXRlTWF0cml4KG10KTsNCisgICAgICAgIENGWF9SZWN0RiBydCgqcFJ0QW5jaG9yKTsNCisgICAgICAgIG10LlRyYW5zZm9ybVJlY3QocnQpOw0KKyAgICAgICAgcERvY1Byb3ZpZGVyLT5EaXNwbGF5Q2FyZXQoKFhGQV9IV0lER0VUKXBYRkFXaWRnZXQsIGJWaXNpYmxlLCAmcnQpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcERvY1Byb3ZpZGVyLT5EaXNwbGF5Q2FyZXQoKFhGQV9IV0lER0VUKXBYRkFXaWRnZXQsIGJWaXNpYmxlLCBwUnRBbmNob3IpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUiBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QpDQorew0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIENYRkFfRkZGaWVsZCAqcEZpZWxkID0gKENYRkFfRkZGaWVsZCopcFdpZGdldC0+R2V0UHJpdmF0ZURhdGEocFdpZGdldCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZpZWxkLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyNpZmRlZiBfWEZBX0VNQg0KKyAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlOw0KKyAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0SW52YWxpZGF0ZSk7DQorICAgIGlmIChwUmVjdCkgew0KKyAgICAgICAgcnRJbnZhbGlkYXRlLmxlZnQgKz0gcFJlY3QtPmxlZnQ7DQorICAgICAgICBydEludmFsaWRhdGUudG9wICs9IHBSZWN0LT50b3A7DQorICAgICAgICBydEludmFsaWRhdGUud2lkdGggPSBwUmVjdC0+d2lkdGg7DQorICAgICAgICBydEludmFsaWRhdGUuaGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBwRmllbGQtPkdldFJvdGF0ZU1hdHJpeChtdCk7DQorICAgIG10LlRyYW5zZm9ybVJlY3QocnRJbnZhbGlkYXRlKTsNCisgICAgcEZpZWxkLT5BZGRJbnZhbGlkYXRlUmVjdCgmcnRJbnZhbGlkYXRlKTsNCisjZWxzZQ0KKyAgICBwRmllbGQtPkFkZEludmFsaWRhdGVSZWN0KE5VTEwpOw0KKyNlbmRpZg0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpHZXRQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKQ0KK3sNCisgICAgQ1hGQV9GRldpZGdldCogcEZGV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKShwV2lkZ2V0LT5HZXRQcml2YXRlRGF0YShwV2lkZ2V0KSk7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIHBGRldpZGdldC0+R2V0Um90YXRlTWF0cml4KG10KTsNCisgICAgQ0ZYX1JlY3RGIHJ0Um90YXRlQW5jaG9yKHJ0QW5jaG9yKTsNCisgICAgbXQuVHJhbnNmb3JtUmVjdChydFJvdGF0ZUFuY2hvcik7DQorICAgIHBGRldpZGdldC0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkdldFBvcHVwUG9zKChYRkFfSFdJREdFVClwRkZXaWRnZXQsIGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0Um90YXRlQW5jaG9yLCBydFBvcHVwKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODMwMTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0ZXTF9BREFQVEVSX0lNUF9IDQorI2RlZmluZSBfWEZBX0ZXTF9BREFQVEVSX0lNUF9IDQorY2xhc3MgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyIDogcHVibGljIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyDQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGV0xfRVJSIFJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJIEdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KK307DQorY2xhc3MgSVhGQV9GV0xFdmVudEhhbmRsZXINCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFBvcHVwUG9zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCBmTWluUG9wdXAsIEZYX0ZMT0FUIGZNYXhQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYmIHJ0UG9wdXApDQorICAgIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uUHJlT3BlbihJRldMX1dpZGdldCAqcFdpZGdldCkge30NCisgICAgdmlydHVhbCB2b2lkCQlPblBvc3RPcGVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSB7fQ0KKyAgICB2aXJ0dWFsCXZvaWQJCU9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfSU5UMzIgaVllYXIsIEZYX0lOVDMyIGlNb250aCwgRlhfSU5UMzIgaURheSkge30NCisgICAgdmlydHVhbAl2b2lkCQlPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDaGFuZ2VkKSB7fQ0KKyAgICB2aXJ0dWFsIHZvaWQJCU9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpIHt9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJT25WYWxpZGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHZpcnR1YWwJdm9pZAkJT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmYXJyU2Vscykge30NCisgICAgdmlydHVhbCB2b2lkCQlPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSB7fQ0KKyAgICB2aXJ0dWFsIENYRkFfRWRnZQlHZXRDb21ib1NwbGl0Q29sb3IoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorICAgIHsNCisgICAgICAgIHJldHVybiBDWEZBX0VkZ2UoTlVMTCk7DQorICAgIH0NCisgICAgdmlydHVhbCB2b2lkCQlHZXRVSU1hcmdpbihDRlhfUmVjdEYgJnJ0TWFyZ2luKSB7fQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUNoZWNrV29yZChGWF9CU1RSIHNXb3JkKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3JkcyhGWF9CU1RSIHNXb3JkLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU2ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmNwcApAQCAtMCwwICsxLDQxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bHRoZW1lLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCitDWEZBX0ZGV2lkZ2V0KiBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkNCit7DQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBwV2lkZ2V0Ow0KKyAgICB3aGlsZSAocE91dGVyLT5HZXRPdXRlcigpKSB7DQorICAgICAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7DQorICAgIH0NCisgICAgaWYgKHBPdXRlcikgew0KKyAgICAgICAgcmV0dXJuIChDWEZBX0ZGV2lkZ2V0KilwT3V0ZXItPkdldFByaXZhdGVEYXRhKHBPdXRlcik7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfRldMVGhlbWU6OkNYRkFfRldMVGhlbWUoQ1hGQV9GRkFwcCAqcEFwcCkNCisgICAgOiBtX3BBcHAocEFwcCkNCit7DQorICAgIG1fcFRleHRPdXQgPSBOVUxMOw0KKyAgICBtX2R3Q2FwYWNpdHkgPSAwOw0KKyAgICBtX2ZDYXBhY2l0eSA9IDA7DQorICAgIG1fcENhbGVuZGFyRm9udCA9IE5VTEw7DQorICAgIG1fUmVjdC5TZXQoMCwgMCwgMCwgMCk7DQorICAgIG1fU2l6ZUFib3ZlQmVsb3cuU2V0KDAsIDApOw0KKyAgICBtX3BDaGVja0JveFRQID0gRlhfTkVXIENYRkFfRldMQ2hlY2tCb3hUUDsNCisgICAgbV9wTGlzdEJveFRQID0gRlhfTkVXIENGV0xfTGlzdEJveFRQOw0KKyAgICBtX3BQaWN0dXJlQm94VFAgPSBGWF9ORVcgQ0ZXTF9QaWN0dXJlQm94VFA7DQorICAgIG1fcFNyb2xsQmFyVFAgPSBGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJUUDsNCisgICAgbV9wRWRpdFRQID0gRlhfTkVXIENYRkFfRldMRWRpdFRQOw0KKyAgICBtX3BDb21ib0JveFRQID0gRlhfTkVXIENGV0xfQ29tYm9Cb3hUUDsNCisgICAgbV9wTW9udGhDYWxlbmRhclRQID0gRlhfTkVXIENGV0xfTW9udGhDYWxlbmRhclRQOw0KKyAgICBtX3BEYXRlVGltZVBpY2tlclRQID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDsNCisgICAgbV9wUHVzaEJ1dHRvblRQID0gRlhfTkVXIENGV0xfUHVzaEJ1dHRvblRQOw0KKyAgICBtX3BDYXJldFRQID0gRlhfTkVXIENGV0xfQ2FyZXRUUDsNCisgICAgbV9wQmFyY29kZVRQID0gRlhfTkVXIENGV0xfQmFyY29kZVRQOw0KKyAgICBJbml0aWFsaXplKCk7DQorfQ0KK0NYRkFfRldMVGhlbWU6On5DWEZBX0ZXTFRoZW1lKCkNCit7DQorICAgIEZpbmFsaXplKCk7DQorICAgIGRlbGV0ZSBtX3BDaGVja0JveFRQOw0KKyAgICBkZWxldGUgbV9wTGlzdEJveFRQOw0KKyAgICBkZWxldGUgbV9wUGljdHVyZUJveFRQOw0KKyAgICBkZWxldGUgbV9wU3JvbGxCYXJUUDsNCisgICAgZGVsZXRlIG1fcEVkaXRUUDsNCisgICAgZGVsZXRlIG1fcENvbWJvQm94VFA7DQorICAgIGRlbGV0ZSBtX3BNb250aENhbGVuZGFyVFA7DQorICAgIGRlbGV0ZSBtX3BEYXRlVGltZVBpY2tlclRQOw0KKyAgICBkZWxldGUgbV9wUHVzaEJ1dHRvblRQOw0KKyAgICBkZWxldGUgbV9wQ2FyZXRUUDsNCisgICAgZGVsZXRlIG1fcEJhcmNvZGVUUDsNCit9DQorc3RhdGljIEZYX0xQQ1dTVFIgZ19GV0xUaGVtZV9DYWxGb250c1tdID0gew0KKyAgICAoRlhfTFBDV1NUUilMIkFyaWFsIiwNCisgICAgKEZYX0xQQ1dTVFIpTCJDb3VyaWVyIE5ldyIsDQorICAgIChGWF9MUENXU1RSKUwiRGVqYVZ1IFNhbnMiLA0KK307DQorRldMX0VSUiBDWEZBX0ZXTFRoZW1lOjpJbml0aWFsaXplKCkNCit7DQorICAgIG1fcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBOVUxMID09IG1fcENhbGVuZGFyRm9udCAmJiBpIDwgc2l6ZW9mKGdfRldMVGhlbWVfQ2FsRm9udHMpIC8gc2l6ZW9mKEZYX0xQQ1dTVFIpOyBpKyspIHsNCisgICAgICAgIG1fcENhbGVuZGFyRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChnX0ZXTFRoZW1lX0NhbEZvbnRzW2ldLCAwLCAwLCBtX3BBcHAtPkdldEZERUZvbnRNZ3IoKSk7DQorICAgIH0NCisgICAgaWYgKE5VTEwgPT0gbV9wQ2FsZW5kYXJGb250KQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgICBtX3BDYWxlbmRhckZvbnQgPSBtX3BBcHAtPkdldEZERUZvbnRNZ3IoKS0+R2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuLCAwLCBOVUxMKTsNCisjZWxzZQ0KKyAgICAgICAgbV9wQ2FsZW5kYXJGb250ID0gbV9wQXBwLT5HZXRGREVGb250TWdyKCktPkdldEZvbnRCeUNvZGVQYWdlKEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbiwgMCwgTlVMTCk7DQorI2VuZGlmDQorICAgIEZYU1lTX2Fzc2VydChOVUxMICE9IG1fcENhbGVuZGFyRm9udCk7DQorICAgIEZXTFRIRU1FX0luaXQoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENYRkFfRldMVGhlbWU6OkZpbmFsaXplKCkNCit7DQorICAgIGlmIChtX3BUZXh0T3V0KSB7DQorICAgICAgICBtX3BUZXh0T3V0LT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BUZXh0T3V0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wQ2FsZW5kYXJGb250KSB7DQorICAgICAgICBtX3BDYWxlbmRhckZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcENhbGVuZGFyRm9udCA9IE5VTEw7DQorICAgIH0NCisgICAgRldMVEhFTUVfUmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCit7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZXTFRoZW1lOjpHZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KK3sNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRldMVGhlbWU6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gKQ0KK3sNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQorew0KKyAgICByZXR1cm4gR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KS0+RHJhd0JhY2tncm91bmQocFBhcmFtcyk7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9GV0xUaGVtZTo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpDQorew0KKyAgICBpZiAocFBhcmFtcy0+bV93c1RleHQuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICB9DQorICAgIGlmIChwUGFyYW1zLT5tX3BXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXIpIHsNCisgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgICAgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7DQorICAgICAgICBtX3BUZXh0T3V0LT5TZXRGb250KG1fcENhbGVuZGFyRm9udCk7DQorICAgICAgICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZSk7DQorICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsNCisgICAgICAgIGlmICgocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbikgJiYgIShwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgJiYNCisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAoRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZCB8IEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkKSkpIHsNCisgICAgICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoMHhGRkZGRkZGRik7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfQ2FwdGlvbikgew0KKyAgICAgICAgICAgIGlmIChtX3BNb250aENhbGVuZGFyVFAtPkdldFRoZW1lSUQocFBhcmFtcy0+bV9wV2lkZ2V0KSA9PSAwICkgew0KKyAgICAgICAgICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoQXJnYkVuY29kZSgweGZmLCAwLCAxNTMsIDI1NSkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTI4LCAwKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgICAgICAgIENGWF9SZW5kZXJEZXZpY2UgKnBSZW5kZXJEZXZpY2UgPSBwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUmVuZGVyRGV2aWNlLCBGQUxTRSk7DQorICAgICAgICBtX3BUZXh0T3V0LT5TZXRSZW5kZXJEZXZpY2UocFJlbmRlckRldmljZSk7DQorICAgICAgICBDRlhfTWF0cml4IG10UGFydCA9IHBQYXJhbXMtPm1fbWF0cml4Ow0KKyAgICAgICAgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IHBHcmFwaGljcy0+R2V0TWF0cml4KCk7DQorICAgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgICAgIG10UGFydC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0TWF0cml4KG10UGFydCk7DQorICAgICAgICBtX3BUZXh0T3V0LT5EcmF3TG9naWNUZXh0KHBQYXJhbXMtPm1fd3NUZXh0LCBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKSwgcFBhcmFtcy0+bV9ydFBhcnQpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgICAgQ0ZYX1JlbmRlckRldmljZSAqcFJlbmRlckRldmljZSA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFJlbmRlckRldmljZSwgRkFMU0UpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRSZW5kZXJEZXZpY2UocFJlbmRlckRldmljZSk7DQorICAgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsNCisgICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udChwQWNjLT5HZXRGREVGb250KCkpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShwQWNjLT5HZXRGb250U2l6ZSgpKTsNCisgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHBBY2MtPkdldFRleHRDb2xvcigpKTsNCisgICAgQ0ZYX01hdHJpeCBtdFBhcnQgPSBwUGFyYW1zLT5tX21hdHJpeDsNCisgICAgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IHBHcmFwaGljcy0+R2V0TWF0cml4KCk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgICBtdFBhcnQuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgobXRQYXJ0KTsNCisgICAgbV9wVGV4dE91dC0+RHJhd0xvZ2ljVGV4dChwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksIHBQYXJhbXMtPm1fcnRQYXJ0KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0xQVk9JRCBDWEZBX0ZXTFRoZW1lOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCit7DQorICAgIHN3aXRjaChkd0NhcGFjaXR5KSB7DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9Gb250OiB7DQorICAgICAgICAgICAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0RkRFRm9udCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemU6IHsNCisgICAgICAgICAgICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpKSB7DQorICAgICAgICAgICAgICAgICAgICBtX2ZDYXBhY2l0eSA9IHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0Rm9udFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAmbV9mQ2FwYWNpdHk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3I6IHsNCisgICAgICAgICAgICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpKSB7DQorICAgICAgICAgICAgICAgICAgICBtX2R3Q2FwYWNpdHkgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldFRleHRDb2xvcigpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZtX2R3Q2FwYWNpdHk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9MaW5lSGVpZ2h0OiB7DQorICAgICAgICAgICAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9mQ2FwYWNpdHkgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldExpbmVIZWlnaHQoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAmbV9mQ2FwYWNpdHk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aDogew0KKyAgICAgICAgICAgICAgICBtX2ZDYXBhY2l0eSA9IDk7DQorICAgICAgICAgICAgICAgIHJldHVybiAmbV9mQ2FwYWNpdHk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCisgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0KSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gcFdpZGdldC0+R2V0TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwSXRlbSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAmbV9SZWN0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQorICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXRVSU1hcmdpbihtX1JlY3QpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gcFdpZGdldEFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9SZWN0LmxlZnQgKz0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPklzTXVsdGlMaW5lKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9SZWN0LndpZHRoICs9IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAocEl0ZW0tPkdldFByZXYoKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtLT5HZXROZXh0KCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QuaGVpZ2h0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC50b3AgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QudG9wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QuaGVpZ2h0ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gJm1fUmVjdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9TcGFjZUFib3ZlQmVsb3c6IHsNCisgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0KSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IHBXaWRnZXRBY2MtPkdldFBhcmEoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU2l6ZUFib3ZlQmVsb3cueCA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU2l6ZUFib3ZlQmVsb3cueSA9IHBhcmEuR2V0U3BhY2VCZWxvdygpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiAmbV9TaXplQWJvdmVCZWxvdzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXIgJiYgZHdDYXBhY2l0eSA+PSBGV0xfTUNDQVBBQ0lUWV9TdW4gJiYgZHdDYXBhY2l0eSA8PSBGV0xfTUNDQVBBQ0lUWV9Ub2RheSkgew0KKyAgICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpKSB7DQorICAgICAgICAgICAgSVhGQV9BcHBQcm92aWRlciAqcEFwcFByb3ZpZGVyID0gcFdpZGdldC0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgICAgICAgICBtX3dzUmVzb3VyY2UuRW1wdHkoKTsNCisgICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1biArIGR3Q2FwYWNpdHkgLSBGV0xfV0dUQ0FQQUNJVFlfTUFYIC0gNSwgbV93c1Jlc291cmNlKTsNCisgICAgICAgICAgICBpZiAoIW1fd3NSZXNvdXJjZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuICZtX3dzUmVzb3VyY2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpLT5HZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZXTFRoZW1lOjpJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQorew0KKyAgICByZXR1cm4gR2V0VGhlbWUocFdpZGdldCktPklzQ3VzdG9taXplZExheW91dChwV2lkZ2V0KTsNCit9DQorRldMX0VSUiBDWEZBX0ZXTFRoZW1lOjpHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkNCit7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICByZXR1cm4gR2V0VGhlbWUocFRoZW1lUGFydC0+bV9wV2lkZ2V0KS0+R2V0UGFydFJlY3QocFRoZW1lUGFydCwgcmVjdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6SXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCit7DQorICAgIHJldHVybiBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpLT5Jc0luUGFydChwVGhlbWVQYXJ0LCBmeCwgZnkpOw0KK30NCitGWF9CT09MCUNYRkFfRldMVGhlbWU6OkNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcywgQ0ZYX1JlY3RGICZyZWN0KQ0KK3sNCisgICAgaWYgKHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcikgew0KKyAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgICAgICBpZiAoIXBXaWRnZXQpIHsNCisgICAgICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFRleHRPdXQsIEZBTFNFKTsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wQ2FsZW5kYXJGb250KTsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsNCisgICAgICAgIG1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLCByZWN0KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgICBpZiAoIXBXaWRnZXQpIHsNCisgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQorICAgIG1fcFRleHRPdXQtPlNldEZvbnQocEFjYy0+R2V0RkRFRm9udCgpKTsNCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUocEFjYy0+R2V0Rm9udFNpemUoKSk7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihwQWNjLT5HZXRUZXh0Q29sb3IoKSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFRleHRPdXQsIEZBTFNFKTsNCisgICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCisgICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KKyAgICBtX3BUZXh0T3V0LT5DYWxjTG9naWNTaXplKHBQYXJhbXMtPm1fd3NUZXh0LCBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKSwgcmVjdCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDRldMX1dpZGdldFRQKiBDWEZBX0ZXTFRoZW1lOjpHZXRUaGVtZShJRldMX1dpZGdldCogcFdpZGdldCkNCit7DQorICAgIHN3aXRjaChwV2lkZ2V0LT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9DaGVja0JveDoNCisgICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9SYWRpb0J1dHRvbjoNCisgICAgICAgICAgICByZXR1cm4gbV9wQ2hlY2tCb3hUUDsNCisgICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9MaXN0Qm94Og0KKyAgICAgICAgICAgIHJldHVybiBtX3BMaXN0Qm94VFA7DQorICAgICAgICBjYXNlIEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveDoNCisgICAgICAgICAgICByZXR1cm4gbV9wUGljdHVyZUJveFRQOw0KKyAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX1Njcm9sbEJhcjoNCisgICAgICAgICAgICByZXR1cm4gbV9wU3JvbGxCYXJUUDsNCisgICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9FZGl0Og0KKyAgICAgICAgICAgIHJldHVybiBtX3BFZGl0VFA7DQorICAgICAgICBjYXNlIEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3g6DQorICAgICAgICAgICAgcmV0dXJuIG1fcENvbWJvQm94VFA7DQorICAgICAgICBjYXNlIEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcjoNCisgICAgICAgICAgICByZXR1cm4gbV9wTW9udGhDYWxlbmRhclRQOw0KKyAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BEYXRlVGltZVBpY2tlclRQOw0KKyAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX1B1c2hCdXR0b246DQorICAgICAgICAgICAgcmV0dXJuIG1fcFB1c2hCdXR0b25UUDsNCisgICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9DYXJldDoNCisgICAgICAgICAgICByZXR1cm4gbV9wQ2FyZXRUUDsNCisgICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9CYXJjb2RlOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BCYXJjb2RlVFA7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0ZXTENoZWNrQm94VFA6OkNYRkFfRldMQ2hlY2tCb3hUUCgpDQorew0KK30NCitGWF9CT09MCUNYRkFfRldMQ2hlY2tCb3hUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQorew0KKyAgICBpZiAocFBhcmFtcy0+bV9pUGFydCAhPSBGV0xfUEFSVF9DS0JfQ2hlY2tCb3gpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmICgoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0gRldMX1BBUlRTVEFURV9DS0JfQ2hlY2tlZCkgfHwgKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpKSB7DQorICAgICAgICBEcmF3Q2hlY2tTaWduKHBQYXJhbXMtPm1fcFdpZGdldCwgcFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgcFBhcmFtcy0+bV9kd1N0YXRlcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZXTENoZWNrQm94VFA6OkRyYXdDaGVja1NpZ24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdEJveCwgRlhfSU5UMzIgaVN0YXRlLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KK3sNCisgICAgQ0ZYX1JlY3RGIHJ0U2lnbigqcFJ0Qm94KTsNCisgICAgRlhfRFdPUkQgZHdDb2xvciA9IDB4RkYwMDAwMDA7DQorICAgIGlmICgoaVN0YXRlICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgICAgIGR3Q29sb3IgPSAweEZGQTlBOUE5Ow0KKyAgICB9DQorICAgIHsNCisgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgICAgICAgcnRTaWduLkRlZmxhdGUocnRTaWduLndpZHRoIC8gNCwgcnRTaWduLmhlaWdodCAvIDQpOw0KKyAgICAgICAgc3dpdGNoKGR3U3R5bGUgJiBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2spIHsNCisgICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s6DQorICAgICAgICAgICAgICAgIERyYXdTaWduQ2hlY2socEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNpcmNsZToNCisgICAgICAgICAgICAgICAgRHJhd1NpZ25DaXJjbGUocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzOg0KKyAgICAgICAgICAgICAgICBEcmF3U2lnbkNyb3NzKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVEaWFtb25kOg0KKyAgICAgICAgICAgICAgICBEcmF3U2lnbkRpYW1vbmQocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVNxdWFyZToNCisgICAgICAgICAgICAgICAgRHJhd1NpZ25TcXVhcmUocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXI6DQorICAgICAgICAgICAgICAgIERyYXdTaWduU3RhcihwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitDWEZBX0ZXTEVkaXRUUDo6Q1hGQV9GV0xFZGl0VFAoKQ0KK3sNCit9DQorQ1hGQV9GV0xFZGl0VFA6On5DWEZBX0ZXTEVkaXRUUCgpDQorew0KK30NCitGWF9CT09MIENYRkFfRldMRWRpdFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCit7DQorICAgIGlmIChGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lID09IHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgICAgICAgRlhfQVJHQiBjciA9IDB4RkYwMDAwMDA7DQorICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSAxLjBmOw0KKyAgICAgICAgaWYgKENYRkFfQm9yZGVyIGJvcmRlclVJID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRVSUJvcmRlcigpKSB7DQorICAgICAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXJVSS5HZXRFZGdlKDApOw0KKyAgICAgICAgICAgIGlmIChlZGdlKSB7DQorICAgICAgICAgICAgICAgIGNyID0gZWRnZS5HZXRDb2xvcigpOw0KKyAgICAgICAgICAgICAgICBmV2lkdGggPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIENGWF9Db2xvciBjckxpbmUoY3IpOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckxpbmUpOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldExpbmVXaWR0aChmV2lkdGgpOw0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgocFBhcmFtcy0+bV9wUGF0aCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBDRldMX0VkaXRUUDo6RHJhd0JhY2tncm91bmQocFBhcmFtcyk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViNWU2YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0ZXTF9USEVNRV9JTVBfSA0KKyNkZWZpbmUgX1hGQV9GV0xfVEhFTUVfSU1QX0gNCitjbGFzcyBDWEZBX0ZXTFRoZW1lIDogcHVibGljIElGV0xfVGhlbWVQcm92aWRlciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZXTFRoZW1lKENYRkFfRkZBcHAgKnBBcHApOw0KKyAgICB2aXJ0dWFsfkNYRkFfRldMVGhlbWUoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSCQkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHZpcnR1YWwgSUZXTF9UYXJnZXQqCVJldGFpbigpDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEhhc2hDb2RlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgdmlydHVhbCBGV0xfRVJSCQkJSW5pdGlhbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCQlGaW5hbGl6ZSgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpOw0KKyAgICB2aXJ0dWFsIEZYX0xQVk9JRCAgIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisNCisgICAgdmlydHVhbAlGWF9CT09MCQlDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMsIENGWF9SZWN0RiAmcmVjdCk7DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggJm1hdHJpeCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIENGWF9SZWN0RiAmcnRQYXJ0KQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIENGV0xfV2lkZ2V0VFAqIEdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgQ0ZXTF9DaGVja0JveFRQKgkJbV9wQ2hlY2tCb3hUUDsNCisgICAgQ0ZXTF9MaXN0Qm94VFAqCQkJbV9wTGlzdEJveFRQOw0KKyAgICBDRldMX1BpY3R1cmVCb3hUUCoJCW1fcFBpY3R1cmVCb3hUUDsNCisgICAgQ0ZXTF9TY3JvbGxCYXJUUCoJCW1fcFNyb2xsQmFyVFA7DQorICAgIENGV0xfRWRpdFRQKgkJCW1fcEVkaXRUUDsNCisgICAgQ0ZXTF9Db21ib0JveFRQKgkJbV9wQ29tYm9Cb3hUUDsNCisgICAgQ0ZXTF9Nb250aENhbGVuZGFyVFAqCW1fcE1vbnRoQ2FsZW5kYXJUUDsNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlclRQKgltX3BEYXRlVGltZVBpY2tlclRQOw0KKyAgICBDRldMX1B1c2hCdXR0b25UUCoJCW1fcFB1c2hCdXR0b25UUDsNCisgICAgQ0ZXTF9DYXJldFRQKgkJCW1fcENhcmV0VFA7DQorICAgIENGV0xfQmFyY29kZVRQKgkJCW1fcEJhcmNvZGVUUDsNCisgICAgSUZERV9UZXh0T3V0KgkJCW1fcFRleHRPdXQ7DQorICAgIEZYX0ZMT0FUCQkJCW1fZkNhcGFjaXR5Ow0KKyAgICBGWF9EV09SRAkJCQltX2R3Q2FwYWNpdHk7DQorICAgIElGWF9Gb250KgkJCQltX3BDYWxlbmRhckZvbnQ7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c1Jlc291cmNlOw0KKyAgICBDWEZBX0ZGQXBwKgkJCQltX3BBcHA7DQorICAgIENGWF9SZWN0RgkJCQltX1JlY3Q7DQorICAgIENGWF9TaXplRgkJCQltX1NpemVBYm92ZUJlbG93Ow0KK307DQorY2xhc3MgQ1hGQV9GV0xDaGVja0JveFRQIDogcHVibGljIENGV0xfQ2hlY2tCb3hUUA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRldMQ2hlY2tCb3hUUCgpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJRHJhd0NoZWNrU2lnbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0Qm94LCBGWF9JTlQzMiBpU3RhdGUsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KK307DQorY2xhc3MgQ1hGQV9GV0xFZGl0VFAgOiBwdWJsaWMgQ0ZXTF9FZGl0VFANCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZXTEVkaXRUUCgpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZXTEVkaXRUUCgpOw0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NzUwNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmNwcApAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfcmVuZGVyY29udGV4dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjZGVmaW5lIFhGQV9SRU5ERVJDT05URVhUX01heENvdW50CQkzMA0KK0lYRkFfUmVuZGVyQ29udGV4dCoJWEZBX1JlbmRlckNvbnRleHRfQ3JlYXRlKCkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ1hGQV9SZW5kZXJDb250ZXh0Ow0KK30NCitDWEZBX1JlbmRlckNvbnRleHQ6OkNYRkFfUmVuZGVyQ29udGV4dCgpDQorew0KKyAgICBtX3BXaWRnZXRJdGVyYXRvciA9IE5VTEw7DQorICAgIG1fcFdpZGdldCA9IE5VTEw7DQorICAgIG1fcFBhZ2VWaWV3ID0gTlVMTDsNCisgICAgbV9wR1MgPSBOVUxMOw0KKyAgICBtX2R3U3RhdHVzID0gMDsNCisgICAgbV9tYXRyaXguUmVzZXQoKTsNCisgICAgbV9ydENsaXBSZWN0LlJlc2V0KCk7DQorfQ0KK0NYRkFfUmVuZGVyQ29udGV4dDo6fkNYRkFfUmVuZGVyQ29udGV4dCgpDQorew0KKyAgICBTdG9wUmVuZGVyKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUmVuZGVyQ29udGV4dDo6U3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LCBjb25zdCBDWEZBX1JlbmRlck9wdGlvbnMmIG9wdGlvbnMpDQorew0KKyAgICBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsNCisgICAgbV9wR1MgPSBwR1M7DQorICAgIG1fbWF0cml4ID0gbWF0cml4Ow0KKyAgICBtX29wdGlvbnMgPSBvcHRpb25zOw0KKyAgICBDRlhfUmVjdEYgcnRQYWdlOw0KKyAgICBwR1MtPkdldENsaXBSZWN0KHJ0UGFnZSk7DQorICAgIENGWF9NYXRyaXggbXRSZXM7DQorICAgIG10UmVzLlNldFJldmVyc2UobWF0cml4KTsNCisgICAgbV9ydENsaXBSZWN0LlNldChydFBhZ2UubGVmdCwgcnRQYWdlLnRvcCwgcnRQYWdlLndpZHRoLCBydFBhZ2UuaGVpZ2h0KTsNCisgICAgbXRSZXMuVHJhbnNmb3JtUmVjdChtX3J0Q2xpcFJlY3QpOw0KKyAgICBtX2R3U3RhdHVzID0gbV9vcHRpb25zLm1fYkhpZ2hsaWdodCA/IFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0IDogMDsNCisgICAgRlhfRFdPUkQgZHdGaWx0ZXJUeXBlID0gWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlIHwgKG1fb3B0aW9ucy5tX2JQcmludCA/IFhGQV9XSURHRVRTVEFUVVNfUHJpbnRhYmxlIDogWEZBX1dJREdFVFNUQVRVU19WaWV3YWJsZSk7DQorICAgIG1fcFdpZGdldEl0ZXJhdG9yID0gbV9wUGFnZVZpZXctPkNyZWF0ZVdpZGdldEl0ZXJhdG9yKFhGQV9UUkFWRVJTRVdBWV9Gb3JtLCBkd0ZpbHRlclR5cGUpOw0KKyAgICBtX3BXaWRnZXQgPSBtX3BXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19SZWFkeTsNCit9DQorRlhfSU5UMzIgQ1hGQV9SZW5kZXJDb250ZXh0OjpEb1JlbmRlcihJRlhfUGF1c2UqIHBQYXVzZSkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIHdoaWxlKG1fcFdpZGdldCkgew0KKyAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KiltX3BXaWRnZXQ7DQorICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXRCb3g7DQorICAgICAgICBwV2lkZ2V0LT5HZXRCQm94KHJ0V2lkZ2V0Qm94LCBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpOw0KKyAgICAgICAgcnRXaWRnZXRCb3gud2lkdGggKz0gMTsNCisgICAgICAgIHJ0V2lkZ2V0Qm94LmhlaWdodCArPSAxOw0KKyAgICAgICAgaWYgKHJ0V2lkZ2V0Qm94LkludGVyc2VjdFdpdGgobV9ydENsaXBSZWN0KSkgew0KKyAgICAgICAgICAgIHBXaWRnZXQtPlJlbmRlcldpZGdldChtX3BHUywgJm1fbWF0cml4LCBtX2R3U3RhdHVzKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFdpZGdldCA9IG1fcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICBpQ291bnQrKzsNCisgICAgICAgIGlmIChpQ291bnQgPiBYRkFfUkVOREVSQ09OVEVYVF9NYXhDb3VudCAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9SRU5ERVJTVEFUVVNfVG9CZUNvbnRpbnVlZDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19Eb25lOw0KK30NCit2b2lkIENYRkFfUmVuZGVyQ29udGV4dDo6U3RvcFJlbmRlcigpDQorew0KKyAgICBpZiAobV9wV2lkZ2V0SXRlcmF0b3IpIHsNCisgICAgICAgIG1fcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BXaWRnZXRJdGVyYXRvciA9IE5VTEw7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3JlbmRlcmNvbnRleHQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYWRkZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmCV9GWEZBX0ZPUk1GSUxMRVJfUkVOREVSQ09OVEVYVF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9SRU5ERVJDT05URVhUX0lNUF9IDQorY2xhc3MgQ1hGQV9SZW5kZXJDb250ZXh0IDogcHVibGljIElYRkFfUmVuZGVyQ29udGV4dCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1JlbmRlckNvbnRleHQoKTsNCisgICAgdmlydHVhbCB+Q1hGQV9SZW5kZXJDb250ZXh0KCk7DQorICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LCBjb25zdCBDWEZBX1JlbmRlck9wdGlvbnMmIG9wdGlvbnMpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCURvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICAgIHZpcnR1YWwJdm9pZAkJU3RvcFJlbmRlcigpOw0KK3Byb3RlY3RlZDoNCisgICAgSVhGQV9XaWRnZXRJdGVyYXRvciogbV9wV2lkZ2V0SXRlcmF0b3I7DQorICAgIFhGQV9IV0lER0VUCQkJIG1fcFdpZGdldDsNCisgICAgSVhGQV9QYWdlVmlldyoJCSBtX3BQYWdlVmlldzsNCisgICAgQ0ZYX0dyYXBoaWNzKgkJIG1fcEdTOw0KKyAgICBDRlhfTWF0cml4CQkJIG1fbWF0cml4Ow0KKyAgICBDWEZBX1JlbmRlck9wdGlvbnMJIG1fb3B0aW9uczsNCisgICAgRlhfRFdPUkQJCQkgbV9kd1N0YXR1czsNCisgICAgQ0ZYX1JlY3RGCQkJIG1fcnRDbGlwUmVjdDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTRlZWU0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuY3BwCkBAIC0wLDAgKzEsMTkyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZm9udG1nci5oIg0KK0NYRkFfQ1NTVGFnUHJvdmlkZXI6On5DWEZBX0NTU1RhZ1Byb3ZpZGVyKCkNCit7DQorICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fQXR0cmlidXRlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwTmFtZSA9IE5VTEwsICpwVmFsdWUgPSBOVUxMOw0KKyAgICAgICAgbV9BdHRyaWJ1dGVzLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpcE5hbWUsICh2b2lkKiYpcFZhbHVlKTsNCisgICAgICAgIGlmIChwTmFtZSAhPSBOVUxMKQl7DQorICAgICAgICAgICAgZGVsZXRlIHBOYW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBWYWx1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfQ1NTVGFnUHJvdmlkZXI6OkdldE5leHRBdHRyaWJ1dGUoRlhfUE9TSVRJT04gJnBvcywgQ0ZYX1dpZGVTdHJpbmdDICZ3c0F0dHIsIENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZSkNCit7DQorICAgIGlmIChwb3MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nICpwTmFtZQk9IE5VTEw7DQorICAgIENGWF9XaWRlU3RyaW5nICpwVmFsdWUJPSBOVUxMOw0KKyAgICBtX0F0dHJpYnV0ZXMuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilwTmFtZSwgKHZvaWQqJilwVmFsdWUpOw0KKyAgICB3c0F0dHIJPSAqcE5hbWU7DQorICAgIHdzVmFsdWUJPSAqcFZhbHVlOw0KK30NCit2b2lkIENYRkFfQ1NTVGFnUHJvdmlkZXI6OlNldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nICpwTmFtZQk9IEZYX05FVyBDRlhfV2lkZVN0cmluZygpOw0KKyAgICBDRlhfV2lkZVN0cmluZyAqcFZhbHVlCT0gRlhfTkVXIENGWF9XaWRlU3RyaW5nKCk7DQorICAgICpwTmFtZQk9IHdzQXR0cjsNCisgICAgKnBWYWx1ZQk9IHdzVmFsdWU7DQorICAgIG1fQXR0cmlidXRlcy5TZXRBdChwTmFtZSwgcFZhbHVlKTsNCit9DQordm9pZCBDWEZBX1RleHRQYXJzZUNvbnRleHQ6OlNldERlY2xzKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcERlY2xBcnJheSwgRlhfSU5UMzIgaURlY2xDb3VudCkNCit7DQorICAgIGlmIChpRGVjbENvdW50IDw9IDAgfHwgcHBEZWNsQXJyYXkgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fZHdNYXRjaGVkRGVjbHMgPSBpRGVjbENvdW50Ow0KKyAgICBGWF9JTlQzMiBpQnl0ZXMJID0gaURlY2xDb3VudCAqIHNpemVvZihJRkRFX0NTU0RlY2xhcmF0aW9uKik7DQorICAgIG1fcHBNYXRjaGVkRGVjbHMgPSAoSUZERV9DU1NEZWNsYXJhdGlvbioqKUZERV9BbGxvYyhpQnl0ZXMpOw0KKyAgICBGWF9tZW1jcHkobV9wcE1hdGNoZWREZWNscywgcHBEZWNsQXJyYXksIGlCeXRlcyk7DQorfQ0KK0NYRkFfVGV4dFBhcnNlcjo6fkNYRkFfVGV4dFBhcnNlcigpDQorew0KKyAgICBpZiAobV9wVUFTaGVldCAhPSBOVUxMKSB7DQorICAgICAgICBtX3BVQVNoZWV0LT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgaWYgKG1fcFNlbGVjdG9yICE9IE5VTEwpCXsNCisgICAgICAgIG1fcFNlbGVjdG9yLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKQl7DQorICAgICAgICBtX3BBbGxvY2F0b3ItPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlOw0KKyAgICAgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0ICpwUGFyc2VDb250ZXh0Ow0KKyAgICAgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuR2V0TmV4dEFzc29jKHBzLCBwWE1MTm9kZSwgcFBhcnNlQ29udGV4dCk7DQorICAgICAgICBpZiAocFBhcnNlQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9UZXh0UGFyc2VDb250ZXh0LCBtX3BBbGxvY2F0b3IsIHBQYXJzZUNvbnRleHQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6UmVzZXQoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZTsNCisgICAgICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCAqcFBhcnNlQ29udGV4dDsNCisgICAgICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldE5leHRBc3NvYyhwcywgcFhNTE5vZGUsIHBQYXJzZUNvbnRleHQpOw0KKyAgICAgICAgaWYgKHBQYXJzZUNvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZERV9EZWxldGVXaXRoKENYRkFfVGV4dFBhcnNlQ29udGV4dCwgbV9wQWxsb2NhdG9yLCBwUGFyc2VDb250ZXh0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgICAgICBtX3BBbGxvY2F0b3ItPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OkluaXRDU1NEYXRhKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKQ0KK3sNCisgICAgaWYgKHBUZXh0UHJvdmlkZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BTZWxlY3RvciA9PSBOVUxMKSB7DQorICAgICAgICBDWEZBX0ZGRG9jICpwRG9jID0gcFRleHRQcm92aWRlci0+R2V0RG9jTm9kZSgpOw0KKyAgICAgICAgSUZYX0ZvbnRNZ3IgKnBGb250TWdyID0gcERvYy0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwRm9udE1nciAhPSBOVUxMKTsNCisgICAgICAgIG1fcFNlbGVjdG9yID0gSUZERV9DU1NTdHlsZVNlbGVjdG9yOjpDcmVhdGUoKTsNCisgICAgICAgIG1fcFNlbGVjdG9yLT5TZXRGb250TWdyKHBGb250TWdyKTsNCisgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEwOw0KKyAgICAgICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KKyAgICAgICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BTZWxlY3Rvci0+U2V0RGVmRm9udFNpemUoZkZvbnRTaXplKTsNCisgICAgfQ0KKyAgICBpZiAobV9wVUFTaGVldCA9PSBOVUxMKSB7DQorICAgICAgICBtX3BVQVNoZWV0ID0gTG9hZERlZmF1bHRTaGVldFN0eWxlKCk7DQorICAgICAgICBtX3BTZWxlY3Rvci0+U2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXJBZ2VudCwgbV9wVUFTaGVldCk7DQorICAgICAgICBtX3BTZWxlY3Rvci0+VXBkYXRlU3R5bGVJbmRleChGREVfQ1NTTUVESUFUWVBFX0FMTCk7DQorICAgIH0NCit9DQorSUZERV9DU1NTdHlsZVNoZWV0KglDWEZBX1RleHRQYXJzZXI6OkxvYWREZWZhdWx0U2hlZXRTdHlsZSgpDQorew0KKyAgICBzdGF0aWMgY29uc3QgRlhfTFBDV1NUUiBzX3BTdHlsZSA9IChGWF9MUENXU1RSKUwiaHRtbCxib2R5LG9sLHAsdWx7ZGlzcGxheTpibG9ja30iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJsaXtkaXNwbGF5Omxpc3QtaXRlbX0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJvbCx1bHtwYWRkaW5nLWxlZnQ6MzNweH1vbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH1vbCx1bHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowfXVsLG9se21hcmdpbjoxLjEyZW0gMH0iDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJhe2NvbG9yOiMwMDAwZmY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1ie2ZvbnQtd2VpZ2h0OmJvbGRlcn1pe2ZvbnQtc3R5bGU6aXRhbGljfSINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInN1cHt2ZXJ0aWNhbC1hbGlnbjorMTVlbTtmb250LXNpemU6LjY2ZW19c3Vie3ZlcnRpY2FsLWFsaWduOi0xNWVtO2ZvbnQtc2l6ZTouNjZlbX0iOw0KKyAgICByZXR1cm4gSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbUJ1ZmZlcihDRlhfV2lkZVN0cmluZygpLCBzX3BTdHlsZSwgRlhTWVNfd2NzbGVuKHNfcFN0eWxlKSwgRlhfQ09ERVBBR0VfVVRGOCk7DQorfQ0KK0lGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ1hGQV9UZXh0UGFyc2VyOjpDcmVhdGVSb290U3R5bGUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpDQorew0KKyAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICAgIENYRkFfUGFyYSBwYXJhID0gcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUgPSBtX3BTZWxlY3Rvci0+Q3JlYXRlQ29tcHV0ZWRTdHlsZShOVUxMKTsNCisgICAgSUZERV9DU1NGb250U3R5bGUgKnBGb250U3R5bGUgPSBwU3R5bGUtPkdldEZvbnRTdHlsZXMoKTsNCisgICAgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSAqcFBhcmFTdHlsZSA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCk7DQorICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gMCwgZkZvbnRTaXplID0gMTA7DQorICAgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBmTGluZUhlaWdodCA9IHBhcmEuR2V0TGluZUhlaWdodCgpOw0KKyAgICAgICAgRkRFX0NTU0xFTkdUSCBpbmRlbnQ7DQorICAgICAgICBpbmRlbnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwYXJhLkdldFRleHRJbmRlbnQoKSk7DQorICAgICAgICBwUGFyYVN0eWxlLT5TZXRUZXh0SW5kZW50KGluZGVudCk7DQorICAgICAgICBGREVfQ1NTVEVYVEFMSUdOIGhBbGdpbiA9IEZERV9DU1NURVhUQUxJR05fTGVmdDsNCisgICAgICAgIHN3aXRjaCAocGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgICAgICAgICBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX0NlbnRlcjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgICAgICAgaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9SaWdodDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KKyAgICAgICAgICAgICAgICBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX0p1c3RpZnk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCisgICAgICAgICAgICAgICAgaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBQYXJhU3R5bGUtPlNldFRleHRBbGlnbihoQWxnaW4pOw0KKyAgICAgICAgRkRFX0NTU1JFQ1QgcnRNYXJnaW5XaWR0aDsNCisgICAgICAgIHJ0TWFyZ2luV2lkdGgubGVmdC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0TWFyZ2luTGVmdCgpKTsNCisgICAgICAgIHJ0TWFyZ2luV2lkdGgudG9wLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRTcGFjZUFib3ZlKCkpOw0KKyAgICAgICAgcnRNYXJnaW5XaWR0aC5yaWdodC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0TWFyZ2luUmlnaHQoKSk7DQorICAgICAgICBydE1hcmdpbldpZHRoLmJvdHRvbS5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0U3BhY2VCZWxvdygpKTsNCisgICAgICAgIHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+U2V0TWFyZ2luV2lkdGgocnRNYXJnaW5XaWR0aCk7DQorICAgIH0NCisgICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIHBGb250U3R5bGUtPlNldENvbG9yKGZvbnQuR2V0Q29sb3IoKSk7DQorICAgICAgICBwRm9udFN0eWxlLT5TZXRGb250U3R5bGUoZm9udC5Jc0l0YWxpYygpID8gRkRFX0NTU0ZPTlRTVFlMRV9JdGFsaWMgOiBGREVfQ1NTRk9OVFNUWUxFX05vcm1hbCk7DQorICAgICAgICBwRm9udFN0eWxlLT5TZXRGb250V2VpZ2h0KGZvbnQuSXNCb2xkKCkgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUwpOw0KKyAgICAgICAgcFBhcmFTdHlsZS0+U2V0TnVtYmVyVmVydGljYWxBbGlnbigtZm9udC5HZXRCYXNlbGluZVNoaWZ0KCkpOw0KKyAgICAgICAgZkZvbnRTaXplID0gZm9udC5HZXRGb250U2l6ZSgpOw0KKyAgICAgICAgRkRFX0NTU0xFTkdUSCBsZXR0ZXJTcGFjaW5nOw0KKyAgICAgICAgbGV0dGVyU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIGZvbnQuR2V0TGV0dGVyU3BhY2luZygpKTsNCisgICAgICAgIHBQYXJhU3R5bGUtPlNldExldHRlclNwYWNpbmcobGV0dGVyU3BhY2luZyk7DQorICAgICAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSAwOw0KKyAgICAgICAgaWYgKGZvbnQuR2V0TGluZVRocm91Z2goKSA+IDApCXsNCisgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZvbnQuR2V0VW5kZXJsaW5lKCkgPiAxKSB7DQorICAgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7DQorICAgICAgICB9IGVsc2UgaWYgKGZvbnQuR2V0VW5kZXJsaW5lKCkgPiAwKSB7DQorICAgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmU7DQorICAgICAgICB9DQorICAgICAgICBwUGFyYVN0eWxlLT5TZXRUZXh0RGVjb3JhdGlvbihkd0RlY29yYXRpb24pOw0KKyAgICB9DQorICAgIHBQYXJhU3R5bGUtPlNldExpbmVIZWlnaHQoZkxpbmVIZWlnaHQpOw0KKyAgICBwRm9udFN0eWxlLT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KKyAgICByZXR1cm4gcFN0eWxlOw0KK30NCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q3JlYXRlU3R5bGUoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpDQorew0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBOZXdTdHlsZSA9IG1fcFNlbGVjdG9yLT5DcmVhdGVDb21wdXRlZFN0eWxlKHBQYXJlbnRTdHlsZSk7DQorICAgIEZYU1lTX2Fzc2VydChwTmV3U3R5bGUgIT0gTlVMTCk7DQorICAgIGlmIChwUGFyZW50U3R5bGUpIHsNCisgICAgICAgIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUgKnBQYXJhU3R5bGUgPSBwUGFyZW50U3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdEZWNvcmF0aW9uID0gcFBhcmFTdHlsZS0+R2V0VGV4dERlY29yYXRpb24oKTsNCisgICAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZSA9IDA7DQorICAgICAgICBpZiAocFBhcmFTdHlsZS0+R2V0VmVydGljYWxBbGlnbigpID09IEZERV9DU1NWRVJUSUNBTEFMSUdOX051bWJlcikgew0KKyAgICAgICAgICAgIGZCYXNlTGluZSA9IHBQYXJhU3R5bGUtPkdldE51bWJlclZlcnRpY2FsQWxpZ24oKTsNCisgICAgICAgIH0NCisgICAgICAgIHBQYXJhU3R5bGUgPSBwTmV3U3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpOw0KKyAgICAgICAgcFBhcmFTdHlsZS0+U2V0VGV4dERlY29yYXRpb24oZHdEZWNvcmF0aW9uKTsNCisgICAgICAgIHBQYXJhU3R5bGUtPlNldE51bWJlclZlcnRpY2FsQWxpZ24oZkJhc2VMaW5lKTsNCisgICAgICAgIElGREVfQ1NTQm91bmRhcnlTdHlsZSAqcEJvdW5kYXJ5dHlsZSA9IHBQYXJlbnRTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKTsNCisgICAgICAgIGNvbnN0IEZERV9DU1NSRUNUICpwUmVjdCA9IHBCb3VuZGFyeXR5bGUtPkdldE1hcmdpbldpZHRoKCk7DQorICAgICAgICBpZiAocFJlY3QgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBCb3VuZGFyeXR5bGUgPSBwTmV3U3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCk7DQorICAgICAgICAgICAgcEJvdW5kYXJ5dHlsZS0+U2V0TWFyZ2luV2lkdGgoKnBSZWN0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcE5ld1N0eWxlOw0KK30NCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q29tcHV0ZVN0eWxlKElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlKQ0KK3sNCisgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0ICpwQ29udGV4dCA9IChDWEZBX1RleHRQYXJzZUNvbnRleHQqKW1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQocFhNTE5vZGUpOw0KKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOw0KKyAgICBDWEZBX0NTU1RhZ1Byb3ZpZGVyIHRhZ1Byb3ZpZGVyOw0KKyAgICBQYXJzZVRhZ0luZm8ocFhNTE5vZGUsIHRhZ1Byb3ZpZGVyKTsNCisgICAgaWYgKHRhZ1Byb3ZpZGVyLm1fYkNvbnRlbnQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlCT0gQ3JlYXRlU3R5bGUocFBhcmVudFN0eWxlKTsNCisgICAgSUZERV9DU1NBY2NlbGVyYXRvciAqcENTU0FjY2VsCT0gbV9wU2VsZWN0b3ItPkluaXRBY2NlbGVyYXRvcigpOw0KKyAgICBwQ1NTQWNjZWwtPk9uRW50ZXJUYWcoJnRhZ1Byb3ZpZGVyKTsNCisgICAgbV9wU2VsZWN0b3ItPkNvbXB1dGVTdHlsZSgmdGFnUHJvdmlkZXIsIHBDb250ZXh0LT5HZXREZWNscygpLCBwQ29udGV4dC0+Q291bnREZWNscygpLCBwU3R5bGUpOw0KKyAgICBwQ1NTQWNjZWwtPk9uTGVhdmVUYWcoJnRhZ1Byb3ZpZGVyKTsNCisgICAgcmV0dXJuIHBTdHlsZTsNCit9DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OkRvUGFyc2UoSUZERV9YTUxOb2RlICpwWE1MQ29udGFpbmVyLCBJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlcikNCit7DQorICAgIGlmIChwWE1MQ29udGFpbmVyID09IE5VTEwgfHwgcFRleHRQcm92aWRlciA9PSBOVUxMIHx8IG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wQWxsb2NhdG9yID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9GaXhlZCwgMzIsIHNpemVvZihDWEZBX0NTU1RhZ1Byb3ZpZGVyKSk7DQorICAgIEluaXRDU1NEYXRhKHBUZXh0UHJvdmlkZXIpOw0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBSb290U3R5bGUgPSBDcmVhdGVSb290U3R5bGUocFRleHRQcm92aWRlcik7DQorICAgIFBhcnNlUmljaFRleHQocFhNTENvbnRhaW5lciwgcFJvb3RTdHlsZSk7DQorICAgIHBSb290U3R5bGUtPlJlbGVhc2UoKTsNCit9DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OlBhcnNlUmljaFRleHQoSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpDQorew0KKyAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfQ1NTVGFnUHJvdmlkZXIgdGFnUHJvdmlkZXI7DQorICAgIFBhcnNlVGFnSW5mbyhwWE1MTm9kZSwgdGFnUHJvdmlkZXIpOw0KKyAgICBpZiAoIXRhZ1Byb3ZpZGVyLm1fYlRhZ0F2aWxpYWJsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcE5ld1N0eWxlID0gTlVMTDsNCisgICAgaWYgKCh0YWdQcm92aWRlci5HZXRUYWdOYW1lKCkgIT0gRlhfV1NUUkMoTCJib2R5IikpIHx8ICh0YWdQcm92aWRlci5HZXRUYWdOYW1lKCkgIT0gRlhfV1NUUkMoTCJodG1sIikpICkgew0KKyAgICAgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0ICpwVGV4dENvbnRleHQgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpQ1hGQV9UZXh0UGFyc2VDb250ZXh0Ow0KKyAgICAgICAgRkRFX0NTU0RJU1BMQVkgZURpc3BsYXkgPSBGREVfQ1NTRElTUExBWV9JbmxpbmU7DQorICAgICAgICBpZiAoIXRhZ1Byb3ZpZGVyLm1fYkNvbnRlbnQpIHsNCisgICAgICAgICAgICBwTmV3U3R5bGUgPSBDcmVhdGVTdHlsZShwUGFyZW50U3R5bGUpOw0KKyAgICAgICAgICAgIElGREVfQ1NTQWNjZWxlcmF0b3IgKnBDU1NBY2NlbCA9IG1fcFNlbGVjdG9yLT5Jbml0QWNjZWxlcmF0b3IoKTsNCisgICAgICAgICAgICBwQ1NTQWNjZWwtPk9uRW50ZXJUYWcoJnRhZ1Byb3ZpZGVyKTsNCisgICAgICAgICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkgRGVjbEFycmF5Ow0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlNYXRjaGVkRGVjbHMgPSBtX3BTZWxlY3Rvci0+TWF0Y2hEZWNsYXJhdGlvbnMoJnRhZ1Byb3ZpZGVyLCBEZWNsQXJyYXkpOw0KKyAgICAgICAgICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcE1hdGNoRGVjbHMgPSAoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbiAqKilEZWNsQXJyYXkuR2V0RGF0YSgpOw0KKyAgICAgICAgICAgIG1fcFNlbGVjdG9yLT5Db21wdXRlU3R5bGUoJnRhZ1Byb3ZpZGVyLCBwcE1hdGNoRGVjbHMsIGlNYXRjaGVkRGVjbHMsIHBOZXdTdHlsZSk7DQorICAgICAgICAgICAgcENTU0FjY2VsLT5PbkxlYXZlVGFnKCZ0YWdQcm92aWRlcik7DQorICAgICAgICAgICAgaWYgKGlNYXRjaGVkRGVjbHMgPiAwKSB7DQorICAgICAgICAgICAgICAgIHBUZXh0Q29udGV4dC0+U2V0RGVjbHMocHBNYXRjaERlY2xzLCBpTWF0Y2hlZERlY2xzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZURpc3BsYXkgPSBwTmV3U3R5bGUtPkdldFBvc2l0aW9uU3R5bGVzKCktPkdldERpc3BsYXkoKTsNCisgICAgICAgIH0NCisgICAgICAgIHBUZXh0Q29udGV4dC0+U2V0RGlzcGxheShlRGlzcGxheSk7DQorICAgICAgICBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5TZXRBdChwWE1MTm9kZSwgcFRleHRDb250ZXh0KTsNCisgICAgfQ0KKyAgICBmb3IoSUZERV9YTUxOb2RlICpwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcFhNTENoaWxkOyBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBQYXJzZVJpY2hUZXh0KHBYTUxDaGlsZCwgcE5ld1N0eWxlKTsNCisgICAgfQ0KKyAgICBpZiAocE5ld1N0eWxlICE9IE5VTEwpIHsNCisgICAgICAgIHBOZXdTdHlsZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpQYXJzZVRhZ0luZm8oSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgQ1hGQV9DU1NUYWdQcm92aWRlciAmdGFnUHJvdmlkZXIpDQorew0KKyAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19YRkFUYWdOYW1lW10gPSB7DQorICAgICAgICAweDYxLA0KKyAgICAgICAgMHg2MiwNCisgICAgICAgIDB4NjksDQorICAgICAgICAweDcwLA0KKyAgICAgICAgMHgwMDAxZjcxNCwNCisgICAgICAgIDB4MDAwMjJhNTUsDQorICAgICAgICAweDAwMDIzOWJiLA0KKyAgICAgICAgMHgwMDAyNTg4MSwNCisgICAgICAgIDB4MGJkMzdmYWEsDQorICAgICAgICAweDBiZDM3ZmI4LA0KKyAgICAgICAgMHhhNzNlM2FmMiwNCisgICAgICAgIDB4YjE4MmVhYWUsDQorICAgICAgICAweGRiOGFjNDU1LA0KKyAgICB9Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQorICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTmFtZSk7DQorICAgICAgICB0YWdQcm92aWRlci5TZXRUYWdOYW1lT2JqKHdzTmFtZSk7DQorICAgICAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLCB3c05hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IEZYX0lOVDMyIHNfaUNvdW50ID0gc2l6ZW9mKHNfWEZBVGFnTmFtZSkgLyBzaXplb2YoRlhfRFdPUkQpOw0KKyAgICAgICAgQ0ZYX0RTUEFUZW1wbGF0ZTxGWF9EV09SRD4gbG9va3VwOw0KKyAgICAgICAgdGFnUHJvdmlkZXIubV9iVGFnQXZpbGlhYmxlID0gbG9va3VwLkxvb2t1cChkd0hhc2hDb2RlLCBzX1hGQVRhZ05hbWUsIHNfaUNvdW50KSA+IC0xOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgICAgIHBYTUxFbGVtZW50LT5HZXRTdHJpbmcoRlhfV1NUUkMoTCJzdHlsZSIpLkdldFB0cigpLCB3c1ZhbHVlKTsNCisgICAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICB0YWdQcm92aWRlci5TZXRBdHRyaWJ1dGUoRlhfV1NUUkMoTCJzdHlsZSIpLCB3c1ZhbHVlKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAgIHRhZ1Byb3ZpZGVyLm1fYlRhZ0F2aWxpYWJsZSA9IFRSVUU7DQorICAgICAgICB0YWdQcm92aWRlci5tX2JDb250ZW50ID0gVFJVRTsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDWEZBX1RleHRQYXJzZXI6OkdldFZBbGdpbihJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlcikgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgICAgQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KKyAgICBpZiAocGFyYS5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgaUFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGlBbGlnbjsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRUYWJJbnRlcnZhbChJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3QNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInRhYi1pbnRlcnZhbCIpLCB3c1ZhbHVlKSkgew0KKyAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyh3c1ZhbHVlKTsNCisgICAgICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICB9DQorICAgIHJldHVybiAzNjsNCit9DQorRlhfSU5UMzIgQ1hGQV9UZXh0UGFyc2VyOjpDb3VudFRhYnMoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0DQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBpZiAocFN0eWxlICYmIHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtdGFiLWNvdW50IiksIHdzVmFsdWUpKSB7DQorICAgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9UZXh0UGFyc2VyOjpJc1NwYWNlUnVuKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKHBTdHlsZSAmJiBwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLXNwYWNlcnVuIiksIHdzVmFsdWUpKSB7DQorICAgICAgICB3c1ZhbHVlLk1ha2VMb3dlcigpOw0KKyAgICAgICAgcmV0dXJuIHdzVmFsdWUgPT0gRlhfV1NUUkMoTCJ5ZXMiKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0lGWF9Gb250KiBDWEZBX1RleHRQYXJzZXI6OkdldEZvbnQoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRmFtaWx5ID0gRlhfV1NUUkMoTCJDb3VyaWVyIik7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICAgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBmb250LkdldFR5cGVmYWNlKHdzRmFtaWx5KTsNCisgICAgICAgIGlmIChmb250LklzQm9sZCgpKSB7DQorICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChmb250LklzSXRhbGljKCkpIHsNCisgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBTdHlsZSkgew0KKyAgICAgICAgSUZERV9DU1NGb250U3R5bGUgKnBGb250U3R5bGUgPSBwU3R5bGUtPkdldEZvbnRTdHlsZXMoKTsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHBGb250U3R5bGUtPkNvdW50Rm9udEZhbWlsaWVzKCk7DQorICAgICAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgICAgIHdzRmFtaWx5ID0gcEZvbnRTdHlsZS0+R2V0Rm9udEZhbWlseShpQ291bnQgLSAxKTsNCisgICAgICAgIH0NCisgICAgICAgIGR3U3R5bGUgPSAwOw0KKyAgICAgICAgaWYgKHBGb250U3R5bGUtPkdldEZvbnRXZWlnaHQoKSA+IEZYRk9OVF9GV19OT1JNQUwpIHsNCisgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBGb250U3R5bGUtPkdldEZvbnRTdHlsZSgpID09IEZERV9DU1NGT05UU1RZTEVfSXRhbGljKQl7DQorICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfRkZEb2MgKnBEb2MgPSBwVGV4dFByb3ZpZGVyLT5HZXREb2NOb2RlKCk7DQorICAgIEZYU1lTX2Fzc2VydChwRG9jICE9IE5VTEwpOw0KKyAgICBDWEZBX0ZvbnRNZ3IgKnBGb250TWdyID0gcERvYy0+R2V0QXBwKCktPkdldFhGQUZvbnRNZ3IoKTsNCisgICAgcmV0dXJuIHBGb250TWdyLT5HZXRGb250KChYRkFfSERPQylwRG9jLCB3c0ZhbWlseSwgZHdTdHlsZSk7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0Rm9udFNpemUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KK3sNCisgICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gcFN0eWxlLT5HZXRGb250U3R5bGVzKCktPkdldEZvbnRTaXplKCk7DQorICAgIH0NCisgICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KKyAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgcmV0dXJuIGZvbnQuR2V0Rm9udFNpemUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMTA7DQorfQ0KK0ZYX0lOVDMyIENYRkFfVGV4dFBhcnNlcjo6R2V0SG9yU2NhbGUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlKSBjb25zdA0KK3sNCisgICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiksIHdzVmFsdWUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKHBYTUxOb2RlKSB7DQorICAgICAgICAgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0ICpwQ29udGV4dCA9IChDWEZBX1RleHRQYXJzZUNvbnRleHQqKW1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQocFhNTE5vZGUpOw0KKyAgICAgICAgICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUGFyZW50U3R5bGUgJiYgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiKSwgd3NWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKSkgew0KKyAgICAgICAgcmV0dXJuIChGWF9JTlQzMilmb250LkdldEhvcml6b250YWxTY2FsZSgpOw0KKyAgICB9DQorICAgIHJldHVybiAxMDA7DQorfQ0KK0ZYX0lOVDMyIENYRkFfVGV4dFBhcnNlcjo6R2V0VmVyU2NhbGUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KK3sNCisgICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIpLCB3c1ZhbHVlKSkgew0KKyAgICAgICAgICAgIHJldHVybiB3c1ZhbHVlLkdldEludGVnZXIoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgICAgICByZXR1cm4gKEZYX0lOVDMyKWZvbnQuR2V0VmVydGljYWxTY2FsZSgpOw0KKyAgICB9DQorICAgIHJldHVybiAxMDA7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRVbmRlcmxpbmUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBGWF9JTlQzMiAmaVVuZGVybGluZSwgRlhfSU5UMzIgJmlQZXJpb2QpIGNvbnN0DQorew0KKyAgICBpVW5kZXJsaW5lID0gMDsNCisgICAgaVBlcmlvZCA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgICAgaWYgKHBTdHlsZSkgew0KKyAgICAgICAgRlhfRFdPUkQgZHdEZWNvcmF0aW9uID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKS0+R2V0VGV4dERlY29yYXRpb24oKTsNCisgICAgICAgIGlmIChkd0RlY29yYXRpb24gJiBGREVfQ1NTVEVYVERFQ09SQVRJT05fRG91YmxlKSB7DQorICAgICAgICAgICAgaVVuZGVybGluZSA9IDI7DQorICAgICAgICB9IGVsc2UgaWYgKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUpIHsNCisgICAgICAgICAgICBpVW5kZXJsaW5lID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgICAgICBpZiAocFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInVuZGVybGluZVBlcmlvZCIpLCB3c1ZhbHVlKSkgew0KKyAgICAgICAgICAgIGlmICh3c1ZhbHVlID09IEZYX1dTVFJDKEwid29yZCIpKSB7DQorICAgICAgICAgICAgICAgIGlQZXJpb2QgPSBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgICAgICAgICAgaVBlcmlvZCA9IGZvbnQuR2V0VW5kZXJsaW5lUGVyaW9kKCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICAgICAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgIGlVbmRlcmxpbmUgPSBmb250LkdldFVuZGVybGluZSgpOw0KKyAgICAgICAgICAgIGlQZXJpb2QgPSBmb250LkdldFVuZGVybGluZVBlcmlvZCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRMaW5ldGhyb3VnaChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIEZYX0lOVDMyICZpTGluZXRocm91Z2gpIGNvbnN0DQorew0KKyAgICBpZiAocFN0eWxlKSB7DQorICAgICAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpLT5HZXRUZXh0RGVjb3JhdGlvbigpOw0KKyAgICAgICAgaUxpbmV0aHJvdWdoID0gKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9MaW5lVGhyb3VnaCkgPyAxIDogMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCisgICAgICAgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICAgICAgaUxpbmV0aHJvdWdoID0gZm9udC5HZXRMaW5lVGhyb3VnaCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0FSR0IJQ1hGQV9UZXh0UGFyc2VyOjpHZXRDb2xvcihJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0DQorew0KKyAgICBpZiAocFN0eWxlICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBwU3R5bGUtPkdldEZvbnRTdHlsZXMoKS0+R2V0Q29sb3IoKTsNCisgICAgfQ0KKyAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgICAgICByZXR1cm4gZm9udC5HZXRDb2xvcigpOw0KKyAgICB9DQorICAgIHJldHVybiAweEZGMDAwMDAwOw0KK30NCitGWF9GTE9BVCBDWEZBX1RleHRQYXJzZXI6OkdldEJhc2VsaW5lKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3QNCit7DQorICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICAgICAgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSAqcFBhcmFTdHlsZSA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCk7DQorICAgICAgICBpZiAocFBhcmFTdHlsZS0+R2V0VmVydGljYWxBbGlnbigpID09IEZERV9DU1NWRVJUSUNBTEFMSUdOX051bWJlcikgew0KKyAgICAgICAgICAgIHJldHVybiBwUGFyYVN0eWxlLT5HZXROdW1iZXJWZXJ0aWNhbEFsaWduKCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgICAgICByZXR1cm4gZm9udC5HZXRCYXNlbGluZVNoaWZ0KCk7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0TGluZUhlaWdodChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIEZYX0JPT0wgYkZpcnN0LCBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0DQorew0KKyAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDA7DQorICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICAgICAgZkxpbmVIZWlnaHQgPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpLT5HZXRMaW5lSGVpZ2h0KCk7DQorICAgIH0gZWxzZSBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpKSB7DQorICAgICAgICBmTGluZUhlaWdodCA9IHBhcmEuR2V0TGluZUhlaWdodCgpOw0KKyAgICB9DQorICAgIGlmIChiRmlyc3QpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKHBUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgICAgICBpZiAoZkxpbmVIZWlnaHQgPCAwLjFmKSB7DQorICAgICAgICAgICAgZkxpbmVIZWlnaHQgPSBmRm9udFNpemU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZMaW5lSGVpZ2h0ID0gRlhfTUlOKGZMaW5lSGVpZ2h0LCBmRm9udFNpemUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGZMaW5lSGVpZ2h0IDwgMC4xZikgew0KKyAgICAgICAgZkxpbmVIZWlnaHQgPSBHZXRGb250U2l6ZShwVGV4dFByb3ZpZGVyLCBwU3R5bGUpICogMS4yZjsNCisgICAgfQ0KKyAgICBmTGluZUhlaWdodCAqPSBmVmVyU2NhbGU7DQorICAgIHJldHVybiBmTGluZUhlaWdodDsNCit9DQorRlhfQk9PTAlDWEZBX1RleHRQYXJzZXI6OkdldEVtYmJlZE9iaihJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpDQorew0KKyAgICB3c1ZhbHVlLkVtcHR5KCk7DQorICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7DQorICAgICAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmVtYmVkIikuR2V0UHRyKCksIHdzQXR0cik7DQorICAgICAgICBpZiAod3NBdHRyLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh3c0F0dHIuR2V0QXQoMCkgPT0gRlhfV1NUUkMoTCIjIikpIHsNCisgICAgICAgICAgICB3c0F0dHIuRGVsZXRlKDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmVtYmVkVHlwZSIpLkdldFB0cigpLCB3cyk7DQorICAgICAgICBpZiAod3MuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgd3MgPSBMInNvbSI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzLk1ha2VMb3dlcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiVVJJID0gKHdzID09IEZYX1dTVFJDKEwidXJpIikpOw0KKyAgICAgICAgaWYgKCFiVVJJICYmIHdzICE9IEZYX1dTVFJDKEwic29tIikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3cy5FbXB0eSgpOw0KKyAgICAgICAgcEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInhmYTplbWJlZE1vZGUiKS5HZXRQdHIoKSwgd3MpOw0KKyAgICAgICAgaWYgKHdzLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHdzID0gTCJmb3JtYXR0ZWQiOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3cy5NYWtlTG93ZXIoKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wJYlJhdyA9ICh3cyA9PSBGWF9XU1RSQyhMInJhdyIpKTsNCisgICAgICAgIGlmICghYlJhdyAmJiB3cyAhPSBGWF9XU1RSQyhMImZvcm1hdHRlZCIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlJldCA9IHBUZXh0UHJvdmlkZXItPkdldEVtYmJlZE9iaihiVVJJLCBiUmF3LCB3c0F0dHIsIHdzVmFsdWUpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitDWEZBX1RleHRQYXJzZUNvbnRleHQqIENYRkFfVGV4dFBhcnNlcjo6R2V0UGFyc2VDb250ZXh0RnJvbU1hcChJRkRFX1hNTE5vZGUgKnBYTUxOb2RlKQ0KK3sNCisgICAgcmV0dXJuIChDWEZBX1RleHRQYXJzZUNvbnRleHQqKW1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQocFhNTE5vZGUpOw0KK30NCitlbnVtIFhGQV9UQUJTVE9QU1NUQVRVUyB7DQorICAgIFhGQV9UQUJTVE9QU1NUQVRVU19FcnJvciwNCisgICAgWEZBX1RBQlNUT1BTU1RBVFVTX0VPUywNCisgICAgWEZBX1RBQlNUT1BTU1RBVFVTX05vbmUsDQorICAgIFhGQV9UQUJTVE9QU1NUQVRVU19BbGlnbm1lbnQsDQorICAgIFhGQV9UQUJTVE9QU1NUQVRVU19TdGFydExlYWRlciwNCisgICAgWEZBX1RBQlNUT1BTU1RBVFVTX0xlYWRlciwNCisgICAgWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uLA0KK307DQorRlhfQk9PTCBDWEZBX1RleHRQYXJzZXI6OkdldFRhYnN0b3BzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQgKnBUYWJzdG9wQ29udGV4dCkNCit7DQorICAgIGlmIChwU3R5bGUgPT0gTlVMTCB8fCBwVGFic3RvcENvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIGlmICghcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS10YWItc3RvcHMiKSwgd3NWYWx1ZSkNCisgICAgICAgICAgICAmJiAhcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInRhYi1zdG9wcyIpLCB3c1ZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgICBGWF9MUENXU1RSIHBUYWJTdG9wcyA9IHdzVmFsdWU7DQorICAgIEZYX0lOVDMyIGlDdXIgPSAwOw0KKyAgICBGWF9JTlQzMiBpTGFzdCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQWxpZ247DQorICAgIFhGQV9UQUJTVE9QU1NUQVRVUyBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX05vbmU7DQorICAgIEZYX1dDSEFSIGNoOw0KKyAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGgpIHsNCisgICAgICAgIGNoID0gcFRhYlN0b3BzW2lDdXJdOw0KKyAgICAgICAgc3dpdGNoIChlU3RhdHVzKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfVEFCU1RPUFNTVEFUVVNfTm9uZToNCisgICAgICAgICAgICAgICAgaWYgKGNoIDw9ICcgJykgew0KKyAgICAgICAgICAgICAgICAgICAgaUN1cisrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19BbGlnbm1lbnQ7DQorICAgICAgICAgICAgICAgICAgICBpTGFzdCA9IGlDdXI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfVEFCU1RPUFNTVEFUVVNfQWxpZ25tZW50Og0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICB3c0FsaWduID0gQ0ZYX1dpZGVTdHJpbmdDKHBUYWJTdG9wcyArIGlMYXN0LCBpQ3VyIC0gaUxhc3QpOw0KKyAgICAgICAgICAgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19TdGFydExlYWRlcjsNCisgICAgICAgICAgICAgICAgICAgIGlDdXIrKzsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCAmJiBwVGFiU3RvcHNbaUN1cl0gPD0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUN1cisrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaUxhc3QgPSBpQ3VyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaUN1cisrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX1N0YXJ0TGVhZGVyOg0KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJ2wnKSB7DQorICAgICAgICAgICAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gcFRhYlN0b3BzW2lDdXJdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlDdXIrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJygnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyknKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudC0tOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoICYmIHBUYWJTdG9wc1tpQ3VyXSA8PSAnICcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpQ3VyKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpTGFzdCA9IGlDdXI7DQorICAgICAgICAgICAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOg0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NBbGlnbiwgd3NBbGlnbi5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1zKENGWF9XaWRlU3RyaW5nQyhwVGFiU3RvcHMgKyBpTGFzdCwgaUN1ciAtIGlMYXN0KSk7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zID0gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgICAgICAgICAgIHBUYWJzdG9wQ29udGV4dC0+QXBwZW5kKGR3SGFzaENvZGUsIGZQb3MpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NBbGlnbi5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlDdXIrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCF3c0FsaWduLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQWxpZ24sIHdzQWxpZ24uR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhDRlhfV2lkZVN0cmluZ0MocFRhYlN0b3BzICsgaUxhc3QsIGlDdXIgLSBpTGFzdCkpOw0KKyAgICAgICAgRlhfRkxPQVQgZlBvcyA9IG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBwVGFic3RvcENvbnRleHQtPkFwcGVuZChkd0hhc2hDb2RlLCBmUG9zKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9UZXh0TGF5b3V0OjpDWEZBX1RleHRMYXlvdXQoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpDQorICAgIDogbV9wVGV4dFByb3ZpZGVyKHBUZXh0UHJvdmlkZXIpDQorICAgICwgbV9wVGV4dERhdGFOb2RlKE5VTEwpDQorICAgICwgbV9wQWxsb2NhdG9yKE5VTEwpDQorICAgICwgbV9wQnJlYWsoTlVMTCkNCisgICAgLCBtX2R3VGV4dERhdGEoMCkNCisgICAgLCBtX3BMb2FkZXIoTlVMTCkNCisgICAgLCBtX2lMaW5lcygwKQ0KKyAgICAsIG1fZk1heFdpZHRoKDApDQorICAgICwgbV9wVGFic3RvcENvbnRleHQoTlVMTCkNCisgICAgLCBtX2JCbG9ja0NvbnRpbnVlKFRSVUUpDQorICAgICwgbV9iUmljaFRleHQoRkFMU0UpDQorICAgICwgbV9iSGFzQmxvY2soRkFMU0UpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wVGV4dFByb3ZpZGVyICE9IE5VTEwpOw0KK30NCitDWEZBX1RleHRMYXlvdXQ6On5DWEZBX1RleHRMYXlvdXQoKQ0KK3sNCisgICAgbV90ZXh0UGFyc2VyLlJlc2V0KCk7DQorICAgIGlmIChtX3BMb2FkZXIgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIG1fcExvYWRlcjsNCisgICAgfQ0KKyAgICBpZiAobV9wVGFic3RvcENvbnRleHQgIT0gTlVMTCkJew0KKyAgICAgICAgZGVsZXRlIG1fcFRhYnN0b3BDb250ZXh0Ow0KKyAgICB9DQorICAgIFVubG9hZCgpOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6VW5sb2FkKCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ1hGQV9QaWVjZUxpbmUgKnBMaW5lID0gbV9waWVjZUxpbmVzLkdldEF0KGkpOw0KKyAgICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9QaWVjZUxpbmUsIG1fcEFsbG9jYXRvciwgcExpbmUpOw0KKyAgICB9DQorICAgIG1fcGllY2VMaW5lcy5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fcEJyZWFrICE9IE5VTEwpIHsNCisgICAgICAgIG1fcEJyZWFrLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BCcmVhayA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgICAgICBtX3BBbGxvY2F0b3ItPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICAgIH0NCit9DQorY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSogQ1hGQV9UZXh0TGF5b3V0OjpHZXRQaWVjZUxpbmVzKCkNCit7DQorICAgIHJldHVybiAmbV9waWVjZUxpbmVzOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6R2V0VGV4dERhdGFOb2RlKCkNCit7DQorICAgIGlmIChtX3BUZXh0UHJvdmlkZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSAqcE5vZGUgPSBtX3BUZXh0UHJvdmlkZXItPkdldFRleHROb2RlKG1fYlJpY2hUZXh0KTsNCisgICAgaWYgKHBOb2RlICYmIG1fYlJpY2hUZXh0KSB7DQorICAgICAgICBtX3RleHRQYXJzZXIuUmVzZXQoKTsNCisgICAgfQ0KKyAgICBtX3BUZXh0RGF0YU5vZGUgPSBwTm9kZTsNCit9DQorSUZERV9YTUxOb2RlKiBDWEZBX1RleHRMYXlvdXQ6OkdldFhNTENvbnRhaW5lck5vZGUoKQ0KK3sNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MQ29udGFpbmVyID0gTlVMTDsNCisgICAgaWYgKG1fYlJpY2hUZXh0KSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxSb290ID0gbV9wVGV4dERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYgKCFwWE1MUm9vdCkgew0KKyAgICAgICAgICAgIHJldHVybiBwWE1MQ29udGFpbmVyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxSb290LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocFhNTENoaWxkLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZzsNCisgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c1RhZyk7DQorICAgICAgICAgICAgICAgIGlmICh3c1RhZy5FcXVhbChGWF9XU1RSQyhMImJvZHkiKSkgfHwgd3NUYWcuRXF1YWwoRlhfV1NUUkMoTCJodG1sIikpKSB7DQorICAgICAgICAgICAgICAgICAgICBwWE1MQ29udGFpbmVyID0gcFhNTENoaWxkOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBYTUxDb250YWluZXI7DQorfQ0KK0lGWF9SVEZCcmVhayogQ1hGQV9UZXh0TGF5b3V0OjpDcmVhdGVCcmVhayhGWF9CT09MIGJEZWZhdWx0KQ0KK3sNCisgICAgRlhfRFdPUkQgZHdTdHlsZSA9IEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYjsNCisgICAgaWYgKCFiRGVmYXVsdCkgew0KKyAgICAgICAgZHdTdHlsZSB8PSBGWF9SVEZMQVlPVVRTVFlMRV9QYWdpbmF0aW9uOw0KKyAgICB9DQorICAgIElGWF9SVEZCcmVhayAqcEJyZWFrID0gSUZYX1JURkJyZWFrOjpDcmVhdGUoMCk7DQorICAgIHBCcmVhay0+U2V0TGF5b3V0U3R5bGVzKGR3U3R5bGUpOw0KKyAgICBwQnJlYWstPlNldExpbmVCcmVha0NoYXIoTCdcbicpOw0KKyAgICBwQnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZSgxKTsNCisgICAgcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgTlVMTCkpOw0KKyAgICBwQnJlYWstPlNldEZvbnRTaXplKG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIE5VTEwpKTsNCisgICAgcmV0dXJuIHBCcmVhazsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkluaXRCcmVhayhGWF9GTE9BVCBmTGluZVdpZHRoKQ0KK3sNCisgICAgQ1hGQV9Gb250IGZvbnQgPSBtX3BUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICAgIENYRkFfUGFyYSBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KKyAgICBGWF9GTE9BVCBmU3RhcnQgPSAwOw0KKyAgICBGWF9GTE9BVCBmU3RhcnRQb3MgPSAwOw0KKyAgICBpZiAocGFyYS5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0Ow0KKyAgICAgICAgc3dpdGNoIChwYXJhLkdldEhvcml6b250YWxBbGlnbigpKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQorICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6DQorICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQnJlYWstPlNldEFsaWdubWVudChpQWxpZ24pOw0KKyAgICAgICAgZlN0YXJ0ID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgICAgICBpZiAobV9wVGV4dFByb3ZpZGVyLT5Jc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkpIHsNCisgICAgICAgICAgICBpZiAoaUFsaWduICE9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICAgICAgICAgICAgICBmTGluZVdpZHRoIC09IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZMaW5lV2lkdGggLT0gcGFyYS5HZXRNYXJnaW5SaWdodCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZMaW5lV2lkdGggPCAwKSB7DQorICAgICAgICAgICAgZkxpbmVXaWR0aCA9IGZTdGFydDsNCisgICAgICAgIH0NCisgICAgICAgIGZTdGFydFBvcyA9IGZTdGFydDsNCisgICAgICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsNCisgICAgICAgIGlmIChmSW5kZW50ID4gMCkgew0KKyAgICAgICAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5TZXRMaW5lV2lkdGgoZlN0YXJ0LCBmTGluZVdpZHRoKTsNCisgICAgbV9wQnJlYWstPlNldExpbmVQb3MoZlN0YXJ0UG9zKTsNCisgICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUoKEZYX0lOVDMyKWZvbnQuR2V0SG9yaXpvbnRhbFNjYWxlKCkpOw0KKyAgICAgICAgbV9wQnJlYWstPlNldFZlcnRpY2FsU2NhbGUoKEZYX0lOVDMyKWZvbnQuR2V0VmVydGljYWxTY2FsZSgpKTsNCisgICAgICAgIG1fcEJyZWFrLT5TZXRDaGFyU3BhY2UoZm9udC5HZXRMZXR0ZXJTcGFjaW5nKCkpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIE5VTEwpOw0KKyAgICBtX3BCcmVhay0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsNCisgICAgbV9wQnJlYWstPlNldEZvbnQobV90ZXh0UGFyc2VyLkdldEZvbnQobV9wVGV4dFByb3ZpZGVyLCBOVUxMKSk7DQorICAgIG1fcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoZkZvbnRTaXplICogMC4yZik7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJbml0QnJlYWsoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIEZERV9DU1NESVNQTEFZIGVEaXNwbGF5LCBGWF9GTE9BVCBmTGluZVdpZHRoLCBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSkNCit7DQorICAgIGlmIChwU3R5bGUgPT0gTlVMTCkgew0KKyAgICAgICAgSW5pdEJyZWFrKGZMaW5lV2lkdGgpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUgKnBQYXJhU3R5bGUgPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpOw0KKyAgICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2sgfHwgZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0pIHsNCisgICAgICAgIEZYX0lOVDMyIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdDsNCisgICAgICAgIHN3aXRjaCAocFBhcmFTdHlsZS0+R2V0VGV4dEFsaWduKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fUmlnaHQ6DQorICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1RFWFRBTElHTl9DZW50ZXI6DQorICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeToNCisgICAgICAgICAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsOg0KKyAgICAgICAgICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEJyZWFrLT5TZXRBbGlnbm1lbnQoaUFsaWduKTsNCisgICAgICAgIEZYX0ZMT0FUIGZTdGFydCA9IDA7DQorICAgICAgICBjb25zdCBGREVfQ1NTUkVDVCAqcFJlY3QgPSBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPkdldE1hcmdpbldpZHRoKCk7DQorICAgICAgICBjb25zdCBGREVfQ1NTUkVDVCAqcFBhZGRpbmdSZWN0ID0gcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRQYWRkaW5nV2lkdGgoKTsNCisgICAgICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgZlN0YXJ0ID0gcFJlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICBmTGluZVdpZHRoIC09IHBSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOw0KKyAgICAgICAgICAgIGlmIChwUGFkZGluZ1JlY3QgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBmU3RhcnQgKz0gcFBhZGRpbmdSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQorICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhZGRpbmdSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QgKnBQYXJSZWN0ID0gcFBhcmVudFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRNYXJnaW5XaWR0aCgpOw0KKyAgICAgICAgICAgICAgICBjb25zdCBGREVfQ1NTUkVDVCAqcFBhclBhZGRpbmdSZWN0ID0gcFBhcmVudFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRQYWRkaW5nV2lkdGgoKTsNCisgICAgICAgICAgICAgICAgaWYgKHBQYXJSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIGZTdGFydCArPSBwUGFyUmVjdC0+bGVmdC5HZXRWYWx1ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgZkxpbmVXaWR0aCAtPSBwUGFyUmVjdC0+cmlnaHQuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUGFyUGFkZGluZ1JlY3QgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZTdGFydCArPSBwUGFyUGFkZGluZ1JlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmTGluZVdpZHRoIC09IHBQYXJQYWRkaW5nUmVjdC0+cmlnaHQuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGREVfQ1NTUkVDVCBwTmV3UmVjdDsNCisgICAgICAgICAgICAgICAgcE5ld1JlY3QubGVmdC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIGZTdGFydCk7DQorICAgICAgICAgICAgICAgIHBOZXdSZWN0LnJpZ2h0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcFJlY3QtPnJpZ2h0LkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgICBwTmV3UmVjdC50b3AuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwUmVjdC0+dG9wLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgICBwTmV3UmVjdC5ib3R0b20uU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwUmVjdC0+Ym90dG9tLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgICBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPlNldE1hcmdpbldpZHRoKHBOZXdSZWN0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3BCcmVhay0+U2V0TGluZVdpZHRoKGZTdGFydCwgZkxpbmVXaWR0aCk7DQorICAgICAgICBGWF9GTE9BVCBmSW5kZW50ID0gcFBhcmFTdHlsZS0+R2V0VGV4dEluZGVudCgpLkdldFZhbHVlKCk7DQorICAgICAgICBpZiAoZkluZGVudCA+IDApIHsNCisgICAgICAgICAgICBmU3RhcnQgKz0gZkluZGVudDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEJyZWFrLT5TZXRMaW5lUG9zKGZTdGFydCk7DQorICAgICAgICBtX3BCcmVhay0+U2V0VGFiV2lkdGgobV90ZXh0UGFyc2VyLkdldFRhYkludGVydmFsKHBTdHlsZSkpOw0KKyAgICAgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IEZYX05FVyBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ7DQorICAgICAgICB9DQorICAgICAgICBtX3RleHRQYXJzZXIuR2V0VGFic3RvcHMocFN0eWxlLCBtX3BUYWJzdG9wQ29udGV4dCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkNvdW50OyBpKyspIHsNCisgICAgICAgICAgICBYRkFfVEFCU1RPUFMgKnBUYWIgPSBtX3BUYWJzdG9wQ29udGV4dC0+bV90YWJzdG9wcy5HZXREYXRhUHRyKGkpOw0KKyAgICAgICAgICAgIG1fcEJyZWFrLT5BZGRQb3NpdGlvbmVkVGFiKHBUYWItPmZUYWJzdG9wcyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgbV9wQnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICAgIG1fcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoZkZvbnRTaXplICogMC4yZik7DQorICAgIG1fcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgcFN0eWxlKSk7DQorICAgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUobV90ZXh0UGFyc2VyLkdldEhvclNjYWxlKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBwWE1MTm9kZSkpOw0KKyAgICBtX3BCcmVhay0+U2V0VmVydGljYWxTY2FsZShtX3RleHRQYXJzZXIuR2V0VmVyU2NhbGUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpKTsNCisgICAgbV9wQnJlYWstPlNldENoYXJTcGFjZShwUGFyYVN0eWxlLT5HZXRMZXR0ZXJTcGFjaW5nKCkuR2V0VmFsdWUoKSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfVGV4dExheW91dDo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgR2V0VGV4dERhdGFOb2RlKCk7DQorICAgIHdzVGV4dC5FbXB0eSgpOw0KKyAgICBpZiAobV9iUmljaFRleHQpIHsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdzVGV4dCA9IG1fcFRleHREYXRhTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgICB9DQorICAgIHJldHVybiB3c1RleHQuR2V0TGVuZ3RoKCk7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfVGV4dExheW91dDo6R2V0TGF5b3V0SGVpZ2h0KCkNCit7DQorICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkdldFNpemUoKTsNCisgICAgaWYgKGlDb3VudCA9PSAwICYmIG1fcExvYWRlci0+bV9mV2lkdGggPiAwKSB7DQorICAgICAgICBDRlhfU2l6ZUYgc3pNYXgsIHN6RGVmOw0KKyAgICAgICAgc3pNYXguU2V0KG1fcExvYWRlci0+bV9mV2lkdGgsIG1fcExvYWRlci0+bV9mSGVpZ2h0KTsNCisgICAgICAgIHN6RGVmLlNldCgwLCAwKTsNCisgICAgICAgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSBUUlVFOw0KKyAgICAgICAgbV9wTG9hZGVyLT5tX2ZMYXN0UG9zID0gMDsNCisgICAgICAgIENhbGNTaXplKHN6TWF4LCBzek1heCwgc3pEZWYpOw0KKyAgICAgICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IEZBTFNFOw0KKyAgICAgICAgcmV0dXJuIHN6RGVmLnk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcExvYWRlci0+bV9mSGVpZ2h0Ow0KKyAgICBpZiAoZkhlaWdodCA8IDAuMWYpIHsNCisgICAgICAgIGZIZWlnaHQgPSAwOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgZkhlaWdodCArPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuRWxlbWVudEF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBmSGVpZ2h0Ow0KK30NCitGWF9GTE9BVCBDWEZBX1RleHRMYXlvdXQ6OlN0YXJ0TGF5b3V0KEZYX0ZMT0FUIGZXaWR0aCApDQorew0KKyAgICBpZiAobV9wTG9hZGVyID09IE5VTEwpIHsNCisgICAgICAgIG1fcExvYWRlciA9IEZYX05FVyBDWEZBX0xvYWRlckNvbnRleHQ7DQorICAgIH0NCisgICAgaWYgKGZXaWR0aCA8IDAgfHwgKG1fcExvYWRlci0+bV9mV2lkdGggPiAtMSAmJiBGWFNZU19mYWJzKGZXaWR0aCAtIG1fcExvYWRlci0+bV9mV2lkdGgpID4gMCkpIHsNCisgICAgICAgIG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5SZW1vdmVBbGwoKTsNCisgICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgVW5sb2FkKCk7DQorICAgICAgICBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldCA9IDA7DQorICAgIH0NCisgICAgbV9wTG9hZGVyLT5tX2ZXaWR0aCA9IGZXaWR0aDsNCisgICAgaWYgKGZXaWR0aCA8IDApIHsNCisgICAgICAgIENGWF9TaXplRiBzek1heCwgc3pEZWY7DQorICAgICAgICBzek1heC5TZXQoMCwgMCk7DQorICAgICAgICBzekRlZi5TZXQoMCwgMCk7DQorICAgICAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gVFJVRTsNCisgICAgICAgIG1fcExvYWRlci0+bV9mTGFzdFBvcyA9IDA7DQorICAgICAgICBDYWxjU2l6ZShzek1heCwgc3pNYXgsIHN6RGVmKTsNCisgICAgICAgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSBGQUxTRTsNCisgICAgICAgIGZXaWR0aCA9IHN6RGVmLng7DQorICAgIH0NCisgICAgcmV0dXJuIGZXaWR0aDsNCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkRvTGF5b3V0KEZYX0lOVDMyIGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHQsIEZYX0ZMT0FUIGZDb250ZW50QXJlYUhlaWdodCAsIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0ICkNCit7DQorICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlCbG9ja0NvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gZlRleHRIZWlnaHQ7DQorICAgIGlmIChmSGVpZ2h0IDwgMCkgew0KKyAgICAgICAgZkhlaWdodCA9IEdldExheW91dEhlaWdodCgpOw0KKyAgICB9DQorICAgIG1fcExvYWRlci0+bV9mSGVpZ2h0ID0gZkhlaWdodDsNCisgICAgaWYgKGZDb250ZW50QXJlYUhlaWdodCA8IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX2JIYXNCbG9jayA9IFRSVUU7DQorICAgIGlmIChpQmxvY2tDb3VudCA9PSAwICYmIGZIZWlnaHQgPiAwKSB7DQorICAgICAgICBmSGVpZ2h0ID0gZlRleHRIZWlnaHQgLSBHZXRMYXlvdXRIZWlnaHQoKTsNCisgICAgICAgIGlmIChmSGVpZ2h0ID4gMCkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlBbGlnbiA9IG1fdGV4dFBhcnNlci5HZXRWQWxnaW4obV9wVGV4dFByb3ZpZGVyKTsNCisgICAgICAgICAgICBpZiAoaUFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZSkgew0KKyAgICAgICAgICAgICAgICBmSGVpZ2h0IC89IDIuMGY7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpQWxpZ24gIT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgICAgICAgICAgIGZIZWlnaHQgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldCA9IGZIZWlnaHQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkxpbmVQb3MgPSBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldDsNCisgICAgRlhfSU5UMzIgaUxpbmVJbmRleCA9IDA7DQorICAgIGlmIChpQmxvY2tDb3VudCA+IDEpIHsNCisgICAgICAgIGlmIChpQmxvY2tDb3VudCA+PSAoaUJsb2NrSW5kZXggKyAxKSAqIDIpIHsNCisgICAgICAgICAgICBpTGluZUluZGV4ID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0luZGV4ICogMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlMaW5lSW5kZXggPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrQ291bnQgLSAxKSArIG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQmxvY2tJbmRleDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuRWxlbWVudEF0KGkgKiAyICsgMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKGkgPSBpTGluZUluZGV4OyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsNCisgICAgICAgIGlmICgoaSA9PSBpTGluZUluZGV4KSAmJiAoZkxpbmVIZWlnaHQgLSBmQ29udGVudEFyZWFIZWlnaHQgPiAwLjAwMSkpIHsNCisgICAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIGZDb250ZW50QXJlYUhlaWdodCA+IDAuMDAxKSB7DQorICAgICAgICAgICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgew0KKyAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5TZXRBdChpQmxvY2tJbmRleCAqIDIsIGlMaW5lSW5kZXgpOw0KKyAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5TZXRBdChpQmxvY2tJbmRleCAqIDIgKyAxLCBpIC0gaUxpbmVJbmRleCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOw0KKyAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5BZGQoaSAtIGlMaW5lSW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaSA9PSBpTGluZUluZGV4KSB7DQorICAgICAgICAgICAgICAgIGlmIChmQ2FsY0hlaWdodCA8PSBmTGluZVBvcykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpID4gaUJsb2NrSW5kZXggKiAyICYmIChtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldEF0KGlCbG9ja0luZGV4ICogMikgPT0gaUJsb2NrSW5kZXgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5TZXRBdChpQmxvY2tJbmRleCAqIDIgKyAxLCBmQ2FsY0hlaWdodCk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuQWRkKChGWF9GTE9BVClpQmxvY2tJbmRleCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5BZGQoZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmQ2FsY0hlaWdodCA9IGZMaW5lUG9zOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkxpbmVQb3MgKz0gZkxpbmVIZWlnaHQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9JTlQzMiBDWEZBX1RleHRMYXlvdXQ6OkNvdW50QmxvY2tzKCkgY29uc3QNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKSAvIDI7DQorICAgIHJldHVybiBpQ291bnQgPiAwID8gaUNvdW50IDogMTsNCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkNhbGNTaXplKGNvbnN0IENGWF9TaXplRiAmbWluU2l6ZSwgY29uc3QgQ0ZYX1NpemVGICZtYXhTaXplLCBDRlhfU2l6ZUYgJmRlZmF1bHRTaXplKQ0KK3sNCisgICAgZGVmYXVsdFNpemUueCA9IG1heFNpemUueDsNCisgICAgaWYgKGRlZmF1bHRTaXplLnggPCAxKSB7DQorICAgICAgICBkZWZhdWx0U2l6ZS54ID0gMHhGRkZGOw0KKyAgICB9DQorICAgIGlmIChtX3BCcmVhayAhPSBOVUxMKSB7DQorICAgICAgICBtX3BCcmVhay0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsoRkFMU0UpOw0KKyAgICBGWF9GTE9BVCBmTGluZVBvcyA9IDA7DQorICAgIG1faUxpbmVzID0gMDsNCisgICAgbV9mTWF4V2lkdGggPSAwOw0KKyAgICBMb2FkZXIoZGVmYXVsdFNpemUsIGZMaW5lUG9zLCBGQUxTRSk7DQorICAgIGlmIChmTGluZVBvcyA8IDAuMWYpIHsNCisgICAgICAgIGZMaW5lUG9zID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgTlVMTCk7DQorICAgIH0NCisgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgICAgICBkZWxldGUgbV9wVGFic3RvcENvbnRleHQ7DQorICAgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IE5VTEw7DQorICAgIH0NCisgICAgZGVmYXVsdFNpemUuU2V0KG1fZk1heFdpZHRoLCBmTGluZVBvcyk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6TGF5b3V0KGNvbnN0IENGWF9TaXplRiAmc2l6ZSwgRlhfRkxPQVQqIGZIZWlnaHQpDQorew0KKyAgICBpZiAoc2l6ZS54IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFVubG9hZCgpOw0KKyAgICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKFRSVUUpOw0KKyAgICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgICAgIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA9IC0xOw0KKyAgICAgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCisgICAgfQ0KKyAgICBtX2lMaW5lcyA9IDA7DQorICAgIEZYX0ZMT0FUIGZMaW5lUG9zID0gMDsNCisgICAgTG9hZGVyKHNpemUsIGZMaW5lUG9zLCBUUlVFKTsNCisgICAgVXBkYXRlQWxpZ24oc2l6ZS55LCBmTGluZVBvcyk7DQorICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCkgew0KKyAgICAgICAgZGVsZXRlIG1fcFRhYnN0b3BDb250ZXh0Ow0KKyAgICAgICAgbV9wVGFic3RvcENvbnRleHQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChmSGVpZ2h0KSB7DQorICAgICAgICAqZkhlaWdodCA9IGZMaW5lUG9zOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6TGF5b3V0KEZYX0lOVDMyIGlCbG9jaykNCit7DQorICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCB8fCBpQmxvY2sgPCAwIHx8IGlCbG9jayA+PSBDb3VudEJsb2NrcygpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcExvYWRlci0+bV9mV2lkdGggPCAxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7DQorICAgIG1faUxpbmVzID0gMDsNCisgICAgRlhfRkxPQVQgZkxpbmVQb3MgPSAwOw0KKyAgICBDWEZBX05vZGUgKnBOb2RlID0gTlVMTDsNCisgICAgQ0ZYX1NpemVGIHN6VGV4dDsNCisgICAgc3pUZXh0LlNldChtX3BMb2FkZXItPm1fZldpZHRoLCBtX3BMb2FkZXItPm1fZkhlaWdodCk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaUJsb2Nrc0hlaWdodENvdW50ID0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5HZXRTaXplKCk7DQorICAgIGlCbG9ja3NIZWlnaHRDb3VudCAvPSAyOw0KKyAgICBpZiAoaUJsb2NrIDwgaUJsb2Nrc0hlaWdodENvdW50KSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoaUJsb2NrID09IGlCbG9ja3NIZWlnaHRDb3VudCkgew0KKyAgICAgICAgVW5sb2FkKCk7DQorICAgICAgICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKFRSVUUpOw0KKyAgICAgICAgZkxpbmVQb3MgPSBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQmxvY2tzSGVpZ2h0Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuRWxlbWVudEF0KGkgKiAyICsgMSk7DQorICAgICAgICB9DQorICAgICAgICBtX3BMb2FkZXItPm1faUNoYXIgPSAwOw0KKyAgICAgICAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgICAgICAgICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrICogMiArIDEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgTG9hZGVyKHN6VGV4dCwgZkxpbmVQb3MsIFRSVUUpOw0KKyAgICAgICAgaWYgKGlDb3VudCA9PSAwICYmIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0IDwgMC4xZikgew0KKyAgICAgICAgICAgIFVwZGF0ZUFsaWduKHN6VGV4dC55LCBmTGluZVBvcyk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wVGV4dERhdGFOb2RlICE9IE5VTEwpIHsNCisgICAgICAgIGlCbG9jayAqPSAyOw0KKyAgICAgICAgaWYgKGlCbG9jayA8IGlDb3VudCAtIDIpIHsNCisgICAgICAgICAgICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrICsgMSk7DQorICAgICAgICB9DQorICAgICAgICBtX3BCcmVhay0+UmVzZXQoKTsNCisgICAgICAgIGlmIChtX2JSaWNoVGV4dCkgew0KKyAgICAgICAgICAgIElGREVfWE1MTm9kZSogcENvbnRhaW5lck5vZGUgPSBHZXRYTUxDb250YWluZXJOb2RlKCk7DQorICAgICAgICAgICAgaWYgKCFwQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IG1fcExvYWRlci0+bV9wWE1MTm9kZTsNCisgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwU2F2ZVhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7DQorICAgICAgICAgICAgZm9yICg7IHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGFnID0gTG9hZFJpY2hUZXh0KHBYTUxOb2RlLCBzelRleHQsIGZMaW5lUG9zLCBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgaWYgKCFiRmxhZykgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFhNTE5vZGUgPSBwU2F2ZVhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IHBDb250YWluZXJOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGFnID0gTG9hZFJpY2hUZXh0KHBYTUxOb2RlLCBzelRleHQsIGZMaW5lUG9zLCBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCBUUlVFLCBOVUxMICwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBpZiAoIWJGbGFnKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwU2F2ZVhNTE5vZGUgPSBwWE1MTm9kZTsNCisgICAgICAgICAgICAgICAgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgIGlmICghcFhNTE5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvciAoOyBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsYWcgPSBMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmxhZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwTm9kZSA9IG1fcExvYWRlci0+bV9wTm9kZTsNCisgICAgICAgICAgICBpZiAocE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgTG9hZFRleHQocE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQmxvY2sgPT0gaUNvdW50KSB7DQorICAgICAgICBpZiAobV9wVGFic3RvcENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCisgICAgICAgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgbV9wTG9hZGVyOw0KKyAgICAgICAgICAgIG1fcExvYWRlciA9IE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJdGVtQmxvY2tzKGNvbnN0IENGWF9SZWN0RiYgcnRUZXh0LCBGWF9JTlQzMiBpQmxvY2tJbmRleCkNCit7DQorICAgIGlmICghbV9wTG9hZGVyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUNvdW50SGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkdldFNpemUoKTsNCisgICAgaWYgKGlDb3VudEhlaWdodCA9PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiRW5kSXRlbSA9IFRSVUU7DQorICAgIEZYX0lOVDMyIGlCbG9ja0NvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KKyAgICBGWF9GTE9BVCBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0Ow0KKyAgICBGWF9JTlQzMiBpTGluZUluZGV4ID0gMDsNCisgICAgaWYgKGlCbG9ja0luZGV4ID4gMCkgew0KKyAgICAgICAgRlhfSU5UMzIgaUJsb2NrSGVpZ2h0Q291bnQgPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldFNpemUoKTsNCisgICAgICAgIGlCbG9ja0hlaWdodENvdW50IC89IDI7DQorICAgICAgICBpZiAoaUJsb2NrSGVpZ2h0Q291bnQgPj0gaUJsb2NrSW5kZXgpIHsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUJsb2NrSW5kZXg7IGkrKykgew0KKyAgICAgICAgICAgICAgICBmTGluZVBvcyAtPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkVsZW1lbnRBdChpICogMiArIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZkxpbmVQb3MgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUxpbmVJbmRleCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDEpICsgbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0NvdW50IC0gMik7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGZvciAoaSA9IGlMaW5lSW5kZXg7IGkgPCBpQ291bnRIZWlnaHQ7IGkrKykgew0KKyAgICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuRWxlbWVudEF0KGkpOw0KKyAgICAgICAgaWYgKGZMaW5lUG9zICsgZkxpbmVIZWlnaHQgLSBydFRleHQuaGVpZ2h0ID4gMC4wMDEpIHsNCisgICAgICAgICAgICBtX0Jsb2Nrcy5BZGQoaUxpbmVJbmRleCk7DQorICAgICAgICAgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsNCisgICAgICAgICAgICBiRW5kSXRlbSA9IEZBTFNFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkxpbmVQb3MgKz0gZkxpbmVIZWlnaHQ7DQorICAgIH0NCisgICAgaWYgKGlDb3VudEhlaWdodCA+IDAgJiYgKGkgLSBpTGluZUluZGV4KSA+IDAgJiYgYkVuZEl0ZW0pIHsNCisgICAgICAgIG1fQmxvY2tzLkFkZChpTGluZUluZGV4KTsNCisgICAgICAgIG1fQmxvY2tzLkFkZChpIC0gaUxpbmVJbmRleCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkRyYXdTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSAqcEZ4RGV2aWNlLCBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UsIGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwLCBGWF9JTlQzMiBpQmxvY2sgKQ0KK3sNCisgICAgSUZERV9SZW5kZXJEZXZpY2UgKnBEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBGeERldmljZSk7DQorICAgIGlmIChwRGV2aWNlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGREVfSERFVklDRVNUQVRFIHN0YXRlID0gcERldmljZS0+U2F2ZVN0YXRlKCk7DQorICAgIHBEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICAgIElGREVfU29saWRCcnVzaCAqcFNvbGlkQnJ1c2ggPSAoSUZERV9Tb2xpZEJydXNoKilJRkRFX0JydXNoOjpDcmVhdGUoRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQorICAgIElGREVfUGVuICpwUGVuID0gSUZERV9QZW46OkNyZWF0ZSgpOw0KKyAgICBGWFNZU19hc3NlcnQocERldmljZSAhPSBOVUxMICYmIHBTb2xpZEJydXNoICE9IE5VTEwgJiYgcFBlbiAhPSBOVUxMKTsNCisgICAgaWYgKG1fcGllY2VMaW5lcy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgRlhfSU5UMzIgaUJsb2NrQ291bnQgPSBDb3VudEJsb2NrcygpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlCbG9ja0NvdW50OyBpKyspIHsNCisgICAgICAgICAgICBMYXlvdXQoaSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaUNoYXJDb3VudCA9IDA7DQorICAgIEZYX0lOVDMyIGlMaW5lU3RhcnQgPSAwOw0KKyAgICBGWF9JTlQzMiBpUGllY2VMaW5lcyA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKTsNCisgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICAgIGlCbG9jayAqPSAyOw0KKyAgICAgICAgaWYgKGlCbG9jayA8IGlDb3VudCkgew0KKyAgICAgICAgICAgIGlMaW5lU3RhcnQgPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrKTsNCisgICAgICAgICAgICBpUGllY2VMaW5lcyA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2sgKyAxKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVBpZWNlTGluZXMgPSAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpUGllY2VMaW5lczsgaSsrKSB7DQorICAgICAgICBpZihpICsgaUxpbmVTdGFydCA+PSBtX3BpZWNlTGluZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSA9IG1fcGllY2VMaW5lcy5HZXRBdChpICsgaUxpbmVTdGFydCk7DQorICAgICAgICBGWF9JTlQzMiBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgICAgIEZYX0lOVDMyIGogPSAwOw0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgICAgICAgIFhGQV9MUENURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDaGFycyA9IHBQaWVjZS0+aUNoYXJzOw0KKyAgICAgICAgICAgIGlmIChpQ2hhckNvdW50IDwgaUNoYXJzKSB7DQorICAgICAgICAgICAgICAgIGlmIChwQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBGREVfRnJlZShwQ2hhclBvcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhpQ2hhcnMgKiBzaXplb2YoRlhURVhUX0NIQVJQT1MpKTsNCisgICAgICAgICAgICAgICAgaUNoYXJDb3VudCA9IGlDaGFyczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBDaGFyUG9zLCAwLCBpQ2hhckNvdW50ICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQorICAgICAgICAgICAgUmVuZGVyU3RyaW5nKHBEZXZpY2UsIHBTb2xpZEJydXNoLCBwUGllY2VMaW5lLCBqLCBwQ2hhclBvcywgdG1Eb2MyRGV2aWNlKTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCisgICAgICAgICAgICBSZW5kZXJQYXRoKHBEZXZpY2UsIHBQZW4sIHBQaWVjZUxpbmUsIGosIHBDaGFyUG9zLCB0bURvYzJEZXZpY2UpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZShzdGF0ZSk7DQorICAgIGlmIChwQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICBGREVfRnJlZShwQ2hhclBvcyk7DQorICAgIH0NCisgICAgcFNvbGlkQnJ1c2gtPlJlbGVhc2UoKTsNCisgICAgcFBlbi0+UmVsZWFzZSgpOw0KKyAgICBwRGV2aWNlLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBpUGllY2VMaW5lczsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlVwZGF0ZUFsaWduKEZYX0ZMT0FUIGZIZWlnaHQsIEZYX0ZMT0FUIGZCb3R0b20pDQorew0KKyAgICBmSGVpZ2h0IC09IGZCb3R0b207DQorICAgIGlmIChmSGVpZ2h0IDwgMC4xZikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHN3aXRjaCAobV90ZXh0UGFyc2VyLkdldFZBbGdpbihtX3BUZXh0UHJvdmlkZXIpKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCisgICAgICAgICAgICBmSGVpZ2h0IC89IDIuMGY7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ1hGQV9QaWVjZUxpbmUgKnBQaWVjZUxpbmUgPSBtX3BpZWNlTGluZXMuR2V0QXQoaSk7DQorICAgICAgICBGWF9JTlQzMiBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCisgICAgICAgICAgICBYRkFfTFBURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KKyAgICAgICAgICAgIENGWF9SZWN0RiAmcmVjdCA9IHBQaWVjZS0+cnRQaWVjZTsNCisgICAgICAgICAgICByZWN0LnRvcCArPSBmSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpMb2FkZXIoY29uc3QgQ0ZYX1NpemVGICZzelRleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgRlhfQk9PTCBiU2F2ZVBpZWNlcyApDQorew0KKyAgICBpZiAobV9wQWxsb2NhdG9yID09IE5VTEwpIHsNCisgICAgICAgIG1fcEFsbG9jYXRvciA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAyNTYsIDApOw0KKyAgICB9DQorICAgIEdldFRleHREYXRhTm9kZSgpOw0KKyAgICBpZiAobV9wVGV4dERhdGFOb2RlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChtX2JSaWNoVGV4dCkgew0KKyAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MQ29udGFpbmVyID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KKyAgICAgICAgaWYgKHBYTUxDb250YWluZXIpIHsNCisgICAgICAgICAgICBpZiAoIW1fdGV4dFBhcnNlci5Jc1BhcnNlZCgpKSB7DQorICAgICAgICAgICAgICAgIG1fdGV4dFBhcnNlci5Eb1BhcnNlKHBYTUxDb250YWluZXIsIG1fcFRleHRQcm92aWRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFJvb3RTdHlsZSA9IG1fdGV4dFBhcnNlci5DcmVhdGVSb290U3R5bGUobV9wVGV4dFByb3ZpZGVyKTsNCisgICAgICAgICAgICBMb2FkUmljaFRleHQocFhNTENvbnRhaW5lciwgc3pUZXh0LCBmTGluZVBvcywgcFJvb3RTdHlsZSwgYlNhdmVQaWVjZXMpOw0KKyAgICAgICAgICAgIHBSb290U3R5bGUtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIExvYWRUZXh0KG1fcFRleHREYXRhTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6TG9hZFRleHQoQ1hGQV9Ob2RlICpwTm9kZSwgY29uc3QgQ0ZYX1NpemVGICZzelRleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgRlhfQk9PTCBiU2F2ZVBpZWNlcykNCit7DQorICAgIEluaXRCcmVhayhzelRleHQueCk7DQorICAgIENYRkFfUGFyYSBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KKyAgICBGWF9GTE9BVCBmU3BhY2VBYm92ZSA9IDA7DQorICAgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBmU3BhY2VBYm92ZSA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KKyAgICAgICAgaWYgKGZTcGFjZUFib3ZlIDwgMC4xZikgew0KKyAgICAgICAgICAgIGZTcGFjZUFib3ZlID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIHZlckFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgICAgICBzd2l0Y2ggKHZlckFsaWduKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsNCisgICAgICAgICAgICAgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUFib3ZlOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgICB3c1RleHQuVHJpbVJpZ2h0KEwiICIpOw0KKyAgICBGWF9CT09MIGJSZXQgPSBBcHBlbmRDaGFyKHdzVGV4dCwgZkxpbmVQb3MsIGZTcGFjZUFib3ZlLCBiU2F2ZVBpZWNlcyk7DQorICAgIGlmIChiUmV0ICYmIG1fcExvYWRlciAhPSBOVUxMKSB7DQorICAgICAgICBtX3BMb2FkZXItPm1fcE5vZGUgPSBwTm9kZTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEVuZEJyZWFrKEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJIENYRkFfVGV4dExheW91dDo6TG9hZFJpY2hUZXh0KElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIGNvbnN0IENGWF9TaXplRiAmc3pUZXh0LCBGWF9GTE9BVCAmZkxpbmVQb3MsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlLCBGWF9CT09MIGJTYXZlUGllY2VzLCBDWEZBX0xpbmtVc2VyRGF0YSogcExpbmtEYXRhLCBGWF9CT09MIGJFbmRCcmVhaywgRlhfQk9PTCBiSXNPbCwgRlhfSU5UMzIgaUxpQ291bnQpDQorew0KKyAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCAqcENvbnRleHQgPSBtX3RleHRQYXJzZXIuR2V0UGFyc2VDb250ZXh0RnJvbU1hcChwWE1MTm9kZSk7DQorICAgIEZERV9DU1NESVNQTEFZIGVEaXNwbGF5ID0gRkRFX0NTU0RJU1BMQVlfTm9uZTsNCisgICAgRlhfQk9PTCBiQ29udGVudE5vZGUJPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZlNwYWNlQmVsb3cJPSAwOw0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSA9IE5VTEw7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgaWYgKGJFbmRCcmVhaykgew0KKyAgICAgICAgRlhfQk9PTCBiQ3VyT2wgPSBGQUxTRTsNCisgICAgICAgIEZYX0JPT0wgYkN1ckxpID0gRkFMU0U7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50ID0gTlVMTDsNCisgICAgICAgIGlmIChwQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgaWYobV9iQmxvY2tDb250aW51ZSB8fCAobV9wTG9hZGVyICYmIHBYTUxOb2RlID09IG1fcExvYWRlci0+bV9wWE1MTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgbV9iQmxvY2tDb250aW51ZSA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfVGV4dCkgew0KKyAgICAgICAgICAgICAgICBiQ29udGVudE5vZGUgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlOw0KKyAgICAgICAgICAgICAgICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJvbCIpKSB7DQorICAgICAgICAgICAgICAgIGJJc09sID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYkN1ck9sID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYobV9iQmxvY2tDb250aW51ZSB8fCBiQ29udGVudE5vZGUgPT0gRkFMU0UpIHsNCisgICAgICAgICAgICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZURpc3BsYXkgIT0gRkRFX0NTU0RJU1BMQVlfQmxvY2sgJiYgZURpc3BsYXkgIT0gRkRFX0NTU0RJU1BMQVlfSW5saW5lICYmIGVEaXNwbGF5ICE9IEZERV9DU1NESVNQTEFZX0xpc3RJdGVtKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwU3R5bGUgPSBtX3RleHRQYXJzZXIuQ29tcHV0ZVN0eWxlKHBYTUxOb2RlLCBwUGFyZW50U3R5bGUpOw0KKyAgICAgICAgICAgICAgICBJbml0QnJlYWsoYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlIDogcFN0eWxlLCBlRGlzcGxheSwgc3pUZXh0LngsIHBYTUxOb2RlLCBwUGFyZW50U3R5bGUpOw0KKyAgICAgICAgICAgICAgICBpZiAoKGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0Jsb2NrIHx8IGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0xpc3RJdGVtKSAmJiAocFN0eWxlICE9IE5VTEwpDQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdzTmFtZS5Jc0VtcHR5KCkgfHwgKHdzTmFtZSAhPSBGWF9XU1RSQyhMImJvZHkiKSAmJiB3c05hbWUgIT0gRlhfV1NUUkMoTCJodG1sIikgJiYgd3NOYW1lICE9IEZYX1dTVFJDKEwib2wiKSAmJiB3c05hbWUgIT0gRlhfV1NUUkMoTCJ1bCIpKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZERV9DU1NSRUNUICpwUmVjdCA9IHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0TWFyZ2luV2lkdGgoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVjdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZMaW5lUG9zICs9IHBSZWN0LT50b3AuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmU3BhY2VCZWxvdyA9IHBSZWN0LT5ib3R0b20uR2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAod3NOYW1lID09IEZYX1dTVFJDKEwiYSIpKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpbmtDb250ZW50Ow0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBFbGVtZW50KTsNCisgICAgICAgICAgICAgICAgICAgIHBFbGVtZW50LT5HZXRTdHJpbmcoRlhfV1NUUkMoTCJocmVmIikuR2V0UHRyKCksIHdzTGlua0NvbnRlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0xpbmtDb250ZW50LklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5rRGF0YSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcilDWEZBX0xpbmtVc2VyRGF0YShtX3BBbGxvY2F0b3IsIHdzTGlua0NvbnRlbnQuR2V0QnVmZmVyKHdzTGlua0NvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c0xpbmtDb250ZW50LlJlbGVhc2VCdWZmZXIod3NMaW5rQ29udGVudC5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVRhYkNvdW50ID0gbV90ZXh0UGFyc2VyLkNvdW50VGFicyhiQ29udGVudE5vZGUgPyBwUGFyZW50U3R5bGUgOiBwU3R5bGUpOw0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTcGFjZVJ1biA9IG1fdGV4dFBhcnNlci5Jc1NwYWNlUnVuKGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSk7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICAgICAgaWYgKGJDb250ZW50Tm9kZSAmJiBpVGFiQ291bnQgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTFRleHQgKilwWE1MTm9kZSktPkdldFRleHQod3NUZXh0KTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJiciIpKSB7DQorICAgICAgICAgICAgICAgICAgICB3c1RleHQgPSBMJ1xuJzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJsaSIpKSB7DQorICAgICAgICAgICAgICAgICAgICBiQ3VyTGkgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJJc09sKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXh0LkZvcm1hdChGWF9MUENXU1RSKEwiJWQuICAiKSwgaUxpQ291bnQpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1RleHQgPSAweDAwQjcgKyBGWF9XU1RSQyhMIiAgIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJDb250ZW50Tm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlUYWJDb3VudCA+IDApDQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlUYWJDb3VudC0tID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RleHQgKz0gTCdcdCc7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV90ZXh0UGFyc2VyLkdldEVtYmJlZE9iaihtX3BUZXh0UHJvdmlkZXIsIHBYTUxOb2RlLCB3c1RleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgIGlmIChpTGVuZ3RoID4gMCAmJiBiQ29udGVudE5vZGUgJiYgIWJTcGFjZVJ1bikgew0KKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1RleHQod3NUZXh0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobV9wTG9hZGVyKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAod3NUZXh0LkdldExlbmd0aCgpID4gMCAmJiAobV9wTG9hZGVyLT5tX2R3RmxhZ3MgJiBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0UpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXh0LlRyaW1MZWZ0KDB4MjApOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9DU1NESVNQTEFZX0Jsb2NrID09IGVEaXNwbGF5KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgfD0gWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGREVfQ1NTRElTUExBWV9JbmxpbmUgPT0gZURpc3BsYXkgJiYgKG1fcExvYWRlci0+bV9kd0ZsYWdzICYgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA+IDAgJiYgKDB4MjAgPT0gd3NUZXh0LkdldEF0KHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod3NUZXh0LkdldExlbmd0aCgpID09IDApDQorICAgICAgICAgICAgICAgICAgICAgICAgOw0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgJj0gflhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAod3NUZXh0LkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlciA9PSBOVUxMIHx8IG1fcExvYWRlci0+bV9pQ2hhciA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBMaW5rRGF0YSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGlua0RhdGEtPkFkZFJlZigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YSAqcFVzZXJEYXRhID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKUNYRkFfVGV4dFVzZXJEYXRhKG1fcEFsbG9jYXRvciwgYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlIDogcFN0eWxlLCBwTGlua0RhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcEJyZWFrLT5TZXRVc2VyRGF0YShwVXNlckRhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEFwcGVuZENoYXIod3NUZXh0LCBmTGluZVBvcywgMCwgYlNhdmVQaWVjZXMpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtX3BMb2FkZXIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgJj0gflhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzRW5kKGJTYXZlUGllY2VzKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wTG9hZGVyICYmIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA+IC0xKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFhNTE5vZGUgPSBwWE1MTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUgPSBwUGFyZW50U3R5bGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCByZXQgPSBUUlVFOw0KKyAgICAgICAgZm9yIChJRkRFX1hNTE5vZGUgKnBDaGlsZE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcENoaWxkTm9kZTsgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgaWYgKGJDdXJPbCkgew0KKyAgICAgICAgICAgICAgICBpTGlDb3VudCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXQgPSBMb2FkUmljaFRleHQocENoaWxkTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgcENvbnRleHQgPyBwU3R5bGUgOiBwUGFyZW50U3R5bGUsIGJTYXZlUGllY2VzLCBwTGlua0RhdGEsIFRSVUUsIGJJc09sLCBpTGlDb3VudCk7DQorICAgICAgICAgICAgaWYocmV0ID09IEZBTFNFKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wTG9hZGVyKSB7DQorICAgICAgICAgICAgaWYgKEZERV9DU1NESVNQTEFZX0Jsb2NrID09IGVEaXNwbGF5KSB7DQorICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkN1ckxpKSB7DQorICAgICAgICAgICAgRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBlRGlzcGxheSA9IHBDb250ZXh0LT5HZXREaXNwbGF5KCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYobV9iQmxvY2tDb250aW51ZSkgew0KKyAgICAgICAgaWYgKHBDb250ZXh0ICE9IE5VTEwgJiYgIWJDb250ZW50Tm9kZSkgew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gKGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0Jsb2NrKSA/IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrIDogRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgICAgICAgICBFbmRCcmVhayhkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCisgICAgICAgICAgICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2spIHsNCisgICAgICAgICAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQmVsb3c7DQorICAgICAgICAgICAgICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICggd3NOYW1lID09IEZYX1dTVFJDKEwiYSIpKSB7DQorICAgICAgICAgICAgICAgIGlmIChwTGlua0RhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWZDb3VudCA9IHBMaW5rRGF0YS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgcExpbmtEYXRhID0gTlVMTDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7DQorICAgICAgICAgICAgICAgIGlmIChwU3R5bGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHBTdHlsZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUgPSBwUGFyZW50U3R5bGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFN0eWxlICE9IE5VTEwpIHsNCisgICAgICAgIHBTdHlsZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6QXBwZW5kQ2hhcihjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9GTE9BVCAmZkxpbmVQb3MsIEZYX0ZMT0FUIGZTcGFjZUFib3ZlLCBGWF9CT09MIGJTYXZlUGllY2VzKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwOw0KKyAgICBGWF9JTlQzMiBpQ2hhciA9IDA7DQorICAgIGlmIChtX3BMb2FkZXIpIHsNCisgICAgICAgIGlDaGFyID0gbV9wTG9hZGVyLT5tX2lDaGFyOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IGlDaGFyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Y2ggPSB3c1RleHQuR2V0QXQoaSk7DQorICAgICAgICBpZiAod2NoID09IDB4QTApIHsNCisgICAgICAgICAgICB3Y2ggPSAweDIwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChkd1N0YXR1cyA9IG1fcEJyZWFrLT5BcHBlbmRDaGFyKHdjaCkpID4gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICAgIEFwcGVuZFRleHRMaW5lKGR3U3RhdHVzLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KKyAgICAgICAgICAgIGlmIChJc0VuZChiU2F2ZVBpZWNlcykpIHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1faUNoYXIgPSBpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdTdGF0dXMgPT0gRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWsgJiYgbV9iUmljaFRleHQpIHsNCisgICAgICAgICAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQWJvdmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKG1fcExvYWRlcikgew0KKyAgICAgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpJc0VuZChGWF9CT09MIGJTYXZlUGllY2VzKQ0KK3sNCisgICAgaWYgKCFiU2F2ZVBpZWNlcykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gMCkgew0KKyAgICAgICAgcmV0dXJuIG1faUxpbmVzID49IG1fcExvYWRlci0+bV9pVG90YWxMaW5lczsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpQcm9jZXNzVGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPT0gMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0xQV1NUUiBwc3ogPSB3c1RleHQuR2V0QnVmZmVyKGlMZW4pOw0KKyAgICBGWF9JTlQzMiBpVHJpbUxlZnQgPSAwOw0KKyAgICBGWF9XQ0hBUiB3Y2ggPSAwLCB3UHJldiA9IDA7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgIHdjaCA9IHBzeltpXTsNCisgICAgICAgIGlmICh3Y2ggPCAweDIwKSB7DQorICAgICAgICAgICAgd2NoID0gMHgyMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh3Y2ggPT0gMHgyMCAmJiB3UHJldiA9PSAweDIwKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICB3UHJldiA9IHdjaDsNCisgICAgICAgIHBzeltpVHJpbUxlZnQrK10gPSB3Y2g7DQorICAgIH0NCisgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIoaUxlbik7DQorICAgIHdzVGV4dCA9IHdzVGV4dC5MZWZ0KGlUcmltTGVmdCk7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cywgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJTYXZlUGllY2VzKQ0KK3sNCisgICAgZHdTdGF0dXMgPSBtX3BCcmVhay0+RW5kQnJlYWsoZHdTdGF0dXMpOw0KKyAgICBpZiAoZHdTdGF0dXMgPiBGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICBBcHBlbmRUZXh0TGluZShkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzLCBUUlVFKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6RG9UYWJzdG9wcyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgQ1hGQV9QaWVjZUxpbmUgKnBQaWVjZUxpbmUpDQorew0KKyAgICBpZiAobV9wVGFic3RvcENvbnRleHQgPT0gTlVMTCB8fCBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiQ291bnQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwU3R5bGUgPT0gTlVMTCB8fCBwUGllY2VMaW5lID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgaWYgKGlQaWVjZXMgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9MUFRFWFRQSUVDRSBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaVBpZWNlcyAtIDEpOw0KKyAgICBGWF9JTlQzMiAmaVRhYnN0b3BzSW5kZXggPSBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiSW5kZXg7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fdGV4dFBhcnNlci5Db3VudFRhYnMocFN0eWxlKTsNCisgICAgaWYgKGlUYWJzdG9wc0luZGV4ID4gbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkNvdW50IC0gMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICBpVGFic3RvcHNJbmRleCsrOw0KKyAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzID0gVFJVRTsNCisgICAgICAgIEZYX0ZMT0FUIGZSaWdodCA9IDA7DQorICAgICAgICBpZiAoaVBpZWNlcyA+IDEpIHsNCisgICAgICAgICAgICBYRkFfTFBURVhUUElFQ0UgcCA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2VzIC0gMik7DQorICAgICAgICAgICAgZlJpZ2h0ID0gcC0+cnRQaWVjZS5yaWdodCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0gcFBpZWNlLT5ydFBpZWNlLndpZHRoICsgcFBpZWNlLT5ydFBpZWNlLmxlZnQgLSBmUmlnaHQ7DQorICAgIH0gZWxzZSBpZiAoaVRhYnN0b3BzSW5kZXggPiAtMSkgew0KKyAgICAgICAgRlhfRkxPQVQgZkxlZnQgPSAwOw0KKyAgICAgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0LT5tX2JUYWJzdG9wcykgew0KKyAgICAgICAgICAgIFhGQV9UQUJTVE9QUyAqcFRhYnN0b3BzID0gbV9wVGFic3RvcENvbnRleHQtPm1fdGFic3RvcHMuR2V0RGF0YVB0cihpVGFic3RvcHNJbmRleCk7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdBbGdpbiA9IHBUYWJzdG9wcy0+ZHdBbGlnbjsNCisgICAgICAgICAgICBpZiAoZHdBbGdpbiA9PSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoRlhfTFBDV1NUUilMImNlbnRlciIsIDYpKSB7DQorICAgICAgICAgICAgICAgIGZMZWZ0ID0gcFBpZWNlLT5ydFBpZWNlLndpZHRoIC8gMi4wZjsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGR3QWxnaW4gPT0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKEZYX0xQQ1dTVFIpTCJyaWdodCIsIDUpDQorICAgICAgICAgICAgICAgICAgICAgICB8fCBkd0FsZ2luID09IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKChGWF9MUENXU1RSKUwiYmVmb3JlIiwgNikpIHsNCisgICAgICAgICAgICAgICAgZkxlZnQgPSBwUGllY2UtPnJ0UGllY2Uud2lkdGg7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChkd0FsZ2luID09IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKChGWF9MUENXU1RSKUwiZGVjaW1hbCIsIDcpKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDaGFycyA9IHBQaWVjZS0+aUNoYXJzOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNoYXJzOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUGllY2UtPnBzelRleHRbaV0gPT0gTCcuJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZkxlZnQgKz0gcFBpZWNlLT5wV2lkdGhzW2ldIC8gMjAwMDAuMGY7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZkxlZnQgPSBGWF9NSU4oZkxlZnQsIG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZUYWJXaWR0aCk7DQorICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzID0gRkFMU0U7DQorICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0IC09IG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZMZWZ0Ow0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpBcHBlbmRUZXh0TGluZShGWF9EV09SRCBkd1N0YXR1cywgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJTYXZlUGllY2VzLCBGWF9CT09MIGJFbmRCcmVhaykNCit7DQorICAgIEZYX0lOVDMyIGlQaWVjZXMgPSBtX3BCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KKyAgICBpZiAoaVBpZWNlcyA8IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSA9IE5VTEw7DQorICAgIGlmIChiU2F2ZVBpZWNlcykgew0KKyAgICAgICAgQ1hGQV9QaWVjZUxpbmUgKnBQaWVjZUxpbmUgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpQ1hGQV9QaWVjZUxpbmU7DQorICAgICAgICBtX3BpZWNlTGluZXMuQWRkKHBQaWVjZUxpbmUpOw0KKyAgICAgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlc2V0KCk7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmTGluZVN0ZXAgPSAwLCBmQmFzZUxpbmUgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaVBpZWNlczsgaSsrKSB7DQorICAgICAgICAgICAgY29uc3QgQ0ZYX1JURlBpZWNlICpwUGllY2UgPSBtX3BCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YSAqcFVzZXJEYXRhID0gKENYRkFfVGV4dFVzZXJEYXRhKilwUGllY2UtPm1fcFVzZXJEYXRhOw0KKyAgICAgICAgICAgIGlmIChwVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwU3R5bGUgPSBwVXNlckRhdGEtPm1fcFN0eWxlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9GTE9BVCBmVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgWEZBX0xQVEVYVFBJRUNFIHBUUCA9IChYRkFfTFBURVhUUElFQ0UpbV9wQWxsb2NhdG9yLT5BbGxvYyhzaXplb2YoWEZBX1RFWFRQSUVDRSkpOw0KKyAgICAgICAgICAgIHBUUC0+cHN6VGV4dCA9IChGWF9MUFdTVFIpbV9wQWxsb2NhdG9yLT5BbGxvYyhwUGllY2UtPm1faUNoYXJzICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICAgICAgcFRQLT5wV2lkdGhzID0gKEZYX0lOVDMyKiltX3BBbGxvY2F0b3ItPkFsbG9jKHBQaWVjZS0+bV9pQ2hhcnMgKiBzaXplb2YoRlhfSU5UMzIpKTsNCisgICAgICAgICAgICBwVFAtPmlDaGFycyA9IHBQaWVjZS0+bV9pQ2hhcnM7DQorICAgICAgICAgICAgcFBpZWNlLT5HZXRTdHJpbmcocFRQLT5wc3pUZXh0KTsNCisgICAgICAgICAgICBwUGllY2UtPkdldFdpZHRocyhwVFAtPnBXaWR0aHMpOw0KKyAgICAgICAgICAgIHBUUC0+aUJpZGlMZXZlbCA9IHBQaWVjZS0+bV9pQmlkaUxldmVsOw0KKyAgICAgICAgICAgIHBUUC0+aUhvclNjYWxlCT0gcFBpZWNlLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgICAgICAgcFRQLT5pVmVyU2NhbGUJPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGU7DQorICAgICAgICAgICAgbV90ZXh0UGFyc2VyLkdldFVuZGVybGluZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgcFRQLT5pVW5kZXJsaW5lLCBwVFAtPmlQZXJpb2QpOw0KKyAgICAgICAgICAgIG1fdGV4dFBhcnNlci5HZXRMaW5ldGhyb3VnaChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgcFRQLT5pTGluZVRocm91Z2gpOw0KKyAgICAgICAgICAgIHBUUC0+ZHdDb2xvcgk9IG1fdGV4dFBhcnNlci5HZXRDb2xvcihtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgICAgICAgICAgcFRQLT5wRm9udAkJPSBtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgICAgICAgICAgcFRQLT5mRm9udFNpemUJPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KKyAgICAgICAgICAgIHBUUC0+cnRQaWVjZS5sZWZ0ID0gcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KKyAgICAgICAgICAgIHBUUC0+cnRQaWVjZS53aWR0aCA9IHBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsNCisgICAgICAgICAgICBwVFAtPnJ0UGllY2UuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pRm9udFNpemUgKiBmVmVyU2NhbGUgLyAyMC4wZjsNCisgICAgICAgICAgICBGWF9GTE9BVCBmQmFzZUxpbmVUZW1wID0gbV90ZXh0UGFyc2VyLkdldEJhc2VsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgICAgICAgICBwVFAtPnJ0UGllY2UudG9wID0gZkJhc2VMaW5lVGVtcDsNCisgICAgICAgICAgICBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuQWRkKHBUUCk7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3RleHRQYXJzZXIuR2V0TGluZUhlaWdodChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgbV9pTGluZXMgPT0gMCwgZlZlclNjYWxlKTsNCisgICAgICAgICAgICBpZiAoZkJhc2VMaW5lVGVtcCA+IDApIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHRUbXAgPSBmQmFzZUxpbmVUZW1wICsgcFRQLT5ydFBpZWNlLmhlaWdodDsNCisgICAgICAgICAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApIHsNCisgICAgICAgICAgICAgICAgICAgIGZMaW5lSGVpZ2h0ID0gZkxpbmVIZWlnaHRUbXA7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBmQmFzZUxpbmVUZW1wID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZkJhc2VMaW5lIDwgLWZCYXNlTGluZVRlbXApIHsNCisgICAgICAgICAgICAgICAgZkJhc2VMaW5lID0gLWZCYXNlTGluZVRlbXA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZMaW5lU3RlcCA9IEZYX01BWChmTGluZVN0ZXAsIGZMaW5lSGVpZ2h0KTsNCisgICAgICAgICAgICBpZiAoIHBVc2VyRGF0YSAhPSBOVUxMICYmIHBVc2VyRGF0YS0+bV9wTGlua0RhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwVXNlckRhdGEtPm1fcExpbmtEYXRhLT5BZGRSZWYoKTsNCisgICAgICAgICAgICAgICAgcFRQLT5wTGlua0RhdGEgPSBwVXNlckRhdGEtPm1fcExpbmtEYXRhOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBUUC0+cExpbmtEYXRhID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRG9UYWJzdG9wcyhwU3R5bGUsIHBQaWVjZUxpbmUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgew0KKyAgICAgICAgICAgIFhGQV9MUFRFWFRQSUVDRSBwVFAgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaSk7DQorICAgICAgICAgICAgRlhfRkxPQVQgJmZUb3AgPSBwVFAtPnJ0UGllY2UudG9wOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZVRlbXAgPSBmVG9wOw0KKyAgICAgICAgICAgIGZUb3AgPSBmTGluZVBvcyArIGZMaW5lU3RlcCAtIHBUUC0+cnRQaWVjZS5oZWlnaHQgLSBmQmFzZUxpbmVUZW1wOw0KKyAgICAgICAgICAgIGZUb3AgPSBGWF9NQVgoMCwgZlRvcCk7DQorICAgICAgICB9DQorICAgICAgICBmTGluZVBvcyArPSBmTGluZVN0ZXAgKyBmQmFzZUxpbmU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9GTE9BVCBmTGluZVN0ZXAgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDA7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVBpZWNlczsgaSsrKSB7DQorICAgICAgICAgICAgY29uc3QgQ0ZYX1JURlBpZWNlICpwUGllY2UgPSBtX3BCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YSAqcFVzZXJEYXRhID0gKENYRkFfVGV4dFVzZXJEYXRhKilwUGllY2UtPm1fcFVzZXJEYXRhOw0KKyAgICAgICAgICAgIGlmIChwVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwU3R5bGUgPSBwVXNlckRhdGEtPm1fcFN0eWxlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9GTE9BVCBmVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkJhc2VMaW5lID0gbV90ZXh0UGFyc2VyLkdldEJhc2VsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fdGV4dFBhcnNlci5HZXRMaW5lSGVpZ2h0KG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBtX2lMaW5lcyA9PSAwLCBmVmVyU2NhbGUpOw0KKyAgICAgICAgICAgIGlmIChmQmFzZUxpbmUgPiAwKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0VG1wID0gZkJhc2VMaW5lICsgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pRm9udFNpemUgKiBmVmVyU2NhbGUgLyAyMC4wZjsNCisgICAgICAgICAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApIHsNCisgICAgICAgICAgICAgICAgICAgIGZMaW5lSGVpZ2h0ID0gZkxpbmVIZWlnaHRUbXA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZkxpbmVTdGVwID0gRlhfTUFYKGZMaW5lU3RlcCwgZkxpbmVIZWlnaHQpOw0KKyAgICAgICAgICAgIGZMaW5lV2lkdGggKz0gcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwOw0KKyAgICAgICAgbV9mTWF4V2lkdGggPSBGWF9NQVgobV9mTWF4V2lkdGgsIGZMaW5lV2lkdGgpOw0KKyAgICAgICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0KSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IGZMaW5lUG9zIC0gbV9wTG9hZGVyLT5tX2ZMYXN0UG9zOw0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9mTGFzdFBvcyA9IGZMaW5lUG9zOw0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5BZGQoZkhlaWdodCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9wQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgaWYgKGR3U3RhdHVzID09IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrKSB7DQorICAgICAgICBtX3BCcmVhay0+UmVzZXQoKTsNCisgICAgICAgIGlmIChwU3R5bGUgPT0gTlVMTCAmJiBiRW5kQnJlYWspIHsNCisgICAgICAgICAgICBDWEZBX1BhcmEgcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgICAgICAgICAgICBpZiAocGFyYS5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3RhcnRQb3MgPSBwYXJhLkdldE1hcmdpbkxlZnQoKTsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkluZGVudCA9IHBhcmEuR2V0VGV4dEluZGVudCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZkluZGVudCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7DQorICAgICAgICAgICAgICAgIGlmIChmU3BhY2VCZWxvdyA8IDAuMWYpIHsNCisgICAgICAgICAgICAgICAgICAgIGZTcGFjZUJlbG93ID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BCcmVhay0+U2V0TGluZVBvcyhmU3RhcnRQb3MpOw0KKyAgICAgICAgICAgICAgICBmTGluZVBvcyArPSBmU3BhY2VCZWxvdzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GTE9BVCBmU3RhcnQgPSAwOw0KKyAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QgKnBSZWN0ID0gcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRNYXJnaW5XaWR0aCgpOw0KKyAgICAgICAgaWYgKHBSZWN0KSB7DQorICAgICAgICAgICAgZlN0YXJ0ID0gcFJlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZUZXh0SW5kZW50ID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKS0+R2V0VGV4dEluZGVudCgpLkdldFZhbHVlKCk7DQorICAgICAgICBpZiAoZlRleHRJbmRlbnQgPCAwKSB7DQorICAgICAgICAgICAgZlN0YXJ0IC09IGZUZXh0SW5kZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQnJlYWstPlNldExpbmVQb3MoZlN0YXJ0KTsNCisgICAgfQ0KKyAgICBtX2lMaW5lcysrOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6UmVuZGVyU3RyaW5nKElGREVfUmVuZGVyRGV2aWNlICpwRGV2aWNlLCBJRkRFX1NvbGlkQnJ1c2ggKnBCcnVzaCwgQ1hGQV9QaWVjZUxpbmUgKnBQaWVjZUxpbmUsIEZYX0lOVDMyIGlQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UpDQorew0KKyAgICBYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2UpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOw0KKyAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgcEJydXNoLT5TZXRDb2xvcihwUGllY2UtPmR3Q29sb3IpOw0KKyAgICAgICAgcERldmljZS0+RHJhd1N0cmluZyhwQnJ1c2gsIHBQaWVjZS0+cEZvbnQsIHBDaGFyUG9zLCBpQ291bnQsIHBQaWVjZS0+ZkZvbnRTaXplLCAmdG1Eb2MyRGV2aWNlKTsNCisgICAgfQ0KKyAgICBwUGllY2VMaW5lLT5tX2NoYXJDb3VudHMuQWRkKGlDb3VudCk7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpSZW5kZXJQYXRoKElGREVfUmVuZGVyRGV2aWNlICpwRGV2aWNlLCBJRkRFX1BlbiAqcFBlbiwgQ1hGQV9QaWVjZUxpbmUgKnBQaWVjZUxpbmUsIEZYX0lOVDMyIGlQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UpDQorew0KKyAgICBYRkFfVEVYVFBJRUNFICpwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaVBpZWNlKTsNCisgICAgRlhfQk9PTCBiTm9VbmRlcmxpbmUgPSBwUGllY2UtPmlVbmRlcmxpbmUgPCAxIHx8IHBQaWVjZS0+aVVuZGVybGluZSA+IDI7DQorICAgIEZYX0JPT0wgYk5vTGluZVRocm91Z2ggPSBwUGllY2UtPmlMaW5lVGhyb3VnaCA8IDEgfHwgcFBpZWNlLT5pTGluZVRocm91Z2ggPiAyOw0KKyAgICBpZiAoYk5vVW5kZXJsaW5lICYmIGJOb0xpbmVUaHJvdWdoKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcFBlbi0+U2V0Q29sb3IocFBpZWNlLT5kd0NvbG9yKTsNCisgICAgSUZERV9QYXRoICpwUGF0aCA9IElGREVfUGF0aDo6Q3JlYXRlKCk7DQorICAgIEZYX0lOVDMyIGlDaGFycyA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQorICAgIGlmIChpQ2hhcnMgPiAwKSB7DQorICAgICAgICBDRlhfUG9pbnRGIHB0MSwgcHQyOw0KKyAgICAgICAgRlhfRkxPQVQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpblkgKyAxLjA1ZjsNCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgaWYgKHBQaWVjZS0+aVBlcmlvZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkKSB7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHBQaWVjZS0+aVVuZGVybGluZTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IDA7IGogPCBpQ2hhcnM7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgcHQxLnggPSBwQ2hhclBvc1tqXS5tX09yaWdpblg7DQorICAgICAgICAgICAgICAgICAgICBwdDIueCA9IHB0MS54ICsgcENoYXJQb3Nbal0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOw0KKyAgICAgICAgICAgICAgICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOw0KKyAgICAgICAgICAgICAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwdDEueCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWDsNCisgICAgICAgICAgICBwdDIueCA9IHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fT3JpZ2luWCArIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsNCisgICAgICAgICAgICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOw0KKyAgICAgICAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgICAgICAgICAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpblkgLSBwUGllY2UtPnJ0UGllY2UuaGVpZ2h0ICogMC4yNWY7DQorICAgICAgICBwdDEueCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWDsNCisgICAgICAgIHB0Mi54ID0gcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW5YICsgcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWVjZS0+aUxpbmVUaHJvdWdoOyBpKyspIHsNCisgICAgICAgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQorICAgICAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgICAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoYk5vTGluZVRocm91Z2ggJiYgKGJOb1VuZGVybGluZSB8fCBwUGllY2UtPmlQZXJpb2QgIT0gWEZBX0FUVFJJQlVURUVOVU1fQWxsKSkgew0KKyAgICAgICAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpQ2hhcnNUbXAgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaVBpZWNlUHJldiA9IGlQaWVjZSwgaVBpZWNlTmV4dCA9IGlQaWVjZTsNCisgICAgICAgIHdoaWxlIChpUGllY2VQcmV2ID4gMCkgew0KKyAgICAgICAgICAgIGlQaWVjZVByZXYtLTsNCisgICAgICAgICAgICBpQ2hhcnNUbXAgPSBwUGllY2VMaW5lLT5tX2NoYXJDb3VudHMuR2V0QXQoaVBpZWNlUHJldik7DQorICAgICAgICAgICAgaWYgKGlDaGFyc1RtcCA+IDApIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlDaGFyc1RtcCA9PSAwKSB7DQorICAgICAgICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCisgICAgICAgIH0NCisgICAgICAgIGlDaGFyc1RtcCA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgICAgIHdoaWxlIChpUGllY2VOZXh0IDwgaVBpZWNlcyAtIDEpIHsNCisgICAgICAgICAgICBpUGllY2VOZXh0Kys7DQorICAgICAgICAgICAgaUNoYXJzVG1wID0gcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzLkdldEF0KGlQaWVjZU5leHQpOw0KKyAgICAgICAgICAgIGlmIChpQ2hhcnNUbXAgPiAwKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQ2hhcnNUbXAgPT0gMCkgew0KKyAgICAgICAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmT3JnWCA9IDAuMGYsIGZFbmRYID0gMC4wZjsNCisgICAgICAgIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2VQcmV2KTsNCisgICAgICAgIGlDaGFycyA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQorICAgICAgICBpZiAoaUNoYXJzIDwgMSkgew0KKyAgICAgICAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgICAgICB9DQorICAgICAgICBmT3JnWCA9IHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fT3JpZ2luWCArIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgICAgICAgIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2VOZXh0KTsNCisgICAgICAgIGlDaGFycyA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQorICAgICAgICBpZiAoaUNoYXJzIDwgMSkgew0KKyAgICAgICAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgICAgICB9DQorICAgICAgICBmRW5kWCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWDsNCisgICAgICAgIENGWF9Qb2ludEYgcHQxLCBwdDI7DQorICAgICAgICBwdDEueCA9IGZPcmdYLCBwdDIueCA9IGZFbmRYOw0KKyAgICAgICAgRlhfRkxPQVQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpblkgKyAxLjA1ZjsNCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWVjZS0+aVVuZGVybGluZTsgaSsrKSB7DQorICAgICAgICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOw0KKyAgICAgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICAgICAgICBmRW5kWSArPSAyLjBmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpblkgLSBwUGllY2UtPnJ0UGllY2UuaGVpZ2h0ICogMC4yNWY7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpZWNlLT5pTGluZVRocm91Z2g7IGkrKykgew0KKyAgICAgICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsNCisgICAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgICAgICAgICAgZkVuZFkgKz0gMi4wZjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwRGV2aWNlLT5EcmF3UGF0aChwUGVuLCAxLCBwUGF0aCwgJnRtRG9jMkRldmljZSk7DQorWEZBX1JlbmRlclBhdGhSZXQ6DQorICAgIHBQYXRoLT5SZWxlYXNlKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfVGV4dExheW91dDo6R2V0RGlzcGxheVBvcyhYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSApDQorew0KKyAgICBpZiAocFBpZWNlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIEZYX1JURlRFWFRPQkogdHI7DQorICAgIGlmICghVG9SdW4ocFBpZWNlLCB0cikpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BCcmVhay0+R2V0RGlzcGxheVBvcygmdHIsIHBDaGFyUG9zLCBiQ2hhckNvZGUpOw0KK30NCitGWF9CT09MCUNYRkFfVGV4dExheW91dDo6VG9SdW4oWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UsIEZYX1JURlRFWFRPQkogJnRyKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBQaWVjZS0+aUNoYXJzOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB0ci5wU3RyCQk9IHBQaWVjZS0+cHN6VGV4dDsNCisgICAgdHIucEZvbnQJPSBwUGllY2UtPnBGb250Ow0KKyAgICB0ci5wUmVjdAk9ICZwUGllY2UtPnJ0UGllY2U7DQorICAgIHRyLnBXaWR0aHMJPSBwUGllY2UtPnBXaWR0aHM7DQorICAgIHRyLmlMZW5ndGgJPSBpTGVuZ3RoOw0KKyAgICB0ci5mRm9udFNpemUJPSBwUGllY2UtPmZGb250U2l6ZTsNCisgICAgdHIuaUJpZGlMZXZlbAk9IHBQaWVjZS0+aUJpZGlMZXZlbDsNCisgICAgdHIuaUNoYXJSb3RhdGlvbiA9IDA7DQorICAgIHRyLndMaW5lQnJlYWtDaGFyID0gTCdcbic7DQorICAgIHRyLmlWZXJ0aWNhbFNjYWxlID0gcFBpZWNlLT5pVmVyU2NhbGU7DQorICAgIHRyLmR3TGF5b3V0U3R5bGVzID0gRlhfUlRGTEFZT1VUU1RZTEVfRXhwYW5kVGFiOw0KKyAgICB0ci5pSG9yaXpvbnRhbFNjYWxlID0gcFBpZWNlLT5pSG9yU2NhbGU7DQorICAgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2IzNzcyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaApAQCAtMCwwICsxLDM5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX1RFWFRMQVlPVVRfSA0KKyNkZWZpbmUgX0ZYRkFfVEVYVExBWU9VVF9IDQorI2RlZmluZSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0UJCQkweDAwMQ0KK2NsYXNzIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDsNCitjbGFzcyBJWEZBX1RleHRQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHZpcnR1YWwgQ1hGQV9Ob2RlKgkJCUdldFRleHROb2RlKEZYX0JPT0wgJmJSaWNoVGV4dCkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfUGFyYQkJCUdldFBhcmFOb2RlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfRm9udAkJCUdldEZvbnROb2RlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpID0gMDsNCisgICAgdmlydHVhbAlDWEZBX0ZGRG9jKgkJCUdldERvY05vZGUoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlHZXRFbWJiZWRPYmooRlhfQk9PTCBiVVJJLCBGWF9CT09MIGJSYXcsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSA9IDA7DQorfTsNCitjbGFzcyBDWEZBX0NTU1RhZ1Byb3ZpZGVyIDogcHVibGljIElGREVfQ1NTVGFnUHJvdmlkZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9DU1NUYWdQcm92aWRlciAoKQ0KKyAgICAgICAgOiBtX2JUYWdBdmlsaWFibGUoRkFMU0UpLA0KKyAgICAgICAgICBtX2JDb250ZW50KEZBTFNFKQ0KKyAgICB7fQ0KKyAgICB2aXJ0dWFsIH5DWEZBX0NTU1RhZ1Byb3ZpZGVyKCk7DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmdDCQlHZXRUYWdOYW1lKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fd3NUYWdOYW1lOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQlHZXRGaXJzdEF0dHJpYnV0ZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX0F0dHJpYnV0ZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlHZXROZXh0QXR0cmlidXRlKEZYX1BPU0lUSU9OICZwb3MsIENGWF9XaWRlU3RyaW5nQyAmd3NBdHRyLCBDRlhfV2lkZVN0cmluZ0MgJndzVmFsdWUpOw0KKyAgICB2b2lkCQkJCQkJU2V0VGFnTmFtZU9iaihjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NOYW1lKQ0KKyAgICB7DQorICAgICAgICBtX3dzVGFnTmFtZSA9IHdzTmFtZTsNCisgICAgfQ0KKyAgICB2b2lkCQkJCQkJU2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHIsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKTsNCisgICAgRlhfQk9PTAkJCQkJbV9iVGFnQXZpbGlhYmxlOw0KKyAgICBGWF9CT09MCQkJCQltX2JDb250ZW50Ow0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzVGFnTmFtZTsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9BdHRyaWJ1dGVzOw0KK307DQorY2xhc3MgQ1hGQV9UZXh0UGFyc2VDb250ZXh0IDogcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1RleHRQYXJzZUNvbnRleHQoKSA6IG1fcHBNYXRjaGVkRGVjbHMoTlVMTCksIG1fZHdNYXRjaGVkRGVjbHMoMCksIG1fZURpc3BsYXkoRkRFX0NTU0RJU1BMQVlfTm9uZSksIG1fcFBhcmVudFN0eWxlKE5VTEwpIHt9DQorICAgIH5DWEZBX1RleHRQYXJzZUNvbnRleHQoKQ0KKyAgICB7DQorICAgICAgICBpZiAobV9wcE1hdGNoZWREZWNscyAhPSBOVUxMKSB7DQorICAgICAgICAgICAgRkRFX0ZyZWUobV9wcE1hdGNoZWREZWNscyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgdm9pZAkJCQkJCVNldERpc3BsYXkoRkRFX0NTU0RJU1BMQVkgZURpc3BsYXkpDQorICAgIHsNCisgICAgICAgIG1fZURpc3BsYXkgPSBlRGlzcGxheTsNCisgICAgfQ0KKyAgICBGREVfQ1NTRElTUExBWQkJCQlHZXREaXNwbGF5KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZURpc3BsYXk7DQorICAgIH0NCisgICAgdm9pZAkJCQkJCVNldERlY2xzKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcERlY2xBcnJheSwgRlhfSU5UMzIgaURlY2xDb3VudCk7DQorICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKglHZXREZWNscygpDQorICAgIHsNCisgICAgICAgIHJldHVybiAoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqKW1fcHBNYXRjaGVkRGVjbHM7DQorICAgIH0NCisgICAgRlhfRFdPUkQJCQkJCUNvdW50RGVjbHMoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd01hdGNoZWREZWNsczsNCisgICAgfQ0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKgkJbV9wUGFyZW50U3R5bGU7DQorcHJvdGVjdGVkOg0KKyAgICBJRkRFX0NTU0RlY2xhcmF0aW9uCQkqKm1fcHBNYXRjaGVkRGVjbHM7DQorICAgIEZYX0RXT1JECQkJCW1fZHdNYXRjaGVkRGVjbHMgOiAyODsNCisgICAgRkRFX0NTU0RJU1BMQVkJCQltX2VEaXNwbGF5CQkgOiA0Ow0KK307DQorY2xhc3MgQ1hGQV9UZXh0UGFyc2VyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1RleHRQYXJzZXIoKSA6IG1fcEFsbG9jYXRvcihOVUxMKSwgbV9wU2VsZWN0b3IoTlVMTCksIG1fcFVBU2hlZXQoTlVMTCkge30NCisgICAgdmlydHVhbCB+Q1hGQV9UZXh0UGFyc2VyKCk7DQorICAgIHZvaWQJCQkJCQlSZXNldCgpOw0KKyAgICB2b2lkCQkJCQkJRG9QYXJzZShJRkRFX1hNTE5vZGUgKnBYTUxDb250YWluZXIsIElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKTsNCisgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKgkJQ3JlYXRlUm9vdFN0eWxlKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKTsNCisgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKgkJQ29tcHV0ZVN0eWxlKElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlKTsNCisgICAgRlhfQk9PTAkJCQkJCUlzUGFyc2VkKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEFsbG9jYXRvciAhPSBOVUxMOw0KKyAgICB9DQorDQorICAgIEZYX0lOVDMyCQkJCQlHZXRWQWxnaW4oSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpIGNvbnN0Ow0KKyAgICBGWF9GTE9BVAkJCQkJR2V0VGFiSW50ZXJ2YWwoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMgkJCQkJQ291bnRUYWJzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdDsNCisgICAgRlhfQk9PTAkJCQkJCUlzU3BhY2VSdW4oSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KKyAgICBGWF9CT09MCQkJCQkJR2V0VGFic3RvcHMoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dAkqcFRhYnN0b3BDb250ZXh0KTsNCisgICAgSUZYX0ZvbnQqCQkJCQlHZXRGb250KElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQorICAgIEZYX0ZMT0FUCQkJCQlHZXRGb250U2l6ZShJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMgkJCQkJR2V0SG9yU2NhbGUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCQkJCUdldFZlclNjYWxlKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQorICAgIHZvaWQJCQkJCQlHZXRVbmRlcmxpbmUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBGWF9JTlQzMiAmaVVuZGVybGluZSwgRlhfSU5UMzIgJmlQZXJpb2QpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCQkJR2V0TGluZXRocm91Z2goSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBGWF9JTlQzMiAmaUxpbmV0aHJvdWdoKSBjb25zdDsNCisgICAgRlhfQVJHQgkJCQkJCUdldENvbG9yKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQorICAgIEZYX0ZMT0FUCQkJCQlHZXRCYXNlbGluZShJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KKyAgICBGWF9GTE9BVAkJCQkJR2V0TGluZUhlaWdodChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIEZYX0JPT0wgYkZpcnN0LCBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0Ow0KKyAgICBGWF9CT09MCQkJCQkJR2V0RW1iYmVkT2JqKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSk7DQorICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCoJCUdldFBhcnNlQ29udGV4dEZyb21NYXAoSUZERV9YTUxOb2RlICpwWE1MTm9kZSk7DQorcHJpdmF0ZToNCisgICAgdm9pZAkJCQkJCUluaXRDU1NEYXRhKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKTsNCisgICAgdm9pZAkJCQkJCVBhcnNlUmljaFRleHQoSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpOw0KKyAgICB2b2lkCQkJCQkJUGFyc2VUYWdJbmZvKElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIENYRkFfQ1NTVGFnUHJvdmlkZXIgJnRhZ1Byb3ZpZGVyKTsNCisgICAgSUZERV9DU1NTdHlsZVNoZWV0KgkJCUxvYWREZWZhdWx0U2hlZXRTdHlsZSgpOw0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqCQlDcmVhdGVTdHlsZShJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSk7DQorICAgIElGWF9NRU1BbGxvY2F0b3IJCSptX3BBbGxvY2F0b3I7DQorICAgIElGREVfQ1NTU3R5bGVTZWxlY3RvcgkqbV9wU2VsZWN0b3I7DQorICAgIElGREVfQ1NTU3R5bGVTaGVldAkJKm1fcFVBU2hlZXQ7DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxJRkRFX1hNTE5vZGUqLCBDWEZBX1RleHRQYXJzZUNvbnRleHQqPgltX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dDsNCit9Ow0KK2NsYXNzIENYRkFfTG9hZGVyQ29udGV4dCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Mb2FkZXJDb250ZXh0KCkgOiBtX2JTYXZlTGluZUhlaWdodChGQUxTRSkNCisgICAgICAgICwgbV9mV2lkdGgoMCkNCisgICAgICAgICwgbV9mSGVpZ2h0KDApDQorICAgICAgICAsIG1fZkxhc3RQb3MoMCkNCisgICAgICAgICwgbV9mU3RhcnRMaW5lT2Zmc2V0KDApDQorICAgICAgICAsIG1faUNoYXIoMCkNCisgICAgICAgICwgbV9pVG90YWxMaW5lcygtMSkNCisgICAgICAgICwgbV9wWE1MTm9kZShOVUxMKQ0KKyAgICAgICAgLCBtX3BOb2RlKE5VTEwpDQorICAgICAgICAsIG1fcFBhcmVudFN0eWxlKE5VTEwpDQorICAgICAgICAsIG1fZHdGbGFncygwKQ0KKyAgICB7fQ0KKyAgICBGWF9CT09MCQkJCW1fYlNhdmVMaW5lSGVpZ2h0Ow0KKyAgICBGWF9GTE9BVAkJCW1fZldpZHRoOw0KKyAgICBGWF9GTE9BVAkJCW1fZkhlaWdodDsNCisgICAgRlhfRkxPQVQJCQltX2ZMYXN0UG9zOw0KKyAgICBGWF9GTE9BVAkJCW1fZlN0YXJ0TGluZU9mZnNldDsNCisgICAgRlhfSU5UMzIJCQltX2lDaGFyOw0KKyAgICBGWF9JTlQzMgkJCW1faUxpbmVzOw0KKyAgICBGWF9JTlQzMgkJCW1faVRvdGFsTGluZXM7DQorICAgIElGREVfWE1MTm9kZQkJKm1fcFhNTE5vZGU7DQorICAgIENYRkFfTm9kZQkJCSptX3BOb2RlOw0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUJCSptX3BQYXJlbnRTdHlsZTsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+IG1fbGluZUhlaWdodHM7DQorICAgIEZYX0RXT1JECQkJbV9kd0ZsYWdzOw0KKyAgICBDRlhfRmxvYXRBcnJheQkJbV9CbG9ja3NIZWlnaHQ7DQorfTsNCitjbGFzcyBDWEZBX0xpbmtVc2VyRGF0YSA6IHB1YmxpYyBJRlhfVW5rbm93biwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0xpbmtVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yICpwQWxsb2NhdG9yLCBGWF9MUFdTVFIgcHN6VGV4dCkNCisgICAgICAgIDogbV9wQWxsb2NhdG9yKHBBbGxvY2F0b3IpDQorICAgICAgICAsIG1fZHdSZWZDb3VudCgxKQ0KKyAgICB7DQorICAgICAgICBtX3BzelVSTENvbnRlbnQgPSBwc3pUZXh0Ow0KKyAgICB9DQorICAgIH5DWEZBX0xpbmtVc2VyRGF0YSgpIHsgfQ0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gLS1tX2R3UmVmQ291bnQ7DQorICAgICAgICBpZiAoZHdSZWZDb3VudCA8PSAwKSB7DQorICAgICAgICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9MaW5rVXNlckRhdGEsIG1fcEFsbG9jYXRvciwgdGhpcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZHdSZWZDb3VudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUFkZFJlZigpDQorICAgIHsNCisgICAgICAgIHJldHVybiArK21fZHdSZWZDb3VudDsNCisgICAgfQ0KK3B1YmxpYzoNCisgICAgRlhfTFBDV1NUUiBHZXRMaW5rVVJMKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcHN6VVJMQ29udGVudDsNCisgICAgfTsNCitwcm90ZWN0ZWQ6DQorICAgIElGWF9NRU1BbGxvY2F0b3IJCSptX3BBbGxvY2F0b3I7DQorICAgIEZYX0RXT1JECQkJCW1fZHdSZWZDb3VudDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3BzelVSTENvbnRlbnQ7DQorfTsNCitjbGFzcyBDWEZBX1RleHRVc2VyRGF0YSA6IHB1YmxpYyBJRlhfVW5rbm93biwgcHVibGljIENGWF9UYXJnZXQNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1RleHRVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yICpwQWxsb2NhdG9yLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkNCisgICAgICAgIDogbV9wU3R5bGUocFN0eWxlKQ0KKyAgICAgICAgLCBtX3BBbGxvY2F0b3IocEFsbG9jYXRvcikNCisgICAgICAgICwgbV9kd1JlZkNvdW50KDApDQorICAgICAgICAsIG1fcExpbmtEYXRhKE5VTEwpDQorICAgIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX3BBbGxvY2F0b3IgIT0gTlVMTCk7DQorICAgICAgICBpZiAobV9wU3R5bGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcFN0eWxlLT5BZGRSZWYoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX1RleHRVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yICpwQWxsb2NhdG9yLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgQ1hGQV9MaW5rVXNlckRhdGEqIHBMaW5rRGF0YSkNCisgICAgICAgIDogbV9wU3R5bGUocFN0eWxlKQ0KKyAgICAgICAgLCBtX3BBbGxvY2F0b3IocEFsbG9jYXRvcikNCisgICAgICAgICwgbV9kd1JlZkNvdW50KDApDQorICAgICAgICAsIG1fcExpbmtEYXRhKHBMaW5rRGF0YSkNCisgICAgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcEFsbG9jYXRvciAhPSBOVUxMKTsNCisgICAgICAgIGlmIChtX3BTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wU3R5bGUtPkFkZFJlZigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIH5DWEZBX1RleHRVc2VyRGF0YSgpDQorICAgIHsNCisgICAgICAgIGlmIChtX3BTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wU3R5bGUtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BMaW5rRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wTGlua0RhdGEtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECVJlbGVhc2UoKQ0KKyAgICB7DQorICAgICAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gLS1tX2R3UmVmQ291bnQ7DQorICAgICAgICBpZiAoZHdSZWZDb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9UZXh0VXNlckRhdGEsIG1fcEFsbG9jYXRvciwgdGhpcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZHdSZWZDb3VudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECUFkZFJlZigpDQorICAgIHsNCisgICAgICAgIHJldHVybiArK21fZHdSZWZDb3VudDsNCisgICAgfQ0KKw0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUJKm1fcFN0eWxlOw0KKyAgICBDWEZBX0xpbmtVc2VyRGF0YQkJKm1fcExpbmtEYXRhOw0KK3Byb3RlY3RlZDoNCisgICAgSUZYX01FTUFsbG9jYXRvcgkJCSptX3BBbGxvY2F0b3I7DQorICAgIEZYX0RXT1JECQkJCW1fZHdSZWZDb3VudDsNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9YRkFfVEVYVFBJRUNFIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgICBGWF9MUFdTVFIJCXBzelRleHQ7DQorICAgIEZYX0lOVDMyCQlpQ2hhcnM7DQorICAgIEZYX0lOVDMyCQkqcFdpZHRoczsNCisgICAgRlhfSU5UMzIJCWlIb3JTY2FsZTsNCisgICAgRlhfSU5UMzIJCWlWZXJTY2FsZTsNCisgICAgRlhfSU5UMzIJCWlCaWRpTGV2ZWw7DQorICAgIEZYX0lOVDMyCQlpVW5kZXJsaW5lOw0KKyAgICBGWF9JTlQzMgkJaVBlcmlvZDsNCisgICAgRlhfSU5UMzIJCWlMaW5lVGhyb3VnaDsNCisgICAgSUZYX0ZvbnQJCSpwRm9udDsNCisgICAgRlhfQVJHQgkJCWR3Q29sb3I7DQorICAgIEZYX0ZMT0FUCQlmRm9udFNpemU7DQorICAgIENGWF9SZWN0RgkJcnRQaWVjZTsNCisgICAgQ1hGQV9MaW5rVXNlckRhdGEqCXBMaW5rRGF0YTsNCisNCisgICAgX1hGQV9URVhUUElFQ0UoKSA6IHBzelRleHQoTlVMTCksIHBGb250KE5VTEwpLCBwTGlua0RhdGEoTlVMTCkNCisgICAgew0KKyAgICAgICAgcHN6VGV4dCA9IE5VTEw7DQorICAgIH0NCisgICAgfl9YRkFfVEVYVFBJRUNFKCkNCisgICAgew0KKyAgICAgICAgcHN6VGV4dCA9IE5VTEw7DQorICAgICAgICBpZiAoTlVMTCAhPSBwTGlua0RhdGEpIHsNCisgICAgICAgICAgICBwTGlua0RhdGEtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICBwTGlua0RhdGEgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfSBYRkFfVEVYVFBJRUNFLCAqIFhGQV9MUFRFWFRQSUVDRTsNCit0eXBlZGVmIFhGQV9URVhUUElFQ0UgY29uc3QgKiBYRkFfTFBDVEVYVFBJRUNFOw0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0xQVEVYVFBJRUNFPglDWEZBX1BpZWNlQXJyYXk7DQorY2xhc3MgQ1hGQV9QaWVjZUxpbmUgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfUGllY2VMaW5lKCkge30NCisgICAgQ1hGQV9QaWVjZUFycmF5CQltX3RleHRQaWVjZXM7DQorICAgIENGWF9JbnQzMkFycmF5CQltX2NoYXJDb3VudHM7DQorfTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfUGllY2VMaW5lKj4JQ1hGQV9QaWVjZUxpbmVBcnJheTsNCitzdHJ1Y3QgWEZBX1RBQlNUT1BTIHsNCisgICAgRlhfRFdPUkQgZHdBbGlnbjsNCisgICAgRlhfRkxPQVQgZlRhYnN0b3BzOw0KK307DQorY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQoKSA6IG1faVRhYkNvdW50KDApLCBtX2lUYWJJbmRleCgtMSksIG1fYlRhYnN0b3BzKEZBTFNFKSwgbV9mVGFiV2lkdGgoMCksIG1fZkxlZnQoMCkge30NCisgICAgdm9pZCBBcHBlbmQoRlhfRFdPUkQgZHdBbGlnbiwgRlhfRkxPQVQgZlRhYnN0b3BzKQ0KKyAgICB7DQorICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2lUYWJDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgWEZBX1RBQlNUT1BTICpwVGFic3RvcCA9IG1fdGFic3RvcHMuR2V0RGF0YVB0cihpKTsNCisgICAgICAgICAgICBpZiAoZlRhYnN0b3BzIDwgcFRhYnN0b3AtPmZUYWJzdG9wcykgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3RhYnN0b3BzLkluc2VydFNwYWNlQXQoaSwgMSk7DQorICAgICAgICBYRkFfVEFCU1RPUFMgdGFic3RvcDsNCisgICAgICAgIHRhYnN0b3AuZHdBbGlnbgkJPSBkd0FsaWduOw0KKyAgICAgICAgdGFic3RvcC5mVGFic3RvcHMJPSBmVGFic3RvcHM7DQorICAgICAgICBtX3RhYnN0b3BzLlNldEF0KGksIHRhYnN0b3ApOw0KKyAgICAgICAgbV9pVGFiQ291bnQrKzsNCisgICAgfQ0KKyAgICB2b2lkIFJlbW92ZUFsbCgpDQorICAgIHsNCisgICAgICAgIG1fdGFic3RvcHMuUmVtb3ZlQWxsKCk7DQorICAgICAgICBtX2lUYWJDb3VudCA9IDA7DQorICAgIH0NCisgICAgdm9pZCBSZXNldCgpDQorICAgIHsNCisgICAgICAgIG1faVRhYkluZGV4ID0gLTE7DQorICAgICAgICBtX2JUYWJzdG9wcyA9IEZBTFNFOw0KKyAgICAgICAgbV9mVGFiV2lkdGggPSAwOw0KKyAgICAgICAgbV9mTGVmdCA9IDA7DQorICAgIH0NCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX1RBQlNUT1BTPgkJbV90YWJzdG9wczsNCisgICAgRlhfSU5UMzIJCW1faVRhYkNvdW50Ow0KKyAgICBGWF9JTlQzMgkJbV9pVGFiSW5kZXg7DQorICAgIEZYX0JPT0wJCQltX2JUYWJzdG9wczsNCisgICAgRlhfRkxPQVQJCW1fZlRhYldpZHRoOw0KKyAgICBGWF9GTE9BVAkJbV9mTGVmdDsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dExheW91dCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9UZXh0TGF5b3V0KElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKTsNCisgICAgdmlydHVhbCB+Q1hGQV9UZXh0TGF5b3V0KCk7DQorICAgIEZYX0lOVDMyCQkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgRlhfRkxPQVQJCQlHZXRMYXlvdXRIZWlnaHQoKTsNCisgICAgRlhfRkxPQVQJCQlTdGFydExheW91dChGWF9GTE9BVCBmV2lkdGggPSAtMSk7DQorICAgIEZYX0JPT0wJCQkJRG9MYXlvdXQoRlhfSU5UMzIgaUJsb2NrSW5kZXgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodCwgRlhfRkxPQVQgZkNvbnRlbnRBcmVhSGVpZ2h0ID0gLTEsIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0ID0gLTEpOw0KKw0KKyAgICBGWF9CT09MCQkJCUNhbGNTaXplKGNvbnN0IENGWF9TaXplRiAmbWluU2l6ZSwgY29uc3QgQ0ZYX1NpemVGICZtYXhTaXplLCBDRlhfU2l6ZUYgJmRlZmF1bHRTaXplKTsNCisgICAgRlhfQk9PTAkJCQlMYXlvdXQoY29uc3QgQ0ZYX1NpemVGICZzaXplLCBGWF9GTE9BVCogZkhlaWdodCA9IE5VTEwpOw0KKyAgICB2b2lkCQkJCUl0ZW1CbG9ja3MoY29uc3QgQ0ZYX1JlY3RGJiBydFRleHQsIEZYX0lOVDMyIGlCbG9ja0luZGV4KTsNCisgICAgRlhfQk9PTAkJCQlEcmF3U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UgKnBGeERldmljZSwgY29uc3QgQ0ZYX01hdHJpeCAmdG1Eb2MyRGV2aWNlLCBjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCwgRlhfSU5UMzIgaUJsb2NrID0gMCk7DQorDQorICAgIEZYX0JPT0wJCQkJSXNMb2FkZWQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9waWVjZUxpbmVzLkdldFNpemUoKSA+IDA7DQorICAgIH0NCisgICAgdm9pZAkJCQlVbmxvYWQoKTsNCisgICAgY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSoJR2V0UGllY2VMaW5lcygpOw0KK3ByaXZhdGU6DQorICAgIHZvaWQJCQkJR2V0VGV4dERhdGFOb2RlKCk7DQorICAgIElGREVfWE1MTm9kZSoJCUdldFhNTENvbnRhaW5lck5vZGUoKTsNCisgICAgSUZYX1JURkJyZWFrKgkJQ3JlYXRlQnJlYWsoRlhfQk9PTCBiRGVmYXVsdCk7DQorICAgIHZvaWQJCQkJSW5pdEJyZWFrKEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KKyAgICB2b2lkCQkJCUluaXRCcmVhayhJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgRkRFX0NTU0RJU1BMQVkgZURpc3BsYXksIEZYX0ZMT0FUIGZMaW5lV2lkdGgsIElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCQkJTG9hZGVyKGNvbnN0IENGWF9TaXplRiAmc3pUZXh0LCBGWF9GTE9BVCAmZkxpbmVQb3MsIEZYX0JPT0wgYlNhdmVQaWVjZXMgPSBUUlVFKTsNCisNCisgICAgdm9pZAkJCQlMb2FkVGV4dChDWEZBX05vZGUgKnBOb2RlLCBjb25zdCBDRlhfU2l6ZUYgJnN6VGV4dCwgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJTYXZlUGllY2VzKTsNCisgICAgRlhfQk9PTAkJCQlMb2FkUmljaFRleHQoSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgY29uc3QgQ0ZYX1NpemVGICZzelRleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUsIEZYX0JPT0wgYlNhdmVQaWVjZXMsIENYRkFfTGlua1VzZXJEYXRhKiBwTGlua0RhdGEgPSBOVUxMLCBGWF9CT09MIGJFbmRCcmVhayA9IFRSVUUsIEZYX0JPT0wgYklzT2wgPSBGQUxTRSwgRlhfSU5UMzIgaUxpQ291bnQgPSAwKTsNCisNCisgICAgRlhfQk9PTAkJCQlBcHBlbmRDaGFyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlLCBGWF9CT09MIGJTYXZlUGllY2VzKTsNCisNCisgICAgdm9pZAkJCQlBcHBlbmRUZXh0TGluZShGWF9EV09SRCBkd1N0YXR1cywgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJTYXZlUGllY2VzLCBGWF9CT09MIGJFbmRCcmVhayA9IEZBTFNFKTsNCisgICAgdm9pZAkJCQlFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cywgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJEZWZhdWx0KTsNCisgICAgRlhfQk9PTAkJCQlJc0VuZChGWF9CT09MIGJTYXZlUGllY2VzKTsNCisNCisgICAgdm9pZAkJCQlQcm9jZXNzVGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCisgICAgdm9pZAkJCQlVcGRhdGVBbGlnbihGWF9GTE9BVCBmSGVpZ2h0LCBGWF9GTE9BVCBmQm90dG9tKTsNCisNCisgICAgdm9pZAkJCQlSZW5kZXJTdHJpbmcoSUZERV9SZW5kZXJEZXZpY2UgKnBEZXZpY2UsIElGREVfU29saWRCcnVzaCAqcEJydXNoLCBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVBpZWNlLCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIGNvbnN0IENGWF9NYXRyaXggJnRtRG9jMkRldmljZSk7DQorICAgIHZvaWQJCQkJUmVuZGVyUGF0aChJRkRFX1JlbmRlckRldmljZSAqcERldmljZSwgSUZERV9QZW4gKnBQZW4sIENYRkFfUGllY2VMaW5lICpwUGllY2VMaW5lLCBGWF9JTlQzMiBpUGllY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIGNvbnN0IENGWF9NYXRyaXggJnRtRG9jMkRldmljZSk7DQorDQorICAgIEZYX0lOVDMyCQkJR2V0RGlzcGxheVBvcyhYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJCQlUb1J1bihYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwgRlhfUlRGVEVYVE9CSiAmdHIpOw0KKw0KKyAgICB2b2lkCQkJCURvVGFic3RvcHMoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIENYRkFfUGllY2VMaW5lICpwUGllY2VMaW5lKTsNCisgICAgRlhfQk9PTAkJCQlMYXlvdXQoRlhfSU5UMzIgaUJsb2NrKTsNCisgICAgRlhfSU5UMzIJCQlDb3VudEJsb2NrcygpIGNvbnN0Ow0KKyAgICBJWEZBX1RleHRQcm92aWRlcgkqbV9wVGV4dFByb3ZpZGVyOw0KKyAgICBDWEZBX05vZGUJCQkqbV9wVGV4dERhdGFOb2RlOw0KKyAgICBGWF9CT09MCQkJCW1fYlJpY2hUZXh0Ow0KKyAgICBJRlhfTUVNQWxsb2NhdG9yCSptX3BBbGxvY2F0b3I7DQorICAgIElGWF9SVEZCcmVhawkJKm1fcEJyZWFrOw0KKyAgICBGWF9EV09SRAkJCW1fZHdUZXh0RGF0YTsNCisNCisgICAgQ1hGQV9Mb2FkZXJDb250ZXh0CSptX3BMb2FkZXI7DQorICAgIEZYX0lOVDMyCQkJbV9pTGluZXM7DQorICAgIEZYX0ZMT0FUCQkJbV9mTWF4V2lkdGg7DQorDQorICAgIENYRkFfVGV4dFBhcnNlcgkJbV90ZXh0UGFyc2VyOw0KKyAgICBDWEZBX1BpZWNlTGluZUFycmF5CW1fcGllY2VMaW5lczsNCisgICAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0CSptX3BUYWJzdG9wQ29udGV4dDsNCisgICAgRlhfQk9PTAkJCQltX2JCbG9ja0NvbnRpbnVlOw0KK3B1YmxpYzoNCisgICAgRlhfQk9PTAkJCQltX2JIYXNCbG9jazsNCisgICAgQ0ZYX0ludDMyQXJyYXkJCW1fQmxvY2tzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24vZnhmYV9sb2NhbGV2YWx1ZS5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24vZnhmYV9sb2NhbGV2YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGNlZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi9meGZhX2xvY2FsZXZhbHVlLmgKQEAgLTAsMCArMSw4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX1dJREdFVFZBTFVFX0gNCisjZGVmaW5lIF9GWEZBX1dJREdFVFZBTFVFX0gNCitjbGFzcyBJRlhfTG9jYWxlOw0KK2NsYXNzIENGWF9Vbml0aW1lOw0KK2NsYXNzIENYRkFfTG9jYWxlTWdyOw0KKyNkZWZpbmUJWEZBX1ZUX05VTEwJCQkJCTANCisjZGVmaW5lIFhGQV9WVF9CT09MRUFOCQkJCTENCisjZGVmaW5lIFhGQV9WVF9JTlRFR0VSCQkJCTINCisjZGVmaW5lIFhGQV9WVF9ERUNJTUFMCQkJCTQNCisjZGVmaW5lIFhGQV9WVF9GTE9BVAkJCQk4DQorI2RlZmluZSBYRkFfVlRfVEVYVAkJCQkJMTYNCisjZGVmaW5lIFhGQV9WVF9EQVRFCQkJCQkzMg0KKyNkZWZpbmUgWEZBX1ZUX1RJTUUJCQkJCTY0DQorI2RlZmluZSBYRkFfVlRfREFURVRJTUUJCQkJMTI4DQorY2xhc3MgQ1hGQV9Mb2NhbGVWYWx1ZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSgpOw0KKyAgICBDWEZBX0xvY2FsZVZhbHVlKGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7DQorICAgIENYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUsIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsNCisgICAgfkNYRkFfTG9jYWxlVmFsdWUoKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSYgb3BlcmF0b3IgPSAoY29uc3QgQ1hGQV9Mb2NhbGVWYWx1ZSYgdmFsdWUpOw0KKw0KKyAgICBGWF9CT09MCVZhbGlkYXRlVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIElGWF9Mb2NhbGUqIHBMb2NhbGUsIENGWF9XaWRlU3RyaW5nKiBwTWF0Y2hGb3JtYXQgID0gTlVMTCk7DQorICAgIEZYX0JPT0wJRm9ybWF0UGF0dGVybnMoQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3Q7DQorICAgIEZYX0JPT0wJRm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdDsNCisgICAgRlhfQk9PTAlWYWxpZGF0ZUNhbm9uaWNhbFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9EV09SRCBkd1ZUeXBlKTsNCisgICAgRlhfQk9PTAlWYWxpZGF0ZUNhbm9uaWNhbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX1VuaXRpbWUmIHVuRGF0ZSk7DQorICAgIEZYX0JPT0wJVmFsaWRhdGVDYW5vbmljYWxUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpOw0KKyAgICBGWF9CT09MCVZhbGlkYXRlQ2Fub25pY2FsRGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUpOw0KKyAgICB2b2lkCUdldE51bWJlcmljRm9ybWF0KENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCwgRlhfSU5UMzIgbkludExlbiwgRlhfSU5UMzIgbkRlY0xlbiwgRlhfQk9PTCBiU2lnbiA9IFRSVUUpOw0KKyAgICBGWF9CT09MCVZhbGlkYXRlTnVtZXJpY1RlbXAoQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtZXJpYywgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTCwgRlhfSU5UMzIqIHBvcyA9IE5VTEwpOw0KKw0KKyAgICBDRlhfV2lkZVN0cmluZwkJR2V0VmFsdWUoKSBjb25zdDsNCisgICAgRlhfRFdPUkQJCQlHZXRUeXBlKCkgY29uc3Q7DQorICAgIHZvaWQJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0RXT1JEIGR3VHlwZSk7DQorICAgIENGWF9XaWRlU3RyaW5nCQlHZXRUZXh0KCkgY29uc3Q7DQorICAgIEZYX0ZMT0FUCQkJR2V0TnVtKCkgY29uc3Q7DQorICAgIEZYX0RPVUJMRQkJCUdldERvdWJsZU51bSgpIGNvbnN0Ow0KKyAgICBDRlhfVW5pdGltZQkJCUdldERhdGUoKSBjb25zdDsNCisgICAgQ0ZYX1VuaXRpbWUJCQlHZXRUaW1lKCkgY29uc3Q7DQorICAgIENGWF9Vbml0aW1lCQkJR2V0RGF0ZVRpbWUoKSBjb25zdDsNCisgICAgRlhfQk9PTAkJCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgICBGWF9CT09MCQkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCisgICAgRlhfQk9PTAkJCQlTZXROdW0oRlhfRkxPQVQgZk51bSk7DQorICAgIEZYX0JPT0wJCQkJU2V0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCisgICAgRlhfQk9PTAkJCQlTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKTsNCisgICAgRlhfQk9PTAkJCQlTZXREYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICAgIEZYX0JPT0wJCQkJU2V0VGltZShjb25zdCBDRlhfVW5pdGltZSYgdCk7DQorICAgIEZYX0JPT0wJCQkJU2V0VGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgICBGWF9CT09MCQkJCVNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCk7DQorICAgIEZYX0JPT0wJCQkJU2V0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICAgIGlubGluZSBGWF9CT09MCQlJc051bGwoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9kd1R5cGUgPT0gWEZBX1ZUX05VTEw7DQorICAgIH0NCisgICAgaW5saW5lIEZYX0JPT0wJCUlzRW1wdHkoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV93c1ZhbHVlLklzRW1wdHkoKTsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfQk9PTAkJSXNWYWxpZCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2JWYWxpZDsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgRlhfQk9PTAkJCQlQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICAgIENYRkFfTG9jYWxlTWdyKgkJbV9wTG9jYWxlTWdyOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJbV93c1ZhbHVlOw0KKyAgICBGWF9EV09SRAkJCW1fZHdUeXBlOw0KKyAgICBGWF9CT09MCQkJCW1fYlZhbGlkOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YmFmYTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfQ09NTU9OX0hfDQorI2RlZmluZSBfWEZBX0NPTU1PTl9IXw0KKyNpbmNsdWRlICJ4ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgInhmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhX2ZtMmpzYXBpLmgiDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RlYnVnLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU3MGE2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RlYnVnLmgKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9DT01NT05fREVCVUdfSF8NCisjZGVmaW5lIF9YRkFfQ09NTU9OX0RFQlVHX0hfDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5YzhkMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRE9DREFUQV9IDQorI2RlZmluZSBfWEZBX0RPQ0RBVEFfSA0KK2VudW0gWEZBX0RBVEFGT1JNQVQgew0KKyAgICBYRkFfREFUQUZPUk1BVF9YRFAsDQorfTsNCitjbGFzcyBJWEZBX1BhY2tldEV4cG9ydA0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJWEZBX1BhY2tldEV4cG9ydCoJQ3JlYXRlKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCwgWEZBX0RBVEFGT1JNQVQgZUZvcm1hdCA9IFhGQV9EQVRBRk9STUFUX1hEUCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXhwb3J0KElGWF9GaWxlV3JpdGUgKnBXcml0ZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXhwb3J0KElGWF9GaWxlV3JpdGUgKnBXcml0ZSwgQ1hGQV9Ob2RlICpwTm9kZSwgRlhfRFdPUkQgZHdGbGFnID0gMCwgRlhfTFBDU1RSIHBDaGVja3N1bSA9IE5VTEwpID0gMDsNCit9Ow0KK2NsYXNzIElYRkFfUGFja2V0SW1wb3J0DQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElYRkFfUGFja2V0SW1wb3J0KglDcmVhdGUoQ1hGQV9Eb2N1bWVudCAqcERzdERvYyk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBEYXRhRG9jdW1lbnQpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZkZjlmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9ET0NMQVlPVVRfSF8NCisjZGVmaW5lIF9YRkFfRE9DTEFZT1VUX0hfDQorI2RlZmluZSBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KK2NsYXNzIENYRkFfTGF5b3V0SXRlbTsNCitjbGFzcyBJWEZBX0xheW91dFBhZ2U7DQorY2xhc3MgQ1hGQV9MYXlvdXRJdGVtDQorew0KK3B1YmxpYzoNCisgICAgSVhGQV9MYXlvdXRQYWdlKglHZXRQYWdlKCkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCQlHZXRGb3JtTm9kZSgpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCUdldFJlY3QoQ0ZYX1JlY3RGICZydExheW91dCwgRlhfQk9PTCBiUmVsYXRpdmUgPSBGQUxTRSkgY29uc3Q7DQorICAgIEZYX0lOVDMyCQkJR2V0SW5kZXgoKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCQlHZXRDb3VudCgpIGNvbnN0Ow0KKyAgICBDWEZBX0xheW91dEl0ZW0qCUdldFBhcmVudCgpIGNvbnN0Ow0KKyAgICBDWEZBX0xheW91dEl0ZW0qCUdldEZpcnN0KCkgY29uc3Q7DQorICAgIENYRkFfTGF5b3V0SXRlbSoJR2V0UHJldigpIGNvbnN0Ow0KKyAgICBDWEZBX0xheW91dEl0ZW0qCUdldE5leHQoKSBjb25zdDsNCisgICAgQ1hGQV9MYXlvdXRJdGVtKglHZXRMYXN0KCkgY29uc3Q7DQorfTsNCitjbGFzcyBDWEZBX0xheW91dEl0ZW1JbXBsIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0xheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUsIEZYX0JPT0wgYklzQ29udGVudExheW91dEl0ZW0pOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0xheW91dEl0ZW1JbXBsKCk7DQorICAgIEZYX0JPT0wgSXNDb250ZW50TGF5b3V0SXRlbSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2JJc0NvbnRlbnRMYXlvdXRJdGVtOw0KKyAgICB9DQorICAgIHZvaWQJQWRkQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcENoaWxkSXRlbSk7DQorICAgIHZvaWQJQWRkSGVhZENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBDaGlsZEl0ZW0pOw0KKyAgICB2b2lkCVJlbW92ZUNoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBDaGlsZEl0ZW0pOw0KKyAgICB2b2lkCUluc2VydENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBCZWZvcmVJdGVtLCBDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKTsNCitwdWJsaWM6DQorICAgIENYRkFfTm9kZSoJCQkJbV9wRm9ybU5vZGU7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqCW1fcFBhcmVudDsNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCoJbV9wTmV4dFNpYmxpbmc7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqCW1fcEZpcnN0Q2hpbGQ7DQorICAgIEZYX0JPT0wJCQkJCW1fYklzQ29udGVudExheW91dEl0ZW07DQorfTsNCitjbGFzcyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsIDogcHVibGljIENYRkFfTGF5b3V0SXRlbUltcGwNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUpOw0KK3B1YmxpYzoNCisgICAgQ1hGQV9Ob2RlKgkJCSBtX3BPbGRTdWJmb3JtOw0KK307DQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0FjY2VzcwkJCQkJMHg4MDAwMDAwMA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19EaXNhYmxlZAkJCQkweDQwMDAwMDAwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1JlY3RDYWNoZWQJCQkJMHgyMDAwMDAwMA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19CdXR0b25Eb3duCQkJCTB4MTAwMDAwMDANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0CQkJCTB4MDgwMDAwMDANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQJMHgwNDAwMDAwMA0KK2NsYXNzIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsIDogcHVibGljIENYRkFfTGF5b3V0SXRlbUltcGwNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChDWEZBX05vZGUgKnBOb2RlKTsNCisgICAgdmlydHVhbCB+Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwoKTsNCitwdWJsaWM6DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBtX3BQcmV2Ow0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogbV9wTmV4dDsNCisgICAgQ0ZYX1BvaW50RgkJbV9zUG9zOw0KKyAgICBDRlhfU2l6ZUYJCW1fc1NpemU7DQorICAgIEZYX0RXT1JECQltX2R3U3RhdHVzOw0KK307DQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0NCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfTGF5b3V0SXRlbSogR2V0Rmlyc3RDaGlsZChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKChDWEZBX0xheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbSktPm1fcEZpcnN0Q2hpbGQ7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldE5leHRTaWJsaW5nKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pDQorICAgIHsNCisgICAgICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoKENYRkFfTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtKS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldFBhcmVudChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKChDWEZBX0xheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbSktPm1fcFBhcmVudDsNCisgICAgfQ0KK307DQorY2xhc3MgSVhGQV9MYXlvdXRQYWdlDQorew0KK3B1YmxpYzoNCisgICAgSVhGQV9Eb2NMYXlvdXQqCQlHZXRMYXlvdXQoKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCQlHZXRQYWdlSW5kZXgoKSBjb25zdDsNCisgICAgdm9pZAkJCQlHZXRQYWdlU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0TWFzdGVyUGFnZSgpIGNvbnN0Ow0KK307DQorY2xhc3MgSVhGQV9Eb2NMYXlvdXQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbAlGWF9JTlQzMgkJCVN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCA9IEZBTFNFKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlEb0xheW91dChJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUluY3JlbWVudExheW91dCgpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50UGFnZXMoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSVhGQV9MYXlvdXRQYWdlKglHZXRQYWdlKEZYX0lOVDMyIGluZGV4KSBjb25zdCA9IDA7DQorDQorICAgIHZpcnR1YWwgQ1hGQV9MYXlvdXRJdGVtKglHZXRMYXlvdXRJdGVtKENYRkFfTm9kZSAqcEZvcm1JdGVtKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmFhMjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaApAQCAtMCwwICsxLDE3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRE9DVU1FTlRfSA0KKyNkZWZpbmUgX1hGQV9ET0NVTUVOVF9IDQorY2xhc3MgSVhGQV9Eb2NQYXJzZXI7DQorY2xhc3MgQ1hGQV9MYXlvdXRQcm9jZXNzb3I7DQorY2xhc3MgSVhGQV9Eb2NMYXlvdXQ7DQorY2xhc3MgSVhGQV9MYXlvdXRQYWdlOw0KK2NsYXNzIENYRkFfTGF5b3V0SXRlbTsNCitjbGFzcyBJWEZBX1BhZ2VDb250ZW50Ow0KK2NsYXNzIElYRkFfU2NyaXB0Q29udGV4dDsNCitjbGFzcyBDWEZBX05vZGU7DQorY2xhc3MgSVhGQV9Ob3RpZnk7DQorY2xhc3MgSVhGQV9PYmpGYWN0b3J5Ow0KK2NsYXNzIENYRkFfRG9jdW1lbnQ7DQorZW51bSBYRkFfVkVSU0lPTiB7DQorICAgIFhGQV9WRVJTSU9OX1VOS05PV04gPSAwLA0KKyAgICBYRkFfVkVSU0lPTl8yMDAgPSAyMDAsDQorICAgIFhGQV9WRVJTSU9OXzIwMiA9IDIwMiwNCisgICAgWEZBX1ZFUlNJT05fMjA0ID0gMjA0LA0KKyAgICBYRkFfVkVSU0lPTl8yMDUgPSAyMDUsDQorICAgIFhGQV9WRVJTSU9OXzIwNiA9IDIwNiwNCisgICAgWEZBX1ZFUlNJT05fMjA3ID0gMjA3LA0KKyAgICBYRkFfVkVSU0lPTl8yMDggPSAyMDgsDQorICAgIFhGQV9WRVJTSU9OXzMwMCA9IDMwMCwNCisgICAgWEZBX1ZFUlNJT05fMzAxID0gMzAxLA0KKyAgICBYRkFfVkVSU0lPTl8zMDMgPSAzMDMsDQorICAgIFhGQV9WRVJTSU9OXzMwNiA9IDMwNiwNCisgICAgWEZBX1ZFUlNJT05fREVGQVVMVCA9IFhGQV9WRVJTSU9OXzMwMywNCisgICAgWEZBX1ZFUlNJT05fTUlOICAgICA9IDIwMCwNCisgICAgWEZBX1ZFUlNJT05fTUFYICAgICA9IDQwMCwNCit9Ow0KKyNkZWZpbmUgWEZBX0xBWU9VVFNUQVRVU19WaXNpYmxlCTB4MDAwMQ0KKyNkZWZpbmUgWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZQkweDAwMTANCisjZGVmaW5lIFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlCTB4MDAyMA0KK2VudW0gWEZBX05PREVFVkVOVCB7DQorICAgIFhGQV9OT0RFRVZFTlRfUmVhZHksDQorICAgIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2luZywNCisgICAgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsDQorICAgIFhGQV9OT0RFRVZFTlRfQ2hpbGRBZGRlZCwNCisgICAgWEZBX05PREVFVkVOVF9DaGlsZFJlbW92ZWQsDQorfTsNCitlbnVtIFhGQV9QQUdFRVZFTlQgew0KKyAgICBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCwNCisgICAgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCwNCit9Ow0KK2VudW0gWEZBX0xBWU9VVEVWRU5UIHsNCisgICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1BZGRlZCwNCisgICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZywNCisgICAgWEZBX0xBWU9VVEVWRU5UX1JlY3RDaGFuZ2VkLA0KKyAgICBYRkFfTEFZT1VURVZFTlRfU3RhdHVzQ2hhbmdlZCwNCit9Ow0KK2VudW0gWEZBX0xBWU9VVFJFU1VMVCB7DQorICAgIFhGQV9MQVlPVVRSRVNVTFRfQ29udGludWUsDQorICAgIFhGQV9MQVlPVVRSRVNVTFRfRG9uZSwNCisgICAgWEZBX0xBWU9VVFJFU1VMVF9OZXh0Q29udGVudCwNCit9Ow0KKyNkZWZpbmUgWEZBX0xBWU9VVE5PVElGWV9TdHJpY3RIZWlnaHQJMHgwMDAxDQorI2RlZmluZSBYRkFfTEFZT1VUTk9USUZZX05vUGFyZW50QnJlYWsJMHgwMDAyDQorY2xhc3MgSVhGQV9Ob3RpZnkNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJT25QYWdlRXZlbnQoSVhGQV9MYXlvdXRQYWdlICpwU2VuZGVyLCBYRkFfUEFHRUVWRU5UIGVFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSA9IE5VTEwpID0gMDsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCU9uTm9kZUV2ZW50KENYRkFfTm9kZSAqcFNlbmRlciwgWEZBX05PREVFVkVOVCBlRXZlbnQsIEZYX0xQVk9JRCBwUGFyYW0gPSBOVUxMLCBGWF9MUFZPSUQgcFBhcmFtMiA9IE5VTEwsIEZYX0xQVk9JRCBwUGFyYW0zID0gTlVMTCwgRlhfTFBWT0lEIHBQYXJhbTQgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJICAgICAgICBPbldpZGdldERhdGFFdmVudChDWEZBX1dpZGdldERhdGEqIHBTZW5kZXIsIEZYX0RXT1JEIGR3RXZlbnQsIEZYX0xQVk9JRCBwUGFyYW0gPSBOVUxMLCBGWF9MUFZPSUQgcEFkZGl0aW9uYWwgPSBOVUxMLCBGWF9MUFZPSUQgcEFkZGl0aW9uYWwyID0gTlVMTCkgPSAwOw0KKw0KKyAgICB2aXJ0dWFsIENYRkFfTGF5b3V0SXRlbSoJT25DcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSAqcE5vZGUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCU9uTGF5b3V0RXZlbnQoSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgWEZBX0xBWU9VVEVWRU5UIGVFdmVudCwgRlhfTFBWT0lEIHBQYXJhbSA9IE5VTEwsIEZYX0xQVk9JRCBwUGFyYW0yID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJU3RhcnRGaWVsZERyYXdMYXlvdXQoQ1hGQV9Ob2RlICpwSXRlbSwgRlhfRkxPQVQgJmZDYWxjV2lkdGgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmluZFNwbGl0UG9zKENYRkFfTm9kZSAqcEl0ZW0sIEZYX0lOVDMyIGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHRQb3MpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCVJ1blNjcmlwdChDWEZBX05vZGUqIHBTY3JpcHQsIENYRkFfTm9kZSogcEZvcm1JdGVtKSA9IDA7DQorICAgIHZpcnR1YWwJRlhfSU5UMzIJCQlFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLCBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLCBGWF9CT09MIGJSZWN1cnNpdmUgPSBUUlVFLCBDWEZBX1dpZGdldEFjYyogcEV4Y2x1ZGUgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlBZGRDYWxjVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgICB2aXJ0dWFsIFhGQV9IRE9DCQkJR2V0SERPQygpID0gMDsNCisgICAgdmlydHVhbCBJWEZBX0RvY1Byb3ZpZGVyKglHZXREb2NQcm92aWRlcigpID0gMDsNCisgICAgdmlydHVhbCBJWEZBX0FwcFByb3ZpZGVyKglHZXRBcHBQcm92aWRlcigpID0gMDsNCisgICAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqCUdldFdpZGdldEhhbmRsZXIoKSA9IDA7DQorICAgIHZpcnR1YWwgWEZBX0hXSURHRVQJCQlHZXRIV2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCU9wZW5Ecm9wRG93bkxpc3QoWEZBX0hXSURHRVQgaFdpZGdldCkgPSAwOw0KKyAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQlHZXRDdXJyZW50RGF0ZVRpbWUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZXNldERhdGEoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldExheW91dFN0YXR1cygpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJ1bk5vZGVJbml0aWFsaXplKENYRkFfTm9kZSogcE5vZGUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCVJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlHZXRGb2N1c1dpZGdldE5vZGUoKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KK307DQorY2xhc3MgSVhGQV9PYmpGYWN0b3J5DQorew0KK3B1YmxpYzoNCisgICAgdmlydHVhbCBDWEZBX05vZGUqCQkJQ3JlYXRlTm9kZShGWF9EV09SRCBkd1BhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpID0gMDsNCisgICAgdmlydHVhbCBDWEZBX05vZGUqCQkJQ3JlYXRlTm9kZShYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkgPSAwOw0KK307DQorI2RlZmluZSBYRkFfRE9DRkxBR19TdHJpY3RTY29waW5nCTB4MDAwMQ0KKyNkZWZpbmUgWEZBX0RPQ0ZMQUdfSGFzSW50ZXJhY3RpdmUJMHgwMDAyDQorI2RlZmluZSBYRkFfRE9DRkxBR19JbnRlcmFjdGl2ZQkJMHgwMDA0DQorI2RlZmluZSBYRkFfRE9DRkxBR19TY3JpcHRpbmcJCTB4MDAwOA0KK2NsYXNzIENTY3JpcHRfRGF0YVdpbmRvdzsNCitjbGFzcyBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw7DQorY2xhc3MgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw7DQorY2xhc3MgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDsNCitjbGFzcyBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOw0KK2NsYXNzIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw7DQorY2xhc3MgQ1hGQV9Eb2N1bWVudCA6IHB1YmxpYyBJWEZBX09iakZhY3RvcnksIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Eb2N1bWVudChJWEZBX0RvY1BhcnNlciAqcFBhcnNlcik7DQorICAgIH5DWEZBX0RvY3VtZW50KCk7DQorICAgIENYRkFfTm9kZSoJCQkJCUdldFJvb3QoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wUm9vdE5vZGU7DQorICAgIH0NCisgICAgSVhGQV9Eb2NQYXJzZXIqCQkJCUdldFBhcnNlcigpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BQYXJzZXI7DQorICAgIH0NCisgICAgSVhGQV9Ob3RpZnkqCQkJCUdldE5vdGlmeSgpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCQkJU2V0Um9vdChDWEZBX05vZGUqIHBOZXdSb290KTsNCisgICAgQ1hGQV9PYmplY3QqCQkJCUdldFhGQU5vZGUoRlhfV1NUUiB3c05vZGVOYW1lKTsNCisgICAgQ1hGQV9PYmplY3QqCQkJCUdldFhGQU5vZGUoRlhfRFdPUkQgd3NOb2RlTmFtZUhhc2gpOw0KKyAgICB2b2lkCQkJCQkJQWRkUHVyZ2VOb2RlKENYRkFfTm9kZSAqcE5vZGUpOw0KKyAgICBGWF9CT09MCQkJCQkJUmVtb3ZlUHVyZ2VOb2RlKENYRkFfTm9kZSAqcE5vZGUpOw0KKyAgICB2b2lkCQkJCQkJUHVyZ2VOb2RlcygpOw0KKyAgICBGWF9CT09MCQkJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWcpDQorICAgIHsNCisgICAgICAgIHJldHVybiAobV9kd0RvY0ZsYWdzICYgZHdGbGFnKSA9PSBkd0ZsYWc7DQorICAgIH0NCisgICAgdm9pZAkJCQkJCVNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiA9IFRSVUUpOw0KKyAgICBGWF9CT09MCQkJCQkJSXNJbnRlcmFjdGl2ZSgpOw0KKyAgICBYRkFfVkVSU0lPTgkJCQkJR2V0Q3VyVmVyc2lvbk1vZGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9lQ3VyVmVyc2lvbk1vZGU7DQorICAgIH0NCisgICAgWEZBX1ZFUlNJT04JCQkJCVJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzVGVtcGxhdGVOUyk7DQorICAgIENYRkFfTG9jYWxlTWdyKgkJCQlHZXRMb2NhbE1ncigpOw0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlDcmVhdGVOb2RlKEZYX0RXT1JEIGR3UGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCk7DQorICAgIHZpcnR1YWwgQ1hGQV9Ob2RlKgkJCUNyZWF0ZU5vZGUoWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpOw0KKyAgICB2b2lkCQkJCQkJRG9Qcm90b01lcmdlKCk7DQorICAgIENYRkFfTm9kZSoJCQkJCUdldE5vZGVCeUlEKENYRkFfTm9kZSogcFJvb3QsIEZYX1dTVFIgd3NJRCk7DQorDQorICAgIHZvaWQJCQkJCQlEb0RhdGFNZXJnZSgpOw0KKyAgICB2b2lkCQkJCQkJRG9EYXRhUmVtZXJnZShGWF9CT09MIGJEb0RhdGFNZXJnZSk7DQorICAgIENYRkFfTm9kZSoJCQkJCURhdGFNZXJnZV9Db3B5Q29udGFpbmVyKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIENYRkFfTm9kZSogcERhdGFTY29wZSwgRlhfQk9PTCBiT25lSW5zdGFuY2UgPSBGQUxTRSwgRlhfQk9PTCBiRGF0YU1lcmdlID0gVFJVRSwgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpOw0KKyAgICB2b2lkCQkJCQkJRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Ob2RlKiBwRm9ybVVwZGF0ZVJvb3QpOw0KKyAgICBDWEZBX05vZGUqCQkJCQlHZXROb3RCaW5kTm9kZShDWEZBX09iakFycmF5JiBhcnJheU5vZGVzKTsNCisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqCQlHZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgSVhGQV9Eb2NMYXlvdXQqCQkJCUdldERvY0xheW91dCgpOw0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqCQkJSW5pdFNjcmlwdENvbnRleHQoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqCQkJR2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICB2b2lkCQkJCQkJQ2xlYXJMYXlvdXREYXRhKCk7DQorcHVibGljOg0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfTm9kZSo+IG1fcmdHbG9iYWxCaW5kaW5nOw0KKyAgICBDWEZBX05vZGVBcnJheQkJCQkgbV9wUGVuZGluZ1BhZ2VTZXQ7DQorcHJvdGVjdGVkOg0KKyAgICBJWEZBX0RvY1BhcnNlcioJCQkJbV9wUGFyc2VyOw0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqCQkJbV9wU2NyaXB0Q29udGV4dDsNCisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqCQltX3BMYXlvdXRQcm9jZXNzb3I7DQorICAgIENYRkFfTm9kZSoJCQkJCW1fcFJvb3ROb2RlOw0KKw0KKyAgICBDWEZBX0xvY2FsZU1ncioJCQkJbV9wTG9jYWxNZ3I7DQorICAgIENTY3JpcHRfRGF0YVdpbmRvdyoJCQkJCW1fcFNjcmlwdERhdGFXaW5kb3c7DQorICAgIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCoJCQltX3BTY3JpcHRFdmVudDsNCisgICAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwqCQkJbV9wU2NyaXB0SG9zdDsNCisgICAgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCoJCQkJbV9wU2NyaXB0TG9nOw0KKyAgICBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKgkJCW1fcFNjcmlwdExheW91dDsNCisgICAgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCoJCW1fcFNjcmlwdFNpZ25hdHVyZTsNCisgICAgQ1hGQV9Ob2RlU2V0CQkJCQkJbV9yZ1B1cmdlTm9kZXM7DQorICAgIFhGQV9WRVJTSU9OCQkJCQkJCW1fZUN1clZlcnNpb25Nb2RlOw0KKyAgICBGWF9EV09SRAkJCQkJCQltX2R3RG9jRmxhZ3M7DQorICAgIGZyaWVuZCBjbGFzcyBDWEZBX1NpbXBsZVBhcnNlcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5Y2VjYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0ZNMkpTX0FQSV9IDQorI2RlZmluZSBfWEZBX0ZNMkpTX0FQSV9IDQorI2RlZmluZSBGT1hJVF9YRkFfRk0ySlNfRk9STUNBTENfUlVOVElNRQkiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUiDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCitGWF9ERUZJTkVIQU5ETEUoWEZBX0hGTTJKU0NPTlRFWFQpDQorRlhfSU5UMzIJCQlYRkFfRk0ySlNfVHJhbnNsYXRlKEZYX1dTVFIgd3NGb3JtY2FsYywgQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiB3c0Vycm9yKTsNCitYRkFfSEZNMkpTQ09OVEVYVAlYRkFfRk0ySlNfQ29udGV4dENyZWF0ZSgpOw0KK3ZvaWQJCQkJWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsIEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLA0KKyAgICAgICAgRlhKU0VfSENPTlRFWFQgaFNjcmlwdENvbnRleHQsDQorICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KK3ZvaWQJCQkJWEZBX0ZNMkpTX0dsb2JhbFByb3BlcnR5R2V0dGVyKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3ZvaWQJCQkJWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQpOw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyNWE5MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfTE9DQUxFTUdSX0gNCisjZGVmaW5lIF9GWEZBX0xPQ0FMRU1HUl9IDQorY2xhc3MgQ1hGQV9Ob2RlOw0KK2NsYXNzIElGWF9Mb2NhbGU7DQorY2xhc3MgSUZYX0xvY2FsZU1ncjsNCitjbGFzcyBDWEZBX0xvY2FsZU1ncjsNCisjZGVmaW5lIFhGQV9MQU5HSURfemhfQ04JMHgwODA0DQorI2RlZmluZQlYRkFfTEFOR0lEX3poX1RXCTB4MDQwNA0KKyNkZWZpbmUgWEZBX0xBTkdJRF96aF9ISwkweDBjMDQNCisjZGVmaW5lIFhGQV9MQU5HSURfamFfSlAJMHgwNDExDQorI2RlZmluZQlYRkFfTEFOR0lEX2tvX0tSCTB4MDQxMg0KKyNkZWZpbmUgWEZBX0xBTkdJRF9lbl9VUwkweDA0MDkNCisjZGVmaW5lIFhGQV9MQU5HSURfZW5fR0IJMHgwODA5DQorI2RlZmluZSBYRkFfTEFOR0lEX2VzX0VTCTB4MGMwYQ0KKyNkZWZpbmUgWEZBX0xBTkdJRF9lc19MQQkweDA4MGENCisjZGVmaW5lIFhGQV9MQU5HSURfZGVfREUJMHgwNDA3DQorI2RlZmluZSBYRkFfTEFOR0lEX2ZyX0ZSCTB4MDQwYw0KKyNkZWZpbmUgWEZBX0xBTkdJRF9pdF9JVAkweDA0MTANCisjZGVmaW5lIFhGQV9MQU5HSURfcHRfQlIJMHgwNDE2DQorI2RlZmluZSBYRkFfTEFOR0lEX25sX05MCTB4MDQxMw0KKyNkZWZpbmUgWEZBX0xBTkdJRF9ydV9SVQkweDA0MTkNCitjbGFzcyBDWEZBX0xvY2FsZU1nciA6IHB1YmxpYyBJRlhfTG9jYWxlTWdyLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfTG9jYWxlTWdyKENYRkFfTm9kZSogcExvY2FsZVNldCwgQ0ZYX1dpZGVTdHJpbmcgd3NEZWZsY2lkKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQlHZXREZWZMb2NhbGVJRCgpOw0KKyAgICB2aXJ0dWFsIElGWF9Mb2NhbGUqCQlHZXREZWZMb2NhbGUoKTsNCisgICAgdmlydHVhbCBJRlhfTG9jYWxlKgkJR2V0TG9jYWxlKEZYX1dPUkQgbGNpZCk7DQorICAgIHZpcnR1YWwgSUZYX0xvY2FsZSogCUdldExvY2FsZUJ5TmFtZShGWF9XU1RSIHdzTG9jYWxlTmFtZSk7DQorICAgIH5DWEZBX0xvY2FsZU1ncigpOw0KKyAgICB2b2lkCQkJCQlTZXREZWZMb2NhbGUoSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICAgIENGWF9XaWRlU3RyaW5nQwkJCUdldENvbmZpZ0xvY2FsZU5hbWUoQ1hGQV9Ob2RlKiBwQ29uZmlnKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9QdHJBcnJheQkJCW1fTG9jYWxlQXJyYXk7DQorICAgIENGWF9QdHJBcnJheQkJCW1fWE1MTG9jYWxlQXJyYXk7DQorICAgIElGWF9Mb2NhbGUqCQkJCW1fcERlZkxvY2FsZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzQ29uZmlnTG9jYWxlOw0KKyAgICBGWF9XT1JECQkJCQltX2R3RGVmbGNpZDsNCisgICAgRlhfV09SRAkJCQkJbV9kd0xvY2FsZUZsYWdzOw0KK307DQorY2xhc3MgSVhGQV9UaW1lWm9uZVByb3ZpZGVyDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIElYRkFfVGltZVpvbmVQcm92aWRlciogQ3JlYXRlKCk7DQorICAgIHN0YXRpYyBJWEZBX1RpbWVab25lUHJvdmlkZXIqIEdldCgpOw0KKyAgICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJU2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSA9IDA7DQorfTsNCitjbGFzcyBDWEZBX1RpbWVab25lUHJvdmlkZXIgOiBwdWJsaWMgSVhGQV9UaW1lWm9uZVByb3ZpZGVyLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfVGltZVpvbmVQcm92aWRlcigpOw0KKyAgICB+Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJU2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KTsNCisgICAgdmlydHVhbCB2b2lkCQlHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopOw0KK3ByaXZhdGU6DQorICAgIEZYX1RJTUVaT05FCQkJbV90ejsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg1YjlkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oCkBAIC0wLDAgKzEsNTg4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9PQkpFQ1RfSF8NCisjZGVmaW5lIF9YRkFfT0JKRUNUX0hfDQorY2xhc3MgQ1hGQV9Eb2N1bWVudDsNCitjbGFzcyBJWEZBX09iakZhY3Rvcnk7DQorY2xhc3MgSVhGQV9Ob3RpZnk7DQorY2xhc3MgQ1hGQV9PYmplY3Q7DQorY2xhc3MgQ1hGQV9PcmRpbmFyeU9iamVjdDsNCitjbGFzcyBDWEZBX05vZGU7DQorY2xhc3MgQ1hGQV9Ob2RlTGlzdDsNCitjbGFzcyBDWEZBX0FycmF5Tm9kZUxpc3Q7DQorY2xhc3MgQ1hGQV9BdHRhY2hOb2RlTGlzdDsNCitlbnVtIFhGQV9PQkpFQ1RUWVBFIHsNCisgICAgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3QgPSAweDAsDQorICAgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5TGlzdCAgID0gMHgxLA0KKyAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlTGlzdCAgICAgICA9IDB4MiwNCisgICAgWEZBX09CSkVDVFRZUEVfTm9kZSAgICAgICAgICAgPSAweDQsDQorICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVDICAgICAgICAgID0gMHg1LA0KKyAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlViAgICAgICAgICA9IDB4NiwNCisgICAgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlICAgICAgPSAweDgsDQorICAgIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlICAgICAgID0gMHg5LA0KKyAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlICA9IDB4QSwNCisgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUgICAgPSAweEIsDQorICAgIFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMgID0gMHhDLA0KKyAgICBYRkFfT0JKRUNUVFlQRU1BU0sgICAgICAgICAgICA9IDB4RiwNCisgICAgWEZBX05PREVGTEFHX0luaXRpYWxpemVkICAgICAgPSAweDAwMDIwLA0KKyAgICBYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZAkgICAgICA9IDB4MDAyMDAsDQorICAgIFhGQV9OT0RFRkxBR19OZWVkc0luaXRBcHAgICAgID0gMHgwMDQwMCwNCisgICAgWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXMgICAgPSAweDAwODAwLA0KKyAgICBYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlICA9IDB4MDEwMDAsDQorICAgIFhGQV9OT0RFRkxBR19Ta2lwRGF0YUJpbmRpbmcgID0gMHgwMjAwMCwNCisgICAgWEZBX05PREVGTEFHX093blhNTE5vZGUJCSAgPQkweDA0MDAwLA0KKyAgICBYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSAgICAgICA9IDB4MDgwMDAsDQorICAgIFhGQV9OT0RFRkxBR19MYXlvdXRHZW5lcmF0ZWROb2RlID0gMHgxMDAwMCwNCit9Ow0KK2NsYXNzIENYRkFfT2JqZWN0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX09iamVjdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0RXT1JEIHVGbGFncyk7DQorICAgIGlubGluZSBDWEZBX0RvY3VtZW50KglHZXREb2N1bWVudCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfRFdPUkQJCQlHZXRGbGFnKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fdUZsYWdzOw0KKyAgICB9DQorICAgIGlubGluZSBYRkFfT0JKRUNUVFlQRQlHZXRPYmplY3RUeXBlKCkJCWNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoWEZBX09CSkVDVFRZUEUpKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKTsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfQk9PTAkJCUlzTm9kZSgpCQkJY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPj0gWEZBX09CSkVDVFRZUEVfTm9kZTsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfQk9PTAkJCUlzT3JkaW5hcnlPYmplY3QoKQljb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA9PSBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdDsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfQk9PTAkJCUlzTm9kZUxpc3QoKQkJY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfTm9kZUxpc3Q7DQorICAgIH0NCisgICAgaW5saW5lIEZYX0JPT0wJCQlJc09yZGluYXJ5TGlzdCgpCWNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spID09IFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5TGlzdDsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCQlJc0NvbnRlbnROb2RlKCkJCWNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJCUlzQ29udGFpbmVyTm9kZSgpCWNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGU7DQorICAgIH0NCisgICAgWEZBX0VMRU1FTlQJCQkJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmdDICZ3c05hbWUpIGNvbnN0Ow0KKyAgICBGWF9VSU5UMzIJCQkJR2V0Q2xhc3NIYXNoQ29kZSgpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCVNjcmlwdF9PYmplY3RDbGFzc19DbGFzc05hbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShGWF9JTlQzMiBpU3RyaW5nSUQsIC4uLik7DQorcHJvdGVjdGVkOg0KKyAgICBDWEZBX0RvY3VtZW50CQkqbV9wRG9jdW1lbnQ7DQorICAgIEZYX0RXT1JECQkJbV91RmxhZ3M7DQorfTsNCisjZGVmaW5lIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuCQkJMHgwMQ0KKyNkZWZpbmUgWEZBX05PREVGSUxURVJfUHJvcGVydGllcwkJMHgwMg0KKyNkZWZpbmUgWEZBX05PREVGSUxURVJfT25lT2ZQcm9wZXJ0eQkweDA0DQorI2RlZmluZSBYRkFfQ0xPTkVGTEFHX0NvbnRlbnQJCQkweDAxDQorZW51bSBYRkFfTk9ERUlURU0gew0KKyAgICBYRkFfTk9ERUlURU1fUGFyZW50LA0KKyAgICBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwNCisgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgICBYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcsDQorfTsNCitlbnVtIFhGQV9TT01fTUVTU0FHRVRZUEUgew0KKyAgICBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlLA0KKyAgICBYRkFfU09NX0Zvcm1hdE1lc3NhZ2UsDQorICAgIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZQ0KK307DQordHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxDWEZBX05vZGUqPiBDWEZBX05vZGVTdGFjazsNCit0eXBlZGVmIENYRkFfUHRyU2V0VGVtcGxhdGU8Q1hGQV9Ob2RlKj4gQ1hGQV9Ob2RlU2V0Ow0KK3R5cGVkZWYgdm9pZCAoKlBEX0NBTExCQUNLX0RVUExJQ0FURURBVEEpKEZYX0xQVk9JRCYgcERhdGEpOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIHsNCisgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEJCXBGcmVlOw0KKyAgICBQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBCXBDb3B5Ow0KK30gWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTzsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX01BUERBVEFCTE9DSyA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgRlhfTFBCWVRFCQkJCUdldERhdGEoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gKEZYX0xQQllURSl0aGlzICsgc2l6ZW9mKF9YRkFfTUFQREFUQUJMT0NLKTsNCisgICAgfQ0KKyAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKglwQ2FsbGJhY2tJbmZvOw0KKyAgICBGWF9JTlQzMgkJCQkJCWlCeXRlczsNCit9IFhGQV9NQVBEQVRBQkxPQ0ssICogWEZBX0xQTUFQREFUQUJMT0NLOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfTUFQTU9EVUxFREFUQSA6IHB1YmxpYyBDRlhfT2JqZWN0IHsNCisgICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9WYWx1ZU1hcDsNCisgICAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0xQVk9JRCwgWEZBX0xQTUFQREFUQUJMT0NLPiBtX0J1ZmZlck1hcDsNCit9IFhGQV9NQVBNT0RVTEVEQVRBLCAqIFhGQV9MUE1BUE1PRFVMRURBVEE7DQorI2RlZmluZSBYRkFfQ2FsY1JlZkNvdW50CShGWF9MUFZPSUQpKEZYX1VJTlRQVFIpRlhCU1RSX0lEKCdYJywgJ0YnLCAnQScsICdSJykNCisjZGVmaW5lIFhGQV9DYWxjRGF0YQkJKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilGWEJTVFJfSUQoJ1gnLCAnRicsICdBJywgJ0MnKQ0KKyNkZWZpbmUgWEZBX0xBWU9VVElURU1LRVkJKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilGWEJTVFJfSUQoJ0wnLCAnWScsICdJJywgJ00nKQ0KK2NsYXNzIENYRkFfTm9kZSA6IHB1YmxpYyBDWEZBX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIFhGQV9FTEVNRU5UCQkJR2V0Q2xhc3NJRCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoWEZBX0VMRU1FTlQpbV9lTm9kZUNsYXNzOw0KKyAgICB9DQorICAgIEZYX0RXT1JECQkJR2V0UGFja2V0SUQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9lUGFja2V0Ow0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWcpIGNvbnN0Ow0KKyAgICB2b2lkCQkJCVNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiA9IFRSVUUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KKyAgICBGWF9CT09MCQkJCUlzQXR0cmlidXRlSW5YTUwoKTsNCisgICAgRlhfQk9PTAkJCQlJc0Zvcm1Db250YWluZXIoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRm9ybSAmJiBJc0NvbnRhaW5lck5vZGUoKTsNCisgICAgfQ0KKyAgICB2b2lkCQkJCVNldFhNTE1hcHBpbmdOb2RlKElGREVfWE1MTm9kZSogcFhNTE5vZGUpDQorICAgIHsNCisgICAgICAgIG1fcFhNTE5vZGUgPSBwWE1MTm9kZTsNCisgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUqCQlHZXRYTUxNYXBwaW5nTm9kZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BYTUxOb2RlOw0KKyAgICB9DQorICAgIElGREVfWE1MTm9kZSoJCUNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQorICAgIEZYX0JPT0wJCQkJSXNOZWVkU2F2aW5nWE1MTm9kZSgpOw0KKyAgICBpbmxpbmUgRlhfRFdPUkQJCUdldE5hbWVIYXNoKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZHdOYW1lSGFzaDsNCisgICAgfQ0KKyAgICBpbmxpbmUgRlhfQk9PTAkJSXNVbm5hbWVkKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZHdOYW1lSGFzaCA9PSAwOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSoJCQlHZXRNb2RlbE5vZGUoKTsNCisgICAgdm9pZAkJCQlVcGRhdGVOYW1lSGFzaCgpOw0KKyAgICBGWF9CT09MCQkJCUhhc0F0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MIGJDYW5Jbmhlcml0ID0gRkFMU0UpOw0KKyAgICBGWF9CT09MCQkJCVNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9XU1RSIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJCQlHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgICAgRlhfQk9PTAkJCQlTZXRBdHRyaWJ1dGUoRlhfV1NUUiB3c0F0dHIsIEZYX1dTVFIgd3NWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOw0KKyAgICBGWF9CT09MCQkJCUdldEF0dHJpYnV0ZShGWF9XU1RSIHdzQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgICAgRlhfQk9PTAkJCQlSZW1vdmVBdHRyaWJ1dGUoRlhfV1NUUiB3c0F0dHIpOw0KKyAgICBGWF9CT09MCQkJCVNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLCAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICAgIEZYX0JPT0wJCQkJVHJ5Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LCBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiUHJvdG8gPSBUUlVFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCUdldENvbnRlbnQoKTsNCisNCisgICAgRlhfQk9PTAkJCQlUcnlOYW1lc3BhY2UoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlKTsNCisNCisgICAgRlhfQk9PTAkJCQlTZXRCb29sZWFuKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0JPT0wgYlZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIFNldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWJWYWx1ZSwgYk5vdGlmeSk7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCQlUcnlCb29sZWFuKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0JPT0wgJmJWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUpOw0KKyAgICBGWF9CT09MCQkJCUdldEJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0cikNCisgICAgew0KKyAgICAgICAgRlhfQk9PTCBiVmFsdWU7DQorICAgICAgICByZXR1cm4gVHJ5Qm9vbGVhbihlQXR0ciwgYlZhbHVlLCBUUlVFKSA/IGJWYWx1ZSA6IEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJU2V0SW50ZWdlcihYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9JTlQzMiBpVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gU2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpaVZhbHVlLCBiTm90aWZ5KTsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCVRyeUludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfSU5UMzIgJmlWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUpOw0KKyAgICBGWF9JTlQzMgkJCUdldEludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0cikNCisgICAgew0KKyAgICAgICAgRlhfSU5UMzIgaVZhbHVlOw0KKyAgICAgICAgcmV0dXJuIFRyeUludGVnZXIoZUF0dHIsIGlWYWx1ZSwgVFJVRSkgPyBpVmFsdWUgOiAwOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJU2V0RW51bShYRkFfQVRUUklCVVRFIGVBdHRyLCBYRkFfQVRUUklCVVRFRU5VTSBlVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gU2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpZVZhbHVlLCBiTm90aWZ5KTsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCVRyeUVudW0oWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURUVOVU0gJmVWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQlHZXRFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIpDQorICAgIHsNCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsNCisgICAgICAgIHJldHVybiBUcnlFbnVtKGVBdHRyLCBlVmFsdWUsIFRSVUUpID8gZVZhbHVlIDogWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgICAgfQ0KKyAgICBGWF9CT09MCQkJCVNldENEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UpOw0KKyAgICBGWF9CT09MCQkJCVNldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJCQlUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUsIEZYX0JPT0wgYlByb3RvID0gVFJVRSk7DQorICAgIEZYX0JPT0wJCQkJVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSwgRlhfQk9PTCBiUHJvdG8gPSBUUlVFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDCQlHZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyKQ0KKyAgICB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZTsNCisgICAgICAgIHJldHVybiBUcnlDRGF0YShlQXR0ciwgd3NWYWx1ZSkgPyB3c1ZhbHVlIDogQ0ZYX1dpZGVTdHJpbmdDKCk7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCQlTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICAgIEZYX0JPT0wJCQkJVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBDWEZBX01lYXN1cmVtZW50ICZtVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgICAgQ1hGQV9NZWFzdXJlbWVudAlHZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIpDQorICAgIHsNCisgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlOw0KKyAgICAgICAgcmV0dXJuIFRyeU1lYXN1cmUoZUF0dHIsIG1WYWx1ZSwgVFJVRSkgPyBtVmFsdWUgOiBDWEZBX01lYXN1cmVtZW50KCk7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCQlTZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfTFBWT0lEIHBEYXRhLCBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCQkJVHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0xQVk9JRCAmcERhdGEpOw0KKyAgICBGWF9MUFZPSUQJCQlHZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0cikNCisgICAgew0KKyAgICAgICAgRlhfTFBWT0lEIHBEYXRhOw0KKyAgICAgICAgcmV0dXJuIFRyeU9iamVjdChlQXR0ciwgcERhdGEpID8gcERhdGEgOiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0JPT0wJCQkJU2V0VXNlckRhdGEoRlhfTFBWT0lEIHBLZXksIEZYX0xQVk9JRCBwRGF0YSwgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IE5VTEwpOw0KKyAgICBGWF9CT09MCQkJCVRyeVVzZXJEYXRhKEZYX0xQVk9JRCBwS2V5LCBGWF9MUFZPSUQgJnBEYXRhLCBGWF9CT09MIGJQcm90b0Fsc28gPSBGQUxTRSk7DQorICAgIEZYX0xQVk9JRAkJCUdldFVzZXJEYXRhKEZYX0xQVk9JRCBwS2V5LCBGWF9CT09MIGJQcm90b0Fsc28gPSBGQUxTRSkNCisgICAgew0KKyAgICAgICAgRlhfTFBWT0lEIHBEYXRhOw0KKyAgICAgICAgcmV0dXJuIFRyeVVzZXJEYXRhKHBLZXksIHBEYXRhLCBiUHJvdG9BbHNvKSA/IHBEYXRhIDogTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqCQkJR2V0UHJvcGVydHkoRlhfSU5UMzIgaW5kZXgsIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwgRlhfQk9PTCBiQ3JlYXRlUHJvcGVydHkgPSBUUlVFKTsNCisgICAgRlhfSU5UMzIJCQlDb3VudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCAgRlhfQk9PTCBiT25seUNoaWxkID0gRkFMU0UpOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0Q2hpbGQoRlhfSU5UMzIgaW5kZXgsIFhGQV9FTEVNRU5UIGVFbGVtZW50LCAgRlhfQk9PTCBiT25seUNoaWxkID0gRkFMU0UpOw0KKyAgICBGWF9JTlQzMgkJCUluc2VydENoaWxkKEZYX0lOVDMyIGluZGV4LCBDWEZBX05vZGUgKnBOb2RlKTsNCisgICAgRlhfQk9PTAkJCQlJbnNlcnRDaGlsZChDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCQkJUmVtb3ZlQ2hpbGQoQ1hGQV9Ob2RlICpwTm9kZSwgRlhfQk9PTCBiTm90aWZ5ID0gVFJVRSk7DQorICAgIENYRkFfTm9kZSoJCQlDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJCUdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTSBlSXRlbSwgWEZBX09CSkVDVFRZUEUgZVR5cGUpIGNvbnN0Ow0KKyAgICBGWF9JTlQzMgkJCUdldE5vZGVMaXN0KENYRkFfTm9kZUFycmF5ICZub2RlcywgRlhfRFdPUkQgZHdUeXBlRmlsdGVyID0gWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gfCBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzLCBYRkFfRUxFTUVOVCBlRWxlbWVudEZpbHRlciA9IFhGQV9FTEVNRU5UX1VOS05PV04sIEZYX0lOVDMyIGlMZXZlbCA9IDEpOw0KKyAgICBDWEZBX05vZGUqCQkJQ3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIEZYX0RXT1JEIGR3RmxhZ3MgPSBYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICBDWEZBX05vZGUqCQkJQ2xvbmVUZW1wbGF0ZVRvRm9ybShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0VGVtcGxhdGVOb2RlKCk7DQorICAgIHZvaWQJCQkJU2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSk7DQorICAgIENYRkFfTm9kZSoJCQlHZXREYXRhRGVzY3JpcHRpb25Ob2RlKCk7DQorICAgIHZvaWQJCQkJU2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCisgICAgQ1hGQV9Ob2RlKgkJCUdldEJpbmREYXRhKCk7DQorICAgIEZYX0lOVDMyCQkJR2V0QmluZEl0ZW1zKENYRkFfTm9kZUFycmF5JiBmb3JtSXRlbXMpOw0KKyAgICBGWF9JTlQzMgkJCUFkZEJpbmRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgICAgRlhfSU5UMzIJCQlSZW1vdmVCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQorICAgIEZYX0JPT0wJCQkJSGFzQmluZEl0ZW0oKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhKglHZXRXaWRnZXREYXRhKCk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSoJR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICBGWF9CT09MCQkJCUdldExvY2FsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlTmFtZSk7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNCUdldEludGFjdCgpOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0Rmlyc3RDaGlsZEJ5TmFtZShGWF9XU1RSIHdzTm9kZU5hbWUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQkJR2V0Rmlyc3RDaGlsZEJ5TmFtZShGWF9EV09SRCBkd05vZGVOYW1lSGFzaCkgY29uc3Q7DQorICAgIENYRkFfTm9kZSoJCQlHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVCBlTm9kZUNsYXNzKSBjb25zdDsNCisgICAgQ1hGQV9Ob2RlKgkJCUdldE5leHRTYW1lTmFtZVNpYmxpbmcoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQkJR2V0TmV4dFNhbWVOYW1lU2libGluZyhGWF9XU1RSIHdzTm9kZU5hbWUpIGNvbnN0Ow0KKyAgICBDWEZBX05vZGUqCQkJR2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlQgZU5vZGVDbGFzcykgY29uc3Q7DQorICAgIEZYX0lOVDMyCQkJR2V0Tm9kZVNhbWVOYW1lSW5kZXgoKSBjb25zdDsNCisgICAgRlhfSU5UMzIJCQlHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSBjb25zdDsNCisgICAgdm9pZAkJCQlHZXRTT01FeHByZXNzaW9uKENGWF9XaWRlU3RyaW5nJiB3c1NPTUV4cHJlc3Npb24pOw0KKyAgICBDWEZBX05vZGUqCQkJR2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKTsNCisNCisNCisgICAgQ1hGQV9Ob2RlKgkJCUdldE9jY3VyTm9kZSgpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJCQkJU2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uLCBGWF9EV09SRCBkd0ZsYWcsIENYRkFfTm9kZSogcmVmTm9kZSA9IE5VTEwpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJCQkJU2NyaXB0X1RyZWVDbGFzc19Ob2RlcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfVHJlZUNsYXNzX1BhcmVudChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfVHJlZUNsYXNzX0NsYXNzSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfVHJlZUNsYXNzX1NvbUV4cHJlc3Npb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0FwcGx5WFNMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0Nsb25lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfR2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0lzUHJvcGVydHlTcGVjaWZpZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJCQkJU2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJCQkJU2NyaXB0X05vZGVDbGFzc19OcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJCQkJU2NyaXB0X05vZGVDbGFzc19Jc051bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX09uZU9mQ2hpbGQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0NvbnRhaW5lckNsYXNzX0dldERlbHRhcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTW9kZWxDbGFzc19DbGVhckVycm9yTGlzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTW9kZWxDbGFzc19DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRGVsdGFfUmVzdG9yZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRGVsdGFfQ3VycmVudFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRGVsdGFfVGFyZ2V0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZShGWF9MUFZPSUQgZUF0dHJpYnV0ZSwgRlhfTFBWT0lEIGVWYWx1ZSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KTsNCisgICAgdm9pZAlTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfQXR0cmlidXRlX0ludGVnZXJSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9CT09MKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9CT09MUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmdSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfQm9vbGVhbl9WYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkICAgU2NyaXB0X1NvbV9NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9TT01fTUVTU0FHRVRZUEUgaU1lc3NhZ2VUeXBlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfU29tX0JvcmRlckNvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9Cb3JkZXJXaWR0aChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Tb21fRmlsbENvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9EYXRhTm9kZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCQkJCVNjcmlwdF9Tb21fRm9udENvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9NYW5kYXRvcnkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfU29tX01hbmRhdG9yeU1lc3NhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAkJCQlTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRmllbGRfRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0ZpZWxkX0VkaXRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9Gb3JtYXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0ZpZWxkX0Zvcm1hdHRlZFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0ZpZWxkX1BhcmVudFN1YmZvcm0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9DbGVhckl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0ZpZWxkX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9EZWxldGVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9HZXRTYXZlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRmllbGRfQm91bmRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9HZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0ZpZWxkX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0ZpZWxkX1NldEl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9HZXREaXNwbGF5SXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRmllbGRfU2V0SXRlbVN0YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9BZGRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9GaWVsZF9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0V4Y2xHcm91cF9EZWZhdWx0QW5kUmF3VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0V4Y2xHcm91cF9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0V4Y2xHcm91cF9TZWxlY3RlZE1lbWJlcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRXhjbEdyb3VwX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9FeGNsR3JvdXBfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU3ViZm9ybV9JbnN0YW5jZU1hbmFnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfU3ViZm9ybV9Mb2NhbGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfU3ViZm9ybV9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU3ViZm9ybV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fR2V0SW52YWxpZE9iamVjdHMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorDQorICAgIEZYX0lOVDMyIFN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpOw0KKyAgICB2b2lkCVNjcmlwdF9UZW1wbGF0ZV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1RlbXBsYXRlX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1RlbXBsYXRlX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfVGVtcGxhdGVfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfVGVtcGxhdGVfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9NYW5pZmVzdF9FdmFsdWF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0NvdW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9BZGRJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0luc2VydEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICBGWF9JTlQzMiBJbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKEZYX0lOVDMyIGlDb3VudCk7DQorICAgIEZYX0lOVDMyIEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoRlhfSU5UMzIgaVRvLCBGWF9JTlQzMiBpRnJvbSk7DQorICAgIHZvaWQJU2NyaXB0X09jY3VyX01heChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9PY2N1cl9NaW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRGVzY19NZXRhZGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRm9ybV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0Zvcm1fUmVtZXJnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRm9ybV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Gb3JtX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRm9ybV9DaGVja3N1bShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9QYWNrZXRfR2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9QYWNrZXRfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9QYWNrZXRfUmVtb3ZlQXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9QYWNrZXRfQ29udGVudChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfTmV4dChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU291cmNlX0NhbmNlbEJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfRmlyc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9VcGRhdGVCYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU291cmNlX1ByZXZpb3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfSXNCT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9Jc0VPRihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU291cmNlX0NhbmNlbChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU291cmNlX1VwZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfU291cmNlX09wZW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9EZWxldGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9BZGROZXcoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9SZXF1ZXJ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfUmVzeW5jKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfQ2xvc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9MYXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfSGFzRGF0YUNoYW5nZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9EYihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9YZmFfVGhpcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9IYW5kbGVyX1ZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfU3VibWl0Rm9ybWF0X01vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXh0cmFzX1R5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRW5jcnlwdF9Gb3JtYXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfU2NyaXB0X1N0YXRlbGVzcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KK3Byb3RlY3RlZDoNCisgICAgQ1hGQV9Ob2RlKENYRkFfRG9jdW1lbnQgKnBEb2MsIEZYX1dPUkQgZVBhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpOw0KKyAgICB+Q1hGQV9Ob2RlKCk7DQorICAgIGZyaWVuZCBjbGFzcyBDWEZBX0RvY3VtZW50Ow0KKyAgICBDWEZBX05vZGUqCQkJRGVwcmVjYXRlZF9HZXRQcmV2U2libGluZygpOw0KKyAgICBGWF9CT09MCQkJCVNldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLCBGWF9MUFZPSUQgcFZhbHVlLCBGWF9CT09MIGJOb3RpZnkpOw0KKyAgICBGWF9CT09MCQkJCUdldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLCBGWF9CT09MIGJVc2VEZWZhdWx0LCBGWF9MUFZPSUQgJnBWYWx1ZSk7DQorICAgIHZvaWQJCQkJT25SZW1vdmVkKENYRkFfTm9kZSAqcFBhcmVudCwgQ1hGQV9Ob2RlICpwUmVtb3ZlZCwgRlhfQk9PTCBiTm90aWZ5KTsNCisgICAgdm9pZAkJCQlPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0xQVk9JRCBwTmV3VmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7DQorICAgIHZvaWQJCQkJT25DaGFuZ2VkKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0xQVk9JRCBwTmV3VmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UpOw0KKyAgICBGWF9JTlQzMgkJCWV4ZWNTaW5nbGVFdmVudEJ5TmFtZShGWF9XU1RSIHdzRXZlbnROYW1lLCBYRkFfRUxFTUVOVCBlRWxlbWVudFR5cGUpOw0KKyAgICBGWF9CT09MCQkJCVNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLCBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJR2V0U2NyaXB0Q29udGVudChGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSk7DQorICAgIFhGQV9MUE1BUE1PRFVMRURBVEEJR2V0TWFwTW9kdWxlRGF0YShGWF9CT09MIGJDcmVhdGVOZXcpOw0KKyAgICB2b2lkCQkJCVNldE1hcE1vZHVsZVZhbHVlKEZYX0xQVk9JRCBwS2V5LCBGWF9MUFZPSUQgcFZhbHVlKTsNCisgICAgRlhfQk9PTAkJCQlHZXRNYXBNb2R1bGVWYWx1ZShGWF9MUFZPSUQgcEtleSwgRlhfTFBWT0lEICZwVmFsdWUpOw0KKyAgICB2b2lkCQkJCVNldE1hcE1vZHVsZVN0cmluZyhGWF9MUFZPSUQgcEtleSwgRlhfV1NUUiB3c1ZhbHVlKTsNCisgICAgRlhfQk9PTAkJCQlHZXRNYXBNb2R1bGVTdHJpbmcoRlhfTFBWT0lEIHBLZXksIENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZSk7DQorICAgIHZvaWQJCQkJU2V0TWFwTW9kdWxlQnVmZmVyKEZYX0xQVk9JRCBwS2V5LCBGWF9MUFZPSUQgcFZhbHVlLCBGWF9JTlQzMiBpQnl0ZXMsIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8gPSBOVUxMKTsNCisgICAgRlhfQk9PTAkJCQlHZXRNYXBNb2R1bGVCdWZmZXIoRlhfTFBWT0lEIHBLZXksIEZYX0xQVk9JRCAmcFZhbHVlLCBGWF9JTlQzMiAmaUJ5dGVzLCBGWF9CT09MIGJQcm90b0Fsc28gPSBUUlVFKTsNCisgICAgRlhfQk9PTAkJCQlIYXNNYXBNb2R1bGVLZXkoRlhfTFBWT0lEIHBLZXksIEZYX0JPT0wgYlByb3RvQWxzbyA9IEZBTFNFKTsNCisgICAgdm9pZAkJCQlSZW1vdmVNYXBNb2R1bGVLZXkoRlhfTFBWT0lEIHBLZXkgPSBOVUxMKTsNCisgICAgdm9pZAkJCQlNZXJnZUFsbERhdGEoRlhfTFBWT0lEIHBEc3RNb2R1bGUsIEZYX0JPT0wgYlVzZVNyY0F0dHIgPSBUUlVFKTsNCisgICAgdm9pZAkJCQlNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBEc3RNb2R1bGUsIEZYX0xQVk9JRCBwS2V5KTsNCisgICAgdm9pZAkJCQlNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBTcmNNb2R1bGUsIENYRkFfTm9kZSogcERzdE1vZHVsZSwgRlhfTFBWT0lEIHBLZXksIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IEZBTFNFKTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfTm9kZQkJCSptX3BOZXh0Ow0KKyAgICBDWEZBX05vZGUJCQkqbV9wQ2hpbGQ7DQorICAgIENYRkFfTm9kZQkJCSptX3BMYXN0Q2hpbGQ7DQorICAgIENYRkFfTm9kZQkJCSptX3BQYXJlbnQ7DQorICAgIElGREVfWE1MTm9kZQkJKm1fcFhNTE5vZGU7DQorICAgIFhGQV9FTEVNRU5UCQkJbV9lTm9kZUNsYXNzOw0KKyAgICBGWF9XT1JECQkJCW1fZVBhY2tldDsNCisgICAgRlhfRFdPUkQJCQltX2R3TmFtZUhhc2g7DQorICAgIENYRkFfTm9kZQkJCSptX3BBdXhOb2RlOw0KKyAgICBYRkFfTFBNQVBNT0RVTEVEQVRBCW1fcE1hcE1vZHVsZURhdGE7DQorfTsNCitjbGFzcyBDWEZBX09yZGluYXJ5T2JqZWN0IDogcHVibGljIENYRkFfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9PcmRpbmFyeU9iamVjdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KSA6IENYRkFfT2JqZWN0KHBEb2N1bWVudCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3QpLCBtX3VTY3JpcHRIYXNoKDApDQorICAgIHsNCisgICAgICAgIG1fZU5vZGVDbGFzcyA9IGVFbGVtZW50Ow0KKyAgICB9DQorICAgIFhGQV9FTEVNRU5UCQkJR2V0Q2xhc3NJRCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAoWEZBX0VMRU1FTlQpbV9lTm9kZUNsYXNzOw0KKyAgICB9DQorICAgIEZYX1VJTlQzMgkJCUdldFNjcmlwdE9iakhhc2goKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV91U2NyaXB0SGFzaDsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgWEZBX0VMRU1FTlQJCQltX2VOb2RlQ2xhc3M7DQorICAgIEZYX1VJTlQzMgkJCW1fdVNjcmlwdEhhc2g7DQorfTsNCitjbGFzcyBDWEZBX1RoaXNQcm94eSA6IHB1YmxpYyBDWEZBX09iamVjdA0KK3sNCitwdWJsaWMgOg0KKyAgICBDWEZBX1RoaXNQcm94eShDWEZBX05vZGUqIHBUaGlzTm9kZSwgQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSk6IENYRkFfT2JqZWN0KHBUaGlzTm9kZS0+R2V0RG9jdW1lbnQoKSwgWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcyksIG1fcFRoaXNOb2RlKE5VTEwpLCBtX3BTY3JpcHROb2RlKE5VTEwpDQorICAgIHsNCisgICAgICAgIG1fcFRoaXNOb2RlID0gcFRoaXNOb2RlOw0KKyAgICAgICAgbV9wU2NyaXB0Tm9kZSA9IHBTY3JpcHROb2RlOw0KKyAgICB9DQorICAgIHZpcnR1YWwgfkNYRkFfVGhpc1Byb3h5KCkge30NCisgICAgQ1hGQV9Ob2RlKiBHZXRUaGlzTm9kZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BUaGlzTm9kZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIEdldFNjcmlwdE5vZGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wU2NyaXB0Tm9kZTsNCisgICAgfQ0KK3ByaXZhdGU6DQorICAgIENYRkFfTm9kZSogbV9wVGhpc05vZGU7DQorICAgIENYRkFfTm9kZSogbV9wU2NyaXB0Tm9kZTsNCit9Ow0KK2NsYXNzIENYRkFfTm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX05vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICAgIHZpcnR1YWwgfkNYRkFfTm9kZUxpc3QoKSB7fQ0KKyAgICBYRkFfRUxFTUVOVAkJCUdldENsYXNzSUQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gWEZBX0VMRU1FTlRfTm9kZUxpc3Q7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKgkJCU5hbWVkSXRlbShGWF9XU1RSIHdzTmFtZSk7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0TGVuZ3RoKCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUFwcGVuZChDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZW1vdmUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJSXRlbShGWF9JTlQzMiBpSW5kZXgpID0gMDsNCisNCisgICAgdm9pZAlTY3JpcHRfTGlzdENsYXNzX0FwcGVuZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGlzdENsYXNzX0luc2VydChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGlzdENsYXNzX1JlbW92ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGlzdENsYXNzX0l0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorDQorICAgIHZvaWQJU2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MaXN0Q2xhc3NfTGVuZ3RoKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorfTsNCitjbGFzcyBDWEZBX0FycmF5Tm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9Ob2RlTGlzdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfQXJyYXlOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgICB2b2lkCVNldEFycmF5Tm9kZUxpc3QoY29uc3QgQ1hGQV9Ob2RlQXJyYXkgJnNyY0FycmF5KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMglHZXRMZW5ndGgoKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlbW92ZShDWEZBX05vZGUqIHBOb2RlKTsNCisgICAgdmlydHVhbCBDWEZBX05vZGUqCUl0ZW0oRlhfSU5UMzIgaUluZGV4KTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfTm9kZUFycmF5CW1fYXJyYXk7DQorfTsNCitjbGFzcyBDWEZBX0F0dGFjaE5vZGVMaXN0IDogcHVibGljIENYRkFfTm9kZUxpc3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0F0dGFjaE5vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwQXR0YWNoTm9kZSk7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJR2V0TGVuZ3RoKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJQXBwZW5kKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCUluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKTsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSZW1vdmUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICAgIHZpcnR1YWwgQ1hGQV9Ob2RlKglJdGVtKEZYX0lOVDMyIGlJbmRleCk7DQorcHJvdGVjdGVkOg0KKyAgICBDWEZBX05vZGUqCQltX3BBdHRhY2hOb2RlOw0KK307DQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGUNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwgRlhfTFBWT0lEIHBVc2VyRGF0YSA9IE5VTEwpDQorICAgIHsNCisgICAgICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgIH0NCisgICAgc3RhdGljIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBGWF9MUFZPSUQgcFVzZXJEYXRhID0gTlVMTCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgIH0NCisgICAgc3RhdGljIENYRkFfTm9kZSogR2V0UGFyZW50KENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwgRlhfTFBWT0lEIHBVc2VyRGF0YSA9IE5VTEwpDQorICAgIHsNCisgICAgICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgfQ0KK307DQordHlwZWRlZiBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+IENYRkFfQ29udGFpbmVySXRlcmF0b3I7DQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGUNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldE5leHRTaWJsaW5nKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldFBhcmVudChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgfQ0KK307DQordHlwZWRlZiBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IENYRkFfTm9kZUl0ZXJhdG9yOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFmMWU2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX1BBUlNFUl9IDQorI2RlZmluZSBfWEZBX1BBUlNFUl9IDQorY2xhc3MgSUZYX1N0cmVhbTsNCitjbGFzcyBJWEZBX1BhcnNlcg0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJWEZBX1BhcnNlcioJCQkJQ3JlYXRlKElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnksIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyID0gRkFMU0UpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQgKnBTdHJlYW0sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gWEZBX1hEUFBBQ0tFVF9YRFApID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCQlEb1BhcnNlKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCVBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NYTUwsIElGREVfWE1MTm9kZSogJnBYTUxOb2RlLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCQlDb25zdHJ1Y3RYRkFOb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUpID0gMDsNCisgICAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqCQlHZXRGYWN0b3J5KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQkJR2V0Um9vdE5vZGUoKSBjb25zdCA9IDA7DQorICAgIHZpcnR1YWwgSUZERV9YTUxEb2MqCQkJR2V0WE1MRG9jKCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJCUNsb3NlUGFyc2VyKCkgPSAwOw0KK307DQorY2xhc3MgSVhGQV9Eb2NQYXJzZXIgOiBwdWJsaWMgSVhGQV9QYXJzZXINCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgSVhGQV9Eb2NQYXJzZXIqCQkJQ3JlYXRlKElYRkFfTm90aWZ5ICpwTm90aWZ5KTsNCisgICAgdmlydHVhbCBDWEZBX0RvY3VtZW50KgkJCUdldERvY3VtZW50KCkgY29uc3QgPSAwOw0KKyAgICB2aXJ0dWFsIElYRkFfTm90aWZ5KgkJCUdldE5vdGlmeSgpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElYRkFfRGF0YUxvYWRlck9wdGlvbnNQcm92aWRlcg0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBJWEZBX0RhdGFMb2FkZXJPcHRpb25zUHJvdmlkZXIqCUNyZWF0ZShDWEZBX05vZGUqIHBDb25maWd1cmF0aW9uRE9NKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCQkJCVJlbGVhc2UoKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYjg0NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaApAQCAtMCwwICsxLDEwNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX1NDUklQVF9IDQorI2RlZmluZSBfRlhGQV9TQ1JJUFRfSA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuCQkJMHgwMDAxDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcwkJCTB4MDAwNA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMJCQkweDAwMDgNCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncwkJCTB4MDAyMA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX1BhcmVudAkJCQkweDAwNDANCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9BbnlDaGlsZAkJCTB4MDA4MA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0FMTAkJCQkJMHgwMTAwDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZQkJCTB4MDQwMA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0JpbmQgCQkJCTB4MDgwMA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0JpbmROZXcgCQkJMHgxMDAwDQorZW51bSBYRkFfU0NSSVBUTEFOR1RZUEUgew0KKyAgICBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMgPSBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYywNCisgICAgWEZBX1NDUklQVExBTkdUWVBFX0phdmFzY3JpcHQgPSBYRkFfU0NSSVBUVFlQRV9KYXZhc2NyaXB0LA0KKyAgICBYRkFfU0NSSVBUTEFOR1RZUEVfVW5rb3duID0gWEZBX1NDUklQVFRZUEVfVW5rb3duLA0KK307DQorZW51bSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUgew0KKyAgICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMsDQorICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGUsDQorICAgIFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZSwNCisgICAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsLA0KKyAgICBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVNaWRBbGwsDQorICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9FeGlzdE5vZGVzLA0KK307DQorY2xhc3MgQ1hGQV9IVkFMVUVBcnJheSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxGWEpTRV9IVkFMVUU+DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9IVkFMVUVBcnJheShGWEpTRV9IUlVOVElNRSBoUnVuVGltZSkgOiBtX2hSdW5UaW1lKGhSdW5UaW1lKSB7fTsNCisgICAgfkNYRkFfSFZBTFVFQXJyYXkoKQ0KKyAgICB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKEdldEF0KGkpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB2b2lkIEdldEF0dHJpYnV0ZU9iamVjdChDWEZBX09iakFycmF5JiBvYmpBcnJheSkNCisgICAgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IEdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KEdldEF0KGkpLCBOVUxMKTsNCisgICAgICAgICAgICBvYmpBcnJheS5BZGQocE9iamVjdCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfSFJVTlRJTUUJCW1faFJ1blRpbWU7DQorfTsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX1JFU09MVkVOT0RFX1JTIDogcHVibGljIENGWF9PYmplY3Qgew0KKyAgICBfWEZBX1JFU09MVkVOT0RFX1JTKCkgOiBkd0ZsYWdzKFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcyksIHBTY3JpcHRBdHRyaWJ1dGUoTlVMTCkgeyB9DQorICAgIH5fWEZBX1JFU09MVkVOT0RFX1JTKCkNCisgICAgew0KKyAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgR2V0QXR0cmlidXRlUmVzdWx0KENYRkFfSFZBTFVFQXJyYXkmIGhWYWx1ZUFycmF5KSBjb25zdA0KKyAgICB7DQorICAgICAgICBpZiAocFNjcmlwdEF0dHJpYnV0ZSAmJiBwU2NyaXB0QXR0cmlidXRlLT5lVmFsdWVUeXBlID09IFhGQV9TQ1JJUFRfT2JqZWN0KSB7DQorICAgICAgICAgICAgRlhKU0VfSFJVTlRJTUUgaFJ1blRpbWUgPSBoVmFsdWVBcnJheS5tX2hSdW5UaW1lOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBub2Rlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW5UaW1lKTsNCisgICAgICAgICAgICAgICAgKG5vZGVzW2ldLT4qKHBTY3JpcHRBdHRyaWJ1dGUtPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgRkFMU0UsIChYRkFfQVRUUklCVVRFKXBTY3JpcHRBdHRyaWJ1dGUtPmVBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgICAgICBoVmFsdWVBcnJheS5BZGQoaFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaFZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIENYRkFfT2JqQXJyYXkJCQkJbm9kZXM7DQorICAgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPCXBTY3JpcHRBdHRyaWJ1dGU7DQorICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRQkJZHdGbGFnczsNCit9IFhGQV9SRVNPTFZFTk9ERV9SUywgKiBYRkFfTFBSRVNPTFZFTk9ERV9SUzsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX0pTQlVJTFRJTklORk8gew0KKyAgICBGWF9VSU5UMzIJCQkJCQl1VW5pY29kZUhhc2g7DQorICAgIEZYX0xQQ1NUUgkJCQkJCXBOYW1lOw0KK30gWEZBX0pTQlVJTFRJTklORk8sICogWEZBX0xQSlNCVUlMVElOSU5GTzsNCit0eXBlZGVmIFhGQV9KU0JVSUxUSU5JTkZPIGNvbnN0ICogWEZBX0xQQ0pTQlVJTFRJTklORk87DQorWEZBX0xQQ0pTQlVJTFRJTklORk8gWEZBX0dldEpTQnVpbHRpbkJ5SGFzaChGWF9VSU5UMzIgdUhhc2hDb2RlKTsNCitjbGFzcyBJWEZBX1NjcmlwdENvbnRleHQNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQJUmVsZWFzZSgpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCUluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpID0gMDsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldEV2ZW50UGFyYW0oQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfRXZlbnRQYXJhbSoJR2V0RXZlbnRQYXJhbSgpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQlSdW5TY3JpcHQoWEZBX1NDUklQVExBTkdUWVBFIGVTY3JpcHRUeXBlLCBGWF9XU1RSIHdzU2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBDWEZBX09iamVjdCogcFRoaXNPYmplY3QgPSBOVUxMKSA9IDA7DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJUmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk5vZGUsIEZYX1dTVFIgd3NFeHByZXNzaW9uLCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsIEZYX0RXT1JEIGR3U3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuLCBDWEZBX05vZGUqIGJpbmROb2RlID0gTlVMTCkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYSlNFX0hWQUxVRQkJR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCUNhY2hlTGlzdChDWEZBX05vZGVMaXN0KiBwTGlzdCkgPSAwOw0KKyAgICB2aXJ0dWFsIENYRkFfT2JqZWN0KgkJR2V0VGhpc09iamVjdCgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWEpTRV9IUlVOVElNRQkJR2V0UnVudGltZSgpIGNvbnN0ID0gMDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldEluZGV4QnlOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkgPSAwOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0SW5kZXhCeUNsYXNzTmFtZShDWEZBX05vZGUqIHJlZk5vZGUpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCUdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NFeHByZXNzaW9uKSA9IDA7DQorDQorICAgIHZpcnR1YWwgdm9pZAkJCQlTZXROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZUFycmF5ICpwQXJyYXkpID0gMDsNCisgICAgdmlydHVhbCB2b2lkCQkJCUFkZE5vZGVzT2ZSdW5TY3JpcHQoY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIG5vZGVzKSA9IDA7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlBZGROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpID0gMDsNCisgICAgdmlydHVhbCBGWEpTRV9IQ0xBU1MJCUdldEpzZU5vcm1hbENsYXNzKCkgPSAwOw0KKyAgICB2aXJ0dWFsIFhGQV9TQ1JJUFRMQU5HVFlQRQlHZXRUeXBlKCkgPSAwOw0KKyAgICB2aXJ0dWFsCXZvaWQJCQkJQWRkSlNCdWlsdGluT2JqZWN0KFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWl0aW5PYmplY3QpID0gMDsNCisgICAgdmlydHVhbAl2b2lkCQkJCVNldFJ1bkF0VHlwZShYRkFfQVRUUklCVVRFRU5VTSBlUnVuQXQpID0gMDsNCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUlzUnVuQXRDbGllbnQoKSA9IDA7DQorfTsNCitJWEZBX1NjcmlwdENvbnRleHQqIFhGQV9TY3JpcHRDb250ZXh0X0NyZWF0ZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MWZmNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oCkBAIC0wLDAgKzEsMjM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9VVElMU19IXw0KKyNkZWZpbmUgX1hGQV9VVElMU19IXw0KK0ZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKElGREVfWE1MRWxlbWVudCogcE5vZGUsIEZYX1dTVFIgd3NRdWFsaWZpZXIsIENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSk7DQordGVtcGxhdGUgPGNsYXNzIE5vZGVUeXBlLCBjbGFzcyBUcmF2ZXJzZVN0cmF0ZWd5Pg0KK2NsYXNzIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGUoTm9kZVR5cGUqIHBSb290Tm9kZSA9IE5VTEwpDQorICAgICAgICA6IG1fcFJvb3QocFJvb3ROb2RlKQ0KKyAgICB7DQorICAgICAgICBpZihwUm9vdE5vZGUpIHsNCisgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBJbml0KE5vZGVUeXBlKiBwUm9vdE5vZGUpDQorICAgIHsNCisgICAgICAgIGlmKCFwUm9vdE5vZGUpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBtX3BSb290ID0gcFJvb3ROb2RlOw0KKyAgICAgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICB2b2lkIENsZWFyKCkNCisgICAgew0KKyAgICAgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgdm9pZCBSZXNldCgpDQorICAgIHsNCisgICAgICAgIENsZWFyKCk7DQorICAgICAgICBpZiAobV9wUm9vdCkgew0KKyAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wUm9vdCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBTZXRDdXJyZW50KE5vZGVUeXBlKiBwQ3VyTm9kZSkNCisgICAgew0KKyAgICAgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgICAgICBpZihwQ3VyTm9kZSkgew0KKyAgICAgICAgICAgIENGWF9TdGFja1RlbXBsYXRlPE5vZGVUeXBlKj4gcmV2U3RhY2s7DQorICAgICAgICAgICAgTm9kZVR5cGUqIHBOb2RlOw0KKyAgICAgICAgICAgIGZvcihwTm9kZSA9IHBDdXJOb2RlOyBwTm9kZSAmJiBwTm9kZSAhPSBtX3BSb290OyBwTm9kZSA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldFBhcmVudChwTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgcmV2U3RhY2suUHVzaChwTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldlN0YWNrLlB1c2gobV9wUm9vdCk7DQorICAgICAgICAgICAgd2hpbGUocmV2U3RhY2suR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2goKnJldlN0YWNrLkdldFRvcEVsZW1lbnQoKSk7DQorICAgICAgICAgICAgICAgIHJldlN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIE5vZGVUeXBlKiBHZXRDdXJyZW50KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fTm9kZVN0YWNrLkdldFNpemUoKSA/ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCkgOiBOVUxMOw0KKyAgICB9DQorICAgIE5vZGVUeXBlKiBHZXRSb290KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFJvb3Q7DQorICAgIH0NCisgICAgTm9kZVR5cGUqIE1vdmVUb1ByZXYoKQ0KKyAgICB7DQorICAgICAgICBOb2RlVHlwZSAqcEN1cnJlbnQgPSBHZXRDdXJyZW50KCk7DQorICAgICAgICBGWF9JTlQzMiBuU3RhY2tMZW5ndGggPSBtX05vZGVTdGFjay5HZXRTaXplKCk7DQorICAgICAgICBpZihuU3RhY2tMZW5ndGggPT0gMSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfSBlbHNlIGlmKG5TdGFja0xlbmd0aCA+IDEpIHsNCisgICAgICAgICAgICBOb2RlVHlwZSAqcEN1ckl0ZW0gPSAqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgIE5vZGVUeXBlICpwUGFyZW50SXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgTm9kZVR5cGUgKnBQYXJlbnRGaXJzdENoaWxkSXRlbSA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQocFBhcmVudEl0ZW0pOw0KKyAgICAgICAgICAgIGlmKHBDdXJJdGVtID09IHBQYXJlbnRGaXJzdENoaWxkSXRlbSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcFBhcmVudEl0ZW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIE5vZGVUeXBlICpwUHJldkl0ZW0gPSBwUGFyZW50Rmlyc3RDaGlsZEl0ZW0sICpwUHJldkl0ZW1OZXh0ID0gTlVMTDsNCisgICAgICAgICAgICBmb3IoOyBwUHJldkl0ZW07IHBQcmV2SXRlbSA9IHBQcmV2SXRlbU5leHQpIHsNCisgICAgICAgICAgICAgICAgcFByZXZJdGVtTmV4dCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKHBQcmV2SXRlbSk7DQorICAgICAgICAgICAgICAgIGlmKCFwUHJldkl0ZW1OZXh0IHx8IHBQcmV2SXRlbU5leHQgPT0gcEN1ckl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocFByZXZJdGVtKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgaWYobV9wUm9vdCkgew0KKyAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcFJvb3QpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKG1fTm9kZVN0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICBOb2RlVHlwZSAqcENoaWxkSXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgd2hpbGUoKHBDaGlsZEl0ZW0gPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRGaXJzdENoaWxkKHBDaGlsZEl0ZW0pKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHdoaWxlKE5vZGVUeXBlICpwTmV4dEl0ZW0gPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZyhwQ2hpbGRJdGVtKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcENoaWxkSXRlbSA9IHBOZXh0SXRlbTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBDaGlsZEl0ZW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIE5vZGVUeXBlKiBNb3ZlVG9OZXh0KCkNCisgICAgew0KKyAgICAgICAgTm9kZVR5cGUgKipwcE5vZGUgPSBOVUxMOw0KKyAgICAgICAgTm9kZVR5cGUgKnBDdXJyZW50ID0gR2V0Q3VycmVudCgpOw0KKyAgICAgICAgd2hpbGUgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBpZiAocEN1cnJlbnQgIT0gKnBwTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICpwcE5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgTm9kZVR5cGUgKnBDaGlsZCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQoKnBwTm9kZSk7DQorICAgICAgICAgICAgICAgIGlmIChwQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChwQ2hpbGQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBOb2RlVHlwZSAqcE5leHQgPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZygqcHBOb2RlKTsNCisgICAgICAgICAgICAgICAgbV9Ob2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBOZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBOZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgTm9kZVR5cGUqIFNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKQ0KKyAgICB7DQorICAgICAgICBOb2RlVHlwZSAqKnBwTm9kZSA9IE5VTEw7DQorICAgICAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIE5vZGVUeXBlICpwTmV4dCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKCpwcE5vZGUpOw0KKyAgICAgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBOZXh0KSB7DQorICAgICAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocE5leHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gR2V0Q3VycmVudCgpOw0KKyAgICB9DQorcHJvdGVjdGVkOg0KKyAgICBOb2RlVHlwZQkJCQkJCSptX3BSb290Ow0KKyAgICBDRlhfU3RhY2tUZW1wbGF0ZTxOb2RlVHlwZSo+CW1fTm9kZVN0YWNrOw0KK307DQordGVtcGxhdGUgPGNsYXNzIEtleVR5cGU+DQorY2xhc3MgQ1hGQV9QdHJTZXRUZW1wbGF0ZSA6IHByaXZhdGUgQ0ZYX01hcFB0clRvUHRyDQorew0KK3B1YmxpYzoNCisNCisgICAgQ1hGQV9QdHJTZXRUZW1wbGF0ZSgpIDogQ0ZYX01hcFB0clRvUHRyKDEwKSB7fQ0KKw0KKyAgICBpbnQgR2V0Q291bnQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpHZXRDb3VudCgpOw0KKyAgICB9DQorDQorDQorICAgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBDRlhfTWFwUHRyVG9QdHI6OklzRW1wdHkoKTsNCisgICAgfQ0KKw0KKyAgICBGWF9CT09MCUxvb2t1cChLZXlUeXBlIGtleSkgY29uc3QNCisgICAgew0KKyAgICAgICAgRlhfTFBWT0lEIHBWYWx1ZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpMb29rdXAoKHZvaWQqKWtleSwgcFZhbHVlKTsNCisgICAgfQ0KKw0KKyAgICBGWF9CT09MIG9wZXJhdG9yW10oS2V5VHlwZSBrZXkpDQorICAgIHsNCisgICAgICAgIHJldHVybiBMb29rdXAoa2V5KTsNCisgICAgfQ0KKw0KKyAgICB2b2lkIEFkZChLZXlUeXBlIGtleSkNCisgICAgew0KKyAgICAgICAgQ0ZYX01hcFB0clRvUHRyOjpTZXRBdCgodm9pZCopa2V5LCAodm9pZCopa2V5KTsNCisgICAgfQ0KKw0KKyAgICBGWF9CT09MCVJlbW92ZUtleShLZXlUeXBlIGtleSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KCh2b2lkKilrZXkpOw0KKyAgICB9DQorDQorICAgIHZvaWQgUmVtb3ZlQWxsKCkNCisgICAgew0KKyAgICAgICAgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVBbGwoKTsNCisgICAgfQ0KKw0KKyAgICBGWF9QT1NJVElPTiBHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6R2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB9DQorDQorICAgIHZvaWQgR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCBLZXlUeXBlJiByS2V5KSBjb25zdA0KKyAgICB7DQorICAgICAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgICAgICAgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQorICAgICAgICBDRlhfTWFwUHRyVG9QdHI6OkdldE5leHRBc3NvYyhyTmV4dFBvc2l0aW9uLCBwS2V5LCBwVmFsdWUpOw0KKyAgICAgICAgcktleSA9IChLZXlUeXBlKShGWF9VSU5UUFRSKXBLZXk7DQorICAgIH0NCit9Ow0KK2NsYXNzIENYRkFfTm9kZTsNCitjbGFzcyBDWEZBX1dpZGdldERhdGE7DQorI2luY2x1ZGUgImZ4ZmFfbG9jYWxldmFsdWUuaCINCitDWEZBX05vZGUqCQkJWEZBX0NyZWF0ZVVJQ2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0VMRU1FTlQmIGVXaWRnZXRUeXBlKTsNCitDWEZBX0xvY2FsZVZhbHVlCVhGQV9HZXRMb2NhbGVWYWx1ZShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhKTsNCitDRlhfV2lkZVN0cmluZwkJWEZBX051bWVyaWNMaW1pdChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgRlhfSU5UMzIgaUxlYWQsIEZYX0lOVDMyIGlUcmVhZCk7DQorRlhfRE9VQkxFIFhGQV9XaWRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyaW5nVmFsKTsNCitGWF9ET1VCTEUgWEZBX0J5dGVTdHJpbmdUb0RvdWJsZShGWF9CU1RSIHN6U3RyaW5nVmFsKTsNCisjaWZuZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCisjZGVmaW5lIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCisjZW5kaWYNCitGWF9CT09MIFhGQV9SZWNvZ25pemVSaWNoVGV4dChJRkRFX1hNTEVsZW1lbnQqIHBSaWNoVGV4dFhNTE5vZGUpOw0KK3ZvaWQJWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NQbGFpblRleHQpOw0KK0ZYX0JPT0wgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3goQ1hGQV9Ob2RlKiBwRmllbGROb2RlKTsNCitJRlhfU3RyZWFtKiBYRkFfQ3JlYXRlV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0J1ZmZlcik7DQorRlhfQk9PTAkJWEZBX0lzTGF5b3V0RWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfQk9PTCBiTGF5b3V0Q29udGFpbmVyID0gRkFMU0UpOw0KK0ZYX0JPT0wJCVhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKTsNCitGWF9CT09MCQlYRkFfSXNGbG93aW5nTGF5b3V0KFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQpOw0KK0ZYX0JPT0wJCVhGQV9Jc0hvcml6b250YWxGbG93KFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQpOw0KK3ZvaWQJCVhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKENYRkFfTm9kZSAqcERhdGFOb2RlKTsNCit2b2lkCQlYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZShDWEZBX05vZGUqIHBOb2RlLCBJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9MUENTVFIgcENoZWNrc3VtID0gTlVMTCwgRlhfQk9PTCBiU2F2ZVhNTCA9IEZBTFNFKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1ZjI1MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCitzdGF0aWMgRlhfTFBDV1NUUiBnc19scFN0ckVycm9yTXNnSW5mb1tdID0gew0KKyAgICAoRlhfTFBDV1NUUikoTCJ1bnN1cHBvcnRlZCBjaGFyICclYyciKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwiYmFkIHN1ZmZpeCBvbiBudW1iZXIiKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwiaW52YWxpZGF0ZSBjaGFyICclYyciKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwiZXhwZWN0ZWQgaWRlbnRpZmllciBpbnN0ZWFkIG9mICclcyciKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwiZXhwZWN0ZWQgJyVzJyBpbnN0ZWFkIG9mICclcyciKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwiZXhwZWN0ZWQgJ2VuZGlmJyBpbnN0ZWFkIG9mICclcyciKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwidW5leHBlY3RlZCBleHByZXNzaW9uICclcyciKSwNCisgICAgKEZYX0xQQ1dTVFIpKEwiZXhwZWN0ZWQgb3BlcmF0b3IgJyVzJyBpbnN0ZWFkIG9mICclcyciKSwNCit9Ow0KK0ZYX0xQQ1dTVFIgWEZBX0ZNX0Vycm9yTXNnKFhGQV9GTV9FUlJNU0cgbXNnKQ0KK3sNCisgICAgaWYobXNnIDwgRk1FUlJfTUFYSU1VTSkgew0KKyAgICAgICAgcmV0dXJuIGdzX2xwU3RyRXJyb3JNc2dJbmZvW21zZ107DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gKEZYX0xQQ1dTVFIpKEwiIik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuaCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMDI1MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk1fRVJST1JfSA0KKyNkZWZpbmUgX1hGQV9GTV9FUlJPUl9IDQorZW51bSBYRkFfRk1fRVJSTVNHIHsNCisgICAgRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwNCisgICAgRk1FUlJfQkFEX1NVRkZJWF9OVU1CRVIsDQorICAgIEZNRVJSX0lOVkFMSURBVEVfQ0hBUiwNCisgICAgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwNCisgICAgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgIEZNRVJSX0VYUEVDVEVEX0lGRU5ELA0KKyAgICBGTUVSUl9VTkVYUEVDVEVEX0VYUFJFU1NJT04sDQorICAgIEZNRVJSX0VYUFRFQ1RFRF9PUEVSQVRPUiwNCisgICAgRk1FUlJfTUFYSU1VTQ0KK307DQorY2xhc3MgQ1hGQV9GTUVycm9ySW5mbyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTUVycm9ySW5mbygpIDogbGluZW51bSgwKSB7fTsNCisgICAgfkNYRkFfRk1FcnJvckluZm8oKSB7fTsNCisgICAgRlhfRFdPUkQgbGluZW51bTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbWVzc2FnZTsNCit9Ow0KK0ZYX0xQQ1dTVFIgWEZBX0ZNX0Vycm9yTXNnKCBYRkFfRk1fRVJSTVNHIG1zZyk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjIzMGRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAKQEAgLTAsMCArMSw3MTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYV9mbTJqcy5oIg0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZ0MgUlVOVElNRUJMT0NLVEVNUEFSUkFZCQk9CUZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfYmxvY2tfdGVtcF9hcnJheSIpOw0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZ0MgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVgJPQlGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lX2Jsb2NrX3RlbXBfYXJyYXlfaW5kZXgiKTsNCitDWEZBX0ZNRXhwcmVzc2lvbjo6Q1hGQV9GTUV4cHJlc3Npb24oIEZYX0RXT1JEIGxpbmUgKQ0KKyAgICA6IG1fbGluZShsaW5lKSwgbV90eXBlKFhGQV9GTV9FWFBUWVBFX1VOS05PV04pDQorew0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbjo6Q1hGQV9GTUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX0VYUFRZUEUgdHlwZSkNCisgICAgOiBtX2xpbmUobGluZSksIG1fdHlwZSh0eXBlKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZNRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7fQ0KK3ZvaWQgQ1hGQV9GTUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7fQ0KK0NYRkFfRk1GdW5jdGlvbkRlZmluaXRpb246OkNYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oIEZYX0RXT1JEIGxpbmUsIEZYX0JPT0wgaXNHbG9iYWwsIEZYX1dTVFIgd3NOYW1lLCBDRlhfV2lkZVN0cmluZ0NBcnJheSAqcEFyZ3VtZW50cywgQ0ZYX1B0ckFycmF5ICpwRXhwcmVzc2lvbnMgKQ0KKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0ZVTkMpLA0KKyAgICAgIG1faXNHbG9iYWwoaXNHbG9iYWwpLA0KKyAgICAgIG1fd3NOYW1lKHdzTmFtZSksDQorICAgICAgbV9wQXJndW1lbnRzKHBBcmd1bWVudHMpLA0KKyAgICAgIG1fcEV4cHJlc3Npb25zKHBFeHByZXNzaW9ucykNCit7DQorfQ0KK0NYRkFfRk1GdW5jdGlvbkRlZmluaXRpb246On5DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKCkNCit7DQorICAgIGlmIChtX3BBcmd1bWVudHMpIHsNCisgICAgICAgIG1fcEFyZ3VtZW50cy0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgbV9wQXJndW1lbnRzOw0KKyAgICAgICAgbV9wQXJndW1lbnRzID0gMDsNCisgICAgfQ0KKyAgICBpZiAobV9wRXhwcmVzc2lvbnMpIHsNCisgICAgICAgIEZYX0lOVDMyIGV4cGMgPSBtX3BFeHByZXNzaW9ucy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KKyAgICAgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KKyAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKiltX3BFeHByZXNzaW9ucy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9DQorICAgICAgICBtX3BFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQorICAgICAgICBkZWxldGUgbV9wRXhwcmVzc2lvbnM7DQorICAgICAgICBtX3BFeHByZXNzaW9ucyA9IDA7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgaWYgKG1faXNHbG9iYWwgJiYgKCFtX3BFeHByZXNzaW9ucyB8fCBtX3BFeHByZXNzaW9ucy0+R2V0U2l6ZSgpID09IDApKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLy8gY29tbWVudHMgb25seSIpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKG1faXNHbG9iYWwpIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoXG4iKTsNCisgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZnVuY3Rpb24gIik7DQorICAgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBtX3dzTmFtZTsNCisgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBpZiAobV9wQXJndW1lbnRzICE9IDApIHsNCisgICAgICAgIEZYX0lOVDMyIGFyZ2MgPSBtX3BBcmd1bWVudHMtPkdldFNpemUoKTsNCisgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyBpZGVudGlmaWVyID0gMDsNCisgICAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCisgICAgICAgICAgICBpZGVudGlmaWVyID0gbV9wQXJndW1lbnRzLT5HZXRBdChpbmRleCk7DQorICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBpZGVudGlmaWVyLk1pZCgxKTsNCisgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGlkZW50aWZpZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQorICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG57XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IG51bGw7XG4iKTsNCisgICAgaWYgKG1fcEV4cHJlc3Npb25zKSB7DQorICAgICAgICBGWF9JTlQzMiBleHBjID0gbV9wRXhwcmVzc2lvbnMtPkdldFNpemUoKTsNCisgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCisgICAgICAgIHdoaWxlIChpbmRleCA8IGV4cGMpIHsNCisgICAgICAgICAgICBlID0gKENYRkFfRk1FeHByZXNzaW9uICopbV9wRXhwcmVzc2lvbnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgZXhwYykgew0KKyAgICAgICAgICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZS0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInJldHVybiAiKTsNCisgICAgaWYgKG1faXNHbG9iYWwpIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbn1cbiIpOw0KKyAgICBpZihtX2lzR2xvYmFsKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKS5jYWxsKHRoaXMpO1xuIik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKQ0KK3t9DQorQ1hGQV9GTVZhckV4cHJlc3Npb246OkNYRkFfRk1WYXJFeHByZXNzaW9uKCBGWF9EV09SRCBsaW5lLCBGWF9XU1RSIHdzTmFtZSwgQ1hGQV9GTUV4cHJlc3Npb24gKnBJbml0ICkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9WQVIpLA0KKyAgICAgIG1fd3NOYW1lKHdzTmFtZSksDQorICAgICAgbV9wSW5pdChwSW5pdCkNCit7DQorfQ0KK0NYRkFfRk1WYXJFeHByZXNzaW9uOjp+Q1hGQV9GTVZhckV4cHJlc3Npb24oKQ0KK3sNCisgICAgaWYgKG1fcEluaXQpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BJbml0Ow0KKyAgICAgICAgbV9wSW5pdCA9IDA7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNVmFyRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBOYW1lID0gbV93c05hbWU7DQorICAgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgICAgICB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBpZiAobV9wSW5pdCkgew0KKyAgICAgICAgbV9wSW5pdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhWQVJGSUxURVIpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbiIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiXCI7XG4iKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IG1fd3NOYW1lOw0KKyAgICBpZiAobV93c05hbWUuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgdGVtcE5hbWUgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c05hbWUuTWlkKDEpOw0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgaWYgKG1fcEluaXQpIHsNCisgICAgICAgIG1fcEluaXQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoVkFSRklMVEVSKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIlwiO1xuIik7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xuIik7DQorfQ0KK0NYRkFfRk1FeHBFeHByZXNzaW9uOjpDWEZBX0ZNRXhwRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHByZXNzaW9uICkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9FWFApLCBtX3BFeHByZXNzaW9uKHBFeHByZXNzaW9uKQ0KK3sNCit9DQorQ1hGQV9GTUV4cEV4cHJlc3Npb246On5DWEZBX0ZNRXhwRXhwcmVzc2lvbigpDQorew0KKyAgICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICAgICAgZGVsZXRlIG1fcEV4cHJlc3Npb247DQorICAgICAgICBtX3BFeHByZXNzaW9uID0gMDsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk1FeHBFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgaWYgKG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0thc3NpZ24pIHsNCisgICAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk1FeHBFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBpZiAobV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2Fzc2lnbikgew0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiggbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS3N0YXIgfHwNCisgICAgICAgICAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdHN0YXIgfHwNCisgICAgICAgICAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdHNjcmVhbSB8fA0KKyAgICAgICAgICAgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90ZG90IHx8DQorICAgICAgICAgICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3QNCisgICAgICAgICAgKSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICAgICAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xuIik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICAgICAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xuIik7DQorICAgICAgICB9DQorICAgIH0NCit9DQorQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6Q1hGQV9GTUJsb2NrRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfUHRyQXJyYXkgKnBFeHByZXNzaW9uTGlzdCApDQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQkxPQ0spLA0KKyAgICAgIG1fcEV4cHJlc3Npb25MaXN0KHBFeHByZXNzaW9uTGlzdCkNCit7DQorfQ0KK0NYRkFfRk1CbG9ja0V4cHJlc3Npb246On5DWEZBX0ZNQmxvY2tFeHByZXNzaW9uKCkNCit7DQorICAgIGlmIChtX3BFeHByZXNzaW9uTGlzdCkgew0KKyAgICAgICAgRlhfSU5UMzIgZXhwYyA9IG1fcEV4cHJlc3Npb25MaXN0LT5HZXRTaXplKCk7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgICAgICB3aGlsZSAoaW5kZXggPCBleHBjKSB7DQorICAgICAgICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiAqKW1fcEV4cHJlc3Npb25MaXN0LT5HZXRBdChpbmRleCk7DQorICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEV4cHJlc3Npb25MaXN0LT5SZW1vdmVBbGwoKTsNCisgICAgICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uTGlzdDsNCisgICAgICAgIG1fcEV4cHJlc3Npb25MaXN0ID0gMDsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk1CbG9ja0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICAgIGlmIChtX3BFeHByZXNzaW9uTGlzdCkgew0KKyAgICAgICAgRlhfSU5UMzIgZXhwYyA9IG1fcEV4cHJlc3Npb25MaXN0LT5HZXRTaXplKCk7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgICAgICB3aGlsZSAoaW5kZXggPCBleHBjKSB7DQorICAgICAgICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiAqKW1fcEV4cHJlc3Npb25MaXN0LT5HZXRBdChpbmRleCk7DQorICAgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KK30NCit2b2lkIENYRkFfRk1CbG9ja0V4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG4iKTsNCisgICAgaWYgKG1fcEV4cHJlc3Npb25MaXN0KSB7DQorICAgICAgICBGWF9JTlQzMiBleHBjID0gbV9wRXhwcmVzc2lvbkxpc3QtPkdldFNpemUoKTsNCisgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCisgICAgICAgIHdoaWxlIChpbmRleCA8IGV4cGMpIHsNCisgICAgICAgICAgICBlID0gKENYRkFfRk1FeHByZXNzaW9uICopbV9wRXhwcmVzc2lvbkxpc3QtPkdldEF0KGluZGV4KTsNCisgICAgICAgICAgICBpZiAoaW5kZXggKyAxID09IGV4cGMpIHsNCisgICAgICAgICAgICAgICAgZS0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCit9DQorQ1hGQV9GTURvRXhwcmVzc2lvbjo6Q1hGQV9GTURvRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSwgQ1hGQV9GTUV4cHJlc3Npb24gKnBMaXN0ICkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lKSwNCisgICAgICBtX3BMaXN0KHBMaXN0KQ0KK3sNCit9DQorQ1hGQV9GTURvRXhwcmVzc2lvbjo6fkNYRkFfRk1Eb0V4cHJlc3Npb24oKQ0KK3sNCisgICAgaWYgKG1fcExpc3QpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BMaXN0Ow0KKyAgICAgICAgbV9wTGlzdCA9IDA7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNRG9FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KK30NCit2b2lkIENYRkFfRk1Eb0V4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIG1fcExpc3QtPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KK30NCitDWEZBX0ZNSWZFeHByZXNzaW9uOjpDWEZBX0ZNSWZFeHByZXNzaW9uKCBGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cHJlc3Npb24sIENYRkFfRk1FeHByZXNzaW9uICpwSWZFeHByZXNzaW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcEVsc2VFeHByZXNzaW9uICkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9JRiksDQorICAgICAgbV9wRXhwcmVzc2lvbihwRXhwcmVzc2lvbiksDQorICAgICAgbV9wSWZFeHByZXNzaW9uKHBJZkV4cHJlc3Npb24pLA0KKyAgICAgIG1fcEVsc2VFeHByZXNzaW9uKHBFbHNlRXhwcmVzc2lvbikNCit7DQorfQ0KK0NYRkFfRk1JZkV4cHJlc3Npb246On5DWEZBX0ZNSWZFeHByZXNzaW9uKCkNCit7DQorICAgIGlmIChtX3BFeHByZXNzaW9uKSB7DQorICAgICAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCisgICAgICAgIG1fcEV4cHJlc3Npb24gPSAwOw0KKyAgICB9DQorICAgIGlmIChtX3BJZkV4cHJlc3Npb24pIHsNCisgICAgICAgIGRlbGV0ZSBtX3BJZkV4cHJlc3Npb247DQorICAgICAgICBtX3BJZkV4cHJlc3Npb24gPSAwOw0KKyAgICB9DQorICAgIGlmIChtX3BFbHNlRXhwcmVzc2lvbikgew0KKyAgICAgICAgZGVsZXRlIG1fcEVsc2VFeHByZXNzaW9uOw0KKyAgICAgICAgbV9wRWxzZUV4cHJlc3Npb24gPSAwOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICAgIGlmIChtX3BFeHByZXNzaW9uKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKVxuIik7DQorICAgIGlmIChtX3BJZkV4cHJlc3Npb24pIHsNCisgICAgICAgIG1fcElmRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICB9DQorICAgIGlmIChtX3BFbHNlRXhwcmVzc2lvbikgew0KKyAgICAgICAgaWYgKG1fcEVsc2VFeHByZXNzaW9uLT5HZXRFeHBUeXBlKCkgPT0gWEZBX0ZNX0VYUFRZUEVfSUYpIHsNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxuIik7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgICAgICAgICAgIG1fcEVsc2VFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxuIik7DQorICAgICAgICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk1JZkV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICAgIGlmIChtX3BFeHByZXNzaW9uKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKVxuIik7DQorICAgIGlmIChtX3BJZkV4cHJlc3Npb24pIHsNCisgICAgICAgIG1fcElmRXhwcmVzc2lvbi0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICAgIH0NCisgICAgaWYgKG1fcEVsc2VFeHByZXNzaW9uKSB7DQorICAgICAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICAgICAgICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbiIpOw0KKyAgICAgICAgICAgIG1fcEVsc2VFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitDWEZBX0ZNTG9vcEV4cHJlc3Npb246On5DWEZBX0ZNTG9vcEV4cHJlc3Npb24oKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZNTG9vcEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KK30NCit2b2lkIENYRkFfRk1Mb29wRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikNCit7fQ0KK0NYRkFfRk1XaGlsZUV4cHJlc3Npb246OkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oIEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQ29uZGl0aW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcEV4cHJlc3Npb24gKQ0KKyAgICA6IENYRkFfRk1Mb29wRXhwcmVzc2lvbihsaW5lKSwNCisgICAgICBtX3BDb25kaXRpb24ocENvbmRpdGlvbiksDQorICAgICAgbV9wRXhwcmVzc2lvbihwRXhwcmVzc2lvbikNCit7DQorfQ0KK0NYRkFfRk1XaGlsZUV4cHJlc3Npb246On5DWEZBX0ZNV2hpbGVFeHByZXNzaW9uKCkNCit7DQorICAgIGlmIChtX3BDb25kaXRpb24pIHsNCisgICAgICAgIGRlbGV0ZSBtX3BDb25kaXRpb247DQorICAgICAgICBtX3BDb25kaXRpb24gPSAwOw0KKyAgICB9DQorICAgIGlmIChtX3BFeHByZXNzaW9uKSB7DQorICAgICAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCisgICAgICAgIG1fcEV4cHJlc3Npb24gPSAwOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSAoIik7DQorICAgIG1fcENvbmRpdGlvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKVxuIik7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCit9DQordm9pZCBDWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwid2hpbGUgKCIpOw0KKyAgICBtX3BDb25kaXRpb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbiIpOw0KKyAgICBtX3BFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCit9DQorQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6Q1hGQV9GTUJyZWFrRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKQ0KKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0JSRUFLKSwNCisgICAgICBtX3BFeHByZXNzaW9uKDApDQorew0KK30NCitDWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjp+Q1hGQV9GTUJyZWFrRXhwcmVzc2lvbigpDQorew0KK30NCit2b2lkIENYRkFfRk1CcmVha0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiYnJlYWs7XG4iKTsNCit9DQordm9pZCBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiYnJlYWs7XG4iKTsNCit9DQorQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6Q1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSApDQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQ09OVElOVUUpLA0KKyAgICAgIG1fcEV4cHJlc3Npb24oMCkNCit7DQorfQ0KK0NYRkFfRk1Db250aW51ZUV4cHJlc3Npb246On5DWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJjb250aW51ZTtcbiIpOw0KK30NCit2b2lkIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJjb250aW51ZTtcbiIpOw0KK30NCitDWEZBX0ZNRm9yRXhwcmVzc2lvbjo6Q1hGQV9GTUZvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgRlhfV1NUUiB3c1ZhcmlhbnQsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQXNzaWdubWVudCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBY2Nlc3NvciwgRlhfSU5UMzIgaURpcmVjdGlvbiwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBTdGVwLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcExpc3QpDQorICAgIDogQ1hGQV9GTUxvb3BFeHByZXNzaW9uKGxpbmUpLA0KKyAgICAgIG1fd3NWYXJpYW50KHdzVmFyaWFudCksDQorICAgICAgbV9wQXNzaWdubWVudChwQXNzaWdubWVudCksDQorICAgICAgbV9wQWNjZXNzb3IocEFjY2Vzc29yKSwNCisgICAgICBtX2lEaXJlY3Rpb24oaURpcmVjdGlvbiksDQorICAgICAgbV9wU3RlcChwU3RlcCksDQorICAgICAgbV9wTGlzdChwTGlzdCkNCit7DQorfQ0KK0NYRkFfRk1Gb3JFeHByZXNzaW9uOjp+Q1hGQV9GTUZvckV4cHJlc3Npb24oKQ0KK3sNCisgICAgaWYgKG1fcEFzc2lnbm1lbnQpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BBc3NpZ25tZW50Ow0KKyAgICAgICAgbV9wQXNzaWdubWVudCA9IDA7DQorICAgIH0NCisgICAgaWYgKG1fcEFjY2Vzc29yKSB7DQorICAgICAgICBkZWxldGUgbV9wQWNjZXNzb3I7DQorICAgICAgICBtX3BBY2Nlc3NvciA9IDA7DQorICAgIH0NCisgICAgaWYgKG1fcFN0ZXApIHsNCisgICAgICAgIGRlbGV0ZSBtX3BTdGVwOw0KKyAgICAgICAgbV9wU3RlcCA9IDA7DQorICAgIH0NCisgICAgaWYgKG1fcExpc3QpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BMaXN0Ow0KKyAgICAgICAgbV9wTGlzdCA9IDA7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNRm9yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG52YXIgIik7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBWYXJpYW50Ow0KKyAgICBpZiAobV93c1ZhcmlhbnQuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgdGVtcFZhcmlhbnQgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c1ZhcmlhbnQuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHRlbXBWYXJpYW50ID0gbV93c1ZhcmlhbnQ7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IG1fd3NWYXJpYW50Ow0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJmb3IgKCIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICAgIGlmIChtX2lEaXJlY3Rpb24gPT0gMSkgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA8PSAiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgKz0gIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID49ICIpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiAtPSAiKTsNCisgICAgfQ0KKyAgICBpZiAobV9wU3RlcCkgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICAgIG1fcFN0ZXAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgICAgbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorfQ0KK3ZvaWQgQ1hGQV9GTUZvckV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG52YXIgIik7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBWYXJpYW50Ow0KKyAgICBpZiAobV93c1ZhcmlhbnQuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgdGVtcFZhcmlhbnQgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c1ZhcmlhbnQuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHRlbXBWYXJpYW50ID0gbV93c1ZhcmlhbnQ7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IG1fd3NWYXJpYW50Ow0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJmb3IgKCIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICAgIGlmIChtX2lEaXJlY3Rpb24gPT0gMSkgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA8PSAiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgKz0gIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID49ICIpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiAtPSAiKTsNCisgICAgfQ0KKyAgICBpZiAobV9wU3RlcCkgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICAgIG1fcFN0ZXAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgICAgbV9wTGlzdC0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCit9DQorQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oIEZYX0RXT1JEIGxpbmUsIEZYX1dTVFIgd3NJZGVudGlmaWVyLCBDRlhfUHRyQXJyYXkgKnBBY2Nlc3NvcnMsIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCApDQorICAgIDogQ1hGQV9GTUxvb3BFeHByZXNzaW9uKGxpbmUpLA0KKyAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllciksDQorICAgICAgbV9wQWNjZXNzb3JzKHBBY2Nlc3NvcnMpLA0KKyAgICAgIG1fcExpc3QocExpc3QpDQorew0KK30NCitDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246On5DWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oKQ0KK3sNCisgICAgaWYgKG1fcExpc3QpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BMaXN0Ow0KKyAgICAgICAgbV9wTGlzdCA9IDA7DQorICAgIH0NCisgICAgaWYgKG1fcEFjY2Vzc29ycykgew0KKyAgICAgICAgRlhfSU5UMzIgc2l6ZSA9IG1fcEFjY2Vzc29ycy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KKyAgICAgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgICAgICAgIGUgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiltX3BBY2Nlc3NvcnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQWNjZXNzb3JzLT5SZW1vdmVBbGwoKTsNCisgICAgICAgIGRlbGV0ZSBtX3BBY2Nlc3NvcnM7DQorICAgICAgICBtX3BBY2Nlc3NvcnMgPSAwOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IG51bGw7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKENPTkNBVEZNT0JKRUNUKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgRlhfSU5UMzIgaVNpemUgPSBtX3BBY2Nlc3NvcnMtPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IDA7DQorICAgIHdoaWxlKGluZGV4IDwgaVNpemUpIHsNCisgICAgICAgIHMgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiltX3BBY2Nlc3NvcnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgIHMtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGlmIChpbmRleCArIDEgPCBpU2l6ZSkgew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgICBzID0gMDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIndoaWxlKCIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDwgIik7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLmxlbmd0aClcbntcbiIpOw0KKyAgICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlsiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIisrXTtcbiIpOw0KKyAgICBtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KK30NCit2b2lkIENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IG51bGw7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKENPTkNBVEZNT0JKRUNUKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgRlhfSU5UMzIgaVNpemUgPSBtX3BBY2Nlc3NvcnMtPkdldFNpemUoKTsNCisgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IDA7DQorICAgIHdoaWxlKGluZGV4IDwgaVNpemUpIHsNCisgICAgICAgIHMgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiltX3BBY2Nlc3NvcnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgIHMtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGlmIChpbmRleCArIDEgPCBpU2l6ZSkgew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgICBzID0gMDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIndoaWxlKCIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDwgIik7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLmxlbmd0aClcbntcbiIpOw0KKyAgICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlsiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIisrXTtcbiIpOw0KKyAgICBtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uaCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ3Y2YyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GTV9FWFBSRVNTSU9OX0gNCisjZGVmaW5lIF9YRkFfRk1fRVhQUkVTU0lPTl9IDQorZW51bSBYRkFfRk1fRVhQVFlQRSB7DQorICAgIFhGQV9GTV9FWFBUWVBFX1VOS05PV04sDQorICAgIFhGQV9GTV9FWFBUWVBFX0ZVTkMsDQorICAgIFhGQV9GTV9FWFBUWVBFX1ZBUiwNCisgICAgWEZBX0ZNX0VYUFRZUEVfRVhQLA0KKyAgICBYRkFfRk1fRVhQVFlQRV9CTE9DSywNCisgICAgWEZBX0ZNX0VYUFRZUEVfSUYsDQorICAgIFhGQV9GTV9FWFBUWVBFX0JSRUFLLA0KKyAgICBYRkFfRk1fRVhQVFlQRV9DT05USU5VRSwNCit9Ow0KK2NsYXNzIENYRkFfRk1FeHByZXNzaW9uIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKTsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX0VYUFRZUEUgdHlwZSk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1FeHByZXNzaW9uKCkge307DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKyAgICBGWF9EV09SRCBHZXRMaW5lKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fbGluZTsNCisgICAgfQ0KKyAgICBYRkFfRk1fRVhQVFlQRSBHZXRFeHBUeXBlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fdHlwZTsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgWEZBX0ZNX0VYUFRZUEUgbV90eXBlOw0KKyAgICBGWF9EV09SRCBtX2xpbmU7DQorfTsNCitjbGFzcyBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbihGWF9EV09SRCBsaW5lLCBGWF9CT09MIGlzR2xvYmFsLCBGWF9XU1RSIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmdDQXJyYXkgKnBBcmd1bWVudHMsIENGWF9QdHJBcnJheSAqcEV4cHJlc3Npb25zKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCitwcml2YXRlOg0KKyAgICBDRlhfV2lkZVN0cmluZ0MgbV93c05hbWU7DQorICAgIENGWF9XaWRlU3RyaW5nQ0FycmF5ICptX3BBcmd1bWVudHM7DQorICAgIENGWF9QdHJBcnJheSAqbV9wRXhwcmVzc2lvbnM7DQorICAgIEZYX0JPT0wgbV9pc0dsb2JhbDsNCit9Ow0KK2NsYXNzIENYRkFfRk1WYXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTVZhckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgRlhfV1NUUiB3c05hbWUsIENYRkFfRk1FeHByZXNzaW9uICpwSW5pdCk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1WYXJFeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK3ByaXZhdGU6DQorICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzTmFtZTsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKm1fcEluaXQ7DQorfTsNCitjbGFzcyBDWEZBX0ZNRXhwRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1FeHBFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwcmVzc2lvbik7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1FeHBFeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK3ByaXZhdGU6DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK307DQorY2xhc3MgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1CbG9ja0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ0ZYX1B0ckFycmF5ICpwRXhwcmVzc2lvbkxpc3QpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNQmxvY2tFeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK3ByaXZhdGU6DQorICAgIENGWF9QdHJBcnJheSAqbV9wRXhwcmVzc2lvbkxpc3Q7DQorfTsNCitjbGFzcyBDWEZBX0ZNRG9FeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTURvRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcExpc3QpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNRG9FeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK3ByaXZhdGU6DQorICAgIENYRkFfRk1FeHByZXNzaW9uICptX3BMaXN0Ow0KK307DQorY2xhc3MgQ1hGQV9GTUlmRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1JZkV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHByZXNzaW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcElmRXhwcmVzc2lvbiwgQ1hGQV9GTUV4cHJlc3Npb24gKnBFbHNlRXhwcmVzc2lvbik7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1JZkV4cHJlc3Npb24oKTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorcHJpdmF0ZToNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKm1fcEV4cHJlc3Npb247DQorICAgIENYRkFfRk1FeHByZXNzaW9uCSptX3BJZkV4cHJlc3Npb247DQorICAgIENYRkFfRk1FeHByZXNzaW9uCSptX3BFbHNlRXhwcmVzc2lvbjsNCit9Ow0KK2NsYXNzIENYRkFfRk1Mb29wRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Mb29wRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKSA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpIHt9DQorICAgIHZpcnR1YWwgfkNYRkFfRk1Mb29wRXhwcmVzc2lvbigpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCit9Ow0KK2NsYXNzIENYRkFfRk1XaGlsZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcENvZGl0aW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcEV4cHJlc3Npb24pOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNV2hpbGVFeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK3ByaXZhdGU6DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICptX3BDb25kaXRpb247DQorICAgIENYRkFfRk1FeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK307DQorY2xhc3MgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1CcmVha0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1CcmVha0V4cHJlc3Npb24oKTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorcHJpdmF0ZToNCisgICAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK307DQorY2xhc3MgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorcHJpdmF0ZToNCisgICAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK307DQorY2xhc3MgQ1hGQV9GTUZvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTUZvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgRlhfV1NUUiB3c1ZhcmlhbnQsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQXNzaWdubWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBY2Nlc3NvciwgRlhfSU5UMzIgaURpcmVjdGlvbiwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBTdGVwLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcExpc3QpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNRm9yRXhwcmVzc2lvbigpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCitwcml2YXRlOg0KKyAgICBDRlhfV2lkZVN0cmluZ0MgbV93c1ZhcmlhbnQ7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogbV9wQXNzaWdubWVudDsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKm1fcEFjY2Vzc29yOw0KKyAgICBGWF9JTlQzMiBtX2lEaXJlY3Rpb247DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICptX3BTdGVwOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqbV9wTGlzdDsNCit9Ow0KK2NsYXNzIENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNTG9vcEV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgRlhfV1NUUiB3c0lkZW50aWZpZXIsIENGWF9QdHJBcnJheSAqcEFjY2Vzc29ycywgQ1hGQV9GTUV4cHJlc3Npb24gKnBMaXN0KTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK3ByaXZhdGU6DQorICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsNCisgICAgQ0ZYX1B0ckFycmF5ICptX3BBY2Nlc3NvcnM7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICptX3BMaXN0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZjEzMzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqcy5jcHAKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqcy5oIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJmNDkxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GTTJKU19IDQorI2RlZmluZSBfWEZBX0ZNMkpTX0gNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjZGVmaW5lICBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRSAoRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZV9mdW5jX3JldHVybl92YWx1ZSIpKQ0KKyNkZWZpbmUgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIJKEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX19leGNsYW1hdGlvbl9fIikpDQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZ0M+IENGWF9XaWRlU3RyaW5nQ0FycmF5Ow0KKyNpbmNsdWRlICJ4ZmFfZXJyb3IuaCINCisjaW5jbHVkZSAieGZhX2xleGVyLmgiDQorI2luY2x1ZGUgInhmYV9zaW1wbGVleHByZXNzaW9uLmgiDQorI2luY2x1ZGUgInhmYV9leHByZXNzaW9uLmgiDQorI2luY2x1ZGUgInhmYV9mbXBhcnNlLmgiDQorI2luY2x1ZGUgInhmYV9wcm9ncmFtLmgiDQorI2luY2x1ZGUgInhmYV9mbTJqc2NvbnRleHQuaCINCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2FwaS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExYjEyMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzYXBpLmNwcApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiDQorew0KKyNlbmRpZg0KK0ZYX0lOVDMyIFhGQV9GTTJKU19UcmFuc2xhdGUoRlhfV1NUUiB3c0Zvcm1jYWxjLCBDRlhfV2lkZVRleHRCdWYmIHdzSmF2YXNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIHdzRXJyb3IpDQorew0KKyAgICBpZiAod3NGb3JtY2FsYy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHdzSmF2YXNjcmlwdC5DbGVhcigpOw0KKyAgICAgICAgd3NFcnJvci5FbXB0eSgpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgc3RhdHVzID0gMDsNCisgICAgQ1hGQV9GTVByb2dyYW0gcHJvZ3JhbTsNCisgICAgc3RhdHVzID0gcHJvZ3JhbS5Jbml0KHdzRm9ybWNhbGMpOw0KKyAgICBpZihzdGF0dXMpIHsNCisgICAgICAgIHdzRXJyb3IgPSBwcm9ncmFtLkdldEVycm9yKCkubWVzc2FnZTsNCisgICAgICAgIHJldHVybiBzdGF0dXM7DQorICAgIH0NCisgICAgc3RhdHVzID0gcHJvZ3JhbS5QYXJzZVByb2dyYW0oKTsNCisgICAgaWYoc3RhdHVzKSB7DQorICAgICAgICB3c0Vycm9yID0gcHJvZ3JhbS5HZXRFcnJvcigpLm1lc3NhZ2U7DQorICAgICAgICByZXR1cm4gc3RhdHVzOw0KKyAgICB9DQorICAgIHByb2dyYW0uVHJhbnNsYXRlUHJvZ3JhbSh3c0phdmFzY3JpcHQpOw0KKyAgICByZXR1cm4gMDsNCit9DQorWEZBX0hGTTJKU0NPTlRFWFQgWEZBX0ZNMkpTX0NvbnRleHRDcmVhdGUoKQ0KK3sNCisgICAgcmV0dXJuIChYRkFfSEZNMkpTQ09OVEVYVClDWEZBX0ZNMkpTQ29udGV4dDo6Q3JlYXRlKCk7DQorfQ0KK3ZvaWQgWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsIEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hDT05URVhUIGhTY3JpcHRDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0ICpwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1hGQV9GTTJKU0NvbnRleHQqPihoRk0ySlNDb250ZXh0KTsNCisgICAgcENvbnRleHQtPkluaXRpYWxpemUoaFNjcmlwdFJ1bnRpbWUsIGhTY3JpcHRDb250ZXh0LCBwRG9jdW1lbnQpOw0KK30NCit2b2lkIFhGQV9GTTJKU19HbG9iYWxQcm9wZXJ0eUdldHRlcihYRkFfSEZNMkpTQ09OVEVYVCBoRk0ySlNDb250ZXh0LCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQgKnBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KKyAgICBwQ29udGV4dC0+R2xvYmFsUHJvcGVydHlHZXR0ZXIoaFZhbHVlKTsNCit9DQordm9pZCBYRkFfRk0ySlNfQ29udGV4dFJlbGVhc2UoWEZBX0hGTTJKU0NPTlRFWFQgaEZNMkpTQ29udGV4dCkNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0ICpwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1hGQV9GTTJKU0NvbnRleHQqPihoRk0ySlNDb250ZXh0KTsNCisgICAgcENvbnRleHQtPlJlbGVhc2UoKTsNCit9DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0M2M5MDAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNzE4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQorI2luY2x1ZGUgPHRpbWUuaD4NCisjZGVmaW5lIEZJTkFOQ0lBTF9QUkVDSVNJT04JCTAuMDAwMDAwMDENCitzdHJ1Y3QgWEZBX0ZNSHRtbFJlc2VydmVDb2RlIHsNCisgICAgRlhfVUlOVDMyCQltX3VDb2RlOw0KKyAgICBGWF9MUENXU1RSCQltX2h0bWxSZXNlcnZlOw0KK307DQorc3RydWN0IFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSB7DQorICAgIEZYX1VJTlQzMgkJbV91SGFzaDsNCisgICAgRlhfTFBDV1NUUgkJbV9odG1sUmVzZXJ2ZTsNCisgICAgRlhfVUlOVDMyCQltX3VDb2RlOw0KK307DQorc3RhdGljIFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSByZXNlcnZlc0ZvckRlY29kZSBbXSA9IHsNCisgICAgezB4MDAwMThiNjIsCShGWF9MUENXU1RSKUwiTXUiLAk5MjR9LA0KKyAgICB7MHgwMDAxOTA4MywJKEZYX0xQQ1dTVFIpTCJOdSIsCTkyNX0sDQorICAgIHsweDAwMDE5YWI5LAkoRlhfTFBDV1NUUilMIlBpIiwJOTI4fSwNCisgICAgezB4MDAwMWMzYzEsCShGWF9MUENXU1RSKUwiWGkiLAk5MjZ9LA0KKyAgICB7MHgwMDAyMTBhYywJKEZYX0xQQ1dTVFIpTCJnZSIsCTg4MDV9LA0KKyAgICB7MHgwMDAyMTBiYiwJKEZYX0xQQ1dTVFIpTCJndCIsCTYyfSwNCisgICAgezB4MDAwMjJhNTEsCShGWF9MUENXU1RSKUwibGUiLAk4ODA0fSwNCisgICAgezB4MDAwMjJhNjAsCShGWF9MUENXU1RSKUwibHQiLAk2MH0sDQorICAgIHsweDAwMDIyZjgyLAkoRlhfTFBDV1NUUilMIm11IiwJOTU2fSwNCisgICAgezB4MDAwMjM0OTMsCShGWF9MUENXU1RSKUwibmUiLAk4ODAwfSwNCisgICAgezB4MDAwMjM0OTcsCShGWF9MUENXU1RSKUwibmkiLAk4NzE1fSwNCisgICAgezB4MDAwMjM0YTMsCShGWF9MUENXU1RSKUwibnUiLAk5NTd9LA0KKyAgICB7MHgwMDAyMzljMSwJKEZYX0xQQ1dTVFIpTCJvciIsCTg3NDR9LA0KKyAgICB7MHgwMDAyM2VkOSwJKEZYX0xQQ1dTVFIpTCJwaSIsCTk2MH0sDQorICAgIHsweDAwMDI2N2UxLAkoRlhfTFBDV1NUUilMInhpIiwJOTU4fSwNCisgICAgezB4MDBjNDE3ODksCShGWF9MUENXU1RSKUwibGNlaWwiLAk4OTY4fSwNCisgICAgezB4MDBlZWYzNGYsCShGWF9MUENXU1RSKUwidGhldGFzeW0iLAk5Nzd9LA0KKyAgICB7MHgwMTJkN2VhZCwJKEZYX0xQQ1dTVFIpTCJsY2lyYyIsCTIwNn0sDQorICAgIHsweDAxNjM3YjU2LAkoRlhfTFBDV1NUUilMImFncmF2ZSIsCTIyNH0sDQorICAgIHsweDAyMDg1NmRhLAkoRlhfTFBDV1NUUilMImNyYXJyIiwJODYyOX0sDQorICAgIHsweDAyMjE4OGMzLAkoRlhfTFBDV1NUUilMImdhbW1hIiwJOTQ3fSwNCisgICAgezB4MDMzNTg2ZDMsCShGWF9MUENXU1RSKUwibmJzcCIsCTE2MH0sDQorICAgIHsweDA0ZjRjMzU4LAkoRlhfTFBDV1NUUilMIm5zdWIiLAk4ODM2fSwNCisgICAgezB4MDU4MTQ2NmEsCShGWF9MUENXU1RSKUwiZGFnZ2VyIiwJODIyNH0sDQorICAgIHsweDA2YjFmNzkwLAkoRlhfTFBDV1NUUilMIm9lbGlnIiwJMzM5fSwNCisgICAgezB4MDZlNDkwZDQsCShGWF9MUENXU1RSKUwiQ2hpIiwJOTM1fSwNCisgICAgezB4MDcxOGM2YTEsCShGWF9MUENXU1RSKUwiRVRIIiwJMjA4fSwNCisgICAgezB4MDcxOTZhZGEsCShGWF9MUENXU1RSKUwiRXRhIiwJOTE5fSwNCisgICAgezB4MDdmNjY3Y2EsCShGWF9MUENXU1RSKUwiVWdyYXZlIiwJMjE3fSwNCisgICAgezB4MDgzYThhMjEsCShGWF9MUENXU1RSKUwiUGhpIiwJOTM0fSwNCisgICAgezB4MDgzYWMyOGMsCShGWF9MUENXU1RSKUwiUHNpIiwJOTM2fSwNCisgICAgezB4MDg2ZjI2YTksCShGWF9MUENXU1RSKUwiUmhvIiwJOTI5fSwNCisgICAgezB4MDg5YjViNTEsCShGWF9MUENXU1RSKUwiYXJpbmciLAkyMjl9LA0KKyAgICB7MHgwOGEzOWY0YSwJKEZYX0xQQ1dTVFIpTCJUYXUiLAk5MzJ9LA0KKyAgICB7MHgwOGI2MTg4YiwJKEZYX0xQQ1dTVFIpTCJUSE9STiIsCTIyMn0sDQorICAgIHsweDA5Y2U3OTJhLAkoRlhfTFBDV1NUUilMImljaXJjIiwJMjM4fSwNCisgICAgezB4MDlmOWQ2MWUsCShGWF9MUENXU1RSKUwiYW1wIiwJMzh9LA0KKyAgICB7MHgwOWY5ZGIzMywJKEZYX0xQQ1dTVFIpTCJhbmQiLAk4NzQzfSwNCisgICAgezB4MDlmOWRiMzYsCShGWF9MUENXU1RSKUwiYW5nIiwJODczNn0sDQorICAgIHsweDBhMmUzNTE0LAkoRlhfTFBDV1NUUilMImNhcCIsCTg3NDV9LA0KKyAgICB7MHgwYTJlNThmNCwJKEZYX0xQQ1dTVFIpTCJjaGkiLAk5Njd9LA0KKyAgICB7MHgwYTJlOWJhOCwJKEZYX0xQQ1dTVFIpTCJjdXAiLAk4NzQ2fSwNCisgICAgezB4MGE0ODk3ZDAsCShGWF9MUENXU1RSKUwiZGVnIiwJMTc2fSwNCisgICAgezB4MGE2MzMyZmEsCShGWF9MUENXU1RSKUwiZXRhIiwJOTUxfSwNCisgICAgezB4MGE2MzMzMDEsCShGWF9MUENXU1RSKUwiZXRoIiwJMjQwfSwNCisgICAgezB4MGFjYzRkNGIsCShGWF9MUENXU1RSKUwiaW50IiwJODc0N30sDQorICAgIHsweDBiMWIzZDM1LAkoRlhfTFBDV1NUUilMImxveiIsCTk2NzR9LA0KKyAgICB7MHgwYjFiNGM4YiwJKEZYX0xQQ1dTVFIpTCJscm0iLAk4MjA2fSwNCisgICAgezB4MGI0ZmQ5YjEsCShGWF9MUENXU1RSKUwibm90IiwJMTcyfSwNCisgICAgezB4MGI4NDUyNDEsCShGWF9MUENXU1RSKUwicGhpIiwJOTY2fSwNCisgICAgezB4MGI4NDU3NmYsCShGWF9MUENXU1RSKUwicGl2IiwJOTgyfSwNCisgICAgezB4MGI4NDhhYWMsCShGWF9MUENXU1RSKUwicHNpIiwJOTY4fSwNCisgICAgezB4MGJiOGRmNWUsCShGWF9MUENXU1RSKUwicmVnIiwJMTc0fSwNCisgICAgezB4MGJiOGVlYzksCShGWF9MUENXU1RSKUwicmhvIiwJOTYxfSwNCisgICAgezB4MGJiOTAzNGIsCShGWF9MUENXU1RSKUwicmxtIiwJODIwN30sDQorICAgIHsweDBiZDMzZDE0LAkoRlhfTFBDV1NUUilMInNoeSIsCTE3M30sDQorICAgIHsweDBiZDM0MjI5LAkoRlhfTFBDV1NUUilMInNpbSIsCTg3NjR9LA0KKyAgICB7MHgwYmQzN2ZhYSwJKEZYX0xQQ1dTVFIpTCJzdWIiLAk4ODM0fSwNCisgICAgezB4MGJkMzdmYjUsCShGWF9MUENXU1RSKUwic3VtIiwJODcyMX0sDQorICAgIHsweDBiZDM3ZmI4LAkoRlhfTFBDV1NUUilMInN1cCIsCTg4MzV9LA0KKyAgICB7MHgwYmVkNjc2YSwJKEZYX0xQQ1dTVFIpTCJ0YXUiLAk5NjR9LA0KKyAgICB7MHgwYzA3ZjMyZSwJKEZYX0xQQ1dTVFIpTCJ1bWwiLAkxNjh9LA0KKyAgICB7MHgwYzcxMDMyYywJKEZYX0xQQ1dTVFIpTCJ5ZW4iLAkxNjV9LA0KKyAgICB7MHgwYzdmMjg4OSwJKEZYX0xQQ1dTVFIpTCJzemxpZyIsCTIyM30sDQorICAgIHsweDBjOGJhZGJiLAkoRlhfTFBDV1NUUilMInp3aiIsCTgyMDV9LA0KKyAgICB7MHgxMGJhNGRiYSwJKEZYX0xQQ1dTVFIpTCJFZ3JhdmUiLAkyMDB9LA0KKyAgICB7MHgxMGYxZWEyNCwJKEZYX0xQQ1dTVFIpTCJwYXJhIiwJMTgyfSwNCisgICAgezB4MTBmMWVhMzcsCShGWF9MUENXU1RSKUwicGFydCIsCTg3MDZ9LA0KKyAgICB7MHgxMTViMjMzNywJKEZYX0xQQ1dTVFIpTCJwZXJwIiwJODg2OX0sDQorICAgIHsweDEyYjEwZDE1LAkoRlhfTFBDV1NUUilMInByb2QiLAk4NzE5fSwNCisgICAgezB4MTJiMTBkMjEsCShGWF9MUENXU1RSKUwicHJvcCIsCTg3MzN9LA0KKyAgICB7MHgxMmRmYTlmNCwJKEZYX0xQQ1dTVFIpTCJyZmxvb3IiLAk4OTcxfSwNCisgICAgezB4MTJlYjQ3MzYsCShGWF9MUENXU1RSKUwiQWdyYXZlIiwJMTkyfSwNCisgICAgezB4MTJmZmYyYjcsCShGWF9MUENXU1RSKUwicHVuZCIsCTE2M30sDQorICAgIHsweDEzZmRhOWYyLAkoRlhfTFBDV1NUUilMInRpbGRlIiwJNzMyfSwNCisgICAgezB4MTQxN2ZkNjIsCShGWF9MUENXU1RSKUwidGltZXMiLAkyMTV9LA0KKyAgICB7MHgxNTRmYzcyNiwJKEZYX0xQQ1dTVFIpTCJlY2lyYyIsCTIzNH0sDQorICAgIHsweDE2NWFhNDUxLAkoRlhfTFBDV1NUUilMInNpZ21hIiwJOTYzfSwNCisgICAgezB4MTcwOTEyNGEsCShGWF9MUENXU1RSKUwiRGFnZ2VyIiwJODIyNX0sDQorICAgIHsweDE5MmY3OGQ1LAkoRlhfTFBDV1NUUilMImlleGNsIiwJMTYxfSwNCisgICAgezB4MWI3ZWQ4ZDcsCShGWF9MUENXU1RSKUwickFyciIsCTg2NTh9LA0KKyAgICB7MHgxZWM4OGM2OCwJKEZYX0xQQ1dTVFIpTCJyYW5nIiwJOTAwMn0sDQorICAgIHsweDFlYzhhMGY3LAkoRlhfTFBDV1NUUilMInJhcnIiLAk4NTk0fSwNCisgICAgezB4MWVkYTA3ZjMsCShGWF9MUENXU1RSKUwiYXRpbGRlIiwJMjI3fSwNCisgICAgezB4MWYzMTgyYzQsCShGWF9MUENXU1RSKUwicmVhbCIsCTg0NzZ9LA0KKyAgICB7MHgxZmMzNGY4YiwJKEZYX0xQQ1dTVFIpTCJ5YWN1dGUiLAkyNTN9LA0KKyAgICB7MHgyMGQxMTUyMiwJKEZYX0xQQ1dTVFIpTCJhY2lyYyIsCTIyNn0sDQorICAgIHsweDIxOTMzYTliLAkoRlhfTFBDV1NUUilMInJzYXF1byIsCTgyNTB9LA0KKyAgICB7MHgyMWY0NDkwNywJKEZYX0xQQ1dTVFIpTCJ1YWN1dGUiLAkyNTB9LA0KKyAgICB7MHgyMjBjY2E3MiwJKEZYX0xQQ1dTVFIpTCJhY3V0ZSIsCTE4MH0sDQorICAgIHsweDI0MmNkZWQxLAkoRlhfTFBDV1NUUilMImFsZWZzeW0iLAk4NTAxfSwNCisgICAgezB4MjY1NWM2NmEsCShGWF9MUENXU1RSKUwiZGVsdGEiLAk5NDh9LA0KKyAgICB7MHgyNjllNGI0ZCwJKEZYX0xQQ1dTVFIpTCJleGlzdCIsCTg3MDd9LA0KKyAgICB7MHgyNzMzNzlmYSwJKEZYX0xQQ1dTVFIpTCJtaWNybyIsCTE4MX0sDQorICAgIHsweDI3YTM3NDQwLAkoRlhfTFBDV1NUUilMImZvcmFsbCIsCTg3MDR9LA0KKyAgICB7MHgyODU0ZTYyYywJKEZYX0xQQ1dTVFIpTCJtaW51cyIsCTg3MjJ9LA0KKyAgICB7MHgyODYzNmY4MSwJKEZYX0xQQ1dTVFIpTCJjZWRpbCIsCTE4NH0sDQorICAgIHsweDI4ODczNTdiLAkoRlhfTFBDV1NUUilMImlhY3V0ZSIsCTIzN30sDQorICAgIHsweDI5OTRkNWZmLAkoRlhfTFBDV1NUUilMImZyYWMxMiIsCTE4OX0sDQorICAgIHsweDI5OTRkNjAxLAkoRlhfTFBDV1NUUilMImZyYWMxNCIsCTE4OH0sDQorICAgIHsweDI5OTRlMDQzLAkoRlhfTFBDV1NUUilMImZyYWMzNCIsCTE5MH0sDQorICAgIHsweDJhMWZlYjQxLAkoRlhfTFBDV1NUUilMImxhbWJkYSIsCTk1NX0sDQorICAgIHsweDJhYjIxNWYzLAkoRlhfTFBDV1NUUilMImFwb3MiLAkzOX0sDQorICAgIHsweDJhYjgyZWY3LAkoRlhfTFBDV1NUUilMImVhY3V0ZSIsCTIzM30sDQorICAgIHsweDJiMzU5MmVmLAkoRlhfTFBDV1NUUilMImF1bWwiLAkyMjh9LA0KKyAgICB7MHgyY2U5Mjg3MywJKEZYX0xQQ1dTVFIpTCJhYWN1dGUiLAkyMjV9LA0KKyAgICB7MHgyZGFmZjQ4YSwJKEZYX0xQQ1dTVFIpTCJvc2xhc2giLAkyNDh9LA0KKyAgICB7MHgyZWY2ODg4MiwJKEZYX0xQQ1dTVFIpTCJhZWxpZyIsCTIzMH0sDQorICAgIHsweDMwNjFkM2QzLAkoRlhfTFBDV1NUUilMIkF0aWxkZSIsCTE5NX0sDQorICAgIHsweDMxNGIxYjZiLAkoRlhfTFBDV1NUUilMIllhY3V0ZSIsCTIyMX0sDQorICAgIHsweDMzN2MxNGU3LAkoRlhfTFBDV1NUUilMIlVhY3V0ZSIsCTIxOH0sDQorICAgIHsweDM3Njc2YWNhLAkoRlhfTFBDV1NUUilMImNlbnQiLAkxNjJ9LA0KKyAgICB7MHgzN2QwYjg0MSwJKEZYX0xQQ1dTVFIpTCJjaXJjIiwJNzEwfSwNCisgICAgezB4Mzg2ZTc5NDcsCShGWF9MUENXU1RSKUwiY29uZyIsCTg3NzN9LA0KKyAgICB7MHgzODZlODM5YiwJKEZYX0xQQ1dTVFIpTCJjb3B5IiwJMTY5fSwNCisgICAgezB4M2EwZTIyNWEsCShGWF9MUENXU1RSKUwiRXBzaWxvbiIsCTkxN30sDQorICAgIHsweDNiYTdiNzIxLAkoRlhfTFBDV1NUUilMIkxhbWJkYSIsCTkyM30sDQorICAgIHsweDNiZDlhYmU2LAkoRlhfTFBDV1NUUilMIkFscGhhIiwJOTEzfSwNCisgICAgezB4M2MzZmZhZDcsCShGWF9MUENXU1RSKUwiRWFjdXRlIiwJMjAxfSwNCisgICAgezB4M2NmYWY2OWYsCShGWF9MUENXU1RSKUwiYnJ2YmFyIiwJMTY2fSwNCisgICAgezB4M2Q1NGE0ODksCShGWF9MUENXU1RSKUwib21lZ2EiLAk5Njl9LA0KKyAgICB7MHgzZTcwZjQ1MywJKEZYX0xQQ1dTVFIpTCJBYWN1dGUiLAkxOTN9LA0KKyAgICB7MHgzZjM3YzA2YSwJKEZYX0xQQ1dTVFIpTCJPc2xhc2giLAkyMTZ9LA0KKyAgICB7MHg0MGUxYjM0ZSwJKEZYX0xQQ1dTVFIpTCJkaWFtcyIsCTk4MzB9LA0KKyAgICB7MHg0MTY1OTZkZiwJKEZYX0xQQ1dTVFIpTCJwbHVzbW4iLAkxNzd9LA0KKyAgICB7MHg0MzU0ZmYxNiwJKEZYX0xQQ1dTVFIpTCJVY2lyYyIsCTIxOX0sDQorICAgIHsweDQ1NGZjZTZhLAkoRlhfTFBDV1NUUilMIlVwc2lsb24iLAk5MzN9LA0KKyAgICB7MHg0NjEwYWQzNSwJKEZYX0xQQ1dTVFIpTCJlbXNwIiwJODE5NX0sDQorICAgIHsweDQ2MmFmYjc2LAkoRlhfTFBDV1NUUilMImVuc3AiLAk4MTk0fSwNCisgICAgezB4NDZlMzAwNzMsCShGWF9MUENXU1RSKUwiZXVtbCIsCTIzNX0sDQorICAgIHsweDQ2ZTMxYTFiLAkoRlhfTFBDV1NUUilMImV1cm8iLAk4MzY0fSwNCisgICAgezB4NDZmMmVhZGEsCShGWF9MUENXU1RSKUwibG93YXN0IiwJODcyN30sDQorICAgIHsweDRkY2EyNmNmLAkoRlhfTFBDV1NUUilMIkF1bWwiLAkxOTZ9LA0KKyAgICB7MHg0ZTJkNjA4MywJKEZYX0xQQ1dTVFIpTCJpbWFnZSIsCTg0NjV9LA0KKyAgICB7MHg0Zjk2NGVlOCwJKEZYX0xQQ1dTVFIpTCJub3RpbiIsCTg3MTN9LA0KKyAgICB7MHg1MDkxN2E3YSwJKEZYX0xQQ1dTVFIpTCJlcHNpbG9uIiwJOTQ5fSwNCisgICAgezB4NTJmOWE0Y2QsCShGWF9MUENXU1RSKUwiS2FwcGEiLAk5MjJ9LA0KKyAgICB7MHg1NDk2ZjQxMCwJKEZYX0xQQ1dTVFIpTCJPY2lyYyIsCTIxMn0sDQorICAgIHsweDU2OGNiZjM0LAkoRlhfTFBDV1NUUilMInpldGEiLAk5NTB9LA0KKyAgICB7MHg1N2JhZGQyMCwJKEZYX0xQQ1dTVFIpTCJudGlsZGUiLAkyNDF9LA0KKyAgICB7MHg1ODY2MjEwOSwJKEZYX0xQQ1dTVFIpTCJ6d25qIiwJODIwNH0sDQorICAgIHsweDViMzk4NzBmLAkoRlhfTFBDV1NUUilMImVtcHR5IiwJODcwOX0sDQorICAgIHsweDViZDMyNjhhLAkoRlhfTFBDV1NUUilMInVwc2lsb24iLAk5NjV9LA0KKyAgICB7MHg1ZTJiZjhhMywJKEZYX0xQQ1dTVFIpTCJHYW1tYSIsCTkxNX0sDQorICAgIHsweDVmNzNjMTNhLAkoRlhfTFBDV1NUUilMInJzcXVvIiwJODIxN30sDQorICAgIHsweDYxZjJiYzRkLAkoRlhfTFBDV1NUUilMImlvdGEiLAk5NTN9LA0KKyAgICB7MHg2MjViYmNmMywJKEZYX0xQQ1dTVFIpTCJpc2luIiwJODcxMn0sDQorICAgIHsweDYyOTA2ZGY3LAkoRlhfTFBDV1NUUilMIml1bWwiLAkyMzl9LA0KKyAgICB7MHg2NGE1Y2IzMSwJKEZYX0xQQ1dTVFIpTCJBcmluZyIsCTE5N30sDQorICAgIHsweDY2ZjI1YzRhLAkoRlhfTFBDV1NUUilMInNicXVvIiwJODIxOH0sDQorICAgIHsweDY4NTFhYjYwLAkoRlhfTFBDV1NUUilMInNwYWRlcyIsCTk4MjR9LA0KKyAgICB7MHg2OTQyYTkwMCwJKEZYX0xQQ1dTVFIpTCJOdGlsZGUiLAkyMDl9LA0KKyAgICB7MHg2OTc3OTQ1MywJKEZYX0xQQ1dTVFIpTCJFdW1sIiwJMjAzfSwNCisgICAgezB4NmNkYTZlMjMsCShGWF9MUENXU1RSKUwiY3VycmVudCIsCTE2NH0sDQorICAgIHsweDcwYjViNjM0LAkoRlhfTFBDV1NUUilMImxzcXVvIiwJODIxNn0sDQorICAgIHsweDcxNWEzNzA2LAkoRlhfTFBDV1NUUilMIkVjaXJjIiwJMjAyfSwNCisgICAgezB4NzFlOGJmOGQsCShGWF9MUENXU1RSKUwidGRxdW8iLAk4MjIxfSwNCisgICAgezB4NzI2NTE0MzEsCShGWF9MUENXU1RSKUwiU2lnbWEiLAk5MzF9LA0KKyAgICB7MHg3NTY5ODEzYiwJKEZYX0xQQ1dTVFIpTCJpcXVlc3QiLAkxOTF9LA0KKyAgICB7MHg3NzZhNDM2YSwJKEZYX0xQQ1dTVFIpTCJlcXVpdiIsCTg4MDF9LA0KKyAgICB7MHg3OTIxNTMxNCwJKEZYX0xQQ1dTVFIpTCJaZXRhIiwJOTE4fSwNCisgICAgezB4NzliODEyMjQsCShGWF9MUENXU1RSKUwib2dyYXZlIiwJMjQyfSwNCisgICAgezB4N2MyZjhiMjMsCShGWF9MUENXU1RSKUwibWFjciIsCTE3NX0sDQorICAgIHsweDdjZGI4NTAyLAkoRlhfTFBDV1NUUilMIkFjaXJjIiwJMTk0fSwNCisgICAgezB4ODE4NWM2MmUsCShGWF9MUENXU1RSKUwibmRhc2giLAk4MjExfSwNCisgICAgezB4ODI2MDM2NGEsCShGWF9MUENXU1RSKUwiRGVsdGEiLAk5MTZ9LA0KKyAgICB7MHg4NDY2MTlhZCwJKEZYX0xQQ1dTVFIpTCJtZGFzaCIsCTgyMTJ9LA0KKyAgICB7MHg4NTUwZmI1MCwJKEZYX0xQQ1dTVFIpTCJPRWxpZyIsCTMzOH0sDQorICAgIHsweDg4ZWI1Yjg1LAkoRlhfTFBDV1NUUilMImxkcXVvIiwJODIyMH0sDQorICAgIHsweDhiM2ZkZTA0LAkoRlhfTFBDV1NUUilMIk9ncmF2ZSIsCTIxMH0sDQorICAgIHsweDhiYzU3OTRiLAkoRlhfTFBDV1NUUilMIm9yZGYiLAkxNzB9LA0KKyAgICB7MHg4YmM1Nzk1MiwJKEZYX0xQQ1dTVFIpTCJvcmRtIiwJMTg2fSwNCisgICAgezB4OGMxNDkyM2QsCShGWF9MUENXU1RSKUwib3VtbCIsCTI0Nn0sDQorICAgIHsweDhjNWE3Y2Q2LAkoRlhfTFBDV1NUUilMInRoZXRhIiwJOTUyfSwNCisgICAgezB4OGQ2MTgxMmIsCShGWF9MUENXU1RSKUwidGhvcm4iLAkyNTR9LA0KKyAgICB7MHg5MTJiOTVhYSwJKEZYX0xQQ1dTVFIpTCJhc3ltcCIsCTg3NzZ9LA0KKyAgICB7MHg5NDdmYWY4MSwJKEZYX0xQQ1dTVFIpTCJtaWRkb3QiLAkxODN9LA0KKyAgICB7MHg5NjI5MjAyZSwJKEZYX0xQQ1dTVFIpTCJsZmxvb3IiLAk4OTcwfSwNCisgICAgezB4OTcyZTllYzEsCShGWF9MUENXU1RSKUwib3RpbGRlIiwJMjQ1fSwNCisgICAgezB4OTc0OGYyMzEsCShGWF9MUENXU1RSKUwib3RpbWVzIiwJODg1NX0sDQorICAgIHsweDk5NWYxNDY5LAkoRlhfTFBDV1NUUilMIk9tZWdhIiwJOTM3fSwNCisgICAgezB4OTllYjUzNDksCShGWF9MUENXU1RSKUwicXVvdCIsCTM0fSwNCisgICAgezB4OWFlYjYzOWUsCShGWF9MUENXU1RSKUwiaGVsbGlwIiwJODIzMH0sDQorICAgIHsweGEwYWUyZjg2LAkoRlhfTFBDV1NUUilMIlNjYXJvbiIsCTM1Mn0sDQorICAgIHsweGE0ZGNiMGQ1LAkoRlhfTFBDV1NUUilMImxzYXF1byIsCTgyNDl9LA0KKyAgICB7MHhhNTNkYmY0MSwJKEZYX0xQQ1dTVFIpTCJvYWN1dGUiLAkyNDN9LA0KKyAgICB7MHhhNWFlOWU3YiwJKEZYX0xQQ1dTVFIpTCJiZHF1byIsCTgyMjJ9LA0KKyAgICB7MHhhNjAyZDdiYSwJKEZYX0xQQ1dTVFIpTCJzZG90IiwJODkwMX0sDQorICAgIHsweGE2MWNlODZmLAkoRlhfTFBDV1NUUilMInNlY3QiLAkxNjd9LA0KKyAgICB7MHhhNmU0YzNkNywJKEZYX0xQQ1dTVFIpTCJzaWdtYWYiLAk5NjJ9LA0KKyAgICB7MHhhN2MxYzc0ZiwJKEZYX0xQQ1dTVFIpTCJzdWJlIiwJODgzOH0sDQorICAgIHsweGE3YzIwZWU5LAkoRlhfTFBDV1NUUilMInN1cDEiLAkxODV9LA0KKyAgICB7MHhhN2MyMGVlYSwJKEZYX0xQQ1dTVFIpTCJzdXAyIiwJMTc4fSwNCisgICAgezB4YTdjMjBlZWIsCShGWF9MUENXU1RSKUwic3VwMyIsCTE3OX0sDQorICAgIHsweGE3YzIwZjFkLAkoRlhfTFBDV1NUUilMInN1cGUiLAk4ODM5fSwNCisgICAgezB4YThiNjZhYTEsCShGWF9MUENXU1RSKUwiT3RpbGRlIiwJMjEzfSwNCisgICAgezB4YWQ5NThjNDIsCShGWF9MUENXU1RSKUwiQUVsaWciLAkxOTh9LA0KKyAgICB7MHhhZWE5MjYxZCwJKEZYX0xQQ1dTVFIpTCJPdW1sIiwJMjE0fSwNCisgICAgezB4YjA0MGVhZmEsCShGWF9MUENXU1RSKUwidUFyciIsCTg2NTd9LA0KKyAgICB7MHhiMDdjMmUxYywJKEZYX0xQQ1dTVFIpTCJiZXRhIiwJOTQ2fSwNCisgICAgezB4YjIyMGU5MmYsCShGWF9MUENXU1RSKUwiYnVsbCIsCTgyMjZ9LA0KKyAgICB7MHhiMjI3NTBjNCwJKEZYX0xQQ1dTVFIpTCJjY2VkaWwiLAkyMzF9LA0KKyAgICB7MHhiMzhhYjMxYSwJKEZYX0xQQ1dTVFIpTCJ1YXJyIiwJODU5M30sDQorICAgIHsweGI1OThiNjgzLAkoRlhfTFBDV1NUUilMInV1bWwiLAkyNTJ9LA0KKyAgICB7MHhiNmM1OGIyMSwJKEZYX0xQQ1dTVFIpTCJPYWN1dGUiLAkyMTF9LA0KKyAgICB7MHhiNmQyYTYxNywJKEZYX0xQQ1dTVFIpTCJvbGluZSIsCTgyNTR9LA0KKyAgICB7MHhiYTlmZDk4OSwJKEZYX0xQQ1dTVFIpTCJkQXJyIiwJODY1OX0sDQorICAgIHsweGJiNWNjZDQxLAkoRlhfTFBDV1NUUilMImxncmF2ZSIsCTIwNH0sDQorICAgIHsweGJkMzliNDRjLAkoRlhfTFBDV1NUUilMIndlaWVycCIsCTg0NzJ9LA0KKyAgICB7MHhiZGU5YTFhOSwJKEZYX0xQQ1dTVFIpTCJkYXJyIiwJODU5NX0sDQorICAgIHsweGMwMjdlMzI5LAkoRlhfTFBDV1NUUilMInBlcm1pbCIsCTgyNDB9LA0KKyAgICB7MHhjMjQ1MTM4OSwJKEZYX0xQQ1dTVFIpTCJ1cHNpaCIsCTk3OH0sDQorICAgIHsweGMzYWYxY2E0LAkoRlhfTFBDV1NUUilMIkNjZWRpbCIsCTE5OX0sDQorICAgIHsweGNkMTY0MjQ5LAkoRlhfTFBDV1NUUilMImZub2YiLAk0MDJ9LA0KKyAgICB7MHhjZjZjODQ2NywJKEZYX0xQQ1dTVFIpTCJoZWFydHMiLAk5ODI5fSwNCisgICAgezB4ZDEyMjgzOTAsCShGWF9MUENXU1RSKUwidHJhZGUiLAk4NDgyfSwNCisgICAgezB4ZDE0NjI0MDcsCShGWF9MUENXU1RSKUwieXVtbCIsCTI1NX0sDQorICAgIHsweGQyY2YyMjUzLAkoRlhfTFBDV1NUUilMIm9wbHVzIiwJODg1M30sDQorICAgIHsweGQzMTBjMWZjLAkoRlhfTFBDV1NUUilMIkJldGEiLAk5MTR9LA0KKyAgICB7MHhkNTljNGQ3NCwJKEZYX0xQQ1dTVFIpTCJpbmZpbiIsCTg3MzR9LA0KKyAgICB7MHhkNjRkNDcwZCwJKEZYX0xQQ1dTVFIpTCJoQXJyIiwJODY2MH0sDQorICAgIHsweGQ2N2Q5Yzc1LAkoRlhfTFBDV1NUUilMImRpdmlkZSIsCTI0N30sDQorICAgIHsweGQ2OThkZDM3LAkoRlhfTFBDV1NUUilMIk9taWNyb24iLAk5Mjd9LA0KKyAgICB7MHhkODJkNGE2MywJKEZYX0xQQ1dTVFIpTCJVdW1sIiwJMjIwfSwNCisgICAgezB4ZDk5NzBmMmQsCShGWF9MUENXU1RSKUwiaGFyciIsCTg1OTZ9LA0KKyAgICB7MHhkYTkxZmQ5OSwJKEZYX0xQQ1dTVFIpTCJjbHVicyIsCTk4Mjd9LA0KKyAgICB7MHhkYmU1YmRjYywJKEZYX0xQQ1dTVFIpTCJ0aGVyZTQiLAk4NzU2fSwNCisgICAgezB4ZGQ3NjcxYmQsCShGWF9MUENXU1RSKUwicHJpbWUiLAk4MjQyfSwNCisgICAgezB4ZGZjZjNjMDYsCShGWF9MUENXU1RSKUwiYWxwaGEiLAk5NDV9LA0KKyAgICB7MHhlMDIxMzA2MywJKEZYX0xQQ1dTVFIpTCJzYXJvbiIsCTM1M30sDQorICAgIHsweGUxOTExZDgzLAkoRlhfTFBDV1NUUilMInJhZGljIiwJODczMH0sDQorICAgIHsweGUyZTc1NDY4LAkoRlhfTFBDV1NUUilMInJhcXVvIiwJMTg3fSwNCisgICAgezB4ZTZlMjdhNWUsCShGWF9MUENXU1RSKUwibGFjdXRlIiwJMjA1fSwNCisgICAgezB4ZTc0YThmMzYsCShGWF9MUENXU1RSKUwidWNpcmMiLAkyNTF9LA0KKyAgICB7MHhlODY0ZWNiNiwJKEZYX0xQQ1dTVFIpTCJUaGV0YSIsCTkyMH0sDQorICAgIHsweGVjZGRkZTVlLAkoRlhfTFBDV1NUUilMIm5hYmxhIiwJODcxMX0sDQorICAgIHsweGVkMWMzNTU3LAkoRlhfTFBDV1NUUilMIm9taWNyb24iLAk5NTl9LA0KKyAgICB7MHhlZjgyMjI4ZiwJKEZYX0xQQ1dTVFIpTCJyY2VpbCIsCTg5Njl9LA0KKyAgICB7MHhmMWZhYjQ5MSwJKEZYX0xQQ1dTVFIpTCJsQXJyIiwJODY1Nn0sDQorICAgIHsweGYzZGFiN2U3LAkoRlhfTFBDV1NUUilMIll1bWwiLAkzNzZ9LA0KKyAgICB7MHhmNDI5NDk2MiwJKEZYX0xQQ1dTVFIpTCJsYXF1byIsCTE3MX0sDQorICAgIHsweGY1NDQ2ODIyLAkoRlhfTFBDV1NUUilMImxhbmciLAk5MDAxfSwNCisgICAgezB4ZjU0NDdjYjEsCShGWF9MUENXU1RSKUwibGFyciIsCTg1OTJ9LA0KKyAgICB7MHhmNjZlOWJlYSwJKEZYX0xQQ1dTVFIpTCJ1Z3JhdmUiLAkyNDl9LA0KKyAgICB7MHhmNmI0Y2U3MCwJKEZYX0xQQ1dTVFIpTCJsb3RhIiwJOTIxfSwNCisgICAgezB4ZjZlZjM0ZWQsCShGWF9MUENXU1RSKUwia2FwcGEiLAk5NTR9LA0KKyAgICB7MHhmNzJhM2E1NiwJKEZYX0xQQ1dTVFIpTCJ0aGluc3AiLAk4MjAxfSwNCisgICAgezB4Zjc1MjgwMWEsCShGWF9MUENXU1RSKUwibHVtbCIsCTIwN30sDQorICAgIHsweGY4OGM4NDMwLAkoRlhfTFBDV1NUUilMIm9jaXJjIiwJMjQ0fSwNCisgICAgezB4Zjk2NzYxNzgsCShGWF9MUENXU1RSKUwiZnJhc2wiLAk4MjYwfSwNCisgICAgezB4ZmQwMTg4NWUsCShGWF9MUENXU1RSKUwiaWdyYXZlIiwJMjM2fSwNCisgICAgezB4ZmYzMjgxZGEsCShGWF9MUENXU1RSKUwiZWdyYXZlIiwJMjMyfSwNCit9Ow0KK3N0YXRpYyBYRkFfRk1IdG1sUmVzZXJ2ZUNvZGUgcmVzZXJ2ZXNGb3JFbmNvZGUgW10gPSB7DQorICAgIHszNCwJKEZYX0xQQ1dTVFIpKEwicXVvdCIpfSwNCisgICAgezM4LAkoRlhfTFBDV1NUUikoTCJhbXAiKX0sDQorICAgIHszOSwJKEZYX0xQQ1dTVFIpKEwiYXBvcyIpfSwNCisgICAgezYwLAkoRlhfTFBDV1NUUikoTCJsdCIpfSwNCisgICAgezYyLAkoRlhfTFBDV1NUUikoTCJndCIpfSwNCisgICAgezE2MCwJKEZYX0xQQ1dTVFIpKEwibmJzcCIpfSwNCisgICAgezE2MSwJKEZYX0xQQ1dTVFIpKEwiaWV4Y2wiKX0sDQorICAgIHsxNjIsCShGWF9MUENXU1RSKShMImNlbnQiKX0sDQorICAgIHsxNjMsCShGWF9MUENXU1RSKShMInB1bmQiKX0sDQorICAgIHsxNjQsCShGWF9MUENXU1RSKShMImN1cnJlbnQiKX0sDQorICAgIHsxNjUsCShGWF9MUENXU1RSKShMInllbiIpfSwNCisgICAgezE2NiwJKEZYX0xQQ1dTVFIpKEwiYnJ2YmFyIil9LA0KKyAgICB7MTY3LAkoRlhfTFBDV1NUUikoTCJzZWN0Iil9LA0KKyAgICB7MTY4LAkoRlhfTFBDV1NUUikoTCJ1bWwiKX0sDQorICAgIHsxNjksCShGWF9MUENXU1RSKShMImNvcHkiKX0sDQorICAgIHsxNzAsCShGWF9MUENXU1RSKShMIm9yZGYiKX0sDQorICAgIHsxNzEsCShGWF9MUENXU1RSKShMImxhcXVvIil9LA0KKyAgICB7MTcyLAkoRlhfTFBDV1NUUikoTCJub3QiKX0sDQorICAgIHsxNzMsCShGWF9MUENXU1RSKShMInNoeSIpfSwNCisgICAgezE3NCwJKEZYX0xQQ1dTVFIpKEwicmVnIil9LA0KKyAgICB7MTc1LAkoRlhfTFBDV1NUUikoTCJtYWNyIil9LA0KKyAgICB7MTc2LAkoRlhfTFBDV1NUUikoTCJkZWciKX0sDQorICAgIHsxNzcsCShGWF9MUENXU1RSKShMInBsdXNtbiIpfSwNCisgICAgezE3OCwJKEZYX0xQQ1dTVFIpKEwic3VwMiIpfSwNCisgICAgezE3OSwJKEZYX0xQQ1dTVFIpKEwic3VwMyIpfSwNCisgICAgezE4MCwJKEZYX0xQQ1dTVFIpKEwiYWN1dGUiKX0sDQorICAgIHsxODEsCShGWF9MUENXU1RSKShMIm1pY3JvIil9LA0KKyAgICB7MTgyLAkoRlhfTFBDV1NUUikoTCJwYXJhIil9LA0KKyAgICB7MTgzLAkoRlhfTFBDV1NUUikoTCJtaWRkb3QiKX0sDQorICAgIHsxODQsCShGWF9MUENXU1RSKShMImNlZGlsIil9LA0KKyAgICB7MTg1LAkoRlhfTFBDV1NUUikoTCJzdXAxIil9LA0KKyAgICB7MTg2LAkoRlhfTFBDV1NUUikoTCJvcmRtIil9LA0KKyAgICB7MTg3LAkoRlhfTFBDV1NUUikoTCJyYXF1byIpfSwNCisgICAgezE4OCwJKEZYX0xQQ1dTVFIpKEwiZnJhYzE0Iil9LA0KKyAgICB7MTg5LAkoRlhfTFBDV1NUUikoTCJmcmFjMTIiKX0sDQorICAgIHsxOTAsCShGWF9MUENXU1RSKShMImZyYWMzNCIpfSwNCisgICAgezE5MSwJKEZYX0xQQ1dTVFIpKEwiaXF1ZXN0Iil9LA0KKyAgICB7MTkyLAkoRlhfTFBDV1NUUikoTCJBZ3JhdmUiKX0sDQorICAgIHsxOTMsCShGWF9MUENXU1RSKShMIkFhY3V0ZSIpfSwNCisgICAgezE5NCwJKEZYX0xQQ1dTVFIpKEwiQWNpcmMiKX0sDQorICAgIHsxOTUsCShGWF9MUENXU1RSKShMIkF0aWxkZSIpfSwNCisgICAgezE5NiwJKEZYX0xQQ1dTVFIpKEwiQXVtbCIpfSwNCisgICAgezE5NywJKEZYX0xQQ1dTVFIpKEwiQXJpbmciKX0sDQorICAgIHsxOTgsCShGWF9MUENXU1RSKShMIkFFbGlnIil9LA0KKyAgICB7MTk5LAkoRlhfTFBDV1NUUikoTCJDY2VkaWwiKX0sDQorICAgIHsyMDAsCShGWF9MUENXU1RSKShMIkVncmF2ZSIpfSwNCisgICAgezIwMSwJKEZYX0xQQ1dTVFIpKEwiRWFjdXRlIil9LA0KKyAgICB7MjAyLAkoRlhfTFBDV1NUUikoTCJFY2lyYyIpfSwNCisgICAgezIwMywJKEZYX0xQQ1dTVFIpKEwiRXVtbCIpfSwNCisgICAgezIwNCwJKEZYX0xQQ1dTVFIpKEwibGdyYXZlIil9LA0KKyAgICB7MjA1LAkoRlhfTFBDV1NUUikoTCJsYWN1dGUiKX0sDQorICAgIHsyMDYsCShGWF9MUENXU1RSKShMImxjaXJjIil9LA0KKyAgICB7MjA3LAkoRlhfTFBDV1NUUikoTCJsdW1sIil9LA0KKyAgICB7MjA4LAkoRlhfTFBDV1NUUikoTCJFVEgiKX0sDQorICAgIHsyMDksCShGWF9MUENXU1RSKShMIk50aWxkZSIpfSwNCisgICAgezIxMCwJKEZYX0xQQ1dTVFIpKEwiT2dyYXZlIil9LA0KKyAgICB7MjExLAkoRlhfTFBDV1NUUikoTCJPYWN1dGUiKX0sDQorICAgIHsyMTIsCShGWF9MUENXU1RSKShMIk9jaXJjIil9LA0KKyAgICB7MjEzLAkoRlhfTFBDV1NUUikoTCJPdGlsZGUiKX0sDQorICAgIHsyMTQsCShGWF9MUENXU1RSKShMIk91bWwiKX0sDQorICAgIHsyMTUsCShGWF9MUENXU1RSKShMInRpbWVzIil9LA0KKyAgICB7MjE2LAkoRlhfTFBDV1NUUikoTCJPc2xhc2giKX0sDQorICAgIHsyMTcsCShGWF9MUENXU1RSKShMIlVncmF2ZSIpfSwNCisgICAgezIxOCwJKEZYX0xQQ1dTVFIpKEwiVWFjdXRlIil9LA0KKyAgICB7MjE5LAkoRlhfTFBDV1NUUikoTCJVY2lyYyIpfSwNCisgICAgezIyMCwJKEZYX0xQQ1dTVFIpKEwiVXVtbCIpfSwNCisgICAgezIyMSwJKEZYX0xQQ1dTVFIpKEwiWWFjdXRlIil9LA0KKyAgICB7MjIyLAkoRlhfTFBDV1NUUikoTCJUSE9STiIpfSwNCisgICAgezIyMywJKEZYX0xQQ1dTVFIpKEwic3psaWciKX0sDQorICAgIHsyMjQsCShGWF9MUENXU1RSKShMImFncmF2ZSIpfSwNCisgICAgezIyNSwJKEZYX0xQQ1dTVFIpKEwiYWFjdXRlIil9LA0KKyAgICB7MjI2LAkoRlhfTFBDV1NUUikoTCJhY2lyYyIpfSwNCisgICAgezIyNywJKEZYX0xQQ1dTVFIpKEwiYXRpbGRlIil9LA0KKyAgICB7MjI4LAkoRlhfTFBDV1NUUikoTCJhdW1sIil9LA0KKyAgICB7MjI5LAkoRlhfTFBDV1NUUikoTCJhcmluZyIpfSwNCisgICAgezIzMCwJKEZYX0xQQ1dTVFIpKEwiYWVsaWciKQkJfSwNCisgICAgezIzMSwJKEZYX0xQQ1dTVFIpKEwiY2NlZGlsIikJCX0sDQorICAgIHsyMzIsCShGWF9MUENXU1RSKShMImVncmF2ZSIpCQl9LA0KKyAgICB7MjMzLAkoRlhfTFBDV1NUUikoTCJlYWN1dGUiKQkJfSwNCisgICAgezIzNCwJKEZYX0xQQ1dTVFIpKEwiZWNpcmMiKQkJfSwNCisgICAgezIzNSwJKEZYX0xQQ1dTVFIpKEwiZXVtbCIpCQl9LA0KKyAgICB7MjM2LAkoRlhfTFBDV1NUUikoTCJpZ3JhdmUiKQkJfSwNCisgICAgezIzNywJKEZYX0xQQ1dTVFIpKEwiaWFjdXRlIikJCX0sDQorICAgIHsyMzgsCShGWF9MUENXU1RSKShMImljaXJjIikJCX0sDQorICAgIHsyMzksCShGWF9MUENXU1RSKShMIml1bWwiKQkJfSwNCisgICAgezI0MCwJKEZYX0xQQ1dTVFIpKEwiZXRoIikJCX0sDQorICAgIHsyNDEsCShGWF9MUENXU1RSKShMIm50aWxkZSIpCQl9LA0KKyAgICB7MjQyLAkoRlhfTFBDV1NUUikoTCJvZ3JhdmUiKQkJfSwNCisgICAgezI0MywJKEZYX0xQQ1dTVFIpKEwib2FjdXRlIikJCX0sDQorICAgIHsyNDQsCShGWF9MUENXU1RSKShMIm9jaXJjIikJCX0sDQorICAgIHsyNDUsCShGWF9MUENXU1RSKShMIm90aWxkZSIpCQl9LA0KKyAgICB7MjQ2LAkoRlhfTFBDV1NUUikoTCJvdW1sIikJCX0sDQorICAgIHsyNDcsCShGWF9MUENXU1RSKShMImRpdmlkZSIpCQl9LA0KKyAgICB7MjQ4LAkoRlhfTFBDV1NUUikoTCJvc2xhc2giKQkJfSwNCisgICAgezI0OSwJKEZYX0xQQ1dTVFIpKEwidWdyYXZlIikJCX0sDQorICAgIHsyNTAsCShGWF9MUENXU1RSKShMInVhY3V0ZSIpCQl9LA0KKyAgICB7MjUxLAkoRlhfTFBDV1NUUikoTCJ1Y2lyYyIpCQl9LA0KKyAgICB7MjUyLAkoRlhfTFBDV1NUUikoTCJ1dW1sIikJCX0sDQorICAgIHsyNTMsCShGWF9MUENXU1RSKShMInlhY3V0ZSIpCQl9LA0KKyAgICB7MjU0LAkoRlhfTFBDV1NUUikoTCJ0aG9ybiIpCQl9LA0KKyAgICB7MjU1LAkoRlhfTFBDV1NUUikoTCJ5dW1sIikJCX0sDQorICAgIHszMzgsCShGWF9MUENXU1RSKShMIk9FbGlnIikJCX0sDQorICAgIHszMzksCShGWF9MUENXU1RSKShMIm9lbGlnIikJCX0sDQorICAgIHszNTIsCShGWF9MUENXU1RSKShMIlNjYXJvbiIpCQl9LA0KKyAgICB7MzUzLAkoRlhfTFBDV1NUUikoTCJzYXJvbiIpCQl9LA0KKyAgICB7Mzc2LAkoRlhfTFBDV1NUUikoTCJZdW1sIikJCX0sDQorICAgIHs0MDIsCShGWF9MUENXU1RSKShMImZub2YiKQkJfSwNCisgICAgezcxMCwJKEZYX0xQQ1dTVFIpKEwiY2lyYyIpCQl9LA0KKyAgICB7NzMyLAkoRlhfTFBDV1NUUikoTCJ0aWxkZSIpCQl9LA0KKyAgICB7OTEzLAkoRlhfTFBDV1NUUikoTCJBbHBoYSIpCQl9LA0KKyAgICB7OTE0LAkoRlhfTFBDV1NUUikoTCJCZXRhIikJCX0sDQorICAgIHs5MTUsCShGWF9MUENXU1RSKShMIkdhbW1hIikJCX0sDQorICAgIHs5MTYsCShGWF9MUENXU1RSKShMIkRlbHRhIikJCX0sDQorICAgIHs5MTcsCShGWF9MUENXU1RSKShMIkVwc2lsb24iKQl9LA0KKyAgICB7OTE4LAkoRlhfTFBDV1NUUikoTCJaZXRhIikJCX0sDQorICAgIHs5MTksCShGWF9MUENXU1RSKShMIkV0YSIpCQl9LA0KKyAgICB7OTIwLAkoRlhfTFBDV1NUUikoTCJUaGV0YSIpCQl9LA0KKyAgICB7OTIxLAkoRlhfTFBDV1NUUikoTCJsb3RhIikJCX0sDQorICAgIHs5MjIsCShGWF9MUENXU1RSKShMIkthcHBhIikJCX0sDQorICAgIHs5MjMsCShGWF9MUENXU1RSKShMIkxhbWJkYSIpCQl9LA0KKyAgICB7OTI0LAkoRlhfTFBDV1NUUikoTCJNdSIpCQkJfSwNCisgICAgezkyNSwJKEZYX0xQQ1dTVFIpKEwiTnUiKQkJCX0sDQorICAgIHs5MjYsCShGWF9MUENXU1RSKShMIlhpIikJCQl9LA0KKyAgICB7OTI3LAkoRlhfTFBDV1NUUikoTCJPbWljcm9uIikJfSwNCisgICAgezkyOCwJKEZYX0xQQ1dTVFIpKEwiUGkiKQkJCX0sDQorICAgIHs5MjksCShGWF9MUENXU1RSKShMIlJobyIpCQl9LA0KKyAgICB7OTMxLAkoRlhfTFBDV1NUUikoTCJTaWdtYSIpCQl9LA0KKyAgICB7OTMyLAkoRlhfTFBDV1NUUikoTCJUYXUiKQkJfSwNCisgICAgezkzMywJKEZYX0xQQ1dTVFIpKEwiVXBzaWxvbiIpCX0sDQorICAgIHs5MzQsCShGWF9MUENXU1RSKShMIlBoaSIpCQl9LA0KKyAgICB7OTM1LAkoRlhfTFBDV1NUUikoTCJDaGkiKQkJfSwNCisgICAgezkzNiwJKEZYX0xQQ1dTVFIpKEwiUHNpIikJCX0sDQorICAgIHs5MzcsCShGWF9MUENXU1RSKShMIk9tZWdhIikJCX0sDQorICAgIHs5NDUsCShGWF9MUENXU1RSKShMImFscGhhIikJCX0sDQorICAgIHs5NDYsCShGWF9MUENXU1RSKShMImJldGEiKQkJfSwNCisgICAgezk0NywJKEZYX0xQQ1dTVFIpKEwiZ2FtbWEiKQkJfSwNCisgICAgezk0OCwJKEZYX0xQQ1dTVFIpKEwiZGVsdGEiKQkJfSwNCisgICAgezk0OSwJKEZYX0xQQ1dTVFIpKEwiZXBzaWxvbiIpCX0sDQorICAgIHs5NTAsCShGWF9MUENXU1RSKShMInpldGEiKQkJfSwNCisgICAgezk1MSwJKEZYX0xQQ1dTVFIpKEwiZXRhIikJCX0sDQorICAgIHs5NTIsCShGWF9MUENXU1RSKShMInRoZXRhIikJCX0sDQorICAgIHs5NTMsCShGWF9MUENXU1RSKShMImlvdGEiKQkJfSwNCisgICAgezk1NCwJKEZYX0xQQ1dTVFIpKEwia2FwcGEiKQkJfSwNCisgICAgezk1NSwJKEZYX0xQQ1dTVFIpKEwibGFtYmRhIikJCX0sDQorICAgIHs5NTYsCShGWF9MUENXU1RSKShMIm11IikJCQl9LA0KKyAgICB7OTU3LAkoRlhfTFBDV1NUUikoTCJudSIpCQkJfSwNCisgICAgezk1OCwJKEZYX0xQQ1dTVFIpKEwieGkiKQkJCX0sDQorICAgIHs5NTksCShGWF9MUENXU1RSKShMIm9taWNyb24iKQl9LA0KKyAgICB7OTYwLAkoRlhfTFBDV1NUUikoTCJwaSIpCQkJfSwNCisgICAgezk2MSwJKEZYX0xQQ1dTVFIpKEwicmhvIikJCX0sDQorICAgIHs5NjIsCShGWF9MUENXU1RSKShMInNpZ21hZiIpCQl9LA0KKyAgICB7OTYzLAkoRlhfTFBDV1NUUikoTCJzaWdtYSIpCQl9LA0KKyAgICB7OTY0LAkoRlhfTFBDV1NUUikoTCJ0YXUiKQkJfSwNCisgICAgezk2NSwJKEZYX0xQQ1dTVFIpKEwidXBzaWxvbiIpCX0sDQorICAgIHs5NjYsCShGWF9MUENXU1RSKShMInBoaSIpCQl9LA0KKyAgICB7OTY3LAkoRlhfTFBDV1NUUikoTCJjaGkiKQkJfSwNCisgICAgezk2OCwJKEZYX0xQQ1dTVFIpKEwicHNpIikJCX0sDQorICAgIHs5NjksCShGWF9MUENXU1RSKShMIm9tZWdhIikJCX0sDQorICAgIHs5NzcsCShGWF9MUENXU1RSKShMInRoZXRhc3ltIikJfSwNCisgICAgezk3OCwJKEZYX0xQQ1dTVFIpKEwidXBzaWgiKQkJfSwNCisgICAgezk4MiwJKEZYX0xQQ1dTVFIpKEwicGl2IikJCX0sDQorICAgIHs4MTk0LAkoRlhfTFBDV1NUUikoTCJlbnNwIikJCX0sDQorICAgIHs4MTk1LAkoRlhfTFBDV1NUUikoTCJlbXNwIikJCX0sDQorICAgIHs4MjAxLAkoRlhfTFBDV1NUUikoTCJ0aGluc3AiKQkJfSwNCisgICAgezgyMDQsCShGWF9MUENXU1RSKShMInp3bmoiKQkJfSwNCisgICAgezgyMDUsCShGWF9MUENXU1RSKShMInp3aiIpCQl9LA0KKyAgICB7ODIwNiwJKEZYX0xQQ1dTVFIpKEwibHJtIikJCX0sDQorICAgIHs4MjA3LAkoRlhfTFBDV1NUUikoTCJybG0iKQkJfSwNCisgICAgezgyMTEsCShGWF9MUENXU1RSKShMIm5kYXNoIikJCX0sDQorICAgIHs4MjEyLAkoRlhfTFBDV1NUUikoTCJtZGFzaCIpCQl9LA0KKyAgICB7ODIxNiwJKEZYX0xQQ1dTVFIpKEwibHNxdW8iKQkJfSwNCisgICAgezgyMTcsCShGWF9MUENXU1RSKShMInJzcXVvIikJCX0sDQorICAgIHs4MjE4LAkoRlhfTFBDV1NUUikoTCJzYnF1byIpCQl9LA0KKyAgICB7ODIyMCwJKEZYX0xQQ1dTVFIpKEwibGRxdW8iKQkJfSwNCisgICAgezgyMjEsCShGWF9MUENXU1RSKShMInRkcXVvIikJCX0sDQorICAgIHs4MjIyLAkoRlhfTFBDV1NUUikoTCJiZHF1byIpCQl9LA0KKyAgICB7ODIyNCwJKEZYX0xQQ1dTVFIpKEwiZGFnZ2VyIikJCX0sDQorICAgIHs4MjI1LAkoRlhfTFBDV1NUUikoTCJEYWdnZXIiKQkJfSwNCisgICAgezgyMjYsCShGWF9MUENXU1RSKShMImJ1bGwiKQkJfSwNCisgICAgezgyMzAsCShGWF9MUENXU1RSKShMImhlbGxpcCIpCQl9LA0KKyAgICB7ODI0MCwJKEZYX0xQQ1dTVFIpKEwicGVybWlsIikJCX0sDQorICAgIHs4MjQyLAkoRlhfTFBDV1NUUikoTCJwcmltZSIpCQl9LA0KKyAgICB7ODI0OSwJKEZYX0xQQ1dTVFIpKEwibHNhcXVvIikJCX0sDQorICAgIHs4MjUwLAkoRlhfTFBDV1NUUikoTCJyc2FxdW8iKQkJfSwNCisgICAgezgyNTQsCShGWF9MUENXU1RSKShMIm9saW5lIikJCX0sDQorICAgIHs4MjYwLAkoRlhfTFBDV1NUUikoTCJmcmFzbCIpCQl9LA0KKyAgICB7ODM2NCwJKEZYX0xQQ1dTVFIpKEwiZXVybyIpCQl9LA0KKyAgICB7ODQ2NSwJKEZYX0xQQ1dTVFIpKEwiaW1hZ2UiKQkJfSwNCisgICAgezg0NzIsCShGWF9MUENXU1RSKShMIndlaWVycCIpCQl9LA0KKyAgICB7ODQ3NiwJKEZYX0xQQ1dTVFIpKEwicmVhbCIpCQl9LA0KKyAgICB7ODQ4MiwJKEZYX0xQQ1dTVFIpKEwidHJhZGUiKQkJfSwNCisgICAgezg1MDEsCShGWF9MUENXU1RSKShMImFsZWZzeW0iKQl9LA0KKyAgICB7ODU5MiwJKEZYX0xQQ1dTVFIpKEwibGFyciIpCQl9LA0KKyAgICB7ODU5MywJKEZYX0xQQ1dTVFIpKEwidWFyciIpCQl9LA0KKyAgICB7ODU5NCwJKEZYX0xQQ1dTVFIpKEwicmFyciIpCQl9LA0KKyAgICB7ODU5NSwJKEZYX0xQQ1dTVFIpKEwiZGFyciIpCQl9LA0KKyAgICB7ODU5NiwJKEZYX0xQQ1dTVFIpKEwiaGFyciIpCQl9LA0KKyAgICB7ODYyOSwJKEZYX0xQQ1dTVFIpKEwiY3JhcnIiKQkJfSwNCisgICAgezg2NTYsCShGWF9MUENXU1RSKShMImxBcnIiKQkJfSwNCisgICAgezg2NTcsCShGWF9MUENXU1RSKShMInVBcnIiKQkJfSwNCisgICAgezg2NTgsCShGWF9MUENXU1RSKShMInJBcnIiKQkJfSwNCisgICAgezg2NTksCShGWF9MUENXU1RSKShMImRBcnIiKQkJfSwNCisgICAgezg2NjAsCShGWF9MUENXU1RSKShMImhBcnIiKQkJfSwNCisgICAgezg3MDQsCShGWF9MUENXU1RSKShMImZvcmFsbCIpCQl9LA0KKyAgICB7ODcwNiwJKEZYX0xQQ1dTVFIpKEwicGFydCIpCQl9LA0KKyAgICB7ODcwNywJKEZYX0xQQ1dTVFIpKEwiZXhpc3QiKQkJfSwNCisgICAgezg3MDksCShGWF9MUENXU1RSKShMImVtcHR5IikJCX0sDQorICAgIHs4NzExLAkoRlhfTFBDV1NUUikoTCJuYWJsYSIpCQl9LA0KKyAgICB7ODcxMiwJKEZYX0xQQ1dTVFIpKEwiaXNpbiIpCQl9LA0KKyAgICB7ODcxMywJKEZYX0xQQ1dTVFIpKEwibm90aW4iKQkJfSwNCisgICAgezg3MTUsCShGWF9MUENXU1RSKShMIm5pIikJCX0sDQorICAgIHs4NzE5LAkoRlhfTFBDV1NUUikoTCJwcm9kIikJfSwNCisgICAgezg3MjEsCShGWF9MUENXU1RSKShMInN1bSIpCX0sDQorICAgIHs4NzIyLAkoRlhfTFBDV1NUUikoTCJtaW51cyIpCX0sDQorICAgIHs4NzI3LAkoRlhfTFBDV1NUUikoTCJsb3dhc3QiKQl9LA0KKyAgICB7ODczMCwJKEZYX0xQQ1dTVFIpKEwicmFkaWMiKQl9LA0KKyAgICB7ODczMywJKEZYX0xQQ1dTVFIpKEwicHJvcCIpCX0sDQorICAgIHs4NzM0LAkoRlhfTFBDV1NUUikoTCJpbmZpbiIpCX0sDQorICAgIHs4NzM2LAkoRlhfTFBDV1NUUikoTCJhbmciKQl9LA0KKyAgICB7ODc0MywJKEZYX0xQQ1dTVFIpKEwiYW5kIikJfSwNCisgICAgezg3NDQsCShGWF9MUENXU1RSKShMIm9yIikJCX0sDQorICAgIHs4NzQ1LAkoRlhfTFBDV1NUUikoTCJjYXAiKQl9LA0KKyAgICB7ODc0NiwJKEZYX0xQQ1dTVFIpKEwiY3VwIikJfSwNCisgICAgezg3NDcsCShGWF9MUENXU1RSKShMImludCIpCX0sDQorICAgIHs4NzU2LAkoRlhfTFBDV1NUUikoTCJ0aGVyZTQiKQl9LA0KKyAgICB7ODc2NCwJKEZYX0xQQ1dTVFIpKEwic2ltIikJfSwNCisgICAgezg3NzMsCShGWF9MUENXU1RSKShMImNvbmciKQl9LA0KKyAgICB7ODc3NiwJKEZYX0xQQ1dTVFIpKEwiYXN5bXAiKQl9LA0KKyAgICB7ODgwMCwJKEZYX0xQQ1dTVFIpKEwibmUiKQkJfSwNCisgICAgezg4MDEsCShGWF9MUENXU1RSKShMImVxdWl2IikJfSwNCisgICAgezg4MDQsCShGWF9MUENXU1RSKShMImxlIikJCX0sDQorICAgIHs4ODA1LAkoRlhfTFBDV1NUUikoTCJnZSIpCQl9LA0KKyAgICB7ODgzNCwJKEZYX0xQQ1dTVFIpKEwic3ViIikJfSwNCisgICAgezg4MzUsCShGWF9MUENXU1RSKShMInN1cCIpCX0sDQorICAgIHs4ODM2LAkoRlhfTFBDV1NUUikoTCJuc3ViIikJfSwNCisgICAgezg4MzgsCShGWF9MUENXU1RSKShMInN1YmUiKQl9LA0KKyAgICB7ODgzOSwJKEZYX0xQQ1dTVFIpKEwic3VwZSIpCX0sDQorICAgIHs4ODUzLAkoRlhfTFBDV1NUUikoTCJvcGx1cyIpCX0sDQorICAgIHs4ODU1LAkoRlhfTFBDV1NUUikoTCJvdGltZXMiKQl9LA0KKyAgICB7ODg2OSwJKEZYX0xQQ1dTVFIpKEwicGVycCIpCX0sDQorICAgIHs4OTAxLAkoRlhfTFBDV1NUUikoTCJzZG90IikJfSwNCisgICAgezg5NjgsCShGWF9MUENXU1RSKShMImxjZWlsIikJfSwNCisgICAgezg5NjksCShGWF9MUENXU1RSKShMInJjZWlsIikJfSwNCisgICAgezg5NzAsCShGWF9MUENXU1RSKShMImxmbG9vciIpCX0sDQorICAgIHs4OTcxLAkoRlhfTFBDV1NUUikoTCJyZmxvb3IiKQl9LA0KKyAgICB7OTAwMSwJKEZYX0xQQ1dTVFIpKEwibGFuZyIpCX0sDQorICAgIHs5MDAyLAkoRlhfTFBDV1NUUikoTCJyYW5nIikJfSwNCisgICAgezk2NzQsCShGWF9MUENXU1RSKShMImxveiIpCX0sDQorICAgIHs5ODI0LAkoRlhfTFBDV1NUUikoTCJzcGFkZXMiKQl9LA0KKyAgICB7OTgyNywJKEZYX0xQQ1dTVFIpKEwiY2x1YnMiKQl9LA0KKyAgICB7OTgyOSwJKEZYX0xQQ1dTVFIpKEwiaGVhcnRzIikJfSwNCisgICAgezk4MzAsCShGWF9MUENXU1RSKShMImRpYW1zIikJfSwNCit9Ow0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkFicyhGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICAgICAgaWYoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgaWYoZFZhbHVlIDwgMCkgew0KKyAgICAgICAgICAgICAgICBkVmFsdWUgPSAtZFZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiQWJzIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkF2ZyhGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDMyIHVDb3VudCA9IDA7DQorICAgIEZYX0RPVUJMRSBkU3VtID0gMC4wOw0KKyAgICBpZihhcmdjID49IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IDA7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICAgICAgICBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBkZWZhdWx0UHJvcFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIGRlZmF1bHRQcm9wVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0UHJvcFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgZGVmYXVsdFByb3BWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRlZmF1bHRQcm9wVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIGFyZ1ZhbHVlID0gMDsNCisgICAgfQ0KKyAgICBpZigwID09IHVDb3VudCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZFN1bSAvIHVDb3VudCk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Q2VpbChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhTWVNfY2VpbChIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdWYWx1ZSkpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkNlaWwiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Q291bnQoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIEZYX1VJTlQzMiB1Q291bnQgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgaWYoaUxlbmd0aCA+IDIpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCArPSAoRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpID8gMCA6IDEpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgfQ0KKyAgICBhcmdWYWx1ZSA9IDA7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhfSU5UMzIpdUNvdW50KTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Rmxvb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIEZYU1lTX2Zsb29yKEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1ZhbHVlKSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiRmxvb3IiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TWF4KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBGWF9VSU5UMzIgdUNvdW50ID0gMDsNCisgICAgRlhfRE9VQkxFIGRNYXhWYWx1ZSA9IDAuMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1ZhbHVlID0gMDsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgICBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVmFsdWUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIGlmKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZE1heFZhbHVlIDwgZFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZE1heFZhbHVlID0gZFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBpZighRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgICBpZih1Q291bnQgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKGRNYXhWYWx1ZSA8IGRWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICBpZih1Q291bnQgPT0gMSkgew0KKyAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZihkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgICB9DQorICAgIGFyZ1ZhbHVlID0gMDsNCisgICAgaWYodUNvdW50KSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkTWF4VmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDMyIHVDb3VudCA9IDA7DQorICAgIEZYX0RPVUJMRSBkTWluVmFsdWUgPSAwLjA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IDA7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBpZihpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZE1pblZhbHVlID4gZFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gZFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1Q291bnQgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnVmFsdWUpKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgaWYoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgICAgaWYodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBpZihkTWluVmFsdWUgPiBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgaWYodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYoZE1pblZhbHVlID4gZFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgfQ0KKyAgICBhcmdWYWx1ZSA9IDA7DQorICAgIGlmKHVDb3VudCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZE1pblZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpNb2QoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBhcmdzLkdldFZhbHVlKDEpOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1R3bykpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0RPVUJMRSBkRGl2aWRlbmQgPSAwLjA7DQorICAgICAgICAgICAgRlhfRE9VQkxFIGREaXZpZG9yID0gMC4wOw0KKyAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYoaUxlbmd0aCA+IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkRGl2aWRlbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGREaXZpZGVuZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkRGl2aWRlbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdUd28pKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVHdvLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZihpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVHdvLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGREaXZpZG9yID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihkRGl2aWRvcikgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkRGl2aWRlbmQgLSBkRGl2aWRvciAqIChGWF9JTlQzMikoZERpdmlkZW5kIC8gZERpdmlkb3IpKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19ESVZJREVfWkVSTyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIk1vZCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDggdVByZWNpc2lvbiA9IDA7DQorICAgIGlmKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IDAuMDsNCisgICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbFZhbHVlKChGWF9GTE9BVClkVmFsdWUsIHVQcmVjaXNpb24pOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBkZWNpbWFsVmFsdWU7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHdzVmFsdWUuVVRGOEVuY29kZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfSBlbHNlIGlmKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gYXJncy5HZXRWYWx1ZSgxKTsNCisgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdUd28pKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gMC4wOw0KKyAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9ET1VCTEUgIGRQcmVjaXNpb24gPSAwLjA7DQorICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdUd28pKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVHdvLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZFByZWNpc2lvbiA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgZFByZWNpc2lvbiA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkUHJlY2lzaW9uID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGRQcmVjaXNpb24gPCAwKSB7DQorICAgICAgICAgICAgICAgIHVQcmVjaXNpb24gPSAwOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZihkUHJlY2lzaW9uID4gMTIuMCkgew0KKyAgICAgICAgICAgICAgICB1UHJlY2lzaW9uID0gMTI7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgdVByZWNpc2lvbiA9IChGWF9VSU5UOClkUHJlY2lzaW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsVmFsdWUoKEZYX0ZMT0FUKWRWYWx1ZSwgdVByZWNpc2lvbik7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IGRlY2ltYWxWYWx1ZTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgd3NWYWx1ZS5VVEY4RW5jb2RlKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlJvdW5kIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1bShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDMyIHVDb3VudCA9IDA7DQorICAgIEZYX0RPVUJMRSBkU3VtID0gMC4wOw0KKyAgICBpZihhcmdjKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgICAgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KKyAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZihpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXJnVmFsdWUgPSAwOw0KKyAgICB9DQorICAgIGlmKHVDb3VudCA8IDEpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRTdW0pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgc3RydWN0IHRtICpwVG1TdHJ1Y3QgPSAwOw0KKyAgICAgICAgdGltZV90IGN1cnJlbnRUaW1lOw0KKyAgICAgICAgdGltZSgmY3VycmVudFRpbWUpOw0KKyAgICAgICAgcFRtU3RydWN0ID0gZ210aW1lKCZjdXJyZW50VGltZSk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBidWZmZXJZZWFyOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyTW9uOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyRGF5Ow0KKyAgICAgICAgYnVmZmVyWWVhci5Gb3JtYXQoIiVkIiwgcFRtU3RydWN0LT50bV95ZWFyICsgMTkwMCk7DQorICAgICAgICBidWZmZXJNb24uRm9ybWF0KCIlMDJkIiwgcFRtU3RydWN0LT50bV9tb24gKyAxKTsNCisgICAgICAgIGJ1ZmZlckRheS5Gb3JtYXQoIiUwMmQiLCBwVG1TdHJ1Y3QtPnRtX21kYXkpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyQ3VycmVudCA9IGJ1ZmZlclllYXIgKyBidWZmZXJNb24gKyBidWZmZXJEYXk7DQorICAgICAgICBGWF9JTlQzMiBkRGF5cyA9IERhdGVTdHJpbmcyTnVtKGJ1ZmZlckN1cnJlbnQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGREYXlzKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkRhdGUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBkYXRlU3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgICAgICBGWEpTRV9IVkFMVUUgZGF0ZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGRhdGVWYWx1ZSkpIHsNCisgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZGF0ZVZhbHVlLCBkYXRlU3RyaW5nKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgbG9jYWxWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pJc29EYXRlU3RyaW5nOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IExvY2FsMklzb0RhdGUoaFRoaXMsIGRhdGVTdHJpbmcsIGZvcm1hdFN0cmluZywgbG9jYWxTdHJpbmcsIHN6SXNvRGF0ZVN0cmluZyk7DQorICAgICAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIERhdGVTdHJpbmcyTnVtKHN6SXNvRGF0ZVN0cmluZykpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGF0ZVZhbHVlKTsNCisgICAgICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KKyAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJEYXRlMk51bSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA8IDMpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9JTlQzMiBpU3R5bGUgPSAwOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTdHlsZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnTG9jYWwgPSAwOw0KKyAgICAgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgICAgICAgYXJnU3R5bGUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU3R5bGUpKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlTdHlsZSA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQorICAgICAgICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KKyAgICAgICAgICAgICAgICBpU3R5bGUgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgICAgICBhcmdMb2NhbCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdMb2NhbCkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOw0KKyAgICAgICAgICAgIEdldFN0YW5kYXJkRGF0ZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsLCBmb3JtYXRTdHIpOw0KKyAgICAgICAgICAgIGlmIChmb3JtYXRTdHIuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIGZvcm1hdFN0ciA9IEZYX0JTVFJDKCIiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIGZvcm1hdFN0cik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU3R5bGUpOw0KKyAgICAgICAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdMb2NhbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiRGF0ZTJOdW0iKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvRGF0ZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekFyZ1N0cmluZzsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzekFyZ1N0cmluZyk7DQorICAgICAgICAgICAgRlhfSU5UMzIgZERheXMgPSBEYXRlU3RyaW5nMk51bShzekFyZ1N0cmluZyk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChGWF9JTlQzMilkRGF5cyk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJJc29EYXRlMk51bSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJc29UaW1lMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIGlmKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRG9jKTsNCisgICAgICAgICAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6QXJnU3RyaW5nOw0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHN6QXJnU3RyaW5nKTsNCisgICAgICAgICAgICBzekFyZ1N0cmluZyAgPSBzekFyZ1N0cmluZy5NaWQoc3pBcmdTdHJpbmcuRmluZCgnVCcsIDApICsgMSk7DQorICAgICAgICAgICAgaWYgKHN6QXJnU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRpbWVWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6QXJnU3RyaW5nLCBzekFyZ1N0cmluZy5HZXRMZW5ndGgoKSksIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgaWYgKHRpbWVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgdW5pVGltZSA9IHRpbWVWYWx1ZS5HZXRUaW1lKCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGhvdXIgPSB1bmlUaW1lLkdldEhvdXIoKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbWluID0gdW5pVGltZS5HZXRNaW51dGUoKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgc2Vjb25kID0gdW5pVGltZS5HZXRTZWNvbmQoKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbWlsU2Vjb25kID0gdW5pVGltZS5HZXRNaWxsaXNlY29uZCgpOw0KKyAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwRGVmTG9jYWxlID0gcE1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGVmTG9jYWxlKTsNCisgICAgICAgICAgICAgICAgRlhfVElNRVpPTkUgdHpMb2NhbGU7DQorICAgICAgICAgICAgICAgIHBEZWZMb2NhbGUtPkdldFRpbWVab25lKHR6TG9jYWxlKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbWlucyA9IGhvdXIgKiA2MCArIG1pbjsNCisgICAgICAgICAgICAgICAgbWlucyAtPSAodHpMb2NhbGUudHpIb3VyICogNjApOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAobWlucyA+IDE0NDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1pbnMgLT0gMTQ0MDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3aGlsZSAobWlucyA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG1pbnMgKz0gMTQ0MDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBob3VyID0gbWlucyAvIDYwOw0KKyAgICAgICAgICAgICAgICBtaW4gPSBtaW5zICUgNjA7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlSZXN1bHQgPSBob3VyICogMzYwMDAwMCArIG1pbiAqIDYwMDAwICsgc2Vjb25kICogMTAwMCArIG1pbFNlY29uZCArIDE7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBpUmVzdWx0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIklzb1RpbWUyTnVtIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsRGF0ZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPCAzKSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgRlhfSU5UMzIgaVN0eWxlID0gMDsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TG9jYWw7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU3R5bGUgPSAwOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCisgICAgICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgICAgICAgIGFyZ1N0eWxlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1N0eWxlKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpU3R5bGUgPSAoRlhfSU5UMzIpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU3R5bGUpOw0KKyAgICAgICAgICAgIGlmIChpU3R5bGUgPiA0IHx8IGlTdHlsZSA8IDApIHsNCisgICAgICAgICAgICAgICAgaVN0eWxlID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICAgICAgYXJnTG9jYWwgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnTG9jYWwpKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJGbGFncykgew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsNCisgICAgICAgICAgICBHZXRMb2NhbERhdGVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbCwgZm9ybWF0U3RyLCBGQUxTRSk7DQorICAgICAgICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgZm9ybWF0U3RyID0gRlhfQlNUUkMoIiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZm9ybWF0U3RyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTdHlsZSk7DQorICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0xvY2FsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJMb2NhbERhdGVGbXQiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxUaW1lRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA8IDMpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9JTlQzMiBpU3R5bGUgPSAwOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTdHlsZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnTG9jYWwgPSAwOw0KKyAgICAgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgICAgICAgYXJnU3R5bGUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU3R5bGUpKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlTdHlsZSA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQorICAgICAgICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KKyAgICAgICAgICAgICAgICBpU3R5bGUgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgICAgICBhcmdMb2NhbCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdMb2NhbCkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOw0KKyAgICAgICAgICAgIEdldExvY2FsVGltZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsLCBmb3JtYXRTdHIsIEZBTFNFKTsNCisgICAgICAgICAgICBpZiAoZm9ybWF0U3RyLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSBGWF9CU1RSQygiIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmb3JtYXRTdHIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA+IDApIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1N0eWxlKTsNCisgICAgICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkxvY2FsVGltZUZtdCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgICAgIEZYX0lOVDMyIGREYXRlOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgICAgICBGWEpTRV9IVkFMVUUgZGF0ZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGRhdGVWYWx1ZSkpIHsNCisgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkRGF0ZSA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCBkYXRlVmFsdWUpOw0KKyAgICAgICAgICAgIGJGbGFncyA9IGREYXRlIDwgMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgbG9jYWxWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaVllYXIgPSAxOTAwOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlNb250aCA9IDE7DQorICAgICAgICAgICAgRlhfSU5UMzIgaURheSA9IDE7DQorICAgICAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGREYXRlID4gMCkgew0KKyAgICAgICAgICAgICAgICBpZiAoaU1vbnRoID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoISgoaVllYXIgKyBpKSAlIDQpICYmICgoaVllYXIgKyBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyICsgaSkgJSA0MDApKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGREYXRlID4gMjkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTW9udGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgLT0gMjk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxGWF9JTlQzMj4oZERhdGUpIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGREYXRlID4gMjgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTW9udGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgLT0gMjg7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxGWF9JTlQzMj4oZERhdGUpIC0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpTW9udGggPCA4KSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKGlNb250aCAlIDIgPT0gMCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZERhdGUgPiAzMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lNb250aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSAtPSAzMDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PEZYX0lOVDMyPihkRGF0ZSkgLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZERhdGUgPiAzMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lNb250aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSAtPSAzMTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PEZYX0lOVDMyPihkRGF0ZSkgLSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlNb250aCAlIDIgIT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkRGF0ZSA+IDMwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlIC09IDMwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8RlhfSU5UMzI+KGREYXRlKSAtIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkRGF0ZSA+IDMxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlIC09IDMxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8RlhfSU5UMzI+KGREYXRlKSAtIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pJc29EYXRlU3RyaW5nOw0KKyAgICAgICAgICAgIHN6SXNvRGF0ZVN0cmluZy5Gb3JtYXQoIiVkJTAyZCUwMmQiLCBpWWVhciArIGksIGlNb250aCwgaURheSk7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbERhdGVTdHJpbmc7DQorICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNvRGF0ZTJMb2NhbChoVGhpcywgc3pJc29EYXRlU3RyaW5nLCBmb3JtYXRTdHJpbmcsIGxvY2FsU3RyaW5nLCBzekxvY2FsRGF0ZVN0cmluZyk7DQorICAgICAgICAgICAgaWYgKHN6TG9jYWxEYXRlU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBzekxvY2FsRGF0ZVN0cmluZyA9IEZYX0JTVFJDKCIiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6TG9jYWxEYXRlU3RyaW5nKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkYXRlVmFsdWUpOw0KKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIk51bTJEYXRlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJHTVRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9JTlQzMiBpVGltZTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGxvY2FsU3RyaW5nOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHRpbWVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGxvY2FsVmFsdWUgPSAwOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHRpbWVWYWx1ZSkpIHsNCisgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpVGltZSA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCB0aW1lVmFsdWUpOw0KKyAgICAgICAgICAgIGlmIChGWFNZU19hYnMoaVRpbWUpIDwgMS4wKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYXJnYyA+IDEpIHsNCisgICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChmb3JtYXRWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pHTVRUaW1lU3RyaW5nOw0KKyAgICAgICAgICAgIE51bTJBbGxUaW1lKGhUaGlzLCBpVGltZSwgZm9ybWF0U3RyaW5nLCBsb2NhbFN0cmluZywgVFJVRSwgc3pHTVRUaW1lU3RyaW5nKTsNCisgICAgICAgICAgICBpZiAoc3pHTVRUaW1lU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBzekdNVFRpbWVTdHJpbmcgPSBGWF9CU1RSQygiIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekdNVFRpbWVTdHJpbmcpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHRpbWVWYWx1ZSk7DQorICAgICAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZvcm1hdFZhbHVlKTsNCisgICAgICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobG9jYWxWYWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiTnVtMkdNVGltZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgICAgIEZYX0ZMT0FUIGZUaW1lOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgICAgICBGWEpTRV9IVkFMVUUgdGltZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwodGltZVZhbHVlKSkgew0KKyAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZUaW1lID0gSFZhbHVlVG9GbG9hdChoVGhpcywgdGltZVZhbHVlKTsNCisgICAgICAgICAgICBpZiAoRlhTWVNfZmFicyhmVGltZSkgPCAxLjApIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZihhcmdjID4gMSkgew0KKyAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChsb2NhbFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLCBsb2NhbFN0cmluZyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsVGltZVN0cmluZzsNCisgICAgICAgICAgICBOdW0yQWxsVGltZShoVGhpcywgKEZYX0lOVDMyKWZUaW1lLCBmb3JtYXRTdHJpbmcsIGxvY2FsU3RyaW5nLCBGQUxTRSwgc3pMb2NhbFRpbWVTdHJpbmcpOw0KKyAgICAgICAgICAgIGlmIChzekxvY2FsVGltZVN0cmluZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgc3pMb2NhbFRpbWVTdHJpbmcgPSBGWF9CU1RSQygiIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekxvY2FsVGltZVN0cmluZyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodGltZVZhbHVlKTsNCisgICAgICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KKyAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJOdW0yVGltZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDApIHsNCisgICAgICAgIHRpbWVfdCBub3c7DQorICAgICAgICB0aW1lKCZub3cpOw0KKyAgICAgICAgc3RydWN0IHRtICpwR210ID0gZ210aW1lKCZub3cpOw0KKyAgICAgICAgRlhfSU5UMzIgaUdNSG91ciA9IHBHbXQtPnRtX2hvdXI7DQorICAgICAgICBGWF9JTlQzMiBpR01NaW4gPSBwR210LT50bV9taW47DQorICAgICAgICBGWF9JTlQzMiBpR01TZWMgPSBwR210LT50bV9zZWM7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKChpR01Ib3VyICogMzYwMCArIGlHTU1pbiAqIDYwICsgaUdNU2VjKSAqIDEwMDApKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlRpbWUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyB0aW1lU3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgICAgICBGWEpTRV9IVkFMVUUgdGltZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIHRpbWVWYWx1ZSkpIHsNCisgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcodGltZVZhbHVlLCB0aW1lU3RyaW5nKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgbG9jYWxWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICAgICAgICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgICAgICAgICAgSUZYX0xvY2FsZSAqcExvY2FsZSA9IE5VTEw7DQorICAgICAgICAgICAgaWYgKGxvY2FsU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX09iamVjdCAqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KKyAgICAgICAgICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGxvY2FsU3RyaW5nLCBsb2NhbFN0cmluZy5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgICAgICAgICAgICBpZiAoZm9ybWF0U3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChmb3JtYXRTdHJpbmcsIGZvcm1hdFN0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdzRm9ybWF0ID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NGb3JtYXQ7DQorICAgICAgICAgICAgd3NGb3JtYXQgKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lVmFsdWUoWEZBX1ZUX1RJTUUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCh0aW1lU3RyaW5nLCB0aW1lU3RyaW5nLkdldExlbmd0aCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0Zvcm1hdCwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgICAgICBpZiAodGltZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSB1bmlUaW1lID0gdGltZVZhbHVlLkdldFRpbWUoKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaG91ciA9IHVuaVRpbWUuR2V0SG91cigpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBtaW4gPSB1bmlUaW1lLkdldE1pbnV0ZSgpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBzZWNvbmQgPSB1bmlUaW1lLkdldFNlY29uZCgpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBtaWxTZWNvbmQgPSB1bmlUaW1lLkdldE1pbGxpc2Vjb25kKCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIG1pbnMgPSBob3VyICogNjAgKyBtaW47DQorICAgICAgICAgICAgICAgIElYRkFfVGltZVpvbmVQcm92aWRlciogcFByb3ZpZGVyID0gSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXQoKTsNCisgICAgICAgICAgICAgICAgaWYgKHBQcm92aWRlciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9USU1FWk9ORSB0ejsNCisgICAgICAgICAgICAgICAgICAgIHBQcm92aWRlci0+R2V0VGltZVpvbmUodHopOw0KKyAgICAgICAgICAgICAgICAgICAgbWlucyAtPSAodHoudHpIb3VyICogNjApOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1pbnMgPiAxNDQwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbWlucyAtPSAxNDQwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1pbnMgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbWlucyArPSAxNDQwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaG91ciA9IG1pbnMgLyA2MDsNCisgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbnMgJSA2MDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpUmVzdWx0ID0gaG91ciAqIDM2MDAwMDAgKyBtaW4gKiA2MDAwMCArIHNlY29uZCAqIDEwMDAgKyBtaWxTZWNvbmQgKyAxOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh0aW1lVmFsdWUpOw0KKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlRpbWUyTnVtIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWVGbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjIDwgMykgew0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgICAgIEZYX0lOVDMyIGlTdHlsZSA9IDA7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdMb2NhbCA9IDA7DQorICAgICAgICBpZiAoYXJnYyA+IDApIHsNCisgICAgICAgICAgICBhcmdTdHlsZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTdHlsZSkpIHsNCisgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaVN0eWxlID0gKEZYX0lOVDMyKUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1N0eWxlKTsNCisgICAgICAgICAgICBpZiAoaVN0eWxlID4gNCB8fCBpU3R5bGUgPCAwKSB7DQorICAgICAgICAgICAgICAgIGlTdHlsZSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgICAgIGFyZ0xvY2FsID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0xvY2FsKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb2NhbCwgc3pMb2NhbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHI7DQorICAgICAgICAgICAgR2V0U3RhbmRhcmRUaW1lRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWwsIGZvcm1hdFN0cik7DQorICAgICAgICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgZm9ybWF0U3RyID0gRlhfQlNUUkMoIiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZm9ybWF0U3RyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTdHlsZSk7DQorICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0xvY2FsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJUaW1lRm10IikpOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvRGF0ZUZvcm1hdChGWF9MUENTVFIgcERhdGEsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyICZpU3R5bGUsIEZYX0lOVDMyICZpWWVhciwgRlhfSU5UMzIgJmlNb250aCwgRlhfSU5UMzIgJmlEYXkpDQorew0KKyAgICBpWWVhciA9IDA7DQorICAgIGlNb250aCA9IDE7DQorICAgIGlEYXkgPSAxOw0KKyAgICBGWF9CT09MIGlSZXQgPSBGQUxTRTsNCisgICAgaWYgKGlMZW5ndGggPCA0KSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBGWF9DSEFSIHN0clllYXJbNV07DQorICAgIHN0clllYXJbNF0gPSAnXDAnOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgNDsgKytpKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGkpIDw9ICc5JyAmJiAqKHBEYXRhICsgaSkgPj0gJzAnKSB7DQorICAgICAgICAgICAgc3RyWWVhcltpXSA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaVllYXIgPSBGWFNZU19hdG9pKHN0clllYXIpOw0KKyAgICBpU3R5bGUgPSAwOw0KKyAgICBpZiAoaUxlbmd0aCA+IDQpIHsNCisgICAgICAgIGlmICgqKHBEYXRhICsgNCkgPT0gJy0nKSB7DQorICAgICAgICAgICAgaVN0eWxlID0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0eWxlID0gMDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlSZXQgPSBUUlVFOw0KKyAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgRlhfQ0hBUiBzdHJUZW1wWzNdOw0KKyAgICBzdHJUZW1wWzJdID0gJ1wwJzsNCisgICAgRlhfSU5UMzIgaVBvc09mZiA9IDA7DQorICAgIGlmIChpU3R5bGUgPT0gMCkgew0KKyAgICAgICAgaVBvc09mZiA9IDQ7DQorICAgICAgICBpZiAoaUxlbmd0aCA9PSA0KSB7DQorICAgICAgICAgICAgaVJldCA9IFRSVUU7DQorICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpUG9zT2ZmID0gNTsNCisgICAgICAgIGlmIChpTGVuZ3RoID09IDQpIHsNCisgICAgICAgICAgICBpUmV0ID0gVFJVRTsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoKCoocERhdGEgKyBpUG9zT2ZmKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZikgPCAnMCcpIHx8ICgqKHBEYXRhICsgaVBvc09mZiArIDEpID4gJzknIHx8ICoocERhdGEgKyBpUG9zT2ZmICsgMSkgPCAnMCcpKSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlQb3NPZmYpOw0KKyAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlQb3NPZmYgKyAxKTsNCisgICAgaU1vbnRoID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgaWYgKGlNb250aCA+IDEyIHx8IGlNb250aCA8IDEpIHsNCisgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIGlmIChpU3R5bGUgPT0gMCkgew0KKyAgICAgICAgaVBvc09mZiArPSAyOw0KKyAgICAgICAgaWYgKGlMZW5ndGggPT0gNikgew0KKyAgICAgICAgICAgIGlSZXQgPSAxOw0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaVBvc09mZiArPSAzOw0KKyAgICAgICAgaWYgKGlMZW5ndGggPT0gNykgew0KKyAgICAgICAgICAgIGlSZXQgPSAxOw0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICgoKihwRGF0YSArIGlQb3NPZmYpID4gJzknIHx8ICoocERhdGEgKyBpUG9zT2ZmKSA8ICcwJykgfHwgKCoocERhdGEgKyBpUG9zT2ZmICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlQb3NPZmYgKyAxKSA8ICcwJykpIHsNCisgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaVBvc09mZik7DQorICAgIHN0clRlbXBbMV0gPSAqKHBEYXRhICsgaVBvc09mZiArIDEpOw0KKyAgICBpRGF5ID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgaWYgKGlQb3NPZmYgKyAyIDwgaUxlbmd0aCkgew0KKyAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgaWYgKCghKGlZZWFyICUgNCkgJiYgKGlZZWFyICUgMTAwKSkgfHwgIShpWWVhciAlIDQwMCkpIHsNCisgICAgICAgIGlmIChpTW9udGggPT0gMikgew0KKyAgICAgICAgICAgIGlmIChpRGF5ID4gMjkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoaU1vbnRoIDwgOCkgew0KKyAgICAgICAgICAgICAgICBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMCA6IDMxKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMSA6IDMwKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoaU1vbnRoID09IDIpIHsNCisgICAgICAgICAgICBpZiAoaURheSA+IDI4KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGlNb250aCA8IDgpIHsNCisgICAgICAgICAgICAgICAgaWYgKGlEYXkgPiAoaU1vbnRoICUgMiA9PSAwID8gMzAgOiAzMSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKGlEYXkgPiAoaU1vbnRoICUgMiA9PSAwID8gMzEgOiAzMCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlSZXQgPSBUUlVFOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNJc29UaW1lRm9ybWF0KEZYX0xQQ1NUUiBwRGF0YSwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfSU5UMzIgJmlIb3VyLCBGWF9JTlQzMiAmaU1pbnV0ZSwgRlhfSU5UMzIgJmlTZWNvbmQsIEZYX0lOVDMyICZpTWlsbGlTZWNvbmQsIEZYX0lOVDMyICZpWm9uZUhvdXIsIEZYX0lOVDMyICZpWm9uZU1pbnV0ZSkNCit7DQorICAgIGlIb3VyID0gMDsNCisgICAgaU1pbnV0ZSA9IDA7DQorICAgIGlTZWNvbmQgPSAwOw0KKyAgICBpTWlsbGlTZWNvbmQgPSAwOw0KKyAgICBpWm9uZUhvdXIgPSAwOw0KKyAgICBpWm9uZU1pbnV0ZSA9IDA7DQorICAgIGlmICghcERhdGEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUmV0ID0gRkFMU0U7DQorICAgIEZYX0NIQVIgc3RyVGVtcFszXTsNCisgICAgc3RyVGVtcFsyXSA9ICdcMCc7DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIEZYX0lOVDMyIGlab25lID0gMDsNCisgICAgRlhfSU5UMzIgaSA9IGlJbmRleDsNCisgICAgd2hpbGUgKGkgPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKCoocERhdGEgKyBpKSA+ICc5JyB8fCAqKHBEYXRhICsgaSkgPCAnMCcpICYmICoocERhdGEgKyBpKSAhPSAnOicgKSB7DQorICAgICAgICAgICAgaVpvbmUgPSBpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpOw0KKyAgICB9DQorICAgIGlmIChpID09IGlMZW5ndGgpIHsNCisgICAgICAgIGlab25lID0gaUxlbmd0aDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUG9zID0gMDsNCisgICAgd2hpbGUgKGlJbmRleCA8IGlab25lKSB7DQorICAgICAgICBpZiAoaUluZGV4ID49IGlab25lKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCkgPCAnMCcpIHsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICAgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCArIDEpIDwgJzAnKSB7DQorICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgICAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlJbmRleCArIDEpOw0KKyAgICAgICAgaWYgKEZYU1lTX2F0b2koc3RyVGVtcCkgPiA2MCkgew0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCoocERhdGEgKyAyKSA9PSAnOicpIHsNCisgICAgICAgICAgICBpZiAoaVBvcyA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGlIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICAgICAgICAgKytpUG9zOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgICAgICAgICArK2lQb3M7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlJbmRleCArPSAzOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoaVBvcyA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGlIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICAgICAgICAgKytpUG9zOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgICAgICAgICArK2lQb3M7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpUG9zID09IDIpIHsNCisgICAgICAgICAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICAgICAgICAgICsraVBvczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUluZGV4ICs9IDI7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICcuJykgew0KKyAgICAgICAgKytpSW5kZXg7DQorICAgICAgICBGWF9DSEFSIHN0clRlbXBbNF07DQorICAgICAgICBzdHJUZW1wWzNdID0gJ1wwJzsNCisgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4KSA8ICcwJykgew0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RyVGVtcFswXSA9ICoocERhdGEgKyBpSW5kZXgpOw0KKyAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4ICsgMSkgPCAnMCcpIHsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICAgIHN0clRlbXBbMV0gPSAqKHBEYXRhICsgaUluZGV4ICsgMSk7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDIpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXggKyAyKSA8ICcwJykgew0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RyVGVtcFsyXSA9ICoocERhdGEgKyBpSW5kZXggKyAyKTsNCisgICAgICAgIGlNaWxsaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICBpZiAoaU1pbGxpU2Vjb25kID4gMTAwKSB7DQorICAgICAgICAgICAgaU1pbGxpU2Vjb25kID0gMDsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICAgIGlJbmRleCArPSAzOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlTaWduID0gMTsNCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICd6JyB8fCAqKHBEYXRhICsgaUluZGV4KSA9PSAnWicpIHsNCisgICAgICAgIGlSZXQgPSAxOw0KKyAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJysnKSB7DQorICAgICAgICArK2lJbmRleDsNCisgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnLScpIHsNCisgICAgICAgIGlTaWduID0gLTE7DQorICAgICAgICArK2lJbmRleDsNCisgICAgfQ0KKyAgICBpUG9zID0gMDsNCisgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgIGlmIChpSW5kZXggPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXgpIDwgJzAnKSB7DQorICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgICAgICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlJbmRleCk7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXggKyAxKSA8ICcwJykgew0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RyVGVtcFsxXSA9ICoocERhdGEgKyBpSW5kZXggKyAxKTsNCisgICAgICAgIGlmIChGWFNZU19hdG9pKHN0clRlbXApID4gNjApIHsNCisgICAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgqKHBEYXRhICsgMikgPT0gJzonKSB7DQorICAgICAgICAgICAgaWYgKGlQb3MgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBpWm9uZUhvdXIgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGlab25lTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUluZGV4ICs9IDM7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICghaVBvcykgew0KKyAgICAgICAgICAgICAgICBpWm9uZUhvdXIgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgICAgICAgICArK2lQb3M7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsNCisgICAgICAgICAgICAgICAgaVpvbmVNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgICAgICAgICArK2lQb3M7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlJbmRleCArPSAyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpWm9uZUhvdXIgKj0gaVNpZ247DQorICAgIGlSZXQgPSBUUlVFOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNJc29EYXRlVGltZUZvcm1hdChGWF9MUENTVFIgcERhdGEsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyICZpWWVhciwgRlhfSU5UMzIgJmlNb250aCwgRlhfSU5UMzIgJmlEYXksIEZYX0lOVDMyICZpSG91ciwgRlhfSU5UMzIgJmlNaW51dGUsIEZYX0lOVDMyICZpU2Vjb25kLCBGWF9JTlQzMiAmaU1pbGxpb25TZWNvbmQsIEZYX0lOVDMyICZpWm9uZUhvdXIsIEZYX0lOVDMyICZpWm9uZU1pbnV0ZSkNCit7DQorICAgIGlZZWFyID0gMDsNCisgICAgaU1vbnRoID0gMDsNCisgICAgaURheSA9IDA7DQorICAgIGlIb3VyID0gMDsNCisgICAgaU1pbnV0ZSA9IDA7DQorICAgIGlTZWNvbmQgPSAwOw0KKyAgICBpZiAoIXBEYXRhKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVJldCA9IEZBTFNFOw0KKyAgICBGWF9JTlQzMiBpSW5kZXggPSAwOw0KKyAgICB3aGlsZSAoKihwRGF0YSArIGlJbmRleCkgIT0gJ1QnICYmICoocERhdGEgKyBpSW5kZXgpICE9ICd0Jykgew0KKyAgICAgICAgaWYgKGlJbmRleCA+PSBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgICAgICArK2lJbmRleDsNCisgICAgfQ0KKyAgICBpZiAoaUluZGV4ICE9IDggJiYgaUluZGV4ICE9IDEwKSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpU3R5bGUgPSAtMTsNCisgICAgaVJldCA9IElzSXNvRGF0ZUZvcm1hdChwRGF0YSwgaUluZGV4ICwgaVN0eWxlLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgaWYgKCFpUmV0KSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJ1QnICYmICoocERhdGEgKyBpSW5kZXgpICE9ICd0Jykgew0KKyAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgKytpSW5kZXg7DQorICAgIGlmICgoKGlMZW5ndGggLSBpSW5kZXggPiAxMykgJiYgKGlMZW5ndGggLSBpSW5kZXggPCA2KSkgJiYgKGlMZW5ndGggLSBpSW5kZXggIT0gMTUpKSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpUmV0ID0gSXNJc29UaW1lRm9ybWF0KHBEYXRhICsgaUluZGV4LCBpTGVuZ3RoIC0gaUluZGV4LCBpSG91ciwgaU1pbnV0ZSwgaVNlY29uZCwgaU1pbGxpb25TZWNvbmQsIGlab25lSG91ciwgaVpvbmVNaW51dGUpOw0KKyAgICBpZiAoIWlSZXQpIHsNCisgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIGlSZXQgPSBUUlVFOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWwySXNvRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RGF0ZSwgRlhfQlNUUiBzekZvcm1hdCwgRlhfQlNUUiBzekxvY2FsZSwgQ0ZYX0J5dGVTdHJpbmcgJnN0cklzb0RhdGUpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZighcERvYykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KKyAgICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQorICAgICAgICBDWEZBX09iamVjdCAqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSAqKXBUaGlzTm9kZSk7DQorICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9DQorICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdzRm9ybWF0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoWEZBX1ZUX0RBVEUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekRhdGUuR2V0Q1N0cigpLCBzekRhdGUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9ybWF0LCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICBDRlhfVW5pdGltZSBkdCA9IHdpZGdldFZhbHVlLkdldERhdGUoKTsNCisgICAgc3RySXNvRGF0ZS5Gb3JtYXQoIiU0ZC0lMDJkLSUwMmQiLCBkdC5HZXRZZWFyKCksIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsMklzb1RpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzelRpbWUsIEZYX0JTVFIgc3pGb3JtYXQsIEZYX0JTVFIgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJJc29UaW1lKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgaWYoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gTlVMTDsNCisgICAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KKyAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgICAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NGb3JtYXQsIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgIENGWF9Vbml0aW1lIHV0aW1lID0gd2lkZ2V0VmFsdWUuR2V0VGltZSgpOw0KKyAgICBzdHJJc29UaW1lLkZvcm1hdCgiJTAyZDolMDJkOiUwMmQuJTAzZCIsIHV0aW1lLkdldEhvdXIoKSwgdXRpbWUuR2V0TWludXRlKCksIHV0aW1lLkdldFNlY29uZCgpLCB1dGltZS5HZXRNaWxsaXNlY29uZCgpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTG9jYWwoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekRhdGUsIEZYX0JTVFIgc3pGb3JtYXQsIEZYX0JTVFIgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJMb2NhbERhdGUpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZighcERvYykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KKyAgICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQorICAgICAgICBDWEZBX09iamVjdCAqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSAqKXBUaGlzTm9kZSk7DQorICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9DQorICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdzRm9ybWF0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoWEZBX1ZUX0RBVEUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekRhdGUuR2V0Q1N0cigpLCBzekRhdGUuR2V0TGVuZ3RoKCkpLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzRm9ybWF0LCBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgICBzdHJMb2NhbERhdGUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc29UaW1lMkxvY2FsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pUaW1lLCBGWF9CU1RSIHN6Rm9ybWF0LCBGWF9CU1RSIHN6TG9jYWxlLCBDRlhfQnl0ZVN0cmluZyAmc3RyTG9jYWxUaW1lKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgaWYoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gTlVMTDsNCisgICAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KKyAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgICAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KKyAgICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NGb3JtYXQsIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIHN0ckxvY2FsVGltZSA9IEZYX1VURjhFbmNvZGUod3NSZXQsIHdzUmV0LkdldExlbmd0aCgpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldEdNVFRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzelRpbWUsIEZYX0JTVFIgc3pGb3JtYXQsIEZYX0JTVFIgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJHTVRUaW1lKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgaWYoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gTlVMTDsNCisgICAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KKyAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgICAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KKyAgICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NGb3JtYXQsIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIHN0ckdNVFRpbWUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9JTlQzMiAgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGVTdHJpbmcyTnVtKEZYX0JTVFIgc3pEYXRlU3RyaW5nKQ0KK3sNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHN6RGF0ZVN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfQk9PTCBpUmV0ID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIGlTdHlsZSA9IC0xOw0KKyAgICBGWF9JTlQzMiBpWWVhciA9IDA7DQorICAgIEZYX0lOVDMyIGlNb250aCA9IDA7DQorICAgIEZYX0lOVDMyIGlEYXkgPSAwOw0KKyAgICBGWF9JTlQzMiBpSG91ciA9IDA7DQorICAgIEZYX0lOVDMyIGlNaW51dGUgPSAwOw0KKyAgICBGWF9JTlQzMiBpU2Vjb25kID0gMDsNCisgICAgRlhfSU5UMzIgaU1pbGxpb25TZWNvbmQgPSAwOw0KKyAgICBGWF9JTlQzMiBpWm9uZUhvdXIgPSAwOw0KKyAgICBGWF9JTlQzMiBpWm9uZU1pbnV0ZSA9IDA7DQorICAgIGlmIChpTGVuZ3RoIDw9IDEwKSB7DQorICAgICAgICBpUmV0ID0gSXNJc29EYXRlRm9ybWF0KHN6RGF0ZVN0cmluZy5HZXRDU3RyKCksIGlMZW5ndGgsIGlTdHlsZSwgaVllYXIsIGlNb250aCwgaURheSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpUmV0ID0gSXNJc29EYXRlVGltZUZvcm1hdChzekRhdGVTdHJpbmcuR2V0Q1N0cigpLCBpTGVuZ3RoLCBpWWVhciwgaU1vbnRoLCBpRGF5LCBpSG91ciwgaU1pbnV0ZSwgaVNlY29uZCwgaU1pbGxpb25TZWNvbmQsIGlab25lSG91ciwgaVpvbmVNaW51dGUpOw0KKyAgICB9DQorICAgIGlmICghaVJldCkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBkRGF5cyA9IDA7DQorICAgIEZYX0lOVDMyIGkgPSAxOw0KKyAgICBpZiAoaVllYXIgPCAxOTAwKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmKCFiRmxhZ3MpIHsNCisgICAgICAgIHdoaWxlIChpWWVhciAtIGkgPj0gMTkwMCkgew0KKyAgICAgICAgICAgIGlmICgoISgoaVllYXIgLSBpKSAlIDQpICYmICgoaVllYXIgLSBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyIC0gaSkgJSA0MDApKSB7DQorICAgICAgICAgICAgICAgIGREYXlzICs9IDM2NjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkRGF5cyArPSAzNjU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgIH0NCisgICAgICAgIGkgPSAxOw0KKyAgICAgICAgd2hpbGUgKGkgPCBpTW9udGgpIHsNCisgICAgICAgICAgICBpZiAoaSA9PSAyKSB7DQorICAgICAgICAgICAgICAgIGlmICgoIShpWWVhciAlIDQpICYmIChpWWVhciAlIDEwMCkpIHx8ICEoaVllYXIgJSA0MDApKSB7DQorICAgICAgICAgICAgICAgICAgICBkRGF5cyArPSAyOTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGREYXlzICs9IDI4Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpIDw9IDcpIHsNCisgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGREYXlzICs9IDMwOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZERheXMgKz0gMzE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgZERheXMgKz0gMzE7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBkRGF5cyArPSAzMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICArK2k7DQorICAgICAgICB9DQorICAgICAgICBpID0gMDsNCisgICAgICAgIHdoaWxlIChpRGF5IC0gaSA+IDApIHsNCisgICAgICAgICAgICBkRGF5cyArPSAxOw0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGREYXlzID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gKEZYX0lOVDMyKWREYXlzOw0KK30NCisjZGVmaW5lIFhGQV9OIDE5DQorc3RhdGljIEZYX0JZVEUgZ19zQWx0VGFibGVfRGF0ZVtdID0gew0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCAgIDMsICAgICA5LCAgIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLAkgIDIsICAgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICAxLCAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorfTsNCitzdGF0aWMgRlhfQllURSBnX3NBbHRUYWJsZV9UaW1lW10gPSB7DQorICAgIDE0LCAgWEZBX04sIFhGQV9OLCAgIDMsICAgICA5LCAgIFhGQV9OLCBYRkFfTiwgICAgMTUsDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLAkgIDYsICAgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCAgIDcsICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICAxLCAgIDE3LCAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgICAgMTUsDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorfTsNCitzdGF0aWMgdm9pZCBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nICZ3c1BhdHRlcm4sIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0FsdFN5bWJvbHMsIEZYX0JZVEUgKnBBbHRUYWJsZSkNCit7DQorICAgIEZYX0lOVDMyCW5MZW5ndGgJCQk9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgICAgRlhfQk9PTAkJYkluQ29uc3RSYW5nZQk9IEZBTFNFOw0KKyAgICBGWF9CT09MCQliRXNjYXBlCQkJPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgaSA9IDAsIG4gPSAwOw0KKyAgICB3aGlsZSAoaSA8IG5MZW5ndGgpIHsNCisgICAgICAgIEZYX1dDSEFSIHdjID0gd3NQYXR0ZXJuW2ldOw0KKyAgICAgICAgaWYgKHdjID09IEwnXCcnKSB7DQorICAgICAgICAgICAgYkluQ29uc3RSYW5nZQk9ICFiSW5Db25zdFJhbmdlOw0KKyAgICAgICAgICAgIGlmIChiRXNjYXBlKSB7DQorICAgICAgICAgICAgICAgIGkgKys7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgd3NQYXR0ZXJuLkRlbGV0ZShpKTsNCisgICAgICAgICAgICAgICAgbkxlbmd0aCAtLTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYkVzY2FwZSA9ICFiRXNjYXBlOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiSW5Db25zdFJhbmdlICYmIChuID0gd2MgLSBMJ0EnKSA+PSAwICYmIG4gPD0gKEwnYScgLSBMJ0EnKSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5BbHQgPSAoRlhfSU5UMzIpcEFsdFRhYmxlW25dOw0KKyAgICAgICAgICAgIGlmIChuQWx0ICE9IFhGQV9OKSB7DQorICAgICAgICAgICAgICAgIHdzUGF0dGVybi5TZXRBdChpLCB3c0FsdFN5bWJvbHNbbkFsdF0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGkgKys7DQorICAgICAgICBiRXNjYXBlID0gRkFMU0U7DQorICAgIH0NCit9DQorI3VuZGVmIFhGQV9ODQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0TG9jYWxEYXRlRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0lOVDMyIGlTdHlsZSwgRlhfQlNUUiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCkNCit7DQorICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7DQorICAgIHN3aXRjaCAoaVN0eWxlKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZighcERvYykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KKyAgICBpZiAoc3pMb2NhbFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbFN0ci5HZXRDU3RyKCksIHN6TG9jYWxTdHIuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJSZXQ7DQorICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKHN0clN0eWxlLCBzdHJSZXQpOw0KKyAgICBpZiAoIWJTdGFuZGFyZCkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xzOw0KKyAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKHdzU3ltYm9scyk7DQorICAgICAgICBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9EYXRlKTsNCisgICAgfQ0KKyAgICBzdHJGb3JtYXQgPSBGWF9VVEY4RW5jb2RlKHN0clJldCwgc3RyUmV0LkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0TG9jYWxUaW1lRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0lOVDMyIGlTdHlsZSwgRlhfQlNUUiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCkNCit7DQorICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7DQorICAgIHN3aXRjaCAoaVN0eWxlKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZighcERvYykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KKyAgICBpZiAoc3pMb2NhbFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIENYRkFfT2JqZWN0ICpwVGhpc09iamVjdCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzT2JqZWN0LT5Jc05vZGUoKSk7DQorICAgICAgICBDWEZBX05vZGUqIHBUaGlzTm9kZSA9IChDWEZBX05vZGUgKilwVGhpc09iamVjdDsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBUaGlzTm9kZSk7DQorICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbFN0ci5HZXRDU3RyKCksIHN6TG9jYWxTdHIuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJSZXQ7DQorICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKHN0clN0eWxlLCBzdHJSZXQpOw0KKyAgICBpZiAoIWJTdGFuZGFyZCkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xzOw0KKyAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKHdzU3ltYm9scyk7DQorICAgICAgICBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9UaW1lKTsNCisgICAgfQ0KKyAgICBzdHJGb3JtYXQgPSBGWF9VVEY4RW5jb2RlKHN0clJldCwgc3RyUmV0LkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0U3RhbmRhcmREYXRlRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0lOVDMyIGlTdHlsZSwgRlhfQlNUUiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0KQ0KK3sNCisgICAgR2V0TG9jYWxEYXRlRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWxTdHIsIHN0ckZvcm1hdCwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldFN0YW5kYXJkVGltZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9JTlQzMiBpU3R5bGUsIEZYX0JTVFIgc3pMb2NhbFN0ciwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckZvcm1hdCkNCit7DQorICAgIEdldExvY2FsVGltZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsU3RyLCBzdHJGb3JtYXQsIFRSVUUpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yQWxsVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9JTlQzMiBpVGltZSwgRlhfQlNUUiBzekZvcm1hdCwgRlhfQlNUUiBzekxvY2FsZSwgRlhfQk9PTCBiR00sIENGWF9CeXRlU3RyaW5nICZzdHJUaW1lKQ0KK3sNCisgICAgRlhfSU5UMzIgaUhvdXIgPSAwOw0KKyAgICBGWF9JTlQzMiBpTWluID0gMDsNCisgICAgRlhfSU5UMzIgaVNlYyA9IDA7DQorICAgIEZYX0lOVDMyIGlab25lSG91ciA9IDA7DQorICAgIEZYX0lOVDMyIGlab25lTWluID0gMDsNCisgICAgRlhfSU5UMzIgaVpvbmVTZWMgPSAwOw0KKyAgICBpSG91ciA9IHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC8gMzYwMDAwMDsNCisgICAgaU1pbiA9IChzdGF0aWNfY2FzdDxpbnQ+KGlUaW1lKSAtIGlIb3VyICogMzYwMDAwMCkgLyA2MDAwMDsNCisgICAgaVNlYyA9IChzdGF0aWNfY2FzdDxpbnQ+KGlUaW1lKSAtIGlIb3VyICogMzYwMDAwMCAtIGlNaW4gKiA2MDAwMCkgLyAxMDAwOw0KKyAgICBpZiAoIWJHTSkgew0KKyAgICAgICAgR2V0TG9jYWxUaW1lWm9uZShpWm9uZUhvdXIsIGlab25lTWluLCBpWm9uZVNlYyk7DQorICAgICAgICBpSG91ciArPSBpWm9uZUhvdXI7DQorICAgICAgICBpTWluICs9IGlab25lTWluOw0KKyAgICAgICAgaVNlYyArPSBpWm9uZVNlYzsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUmV0ID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RySXNvVGltZTsNCisgICAgc3RySXNvVGltZS5Gb3JtYXQoIiUwMmQ6JTAyZDolMDJkIiwgaUhvdXIsIGlNaW4sIGlTZWMpOw0KKyAgICBpZiAoYkdNKSB7DQorICAgICAgICBpUmV0ID0gR2V0R01UVGltZShoVGhpcywgc3RySXNvVGltZSwgc3pGb3JtYXQsIHN6TG9jYWxlLCBzdHJUaW1lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlSZXQgPSBJc29UaW1lMkxvY2FsKGhUaGlzLCBzdHJJc29UaW1lLCBzekZvcm1hdCwgc3pMb2NhbGUsIHN0clRpbWUpOw0KKyAgICB9DQorICAgIGlmICghaVJldCkgew0KKyAgICAgICAgc3RyVGltZSA9IEZYX0JTVFJDKCIiKTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldExvY2FsVGltZVpvbmUoRlhfSU5UMzIgJmlIb3VyLCBGWF9JTlQzMiAmaU1pbiwgRlhfSU5UMzIgJmlTZWMpDQorew0KKyAgICB0aW1lX3Qgbm93Ow0KKyAgICB0aW1lKCZub3cpOw0KKyAgICBzdHJ1Y3QgdG0gKnBHbXQgPSBnbXRpbWUoJm5vdyk7DQorICAgIEZYX0lOVDMyIGlHTUhvdXIgPSBwR210LT50bV9ob3VyOw0KKyAgICBGWF9JTlQzMiBpR01NaW4gPSBwR210LT50bV9taW47DQorICAgIEZYX0lOVDMyIGlHTVNlYyA9IHBHbXQtPnRtX3NlYzsNCisgICAgc3RydWN0IHRtICpwTG9jYWwgPSBsb2NhbHRpbWUoJm5vdyk7DQorICAgIEZYX0lOVDMyIGlMb2NhbEhvdXIgPSBwTG9jYWwtPnRtX2hvdXI7DQorICAgIEZYX0lOVDMyIGlMb2NhbE1pbiA9IHBMb2NhbC0+dG1fbWluOw0KKyAgICBGWF9JTlQzMiBpTG9jYWxTZWMgPSBwTG9jYWwtPnRtX3NlYzsNCisgICAgaUhvdXIgPSBpTG9jYWxIb3VyIC0gaUdNSG91cjsNCisgICAgaU1pbiA9IGlMb2NhbE1pbiAtIGlHTU1pbjsNCisgICAgaVNlYyA9IGlMb2NhbFNlYyAtIGlHTVNlYzsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QXByKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9ET1VCTEUgblByaW5jaXBhbCA9IDA7DQorICAgICAgICBGWF9ET1VCTEUgblBheW1lbnQgPSAwOw0KKyAgICAgICAgRlhfRE9VQkxFIG5QZXJpb2RzID0gMDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KKyAgICAgICAgaWYoYkZsYWdzKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBuUHJpbmNpcGFsID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgblBheW1lbnQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCisgICAgICAgICAgICBuUGVyaW9kcyA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgICAgICAgYkZsYWdzID0gKChuUHJpbmNpcGFsIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fCAoblBlcmlvZHMgPD0gMCkpOw0KKyAgICAgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfRE9VQkxFIHIgPSAyICogKG5QZXJpb2RzICogblBheW1lbnQgLSBuUHJpbmNpcGFsKSAvIChuUGVyaW9kcyAqIG5QcmluY2lwYWwpOw0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgblBlcmlvZHM7ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgblRlbXAgKj0gKDEgKyByKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgblJldCA9IHIgKiBuVGVtcCAvIChuVGVtcCAtIDEpIC0gblBheW1lbnQgLyBuUHJpbmNpcGFsOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoIChuUmV0ID4gRklOQU5DSUFMX1BSRUNJU0lPTiB8fCBuUmV0IDwgLUZJTkFOQ0lBTF9QUkVDSVNJT04pICYmICghYkZsYWdzKSApIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBuRGVyaXZhdGl2ZSA9IDA7DQorICAgICAgICAgICAgICAgICAgICBuRGVyaXZhdGl2ZSA9ICgoblRlbXAgKyByICogblBlcmlvZHMgKiAoblRlbXAgLyAoMSArIHIpKSkgKiAoblRlbXAgLSAxKSAtIChyICogblRlbXAgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSkgLyAoKG5UZW1wIC0gMSkgKiAoblRlbXAgLSAxKSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAobkRlcml2YXRpdmUgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByID0gciAtIG5SZXQgLyBuRGVyaXZhdGl2ZTsNCisgICAgICAgICAgICAgICAgICAgIG5UZW1wID0gMTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuUGVyaW9kczsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgblRlbXAgKj0gKDEgKyByKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZihiRmxhZ3MpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHIgPSByICogMTI7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkFwciIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDVGVybShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgRlhfRkxPQVQgblJhdGUgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgbkZ1dHVyZVZhbHVlID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5Jbml0QW1vdW50ID0gMDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KKyAgICAgICAgaWYoYkZsYWdzKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgbkZ1dHVyZVZhbHVlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVHdvKTsNCisgICAgICAgICAgICBuSW5pdEFtb3VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICAgICAgICBiRmxhZ3MgPSAoKG5SYXRlIDw9IDApIHx8IChuRnV0dXJlVmFsdWUgPD0gMCkgfHwgKG5Jbml0QW1vdW50IDw9IDApKTsNCisgICAgICAgICAgICBpZihiRmxhZ3MpIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhTWVNfbG9nKChGWF9GTE9BVCkobkZ1dHVyZVZhbHVlIC8gbkluaXRBbW91bnQpKSAvIEZYU1lTX2xvZygoRlhfRkxPQVQpKDEgKyBuUmF0ZSkpICk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiQ1Rlcm0iKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RlYoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgICAgIEZYX0RPVUJMRSBuQW1vdW50ID0gMDsNCisgICAgICAgIEZYX0RPVUJMRSBuUmF0ZSA9IDA7DQorICAgICAgICBGWF9ET1VCTEUgblBlcmlvZCA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbkFtb3VudCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgICAgICAgIG5SYXRlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgICAgICAgblBlcmlvZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgICAgICAgYkZsYWdzID0gKChuUmF0ZSA8IDApIHx8IChuUGVyaW9kIDw9IDApIHx8IChuQW1vdW50IDw9IDApKTsNCisgICAgICAgICAgICBpZihiRmxhZ3MpIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkUmVzdWx0ID0gMDsNCisgICAgICAgICAgICAgICAgaWYgKCFuUmF0ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IG5BbW91bnQgKiBuUGVyaW9kOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFIG5UZW1wID0gMTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBlcmlvZDsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgblRlbXAgKj0gMSArIG5SYXRlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IG5BbW91bnQgKiAoblRlbXAgLSAxKSAvIG5SYXRlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRSZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkZWIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OklQbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gNSkgew0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgICAgIEZYX0ZMT0FUIG5QcmluY3BhbEFtb3VudCA9IDA7DQorICAgICAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQorICAgICAgICBGWF9GTE9BVCBuUGF5bWVudCA9IDA7DQorICAgICAgICBGWF9GTE9BVCBuRmlyc3RNb250aCA9IDA7DQorICAgICAgICBGWF9GTE9BVCBuTnVtYmVyT2ZNb250aHMgPSAwOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRml2ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgNCk7DQorICAgICAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSB8fA0KKyAgICAgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRm91cikgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdGaXZlKSk7DQorICAgICAgICBpZihiRmxhZ3MpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgICAgICAgIG5QYXltZW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgICAgICAgIG5GaXJzdE1vbnRoID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRm91cik7DQorICAgICAgICAgICAgbk51bWJlck9mTW9udGhzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRml2ZSk7DQorICAgICAgICAgICAgYkZsYWdzID0gKChuUHJpbmNwYWxBbW91bnQgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fCAobkZpcnN0TW9udGggPCAwKSB8fCAobk51bWJlck9mTW9udGhzIDwgMCkpOw0KKyAgICAgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJlc3VsdCA9IDA7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG5SYXRlT2ZNb250aCA9IG5SYXRlIC8gMTI7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlOdW1zID0gKEZYX0lOVDMyKSgoRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKShuUGF5bWVudCAvIG5QcmluY3BhbEFtb3VudCkpIC0gRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKShuUGF5bWVudCAvIG5QcmluY3BhbEFtb3VudCAtIG5SYXRlT2ZNb250aCkpKSAvIEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoMSArIG5SYXRlT2ZNb250aCkpKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUVuZCA9IChGWF9JTlQzMikobkZpcnN0TW9udGggKyBuTnVtYmVyT2ZNb250aHMgLSAxKTsNCisgICAgICAgICAgICAgICAgaWYgKGlFbmQgPiBpTnVtcykgew0KKyAgICAgICAgICAgICAgICAgICAgaUVuZCA9IGlOdW1zOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG5TdW0gPSAwOw0KKyAgICAgICAgICAgICAgICBpZiAoblBheW1lbnQgPCBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGgpIHsNCisgICAgICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBmUmVzdWx0ID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZighYkZsYWdzKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuRmlyc3RNb250aCAtIDE7ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCAtPSBuUGF5bWVudCAtIG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaUVuZDsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgblN1bSArPSBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgblByaW5jcGFsQW1vdW50IC09IG5QYXltZW50IC0gblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZlJlc3VsdCA9IG5TdW07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmUmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRm91cik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpdmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIklQbXQiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TlBWKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPiAyKSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFICphcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGFyZ2MpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgICAgICAgIGFyZ1ZhbHVlc1tpXSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgaSk7DQorICAgICAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWVzW2ldKSkgew0KKyAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgRlhfRE9VQkxFIG5SYXRlID0gMDsNCisgICAgICAgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZXNbMF0pOw0KKyAgICAgICAgICAgIGlmIChuUmF0ZSA8PSAwKSB7DQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgKnBEYXRhID0gRlhfQWxsb2MoRlhfRE9VQkxFLCBhcmdjIC0gMSk7DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIHBEYXRhW2kgLSAxXSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSAgblN1bSA9IDA7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBhcmdjIC0gMTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8PSBpOyBqKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuVGVtcCAqPSAxICsgblJhdGU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgbk51bSA9ICoocERhdGEgKyBpSW5kZXgrKyk7DQorICAgICAgICAgICAgICAgICAgICBuU3VtICs9IG5OdW0gLyBuVGVtcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuU3VtKTsNCisgICAgICAgICAgICAgICAgRlhfRnJlZShwRGF0YSk7DQorICAgICAgICAgICAgICAgIHBEYXRhID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKGFyZ1ZhbHVlcyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiTlBWIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlBtdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgRlhfRkxPQVQgblByaW5jaXBhbCA9IDA7DQorICAgICAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQorICAgICAgICBGWF9GTE9BVCBuUGVyaW9kcyA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgblByaW5jaXBhbCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgICAgICAgIG5QZXJpb2RzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgICAgICAgIGJGbGFncyA9ICgoblByaW5jaXBhbCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QZXJpb2RzIDw9IDApKTsNCisgICAgICAgICAgICBpZihiRmxhZ3MpIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG5TdW0gPSAwOw0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBuVG1wID0gMSArIG5SYXRlOw0KKyAgICAgICAgICAgICAgICBuU3VtID0gblRtcDsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5QZXJpb2RzIC0gMTsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICBuU3VtICo9IG5UbXA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoblByaW5jaXBhbCAqIG5SYXRlICogblN1bSkgLyAoblN1bSAtIDEpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJQbXQiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UFBtdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSA1KSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgRlhfRkxPQVQgblByaW5jcGFsQW1vdW50ID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5QYXltZW50ID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5GaXJzdE1vbnRoID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5OdW1iZXJPZk1vbnRocyA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGb3VyID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAzKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXZlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCA0KTsNCisgICAgICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpIHx8DQorICAgICAgICAgICAgICAgICAgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdGb3VyKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ0ZpdmUpKTsNCisgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgblByaW5jcGFsQW1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICAgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgICAgICAgblBheW1lbnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgICAgICAgbkZpcnN0TW9udGggPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGb3VyKTsNCisgICAgICAgICAgICBuTnVtYmVyT2ZNb250aHMgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGaXZlKTsNCisgICAgICAgICAgICBiRmxhZ3MgPSAoKG5QcmluY3BhbEFtb3VudCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QYXltZW50IDw9IDApIHx8IChuRmlyc3RNb250aCA8IDApIHx8IChuTnVtYmVyT2ZNb250aHMgPCAwKSk7DQorICAgICAgICAgICAgaWYoYkZsYWdzKSB7DQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpRW5kID0gKEZYX0lOVDMyKShuRmlyc3RNb250aCArIG5OdW1iZXJPZk1vbnRocyAtIDEpOw0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBuU3VtID0gMDsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgblJhdGVPZk1vbnRoID0gblJhdGUgLyAxMjsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaU51bXMgPSAoRlhfSU5UMzIpKChGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jcGFsQW1vdW50KSkgLSBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jcGFsQW1vdW50IC0gblJhdGVPZk1vbnRoKSkpIC8gRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKSgxICsgblJhdGVPZk1vbnRoKSkpOw0KKyAgICAgICAgICAgICAgICBpZiAoaUVuZCA+IGlOdW1zKSB7DQorICAgICAgICAgICAgICAgICAgICBpRW5kID0gaU51bXM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKG5QYXltZW50IDwgblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoKSB7DQorICAgICAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKCFiRmxhZ3MpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5GaXJzdE1vbnRoIC0gMTsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgblByaW5jcGFsQW1vdW50IC09IG5QYXltZW50IC0gblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgblRlbXAgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBpRW5kOyArK2kpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBuVGVtcCA9IG5QYXltZW50IC0gblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5TdW0gKz0gblRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgblByaW5jcGFsQW1vdW50IC09IG5UZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuU3VtKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGb3VyKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiUFBtdCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQVihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgRlhfRE9VQkxFIG5BbW91bnQgPSAwOw0KKyAgICAgICAgRlhfRE9VQkxFIG5SYXRlID0gMDsNCisgICAgICAgIEZYX0RPVUJMRSBuUGVyaW9kID0gMDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KKyAgICAgICAgaWYoYkZsYWdzKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBuQW1vdW50ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgblJhdGUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCisgICAgICAgICAgICBuUGVyaW9kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICAgICAgICBiRmxhZ3MgPSAoKG5BbW91bnQgPD0gMCkgfHwgKG5SYXRlIDwgMCkgfHwgKG5QZXJpb2QgPD0gMCkpOw0KKyAgICAgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfRE9VQkxFIG5UZW1wID0gMTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5QZXJpb2Q7ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgblRlbXAgKj0gMSArIG5SYXRlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5UZW1wID0gMSAvIG5UZW1wOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuQW1vdW50ICogKCgxIC0gblRlbXApIC8gblJhdGUpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJQViIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9GTE9BVCBuRnV0dXJlID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5QcmVzZW50ID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5Ub3RhbE51bWJlciA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbkZ1dHVyZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgblByZXNlbnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgICAgICAgIG5Ub3RhbE51bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICAgICAgICBiRmxhZ3MgPSAoKG5GdXR1cmUgPD0gMCkgfHwgKG5QcmVzZW50IDwgMCkgfHwgKG5Ub3RhbE51bWJlciA8PSAwKSk7DQorICAgICAgICAgICAgaWYoYkZsYWdzKSB7DQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIChGWFNZU19wb3coKEZYX0ZMT0FUKShuRnV0dXJlIC8gblByZXNlbnQpICwgKEZYX0ZMT0FUKSgxIC8gblRvdGFsTnVtYmVyKSkgLSAxKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiUmF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUZXJtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9GTE9BVCBuTW91bnQgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgblJhdGUgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgbkZ1dHVyZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgIGJGbGFncyA9IChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVHdvKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVGhyZWUpKTsNCisgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbk1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICAgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgICAgICAgbkZ1dHVyZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICAgICAgICBiRmxhZ3MgPSAoKG5Nb3VudCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5GdXR1cmUgPD0gMCkpOw0KKyAgICAgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhTWVNfbG9nKChGWF9GTE9BVCkobkZ1dHVyZSAvIG5Nb3VudCAqIG5SYXRlKSArIDEpIC8gRlhTWVNfbG9nKChGWF9GTE9BVCkoMSArIG5SYXRlKSkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJUZXJtIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNob29zZShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIEZYX0JPT0wgYXJnT25lSXNOdWxsID0gRkFMU0U7DQorICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSAwOw0KKyAgICAgICAgYXJnT25lSXNOdWxsID0gSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgICAgaWYgKCFhcmdPbmVJc051bGwpIHsNCisgICAgICAgICAgICBpSW5kZXggPSAoRlhfSU5UMzIpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIGlmIChhcmdPbmVJc051bGwpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2UgaWYgKGlJbmRleCA8IDEpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfQk9PTCBiRm91bmQgPSBGQUxTRTsNCisgICAgICAgICAgICBGWF9CT09MIGJTdG9wQ291bnRlckZsYWdzID0gRkFMU0U7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUFyZ0luZGV4ID0gMTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpVmFsdWVJbmRleCA9IDA7DQorICAgICAgICAgICAgd2hpbGUoIWJGb3VuZCAmJiAhYlN0b3BDb3VudGVyRmxhZ3MgJiYgKGlBcmdJbmRleCA8IGFyZ2MpKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleFZhbHVlID0gYXJncy5HZXRWYWx1ZShpQXJnSW5kZXgpOw0KKyAgICAgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdJbmRleFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnSW5kZXhWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlMZW5ndGggPiAzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BDb3VudGVyRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaVZhbHVlSW5kZXggKz0gKGlMZW5ndGggLSAyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpVmFsdWVJbmRleCA+PSBpSW5kZXgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4VmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdJbmRleFZhbHVlLCAoKGlMZW5ndGggLSAxKSAtIChpVmFsdWVJbmRleCAtIGlJbmRleCkpLCBqc29iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcFN0cjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BTdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BTdHIsIG5ld1Byb3BlcnR5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaG9vc2VkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhuZXdQcm9wZXJ0eSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlWYWx1ZUluZGV4ICsrOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlWYWx1ZUluZGV4ID09IGlJbmRleCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQ2hvb3NlZDsNCisgICAgICAgICAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnSW5kZXhWYWx1ZSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBiRm91bmQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlBcmdJbmRleCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIWJGb3VuZCkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJDaG9vc2UiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXhpc3RzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiRXhpc3RzIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Okhhc1ZhbHVlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdPbmUpKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdmFsdWVTdHI7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ09uZSwgdmFsdWVTdHIpOw0KKyAgICAgICAgICAgIHZhbHVlU3RyLlRyaW1MZWZ0KCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksICghdmFsdWVTdHIuSXNFbXB0eSgpKSk7DQorICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzTnVtYmVyKGFyZ09uZSkgfHwgRlhKU0VfVmFsdWVfSXNCb29sZWFuKGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJIYXNWYWx1ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpPbmVvZihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYoYXJnYyA+IDEpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSAqcGFyYW1ldGVyc1ZhbHVlID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgICAgICB1bmZvbGRBcmdzKGhUaGlzLCBhcmdzLCBwYXJhbWV0ZXJzVmFsdWUsIGlDb3VudCwgMSk7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGlmKHNpbXBsZVZhbHVlQ29tcGFyZShoVGhpcywgYXJnT25lLCBwYXJhbWV0ZXJzVmFsdWVbaV0pKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBiRmxhZ3MpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwYXJhbWV0ZXJzVmFsdWVbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShwYXJhbWV0ZXJzVmFsdWUpOw0KKyAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIk9uZW9mIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OldpdGhpbihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdMb3cgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdIZWlnaHQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVtYmVyKGFyZ09uZSkpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgb25lTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgbG93TnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnTG93KTsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0TnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnSGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksICgob25lTnVtYmVyID49IGxvd051bWJlcikgJiYgKG9uZU51bWJlciA8PSBoZWlnaHROdW1iZXIpKSApOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG9uZVN0cmluZzsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG93U3RyaW5nOw0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBoZWlnaHRTdHJpbmc7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIG9uZVN0cmluZyk7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb3csIGxvd1N0cmluZyk7DQorICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdIZWlnaHQsIGhlaWdodFN0cmluZyk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoKG9uZVN0cmluZy5Db21wYXJlKGxvd1N0cmluZykgPj0gMCkgJiYgKG9uZVN0cmluZy5Db21wYXJlKGhlaWdodFN0cmluZykgPD0gMCkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdMb3cpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIldpdGhpbiIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJZihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0NvbmRpdGlvbiA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3RWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgRlhfQk9PTCBiQ29uZGl0aW9uID0gRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGFyZ0NvbmRpdGlvbik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBiQ29uZGl0aW9uID8gYXJnRmlyc3RWYWx1ZSA6IGFyZ1NlY29uZFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnQ29uZGl0aW9uKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIklmIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkV2YWwoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHNjcmlwdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHV0ZjhTY3JpcHRTdHJpbmc7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoc2NyaXB0VmFsdWUsIHV0ZjhTY3JpcHRTdHJpbmcpOw0KKyAgICAgICAgaWYgKHV0ZjhTY3JpcHRTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0QnVmOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nICBqYXZhU2NyaXB0Ow0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgICAgICAgICAgWEZBX0ZNMkpTX1RyYW5zbGF0ZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXRmOFNjcmlwdFN0cmluZywgdXRmOFNjcmlwdFN0cmluZy5HZXRMZW5ndGgoKSksIHdzSmF2YVNjcmlwdEJ1Ziwgd3NFcnJvcik7DQorICAgICAgICAgICAgRlhKU0VfSENPTlRFWFQgaENvbnRleHQgPSBGWEpTRV9Db250ZXh0X0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHJldHVyblZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBqYXZhU2NyaXB0ID0gd3NKYXZhU2NyaXB0QnVmLkdldFdpZGVTdHJpbmcoKTsNCisgICAgICAgICAgICBGWEpTRV9FeGVjdXRlU2NyaXB0KGhDb250ZXh0LCBGWF9VVEY4RW5jb2RlKGphdmFTY3JpcHQsIGphdmFTY3JpcHQuR2V0TGVuZ3RoKCkpLCByZXR1cm5WYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgcmV0dXJuVmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmV0dXJuVmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX0NvbnRleHRfUmVsZWFzZShoQ29udGV4dCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNjcmlwdFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJFdmFsIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgNCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1syXSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdPbmUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChpTGVuZ3RoID49IDMpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGpzT2JqZWN0VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpICYmICghRlhKU0VfVmFsdWVfSXNOdWxsKGpzT2JqZWN0VmFsdWUpKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcmdWYWx1ZXNbM107DQorICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAzKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1syXSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMywgcmdWYWx1ZXMpOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcmdWYWx1ZXNbM107DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDMpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1syXSwgYXJnT25lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIDMsIHJnVmFsdWVzKTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc0Jvb2xlYW4oYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bWJlcihhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYXJnT25lKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlJlZiIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VHlwZShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgdW5pdHNwYW5WYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHVuaXRzcGFuVmFsdWUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdW5pdHNwYW5TdHJpbmc7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcodW5pdHNwYW5WYWx1ZSwgdW5pdHNwYW5TdHJpbmcpOw0KKyAgICAgICAgaWYgKHVuaXRzcGFuU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiaW4iKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVudW0gWEZBX0ZNMkpTX1ZBTFVFVFlQRV9QYXJzZXJTdGF0dXMgew0KKyAgICAgICAgICAgICAgICBWQUxVRVRZUEVfU1RBUlQsDQorICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9IQVZFSU5WQUxJRENIQVIsDQorICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9IQVZFRElHSVQsDQorICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSwNCisgICAgICAgICAgICAgICAgVkFMVUVUWVBFX0lTQ00sDQorICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9JU01NLA0KKyAgICAgICAgICAgICAgICBWQUxVRVRZUEVfSVNQVCwNCisgICAgICAgICAgICAgICAgVkFMVUVUWVBFX0lTTVAsDQorICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9JU0lOLA0KKyAgICAgICAgICAgIH07DQorICAgICAgICAgICAgdW5pdHNwYW5TdHJpbmcuTWFrZUxvd2VyKCk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHVuaXRzcGFuU3RyaW5nLCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgRlhfTFBDV1NUUiBwRGF0YSA9IHdzVHlwZVN0cmluZzsNCisgICAgICAgICAgICBGWF9JTlQzMiB1ID0gMDsNCisgICAgICAgICAgICBGWF9JTlQzMiB1TGVuID0gd3NUeXBlU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gMHgyMCB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwRCkgew0KKyAgICAgICAgICAgICAgICB1Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9GTTJKU19WQUxVRVRZUEVfUGFyc2VyU3RhdHVzIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfU1RBUlQ7DQorICAgICAgICAgICAgRlhfV0NIQVIgdHlwZUNoYXI7DQorICAgICAgICAgICAgd2hpbGUgKHUgPCB1TGVuKSB7DQorICAgICAgICAgICAgICAgIHR5cGVDaGFyID0gKihwRGF0YSArIHUpOw0KKyAgICAgICAgICAgICAgICBpZiAodHlwZUNoYXIgPT0gMHgyMCB8fCB0eXBlQ2hhciA9PSAweDA5IHx8IHR5cGVDaGFyID09IDB4MEIgfHwgdHlwZUNoYXIgPT0gMHgwQyB8fCB0eXBlQ2hhciA9PSAweDBBIHx8IHR5cGVDaGFyID09IDB4MEQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVCB8fCBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEU7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNJTjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZUNoYXIgPj0gJzAnICYmIHR5cGVDaGFyIDw9ICc5JykgfHwgdHlwZUNoYXIgPT0gJy0nIHx8IHR5cGVDaGFyID09ICcuJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU0lOOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVESUdJVDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZUNoYXIgPT0gJ2MnIHx8IHR5cGVDaGFyID09ICdwJykgJiYgKHUgKyAxIDwgdUxlbikpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHRDaGFyID0gKihwRGF0YSArIHUgKyAxKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfU1RBUlQgfHwgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUIHx8IGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dENoYXIgPiAnOScgfHwgbmV4dENoYXIgPCAnMCcpICYmIG5leHRDaGFyICE9ICcuJyAmJiBuZXh0Q2hhciAhPSAnLScgKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9ICh0eXBlQ2hhciA9PSAnYycpID8gVkFMVUVUWVBFX0lTQ00gOiBWQUxVRVRZUEVfSVNQVDsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFSU5WQUxJRENIQVI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNoYXIgPT0gJ20nICYmICh1ICsgMSA8IHVMZW4pKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBuZXh0Q2hhciA9ICoocERhdGEgKyB1ICsgMSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX1NUQVJUIHx8IGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVCB8fCBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRDaGFyID4gJzknIHx8IG5leHRDaGFyIDwgJzAnKSAmJiBuZXh0Q2hhciAhPSAnLicgJiYgbmV4dENoYXIgIT0gJy0nICkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNTTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJ3AnIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUgKyA1IDwgdUxlbikgJiYgKihwRGF0YSArIHUgKyAxKSA9PSAnaScgJiYgKihwRGF0YSArIHUgKyAyKSA9PSAnbCcgJiYgKihwRGF0YSArIHUgKyAzKSA9PSAnbCcgJiYgKihwRGF0YSArIHUgKyA0KSA9PSAnaScgJiYgKihwRGF0YSArIHUgKyA1KSA9PSAncCcpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNUDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVJTlZBTElEQ0hBUjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB1Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHN3aXRjaCAoZVBhcnNlclN0YXR1cykgew0KKyAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU0NNOg0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJjbSIpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU01NOg0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJtbSIpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU1BUOg0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJwdCIpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU01QOg0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJtcCIpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJpbiIpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJVbml0VHlwZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyA9PSAxKSB8fCAoYXJnYyA9PSAyKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHVuaXRzcGFuVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHVuaXRWYWx1ZSA9IDA7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyB1bml0c3BhblN0cmluZzsNCisgICAgICAgIEZYX0RPVUJMRSBkRmlyc3ROdW1iZXIgPSAwOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyRmlyc3RVbml0Ow0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVW5pdDsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwodW5pdHNwYW5WYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyh1bml0c3BhblZhbHVlLCB1bml0c3BhblN0cmluZyk7DQorICAgICAgICAgICAgRlhfTFBDU1RSIHBEYXRhID0gdW5pdHNwYW5TdHJpbmc7DQorICAgICAgICAgICAgaWYgKHBEYXRhKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIHUgPSAwOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKihwRGF0YSArIHUpID09IDB4MjAgfHwgKihwRGF0YSArIHUpID09IDB4MDkgfHwgKihwRGF0YSArIHUpID09IDB4MEIgfHwgKihwRGF0YSArIHUpID09IDB4MEMgfHwgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgY2ggPSAqKHBEYXRhICsgdSk7DQorICAgICAgICAgICAgICAgICAgICArK3U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgdVN0YXJ0ID0gdTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHUgPCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqKHBEYXRhICsgdSkgPiAnOScgfHwgKihwRGF0YSArIHUpIDwgJzAnKSAmJiAqKHBEYXRhICsgdSkgIT0gJy4nICYmICoocERhdGEgKyB1KSAhPSAnLScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICsrdTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9DSEFSICogcFRlbXAgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBkRmlyc3ROdW1iZXIgPSBzdHJ0b2QocERhdGEsICZwVGVtcCk7DQorICAgICAgICAgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gJyAnIHx8ICoocERhdGEgKyB1KSA9PSAweDA5IHx8ICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8ICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQorICAgICAgICAgICAgICAgICAgICArK3U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgdUxlbiA9IHVuaXRzcGFuU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAodSA8IHVMZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgqKHBEYXRhICsgdSkgPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzdHJGaXJzdFVuaXQgKz0gKCoocERhdGEgKyB1KSk7DQorICAgICAgICAgICAgICAgICAgICArK3U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3RyRmlyc3RVbml0Lk1ha2VMb3dlcigpOw0KKyAgICAgICAgICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICAgICAgICAgICAgICB1bml0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdW5pdFRlbXBTdHJpbmc7DQorICAgICAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcodW5pdFZhbHVlLCB1bml0VGVtcFN0cmluZyk7DQorICAgICAgICAgICAgICAgICAgICBGWF9MUENTVFIgcERhdGEgPSB1bml0VGVtcFN0cmluZzsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCoocERhdGEgKyB1KSA9PSAnICcgfHwgKihwRGF0YSArIHUpID09IDB4MDkgfHwgKihwRGF0YSArIHUpID09IDB4MEIgfHwgKihwRGF0YSArIHUpID09IDB4MEMgfHwgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICArK3U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAodSA8IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqKHBEYXRhICsgdSkgPiAnOScgfHwgKihwRGF0YSArIHUpIDwgJzAnKSAmJiAqKHBEYXRhICsgdSkgIT0gJy4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICArK3U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKihwRGF0YSArIHUpID09ICcgJyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwRCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICsrdTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHVMZW4gPSB1bml0VGVtcFN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh1IDwgdUxlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHBEYXRhICsgdSkgPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJVbml0ICs9ICgqKHBEYXRhICsgdSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICsrdTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHN0clVuaXQuTWFrZUxvd2VyKCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBzdHJVbml0ID0gc3RyRmlyc3RVbml0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkUmVzdWx0ID0gMDsNCisgICAgICAgICAgICAgICAgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgiaW4iKSB8fCBzdHJGaXJzdFVuaXQuRXF1YWwoImluY2hlcyIpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyVW5pdC5FcXVhbCgibW0iKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDI1LjQ7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAyLjU0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJtcCIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJtbSIpIHx8IHN0ckZpcnN0VW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0clVuaXQuRXF1YWwoIm1tIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAxMDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyNS40IC8gNzI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyNS40IC8gNzIwMDA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyNS40Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgiY20iKSB8fCBzdHJGaXJzdFVuaXQuRXF1YWwoImNlbnRpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMTA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoInB0IikgfHwgc3RyVW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NCAvIDcyOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJtcCIpICB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjAwMDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJwdCIpIHx8IHN0ckZpcnN0VW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIgKiAyNS40Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJjbSIpIHx8IHN0clVuaXQuRXF1YWwoImNlbnRpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIgKiAyLjU0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDEwMDA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQuRXF1YWwoIm1wIikgfHwgc3RyRmlyc3RVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyVW5pdC5FcXVhbCgibW0iKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyMDAwICogMjUuNDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyMDAwICogMi41NDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAxMDAwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJtcCIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZFJlc3VsdCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQorICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh1bml0VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiVW5pdFZhbHVlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nVHdvOw0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN0cmluZ1R3byk7DQorICAgICAgICAgICAgaWYgKHN0cmluZ1R3by5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDEpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cmluZ09uZTsNCisgICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3RyaW5nT25lKTsNCisgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBpUG9zaXRpb24gPSBzdHJpbmdPbmUuRmluZChzdHJpbmdUd28pOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVBvc2l0aW9uICsgMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkF0IikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvbmNhdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPj0gMSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0U3RyaW5nOw0KKyAgICAgICAgRlhfQk9PTCBiQWxsTnVsbCA9IFRSVUU7DQorICAgICAgICBGWEpTRV9IVkFMVUUgKmFyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgYXJnYyk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgICAgICAgYXJnVmFsdWVzW2ldID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCBpKTsNCisgICAgICAgICAgICBpZighSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdWYWx1ZXNbaV0pKSB7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHZhbHVlU3RyOw0KKyAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVmFsdWVzW2ldLCB2YWx1ZVN0cik7DQorICAgICAgICAgICAgICAgIHJlc3VsdFN0cmluZyArPSB2YWx1ZVN0cjsNCisgICAgICAgICAgICAgICAgYkFsbE51bGwgPSBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKGFyZ1ZhbHVlcyk7DQorICAgICAgICBpZiAoYkFsbE51bGwpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRTdHJpbmcpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkNvbmNhdCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0b0RlY29kZVN0cmluZzsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0RlY29kZVN0cmluZyk7DQorICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsNCisgICAgICAgICAgICBEZWNvZGVVUkwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2UgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0b0RlY29kZVN0cmluZzsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0RlY29kZVN0cmluZyk7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWRlbnRpZnlTdHJpbmc7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgaWRlbnRpZnlTdHJpbmcpOw0KKyAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQorICAgICAgICAgICAgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKEZYX0JTVFJDKCJodG1sIikpKSB7DQorICAgICAgICAgICAgICAgIERlY29kZUhUTUwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZShGWF9CU1RSQygieG1sIikpKSB7DQorICAgICAgICAgICAgICAgIERlY29kZVhNTCh0b0RlY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBEZWNvZGVVUkwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJEZWNvZGUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGVjb2RlVVJMIChGWF9CU1RSIHN6VVJMU3RyaW5nLCAgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdFN0cmluZykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VVJMU3RyaW5nLkdldENTdHIoKSwgc3pVUkxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICBGWF9MUENXU1RSIHBEYXRhID0gd3NVUkxTdHJpbmc7DQorICAgIEZYX0lOVDMyIGlMZW4gPSB3c1VSTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIEZYX1dDSEFSIGNoID0gMDsNCisgICAgRlhfV0NIQVIgY2hUZW1wID0gMDsNCisgICAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKCclJyA9PSBjaCkgew0KKyAgICAgICAgICAgIGNoVGVtcCA9IDA7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgICAgICAgICB3aGlsZSAoaUNvdW50IDwgMikgew0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpQ291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJzAnKSAqIDE2Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJzAnKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpQ291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hUZW1wICs9IChjaCAtICdBJyArIDEwKSAqIDE2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnQScgKyAxMCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpQ291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hUZW1wICs9IChjaCAtICdhJyArIDEwKSAqIDE2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnYScgKyAxMCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICArK2lDb3VudDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaFRlbXApOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgIH0NCisgICAgICAgICsraTsNCisgICAgfQ0KKyAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgICBzelJlc3VsdFN0cmluZyAgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZUhUTUwoRlhfQlNUUiBzekhUTUxTdHJpbmcsIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRTdHJpbmcpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0hUTUxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pIVE1MU3RyaW5nLkdldENTdHIoKSwgc3pIVE1MU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgRlhfV0NIQVIgc3RyU3RyaW5nWzldOw0KKyAgICBGWF9JTlQzMiBpU3RySW5kZXggPSAwOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gd3NIVE1MU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgRlhfSU5UMzIgaUNvZGUgPSAwOw0KKyAgICBGWF9XQ0hBUiBjaCA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcERhdGEgPSB3c0hUTUxTdHJpbmc7DQorICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsNCisgICAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGlmIChjaCA9PSAnJicpIHsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgaWYgKGNoID09ICcjJykgew0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3gnIHx8IGNoID09ICdYJykgew0KKyAgICAgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB8fCAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICcwJzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICdhJyArIDEwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ0EnICsgMTA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvZGUgKj0gMTY7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSAvPSAxNjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkNsZWFyKCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7DQorICAgICAgICAgICAgICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4KytdID0gY2g7DQorICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4XSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9VSU5UMzIgaURhdGEgPSAwOw0KKyAgICAgICAgaWYgKEhUTUxTVFIyQ29kZShzdHJTdHJpbmcsIGlEYXRhKSkgew0KKyAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoKEZYX1dDSEFSKWlEYXRhKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihpQ29kZSk7DQorICAgICAgICB9DQorICAgICAgICBpU3RySW5kZXggPSAwOw0KKyAgICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOw0KKyAgICAgICAgKytpOw0KKyAgICB9DQorICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7DQorICAgIHN6UmVzdWx0U3RyaW5nICA9IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuR2V0QnVmZmVyKCksIHdzUmVzdWx0QnVmLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGVjb2RlWE1MIChGWF9CU1RSIHN6WE1MU3RyaW5nLCAgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdFN0cmluZykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzWE1MU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6WE1MU3RyaW5nLkdldENTdHIoKSwgc3pYTUxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICBGWF9XQ0hBUiBzdHJTdHJpbmdbOV07DQorICAgIEZYX0lOVDMyIGlTdHJJbmRleCA9IDA7DQorICAgIEZYX0lOVDMyIGlMZW4gPSB3c1hNTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIEZYX0lOVDMyIGlDb2RlID0gMDsNCisgICAgRlhfV0NIQVIgY2ggPSAwOw0KKyAgICBGWF9MUENXU1RSIHBEYXRhID0gd3NYTUxTdHJpbmc7DQorICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1hNTEJ1ZjsNCisgICAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGlmIChjaCA9PSAnJicpIHsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgaWYgKGNoID09ICcjJykgew0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3gnIHx8IGNoID09ICdYJykgew0KKyAgICAgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB8fCAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJzsnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICcwJzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICdhJyArIDEwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ0EnICsgMTA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvZGUgKj0gMTY7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSAvPSAxNjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzWE1MQnVmLkNsZWFyKCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7DQorICAgICAgICAgICAgICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4KytdID0gY2g7DQorICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4XSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9XQ0hBUiAqc3RyTmFtZVtdID0gew0KKyAgICAgICAgICAgIChGWF9XQ0hBUiAqKUwicXVvdCIsDQorICAgICAgICAgICAgKEZYX1dDSEFSICopTCJhbXAiLA0KKyAgICAgICAgICAgIChGWF9XQ0hBUiAqKUwiYXBvcyIsDQorICAgICAgICAgICAgKEZYX1dDSEFSICopTCJsdCIsDQorICAgICAgICAgICAgKEZYX1dDSEFSICopTCJndCINCisgICAgICAgIH07DQorICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSAwOw0KKyAgICAgICAgd2hpbGUgKGlJbmRleCA8IDUpIHsNCisgICAgICAgICAgICBpZiAoRlhTWVNfbWVtY21wKHN0clN0cmluZywgc3RyTmFtZVtpSW5kZXhdLCBGWFNZU193Y3NsZW4oc3RyTmFtZVtpSW5kZXhdKSkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgKytpSW5kZXg7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKGlJbmRleCkgew0KKyAgICAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignIicpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCdcJycpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoJzwnKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCc+Jyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoaUNvZGUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlTdHJJbmRleCA9IDA7DQorICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4XSA9IDA7DQorICAgICAgICArK2k7DQorICAgICAgICBpQ29kZSA9IDA7DQorICAgIH0NCisgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgc3pSZXN1bHRTdHJpbmcgID0gRlhfVVRGOEVuY29kZSh3c1hNTEJ1Zi5HZXRCdWZmZXIoKSwgd3NYTUxCdWYuR2V0TGVuZ3RoKCkpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZzsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0VuY29kZVN0cmluZyk7DQorICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsNCisgICAgICAgICAgICBFbmNvZGVVUkwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2UgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZzsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0VuY29kZVN0cmluZyk7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWRlbnRpZnlTdHJpbmc7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgaWRlbnRpZnlTdHJpbmcpOw0KKyAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQorICAgICAgICAgICAgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKEZYX0JTVFJDKCJodG1sIikpKSB7DQorICAgICAgICAgICAgICAgIEVuY29kZUhUTUwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZShGWF9CU1RSQygieG1sIikpKSB7DQorICAgICAgICAgICAgICAgIEVuY29kZVhNTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBFbmNvZGVVUkwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJFbmNvZGUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlVVJMIChGWF9CU1RSIHN6VVJMU3RyaW5nLCAgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdEJ1ZikNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VVJMU3RyaW5nLkdldENTdHIoKSwgc3pVUkxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7DQorICAgIEZYX1dDSEFSIGNoID0gMDsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzVVJMU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICBGWF9XQ0hBUiBzdHJFbmNvZGVbNF07DQorICAgIHN0ckVuY29kZVswXSA9ICclJzsNCisgICAgc3RyRW5jb2RlWzNdID0gMDsNCisgICAgRlhfV0NIQVIgc3RyVW5zYWZlW10gPSB7ICcgJywgJzwnLCAnPicsICciJywgJyMnLCAnJScsICd7JywgJ30nLCAnfCcsICdcXCcsICdeJywgJ34nLCAnWycsICddJywgJ2AnIH07DQorICAgIEZYX1dDSEFSIHN0clJlc2VydmVkW10gPSB7JzsnLCAnLycsICc/JywgJzonLCAnQCcsICc9JywgJyYnfTsNCisgICAgRlhfV0NIQVIgc3RyU3BlY2lhbFtdID0geyckJywgJy0nLCAnKycsICchJywgJyonLCAnXCcnLCAnKCcsICcpJywgJywnfTsNCisgICAgRlhfV0NIQVIqIHN0ckNvZGUgPSAoRlhfV0NIQVIgKilMIjAxMjM0NTY3ODlhYmNkZWYiOw0KKyAgICBmb3IgKEZYX0lOVDMyIHUgPSAwOyB1IDwgaUxlbmd0aDsgKyt1KSB7DQorICAgICAgICBjaCA9IHdzVVJMU3RyaW5nLkdldEF0KHUpOw0KKyAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBzaXplb2Yoc3RyVW5zYWZlKSAvIHNpemVvZihzdHJVbnNhZmVbMF0pOw0KKyAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCisgICAgICAgICAgICBpZiAoY2ggPT0gc3RyVW5zYWZlW2ldKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IGNoIC8gMTY7DQorICAgICAgICAgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0ckNvZGVbaUluZGV4XTsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpID0gMDsNCisgICAgICAgIGlDb3VudCA9IHNpemVvZihzdHJSZXNlcnZlZCkgLyBzaXplb2Yoc3RyUmVzZXJ2ZWRbMF0pOw0KKyAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCisgICAgICAgICAgICBpZiAoY2ggPT0gc3RyUmVzZXJ2ZWRbaV0pIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgKytpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGkgPCBpQ291bnQpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGkgPSAwOw0KKyAgICAgICAgaUNvdW50ID0gc2l6ZW9mKHN0clNwZWNpYWwpIC8gc2l6ZW9mKHN0clNwZWNpYWxbMF0pOw0KKyAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCisgICAgICAgICAgICBpZiAoY2ggPT0gc3RyU3BlY2lhbFtpXSkgew0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2ggPj0gMHg4MCAmJiBjaCA8PSAweGZmKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07DQorICAgICAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gMHgwICYmIGNoIDw9IDB4MWYpIHx8IGNoID09IDB4N2YpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSBjaCAvIDE2Ow0KKyAgICAgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0ckNvZGVbaUluZGV4XTsNCisgICAgICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KKyAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4MjAgJiYgY2ggPD0gMHg3ZSkgew0KKyAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUmFkaXggPSAxNjsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJUbXA7DQorICAgICAgICAgICAgd2hpbGUgKGNoID49IGlSYWRpeCkgew0KKyAgICAgICAgICAgICAgICBGWF9XQ0hBUiB0bXAgPSBzdHJDb2RlW2NoICUgaVJhZGl4XTsNCisgICAgICAgICAgICAgICAgY2ggLz0gaVJhZGl4Ow0KKyAgICAgICAgICAgICAgICBzdHJUbXAgKz0gdG1wOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdHJUbXAgKz0gc3RyQ29kZVtjaF07DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbiA9IHN0clRtcC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICBpZiAoaUxlbiA8IDIpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgICAgICAgICAgaWYgKGlMZW4gJSAyICE9IDApIHsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzFdID0gJzAnOw0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXAuR2V0QXQoaUxlbiAtIDEpOw0KKyAgICAgICAgICAgICAgICBpSW5kZXggPSBpTGVuIC0gMjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJUbXAuR2V0QXQoaUxlbiAtIDEpOw0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXAuR2V0QXQoaUxlbiAtIDIpOw0KKyAgICAgICAgICAgICAgICBpSW5kZXggPSBpTGVuIC0gMzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICAgICAgICB3aGlsZSAoaUluZGV4ID4gMCkgew0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJUbXAuR2V0QXQoaUluZGV4KTsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyVG1wLkdldEF0KGlJbmRleCAtIDEpOw0KKyAgICAgICAgICAgICAgICBpSW5kZXggLT0gMjsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgc3pSZXN1bHRCdWYgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkVuY29kZUhUTUwoRlhfQlNUUiBzekhUTUxTdHJpbmcsIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpDQorew0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBzekhUTUxTdHJpbmcuR2V0Q1N0cigpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0hUTUxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KKyAgICBGWF9MUENXU1RSIHN0ckNvZGUgPSAoRlhfTFBDV1NUUilMIjAxMjM0NTY3ODlhYmNkZWYiOw0KKyAgICBGWF9XQ0hBUiBzdHJFbmNvZGVbOV07DQorICAgIHN0ckVuY29kZVswXSA9ICcmJzsNCisgICAgc3RyRW5jb2RlWzFdID0gJyMnOw0KKyAgICBzdHJFbmNvZGVbMl0gPSAneCc7DQorICAgIHN0ckVuY29kZVs1XSA9ICc7JzsNCisgICAgc3RyRW5jb2RlWzZdID0gMDsNCisgICAgc3RyRW5jb2RlWzddID0gJzsnOw0KKyAgICBzdHJFbmNvZGVbOF0gPSAwOw0KKyAgICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7DQorICAgIEZYX1VJTlQzMiBjaCA9IDA7DQorICAgIEZYX0lOVDMyIGlMZW4gPSB3c0hUTUxTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBGWF9MUENXU1RSIHBEYXRhID0gd3NIVE1MU3RyaW5nOw0KKyAgICBGWF9JTlQzMiBpSW5kZXggPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZyBodG1sUmVzZXJ2ZTsNCisgICAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGh0bWxSZXNlcnZlLkVtcHR5KCk7DQorICAgICAgICBpZiAoSFRNTENvZGUyU1RSKGNoLCBodG1sUmVzZXJ2ZSkpIHsNCisgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKEwnJicpOw0KKyAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IGh0bWxSZXNlcnZlOw0KKyAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoTCc7Jyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigoRlhfV0NIQVIpY2gpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYpIHsNCisgICAgICAgICAgICAgICAgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KKyAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNV0gPSAnOyc7DQorICAgICAgICAgICAgICAgIHN0ckVuY29kZVs2XSA9IDA7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUJpZ0J5dGUgPSBjaCAvIDI1NjsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpQmlnQnl0ZSAvIDE2XTsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtpQmlnQnl0ZSAlIDE2XTsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsNCisgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzZdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAlIDE2XTsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICArK2k7DQorICAgIH0NCisgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgc3pSZXN1bHRCdWYgID0gRlhfVVRGOEVuY29kZSh3c1Jlc3VsdEJ1Zi5HZXRCdWZmZXIoKSwgd3NSZXN1bHRCdWYuR2V0TGVuZ3RoKCkpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVYTUwgKEZYX0JTVFIgc3pYTUxTdHJpbmcsICBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0QnVmKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pYTUxTdHJpbmcuR2V0Q1N0cigpLCBzelhNTFN0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsNCisgICAgZW51bSB7DQorICAgICAgICBRVU9ULA0KKyAgICAgICAgQU1QLA0KKyAgICAgICAgQVBPUywNCisgICAgICAgIExULA0KKyAgICAgICAgR1QsDQorICAgIH07DQorICAgIEZYX1dDSEFSIHN0ckVuY29kZVs5XTsNCisgICAgc3RyRW5jb2RlWzBdID0gJyYnOw0KKyAgICBzdHJFbmNvZGVbMV0gPSAnIyc7DQorICAgIHN0ckVuY29kZVsyXSA9ICd4JzsNCisgICAgc3RyRW5jb2RlWzVdID0gJzsnOw0KKyAgICBzdHJFbmNvZGVbNl0gPSAwOw0KKyAgICBzdHJFbmNvZGVbN10gPSAnOyc7DQorICAgIHN0ckVuY29kZVs4XSA9IDA7DQorICAgIEZYX1dDSEFSICpzdHJOYW1lW10gPSB7DQorICAgICAgICAoRlhfV0NIQVIgKilMInF1b3QiLA0KKyAgICAgICAgKEZYX1dDSEFSICopTCJhbXAiLA0KKyAgICAgICAgKEZYX1dDSEFSICopTCJhcG9zIiwNCisgICAgICAgIChGWF9XQ0hBUiAqKUwibHQiLA0KKyAgICAgICAgKEZYX1dDSEFSICopTCJndCINCisgICAgfTsNCisgICAgRlhfV0NIQVIqIHN0ckNvZGUgPSAoRlhfV0NIQVIgKilMIjAxMjM0NTY3ODlhYmNkZWYiOw0KKyAgICBGWF9XQ0hBUiBjaCA9IDA7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c1hNTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaUluZGV4ID0gMDsNCisgICAgRlhfSU5UMzIgdSA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcERhdGEgPSB3c1hNTFN0cmluZzsNCisgICAgZm9yICh1ID0gMDsgdSA8IGlMZW5ndGg7ICsrdSkgew0KKyAgICAgICAgY2ggPSAqKHBEYXRhICsgdSk7DQorICAgICAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgICAgICAgY2FzZSAnIic6DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyTmFtZVtRVU9UXSk7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnJic6DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyTmFtZVtBTVBdKTsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICAnXCcnOg0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ck5hbWVbQVBPU10pOw0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgICc8JzoNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOw0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJOYW1lW0xUXSk7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnPic6DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyTmFtZVtHVF0pOw0KKyAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpSW5kZXggPSBjaCAvIDE2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckVuY29kZVszXSA9IHN0ckNvZGVbaUluZGV4XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckVuY29kZVs1XSA9ICc7JzsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNl0gPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlCaWdCeXRlID0gY2ggLyAyNTY7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lCaWdCeXRlIC8gMTZdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckVuY29kZVs0XSA9IHN0ckNvZGVbaUJpZ0J5dGUgJSAxNl07DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNl0gPSBzdHJDb2RlW2lMaXR0bGVCeXRlICUgMTZdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgc3pSZXN1bHRCdWYgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhUTUxTVFIyQ29kZShGWF9XU1RSIHBEYXRhLCBGWF9VSU5UMzIgJmlDb2RlKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBEYXRhLkdldExlbmd0aCgpOw0KKyAgICBGWF9VSU5UMzIgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhwRGF0YS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICAgIFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSBodG1saGFzaGVkcmVzZXJ2ZWNvZGU7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSAoc2l6ZW9mKHJlc2VydmVzRm9yRGVjb2RlKSAvIHNpemVvZihyZXNlcnZlc0ZvckRlY29kZVswXSkpIC0gMTsNCisgICAgRlhfSU5UMzIgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGRvIHsNCisgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgaHRtbGhhc2hlZHJlc2VydmVjb2RlID0gcmVzZXJ2ZXNGb3JEZWNvZGVbaU1pZF07DQorICAgICAgICBpZiAodUhhc2ggPT0gaHRtbGhhc2hlZHJlc2VydmVjb2RlLm1fdUhhc2gpIHsNCisgICAgICAgICAgICBpQ29kZSA9IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VDb2RlOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VIYXNoKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhUTUxDb2RlMlNUUihGWF9VSU5UMzIgaUNvZGUsIENGWF9XaWRlU3RyaW5nICZ3c0hUTUxSZXNlcnZlKQ0KK3sNCisgICAgWEZBX0ZNSHRtbFJlc2VydmVDb2RlIGh0bWxyZXNlcnZlY29kZTsNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IChzaXplb2YocmVzZXJ2ZXNGb3JFbmNvZGUpIC8gc2l6ZW9mKHJlc2VydmVzRm9yRW5jb2RlWzBdKSkgLSAxOw0KKyAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgZG8gew0KKyAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBodG1scmVzZXJ2ZWNvZGUgPSByZXNlcnZlc0ZvckVuY29kZVtpTWlkXTsNCisgICAgICAgIGlmIChpQ29kZSA9PSBodG1scmVzZXJ2ZWNvZGUubV91Q29kZSkgew0KKyAgICAgICAgICAgIHdzSFRNTFJlc2VydmUgPSBodG1scmVzZXJ2ZWNvZGUubV9odG1sUmVzZXJ2ZTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoaUNvZGUgPCBodG1scmVzZXJ2ZWNvZGUubV91Q29kZSkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfUEFUVEVSTl9TVFJJTkdfVHlwZShGWF9CU1RSIHN6UGF0dGVybiwgRlhfRFdPUkQmIHBhdHRlcm5UeXBlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybi5HZXRDU3RyKCksIHN6UGF0dGVybi5HZXRMZW5ndGgoKSk7DQorICAgIGlmIChGWF9XU1RSQyhMImRhdGV0aW1lIikgPT0gd3NQYXR0ZXJuLkxlZnQoOCkpIHsNCisgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0RBVEVUSU1FOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJkYXRlIikgPT0gd3NQYXR0ZXJuLkxlZnQoNCkpIHsNCisgICAgICAgIHBhdHRlcm5UeXBlID0gd3NQYXR0ZXJuLkZpbmQoTCJ0aW1lIikgPiAwID8gWEZBX1ZUX0RBVEVUSU1FIDogWEZBX1ZUX0RBVEU7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfSBlbHNlIGlmIChGWF9XU1RSQyhMInRpbWUiKSA9PSB3c1BhdHRlcm4uTGVmdCg0KSkgew0KKyAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVElNRTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwidGV4dCIpID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7DQorICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJudW0iKSA9PSB3c1BhdHRlcm4uTGVmdCgzKSkgew0KKyAgICAgICAgaWYgKEZYX1dTVFJDKEwiaW50ZWdlciIpID09IHdzUGF0dGVybi5NaWQoNCwgNykpIHsNCisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9JTlRFR0VSOw0KKyAgICAgICAgfSBlbHNlIGlmIChGWF9XU1RSQyhMImRlY2ltYWwiKSA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7DQorICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREVDSU1BTDsNCisgICAgICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJjdXJyZW5jeSIpID09IHdzUGF0dGVybi5NaWQoNCwgOCkpIHsNCisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJwZXJjZW50IikgPT0gd3NQYXR0ZXJuLk1pZCg0LCA3KSkgew0KKyAgICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX05VTEw7DQorICAgIHdzUGF0dGVybi5NYWtlTG93ZXIoKTsNCisgICAgRlhfTFBDV1NUUiBwRGF0YSA9IHdzUGF0dGVybjsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgaUluZGV4ID0gMDsNCisgICAgRlhfQk9PTCBiU2luZ2xlUXVvdGF0aW9uID0gRkFMU0U7DQorICAgIEZYX1dDSEFSIHBhdHRlcm5DaGFyOw0KKyAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgcGF0dGVybkNoYXIgPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgICAgIGlmIChwYXR0ZXJuQ2hhciA9PSAweDI3KSB7DQorICAgICAgICAgICAgYlNpbmdsZVF1b3RhdGlvbiA9ICFiU2luZ2xlUXVvdGF0aW9uOw0KKyAgICAgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJiAocGF0dGVybkNoYXIgPT0gJ3knIHx8IHBhdHRlcm5DaGFyID09ICdqJykpIHsNCisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgICAgICAgICAgIGlJbmRleCsrOw0KKyAgICAgICAgICAgIEZYX1dDSEFSIHRpbWVQYXR0ZXJuQ2hhcjsNCisgICAgICAgICAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICB0aW1lUGF0dGVybkNoYXIgPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgICAgICAgICAgICAgaWYgKHRpbWVQYXR0ZXJuQ2hhciA9PSAweDI3KSB7DQorICAgICAgICAgICAgICAgICAgICBiU2luZ2xlUXVvdGF0aW9uID0gIWJTaW5nbGVRdW90YXRpb247DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYgdGltZVBhdHRlcm5DaGFyID09ICd0Jykgew0KKyAgICAgICAgICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpSW5kZXgrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmIChwYXR0ZXJuQ2hhciA9PSAnaCcgfHwgcGF0dGVybkNoYXIgPT0gJ2snKSkgew0KKyAgICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RJTUU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmIChwYXR0ZXJuQ2hhciA9PSAnYScgfHwgcGF0dGVybkNoYXIgPT0gJ3gnIHx8IHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpKSB7DQorICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVDsNCisgICAgICAgICAgICBpZiAocGF0dGVybkNoYXIgPT0gJ3gnIHx8IHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJiAocGF0dGVybkNoYXIgPT0gJ3onIHx8IHBhdHRlcm5DaGFyID09ICdzJyB8fCBwYXR0ZXJuQ2hhciA9PSAnZScgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICd2JyB8fCBwYXR0ZXJuQ2hhciA9PSAnOCcgfHwgcGF0dGVybkNoYXIgPT0gJywnIHx8IHBhdHRlcm5DaGFyID09ICcuJyB8fCBwYXR0ZXJuQ2hhciA9PSAnJCcpKSB7DQorICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7DQorICAgICAgICAgICAgaWYgKHBhdHRlcm5DaGFyID09ICd2JyB8fCBwYXR0ZXJuQ2hhciA9PSAnOCcgfHwgcGF0dGVybkNoYXIgPT0gJyQnICkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpSW5kZXgrKzsNCisgICAgfQ0KKyAgICBpZiAocGF0dGVyblR5cGUgPT0gWEZBX1ZUX05VTEwpIHsNCisgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQgfCBYRkFfVlRfRkxPQVQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA+PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pQYXR0ZXJuOw0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3pQYXR0ZXJuKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBzelZhbHVlKTsNCisgICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgICAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICAgICAgSUZYX0xvY2FsZSAqcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgICAgICAgIEZYX0RXT1JEIHBhdHRlcm5UeXBlOw0KKyAgICAgICAgRlhfQk9PTCBiQ29tcGVsdGUgPSBYRkFfUEFUVEVSTl9TVFJJTkdfVHlwZShzelBhdHRlcm4sIHBhdHRlcm5UeXBlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGF0dGVybiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelBhdHRlcm4sIHN6UGF0dGVybi5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUsIHN6VmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgaWYgKCFiQ29tcGVsdGUpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHBhdHRlcm5UeXBlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBpVENoYXIgPSB3c1BhdHRlcm4uRmluZChMJ1QnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuID0gRlhfV1NUUkMoTCJkYXRleyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gd3NQYXR0ZXJuLkxlZnQoaVRDaGFyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWVQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gKz0gd3NQYXR0ZXJuLk1pZChpVENoYXIgKyAxKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm4gKyB3c1RpbWVQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMImRhdGV7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMInRpbWV7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX1RFWFQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMInRleHR7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJudW17IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Rlc3RQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gPSBGWF9XU1RSQyhMIm51bXsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGVtcExvY2FsZVZhbHVlKFhGQV9WVF9GTE9BVCwgd3NWYWx1ZSwgd3NUZXN0UGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBMb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gd3NUZXN0UGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwidGV4dHsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gd3NUZXN0UGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciAqKXBNZ3IpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQorICAgICAgICBpZiAobG9jYWxlVmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzUGF0dGVybiwgcExvY2FsZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJGb3JtYXQiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TGVmdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhfQk9PTCBhcmdJc051bGwgPSBGQUxTRTsNCisgICAgICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KKyAgICAgICAgICAgIGFyZ0lzTnVsbCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnSXNOdWxsKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBjb3VudCA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgYXJnVHdvKTsNCisgICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7DQorICAgICAgICAgICAgICAgIGNvdW50ID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZy5MZWZ0KGNvdW50KSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiTGVmdCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMZW4oRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc291cmNlU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJMZW4iKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TG93ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgMykpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGFyZ1N0cmluZzsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGxvY2FsZVZhbHVlID0gMDsNCisgICAgICAgIGlmKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYoYXJnYyA9PSAyKSB7DQorICAgICAgICAgICAgICAgIGxvY2FsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYXJnU3RyaW5nKTsNCisgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYgbG93U3RyaW5nQnVmOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICBGWF9MUENXU1RSIHBEYXRhID0gd3NBcmdTdHJpbmc7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbiA9IGFyZ1N0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgICAgICBGWF9JTlQzMiBjaCA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDVBKSB7DQorICAgICAgICAgICAgICAgICAgICBjaCArPSAzMjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweEMwICYmIGNoIDw9IDB4REUpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoICs9IDMyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IDB4MTAwIHx8IGNoID09IDB4MTAyIHx8IGNoID09IDB4MTA0KSB7DQorICAgICAgICAgICAgICAgICAgICBjaCArPSAxOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGxvd1N0cmluZ0J1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBsb3dTdHJpbmdCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfVVRGOEVuY29kZShsb3dTdHJpbmdCdWYuR2V0QnVmZmVyKCksIGxvd1N0cmluZ0J1Zi5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgIGlmKGFyZ2MgPT0gMikgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsZVZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJMb3dlciIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMdHJpbShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNvdXJjZVN0cmluZzsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzb3VyY2VTdHJpbmcpOw0KKyAgICAgICAgICAgIHNvdXJjZVN0cmluZy5UcmltTGVmdCgpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzb3VyY2VTdHJpbmcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkx0cmltIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlBhcnNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pQYXR0ZXJuOw0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHN6UGF0dGVybik7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pWYWx1ZTsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBzelZhbHVlKTsNCisgICAgICAgICAgICBDWEZBX0RvY3VtZW50ICpwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgICAgICAgICAgSUZYX0xvY2FsZU1nciAqcE1nciA9IChJRlhfTG9jYWxlTWdyICopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgICAgICAgICAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICAgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgICAgICAgICAgSUZYX0xvY2FsZSAqcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgICAgICAgICAgICBGWF9EV09SRCBwYXR0ZXJuVHlwZTsNCisgICAgICAgICAgICBGWF9CT09MIGJDb21wbGV0ZVBhdHRlcm4gPSBYRkFfUEFUVEVSTl9TVFJJTkdfVHlwZShzelBhdHRlcm4sIHBhdHRlcm5UeXBlKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1BhdHRlcm4gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQYXR0ZXJuLCBzelBhdHRlcm4uR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pWYWx1ZSwgc3pWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pQYXJzZWRWYWx1ZTsNCisgICAgICAgICAgICBpZiAoYkNvbXBsZXRlUGF0dGVybikgew0KKyAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciAqKXBNZ3IpOw0KKyAgICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChwYXR0ZXJuVHlwZSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBpVENoYXIgPSB3c1BhdHRlcm4uRmluZChMJ1QnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiA9IEZYX1dTVFJDKEwiZGF0ZXsiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiArPSB3c1BhdHRlcm4uTGVmdChpVENoYXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lUGF0dGVybiA9IEZYX1dTVFJDKEwidGltZXsiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1BhdHRlcm4uTWlkKGlUQ2hhciArIDEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSB3c0RhdGVQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShwYXR0ZXJuVHlwZSwgd3NWYWx1ZSwgd3NQYXR0ZXJuLCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IgKilwTWdyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJkYXRleyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6UGFyc2VkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciAqKXBNZ3IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVEVYVDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMInRleHR7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfVEVYVCwgd3NWYWx1ZSwgd3NQYXR0ZXJuLCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IgKilwTWdyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciAqKXBNZ3IpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBsb2NhbGVWYWx1ZS5HZXREb3VibGVOdW0oKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXN0UGF0dGVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9GTE9BVCwgd3NWYWx1ZSwgd3NUZXN0UGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGxvY2FsZVZhbHVlLkdldERvdWJsZU51bSgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gPSBGWF9XU1RSQyhMInRleHR7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfVEVYVCwgd3NWYWx1ZSwgd3NUZXN0UGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6UGFyc2VkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJQYXJzZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSZXBsYWNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGFyZ2MgPT0gMikgfHwgKGFyZ2MgPT0gMykpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gMDsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIG9uZVN0cmluZzsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHR3b1N0cmluZzsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHRocmVlU3RyaW5nOw0KKyAgICAgICAgaWYgKChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHx8IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykpKSB7DQorICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgb25lU3RyaW5nKTsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCB0d29TdHJpbmcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgICAgIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVGhyZWUsIHRocmVlU3RyaW5nKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlTcmNMZW4gPSBvbmVTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgICBGWF9JTlQzMiBpRmluZExlbiA9IHR3b1N0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRTdHJpbmc7DQorICAgICAgICBGWF9JTlQzMiBpRmluZEluZGV4ID0gMDsNCisgICAgICAgIEZYX0JZVEUgY2ggPSAwOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB1ID0gMDsgdSA8IGlTcmNMZW47ICsrdSkgew0KKyAgICAgICAgICAgIGNoID0gb25lU3RyaW5nLkdldEF0KHUpOw0KKyAgICAgICAgICAgIGlmIChjaCA9PSB0d29TdHJpbmcuR2V0QXQoaUZpbmRJbmRleCkpIHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVRlbXAgPSB1ICsgMTsNCisgICAgICAgICAgICAgICAgKytpRmluZEluZGV4Ow0KKyAgICAgICAgICAgICAgICBGWF9CWVRFIGNoVGVtcCA9IDA7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpRmluZEluZGV4IDwgaUZpbmRMZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGNoVGVtcCA9IG9uZVN0cmluZy5HZXRBdChpVGVtcCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2hUZW1wID09IHR3b1N0cmluZy5HZXRBdChpRmluZEluZGV4KSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraVRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgKytpRmluZEluZGV4Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpRmluZEluZGV4ID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaUZpbmRJbmRleCA9PSBpRmluZExlbikgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3RyaW5nIDw8IHRocmVlU3RyaW5nOw0KKyAgICAgICAgICAgICAgICAgICAgdSArPSBpRmluZExlbiAtIDE7DQorICAgICAgICAgICAgICAgICAgICBpRmluZEluZGV4ID0gMDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcigwKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgICAgIGlmKGFyZ2MgPT0gMykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiUmVwbGFjZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSaWdodChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhfQk9PTCBhcmdJc051bGwgPSBGQUxTRTsNCisgICAgICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KKyAgICAgICAgICAgIGFyZ0lzTnVsbCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnSXNOdWxsKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBjb3VudCA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgYXJnVHdvKTsNCisgICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7DQorICAgICAgICAgICAgICAgIGNvdW50ID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZy5SaWdodChjb3VudCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlJpZ2h0IikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJ0cmltKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgICAgICAgc291cmNlU3RyaW5nLlRyaW1SaWdodCgpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzb3VyY2VTdHJpbmcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlJ0cmltIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlNwYWNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBjb3VudCA9IDA7DQorICAgICAgICAgICAgY291bnQgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgICAgICAgY291bnQgPSAoY291bnQgPCAwKSA/IDAgOiBjb3VudDsNCisgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYgc3BhY2VTdHJpbmc7DQorICAgICAgICAgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNvdW50KSB7DQorICAgICAgICAgICAgICAgIHNwYWNlU3RyaW5nLkFwcGVuZEJ5dGUoJyAnKTsNCisgICAgICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3BhY2VTdHJpbmcuQXBwZW5kQnl0ZSgwKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3BhY2VTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJTcGFjZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdHIoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgICAgICBGWF9GTE9BVCBmTnVtYmVyOw0KKyAgICAgICAgRlhfSU5UMzIgaVdpZHRoID0gMTA7DQorICAgICAgICBGWF9JTlQzMiBpUHJlY2lzaW9uID0gMDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBudW1iZXJWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgd2lkdGhWYWx1ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJlY2lzaW9uVmFsdWUgPSAwOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKG51bWJlclZhbHVlKSkgew0KKyAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZOdW1iZXIgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBudW1iZXJWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBpZihhcmdjID4gMSkgew0KKyAgICAgICAgICAgIHdpZHRoVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIGlXaWR0aCA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCB3aWR0aFZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgICAgICBwcmVjaXNpb25WYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICAgICAgaVByZWNpc2lvbiA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCBwcmVjaXNpb25WYWx1ZSk7DQorICAgICAgICAgICAgaWYgKGlQcmVjaXNpb24gPCAwKSB7DQorICAgICAgICAgICAgICAgIGlQcmVjaXNpb24gPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbnVtYmVyU3RyaW5nOw0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0ciA9ICIlIjsNCisgICAgICAgICAgICBpZiAoaVByZWNpc2lvbikgew0KKyAgICAgICAgICAgICAgICBmb3JtYXRTdHIgKz0gIi4iOw0KKyAgICAgICAgICAgICAgICBmb3JtYXRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaVByZWNpc2lvbik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcm1hdFN0ciArPSAiZiI7DQorICAgICAgICAgICAgbnVtYmVyU3RyaW5nLkZvcm1hdChmb3JtYXRTdHIsIGZOdW1iZXIpOw0KKyAgICAgICAgICAgIEZYX0xQQ1NUUiBwRGF0YSA9IG51bWJlclN0cmluZzsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gbnVtYmVyU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIHUgPSAwOw0KKyAgICAgICAgICAgIHdoaWxlICh1IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBpZiAoKihwRGF0YSArIHUpID09ICcuJykgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgKyt1Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgICAgICAgIGlmICh1ID4gaVdpZHRoIHx8IChpUHJlY2lzaW9uICsgdSkgPj0gaVdpZHRoKSB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGlXaWR0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyonKTsNCisgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAodSA9PSBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaUxlbmd0aCA+IGlXaWR0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaVdpZHRoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcqJyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlTcGFjZSA9IGlXaWR0aCAtIGlMZW5ndGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpU3BhY2UpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyAnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYgPDwgcERhdGE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGVhdmluZ1NwYWNlID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpUHJlY2lzaW9uID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpTGVhdmluZ1NwYWNlID0gaVdpZHRoIC0gKHUgKyBpUHJlY2lzaW9uKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUxlYXZpbmdTcGFjZSA9IGlXaWR0aCAtICh1ICsgaVByZWNpc2lvbiArIDEpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGlMZWF2aW5nU3BhY2UpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignICcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGkgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCB1KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoKihwRGF0YSArIGkpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVByZWNpc2lvbiAhPSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJy4nKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHUrKzsNCisgICAgICAgICAgICAgICAgICAgIGkgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHUgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaVByZWNpc2lvbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoKihwRGF0YSArIHUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICAgICAgKyt1Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpUHJlY2lzaW9uKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJzAnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobnVtYmVyVmFsdWUpOw0KKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh3aWR0aFZhbHVlKTsNCisgICAgICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJlY2lzaW9uVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlN0ciIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdHVmZihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKChhcmdjID09IDMpIHx8IChhcmdjID09IDQpKSB7DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaW5zZXJ0U3RyaW5nOw0KKyAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpU3RhcnQgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaURlbGV0ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgc291cmNlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGRlbGV0ZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBpbnNlcnRWYWx1ZSA9IDA7DQorICAgICAgICBpZiAoKEZYSlNFX1ZhbHVlX0lzTnVsbChzb3VyY2VWYWx1ZSkpIHx8IChGWEpTRV9WYWx1ZV9Jc051bGwoc3RhcnRWYWx1ZSkpIHx8IChGWEpTRV9WYWx1ZV9Jc051bGwoZGVsZXRlVmFsdWUpKSkgew0KKyAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzb3VyY2VWYWx1ZSwgc291cmNlU3RyaW5nKTsNCisgICAgICAgICAgICBpTGVuZ3RoID0gc291cmNlU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIGlTdGFydCA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCBzdGFydFZhbHVlKTsNCisgICAgICAgICAgICBpZiAoaVN0YXJ0IDwgMSkgew0KKyAgICAgICAgICAgICAgICBpU3RhcnQgPSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaVN0YXJ0ID4gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTGVuZ3RoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpRGVsZXRlID0gKEZYX0lOVDMyKUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGRlbGV0ZVZhbHVlKTsNCisgICAgICAgICAgICBpZiAoaURlbGV0ZSA8PSAwKSB7DQorICAgICAgICAgICAgICAgIGlEZWxldGUgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdjID09IDQpIHsNCisgICAgICAgICAgICBpbnNlcnRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGluc2VydFZhbHVlLCBpbnNlcnRTdHJpbmcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVN0YXJ0IC09IDE7DQorICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0U3RyaW5nOw0KKyAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICB3aGlsZSAoaSA8IGlTdGFydCkgew0KKyAgICAgICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKHNvdXJjZVN0cmluZy5HZXRBdChpKSk7DQorICAgICAgICAgICAgKytpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0U3RyaW5nIDw8IGluc2VydFN0cmluZzsNCisgICAgICAgIGkgPSBpU3RhcnQgKyBpRGVsZXRlOw0KKyAgICAgICAgd2hpbGUgKGkgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoc291cmNlU3RyaW5nLkdldEF0KGkpKTsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcigwKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc291cmNlVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzdGFydFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGVsZXRlVmFsdWUpOw0KKyAgICAgICAgaWYgKGFyZ2MgPT0gNCkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaW5zZXJ0VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiU3R1ZmYiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6U3Vic3RyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZihhcmdjID09IDMpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBzdHJpbmdWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgc3RhcnRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgZW5kVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgc3RyaW5nVmFsdWUpIHx8IChIVmFsdWVJc051bGwoaFRoaXMsIHN0YXJ0VmFsdWUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBlbmRWYWx1ZSkpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelNvdXJjZVN0cjsNCisgICAgICAgICAgICBGWF9JTlQzMiBpU3RhcnQgPSAwOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHN0cmluZ1ZhbHVlLCBzelNvdXJjZVN0cik7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHN6U291cmNlU3RyLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaVN0YXJ0ID0gKEZYX0lOVDMyKUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHN0YXJ0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpQ291bnQgPSAoRlhfSU5UMzIpSFZhbHVlVG9GbG9hdChoVGhpcywgZW5kVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoaVN0YXJ0IDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaVN0YXJ0ID4gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaUxlbmd0aDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaUNvdW50IDw9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGlDb3VudCA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaVN0YXJ0IC09IDE7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelNvdXJjZVN0ci5NaWQoaVN0YXJ0LCBpQ291bnQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHN0cmluZ1ZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc3RhcnRWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGVuZFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIlN1YnN0ciIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVdWlkKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZigoYXJnYyA9PSAwKSB8fCAoYXJnYyA9PSAxKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaU51bSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gMDsNCisgICAgICAgIGlmKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgICAgIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICAgICAgaU51bSA9IChGWF9JTlQzMilIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfR1VJRCBndWlkOw0KKyAgICAgICAgRlhfR1VJRF9DcmVhdGVWNCgmZ3VpZCk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VJZDsNCisgICAgICAgIEZYX0dVSURfVG9TdHJpbmcoJmd1aWQsIGJzVUlkLCBpTnVtKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBic1VJZCk7DQorICAgICAgICBpZihhcmdjID09IDEpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJVdWlkIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlVwcGVyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDMpKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBsb2NhbGVWYWx1ZSA9IDA7DQorICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmKGFyZ2MgPT0gMikgew0KKyAgICAgICAgICAgICAgICBsb2NhbGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIGFyZ1N0cmluZyk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVUZXh0QnVmIHVwcGVyU3RyaW5nQnVmOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICBGWF9MUENXU1RSIHBEYXRhID0gd3NBcmdTdHJpbmc7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbiA9IHdzQXJnU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGNoID0gMDsNCisgICAgICAgICAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCisgICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoIC09IDMyOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4RTAgJiYgY2ggPD0gMHhGRSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2ggLT0gMzI7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMHgxMDEgfHwgY2ggPT0gMHgxMDMgfHwgY2ggPT0gMHgxMDUpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoIC09IDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdXBwZXJTdHJpbmdCdWYuQXBwZW5kQ2hhcihjaCk7DQorICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdXBwZXJTdHJpbmdCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfVVRGOEVuY29kZSh1cHBlclN0cmluZ0J1Zi5HZXRCdWZmZXIoKSwgdXBwZXJTdHJpbmdCdWYuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgICAgICBpZihhcmdjID09IDIpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbGVWYWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiVXBwZXIiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V29yZE51bShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgICAgIEZYX0ZMT0FUIGZOdW1iZXI7DQorICAgICAgICBGWF9JTlQzMiBpSWRlbnRpZmllciA9IDA7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBsb2NhbGVTdHJpbmc7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbnVtYmVyVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGlkZW50aWZpZXJWYWx1ZSA9IDA7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxlVmFsdWUgPSAwOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKG51bWJlclZhbHVlKSkgew0KKyAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZOdW1iZXIgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBudW1iZXJWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBpZihhcmdjID4gMSkgew0KKyAgICAgICAgICAgIGlkZW50aWZpZXJWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChpZGVudGlmaWVyVmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUlkZW50aWZpZXIgPSAoRlhfSU5UMzIpSFZhbHVlVG9GbG9hdChoVGhpcywgaWRlbnRpZmllclZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICAgICAgbG9jYWxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxlVmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsZVZhbHVlLCBsb2NhbGVTdHJpbmcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgICAgaWYgKChmTnVtYmVyIDwgMCkgfHwgKGZOdW1iZXIgPiA5MjIzMzcyMDM2ODU0Nzc1NTApKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiKiIpKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBudW1iZXJTdHJpbmc7DQorICAgICAgICAgICAgICAgIG51bWJlclN0cmluZy5Gb3JtYXQoIiUuMmYiLCBmTnVtYmVyKTsNCisgICAgICAgICAgICAgICAgV29yZFVTKG51bWJlclN0cmluZywgaUlkZW50aWZpZXIsIHJlc3VsdEJ1Zik7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobnVtYmVyVmFsdWUpOw0KKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShpZGVudGlmaWVyVmFsdWUpOw0KKyAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbGVWYWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiV29yZE51bSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUcmlsbGlvblVTKEZYX0JTVFIgc3pEYXRhLCBDRlhfQnl0ZVRleHRCdWYgJnN0ckJ1ZikNCit7DQorICAgIENGWF9CeXRlU3RyaW5nQyBwVW5pdHNbXSA9ICAgIHsgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsCSJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUifTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDIHBDYXBVbml0c1tdCT0geyAiWmVybyIsICJPbmUiLCAiVHdvIiwgIlRocmVlIiwJIkZvdXIiLCAiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLCAiRWlnaHQiLCAiTmluZSJ9Ow0KKyAgICBDRlhfQnl0ZVN0cmluZ0MgcFRlbnNbXQkJPSB7IlRlbiIsCQkiRWxldmVuIiwJIlR3ZWx2ZSIsCSJUaGlydGVlbiIsCSJGb3VydGVlbiIsCSJGaWZ0ZWVuIiwJIlNpeHRlZW4iLAkiU2V2ZW50ZWVuIiwJIkVpZ2h0ZWVuIiwJIk5pbmV0ZWVuIn07DQorICAgIENGWF9CeXRlU3RyaW5nQyBwTGFzdFRlbnNbXQk9IHsiVHdlbnR5IiwJIlRoaXJ0eSIsCSJGb3J0eSIsCSJGaWZ0eSIsCSJTaXh0eSIsCSJTZXZlbnR5IiwJIkVpZ2h0eSIsCSJOaW5ldHkifTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDIHBDb21tW10JCT0geyIgSHVuZHJlZCAiLCAiIFRob3VzYW5kICIsCSIgTWlsbGlvbiAiLCAiIEJpbGxpb24gIiwgIlRyaWxsaW9uIn07DQorICAgIEZYX0lOVDMyIGlDb21tID0gMDsNCisgICAgRlhfTFBDU1RSIHBEYXRhID0gc3pEYXRhLkdldENTdHIoKTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHN6RGF0YS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPiAxMikgew0KKyAgICAgICAgaUNvbW0gPSA0Ow0KKyAgICB9IGVsc2UgaWYgKGlMZW5ndGggPiA5KSB7DQorICAgICAgICBpQ29tbSA9IDM7DQorICAgIH0gZWxzZSBpZiAoaUxlbmd0aCA+IDYpIHsNCisgICAgICAgIGlDb21tID0gMjsNCisgICAgfSBlbHNlIGlmIChpTGVuZ3RoID4gMykgew0KKyAgICAgICAgaUNvbW0gPSAxOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIEZYX0lOVDMyIGlGaXJzdENvdW50ID0gaUxlbmd0aCAlIDM7DQorICAgIGlmIChpRmlyc3RDb3VudCA9PSAwKSB7DQorICAgICAgICBpRmlyc3RDb3VudCA9IDM7DQorICAgIH0NCisgICAgaWYgKGlGaXJzdENvdW50ID09IDMpIHsNCisgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSAhPSAnMCcpIHsNCisgICAgICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXgpIC0gJzAnXTsNCisgICAgICAgICAgICBzdHJCdWYgPDwgcENvbW1bMF07DQorICAgICAgICB9DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID09ICcwJykgew0KKyAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICcxJykgew0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcExhc3RUZW5zWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcyJ107DQorICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiLSIpOw0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgICAgICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzEnKSB7DQorICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID09ICcwJykgew0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaUluZGV4ICs9IDM7DQorICAgIH0gZWxzZSBpZiAoaUZpcnN0Q291bnQgPT0gMikgew0KKyAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICcwJykgew0KKyAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDEpIC0gJzAnXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID4gJzEnKSB7DQorICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwTGFzdFRlbnNbKihwRGF0YSArIGlJbmRleCkgLSAnMiddOw0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIi0iKTsNCisgICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJzEnKSB7DQorICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJzAnKSB7DQorICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDEpIC0gJzAnXTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpSW5kZXggKz0gMjsNCisgICAgfSBlbHNlIGlmIChpRmlyc3RDb3VudCA9PSAxKSB7DQorICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXgpIC0gJzAnXTsNCisgICAgICAgIGlJbmRleCArPSAxOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID4gMyAmJiBpRmlyc3RDb3VudCA+IDApIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwQ29tbVtpQ29tbV07DQorICAgICAgICAtLWlDb21tOw0KKyAgICB9DQorICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJzAnKSB7DQorICAgICAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4KSAtICcwJ107DQorICAgICAgICAgICAgc3RyQnVmIDw8IHBDb21tWzBdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMCcpIHsNCisgICAgICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnMScpIHsNCisgICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMiddOw0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIi0iKTsNCisgICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID09ICcxJykgew0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcFRlbnNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMCcpIHsNCisgICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpSW5kZXggPCBpTGVuZ3RoIC0gMykgew0KKyAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ29tbVtpQ29tbV07DQorICAgICAgICAgICAgLS1pQ29tbTsNCisgICAgICAgIH0NCisgICAgICAgIGlJbmRleCArPSAzOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OldvcmRVUyhGWF9CU1RSIHN6RGF0YSwgRlhfSU5UMzIgaVN0eWxlLCBDRlhfQnl0ZVRleHRCdWYgJnN0ckJ1ZikNCit7DQorICAgIEZYX0xQQ1NUUiBwRGF0YSA9IHN6RGF0YS5HZXRDU3RyKCk7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBzekRhdGEuR2V0TGVuZ3RoKCk7DQorICAgIHN3aXRjaCAoaVN0eWxlKSB7DQorICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUluZGV4ID0gMDsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnLicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICsraUluZGV4Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlMZW5ndGggPSBpSW5kZXg7DQorICAgICAgICAgICAgICAgIGlJbmRleCA9IDA7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAoaUxlbmd0aCAtIGlJbmRleCkgJSAxMjsNCisgICAgICAgICAgICAgICAgICAgIGlmICghaUNvdW50ICYmIGlMZW5ndGggLSBpSW5kZXggPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gMTI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBUcmlsbGlvblVTKENGWF9CeXRlU3RyaW5nQyhwRGF0YSArIGlJbmRleCwgaUNvdW50KSwgc3RyQnVmKTsNCisgICAgICAgICAgICAgICAgICAgIGlJbmRleCArPSBpQ291bnQ7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIFRyaWxsaW9uICIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOiB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICArK2lJbmRleDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpTGVuZ3RoID0gaUluZGV4Ow0KKyAgICAgICAgICAgICAgICBpSW5kZXggPSAwOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gKGlMZW5ndGggLSBpSW5kZXgpICUgMTI7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCA9IDEyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7DQorICAgICAgICAgICAgICAgICAgICBpSW5kZXggKz0gaUNvdW50Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBUcmlsbGlvbiAiKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBEb2xsYXJzIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOiB7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICArK2lJbmRleDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpSW50ZWdlciA9IGlJbmRleDsNCisgICAgICAgICAgICAgICAgaUluZGV4ID0gMDsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlJbnRlZ2VyKSB7DQorICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAoaUludGVnZXIgLSBpSW5kZXgpICUgMTI7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCA9IDEyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7DQorICAgICAgICAgICAgICAgICAgICBpSW5kZXggKz0gaUNvdW50Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlJbmRleCA8IGlJbnRlZ2VyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgVHJpbGxpb24gIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgRG9sbGFycyIpOw0KKyAgICAgICAgICAgICAgICBpZiAoaUludGVnZXIgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBBbmQgIik7DQorICAgICAgICAgICAgICAgICAgICBpSW5kZXggPSBpSW50ZWdlciArIDE7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAoaUxlbmd0aCAtIGlJbmRleCkgJSAxMjsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAxMjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4ICs9IGlDb3VudDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBUcmlsbGlvbiAiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBDZW50cyIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAxKSB7DQorICAgICAgICBDWEZBX0RvY3VtZW50ICpwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgICAgICBpZighcERvYykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBEb2MtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgICAgIGlmKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHVybFN0cmluZzsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHVybFN0cmluZyk7DQorICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gcEFwcFByb3ZpZGVyLT5Eb3dubG9hZFVSTChDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXJsU3RyaW5nLCB1cmxTdHJpbmcuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgIGlmIChwRmlsZSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIHNpemUgPSBwRmlsZS0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgIEZYX0xQQllURSBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIHNpemUpOw0KKyAgICAgICAgICAgIGlmKHBEYXRhKSB7DQorICAgICAgICAgICAgICAgIHBGaWxlLT5SZWFkQmxvY2socERhdGEsIHNpemUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhLCBzaXplKSk7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocERhdGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwRmlsZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkdldCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQb3N0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYoKGFyZ2MgPj0gMikgJiYgKGFyZ2MgPD0gNSkpIHsNCisgICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgICAgIGlmKCFwRG9jKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gcERvYy0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgICAgaWYoIXBBcHBQcm92aWRlcikgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDb250ZW50VHlwZTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RlOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIZWFkZXI7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3bzsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGb3VyOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpdmU7DQorICAgICAgICBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYnNVUkwpOw0KKyAgICAgICAgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIGJzRGF0YSk7DQorICAgICAgICBpZihhcmdjID4gMikgew0KKyAgICAgICAgICAgIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVGhyZWUsIGJzQ29udGVudFR5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYXJnYyA+IDMpIHsNCisgICAgICAgICAgICBhcmdGb3VyID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAzKTsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnRm91ciwgYnNFbmNvZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYXJnYyA+IDQpIHsNCisgICAgICAgICAgICBhcmdGaXZlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCA0KTsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnRml2ZSwgYnNIZWFkZXIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVjb2RlZFJlc3BvbnNlOw0KKyAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBwQXBwUHJvdmlkZXItPlBvc3RSZXF1ZXN0VVJMKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1VSTCwgYnNVUkwuR2V0TGVuZ3RoKCkpLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNEYXRhLCBic0RhdGEuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNDb250ZW50VHlwZSwgYnNDb250ZW50VHlwZS5HZXRMZW5ndGgoKSksIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0VuY29kZSwgYnNFbmNvZGUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNIZWFkZXIsIGJzSGVhZGVyLkdldExlbmd0aCgpKSwgZGVjb2RlZFJlc3BvbnNlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgICAgIGlmKGFyZ2MgPiAyKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgICAgICB9DQorICAgICAgICBpZihhcmdjID4gMykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRm91cik7DQorICAgICAgICB9DQorICAgICAgICBpZihhcmdjID4gNCkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQorICAgICAgICB9DQorICAgICAgICBpZihiRmxhZ3MpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfVVRGOEVuY29kZShkZWNvZGVkUmVzcG9uc2UsIGRlY29kZWRSZXNwb25zZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19TRVJWRVJfREVOWSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiUG9zdCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQdXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZigoYXJnYyA9PSAyKSB8fCAoYXJnYyA9PSAzKSkgew0KKyAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICAgICAgaWYoIXBEb2MpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBwRG9jLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgICBpZighcEFwcFByb3ZpZGVyKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkw7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RhdGE7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmU7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlOw0KKyAgICAgICAgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIGJzVVJMKTsNCisgICAgICAgIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBic0RhdGEpOw0KKyAgICAgICAgaWYoYXJnYyA+IDIpIHsNCisgICAgICAgICAgICBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLCBic0VuY29kZSk7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJGbGFncyA9IHBBcHBQcm92aWRlci0+UHV0UmVxdWVzdFVSTChDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwsIGJzVVJMLkdldExlbmd0aCgpKSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRGF0YSwgYnNEYXRhLkdldExlbmd0aCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRW5jb2RlLCBic0VuY29kZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICAgICAgaWYoYXJnYyA+IDIpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGJGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19TRVJWRVJfREVOWSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiUHV0IikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmFzc2lnbl92YWx1ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDIgKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbFZhbHVlID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSByVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgRlhfQk9PTCBiU2V0U3RhdHVzID0gVFJVRTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGxWYWx1ZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVmdExlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGxWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZWZ0TGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMZWZ0TGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlZnRMZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZWZ0TGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGxWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlZnRMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGxWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBiU2V0U3RhdHVzID0gU2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIHJWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWJTZXRTdGF0dXMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19OT1RfREVGQVVMX1ZBTFVFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlZnRMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGxWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCByVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QobFZhbHVlKSkgew0KKyAgICAgICAgICAgIGJTZXRTdGF0dXMgPSBTZXRPYmplY3REZWZhdWx0VmFsdWUobFZhbHVlLCByVmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghYlNldFN0YXR1cykgew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19OT1RfREVGQVVMX1ZBTFVFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfb3Jfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZpcnN0ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIHNlY29uZCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCB8fCBzZWNvbmQpID8gMSA6IDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX2FuZF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZmlyc3QgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICAgICAgRlhfRkxPQVQgc2Vjb25kID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0ICYmIHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgICAgIGlmIChmbV9yZWZfZXF1YWwoaFRoaXMsIGFyZ3MpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDEpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgPyAxIDogMCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdTZWNvbmQpKSB7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdGaXJzdCwgZmlyc3RPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3RPdXRwdXQuRXF1YWwoc2Vjb25kT3V0cHV0KSA/IDEgOiAwKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPT0gc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bm90ZXF1YWxpdHlfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICAgICAgaWYgKGZtX3JlZl9lcXVhbChoVGhpcywgYXJncykpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSA/IDAgOiAxKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlyc3RPdXRwdXQ7DQorICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdTZWNvbmQsIHNlY29uZE91dHB1dCk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdE91dHB1dC5FcXVhbChzZWNvbmRPdXRwdXQpID8gMCA6IDEpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA9PSBzZWNvbmQpID8gMCA6IDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpmbV9yZWZfZXF1YWwoRlhKU0VfSE9CSkVDVCBoVGhpcywgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGZpcnN0RmxhZ1ZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBzZWNvbmRGbGFnVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0ZpcnN0LCAwLCBmaXJzdEZsYWdWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnU2Vjb25kLCAwLCBzZWNvbmRGbGFnVmFsdWUpOw0KKyAgICAgICAgaWYgKChGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoZmlyc3RGbGFnVmFsdWUpID09IDMpICYmIChGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoc2Vjb25kRmxhZ1ZhbHVlKSA9PSAzKSkgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBmaXJzdEpTT2JqZWN0ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgc2Vjb25kSlNPYmplY3QgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdGaXJzdCwgMiwgZmlyc3RKU09iamVjdCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1NlY29uZCwgMiwgc2Vjb25kSlNPYmplY3QpOw0KKyAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKGZpcnN0SlNPYmplY3QpICYmICFGWEpTRV9WYWx1ZV9Jc051bGwoc2Vjb25kSlNPYmplY3QpKSB7DQorICAgICAgICAgICAgICAgIGJSZXQgPSAoRlhKU0VfVmFsdWVfVG9PYmplY3QoZmlyc3RKU09iamVjdCwgTlVMTCkgPT0gRlhKU0VfVmFsdWVfVG9PYmplY3Qoc2Vjb25kSlNPYmplY3QsIE5VTEwpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmaXJzdEpTT2JqZWN0KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNlY29uZEpTT2JqZWN0KTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZmlyc3RGbGFnVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzZWNvbmRGbGFnVmFsdWUpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICAgIHJldHVybiBiUmV0Ow0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdTZWNvbmQpKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlyc3RPdXRwdXQ7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdGaXJzdCwgZmlyc3RPdXRwdXQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdTZWNvbmQsIHNlY29uZE91dHB1dCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdE91dHB1dC5Db21wYXJlKHNlY29uZE91dHB1dCkgPT0gLTEpID8gMSA6IDApOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSAgSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA8IHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Omxlc3NlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgPyAxIDogMCk7DQorICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdE91dHB1dDsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ1NlY29uZCwgc2Vjb25kT3V0cHV0KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSAhPSAxKSA/IDEgOiAwKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPD0gc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcl9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCisgICAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3RPdXRwdXQuQ29tcGFyZShzZWNvbmRPdXRwdXQpID09IDEpID8gMSA6IDApOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSAgSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA+IHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgPyAxIDogMCk7DQorICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdE91dHB1dDsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ1NlY29uZCwgc2Vjb25kT3V0cHV0KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSAhPSAtMSkgPyAxIDogMCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9ICBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0ID49IHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OnBsdXNfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBhcmdzLkdldFZhbHVlKDEpOw0KKyAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRmlyc3QpICYmIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnU2Vjb25kKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGZpcnN0ICsgc2Vjb25kKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bWludXNfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9ICBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCAtIHNlY29uZCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om11bHRpcGxlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSAgSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3QgKiBzZWNvbmQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpkaXZpZGVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSAgSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICAgICAgaWYgKHNlY29uZCA9PSAwLjApIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfRElWSURFX1pFUk8pOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGZpcnN0IC8gc2Vjb25kKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIDAuMCArIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om5lZ2F0aXZlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMC4wIC0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9ub3Rfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0ID09IDAuMCkgPyAxIDogMCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpkb3RfYWNjZXNzb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmKChhcmdjID09IDQpIHx8IChhcmdjID09IDUpKSB7DQorICAgICAgICBGWF9CT09MIGJJc1N0YXIgPSBUUlVFOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0FjY2Vzc29yID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQWNjZXNzb3JOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICAgICAgRlhfSU5UMzIgaUluZGV4RmxhZ3MgPSBhcmdzLkdldEludDMyKDMpOw0KKyAgICAgICAgRlhfSU5UMzIgaUluZGV4VmFsdWUgPSAwOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0luZGV4ID0gTlVMTDsNCisgICAgICAgIGlmKGFyZ2MgPT0gNSkgew0KKyAgICAgICAgICAgIGJJc1N0YXIgPSBGQUxTRTsNCisgICAgICAgICAgICBhcmdJbmRleCA9IGFyZ3MuR2V0VmFsdWUoNCk7DQorICAgICAgICAgICAgaUluZGV4VmFsdWUgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIGFyZ0luZGV4KTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6U29tRXhwOw0KKyAgICAgICAgR2VuZXJhdGVTb21FeHByZXNzaW9uKHN6TmFtZSwgaUluZGV4RmxhZ3MsIGlJbmRleFZhbHVlLCBiSXNTdGFyLCBzelNvbUV4cCk7DQorICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ0FjY2Vzc29yKSkgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoTGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnQWNjZXNzb3IsIEZYX0JTVFJDKCJsZW5ndGgiKSwgaExlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhMZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoTGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudGVyID0gMDsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgKipoUmVzb2x2ZVZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSosIGlMZW5ndGggLSAyKTsNCisgICAgICAgICAgICBGWF9JTlQzMiAqaVNpemVzID0gRlhfQWxsb2MoRlhfSU5UMzIsIGlMZW5ndGggLSAyKTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgKGlMZW5ndGggLSAyKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGlTaXplc1tpXSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoSlNPYmpWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdBY2Nlc3NvciwgaSwgaEpTT2JqVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGhKU09ialZhbHVlLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBUUlVFLCBzek5hbWUuSXNFbXB0eSgpKTsNCisgICAgICAgICAgICAgICAgaWYoaVJldCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIFBhcnNlUmVzb2x2ZVJlc3VsdChoVGhpcywgcmVzb3ZlTm9kZVJTLCBoSlNPYmpWYWx1ZSwgaFJlc29sdmVWYWx1ZXNbaSAtIDJdLCBpU2l6ZXNbaSAtIDJdLCBiQXR0cmlidXRlKTsNCisgICAgICAgICAgICAgICAgICAgIGlDb3VudGVyICs9IGlTaXplc1tpIC0gMl07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoSlNPYmpWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKGlDb3VudGVyID4gMCkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgKnJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpQ291bnRlciArIDIpOw0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMSk7DQorICAgICAgICAgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHJnVmFsdWVzWzFdLCBzek5hbWUpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUluZGV4ID0gMjsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxlbmd0aCAtIDI7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgaVNpemVzW2ldOyBqKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaUluZGV4XSwgaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlJbmRleCsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGlDb3VudGVyICsgMiksIHJnVmFsdWVzKTsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgKGlDb3VudGVyICsgMik7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfRnJlZShyZ1ZhbHVlcyk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wZXJ0eU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAsIHN6U29tRXhwLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQUNDRVNTX1BST1BFUlRZX0lOX05PVF9PQkpFQ1QsIChGWF9MUENXU1RSKXdzUHJvcGVydHlOYW1lLCAoRlhfTFBDV1NUUil3c1NvbUV4cHJlc3Npb24pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuZ3RoIC0gMjsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBqID0gMDsgaiA8IGlTaXplc1tpXTsgaisrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXNvbHZlVmFsdWVzW2ldW2pdKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaVNpemVzW2ldID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlcyk7DQorICAgICAgICAgICAgRlhfRnJlZShpU2l6ZXMpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlSZXQgPSAwOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgfHwgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdBY2Nlc3NvcikgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBUUlVFLCBzek5hbWUuSXNFbXB0eSgpKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgJiYgIWJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJHZXRPYmplY3QgPSBHZXRPYmplY3RCeU5hbWUoaFRoaXMsIGFyZ0FjY2Vzc29yLCBic0FjY2Vzc29yTmFtZSk7DQorICAgICAgICAgICAgICAgIGlmIChiR2V0T2JqZWN0KSB7DQorICAgICAgICAgICAgICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBUUlVFLCBzek5hbWUuSXNFbXB0eSgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihpUmV0ID4gMCkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgKmhSZXNvbHZlVmFsdWVzOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IDA7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgYXJnQWNjZXNzb3IsIGhSZXNvbHZlVmFsdWVzLCBpU2l6ZSwgYkF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSAqcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplICsgMik7DQorICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IChpU2l6ZSArIDIpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAxKTsNCisgICAgICAgICAgICAgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocmdWYWx1ZXNbMV0sIHN6TmFtZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaSArIDJdLCBoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaVNpemUgKyAyKSwgcmdWYWx1ZXMpOw0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKHJnVmFsdWVzKTsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlcyk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wZXJ0eU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAsIHN6U29tRXhwLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQUNDRVNTX1BST1BFUlRZX0lOX05PVF9PQkpFQ1QsIChGWF9MUENXU1RSKXdzUHJvcGVydHlOYW1lLCAoRlhfTFBDV1NUUil3c1NvbUV4cHJlc3Npb24pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKGFyZ2MgPT0gNSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdBY2Nlc3Nvcik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6ZG90ZG90X2FjY2Vzc29yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZigoYXJnYyA9PSA0KSB8fCAoYXJnYyA9PSA1KSkgew0KKyAgICAgICAgRlhfQk9PTCBiSXNTdGFyID0gVFJVRTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdBY2Nlc3NvciA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygyKTsNCisgICAgICAgIEZYX0lOVDMyIGlJbmRleEZsYWdzID0gYXJncy5HZXRJbnQzMigzKTsNCisgICAgICAgIEZYX0lOVDMyIGlJbmRleFZhbHVlID0gMDsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleCA9IE5VTEw7DQorICAgICAgICBpZihhcmdjID09IDUpIHsNCisgICAgICAgICAgICBiSXNTdGFyID0gRkFMU0U7DQorICAgICAgICAgICAgYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKDQpOw0KKyAgICAgICAgICAgIGlJbmRleFZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdJbmRleCk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelNvbUV4cDsNCisgICAgICAgIEdlbmVyYXRlU29tRXhwcmVzc2lvbihzek5hbWUsIGlJbmRleEZsYWdzLCBpSW5kZXhWYWx1ZSwgYklzU3Rhciwgc3pTb21FeHApOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdBY2Nlc3NvcikpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaExlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0FjY2Vzc29yLCBGWF9CU1RSQygibGVuZ3RoIiksIGhMZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoTGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlDb3VudGVyID0gMDsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgKipoUmVzb2x2ZVZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSosIGlMZW5ndGggLSAyKTsNCisgICAgICAgICAgICBGWF9JTlQzMiAqaVNpemVzID0gRlhfQWxsb2MoRlhfSU5UMzIsIGlMZW5ndGggLSAyKTsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaEpTT2JqVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnQWNjZXNzb3IsIGksIGhKU09ialZhbHVlKTsNCisgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBoSlNPYmpWYWx1ZSwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBpZihpUmV0ID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgUGFyc2VSZXNvbHZlUmVzdWx0KGhUaGlzLCByZXNvdmVOb2RlUlMsIGhKU09ialZhbHVlLCBoUmVzb2x2ZVZhbHVlc1tpIC0gMl0sIGlTaXplc1tpIC0gMl0sIGJBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgICAgICAgICAgaUNvdW50ZXIgKz0gaVNpemVzW2kgLSAyXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhKU09ialZhbHVlKTsNCisgICAgICAgICAgICBpZiAoaUNvdW50ZXIgPiAwKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSAqcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlDb3VudGVyICsgMik7DQorICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IChpQ291bnRlciArIDIpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAxKTsNCisgICAgICAgICAgICAgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocmdWYWx1ZXNbMV0sIHN6TmFtZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSAyOw0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuZ3RoIC0gMjsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1tpSW5kZXhdLCBoUmVzb2x2ZVZhbHVlc1tpXVtqXSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4Kys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaUNvdW50ZXIgKyAyKSwgcmdWYWx1ZXMpOw0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKHJnVmFsdWVzKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BlcnR5TmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cCwgc3pTb21FeHAuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BQ0NFU1NfUFJPUEVSVFlfSU5fTk9UX09CSkVDVCwgKEZYX0xQQ1dTVFIpd3NQcm9wZXJ0eU5hbWUsIChGWF9MUENXU1RSKXdzU29tRXhwcmVzc2lvbik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGogPSAwOyBqIDwgaVNpemVzW2ldOyBqKyspIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9GcmVlKGhSZXNvbHZlVmFsdWVzKTsNCisgICAgICAgICAgICBGWF9GcmVlKGlTaXplcyk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoTGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlSZXQgPSAwOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgfHwgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdBY2Nlc3NvcikgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBGQUxTRSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmICghRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnQWNjZXNzb3IpICYmICFic0FjY2Vzc29yTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiR2V0T2JqZWN0ID0gR2V0T2JqZWN0QnlOYW1lKGhUaGlzLCBhcmdBY2Nlc3NvciwgYnNBY2Nlc3Nvck5hbWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoYkdldE9iamVjdCkgew0KKyAgICAgICAgICAgICAgICAgICAgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBhcmdBY2Nlc3Nvciwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGlSZXQgPiAwKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSAqaFJlc29sdmVWYWx1ZXM7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlTaXplID0gMDsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIFBhcnNlUmVzb2x2ZVJlc3VsdChoVGhpcywgcmVzb3ZlTm9kZVJTLCBhcmdBY2Nlc3NvciwgaFJlc29sdmVWYWx1ZXMsIGlTaXplLCBiQXR0cmlidXRlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFICpyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaVNpemUgKyAyKTsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgKGlTaXplICsgMik7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgcmdWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDEpOw0KKyAgICAgICAgICAgICAgICBpZiAoYkF0dHJpYnV0ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhyZ1ZhbHVlc1sxXSwgc3pOYW1lKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1tpICsgMl0sIGhSZXNvbHZlVmFsdWVzW2ldKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIChpU2l6ZSArIDIpLCByZ1ZhbHVlcyk7DQorICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IChpU2l6ZSArIDIpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUocmdWYWx1ZXMpOw0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXNvbHZlVmFsdWVzW2ldKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9GcmVlKGhSZXNvbHZlVmFsdWVzKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BlcnR5TmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cCwgc3pTb21FeHAuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BQ0NFU1NfUFJPUEVSVFlfSU5fTk9UX09CSkVDVCwgKEZYX0xQQ1dTVFIpd3NQcm9wZXJ0eU5hbWUsIChGWF9MUENXU1RSKXdzU29tRXhwcmVzc2lvbik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYXJnYyA9PSA1KSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0FjY2Vzc29yKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9uIChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBhcmdTdHJpbmcpOw0KKyAgICAgICAgaWYgKGFyZ1N0cmluZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNjcmlwdFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChhcmdTdHJpbmcsIGFyZ1N0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVUZXh0QnVmIHdzSmF2YVNjcmlwdEJ1ZjsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOw0KKyAgICAgICAgICAgIFhGQV9GTTJKU19UcmFuc2xhdGUoc2NyaXB0U3RyaW5nLCB3c0phdmFTY3JpcHRCdWYsIHdzRXJyb3IpOw0KKyAgICAgICAgICAgIGlmICh3c0Vycm9yLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyAgamF2YVNjcmlwdCA9IHdzSmF2YVNjcmlwdEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9VVEY4RW5jb2RlKGphdmFTY3JpcHQsIGphdmFTY3JpcHQuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIkV2YWwiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fb2JqZWN0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdPbmUpKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fYXJyYXkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICAgICAgRlhfQk9PTCBiSXNBcnJheSA9IEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBiSXNBcnJheSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV92YWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpIHsNCisgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnT25lLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iaihGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9JTlQzMiBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnT25lLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoaUxlbmd0aCA+PSAzKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmZtX3Zhcl9maWx0ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfSU5UMzIgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGlMZW5ndGggPj0gMyk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGZsYWdzVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDAsIGZsYWdzVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlGbGFncyA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihmbGFnc1ZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZsYWdzVmFsdWUpOw0KKyAgICAgICAgICAgIGlmKGlGbGFncyA9PSA0KSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMyk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzJdKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQorICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYoaUZsYWdzID09IDMpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG9iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwgb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZighRlhKU0VfVmFsdWVfSXNOdWxsKG9iamVjdFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYXJnT25lKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG9iamVjdFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgc2ltcGxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc2ltcGxlVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHNpbXBsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzaW1wbGVWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Y29uY2F0X2ZtX29iamVjdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9VSU5UMzIgaUxlbmd0aCA9IDA7DQorICAgIEZYX0lOVDMyIGFyZ0NvdW50ID0gYXJncy5HZXRMZW5ndGgoKTsNCisgICAgRlhKU0VfSFZBTFVFICphcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGFyZ0NvdW50KTsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgew0KKyAgICAgICAgYXJnVmFsdWVzW2ldID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWVzW2ldKSkgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZXNbaV0sIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgaUxlbmd0aCA9IGlMZW5ndGggKyAoKGxlbmd0aCA+IDIpID8gKGxlbmd0aCAtIDIpIDogMCk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBpTGVuZ3RoICs9IDE7DQorICAgIH0NCisgICAgRlhKU0VfSFZBTFVFICpyZXR1cm5WYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlMZW5ndGgpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAoRlhfSU5UMzIpaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICByZXR1cm5WYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgew0KKyAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZXNbaV0pKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlc1tpXSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgbGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaiA9IDI7IGogPCBsZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWVzW2ldLCBqLCByZXR1cm5WYWx1ZXNbaW5kZXhdKTsNCisgICAgICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmV0dXJuVmFsdWVzW2luZGV4XSwgYXJnVmFsdWVzW2ldKTsNCisgICAgICAgIGluZGV4Kys7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBpTGVuZ3RoLCByZXR1cm5WYWx1ZXMpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlc1tpXSk7DQorICAgIH0NCisgICAgRlhfRnJlZShhcmdWYWx1ZXMpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCAoRlhfSU5UMzIpaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJldHVyblZhbHVlc1tpXSk7DQorICAgIH0NCisgICAgRlhfRnJlZShyZXR1cm5WYWx1ZXMpOw0KK30NCitGWEpTRV9IVkFMVUUgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldFNpbXBsZUhWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzLCBGWF9VSU5UMzIgaW5kZXgpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPCAoRlhfVUlOVDMyKWFyZ3MuR2V0TGVuZ3RoKCkpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKGluZGV4KTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnSW5kZXgpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdJbmRleCwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHNpbXBsZVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4LCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnSW5kZXgsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzb2JqZWN0VmFsdWUsIHNpbXBsZVZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgc2ltcGxlVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChzaW1wbGVWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0luZGV4KTsNCisgICAgICAgIHJldHVybiBzaW1wbGVWYWx1ZTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdJbmRleCkpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBkZWZhdWx0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ0luZGV4LCBkZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQorICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIGFyZ0luZGV4Ow0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZUlzTnVsbChGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgYXJnKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfQk9PTCBpc051bGwgPSBGQUxTRTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmcpKSB7DQorICAgICAgICBpc051bGwgPSBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IGh2YWx1ZV9nZXRfYXJyYXlfbGVuZ3RoKGhUaGlzLCBhcmcpOw0KKyAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBkZWZhdWx0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgZGVmYXVsdFZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgICAgICBpc051bGwgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGVmYXVsdFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaXNOdWxsID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlzTnVsbCA9IFRSVUU7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGRlZmF1bHRWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBkZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0VmFsdWUpKSB7DQorICAgICAgICAgICAgaXNOdWxsID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGVmYXVsdFZhbHVlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gaXNOdWxsOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZNMkpTQ29udGV4dDo6aHZhbHVlX2dldF9hcnJheV9sZW5ndGgoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGFyZykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSAwOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmcpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmcsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gaUxlbmd0aDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6c2ltcGxlVmFsdWVDb21wYXJlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBmaXJzdFZhbHVlLCBGWEpTRV9IVkFMVUUgc2Vjb25kVmFsdWUpDQorew0KKyAgICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsNCisgICAgaWYoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGZpcnN0VmFsdWUpKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdFN0cmluZywgc2Vjb25kU3RyaW5nOw0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZpcnN0VmFsdWUsIGZpcnN0U3RyaW5nKTsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzZWNvbmRWYWx1ZSwgc2Vjb25kU3RyaW5nKTsNCisgICAgICAgIGJSZXR1cm4gPSBmaXJzdFN0cmluZy5FcXVhbChzZWNvbmRTdHJpbmcpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzTnVtYmVyKGZpcnN0VmFsdWUpKSB7DQorICAgICAgICBGWF9GTE9BVCBmaXJzdCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGZpcnN0VmFsdWUpOw0KKyAgICAgICAgRlhfRkxPQVQgc2Vjb25kID0gSFZhbHVlVG9GbG9hdChoVGhpcywgc2Vjb25kVmFsdWUpOw0KKyAgICAgICAgYlJldHVybiA9IChmaXJzdCA9PSBzZWNvbmQpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihmaXJzdFZhbHVlKSkgew0KKyAgICAgICAgYlJldHVybiA9IChGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oZmlyc3RWYWx1ZSkgPT0gRlhKU0VfVmFsdWVfVG9Cb29sZWFuKHNlY29uZFZhbHVlKSk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGZpcnN0VmFsdWUpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChzZWNvbmRWYWx1ZSkpIHsNCisgICAgICAgIGJSZXR1cm4gPSAgVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gYlJldHVybjsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6dW5mb2xkQXJncyhGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzLCBGWEpTRV9IVkFMVUUgKiZyZXN1bHRWYWx1ZXMsIEZYX0lOVDMyICZpQ291bnQsIEZYX0lOVDMyIGlTdGFydCkNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIGlDb3VudCA9IDA7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgICBGWEpTRV9IVkFMVUUgKmFyZ3NWYWx1ZSA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgYXJnYyk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IGlTdGFydDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgICAgYXJnc1ZhbHVlW2ldID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ3NWYWx1ZVtpXSkpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnc1ZhbHVlW2ldLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgICBpQ291bnQgKz0gKChpTGVuZ3RoID4gMikgPyAoaUxlbmd0aCAtIDIpIDogMCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlDb3VudCArPSAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJlc3VsdFZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaUNvdW50KTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gaVN0YXJ0OyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdzVmFsdWVbaV0pKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ3NWYWx1ZVtpXSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnc1ZhbHVlW2ldLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdzVmFsdWVbaV0sIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCByZXN1bHRWYWx1ZXNbaW5kZXhdKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHJpbmc7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHJpbmcpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdzVmFsdWVbaV0sIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHJpbmcsIHJlc3VsdFZhbHVlc1tpbmRleF0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnc1ZhbHVlW2ldKSkgew0KKyAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdzVmFsdWVbaV0sIHJlc3VsdFZhbHVlc1tpbmRleF0pOw0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZXN1bHRWYWx1ZXNbaW5kZXhdLCBhcmdzVmFsdWVbaV0pOw0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gaVN0YXJ0OyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ3NWYWx1ZVtpXSk7DQorICAgIH0NCisgICAgRlhfRnJlZShhcmdzVmFsdWUpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRPYmplY3REZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhPYmplY3RWYWx1ZSwgRlhKU0VfSFZBTFVFIGhEZWZhdWx0VmFsdWUpDQorew0KKyAgICBDWEZBX09iamVjdCogcE5vZGUgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3RWYWx1ZSwgTlVMTCk7DQorICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+SXNOb2RlKCkpIHsNCisgICAgICAgICgoQ1hGQV9Ob2RlKilwTm9kZSktPlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKGhEZWZhdWx0VmFsdWUsIEZBTFNFLCAoWEZBX0FUVFJJQlVURSkgLSAxKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaERlZmF1bHRWYWx1ZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6U2V0T2JqZWN0RGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoT2JqZWN0VmFsdWUsIEZYSlNFX0hWQUxVRSBoTmV3VmFsdWUpDQorew0KKyAgICBGWF9CT09MIGJTdWNjZXNzID0gRkFMU0U7DQorICAgIENYRkFfT2JqZWN0KiBwTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdFZhbHVlLCBOVUxMKTsNCisgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgICAgKChDWEZBX05vZGUqKXBOb2RlKS0+U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoaE5ld1ZhbHVlLCBUUlVFLCAoWEZBX0FUVFJJQlVURSkgLSAxKTsNCisgICAgICAgIGJTdWNjZXNzID0gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gYlN1Y2Nlc3M7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdlbmVyYXRlU29tRXhwcmVzc2lvbihGWF9CU1RSIHN6TmFtZSwgRlhfSU5UMzIgaUluZGV4RmxhZ3MsIEZYX0lOVDMyIGlJbmRleFZhbHVlLCBGWF9CT09MIGJJc1N0YXIsIENGWF9CeXRlU3RyaW5nJiBzelNvbUV4cCkNCit7DQorICAgIGlmKGJJc1N0YXIpIHsNCisgICAgICAgIHN6U29tRXhwID0gc3pOYW1lICsgRlhfQlNUUkMoIlsqXSIpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKGlJbmRleEZsYWdzID09IDApIHsNCisgICAgICAgIHN6U29tRXhwID0gc3pOYW1lOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKGlJbmRleEZsYWdzID09IDEgfHwgaUluZGV4VmFsdWUgPT0gMCkgew0KKyAgICAgICAgc3pTb21FeHAgPSBzek5hbWUgKyBGWF9CU1RSQygiWyIpICsgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaUluZGV4VmFsdWUsIEZYRk9STUFUX1NJR05FRCkgKyBGWF9CU1RSQygiXSIpOw0KKyAgICB9IGVsc2UgaWYoaUluZGV4RmxhZ3MgPT0gMikgew0KKyAgICAgICAgc3pTb21FeHAgPSAoaUluZGV4VmFsdWUgPCAwKSA/IChzek5hbWUgKyBGWF9CU1RSQygiWy0iKSkgOiAoc3pOYW1lICsgRlhfQlNUUkMoIlsrIikpOw0KKyAgICAgICAgaUluZGV4VmFsdWUgPSAoaUluZGV4VmFsdWUgPCAwKSA/ICgwIC0gaUluZGV4VmFsdWUpIDogaUluZGV4VmFsdWU7DQorICAgICAgICBzelNvbUV4cCArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSk7DQorICAgICAgICBzelNvbUV4cCArPSBGWF9CU1RSQygiXSIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgc3pTb21FeHAgPSAoaUluZGV4VmFsdWUgPCAwKSA/IChzek5hbWUgKyBGWF9CU1RSQygiWyIpKSA6IChzek5hbWUgKyBGWF9CU1RSQygiWy0iKSk7DQorICAgICAgICBpSW5kZXhWYWx1ZSA9IChpSW5kZXhWYWx1ZSA8IDApID8gKDAgLSBpSW5kZXhWYWx1ZSkgOiBpSW5kZXhWYWx1ZTsNCisgICAgICAgIHN6U29tRXhwICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlJbmRleFZhbHVlKTsNCisgICAgICAgIHN6U29tRXhwICs9IEZYX0JTVFJDKCJdIik7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0T2JqZWN0QnlOYW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhY2Nlc3NvclZhbHVlLCBGWF9CU1RSIHN6QWNjZXNzb3JOYW1lKQ0KK3sNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgaWYoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBiRmxhZ3M7DQorICAgIH0NCisgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgRlhfRFdPUkQgZHdGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudDsNCisgICAgRlhfSU5UMzIgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pBY2Nlc3Nvck5hbWUuR2V0Q1N0cigpLCBzekFjY2Vzc29yTmFtZS5HZXRMZW5ndGgoKSksIHJlc292ZU5vZGVSUywgZHdGbGFncyk7DQorICAgIGlmIChpUmV0ID49IDEgJiYgcmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYWNjZXNzb3JWYWx1ZSwgcFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRBdCgwKSkpOw0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gYkZsYWdzOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZNMkpTQ29udGV4dDo6UmVzb2x2ZU9iamVjdHMoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhSZWZWYWx1ZSwgRlhfQlNUUiBic1NvbUV4cCwgWEZBX1JFU09MVkVOT0RFX1JTICZyZXNvdmVOb2RlUlMsIEZYX0JPT0wgYmRvdEFjY2Vzc29yICwgRlhfQk9PTCBiSGFzTm9SZXNvbHZlTmFtZSApDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNTb21FeHAuR2V0Q1N0cigpLCBic1NvbUV4cC5HZXRMZW5ndGgoKSk7DQorICAgIEZYX0lOVDMyIGlSZXQgPSAtMTsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgaWYoIXBEb2MpIHsNCisgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIENYRkFfT2JqZWN0ICpwTm9kZSA9IE5VTEw7DQorICAgIEZYX0RXT1JEIGRGbGFncyA9IDBVTDsNCisgICAgaWYgKGJkb3RBY2Nlc3Nvcikgew0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChoUmVmVmFsdWUpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgICAgICAgIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBOb2RlID0gKENYRkFfT2JqZWN0ICopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFJlZlZhbHVlLCBOVUxMKTsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQocE5vZGUpOw0KKyAgICAgICAgICAgIGlmIChiSGFzTm9SZXNvbHZlTmFtZSkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgICAgICAgICAgICAgIGlmIChwTm9kZS0+SXNOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFhGQU5vZGUgPSAoQ1hGQV9Ob2RlKilwTm9kZTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAod3NOYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIGNsYXNzTmFtZTsNCisgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwiIyIpICsgY2xhc3NOYW1lOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzU29tRXhwcmVzc2lvbiA9IHdzTmFtZSArIHdzU29tRXhwcmVzc2lvbjsNCisgICAgICAgICAgICAgICAgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRGbGFncyA9IChic1NvbUV4cCA9PSAiKiIpID8gKFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbikgOiAoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcE5vZGUgPSAoQ1hGQV9PYmplY3QgKilGWEpTRV9WYWx1ZV9Ub09iamVjdChoUmVmVmFsdWUsIE5VTEwpOw0KKyAgICAgICAgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkOw0KKyAgICB9DQorICAgIGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocE5vZGUsIHdzU29tRXhwcmVzc2lvbiwgcmVzb3ZlTm9kZVJTLCBkRmxhZ3MpOw0KKyAgICByZXR1cm4gaVJldDsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2VSZXNvbHZlUmVzdWx0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IFhGQV9SRVNPTFZFTk9ERV9SUyAmcmVzb3ZlTm9kZVJTLCBGWEpTRV9IVkFMVUUgaFBhcmVudFZhbHVlLCBGWEpTRV9IVkFMVUUgKiZyZXN1bHRWYWx1ZXMsIEZYX0lOVDMyICZpU2l6ZSwgRlhfQk9PTCAmYkF0dHJpYnV0ZSkNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBoUnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIGlTaXplID0gMDsNCisgICAgcmVzdWx0VmFsdWVzID0gTlVMTDsNCisgICAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KKyAgICAgICAgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgICAgaVNpemUgPSByZXNvdmVOb2RlUlMubm9kZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgcmVzdWx0VmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpU2l6ZSk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShoUnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJlc3VsdFZhbHVlc1tpXSwgcENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocmVzb3ZlTm9kZVJTLm5vZGVzLkdldEF0KGkpKSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0hWQUxVRUFycmF5IG9iamVjdFByb3BlcnRpZXMoaFJ1bnRpbWUpOw0KKyAgICAgICAgRlhfSU5UMzIgaVJldCA9IHJlc292ZU5vZGVSUy5HZXRBdHRyaWJ1dGVSZXN1bHQob2JqZWN0UHJvcGVydGllcyk7DQorICAgICAgICBiQXR0cmlidXRlID0gKGlSZXQgPT0gMCk7DQorICAgICAgICBpZiAoYkF0dHJpYnV0ZSkgew0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChoUGFyZW50VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIGlTaXplID0gMTsNCisgICAgICAgICAgICAgICAgcmVzdWx0VmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCAxKTsNCisgICAgICAgICAgICAgICAgcmVzdWx0VmFsdWVzWzBdID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW50aW1lKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJlc3VsdFZhbHVlc1swXSwgaFBhcmVudFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTaXplID0gaVJldDsNCisgICAgICAgICAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplKTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaFJ1bnRpbWUpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmVzdWx0VmFsdWVzW2ldLCBvYmplY3RQcm9wZXJ0aWVzW2ldKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvSW50ZWdlcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgICAgRlhfSU5UMzIgaVZhbHVlID0gMDsNCisgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShoVmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGhWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoaFZhbHVlLCAyLCBqc29iamVjdFZhbHVlKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5KTsNCisgICAgICAgIH0NCisgICAgICAgIGlWYWx1ZSA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIHJldHVybiBpVmFsdWU7DQorICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc09iamVjdChoVmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGhWYWx1ZSwgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgaVZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgICAgIHJldHVybiBpVmFsdWU7DQorICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlKSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pWYWx1ZTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIHN6VmFsdWUpOw0KKyAgICAgICAgaVZhbHVlID0gRlhTWVNfYXRvaShzelZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlWYWx1ZSA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpOw0KKyAgICB9DQorICAgIHJldHVybiBpVmFsdWU7DQorfQ0KK0ZYX0RPVUJMRSBDWEZBX0ZNMkpTQ29udGV4dDo6U3RyaW5nVG9Eb3VibGUoRlhfQlNUUiBzelN0cmluZ1ZhbCkNCit7DQorICAgIHJldHVybiBYRkFfQnl0ZVN0cmluZ1RvRG91YmxlKHN6U3RyaW5nVmFsKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvRmxvYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGFyZykNCit7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICAgIEZYX0ZMT0FUIGZSZXQgPSAwLjBmOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmcpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZywgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc29iamVjdFZhbHVlKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5KTsNCisgICAgICAgIH0NCisgICAgICAgIGZSZXQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZykpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICBmUmV0ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZykpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzT3V0cHV0Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZywgYnNPdXRwdXQpOw0KKyAgICAgICAgZlJldCA9IChGWF9GTE9BVClTdHJpbmdUb0RvdWJsZShic091dHB1dCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoYXJnKSkgew0KKyAgICAgICAgZlJldCA9IDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmUmV0ID0gRlhKU0VfVmFsdWVfVG9GbG9hdChhcmcpOw0KKyAgICB9DQorICAgIHJldHVybiBmUmV0Ow0KK30NCitGWF9ET1VCTEUgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvRG91YmxlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhcmcpDQorew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgICBGWF9ET1VCTEUgZFJldCA9IDA7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBqc29iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmcsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZFJldCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZykpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICBkUmV0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmcpKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic091dHB1dDsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmcsIGJzT3V0cHV0KTsNCisgICAgICAgIGRSZXQgPSBTdHJpbmdUb0RvdWJsZShic091dHB1dCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoYXJnKSkgew0KKyAgICAgICAgZFJldCA9IDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBkUmV0ID0gRlhKU0VfVmFsdWVfVG9Eb3VibGUoYXJnKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZFJldDsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9VVEY4U3RyaW5nKEZYSlNFX0hWQUxVRSBhcmcsIENGWF9CeXRlU3RyaW5nJiBzek91dHB1dFN0cmluZykNCit7DQorICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmcpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGFyZykpIHsNCisgICAgICAgIHN6T3V0cHV0U3RyaW5nID0gIiI7DQorICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc0Jvb2xlYW4oYXJnKSkgew0KKyAgICAgICAgc3pPdXRwdXRTdHJpbmcgPSAgRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGFyZykgPyAiMSIgOiAiMCI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBzek91dHB1dFN0cmluZyA9ICIiOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZywgc3pPdXRwdXRTdHJpbmcpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBGWEpTRV9GVU5DVElPTiBmb3JtY2FsY19mbTJqc19mdW5jdGlvbnNbXSA9IHsNCisgICAgew0KKyAgICAgICAgIkFicyIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6QWJzDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJBdmciLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkF2Zw0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiQ2VpbCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Q2VpbA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiQ291bnQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvdW50DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJGbG9vciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Rmxvb3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIk1heCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TWF4DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJNaW4iLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiTW9kIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpNb2QNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlJvdW5kIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiU3VtIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpTdW0NCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkRhdGUiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkRhdGUyTnVtIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlMk51bQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiRGF0ZUZtdCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZUZtdA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiSXNvRGF0ZTJOdW0iLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTnVtDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJJc29UaW1lMk51bSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJOdW0NCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkxvY2FsRGF0ZUZtdCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxEYXRlRm10DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJMb2NhbFRpbWVGbXQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsVGltZUZtdA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiTnVtMkRhdGUiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJEYXRlDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJOdW0yR01UaW1lIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yR01UaW1lDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJOdW0yVGltZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMlRpbWUNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlRpbWUiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlRpbWUyTnVtIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lMk51bQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiVGltZUZtdCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZUZtdA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiQXByIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpBcHINCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkN0ZXJtIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpDVGVybQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiRlYiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkZWDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJJcG10IiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpJUG10DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJOUFYiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Ok5QVg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiUG10IiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpQbXQNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlBQbXQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlBQbXQNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlBWIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpQVg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiUmF0ZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6UmF0ZQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiVGVybSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6VGVybQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiQ2hvb3NlIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpDaG9vc2UNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkV4aXN0cyIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RXhpc3RzDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJIYXNWYWx1ZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6SGFzVmFsdWUNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIk9uZW9mIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpPbmVvZg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiV2l0aGluIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpXaXRoaW4NCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIklmIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpJZg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiRXZhbCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiVHJhbnNsYXRlIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9uDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJSZWYiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiVW5pdFR5cGUiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRUeXBlDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJVbml0VmFsdWUiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRWYWx1ZQ0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiQXQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkF0DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJDb25jYXQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvbmNhdA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiRGVjb2RlIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGUNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkVuY29kZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJGb3JtYXQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkZvcm1hdA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiTGVmdCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TGVmdA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiTGVuIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpMZW4NCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkxvd2VyIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpMb3dlcg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiTHRyaW0iLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Okx0cmltDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJQYXJzZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2UNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlJlcGxhY2UiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlcGxhY2UNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlJpZ2h0IiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpSaWdodA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiUnRyaW0iLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlJ0cmltDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJTcGFjZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3BhY2UNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlN0ciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3RyDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJTdHVmZiIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3R1ZmYNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIlN1YnN0ciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3Vic3RyDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJVdWlkIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpVdWlkDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJVcHBlciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6VXBwZXINCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIldvcmROdW0iLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OldvcmROdW0NCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIkdldCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJQb3N0IiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpQb3N0DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJQdXQiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlB1dA0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAicG9zaXRpdmVfb3BlcmF0b3IiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OnBvc2l0aXZlX29wZXJhdG9yDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJuZWdhdGl2ZV9vcGVyYXRvciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImxvZ2ljYWxfb3Jfb3BlcmF0b3IiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfb3Jfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImxvZ2ljYWxfYW5kX29wZXJhdG9yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX2FuZF9vcGVyYXRvcg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAibG9naWNhbF9ub3Rfb3BlcmF0b3IiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJlcXVhbGl0eV9vcGVyYXRvciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6ZXF1YWxpdHlfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIm5vdGVxdWFsaXR5X29wZXJhdG9yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0Ojpub3RlcXVhbGl0eV9vcGVyYXRvcg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAibGVzc19vcGVyYXRvciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc19vcGVyYXRvcg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAibGVzc2VxdWFsX29wZXJhdG9yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzZXF1YWxfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImdyZWF0ZXJfb3BlcmF0b3IiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImdyZWF0ZXJlcXVhbF9vcGVyYXRvciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcmVxdWFsX29wZXJhdG9yDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJwbHVzX29wZXJhdG9yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpwbHVzX29wZXJhdG9yDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJtaW51c19vcGVyYXRvciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6bWludXNfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgIm11bHRpcGxlX29wZXJhdG9yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjptdWx0aXBsZV9vcGVyYXRvcg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiZGl2aWRlX29wZXJhdG9yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpkaXZpZGVfb3BlcmF0b3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImFzc2lnbl92YWx1ZV9vcGVyYXRvciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6YXNzaWduX3ZhbHVlX29wZXJhdG9yDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJkb3RfYWNjZXNzb3IiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdF9hY2Nlc3Nvcg0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiZG90ZG90X2FjY2Vzc29yIiwNCisgICAgICAgIENYRkFfRk0ySlNDb250ZXh0Ojpkb3Rkb3RfYWNjZXNzb3INCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImNvbmNhdF9mbV9vYmplY3QiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmNvbmNhdF9mbV9vYmplY3QNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImlzX2ZtX29iamVjdCIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fb2JqZWN0DQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJpc19mbV9hcnJheSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fYXJyYXkNCisgICAgfSwNCisgICAgew0KKyAgICAgICAgImdldF9mbV92YWx1ZSIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Z2V0X2ZtX3ZhbHVlDQorICAgIH0sDQorICAgIHsNCisgICAgICAgICJnZXRfZm1fanNvYmoiLA0KKyAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iag0KKyAgICB9LA0KKyAgICB7DQorICAgICAgICAiZm1fdmFyX2ZpbHRlciIsDQorICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Zm1fdmFyX2ZpbHRlcg0KKyAgICB9LA0KK307DQorQ1hGQV9GTTJKU0NvbnRleHQ6OkNYRkFfRk0ySlNDb250ZXh0KCkgOg0KKyAgICBtX3BEb2N1bWVudChOVUxMKSwNCisgICAgbV9oRk1DbGFzcyhOVUxMKQ0KK3sNCisgICAgRlhfbWVtc2V0KCZtX2ZtQ2xhc3MsIDAsIHNpemVvZihGWEpTRV9DTEFTUykpOw0KK30NCitDWEZBX0ZNMkpTQ29udGV4dDo6fkNYRkFfRk0ySlNDb250ZXh0KCkNCit7DQorICAgIG1fcERvY3VtZW50ID0gTlVMTDsNCisgICAgaWYobV9oVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobV9oVmFsdWUpOw0KKyAgICAgICAgbV9oVmFsdWUgPSBOVUxMOw0KKyAgICB9DQorICAgIG1faFNjcmlwdFJ1bnRpbWUgPSBOVUxMOw0KK30NCitDWEZBX0ZNMkpTQ29udGV4dCogQ1hGQV9GTTJKU0NvbnRleHQ6OkNyZWF0ZSgpDQorew0KKyAgICByZXR1cm4gRlhfTkVXIENYRkFfRk0ySlNDb250ZXh0Ow0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLCBGWEpTRV9IQ09OVEVYVCBoU2NyaXB0Q29udGV4dCwgQ1hGQV9Eb2N1bWVudCogcERvYykNCit7DQorICAgIG1fcERvY3VtZW50ID0gcERvYzsNCisgICAgbV9oU2NyaXB0UnVudGltZSA9IGhTY3JpcHRSdW50aW1lOw0KKyAgICBtX2ZtQ2xhc3MubmFtZSA9ICJYRkFfRk0ySlNfRm9ybUNhbGNDbGFzcyI7DQorICAgIG1fZm1DbGFzcy5jb25zdHJ1Y3RvciA9IE5VTEw7DQorICAgIG1fZm1DbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgICAgbV9mbUNsYXNzLm1ldGhvZHMgPSBmb3JtY2FsY19mbTJqc19mdW5jdGlvbnM7DQorICAgIG1fZm1DbGFzcy5wcm9wTnVtID0gMDsNCisgICAgbV9mbUNsYXNzLm1ldGhOdW0gPSBzaXplb2YoZm9ybWNhbGNfZm0yanNfZnVuY3Rpb25zKSAvIHNpemVvZihmb3JtY2FsY19mbTJqc19mdW5jdGlvbnNbMF0pOw0KKyAgICBtX2hGTUNsYXNzID0gRlhKU0VfRGVmaW5lQ2xhc3MoaFNjcmlwdENvbnRleHQsICZtX2ZtQ2xhc3MpOw0KKyAgICBtX2hWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShoU2NyaXB0UnVudGltZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwobV9oVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QobV9oVmFsdWUsIHRoaXMsIG1faEZNQ2xhc3MpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgbV9oVmFsdWUpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShGWF9JTlQzMiBpU3RyaW5nSUQsIC4uLikNCit7DQorICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBBcHBQcm92aWRlcik7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoaVN0cmluZ0lELCB3c0Zvcm1hdCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgICAgdmFfbGlzdCBhcmdfcHRyOw0KKyAgICB2YV9zdGFydChhcmdfcHRyLCBpU3RyaW5nSUQpOw0KKyAgICB3c01lc3NhZ2UuRm9ybWF0VigoRlhfTFBDV1NUUil3c0Zvcm1hdCwgYXJnX3B0cik7DQorICAgIHZhX2VuZChhcmdfcHRyKTsNCisgICAgRlhKU0VfVGhyb3dNZXNzYWdlKEZYX0JTVFJDKCIiKSwgRlhfVVRGOEVuY29kZSh3c01lc3NhZ2UsIHdzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDUxYmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaApAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk0ySlNfQ09OVEVYVF9IDQorI2RlZmluZSBfWEZBX0ZNMkpTX0NPTlRFWFRfSA0KK2NsYXNzIENYRkFfRk0ySlNDb250ZXh0IDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgdm9pZCBBYnMJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBBdmcJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBDZWlsCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBDb3VudAkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgRmxvb3IJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIE1heAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIE1pbgkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIE1vZAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIFJvdW5kCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBTdW0JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBEYXRlCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIERhdGUyTnVtCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgRGF0ZUZtdAkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBJc29EYXRlMk51bQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIElzb1RpbWUyTnVtCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgTG9jYWxEYXRlRm10CShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBMb2NhbFRpbWVGbXQJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIE51bTJEYXRlCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgTnVtMkdNVGltZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIE51bTJUaW1lCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgVGltZQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBUaW1lMk51bQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIFRpbWVGbXQJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisNCisgICAgc3RhdGljIEZYX0JPT0wJSXNJc29EYXRlRm9ybWF0CQkJKEZYX0xQQ1NUUiBwRGF0YSwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfSU5UMzIgJmlTdHlsZSwgRlhfSU5UMzIgJmlZZWFyLCBGWF9JTlQzMiAmaU1vbnRoLCBGWF9JTlQzMiAmaURheSk7DQorICAgIHN0YXRpYyBGWF9CT09MCUlzSXNvVGltZUZvcm1hdAkJCShGWF9MUENTVFIgcERhdGEsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyICZpSG91ciwgRlhfSU5UMzIgJmlNaW51dGUsIEZYX0lOVDMyICZpU2Vjb25kLCBGWF9JTlQzMiAmaU1pbGxpU2Vjb25kLCBGWF9JTlQzMiAmaVpvbmVIb3VyLCBGWF9JTlQzMiAmaVpvbmVNaW51dGUpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAlJc0lzb0RhdGVUaW1lRm9ybWF0CQkoRlhfTFBDU1RSIHBEYXRhLCBGWF9JTlQzMiBpTGVuZ3RoLCBGWF9JTlQzMiAmaVllYXIsIEZYX0lOVDMyICZpTW9udGgsIEZYX0lOVDMyICZpRGF5LCBGWF9JTlQzMiAmaUhvdXIsIEZYX0lOVDMyICZpTWludXRlLCBGWF9JTlQzMiAmaVNlY29uZCwgRlhfSU5UMzIgJmlNaWxsaW9uU2Vjb25kLCBGWF9JTlQzMiAmaVpvbmVIb3VyLCBGWF9JTlQzMiAmaVpvbmVNaW51dGUpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAlMb2NhbDJJc29EYXRlCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0JTVFIgc3pEYXRlLCBGWF9CU1RSIHN6Rm9ybWF0LCBGWF9CU1RSIHN6TG9jYWxlLCBDRlhfQnl0ZVN0cmluZyAmc3RySXNvRGF0ZSk7DQorICAgIHN0YXRpYyBGWF9CT09MCUxvY2FsMklzb1RpbWUJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzelRpbWUsIEZYX0JTVFIgc3pGb3JtYXQsIEZYX0JTVFIgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJJc29UaW1lKTsNCisgICAgc3RhdGljIEZYX0JPT0wJSXNvRGF0ZTJMb2NhbAkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6RGF0ZSwgRlhfQlNUUiBzekZvcm1hdCwgRlhfQlNUUiBzekxvY2FsZSwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckxvY2FsRGF0ZSk7DQorICAgIHN0YXRpYyBGWF9CT09MCUlzb1RpbWUyTG9jYWwJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzelRpbWUsIEZYX0JTVFIgc3pGb3JtYXQsIEZYX0JTVFIgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJMb2NhbFRpbWUpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAlHZXRHTVRUaW1lCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWF9CU1RSIHN6VGltZSwgRlhfQlNUUiBzekZvcm1hdCwgRlhfQlNUUiBzekxvY2FsZSwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckdNVFRpbWUpOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgRGF0ZVN0cmluZzJOdW0JCQkoRlhfQlNUUiBzekRhdGVTdHJpbmcpOw0KKyAgICBzdGF0aWMgdm9pZAkJR2V0TG9jYWxEYXRlRm9ybWF0CQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfSU5UMzIgaVN0eWxlLCBGWF9CU1RSIHN6TG9jYWxTdHIsIENGWF9CeXRlU3RyaW5nICZzdHJGb3JtYXQsIEZYX0JPT0wgYlN0YW5kYXJkKTsNCisgICAgc3RhdGljIHZvaWQJCUdldExvY2FsVGltZUZvcm1hdAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0lOVDMyIGlTdHlsZSwgRlhfQlNUUiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCk7DQorICAgIHN0YXRpYyB2b2lkCQlHZXRTdGFuZGFyZERhdGVGb3JtYXQJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0lOVDMyIGlTdHlsZSwgRlhfQlNUUiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0KTsNCisgICAgc3RhdGljIHZvaWQJCUdldFN0YW5kYXJkVGltZUZvcm1hdAkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfSU5UMzIgaVN0eWxlLCBGWF9CU1RSIHN6TG9jYWxTdHIsIENGWF9CeXRlU3RyaW5nICZzdHJGb3JtYXQpOw0KKw0KKyAgICBzdGF0aWMgdm9pZAkJTnVtMkFsbFRpbWUJCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYX0lOVDMyIGlUaW1lLCBGWF9CU1RSIHN6Rm9ybWF0LCBGWF9CU1RSIHN6TG9jYWxlLCBGWF9CT09MIGJHTSwgQ0ZYX0J5dGVTdHJpbmcgJnN0clRpbWUpOw0KKyAgICBzdGF0aWMgdm9pZAkJR2V0TG9jYWxUaW1lWm9uZQkJKEZYX0lOVDMyICZpSG91ciwgRlhfSU5UMzIgJmlNaW4sIEZYX0lOVDMyICZpU2VjKTsNCisNCisgICAgc3RhdGljIHZvaWQgQXByCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgQ1Rlcm0JKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIEZWCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgSVBtdAkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgTlBWCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgUG10CQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgUFBtdAkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgUFYJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBSYXRlCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBUZXJtCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBDaG9vc2UJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBFeGlzdHMJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBIYXNWYWx1ZQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgT25lb2YJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBXaXRoaW4JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBJZgkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBFdmFsCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgUmVmCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIFVuaXRUeXBlCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBVbml0VmFsdWUJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorDQorICAgIHN0YXRpYyB2b2lkIEF0CQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIENvbmNhdAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIERlY29kZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIERlY29kZVVSTAkoRlhfQlNUUiBzelVSTFN0cmluZywgIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpOw0KKyAgICBzdGF0aWMgdm9pZCBEZWNvZGVIVE1MCShGWF9CU1RSIHN6SFRNTFN0cmluZywgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdEJ1Zik7DQorICAgIHN0YXRpYyB2b2lkIERlY29kZVhNTAkoRlhfQlNUUiBzelhNTFN0cmluZywgIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpOw0KKyAgICBzdGF0aWMgdm9pZCBFbmNvZGUJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBFbmNvZGVVUkwJKEZYX0JTVFIgc3pVUkxTdHJpbmcsICBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0QnVmKTsNCisgICAgc3RhdGljIHZvaWQgRW5jb2RlSFRNTAkoRlhfQlNUUiBzekhUTUxTdHJpbmcsIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpOw0KKyAgICBzdGF0aWMgdm9pZCBFbmNvZGVYTUwJKEZYX0JTVFIgc3pYTUxTdHJpbmcsICBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0QnVmKTsNCisgICAgc3RhdGljIEZYX0JPT0wgSFRNTFNUUjJDb2RlCShGWF9XU1RSIHBEYXRhLCBGWF9VSU5UMzIgJmlDb2RlKTsNCisgICAgc3RhdGljIEZYX0JPT0wgSFRNTENvZGUyU1RSCShGWF9VSU5UMzIgaUNvZGUsCSAgQ0ZYX1dpZGVTdHJpbmcgJndzSFRNTFJlc2VydmUpOw0KKyAgICBzdGF0aWMgdm9pZCBGb3JtYXQJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBMZWZ0CQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgTGVuCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIExvd2VyCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgTHRyaW0JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBQYXJzZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIFJlcGxhY2UJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBSaWdodAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIFJ0cmltCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgU3BhY2UJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBTdHIJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgU3R1ZmYJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBTdWJzdHIJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBVdWlkCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgVXBwZXIJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBXb3JkTnVtCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgVHJpbGxpb25VUwkoRlhfQlNUUiBzekRhdGEsIENGWF9CeXRlVGV4dEJ1ZiAmc3RyQnVmKTsNCisgICAgc3RhdGljIHZvaWQgV29yZFVTCQkoRlhfQlNUUiBzekRhdGEsIEZYX0lOVDMyIGlTdHlsZSwgQ0ZYX0J5dGVUZXh0QnVmICZzdHJCdWYpOw0KKw0KKyAgICBzdGF0aWMgdm9pZCBHZXQJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgUG9zdAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIFB1dAkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBhc3NpZ25fdmFsdWVfb3BlcmF0b3IJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBsb2dpY2FsX29yX29wZXJhdG9yCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfYW5kX29wZXJhdG9yCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgZXF1YWxpdHlfb3BlcmF0b3IJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgbm90ZXF1YWxpdHlfb3BlcmF0b3IJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBmbV9yZWZfZXF1YWwJCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBsZXNzX29wZXJhdG9yCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBsZXNzZXF1YWxfb3BlcmF0b3IJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgZ3JlYXRlcl9vcGVyYXRvcgkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBncmVhdGVyZXF1YWxfb3BlcmF0b3IJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBwbHVzX29wZXJhdG9yCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBtaW51c19vcGVyYXRvcgkJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgbXVsdGlwbGVfb3BlcmF0b3IJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgZGl2aWRlX29wZXJhdG9yCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBwb3NpdGl2ZV9vcGVyYXRvcgkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBuZWdhdGl2ZV9vcGVyYXRvcgkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBsb2dpY2FsX25vdF9vcGVyYXRvcgkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkIGRvdF9hY2Nlc3NvcgkJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIHZvaWQgZG90ZG90X2FjY2Vzc29yCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZCBldmFsX3RyYW5zbGF0aW9uCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkCQlpc19mbV9vYmplY3QJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkCQlpc19mbV9hcnJheQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkCQlnZXRfZm1fdmFsdWUJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkCQlnZXRfZm1fanNvYmoJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCUZYX0JTVFIgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorICAgIHN0YXRpYyB2b2lkCQlmbV92YXJfZmlsdGVyCShGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKyAgICBzdGF0aWMgdm9pZAkJY29uY2F0X2ZtX29iamVjdChGWEpTRV9IT0JKRUNUIGhUaGlzLAlGWF9CU1RSIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KKw0KKyAgICBzdGF0aWMgRlhfSU5UMzIgaHZhbHVlX2dldF9hcnJheV9sZW5ndGgJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhcmcpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAkJc2ltcGxlVmFsdWVDb21wYXJlCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgZmlyc3RWYWx1ZSwgRlhKU0VfSFZBTFVFIHNlY29uZFZhbHVlKTsNCisgICAgc3RhdGljIHZvaWQJCQl1bmZvbGRBcmdzCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MsIEZYSlNFX0hWQUxVRSAqJnJlc3VsdFZhbHVlcywgRlhfSU5UMzIgJmlDb3VudCwgRlhfSU5UMzIgaVN0YXJ0ID0gMCk7DQorICAgIHN0YXRpYyB2b2lkCQkJR2V0T2JqZWN0RGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoT2JqZWN0VmFsdWUsIEZYSlNFX0hWQUxVRSBoRGVmYXVsdFZhbHVlKTsNCisgICAgc3RhdGljIEZYX0JPT0wJCVNldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLCBGWEpTRV9IVkFMVUUgaE5ld1ZhbHVlKTsNCisgICAgc3RhdGljIHZvaWQJCQlHZW5lcmF0ZVNvbUV4cHJlc3Npb24oRlhfQlNUUiBzek5hbWUsIEZYX0lOVDMyIGlJbmRleEZsYWdzLCBGWF9JTlQzMiBpSW5kZXhWYWx1ZSwgRlhfQk9PTCBiSXNTdGFyLCBDRlhfQnl0ZVN0cmluZyYgc3pTb21FeHApOw0KKyAgICBzdGF0aWMgRlhfQk9PTAkJR2V0T2JqZWN0QnlOYW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhY2Nlc3NvclZhbHVlLCBGWF9CU1RSIHN6QWNjZXNzb3JOYW1lKTsNCisgICAgc3RhdGljIEZYX0lOVDMyCQlSZXNvbHZlT2JqZWN0cyhGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFBhcmVudFZhbHVlLCBGWF9CU1RSIGJzU29tRXhwLCBYRkFfUkVTT0xWRU5PREVfUlMgJnJlc292ZU5vZGVSUywgRlhfQk9PTCBiZG90QWNjZXNzb3IgPSBUUlVFLCBGWF9CT09MIGJIYXNOb1Jlc29sdmVOYW1lID0gRkFMU0UpOw0KKyAgICBzdGF0aWMgdm9pZAkJCVBhcnNlUmVzb2x2ZVJlc3VsdChGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc292ZU5vZGVSUywgRlhKU0VfSFZBTFVFIGhQYXJlbnRWYWx1ZSwgRlhKU0VfSFZBTFVFIComcmVzdWx0VmFsdWVzLCBGWF9JTlQzMiAmaVNpemUsIEZYX0JPT0wgJmJBdHRyaWJ1dGUpOw0KKw0KKyAgICBzdGF0aWMgRlhKU0VfSFZBTFVFIEdldFNpbXBsZUhWYWx1ZQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncywgRlhfVUlOVDMyIGluZGV4KTsNCisgICAgc3RhdGljIEZYX0JPT0wJCUhWYWx1ZUlzTnVsbAkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICAgIHN0YXRpYyBGWF9JTlQzMgkJSFZhbHVlVG9JbnRlZ2VyCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgICAgc3RhdGljIEZYX0RPVUJMRQlTdHJpbmdUb0RvdWJsZShGWF9CU1RSIHN6U3RyaW5nVmFsKTsNCisgICAgc3RhdGljIEZYX0ZMT0FUCQlIVmFsdWVUb0Zsb2F0CShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgICAgc3RhdGljIEZYX0RPVUJMRQlIVmFsdWVUb0RvdWJsZQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICAgIHN0YXRpYyB2b2lkCQkJSFZhbHVlVG9VVEY4U3RyaW5nCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfQnl0ZVN0cmluZyYgb3V0cHV0VmFsdWUpOw0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCgpOw0KKyAgICB+Q1hGQV9GTTJKU0NvbnRleHQoKTsNCisgICAgc3RhdGljIENYRkFfRk0ySlNDb250ZXh0KiBDcmVhdGUoKTsNCisgICAgdm9pZCBJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLCBGWEpTRV9IQ09OVEVYVCBoU2NyaXB0Q29udGV4dCwgQ1hGQV9Eb2N1bWVudCogcERvYyk7DQorICAgIHZvaWQgR2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICAgIHZvaWQgUmVsZWFzZSgpOw0KKyAgICBGWEpTRV9IUlVOVElNRSBHZXRTY3JpcHRSdW50aW1lKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faFNjcmlwdFJ1bnRpbWU7DQorICAgIH0NCisgICAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7DQorICAgIH0NCisgICAgdm9pZCBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShGWF9JTlQzMiBpU3RyaW5nSUQsIC4uLik7DQorcHJpdmF0ZToNCisgICAgRlhKU0VfSFJVTlRJTUUJCQltX2hTY3JpcHRSdW50aW1lOw0KKyAgICBGWEpTRV9DTEFTUwkJCQltX2ZtQ2xhc3M7DQorICAgIEZYSlNFX0hDTEFTUwkJCW1faEZNQ2xhc3M7DQorICAgIEZYSlNFX0hWQUxVRQkJCW1faFZhbHVlOw0KKyAgICBDWEZBX0RvY3VtZW50KgkJCW1fcERvY3VtZW50Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWRlOWYyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5jcHAKQEAgLTAsMCArMSwxMTQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCitDWEZBX0ZNUGFyc2U6OkNYRkFfRk1QYXJzZSgpDQorew0KKyAgICBtX3BTY3JpcHQgPSAwOw0KKyAgICBtX3VMZW5ndGggPSAwOw0KKyAgICBtX3BFcnJvckluZm8gPSAwOw0KKyAgICBtX2xleGVyID0gMDsNCisgICAgbV9wVG9rZW4gPSAwOw0KK30NCitDWEZBX0ZNUGFyc2U6On5DWEZBX0ZNUGFyc2UoKQ0KK3sNCisgICAgaWYgKG1fbGV4ZXIpIHsNCisgICAgICAgIGRlbGV0ZSBtX2xleGVyOw0KKyAgICB9DQorICAgIG1fbGV4ZXIgPSAwOw0KKyAgICBtX3BFcnJvckluZm8gPSAwOw0KKyAgICBtX3BTY3JpcHQgPSAwOw0KKyAgICBtX3BUb2tlbiA9IDA7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRk1QYXJzZTo6SW5pdChGWF9XU1RSIHdzRm9ybWNhbGMsIENYRkFfRk1FcnJvckluZm8gKnBFcnJvckluZm8pDQorew0KKyAgICBtX3BTY3JpcHQgPSB3c0Zvcm1jYWxjLkdldFB0cigpOw0KKyAgICBtX3VMZW5ndGggPSB3c0Zvcm1jYWxjLkdldExlbmd0aCgpOw0KKyAgICBtX3BFcnJvckluZm8gPSBwRXJyb3JJbmZvOw0KKyAgICBtX2xleGVyID0gRlhfTkVXIENYRkFfRk1MZXhlcih3c0Zvcm1jYWxjLCBtX3BFcnJvckluZm8pOw0KKyAgICBpZiAobV9sZXhlciA9PSAwKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9GTVBhcnNlOjpOZXh0VG9rZW4oKQ0KK3sNCisgICAgbV9wVG9rZW4gPSBtX2xleGVyLT5OZXh0VG9rZW4oKTsNCisgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcmVzZXJ2ZXIpIHsNCisgICAgICAgIGlmIChtX2xleGVyLT5IYXNFcnJvcigpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBtX3BUb2tlbiA9IG1fbGV4ZXItPk5leHRUb2tlbigpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTVBhcnNlOjpDaGVjayggWEZBX0ZNX1RPS0VOIG9wICkNCit7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IG9wKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhvcCksIEZYX0xQQ1dTVFIod3NfVGVtcFN0cmluZykpOw0KKyAgICB9DQorICAgIE5leHRUb2tlbigpOw0KK30NCit2b2lkIENYRkFfRk1QYXJzZTo6RXJyb3IoRlhfRFdPUkQgbGluZU51bSwgWEZBX0ZNX0VSUk1TRyBtc2csIC4uLikNCit7DQorICAgIG1fcEVycm9ySW5mby0+bGluZW51bSA9IGxpbmVOdW07DQorICAgIEZYX0xQQ1dTVFIgbHBNZXNzYWdlSW5mbyA9IFhGQV9GTV9FcnJvck1zZyhtc2cpOw0KKyAgICB2YV9saXN0IGFwOw0KKyAgICB2YV9zdGFydChhcCwgbXNnKTsNCisgICAgbV9wRXJyb3JJbmZvLT5tZXNzYWdlLkZvcm1hdFYobHBNZXNzYWdlSW5mbywgYXApOw0KKyAgICB2YV9lbmQoYXApOw0KK30NCitDRlhfUHRyQXJyYXkgKiBDWEZBX0ZNUGFyc2U6OlBhcnNlVG9wRXhwcmVzc2lvbigpDQorew0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgIENGWF9QdHJBcnJheSAqIGV4cHJlc3Npb24gPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICAgIHdoaWxlICgxKSB7DQorICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlb2YpIHsNCisgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGZ1bmMpIHsNCisgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGlmKSB7DQorICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbHNlaWYpIHsNCisgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Vsc2UpIHsNCisgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Z1bmMpIHsNCisgICAgICAgICAgICBlID0gUGFyc2VGdW5jdGlvbigpOw0KKyAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBQYXJzZUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICAgICAgICBleHByZXNzaW9uLT5BZGQoZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBleHByZXNzaW9uOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VGdW5jdGlvbigpDQorew0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nQyBpZGVudDsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDQXJyYXkgKiBwQXJndW1lbnRzID0gMDsNCisgICAgQ0ZYX1B0ckFycmF5ICogcEV4cHJlc3Npb25zID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZGVudCA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgfQ0KKyAgICBDaGVjayhUT0tscGFyZW4pOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcEFyZ3VtZW50cyA9IEZYX05FVyBDRlhfV2lkZVN0cmluZ0NBcnJheSgpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHA7DQorICAgICAgICB3aGlsZSAoMSkgew0KKyAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgICAgICAgICAgcCA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgICAgIHBBcmd1bWVudHMtPkFkZChwKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7DQorICAgICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ2hlY2soVE9LcnBhcmVuKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDaGVjayhUT0tkbyk7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGZ1bmMpIHsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcEV4cHJlc3Npb25zID0gUGFyc2VUb3BFeHByZXNzaW9uKCk7DQorICAgICAgICBDaGVjayhUT0tlbmRmdW5jKTsNCisgICAgfQ0KKyAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKGxpbmUsIDAsIGlkZW50LCBwQXJndW1lbnRzLCBwRXhwcmVzc2lvbnMpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgc2l6ZSA9IDA7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgICAgICBpZiAocEFyZ3VtZW50cykgew0KKyAgICAgICAgICAgIHBBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBwQXJndW1lbnRzOw0KKyAgICAgICAgICAgIHBBcmd1bWVudHMgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW5kZXggPSAwOw0KKyAgICAgICAgaWYgKHBFeHByZXNzaW9ucykgew0KKyAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uICplMSA9IDA7DQorICAgICAgICAgICAgc2l6ZSA9IHBFeHByZXNzaW9ucy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgIHdoaWxlKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgICAgICAgICAgICBlMSA9IChDWEZBX0ZNRXhwcmVzc2lvbiAqKXBFeHByZXNzaW9ucy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgZGVsZXRlIHBFeHByZXNzaW9uczsNCisgICAgICAgICAgICBwRXhwcmVzc2lvbnMgPSAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VFeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgIGNhc2UgVE9LdmFyOg0KKyAgICAgICAgICAgIGUgPSBQYXJzZVZhckV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LbnVsbDoNCisgICAgICAgIGNhc2UgVE9LbnVtYmVyOg0KKyAgICAgICAgY2FzZSBUT0tzdHJpbmc6DQorICAgICAgICBjYXNlIFRPS3BsdXM6DQorICAgICAgICBjYXNlIFRPS21pbnVzOg0KKyAgICAgICAgY2FzZSBUT0trc25vdDoNCisgICAgICAgIGNhc2UgVE9LaWRlbnRpZmllcjoNCisgICAgICAgIGNhc2UgVE9LbHBhcmVuOg0KKyAgICAgICAgICAgIGUgPSBQYXJzZUV4cEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LaWY6DQorICAgICAgICAgICAgZSA9IFBhcnNlSWZFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS3doaWxlOg0KKyAgICAgICAgICAgIGUgPSBQYXJzZVdoaWxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0tmb3I6DQorICAgICAgICAgICAgZSA9IFBhcnNlRm9yRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0tmb3JlYWNoOg0KKyAgICAgICAgICAgIGUgPSBQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS2RvOg0KKyAgICAgICAgICAgIGUgPSBQYXJzZURvRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0ticmVhazoNCisgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1CcmVha0V4cHJlc3Npb24obGluZSk7DQorICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS2NvbnRpbnVlOg0KKyAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbihsaW5lKTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZVZhckV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKiBlID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIGlkZW50Ow0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlkZW50ID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICB9DQorICAgIGlmKCBtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlID0gUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTVZhckV4cHJlc3Npb24obGluZSwgaWRlbnQsIGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICBlID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlU2ltcGxlRXhwcmVzc2lvbigpDQorew0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSA9IDAsICpwRXhwMiA9IDA7DQorICAgIHBFeHAxID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQorICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBwRXhwMSA9IEZYX05FVyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihsaW5lLCBUT0thc3NpZ24sIHBFeHAxLCBwRXhwMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRlbGV0ZSBwRXhwMTsNCisgICAgICAgICAgICBwRXhwMSA9IDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBFeHAxOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VFeHBFeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEgPSAwIDsNCisgICAgcEV4cDEgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUV4cEV4cHJlc3Npb24obGluZSwgcEV4cDEpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZGVsZXRlIHBFeHAxOw0KKyAgICAgICAgZSA9IDA7DQorICAgIH0NCisgICAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUxID0gMCwgKmUyID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBlMSA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCisgICAgZm9yICg7Oykgew0KKyAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgICAgICAgY2FzZSBUT0tvcjoNCisgICAgICAgICAgICBjYXNlIFRPS2tzb3I6DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICBlMiA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKGxpbmUsIFRPS29yLCBlMSwgZTIpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIGUxOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VMb2dpY2FsQW5kRXhwcmVzc2lvbigpDQorew0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIGUxID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCisgICAgZm9yICg7Oykgew0KKyAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgICAgICAgY2FzZSBUT0thbmQ6DQorICAgICAgICAgICAgY2FzZSBUT0trc2FuZDoNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGUyID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbihsaW5lLCBUT0thbmQsIGUxLCBlMik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgICAgICAgICAgICBlMSA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZUVxdWFsaXR5RXhwcmVzc2lvbigpDQorew0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIGUxID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KKyAgICBmb3IgKDs7KSB7DQorICAgICAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgICAgICBjYXNlIFRPS2VxOg0KKyAgICAgICAgICAgIGNhc2UgVE9La3NlcToNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGUyID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbihsaW5lLCBUT0tlcSwgZTEsIGUyKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBjYXNlIFRPS25lOg0KKyAgICAgICAgICAgIGNhc2UgVE9La3NuZToNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGUyID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbihsaW5lLCBUT0tuZSwgZTEsIGUyKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUxID0gMCwgKmUyID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBlMSA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgZm9yICg7Oykgew0KKyAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgICAgICAgY2FzZSBUT0tsdDoNCisgICAgICAgICAgICBjYXNlIFRPS2tzbHQ6DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbihsaW5lLCBUT0tsdCwgZTEsIGUyKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBjYXNlIFRPS2d0Og0KKyAgICAgICAgICAgIGNhc2UgVE9La3NndDoNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKGxpbmUsIFRPS2d0LCBlMSwgZTIpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGNhc2UgVE9LbGU6DQorICAgICAgICAgICAgY2FzZSBUT0trc2xlOg0KKyAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBlMSA9IEZYX05FVyBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24obGluZSwgVE9LbGUsIGUxLCBlMik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgICAgICAgICAgICBlMSA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBUT0tnZToNCisgICAgICAgICAgICBjYXNlIFRPS2tzZ2U6DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbihsaW5lLCBUT0tnZSwgZTEsIGUyKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUxID0gMCwgKmUyID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBlMSA9IFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7DQorICAgIGZvciAoOzspIHsNCisgICAgICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgVE9LcGx1czoNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGUyID0gUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LcGx1cywgZTEsIGUyKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBjYXNlIFRPS21pbnVzOg0KKyAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgZTIgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbihsaW5lLCBUT0ttaW51cywgZTEsIGUyKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgICAgZTEgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KKyAgICBmb3IgKDs7KSB7DQorICAgICAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgICAgICBjYXNlIFRPS211bDoNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGUyID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LbXVsLCBlMSwgZTIpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGNhc2UgVE9LZGl2Og0KKyAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgZTIgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbihsaW5lLCBUT0tkaXYsIGUxLCBlMik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgICAgICAgICAgICBlMSA9IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZVVuYXJ5RXhwcmVzc2lvbigpDQorew0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgICBjYXNlIFRPS3BsdXM6DQorICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgZSA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNUG9zRXhwcmVzc2lvbihsaW5lLCBlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS21pbnVzOg0KKyAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgIGUgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTU5lZ0V4cHJlc3Npb24obGluZSwgZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0trc25vdDoNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBlID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Ob3RFeHByZXNzaW9uKGxpbmUsIGUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgZSA9IFBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgICAgY2FzZSBUT0tudW1iZXI6DQorICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9Lc3RyaW5nOg0KKyAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24obGluZSwgbV9wVG9rZW4tPm1fd3N0cmluZyk7DQorICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS2lkZW50aWZpZXI6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllcihtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgICAgICAgICBpZihzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIE5VTEwsIFRPS2RvdCwgd3NJZGVudGlmaWVyLCBzKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKGxpbmUsIHdzSWRlbnRpZmllcik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS2lmOg0KKyAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LbnVsbDoNCisgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1OdWxsRXhwcmVzc2lvbihsaW5lKTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LbHBhcmVuOg0KKyAgICAgICAgICAgIGUgPSBQYXJzZVBhcmVuRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBlID0gUGFyc2VQb3N0RXhwcmVzc2lvbihlKTsNCisgICAgaWYgKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpIHsNCisgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgZSA9IDA7DQorICAgIH0NCisgICAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpDWEZBX0ZNUGFyc2U6OlBhcnNlUG9zdEV4cHJlc3Npb24oQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUpDQorew0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIHdoaWxlICgxKSB7DQorICAgICAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgICAgICBjYXNlIFRPS2xwYXJlbjogew0KKyAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkgKnBBcnJheSA9IDA7DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXkgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXktPkFkZChlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlb2YpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIEZYX0xQQ1dTVFIod3NfVGVtcFN0cmluZykpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24obGluZSwgZSwgcEFycmF5LCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LbGJyYWNrZXQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tjYWxsLCBGWF9XU1RSQyhMIiIpLCBzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IHBBcnJheS0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwVGVtcCA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKXBBcnJheS0+R2V0QXQoaSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBBcnJheTsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFRPS2RvdDoNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB0ZW1wU3RyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRlbXBMaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xwYXJlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwQWNjZXNzb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHBDYWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFeHBBY2Nlc3NvciA9IGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5ICpwQXJyYXkgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXkgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmV4cCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGQoZXhwKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhUT0tycGFyZW4pLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcElkZW50aWZpZXIgPSBGWF9ORVcgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubih0ZW1wTGluZSwgdGVtcFN0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHBDYWxsID0gRlhfTkVXIENYRkFfRk1DYWxsRXhwcmVzc2lvbihsaW5lLCBwSWRlbnRpZmllciwgcEFycmF5LCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24obGluZSwgcEV4cEFjY2Vzc29yLCBwRXhwQ2FsbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LY2FsbCwgRlhfV1NUUkMoTCIiKSwgcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBwQXJyYXktPkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwVGVtcCA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKXBBcnJheS0+R2V0QXQoaSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFRlbXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBBcnJheTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgczsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24odGVtcExpbmUsIGUsIFRPS2RvdCwgdGVtcFN0ciwgcyk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gRlhfTkVXIENYRkFfRk1JbmRleEV4cHJlc3Npb24odGVtcExpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBOVUxMLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIGUsIFRPS2RvdCwgdGVtcFN0ciwgcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgVE9LZG90ZG90Og0KKyAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LaWRlbnRpZmllcikgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHRlbXBTdHIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGVtcExpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKHRlbXBMaW5lLCBlLCBUT0tkb3Rkb3QsIHRlbXBTdHIsIHMpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgTlVMTCwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tkb3Rkb3QsIHRlbXBTdHIsIHMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwgIEZYX0xQQ1dTVFIod3NfVGVtcFN0cmluZykpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBUT0tkb3RzY3JlYW06DQorICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tpZGVudGlmaWVyKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MgdGVtcFN0ciA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgczsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24odGVtcExpbmUsIGUsIFRPS2RvdHNjcmVhbSwgdGVtcFN0ciwgcyk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gRlhfTkVXIENYRkFfRk1JbmRleEV4cHJlc3Npb24odGVtcExpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBOVUxMLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIGUsIFRPS2RvdHNjcmVhbSwgdGVtcFN0ciwgcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLCAgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFRPS2RvdHN0YXI6IHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gRlhfTkVXIENYRkFfRk1JbmRleEV4cHJlc3Npb24obGluZSwgQUNDRVNTT1JfTk9fSU5ERVgsIE5VTEwsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tkb3RzdGFyLCBGWF9XU1RSQyhMIioiKSwgcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIGU7DQorICAgICAgICB9DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKkNYRkFfRk1QYXJzZTo6UGFyc2VJbmRleEV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAgPSAwOw0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IDA7DQorICAgIFhGQV9GTV9BY2Nlc3NvckluZGV4IGFjY2Vzc29ySW5kZXggPSBBQ0NFU1NPUl9OT19SRUxBVElWRUlOREVYOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0ttdWwpIHsNCisgICAgICAgIHBFeHAgPSBGWF9ORVcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbihsaW5lLCBhY2Nlc3NvckluZGV4LCBzLCBUUlVFKTsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcmJyYWNrZXQpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoVE9LcnBhcmVuKSwgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgICAgICAgICAgaWYgKHBFeHApIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBFeHA7DQorICAgICAgICAgICAgICAgIHBFeHAgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwRXhwOw0KKyAgICB9DQorICAgIGlmKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcGx1cykgew0KKyAgICAgICAgYWNjZXNzb3JJbmRleCA9IEFDQ0VTU09SX1BPU0lUSVZFX0lOREVYOw0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgIH0gZWxzZSBpZihtX3BUb2tlbi0+bV90eXBlID09IFRPS21pbnVzKSB7DQorICAgICAgICBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfTkVHQVRJVkVfSU5ERVg7DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgfQ0KKyAgICBzID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JicmFja2V0KSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhUT0tycGFyZW4pLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgZGVsZXRlIHM7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1JbmRleEV4cHJlc3Npb24obGluZSwgYWNjZXNzb3JJbmRleCwgcywgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiBwRXhwOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VQYXJlbkV4cHJlc3Npb24oKQ0KK3sNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxID0gMCwgKnBFeHAyID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBDaGVjayhUT0tscGFyZW4pOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgIHBFeHAxID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQorICAgICAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0thc3NpZ24pIHsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIHBFeHAxID0gRlhfTkVXIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKGxpbmUsIFRPS2Fzc2lnbiwgcEV4cDEsIHBFeHAyKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkZWxldGUgcEV4cDE7DQorICAgICAgICAgICAgICAgIHBFeHAxID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDaGVjayhUT0tycGFyZW4pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgIH0NCisgICAgcmV0dXJuIHBFeHAxOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VCbG9ja0V4cHJlc3Npb24oKQ0KK3sNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgIENGWF9QdHJBcnJheSAqIGV4cHJlc3Npb24gPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICAgIHdoaWxlICgxKSB7DQorICAgICAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgICAgICBjYXNlIFRPS2VvZjoNCisgICAgICAgICAgICBjYXNlIFRPS2VuZGlmOg0KKyAgICAgICAgICAgIGNhc2UgVE9LZWxzZWlmOg0KKyAgICAgICAgICAgIGNhc2UgVE9LZWxzZToNCisgICAgICAgICAgICBjYXNlIFRPS2VuZHdoaWxlOg0KKyAgICAgICAgICAgIGNhc2UgVE9LZW5kZm9yOg0KKyAgICAgICAgICAgIGNhc2UgVE9LZW5kOg0KKyAgICAgICAgICAgIGNhc2UgVE9LZW5kZnVuYzoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBUT0tmdW5jOg0KKyAgICAgICAgICAgICAgICBlID0gUGFyc2VGdW5jdGlvbigpOw0KKyAgICAgICAgICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi0+QWRkKGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGUgPSBQYXJzZUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgaWYgKGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENYRkFfRk1CbG9ja0V4cHJlc3Npb24gKnBFeHAgPSAwOw0KKyAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcEV4cCA9IEZYX05FVyBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKGxpbmUsIGV4cHJlc3Npb24pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfSU5UMzIgc2l6ZSA9IGV4cHJlc3Npb24tPkdldFNpemUoKTsNCisgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgICAgIHdoaWxlKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKilleHByZXNzaW9uLT5HZXRBdChpbmRleCk7DQorICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICAgIGV4cHJlc3Npb24tPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIGV4cHJlc3Npb247DQorICAgICAgICBleHByZXNzaW9uID0gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gcEV4cDsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlSWZFeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwcmVzc2lvbiA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uCSpwSWZFeHByZXNzaW9uID0gMDsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gICpwRWxzZUV4cHJlc3Npb24gPSAwOw0KKyAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgIEZYX0xQQ1dTVFIgcFN0YXJ0UG9zID0gbV9sZXhlci0+U2F2ZVBvcygpOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgQ2hlY2soVE9LbHBhcmVuKTsNCisgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICBpZiAocEV4cHJlc3Npb24pIHsNCisgICAgICAgICAgICBkZWxldGUgcEV4cHJlc3Npb247DQorICAgICAgICB9DQorICAgICAgICBwRXhwcmVzc2lvbiA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ2hlY2soVE9LcnBhcmVuKTsNCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LdGhlbikgew0KKyAgICAgICAgaWYgKHBFeHByZXNzaW9uKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBFeHByZXNzaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9sZXhlci0+U2V0Q3VycmVudExpbmUobGluZSk7DQorICAgICAgICBtX3BUb2tlbiA9IEZYX05FVyBDWEZBX0ZNVG9rZW4obGluZSk7DQorICAgICAgICBtX3BUb2tlbi0+bV90eXBlID0gVE9LaWRlbnRpZmllcjsNCisgICAgICAgIG1fcFRva2VuLT5tX3dzdHJpbmcgPSBGWF9XU1RSQyhMImlmIik7DQorICAgICAgICBtX2xleGVyLT5TZXRUb2tlbihtX3BUb2tlbik7DQorICAgICAgICBtX2xleGVyLT5SZXN0b3JlUG9zKHBTdGFydFBvcyk7DQorICAgICAgICByZXR1cm4gUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICAgIH0NCisgICAgQ2hlY2soVE9LdGhlbik7DQorICAgIHBJZkV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgIGNhc2UgVE9LZW9mOg0KKyAgICAgICAgY2FzZSBUT0tlbmRpZjoNCisgICAgICAgICAgICBDaGVjayhUT0tlbmRpZik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS2lmOg0KKyAgICAgICAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlSWZFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgQ2hlY2soVE9LZW5kaWYpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0tlbHNlaWY6DQorICAgICAgICAgICAgcEVsc2VFeHByZXNzaW9uID0gUGFyc2VJZkV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LZWxzZToNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBwRWxzZUV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIENoZWNrKFRPS2VuZGlmKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lGRU5ELCAgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ1hGQV9GTUlmRXhwcmVzc2lvbiAqcEV4cCA9IDA7DQorICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1JZkV4cHJlc3Npb24obGluZSwgcEV4cHJlc3Npb24sIHBJZkV4cHJlc3Npb24sIHBFbHNlRXhwcmVzc2lvbik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAocEV4cHJlc3Npb24pIHsNCisgICAgICAgICAgICBkZWxldGUgcEV4cHJlc3Npb247DQorICAgICAgICB9DQorICAgICAgICBpZiAocElmRXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwSWZFeHByZXNzaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBFbHNlRXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwRWxzZUV4cHJlc3Npb247DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBFeHA7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZVdoaWxlRXhwcmVzc2lvbigpDQorew0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQ29uZGl0aW9uID0gMDsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKnBFeHByZXNzaW9uID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgcENvbmRpdGlvbiA9IFBhcnNlUGFyZW5FeHByZXNzaW9uKCk7DQorICAgIENoZWNrKFRPS2RvKTsNCisgICAgcEV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgICBDaGVjayhUT0tlbmR3aGlsZSk7DQorICAgIGlmICghbV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgaWYgKHBDb25kaXRpb24pIHsNCisgICAgICAgICAgICBkZWxldGUgcENvbmRpdGlvbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCisgICAgICAgIH0NCisgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgZSA9IDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1XaGlsZUV4cHJlc3Npb24obGluZSwgcENvbmRpdGlvbiwgcEV4cHJlc3Npb24pOw0KKyAgICB9DQorICAgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VTdWJhc3NpZ25tZW50SW5Gb3JFeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICAgIGNhc2UgVE9LaWRlbnRpZmllcjoNCisgICAgICAgICAgICBlID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9VTkVYUEVDVEVEX0VYUFJFU1NJT04sIEZYX0xQQ1dTVFIod3NfVGVtcFN0cmluZykpOw0KKyAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VGb3JFeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFyaWFudDsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBc3NpZ25tZW50ID0gMDsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBY2Nlc3NvciA9IDA7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwU3RlcCA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCA9IDA7DQorICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgICAgTmV4dFRva2VuKCk7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKG1fcFRva2VuLT5tX3R5cGUpLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgfQ0KKyAgICB3c1ZhcmlhbnQgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgaWYoIG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIHBBc3NpZ25tZW50ID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhtX3BUb2tlbi0+bV90eXBlKSwgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaURpcmVjdGlvbiA9IDA7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3VwdG8pIHsNCisgICAgICAgIGlEaXJlY3Rpb24gPSAxOw0KKyAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZG93bnRvKSB7DQorICAgICAgICBpRGlyZWN0aW9uID0gLTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgKEZYX0xQQ1dTVFIpKEwidXB0byBvciBkb3dudG8iKSwgKEZYX0xQQ1dTVFIpd3NfVGVtcFN0cmluZyk7DQorICAgIH0NCisgICAgTmV4dFRva2VuKCk7DQorICAgIHBBY2Nlc3NvciA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tzdGVwKSB7DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIHBTdGVwID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgIH0NCisgICAgQ2hlY2soVE9LZG8pOw0KKyAgICBwTGlzdCA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQorICAgIENoZWNrKFRPS2VuZGZvcik7DQorICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Gb3JFeHByZXNzaW9uKGxpbmUsIHdzVmFyaWFudCwgcEFzc2lnbm1lbnQsIHBBY2Nlc3NvciwgaURpcmVjdGlvbiwgcFN0ZXAsIHBMaXN0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChwQXNzaWdubWVudCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwQXNzaWdubWVudDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQWNjZXNzb3IpIHsNCisgICAgICAgICAgICBkZWxldGUgcEFjY2Vzc29yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBTdGVwKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBTdGVwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBMaXN0KSB7DQorICAgICAgICAgICAgZGVsZXRlIHBMaXN0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpDQorew0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXI7DQorICAgIENGWF9QdHJBcnJheSAqcEFjY2Vzc29ycyA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCA9IDA7DQorICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgICAgTmV4dFRva2VuKCk7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKG1fcFRva2VuLT5tX3R5cGUpLCBGWF9MUENXU1RSKHdzX1RlbXBTdHJpbmcpKTsNCisgICAgfQ0KKyAgICB3c0lkZW50aWZpZXIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgQ2hlY2soVE9LaW4pOw0KKyAgICBDaGVjayhUT0tscGFyZW4pOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwgRlhfTFBDV1NUUih3c19UZW1wU3RyaW5nKSk7DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBBY2Nlc3NvcnMgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICAgICAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgICAgIHBBY2Nlc3NvcnMtPkFkZChzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsNCisgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ2hlY2soVE9LcnBhcmVuKTsNCisgICAgfQ0KKyAgICBDaGVjayhUT0tkbyk7DQorICAgIHBMaXN0ID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgICAgQ2hlY2soVE9LZW5kZm9yKTsNCisgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKGxpbmUsIHdzSWRlbnRpZmllciwgcEFjY2Vzc29ycywgcExpc3QpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBBY2Nlc3NvcnMpIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IDA7DQorICAgICAgICAgICAgRlhfSU5UMzIgc2l6ZSA9IHBBY2Nlc3NvcnMtPkdldFNpemUoKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgICAgICAgICAgd2hpbGUoaW5kZXggPCBzaXplKSB7DQorICAgICAgICAgICAgICAgIHMgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKilwQWNjZXNzb3JzLT5HZXRBdChpbmRleCk7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBzOw0KKyAgICAgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQWNjZXNzb3JzLT5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICBkZWxldGUgcEFjY2Vzc29yczsNCisgICAgICAgICAgICBwQWNjZXNzb3JzID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwTGlzdCkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwTGlzdDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRG9FeHByZXNzaW9uKCkNCit7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCisgICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgZSA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQorICAgIENoZWNrKFRPS2VuZCk7DQorICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb0V4cHJlc3Npb24obGluZSwgZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBkZWxldGUgZTsNCisgICAgICAgIGUgPSAwOw0KKyAgICB9DQorICAgIHJldHVybiBlOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkZjY1MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtcGFyc2UuaApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GTV9QQVJTRV9IDQorI2RlZmluZSBfWEZBX0ZNX1BBUlNFX0gNCitjbGFzcyBDWEZBX0ZNUGFyc2UgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1QYXJzZSgpOw0KKyAgICB+Q1hGQV9GTVBhcnNlKCk7DQorICAgIEZYX0lOVDMyIEluaXQoRlhfV1NUUiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvICpwRXJyb3JJbmZvKTsNCisgICAgdm9pZCBOZXh0VG9rZW4oKTsNCisgICAgdm9pZCBDaGVjayhYRkFfRk1fVE9LRU4gb3ApOw0KKyAgICB2b2lkIEVycm9yKEZYX0RXT1JEIGxpbmVOdW0sIFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pOw0KKyAgICBDRlhfUHRyQXJyYXkgKiBQYXJzZVRvcEV4cHJlc3Npb24oKTsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKlBhcnNlRnVuY3Rpb24oKTsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKlBhcnNlRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VWYXJFeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICpQYXJzZUV4cEV4cHJlc3Npb24oKTsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKlBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1FeHByZXNzaW9uICpQYXJzZUlmRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VXaGlsZUV4cHJlc3Npb24oKTsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24gKlBhcnNlRm9yRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VEb0V4cHJlc3Npb24oKTsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlUGFyZW5FeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlU3ViYXNzaWdubWVudEluRm9yRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZUVxdWFsaXR5RXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZVByaW1hcnlFeHByZXNzaW9uKCk7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZVBvc3RFeHByZXNzaW9uKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplKTsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQorcHJpdmF0ZToNCisgICAgRlhfTFBDV1NUUiBtX3BTY3JpcHQ7DQorICAgIEZYX1NUUlNJWkUgbV91TGVuZ3RoOw0KKyAgICBDWEZBX0ZNTGV4ZXIJKm1fbGV4ZXI7DQorICAgIENYRkFfRk1Ub2tlbgkqbV9wVG9rZW47DQorICAgIENYRkFfRk1FcnJvckluZm8gKm1fcEVycm9ySW5mbzsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDhkNzM0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuY3BwCkBAIC0wLDAgKzEsNTg5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCitzdHJ1Y3QgWEZBX0ZNRENoYXIgew0KKyAgICBzdGF0aWMgRlhfTFBDV1NUUiBpbmMoRlhfTFBDV1NUUiAmcCkNCisgICAgew0KKyAgICAgICAgKytwOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgIH0NCisgICAgc3RhdGljIEZYX0xQQ1dTVFIgZGVjKEZYX0xQQ1dTVFIgJnApDQorICAgIHsNCisgICAgICAgIC0tcDsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICB9DQorICAgIHN0YXRpYyBGWF9VSU5UMTYgZ2V0KEZYX0xQQ1dTVFIgcCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICpwOw0KKyAgICB9DQorICAgIHN0YXRpYyBGWF9CT09MIGlzV2hpdGVTcGFjZShGWF9MUENXU1RSIHApDQorICAgIHsNCisgICAgICAgIHJldHVybiAoKnApID09IDB4MDkgfHwgKCpwKSA9PSAweDBiIHx8ICgqcCkgPT0gMHgwYyB8fCAoKnApID09IDB4MjA7DQorICAgIH0NCisgICAgc3RhdGljIEZYX0JPT0wgaXNMaW5lVGVybWluYXRvcihGWF9MUENXU1RSIHApDQorICAgIHsNCisgICAgICAgIHJldHVybiAqcCA9PSAweDBBIHx8ICpwID09IDB4MEQ7DQorICAgIH0NCisgICAgc3RhdGljIEZYX0JPT0wgaXNCaW5hcnkoRlhfTFBDV1NUUiBwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKCpwKSA+PSAnMCcgJiYgKCpwKSA8PSAnMSc7DQorICAgIH0NCisgICAgc3RhdGljIEZYX0JPT0wgaXNPY3RhbChGWF9MUENXU1RSIHApDQorICAgIHsNCisgICAgICAgIHJldHVybiAoKnApID49ICcwJyAmJiAoKnApIDw9ICc3JzsNCisgICAgfQ0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc0RpZ2l0YWwoRlhfTFBDV1NUUiBwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKCpwKSA+PSAnMCcgJiYgKCpwKSA8PSAnOSc7DQorICAgIH0NCisgICAgc3RhdGljIEZYX0JPT0wgaXNIZXgoRlhfTFBDV1NUUiBwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gaXNEaWdpdGFsKHApIHx8ICgoKnApID49ICdhJyAmJiAoKnApIDw9ICdmJykgfHwgKCgqcCkgPj0gJ0EnICYmICgqcCkgPD0gJ0YnKTsNCisgICAgfQ0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc0FscGhhKEZYX0xQQ1dTVFIgcCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuICgoKnApIDw9ICd6JyAmJiAoKnApID49ICdhJykgfHwgKCgqcCkgPD0gJ1onICYmICgqcCkgPj0gJ0EnKTsNCisgICAgfQ0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc0F2YWxpZChGWF9MUENXU1RSIHAsIEZYX0JPT0wgZmxhZyA9IDApOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBzdHJpbmcybnVtYmVyKEZYX0xQQ1dTVFIgcywgRlhfRE9VQkxFICpwVmFsdWUsIEZYX0xQQ1dTVFIgJnBFbmQpOw0KKyAgICBzdGF0aWMgRlhfQk9PTCBpc1VuaWNvZGVBbHBoYShGWF9VSU5UMTYgY2gpOw0KK307DQoraW5saW5lIEZYX0JPT0wgWEZBX0ZNRENoYXI6OmlzQXZhbGlkKEZYX0xQQ1dTVFIgcCwgRlhfQk9PTCBmbGFnKQ0KK3sNCisgICAgaWYgKCpwID09IDApIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmICgoKnAgPD0gMHgwQSAmJiAqcCA+PSAweDA5KSB8fCAqcCA9PSAweDBEIHx8ICgqcCA8PSAweGQ3ZmYgJiYgKnAgPj0gMHgyMCkgfHwgKCpwIDw9IDB4ZmZmZCAmJiAqcCA+PSAweGUwMDApKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBpZiAoIWZsYWcpIHsNCisgICAgICAgIGlmICgqcCA9PSAweDBCIHx8ICpwID09IDB4MEMpIHsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQoraW5saW5lIEZYX0JPT0wgWEZBX0ZNRENoYXI6OnN0cmluZzJudW1iZXIoRlhfTFBDV1NUUiBzLCBGWF9ET1VCTEUgKnBWYWx1ZSwgRlhfTFBDV1NUUiAmcEVuZCkNCit7DQorICAgIGlmIChzKSB7DQorICAgICAgICAqcFZhbHVlID0gd2NzdG9kKCh3Y2hhcl90ICopcywgKHdjaGFyX3QgKiopJnBFbmQpOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitpbmxpbmUgRlhfQk9PTCBYRkFfRk1EQ2hhcjo6aXNVbmljb2RlQWxwaGEoRlhfVUlOVDE2IGNoKQ0KK3sNCisgICAgaWYgKGNoID09IDAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkgfHwgY2ggPT0gMHgwQiB8fCBjaCA9PSAweDBDIHx8IGNoID09IDB4MjAgfHwgY2ggPT0gJy4nDQorICAgICAgICAgICAgfHwgY2ggPT0gJzsnIHx8IGNoID09ICciJyB8fCBjaCA9PSAnPScgfHwgY2ggPT0gJzwnIHx8IGNoID09ICc+JyB8fCBjaCA9PSAnLCcgfHwgY2ggPT0gJygnIHx8IGNoID09ICcpJw0KKyAgICAgICAgICAgIHx8IGNoID09ICddJyB8fCBjaCA9PSAnWycgfHwgY2ggPT0gJyYnIHx8IGNoID09ICd8JyB8fCBjaCA9PSAnKycgfHwgY2ggPT0gJy0nIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnLycpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBYRkFfRk1LZXl3b3JkIGtleVdvcmRzW10gPSB7DQorICAgIHtUT0thbmQsCQkweDAwMDAwMDI2LAkJKEZYX0xQQ1dTVFIpKEwiJiIpfSwNCisgICAge1RPS2xwYXJlbiwJCTB4MDAwMDAwMjgsCQkoRlhfTFBDV1NUUikoTCIoIil9LA0KKyAgICB7VE9LcnBhcmVuLAkJMHgwMDAwMDAyOSwJCShGWF9MUENXU1RSKShMIikiKX0sDQorICAgIHtUT0ttdWwsCQkweDAwMDAwMDJhLAkJKEZYX0xQQ1dTVFIpKEwiKiIpfSwNCisgICAge1RPS3BsdXMsCQkweDAwMDAwMDJiLAkJKEZYX0xQQ1dTVFIpKEwiKyIpfSwNCisgICAge1RPS2NvbW1hLAkJMHgwMDAwMDAyYywJCShGWF9MUENXU1RSKShMIiwiKX0sDQorICAgIHtUT0ttaW51cywJCTB4MDAwMDAwMmQsCQkoRlhfTFBDV1NUUikoTCItIil9LA0KKyAgICB7VE9LZG90LAkJMHgwMDAwMDAyZSwJCShGWF9MUENXU1RSKShMIi4iKX0sDQorICAgIHtUT0tkaXYsCQkweDAwMDAwMDJmLAkJKEZYX0xQQ1dTVFIpKEwiLyIpfSwNCisgICAge1RPS2x0LAkJCTB4MDAwMDAwM2MsCQkoRlhfTFBDV1NUUikoTCI8Iil9LA0KKyAgICB7VE9LYXNzaWduLAkJMHgwMDAwMDAzZCwJCShGWF9MUENXU1RSKShMIj0iKX0sDQorICAgIHtUT0tndCwJCQkweDAwMDAwMDNlLAkJKEZYX0xQQ1dTVFIpKEwiPiIpfSwNCisgICAge1RPS2xicmFja2V0LAkweDAwMDAwMDViLAkJKEZYX0xQQ1dTVFIpKEwiWyIpfSwNCisgICAge1RPS3JicmFja2V0LAkweDAwMDAwMDVkLAkJKEZYX0xQQ1dTVFIpKEwiXSIpfSwNCisgICAge1RPS29yLAkJCTB4MDAwMDAwN2MsCQkoRlhfTFBDV1NUUikoTCJ8Iil9LA0KKyAgICB7VE9LZG90c2NyZWFtLAkweDAwMDBlYzExLAkJKEZYX0xQQ1dTVFIpKEwiLiMiKX0sDQorICAgIHtUT0tkb3RzdGFyLAkweDAwMDBlYzE4LAkJKEZYX0xQQ1dTVFIpKEwiLioiKX0sDQorICAgIHtUT0tkb3Rkb3QsCQkweDAwMDBlYzFjLAkJKEZYX0xQQ1dTVFIpKEwiLi4iKX0sDQorICAgIHtUT0tsZSwJCQkweDAwMDEzM2Y5LAkJKEZYX0xQQ1dTVFIpKEwiPD0iKX0sDQorICAgIHtUT0tuZSwJCQkweDAwMDEzM2ZhLAkJKEZYX0xQQ1dTVFIpKEwiPD4iKX0sDQorICAgIHtUT0tlcSwJCQkweDAwMDEzOTFhLAkJKEZYX0xQQ1dTVFIpKEwiPT0iKX0sDQorICAgIHtUT0tnZSwJCQkweDAwMDEzZTNiLAkJKEZYX0xQQ1dTVFIpKEwiPj0iKX0sDQorICAgIHtUT0tkbywJCQkweDAwMDIwMTUzLAkJKEZYX0xQQ1dTVFIpKEwiZG8iKX0sDQorICAgIHtUT0trc2VxLAkJMHgwMDAyMDY3NiwJCShGWF9MUENXU1RSKShMImVxIil9LA0KKyAgICB7VE9La3NnZSwJCTB4MDAwMjEwYWMsCQkoRlhfTFBDV1NUUikoTCJnZSIpfSwNCisgICAge1RPS2tzZ3QsCQkweDAwMDIxMGJiLAkJKEZYX0xQQ1dTVFIpKEwiZ3QiKX0sDQorICAgIHtUT0tpZiwJCQkweDAwMDIxYWVmLAkJKEZYX0xQQ1dTVFIpKEwiaWYiKX0sDQorICAgIHtUT0tpbiwJCQkweDAwMDIxYWY3LAkJKEZYX0xQQ1dTVFIpKEwiaW4iKX0sDQorICAgIHtUT0trc2xlLAkJMHgwMDAyMmE1MSwJCShGWF9MUENXU1RSKShMImxlIil9LA0KKyAgICB7VE9La3NsdCwJCTB4MDAwMjJhNjAsCQkoRlhfTFBDV1NUUikoTCJsdCIpfSwNCisgICAge1RPS2tzbmUsCQkweDAwMDIzNDkzLAkJKEZYX0xQQ1dTVFIpKEwibmUiKX0sDQorICAgIHtUT0trc29yLAkJMHgwMDAyMzljMSwJCShGWF9MUENXU1RSKShMIm9yIil9LA0KKyAgICB7VE9LbnVsbCwJCTB4MDUyOTMxYmIsCQkoRlhfTFBDV1NUUikoTCJudWxsIil9LA0KKyAgICB7VE9LYnJlYWssCQkweDA1NTE4YzI1LAkJKEZYX0xQQ1dTVFIpKEwiYnJlYWsiKX0sDQorICAgIHtUT0trc2FuZCwJCTB4MDlmOWRiMzMsCQkoRlhfTFBDV1NUUikoTCJhbmQiKX0sDQorICAgIHtUT0tlbmQsCQkweDBhNjMxNDM3LAkJKEZYX0xQQ1dTVFIpKEwiZW5kIil9LA0KKyAgICB7VE9LZW9mLAkJMHgwYTYzMTk1YSwJCShGWF9MUENXU1RSKShMImVvZiIpfSwNCisgICAge1RPS2ZvciwJCTB4MGE3ZDY3YTcsCQkoRlhfTFBDV1NUUikoTCJmb3IiKX0sDQorICAgIHtUT0tuYW4sCQkweDBiNGY5MWRkLAkJKEZYX0xQQ1dTVFIpKEwibmFuIil9LA0KKyAgICB7VE9La3Nub3QsCQkweDBiNGZkOWIxLAkJKEZYX0xQQ1dTVFIpKEwibm90Iil9LA0KKyAgICB7VE9LdmFyLAkJMHgwYzIyMDNlOSwJCShGWF9MUENXU1RSKShMInZhciIpfSwNCisgICAge1RPS3RoZW4sCQkweDJkNTczOGNmLAkJKEZYX0xQQ1dTVFIpKEwidGhlbiIpfSwNCisgICAge1RPS2Vsc2UsCQkweDQ1ZjY1ZWU5LAkJKEZYX0xQQ1dTVFIpKEwiZWxzZSIpfSwNCisgICAge1RPS2V4aXQsCQkweDQ3MzFkNmJhLAkJKEZYX0xQQ1dTVFIpKEwiZXhpdCIpfSwNCisgICAge1RPS2Rvd250bywJCTB4NGNhYWRjM2IsCQkoRlhfTFBDV1NUUikoTCJkb3dudG8iKX0sDQorICAgIHtUT0tyZXR1cm4sCQkweDRkYjhiZDYwLAkJKEZYX0xQQ1dTVFIpKEwicmV0dXJuIil9LA0KKyAgICB7VE9LaW5maW5pdHksCTB4NWMwYTAxMGEsCQkoRlhfTFBDV1NUUikoTCJpbmZpbml0eSIpfSwNCisgICAge1RPS2VuZHdoaWxlLAkweDVjNjRiZmYwLAkJKEZYX0xQQ1dTVFIpKEwiZW5kd2hpbGUiKX0sDQorICAgIHtUT0tmb3JlYWNoLAkweDY3ZTMxZjM4LAkJKEZYX0xQQ1dTVFIpKEwiZm9yZWFjaCIpfSwNCisgICAge1RPS2VuZGZ1bmMsCTB4NjhmOTg0YTMsCQkoRlhfTFBDV1NUUikoTCJlbmRmdW5jIil9LA0KKyAgICB7VE9LZWxzZWlmLAkJMHg3ODI1MzIxOCwJCShGWF9MUENXU1RSKShMImVsc2VpZiIpfSwNCisgICAge1RPS3doaWxlLAkJMHg4NDIyOTI1OSwJCShGWF9MUENXU1RSKShMIndoaWxlIil9LA0KKyAgICB7VE9LZW5kZm9yLAkJMHg4YWI0OWQ3ZSwJCShGWF9MUENXU1RSKShMImVuZGZvciIpfSwNCisgICAge1RPS3Rocm93LAkJMHg4ZGIwNWM5NCwJCShGWF9MUENXU1RSKShMInRocm93Iil9LA0KKyAgICB7VE9Lc3RlcCwJCTB4YTdhNzg4N2MsCQkoRlhfTFBDV1NUUikoTCJzdGVwIil9LA0KKyAgICB7VE9LdXB0bywJCTB4YjUxNTUzMjgsCQkoRlhfTFBDV1NUUikoTCJ1cHRvIil9LA0KKyAgICB7VE9LY29udGludWUsCTB4YzAzNDA2ODUsCQkoRlhfTFBDV1NUUikoTCJjb250aW51ZSIpfSwNCisgICAge1RPS2Z1bmMsCQkweGNkY2U2MGVjLAkJKEZYX0xQQ1dTVFIpKEwiZnVuYyIpfSwNCisgICAge1RPS2VuZGlmLAkJMHhlMGU4ZmVlNiwJCShGWF9MUENXU1RSKShMImVuZGlmIil9LA0KK307DQorc3RhdGljIGNvbnN0IEZYX1dPUkQgS0VZV09SRF9TVEFSVCA9IFRPS2RvOw0KK3N0YXRpYyBjb25zdCBGWF9XT1JEIEtFWVdPUkRfRU5EID0gVE9LZW5kaWY7DQorRlhfTFBDV1NUUiBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFhGQV9GTV9UT0tFTiBvcCkNCit7DQorICAgIHJldHVybiBrZXlXb3Jkc1tvcF0ubV9rZXdvcmQ7DQorfQ0KK0NYRkFfRk1Ub2tlbjo6Q1hGQV9GTVRva2VuKCkNCit7DQorICAgIG1fdHlwZSA9IFRPS3Jlc2VydmVyOw0KKyAgICBtX3VMaW5lbnVtID0gMTsNCisgICAgbV9wTmV4dCA9IDA7DQorfQ0KK0NYRkFfRk1Ub2tlbjo6Q1hGQV9GTVRva2VuKCBGWF9EV09SRCB1TGluZU51bSApDQorew0KKyAgICBtX3R5cGUgPSBUT0tyZXNlcnZlcjsNCisgICAgbV91TGluZW51bSA9IHVMaW5lTnVtOw0KKyAgICBtX3BOZXh0ID0gMDsNCit9DQorQ1hGQV9GTVRva2VuOjp+Q1hGQV9GTVRva2VuKCkNCit7DQorfQ0KK0NYRkFfRk1MZXhlcjo6Q1hGQV9GTUxleGVyKEZYX1dTVFIgd3NGb3JtQ2FsYywgQ1hGQV9GTUVycm9ySW5mbyAqcEVycm9ySW5mbykNCit7DQorICAgIG1fcFNjcmlwdCA9IHdzRm9ybUNhbGMuR2V0UHRyKCk7DQorICAgIG1fdUxlbmd0aCA9IHdzRm9ybUNhbGMuR2V0TGVuZ3RoKCk7DQorICAgIG1fdUN1cnJlbnRMaW5lID0gMTsNCisgICAgbV9wdHIgPSBtX3BTY3JpcHQ7DQorICAgIG1fcFRva2VuID0gMDsNCisgICAgbV9wRXJyb3JJbmZvID0gcEVycm9ySW5mbzsNCit9DQorQ1hGQV9GTVRva2VuICpDWEZBX0ZNTGV4ZXI6Ok5leHRUb2tlbigpDQorew0KKyAgICBDWEZBX0ZNVG9rZW4gKnQgPSAwOw0KKyAgICBpZiAoIW1fcFRva2VuKSB7DQorICAgICAgICBtX3BUb2tlbiA9IFNjYW4oKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV9wTmV4dCkgew0KKyAgICAgICAgICAgIHQgPSBtX3BUb2tlbi0+bV9wTmV4dDsNCisgICAgICAgICAgICBkZWxldGUgbV9wVG9rZW47DQorICAgICAgICAgICAgbV9wVG9rZW4gPSB0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB0ID0gbV9wVG9rZW47DQorICAgICAgICAgICAgbV9wVG9rZW4gPSBTY2FuKCk7DQorICAgICAgICAgICAgZGVsZXRlIHQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFRva2VuOw0KK30NCitDWEZBX0ZNVG9rZW4gKiBDWEZBX0ZNTGV4ZXI6OlNjYW4oKQ0KK3sNCisgICAgRlhfVUlOVDE2IGNoID0gMDsNCisgICAgQ1hGQV9GTVRva2VuICogcCA9IEZYX05FVyBDWEZBX0ZNVG9rZW4obV91Q3VycmVudExpbmUpOw0KKyAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgfQ0KKyAgICBpbnQgaVJldCA9IDA7DQorICAgIHdoaWxlICgxKSB7DQorICAgICAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tlb2Y7DQorICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgIGNhc2UgMHgwQToNCisgICAgICAgICAgICAgICAgKyttX3VDdXJyZW50TGluZTsNCisgICAgICAgICAgICAgICAgcC0+bV91TGluZW51bSA9IG1fdUN1cnJlbnRMaW5lOw0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAweDBEOg0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnOyc6IHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0xQQ1dTVFIgcFRlbXAgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgQ29tbWVudChtX3B0ciwgcFRlbXApOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICciJzogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfTFBDV1NUUiBwVGVtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tzdHJpbmc7DQorICAgICAgICAgICAgICAgICAgICBpUmV0ID0gU3RyaW5nKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICBjYXNlICcwJzoNCisgICAgICAgICAgICBjYXNlICcxJzoNCisgICAgICAgICAgICBjYXNlICcyJzoNCisgICAgICAgICAgICBjYXNlICczJzoNCisgICAgICAgICAgICBjYXNlICc0JzoNCisgICAgICAgICAgICBjYXNlICc1JzoNCisgICAgICAgICAgICBjYXNlICc2JzoNCisgICAgICAgICAgICBjYXNlICc3JzoNCisgICAgICAgICAgICBjYXNlICc4JzoNCisgICAgICAgICAgICBjYXNlICc5Jzogew0KKyAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbnVtYmVyOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfTFBDV1NUUiBwVGVtcCA9IDA7DQorICAgICAgICAgICAgICAgICAgICBpUmV0ID0gTnVtYmVyKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICAgICAgICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9CQURfU1VGRklYX05VTUJFUik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgY2FzZSAnPSc6DQorICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tlcTsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LYXNzaWduOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJzwnOg0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS25lOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsdDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICc+JzoNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc9Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2dlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tndDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcsJzoNCisgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LY29tbWE7DQorICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbHBhcmVuOw0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgY2FzZSAnKSc6DQorICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS3JwYXJlbjsNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgIGNhc2UgJ1snOg0KKyAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsYnJhY2tldDsNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgIGNhc2UgJ10nOg0KKyAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tyYnJhY2tldDsNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgIGNhc2UgJyYnOg0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LYW5kOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICBjYXNlICd8JzoNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS29yOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICBjYXNlICcrJzoNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS3BsdXM7DQorICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgIGNhc2UgJy0nOg0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbWludXM7DQorICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgIGNhc2UgJyonOg0KKyAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbXVsOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcvJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ1dTVFIgcFRlbXAgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQobV9wdHIsIHBUZW1wKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkaXY7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLic6DQorICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkb3Rkb3Q7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdHN0YXI7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcjJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdHNjcmVhbTsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS251bWJlcjsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENXU1RSIHBUZW1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6ZGVjKG1fcHRyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpUmV0ID0gTnVtYmVyKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9CQURfU1VGRklYX05VTUJFUik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkb3Q7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICAgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIDB4MDk6DQorICAgICAgICAgICAgY2FzZSAweDBCOg0KKyAgICAgICAgICAgIGNhc2UgMHgwQzoNCisgICAgICAgICAgICBjYXNlIDB4MjA6DQorICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICBGWF9MUENXU1RSIHBUZW1wID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGlSZXQgPSBJZGVudGlmaWVycyhwLCBtX3B0ciwgcFRlbXApOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBJc0tleXdvcmQocC0+bV93c3RyaW5nKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9EV09SRCBDWEZBX0ZNTGV4ZXI6Ok51bWJlcihDWEZBX0ZNVG9rZW4gKnQsIEZYX0xQQ1dTVFIgcCwgRlhfTFBDV1NUUiAmcEVuZCkNCit7DQorICAgIEZYX0RPVUJMRSBudW1iZXIgPSAwOw0KKyAgICBpZiAoWEZBX0ZNRENoYXI6OnN0cmluZzJudW1iZXIocCwgJm51bWJlciwgcEVuZCkpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmIChwRW5kICYmIFhGQV9GTURDaGFyOjppc0FscGhhKHBFbmQpKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocCwgKHBFbmQgLSBwKSk7DQorICAgIHJldHVybiAwOw0KK30NCitGWF9EV09SRCBDWEZBX0ZNTGV4ZXI6OlN0cmluZyhDWEZBX0ZNVG9rZW4gKnQsIEZYX0xQQ1dTVFIgcCwgRlhfTFBDV1NUUiAmcEVuZCkNCit7DQorICAgIEZYX0xQQ1dTVFIgcFN0YXJ0ID0gcDsNCisgICAgRlhfVUlOVDE2IGNoID0gMDsNCisgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICB3aGlsZSAoY2gpIHsNCisgICAgICAgIGlmICghWEZBX0ZNRENoYXI6OmlzQXZhbGlkKHApKSB7DQorICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICAgICAgICAgIHBFbmQgPSBwOw0KKyAgICAgICAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICAgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoID09ICciJykgew0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICAgICAgICAgICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsNCisgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICAgICAgICAgICAgICBwRW5kID0gcDsNCisgICAgICAgICAgICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCisgICAgICAgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsNCisgICAgICAgICAgICAgICAgZ290byBORVhUOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCitORVhUOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgICAgfQ0KKyAgICBwRW5kID0gcDsNCisgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRk1MZXhlcjo6SWRlbnRpZmllcnMoQ1hGQV9GTVRva2VuICp0LCBGWF9MUENXU1RSIHAsIEZYX0xQQ1dTVFIgJnBFbmQpDQorew0KKyAgICBGWF9MUENXU1RSIHBTdGFydCA9IHA7DQorICAgIEZYX1VJTlQxNiBjaCA9IDA7DQorICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsNCisgICAgICAgIHBFbmQgPSBwOw0KKyAgICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCisgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgICAgd2hpbGUgKGNoKSB7DQorICAgICAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChwKSkgew0KKyAgICAgICAgICAgIHBFbmQgPSBwOw0KKyAgICAgICAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICAgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc1VuaWNvZGVBbHBoYShjaCkpIHsNCisgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwRW5kID0gcDsNCisgICAgICAgICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBFbmQgPSBwOw0KKyAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KKyAgICByZXR1cm4gMDsNCit9DQordm9pZCBDWEZBX0ZNTGV4ZXI6OkNvbW1lbnQoIEZYX0xQQ1dTVFIgcCwgRlhfTFBDV1NUUiAmcEVuZCApDQorew0KKyAgICB1bnNpZ25lZCBjaCA9IDA7DQorICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgICAgd2hpbGUgKGNoKSB7DQorICAgICAgICBpZiAoY2ggPT0gMHgwRCkgew0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICAgICAgICAgICAgcEVuZCA9IHA7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoID09IDB4MEEpIHsNCisgICAgICAgICAgICArK21fdUN1cnJlbnRMaW5lOw0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICAgICAgICAgICAgcEVuZCA9IHA7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgICAgfQ0KKyAgICBwRW5kID0gcDsNCit9DQorWEZBX0ZNX1RPS0VOIENYRkFfRk1MZXhlcjo6SXNLZXl3b3JkKEZYX1dTVFIgc3RyKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHN0ci5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDMyIHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoc3RyLkdldFB0cigpLCBpTGVuZ3RoLCBUUlVFKTsNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gS0VZV09SRF9TVEFSVCwgaUVuZCA9IEtFWVdPUkRfRU5EOw0KKyAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgWEZBX0ZNS2V5d29yZCBrZXl3b3JkOw0KKyAgICBkbyB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIGtleXdvcmQgPSBrZXlXb3Jkc1tpTWlkXTsNCisgICAgICAgIGlmICh1SGFzaCA9PSBrZXl3b3JkLm1fdUhhc2gpIHsNCisgICAgICAgICAgICByZXR1cm4ga2V5d29yZC5tX3R5cGU7DQorICAgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwga2V5d29yZC5tX3VIYXNoKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gVE9LaWRlbnRpZmllcjsNCit9DQorQ1hGQV9GTUxleGVyOjp+Q1hGQV9GTUxleGVyKCkNCit7DQorICAgIG1fcFNjcmlwdCA9IDA7DQorICAgIG1fcHRyID0gbV9wU2NyaXB0Ow0KKyAgICBpZiAobV9wVG9rZW4pIHsNCisgICAgICAgIENYRkFfRk1Ub2tlbiAqdDEgPSBtX3BUb2tlbjsNCisgICAgICAgIENYRkFfRk1Ub2tlbiAqdDIgPSB0MS0+bV9wTmV4dDsNCisgICAgICAgIHdoaWxlICh0Mikgew0KKyAgICAgICAgICAgIGRlbGV0ZSB0MTsNCisgICAgICAgICAgICB0MSA9IHQyOw0KKyAgICAgICAgICAgIHQyID0gdDItPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgICBkZWxldGUgbV9wVG9rZW47DQorICAgICAgICBtX3BUb2tlbiA9IDA7DQorICAgIH0NCisgICAgbV9wRXJyb3JJbmZvID0gMDsNCit9DQordm9pZCBDWEZBX0ZNTGV4ZXI6OkVycm9yKFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pDQorew0KKyAgICBtX3BFcnJvckluZm8tPmxpbmVudW0gPSBtX3VDdXJyZW50TGluZTsNCisgICAgRlhfTFBDV1NUUiBscE1lc3NhZ2VJbmZvID0gWEZBX0ZNX0Vycm9yTXNnKG1zZyk7DQorICAgIHZhX2xpc3QgYXA7DQorICAgIHZhX3N0YXJ0KGFwLCBtc2cpOw0KKyAgICBtX3BFcnJvckluZm8tPm1lc3NhZ2UuRm9ybWF0VihscE1lc3NhZ2VJbmZvLCBhcCk7DQorICAgIHZhX2VuZChhcCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTUxleGVyOjpIYXNFcnJvcigpIGNvbnN0DQorew0KKyAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5oIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDczY2ViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuaApAQCAtMCwwICsxLDgyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GTV9MRVhFUl9IDQorI2RlZmluZSBfWEZBX0ZNX0xFWEVSX0gNCitlbnVtIFhGQV9GTV9UT0tFTiB7DQorICAgIFRPS2FuZCwgVE9LbHBhcmVuLCBUT0tycGFyZW4sIFRPS211bCwgVE9LcGx1cywgVE9LY29tbWEsIFRPS21pbnVzLCBUT0tkb3QsIFRPS2RpdiwgVE9LbHQsDQorICAgIFRPS2Fzc2lnbiwgVE9LZ3QsIFRPS2xicmFja2V0LCBUT0tyYnJhY2tldCwgVE9Lb3IsIFRPS2RvdHNjcmVhbSwgVE9LZG90c3RhciwgVE9LZG90ZG90LA0KKyAgICBUT0tsZSwgVE9LbmUsIFRPS2VxLCBUT0tnZSwNCisgICAgVE9LZG8sIFRPS2tzZXEsIFRPS2tzZ2UsIFRPS2tzZ3QsIFRPS2lmLCBUT0tpbiwgVE9La3NsZSwgVE9La3NsdCwgVE9La3NuZSwgVE9La3NvciwgVE9LbnVsbCwNCisgICAgVE9LYnJlYWssIFRPS2tzYW5kLCBUT0tlbmQsIFRPS2VvZiwgVE9LZm9yLCBUT0tuYW4sIFRPS2tzbm90LCBUT0t2YXIsIFRPS3RoZW4sIFRPS2Vsc2UsIFRPS2V4aXQsDQorICAgIFRPS2Rvd250bywgVE9LcmV0dXJuLCBUT0tpbmZpbml0eSwgVE9LZW5kd2hpbGUsIFRPS2ZvcmVhY2gsIFRPS2VuZGZ1bmMsIFRPS2Vsc2VpZiwgVE9Ld2hpbGUsDQorICAgIFRPS2VuZGZvciwgVE9LdGhyb3csIFRPS3N0ZXAsIFRPS3VwdG8sIFRPS2NvbnRpbnVlLCBUT0tmdW5jLCBUT0tlbmRpZiwNCisgICAgVE9Lc3RhciwNCisgICAgVE9LaWRlbnRpZmllciwgVE9LdW5kZXJzY29yZSwgVE9LZG9sbGFyLCBUT0tleGNsYW1hdGlvbiwNCisgICAgVE9LY2FsbCwNCisgICAgVE9Lc3RyaW5nLA0KKyAgICBUT0tudW1iZXIsDQorICAgIFRPS3Jlc2VydmVyDQorfTsNCitzdHJ1Y3QgWEZBX0ZNS2V5d29yZCB7DQorICAgIFhGQV9GTV9UT0tFTgltX3R5cGU7DQorICAgIEZYX1VJTlQzMgkJbV91SGFzaDsNCisgICAgRlhfTFBDV1NUUgkJbV9rZXdvcmQ7DQorfTsNCitGWF9MUENXU1RSIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoWEZBX0ZNX1RPS0VOIG9wKTsNCitjbGFzcyBDWEZBX0ZNVG9rZW4gOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Ub2tlbigpOw0KKyAgICBDWEZBX0ZNVG9rZW4oRlhfRFdPUkQgdUxpbmVOdW0pOw0KKyAgICB+Q1hGQV9GTVRva2VuKCk7DQorICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzdHJpbmc7DQorICAgIFhGQV9GTV9UT0tFTgltX3R5cGU7DQorICAgIEZYX0RXT1JECQltX3VMaW5lbnVtOw0KKyAgICBDWEZBX0ZNVG9rZW4qCW1fcE5leHQ7DQorfTsNCitjbGFzcyBDWEZBX0ZNTGV4ZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1MZXhlcihGWF9XU1RSIHdzRm9ybWNhbGMsIENYRkFfRk1FcnJvckluZm8gKnBFcnJvckluZm8pOw0KKyAgICB+Q1hGQV9GTUxleGVyKCk7DQorICAgIENYRkFfRk1Ub2tlbioJTmV4dFRva2VuKCk7DQorICAgIEZYX0RXT1JECQlOdW1iZXIoQ1hGQV9GTVRva2VuICp0LCBGWF9MUENXU1RSIHAsICBGWF9MUENXU1RSICZwRW5kKTsNCisgICAgRlhfRFdPUkQJCVN0cmluZyhDWEZBX0ZNVG9rZW4gKnQsIEZYX0xQQ1dTVFIgcCwgRlhfTFBDV1NUUiAmcEVuZCk7DQorICAgIEZYX0RXT1JECQlJZGVudGlmaWVycyhDWEZBX0ZNVG9rZW4gKnQsIEZYX0xQQ1dTVFIgcCwgRlhfTFBDV1NUUiAmcEVuZCk7DQorICAgIHZvaWQJCQlDb21tZW50KEZYX0xQQ1dTVFIgcCwgRlhfTFBDV1NUUiAmcEVuZCk7DQorICAgIFhGQV9GTV9UT0tFTglJc0tleXdvcmQoRlhfV1NUUiBwKTsNCisgICAgdm9pZAkJCVNldEN1cnJlbnRMaW5lKEZYX0RXT1JEIGxpbmUpDQorICAgIHsNCisgICAgICAgIG1fdUN1cnJlbnRMaW5lID0gbGluZTsNCisgICAgfQ0KKyAgICB2b2lkCQkJU2V0VG9rZW4oQ1hGQV9GTVRva2VuICpwVG9rZW4pDQorICAgIHsNCisgICAgICAgIGlmIChtX3BUb2tlbikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBtX3BUb2tlbjsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFRva2VuID0gcFRva2VuOw0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIJCVNhdmVQb3MoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wdHI7DQorICAgIH0NCisgICAgdm9pZAkJCVJlc3RvcmVQb3MoRlhfTFBDV1NUUiBwUG9zKQ0KKyAgICB7DQorICAgICAgICBtX3B0ciA9IHBQb3M7DQorICAgIH0NCisgICAgdm9pZAkJCUVycm9yKFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pOw0KKyAgICBGWF9CT09MCQkJSGFzRXJyb3IoKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfRk1Ub2tlbioJU2NhbigpOw0KKyAgICBGWF9MUENXU1RSCQltX3BTY3JpcHQ7DQorICAgIEZYX0xQQ1dTVFIJCW1fcHRyOw0KKyAgICBGWF9TVFJTSVpFCQltX3VMZW5ndGg7DQorICAgIEZYX0RXT1JECQltX3VDdXJyZW50TGluZTsNCisgICAgQ1hGQV9GTVRva2VuKgltX3BUb2tlbjsNCisgICAgQ1hGQV9GTUVycm9ySW5mbyogbV9wRXJyb3JJbmZvOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjkxZTdhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQorQ1hGQV9GTVByb2dyYW06OkNYRkFfRk1Qcm9ncmFtKCkNCisgICAgOiBtX2dsb2JhbEZ1bmN0aW9uKDApDQorew0KK30NCitDWEZBX0ZNUHJvZ3JhbTo6fkNYRkFfRk1Qcm9ncmFtKCkNCit7DQorICAgIGlmIChtX2dsb2JhbEZ1bmN0aW9uICE9IDApIHsNCisgICAgICAgIGRlbGV0ZSBtX2dsb2JhbEZ1bmN0aW9uOw0KKyAgICAgICAgbV9nbG9iYWxGdW5jdGlvbiA9IDA7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ1hGQV9GTVByb2dyYW06OkluaXQoRlhfV1NUUiB3c0Zvcm1jYWxjKQ0KK3sNCisgICAgcmV0dXJuIG1fcGFyc2UuSW5pdCh3c0Zvcm1jYWxjLCAmbV9wRXJyb3JJbmZvKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9GTVByb2dyYW06OlBhcnNlUHJvZ3JhbSgpDQorew0KKyAgICBDRlhfUHRyQXJyYXkgKiBleHByZXNzaW9ucyA9IDA7DQorICAgIG1fcGFyc2UuTmV4dFRva2VuKCk7DQorICAgIGlmICghbV9wRXJyb3JJbmZvLm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgZXhwcmVzc2lvbnMgPSBtX3BhcnNlLlBhcnNlVG9wRXhwcmVzc2lvbigpOw0KKyAgICBpZiAoIW1fcEVycm9ySW5mby5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiB1ID0gMDsgdSA8IGV4cHJlc3Npb25zLT5HZXRTaXplKCk7ICsrdSkgew0KKyAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKilleHByZXNzaW9ucy0+R2V0QXQodSk7DQorICAgICAgICAgICAgaWYgKGUpIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVsZXRlIGV4cHJlc3Npb25zOw0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIG1fZ2xvYmFsRnVuY3Rpb24gPSBGWF9ORVcgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigxLCAxLCBGWF9XU1RSQyhMIiIpLCAwLCBleHByZXNzaW9ucyk7DQorICAgIHJldHVybiAwOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZNUHJvZ3JhbTo6VHJhbnNsYXRlUHJvZ3JhbShDRlhfV2lkZVRleHRCdWYgJndzSmF2YVNjcmlwdCkNCit7DQorICAgIG1fZ2xvYmFsRnVuY3Rpb24tPlRvSmF2YVNjcmlwdCh3c0phdmFTY3JpcHQpOw0KKyAgICB3c0phdmFTY3JpcHQuQXBwZW5kQ2hhcigwKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uaCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBhZjVlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0ZNX1BST0dSQU1fSA0KKyNkZWZpbmUgX1hGQV9GTV9QUk9HUkFNX0gNCitjbGFzcyBDWEZBX0ZNUHJvZ3JhbSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTVByb2dyYW0oKTsNCisgICAgfkNYRkFfRk1Qcm9ncmFtKCk7DQorICAgIEZYX0lOVDMyIEluaXQoRlhfV1NUUiB3c0Zvcm1jYWxjKTsNCisgICAgRlhfSU5UMzIgUGFyc2VQcm9ncmFtKCk7DQorICAgIEZYX0lOVDMyIFRyYW5zbGF0ZVByb2dyYW0oQ0ZYX1dpZGVUZXh0QnVmICZ3c0phdmFTY3JpcHQpOw0KKyAgICBDWEZBX0ZNRXJyb3JJbmZvJiBHZXRFcnJvcigpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BFcnJvckluZm87DQorICAgIH0NCitwcml2YXRlOg0KKyAgICBDWEZBX0ZNRXJyb3JJbmZvIG1fcEVycm9ySW5mbzsNCisgICAgQ1hGQV9GTVBhcnNlCW1fcGFyc2U7DQorICAgIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24gKm1fZ2xvYmFsRnVuY3Rpb247DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDlmMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmNwcApAQCAtMCwwICsxLDc1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQorc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc19scFN0ckV4cEZ1bmNOYW1lW10gPSB7DQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuYXNzaWduX3ZhbHVlX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUubG9naWNhbF9vcl9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmxvZ2ljYWxfYW5kX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZXF1YWxpdHlfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5ub3RlcXVhbGl0eV9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmxlc3Nfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5sZXNzZXF1YWxfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5ncmVhdGVyX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZ3JlYXRlcmVxdWFsX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUucGx1c19vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLm1pbnVzX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUubXVsdGlwbGVfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5kaXZpZGVfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5wb3NpdGl2ZV9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLm5lZ2F0aXZlX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUubG9naWNhbF9ub3Rfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS4iKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5kb3RfYWNjZXNzb3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5kb3Rkb3RfYWNjZXNzb3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5jb25jYXRfZm1fb2JqZWN0IiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuaXNfZm1fb2JqZWN0IiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuaXNfZm1fYXJyYXkiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5nZXRfZm1fdmFsdWUiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5nZXRfZm1fanNvYmoiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5mbV92YXJfZmlsdGVyIiksDQorfTsNCitDRlhfV2lkZVN0cmluZ0MgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhYRkFfRk1fU2ltcGxlRXhwcmVzc2lvblR5cGUgc2ltcGxlRXhwVHlwZSkNCit7DQorICAgIHJldHVybiBnc19scFN0ckV4cEZ1bmNOYW1lW3NpbXBsZUV4cFR5cGVdOw0KK30NCitzdGF0aWMgWEZBX0ZNQnVpbGRJbkZ1bmMgYnVpbGRJbkZ1bmNzW10gPSB7DQorICAgIHsweDAwMDFmMWY1LCAoRlhfTFBDV1NUUilMIkF0In0sDQorICAgIHsweDAwMDIwYjljLCAoRlhfTFBDV1NUUilMIkZWIn0sDQorICAgIHsweDAwMDIxYWVmLCAoRlhfTFBDV1NUUilMIklmIn0sDQorICAgIHsweDAwMDIzZWU2LCAoRlhfTFBDV1NUUilMIlBWIn0sDQorICAgIHsweDA0YjVjOWVlLCAoRlhfTFBDV1NUUilMIkVuY29kZSJ9LA0KKyAgICB7MHgwOGU5NjY4NSwgKEZYX0xQQ1dTVFIpTCJEYXRlRm10In0sDQorICAgIHsweDA5Zjk5ZGI2LCAoRlhfTFBDV1NUUilMIkFicyJ9LA0KKyAgICB7MHgwOWY5ZTU4MywgKEZYX0xQQ1dTVFIpTCJBcHIifSwNCisgICAgezB4MDlmYTA0M2UsIChGWF9MUENXU1RSKUwiQXZnIn0sDQorICAgIHsweDBhOTc4MmEwLCAoRlhfTFBDV1NUUilMIkdldCJ9LA0KKyAgICB7MHgwYjFiMDlkZiwgKEZYX0xQQ1dTVFIpTCJMZW4ifSwNCisgICAgezB4MGIzNTQzYTYsIChGWF9MUENXU1RSKUwiTWF4In0sDQorICAgIHsweDBiMzU2Y2E0LCAoRlhfTFBDV1NUUilMIk1pbiJ9LA0KKyAgICB7MHgwYjM1OGI2MCwgKEZYX0xQQ1dTVFIpTCJNb2QifSwNCisgICAgezB4MGI0ZmRlZDQsIChGWF9MUENXU1RSKUwiTlBWIn0sDQorICAgIHsweDBiODQ2YmYxLCAoRlhfTFBDV1NUUilMIlBtdCJ9LA0KKyAgICB7MHgwYjg0OTRmOSwgKEZYX0xQQ1dTVFIpTCJQdXQifSwNCisgICAgezB4MGJiOGRmNWQsIChGWF9MUENXU1RSKUwiUmVmIn0sDQorICAgIHsweDBiZDM3YTk5LCAoRlhfTFBDV1NUUilMIlN0ciJ9LA0KKyAgICB7MHgwYmQzN2ZiNSwgKEZYX0xQQ1dTVFIpTCJTdW0ifSwNCisgICAgezB4MTA0ODQ2OWIsIChGWF9MUENXU1RSKUwiQ3Rlcm0ifSwNCisgICAgezB4MTFlMDM2NjAsIChGWF9MUENXU1RSKUwiRXhpc3RzIn0sDQorICAgIHsweDEyNjIzNmU2LCAoRlhfTFBDV1NUUilMIlBvc3QifSwNCisgICAgezB4MTI3YzY2NjEsIChGWF9MUENXU1RSKUwiUFBtdCJ9LA0KKyAgICB7MHgxOTNhZGUzZSwgKEZYX0xQQ1dTVFIpTCJSaWdodCJ9LA0KKyAgICB7MHgxZWM4YWIyYywgKEZYX0xQQ1dTVFIpTCJSYXRlIn0sDQorICAgIHsweDIwZTQ3NmRjLCAoRlhfTFBDV1NUUilMIklzb1RpbWUyTnVtIn0sDQorICAgIHsweDIzZWI2ODE2LCAoRlhfTFBDV1NUUilMIlRpbWVGbXQifSwNCisgICAgezB4MjRmYjE3YjAsIChGWF9MUENXU1RSKUwiTG9jYWxEYXRlRm10In0sDQorICAgIHsweDI4ZGVlNmU5LCAoRlhfTFBDV1NUUilMIkZvcm1hdCJ9LA0KKyAgICB7MHgyZDA4OTBiOCwgKEZYX0xQQ1dTVFIpTCJUZXJtIn0sDQorICAgIHsweDJkNzFiMDBmLCAoRlhfTFBDV1NUUilMIlRpbWUifSwNCisgICAgezB4MmY4OTBmYjEsIChGWF9MUENXU1RSKUwiTnVtMlRpbWUifSwNCisgICAgezB4Mzc2NzUxMWQsIChGWF9MUENXU1RSKUwiQ2VpbCJ9LA0KKyAgICB7MHgzZmZkMTk0MSwgKEZYX0xQQ1dTVFIpTCJMb2NhbFRpbWVGbXQifSwNCisgICAgezB4NDQyZjY4YzgsIChGWF9MUENXU1RSKUwiUm91bmQifSwNCisgICAgezB4NDZmZDExMjgsIChGWF9MUENXU1RSKUwiRXZhbCJ9LA0KKyAgICB7MHg0ZDYyOTQ0MCwgKEZYX0xQQ1dTVFIpTCJEYXRlMk51bSJ9LA0KKyAgICB7MHg0ZGNmMjVmOCwgKEZYX0xQQ1dTVFIpTCJDb25jYXQifSwNCisgICAgezB4NGUwMDI1NWQsIChGWF9MUENXU1RSKUwiVW5pdFZhbHVlIn0sDQorICAgIHsweDU1YTVjYzI5LCAoRlhfTFBDV1NUUilMIkxvd2VyIn0sDQorICAgIHsweDVlNDNlMDRjLCAoRlhfTFBDV1NUUilMIldvcmROdW0ifSwNCisgICAgezB4NjIwY2U2YmEsIChGWF9MUENXU1RSKUwiSXBtdCJ9LA0KKyAgICB7MHg2ZjU0NGQ0OSwgKEZYX0xQQ1dTVFIpTCJDb3VudCJ9LA0KKyAgICB7MHg3ZTI0MTAxMywgKEZYX0xQQ1dTVFIpTCJXaXRoaW4ifSwNCisgICAgezB4OWI5YTZlMmIsIChGWF9MUENXU1RSKUwiSXNvRGF0ZTJOdW0ifSwNCisgICAgezB4YjJjOTQxYzIsIChGWF9MUENXU1RSKUwiVW5pdFR5cGUifSwNCisgICAgezB4YjU5OGExZjcsIChGWF9MUENXU1RSKUwiVXVpZCJ9LA0KKyAgICB7MHhiZGU5YWJkZSwgKEZYX0xQQ1dTVFIpTCJEYXRlIn0sDQorICAgIHsweGMwMDEwYjgwLCAoRlhfTFBDV1NUUilMIk51bTJEYXRlIn0sDQorICAgIHsweGMxZjYxNDRjLCAoRlhfTFBDV1NUUilMIlVwcGVyIn0sDQorICAgIHsweGM0NDAyOGY3LCAoRlhfTFBDV1NUUilMIk9uZW9mIn0sDQorICAgIHsweGM2MmMxYjJjLCAoRlhfTFBDV1NUUilMIlNwYWNlIn0sDQorICAgIHsweGQwZmY1MGY5LCAoRlhfTFBDV1NUUilMIkhhc1ZhbHVlIn0sDQorICAgIHsweGQxNTM3MDQyLCAoRlhfTFBDV1NUUilMIkZsb29yIn0sDQorICAgIHsweGQyYWM5Y2YxLCAoRlhfTFBDV1NUUilMIlRpbWUyTnVtIn0sDQorICAgIHsweGQ5MDdhZWU1LCAoRlhfTFBDV1NUUilMIk51bTJHTVRpbWUifSwNCisgICAgezB4ZGYyNGY3YzQsIChGWF9MUENXU1RSKUwiRGVjb2RlIn0sDQorICAgIHsweGUyNjY0ODAzLCAoRlhfTFBDV1NUUilMIlN1YnN0ciJ9LA0KKyAgICB7MHhlM2U3YjUyOCwgKEZYX0xQQ1dTVFIpTCJTdHVmZiJ9LA0KKyAgICB7MHhlNjc5MmQ0ZSwgKEZYX0xQQ1dTVFIpTCJSdHJpbSJ9LA0KKyAgICB7MHhlOGMyM2Y1YiwgKEZYX0xQQ1dTVFIpTCJQYXJzZSJ9LA0KKyAgICB7MHhlYTE4ZDEyMSwgKEZYX0xQQ1dTVFIpTCJDaG9vc2UifSwNCisgICAgezB4ZWJmZWY2OWMsIChGWF9MUENXU1RSKUwiUmVwbGFjZSJ9LA0KKyAgICB7MHhmNWFkNzgyYiwgKEZYX0xQQ1dTVFIpTCJMZWZ0In0sDQorICAgIHsweGY3YmIyMjQ4LCAoRlhfTFBDV1NUUilMIkx0cmltIn0sDQorfTsNCitzdGF0aWMgY29uc3QgWEZBX0ZNU09NTWV0aG9kIGdzX0ZNU29tTWV0aG9kc1tdID0gew0KKyAgICB7MHgwMDAwMDA2OCwgKEZYX0xQQ1dTVFIpTCJoIiwJCQkJMHgwMX0sDQorICAgIHsweDAwMDAwMDc3LCAoRlhfTFBDV1NUUilMInciLAkJCQkweDAxfSwNCisgICAgezB4MDAwMDAwNzgsIChGWF9MUENXU1RSKUwieCIsCQkJCTB4MDF9LA0KKyAgICB7MHgwMDAwMDA3OSwgKEZYX0xQQ1dTVFIpTCJ5IiwJCQkJMHgwMX0sDQorICAgIHsweDA1ZWI1YjBmLCAoRlhfTFBDV1NUUilMInBhZ2VTcGFuIiwJCTB4MDF9LA0KKyAgICB7MHgxMGYxYjFiZCwgKEZYX0xQQ1dTVFIpTCJwYWdlIiwJCQkweDAxfSwNCisgICAgezB4M2JmMWMyYTUsIChGWF9MUENXU1RSKUwiYWJzUGFnZVNwYW4iLAkweDAxfSwNCisgICAgezB4M2M3NTI0OTUsIChGWF9MUENXU1RSKUwidmVyaWZ5IiwJCQkweDBkfSwNCisgICAgezB4NDRjMzUyYWQsIChGWF9MUENXU1RSKUwiZm9ybU5vZGVzIiwJCTB4MDF9LA0KKyAgICB7MHg1Nzc1YzJjYywgKEZYX0xQQ1dTVFIpTCJhYnNQYWdlSW5CYXRjaCIsCTB4MDF9LA0KKyAgICB7MHg1ZWUwMDk5NiwgKEZYX0xQQ1dTVFIpTCJzZXRFbGVtZW50IiwJCTB4MDF9LA0KKyAgICB7MHg3MDMzYmZkNSwgKEZYX0xQQ1dTVFIpTCJpbnNlcnQiLAkJCTB4MDN9LA0KKyAgICB7MHg4YzVmZWIzMiwgKEZYX0xQQ1dTVFIpTCJzaGVldEluQmF0Y2giLAkweDAxfSwNCisgICAgezB4OGYzYTgzNzksIChGWF9MUENXU1RSKUwic2hlZXQiLAkJCTB4MDF9LA0KKyAgICB7MHg5MmRhZGE0ZiwgKEZYX0xQQ1dTVFIpTCJzYXZlRmlsdGVyZWRYTUwiLCAweDAxfSwNCisgICAgezB4OWNhYjdjYWUsIChGWF9MUENXU1RSKUwicmVtb3ZlIiwJCQkweDAxfSwNCisgICAgezB4YTY4NjM1ZjEsIChGWF9MUENXU1RSKUwic2lnbiIsCQkJMHg2MX0sDQorICAgIHsweGFhYzI0MWM4LCAoRlhfTFBDV1NUUilMImlzUmVjb3JkR3JvdXAiLAkweDAxfSwNCisgICAgezB4ZDhlZDE0NjcsIChGWF9MUENXU1RSKUwiY2xlYXIiLAkJCTB4MDF9LA0KKyAgICB7MHhkYTEyZTUxOCwgKEZYX0xQQ1dTVFIpTCJhcHBlbmQiLAkJCTB4MDF9LA0KKyAgICB7MHhlNzRmMDY1MywgKEZYX0xQQ1dTVFIpTCJhYnNQYWdlIiwJCTB4MDF9LA0KK307DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OkNYRkFfRk1TaW1wbGVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCkNCisgICAgOiBtX2xpbmUobGluZSksDQorICAgICAgbV9vcChvcCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KK30NCit2b2lkIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQore30NCitYRkFfRk1fVE9LRU4gQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OkdldE9wZXJhdG9yVG9rZW4oKWNvbnN0DQorew0KKyAgICByZXR1cm4gbV9vcDsNCit9DQorQ1hGQV9GTU51bGxFeHByZXNzaW9uOjpDWEZBX0ZNTnVsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSkNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCAgVE9LbnVsbCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTU51bGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIm51bGwiKTsNCit9DQorQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OkNYRkFfRk1OdW1iZXJFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c051bWJlcikNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tudW1iZXIpLCBtX3dzTnVtYmVyKHdzTnVtYmVyKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgbV93c051bWJlcjsNCit9DQorQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb246OkNYRkFfRk1TdHJpbmdFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c1N0cmluZykNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tzdHJpbmcpLA0KKyAgICAgIG1fd3NTdHJpbmcod3NTdHJpbmcpDQorew0KK30NCit2b2lkIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcFN0ciA9IG1fd3NTdHJpbmc7DQorICAgIGlmICh0ZW1wU3RyLkdldExlbmd0aCgpID4gMikgew0KKyAgICAgICAgamF2YXNjcmlwdC5BcHBlbmRDaGFyKEwnXCInKTsNCisgICAgICAgIEZYX1dDSEFSIG9uZUNoYXI7DQorICAgICAgICBmb3IgKEZYX0lOVDE2IGkgPSAxOyBpIDwgdGVtcFN0ci5HZXRMZW5ndGgoKSAtIDE7IGkrKykgew0KKyAgICAgICAgICAgIG9uZUNoYXIgPSB0ZW1wU3RyW2ldOw0KKyAgICAgICAgICAgIHN3aXRjaCAob25lQ2hhcikgew0KKyAgICAgICAgICAgICAgICBjYXNlIEwnXCInOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcXFwiIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAweDBkOg0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgMHgwYTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcXG4iKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdC5BcHBlbmRDaGFyKG9uZUNoYXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgamF2YXNjcmlwdC5BcHBlbmRDaGFyKEwnXCInKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcFN0cjsNCisgICAgfQ0KK30NCitDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uOjpDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIpDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9LaWRlbnRpZmllciksIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllcikNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBTdHIgPSBtX3dzSWRlbnRpZmllcjsNCisgICAgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkIikpKSB7DQorICAgICAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ0aGlzIik7DQorICAgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiEiKSkpIHsNCisgICAgICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS5kYXRhc2V0cyIpOw0KKyAgICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkZGF0YSIpKSkgew0KKyAgICAgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmRhdGFzZXRzLmRhdGEiKTsNCisgICAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGV2ZW50IikpKSB7DQorICAgICAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuZXZlbnQiKTsNCisgICAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGZvcm0iKSkpIHsNCisgICAgICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS5mb3JtIik7DQorICAgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRob3N0IikpKSB7DQorICAgICAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuaG9zdCIpOw0KKyAgICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkbGF5b3V0IikpKSB7DQorICAgICAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEubGF5b3V0Iik7DQorICAgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiR0ZW1wbGF0ZSIpKSkgew0KKyAgICAgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLnRlbXBsYXRlIik7DQorICAgIH0gZWxzZSBpZiAodGVtcFN0clswXSA9PSBMJyEnKSB7DQorICAgICAgICB0ZW1wU3RyID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIHRlbXBTdHIuTWlkKDEpOw0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcFN0cjsNCisgICAgcmV0dXJuOw0KK30NCitDWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjpDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHApDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLCBtX3BFeHAocEV4cCkNCit7DQorfQ0KK0NYRkFfRk1VbmFyeUV4cHJlc3Npb246On5DWEZBX0ZNVW5hcnlFeHByZXNzaW9uKCkNCit7DQorICAgIGlmIChtX3BFeHAgIT0gMCkgew0KKyAgICAgICAgZGVsZXRlIG1fcEV4cDsNCisgICAgICAgIG1fcEV4cCA9IDA7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCit9DQorQ1hGQV9GTUJpbkV4cHJlc3Npb246OkNYRkFfRk1CaW5FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KKyAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIG9wKSwNCisgICAgICBtX3BFeHAxKHBFeHAxKSwNCisgICAgICBtX3BFeHAyKHBFeHAyKQ0KK3sNCit9DQorQ1hGQV9GTUJpbkV4cHJlc3Npb246On5DWEZBX0ZNQmluRXhwcmVzc2lvbigpDQorew0KKyAgICBpZiAobV9wRXhwMSAhPSAwKSB7DQorICAgICAgICBkZWxldGUgbV9wRXhwMTsNCisgICAgICAgIG1fcEV4cDEgPSAwOw0KKyAgICB9DQorICAgIGlmIChtX3BFeHAyICE9IDApIHsNCisgICAgICAgIGRlbGV0ZSBtX3BFeHAyOw0KKyAgICAgICAgbV9wRXhwMiA9IDA7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNQmluRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorfQ0KK0NYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAyICkNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtJU0ZNT0JKRUNUXTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSlcbntcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbn1cbiIpOw0KKyAgICBDRlhfV2lkZVRleHRCdWYgdGVtcEV4cDE7DQorICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdCh0ZW1wRXhwMSk7DQorICAgIGlmIChtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllciAmJiB0ZW1wRXhwMS5HZXRXaWRlU3RyaW5nKCkgIT0gRlhfV1NUUkMoTCJ0aGlzIikpIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG57XG4iKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcEV4cDE7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCisgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1PQkpFQ1RdOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpKVxue1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0FTU0lHTl07DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG59XG4iKTsNCisgICAgQ0ZYX1dpZGVUZXh0QnVmIHRlbXBFeHAxOw0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQodGVtcEV4cDEpOw0KKyAgICBpZiAobV9wRXhwMS0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2lkZW50aWZpZXIgJiYgdGVtcEV4cDEuR2V0V2lkZVN0cmluZygpICE9IEZYX1dTVFJDKEwidGhpcyIpKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxue1xuIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG59XG4iKTsNCisgICAgfQ0KK30NCitDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbjo6Q1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMT0dJQ0FMT1JdOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbjo6Q1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQorew0KK30NCit2b2lkIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMT0dJQ0FMQU5EXTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uOjpDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQorew0KK30NCit2b2lkIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBzd2l0Y2gobV9vcCkgew0KKyAgICAgICAgY2FzZSBUT0tlcToNCisgICAgICAgIGNhc2UgVE9La3NlcToNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRVFVQUxJVFldOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0tuZToNCisgICAgICAgIGNhc2UgVE9La3NuZToNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTk9URVFVQUxJVFldOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCit9DQorQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uOjpDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMiApDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBFeHAxLCBwRXhwMikNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgc3dpdGNoIChtX29wKSB7DQorICAgICAgICBjYXNlIFRPS2x0Og0KKyAgICAgICAgY2FzZSBUT0trc2x0Og0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMRVNTXTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LZ3Q6DQorICAgICAgICBjYXNlIFRPS2tzZ3Q6DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJdOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBUT0tsZToNCisgICAgICAgIGNhc2UgVE9La3NsZToNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTEVTU0VRVUFMXTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVE9LZ2U6DQorICAgICAgICBjYXNlIFRPS2tzZ2U6DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJFUVVBTF07DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uOjpDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQorew0KK30NCit2b2lkIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBzd2l0Y2ggKG1fb3ApIHsNCisgICAgICAgIGNhc2UgVE9LcGx1czoNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbUExVU107DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS21pbnVzOg0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtNSU5VU107DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOjpDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQorew0KK30NCit2b2lkIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBzd2l0Y2ggKG1fb3ApIHsNCisgICAgICAgIGNhc2UgVE9LbXVsOg0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtNVUxUSVBMRV07DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRPS2RpdjoNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRElWSURFXTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1Qb3NFeHByZXNzaW9uOjpDWEZBX0ZNUG9zRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cCApIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0twbHVzLCBwRXhwKQ0KK3sNCit9DQordm9pZCBDWEZBX0ZNUG9zRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCit7DQorICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtQT1NJVElWRV07DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNTmVnRXhwcmVzc2lvbjo6Q1hGQV9GTU5lZ0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAgKQ0KKyAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LbWludXMsIHBFeHApDQorew0KK30NCit2b2lkIENYRkFfRk1OZWdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW05FR0FUSVZFXTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1Ob3RFeHByZXNzaW9uOjpDWEZBX0ZNTm90RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cCApDQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0trc25vdCwgcEV4cCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTU5vdEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTk9UXTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1DYWxsRXhwcmVzc2lvbjo6Q1hGQV9GTUNhbGxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwLCBDRlhfUHRyQXJyYXkgKnBBcmd1bWVudHMsIEZYX0JPT0wgYklzU29tTWV0aG9kKQ0KKyAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LY2FsbCwgcEV4cCksDQorICAgICAgbV9wQXJndW1lbnRzKHBBcmd1bWVudHMpLA0KKyAgICAgIG1fYklzU29tTWV0aG9kKGJJc1NvbU1ldGhvZCkNCit7DQorfQ0KK0NYRkFfRk1DYWxsRXhwcmVzc2lvbjo6fkNYRkFfRk1DYWxsRXhwcmVzc2lvbigpDQorew0KKyAgICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgICAgICBGWF9JTlQzMiBhcmdjID0gbV9wQXJndW1lbnRzLT5HZXRTaXplKCk7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgICAgICB3aGlsZSAoaW5kZXggPCBhcmdjKSB7DQorICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9DQorICAgICAgICBtX3BBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIG1fcEFyZ3VtZW50czsNCisgICAgICAgIG1fcEFyZ3VtZW50cyA9IDA7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OklzQnVpbGRJbkZ1bmMoQ0ZYX1dpZGVUZXh0QnVmJiBmdW5jTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBmdW5jTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDMyIHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoZnVuY05hbWUuR2V0QnVmZmVyKCksIGlMZW5ndGgsIFRSVUUpOw0KKyAgICBYRkFfRk1CdWlsZEluRnVuYyBidWlsZGluZnVuY3Rpb247DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSAoc2l6ZW9mKGJ1aWxkSW5GdW5jcykgLyBzaXplb2YoYnVpbGRJbkZ1bmNzWzBdKSkgLSAxOw0KKyAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgZG8gew0KKyAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBidWlsZGluZnVuY3Rpb24gPSBidWlsZEluRnVuY3NbaU1pZF07DQorICAgICAgICBpZiAodUhhc2ggPT0gYnVpbGRpbmZ1bmN0aW9uLm1fdUhhc2gpIHsNCisgICAgICAgICAgICBmdW5jTmFtZS5DbGVhcigpOw0KKyAgICAgICAgICAgIGZ1bmNOYW1lIDw8IGJ1aWxkaW5mdW5jdGlvbi5tX2J1aWxkaW5mdW5jOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IGJ1aWxkaW5mdW5jdGlvbi5tX3VIYXNoKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6SXNTb21NZXRob2RXaXRoT2JqUGFyYShGWF9XU1RSIG1ldGhvZE5hbWUpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gbWV0aG9kTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgRlhfVUlOVDMyIHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcobWV0aG9kTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICAgIFhGQV9GTVNPTU1ldGhvZCBzb21NZXRob2RXaXRoT2JqUGFyYTsNCisgICAgRlhfRFdPUkQgcGFyYW1ldGVycyA9IDB4MDA7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSAoc2l6ZW9mKGdzX0ZNU29tTWV0aG9kcykgLyBzaXplb2YoZ3NfRk1Tb21NZXRob2RzWzBdKSkgLSAxOw0KKyAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgZG8gew0KKyAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBzb21NZXRob2RXaXRoT2JqUGFyYSA9IGdzX0ZNU29tTWV0aG9kc1tpTWlkXTsNCisgICAgICAgIGlmICh1SGFzaCA9PSBzb21NZXRob2RXaXRoT2JqUGFyYS5tX3VIYXNoKSB7DQorICAgICAgICAgICAgcGFyYW1ldGVycyA9IHNvbU1ldGhvZFdpdGhPYmpQYXJhLm1fZFBhcmFtZXRlcnM7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwgc29tTWV0aG9kV2l0aE9ialBhcmEubV91SGFzaCkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIHBhcmFtZXRlcnM7DQorfQ0KK3ZvaWQgQ1hGQV9GTUNhbGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgQ0ZYX1dpZGVUZXh0QnVmIGZ1bmNOYW1lOw0KKyAgICBtX3BFeHAtPlRvSmF2YVNjcmlwdChmdW5jTmFtZSk7DQorICAgIGlmIChtX2JJc1NvbU1ldGhvZCkgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgYXJnYyA9IG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgICAgICAgICBGWF9EV09SRCBtZXRob2RQYXJhID0gSXNTb21NZXRob2RXaXRoT2JqUGFyYShmdW5jTmFtZS5HZXRXaWRlU3RyaW5nKCkpOw0KKyAgICAgICAgICAgIGlmIChtZXRob2RQYXJhID4gMCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICgobWV0aG9kUGFyYSAmICgweDAxIDw8IGluZGV4KSkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dFVEZNSlNPQkpdOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICAgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBhcmdjKSB7DQorICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07DQorICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICAgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0JPT0wgaXNFdmFsRnVuYyA9IEZBTFNFOw0KKyAgICAgICAgRlhfQk9PTCBpc0V4aXN0c0Z1bmMgPSBGQUxTRTsNCisgICAgICAgIGlmIChJc0J1aWxkSW5GdW5jKGZ1bmNOYW1lKSkgew0KKyAgICAgICAgICAgIGlmIChmdW5jTmFtZS5HZXRXaWRlU3RyaW5nKCkgPT0gRlhfV1NUUkMoTCJFdmFsIikpIHsNCisgICAgICAgICAgICAgICAgaXNFdmFsRnVuYyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJldmFsLmNhbGwodGhpcywgIik7DQorICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCisgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlRyYW5zbGF0ZSIpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUuR2V0V2lkZVN0cmluZygpID09IEZYX1dTVFJDKEwiRXhpc3RzIikpIHsNCisgICAgICAgICAgICAgICAgaXNFeGlzdHNGdW5jID0gVFJVRTsNCisgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0NBTExdOw0KKyAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCisgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7DQorICAgICAgICB9DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgaWYgKGlzRXhpc3RzRnVuYykgew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcbihcbmZ1bmN0aW9uICgpXG57XG50cnlcbntcbiIpOw0KKyAgICAgICAgICAgIGlmIChtX3BBcmd1bWVudHMgJiYgIG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoMCk7DQorICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gIik7DQorICAgICAgICAgICAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbn1cbiIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gMDtcbn1cbiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiY2F0Y2goYWNjZXNzRXhjZXB0aW9ucylcbntcbnJldHVybiAwO1xufVxufVxuKS5jYWxsKHRoaXMpXG4iKTsNCisgICAgICAgIH0gZWxzZSBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgYXJnYyA9IG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gMDsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgYXJnYykgew0KKyAgICAgICAgICAgICAgICBlID0gKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICopbV9wQXJndW1lbnRzLT5HZXRBdChpbmRleCk7DQorICAgICAgICAgICAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGFyZ2MpIHsNCisgICAgICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgICAgIGlmIChpc0V2YWxGdW5jKSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uOjpDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQWNjZXNzb3IsIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwSW5kZXhFeHApDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBBY2Nlc3NvciwgcEluZGV4RXhwKSwNCisgICAgICBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpDQore30NCit2b2lkIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQorew0KKyAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRE9UXTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgaWYobV9wRXhwMSkgew0KKyAgICAgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIm51bGwiKTsNCisgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIik7DQorICAgIGlmIChtX3BFeHAxICYmIG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyKSB7DQorICAgICAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCisgICAgaWYgKG1fb3AgPT0gVE9LZG90c2NyZWFtKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIjIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCisgICAgfSBlbHNlIGlmIChtX29wID09IFRPS2RvdHN0YXIpIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIipcIiwgIik7DQorICAgIH0gZWxzZSBpZiAobV9vcCA9PSBUT0tjYWxsKSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCJcIiwgIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIsICIpOw0KKyAgICB9DQorICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCit9DQorQ1hGQV9GTUluZGV4RXhwcmVzc2lvbjo6Q1hGQV9GTUluZGV4RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4LA0KKyAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBJbmRleEV4cCwgRlhfQk9PTCBiSXNTdGFySW5kZXgpDQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0tsYnJhY2tldCwgcEluZGV4RXhwKSwNCisgICAgICBtX2FjY2Vzc29ySW5kZXgoYWNjZXNzb3JJbmRleCksDQorICAgICAgbV9iSXNTdGFySW5kZXgoYklzU3RhckluZGV4KQ0KK3t9DQordm9pZCBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgc3dpdGNoKG1fYWNjZXNzb3JJbmRleCkgew0KKyAgICAgICAgY2FzZSBBQ0NFU1NPUl9OT19JTkRFWDoNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMCIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBBQ0NFU1NPUl9OT19SRUxBVElWRUlOREVYOg0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIxIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEFDQ0VTU09SX1BPU0lUSVZFX0lOREVYOg0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIyIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEFDQ0VTU09SX05FR0FUSVZFX0lOREVYOg0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIzIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIwIik7DQorICAgIH0NCisgICAgaWYgKCFtX2JJc1N0YXJJbmRleCkgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgICBpZiAobV9wRXhwKSB7DQorICAgICAgICAgICAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIwIik7DQorICAgICAgICB9DQorICAgIH0NCit9DQorQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbjo6Q1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFjY2Vzc29yLCBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEluZGV4RXhwKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwQWNjZXNzb3IsIHBJbmRleEV4cCksDQorICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKQ0KK3t9DQordm9pZCBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RPVERPVF07DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KKyAgICBpZiAobV9wRXhwMSAmJiBtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllcikgew0KKyAgICAgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiwgIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIsICIpOw0KKyAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbjo6Q1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQWNjZXNzb3JFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcENhbGxFeHApDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgVE9LZG90LCBwQWNjZXNzb3JFeHAxLCBwQ2FsbEV4cCkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KK3sNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIihcbmZ1bmN0aW9uICgpXG57XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciBtZXRob2RfcmV0dXJuX3ZhbHVlID0gbnVsbDtcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyIGFjY2Vzc29yX29iamVjdCA9ICIpOw0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCisgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1BUlJBWV07DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoYWNjZXNzb3Jfb2JqZWN0KSlcbntcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZm9yKHZhciBpbmRleCA9IGFjY2Vzc29yX29iamVjdC5sZW5ndGggLSAxOyBpbmRleCA+IDE7IGluZGV4LS0pXG57XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIm1ldGhvZF9yZXR1cm5fdmFsdWUgPSBhY2Nlc3Nvcl9vYmplY3RbaW5kZXhdLiIpOw0KKyAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG59XG59XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2Vcbntcbm1ldGhvZF9yZXR1cm5fdmFsdWUgPSBhY2Nlc3Nvcl9vYmplY3QuIik7DQorICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbn1cbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwicmV0dXJuIG1ldGhvZF9yZXR1cm5fdmFsdWU7XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbikuY2FsbCh0aGlzKSIpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2MjQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uaApAQCAtMCwwICsxLDIzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk1fU0lNUExFRVhQUkVTU0lPTl9IDQorI2RlZmluZSBfWEZBX0ZNX1NJTVBMRUVYUFJFU1NJT05fSA0KK2VudW0gWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHsNCisgICAgQVNTSUdOLA0KKyAgICBMT0dJQ0FMT1IsDQorICAgIExPR0lDQUxBTkQsDQorICAgIEVRVUFMSVRZLA0KKyAgICBOT1RFUVVBTElUWSwNCisgICAgTEVTUywNCisgICAgTEVTU0VRVUFMLA0KKyAgICBHUkVBVEVSLA0KKyAgICBHUkVBVEVSRVFVQUwsDQorICAgIFBMVVMsDQorICAgIE1JTlVTLA0KKyAgICBNVUxUSVBMRSwNCisgICAgRElWSURFLA0KKyAgICBQT1NJVElWRSwNCisgICAgTkVHQVRJVkUsDQorICAgIE5PVCwNCisgICAgQ0FMTCwNCisgICAgRE9ULA0KKyAgICBET1RET1QsDQorICAgIENPTkNBVEZNT0JKRUNULA0KKyAgICBJU0ZNT0JKRUNULA0KKyAgICBJU0ZNQVJSQVksDQorICAgIEdFVEZNVkFMVUUsDQorICAgIEdFVEZNSlNPQkosDQorICAgIFZBUkZJTFRFUg0KK307DQorQ0ZYX1dpZGVTdHJpbmdDIFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHNpbXBsZUV4cFR5cGUpOw0KK3N0cnVjdCBYRkFfRk1CdWlsZEluRnVuYyB7DQorICAgIEZYX1VJTlQzMgkJbV91SGFzaDsNCisgICAgRlhfTFBDV1NUUgkJbV9idWlsZGluZnVuYzsNCit9Ow0KK3N0cnVjdCBYRkFfRk1TT01NZXRob2Qgew0KKyAgICBGWF9VSU5UMzIJCW1fdUhhc2g7DQorICAgIEZYX0xQQ1dTVFIJCW1fd3NTb21NZXRob2ROYW1lOw0KKyAgICBGWF9EV09SRAkJbV9kUGFyYW1ldGVyczsNCit9Ow0KK2VudW0gWEZBX0ZNX0FjY2Vzc29ySW5kZXggew0KKyAgICBBQ0NFU1NPUl9OT19JTkRFWCwNCisgICAgQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWCwNCisgICAgQUNDRVNTT1JfUE9TSVRJVkVfSU5ERVgsDQorICAgIEFDQ0VTU09SX05FR0FUSVZFX0lOREVYDQorfTsNCitjbGFzcyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgICAgWEZBX0ZNX1RPS0VOIEdldE9wZXJhdG9yVG9rZW4oKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIEZYX0RXT1JEIG1fbGluZTsNCisgICAgWEZBX0ZNX1RPS0VOIG1fb3A7DQorfTsNCitjbGFzcyBDWEZBX0ZNTnVsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNTnVsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1OdWxsRXhwcmVzc2lvbigpIHt9Ow0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorfTsNCitjbGFzcyBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1OdW1iZXJFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c051bWJlcik7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1OdW1iZXJFeHByZXNzaW9uKCkge307DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzTnVtYmVyOw0KK307DQorY2xhc3MgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NTdHJpbmcpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbigpIHt9Ow0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhfV2lkZVN0cmluZ0MgbV93c1N0cmluZzsNCit9Ow0KK2NsYXNzIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm4gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKCkge307DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsNCit9Ow0KK2NsYXNzIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHApOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNVW5hcnlFeHByZXNzaW9uKCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICptX3BFeHA7DQorfTsNCitjbGFzcyBDWEZBX0ZNQmluRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1CaW5FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNQmluRXhwcmVzc2lvbigpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorcHJvdGVjdGVkOg0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqbV9wRXhwMTsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKm1fcEV4cDI7DQorfTsNCitjbGFzcyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNQXNzaWduRXhwcmVzc2lvbigpIHt9Ow0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAyKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMik7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMik7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMik7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTVBvc0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Qb3NFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTVBvc0V4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTU5lZ0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1OZWdFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTU5lZ0V4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTU5vdEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Ob3RFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTU5vdEV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUNhbGxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24NCit7DQorcHVibGljOg0KKyAgICBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAsIENGWF9QdHJBcnJheSAqcEFyZ3VtZW50cywgRlhfQk9PTCBiSXNTb21NZXRob2QpOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNQ2FsbEV4cHJlc3Npb24oKTsNCisgICAgdmlydHVhbCBGWF9CT09MIElzQnVpbGRJbkZ1bmMoQ0ZYX1dpZGVUZXh0QnVmJiBmdW5jTmFtZSk7DQorICAgIHZpcnR1YWwgRlhfRFdPUkQgSXNTb21NZXRob2RXaXRoT2JqUGFyYShGWF9XU1RSIG1ldGhvZE5hbWUpOw0KKyAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorcHJpdmF0ZToNCisgICAgRlhfQk9PTCBtX2JJc1NvbU1ldGhvZDsNCisgICAgQ0ZYX1B0ckFycmF5ICptX3BBcmd1bWVudHM7DQorfTsNCitjbGFzcyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFjY2Vzc29yLCBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBJbmRleEV4cCk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NJZGVudGlmaWVyOw0KK307DQorY2xhc3MgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uDQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4LCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEluZGV4RXhwLCBGWF9CT09MIGJJc1N0YXJJbmRleCk7DQorICAgIHZpcnR1YWwgfkNYRkFfRk1JbmRleEV4cHJlc3Npb24oKSB7fTsNCisgICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK3Byb3RlY3RlZDoNCisgICAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggbV9hY2Nlc3NvckluZGV4Ow0KKyAgICBGWF9CT09MIG1fYklzU3RhckluZGV4Ow0KK307DQorY2xhc3MgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBY2Nlc3NvciwgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwSW5kZXhFeHApOw0KKyAgICB2aXJ0dWFsIH5DWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKCkge307DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsNCit9Ow0KK2NsYXNzIENYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFjY2Vzc29yRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBDYWxsRXhwKTsNCisgICAgdmlydHVhbCB+Q1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKCkge307DQorICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitwcm90ZWN0ZWQ6DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1MDhjYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmNwcApAQCAtMCwwICsxLDE0MjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX2Jhc2ljX2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2RhdGF3aW5kb3cuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgiDQorZXh0ZXJuIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNSU5GTyBnX1hGQUVudW1EYXRhW10gPSB7DQorICAgIHsweDJhLCAoRlhfTFBDV1NUUilMIioiLCBYRkFfQVRUUklCVVRFRU5VTV9Bc3Rlcmlza30sCXsweDJmLCAoRlhfTFBDV1NUUilMIi8iLCBYRkFfQVRUUklCVVRFRU5VTV9TbGFzaH0sCXsweDVjLCAoRlhfTFBDV1NUUilMIlxcIiwgWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNofSwNCisgICAgezB4MjM5YmQsIChGWF9MUENXU1RSKUwib24iLCBYRkFfQVRUUklCVVRFRU5VTV9Pbn0sCXsweDI1MzU2LCAoRlhfTFBDV1NUUilMInRiIiwgWEZBX0FUVFJJQlVURUVOVU1fVGJ9LAl7MHgyNTg4NSwgKEZYX0xQQ1dTVFIpTCJ1cCIsIFhGQV9BVFRSSUJVVEVFTlVNX1VwfSwNCisgICAgezB4OTFiMjgxLCAoRlhfTFBDV1NUUilMIm1ldGFEYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fTWV0YURhdGF9LAl7MHgxZjhkZWRiLCAoRlhfTFBDV1NUUilMImRlbGVnYXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fRGVsZWdhdGV9LAl7MHgyYTZjNTVhLCAoRlhfTFBDV1NUUilMInBvc3RTdWJtaXQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U3VibWl0fSwNCisgICAgezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgWEZBX0FUVFJJQlVURUVOVU1fTmFtZX0sCXsweDM3OGEzOGEsIChGWF9MUENXU1RSKUwiY3Jvc3MiLCBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc30sCXsweDM4NDhiM2YsIChGWF9MUENXU1RSKUwibmV4dCIsIFhGQV9BVFRSSUJVVEVFTlVNX05leHR9LA0KKyAgICB7MHg0OGI2NjcwLCAoRlhfTFBDV1NUUilMIm5vbmUiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwJezB4NTFhYWZlNSwgKEZYX0xQQ1dTVFIpTCJzaG9ydEVkZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9TaG9ydEVkZ2V9LAl7MHg1NTI2NGM0LCAoRlhfTFBDV1NUUilMIjFtb2QxMF8xbW9kMTEiLCBYRkFfQVRUUklCVVRFRU5VTV8xbW9kMTBfMW1vZDExfSwNCisgICAgezB4NWE1YzUxOSwgKEZYX0xQQ1dTVFIpTCJoZWlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9IZWlnaHR9LAl7MHg4OWNlNTQ5LCAoRlhfTFBDV1NUUilMImNyb3NzRGlhZ29uYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0RpYWdvbmFsfSwJezB4OWY5ZDBmOSwgKEZYX0xQQ1dTVFIpTCJhbGwiLCBYRkFfQVRUUklCVVRFRU5VTV9BbGx9LA0KKyAgICB7MHg5ZjlkYjQ4LCAoRlhfTFBDV1NUUilMImFueSIsIFhGQV9BVFRSSUJVVEVFTlVNX0FueX0sCXsweGExMjYyNjEsIChGWF9MUENXU1RSKUwidG9SaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHR9LAl7MHhhMzZkZTI5LCAoRlhfTFBDV1NUUilMIm1hdGNoVGVtcGxhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9NYXRjaFRlbXBsYXRlfSwNCisgICAgezB4YTQ4ZDA0MCwgKEZYX0xQQ1dTVFIpTCJkcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9EcGx9LAl7MHhhNTU5YzA1LCAoRlhfTFBDV1NUUilMImludmlzaWJsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ludmlzaWJsZX0sCXsweGE3ZDQ4ZTMsIChGWF9MUENXU1RSKUwiZml0IiwgWEZBX0FUVFJJQlVURUVOVU1fRml0fSwNCisgICAgezB4YThhOGY4MCwgKEZYX0xQQ1dTVFIpTCJ3aWR0aCIsIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRofSwJezB4YWI0NjZiYiwgKEZYX0xQQ1dTVFIpTCJwcmVTdWJtaXQiLCBYRkFfQVRUUklCVVRFRU5VTV9QcmVTdWJtaXR9LAl7MHhhY2M1Nzg1LCAoRlhfTFBDV1NUUilMImlwbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0lwbH0sDQorICAgIHsweGFmYWIwZjgsIChGWF9MUENXU1RSKUwiZmxhdGVDb21wcmVzcyIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZsYXRlQ29tcHJlc3N9LAl7MHhiMzU1ODE2LCAoRlhfTFBDV1NUUilMIm1lZCIsIFhGQV9BVFRSSUJVVEVFTlVNX01lZH0sCXsweGI2OWVmNzcsIChGWF9MUENXU1RSKUwib2RkIiwgWEZBX0FUVFJJQlVURUVOVU1fT2RkfSwNCisgICAgezB4YjY5ZjliYiwgKEZYX0xQQ1dTVFIpTCJvZmYiLCBYRkFfQVRUUklCVVRFRU5VTV9PZmZ9LAl7MHhiODQzZGJhLCAoRlhfTFBDV1NUUilMInBkZiIsIFhGQV9BVFRSSUJVVEVFTlVNX1BkZn0sCXsweGJiOTEyYjgsIChGWF9MUENXU1RSKUwicm93IiwgWEZBX0FUVFJJQlVURUVOVU1fUm93fSwNCisgICAgezB4YmVkYWYzMywgKEZYX0xQQ1dTVFIpTCJ0b3AiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3B9LAl7MHhjNTZhZmNjLCAoRlhfTFBDV1NUUilMInhkcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1hkcH0sCXsweGM1NmJhMDIsIChGWF9MUENXU1RSKUwieGZkIiwgWEZBX0FUVFJJQlVURUVOVU1fWGZkfSwNCisgICAgezB4YzU2ZGRmMSwgKEZYX0xQQ1dTVFIpTCJ4bWwiLCBYRkFfQVRUUklCVVRFRU5VTV9YbWx9LAl7MHhjOGI2NWYzLCAoRlhfTFBDV1NUUilMInppcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ppcH0sCXsweGM4Yjg5ZDYsIChGWF9MUENXU1RSKUwienBsIiwgWEZBX0FUVFJJQlVURUVOVU1fWnBsfSwNCisgICAgezB4ZjU1ZDdlZSwgKEZYX0xQQ1dTVFIpTCJ2aXNpYmxlIiwgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZX0sCXsweGZlMzU5NmEsIChGWF9MUENXU1RSKUwiZXhjbHVkZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4Y2x1ZGV9LAl7MHgxMDlkN2NlNywgKEZYX0xQQ1dTVFIpTCJtb3VzZUVudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlcn0sDQorICAgIHsweDEwZjFiYzBjLCAoRlhfTFBDV1NUUilMInBhaXIiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWlyfSwJezB4MTE1NGVmZTYsIChGWF9MUENXU1RSKUwiZmlsdGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fRmlsdGVyfSwJezB4MTI1YmM5NGIsIChGWF9MUENXU1RSKUwibW92ZUxhc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlTGFzdH0sDQorICAgIHsweDEyZTFmMWYwLCAoRlhfTFBDV1NUUilMImV4cG9ydEFuZEltcG9ydCIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydH0sCXsweDEzMDAwYzYwLCAoRlhfTFBDV1NUUilMInB1c2giLCBYRkFfQVRUUklCVVRFRU5VTV9QdXNofSwJezB4MTM4ZWUzMTUsIChGWF9MUENXU1RSKUwicG9ydHJhaXQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3J0cmFpdH0sDQorICAgIHsweDE0ZGEyMTI1LCAoRlhfTFBDV1NUUilMImRlZmF1bHQiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWZhdWx0fSwJezB4MTU3NzQ5YTUsIChGWF9MUENXU1RSKUwic3RvcmVkUHJvYyIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0b3JlZFByb2N9LAl7MHgxNjY0MTE5OCwgKEZYX0xQQ1dTVFIpTCJzdGF5Qk9GIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RheUJPRn0sDQorICAgIHsweDE2YjJmYzViLCAoRlhfTFBDV1NUUilMInN0YXlFT0YiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGF5RU9GfSwJezB4MTdmYWQzNzMsIChGWF9MUENXU1RSKUwicG9zdFByaW50IiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFByaW50fSwJezB4MTkzMjA3ZDAsIChGWF9MUENXU1RSKUwidXNDYXJyaWVyIiwgWEZBX0FUVFJJQlVURUVOVU1fVXNDYXJyaWVyfSwNCisgICAgezB4MTkzYWRlM2UsIChGWF9MUENXU1RSKUwicmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9SaWdodH0sCXsweDFiZmM3MmQ5LCAoRlhfTFBDV1NUUilMInByZU9wZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9QcmVPcGVufSwJezB4MWNjOTMxN2EsIChGWF9MUENXU1RSKUwiYWN0dWFsIiwgWEZBX0FUVFJJQlVURUVOVU1fQWN0dWFsfSwNCisgICAgezB4MWYzMWRmMWUsIChGWF9MUENXU1RSKUwicmVzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Jlc3R9LAl7MHgxZmIxYmYxNCwgKEZYX0xQQ1dTVFIpTCJ0b3BDZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3BDZW50ZXJ9LAl7MHgyMDdkZTY2NywgKEZYX0xQQ1dTVFIpTCJzdGFuZGFyZFN5bWJvbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YW5kYXJkU3ltYm9sfSwNCisgICAgezB4MjE5NmE0NTIsIChGWF9MUENXU1RSKUwiaW5pdGlhbGl6ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luaXRpYWxpemV9LAl7MHgyM2JkNDBjNywgKEZYX0xQQ1dTVFIpTCJqdXN0aWZ5QWxsIiwgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbH0sCXsweDI0N2NmM2U5LCAoRlhfTFBDV1NUUilMIm5vcm1hbCIsIFhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbH0sDQorICAgIHsweDI1YWE5NDZiLCAoRlhfTFBDV1NUUilMImxhbmRzY2FwZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0xhbmRzY2FwZX0sCXsweDI3MzliNWM5LCAoRlhfTFBDV1NUUilMIm5vbkludGVyYWN0aXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fTm9uSW50ZXJhY3RpdmV9LAl7MHgyNzQxMGYwMywgKEZYX0xQQ1dTVFIpTCJtb3VzZUV4aXQiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUV4aXR9LA0KKyAgICB7MHgyODU0ZTYyYywgKEZYX0xQQ1dTVFIpTCJtaW51cyIsIFhGQV9BVFRSSUJVVEVFTlVNX01pbnVzfSwJezB4Mjg3ZTkzNmEsIChGWF9MUENXU1RSKUwiZGlhZ29uYWxMZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fRGlhZ29uYWxMZWZ0fSwJezB4Mjk3MmE5OGYsIChGWF9MUENXU1RSKUwic2ltcGxleFBhZ2luYXRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWR9LA0KKyAgICB7MHgyOWQ4MjI1ZiwgKEZYX0xQQ1dTVFIpTCJkb2N1bWVudCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RvY3VtZW50fSwJezB4MmE5ZDMwMTYsIChGWF9MUENXU1RSKUwid2FybmluZyIsIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmd9LAl7MHgyYjM1YjZkOSwgKEZYX0xQQ1dTVFIpTCJhdXRvIiwgWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweDJjMTY1M2Q5LCAoRlhfTFBDV1NUUilMImJlbG93IiwgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3d9LAl7MHgyYzFmMDU0MCwgKEZYX0xQQ1dTVFIpTCJib3R0b21MZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tTGVmdH0sCXsweDJjNDRlODE2LCAoRlhfTFBDV1NUUilMImJvdHRvbUNlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUNlbnRlcn0sDQorICAgIHsweDJjZDNlOWYzLCAoRlhfTFBDV1NUUilMInRjcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9UY3BsfSwJezB4MmQwOGFmODUsIChGWF9MUENXU1RSKUwidGV4dCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RleHR9LAl7MHgyZGM0NzhlYiwgKEZYX0xQQ1dTVFIpTCJncm91cGluZyIsIFhGQV9BVFRSSUJVVEVFTlVNX0dyb3VwaW5nfSwNCisgICAgezB4MmVmM2FmZGQsIChGWF9MUENXU1RSKUwic2VjdXJlU3ltYm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fU2VjdXJlU3ltYm9sfSwJezB4MmYyZGQyOWEsIChGWF9MUENXU1RSKUwicHJlRXhlY3V0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZUV4ZWN1dGV9LAl7MHgzM2M0M2RlYywgKEZYX0xQQ1dTVFIpTCJkb2NDbG9zZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0RvY0Nsb3NlfSwNCisgICAgezB4MzNmMjViYjUsIChGWF9MUENXU1RSKUwia2V5c2V0IiwgWEZBX0FUVFJJQlVURUVOVU1fS2V5c2V0fSwJezB4MzRlMzYzZGEsIChGWF9MUENXU1RSKUwidmVydGljYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9WZXJ0aWNhbH0sCXsweDM2MWZhMWI2LCAoRlhfTFBDV1NUUilMInByZVNhdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9QcmVTYXZlfSwNCisgICAgezB4MzZmMWM2ZDgsIChGWF9MUENXU1RSKUwicHJlU2lnbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ259LAl7MHgzOTlmMDJiNSwgKEZYX0xQQ1dTVFIpTCJib3R0b20iLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b219LAl7MHgzYjBhYjA5NiwgKEZYX0xQQ1dTVFIpTCJ0b1RvcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvVG9wfSwNCisgICAgezB4M2M3NTI0OTUsIChGWF9MUENXU1RSKUwidmVyaWZ5IiwgWEZBX0FUVFJJQlVURUVOVU1fVmVyaWZ5fSwJezB4M2NlMDVkNjgsIChGWF9MUENXU1RSKUwiZmlyc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9GaXJzdH0sCXsweDNlY2VhZDk0LCAoRlhfTFBDV1NUUilMImNvbnRlbnRBcmVhIiwgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWF9LA0KKyAgICB7MHg0MDYyM2I1YiwgKEZYX0xQQ1dTVFIpTCJzb2xpZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1NvbGlkfSwJezB4NDJjNmNkOGQsIChGWF9MUENXU1RSKUwicGVzc2ltaXN0aWMiLCBYRkFfQVRUUklCVVRFRU5VTV9QZXNzaW1pc3RpY30sCXsweDQzZGRjNmJmLCAoRlhfTFBDV1NUUilMImR1cGxleFBhZ2luYXRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZH0sDQorICAgIHsweDQ0MmY2OGM4LCAoRlhfTFBDV1NUUilMInJvdW5kIiwgWEZBX0FUVFJJQlVURUVOVU1fUm91bmR9LAl7MHg0NWVmYjg0NywgKEZYX0xQQ1dTVFIpTCJyZW1lcmdlIiwgWEZBX0FUVFJJQlVURUVOVU1fUmVtZXJnZX0sCXsweDQ2OTcyMjY1LCAoRlhfTFBDV1NUUilMIm9yZGVyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkfSwNCisgICAgezB4NDZmOTU1MzEsIChGWF9MUENXU1RSKUwicGVyY2VudCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BlcmNlbnR9LAl7MHg0NmZkMjVhZSwgKEZYX0xQQ1dTVFIpTCJldmVuIiwgWEZBX0FUVFJJQlVURUVOVU1fRXZlbn0sCXsweDQ3MzFkNmJhLCAoRlhfTFBDV1NUUilMImV4aXQiLCBYRkFfQVRUUklCVVRFRU5VTV9FeGl0fSwNCisgICAgezB4NDk3NzM1NmIsIChGWF9MUENXU1RSKUwidG9vbFRpcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Rvb2xUaXB9LAl7MHg0OWI5ODBlZSwgKEZYX0xQQ1dTVFIpTCJvcmRlcmVkT2NjdXJyZW5jZSIsIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlfSwJezB4NGE3ZTJkZmUsIChGWF9MUENXU1RSKUwicmVhZE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9SZWFkT25seX0sDQorICAgIHsweDRjNGU4YWNiLCAoRlhfTFBDV1NUUilMImN1cnJlbmN5IiwgWEZBX0FUVFJJQlVURUVOVU1fQ3VycmVuY3l9LAl7MHg0ZGNmMjVmOCwgKEZYX0xQQ1dTVFIpTCJjb25jYXQiLCBYRkFfQVRUUklCVVRFRU5VTV9Db25jYXR9LAl7MHg0ZmViYjgyNiwgKEZYX0xQQ1dTVFIpTCJUaGFpIiwgWEZBX0FUVFJJQlVURUVOVU1fVGhhaX0sDQorICAgIHsweDUwZWY5NWIyLCAoRlhfTFBDV1NUUilMImVtYm9zc2VkIiwgWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWR9LAl7MHg1MTZlMzVjZSwgKEZYX0xQQ1dTVFIpTCJmb3JtZGF0YSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Zvcm1kYXRhfSwJezB4NTJmYTZmMGUsIChGWF9MUENXU1RSKUwiR3JlZWsiLCBYRkFfQVRUUklCVVRFRU5VTV9HcmVla30sDQorICAgIHsweDU0MDM0YzJmLCAoRlhfTFBDV1NUUilMImRlY2ltYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWNpbWFsfSwJezB4NTQyYzczMDAsIChGWF9MUENXU1RSKUwic2VsZWN0IiwgWEZBX0FUVFJJQlVURUVOVU1fU2VsZWN0fSwJezB4NTUxZjBhZTUsIChGWF9MUENXU1RSKUwibG9uZ0VkZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Mb25nRWRnZX0sDQorICAgIHsweDU1NTIwYThhLCAoRlhfTFBDV1NUUilMInByb3RlY3RlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Byb3RlY3RlZH0sCXsweDU1OWY3NmYzLCAoRlhfTFBDV1NUUilMImJvdHRvbVJpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHR9LAl7MHg1NjhjYjUwMCwgKEZYX0xQQ1dTVFIpTCJ6ZXJvIiwgWEZBX0FUVFJJQlVURUVOVU1fWmVyb30sDQorICAgIHsweDU2YmNlY2I3LCAoRlhfTFBDV1NUUilMImZvcndhcmRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fRm9yd2FyZE9ubHl9LAl7MHg1NmJmNDU2YiwgKEZYX0xQQ1dTVFIpTCJkb2NSZWFkeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0RvY1JlYWR5fSwJezB4NTczY2I0MGMsIChGWF9MUENXU1RSKUwiaGlkZGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVufSwNCisgICAgezB4NTgyZTM0MjQsIChGWF9MUENXU1RSKUwiaW5jbHVkZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGV9LAl7MHg1OGEzZGQyOSwgKEZYX0xQQ1dTVFIpTCJkYXNoZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWR9LAl7MHg1OTU1YjIyYiwgKEZYX0xQQ1dTVFIpTCJtdWx0aVNlbGVjdCIsIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0fSwNCisgICAgezB4NTk4ZDVjNTMsIChGWF9MUENXU1RSKUwiaW5hY3RpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9JbmFjdGl2ZX0sCXsweDU5YzhmMjdkLCAoRlhfTFBDV1NUUilMImVtYmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRW1iZWR9LAl7MHg1ZTc1NTVlOCwgKEZYX0xQQ1dTVFIpTCJzdGF0aWMiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGF0aWN9LA0KKyAgICB7MHg2MDZkNGRlZiwgKEZYX0xQQ1dTVFIpTCJvbkVudHJ5IiwgWEZBX0FUVFJJQlVURUVOVU1fT25FbnRyeX0sCXsweDYxOTVlYWZiLCAoRlhfTFBDV1NUUilMIkN5cmlsbGljIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3lyaWxsaWN9LAl7MHg2NDkxYjBmMywgKEZYX0xQQ1dTVFIpTCJub25CbGFuayIsIFhGQV9BVFRSSUJVVEVFTlVNX05vbkJsYW5rfSwNCisgICAgezB4NjdiZWYwMzEsIChGWF9MUENXU1RSKUwidG9wUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodH0sCXsweDY3ZGY1ZWJkLCAoRlhfTFBDV1NUUilMIkhlYnJldyIsIFhGQV9BVFRSSUJVVEVFTlVNX0hlYnJld30sCXsweDZhZWE5OGJlLCAoRlhfTFBDV1NUUilMInRvcExlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0fSwNCisgICAgezB4NmM1MWFmYzEsIChGWF9MUENXU1RSKUwiY2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyfSwJezB4NzE0NWU2YmYsIChGWF9MUENXU1RSKUwibW92ZUZpcnN0IiwgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0fSwJezB4NzM3NTQ2NWMsIChGWF9MUENXU1RSKUwiZGlhbW9uZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RpYW1vbmR9LA0KKyAgICB7MHg3NDYxYWVmNCwgKEZYX0xQQ1dTVFIpTCJwYWdlT2RkIiwgWEZBX0FUVFJJQlVURUVOVU1fUGFnZU9kZH0sCXsweDc1ZjhhZWIyLCAoRlhfTFBDV1NUUilMIjFtb2QxMCIsIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMH0sCXsweDc2ZDcwOGUwLCAoRlhfTFBDV1NUUilMIktvcmVhbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0tvcmVhbn0sDQorICAgIHsweDc4OWYxNGQ3LCAoRlhfTFBDV1NUUilMImFib3ZlRW1iZWRkZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZUVtYmVkZGVkfSwJezB4NzkyZWEzOWYsIChGWF9MUENXU1RSKUwiemlwQ29tcHJlc3MiLCBYRkFfQVRUUklCVVRFRU5VTV9aaXBDb21wcmVzc30sCXsweDdhNWI3MTkzLCAoRlhfTFBDV1NUUilMIm51bWVyaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9OdW1lcmljfSwNCisgICAgezB4N2FiZWMwZDIsIChGWF9MUENXU1RSKUwiY2lyY2xlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2lyY2xlfSwJezB4N2FmYmJhMzgsIChGWF9MUENXU1RSKUwidG9Cb3R0b20iLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0JvdHRvbX0sCXsweDdiOTVlNjYxLCAoRlhfTFBDV1NUUilMImludmVydGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fSW52ZXJ0ZWR9LA0KKyAgICB7MHg3YmFjYTJlMywgKEZYX0xQQ1dTVFIpTCJ1cGRhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9VcGRhdGV9LAl7MHg3ZWI1ZGEyYywgKEZYX0xQQ1dTVFIpTCJpc29uYW1lIiwgWEZBX0FUVFJJQlVURUVOVU1fSXNvbmFtZX0sCXsweDdmNmZkM2Q3LCAoRlhfTFBDV1NUUilMInNlcnZlciIsIFhGQV9BVFRSSUJVVEVFTlVNX1NlcnZlcn0sDQorICAgIHsweDgxNGY4MmI1LCAoRlhfTFBDV1NUUilMInBvc2l0aW9uIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb259LAl7MHg4MmRlYWNmMCwgKEZYX0xQQ1dTVFIpTCJtaWRkbGVDZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXJ9LAl7MHg4M2E0OWRjNiwgKEZYX0xQQ1dTVFIpTCJvcHRpb25hbCIsIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAgezB4ODYxYTExNmYsIChGWF9MUENXU1RSKUwidXNlUHJpbnRlclNldHRpbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Vc2VQcmludGVyU2V0dGluZ30sCXsweDg2NzAxY2UwLCAoRlhfTFBDV1NUUilMIm91dGxpbmUiLCBYRkFfQVRUUklCVVRFRU5VTV9PdXRsaW5lfSwJezB4ODgwODM4NWUsIChGWF9MUENXU1RSKUwiaW5kZXhDaGFuZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZX0sDQorICAgIHsweDg5MWY0NjA2LCAoRlhfTFBDV1NUUilMImNoYW5nZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZX0sCXsweDg5OTM5ZjM2LCAoRlhfTFBDV1NUUilMInBhZ2VBcmVhIiwgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWF9LAl7MHg4YjVjM2IyNSwgKEZYX0xQQ1dTVFIpTCJvbmNlIiwgWEZBX0FUVFJJQlVURUVOVU1fT25jZX0sDQorICAgIHsweDhiNWM2OTYyLCAoRlhfTFBDV1NUUilMIm9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9Pbmx5fSwJezB4OGI5MGUxZjIsIChGWF9MUENXU1RSKUwib3BlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX09wZW59LAl7MHg4YmNmZTk2ZSwgKEZYX0xQQ1dTVFIpTCJjYXB0aW9uIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2FwdGlvbn0sDQorICAgIHsweDhjZTgzZWY4LCAoRlhfTFBDV1NUUilMInJhaXNlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZH0sCXsweDhkMjY5Y2FlLCAoRlhfTFBDV1NUUilMImp1c3RpZnkiLCBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5fSwJezB4OGZkNTIwZGMsIChGWF9MUENXU1RSKUwicmVmQW5kRGVzY2VuZGFudHMiLCBYRkFfQVRUUklCVVRFRU5VTV9SZWZBbmREZXNjZW5kYW50c30sDQorICAgIHsweDkwNDFkNGIwLCAoRlhfTFBDV1NUUilMInNob3J0IiwgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnR9LAl7MHg5MGM5NDQyNiwgKEZYX0xQQ1dTVFIpTCJwYWdlRnJvbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRnJvbnR9LAl7MHg5MzZiZWVlNSwgKEZYX0xQQ1dTVFIpTCJtb25vc3BhY2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb25vc3BhY2V9LA0KKyAgICB7MHg5NDdmYTAwZiwgKEZYX0xQQ1dTVFIpTCJtaWRkbGUiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGV9LAl7MHg5NTI4YTdiNCwgKEZYX0xQQ1dTVFIpTCJwcmVQcmludCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVByaW50fSwJezB4OTU5YWIyMzEsIChGWF9MUENXU1RSKUwiYWx3YXlzIiwgWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzfSwNCisgICAgezB4OTZkNjFiZjAsIChGWF9MUENXU1RSKUwidW5rbm93biIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LAl7MHg5OTcxOTRlZSwgKEZYX0xQQ1dTVFIpTCJ0b0xlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0xlZnR9LAl7MHg5YTgzYTNjZCwgKEZYX0xQQ1dTVFIpTCJhYm92ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlfSwNCisgICAgezB4OWQwZDcxYzcsIChGWF9MUENXU1RSKUwiZGFzaERvdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3R9LAl7MHg5ZGY1NmYzZSwgKEZYX0xQQ1dTVFIpTCJncmVnb3JpYW4iLCBYRkFfQVRUUklCVVRFRU5VTV9HcmVnb3JpYW59LAl7MHg5ZjY3MjNmZCwgKEZYX0xQQ1dTVFIpTCJSb21hbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1JvbWFufSwNCisgICAgezB4OWY2OTNiMjEsIChGWF9MUENXU1RSKUwibW91c2VEb3duIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VEb3dufSwJezB4YTE0MjliMzYsIChGWF9MUENXU1RSKUwic3ltYm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fU3ltYm9sfSwJezB4YTVhYTQ1Y2IsIChGWF9MUENXU1RSKUwicGFnZUV2ZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRXZlbn0sDQorICAgIHsweGE2ODYzNWYxLCAoRlhfTFBDV1NUUilMInNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9TaWdufSwJezB4YTczMTUwOTMsIChGWF9MUENXU1RSKUwiYWRkTmV3IiwgWEZBX0FUVFJJQlVURUVOVU1fQWRkTmV3fSwJezB4YTdhNzczZmEsIChGWF9MUENXU1RSKUwic3RhciIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXJ9LA0KKyAgICB7MHhhN2Q1N2I0NSwgKEZYX0xQQ1dTVFIpTCJvcHRpbWlzdGljIiwgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW1pc3RpY30sCXsweGE4MDc3MzIxLCAoRlhfTFBDV1NUUilMInJsLXRiIiwgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGJ9LAl7MHhhOGYxNDY4ZCwgKEZYX0xQQ1dTVFIpTCJtaWRkbGVSaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZVJpZ2h0fSwNCisgICAgezB4YWE4NGExZjEsIChGWF9MUENXU1RSKUwibWFpbnRhaW4iLCBYRkFfQVRUUklCVVRFRU5VTV9NYWludGFpbn0sCXsweGFiNDBiMTJjLCAoRlhfTFBDV1NUUilMInBhY2thZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWNrYWdlfSwJezB4YWM4YjRkODUsIChGWF9MUENXU1RSKUwiU2ltcGxpZmllZENoaW5lc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGlmaWVkQ2hpbmVzZX0sDQorICAgIHsweGFkYWU2NzQ0LCAoRlhfTFBDV1NUUilMInRvQ2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9DZW50ZXJ9LAl7MHhiMDEyOWRmMSwgKEZYX0xQQ1dTVFIpTCJiYWNrIiwgWEZBX0FUVFJJQlVURUVOVU1fQmFja30sCXsweGIwZjA4OGNmLCAoRlhfTFBDV1NUUilMInVuc3BlY2lmaWVkIiwgWEZBX0FUVFJJQlVURUVOVU1fVW5zcGVjaWZpZWR9LA0KKyAgICB7MHhiMTI3MTA2NywgKEZYX0xQQ1dTVFIpTCJiYXRjaE9wdGltaXN0aWMiLCBYRkFfQVRUUklCVVRFRU5VTV9CYXRjaE9wdGltaXN0aWN9LAl7MHhiMTgzMTNhMSwgKEZYX0xQQ1dTVFIpTCJib2xkIiwgWEZBX0FUVFJJQlVURUVOVU1fQm9sZH0sCXsweGIxODMzY2FkLCAoRlhfTFBDV1NUUilMImJvdGgiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3RofSwNCisgICAgezB4YjIyMTEyM2YsIChGWF9MUENXU1RSKUwiYnV0dCIsIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHR9LAl7MHhiNDBjMzZiZiwgKEZYX0xQQ1dTVFIpTCJjbGllbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9DbGllbnR9LAl7MHhiNTZjNzA1MywgKEZYX0xQQ1dTVFIpTCIybW9kMTAiLCBYRkFfQVRUUklCVVRFRU5VTV8ybW9kMTB9LA0KKyAgICB7MHhiNjgzYTM0NSwgKEZYX0xQQ1dTVFIpTCJpbWFnZU9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHl9LAl7MHhiNzczMmRlYSwgKEZYX0xQQ1dTVFIpTCJob3Jpem9udGFsIiwgWEZBX0FUVFJJQlVURUVOVU1fSG9yaXpvbnRhbH0sCXsweGI4ODY1MmE0LCAoRlhfTFBDV1NUUilMImRvdHRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RvdHRlZH0sDQorICAgIHsweGJiMmYyODgwLCAoRlhfTFBDV1NUUilMInVzZXJDb250cm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2x9LAl7MHhiYmI3OWM1ZCwgKEZYX0xQQ1dTVFIpTCJkaWFnb25hbFJpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fRGlhZ29uYWxSaWdodH0sCXsweGJkMDc3MTU0LCAoRlhfTFBDV1NUUilMImNvbnN1bWVEYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fQ29uc3VtZURhdGF9LA0KKyAgICB7MHhiZDNmYjExZSwgKEZYX0xQQ1dTVFIpTCJjaGVjayIsIFhGQV9BVFRSSUJVVEVFTlVNX0NoZWNrfSwJezB4YmRlOWFiZGEsIChGWF9MUENXU1RSKUwiZGF0YSIsIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGF9LAl7MHhiZjVhMDJkOCwgKEZYX0xQQ1dTVFIpTCJkb3duIiwgWEZBX0FUVFJJQlVURUVOVU1fRG93bn0sDQorICAgIHsweGJmNzQ1MGVlLCAoRlhfTFBDV1NUUilMInNhbnNTZXJpZiIsIFhGQV9BVFRSSUJVVEVFTlVNX1NhbnNTZXJpZn0sCXsweGMwMmQ2NDlmLCAoRlhfTFBDV1NUUilMImlubGluZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZX0sCXsweGMxMWE5ZTNhLCAoRlhfTFBDV1NUUilMIlRyYWRpdGlvbmFsQ2hpbmVzZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RyYWRpdGlvbmFsQ2hpbmVzZX0sDQorICAgIHsweGMxNjE2OWQ4LCAoRlhfTFBDV1NUUilMIndhcm4iLCBYRkFfQVRUUklCVVRFRU5VTV9XYXJufSwJezB4YzE2ZjA3MWYsIChGWF9MUENXU1RSKUwicmVmT25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlZk9ubHl9LAl7MHhjMjdjOGJhNSwgKEZYX0xQQ1dTVFIpTCJpbnRlcmFjdGl2ZUZvcm1zIiwgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJhY3RpdmVGb3Jtc30sDQorICAgIHsweGMyZDFiMTVjLCAoRlhfTFBDV1NUUilMIndvcmQiLCBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkfSwJezB4YzM2MjEyODgsIChGWF9MUENXU1RSKUwidW5vcmRlcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkfSwJezB4YzUyNTE5ODEsIChGWF9MUENXU1RSKUwicmVxdWlyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9SZXF1aXJlZH0sDQorICAgIHsweGM3MDg4ZTdkLCAoRlhfTFBDV1NUUilMImltcG9ydE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9JbXBvcnRPbmx5fSwJezB4YzcyY2YwZTMsIChGWF9MUENXU1RSKUwiYmVsb3dFbWJlZGRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93RW1iZWRkZWR9LAl7MHhjODE5Y2YwNywgKEZYX0xQQ1dTVFIpTCJKYXBhbmVzZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0phcGFuZXNlfSwNCisgICAgezB4Y2RjZTU2YjMsIChGWF9MUENXU1RSKUwiZnVsbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGx9LAl7MHhjZTAxMjJlMywgKEZYX0xQQ1dTVFIpTCJybC1yb3ciLCBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3d9LAl7MHhjZjdkNzFmMSwgKEZYX0xQQ1dTVFIpTCJWaWV0bmFtZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fVmlldG5hbWVzZX0sDQorICAgIHsweGNmZGUzZTA5LCAoRlhfTFBDV1NUUilMIkVhc3RFdXJvcGVhblJvbWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fRWFzdEV1cm9wZWFuUm9tYW59LAl7MHhkNTc2ZDA4ZSwgKEZYX0xQQ1dTVFIpTCJtb3VzZVVwIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcH0sCXsweGQ3YTkyOTA0LCAoRlhfTFBDV1NUUilMImV4cG9ydE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9FeHBvcnRPbmx5fSwNCisgICAgezB4ZDhlZDE0NjcsIChGWF9MUENXU1RSKUwiY2xlYXIiLCBYRkFfQVRUUklCVVRFRU5VTV9DbGVhcn0sCXsweGQ5NTY1N2E2LCAoRlhfTFBDV1NUUilMImNsaWNrIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2t9LAl7MHhkOTZjN2RlNSwgKEZYX0xQQ1dTVFIpTCJiYXNlNjQiLCBYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjR9LA0KKyAgICB7MHhkOWY0N2YzNiwgKEZYX0xQQ1dTVFIpTCJjbG9zZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nsb3NlfSwJezB4ZGIwNzViZGUsIChGWF9MUENXU1RSKUwiaG9zdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0hvc3R9LAl7MHhkYjEwMzQxMSwgKEZYX0xQQ1dTVFIpTCJnbG9iYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9HbG9iYWx9LA0KKyAgICB7MHhkYjY0NzE4OCwgKEZYX0xQQ1dTVFIpTCJibGFuayIsIFhGQV9BVFRSSUJVVEVFTlVNX0JsYW5rfSwJezB4ZGI5YmU5NjgsIChGWF9MUENXU1RSKUwidGFibGUiLCBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZX0sCXsweGRmNTkwZmJiLCAoRlhfTFBDV1NUUilMImltcG9ydCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydH0sDQorICAgIHsweGUwZTU3M2ZiLCAoRlhfTFBDV1NUUilMImN1c3RvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX0N1c3RvbX0sCXsweGUwZWNjNzlhLCAoRlhfTFBDV1NUUilMIm1pZGRsZUxlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVMZWZ0fSwJezB4ZTE0NTIwMTksIChGWF9MUENXU1RSKUwicG9zdEV4ZWN1dGUiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0RXhlY3V0ZX0sDQorICAgIHsweGUxOTExZDk4LCAoRlhfTFBDV1NUUilMInJhZGl4IiwgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXh9LAl7MHhlMjVmYTdiOCwgKEZYX0xQQ1dTVFIpTCJwb3N0T3BlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RPcGVufSwJezB4ZTI4ZGNlN2UsIChGWF9MUENXU1RSKUwiZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9FbnRlcn0sDQorICAgIHsweGUyYzQ0ZGU0LCAoRlhfTFBDV1NUUilMImlnbm9yZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZX0sCXsweGUyY2Q4YzYxLCAoRlhfTFBDV1NUUilMImxyLXRiIiwgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGJ9LAl7MHhlMmRhODMzNiwgKEZYX0xQQ1dTVFIpTCJmYW50YXN5IiwgWEZBX0FUVFJJQlVURUVOVU1fRmFudGFzeX0sDQorICAgIHsweGUzMWQ1Mzk2LCAoRlhfTFBDV1NUUilMIml0YWxpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpY30sCXsweGU3YWRhMTEzLCAoRlhfTFBDV1NUUilMImF1dGhvciIsIFhGQV9BVFRSSUJVVEVFTlVNX0F1dGhvcn0sCXsweGU4ZTdjYzE4LCAoRlhfTFBDV1NUUilMInRvRWRnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZX0sDQorICAgIHsweGU5N2FhOThiLCAoRlhfTFBDV1NUUilMImNob2ljZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZX0sCXsweGVhZmQyYTM4LCAoRlhfTFBDV1NUUilMImRpc2FibGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWR9LAl7MHhlYjJiNzk3MiwgKEZYX0xQQ1dTVFIpTCJjcm9zc0hhdGNoIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NIYXRjaH0sDQorICAgIHsweGViMmRiMmQ3LCAoRlhfTFBDV1NUUilMImRhdGFSZWYiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmfSwJezB4ZWMzNWRjNmUsIChGWF9MUENXU1RSKUwiZGFzaERvdERvdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3R9LAl7MHhlZjg1ZDM1MSwgKEZYX0xQQ1dTVFIpTCJzcXVhcmUiLCBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmV9LA0KKyAgICB7MHhmMjEwMjQ0NSwgKEZYX0xQQ1dTVFIpTCJkeW5hbWljIiwgWEZBX0FUVFJJQlVURUVOVU1fRHluYW1pY30sCXsweGYyNzJjN2JlLCAoRlhfTFBDV1NUUilMIm1hbnVhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX01hbnVhbH0sCXsweGYyYmJiNjRkLCAoRlhfTFBDV1NUUilMImV0Y2hlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZH0sDQorICAgIHsweGYzYjhmYzZjLCAoRlhfTFBDV1NUUilMInZhbGlkYXRpb25TdGF0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZhbGlkYXRpb25TdGF0ZX0sCXsweGY0MmYyYjgxLCAoRlhfTFBDV1NUUilMImN1cnNpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9DdXJzaXZlfSwJezB4ZjU0NDgxZDQsIChGWF9MUENXU1RSKUwibGFzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0xhc3R9LA0KKyAgICB7MHhmNWFkNzgyYiwgKEZYX0xQQ1dTVFIpTCJsZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fTGVmdH0sCXsweGY2MTZkYTJlLCAoRlhfTFBDV1NUUilMImxpbmsiLCBYRkFfQVRUUklCVVRFRU5VTV9MaW5rfSwJezB4ZjZiNGFmYjAsIChGWF9MUENXU1RSKUwibG9uZyIsIFhGQV9BVFRSSUJVVEVFTlVNX0xvbmd9LA0KKyAgICB7MHhmODYzNjQ2MCwgKEZYX0xQQ1dTVFIpTCJpbnRlcm5hdGlvbmFsQ2FycmllciIsIFhGQV9BVFRSSUJVVEVFTlVNX0ludGVybmF0aW9uYWxDYXJyaWVyfSwJezB4ZjlmYjM3YWMsIChGWF9MUENXU1RSKUwiUERGMS4zIiwgWEZBX0FUVFJJQlVURUVOVU1fUERGMV8zfSwJezB4ZjlmYjM3YWYsIChGWF9MUENXU1RSKUwiUERGMS42IiwgWEZBX0FUVFJJQlVURUVOVU1fUERGMV82fSwNCisgICAgezB4ZmJjZTdmMTksIChGWF9MUENXU1RSKUwic2VyaWYiLCBYRkFfQVRUUklCVVRFRU5VTV9TZXJpZn0sCXsweGZjODJkNjk1LCAoRlhfTFBDV1NUUilMInBvc3RTYXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmV9LAl7MHhmY2VmODZiNSwgKEZYX0xQQ1dTVFIpTCJyZWFkeSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5fSwNCisgICAgezB4ZmQ1NGZiYjcsIChGWF9MUENXU1RSKUwicG9zdFNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbn0sCXsweGZkYzBhYWUyLCAoRlhfTFBDV1NUUilMIkFyYWJpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0FyYWJpY30sCXsweGZlMDZkMmNhLCAoRlhfTFBDV1NUUilMImVycm9yIiwgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LA0KKyAgICB7MHhmZWZjNDg4NSwgKEZYX0xQQ1dTVFIpTCJ1cmxlbmNvZGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fVXJsZW5jb2RlZH0sCXsweGZmNzk1YWQyLCAoRlhfTFBDV1NUUilMImxvd2VyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkfSwNCit9Ow0KK2V4dGVybiBjb25zdCBGWF9JTlQzMiBnX2lYRkFFbnVtQ291bnQgPSBzaXplb2YoZ19YRkFFbnVtRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUVOVU1JTkZPKTsNCitzdGF0aWMgY29uc3QgQ1hGQV9NZWFzdXJlbWVudCBnX1hGQU1lYXN1cmVtZW50RGF0YVtdID0gew0KKyAgICBDWEZBX01lYXN1cmVtZW50KDAsIFhGQV9VTklUX0luKSwNCisgICAgQ1hGQV9NZWFzdXJlbWVudCgwLCBYRkFfVU5JVF9QdCksDQorICAgIENYRkFfTWVhc3VyZW1lbnQoNSwgWEZBX1VOSVRfTW0pLA0KKyAgICBDWEZBX01lYXN1cmVtZW50KDAuMjUsIFhGQV9VTklUX01tKSwNCisgICAgQ1hGQV9NZWFzdXJlbWVudCgtMSwgWEZBX1VOSVRfVW5rbm93biksDQorICAgIENYRkFfTWVhc3VyZW1lbnQoMCwgWEZBX1VOSVRfQW5nbGUpLA0KKyAgICBDWEZBX01lYXN1cmVtZW50KDEwLCBYRkFfVU5JVF9QdCksDQorICAgIENYRkFfTWVhc3VyZW1lbnQoMzYwLCBYRkFfVU5JVF9BbmdsZSksDQorICAgIENYRkFfTWVhc3VyZW1lbnQoMC41LCBYRkFfVU5JVF9QdCksDQorfTsNCitleHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUlORk8gZ19YRkFBdHRyaWJ1dGVEYXRhW10gPSB7DQorICAgIHsweDY4LCAoRlhfTFBDV1NUUilMImgiLCBYRkFfQVRUUklCVVRFX0gsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3NywgKEZYX0xQQ1dTVFIpTCJ3IiwgWEZBX0FUVFJJQlVURV9XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4NzgsIChGWF9MUENXU1RSKUwieCIsIFhGQV9BVFRSSUJVVEVfWCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4NzksIChGWF9MUENXU1RSKUwieSIsIFhGQV9BVFRSSUJVVEVfWSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4MjFhZWQsIChGWF9MUENXU1RSKUwiaWQiLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHgyNTM2MywgKEZYX0xQQ1dTVFIpTCJ0byIsIFhGQV9BVFRSSUJVVEVfVG8sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4Y2IwYWM5LCAoRlhfTFBDV1NUUilMImxpbmVUaHJvdWdoIiwgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4MjI4MmM3MywgKEZYX0xQQ1dTVFIpTCJoQWxpZ24iLCBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9MZWZ0fSwNCisgICAgezB4MmMxYzdmMSwgKEZYX0xQQ1dTVFIpTCJ0eXBlZmFjZSIsIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKEZYX0xQQ1dTVFIpTCJDb3VyaWVyIn0sDQorICAgIHsweDMxMDZjM2EsIChGWF9MUENXU1RSKUwiYmVmb3JlVGFyZ2V0IiwgWEZBX0FUVFJJQlVURV9CZWZvcmVUYXJnZXQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHgzMWIxOWMxLCAoRlhfTFBDV1NUUilMIm5hbWUiLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHgzODQ4YjNmLCAoRlhfTFBDV1NUUilMIm5leHQiLCBYRkFfQVRUUklCVVRFX05leHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQorICAgIHsweDQzZTM0OWIsIChGWF9MUENXU1RSKUwiZGF0YVJvd0NvdW50IiwgWEZBX0FUVFJJQlVURV9EYXRhUm93Q291bnQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg1NTE4YzI1LCAoRlhfTFBDV1NUUilMImJyZWFrIiwgWEZBX0FUVFJJQlVURV9CcmVhaywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9DbG9zZX0sDQorICAgIHsweDVjZTYxOTUsIChGWF9MUENXU1RSKUwidlNjcm9sbFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCisgICAgezB4OGM3NGFlOSwgKEZYX0xQQ1dTVFIpTCJmb250SG9yaXpvbnRhbFNjYWxlIiwgWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoRlhfTFBDV1NUUilMIjEwMCUifSwNCisgICAgezB4OGQ0ZjFjNywgKEZYX0xQQ1dTVFIpTCJ0ZXh0SW5kZW50IiwgWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4OTdjMWM2NSwgKEZYX0xQQ1dTVFIpTCJjb250ZXh0IiwgWEZBX0FUVFJJQlVURV9Db250ZXh0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1VOS05PV04sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDk4NzY1NzgsIChGWF9MUENXU1RSKUwidHJheU91dCIsIFhGQV9BVFRSSUJVVEVfVHJheU91dCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCisgICAgezB4YTJlMzUxNCwgKEZYX0xQQ1dTVFIpTCJjYXAiLCBYRkFfQVRUUklCVVRFX0NhcCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmV9LA0KKyAgICB7MHhiMzU0M2E2LCAoRlhfTFBDV1NUUilMIm1heCIsIFhGQV9BVFRSSUJVVEVfTWF4LCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGIzNTZjYTQsIChGWF9MUENXU1RSKUwibWluIiwgWEZBX0FUVFJJQlVURV9NaW4sIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMX0sDQorICAgIHsweGJiOGRmNWQsIChGWF9MUENXU1RSKUwicmVmIiwgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4YmI4ZjNkZiwgKEZYX0xQQ1dTVFIpTCJyaWQiLCBYRkFfQVRUUklCVVRFX1JpZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGMwODBjZDMsIChGWF9MUENXU1RSKUwidXJsIiwgWEZBX0FUVFJJQlVURV9VcmwsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhjZmVhMDJlLCAoRlhfTFBDV1NUUilMImxlZnRJbnNldCIsIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4MTAyNmM1OWQsIChGWF9MUENXU1RSKUwid2lkb3dzIiwgWEZBX0FUVFJJQlVURV9XaWRvd3MsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDEwNTllYzE4LCAoRlhfTFBDV1NUUilMImxldmVsIiwgWEZBX0FUVFJJQlVURV9MZXZlbCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDEzNTZjYWY4LCAoRlhfTFBDV1NUUilMImJvdHRvbUluc2V0IiwgWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDEzYTA4YmRiLCAoRlhfTFBDV1NUUilMIm92ZXJmbG93VGFyZ2V0IiwgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDE0MTRkNDMxLCAoRlhfTFBDV1NUUilMImFsbG93TWFjcm8iLCBYRkFfQVRUUklCVVRFX0FsbG93TWFjcm8sIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDE0YTMyZDUyLCAoRlhfTFBDV1NUUilMInBhZ2VQb3NpdGlvbiIsIFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQorICAgIHsweDE1MTdkZmExLCAoRlhfTFBDV1NUUilMImNvbHVtbldpZHRocyIsIFhGQV9BVFRSSUJVVEVfQ29sdW1uV2lkdGhzLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4MTY5MTM0YTEsIChGWF9MUENXU1RSKUwib3ZlcmZsb3dMZWFkZXIiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4MWI4ZGNlM2UsIChGWF9MUENXU1RSKUwiYWN0aW9uIiwgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fSW5jbHVkZX0sDQorICAgIHsweDFlNDU5YjhmLCAoRlhfTFBDV1NUUilMIm5vblJlcHVkaWF0aW9uIiwgWEZBX0FUVFJJQlVURV9Ob25SZXB1ZGlhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDFlYzhhYjJjLCAoRlhfTFBDV1NUUilMInJhdGUiLCBYRkFfQVRUUklCVVRFX1JhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpNTB9LA0KKyAgICB7MHgxZWYzYTY0YSwgKEZYX0xQQ1dTVFIpTCJhbGxvd1JpY2hUZXh0IiwgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHgyMDM4YzliMiwgKEZYX0xQQ1dTVFIpTCJyb2xlIiwgWEZBX0FUVFJJQlVURV9Sb2xlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4MjA5MTQzNjcsIChGWF9MUENXU1RSKUwib3ZlcmZsb3dUcmFpbGVyIiwgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHgyMjZjYThmMSwgKEZYX0xQQ1dTVFIpTCJvcGVyYXRpb24iLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4MjRkODUxNjcsIChGWF9MUENXU1RSKUwidGltZW91dCIsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDI1NzY0NDM2LCAoRlhfTFBDV1NUUilMInRvcEluc2V0IiwgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDI1ODM5ODUyLCAoRlhfTFBDV1NUUilMImFjY2VzcyIsIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wZW59LA0KKyAgICB7MHgyNjhiN2VjMSwgKEZYX0xQQ1dTVFIpTCJjb21tYW5kVHlwZSIsIFhGQV9BVFRSSUJVVEVfQ29tbWFuZFR5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LA0KKyAgICB7MHgyOGRlZTZlOSwgKEZYX0xQQ1dTVFIpTCJmb3JtYXQiLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHgyOGUxN2U5MSwgKEZYX0xQQ1dTVFIpTCJkYXRhUHJlcCIsIFhGQV9BVFRSSUJVVEVfRGF0YVByZXAsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQorICAgIHsweDI5MmI4OGZlLCAoRlhfTFBDV1NUUilMIndpZGdldERhdGEiLCBYRkFfQVRUUklCVVRFX1dpZGdldERhdGEsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4Mjk0MThiYjcsIChGWF9MUENXU1RSKUwiYWJiciIsIFhGQV9BVFRSSUJVVEVfQWJiciwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDJhODJkOTljLCAoRlhfTFBDV1NUUilMIm1hcmdpblJpZ2h0IiwgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDJiNWRmNTFlLCAoRlhfTFBDV1NUUilMImRhdGFEZXNjcmlwdGlvbiIsIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHgyYmIzZjQ3MCwgKEZYX0xQQ1dTVFIpTCJlbmNpcGhlck9ubHkiLCBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDJjZDc5MDMzLCAoRlhfTFBDV1NUUilMImtlcm5pbmdNb2RlIiwgWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAgezB4MmVlNzY3OGYsIChGWF9MUENXU1RSKUwicm90YXRlIiwgWEZBX0FUVFJJQlVURV9Sb3RhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KKyAgICB7MHgyZjEwNWY3MiwgKEZYX0xQQ1dTVFIpTCJ3b3JkQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCk3fSwNCisgICAgezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4MzRhZTEwM2MsIChGWF9MUENXU1RSKUwicmVzZXJ2ZSIsIFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA0KX0sDQorICAgIHsweDM2NTA1NTdlLCAoRlhfTFBDV1NUUilMInRleHRMb2NhdGlvbiIsIFhGQV9BVFRSSUJVVEVfVGV4dExvY2F0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0JlbG93fSwNCisgICAgezB4MzljZGIwYTIsIChGWF9MUENXU1RSKUwicHJpb3JpdHkiLCBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0N1c3RvbX0sDQorICAgIHsweDNhMDI3M2E2LCAoRlhfTFBDV1NUUilMInVuZGVybGluZSIsIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHgzYjU4MjI4NiwgKEZYX0xQQ1dTVFIpTCJtb2R1bGVXaWR0aCIsIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMyl9LA0KKyAgICB7MHgzZDEyM2MyNiwgKEZYX0xQQ1dTVFIpTCJoeXBoZW5hdGUiLCBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4M2U3YWY5NGYsIChGWF9MUENXU1RSKUwibGlzdGVuIiwgWEZBX0FUVFJJQlVURV9MaXN0ZW4sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seX0sDQorICAgIHsweDQxNTZlZTNmLCAoRlhfTFBDV1NUUilMImRlbGltaXRlciIsIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NDJmZWQxZmQsIChGWF9MUENXU1RSKUwiY29udGVudFR5cGUiLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NDUzZWFmMzgsIChGWF9MUENXU1RSKUwic3RhcnROZXciLCBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHg0NWE2ZGFmOCwgKEZYX0xQQ1dTVFIpTCJlb2ZBY3Rpb24iLCBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3R9LA0KKyAgICB7MHg0N2NmYTQzYSwgKEZYX0xQQ1dTVFIpTCJhbGxvd05ldXRyYWwiLCBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4NDdkMDM0OTAsIChGWF9MUENXU1RSKUwiY29ubmVjdGlvbiIsIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDQ4NzNjNjAxLCAoRlhfTFBDV1NUUilMImJhc2VsaW5lU2hpZnQiLCBYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg0YjMxOTc2NywgKEZYX0xQQ1dTVFIpTCJvdmVybGluZVBlcmlvZCIsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQWxsfSwNCisgICAgezB4NGI4YmM4NDAsIChGWF9MUENXU1RSKUwiZnJhY0RpZ2l0cyIsIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkyfSwNCisgICAgezB4NGVmM2QwMmMsIChGWF9MUENXU1RSKUwib3JpZW50YXRpb24iLCBYRkFfQVRUUklCVVRFX09yaWVudGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1BvcnRyYWl0fSwNCisgICAgezB4NGZkYzM0NTQsIChGWF9MUENXU1RSKUwidGltZVN0YW1wIiwgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1hEUCwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NTI2NjZmMWMsIChGWF9MUENXU1RSKUwicHJpbnRDaGVja0RpZ2l0IiwgWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDUzNDcyOWM5LCAoRlhfTFBDV1NUUilMIm1hcmdpbkxlZnQiLCBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg1MzkyZWE1OCwgKEZYX0xQQ1dTVFIpTCJzdHJva2UiLCBYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZH0sDQorICAgIHsweDU0MDRkNmRmLCAoRlhfTFBDV1NUUilMIm1vZHVsZUhlaWdodCIsIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDIpfSwNCisgICAgezB4NTRmYTcyMmMsIChGWF9MUENXU1RSKUwidHJhbnNmZXJFbmNvZGluZyIsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg1NTJkOWFkNSwgKEZYX0xQQ1dTVFIpTCJ1c2FnZSIsIFhGQV9BVFRSSUJVVEVfVXNhZ2UsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0QW5kSW1wb3J0fSwNCisgICAgezB4NTcwY2U4MzUsIChGWF9MUENXU1RSKUwicHJlc2VuY2UiLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGV9LA0KKyAgICB7MHg1NzM5ZDFmZiwgKEZYX0xQQ1dTVFIpTCJyYWRpeE9mZnNldCIsIFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg1Nzc2ODJhYywgKEZYX0xQQ1dTVFIpTCJwcmVzZXJ2ZSIsIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg1OGJlMjg3MCwgKEZYX0xQQ1dTVFIpTCJhbGlhc05vZGUiLCBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHg1YTMyZTQ5MywgKEZYX0xQQ1dTVFIpTCJtdWx0aUxpbmUiLCBYRkFfQVRUUklCVVRFX011bHRpTGluZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4NWE1MGU5ZTYsIChGWF9MUENXU1RSKUwidmVyc2lvbiIsIFhGQV9BVFRSSUJVVEVfVmVyc2lvbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDVhYjIzYjZjLCAoRlhfTFBDV1NUUilMInN0YXJ0Q2hhciIsIFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NWI3MDdhMzUsIChGWF9MUENXU1RSKUwic2NyaXB0VGVzdCIsIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9FcnJvcn0sDQorICAgIHsweDVjMDU0NzU1LCAoRlhfTFBDV1NUUilMInN0YXJ0QW5nbGUiLCBYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KKyAgICB7MHg1ZWM5NThjMCwgKEZYX0xQQ1dTVFIpTCJjdXJzb3JUeXBlIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Gb3J3YXJkT25seX0sDQorICAgIHsweDVmNzYwYjUwLCAoRlhfTFBDV1NUUilMImRpZ2l0YWxTaWduYXR1cmUiLCBYRkFfQVRUUklCVVRFX0RpZ2l0YWxTaWduYXR1cmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg2MGE2MWVkZCwgKEZYX0xQQ1dTVFIpTCJjb2RlVHlwZSIsIFhGQV9BVFRSSUJVVEVfQ29kZVR5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg2MGQ0YzhiMSwgKEZYX0xQQ1dTVFIpTCJvdXRwdXQiLCBYRkFfQVRUUklCVVRFX091dHB1dCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NjQxMTBhYjUsIChGWF9MUENXU1RSKUwiYm9va2VuZFRyYWlsZXIiLCBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NjVlMzBjNjcsIChGWF9MUENXU1RSKUwiaW1hZ2luZ0JCb3giLCBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoRlhfTFBDV1NUUilMIm5vbmUifSwNCisgICAgezB4NjY1MzljNDgsIChGWF9MUENXU1RSKUwiZXhjbHVkZUluaXRpYWxDYXAiLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVJbml0aWFsQ2FwLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHg2NjY0MmY4ZiwgKEZYX0xQQ1dTVFIpTCJmb3JjZSIsIFhGQV9BVFRSSUJVVEVfRm9yY2UsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg2OWFhMjI5MiwgKEZYX0xQQ1dTVFIpTCJjcmxTaWduIiwgWEZBX0FUVFJJQlVURV9DcmxTaWduLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4NmEzNDA1ZGQsIChGWF9MUENXU1RSKUwicHJldmlvdXMiLCBYRkFfQVRUUklCVVRFX1ByZXZpb3VzLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHg2YTk1Yzk3NiwgKEZYX0xQQ1dTVFIpTCJwdXNoQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkzfSwNCisgICAgezB4NmI2ZGRjZmIsIChGWF9MUENXU1RSKUwibnVsbFRlc3QiLCBYRkFfQVRUUklCVVRFX051bGxUZXN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkfSwNCisgICAgezB4NmNmYTgyOGEsIChGWF9MUENXU1RSKUwicnVuQXQiLCBYRkFfQVRUUklCVVRFX1J1bkF0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweDczMWUwNjY1LCAoRlhfTFBDV1NUUilMInNwYWNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3NDc4OGY4YiwgKEZYX0xQQ1dTVFIpTCJzd2VlcEFuZ2xlIiwgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDcpfSwNCisgICAgezB4NzhiZmY1MzEsIChGWF9MUENXU1RSKUwibnVtYmVyT2ZDZWxscyIsIFhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscywgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4Nzk1NDMwNTUsIChGWF9MUENXU1RSKUwibGV0dGVyU3BhY2luZyIsIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDc5OTc1ZjJiLCAoRlhfTFBDV1NUUilMImxvY2tUeXBlIiwgWEZBX0FUVFJJQlVURV9Mb2NrVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fUmVhZE9ubHl9LA0KKyAgICB7MHg3YTBjYzQ3MSwgKEZYX0xQQ1dTVFIpTCJwYXNzd29yZENoYXIiLCBYRkFfQVRUUklCVVRFX1Bhc3N3b3JkQ2hhciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKEZYX0xQQ1dTVFIpTCIqIn0sDQorICAgIHsweDdhN2NjMzQxLCAoRlhfTFBDV1NUUilMInZBbGlnbiIsIFhGQV9BVFRSSUJVVEVfVkFsaWduLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1RvcH0sDQorICAgIHsweDdiMjk2MzBhLCAoRlhfTFBDV1NUUilMInNvdXJjZUJlbG93IiwgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlfSwNCisgICAgezB4N2I5NWU2NjEsIChGWF9MUENXU1RSKUwiaW52ZXJ0ZWQiLCBYRkFfQVRUUklCVVRFX0ludmVydGVkLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHg3YzJmZDgwYiwgKEZYX0xQQ1dTVFIpTCJtYXJrIiwgWEZBX0FUVFJJQlVURV9NYXJrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0RlZmF1bHR9LA0KKyAgICB7MHg3YzJmZjZhZSwgKEZYX0xQQ1dTVFIpTCJtYXhIIiwgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4N2MyZmY2YmQsIChGWF9MUENXU1RSKUwibWF4VyIsIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDdjNzMyYTY2LCAoRlhfTFBDV1NUUilMInRydW5jYXRlIiwgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4N2QwMjM1NmMsIChGWF9MUENXU1RSKUwibWluSCIsIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDdkMDIzNTdiLCAoRlhfTFBDV1NUUilMIm1pblciLCBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3ZDBiNWZjYSwgKEZYX0xQQ1dTVFIpTCJpbml0aWFsIiwgWEZBX0FUVFJJQlVURV9Jbml0aWFsLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTF9LA0KKyAgICB7MHg3ZDlmZDdjNSwgKEZYX0xQQ1dTVFIpTCJtb2RlIiwgWEZBX0FUVFJJQlVURV9Nb2RlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Vc2VQcmludGVyU2V0dGluZ30sDQorICAgIHsweDdlN2U4NDVlLCAoRlhfTFBDV1NUUilMImxheW91dCIsIFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9ufSwNCisgICAgezB4N2Y2ZmQzZDcsIChGWF9MUENXU1RSKUwic2VydmVyIiwgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg4MjRmMjFiNywgKEZYX0xQQ1dTVFIpTCJlbWJlZFBERiIsIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDgzNDBlYTY2LCAoRlhfTFBDV1NUUilMIm9kZE9yRXZlbiIsIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQorICAgIHsweDgzNmQ0ZDdjLCAoRlhfTFBDV1NUUilMInRhYkRlZmF1bHQiLCBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg4ODU1ODA1ZiwgKEZYX0xQQ1dTVFIpTCJjb250YWlucyIsIFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fRGF0YX0sDQorICAgIHsweDhhNjkyNTIxLCAoRlhfTFBDV1NUUilMInJpZ2h0SW5zZXQiLCBYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg4YWYyZTY1NywgKEZYX0xQQ1dTVFIpTCJtYXhDaGFycyIsIFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDhiOTBlMWYyLCAoRlhfTFBDV1NUUilMIm9wZW4iLCBYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2x9LA0KKyAgICB7MHg4Yzk5Mzc3ZSwgKEZYX0xQQ1dTVFIpTCJyZWxhdGlvbiIsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDhkMTgxZDYxLCAoRlhfTFBDV1NUUilMIndpZGVOYXJyb3dSYXRpbyIsIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoRlhfTFBDV1NUUilMIjM6MSJ9LA0KKyAgICB7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHg4ZTI5ZDc5NCwgKEZYX0xQQ1dTVFIpTCJzaWduYXR1cmVUeXBlIiwgWEZBX0FUVFJJQlVURV9TaWduYXR1cmVUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlcn0sDQorICAgIHsweDhlYzYyMDRjLCAoRlhfTFBDV1NUUilMImxpbmVUaHJvdWdoUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9BbGx9LA0KKyAgICB7MHg4ZWQxODJkMSwgKEZYX0xQQ1dTVFIpTCJzaGFwZSIsIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlfSwNCisgICAgezB4OGZhMDE3OTAsIChGWF9MUENXU1RSKUwidGFiU3RvcHMiLCBYRkFfQVRUUklCVVRFX1RhYlN0b3BzLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4OGZjMzZjMGEsIChGWF9MUENXU1RSKUwib3V0cHV0QmVsb3ciLCBYRkFfQVRUUklCVVRFX091dHB1dEJlbG93LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9XYXJufSwNCisgICAgezB4OTA0MWQ0YjAsIChGWF9MUENXU1RSKUwic2hvcnQiLCBYRkFfQVRUUklCVVRFX1Nob3J0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4OTA3Yzc3MTksIChGWF9MUENXU1RSKUwiZm9udFZlcnRpY2FsU2NhbGUiLCBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoRlhfTFBDV1NUUilMIjEwMCUifSwNCisgICAgezB4OTQ0NDZkY2MsIChGWF9MUENXU1RSKUwidGhpY2tuZXNzIiwgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgOCl9LA0KKyAgICB7MHg5NTdmYTAwNiwgKEZYX0xQQ1dTVFIpTCJjb21taXRPbiIsIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fU2VsZWN0fSwNCisgICAgezB4OTgyYmQ4OTIsIChGWF9MUENXU1RSKUwicmVtYWluQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTN9LA0KKyAgICB7MHg5OGZkNGQ4MSwgKEZYX0xQQ1dTVFIpTCJrZXlBZ3JlZW1lbnQiLCBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDk5ODAwZDdhLCAoRlhfTFBDV1NUUilMImVycm9yQ29ycmVjdGlvbkxldmVsIiwgWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDlhNjNkYTNkLCAoRlhfTFBDV1NUUilMInVwc01vZGUiLCBYRkFfQVRUUklCVVRFX1Vwc01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fVXNDYXJyaWVyfSwNCisgICAgezB4OWNjMTdkNzUsIChGWF9MUENXU1RSKUwibWVyZ2VNb2RlIiwgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQ29uc3VtZURhdGF9LA0KKyAgICB7MHg5ZDgzM2Q3NSwgKEZYX0xQQ1dTVFIpTCJjaXJjdWxhciIsIFhGQV9BVFRSSUJVVEVfQ2lyY3VsYXIsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweDlkOGVlMjA0LCAoRlhfTFBDV1NUUilMInBzTmFtZSIsIFhGQV9BVFRSSUJVVEVfUHNOYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweDlkY2MzYWIzLCAoRlhfTFBDV1NUUilMInRyYWlsZXIiLCBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhhMDkzMzk1NCwgKEZYX0xQQ1dTVFIpTCJ1bmljb2RlUmFuZ2UiLCBYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhhMWIwZDJmNSwgKEZYX0xQQ1dTVFIpTCJleGVjdXRlVHlwZSIsIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0fSwNCisgICAgezB4YTI1YTg4M2QsIChGWF9MUENXU1RSKUwiZHVwbGV4SW1wb3NpdGlvbiIsIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Mb25nRWRnZX0sDQorICAgIHsweGE0MmNhMWI3LCAoRlhfTFBDV1NUUilMInRyYXlJbiIsIFhGQV9BVFRSSUJVVEVfVHJheUluLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHhhNDMzZjAwMSwgKEZYX0xQQ1dTVFIpTCJiaW5kaW5nTm9kZSIsIFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4YTUzNDBmZjUsIChGWF9MUENXU1RSKUwiYm9mQWN0aW9uIiwgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX01vdmVGaXJzdH0sDQorICAgIHsweGE1YjQxMGNmLCAoRlhfTFBDV1NUUilMInNhdmUiLCBYRkFfQVRUUklCVVRFX1NhdmUsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweGE2MTE4Yzg5LCAoRlhfTFBDV1NUUilMInRhcmdldFR5cGUiLCBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGE2NjQwNGNiLCAoRlhfTFBDV1NUUilMImtleUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4YTY3MTAyNjIsIChGWF9MUENXU1RSKUwiY3JlZGVudGlhbFNlcnZlclBvbGljeSIsIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHsweGE2ODY5NzViLCAoRlhfTFBDV1NUUilMInNpemUiLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNil9LA0KKyAgICB7MHhhODVlNzRmMywgKEZYX0xQQ1dTVFIpTCJpbml0aWFsTnVtYmVyIiwgWEZBX0FUVFJJQlVURV9Jbml0aWFsTnVtYmVyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTF9LA0KKyAgICB7MHhhYmVmMzdlMywgKEZYX0xQQ1dTVFIpTCJzbG9wZSIsIFhGQV9BVFRSSUJVVEVfU2xvcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNofSwNCisgICAgezB4YWJmYTZjNGYsIChGWF9MUENXU1RSKUwiY1NwYWNlIiwgWEZBX0FUVFJJQlVURV9DU3BhY2UsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShGWF9MUENXU1RSKUwiU1JHQiJ9LA0KKyAgICB7MHhhYzA2ZTJiMCwgKEZYX0xQQ1dTVFIpTCJjb2xTcGFuIiwgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTF9LA0KKyAgICB7MHhhZGM0Yzc3YiwgKEZYX0xQQ1dTVFIpTCJiaW5kaW5nIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4YWY3NTQ2MTMsIChGWF9MUENXU1RSKUwiY2hlY2tzdW0iLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhiMDQ1ZmJjNSwgKEZYX0xQQ1dTVFIpTCJjaGFyRW5jb2RpbmciLCBYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKEZYX0xQQ1dTVFIpTCJVVEYtOCJ9LA0KKyAgICB7MHhiMGU1NDg1ZCwgKEZYX0xQQ1dTVFIpTCJiaW5kIiwgWEZBX0FUVFJJQlVURV9CaW5kLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGIxMjEyOGI3LCAoRlhfTFBDV1NUUilMInRleHRFbnRyeSIsIFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHhiMzczYTg2MiwgKEZYX0xQQ1dTVFIpTCJhcmNoaXZlIiwgWEZBX0FUVFJJQlVURV9BcmNoaXZlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4YjU5OGExZjcsIChGWF9MUENXU1RSKUwidXVpZCIsIFhGQV9BVFRSSUJVVEVfVXVpZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfWERQLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhiNWU0OWJmMiwgKEZYX0xQQ1dTVFIpTCJwb3N0dXJlIiwgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCisgICAgezB4YjZiNDQxNzIsIChGWF9MUENXU1RSKUwiYWZ0ZXIiLCBYRkFfQVRUUklCVVRFX0FmdGVyLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHhiNzE2NDY3YiwgKEZYX0xQQ1dTVFIpTCJvcnBoYW5zIiwgWEZBX0FUVFJJQlVURV9PcnBoYW5zLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHhiYzBjNDY5NSwgKEZYX0xQQ1dTVFIpTCJxdWFsaWZpZWROYW1lIiwgWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhiYzhmYTM1MCwgKEZYX0xQQ1dTVFIpTCJsb2NhbGUiLCBYRkFfQVRUUklCVVRFX0xvY2FsZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGJkNmUxZDg4LCAoRlhfTFBDV1NUUilMIndlaWdodCIsIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCisgICAgezB4YmQ5NmEwZTksIChGWF9MUENXU1RSKUwidW5kZXJsaW5lUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQWxsfSwNCisgICAgezB4YmRlOWFiZGEsIChGWF9MUENXU1RSKUwiZGF0YSIsIFhGQV9BVFRSSUJVVEVfRGF0YSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9MaW5rfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGJlOWJhNDcyLCAoRlhfTFBDV1NUUilMIm51bWJlcmVkIiwgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkxfSwNCisgICAgezB4YzAzNWM2YjEsIChGWF9MUENXU1RSKUwiZGF0YUNvbHVtbkNvdW50IiwgWEZBX0FUVFJJQlVURV9EYXRhQ29sdW1uQ291bnQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhjMGVjOWZhNCwgKEZYX0xQQ1dTVFIpTCJvdmVybGluZSIsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMH0sDQorICAgIHsweGMyYmEwOTIzLCAoRlhfTFBDV1NUUilMInVybFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4YzJiZDQwZmQsIChGWF9MUENXU1RSKUwiYW5jaG9yVHlwZSIsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0fSwNCisgICAgezB4YzM5YTg4YmQsIChGWF9MUENXU1RSKUwibGFiZWxSZWYiLCBYRkFfQVRUUklCVVRFX0xhYmVsUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4YzNjMTQ0MmYsIChGWF9MUENXU1RSKUwiYm9va2VuZExlYWRlciIsIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGM0NTQ3YTA4LCAoRlhfTFBDV1NUUilMIm1heExlbmd0aCIsIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKSAtIDF9LA0KKyAgICB7MHhjNGZlZDA5YiwgKEZYX0xQQ1dTVFIpTCJhY2Nlc3NLZXkiLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGM1NzYyMTU3LCAoRlhfTFBDV1NUUilMImN1cnNvckxvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQ2xpZW50fSwNCisgICAgezB4Yzg2MGYzMGEsIChGWF9MUENXU1RSKUwiZGVsYXllZE9wZW4iLCBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGM4ZGE0ZGE3LCAoRlhfTFBDV1NUUilMInRhcmdldCIsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4Y2E1ZGMyN2MsIChGWF9MUENXU1RSKUwiZGF0YUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfRGF0YUVuY2lwaGVybWVudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGNiMTUwNDc5LCAoRlhfTFBDV1NUUilMImFmdGVyVGFyZ2V0IiwgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGNiY2FmNjZkLCAoRlhfTFBDV1NUUilMImxlYWRlciIsIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4Y2NhNzg5N2UsIChGWF9MUENXU1RSKUwicGlja2VyIiwgWEZBX0FUVFJJQlVURV9QaWNrZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fSG9zdH0sDQorICAgIHsweGNkN2Y3YjU0LCAoRlhfTFBDV1NUUilMImZyb20iLCBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhjZWE1ZTYyYywgKEZYX0xQQ1dTVFIpTCJiYXNlUHJvZmlsZSIsIFhGQV9BVFRSSUJVVEVfQmFzZVByb2ZpbGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fRnVsbH0sDQorICAgIHsweGQxNzFiMjQwLCAoRlhfTFBDV1NUUilMImFzcGVjdCIsIFhGQV9BVFRSSUJVVEVfQXNwZWN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0ZpdH0sDQorICAgIHsweGQzYzg0ZDI1LCAoRlhfTFBDV1NUUilMInJvd0NvbHVtblJhdGlvIiwgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGQ0YjAxOTIxLCAoRlhfTFBDV1NUUilMImxpbmVIZWlnaHQiLCBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMSl9LA0KKyAgICB7MHhkNGNjNTNmOCwgKEZYX0xQQ1dTVFIpTCJoaWdobGlnaHQiLCBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9JbnZlcnRlZH0sDQorICAgIHsweGQ1MGY5MDNhLCAoRlhfTFBDV1NUUilMInZhbHVlUmVmIiwgWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGQ1MjQ4MmUwLCAoRlhfTFBDV1NUUilMIm1heEVudHJpZXMiLCBYRkFfQVRUUklCVVRFX01heEVudHJpZXMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAoRlhfTFBWT0lEKTV9LA0KKyAgICB7MHhkNTdjNTEzYywgKEZYX0xQQ1dTVFIpTCJkYXRhTGVuZ3RoIiwgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4ZDYxMjhkOGQsIChGWF9MUENXU1RSKUwiYWN0aXZpdHkiLCBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrfSwNCisgICAgezB4ZDZhMzk5OTAsIChGWF9MUENXU1RSKUwiaW5wdXQiLCBYRkFfQVRUUklCVVRFX0lucHV0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4ZDcwNzk4YzIsIChGWF9MUENXU1RSKUwiYmxhbmtPck5vdEJsYW5rIiwgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fQW55fSwNCisgICAgezB4ZDg2MWY4YWYsIChGWF9MUENXU1RSKUwiYWRkUmV2b2NhdGlvbkluZm8iLCBYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4ZDhmOTgyYmYsIChGWF9MUENXU1RSKUwiZ2VuZXJpY0ZhbWlseSIsIFhGQV9BVFRSSUJVVEVfR2VuZXJpY0ZhbWlseSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fU2VyaWZ9LA0KKyAgICB7MHhkOTk2ZmE5YiwgKEZYX0xQQ1dTVFIpTCJoYW5kIiwgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0V2ZW59LA0KKyAgICB7MHhkYjU1ZmVjNSwgKEZYX0xQQ1dTVFIpTCJocmVmIiwgWEZBX0FUVFJJQlVURV9IcmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4ZGM3NTY3NmMsIChGWF9MUENXU1RSKUwidGV4dEVuY29kaW5nIiwgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhkZTdmOTJiYSwgKEZYX0xQQ1dTVFIpTCJsZWFkRGlnaXRzIiwgWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKSAtIDF9LA0KKyAgICB7MHhlMTFhMmNiYywgKEZYX0xQQ1dTVFIpTCJwZXJtaXNzaW9ucyIsIFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpMn0sDQorICAgIHsweGUxOGI1NjU5LCAoRlhfTFBDV1NUUilMInNwYWNlQWJvdmUiLCBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHhlMWEyNmI1NiwgKEZYX0xQQ1dTVFIpTCJjb2RlQmFzZSIsIFhGQV9BVFRSSUJVVEVfQ29kZUJhc2UsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhlMzQ5ZDA0NCwgKEZYX0xQQ1dTVFIpTCJzdG9jayIsIFhGQV9BVFRSSUJVVEVfU3RvY2ssIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhlMzcyYWU5NywgKEZYX0xQQ1dTVFIpTCJpc051bGwiLCBYRkFfQVRUUklCVVRFX0lzTnVsbCwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4ZTRjM2E1ZTUsIChGWF9MUENXU1RSKUwicmVzdG9yZVN0YXRlIiwgWEZBX0FUVFJJQlVURV9SZXN0b3JlU3RhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsfSwNCisgICAgezB4ZTVjOTZkNmEsIChGWF9MUENXU1RSKUwiZXhjbHVkZUFsbENhcHMiLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKTB9LA0KKyAgICB7MHhlNjRiMTEyOSwgKEZYX0xQQ1dTVFIpTCJmb3JtYXRUZXN0IiwgWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmd9LA0KKyAgICB7MHhlNmY5OTQ4NywgKEZYX0xQQ1dTVFIpTCJoU2Nyb2xsUG9saWN5IiwgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHhlOGRkZGY1MCwgKEZYX0xQQ1dTVFIpTCJqb2luIiwgWEZBX0FUVFJJQlVURV9Kb2luLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQorICAgIHsweGU4ZjExOGE4LCAoRlhfTFBDV1NUUilMImtleUNlcnRTaWduIiwgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGU5NDhiOWE4LCAoRlhfTFBDV1NUUilMInJhZGl1cyIsIFhGQV9BVFRSSUJVVEVfUmFkaXVzLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4ZTk5NmIyZmUsIChGWF9MUENXU1RSKUwic291cmNlQWJvdmUiLCBYRkFfQVRUUklCVVRFX1NvdXJjZUFib3ZlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9XYXJufSwNCisgICAgezB4ZWE3MDkwYTAsIChGWF9MUENXU1RSKUwib3ZlcnJpZGUiLCBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhlYjA5MTAwMywgKEZYX0xQQ1dTVFIpTCJjbGFzc0lkIiwgWEZBX0FUVFJJQlVURV9DbGFzc0lkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4ZWI1MTFiNTQsIChGWF9MUENXU1RSKUwiZGlzYWJsZSIsIFhGQV9BVFRSSUJVVEVfRGlzYWJsZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4ZWRhOTAxN2EsIChGWF9MUENXU1RSKUwic2NvcGUiLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHsweGYxOTc4NDRkLCAoRlhfTFBDV1NUUilMIm1hdGNoIiwgWEZBX0FUVFJJQlVURV9NYXRjaCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PbmNlfSwNCisgICAgezB4ZjIwMDkzMzksIChGWF9MUENXU1RSKUwicGxhY2VtZW50IiwgWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTGVmdH0sDQorICAgIHsweGY0ZmZjZTczLCAoRlhfTFBDV1NUUilMImJlZm9yZSIsIFhGQV9BVFRSSUJVVEVfQmVmb3JlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHhmNTMxYjA1OSwgKEZYX0xQQ1dTVFIpTCJ3cml0aW5nU2NyaXB0IiwgWEZBX0FUVFJJQlVURV9Xcml0aW5nU2NyaXB0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Bc3Rlcmlza30sDQorICAgIHsweGY1NzVjYTc1LCAoRlhfTFBDV1NUUilMImVuZENoYXIiLCBYRkFfQVRUUklCVVRFX0VuZENoYXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKEZYX0xQVk9JRCkwfSwNCisgICAgezB4ZjZiNGFmYjAsIChGWF9MUENXU1RSKUwibG9uZyIsIFhGQV9BVFRSSUJVVEVfTG9uZywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRCkoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweGY2YjU5NTQzLCAoRlhfTFBDV1NUUilMImludGFjdCIsIFhGQV9BVFRSSUJVVEVfSW50YWN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHhmODg5ZTc0NywgKEZYX0xQQ1dTVFIpTCJ4ZHBDb250ZW50IiwgWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAgezB4ZmVhNTNlYzYsIChGWF9MUENXU1RSKUwiZGVjaXBoZXJPbmx5IiwgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBWT0lEKU5VTEx9LA0KK307DQorZXh0ZXJuIGNvbnN0IEZYX0lOVDMyIGdfaVhGQUF0dHJpYnV0ZUNvdW50ID0gc2l6ZW9mKGdfWEZBQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOw0KK2V4dGVybiBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzW10gPSB7DQorICAgIHtYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LCBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWR9LA0KKyAgICB7WEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWN9LA0KKyAgICB7WEZBX0VMRU1FTlRfS2V5VXNhZ2UsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9acGx9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fR3JlZ29yaWFufSwNCisgICAge1hGQV9FTEVNRU5UX0JhcmNvZGUsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXJjb2RlLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZVBhdHRlcm4sIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9NZWR9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIFhGQV9BVFRSSUJVVEVfRm9ybWF0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3ViamVjdEROcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX0lzc3VlcnMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1BhdHRlcm4sIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0hhdGNofSwNCisgICAge1hGQV9FTEVNRU5UX0NvbXByZXNzLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0ltYWdlT25seX0sDQorICAgIHtYRkFfRUxFTUVOVF9JbWFnZSwgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NH0sDQorICAgIHtYRkFfRUxFTUVOVF9UaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdWJmb3JtLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX05hbWV9LA0KKyAgICB7WEZBX0VMRU1FTlRfSGFuZGxlciwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1JlY29yZCwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIChGWF9MUFZPSUQpMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21tYW5kLCBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIChGWF9MUFZPSUQpMzB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2VTZXQsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2V9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXF1YXRlLCBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCAoRlhfTFBWT0lEKU5VTEx9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXF1YXRlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYXZlcnNlLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9OZXh0fSwNCisgICAge1hGQV9FTEVNRU5UX0VuY29kaW5ncywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25pbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9PaWRzLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2lnbmF0dXJlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fUERGMV8zfSwNCisgICAge1hGQV9FTEVNRU5UX0V4RGF0YSwgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7WEZBX0VMRU1FTlRfTGluZWFyLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodH0sDQorICAgIHtYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX1N5bWJvbH0sDQorICAgIHtYRkFfRUxFTUVOVF9FcXVhdGVSYW5nZSwgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgKEZYX0xQVk9JRClOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25EYXRhLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9TaWdufSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGVQYXR0ZXJuLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCisgICAge1hGQV9FTEVNRU5UX0JpbmQsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAge1hGQV9FTEVNRU5UX1JlYXNvbnMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9ybSwgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIChGWF9MUFZPSUQpTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWx1ZSwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgKEZYX0xQVk9JRCkwfSwNCisgICAge1hGQV9FTEVNRU5UX0NhbGN1bGF0ZSwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9FcnJvcn0sDQorICAgIHtYRkFfRUxFTUVOVF9Db25uZWN0LCBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIChGWF9MUFZPSUQpMTV9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3VibWl0LCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKEZYX0xQVk9JRClYRkFfQVRUUklCVVRFRU5VTV9YZHB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmFkaWFsLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIChGWF9MUFZPSUQpWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlfSwNCisgICAge1hGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX09jY3VyLCBYRkFfQVRUUklCVVRFX01heCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgKEZYX0xQVk9JRCkxfSwNCisgICAge1hGQV9FTEVNRU5UX051bWJlclN5bWJvbCwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAoRlhfTFBWT0lEKVhGQV9BVFRSSUJVVEVFTlVNX0RlY2ltYWx9LA0KK307DQorZXh0ZXJuIGNvbnN0IEZYX0lOVDMyIGdfaVhGQU5vdHN1cmVDb3VudCA9IHNpemVvZihnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzKSAvIHNpemVvZihYRkFfTk9UU1VSRUFUVFJJQlVURSk7DQorZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USU5GTyBnX1hGQUVsZW1lbnREYXRhW10gPSB7DQorICAgIHsweDIzZWUzLCAoRlhfTFBDV1NUUilMInBzIiwgWEZBX0VMRU1FTlRfUHMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjUzNjMsIChGWF9MUENXU1RSKUwidG8iLCBYRkFfRUxFTUVOVF9UbywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MjU4N2UsIChGWF9MUENXU1RSKUwidWkiLCBYRkFfRUxFTUVOVF9VaSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDFjNjQ4YiwgKEZYX0xQQ1dTVFIpTCJyZWNvcmRTZXQiLCBYRkFfRUxFTUVOVF9SZWNvcmRTZXQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTcxNDI4ZiwgKEZYX0xQQ1dTVFIpTCJzdWJzZXRCZWxvdyIsIFhGQV9FTEVNRU5UX1N1YnNldEJlbG93LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgxYTA3NzZhLCAoRlhfTFBDV1NUUilMInN1YmZvcm1TZXQiLCBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4MjM0MGQ3MCwgKEZYX0xQQ1dTVFIpTCJhZG9iZUV4dGVuc2lvbkxldmVsIiwgWEZBX0VMRU1FTlRfQWRvYmVFeHRlbnNpb25MZXZlbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MmMxYzdmMSwgKEZYX0xQQ1dTVFIpTCJ0eXBlZmFjZSIsIFhGQV9FTEVNRU5UX1R5cGVmYWNlLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDU1MThjMjUsIChGWF9MUENXU1RSKUwiYnJlYWsiLCBYRkFfRUxFTUVOVF9CcmVhaywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDVmZmY1MjMsIChGWF9MUENXU1RSKUwiZm9udEluZm8iLCBYRkFfRUxFTUVOVF9Gb250SW5mbywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2NTNhMjI3LCAoRlhfTFBDV1NUUilMIm51bWJlclBhdHRlcm4iLCBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJuLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg2NWI0YTA1LCAoRlhfTFBDV1NUUilMImR5bmFtaWNSZW5kZXIiLCBYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ZTQzNjJlLCAoRlhfTFBDV1NUUilMInByaW50U2NhbGluZyIsIFhGQV9FTEVNRU5UX1ByaW50U2NhbGluZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4N2ZlNmQzYSwgKEZYX0xQQ1dTVFIpTCJjaGVja0J1dHRvbiIsIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODBjZjU4ZiwgKEZYX0xQQ1dTVFIpTCJkYXRlUGF0dGVybnMiLCBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODExOTI5ZCwgKEZYX0xQQ1dTVFIpTCJzb3VyY2VTZXQiLCBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHg5ZjlkNjEyLCAoRlhfTFBDV1NUUilMImFtZCIsIFhGQV9FTEVNRU5UX0FtZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OWY5ZWZiNiwgKEZYX0xQQ1dTVFIpTCJhcmMiLCBYRkFfRUxFTUVOVF9BcmMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhNDg4MzVlLCAoRlhfTFBDV1NUUilMImRheSIsIFhGQV9FTEVNRU5UX0RheSwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YTYzMjhiOCwgKEZYX0xQQ1dTVFIpTCJlcmEiLCBYRkFfRUxFTUVOVF9FcmEsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGFlNmEwYTAsIChGWF9MUENXU1RSKUwiam9nIiwgWEZBX0VMRU1FTlRfSm9nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiMWIzZDIyLCAoRlhfTFBDV1NUUilMImxvZyIsIFhGQV9FTEVNRU5UX0xvZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiMzU0MzllLCAoRlhfTFBDV1NUUilMIm1hcCIsIFhGQV9FTEVNRU5UX01hcCwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGIzNTUzMDEsIChGWF9MUENXU1RSKUwibWRwIiwgWEZBX0VMRU1FTlRfTWRwLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjQyMDQzOCwgKEZYX0xQQ1dTVFIpTCJicmVha0JlZm9yZSIsIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjZhMDkxYywgKEZYX0xQQ1dTVFIpTCJvaWQiLCBYRkFfRUxFTUVOVF9PaWQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4Yjg0Mzg5ZiwgKEZYX0xQQ1dTVFIpTCJwY2wiLCBYRkFfRUxFTUVOVF9QY2wsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Yjg0M2RiYSwgKEZYX0xQQ1dTVFIpTCJwZGYiLCBYRkFfRUxFTUVOVF9QZGYsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YmI4ZGY1ZCwgKEZYX0xQQ1dTVFIpTCJyZWYiLCBYRkFfRUxFTUVOVF9SZWYsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4YzA4MGNkMCwgKEZYX0xQQ1dTVFIpTCJ1cmkiLCBYRkFfRUxFTUVOVF9VcmksIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGM1NmFmYmYsIChGWF9MUENXU1RSKUwieGRjIiwgWEZBX0VMRU1FTlRfWGRjLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfWGRjLCBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHhjNTZhZmNjLCAoRlhfTFBDV1NUUilMInhkcCIsIFhGQV9FTEVNRU5UX1hkcCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjNTZiOWZmLCAoRlhfTFBDV1NUUilMInhmYSIsIFhGQV9FTEVNRU5UX1hmYSwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweGM1NmZjYjcsIChGWF9MUENXU1RSKUwieHNsIiwgWEZBX0VMRU1FTlRfWHNsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM4Yjg5ZDYsIChGWF9MUENXU1RSKUwienBsIiwgWEZBX0VMRU1FTlRfWnBsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM5YmFlOTQsIChGWF9MUENXU1RSKUwiY2FjaGUiLCBYRkFfRUxFTUVOVF9DYWNoZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjYjAxNmJlLCAoRlhfTFBDV1NUUilMIm1hcmdpbiIsIFhGQV9FTEVNRU5UX01hcmdpbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGUxMzc4ZmUsIChGWF9MUENXU1RSKUwia2V5VXNhZ2UiLCBYRkFfRUxFTUVOVF9LZXlVc2FnZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGZlMzU5NmEsIChGWF9MUENXU1RSKUwiZXhjbHVkZSIsIFhGQV9FTEVNRU5UX0V4Y2x1ZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDEwMzk1YWM3LCAoRlhfTFBDV1NUUilMImNob2ljZUxpc3QiLCBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTA1OWVjMTgsIChGWF9MUENXU1RSKUwibGV2ZWwiLCBYRkFfRUxFTUVOVF9MZXZlbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MTA4NzQ4MDQsIChGWF9MUENXU1RSKUwibGFiZWxQcmludGVyIiwgWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEwYzQwZTAzLCAoRlhfTFBDV1NUUilMImNhbGVuZGFyU3ltYm9scyIsIFhGQV9FTEVNRU5UX0NhbGVuZGFyU3ltYm9scywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxMGYxZWEyNCwgKEZYX0xQQ1dTVFIpTCJwYXJhIiwgWEZBX0VMRU1FTlRfUGFyYSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEwZjFlYTM3LCAoRlhfTFBDV1NUUilMInBhcnQiLCBYRkFfRUxFTUVOVF9QYXJ0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgxMTQwOTc1YiwgKEZYX0xQQ1dTVFIpTCJwZGZhIiwgWEZBX0VMRU1FTlRfUGRmYSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxMTU0ZWZlNiwgKEZYX0xQQ1dTVFIpTCJmaWx0ZXIiLCBYRkFfRUxFTUVOVF9GaWx0ZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxM2Y0MWRlMSwgKEZYX0xQQ1dTVFIpTCJwcmVzZW50IiwgWEZBX0VMRU1FTlRfUHJlc2VudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxODI3ZTZlYSwgKEZYX0xQQ1dTVFIpTCJwYWdpbmF0aW9uIiwgWEZBX0VMRU1FTlRfUGFnaW5hdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MTg0NjM3MDcsIChGWF9MUENXU1RSKUwiZW5jb2RpbmciLCBYRkFfRUxFTUVOVF9FbmNvZGluZywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHgxODVlNDFlMiwgKEZYX0xQQ1dTVFIpTCJldmVudCIsIFhGQV9FTEVNRU5UX0V2ZW50LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MWFkYjE0MmQsIChGWF9MUENXU1RSKUwid2hpdGVzcGFjZSIsIFhGQV9FTEVNRU5UX1doaXRlc3BhY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDFmM2Y2NGMzLCAoRlhfTFBDV1NUUilMImRlZmF1bHRVaSIsIFhGQV9FTEVNRU5UX0RlZmF1bHRVaSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDIwNGU4N2NiLCAoRlhfTFBDV1NUUilMImRhdGFNb2RlbCIsIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4MjA1N2IzNTAsIChGWF9MUENXU1RSKUwiYmFyY29kZSIsIFhGQV9FTEVNRU5UX0JhcmNvZGUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyMDU5NmJhZCwgKEZYX0xQQ1dTVFIpTCJ0aW1lUGF0dGVybiIsIFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJuLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyMTBiNzRkMywgKEZYX0xQQ1dTVFIpTCJiYXRjaE91dHB1dCIsIFhGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDIxMmZmMGUyLCAoRlhfTFBDV1NUUilMImVuZm9yY2UiLCBYRkFfRUxFTUVOVF9FbmZvcmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyMWQzNTFiNCwgKEZYX0xQQ1dTVFIpTCJjdXJyZW5jeVN5bWJvbHMiLCBYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbHMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjFkYjgzYzUsIChGWF9MUENXU1RSKUwiYWRkU2lsZW50UHJpbnQiLCBYRkFfRUxFTUVOVF9BZGRTaWxlbnRQcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MjIyNjYyNTgsIChGWF9MUENXU1RSKUwicmVuYW1lIiwgWEZBX0VMRU1FTlRfUmVuYW1lLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgyMjZjYThmMSwgKEZYX0xQQ1dTVFIpTCJvcGVyYXRpb24iLCBYRkFfRUxFTUVOVF9PcGVyYXRpb24sIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHgyM2UyN2I4NCwgKEZYX0xQQ1dTVFIpTCJ0eXBlZmFjZXMiLCBYRkFfRUxFTUVOVF9UeXBlZmFjZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjNmNGFhNzUsIChGWF9MUENXU1RSKUwic3ViamVjdEROcyIsIFhGQV9FTEVNRU5UX1N1YmplY3RETnMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyNDBkNWU4ZSwgKEZYX0xQQ1dTVFIpTCJpc3N1ZXJzIiwgWEZBX0VMRU1FTlRfSXNzdWVycywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI0NTdhMDMzLCAoRlhfTFBDV1NUUilMInNpZ25hdHVyZVBzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHNldWRvTW9kZWwsIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDI0YTUyZjhhLCAoRlhfTFBDV1NUUilMIndzZGxDb25uZWN0aW9uIiwgWEZBX0VMRU1FTlRfV3NkbENvbm5lY3Rpb24sIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI1NGViZDA3LCAoRlhfTFBDV1NUUilMImRlYnVnIiwgWEZBX0VMRU1FTlRfRGVidWcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjY1NWM2NmEsIChGWF9MUENXU1RSKUwiZGVsdGEiLCBYRkFfRUxFTUVOVF9EZWx0YSwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDI2YzBkYWVjLCAoRlhfTFBDV1NUUilMImVyYU5hbWVzIiwgWEZBX0VMRU1FTlRfRXJhTmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjczYWIwM2IsIChGWF9MUENXU1RSKUwibW9kaWZ5QW5ub3RzIiwgWEZBX0VMRU1FTlRfTW9kaWZ5QW5ub3RzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyNzg3NWJiNCwgKEZYX0xQQ1dTVFIpTCJzdGFydE5vZGUiLCBYRkFfRUxFTUVOVF9TdGFydE5vZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDI4NWQwZGJjLCAoRlhfTFBDV1NUUilMImJ1dHRvbiIsIFhGQV9FTEVNRU5UX0J1dHRvbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI4ZGVlNmU5LCAoRlhfTFBDV1NUUilMImZvcm1hdCIsIFhGQV9FTEVNRU5UX0Zvcm1hdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDJhMjMzNDllLCAoRlhfTFBDV1NUUilMImJvcmRlciIsIFhGQV9FTEVNRU5UX0JvcmRlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDJhZTY3ZjE5LCAoRlhfTFBDV1NUUilMImFyZWEiLCBYRkFfRUxFTUVOVF9BcmVhLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHgyYzNjNGM2NywgKEZYX0xQQ1dTVFIpTCJoeXBoZW5hdGlvbiIsIFhGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MmQwOGFmODUsIChGWF9MUENXU1RSKUwidGV4dCIsIFhGQV9FTEVNRU5UX1RleHQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyZDcxYjAwZiwgKEZYX0xQQ1dTVFIpTCJ0aW1lIiwgWEZBX0VMRU1FTlRfVGltZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgWEZBX0VMRU1FTlRfVHlwZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MmZlMDU3ZTksIChGWF9MUENXU1RSKUwib3ZlcnByaW50IiwgWEZBX0VMRU1FTlRfT3ZlcnByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzMDJhZWUxNiwgKEZYX0xQQ1dTVFIpTCJjZXJ0aWZpY2F0ZXMiLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzMGIyMjdkZiwgKEZYX0xQQ1dTVFIpTCJlbmNyeXB0aW9uTWV0aG9kcyIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2RzLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MzJiOTAwZDEsIChGWF9MUENXU1RSKUwic2V0UHJvcGVydHkiLCBYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDMzN2Q5ZTQ1LCAoRlhfTFBDV1NUUilMInByaW50ZXJOYW1lIiwgWEZBX0VMRU1FTlRfUHJpbnRlck5hbWUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDMzZWRkYTRiLCAoRlhfTFBDV1NUUilMInN0YXJ0UGFnZSIsIFhGQV9FTEVNRU5UX1N0YXJ0UGFnZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4MzgxOTQzZTQsIChGWF9MUENXU1RSKUwicGFnZU9mZnNldCIsIFhGQV9FTEVNRU5UX1BhZ2VPZmZzZXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MzgyMTA2Y2QsIChGWF9MUENXU1RSKUwiZGF0ZVRpbWUiLCBYRkFfRUxFTUVOVF9EYXRlVGltZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzODZlNzQyMSwgKEZYX0xQQ1dTVFIpTCJjb21iIiwgWEZBX0VMRU1FTlRfQ29tYiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDM5MGFjZDllLCAoRlhfTFBDV1NUUilMInBhdHRlcm4iLCBYRkFfRUxFTUVOVF9QYXR0ZXJuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Mzk0MjE2M2UsIChGWF9MUENXU1RSKUwiaWZFbXB0eSIsIFhGQV9FTEVNRU5UX0lmRW1wdHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDM5OTQ0YTdiLCAoRlhfTFBDV1NUUilMInN1cHByZXNzQmFubmVyIiwgWEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDNiM2MzZGNhLCAoRlhfTFBDV1NUUilMIm91dHB1dEJpbiIsIFhGQV9FTEVNRU5UX091dHB1dEJpbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4M2I4YTQwMjQsIChGWF9MUENXU1RSKUwiZmllbGQiLCBYRkFfRUxFTUVOVF9GaWVsZCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDNjMTUzNTJmLCAoRlhfTFBDV1NUUilMImFnZW50IiwgWEZBX0VMRU1FTlRfQWdlbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4M2Q3ZTg2NjgsIChGWF9MUENXU1RSKUwib3V0cHV0WFNMIiwgWEZBX0VMRU1FTlRfT3V0cHV0WFNMLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDNlMWM5MWM1LCAoRlhfTFBDV1NUUilMImFkanVzdERhdGEiLCBYRkFfRUxFTUVOVF9BZGp1c3REYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgzZTdhOTQwOCwgKEZYX0xQQ1dTVFIpTCJhdXRvU2F2ZSIsIFhGQV9FTEVNRU5UX0F1dG9TYXZlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgzZWNlYWQ5NCwgKEZYX0xQQ1dTVFIpTCJjb250ZW50QXJlYSIsIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4M2VmMzM0ZTMsIChGWF9MUENXU1RSKUwiZXZlbnRQc2V1ZG9Nb2RlbCIsIFhGQV9FTEVNRU5UX0V2ZW50UHNldWRvTW9kZWwsIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDNmYWRhZWMwLCAoRlhfTFBDV1NUUilMIndzZGxBZGRyZXNzIiwgWEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg0MDYyM2I1YiwgKEZYX0xQQ1dTVFIpTCJzb2xpZCIsIFhGQV9FTEVNRU5UX1NvbGlkLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NDFmMGJkNzYsIChGWF9MUENXU1RSKUwiZGF0ZVRpbWVTeW1ib2xzIiwgWEZBX0VMRU1FTlRfRGF0ZVRpbWVTeW1ib2xzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0NDRlNzUyMywgKEZYX0xQQ1dTVFIpTCJlbmNyeXB0aW9uTGV2ZWwiLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTGV2ZWwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDQ1MjNhZjU1LCAoRlhfTFBDV1NUUilMImVkZ2UiLCBYRkFfRUxFTUVOVF9FZGdlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NDVkNWUzYzEsIChGWF9MUENXU1RSKUwic3RpcHBsZSIsIFhGQV9FTEVNRU5UX1N0aXBwbGUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0NzVlNGU4NywgKEZYX0xQQ1dTVFIpTCJhdHRyaWJ1dGVzIiwgWEZBX0VMRU1FTlRfQXR0cmlidXRlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NDg3YThjODcsIChGWF9MUENXU1RSKUwidmVyc2lvbkNvbnRyb2wiLCBYRkFfRUxFTUVOVF9WZXJzaW9uQ29udHJvbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0OGU1MjQ4YywgKEZYX0xQQ1dTVFIpTCJtZXJpZGllbSIsIFhGQV9FTEVNRU5UX01lcmlkaWVtLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0OGYzNjcxOSwgKEZYX0xQQ1dTVFIpTCJleGNsR3JvdXAiLCBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHg0OTc3MzU2YiwgKEZYX0xQQ1dTVFIpTCJ0b29sVGlwIiwgWEZBX0VMRU1FTlRfVG9vbFRpcCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg0OTlhZmVjYywgKEZYX0xQQ1dTVFIpTCJjb21wcmVzcyIsIFhGQV9FTEVNRU5UX0NvbXByZXNzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDRhMGM0OTQ4LCAoRlhfTFBDV1NUUilMInJlYXNvbiIsIFhGQV9FTEVNRU5UX1JlYXNvbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg0YmRjY2UxMywgKEZYX0xQQ1dTVFIpTCJleGVjdXRlIiwgWEZBX0VMRU1FTlRfRXhlY3V0ZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDRjNTZiMjE2LCAoRlhfTFBDV1NUUilMImNvbnRlbnRDb3B5IiwgWEZBX0VMRU1FTlRfQ29udGVudENvcHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDRjYzE3NmQzLCAoRlhfTFBDV1NUUilMImRhdGVUaW1lRWRpdCIsIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDRlMWUzOWI2LCAoRlhfTFBDV1NUUilMImNvbmZpZyIsIFhGQV9FTEVNRU5UX0NvbmZpZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweDRlMmQ2MDgzLCAoRlhfTFBDV1NUUilMImltYWdlIiwgWEZBX0VMRU1FTlRfSW1hZ2UsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NGU4MTQxNTAsIChGWF9MUENXU1RSKUwiI3hIVE1MIiwgWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg0ZjIzODhjMSwgKEZYX0xQQ1dTVFIpTCJudW1iZXJPZkNvcGllcyIsIFhGQV9FTEVNRU5UX051bWJlck9mQ29waWVzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0ZjUxMmUzMCwgKEZYX0xQQ1dTVFIpTCJiZWhhdmlvck92ZXJyaWRlIiwgWEZBX0VMRU1FTlRfQmVoYXZpb3JPdmVycmlkZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NGZkYzM0NTQsIChGWF9MUENXU1RSKUwidGltZVN0YW1wIiwgWEZBX0VMRU1FTlRfVGltZVN0YW1wLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NTFkOTA1NDYsIChGWF9MUENXU1RSKUwibW9udGgiLCBYRkFfRUxFTUVOVF9Nb250aCwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NTIzNDM3ZTQsIChGWF9MUENXU1RSKUwidmlld2VyUHJlZmVyZW5jZXMiLCBYRkFfRUxFTUVOVF9WaWV3ZXJQcmVmZXJlbmNlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg1M2FiYzFjNiwgKEZYX0xQQ1dTVFIpTCJzY3JpcHRNb2RlbCIsIFhGQV9FTEVNRU5UX1NjcmlwdE1vZGVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1NDAzNGMyZiwgKEZYX0xQQ1dTVFIpTCJkZWNpbWFsIiwgWEZBX0VMRU1FTlRfRGVjaW1hbCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1NDIwMmM5ZSwgKEZYX0xQQ1dTVFIpTCJzdWJmb3JtIiwgWEZBX0VMRU1FTlRfU3ViZm9ybSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDU0MmM3MzAwLCAoRlhfTFBDV1NUUilMInNlbGVjdCIsIFhGQV9FTEVNRU5UX1NlbGVjdCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4NTQzNmQxOTgsIChGWF9MUENXU1RSKUwid2luZG93IiwgWEZBX0VMRU1FTlRfV2luZG93LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg1NDczYjZkYywgKEZYX0xQQ1dTVFIpTCJsb2NhbGVTZXQiLCBYRkFfRUxFTUVOVF9Mb2NhbGVTZXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweDU2YWUxNzllLCAoRlhfTFBDV1NUUilMImhhbmRsZXIiLCBYRkFfRUxFTUVOVF9IYW5kbGVyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDU3MDBiZDVmLCAoRlhfTFBDV1NUUilMImhvc3RQc2V1ZG9Nb2RlbCIsIFhGQV9FTEVNRU5UX0hvc3RQc2V1ZG9Nb2RlbCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCisgICAgezB4NTcwY2U4MzUsIChGWF9MUENXU1RSKUwicHJlc2VuY2UiLCBYRkFfRUxFTUVOVF9QcmVzZW5jZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NTc3OWQ2NWYsIChGWF9MUENXU1RSKUwicmVjb3JkIiwgWEZBX0VMRU1FTlRfUmVjb3JkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg1OWM4ZjI3ZCwgKEZYX0xQQ1dTVFIpTCJlbWJlZCIsIFhGQV9FTEVNRU5UX0VtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1YTUwZTllNiwgKEZYX0xQQ1dTVFIpTCJ2ZXJzaW9uIiwgWEZBX0VMRU1FTlRfVmVyc2lvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NWI4MzgzZGYsIChGWF9MUENXU1RSKUwiY29tbWFuZCIsIFhGQV9FTEVNRU5UX0NvbW1hbmQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NWM0M2M2YzMsIChGWF9MUENXU1RSKUwiY29waWVzIiwgWEZBX0VMRU1FTlRfQ29waWVzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1ZTBjMmM0OSwgKEZYX0xQQ1dTVFIpTCJzdGFwbGUiLCBYRkFfRUxFTUVOVF9TdGFwbGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NWU1MDgzZGQsIChGWF9MUENXU1RSKUwic3VibWl0Rm9ybWF0IiwgWEZBX0VMRU1FTlRfU3VibWl0Rm9ybWF0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1ZThjNWQyMCwgKEZYX0xQQ1dTVFIpTCJib29sZWFuIiwgWEZBX0VMRU1FTlRfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDYwNDkwYTg1LCAoRlhfTFBDV1NUUilMIm1lc3NhZ2UiLCBYRkFfRUxFTUVOVF9NZXNzYWdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2MGQ0YzhiMSwgKEZYX0xQQ1dTVFIpTCJvdXRwdXQiLCBYRkFfRUxFTUVOVF9PdXRwdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjE4MTAwODEsIChGWF9MUENXU1RSKUwicHNNYXAiLCBYRkFfRUxFTUVOVF9Qc01hcCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2MmJkOTA0YiwgKEZYX0xQQ1dTVFIpTCJleGNsdWRlTlMiLCBYRkFfRUxFTUVOVF9FeGNsdWRlTlMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDY2OWQ0Zjc3LCAoRlhfTFBDV1NUUilMImFzc2lzdCIsIFhGQV9FTEVNRU5UX0Fzc2lzdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDY3MzM0YTFjLCAoRlhfTFBDV1NUUilMInBpY3R1cmUiLCBYRkFfRUxFTUVOVF9QaWN0dXJlLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NjdmZTczMzQsIChGWF9MUENXU1RSKUwidHJhdmVyc2FsIiwgWEZBX0VMRU1FTlRfVHJhdmVyc2FsLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Njg5NDU4OWMsIChGWF9MUENXU1RSKUwic2lsZW50UHJpbnQiLCBYRkFfRUxFTUVOVF9TaWxlbnRQcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2OGExNmJiZCwgKEZYX0xQQ1dTVFIpTCJ3ZWJDbGllbnQiLCBYRkFfRUxFTUVOVF9XZWJDbGllbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjlmMTE1ZGYsIChGWF9MUENXU1RSKUwibGF5b3V0UHNldWRvTW9kZWwiLCBYRkFfRUxFTUVOVF9MYXlvdXRQc2V1ZG9Nb2RlbCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCisgICAgezB4NmE0YmMwODQsIChGWF9MUENXU1RSKUwicHJvZHVjZXIiLCBYRkFfRUxFTUVOVF9Qcm9kdWNlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NmE5ZTA0YzksIChGWF9MUENXU1RSKUwiY29ybmVyIiwgWEZBX0VMRU1FTlRfQ29ybmVyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NmNjZDcyNzQsIChGWF9MUENXU1RSKUwibXNnSWQiLCBYRkFfRUxFTUVOVF9Nc2dJZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NmU2NzkyMWYsIChGWF9MUENXU1RSKUwiY29sb3IiLCBYRkFfRUxFTUVOVF9Db2xvciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDZlYzIxN2E1LCAoRlhfTFBDV1NUUilMImtlZXAiLCBYRkFfRUxFTUVOVF9LZWVwLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NmVlZjExMTYsIChGWF9MUENXU1RSKUwicXVlcnkiLCBYRkFfRUxFTUVOVF9RdWVyeSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg3MDMzYmZkNSwgKEZYX0xQQ1dTVFIpTCJpbnNlcnQiLCBYRkFfRUxFTUVOVF9JbnNlcnQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDcwNGFmMzg5LCAoRlhfTFBDV1NUUilMImltYWdlRWRpdCIsIFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDcyMzMwMThhLCAoRlhfTFBDV1NUUilMInZhbGlkYXRlIiwgWEZBX0VMRU1FTlRfVmFsaWRhdGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3MmJhNDdiNCwgKEZYX0xQQ1dTVFIpTCJkaWdlc3RNZXRob2RzIiwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDcyZjJhYTdhLCAoRlhfTFBDV1NUUilMIm51bWJlclBhdHRlcm5zIiwgWEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybnMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NzRjYWVkMjksIChGWF9MUENXU1RSKUwicGFnZVNldCIsIFhGQV9FTEVNRU5UX1BhZ2VTZXQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHg3NTY4ZTZhZSwgKEZYX0xQQ1dTVFIpTCJpbnRlZ2VyIiwgWEZBX0VMRU1FTlRfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDc2MTgyZGI5LCAoRlhfTFBDV1NUUilMInNvYXBBZGRyZXNzIiwgWEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg3NzMxNDZjNSwgKEZYX0xQQ1dTVFIpTCJlcXVhdGUiLCBYRkFfRUxFTUVOVF9FcXVhdGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDc3ZDQ0OWRkLCAoRlhfTFBDV1NUUilMImZvcm1GaWVsZEZpbGxpbmciLCBYRkFfRUxFTUVOVF9Gb3JtRmllbGRGaWxsaW5nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ODg5ZDY4YSwgKEZYX0xQQ1dTVFIpTCJwYWdlUmFuZ2UiLCBYRkFfRUxFTUVOVF9QYWdlUmFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDdiYWNhMmUzLCAoRlhfTFBDV1NUUilMInVwZGF0ZSIsIFhGQV9FTEVNRU5UX1VwZGF0ZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4N2NlODkwMDEsIChGWF9MUENXU1RSKUwiY29ubmVjdFN0cmluZyIsIFhGQV9FTEVNRU5UX0Nvbm5lY3RTdHJpbmcsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDdkOWZkN2M1LCAoRlhfTFBDV1NUUilMIm1vZGUiLCBYRkFfRUxFTUVOVF9Nb2RlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ZTdlODQ1ZSwgKEZYX0xQQ1dTVFIpTCJsYXlvdXQiLCBYRkFfRUxFTUVOVF9MYXlvdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDdlODQ1YzM0LCAoRlhfTFBDV1NUUilMIiN4bWwiLCBYRkFfRUxFTUVOVF9TaGFycHhtbCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg3ZmIzNDFkZiwgKEZYX0xQQ1dTVFIpTCJ4c2RDb25uZWN0aW9uIiwgWEZBX0VMRU1FTlRfWHNkQ29ubmVjdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4N2ZmYjUxY2MsIChGWF9MUENXU1RSKUwidHJhdmVyc2UiLCBYRkFfRUxFTUVOVF9UcmF2ZXJzZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDgwMjAzYjVhLCAoRlhfTFBDV1NUUilMImVuY29kaW5ncyIsIFhGQV9FTEVNRU5UX0VuY29kaW5ncywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDgwMzU1MGZjLCAoRlhfTFBDV1NUUilMInRlbXBsYXRlIiwgWEZBX0VMRU1FTlRfVGVtcGxhdGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4ODAzZDViYmMsIChGWF9MUENXU1RSKUwiYWNyb2JhdCIsIFhGQV9FTEVNRU5UX0Fjcm9iYXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODIxZDY1NjksIChGWF9MUENXU1RSKUwidmFsaWRhdGlvbk1lc3NhZ2luZyIsIFhGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDgzMGU2ODhmLCAoRlhfTFBDV1NUUilMInNpZ25pbmciLCBYRkFfRUxFTUVOVF9TaWduaW5nLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODNhNTUwZDIsIChGWF9MUENXU1RSKUwiZGF0YVdpbmRvdyIsIFhGQV9FTEVNRU5UX0RhdGFXaW5kb3csIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCisgICAgezB4ODNkYWI5ZjUsIChGWF9MUENXU1RSKUwic2NyaXB0IiwgWEZBX0VMRU1FTlRfU2NyaXB0LCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ODQxMWViY2QsIChGWF9MUENXU1RSKUwiYWRkVmlld2VyUHJlZmVyZW5jZXMiLCBYRkFfRUxFTUVOVF9BZGRWaWV3ZXJQcmVmZXJlbmNlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ODc3NzY0MmUsIChGWF9MUENXU1RSKUwiYWx3YXlzRW1iZWQiLCBYRkFfRUxFTUVOVF9BbHdheXNFbWJlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ODc3YTZiMzksIChGWF9MUENXU1RSKUwicGFzc3dvcmRFZGl0IiwgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODdlODRjOTksIChGWF9MUENXU1RSKUwibnVtZXJpY0VkaXQiLCBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDg4NTJjZGVjLCAoRlhfTFBDV1NUUilMImVuY3J5cHRpb25NZXRob2QiLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweDg5MWY0NjA2LCAoRlhfTFBDV1NUUilMImNoYW5nZSIsIFhGQV9FTEVNRU5UX0NoYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ODk5MzlmMzYsIChGWF9MUENXU1RSKUwicGFnZUFyZWEiLCBYRkFfRUxFTUVOVF9QYWdlQXJlYSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDhhOWQ2MjQ3LCAoRlhfTFBDV1NUUilMInN1Ym1pdFVybCIsIFhGQV9FTEVNRU5UX1N1Ym1pdFVybCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OGFkOGI5MGYsIChGWF9MUENXU1RSKUwib2lkcyIsIFhGQV9FTEVNRU5UX09pZHMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4YjAzNmYzMiwgKEZYX0xQQ1dTVFIpTCJzaWduYXR1cmUiLCBYRkFfRUxFTUVOVF9TaWduYXR1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4YjEyOGVmYiwgKEZYX0xQQ1dTVFIpTCJBREJFX0pTQ29uc29sZSIsIFhGQV9FTEVNRU5UX0FEQkVfSlNDb25zb2xlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg4YmNmZTk2ZSwgKEZYX0xQQ1dTVFIpTCJjYXB0aW9uIiwgWEZBX0VMRU1FTlRfQ2FwdGlvbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDhlMWMyOTIxLCAoRlhfTFBDV1NUUilMInJlbGV2YW50IiwgWEZBX0VMRU1FTlRfUmVsZXZhbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDhlM2YwYTRiLCAoRlhfTFBDV1NUUilMImZsaXBMYWJlbCIsIFhGQV9FTEVNRU5UX0ZsaXBMYWJlbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4OTAwMjgwYjcsIChGWF9MUENXU1RSKUwiZXhEYXRhIiwgWEZBX0VMRU1FTlRfRXhEYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDkxZTgwMzUyLCAoRlhfTFBDV1NUUilMImRheU5hbWVzIiwgWEZBX0VMRU1FTlRfRGF5TmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OTMxMTNiMTEsIChGWF9MUENXU1RSKUwic29hcEFjdGlvbiIsIFhGQV9FTEVNRU5UX1NvYXBBY3Rpb24sIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg5MzhiMDlmNiwgKEZYX0xQQ1dTVFIpTCJkZWZhdWx0VHlwZWZhY2UiLCBYRkFfRUxFTUVOVF9EZWZhdWx0VHlwZWZhY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDk1YjM3ODk3LCAoRlhfTFBDV1NUUilMIm1hbmlmZXN0IiwgWEZBX0VMRU1FTlRfTWFuaWZlc3QsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg5N2I3NmI1NCwgKEZYX0xQQ1dTVFIpTCJvdmVyZmxvdyIsIFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OWE1Nzg2MWIsIChGWF9MUENXU1RSKUwibGluZWFyIiwgWEZBX0VMRU1FTlRfTGluZWFyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OWFkNWE4MjEsIChGWF9MUENXU1RSKUwiY3VycmVuY3lTeW1ib2wiLCBYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OWM2NDcxYjMsIChGWF9MUENXU1RSKUwiZGVsZXRlIiwgWEZBX0VMRU1FTlRfRGVsZXRlLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg5ZGVlYTYxZCwgKEZYX0xQQ1dTVFIpTCJkZWx0YXMiLCBYRkFfRUxFTUVOVF9EZWx0YXMsIFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHg5ZTY3ZGUyMSwgKEZYX0xQQ1dTVFIpTCJkaWdlc3RNZXRob2QiLCBYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2QsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGVDfSwNCisgICAgezB4OWYzZTk1MTAsIChGWF9MUENXU1RSKUwiaW5zdGFuY2VNYW5hZ2VyIiwgWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyLCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhMDc5OTg5MiwgKEZYX0xQQ1dTVFIpTCJlcXVhdGVSYW5nZSIsIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhhMDg0YTM4MSwgKEZYX0xQQ1dTVFIpTCJtZWRpdW0iLCBYRkFfRUxFTUVOVF9NZWRpdW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhMTIxMWI4YiwgKEZYX0xQQ1dTVFIpTCJ0ZXh0RWRpdCIsIFhGQV9FTEVNRU5UX1RleHRFZGl0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YTE3MDA4ZjAsIChGWF9MUENXU1RSKUwidGVtcGxhdGVDYWNoZSIsIFhGQV9FTEVNRU5UX1RlbXBsYXRlQ2FjaGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YTRmN2I4OGYsIChGWF9MUENXU1RSKUwiY29tcHJlc3NPYmplY3RTdHJlYW0iLCBYRkFfRUxFTUVOVF9Db21wcmVzc09iamVjdFN0cmVhbSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YTY1ZjVkMTcsIChGWF9MUENXU1RSKUwiZGF0YVZhbHVlIiwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YTZjYWFhODksIChGWF9MUENXU1RSKUwiYWNjZXNzaWJsZUNvbnRlbnQiLCBYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YThjN2Q1ZTIsIChGWF9MUENXU1RSKUwibm9kZUxpc3QiLCBYRkFfRUxFTUVOVF9Ob2RlTGlzdCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX05vZGVMaXN0fSwNCisgICAgezB4YTk0Y2MwMGIsIChGWF9MUENXU1RSKUwiaW5jbHVkZVhEUENvbnRlbnQiLCBYRkFfRUxFTUVOVF9JbmNsdWRlWERQQ29udGVudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YTliMDgxYTEsIChGWF9MUENXU1RSKUwieG1sQ29ubmVjdGlvbiIsIFhGQV9FTEVNRU5UX1htbENvbm5lY3Rpb24sIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGFiMmEzYjc0LCAoRlhfTFBDV1NUUilMInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIiwgWEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGFiOGM1YTJiLCAoRlhfTFBDV1NUUilMInNpZ25EYXRhIiwgWEZBX0VMRU1FTlRfU2lnbkRhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhYmFhMmNlYiwgKEZYX0xQQ1dTVFIpTCJwYWNrZXRzIiwgWEZBX0VMRU1FTlRfUGFja2V0cywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YWRiYTM1OWMsIChGWF9MUENXU1RSKUwiZGF0ZVBhdHRlcm4iLCBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YWUyMjJiMmIsIChGWF9MUENXU1RSKUwiZHVwbGV4T3B0aW9uIiwgWEZBX0VMRU1FTlRfRHVwbGV4T3B0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiMDEyZWZmYiwgKEZYX0xQQ1dTVFIpTCJiYXNlIiwgWEZBX0VMRU1FTlRfQmFzZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YjBlNTQ4NWQsIChGWF9MUENXU1RSKUwiYmluZCIsIFhGQV9FTEVNRU5UX0JpbmQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGI0NWQ2MWIyLCAoRlhfTFBDV1NUUilMImNvbXByZXNzaW9uIiwgWEZBX0VMRU1FTlRfQ29tcHJlc3Npb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjU2M2YwZmYsIChGWF9MUENXU1RSKUwidXNlciIsIFhGQV9FTEVNRU5UX1VzZXIsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGI1ODQ4YWQ1LCAoRlhfTFBDV1NUUilMInJlY3RhbmdsZSIsIFhGQV9FTEVNRU5UX1JlY3RhbmdsZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGI2ZGFjYjcyLCAoRlhfTFBDV1NUUilMImVmZmVjdGl2ZU91dHB1dFBvbGljeSIsIFhGQV9FTEVNRU5UX0VmZmVjdGl2ZU91dHB1dFBvbGljeSwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjdkNzY1NGQsIChGWF9MUENXU1RSKUwiQURCRV9KU0RlYnVnZ2VyIiwgWEZBX0VMRU1FTlRfQURCRV9KU0RlYnVnZ2VyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiYWIzN2Y3MywgKEZYX0xQQ1dTVFIpTCJhY3JvYmF0NyIsIFhGQV9FTEVNRU5UX0Fjcm9iYXQ3LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJjNzAwODFlLCAoRlhfTFBDV1NUUilMImludGVyYWN0aXZlIiwgWEZBX0VMRU1FTlRfSW50ZXJhY3RpdmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGJjOGZhMzUwLCAoRlhfTFBDV1NUUilMImxvY2FsZSIsIFhGQV9FTEVNRU5UX0xvY2FsZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJjZDQ0OTQwLCAoRlhfTFBDV1NUUilMImN1cnJlbnRQYWdlIiwgWEZBX0VMRU1FTlRfQ3VycmVudFBhZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGJkZTlhYmRhLCAoRlhfTFBDV1NUUilMImRhdGEiLCBYRkFfRUxFTUVOVF9EYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJkZTlhYmRlLCAoRlhfTFBDV1NUUilMImRhdGUiLCBYRkFfRUxFTUVOVF9EYXRlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCBYRkFfRUxFTUVOVF9EZXNjLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YmY0YjY0MDUsIChGWF9MUENXU1RSKUwiZW5jcnlwdCIsIFhGQV9FTEVNRU5UX0VuY3J5cHQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiZmE4N2NjZSwgKEZYX0xQQ1dTVFIpTCJkcmF3IiwgWEZBX0VMRU1FTlRfRHJhdywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweGMxODFmZjRiLCAoRlhfTFBDV1NUUilMImVuY3J5cHRpb24iLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGMxOTcwZjQwLCAoRlhfTFBDV1NUUilMIm1lcmlkaWVtTmFtZXMiLCBYRkFfRUxFTUVOVF9NZXJpZGllbU5hbWVzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM1YWQ5ZjVlLCAoRlhfTFBDV1NUUilMIm1lc3NhZ2luZyIsIFhGQV9FTEVNRU5UX01lc3NhZ2luZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjNjk1NDlmNCwgKEZYX0xQQ1dTVFIpTCJzcGVhayIsIFhGQV9FTEVNRU5UX1NwZWFrLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGM3NzQzZGM3LCAoRlhfTFBDV1NUUilMImRhdGFHcm91cCIsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM3ZWIyMGU5LCAoRlhfTFBDV1NUUilMImNvbW1vbiIsIFhGQV9FTEVNRU5UX0NvbW1vbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjODVkNDUyOCwgKEZYX0xQQ1dTVFIpTCIjdGV4dCIsIFhGQV9FTEVNRU5UX1NoYXJwdGV4dCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhjODYxNTU2YSwgKEZYX0xQQ1dTVFIpTCJwYWdpbmF0aW9uT3ZlcnJpZGUiLCBYRkFfRUxFTUVOVF9QYWdpbmF0aW9uT3ZlcnJpZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGM5MDNkYWJiLCAoRlhfTFBDV1NUUilMInJlYXNvbnMiLCBYRkFfRUxFTUVOVF9SZWFzb25zLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YzlhODEyN2YsIChGWF9MUENXU1RSKUwic2lnbmF0dXJlUHJvcGVydGllcyIsIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVByb3BlcnRpZXMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjYTAxMGMyZCwgKEZYX0xQQ1dTVFIpTCJ0aHJlc2hvbGQiLCBYRkFfRUxFTUVOVF9UaHJlc2hvbGQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGNiNGM1ZTk2LCAoRlhfTFBDV1NUUilMImFwcGVhcmFuY2VGaWx0ZXIiLCBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweGNjOTJhYmE3LCAoRlhfTFBDV1NUUilMImZpbGwiLCBYRkFfRUxFTUVOVF9GaWxsLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Y2QzMDhiNzcsIChGWF9MUENXU1RSKUwiZm9udCIsIFhGQV9FTEVNRU5UX0ZvbnQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGNkMzA5ZmY0LCAoRlhfTFBDV1NUUilMImZvcm0iLCBYRkFfRUxFTUVOVF9Gb3JtLCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweGNlYmNjYTJkLCAoRlhfTFBDV1NUUilMIm1lZGl1bUluZm8iLCBYRkFfRUxFTUVOVF9NZWRpdW1JbmZvLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGNmZTBkNjQzLCAoRlhfTFBDV1NUUilMImNlcnRpZmljYXRlIiwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4ZDAxMmMwMzMsIChGWF9MUENXU1RSKUwicGFzc3dvcmQiLCBYRkFfRUxFTUVOVF9QYXNzd29yZCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4ZDAxNjA0YmQsIChGWF9MUENXU1RSKUwicnVuU2NyaXB0cyIsIFhGQV9FTEVNRU5UX1J1blNjcmlwdHMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGQxMjI3ZTZmLCAoRlhfTFBDV1NUUilMInRyYWNlIiwgWEZBX0VMRU1FTlRfVHJhY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZDE1MzI4NzYsIChGWF9MUENXU1RSKUwiZmxvYXQiLCBYRkFfRUxFTUVOVF9GbG9hdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhkMTdhNmMzMCwgKEZYX0xQQ1dTVFIpTCJyZW5kZXJQb2xpY3kiLCBYRkFfRUxFTUVOVF9SZW5kZXJQb2xpY3ksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGQ0YmY2ODIzLCAoRlhfTFBDV1NUUilMImxvZ1BzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfTG9nUHNldWRvTW9kZWwsIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweGQ1OGFhOTYyLCAoRlhfTFBDV1NUUilMImRlc3RpbmF0aW9uIiwgWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgWEZBX0VMRU1FTlRfVmFsdWUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkN2ExNDQ2MiwgKEZYX0xQQ1dTVFIpTCJib29rZW5kIiwgWEZBX0VMRU1FTlRfQm9va2VuZCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGQ4YzMxMjU0LCAoRlhfTFBDV1NUUilMImV4T2JqZWN0IiwgWEZBX0VMRU1FTlRfRXhPYmplY3QsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkYTZhODU5MCwgKEZYX0xQQ1dTVFIpTCJvcGVuQWN0aW9uIiwgWEZBX0VMRU1FTlRfT3BlbkFjdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkYWI0ZmI3ZCwgKEZYX0xQQ1dTVFIpTCJuZXZlckVtYmVkIiwgWEZBX0VMRU1FTlRfTmV2ZXJFbWJlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ZGI5ODQ3NWYsIChGWF9MUENXU1RSKUwiYmluZEl0ZW1zIiwgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGJmYmUwMmUsIChGWF9MUENXU1RSKUwiY2FsY3VsYXRlIiwgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGQ3Njc2ZWQsIChGWF9MUENXU1RSKUwicHJpbnQiLCBYRkFfRUxFTUVOVF9QcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZGRlMjczZDcsIChGWF9MUENXU1RSKUwiZXh0cmFzIiwgWEZBX0VMRU1FTlRfRXh0cmFzLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkZTE0NmIzNCwgKEZYX0xQQ1dTVFIpTCJwcm90byIsIFhGQV9FTEVNRU5UX1Byb3RvLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGYwNTkzMjEsIChGWF9MUENXU1RSKUwiZFNpZ0RhdGEiLCBYRkFfRUxFTUVOVF9EU2lnRGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGRmY2NmMDMwLCAoRlhfTFBDV1NUUilMImNyZWF0b3IiLCBYRkFfRUxFTUVOVF9DcmVhdG9yLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhkZmY3OGM2YSwgKEZYX0xQQ1dTVFIpTCJjb25uZWN0IiwgWEZBX0VMRU1FTlRfQ29ubmVjdCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZTExYTJjYmMsIChGWF9MUENXU1RSKUwicGVybWlzc2lvbnMiLCBYRkFfRUxFTUVOVF9QZXJtaXNzaW9ucywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlMTRjODAxYywgKEZYX0xQQ1dTVFIpTCJjb25uZWN0aW9uU2V0IiwgWEZBX0VMRU1FTlRfQ29ubmVjdGlvblNldCwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHhlMWM4M2ExNCwgKEZYX0xQQ1dTVFIpTCJzdWJtaXQiLCBYRkFfRUxFTUVOVF9TdWJtaXQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlMjk4MjFjZCwgKEZYX0xQQ1dTVFIpTCJyYW5nZSIsIFhGQV9FTEVNRU5UX1JhbmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhlMzhkODNjNywgKEZYX0xQQ1dTVFIpTCJsaW5lYXJpemVkIiwgWEZBX0VMRU1FTlRfTGluZWFyaXplZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZTNhYTI1NzgsIChGWF9MUENXU1RSKUwicGFja2V0IiwgWEZBX0VMRU1FTlRfUGFja2V0LCBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHhlM2FhODYwZSwgKEZYX0xQQ1dTVFIpTCJyb290RWxlbWVudCIsIFhGQV9FTEVNRU5UX1Jvb3RFbGVtZW50LCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4ZTNlNTUzZmEsIChGWF9MUENXU1RSKUwicGxhaW50ZXh0TWV0YWRhdGEiLCBYRkFfRUxFTUVOVF9QbGFpbnRleHRNZXRhZGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZTNlNmU0ZjIsIChGWF9MUENXU1RSKUwibnVtYmVyU3ltYm9scyIsIFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZTNmMDY3ZjYsIChGWF9MUENXU1RSKUwicHJpbnRIaWdoUXVhbGl0eSIsIFhGQV9FTEVNRU5UX1ByaW50SGlnaFF1YWxpdHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGUzZmQwNzhjLCAoRlhfTFBDV1NUUilMImRyaXZlciIsIFhGQV9FTEVNRU5UX0RyaXZlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlNDhiMzRmMiwgKEZYX0xQQ1dTVFIpTCJpbmNyZW1lbnRhbExvYWQiLCBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbExvYWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGU1NTBlN2MyLCAoRlhfTFBDV1NUUilMInN1YmplY3RETiIsIFhGQV9FTEVNRU5UX1N1YmplY3RETiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHhlNjY2OWE3OCwgKEZYX0xQQ1dTVFIpTCJjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUiLCBYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGU3YTdlYTAyLCAoRlhfTFBDV1NUUilMImluY3JlbWVudGFsTWVyZ2UiLCBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbE1lcmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhlOTQ4NTMwZCwgKEZYX0xQQ1dTVFIpTCJyYWRpYWwiLCBYRkFfRUxFTUVOVF9SYWRpYWwsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlYThkNjk5OSwgKEZYX0xQQ1dTVFIpTCJ2YXJpYWJsZXMiLCBYRkFfRUxFTUVOVF9WYXJpYWJsZXMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHhlYWExNDJjMCwgKEZYX0xQQ1dTVFIpTCJ0aW1lUGF0dGVybnMiLCBYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZWI5NDNhNzEsIChGWF9MUENXU1RSKUwiZWZmZWN0aXZlSW5wdXRQb2xpY3kiLCBYRkFfRUxFTUVOVF9FZmZlY3RpdmVJbnB1dFBvbGljeSwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZWYwNGEyYmMsIChGWF9MUENXU1RSKUwibmFtZUF0dHIiLCBYRkFfRUxFTUVOVF9OYW1lQXR0ciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ZjA3MjIyYWIsIChGWF9MUENXU1RSKUwiY29uZm9ybWFuY2UiLCBYRkFfRUxFTUVOVF9Db25mb3JtYW5jZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZjBhYWFhZGMsIChGWF9MUENXU1RSKUwidHJhbnNmb3JtIiwgWEZBX0VMRU1FTlRfVHJhbnNmb3JtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGYxNDMzZTg4LCAoRlhfTFBDV1NUUilMImxvY2tEb2N1bWVudCIsIFhGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmNTRlYjk5NywgKEZYX0xQQ1dTVFIpTCJicmVha0FmdGVyIiwgWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY2MTZkYTI4LCAoRlhfTFBDV1NUUilMImxpbmUiLCBYRkFfRUxFTUVOVF9MaW5lLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZjYxNmYzZGMsIChGWF9MUENXU1RSKUwibGlzdCIsIFhGQV9FTEVNRU5UX0xpc3QsIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeUxpc3R9LA0KKyAgICB7MHhmNzA1NWZiMSwgKEZYX0xQQ1dTVFIpTCJzb3VyY2UiLCBYRkFfRUxFTUVOVF9Tb3VyY2UsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZjdlZWJlMWMsIChGWF9MUENXU1RSKUwib2NjdXIiLCBYRkFfRUxFTUVOVF9PY2N1ciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY4ZDEwZDk3LCAoRlhfTFBDV1NUUilMInBpY2tUcmF5QnlQREZTaXplIiwgWEZBX0VMRU1FTlRfUGlja1RyYXlCeVBERlNpemUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGY4ZjE5ZTNhLCAoRlhfTFBDV1NUUilMIm1vbnRoTmFtZXMiLCBYRkFfRUxFTUVOVF9Nb250aE5hbWVzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY5ODQxNDliLCAoRlhfTFBDV1NUUilMInNldmVyaXR5IiwgWEZBX0VMRU1FTlRfU2V2ZXJpdHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGY5YmNiMDM3LCAoRlhfTFBDV1NUUilMImdyb3VwUGFyZW50IiwgWEZBX0VMRU1FTlRfR3JvdXBQYXJlbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGZiYzQyZmZmLCAoRlhfTFBDV1NUUilMImRvY3VtZW50QXNzZW1ibHkiLCBYRkFfRUxFTUVOVF9Eb2N1bWVudEFzc2VtYmx5LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmYzc4MTU5ZiwgKEZYX0xQQ1dTVFIpTCJudW1iZXJTeW1ib2wiLCBYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2wsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGZjYmQ2MDZjLCAoRlhfTFBDV1NUUilMInRhZ2dlZCIsIFhGQV9FTEVNRU5UX1RhZ2dlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZmYwNjM4MDIsIChGWF9MUENXU1RSKUwiaXRlbXMiLCBYRkFfRUxFTUVOVF9JdGVtcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorfTsNCitleHRlcm4gY29uc3QgRlhfSU5UMzIgZ19pWEZBRWxlbWVudENvdW50ID0gc2l6ZW9mKGdfWEZBRWxlbWVudERhdGEpIC8gc2l6ZW9mKFhGQV9FTEVNRU5USU5GTyk7DQorZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USElFUkFSQ0hZIGdfWEZBRWxlbWVudFByb3BlcnR5SW5kZXhbXSA9IHsNCisgICAgezAsIDh9LAl7OCwgMH0sCXs4LCAxNH0sCXsyMiwgMH0sCXsyMiwgMH0sCXsyMiwgNn0sCXsyOCwgMH0sCXsyOCwgMH0sCXsyOCwgMX0sCXsyOSwgM30sCXszMiwgMH0sCXszMiwgMH0sCXszMiwgMH0sCXszMiwgM30sCXszNSwgMX0sCXszNiwgMH0sCXszNiwgMH0sCXszNiwgMn0sCXszOCwgMH0sCXszOCwgMH0sDQorICAgIHszOCwgMH0sCXszOCwgNH0sCXs0MiwgMH0sCXs0MiwgMH0sCXs0MiwgMX0sCXs0MywgMH0sCXs0MywgOH0sCXs1MSwgMTl9LAl7NzAsIDB9LAl7NzAsIDB9LAl7NzAsIDJ9LAl7NzIsIDF9LAl7NzMsIDB9LAl7NzMsIDJ9LAl7NzUsIDR9LAl7NzksIDF9LAl7ODAsIDF9LAl7ODEsIDB9LAl7ODEsIDB9LAl7ODEsIDN9LA0KKyAgICB7ODQsIDB9LAl7ODQsIDR9LAl7ODgsIDR9LAl7OTIsIDF9LAl7OTMsIDB9LAl7OTMsIDR9LAl7OTcsIDl9LAl7MTA2LCAxNH0sCXsxMjAsIDB9LAl7MTIwLCAwfSwJezEyMCwgNX0sCXsxMjUsIDB9LAl7MTI1LCAxfSwJezEyNiwgMH0sCXsxMjYsIDB9LAl7MTI2LCAwfSwJezEyNiwgMH0sCXsxMjYsIDB9LAl7MTI2LCAxfSwJezEyNywgMH0sDQorICAgIHsxMjcsIDB9LAl7MTI3LCAwfSwJezEyNywgMH0sCXsxMjcsIDB9LAl7MTI3LCAwfSwJezEyNywgMH0sCXsxMjcsIDZ9LAl7MTMzLCAxfSwJezEzNCwgMH0sCXsxMzQsIDF9LAl7MTM1LCAwfSwJezEzNSwgMH0sCXsxMzUsIDF9LAl7MTM2LCAyfSwJezEzOCwgNX0sCXsxNDMsIDJ9LAl7MTQ1LCAwfSwJezE0NSwgMH0sCXsxNDUsIDB9LAl7MTQ1LCAwfSwNCisgICAgezE0NSwgMH0sCXsxNDUsIDV9LAl7MTUwLCAwfSwJezE1MCwgMH0sCXsxNTAsIDB9LAl7MTUwLCAwfSwJezE1MCwgMH0sCXsxNTAsIDB9LAl7MTUwLCAwfSwJezE1MCwgMn0sCXsxNTIsIDB9LAl7MTUyLCAwfSwJezE1MiwgMH0sCXsxNTIsIDE3fSwJezE2OSwgMH0sCXsxNjksIDF9LAl7MTcwLCAwfSwJezE3MCwgMH0sCXsxNzAsIDJ9LAl7MTcyLCAwfSwNCisgICAgezE3MiwgMH0sCXsxNzIsIDF9LAl7MTczLCAwfSwJezE3MywgMH0sCXsxNzMsIDJ9LAl7MTc1LCAyfSwJezE3NywgMH0sCXsxNzcsIDB9LAl7MTc3LCAwfSwJezE3NywgMTF9LAl7MTg4LCAwfSwJezE4OCwgMH0sCXsxODgsIDB9LAl7MTg4LCAwfSwJezE4OCwgMH0sCXsxODgsIDR9LAl7MTkyLCAzfSwJezE5NSwgMH0sCXsxOTUsIDB9LAl7MTk1LCAwfSwNCisgICAgezE5NSwgMH0sCXsxOTUsIDB9LAl7MTk1LCAwfSwJezE5NSwgOX0sCXsyMDQsIDB9LAl7MjA0LCAwfSwJezIwNCwgMTd9LAl7MjIxLCAwfSwJezIyMSwgMH0sCXsyMjEsIDB9LAl7MjIxLCAwfSwJezIyMSwgMH0sCXsyMjEsIDB9LAl7MjIxLCAwfSwJezIyMSwgMH0sCXsyMjEsIDB9LAl7MjIxLCA0fSwJezIyNSwgMH0sCXsyMjUsIDB9LAl7MjI1LCAwfSwNCisgICAgezIyNSwgMH0sCXsyMjUsIDJ9LAl7MjI3LCAzfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAyfSwJezIzMiwgMH0sCXsyMzIsIDF9LAl7MjMzLCAyfSwJezIzNSwgMn0sCXsyMzcsIDB9LAl7MjM3LCAwfSwJezIzNywgMn0sCXsyMzksIDB9LAl7MjM5LCAxfSwJezI0MCwgMX0sCXsyNDEsIDJ9LAl7MjQzLCAwfSwJezI0MywgM30sCXsyNDYsIDR9LA0KKyAgICB7MjUwLCAwfSwJezI1MCwgMX0sCXsyNTEsIDJ9LAl7MjUzLCAwfSwJezI1MywgMH0sCXsyNTMsIDB9LAl7MjUzLCAwfSwJezI1MywgMH0sCXsyNTMsIDB9LAl7MjUzLCAwfSwJezI1MywgMH0sCXsyNTMsIDB9LAl7MjUzLCAwfSwJezI1MywgMn0sCXsyNTUsIDJ9LAl7MjU3LCAwfSwJezI1NywgNn0sCXsyNjMsIDV9LAl7MjY4LCAwfSwJezI2OCwgMH0sDQorICAgIHsyNjgsIDB9LAl7MjY4LCAzfSwJezI3MSwgMH0sCXsyNzEsIDB9LAl7MjcxLCAzfSwJezI3NCwgNH0sCXsyNzgsIDB9LAl7Mjc4LCAwfSwJezI3OCwgNH0sCXsyODIsIDB9LAl7MjgyLCAwfSwJezI4MiwgNX0sCXsyODcsIDB9LAl7Mjg3LCA1fSwJezI5MiwgMH0sCXsyOTIsIDB9LAl7MjkyLCAwfSwJezI5MiwgMX0sCXsyOTMsIDB9LAl7MjkzLCAwfSwNCisgICAgezI5MywgMX0sCXsyOTQsIDB9LAl7Mjk0LCAyfSwJezI5NiwgMH0sCXsyOTYsIDB9LAl7Mjk2LCAwfSwJezI5NiwgMH0sCXsyOTYsIDF9LAl7Mjk3LCAwfSwJezI5NywgMH0sCXsyOTcsIDR9LAl7MzAxLCAwfSwJezMwMSwgMH0sCXszMDEsIDB9LAl7MzAxLCAwfSwJezMwMSwgMH0sCXszMDEsIDB9LAl7MzAxLCAxfSwJezMwMiwgMH0sCXszMDIsIDJ9LA0KKyAgICB7MzA0LCAwfSwJezMwNCwgMH0sCXszMDQsIDB9LAl7MzA0LCAwfSwJezMwNCwgMX0sCXszMDUsIDR9LAl7MzA5LCAwfSwJezMwOSwgM30sCXszMTIsIDB9LAl7MzEyLCAwfSwJezMxMiwgMX0sCXszMTMsIDB9LAl7MzEzLCA4fSwJezMyMSwgMH0sCXszMjEsIDEwfSwJezMzMSwgMH0sCXszMzEsIDEwfSwJezM0MSwgMX0sCXszNDIsIDEyfSwJezM1NCwgM30sDQorICAgIHszNTcsIDF9LAl7MzU4LCAwfSwJezM1OCwgMH0sCXszNTgsIDB9LAl7MzU4LCA4fSwJezM2NiwgMH0sCXszNjYsIDB9LAl7MzY2LCAwfSwJezM2NiwgMH0sCXszNjYsIDB9LAl7MzY2LCAwfSwJezM2NiwgN30sCXszNzMsIDJ9LAl7Mzc1LCAwfSwJezM3NSwgMX0sCXszNzYsIDB9LAl7Mzc2LCAwfSwJezM3NiwgMH0sCXszNzYsIDB9LAl7Mzc2LCAwfSwNCisgICAgezM3NiwgMH0sCXszNzYsIDB9LAl7Mzc2LCAwfSwJezM3NiwgMTN9LAl7Mzg5LCAwfSwJezM4OSwgMX0sCXszOTAsIDF9LAl7MzkxLCAwfSwJezM5MSwgMH0sCXszOTEsIDN9LAl7Mzk0LCAwfSwJezM5NCwgMH0sCXszOTQsIDB9LAl7Mzk0LCAwfSwJezM5NCwgMH0sCXszOTQsIDR9LAl7Mzk4LCA5fSwJezQwNywgMH0sCXs0MDcsIDF9LAl7NDA4LCAwfSwNCisgICAgezQwOCwgMH0sCXs0MDgsIDB9LAl7NDA4LCAwfSwJezQwOCwgMH0sCXs0MDgsIDF9LAl7NDA5LCAwfSwJezQwOSwgMn0sCXs0MTEsIDB9LAl7NDExLCAwfSwJezQxMSwgMH0sCXs0MTEsIDB9LAl7NDExLCAyfSwJezQxMywgMH0sCXs0MTMsIDF9LAl7NDE0LCAwfSwJezQxNCwgMH0sCXs0MTQsIDB9LAl7NDE0LCA3fSwJezQyMSwgMH0sCXs0MjEsIDF9LA0KKyAgICB7NDIyLCAxfSwJezQyMywgMH0sCXs0MjMsIDF9LAl7NDI0LCAxfSwJezQyNSwgMH0sCXs0MjUsIDF9LAl7NDI2LCAwfSwJezQyNiwgMH0sCXs0MjYsIDB9LAl7NDI2LCAwfSwJezQyNiwgMH0sCXs0MjYsIDB9LA0KK307DQorZXh0ZXJuIGNvbnN0IFhGQV9QUk9QRVJUWSBnX1hGQUVsZW1lbnRQcm9wZXJ0eURhdGFbXSA9IHsNCisgICAge1hGQV9FTEVNRU5UX0ZvbnRJbmZvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0pvZywgMSwgMH0sCXtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT3V0cHV0QmluLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbXByZXNzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1N0YXBsZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NZWRpdW1JbmZvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVmYXVsdFVpLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0JhcmNvZGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfQnV0dG9uLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9QaWN0dXJlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ltYWdlRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfU2lnbmF0dXJlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX1RleHRFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0V4T2JqZWN0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9CcmVhaywgMSwgMH0sCXtYRkFfRUxFTUVOVF9PdmVyZmxvdywgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Jvb2tlbmQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX09jY3VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9TdWJzZXRCZWxvdywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXAsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRW1iZWQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm4sIDQsIDB9LAl7WEZBX0VMRU1FTlRfRWRnZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9GaWxsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Nb2RlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RocmVzaG9sZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfSm9nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9CYXRjaE91dHB1dCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYWdlT2Zmc2V0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX091dHB1dEJpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TdGFwbGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVkaXVtSW5mbywgMSwgMH0sCXtYRkFfRUxFTUVOVF9BZG9iZUV4dGVuc2lvbkxldmVsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZvbnRJbmZvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9QZGZhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZpZXdlclByZWZlcmVuY2VzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NjcmlwdE1vZGVsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZlcnNpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfU3VibWl0Rm9ybWF0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NpbGVudFByaW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1Byb2R1Y2VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbXByZXNzaW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ludGVyYWN0aXZlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VuY3J5cHRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfUmVuZGVyUG9saWN5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX09wZW5BY3Rpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ3JlYXRvciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9MaW5lYXJpemVkLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RhZ2dlZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LAl7WEZBX0VMRU1FTlRfWHNsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhY2tldHMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RlYnVnLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZvbnRJbmZvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9CYXRjaE91dHB1dCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9GbGlwTGFiZWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVGVtcGxhdGVDYWNoZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZsaXBMYWJlbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FcmFOYW1lcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9EYXlOYW1lcywgMiwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZXJpZGllbU5hbWVzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01vbnRoTmFtZXMsIDIsIDB9LAl7WEZBX0VMRU1FTlRfSHlwaGVuYXRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQW1kLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhcnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfSW5jbHVkZVhEUENvbnRlbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29uZm9ybWFuY2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWRwLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9UaW1lU3RhbXAsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSGFuZGxlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2RzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VuY29kaW5ncywgMSwgMH0sCXtYRkFfRUxFTUVOVF9SZWFzb25zLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hkcCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9DYWNoZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYWdpbmF0aW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX092ZXJwcmludCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CZWhhdmlvck92ZXJyaWRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvcGllcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9PdXRwdXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTGF5b3V0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db21tb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFnaW5hdGlvbk92ZXJyaWRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Rlc3RpbmF0aW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0luY3JlbWVudGFsTWVyZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXhlY3V0ZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfU2lnbkRhdGEsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1N1Ym1pdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2wsIDMsIDB9LAl7WEZBX0VMRU1FTlRfT3BlcmF0aW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1dzZGxBZGRyZXNzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NvYXBBZGRyZXNzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NvYXBBY3Rpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfRWZmZWN0aXZlT3V0cHV0UG9saWN5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VmZmVjdGl2ZUlucHV0UG9saWN5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FcmEsIDIsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FZGdlLCA0LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Nvcm5lciwgNCwgMH0sCXtYRkFfRUxFTUVOVF9GaWxsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9LZXlVc2FnZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TdWJqZWN0RE5zLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0lzc3VlcnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU2lnbmluZywgMSwgMH0sCXtYRkFfRUxFTUVOVF9PaWRzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9VaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFyYSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Gb3JtYXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Fzc2lzdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfS2VlcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9DYXB0aW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JpbmQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Gb250LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZhbHVlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NhbGN1bGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfSXRlbXMsIDIsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYXJhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Bc3Npc3QsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVHJhdmVyc2FsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NhcHRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmluZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NhbGN1bGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21iLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9QcmVzZW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Fjcm9iYXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVHJhY2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUHJpbnRTY2FsaW5nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VuZm9yY2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTnVtYmVyT2ZDb3BpZXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFnZVJhbmdlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0FkZFZpZXdlclByZWZlcmVuY2VzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0FEQkVfSlNDb25zb2xlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0R1cGxleE9wdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9BREJFX0pTRGVidWdnZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGlja1RyYXlCeVBERlNpemUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQnJlYWssIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Fzc2lzdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfS2VlcCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYWdlU2V0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX092ZXJmbG93LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JpbmQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb29rZW5kLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NhbGN1bGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFyaWFibGVzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX09jY3VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1F1ZXJ5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0luc2VydCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9VcGRhdGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVsZXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01zZ0lkLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NldmVyaXR5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UeXBlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1Rvb2xUaXAsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU3BlYWssIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0FkZFNpbGVudFByaW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ByaW50ZXJOYW1lLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZvbnRJbmZvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9SZWNvcmRTZXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU2VsZWN0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01lc3NhZ2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX051bWJlclBhdHRlcm4sIDQsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX09jY3VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Sb290RWxlbWVudCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Yc2wsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU3RhcnRQYWdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JlbGV2YW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Jhc2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0F1dG9TYXZlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Fjcm9iYXQ3LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbW1vbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeGNsdWRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0N1cnJlbnRQYWdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1J1blNjcmlwdHMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db21iLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NZWRpdW0sIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZpbHRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFuaWZlc3QsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYXJhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZvbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsdWUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RheSwgNywgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX09jY3VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29tYiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZpbHRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYW5pZmVzdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QaWN0dXJlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0xldmVsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1R5cGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29tcHJlc3NPYmplY3RTdHJlYW0sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VkZ2UsIDQsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29ybmVyLCA0LCAwfSwJe1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRHluYW1pY1JlbmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywgMSwgMH0sCXtYRkFfRUxFTUVOVF9UeXBlZmFjZXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGF0ZVRpbWVTeW1ib2xzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX051bWJlclBhdHRlcm5zLCAxLCAwfSwJe1hGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Yc2wsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU3RhcnROb2RlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX091dHB1dFhTTCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9BZGp1c3REYXRhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0F0dHJpYnV0ZXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfV2luZG93LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1JlY29yZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9SYW5nZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbExvYWQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVGV4dCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UaW1lLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RhdGVUaW1lLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ltYWdlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RlY2ltYWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9vbGVhbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9JbnRlZ2VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4RGF0YSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Zsb2F0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NlcnRpZmljYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYXJhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Bc3Npc3QsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVHJhdmVyc2FsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0tlZXAsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2FwdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZvbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFsdWUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VuY3J5cHRpb25MZXZlbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FbmNyeXB0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1Blcm1pc3Npb25zLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01lcmlkaWVtLCAyLCAwfSwJe1hGQV9FTEVNRU5UX1N1cHByZXNzQmFubmVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZlcnNpb25Db250cm9sLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0xvY2FsZVNldCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UZW1wbGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9WYWxpZGF0aW9uTWVzc2FnaW5nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0xvY2FsZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EYXRhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01lc3NhZ2luZywgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYXR0ZXJuLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX1NvbGlkLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mIHwgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2Z9LAl7WEZBX0VMRU1FTlRfU3RpcHBsZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9MaW5lYXIsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1JhZGlhbCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9GaWxsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXAsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQXJjLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX1RleHQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfVGltZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9EYXRlVGltZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9JbWFnZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9EZWNpbWFsLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0Jvb2xlYW4sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfSW50ZWdlciwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9FeERhdGEsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfUmVjdGFuZ2xlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0RhdGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfRmxvYXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfTGluZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzdGluYXRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWVzc2FnZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Vc2VyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1Bhc3N3b3JkLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01vZGlmeUFubm90cywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db250ZW50Q29weSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb3JtRmllbGRGaWxsaW5nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NoYW5nZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QcmludCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QbGFpbnRleHRNZXRhZGF0YSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QcmludEhpZ2hRdWFsaXR5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RvY3VtZW50QXNzZW1ibHksIDEsIDB9LAl7WEZBX0VMRU1FTlRfRW5jcnlwdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2wsIDUsIDB9LAl7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwgNCwgMH0sCXtYRkFfRUxFTUVOVF9XaGl0ZXNwYWNlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1JlbmFtZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9JZkVtcHR5LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ByZXNlbmNlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTmFtZUF0dHIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfR3JvdXBQYXJlbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VkZ2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29ubmVjdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTW9udGgsIDEyLCAwfSwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRDaGlsZHJlbkluZGV4W10gPSB7DQorICAgIHswLCAwfSwJezAsIDB9LAl7MCwgMH0sCXswLCAxfSwJezEsIDB9LAl7MSwgNH0sCXs1LCAwfSwJezUsIDB9LAl7NSwgMH0sCXs1LCAzfSwJezgsIDB9LAl7OCwgMH0sCXs4LCAwfSwJezgsIDB9LAl7OCwgMH0sCXs4LCAxfSwJezksIDB9LAl7OSwgMH0sCXs5LCAwfSwJezksIDB9LA0KKyAgICB7OSwgMH0sCXs5LCAwfSwJezksIDJ9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LA0KKyAgICB7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDh9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LA0KKyAgICB7MTksIDB9LAl7MTksIDB9LAl7MTksIDF9LAl7MjAsIDF9LAl7MjEsIDF9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDd9LAl7MjksIDB9LAl7MjksIDB9LAl7MjksIDB9LAl7MjksIDB9LA0KKyAgICB7MjksIDB9LAl7MjksIDB9LAl7MjksIDF9LAl7MzAsIDF9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDR9LAl7MzUsIDJ9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LA0KKyAgICB7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDR9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDJ9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LA0KKyAgICB7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDEzfSwJezU2LCAwfSwJezU2LCAwfSwJezU2LCAxfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwNCisgICAgezU3LCAwfSwJezU3LCAxfSwJezU4LCAwfSwJezU4LCAxfSwJezU5LCAwfSwJezU5LCAwfSwJezU5LCAwfSwJezU5LCAxfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAxfSwJezYxLCAwfSwJezYxLCAwfSwJezYxLCAwfSwNCisgICAgezYxLCAxfSwJezYyLCAwfSwJezYyLCAyfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAxfSwJezY1LCAxfSwJezY2LCAxfSwJezY3LCAwfSwJezY3LCAxfSwNCisgICAgezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCA2fSwJezc0LCAwfSwJezc0LCAxfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwNCisgICAgezc1LCAxfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwNCisgICAgezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAyfSwJezc4LCAwfSwJezc4LCAwfSwJezc4LCAwfSwJezc4LCAxfSwJezc5LCAwfSwNCisgICAgezc5LCAwfSwJezc5LCAxfSwJezgwLCAwfSwJezgwLCAwfSwJezgwLCAxfSwJezgxLCAwfSwJezgxLCAwfSwJezgxLCAxfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAxfSwJezgzLCAwfSwNCisgICAgezgzLCAwfSwJezgzLCAwfSwJezgzLCAwfSwJezgzLCAwfSwJezgzLCAwfSwJezgzLCAxMX0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMTF9LAl7MTA1LCAxMDZ9LAl7MjExLCAwfSwJezIxMSwgMH0sCXsyMTEsIDF9LAl7MjEyLCAwfSwJezIxMiwgM30sCXsyMTUsIDF9LAl7MjE2LCAwfSwNCisgICAgezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMTJ9LAl7MjI4LCAwfSwJezIyOCwgMH0sCXsyMjgsIDB9LAl7MjI4LCAwfSwJezIyOCwgMH0sCXsyMjgsIDB9LAl7MjI4LCAwfSwNCisgICAgezIyOCwgMH0sCXsyMjgsIDB9LAl7MjI4LCAyfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAwfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAwfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAxMH0sDQorfTsNCitleHRlcm4gY29uc3QgRlhfV09SRCBnX1hGQUVsZW1lbnRDaGlsZHJlbkRhdGFbXSA9IHsNCisgICAgWEZBX0VMRU1FTlRfRXh0cmFzLAlYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LAlYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSwJWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwJWEZBX0VMRU1FTlRfQWx3YXlzRW1iZWQsCVhGQV9FTEVNRU5UX0RlZmF1bHRUeXBlZmFjZSwJWEZBX0VMRU1FTlRfTmV2ZXJFbWJlZCwJWEZBX0VMRU1FTlRfU291cmNlLAlYRkFfRUxFTUVOVF9FcXVhdGUsDQorICAgIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLAlYRkFfRUxFTUVOVF9QcywJWEZBX0VMRU1FTlRfUGNsLAlYRkFfRUxFTUVOVF9QZGYsCVhGQV9FTEVNRU5UX1pwbCwJWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLAlYRkFfRUxFTUVOVF9XZWJDbGllbnQsCVhGQV9FTEVNRU5UX1N1Ym1pdFVybCwJWEZBX0VMRU1FTlRfRHJpdmVyLAlYRkFfRUxFTUVOVF9UeXBlZmFjZSwNCisgICAgWEZBX0VMRU1FTlRfU3ViamVjdEROLAlYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwJWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwJWEZBX0VMRU1FTlRfQXJlYSwJWEZBX0VMRU1FTlRfRmllbGQsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwJWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfRXhPYmplY3QsCVhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QsDQorICAgIFhGQV9FTEVNRU5UX1JlZiwJWEZBX0VMRU1FTlRfRXZlbnQsCVhGQV9FTEVNRU5UX1NldFByb3BlcnR5LAlYRkFfRUxFTUVOVF9CaW5kSXRlbXMsCVhGQV9FTEVNRU5UX0Nvbm5lY3QsCVhGQV9FTEVNRU5UX1BkZiwJWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sCVhGQV9FTEVNRU5UX0V2ZW50LAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfRmllbGQsDQorICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsCVhGQV9FTEVNRU5UX0FnZW50LAlYRkFfRUxFTUVOVF9Qc01hcCwJWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwJWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsCVhGQV9FTEVNRU5UX0V2ZW50LAlYRkFfRUxFTUVOVF9BcmVhLAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfRmllbGQsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwNCisgICAgWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfRXhPYmplY3QsCVhGQV9FTEVNRU5UX1Byb3RvLAlYRkFfRUxFTUVOVF9Db25uZWN0LAlYRkFfRUxFTUVOVF9CcmVha0FmdGVyLAlYRkFfRUxFTUVOVF9Mb2NhbGUsCVhGQV9FTEVNRU5UX1RleHQsCVhGQV9FTEVNRU5UX0ZvbnQsCVhGQV9FTEVNRU5UX1RyYXZlcnNlLA0KKyAgICBYRkFfRUxFTUVOVF9NYXAsCVhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwJWEZBX0VMRU1FTlRfUGFnZVNldCwJWEZBX0VMRU1FTlRfUGFnZUFyZWEsCVhGQV9FTEVNRU5UX0VuY29kaW5nLAlYRkFfRUxFTUVOVF9TdWJmb3JtLAlYRkFfRUxFTUVOVF9TdWJtaXRVcmwsCVhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLAlYRkFfRUxFTUVOVF9BcmVhLAlYRkFfRUxFTUVOVF9GaWVsZCwNCisgICAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwJWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfT2lkLAlYRkFfRUxFTUVOVF9SZWYsCVhGQV9FTEVNRU5UX0V4Y2x1ZGVOUywJWEZBX0VMRU1FTlRfVHJhbnNmb3JtLAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfTWVzc2FnZSwNCisgICAgWEZBX0VMRU1FTlRfTG9nLAlYRkFfRUxFTUVOVF9SZWFzb24sCVhGQV9FTEVNRU5UX0FyZWEsCVhGQV9FTEVNRU5UX1RleHQsCVhGQV9FTEVNRU5UX1RpbWUsCVhGQV9FTEVNRU5UX0RhdGVUaW1lLAlYRkFfRUxFTUVOVF9JbWFnZSwJWEZBX0VMRU1FTlRfRGVjaW1hbCwJWEZBX0VMRU1FTlRfQm9vbGVhbiwJWEZBX0VMRU1FTlRfSW50ZWdlciwNCisgICAgWEZBX0VMRU1FTlRfRXhEYXRhLAlYRkFfRUxFTUVOVF9EYXRlLAlYRkFfRUxFTUVOVF9GbG9hdCwJWEZBX0VMRU1FTlRfRXhPYmplY3QsCVhGQV9FTEVNRU5UX1RleHQsCVhGQV9FTEVNRU5UX1RpbWUsCVhGQV9FTEVNRU5UX0RhdGVUaW1lLAlYRkFfRUxFTUVOVF9JbWFnZSwJWEZBX0VMRU1FTlRfRGVjaW1hbCwJWEZBX0VMRU1FTlRfQm9vbGVhbiwNCisgICAgWEZBX0VMRU1FTlRfSW50ZWdlciwJWEZBX0VMRU1FTlRfRXhEYXRhLAlYRkFfRUxFTUVOVF9EYXRlLAlYRkFfRUxFTUVOVF9GbG9hdCwJWEZBX0VMRU1FTlRfRXh0cmFzLAlYRkFfRUxFTUVOVF9VaSwJWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwJWEZBX0VMRU1FTlRfQnJlYWssCVhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLAlYRkFfRUxFTUVOVF9BcmMsDQorICAgIFhGQV9FTEVNRU5UX01kcCwJWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsCVhGQV9FTEVNRU5UX09pZCwJWEZBX0VMRU1FTlRfUmVmLAlYRkFfRUxFTUVOVF9NYXJnaW4sCVhGQV9FTEVNRU5UX0tleVVzYWdlLAlYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LAlYRkFfRUxFTUVOVF9QYXJhLAlYRkFfRUxFTUVOVF9GaWx0ZXIsCVhGQV9FTEVNRU5UX0VuY29kaW5nLA0KKyAgICBYRkFfRUxFTUVOVF9FdmVudCwJWEZBX0VMRU1FTlRfRGVmYXVsdFVpLAlYRkFfRUxFTUVOVF9CYXJjb2RlLAlYRkFfRUxFTUVOVF9TdWJqZWN0RE5zLAlYRkFfRUxFTUVOVF9Jc3N1ZXJzLAlYRkFfRUxFTUVOVF9CdXR0b24sCVhGQV9FTEVNRU5UX0Zvcm1hdCwJWEZBX0VMRU1FTlRfQm9yZGVyLAlYRkFfRUxFTUVOVF9BcmVhLAlYRkFfRUxFTUVOVF9IeXBoZW5hdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfVGV4dCwJWEZBX0VMRU1FTlRfVGltZSwJWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfRGF0ZVRpbWUsCVhGQV9FTEVNRU5UX0NvbWIsCVhGQV9FTEVNRU5UX1BhdHRlcm4sCVhGQV9FTEVNRU5UX0ZpZWxkLAlYRkFfRUxFTUVOVF9Db250ZW50QXJlYSwJWEZBX0VMRU1FTlRfU29saWQsDQorICAgIFhGQV9FTEVNRU5UX0VkZ2UsCVhGQV9FTEVNRU5UX1N0aXBwbGUsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwJWEZBX0VMRU1FTlRfVG9vbFRpcCwJWEZBX0VMRU1FTlRfUmVhc29uLAlYRkFfRUxFTUVOVF9FeGVjdXRlLAlYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsCVhGQV9FTEVNRU5UX0ltYWdlLAlYRkFfRUxFTUVOVF9UaW1lU3RhbXAsCVhGQV9FTEVNRU5UX0RlY2ltYWwsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sCVhGQV9FTEVNRU5UX0hhbmRsZXIsCVhGQV9FTEVNRU5UX0Jvb2xlYW4sCVhGQV9FTEVNRU5UX01lc3NhZ2UsCVhGQV9FTEVNRU5UX0Fzc2lzdCwJWEZBX0VMRU1FTlRfUGljdHVyZSwJWEZBX0VMRU1FTlRfVHJhdmVyc2FsLAlYRkFfRUxFTUVOVF9Db3JuZXIsCVhGQV9FTEVNRU5UX0NvbG9yLAlYRkFfRUxFTUVOVF9LZWVwLA0KKyAgICBYRkFfRUxFTUVOVF9JbWFnZUVkaXQsCVhGQV9FTEVNRU5UX1ZhbGlkYXRlLAlYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2RzLAlYRkFfRUxFTUVOVF9QYWdlU2V0LAlYRkFfRUxFTUVOVF9JbnRlZ2VyLAlYRkFfRUxFTUVOVF9UcmF2ZXJzZSwJWEZBX0VMRU1FTlRfRW5jb2RpbmdzLAlYRkFfRUxFTUVOVF9TaWduaW5nLAlYRkFfRUxFTUVOVF9TY3JpcHQsCVhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwNCisgICAgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQsCVhGQV9FTEVNRU5UX1BhZ2VBcmVhLAlYRkFfRUxFTUVOVF9PaWRzLAlYRkFfRUxFTUVOVF9TaWduYXR1cmUsCVhGQV9FTEVNRU5UX0NhcHRpb24sCVhGQV9FTEVNRU5UX0V4RGF0YSwJWEZBX0VMRU1FTlRfTWFuaWZlc3QsCVhGQV9FTEVNRU5UX092ZXJmbG93LAlYRkFfRUxFTUVOVF9MaW5lYXIsCVhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwNCisgICAgWEZBX0VMRU1FTlRfTWVkaXVtLAlYRkFfRUxFTUVOVF9UZXh0RWRpdCwJWEZBX0VMRU1FTlRfU2lnbkRhdGEsCVhGQV9FTEVNRU5UX1JlY3RhbmdsZSwJWEZBX0VMRU1FTlRfRGF0ZSwJWEZBX0VMRU1FTlRfRGVzYywJWEZBX0VMRU1FTlRfRW5jcnlwdCwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfU3BlYWssCVhGQV9FTEVNRU5UX1JlYXNvbnMsDQorICAgIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIsCVhGQV9FTEVNRU5UX0ZpbGwsCVhGQV9FTEVNRU5UX0ZvbnQsCVhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLAlYRkFfRUxFTUVOVF9GbG9hdCwJWEZBX0VMRU1FTlRfVmFsdWUsCVhGQV9FTEVNRU5UX0Jvb2tlbmQsCVhGQV9FTEVNRU5UX0V4T2JqZWN0LAlYRkFfRUxFTUVOVF9CaW5kSXRlbXMsCVhGQV9FTEVNRU5UX0NhbGN1bGF0ZSwNCisgICAgWEZBX0VMRU1FTlRfRXh0cmFzLAlYRkFfRUxFTUVOVF9Db25uZWN0LAlYRkFfRUxFTUVOVF9TdWJtaXQsCVhGQV9FTEVNRU5UX1N1YmplY3RETiwJWEZBX0VMRU1FTlRfUmFkaWFsLAlYRkFfRUxFTUVOVF9WYXJpYWJsZXMsCVhGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwJWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwJWEZBX0VMRU1FTlRfTGluZSwJWEZBX0VMRU1FTlRfT2NjdXIsDQorICAgIFhGQV9FTEVNRU5UX0l0ZW1zLAlYRkFfRUxFTUVOVF9FeHRyYXMsCVhGQV9FTEVNRU5UX1dzZGxDb25uZWN0aW9uLAlYRkFfRUxFTUVOVF9Yc2RDb25uZWN0aW9uLAlYRkFfRUxFTUVOVF9YbWxDb25uZWN0aW9uLAlYRkFfRUxFTUVOVF9TaWduRGF0YSwJWEZBX0VMRU1FTlRfVGV4dCwJWEZBX0VMRU1FTlRfVGltZSwJWEZBX0VMRU1FTlRfRGF0ZVRpbWUsCVhGQV9FTEVNRU5UX0ltYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLAlYRkFfRUxFTUVOVF9Cb29sZWFuLAlYRkFfRUxFTUVOVF9JbnRlZ2VyLAlYRkFfRUxFTUVOVF9TY3JpcHQsCVhGQV9FTEVNRU5UX0V4RGF0YSwJWEZBX0VMRU1FTlRfTWFuaWZlc3QsCVhGQV9FTEVNRU5UX0RhdGUsCVhGQV9FTEVNRU5UX0Zsb2F0LAlYRkFfRUxFTUVOVF9Db21tYW5kLAlYRkFfRUxFTUVOVF9CaW5kLA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LAlYRkFfRUxFTUVOVF9UaW1lLAlYRkFfRUxFTUVOVF9EYXRlVGltZSwJWEZBX0VMRU1FTlRfSW1hZ2UsCVhGQV9FTEVNRU5UX0RlY2ltYWwsCVhGQV9FTEVNRU5UX0Jvb2xlYW4sCVhGQV9FTEVNRU5UX0ludGVnZXIsCVhGQV9FTEVNRU5UX0V4RGF0YSwJWEZBX0VMRU1FTlRfRGF0ZSwJWEZBX0VMRU1FTlRfRmxvYXQsDQorfTsNCitleHRlcm4gY29uc3QgWEZBX0VMRU1FTlRISUVSQVJDSFkgZ19YRkFFbGVtZW50QXR0cmlidXRlSW5kZXhbXSA9IHsNCisgICAgezAsIDN9LAl7MywgMn0sCXs1LCAzfSwJezgsIDEwfSwJezE4LCAyfSwJezIwLCA2fSwJezI2LCAyfSwJezI4LCAxfSwJezI5LCAxM30sCXs0MiwgMn0sCXs0NCwgMX0sCXs0NSwgMn0sCXs0NywgMn0sCXs0OSwgN30sCXs1NiwgMH0sCXs1NiwgNH0sCXs2MCwgMn0sCXs2MiwgN30sCXs2OSwgMH0sCXs2OSwgMH0sDQorICAgIHs2OSwgMn0sCXs3MSwgMn0sCXs3MywgOH0sCXs4MSwgNX0sCXs4NiwgOH0sCXs5NCwgNH0sCXs5OCwgM30sCXsxMDEsIDN9LAl7MTA0LCAzfSwJezEwNywgNn0sCXsxMTMsIDJ9LAl7MTE1LCAyfSwJezExNywgMn0sCXsxMTksIDJ9LAl7MTIxLCAzfSwJezEyNCwgMn0sCXsxMjYsIDd9LAl7MTMzLCAxM30sCXsxNDYsIDJ9LAl7MTQ4LCA2fSwNCisgICAgezE1NCwgMn0sCXsxNTYsIDN9LAl7MTU5LCAxfSwJezE2MCwgMTd9LAl7MTc3LCAyfSwJezE3OSwgMn0sCXsxODEsIDZ9LAl7MTg3LCAyfSwJezE4OSwgMn0sCXsxOTEsIDN9LAl7MTk0LCA3fSwJezIwMSwgMn0sCXsyMDMsIDN9LAl7MjA2LCAwfSwJezIwNiwgMjF9LAl7MjI3LCAxfSwJezIyOCwgM30sCXsyMzEsIDJ9LAl7MjMzLCAwfSwJezIzMywgMn0sDQorICAgIHsyMzUsIDJ9LAl7MjM3LCA2fSwJezI0MywgMH0sCXsyNDMsIDR9LAl7MjQ3LCA0fSwJezI1MSwgMH0sCXsyNTEsIDJ9LAl7MjUzLCAyfSwJezI1NSwgMH0sCXsyNTUsIDB9LAl7MjU1LCAyfSwJezI1NywgMn0sCXsyNTksIDR9LAl7MjYzLCAzfSwJezI2NiwgN30sCXsyNzMsIDEwfSwJezI4MywgOX0sCXsyOTIsIDZ9LAl7Mjk4LCA0fSwJezMwMiwgMn0sDQorICAgIHszMDQsIDJ9LAl7MzA2LCA2fSwJezMxMiwgNH0sCXszMTYsIDN9LAl7MzE5LCAyfSwJezMyMSwgMn0sCXszMjMsIDR9LAl7MzI3LCA0fSwJezMzMSwgNH0sCXszMzUsIDR9LAl7MzM5LCAyfSwJezM0MSwgMn0sCXszNDMsIDJ9LAl7MzQ1LCAyMn0sCXszNjcsIDN9LAl7MzcwLCAyfSwJezM3MiwgMn0sCXszNzQsIDJ9LAl7Mzc2LCA5fSwJezM4NSwgMH0sDQorICAgIHszODUsIDR9LAl7Mzg5LCAzfSwJezM5MiwgMH0sCXszOTIsIDJ9LAl7Mzk0LCA3fSwJezQwMSwgNH0sCXs0MDUsIDJ9LAl7NDA3LCA0fSwJezQxMSwgMH0sCXs0MTEsIDIxfSwJezQzMiwgNH0sCXs0MzYsIDN9LAl7NDM5LCA0fSwJezQ0MywgNn0sCXs0NDksIDJ9LAl7NDUxLCA1fSwJezQ1NiwgMn0sCXs0NTgsIDh9LAl7NDY2LCAxfSwJezQ2NywgMn0sDQorICAgIHs0NjksIDJ9LAl7NDcxLCA1fSwJezQ3NiwgMH0sCXs0NzYsIDJ9LAl7NDc4LCAyfSwJezQ4MCwgNn0sCXs0ODYsIDI2fSwJezUxMiwgNH0sCXs1MTYsIDJ9LAl7NTE4LCAyfSwJezUyMCwgNH0sCXs1MjQsIDB9LAl7NTI0LCAyfSwJezUyNiwgMn0sCXs1MjgsIDJ9LAl7NTMwLCAyfSwJezUzMiwgNX0sCXs1MzcsIDJ9LAl7NTM5LCAzfSwJezU0MiwgMn0sDQorICAgIHs1NDQsIDR9LAl7NTQ4LCA1fSwJezU1MywgMn0sCXs1NTUsIDB9LAl7NTU1LCAyfSwJezU1NywgNH0sCXs1NjEsIDV9LAl7NTY2LCAzfSwJezU2OSwgMn0sCXs1NzEsIDN9LAl7NTc0LCAwfSwJezU3NCwgMn0sCXs1NzYsIDl9LAl7NTg1LCAyfSwJezU4NywgNX0sCXs1OTIsIDZ9LAl7NTk4LCA1fSwJezYwMywgNH0sCXs2MDcsIDR9LAl7NjExLCA4fSwNCisgICAgezYxOSwgNH0sCXs2MjMsIDB9LAl7NjIzLCA3fSwJezYzMCwgNH0sCXs2MzQsIDR9LAl7NjM4LCA1fSwJezY0MywgMn0sCXs2NDUsIDJ9LAl7NjQ3LCA0fSwJezY1MSwgNH0sCXs2NTUsIDJ9LAl7NjU3LCAyfSwJezY1OSwgMX0sCXs2NjAsIDJ9LAl7NjYyLCA1fSwJezY2NywgNH0sCXs2NzEsIDN9LAl7Njc0LCAyfSwJezY3NiwgMn0sCXs2NzgsIDR9LA0KKyAgICB7NjgyLCAwfSwJezY4MiwgOX0sCXs2OTEsIDJ9LAl7NjkzLCAyfSwJezY5NSwgNX0sCXs3MDAsIDR9LAl7NzA0LCAzfSwJezcwNywgMn0sCXs3MDksIDEwfSwJezcxOSwgMn0sCXs3MjEsIDR9LAl7NzI1LCA0fSwJezcyOSwgMn0sCXs3MzEsIDZ9LAl7NzM3LCAyfSwJezczOSwgMn0sCXs3NDEsIDl9LAl7NzUwLCAxfSwJezc1MSwgNH0sCXs3NTUsIDN9LA0KKyAgICB7NzU4LCA1fSwJezc2MywgNn0sCXs3NjksIDR9LAl7NzczLCAxfSwJezc3NCwgNH0sCXs3NzgsIDB9LAl7Nzc4LCAzfSwJezc4MSwgMX0sCXs3ODIsIDV9LAl7Nzg3LCAxMH0sCXs3OTcsIDd9LAl7ODA0LCAzfSwJezgwNywgMn0sCXs4MDksIDV9LAl7ODE0LCAyfSwJezgxNiwgMH0sCXs4MTYsIDJ9LAl7ODE4LCAyfSwJezgyMCwgMn0sCXs4MjIsIDZ9LA0KKyAgICB7ODI4LCAyfSwJezgzMCwgMX0sCXs4MzEsIDJ9LAl7ODMzLCAyfSwJezgzNSwgOH0sCXs4NDMsIDJ9LAl7ODQ1LCA0fSwJezg0OSwgNH0sCXs4NTMsIDR9LAl7ODU3LCAyfSwJezg1OSwgMn0sCXs4NjEsIDJ9LAl7ODYzLCAzfSwJezg2NiwgMn0sCXs4NjgsIDJ9LAl7ODcwLCA0fSwJezg3NCwgM30sCXs4NzcsIDV9LAl7ODgyLCAyMH0sCXs5MDIsIDJ9LA0KKyAgICB7OTA0LCAwfSwJezkwNCwgMn0sCXs5MDYsIDZ9LAl7OTEyLCAxfSwJezkxMywgMn0sCXs5MTUsIDF9LAl7OTE2LCAyfSwJezkxOCwgNH0sCXs5MjIsIDJ9LAl7OTI0LCAyfSwJezkyNiwgNH0sCXs5MzAsIDR9LAl7OTM0LCAyMH0sCXs5NTQsIDF9LAl7OTU1LCAyfSwJezk1NywgNH0sCXs5NjEsIDR9LAl7OTY1LCAyfSwJezk2NywgMn0sCXs5NjksIDR9LA0KKyAgICB7OTczLCAyfSwJezk3NSwgMH0sCXs5NzUsIDJ9LAl7OTc3LCA1fSwJezk4MiwgNX0sCXs5ODcsIDh9LAl7OTk1LCAyfSwJezk5NywgMn0sCXs5OTksIDR9LAl7MTAwMywgNH0sCXsxMDA3LCAyfSwJezEwMDksIDR9LAl7MTAxMywgMH0sCXsxMDEzLCAxfSwJezEwMTQsIDJ9LAl7MTAxNiwgOX0sCXsxMDI1LCAyfSwJezEwMjcsIDB9LAl7MTAyNywgOH0sCXsxMDM1LCAyfSwNCisgICAgezEwMzcsIDJ9LAl7MTAzOSwgMH0sCXsxMDM5LCA0fSwJezEwNDMsIDJ9LAl7MTA0NSwgMH0sCXsxMDQ1LCAyfSwJezEwNDcsIDN9LAl7MTA1MCwgMn0sCXsxMDUyLCA1fSwJezEwNTcsIDJ9LAl7MTA1OSwgMn0sCXsxMDYxLCA0fSwJezEwNjUsIDN9LAl7MTA2OCwgMH0sCXsxMDY4LCA0fSwJezEwNzIsIDJ9LAl7MTA3NCwgMn0sCXsxMDc2LCAzfSwJezEwNzksIDR9LAl7MTA4MywgOH0sDQorICAgIHsxMDkxLCA1fSwJezEwOTYsIDB9LAl7MTA5NiwgNH0sCXsxMTAwLCA2fSwJezExMDYsIDJ9LAl7MTEwOCwgMX0sCXsxMTA5LCAyfSwJezExMTEsIDJ9LAl7MTExMywgMn0sCXsxMTE1LCAxfSwJezExMTYsIDJ9LAl7MTExOCwgN30sDQorfTsNCitleHRlcm4gY29uc3QgRlhfQllURSBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVEYXRhW10gPSB7DQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4LAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Fb2ZBY3Rpb24sCVhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwJWEZBX0FUVFJJQlVURV9Mb2NrVHlwZSwJWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUmVsYXRpb24sCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9CZWZvcmVUYXJnZXQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LAlYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLAlYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwJWEZBX0FUVFJJQlVURV9TdGFydE5ldywJWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwJWEZBX0FUVFJJQlVURV9BZnRlciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Jvb2tlbmRMZWFkZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQsCVhGQV9BVFRSSUJVVEVfQmVmb3JlLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwJWEZBX0FUVFJJQlVURV9NYXJrLAlYRkFfQVRUUklCVVRFX1NoYXBlLAlYRkFfQVRUUklCVVRFX1NpemUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwJWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLAlYRkFfQVRUUklCVVRFX0NpcmN1bGFyLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSGFuZCwJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0JpbmQsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0Zyb20sDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfU2lnbmF0dXJlVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9TdGFydE5ldywJWEZBX0FUVFJJQlVURV9UcmFpbGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9UYXJnZXQsCVhGQV9BVFRSSUJVVEVfTGVhZGVyLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsCVhGQV9BVFRSSUJVVEVfVXVpZCwJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsCVhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsCVhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Ob25SZXB1ZGlhdGlvbiwJWEZBX0FUVFJJQlVURV9FbmNpcGhlck9ubHksCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLAlYRkFfQVRUUklCVVRFX0NybFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfS2V5QWdyZWVtZW50LAlYRkFfQVRUUklCVVRFX0tleUVuY2lwaGVybWVudCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0RhdGFFbmNpcGhlcm1lbnQsCVhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sCVhGQV9BVFRSSUJVVEVfRGVjaXBoZXJPbmx5LAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfT3BlbiwJWEZBX0FUVFJJQlVURV9Db21taXRPbiwJWEZBX0FUVFJJQlVURV9UZXh0RW50cnksCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9IQWxpZ24sCVhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfV2lkb3dzLAlYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LAlYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsCVhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsCVhGQV9BVFRSSUJVVEVfUHJlc2VydmUsCVhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywNCisgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sCVhGQV9BVFRSSUJVVEVfVGFiRGVmYXVsdCwJWEZBX0FUVFJJQlVURV9UYWJTdG9wcywJWEZBX0FUVFJJQlVURV9PcnBoYW5zLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwJWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVmVyc2lvbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9SZWYsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0xpc3RlbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9EYXRhUm93Q291bnQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0RhdGFQcmVwLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVGV4dExvY2F0aW9uLAlYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLAlYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwJWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsCVhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLAlYRkFfQVRUUklCVVRFX1RydW5jYXRlLAlYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywJWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwJWEZBX0FUVFJJQlVURV9VcHNNb2RlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLAlYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwJWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywJWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLAlYRkFfQVRUUklCVVRFX0VuZENoYXIsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Gb3JtYXQsCVhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX091dHB1dCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lucHV0LAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfQnJlYWssCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSGFuZCwJWEZBX0FUVFJJQlVURV9YLAlYRkFfQVRUUklCVVRFX1ksCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfTGV2ZWwsCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwJWEZBX0FUVFJJQlVURV9IeXBoZW5hdGUsCVhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsCVhGQV9BVFRSSUJVVEVfUHVzaENoYXJhY3RlckNvdW50LAlYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRXhjbHVkZUFsbENhcHMsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9SaWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX01heENoYXJzLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VybCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1VybFBvbGljeSwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1JlZiwJWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLAlYRkFfQVRUUklCVVRFX1RhcmdldCwJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX1gsCVhGQV9BVFRSSUJVVEVfWSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSCwJWEZBX0FUVFJJQlVURV9XLAlYRkFfQVRUUklCVVRFX1gsCVhGQV9BVFRSSUJVVEVfWSwJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQWNjZXNzLAlYRkFfQVRUUklCVVRFX1JvdGF0ZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwJWEZBX0FUVFJJQlVURV9WQWxpZ24sCVhGQV9BVFRSSUJVVEVfTWF4SCwJWEZBX0FUVFJJQlVURV9NYXhXLAlYRkFfQVRUUklCVVRFX01pbkgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWluVywJWEZBX0FUVFJJQlVURV9SZWxldmFudCwJWEZBX0FUVFJJQlVURV9Db2xTcGFuLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTG9jYWxlLAlYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsCVhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0gsCVhGQV9BVFRSSUJVVEVfVywJWEZBX0FUVFJJQlVURV9YLAlYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9DYXAsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1N0cm9rZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwJWEZBX0FUVFJJQlVURV9UaGlja25lc3MsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUmF0ZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywJWEZBX0FUVFJJQlVURV9PdXRwdXRCZWxvdywJWEZBX0FUVFJJQlVURV9Tb3VyY2VBYm92ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0gsCVhGQV9BVFRSSUJVVEVfVywJWEZBX0FUVFJJQlVURV9YLAlYRkFfQVRUUklCVVRFX1ksCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfSEFsaWduLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0FjY2VzcywNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwJWEZBX0FUVFJJQlVURV9WQWxpZ24sCVhGQV9BVFRSSUJVVEVfTWF4SCwJWEZBX0FUVFJJQlVURV9NYXhXLAlYRkFfQVRUUklCVVRFX01pbkgsCVhGQV9BVFRSSUJVVEVfTWluVywJWEZBX0FUVFJJQlVURV9MYXlvdXQsCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfQ29sU3BhbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsCVhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1JpZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX1Njb3BlLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwJWEZBX0FUVFJJQlVURV9SdW5BdCwJWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9QaWNrZXIsCVhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCVhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0FzcGVjdCwJWEZBX0FUVFJJQlVURV9IcmVmLAlYRkFfQVRUUklCVVRFX1ZhbHVlLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfU2VydmVyLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9GcmFjRGlnaXRzLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywJWEZBX0FUVFJJQlVURV9ILAlYRkFfQVRUUklCVVRFX1csCVhGQV9BVFRSSUJVVEVfWCwJWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX0hBbGlnbiwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9BbGxvd01hY3JvLAlYRkFfQVRUUklCVVRFX0NvbHVtbldpZHRocywJWEZBX0FUVFJJQlVURV9BY2Nlc3MsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVkFsaWduLAlYRkFfQVRUUklCVVRFX01heEgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4VywJWEZBX0FUVFJJQlVURV9NaW5ILAlYRkFfQVRUUklCVVRFX01pblcsCVhGQV9BVFRSSUJVVEVfTGF5b3V0LAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LAlYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwJWEZBX0FUVFJJQlVURV9Db2xTcGFuLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTG9jYWxlLAlYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlLAlYRkFfQVRUUklCVVRFX1Njb3BlLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UaW1lb3V0LAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX01vZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Sb2xlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1N0cm9rZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwJWEZBX0FUVFJJQlVURV9UaGlja25lc3MsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9Kb2luLAlYRkFfQVRUUklCVVRFX1JhZGl1cywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0NTcGFjZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1ZhbHVlLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05leHQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1ByZXZpb3VzLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSW50YWN0LAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0LAlYRkFfQVRUUklCVVRFX051bGxUZXN0LAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwJWEZBX0FUVFJJQlVURV9SZWxldmFudCwJWEZBX0FUVFJJQlVURV9EdXBsZXhJbXBvc2l0aW9uLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1RvLAlYRkFfQVRUUklCVVRFX0ZvcmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfRnJvbSwJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfVmFsdWUsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfUmVmLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfQmFzZVByb2ZpbGUsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCVhGQV9BVFRSSUJVVEVfUnVuQXQsCVhGQV9BVFRSSUJVVEVfQmluZGluZywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwJWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfSW5pdGlhbE51bWJlciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX051bWJlcmVkLAlYRkFfQVRUUklCVVRFX0JsYW5rT3JOb3RCbGFuaywJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfUmlkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwJWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLAlYRkFfQVRUUklCVVRFX0hyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQWJiciwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0FjdGlvbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UcmFpbGVyLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfVGFyZ2V0LAlYRkFfQVRUUklCVVRFX0xlYWRlciwJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1RvLAlYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0Zyb20sCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9UcmF5T3V0LAlYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwJWEZBX0FUVFJJQlVURV9JbWFnaW5nQkJveCwJWEZBX0FUVFJJQlVURV9TaG9ydCwJWEZBX0FUVFJJQlVURV9UcmF5SW4sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9TdG9jaywJWEZBX0FUVFJJQlVURV9Mb25nLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksCVhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsCVhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX01heEVudHJpZXMsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwJWEZBX0FUVFJJQlVURV9Db250YWlucywJWEZBX0FUVFJJQlVURV9WYWx1ZSwJWEZBX0FUVFJJQlVURV9Jc051bGwsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfUmVmLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9UYXJnZXQsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1JlZiwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX01hdGNoLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0hhbmQsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0gsCVhGQV9BVFRSSUJVVEVfVywJWEZBX0FUVFJJQlVURV9YLAlYRkFfQVRUUklCVVRFX1ksCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfSEFsaWduLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwJWEZBX0FUVFJJQlVURV9WQWxpZ24sCVhGQV9BVFRSSUJVVEVfTWF4SCwJWEZBX0FUVFJJQlVURV9NYXhXLAlYRkFfQVRUUklCVVRFX01pbkgsCVhGQV9BVFRSSUJVVEVfTWluVywJWEZBX0FUVFJJQlVURV9SZWxldmFudCwJWEZBX0FUVFJJQlVURV9Db2xTcGFuLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLAlYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9SaWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1ByaW9yaXR5LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGlzYWJsZSwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9WYWx1ZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwJWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwJWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwNCisgICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsCVhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwJWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwJWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLAlYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLAlYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLAlYRkFfQVRUUklCVVRFX1BzTmFtZSwJWEZBX0FUVFJJQlVURV9TaXplLAlYRkFfQVRUUklCVVRFX1Bvc3R1cmUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9XZWlnaHQsCVhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLAlYRkFfQVRUUklCVVRFX092ZXJsaW5lLAlYRkFfQVRUUklCVVRFX0dlbmVyaWNGYW1pbHksCVhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9PdmVycmlkZSwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHJhaWxlciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0xlYWRlciwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwJWEZBX0FUVFJJQlVURV9BcmNoaXZlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfQ29kZUJhc2UsCVhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLAlYRkFfQVRUUklCVVRFX0xhYmVsUmVmLAlYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX092ZXJyaWRlLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1ZhbHVlLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1JlZiwJWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwJWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLAlYRkFfQVRUUklCVVRFX1VzYWdlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Gb3JtYXQsDQorICAgIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9UYXJnZXQsCVhGQV9BVFRSSUJVVEVfVGV4dEVuY29kaW5nLAlYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0RlbGltaXRlciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfUmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9TdGFydE5ldywJWEZBX0FUVFJJQlVURV9UcmFpbGVyLAlYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9UYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9TbG9wZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0hhbmQsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9NYXgsCVhGQV9BVFRSSUJVVEVfTWluLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Jbml0aWFsLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0FiYnIsCVhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1ByZXNlbmNlLAlYRkFfQVRUUklCVVRFX1NhdmUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfUEFDS0VUSU5GTyBnX1hGQVBhY2tldERhdGFbXSA9IHsNCisgICAgezB4MCwgTlVMTCwgWEZBX1hEUFBBQ0tFVF9VU0VSLCBOVUxMLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCisgICAgezB4ODExOTI5ZCwgKEZYX0xQQ1dTVFIpTCJzb3VyY2VTZXQiLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKEZYX0xQQ1dTVFIpTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1zb3VyY2Utc2V0LyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweGI4NDNkYmEsIChGWF9MUENXU1RSKUwicGRmIiwgWEZBX1hEUFBBQ0tFVF9QZGYsIChGWF9MUENXU1RSKUwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvcGRmLyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweGM1NmFmYmYsIChGWF9MUENXU1RSKUwieGRjIiwgWEZBX1hEUFBBQ0tFVF9YZGMsIChGWF9MUENXU1RSKUwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZGMvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4YzU2YWZjYywgKEZYX0xQQ1dTVFIpTCJ4ZHAiLCBYRkFfWERQUEFDS0VUX1hEUCwgKEZYX0xQQ1dTVFIpTCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX0NPTVBMRVRFTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHgxMzJhOGZiYywgKEZYX0xQQ1dTVFIpTCJ4bXBtZXRhIiwgWEZBX1hEUFBBQ0tFVF9YbXBtZXRhLCAoRlhfTFBDV1NUUilMImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCisgICAgezB4NDhkMDA0YTgsIChGWF9MUENXU1RSKUwieGZkZiIsIFhGQV9YRFBQQUNLRVRfWGZkZiwgKEZYX0xQQ1dTVFIpTCJodHRwOi8vbnMuYWRvYmUuY29tL3hmZGYvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4NGUxZTM5YjYsIChGWF9MUENXU1RSKUwiY29uZmlnIiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIChGWF9MUENXU1RSKUwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94Y2kvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4NTQ3M2I2ZGMsIChGWF9MUENXU1RSKUwibG9jYWxlU2V0IiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIChGWF9MUENXU1RSKUwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHg2MDM4NTgwYSwgKEZYX0xQQ1dTVFIpTCJzdHlsZXNoZWV0IiwgWEZBX1hEUFBBQ0tFVF9TdHlsZXNoZWV0LCAoRlhfTFBDV1NUUilMImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTll9LA0KKyAgICB7MHg4MDM1NTBmYywgKEZYX0xQQ1dTVFIpTCJ0ZW1wbGF0ZSIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUsIChGWF9MUENXU1RSKUwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4OGIwMzZmMzIsIChGWF9MUENXU1RSKUwic2lnbmF0dXJlIiwgWEZBX1hEUFBBQ0tFVF9TaWduYXR1cmUsIChGWF9MUENXU1RSKUwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDk5Yjk1MDc5LCAoRlhfTFBDV1NUUilMImRhdGFzZXRzIiwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKEZYX0xQQ1dTVFIpTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfUFJFRklYTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHhjZDMwOWZmNCwgKEZYX0xQQ1dTVFIpTCJmb3JtIiwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAoRlhfTFBDV1NUUilMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4ZTE0YzgwMWMsIChGWF9MUENXU1RSKUwiY29ubmVjdGlvblNldCIsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKEZYX0xQQ1dTVFIpTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KK307DQorZXh0ZXJuIGNvbnN0IEZYX0lOVDMyIGdfaVhGQVBhY2tldENvdW50ID0gc2l6ZW9mKGdfWEZBUGFja2V0RGF0YSkgLyBzaXplb2YoWEZBX1BBQ0tFVElORk8pOw0KK2V4dGVybiBjb25zdCBYRkFfU0NSSVBUSElFUkFSQ0hZIGdfWEZBU2NyaXB0SW5kZXhbXSA9IHsNCisgICAgezAsIDAsIDAsIDIsIDMxNn0sCXswLCAwLCAyLCAyLCAzMTZ9LAl7MCwgMCwgNCwgMiwgMzE2fSwJezAsIDAsIDYsIDgsIDMxNn0sCXswLCAwLCAxNCwgNCwgMzE2fSwJezAsIDAsIDE4LCA1LCAzMTd9LAl7MCwgMCwgMjMsIDIsIDMxNn0sCXswLCAwLCAyNSwgMSwgMzE2fSwJezAsIDAsIDI2LCAxMiwgMzE2fSwJezAsIDAsIDM4LCAyLCAzMTZ9LAl7MCwgMCwgNDAsIDEsIDMxNn0sCXswLCAwLCA0MSwgMywgMzE2fSwJezAsIDAsIDQ0LCAyLCAzMTZ9LAl7MCwgMCwgNDYsIDYsIDMxNn0sCXswLCAwLCA1MiwgMCwgMzE2fSwJezAsIDAsIDUyLCAyLCAzMTl9LAl7MCwgMCwgNTQsIDIsIDMxNn0sCXswLCAwLCA1NiwgNiwgMzE2fSwJezAsIDAsIDYyLCAwLCAzMTZ9LAl7MCwgMCwgNjIsIDAsIDMxNn0sDQorICAgIHswLCAwLCA2MiwgMiwgMzE2fSwJezAsIDAsIDY0LCAyLCAzMTZ9LAl7MCwgMCwgNjYsIDYsIDMxNn0sCXswLCAwLCA3MiwgNCwgMzE2fSwJezAsIDAsIDc2LCA3LCAzMTZ9LAl7MCwgMCwgODMsIDIsIDMyMH0sCXswLCAwLCA4NSwgMywgMzE2fSwJezAsIDAsIDg4LCAzLCAzMTZ9LAl7MCwgMCwgOTEsIDIsIDMyMH0sCXswLCAwLCA5MywgNiwgMzIwfSwJezAsIDAsIDk5LCA0LCAzMTZ9LAl7MCwgMCwgMTAzLCAyLCAzMTZ9LAl7MCwgMCwgMTA1LCAzLCAzMTl9LAl7MCwgMCwgMTA4LCA0LCAzMTZ9LAl7MCwgMCwgMTEyLCAzLCAzMTZ9LAl7MCwgMCwgMTE1LCAyLCAzMTZ9LAl7MCwgMCwgMTE3LCA2LCAzMTZ9LAl7MCwgMCwgMTIzLCAxMiwgMzE2fSwJezAsIDAsIDEzNSwgMiwgMzE2fSwJezAsIDAsIDEzNywgNSwgMzE2fSwNCisgICAgezAsIDAsIDE0MiwgMiwgMzE2fSwJezAsIDAsIDE0NCwgMywgMzE2fSwJezAsIDAsIDE0NywgMSwgMzE2fSwJezAsIDAsIDE0OCwgMTQsIDMxNn0sCXswLCAwLCAxNjIsIDIsIDMxNn0sCXswLCAwLCAxNjQsIDIsIDMxNn0sCXswLCAwLCAxNjYsIDMsIDMxNn0sCXswLCAwLCAxNjksIDIsIDMxNn0sCXswLCAwLCAxNzEsIDIsIDMxNn0sCXswLCAwLCAxNzMsIDIsIDMxNn0sCXswLCAwLCAxNzUsIDQsIDMxNn0sCXswLCAwLCAxNzksIDIsIDMxNn0sCXswLCAwLCAxODEsIDIsIDMxNn0sCXswLCAwLCAxODMsIDAsIDMxOX0sCXswLCAwLCAxODMsIDIwLCAzMTZ9LAl7MCwgMCwgMjAzLCAxLCAzMTZ9LAl7MCwgMCwgMjA0LCAzLCAzMTZ9LAl7MCwgMCwgMjA3LCAyLCAzMTZ9LAl7MCwgMCwgMjA5LCAwLCAzMTZ9LAl7MCwgMCwgMjA5LCAyLCAzMTZ9LA0KKyAgICB7MCwgMCwgMjExLCAyLCAzMTZ9LAl7MCwgMCwgMjEzLCA0LCAzMjB9LAl7MCwgMCwgMjE3LCAwLCAzMTZ9LAl7MCwgMCwgMjE3LCAxLCAzMTZ9LAl7MCwgMCwgMjE4LCAzLCAzMTZ9LAl7MCwgNCwgMjIxLCAwLCAzMTJ9LAl7NCwgMSwgMjIxLCAxLCAzMTZ9LAl7NSwgMCwgMjIyLCAyLCAzMTZ9LAl7NSwgMSwgMjI0LCAzLCAtMX0sCXs2LCAwLCAyMjcsIDAsIDMxNn0sCXs2LCAwLCAyMjcsIDIsIDMxNn0sCXs2LCAwLCAyMjksIDIsIDMxNn0sCXs2LCAwLCAyMzEsIDMsIDMxNn0sCXs2LCAwLCAyMzQsIDIsIDMxNn0sCXs2LCAwLCAyMzYsIDYsIDMxNn0sCXs2LCAwLCAyNDIsIDEwLCAzMTd9LAl7NiwgMCwgMjUyLCA5LCAzMTZ9LAl7NiwgMCwgMjYxLCA1LCAzMTh9LAl7NiwgMCwgMjY2LCA0LCAzMTh9LAl7NiwgMCwgMjcwLCAyLCAzMTZ9LA0KKyAgICB7NiwgMCwgMjcyLCAyLCAzMTZ9LAl7NiwgMCwgMjc0LCA1LCAzMTZ9LAl7NiwgMCwgMjc5LCAzLCAzMTZ9LAl7NiwgMCwgMjgyLCAyLCAzMTZ9LAl7NiwgMCwgMjg0LCAyLCAzMTZ9LAl7NiwgMCwgMjg2LCAyLCAzMTZ9LAl7NiwgMCwgMjg4LCAyLCAzMTZ9LAl7NiwgMCwgMjkwLCA0LCAzMTZ9LAl7NiwgMCwgMjk0LCAzLCAzMTZ9LAl7NiwgMCwgMjk3LCAzLCAzMTZ9LAl7NiwgMCwgMzAwLCAyLCAzMTZ9LAl7NiwgMCwgMzAyLCAyLCAzMTZ9LAl7NiwgMCwgMzA0LCAyLCAzMTZ9LAl7NiwgMTMsIDMwNiwgMzYsIDMxN30sCXsxOSwgMCwgMzQyLCAzLCAzMTZ9LAl7MTksIDAsIDM0NSwgMiwgMzE2fSwJezE5LCAwLCAzNDcsIDIsIDMxNn0sCXsxOSwgMCwgMzQ5LCAyLCAzMTZ9LAl7MTksIDAsIDM1MSwgNywgMzE3fSwJezE5LCAyLCAzNTgsIDE2LCAzMTJ9LA0KKyAgICB7MjEsIDAsIDM3NCwgMiwgMzIwfSwJezIxLCAwLCAzNzYsIDIsIDMxNn0sCXsyMSwgMCwgMzc4LCAwLCAzMTZ9LAl7MjEsIDAsIDM3OCwgMiwgMzE2fSwJezIxLCAwLCAzODAsIDYsIDMxNn0sCXsyMSwgMCwgMzg2LCAzLCAzMTZ9LAl7MjEsIDAsIDM4OSwgMiwgMzE2fSwJezIxLCAwLCAzOTEsIDQsIDMxNn0sCXsyMSwgMCwgMzk1LCAwLCAzMTZ9LAl7MjEsIDUsIDM5NSwgMzAsIDMxNn0sCXsyNiwgMCwgNDI1LCAyLCAzMjB9LAl7MjYsIDAsIDQyNywgMywgMzE2fSwJezI2LCAwLCA0MzAsIDIsIDMyMH0sCXsyNiwgMCwgNDMyLCA1LCAzMTZ9LAl7MjYsIDAsIDQzNywgMiwgMzE2fSwJezI2LCAwLCA0MzksIDMsIDMxNn0sCXsyNiwgMCwgNDQyLCAyLCAzMTZ9LAl7MjYsIDAsIDQ0NCwgOCwgMzE2fSwJezI2LCAwLCA0NTIsIDEsIDMxNn0sCXsyNiwgMCwgNDUzLCAyLCAzMTZ9LA0KKyAgICB7MjYsIDAsIDQ1NSwgMiwgMzE2fSwJezI2LCAwLCA0NTcsIDQsIDMxNn0sCXsyNiwgMCwgNDYxLCAwLCAzMTZ9LAl7MjYsIDAsIDQ2MSwgMiwgMzE2fSwJezI2LCAwLCA0NjMsIDIsIDMxNn0sCXsyNiwgMCwgNDY1LCA2LCAzMTh9LAl7MjYsIDUsIDQ3MSwgMzEsIDMxN30sCXszMSwgMCwgNTAyLCAyLCAzMjB9LAl7MzEsIDAsIDUwNCwgMiwgMzE2fSwJezMxLCAwLCA1MDYsIDIsIDMxNn0sCXszMSwgMCwgNTA4LCA0LCAzMjB9LAl7MzEsIDE2LCA1MTIsIDE0LCAzMTJ9LAl7NDcsIDAsIDUyNiwgMiwgMzE2fSwJezQ3LCAwLCA1MjgsIDIsIDMxNn0sCXs0NywgMCwgNTMwLCAyLCAzMTZ9LAl7NDcsIDAsIDUzMiwgMiwgMzE2fSwJezQ3LCAwLCA1MzQsIDMsIDMxNn0sCXs0NywgMCwgNTM3LCAyLCAzMTZ9LAl7NDcsIDAsIDUzOSwgMywgMzE2fSwJezQ3LCAwLCA1NDIsIDMsIDMxNn0sDQorICAgIHs0NywgMCwgNTQ1LCA0LCAzMTh9LAl7NDcsIDAsIDU0OSwgNCwgMzE2fSwJezQ3LCAwLCA1NTMsIDIsIDMxNn0sCXs0NywgMCwgNTU1LCAwLCAzMTZ9LAl7NDcsIDAsIDU1NSwgMiwgMzE2fSwJezQ3LCAwLCA1NTcsIDMsIDMxNn0sCXs0NywgMCwgNTYwLCA2LCAzMTZ9LAl7NDcsIDAsIDU2NiwgMiwgMzE2fSwJezQ3LCAwLCA1NjgsIDIsIDMxNn0sCXs0NywgMCwgNTcwLCAzLCAzMTZ9LAl7NDcsIDE5LCA1NzMsIDEsIDMxMn0sCXs2NiwgMCwgNTc0LCAyLCAzMTZ9LAl7NjYsIDAsIDU3NiwgOCwgMzE2fSwJezY2LCAwLCA1ODQsIDIsIDMxNn0sCXs2NiwgMCwgNTg2LCA0LCAzMTZ9LAl7NjYsIDAsIDU5MCwgNSwgMzE2fSwJezY2LCAwLCA1OTUsIDMsIDMxNn0sCXs2NiwgMCwgNTk4LCAyLCAzMjB9LAl7NjYsIDAsIDYwMCwgMywgMzE2fSwJezY2LCAwLCA2MDMsIDcsIDMxNn0sDQorICAgIHs2NiwgMCwgNjEwLCAzLCAzMTZ9LAl7NjYsIDAsIDYxMywgMCwgMzE2fSwJezY2LCAwLCA2MTMsIDQsIDMxN30sCXs2NiwgMCwgNjE3LCA0LCAzMTh9LAl7NjYsIDAsIDYyMSwgMiwgMzIwfSwJezY2LCAwLCA2MjMsIDUsIDMxNn0sCXs2NiwgMCwgNjI4LCAyLCAzMTZ9LAl7NjYsIDAsIDYzMCwgMiwgMzE2fSwJezY2LCAwLCA2MzIsIDIsIDMyMH0sCXs2NiwgMCwgNjM0LCAyLCAzMjB9LAl7NjYsIDAsIDYzNiwgNCwgMzE2fSwJezY2LCAwLCA2NDAsIDIsIDMxNn0sCXs2NiwgMCwgNjQyLCAxLCAzMTZ9LAl7NjYsIDAsIDY0MywgMSwgMzE2fSwJezY2LCAwLCA2NDQsIDQsIDMxNn0sCXs2NiwgMCwgNjQ4LCAzLCAzMTZ9LAl7NjYsIDcsIDY1MSwgMiwgMzE5fSwJezczLCAwLCA2NTMsIDIsIDMxNn0sCXs3MywgMCwgNjU1LCAyLCAzMTZ9LAl7NzMsIDAsIDY1NywgMywgMzE2fSwNCisgICAgezczLCA0LCA2NjAsIDQsIDMxMn0sCXs3NywgMCwgNjY0LCAxMCwgMzE2fSwJezc3LCAwLCA2NzQsIDIsIDMxNn0sCXs3NywgMCwgNjc2LCA0LCAzMTZ9LAl7NzcsIDAsIDY4MCwgNCwgMzE2fSwJezc3LCAwLCA2ODQsIDMsIDMxNn0sCXs3NywgMCwgNjg3LCAyLCAzMTZ9LAl7NzcsIDAsIDY4OSwgMiwgMzE2fSwJezc3LCAwLCA2OTEsIDgsIDMxN30sCXs3NywgMCwgNjk5LCAzLCAzMTZ9LAl7NzcsIDAsIDcwMiwgMywgMzE2fSwJezc3LCAwLCA3MDUsIDIsIDMxNn0sCXs3NywgMCwgNzA3LCAyLCAzMTZ9LAl7NzcsIDAsIDcwOSwgNSwgMzE2fSwJezc3LCAwLCA3MTQsIDQsIDMxNn0sCXs3NywgMCwgNzE4LCAyLCAzMTZ9LAl7NzcsIDAsIDcyMCwgOCwgMzE4fSwJezc3LCAwLCA3MjgsIDEsIDMxNn0sCXs3NywgMCwgNzI5LCAyLCAzMjB9LAl7NzcsIDAsIDczMSwgMywgMzE2fSwNCisgICAgezc3LCAxLCA3MzQsIDQsIDMxNn0sCXs3OCwgMCwgNzM4LCA1LCAzMTZ9LAl7NzgsIDAsIDc0MywgMywgMzE2fSwJezc4LCAwLCA3NDYsIDEsIDMxNn0sCXs3OCwgMCwgNzQ3LCAyLCAzMjB9LAl7NzgsIDAsIDc0OSwgMCwgMzEzfSwJezc4LCAwLCA3NDksIDIsIDMxNn0sCXs3OCwgNSwgNzUxLCAzLCAzMTZ9LAl7ODMsIDAsIDc1NCwgNSwgMzE2fSwJezgzLCAwLCA3NTksIDcsIDMxNn0sCXs4MywgMCwgNzY2LCA2LCAzMTZ9LAl7ODMsIDAsIDc3MiwgMywgMzE2fSwJezgzLCAwLCA3NzUsIDIsIDMxNn0sCXs4MywgMCwgNzc3LCA1LCAzMTZ9LAl7ODMsIDAsIDc4MiwgMiwgMzE2fSwJezgzLCAwLCA3ODQsIDAsIDMxNH0sCXs4MywgMCwgNzg0LCAyLCAzMTZ9LAl7ODMsIDAsIDc4NiwgMSwgMzE2fSwJezgzLCAwLCA3ODcsIDIsIDMxNn0sCXs4MywgMCwgNzg5LCA1LCAzMTZ9LA0KKyAgICB7ODMsIDAsIDc5NCwgMiwgMzE2fSwJezgzLCAwLCA3OTYsIDEsIDMxNn0sCXs4MywgMCwgNzk3LCAyLCAzMTZ9LAl7ODMsIDAsIDc5OSwgMiwgMzE2fSwJezgzLCAwLCA4MDEsIDYsIDMxNn0sCXs4MywgMCwgODA3LCAyLCAzMTZ9LAl7ODMsIDAsIDgwOSwgMiwgMzIwfSwJezgzLCAwLCA4MTEsIDMsIDMxNn0sCXs4MywgMCwgODE0LCA0LCAzMTZ9LAl7ODMsIDAsIDgxOCwgMiwgMzE2fSwJezgzLCAwLCA4MjAsIDIsIDMxNn0sCXs4MywgMCwgODIyLCAyLCAzMTZ9LAl7ODMsIDAsIDgyNCwgMiwgMzE2fSwJezgzLCAwLCA4MjYsIDIsIDMxNn0sCXs4MywgMCwgODI4LCAyLCAzMTZ9LAl7ODMsIDAsIDgzMCwgNCwgMzE4fSwJezgzLCAxLCA4MzQsIDIsIDMxNn0sCXs4NCwgMCwgODM2LCA1LCAzMTZ9LAl7ODQsIDAsIDg0MSwgMjAsIDMxN30sCXs4NCwgMCwgODYxLCAyLCAzMTZ9LA0KKyAgICB7ODQsIDAsIDg2MywgMCwgMzE2fSwJezg0LCAwLCA4NjMsIDIsIDMxNn0sCXs4NCwgMCwgODY1LCA0LCAzMjB9LAl7ODQsIDAsIDg2OSwgMCwgMzE2fSwJezg0LCAwLCA4NjksIDIsIDMxNn0sCXs4NCwgMCwgODcxLCAxLCAzMTZ9LAl7ODQsIDAsIDg3MiwgMiwgMzE2fSwJezg0LCAwLCA4NzQsIDMsIDMxNn0sCXs4NCwgMCwgODc3LCAyLCAzMTZ9LAl7ODQsIDAsIDg3OSwgMiwgMzE2fSwJezg0LCAwLCA4ODEsIDQsIDMxNn0sCXs4NCwgMCwgODg1LCAzLCAzMTZ9LAl7ODQsIDAsIDg4OCwgMTcsIDMxNn0sCXs4NCwgNiwgOTA1LCAxLCAzMTl9LAl7OTAsIDAsIDkwNiwgMiwgMzE2fSwJezkwLCAwLCA5MDgsIDIsIDMyMH0sCXs5MCwgMCwgOTEwLCAyLCAzMjB9LAl7OTAsIDAsIDkxMiwgMiwgMzE2fSwJezkwLCAwLCA5MTQsIDIsIDMxNn0sCXs5MCwgMCwgOTE2LCA0LCAzMTh9LA0KKyAgICB7OTAsIDAsIDkyMCwgMiwgMzE2fSwJezkwLCA1LCA5MjIsIDAsIDMxMn0sCXs5NSwgMCwgOTIyLCAyLCAzMTZ9LAl7OTUsIDAsIDkyNCwgNCwgMzE2fSwJezk1LCAwLCA5MjgsIDQsIDMxNn0sCXs5NSwgMCwgOTMyLCA2LCAzMTZ9LAl7OTUsIDAsIDkzOCwgMiwgMzE2fSwJezk1LCAwLCA5NDAsIDQsIDMxNn0sCXs5NSwgMCwgOTQ0LCAzLCAzMTZ9LAl7OTUsIDAsIDk0NywgMywgMzE2fSwJezk1LCAwLCA5NTAsIDIsIDMxNn0sCXs5NSwgMCwgOTUyLCAzLCAzMTZ9LAl7OTUsIDAsIDk1NSwgMCwgMzE2fSwJezk1LCAwLCA5NTUsIDAsIDMxNn0sCXs5NSwgMCwgOTU1LCAyLCAzMTZ9LAl7OTUsIDAsIDk1NywgNywgMzE2fSwJezk1LCAwLCA5NjQsIDIsIDMxNn0sCXs5NSwgMCwgOTY2LCAwLCAzMTl9LAl7OTUsIDAsIDk2NiwgNywgMzE2fSwJezk1LCAwLCA5NzMsIDIsIDMxNn0sDQorICAgIHs5NSwgMCwgOTc1LCAyLCAzMTZ9LAl7OTUsIDMsIDk3NywgMSwgMzE2fSwJezk4LCAwLCA5NzgsIDIsIDMyMH0sCXs5OCwgMCwgOTgwLCA0LCAzMTZ9LAl7OTgsIDAsIDk4NCwgMCwgMzE2fSwJezk4LCAwLCA5ODQsIDIsIDMxNn0sCXs5OCwgMCwgOTg2LCAyLCAzMTZ9LAl7OTgsIDAsIDk4OCwgNCwgMzE2fSwJezk4LCAwLCA5OTIsIDEsIDMxNn0sCXs5OCwgMCwgOTkzLCAyLCAzMTZ9LAl7OTgsIDAsIDk5NSwgMiwgMzE2fSwJezk4LCAwLCA5OTcsIDMsIDMxNn0sCXs5OCwgMCwgMTAwMCwgMiwgMzE3fSwJezk4LCAwLCAxMDAyLCAwLCAzMTZ9LAl7OTgsIDAsIDEwMDIsIDQsIDMxNn0sCXs5OCwgMCwgMTAwNiwgNCwgMzE2fSwJezk4LCAwLCAxMDEwLCAyLCAzMTZ9LAl7OTgsIDAsIDEwMTIsIDMsIDMxNn0sCXs5OCwgMCwgMTAxNSwgNCwgMzE2fSwJezk4LCAwLCAxMDE5LCA3LCAzMTZ9LA0KKyAgICB7OTgsIDAsIDEwMjYsIDQsIDMxNn0sCXs5OCwgMCwgMTAzMCwgMSwgMzEzfSwJezk4LCAxNywgMTAzMSwgMywgMzE2fSwJezExNSwgMCwgMTAzNCwgNSwgMzE2fSwJezExNSwgMCwgMTAzOSwgMiwgMzE2fSwJezExNSwgMCwgMTA0MSwgMSwgMzE2fSwJezExNSwgMCwgMTA0MiwgNCwgMzE2fSwJezExNSwgMCwgMTA0NiwgMiwgMzE2fSwJezExNSwgMCwgMTA0OCwgMiwgMzE2fSwJezExNSwgMCwgMTA1MCwgMSwgMzE2fSwJezExNSwgMCwgMTA1MSwgMiwgMzE2fSwJezExNSwgMCwgMTA1MywgNSwgMzE2fSwJezExNSwgMCwgMTA1OCwgMSwgLTF9LAl7MTE1LCA0LCAxMDU5LCAxLCAzMTJ9LAl7MTE5LCAxLCAxMDYwLCAwLCAzMTN9LAl7MTIwLCAyLCAxMDYwLCA4LCAzMTJ9LAl7MTIyLCAxMSwgMTA2OCwgNiwgMzE1fSwJezEzMywgMiwgMTA3NCwgMCwgMzE2fSwJezEzNSwgMCwgMTA3NCwgMCwgMzE2fSwJezEzNSwgMywgMTA3NCwgMiwgMzE2fSwNCisgICAgezEzOCwgMCwgMTA3NiwgMiwgMzE2fSwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfTUVUSE9ESU5GTyBnX1NvbU1ldGhvZERhdGFbXSA9IHsNCisgICAgezB4M2M3NTI0OTUsIChGWF9MUENXU1RSKUwidmVyaWZ5IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9WZXJpZnl9LAl7MHhhNjg2MzVmMSwgKEZYX0xQQ1dTVFIpTCJzaWduIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9TaWdufSwJezB4YTdmMmM1ZTYsIChGWF9MUENXU1RSKUwiZW51bWVyYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9FbnVtZXJhdGV9LA0KKyAgICB7MHhkOGVkMTQ2NywgKEZYX0xQQ1dTVFIpTCJjbGVhciIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfQ2xlYXJ9LAl7MHg0YmRjY2UxMywgKEZYX0xQQ1dTVFIpTCJleGVjdXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1dzZGxDb25uZWN0aW9uX0V4ZWN1dGV9LAl7MHgxYzI5NmJhNCwgKEZYX0xQQ1dTVFIpTCJyZXN0b3JlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1Jlc3RvcmV9LA0KKyAgICB7MHg3ZDEyM2E5LCAoRlhfTFBDV1NUUilMImNsZWFySXRlbXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQ2xlYXJJdGVtc30sCXsweGZiMGIwMDcsIChGWF9MUENXU1RSKUwiZXhlY0V2ZW50IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNFdmVudH0sCXsweDY3MTZjZTk3LCAoRlhfTFBDV1NUUilMImV4ZWNJbml0aWFsaXplIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNJbml0aWFsaXplfSwNCisgICAgezB4N2JiOTE5YzIsIChGWF9MUENXU1RSKUwiZGVsZXRlSXRlbSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9EZWxldGVJdGVtfSwJezB4OWYwNTNkNWUsIChGWF9MUENXU1RSKUwiZ2V0U2F2ZUl0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0U2F2ZUl0ZW19LAl7MHhiYmQzMjc0NywgKEZYX0xQQ1dTVFIpTCJib3VuZEl0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQm91bmRJdGVtfSwNCisgICAgezB4YzQ5MmQ5NTAsIChGWF9MUENXU1RSKUwiZ2V0SXRlbVN0YXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldEl0ZW1TdGF0ZX0sCXsweGM2MDEzY2QzLCAoRlhfTFBDV1NUUilMImV4ZWNDYWxjdWxhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZX0sCXsweGQ4OTMwZDBlLCAoRlhfTFBDV1NUUilMInNldEl0ZW1zIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NldEl0ZW1zfSwNCisgICAgezB4ZTBmMTUwNDUsIChGWF9MUENXU1RSKUwiZ2V0RGlzcGxheUl0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0RGlzcGxheUl0ZW19LAl7MHhlMjNhY2RkYywgKEZYX0xQQ1dTVFIpTCJzZXRJdGVtU3RhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbVN0YXRlfSwJezB4ZTJkZmIyZjgsIChGWF9MUENXU1RSKUwiYWRkSXRlbSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9BZGRJdGVtfSwNCisgICAgezB4ZWY4Y2U0OGYsIChGWF9MUENXU1RSKUwiZXhlY1ZhbGlkYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNWYWxpZGF0ZX0sCXsweDQ2MTA3OWVmLCAoRlhfTFBDV1NUUilMImVtaXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9FbWl0fSwJezB4ZmVjOTBjNjMsIChGWF9MUENXU1RSKUwicmVzZXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZXNldH0sDQorICAgIHsweGZiMGIwMDcsIChGWF9MUENXU1RSKUwiZXhlY0V2ZW50IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjRXZlbnR9LAl7MHgzZDgzMjIyMSwgKEZYX0xQQ1dTVFIpTCJzZWxlY3RlZE1lbWJlciIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfU2VsZWN0ZWRNZW1iZXJ9LAl7MHg2NzE2Y2U5NywgKEZYX0xQQ1dTVFIpTCJleGVjSW5pdGlhbGl6ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHhjNjAxM2NkMywgKEZYX0xQQ1dTVFIpTCJleGVjQ2FsY3VsYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjQ2FsY3VsYXRlfSwJezB4ZWY4Y2U0OGYsIChGWF9MUENXU1RSKUwiZXhlY1ZhbGlkYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjVmFsaWRhdGV9LAl7MHhmYjBiMDA3LCAoRlhfTFBDV1NUUilMImV4ZWNFdmVudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNFdmVudH0sDQorICAgIHsweDY3MTZjZTk3LCAoRlhfTFBDV1NUUilMImV4ZWNJbml0aWFsaXplIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0luaXRpYWxpemV9LAl7MHhjNjAxM2NkMywgKEZYX0xQQ1dTVFIpTCJleGVjQ2FsY3VsYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0NhbGN1bGF0ZX0sCXsweGQ5YjliMWYxLCAoRlhfTFBDV1NUUilMImdldEludmFsaWRPYmplY3RzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fR2V0SW52YWxpZE9iamVjdHN9LA0KKyAgICB7MHhlZjhjZTQ4ZiwgKEZYX0xQQ1dTVFIpTCJleGVjVmFsaWRhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjVmFsaWRhdGV9LAl7MHhhMzY2YjdjLCAoRlhfTFBDV1NUUilMImV4cG9ydERhdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRXhwb3J0RGF0YX0sCXsweDE2Y2MyMjZjLCAoRlhfTFBDV1NUUilMImdvdG9VUkwiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR290b1VSTH0sDQorICAgIHsweDFlMDcyMmY1LCAoRlhfTFBDV1NUUilMInBhZ2VEb3duIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VEb3dufSwJezB4M2U2NmNiMmMsIChGWF9MUENXU1RSKUwic2V0Rm9jdXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfU2V0Rm9jdXN9LAl7MHg0YWM5ZmFhZSwgKEZYX0xQQ1dTVFIpTCJvcGVuTGlzdCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9PcGVuTGlzdH0sDQorICAgIHsweDdiODk3MTRmLCAoRlhfTFBDV1NUUilMInJlc3BvbnNlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc3BvbnNlfSwJezB4N2ZkOWZkNTgsIChGWF9MUENXU1RSKUwiZG9jdW1lbnRJbkJhdGNoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50SW5CYXRjaH0sCXsweGFmMWQwMTlkLCAoRlhfTFBDV1NUUilMInJlc2V0RGF0YSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNldERhdGF9LA0KKyAgICB7MHhiMDdiZTEzYywgKEZYX0xQQ1dTVFIpTCJiZWVwIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0JlZXB9LAl7MHhiMTg4MmNhMCwgKEZYX0xQQ1dTVFIpTCJnZXRGb2N1cyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9HZXRGb2N1c30sCXsweGJmNGJhOWVlLCAoRlhfTFBDV1NUUilMIm1lc3NhZ2VCb3giLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTWVzc2FnZUJveH0sDQorICAgIHsweGQ2ZDRkYmMxLCAoRlhfTFBDV1NUUilMImRvY3VtZW50Q291bnRJbkJhdGNoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50Q291bnRJbkJhdGNofSwJezB4ZGQ3Njc2ZWQsIChGWF9MUENXU1RSKUwicHJpbnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUHJpbnR9LAl7MHhlMmY4NjNkMCwgKEZYX0xQQ1dTVFIpTCJjdXJyZW50RGF0ZVRpbWUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudERhdGVUaW1lfSwNCisgICAgezB4Zjk5NWQwZjUsIChGWF9MUENXU1RSKUwiaW1wb3J0RGF0YSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9JbXBvcnREYXRhfSwJezB4ZmViOTZiNjIsIChGWF9MUENXU1RSKUwicGFnZVVwIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VVcH0sCXsweDY4LCAoRlhfTFBDV1NUUilMImgiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0h9LA0KKyAgICB7MHg3NywgKEZYX0xQQ1dTVFIpTCJ3IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9XfSwJezB4NzgsIChGWF9MUENXU1RSKUwieCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWH0sCXsweDc5LCAoRlhfTFBDV1NUUilMInkiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1l9LA0KKyAgICB7MHg1NDYwMjA2LCAoRlhfTFBDV1NUUilMInBhZ2VDb3VudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvdW50fSwJezB4NWViNWIwZiwgKEZYX0xQQ1dTVFIpTCJwYWdlU3BhbiIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZVNwYW59LAl7MHgxMGYxYjFiZCwgKEZYX0xQQ1dTVFIpTCJwYWdlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlfSwNCisgICAgezB4MWMxZTYzMTgsIChGWF9MUENXU1RSKUwicGFnZUNvbnRlbnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VDb250ZW50fSwJezB4MWMxZjRhNWMsIChGWF9MUENXU1RSKUwiYWJzUGFnZUNvdW50IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnR9LAl7MHgxZWM0N2RiNSwgKEZYX0xQQ1dTVFIpTCJhYnNQYWdlQ291bnRJbkJhdGNoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnRJbkJhdGNofSwNCisgICAgezB4MmU0ZWNiZGIsIChGWF9MUENXU1RSKUwic2hlZXRDb3VudEluQmF0Y2giLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnRJbkJhdGNofSwJezB4MmZjZmY0YjUsIChGWF9MUENXU1RSKUwicmVsYXlvdXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0fSwJezB4M2JmMWMyYTUsIChGWF9MUENXU1RSKUwiYWJzUGFnZVNwYW4iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VTcGFufSwNCisgICAgezB4NTc3NWMyY2MsIChGWF9MUENXU1RSKUwiYWJzUGFnZUluQmF0Y2giLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VJbkJhdGNofSwJezB4OGM1ZmViMzIsIChGWF9MUENXU1RSKUwic2hlZXRJbkJhdGNoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldEluQmF0Y2h9LAl7MHg4ZjNhODM3OSwgKEZYX0xQQ1dTVFIpTCJzaGVldCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXR9LA0KKyAgICB7MHg5NmYzYzRjYiwgKEZYX0xQQ1dTVFIpTCJyZWxheW91dFBhZ2VBcmVhIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dFBhZ2VBcmVhfSwJezB4ZDJhNGE1NDIsIChGWF9MUENXU1RSKUwic2hlZXRDb3VudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudH0sCXsweGU3NGYwNjUzLCAoRlhfTFBDV1NUUilMImFic1BhZ2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2V9LA0KKyAgICB7MHg0NGMzNTJhZCwgKEZYX0xQQ1dTVFIpTCJmb3JtTm9kZXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRm9ybU5vZGVzfSwJezB4NDVlZmI4NDcsIChGWF9MUENXU1RSKUwicmVtZXJnZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlfSwJezB4NjcxNmNlOTcsIChGWF9MUENXU1RSKUwiZXhlY0luaXRpYWxpemUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHg3MTJjNmFmYSwgKEZYX0xQQ1dTVFIpTCJjcmVhdGVOb2RlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGV9LAl7MHhhOGEzNWUyNSwgKEZYX0xQQ1dTVFIpTCJyZWNhbGN1bGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZX0sCXsweGM2MDEzY2QzLCAoRlhfTFBDV1NUUilMImV4ZWNDYWxjdWxhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY0NhbGN1bGF0ZX0sDQorICAgIHsweGVmOGNlNDhmLCAoRlhfTFBDV1NUUilMImV4ZWNWYWxpZGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGV9LAl7MHg0Y2MxYzBmOSwgKEZYX0xQQ1dTVFIpTCJtb3ZlQ3VycmVudFJlY29yZCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X01vdmVDdXJyZW50UmVjb3JkfSwJezB4NTc3OWQ2NWYsIChGWF9MUENXU1RSKUwicmVjb3JkIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3JkfSwNCisgICAgezB4OGE0NzY0OTgsIChGWF9MUENXU1RSKUwiZ290b1JlY29yZCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0dvdG9SZWNvcmR9LAl7MHhhYWMyNDFjOCwgKEZYX0xQQ1dTVFIpTCJpc1JlY29yZEdyb3VwIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfSXNSZWNvcmRHcm91cH0sCXsweDFjNmY0Mjc3LCAoRlhfTFBDV1NUUilMImV2YWx1YXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01hbmlmZXN0X0V2YWx1YXRlfSwNCisgICAgezB4MmFmZWMyY2MsIChGWF9MUENXU1RSKUwibW92ZUluc3RhbmNlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2V9LAl7MHgyYmY5NGE2MywgKEZYX0xQQ1dTVFIpTCJyZW1vdmVJbnN0YW5jZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2V9LAl7MHgzMDNhZGFmNCwgKEZYX0xQQ1dTVFIpTCJzZXRJbnN0YW5jZXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlc30sDQorICAgIHsweDRkNzZiODllLCAoRlhfTFBDV1NUUilMImFkZEluc3RhbmNlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9BZGRJbnN0YW5jZX0sCXsweGM2NjBkYzhhLCAoRlhfTFBDV1NUUilMImluc2VydEluc3RhbmNlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9JbnNlcnRJbnN0YW5jZX0sCXsweGRkZmQxZWExLCAoRlhfTFBDV1NUUilMIm1ldGFkYXRhIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Rlc2NfTWV0YWRhdGF9LA0KKyAgICB7MHg0NGMzNTJhZCwgKEZYX0xQQ1dTVFIpTCJmb3JtTm9kZXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9Gb3JtTm9kZXN9LAl7MHg0NWVmYjg0NywgKEZYX0xQQ1dTVFIpTCJyZW1lcmdlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVtZXJnZX0sCXsweDY3MTZjZTk3LCAoRlhfTFBDV1NUUilMImV4ZWNJbml0aWFsaXplIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHhhOGEzNWUyNSwgKEZYX0xQQ1dTVFIpTCJyZWNhbGN1bGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX1JlY2FsY3VsYXRlfSwJezB4YzYwMTNjZDMsIChGWF9MUENXU1RSKUwiZXhlY0NhbGN1bGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGV9LAl7MHhlZjhjZTQ4ZiwgKEZYX0xQQ1dTVFIpTCJleGVjVmFsaWRhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjVmFsaWRhdGV9LA0KKyAgICB7MHg2MDQ5MGE4NSwgKEZYX0xQQ1dTVFIpTCJtZXNzYWdlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9NZXNzYWdlfSwJezB4NjBlY2ZjYzksIChGWF9MUENXU1RSKUwidHJhY2VEZWFjdGl2YXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZURlYWN0aXZhdGV9LAl7MHg4NmEwZjRjMCwgKEZYX0xQQ1dTVFIpTCJ0cmFjZUFjdGl2YXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlfSwNCisgICAgezB4OTNlYWMzOWEsIChGWF9MUENXU1RSKUwidHJhY2VFbmFibGVkIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUVuYWJsZWR9LAl7MHhkMTIyN2U2ZiwgKEZYX0xQQ1dTVFIpTCJ0cmFjZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2V9LAl7MHgzNmMwZWUxNCwgKEZYX0xQQ1dTVFIpTCJnZXRBdHRyaWJ1dGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZX0sDQorICAgIHsweDU0NjhlMmEwLCAoRlhfTFBDV1NUUilMInNldEF0dHJpYnV0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfU2V0QXR0cmlidXRlfSwJezB4YWRjNDhkZTIsIChGWF9MUENXU1RSKUwicmVtb3ZlQXR0cmlidXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9SZW1vdmVBdHRyaWJ1dGV9LAl7MHgzODQ4YjNmLCAoRlhfTFBDV1NUUilMIm5leHQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHR9LA0KKyAgICB7MHgxNGUyNWJjOCwgKEZYX0xQQ1dTVFIpTCJjYW5jZWxCYXRjaCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2FuY2VsQmF0Y2h9LAl7MHgzY2UwNWQ2OCwgKEZYX0xQQ1dTVFIpTCJmaXJzdCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRmlyc3R9LAl7MHg2NDllMWU2NSwgKEZYX0xQQ1dTVFIpTCJ1cGRhdGVCYXRjaCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlQmF0Y2h9LA0KKyAgICB7MHg2YTM0MDVkZCwgKEZYX0xQQ1dTVFIpTCJwcmV2aW91cyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUHJldmlvdXN9LAl7MHg3NDgxOGZiMywgKEZYX0xQQ1dTVFIpTCJpc0JPRiIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNCT0Z9LAl7MHg3NGQwN2E3NiwgKEZYX0xQQ1dTVFIpTCJpc0VPRiIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNFT0Z9LA0KKyAgICB7MHg3NjEzY2I2NiwgKEZYX0xQQ1dTVFIpTCJjYW5jZWwiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbH0sCXsweDdiYWNhMmUzLCAoRlhfTFBDV1NUUilMInVwZGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlfSwJezB4OGI5MGUxZjIsIChGWF9MUENXU1RSKUwib3BlbiIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfT3Blbn0sDQorICAgIHsweDljNjQ3MWIzLCAoRlhfTFBDV1NUUilMImRlbGV0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGVsZXRlfSwJezB4YTczMTUwOTMsIChGWF9MUENXU1RSKUwiYWRkTmV3IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9BZGROZXd9LAl7MHhhN2NlNWY4ZCwgKEZYX0xQQ1dTVFIpTCJyZXF1ZXJ5IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXF1ZXJ5fSwNCisgICAgezB4YzczNjg2NzQsIChGWF9MUENXU1RSKUwicmVzeW5jIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXN5bmN9LAl7MHhkOWY0N2YzNiwgKEZYX0xQQ1dTVFIpTCJjbG9zZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2xvc2V9LAl7MHhmNTQ0ODFkNCwgKEZYX0xQQ1dTVFIpTCJsYXN0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9MYXN0fSwNCisgICAgezB4Zjc5NjU0NjAsIChGWF9MUENXU1RSKUwiaGFzRGF0YUNoYW5nZWQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0hhc0RhdGFDaGFuZ2VkfSwJezB4NjI3NWY2YWYsIChGWF9MUENXU1RSKUwiaXRlbSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0l0ZW19LAl7MHg3MDMzYmZkNSwgKEZYX0xQQ1dTVFIpTCJpbnNlcnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JbnNlcnR9LA0KKyAgICB7MHg5Y2FiN2NhZSwgKEZYX0xQQ1dTVFIpTCJyZW1vdmUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19SZW1vdmV9LAl7MHhkYTEyZTUxOCwgKEZYX0xQQ1dTVFIpTCJhcHBlbmQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19BcHBlbmR9LAl7MHhkODkyYTA1NCwgKEZYX0xQQ1dTVFIpTCJuYW1lZEl0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtfSwNCisgICAgezB4YmEyZGQzODYsIChGWF9MUENXU1RSKUwicmVzb2x2ZU5vZGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlfSwJezB4ZTUwOWUyYjksIChGWF9MUENXU1RSKUwicmVzb2x2ZU5vZGVzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZXN9LAl7MHgxYmNhMWViZCwgKEZYX0xQQ1dTVFIpTCJhcHBseVhTTCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXBwbHlYU0x9LA0KKyAgICB7MHgzNmMwZWUxNCwgKEZYX0xQQ1dTVFIpTCJnZXRBdHRyaWJ1dGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEF0dHJpYnV0ZX0sCXsweDU0NjhlMmEwLCAoRlhfTFBDV1NUUilMInNldEF0dHJpYnV0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlfSwJezB4NWVlMDA5OTYsIChGWF9MUENXU1RSKUwic2V0RWxlbWVudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0RWxlbWVudH0sDQorICAgIHsweDkyZGFkYTRmLCAoRlhfTFBDV1NUUilMInNhdmVGaWx0ZXJlZFhNTCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MfSwJezB4OWM0NTY1MDAsIChGWF9MUENXU1RSKUwic2F2ZVhNTCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTH0sCXsweGFiZDMyMDBhLCAoRlhfTFBDV1NUUilMImdldEVsZW1lbnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEVsZW1lbnR9LA0KKyAgICB7MHhiMjY5YzYwZCwgKEZYX0xQQ1dTVFIpTCJpc1Byb3BlcnR5U3BlY2lmaWVkIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc1Byb3BlcnR5U3BlY2lmaWVkfSwJezB4YjUyOGJlOTEsIChGWF9MUENXU1RSKUwibG9hZFhNTCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTG9hZFhNTH0sCXsweGQ5ZjQ2NTkxLCAoRlhfTFBDV1NUUilMImNsb25lIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19DbG9uZX0sDQorICAgIHsweGUwMDZhNzZiLCAoRlhfTFBDV1NUUilMImFzc2lnbk5vZGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0Fzc2lnbk5vZGV9LAl7MHg3MzAzZmNlYSwgKEZYX0xQQ1dTVFIpTCJnZXREZWx0YSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YX0sCXsweGU3NzQyYzlkLCAoRlhfTFBDV1NUUilMImdldERlbHRhcyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YXN9LA0KKyAgICB7MHgzMGZmNmFhZCwgKEZYX0xQQ1dTVFIpTCJjbGVhckVycm9yTGlzdCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NsZWFyRXJyb3JMaXN0fSwJezB4NzEyYzZhZmEsIChGWF9MUENXU1RSKUwiY3JlYXRlTm9kZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NyZWF0ZU5vZGV9LAl7MHg4M2E2NDExZCwgKEZYX0xQQ1dTVFIpTCJpc0NvbXBhdGlibGVOUyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TfSwNCit9Ow0KK2V4dGVybiBjb25zdCBGWF9JTlQzMiBnX2lTb21NZXRob2RDb3VudCA9IHNpemVvZihnX1NvbU1ldGhvZERhdGEpIC8gc2l6ZW9mKFhGQV9NRVRIT0RJTkZPKTsNCitleHRlcm4gY29uc3QgX1hGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIGdfU29tQXR0cmlidXRlRGF0YVtdID0gew0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIzNTQzYTYsIChGWF9MUENXU1RSKUwibWF4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0NWE2ZGFmOCwgKEZYX0xQQ1dTVFIpTCJlb2ZBY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Fb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1ZWM5NThjMCwgKEZYX0xQQ1dTVFIpTCJjdXJzb3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc5OTc1ZjJiLCAoRlhfTFBDV1NUUilMImxvY2tUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTM0MGZmNSwgKEZYX0xQQ1dTVFIpTCJib2ZBY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM1NzYyMTU3LCAoRlhfTFBDV1NUUilMImN1cnNvckxvY2F0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgxZWUyZDI0ZCwgKEZYX0xQQ1dTVFIpTCJpbnN0YW5jZUluZGV4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhjOTkzNzdlLCAoRlhfTFBDV1NUUilMInJlbGF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxYjE5YzEsIChGWF9MUENXU1RSKUwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzMTA2YzNhLCAoRlhfTFBDV1NUUilMImJlZm9yZVRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MTNhMDhiZGIsIChGWF9MUENXU1RSKUwib3ZlcmZsb3dUYXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDE2OTEzNGExLCAoRlhfTFBDV1NUUilMIm92ZXJmbG93TGVhZGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMDkxNDM2NywgKEZYX0xQQ1dTVFIpTCJvdmVyZmxvd1RyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0NTNlYWYzOCwgKEZYX0xQQ1dTVFIpTCJzdGFydE5ldyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjQxMTBhYjUsIChGWF9MUENXU1RSKUwiYm9va2VuZFRyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGI2YjQ0MTcyLCAoRlhfTFBDV1NUUilMImFmdGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWZ0ZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMzYzE0NDJmLCAoRlhfTFBDV1NUUilMImJvb2tlbmRMZWFkZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2IxNTA0NzksIChGWF9MUENXU1RSKUwiYWZ0ZXJUYXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY0ZmZjZTczLCAoRlhfTFBDV1NUUilMImJlZm9yZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0JlZm9yZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIChGWF9MUENXU1RSKUwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0N2NmYTQzYSwgKEZYX0xQQ1dTVFIpTCJhbGxvd05ldXRyYWwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZDgwYiwgKEZYX0xQQ1dTVFIpTCJtYXJrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWFyaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlZDE4MmQxLCAoRlhfTFBDV1NUUilMInNoYXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjg2OTc1YiwgKEZYX0xQQ1dTVFIpTCJzaXplIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU2l6ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YzA1NDc1NSwgKEZYX0xQQ1dTVFIpTCJzdGFydEFuZ2xlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc0Nzg4ZjhiLCAoRlhfTFBDV1NUUilMInN3ZWVwQW5nbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OWQ4MzNkNzUsIChGWF9MUENXU1RSKUwiY2lyY3VsYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDk5NmZhOWIsIChGWF9MUENXU1RSKUwiaGFuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMGU1NDg1ZCwgKEZYX0xQQ1dTVFIpTCJiaW5kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQmluZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjZDdmN2I1NCwgKEZYX0xQQ1dTVFIpTCJmcm9tIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGUyOWQ3OTQsIChGWF9MUENXU1RSKUwic2lnbmF0dXJlVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGUxMWEyY2JjLCAoRlhfTFBDV1NUUilMInBlcm1pc3Npb25zIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDQ1M2VhZjM4LCAoRlhfTFBDV1NUUilMInN0YXJ0TmV3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5ZGNjM2FiMywgKEZYX0xQQ1dTVFIpTCJ0cmFpbGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE2MTE4Yzg5LCAoRlhfTFBDV1NUUilMInRhcmdldFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjOGRhNGRhNywgKEZYX0xQQ1dTVFIpTCJ0YXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjYmNhZjY2ZCwgKEZYX0xQQ1dTVFIpTCJsZWFkZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9MZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmQ1NzRkNTgsIChGWF9MUENXU1RSKUwidGhpcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9YZmFfVGhpcywgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4NGZkYzM0NTQsIChGWF9MUENXU1RSKUwidGltZVN0YW1wIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YjU5OGExZjcsIChGWF9MUENXU1RSKUwidXVpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1V1aWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4Y2ZlYTAyZSwgKEZYX0xQQ1dTVFIpTCJsZWZ0SW5zZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgxMzU2Y2FmOCwgKEZYX0xQQ1dTVFIpTCJib3R0b21JbnNldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjU3NjQ0MzYsIChGWF9MUENXU1RSKUwidG9wSW5zZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhhNjkyNTIxLCAoRlhfTFBDV1NUUilMInJpZ2h0SW5zZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDFlNDU5YjhmLCAoRlhfTFBDV1NUUilMIm5vblJlcHVkaWF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyYmIzZjQ3MCwgKEZYX0xQQ1dTVFIpTCJlbmNpcGhlck9ubHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9FbmNpcGhlck9ubHksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDVmNzYwYjUwLCAoRlhfTFBDV1NUUilMImRpZ2l0YWxTaWduYXR1cmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjlhYTIyOTIsIChGWF9MUENXU1RSKUwiY3JsU2lnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NybFNpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5OGZkNGQ4MSwgKEZYX0xQQ1dTVFIpTCJrZXlBZ3JlZW1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjY0MDRjYiwgKEZYX0xQQ1dTVFIpTCJrZXlFbmNpcGhlcm1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNhNWRjMjdjLCAoRlhfTFBDV1NUUilMImRhdGFFbmNpcGhlcm1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZThmMTE4YTgsIChGWF9MUENXU1RSKUwia2V5Q2VydFNpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGZlYTUzZWM2LCAoRlhfTFBDV1NUUilMImRlY2lwaGVyT25seSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4YjkwZTFmMiwgKEZYX0xQQ1dTVFIpTCJvcGVuIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDk1N2ZhMDA2LCAoRlhfTFBDV1NUUilMImNvbW1pdE9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMTIxMjhiNywgKEZYX0xQQ1dTVFIpTCJ0ZXh0RW50cnkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDIyODJjNzMsIChGWF9MUENXU1RSKUwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGQ0ZjFjNywgKEZYX0xQQ1dTVFIpTCJ0ZXh0SW5kZW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmE4MmQ5OWMsIChGWF9MUENXU1RSKUwibWFyZ2luUmlnaHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUzNDcyOWM5LCAoRlhfTFBDV1NUUilMIm1hcmdpbkxlZnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTczOWQxZmYsIChGWF9MUENXU1RSKUwicmFkaXhPZmZzZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3NzY4MmFjLCAoRlhfTFBDV1NUUilMInByZXNlcnZlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3MzFlMDY2NSwgKEZYX0xQQ1dTVFIpTCJzcGFjZUJlbG93IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdhN2NjMzQxLCAoRlhfTFBDV1NUUilMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDgzNmQ0ZDdjLCAoRlhfTFBDV1NUUilMInRhYkRlZmF1bHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYWJEZWZhdWx0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGZhMDE3OTAsIChGWF9MUENXU1RSKUwidGFiU3RvcHMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDRiMDE5MjEsIChGWF9MUENXU1RSKUwibGluZUhlaWdodCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlMThiNTY1OSwgKEZYX0xQQ1dTVFIpTCJzcGFjZUFib3ZlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDg2MWY4YWYsIChGWF9MUENXU1RSKUwiYWRkUmV2b2NhdGlvbkluZm8iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmI4ZGY1ZCwgKEZYX0xQQ1dTVFIpTCJyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDYxMjhkOGQsIChGWF9MUENXU1RSKUwiYWN0aXZpdHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQzZTM0OWIsIChGWF9MUENXU1RSKUwiZGF0YVJvd0NvdW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyOGUxN2U5MSwgKEZYX0xQQ1dTVFIpTCJkYXRhUHJlcCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzNjUwNTU3ZSwgKEZYX0xQQ1dTVFIpTCJ0ZXh0TG9jYXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzYjU4MjI4NiwgKEZYX0xQQ1dTVFIpTCJtb2R1bGVXaWR0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTI2NjZmMWMsIChGWF9MUENXU1RSKUwicHJpbnRDaGVja0RpZ2l0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTQwNGQ2ZGYsIChGWF9MUENXU1RSKUwibW9kdWxlSGVpZ2h0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWFiMjNiNmMsIChGWF9MUENXU1RSKUwic3RhcnRDaGFyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2M3MzJhNjYsIChGWF9MUENXU1RSKUwidHJ1bmNhdGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhkMTgxZDYxLCAoRlhfTFBDV1NUUilMIndpZGVOYXJyb3dSYXRpbyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywgWEZBX1NDUklQVF9CYXNpY30sCXsweDk5ODAwZDdhLCAoRlhfTFBDV1NUUilMImVycm9yQ29ycmVjdGlvbkxldmVsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRXJyb3JDb3JyZWN0aW9uTGV2ZWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5YTYzZGEzZCwgKEZYX0xQQ1dTVFIpTCJ1cHNNb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFmNzU0NjEzLCAoRlhfTFBDV1NUUilMImNoZWNrc3VtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMDQ1ZmJjNSwgKEZYX0xQQ1dTVFIpTCJjaGFyRW5jb2RpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwMzVjNmIxLCAoRlhfTFBDV1NUUilMImRhdGFDb2x1bW5Db3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQzYzg0ZDI1LCAoRlhfTFBDV1NUUilMInJvd0NvbHVtblJhdGlvIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUm93Q29sdW1uUmF0aW8sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNTdjNTEzYywgKEZYX0xQQ1dTVFIpTCJkYXRhTGVuZ3RoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY1NzVjYTc1LCAoRlhfTFBDV1NUUilMImVuZENoYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9FbmRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI4ZGVlNmU5LCAoRlhfTFBDV1NUUilMImZvcm1hdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2MGQ0YzhiMSwgKEZYX0xQQ1dTVFIpTCJvdXRwdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdXRwdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2YTM5OTkwLCAoRlhfTFBDV1NUUilMImlucHV0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSW5wdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJiNWRmNTFlLCAoRlhfTFBDV1NUUilMImRhdGFEZXNjcmlwdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NmMwZDk2MDAsIChGWF9MUENXU1RSKUwiY3VycmVudFZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5NDI2NDNmMCwgKEZYX0xQQ1dTVFIpTCJzYXZlZFZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzhkYTRkYTcsIChGWF9MUENXU1RSKUwidGFyZ2V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1RhcmdldCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ0Y2M1M2Y4LCAoRlhfTFBDV1NUUilMImhpZ2hsaWdodCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NTE4YzI1LCAoRlhfTFBDV1NUUilMImJyZWFrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQnJlYWssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3MGNlODM1LCAoRlhfTFBDV1NUUilMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkOTk2ZmE5YiwgKEZYX0xQQ1dTVFIpTCJoYW5kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSGFuZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc4LCAoRlhfTFBDV1NUUilMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzksIChGWF9MUENXU1RSKUwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzMWIxOWMxLCAoRlhfTFBDV1NUUilMIm5hbWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MTA1OWVjMTgsIChGWF9MUENXU1RSKUwibGV2ZWwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIsIFhGQV9BVFRSSUJVVEVfTGV2ZWwsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWMwNmUyYjAsIChGWF9MUENXU1RSKUwiY29sU3BhbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIxYWVkLCAoRlhfTFBDV1NUUilMImlkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTA1ZjcyLCAoRlhfTFBDV1NUUilMIndvcmRDaGFyYWN0ZXJDb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNkMTIzYzI2LCAoRlhfTFBDV1NUUilMImh5cGhlbmF0ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDY2NTM5YzQ4LCAoRlhfTFBDV1NUUilMImV4Y2x1ZGVJbml0aWFsQ2FwIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2YTk1Yzk3NiwgKEZYX0xQQ1dTVFIpTCJwdXNoQ2hhcmFjdGVyQ291bnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QdXNoQ2hhcmFjdGVyQ291bnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5ODJiZDg5MiwgKEZYX0xQQ1dTVFIpTCJyZW1haW5DaGFyYWN0ZXJDb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlNWM5NmQ2YSwgKEZYX0xQQ1dTVFIpTCJleGNsdWRlQWxsQ2FwcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4YWYyZTY1NywgKEZYX0xQQ1dTVFIpTCJtYXhDaGFycyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01heENoYXJzLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTUyNjgyYmQsIChGWF9MUENXU1RSKUwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIChGWF9MUENXU1RSKUwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgwY2QzLCAoRlhfTFBDV1NUUilMInVybCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VybCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTY3MTAyNjIsIChGWF9MUENXU1RSKUwiY3JlZGVudGlhbFNlcnZlclBvbGljeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMyYmEwOTIzLCAoRlhfTFBDV1NUUilMInVybFBvbGljeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VybFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ3ZDAzNDkwLCAoRlhfTFBDV1NUUilMImNvbm5lY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzhkYTRkYTcsIChGWF9MUENXU1RSKUwidGFyZ2V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgKEZYX0xQQ1dTVFIpTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3OGJmZjUzMSwgKEZYX0xQQ1dTVFIpTCJudW1iZXJPZkNlbGxzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyLCBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4LCAoRlhfTFBDV1NUUilMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzcsIChGWF9MUENXU1RSKUwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3OCwgKEZYX0xQQ1dTVFIpTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCAoRlhfTFBDV1NUUilMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjI4MmM3MywgKEZYX0xQQ1dTVFIpTCJoQWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFhYmJkN2UwLCAoRlhfTFBDV1NUUilMImRhdGFOb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4MjU4Mzk4NTIsIChGWF9MUENXU1RSKUwiYWNjZXNzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmVlNzY3OGYsIChGWF9MUENXU1RSKUwicm90YXRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUm90YXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4M2IxZGRkMDYsIChGWF9MUENXU1RSKUwiZmlsbENvbG9yIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9GaWxsQ29sb3IsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTRjMzk5ZTMsIChGWF9MUENXU1RSKUwiZm9ybWF0dGVkVmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTcwY2U4MzUsIChGWF9MUENXU1RSKUwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVhM2IzNzVkLCAoRlhfTFBDV1NUUilMImJvcmRlckNvbG9yIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1ZTkzNmVkNiwgKEZYX0xQQ1dTVFIpTCJmb250Q29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZvbnRDb2xvciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2ODI2YzQwOCwgKEZYX0xQQ1dTVFIpTCJwYXJlbnRTdWJmb3JtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1BhcmVudFN1YmZvcm0sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzliNjc0MzQsIChGWF9MUENXU1RSKUwibWFuZGF0b3J5TWVzc2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YTdjYzM0MSwgKEZYX0xQQ1dTVFIpTCJ2QWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YzJmZjZhZSwgKEZYX0xQQ1dTVFIpTCJtYXhIIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZmNmJkLCAoRlhfTFBDV1NUUilMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2QwMjM1NmMsIChGWF9MUENXU1RSKUwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU3YiwgKEZYX0xQQ1dTVFIpTCJtaW5XIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDg1ZmQ2ZmFmLCAoRlhfTFBDV1NUUilMIm1hbmRhdG9yeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlMWMyOTIxLCAoRlhfTFBDV1NUUilMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg5NjRmYjQyZSwgKEZYX0xQQ1dTVFIpTCJmb3JtYXRNZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0Zvcm1hdE1lc3NhZ2UsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTAzY2Y2MjcsIChGWF9MUENXU1RSKUwicmF3VmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTI2ODJiZCwgKEZYX0xQQ1dTVFIpTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjBkZDIwMiwgKEZYX0xQQ1dTVFIpTCJsZW5ndGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfTGVuZ3RoLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGFjMDZlMmIwLCAoRlhfTFBDV1NUUilMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzhmYTM1MCwgKEZYX0xQQ1dTVFIpTCJsb2NhbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMmJkNDBmZCwgKEZYX0xQQ1dTVFIpTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM0ZmVkMDliLCAoRlhfTFBDV1NUUilMImFjY2Vzc0tleSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNhYmZhM2QwLCAoRlhfTFBDV1NUUilMInZhbGlkYXRpb25NZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkY2VjZDY2MywgKEZYX0xQQ1dTVFIpTCJlZGl0VmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRWRpdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGUwN2U1MDYxLCAoRlhfTFBDV1NUUilMInNlbGVjdGVkSW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNjVlMzRiZSwgKEZYX0xQQ1dTVFIpTCJib3JkZXJXaWR0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2OCwgKEZYX0xQQ1dTVFIpTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc3LCAoRlhfTFBDV1NUUilMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzgsIChGWF9MUENXU1RSKUwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OSwgKEZYX0xQQ1dTVFIpTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGUxYzI5MjEsIChGWF9MUENXU1RSKUwicmVsZXZhbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDg0Mzc5OCwgKEZYX0xQQ1dTVFIpTCJmdWxsVGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Z1bGxUZXh0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDFiNmQxY2Y1LCAoRlhfTFBDV1NUUilMInJlZW50ZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZWVudGVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFlNmZmYTlhLCAoRlhfTFBDV1NUUilMInByZXZDb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1ByZXZDb250ZW50VHlwZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNWEzYzIwNiwgKEZYX0xQQ1dTVFIpTCJzb2FwRmF1bHRTdHJpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRTdHJpbmcsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmUwMGMwMDcsIChGWF9MUENXU1RSKUwibmV3Q29udGVudFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0NTcwNTAwZiwgKEZYX0xQQ1dTVFIpTCJtb2RpZmllciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX01vZGlmaWVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUwZTJlMzNiLCAoRlhfTFBDV1NUUilMInNlbEVuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NlbEVuZCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1N2RlODdjMiwgKEZYX0xQQ1dTVFIpTCJwcmV2VGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1ByZXZUZXh0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZlYTA0ZTBhLCAoRlhfTFBDV1NUUilMInNvYXBGYXVsdENvZGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRDb2RlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDZmNjU1NmNmLCAoRlhfTFBDV1NUUilMIm5ld1RleHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdUZXh0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDg5MWY0NjA2LCAoRlhfTFBDV1NUUilMImNoYW5nZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NoYW5nZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZmEzYzE5ZSwgKEZYX0xQQ1dTVFIpTCJzaGlmdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NoaWZ0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE5ZDliMmUxLCAoRlhfTFBDV1NUUilMImtleURvd24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJmYzg5ZGIyLCAoRlhfTFBDV1NUUilMInNlbFN0YXJ0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2VsU3RhcnQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzMyYTU4MTIsIChGWF9MUENXU1RSKUwiY29tbWl0S2V5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCAoRlhfTFBDV1NUUilMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1RhcmdldCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTJlMzUxNCwgKEZYX0xQQ1dTVFIpTCJjYXAiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9DYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUzOTJlYTU4LCAoRlhfTFBDV1NUUilMInN0cm9rZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3MGNlODM1LCAoRlhfTFBDV1NUUilMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5NDQ0NmRjYywgKEZYX0xQQ1dTVFIpTCJ0aGlja25lc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWVjOGFiMmMsIChGWF9MUENXU1RSKUwicmF0ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2IyOTYzMGEsIChGWF9MUENXU1RSKUwic291cmNlQmVsb3ciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sCXsweDhmYzM2YzBhLCAoRlhfTFBDV1NUUilMIm91dHB1dEJlbG93IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlOTk2YjJmZSwgKEZYX0xQQ1dTVFIpTCJzb3VyY2VBYm92ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NvdXJjZUFib3ZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjgsIChGWF9MUENXU1RSKUwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3NywgKEZYX0xQQ1dTVFIpTCJ3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sCXsweDc4LCAoRlhfTFBDV1NUUilMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzksIChGWF9MUENXU1RSKUwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMjgyYzczLCAoRlhfTFBDV1NUUilMImhBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjIzMzMyZiwgKEZYX0xQQ1dTVFIpTCJlcnJvclRleHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxYWJiZDdlMCwgKEZYX0xQQ1dTVFIpTCJkYXRhTm9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGF0YU5vZGUsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sCXsweDI1ODM5ODUyLCAoRlhfTFBDV1NUUilMImFjY2VzcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX1NDUklQVF9CYXNpY30sCXsweDNiMWRkZDA2LCAoRlhfTFBDV1NUUilMImZpbGxDb2xvciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MGNlODM1LCAoRlhfTFBDV1NUUilMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1YTNiMzc1ZCwgKEZYX0xQQ1dTVFIpTCJib3JkZXJDb2xvciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyQ29sb3IsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzliNjc0MzQsIChGWF9MUENXU1RSKUwibWFuZGF0b3J5TWVzc2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTdjYzM0MSwgKEZYX0xQQ1dTVFIpTCJ2QWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YzJmZjZhZSwgKEZYX0xQQ1dTVFIpTCJtYXhIIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDdjMmZmNmJkLCAoRlhfTFBDV1NUUilMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2QwMjM1NmMsIChGWF9MUENXU1RSKUwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU3YiwgKEZYX0xQQ1dTVFIpTCJtaW5XIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sCXsweDdlN2U4NDVlLCAoRlhfTFBDV1NUUilMImxheW91dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xheW91dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDg0NjU5OWY4LCAoRlhfTFBDV1NUUilMInRyYW5zaWVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDg1ZmQ2ZmFmLCAoRlhfTFBDV1NUUilMIm1hbmRhdG9yeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlMWMyOTIxLCAoRlhfTFBDV1NUUilMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhMDNjZjYyNywgKEZYX0xQQ1dTVFIpTCJyYXdWYWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFjMDZlMmIwLCAoRlhfTFBDV1NUUilMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMmJkNDBmZCwgKEZYX0xQQ1dTVFIpTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM0ZmVkMDliLCAoRlhfTFBDV1NUUilMImFjY2Vzc0tleSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNhYmZhM2QwLCAoRlhfTFBDV1NUUilMInZhbGlkYXRpb25NZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNjVlMzRiZSwgKEZYX0xQQ1dTVFIpTCJib3JkZXJXaWR0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZWRhOTAxN2EsIChGWF9MUENXU1RSKUwic2NvcGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDQ3ZDAzNDkwLCAoRlhfTFBDV1NUUilMImNvbm5lY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NmNmYTgyOGEsIChGWF9MUENXU1RSKUwicnVuQXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGExYjBkMmY1LCAoRlhfTFBDV1NUUilMImV4ZWN1dGVUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU2Zjk5NDg3LCAoRlhfTFBDV1NUUilMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDQyZmVkMWZkLCAoRlhfTFBDV1NUUilMImNvbnRlbnRUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NGZhNzIyYywgKEZYX0xQQ1dTVFIpTCJ0cmFuc2ZlckVuY29kaW5nIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkMTcxYjI0MCwgKEZYX0xQQ1dTVFIpTCJhc3BlY3QiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Bc3BlY3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZGI1NWZlYzUsIChGWF9MUENXU1RSKUwiaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdmNmZkM2Q3LCAoRlhfTFBDV1NUUilMInNlcnZlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NlcnZlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NGI4YmM4NDAsIChGWF9MUENXU1RSKUwiZnJhY0RpZ2l0cyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTI2ODJiZCwgKEZYX0xQQ1dTVFIpTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZGU3ZjkyYmEsIChGWF9MUENXU1RSKUwibGVhZERpZ2l0cyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2OCwgKEZYX0xQQ1dTVFIpTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc3LCAoRlhfTFBDV1NUUilMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzgsIChGWF9MUENXU1RSKUwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OSwgKEZYX0xQQ1dTVFIpTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDIyODJjNzMsIChGWF9MUENXU1RSKUwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxNDE0ZDQzMSwgKEZYX0xQQ1dTVFIpTCJhbGxvd01hY3JvIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywgWEZBX1NDUklQVF9CYXNpY30sCXsweDE1MTdkZmExLCAoRlhfTFBDV1NUUilMImNvbHVtbldpZHRocyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbHVtbldpZHRocywgWEZBX1NDUklQVF9CYXNpY30sCXsweDFhYmJkN2UwLCAoRlhfTFBDV1NUUilMImRhdGFOb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4MWVlMmQyNGQsIChGWF9MUENXU1RSKUwiaW5zdGFuY2VJbmRleCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNTgzOTg1MiwgKEZYX0xQQ1dTVFIpTCJhY2Nlc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BY2Nlc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzYjFkZGQwNiwgKEZYX0xQQ1dTVFIpTCJmaWxsQ29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZpbGxDb2xvciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgKEZYX0xQQ1dTVFIpTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWEzYjM3NWQsIChGWF9MUENXU1RSKUwiYm9yZGVyQ29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDdhN2NjMzQxLCAoRlhfTFBDV1NUUilMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZmNmFlLCAoRlhfTFBDV1NUUilMIm1heEgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2MyZmY2YmQsIChGWF9MUENXU1RSKUwibWF4VyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01heFcsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU2YywgKEZYX0xQQ1dTVFIpTCJtaW5IIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTdiLCAoRlhfTFBDV1NUUilMIm1pblciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2U3ZTg0NWUsIChGWF9MUENXU1RSKUwibGF5b3V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGUxYzI5MjEsIChGWF9MUENXU1RSKUwicmVsZXZhbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDljYzE3ZDc1LCAoRlhfTFBDV1NUUilMIm1lcmdlTW9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDlmM2U5NTEwLCAoRlhfTFBDV1NUUilMImluc3RhbmNlTWFuYWdlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0luc3RhbmNlTWFuYWdlciwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4YWMwNmUyYjAsIChGWF9MUENXU1RSKUwiY29sU3BhbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjOGZhMzUwLCAoRlhfTFBDV1NUUilMImxvY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0xvY2FsZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMmJkNDBmZCwgKEZYX0xQQ1dTVFIpTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNhYmZhM2QwLCAoRlhfTFBDV1NUUilMInZhbGlkYXRpb25NZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlNGMzYTVlNSwgKEZYX0xQQ1dTVFIpTCJyZXN0b3JlU3RhdGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZXN0b3JlU3RhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlZGE5MDE3YSwgKEZYX0xQQ1dTVFIpTCJzY29wZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjY1ZTM0YmUsIChGWF9MUENXU1RSKUwiYm9yZGVyV2lkdGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlcldpZHRoLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVhNTBlOWU2LCAoRlhfTFBDV1NUUilMInZlcnNpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSGFuZGxlcl9WZXJzaW9uLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NDEwN2VkLCAoRlhfTFBDV1NUUilMImZveGl0QXBwVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdEFwcFR5cGUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX05hbWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjZjMWFlOSwgKEZYX0xQQ1dTVFIpTCJ2YWxpZGF0aW9uc0VuYWJsZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDE0ZDA0NTAyLCAoRlhfTFBDV1NUUilMInRpdGxlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1RpdGxlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDE5M2FmZThiLCAoRlhfTFBDV1NUUilMImZveGl0TmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdE5hbWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzkyYWU0NDUsIChGWF9MUENXU1RSKUwicGxhdGZvcm0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGxhdGZvcm0sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWE1MGU5ZTYsIChGWF9MUENXU1RSKUwidmVyc2lvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WZXJzaW9uLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY2Y2IxZWVkLCAoRlhfTFBDV1NUUilMInZhcmlhdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYXJpYXRpb24sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzcxN2NiYzQsIChGWF9MUENXU1RSKUwibGFuZ3VhZ2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTGFuZ3VhZ2UsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ODY2OTg5NjMsIChGWF9MUENXU1RSKUwiYXBwVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9BcHBUeXBlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk0ZmY5ZThkLCAoRlhfTFBDV1NUUilMImNhbGN1bGF0aW9uc0VuYWJsZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ2FsY3VsYXRpb25zRW5hYmxlZCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiY2Q0NDk0MCwgKEZYX0xQQ1dTVFIpTCJjdXJyZW50UGFnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50UGFnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNDI4Njg3MCwgKEZYX0xQQ1dTVFIpTCJmb3hpdFZlcnNpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRWZXJzaW9uLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ1OTJiOTIwLCAoRlhfTFBDV1NUUilMIm51bVBhZ2VzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX051bVBhZ2VzLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNGQ4NTE2NywgKEZYX0xQQ1dTVFIpTCJ0aW1lb3V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDlmZDdjNSwgKEZYX0xQQ1dTVFIpTCJtb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDlmZDdjNSwgKEZYX0xQQ1dTVFIpTCJtb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1Ym1pdEZvcm1hdF9Nb2RlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgKEZYX0xQQ1dTVFIpTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjAzOGM5YjIsIChGWF9MUENXU1RSKUwicm9sZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JvbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIChGWF9MUENXU1RSKUwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZmNlZjg2YjUsIChGWF9MUENXU1RSKUwicmVhZHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlYWR5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1MzkyZWE1OCwgKEZYX0xQQ1dTVFIpTCJzdHJva2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TdHJva2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NzBjZTgzNSwgKEZYX0xQQ1dTVFIpTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2I5NWU2NjEsIChGWF9MUENXU1RSKUwiaW52ZXJ0ZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDk0NDQ2ZGNjLCAoRlhfTFBDV1NUUilMInRoaWNrbmVzcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZThkZGRmNTAsIChGWF9MUENXU1RSKUwiam9pbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0pvaW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlOTQ4YjlhOCwgKEZYX0xQQ1dTVFIpTCJyYWRpdXMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SYWRpdXMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YWJmYTZjNGYsIChGWF9MUENXU1RSKUwiY1NwYWNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4Mzg0OGIzZiwgKEZYX0xQQ1dTVFIpTCJuZXh0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmV4dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NmEzNDA1ZGQsIChGWF9MUENXU1RSKUwicHJldmlvdXMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QcmV2aW91cywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNTk1NDMsIChGWF9MUENXU1RSKUwiaW50YWN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSW50YWN0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNjhiN2VjMSwgKEZYX0xQQ1dTVFIpTCJjb21tYW5kVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJkZTlhYmRhLCAoRlhfTFBDV1NUUilMImRhdGEiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1YjcwN2EzNSwgKEZYX0xQQ1dTVFIpTCJzY3JpcHRUZXN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDZiNmRkY2ZiLCAoRlhfTFBDV1NUUilMIm51bGxUZXN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTY0YjExMjksIChGWF9MUENXU1RSKUwiZm9ybWF0VGVzdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCAoRlhfTFBDV1NUUilMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhjOTkzNzdlLCAoRlhfTFBDV1NUUilMInJlbGF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDZlMjdmMWQsIChGWF9MUENXU1RSKUwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjUzNjMsIChGWF9MUENXU1RSKUwidG8iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY2NjQyZjhmLCAoRlhfTFBDV1NUUilMImZvcmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0ZvcmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjZDdmN2I1NCwgKEZYX0xQQ1dTVFIpTCJmcm9tIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyYjVkZjUxZSwgKEZYX0xQQ1dTVFIpTCJkYXRhRGVzY3JpcHRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYjhkZjVkLCAoRlhfTFBDV1NUUilMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjI2Y2E4ZjEsIChGWF9MUENXU1RSKUwib3BlcmF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCAoRlhfTFBDV1NUUilMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCAoRlhfTFBDV1NUUilMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmYjY3MTg1LCAoRlhfTFBDV1NUUilMInJlY29yZHNCZWZvcmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQmVmb3JlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDIxZDVkZmNiLCAoRlhfTFBDV1NUUilMImN1cnJlbnRSZWNvcmROdW1iZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19DdXJyZW50UmVjb3JkTnVtYmVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxMmFmMDQ0LCAoRlhfTFBDV1NUUilMInJlY29yZHNBZnRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNBZnRlciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2YWFiMzdjYiwgKEZYX0xQQ1dTVFIpTCJpc0RlZmluZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc0RlZmluZWQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0MmZlZDFmZCwgKEZYX0xQQ1dTVFIpTCJjb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmNmYTgyOGEsIChGWF9MUENXU1RSKUwicnVuQXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGEwMjFiNzM4LCAoRlhfTFBDV1NUUilMInN0YXRlbGVzcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TY3JpcHRfU3RhdGVsZXNzLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGFkYzRjNzdiLCAoRlhfTFBDV1NUUilMImJpbmRpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTBjYzQ3MSwgKEZYX0xQQ1dTVFIpTCJwYXNzd29yZENoYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGU2Zjk5NDg3LCAoRlhfTFBDV1NUUilMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGU2Zjk5NDg3LCAoRlhfTFBDV1NUUilMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgxNGEzMmQ1MiwgKEZYX0xQQ1dTVFIpTCJwYWdlUG9zaXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4MzQwZWE2NiwgKEZYX0xQQ1dTVFIpTCJvZGRPckV2ZW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTg1ZTc0ZjMsIChGWF9MUENXU1RSKUwiaW5pdGlhbE51bWJlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlOWJhNDcyLCAoRlhfTFBDV1NUUilMIm51bWJlcmVkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTnVtYmVyZWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNzA3OThjMiwgKEZYX0xQQ1dTVFIpTCJibGFua09yTm90QmxhbmsiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDM0YWUxMDNjLCAoRlhfTFBDV1NUUilMInJlc2VydmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZXNlcnZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIChGWF9MUENXU1RSKUwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjIwMDkzMzksIChGWF9MUENXU1RSKUwicGxhY2VtZW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUGxhY2VtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0MmZlZDFmZCwgKEZYX0xQQ1dTVFIpTCJjb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTRmYTcyMmMsIChGWF9MUENXU1RSKUwidHJhbnNmZXJFbmNvZGluZyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgKEZYX0xQQ1dTVFIpTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM0NTQ3YTA4LCAoRlhfTFBDV1NUUilMIm1heExlbmd0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01heExlbmd0aCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZGI1NWZlYzUsIChGWF9MUENXU1RSKUwiaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyOTQxOGJiNywgKEZYX0xQQ1dTVFIpTCJhYmJyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWJiciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY1MzFiMDU5LCAoRlhfTFBDV1NUUilMIndyaXRpbmdTY3JpcHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Xcml0aW5nU2NyaXB0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxYjhkY2UzZSwgKEZYX0xQQ1dTVFIpTCJhY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTI2ODJiZCwgKEZYX0xQQ1dTVFIpTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OWRjYzNhYjMsIChGWF9MUENXU1RSKUwidHJhaWxlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCAoRlhfTFBDV1NUUilMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNiY2FmNjZkLCAoRlhfTFBDV1NUUilMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxYjE5YzEsIChGWF9MUENXU1RSKUwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGIzNTQzYTYsIChGWF9MUENXU1RSKUwibWF4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YjM1NmNhNCwgKEZYX0xQQ1dTVFIpTCJtaW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbiwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2ZjU0NGQ0OSwgKEZYX0xQQ1dTVFIpTCJjb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQ291bnQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjUzNjMsIChGWF9MUENXU1RSKUwidG8iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sCXsweGEwOTMzOTU0LCAoRlhfTFBDV1NUUilMInVuaWNvZGVSYW5nZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4Y2Q3ZjdiNTQsIChGWF9MUENXU1RSKUwiZnJvbSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDRlZjNkMDJjLCAoRlhfTFBDV1NUUilMIm9yaWVudGF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2NWUzMGM2NywgKEZYX0xQQ1dTVFIpTCJpbWFnaW5nQkJveCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OTA0MWQ0YjAsIChGWF9MUENXU1RSKUwic2hvcnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TaG9ydCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTM0OWQwNDQsIChGWF9MUENXU1RSKUwic3RvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TdG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjRhZmIwLCAoRlhfTFBDV1NUUilMImxvbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb25nLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWNlNjE5NSwgKEZYX0xQQ1dTVFIpTCJ2U2Nyb2xsUG9saWN5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWVmM2E2NGEsIChGWF9MUENXU1RSKUwiYWxsb3dSaWNoVGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1YTMyZTQ5MywgKEZYX0xQQ1dTVFIpTCJtdWx0aUxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU2Zjk5NDg3LCAoRlhfTFBDV1NUUilMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNTI0ODJlMCwgKEZYX0xQQ1dTVFIpTCJtYXhFbnRyaWVzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4RW50cmllcywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MmZlZDFmZCwgKEZYX0xQQ1dTVFIpTCJjb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ODg1NTgwNWYsIChGWF9MUENXU1RSKUwiY29udGFpbnMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCAoRlhfTFBDV1NUUilMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTM3MmFlOTcsIChGWF9MUENXU1RSKUwiaXNOdWxsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0lzTnVsbCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyYjVkZjUxZSwgKEZYX0xQQ1dTVFIpTCJkYXRhRGVzY3JpcHRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIChGWF9MUENXU1RSKUwicmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyMjZjYThmMSwgKEZYX0xQQ1dTVFIpTCJvcGVyYXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCAoRlhfTFBDV1NUUilMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYjhkZjVkLCAoRlhfTFBDV1NUUilMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NDJmZWQxZmQsIChGWF9MUENXU1RSKUwiY29udGVudFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU0ZmE3MjJjLCAoRlhfTFBDV1NUUilMInRyYW5zZmVyRW5jb2RpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmMTk3ODQ0ZCwgKEZYX0xQQ1dTVFIpTCJtYXRjaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ5OTZmYTliLCAoRlhfTFBDV1NUUilMImhhbmQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjFhZWQsIChGWF9MUENXU1RSKUwiaWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxYjE5YzEsIChGWF9MUENXU1RSKUwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDZlMjdmMWQsIChGWF9MUENXU1RSKUwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyOGRlZTZlOSwgKEZYX0xQQ1dTVFIpTCJmb3JtYXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRW5jcnlwdF9Gb3JtYXQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDY4LCAoRlhfTFBDV1NUUilMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzcsIChGWF9MUENXU1RSKUwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OCwgKEZYX0xQQ1dTVFIpTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc5LCAoRlhfTFBDV1NUUilMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjI4MmM3MywgKEZYX0xQQ1dTVFIpTCJoQWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJlZTc2NzhmLCAoRlhfTFBDV1NUUilMInJvdGF0ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JvdGF0ZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3MGNlODM1LCAoRlhfTFBDV1NUUilMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTdjYzM0MSwgKEZYX0xQQ1dTVFIpTCJ2QWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YzJmZjZhZSwgKEZYX0xQQ1dTVFIpTCJtYXhIIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDdjMmZmNmJkLCAoRlhfTFBDV1NUUilMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2QwMjM1NmMsIChGWF9MUENXU1RSKUwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU3YiwgKEZYX0xQQ1dTVFIpTCJtaW5XIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlMWMyOTIxLCAoRlhfTFBDV1NUUilMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhMDNjZjYyNywgKEZYX0xQQ1dTVFIpTCJyYXdWYWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFjMDZlMmIwLCAoRlhfTFBDV1NUUilMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzhmYTM1MCwgKEZYX0xQQ1dTVFIpTCJsb2NhbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMmJkNDBmZCwgKEZYX0xQQ1dTVFIpTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDM5Y2RiMGEyLCAoRlhfTFBDV1NUUilMInByaW9yaXR5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJpb3JpdHksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGViNTExYjU0LCAoRlhfTFBDV1NUUilMImRpc2FibGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EaXNhYmxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCAoRlhfTFBDV1NUUilMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyMWFlZCwgKEZYX0xQQ1dTVFIpTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgKEZYX0xQQ1dTVFIpTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NzBjZTgzNSwgKEZYX0xQQ1dTVFIpTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYjBhYzksIChGWF9MUENXU1RSKUwibGluZVRocm91Z2giLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJjMWM3ZjEsIChGWF9MUENXU1RSKUwidHlwZWZhY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhjNzRhZTksIChGWF9MUENXU1RSKUwiZm9udEhvcml6b250YWxTY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ZvbnRIb3Jpem9udGFsU2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJjZDc5MDMzLCAoRlhfTFBDV1NUUilMImtlcm5pbmdNb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzYTAyNzNhNiwgKEZYX0xQQ1dTVFIpTCJ1bmRlcmxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0ODczYzYwMSwgKEZYX0xQQ1dTVFIpTCJiYXNlbGluZVNoaWZ0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDRiMzE5NzY3LCAoRlhfTFBDV1NUUilMIm92ZXJsaW5lUGVyaW9kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3OTU0MzA1NSwgKEZYX0xQQ1dTVFIpTCJsZXR0ZXJTcGFjaW5nIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlYzYyMDRjLCAoRlhfTFBDV1NUUilMImxpbmVUaHJvdWdoUGVyaW9kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg5MDdjNzcxOSwgKEZYX0xQQ1dTVFIpTCJmb250VmVydGljYWxTY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTY4Njk3NWIsIChGWF9MUENXU1RSKUwic2l6ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiNWU0OWJmMiwgKEZYX0xQQ1dTVFIpTCJwb3N0dXJlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmQ2ZTFkODgsIChGWF9MUENXU1RSKUwid2VpZ2h0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmQ5NmEwZTksIChGWF9MUENXU1RSKUwidW5kZXJsaW5lUGVyaW9kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzBlYzlmYTQsIChGWF9MUENXU1RSKUwib3ZlcmxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdmVybGluZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFmNzU0NjEzLCAoRlhfTFBDV1NUUilMImNoZWNrc3VtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCAoRlhfTFBDV1NUUilMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDZlMjdmMWQsIChGWF9MUENXU1RSKUwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgKEZYX0xQQ1dTVFIpTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlYTcwOTBhMCwgKEZYX0xQQ1dTVFIpTCJvdmVycmlkZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OWRjYzNhYjMsIChGWF9MUENXU1RSKUwidHJhaWxlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNiY2FmNjZkLCAoRlhfTFBDV1NUUilMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjBhNjFlZGQsIChGWF9MUENXU1RSKUwiY29kZVR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGIzNzNhODYyLCAoRlhfTFBDV1NUUilMImFyY2hpdmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BcmNoaXZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlMWEyNmI1NiwgKEZYX0xQQ1dTVFIpTCJjb2RlQmFzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZWIwOTEwMDMsIChGWF9MUENXU1RSKUwiY2xhc3NJZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NsYXNzSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0N2QwMzQ5MCwgKEZYX0xQQ1dTVFIpTCJjb25uZWN0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMzOWE4OGJkLCAoRlhfTFBDV1NUUilMImxhYmVsUmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNTBmOTAzYSwgKEZYX0xQQ1dTVFIpTCJ2YWx1ZVJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGVhNzA5MGEwLCAoRlhfTFBDV1NUUilMIm92ZXJyaWRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeHRyYXNfVHlwZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmI4ZGY1ZCwgKEZYX0xQQ1dTVFIpTCJyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDI0ZDg1MTY3LCAoRlhfTFBDV1NUUilMInRpbWVvdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UaW1lb3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDdkMDM0OTAsIChGWF9MUENXU1RSKUwiY29ubmVjdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NTJkOWFkNSwgKEZYX0xQQ1dTVFIpTCJ1c2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzYWdlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjODYwZjMwYSwgKEZYX0xQQ1dTVFIpTCJkZWxheWVkT3BlbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDI4ZGVlNmU5LCAoRlhfTFBDV1NUUilMImZvcm1hdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDgyNGYyMWI3LCAoRlhfTFBDV1NUUilMImVtYmVkUERGIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCAoRlhfTFBDV1NUUilMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGRjNzU2NzZjLCAoRlhfTFBDV1NUUilMInRleHRFbmNvZGluZyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY4ODllNzQ3LCAoRlhfTFBDV1NUUilMInhkcENvbnRlbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDk3YmU5MWIsIChGWF9MUENXU1RSKUwiY29udGVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfQ29udGVudCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCAoRlhfTFBDV1NUUilMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NDE1NmVlM2YsIChGWF9MUENXU1RSKUwiZGVsaW1pdGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMWFlZCwgKEZYX0xQQ1dTVFIpTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYjhkZjVkLCAoRlhfTFBDV1NUUilMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjFhZWQsIChGWF9MUENXU1RSKUwiaWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIChGWF9MUENXU1RSKUwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDUzZWFmMzgsIChGWF9MUENXU1RSKUwic3RhcnROZXciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sCXsweDlkY2MzYWIzLCAoRlhfTFBDV1NUUilMInRyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTYxMThjODksIChGWF9MUENXU1RSKUwidGFyZ2V0VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCAoRlhfTFBDV1NUUilMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNiY2FmNjZkLCAoRlhfTFBDV1NUUilMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YWJlZjM3ZTMsIChGWF9MUENXU1RSKUwic2xvcGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TbG9wZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCAoRlhfTFBDV1NUUilMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDk5NmZhOWIsIChGWF9MUENXU1RSKUwiaGFuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjBkZDIwMiwgKEZYX0xQQ1dTVFIpTCJsZW5ndGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjAxNDYsIChGWF9MUENXU1RSKUwiZGIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RiLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIChGWF9MUENXU1RSKUwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMzU0M2E2LCAoRlhfTFBDV1NUUilMIm1heCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NYXgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjM1NmNhNCwgKEZYX0xQQ1dTVFIpTCJtaW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWluLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIChGWF9MUENXU1RSKUwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2QwYjVmY2EsIChGWF9MUENXU1RSKUwiaW5pdGlhbCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0luaXRpYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Mjk0MThiYjcsIChGWF9MUENXU1RSKUwiYWJiciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FiYnIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCAoRlhfTFBDV1NUUilMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIChGWF9MUENXU1RSKUwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIChGWF9MUENXU1RSKUwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgKEZYX0xQQ1dTVFIpTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIChGWF9MUENXU1RSKUwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgKEZYX0xQQ1dTVFIpTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCAoRlhfTFBDV1NUUilMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIChGWF9MUENXU1RSKUwicmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgKEZYX0xQQ1dTVFIpTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NzBjZTgzNSwgKEZYX0xQQ1dTVFIpTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTViNDEwY2YsIChGWF9MUENXU1RSKUwic2F2ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NhdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgKEZYX0xQQ1dTVFIpTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGIyYzgwODU3LCAoRlhfTFBDV1NUUilMImNsYXNzTmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX09iamVjdDo6U2NyaXB0X09iamVjdENsYXNzX0NsYXNzTmFtZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjBkZDIwMiwgKEZYX0xQQ1dTVFIpTCJsZW5ndGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgKEZYX0xQQ1dTVFIpTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDlmOWQwZjksIChGWF9MUENXU1RSKUwiYWxsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19BbGwsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDRkZjE1NjU5LCAoRlhfTFBDV1NUUilMIm5vZGVzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19Ob2RlcywgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4NzhhOGQ2Y2YsIChGWF9MUENXU1RSKUwiY2xhc3NBbGwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzQWxsLCAtMSwgWEZBX1NDUklQVF9PYmplY3R9LAl7MHhjYWQ2ZDhjYSwgKEZYX0xQQ1dTVFIpTCJwYXJlbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1BhcmVudCwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4ZDU2NzljNzgsIChGWF9MUENXU1RSKUwiaW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0luZGV4LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGRiNWI0YmNlLCAoRlhfTFBDV1NUUilMImNsYXNzSW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzSW5kZXgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTQ5ODlhZGYsIChGWF9MUENXU1RSKUwic29tRXhwcmVzc2lvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbiwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMWFlZCwgKEZYX0xQQ1dTVFIpTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjM0YTEsIChGWF9MUENXU1RSKUwibnMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX05zLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUwZDFhOWQxLCAoRlhfTFBDV1NUUilMIm1vZGVsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Nb2RlbCwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4YWNiNDgyM2YsIChGWF9MUENXU1RSKUwiaXNDb250YWluZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGUzNzJhZTk3LCAoRlhfTFBDV1NUUilMImlzTnVsbCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGZlNjEyYTViLCAoRlhfTFBDV1NUUilMIm9uZU9mQ2hpbGQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX09uZU9mQ2hpbGQsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDk3YzFjNjUsIChGWF9MUENXU1RSKUwiY29udGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sCXsweDU4YmUyODcwLCAoRlhfTFBDV1NUUilMImFsaWFzTm9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0FsaWFzTm9kZSwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4YTUyNjgyYmQsIChGWF9MUENXU1RSKUwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIChGWF9MUENXU1RSKUwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KK307DQorZXh0ZXJuIGNvbnN0IEZYX0lOVDMyIGdfaVNvbUF0dHJpYnV0ZUNvdW50ID0gc2l6ZW9mKGdfU29tQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4ZjE3MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwCkBAIC0wLDAgKzEsNjM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9iYXNpY19pbXAuaCINCitleHRlcm4gY29uc3QgWEZBX1BBQ0tFVElORk8gZ19YRkFQYWNrZXREYXRhW107DQorZXh0ZXJuIGNvbnN0IEZYX0lOVDMyIGdfaVhGQVBhY2tldENvdW50Ow0KK2V4dGVybiBjb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8gZ19YRkFFbnVtRGF0YVtdOw0KK2V4dGVybiBjb25zdCBGWF9JTlQzMiBnX2lYRkFFbnVtQ291bnQ7DQorZXh0ZXJuIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPIGdfWEZBQXR0cmlidXRlRGF0YVtdOw0KK2V4dGVybiBjb25zdCBGWF9JTlQzMiBnX2lYRkFBdHRyaWJ1dGVDb3VudDsNCitleHRlcm4gY29uc3QgWEZBX0VMRU1FTlRJTkZPIGdfWEZBRWxlbWVudERhdGFbXTsNCitleHRlcm4gY29uc3QgRlhfSU5UMzIgZ19pWEZBRWxlbWVudENvdW50Ow0KK2V4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRDaGlsZHJlbkluZGV4W107DQorZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19YRkFFbGVtZW50Q2hpbGRyZW5EYXRhW107DQorZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USElFUkFSQ0hZIGdfWEZBRWxlbWVudEF0dHJpYnV0ZUluZGV4W107DQorZXh0ZXJuIGNvbnN0IEZYX0JZVEUgZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YVtdOw0KK2V4dGVybiBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzW107DQorZXh0ZXJuIGNvbnN0IEZYX0lOVDMyIGdfaVhGQU5vdHN1cmVDb3VudDsNCitleHRlcm4gY29uc3QgWEZBX0VMRU1FTlRISUVSQVJDSFkgZ19YRkFFbGVtZW50UHJvcGVydHlJbmRleFtdOw0KK2V4dGVybiBjb25zdCBYRkFfUFJPUEVSVFkgZ19YRkFFbGVtZW50UHJvcGVydHlEYXRhW107DQorZXh0ZXJuIGNvbnN0IFhGQV9TQ1JJUFRISUVSQVJDSFkgZ19YRkFTY3JpcHRJbmRleFtdOw0KK2V4dGVybiBjb25zdCBYRkFfTUVUSE9ESU5GTyBnX1NvbU1ldGhvZERhdGFbXTsNCitleHRlcm4gY29uc3QgRlhfSU5UMzIgZ19pU29tTWV0aG9kQ291bnQ7DQorZXh0ZXJuIGNvbnN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIGdfU29tQXR0cmlidXRlRGF0YVtdOw0KK2V4dGVybiBjb25zdCBGWF9JTlQzMiBnX2lTb21BdHRyaWJ1dGVDb3VudDsNCitYRkFfTFBDUEFDS0VUSU5GTyBYRkFfR2V0UGFja2V0QnlOYW1lKEZYX1dTVFIgd3NOYW1lKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfVUlOVDMyIHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQVBhY2tldENvdW50IC0gMTsNCisgICAgZG8gew0KKyAgICAgICAgRlhfSU5UMzIgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBYRkFfTFBDUEFDS0VUSU5GTyBwSW5mbyA9IGdfWEZBUGFja2V0RGF0YSArIGlNaWQ7DQorICAgICAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK1hGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeUlEKEZYX0RXT1JEIGR3UGFja2V0KQ0KK3sNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQVBhY2tldENvdW50IC0gMTsNCisgICAgZG8gew0KKyAgICAgICAgRlhfSU5UMzIgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBGWF9EV09SRCBkd0ZpbmQgPSAoZ19YRkFQYWNrZXREYXRhICsgaU1pZCktPmVOYW1lOw0KKyAgICAgICAgaWYgKGR3UGFja2V0ID09IGR3RmluZCkgew0KKyAgICAgICAgICAgIHJldHVybiBnX1hGQVBhY2tldERhdGEgKyBpTWlkOw0KKyAgICAgICAgfSBlbHNlIGlmIChkd1BhY2tldCA8IGR3RmluZCkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK1hGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZShGWF9XU1RSIHdzTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX1VJTlQzMiB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFFbnVtQ291bnQgLSAxOw0KKyAgICBkbyB7DQorICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIFhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBwSW5mbyA9IGdfWEZBRW51bURhdGEgKyBpTWlkOw0KKyAgICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgICAgIHJldHVybiBwSW5mbzsNCisgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKQ0KK3sNCisgICAgcmV0dXJuIGdfWEZBRW51bURhdGEgKyBlTmFtZTsNCit9DQorRlhfSU5UMzIgWEZBX0dldEF0dHJpYnV0ZUNvdW50KCkNCit7DQorICAgIHJldHVybiBnX2lYRkFBdHRyaWJ1dGVDb3VudDsNCit9DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZShGWF9XU1RSIHdzTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX1VJTlQzMiB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFBdHRyaWJ1dGVDb3VudCAtIDE7DQorICAgIGRvIHsNCisgICAgICAgIEZYX0lOVDMyIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEluZm8gPSBnX1hGQUF0dHJpYnV0ZURhdGEgKyBpTWlkOw0KKyAgICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgICAgIHJldHVybiBwSW5mbzsNCisgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlQnlJRChYRkFfQVRUUklCVVRFIGVOYW1lKQ0KK3sNCisgICAgcmV0dXJuIChlTmFtZSA8IGdfaVhGQUF0dHJpYnV0ZUNvdW50KSA/IChnX1hGQUF0dHJpYnV0ZURhdGEgKyBlTmFtZSkgOiBOVUxMOw0KK30NCitGWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUoRlhfTFBWT0lEICZwVmFsdWUsIFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLCBGWF9EV09SRCBkd1BhY2tldCkNCit7DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHJpYnV0ZSk7DQorICAgIGlmIChwSW5mbyA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGR3UGFja2V0ICYmIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocEluZm8tPmVUeXBlID09IGVUeXBlKSB7DQorICAgICAgICBwVmFsdWUgPSBwSW5mby0+cERlZlZhbHVlOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAocEluZm8tPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsNCisgICAgICAgIFhGQV9MUENOT1RTVVJFQVRUUklCVVRFIHBBdHRyID0gWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoZUVsZW1lbnQsIGVBdHRyaWJ1dGUsIGVUeXBlKTsNCisgICAgICAgIGlmIChwQXR0cikgew0KKyAgICAgICAgICAgIHBWYWx1ZSA9IHBBdHRyLT5wVmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpDQorew0KKyAgICBGWF9MUFZPSUQgcFZhbHVlOw0KKyAgICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIGVFbGVtZW50LCBlQXR0cmlidXRlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBkd1BhY2tldCkpIHsNCisgICAgICAgIHJldHVybiAoWEZBX0FUVFJJQlVURUVOVU0pKEZYX1VJTlRQVFIpcFZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KK30NCitDRlhfV2lkZVN0cmluZ0MgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCkNCit7DQorICAgIEZYX0xQVk9JRCBwVmFsdWU7DQorICAgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBkd1BhY2tldCkpIHsNCisgICAgICAgIHJldHVybiAoRlhfTFBDV1NUUilwVmFsdWU7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIEZYX0RXT1JEIGR3UGFja2V0KQ0KK3sNCisgICAgRlhfTFBWT0lEIHBWYWx1ZTsNCisgICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgZHdQYWNrZXQpKSB7DQorICAgICAgICByZXR1cm4gKEZYX0JPT0wpKEZYX1VJTlRQVFIpcFZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfSU5UMzIgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9JbnRlZ2VyKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIEZYX0RXT1JEIGR3UGFja2V0KQ0KK3sNCisgICAgRlhfTFBWT0lEIHBWYWx1ZTsNCisgICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgZHdQYWNrZXQpKSB7DQorICAgICAgICByZXR1cm4gKEZYX0lOVDMyKShGWF9VSU5UUFRSKXBWYWx1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQorQ1hGQV9NZWFzdXJlbWVudCBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX01lYXN1cmUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpDQorew0KKyAgICBGWF9MUFZPSUQgcFZhbHVlOw0KKyAgICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIGVFbGVtZW50LCBlQXR0cmlidXRlLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBkd1BhY2tldCkpIHsNCisgICAgICAgIHJldHVybiAqKENYRkFfTWVhc3VyZW1lbnQqKXBWYWx1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ1hGQV9NZWFzdXJlbWVudCgpOw0KK30NCitGWF9JTlQzMiBYRkFfR2V0RWxlbWVudENvdW50KCkNCit7DQorICAgIHJldHVybiBnX2lYRkFFbGVtZW50Q291bnQ7DQorfQ0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0RWxlbWVudEJ5TmFtZShGWF9XU1RSIHdzTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX1VJTlQzMiB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFFbGVtZW50Q291bnQgLSAxOw0KKyAgICBkbyB7DQorICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIFhGQV9MUENFTEVNRU5USU5GTyBwSW5mbyA9IGdfWEZBRWxlbWVudERhdGEgKyBpTWlkOw0KKyAgICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgICAgIHJldHVybiBwSW5mbzsNCisgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDRUxFTUVOVElORk8gWEZBX0dldEVsZW1lbnRCeUlEKFhGQV9FTEVNRU5UIGVOYW1lKQ0KK3sNCisgICAgcmV0dXJuIChlTmFtZSA8IGdfaVhGQUVsZW1lbnRDb3VudCkgPyAoZ19YRkFFbGVtZW50RGF0YSArIGVOYW1lKSA6IE5VTEw7DQorfQ0KK0ZYX0xQQ1dPUkQgWEZBX0dldEVsZW1lbnRDaGlsZHJlbihYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfSU5UMzIgJmlDb3VudCkNCit7DQorICAgIGlmIChlRWxlbWVudCA+PSBnX2lYRkFFbGVtZW50Q291bnQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZIHBFbGVtZW50ID0gZ19YRkFFbGVtZW50Q2hpbGRyZW5JbmRleCArIGVFbGVtZW50Ow0KKyAgICBpQ291bnQgPSBwRWxlbWVudC0+d0NvdW50Ow0KKyAgICByZXR1cm4gZ19YRkFFbGVtZW50Q2hpbGRyZW5EYXRhICsgcEVsZW1lbnQtPndTdGFydDsNCit9DQorRlhfTFBDQllURSBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIEZYX0lOVDMyICZpQ291bnQpDQorew0KKyAgICBpZiAoZUVsZW1lbnQgPj0gZ19pWEZBRWxlbWVudENvdW50KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBYRkFfTFBDRUxFTUVOVEhJRVJBUkNIWSBwRWxlbWVudCA9IGdfWEZBRWxlbWVudEF0dHJpYnV0ZUluZGV4ICsgZUVsZW1lbnQ7DQorICAgIGlDb3VudCA9IHBFbGVtZW50LT53Q291bnQ7DQorICAgIHJldHVybiBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVEYXRhICsgcEVsZW1lbnQtPndTdGFydDsNCit9DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZU9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIEZYX0xQQ0JZVEUgcEF0dHIgPSBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMoZUVsZW1lbnQsIGlDb3VudCk7DQorICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IGlDb3VudCA8IDEpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9EU1BBVGVtcGxhdGU8RlhfQllURT4gc2VhcmNoOw0KKyAgICBGWF9JTlQzMiBpbmRleCA9IHNlYXJjaC5Mb29rdXAoZUF0dHJpYnV0ZSwgcEF0dHIsIGlDb3VudCk7DQorICAgIGlmIChpbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHJpYnV0ZSk7DQorICAgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCisgICAgaWYgKGR3UGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVU5LTk9XTikgew0KKyAgICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICB9DQorICAgIHJldHVybiAoZHdQYWNrZXQgJiBwSW5mby0+ZHdQYWNrZXRzKSA/IHBJbmZvIDogTlVMTDsNCit9DQorWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRDaGlsZE9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0VMRU1FTlQgZUNoaWxkLCBGWF9EV09SRCBkd1BhY2tldCkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIEZYX0xQQ1dPUkQgcENoaWxkID0gWEZBX0dldEVsZW1lbnRDaGlsZHJlbihlRWxlbWVudCwgaUNvdW50KTsNCisgICAgaWYgKHBDaGlsZCA9PSBOVUxMIHx8IGlDb3VudCA8IDEpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWF9EU1BBVGVtcGxhdGU8RlhfV09SRD4gc2VhcmNoOw0KKyAgICBGWF9JTlQzMiBpbmRleCA9IHNlYXJjaC5Mb29rdXAoZUNoaWxkLCBwQ2hpbGQsIGlDb3VudCk7DQorICAgIGlmIChpbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIFhGQV9MUENFTEVNRU5USU5GTyBwSW5mbyA9IFhGQV9HZXRFbGVtZW50QnlJRChlQ2hpbGQpOw0KKyAgICBBU1NFUlQocEluZm8gIT0gTlVMTCk7DQorICAgIGlmIChkd1BhY2tldCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfQ0KKyAgICByZXR1cm4gKGR3UGFja2V0ICYgcEluZm8tPmR3UGFja2V0cykgPyBwSW5mbyA6IE5VTEw7DQorfQ0KK1hGQV9MUENQUk9QRVJUWSBYRkFfR2V0RWxlbWVudFByb3BlcnRpZXMoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIEZYX0lOVDMyICZpQ291bnQpDQorew0KKyAgICBpZiAoZUVsZW1lbnQgPj0gZ19pWEZBRWxlbWVudENvdW50KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBYRkFfTFBDRUxFTUVOVEhJRVJBUkNIWSBwRWxlbWVudCA9IGdfWEZBRWxlbWVudFByb3BlcnR5SW5kZXggKyBlRWxlbWVudDsNCisgICAgaUNvdW50ID0gcEVsZW1lbnQtPndDb3VudDsNCisgICAgcmV0dXJuIGdfWEZBRWxlbWVudFByb3BlcnR5RGF0YSArIHBFbGVtZW50LT53U3RhcnQ7DQorfQ0KK1hGQV9MUENQUk9QRVJUWSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwgRlhfRFdPUkQgZHdQYWNrZXQpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnR5ID0gWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKGVFbGVtZW50LCBpQ291bnQpOw0KKyAgICBpZiAocFByb3BlcnR5ID09IE5VTEwgfHwgaUNvdW50IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IGlDb3VudCAtIDEsIGlNaWQ7DQorICAgIGRvIHsNCisgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZU5hbWUgPSAoWEZBX0VMRU1FTlQpcFByb3BlcnR5W2lNaWRdLmVOYW1lOw0KKyAgICAgICAgaWYgKGVQcm9wZXJ0eSA9PSBlTmFtZSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIGlmIChlUHJvcGVydHkgPCBlTmFtZSkgew0KKyAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgaWYgKGlTdGFydCA+IGlFbmQpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIFhGQV9MUENFTEVNRU5USU5GTyBwSW5mbyA9IFhGQV9HZXRFbGVtZW50QnlJRChlUHJvcGVydHkpOw0KKyAgICBBU1NFUlQocEluZm8gIT0gTlVMTCk7DQorICAgIGlmIChkd1BhY2tldCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgICAgIHJldHVybiBwUHJvcGVydHkgKyBpTWlkOw0KKyAgICB9DQorICAgIHJldHVybiAoZHdQYWNrZXQgJiBwSW5mby0+ZHdQYWNrZXRzKSA/IChwUHJvcGVydHkgKyBpTWlkKSA6IE5VTEw7DQorfQ0KK1hGQV9MUENOT1RTVVJFQVRUUklCVVRFIFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlKQ0KK3sNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQU5vdHN1cmVDb3VudCAtIDE7DQorICAgIGRvIHsNCisgICAgICAgIEZYX0lOVDMyIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaU1pZDsNCisgICAgICAgIGlmIChlRWxlbWVudCA9PSBwQXR0ci0+ZUVsZW1lbnQpIHsNCisgICAgICAgICAgICBpZiAocEF0dHItPmVBdHRyaWJ1dGUgPT0gZUF0dHJpYnV0ZSkgew0KKyAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQXR0cjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpQmVmb3JlID0gaU1pZCAtIDE7DQorICAgICAgICAgICAgICAgIGlmKGlCZWZvcmUgPj0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUJlZm9yZTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGVFbGVtZW50ID09IHBBdHRyLT5lRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBBdHRyLT5lQXR0cmlidXRlID09IGVBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUgfHwgZVR5cGUgPT0gcEF0dHItPmVUeXBlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEF0dHI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlCZWZvcmUgLS07DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoaUJlZm9yZSA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlCZWZvcmU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUFmdGVyID0gaU1pZCArIDE7DQorICAgICAgICAgICAgICAgIGlmKGlBZnRlciA8PSBnX2lYRkFOb3RzdXJlQ291bnQgLSAxKSB7DQorICAgICAgICAgICAgICAgICAgICBwQXR0ciA9IGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMgKyBpQWZ0ZXI7DQorICAgICAgICAgICAgICAgICAgICB3aGlsZShlRWxlbWVudCA9PSBwQXR0ci0+ZUVsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQXR0ci0+ZUF0dHJpYnV0ZSA9PSBlQXR0cmlidXRlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFIHx8IGVUeXBlID09IHBBdHRyLT5lVHlwZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBBdHRyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpQWZ0ZXIgKys7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoaUFmdGVyID4gZ19pWEZBTm90c3VyZUNvdW50IC0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUFmdGVyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZUVsZW1lbnQgPCBwQXR0ci0+ZUVsZW1lbnQpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBYRkFfR2V0TWV0aG9kQ291bnQoKQ0KK3sNCisgICAgcmV0dXJuIGdfaVNvbU1ldGhvZENvdW50Ow0KK30NCitYRkFfTFBDTUVUSE9ESU5GTyBYRkFfR2V0TWV0aG9kQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9XU1RSIHdzTWV0aG9kTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c01ldGhvZE5hbWUuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlFbGVtZW50SW5kZXggPSBlRWxlbWVudDsNCisgICAgd2hpbGUoaUVsZW1lbnRJbmRleCAhPSAtMSkgew0KKyAgICAgICAgWEZBX0xQQ1NDUklQVEhJRVJBUkNIWSBzY3JpcHRJbmRleCA9IGdfWEZBU2NyaXB0SW5kZXggKyBpRWxlbWVudEluZGV4Ow0KKyAgICAgICAgRlhfSU5UMzIgaWNvdW50ID0gc2NyaXB0SW5kZXgtPndNZXRob2RDb3VudDsNCisgICAgICAgIGlmKGljb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9VSU5UMzIgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c01ldGhvZE5hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gc2NyaXB0SW5kZXgtPndNZXRob2RTdGFydCwgaUVuZCA9IGlTdGFydCArIGljb3VudCAtIDE7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICAgICAgWEZBX0xQQ01FVEhPRElORk8gcEluZm8gPSBnX1NvbU1ldGhvZERhdGEgKyBpTWlkOw0KKyAgICAgICAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LAlGWF9XU1RSIHdzQXR0cmlidXRlTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSB3c0F0dHJpYnV0ZU5hbWUuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlFbGVtZW50SW5kZXggPSBlRWxlbWVudDsNCisgICAgd2hpbGUoaUVsZW1lbnRJbmRleCAhPSAtMSkgew0KKyAgICAgICAgWEZBX0xQQ1NDUklQVEhJRVJBUkNIWSBzY3JpcHRJbmRleCA9IGdfWEZBU2NyaXB0SW5kZXggKyBpRWxlbWVudEluZGV4Ow0KKyAgICAgICAgRlhfSU5UMzIgaWNvdW50ID0gc2NyaXB0SW5kZXgtPndBdHRyaWJ1dGVDb3VudDsNCisgICAgICAgIGlmKGljb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGWF9VSU5UMzIgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0F0dHJpYnV0ZU5hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gc2NyaXB0SW5kZXgtPndBdHRyaWJ1dGVTdGFydCwgaUVuZCA9IGlTdGFydCArIGljb3VudCAtIDE7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gcEluZm8gPSBnX1NvbUF0dHJpYnV0ZURhdGEgKyBpTWlkOw0KKyAgICAgICAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENYRkFfTWVhc3VyZW1lbnQ6OlNldChGWF9XU1RSIHdzTWVhc3VyZSkNCit7DQorICAgIGlmICh3c01lYXN1cmUuSXNFbXB0eSgpKSB7DQorICAgICAgICBtX2ZWYWx1ZSA9IDA7DQorICAgICAgICBtX2VVbml0ID0gWEZBX1VOSVRfVW5rbm93bjsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpVXNlZExlbiA9IDA7DQorICAgIEZYX0lOVDMyIGlPZmZzZXQgPSAod3NNZWFzdXJlLkdldEF0KDApID09IEwnPScpID8gMSA6IDA7DQorICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IEZYX3djc3RvZih3c01lYXN1cmUuR2V0UHRyKCkgKyBpT2Zmc2V0LCB3c01lYXN1cmUuR2V0TGVuZ3RoKCkgLSBpT2Zmc2V0LCAmaVVzZWRMZW4pOw0KKyAgICBYRkFfVU5JVCBlVW5pdCA9IEdldFVuaXQod3NNZWFzdXJlLk1pZChpT2Zmc2V0ICsgaVVzZWRMZW4pKTsNCisgICAgU2V0KGZWYWx1ZSwgZVVuaXQpOw0KK30NCitGWF9CT09MIENYRkFfTWVhc3VyZW1lbnQ6OlRvU3RyaW5nKENGWF9XaWRlU3RyaW5nICZ3c01lYXN1cmUpIGNvbnN0DQorew0KKyAgICBzd2l0Y2ggKEdldFVuaXQoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfVU5JVF9NbToNCisgICAgICAgICAgICB3c01lYXN1cmUuRm9ybWF0KChGWF9MUENXU1RSKUwiJS44Z21tIiwgR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIFhGQV9VTklUX1B0Og0KKyAgICAgICAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlLjhncHQiLCBHZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfSW46DQorICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUuOGdpbiIsIEdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgY2FzZSBYRkFfVU5JVF9DbToNCisgICAgICAgICAgICB3c01lYXN1cmUuRm9ybWF0KChGWF9MUENXU1RSKUwiJS44Z2NtIiwgR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIFhGQV9VTklUX01wOg0KKyAgICAgICAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlLjhnbXAiLCBHZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfUGM6DQorICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUuOGdwYyIsIEdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgY2FzZSBYRkFfVU5JVF9FbToNCisgICAgICAgICAgICB3c01lYXN1cmUuRm9ybWF0KChGWF9MUENXU1RSKUwiJS44Z2VtIiwgR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIFhGQV9VTklUX1BlcmNlbnQ6DQorICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiUuOGclJSIsIEdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICB3c01lYXN1cmUuRm9ybWF0KChGWF9MUENXU1RSKUwiJS44ZyIsIEdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfTWVhc3VyZW1lbnQ6OlRvVW5pdChYRkFfVU5JVCBlVW5pdCwgRlhfRkxPQVQgJmZWYWx1ZSkgY29uc3QNCit7DQorICAgIGZWYWx1ZSA9IEdldFZhbHVlKCk7DQorICAgIFhGQV9VTklUIGVGcm9tID0gR2V0VW5pdCgpOw0KKyAgICBpZiAoZUZyb20gPT0gZVVuaXQpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHN3aXRjaCAoZUZyb20pIHsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfUHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9VTklUX01tOg0KKyAgICAgICAgICAgIGZWYWx1ZSAqPSA3MiAvIDIuNTRmIC8gMTA7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9VTklUX0luOg0KKyAgICAgICAgICAgIGZWYWx1ZSAqPSA3MjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfQ206DQorICAgICAgICAgICAgZlZhbHVlICo9IDcyIC8gMi41NGY7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9VTklUX01wOg0KKyAgICAgICAgICAgIGZWYWx1ZSAqPSAwLjAwMWY7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9VTklUX1BjOg0KKyAgICAgICAgICAgIGZWYWx1ZSAqPSAxMi4wZjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgZlZhbHVlID0gMDsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgc3dpdGNoIChlVW5pdCkgew0KKyAgICAgICAgY2FzZSBYRkFfVU5JVF9QdDoNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfTW06DQorICAgICAgICAgICAgZlZhbHVlIC89IDcyIC8gMi41NGYgLyAxMDsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfSW46DQorICAgICAgICAgICAgZlZhbHVlIC89IDcyOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgY2FzZSBYRkFfVU5JVF9DbToNCisgICAgICAgICAgICBmVmFsdWUgLz0gNzIgLyAyLjU0ZjsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfTXA6DQorICAgICAgICAgICAgZlZhbHVlIC89IDAuMDAxZjsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1VOSVRfUGM6DQorICAgICAgICAgICAgZlZhbHVlIC89IDEyLjBmOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBmVmFsdWUgPSAwOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK1hGQV9VTklUIENYRkFfTWVhc3VyZW1lbnQ6OkdldFVuaXQoRlhfV1NUUiB3c1VuaXQpDQorew0KKyAgICBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwibW0iKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9VTklUX01tOw0KKyAgICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMInB0IikpIHsNCisgICAgICAgIHJldHVybiBYRkFfVU5JVF9QdDsNCisgICAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJpbiIpKSB7DQorICAgICAgICByZXR1cm4gWEZBX1VOSVRfSW47DQorICAgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwiY20iKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9VTklUX0NtOw0KKyAgICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMInBjIikpIHsNCisgICAgICAgIHJldHVybiBYRkFfVU5JVF9QYzsNCisgICAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJtcCIpKSB7DQorICAgICAgICByZXR1cm4gWEZBX1VOSVRfTXA7DQorICAgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwiZW0iKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9VTklUX0VtOw0KKyAgICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMIiUiKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9VTklUX1BlcmNlbnQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gWEZBX1VOSVRfVW5rbm93bjsNCisgICAgfQ0KK30NCitJRlhfU3RyZWFtKiBYRkFfQ3JlYXRlV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0J1ZmZlcikNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ1hGQV9XaWRlVGV4dFJlYWQod3NCdWZmZXIpOw0KK30NCitDWEZBX1dpZGVUZXh0UmVhZDo6Q1hGQV9XaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQnVmZmVyKQ0KKyAgICA6IG1fd3NCdWZmZXIod3NCdWZmZXIpDQorICAgICwgbV9pUG9zaXRpb24oMCkNCisgICAgLCBtX2lSZWZDb3VudCgxKQ0KK3sNCit9DQordm9pZCBDWEZBX1dpZGVUZXh0UmVhZDo6UmVsZWFzZSgpDQorew0KKyAgICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorfQ0KK0lGWF9TdHJlYW0qIENYRkFfV2lkZVRleHRSZWFkOjpSZXRhaW4oKQ0KK3sNCisgICAgbV9pUmVmQ291bnQrKzsNCisgICAgcmV0dXJuIHRoaXM7DQorfQ0KK0ZYX0RXT1JEIENYRkFfV2lkZVRleHRSZWFkOjpHZXRBY2Nlc3NNb2RlcygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gRlhfU1RSRUFNQUNDRVNTX1JlYWQgfCBGWF9TVFJFQU1BQ0NFU1NfVGV4dDsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldExlbmd0aCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUik7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZVRleHRSZWFkOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIEZYX0lOVDMyIGlPZmZzZXQpDQorew0KKyAgICBzd2l0Y2ggKGVTZWVrKSB7DQorICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6DQorICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBtX3dzQnVmZmVyLkdldExlbmd0aCgpICsgaU9mZnNldDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgICAgICBtX2lQb3NpdGlvbiA9IDA7DQorICAgIH0NCisgICAgaWYgKG1faVBvc2l0aW9uID4gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgbV9pUG9zaXRpb24gPSBtX3dzQnVmZmVyLkdldExlbmd0aCgpOw0KKyAgICB9DQorICAgIHJldHVybiBHZXRQb3NpdGlvbigpOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0UG9zaXRpb24oKQ0KK3sNCisgICAgcmV0dXJuIG1faVBvc2l0aW9uICogc2l6ZW9mKEZYX1dDSEFSKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGVUZXh0UmVhZDo6SXNFT0YoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1faVBvc2l0aW9uID49IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZVRleHRSZWFkOjpSZWFkU3RyaW5nKEZYX0xQV1NUUiBwU3RyLCBGWF9JTlQzMiBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TLCBGWF9JTlQzMiBjb25zdCAqcEJ5dGVTaXplICkNCit7DQorICAgIGlmIChpTWF4TGVuZ3RoID4gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAtIG1faVBvc2l0aW9uKSB7DQorICAgICAgICBpTWF4TGVuZ3RoID0gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAtIG1faVBvc2l0aW9uOw0KKyAgICB9DQorICAgIEZYU1lTX3djc25jcHkocFN0ciwgKEZYX0xQQ1dTVFIpbV93c0J1ZmZlciArIG1faVBvc2l0aW9uLCBpTWF4TGVuZ3RoKTsNCisgICAgbV9pUG9zaXRpb24gKz0gaU1heExlbmd0aDsNCisgICAgYkVPUyA9IElzRU9GKCk7DQorICAgIHJldHVybiBpTWF4TGVuZ3RoOw0KK30NCitGWF9XT1JEIENYRkFfV2lkZVRleHRSZWFkOjpHZXRDb2RlUGFnZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gKHNpemVvZihGWF9XQ0hBUikgPT0gMikgPyBGWF9DT0RFUEFHRV9VVEYxNkxFIDogRlhfQ09ERVBBR0VfVVRGMzJMRTsNCit9DQorRlhfV09SRCBDWEZBX1dpZGVUZXh0UmVhZDo6U2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpDQorew0KKyAgICByZXR1cm4gR2V0Q29kZVBhZ2UoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2VkMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfaW1wLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfQkFTSUNfSU1QDQorI2RlZmluZSBfWEZBX0JBU0lDX0lNUA0KK3R5cGVkZWYgc3RydWN0IF9YRkFfTk9UU1VSRUFUVFJJQlVURSB7DQorICAgIFhGQV9FTEVNRU5UCQkJCWVFbGVtZW50Ow0KKyAgICBYRkFfQVRUUklCVVRFCQkJZUF0dHJpYnV0ZTsNCisgICAgWEZBX0FUVFJJQlVURVRZUEUJCWVUeXBlOw0KKyAgICBGWF9MUFZPSUQJCQkJcFZhbHVlOw0KK30gWEZBX05PVFNVUkVBVFRSSUJVVEUsICogWEZBX0xQTk9UU1VSRUFUVFJJQlVURTsNCit0eXBlZGVmIFhGQV9OT1RTVVJFQVRUUklCVVRFIGNvbnN0ICogWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEU7DQorWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUgPSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFKTsNCitjbGFzcyBDWEZBX1dpZGVUZXh0UmVhZCA6IHB1YmxpYyBJRlhfU3RyZWFtLCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0J1ZmZlcik7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCk7DQorICAgIHZpcnR1YWwgSUZYX1N0cmVhbSoJCVJldGFpbigpOw0KKw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JECQkJR2V0QWNjZXNzTW9kZXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldExlbmd0aCgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBGWF9JTlQzMiBpT2Zmc2V0KTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUdldFBvc2l0aW9uKCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJUmVhZERhdGEoRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0lOVDMyIGlCdWZmZXJTaXplKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJUmVhZFN0cmluZyhGWF9MUFdTVFIgcFN0ciwgRlhfSU5UMzIgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUywgRlhfSU5UMzIgY29uc3QgKnBCeXRlU2l6ZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJV3JpdGVEYXRhKEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfSU5UMzIgaUJ1ZmZlclNpemUpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlXcml0ZVN0cmluZyhGWF9MUENXU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlGbHVzaCgpIHt9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRMZW5ndGgoRlhfSU5UMzIgaUxlbmd0aCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCQlHZXRCT00oRlhfQllURSBib21bNF0pIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfV09SRAkJCQlHZXRDb2RlUGFnZSgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJU2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJTG9jaygpIHt9DQorICAgIHZpcnR1YWwgdm9pZAkJCQlVbmxvY2soKSB7fQ0KKw0KKyAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQlDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsIEZYX0lOVDMyIGlPZmZzZXQsIEZYX0lOVDMyIGlMZW5ndGgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorDQorICAgIENGWF9XaWRlU3RyaW5nCQkJCUdldFNyY1RleHQoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV93c0J1ZmZlcjsNCisgICAgfQ0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQkJbV93c0J1ZmZlcjsNCisgICAgRlhfSU5UMzIJCQkJCW1faVBvc2l0aW9uOw0KKyAgICBGWF9JTlQzMgkJCQkJbV9pUmVmQ291bnQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZGVidWdfcGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kZWJ1Z19wYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNTM2NWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZGVidWdfcGFyc2VyLmNwcApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RlYnVnX3BhcnNlci5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RlYnVnX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGNlODkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZGVidWdfcGFyc2VyLmgKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9ERUJVR19QQVJTRVJfSF8NCisjZGVmaW5lIF9YRkFfREVCVUdfUEFSU0VSX0hfDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NTlkNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Hcm91cCAweGY3Zjc1ZmNkDQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0RER3JvdXANCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZChDWEZBX05vZGUqIHBEREdyb3VwTm9kZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBEREdyb3VwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShYRkFfSEFTSENPREVfR3JvdXApOw0KKyAgICB9DQorICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXROZXh0U2libGluZyhDWEZBX05vZGUqIHBEREdyb3VwTm9kZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHBEREdyb3VwTm9kZS0+R2V0TmV4dFNhbWVOYW1lU2libGluZyhYRkFfSEFTSENPREVfR3JvdXApOw0KKyAgICB9DQorICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBwRERHcm91cE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICB9DQorfTsNCit2b2lkIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKENYRkFfTm9kZSogcERhdGFOb2RlLCBDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCisgICAgZm9yKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwRGF0YUNoaWxkOyBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBEYXRhQ2hpbGQtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBEYXRhQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgICAgICAgIGlmKCFkd05hbWVIYXNoKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0RER3JvdXA+IHNJdGVyYXRvcihwRGF0YURlc2NyaXB0aW9uTm9kZSk7DQorICAgICAgICBmb3IgKENYRkFfTm9kZSogcERER3JvdXBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcERER3JvdXBOb2RlOyBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgaWYocERER3JvdXBOb2RlICE9IHBEYXRhRGVzY3JpcHRpb25Ob2RlKSB7DQorICAgICAgICAgICAgICAgIGlmKHBEREdyb3VwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2U7DQorICAgICAgICAgICAgICAgIGlmKCFwRERHcm91cE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZSkgfHwgd3NOYW1lc3BhY2UgIT0gRlhfV1NUUkMoTCJodHRwOi8vbnMuYWRvYmUuY29tL2RhdGEtZGVzY3JpcHRpb24vIikpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcERETm9kZSA9IHBEREdyb3VwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKTsNCisgICAgICAgICAgICBpZighcERETm9kZSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocERETm9kZS0+R2V0Q2xhc3NJRCgpICE9IGVUeXBlKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwRGF0YUNoaWxkLT5TZXREYXRhRGVzY3JpcHRpb25Ob2RlKHBERE5vZGUpOw0KKyAgICAgICAgICAgIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKHBEYXRhQ2hpbGQsIHBERE5vZGUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NYRkFfTm9kZSogWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRGF0YVBhcmVudCwgWEZBX0VMRU1FTlQgZU5vZGVUeXBlLCBGWF9XU1RSIHdzTmFtZSkNCit7DQorICAgIGlmKCFwRGF0YVBhcmVudCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlICpwUGFyZW50REROb2RlID0gcERhdGFQYXJlbnQtPkdldERhdGFEZXNjcmlwdGlvbk5vZGUoKTsNCisgICAgaWYoIXBQYXJlbnRERE5vZGUpIHsNCisgICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIGVOb2RlVHlwZSk7DQorICAgICAgICBGWFNZU19hc3NlcnQocERhdGFOb2RlKTsNCisgICAgICAgIHBEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgICAgcERhdGFOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgcERhdGFQYXJlbnQtPkluc2VydENoaWxkKHBEYXRhTm9kZSk7DQorICAgICAgICBwRGF0YU5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICByZXR1cm4gcERhdGFOb2RlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9EREdyb3VwPiBzSXRlcmF0b3IocFBhcmVudERETm9kZSk7DQorICAgICAgICBmb3IgKENYRkFfTm9kZSogcERER3JvdXBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcERER3JvdXBOb2RlOyBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgaWYocERER3JvdXBOb2RlICE9IHBQYXJlbnRERE5vZGUpIHsNCisgICAgICAgICAgICAgICAgaWYocERER3JvdXBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZTsNCisgICAgICAgICAgICAgICAgaWYoIXBEREdyb3VwTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKSB8fCB3c05hbWVzcGFjZSAhPSBGWF9XU1RSQyhMImh0dHA6Ly9ucy5hZG9iZS5jb20vZGF0YS1kZXNjcmlwdGlvbi8iKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwREROb2RlID0gcERER3JvdXBOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHdzTmFtZSk7DQorICAgICAgICAgICAgaWYoIXBERE5vZGUpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHBERE5vZGUtPkdldENsYXNzSUQoKSAhPSBlTm9kZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIGVOb2RlVHlwZSk7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgICAgICAgcERhdGFOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgIGlmKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUgJiYgcERETm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSkgew0KKyAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX0FUVFJJQlVURUVOVU1fTWV0YURhdGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwRGF0YVBhcmVudC0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCisgICAgICAgICAgICBwRGF0YU5vZGUtPlNldERhdGFEZXNjcmlwdGlvbk5vZGUocERETm9kZSk7DQorICAgICAgICAgICAgcERhdGFOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgIHJldHVybiBwRGF0YU5vZGU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUxNGMwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuaApAQCAtMCwwICsxLDExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9ET0NVTUVOVF9EQVRBREVTQ1JJUFRJT05fSU1QX0hfDQorI2RlZmluZSBfWEZBX0RPQ1VNRU5UX0RBVEFERVNDUklQVElPTl9JTVBfSF8NCit2b2lkCQlYRkFfRGF0YURlc2NyaXB0aW9uX1VwZGF0ZURhdGFSZWxhdGlvbihDWEZBX05vZGUqIHBEYXRhTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YURlc2NyaXB0aW9uTm9kZSk7DQorQ1hGQV9Ob2RlKglYRkFfRGF0YURlc2NyaXB0aW9uX01heWJlQ3JlYXRlRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBEYXRhUGFyZW50LCBYRkFfRUxFTUVOVCBlTm9kZVR5cGUsIEZYX1dTVFIgd3NOYW1lKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2I5N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcApAQCAtMCwwICsxLDEyNjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX2Jhc2ljX2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oIg0KK3N0YXRpYyBGWF9CT09MIFhGQV9HZXRPY2N1ckluZm8oQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlLCBGWF9JTlQzMiYgaU1pbiwgRlhfSU5UMzImIGlNYXgsIEZYX0lOVDMyJiBpSW5pdCkNCit7DQorICAgIGlmKCFwT2NjdXJOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9PY2N1ciBvY2N1cihwT2NjdXJOb2RlKTsNCisgICAgcmV0dXJuIG9jY3VyLkdldE9jY3VySW5mbyhpTWluLCBpTWF4LCBpSW5pdCk7DQorfQ0KK3N0cnVjdCBYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQgew0KKyAgICBDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkOw0KKyAgICBDWEZBX05vZGUgKnBEYXRhQ2hpbGQ7DQorfTsNCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfQ3JlYXRlQ2hpbGQoQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlLCBYRkFfRUxFTUVOVCBpVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV04pDQorew0KKyAgICBDWEZBX05vZGUgKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAoIXBDaGlsZE5vZGUpIHsNCisgICAgICAgIGlmIChpVHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldFByb3BlcnR5KDAsIGlUeXBlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcENoaWxkTm9kZTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKENYRkFfTm9kZSogcEZvcm1Ob2RlKQ0KK3sNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBGWFNZU19hc3NlcnQocFdpZGdldERhdGEpOw0KKyAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KENYRkFfTm9kZSogcFZhbHVlTm9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgWEZBX0VMRU1FTlQgaVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOKQ0KK3sNCisgICAgaWYgKCFwVmFsdWVOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KHBWYWx1ZU5vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX0NyZWF0ZUNoaWxkKHBWYWx1ZU5vZGUsIGlUeXBlKTsNCisgICAgaWYgKCFwQ2hpbGROb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgWEZBX09CSkVDVFRZUEUgb2JqZWN0VHlwZSA9IHBDaGlsZE5vZGUtPkdldE9iamVjdFR5cGUoKTsNCisgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOiB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcENvbnRlbnRSYXdEYXRhTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB0ZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweEhUTUw7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC94bWwiKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweG1sOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUgPSBwQ2hpbGROb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShlbGVtZW50KTsNCisgICAgICAgICAgICAgICAgICAgIHBDaGlsZE5vZGUtPkluc2VydENoaWxkKHBDb250ZW50UmF3RGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29udGVudCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOiB7DQorICAgICAgICAgICAgICAgIHBDaGlsZE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29udGVudCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX05vZGUqIHBEYXRhTm9kZSwgRlhfQk9PTCBiRGF0YVRvRm9ybSA9IFRSVUUpDQorew0KKyAgICBwRm9ybU5vZGUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwRGF0YU5vZGUpOw0KKyAgICBwRGF0YU5vZGUtPkFkZEJpbmRJdGVtKHBGb3JtTm9kZSk7DQorICAgIFhGQV9FTEVNRU5UIGVDbGFzcyA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZUNsYXNzICE9IFhGQV9FTEVNRU5UX0ZpZWxkICYmIGVDbGFzcyAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIEZYU1lTX2Fzc2VydChwV2lkZ2V0RGF0YSk7DQorICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFOw0KKyAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KKyAgICBDWEZBX1ZhbHVlIGRlZlZhbHVlID0gcEZvcm1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgIGlmKCFiRGF0YVRvRm9ybSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ZWRWYWx1ZTsNCisgICAgICAgIHN3aXRjaCAoZVVJVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0OiB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX0ltYWdlIGltYWdlID0gZGVmVmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5HZXRDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLkdldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLkdldEhyZWYod3NIcmVmKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTERhdGFFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKShwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEYXRhRWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJocmVmIiksIHdzSHJlZik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KKyAgICAgICAgICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2VsVGV4dEFycmF5Ow0KKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1NlbFRleHRBcnJheSk7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IHdzU2VsVGV4dEFycmF5LkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpU2l6ZSA+PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwVmFsdWUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSAqcFZhbHVlWE1MTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlID0gcERhdGFOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJ2YWx1ZSIpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlWE1MTm9kZSA9IHBWYWx1ZS0+Q3JlYXRlWE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlLT5JbnNlcnRDaGlsZChwVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzU2VsVGV4dEFycmF5W2ldKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSAqcFhNTE5vZGUgPSBwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZSktPlNldFN0cmluZyhGWF9XU1RSQyhMInhmYTpkYXRhTm9kZSIpLCBGWF9XU1RSQyhMImRhdGFHcm91cCIpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uOg0KKyAgICAgICAgICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6IHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENoZWNrZWQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBwQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9WYWx1ZSB2YWx1ZUNoaWxkKHBWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGlsZC5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwSXRlbXMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBUZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCkgJiYgKHdzQ29udGVudCA9PSB3c1ZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hlY2tlZCA9IHBDaGlsZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IHBUZXh0LT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9ybWF0ZWRWYWx1ZSA9IHdzVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBDaGVja2VkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwQ2hpbGQgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENoaWxkID09IHBDaGVja2VkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcENoaWxkLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBwQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zID8gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkgOiBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQocFZhbHVlLCB3c0NvbnRlbnQsIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgICAgICAgICAgICAgICAgICAgIHBXaWRnZXREYXRhLT5Ob3JtYWxpemVOdW1TdHIod3NWYWx1ZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IHdzT3V0cHV0Ow0KKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBwRm9ybU5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQocFZhbHVlLCB3c1ZhbHVlLCBYRkFfRUxFTUVOVF9GbG9hdCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxWYWx1ZTsNCisgICAgICAgIHBEYXRhTm9kZS0+VHJ5Q29udGVudCh3c1hNTFZhbHVlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9ybWFpbGl6ZVZhbHVlOw0KKyAgICAgICAgcFdpZGdldERhdGEtPkdldE5vcm1hbGl6ZURhdGFWYWx1ZSh3c1hNTFZhbHVlLCB3c05vcm1haWxpemVWYWx1ZSk7DQorICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzTm9ybWFpbGl6ZVZhbHVlLCB3c1hNTFZhbHVlKTsNCisgICAgICAgIHN3aXRjaCAoZVVJVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0OiB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX0ltYWdlKTsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBkZWZWYWx1ZS5HZXRJbWFnZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50ICpwWE1MRGF0YUVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopKHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEYXRhRWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoKEZYX0xQQ1dTVFIpTCJ4ZmE6Y29udGVudFR5cGUiLCB3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLlNldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBwWE1MRGF0YUVsZW1lbnQtPkdldFN0cmluZygoRlhfTFBDV1NUUilMImhyZWYiLCB3c0hyZWYpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3NIcmVmLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5TZXRIcmVmKHdzSHJlZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCisgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBpdGVtczsNCisgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+R2V0Tm9kZUxpc3QoaXRlbXMpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50cyA9IGl0ZW1zLkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpQ291bnRzID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzTm9ybWFpbGl6ZVZhbHVlLkVtcHR5KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJdGVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnRzOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0tPlRyeUNvbnRlbnQod3NJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NJdGVtID0gKGlDb3VudHMgPT0gMSkgPyB3c0l0ZW0gOiB3c0l0ZW0gKyBGWF9XU1RSQyhMIlxuIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTm9ybWFpbGl6ZVZhbHVlICs9IHdzSXRlbTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FeERhdGEgZXhEYXRhID0gZGVmVmFsdWUuR2V0RXhEYXRhKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGV4RGF0YSAhPSBOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBleERhdGEuU2V0Q29udGVudFR5cGUoKGlDb3VudHMgPT0gMSkgPyBGWF9XU1RSQyhMInRleHQvcGxhaW4iKSA6IEZYX1dTVFJDKEwidGV4dC94bWwiKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX0V4RGF0YSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246DQorICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfVGV4dCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOiB7DQorICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKHdzTm9ybWFpbGl6ZVZhbHVlLCBiTm90aWZ5LCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KKyAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX0RhdGVUaW1lKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICAgICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICAgICAgICAgICAgICAgICAgICBpZih3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPk5vcm1hbGl6ZU51bVN0cih3c05vcm1haWxpemVWYWx1ZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzTm9ybWFpbGl6ZVZhbHVlID0gd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX0Zsb2F0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQ6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0dldEdsb2JhbEJpbmRpbmcoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9EV09SRCBkd05hbWVIYXNoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIHBEb2N1bWVudC0+bV9yZ0dsb2JhbEJpbmRpbmcuTG9va3VwKGR3TmFtZUhhc2gsIHBOb2RlKTsNCisgICAgcmV0dXJuIHBOb2RlOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0RXT1JEIGR3TmFtZUhhc2gsIENYRkFfTm9kZSogcERhdGFOb2RlKQ0KK3sNCisgICAgcERvY3VtZW50LT5tX3JnR2xvYmFsQmluZGluZy5TZXRBdChkd05hbWVIYXNoLCBwRGF0YU5vZGUpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0NsZWFyR2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorew0KKyAgICBwRG9jdW1lbnQtPm1fcmdHbG9iYWxCaW5kaW5nLlJlbW92ZUFsbCgpOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX1Njb3BlTWF0Y2hHbG9iYWxCaW5kaW5nKENYRkFfTm9kZSogcERhdGFTY29wZSwgRlhfRFdPUkQgZHdOYW1lSGFzaCwgWEZBX0VMRU1FTlQgZU1hdGNoRGF0YU5vZGVUeXBlLCBGWF9CT09MIGJVcExldmVsID0gVFJVRSkNCit7DQorICAgIGZvcihDWEZBX05vZGUgKnBDdXJEYXRhU2NvcGUgPSBwRGF0YVNjb3BlLCAqcExhc3REYXRhU2NvcGUgPSBOVUxMOw0KKyAgICAgICAgICAgIHBDdXJEYXRhU2NvcGUgJiYgcEN1ckRhdGFTY29wZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzOw0KKyAgICAgICAgICAgIHBMYXN0RGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZSwgcEN1ckRhdGFTY29wZSA9IHBDdXJEYXRhU2NvcGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0gcEN1ckRhdGFTY29wZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKTsgcERhdGFDaGlsZDsgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoZHdOYW1lSGFzaCkpIHsNCisgICAgICAgICAgICBpZihwRGF0YUNoaWxkID09IHBMYXN0RGF0YVNjb3BlIHx8IChlTWF0Y2hEYXRhTm9kZVR5cGUgIT0gWEZBX0VMRU1FTlRfRGF0YU1vZGVsICYmIHBEYXRhQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBlTWF0Y2hEYXRhTm9kZVR5cGUpIHx8IHBEYXRhQ2hpbGQtPkhhc0JpbmRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBwRGF0YUNoaWxkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBDdXJEYXRhU2NvcGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7IHBEYXRhQ2hpbGQ7IHBEYXRhQ2hpbGQgPSBwRGF0YUNoaWxkLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9EYXRhR3JvdXApKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBYRkFfRGF0YU1lcmdlX1Njb3BlTWF0Y2hHbG9iYWxCaW5kaW5nKHBEYXRhQ2hpbGQsIGR3TmFtZUhhc2gsIGVNYXRjaERhdGFOb2RlVHlwZSwgRkFMU0UpOw0KKyAgICAgICAgICAgIGlmKHBEYXRhTm9kZSkJew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcERhdGFOb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKCFiVXBMZXZlbCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRHbG9iYWxEYXRhTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nQyB3c05hbWUsIENYRkFfTm9kZSogcERhdGFTY29wZSwgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGUpDQorew0KKyAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIGlmIChkd05hbWVIYXNoICE9IDApIHsNCisgICAgICAgIENYRkFfTm9kZSAqcEJvdW5kZWQgPSBYRkFfRGF0YU1lcmdlX0dldEdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBkd05hbWVIYXNoKTsNCisgICAgICAgIGlmKCFwQm91bmRlZCkgew0KKyAgICAgICAgICAgIHBCb3VuZGVkID0gWEZBX0RhdGFNZXJnZV9TY29wZU1hdGNoR2xvYmFsQmluZGluZyhwRGF0YVNjb3BlLCBkd05hbWVIYXNoLCBlTWF0Y2hOb2RlVHlwZSk7DQorICAgICAgICAgICAgaWYocEJvdW5kZWQpIHsNCisgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWdpc3Rlckdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBkd05hbWVIYXNoLCBwQm91bmRlZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBCb3VuZGVkOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRPbmNlRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIFhGQV9FTEVNRU5UIGVNYXRjaE5vZGVUeXBlKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHdzTmFtZS5Jc0VtcHR5KCkgPyAwIDogRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAoZHdOYW1lSGFzaCAhPSAwKSB7DQorICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwQ3VyRGF0YVNjb3BlID0gcERhdGFTY29wZSwgKnBMYXN0RGF0YVNjb3BlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZSAmJiBwQ3VyRGF0YVNjb3BlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHM7DQorICAgICAgICAgICAgICAgIHBMYXN0RGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZSwgcEN1ckRhdGFTY29wZSA9IHBDdXJEYXRhU2NvcGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgICAgICAgICAgZm9yKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBDdXJEYXRhU2NvcGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCk7IHBEYXRhQ2hpbGQ7IHBEYXRhQ2hpbGQgPSBwRGF0YUNoaWxkLT5HZXROZXh0U2FtZU5hbWVTaWJsaW5nKGR3TmFtZUhhc2gpKSB7DQorICAgICAgICAgICAgICAgIGlmKHBEYXRhQ2hpbGQgPT0gcExhc3REYXRhU2NvcGUgfHwgKGVNYXRjaE5vZGVUeXBlICE9IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCAmJiBwRGF0YUNoaWxkLT5HZXRDbGFzc0lEKCkgIT0gZU1hdGNoTm9kZVR5cGUpIHx8IHBEYXRhQ2hpbGQtPkhhc0JpbmRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwRGF0YUNoaWxkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVJlZkRhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIFhGQV9FTEVNRU5UIGVNYXRjaE5vZGVUeXBlLCBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIEZYX0JPT0wgYkZvcmNlQmluZCwgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpDQorew0KKyAgICBGWF9EV09SRCBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfQmluZE5ldzsNCisgICAgaWYgKGJVcExldmVsIHx8IHdzUmVmICE9IEZYX1dTVFJDKEwibmFtZSIpKSB7DQorICAgICAgICBkRmxhZ3MgfD0gKFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpOw0KKyAgICB9DQorICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCisgICAgcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKHBEYXRhU2NvcGUsIHdzUmVmLCBycywgZEZsYWdzLCBwVGVtcGxhdGVOb2RlKTsNCisgICAgaWYgKHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsIHx8IHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsIHx8IHJzLm5vZGVzLkdldFNpemUoKSA+IDEpIHsNCisgICAgICAgIHJldHVybiBwRG9jdW1lbnQtPkdldE5vdEJpbmROb2RlKHJzLm5vZGVzKTsNCisgICAgfSBlbHNlIGlmIChycy5kd0ZsYWdzID09IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZSkgew0KKyAgICAgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAocnMubm9kZXMuR2V0U2l6ZSgpID4gMCkgPyBycy5ub2Rlc1swXSA6IE5VTEw7DQorICAgICAgICBDWEZBX05vZGUgKnBOb2RlID0gKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQorICAgICAgICBpZiAoIWJGb3JjZUJpbmQgJiYgKHBOb2RlICE9IE5VTEwpICYmIHBOb2RlLT5IYXNCaW5kSXRlbSgpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIFhGQV9FTEVNRU5UIGVDbGFzc0lELCBGWF9EV09SRCBkd05hbWVIYXNoLCBDWEZBX05vZGUqIHBGb3JtUGFyZW50KQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0gcEZvcm1QYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgZm9yKDsgcEZvcm1DaGlsZDsgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmKHBGb3JtQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBlQ2xhc3NJRCAmJiBwRm9ybUNoaWxkLT5HZXROYW1lSGFzaCgpID09IGR3TmFtZUhhc2ggJiYgcEZvcm1DaGlsZC0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gcEZvcm1DaGlsZDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX05lZWRHZW5lcmF0ZUZvcm0oQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCwgRlhfQk9PTCBiVXNlSW5zdGFuY2VNYW5hZ2VyID0gVFJVRSkNCit7DQorICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFRlbXBsYXRlQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1Byb3RvIHx8IChiVXNlSW5zdGFuY2VNYW5hZ2VyICYmIGVUeXBlID09IFhGQV9FTEVNRU5UX09jY3VyKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBGWF9CT09MIGJSZWN1cnNpdmUsIENYRkFfTm9kZUFycmF5KiBwU3ViZm9ybUFycmF5KQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRXhpc3RpbmdOb2RlID0gTlVMTDsNCisgICAgaWYgKHBTdWJmb3JtQXJyYXkgPT0gTlVMTCkgew0KKyAgICAgICAgcEV4aXN0aW5nTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKSwgcFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSwgcEZvcm1QYXJlbnQpOw0KKyAgICB9IGVsc2UgaWYgKHBTdWJmb3JtQXJyYXktPkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIHBFeGlzdGluZ05vZGUgPSBwU3ViZm9ybUFycmF5LT5HZXRBdCgwKTsNCisgICAgICAgIHBTdWJmb3JtQXJyYXktPlJlbW92ZUF0KDApOw0KKyAgICB9DQorICAgIGlmKHBFeGlzdGluZ05vZGUpIHsNCisgICAgICAgIGlmIChwU3ViZm9ybUFycmF5KSB7DQorICAgICAgICAgICAgcEZvcm1QYXJlbnQtPkluc2VydENoaWxkKHBFeGlzdGluZ05vZGUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwRXhpc3RpbmdOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwRXhpc3RpbmdOb2RlKTsNCisgICAgICAgICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBwRXhpc3RpbmdOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICBwRXhpc3RpbmdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFRlbXBsYXRlTm9kZSk7DQorICAgICAgICBpZihiUmVjdXJzaXZlICYmIHBFeGlzdGluZ05vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgaWYoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQpKSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBFeGlzdGluZ05vZGUsIHBUZW1wbGF0ZUNoaWxkLCBiUmVjdXJzaXZlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBFeGlzdGluZ05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgIHJldHVybiBwRXhpc3RpbmdOb2RlOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE5ld05vZGUgPSBwVGVtcGxhdGVOb2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKEZBTFNFKTsNCisgICAgcEZvcm1QYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBOVUxMKTsNCisgICAgaWYoYlJlY3Vyc2l2ZSkgew0KKyAgICAgICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgIGlmKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkKSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKFRSVUUpOw0KKyAgICAgICAgICAgICAgICBwTmV3Tm9kZS0+SW5zZXJ0Q2hpbGQocE5ld0NoaWxkLCBOVUxMKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBOZXdOb2RlOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUluc3RhbmNlTWFuYWdlcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENYRkFfTm9kZSogcEZvcm1QYXJlbnQsIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwgQ1hGQV9Ob2RlQXJyYXkmIHN1YmZvcm1zKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3ViZm9ybU5hbWUgPSBwVGVtcGxhdGVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0luc3RNZ3JOb2RlTmFtZSA9IEZYX1dTVFJDKEwiXyIpICsgd3NTdWJmb3JtTmFtZTsNCisgICAgRlhfRFdPUkQgZHdJbnN0TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0luc3RNZ3JOb2RlTmFtZSwgd3NJbnN0TWdyTm9kZU5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UocERvY3VtZW50LCBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIsIGR3SW5zdE5hbWVIYXNoLCBwRm9ybVBhcmVudCk7DQorICAgIGlmKHBFeGlzdGluZ05vZGUpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgZm9yKENYRkFfTm9kZSogcE5vZGUgPSBwRXhpc3RpbmdOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOyBwTm9kZTsgKSB7DQorICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUN1clR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgJiYgKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpKSB7DQorICAgICAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdOYW1lSGFzaCAhPSBwTm9kZS0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgICAgICAgIHN1YmZvcm1zLkFkZChwTm9kZSk7DQorICAgICAgICAgICAgcE5vZGUgPSBwTmV4dE5vZGU7DQorICAgICAgICB9DQorICAgICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgICAgICBwRXhpc3RpbmdOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICBwRXhpc3RpbmdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFRlbXBsYXRlTm9kZSk7DQorICAgICAgICByZXR1cm4gcEV4aXN0aW5nTm9kZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpLT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBOZXdOb2RlKTsNCisgICAgd3NJbnN0TWdyTm9kZU5hbWUgPSBGWF9XU1RSQyhMIl8iKSArIHBUZW1wbGF0ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgIHBOZXdOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzSW5zdE1nck5vZGVOYW1lKTsNCisgICAgcEZvcm1QYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBOVUxMKTsNCisgICAgcE5ld05vZGUtPlNldFRlbXBsYXRlTm9kZShwVGVtcGxhdGVOb2RlKTsNCisgICAgcmV0dXJuIHBOZXdOb2RlOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRNYXRjaGluZ0RhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wmIGJBY2Nlc3NlZERhdGFET00sIEZYX0JPT0wgYkZvcmNlQmluZCwgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiogcEl0ZXJhdG9yLCBGWF9CT09MJiBiU2VsZk1hdGNoLCBYRkFfQVRUUklCVVRFRU5VTSYgZUJpbmRNYXRjaCwgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpDQorew0KKyAgICBGWF9CT09MIGJPd25JdGVyYXRvciA9IEZBTFNFOw0KKyAgICBpZighcEl0ZXJhdG9yKSB7DQorICAgICAgICBiT3duSXRlcmF0b3IgPSBUUlVFOw0KKyAgICAgICAgcEl0ZXJhdG9yID0gRlhfTkVXIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4ocFRlbXBsYXRlTm9kZSk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUmVzdWx0ID0gTlVMTDsNCisgICAgZm9yKENYRkFfTm9kZSogcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+R2V0Q3VycmVudCgpOyBwQ3VyVGVtcGxhdGVOb2RlOyApIHsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVNYXRjaE5vZGVUeXBlOw0KKyAgICAgICAgc3dpdGNoKHBDdXJUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgICAgICAgICAgICAgZU1hdGNoTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXA7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCisgICAgICAgICAgICAgICAgICAgIGVNYXRjaE5vZGVUeXBlID0gWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3gocEN1clRlbXBsYXRlTm9kZSkgPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgICAgICAgICAgICAgIGVNYXRjaE5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlT2NjdXIgPSBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgICAgICBGWF9JTlQzMiBpTWluLCBpTWF4LCBpSW5pdDsNCisgICAgICAgIGlmKHBUZW1wbGF0ZU5vZGVPY2N1ciAmJiBYRkFfR2V0T2NjdXJJbmZvKHBUZW1wbGF0ZU5vZGVPY2N1ciwgaU1pbiwgaU1heCwgaUluaXQpICYmIGlNYXggPT0gMCkgew0KKyAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZUJpbmQgPSBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9CaW5kKTsNCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVNYXRjaCA9IHBUZW1wbGF0ZU5vZGVCaW5kID8gcFRlbXBsYXRlTm9kZUJpbmQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCkgOiBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOw0KKyAgICAgICAgZUJpbmRNYXRjaCA9IGVNYXRjaDsNCisgICAgICAgIHN3aXRjaChlTWF0Y2gpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9HbG9iYWw6DQorICAgICAgICAgICAgICAgIGJBY2Nlc3NlZERhdGFET00gPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBpZighYkZvcmNlQmluZCkgew0KKyAgICAgICAgICAgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKGVNYXRjaE5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSB8fCAoZU1hdGNoTm9kZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwICYmIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHBUZW1wbGF0ZU5vZGVCaW5kKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEdsb2JhbEJpbmROb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kR2xvYmFsRGF0YU5vZGUocERvY3VtZW50LCBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpLCBwRGF0YVNjb3BlLCBlTWF0Y2hOb2RlVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICBpZighcEdsb2JhbEJpbmROb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcFJlc3VsdCA9IHBHbG9iYWxCaW5kTm9kZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOiB7DQorICAgICAgICAgICAgICAgICAgICBiQWNjZXNzZWREYXRhRE9NID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE9uY2VCaW5kTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZE9uY2VEYXRhTm9kZShwRG9jdW1lbnQsIHBDdXJUZW1wbGF0ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSksIHBEYXRhU2NvcGUsIGVNYXRjaE5vZGVUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKCFwT25jZUJpbmROb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcFJlc3VsdCA9IHBPbmNlQmluZE5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmOiB7DQorICAgICAgICAgICAgICAgICAgICBiQWNjZXNzZWREYXRhRE9NID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFSZWZCaW5kTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFSZWZEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZiksIHBEYXRhU2NvcGUsIGVNYXRjaE5vZGVUeXBlLCBwVGVtcGxhdGVOb2RlLCBiRm9yY2VCaW5kLCBiVXBMZXZlbCk7DQorICAgICAgICAgICAgICAgICAgICBpZihwRGF0YVJlZkJpbmROb2RlICYmIHBEYXRhUmVmQmluZE5vZGUtPkdldENsYXNzSUQoKSA9PSBlTWF0Y2hOb2RlVHlwZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXN1bHQgPSBwRGF0YVJlZkJpbmROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXBSZXN1bHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZihwQ3VyVGVtcGxhdGVOb2RlID09IHBUZW1wbGF0ZU5vZGUgJiYgcFJlc3VsdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgYlNlbGZNYXRjaCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZihiT3duSXRlcmF0b3IpIHsNCisgICAgICAgIGRlbGV0ZSBwSXRlcmF0b3I7DQorICAgIH0NCisgICAgcmV0dXJuIHBSZXN1bHQ7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfU29ydFJlY3Vyc2VSZWNvcmQoQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiYgcmdSZWNvcmRzLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wgYkNob2ljZU1vZGUgPSBGQUxTRSkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHJnUmVjb3Jkcy5HZXRTaXplKCk7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZD4gcmdSZXN1bHRSZWNvcmQ7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcERhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHJnUmVjb3Jkc1tpXS5wRGF0YUNoaWxkOw0KKyAgICAgICAgICAgIGlmIChwQ2hpbGROb2RlID09IHBOb2RlKSB7DQorICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZCBzTmV3UmVjb3JkID0ge3JnUmVjb3Jkc1tpXS5wVGVtcGxhdGVDaGlsZCwgcE5vZGV9Ow0KKyAgICAgICAgICAgICAgICByZ1Jlc3VsdFJlY29yZC5BZGQoc05ld1JlY29yZCk7DQorICAgICAgICAgICAgICAgIHJnUmVjb3Jkcy5SZW1vdmVBdChpKTsNCisgICAgICAgICAgICAgICAgaUNvdW50LS07DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChiQ2hvaWNlTW9kZSAmJiByZ1Jlc3VsdFJlY29yZC5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHJnUmVzdWx0UmVjb3JkLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIGlmICghYkNob2ljZU1vZGUpIHsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkIHNOZXdSZWNvcmQgPSB7cmdSZWNvcmRzW2ldLnBUZW1wbGF0ZUNoaWxkLCByZ1JlY29yZHNbaV0ucERhdGFDaGlsZH07DQorICAgICAgICAgICAgICAgIHJnUmVzdWx0UmVjb3JkLkFkZChzTmV3UmVjb3JkKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZ1JlY29yZHMuUmVtb3ZlQWxsKCk7DQorICAgICAgICByZ1JlY29yZHMuQ29weShyZ1Jlc3VsdFJlY29yZCk7DQorICAgIH0NCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9Db3B5Q29udGFpbmVyX1N1YmZvcm1TZXQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIENYRkFfTm9kZSogcEZvcm1QYXJlbnROb2RlLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wgYk9uZUluc3RhbmNlLCBGWF9CT09MIGJEYXRhTWVyZ2UpDQorew0KKyAgICBYRkFfRUxFTUVOVAllRWxlbWVudCA9IHBUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgQ1hGQV9Ob2RlICpwT2NjdXJOb2RlID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlICpwRmlyc3RJbnN0YW5jZSA9IE5VTEw7DQorICAgIEZYX0JPT0wgYlVzZUluc3RhbmNlTWFuYWdlciA9IHBGb3JtUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0FyZWE7DQorICAgIENYRkFfTm9kZSogcEluc3RNZ3JOb2RlID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlQXJyYXkgc3ViZm9ybUFycmF5Ow0KKyAgICBDWEZBX05vZGVBcnJheSogcFNlYXJjaEFycmF5ID0gTlVMTDsNCisgICAgaWYgKCFiT25lSW5zdGFuY2UgJiYgKGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwgZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkpIHsNCisgICAgICAgIHBJbnN0TWdyTm9kZSA9IGJVc2VJbnN0YW5jZU1hbmFnZXIgPyBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUluc3RhbmNlTWFuYWdlcihwRG9jdW1lbnQsIHBGb3JtUGFyZW50Tm9kZSwgcFRlbXBsYXRlTm9kZSwgc3ViZm9ybUFycmF5KSA6IE5VTEw7DQorICAgICAgICBpZihDWEZBX05vZGUqIHBPY2N1clRlbXBsYXRlTm9kZSA9IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKSkgew0KKyAgICAgICAgICAgIHBPY2N1ck5vZGUgPSBwSW5zdE1nck5vZGUgIT0gTlVMTCA/IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEluc3RNZ3JOb2RlLCBwT2NjdXJUZW1wbGF0ZU5vZGUsIEZBTFNFKSA6IHBPY2N1clRlbXBsYXRlTm9kZTsNCisgICAgICAgIH0gZWxzZSBpZiAocEluc3RNZ3JOb2RlKSB7DQorICAgICAgICAgICAgcE9jY3VyTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgICAgICAgICAgIGlmIChwT2NjdXJOb2RlKSB7DQorICAgICAgICAgICAgICAgIHBPY2N1ck5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocEluc3RNZ3JOb2RlKSB7DQorICAgICAgICAgICAgcEluc3RNZ3JOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgICAgcFNlYXJjaEFycmF5ID0gJnN1YmZvcm1BcnJheTsNCisgICAgICAgICAgICBpZiAocEZvcm1QYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgICAgYk9uZUluc3RhbmNlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1BcnJheS5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICAgICAgICAgICAgICBwU2VhcmNoQXJyYXkgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmICgocFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSA9PSAwKSAmJiAoc3ViZm9ybUFycmF5LkdldFNpemUoKSA8IDEpKSB7DQorICAgICAgICAgICAgICAgIHBTZWFyY2hBcnJheSA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlNYXggPSAxLCBpSW5pdCA9IDEsIGlNaW4gPSAxOw0KKyAgICBpZighYk9uZUluc3RhbmNlKSB7DQorICAgICAgICBYRkFfR2V0T2NjdXJJbmZvKHBPY2N1ck5vZGUsIGlNaW4sIGlNYXgsIGlJbml0KTsNCisgICAgfQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQllUmVsYXRpb24gPSBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0ID8gcFRlbXBsYXRlTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKSA6IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWQ7DQorICAgIEZYX0lOVDMyIGlDdXJSZXBlYXRJbmRleCA9IDA7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQYXJlbnRCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgICBpZiAoYkRhdGFNZXJnZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBzTm9kZUl0ZXJhdG9yKHBUZW1wbGF0ZU5vZGUpOw0KKyAgICAgICAgRlhfQk9PTCBiQWNjZXNzZWREYXRhRE9NID0gRkFMU0U7DQorICAgICAgICBpZiAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9BcmVhKSB7DQorICAgICAgICAgICAgc05vZGVJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBDWEZBX05vZGUqPiBzdWJmb3JtTWFwQXJyYXk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgc3ViZm9ybUFycmF5Ow0KKyAgICAgICAgICAgIGZvciAoOyBpTWF4IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTWF4OyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxmTWF0Y2ggPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUJpbmRNYXRjaCA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIEZBTFNFLCAmc05vZGVJdGVyYXRvciwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCk7DQorICAgICAgICAgICAgICAgIGlmKCFwRGF0YU5vZGUgfHwgc05vZGVJdGVyYXRvci5HZXRDdXJyZW50KCkgIT0gcFRlbXBsYXRlTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZVBhcmVudEJpbmRNYXRjaCA9IGVCaW5kTWF0Y2g7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICAgICAgICAgICAgICBpZighcEZpcnN0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1Ob2RlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocFN1YmZvcm1Ob2RlLCBwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgc3ViZm9ybU1hcEFycmF5LlNldEF0KHBTdWJmb3JtTm9kZSwgcERhdGFOb2RlKTsNCisgICAgICAgICAgICAgICAgc3ViZm9ybUFycmF5LkFkZChwU3ViZm9ybU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3NpdGlvbiA9IHN1YmZvcm1NYXBBcnJheS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGlJbmRleCA9IDA7IGlJbmRleCA8IHN1YmZvcm1BcnJheS5HZXRTaXplKCk7IGlJbmRleCArKykgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtID0gc3ViZm9ybUFycmF5W2lJbmRleF07DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gKENYRkFfTm9kZSopc3ViZm9ybU1hcEFycmF5LkdldFZhbHVlQXQocFN1YmZvcm0pOw0KKyAgICAgICAgICAgICAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQsIGJVc2VJbnN0YW5jZU1hbmFnZXIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybSwgcFRlbXBsYXRlQ2hpbGQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybSwgcERhdGFOb2RlLCBGQUxTRSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHN1YmZvcm1NYXBBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoOyBpTWF4IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTWF4OyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICAgICAgICAgIEZYX0JPT0wgYlNlbGZNYXRjaCA9IEZBTFNFOw0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE9sZE5vZGUgPSBzTm9kZUl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICAgICAgICBpZighWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIEZBTFNFLCAmc05vZGVJdGVyYXRvciwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCkpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGVCaW5kTWF0Y2ggPT0gWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZiAmJiBlUGFyZW50QmluZE1hdGNoID09IFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWYpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChlUmVsYXRpb24gPT0gIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSB8fCBlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1TZXROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1TZXROb2RlKTsNCisgICAgICAgICAgICAgICAgaWYoIXBGaXJzdEluc3RhbmNlKSB7DQorICAgICAgICAgICAgICAgICAgICBwRmlyc3RJbnN0YW5jZSA9IHBTdWJmb3JtU2V0Tm9kZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQ+IHJnSXRlbU1hdGNoTGlzdDsNCisgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Ob2RlKj4gcmdJdGVtVW5tYXRjaExpc3Q7DQorICAgICAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtU2V0Tm9kZSwgcFRlbXBsYXRlQ2hpbGQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcERhdGFNYXRjaDsNCisgICAgICAgICAgICAgICAgICAgICAgICBiU2VsZk1hdGNoID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgZUJpbmRNYXRjaCA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZVJlbGF0aW9uICE9IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWQgJiYgKHBEYXRhTWF0Y2ggPSBYRkFfRGF0YU1lcmdlX0ZpbmRNYXRjaGluZ0RhdGFOb2RlKHBEb2N1bWVudCwgcFRlbXBsYXRlQ2hpbGQsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIEZBTFNFLCBOVUxMLCBiU2VsZk1hdGNoLCBlQmluZE1hdGNoKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkIHNOZXdSZWNvcmQgPSB7cFRlbXBsYXRlQ2hpbGQsIHBEYXRhTWF0Y2h9Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiU2VsZk1hdGNoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3QuSW5zZXJ0QXQoMCwgc05ld1JlY29yZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3QuQWRkKHNOZXdSZWNvcmQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdJdGVtVW5tYXRjaExpc3QuQWRkKHBUZW1wbGF0ZUNoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgc3dpdGNoKGVSZWxhdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DaG9pY2U6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHJnSXRlbU1hdGNoTGlzdC5HZXRTaXplKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1NvcnRSZWN1cnNlUmVjb3JkKHJnSXRlbU1hdGNoTGlzdCwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocmdJdGVtTWF0Y2hMaXN0WzBdLnBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsIHBEYXRhU2NvcGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJnSXRlbU1hdGNoTGlzdC5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfU29ydFJlY3Vyc2VSZWNvcmQocmdJdGVtTWF0Y2hMaXN0LCBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMCwgY291bnQgPSByZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpOyBpIDwgY291bnQ7IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHJnSXRlbU1hdGNoTGlzdFtpXS5wVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDAsIGNvdW50ID0gcmdJdGVtVW5tYXRjaExpc3QuR2V0U2l6ZSgpOyBpIDwgY291bnQ7IGkgKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocmdJdGVtVW5tYXRjaExpc3RbaV0sIHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFTY29wZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBGb3JtUGFyZW50Tm9kZSwgcFRlbXBsYXRlTm9kZSwgRkFMU0UsIHBTZWFyY2hBcnJheSk7DQorICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwU3ViZm9ybVNldE5vZGUpOw0KKyAgICAgICAgICAgICAgICBpZighcEZpcnN0SW5zdGFuY2UpIHsNCisgICAgICAgICAgICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1TZXROb2RlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtU2V0Tm9kZSwgcFRlbXBsYXRlQ2hpbGQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsIHBEYXRhU2NvcGUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoaUN1clJlcGVhdEluZGV4ID09IDAgJiYgYkFjY2Vzc2VkRGF0YURPTSA9PSBGQUxTRSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlMaW1pdCA9IGlNYXg7DQorICAgICAgICAgICAgaWYgKHBJbnN0TWdyTm9kZSAmJiBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpID09IDApIHsNCisgICAgICAgICAgICAgICAgaUxpbWl0ID0gc3ViZm9ybUFycmF5LkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgaWYgKGlMaW1pdCA8IGlNaW4pIHsNCisgICAgICAgICAgICAgICAgICAgIGlMaW1pdCA9IGlJbml0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAoOyAoaUxpbWl0IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTGltaXQpOyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICAgICAgICAgICAgICBpZiAocEluc3RNZ3JOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFNlYXJjaEFycmF5ICYmIHBTZWFyY2hBcnJheS0+R2V0U2l6ZSgpIDwgMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hBcnJheSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZighWEZBX0RhdGFNZXJnZV9GaW5kRm9ybURPTUluc3RhbmNlKHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpLCBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpLCBwRm9ybVBhcmVudE5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCisgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgIGlmKCFwRmlyc3RJbnN0YW5jZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybU5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCBiVXNlSW5zdGFuY2VNYW5hZ2VyKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1Ob2RlLCBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1Ob2RlLCBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTWluaW1hbExpbWl0ID0gaUN1clJlcGVhdEluZGV4ID09IDAgPyBpSW5pdCA6IGlNaW47DQorICAgIGZvciAoOyBpQ3VyUmVwZWF0SW5kZXggPCBpTWluaW1hbExpbWl0OyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBGb3JtUGFyZW50Tm9kZSwgcFRlbXBsYXRlTm9kZSwgRkFMU0UsIHBTZWFyY2hBcnJheSk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1TZXROb2RlKTsNCisgICAgICAgIGlmKCFwRmlyc3RJbnN0YW5jZSkgew0KKyAgICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1TZXROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiRm91bmQgPSBGQUxTRTsNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQsIGJVc2VJbnN0YW5jZU1hbmFnZXIpKSB7DQorICAgICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1TZXROb2RlLCBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgICAgICBpZihiRm91bmQgJiYgZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlLCBGQUxTRSwgYkRhdGFNZXJnZSk7DQorICAgICAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwRmlyc3RJbnN0YW5jZTsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9Db3B5Q29udGFpbmVyX0ZpZWxkKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBGWF9CT09MIGJEYXRhTWVyZ2UsIEZYX0JPT0wgYlVwTGV2ZWwgPSBUUlVFKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRmllbGROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRm9ybU5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBGaWVsZE5vZGUpOw0KKyAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGROb2RlID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZE5vZGU7IHBUZW1wbGF0ZUNoaWxkTm9kZSA9IHBUZW1wbGF0ZUNoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGROb2RlKSkgew0KKyAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZpZWxkTm9kZSwgcFRlbXBsYXRlQ2hpbGROb2RlLCBUUlVFKTsNCisgICAgICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCAmJiBwVGVtcGxhdGVDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgICAgICAgaWYgKHBUZW1wbGF0ZUNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9GaWVsZChwRG9jdW1lbnQsIHBUZW1wbGF0ZUNoaWxkTm9kZSwgcEZpZWxkTm9kZSwgTlVMTCwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihiRGF0YU1lcmdlKSB7DQorICAgICAgICBGWF9CT09MIGJBY2Nlc3NlZERhdGFET00gPSBGQUxTRTsNCisgICAgICAgIEZYX0JPT0wgYlNlbGZNYXRjaCA9IEZBTFNFOw0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUJpbmRNYXRjaDsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIFRSVUUsIE5VTEwsIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gsIGJVcExldmVsKTsNCisgICAgICAgIGlmKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZpZWxkTm9kZSwgcERhdGFOb2RlKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRmllbGROb2RlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZpZWxkTm9kZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpEYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wgYk9uZUluc3RhbmNlICwgRlhfQk9PTCBiRGF0YU1lcmdlICwgRlhfQk9PTCBiVXBMZXZlbCkNCit7DQorICAgIHN3aXRjaChwVGVtcGxhdGVOb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9TdWJmb3JtU2V0KHRoaXMsIHBUZW1wbGF0ZU5vZGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgYk9uZUluc3RhbmNlLCBiRGF0YU1lcmdlKTsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9GaWVsZCh0aGlzLCBwVGVtcGxhdGVOb2RlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIGJEYXRhTWVyZ2UsIGJVcExldmVsKTsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZVNldDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFyaWFibGVzOg0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCisjZGVmaW5lIFhGQV9EQVRBTUVSR0VfVVBEQVRFQklORElOR1JFTEFUSU9OU19ERlMNCisjaWZkZWYgWEZBX0RBVEFNRVJHRV9VUERBVEVCSU5ESU5HUkVMQVRJT05TX0RGUw0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wgYkRhdGFSZWYsIEZYX0JPT0wgYlBhcmVudERhdGFSZWYpDQorew0KKyAgICBGWF9CT09MIGJNYXRjaFJlZiA9IFRSVUU7DQorICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcEZvcm1Ob2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICBpZihlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwVGVtcGxhdGVOb2RlID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgICAgIENYRkFfTm9kZSAqcFRlbXBsYXRlTm9kZUJpbmQgPSBwVGVtcGxhdGVOb2RlID8gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQmluZCkgOiBOVUxMOw0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZU1hdGNoID0gcFRlbXBsYXRlTm9kZUJpbmQgPyBwVGVtcGxhdGVOb2RlQmluZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoKSA6IFhGQV9BVFRSSUJVVEVFTlVNX09uY2U7DQorICAgICAgICBzd2l0Y2goZU1hdGNoKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgICAgICAgICAgICBpZiAoIWJEYXRhUmVmIHx8IGJQYXJlbnREYXRhUmVmKSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQocEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX09uY2U6DQorICAgICAgICAgICAgICAgIGlmICghYkRhdGFSZWYgfHwgYlBhcmVudERhdGFSZWYpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSAhPSAwICYmIHBGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Njb3BlKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVEYXRhTm9kZVR5cGUgPSAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBYRkFfRmllbGRJc011bHRpTGlzdEJveChwRm9ybU5vZGUpKSA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cCA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKHBEb2N1bWVudCwgcERhdGFTY29wZSwgZURhdGFOb2RlVHlwZSwgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50ID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGF0YVBhcmVudCAhPSBwRGF0YVNjb3BlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YVBhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhUGFyZW50LT5SZW1vdmVDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNjb3BlLT5JbnNlcnRDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbDoNCisgICAgICAgICAgICAgICAgaWYgKCFiRGF0YVJlZiB8fCBiUGFyZW50RGF0YVJlZikgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChkd05hbWVIYXNoICE9IDAgJiYgIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIGR3TmFtZUhhc2gpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtICB8fCBYRkFfRmllbGRJc011bHRpTGlzdEJveChwRm9ybU5vZGUpKSA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cCA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUmVjb3JkTm9kZSA9IChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKHBEb2N1bWVudCwgcFJlY29yZE5vZGUsIGVEYXRhTm9kZVR5cGUsIHBGb3JtTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWdpc3Rlckdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCksIHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZjogew0KKyAgICAgICAgICAgICAgICAgICAgYk1hdGNoUmVmID0gYkRhdGFSZWY7DQorICAgICAgICAgICAgICAgICAgICBiUGFyZW50RGF0YVJlZiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSAmJiBiRGF0YVJlZikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZiA9IHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZik7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7DQorICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKHBEYXRhU2NvcGUsIHdzUmVmLCBycywgZEZsYWdzLCBwVGVtcGxhdGVOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChycy5ub2Rlcy5HZXRTaXplKCkgPiAwKSA/IHJzLm5vZGVzWzBdIDogTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPSAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc05vZGUoKSkgPyAoQ1hGQV9Ob2RlKilwT2JqZWN0IDogTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgcnMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfRXhpc3ROb2RlcyA/IFRSVUUgOiBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGJNYXRjaFJlZiAmJiAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0IHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0FyZWEgfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEgfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkpIHsNCisgICAgICAgIGZvcihDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcEZvcm1DaGlsZDsgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZihwRm9ybUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgIT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocEZvcm1DaGlsZC0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwRG9jdW1lbnQsIHBGb3JtQ2hpbGQsIHBEYXRhTm9kZSA/IHBEYXRhTm9kZSA6IHBEYXRhU2NvcGUsIGJEYXRhUmVmLCBiUGFyZW50RGF0YVJlZik7DQorICAgICAgICB9DQorICAgIH0NCit9DQorI2Vsc2UNCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBDRlhfUHRyTGlzdCYgcmdGb3JtTm9kZUxpc3QsIENGWF9QdHJMaXN0JiByZ0RhdGFTY29wZUxpc3QsIEZYX0JPT0wgYkQgX0RFQlVHDQorI2lmZGVmIF9ERUJVRw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtU09NOyBDRlhfV2lkZVN0cmluZyB3c0RhdGFTY29wZVNPTTsNCisgICAgICAgIHBGb3JtTm9kZS0+R2V0U09NRXhwcmVzc2lvbih3c0Zvcm1TT00pOyBwRGF0YVNjb3BlLT5HZXRTT01FeHByZXNzaW9uKHdzRGF0YVNjb3BlU09NKTsNCisjZW5kaWYNCisgICAgICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgICAgIGlmKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKQ0KK3sNCitDWEZBX05vZGUgKnBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICBDWEZBX05vZGUgKnBUZW1wbGF0ZU5vZGVCaW5kID0gcFRlbXBsYXRlTm9kZSA/IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0JpbmQpIDogTlVMTDsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZU1hdGNoID0gcFRlbXBsYXRlTm9kZUJpbmQgPyBwVGVtcGxhdGVOb2RlQmluZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoKSA6IFhGQV9BVFRSSUJVVEVFTlVNX09uY2U7DQorICAgIHN3aXRjaChlTWF0Y2gpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZTogew0KKyAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSAhPSAwICYmIHBGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Njb3BlKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKHBEb2N1bWVudCwgcERhdGFTY29wZSwgZURhdGFOb2RlVHlwZSwgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFQYXJlbnQgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYocERhdGFQYXJlbnQgIT0gcERhdGFTY29wZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YVBhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTY29wZS0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOiB7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICAgICAgICAgIGlmIChkd05hbWVIYXNoICE9IDAgJiYgIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9HZXRHbG9iYWxCaW5kaW5nKHBEb2N1bWVudCwgZHdOYW1lSGFzaCk7DQorICAgICAgICAgICAgICAgICAgICBpZighcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUmVjb3JkTm9kZSA9IChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPSBYRkFfRGF0YURlc2NyaXB0aW9uX01heWJlQ3JlYXRlRGF0YU5vZGUocERvY3VtZW50LCBwUmVjb3JkTm9kZSwgZURhdGFOb2RlVHlwZSwgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSwgcERhdGFOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZjogew0KKyAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmID0gcFRlbXBsYXRlTm9kZUJpbmQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfUmVmKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZTsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCisgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwRGF0YVNjb3BlLCB3c1JlZiwgcnMsIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChycy5ub2Rlcy5HZXRTaXplKCkgPiAwKSA/IHJzLm5vZGVzWzBdIDogTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZSA9IChwT2JqZWN0ICYmIHBPYmplY3QtPklzTm9kZSgpKSA/IChDWEZBX05vZGUqKXBPYmplY3QgOiBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgaWYocERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK2lmKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfQXJlYSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkNCit7DQorZm9yKENYRkFfTm9kZSogcEZvcm1DaGlsZCA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwRm9ybUNoaWxkOyBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYocEZvcm1DaGlsZC0+R2V0T2JqZWN0VHlwZSgpICE9IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHBGb3JtQ2hpbGQtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICByZ0Zvcm1Ob2RlTGlzdC5BZGRUYWlsKHBGb3JtQ2hpbGQpOw0KKyAgICAgICAgcmdEYXRhU2NvcGVMaXN0LkFkZFRhaWwocERhdGFOb2RlID8gcERhdGFOb2RlIDogcERhdGFTY29wZSk7DQorICAgIH0NCit9DQorfQ0KKyNlbmRpZg0KK0NYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKENYRkFfTm9kZSogcFBhcmVudEZvcm1Ob2RlKQ0KK3sNCisgICAgZm9yKENYRkFfTm9kZSogcFJvb3RCb3VuZE5vZGUgPSBwUGFyZW50Rm9ybU5vZGU7IHBSb290Qm91bmROb2RlICYmIHBSb290Qm91bmROb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTsgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IHBSb290Qm91bmROb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgaWYocERhdGFTY29wZSkgew0KKyAgICAgICAgICAgIHJldHVybiBwRGF0YVNjb3BlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAoQ1hGQV9Ob2RlKilwUGFyZW50Rm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGEpOw0KK30NCit2b2lkIENYRkFfRG9jdW1lbnQ6OkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKENYRkFfTm9kZSogcEZvcm1VcGRhdGVSb290KQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtVXBkYXRlUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KKyAgICBpZiAoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyNpZmRlZiBYRkFfREFUQU1FUkdFX1VQREFURUJJTkRJTkdSRUxBVElPTlNfREZTDQorICAgIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyh0aGlzLCBwRm9ybVVwZGF0ZVJvb3QsIHBEYXRhU2NvcGUsIEZBTFNFLCBGQUxTRSk7DQorICAgIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyh0aGlzLCBwRm9ybVVwZGF0ZVJvb3QsIHBEYXRhU2NvcGUsIFRSVUUsIEZBTFNFKTsNCisjZWxzZQ0KKyAgICBDRlhfUHRyTGlzdCByZ0Zvcm1Ob2RlTGlzdCwgcmdEYXRhU2NvcGVMaXN0Ow0KKyAgICByZ0Zvcm1Ob2RlTGlzdC5BZGRUYWlsKHBGb3JtVXBkYXRlUm9vdCk7DQorICAgIHJnRGF0YVNjb3BlTGlzdC5BZGRUYWlsKHBEYXRhU2NvcGUpOw0KKyAgICB3aGlsZShyZ0Zvcm1Ob2RlTGlzdC5HZXRDb3VudCgpKSB7DQorICAgICAgICBGWF9QT1NJVElPTiBwb3M7DQorICAgICAgICBwb3MgPSByZ0Zvcm1Ob2RlTGlzdC5HZXRIZWFkUG9zaXRpb24oKTsNCisgICAgICAgIENYRkFfTm9kZSAqcEN1ckZvcm1Ob2RlID0gKENYRkFfTm9kZSopcmdGb3JtTm9kZUxpc3QuR2V0QXQocG9zKTsNCisgICAgICAgIHJnRm9ybU5vZGVMaXN0LlJlbW92ZUF0KHBvcyk7DQorICAgICAgICBwb3MgPSByZ0RhdGFTY29wZUxpc3QuR2V0SGVhZFBvc2l0aW9uKCk7DQorICAgICAgICBDWEZBX05vZGUgKnBDdXJEYXRhU2NvcGUgPSAoQ1hGQV9Ob2RlKilyZ0RhdGFTY29wZUxpc3QuR2V0QXQocG9zKTsNCisgICAgICAgIHJnRGF0YVNjb3BlTGlzdC5SZW1vdmVBdChwb3MpOw0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBDdXJGb3JtTm9kZSwgcEN1ckRhdGFTY29wZSwgcmdGb3JtTm9kZUxpc3QsIHJnRGF0YVNjb3BlTGlzdCk7DQorICAgIH0NCisjZW5kaWYNCit9DQorQ1hGQV9Ob2RlICoJQ1hGQV9Eb2N1bWVudDo6R2V0Tm90QmluZE5vZGUoQ1hGQV9PYmpBcnJheSYgYXJyYXlOb2RlcykNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGFycmF5Tm9kZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gYXJyYXlOb2Rlc1tpXTsNCisgICAgICAgIGlmKCFwT2JqZWN0LT5Jc05vZGUoKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCgoQ1hGQV9Ob2RlKilwT2JqZWN0KS0+SGFzQmluZEl0ZW0oKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuICgoQ1hGQV9Ob2RlKilwT2JqZWN0KTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpEb0RhdGFNZXJnZSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZVJvb3QgPSBtX3BSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfVGVtcGxhdGUpOw0KKyAgICBDWEZBX05vZGUqIHBEYXRhc2V0c1Jvb3QgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQorICAgIGlmKCFwRGF0YXNldHNSb290KSB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBEYXRhc2V0c1hNTE5vZGUgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZShGWF9XU1RSQyhMInhmYTpkYXRhc2V0cyIpKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YXNldHNYTUxOb2RlKTsNCisgICAgICAgIHBEYXRhc2V0c1hNTE5vZGUtPlNldFN0cmluZyhGWF9XU1RSQyhMInhtbG5zOnhmYSIpLCBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpKTsNCisgICAgICAgIHBEYXRhc2V0c1Jvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCk7DQorICAgICAgICBwRGF0YXNldHNSb290LT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwiZGF0YXNldHMiKSk7DQorICAgICAgICBtX3BSb290Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKS0+SW5zZXJ0Q2hpbGROb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KKyAgICAgICAgbV9wUm9vdE5vZGUtPkluc2VydENoaWxkKHBEYXRhc2V0c1Jvb3QpOw0KKyAgICAgICAgcERhdGFzZXRzUm9vdC0+U2V0WE1MTWFwcGluZ05vZGUocERhdGFzZXRzWE1MTm9kZSk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlICpwRGF0YVJvb3QgPSBOVUxMLCAqcEREUm9vdCA9IE5VTEw7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YXNldHNVUkk7DQorICAgIHBEYXRhc2V0c1Jvb3QtPlRyeU5hbWVzcGFjZSh3c0RhdGFzZXRzVVJJKTsNCisgICAgZm9yKENYRkFfTm9kZSAqcENoaWxkTm9kZSA9IHBEYXRhc2V0c1Jvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENoaWxkTm9kZTsgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmKHBDaGlsZE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KKyAgICAgICAgaWYoIXBERFJvb3QgJiYgcENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uKSB7DQorICAgICAgICAgICAgaWYoIXBDaGlsZE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZVVSSSkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHdzTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQorICAgICAgICAgICAgICAgIHBERFJvb3QgPSBwQ2hpbGROb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZighcERhdGFSb290ICYmIHBDaGlsZE5vZGUtPkdldE5hbWVIYXNoKCkgPT0gWEZBX0hBU0hDT0RFX0RhdGEpIHsNCisgICAgICAgICAgICBpZighcENoaWxkTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlVVJJKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYod3NOYW1lc3BhY2VVUkkgPT0gd3NEYXRhc2V0c1VSSSkgew0KKyAgICAgICAgICAgICAgICBwRGF0YVJvb3QgPSBwQ2hpbGROb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKHBEYXRhUm9vdCAmJiBwRERSb290KSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYoIXBEYXRhUm9vdCkgew0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRGF0YVJvb3RYTUxOb2RlID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoRlhfV1NUUkMoTCJ4ZmE6ZGF0YSIpKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YVJvb3RYTUxOb2RlKTsNCisgICAgICAgIHBEYXRhUm9vdCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgICAgIHBEYXRhUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImRhdGEiKSk7DQorICAgICAgICBwRGF0YVJvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhUm9vdFhNTE5vZGUpOw0KKyAgICAgICAgcERhdGFzZXRzUm9vdC0+SW5zZXJ0Q2hpbGQocERhdGFSb290KTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBEYXRhVG9wTGV2ZWwgPSBwRGF0YVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRGF0YVRvcExldmVsID8gcERhdGFUb3BMZXZlbC0+R2V0TmFtZUhhc2goKSA6IDA7DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlQ2hvc2VuID0gZHdOYW1lSGFzaCAhPSAwID8gcFRlbXBsYXRlUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKSA6IE5VTEw7DQorICAgIGlmKCFwVGVtcGxhdGVDaG9zZW4gfHwgcFRlbXBsYXRlQ2hvc2VuLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgcFRlbXBsYXRlQ2hvc2VuID0gcFRlbXBsYXRlUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgIH0NCisgICAgaWYoIXBUZW1wbGF0ZUNob3Nlbikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEZvcm1Sb290ID0gbV9wUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0Zvcm0pOw0KKyAgICBGWF9CT09MIGJFbXB0eUZvcm0gPSBGQUxTRTsNCisgICAgaWYoIXBGb3JtUm9vdCkgew0KKyAgICAgICAgYkVtcHR5Rm9ybSA9IFRSVUU7DQorICAgICAgICBwRm9ybVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX0VMRU1FTlRfRm9ybSk7DQorICAgICAgICBGWFNZU19hc3NlcnQocEZvcm1Sb290KTsNCisgICAgICAgIHBGb3JtUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImZvcm0iKSk7DQorICAgICAgICBtX3BSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocEZvcm1Sb290LCBOVUxMKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gc0l0ZXJhdG9yKHBGb3JtUm9vdCk7DQorICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcih0aGlzLCBwRm9ybVJvb3QsIHBUZW1wbGF0ZUNob3NlbiwgRkFMU0UpOw0KKyAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1TZXROb2RlKTsNCisgICAgaWYgKCFwRGF0YVRvcExldmVsKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NGb3JtTmFtZSA9IHBTdWJmb3JtU2V0Tm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVRvcExldmVsTmFtZSA9IHdzRm9ybU5hbWUuSXNFbXB0eSgpID8gRlhfV1NUUkMoTCJmb3JtIikgOiB3c0Zvcm1OYW1lOw0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRGF0YVRvcExldmVsWE1MTm9kZSA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKHdzRGF0YVRvcExldmVsTmFtZSk7DQorICAgICAgICBGWFNZU19hc3NlcnQocERhdGFUb3BMZXZlbFhNTE5vZGUpOw0KKyAgICAgICAgcERhdGFUb3BMZXZlbCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgICAgIHBEYXRhVG9wTGV2ZWwtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NEYXRhVG9wTGV2ZWxOYW1lKTsNCisgICAgICAgIHBEYXRhVG9wTGV2ZWwtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhVG9wTGV2ZWxYTUxOb2RlKTsNCisgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZU5vZGUgPSBwRGF0YVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIHBEYXRhUm9vdC0+SW5zZXJ0Q2hpbGQocERhdGFUb3BMZXZlbCwgcEJlZm9yZU5vZGUpOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwRGF0YVRvcExldmVsKTsNCisgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwU3ViZm9ybVNldE5vZGUsIHBEYXRhVG9wTGV2ZWwpOw0KKyAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaG9zZW4tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCkpIHsNCisgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcih0aGlzLCBwU3ViZm9ybVNldE5vZGUsIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCisgICAgICAgIH0gZWxzZSBpZihwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICBEYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVRvcExldmVsKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihwRERSb290KSB7DQorICAgICAgICBYRkFfRGF0YURlc2NyaXB0aW9uX1VwZGF0ZURhdGFSZWxhdGlvbihwRGF0YVJvb3QsIHBERFJvb3QpOw0KKyAgICB9DQorICAgIERhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBTdWJmb3JtU2V0Tm9kZSk7DQorICAgIENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0gcFN1YmZvcm1TZXROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCisgICAgd2hpbGUgKHBQYWdlU2V0Tm9kZSkgew0KKyAgICAgICAgbV9wUGVuZGluZ1BhZ2VTZXQuQWRkKHBQYWdlU2V0Tm9kZSk7DQorICAgICAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldE5vZGUgPSBwUGFnZVNldE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICAgICAgcFN1YmZvcm1TZXROb2RlLT5SZW1vdmVDaGlsZChwUGFnZVNldE5vZGUpOw0KKyAgICAgICAgcFBhZ2VTZXROb2RlID0gcE5leHRQYWdlU2V0Tm9kZTsNCisgICAgfQ0KKyAgICBpZighYkVtcHR5Rm9ybSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IocEZvcm1Sb290KTsNCisgICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgd2hpbGUocE5vZGUpIHsNCisgICAgICAgICAgICBpZihwTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgaWYocE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlIHx8IHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXh0ID0gc0l0ZXJhdG9yLlNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKTsNCisgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwTmV4dDsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfRG9jdW1lbnQ6OkRvRGF0YVJlbWVyZ2UoRlhfQk9PTCBiRG9EYXRhTWVyZ2UpDQorew0KKyAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IChDWEZBX05vZGUqKXRoaXMtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICBpZihwRm9ybVJvb3QpIHsNCisgICAgICAgIHdoaWxlKENYRkFfTm9kZSogcE5vZGUgPSBwRm9ybVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgICAgICAgIHBGb3JtUm9vdC0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEZvcm1Sb290LT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICAgIH0NCisgICAgWEZBX0RhdGFNZXJnZV9DbGVhckdsb2JhbEJpbmRpbmcodGhpcyk7DQorICAgIGlmIChiRG9EYXRhTWVyZ2UpIHsNCisgICAgICAgIERvRGF0YU1lcmdlKCk7DQorICAgIH0NCisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IgPSBHZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgcExheW91dFByb2Nlc3Nvci0+U2V0Rm9yY2VSZUxheW91dChUUlVFKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdiYzVhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRE9DVU1FTlRfREFUQU1FUkdFUl9JTVBfSF8NCisjZGVmaW5lIF9YRkFfRE9DVU1FTlRfREFUQU1FUkdFUl9JTVBfSF8NCitDWEZBX05vZGUqIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBGWF9CT09MIGJSZWN1cnNpdmUsIENYRkFfTm9kZUFycmF5KiBwU3ViZm9ybUFycmF5ID0gTlVMTCk7DQorQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUoQ1hGQV9Ob2RlKiBwUGFyZW50Rm9ybU5vZGUpOw0KK0NYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRm9ybURPTUluc3RhbmNlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgWEZBX0VMRU1FTlQgZUNsYXNzSUQsIEZYX0RXT1JEIGR3TmFtZUhhc2gsIENYRkFfTm9kZSogcEZvcm1QYXJlbnQpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxZmY5OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9pbXAuY3BwCkBAIC0wLDAgKzEsNDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9iYXNpY19pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9kYXRhd2luZG93LmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIg0KK0NYRkFfRG9jdW1lbnQ6OkNYRkFfRG9jdW1lbnQoSVhGQV9Eb2NQYXJzZXIgKnBQYXJzZXIpDQorICAgIDogbV9wUGFyc2VyKHBQYXJzZXIpDQorICAgICwgbV9wTGF5b3V0UHJvY2Vzc29yKE5VTEwpDQorICAgICwgbV9wUm9vdE5vZGUoTlVMTCkNCisgICAgLCBtX3BTY3JpcHRDb250ZXh0KE5VTEwpDQorICAgICwgbV9wTG9jYWxNZ3IoTlVMTCkNCisgICAgLCBtX3BTY3JpcHREYXRhV2luZG93KE5VTEwpDQorICAgICwgbV9wU2NyaXB0RXZlbnQoTlVMTCkNCisgICAgLCBtX3BTY3JpcHRIb3N0KE5VTEwpDQorICAgICwgbV9wU2NyaXB0TG9nKE5VTEwpDQorICAgICwgbV9wU2NyaXB0TGF5b3V0KE5VTEwpDQorICAgICwgbV9wU2NyaXB0U2lnbmF0dXJlKE5VTEwpDQorICAgICwgbV9kd0RvY0ZsYWdzKDApDQorICAgICwgbV9lQ3VyVmVyc2lvbk1vZGUoWEZBX1ZFUlNJT05fREVGQVVMVCkNCit7DQorICAgIEFTU0VSVChtX3BQYXJzZXIpOw0KK30NCitDWEZBX0RvY3VtZW50Ojp+Q1hGQV9Eb2N1bWVudCgpDQorew0KKyAgICBpZiAobV9wUm9vdE5vZGUpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BSb290Tm9kZTsNCisgICAgfQ0KKyAgICBQdXJnZU5vZGVzKCk7DQorfQ0KK3ZvaWQgQ1hGQV9Eb2N1bWVudDo6Q2xlYXJMYXlvdXREYXRhKCkNCit7DQorICAgIGlmKG1fcExheW91dFByb2Nlc3Nvcikgew0KKyAgICAgICAgZGVsZXRlIG1fcExheW91dFByb2Nlc3NvcjsNCisgICAgICAgIG1fcExheW91dFByb2Nlc3NvciA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIG1fcFNjcmlwdENvbnRleHQtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcFNjcmlwdENvbnRleHQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChtX3BMb2NhbE1ncikgew0KKyAgICAgICAgZGVsZXRlIG1fcExvY2FsTWdyOw0KKyAgICAgICAgbV9wTG9jYWxNZ3IgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcFNjcmlwdERhdGFXaW5kb3cpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BTY3JpcHREYXRhV2luZG93Ow0KKyAgICAgICAgbV9wU2NyaXB0RGF0YVdpbmRvdyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYobV9wU2NyaXB0RXZlbnQpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BTY3JpcHRFdmVudDsNCisgICAgICAgIG1fcFNjcmlwdEV2ZW50ID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wU2NyaXB0SG9zdCkgew0KKyAgICAgICAgZGVsZXRlIG1fcFNjcmlwdEhvc3Q7DQorICAgICAgICBtX3BTY3JpcHRIb3N0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wU2NyaXB0TG9nKSB7DQorICAgICAgICBkZWxldGUgbV9wU2NyaXB0TG9nOw0KKyAgICAgICAgbV9wU2NyaXB0TG9nID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX3BTY3JpcHRMYXlvdXQpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BTY3JpcHRMYXlvdXQ7DQorICAgICAgICBtX3BTY3JpcHRMYXlvdXQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcFNjcmlwdFNpZ25hdHVyZSkgew0KKyAgICAgICAgZGVsZXRlIG1fcFNjcmlwdFNpZ25hdHVyZTsNCisgICAgICAgIG1fcFNjcmlwdFNpZ25hdHVyZSA9IE5VTEw7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpTZXRSb290KENYRkFfTm9kZSogcE5ld1Jvb3QpDQorew0KKyAgICBpZihtX3BSb290Tm9kZSkgew0KKyAgICAgICAgQWRkUHVyZ2VOb2RlKG1fcFJvb3ROb2RlKTsNCisgICAgfQ0KKyAgICBtX3BSb290Tm9kZSA9IHBOZXdSb290Ow0KKyAgICBSZW1vdmVQdXJnZU5vZGUocE5ld1Jvb3QpOw0KK30NCitJWEZBX05vdGlmeSogQ1hGQV9Eb2N1bWVudDo6R2V0Tm90aWZ5KCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BQYXJzZXItPkdldE5vdGlmeSgpOw0KK30NCitDWEZBX09iamVjdCogQ1hGQV9Eb2N1bWVudDo6R2V0WEZBTm9kZShGWF9XU1RSIHdzTm9kZU5hbWUpDQorew0KKyAgICByZXR1cm4gR2V0WEZBTm9kZShGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05vZGVOYW1lLkdldFB0cigpLCB3c05vZGVOYW1lLkdldExlbmd0aCgpKSk7DQorfQ0KK0NYRkFfT2JqZWN0KiBDWEZBX0RvY3VtZW50OjpHZXRYRkFOb2RlKEZYX0RXT1JEIGR3Tm9kZU5hbWVIYXNoKQ0KK3sNCisgICAgc3dpdGNoKGR3Tm9kZU5hbWVIYXNoKSB7DQorICAgICAgICBjYXNlIFhGQV9IQVNIQ09ERV9EYXRhOiB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFzZXRzTm9kZSA9IChDWEZBX05vZGUqKUdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgICAgICAgICAgICAgICAgaWYoIXBEYXRhc2V0c05vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwRGF0YXNldHNDaGlsZCA9IHBEYXRhc2V0c05vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7IHBEYXRhc2V0c0NoaWxkOyBwRGF0YXNldHNDaGlsZCA9IHBEYXRhc2V0c0NoaWxkLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9EYXRhR3JvdXApKSB7DQorICAgICAgICAgICAgICAgICAgICBpZihwRGF0YXNldHNDaGlsZC0+R2V0TmFtZUhhc2goKSAhPSBYRkFfSEFTSENPREVfRGF0YSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgICAgICAgICAgICAgICAgICBpZighcERhdGFzZXRzQ2hpbGQtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZVVSSSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YXNldHNVUkk7DQorICAgICAgICAgICAgICAgICAgICBpZighcERhdGFzZXRzTm9kZS0+VHJ5TmFtZXNwYWNlKHdzRGF0YXNldHNVUkkpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZih3c05hbWVzcGFjZVVSSSA9PSB3c0RhdGFzZXRzVVJJKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBEYXRhc2V0c0NoaWxkOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgY2FzZSBYRkFfSEFTSENPREVfUmVjb3JkOiB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGEgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBEYXRhID8gcERhdGEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgOiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX0hBU0hDT0RFX0RhdGFXaW5kb3c6IHsNCisgICAgICAgICAgICAgICAgaWYobV9wU2NyaXB0RGF0YVdpbmRvdyA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BTY3JpcHREYXRhV2luZG93ID0gRlhfTkVXIENTY3JpcHRfRGF0YVdpbmRvdyh0aGlzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wU2NyaXB0RGF0YVdpbmRvdzsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9IQVNIQ09ERV9FdmVudDogew0KKyAgICAgICAgICAgICAgICBpZihtX3BTY3JpcHRFdmVudCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BTY3JpcHRFdmVudCA9IEZYX05FVyBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwodGhpcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcFNjcmlwdEV2ZW50Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX0hBU0hDT0RFX0hvc3Q6IHsNCisgICAgICAgICAgICAgICAgaWYobV9wU2NyaXB0SG9zdCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BTY3JpcHRIb3N0ID0gRlhfTkVXIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsKHRoaXMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3BTY3JpcHRIb3N0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX0hBU0hDT0RFX0xvZzogew0KKyAgICAgICAgICAgICAgICBpZiAobV9wU2NyaXB0TG9nID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcFNjcmlwdExvZyA9IEZYX05FVyBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsKHRoaXMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBtX3BTY3JpcHRMb2c7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBYRkFfSEFTSENPREVfU2lnbmF0dXJlOiB7DQorICAgICAgICAgICAgICAgIGlmKG1fcFNjcmlwdFNpZ25hdHVyZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BTY3JpcHRTaWduYXR1cmUgPSBGWF9ORVcgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCh0aGlzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wU2NyaXB0U2lnbmF0dXJlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX0hBU0hDT0RFX0xheW91dDogew0KKyAgICAgICAgICAgICAgICBpZihtX3BTY3JpcHRMYXlvdXQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wU2NyaXB0TGF5b3V0ID0gRlhfTkVXIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwodGhpcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcFNjcmlwdExheW91dDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBtX3BSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05vZGVOYW1lSGFzaCk7DQorICAgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpDcmVhdGVOb2RlKEZYX0RXT1JEIGR3UGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkNCit7DQorICAgIFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXQgPSBYRkFfR2V0UGFja2V0QnlJRChkd1BhY2tldCk7DQorICAgIHJldHVybiBDcmVhdGVOb2RlKHBQYWNrZXQsIGVFbGVtZW50KTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpDcmVhdGVOb2RlKFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KQ0KK3sNCisgICAgaWYgKHBQYWNrZXQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKGVFbGVtZW50KTsNCisgICAgaWYgKHBFbGVtZW50ICYmIChwRWxlbWVudC0+ZHdQYWNrZXRzICYgcFBhY2tldC0+ZU5hbWUpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gRlhfTkVXIENYRkFfTm9kZSh0aGlzLCBwUGFja2V0LT5lTmFtZSwgcEVsZW1lbnQtPmVOYW1lKTsNCisgICAgICAgIGlmKHBOb2RlKSB7DQorICAgICAgICAgICAgQWRkUHVyZ2VOb2RlKHBOb2RlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpBZGRQdXJnZU5vZGUoQ1hGQV9Ob2RlICpwTm9kZSkNCit7DQorICAgIG1fcmdQdXJnZU5vZGVzLkFkZChwTm9kZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Eb2N1bWVudDo6UmVtb3ZlUHVyZ2VOb2RlKENYRkFfTm9kZSAqcE5vZGUpDQorew0KKyAgICByZXR1cm4gbV9yZ1B1cmdlTm9kZXMuUmVtb3ZlS2V5KHBOb2RlKTsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpQdXJnZU5vZGVzKCkNCit7DQorICAgIEZYX1BPU0lUSU9OIHBzTm9kZSA9IG1fcmdQdXJnZU5vZGVzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUocHNOb2RlKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlOw0KKyAgICAgICAgbV9yZ1B1cmdlTm9kZXMuR2V0TmV4dEFzc29jKHBzTm9kZSwgcE5vZGUpOw0KKyAgICAgICAgZGVsZXRlIHBOb2RlOw0KKyAgICB9DQorICAgIG1fcmdQdXJnZU5vZGVzLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENYRkFfRG9jdW1lbnQ6OlNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiApDQorew0KKyAgICBpZiAoYk9uKSB7DQorICAgICAgICBtX2R3RG9jRmxhZ3MgfD0gZHdGbGFnOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9kd0RvY0ZsYWdzICY9IH5kd0ZsYWc7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0RvY3VtZW50OjpJc0ludGVyYWN0aXZlKCkNCit7DQorICAgIGlmIChtX2R3RG9jRmxhZ3MgJiBYRkFfRE9DRkxBR19IYXNJbnRlcmFjdGl2ZSkgew0KKyAgICAgICAgcmV0dXJuIG1fZHdEb2NGbGFncyAmIFhGQV9ET0NGTEFHX0ludGVyYWN0aXZlOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKXRoaXMtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQorICAgIGlmICghcENvbmZpZykgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzSW50ZXJhY3RpdmU7DQorICAgIENYRkFfTm9kZSogcFByZXNlbnQgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QcmVzZW50KTsNCisgICAgaWYgKCFwUHJlc2VudCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFBERiA9IHBQcmVzZW50LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QZGYpOw0KKyAgICBpZiAoIXBQREYpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBJbnRlcmFjdGl2ZSA9IHBQREYtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ludGVyYWN0aXZlKTsNCisgICAgaWYgKHBJbnRlcmFjdGl2ZSkgew0KKyAgICAgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlOw0KKyAgICAgICAgaWYgKHBJbnRlcmFjdGl2ZS0+VHJ5Q29udGVudCh3c0ludGVyYWN0aXZlKSAmJiB3c0ludGVyYWN0aXZlID09IEZYX1dTVFJDKEwiMSIpKSB7DQorICAgICAgICAgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0ludGVyYWN0aXZlOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9Mb2NhbGVNZ3IqIENYRkFfRG9jdW1lbnQ6OkdldExvY2FsTWdyKCkNCit7DQorICAgIGlmICghbV9wTG9jYWxNZ3IpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGFuZ3VhZ2U7DQorICAgICAgICB0aGlzLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCktPkdldExhbmd1YWdlKHdzTGFuZ3VhZ2UpOw0KKyAgICAgICAgbV9wTG9jYWxNZ3IgPSBGWF9ORVcgQ1hGQV9Mb2NhbGVNZ3IoKENYRkFfTm9kZSopdGhpcy0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfTG9jYWxlU2V0KSwgd3NMYW5ndWFnZSk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcExvY2FsTWdyOw0KK30NCitJWEZBX1NjcmlwdENvbnRleHQqIENYRkFfRG9jdW1lbnQ6OkluaXRTY3JpcHRDb250ZXh0KEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKQ0KK3sNCisgICAgaWYgKCFtX3BTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICBtX3BTY3JpcHRDb250ZXh0ID0gWEZBX1NjcmlwdENvbnRleHRfQ3JlYXRlKHRoaXMpOw0KKyAgICB9DQorICAgIG1fcFNjcmlwdENvbnRleHQtPkluaXRpYWxpemUoaFJ1bnRpbWUpOw0KKyAgICByZXR1cm4gbV9wU2NyaXB0Q29udGV4dDsNCit9DQorSVhGQV9TY3JpcHRDb250ZXh0KglDWEZBX0RvY3VtZW50OjpHZXRTY3JpcHRDb250ZXh0KCkNCit7DQorICAgIGlmICghbV9wU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgbV9wU2NyaXB0Q29udGV4dCA9IFhGQV9TY3JpcHRDb250ZXh0X0NyZWF0ZSh0aGlzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wU2NyaXB0Q29udGV4dDsNCit9DQorWEZBX1ZFUlNJT04gQ1hGQV9Eb2N1bWVudDo6UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcihDRlhfV2lkZVN0cmluZyYgd3NUZW1wbGF0ZU5TKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGVtcGxhdGVVUklQcmVmaXggPSBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cFVSSTsNCisgICAgRlhfU1RSU0laRSAgblByZWZpeExlbmd0aCA9IHdzVGVtcGxhdGVVUklQcmVmaXguR2V0TGVuZ3RoKCk7DQorICAgIGlmKENGWF9XaWRlU3RyaW5nQyh3c1RlbXBsYXRlTlMsIHdzVGVtcGxhdGVOUy5HZXRMZW5ndGgoKSkgIT0gd3NUZW1wbGF0ZVVSSVByZWZpeCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9WRVJTSU9OX1VOS05PV047DQorICAgIH0NCisgICAgRlhfU1RSU0laRSAgbkRvdFBvcyA9IHdzVGVtcGxhdGVOUy5GaW5kKCcuJywgblByZWZpeExlbmd0aCk7DQorICAgIGlmKG5Eb3RQb3MgPT0gKEZYX1NUUlNJWkUpLTEpIHsNCisgICAgICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOw0KKyAgICB9DQorICAgIEZYX0lOVDggaU1ham9yID0gRlhTWVNfd3RvaSh3c1RlbXBsYXRlTlMuTWlkKG5QcmVmaXhMZW5ndGgsIG5Eb3RQb3MgLSBuUHJlZml4TGVuZ3RoKSk7DQorICAgIEZYX0lOVDggaU1pbm9yID0gRlhTWVNfd3RvaSh3c1RlbXBsYXRlTlMuTWlkKG5Eb3RQb3MgKyAxLCB3c1RlbXBsYXRlTlMuR2V0TGVuZ3RoKCkgLSBuRG90UG9zIC0gMikpOw0KKyAgICBYRkFfVkVSU0lPTiBlVmVyc2lvbiA9IChYRkFfVkVSU0lPTikoKEZYX0lOVDMyKWlNYWpvciAqIDEwMCArIGlNaW5vcik7DQorICAgIGlmKGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fTUlOIHx8IGVWZXJzaW9uID4gWEZBX1ZFUlNJT05fTUFYKSB7DQorICAgICAgICByZXR1cm4gWEZBX1ZFUlNJT05fVU5LTk9XTjsNCisgICAgfQ0KKyAgICBtX2VDdXJWZXJzaW9uTW9kZSA9IGVWZXJzaW9uOw0KKyAgICByZXR1cm4gZVZlcnNpb247DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Eb2N1bWVudDo6R2V0Tm9kZUJ5SUQoQ1hGQV9Ob2RlKiBwUm9vdCwgRlhfV1NUUiB3c0lEKQ0KK3sNCisgICAgaWYoIXBSb290IHx8IHdzSUQuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFJvb3QpOw0KKyAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0lEVmFsOw0KKyAgICAgICAgaWYocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfSWQsIHdzSURWYWwpICYmICF3c0lEVmFsLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGlmKHdzSURWYWwgPT0gd3NJRCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGVSZWN1cnNlKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCwgQ1hGQV9Ob2RlICpwRGVzdE5vZGVQYXJlbnQsIENYRkFfTm9kZSAqcFByb3RvTm9kZSkNCit7DQorICAgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IE5VTEw7DQorICAgIGZvcihDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRGVzdE5vZGVQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcEZvcm1DaGlsZDsgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmKHBGb3JtQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBwUHJvdG9Ob2RlLT5HZXRDbGFzc0lEKCkgJiYgcEZvcm1DaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBwUHJvdG9Ob2RlLT5HZXROYW1lSGFzaCgpICYmIHBGb3JtQ2hpbGQtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgICAgICAgcEZvcm1DaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgIHBFeGlzdGluZ05vZGUgPSBwRm9ybUNoaWxkOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwRXhpc3RpbmdOb2RlKSB7DQorICAgICAgICBwRXhpc3RpbmdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFByb3RvTm9kZSk7DQorICAgICAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGQgPSBwUHJvdG9Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlUmVjdXJzZShwRG9jdW1lbnQsIHBFeGlzdGluZ05vZGUsIHBUZW1wbGF0ZUNoaWxkKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gcFByb3RvTm9kZS0+Q2xvbmUoVFJVRSk7DQorICAgIHBOZXdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFByb3RvTm9kZSk7DQorICAgIHBEZXN0Tm9kZVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGUoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50LCBDWEZBX05vZGUgKnBEZXN0Tm9kZSwgQ1hGQV9Ob2RlICpwUHJvdG9Ob2RlKQ0KK3sNCisgICAgew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3Igc0l0ZXJhdG9yKHBEZXN0Tm9kZSk7DQorICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcERlc3ROb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFByb3RvTm9kZSk7DQorICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZCA9IHBQcm90b05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIFhGQV9Qcm90b01lcmdlX01lcmdlTm9kZVJlY3Vyc2UocERvY3VtZW50LCBwRGVzdE5vZGUsIHBUZW1wbGF0ZUNoaWxkKTsNCisgICAgfQ0KKyAgICB7DQorICAgICAgICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocERlc3ROb2RlKTsNCisgICAgICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpEb1Byb3RvTWVyZ2UoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVSb290ID0gKENYRkFfTm9kZSopR2V0WEZBTm9kZShYRkFfSEFTSENPREVfVGVtcGxhdGUpOw0KKyAgICBpZighcFRlbXBsYXRlUm9vdCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9Ob2RlKj4gbUlETWFwOw0KKyAgICBDWEZBX05vZGVTZXQgc1VzZU5vZGVzOw0KKyAgICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFRlbXBsYXRlUm9vdCk7DQorICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSURWYWw7DQorICAgICAgICBpZihwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9JZCwgd3NJRFZhbCkgJiYgIXdzSURWYWwuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgbUlETWFwW0ZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzSURWYWwuR2V0UHRyKCksIHdzSURWYWwuR2V0TGVuZ3RoKCkpXSA9IHBOb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVXNlVmFsOw0KKyAgICAgICAgaWYocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVXNlLCB3c1VzZVZhbCkgJiYgIXdzVXNlVmFsLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHNVc2VOb2Rlcy5BZGQocE5vZGUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2VocmVmLCB3c1VzZVZhbCkgJiYgIXdzVXNlVmFsLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHNVc2VOb2Rlcy5BZGQocE5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX1BPU0lUSU9OIHBvcyA9IHNVc2VOb2Rlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFVzZUhyZWZOb2RlID0gTlVMTDsNCisgICAgICAgIHNVc2VOb2Rlcy5HZXROZXh0QXNzb2MocG9zLCBwVXNlSHJlZk5vZGUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NVc2VWYWw7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NVUkksIHdzSUQsIHdzU09NOw0KKyAgICAgICAgaWYgKHBVc2VIcmVmTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2VocmVmLCB3c1VzZVZhbCkgJiYgIXdzVXNlVmFsLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIEZYX1NUUlNJWkUgdVNoYXJwUG9zID0gd3NVc2VWYWwuRmluZCgnIycpOw0KKyAgICAgICAgICAgIGlmKHVTaGFycFBvcyA8IDApIHsNCisgICAgICAgICAgICAgICAgd3NVUkkgPSB3c1VzZVZhbDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3c1VSSSA9IENGWF9XaWRlU3RyaW5nQygoRlhfTFBDV1NUUil3c1VzZVZhbCwgdVNoYXJwUG9zKTsNCisgICAgICAgICAgICAgICAgRlhfU1RSU0laRSB1TGVuID0gd3NVc2VWYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgIGlmKHVMZW4gPj0gdVNoYXJwUG9zICsgNSAmJiBDRlhfV2lkZVN0cmluZ0MoKEZYX0xQQ1dTVFIpd3NVc2VWYWwgKyB1U2hhcnBQb3MsIDUpID09IEZYX1dTVFJDKEwiI3NvbSgiKSAmJiB3c1VzZVZhbFt1TGVuIC0gMV0gPT0gJyknKSB7DQorICAgICAgICAgICAgICAgICAgICB3c1NPTSA9IENGWF9XaWRlU3RyaW5nQygoRlhfTFBDV1NUUil3c1VzZVZhbCArIHVTaGFycFBvcyArIDUsIHVMZW4gLSAxIC0gdVNoYXJwUG9zIC0gNSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c0lEID0gQ0ZYX1dpZGVTdHJpbmdDKChGWF9MUENXU1RSKXdzVXNlVmFsICsgdVNoYXJwUG9zICsgMSwgdUxlbiAtIHVTaGFycFBvcyAtIDEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmKHBVc2VIcmVmTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2UsIHdzVXNlVmFsKSAmJiAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgaWYod3NVc2VWYWxbMF0gPT0gJyMnKSB7DQorICAgICAgICAgICAgICAgIHdzSUQgPSBDRlhfV2lkZVN0cmluZ0MoKEZYX0xQQ1dTVFIpd3NVc2VWYWwgKyAxLCB3c1VzZVZhbC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHdzU09NID0gQ0ZYX1dpZGVTdHJpbmdDKChGWF9MUENXU1RSKXdzVXNlVmFsLCB3c1VzZVZhbC5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCF3c1VSSS5Jc0VtcHR5KCkgJiYgd3NVUkkgIT0gRlhfV1NUUkMoTCIuIikpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFByb3RvTm9kZSA9IE5VTEw7DQorICAgICAgICBpZighd3NTT00uSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gbV9wU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocFVzZUhyZWZOb2RlLCB3c1NPTSwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgICAgICAgICAgIGlmKGlSZXQgPiAwICYmIHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgcFByb3RvTm9kZSA9IChDWEZBX05vZGUqKXJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYoIXdzSUQuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgaWYoIW1JRE1hcC5Mb29rdXAoRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NJRC5HZXRQdHIoKSwgd3NJRC5HZXRMZW5ndGgoKSksIHBQcm90b05vZGUpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKCFwUHJvdG9Ob2RlKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGUodGhpcywgcFVzZUhyZWZOb2RlLCBwUHJvdG9Ob2RlKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0MDRjMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9pbXAuaApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0RPQ1VNRU5UX0lNUF9IXw0KKyNkZWZpbmUgX1hGQV9ET0NVTUVOVF9JTVBfSF8NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhOWJiNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmNwcApAQCAtMCwwICsxLDIwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfYmFzaWNfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfaXRlbWxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfYXBwYWRhcHRlci5oIg0KK0NYRkFfTGF5b3V0UHJvY2Vzc29yKiBDWEZBX0RvY3VtZW50OjpHZXRMYXlvdXRQcm9jZXNzb3IoKQ0KK3sNCisgICAgaWYoIW1fcExheW91dFByb2Nlc3Nvcikgew0KKyAgICAgICAgbV9wTGF5b3V0UHJvY2Vzc29yID0gRlhfTkVXIENYRkFfTGF5b3V0UHJvY2Vzc29yKHRoaXMpOw0KKyAgICAgICAgQVNTRVJUKG1fcExheW91dFByb2Nlc3Nvcik7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcExheW91dFByb2Nlc3NvcjsNCit9DQorSVhGQV9Eb2NMYXlvdXQqIENYRkFfRG9jdW1lbnQ6OkdldERvY0xheW91dCgpDQorew0KKyAgICByZXR1cm4gR2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorfQ0KK0NYRkFfTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0xheW91dFByb2Nlc3NvcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KQ0KKyAgICAsIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKE5VTEwpDQorICAgICwgbV9wTGF5b3V0UGFnZU1ncihOVUxMKQ0KKyAgICAsIG1fblByb2dyZXNzQ291bnRlcigwKQ0KKyAgICAsIG1fYk5lZUxheW91dChUUlVFKQ0KK3sNCit9DQorQ1hGQV9MYXlvdXRQcm9jZXNzb3I6On5DWEZBX0xheW91dFByb2Nlc3NvcigpDQorew0KKyAgICBDbGVhckxheW91dERhdGEoKTsNCit9DQorQ1hGQV9Eb2N1bWVudCogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkdldERvY3VtZW50KCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BEb2N1bWVudDsNCit9DQorRlhfSU5UMzIgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OlN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCkNCit7DQorICAgIGlmICghYkZvcmNlUmVzdGFydCAmJiAhSXNOZWVkTGF5b3V0KCkpIHsNCisgICAgICAgIHJldHVybiAxMDA7DQorICAgIH0NCisgICAgaWYobV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCisgICAgICAgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAwOw0KKyAgICBDWEZBX05vZGUqIHBGb3JtUGFja2V0Tm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgICAgaWYgKCFwRm9ybVBhY2tldE5vZGUpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgIGlmKCFwRm9ybVJvb3QpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAoIW1fcExheW91dFBhZ2VNZ3IpIHsNCisgICAgICAgIG1fcExheW91dFBhZ2VNZ3IgPSBGWF9ORVcgQ1hGQV9MYXlvdXRQYWdlTWdyKHRoaXMpOw0KKyAgICB9DQorICAgIGlmICghbV9wTGF5b3V0UGFnZU1nci0+SW5pdExheW91dFBhZ2UocEZvcm1Sb290KSkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGlmICghbV9wTGF5b3V0UGFnZU1nci0+UHJlcGFyZUZpcnN0UGFnZShwRm9ybVJvb3QpKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBGb3JtUm9vdCwgbV9wTGF5b3V0UGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BMYXlvdXRQYWdlTWdyOw0KKyNlbmRpZg0KKyAgICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAxOw0KKyAgICByZXR1cm4gMDsNCit9DQorRlhfSU5UMzIgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlICkNCit7DQorICAgIGlmIChtX25Qcm9ncmVzc0NvdW50ZXIgPCAxKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVN0YXR1czsNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3ItPkdldEZvcm1Ob2RlKCk7DQorICAgIEZYX0ZMT0FUIGZQb3NYID0gcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgRlhfRkxPQVQgZlBvc1kgPSBwRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ZKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBkbyB7DQorICAgICAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBtX3BMYXlvdXRQYWdlTWdyLT5HZXRBdmFpbEhlaWdodCgpOw0KKyAgICAgICAgZVN0YXR1cyA9IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5Eb0xheW91dChUUlVFLCBmQXZhaWxIZWlnaHQsIGZBdmFpbEhlaWdodCk7DQorICAgICAgICBpZihlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgICAgICBtX25Qcm9ncmVzc0NvdW50ZXIrKzsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgaWYocExheW91dEl0ZW0pIHsNCisgICAgICAgICAgICBwTGF5b3V0SXRlbS0+bV9zUG9zLlNldChmUG9zWCwgZlBvc1kpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wTGF5b3V0UGFnZU1nci0+U3VibWl0Q29udGVudEl0ZW0ocExheW91dEl0ZW0sIGVTdGF0dXMpOw0KKyAgICB9IHdoaWxlIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUgJiYgKCFwUGF1c2UgfHwgIXBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkpOw0KKyAgICBpZiAoZVN0YXR1cyA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICBtX3BMYXlvdXRQYWdlTWdyLT5GaW5pc2hQYWdpbmF0ZWRQYWdlU2V0cygpOw0KKyAgICAgICAgbV9wTGF5b3V0UGFnZU1nci0+U3luY0xheW91dERhdGEoKTsNCisgICAgICAgIG1fYk5lZUxheW91dCA9IEZBTFNFOw0KKyAgICAgICAgbV9yZ0NoYW5nZWRDb250YWluZXJzLlJlbW92ZUFsbCgpOw0KKyAgICB9DQorICAgIHJldHVybiAxMDAgKiAoZVN0YXR1cyA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lID8gbV9uUHJvZ3Jlc3NDb3VudGVyIDogbV9uUHJvZ3Jlc3NDb3VudGVyIC0gMSkgLyBtX25Qcm9ncmVzc0NvdW50ZXI7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkluY3JlbWVudExheW91dCgpDQorew0KKyAgICBpZiAobV9iTmVlTGF5b3V0KSB7DQorICAgICAgICBTdGFydExheW91dChUUlVFKTsNCisgICAgICAgIHJldHVybiBEb0xheW91dChOVUxMKSA9PSAxMDA7DQorICAgIH0NCisgICAgZm9yIChGWF9JTlQzMiBpID0gMCwgYyA9IG1fcmdDaGFuZ2VkQ29udGFpbmVycy5HZXRTaXplKCk7IGkgPCBjOyBpKyspIHsNCisgICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSBtX3JnQ2hhbmdlZENvbnRhaW5lcnNbaV07DQorICAgICAgICBDWEZBX05vZGUgKnBQYXJlbnROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgICAgaWYoIXBQYXJlbnROb2RlKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoIUNYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKHRoaXMsIHBOb2RlLCBwUGFyZW50Tm9kZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgbV9yZ0NoYW5nZWRDb250YWluZXJzLlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfSU5UMzIgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkNvdW50UGFnZXMoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcExheW91dFBhZ2VNZ3IgPyBtX3BMYXlvdXRQYWdlTWdyLT5HZXRQYWdlQ291bnQoKSA6IDA7DQorfQ0KK0lYRkFfTGF5b3V0UGFnZSogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkdldFBhZ2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wTGF5b3V0UGFnZU1nciA/IG1fcExheW91dFBhZ2VNZ3ItPkdldFBhZ2UoaW5kZXgpIDogTlVMTDsNCit9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0TGF5b3V0SXRlbShDWEZBX05vZGUgKnBGb3JtSXRlbSkNCit7DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKilwRm9ybUl0ZW0tPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCit9DQordm9pZCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6QWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpDQorew0KKyAgICBpZiAobV9yZ0NoYW5nZWRDb250YWluZXJzLkZpbmQocENvbnRhaW5lcikgPCAwKSB7DQorICAgICAgICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuQWRkKHBDb250YWluZXIpOw0KKyAgICB9DQorfQ0KK0NYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpHZXRSb290TGF5b3V0SXRlbSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wTGF5b3V0UGFnZU1nciA/IG1fcExheW91dFBhZ2VNZ3ItPkdldFJvb3RMYXlvdXRJdGVtKCkgOiBOVUxMOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpDbGVhckxheW91dERhdGEoKQ0KK3sNCisgICAgaWYobV9wTGF5b3V0UGFnZU1ncikgew0KKyAgICAgICAgZGVsZXRlIG1fcExheW91dFBhZ2VNZ3I7DQorICAgICAgICBtX3BMYXlvdXRQYWdlTWdyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvcikgew0KKyAgICAgICAgZGVsZXRlIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgICAgICAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fblByb2dyZXNzQ291bnRlciA9IDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OklzTmVlZExheW91dCgpDQorew0KKyAgICByZXR1cm4gbV9iTmVlTGF5b3V0IHx8IG1fcmdDaGFuZ2VkQ29udGFpbmVycy5HZXRTaXplKCkgPiAwOw0KK30NCitDWEZBX0xheW91dEl0ZW1JbXBsOjpDWEZBX0xheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUsIEZYX0JPT0wgYklzQ29udGVudExheW91dEl0ZW0pDQorICAgIDogbV9wRm9ybU5vZGUocE5vZGUpDQorICAgICwgbV9iSXNDb250ZW50TGF5b3V0SXRlbShiSXNDb250ZW50TGF5b3V0SXRlbSkNCisgICAgLCBtX3BQYXJlbnQoTlVMTCkNCisgICAgLCBtX3BOZXh0U2libGluZyhOVUxMKQ0KKyAgICAsIG1fcEZpcnN0Q2hpbGQoTlVMTCkNCit7DQorfQ0KK0NYRkFfTGF5b3V0SXRlbUltcGw6On5DWEZBX0xheW91dEl0ZW1JbXBsKCkNCit7DQorfQ0KK0NYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGw6OkNYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwoQ1hGQV9Ob2RlICpwTm9kZSkNCisgICAgOiBDWEZBX0xheW91dEl0ZW1JbXBsKHBOb2RlLCBGQUxTRSksIG1fcE9sZFN1YmZvcm0oTlVMTCkNCit7DQorfQ0KK0NYRkFfQ29udGVudExheW91dEl0ZW1JbXBsOjpDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChDWEZBX05vZGUgKnBOb2RlKQ0KKyAgICA6IENYRkFfTGF5b3V0SXRlbUltcGwocE5vZGUsIFRSVUUpDQorICAgICwgbV9wUHJldihOVUxMKQ0KKyAgICAsIG1fcE5leHQoTlVMTCkNCisgICAgLCBtX2R3U3RhdHVzKDApDQorew0KK30NCitDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbDo6fkNYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKCkNCit7DQorICAgIGlmIChtX3BGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpID09IHRoaXMpIHsNCisgICAgICAgIG1fcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgTlVMTCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MjY4YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRE9DVU1FTlRfTEFZT1VUX0lNUF9IXw0KKyNkZWZpbmUgX1hGQV9ET0NVTUVOVF9MQVlPVVRfSU1QX0hfDQorY2xhc3MgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOw0KK2NsYXNzIENYRkFfTGF5b3V0UGFnZU1ncjsNCitjbGFzcyBDWEZBX0xheW91dEFwcEFkYXB0ZXI7DQorY2xhc3MgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbDsNCitjbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvciA6IHB1YmxpYyBJWEZBX0RvY0xheW91dCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0xheW91dFByb2Nlc3NvcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgICB+Q1hGQV9MYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgdmlydHVhbCBDWEZBX0RvY3VtZW50KgkJR2V0RG9jdW1lbnQoKSBjb25zdDsNCisgICAgdmlydHVhbAlGWF9JTlQzMgkJCVN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCA9IEZBTFNFKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCURvTGF5b3V0KElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJbmNyZW1lbnRMYXlvdXQoKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCUNvdW50UGFnZXMoKSBjb25zdDsNCisgICAgdmlydHVhbCBJWEZBX0xheW91dFBhZ2UqCUdldFBhZ2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIENYRkFfTGF5b3V0SXRlbSoJR2V0TGF5b3V0SXRlbShDWEZBX05vZGUgKnBGb3JtSXRlbSk7DQorDQorICAgIHZvaWQJCQkJQWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpOw0KKyAgICB2b2lkCQkJCVNldEZvcmNlUmVMYXlvdXQoRlhfQk9PTCBiRm9yY2VSZXN0YXJ0KQ0KKyAgICB7DQorICAgICAgICBtX2JOZWVMYXlvdXQgPSBiRm9yY2VSZXN0YXJ0Ow0KKyAgICB9DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqCUdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3Q7DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcioJR2V0Um9vdFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgICB9DQorICAgIENYRkFfTGF5b3V0UGFnZU1ncioJCQlHZXRMYXlvdXRQYWdlTWdyKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcExheW91dFBhZ2VNZ3I7DQorICAgIH0NCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCUNsZWFyTGF5b3V0RGF0YSgpOw0KKw0KKyAgICBGWF9CT09MCQlJc05lZWRMYXlvdXQoKTsNCisNCisgICAgQ1hGQV9Eb2N1bWVudCoJCQkJbV9wRG9jdW1lbnQ7DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogICBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCisgICAgQ1hGQV9MYXlvdXRQYWdlTWdyKgkJCW1fcExheW91dFBhZ2VNZ3I7DQorICAgIENYRkFfTm9kZUFycmF5CQkJCW1fcmdDaGFuZ2VkQ29udGFpbmVyczsNCisgICAgRlhfVUlOVDMyCQkJCQltX25Qcm9ncmVzc0NvdW50ZXI7DQorICAgIEZYX0JPT0wJCQkJCQltX2JOZWVMYXlvdXQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGEyNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmNwcApAQCAtMCwwICsxLDU0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmgiDQorSVhGQV9QYWNrZXRJbXBvcnQqIElYRkFfUGFja2V0SW1wb3J0OjpDcmVhdGUoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50KQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX0RhdGFJbXBvcnRlcihwRG9jdW1lbnQpOw0KK30NCitDWEZBX0RhdGFJbXBvcnRlcjo6Q1hGQV9EYXRhSW1wb3J0ZXIoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50KQ0KKyAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkNCit7DQorICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGFJbXBvcnRlcjo6SW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBEYXRhRG9jdW1lbnQpDQorew0KKyAgICBJWEZBX1BhcnNlciAqcERhdGFEb2N1bWVudFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgICBpZighcERhdGFEb2N1bWVudFBhcnNlcikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmKHBEYXRhRG9jdW1lbnRQYXJzZXItPlN0YXJ0UGFyc2UocERhdGFEb2N1bWVudCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgIT0gWEZBX1BBUlNFU1RBVFVTX1JlYWR5KSB7DQorICAgICAgICBwRGF0YURvY3VtZW50UGFyc2VyLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYocERhdGFEb2N1bWVudFBhcnNlci0+RG9QYXJzZShOVUxMKSA8IFhGQV9QQVJTRVNUQVRVU19Eb25lKSB7DQorICAgICAgICBwRGF0YURvY3VtZW50UGFyc2VyLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwSW1wb3J0RGF0YVJvb3QgPSBwRGF0YURvY3VtZW50UGFyc2VyLT5HZXRSb290Tm9kZSgpOw0KKyAgICBpZighcEltcG9ydERhdGFSb290KSB7DQorICAgICAgICBwRGF0YURvY3VtZW50UGFyc2VyLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwRGF0YU1vZGVsID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgICAgaWYgKCFwRGF0YU1vZGVsKSB7DQorICAgICAgICBwRGF0YURvY3VtZW50UGFyc2VyLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YSk7DQorICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgIHBEYXRhTW9kZWwtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQorICAgIH0NCisgICAgaWYgKHBJbXBvcnREYXRhUm9vdC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgd2hpbGUoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcEltcG9ydERhdGFSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICAgICAgICBwSW1wb3J0RGF0YVJvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgICAgICAgIHBEYXRhTW9kZWwtPkluc2VydENoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHBJbXBvcnREYXRhUm9vdC0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFBhcmVudFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KKyAgICAgICAgaWYgKHBQYXJlbnRYTUxOb2RlKSB7DQorICAgICAgICAgICAgcFBhcmVudFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwWE1MTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBwRGF0YU1vZGVsLT5JbnNlcnRDaGlsZChwSW1wb3J0RGF0YVJvb3QpOw0KKyAgICB9DQorICAgIG1fcERvY3VtZW50LT5Eb0RhdGFSZW1lcmdlKEZBTFNFKTsNCisgICAgcERhdGFEb2N1bWVudFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgWEZBX0V4cG9ydEVuY29kZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQ0KK3sNCisgICAgQ0ZYX1dpZGVUZXh0QnVmIHRleHRCdWY7DQorICAgIEZYX0lOVDMyIGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgIHN3aXRjaCAoc3RyW2ldKSB7DQorICAgICAgICAgICAgY2FzZSAnJic6DQorICAgICAgICAgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImYW1wOyIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICc8JzoNCisgICAgICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZsdDsiKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnPic6DQorICAgICAgICAgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImZ3Q7Iik7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZhcG9zOyIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICdcIic6DQorICAgICAgICAgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImcXVvdDsiKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgdGV4dEJ1Zi5BcHBlbmRDaGFyKHN0cltpXSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KK30NCitDRlhfV2lkZVN0cmluZyBYRkFfRXhwb3J0RW5jb2RlQ29udGVudChGWF9XU1RSIHN0cikNCit7DQorICAgIENGWF9XaWRlVGV4dEJ1ZiB0ZXh0QnVmOw0KKyAgICBGWF9JTlQzMiBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgICAgICBGWF9XQ0hBUiBjaCA9IHN0ci5HZXRBdChpKTsNCisgICAgICAgIGlmICghRkRFX0lzWE1MVmFsaWRDaGFyKGNoKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoID09ICcmJykgew0KKyAgICAgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImYW1wOyIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsNCisgICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmx0OyIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsNCisgICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmd0OyIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCcnKSB7DQorICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZhcG9zOyIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7DQorICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZxdW90OyIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgICAgICBpZiAoaSAmJiBzdHIuR2V0QXQoaSAtIDEpICE9ICcgJykgew0KKyAgICAgICAgICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoJyAnKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJiN4MjA7Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gdGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9TYXZlQXR0cmlidXRlKENYRkFfTm9kZSogcE5vZGUsIFhGQV9BVFRSSUJVVEUgZU5hbWUsIEZYX1dTVFIgd3NOYW1lLCBGWF9CT09MIGJQcm90bywgQ0ZYX1dpZGVTdHJpbmcgJndzT3V0cHV0KQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKCghYlByb3RvICYmICFwTm9kZS0+SGFzQXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCBiUHJvdG8pKSB8fCAhcE5vZGUtPkdldEF0dHJpYnV0ZSgoWEZBX0FUVFJJQlVURSllTmFtZSwgd3NWYWx1ZSwgRkFMU0UpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgd3NWYWx1ZSA9IFhGQV9FeHBvcnRFbmNvZGVBdHRyaWJ1dGUod3NWYWx1ZSk7DQorICAgIHdzT3V0cHV0ICs9IEZYX1dTVFJDKEwiICIpOw0KKyAgICB3c091dHB1dCArPSB3c05hbWU7DQorICAgIHdzT3V0cHV0ICs9IEZYX1dTVFJDKEwiPVwiIik7DQorICAgIHdzT3V0cHV0ICs9IHdzVmFsdWU7DQorICAgIHdzT3V0cHV0ICs9IEZYX1dTVFJDKEwiXCIiKTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0RhdGFFeHBvcnRlcl9BdHRyaWJ1dGVTYXZlSW5EYXRhTW9kZWwoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgRlhfQk9PTCBiU2F2ZUluRGF0YU1vZGVsID0gRkFMU0U7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ltYWdlKSB7DQorICAgICAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghcFZhbHVlTm9kZSB8fCBwVmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfVmFsdWUpIHsNCisgICAgICAgIHJldHVybiBiU2F2ZUluRGF0YU1vZGVsOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEZpZWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBpZiAocEZpZWxkTm9kZSAmJiBwRmllbGROb2RlLT5HZXRCaW5kRGF0YSgpICYmIGVBdHRyaWJ1dGUgPT0gWEZBX0FUVFJJQlVURV9IcmVmKSB7DQorICAgICAgICBiU2F2ZUluRGF0YU1vZGVsID0gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsNCit9DQorRlhfQk9PTAlYRkFfRGF0YUV4cG9ydGVyX0NvbnRlbnROb2RlTmVlZHRvRXhwb3J0KENYRkFfTm9kZSogcENvbnRlbnROb2RlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICBpZiAoIXBDb250ZW50Tm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQsIEZBTFNFLCBGQUxTRSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocENvbnRlbnROb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpOw0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcENvbnRlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1ZhbHVlKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBHcmFuZFBhcmVudE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghcEdyYW5kUGFyZW50Tm9kZSB8fCBwR3JhbmRQYXJlbnROb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKHBHcmFuZFBhcmVudE5vZGUtPkdldEJpbmREYXRhKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEdyYW5kUGFyZW50Tm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KKyAgICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RhdGFFeHBvcnRlcl9SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKENYRkFfTm9kZSAqcFRlbXBsYXRlUm9vdCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmVyc2lvbk51bWJlcikNCit7DQorICAgIHdzVmVyc2lvbk51bWJlci5FbXB0eSgpOw0KKyAgICBpZighcFRlbXBsYXRlUm9vdCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcGxhdGVOUzsNCisgICAgaWYoIXBUZW1wbGF0ZVJvb3QtPlRyeU5hbWVzcGFjZSh3c1RlbXBsYXRlTlMpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX1ZFUlNJT04gZVZlcnNpb24gPSBwVGVtcGxhdGVSb290LT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzVGVtcGxhdGVOUyk7DQorICAgIGlmKGVWZXJzaW9uID09IFhGQV9WRVJTSU9OX1VOS05PV04pIHsNCisgICAgICAgIGVWZXJzaW9uID0gWEZBX1ZFUlNJT05fREVGQVVMVDsNCisgICAgfQ0KKyAgICB3c1ZlcnNpb25OdW1iZXIuRm9ybWF0KChGWF9MUENXU1RSKUwiJWkuJWkiLCBlVmVyc2lvbiAvIDEwMCwgZVZlcnNpb24gJSAxMDApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKENYRkFfTm9kZSogcE5vZGUsIENGWF9XaWRlVGV4dEJ1ZiYgYnVmLCBGWF9CT09MIGJTYXZlWE1MID0gRkFMU0UpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJzOw0KKyAgICBGWF9JTlQzMiBpQXR0cnMgPSAwOw0KKyAgICBGWF9MUENCWVRFIHBBdHRycyA9IFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhwTm9kZS0+R2V0Q2xhc3NJRCgpLCBpQXR0cnMpOw0KKyAgICB3aGlsZSAoaUF0dHJzLS0pIHsNCisgICAgICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoKFhGQV9BVFRSSUJVVEUpcEF0dHJzW2lBdHRyc10pOw0KKyAgICAgICAgaWYgKHBBdHRyLT5lTmFtZSA9PSBYRkFfQVRUUklCVVRFX05hbWUgfHwgKFhGQV9EYXRhRXhwb3J0ZXJfQXR0cmlidXRlU2F2ZUluRGF0YU1vZGVsKHBOb2RlLCBwQXR0ci0+ZU5hbWUpICYmICFiU2F2ZVhNTCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cjsNCisgICAgICAgIFhGQV9TYXZlQXR0cmlidXRlKHBOb2RlLCBwQXR0ci0+ZU5hbWUsIHBBdHRyLT5wTmFtZSwgYlNhdmVYTUwsIHdzQXR0cik7DQorICAgICAgICB3c0F0dHJzICs9IHdzQXR0cjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkcmVuOw0KKyAgICBzd2l0Y2gocE5vZGUtPkdldE9iamVjdFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZTogew0KKyAgICAgICAgICAgICAgICBpZiAoIWJTYXZlWE1MICYmICFYRkFfRGF0YUV4cG9ydGVyX0NvbnRlbnROb2RlTmVlZHRvRXhwb3J0KHBOb2RlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwUmF3VmFsdWVOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgd2hpbGUocFJhd1ZhbHVlTm9kZSAmJiBwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCAmJiBwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU2hhcnB0ZXh0ICYmIHBSYXdWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TaGFycHhtbCkgew0KKyAgICAgICAgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZSA9IHBSYXdWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoIXBSYXdWYWx1ZU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgICAgICAgIHBOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBpZiAocFJhd1ZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1NoYXJweEhUTUwgJiYgd3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwRXhEYXRhWE1MID0gcE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBFeERhdGFYTUwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFJpY2hUZXh0WE1MID0gcEV4RGF0YVhNTC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghcFJpY2hUZXh0WE1MKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBJRlhfTWVtb3J5U3RyZWFtKiBwTWVtU3RyZWFtID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgSUZYX1N0cmVhbSAqcFRlbXBTdHJlYW0gPSBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oKElGWF9GaWxlV3JpdGUqKXBNZW1TdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19UZXh0IHwgRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCk7DQorICAgICAgICAgICAgICAgICAgICBwVGVtcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQorICAgICAgICAgICAgICAgICAgICBwUmljaFRleHRYTUwtPlNhdmVYTUxOb2RlKHBUZW1wU3RyZWFtKTsNCisgICAgICAgICAgICAgICAgICAgIHdzQ2hpbGRyZW4gKz0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChGWF9MUENTVFIpcE1lbVN0cmVhbS0+R2V0QnVmZmVyKCksIHBNZW1TdHJlYW0tPkdldFNpemUoKSk7DQorICAgICAgICAgICAgICAgICAgICBwVGVtcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgcE1lbVN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBSYXdWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TaGFycHhtbCAgJiYgd3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQveG1sIikpKSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Jhd1ZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzUmF3VmFsdWUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICh3c1Jhd1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NlbFRleHRBcnJheTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlTdGFydCA9IDA7DQorICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpRW5kID0gd3NSYXdWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KKyAgICAgICAgICAgICAgICAgICAgaUVuZCA9IChpRW5kID09IC0xKSA/IHdzUmF3VmFsdWUuR2V0TGVuZ3RoKCkgOiBpRW5kOw0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NTZWxUZXh0QXJyYXkuQWRkKHdzUmF3VmFsdWUuTWlkKGlTdGFydCwgaUVuZCAtIGlTdGFydCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IGlFbmQgKyAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpU3RhcnQgPj0gd3NSYXdWYWx1ZS5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaUVuZCA9IHdzUmF3VmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocFBhcmVudE5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwR3JhbmRwYXJlbnROb2RlID0gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBHcmFuZHBhcmVudE5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgYm9keVRhZ05hbWU7DQorICAgICAgICAgICAgICAgICAgICBib2R5VGFnTmFtZSA9IHBHcmFuZHBhcmVudE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYm9keVRhZ05hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm9keVRhZ05hbWUgPSBGWF9XU1RSQyhMIkxpc3RCb3gxIik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8Iik7DQorICAgICAgICAgICAgICAgICAgICBidWYgPDwgYm9keVRhZ05hbWU7DQorICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCIgeG1sbnM9XCJcIlxuPiIpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHdzU2VsVGV4dEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPHZhbHVlXG4+Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8IFhGQV9FeHBvcnRFbmNvZGVDb250ZW50KHdzU2VsVGV4dEFycmF5W2ldKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8L3ZhbHVlXG4+Iik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8LyIpOw0KKyAgICAgICAgICAgICAgICAgICAgYnVmIDw8IGJvZHlUYWdOYW1lOw0KKyAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiXG4+Iik7DQorICAgICAgICAgICAgICAgICAgICB3c0NoaWxkcmVuICs9IGJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgICAgICBidWYuQ2xlYXIoKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlID0gcFJhd1ZhbHVlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB3c0NoaWxkcmVuICs9IFhGQV9FeHBvcnRFbmNvZGVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZToNCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQorICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB3c0NoaWxkcmVuICs9IFhGQV9FeHBvcnRFbmNvZGVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBUZW1wbGF0ZU5vZGUgfHwgcFRlbXBsYXRlTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKSAhPSBwTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYlNhdmVYTUwgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlVGV4dEJ1ZiBuZXdCdWY7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICB3aGlsZSAocENoaWxkTm9kZSkgew0KKyAgICAgICAgICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKHBDaGlsZE5vZGUsIG5ld0J1ZiwgYlNhdmVYTUwpOw0KKyAgICAgICAgICAgICAgICB3c0NoaWxkcmVuICs9IG5ld0J1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgIG5ld0J1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFiU2F2ZVhNTCAmJiAhd3NDaGlsZHJlbi5Jc0VtcHR5KCkgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgICAgICB3c0NoaWxkcmVuLkVtcHR5KCk7DQorICAgICAgICAgICAgICAgIGJTYXZlWE1MID0gVFJVRTsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocENoaWxkTm9kZSwgbmV3QnVmLCBiU2F2ZVhNTCk7DQorICAgICAgICAgICAgICAgICAgICB3c0NoaWxkcmVuICs9IG5ld0J1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgICAgICBuZXdCdWYuQ2xlYXIoKTsNCisgICAgICAgICAgICAgICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmICghd3NDaGlsZHJlbi5Jc0VtcHR5KCkgfHwgIXdzQXR0cnMuSXNFbXB0eSgpIHx8IHBOb2RlLT5IYXNBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRWxlbWVudDsNCisgICAgICAgIHBOb2RlLT5HZXRDbGFzc05hbWUod3NFbGVtZW50KTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgICAgIFhGQV9TYXZlQXR0cmlidXRlKHBOb2RlLCBYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwibmFtZSIpLCBUUlVFLCB3c05hbWUpOw0KKyAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPCIpOw0KKyAgICAgICAgYnVmIDw8IHdzRWxlbWVudDsNCisgICAgICAgIGJ1ZiA8PCB3c05hbWU7DQorICAgICAgICBidWYgPDwgd3NBdHRyczsNCisgICAgICAgIGlmICh3c0NoaWxkcmVuLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIlxuLz4iKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiXG4+Iik7DQorICAgICAgICAgICAgYnVmIDw8IHdzQ2hpbGRyZW47DQorICAgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPC8iKTsNCisgICAgICAgICAgICBidWYgPDwgd3NFbGVtZW50Ow0KKyAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIlxuPiIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihDWEZBX05vZGUqIHBOb2RlLCBJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJTYXZlWE1MID0gRkFMU0UpDQorew0KKyAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9GaWVsZCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9EcmF3IHx8ICFwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgIENGWF9XaWRlVGV4dEJ1ZiBidWY7DQorICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKHBOb2RlLCBidWYsIGJTYXZlWE1MKTsNCisgICAgICAgIEZYX1NUUlNJWkUgbkxlbiA9IGJ1Zi5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChuTGVuID4gMCkgew0KKyAgICAgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKChGWF9MUENXU1RSKWJ1Zi5HZXRCdWZmZXIoKSwgbkxlbik7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRWxlbWVudDsNCisgICAgcE5vZGUtPkdldENsYXNzTmFtZSh3c0VsZW1lbnQpOw0KKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUilMIjwiLCAxKTsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcod3NFbGVtZW50LkdldFB0cigpLCB3c0VsZW1lbnQuR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJuYW1lIiksIFRSVUUsIHdzT3V0cHV0KTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyczsNCisgICAgRlhfSU5UMzIgaUF0dHJzID0gMDsNCisgICAgRlhfTFBDQllURSBwQXR0cnMgPSBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMocE5vZGUtPkdldENsYXNzSUQoKSwgaUF0dHJzKTsNCisgICAgd2hpbGUgKGlBdHRycy0tKSB7DQorICAgICAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0ciA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKChYRkFfQVRUUklCVVRFKXBBdHRyc1tpQXR0cnNdKTsNCisgICAgICAgIGlmIChwQXR0ci0+ZU5hbWUgPT0gWEZBX0FUVFJJQlVURV9OYW1lKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7DQorICAgICAgICBYRkFfU2F2ZUF0dHJpYnV0ZShwTm9kZSwgcEF0dHItPmVOYW1lLCBwQXR0ci0+cE5hbWUsIEZBTFNFLCB3c0F0dHIpOw0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NBdHRyOw0KKyAgICB9DQorICAgIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpKSB7DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUil3c091dHB1dCwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmIChwQ2hpbGROb2RlKSB7DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUilMIlxuPiIsIDIpOw0KKyAgICAgICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsNCisgICAgICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIocENoaWxkTm9kZSwgcFN0cmVhbSwgYlNhdmVYTUwpOw0KKyAgICAgICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKEZYX0xQQ1dTVFIpTCI8LyIsIDIpOw0KKyAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcod3NFbGVtZW50LkdldFB0cigpLCB3c0VsZW1lbnQuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKEZYX0xQQ1dTVFIpTCJcbj4iLCAyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKChGWF9MUENXU1RSKUwiXG4vPiIsIDMpOw0KKyAgICB9DQorfQ0KK3ZvaWQgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGUoQ1hGQV9Ob2RlKiBwTm9kZSwgSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfTFBDU1RSIHBDaGVja3N1bSAsIEZYX0JPT0wgYlNhdmVYTUwpDQorew0KKyAgICBpZihwTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZSkgew0KKyAgICAgICAgc3RhdGljIEZYX0xQQ1dTVFIgc19wd3NUYWdOYW1lID0gKEZYX0xQQ1dTVFIpTCI8Zm9ybSI7DQorICAgICAgICBzdGF0aWMgRlhfTFBDV1NUUiBzX3B3c0Nsb3NlID0gKEZYX0xQQ1dTVFIpTCI8L2Zvcm1cbj4iOw0KKyAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NUYWdOYW1lLCBGWFNZU193Y3NsZW4oc19wd3NUYWdOYW1lKSk7DQorICAgICAgICBpZiAocENoZWNrc3VtICE9IE5VTEwpIHsNCisgICAgICAgICAgICBzdGF0aWMgRlhfTFBDV1NUUiBzX3B3Q2hlY2tzdW0gPSAoRlhfTFBDV1NUUilMIiBjaGVja3N1bT1cIiI7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGVja3N1bSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQ2hlY2tzdW0sIEZYU1lTX3N0cmxlbihwQ2hlY2tzdW0pKTsNCisgICAgICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhzX3B3Q2hlY2tzdW0sIEZYU1lTX3djc2xlbihzX3B3Q2hlY2tzdW0pKTsNCisgICAgICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUil3c0NoZWNrc3VtLCB3c0NoZWNrc3VtLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUilMIlwiIiwgMSk7DQorICAgICAgICB9DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUilMIiB4bWxucz1cIiIsIEZYU1lTX3djc2xlbigoRlhfTFBDV1NUUilMIiB4bWxucz1cIiIpKTsNCisgICAgICAgIEZYX0xQQ1dTVFIgcFVSSSA9IFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBVUkk7DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhwVVJJLCBGWFNZU193Y3NsZW4ocFVSSSkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWZXJzaW9uTnVtYmVyOw0KKyAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKChDWEZBX05vZGUqKXBOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRYRkFOb2RlKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUpLCB3c1ZlcnNpb25OdW1iZXIpOw0KKyAgICAgICAgaWYgKHdzVmVyc2lvbk51bWJlci5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICB3c1ZlcnNpb25OdW1iZXIgPSBGWF9XU1RSQyhMIjIuOCIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NWZXJzaW9uTnVtYmVyICs9IEZYX1dTVFJDKEwiL1wiXG4+Iik7DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoRlhfTFBDV1NUUil3c1ZlcnNpb25OdW1iZXIsIHdzVmVyc2lvbk51bWJlci5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsNCisgICAgICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIocENoaWxkTm9kZSwgcFN0cmVhbSk7DQorICAgICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB9DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhzX3B3c0Nsb3NlLCBGWFNZU193Y3NsZW4oc19wd3NDbG9zZSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBOb2RlLCBwU3RyZWFtLCBiU2F2ZVhNTCk7DQorICAgIH0NCit9DQorSVhGQV9QYWNrZXRFeHBvcnQqIElYRkFfUGFja2V0RXhwb3J0OjpDcmVhdGUoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50LCBYRkFfREFUQUZPUk1BVCBlRm9ybWF0ICkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ1hGQV9EYXRhRXhwb3J0ZXIocERvY3VtZW50KTsNCit9DQorQ1hGQV9EYXRhRXhwb3J0ZXI6OkNYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCkNCisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpDQorew0KKyAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfRmlsZVdyaXRlICpwV3JpdGUpDQorew0KKyAgICByZXR1cm4gRXhwb3J0KHBXcml0ZSwgbV9wRG9jdW1lbnQtPkdldFJvb3QoKSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfRmlsZVdyaXRlICpwV3JpdGUsIENYRkFfTm9kZSAqcE5vZGUsIEZYX0RXT1JEIGR3RmxhZyAsIEZYX0xQQ1NUUiBwQ2hlY2tzdW0gKQ0KK3sNCisgICAgQVNTRVJUKHBXcml0ZSAhPSBOVUxMKTsNCisgICAgaWYgKHBXcml0ZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSUZYX1N0cmVhbSAqcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShwV3JpdGUsIEZYX1NUUkVBTUFDQ0VTU19UZXh0IHwgRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCk7DQorICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCisgICAgRlhfQk9PTCBiUmV0ID0gRXhwb3J0KHBTdHJlYW0sIHBOb2RlLCBkd0ZsYWcsIHBDaGVja3N1bSk7DQorICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfU3RyZWFtICpwU3RyZWFtLCBDWEZBX05vZGUgKnBOb2RlLCBGWF9EV09SRCBkd0ZsYWcsIEZYX0xQQ1NUUiBwQ2hlY2tzdW0pDQorew0KKyAgICBJRkRFX1hNTERvYyogcFhNTERvYyA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0WE1MRG9jKCk7DQorICAgIGlmKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlKSB7DQorICAgICAgICBzd2l0Y2ggKHBOb2RlLT5HZXRQYWNrZXRJRCgpKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hEUDogew0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIEZYX0xQQ1dTVFIgc19wd3NQcmVhbWJsZSA9IChGWF9MUENXU1RSKUwiPHhkcDp4ZHAgeG1sbnM6eGRwPVwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvXCI+IjsNCisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzUHJlYW1ibGUsIEZYU1lTX3djc2xlbihzX3B3c1ByZWFtYmxlKSk7DQorICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwQ2hpbGQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydChwU3RyZWFtLCBwQ2hpbGQsIGR3RmxhZywgcENoZWNrc3VtKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBGWF9MUENXU1RSIHNfcHdzUG9zdGFtYmxlID0gKEZYX0xQQ1dTVFIpTCI8L3hkcDp4ZHBcbj4iOw0KKyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NQb3N0YW1ibGUsIEZYU1lTX3djc2xlbihzX3B3c1Bvc3RhbWJsZSkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czogew0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YU5vZGUgIT0gTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgcFhNTERvYy0+U2F2ZVhNTE5vZGUocFN0cmVhbSwgcEVsZW1lbnQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOiB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZShwTm9kZSwgcFN0cmVhbSwgcENoZWNrc3VtKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGU6DQorICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBYTUxEb2MtPlNhdmVYTUxOb2RlKHBTdHJlYW0sIHBFbGVtZW50KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRXhwb3J0Tm9kZSA9IHBOb2RlOw0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENoaWxkTm9kZTsgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocENoaWxkTm9kZSAhPSBwTm9kZSkgew0KKyAgICAgICAgICAgICAgICBwRXhwb3J0Tm9kZSA9IHBEYXRhTm9kZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBFeHBvcnROb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHBFeHBvcnROb2RlKTsNCisgICAgICAgIHBFbGVtZW50LT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJ4bWxuczp4ZmEiKSwgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iKSk7DQorICAgICAgICBwWE1MRG9jLT5TYXZlWE1MTm9kZShwU3RyZWFtLCBwRWxlbWVudCk7DQorICAgICAgICBwRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKEZYX0xQQ1dTVFIoTCJ4bWxuczp4ZmEiKSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfR2VuZXJhdGVDaGVja3N1bShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nJiB3c0NoZWNrc3VtKQ0KK3sNCit9DQordm9pZCBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShDWEZBX05vZGUgKnBEYXRhTm9kZSkNCit7DQorICAgIGlmICghcERhdGFOb2RlIHx8IHBEYXRhTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDaGlsZE51bSA9IDA7DQorICAgIGZvciAoQ1hGQV9Ob2RlICpwQ2hpbGROb2RlID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZE5vZGU7IHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpQ2hpbGROdW0rKzsNCisgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHBDaGlsZE5vZGUpOw0KKyAgICB9DQorICAgIGlmIChwRGF0YU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCisgICAgICAgIGlmIChpQ2hpbGROdW0gPiAwKSB7DQorICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlOw0KKyAgICAgICAgICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKChGWF9MUENXU1RSKUwieGZhOmRhdGFOb2RlIikpIHsNCisgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZSgoRlhfTFBDV1NUUilMInhmYTpkYXRhTm9kZSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlKS0+U2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmRhdGFOb2RlIiksIEZYX1dTVFJDKEwiZGF0YUdyb3VwIikpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FmOTZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0RPQ1VNRU5UX1NFUklBTElaRV9IXw0KKyNkZWZpbmUgX1hGQV9ET0NVTUVOVF9TRVJJQUxJWkVfSF8NCitjbGFzcyBDWEZBX0RhdGFJbXBvcnRlciA6IHB1YmxpYyBJWEZBX1BhY2tldEltcG9ydCwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0RhdGFJbXBvcnRlcihDWEZBX0RvY3VtZW50ICpwRG9jdW1lbnQpOw0KKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQorICAgIHsNCisgICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJbXBvcnREYXRhKElGWF9GaWxlUmVhZCogcERhdGFEb2N1bWVudCk7DQorcHJvdGVjdGVkOg0KKyAgICBDWEZBX0RvY3VtZW50CQkJCSptX3BEb2N1bWVudDsNCit9Ow0KK2NsYXNzIENYRkFfRGF0YUV4cG9ydGVyIDogcHVibGljIElYRkFfUGFja2V0RXhwb3J0LCBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCk7DQorICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQkJCUV4cG9ydChJRlhfRmlsZVdyaXRlICpwV3JpdGUpOw0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXhwb3J0KElGWF9GaWxlV3JpdGUgKnBXcml0ZSwgQ1hGQV9Ob2RlICpwTm9kZSwgRlhfRFdPUkQgZHdGbGFnID0gMCwgRlhfTFBDU1RSIHBDaGVja3N1bSA9IE5VTEwpOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfQk9PTAkJCQkJCUV4cG9ydChJRlhfU3RyZWFtICpwU3RyZWFtLCBDWEZBX05vZGUgKnBOb2RlLCBGWF9EV09SRCBkd0ZsYWcsIEZYX0xQQ1NUUiBwQ2hlY2tzdW0pOw0KKyAgICBDWEZBX0RvY3VtZW50CQkJCSptX3BEb2N1bWVudDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTkyYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuY3BwCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfaXRlbWxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfYXBwYWRhcHRlci5oIg0KK0lYRkFfRG9jTGF5b3V0KiBJWEZBX0xheW91dFBhZ2U6OkdldExheW91dCgpIGNvbnN0DQorew0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgICByZXR1cm4gcFRoaXMtPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCit9DQorRlhfSU5UMzIgSVhGQV9MYXlvdXRQYWdlOjpHZXRQYWdlSW5kZXgoKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgICAgcmV0dXJuIHBUaGlzLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TGF5b3V0UHJvY2Vzc29yKCktPkdldExheW91dFBhZ2VNZ3IoKS0+R2V0UGFnZUluZGV4KChJWEZBX0xheW91dFBhZ2UqKXRoaXMpOw0KK30NCit2b2lkIElYRkFfTGF5b3V0UGFnZTo6R2V0UGFnZVNpemUoQ0ZYX1NpemVGICZzaXplKQ0KK3sNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgICAgc2l6ZS5TZXQoMCwgMCk7DQorICAgIENYRkFfTm9kZSAqcE1lZGl1bSA9IHBUaGlzLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWVkaXVtKTsNCisgICAgaWYgKHBNZWRpdW0pIHsNCisgICAgICAgIHNpemUueCA9IHBNZWRpdW0tPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TaG9ydCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIHNpemUueSA9IHBNZWRpdW0tPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Mb25nKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgaWYgKHBNZWRpdW0tPkdldEVudW0oWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbikgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGFuZHNjYXBlKSB7DQorICAgICAgICAgICAgc2l6ZS5TZXQoc2l6ZS55LCBzaXplLngpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NYRkFfTm9kZSogSVhGQV9MYXlvdXRQYWdlOjpHZXRNYXN0ZXJQYWdlKCkgY29uc3QNCit7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICAgIHJldHVybiBwVGhpcy0+bV9wRm9ybU5vZGU7DQorfQ0KK0lYRkFfTGF5b3V0UGFnZSoJQ1hGQV9MYXlvdXRJdGVtOjpHZXRQYWdlKCkgY29uc3QNCit7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICAgIGZvcihDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ3VyTm9kZSA9IHBUaGlzOyBwQ3VyTm9kZTsgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUGFyZW50KSB7DQorICAgICAgICBpZihwQ3VyTm9kZS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgICAgIHJldHVybiAoSVhGQV9MYXlvdXRQYWdlKilwQ3VyTm9kZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0xheW91dEl0ZW06OkdldEZvcm1Ob2RlKCkgY29uc3QNCit7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgICAgcmV0dXJuIHBUaGlzLT5tX3BGb3JtTm9kZTsNCit9DQordm9pZCBDWEZBX0xheW91dEl0ZW06OkdldFJlY3QoQ0ZYX1JlY3RGICZydExheW91dCwgRlhfQk9PTCBiUmVsYXRpdmUpIGNvbnN0DQorew0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICAgIENGWF9Qb2ludEYgc1BvcyAgPSBwVGhpcy0+bV9zUG9zOw0KKyAgICBDRlhfU2l6ZUYgIHNTaXplID0gcFRoaXMtPm1fc1NpemU7DQorICAgIGlmICghYlJlbGF0aXZlKSB7DQorICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBwVGhpcy0+bV9wUGFyZW50OyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+bV9wUGFyZW50KSB7DQorICAgICAgICAgICAgaWYocExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgICBzUG9zICs9ICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtKS0+bV9zUG9zOw0KKyAgICAgICAgICAgICAgICBpZihDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pKSB7DQorICAgICAgICAgICAgICAgICAgICBzUG9zLkFkZChwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KSwgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZihwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICAgICAgICAgICAgc1Bvcy5BZGQocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCkuVG9Vbml0KFhGQV9VTklUX1B0KSwgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkuVG9Vbml0KFhGQV9VTklUX1B0KSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBydExheW91dC5TZXQoc1Bvcy54LCBzUG9zLnksIHNTaXplLngsIHNTaXplLnkpOw0KK30NCitDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0UGFyZW50KCkgY29uc3QNCit7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfTGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKilwVGhpcy0+bV9wUGFyZW50Ow0KK30NCitDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0Rmlyc3QoKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEN1ck5vZGUgPSBwVGhpczsNCisgICAgd2hpbGUocEN1ck5vZGUtPm1fcFByZXYpIHsNCisgICAgICAgIHBDdXJOb2RlID0gcEN1ck5vZGUtPm1fcFByZXY7DQorICAgIH0NCisgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKXBDdXJOb2RlOw0KK30NCitDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0UHJldigpIGNvbnN0DQorew0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKilwVGhpcy0+bV9wUHJldjsNCit9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldE5leHQoKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcFRoaXMtPm1fcE5leHQ7DQorfQ0KK0NYRkFfTGF5b3V0SXRlbSogQ1hGQV9MYXlvdXRJdGVtOjpHZXRMYXN0KCkgY29uc3QNCit7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDdXJOb2RlID0gcFRoaXM7DQorICAgIHdoaWxlKHBDdXJOb2RlLT5tX3BOZXh0KSB7DQorICAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTm9kZTsNCit9DQorRlhfSU5UMzIgQ1hGQV9MYXlvdXRJdGVtOjpHZXRJbmRleCgpIGNvbnN0DQorew0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ3VyTm9kZSA9IHBUaGlzOw0KKyAgICB3aGlsZShwQ3VyTm9kZS0+bV9wUHJldikgew0KKyAgICAgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgICAgICAgIGlJbmRleCsrOw0KKyAgICB9DQorICAgIHJldHVybiBpSW5kZXg7DQorfQ0KK0ZYX0lOVDMyIENYRkFfTGF5b3V0SXRlbTo6R2V0Q291bnQoKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAxOw0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEN1ck5vZGUgPSBOVUxMOw0KKyAgICBwQ3VyTm9kZSA9IHBUaGlzOw0KKyAgICB3aGlsZShwQ3VyTm9kZS0+bV9wUHJldikgew0KKyAgICAgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgICAgICAgIGlDb3VudCsrOw0KKyAgICB9DQorICAgIHBDdXJOb2RlID0gcFRoaXM7DQorICAgIHdoaWxlKHBDdXJOb2RlLT5tX3BOZXh0KSB7DQorICAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgaUNvdW50Kys7DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCit9DQorRlhfRFdPUkQgWEZBX0dldFJlbGV2YW50KENYRkFfTm9kZSogcEZvcm1JdGVtLCBGWF9EV09SRCBkd1BhcmVudFJlbHZhbnQpDQorew0KKyAgICBGWF9EV09SRCBkd1JlbGV2YW50ID0gWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSB8IFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlOw0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWxldmFudDsNCisgICAgaWYgKHBGb3JtSXRlbS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWxldmFudCwgd3NSZWxldmFudCkpIHsNCisgICAgICAgIGlmICh3c1JlbGV2YW50ID09IEZYX1dTVFJDKEwiK3ByaW50IikgfHwgd3NSZWxldmFudCA9PSBGWF9XU1RSQyhMInByaW50IikpIHsNCisgICAgICAgICAgICBkd1JlbGV2YW50ICY9IH5YRkFfTEFZT1VUU1RBVFVTX1ZpZXdhYmxlOw0KKyAgICAgICAgfSBlbHNlIGlmICh3c1JlbGV2YW50ID09IEZYX1dTVFJDKEwiLXByaW50IikpIHsNCisgICAgICAgICAgICBkd1JlbGV2YW50ICAmPSB+WEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCEoZHdQYXJlbnRSZWx2YW50ICYgWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSkgJiYgKGR3UmVsZXZhbnQgIT0gWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSkpIHsNCisgICAgICAgIGR3UmVsZXZhbnQgJj0gflhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGU7DQorICAgIH0NCisgICAgaWYgKCEoZHdQYXJlbnRSZWx2YW50ICYgWEZBX0xBWU9VVFNUQVRVU19QcmludGFibGUpICYmIChkd1JlbGV2YW50ICE9IFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlKSkgew0KKyAgICAgICAgZHdSZWxldmFudCAmPSB+WEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQorICAgIH0NCisgICAgcmV0dXJuIGR3UmVsZXZhbnQ7DQorfQ0KK3ZvaWQgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwgKnBMYXlvdXRJdGVtKQ0KK3sNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHQsICpwTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICB3aGlsZSAocE5vZGUpIHsNCisgICAgICAgIHBOZXh0ID0gcE5vZGUtPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgICAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW0ocE5vZGUpOw0KKyAgICAgICAgcE5vZGUgPSBwTmV4dDsNCisgICAgfQ0KKyAgICBkZWxldGUgcExheW91dEl0ZW07DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MDUxNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0xBWU9VVF9BUFBBREFQVEVSX0hfDQorI2RlZmluZSBfWEZBX0xBWU9VVF9BUFBBREFQVEVSX0hfDQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VBcmVhQ29udGFpbmVyTGF5b3V0SXRlbQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0Rmlyc3RDaGlsZChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCisgICAgew0KKyAgICAgICAgaWYocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldE5leHRTaWJsaW5nKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgfQ0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldFBhcmVudChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgICB9DQorfTsNCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtDQorew0KK3B1YmxpYzoNCisgICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXRGaXJzdENoaWxkKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICBpZihwQ2hpbGRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQorICAgIHsNCisgICAgICAgIGZvcihDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOyBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICBpZihwQ2hpbGRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0UGFyZW50KENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICAgIH0NCit9Ow0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbQ0KK3sNCitwdWJsaWM6DQorICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgfQ0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBHZXROZXh0U2libGluZyhDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQorICAgIHsNCisgICAgICAgIHJldHVybiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgfQ0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBHZXRQYXJlbnQoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgICB9DQorfTsNCitGWF9EV09SRAlYRkFfR2V0UmVsZXZhbnQoQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0sIEZYX0RXT1JEIGR3UGFyZW50UmVsdmFudCk7DQordm9pZAkJWEZBX1JlbGVhc2VMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmEyMDcwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcApAQCAtMCwwICsxLDIzOTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9pdGVtbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9hcHBhZGFwdGVyLmgiDQorQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Ob2RlICpwTm9kZSwgQ1hGQV9MYXlvdXRQYWdlTWdyKiBwUGFnZU1ncikNCisgICAgOiBtX3BGb3JtTm9kZShwTm9kZSkNCisgICAgLCBtX3BMYXlvdXRJdGVtKE5VTEwpDQorICAgICwgbV9wQ3VyQ2hpbGROb2RlKFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpDQorICAgICwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSkNCisgICAgLCBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcihOVUxMKQ0KKyAgICAsIG1fZlVzZWRTaXplKDApDQorICAgICwgbV9wUGFnZU1ncihwUGFnZU1ncikNCisgICAgLCBtX2JIYXNBdmFpbEhlaWdodChUUlVFKQ0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAsIG1fcE9sZExheW91dEl0ZW0oTlVMTCkNCisjZWxzZQ0KKyAgICAsIG1fcFBhZ2VNZ3JDcmVhdGVJdGVtKE5VTEwpDQorI2VuZGlmDQorICAgICwgbV9iS2VlcEJyZWFrRmluaXNoKEZBTFNFKQ0KKyAgICAsIG1fcEtlZXBIZWFkTm9kZShOVUxMKQ0KKyAgICAsIG1fcEtlZXBUYWlsTm9kZShOVUxMKQ0KKyAgICAsIG1fYklzUHJvY2Vzc0tlZXAoRkFMU0UpDQorICAgICwgbV9iQnJlYWtQZW5kaW5nKFRSVUUpDQorICAgICwgbV9mTGFzdFJvd1dpZHRoKDApDQorICAgICwgbV9mTGFzdFJvd1koMCkNCisgICAgLCBtX2JVc2VJbmhlcmlhdGVkKEZBTFNFKQ0KKyAgICAsIG1fZldpZHRoTGltaXRlKDApDQorICAgICwgbV9lUHJlUHJvY2Vzc1JzKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wRm9ybU5vZGUgJiYgKG1fcEZvcm1Ob2RlLT5Jc0NvbnRhaW5lck5vZGUoKSB8fCBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zvcm0pKTsNCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgbV9wT2xkTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCisjZW5kaWYNCit9DQorQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q3JlYXRlQ29udGVudExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQorew0KKyAgICBpZighcEZvcm1Ob2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBOVUxMOw0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBpZiAobV9wT2xkTGF5b3V0SXRlbSkgew0KKyAgICAgICAgcExheW91dEl0ZW0gPSBtX3BPbGRMYXlvdXRJdGVtOw0KKyAgICAgICAgbV9wT2xkTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW0tPm1fcE5leHQ7DQorICAgICAgICByZXR1cm4gcExheW91dEl0ZW07DQorICAgIH0NCisgICAgcExheW91dEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5PbkNyZWF0ZUxheW91dEl0ZW0ocEZvcm1Ob2RlKTsNCisjZWxzZQ0KKyAgICBwTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wUGFnZU1nckNyZWF0ZUl0ZW0tPkZpbmRPckNyZWF0ZUxheW91dEl0ZW0ocEZvcm1Ob2RlKTsNCisjZW5kaWYNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBQcmV2TGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEZvcm1Ob2RlLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQorICAgIGlmKHBQcmV2TGF5b3V0SXRlbSkgew0KKyAgICAgICAgd2hpbGUocFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0KSB7DQorICAgICAgICAgICAgcFByZXZMYXlvdXRJdGVtID0gcFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0ID0gcExheW91dEl0ZW07DQorICAgICAgICBwTGF5b3V0SXRlbS0+bV9wUHJldiA9IHBQcmV2TGF5b3V0SXRlbTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBGb3JtTm9kZS0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksIHBMYXlvdXRJdGVtKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcExheW91dEl0ZW07DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSwgRlhfRkxPQVQgZkN1clZlcnRpY2FsT2Zmc2V0LCBGWF9GTE9BVCYgZlByb3Bvc2VkU3BsaXRQb3MsIEZYX0JPT0wmIGJBcHBDaGFuZ2UsIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiApDQorew0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZTsNCisgICAgaWYgKGZQcm9wb3NlZFNwbGl0UG9zID4gZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYgZlByb3Bvc2VkU3BsaXRQb3MgPD0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgcExheW91dEl0ZW0tPm1fc1NpemUueSAtIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICBzd2l0Y2gocEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZTogew0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQW55Q2hhbmdlZCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJUb3BNYXJnaW4gPSAwLCBmQ3VyQm90dG9tTWFyZ2luID0gMDsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBwRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICAgICAgICAgICAgICAgICAgICBpZihwTWFyZ2luTm9kZSAmJiBiQ2FsY3VsYXRlTWFyZ2luKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZkN1clRvcE1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZkN1ckJvdHRvbU1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VkID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGJDaGFuZ2VkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZWQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSZWxTcGxpdFBvcyA9IGZQcm9wb3NlZFNwbGl0UG9zIC0gZkN1clZlcnRpY2FsT2Zmc2V0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwTm90aWZ5LT5GaW5kU3BsaXRQb3MocEZvcm1Ob2RlLCAoKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0pLT5HZXRJbmRleCgpLCBmUmVsU3BsaXRQb3MpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQW55Q2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA9IGZDdXJWZXJ0aWNhbE9mZnNldCArIGZSZWxTcGxpdFBvczsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcHBDaGFuZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlByb3Bvc2VkU3BsaXRQb3MgPD0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUmVsU3BsaXRQb3MgPSBmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJCb3R0b21NYXJnaW47DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNoaWxkT2Zmc2V0ID0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgZkN1clRvcE1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBcHBDaGFuZ2UgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbmRMYXlvdXRJdGVtU3BsaXRQb3MocENoaWxkSXRlbSwgZkNoaWxkT2Zmc2V0LCBmUmVsU3BsaXRQb3MsIGJBcHBDaGFuZ2UsIGJDYWxjdWxhdGVNYXJnaW4pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmUmVsU3BsaXRQb3MgLSBmQ2hpbGRPZmZzZXQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiAmJiBiQXBwQ2hhbmdlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlByb3Bvc2VkU3BsaXRQb3MgPSBmUmVsU3BsaXRQb3MgLSBmQ3VyVG9wTWFyZ2luOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA9IGZSZWxTcGxpdFBvcyArIGZDdXJCb3R0b21NYXJnaW47DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQW55Q2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmUHJvcG9zZWRTcGxpdFBvcyA8PSBmQ3VyVmVydGljYWxPZmZzZXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYkFueUNoYW5nZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiQW55Q2hhbmdlZDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWE6IHsNCisgICAgICAgICAgICAgICAgICAgIGZQcm9wb3NlZFNwbGl0UG9zID0gZkN1clZlcnRpY2FsT2Zmc2V0Ow0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgWEZBX0FUVFJJQlVURUVOVU0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR2V0TGF5b3V0KENYRkFfTm9kZSogcEZvcm1Ob2RlLCBGWF9CT09MJiBiUm9vdEZvcmNlVGIpDQorew0KKyAgICBiUm9vdEZvcmNlVGIgPSBGQUxTRTsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dE1vZGU7DQorICAgIGlmKHBGb3JtTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0xheW91dCwgZUxheW91dE1vZGUsIEZBTFNFKSkgew0KKyAgICAgICAgcmV0dXJuIGVMYXlvdXRNb2RlOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSAqcFBhcmVudE5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBpZihwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zvcm0pIHsNCisgICAgICAgIGJSb290Rm9yY2VUYiA9IFRSVUU7DQorICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fVGI7DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uOw0KK30NCitzdGF0aWMgRlhfQk9PTAlYRkFfRXhpc3RDb250YWluZXJLZWVwKENYRkFfTm9kZSogIHBDdXJOb2RlLCBGWF9CT09MIGJQcmVGaW5kKQ0KK3sNCisgICAgaWYocEN1ck5vZGUgPT0gTlVMTCB8fCAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwQ3VyTm9kZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfTk9ERUlURU0gZUl0ZW1UeXBlID0gWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nOw0KKyAgICBpZighYlByZUZpbmQpIHsNCisgICAgICAgIGVJdGVtVHlwZSA9IFhGQV9OT0RFSVRFTV9OZXh0U2libGluZzsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBQcmVDb250YWluZXIgPSBwQ3VyTm9kZS0+R2V0Tm9kZUl0ZW0oZUl0ZW1UeXBlLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgaWYocFByZUNvbnRhaW5lciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwS2VlcCA9IHBDdXJOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9LZWVwKTsNCisgICAgaWYgKHBLZWVwKSB7DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlUHJldmlvdXM7DQorICAgICAgICBYRkFfQVRUUklCVVRFIGVLZWVwVHlwZSA9IFhGQV9BVFRSSUJVVEVfUHJldmlvdXM7DQorICAgICAgICBpZighYlByZUZpbmQpIHsNCisgICAgICAgICAgICBlS2VlcFR5cGUgPSBYRkFfQVRUUklCVVRFX05leHQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oZUtlZXBUeXBlLCBlUHJldmlvdXMsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIGlmKGVQcmV2aW91cyA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fCBlUHJldmlvdXMgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBLZWVwID0gcFByZUNvbnRhaW5lci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQorICAgIGlmICghcEtlZXApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTmV4dDsNCisgICAgWEZBX0FUVFJJQlVURSBlS2VlcFR5cGUgPSBYRkFfQVRUUklCVVRFX05leHQ7DQorICAgIGlmKCFiUHJlRmluZCkgew0KKyAgICAgICAgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9QcmV2aW91czsNCisgICAgfQ0KKyAgICBpZiAoIXBLZWVwLT5UcnlFbnVtKGVLZWVwVHlwZSwgZU5leHQsIEZBTFNFKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmKGVOZXh0ID09IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhIHx8IGVOZXh0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RmluZFNwbGl0UG9zKEZYX0ZMT0FUIGZQcm9wb3NlZFNwbGl0UG9zKQ0KK3sNCisgICAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gbV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4gPSBUUlVFOw0KKyAgICBpZihlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uKSB7DQorICAgICAgICBiQ2FsY3VsYXRlTWFyZ2luID0gRkFMU0U7DQorICAgIH0NCisgICAgd2hpbGUoZlByb3Bvc2VkU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgRlhfQk9PTCBiQXBwQ2hhbmdlID0gRkFMU0U7DQorICAgICAgICBpZighRmluZExheW91dEl0ZW1TcGxpdFBvcyhtX3BMYXlvdXRJdGVtLCAwLCBmUHJvcG9zZWRTcGxpdFBvcywgYkFwcENoYW5nZSwgYkNhbGN1bGF0ZU1hcmdpbikpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZlByb3Bvc2VkU3BsaXRQb3M7DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpTcGxpdExheW91dEl0ZW0oQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtLCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFNlY29uZFBhcmVudCwgRlhfRkxPQVQgZlNwbGl0UG9zKQ0KK3sNCisgICAgRlhfRkxPQVQgZkN1clRvcE1hcmdpbiA9IDAsIGZDdXJCb3R0b21NYXJnaW4gPSAwOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gbV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4gPSBUUlVFOw0KKyAgICBpZihlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uKSB7DQorICAgICAgICBiQ2FsY3VsYXRlTWFyZ2luID0gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgICAgaWYocE1hcmdpbk5vZGUgJiYgYkNhbGN1bGF0ZU1hcmdpbikgew0KKyAgICAgICAgZkN1clRvcE1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmQ3VyQm90dG9tTWFyZ2luID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgfQ0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFNlY29uZExheW91dEl0ZW0gPSBOVUxMOw0KKyAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkgew0KKyAgICAgICAgcFNlY29uZExheW91dEl0ZW0gPSBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+Q3JlYXRlQ29udGVudExheW91dEl0ZW0ocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0ocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsNCisgICAgfQ0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwTGF5b3V0SXRlbS0+bV9zUG9zLng7DQorICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnggPSBwTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSAwOw0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55ID0gcExheW91dEl0ZW0tPm1fc1NpemUueSAtIGZTcGxpdFBvczsNCisgICAgcExheW91dEl0ZW0tPm1fc1NpemUueSAtPSBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICBpZihwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmQ3VyVG9wTWFyZ2luOw0KKyAgICB9DQorICAgIGlmIChwU2Vjb25kUGFyZW50KSB7DQorICAgICAgICBwU2Vjb25kUGFyZW50LT5BZGRDaGlsZChwU2Vjb25kTGF5b3V0SXRlbSk7DQorICAgICAgICBpZihmQ3VyVG9wTWFyZ2luID4gMCAmJiBwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICAgICAgICAgIHBTZWNvbmRQYXJlbnQtPm1fc1NpemUueSArPSBmQ3VyVG9wTWFyZ2luOw0KKyAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGFyZW50SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcFNlY29uZFBhcmVudC0+bV9wUGFyZW50Ow0KKyAgICAgICAgICAgIHdoaWxlKHBQYXJlbnRJdGVtKSB7DQorICAgICAgICAgICAgICAgIHBQYXJlbnRJdGVtLT5tX3NTaXplLnkgKz0gZkN1clRvcE1hcmdpbjsNCisgICAgICAgICAgICAgICAgcFBhcmVudEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBQYXJlbnRJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPm1fcFBhcmVudCA9IHBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwU2Vjb25kTGF5b3V0SXRlbTsNCisgICAgfQ0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCAqcENoaWxkcmVuID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICBGWF9GTE9BVCBsSGVpZ2h0Rm9yS2VlcCA9IDA7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4ga2VlcExheW91dEl0ZW1zOw0KKyAgICBGWF9GTE9BVCBmQWRkTWFyZ2luSGVpZ2h0ID0gMDsNCisgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtID0gcENoaWxkcmVuLCAqcENoaWxkTmV4dCA9IE5VTEw7IHBDaGlsZEl0ZW07IHBDaGlsZEl0ZW0gPSBwQ2hpbGROZXh0KSB7DQorICAgICAgICBwQ2hpbGROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgIHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgICAgIGlmIChmU3BsaXRQb3MgPD0gZkN1clRvcE1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsgZkN1ckJvdHRvbU1hcmdpbiArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgaWYoIVhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkSXRlbS0+bV9wRm9ybU5vZGUsIFRSVUUpKSB7DQorICAgICAgICAgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvcyAtIGZDdXJCb3R0b21NYXJnaW47DQorICAgICAgICAgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOw0KKyAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBmQWRkTWFyZ2luSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbS0+QWRkQ2hpbGQocENoaWxkSXRlbSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYobEhlaWdodEZvcktlZXAgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGlJbmRleCA9IDA7IGlJbmRleCA8IGtlZXBMYXlvdXRJdGVtcy5HZXRTaXplKCk7IGlJbmRleCArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsICpwUHJlSXRlbSA9IGtlZXBMYXlvdXRJdGVtc1tpSW5kZXhdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwUHJlSXRlbSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwUHJlSXRlbS0+bV9zUG9zLnkgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVJdGVtLT5tX3NQb3MueSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUHJlSXRlbS0+bV9zUG9zLnkgKyBwUHJlSXRlbS0+bV9zU2l6ZS55ID4gbEhlaWdodEZvcktlZXApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55ID0gbEhlaWdodEZvcktlZXA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxIZWlnaHRGb3JLZWVwICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgKz0gcFByZUl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNlY29uZFBhcmVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlY29uZFBhcmVudC0+bV9zU2l6ZS55ICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBQcmVJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSAtPSBmU3BsaXRQb3M7DQorICAgICAgICAgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOw0KKyAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBmQWRkTWFyZ2luSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbS0+QWRkQ2hpbGQocENoaWxkSXRlbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChmU3BsaXRQb3MgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiA+PSBmQ3VyVG9wTWFyZ2luICsgZkN1ckJvdHRvbU1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsgcENoaWxkSXRlbS0+bV9zU2l6ZS55KSB7DQorICAgICAgICAgICAgcExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgICAgICAgICAgIGlmKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkSXRlbS0+bV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICBrZWVwTGF5b3V0SXRlbXMuQWRkKHBDaGlsZEl0ZW0pOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGtlZXBMYXlvdXRJdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZPbGRIZWlnaHQgPSBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgIFNwbGl0TGF5b3V0SXRlbShwQ2hpbGRJdGVtLCBwU2Vjb25kTGF5b3V0SXRlbSwgZlNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbiAtIGZDdXJCb3R0b21NYXJnaW4gLSBwQ2hpbGRJdGVtLT5tX3NQb3MueSk7DQorICAgICAgICAgICAgZkFkZE1hcmdpbkhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgLSBmT2xkSGVpZ2h0Ow0KKyAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcykNCit7DQorICAgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgICAgU3BsaXRMYXlvdXRJdGVtKG1fcExheW91dEl0ZW0sIE5VTEwsIGZTcGxpdFBvcyk7DQorICAgIHJldHVybjsNCit9DQordm9pZCBDWEZBX0xheW91dEl0ZW1JbXBsOjpBZGRDaGlsZChDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKQ0KK3sNCisgICAgaWYocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQorICAgICAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQtPlJlbW92ZUNoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgICB9DQorICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQorICAgIGlmKG1fcEZpcnN0Q2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KKyAgICAgICAgd2hpbGUocEV4aXN0aW5nQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICB9DQorICAgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0SXRlbUltcGw6OkFkZEhlYWRDaGlsZChDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKQ0KK3sNCisgICAgaWYocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQorICAgICAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQtPlJlbW92ZUNoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgICB9DQorICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQorICAgIGlmKG1fcEZpcnN0Q2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KKyAgICAgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQorICAgICAgICBtX3BGaXJzdENoaWxkLT5tX3BOZXh0U2libGluZyA9IHBFeGlzdGluZ0NoaWxkSXRlbTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0SXRlbUltcGw6Okluc2VydENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBCZWZvcmVJdGVtLCBDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKQ0KK3sNCisgICAgaWYocEJlZm9yZUl0ZW0tPm1fcFBhcmVudCAhPSB0aGlzKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQorICAgICAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICB9DQorICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBCZWZvcmVJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgcEJlZm9yZUl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbTsNCisgICAgcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwRXhpc3RpbmdDaGlsZEl0ZW07DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRJdGVtSW1wbDo6UmVtb3ZlQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcENoaWxkSXRlbSkNCit7DQorICAgIGlmKHBDaGlsZEl0ZW0tPm1fcFBhcmVudCAhPSB0aGlzKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYobV9wRmlyc3RDaGlsZCA9PSBwQ2hpbGRJdGVtKSB7DQorICAgICAgICBtX3BGaXJzdENoaWxkID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KKyAgICAgICAgd2hpbGUocEV4aXN0aW5nQ2hpbGRJdGVtICYmIHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgIT0gcENoaWxkSXRlbSkgew0KKyAgICAgICAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICB9DQorICAgICAgICBpZihwRXhpc3RpbmdDaGlsZEl0ZW0pIHsNCisgICAgICAgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KKyAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQgPSBOVUxMOw0KK30NCitDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpFeHRyYWN0TGF5b3V0SXRlbSgpDQorew0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBtX3BMYXlvdXRJdGVtOw0KKyAgICBpZihwTGF5b3V0SXRlbSkgew0KKyAgICAgICAgbV9wTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgfQ0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZSAmJiBtX3BPbGRMYXlvdXRJdGVtICYmIG1fcE9sZExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgaWYgKG1fcE9sZExheW91dEl0ZW0tPm1fcFByZXYpIHsNCisgICAgICAgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BQcmV2LT5tX3BOZXh0ID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wT2xkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wT2xkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KKyAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBPbGRMYXlvdXRJdGVtID0gbV9wT2xkTGF5b3V0SXRlbTsNCisgICAgICAgIHdoaWxlIChwT2xkTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTmV4dE9sZExheW91dEl0ZW0gPSBwT2xkTGF5b3V0SXRlbS0+bV9wTmV4dDsNCisgICAgICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIChDWEZBX0xheW91dEl0ZW0qKXBPbGRMYXlvdXRJdGVtLCBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nKTsNCisgICAgICAgICAgICBkZWxldGUgcE9sZExheW91dEl0ZW07DQorICAgICAgICAgICAgcE9sZExheW91dEl0ZW0gPSBwTmV4dE9sZExheW91dEl0ZW07DQorICAgICAgICB9DQorICAgICAgICBtX3BPbGRMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICByZXR1cm4gcExheW91dEl0ZW07DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUoQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSwgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsIEZYX0JPT0wgYkJyZWFrQmVmb3JlKQ0KK3sNCisgICAgRlhfQk9PTCBiRmluZFJzID0gRkFMU0U7DQorICAgIGZvcihDWEZBX05vZGUgKnBCcmVha05vZGUgPSBwQ29udGFpbmVyTm9kZTsgcEJyZWFrTm9kZTsgcEJyZWFrTm9kZSA9IHBCcmVha05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZVR5cGUgPSBYRkFfQVRUUklCVVRFX0JlZm9yZTsNCisgICAgICAgIGlmKCFiQnJlYWtCZWZvcmUpIHsNCisgICAgICAgICAgICBlQXR0cmlidXRlVHlwZSA9IFhGQV9BVFRSSUJVVEVfQWZ0ZXI7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2gocEJyZWFrTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZTogew0KKyAgICAgICAgICAgICAgICAgICAgaWYoYkJyZWFrQmVmb3JlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kUnMgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtBZnRlcjogew0KKyAgICAgICAgICAgICAgICAgICAgaWYoIWJCcmVha0JlZm9yZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kUnMgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWs6DQorICAgICAgICAgICAgICAgIGlmKHBCcmVha05vZGUtPkdldEVudW0oZUF0dHJpYnV0ZVR5cGUpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pIHsNCisgICAgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsNCisgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoIWJCcmVha0JlZm9yZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBiRmluZFJzID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZihiRmluZFJzKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJGaW5kUnM7DQorfQ0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KK3N0YXRpYyB2b2lkIFhGQV9EZWxldGVMYXlvdXRHZW5lcmF0ZWROb2RlKENYRkFfTm9kZSogcEdlbmVyYXRlTm9kZSkNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcEdlbmVyYXRlTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IHBHZW5lcmF0ZU5vZGUtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcihwR2VuZXJhdGVOb2RlKTsNCisgICAgZm9yKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEN1ckxheW91dEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBOb2RlLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQorICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcE5leHRMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICAgIHdoaWxlIChwQ3VyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcEN1ckxheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCisgICAgICAgICAgICBwQ3VyTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwR2VuZXJhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocEdlbmVyYXRlTm9kZSk7DQorfQ0KKyNlbmRpZg0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsIENYRkFfTm9kZSogcFBhcmVudENvbnRhaW5lciwgRlhfQk9PTCBiVXNlUGFnZUJyZWFrKQ0KK3sNCisgICAgQ1hGQV9Ob2RlICpwRW50aXJlQ29udGFpbmVyID0gcFBhcmVudENvbnRhaW5lcjsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRDb250YWluZXIgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgICBzd2l0Y2ggKG5DdXJTdGFnZSkgew0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0JlZm9yZToNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlcjogew0KKyAgICAgICAgICAgICAgICBwQ2hpbGRDb250YWluZXIgPSBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOg0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI6DQorICAgICAgICAgICAgcENoaWxkQ29udGFpbmVyID0gcEN1ckFjdGlvbk5vZGU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHBDaGlsZENvbnRhaW5lciA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgc3dpdGNoKG5DdXJTdGFnZSkgew0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOiB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcEJyZWFrQWZ0ZXJOb2RlID0gcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgIGlmKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lOiB7DQorICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCisgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0Jvb2tlbmRMZWFkZXI6DQorICAgICAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBCb29rZW5kTm9kZSA9IHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUgPyBwRW50aXJlQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQm9va2VuZE5vZGU7IHBCb29rZW5kTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29rZW5kOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWs6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJvb2tlbmROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kTGVhZGVyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0JlZm9yZToNCisgICAgICAgICAgICAgICAgaWYocEN1ckFjdGlvbk5vZGUgIT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQnJlYWtCZWZvcmVOb2RlID0gcEN1ckFjdGlvbk5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgICAgICBpZighbV9iS2VlcEJyZWFrRmluaXNoICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUocEJyZWFrQmVmb3JlTm9kZSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgVFJVRSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihtX2JJc1Byb2Nlc3NLZWVwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoUHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIHBDaGlsZENvbnRhaW5lcikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQ2hpbGRDb250YWluZXI7DQorICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjogew0KKyAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOiB7DQorICAgICAgICAgICAgICAgICAgICBpZihwQ3VyQWN0aW9uTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQnJlYWtBZnRlck5vZGUgPSBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighbV9iS2VlcEJyZWFrRmluaXNoICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUocEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQnJlYWtBZnRlck5vZGUgPSBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KK0NoZWNrTmV4dENoaWxkQ29udGFpbmVyOiB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcE5leHRDaGlsZENvbnRhaW5lciA9IHBDaGlsZENvbnRhaW5lciA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudGlyZUNvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgICAgICAgICAgICB3aGlsZShwTmV4dENoaWxkQ29udGFpbmVyICYmIHBOZXh0Q2hpbGRDb250YWluZXItPkhhc0ZsYWcoWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTYXZlTm9kZSA9IHBOZXh0Q2hpbGRDb250YWluZXI7DQorICAgICAgICAgICAgICAgICAgICBwTmV4dENoaWxkQ29udGFpbmVyID0gcE5leHRDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgICAgICAgIGlmIChwU2F2ZU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RlbGV0ZUxheW91dEdlbmVyYXRlZE5vZGUocFNhdmVOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZighcE5leHRDaGlsZENvbnRhaW5lcikgew0KKyAgICAgICAgICAgICAgICAgICAgZ290byBOb01vcmVDaGlsZENvbnRhaW5lcjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJMYXN0S2VlcCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBpZihQcm9jZXNzS2VlcE5vZGVzRm9yQ2hlY2tOZXh0KHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIHBOZXh0Q2hpbGRDb250YWluZXIsIGJMYXN0S2VlcCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZighbV9iS2VlcEJyZWFrRmluaXNoICYmICFiTGFzdEtlZXAgJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShwTmV4dENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCksIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIFRSVUUpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwTmV4dENoaWxkQ29udGFpbmVyOw0KKyAgICAgICAgICAgICAgICBpZihtX2JJc1Byb2Nlc3NLZWVwKSB7DQorICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorTm9Nb3JlQ2hpbGRDb250YWluZXI6IHsNCisgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXI6DQorICAgICAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBCb29rZW5kTm9kZSA9IHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUgPyBwRW50aXJlQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQm9va2VuZE5vZGU7IHBCb29rZW5kTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29rZW5kOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWs6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJvb2tlbmROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZTsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6UHJvY2Vzc0tlZXBOb2Rlc0ZvckNoZWNrTmV4dChDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwgQ1hGQV9Ob2RlKiYgcE5leHRDb250YWluZXIsIEZYX0JPT0wmIGJMYXN0S2VlcE5vZGUpDQorew0KKyAgICBGWF9CT09MIGJDYW5TcGxpdGUgPSBwTmV4dENvbnRhaW5lci0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgRlhfQk9PTCBiTmV4dEtlZXAgPSBGQUxTRTsNCisgICAgaWYoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChwTmV4dENvbnRhaW5lciwgRkFMU0UpKSB7DQorICAgICAgICBiTmV4dEtlZXAgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmKGJOZXh0S2VlcCAmJiAhYkNhblNwbGl0ZSkgew0KKyAgICAgICAgaWYoIW1fYklzUHJvY2Vzc0tlZXAgJiYgIW1fYktlZXBCcmVha0ZpbmlzaCkgew0KKyAgICAgICAgICAgIG1fcEtlZXBIZWFkTm9kZSA9IHBOZXh0Q29udGFpbmVyOw0KKyAgICAgICAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYobV9iSXNQcm9jZXNzS2VlcCAmJiBtX3BLZWVwSGVhZE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcEtlZXBUYWlsTm9kZSA9IHBOZXh0Q29udGFpbmVyOw0KKyAgICAgICAgICAgIGlmKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShwTmV4dENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBUUlVFKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwTmV4dENvbnRhaW5lciA9IG1fcEtlZXBIZWFkTm9kZTsNCisgICAgICAgICAgICAgICAgbV9iS2VlcEJyZWFrRmluaXNoID0gVFJVRTsNCisgICAgICAgICAgICAgICAgbV9wS2VlcEhlYWROb2RlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgbV9wS2VlcFRhaWxOb2RlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYobV9iS2VlcEJyZWFrRmluaXNoKSB7DQorICAgICAgICAgICAgICAgIGJMYXN0S2VlcE5vZGUgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2JLZWVwQnJlYWtGaW5pc2ggPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcE5vZGVzRm9yQnJlYWtCZWZvcmUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsIENYRkFfTm9kZSogcENvbnRhaW5lck5vZGUpDQorew0KKyAgICBpZihtX3BLZWVwVGFpbE5vZGUgPT0gcENvbnRhaW5lck5vZGUpIHsNCisgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gbV9wS2VlcEhlYWROb2RlOw0KKyAgICAgICAgbV9iS2VlcEJyZWFrRmluaXNoID0gVFJVRTsNCisgICAgICAgIG1fcEtlZXBIZWFkTm9kZSA9IE5VTEw7DQorICAgICAgICBtX3BLZWVwVGFpbE5vZGUgPSBOVUxMOw0KKyAgICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IEZBTFNFOw0KKyAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlICpwQnJlYWtBZnRlck5vZGUgPSBwQ29udGFpbmVyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgRkFMU0UpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShDWEZBX05vZGUqIHBOb2RlKQ0KK3sNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorICAgIHJldHVybiBlUHJlc2VuY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSB8fCBlUHJlc2VuY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKENYRkFfTm9kZSogcEZvcm1Ob2RlLCBGWF9GTE9BVCYgZkNvbnRhaW5lcldpZHRoLCBGWF9GTE9BVCYgZkNvbnRhaW5lckhlaWdodCwgRlhfQk9PTCYgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIEZYX0JPT0wmIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkNCit7DQorICAgIGZDb250YWluZXJXaWR0aCA9IDA7DQorICAgIGZDb250YWluZXJIZWlnaHQgPSAwOw0KKyAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IFRSVUU7DQorICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IFRSVUU7DQorICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbVRtcFZhbHVlOw0KKyAgICBpZihiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSAmJiAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApICYmIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1csIG1UbXBWYWx1ZSwgRkFMU0UpICYmIG1UbXBWYWx1ZS5HZXRWYWx1ZSgpID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIGZDb250YWluZXJXaWR0aCA9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZihiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSAmJiBwRm9ybU5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBtVG1wVmFsdWUsIEZBTFNFKSAmJiBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICBmQ29udGFpbmVySGVpZ2h0ID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZihiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSAmJiBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heFcsIG1UbXBWYWx1ZSwgRkFMU0UpICYmIG1UbXBWYWx1ZS5HZXRWYWx1ZSgpID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIGZDb250YWluZXJXaWR0aCA9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZihiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAmJiBwRm9ybU5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBtVG1wVmFsdWUsIEZBTFNFKSAmJiBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICBmQ29udGFpbmVySGVpZ2h0ID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBGQUxTRTsNCisgICAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZQ0KKyhDWEZBX05vZGUqIHBGb3JtTm9kZSwgRlhfQk9PTCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIEZYX0ZMT0FUJiBmQ29udGFpbmVyV2lkdGgsIEZYX0JPT0wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIEZYX0ZMT0FUJiBmQ29udGFpbmVySGVpZ2h0KQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9IHBGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtVG1wVmFsdWU7DQorICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQorICAgICAgICBmQ29udGFpbmVyV2lkdGggPSBmQ29udGVudENhbGN1bGF0ZWRXaWR0aDsNCisgICAgICAgIGlmKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgICAgICAgaWYocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIG1UbXBWYWx1ZSwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgIGZDb250YWluZXJXaWR0aCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBtVG1wVmFsdWUsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICBmQ29udGFpbmVyV2lkdGggKz0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICAgICAgZkNvbnRhaW5lckhlaWdodCA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCisgICAgICAgIGlmKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgICAgICAgaWYocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgbVRtcFZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgbVRtcFZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkNhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoQ1hGQV9Ob2RlKiBwTm9kZSwgRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0LCBGWF9GTE9BVCYgZkFic29sdXRlWCwgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpDQorew0KKyAgICBGWF9GTE9BVCBmQW5jaG9yWCA9IHBOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgRlhfRkxPQVQgZkFuY2hvclkgPSBwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1kpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIEZYX0lOVDMyIG5Sb3RhdGUgPSBGWFNZU19yb3VuZChwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JvdGF0ZSkuR2V0VmFsdWUoKSk7DQorICAgIG5Sb3RhdGUgPSAoblJvdGF0ZSA8IDAgPyAoblJvdGF0ZSAlIDM2MCkgKyAzNjAgOiBuUm90YXRlICUgMzYwKSAvIDkwOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQW5jaG9yVHlwZSA9IHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSk7DQorICAgIEZYX0lOVDMyIG5BbmNob3JUeXBlID0gMDsNCisgICAgc3dpdGNoKGVBbmNob3JUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcExlZnQ6DQorICAgICAgICAgICAgbkFuY2hvclR5cGUgPSAwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BDZW50ZXI6DQorICAgICAgICAgICAgbkFuY2hvclR5cGUgPSAxOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodDoNCisgICAgICAgICAgICBuQW5jaG9yVHlwZSA9IDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnQ6DQorICAgICAgICAgICAgbkFuY2hvclR5cGUgPSAzOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXI6DQorICAgICAgICAgICAgbkFuY2hvclR5cGUgPSA0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodDoNCisgICAgICAgICAgICBuQW5jaG9yVHlwZSA9IDU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnQ6DQorICAgICAgICAgICAgbkFuY2hvclR5cGUgPSA2Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXI6DQorICAgICAgICAgICAgbkFuY2hvclR5cGUgPSA3Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodDoNCisgICAgICAgICAgICBuQW5jaG9yVHlwZSA9IDg7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHN0YXRpYyBjb25zdCBGWF9VSU5UOCBuTmV4dFBvc1s0XVs5XSA9IHt7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH0sIHs2LCAzLCAwLCA3LCA0LCAxLCA4LCA1LCAyfSwgezgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDB9LCB7MiwgNSwgOCwgMSwgNCwgNywgMCwgMywgNn19Ow0KKyAgICBGWF9JTlQzMiBuQWJzb2x1dGVBbmNob3JUeXBlID0gbk5leHRQb3NbblJvdGF0ZV1bbkFuY2hvclR5cGVdOw0KKyAgICBmQWJzb2x1dGVYID0gZkFuY2hvclg7DQorICAgIGZBYnNvbHV0ZVkgPSBmQW5jaG9yWTsNCisgICAgc3dpdGNoKG5BYnNvbHV0ZUFuY2hvclR5cGUgLyAzKSB7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgZkFic29sdXRlWSAtPSBmSGVpZ2h0IC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBmQWJzb2x1dGVZIC09IGZIZWlnaHQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHN3aXRjaChuQWJzb2x1dGVBbmNob3JUeXBlICUgMykgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGZBYnNvbHV0ZVggLT0gZldpZHRoIC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBmQWJzb2x1dGVYIC09IGZXaWR0aDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmxvYXRBbG1vc3RFcXVhbChGWF9GTE9BVCBmMSwgRlhfRkxPQVQgZjIpDQorew0KKyAgICByZXR1cm4gZjEgPj0gZjIgLSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiAmJiBmMSA8PSBmMiArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GbG9hdEdyZWF0ZXJUaGFuKEZYX0ZMT0FUIGYxLCBGWF9GTE9BVCBmMikNCit7DQorICAgIHJldHVybiBmMSA+IGYyICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT047DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0Zsb2F0TGVzc1RoYW4oRlhfRkxPQVQgZjEsIEZYX0ZMT0FUIGYyKQ0KK3sNCisgICAgcmV0dXJuIGYxIDwgZjIgLSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTjsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkluY3JlbWVudFJlbGF5b3V0Tm9kZShDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFByb2Nlc3NvciwgQ1hGQV9Ob2RlICpwTm9kZSwgQ1hGQV9Ob2RlICpwUGFyZW50Tm9kZSkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0UGFnZUFyZWEoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhZ2VBcmVhTGF5b3V0SXRlbSkNCit7DQorICAgIENYRkFfTm9kZSAqcEZvcm1Ob2RlID0gcFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQorICAgIENYRkFfTm9kZSAqcEN1ckNoaWxkTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIG5DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmU7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBCZWZvcmVJdGVtID0gTlVMTDsNCisgICAgZm9yKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsIHBGb3JtTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgIHBDdXJDaGlsZE5vZGU7DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKHBDdXJDaGlsZE5vZGUsIG5DdXJDaGlsZE5vZGVTdGFnZSwgcEZvcm1Ob2RlLCBGQUxTRSkpIHsNCisgICAgICAgIGlmIChuQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihwQ3VyQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBDdXJDaGlsZE5vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgpOw0KKyAgICAgICAgaWYoIXBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZldpZHRoLCBmSGVpZ2h0Ow0KKyAgICAgICAgcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVggPSAwLCBmQWJzb2x1dGVZID0gMDsNCisgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocEN1ckNoaWxkTm9kZSwgZldpZHRoLCBmSGVpZ2h0LCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICAgIHBQcm9jZXNzb3ItPlNldEN1cnJlbnRDb21wb25lbnRQb3MoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwUHJvY2Vzc0l0ZW0gPSBwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgaWYocEJlZm9yZUl0ZW0gPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkFkZEhlYWRDaGlsZChwUHJvY2Vzc0l0ZW0pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5JbnNlcnRDaGlsZChwQmVmb3JlSXRlbSwgcFByb2Nlc3NJdGVtKTsNCisgICAgICAgIH0NCisgICAgICAgIHBCZWZvcmVJdGVtID0gcFByb2Nlc3NJdGVtOw0KKyAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgIH0NCisgICAgcEJlZm9yZUl0ZW0gPSBOVUxMOw0KKyAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IHBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgIHdoaWxlIChwTGF5b3V0SXRlbSkgew0KKyAgICAgICAgaWYgKCFwTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpIHx8IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICAgICAgICBwTGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcE5leHRMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPlJlbW92ZUNoaWxkKHBMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICBpZiAocEJlZm9yZUl0ZW0gPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5BZGRIZWFkQ2hpbGQocExheW91dEl0ZW0pOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkluc2VydENoaWxkKHBCZWZvcmVJdGVtLCBwTGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBCZWZvcmVJdGVtID0gcExheW91dEl0ZW07DQorICAgICAgICAgICAgcExheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0UG9zaXRpb25lZENvbnRhaW5lcihDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0KQ0KK3sNCisgICAgaWYobV9wTGF5b3V0SXRlbSAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsNCisgICAgRlhfQk9PTCBiSWdub3JlWFkgPSAobV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uKTsNCisgICAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICAgIEZYX0JPT0wgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKG1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOw0KKyAgICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQorICAgIEZYX0ZMT0FUIGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMCwgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCisgICAgaWYobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsNCisgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb2xJbmRleCA9IDA7DQorICAgIGZvcig7IG1fcEN1ckNoaWxkTm9kZTsgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBGQUxTRSkpIHsNCisgICAgICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXIpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKG1fcEN1ckNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICBpZiAocENvbnRleHQgJiYgcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUNvbFNwYW4gPSBtX3BDdXJDaGlsZE5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsNCisgICAgICAgICAgICBpZiAoaUNvbFNwYW4gPD0gcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLT5HZXRTaXplKCkgLSBpQ29sSW5kZXgpIHsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoID0gMDsNCisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBpZihpQ29sU3BhbiA9PSAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgaUNvbFNwYW4gPSBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMtPkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvbFNwYW47IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoICs9IHBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocy0+R2V0QXQoaUNvbEluZGV4ICsgaSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaUNvbEluZGV4ICs9IGlDb2xTcGFuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBQcm9jZXNzb3ItPkRvTGF5b3V0KEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIHBDb250ZXh0KTsNCisgICAgICAgIGlmKCFwUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwgZkhlaWdodDsNCisgICAgICAgIHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZXaWR0aCwgZkhlaWdodCk7DQorICAgICAgICBGWF9CT09MIGJDaGFuZ2VQYXJlbnRTaXplID0gRkFMU0U7DQorICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShtX3BDdXJDaGlsZE5vZGUpKSB7DQorICAgICAgICAgICAgYkNoYW5nZVBhcmVudFNpemUgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZkFic29sdXRlWCA9IDAsIGZBYnNvbHV0ZVkgPSAwOw0KKyAgICAgICAgaWYoIWJJZ25vcmVYWSkgew0KKyAgICAgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MobV9wQ3VyQ2hpbGROb2RlLCBmV2lkdGgsIGZIZWlnaHQsIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFByb2Nlc3Nvci0+U2V0Q3VycmVudENvbXBvbmVudFBvcyhmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZBYnNvbHV0ZVggKyBmV2lkdGg7DQorICAgICAgICAgICAgaWYoYkNoYW5nZVBhcmVudFNpemUpIHsNCisgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZFN1cHBsaWVkV2lkdGg7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZihmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGggJiYgbV9wQ3VyQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICAgICAgICAgICAgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRIZWlnaHQgPSBmQWJzb2x1dGVZICsgZkhlaWdodDsNCisgICAgICAgICAgICBpZihiQ2hhbmdlUGFyZW50U2l6ZSkgew0KKyAgICAgICAgICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZihmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCAmJiBtX3BDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICAgICAgICAgICAgICBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgIH0NCisgICAgWEZBX1ZFUlNJT04gZVZlcnNpb24gPSBtX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgICAgaWYoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPT0gMCAmJiBlVmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwNykgew0KKyAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aDsNCisgICAgfQ0KKyAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPT0gMCAmJiBlVmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwNykgew0KKyAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0Ow0KKyAgICB9DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUobV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgZkNvbnRhaW5lcldpZHRoLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgZkNvbnRhaW5lckhlaWdodCk7DQorICAgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCk7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVXaWRnZXRTaXplKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSwgRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpDQorew0KKyAgICBDWEZBX05vZGUgKnBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgICBBU1NFUlQocE5vZGUpOw0KKyAgICBYRkFfRUxFTUVOVCBlQ2xhc3NJRCA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaChlQ2xhc3NJRCkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmVhOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQ6IHsNCisgICAgICAgICAgICAgICAgaWYoZldpZHRoIDwgLVhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgICAgICAgICBmV2lkdGggPSBwTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKGZIZWlnaHQgPCAtWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgICAgICAgICAgICAgIGZIZWlnaHQgPSBwTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCisgICAgICAgICAgICAgICAgcE5vZGUtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+U3RhcnRGaWVsZERyYXdMYXlvdXQocE5vZGUsIGZXaWR0aCwgZkhlaWdodCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsNCisgICAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfUmVsb2NhdGVUYWJsZVJvd0NlbGxzKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0Um93LCBjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4mIHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KQ0KK3sNCisgICAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICAgIEZYX0JPT0wgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOw0KKyAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcExheW91dFJvdy0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgIGlmKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgICBmTGVmdEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmVG9wSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgZlJpZ2h0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmQm90dG9tSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCA9IGJDb250YWluZXJXaWR0aEF1dG9TaXplID8gWEZBX0xBWU9VVF9GTE9BVF9NQVggOiBmQ29udGFpbmVyV2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7DQorICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VycmVudEhlaWdodCA9IHBMYXlvdXRSb3ctPm1fc1NpemUueSAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOw0KKyAgICBGWF9GTE9BVCBmQ3VycmVudENvbFggPSAwOw0KKyAgICBGWF9JTlQzMiBuQ3VycmVudENvbElkeCA9IDA7DQorICAgIEZYX0JPT0wgIGJNZXRXaG9sZVJvd0NlbGwgPSBGQUxTRTsNCisgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRSb3ctPm1fcEZpcnN0Q2hpbGQ7IHBMYXlvdXRDaGlsZDsgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICBGWF9JTlQzMiBuT3JpZ2luYWxDb2xTcGFuID0gcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KKyAgICAgICAgRlhfSU5UMzIgbkNvbFNwYW4gPSBuT3JpZ2luYWxDb2xTcGFuOw0KKyAgICAgICAgRlhfRkxPQVQgZkNvbFNwYW5XaWR0aCA9IDA7DQorICAgICAgICBpZihuQ29sU3BhbiA9PSAtMSB8fCBuQ3VycmVudENvbElkeCArIG5Db2xTcGFuID4gcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgbkNvbFNwYW4gPSByZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCkgLSBuQ3VycmVudENvbElkeDsNCisgICAgICAgIH0NCisgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IG5Db2xTcGFuOyBpICsrKSB7DQorICAgICAgICAgICAgZkNvbFNwYW5XaWR0aCArPSByZ1NwZWNpZmllZENvbHVtbldpZHRoc1tuQ3VycmVudENvbElkeCArIGldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5Db2xTcGFuICE9IG5PcmlnaW5hbENvbFNwYW4pIHsNCisgICAgICAgICAgICBmQ29sU3BhbldpZHRoID0gYk1ldFdob2xlUm93Q2VsbCA/IDAgOiBGWF9NQVgoZkNvbFNwYW5XaWR0aCwgcExheW91dENoaWxkLT5tX3NTaXplLnkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYobk9yaWdpbmFsQ29sU3BhbiA9PSAtMSkgew0KKyAgICAgICAgICAgIGJNZXRXaG9sZVJvd0NlbGwgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MuU2V0KGZDdXJyZW50Q29sWCwgMCk7DQorICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCA9IGZDb2xTcGFuV2lkdGg7DQorICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgZkN1cnJlbnRDb2xYICs9IGZDb2xTcGFuV2lkdGg7DQorICAgICAgICAgICAgbkN1cnJlbnRDb2xJZHggKz0gbkNvbFNwYW47DQorICAgICAgICAgICAgRlhfRkxPQVQgZk5ld0hlaWdodCA9IGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA/IC0xIDogZkNvbnRlbnRDdXJyZW50SGVpZ2h0Ow0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVdpZGdldFNpemUocExheW91dENoaWxkLCBmQ29sU3BhbldpZHRoLCBmTmV3SGVpZ2h0KTsNCisgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueSA9IGZOZXdIZWlnaHQ7DQorICAgICAgICAgICAgaWYoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gcExheW91dENoaWxkLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkOyBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVdpZGdldFNpemUocExheW91dENoaWxkLCBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0KTsNCisgICAgICAgICAgICBGWF9GTE9BVCBmT2xkQ2hpbGRIZWlnaHQgPSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueTsNCisgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueSA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJhTm9kZSA9IHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BhcmEpOw0KKyAgICAgICAgICAgIGlmKHBQYXJhTm9kZSAmJiBwTGF5b3V0Q2hpbGQtPm1fcEZpcnN0Q2hpbGQpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk9mZkhlaWdodCA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCAtIGZPbGRDaGlsZEhlaWdodDsNCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZUeXBlID0gcFBhcmFOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVkFsaWduKTsNCisgICAgICAgICAgICAgICAgc3dpdGNoKGVWVHlwZSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICAgICAgICAgICAgICAgICAgZk9mZkhlaWdodCA9IGZPZmZIZWlnaHQgLyAyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgZk9mZkhlaWdodCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoZk9mZkhlaWdodCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcElubmVyTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRDaGlsZC0+bV9wRmlyc3RDaGlsZDsgcElubmVyTGF5b3V0Q2hpbGQ7IHBJbm5lckxheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwSW5uZXJMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwSW5uZXJMYXlvdXRDaGlsZC0+bV9zUG9zLnkgKz0gZk9mZkhlaWdodDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDdXJyZW50Q29sWDsNCisgICAgICAgIGlmKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmIGZDb250ZW50V2lkdGhMaW1pdCA+IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCisgICAgICAgICAgICBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkNvbnRlbnRXaWR0aExpbWl0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNvbnRhaW5lcldpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0Ow0KKyAgICB9DQorICAgIGlmKHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSA9PSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsNCisgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkOyBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCAtIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDb250YWluZXJIZWlnaHQpOw0KKyAgICBwTGF5b3V0Um93LT5tX3NTaXplLlNldChmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRUYWJsZUNvbnRhaW5lcihDWEZBX05vZGUqIHBMYXlvdXROb2RlKQ0KK3sNCisgICAgaWYobV9wTGF5b3V0SXRlbSAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYocExheW91dE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcExheW91dE5vZGUgPSBtX3BGb3JtTm9kZTsNCisgICAgfQ0KKyAgICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpOw0KKyAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgICAgRlhfQk9PTCAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUobV9wRm9ybU5vZGUsIGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQorICAgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCisgICAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9IG1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMCwgZlRvcEluc2V0ID0gMCwgZlJpZ2h0SW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOw0KKyAgICBpZihwTWFyZ2luTm9kZSkgew0KKyAgICAgICAgZkxlZnRJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgZlRvcEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIGZSaWdodEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgZkJvdHRvbUluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQgPSBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA/IFhGQV9MQVlPVVRfRkxPQVRfTUFYIDogZkNvbnRhaW5lcldpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0Ow0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2x1bW5XaWR0aHM7DQorICAgIGlmIChwTGF5b3V0Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsIHdzQ29sdW1uV2lkdGhzKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3aWR0aHM7DQorICAgICAgICBpZiAoRlhfU2VwYXJhdGVTdHJpbmdXKHdzQ29sdW1uV2lkdGhzLkdldFB0cigpLCB3c0NvbHVtbldpZHRocy5HZXRMZW5ndGgoKSwgTCcgJywgd2lkdGhzKSA+IDApIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpQ29scyA9IHdpZHRocy5HZXRTaXplKCk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXaWR0aDsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvbHM7IGkrKykgew0KKyAgICAgICAgICAgICAgICB3c1dpZHRoID0gd2lkdGhzW2ldOw0KKyAgICAgICAgICAgICAgICB3c1dpZHRoLlRyaW1MZWZ0KEwnICcpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXdzV2lkdGguSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1lYXN1cmUod3NXaWR0aCk7DQorICAgICAgICAgICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkFkZChtZWFzdXJlLlRvVW5pdChYRkFfVU5JVF9QdCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlTcGVjaWZpZWRDb2x1bW5Db3VudCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpOw0KKyAgICBDWEZBX0xheW91dENvbnRleHQgbGF5b3V0Q29udGV4dDsNCisgICAgbGF5b3V0Q29udGV4dC5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocyA9ICZtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzOw0KKyAgICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0ID0gaVNwZWNpZmllZENvbHVtbkNvdW50ID4gMCAgPyAmbGF5b3V0Q29udGV4dCA6IE5VTEw7DQorICAgIGlmKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQorICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBmb3IoOyBtX3BDdXJDaGlsZE5vZGU7IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgICAgICBsYXlvdXRDb250ZXh0Lm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBGQUxTRTsNCisgICAgICAgIGxheW91dENvbnRleHQubV9mQ3VyQ29sdW1uV2lkdGggPSAwOw0KKyAgICAgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBwTGF5b3V0Q29udGV4dCk7DQorICAgICAgICBpZighcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsNCisgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSb3dDb3VudCA9IDAsIGlDb2xDb3VudCA9IDA7DQorICAgIHsNCisgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4gcmdSb3dJdGVtczsNCisgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0lOVDMyPiByZ1Jvd0l0ZW1zU3BhbjsNCisgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1Jvd0l0ZW1zV2lkdGg7DQorICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcExheW91dENoaWxkOyBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICBpZihwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dENoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgICAgICAgICAgICBpZihlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyAmJiBlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3Jvdykgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUm93TGF5b3V0Q2VsbCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICAgICAgICAgIHJnUm93SXRlbXMuQWRkKHBSb3dMYXlvdXRDZWxsKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUNvbFNwYW4gPSBwUm93TGF5b3V0Q2VsbC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsNCisgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1NwYW4uQWRkKGlDb2xTcGFuKTsNCisgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1dpZHRoLkFkZChwUm93TGF5b3V0Q2VsbC0+bV9zU2l6ZS54KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpUm93Q291bnQgPSByZ1Jvd0l0ZW1zLkdldFNpemUoKTsNCisgICAgICAgIGlDb2xDb3VudCA9IDA7DQorICAgICAgICBGWF9CT09MIGJNb3JlQ29sdW1ucyA9IFRSVUU7DQorICAgICAgICB3aGlsZShiTW9yZUNvbHVtbnMpIHsNCisgICAgICAgICAgICBiTW9yZUNvbHVtbnMgPSBGQUxTRTsNCisgICAgICAgICAgICBGWF9CT09MIGJBdXRvQ29sID0gRkFMU0U7DQorICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVJvd0NvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgICAgIHdoaWxlKHJnUm93SXRlbXNbaV0gIT0gTlVMTCAmJiAocmdSb3dJdGVtc1NwYW5baV0gPD0gMCB8fCAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ1Jvd0l0ZW1zW2ldLT5tX3BGb3JtTm9kZSkpKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcE5ld0NlbGwgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXJnUm93SXRlbXNbaV0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICAgICAgICAgICAgaWYocmdSb3dJdGVtc1NwYW5baV0gPCAwICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocmdSb3dJdGVtc1tpXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcE5ld0NlbGwgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1tpXSA9IHBOZXdDZWxsOw0KKyAgICAgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1NwYW5baV0gPSBwTmV3Q2VsbCA/IHBOZXdDZWxsLT5tX3BGb3JtTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pIDogMDsNCisgICAgICAgICAgICAgICAgICAgIHJnUm93SXRlbXNXaWR0aFtpXSA9IHBOZXdDZWxsID8gcE5ld0NlbGwtPm1fc1NpemUueCA6IDA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDZWxsID0gcmdSb3dJdGVtc1tpXTsNCisgICAgICAgICAgICAgICAgaWYoIXBDZWxsKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBiTW9yZUNvbHVtbnMgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBpZiAocmdSb3dJdGVtc1NwYW5baV0gPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlDb2xDb3VudCA+PSBpU3BlY2lmaWVkQ29sdW1uQ291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwLCBjID0gaUNvbENvdW50ICsgMSAtIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpOyBqIDwgYzsgaiArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkFkZCgwKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdIDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiQXV0b0NvbCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoYkF1dG9Db2wgJiYgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdIDwgcmdSb3dJdGVtc1dpZHRoW2ldKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdID0gcmdSb3dJdGVtc1dpZHRoW2ldOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKGJNb3JlQ29sdW1ucykgew0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRmluYWxDb2x1bW5XaWR0aCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XTsNCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVJvd0NvdW50OyBpICsrKSB7DQorICAgICAgICAgICAgICAgICAgICBpZighcmdSb3dJdGVtc1tpXSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1NwYW5baV0tLTsNCisgICAgICAgICAgICAgICAgICAgIHJnUm93SXRlbXNXaWR0aFtpXSAtPSBmRmluYWxDb2x1bW5XaWR0aDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpQ29sQ291bnQgKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZDdXJyZW50Um93WSA9IDA7DQorICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgaWYoIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dENoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVN1YmZvcm1MYXlvdXQgPSBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgICAgICAgICAgICBpZihlU3ViZm9ybUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwgZVN1YmZvcm1MYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93KSB7DQorICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1JlbG9jYXRlVGFibGVSb3dDZWxscyhwTGF5b3V0Q2hpbGQsIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMsIGVTdWJmb3JtTGF5b3V0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy55ID0gZkN1cnJlbnRSb3dZOw0KKyAgICAgICAgaWYoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0gMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgc3dpdGNoKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IChmQ29udGVudFdpZHRoTGltaXQgLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCkgLyAyIDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IGZDb250ZW50V2lkdGhMaW1pdCAtIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZFdpZHRoID0gcExheW91dENoaWxkLT5tX3NQb3MueCArIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICAgIGlmKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmIGZDb250ZW50V2lkdGhMaW1pdCA+IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCisgICAgICAgICAgICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZFN1cHBsaWVkV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZkN1cnJlbnRSb3dZICs9IHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS55Ow0KKyAgICB9DQorICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRIZWlnaHQgPSBmQ3VycmVudFJvd1k7DQorICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZFN1cHBsaWVkSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUobV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgZkNvbnRhaW5lcldpZHRoLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgZkNvbnRhaW5lckhlaWdodCk7DQorICAgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCk7DQorfQ0KK3N0YXRpYyBGWF9VSU5UOCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9IQWxpZ25FbnVtVG9JbnQoWEZBX0FUVFJJQlVURUVOVU0gZUhBbGlnbikNCit7DQorICAgIHN3aXRjaChlSEFsaWduKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkCVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVBlbmRlZEl0ZW1MYXlvdXQoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yLCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgICAgc3dpdGNoKGVMYXlvdXQpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93Og0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3c6DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfUmVsb2NhdGVUYWJsZVJvd0NlbGxzKHBMYXlvdXRJdGVtLCBwUHJvY2Vzc29yLT5tX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBlTGF5b3V0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQorRlhfQk9PTAlDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OklzQWRkTmV3Um93Rm9yVHJhaWxlcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJJdGVtKQ0KK3sNCisgICAgaWYoIXBUcmFpbGVySXRlbSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBUcmFpbGVySXRlbS0+bV9zU2l6ZS54Ow0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gbV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICBpZihlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1RiICYmIG1fZldpZHRoTGltaXRlID4gZldpZHRoKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFRyYWlsZXJCZWZvcmVTcGxpdChDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsIEZYX0ZMT0FUIGZTcGxpdFBvcywgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVyTGF5b3V0SXRlbSwgRlhfQk9PTCBiVXNlSW5oZXJpdGVkID0gRkFMU0UpDQorew0KKyAgICBpZighcFRyYWlsZXJMYXlvdXRJdGVtKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICBpZihiVXNlSW5oZXJpdGVkKSB7DQorICAgICAgICBGWF9GTE9BVCBmTmV3U3BsaXRQb3MgPSAwOw0KKyAgICAgICAgaWYoZlNwbGl0UG9zIC0gZkhlaWdodCA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgZk5ld1NwbGl0UG9zID0gcFByb2Nlc3Nvci0+RmluZFNwbGl0UG9zKGZTcGxpdFBvcyAtIGZIZWlnaHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZOZXdTcGxpdFBvcyA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZOZXdTcGxpdFBvcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfVXBkYXRlUGVuZGVkSXRlbUxheW91dChwUHJvY2Vzc29yLCBwVHJhaWxlckxheW91dEl0ZW0pOw0KKyAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgIGlmKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgICBmTGVmdEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmVG9wSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgZlJpZ2h0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmQm90dG9tSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICBpZighcFByb2Nlc3Nvci0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSkpIHsNCisgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSBwUHJvY2Vzc29yLT5tX2ZMYXN0Um93WTsNCisgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwUHJvY2Vzc29yLT5tX2ZMYXN0Um93V2lkdGg7DQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggKz0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLng7DQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwVHJhaWxlckxheW91dEl0ZW0pOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZOZXdTcGxpdFBvcyA9IDA7DQorICAgIGlmKGZTcGxpdFBvcyAtIGZIZWlnaHQgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgZk5ld1NwbGl0UG9zID0gcFByb2Nlc3Nvci0+RmluZFNwbGl0UG9zKGZTcGxpdFBvcyAtIGZIZWlnaHQpOw0KKyAgICB9DQorICAgIGlmIChmTmV3U3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZOZXdTcGxpdFBvcyk7DQorICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy55ID0gZk5ld1NwbGl0UG9zIC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IGZTcGxpdFBvcyAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgICAgfQ0KKyAgICBzd2l0Y2gocFRyYWlsZXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IGZMZWZ0SW5zZXQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggLSBmUmlnaHRJbnNldCAtIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQgLSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueCkgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmSGVpZ2h0Ow0KKyAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwVHJhaWxlckxheW91dEl0ZW0pOw0KK307DQorc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkTGVhZGVyQWZ0ZXJTcGxpdChDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGVhZGVyTGF5b3V0SXRlbSkNCit7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVBlbmRlZEl0ZW1MYXlvdXQocFByb2Nlc3NvciwgcExlYWRlckxheW91dEl0ZW0pOw0KKyAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgIGlmKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgICBmTGVmdEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmVG9wSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgZlJpZ2h0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmQm90dG9tSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkhlaWdodDsNCisgICAgfQ0KKyAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSAwOw0KKyAgICBzd2l0Y2gocExlYWRlckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBmTGVmdEluc2V0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggLSBmUmlnaHRJbnNldCAtIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NTaXplLng7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICAgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54IC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0IC0gcExlYWRlckxheW91dEl0ZW0tPm1fc1NpemUueCkgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmSGVpZ2h0Ow0KKyAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwTGVhZGVyTGF5b3V0SXRlbSk7DQorfTsNCitzdGF0aWMgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZShDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsIENYRkFfTm9kZSogcFBlbmRpbmdOb2RlLCBGWF9CT09MIGJCcmVha1BlbmRpbmcpDQorew0KKyAgICBwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkFkZFRhaWwocFBlbmRpbmdOb2RlKTsNCisgICAgcFByb2Nlc3Nvci0+bV9iQnJlYWtQZW5kaW5nID0gYkJyZWFrUGVuZGluZzsNCit9DQorc3RhdGljIEZYX0ZMT0FUIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydFBlbmRpbmdJdGVtcyhDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsIENYRkFfTm9kZSogcEN1ckNoaWxkTm9kZSkNCit7DQorICAgIEZYX0ZMT0FUIGZUb3RhbEhlaWdodCA9IDA7DQorICAgIGlmKHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuR2V0Q291bnQoKSA8IDEpIHsNCisgICAgICAgIHJldHVybiBmVG90YWxIZWlnaHQ7DQorICAgIH0NCisgICAgaWYocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbSA9PSBOVUxMKSB7DQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID0gcFByb2Nlc3Nvci0+Q3JlYXRlQ29udGVudExheW91dEl0ZW0ocEN1ckNoaWxkTm9kZSk7DQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLlNldCgwLCAwKTsNCisgICAgfQ0KKyAgICB3aGlsZShwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkdldENvdW50KCkgPiAwKSB7DQorICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkdldEhlYWRQb3NpdGlvbigpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGVuZGluZ05vZGUgPSAoQ1hGQV9Ob2RlKilwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkdldEF0KHBvcyk7DQorICAgICAgICBwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLlJlbW92ZUF0KHBvcyk7DQorICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFBlbmRpbmdMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciAqcFBlbmRpbmdQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBQZW5kaW5nTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgcFBlbmRpbmdQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICBwUGVuZGluZ1Byb2Nlc3Nvci0+RG9MYXlvdXQoRkFMU0UsIFhGQV9MQVlPVVRfRkxPQVRfTUFYKTsNCisgICAgICAgIHBQZW5kaW5nTGF5b3V0SXRlbSA9IHBQZW5kaW5nUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkgPyBwUGVuZGluZ1Byb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSA6IE5VTEw7DQorICAgICAgICBkZWxldGUgcFBlbmRpbmdQcm9jZXNzb3I7DQorICAgICAgICBpZihwUGVuZGluZ0xheW91dEl0ZW0pIHsNCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRMZWFkZXJBZnRlclNwbGl0KHBQcm9jZXNzb3IsIHBQZW5kaW5nTGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+bV9iQnJlYWtQZW5kaW5nKSB7DQorICAgICAgICAgICAgICAgIGZUb3RhbEhlaWdodCArPSBwUGVuZGluZ0xheW91dEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGZUb3RhbEhlaWdodDsNCit9DQorRlhfRkxPQVQJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKQ0KK3sNCisgICAgRlhfRkxPQVQgZlRvdGFsSGVpZ2h0ID0gMDsNCisgICAgaWYobV9hcnJheUtlZXBJdGVtcy5HZXRTaXplKCkpIHsNCisgICAgICAgIGlmKG1fcExheW91dEl0ZW0gPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQorICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoMCwgMCk7DQorICAgICAgICB9DQorICAgICAgICBmb3IoRlhfSU5UMzIgaUluZGV4ID0gbV9hcnJheUtlZXBJdGVtcy5HZXRTaXplKCkgLSAxOyBpSW5kZXggPj0gMCA7IGlJbmRleCAtLSkgew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZExlYWRlckFmdGVyU3BsaXQodGhpcywgbV9hcnJheUtlZXBJdGVtc1tpSW5kZXhdKTsNCisgICAgICAgICAgICBmVG90YWxIZWlnaHQgKz0gbV9hcnJheUtlZXBJdGVtc1tpSW5kZXhdLT5tX3NTaXplLnk7DQorICAgICAgICB9DQorICAgICAgICBtX2FycmF5S2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICB9DQorICAgIHJldHVybiBmVG90YWxIZWlnaHQ7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcEZvclNwbGl0ZShDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQYXJlbnRQcm9jZXNzb3IsIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcENoaWxkUHJvY2Vzc29yLCBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmV0VmFsdWUsDQorICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+JiByZ0N1ckxpbmVMYXlvdXRJdGVtLCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLCBGWF9CT09MJiBiQWRkZWRJdGVtSW5Sb3csIEZYX0JPT0wmIGJGb3JjZUVuZFBhZ2UsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0JiByZXN1bHQpDQorew0KKyAgICBpZihwUGFyZW50UHJvY2Vzc29yID09IE5VTEwgfHwgcENoaWxkUHJvY2Vzc29yID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZihwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUtPkdldEludGFjdCgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUgfHwgIXBDaGlsZFByb2Nlc3Nvci0+bV9iSGFzQXZhaWxIZWlnaHQpIHsNCisgICAgICAgIGlmKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocFBhcmVudFByb2Nlc3Nvci0+bV9wQ3VyQ2hpbGROb2RlLCBUUlVFKSkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQ7DQorICAgICAgICAgICAgcENoaWxkUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCisgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+IGtlZXBMYXlvdXRJdGVtczsNCisgICAgICAgICAgICBpZihwUGFyZW50UHJvY2Vzc29yLT5KdWRnZVB1dE5leHRQYWdlKHBQYXJlbnRQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0sIGZDaGlsZEhlaWdodCwga2VlcExheW91dEl0ZW1zKSkgew0KKyAgICAgICAgICAgICAgICBtX2FycmF5S2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaUluZGV4ID0gMDsgaUluZGV4IDwga2VlcExheW91dEl0ZW1zLkdldFNpemUoKTsgaUluZGV4KyspIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbSA9IGtlZXBMYXlvdXRJdGVtcy5HZXRBdChpSW5kZXgpOw0KKyAgICAgICAgICAgICAgICAgICAgcFBhcmVudFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocEl0ZW0pOw0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZIC09IHBJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICAgICAgICBtX2FycmF5S2VlcEl0ZW1zLkFkZChwSXRlbSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbS5BZGQocENoaWxkUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsNCisgICAgICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICAgICAgICBpZihmQ29udGVudEN1clJvd0hlaWdodCA8IGZDaGlsZEhlaWdodCApIHsNCisgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBmQ2hpbGRIZWlnaHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJlc3VsdCA9IGVSZXRWYWx1ZTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpKdWRnZVB1dE5leHRQYWdlKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSwgIEZYX0ZMT0FUIGZDaGlsZEhlaWdodCwgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPiAmcEtlZXBJdGVtcykNCit7DQorICAgIGlmKHBQYXJlbnRMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmSXRlbXNIZWlnaHQgPSAwOw0KKyAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBQYXJlbnRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwQ2hpbGRMYXlvdXRJdGVtOyBwQ2hpbGRMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwQ2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgaWYoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgICAgICAgICAgcEtlZXBJdGVtcy5BZGQocENoaWxkTGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgZkl0ZW1zSGVpZ2h0ICs9IHBDaGlsZExheW91dEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcEtlZXBJdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICBmSXRlbXNIZWlnaHQgPSAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZJdGVtc0hlaWdodCArPSBmQ2hpbGRIZWlnaHQ7DQorICAgIGlmKG1fcFBhZ2VNZ3ItPkdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoZkl0ZW1zSGVpZ2h0KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkCUNYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6UHJvY2Vzc1VuVXNlQmluZHMoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQorew0KKyAgICBpZighcEZvcm1Ob2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IocEZvcm1Ob2RlKTsNCisgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICBpZihwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBCaW5kTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgICAgIGlmIChwQmluZE5vZGUpIHsNCisgICAgICAgICAgICAgICAgcEJpbmROb2RlLT5SZW1vdmVCaW5kSXRlbShwTm9kZSk7DQorICAgICAgICAgICAgICAgIHBOb2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VPdmVyRmxvdyhDWEZBX05vZGUqIHBMZWFkZXJOb2RlLCBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSwgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVySXRlbSwgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQorew0KKyAgICBQcm9jZXNzVW5Vc2VCaW5kcyhwTGVhZGVyTm9kZSk7DQorICAgIFByb2Nlc3NVblVzZUJpbmRzKHBUcmFpbGVyTm9kZSk7DQorICAgIGlmKHBGb3JtTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYocEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfT3ZlcmZsb3cgfHwgcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQnJlYWspIHsNCisgICAgICAgIHBGb3JtTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0NCisgICAgaWYocExlYWRlck5vZGUgJiYgcEZvcm1Ob2RlKSB7DQorICAgICAgICBwRm9ybU5vZGUtPlJlbW92ZUNoaWxkKHBMZWFkZXJOb2RlKTsNCisgICAgfQ0KKyAgICBpZihwVHJhaWxlck5vZGUgJiYgcEZvcm1Ob2RlKSB7DQorICAgICAgICBwRm9ybU5vZGUtPlJlbW92ZUNoaWxkKHBUcmFpbGVyTm9kZSk7DQorICAgIH0NCisgICAgaWYocFRyYWlsZXJJdGVtKSB7DQorICAgICAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW0ocFRyYWlsZXJJdGVtKTsNCisgICAgfQ0KK30NCitzdGF0aWMgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbShDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBUaGlzLCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqJiBwUHJvY2Vzc29yLA0KKyAgICAgICAgRlhfQk9PTCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgRlhfQk9PTCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIEZYX0ZMT0FUIGZDb250YWluZXJIZWlnaHQsIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksIEZYX1VJTlQ4JiB1Q3VySEFsaWduU3RhdGUsIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4gKCZyZ0N1ckxpbmVMYXlvdXRJdGVtcylbM10sDQorICAgICAgICBGWF9CT09MIGJVc2VCcmVha0NvbnRyb2wsIEZYX0ZMT0FUIGZBdmFpbEhlaWdodCwgRlhfRkxPQVQgZlJlYWxIZWlnaHQsIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd1ksIEZYX0ZMT0FUJiBmQ29udGVudFdpZHRoTGltaXQsIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIEZYX0JPT0wmIGJBZGRlZEl0ZW1JblJvdywgRlhfQk9PTCYgYkZvcmNlRW5kUGFnZSwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9IE5VTEwsIEZYX0JPT0wgYk5ld1JvdyA9IEZBTFNFKQ0KK3sNCisgICAgRlhfQk9PTCBiVGFrZVNwYWNlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSk7DQorICAgIEZYX1VJTlQ4IHVIQWxpZ24gPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9IQWxpZ25FbnVtVG9JbnQocFRoaXMtPm1fcEN1ckNoaWxkTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpOw0KKyAgICBpZihiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICAgICAgdUhBbGlnbiA9IDA7DQorICAgIH0NCisgICAgaWYoKGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIgJiYgdUhBbGlnbiA8IHVDdXJIQWxpZ25TdGF0ZSkgfHwgKGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIgJiYgdUhBbGlnbiA+IHVDdXJIQWxpZ25TdGF0ZSkpIHsNCisgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Sb3dGdWxsQnJlYWs7DQorICAgIH0NCisgICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsNCisgICAgRlhfQk9PTCBiSXNPd25TcGxpdGUgPSBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgRlhfQk9PTCBiVXNlUmVhbEhlaWdodCA9IGJUYWtlU3BhY2UgJiYgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplICYmICBiSXNPd25TcGxpdGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgRlhfQk9PTCBiSXNUcmFuc0hlaWdodCA9IGJUYWtlU3BhY2U7DQorICAgIGlmKGJJc1RyYW5zSGVpZ2h0ICYmICFiSXNPd25TcGxpdGUpIHsNCisgICAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0U7DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0U3RyYXRlZ3kgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9HZXRMYXlvdXQocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUsIGJSb290Rm9yY2VUYik7DQorICAgICAgICBpZihlTGF5b3V0U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIgfHwgZUxheW91dFN0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiKSB7DQorICAgICAgICAgICAgYklzVHJhbnNIZWlnaHQgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CT09MIGJVc2VJbmhlcml0ZWQgPSBGQUxTRTsNCisgICAgQ1hGQV9MYXlvdXRDb250ZXh0CWxheW91dENvbnRleHQ7DQorICAgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dOb2RlID0gcFRoaXMtPm1fcFBhZ2VNZ3ItPlF1ZXJ5T3ZlcmZsb3cocFRoaXMtPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgIGlmKHBPdmVyZmxvd05vZGUpIHsNCisgICAgICAgICAgICBsYXlvdXRDb250ZXh0Lm1fcE92ZXJmbG93Tm9kZSA9IHBPdmVyZmxvd05vZGU7DQorICAgICAgICAgICAgbGF5b3V0Q29udGV4dC5tX3BPdmVyZmxvd1Byb2Nlc3NvciA9IHBUaGlzOw0KKyAgICAgICAgICAgIHBMYXlvdXRDb250ZXh0ID0gJmxheW91dENvbnRleHQ7DQorICAgICAgICB9DQorICAgIH0NCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVJldFZhbHVlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgaWYoIWJOZXdSb3cgfHwgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgIGVSZXRWYWx1ZSA9IHBQcm9jZXNzb3ItPkRvTGF5b3V0KGJUYWtlU3BhY2UgPyBiVXNlQnJlYWtDb250cm9sIDogRkFMU0UsIGJVc2VSZWFsSGVpZ2h0ID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWFsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZIDogWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGJJc1RyYW5zSGVpZ2h0ID8gZlJlYWxIZWlnaHQgLSBmQ29udGVudEN1clJvd1kgOiBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgcExheW91dENvbnRleHQpOw0KKyAgICAgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gZVJldFZhbHVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZVJldFZhbHVlID0gcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzOw0KKyAgICAgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgfQ0KKyAgICBpZiAocFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpID09IEZBTFNFKQl7DQorICAgICAgICByZXR1cm4gZVJldFZhbHVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQ7DQorICAgIHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQpOw0KKyAgICBpZiAoYlVzZVJlYWxIZWlnaHQgJiYgZlJlYWxIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgZlJlYWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWDsNCisgICAgICAgIGZBdmFpbEhlaWdodCA9IFhGQV9MQVlPVVRfRkxPQVRfTUFYOw0KKyAgICB9DQorICAgIGlmICghYlRha2VTcGFjZSB8fCAoZkNoaWxkV2lkdGggPD0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHx8IChmQ29udGVudFdpZHRoTGltaXQgLSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPD0gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pKSB7DQorICAgICAgICBDWEZBX05vZGUgKnBPdmVyZmxvd0xlYWRlck5vZGUgPSBOVUxMLCAqcE92ZXJmbG93VHJhaWxlck5vZGUgPSBOVUxMLCAqcEZvcm1Ob2RlID0gTlVMTDsNCisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVHJhaWxlckxheW91dEl0ZW0gPSBOVUxMOw0KKyAgICAgICAgRlhfQk9PTCBiSXNBZGRUcmFpbGVySGVpZ2h0ID0gRkFMU0U7DQorICAgICAgICBpZihwVGhpcy0+bV9wUGFnZU1nciAmJiBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSkgew0KKyAgICAgICAgICAgIHBGb3JtTm9kZSA9IHBUaGlzLT5tX3BQYWdlTWdyLT5RdWVyeU92ZXJmbG93KHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICBpZihwRm9ybU5vZGUgPT0gTlVMTCAmJiBwTGF5b3V0Q29udGV4dCAmJiBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3IpIHsNCisgICAgICAgICAgICAgICAgcEZvcm1Ob2RlID0gcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93Tm9kZTsNCisgICAgICAgICAgICAgICAgYlVzZUluaGVyaXRlZCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgRkFMU0UsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd1RyYWlsZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYocE92ZXJmbG93VHJhaWxlck5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IgKnBPdmVyZmxvd0xlYWRlclByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocE92ZXJmbG93VHJhaWxlck5vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSA9IHBPdmVyZmxvd0xlYWRlclByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpID8gcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpIDogTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYoYlVzZUluaGVyaXRlZCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPSBwVGhpcy0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPSBwUHJvY2Vzc29yLT5Jc0FkZE5ld1Jvd0ZvclRyYWlsZXIocFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKGJJc0FkZFRyYWlsZXJIZWlnaHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVHJhaWxlckhlaWdodCA9IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZDaGlsZEhlaWdodCArPSBmVHJhaWxlckhlaWdodDsNCisgICAgICAgICAgICAgICAgICAgICAgICBiSXNBZGRUcmFpbGVySGVpZ2h0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKCFiVGFrZVNwYWNlIHx8IGZDb250ZW50Q3VyUm93WSArIGZDaGlsZEhlaWdodCA8PSBmQXZhaWxIZWlnaHQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiB8fA0KKyAgICAgICAgICAgICAgICAoIWJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJiBwVGhpcy0+bV9mVXNlZFNpemUgKyBmQXZhaWxIZWlnaHQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiA+PSBmQ29udGFpbmVySGVpZ2h0KSkgew0KKyAgICAgICAgICAgIGlmKCFiVGFrZVNwYWNlIHx8IGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBUcmFpbGVyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFRyYWlsZXJCZWZvcmVTcGxpdChwUHJvY2Vzc29yLCBmQ2hpbGRIZWlnaHQsIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUocFByb2Nlc3NvciwgcE92ZXJmbG93TGVhZGVyTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYoYklzQWRkVHJhaWxlckhlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZDaGlsZEhlaWdodCAtPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPSBwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgICAgICAgICBpZihYRkFfRXhpc3RDb250YWluZXJLZWVwKHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLCBGQUxTRSkgJiYgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCisgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2FycmF5S2VlcEl0ZW1zLkFkZChwQ2hpbGRMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2FycmF5S2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLkFkZChwQ2hpbGRMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgaWYoYlRha2VTcGFjZSkgew0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQgKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBmQ2hpbGRIZWlnaHQ7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYoZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWspIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwVHJhaWxlckxheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KHBQcm9jZXNzb3IsIGZDaGlsZEhlaWdodCwgcFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dMZWFkZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZShwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoYklzQWRkVHJhaWxlckhlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ2hpbGRIZWlnaHQgLT0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQorICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0ICkgew0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBmQ2hpbGRIZWlnaHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGVSZXRWYWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXN1bHQ7DQorICAgICAgICAgICAgaWYocFRoaXMtPlByb2Nlc3NLZWVwRm9yU3BsaXRlKHBUaGlzLCBwUHJvY2Vzc29yLCBlUmV0VmFsdWUsIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBmQ29udGVudEN1clJvd1ksIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgZVJlc3VsdCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGVSZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGxpdFBvcyA9IHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmQXZhaWxIZWlnaHQgLSBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgICAgICAgIGlmIChmU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICAgICAgICAgICAgICBpZihlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiICYmIGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQgKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFRlbXBMZWFkZXJOb2RlID0gTlVMTCwgKnBUZW1wVHJhaWxlck5vZGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBpZihwVGhpcy0+bV9wUGFnZU1nciAmJiAhcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCAmJiBlUmV0VmFsdWUgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaykgew0KKyAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBUZW1wTGVhZGVyTm9kZSwgcFRlbXBUcmFpbGVyTm9kZSwgRkFMU0UsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKHBUcmFpbGVyTGF5b3V0SXRlbSAmJiBiSXNBZGRUcmFpbGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgZlNwbGl0UG9zLCBwVHJhaWxlckxheW91dEl0ZW0sIGJVc2VJbmhlcml0ZWQpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZTcGxpdFBvcyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoYlVzZUluaGVyaXRlZCkgew0KKyAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2JVc2VJbmhlcmlhdGVkID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgJiYgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZC0+bV9wTmV4dFNpYmxpbmcgPT0gTlVMTA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkLT5tX3BGb3JtTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQgKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGZDb250ZW50Q3VyUm93WSA8PSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+bV9wUGFnZU1nci0+R2V0TmV4dEF2YWlsQ29udGVudEhlaWdodChmQ2hpbGRIZWlnaHQpKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBUZW1wTGVhZGVyTm9kZSA9IE5VTEwsICpwVGVtcFRyYWlsZXJOb2RlID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBUaGlzLT5tX3BQYWdlTWdyKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1Ob2RlID09IE5VTEwgJiYgcExheW91dENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcFRlbXBMZWFkZXJOb2RlLCBwVGVtcFRyYWlsZXJOb2RlLCBGQUxTRSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihiVXNlSW5oZXJpdGVkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgICAgICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0ICkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIGVSZXRWYWx1ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSAmJiBlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiKSB7DQorICAgICAgICAgICAgICAgICAgICBpZihwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgRkFMU0UsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYocFRyYWlsZXJMYXlvdXRJdGVtKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KHBQcm9jZXNzb3IsIGZTcGxpdFBvcywgcFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93TGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZShwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZihlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBGb3JtTm9kZSA9PSBOVUxMICYmIHBMYXlvdXRDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlID0gcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93UHJvY2Vzc29yLT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYocFRoaXMtPm1fcFBhZ2VNZ3IpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBPdmVyZmxvd0xlYWRlck5vZGUsIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBGQUxTRSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJVc2VJbmhlcml0ZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fYlVzZUluaGVyaWF0ZWQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUm93RnVsbEJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KK30NCitYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKEZYX0JPT0wgYlVzZUJyZWFrQ29udHJvbCwgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwgRlhfRkxPQVQgZkhlaWdodExpbWl0LCBGWF9GTE9BVCBmUmVhbEhlaWdodCwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUm9vdEZvcmNlVGIpDQorew0KKyAgICBtX2JIYXNBdmFpbEhlaWdodCA9IFRSVUU7DQorICAgIEZYX0ZMT0FUIGZDb250YWluZXJXaWR0aCA9IDAsIGZDb250YWluZXJIZWlnaHQgPSAwOw0KKyAgICBGWF9CT09MIGJCcmVha0RvbmUgPSBGQUxTRTsNCisgICAgRlhfQk9PTCAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgICBGWF9CT09MICBiRm9yY2VFbmRQYWdlID0gRkFMU0U7DQorICAgIEZYX0JPT0wgIGJJc01hbnVhbEJyZWFrID0gRkFMU0U7DQorICAgIGlmKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQorICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgfQ0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUobV9wRm9ybU5vZGUsIGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQorICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSkgew0KKyAgICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCisgICAgICAgIGZDb250YWluZXJXaWR0aCA9IHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aDsNCisgICAgfQ0KKyAgICBpZighYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgICAgICBmQ29udGFpbmVySGVpZ2h0IC09IG1fZlVzZWRTaXplOw0KKyAgICB9DQorICAgIGlmKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBGWF9CT09MIGJGb2NyVGIgPSBGQUxTRTsNCisgICAgICAgIGlmKHBQYXJlbnROb2RlICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dChwUGFyZW50Tm9kZSwgYkZvY3JUYikgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93KSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRDb250YWluZXIgPSBtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgICAgICAgIGlmKHBDaGlsZENvbnRhaW5lciAmJiBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgICAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCisgICAgaWYocE1hcmdpbk5vZGUpIHsNCisgICAgICAgIGZMZWZ0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICBmUmlnaHRJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIGZCb3R0b21JbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0gYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPyBYRkFfTEFZT1VUX0ZMT0FUX01BWCA6IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOw0KKyAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBmSGVpZ2h0TGltaXQgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7DQorICAgIGlmKGZBdmFpbEhlaWdodCA8IDApIHsNCisgICAgICAgIG1fYkhhc0F2YWlsSGVpZ2h0ID0gRkFMU0U7DQorICAgIH0NCisgICAgZlJlYWxIZWlnaHQgPSBmUmVhbEhlaWdodCAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dZID0gMDsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9IE5VTEw7DQorICAgIGlmKG1fcExheW91dEl0ZW0gIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUgJiYgZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9UYikgew0KKyAgICAgICAgICAgIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0TmV4dCA9IHBMYXlvdXRDaGlsZDsgcExheW91dE5leHQ7IHBMYXlvdXROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBMYXlvdXROZXh0LT5tX3NQb3MueSAhPSBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy55KSB7DQorICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQgPSBwTGF5b3V0TmV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dFRlbXBDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcExheW91dFRlbXBDaGlsZCAhPSBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRUZW1wQ2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRUZW1wQ2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0VGVtcENoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNoaWxkQ29udGVudFdpZHRoID0gcExheW91dFRlbXBDaGlsZC0+bV9zUG9zLnggKyBwTGF5b3V0VGVtcENoaWxkLT5tX3NTaXplLng7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZENvbnRlbnRIZWlnaHQgPSBwTGF5b3V0VGVtcENoaWxkLT5tX3NQb3MueSArIHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1NpemUueTsNCisgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRDb250ZW50V2lkdGgpIHsNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkQ29udGVudFdpZHRoOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZENvbnRlbnRIZWlnaHQpIHsNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZENvbnRlbnRIZWlnaHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocExheW91dENoaWxkKSB7DQorICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZID0gcExheW91dENoaWxkLT5tX3NQb3MueTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZDb250ZW50Q3VyUm93WSArPSBJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKTsNCisgICAgaWYobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSkgew0KKyAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBUUlVFKTsNCisgICAgfQ0KKyAgICBmQ29udGVudEN1clJvd1kgKz0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKHRoaXMsIG1fcEZvcm1Ob2RlKTsNCisgICAgaWYobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQorICAgICAgICBpZihYRkFfRXhpc3RDb250YWluZXJLZWVwKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5HZXRGb3JtTm9kZSgpLCBGQUxTRSkpIHsNCisgICAgICAgICAgICBtX3BLZWVwSGVhZE5vZGUgPSBtX3BDdXJDaGlsZE5vZGU7DQorICAgICAgICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IFRSVUU7DQorICAgICAgICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHdoaWxlKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgICAgIG1fZldpZHRoTGltaXRlID0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoOw0KKyAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPiByZ0N1ckxpbmVMYXlvdXRJdGVtc1szXTsNCisgICAgICAgIEZYX1VJTlQ4IHVDdXJIQWxpZ25TdGF0ZSA9IChlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiID8gMCA6IDIpOw0KKyAgICAgICAgaWYgKHBMYXlvdXRDaGlsZCkgew0KKyAgICAgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXROZXh0ID0gcExheW91dENoaWxkOyBwTGF5b3V0TmV4dDsgcExheW91dE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgICAgICBpZiAocExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID09IE5VTEwgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXROZXh0LT5tX3BGb3JtTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHQgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbTsNCisgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID0gcExheW91dE5leHQ7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9VSU5UOCB1SEFsaWduID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSEFsaWduRW51bVRvSW50KHBMYXlvdXROZXh0LT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpOw0KKyAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocExheW91dE5leHQpOw0KKyAgICAgICAgICAgICAgICBpZiAoZUZsb3dTdHJhdGVneSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90Yikgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVIQWxpZ24gPiB1Q3VySEFsaWduU3RhdGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUgPSB1SEFsaWduOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVIQWxpZ24gPCB1Q3VySEFsaWduU3RhdGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSA9IHVIQWxpZ247DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dE5leHQtPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBMYXlvdXROZXh0LT5tX3NTaXplLnkgPiBmQ29udGVudEN1clJvd0hlaWdodCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gcExheW91dE5leHQtPm1fc1NpemUueTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBwTGF5b3V0TmV4dC0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPT0gcExheW91dENoaWxkKSB7DQorICAgICAgICAgICAgICAgIG1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0TmV4dCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICAgZm9yICg7IHBMYXlvdXROZXh0OyBwTGF5b3V0TmV4dCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcgPT0gcExheW91dENoaWxkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dE5leHRUZW1wID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQ7DQorICAgICAgICAgICAgd2hpbGUgKHBMYXlvdXROZXh0VGVtcCkgew0KKyAgICAgICAgICAgICAgICBwTGF5b3V0TmV4dFRlbXAtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwU2F2ZUxheW91dE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICAgICAgICAgIHBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBwTGF5b3V0TmV4dFRlbXAgPSBwU2F2ZUxheW91dE5leHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBMYXlvdXRDaGlsZCA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZShtX3BDdXJDaGlsZE5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYkFkZGVkSXRlbUluUm93ID0gRkFMU0U7DQorICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZICs9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydFBlbmRpbmdJdGVtcyh0aGlzLCBtX3BGb3JtTm9kZSk7DQorICAgICAgICAgICAgc3dpdGNoKG1fbkN1ckNoaWxkTm9kZVN0YWdlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDoNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lOg0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoRlhfSU5UMzIgaUluZGV4ID0gMDsgaUluZGV4IDwgbV9hcnJheUtlZXBJdGVtcy5HZXRTaXplKCk7IGlJbmRleCsrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbSA9IG1fYXJyYXlLZWVwSXRlbXMuR2V0QXQoaUluZGV4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocEl0ZW0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgLT0gcEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwTGVhZGVyTm9kZSA9IE5VTEwsICpwVHJhaWxlck5vZGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVBhZ2UgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihiVXNlQnJlYWtDb250cm9sICYmIG1fcFBhZ2VNZ3IgJiYgbV9wUGFnZU1nci0+UHJvY2Vzc0JyZWFrQmVmb3JlT3JBZnRlcihtX3BDdXJDaGlsZE5vZGUsIFRSVUUsIHBMZWFkZXJOb2RlLCBwVHJhaWxlck5vZGUsIGJDcmVhdGVQYWdlKSAmJiBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0Zvcm0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJDcmVhdGVQYWdlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocExlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZSh0aGlzLCBwTGVhZGVyTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwVHJhaWxlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Gb3JtICYmIG1fcExheW91dEl0ZW0gPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHRoaXMsIHBUcmFpbGVyTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciAqcFByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocFRyYWlsZXJOb2RlLCBOVUxMKTsNCisjaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksIHVDdXJIQWxpZ25TdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBmQ29udGVudEN1clJvd1ksIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgcENvbnRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVJlc3VsdDsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBMZWFkZXJOb2RlID0gTlVMTCwgKnBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUGFnZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJVc2VCcmVha0NvbnRyb2wgJiYgbV9wUGFnZU1nciAmJiBtX3BQYWdlTWdyLT5Qcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKG1fcEN1ckNoaWxkTm9kZSwgRkFMU0UsIHBMZWFkZXJOb2RlLCBwVHJhaWxlck5vZGUsIGJDcmVhdGVQYWdlKSAmJiBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0Zvcm0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwVHJhaWxlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IgKnBQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBUcmFpbGVyTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVSZXN1bHQgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksIHVDdXJIQWxpZ25TdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcywgRkFMU0UsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgZkNvbnRlbnRDdXJSb3dZLCBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFiQ3JlYXRlUGFnZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKHJnQ3VyTGluZUxheW91dEl0ZW1zLCBlRmxvd1N0cmF0ZWd5LCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgZkNvbnRlbnRDdXJSb3dZLCBmQ29udGVudEN1clJvd0hlaWdodCwgZkNvbnRlbnRXaWR0aExpbWl0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcy0+UmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yICpwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwTGVhZGVyTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSh0aGlzLCBwUHJvY2Vzc29yLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LCB1Q3VySEFsaWduU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcywgRkFMU0UsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgZkNvbnRlbnRDdXJSb3dZLCBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBiQWRkZWRJdGVtSW5Sb3csIGJGb3JjZUVuZFBhZ2UsIHBDb250ZXh0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocExlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUodGhpcywgcExlYWRlck5vZGUsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJDcmVhdGVQYWdlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc01hbnVhbEJyZWFrID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQnJlYWtEb25lID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlcjogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcExlYWRlck5vZGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYobV9wUGFnZU1nciAmJiBtX3BQYWdlTWdyLT5Qcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcihtX3BDdXJDaGlsZE5vZGUsIFRSVUUsIHBMZWFkZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwTGVhZGVyTm9kZSwgbV9wUGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0odGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwgdUN1ckhBbGlnblN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBiVXNlQnJlYWtDb250cm9sLCBmQXZhaWxIZWlnaHQsIGZSZWFsSGVpZ2h0LCBmQ29udGVudEN1clJvd1ksIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBiQWRkZWRJdGVtSW5Sb3csIGJGb3JjZUVuZFBhZ2UsIHBDb250ZXh0KSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXI6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtX3BQYWdlTWdyICYmIG1fcFBhZ2VNZ3ItPlByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKG1fcEN1ckNoaWxkTm9kZSwgRkFMU0UsIHBUcmFpbGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocFRyYWlsZXJOb2RlLCBtX3BQYWdlTWdyKTsNCisjaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3IpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSh0aGlzLCBwUHJvY2Vzc29yLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LCB1Q3VySEFsaWduU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGJVc2VCcmVha0NvbnRyb2wsIGZBdmFpbEhlaWdodCwgZlJlYWxIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgcENvbnRleHQpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI6DQorICAgICAgICAgICAgICAgICAgICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSk7DQorICAgICAgICAgICAgICAgICAgICBpZihtX3BDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q3VyUm93WSA+PSBmSGVpZ2h0TGltaXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiAmJiBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKG1fcEN1ckNoaWxkTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZihtX3BDdXJDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmV3Um93ID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmV3Um93ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKHBQcm9jZXNzb3IsIG1fcEN1ckNoaWxkTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgcnMgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksIHVDdXJIQWxpZ25TdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBiVXNlQnJlYWtDb250cm9sLCBmQXZhaWxIZWlnaHQsIGZSZWFsSGVpZ2h0LCBmQ29udGVudEN1clJvd1ksIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgcENvbnRleHQsIGJOZXdSb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChycykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X01hbnVhbEJyZWFrOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWs6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Sb3dGdWxsQnJlYWs6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93WSArPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRQZW5kaW5nSXRlbXMocFByb2Nlc3NvciwgbV9wQ3VyQ2hpbGROb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZToNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgaWYoYkFkZGVkSXRlbUluUm93ICYmIGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KK1N1c3BlbmRBbmRDcmVhdGVOZXdSb3c6DQorICAgICAgICAgICAgaWYgKHBQcm9jZXNzb3IpIHsNCisgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24ocmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50V2lkdGhMaW1pdCwgYlJvb3RGb3JjZVRiKTsNCisgICAgICAgIG1fZldpZHRoTGltaXRlID0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoOw0KKyAgICAgICAgaWYoYkZvcmNlRW5kUGFnZSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0JPT0wgYlJldFZhbHVlID0gKG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUgJiYgbV9yZ1BlbmRpbmdOb2Rlcy5HZXRDb3VudCgpID09IDApOw0KKyAgICBpZihiQnJlYWtEb25lKSB7DQorICAgICAgICBiUmV0VmFsdWUgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKG1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDb250YWluZXJIZWlnaHQpOw0KKyAgICBpZihmQ29udGFpbmVySGVpZ2h0ID49IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OIHx8IG1fcExheW91dEl0ZW0gfHwgYlJldFZhbHVlKSB7DQorICAgICAgICBpZihtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoZkNvbnRhaW5lckhlaWdodCA8IDAgKSB7DQorICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICAgICAgICB9DQorICAgICAgICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KKyAgICAgICAgaWYoYkZvcmNlRW5kUGFnZSkgew0KKyAgICAgICAgICAgIG1fZlVzZWRTaXplID0gMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9mVXNlZFNpemUgKz0gbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBiUmV0VmFsdWUgPyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lIDogKGJJc01hbnVhbEJyZWFrID8gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWsgOiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrKTsNCit9DQorRlhfQk9PTAkgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkNhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPigmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLCBYRkFfQVRUUklCVVRFRU5VTSBlRmxvd1N0cmF0ZWd5LCBGWF9CT09MIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwNCisgICAgICAgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIEZYX0ZMT0FUJiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgRlhfRkxPQVQmIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCwgIEZYX0JPT0wgYlJvb3RGb3JjZVRiKQ0KK3sNCisgICAgRlhfSU5UMzIgbkdyb3VwTGVuZ3Roc1szXSA9IHswLCAwLCAwfTsNCisgICAgRlhfRkxPQVQgIGZHcm91cFdpZHRoc1szXSA9IHswLCAwLCAwfTsNCisgICAgRlhfSU5UMzIgblRvdGFsTGVuZ3RoID0gMDsNCisgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgMzsgaSArKykgew0KKyAgICAgICAgbkdyb3VwTGVuZ3Roc1tpXSA9IHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldLkdldFNpemUoKTsNCisgICAgICAgIGZvcihGWF9JTlQzMiBjID0gbkdyb3VwTGVuZ3Roc1tpXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICAgICAgICBuVG90YWxMZW5ndGgrKzsNCisgICAgICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldW2pdLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgZkdyb3VwV2lkdGhzW2ldICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldW2pdLT5tX3NTaXplLng7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKCFuVG90YWxMZW5ndGgpIHsNCisgICAgICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZOZXdIZWlnaHQgPSBmQ29udGVudEN1clJvd1k7DQorICAgICAgICAgICAgaWYoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID4gZk5ld0hlaWdodCkgew0KKyAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmTmV3SGVpZ2h0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZihtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQorICAgIH0NCisgICAgaWYgKGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDdXJQb3M7DQorICAgICAgICBmQ3VyUG9zID0gMDsNCisgICAgICAgIGZvcihGWF9JTlQzMiBjID0gbkdyb3VwTGVuZ3Roc1swXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICAgICAgICBpZihiUm9vdEZvcmNlVGIpIHsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkFic29sdXRlWCwgZkFic29sdXRlWTsNCisgICAgICAgICAgICAgICAgQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9wRm9ybU5vZGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLngsIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLnksIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zUG9zLlNldChmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgICAgICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGZDdXJQb3MgKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUueDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXSk7DQorICAgICAgICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgICAgIH0NCisgICAgICAgIGZDdXJQb3MgPSAoZkNvbnRlbnRXaWR0aExpbWl0ICsgZkdyb3VwV2lkdGhzWzBdIC0gZkdyb3VwV2lkdGhzWzFdIC0gZkdyb3VwV2lkdGhzWzJdKSAvIDI7DQorICAgICAgICBmb3IoRlhfSU5UMzIgYyA9IG5Hcm91cExlbmd0aHNbMV0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgICAgICAgaWYoYlJvb3RGb3JjZVRiKSB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVk7DQorICAgICAgICAgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlLCByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS54LCByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS55LCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplLng7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0pOw0KKyAgICAgICAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7DQorICAgICAgICB9DQorICAgICAgICBmQ3VyUG9zID0gZkNvbnRlbnRXaWR0aExpbWl0IC0gZkdyb3VwV2lkdGhzWzJdOw0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGMgPSBuR3JvdXBMZW5ndGhzWzJdLCBqID0gMDsgaiA8IGM7IGorKykgew0KKyAgICAgICAgICAgIGlmKGJSb290Rm9yY2VUYikgew0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZOw0KKyAgICAgICAgICAgICAgICBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSwgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1NpemUueCwgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1NpemUueSwgZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MuU2V0KGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQorICAgICAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZkN1clBvcyArPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdKTsNCisgICAgICAgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgZkN1clBvczsNCisgICAgICAgIGZDdXJQb3MgPSBmR3JvdXBXaWR0aHNbMF07DQorICAgICAgICBmb3IoRlhfSU5UMzIgYyA9IG5Hcm91cExlbmd0aHNbMF0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUueDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICAgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXSk7DQorICAgICAgICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgICAgIH0NCisgICAgICAgIGZDdXJQb3MgPSAoZkNvbnRlbnRXaWR0aExpbWl0ICsgZkdyb3VwV2lkdGhzWzBdICsgZkdyb3VwV2lkdGhzWzFdIC0gZkdyb3VwV2lkdGhzWzJdKSAvIDI7DQorICAgICAgICBmb3IoRlhfSU5UMzIgYyA9IG5Hcm91cExlbmd0aHNbMV0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUueDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICAgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXSk7DQorICAgICAgICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgICAgIH0NCisgICAgICAgIGZDdXJQb3MgPSBmQ29udGVudFdpZHRoTGltaXQ7DQorICAgICAgICBmb3IoRlhfSU5UMzIgYyA9IG5Hcm91cExlbmd0aHNbMl0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1NpemUueDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICAgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXSk7DQorICAgICAgICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX2ZMYXN0Um93WSA9IGZDb250ZW50Q3VyUm93WTsNCisgICAgZkNvbnRlbnRDdXJSb3dZICs9IGZDb250ZW50Q3VyUm93SGVpZ2h0Ow0KKyAgICBpZihiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZHcm91cFdpZHRoc1swXTsNCisgICAgICAgIGlmKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmIGZDb250ZW50V2lkdGhMaW1pdCA+IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCisgICAgICAgICAgICBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkNvbnRlbnRXaWR0aExpbWl0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gZkNvbnRlbnRDdXJSb3dZOw0KKyAgICAgICAgaWYoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IDwgZkNoaWxkU3VwcGxpZWRIZWlnaHQpIHsNCisgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkdldFN1YmZvcm1TZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldCkNCit7DQorICAgIGlmKHBTdWJmb3JtU2V0ICYmIHBTdWJmb3JtU2V0LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcFN1YmZvcm1TZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgd2hpbGUocFBhcmVudCkgew0KKyAgICAgICAgICAgIGlmKHBQYXJlbnQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwUGFyZW50Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBTdWJmb3JtU2V0Ow0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRGaWVsZCgpDQorew0KKyAgICBpZihtX3BMYXlvdXRJdGVtICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpOw0KKyAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgICBpZiAoIW1fcExheW91dEl0ZW0pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IC0xOw0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSAtMTsNCisgICAgcE5vdGlmeS0+U3RhcnRGaWVsZERyYXdMYXlvdXQobV9wRm9ybU5vZGUsIGZXaWR0aCwgZkhlaWdodCk7DQorICAgIEZYX0lOVDMyIG5Sb3RhdGUgPSBGWFNZU19yb3VuZChtX3BGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JvdGF0ZSkuR2V0VmFsdWUoKSk7DQorICAgIG5Sb3RhdGUgPSAoblJvdGF0ZSA8IDAgPyAoblJvdGF0ZSAlIDM2MCkgKyAzNjAgOiBuUm90YXRlICUgMzYwKTsNCisgICAgaWYoblJvdGF0ZSA9PSA5MCB8fCBuUm90YXRlID09IDI3MCkgew0KKyAgICAgICAgRlhfRkxPQVQgZlRtcCA9IGZXaWR0aDsNCisgICAgICAgIGZXaWR0aCA9IGZIZWlnaHQ7DQorICAgICAgICBmSGVpZ2h0ID0gZlRtcDsNCisgICAgfQ0KKyAgICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK30NCitYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0KEZYX0JPT0wgYlVzZUJyZWFrQ29udHJvbCwgRlhfRkxPQVQgZkhlaWdodExpbWl0LCBGWF9GTE9BVCBmUmVhbEhlaWdodCwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCkNCit7DQorICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gbV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgc3dpdGNoKGVDbGFzc0lEKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDogew0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSb290Rm9yY2VUYiA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBMYXlvdXROb2RlID0gR2V0U3ViZm9ybVNldFBhcmVudChtX3BGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRTdHJhdGVneSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dChwTGF5b3V0Tm9kZSwgYlJvb3RGb3JjZVRiKTsNCisgICAgICAgICAgICAgICAgc3dpdGNoKGVMYXlvdXRTdHJhdGVneSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEb0xheW91dEZsb3dlZENvbnRhaW5lcihiVXNlQnJlYWtDb250cm9sLCBlTGF5b3V0U3RyYXRlZ3ksIGZIZWlnaHRMaW1pdCwgZlJlYWxIZWlnaHQsIHBDb250ZXh0LCBiUm9vdEZvcmNlVGIpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjoNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93Og0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3c6DQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgIERvTGF5b3V0UG9zaXRpb25lZENvbnRhaW5lcihwQ29udGV4dCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZToNCisgICAgICAgICAgICAgICAgICAgICAgICBEb0xheW91dFRhYmxlQ29udGFpbmVyKHBMYXlvdXROb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOg0KKyAgICAgICAgICAgIERvTGF5b3V0RmllbGQoKTsNCisgICAgICAgICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOg0KKyAgICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCYgZkFic29sdXRlWCwgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpDQorew0KKyAgICBBU1NFUlQobV9wTGF5b3V0SXRlbSk7DQorICAgIGZBYnNvbHV0ZVggPSBtX3BMYXlvdXRJdGVtLT5tX3NQb3MueDsNCisgICAgZkFic29sdXRlWSA9IG1fcExheW91dEl0ZW0tPm1fc1Bvcy55Ow0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0Q3VycmVudENvbXBvbmVudFNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpDQorew0KKyAgICBBU1NFUlQobV9wTGF5b3V0SXRlbSk7DQorICAgIGZXaWR0aCA9IG1fcExheW91dEl0ZW0tPm1fc1NpemUueDsNCisgICAgZkhlaWdodCA9IG1fcExheW91dEl0ZW0tPm1fc1NpemUueTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQgZkFic29sdXRlWCwgRlhfRkxPQVQgZkFic29sdXRlWSkNCit7DQorICAgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgICAgbV9wTGF5b3V0SXRlbS0+bV9zUG9zLlNldChmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCkNCit7DQorICAgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgICAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoZldpZHRoLCBmSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQorew0KKyAgICBpZihwRm9ybU5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgaWYgKCFwVGVtcGxhdGUpIHsNCisgICAgICAgIHBUZW1wbGF0ZSA9IHBGb3JtTm9kZTsNCisgICAgfQ0KKyAgICBDWEZBX09jY3VyIE5vZGVPY2N1ciA9IHBUZW1wbGF0ZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgICBGWF9JTlQzMiBpTWF4ID0gTm9kZU9jY3VyLkdldE1heCgpOw0KKyAgICBpZiAoaU1heCA+IC0xKSB7DQorICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpbV9QZW5kaW5nTm9kZXNDb3VudC5HZXRWYWx1ZUF0KHBUZW1wbGF0ZSk7DQorICAgICAgICBpZiAoaUNvdW50ID49IGlNYXgpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpQ291bnQrKzsNCisgICAgICAgIG1fUGVuZGluZ05vZGVzQ291bnQuU2V0QXQocFRlbXBsYXRlLCAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKShpQ291bnQpKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDRmYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaApAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfTEFZT1VUX0lURU1MQVlPVVRfSF8NCisjZGVmaW5lIF9YRkFfTEFZT1VUX0lURU1MQVlPVVRfSF8NCisjZGVmaW5lIFhGQV9MQVlPVVRfSU5WQUxJRE5PREUgKChDWEZBX05vZGUqKShGWF9JTlRQVFIpLTEpDQorI2RlZmluZSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiAoMC4wMDA1ZikNCisjaW5jbHVkZSAiZmxvYXQuaCINCisjZGVmaW5lIFhGQV9MQVlPVVRfRkxPQVRfTUFYCUZMVF9NQVgNCitjbGFzcyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I7DQorY2xhc3MgQ1hGQV9MYXlvdXRQYWdlTWdyOw0KK2NsYXNzIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGw7DQorY2xhc3MgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGw7DQorZW51bSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCB7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUsDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWssDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1Jvd0Z1bGxCcmVhaywNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWssDQorfTsNCitlbnVtIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIHsNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlciwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmUsDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0tlZXAsDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lciwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlciwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXIsDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUsDQorfTsNCitjbGFzcyBDWEZBX0xheW91dENvbnRleHQgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfTGF5b3V0Q29udGV4dCgpOiBtX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocyhOVUxMKQ0KKyAgICAgICAgLCBtX2ZDdXJDb2x1bW5XaWR0aCgwKQ0KKyAgICAgICAgLCBtX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlKEZBTFNFKQ0KKyAgICAgICAgLCBtX3BPdmVyZmxvd1Byb2Nlc3NvcihOVUxMKQ0KKyAgICAgICAgLCBtX3BPdmVyZmxvd05vZGUoTlVMTCkNCisgICAgew0KKyAgICB9DQorICAgIH5DWEZBX0xheW91dENvbnRleHQoKQ0KKyAgICB7DQorICAgICAgICBtX3BPdmVyZmxvd1Byb2Nlc3NvciA9IE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+KgltX3ByZ1NwZWNpZmllZENvbHVtbldpZHRoczsNCisgICAgRlhfRkxPQVQJCQkJCQltX2ZDdXJDb2x1bW5XaWR0aDsNCisgICAgRlhfQk9PTAkJCQkJCQltX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlOw0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqCQltX3BPdmVyZmxvd1Byb2Nlc3NvcjsNCisgICAgQ1hGQV9Ob2RlKgkJCQkJCW1fcE92ZXJmbG93Tm9kZTsNCit9Ow0KK2NsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKENYRkFfTm9kZSAqcE5vZGUsIENYRkFfTGF5b3V0UGFnZU1nciogcFBhZ2VNZ3IpOw0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBEb0xheW91dChGWF9CT09MIGJVc2VCcmVha0NvbnRyb2wsIEZYX0ZMT0FUIGZIZWlnaHRMaW1pdCwgRlhfRkxPQVQgZlJlYWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwpOw0KKyAgICB2b2lkIEdldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQmIGZBYnNvbHV0ZVgsIEZYX0ZMT0FUJiBmQWJzb2x1dGVZKTsNCisgICAgdm9pZCBHZXRDdXJyZW50Q29tcG9uZW50U2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCk7DQorICAgIHZvaWQgU2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCBmQWJzb2x1dGVYLCBGWF9GTE9BVCBmQWJzb2x1dGVZKTsNCisgICAgdm9pZCBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgICBpbmxpbmUgQ1hGQV9Ob2RlKgkJCUdldEZvcm1Ob2RlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEZvcm1Ob2RlOw0KKyAgICB9DQorICAgIGlubGluZSBGWF9CT09MCQkJCUhhc0xheW91dEl0ZW0oKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wTGF5b3V0SXRlbSAhPSBOVUxMOw0KKyAgICB9DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBFeHRyYWN0TGF5b3V0SXRlbSgpOw0KKw0KKyAgICBzdGF0aWMgRlhfQk9PTCAgSW5jcmVtZW50UmVsYXlvdXROb2RlKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yLCBDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBQYXJlbnROb2RlKTsNCisgICAgc3RhdGljIHZvaWQJCUNhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoQ1hGQV9Ob2RlKiBwTm9kZSwgRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0LCBGWF9GTE9BVCYgZkFic29sdXRlWCwgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpOw0KKyAgICBzdGF0aWMgRlhfQk9PTAlGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSwgRlhfRkxPQVQgZkN1clZlcnRpY2FsT2Zmc2V0LCBGWF9GTE9BVCYgZlByb3Bvc2VkU3BsaXRQb3MsIEZYX0JPT0wmIGJBcHBDaGFuZ2UsIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiA9IFRSVUUpOw0KKyAgICBGWF9GTE9BVAkJRmluZFNwbGl0UG9zKEZYX0ZMT0FUIGZQcm9wb3NlZFNwbGl0UG9zKTsNCisgICAgdm9pZAkJCVNwbGl0TGF5b3V0SXRlbShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwU2Vjb25kUGFyZW50LCBGWF9GTE9BVCBmU3BsaXRQb3MpOw0KKyAgICB2b2lkCQkJU3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcyk7DQorICAgIEZYX0JPT0wJCQlKdWRnZVB1dE5leHRQYWdlKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSwgRlhfRkxPQVQgZkNoaWxkSGVpZ2h0LCBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+ICZwS2VlcEl0ZW1zKTsNCisgICAgRlhfQk9PTAkJCVByb2Nlc3NLZWVwRm9yU3BsaXRlKENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFBhcmVudFByb2Nlc3NvciwgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwQ2hpbGRQcm9jZXNzb3IsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4mIHJnQ3VyTGluZUxheW91dEl0ZW0sIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd1ksIEZYX0JPT0wmIGJBZGRlZEl0ZW1JblJvdywgRlhfQk9PTCYgYkZvcmNlRW5kUGFnZSwgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQmIHJlc3VsdCk7DQorICAgIEZYX0ZMT0FUCQlJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKTsNCisgICAgdm9pZAkJCURvTGF5b3V0UGFnZUFyZWEoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhZ2VBcmVhTGF5b3V0SXRlbSk7DQorICAgIEZYX0JPT0wJCQlDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4oJnJnQ3VyTGluZUxheW91dEl0ZW1zKVszXSwgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwgRlhfQk9PTCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsDQorICAgICAgICAgICAgRlhfQk9PTCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgRlhfRkxPQVQmIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBGWF9GTE9BVCYgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQsIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0UpOw0KKyAgICB2b2lkCQkJUHJvY2Vzc1VuVXNlT3ZlckZsb3coQ1hGQV9Ob2RlKiBwTGVhZGVyTm9kZSwgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUsIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVHJhaWxlckl0ZW0sIENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgICAgdm9pZAkJCVByb2Nlc3NVblVzZUJpbmRzKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgICAgRlhfQk9PTAkJCUlzQWRkTmV3Um93Rm9yVHJhaWxlcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJJdGVtKTsNCisgICAgRlhfQk9PTAkJCUp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogQ3JlYXRlQ29udGVudExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZAlEb0xheW91dFBvc2l0aW9uZWRDb250YWluZXIoQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwpOw0KKyAgICB2b2lkCURvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSk7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKEZYX0JPT0wgYlVzZUJyZWFrQ29udHJvbCwgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwgRlhfRkxPQVQgZkhlaWdodExpbWl0LCBGWF9GTE9BVCBmUmVhbEhlaWdodCwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwsIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0UpOw0KKyAgICB2b2lkCURvTGF5b3V0RmllbGQoKTsNCisgICAgdm9pZAlYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsIENYRkFfTm9kZSogcFBhcmVudENvbnRhaW5lciwgRlhfQk9PTCBiVXNlUGFnZUJyZWFrKTsNCisgICAgRlhfQk9PTCBQcm9jZXNzS2VlcE5vZGVzRm9yQ2hlY2tOZXh0KENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLCBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLCBDWEZBX05vZGUqJiBwTmV4dENvbnRhaW5lciwgRlhfQk9PTCYgYkxhc3RLZWVwTm9kZSk7DQorICAgIEZYX0JPT0wgUHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLCBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLCBDWEZBX05vZGUqIHBDb250YWluZXJOb2RlKTsNCisgICAgQ1hGQV9Ob2RlKiBHZXRTdWJmb3JtU2V0UGFyZW50KENYRkFfTm9kZSogcFN1YmZvcm1TZXQpOw0KKw0KK3B1YmxpYzoNCisgICAgRlhfQk9PTAkJbV9iS2VlcEJyZWFrRmluaXNoOw0KKyAgICBGWF9CT09MCQltX2JJc1Byb2Nlc3NLZWVwOw0KKyAgICBDWEZBX05vZGUqCW1fcEtlZXBIZWFkTm9kZTsNCisgICAgQ1hGQV9Ob2RlKgltX3BLZWVwVGFpbE5vZGU7DQorICAgIENYRkFfTm9kZSoJCQkJCQltX3BGb3JtTm9kZTsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqCQltX3BMYXlvdXRJdGVtOw0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCoJCW1fcE9sZExheW91dEl0ZW07DQorI2Vsc2UNCisgICAgQ1hGQV9MYXlvdXRQYWdlTWdyKgkJCQltX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgQ1hGQV9Ob2RlKgkJCQkJCW1fcEN1ckNoaWxkTm9kZTsNCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKgkJbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3I7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzCW1fbkN1ckNoaWxkTm9kZVN0YWdlOw0KKyAgICBGWF9GTE9BVAkJCQkJCW1fZlVzZWRTaXplOw0KKyAgICBDWEZBX0xheW91dFBhZ2VNZ3IqCQkJCW1fcFBhZ2VNZ3I7DQorICAgIENGWF9QdHJMaXN0CQkJCQkJbV9yZ1BlbmRpbmdOb2RlczsNCisgICAgRlhfQk9PTAkJCQkJCQltX2JCcmVha1BlbmRpbmc7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPgkJbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoczsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPiBtX2FycmF5S2VlcEl0ZW1zOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQkJCW1fUGVuZGluZ05vZGVzQ291bnQ7DQorICAgIEZYX0ZMT0FUCQkJCQkJbV9mTGFzdFJvd1dpZHRoOw0KKyAgICBGWF9GTE9BVAkJCQkJCW1fZkxhc3RSb3dZOw0KKyAgICBGWF9GTE9BVAkJCQkJCW1fZldpZHRoTGltaXRlOw0KKyAgICBGWF9CT09MCQkJCQkJCW1fYlVzZUluaGVyaWF0ZWQ7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0ICAgbV9lUHJlUHJvY2Vzc1JzOw0KKyAgICBGWF9CT09MCQkJCQkJCW1fYkhhc0F2YWlsSGVpZ2h0Ow0KK307DQorRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKENYRkFfTm9kZSogcE5vZGUpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9wYWdlbWdyX25ldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyZDgxMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuY3BwCkBAIC0wLDAgKzEsMTY4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9pdGVtbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9hcHBhZGFwdGVyLmgiDQorQ1hGQV9MYXlvdXRQYWdlTWdyOjpDWEZBX0xheW91dFBhZ2VNZ3IoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IpDQorICAgIDogbV9wTGF5b3V0UHJvY2Vzc29yKHBMYXlvdXRQcm9jZXNzb3IpDQorICAgICwgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdChOVUxMKQ0KKyAgICAsIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdChOVUxMKQ0KKyAgICAsIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQoTlVMTCkNCisgICAgLCBtX25DdXJQYWdlQ291bnQoMCkNCisgICAgLCBtX3BDdXJQYWdlQXJlYShOVUxMKQ0KKyAgICAsIG1fZVBhZ2VTZXRNb2RlKFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlKQ0KKyAgICAsIG1fbkF2YWlsUGFnZXMoMCkNCisgICAgLCBtX3BQYWdlU2V0Q3VyUm9vdChOVUxMKQ0KKyAgICAsIG1fYkNyZWF0ZU92ZXJGbG93UGFnZShGQUxTRSkNCit7DQorfQ0KK0NYRkFfTGF5b3V0UGFnZU1ncjo6fkNYRkFfTGF5b3V0UGFnZU1ncigpDQorew0KKyAgICBDbGVhckRhdGEoKTsNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcExheW91dEl0ZW0gPSBHZXRSb290TGF5b3V0SXRlbSgpOw0KKyAgICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dExheW91dCA9IE5VTEw7DQorICAgIGZvcig7IHBMYXlvdXRJdGVtOyBwTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0KSB7DQorICAgICAgICBwTmV4dExheW91dCA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwTGF5b3V0SXRlbSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkluaXRMYXlvdXRQYWdlKENYRkFfTm9kZSogcEZvcm1Ob2RlKQ0KK3sNCisgICAgUHJlcGFyZUxheW91dCgpOw0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICBpZiAoIXBUZW1wbGF0ZU5vZGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290ID0gcFRlbXBsYXRlTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICAgIEFTU0VSVChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgICAgaWYgKG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCkgew0KKyAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BGaXJzdENoaWxkID0gTlVMTDsNCisgICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KKyAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BGb3JtTm9kZSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3Q7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QgPSBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgICAgfQ0KKyAgICBtX3BQYWdlU2V0Q3VyUm9vdCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksIChGWF9MUFZPSUQpbV9wUGFnZVNldExheW91dEl0ZW1Sb290KTsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZVJlbGF0aW9uID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsNCisgICAgaWYoZVJlbGF0aW9uICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pIHsNCisgICAgICAgIG1fZVBhZ2VTZXRNb2RlID0gZVJlbGF0aW9uOw0KKyAgICB9DQorICAgIEluaXRQYWdlU2V0TWFwKCk7DQorICAgIENYRkFfTm9kZSogcFBhZ2VBcmVhID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgZm9yIChwUGFnZUFyZWEgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBQYWdlQXJlYTsgcFBhZ2VBcmVhID0gcFBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZiAocFBhZ2VBcmVhLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgICAgICBpQ291bnQrKzsNCisgICAgICAgICAgICBpZiAocFBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcFRlbXBsYXRlTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgSVhGQV9PYmpGYWN0b3J5KiBwT2JqRmFjdG9yeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKTsNCisgICAgcFBhZ2VBcmVhID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KKyAgICBpZiAoIXBQYWdlQXJlYSkgew0KKyAgICAgICAgcFBhZ2VBcmVhID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUobV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0UGFja2V0SUQoKSwgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KKyAgICAgICAgaWYoIXBQYWdlQXJlYSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkluc2VydENoaWxkKHBQYWdlQXJlYSwgTlVMTCk7DQorICAgICAgICBwUGFnZUFyZWEtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9IHBQYWdlQXJlYS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KKyAgICBpZiAoIXBDb250ZW50QXJlYSkgew0KKyAgICAgICAgcENvbnRlbnRBcmVhID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUocFBhZ2VBcmVhLT5HZXRQYWNrZXRJRCgpLCBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgICAgICBpZighcENvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFBhZ2VBcmVhLT5JbnNlcnRDaGlsZChwQ29udGVudEFyZWEsIE5VTEwpOw0KKyAgICAgICAgcENvbnRlbnRBcmVhLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YLCBDWEZBX01lYXN1cmVtZW50KDAuMjVmLCBYRkFfVU5JVF9JbikpOw0KKyAgICAgICAgcENvbnRlbnRBcmVhLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSwgQ1hGQV9NZWFzdXJlbWVudCgwLjI1ZiwgWEZBX1VOSVRfSW4pKTsNCisgICAgICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1csIENYRkFfTWVhc3VyZW1lbnQoOC4wZiwgWEZBX1VOSVRfSW4pKTsNCisgICAgICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIENYRkFfTWVhc3VyZW1lbnQoMTAuNWYsIFhGQV9VTklUX0luKSk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTWVkaXVtICA9IHBQYWdlQXJlYS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVkaXVtKTsNCisgICAgaWYgKCFwTWVkaXVtKSB7DQorICAgICAgICBwTWVkaXVtID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUocFBhZ2VBcmVhLT5HZXRQYWNrZXRJRCgpLCBYRkFfRUxFTUVOVF9NZWRpdW0pOw0KKyAgICAgICAgaWYoIXBDb250ZW50QXJlYSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHBQYWdlQXJlYS0+SW5zZXJ0Q2hpbGQocE1lZGl1bSwgTlVMTCk7DQorICAgICAgICBwTWVkaXVtLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICBwTWVkaXVtLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2hvcnQsIENYRkFfTWVhc3VyZW1lbnQoOC41ZiwgWEZBX1VOSVRfSW4pKTsNCisgICAgICAgIHBNZWRpdW0tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Mb25nLCBDWEZBX01lYXN1cmVtZW50KDExLjBmLCBYRkFfVU5JVF9JbikpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJlcGFyZUZpcnN0UGFnZShDWEZBX05vZGUqIHBSb290U3ViZm9ybSkNCit7DQorICAgIEZYX0JPT0wgYlByb0JyZWFrQmVmb3JlID0gRkFMU0U7DQorICAgIENYRkFfTm9kZSogcEJyZWFrQmVmb3JlTm9kZSA9IE5VTEw7DQorICAgIHdoaWxlIChwUm9vdFN1YmZvcm0pIHsNCisgICAgICAgIGZvcihDWEZBX05vZGUqIHBCcmVha05vZGUgPSBwUm9vdFN1YmZvcm0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcEJyZWFrTm9kZTsgcEJyZWFrTm9kZSA9IHBCcmVha05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBCcmVha05vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUgfHwgKGVUeXBlID09IFhGQV9FTEVNRU5UX0JyZWFrICYmIHBCcmVha05vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9CZWZvcmUpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pKSB7DQorICAgICAgICAgICAgICAgIGJQcm9CcmVha0JlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgICAgIHBCcmVha0JlZm9yZU5vZGUgPSBwQnJlYWtOb2RlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlByb0JyZWFrQmVmb3JlKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBiUHJvQnJlYWtCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgcFJvb3RTdWJmb3JtID0gcFJvb3RTdWJmb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgICAgICAgIHdoaWxlIChwUm9vdFN1YmZvcm0gJiYgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocFJvb3RTdWJmb3JtKSkgew0KKyAgICAgICAgICAgIHBSb290U3ViZm9ybSA9IHBSb290U3ViZm9ybS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyLCAqcFRyYWlsZXI7DQorICAgIGlmIChwQnJlYWtCZWZvcmVOb2RlICYmIEV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIocEJyZWFrQmVmb3JlTm9kZSwgVFJVRSwgcExlYWRlciwgcFRyYWlsZXIpKSB7DQorICAgICAgICBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEhlYWRQb3NpdGlvbigpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEFwcGVuZE5ld1BhZ2UoVFJVRSk7DQorfQ0KK0ZYX0JPT0wgIENYRkFfTGF5b3V0UGFnZU1ncjo6QXBwZW5kTmV3UGFnZShGWF9CT09MIGJGaXJzdFRlbVBhZ2UpDQorew0KKyAgICBpZihtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkICE9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRUYWlsUG9zaXRpb24oKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUGFnZU5vZGUgPSBHZXROZXh0QXZhaWxQYWdlQXJlYShOVUxMKTsNCisgICAgaWYgKCFwUGFnZU5vZGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoYkZpcnN0VGVtUGFnZSAmJiBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID09IE5VTEwpIHsNCisgICAgICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCk7DQorICAgIH0NCisgICAgcmV0dXJuICFiRmlyc3RUZW1QYWdlIHx8IG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgIT0gTlVMTDsNCit9DQorc3RhdGljIHZvaWQgWEZBX0xheW91dEl0ZW1NZ3JfUmVvcmRlckxheW91dEl0ZW1Ub1RhaWwoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQorew0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgICBpZighcFBhcmVudExheW91dEl0ZW0pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTmV4dCA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgcFBhcmVudExheW91dEl0ZW0tPlJlbW92ZUNoaWxkKHBMYXlvdXRJdGVtKTsNCisgICAgcFBhcmVudExheW91dEl0ZW0tPkFkZENoaWxkKHBMYXlvdXRJdGVtKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0xheW91dEl0ZW1NZ3JfUmVtb3ZlTGF5b3V0SXRlbShDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCit7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICAgIGlmKCFwUGFyZW50TGF5b3V0SXRlbSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBOZXh0ID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBwUGFyZW50TGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocExheW91dEl0ZW0pOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UmVtb3ZlTGF5b3V0UmVjb3JkKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLCBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpDQorew0KKyAgICBpZighcE5ld1JlY29yZCB8fCAhcFByZXZSZWNvcmQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZihwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VTZXQpIHsNCisgICAgICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1clBhZ2VTZXQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VBcmVhKSB7DQorICAgICAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW1vdmVMYXlvdXRJdGVtKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhICE9IHBQcmV2UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEpIHsNCisgICAgICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UmVvcmRlclBlbmRpbmdMYXlvdXRSZWNvcmRUb1RhaWwoQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUHJldlJlY29yZCkNCit7DQorICAgIGlmKCFwTmV3UmVjb3JkIHx8ICFwUHJldlJlY29yZCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ICE9IHBQcmV2UmVjb3JkLT5wQ3VyUGFnZVNldCkgew0KKyAgICAgICAgWEZBX0xheW91dEl0ZW1NZ3JfUmVvcmRlckxheW91dEl0ZW1Ub1RhaWwocE5ld1JlY29yZC0+cEN1clBhZ2VTZXQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VBcmVhKSB7DQorICAgICAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSAhPSBwUHJldlJlY29yZC0+cEN1ckNvbnRlbnRBcmVhKSB7DQorICAgICAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpTdWJtaXRDb250ZW50SXRlbShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENvbnRlbnRMYXlvdXRJdGVtLCBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlU3RhdHVzKQ0KK3sNCisgICAgaWYocENvbnRlbnRMYXlvdXRJdGVtKSB7DQorICAgICAgICBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+QWRkQ2hpbGQocENvbnRlbnRMYXlvdXRJdGVtKTsNCisgICAgICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmKGVTdGF0dXMgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICAgICAgaWYoZVN0YXR1cyA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrICYmIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPT0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldFRhaWxQb3NpdGlvbigpKSB7DQorICAgICAgICAgICAgQXBwZW5kTmV3UGFnZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRUYWlsUG9zaXRpb24oKTsNCisgICAgICAgIG1fcEN1clBhZ2VBcmVhID0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZUFyZWEtPm1fcEZvcm1Ob2RlOw0KKyAgICB9DQorfQ0KK0ZYX0ZMT0FUIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0QXZhaWxIZWlnaHQoKQ0KK3sNCisgICAgRlhfRkxPQVQgZkF2YWlsSGVpZ2h0ID0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWEtPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgaWYgKGZBdmFpbEhlaWdodCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICBpZiAobV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9PSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCkpIHsNCisgICAgICAgICAgICBmQXZhaWxIZWlnaHQgPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmQXZhaWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZkF2YWlsSGVpZ2h0Ow0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KENYRkFfTm9kZSogcFBhZ2VTZXRSb290LCBGWF9CT09MIGJOZXdFeHByU3R5bGUsIENGWF9XaWRlU3RyaW5nQyYgd3NUYXJnZXRFeHByKQ0KK3sNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VTZXRSb290LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZih3c1RhcmdldEV4cHIuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RhcmdldEFsbCA9IHdzVGFyZ2V0RXhwcjsNCisgICAgd3NUYXJnZXRBbGwuVHJpbUxlZnQoKTsNCisgICAgd3NUYXJnZXRBbGwuVHJpbVJpZ2h0KCk7DQorICAgIEZYX0lOVDMyIGlTcGxpdGVJbmRleCA9IDA7DQorICAgIEZYX0JPT0wgYlRhcmdldEFsbEZpbmQgPSBUUlVFOw0KKyAgICB3aGlsZShpU3BsaXRlSW5kZXggIT0gLTEpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0RXhwcjsNCisgICAgICAgIEZYX0lOVDMyIGlTcGxpdGVOZXh0SW5kZXggPSAwOw0KKyAgICAgICAgaWYoIWJUYXJnZXRBbGxGaW5kKSB7DQorICAgICAgICAgICAgaVNwbGl0ZU5leHRJbmRleCA9IHdzVGFyZ2V0QWxsLkZpbmQoJyAnLCBpU3BsaXRlSW5kZXgpOw0KKyAgICAgICAgICAgIHdzVGFyZ2V0RXhwciA9IHdzVGFyZ2V0QWxsLk1pZChpU3BsaXRlSW5kZXgsIGlTcGxpdGVOZXh0SW5kZXggLSBpU3BsaXRlSW5kZXgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1RhcmdldEV4cHIgPSB3c1RhcmdldEFsbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHdzVGFyZ2V0RXhwci5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIGJUYXJnZXRBbGxGaW5kID0gRkFMU0U7DQorICAgICAgICBpZih3c1RhcmdldEV4cHIuR2V0QXQoMCkgPT0gJyMnKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQoKENYRkFfTm9kZSopcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSksIHdzVGFyZ2V0RXhwci5NaWQoMSkpOw0KKyAgICAgICAgICAgIGlmKHBOb2RlKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYoYk5ld0V4cHJTdHlsZSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvY2Vzc2VkVGFyZ2V0ID0gIHdzVGFyZ2V0RXhwcjsNCisgICAgICAgICAgICBpZih3c1RhcmdldEV4cHIuTGVmdCg0KSA9PSBGWF9XU1RSQyhMInNvbSgiKSAmJiB3c1RhcmdldEV4cHIuUmlnaHQoMSkgPT0gRlhfV1NUUkMoTCIpIikpIHsNCisgICAgICAgICAgICAgICAgd3NQcm9jZXNzZWRUYXJnZXQgPSB3c1RhcmdldEV4cHIuTWlkKDQsIHdzVGFyZ2V0RXhwci5HZXRMZW5ndGgoKSAtIDUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKHBQYWdlU2V0Um9vdCwgd3NQcm9jZXNzZWRUYXJnZXQsIHJzLCBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCk7DQorICAgICAgICAgICAgaWYoaUNvdW50ID4gMCAmJiBycy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIChDWEZBX05vZGUqKXJzLm5vZGVzWzBdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlTcGxpdGVJbmRleCA9IGlTcGxpdGVOZXh0SW5kZXg7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KKw0KK0ZYX0JPT0wgWEZBX0xheW91dFBhZ2VNZ3JfUnVuQnJlYWtUZXN0U2NyaXB0KENYRkFfTm9kZSogcFRlc3RTY3JpcHQpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICAgIHBUZXN0U2NyaXB0LT5UcnlDb250ZW50KHdzRXhwcmVzc2lvbik7DQorICAgIGlmKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBwVGVzdFNjcmlwdC0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5SdW5TY3JpcHQocFRlc3RTY3JpcHQsIHBUZXN0U2NyaXB0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSk7DQorfQ0KK0NYRkFfQ29udGFpbmVyUmVjb3JkKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkNyZWF0ZUNvbnRhaW5lclJlY29yZChDWEZBX05vZGUqIHBQYWdlTm9kZSwgRlhfQk9PTCBiQ3JlYXRlTmV3KQ0KK3sNCisgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBGWF9ORVcgQ1hGQV9Db250YWluZXJSZWNvcmQoKTsNCisgICAgaWYobV9wQ3VycmVudENvbnRhaW5lclJlY29yZCkgew0KKyAgICAgICAgaWYoIUlzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpIHx8IHBQYWdlTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgKnBOZXdSZWNvcmQgPSAqR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5BZGRUYWlsKHBOZXdSZWNvcmQpOw0KKyAgICAgICAgICAgIHJldHVybiBwTmV3UmVjb3JkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBpZighYkNyZWF0ZU5ldykgew0KKyAgICAgICAgICAgIGlmKHBQYWdlU2V0ID09IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpIHsNCisgICAgICAgICAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBtX3BQYWdlU2V0Q3VyUm9vdDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUGFnZVNldC0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgICAgICAgICAgICBpZihwUGFyZW50TGF5b3V0SXRlbSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwUGFyZW50TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRDdXJSb290Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gcFBhcmVudExheW91dEl0ZW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFyZW50UGFnZVNldExheW91dCA9IE5VTEw7DQorICAgICAgICAgICAgaWYocFBhZ2VTZXQgPT0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZVNldC0+bV9wRm9ybU5vZGUpIHsNCisgICAgICAgICAgICAgICAgcFBhcmVudFBhZ2VTZXRMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZVNldC0+bV9wUGFyZW50Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBQYXJlbnRQYWdlU2V0TGF5b3V0ID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZVNldExheW91dEl0ZW0gPSBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwUGFnZVNldCk7DQorICAgICAgICAgICAgcFBhZ2VTZXQtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCAoRlhfTFBWT0lEKXBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgaWYocFBhcmVudFBhZ2VTZXRMYXlvdXQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUHJlUGFnZVNldCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgICAgICAgICAgICAgICAgd2hpbGUocFByZVBhZ2VTZXQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgICAgICAgICAgICBwUHJlUGFnZVNldCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUHJlUGFnZVNldC0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFByZVBhZ2VTZXQtPm1fcE5leHRTaWJsaW5nID0gcFBhZ2VTZXRMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgICBtX3BQYWdlU2V0Q3VyUm9vdCA9IHBQYWdlU2V0TGF5b3V0SXRlbTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwUGFyZW50UGFnZVNldExheW91dC0+QWRkQ2hpbGQocFBhZ2VTZXRMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBwUGFnZVNldExheW91dEl0ZW07DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZihwUGFnZU5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gcFBhZ2VOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICBpZihwUGFnZVNldCA9PSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KSB7DQorICAgICAgICAgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlU2V0TGF5b3V0SXRlbSA9IEZYX05FVyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKHBQYWdlU2V0KTsNCisgICAgICAgICAgICAgICAgcFBhZ2VTZXQtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCAoRlhfTFBWT0lEKXBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+QWRkQ2hpbGQocFBhZ2VTZXRMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBwUGFnZVNldExheW91dEl0ZW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuQWRkVGFpbChwTmV3UmVjb3JkKTsNCisgICAgcmV0dXJuIHBOZXdSZWNvcmQ7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBZGRQYWdlQXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfTm9kZSogcE5ld1BhZ2VBcmVhKQ0KK3sNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgIGlmIChtX1BhZ2VBcnJheS5HZXRTaXplKCkgPiBtX25BdmFpbFBhZ2VzKSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSA9IG1fUGFnZUFycmF5W21fbkF2YWlsUGFnZXNdOw0KKyAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcE5ld1BhZ2VBcmVhOw0KKyAgICAgICAgbV9uQXZhaWxQYWdlcysrOw0KKyAgICAgICAgcE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSA9IHBDb250YWluZXJJdGVtOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwTmV3UGFnZUFyZWEtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBOb3RpZnktPk9uQ3JlYXRlTGF5b3V0SXRlbShwTmV3UGFnZUFyZWEpOw0KKyAgICAgICAgbV9QYWdlQXJyYXkuQWRkKHBDb250YWluZXJJdGVtKTsNCisgICAgICAgIG1fbkF2YWlsUGFnZXMrKzsNCisgICAgICAgIHBOb3RpZnktPk9uUGFnZUV2ZW50KChJWEZBX0xheW91dFBhZ2UqKXBDb250YWluZXJJdGVtLCBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCwgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUiltX25BdmFpbFBhZ2VzKTsNCisgICAgICAgIHBOZXdQYWdlQXJlYUxheW91dEl0ZW0gPSBwQ29udGFpbmVySXRlbTsNCisgICAgfQ0KKyAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldC0+QWRkQ2hpbGQocE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSk7DQorICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSA9IHBOZXdQYWdlQXJlYUxheW91dEl0ZW07DQorICAgIHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSA9IE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBZGRDb250ZW50QXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfTm9kZSogcENvbnRlbnRBcmVhKQ0KK3sNCisgICAgaWYocENvbnRlbnRBcmVhID09IE5VTEwpIHsNCisgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSA9IE5VTEw7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5ld0NvbnRlbnRBcmVhTGF5b3V0SXRlbSA9IEZYX05FVyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKHBDb250ZW50QXJlYSk7DQorICAgIEFTU0VSVChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEpOw0KKyAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEtPkFkZENoaWxkKHBOZXdDb250ZW50QXJlYUxheW91dEl0ZW0pOw0KKyAgICBwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEgPSBwTmV3Q29udGVudEFyZWFMYXlvdXRJdGVtOw0KK30NCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfUGFnZVNldENvbnRhaW5lckxheW91dEl0ZW0NCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQorICAgIHsNCisgICAgICAgIGlmKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgICAgIHdoaWxlKHBDaGlsZEl0ZW0gJiYgcENoaWxkSXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBwQ2hpbGRJdGVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXROZXh0U2libGluZyhDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCisgICAgew0KKyAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICB3aGlsZShwQ2hpbGRJdGVtICYmIHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcENoaWxkSXRlbTsNCisgICAgfQ0KKyAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldFBhcmVudChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgICB9DQorfTsNCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluaXNoUGFnaW5hdGVkUGFnZVNldHMoKQ0KK3sNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RQYWdlU2V0TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgICAgZm9yICg7IHBSb290UGFnZVNldExheW91dEl0ZW07IHBSb290UGFnZVNldExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RQYWdlU2V0TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VTZXRDb250YWluZXJMYXlvdXRJdGVtPiBzSXRlcmF0b3IocFJvb3RQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICBmb3IoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCAqcFBhZ2VTZXRMYXlvdXRJdGVtID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcFBhZ2VTZXRMYXlvdXRJdGVtOyBwUGFnZVNldExheW91dEl0ZW0gPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVBhZ2VSZWxhdGlvbiA9IHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZWxhdGlvbik7DQorICAgICAgICAgICAgc3dpdGNoKGVQYWdlUmVsYXRpb24pIHsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZToNCisgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NMYXN0UGFnZVNldCgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZDoNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWQ6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgblBhZ2VBcmVhQ291bnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0xheW91dEl0ZW1JbXBsKiBwUGFnZUFyZWFMYXlvdXRJdGVtID0gcFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwUGFnZUFyZWFMYXlvdXRJdGVtOyBwUGFnZUFyZWFMYXlvdXRJdGVtID0gcFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhZ2VBcmVhQ291bnQrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3RQYWdlQXJlYUxheW91dEl0ZW0gPSBwUGFnZUFyZWFMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZighcExhc3RQYWdlQXJlYUxheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleChwUGFnZVNldExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCBuUGFnZUFyZWFDb3VudCA9PSAxID8gWEZBX0FUVFJJQlVURUVOVU1fT25seSA6IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoblBhZ2VBcmVhQ291bnQgPT0gMSAmJiAhRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleChwUGFnZVNldExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSBtX3BDdXJQYWdlQXJlYTsNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQ3VyQ2hvaWNlID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVDdXJDaG9pY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlT2RkT3JFdmVuID0gWEZBX0FUVFJJQlVURUVOVU1fQW55Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX09kZE9yRXZlbiwgZU9kZE9yRXZlbik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXN0Q2hvaWNlID0gcExhc3RQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVMYXN0Q2hvaWNlID09IFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0ICYmIChlUGFnZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWQgfHwgZU9kZE9yRXZlbiAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZGQpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFJlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBSZWNvcmQsIHBOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2FibGUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1VzZWRIZWlnaHRzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ2hpbGRMYXlvdXRJdGVtID0gcExhc3RQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBDaGlsZExheW91dEl0ZW07IHBDaGlsZExheW91dEl0ZW0gPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVXNlZEhlaWdodCA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ29udGVudENoaWxkTGF5b3V0SXRlbSA9IHBDaGlsZExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtOyBwQ29udGVudENoaWxkTGF5b3V0SXRlbSA9IHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBDb250ZW50Q2hpbGRMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZVc2VkSGVpZ2h0ICs9ICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDb250ZW50Q2hpbGRMYXlvdXRJdGVtKS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnVXNlZEhlaWdodHMuQWRkKGZVc2VkSGVpZ2h0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUN1ckNvbnRlbnRBcmVhSW5kZXggPSAtMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENvbnRlbnRBcmVhTm9kZTsgcENvbnRlbnRBcmVhTm9kZSA9IHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocENvbnRlbnRBcmVhTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3VyQ29udGVudEFyZWFJbmRleCsrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZ1VzZWRIZWlnaHRzW2lDdXJDb250ZW50QXJlYUluZGV4XSA+IHBDb250ZW50QXJlYU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKS5Ub1VuaXQoWEZBX1VOSVRfUHQpICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVc2FibGUgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJVc2FibGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkTGF5b3V0SXRlbSA9IHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUgPSBwTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUocENoaWxkTGF5b3V0SXRlbSAmJiBwQ29udGVudEFyZWFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IHBDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocENvbnRlbnRBcmVhTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZSA9IHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9IHBDb250ZW50QXJlYU5vZGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtID0gcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlID0gcENvbnRlbnRBcmVhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbikgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFJlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocFJlY29yZCwgcE5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldFBhZ2VDb3VudCgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9QYWdlQXJyYXkuR2V0U2l6ZSgpOw0KK30NCitJWEZBX0xheW91dFBhZ2UqIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZShGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIGlmIChtX1BhZ2VBcnJheS5HZXRTaXplKCkgPiBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIChJWEZBX0xheW91dFBhZ2UqKW1fUGFnZUFycmF5W2luZGV4XTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorRlhfSU5UMzIgQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXRQYWdlSW5kZXgoSVhGQV9MYXlvdXRQYWdlKiBwUGFnZSkgY29uc3QNCit7DQorICAgIHJldHVybiBtX1BhZ2VBcnJheS5GaW5kKChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUGFnZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSdW5CcmVhayhYRkFfRUxFTUVOVCBlQnJlYWtUeXBlLCBYRkFfQVRUUklCVVRFRU5VTSBlVGFyZ2V0VHlwZSwgQ1hGQV9Ob2RlKiBwVGFyZ2V0LCBGWF9CT09MIGJTdGFydE5ldykNCit7DQorICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgICBzd2l0Y2goZVRhcmdldFR5cGUpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE6DQorICAgICAgICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgIHBUYXJnZXQgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIXBUYXJnZXQgfHwgIW1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgfHwgcFRhcmdldCAhPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGUgfHwgYlN0YXJ0TmV3KSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhZ2VBcmVhID0gTlVMTDsNCisgICAgICAgICAgICAgICAgaWYocFRhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgcFBhZ2VBcmVhID0gcFRhcmdldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFBhZ2VBcmVhID0gR2V0TmV4dEF2YWlsUGFnZUFyZWEocFBhZ2VBcmVhLCBwVGFyZ2V0KTsNCisgICAgICAgICAgICAgICAgYlJldCA9IHBQYWdlQXJlYSAhPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWE6DQorICAgICAgICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgIHBUYXJnZXQgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIXBUYXJnZXQgfHwgIW1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgfHwgcFRhcmdldCAhPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGUgfHwgYlN0YXJ0TmV3KSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhZ2VBcmVhID0gR2V0TmV4dEF2YWlsUGFnZUFyZWEocFRhcmdldCwgTlVMTCwgVFJVRSk7DQorICAgICAgICAgICAgICAgIGJSZXQgPSBwUGFnZUFyZWEgIT0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VPZGQ6DQorICAgICAgICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgIHBUYXJnZXQgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9uQXZhaWxQYWdlcyAlIDIgIT0gMSB8fCAhbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCB8fCAocFRhcmdldCAmJiBwVGFyZ2V0ICE9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZSkgfHwgYlN0YXJ0TmV3KSB7DQorICAgICAgICAgICAgICAgIGlmKG1fbkF2YWlsUGFnZXMgJSAyID09IDEpIHsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUV2ZW46DQorICAgICAgICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgIHBUYXJnZXQgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9uQXZhaWxQYWdlcyAlIDIgIT0gMCB8fCAhbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCB8fCAocFRhcmdldCAmJiBwVGFyZ2V0ICE9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZSkgIHx8IGJTdGFydE5ldykgew0KKyAgICAgICAgICAgICAgICBpZihtX25BdmFpbFBhZ2VzICUgMiA9PSAwKSB7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG86DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOzsNCisgICAgfQ0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSwgRlhfQk9PTCBiQmVmb3JlLCBDWEZBX05vZGUqICZwQnJlYWtMZWFkZXJUZW1wbGF0ZSwgQ1hGQV9Ob2RlKiAmcEJyZWFrVHJhaWxlclRlbXBsYXRlKQ0KK3sNCisgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwQ3VyTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBzd2l0Y2goZVR5cGUpIHsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmU6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXI6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQnJlYWtMZWFkZXIsIHdzQnJlYWtUcmFpbGVyOw0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQ29udGFpbmVyID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhcnROZXcgPSBwQ3VyTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX1N0YXJ0TmV3KSAhPSAwOw0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBTY3JpcHQgPSBwQ3VyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU2NyaXB0KTsNCisgICAgICAgICAgICAgICAgaWYocFNjcmlwdCAmJiAhWEZBX0xheW91dFBhZ2VNZ3JfUnVuQnJlYWtUZXN0U2NyaXB0KHBTY3JpcHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGFyZ2V0ID0gcEN1ck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0KTsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCBUUlVFLCB3c1RhcmdldCk7DQorICAgICAgICAgICAgICAgIHdzQnJlYWtUcmFpbGVyID0gcEN1ck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVHJhaWxlcik7DQorICAgICAgICAgICAgICAgIHdzQnJlYWtMZWFkZXIgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9MZWFkZXIpOw0KKyAgICAgICAgICAgICAgICBwQnJlYWtMZWFkZXJUZW1wbGF0ZSAgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzQnJlYWtMZWFkZXIpOw0KKyAgICAgICAgICAgICAgICBwQnJlYWtUcmFpbGVyVGVtcGxhdGUgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzQnJlYWtUcmFpbGVyKTsNCisgICAgICAgICAgICAgICAgaWYoUnVuQnJlYWsoZVR5cGUsIHBDdXJOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSksIHBUYXJnZXQsIGJTdGFydE5ldykpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYobV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldENvdW50KCkgPiAwICYmIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPT0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEhlYWRQb3NpdGlvbigpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVUeXBlID09IFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBQYXJlbnROb2RlIHx8IHBGb3JtTm9kZSAhPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Gb3JtKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWs6IHsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhcnROZXcgPSBwQ3VyTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX1N0YXJ0TmV3KSAhPSAwOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYXJnZXQgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoYkJlZm9yZSA/IFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0IDogWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCk7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRhcmdldCA9IFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgVFJVRSwgd3NUYXJnZXQpOw0KKyAgICAgICAgICAgICAgICBpZihSdW5CcmVhayhiQmVmb3JlID8gWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUgOiBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLCBwQ3VyTm9kZS0+R2V0RW51bShiQmVmb3JlID8gWEZBX0FUVFJJQlVURV9CZWZvcmUgOiBYRkFfQVRUUklCVVRFX0FmdGVyKSwgcFRhcmdldCwgYlN0YXJ0TmV3KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorc3RhdGljIHZvaWQgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UsIEZBTFNFKTsNCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlLCBGWF9CT09MIGJCZWZvcmUsIENYRkFfTm9kZSogJnBCcmVha0xlYWRlck5vZGUsIENYRkFfTm9kZSogJnBCcmVha1RyYWlsZXJOb2RlLCBGWF9CT09MJiBiQ3JlYXRlUGFnZSkNCit7DQorICAgIENYRkFfTm9kZSAqcExlYWRlclRlbXBsYXRlID0gTlVMTCwgKnBUcmFpbGVyVGVtcGxhdGUgPSBOVUxMOw0KKyAgICBDWEZBX05vZGUgKnBGb3JtTm9kZSA9IHBCcmVha05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBGb3JtTm9kZSkpIHsNCisgICAgICAgIGJDcmVhdGVQYWdlID0gRXhlY3V0ZUJyZWFrQmVmb3JlT3JBZnRlcihwQnJlYWtOb2RlLCBiQmVmb3JlLCBwTGVhZGVyVGVtcGxhdGUsIHBUcmFpbGVyVGVtcGxhdGUpOw0KKyAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEJyZWFrTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IE5VTEw7DQorICAgICAgICBwRm9ybU5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgICAgaWYocExlYWRlclRlbXBsYXRlKSB7DQorICAgICAgICAgICAgaWYoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgICAgICAgICAgcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQnJlYWtMZWFkZXJOb2RlID0gcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwTGVhZGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwQnJlYWtMZWFkZXJOb2RlKTsNCisgICAgICAgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocEJyZWFrTGVhZGVyTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBpZihwVHJhaWxlclRlbXBsYXRlKSB7DQorICAgICAgICAgICAgaWYoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgICAgICAgICAgcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQnJlYWtUcmFpbGVyTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRyYWlsZXJUZW1wbGF0ZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBUUlVFKTsNCisgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBCcmVha1RyYWlsZXJOb2RlKTsNCisgICAgICAgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocEJyZWFrVHJhaWxlck5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc0Jvb2tlbmRMZWFkZXJPclRyYWlsZXIoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsIEZYX0JPT0wgYkxlYWRlciwgQ1hGQV9Ob2RlKiAmcEJvb2tlbmRBcHBlbmROb2RlKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyVGVtcGxhdGUgPSBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgIGlmKFJlc29sdmVCb29rZW5kTGVhZGVyT3JUcmFpbGVyKHBCb29rZW5kTm9kZSwgYkxlYWRlciwgcExlYWRlclRlbXBsYXRlKSkgew0KKyAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50ID0gcEJvb2tlbmROb2RlLT5HZXREb2N1bWVudCgpOw0KKyAgICAgICAgQ1hGQV9Ob2RlICAgICAqcERhdGFTY29wZSA9IE5VTEw7DQorICAgICAgICBpZihwTGVhZGVyVGVtcGxhdGUpIHsNCisgICAgICAgICAgICBpZighcERhdGFTY29wZSkgew0KKyAgICAgICAgICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBCb29rZW5kQXBwZW5kTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocExlYWRlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KKyAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEJvb2tlbmRBcHBlbmROb2RlKTsNCisgICAgICAgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocEJvb2tlbmRBcHBlbmROb2RlKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9MYXlvdXRQYWdlTWdyOjpCcmVha092ZXJmbG93KENYRkFfTm9kZSogcE92ZXJmbG93Tm9kZSwgQ1hGQV9Ob2RlKiYgcExlYWRlclRlbXBsYXRlLCBDWEZBX05vZGUqJiBwVHJhaWxlclRlbXBsYXRlLCBGWF9CT09MIGJDcmVhdGVQYWdlICkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93TGVhZGVyLCB3c092ZXJmbG93VHJhaWxlcjsNCisgICAgQ1hGQV9Ob2RlICpwQ29udGFpbmVyID0gcE92ZXJmbG93Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSktPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICBpZihwT3ZlcmZsb3dOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQnJlYWspIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93TGVhZGVyOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUYXJnZXQ7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RyYWlsZXI7DQorICAgICAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUcmFpbGVyLCB3c092ZXJmbG93VHJhaWxlcik7DQorICAgICAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LCB3c092ZXJmbG93VGFyZ2V0KTsNCisgICAgICAgIGlmICghd3NPdmVyZmxvd0xlYWRlci5Jc0VtcHR5KCkgfHwgIXdzT3ZlcmZsb3dUcmFpbGVyLklzRW1wdHkoKSB8fCAhd3NPdmVyZmxvd1RhcmdldC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBpZighd3NPdmVyZmxvd1RhcmdldC5Jc0VtcHR5KCkgJiYgYkNyZWF0ZVBhZ2UgJiYgIW1fYkNyZWF0ZU92ZXJGbG93UGFnZSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHRoaXMtPm1fcFRlbXBsYXRlUGFnZVNldFJvb3QsIFRSVUUsIHdzT3ZlcmZsb3dUYXJnZXQpOw0KKyAgICAgICAgICAgICAgICBpZihwVGFyZ2V0KSB7DQorICAgICAgICAgICAgICAgICAgICBtX2JDcmVhdGVPdmVyRmxvd1BhZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBUYXJnZXQtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSwgcFRhcmdldCwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSwgcFRhcmdldCwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKCFiQ3JlYXRlUGFnZSkgew0KKyAgICAgICAgICAgICAgICBwTGVhZGVyVGVtcGxhdGUgID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICAgICAgICAgICAgcFRyYWlsZXJUZW1wbGF0ZSA9IFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcE92ZXJmbG93Tm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9IGVsc2UgaWYocE92ZXJmbG93Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX092ZXJmbG93KSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RhcmdldDsNCisgICAgICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTGVhZGVyLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KKyAgICAgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzT3ZlcmZsb3dUYXJnZXQpOw0KKyAgICAgICAgaWYoIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpICYmIGJDcmVhdGVQYWdlICYmICFtX2JDcmVhdGVPdmVyRmxvd1BhZ2UpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHRoaXMtPm1fcFRlbXBsYXRlUGFnZVNldFJvb3QsIFRSVUUsIHdzT3ZlcmZsb3dUYXJnZXQpOw0KKyAgICAgICAgICAgIGlmKHBUYXJnZXQpIHsNCisgICAgICAgICAgICAgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgc3dpdGNoKHBUYXJnZXQtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYToNCisgICAgICAgICAgICAgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEsIHBUYXJnZXQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYToNCisgICAgICAgICAgICAgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEsIHBUYXJnZXQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKCFiQ3JlYXRlUGFnZSkgew0KKyAgICAgICAgICAgIHBMZWFkZXJUZW1wbGF0ZSAgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzT3ZlcmZsb3dMZWFkZXIpOw0KKyAgICAgICAgICAgIHBUcmFpbGVyVGVtcGxhdGUgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwT3ZlcmZsb3dOb2RlOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc092ZXJmbG93KENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX05vZGUqICZwTGVhZGVyTm9kZSwgQ1hGQV9Ob2RlKiAmcFRyYWlsZXJOb2RlLCAgRlhfQk9PTCBiRGF0YU1lcmdlLCBGWF9CT09MIGJDcmVhdGVQYWdlKQ0KK3sNCisgICAgaWYocEZvcm1Ob2RlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUgKnBMZWFkZXJUZW1wbGF0ZSA9IE5VTEwsICpwVHJhaWxlclRlbXBsYXRlID0gTlVMTDsNCisgICAgRlhfQk9PTCBiSXNPdmVyZmxvd05vZGUgPSBGQUxTRTsNCisgICAgaWYocEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfT3ZlcmZsb3cgfHwgcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQnJlYWspCXsNCisgICAgICAgIGJJc092ZXJmbG93Tm9kZSA9IFRSVUU7DQorICAgIH0NCisgICAgZm9yKENYRkFfTm9kZSogcEN1ck5vZGUgPSBiSXNPdmVyZmxvd05vZGUgPyBwRm9ybU5vZGUgOiBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcEN1ck5vZGU7IHBDdXJOb2RlID0gcEN1ck5vZGUtPkdldE5vZGVJdGVtKChYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSkgew0KKyAgICAgICAgaWYoQnJlYWtPdmVyZmxvdyhwQ3VyTm9kZSwgcExlYWRlclRlbXBsYXRlLCBwVHJhaWxlclRlbXBsYXRlLCBiQ3JlYXRlUGFnZSkpIHsNCisgICAgICAgICAgICBpZihiSXNPdmVyZmxvd05vZGUpIHsNCisgICAgICAgICAgICAgICAgcEZvcm1Ob2RlID0gcEN1ck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0RvY3VtZW50ICpwRG9jdW1lbnQgPSBwQ3VyTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgICAgICAgICBDWEZBX05vZGUgICAgICpwRGF0YVNjb3BlID0gTlVMTDsNCisgICAgICAgICAgICBpZihwTGVhZGVyVGVtcGxhdGUpIHsNCisgICAgICAgICAgICAgICAgaWYoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwTGVhZGVyTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocExlYWRlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBMZWFkZXJOb2RlKTsNCisgICAgICAgICAgICAgICAgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKHBMZWFkZXJOb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocFRyYWlsZXJUZW1wbGF0ZSkgew0KKyAgICAgICAgICAgICAgICBpZighcERhdGFTY29wZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybU5vZGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBUcmFpbGVyTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRyYWlsZXJUZW1wbGF0ZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwVHJhaWxlck5vZGUpOw0KKyAgICAgICAgICAgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocFRyYWlsZXJOb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBpZihiSXNPdmVyZmxvd05vZGUpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSZXNvbHZlQm9va2VuZExlYWRlck9yVHJhaWxlcihDWEZBX05vZGUqIHBCb29rZW5kTm9kZSwgRlhfQk9PTCBiTGVhZGVyLCBDWEZBX05vZGUqICZwQm9va2VuZEFwcGVuZFRlbXBsYXRlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQm9va2VuZExlYWRlcjsNCisgICAgQ1hGQV9Ob2RlICpwQ29udGFpbmVyID0gcEJvb2tlbmROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICAgIGlmKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKSB7DQorICAgICAgICBwQm9va2VuZE5vZGUtPlRyeUNEYXRhKGJMZWFkZXIgPyBYRkFfQVRUUklCVVRFX0Jvb2tlbmRMZWFkZXIgOiBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLCB3c0Jvb2tlbmRMZWFkZXIpOw0KKyAgICAgICAgaWYgKCF3c0Jvb2tlbmRMZWFkZXIuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSAgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIEZBTFNFLCB3c0Jvb2tlbmRMZWFkZXIpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2UgaWYocEJvb2tlbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQm9va2VuZCkgew0KKyAgICAgICAgcEJvb2tlbmROb2RlLT5UcnlDRGF0YShiTGVhZGVyID8gWEZBX0FUVFJJQlVURV9MZWFkZXIgOiBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIHdzQm9va2VuZExlYWRlcik7DQorICAgICAgICBwQm9va2VuZEFwcGVuZFRlbXBsYXRlICA9IFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NCb29rZW5kTGVhZGVyKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KENYRkFfTm9kZSogcFBhZ2VTZXQsIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLCBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwgRlhfQk9PTCBiTmV3UGFnZSwgRlhfQk9PTCBiUXVlcnkpDQorew0KKyAgICBpZihwUGFnZVNldCA9PSBOVUxMICYmIHBTdGFydENoaWxkID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpUGFnZVNldENvdW50ID0gMDsNCisgICAgaWYoSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkpIHsNCisgICAgICAgIHJldHVybiBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKHBQYWdlU2V0LCBwU3RhcnRDaGlsZCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpOw0KKyAgICB9DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbiA9IG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPyBYRkFfQVRUUklCVVRFRU5VTV9SZXN0IDogWEZBX0FUVFJJQlVURUVOVU1fRmlyc3Q7DQorICAgIHJldHVybiBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KHBQYWdlU2V0LCBwU3RhcnRDaGlsZCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnksIGVQcmVmZXJyZWRQb3NpdGlvbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKENYRkFfTm9kZSogcFBhZ2VTZXQsIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLCBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwgRlhfQk9PTCBiTmV3UGFnZSwgRlhfQk9PTCBiUXVlcnkpDQorew0KKyAgICBGWF9JTlQzMiBpUGFnZVNldENvdW50ID0gMDsNCisgICAgaWYoIXBTdGFydENoaWxkICYmICFiUXVlcnkpIHsNCisgICAgICAgIG1fcFBhZ2VTZXRNYXAuTG9va3VwKHBQYWdlU2V0LCBpUGFnZVNldENvdW50KTsNCisgICAgICAgIEZYX0lOVDMyIGlNYXggPSAtMTsNCisgICAgICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlU2V0LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgICAgICBpZihwT2NjdXJOb2RlKSB7DQorICAgICAgICAgICAgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlNYXggPj0gMCAmJiBpTWF4IDw9IGlQYWdlU2V0Q291bnQpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmVzID0gRkFMU0U7DQorICAgIENYRkFfTm9kZSAqcEN1cnJlbnROb2RlID0gcFN0YXJ0Q2hpbGQgPyBwU3RhcnRDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSA6IHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvcig7IHBDdXJyZW50Tm9kZTsgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZihwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgICAgIGlmKChwVGFyZ2V0UGFnZUFyZWEgPT0gcEN1cnJlbnROb2RlIHx8IHBUYXJnZXRQYWdlQXJlYSA9PSBOVUxMKSkgew0KKyAgICAgICAgICAgICAgICBpZiAocEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYocFRhcmdldFBhZ2VBcmVhID09IHBDdXJyZW50Tm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnROb2RlLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0UGFnZUFyZWEgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFiUXVlcnkpIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKHBDdXJyZW50Tm9kZSwgcFN0YXJ0Q2hpbGQgPT0gTlVMTCk7DQorICAgICAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBUYXJnZXRDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0gcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFRhcmdldENvbnRlbnRBcmVhKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3BDdXJQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgICAgICAgbV9uQ3VyUGFnZUNvdW50ID0gMTsNCisgICAgICAgICAgICAgICAgYlJlcyA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZighYlF1ZXJ5KSB7DQorICAgICAgICAgICAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnROb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgICAgICBpZihGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKHBDdXJyZW50Tm9kZSwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpKSB7DQorICAgICAgICAgICAgICAgIGJSZXMgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoIWJRdWVyeSkgew0KKyAgICAgICAgICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50Tm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKCFwU3RhcnRDaGlsZCAmJiBiUmVzICYmICFiUXVlcnkpIHsNCisgICAgICAgIG1fcFBhZ2VTZXRNYXAuU2V0QXQocFBhZ2VTZXQsICsrIGlQYWdlU2V0Q291bnQpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmVzOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleChDWEZBX05vZGUqIHBQYWdlU2V0LCBDWEZBX05vZGUqIHBTdGFydENoaWxkLCBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsIEZYX0JPT0wgYk5ld1BhZ2UsIEZYX0JPT0wgYlF1ZXJ5LCBYRkFfQVRUUklCVVRFRU5VTSBlUHJlZmVycmVkUG9zaXRpb24pDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQWR2aXNlZFBhZ2VQb3NpdGlvbiA9IHBUYXJnZXRQYWdlQXJlYSA/IHBUYXJnZXRQYWdlQXJlYS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbikgOiAoWEZBX0FUVFJJQlVURUVOVU0pIC0gMTsNCisgICAgY29uc3QgWEZBX0FUVFJJQlVURUVOVU0gZUZhbGxiYWNrUG9zaXRpb24gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7DQorICAgIENYRkFfTm9kZSAqcFByZWZlcnJlZFBhZ2VBcmVhID0gTlVMTCwgKnBGYWxsYmFja1BhZ2VBcmVhID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiBwQ3VycmVudE5vZGUgPSBOVUxMOw0KKyAgICBpZiAoIXBTdGFydENoaWxkIHx8IHBTdGFydENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgIHBDdXJyZW50Tm9kZSA9IHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwQ3VycmVudE5vZGUgPSBwU3RhcnRDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBmb3IoOyBwQ3VycmVudE5vZGU7IHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgICAgICBpZighTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwQ3VycmVudE5vZGUsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUN1clBhZ2VQb3NpdGlvbiA9IHBDdXJyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbik7DQorICAgICAgICAgICAgaWYoZVByZWZlcnJlZFBvc2l0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpIHsNCisgICAgICAgICAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobV9lUGFnZVNldE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZCB8fCBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4pID09IFhGQV9BVFRSSUJVVEVFTlVNX0FueSkgew0KKyAgICAgICAgICAgICAgICAgICAgcFByZWZlcnJlZFBhZ2VBcmVhID0gcEN1cnJlbnROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZSk7DQorICAgICAgICAgICAgICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSk7DQorICAgICAgICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZihlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fT25seSkgew0KKyAgICAgICAgICAgICAgICBpZiAoZUN1clBhZ2VQb3NpdGlvbiAhPSBlUHJlZmVycmVkUG9zaXRpb24pIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChtX2VQYWdlU2V0TW9kZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWQgfHwgcEN1cnJlbnROb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9BbnkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUgfHwgcFRhcmdldFBhZ2VBcmVhID09IE5VTEwpKSB7DQorICAgICAgICAgICAgICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBpZihwVGFyZ2V0UGFnZUFyZWEgPT0gcEN1cnJlbnROb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0UGFnZUFyZWEgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SZXN0ICYmIGVDdXJQYWdlUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB8fCBlQ3VyUGFnZVBvc2l0aW9uID09IGVQcmVmZXJyZWRQb3NpdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgcFByZWZlcnJlZFBhZ2VBcmVhID0gcEN1cnJlbnROb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZihlQ3VyUGFnZVBvc2l0aW9uID09IGVGYWxsYmFja1Bvc2l0aW9uICYmICFwRmFsbGJhY2tQYWdlQXJlYSkgew0KKyAgICAgICAgICAgICAgICAgICAgcEZhbGxiYWNrUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBUYXJnZXRQYWdlQXJlYSAmJiAhTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwVGFyZ2V0UGFnZUFyZWEsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsNCisgICAgICAgICAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgICAgICAgIGlmKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X1NpbXBsZXhEdXBsZXgocEN1cnJlbnROb2RlLCBOVUxMLCBwVGFyZ2V0UGFnZUFyZWEsIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSwgZVByZWZlcnJlZFBvc2l0aW9uKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ3VyUGFnZUFyZWEgPSBOVUxMOw0KKyAgICBpZihwUHJlZmVycmVkUGFnZUFyZWEpIHsNCisgICAgICAgIHBDdXJQYWdlQXJlYSA9IHBQcmVmZXJyZWRQYWdlQXJlYTsNCisgICAgfSBlbHNlIGlmKHBGYWxsYmFja1BhZ2VBcmVhKSB7DQorICAgICAgICBwQ3VyUGFnZUFyZWEgPSBwRmFsbGJhY2tQYWdlQXJlYTsNCisgICAgfQ0KKyAgICBpZiAoIXBDdXJQYWdlQXJlYSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghYlF1ZXJ5KSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJQYWdlQXJlYSk7DQorICAgICAgICBpZihwVGFyZ2V0Q29udGVudEFyZWEgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSA9IHBDdXJQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBUYXJnZXRDb250ZW50QXJlYSk7DQorICAgIH0NCisgICAgbV9wQ3VyUGFnZUFyZWEgPSBwQ3VyUGFnZUFyZWE7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6TWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihDWEZBX05vZGUqIHBQYWdlQXJlYSwgRlhfQk9PTCBiTGFzdE1hdGNoKQ0KK3sNCisgICAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZU9kZE9yRXZlbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0FueTsNCisgICAgcFBhZ2VBcmVhLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBlT2RkT3JFdmVuKTsNCisgICAgaWYgKGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQorICAgICAgICBGWF9JTlQzMiBpUGFnZUNvdW50ID0gR2V0UGFnZUNvdW50KCk7DQorICAgICAgICBpZiAoYkxhc3RNYXRjaCkgew0KKyAgICAgICAgICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDEgOiBpUGFnZUNvdW50ICUgMiA9PSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGVPZGRPckV2ZW4gPT0gWEZBX0FUVFJJQlVURUVOVU1fT2RkID8gaVBhZ2VDb3VudCAlIDIgPT0gMCA6IGlQYWdlQ291bnQgJSAyID09IDE7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXROZXh0QXZhaWxQYWdlQXJlYShDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsIEZYX0JPT0wgYk5ld1BhZ2UsIEZYX0JPT0wgYlF1ZXJ5KQ0KK3sNCisgICAgaWYobV9wQ3VyUGFnZUFyZWEgPT0gTlVMTCkgew0KKyAgICAgICAgRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpOw0KKyAgICAgICAgQVNTRVJUKG1fcEN1clBhZ2VBcmVhKTsNCisgICAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgICAgfQ0KKyAgICBpZihwVGFyZ2V0UGFnZUFyZWEgPT0gTlVMTCB8fCBwVGFyZ2V0UGFnZUFyZWEgPT0gbV9wQ3VyUGFnZUFyZWEpIHsNCisgICAgICAgIGlmKCFiTmV3UGFnZSAmJiBHZXROZXh0Q29udGVudEFyZWEocFRhcmdldENvbnRlbnRBcmVhKSkgew0KKyAgICAgICAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaU1heCA9IC0xOw0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IG1fcEN1clBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgICAgICAgICAgaWYocE9jY3VyTm9kZSkgew0KKyAgICAgICAgICAgICAgICBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKChpTWF4IDwgMCB8fCBtX25DdXJQYWdlQ291bnQgPCBpTWF4KSkgew0KKyAgICAgICAgICAgICAgICBpZiAoIWJRdWVyeSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQobV9wQ3VyUGFnZUFyZWEpOw0KKyAgICAgICAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIG1fcEN1clBhZ2VBcmVhKTsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBUYXJnZXRDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0gbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwVGFyZ2V0Q29udGVudEFyZWEpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fbkN1clBhZ2VDb3VudCArKzsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZighYlF1ZXJ5ICYmIElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQorICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKG1fcEN1clBhZ2VBcmVhLCBGQUxTRSwgVFJVRSk7DQorICAgIH0NCisgICAgaWYoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQobV9wQ3VyUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLCBtX3BDdXJQYWdlQXJlYSwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpKSB7DQorICAgICAgICByZXR1cm4gbV9wQ3VyUGFnZUFyZWE7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgd2hpbGUoVFJVRSkgew0KKyAgICAgICAgaWYgKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KHBQYWdlU2V0LCBOVUxMLCBwVGFyZ2V0UGFnZUFyZWEsIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSkpIHsNCisgICAgICAgICAgICByZXR1cm4gbV9wQ3VyUGFnZUFyZWE7DQorICAgICAgICB9DQorICAgICAgICBpZighYlF1ZXJ5ICYmIElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQorICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVNldFJlY29yZChwUGFnZVNldCk7DQorICAgICAgICB9DQorICAgICAgICBpZihGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChOVUxMLCBwUGFnZVNldCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFBhZ2VTZXQgPSBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9MYXlvdXRQYWdlTWdyX0NoZWNrQ29udGVudEFyZWFOb3RVc2VkKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlQXJlYUxheW91dEl0ZW0sIENYRkFfTm9kZSogcENvbnRlbnRBcmVhLCBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiYgcENvbnRlbnRBcmVhTGF5b3V0SXRlbSkNCit7DQorICAgIGZvcihDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICBpZihwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUgPT0gcENvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgaWYocExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29udGVudEFyZWFMYXlvdXRJdGVtID0gcExheW91dEl0ZW07DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXROZXh0Q29udGVudEFyZWEoQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEpDQorew0KKyAgICBDWEZBX05vZGUqIHBDdXJDb250ZW50Tm9kZSA9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1ckNvbnRlbnRBcmVhLT5tX3BGb3JtTm9kZTsNCisgICAgaWYocENvbnRlbnRBcmVhID09IE5VTEwpIHsNCisgICAgICAgIHBDb250ZW50QXJlYSA9IHBDdXJDb250ZW50Tm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KKyAgICAgICAgaWYocENvbnRlbnRBcmVhID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZihwQ29udGVudEFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpICE9IG1fcEN1clBhZ2VBcmVhKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENvbnRlbnRBcmVhTGF5b3V0ID0gTlVMTDsNCisgICAgICAgIGlmKCFYRkFfTGF5b3V0UGFnZU1ncl9DaGVja0NvbnRlbnRBcmVhTm90VXNlZChHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYSwgcENvbnRlbnRBcmVhLCBwQ29udGVudEFyZWFMYXlvdXQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYocENvbnRlbnRBcmVhTGF5b3V0KSB7DQorICAgICAgICAgICAgaWYocENvbnRlbnRBcmVhTGF5b3V0LT5tX3BGb3JtTm9kZSAhPSBwQ3VyQ29udGVudE5vZGUpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgICAgICAgICAgcE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhID0gcENvbnRlbnRBcmVhTGF5b3V0Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ29udGVudEFyZWEpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkluaXRQYWdlU2V0TWFwKCkNCit7DQorICAgIGlmKCFJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgICAgZm9yIChDWEZBX05vZGUqIHBQYWdlU2V0Tm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBQYWdlU2V0Tm9kZTsgcFBhZ2VTZXROb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgaWYocFBhZ2VTZXROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9IHBQYWdlU2V0Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsNCisgICAgICAgICAgICBpZihlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2UpIHsNCisgICAgICAgICAgICAgICAgbV9wUGFnZVNldE1hcC5TZXRBdChwUGFnZVNldE5vZGUsIDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDWEZBX0xheW91dFBhZ2VNZ3I6OkNyZWF0ZU1pblBhZ2VSZWNvcmQoQ1hGQV9Ob2RlKiBwUGFnZUFyZWEsIEZYX0JPT0wgYlRhcmdldFBhZ2VBcmVhLCBGWF9CT09MIGJDcmVhdGVMYXN0KQ0KK3sNCisgICAgaWYocFBhZ2VBcmVhID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgICBGWF9JTlQzMiBpTWluID0gMDsNCisgICAgaWYoKHBPY2N1ck5vZGUgJiYgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgRkFMU0UpKSB8fCBiVGFyZ2V0UGFnZUFyZWEpIHsNCisgICAgICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0gcFBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgICAgICBpZiAoaU1pbiA8IDEgJiYgYlRhcmdldFBhZ2VBcmVhICYmICFwQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgICBpTWluID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgaWYoYkNyZWF0ZUxhc3QpIHsNCisgICAgICAgICAgICBpID0gbV9uQ3VyUGFnZUNvdW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKDsgaSA8IGlNaW47IGkrKykgew0KKyAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBQYWdlQXJlYSk7DQorICAgICAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDb250ZW50QXJlYSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGlNaW47DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKENYRkFfTm9kZSogcFBhZ2VTZXQsIEZYX0JPT0wgYkNyZWF0ZUFsbCkNCit7DQorICAgIGlmKHBQYWdlU2V0ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ3VyU2V0Q291bnQgPSAwOw0KKyAgICBpZighbV9wUGFnZVNldE1hcC5Mb29rdXAocFBhZ2VTZXQsIGlDdXJTZXRDb3VudCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZihiQ3JlYXRlQWxsKSB7DQorICAgICAgICBpQ3VyU2V0Q291bnQgPSAwOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlU2V0LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgIEZYX0lOVDMyIGlNaW4gPSAwOw0KKyAgICBpZihwT2NjdXJOb2RlICYmIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKSkgew0KKyAgICAgICAgaWYoaUN1clNldENvdW50IDwgaU1pbikgew0KKyAgICAgICAgICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IGlNaW4gLSBpQ3VyU2V0Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwQ3VycmVudFBhZ2VOb2RlID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcEN1cnJlbnRQYWdlTm9kZTsgcEN1cnJlbnRQYWdlTm9kZSA9IHBDdXJyZW50UGFnZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBDdXJyZW50UGFnZU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnRQYWdlTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBDdXJyZW50UGFnZU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVNldFJlY29yZChwQ3VycmVudFBhZ2VOb2RlLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BQYWdlU2V0TWFwLlNldEF0KHBQYWdlU2V0LCBpTWluKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6Q3JlYXRlTmV4dE1pblJlY29yZChDWEZBX05vZGUqIHBSZWNvcmROb2RlKQ0KK3sNCisgICAgaWYocFJlY29yZE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGZvcihDWEZBX05vZGUgKnBDdXJyZW50Tm9kZSA9IHBSZWNvcmROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOyBwQ3VycmVudE5vZGU7IHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50Tm9kZSwgRkFMU0UpOw0KKyAgICAgICAgfSBlbHNlIGlmKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50Tm9kZSwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByb2Nlc3NMYXN0UGFnZVNldCgpDQorew0KKyAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKG1fcEN1clBhZ2VBcmVhLCBGQUxTRSwgVFJVRSk7DQorICAgIENyZWF0ZU5leHRNaW5SZWNvcmQobV9wQ3VyUGFnZUFyZWEpOw0KKyAgICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gbV9wQ3VyUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICB3aGlsZShUUlVFKSB7DQorICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBQYWdlU2V0KTsNCisgICAgICAgIGlmKHBQYWdlU2V0ID09IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIENyZWF0ZU5leHRNaW5SZWNvcmQocFBhZ2VTZXQpOw0KKyAgICAgICAgcFBhZ2VTZXQgPSBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwQ3VyQ29udGVudE5vZGUgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGU7DQorICAgIGlmKHBDdXJDb250ZW50Tm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcEN1ckNvbnRlbnROb2RlID0gcEN1ckNvbnRlbnROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgIGlmKHBDdXJDb250ZW50Tm9kZSkgew0KKyAgICAgICAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0gcEN1ckNvbnRlbnROb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIHJldHVybiBmTmV4dENvbnRlbnRIZWlnaHQgPiBmQ2hpbGRIZWlnaHQgPyBUUlVFIDogRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUGFnZU5vZGUgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGU7DQorICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgICBGWF9JTlQzMiBpTWF4ID0gMDsNCisgICAgaWYocE9jY3VyTm9kZSAmJiBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSkpIHsNCisgICAgICAgIGlmKG1fbkN1clBhZ2VDb3VudCA9PSBpTWF4KSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU3JjUGFnZSA9IG1fcEN1clBhZ2VBcmVhOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIG5TcmNQYWdlQ291bnQgPSBtX25DdXJQYWdlQ291bnQ7DQorICAgICAgICAgICAgRlhfUE9TSVRJT04gcHNTcmNSZWNvcmQgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0VGFpbFBvc2l0aW9uKCk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dFBhZ2UgPSBHZXROZXh0QXZhaWxQYWdlQXJlYShOVUxMLCBOVUxMLCBGQUxTRSwgVFJVRSk7DQorICAgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEgPSBwU3JjUGFnZTsNCisgICAgICAgICAgICBtX25DdXJQYWdlQ291bnQgPSBuU3JjUGFnZUNvdW50Ow0KKyAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUHJldlJlY29yZCA9IChDWEZBX0NvbnRhaW5lclJlY29yZCopbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldE5leHQocHNTcmNSZWNvcmQpOw0KKyAgICAgICAgICAgIHdoaWxlIChwc1NyY1JlY29yZCkgew0KKyAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwc1NhdmVSZWNvcmQgPSBwc1NyY1JlY29yZDsNCisgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBJbnNlcnRSZWNvcmQgPSAoQ1hGQV9Db250YWluZXJSZWNvcmQqKW1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXROZXh0KHBzU3JjUmVjb3JkKTsNCisgICAgICAgICAgICAgICAgUmVtb3ZlTGF5b3V0UmVjb3JkKHBJbnNlcnRSZWNvcmQsIHBQcmV2UmVjb3JkKTsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBJbnNlcnRSZWNvcmQ7DQorICAgICAgICAgICAgICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5SZW1vdmVBdChwc1NhdmVSZWNvcmQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihwTmV4dFBhZ2UpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEgPSBwTmV4dFBhZ2UtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgICAgICAgICAgICAgaWYocENvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTmV4dENvbnRlbnRIZWlnaHQgPSBwQ29udGVudEFyZWEtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYoZk5leHRDb250ZW50SGVpZ2h0ID4gZkNoaWxkSGVpZ2h0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0gcFBhZ2VOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgIEZYX0ZMT0FUIGZOZXh0Q29udGVudEhlaWdodCA9IHBDb250ZW50QXJlYS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGlmIChmTmV4dENvbnRlbnRIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYoZk5leHRDb250ZW50SGVpZ2h0ID4gZkNoaWxkSGVpZ2h0KSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDbGVhckRhdGEoKQ0KK3sNCisgICAgQ2xlYXJSZWNvcmRMaXN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDbGVhclJlY29yZExpc3QoKQ0KK3sNCisgICAgaWYgKCFtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYobV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldENvdW50KCkgPiAwKSB7DQorICAgICAgICBGWF9QT1NJVElPTiBzUG9zOw0KKyAgICAgICAgc1BvcyA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKTsNCisgICAgICAgIHdoaWxlKHNQb3MpIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFJlY29yZCA9IChDWEZBX0NvbnRhaW5lclJlY29yZCopbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldE5leHQoc1Bvcyk7DQorICAgICAgICAgICAgZGVsZXRlIHBSZWNvcmQ7DQorICAgICAgICB9DQorICAgICAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9IE5VTEw7DQorICAgIG1fcEN1clBhZ2VBcmVhID0gTlVMTDsNCisgICAgbV9uQ3VyUGFnZUNvdW50ID0gMDsNCisgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gRkFMU0U7DQorICAgIG1fcFBhZ2VTZXRNYXAuUmVtb3ZlQWxsKCk7DQorfQ0KK0NYRkFfTGF5b3V0SXRlbUltcGwqIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluZE9yQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkNCit7DQorI2lmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXykNCisgICAgaWYgKG1fTm9kZVRvQ29udGVudC5HZXRDb3VudCgpID4gMCkgew0KKyAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICAgIGlmIChtX05vZGVUb0NvbnRlbnQuTG9va3VwKHBGb3JtTm9kZSwgKHZvaWQqJilwTGF5b3V0SXRlbSkpIHsNCisgICAgICAgICAgICBpZiAocExheW91dEl0ZW0tPm1fcE5leHQpIHsNCisgICAgICAgICAgICAgICAgbV9Ob2RlVG9Db250ZW50LlNldEF0KHBGb3JtTm9kZSwgcExheW91dEl0ZW0tPm1fcE5leHQpOw0KKyAgICAgICAgICAgICAgICBwTGF5b3V0SXRlbS0+bV9wTmV4dC0+bV9wUHJldiA9IE5VTEw7DQorICAgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BOZXh0ID0gTlVMTDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX05vZGVUb0NvbnRlbnQuUmVtb3ZlS2V5KHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9IHBGb3JtTm9kZTsNCisgICAgICAgICAgICByZXR1cm4gcExheW91dEl0ZW07DQorICAgICAgICB9DQorICAgIH0NCisjZW5kaWYNCisgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW1JbXBsKilwRm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+T25DcmVhdGVMYXlvdXRJdGVtKHBGb3JtTm9kZSk7DQorfQ0KKyNpZiBkZWZpbmVkKF9YRkFfTEFZT1VUSVRFTV9NQVBDQUNIRV8pDQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlNhdmVMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtKQ0KK3sNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHRMYXlvdXRJdGVtLCAqcEN1ckxheW91dEl0ZW0gPSBwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgICAgICBwTmV4dExheW91dEl0ZW0gPSBwQ3VyTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCisgICAgICAgICAgICBTYXZlTGF5b3V0SXRlbShwQ3VyTGF5b3V0SXRlbSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEN1ckxheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgIGlmIChtX05vZGVUb0NvbnRlbnQuR2V0VmFsdWVBdChwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgTlVMTCk7DQorICAgICAgICAgICAgICAgIG1fTm9kZVRvQ29udGVudC5TZXRBdChwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIHBDdXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgIHBDdXJMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ3VyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICAgICAgICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQorICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgIH0NCit9DQorI2VsaWYgZGVmaW5lZChfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXykNCitzdGF0aWMgdm9pZCBYRkFfU3luY1JlbW92ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0sIElYRkFfTm90aWZ5KiBwTm90aWZ5LCBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCkNCit7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwgKnBOZXh0TGF5b3V0SXRlbSwgKnBDdXJMYXlvdXRJdGVtID0gcFBhcmVudExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgIHdoaWxlIChwQ3VyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICAgICAgWEZBX1N5bmNSZW1vdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtLCBwTm90aWZ5LCBwRG9jTGF5b3V0KTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcEN1ckxheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KKyAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgIH0NCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlNhdmVMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtKQ0KK3sNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHRMYXlvdXRJdGVtLCAqcEN1ckxheW91dEl0ZW0gPSBwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgICAgICBwTmV4dExheW91dEl0ZW0gPSBwQ3VyTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICBpZiAocEN1ckxheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RmxhZygpOw0KKyAgICAgICAgICAgIGlmIChkd0ZsYWcgJiAoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KKyAgICAgICAgICAgICAgICBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9TeW5jUmVtb3ZlTGF5b3V0SXRlbShwQ3VyTGF5b3V0SXRlbSwgcE5vdGlmeSwgcERvY0xheW91dCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTGF5b3V0SXRlbSwgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCisgICAgICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdGbGFnICYgWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICAgICAgU2F2ZUxheW91dEl0ZW0ocEN1ckxheW91dEl0ZW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQorICAgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KKyAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICAgICAgaWYgKCFwQ3VyTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpICYmIHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgIH0NCit9DQorI2VuZGlmDQorQ1hGQV9Ob2RlKiBDWEZBX0xheW91dFBhZ2VNZ3I6OlF1ZXJ5T3ZlcmZsb3coQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIENYRkFfTGF5b3V0Q29udGV4dCogcExheW91dENvbnRleHQpDQorew0KKyAgICBmb3IoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ3VyTm9kZTsgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+R2V0Tm9kZUl0ZW0oKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpKSB7DQorICAgICAgICBpZihwQ3VyTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dMZWFkZXI7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUYXJnZXQ7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUcmFpbGVyOw0KKyAgICAgICAgICAgIHBDdXJOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICAgICAgICBwQ3VyTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCisgICAgICAgICAgICBwQ3VyTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgd3NPdmVyZmxvd1RhcmdldCk7DQorICAgICAgICAgICAgaWYgKCF3c092ZXJmbG93TGVhZGVyLklzRW1wdHkoKSB8fCAhd3NPdmVyZmxvd1RyYWlsZXIuSXNFbXB0eSgpIHx8ICF3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcEN1ck5vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfSBlbHNlIGlmKHBDdXJOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfT3ZlcmZsb3cpIHsNCisgICAgICAgICAgICByZXR1cm4gcEN1ck5vZGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpNZXJnZVBhZ2VTZXRDb250ZW50cygpDQorew0KKyAgICBDWEZBX0RvY3VtZW50ICpwRG9jdW1lbnQgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXREb2N1bWVudCgpOw0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IHBEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBSb290TGF5b3V0ID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCisgICAgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGlJbmRleCA9IDA7IGlJbmRleCA8IHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQuR2V0U2l6ZSgpOyBpSW5kZXggKyspIHsNCisgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcihwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldEF0KGlJbmRleCkpOw0KKyAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgICAgICBpZihwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJpbmROb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmROb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEJpbmROb2RlLT5SZW1vdmVCaW5kSXRlbShwTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIENYRkFfTm9kZSogcFBlbmRpbmdQYWdlU2V0ID0gTlVMTDsNCisgICAgZm9yKDsgcFJvb3RMYXlvdXQ7IHBSb290TGF5b3V0ID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIClwUm9vdExheW91dC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgIHBQZW5kaW5nUGFnZVNldCA9IE5VTEw7DQorICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50QXJlYUNvbnRhaW5lckxheW91dEl0ZW0+IGl0ZXJhdG9yKHBSb290TGF5b3V0KTsNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICBBU1NFUlQocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCisgICAgICAgIGlmKGlJbmRleCA8IHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgcFBlbmRpbmdQYWdlU2V0ID0gcERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRBdChpSW5kZXgpOw0KKyAgICAgICAgICAgIGlJbmRleCArKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmKCFwUGVuZGluZ1BhZ2VTZXQpIHsNCisgICAgICAgICAgICBpZihwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSB7DQorICAgICAgICAgICAgICAgIHBQZW5kaW5nUGFnZVNldCA9IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKEZBTFNFKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSA9PSBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtKSB7DQorICAgICAgICAgICAgcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgICAgIHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcFBlbmRpbmdQYWdlU2V0Ow0KKyAgICAgICAgcFBlbmRpbmdQYWdlU2V0LT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICBmb3IoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCk7IHBDb250YWluZXJJdGVtOyBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGU7DQorICAgICAgICAgICAgaWYocE5vZGUtPkdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3dpdGNoKHBOb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlU2V0OiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9ICBwQ29udGFpbmVySXRlbS0+bV9wUGFyZW50LT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBQYXJlbnROb2RlLCBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUsIFRSVUUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6IHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwRm9ybUxheW91dCA9IHBDb250YWluZXJJdGVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wUGFyZW50LT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0V4aXN0Rm9ybSA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGlMZXZlbCA9IDA7IGlMZXZlbCA8IDM7IGlMZXZlbCArKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUxheW91dCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwRm9ybUxheW91dC0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaUxldmVsID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKHBGb3JtTGF5b3V0ICYmICFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBGb3JtTGF5b3V0LT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUxheW91dCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwRm9ybUxheW91dC0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1MYXlvdXQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzRXhpc3RGb3JtID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZihiSXNFeGlzdEZvcm0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV3U3ViZm9ybSA9IHBGb3JtTGF5b3V0LT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtICE9IE5VTEwgJiYgcENvbnRhaW5lckl0ZW0tPm1fcE9sZFN1YmZvcm0gIT0gcE5ld1N1YmZvcm0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZShwRG9jdW1lbnQsIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpLCBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldE5hbWVIYXNoKCksIHBQYXJlbnROb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVySXRlcmF0b3Igc0l0ZXJhdG9yKHBFeGlzdGluZ05vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IChDWEZBX0xheW91dEl0ZW1JbXBsKilwTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCAoQ1hGQV9MYXlvdXRJdGVtKilwTGF5b3V0SXRlbSwgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcExheW91dEl0ZW07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwRXhpc3RpbmdOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPlJlbW92ZUNoaWxkKHBFeGlzdGluZ05vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtID0gcE5ld1N1YmZvcm07DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLCBwUGFyZW50Tm9kZSwgKENYRkFfTm9kZSopcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9SZWNvcmQpLCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOiB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BQYXJlbnQtPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ2hpbGROb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKSAhPSBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSA9IHBDaGlsZE5vZGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoIXBQZW5kaW5nUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtVG9wbGV2ZWxTdWJmb3JtID0gKChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgICAgICAgICAgICBwRm9ybVRvcGxldmVsU3ViZm9ybS0+SW5zZXJ0Q2hpbGQocFBlbmRpbmdQYWdlU2V0KTsNCisgICAgICAgIH0NCisgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocFBlbmRpbmdQYWdlU2V0KTsNCisgICAgICAgIHBQZW5kaW5nUGFnZVNldC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICB9DQorICAgIHBQZW5kaW5nUGFnZVNldCA9IEdldFJvb3RMYXlvdXRJdGVtKCktPm1fcEZvcm1Ob2RlOw0KKyAgICB3aGlsZShwUGVuZGluZ1BhZ2VTZXQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcE5leHRQZW5kaW5nUGFnZVNldCA9IHBQZW5kaW5nUGFnZVNldC0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcihwUGVuZGluZ1BhZ2VTZXQpOw0KKyAgICAgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICB3aGlsZShwTm9kZSkgew0KKyAgICAgICAgICAgIGlmKHBOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgICAgICAgICBpZihwTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVDdXJJZCA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZUN1cklkID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhIHx8IGVDdXJJZCA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBpdGVDaGlsZChwTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gKENYRkFfTGF5b3V0SXRlbUltcGwqKXBDaGlsZE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocExheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlQ3VySWQgIT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IChDWEZBX0xheW91dEl0ZW1JbXBsKilwTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBMYXlvdXRJdGVtKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcExheW91dEl0ZW07DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dCA9IHNJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcE5leHQ7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwTmV4dFBlbmRpbmdQYWdlU2V0Ow0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpMYXlvdXRQYWdlU2V0Q29udGVudHMoKQ0KK3sNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCisgICAgZm9yKDsgcFJvb3RMYXlvdXRJdGVtOyBwUm9vdExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtPiBpdGVyYXRvcihwUm9vdExheW91dEl0ZW0pOw0KKyAgICAgICAgZm9yKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwQ29udGFpbmVySXRlbTsgcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICAgIHN3aXRjaChwTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICAgICAgICAgICAgICBtX3BMYXlvdXRQcm9jZXNzb3ItPkdldFJvb3RSb290SXRlbUxheW91dFByb2Nlc3NvcigpLT5Eb0xheW91dFBhZ2VBcmVhKHBDb250YWluZXJJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgWEZBX1N5bmNDb250YWluZXIoSVhGQV9Ob3RpZnkqIHBOb3RpZnksIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0LCBDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSwgRlhfRFdPUkQgZHdSZWxldmFudCwgRlhfQk9PTCBiVmlzaWJsZSwgRlhfSU5UMzIgblBhZ2VJbmRleCkNCit7DQorICAgIEZYX0JPT0wgYlZpc2libGVJdGVtID0gRkFMU0U7DQorICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMDsNCisgICAgRlhfRFdPUkQgZHdSZWxldmFudENvbnRhaW5lciA9IDA7DQorICAgIGlmIChiVmlzaWJsZSkgew0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHJpYnV0ZVZhbHVlID0gcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpOw0KKyAgICAgICAgaWYoZUF0dHJpYnV0ZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUgfHwgZUF0dHJpYnV0ZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pIHsNCisgICAgICAgICAgICBiVmlzaWJsZUl0ZW0gPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZHdSZWxldmFudENvbnRhaW5lciA9IFhGQV9HZXRSZWxldmFudChwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUsIGR3UmVsZXZhbnQpOw0KKyAgICAgICAgZHdTdGF0dXMgPSAoYlZpc2libGVJdGVtID8gWEZBX0xBWU9VVFNUQVRVU19WaXNpYmxlIDogMCkgfCBkd1JlbGV2YW50Q29udGFpbmVyOw0KKyAgICB9DQorICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcENvbnRhaW5lckl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtQWRkZWQsIChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpblBhZ2VJbmRleCwgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilkd1N0YXR1cyk7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwgKnBDaGlsZCA9IHBDb250YWluZXJJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBpZiAoIXBDaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9TeW5jQ29udGFpbmVyKHBOb3RpZnksIHBEb2NMYXlvdXQsIHBDaGlsZCwgZHdSZWxldmFudENvbnRhaW5lciwgYlZpc2libGVJdGVtLCBuUGFnZUluZGV4KTsNCisgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlN5bmNMYXlvdXREYXRhKCkNCit7DQorICAgIE1lcmdlUGFnZVNldENvbnRlbnRzKCk7DQorICAgIExheW91dFBhZ2VTZXRDb250ZW50cygpOw0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgRlhfSU5UMzIgblBhZ2VJZHggPSAtMTsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCisgICAgZm9yKDsgcFJvb3RMYXlvdXRJdGVtOyBwUm9vdExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtPiBpdGVyYXRvclBhcmVudChwUm9vdExheW91dEl0ZW0pOw0KKyAgICAgICAgZm9yKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gaXRlcmF0b3JQYXJlbnQuR2V0Q3VycmVudCgpOyBwQ29udGFpbmVySXRlbTsgcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvclBhcmVudC5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgICBzd2l0Y2gocENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5QYWdlSWR4Kys7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWxldmFudCA9IFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUgfCBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTGF5b3V0SXRlbSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0xheW91dEl0ZW0qKXBDb250YWluZXJJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRMYXlvdXRJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwQ2hpbGRMYXlvdXRJdGVtOykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcENoaWxkTGF5b3V0SXRlbSktPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ29udGVudEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZExheW91dEl0ZW07DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUgPSAocENvbnRlbnRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWxldmFudENoaWxkID0gWEZBX0dldFJlbGV2YW50KHBDb250ZW50SXRlbS0+bV9wRm9ybU5vZGUsIGR3UmVsZXZhbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU3luY0NvbnRhaW5lcihwTm90aWZ5LCBtX3BMYXlvdXRQcm9jZXNzb3IsIHBDb250ZW50SXRlbSwgZHdSZWxldmFudENoaWxkLCBiVmlzaWJsZSwgblBhZ2VJZHgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtID0gaXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5QYWdlID0gbV9QYWdlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSBuUGFnZSAtIDE7IGkgPj0gbV9uQXZhaWxQYWdlczsgaS0tKSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZSA9IG1fUGFnZUFycmF5W2ldOw0KKyAgICAgICAgbV9QYWdlQXJyYXkuUmVtb3ZlQXQoaSk7DQorICAgICAgICBwTm90aWZ5LT5PblBhZ2VFdmVudCgoSVhGQV9MYXlvdXRQYWdlKilwUGFnZSwgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCk7DQorICAgICAgICBkZWxldGUgcFBhZ2U7DQorICAgIH0NCisgICAgQ2xlYXJSZWNvcmRMaXN0KCk7DQorfQ0KK3ZvaWQgWEZBX1JlbGVhc2VMYXlvdXRJdGVtX05vUGFnZUFyZWEoQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcExheW91dEl0ZW0pDQorew0KKyAgICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dCwgKnBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgIHdoaWxlIChwTm9kZSkgew0KKyAgICAgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCisgICAgICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbV9Ob1BhZ2VBcmVhKHBOb2RlKTsNCisgICAgICAgIHBOb2RlID0gcE5leHQ7DQorICAgIH0NCisgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICBkZWxldGUgcExheW91dEl0ZW07DQorICAgIH0NCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByZXBhcmVMYXlvdXQoKQ0KK3sNCisgICAgbV9wUGFnZVNldEN1clJvb3QgPSBOVUxMOw0KKyAgICBtX2VQYWdlU2V0TW9kZSA9IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlOw0KKyAgICBtX25BdmFpbFBhZ2VzID0gMDsNCisgICAgQ2xlYXJSZWNvcmRMaXN0KCk7DQorICAgIGlmICghbV9wUGFnZVNldExheW91dEl0ZW1Sb290KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgICBpZihwUm9vdExheW91dEl0ZW0gJiYgcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhZ2VTZXRGb3JtTm9kZSA9IHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQorICAgICAgICBwUm9vdExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5tX3BQZW5kaW5nUGFnZVNldC5SZW1vdmVBbGwoKTsNCisgICAgICAgIGlmIChwUGFnZVNldEZvcm1Ob2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkKSkgew0KKyAgICAgICAgICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwUm9vdExheW91dEl0ZW0pOw0KKyAgICAgICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9IE5VTEw7DQorICAgICAgICAgICAgcFJvb3RMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICAgICAgICBwUGFnZVNldEZvcm1Ob2RlID0gTlVMTDsNCisgICAgICAgICAgICBtX1BhZ2VBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlKHBQYWdlU2V0Rm9ybU5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldCA9IHBQYWdlU2V0Rm9ybU5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICAgICAgICAgIHBQYWdlU2V0Rm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5SZW1vdmVDaGlsZChwUGFnZVNldEZvcm1Ob2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+bV9wUGVuZGluZ1BhZ2VTZXQuQWRkKHBQYWdlU2V0Rm9ybU5vZGUpOw0KKyAgICAgICAgICAgIHBQYWdlU2V0Rm9ybU5vZGUgPSBwTmV4dFBhZ2VTZXQ7DQorICAgICAgICB9DQorICAgIH0NCisjaWYgZGVmaW5lZChfWEZBX0xBWU9VVElURU1fTUFQQ0FDSEVfKSB8fCBkZWZpbmVkKF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfKQ0KKyAgICBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBOZXh0TGF5b3V0ID0gTlVMTDsNCisgICAgZm9yKDsgcFJvb3RMYXlvdXRJdGVtOyBwUm9vdExheW91dEl0ZW0gPSBwTmV4dExheW91dCkgew0KKyAgICAgICAgcE5leHRMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgIFNhdmVMYXlvdXRJdGVtKHBSb290TGF5b3V0SXRlbSk7DQorICAgICAgICBkZWxldGUgcFJvb3RMYXlvdXRJdGVtOw0KKyAgICB9DQorICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9IE5VTEw7DQorI2Vsc2UNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BMYXlvdXRQcm9jZXNzb3ItPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgcFJvb3RMYXlvdXRJdGVtID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgICBmb3IoOyBwUm9vdExheW91dEl0ZW07IHBSb290TGF5b3V0SXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9QYWdlQXJlYUNvbnRhaW5lckxheW91dEl0ZW0+IGl0ZXJhdG9yKHBSb290TGF5b3V0SXRlbSk7DQorICAgICAgICBmb3IoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7IHBDb250YWluZXJJdGVtOyBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIGlmKHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTGF5b3V0SXRlbSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0xheW91dEl0ZW0qKXBDb250YWluZXJJdGVtKTsNCisgICAgICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSAoQ1hGQV9MYXlvdXRJdGVtSW1wbCopaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSAoQ1hGQV9MYXlvdXRJdGVtSW1wbCopaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgIGlmICghcExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChtX3BMYXlvdXRQcm9jZXNzb3IsIChDWEZBX0xheW91dEl0ZW0qKXBMYXlvdXRJdGVtLCBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vdGlmeS0+T25QYWdlRXZlbnQoKElYRkFfTGF5b3V0UGFnZSopcENvbnRhaW5lckl0ZW0sIFhGQV9QQUdFRVZFTlRfUGFnZVJlbW92ZWQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBSb290TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5leHRMYXlvdXQgPSBOVUxMOw0KKyAgICBmb3IoOyBwUm9vdExheW91dEl0ZW07IHBSb290TGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0KSB7DQorICAgICAgICBwTmV4dExheW91dCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtX05vUGFnZUFyZWEocFJvb3RMYXlvdXRJdGVtKTsNCisgICAgfQ0KKyAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QgPSBOVUxMOw0KKyNlbmRpZg0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhZjAxYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfTEFZT1VUX1BBR0VNR1JfSF8NCisjZGVmaW5lIF9YRkFfTEFZT1VUX1BBR0VNR1JfSF8NCitjbGFzcyBDWEZBX0NvbnRhaW5lclJlY29yZCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Db250YWluZXJSZWNvcmQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhZ2VTZXQgPSBOVUxMLCBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZUFyZWEgPSBOVUxMLCBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGVudEFyZWEgPSBOVUxMKQ0KKyAgICAgICAgOiBwQ3VyUGFnZVNldChwUGFnZVNldCksIHBDdXJQYWdlQXJlYShwUGFnZUFyZWEpLCBwQ3VyQ29udGVudEFyZWEocENvbnRlbnRBcmVhKQ0KKyAgICB7DQorICAgIH0NCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcEN1clBhZ2VTZXQ7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDdXJQYWdlQXJlYTsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcEN1ckNvbnRlbnRBcmVhOw0KK307DQorY2xhc3MgQ1hGQV9MYXlvdXRQYWdlTWdyIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX0xheW91dFBhZ2VNZ3IoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IpOw0KKyAgICB+Q1hGQV9MYXlvdXRQYWdlTWdyKCk7DQorICAgIEZYX0JPT0wJCUluaXRMYXlvdXRQYWdlKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgICAgRlhfQk9PTAkJUHJlcGFyZUZpcnN0UGFnZShDWEZBX05vZGUqIHBSb290U3ViZm9ybSk7DQorICAgIEZYX0ZMT0FUCUdldEF2YWlsSGVpZ2h0KCk7DQorICAgIEZYX0JPT0wJCUdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KTsNCisgICAgdm9pZAkJU3VibWl0Q29udGVudEl0ZW0oQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDb250ZW50TGF5b3V0SXRlbSwgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVN0YXR1cyk7DQorICAgIHZvaWQJCUZpbmlzaFBhZ2luYXRlZFBhZ2VTZXRzKCk7DQorICAgIHZvaWQJCVN5bmNMYXlvdXREYXRhKCk7DQorICAgIEZYX0lOVDMyCQkJR2V0UGFnZUNvdW50KCkgY29uc3Q7DQorICAgIElYRkFfTGF5b3V0UGFnZSoJR2V0UGFnZShGWF9JTlQzMiBpbmRleCkgY29uc3Q7DQorICAgIEZYX0lOVDMyCQkJR2V0UGFnZUluZGV4KElYRkFfTGF5b3V0UGFnZSogcFBhZ2UpIGNvbnN0Ow0KKyAgICBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCoJR2V0Um9vdExheW91dEl0ZW0oKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgICB9DQorICAgIEZYX0JPT0wJCVByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlLCBGWF9CT09MIGJCZWZvcmUsIENYRkFfTm9kZSogJnBCcmVha0xlYWRlck5vZGUsIENYRkFfTm9kZSogJnBCcmVha1RyYWlsZXJOb2RlLCBGWF9CT09MJiBiQ3JlYXRlUGFnZSk7DQorICAgIEZYX0JPT0wJCVByb2Nlc3NPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiAmcExlYWRlck5vZGUsIENYRkFfTm9kZSogJnBUcmFpbGVyTm9kZSwgRlhfQk9PTCBiRGF0YU1lcmdlID0gRkFMU0UsIEZYX0JPT0wgYkNyZWF0ZVBhZ2UgPSBUUlVFKTsNCisgICAgQ1hGQV9Ob2RlKglRdWVyeU92ZXJmbG93KENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0ID0gTlVMTCk7DQorICAgIEZYX0JPT0wJCVByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKENYRkFfTm9kZSogcEJvb2tlbmROb2RlLCBGWF9CT09MIGJMZWFkZXIsIENYRkFfTm9kZSogJnBCb29rZW5kQXBwZW5kTm9kZSk7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIEZpbmRPckNyZWF0ZUxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KK3Byb3RlY3RlZDoNCisgICAgRlhfQk9PTCAJQXBwZW5kTmV3UGFnZShGWF9CT09MIGJGaXJzdFRlbVBhZ2UgPSBGQUxTRSk7DQorICAgIHZvaWQJCVJlb3JkZXJQZW5kaW5nTGF5b3V0UmVjb3JkVG9UYWlsKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLCBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpOw0KKyAgICB2b2lkCQlSZW1vdmVMYXlvdXRSZWNvcmQoQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUHJldlJlY29yZCk7DQorICAgIGlubGluZSBDWEZBX0NvbnRhaW5lclJlY29yZCogR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpDQorICAgIHsNCisgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiByZXN1bHQgPSAoKENYRkFfQ29udGFpbmVyUmVjb3JkKiltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0QXQobV9wQ3VycmVudENvbnRhaW5lclJlY29yZCkpOw0KKyAgICAgICAgQVNTRVJUKHJlc3VsdCk7DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBDcmVhdGVDb250YWluZXJSZWNvcmQoQ1hGQV9Ob2RlKiBwUGFnZU5vZGUgPSBOVUxMLCBGWF9CT09MIGJDcmVhdGVOZXcgPSBGQUxTRSk7DQorICAgIHZvaWQJCUFkZFBhZ2VBcmVhTGF5b3V0SXRlbShDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwgQ1hGQV9Ob2RlKiBwTmV3UGFnZUFyZWEpOw0KKyAgICB2b2lkCQlBZGRDb250ZW50QXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfTm9kZSogcENvbnRlbnRBcmVhKTsNCisgICAgRlhfQk9PTAkJUnVuQnJlYWsoWEZBX0VMRU1FTlQgZUJyZWFrVHlwZSwgWEZBX0FUVFJJQlVURUVOVU0gZVRhcmdldFR5cGUsIENYRkFfTm9kZSogcFRhcmdldCwgRlhfQk9PTCBiU3RhcnROZXcpOw0KKyAgICBDWEZBX05vZGUqCUJyZWFrT3ZlcmZsb3coQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dOb2RlLCBDWEZBX05vZGUqJiBwTGVhZGVyVGVtcGxhdGUsIENYRkFfTm9kZSomIHBUcmFpbGVyVGVtcGxhdGUsIEZYX0JPT0wgYkNyZWF0ZVBhZ2UgPSBUUlVFKTsNCisgICAgRlhfQk9PTAkJUmVzb2x2ZUJvb2tlbmRMZWFkZXJPclRyYWlsZXIoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsIEZYX0JPT0wgYkxlYWRlciwgQ1hGQV9Ob2RlKiAmcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSk7DQorICAgIEZYX0JPT0wJCUV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSwgRlhfQk9PTCBiQmVmb3JlLCBDWEZBX05vZGUqICZwQnJlYWtMZWFkZXJUZW1wbGF0ZSwgQ1hGQV9Ob2RlKiAmcEJyZWFrVHJhaWxlclRlbXBsYXRlKTsNCisNCisgICAgRlhfSU5UMzIJQ3JlYXRlTWluUGFnZVJlY29yZChDWEZBX05vZGUqIHBQYWdlQXJlYSwgRlhfQk9PTCBiVGFyZ2V0UGFnZUFyZWEsIEZYX0JPT0wgYkNyZWF0ZUxhc3QgPSBGQUxTRSk7DQorICAgIHZvaWQJCUNyZWF0ZU1pblBhZ2VTZXRSZWNvcmQoQ1hGQV9Ob2RlKiBwUGFnZVNldCwgRlhfQk9PTCBiQ3JlYXRlQWxsID0gRkFMU0UpOw0KKyAgICB2b2lkCQlDcmVhdGVOZXh0TWluUmVjb3JkKENYRkFfTm9kZSogcFJlY29yZE5vZGUpOw0KKyAgICBGWF9CT09MCQlGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChDWEZBX05vZGUqIHBQYWdlU2V0LCBDWEZBX05vZGUqIHBTdGFydENoaWxkLCBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEwsIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhID0gTlVMTCwgRlhfQk9PTCBiTmV3UGFnZSA9IEZBTFNFLCBGWF9CT09MIGJRdWVyeSA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfT3JkZXJlZChDWEZBX05vZGUqIHBQYWdlU2V0LCBDWEZBX05vZGUqIHBTdGFydENoaWxkLCBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEwsIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhID0gTlVMTCwgRlhfQk9PTCBiTmV3UGFnZSA9IEZBTFNFLCBGWF9CT09MIGJRdWVyeSA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleChDWEZBX05vZGUqIHBQYWdlU2V0LCBDWEZBX05vZGUqIHBTdGFydENoaWxkLCBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEwsIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhID0gTlVMTCwgRlhfQk9PTCBiTmV3UGFnZSA9IEZBTFNFLCBGWF9CT09MIGJRdWVyeSA9IEZBTFNFLCBYRkFfQVRUUklCVVRFRU5VTSBlUHJlZmVycmVkUG9zaXRpb24gPSBYRkFfQVRUUklCVVRFRU5VTV9GaXJzdCk7DQorICAgIEZYX0JPT0wJCU1hdGNoUGFnZUFyZWFPZGRPckV2ZW4oQ1hGQV9Ob2RlKiBwUGFnZUFyZWEsIEZYX0JPT0wgYkxhc3RNYXRjaCk7DQorICAgIENYRkFfTm9kZSoJR2V0TmV4dEF2YWlsUGFnZUFyZWEoQ1hGQV9Ob2RlKiBwVGFyZ2V0UGFnZUFyZWEsIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhID0gTlVMTCwgRlhfQk9PTCBiTmV3UGFnZSA9IEZBTFNFLCBGWF9CT09MIGJRdWVyeSA9IEZBTFNFKTsNCisgICAgRlhfQk9PTAkJR2V0TmV4dENvbnRlbnRBcmVhKENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhKTsNCisgICAgdm9pZAkJSW5pdFBhZ2VTZXRNYXAoKTsNCisgICAgdm9pZAkJUHJvY2Vzc0xhc3RQYWdlU2V0KCk7DQorICAgIGlubGluZQlGWF9CT09MCUlzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2VQYWdlU2V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZTsNCisgICAgfQ0KKyAgICB2b2lkCQlDbGVhckRhdGEoKTsNCisgICAgdm9pZAkJQ2xlYXJSZWNvcmRMaXN0KCk7DQorICAgIHZvaWQJCU1lcmdlUGFnZVNldENvbnRlbnRzKCk7DQorICAgIHZvaWQJCUxheW91dFBhZ2VTZXRDb250ZW50cygpOw0KKyAgICB2b2lkCQlQcmVwYXJlTGF5b3V0KCk7DQorICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKgkJCQltX3BMYXlvdXRQcm9jZXNzb3I7DQorICAgIENYRkFfTm9kZSoJCQkJCQkJbV9wVGVtcGxhdGVQYWdlU2V0Um9vdDsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCoJCW1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCoJCW1fcFBhZ2VTZXRDdXJSb290Ow0KKyAgICBGWF9QT1NJVElPTgkJCQkJCQltX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkOw0KKyAgICBDRlhfUHRyTGlzdAkJCQkJCQltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQ7DQorICAgIENYRkFfTm9kZSoJCQkJCQkJbV9wQ3VyUGFnZUFyZWE7DQorICAgIEZYX0lOVDMyCQkJCQkJCW1fbkF2YWlsUGFnZXM7DQorICAgIEZYX0lOVDMyCQkJCQkJCW1fbkN1clBhZ2VDb3VudDsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0JCQkJCW1fZVBhZ2VTZXRNb2RlOw0KKyAgICBGWF9CT09MCQkJCQkJCQltX2JDcmVhdGVPdmVyRmxvd1BhZ2U7DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBGWF9JTlQzMj4gbV9wUGFnZVNldE1hcDsNCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXw0KKyAgICB2b2lkCQkJCQkJU2F2ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0pOw0KKyAgICBDRlhfTWFwUHRyVG9QdHIJCQkJbV9Ob2RlVG9Db250ZW50Ow0KKyNlbGlmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8pDQorICAgIHZvaWQJCQkJCQlTYXZlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSk7DQorI2VuZGlmDQorICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqPgkJCQltX1BhZ2VBcnJheTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1OTkwNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuY3BwCkBAIC0wLDAgKzEsMzczIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9sb2NhbGUuaCINCitjb25zdCBzdGF0aWMgRlhfTFBDV1NUUiBnX0ZYX1BlcmNlbnQgPSAgKEZYX0xQQ1dTVFIpTCJ6LHp6eix6enosenp6LHp6eix6enolIjsNCitjb25zdCBzdGF0aWMgRlhfTFBDV1NUUiBnX0ZYX0N1cnJlbmN5ID0gKEZYX0xQQ1dTVFIpTCIkeix6enosenp6LHp6eix6enoseno5Ljk5IjsNCitjb25zdCBzdGF0aWMgRlhfTFBDV1NUUiBnX0ZYX0RlY2ltYWwgPSAoRlhfTFBDV1NUUilMInosenp6LHp6eix6enosenp6LHp6OS56enoiOw0KK2NvbnN0IHN0YXRpYyBGWF9MUENXU1RSIGdfRlhfSW50ZWdlciA9IChGWF9MUENXU1RSKUwieix6enosenp6LHp6eix6enosenp6IjsNCitDWEZBX1hNTExvY2FsZTo6Q1hGQV9YTUxMb2NhbGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSkNCit7DQorICAgIG1fcExvY2FsZURhdGEgPSBwTG9jYWxlRGF0YTsNCit9DQorQ1hGQV9YTUxMb2NhbGU6On5DWEZBX1hNTExvY2FsZSgpDQorew0KKyAgICBpZiAobV9wTG9jYWxlRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIG1fcExvY2FsZURhdGE7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6UmVsZWFzZSgpDQorew0KKyAgICBkZWxldGUgdGhpczsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9YTUxMb2NhbGU6OkdldE5hbWUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcExvY2FsZURhdGEgPyBtX3BMb2NhbGVEYXRhLT5HZXRBdHRyVmFsdWUoRlhfQlNUUkMoIm5hbWUiKSkgOiBDRlhfV2lkZVN0cmluZygpOw0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3QNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzU3ltYm9sczsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsOg0KKyAgICAgICAgICAgIGJzU3ltYm9scyA9IEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIik7DQorICAgICAgICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJkZWNpbWFsIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZzoNCisgICAgICAgICAgICBic1N5bWJvbHMgPSBGWF9CU1RSQygibnVtYmVyU3ltYm9scyIpOw0KKyAgICAgICAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwiZ3JvdXBpbmciKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQ6DQorICAgICAgICAgICAgYnNTeW1ib2xzID0gRlhfQlNUUkMoIm51bWJlclN5bWJvbHMiKTsNCisgICAgICAgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMInBlcmNlbnQiKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzOg0KKyAgICAgICAgICAgIGJzU3ltYm9scyA9IChGWF9CU1RSQygibnVtYmVyU3ltYm9scyIpKTsNCisgICAgICAgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMIm1pbnVzIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9aZXJvOg0KKyAgICAgICAgICAgIGJzU3ltYm9scyA9IChGWF9CU1RSQygibnVtYmVyU3ltYm9scyIpKTsNCisgICAgICAgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMInplcm8iKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sOg0KKyAgICAgICAgICAgIGJzU3ltYm9scyA9IChGWF9CU1RSQygiY3VycmVuY3lTeW1ib2xzIikpOw0KKyAgICAgICAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwic3ltYm9sIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeU5hbWU6DQorICAgICAgICAgICAgYnNTeW1ib2xzID0gKEZYX0JTVFJDKCJjdXJyZW5jeVN5bWJvbHMiKSk7DQorICAgICAgICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJpc29uYW1lIik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudChGWF9CU1RSQygiIiksIGJzU3ltYm9scyk7DQorICAgIGlmICghcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBHZXRQYXR0ZXJuKHBFbGVtZW50LCBDRlhfQnl0ZVN0cmluZ0MoKEZYX0xQQ1NUUilic1N5bWJvbHMsIGJzU3ltYm9scy5HZXRMZW5ndGgoKSAtIDEpLCB3c05hbWUsIHdzTnVtU3ltYm9sKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdA0KK3sNCisgICAgaWYgKCFtX3BMb2NhbGVEYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsNCisgICAgQ1hNTF9FbGVtZW50KiBwTnVtYmVyU3ltYm9scyA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoYnNTcGFjZSwgRlhfQlNUUkMoImRhdGVUaW1lU3ltYm9scyIpKTsNCisgICAgaWYgKCFwTnVtYmVyU3ltYm9scykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHdzRHRTeW1ib2wgPSBwTnVtYmVyU3ltYm9scy0+R2V0Q29udGVudCgwKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TW9udGhOYW1lKEZYX0lOVDMyIG5Nb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLCBGWF9CT09MIGJBYmJyICkgY29uc3QNCit7DQorICAgIHdzTW9udGhOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woRlhfQlNUUkMoIm1vbnRoIiksIG5Nb250aCwgYkFiYnIpOw0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXREYXlOYW1lKEZYX0lOVDMyIG5XZWVrLCBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLCBGWF9CT09MIGJBYmJyICkgY29uc3QNCit7DQorICAgIHdzRGF5TmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKEZYX0JTVFJDKCJkYXkiKSwgbldlZWssIGJBYmJyKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gKSBjb25zdA0KK3sNCisgICAgd3NNZXJpZGllbU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygibWVyaWRpZW0iKSwgYkFNID8gMCA6IDEsIEZBTFNFKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdA0KK3sNCisgICAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBwUHJvdmlkZXIgPSBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpOw0KKyAgICBwUHJvdmlkZXItPkdldFRpbWVab25lKHR6KTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCApIGNvbnN0DQorew0KKyAgICB3c0VyYU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygiZXJhIiksIGJBRCA/IDEgOiAwLCBGQUxTRSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSIHN5bWJvbCwgaW50IGluZGV4LCBGWF9CT09MIGJBYmJyKSBjb25zdA0KK3sNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcHN0clN5bWJvbE5hbWVzID0gc3ltYm9sICsgIk5hbWVzIjsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xOYW1lID0gTCIiOw0KKyAgICBpZiAobV9wTG9jYWxlRGF0YSkgew0KKyAgICAgICAgQ1hNTF9FbGVtZW50ICpwQ2hpbGQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCBGWF9CU1RSQygiY2FsZW5kYXJTeW1ib2xzIikpOw0KKyAgICAgICAgaWYgKHBDaGlsZCkgew0KKyAgICAgICAgICAgIENYTUxfRWxlbWVudCAqcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KCIiLCBwc3RyU3ltYm9sTmFtZXMpOw0KKyAgICAgICAgICAgIGlmIChwU3ltYm9sTmFtZXMpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoRlhfQlNUUkMoImFiYnIiKSkgIT0gYkFiYnIpIHsNCisgICAgICAgICAgICAgICAgICAgIHBTeW1ib2xOYW1lcyA9IHBDaGlsZC0+R2V0RWxlbWVudCgiIiwgcHN0clN5bWJvbE5hbWVzLCAxKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocFN5bWJvbE5hbWVzICYmIHBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoRlhfQlNUUkMoImFiYnIiKSkgPT0gYkFiYnIpIHsNCisgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCAqcFN5bWJvbE5hbWUgPSBwU3ltYm9sTmFtZXMtPkdldEVsZW1lbnQoIiIsIHN5bWJvbCwgaW5kZXgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTeW1ib2xOYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NTeW1ib2xOYW1lID0gcFN5bWJvbE5hbWUtPkdldENvbnRlbnQoMCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHdzU3ltYm9sTmFtZTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCit7DQorICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KEZYX0JTVFJDKCIiKSwgRlhfQlNUUkMoImRhdGVQYXR0ZXJucyIpKTsNCisgICAgaWYgKHBFbGVtZW50ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDoNCisgICAgICAgICAgICB3c05hbWUgPSBMInNob3J0IjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0Og0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgICAgICAgICB3c05hbWUgPSBMIm1lZCI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCisgICAgICAgICAgICB3c05hbWUgPSBMImZ1bGwiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6DQorICAgICAgICAgICAgd3NOYW1lID0gTCJsb25nIjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBHZXRQYXR0ZXJuKHBFbGVtZW50LCBGWF9CU1RSQygiZGF0ZVBhdHRlcm4iKSwgd3NOYW1lLCB3c1BhdHRlcm4pOw0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdA0KK3sNCisgICAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoRlhfQlNUUkMoIiIpLCBGWF9CU1RSQygidGltZVBhdHRlcm5zIikpOw0KKyAgICBpZiAocEVsZW1lbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgICAgICAgIHdzTmFtZSA9IEwic2hvcnQiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOg0KKyAgICAgICAgICAgIHdzTmFtZSA9IEwibWVkIjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KKyAgICAgICAgICAgIHdzTmFtZSA9IEwiZnVsbCI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoNCisgICAgICAgICAgICB3c05hbWUgPSBMImxvbmciOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIEdldFBhdHRlcm4ocEVsZW1lbnQsIEZYX0JTVFJDKCJ0aW1lUGF0dGVybiIpLCB3c05hbWUsIHdzUGF0dGVybik7DQorfQ0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQorew0KKyAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudChGWF9CU1RSQygiIiksIEZYX0JTVFJDKCJudW1iZXJQYXR0ZXJucyIpKTsNCisgICAgaWYgKHBFbGVtZW50ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudDoNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBnX0ZYX1BlcmNlbnQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3k6DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gZ19GWF9DdXJyZW5jeTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOg0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IGdfRlhfRGVjaW1hbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyOg0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IGdfRlhfSW50ZWdlcjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRQYXR0ZXJuKENYTUxfRWxlbWVudCogcEVsZW1lbnQsIEZYX0JTVFIgYnNUYWcsIEZYX1dTVFIgd3NOYW1lLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdA0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gcEVsZW1lbnQtPkNvdW50RWxlbWVudHMoRlhfQlNUUkMoIiIpLCBic1RhZyk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudChGWF9CU1RSQygiIiksIGJzVGFnLCBpKTsNCisgICAgICAgIGlmIChwQ2hpbGQtPkdldEF0dHJWYWx1ZShGWF9CU1RSQygibmFtZSIpKSA9PSB3c05hbWUpIHsNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBwQ2hpbGQtPkdldENvbnRlbnQoMCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0NYRkFfTm9kZUxvY2FsZTo6Q1hGQV9Ob2RlTG9jYWxlKENYRkFfTm9kZSAqcExvY2FsZSkNCit7DQorICAgIG1fcExvY2FsZSA9IHBMb2NhbGU7DQorfQ0KK0NYRkFfTm9kZUxvY2FsZTo6fkNYRkFfTm9kZUxvY2FsZSgpDQorew0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6UmVsZWFzZSgpDQorew0KKyAgICBkZWxldGUgdGhpczsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9Ob2RlTG9jYWxlOjpHZXROYW1lKCkNCit7DQorICAgIHJldHVybiBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkgOiBOVUxMOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0DQorew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsOg0KKyAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwiZGVjaW1hbCIpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nOg0KKyAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwiZ3JvdXBpbmciKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50Og0KKyAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwicGVyY2VudCIpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzOg0KKyAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwibWludXMiKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9aZXJvOg0KKyAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwiemVybyIpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sOg0KKyAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywgRlhfV1NUUkMoTCJzeW1ib2wiKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeU5hbWU6DQorICAgICAgICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2xzLCBGWF9XU1RSQyhMImlzb25hbWUiKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSAqcFN5bWJvbHMgPSBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0RhdGVUaW1lU3ltYm9scykgOiBOVUxMOw0KKyAgICB3c0R0U3ltYm9sID0gcFN5bWJvbHMgPyBwU3ltYm9scy0+R2V0Q29udGVudCgpIDogQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE1vbnRoTmFtZShGWF9JTlQzMiBuTW9udGgsIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwgRlhfQk9PTCBiQWJiciApIGNvbnN0DQorew0KKyAgICB3c01vbnRoTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsIG5Nb250aCwgYkFiYnIpOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF5TmFtZShGWF9JTlQzMiBuV2VlaywgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwgRlhfQk9PTCBiQWJiciApIGNvbnN0DQorew0KKyAgICB3c0RheU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChYRkFfRUxFTUVOVF9EYXlOYW1lcywgbldlZWssIGJBYmJyKTsNCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsIEZYX0JPT0wgYkFNICkgY29uc3QNCit7DQorICAgIHdzTWVyaWRpZW1OYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlRfTWVyaWRpZW1OYW1lcywgYkFNID8gMCA6IDEsIEZBTFNFKTsNCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3QNCit7DQorICAgIElYRkFfVGltZVpvbmVQcm92aWRlciogcFByb3ZpZGVyID0gSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXQoKTsNCisgICAgcFByb3ZpZGVyLT5HZXRUaW1lWm9uZSh0eik7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEICkgY29uc3QNCit7DQorICAgIHdzRXJhTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UX0VyYU5hbWVzLCBiQUQgPyAxIDogMCwgRkFMU0UpOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCit7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDoNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm5zLCBGWF9XU1RSQyhMInNob3J0IikpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0Og0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIEZYX1dTVFJDKEwibWVkIikpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGw6DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgRlhfV1NUUkMoTCJmdWxsIikpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgRlhfV1NUUkMoTCJsb25nIikpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdA0KK3sNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwic2hvcnQiKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOg0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgRlhfV1NUUkMoTCJtZWQiKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLCBGWF9XU1RSQyhMImZ1bGwiKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLCBGWF9XU1RSQyhMImxvbmciKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQorew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudDoNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBnX0ZYX1BlcmNlbnQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3k6DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gZ19GWF9DdXJyZW5jeTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOg0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IGdfRlhfRGVjaW1hbDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyOg0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IGdfRlhfSW50ZWdlcjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZUxvY2FsZTo6R2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUgKnBQYXJlbnQsIEZYX1dTVFIgd3NOYW1lKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlICpwQ2hpbGQgPSBwUGFyZW50ID8gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpIDogTlVMTDsNCisgICAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGlsZDsNCisgICAgICAgIGlmIChwQ2hpbGQtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzQ2hpbGQpKSB7DQorICAgICAgICAgICAgaWYgKHdzQ2hpbGQgPT0gd3NOYW1lKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldFN5bWJvbChYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfV1NUUiBzeW1ib2xfdHlwZSkgY29uc3QNCit7DQorICAgIENYRkFfTm9kZSAqcFN5bWJvbHMgPSBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENoaWxkKDAsIGVFbGVtZW50KSA6IE5VTEw7DQorICAgIENYRkFfTm9kZSAqcFN5bWJvbCA9IEdldE5vZGVCeU5hbWUocFN5bWJvbHMsIHN5bWJvbF90eXBlKTsNCisgICAgcmV0dXJuIHBTeW1ib2wgPyBwU3ltYm9sLT5HZXRDb250ZW50KCkgOiBDRlhfV2lkZVN0cmluZygpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQgaW5kZXgsIEZYX0JPT0wgYkFiYnIpIGNvbnN0DQorew0KKyAgICBDWEZBX05vZGUgKnBDYWxlbmRhciA9IG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzKSA6IE5VTEw7DQorICAgIGlmIChwQ2FsZW5kYXIpIHsNCisgICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSBwQ2FsZW5kYXItPkdldEZpcnN0Q2hpbGRCeUNsYXNzKGVFbGVtZW50KTsNCisgICAgICAgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoZUVsZW1lbnQpKSB7DQorICAgICAgICAgICAgaWYgKHBOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfQWJicikgPT0gYkFiYnIpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwU3ltYm9sID0gcE5vZGUtPkdldENoaWxkKGluZGV4LCBYRkFfRUxFTUVOVF9VTktOT1dOKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBTeW1ib2wgPyBwU3ltYm9sLT5HZXRDb250ZW50KCkgOiBDRlhfV2lkZVN0cmluZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMGIxM2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmgKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0xPQ0FMRV9IDQorI2RlZmluZSBfRlhGQV9MT0NBTEVfSA0KK2NsYXNzIENYRkFfWE1MTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9YTUxMb2NhbGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSk7DQorICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCk7DQorICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0Ow0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCUdldE1vbnRoTmFtZShGWF9JTlQzMiBuTW9udGgsIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0RGF5TmFtZShGWF9JTlQzMiBuV2VlaywgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCUdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAlHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEID0gVFJVRSkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgdm9pZAlHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCUdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorDQorcHJvdGVjdGVkOg0KKyAgICB+Q1hGQV9YTUxMb2NhbGUoKTsNCisgICAgdm9pZAkJCUdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwgRlhfQlNUUiBic1RhZywgRlhfV1NUUiB3c05hbWUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgICBDRlhfV2lkZVN0cmluZwlHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSIHN5bWJvbCwgaW50IGluZGV4LCBGWF9CT09MIGJBYmJyKSBjb25zdDsNCitwcml2YXRlOg0KKyAgICBDWE1MX0VsZW1lbnQqCW1fcExvY2FsZURhdGE7DQorfTsNCitjbGFzcyBDWEZBX05vZGVMb2NhbGUgOiBwdWJsaWMgSUZYX0xvY2FsZSwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX05vZGVMb2NhbGUoQ1hGQV9Ob2RlKiBwTG9jYWxlKTsNCisgICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKTsNCisgICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXROYW1lKCk7DQorICAgIHZpcnR1YWwgdm9pZAlHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Q7DQorDQorICAgIHZpcnR1YWwgdm9pZAlHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0TW9udGhOYW1lKEZYX0lOVDMyIG5Nb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLCBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAlHZXREYXlOYW1lKEZYX0lOVDMyIG5XZWVrLCBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLCBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAlHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLCBGWF9CT09MIGJBTSA9IFRSVUUpIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdDsNCisgICAgdmlydHVhbCB2b2lkCUdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgRlhfQk9PTCBiQUQgPSBUUlVFKSBjb25zdDsNCisNCisgICAgdmlydHVhbCB2b2lkCUdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgICB2aXJ0dWFsIHZvaWQJR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICAgIHZpcnR1YWwgdm9pZAlHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCitwcm90ZWN0ZWQ6DQorICAgIH5DWEZBX05vZGVMb2NhbGUoKTsNCisgICAgQ1hGQV9Ob2RlKgkJR2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUgKnBQYXJlbnQsIEZYX1dTVFIgd3NOYW1lKSBjb25zdDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJR2V0U3ltYm9sKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9XU1RSIHN5bWJvbF90eXBlKSBjb25zdDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludCBpbmRleCwgRlhfQk9PTCBiQWJicikgY29uc3Q7DQorDQorICAgIENYRkFfTm9kZSoJCW1fcExvY2FsZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NmM5NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuY3BwCkBAIC0wLDAgKzEsOTM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9sb2NhbGUuaCINCitjb25zdCBGWF9CWVRFIGdfZW5VU19Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHg5QiwgMHgzMCwgMHgxNCwgMHg3RCwgMHg5RiwgMHhCNCwgMHg3RiwgMHg0MCwgMHhENiwgMHgyQSwgMHhCNSwgMHg1MiwgMHg1NiwgMHg2RiwNCisgICAgMHg4RiwgMHhBOSwgMHg4OCwgMHhBNSwgMHg2QywgMHgyNCwgMHg5QiwgMHgzQSwgMHhEMSwgMHg1NSwgMHgyMiwgMHg1NSwgMHhCNSwgMHhCRSwgMHg0QywgMHgwRSwgMHhEQywgMHgwNSwgMHgzNCwgMHhCMCwNCisgICAgMHgyMywgMHg4MywgMHgzNywgMHgwNSwgMHhFRCwgMHhFMywgMHg2NywgMHgwNywgMHhDMywgMHhDMCwgMHhGNiwgMHgyNCwgMHhDMiwgMHg0QiwgMHg3QywgMHhDRiwgMHgzRCwgMHhFNywgMHhFNiwgMHhERSwNCisgICAgMHg2MywgMHgzMCwgMHg4NCwgMHgyNSwgMHg0RiwgMHg2OSwgMHgwOSwgMHgwMSwgMHhBMywgMHgxNSwgMHhBQywgMHgxMCwgMHhCMCwgMHhFRiwgMHg0RiwgMHgwOSwgMHgwQSwgMHgzMiwgMHhBOCwgMHhEMywNCisgICAgMHgxNSwgMHhEQSwgMHhCMCwgMHg0MywgMHg1OSwgMHhENCwgMHhGOSwgMHhGNSwgMHhCQSwgMHgwMiwgMHg1MSwgMHhBNCwgMHhGNCwgMHgwNiwgMHg5MSwgMHg1MCwgMHg1MywgMHg1OSwgMHg0NiwgMHg0NSwNCisgICAgMHg3MiwgMHhBQSwgMHhGNiwgMHhCQywgMHhBQywgMHg4RCwgMHhFQSwgMHgyMCwgMHhFMCwgMHhDMCwgMHg0NSwgMHg0MSwgMHg5OSwgMHg2MiwgMHg1NCwgMHg5QywgMHgzNSwgMHhGOSwgMHg4MywgMHg4MiwNCisgICAgMHg2QiwgMHhCMywgMHgyNiwgMHhGNywgMHg5NCwgMHg0OSwgMHgyQSwgMHg0RSwgMHgyMSwgMHhFRSwgMHhDMiwgMHhENywgMHhBRiwgMHgwQywgMHhCRSwgMHg4NSwgMHhCRCwgMHhGMCwgMHgyNiwgMHg2MiwNCisgICAgMHgyQSwgMHhEMiwgMHhEQywgMHg0MSwgMHhENywgMHg0NywgMHg1MSwgMHg5NCwgMHgxRSwgMHhBRSwgMHhBQiwgMHhCRiwgMHg5NywgMHgwQywgMHgzQywgMHg2MCwgMHhFOSwgMHgzMiwgMHhENywgMHhGMiwNCisgICAgMHgyMCwgMHhFQiwgMHhDNiwgMHg4MSwgMHgxMywgMHgzOCwgMHgzNiwgMHg1MCwgMHhFRCwgMHg0MSwgMHgzOCwgMHg5OSwgMHhBRiwgMHg2OSwgMHhDMywgMHg3RCwgMHhGOCwgMHgwMywgMHhGRiwgMHhFNSwNCisgICAgMHgxNywgMHg0NCwgMHg5MCwgMHhEQSwgMHgwOSwgMHgzQywgMHhCMiwgMHhBOCwgMHhFNywgMHg5RCwgMHhBMywgMHg4MCwgMHhFRSwgMHhGNywgMHg2MiwgMHg4NSwgMHhERSwgMHhBMywgMHg5MSwgMHg3MywNCisgICAgMHgzRSwgMHhENywgMHg3QywgMHg4NiwgMHhGOSwgMHhFQywgMHg5QSwgMHg2QiwgMHg5NiwgMHhDRiwgMHgyQiwgMHg5RiwgMHg1NSwgMHgzRSwgMHg5RiwgMHg3QywgMHgwRSwgMHhGOSwgMHhEQywgMHhGMSwNCisgICAgMHgxOSwgMHhGMywgMHg3RiwgMHg0RiwgMHgzMiwgMHg3QSwgMHgzMiwgMHhCNywgMHg5MCwgMHg1QSwgMHg5MSwgMHg0NCwgMHhBQSwgMHg1QiwgMHg0RSwgMHg3NSwgMHhBRSwgMHhENywgMHg1RCwgMHg5MiwNCisgICAgMHhDNCwgMHhEQywgMHg4MSwgMHg3NiwgMHgxMiwgMHg2QSwgMHgxQiwgMHg3QiwgMHg4NiwgMHg4QywgMHhCOSwgMHhFOCwgMHgyRSwgMHg5NywgMHhDMiwgMHgwMSwgMHhCNywgMHhBMiwgMHhCMCwgMHhBMSwNCisgICAgMHg4NCwgMHgzNiwgMHg1MiwgMHg4QywgMHg0MSwgMHgzQywgMHhGNCwgMHgzNSwgMHhFQSwgMHg3MSwgMHhCNCwgMHg2QiwgMHhBNiwgMHg1OSwgMHhCQiwgMHg1MywgMHhCQiwgMHg0RCwgMHhCQiwgMHg0NSwNCisgICAgMHhCQiwgMHgzOSwgMHhCQiwgMHgyRiwgMHhCQiwgMHgyOSwgMHg3RiwgMHgzRiwgMHhGQSwgMHgyMSwgMHhDRCwgMHgwQSwgMHhBOCwgMHhGQSwgMHg2NywgMHhDRiwgMHg4NCwgMHg2NCwgMHgxRCwgMHgyQiwNCisgICAgMHg3NywgMHhGQiwgMHg2MCwgMHhDNCwgMHgyMywgMHg4RiwgMHg1NiwgMHgwMiwgMHg0RiwgMHgyQiwgMHgyOCwgMHgwNCwgMHgwNCwgMHgzNSwgMHhENSwgMHhENCwgMHg4QSwgMHg3QywgMHhGOCwgMHgxOCwNCisgICAgMHg2MiwgMHhGRCwgMHhEQiwgMHgyNSwgMHhDOCwgMHgzQSwgMHgxQSwgMHg0MiwgMHgzQywgMHgxMCwgMHg3NSwgMHg2MCwgMHg5RCwgMHgxMSwgMHg1RCwgMHhFMywgMHgwRCwgMHgzQywgMHhEMiwgMHhBNiwNCisgICAgMHgwMSwgMHhDMSwgMHhDRSwgMHg3QiwgMHgzQSwgMHg0NCwgMHhFNiwgMHgwMCwgMHhGOSwgMHgyMSwgMHhDQiwgMHgxMiwgMHg5MSwgMHg4RCwgMHhCQSwgMHgxNiwgMHg0MSwgMHhBQywgMHhBRSwgMHgyMCwNCisgICAgMHg1QSwgMHgwNCwgMHhERiwgMHhENCwgMHhBNSwgMHgyNywgMHgxQywgMHhCOCwgMHg1NiwgMHgyMSwgMHgyMywgMHgyRCwgMHgzOSwgMHgzQiwgMHgyMCwgMHg3MiwgMHhBMSwgMHhBOCwgMHg4MiwgMHhFQywNCisgICAgMHhBQywgMHhCOSwgMHg0MCwgMHg1MiwgMHhFNywgMHg1QywgMHgzNCwgMHg0QSwgMHg4NCwgMHgyMywgMHhFQywgMHhFMSwgMHhFMywgMHhDOSwgMHg4NCwgMHgwQSwgMHg2OCwgMHg4QSwgMHg2QSwgMHgzNCwNCisgICAgMHhGMSwgMHgyOCwgMHg5QSwgMHg0QywgMHg5QywgMHhERiwgMHhDNSwgMHhGMSwgMHg1RCwgMHg5MiwgMHgwNCwgMHhFQiwgMHhFMCwgMHgyNSwgMHhDNCwgMHgyMywgMHg5MiwgMHg1NSwgMHg2MSwgMHgzMiwNCisgICAgMHhFQSwgMHg2NSwgMHg5QSwgMHhGMywgMHhBNCwgMHg4MywgMHg2NCwgMHg4NiwgMHhDMCwgMHhDQywgMHhBOSwgMHgyNSwgMHgxRSwgMHgzRSwgMHg5RSwgMHhDQywgMHg2NSwgMHg4QywgMHhEQSwgMHgyOSwNCisgICAgMHhBQywgMHhERiwgMHhFQywgMHg0RiwgMHhBNywgMHgzOCwgMHhGQiwgMHhGOSwgMHhCOSwgMHhBQSwgMHg5MywgMHg0RCwgMHhCNCwgMHhGRCwgMHhGRCwgMHg0QywgMHhGMywgMHgyRiwgMHhFRCwgMHg0QiwNCisgICAgMHg2NywgMHhDRSwgMHg5OCwgMHhBNCwgMHg3NCwgMHg0QywgMHhFQSwgMHg1MywgMHhGMSwgMHg5RiwgMHg0MywgMHg5MywgMHhEOCwgMHhCNCwgMHhBMiwgMHgzMCwgMHhGRCwgMHhFMiwgMHg0MSwgMHhBNCwNCisgICAgMHg1RCwgMHhCNCwgMHhFRCwgMHhGMiwgMHhCNiwgMHg2RCwgMHhEQiwgMHgxMCwgMHg0RiwgMHg3OCwgMHg0RSwgMHgyMSwgMHgyMywgMHg0QywgMHhBNSwgMHgxMCwgMHhDMCwgMHhEMiwgMHgxMywgMHgyMiwNCisgICAgMHg2RiwgMHgzQSwgMHhFOSwgMHg3MiwgMHhGOSwgMHhFNywgMHg3QSwgMHg1OCwgMHhERSwgMHhDQywgMHhBQywgMHg3MiwgMHgwNCwgMHg5MSwgMHgwMiwgMHg2QiwgMHhDQywgMHhERiwgMHg1RiwgMHg3OSwNCisgICAgMHg1NCwgMHhEOCwgMHg5QSwgMHg2MiwgMHgyOCwgMHhENCwgMHgwRiwgMHgzQSwgMHgwOSwgMHg0RCwgMHhEOSwgMHgwQywgMHhEMiwgMHhBMiwgMHhBMiwgMHg2QSwgMHhGMywgMHg2RiwgMHg3QiwgMHg3RCwNCisgICAgMHg5NywgMHhCNiwgMHhENSwgMHhDMywgMHhCQiwgMHg5NSwgMHhDQiwgMHg2MywgMHhBMSwgMHgzNywgMHg3RSwgMHgzMSwgMHg4QiwgMHgzRiwgMHg3NCwgMHg3RCwgMHgzNSwgMHg4QiwgMHg1RSwgMHgxNSwNCisgICAgMHg0QywgMHhENiwgMHg4OCwgMHhCQywgMHg5RCwgMHg0NSwgMHg2RSwgMHg0MSwgMHg3MCwgMHg0NCwgMHhERSwgMHhCOSwgMHg1QywgMHgzQywgMHgxRCwgMHg1QiwgMHgyMSwgMHhGRCwgMHgxNiwgMHgwQywNCisgICAgMHg0RSwgMHg0QywgMHg4MSwgMHhGRSwgMHg2NiwgMHgzQiwgMHgwNywgMHg2QSwgMHg5QiwgMHhENCwgMHhBOSwgMHgzMSwgMHhDOSwgMHhCQiwgMHgyNSwgMHg4QywgMHhBMiwgMHhBOCwgMHhCOSwgMHg1RSwNCisgICAgMHgyMCwgMHhGMiwgMHg5NCwgMHg0NCwgMHhCMywgMHg0NSwgMHg2MywgMHhDQiwgMHg1RCwgMHgwOSwgMHhCNiwgMHg3QiwgMHhENSwgMHg1OCwgMHhGNywgMHg1NSwgMHhBNCwgMHg5NiwgMHg3RiwgMHgwMSwNCisgICAgMHg3NSwgMHgzNywgMHgxQiwgMHg4QiwNCit9Ow0KK2NvbnN0IEZYX0JZVEUgZ19lbkdCX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweEQxLCAweDZFLCAweEQzLCAweDMwLCAweDE0LCAweDdELCAweDQ3LCAweEUyLCAweDFGLCAweEEyLCAweDg4LCAweDQ5LCAweDIwLCAweDZELCAweDMzLCAweDNDLA0KKyAgICAweDZFLCAweEVBLCAweDJDLCAweDc1LCAweEVCLCAweEQ2LCAweDMyLCAweEM4LCAweEE4LCAweDQ4LCAweEM1LCAweEM0LCAweDVFLCAweDkwLCAweDlCLCAweDc4LCAweDhELCAweDU5LCAweDYyLCAweDU3LA0KKyAgICAweDRFLCAweENDLCAweDk0LCAweEZDLCAweDAyLCAweDlGLCAweEMwLCAweDIzLCAweENGLCAweDA4LCAweEYxLCAweDAxLCAweEJDLCAweEYwLCAweDJGLCAweDQ4LCAweEZCLCAweDBDLCAweDZFLCAweDFBLA0KKyAgICAweDI3LCAweDRCLCAweDFDLCAweEFGLCAweDY0LCAweDc5LCAweDg5LCAweEVGLCAweEI5LCAweEU3LCAweERDLCAweERFLCAweDdCLCAweDlDLCAweEI4LCAweDE5LCAweEM1LCAweDIyLCAweDIwLCAweDMxLA0KKyAgICAweDc1LCAweDM4LCAweDQ5LCAweEU4LCAweDkxLCAweDRCLCAweEY5LCAweEE3LCAweEU5LCAweEIxLCAweEVCLCAweDg0LCAweDM0LCAweDBELCAweDhFLCAweERDLCAweEJCLCAweEFGLCAweEJGLCAweEVFLA0KKyAgICAweDdFLCAweEZFLCAweDc4LCAweDBFLCAweEI3LCAweEJGLCAweERGLCAweDdFLCAweEJGLCAweDcwLCAweEYxLCAweEE4LCAweDI0LCAweEYyLCAweDkwLCAweDQ4LCAweDNGLCAweDRGLCAweDk2LCAweDIyLA0KKyAgICAweDRFLCAweEI1LCAweDY2LCAweDI1LCAweEU5LCAweDRBLCAweDQ4LCAweDQ2LCAweDM4LCAweDMwLCAweDEyLCAweEMxLCAweEIzLCAweEU4LCAweDAyLCAweEUwLCAweDU0LCAweEFGLCAweEYxLCAweDM5LA0KKyAgICAweEUxLCAweDhBLCAweEM4LCAweDdDLCAweDg0LCAweEFBLCAweEYwLCAweEU5LCAweDEzLCAweDhELCAweDlGLCAweEQxLCAweEE1LCAweEI0LCAweDI2LCAweDNDLCAweDIyLCAweDgzLCAweEE4LCAweDg3LA0KKyAgICAweDhFLCAweEQ3LCAweDkyLCAweEM1LCAweDE2LCAweDZFLCAweDVGLCAweDdGLCAweEFFLCAweDM4LCAweEI1LCAweDgwLCAweDcxLCAweDlGLCAweDM5LCAweDU2LCAweDJCLCAweDk1LCAweDY2LCAweDNELA0KKyAgICAweEQ4LCAweEE3LCAweEVCLCAweDhDLCAweDI2LCAweDRCLCAweDJBLCAweDdCLCAweDk5LCAweDc3LCAweDQxLCAweDI2LCAweDZDLCAweEY4LCAweDg1LCAweEY4LCAweDYyLCAweDE3LCAweDRDLCAweDY4LA0KKyAgICAweDYwLCAweDI2LCAweDUwLCAweENCLCAweEEyLCAweDlBLCAweEI3LCAweDg5LCAweDFDLCAweEIyLCAweDVDLCAweENBLCAweDIzLCAweEY3LCAweDk1LCAweERCLCAweDcyLCAweENFLCAweEU2LCAweDlBLA0KKyAgICAweENELCAweDMwLCAweDlCLCAweDVELCAweDQzLCAweENELCAweEIyLCAweDc5LCAweDY1LCAweEIzLCAweENBLCAweEU2LCAweDkzLCAweENELCAweDIxLCAweDlCLCAweDNCLCAweDM2LCAweDYzLCAweDFFLA0KKyAgICAweEY2LCAweDI0LCAweDI0LCAweEI5LCAweDdFLCAweDg0LCAweDYwLCAweDg1LCAweDdELCAweDA1LCAweDhGLCAweDFDLCAweDc0LCAweDVFLCAweEFFLCAweEFCLCAweDI0LCAweEY2LCAweDQ0LCAweDBGLA0KKyAgICAweDVBLCAweDI4LCAweDlBLCAweDlBLCAweEQ4LCAweDI1LCAweDBELCAweDc5LCAweDFGLCAweDVELCAweDQ0LCAweDRBLCAweEY2LCAweEMwLCAweDMzLCAweEM5LCAweDRDLCAweEM4LCAweDI3LCAweDk5LA0KKyAgICAweDkyLCAweDZELCAweDEwLCAweDM1LCAweDdELCAweEI1LCAweDdBLCAweDZDLCAweEVELCAweDlBLCAweDZFLCAweEQ2LCAweEVDLCAweEQ0LCAweDZDLCAweEQzLCAweDZDLCAweEQxLCAweDZDLCAweENFLA0KKyAgICAweEVDLCAweENCLCAweDZDLCAweENBLCAweERFLCAweDRGLCAweDQyLCAweDYxLCAweDAyLCAweDQ2LCAweDkzLCAweEZBLCAweERELCAweEQzLCAweDIxLCAweDFFLCAweDdCLCAweEUwLCAweDZFLCAweDFELA0KKyAgICAweEI0LCAweDc4LCAweDc4LCAweDZFLCAweDI0LCAweDUwLCAweEI3LCAweDAyLCAweDIwLCAweDU0LCAweDEyLCAweDVELCAweDBELCAweDU2LCAweEY4LCAweEY4LCAweDY0LCAweDg0LCAweENBLCAweDdCLA0KKyAgICAweDk1LCAweEMwLCAweEUzLCAweDQ5LCAweDEzLCAweEEyLCAweDg2LCAweDU4LCAweDA2LCAweEM2LCAweDE5LCAweDUxLCAweDM1LCAweDlFLCAweEQxLCAweDM5LCAweEM5LCAweDMyLCAweDJBLCAweEY5LA0KKyAgICAweDY2LCAweDRGLCAweDlCLCAweDQ4LCAweDFGLCAweDIwLCAweEQ3LCAweDJBLCAweDhFLCAweDVELCAweDdDLCAweDBBLCAweEQ3LCAweEFFLCAweDMzLCAweDcxLCAweDNDLCAweEI4LCAweDlDLCAweDhGLA0KKyAgICAweDcwLCAweDk1LCAweDAzLCAweDM2LCAweDU0LCAweEEzLCAweDhFLCAweDU2LCAweEM2LCAweDgyLCAweEFGLCAweDVDLCAweEZDLCAweDM4LCAweDRELCAweDQyLCAweDQzLCAweDJELCAweDE5LCAweEFBLA0KKyAgICAweDQ4LCAweDIzLCAweDIxLCAweDMzLCAweEQwLCAweDRDLCAweDkwLCAweEU3LCAweDIxLCAweEFCLCAweDA2LCAweDc1LCAweDQ2LCAweDA0LCAweDIwLCAweDYzLCAweDQ5LCAweDZCLCAweEU0LCAweDU2LA0KKyAgICAweEQ0LCAweDE5LCAweDc5LCAweDM2LCAweDNCLCAweEY0LCAweEJDLCAweDQzLCAweERGLCAweDc3LCAweEFFLCAweDQ2LCAweEE4LCAweEM1LCAweDMxLCAweDBBLCAweDc0LCAweDY2LCAweDdELCAweDk0LA0KKyAgICAweDY0LCAweDMzLCAweDZBLCAweEFELCAweDE4LCAweEMwLCAweEQ3LCAweDgzLCAweDZFLCAweDE0LCAweDNELCAweDNBLCAweEVBLCAweENDLCAweEE0LCAweDhELCAweDVBLCAweDAwLCAweDU2LCAweEVGLA0KKyAgICAweEY0LCAweDM0LCAweEY3LCAweEMyLCAweDlCLCAweDU5LCAweDkyLCAweEZBLCAweEE3LCAweDkzLCAweEIzLCAweERCLCAweDRCLCAweDEyLCAweEJELCAweDI5LCAweEFFLCAweDJBLCAweDYzLCAweERBLA0KKyAgICAweDI0LCAweEQwLCAweDcxLCAweDU1LCAweDFFLCAweDg5LCAweEY3LCAweEVFLCAweDc0LCAweDYyLCAweERELCAweDA5LCAweDYwLCAweEYwLCAweDM4LCAweDA2LCAweDJFLCAweDJFLCAweDc2LCAweDhCLA0KKyAgICAweEUyLCAweDYwLCAweEJGLCAweDI4LCAweDhBLCAweDExLCAweEVBLCAweEYwLCAweDdBLCAweDg1LCAweEI0LCAweDMwLCAweDUwLCAweDUyLCAweDUyLCAweDFFLCAweEU0LCAweDJFLCAweDdFLCAweDU2LA0KKyAgICAweDQ5LCAweDBGLCAweDBFLCAweDA2LCAweDJBLCAweEQ3LCAweDU0LCAweDA2LCAweDk0LCAweDY3LCAweEZBLCAweDI3LCAweDc3LCAweDJDLCAweDJBLCAweDY0LCAweDc0LCAweERFLCAweDE0LCAweEFBLA0KKyAgICAweDg3LCAweEVCLCAweDg0LCAweEJBLCAweDZDLCAweDQ4LCAweDAzLCAweDk2LCAweDEwLCAweEQ4LCAweEVDLCAweEZELCAweDVBLCAweDVGLCAweEE1LCAweDRELCAweDc1LCAweEYzLCAweDY3LCAweDJBLA0KKyAgICAweEQ0LCAweDlBLCAweDk1LCAweDNCLCAweEJELCAweDNCLCAweDg4LCAweERGLCAweDc0LCAweEJELCAweDMzLCAweDg4LCAweDlFLCAweDMwLCAweEFFLCAweDUyLCAweDE3LCAweEVGLCAweDBELCAweDIyLA0KKyAgICAweDE3LCAweDU0LCAweDBBLCAweDE3LCAweEJGLCAweEVDLCAweDczLCAweDUxLCAweDc3LCAweDZDLCAweDQwLCAweDZBLCAweERCLCAweDFCLCAweDI3LCAweEJBLCAweDQwLCAweEZELCAweDdDLCAweDZELA0KKyAgICAweDAyLCAweDE3LCAweEZGLCAweEY5LCAweDBFLCAweEU3LCAweDQ0LCAweDg3LCAweEQwLCAweEFGLCAweEExLCAweDI1LCAweDJDLCAweDE1LCAweEU1LCAweEMyLCAweEM1LCAweEQzLCAweEUzLCAweEY5LA0KKyAgICAweDYwLCAweDUxLCAweERCLCAweEYzLCAweEJFLCAweDA0LCAweDk5LCAweENELCAweDk2LCAweEVGLCAweDQyLCAweEJFLCAweEE2LCAweEQ3LCAweDI0LCAweDI4LCAweDBGLCAweEJCLCAweDdBLCAweEE5LA0KKyAgICAweDZCLCAweDc5LCAweDM5LCAweDdDLCAweERBLCAweDg0LCAweENFLCAweDFDLCAweEFDLCAweDQwLCAweDZELCAweDY2LCAweDlELCAweDY2LCAweDlDLCAweDA5LCAweEZFLCAweDYwLCAweEZBLCAweDQ0LA0KKyAgICAweDI4LCAweEM5LCAweEE4LCAweDc0LCAweEZDLCAweDJDLCAweEI0LCAweEU2LCAweEM3LCAweDIxLCAweDdDLCAweDUwLCAweDM4LCAweDczLCAweEY2LCAweDFGLCAweEMyLCAweDBDLCAweDNFLCAweDk2LA0KKyAgICAweEU4LCAweEVELCAweDE2LCAweEMyLCAweDU4LCAweDkyLCAweDI1LCAweEJDLCAweDJFLCAweDBGLCAweDEzLCAweDE2LCAweDExLCAweDYxLCAweEQ2LCAweEY0LCAweDFCLCAweDUxLCAweEE4LCAweDFCLA0KKyAgICAweEUyLCAweDRDLCAweDQ1LCAweDE2LCAweEIxLCAweEEwLCAweDlDLCAweDYzLCAweEVGLCAweEMzLCAweDZCLCAweEM3LCAweERCLCAweDQ2LCAweDg1LCAweDkxLCAweDgzLCAweDQ4LCAweEQ0LCAweEQ0LA0KKyAgICAweEY3LCAweDVCLCAweDdFLCAweDE0LCAweDk4LCAweEFCLCAweDcyLCAweDMyLCAweEU3LCAweEVELCAweDE2LCAweDkyLCAweDJGLCAweDA2LCAweDkwLCAweEJDLCAweDVDLCAweEYxLCAweEQ1LCAweDY3LA0KKyAgICAweEIxLCAweEUxLCAweEU5LCAweEU2LCAweEQwLCAweEZELCAweDlFLCAweDk1LCAweDUxLCAweEY1LCAweDE5LCAweDBCLCAweENCLCAweDdGLCAweDhFLCAweDY5LCAweEFDLCAweEQwDQorfTsNCitjb25zdCBGWF9CWVRFIGdfemhDTl9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHg0MSwgMHg0RiwgMHhENCwgMHg0MCwgMHgxNCwgMHhCRSwgMHg5QiwgMHhGOCwgMHgxRiwgMHg5QSwgMHg0NiwgMHg1MiwgMHg0RCwgMHg1OCwgMHg0NiwgMHg4RiwNCisgICAgMHg5MCwgMHhEMiwgMHg2NCwgMHgwMywgMHgwOCwgMHgwNiwgMHhCQiwgMHgyMSwgMHg5NiwgMHg2OCwgMHhFMCwgMHg2MiwgMHhCQSwgMHhFRCwgMHhCMCwgMHgyRCwgMHg2QywgMHgzQiwgMHg2NCwgMHhCNiwNCisgICAgMHgwRCwgMHg2RSwgMHg0RiwgMHgxOCwgMHg4MiwgMHg4MiwgMHhDMiwgMHg0NSwgMHg4OSwgMHg5QSwgMHg4MCwgMHhFMSwgMHg2NCwgMHgzQywgMHgyOCwgMHg5RSwgMHg4QywgMHgwMSwgMHgyMiwgMHhGMSwNCisgICAgMHhDRiwgMHhCMCwgMHhDQiwgMHg5MSwgMHhCRiwgMHhFMCwgMHg5QiwgMHhFRCwgMHhCNCwgMHhCNCwgMHhERCwgMHhEOSwgMHhCNSwgMHgzRiwgMHhDMCwgMHgzRCwgMHhDRCwgMHhGQiwgMHhERSwgMHhGNywNCisgICAgMHg3RCwgMHhGMywgMHhERSwgMHhFQiwgMHg3NCwgMHhCNiwgMHg2QSwgMHg5MywgMHg1OCwgMHg2NiwgMHgxMywgMHg0QiwgMHhCRSwgMHhFOSwgMHhFMSwgMHg0OSwgMHgzOSwgMHg3MiwgMHg5RSwgMHg0RiwNCisgICAgMHhENSwgMHg2NCwgMHhDOSwgMHhDNiwgMHgyRCwgMHg2QiwgMHg1MiwgMHhCRSwgMHgzQywgMHgzRCwgMHhFOSwgMHg3RSwgMHg3OCwgMHg3RCwgMHhGNywgMHhFQSwgMHhDNywgMHhFNiwgMHhFNSwgMHhDNSwNCisgICAgMHhGQiwgMHhFQiwgMHhERiwgMHg3QiwgMHgxMCwgMHg3NywgMHgwRSwgMHgyRiwgMHhFRSwgMHhDOSwgMHg5QSwgMHhDQSwgMHgxNCwgMHhCRSwgMHg2RCwgMHg1MiwgMHhBMywgMHhFRCwgMHhENSwgMHg0OSwNCisgICAgMHhCMywgMHhDNSwgMHhDNSwgMHgwRCwgMHg4QSwgMHgxQiwgMHg4NCwgMHhCQSwgMHhBNiwgMHgwRiwgMHgwQywgMHg4RiwgMHhGOCwgMHg4MSwgMHg1MywgMHgwMywgMHhCOCwgMHhDNSwgMHhENywgMHhEQSwNCisgICAgMHhFNSwgMHhFOSwgMHg2NiwgMHhGNywgMHg2OCwgMHg0NywgMHg0NSwgMHg3MSwgMHg3NCwgMHhGQiwgMHg1NiwgMHgwMiwgMHg5RiwgMHhFRiwgMHgwOSwgMHhFMSwgMHhEMywgMHg1RCwgMHgxMSwgMHhEQywNCisgICAgMHgzOSwgMHgzQywgMHgxNCwgMHg5QiwgMHgxQywgMHgwOCwgMHhEOSwgMHhEQiwgMHgyNywgMHg2MiwgMHhFRiwgMHgyRCwgMHgzMSwgMHhGQiwgMHg5QiwgMHg5MCwgMHg3RCwgMHhGNiwgMHg1OSwgMHhDOCwNCisgICAgMHhERSwgMHg3RiwgMHgzOSwgMHgwMCwgMHgxRSwgMHhEMCwgMHgyOCwgMHhDQiwgMHgxNCwgMHg3QiwgMHg0NSwgMHg5OSwgMHgzMSwgMHgyNSwgMHhDNCwgMHg1RSwgMHgyNCwgMHg5OSwgMHhGNSwgMHgzQSwNCisgICAgMHg5RCwgMHg5NCwgMHgxRiwgMHhDOCwgMHhGRiwgMHhBNywgMHg1NywgMHg3QSwgMHg3QSwgMHhCNiwgMHhEOSwgMHhFNiwgMHgwNywgMHgwRSwgMHg1NiwgMHg1QSwgMHhGNywgMHhEMywgMHg3MSwgMHhGNywNCisgICAgMHhFOCwgMHhCOCwgMHhGQiwgMHhGMSwgMHg4QiwgMHg4QSwgMHg1OCwgMHgxOCwgMHhFNywgMHgzOSwgMHgwQSwgMHg3QiwgMHg4OCwgMHhEMCwgMHhGMywgMHgzRCwgMHgyMSwgMHg3NywgMHg1NywgMHg4MCwNCisgICAgMHhDMiwgMHgyNCwgMHg4NSwgMHgwRSwgMHgwNywgMHgyMiwgMHhFRSwgMHhGNiwgMHg0OSwgMHg4QSwgMHhBMiwgMHhCNCwgMHhDOCwgMHg0QywgMHhDMSwgMHg5OSwgMHg4NywgMHhERCwgMHg1MywgMHgxNSwNCisgICAgMHg2QSwgMHgyRSwgMHg1NiwgMHg1QiwgMHhBQywgMHhCMywgMHg1OCwgMHg2MSwgMHhCMSwgMHhCNiwgMHg2MiwgMHg1NSwgMHgwMywgMHhFQiwgMHhGMSwgMHgzMCwgMHg3NSwgMHg2RCwgMHgxNywgMHg3QiwNCisgICAgMHhDOSwgMHg2QiwgMHhDQiwgMHg0MywgMHhEOCwgMHhFMCwgMHg0RCwgMHg2NywgMHg5RiwgMHgwRCwgMHgzRSwgMHgwMSwgMHgzMiwgMHg1QywgMHg0OCwgMHhCRSwgMHhFRCwgMHg0QiwgMHhBMiwgMHhCQywNCisgICAgMHgxMywgMHgyMCwgMHg5OCwgMHg5QSwgMHhEQywgMHgxNSwgMHg1NiwgMHg1MCwgMHhDMSwgMHhGNywgMHhDRSwgMHhGNiwgMHg1NiwgMHg2NywgMHg3NywgMHg1RiwgMHg0NSwgMHgyQywgMHg4QywgMHhGMywNCisgICAgMHgxQywgMHg0RCwgMHgyMSwgMHg5NCwgMHg2QSwgMHg1OCwgMHg1MCwgMHhCOCwgMHg3MSwgMHhFMiwgMHg1RSwgMHgwMiwgMHhCQywgMHg2MCwgMHgwNiwgMHgwMSwgMHhBNiwgMHg3RSwgMHhFRiwgMHg5OSwNCisgICAgMHhBNywgMHgxMSwgMHhCRiwgMHg4RSwgMHg1NiwgMHhDMiwgMHg2NiwgMHg1MywgMHhENiwgMHg5NiwgMHhFMCwgMHhBNywgMHg3NCwgMHhDRSwgMHg3RSwgMHgyQSwgMHhCQSwgMHgwMiwgMHhBNywgMHg0NywNCisgICAgMHg5OSwgMHg1NiwgMHg2MCwgMHhCQywgMHhDQSwgMHgwQywgMHhGQywgMHg1OCwgMHhFRiwgMHhBOSwgMHhBNCwgMHhFMCwgMHhDNywgMHgxRCwgMHg5QSwgMHhDNCwgMHg2RiwgMHgwQywgMHg3MCwgMHgyOCwNCisgICAgMHhBMSwgMHhGNiwgMHhCMCwgMHgxRCwgMHg4QiwgMHgyQiwgMHg3QSwgMHg2NSwgMHhCQSwgMHgwNCwgMHhCRiwgMHhFNSwgMHgxMCwgMHgxQSwgMHgzMCwgMHg4NSwgMHg5MCwgMHg4RiwgMHg3MiwgMHhFRCwNCisgICAgMHgwMiwgMHgxMCwgMHhCOCwgMHg1RSwgMHhBNiwgMHhGRCwgMHg0QywgMHg5NCwgMHg2QiwgMHhCRiwgMHhFQSwgMHgzOCwgMHg1MCwgMHhFRiwgMHgyRiwgMHg0NSwgMHhENywgMHg5NSwgMHhDRSwgMHhDRSwNCisgICAgMHgyQiwgMHhDNSwgMHgzMCwgMHg5NCwgMHhBQiwgMHhBRiwgMHhFRiwgMHgxNCwgMHg2OSwgMHg1OSwgMHg0NSwgMHgxOSwgMHg0NSwgMHhDMSwgMHgyRSwgMHhENywgMHhCRCwgMHhEOCwgMHhBMCwgMHg4NCwNCisgICAgMHhCQywgMHhENywgMHgzRSwgMHhBOCwgMHgyNywgMHg3NCwgMHg3RCwgMHhDMiwgMHgzMCwgMHg0QSwgMHgwOCwgMHg3OCwgMHhGRiwgMHg1NSwgMHhBNiwgMHhFOCwgMHhBMywgMHhBMywgMHg1QywgMHhCQiwNCisgICAgMHg3QywgMHg3RSwgMHg4QiwgMHg4MCwgMHgyNSwgMHgwNywgMHg2MiwgMHhENiwgMHhGNCwgMHg1NywgMHhENywgMHhFNiwgMHhCQywgMHg5NiwgMHgzMSwgMHgzMywgMHhGRCwgMHg3MCwgMHhFMywgMHhEOSwNCisgICAgMHgwQiwgMHg2NywgMHgzRSwgMHg1QSwgMHg4RSwgMHg2NywgMHg5NiwgMHgyNSwgMHg4MSwgMHhDRSwgMHgwRiwgMHhCRCwgMHgzQSwgMHhBNiwgMHgzNywgMHg4MywgMHhDQiwgMHhDNSwgMHhCQywgMHgxMiwNCisgICAgMHhDMCwgMHhFMCwgMHgwMCwgMHg1QiwgMHhCMiwgMHgxNiwgMHg4RCwgMHg0NiwgMHhEMSwgMHhGOCwgMHg1OCwgMHgxNCwgMHg0NSwgMHgyQSwgMHhDQSwgMHhGMSwgMHhGQSwgMHg4QywgMHhCOCwgMHhEMCwNCisgICAgMHgwQSwgMHgyOSwgMHhDNSwgMHhCRSwgMHhENSwgMHg5NiwgMHhCNSwgMHgzQiwgMHhCMSwgMHg3NCwgMHg3QywgMHhCQywgMHhBNCwgMHg3MiwgMHgxRCwgMHg1MywgMHgwQiwgMHhGQiwgMHgwMSwgMHhERiwNCisgICAgMHg3MiwgMHg0NCwgMHhBMCwgMHg0MiwgMHg4NSwgMHhDQSwgMHg1MywgMHhBMywgMHhBNCwgMHhCOSwgMHg1QywgMHhDOCwgMHg2RCwgMHg2RCwgMHg2QywgMHhCOSwgMHg5RSwgMHgwOSwgMHhFNywgMHg2MCwNCisgICAgMHgyQywgMHhEMSwgMHhDNywgMHhFOSwgMHhBMiwgMHgzQSwgMHhGRCwgMHgwNywgMHgyNywgMHhFMSwgMHhCQSwgMHhDQiwgMHgxRSwgMHhGQiwgMHg2OCwgMHgyOSwgMHg3RSwgMHg1QSwgMHhGNSwgMHg0OCwNCisgICAgMHgyOSwgMHhCQSwgMHhFNywgMHhGQSwgMHg2MSwgMHg0QiwgMHhENiwgMHgyQSwgMHhBNSwgMHhDOCwgMHgxMSwgMHhBNiwgMHg0NCwgMHhENiwgMHhFRSwgMHhGNywgMHg3MywgMHg1MSwgMHhCRSwgMHg2RCwNCisgICAgMHg0MCwgMHg5MiwgMHhCMSwgMHhBNywgMHg5MywgMHhDOCwgMHgwMywgMHhDOSwgMHhGOSwgMHhFQSwgMHgwNSwgMHhCMiwgMHg3NiwgMHhGRCwgMHgwNywgMHhFRSwgMHhENywgMHgzQywgMHhBMywgMHhERiwNCisgICAgMHg4NCwgMHg2QiwgMHhEQywgMHgxNiwgMHg2MSwgMHgwQiwgMHg1OSwgMHg5QiwgMHhBQSwgMHgyRCwgMHg5NSwgMHgxNiwgMHg2NSwgMHg4NywgMHhERSwgMHgyRiwgMHg0MSwgMHhDNSwgMHg2QSwgMHhEOSwNCisgICAgMHhDQiwgMHhEMCwgMHg1RSwgMHhDNywgMHgyQiwgMHhBNiwgMHhDNSwgMHhFRSwgMHhDNywgMHg2NCwgMHhDOSwgMHhCRCwgMHhBQSwgMHgzNiwgMHhBOSwgMHg2MywgMHhDOSwgMHg4MCwgMHg1NywgMHg1MSwNCisgICAgMHgzMiwgMHgwMiwgMHg1QiwgMHg3QSwgMHgyQywgMHhBMywgMHgyQywgMHg5RiwgMHg5MywgMHhGNCwgMHgzNiwgMHg3QywgMHg3NSwgMHhEOSwgMHhEMiwgMHgwMiwgMHgwQywgMHg0QywgMHg5OCwgMHg3NiwNCisgICAgMHg3RCwgMHg5NywgMHhGOCwgMHgwMywgMHhEMywgMHg1MywgMHgyNCwgMHhBNCwgMHgyRSwgMHhBNiwgMHhDQywgMHg1RiwgMHg5OCwgMHg4RiwgMHg0QiwgMHg1OCwgMHg3MCwgMHhGRiwgMHg0MSwgMHg5OCwNCisgICAgMHhDMywgMHg3NSwgMHg4QSwgMHgzNywgMHg4NiwgMHgxMCwgMHhBQSwgMHhENCwgMHhBQywgMHhDMywgMHg0QiwgMHgzNSwgMHg5OCwgMHhCMCwgMHhFOCwgMHg5OCwgMHhBRSwgMHgzMCwgMHgzRCwgMHg0RiwNCisgICAgMHhBMiwgMHg3MCwgMHhDRCwgMHg5NCwgMHg2NiwgMHg0OSwgMHhFMCwgMHhCOCwgMHgxNiwgMHhFQiwgMHhBMywgMHhGMiwgMHhGNCwgMHg5MSwgMHhBNCwgMHgwRiwgMHhBMywgMHg0MiwgMHhDQiwgMHg5NiwNCisgICAgMHg0MywgMHgxMiwgMHhFQSwgMHg5MywgMHgyMSwgMHg5QiwgMHgwMiwgMHg3MywgMHhEOCwgMHg2OCwgMHgzOSwgMHhBOSwgMHgxRCwgMHhGQSwgMHg4RCwgMHg1NSwgMHhEMiwgMHhFMywgMHhGMSwgMHg3RCwNCisgICAgMHhEMSwgMHhDRCwgMHgzMywgMHg2MywgMHg1MSwgMHhGQywgMHgxNSwgMHgwRCwgMHhDQiwgMHhCRiwgMHhDMCwgMHhFNCwgMHgzRCwgMHg0MA0KK307DQorY29uc3QgRlhfQllURSBnX3poVFdfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTcsIDB4Q0QsIDB4NEYsIDB4RDQsIDB4NDAsIDB4MTQsIDB4M0YsIDB4NjMsIDB4RTIsIDB4RkYsIDB4MzAsIDB4NjksIDB4MjAsIDB4RDUsIDB4MDQsIDB4QTgsIDB4MUUsDQorICAgIDB4MjEsIDB4QTUsIDB4QzksIDB4QzYsIDB4NDUsIDB4MzAsIDB4NTgsIDB4NDIsIDB4RUMsIDB4NDYsIDB4MjIsIDB4MTcsIDB4MzMsIDB4REIsIDB4MEUsIDB4REIsIDB4QzIsIDB4QjYsIDB4NDMsIDB4NjYsDQorICAgIDB4REIsIDB4QzAsIDB4RjYsIDB4MjQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4NjIsIDB4QTIsIDB4QzQsIDB4OEYsIDB4ODAsIDB4RTEsIDB4NjQsIDB4M0MsIDB4MjgsIDB4ODksIDB4MDcsIDB4MEYsIDB4MkMsDQorICAgIDB4NTEsIDB4RkYsIDB4MUEsIDB4NzYsIDB4MzksIDB4RkEsIDB4MkYsIDB4MzgsIDB4RDMsIDB4MkYsIDB4RkEsIDB4QjEsIDB4QjMsIDB4RDQsIDB4QzQsIDB4QTMsIDB4N0IsIDB4OUEsIDB4RjcsIDB4REUsDQorICAgIDB4RUYsIDB4RjcsIDB4RTYsIDB4QkQsIDB4REYsIDB4QkMsIDB4N0QsIDB4RDksIDB4OTUsIDB4OUIsIDB4NTgsIDB4ODcsIDB4NEQsIDB4MDQsIDB4MUMsIDB4NjgsIDB4QTMsIDB4MjksIDB4QzEsIDB4MzcsDQorICAgIDB4MUYsIDB4RDcsIDB4MTYsIDB4MDUsIDB4NjAsIDB4QTAsIDB4OTYsIDB4M0UsIDB4MjUsIDB4OUMsIDB4OUYsIDB4OUUsIDB4RjQsIDB4REUsIDB4M0UsIDB4QkYsIDB4NzEsIDB4RDEsIDB4RDksIDB4M0MsDQorICAgIDB4RkYsIDB4RjksIDB4RTYsIDB4RjcsIDB4OEYsIDB4QkQsIDB4RUUsIDB4QUIsIDB4NkYsIDB4QkQsIDB4Q0UsIDB4QUYsIDB4OUIsIDB4ODIsIDB4NzIsIDB4RkQsIDB4MUEsIDB4MDAsIDB4MzIsIDB4NjMsDQorICAgIDB4MzksIDB4MDYsIDB4MjQsIDB4NUEsIDB4REIsIDB4QUUsIDB4RTMsIDB4NjYsIDB4MkIsIDB4NEEsIDB4RDAsIDB4MjAsIDB4QTgsIDB4ODEsIDB4ODksIDB4MDUsIDB4MUQsIDB4ODYsIDB4MUEsIDB4MDIsDQorICAgIDB4QjIsIDB4OEQsIDB4MUQsIDB4RDcsIDB4OUMsIDB4QTcsIDB4QTEsIDB4MTYsIDB4QjMsIDB4ODcsIDB4NDIsIDB4NUIsIDB4MzksIDB4M0YsIDB4N0QsIDB4RDIsIDB4M0IsIDB4REEsIDB4OTEsIDB4QTUsDQorICAgIDB4RDAsIDB4NEEsIDB4MDcsIDB4Q0UsIDB4RjYsIDB4MzgsIDB4ODEsIDB4RDMsIDB4REQsIDB4RkUsIDB4ODEsIDB4RUUsIDB4RTEsIDB4MjEsIDB4MkYsIDB4RDUsIDB4MDEsIDB4ODcsIDB4QjEsIDB4N0QsDQorICAgIDB4QzIsIDB4QkIsIDB4NjMsIDB4OEIsIDB4QzcsIDB4RjgsIDB4QzIsIDB4NjEsIDB4NzQsIDB4M0UsIDB4NzIsIDB4MTgsIDB4RkIsIDB4OUIsIDB4REMsIDB4MDAsIDB4QjcsIDB4NzksIDB4MTYsIDB4Q0IsDQorICAgIDB4RjcsIDB4MEYsIDB4QTIsIDB4NzMsIDB4MjIsIDB4NjEsIDB4NUEsIDB4NTIsIDB4MDAsIDB4RUIsIDB4NzUsIDB4MzIsIDB4MjUsIDB4REMsIDB4MTYsIDB4RkUsIDB4NkIsIDB4RkIsIDB4OEYsIDB4QjQsDQorICAgIDB4MzUsIDB4NjAsIDB4M0IsIDB4MzUsIDB4QUMsIDB4RDQsIDB4NTIsIDB4N0EsIDB4RUYsIDB4OEYsIDB4N0IsIDB4NDcsIDB4QzcsIDB4QkQsIDB4NzcsIDB4OUYsIDB4NjQsIDB4ODksIDB4OTksIDB4MzksDQorICAgIDB4M0YsIDB4QkQsIDB4QUYsIDB4QkYsIDB4RkYsIDB4NkMsIDB4OEYsIDB4ODMsIDB4REYsIDB4RUQsIDB4RUIsIDB4QTcsIDB4NEEsIDB4NzMsIDB4RjIsIDB4MUMsIDB4RjQsIDB4QzcsIDB4NkYsIDB4OUYsDQorICAgIDB4MjQsIDB4N0UsIDB4MTAsIDB4OUMsIDB4RkEsIDB4MzQsIDB4OTEsIDB4MUIsIDB4OEYsIDB4ODAsIDB4NUQsIDB4RTgsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsDQorICAgIDB4N0EsIDB4OEIsIDB4OTUsIDB4MEUsIDB4QUMsIDB4RDEsIDB4NDYsIDB4QzQsIDB4MzIsIDB4MkMsIDB4NjQsIDB4QTcsIDB4NTcsIDB4NDMsIDB4RTQsIDB4QTIsIDB4RDcsIDB4QkQsIDB4RTgsIDB4RUUsDQorICAgIDB4QjMsIDB4ODcsIDB4OEEsIDB4MUQsIDB4RjksIDB4RjAsIDB4Q0IsIDB4NDIsIDB4MTgsIDB4NUMsIDB4OUEsIDB4QTksIDB4NEIsIDB4MTAsIDB4ODEsIDB4QTksIDB4RkMsIDB4RDQsIDB4QTIsIDB4MzUsDQorICAgIDB4N0QsIDB4RUQsIDB4NkUsIDB4NkYsIDB4NzUsIDB4NzcsIDB4RjcsIDB4NjUsIDB4ODksIDB4OTksIDB4MzksIDB4N0YsIDB4RTIsIDB4MDQsIDB4QzEsIDB4MjksIDB4RTYsIDB4RDIsIDB4NjUsIDB4MjcsDQorICAgIDB4RTUsIDB4QjYsIDB4NUQsIDB4RTgsIDB4MzUsIDB4QTAsIDB4OEIsIDB4MTYsIDB4QTAsIDB4RUIsIDB4MjIsIDB4RTIsIDB4MjQsIDB4RDIsIDB4MjcsIDB4OUUsIDB4NjgsIDB4MjEsIDB4MkUsIDB4N0IsDQorICAgIDB4Q0QsIDB4QTYsIDB4QTAsIDB4M0MsIDB4QTIsIDB4MUYsIDB4QjEsIDB4REIsIDB4RjksIDB4MkUsIDB4QUEsIDB4MjIsIDB4OUQsIDB4NDEsIDB4QjEsIDB4MkEsIDB4RDIsIDB4ODcsIDB4MTAsIDB4QTcsDQorICAgIDB4RTksIDB4ODcsIDB4RTksIDB4OTIsIDB4NTAsIDB4NzgsIDB4MzksIDB4OUEsIDB4RDgsIDB4NjksIDB4NzAsIDB4NzIsIDB4OTQsIDB4RTIsIDB4REIsIDB4QzgsIDB4MDgsIDB4RTksIDB4OTIsIDB4MkEsDQorICAgIDB4NTUsIDB4NEIsIDB4MzEsIDB4NUEsIDB4MjYsIDB4MjYsIDB4MkUsIDB4OUYsIDB4MDMsIDB4NDAsIDB4QzYsIDB4MTMsIDB4QzksIDB4RTEsIDB4NUEsIDB4NzYsIDB4NEUsIDB4OEUsIDB4OTQsIDB4MjcsDQorICAgIDB4MjMsIDB4NDcsIDB4QzUsIDB4MzQsIDB4QzUsIDB4REUsIDB4ODcsIDB4QTcsIDB4QTIsIDB4QUEsIDB4OEEsIDB4REQsIDB4OUQsIDB4NjcsIDB4QTIsIDB4QTYsIDB4ODksIDB4MTcsIDB4OUYsIDB4NUYsDQorICAgIDB4OEIsIDB4NjAsIDB4NDksIDB4OTYsIDB4NTIsIDB4MEMsIDB4NUUsIDB4OEEsIDB4NTAsIDB4OEQsIDB4RkUsIDB4MjksIDB4NEEsIDB4MjUsIDB4MDgsIDB4RTQsIDB4QTgsIDB4MDAsIDB4NzMsIDB4NTIsDQorICAgIDB4NTUsIDB4MjcsIDB4MzUsIDB4QUQsIDB4MTQsIDB4MjUsIDB4RDIsIDB4MjMsIDB4MjQsIDB4RTUsIDB4MTksIDB4NEMsIDB4OEQsIDB4NUMsIDB4RUYsIDB4RDEsIDB4NzAsIDB4RDQsIDB4QTgsIDB4MzcsDQorICAgIDB4OUUsIDB4OTgsIDB4MTksIDB4RTgsIDB4QUMsIDB4QUMsIDB4Q0UsIDB4REEsIDB4MkQsIDB4NkQsIDB4QkEsIDB4N0EsIDB4NzcsIDB4N0QsIDB4NzEsIDB4QzMsIDB4OUMsIDB4RjMsIDB4OTcsIDB4NDIsDQorICAgIDB4MTEsIDB4RDMsIDB4QTAsIDB4ODAsIDB4RTksIDB4NzgsIDB4NzYsIDB4MUQsIDB4OTEsIDB4QUMsIDB4OTIsIDB4MTksIDB4NUYsIDB4NTQsIDB4MTQsIDB4RjUsIDB4RDEsIDB4OTksIDB4RDcsIDB4MDUsDQorICAgIDB4QzUsIDB4MUYsIDB4RjUsIDB4RkQsIDB4ODksIDB4NzEsIDB4REYsIDB4RjcsIDB4NjUsIDB4MjksIDB4ODMsIDB4RTMsIDB4NTMsIDB4NzUsIDB4OEYsIDB4MTAsIDB4RTQsIDB4RTgsIDB4NkQsIDB4NDEsDQorICAgIDB4MTksIDB4MEUsIDB4QzksIDB4MTMsIDB4MTMsIDB4QTUsIDB4QjksIDB4NkIsIDB4ODgsIDB4RTgsIDB4QzgsIDB4NzEsIDB4QTMsIDB4NkIsIDB4NDcsIDB4OEEsIDB4M0MsIDB4QTYsIDB4NDcsIDB4QTEsDQorICAgIDB4ODcsIDB4QTQsIDB4QUYsIDB4Q0IsIDB4NTYsIDB4ODcsIDB4QjIsIDB4QUUsIDB4MjgsIDB4QkQsIDB4ODEsIDB4NzQsIDB4Q0IsIDB4ODYsIDB4NzQsIDB4NDgsIDB4QzYsIDB4RTMsIDB4MkMsIDB4NjEsDQorICAgIDB4OTgsIDB4NEIsIDB4NjgsIDB4MTAsIDB4RUMsIDB4QUQsIDB4NTksIDB4NkMsIDB4MjYsIDB4NDYsIDB4NEIsIDB4MzIsIDB4OTIsIDB4MEUsIDB4NDYsIDB4NEEsIDB4MTIsIDB4NkMsIDB4Q0IsIDB4RjEsDQorICAgIDB4NUEsIDB4ODIsIDB4MzIsIDB4NTYsIDB4MTIsIDB4RUUsIDB4MjMsIDB4ODIsIDB4MDUsIDB4RTUsIDB4NTYsIDB4MDEsIDB4N0QsIDB4MjksIDB4NEMsIDB4RTYsIDB4QkQsIDB4RTMsIDB4QzcsIDB4QzgsDQorICAgIDB4MjgsIDB4OTMsIDB4NzUsIDB4QzYsIDB4NjMsIDB4MTgsIDB4MTgsIDB4ODIsIDB4MzIsIDB4NUYsIDB4MUIsIDB4QTYsIDB4MkIsIDB4MjksIDB4ODMsIDB4MTgsIDB4QzAsIDB4QjIsIDB4NUEsIDB4OTgsDQorICAgIDB4MUQsIDB4MDQsIDB4QTUsIDB4QjYsIDB4NTgsIDB4RkQsIDB4MEIsIDB4NUEsIDB4RkEsIDB4MjEsIDB4MEEsIDB4QTQsIDB4NjAsIDB4MjcsIDB4MTYsIDB4RUEsIDB4NjYsIDB4NEIsIDB4QTAsIDB4QkQsDQorICAgIDB4ODYsIDB4OTYsIDB4QTEsIDB4MUUsIDB4QUYsIDB4RTAsIDB4RDgsIDB4OEMsIDB4NzIsIDB4NTYsIDB4MEMsIDB4NUMsIDB4NDcsIDB4NDAsIDB4QTUsIDB4QUYsIDB4MDUsIDB4MzQsIDB4RDcsIDB4MDAsDQorICAgIDB4RjcsIDB4MDUsIDB4QTksIDB4MkYsIDB4NEMsIDB4NkQsIDB4RDMsIDB4OUYsIDB4OTAsIDB4MDYsIDB4NTgsIDB4QTAsIDB4MzIsIDB4NzIsIDB4MDAsIDB4OTYsIDB4NjMsIDB4NjEsIDB4NjcsIDB4MDAsDQorICAgIDB4RTAsIDB4MEUsIDB4RjYsIDB4ODgsIDB4ODUsIDB4MDgsIDB4QkIsIDB4ODUsIDB4ODMsIDB4MDgsIDB4NEIsIDB4NTksIDB4QjAsIDB4QUUsIDB4ODQsIDB4Q0MsIDB4QTIsIDB4M0EsIDB4NDEsIDB4RUIsDQorICAgIDB4MDMsIDB4MjEsIDB4MTUsIDB4MDIsIDB4RUIsIDB4RjQsIDB4OEIsIDB4MzgsIDB4MDgsIDB4NTIsIDB4MzMsIDB4QTEsIDB4QzUsIDB4MDEsIDB4Q0MsIDB4NjEsIDB4REYsIDB4NUIsIDB4ODUsIDB4NjAsDQorICAgIDB4MDYsIDB4QkIsIDB4QTYsIDB4QTUsIDB4QjMsIDB4OUUsIDB4QzYsIDB4MUUsIDB4REUsIDB4MDMsIDB4RUEsIDB4NjAsIDB4MzAsIDB4MTUsIDB4NDAsIDB4MzcsIDB4NzEsIDB4MEMsIDB4N0UsIDB4MzAsDQorICAgIDB4RjAsIDB4NkEsIDB4MEQsIDB4NUYsIDB4MjEsIDB4NzcsIDB4RjQsIDB4MkEsIDB4NkQsIDB4Q0YsIDB4NjksIDB4QUMsIDB4RTAsIDB4MDAsIDB4MTksIDB4REUsIDB4MUUsIDB4MkMsIDB4QjYsIDB4RDQsDQorICAgIDB4N0IsIDB4Q0EsIDB4NTIsIDB4RjgsIDB4NjcsIDB4NDEsIDB4RjksIDB4MDMsIDB4MTEsIDB4QzIsIDB4NEEsIDB4QzkNCit9Ow0KK2NvbnN0IEZYX0JZVEUgZ196aEhLX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweEE1LCAweDU3LCAweDRELCAweDRGLCAweDEzLCAweDQxLCAweDE4LCAweDNFLCAweDYzLCAweEUyLCAweDdGLCAweDk4LCAweDZDLCAweDIwLCAweDBCLCAweDA5LCAweDUwLCAweDhBLA0KKyAgICAweDlGLCAweDI1LCAweENCLCAweDI2LCAweDQ0LCAweDkwLCAweDlBLCAweDVBLCAweDQzLCAweDJDLCAweEQxLCAweEM4LCAweEM1LCAweDZDLCAweDc3LCAweDg3LCAweEVFLCAweDQyLCAweDc3LCAweDg3LA0KKyAgICAweDRDLCAweEI3LCAweEMxLCAweDZFLCAweDNDLCAweDg4LCAweDA0LCAweEE1LCAweDVBLCAweDJFLCAweDRBLCAweDU0LCAweDAyLCAweDg2LCAweDc4LCAweDUwLCAweDBGLCAweDQ4LCAweEJDLCAweDc4LA0KKyAgICAweDY4LCAweDg5LCAweEM2LCAweDNGLCAweDQzLCAweDhCLCAweDlFLCAweEZDLCAweDBCLCAweENFLCAweEVDLCAweDE3LCAweEZCLCAweDM1LCAweDZELCAweDhELCAweDNELCAweENELCAweEZCLCAweEJDLA0KKyAgICAweENGLCAweEYzLCAweENFLCAweEZCLCAweDNFLCAweDMzLCAweDNCLCAweDAxLCAweEExLCAweDhDLCAweDY0LCAweEE5LCAweDBDLCAweDgxLCAweDIxLCAweEU5LCAweDcwLCAweDlBLCAweEIzLCAweEQ0LA0KKyAgICAweDg3LCAweEQ5LCAweDFDLCAweDA3LCAweDE0LCAweDU4LCAweDkxLCAweEE3LCAweEI5LCAweEQzLCAweEU2LCAweDcxLCAweEU3LCAweENELCAweEYzLCAweEUxLCAweEIzLCAweEQ2LCAweEM2LCAweEU5LA0KKyAgICAweDhGLCAweEQ3LCAweDdGLCAweEJFLCAweDM3LCAweDdFLCAweDdGLCAweERBLCAweEVCLCAweDM0LCAweEJGLCAweDlFLCAweEQ1LCAweDVCLCAweEVELCAweEVELCAweEEzLCAweDVGLCAweDFGLCAweDFBLA0KKyAgICAweDlELCAweERELCAweDlGLCAweEVELCAweEM2LCAweEM5LCAweDA4LCAweDI3LCAweDVFLCAweEJDLCAweDAwLCAweDgwLCAweDQwLCAweDhCLCAweDE4LCAweDhBLCAweDg0LCAweDBCLCAweDM1LCAweEJELA0KKyAgICAweDg4LCAweENBLCAweDE1LCAweEI3LCAweDVFLCAweDA5LCAweEMzLCAweDEyLCAweEMyLCAweDlBLCAweDY0LCAweDUwLCAweEQ2LCAweDAwLCAweDEwLCAweDc0LCAweDY0LCAweDk4LCAweEVBLCAweDFELA0KKyAgICAweDkyLCAweEFBLCAweEQwLCAweDc4LCAweEMwLCAweDg5LCAweEM1LCAweEQzLCAweEU2LCAweDkzLCAweENFLCAweEMxLCAweEI2LCAweDkwLCAweDcyLCAweEEyLCAweDYwLCAweEUyLCAweEE0LCAweEMxLA0KKyAgICAweDQ4LCAweDM0LCAweEVCLCAweEM5LCAweDg5LCAweEY2LCAweEZFLCAweDNFLCAweEFCLCAweEQ0LCAweDJFLCAweDQzLCAweEIxLCAweDc1LCAweENDLCAweERBLCAweDYzLCAweDkzLCAweEE1LCAweDM4LA0KKyAgICAweDYyLCAweDI4LCAweDVBLCAweEVGLCAweDE5LCAweDhBLCAweDlELCAweDBELCAweDY2LCAweDgyLCAweDM5LCAweDNDLCAweENELCAweDQ1LCAweEU3LCAweDA3LCAweEVFLCAweERBLCAweEI3LCAweDMwLA0KKyAgICAweDY4LCAweDI5LCAweDkwLCAweDhBLCAweDQ1LCAweDNDLCAweENELCAweEE1LCAweEI5LCAweDYwLCAweDk1LCAweDc0LCAweDcyLCAweEYxLCAweEM5LCAweDY0LCAweEY4LCAweDUyLCAweDMyLCAweDdDLA0KKyAgICAweDM5LCAweDE5LCAweEJFLCAweDkyLCAweDBDLCAweDVGLCAweDRELCAweDg2LCAweEFGLCAweDI1LCAweEMzLCAweEQ3LCAweDkzLCAweEUxLCAweDRDLCAweDMyLCAweDlDLCAweDlFLCAweDYwLCAweEUwLA0KKyAgICAweDhDLCAweDM5LCAweEQzLCAweDkzLCAweDNELCAweDBELCAweDU0LCAweEE0LCAweDVBLCAweEUwLCAweDQ2LCAweDkyLCAweDQ4LCAweEVDLCAweEJDLCAweDNCLCAweEVDLCAweDFDLCAweDFDLCAweDc2LA0KKyAgICAweERFLCAweDdFLCAweDE0LCAweDUyLCAweDM0LCAweDhDLCAweEUwLCAweEU0LCAweEMwLCAweDkyLCAweEYxLCAweDkzLCAweDA2LCAweDgzLCAweDVGLCAweDRGLCAweEM0LCAweEM5LCAweDU1LCAweDY1LA0KKyAgICAweEQ0LCAweEQ5LCAweDRELCAweEU2LCAweDZGLCAweDFELCAweEZCLCAweDM4LCAweEIwLCAweDU3LCAweDA5LCAweDQzLCAweDQ0LCAweEVFLCAweDgwLCAweEFELCAweDhFLCAweENELCAweDExLCAweDlGLA0KKyAgICAweDIwLCAweERFLCAweDdCLCAweEJDLCAweEVCLCAweDc4LCAweEJGLCAweEYxLCAweDRFLCAweEJCLCAweEY2LCAweEE4LCAweDQzLCAweEFDLCAweDI5LCAweDFBLCAweEQ0LCAweDgzLCAweERGLCAweEJGLA0KKyAgICAweDBCLCAweDkxLCAweEVELCAweDVFLCAweEI0LCAweDc3LCAweEU4LCAweDQxLCAweDc5LCAweDQwLCAweDM0LCAweEZELCAweDMyLCAweDk2LCAweDA2LCAweEU3LCAweDYxLCAweDYwLCAweDEzLCAweDg4LA0KKyAgICAweEE1LCAweDQwLCAweDdELCAweDEyLCAweDkxLCAweDlFLCAweEJFLCAweEI0LCAweEI3LCAweDM2LCAweERCLCAweEY1LCAweDFELCAweDIxLCAweDQ1LCAweEMzLCAweDA4LCAweEVFLCAweDgzLCAweEMwLA0KKyAgICAweDVFLCAweDc5LCAweDVBLCAweEYyLCAweEEyLCAweEE1LCAweDIyLCAweDRGLCAweDlBLCAweDgzLCAweDJBLCAweDkyLCAweDA5LCAweDE3LCAweDI0LCAweEQzLCAweDg0LCAweEQ4LCAweEYwLCAweEFELA0KKyAgICAweEY3LCAweDExLCAweEY3LCAweEQ1LCAweDVCLCAweEFFLCAweDk2LCAweENCLCAweDlDLCAweEY4LCAweDgwLCAweEZDLCAweEY4LCAweDc2LCAweEVCLCAweDFCLCAweDlGLCAweEU3LCAweEM5LCAweDFELA0KKyAgICAweEU0LCAweDY3LCAweDc5LCAweDcyLCAweDEwLCAweDNDLCAweDk4LCAweDIzLCAweDNGLCAweDZBLCAweDhDLCAweEFGLCAweDYxLCAweDE1LCAweDI5LCAweDIzLCAweEEzLCAweEM0LCAweDI4LCAweEQyLA0KKyAgICAweDk3LCAweDVFLCAweDg3LCAweENBLCAweEZGLCAweEM4LCAweDJCLCAweDJBLCAweEMyLCAweDI2LCAweDJELCAweEQwLCAweDUzLCAweDBFLCAweDQwLCAweDA4LCAweDcxLCAweDdELCAweDMyLCAweDM1LA0KKyAgICAweDNELCAweEUyLCAweDUzLCAweDAwLCAweDA5LCAweEY5LCAweDM0LCAweEEzLCAweEFBLCAweDdDLCAweDY3LCAweEVGLCAweDI5LCAweDlGLCAweENGLCAweEYzLCAweEVELCAweEVELCAweDY3LCAweDdDLA0KKyAgICAweEExLCAweEMwLCAweDlGLCAweDdELCAweDdFLCAweEM1LCAweDgzLCAweDI1LCAweDIxLCAweDE1LCAweDUwLCAweEIwLCAweDRBLCAweDM4LCAweDJFLCAweDI1LCAweDk3LCAweEU4LCAweEFCLCAweDgwLA0KKyAgICAweDZELCAweDEzLCAweEQxLCAweDRGLCAweEU1LCAweEYzLCAweDUzLCAweDg1LCAweDQyLCAweDVGLCAweDEyLCAweEQ3LCAweDlBLCAweDE5LCAweEFBLCAweDg5LCAweDBBLCAweEE4LCAweDE5LCAweDkxLA0KKyAgICAweEQxLCAweERELCAweDRCLCAweEIzLCAweDQ4LCAweDUwLCAweEVGLCAweDI2LCAweENELCAweDRCLCAweEM2LCAweENBLCAweDZBLCAweDU2LCAweEFGLCAweDE0LCAweEU2LCAweDY2LCAweDZGLCAweEFFLA0KKyAgICAweERGLCAweDdGLCAweEE0LCAweEU2LCAweEFDLCAweDI1LCAweEM3LCAweEMzLCAweDIwLCAweEM5LCAweDU2LCAweDFBLCAweDU1LCAweEJELCAweDA4LCAweDcxLCAweEQ4LCAweEM4LCAweDEwLCAweEU2LA0KKyAgICAweEY2LCAweDQ0LCAweDMwLCAweEYyLCAweDJELCAweEM4LCAweDlDLCAweDY4LCAweDhELCAweDVBLCAweDU2LCAweDY2LCAweERDLCAweEIyLCAweDJDLCAweDIxLCAweDE1LCAweEUyLCAweEIxLCAweEE1LA0KKyAgICAweDcyLCAweDE1LCAweDYzLCAweDY4LCAweEM4LCAweDM1LCAweDRFLCAweDFDLCAweDc0LCAweEM0LCAweDk5LCAweENDLCAweEUzLCAweDYxLCAweDdGLCAweDM5LCAweEQyLCAweDc3LCAweDlELCAweDM1LA0KKyAgICAweDg4LCAweDY1LCAweDY4LCAweDk4LCAweDZFLCAweDBCLCAweDQzLCAweDcxLCAweDFELCAweEY1LCAweDI2LCAweDM2LCAweDhGLCAweDNGLCAweEUzLCAweEY5LCAweEQ4LCAweDAzLCAweDYxLCAweEM4LA0KKyAgICAweDJELCAweEFGLCAweDQwLCAweDU5LCAweEQzLCAweDI1LCAweDcyLCAweDVGLCAweEM2LCAweEJELCAweDJBLCAweDRFLCAweDlBLCAweDI5LCAweDI4LCAweDYxLCAweDU0LCAweDVELCAweEQzLCAweEU4LA0KKyAgICAweEY1LCAweDE4LCAweEVELCAweDUzLCAweEUxLCAweDRGLCAweDMwLCAweEQ0LCAweEE3LCAweDQwLCAweEQ3LCAweDhDLCAweDZBLCAweDg1LCAweDEzLCAweEM3LCAweEZBLCAweEE0LCAweDVCLCAweDEwLA0KKyAgICAweDIzLCAweDRFLCAweDlDLCAweDg4LCAweEIxLCAweENGLCAweDhELCAweDA5LCAweDlELCAweEJELCAweDc3LCAweDMwLCAweDIxLCAweDY3LCAweEMyLCAweEEwLCAweDc3LCAweDIzLCAweEVELCAweDgwLA0KKyAgICAweDEzLCAweEIzLCAweEI5LCAweDQxLCAweEYyLCAweDZDLCAweDg1LCAweDE4LCAweDVELCAweDU0LCAweDVBLCAweDA1LCAweEQxLCAweDA1LCAweDk1LCAweENELCAweEZFLCAweDgzLCAweDJDLCAweDc4LA0KKyAgICAweDEwLCAweDMxLCAweDkxLCAweEZELCAweDZFLCAweEM2LCAweEZBLCAweEE2LCAweEVGLCAweDQxLCAweDZELCAweDBELCAweDJFLCAweDRCLCAweEIyLCAweEY3LCAweDRDLCAweDdCLCAweEExLCAweDVCLA0KKyAgICAweDczLCAweDQ2LCAweDQxLCAweDQ1LCAweDA4LCAweEYyLCAweEU0LCAweEI0LCAweDQwLCAweEMxLCAweDU0LCAweEMwLCAweDZELCAweDJFLCAweDk1LCAweDQ4LCAweENCLCAweEQ3LCAweEM4LCAweERGLA0KKyAgICAweDkyLCAweDBBLCAweDU4LCAweDIwLCAweDM2LCAweDMyLCAweDA4LCAweDlBLCAweEExLCAweDIxLCAweEEzLCAweDBCLCAweEUxLCAweDA2LCAweEFBLCAweDYyLCAweDBELCAweDYyLCAweEJBLCAweDBCLA0KKyAgICAweDgzLCAweEUxLCAweEI0LCAweEIyLCAweEEwLCAweEY1LCAweEE0LCAweDY0LCAweDYxLCAweDExLCAweEMzLCAweEY1LCAweEFFLCAweDk0LCAweDE5LCAweDJDLCAweDE1LCAweEM5LCAweDQ3LCAweEQ5LA0KKyAgICAweDhELCAweEIyLCAweEE4LCAweDRBLCAweDFBLCAweDgzLCAweDkwLCAweDQzLCAweDU2LCAweDc1LCAweDU1LCAweDAyLCAweEYzLCAweEM4LCAweDU0LCAweDM1LCAweDk5LCAweENFLCAweDM0LCAweDc2LA0KKyAgICAweEVGLCAweDE2LCAweEM4LCAweDc3LCAweDI3LCAweDEzLCAweDAzLCAweDY0LCAweDE1LCAweDc5LCAweEU0LCAweEJCLCAweDVELCAweEI3LCAweDJFLCAweEEwLCAweDFFLCAweDc2LCAweEJCLCAweEE3LA0KKyAgICAweDUyLCAweEFCLCAweDFBLCAweEE1LCAweDE1LCAweDY0LCAweDMzLCAweDlELCAweERELCAweEVELCAweDQ3LCAweDJFLCAweDcwLCAweDlFLCAweDQyLCAweENBLCAweEY5LCAweDI3LCAweDQyLCAweEZDLA0KKyAgICAweDBCLCAweEQ5LCAweDBFLCAweDRCLCAweEVEDQorfTsNCitjb25zdCBGWF9CWVRFIGdfamFKUF9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHhDQiwgMHg2RSwgMHhEMywgMHg0MCwgMHgxNCwgMHg1RCwgMHgxNywgMHg4OSwgMHg3RiwgMHgxOCwgMHg1OSwgMHgyMCwgMHg4MywgMHhENCwgMHhENiwgMHgwRCwNCisgICAgMHhFRiwgMHg1NiwgMHhBRSwgMHhBNSwgMHg4QSwgMHg5NiwgMHg4NiwgMHgxNiwgMHhBMywgMHgwOCwgMHg1NywgMHhBMCwgMHg3NiwgMHg4MywgMHgyNiwgMHhGNiwgMHgzNCwgMHg5OSwgMHgzNiwgMHg5RSwNCisgICAgMHhBOSwgMHgyNiwgMHhCNiwgMHg0QSwgMHhCQywgMHhFMiwgMHgyMSwgMHgyMCwgMHg0OCwgMHg3NCwgMHgwMSwgMHgxQiwgMHgwNCwgMHg0NCwgMHg2MiwgMHg1NSwgMHg0MCwgMHgwMiwgMHgwNCwgMHg4QiwNCisgICAgMHg2RSwgMHhEOCwgMHhEMCwgMHhBRiwgMHg0OSwgMHg1QSwgMHg1NiwgMHhGQywgMHgwMiwgMHgzMywgMHg3RSwgMHhDNSwgMHg4RSwgMHhFRCwgMHhFMCwgMHhFRSwgMHhGMSwgMHgyMiwgMHg5OSwgMHg3QiwNCisgICAgMHg3QywgMHhDRSwgMHhGNSwgMHhCRCwgMHhFNywgMHg4RSwgMHg0NywgMHg1NiwgMHg1QiwgMHhENCwgMHg4NCwgMHgyRCwgMHgwNCwgMHgwOCwgMHhCNCwgMHhEMSwgMHhCQywgMHhCNCwgMHgwNSwgMHhFRiwNCisgICAgMHhBRiwgMHhENCwgMHgyNCwgMHg2MCwgMHhBMSwgMHhCNiwgMHgzOSwgMHgyRiwgMHgwRCwgMHhERSwgMHhFQywgMHgxRiwgMHg3RiwgMHhGRiwgMHg3NiwgMHg4RSwgMHhGRiwgMHgwRCwgMHg3QSwgMHg1RiwNCisgICAgMHhDRiwgMHg0QiwgMHhEQSwgMHhFOSwgMHg1MywgMHgwMCwgMHhBOCwgMHg4MiwgMHg0QywgMHgyQywgMHhDOCwgMHg4QywgMHg4RSwgMHg1RCwgMHhBNywgMHhBRCwgMHg3NiwgMHhBOCwgMHg2QiwgMHgzMCwNCisgICAgMHhENCwgMHhBMCwgMHgwQywgMHg0MywgMHgyMiwgMHg1OCwgMHgxMywgMHg0MCwgMHhCNSwgMHgyOSwgMHg3MSwgMHg5QSwgMHhCNywgMHhGOSwgMHhBRCwgMHhCNiwgMHg4OCwgMHgyNywgMHg4MiwgMHg1OCwNCisgICAgMHhBQiwgMHgwQywgMHg3QSwgMHg1RCwgMHg1NSwgMHgwOSwgMHhENiwgMHgwOSwgMHhGOCwgMHg0MiwgMHgzRSwgMHg3QywgMHgzMSwgMHgxRiwgMHhCRSwgMHg5NCwgMHgwRiwgMHg1RiwgMHhDRSwgMHg4NywNCisgICAgMHhBRiwgMHhFNCwgMHhDMywgMHg1NywgMHhGMywgMHhFMSwgMHg2QiwgMHhGOSwgMHhGMCwgMHg2QywgMHgzRSwgMHg1QywgMHg5OSwgMHgyOSwgMHhDMCwgMHgwQiwgMHhGQSwgMHhBQywgMHg4QywgMHgzNCwNCisgICAgMHgwQSwgMHhDMiwgMHg3NSwgMHhFQywgMHg1MywgMHhEMiwgMHgzNywgMHgwMCwgMHhFQiwgMHg3NSwgMHgzNiwgMHgyRiwgMHg1NSwgMHhBNCwgMHhGRiwgMHgwNiwgMHg5RSwgMHhDNCwgMHg0MCwgMHgwQiwNCisgICAgMHg3NiwgMHgxMiwgMHhEQiwgMHg4RSwgMHg0NywgMHg5QSwgMHhEOCwgMHhCRSwgMHhFRiwgMHg3QiwgMHhGQywgMHg1NywgMHg1NSwgMHg0NCwgMHgzOCwgMHhDNCwgMHg3QiwgMHhERCwgMHg1QywgMHhGQywNCisgICAgMHhFOCwgMHhEMSwgMHg5NywgMHg3QywgMHhGRSwgMHg4RiwgMHg4MywgMHg4MiwgMHgzQywgMHg5RiwgMHg3MywgMHhGMSwgMHhERiwgMHhDRiwgMHg1RiwgMHhFNSwgMHhFMiwgMHhGRCwgMHhERSwgMHg4NywNCisgICAgMHgxMSwgMHgxQywgMHhGOCwgMHhBQiwgMHg5QywgMHgyNiwgMHg0NiwgMHhGNiwgMHg0MCwgMHhEOCwgMHg0RCwgMHhCNiwgMHg4RiwgMHg2QywgMHgwNywgMHhEOSwgMHhEQSwgMHhCMywgMHg1NSwgMHg2NywNCisgICAgMHhFQiwgMHhDRCwgMHg1NiwgMHg1QSwgMHg1QywgMHhBMywgMHg4RCwgMHgxOCwgMHhCNiwgMHgzMCwgMHhCMiwgMHg5MywgMHgyRiwgMHg3OSwgMHgwOCwgMHg2OSwgMHhGRCwgMHhCRCwgMHg2RSwgMHhGRiwNCisgICAgMHhDNSwgMHgxRSwgMHgxRiwgMHg0RSwgMHgwNCwgMHg2NCwgMHg2RiwgMHhGRiwgMHg3QSwgMHg5OSwgMHhCRSwgMHgwRCwgMHg4NiwgMHg2MSwgMHhFMiwgMHgyMSwgMHg4OCwgMHhDMSwgMHg0NCwgMHg3RSwNCisgICAgMHgxRSwgMHg2OSwgMHg0NywgMHgwNywgMHgwRiwgMHhGQiwgMHg0RiwgMHg5RiwgMHhGOCwgMHhEOSwgMHg0NSwgMHgxOCwgMHhFMywgMHhDNywgMHhGQiwgMHg4NywgMHg4MywgMHg3NywgMHgxRiwgMHg2MywNCisgICAgMHgxMCwgMHhGOCwgMHhBQiwgMHg0OCwgMHhDQiwgMHg4RiwgMHgyRCwgMHg2NSwgMHhFNCwgMHhEQywgMHgwQSwgMHg1MCwgMHgwQiwgMHgzQSwgMHhBOCwgMHgwNiwgMHgxRCwgMHgwNywgMHgzMSwgMHgxMiwNCisgICAgMHg1QiwgMHgxRiwgMHgyMywgMHhFMSwgMHhEMSwgMHhCNiwgMHhFOSwgMHhCNiwgMHg1QSwgMHg5MiwgMHhCNiwgMHhDRSwgMHgyRiwgMHhCOSwgMHhGRiwgMHhGMywgMHg0MCwgMHhENiwgMHg2NSwgMHg2RSwNCisgICAgMHhCOCwgMHhCQywgMHgyOCwgMHhGMywgMHg0MSwgMHhDOCwgMHg0QiwgMHhGQywgMHgxMiwgMHhCRSwgMHhDNCwgMHg5MiwgMHhBMiwgMHgxQywgMHgyRCwgMHg0QSwgMHgxQSwgMHgwNSwgMHgzOSwgMHg0QSwNCisgICAgMHhFOSwgMHg2RCwgMHg2NCwgMHgwNSwgMHg3MiwgMHg0NSwgMHhENywgMHg5NSwgMHhDNSwgMHhDNSwgMHg1MiwgMHg5QSwgMHg3NiwgMHg5MywgMHgzMiwgMHg0NywgMHhBOCwgMHhGMiwgMHgzNSwgMHgwMCwNCisgICAgMHhBNCwgMHg5MCwgMHhEMCwgMHgxMCwgMHgwNywgMHhEQiwgMHgyMywgMHg4NiwgMHgyNCwgMHg5MCwgMHg5NCwgMHgyMSwgMHg1NSwgMHg3OSwgMHhGMCwgMHhGNiwgMHhCMSwgMHhBQywgMHhFQiwgMHg3MiwNCisgICAgMHhCRiwgMHhGQiwgMHg0QywgMHgzNiwgMHgwQywgMHhGOSwgMHhFOCwgMHhEMywgMHg2QiwgMHg3OSwgMHg0MywgMHg1NSwgMHgxMiwgMHhGNCwgMHgyMiwgMHg3RCwgMHg2MCwgMHg0NiwgMHg3NSwgMHg0RSwNCisgICAgMHhENywgMHhFNywgMHgwQywgMHg2MywgMHhBRSwgMHg5QywgMHhDNiwgMHgzNywgMHgyMCwgMHg5NCwgMHg5NCwgMHgxMiwgMHg4NCwgMHhERCwgMHgwQiwgMHhDOSwgMHgyOCwgMHg1RiwgMHg3NCwgMHgzRSwNCisgICAgMHhEMiwgMHg2NywgMHhCOCwgMHgxNSwgMHhENiwgMHgzOCwgMHgxQSwgMHhFRCwgMHg4RiwgMHg2NSwgMHg0OCwgMHhCNiwgMHhCNiwgMHhBQiwgMHg3NiwgMHhEQiwgMHg1OCwgMHg1QSwgMHhCQywgMHhCMSwNCisgICAgMHg3QiwgMHhFRiwgMHg0MSwgMHg3MywgMHhENSwgMHhEQiwgMHgwOCwgMHgwQywgMHg0QiwgMHg5MiwgMHg3QywgMHgyNSwgMHg3MSwgMHhFRCwgMHgzQSwgMHg2MiwgMHg2OSwgMHhENywgMHg1MiwgMHg1OCwNCisgICAgMHg1OCwgMHgxMiwgMHhDNywgMHhGOCwgMHgwRSwgMHgzNywgMHgyNSwgMHhDRCwgMHg5QiwgMHhGNCwgMHhCQywgMHhEOSwgMHg2OSwgMHhDRiwgMHhGMywgMHg1NCwgMHgyNSwgMHhDNSwgMHgyQiwgMHg5NiwNCisgICAgMHg5QSwgMHgyRSwgMHg2MywgMHg4OCwgMHg5OCwgMHgxRCwgMHg0OSwgMHgzQiwgMHhFMywgMHg4QiwgMHg0QiwgMHgwQiwgMHg3NywgMHgxMCwgMHgzMywgMHgxMSwgMHg3MSwgMHhDMiwgMHg2NywgMHg5RSwNCisgICAgMHhDRCwgMHhFQSwgMHg4NCwgMHgxOSwgMHg5OSwgMHgwNiwgMHhFMiwgMHhBNiwgMHg4NiwgMHg3RCwgMHg0RSwgMHhBNCwgMHhBMSwgMHgzMCwgMHhCRCwgMHg4NSwgMHg0QywgMHg2QywgMHg0MywgMHhCRSwNCisgICAgMHgxQiwgMHhBNiwgMHhBMywgMHgyQywgMHhDMSwgMHhFRCwgMHg0MiwgMHg0MSwgMHg4MywgMHg1MSwgMHg3NywgMHgwNywgMHg4QiwgMHhGOSwgMHg0RiwgMHg5NiwgMHg1NCwgMHhDNCwgMHgxRCwgMHg5QywNCisgICAgMHgyRCwgMHgyOSwgMHhCMCwgMHgzMSwgMHg3MSwgMHhEQiwgMHg5MiwgMHgzNiwgMHg1NSwgMHg5MiwgMHhFRSwgMHgyMSwgMHg0NiwgMHgyNSwgMHg2RCwgMHgyNiwgMHhDMywgMHgxRSwgMHgxQSwgMHg5MywNCisgICAgMHgxQSwgMHg3NiwgMHgzNCwgMHg4OSwgMHg5NCwgMHgzMywgMHg2OSwgMHgzMCwgMHhEQSwgMHg4MSwgMHg3RSwgMHgyMCwgMHg2OSwgMHg3RiwgMHgwRSwgMHhGOSwgMHg4OSwgMHg5RCwgMHg2NiwgMHg4QywNCisgICAgMHg1MSwgMHhFMSwgMHgzNiwgMHgxNSwgMHgwQiwgMHg0OSwgMHg1QiwgMHhBOSwgMHhBRCwgMHg5RiwgMHg0MCwgMHg5NiwgMHgxQywgMHg0NCwgMHg0NiwgMHhFNCwgMHgxRiwgMHg3RiwgMHg5OSwgMHhCQSwNCisgICAgMHhDNSwgMHhEQiwgMHhERSwgMHhEOSwgMHg0MSwgMHg5QiwgMHhEMCwgMHg4QywgMHg0RSwgMHhEQiwgMHgyOCwgMHgwQywgMHg3MywgMHhBRSwgMHg1MiwgMHhDRiwgMHhERCwgMHg4NiwgMHg2MCwgMHg5OSwNCisgICAgMHgzQSwgMHg0RCwgMHg2QywgMHg4MiwgMHgxQSwgMHhBMywgMHg1MywgMHg3NywgMHg2RiwgMHgwMiwgMHg1RCwgMHg1MiwgMHhDNiwgMHg5MSwgMHg3NSwgMHg0QywgMHhDQywgMHgyNiwgMHg4RCwgMHhDOCwNCisgICAgMHg3NywgMHgwQSwgMHhDOCwgMHg3QSwgMHg4NywgMHg3RiwgMHgyQSwgMHg1QSwgMHg4MiwgMHg1NSwgMHg0NCwgMHhDMCwgMHgwNCwgMHg1MywgMHgzMiwgMHg4NiwgMHg3MCwgMHg5RCwgMHhCQSwgMHgwQywNCisgICAgMHgyMywgMHgwNiwgMHgwQywgMHhDNywgMHgyQSwgMHg2MCwgMHgyQywgMHg1OCwgMHhCNCwgMHg4RSwgMHg0MCwgMHgwRCwgMHhGRiwgMHg5MywgMHg1MiwgMHg0NSwgMHg3NSwgMHg4NiwgMHg3NiwgMHhDNywNCisgICAgMHg1MiwgMHgxNiwgMHgxOCwgMHhBQywgMHhGMywgMHgxNywgMHg3NywgMHgxQywgMHg2NSwgMHhBRCwgMHgwOSwgMHhGMSwgMHg1OCwgMHgwMiwgMHg2RiwgMHhBOSwgMHgyMSwgMHg2QSwgMHgwMSwgMHhCNywNCisgICAgMHhDNiwgMHhEMiwgMHgwQywgMHg1QSwgMHg4QSwgMHhBNiwgMHg3NywgMHg1QywgMHhEMiwgMHhEOCwgMHhBMiwgMHgzRSwgMHgzMywgMHgxOCwgMHg4OSwgMHg3RiwgMHhBQSwgMHgyNSwgMHhFNiwgMHhBOSwNCisgICAgMHgyQSwgMHhDMSwgMHg4NywgMHhCRCwgMHhGNiwgMHgxNywgMHg2QywgMHg0MiwgMHgwOCwgMHgyMQ0KK307DQorY29uc3QgRlhfQllURSBnX2tvS1JfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4NEQsIDB4NkIsIDB4RDQsIDB4NDAsIDB4MTgsIDB4M0UsIDB4NTcsIDB4RjAsIDB4M0YsIDB4MEMsIDB4QzEsIDB4MTIsIDB4ODUsIDB4NzYsIDB4QjcsIDB4RUIsDQorICAgIDB4NzcsIDB4NEIsIDB4MUEsIDB4MjgsIDB4NkUsIDB4NkQsIDB4NjUsIDB4OEQsIDB4OTQsIDB4QTYsIDB4NTgsIDB4RUMsIDB4NDUsIDB4NjYsIDB4OTMsIDB4RTksIDB4MjYsIDB4RUQsIDB4MjYsIDB4NTMsDQorICAgIDB4MjYsIDB4MDksIDB4NzUsIDB4NzMsIDB4QUUsIDB4NTIsIDB4RjAsIDB4RTIsIDB4QTEsIDB4ODcsIDB4RUEsIDB4NkUsIDB4QjEsIDB4MDcsIDB4MTEsIDB4MkEsIDB4ODgsIDB4MjIsIDB4MjIsIDB4MUUsDQorICAgIDB4MTQsIDB4N0YsIDB4OEQsIDB4NjIsIDB4NkQsIDB4OEEsIDB4N0YsIDB4QzEsIDB4QzksIDB4RTcsIDB4RTYsIDB4NjMsIDB4QjIsIDB4NEQsIDB4RUYsIDB4RUUsIDB4NjEsIDB4OTksIDB4RjcsIDB4OTksDQorICAgIDB4RTcsIDB4NzksIDB4RjMsIDB4QkUsIDB4Q0YsIDB4NEMsIDB4NUUsIDB4MjIsIDB4NzQsIDB4QjEsIDB4MDIsIDB4QkIsIDB4MDgsIDB4OTgsIDB4RDAsIDB4NDAsIDB4QjMsIDB4REMsIDB4MjYsIDB4N0UsDQorICAgIDB4REMsIDB4NUEsIDB4RTYsIDB4ODAsIDB4OEEsIDB4MkMsIDB4NjUsIDB4OTYsIDB4RkIsIDB4MzUsIDB4MzgsIDB4MzgsIDB4RkUsIDB4MzQsIDB4RjgsIDB4RkQsIDB4RTEsIDB4RkQsIDB4RTUsIDB4RTMsDQorICAgIDB4RDcsIDB4NDcsIDB4M0YsIDB4RkIsIDB4REYsIDB4QUYsIDB4NzAsIDB4RTIsIDB4QzUsIDB4MEIsIDB4MDAsIDB4MDgsIDB4M0UsIDB4REYsIDB4NTQsIDB4MjEsIDB4OTEsIDB4N0IsIDB4NDYsIDB4MUIsDQorICAgIDB4NzcsIDB4QUQsIDB4NDgsIDB4REEsIDB4MjEsIDB4QTgsIDB4ODMsIDB4ODksIDB4MEUsIDB4NEQsIDB4OUYsIDB4MzUsIDB4MDYsIDB4MDQsIDB4MDMsIDB4OUIsIDB4QjYsIDB4RjYsIDB4ODAsIDB4NkUsDQorICAgIDB4NTksIDB4N0UsIDB4M0MsIDB4MTYsIDB4QzYsIDB4NjIsIDB4QzMsIDB4RUIsIDB4RUYsIDB4MDksIDB4RjUsIDB4NzAsIDB4OUQsIDB4ODIsIDB4QUYsIDB4QjIsIDB4RTEsIDB4NkIsIDB4NkMsIDB4RjgsDQorICAgIDB4M0EsIDB4MUIsIDB4QkUsIDB4QzEsIDB4ODYsIDB4NkYsIDB4QjIsIDB4RTEsIDB4NUIsIDB4NkMsIDB4RjgsIDB4MzYsIDB4MUIsIDB4OUUsIDB4NjYsIDB4QzMsIDB4OEQsIDB4QTksIDB4MTIsIDB4QkMsDQorICAgIDB4QTQsIDB4Q0YsIDB4NDYsIDB4QUUsIDB4NTEsIDB4MTAsIDB4QUQsIDB4MTMsIDB4OUYsIDB4RDIsIDB4QkUsIDB4MDEsIDB4RDgsIDB4NkUsIDB4OTMsIDB4NTksIDB4QUUsIDB4QzEsIDB4RkQsIDB4MzcsDQorICAgIDB4RjAsIDB4M0MsIDB4MDYsIDB4QUEsIDB4QjAsIDB4OTcsIDB4QkEsIDB4NzYsIDB4MzQsIDB4MTIsIDB4QkQsIDB4ODMsIDB4NkYsIDB4REUsIDB4QUIsIDB4M0QsIDB4RkEsIDB4MkYsIDB4RDQsIDB4RkQsDQorICAgIDB4NzAsIDB4ODgsIDB4RjcsIDB4RjcsIDB4OTgsIDB4RjgsIDB4RTksIDB4NEIsIDB4MzYsIDB4RUUsIDB4RUQsIDB4RUUsIDB4MzMsIDB4RjEsIDB4OTMsIDB4NzcsIDB4NDcsIDB4NEMsIDB4RkMsIDB4Q0YsDQorICAgIDB4RDcsIDB4NUQsIDB4NzYsIDB4RkUsIDB4NjcsIDB4ODcsIDB4MzksIDB4MUMsIDB4MDQsIDB4MkIsIDB4NDYsIDB4MTMsIDB4QjksIDB4M0IsIDB4MTAsIDB4NzUsIDB4NTMsIDB4RUMsIDB4QTMsIDB4RDgsDQorICAgIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsIDB4N0EsIDB4OEIsIDB4OTUsIDB4OTYsIDB4RDcsIDB4NjgsIDB4MjAsIDB4QTIsIDB4QUIsIDB4M0EsIDB4MzIsIDB4RDIsIDB4MkYsIDB4NzksDQorICAgIDB4MDQsIDB4ODksIDB4REUsIDB4RkUsIDB4MUIsIDB4RUYsIDB4NzAsIDB4ODcsIDB4MUUsIDB4NEUsIDB4MEMsIDB4MTQsIDB4QjYsIDB4NEYsIDB4RkIsIDB4QjksIDB4NkQsIDB4MzAsIDB4MEMsIDB4NTMsDQorICAgIDB4MEYsIDB4NDEsIDB4MDQsIDB4QTYsIDB4RjIsIDB4RDMsIDB4ODgsIDB4NTYsIDB4RjksIDB4RDEsIDB4RUIsIDB4QkYsIDB4MDgsIDB4QjIsIDB4RkIsIDB4NjEsIDB4ODIsIDB4N0IsIDB4M0IsIDB4MDMsDQorICAgIDB4QkEsIDB4OTUsIDB4ODAsIDB4MjAsIDB4NTgsIDB4QzUsIDB4NUEsIDB4M0EsIDB4QjYsIDB4RUEsIDB4QjksIDB4QjksIDB4MTUsIDB4QTIsIDB4MkEsIDB4QjQsIDB4RDEsIDB4MTIsIDB4QjQsIDB4NkQsDQorICAgIDB4NDQsIDB4Q0MsIDB4QzQsIDB4RkEsIDB4MDQsIDB4ODksIDB4NDYsIDB4REIsIDB4QkEsIDB4RDMsIDB4RUQsIDB4NzIsIDB4RTIsIDB4MjMsIDB4RkEsIDB4RTMsIDB4NEYsIDB4OUUsIDB4RUUsIDB4RjAsDQorICAgIDB4NDAsIDB4RTIsIDB4QTksIDB4RTMsIDB4M0MsIDB4NjgsIDB4RjIsIDB4RjQsIDB4MjgsIDB4NzgsIDB4MzAsIDB4NEYsIDB4N0YsIDB4QkUsIDB4MzUsIDB4ODksIDB4QUEsIDB4MkMsIDB4NEQsIDB4MTcsDQorICAgIDB4OUIsIDB4OUQsIDB4RDIsIDB4MzQsIDB4OTUsIDB4MzIsIDB4MTgsIDB4NDgsIDB4MEQsIDB4MTMsIDB4RDQsIDB4ODAsIDB4MjQsIDB4RDUsIDB4NDAsIDB4QjMsIDB4NTksIDB4NDksIDB4NjUsIDB4NjksDQorICAgIDB4OTgsIDB4RDgsIDB4QkUsIDB4QUUsIDB4NEMsIDB4MDUsIDB4NDAsIDB4MDYsIDB4ODksIDB4OUMsIDB4QjEsIDB4NzUsIDB4MjMsIDB4RTcsIDB4NEMsIDB4MEEsIDB4QzksIDB4MzgsIDB4MzMsIDB4MDcsDQorICAgIDB4MzQsIDB4OEQsIDB4RjcsIDB4OUUsIDB4MEYsIDB4NjgsIDB4NEIsIDB4MTIsIDB4N0YsIDB4RjIsIDB4ODUsIDB4QjYsIDB4MjYsIDB4Q0IsIDB4QkMsIDB4RjcsIDB4NzksIDB4OTcsIDB4MDcsIDB4NkIsDQorICAgIDB4NDIsIDB4M0QsIDB4MjUsIDB4MkEsIDB4Q0IsIDB4MTIsIDB4MUEsIDB4NTMsIDB4OUEsIDB4QTUsIDB4NTIsIDB4OEUsIDB4QzAsIDB4MUEsIDB4OUEsIDB4NjIsIDB4NDYsIDB4OTIsIDB4NjYsIDB4NjQsDQorICAgIDB4QjksIDB4OTIsIDB4MjQsIDB4RjIsIDB4MjUsIDB4MTQsIDB4RTUsIDB4MTUsIDB4QkUsIDB4MjcsIDB4MzksIDB4MDcsIDB4QTIsIDB4REIsIDB4QjIsIDB4NDIsIDB4RDEsIDB4RjgsIDB4MEEsIDB4MkQsDQorICAgIDB4NDAsIDB4NzMsIDB4NjMsIDB4NzMsIDB4RDEsIDB4QjAsIDB4RTQsIDB4RjksIDB4RTYsIDB4REQsIDB4RUQsIDB4RDUsIDB4MjcsIDB4NUEsIDB4Q0IsIDB4NUQsIDB4MEIsIDB4QUQsIDB4NEMsIDB4OTMsDQorICAgIDB4MDIsIDB4QTUsIDB4RTksIDB4MTgsIDB4NkQsIDB4NDQsIDB4QjIsIDB4N0UsIDB4NjYsIDB4QjAsIDB4QTgsIDB4MjgsIDB4OEEsIDB4RDEsIDB4OTcsIDB4NDAsIDB4RTEsIDB4NDQsIDB4NzcsIDB4QzIsDQorICAgIDB4NzUsIDB4QTcsIDB4NkIsIDB4QUUsIDB4RUIsIDB4MEEsIDB4RjUsIDB4MEMsIDB4QUYsIDB4NUMsIDB4QUEsIDB4MzgsIDB4ODQsIDB4MjAsIDB4NTMsIDB4RTksIDB4NzEsIDB4RTIsIDB4QTUsIDB4NDAsDQorICAgIDB4NUMsIDB4NTksIDB4QjgsIDB4ODUsIDB4ODgsIDB4ODIsIDB4NEMsIDB4M0IsIDB4N0EsIDB4RTYsIDB4NzgsIDB4NTEsIDB4RTcsIDB4OUIsIDB4NTEsIDB4NjgsIDB4MjAsIDB4NjksIDB4NkEsIDB4RDgsDQorICAgIDB4RTcsIDB4NTgsIDB4MTYsIDB4OEEsIDB4RDIsIDB4QUIsIDB4NDgsIDB4RDEsIDB4MEQsIDB4NDgsIDB4RUYsIDB4NDksIDB4MkQsIDB4Q0UsIDB4MTIsIDB4NkUsIDB4OTcsIDB4MEEsIDB4M0EsIDB4MDQsDQorICAgIDB4M0IsIDB4NUIsIDB4QkEsIDB4N0YsIDB4MjcsIDB4MjYsIDB4MkEsIDB4MkEsIDB4OTIsIDB4MEUsIDB4QzYsIDB4MkIsIDB4MEEsIDB4MEMsIDB4REQsIDB4NzQsIDB4MkMsIDB4NEUsIDB4OUMsIDB4QUMsDQorICAgIDB4NDgsIDB4NzcsIDB4MTEsIDB4QzEsIDB4OUMsIDB4MzgsIDB4NTUsIDB4NjAsIDB4MEYsIDB4OEQsIDB4QzksIDB4MUMsIDB4NzYsIDB4N0MsIDB4MTIsIDB4MTksIDB4NjcsIDB4QjIsIDB4NjAsIDB4N0MsDQorICAgIDB4MDcsIDB4ODMsIDB4ODAsIDB4MTMsIDB4RkYsIDB4RkUsIDB4NzgsIDB4NEIsIDB4MDcsIDB4NTQsIDB4ODYsIDB4MzEsIDB4NDIsIDB4QTUsIDB4NUIsIDB4RDgsIDB4NUYsIDB4NzAsIDB4NjIsIDB4NkIsDQorICAgIDB4NzksIDB4RjUsIDB4MUMsIDB4QjIsIDB4RjQsIDB4NDEsIDB4MTQsIDB4NDQsIDB4QzEsIDB4ODQsIDB4MkMsIDB4RDQsIDB4RUQsIDB4Q0YsIDB4ODEsIDB4REUsIDB4MTYsIDB4NUEsIDB4ODcsIDB4NEEsDQorICAgIDB4M0MsIDB4OTAsIDB4RTMsIDB4MzAsIDB4Q0EsIDB4MzksIDB4QTcsIDB4RTIsIDB4MzYsIDB4MDIsIDB4NTIsIDB4Q0YsIDB4MzEsIDB4M0IsIDB4MUIsIDB4MTgsIDB4QzgsIDB4QjYsIDB4MEEsIDB4MjQsDQorICAgIDB4QUUsIDB4Q0UsIDB4NjQsIDB4NEEsIDB4M0QsIDB4RkEsIDB4NzUsIDB4QTgsIDB4ODIsIDB4MjUsIDB4RUEsIDB4NjQsIDB4MDksIDB4NDEsIDB4MzcsIDB4NzUsIDB4NkMsIDB4OEUsIDB4MjAsIDB4REMsDQorICAgIDB4QzEsIDB4MEUsIDB4RDEsIDB4MTEsIDB4RjEsIDB4OUYsIDB4NTIsIDB4QzIsIDB4MDgsIDB4QUIsIDB4NTksIDB4RDIsIDB4Q0YsIDB4QTQsIDB4MkMsIDB4QTIsIDB4MzYsIDB4NDEsIDB4REIsIDB4MjMsDQorICAgIDB4MjksIDB4NzMsIDB4MDQsIDB4QjYsIDB4RTksIDB4OEIsIDB4MzgsIDB4OEEsIDB4QjIsIDB4QTIsIDB4NDEsIDB4QkQsIDB4ODQsIDB4RDAsIDB4QzIsIDB4QUUsIDB4QjMsIDB4MDksIDB4QzEsIDB4MDIsDQorICAgIDB4QjYsIDB4MzUsIDB4NUQsIDB4RjEsIDB4N0IsIDB4OUEsIDB4N0MsIDB4NzgsIDB4QUYsIDB4RDQsIDB4OUEsIDB4ODgsIDB4NEMsIDB4MEQsIDB4NTAsIDB4MzQsIDB4MUMsIDB4OTMsIDB4OTcsIDB4NDcsDQorICAgIDB4M0UsIDB4OUEsIDB4NzIsIDB4M0IsIDB4ODEsIDB4REQsIDB4RjcsIDB4NDcsIDB4RDIsIDB4NjQsIDB4OUMsIDB4QTEsIDB4MDUsIDB4NTMsIDB4MkQsIDB4NzUsIDB4OUUsIDB4NDIsIDB4M0QsIDB4RkMsDQorICAgIDB4RkMsIDB4MTcsIDB4RkYsIDB4MDEsIDB4REMsIDB4RjEsIDB4MTgsIDB4RDMNCit9Ow0KK2NvbnN0IEZYX0JZVEUgZ19lc0VTX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENGLCAweDZCLCAweEQ0LCAweDQwLCAweDE0LCAweEJFLCAweDBCLCAweEZFLCAweDBGLCAweDIxLCAweDU4LCAweDU2LCAweEExLCAweERELCAweEQxLCAweDYzLA0KKyAgICAweENCLCAweDM2LCAweDUwLCAweERBLCAweERBLCAweDk1LCAweDFBLCAweDU5LCAweDlBLCAweEFBLCAweEQ4LCAweDhCLCAweDRDLCAweDkyLCAweEU5LCAweEVFLCAweEI0LCAweEM5LCAweENDLCAweDMyLA0KKyAgICAweDQ5LCAweDJDLCAweDlCLCAweEEzLCAweEUwLCAweDQxLCAweDEwLCAweDBCLCAweERFLCAweDhBLCAweDI3LCAweDBGLCAweDFFLCAweDA0LCAweDhCLCAweDc3LCAweDUxLCAweDNDLCAweEY0LCAweDNGLA0KKyAgICAweDExLCAweDZBLCAweEVCLCAweEM5LCAweDdGLCAweEMxLCAweDM3LCAweDlCLCAweDQ5LCAweDM2LCAweDNGLCAweDY2LCAweEQ3LCAweDYwLCAweDRFLCAweEYzLCAweEJFLCAweEY3LCAweDdELCAweDJGLA0KKyAgICAweEVGLCAweDdELCAweDkzLCAweDRDLCAweEQyLCAweDBCLCAweEI4LCAweDg3LCAweDAzLCAweDYyLCAweDMwLCAweDFDLCAweDkyLCAweDc1LCAweDkzLCAweDQ0LCAweENGLCAweEI3LCAweDFELCAweEQzLA0KKyAgICAweEYwLCAweDQ5LCAweEU0LCAweEFELCAweDlCLCAweEQ3LCAweDFGLCAweDdGLCAweDVDLCAweDlELCAweDlFLCAweDVGLCAweEJELCAweDNFLCAweEJCLCAweEZFLCAweDcyLCAweDdFLCAweEJCLCAweDA4LA0KKyAgICAweEZFLCAweDdDLCAweDdCLCAweDczLCAweEY5LCAweEZFLCAweEZCLCAweEVGLCAweEIzLCAweDU3LCAweEJGLCAweERFLCAweEJFLCAweEJCLCAweEZDLCAweDdBLCAweDdBLCAweEM3LCAweEI0LCAweDdBLA0KKyAgICAweEIyLCAweDAwLCAweEYzLCAweEIxLCAweDcwLCAweDI2LCAweEExLCAweENCLCAweDgzLCAweDQ4LCAweEQ1LCAweDFBLCAweDBBLCAweDMyLCAweEU0LCAweDgyLCAweDYyLCAweDA2LCAweDhDLCAweDkwLA0KKyAgICAweEIzLCAweDc4LCAweEY0LCAweDA4LCAweEUwLCAweDQ4LCAweEFELCAweDJELCAweEMyLCAweDg4LCAweEUwLCAweDNELCAweDk0LCAweDA1LCAweDM3LCAweDZGLCAweDI4LCAweEY0LCAweDkwLCAweEI4LA0KKyAgICAweDQyLCAweDg3LCAweDg3LCAweDU4LCAweEE0LCAweDRELCAweDE0LCAweEJCLCAweDgyLCAweDA2LCAweDFBLCAweEVFLCAweEE0LCAweDQ5LCAweDNELCAweDRBLCAweDE4LCAweEQ1LCAweEExLCAweDgxLA0KKyAgICAweDA2LCAweEM1LCAweDQzLCAweDFFLCAweEM1LCAweDRELCAweDM4LCAweDIyLCAweEUzLCAweDk4LCAweDkyLCAweDEwLCAweDFBLCAweDZDLCAweEE0LCAweEI4LCAweDE3LCAweDI3LCAweDNBLCAweDlDLA0KKyAgICAweEYxLCAweDE3LCAweDczLCAweDE0LCAweDNFLCAweEY1LCAweDFBLCAweDE5LCAweDU0LCAweDcyLCAweDI5LCAweDI3LCAweDRFLCAweDIzLCAweDAzLCAweEJCLCAweEFFLCAweDU4LCAweDM3LCAweEVGLA0KKyAgICAweDk5LCAweDI1LCAweEYzLCAweDc0LCAweEQ2LCAweEU5LCAweDZDLCAweEQzLCAweDk5LCAweEE2LCAweEIzLCAweDRDLCAweEU3LCAweDk4LCAweENFLCAweDJGLCAweDlELCAweDVCLCAweDNBLCAweEFCLA0KKyAgICAweDc0LCAweDFFLCAweEU5LCAweEZDLCAweEQxLCAweDM5LCAweDMzLCAweERGLCAweDEzLCAweDFGLCAweDRGLCAweEQ0LCAweDUzLCAweDA0LCAweDJCLCAweENCLCAweEU3LCAweDIxLCAweDY1LCAweEYyLA0KKyAgICAweEY2LCAweDMyLCAweEM4LCAweEIyLCAweDU2LCAweDkwLCAweDMwLCAweDEyLCAweDU1LCAweDEwLCAweDMwLCAweDIxLCAweEFFLCAweDQzLCAweEY0LCAweEUyLCAweDkzLCAweEYwLCAweDc4LCAweDUwLA0KKyAgICAweDgzLCAweDhGLCAweDEyLCAweEYyLCAweEEyLCAweDA2LCAweEMxLCAweEZFLCAweDg5LCAweDdBLCAweEMxLCAweEU4LCAweEUyLCAweDgzLCAweDhCLCAweEZELCAweEQ5LCAweDZELCAweDUxLCAweEQxLA0KKyAgICAweDU1LCAweEE5LCAweEMzLCAweEQyLCAweDlFLCAweEE5LCAweDU2LCAweEVCLCAweDZELCAweEQ2LCAweDlCLCAweDZDLCAweDc0LCAweDU4LCAweEVGLCAweEFELCAweERFLCAweDU4LCAweEEzLCAweDI5LA0KKyAgICAweDdELCAweDQ3LCAweDIxLCAweDExLCAweEQ0LCAweDg3LCAweDg3LCAweDJELCAweDdGLCAweEZELCAweDU0LCAweDY4LCAweDZELCAweEQ4LCAweEUwLCAweDZFLCAweDFFLCAweDk0LCAweDc4LCAweEQ2LA0KKyAgICAweEEwLCAweDk2LCAweDQwLCAweEQ1LCAweDBBLCAweDgwLCAweDEwLCAweDgxLCAweDU1LCAweDM1LCAweDU4LCAweDU5LCAweEI4LCAweEJCLCAweEQ5LCAweEVELCAweDIxLCAweEI5LCAweENBLCAweDUyLA0KKyAgICAweDk2LCAweDVGLCAweDA2LCAweDUwLCAweDQxLCAweDk2LCAweDQxLCAweEVELCAweEE4LCAweEM4LCAweEJBLCAweDhGLCAweEM5LCAweDAwLCAweEM3LCAweDMxLCAweDE4LCAweDNELCAweERELCAweEQ3LA0KKyAgICAweDIyLCAweDUyLCAweEU3LCAweEM4LCAweDYxLCAweDEyLCAweDA0LCAweEE2LCAweEI1LCAweDBELCAweDk3LCAweEIxLCAweEQ1LCAweDgxLCAweEEzLCAweEM5LCAweEU4LCAweEQ4LCAweDcwLCAweDY1LA0KKyAgICAweEFCLCAweDY3LCAweDcwLCAweEM5LCAweDY5LCAweDBCLCAweDRELCAweEFELCAweEEwLCAweDJBLCAweDExLCAweDcwLCAweDM2LCAweDM0LCAweEFELCAweEZGLCAweDU1LCAweDg3LCAweEM0LCAweDA3LA0KKyAgICAweEYxLCAweDE2LCAweEIyLCAweDZELCAweEQ0LCAweDUyLCAweDExLCAweDhELCAweEI4LCAweDg4LCAweDY3LCAweDlBLCAweDg2LCAweDAyLCAweDU1LCAweDY2LCAweDA2LCAweDIwLCAweEE2LCAweDYxLA0KKyAgICAweEM5LCAweDgzLCAweDUyLCAweDU0LCAweEYxLCAweEEwLCAweERGLCAweEVGLCAweEY0LCAweEExLCAweEZELCAweDBFLCAweDVDLCAweDBFLCAweDlDLCAweEQyLCAweDA3LCAweDNELCAweDU0LCAweDYyLA0KKyAgICAweEQ2LCAweENBLCAweDU0LCAweDI2LCAweEVGLCAweEY3LCAweEQ3LCAweDZDLCAweDdCLCAweENELCAweDcxLCAweDVBLCAweDQ5LCAweEE2LCAweEUzLCAweDJBLCAweDQxLCAweDBCLCAweEJBLCAweDlBLA0KKyAgICAweDU1LCAweDBBLCAweDFBLCAweDZDLCAweDU0LCAweDk5LCAweDRCLCAweDU5LCAweEI1LCAweDBGLCAweDU4LCAweEJFLCAweEZELCAweDNCLCAweDg5LCAweDFELCAweDFGLCAweDhGLCAweEMyLCAweEM4LA0KKyAgICAweEQ5LCAweERFLCAweEJBLCAweDdGLCAweEYyLCAweDE0LCAweDhGLCAweDc2LCAweEQzLCAweDgzLCAweENDLCAweDlDLCAweDMyLCAweDA5LCAweDc0LCAweDJDLCAweDA5LCAweDVELCAweDIyLCAweDY2LA0KKyAgICAweDBFLCAweDU1LCAweDYyLCAweEQ1LCAweDA4LCAweDYwLCAweEYwLCAweDlDLCAweDdBLCAweEE2LCAweDk1LCAweDJFLCAweEE3LCAweEU5LCAweDZBLCAweDM3LCAweDRELCAweEQzLCAweDFFLCAweEFBLA0KKyAgICAweEYwLCAweDFBLCAweDg1LCAweDk0LCAweEQwLCAweDRCLCAweDg0LCAweDIwLCAweENDLCAweDlCLCAweEU0LCAweENBLCAweEQ1LCAweDU1LCAweEUzLCAweDU2LCAweDRCLCAweEU5LCAweDk4LCAweDA4LA0KKyAgICAweDhGLCAweEIwLCAweDU4LCAweDI5LCAweDk3LCAweDM0LCAweDJBLCAweDU0LCAweDZCLCAweEJELCAweDI4LCAweDk0LCAweDRGLCAweDU3LCAweDA5LCAweDU1LCAweDU5LCAweDlGLCAweDc4LCAweDM0LA0KKyAgICAweEM0LCAweEIwLCAweEUzLCAweENCLCAweEI5LCAweDNFLCAweDRCLCAweEQ3LCAweEQ1LCAweEM1LCAweDk3LCAweDk2LCAweDI3LCAweDYzLCAweDJBLCAweDM3LCAweEJBLCAweERCLCAweDhBLCAweDVGLA0KKyAgICAweDc0LCAweEJELCAweEQ0LCAweDhBLCAweDBFLCAweDg3LCAweDZDLCAweDEyLCAweDk5LCAweEQ2LCAweDRBLCAweDJCLCAweDcyLCAweDBBLCAweDlGLCAweDZGLCAweEQzLCAweEJBLCAweERCLCAweEU0LA0KKyAgICAweEEyLCAweEVBLCAweEQ4LCAweDgwLCAweEU0LCAweEJFLCAweDE3LCAweDRFLCAweDU0LCAweDgxLCAweEZDLCAweEY5LCAweDlBLCAweDA2LCAweEE2LCAweEY1LCAweEYzLCAweEU1LCAweDY3LCAweDM4LA0KKyAgICAweDNFLCAweDJBLCAweDhDLCAweDY2LCAweDExLCAweEE1LCAweEExLCAweDExLCAweDk3LCAweDBCLCAweDM4LCAweDM1LCAweDFFLCAweEVGLCAweEI1LCAweDE2LCAweDk1LCAweDRELCAweDZGLCAweDRBLA0KKyAgICAweDUwLCAweEJELCAweDVCLCAweEY5LCAweDMyLCAweDRDLCAweEM2LCAweEU0LCAweDEwLCAweDdCLCAweEYyLCAweDFDLCAweENDLCAweDk3LCAweEFBLCAweDk2LCAweDNELCAweDgxLCAweDFGLCAweDFGLA0KKyAgICAweERGLCAweDE4LCAweDgwLCAweDE3LCAweEE4LCAweENDLCAweENDLCAweEQzLCAweDE0LCAweEZFLCAweDQ2LCAweEQ4LCAweERDLCAweEY0LCAweDI2LCAweDRGLCAweDA0LCAweDdDLCAweDc3LCAweDBDLA0KKyAgICAweDI3LCAweEY2LCAweEI1LCAweEY5LCAweDBELCAweDlGLCAweEJCLCAweEM0LCAweDE4LCAweEQwLCAweDdGLCAweDEwLCAweEZBLCAweEYyLCAweDY3LCAweEVBLCAweDY0LCAweDAxLCAweDYxLCAweDQzLA0KKyAgICAweDYwLCAweDE3LCAweDVFLCAweDk4LCAweEY5LCAweDg0LCAweEZELCAweDExLCAweEE2LCAweERBLCAweEY0LCAweDJFLCAweDRGLCAweDkzLCAweDYzLCAweDZDLCAweEVDLCAweEYwLCAweDc4LCAweDQ0LA0KKyAgICAweDNELCAweDM5LCAweEM3LCAweENBLCAweDkzLCAweDA3LCAweDg2LCAweEJELCAweDg4LCAweDBBLCAweDIzLCAweDdCLCAweDIzLCAweDlFLCAweDUzLCAweEY3LCAweDE2LCAweERDLCAweDE0LCAweDk4LA0KKyAgICAweDQzLCAweDM5LCAweDk5LCAweEYxLCAweDcwLCAweDAxLCAweEM5LCAweEUxLCAweDJELCAweDQ4LCAweEY2LCAweDI0LCAweDYxLCAweEMzLCAweDIzLCAweDNFLCAweEU1LCAweEE5LCAweEU2LCAweEQwLA0KKyAgICAweDZDLCAweENGLCAweDY0LCAweDk0LCAweEZELCAweEZDLCAweEMyLCAweEYyLCAweDJGLCAweDdDLCAweERDLCAweENDLCAweDJGLA0KK307DQorY29uc3QgRlhfQllURSBnX2VzTEFfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4Q0QsIDB4NEUsIDB4REMsIDB4MzAsIDB4MTAsIDB4M0UsIDB4NTMsIDB4QTksIDB4RUYsIDB4NjAsIDB4NDUsIDB4NDUsIDB4ODAsIDB4MDQsIDB4OUIsIDB4RjYsDQorICAgIDB4QjgsIDB4MjgsIDB4NDQsIDB4NUEsIDB4MDEsIDB4QTUsIDB4MTUsIDB4MEQsIDB4NUEsIDB4NzUsIDB4NTEsIDB4NEIsIDB4QjksIDB4NTQsIDB4NEUsIDB4NjIsIDB4MzYsIDB4ODYsIDB4QzQsIDB4NUUsDQorICAgIDB4MzksIDB4MDksIDB4NjgsIDB4QTMsIDB4QkUsIDB4NDAsIDB4NEYsIDB4M0QsIDB4RjQsIDB4RDQsIDB4NjMsIDB4MkIsIDB4MjEsIDB4QjUsIDB4MDcsIDB4RDQsIDB4NDcsIDB4RTgsIDB4ODEsIDB4NjcsDQorICAgIDB4NDEsIDB4RjAsIDB4MTgsIDB4OUQsIDB4RkMsIDB4NkUsIDB4MTIsIDB4M0IsIDB4RTksIDB4RDIsIDB4OUMsIDB4M0MsIDB4REYsIDB4N0MsIDB4OUYsIDB4NzcsIDB4RTYsIDB4QjMsIDB4MzMsIDB4MUIsDQorICAgIDB4QzMsIDB4RTcsIDB4MEUsIDB4RjYsIDB4MDksIDB4NjIsIDB4MzgsIDB4MjAsIDB4M0IsIDB4MUEsIDB4MDksIDB4M0YsIDB4NUEsIDB4MjcsIDB4MUEsIDB4NzIsIDB4NDksIDB4RTgsIDB4RUMsIDB4NjgsDQorICAgIDB4MEYsIDB4RDcsIDB4N0YsIDB4RUUsIDB4QkYsIDB4REMsIDB4REMsIDB4N0YsIDB4RkUsIDB4RjYsIDB4RjAsIDB4RkIsIDB4NjYsIDB4RkQsIDB4RUUsIDB4QzcsIDB4NEYsIDB4ODgsIDB4RUYsIDB4QkUsDQorICAgIDB4NUUsIDB4NkYsIDB4NjgsIDB4RTYsIDB4RDMsIDB4MjcsIDB4MDgsIDB4MTksIDB4QTksIDB4OEEsIDB4QjksIDB4NTgsIDB4NEMsIDB4RTYsIDB4ODEsIDB4Q0QsIDB4RkQsIDB4QjAsIDB4RDgsIDB4NjAsDQorICAgIDB4MkEsIDB4QzgsIDB4OTQsIDB4MEIsIDB4OEEsIDB4NTksIDB4Q0EsIDB4NUEsIDB4NDEsIDB4NDYsIDB4QzAsIDB4NTksIDB4RTQsIDB4MUQsIDB4NDEsIDB4MkEsIDB4NEMsIDB4RTMsIDB4OTUsIDB4M0MsDQorICAgIDB4MzYsIDB4MDksIDB4MjMsIDB4ODIsIDB4MUIsIDB4N0EsIDB4MUUsIDB4RDQsIDB4RjAsIDB4MzMsIDB4NjIsIDB4MEIsIDB4NzUsIDB4MjYsIDB4QzAsIDB4MjIsIDB4NTEsIDB4RTEsIDB4RDgsIDB4MTYsDQorICAgIDB4RDQsIDB4NTcsIDB4RjIsIDB4RTcsIDB4MkEsIDB4RkEsIDB4NzksIDB4Q0MsIDB4QTgsIDB4MUEsIDB4RjcsIDB4OTUsIDB4MzgsIDB4OUUsIDB4RjIsIDB4MzAsIDB4NTIsIDB4MjUsIDB4NDIsIDB4MzIsDQorICAgIDB4OEIsIDB4MjgsIDB4MDksIDB4QTAsIDB4NUMsIDB4NDUsIDB4OTIsIDB4M0IsIDB4NTEsIDB4QUMsIDB4Q0UsIDB4MzAsIDB4N0UsIDB4RDksIDB4QTksIDB4NzIsIDB4QTksIDB4MjMsIDB4RTUsIDB4NTAsDQorICAgIDB4QjEsIDB4QUUsIDB4MUMsIDB4QUMsIDB4M0IsIDB4OEEsIDB4QjAsIDB4NkQsIDB4OEIsIDB4MUQsIDB4RUQsIDB4ODUsIDB4RDYsIDB4QjIsIDB4NTYsIDB4NkQsIDB4QUMsIDB4REEsIDB4NTQsIDB4QjUsDQorICAgIDB4QTUsIDB4NkEsIDB4NDMsIDB4RDUsIDB4N0UsIDB4QUEsIDB4REQsIDB4NTQsIDB4N0IsIDB4QTksIDB4MzYsIDB4NTIsIDB4RUQsIDB4QTAsIDB4REEsIDB4M0QsIDB4QjUsIDB4NkYsIDB4RkQsIDB4OEUsDQorICAgIDB4QjksIDB4NzgsIDB4NUUsIDB4QkIsIDB4ODEsIDB4MTAsIDB4OTksIDB4MkUsIDB4MEYsIDB4MjgsIDB4NEIsIDB4Q0IsIDB4NDksIDB4ODMsIDB4MEEsIDB4RjUsIDB4NjMsIDB4NDYsIDB4QzIsIDB4MTYsDQorICAgIDB4MDYsIDB4MTYsIDB4NDUsIDB4MzIsIDB4NDgsIDB4NkYsIDB4N0YsIDB4MDksIDB4ODcsIDB4RkIsIDB4NTIsIDB4RTIsIDB4M0MsIDB4MjYsIDB4OTcsIDB4MTIsIDB4MDgsIDB4MjcsIDB4MkUsIDB4RTQsDQorICAgIDB4OEQsIDB4QzMsIDB4REIsIDB4RUYsIDB4MzYsIDB4NzYsIDB4MTcsIDB4MjUsIDB4QTAsIDB4NkMsIDB4QTUsIDB4QTgsIDB4QkEsIDB4NzUsIDB4Q0EsIDB4NDUsIDB4RjksIDB4NzIsIDB4RTksIDB4NzIsDQorICAgIDB4RTEsIDB4OEEsIDB4QUEsIDB4RTUsIDB4N0EsIDB4RTUsIDB4NjIsIDB4MTUsIDB4ODUsIDB4NzYsIDB4NTcsIDB4MTksIDB4MTAsIDB4NDEsIDB4NUQsIDB4QjgsIDB4QjYsIDB4RjUsIDB4NTcsIDB4QkMsDQorICAgIDB4ODAsIDB4Q0MsIDB4OTEsIDB4MDUsIDB4NjcsIDB4NTEsIDB4MDYsIDB4Q0QsIDB4RDQsIDB4QjgsIDB4OTUsIDB4NDIsIDB4OEIsIDB4QjAsIDB4QjYsIDB4MzksIDB4MTEsIDB4QjgsIDB4QjYsIDB4MkYsDQorICAgIDB4NDQsIDB4MjYsIDB4MUUsIDB4RUMsIDB4MEUsIDB4MEMsIDB4M0QsIDB4NUQsIDB4NTUsIDB4OTAsIDB4NUIsIDB4ODcsIDB4NTAsIDB4QjYsIDB4MkEsIDB4NDUsIDB4MzAsIDB4QTUsIDB4RjQsIDB4RDYsDQorICAgIDB4OTgsIDB4Q0EsIDB4NTEsIDB4MTcsIDB4NDcsIDB4NjQsIDB4OEMsIDB4QTMsIDB4MDgsIDB4MEUsIDB4QTYsIDB4NzIsIDB4QkIsIDB4NDIsIDB4OEEsIDB4NDksIDB4NzYsIDB4MTYsIDB4RkIsIDB4QkUsDQorICAgIDB4NjYsIDB4RUUsIDB4QzMsIDB4ODMsIDB4RjYsIDB4RDYsIDB4NjAsIDB4MjIsIDB4QTIsIDB4MzUsIDB4MEIsIDB4OUUsIDB4N0MsIDB4RjUsIDB4MDEsIDB4OUUsIDB4RDQsIDB4ODksIDB4NEEsIDB4RDMsDQorICAgIDB4QjUsIDB4ODksIDB4Q0YsIDB4RDksIDB4NTQsIDB4MzMsIDB4RkYsIDB4NUYsIDB4MUYsIDB4MTAsIDB4MTcsIDB4RTQsIDB4N0IsIDB4QkEsIDB4NjUsIDB4RTksIDB4NEIsIDB4NkIsIDB4NDIsIDB4OEYsDQorICAgIDB4OEIsIDB4NjgsIDB4QTEsIDB4NkEsIDB4NkIsIDB4MTAsIDB4NkEsIDB4MjAsIDB4ODUsIDB4MjMsIDB4MTEsIDB4MEQsIDB4NUEsIDB4OEUsIDB4RDQsIDB4OTAsIDB4ODYsIDB4MjMsIDB4OUUsIDB4QjcsDQorICAgIDB4NkQsIDB4NTksIDB4REIsIDB4OTMsIDB4MDksIDB4MUEsIDB4QTEsIDB4NTMsIDB4NDMsIDB4QUYsIDB4QjEsIDB4QkEsIDB4NjQsIDB4QjksIDB4MDcsIDB4OEYsIDB4OTYsIDB4NjUsIDB4QUQsIDB4MkYsDQorICAgIDB4NTQsIDB4NEIsIDB4NjksIDB4OEEsIDB4RDYsIDB4MzMsIDB4OTUsIDB4MkMsIDB4NDksIDB4M0IsIDB4NkYsIDB4RjUsIDB4NTksIDB4REMsIDB4ODUsIDB4NjMsIDB4NDAsIDB4Q0IsIDB4MEIsIDB4NzIsDQorICAgIDB4MTAsIDB4NUIsIDB4RDEsIDB4ODUsIDB4MTcsIDB4ODQsIDB4OTMsIDB4RkQsIDB4QkQsIDB4OTcsIDB4NTcsIDB4RUYsIDB4QjEsIDB4NzcsIDB4OTgsIDB4OUMsIDB4RTYsIDB4ODYsIDB4RDUsIDB4NDksDQorICAgIDB4OTksIDB4OTIsIDB4QzUsIDB4ODEsIDB4NEQsIDB4NDQsIDB4RDMsIDB4QjUsIDB4MDYsIDB4NTYsIDB4NTQsIDB4MDUsIDB4MTgsIDB4REMsIDB4NkQsIDB4NDcsIDB4MzMsIDB4OTMsIDB4Q0QsIDB4MjQsDQorICAgIDB4MTksIDB4MEUsIDB4OTIsIDB4MjQsIDB4MzEsIDB4RjQsIDB4MDYsIDB4QUYsIDB4NUIsIDB4RUEsIDB4QzQsIDB4NDIsIDB4MTAsIDB4RTYsIDB4Q0MsIDB4MzUsIDB4RjMsIDB4NTksIDB4MkUsIDB4MUUsDQorICAgIDB4MEUsIDB4M0YsIDB4QUQsIDB4NTcsIDB4Q0IsIDB4OEQsIDB4QTUsIDB4RjcsIDB4OTksIDB4MTEsIDB4RTEsIDB4MTAsIDB4MTYsIDB4MTUsIDB4MjUsIDB4QUMsIDB4Q0EsIDB4QkEsIDB4RDQsIDB4MUIsDQorICAgIDB4QTksIDB4OUYsIDB4QUEsIDB4QzcsIDB4NDUsIDB4REIsIDB4MkIsIDB4NEQsIDB4QTgsIDB4RDgsIDB4REUsIDB4MjUsIDB4MEUsIDB4MEQsIDB4MzAsIDB4NUMsIDB4OEUsIDB4NDEsIDB4QjksIDB4NEIsDQorICAgIDB4OUUsIDB4RUUsIDB4MTQsIDB4NEMsIDB4MDUsIDB4OEYsIDB4NjcsIDB4MzQsIDB4QkQsIDB4MTcsIDB4OUIsIDB4NEIsIDB4MkEsIDB4QUEsIDB4MEUsIDB4NTYsIDB4OTcsIDB4MTQsIDB4QzAsIDB4ODQsDQorICAgIDB4OEYsIDB4NDMsIDB4Q0QsIDB4REMsIDB4NUEsIDB4OTIsIDB4OUUsIDB4QzAsIDB4NzcsIDB4ODcsIDB4NjYsIDB4M0UsIDB4OTcsIDB4RDgsIDB4MEIsIDB4NjMsIDB4MUEsIDB4NjcsIDB4NUYsIDB4MUUsDQorICAgIDB4NEMsIDB4QzMsIDB4OTksIDB4MjYsIDB4NTgsIDB4REUsIDB4QzksIDB4MkMsIDB4ODAsIDB4MDMsIDB4ODQsIDB4NTksIDB4RDQsIDB4QzgsIDB4RjcsIDB4NjgsIDB4NjgsIDB4QzgsIDB4RDMsIDB4ODUsDQorICAgIDB4NjYsIDB4NUEsIDB4MjcsIDB4NDcsIDB4OEYsIDB4OTAsIDB4RDUsIDB4OEYsIDB4NDEsIDB4MTIsIDB4NjUsIDB4QzMsIDB4NTAsIDB4QUEsIDB4M0EsIDB4N0QsIDB4RjUsIDB4RTcsIDB4MzMsIDB4NzIsDQorICAgIDB4ODYsIDB4OUQsIDB4NzIsIDB4RTgsIDB4OTYsIDB4NjEsIDB4QjEsIDB4QTcsIDB4MzUsIDB4ODcsIDB4QUYsIDB4MzksIDB4MTcsIDB4OEQsIDB4QzEsIDB4MUQsIDB4NUQsIDB4NEQsIDB4QTAsIDB4RjAsDQorICAgIDB4NDksIDB4QzUsIDB4N0EsIDB4MDgsIDB4QkIsIDB4M0MsIDB4MTYsIDB4RjAsIDB4MTcsIDB4ODgsIDB4MjYsIDB4OTEsIDB4REIsIDB4QzEsIDB4MTgsIDB4QjksIDB4REMsIDB4MjYsIDB4NjgsIDB4NEMsDQorICAgIDB4RkYsIDB4NDksIDB4NzksIDB4OTUsIDB4N0UsIDB4MUYsIDB4NUUsIDB4RjUsIDB4NTIsIDB4NDYsIDB4MDIsIDB4REIsIDB4RjAsIDB4QUUsIDB4RjUsIDB4NTEsIDB4OEUsIDB4M0QsIDB4NEMsIDB4M0IsDQorICAgIDB4MDgsIDB4ODcsIDB4M0MsIDB4ODksIDB4MkYsIDB4MzAsIDB4M0EsIDB4RTAsIDB4OTEsIDB4NDcsIDB4OUQsIDB4QjQsIDB4QTcsIDB4QUQsIDB4NzcsIDB4QUYsIDB4OTEsIDB4RDUsIDB4NEYsIDB4MDYsDQorICAgIDB4MDMsIDB4MUMsIDB4OEYsIDB4OTcsIDB4RTQsIDB4QjcsIDB4QkQsIDB4M0YsIDB4MEQsIDB4REMsIDB4NjksIDB4REEsIDB4MjUsIDB4N0EsIDB4RDMsIDB4NEIsIDB4OUIsIDB4RjAsIDB4QTUsIDB4NjgsDQorICAgIDB4RDYsIDB4M0MsIDB4NjYsIDB4RDMsIDB4NzMsIDB4OUUsIDB4MzEsIDB4RjMsIDB4MjIsIDB4QjMsIDB4MTEsIDB4NTcsIDB4M0IsIDB4NEYsIDB4NDMsIDB4Q0YsIDB4M0YsIDB4RUYsIDB4Q0QsIDB4QkYsDQorICAgIDB4QzQsIDB4QjUsIDB4RDQsIDB4MDQNCit9Ow0KK2NvbnN0IEZYX0JZVEUgZ19kZURFX0xvYWNhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHg0RCwgMHg2RiwgMHhENCwgMHgzMCwgMHgxMCwgMHhCRCwgMHgyMywgMHhGMSwgMHgxRiwgMHhBQywgMHg4OCwgMHhBQSwgMHgyMCwgMHhCNSwgMHgxQiwgMHgzOCwNCisgICAgMHhCNiwgMHhEQSwgMHg0NiwgMHg1QSwgMHg3NSwgMHhGQiwgMHg0MSwgMHg0QiwgMHhDQSwgMHhBQSwgMHg2OSwgMHg0MSwgMHhGNCwgMHg4MiwgMHhCQywgMHg4OSwgMHhCQiwgMHg3MSwgMHg5QiwgMHhEOCwNCisgICAgMHgyQiwgMHhDNywgMHg2OSwgMHhCNSwgMHgzOSwgMHhGMiwgMHgzNywgMHhCOCwgMHg3MiwgMHgwNCwgMHg3MSwgMHhFNCwgMHgwNCwgMHgxNywgMHhGRSwgMHgwOSwgMHg1MiwgMHgyNSwgMHg3RSwgMHgwNiwNCisgICAgMHg5MywgMHg4RCwgMHg5MywgMHgyNiwgMHhCNiwgMHhCQiwgMHgwRCwgMHhCOSwgMHhBQywgMHhFNywgMHhDRCwgMHg3QiwgMHhCMywgMHgzMywgMHhDRiwgMHg4OSwgMHg5MywgMHg2MSwgMHhDMiwgMHg0MywNCisgICAgMHg5QywgMHgxMCwgMHhDNCwgMHg3MCwgMHg0QSwgMHg3NiwgMHg5QywgMHg4OCwgMHg3QywgMHgxQywgMHhFRiwgMHgzOSwgMHgyOCwgMHgyMiwgMHg1OSwgMHhCOCwgMHhFMywgMHhEQywgMHhGRCwgMHhGQSwNCisgICAgMHhGMSwgMHhGNywgMHhGQiwgMHhCNywgMHhFNywgMHhGMCwgMHg3MywgMHhGNywgMHhGOSwgMHhFNywgMHgwQiwgMHhDNywgMHgxQiwgMHg5NiwgMHg0NCwgMHgxNiwgMHg2MSwgMHgxMSwgMHgyQywgMHhEMiwNCisgICAgMHgyOSwgMHg0RiwgMHgzMiwgMHhBNSwgMHg5OSwgMHgwOSwgMHgzMiwgMHhFMywgMHg4MiwgMHg2MiwgMHgwNiwgMHg4QywgMHg5NCwgMHgzMywgMHgxOSwgMHg5RiwgMHgwMCwgMHg5QywgMHhBOSwgMHhCNSwNCisgICAgMHg3NywgMHg4NCwgMHg1OSwgMHg4RSwgMHhDNSwgMHhEMCwgMHhBRCwgMHhBMiwgMHhBNywgMHg0RiwgMHgxNCwgMHhCQywgMHg0RiwgMHhBNiwgMHhDMiwgMHg4NiwgMHhGQiwgMHhCRiwgMHhCRiwgMHg4OCwNCisgICAgMHhDMiwgMHg0MCwgMHg0NywgMHg3MywgMHg0MSwgMHgxMywgMHg5MywgMHg4QiwgMHhBOSwgMHg4MSwgMHgxRCwgMHhFNSwgMHhDQywgMHgwNiwgMHgyNiwgMHgyNiwgMHgzOCwgMHhDQSwgMHg2NywgMHg3OSwNCisgICAgMHgyNiwgMHgwRCwgMHgzOCwgMHgyMCwgMHg3MywgMHg0OSwgMHhEMiwgMHgyOSwgMHgzMSwgMHg1QiwgMHg3QiwgMHg3QiwgMHgyRCwgMHhCOSwgMHgwRCwgMHgzRiwgMHhFMSwgMHgzNywgMHg3NiwgMHhDMSwNCisgICAgMHg5OCwgMHgxNCwgMHg3QSwgMHhDMiwgMHg2RCwgMHgxOSwgMHg1NCwgMHhGMywgMHg5NiwgMHgxMSwgMHhDMiwgMHhEMywgMHhBOSwgMHhEOCwgMHg3MSwgMHg1RSwgMHgzOSwgMHgyRCwgMHhERiwgMHg2QywNCisgICAgMHhBNiwgMHg5OSwgMHgyNiwgMHhEOCwgMHhFRCwgMHhFQSwgMHg2QiwgMHg5NiwgMHhDRCwgMHgyQiwgMHg5QiwgMHg1NSwgMHgzNiwgMHg5RiwgMHg2QywgMHgwRSwgMHhEOSwgMHhEQywgMHhCMSwgMHgxOSwNCisgICAgMHhGMywgMHhCMCwgMHgyNywgMHgxMSwgMHg1RSwgMHhBOCwgMHgxQiwgMHgwOCwgMHg1NiwgMHg1RSwgMHhDMCwgMHgxOSwgMHg5MywgMHgxOCwgMHhGRSwgMHhCRSwgMHgwQywgMHhBQSwgMHhBQywgMHhFNywNCisgICAgMHg3MywgMHgwMywgMHgxQSwgMHg1MywgMHhDMiwgMHgzMiwgMHg4MywgMHg0NywgMHhBNSwgMHhCQywgMHhFNSwgMHg2MSwgMHhEQywgMHg2NSwgMHg0MiwgMHg0MSwgMHgyMiwgMHgwQywgMHhFRSwgMHhCRSwNCisgICAgMHgyMCwgMHg1NCwgMHhDNywgMHgwMiwgMHg5QywgMHg3NiwgMHg3OCwgMHg2RSwgMHhEMywgMHg1QSwgMHhBQiwgMHhDRCwgMHhENiwgMHhDNiwgMHg1NSwgMHhGRCwgMHg2QSwgMHhBRCwgMHg2QSwgMHg2RCwNCisgICAgMHg2QSwgMHgwRCwgMHg2QSwgMHhBRCwgMHg2OSwgMHgyRCwgMHg2OSwgMHhERCwgMHhEOCwgMHgxQiwgMHg0OSwgMHg4OSwgMHhBMCwgMHgxMSwgMHgyNSwgMHg2OSwgMHhGRCwgMHhENCwgMHhBOSwgMHhEMCwNCisgICAgMHgxQiwgMHhGOSwgMHhFMCwgMHg2QywgMHgxRCwgMHhCNCwgMHg3OCwgMHhERSwgMHg0NCwgMHg0QiwgMHhCOCwgMHhERCwgMHgwQSwgMHg4MCwgMHgxMCwgMHg4MSwgMHg1NSwgMHgzNSwgMHg1OCwgMHg3OSwNCisgICAgMHgzNywgMHgwMywgMHhCNCwgMHgxQiwgMHg4QiwgMHhDMSwgMHhEMCwgMHgyRCwgMHg4MywgMHgyQSwgMHhFQiwgMHgzMSwgMHgwRCwgMHg3MywgMHgxQiwgMHg0OSwgMHgxOSwgMHg2OCwgMHhFNywgMHg0NCwNCisgICAgMHgzNSwgMHg4MSwgMHgyNCwgMHgxMywgMHgyQywgMHgyNSwgMHgxMSwgMHg2QywgMHhCOSwgMHhCMywgMHg0RCwgMHhBNCwgMHgwRSwgMHg5MSwgMHhDQiwgMHgzQywgMHg0OSwgMHgxQywgMHg2RiwgMHgwRiwNCisgICAgMHhBRSwgMHgwRCwgMHgzNCwgMHgxRSwgMHgyMCwgMHgxRiwgMHgyRSwgMHhGNCwgMHgwMSwgMHhBRSwgMHg3MiwgMHhENiwgMHg4NiwgMHhBQiwgMHgxNSwgMHg1MiwgMHhEMiwgMHg4NCwgMHhCMywgMHg5OSwNCisgICAgMHhFMywgMHhGRCwgMHhBNywgMHgyOCwgMHgyNSwgMHgxMSwgMHg2OCwgMHhDNiwgMHgwMywgMHhERiwgMHgxRiwgMHhGNCwgMHg1NCwgMHg2NCwgMHgzMSwgMHgxNywgMHhGMiwgMHg1RSwgMHg2MywgMHgyOCwNCisgICAgMHhEQywgMHhDRSwgMHg4OCwgMHgwMCwgMHg0OCwgMHg5QSwgMHhCNiwgMHg0NiwgMHg2RSwgMHg0NSwgMHg5RCwgMHg5MSwgMHgwRiwgMHhCNywgMHg3RCwgMHg3RiwgMHgxRCwgMHg5RCwgMHhDNywgMHgwMiwNCisgICAgMHhBRCwgMHg1RiwgMHgwQywgMHhERCwgMHgxNiwgMHg0QiwgMHgyQiwgMHhEMSwgMHgxOSwgMHhGNiwgMHhCMCwgMHg1NCwgMHg2RCwgMHgwNywgMHgwMSwgMHhFQSwgMHgyMywgMHg1OSwgMHg4RSwgMHg1QSwNCisgICAgMHgyQiwgMHg3QSwgMHhGMCwgMHhENSwgMHhBMCwgMHg0QiwgMHg4NSwgMHg0MSwgMHg3NywgMHgzQiwgMHg1MywgMHgyOSwgMHhBMywgMHhDRSwgMHgwMCwgMHhBQiwgMHhGNywgMHhGQSwgMHhFMCwgMHhDQSwNCisgICAgMHg5NywgMHhENywgMHg4NywgMHg2OSwgMHgxNiwgMHhFQywgMHg4RCwgMHhGNywgMHg2RiwgMHhERiwgMHhFMywgMHhGOCwgMHhCOCwgMHhCOCwgMHhBOCwgMHhBQywgMHg2OSwgMHg5MywgMHg0MCwgMHhDNywNCisgICAgMHhGMiwgMHhGMiwgMHg2OCwgMHhCQywgMHhGNywgMHhBNywgMHgxMywgMHhBQiwgMHg0RSwgMHgwMCwgMHg4MywgMHg1QiwgMHgzMywgMHg3NCwgMHhCQywgMHg2MiwgMHhBMywgMHgyOCwgMHhCNiwgMHgwNiwNCisgICAgMHg0NSwgMHgwMSwgMHhDNywgMHg0NiwgMHg4NywgMHg2NywgMHgxNCwgMHg1MiwgMHhDMiwgMHgzMCwgMHgxNywgMHg4MiwgMHhCMCwgMHg3MCwgMHg1MSwgMHgyQiwgMHhCNywgMHhCNiwgMHhEMCwgMHhCMywNCisgICAgMHg5RSwgMHhEMiwgMHgzOSwgMHgxMSwgMHgyMSwgMHg2MSwgMHg1MiwgMHgyOSwgMHhENywgMHgyQywgMHgyQSwgMHg1NywgMHg2QiwgMHhCRCwgMHgyOSwgMHg1NCwgMHg0RiwgMHhENywgMHgwOSwgMHg5QiwNCisgICAgMHgxNywgMHg2QiwgMHg0OCwgMHg1MywgMHgwQywgMHhGQiwgMHhCRCwgMHg1MSwgMHhFQiwgMHhBQiwgMHhCNCwgMHhBRSwgMHg2RSwgMHhERSwgMHhBOSwgMHgzQywgMHg5RiwgMHhEMywgMHg3MiwgMHhBQiwNCisgICAgMHgwNywgMHhCRCwgMHhGOCwgMHg0RCwgMHhENywgMHg2QiwgMHhCRCwgMHhFOCwgMHgyOSwgMHg2NSwgMHg3OSwgMHhFNiwgMHg3OCwgMHg5QiwgMHhCRCwgMHhDOCwgMHgwNSwgMHgxMSwgMHhEQywgMHhGMSwNCisgICAgMHg1RSwgMHg5QSwgMHg1QywgMHhCNywgMHgzQiwgMHgzNiwgMHgyMCwgMHhCNSwgMHhFRiwgMHg4RCwgMHgxMywgMHg1RCwgMHhBMCwgMHhCRSwgMHhDMSwgMHg5NiwgMHg4MSwgMHhFMywgMHhGRCwgMHhGOSwNCisgICAgMHhGNCwgMHgxNSwgMHhDRSwgMHg4QSwgMHgwRSwgMHhDMywgMHgyQywgMHhBMiwgMHgzNCwgMHgzNCwgMHhFMywgMHhFNSwgMHgwMiwgMHg4RSwgMHg4OCwgMHhGMywgMHhEMywgMHhERSwgMHhBMiwgMHhCNiwNCisgICAgMHhFOSwgMHhBNiwgMHhDNCwgMHhENSwgMHhCQiwgMHgyRCwgMHg5RiwgMHg4NiwgMHhDNSwgMHg5QywgMHg1QywgMHhFMiwgMHhCMCwgMHgzQywgMHhGQSwgMHhFQSwgMHhBNSwgMHhBQSwgMHhFNSwgMHgyRiwNCisgICAgMHhFMCwgMHgxMywgMHgyNywgMHg0MiwgMHgxMywgMHhGMCwgMHhDMiwgMHg2RCwgMHgzMywgMHhFQiwgMHgzNCwgMHg2NSwgMHg5NCwgMHhCMywgMHgwNywgMHhEMywgMHhCQiwgMHgzQywgMHgxNywgMHg5NCwNCisgICAgMHgwOCwgMHgxNCwgMHhDOCwgMHhDOCwgMHg5QSwgMHgxRiwgMHg0NSwgMHhGMCwgMHg2OSwgMHg4MSwgMHgyNiwgMHhGNCwgMHgxMSwgMHhDMiwgMHgyMSwgMHg3QywgMHgzNSwgMHg5MSwgMHhEQiwgMHgxNSwNCisgICAgMHg4NCwgMHg5MSwgMHhDMCwgMHg1MywgMHg3OCwgMHg2MCwgMHgxRSwgMHgyNiwgMHg5QywgMHhDNSwgMHg5OCwgMHg1QSwgMHhEMywgMHhDNywgMHhCQywgMHhDOCwgMHhBRiwgMHgzMSwgMHgzQSwgMHhFMCwNCisgICAgMHgzMiwgMHhBNiwgMHg2MSwgMHgzOSwgMHhDNywgMHhFNiwgMHhCQiwgMHhENywgMHhDOCwgMHg1RiwgMHg0NSwgMHg4NSwgMHg5MSwgMHhDMywgMHg5OCwgMHhENywgMHhENCwgMHhEMywgMHgxNSwgMHg3RiwNCisgICAgMHgwQSwgMHhDQywgMHg1OSwgMHgzOSwgMHgxOSwgMHg3QSwgMHhCMywgMHg4MiwgMHgwNCwgMHg2RiwgMHhGQSwgMHhDNywgMHg0OSwgMHhGRSwgMHgyMiwgMHg2NywgMHhCMywgMHgyQiwgMHhCRSwgMHhFNCwNCisgICAgMHhBOSwgMHhFNiwgMHhEQywgMHhGQiwgMHgzRCwgMHgyQiwgMHhBMywgMHhFQSwgMHg3MywgMHgxNiwgMHg5NiwgMHhGRiwgMHgwMCwgMHgyOSwgMHgyNywgMHhBRiwgMHgxNywNCit9Ow0KK2NvbnN0IEZYX0JZVEUgZ19mckZSX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDZGLCAweEQzLCAweDQwLCAweDEwLCAweEJELCAweDIzLCAweEYxLCAweDFGLCAweDU2LCAweDE2LCAweDU1LCAweDQxLCAweDZBLCAweEJELCAweDcwLA0KKyAgICAweDRDLCAweDk1LCAweDVBLCAweEFBLCAweEZBLCAweDE1LCAweDI4LCAweDQ2LCAweDUxLCAweDUzLCAweDQwLCAweEY0LCAweDgyLCAweDM2LCAweEY2LCAweDM2LCAweERFLCAweEQ0LCAweERFLCAweDhELA0KKyAgICAweEQ2LCAweDc2LCAweDRBLCAweDdDLCAweEU0LCAweDNGLCAweDcwLCAweEUyLCAweEMyLCAweEI1LCAweDEyLCAweDg4LCAweDAzLCAweDQ3LCAweEM0LCAweDg1LCAweEZFLCAweDEzLCAweDI0LCAweDEwLA0KKyAgICAweDNGLCAweDgzLCAweDcxLCAweEJDLCAweDc2LCAweEVELCAweDVELCAweDI3LCAweEI4LCAweEJFLCAweDY0LCAweEU3LCAweENELCAweDdCLCAweEUzLCAweDk5LCAweEI3LCAweEY2LCAweEM2LCAweEZELA0KKyAgICAweDUwLCAweDc4LCAweDI0LCAweEE0LCAweDg4LCAweDkzLCAweDg4LCAweEVFLCAweDVBLCAweDE3LCAweEYyLCAweEVELCAweEQxLCAweEE5LCAweDg1LCAweDdDLCAweDFBLCAweDdCLCAweEJCLCAweEQ2LA0KKyAgICAweDlGLCAweDZGLCAweDFGLCAweEZFLCAweDdFLCAweEZELCAweEYyLCAweDEwLCAweDdFLCAweDdFLCAweDdGLCAweEZDLCAweEYxLCAweEM4LCAweDcyLCAweEZBLCAweDM5LCAweDkxLCAweEZCLCAweDQ0LA0KKyAgICAweDhFLCAweDE2LCAweEQxLCAweDU4LCAweDg0LCAweEIxLCAweEQyLCAweDRDLCAweDI0LCAweDlELCAweDA4LCAweEM5LCAweDA4LCAweDA3LCAweDQ2LCAweDI0LCAweDc4LCAweDEyLCAweEJDLCAweDAwLA0KKyAgICAweDM4LCAweDU2LCAweDZCLCAweDY3LCAweDRBLCAweEY4LCAweDlDLCAweDUxLCAweEQ5LCAweEM3LCAweDQ1LCAweDc4LCAweEZGLCAweDlFLCAweEMyLCAweDJGLCAweDZFLCAweEFFLCAweEU3LCAweEIyLA0KKyAgICAweDJELCAweDExLCAweDExLCAweDE5LCAweDFCLCAweDIwLCAweDAxLCAweDZFLCAweEQ4LCAweDQyLCAweDY1LCAweDA2LCAweDM2LCAweDRELCAweDE5LCAweDZGLCAweDAzLCAweEMzLCAweDkwLCAweDI2LA0KKyAgICAweDY2LCAweDU5LCAweDcxLCAweEYzLCAweERELCAweDQ0LCAweDYzLCAweDNBLCAweDRCLCAweDY4LCAweDM0LCAweDk2LCAweEQ0LCAweEM4LCAweDA4LCAweDJGLCAweDExLCAweDZELCAweDM4LCAweDE3LA0KKyAgICAweEYzLCAweDc2LCAweDgxLCAweDdGLCAweDczLCAweEVELCAweEU5LCAweDE5LCAweDVDLCAweDMzLCAweEE5LCAweDI0LCAweDJFLCAweDIzLCAweDQ0LCAweEM2LCAweDYzLCAweEI5LCAweDZCLCAweDNELA0KKyAgICAweEIxLCAweEVBLCAweERFLCAweEQ5LCAweEVELCAweENFLCAweDk5LCAweEYwLCAweDJBLCAweERGLCAweERBLCAweDk4LCAweDc3LCAweEIwLCAweENELCAweDk0LCAweEFGLCAweDM2LCAweENELCAweEU0LA0KKyAgICAweDgyLCAweDYxLCAweDI2LCAweDA4LCAweDZFLCAweDk5LCAweDYwLCAweEVFLCAweDk0LCAweEJELCAweERBLCAweDI1LCAweDlGLCAweDJDLCAweEQ0LCAweDYzLCAweDA1LCAweDJCLCAweEM3LCAweDY3LA0KKyAgICAweDExLCAweEUxLCAweDVFLCAweDAwLCAweEFFLCAweEU2LCAweDUxLCAweDkxLCAweDc2LCAweEMyLCAweDk0LCAweEZCLCAweEFDLCAweDgxLCAweDgwLCAweDI1LCAweDNBLCAweDQyLCAweEE1LCAweDI3LA0KKyAgICAweEE5LCAweDA2LCAweDRFLCAweDY5LCAweEFBLCAweDIxLCAweDczLCAweDc4LCAweENDLCAweDBELCAweDVBLCAweDBDLCAweEY3LCAweEFGLCAweDQxLCAweEI4LCAweDZBLCAweEE5LCAweEQ2LCAweDVFLA0KKyAgICAweDZELCAweDBCLCAweDU1LCAweDlGLCAweEI2LCAweERFLCAweEEzLCAweEFELCAweEI3LCAweDY4LCAweEVCLCAweDFELCAweERBLCAweDdBLCAweDc3LCAweEI2LCAweERFLCAweDlDLCAweEFELCAweDM3LA0KKyAgICAweDY2LCAweEI3LCAweEI3LCAweDA1LCAweEM1LCAweDk4LCAweENGLCAweDY4LCAweDU0LCAweEJFLCAweDkxLCAweDJBLCAweDc0LCAweEY2LCAweDVDLCAweEYwLCAweEI3LCAweDBDLCAweDZBLCAweDNDLA0KKyAgICAweDY3LCAweEE4LCAweDI1LCAweDcwLCAweEIzLCAweDAyLCAweDIwLCAweDU0LCAweDEyLCAweDU1LCAweDBELCAweDU2LCAweEYwLCAweDdDLCAweEQ5LCAweEU4LCAweDk5LCAweEJELCAweEJELCAweDBGLA0KKyAgICAweEY3LCAweENGLCAweEMzLCAweDIyLCAweEVGLCAweDkwLCAweDk5LCAweDhFLCAweEUyLCAweDRBLCAweDk2LCAweDA3LCAweERBLCAweDM5LCAweDUyLCAweENDLCAweDkxLCAweEQwLCAweDIxLCAweDQ5LA0KKyAgICAweDEyLCAweDJBLCAweEY5LCAweDcyLCAweDhGLCAweEFCLCAweEE4LCAweDNDLCAweDk4LCAweEQyLCAweDMwLCAweEI0LCAweDlDLCAweDQzLCAweEI4LCAweEQwLCAweDAxLCAweDcyLCAweEUxLCAweDQyLA0KKyAgICAweDZGLCAweEUwLCAweENBLCAweEE3LCAweEFELCAweDk4LCAweDVBLCAweDE5LCAweDI1LCAweDBDLCAweDA1LCAweDlGLCAweDU4LCAweENFLCAweERELCAweDM0LCAweEIwLCAweENGLCAweDRBLCAweDgyLA0KKyAgICAweDNBLCAweEYxLCAweEUzLCAweDQwLCAweEM4LCAweDA0LCAweDE0LCAweDA3LCAweEQ4LCAweDc1LCAweDcxLCAweDhCLCAweDAyLCAweDM3LCAweEE2LCAweDAzLCAweDIwLCAweDYxLCAweDUxLCAweDZELA0KKyAgICAweERBLCAweDVBLCAweEQ0LCAweDk4LCAweDc2LCAweDMwLCAweEQ4LCAweDQ0LCAweDAxLCAweERBLCAweDg0LCAweDJFLCAweENFLCAweEZCLCAweEI4LCAweDQ2LCAweEQyLCAweDJBLCAweDM0LCAweDA2LA0KKyAgICAweDFELCAweDBDLCAweDc2LCAweDVDLCAweDc3LCAweDY3LCAweDM0LCAweEVBLCAweDI0LCAweDU5LCAweENFLCAweDU5LCAweDJBLCAweDNBLCAweEYwLCAweEQ1LCAweDlDLCAweDRCLCAweDg1LCAweDQxLA0KKyAgICAweEM3LCAweDhELCAweEExLCAweDk0LCAweDRGLCAweDY3LCAweDgwLCAweDk1LCAweEJCLCAweDdDLCAweDRDLCAweERDLCAweEU5LCAweEU1LCAweDIwLCAweDhBLCAweDQ3LCAweDg3LCAweDA3LCAweDQ3LA0KKyAgICAweDU3LCAweEFGLCAweERGLCAweDA1LCAweDI3LCAweEQ5LCAweDc5LCAweEUxLCAweDRDLCAweDlELCAweDA0LCAweDNBLCAweDlFLCAweDQ2LCAweDYzLCAweDJBLCAweDZGLCAweEVELCAweDY5LCAweEM0LA0KKyAgICAweEFBLCAweDEzLCAweEMwLCAweEUwLCAweEMxLCAweEY0LCAweDJDLCAweDI3LCAweERCLCAweENBLCAweEIyLCAweDlFLCAweDlELCAweDY1LCAweDU5LCAweDFGLCAweDM3LCAweDc4LCAweDQ2LCAweDIxLA0KKyAgICAweDI1LCAweEY0LCAweDUyLCAweDI5LCAweDI5LCAweEY3LCAweDE2LCAweEE1LCAweEIyLCAweEQ3LCAweDQzLCAweDBGLCAweDNBLCAweDRBLCAweDY3LCAweDcwLCAweDc2LCAweDUwLCAweDlFLCAweDI4LA0KKyAgICAweEU1LCAweDQ2LCAweDhCLCAweDBBLCAweDZCLCAweEFELCAweDU3LCAweDg1LCAweENBLCAweEU5LCAweDFBLCAweEExLCAweDJBLCAweEVCLCAweDUzLCAweDBGLCAweDRFLCAweDMzLCAweEQ4LCAweEVFLA0KKyAgICAweEFELCAweDUyLCAweDVGLCAweEE0LCAweDc1LCAweDc1LCAweEY1LCAweDZGLCAweDJCLCAweEQyLCAweDE5LCAweENCLCAweEI3LCAweEZBLCAweEU3LCAweEE3LCAweDRFLCAweDgyLCAweEFBLCAweEVELA0KKyAgICAweDhELCAweDRFLCAweEY0LCAweDg4LCAweEYxLCAweDM0LCAweEI2LCAweDlDLCAweEVELCAweDRFLCAweEU0LCAweDhDLCAweDRBLCAweDYxLCAweDM5LCAweDhGLCAweDRELCAweDJFLCAweDZFLCAweENFLA0KKyAgICAweDBELCAweDQ4LCAweDY5LCAweDdDLCAweDY1LCAweDQ1LCAweDEzLCAweDI4LCAweDlGLCAweEIwLCAweDY1LCAweDYwLCAweDM5LCAweEJGLCAweERFLCAweDdGLCAweDg2LCAweDYzLCAweEEyLCAweEMxLA0KKyAgICAweDMwLCAweDhCLCAweDI4LCAweDBELCAweDhCLCAweDQ1LCAweEJFLCAweDgwLCAweEQzLCAweEUxLCAweEU1LCAweDY5LCAweDY3LCAweDUxLCAweERELCAweDc1LCAweDUzLCAweDgyLCAweEY1LCAweDZFLA0KKyAgICAweEYzLCAweEQ3LCAweDYxLCAweDMxLCAweEEzLCAweDE3LCAweEM0LCAweENCLCAweDRGLCAweEJFLCAweDcyLCAweEE5LCAweDZBLCAweEI5LCAweDBCLCAweEY4LCAweEZBLCAweEYxLCAweEQxLCAweDEwLA0KKyAgICAweEJDLCAweEMwLCAweDc1LCAweDY2LCAweDk5LCAweDY2LCAweDlDLCAweDA5LCAweEJFLCAweDMyLCAweEJELCAweDJGLCAweEQyLCAweEZDLCAweDNCLCAweDA4LCAweDhELCAweDEyLCAweEJGLCAweDM1LA0KKyAgICAweEJGLCAweEU3LCAweDhCLCAweDMxLCAweDQ1LCAweDQzLCAweEY2LCAweDFGLCAweEMyLCAweDgwLCAweEMyLCAweDU3LCAweEM2LCAweEQ1LCAweDFBLCAweEMyLCAweDlFLCAweDI0LCAweDYzLCAweDc4LA0KKyAgICAweDYzLCAweDU2LCAweDEzLCAweENFLCAweDAyLCAweEMyLCAweDVBLCAweEQzLCAweDI3LCAweDIyLCAweDRCLCAweDJGLCAweDA5LCAweDNBLCAweDE2LCAweDQ5LCAweEMwLCAweEJDLCAweDdDLCAweDhFLA0KKyAgICAweEVELCAweDU3LCAweDRGLCAweDkxLCAweEJCLCAweDhFLCAweDBBLCAweDIzLCAweDdCLCAweDgxLCAweDI4LCAweEE5LCAweEE3LCAweDZCLCAweDZFLCAweDBBLCAweENDLCAweDQ5LCAweDNFLCAweDE5LA0KKyAgICAweDdBLCAweEJFLCAweDg2LCAweDM0LCAweDEyLCAweDFELCAweDQ4LCAweEVFLCAweDIyLCAweEU1LCAweDkzLCAweEE5LCAweDU4LCAweEYyLCAweDU0LCAweDczLCAweEY4LCAweDc2LCAweENGLCAweEYyLA0KKyAgICAweEE4LCAweEY4LCAweEQyLCAweDg1LCAweEU1LCAweDNGLCAweDVELCAweDQ5LCAweEJFLCAweDFCDQorfTsNCitjb25zdCBGWF9CWVRFIGdfaXRJVF9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2QSwgMHhENCwgMHg0MCwgMHgxNCwgMHg3RCwgMHgxNywgMHhGQywgMHg4NywgMHgyMSwgMHg1OCwgMHg1MCwgMHg2OCwgMHgzQiwgMHhGQSwgMHhEOCwNCisgICAgMHg5MiwgMHgwNiwgMHg0QSwgMHg1QiwgMHhCQiwgMHhBNSwgMHg0NiwgMHg5NiwgMHhFRSwgMHhBQSwgMHhEOCwgMHgxNywgMHg5OSwgMHg2NCwgMHhBNiwgMHhEOSwgMHhCMSwgMHhDOSwgMHhDQywgMHgzMiwNCisgICAgMHg0OSwgMHg1QSwgMHg5MiwgMHg0NywgMHhGMSwgMHhDMSwgMHgzNywgMHg3RiwgMHg0MiwgMHgxMCwgMHg0MSwgMHhGMSwgMHgyMywgMHhGQywgMHgxMywgMHhBMSwgMHhFMiwgMHg2NywgMHg3OCwgMHhCMywNCisgICAgMHg5OSwgMHhBNCwgMHhDOSwgMHg2NCwgMHhCQSwgMHhBNiwgMHg3OSwgMHhEOSwgMHhCOSwgMHhFNywgMHg5RSwgMHg3MywgMHg3MywgMHhFRiwgMHg5OSwgMHg2NCwgMHgzNiwgMHg2RSwgMHgyQywgMHg0MywNCisgICAgMHgxMiwgMHgzMywgMHgyNCwgMHg0OCwgMHhDMiwgMHhGNiwgMHgxQywgMHg5RSwgMHhCRCwgMHgzQiwgMHg5OSwgMHgzQiwgMHg4OCwgMHhCMiwgMHgzNCwgMHhEQywgMHg3MywgMHhGRSwgMHg3QywgMHhGQywNCisgICAgMHg3QywgMHhGMywgMHhFNSwgMHhFQiwgMHhDRCwgMHhBNywgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRSwgMHg3OCwgMHhEQywgMHgwNiwgMHg0RiwgMHgxQywgMHhDRiwgMHhBRCwgMHgxNCwgMHg4MiwgMHgxMiwNCisgICAgMHgzNSwgMHgyQiwgMHg5MiwgMHg0MCwgMHhDNiwgMHhBOSwgMHgxNiwgMHg0NywgMHg4QSwgMHg0NSwgMHg1MiwgMHg3MSwgMHgyMiwgMHg4MCwgMHg5MSwgMHg0OCwgMHg5MSwgMHgyRCwgMHg1RSwgMHgwMiwNCisgICAgMHg5QywgMHhFQSwgMHhCNSwgMHgxNywgMHgzMSwgMHgyMSwgMHgwOCwgMHg5NywgMHgyRSwgMHhBRSwgMHhDMywgMHg4NywgMHgwRiwgMHgzNCwgMHg3RSwgMHhDMSwgMHg4MiwgMHg0MCwgMHhEOSwgMHgxMiwNCisgICAgMHgwOSwgMHg1MSwgMHhFNSwgMHgxMCwgMHgyNSwgMHg0QiwgMHhDNSwgMHg2MywgMHg2NiwgMHgyMSwgMHg0NywgMHg5MSwgMHhBNSwgMHg0NiwgMHhDNCwgMHhGMywgMHg0OCwgMHgwQywgMHhFMSwgMHgzOCwNCisgICAgMHg4RiwgMHg2MiwgMHgwQiwgMHg5QiwgMHg0NCwgMHgzMiwgMHhDRCwgMHg4NiwgMHg3MCwgMHhDQSwgMHhCMiwgMHg4QywgMHgyNSwgMHg4MSwgMHgxQSwgMHhERSwgMHg1NSwgMHg2NiwgMHg5OSwgMHhCNCwNCisgICAgMHhFMSwgMHg0MiwgMHg1RSwgMHhEOSwgMHgwNSwgMHg5NCwgMHg4NywgMHg2NiwgMHgwMiwgMHg3NywgMHhBQywgMHg2QSwgMHg3OCwgMHhBQiwgMHgwOCwgMHgxMSwgMHgzMCwgMHg2NiwgMHhDRiwgMHg3OSwNCisgICAgMHhFNiwgMHg3NCwgMHgxQywgMHhCNCwgMHhCOSwgMHg2NywgMHgzMywgMHhDRSwgMHg2NiwgMHg5QiwgMHhDRCwgMHgzMywgMHg5QiwgMHg2MSwgMHgzNiwgMHhCNywgMHg2QywgMHg1NiwgMHhEOSwgMHg3QywNCisgICAgMHhCMiwgMHgzOSwgMHg2NCwgMHg3MywgMHhDNywgMHg2NiwgMHhDQywgMHhERCwgMHg5RSwgMHg1MCwgMHg1MiwgMHhFOCwgMHg0NywgMHgwOSwgMHg1NiwgMHgxRSwgMHg5NSwgMHgwOSwgMHgxMywgMHgzQywNCisgICAgMHgyNCwgMHgyRSwgMHhBRSwgMHhBMiwgMHgzQSwgMHgwRCwgMHgzRCwgMHgwQSwgMHg0NiwgMHg3RiwgMHg3RCwgMHhFRiwgMHg2MSwgMHhFMCwgMHg0MywgMHgzNiwgMHgwNCwgMHg5OSwgMHgwQSwgMHg2NSwNCisgICAgMHgzQywgMHg4MCwgMHhFMSwgMHhFMSwgMHhCOSwgMHgxQSwgMHg4MCwgMHg1NywgMHg0QywgMHgzMCwgMHg2NSwgMHg4MiwgMHgyOSwgMHgwOSwgMHg0OCwgMHhGNSwgMHg5MCwgMHg2OCwgMHgwOCwgMHhCNywNCisgICAgMHhDRCwgMHg3NSwgMHgxQSwgMHhFRCwgMHg2QywgMHg5RCwgMHhFRSwgMHhEOCwgMHg2QywgMHhENiwgMHg2QywgMHhENCwgMHhFQywgMHhEMSwgMHg2QywgMHhDRSwgMHhFQywgMHhDQiwgMHg2QywgMHhDOSwNCisgICAgMHhERSwgMHgwRiwgMHgxNCwgMHhFMiwgMHg5NCwgMHhCMywgMHhBNCwgMHg3OSwgMHgxMSwgMHg3NSwgMHhFOCwgMHhFRCwgMHhGQiwgMHg2MCwgMHg3MSwgMHgxMywgMHg3NCwgMHg3OCwgMHhERSwgMHhENCwNCisgICAgMHg0OCwgMHhFMCwgMHg3RSwgMHgwNSwgMHg0MCwgMHg5OCwgMHgyMiwgMHhCQSwgMHgxQSwgMHhBQywgMHgzQywgMHg3MiwgMHhFMCwgMHhFMiwgMHhFQSwgMHhCNywgMHg0RSwgMHg3OCwgMHhGNCwgMHgzNiwNCisgICAgMHhDNCwgMHgyRCwgMHhCMSwgMHgwQSwgMHg4QywgMHgwMywgMHhBMywgMHg2RSwgMHgzQywgMHg2MywgMHg1MywgMHgwMiwgMHg2RiwgMHg5NiwgMHgxMiwgMHhBQiwgMHg4RCwgMHg2RCwgMHgyMywgMHg3RCwNCisgICAgMHg5QSwgMHg1QywgMHhFNCwgMHg3MSwgMHhFQywgMHg3OCwgMHg0NywgMHg3MCwgMHhBMSwgMHg0MywgMHhFNCwgMHhDMywgMHg4NSwgMHhERSwgMHhDMiwgMHg1NSwgMHhDRCwgMHhENywgMHgzMiwgMHg4RCwNCisgICAgMHgzMiwgMHg1QSwgMHgxOCwgMHg0QiwgMHgxMSwgMHgzOSwgMHhERSwgMHhFMSwgMHhGRCwgMHg0NCwgMHgwOSwgMHhBMywgMHg5NSwgMHgwNiwgMHg4MywgMHgwNCwgMHg4RiwgMHgxMiwgMHhBNCwgMHgwQiwNCisgICAgMHhBOSwgMHgzMiwgMHgyRCwgMHhCMSwgMHgyOSwgMHg3MCwgMHg2RiwgMHgzRSwgMHgwMCwgMHgzMiwgMHg5RSwgMHg3NCwgMHhFNiwgMHhFRCwgMHg0NCwgMHhCRCwgMHg3OSwgMHgyNywgMHg5MywgMHg1RCwNCisgICAgMHhERiwgMHhERiwgMHg5RCwgMHhDRCwgMHhEMCwgMHhCOSwgMHg4QiwgMHgzQiwgMHgxQywgMHhBMywgMHg0MCwgMHg2RiwgMHhEMiwgMHhGQiwgMHgyOCwgMHg1NiwgMHg2MywgMHgzNiwgMHhGNywgMHgxOCwNCisgICAgMHhDMSwgMHhENywgMHg1MywgMHhBRSwgMHgxNCwgMHgwMywgMHgzQSwgMHhFRSwgMHg4RCwgMHhBNCwgMHg1RCwgMHg5QSwgMHgwMywgMHhENiwgMHhFQywgMHhGMiwgMHg3MSwgMHhFMSwgMHhEMywgMHhDQiwNCisgICAgMHg0OSwgMHg5MiwgMHhDRSwgMHg4RSwgMHgwRSwgMHg5RiwgMHg1RiwgMHhCRiwgMHgyMSwgMHg4QiwgMHhEMywgMHhGMiwgMHhCQywgMHhGNiwgMHhBNSwgMHg0QiwgMHgwMiwgMHg5RCwgMHhDOCwgMHg5MywNCisgICAgMHg4MCwgMHhBOSwgMHg1QiwgMHg3MywgMHg3QSwgMHhCMSwgMHhFRSwgMHgwNCwgMHgzMCwgMHg3OCwgMHgxNCwgMHg0MywgMHhDNywgMHgyQiwgMHgzNywgMHhDQiwgMHg3MiwgMHg2NywgMHhCQiwgMHgyQywNCisgICAgMHg0QiwgMHgxNywgMHhGNywgMHg3OCwgMHg4MywgMHg0MiwgMHg1QSwgMHgxOCwgMHhFNiwgMHg0QSwgMHgzMSwgMHgxMSwgMHgxNiwgMHg4RSwgMHhGNywgMHgwOCwgMHhENSwgMHhEQSwgMHg5RCwgMHg5RCwNCisgICAgMHg5MSwgMHhEMiwgMHgyNSwgMHg5QywgMHgxNSwgMHg0QywgMHg2NCwgMHhGQSwgMHg5RSwgMHgxQiwgMHgxNiwgMHgxNSwgMHgzNiwgMHg1QSwgMHg2RiwgMHgwQiwgMHgzNSwgMHhEMywgMHhGNSwgMHg0MiwNCisgICAgMHg1RCwgMHg5NiwgMHhCMiwgMHg5MCwgMHgyNywgMHgwNCwgMHgzNiwgMHg3QiwgMHhCMywgMHhEMSwgMHhENywgMHg2OSwgMHg1MywgMHhERCwgMHhGRSwgMHhBRCwgMHhDQSwgMHg3QywgMHhDOSwgMHhBQiwNCisgICAgMHg5RCwgMHhERSwgMHgxRSwgMHhDNSwgMHg2RiwgMHhCQiwgMHhERSwgMHgxOCwgMHg0NSwgMHg0RiwgMHhCOCwgMHhDOCwgMHg1MywgMHhDNywgMHhEQiwgMHgxQSwgMHg0NSwgMHgyRSwgMHg5OSwgMHg5MiwNCisgICAgMHg4RSwgMHhGNywgMHg3NCwgMHhDOCwgMHhDNSwgMHhGRCwgMHhCMSwgMHgwMSwgMHg2OSwgMHg3QywgMHg2RiwgMHg5RCwgMHhFOCwgMHgwMywgMHhDRCwgMHgwMywgMHhCNiwgMHgwQSwgMHgxQywgMHhFRiwNCisgICAgMHhGNywgMHgwNywgMHgzOCwgMHg2NSwgMHhGQiwgMHg4QywgMHg2MSwgMHg5MSwgMHhFNiwgMHgyMywgMHgyNSwgMHg5NSwgMHhENSwgMHgwMiwgMHgwRSwgMHg4NywgMHg1NywgMHg2NywgMHhBMywgMHg0NSwNCisgICAgMHg1RCwgMHhEMywgMHg4NywgMHgxMiwgMHg2QywgMHg3NiwgMHg1QiwgMHhCRCwgMHgwRCwgMHhDNSwgMHg5MiwgMHg1RCwgMHg5MCwgMHhCMCwgMHgzQSwgMHhFQSwgMHg5QSwgMHhBNSwgMHhBRSwgMHhFNSwNCisgICAgMHgxNywgMHhGMCwgMHg5NSwgMHg0MywgMHhEMSwgMHgxNCwgMHhCQywgMHhDMCwgMHg1RCwgMHg2NiwgMHg5MywgMHhFNiwgMHg4MiwgMHg0QiwgMHg3MSwgMHg2NywgMHhGQSwgMHg0MCwgMHhFNiwgMHg4QSwNCisgICAgMHgzMywgMHg4NSwgMHg2NiwgMHgxOSwgMHhCNSwgMHhFNiwgMHhGNywgMHhBOSwgMHgwQywgMHgxOCwgMHg5QSwgMHhGMiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwQywgMHhCRSwgMHgyMywgMHhBRSwgMHhENywNCisgICAgMHgxMCwgMHhGNiwgMHgxNSwgMHgwOSwgMHhFMCwgMHg4NSwgMHhCOSwgMHg5QiwgMHgzMCwgMHg1RiwgMHgxMCwgMHg2RSwgMHg0RCwgMHg5RiwgMHhDQSwgMHgzMiwgMHhCRiwgMHgyNCwgMHhFOCwgMHg1OCwNCisgICAgMHg2NiwgMHgwQiwgMHgxRSwgMHg1NiwgMHg3MywgMHg2QywgMHhCRCwgMHgzRSwgMHg0MSwgMHhGRSwgMHgzQSwgMHgyQSwgMHg4QywgMHgxQywgMHgyRSwgMHg2NCwgMHg0MywgMHgzRCwgMHg1QiwgMHg3MywNCisgICAgMHg1MywgMHg2MCwgMHg0NiwgMHhENSwgMHg2NCwgMHhFOCwgMHhDNSwgMHgxQSwgMHhEMiwgMHg0QywgMHg4RSwgMHgyMCwgMHhGOSwgMHg0NSwgMHgyRSwgMHhBMiwgMHhGNywgMHg3MiwgMHhDNSwgMHhEMywNCisgICAgMHhDRCwgMHhFMSwgMHhEQiwgMHgzRCwgMHhBQiwgMHhBMiwgMHhGQSwgMHhEMywgMHgxNiwgMHg5NiwgMHhGRiwgMHgwMCwgMHgyMCwgMHg4QiwgMHhCRSwgMHhGNw0KK307DQorY29uc3QgRlhfQllURSBnX3B0QlJfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4M0QsIDB4NkYsIDB4RDQsIDB4NDAsIDB4MTAsIDB4QUQsIDB4ODMsIDB4QzQsIDB4N0YsIDB4NTgsIDB4NTksIDB4ODksIDB4MEUsIDB4QTQsIDB4MjQsIDB4ODYsDQorICAgIDB4OTIsIDB4QzgsIDB4NjcsIDB4RTksIDB4OTIsIDB4MEIsIDB4MzksIDB4OTQsIDB4MTgsIDB4OUQsIDB4Q0UsIDB4MTEsIDB4ODgsIDB4MzQsIDB4NjgsIDB4NkQsIDB4RUYsIDB4RDksIDB4OUIsIDB4RDgsDQorICAgIDB4QkIsIDB4QzcsIDB4REEsIDB4NEUsIDB4QjAsIDB4NkIsIDB4MUEsIDB4M0EsIDB4MjgsIDB4MjksIDB4NTMsIDB4MjAsIDB4MkEsIDB4NDQsIDB4ODMsIDB4NDQsIDB4NDksIDB4OTEsIDB4REYsIDB4ODIsDQorICAgIDB4QjgsIDB4OUYsIDB4QzEsIDB4RkEsIDB4RjMsIDB4RkMsIDB4QjEsIDB4MzYsIDB4MDYsIDB4MzcsIDB4REUsIDB4OTksIDB4NzksIDB4NkYsIDB4M0QsIDB4RjMsIDB4NzYsIDB4NzYsIDB4NjQsIDB4QzUsDQorICAgIDB4QTUsIDB4MjYsIDB4NzQsIDB4MTEsIDB4MjAsIDB4RDAsIDB4NDMsIDB4NjMsIDB4NjksIDB4MTUsIDB4QkMsIDB4M0UsIDB4NUMsIDB4NDgsIDB4QzAsIDB4NDIsIDB4QkUsIDB4MzksIDB4OTYsIDB4RDYsDQorICAgIDB4MUYsIDB4NkYsIDB4RDcsIDB4MUYsIDB4REUsIDB4RkQsIDB4N0UsIDB4RkYsIDB4NjksIDB4RkQsIDB4RUQsIDB4RUIsIDB4ODMsIDB4NUYsIDB4M0YsIDB4QkUsIDB4QUYsIDB4M0YsIDB4RkYsIDB4N0MsDQorICAgIDB4MjgsIDB4QTksIDB4RjcsIDB4RUYsIDB4MDEsIDB4QTAsIDB4MjQsIDB4MTQsIDB4NjIsIDB4NDEsIDB4QTYsIDB4NDcsIDB4OUUsIDB4NDEsIDB4NUQsIDB4M0YsIDB4NjcsIDB4REIsIDB4MEMsIDB4RDksDQorICAgIDB4OTQsIDB4NjEsIDB4NDgsIDB4MTIsIDB4RDQsIDB4MTYsIDB4NTAsIDB4M0MsIDB4NEEsIDB4MDIsIDB4RTcsIDB4MzksIDB4MEYsIDB4RjksIDB4ODksIDB4QkQsIDB4OTUsIDB4RDksIDB4RUEsIDB4MjUsDQorICAgIDB4MjQsIDB4MDgsIDB4MzMsIDB4QUEsIDB4QzgsIDB4OTksIDB4NTksIDB4ODksIDB4MkMsIDB4RDEsIDB4MzUsIDB4NjIsIDB4MUQsIDB4MzEsIDB4MEYsIDB4QjIsIDB4QkIsIDB4MkYsIDB4QTIsIDB4MDAsDQorICAgIDB4MzQsIDB4MTgsIDB4NzYsIDB4ODUsIDB4MDQsIDB4MkMsIDB4ODIsIDB4NUYsIDB4ODYsIDB4QzQsIDB4MTEsIDB4RkIsIDB4NUQsIDB4QTEsIDB4MUYsIDB4REEsIDB4RDQsIDB4MEYsIDB4NDQsIDB4MDEsDQorICAgIDB4MUYsIDB4MDUsIDB4QzgsIDB4MzMsIDB4ODQsIDB4QjksIDB4RDIsIDB4MzAsIDB4MDgsIDB4QzUsIDB4MTEsIDB4NDIsIDB4QUYsIDB4QkIsIDB4NDgsIDB4MTYsIDB4OEEsIDB4OUIsIDB4MjEsIDB4OTAsDQorICAgIDB4QUYsIDB4NEIsIDB4MDksIDB4QUIsIDB4OTIsIDB4MDIsIDB4NjgsIDB4MTgsIDB4NkMsIDB4MkMsIDB4M0QsIDB4OTYsIDB4MUEsIDB4REEsIDB4OEEsIDB4NzUsIDB4MTUsIDB4MkIsIDB4MkEsIDB4OTYsDQorICAgIDB4NTMsIDB4MkMsIDB4QTYsIDB4NTgsIDB4NEIsIDB4QjEsIDB4OTIsIDB4NjIsIDB4MUQsIDB4QzUsIDB4MjIsIDB4OEEsIDB4RjUsIDB4MTMsIDB4NkIsIDB4MjcsIDB4OTYsIDB4QUQsIDB4NUYsIDB4MzEsDQorICAgIDB4MEIsIDB4NDYsIDB4OTUsIDB4MTYsIDB4RTQsIDB4OTYsIDB4NkEsIDB4NTEsIDB4MEYsIDB4OTMsIDB4MjQsIDB4OUQsIDB4QzQsIDB4MjgsIDB4QkQsIDB4M0UsIDB4QjIsIDB4NDMsIDB4REUsIDB4RDIsDQorICAgIDB4N0IsIDB4NEIsIDB4REUsIDB4ODAsIDB4QjAsIDB4MTEsIDB4MEIsIDB4MTAsIDB4NkYsIDB4M0UsIDB4NzEsIDB4RTgsIDB4NEQsIDB4MDgsIDB4NTksIDB4RDAsIDB4MTUsIDB4QzIsIDB4QTQsIDB4MjMsDQorICAgIDB4RTQsIDB4QTMsIDB4QjcsIDB4NUQsIDB4OTEsIDB4QkIsIDB4NUIsIDB4MDMsIDB4NUEsIDB4OUIsIDB4RTQsIDB4NDAsIDB4QkEsIDB4MTIsIDB4RDQsIDB4RDMsIDB4MzgsIDB4RkYsIDB4QkMsIDB4QjAsDQorICAgIDB4NzYsIDB4NTEsIDB4RUQsIDB4NTIsIDB4REEsIDB4MTUsIDB4QjQsIDB4MTMsIDB4NkYsIDB4RTcsIDB4MkIsIDB4QzgsIDB4QjMsIDB4M0IsIDB4NDksIDB4MEYsIDB4MzEsIDB4NkMsIDB4NjEsIDB4RTQsDQorICAgIDB4NTUsIDB4MkYsIDB4N0YsIDB4RUUsIDB4NTIsIDB4MjcsIDB4MUEsIDB4M0YsIDB4QTQsIDB4QzIsIDB4QTgsIDB4ODcsIDB4RTYsIDB4OEQsIDB4MTAsIDB4RDgsIDB4OTgsIDB4OTUsIDB4Q0QsIDB4MTEsDQorICAgIDB4ODMsIDB4OTUsIDB4N0QsIDB4QjksIDB4QTUsIDB4MUUsIDB4MUUsIDB4MjksIDB4NzIsIDB4RjIsIDB4MkUsIDB4MUQsIDB4OTMsIDB4NjksIDB4RTksIDB4MDAsIDB4RTksIDB4QUEsIDB4MjAsIDB4RjAsDQorICAgIDB4RDksIDB4MjUsIDB4MzcsIDB4ODYsIDB4NTcsIDB4RTYsIDB4QjUsIDB4NjAsIDB4ODAsIDB4RTYsIDB4MzAsIDB4RTAsIDB4RjIsIDB4OTAsIDB4NTIsIDB4RTgsIDB4RDIsIDB4OTMsIDB4Q0YsIDB4QjcsDQorICAgIDB4NjUsIDB4RTgsIDB4QkEsIDB4OTIsIDB4N0EsIDB4Q0MsIDB4OUYsIDB4NUQsIDB4MzAsIDB4MUQsIDB4RjEsIDB4MjksIDB4MDksIDB4NDYsIDB4MUEsIDB4N0YsIDB4QjIsIDB4RDUsIDB4MkIsIDB4RkUsDQorICAgIDB4MjQsIDB4MzIsIDB4OTQsIDB4QTQsIDB4QUUsIDB4NUQsIDB4NUMsIDB4NEEsIDB4NkMsIDB4NDksIDB4RkQsIDB4N0YsIDB4QkUsIDB4ODcsIDB4MkMsIDB4NEUsIDB4OUYsIDB4Q0EsIDB4OUEsIDB4MjYsDQorICAgIDB4MEYsIDB4RTYsIDB4RjgsIDB4MEUsIDB4NjUsIDB4QzEsIDB4ODYsIDB4RDUsIDB4RTQsIDB4MDAsIDB4NTAsIDB4RjMsIDB4RTQsIDB4OTIsIDB4MDQsIDB4RDgsIDB4NkIsIDB4NDgsIDB4NTIsIDB4RjEsDQorICAgIDB4RDQsIDB4MjQsIDB4OTksIDB4Q0QsIDB4NDYsIDB4MEUsIDB4MkYsIDB4NjUsIDB4QzQsIDB4RUYsIDB4RDUsIDB4NDgsIDB4RDcsIDB4NDcsIDB4RkUsIDB4MDgsIDB4NUMsIDB4MjgsIDB4NzIsIDB4MDUsDQorICAgIDB4REMsIDB4QzUsIDB4Q0UsIDB4QTQsIDB4NDgsIDB4QzksIDB4MTksIDB4NzcsIDB4MzgsIDB4MzUsIDB4NTUsIDB4NjEsIDB4MzYsIDB4M0IsIDB4RDAsIDB4QjQsIDB4MDMsIDB4NUQsIDB4MUYsIDB4QzQsDQorICAgIDB4QzgsIDB4MzUsIDB4NDgsIDB4MzksIDB4NEQsIDB4NDIsIDB4MjIsIDB4NDAsIDB4QTMsIDB4REMsIDB4QkMsIDB4MjcsIDB4Q0UsIDB4QjksIDB4QjcsIDB4NjgsIDB4OTQsIDB4OTMsIDB4NDgsIDB4QjMsDQorICAgIDB4QUUsIDB4NjYsIDB4OUUsIDB4QUYsIDB4MUYsIDB4NEYsIDB4OUYsIDB4REUsIDB4QkMsIDB4ODQsIDB4Q0UsIDB4NjksIDB4N0MsIDB4OTEsIDB4RTksIDB4NTYsIDB4MDUsIDB4QTUsIDB4NEMsIDB4MTIsDQorICAgIDB4N0EsIDB4MDYsIDB4NjIsIDB4NzUsIDB4RjEsIDB4NkEsIDB4QkUsIDB4M0MsIDB4MjcsIDB4RUUsIDB4RTMsIDB4RkQsIDB4NkQsIDB4NEEsIDB4NkEsIDB4QkMsIDB4MUIsIDB4QzcsIDB4NEYsIDB4RjYsDQorICAgIDB4RTMsIDB4OTgsIDB4MEYsIDB4QjMsIDB4MUEsIDB4QUUsIDB4OUIsIDB4NkEsIDB4ODYsIDB4OEMsIDB4MjEsIDB4NjIsIDB4NDYsIDB4OTIsIDB4QkEsIDB4MEQsIDB4MEEsIDB4RjYsIDB4NjAsIDB4RjIsDQorICAgIDB4MEEsIDB4MzEsIDB4MTMsIDB4OTEsIDB4MjAsIDB4RkYsIDB4RUUsIDB4NEUsIDB4OUIsIDB4OTcsIDB4MDgsIDB4RDIsIDB4MkEsIDB4QTIsIDB4MkMsIDB4NkMsIDB4NTMsIDB4RUIsIDB4NTYsIDB4REQsDQorICAgIDB4OTUsIDB4NkYsIDB4NkYsIDB4MjEsIDB4MTMsIDB4N0IsIDB4OTAsIDB4MzcsIDB4QzYsIDB4NkUsIDB4QjEsIDB4NEIsIDB4MTYsIDB4RUUsIDB4MjQsIDB4RDgsIDB4OEMsIDB4ODYsIDB4MkIsIDB4OUMsDQorICAgIDB4MzQsIDB4QzMsIDB4RkUsIDB4NDAsIDB4NDYsIDB4NTksIDB4QzEsIDB4Q0UsIDB4NDAsIDB4MDIsIDB4RUYsIDB4QUYsIDB4RDAsIDB4OTcsIDB4RDQsIDB4QkQsIDB4ODEsIDB4RjAsIDB4MTgsIDB4MzEsDQorICAgIDB4MkEsIDB4QTksIDB4OEYsIDB4NUEsIDB4RTgsIDB4OEQsIDB4MzAsIDB4QjUsIDB4MDMsIDB4MkYsIDB4NEUsIDB4QTMsIDB4QTYsIDB4NEMsIDB4REQsIDB4NTksIDB4QjQsIDB4NjEsIDB4NkEsIDB4NDgsDQorICAgIDB4RUEsIDB4NjIsIDB4OUIsIDB4NEYsIDB4QTIsIDB4MUEsIDB4QTAsIDB4ODcsIDB4ODQsIDB4N0QsIDB4OUEsIDB4MkMsIDB4MjQsIDB4RjUsIDB4NzAsIDB4NzEsIDB4RjYsIDB4MEYsIDB4QjQsIDB4RUEsDQorICAgIDB4MzksIDB4QjQsIDB4NDgsIDB4RTksIDB4MjgsIDB4NkMsIDB4QTUsIDB4OUQsIDB4REMsIDB4RkIsIDB4NjgsIDB4ODUsIDB4OTYsIDB4RDAsIDB4MkMsIDB4QzYsIDB4NkQsIDB4NjEsIDB4RTYsIDB4N0IsDQorICAgIDB4NkEsIDB4MTEsIDB4RkYsIDB4QzMsIDB4QjMsIDB4QzAsIDB4OUMsIDB4Q0IsIDB4MjMsIDB4OEIsIDB4MDEsIDB4OTgsIDB4NjAsIDB4NEEsIDB4N0EsIDB4MDAsIDB4NDcsIDB4MzQsIDB4NjQsIDB4MTgsDQorICAgIDB4MzEsIDB4QTAsIDB4MDcsIDB4NTYsIDB4MDcsIDB4NjIsIDB4NjIsIDB4NTEsIDB4MDMsIDB4ODEsIDB4MzksIDB4RkUsIDB4MkIsIDB4NjQsIDB4ODYsIDB4MEMsIDB4ODYsIDB4NkUsIDB4N0EsIDB4MjEsDQorICAgIDB4MTMsIDB4MDYsIDB4MEQsIDB4N0UsIDB4QzMsIDB4RkEsIDB4MjAsIDB4RTcsIDB4MEUsIDB4QzQsIDB4MUQsIDB4ODAsIDB4NTMsIDB4MUEsIDB4ODcsIDB4NTcsIDB4MTAsIDB4OUMsIDB4RDAsIDB4QzAsDQorICAgIDB4QzEsIDB4NjYsIDB4NTIsIDB4RDMsIDB4REUsIDB4OEIsIDB4NjcsIDB4NDAsIDB4RUIsIDB4MDcsIDB4NzMsIDB4MDEsIDB4NEMsIDB4ODcsIDB4MTYsIDB4RTAsIDB4NDUsIDB4RUYsIDB4QTcsIDB4MzksDQorICAgIDB4RDYsIDB4NEUsIDB4QUEsIDB4MDQsIDB4NjcsIDB4QkQsIDB4MzAsIDB4OUQsIDB4MEUsIDB4ODIsIDB4NjksIDB4NTEsIDB4NDgsIDB4RUMsIDB4NEIsIDB4OUEsIDB4MjIsIDB4QjMsIDB4MjQsIDB4RDMsDQorICAgIDB4QzEsIDB4NTYsIDB4MzksIDB4NEYsIDB4NDUsIDB4Q0UsIDB4RkUsIDB4RjcsIDB4RDUsIDB4M0YsIDB4MzAsIDB4QkIsIDB4RDksIDB4OUINCit9Ow0KK2NvbnN0IEZYX0JZVEUgZ19ubE5MX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDRGLCAweERDLCAweDMwLCAweDEwLCAweDNELCAweDUzLCAweEE5LCAweEZGLCAweEMxLCAweDhBLCAweDhBLCAweDY4LCAweDI1LCAweDk2LCAweDJELA0KKyAgICAweDQ3LCAweDUwLCAweDg4LCAweEI0LCAweDA1LCAweDBBLCAweDE1LCAweDA0LCAweEFELCAweDU4LCAweERBLCAweEFBLCAweDVDLCAweDJBLCAweDZGLCAweDYyLCAweDc2LCAweEJELCAweDI0LCAweEY2LA0KKyAgICAweENBLCAweDg5LCAweDQxLCAweEM5LCAweEIxLCAweDUyLCAweDhGLCAweEZELCAweDI3LCAweEFELCAweERBLCAweDVCLCAweEZGLCAweDRGLCAweEE1LCAweDRBLCAweEZDLCAweDhDLCAweDhFLCAweEYzLA0KKyAgICAweDQ1LCAweDEyLCAweDNCLCAweDY5LCAweEM4LCAweDA1LCAweENGLCAweDlCLCAweEY3LCAweEJDLCAweDMzLCAweENGLCAweENFLCAweDEwLCAweDNCLCAweEUwLCAweDFFLCAweDBFLCAweDA4LCAweDYyLA0KKyAgICAweDM4LCAweDI0LCAweDA3LCAweDE2LCAweDBCLCAweDNFLCAweDVGLCAweDlDLCAweDVCLCAweEM4LCAweDI3LCAweDkxLCAweDc3LCAweDYwLCAweDNELCAweDdDLCAweEZCLCAweEZELCAweEY3LCAweEVCLA0KKyAgICAweEFGLCAweDg3LCAweDlGLCAweDNGLCAweDVFLCAweEU2LCAweEFCLCAweDU3LCAweDk2LCAweEYzLCAweEZDLCAweDE5LCAweDQyLCAweEI2LCAweEUyLCAweDMzLCAweDFGLCAweDhCLCAweDU5LCAweDEyLA0KKyAgICAweENFLCAweDc5LCAweDEwLCAweDE1LCAweEQyLCAweDg1LCAweDIwLCAweDBCLCAweDJFLCAweDI4LCAweDY2LCAweDhBLCAweEI1LCAweDgxLCAweEVDLCAweDkwLCAweEIzLCAweDc4LCAweDc5LCAweDAxLA0KKyAgICAweEE5LCAweDQ4LCAweEM1LCAweDFCLCAweDc5LCAweEVDLCAweEFDLCAweDMwLCAweDkzLCAweDU4LCAweDUwLCAweDdCLCAweDlDLCAweDg3LCAweEI1LCAweENDLCAweDBELCAweDk5LCAweDhCLCAweDhFLA0KKyAgICAweDU0LCAweDg4LCAweEIxLCAweDg4LCAweDBELCAweDM4LCAweDVFLCAweDBCLCAweDFBLCAweDk4LCAweEY4LCAweEM0LCAweEI0LCAweENCLCAweDRBLCAweDMyLCAweDMzLCAweDFDLCAweDk4LCAweDYwLA0KKyAgICAweDJDLCAweDE3LCAweDMyLCAweDhBLCAweDY1LCAweDY0LCAweDQ4LCAweDQ1LCAweDY0LCAweDFELCAweDkzLCAweDcwLCAweDRFLCAweDg0LCAweDIxLCAweEM3LCAweDZGLCAweDYzLCAweDZFLCAweENFLA0KKyAgICAweDMwLCAweDdFLCAweEQ3LCAweDI1LCAweEYyLCAweDg5LCAweEQ3LCAweDRFLCAweEExLCAweDYyLCAweDVELCAweDE5LCAweDU4LCAweDM3LCAweDE0LCAweEUxLCAweEY5LCAweDVDLCAweDFDLCAweDU4LA0KKyAgICAweEJCLCAweDU2LCAweENCLCAweDU5LCAweEIzLCAweEFCLCAweDI2LCAweDgzLCAweEJBLCAweEVDLCAweDdDLCAweDhBLCAweDk5LCAweDY2LCAweDJGLCAweENELCAweDU2LCAweDlBLCAweDVELCAweDM0LA0KKyAgICAweEZCLCAweDY3LCAweEY2LCAweENFLCAweDZDLCAweDVCLCAweEJGLCAweDYzLCAweDNFLCAweDRFLCAweDZBLCAweDE3LCAweDEwLCAweDIyLCAweDI3LCAweEU1LCAweDcwLCAweDcxLCAweEExLCAweDFBLA0KKyAgICAweEI1LCAweEFFLCAweDQwLCAweEI4LCAweDVFLCAweDA2LCAweEQ0LCAweEE3LCAweDJDLCAweEQyLCAweEQxLCAweDdCLCAweDRFLCAweDRDLCAweEIwLCAweDBGLCAweEZCLCAweDEyLCAweEExLCAweEUzLA0KKyAgICAweDc3LCAweDgyLCAweEFFLCAweDc0LCAweDM0LCAweEM1LCAweDcxLCAweDkzLCAweDhDLCAweEIyLCAweDk1LCAweEExLCAweEYyLCAweEQ2LCAweDQ5LCAweEU3LCAweDJELCAweDY4LCAweEU1LCAweDZCLA0KKyAgICAweDk1LCAweDZCLCAweDQ1LCAweDZCLCAweEU1LCAweDZBLCAweDc1LCAweDZBLCAweDI1LCAweDc2LCAweDE3LCAweDE3LCAweDEyLCAweDQxLCAweDdELCAweDRBLCAweEMyLCAweEZBLCAweENCLCAweDVELA0KKyAgICAweDQwLCAweENFLCAweEM0LCAweDg1LCAweDYzLCAweDI4LCAweDgzLCAweDY2LCAweDZBLCAweERBLCAweDRBLCAweEExLCAweEM3LCAweEIwLCAweEI2LCAweDM5LCAweDExLCAweEI4LCAweEI2LCAweDJGLA0KKyAgICAweDQ0LCAweENFLCAweDlCLCAweDQzLCAweDdCLCAweEFDLCAweEZFLCAweDU2LCAweEMwLCAweEU0LCAweEE4LCAweDAyLCAweDUwLCAweEI2LCAweDJBLCAweDA1LCAweDMwLCAweDlCLCAweEM2LCAweEFELA0KKyAgICAweEUxLCAweDk0LCAweEEzLCAweDNFLCAweDE4LCAweDNFLCAweEM1LCAweDMxLCAweEI4LCAweENFLCAweDJBLCAweDgzLCAweDJCLCAweEE0LCAweDk4LCAweDVGLCAweDM3LCAweDMyLCAweDA4LCAweDJDLA0KKyAgICAweEU3LCAweDE4LCAweDFFLCAweDc0LCAweDg0LCAweDVDLCAweDc4LCAweEQwLCAweDI3LCAweDc4LCAweDU0LCAweEVGLCAweDE1LCAweEIzLCAweDRCLCAweDFBLCAweDcwLCAweEI2LCAweEIwLCAweDlDLA0KKyAgICAweEE3LCAweEFBLCAweDQyLCAweEUyLCAweDgzLCAweDY4LCAweDA0LCAweDlBLCAweEQxLCAweDYwLCAweDRELCAweEI0LCAweEU0LCAweDIyLCAweENFLCAweDU0LCAweDIzLCAweDVELCAweDgxLCAweDUwLA0KKyAgICAweDAzLCAweDI5LCAweDdBLCAweDhGLCAweDY5LCAweEQ4LCAweEVBLCAweEJELCAweDg2LCAweDM0LCAweDdBLCAweDNGLCAweERELCAweDc3LCAweERELCAweEZELCAweEQ5LCAweDZDLCAweDBCLCAweDQ5LA0KKyAgICAweDI5LCAweEI2LCAweEQwLCAweEI1LCAweDNELCAweEFFLCAweDExLCAweEJCLCAweDk0LCAweDc5LCAweEVCLCAweDg1LCAweDcyLCAweEEwLCAweDI2LCAweDZCLCAweEJDLCAweDkwLCAweDBDLCAweDEyLA0KKyAgICAweDE0LCAweDVELCAweDJCLCAweDQ5LCAweDlCLCAweEFGLCAweDdBLCAweDZFLCAweDc1LCAweDU4LCAweDlDLCAweEY3LCAweDE1LCAweEEwLCAweEU1LCAweDI1LCAweDM4LCAweDQ5LCAweDVDLCAweEZGLA0KKyAgICAweEY2LCAweDM0LCAweDhDLCAweDY2LCAweEM3LCAweDQ3LCAweDZGLCAweEVGLCAweDNGLCAweEUyLCAweEU1LCAweDU5LCAweDdBLCAweDlELCAweDVCLCAweDU1LCAweDI3LCAweDY1LCAweDRBLCAweDI2LA0KKyAgICAweEQ1LCAweDIwLCAweDZFLCAweEZBLCAweEQ1LCAweEMwLCAweENBLCAweDdGLCAweDk0LCAweDUyLCAweERELCAweDVELCAweENGLCAweDcyLCAweEQyLCAweEVELCAweDM0LCAweERELCAweERCLCAweDQ5LA0KKyAgICAweEQzLCAweEQ0LCAweDFFLCAweDM3LCAweDc4LCAweERELCAweDUyLCAweDRGLCAweDBBLCAweDQxLCAweDk4LCAweDk3LCAweDU4LCAweENFLCAweDBCLCAweDk0LCAweEFCLCAweEY3LCAweEY2LCAweEEyLA0KKyAgICAweEMxLCAweEVBLCAweDM1LCAweDExLCAweDFFLCAweDYxLCAweDcxLCAweEYxLCAweEMzLCAweDlCLCAweEJBLCAweDRFLCAweDM5LCAweEEyLCAweDc1LCAweDUxLCAweDc1LCAweEY2LCAweEQ4LCAweEVDLA0KKyAgICAweDQ2LCAweDEzLCAweDJBLCAweEI2LCAweDg3LCAweDk5LCAweDRBLCAweDQzLCAweDBDLCAweDk3LCAweDYxLCAweEJCLCAweERDLCAweDI1LCAweDRGLCAweDc3LCAweDBBLCAweDE2LCAweDgyLCAweENCLA0KKyAgICAweDM1LCAweDU1LCAweDk3LCAweDYwLCAweDY3LCAweEEwLCAweEEyLCAweEVBLCAweDYwLCAweDczLCAweEEwLCAweDIwLCAweEE0LCAweDRDLCAweDQ2LCAweDk2LCAweDMzLCAweDFBLCAweDQ4LCAweDRGLA0KKyAgICAweDg5LCAweEUwLCAweDk2LCAweEYzLCAweDVBLCAweDYzLCAweDNGLCAweDFBLCAweEQzLCAweDM4LCAweEYxLCAweEYyLCAweDM4LCAweDFBLCAweENFLCAweDM0LCAweEMxLCAweEYyLCAweDFBLCAweDY2LA0KKyAgICAweDgxLCAweEU1LCAweEZDLCAweEY5LCAweEYyLCAweDFELCAweEU2LCAweDRDLCAweDgzLCAweEQxLCAweEEzLCAweEEyLCAweDExLCAweDU3LCAweDBCLCAweDE4LCAweDJELCAweEVGLCAweDJGLCAweDlGLA0KKyAgICAweDIwLCAweEFCLCAweDFGLCAweDg0LCAweDI2LCAweENBLCAweDA2LCAweDlELCAweDU2LCAweEI3LCAweDdBLCAweEQ5LCAweDkzLCAweDM1LCAweEI5LCAweEMxLCAweDVFLCAweDM5LCAweDRDLCAweENCLA0KKyAgICAweEIwLCAweEQ4LCAweEQzLCAweDRELCAweEUwLCAweEZCLCAweENDLCAweDQ3LCAweDUzLCAweEYwLCAweDY3LCAweDZDLCAweDI2LCAweDUwLCAweDQ2LCAweDM5LCAweEVCLCAweDIxLCAweDFDLCAweDcyLA0KKyAgICAweDI5LCAweDI4LCAweDExLCAweDY4LCAweDE2LCAweEZCLCAweDFELCAweDhDLCAweDg5LCAweDBGLCAweERGLCAweDNGLCAweDY4LCAweDRBLCAweEZGLCAweDRCLCAweDM5LCAweDg1LCAweEVGLCAweDNELA0KKyAgICAweDcyLCAweERGLCAweDRCLCAweDk5LCAweDA4LCAweDNDLCAweDg3LCAweDc3LCAweEFDLCAweDhGLCAweDcyLCAweEI1LCAweEM0LCAweEI0LCAweDgzLCAweDcwLCAweEM2LCAweDUzLCAweDc5LCAweDhCLA0KKyAgICAweEQxLCAweDA5LCAweDhGLCAweDk3LCAweEQ0LCAweDUzLCAweDNELCAweDhELCAweDNFLCAweEJDLCAweDQzLCAweDZFLCAweDNGLCAweDE5LCAweDBDLCAweEYwLCAweDk2LCAweEJDLCAweDI0LCAweDVGLA0KKyAgICAweEY2LCAweEZFLCAweDM0LCAweDcwLCAweDE3LCAweEFBLCAweDRCLCAweDc0LCAweERFLCAweDRCLCAweDlCLCAweEYxLCAweDQxLCAweDM0LCAweDM3LCAweDkxLCAweDZDLCAweEIxLCAweEUyLCAweDE5LA0KKyAgICAweDMzLCAweDJGLCAweDMyLCAweDFCLCAweDZELCAweEI1LCAweEYzLCAweEI0LCAweEM3LCAweEY5LCAweEE3LCAweEJBLCAweEYzLCAweDBGLCAweEQ1LCAweEZBLCAweEMwLCAweEZBDQorfTsNCitjb25zdCBGWF9CWVRFIGdfcnVSVV9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHhBRCwgMHg1NywgMHg0RCwgMHg0RiwgMHgxMywgMHg0MSwgMHgxOCwgMHgzRSwgMHg2MywgMHhFMiwgMHg3RiwgMHg5OCwgMHg2QywgMHgyNCwgMHg2OCwgMHgwMiwgMHhBRCwgMHgxRSwNCisgICAgMHgyNSwgMHg2NSwgMHgxMywgMHgyMiwgMHgwQSwgMHgwNiwgMHhENywgMHg5MCwgMHgxNiwgMHgzNCwgMHg3MiwgMHgzMSwgMHhEQiwgMHhERCwgMHhBMSwgMHg1RCwgMHhFOCwgMHhFRSwgMHg5MCwgMHhFOSwNCisgICAgMHg2RSwgMHhCMCwgMHg3QiwgMHgyQSwgMHg4NSwgMHhFOCwgMHgwNSwgMHgyNSwgMHhFMSwgMHhBMCwgMHg0NywgMHhGNCwgMHhFNCwgMHhDOSwgMHg1MCwgMHhCRSwgMHgxMiwgMHg4MiwgMHhCNiwgMHgyNCwNCisgICAgMHhGRSwgMHg4MiwgMHhEOSwgMHhGRiwgMHg2MCwgMHhENCwgMHg5RiwgMHhFMSwgMHgzQiwgMHhGQiwgMHhEMSwgMHhFRSwgMHhCNywgMHhDNSwgMHhEOCwgMHgxRSwgMHgzQSwgMHhGMywgMHgzRSwgMHhDRiwNCisgICAgMHhGMywgMHhDRSwgMHhGQiwgMHhCNSwgMHhEMywgMHhCNiwgMHhENCwgMHgyMCwgMHg4QSwgMHhEQywgMHhDMCwgMHhDOCwgMHg5MCwgMHg3NSwgMHgzQywgMHgyMywgMHg1MCwgMHhFQiwgMHg2NSwgMHg3OSwNCisgICAgMHg0NSwgMHg0MCwgMHgyQSwgMHg2RSwgMHgyQSwgMHgzMywgMHhDMiwgMHg4RiwgMHhBQiwgMHhERCwgMHhERiwgMHg0NywgMHg1RiwgMHg2RSwgMHhDMywgMHhDNywgMHhBRiwgMHhERSwgMHg4NywgMHg5RiwNCisgICAgMHhFRiwgMHg4RiwgMHhFRSwgMHgwOCwgMHhFMiwgMHhDRCwgMHgxQiwgMHgwOCwgMHg5NSwgMHgzOCwgMHhERiwgMHg1MCwgMHg2NSwgMHg1QSwgMHg2OSwgMHhFOSwgMHg1NSwgMHhEMiwgMHg2OCwgMHhGQSwNCisgICAgMHhEMiwgMHgxQSwgMHhDNSwgMHgzNSwgMHg0MiwgMHgzNSwgMHhEOSwgMHhFMCwgMHhBQywgMHgzMSwgMHg1NCwgMHhEMiwgMHg4OSwgMHg2MSwgMHhENiwgMHg5RiwgMHgwMiwgMHhENCwgMHhFNCwgMHhGQiwNCisgICAgMHgzMSwgMHg2RiwgMHgyRiwgMHgzQSwgMHhGQiwgMHhBQywgMHhDNywgMHg0RSwgMHg1OCwgMHhENywgMHg2OSwgMHgzQiwgMHhGQiwgMHhBNSwgMHhBMiwgMHg2NywgMHgwQiwgMHhDMywgMHhCQiwgMHhFQywNCisgICAgMHg5QywgMHg5RCwgMHgzOCwgMHg2RCwgMHhENiwgMHg2NSwgMHg1RiwgMHg1MywgMHgwOSwgMHhFQywgMHg5QiwgMHhBQiwgMHhFRCwgMHhCMCwgMHg2RSwgMHgxQSwgMHhEOCwgMHg2NSwgMHg1NywgMHhBMCwNCisgICAgMHgzRCwgMHhDRiwgMHhEMywgMHhBNiwgMHgwMiwgMHgxNywgMHhDRSwgMHgzQiwgMHhENiwgMHhDQiwgMHg4NiwgMHgzMiwgMHhEQywgMHg3NSwgMHgyMSwgMHg5MSwgMHg1MywgMHg2NywgMHhDNywgMHhEOSwNCisgICAgMHhDRSwgMHgwOCwgMHhDNywgMHhEOSwgMHg4NiwgMHg1MCwgMHg3QSwgMHg0RSwgMHgwNywgMHg3MiwgMHgzRSwgMHhDRSwgMHhDOCwgMHg5NywgMHhGNSwgMHhEOSwgMHg2NSwgMHgzRSwgMHhBMSwgMHhDNywNCisgICAgMHhGQSwgMHg3OSwgMHhGMCwgMHgxOSwgMHgxQywgMHg3MSwgMHgwOSwgMHg5MSwgMHhDNCwgMHgwOSwgMHhDOCwgMHg1RiwgMHgwRiwgMHgxQSwgMHgxMCwgMHg2RSwgMHgwOCwgMHg5MiwgMHhBQiwgMHg1NSwNCisgICAgMHgzQSwgMHgyMywgMHhEQywgMHgxMywgMHg5MiwgMHg5RCwgMHgyOSwgMHhFNCwgMHgzNCwgMHgyNSwgMHgwRCwgMHgxQiwgMHhBMSwgMHgxRiwgMHg5OSwgMHhCMiwgMHhGRiwgMHhERCwgMHg4QSwgMHhENCwNCisgICAgMHhEOCwgMHhGRCwgMHgxRSwgMHhBNCwgMHgwNiwgMHhFMSwgMHgxNiwgMHgzRiwgMHgxNSwgMHhGMSwgMHhBQiwgMHg5RSwgMHg4QSwgMHhCOSwgMHgyNSwgMHgyRiwgMHhFNCwgMHhENywgMHg1QSwgMHg5NSwNCisgICAgMHg1QiwgMHhBMSwgMHhEMSwgMHg4NywgMHg5RCwgMHgwOCwgMHgwMSwgMHhGNiwgMHgyMSwgMHg5OCwgMHg0QiwgMHgzRSwgMHg5RiwgMHg3RSwgMHg1MCwgMHg3QiwgMHhFQywgMHhCQywgMHg1NCwgMHhFNCwNCisgICAgMHhEOCwgMHg5MCwgMHg3NCwgMHgwNSwgMHgzMSwgMHhGNSwgMHgwMCwgMHgzQywgMHg3MywgMHg4NywgMHg3OCwgMHgwRiwgMHhENiwgMHgxNywgMHhFQywgMHgzMiwgMHg0RSwgMHgzQSwgMHg4MSwgMHg3MiwNCisgICAgMHhGNywgMHhDMSwgMHg0RiwgMHgxQSwgMHgwOCwgMHhDMywgMHhEOCwgMHg3NiwgMHhGNSwgMHhERCwgMHgzOCwgMHhGMCwgMHgwNiwgMHhDRSwgMHhFRCwgMHg0MCwgMHgxNCwgMHhFNywgMHg0MCwgMHgzOCwNCisgICAgMHg0RCwgMHg5QywgMHhFQiwgMHhFQywgMHgwMywgMHgwOCwgMHgwRSwgMHg5RCwgMHhENywgMHg0OSwgMHhFNSwgMHhCNiwgMHhCMywgMHhDMywgMHg4RSwgMHhFMSwgMHhERCwgMHhGNywgMHhEQSwgMHhFQywNCisgICAgMHg4MywgMHhDOCwgMHg1RCwgMHhBNSwgMHhFNCwgMHgxQywgMHg5QiwgMHgyRSwgMHhENywgMHhGRiwgMHg4MSwgMHhCMywgMHgxRCwgMHgzRiwgMHhGMiwgMHg5MCwgMHhGNSwgMHhFMiwgMHhBNiwgMHgwMywNCisgICAgMHhBNywgMHgxMywgMHgzNywgMHg3RCwgMHg3MiwgMHhEQSwgMHg3MSwgMHhEMywgMHhFNywgMHgyNCwgMHhFQiwgMHgzMCwgMHg0NSwgMHhDOCwgMHg4RSwgMHhCMywgMHg0MywgMHhENSwgMHgzMSwgMHhENSwNCisgICAgMHg1NCwgMHgwRCwgMHhFQiwgMHhFMSwgMHhFQiwgMHhDOSwgMHgzNywgMHg4OSwgMHhCMywgMHgxMiwgMHhCNCwgMHgzMywgMHhEOCwgMHg0NCwgMHhBMSwgMHhBNSwgMHgxOCwgMHg4NCwgMHg4NiwgMHhEQiwNCisgICAgMHg5MCwgMHg3MywgMHg0QywgMHhFNSwgMHg5MCwgMHg1RiwgMHhEOCwgMHhGMSwgMHg5MSwgMHhFOSwgMHgyMywgMHhENiwgMHgyQiwgMHgzOCwgMHg2RiwgMHg2MSwgMHg2QywgMHhCOCwgMHg2MSwgMHg4OCwNCisgICAgMHg0NCwgMHg4RCwgMHhDOCwgMHg1RCwgMHgwNSwgMHg2QSwgMHhCOCwgMHg2QSwgMHg4QiwgMHhCMSwgMHhCQiwgMHhENiwgMHhCMywgMHhBQSwgMHhCMiwgMHg4OSwgMHg5NywgMHg2NCwgMHhEMywgMHhDNCwNCisgICAgMHhENCwgMHgxOCwgMHhENCwgMHg3RSwgMHg2MCwgMHhGMSwgMHhBRiwgMHhFMywgMHgzNSwgMHhBQiwgMHhEMSwgMHgxMCwgMHhDNCwgMHgzOSwgMHgyNCwgMHhDMSwgMHgwQiwgMHhCRCwgMHg4MCwgMHgxNywNCisgICAgMHg5QSwgMHg4MCwgMHgyNywgMHg2NCwgMHg4MiwgMHg1NywgMHg2MiwgMHg0MCwgMHhDRCwgMHhEMiwgMHgzNiwgMHg4OCwgMHg1MSwgMHhGQiwgMHg1NywgMHhBRCwgMHg4RSwgMHg1NSwgMHg5MCwgMHhDRSwNCisgICAgMHgxNSwgMHgyNCwgMHhBOSwgMHhDMCwgMHg5NSwgMHgyMywgMHg2OSwgMHg5QSwgMHg3NSwgMHg0MiwgMHhDRCwgMHhBMSwgMHgyQSwgMHhBRSwgMHg0MSwgMHgyOCwgMHg2MiwgMHhGMSwgMHg4QiwgMHg2MCwNCisgICAgMHg2QSwgMHg3QSwgMHhBQywgMHgwOCwgMHgyMSwgMHg0QiwgMHhBNCwgMHgwOCwgMHgwQiwgMHhEMywgMHg5MiwgMHgzNCwgMHg1RCwgMHhBOSwgMHhBMCwgMHhENSwgMHg1MiwgMHgzMSwgMHg0NCwgMHhDOSwNCisgICAgMHhEMiwgMHg3OCwgMHhDOSwgMHg1RiwgMHg0RiwgMHhFMywgMHgyNiwgMHhFRCwgMHg0QiwgMHg0NiwgMHgxMiwgMHhGOCwgMHgxOSwgMHg3MywgMHg0OSwgMHg5QywgMHhDRiwgMHhCMywgMHg4RCwgMHhFNSwNCisgICAgMHhFNiwgMHhCNywgMHg3QywgMHgxOSwgMHhBQywgMHhDMSwgMHgxQywgMHhDQywgMHhDQiwgMHhDNiwgMHhGQSwgMHhDNiwgMHg4MiwgMHhERSwgMHhBQywgMHgzQywgMHg5QywgMHg3QiwgMHhCNCwgMHhGNSwNCisgICAgMHhGQywgMHg1NSwgMHg3RCwgMHhEMSwgMHg1RSwgMHhGNSwgMHg4QSwgMHgxNCwgMHgyNiwgMHhCOSwgMHg0QSwgMHhDMywgMHhEMiwgMHhBQiwgMHg5OCwgMHg0NiwgMHgyQiwgMHgxNSwgMHhCMSwgMHhGOSwNCisgICAgMHgyMSwgMHg4MSwgMHgwRCwgMHg2NiwgMHg1OSwgMHgxMSwgMHg0NCwgMHg3QiwgMHhEMiwgMHhCNiwgMHhFRiwgMHgxNywgMHg2QywgMHhEQiwgMHgyRSwgMHgxNSwgMHgyMywgMHhCQywgMHg2QywgMHhBOSwNCisgICAgMHg2MiwgMHg1MSwgMHg4QSwgMHgwRCwgMHhBNSwgMHgzNSwgMHhENCwgMHhERSwgMHgxQSwgMHg1OSwgMHhCQiwgMHg4OSwgMHhBOSwgMHg4MiwgMHgwRCwgMHhEMywgMHg5NywgMHg4RSwgMHgyNywgMHg3NSwNCisgICAgMHhCQywgMHgxRSwgMHg4OSwgMHgxQywgMHgwNiwgMHg3OSwgMHgwRCwgMHg1MywgMHgxRCwgMHg4QiwgMHg5QSwgMHg3QywgMHhGNywgMHgyQSwgMHg1NiwgMHgzNCwgMHg1RCwgMHg4NiwgMHgyMSwgMHg5OCwNCisgICAgMHgwQywgMHhCQywgMHg3OCwgMHg3MCwgMHhBNiwgMHhBMCwgMHg0NiwgMHg4OSwgMHhCNSwgMHhBOSwgMHhGMSwgMHgxMSwgMHhGOCwgMHhGRSwgMHg3MSwgMHg0NCwgMHhDOSwgMHgyMCwgMHg4NSwgMHhGMSwNCisgICAgMHgxMSwgMHgwNSwgMHhCQSwgMHg2NiwgMHg1OCwgMHg0RCwgMHg0MSwgMHg5QywgMHgxQSwgMHg5MSwgMHg2RSwgMHg2MywgMHg0QSwgMHgwNCwgMHhGMSwgMHg2RSwgMHg4MiwgMHgzRCwgMHhBQywgMHg0QywNCisgICAgMHhBNCwgMHhFMSwgMHg0MSwgMHgzNywgMHgyMiwgMHhBNSwgMHg4OSwgMHgxQSwgMHg4MywgMHgyOSwgMHg3NCwgMHgzNywgMHg4MiwgMHhFOCwgMHg3RSwgMHg0NywgMHg0NywgMHgxOSwgMHgzOSwgMHgyQSwNCisgICAgMHhBRCwgMHg0OSwgMHhGOCwgMHg0MiwgMHgxMCwgMHhDQiwgMHgyQiwgMHhFNSwgMHg2QiwgMHhDOCwgMHhDMiwgMHg5RCwgMHg0OCwgMHg4OCwgMHhEQywgMHhBQiwgMHgyRSwgMHgxMSwgMHgzNywgMHg3RiwNCisgICAgMHhDQSwgMHg1QiwgMHg5QiwgMHg3OCwgMHg0RCwgMHg1NiwgMHg4MiwgMHhCQiwgMHgzNSwgMHhEOCwgMHhGQSwgMHgzRSwgMHhBNSwgMHgxNiwgMHhGQywgMHhFMCwgMHg1NCwgMHhEMSwgMHgxMiwgMHhENCwNCisgICAgMHhBNywgMHg5OCwgMHg0RSwgMHhEMCwgMHgwQywgMHg4RCwgMHgxOCwgMHgzOSwgMHg4NCwgMHgwNywgMHhDNCwgMHhBMiwgMHgxQSwgMHhBNiwgMHhBOCwgMHg2MiwgMHhBQSwgMHgxOSwgMHg4QywgMHg1OSwNCisgICAgMHg5NSwgMHg1NCwgMHgzMSwgMHg1QSwgMHhEMiwgMHhGRSwgMHg0QSwgMHg1OSwgMHhDMCwgMHg1NSwgMHg4QSwgMHhCNywgMHg3MiwgMHgyOSwgMHhCMywgMHg1NCwgMHhBRSwgMHhDMiwgMHgyMywgMHg5NiwNCisgICAgMHg0NywgMHg1OSwgMHhBRSwgMHhDQiwgMHg1QSwgMHgwNiwgMHg2MSwgMHg5MSwgMHhEOCwgMHhENiwgMHg4NiwgMHg4QywgMHhFNiwgMHg4OSwgMHg1OSwgMHhENywgMHgxNCwgMHg5RSwgMHhEMywgMHhENCwNCisgICAgMHhCMywgMHhDNywgMHg0OCwgMHhDQSwgMHgyNywgMHg0MywgMHgwMSwgMHg5NCwgMHgzQSwgMHgwOSwgMHhDOCwgMHhFNSwgMHhEQywgMHhBMywgMHg4MSwgMHg1QiwgMHhFMywgMHg1OSwgMHhBMiwgMHgyNywNCisgICAgMHhCOSwgMHhCNCwgMHgwQSwgMHgxOSwgMHg4OSwgMHgyNiwgMHhCNSwgMHgyQywgMHhBMywgMHhCNiwgMHg0RSwgMHg1QywgMHhBNiwgMHgxNywgMHhBNCwgMHg3QiwgMHhCMywgMHg4NSwgMHhGQSwgMHg1OSwNCisgICAgMHgyQSwgMHg3QSwgMHhGRiwgMHgzRCwgMHhDNCwgMHgzRiwgMHhERSwgMHhDQiwgMHg4QiwgMHhDNA0KK307DQorc3RhdGljIElGWF9Mb2NhbGUqIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKEZYX0xQQ0JZVEUgcEJ1ZiwgaW50IG5CdWZMZW4pDQorew0KKyAgICBpZiAocEJ1ZiA9PSBOVUxMIHx8IG5CdWZMZW4gPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX0dFTW9kdWxlKiBwR2VNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpOw0KKyAgICBpZiAoIXBHZU1vZHVsZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gcEdlTW9kdWxlLT5HZXRDb2RlY01vZHVsZSgpOw0KKyAgICBpZiAoIXBDb2RlY01ncikgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hNTF9FbGVtZW50KiBwTG9jYWxlID0gTlVMTDsNCisgICAgRlhfTFBCWVRFIHBPdXQgPSBOVUxMOw0KKyAgICBGWF9EV09SRCBkd1NpemU7DQorICAgIHBDb2RlY01nci0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZShGQUxTRSwNCisgICAgICAgICAgICBwQnVmLCBuQnVmTGVuLCBUUlVFLCAwLCAwLCAwLCAwLCAwLCBwT3V0LCBkd1NpemUpOw0KKyAgICBpZiAocE91dCkgew0KKyAgICAgICAgcExvY2FsZSA9IENYTUxfRWxlbWVudDo6UGFyc2UocE91dCwgZHdTaXplKTsNCisgICAgICAgIEZYX0ZyZWUocE91dCk7DQorICAgIH0NCisgICAgaWYgKHBMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBGWF9ORVcgQ1hGQV9YTUxMb2NhbGUocExvY2FsZSk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBGWF9XT1JEIFhGQV9HZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlKQ0KK3sNCisgICAgRlhfV09SRCBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lbl9VUzsNCisgICAgaWYgKHdzTGFuZ3VhZ2UuR2V0TGVuZ3RoKCkgPCAyKSB7DQorICAgICAgICByZXR1cm4gZHdMYW5ndWVJRDsNCisgICAgfQ0KKyAgICB3c0xhbmd1YWdlLk1ha2VMb3dlcigpOw0KKyAgICBGWF9EV09SRCBkd0lERmlyc3QgID0gd3NMYW5ndWFnZS5HZXRBdCgwKSA8PCA4IHwgd3NMYW5ndWFnZS5HZXRBdCgxKTsNCisgICAgRlhfRFdPUkQgZHdJRFNlY29uZCA9IHdzTGFuZ3VhZ2UuR2V0TGVuZ3RoKCkgPj0gNSA/IHdzTGFuZ3VhZ2UuR2V0QXQoMykgPDwgOCB8IHdzTGFuZ3VhZ2UuR2V0QXQoNCkgOiAwOw0KKyAgICBzd2l0Y2ggKGR3SURGaXJzdCkgew0KKyAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ3onLCAnaCcpOiB7DQorICAgICAgICAgICAgICAgIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnYycsICduJykpIHsNCisgICAgICAgICAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX3poX0NOOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICd0JywgJ3cnKSkgew0KKyAgICAgICAgICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfemhfVFc7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnaycpKSB7DQorICAgICAgICAgICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF96aF9ISzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdqJywgJ2EnKToNCisgICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9qYV9KUDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdrJywgJ28nKToNCisgICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9rb19LUjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdlJywgJ24nKTogew0KKyAgICAgICAgICAgICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2cnLCAnYicpKSB7DQorICAgICAgICAgICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lbl9HQjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX1VTOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2QnLCAnZScpOg0KKyAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2RlX0RFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2YnLCAncicpOg0KKyAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2ZyX0ZSOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAncycpOiB7DQorICAgICAgICAgICAgICAgIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnZScsICdzJykpIHsNCisgICAgICAgICAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VzX0VTOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZXNfTEE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaScsICd0Jyk6DQorICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfaXRfSVQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAncCcsICd0Jyk6DQorICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfcHRfQlI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnbicsICdsJyk6DQorICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfbmxfTkw7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAncicsICd1Jyk6DQorICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfcnVfUlU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIGR3TGFuZ3VlSUQ7DQorfQ0KK0NYRkFfTG9jYWxlTWdyOjpDWEZBX0xvY2FsZU1ncihDWEZBX05vZGUqIHBMb2NhbGVTZXQsIENGWF9XaWRlU3RyaW5nIHdzRGVmbGNpZCkNCisgICAgOiBtX2R3TG9jYWxlRmxhZ3MoMHgwMCkNCit7DQorICAgIG1fZHdEZWZsY2lkID0gWEZBX0dldExhbmd1YWdlKHdzRGVmbGNpZCk7DQorICAgIENYRkFfTm9kZSogcE5vZGVMb2NhbGUgPSBOVUxMOw0KKyAgICBpZiAocExvY2FsZVNldCAmJiAocE5vZGVMb2NhbGUgPSBwTG9jYWxlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpKSB7DQorICAgICAgICB3aGlsZSAocE5vZGVMb2NhbGUpIHsNCisgICAgICAgICAgICBtX0xvY2FsZUFycmF5LkFkZChGWF9ORVcgQ1hGQV9Ob2RlTG9jYWxlKHBOb2RlTG9jYWxlKSk7DQorICAgICAgICAgICAgcE5vZGVMb2NhbGUgPSBwTm9kZUxvY2FsZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BEZWZMb2NhbGUgPSBHZXRMb2NhbGVCeU5hbWUod3NEZWZsY2lkKTsNCit9DQorQ1hGQV9Mb2NhbGVNZ3I6On5DWEZBX0xvY2FsZU1ncigpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0xvY2FsZUFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAoKElGWF9Mb2NhbGUqKW1fTG9jYWxlQXJyYXlbaV0pLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVhtbHMgPSBtX1hNTExvY2FsZUFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlYbWxzOyBqKyspIHsNCisgICAgICAgICgoSUZYX0xvY2FsZSopbV9YTUxMb2NhbGVBcnJheVtqXSktPlJlbGVhc2UoKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTG9jYWxlTWdyOjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9XT1JEIENYRkFfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGVJRCgpDQorew0KKyAgICByZXR1cm4gbV9kd0RlZmxjaWQ7DQorfQ0KK0lGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGUoKQ0KK3sNCisgICAgaWYgKG1fcERlZkxvY2FsZSkgew0KKyAgICAgICAgcmV0dXJuIG1fcERlZkxvY2FsZTsNCisgICAgfSBlbHNlIGlmIChtX0xvY2FsZUFycmF5LkdldFNpemUoKSkgew0KKyAgICAgICAgcmV0dXJuIChJRlhfTG9jYWxlKiltX0xvY2FsZUFycmF5WzBdOw0KKyAgICB9IGVsc2UgaWYgKG1fWE1MTG9jYWxlQXJyYXkuR2V0U2l6ZSgpKSB7DQorICAgICAgICByZXR1cm4gKElGWF9Mb2NhbGUqKW1fWE1MTG9jYWxlQXJyYXlbMF07DQorICAgIH0NCisgICAgbV9wRGVmTG9jYWxlID0gR2V0TG9jYWxlKG1fZHdEZWZsY2lkKTsNCisgICAgaWYgKG1fcERlZkxvY2FsZSAhPSBOVUxMKSB7DQorICAgICAgICBtX1hNTExvY2FsZUFycmF5LkFkZChtX3BEZWZMb2NhbGUpOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BEZWZMb2NhbGU7DQorfQ0KK0lGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXRMb2NhbGUoRlhfV09SRCBsY2lkKQ0KK3sNCisgICAgSUZYX0xvY2FsZSogcExvY2FsID0gTlVMTDsNCisgICAgc3dpdGNoIChsY2lkKSB7DQorICAgICAgICBjYXNlIFhGQV9MQU5HSURfemhfQ046DQorICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ196aENOX0xvY2FsZSwgc2l6ZW9mKGdfemhDTl9Mb2NhbGUpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0xBTkdJRF96aF9UVzoNCisgICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poVFdfTG9jYWxlLCBzaXplb2YoZ196aFRXX0xvY2FsZSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFOR0lEX3poX0hLOg0KKyAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhIS19Mb2NhbGUsIHNpemVvZihnX3poSEtfTG9jYWxlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQU5HSURfamFfSlA6DQorICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19qYUpQX0xvY2FsZSwgc2l6ZW9mKGdfamFKUF9Mb2NhbGUpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0xBTkdJRF9rb19LUjoNCisgICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2tvS1JfTG9jYWxlLCBzaXplb2YoZ19rb0tSX0xvY2FsZSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFOR0lEX2VuX0dCOg0KKyAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5HQl9Mb2NhbGUsIHNpemVvZihnX2VuR0JfTG9jYWxlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQU5HSURfZXNfTEE6DQorICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19lc0xBX0xvY2FsZSwgc2l6ZW9mKGdfZXNMQV9Mb2NhbGUpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0xBTkdJRF9lc19FUzoNCisgICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VzRVNfTG9jYWxlLCBzaXplb2YoZ19lc0VTX0xvY2FsZSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFOR0lEX2RlX0RFOg0KKyAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZGVERV9Mb2FjYWxlLCBzaXplb2YoZ19kZURFX0xvYWNhbGUpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0xBTkdJRF9mcl9GUjoNCisgICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2ZyRlJfTG9jYWxlLCBzaXplb2YoZ19mckZSX0xvY2FsZSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFOR0lEX2l0X0lUOg0KKyAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfaXRJVF9Mb2NhbGUsIHNpemVvZihnX2l0SVRfTG9jYWxlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQU5HSURfcHRfQlI6DQorICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19wdEJSX0xvY2FsZSwgc2l6ZW9mKGdfcHRCUl9Mb2NhbGUpKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0xBTkdJRF9ubF9OTDoNCisgICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX25sTkxfTG9jYWxlLCBzaXplb2YoZ19ubE5MX0xvY2FsZSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTEFOR0lEX3J1X1JVOg0KKyAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfcnVSVV9Mb2NhbGUsIHNpemVvZihnX3J1UlVfTG9jYWxlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQU5HSURfZW5fVVM6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5VU19Mb2NhbGUsIHNpemVvZihnX2VuVVNfTG9jYWxlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIHBMb2NhbDsNCit9DQorSUZYX0xvY2FsZSogQ1hGQV9Mb2NhbGVNZ3I6OkdldExvY2FsZUJ5TmFtZShGWF9XU1RSIHdzTG9jYWxlTmFtZSkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fTG9jYWxlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gKChJRlhfTG9jYWxlKiltX0xvY2FsZUFycmF5W2ldKTsNCisgICAgICAgIGlmIChwTG9jYWxlLT5HZXROYW1lKCkgPT0gd3NMb2NhbGVOYW1lKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBMb2NhbGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxlbiA9IHdzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPCAyKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpQ291bnQgPSBtX1hNTExvY2FsZUFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gKChJRlhfTG9jYWxlKiltX1hNTExvY2FsZUFycmF5W2ldKTsNCisgICAgICAgIGlmIChwTG9jYWxlLT5HZXROYW1lKCkgPT0gd3NMb2NhbGVOYW1lKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBMb2NhbGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfV09SRCBkd0xhbmd1ZUlEID0gWEZBX0dldExhbmd1YWdlKHdzTG9jYWxlTmFtZSk7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbGUoZHdMYW5ndWVJRCk7DQorICAgIGlmIChwTG9jYWxlICE9IE5VTEwpIHsNCisgICAgICAgIG1fWE1MTG9jYWxlQXJyYXkuQWRkKHBMb2NhbGUpOw0KKyAgICB9DQorICAgIHJldHVybiBwTG9jYWxlOw0KK30NCit2b2lkIENYRkFfTG9jYWxlTWdyOjpTZXREZWZMb2NhbGUoSUZYX0xvY2FsZSogcExvY2FsZSkNCit7DQorICAgIG1fcERlZkxvY2FsZSA9IHBMb2NhbGU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nQwlDWEZBX0xvY2FsZU1ncjo6R2V0Q29uZmlnTG9jYWxlTmFtZShDWEZBX05vZGUqIHBDb25maWcpDQorew0KKyAgICBpZiAoIShtX2R3TG9jYWxlRmxhZ3MgJiAweDAxKSkgew0KKyAgICAgICAgbV93c0NvbmZpZ0xvY2FsZS5FbXB0eSgpOw0KKyAgICAgICAgaWYgKHBDb25maWcpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGlsZGZDb25maWcgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgICAgICAgICAgICBpZiAoIXBDaGlsZGZDb25maWcpIHsNCisgICAgICAgICAgICAgICAgcENoaWxkZkNvbmZpZyA9IHBDb25maWctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1ByZXNlbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX05vZGUqIHBDb21tb24gPSBwQ2hpbGRmQ29uZmlnID8gcENoaWxkZkNvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29tbW9uKSA6IE5VTEw7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTG9jYWxlID0gcENvbW1vbiA/IHBDb21tb24tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0xvY2FsZSkgOiBOVUxMOw0KKyAgICAgICAgICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICAgICAgICAgIHBMb2NhbGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIG1fd3NDb25maWdMb2NhbGUsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX2R3TG9jYWxlRmxhZ3MgfD0gMHgwMTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV93c0NvbmZpZ0xvY2FsZTsNCit9DQorc3RhdGljIENYRkFfVGltZVpvbmVQcm92aWRlciAqZ19wUHJvdmlkZXIgPSBOVUxMOw0KK0lYRkFfVGltZVpvbmVQcm92aWRlciogSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpDcmVhdGUoKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KCFnX3BQcm92aWRlcik7DQorICAgIGdfcFByb3ZpZGVyID0gRlhfTkVXIENYRkFfVGltZVpvbmVQcm92aWRlcigpOw0KKyAgICByZXR1cm4gZ19wUHJvdmlkZXI7DQorfQ0KK0lYRkFfVGltZVpvbmVQcm92aWRlciogSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXQoKQ0KK3sNCisgICAgaWYgKCFnX3BQcm92aWRlcikgew0KKyAgICAgICAgZ19wUHJvdmlkZXIgPSBGWF9ORVcgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGdfcFByb3ZpZGVyOw0KK30NCit2b2lkIElYRkFfVGltZVpvbmVQcm92aWRlcjo6RGVzdHJveSgpDQorew0KKyAgICBkZWxldGUgZ19wUHJvdmlkZXI7DQorICAgIGdfcFByb3ZpZGVyID0gTlVMTDsNCit9DQorI2luY2x1ZGUgPHRpbWUuaD4NCitDWEZBX1RpbWVab25lUHJvdmlkZXI6OkNYRkFfVGltZVpvbmVQcm92aWRlcigpDQorew0KKyNpZiBfRlhNX1BMQVRGT1JNXz09X0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICBfdHpzZXQoKTsNCisgICAgbV90ei50ekhvdXIgPSAoRlhfSU5UOCkoX3RpbWV6b25lIC8gMzYwMCAqIC0xKTsNCisgICAgbV90ei50ek1pbnV0ZSA9IChGWF9JTlQ4KSgoRlhTWVNfYWJzKF90aW1lem9uZSkgJSAzNjAwKSAvIDYwKTsNCisjZWxzZQ0KKyAgICB0enNldCgpOw0KKyAgICBtX3R6LnR6SG91ciA9IChGWF9JTlQ4KSh0aW1lem9uZSAvIDM2MDAgKiAtMSk7DQorICAgIG1fdHoudHpNaW51dGUgPSAoRlhfSU5UOCkoKEZYU1lTX2FicygoaW50KXRpbWV6b25lKSAlIDM2MDApIC8gNjApOw0KKyNlbmRpZg0KK30NCitDWEZBX1RpbWVab25lUHJvdmlkZXI6On5DWEZBX1RpbWVab25lUHJvdmlkZXIoKQ0KK3sNCit9DQordm9pZCBDWEZBX1RpbWVab25lUHJvdmlkZXI6OlNldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikNCit7DQorICAgIG1fdHogPSB0ejsNCit9DQordm9pZCBDWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikNCit7DQorICAgIHR6ID0gbV90ejsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5NTg5YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKQEAgLTAsMCArMSw5NzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCitzdGF0aWMgY29uc3QgRlhfRE9VQkxFIGZyYWN0aW9uX3NjYWxlc1tdID0gezAuMSwgMC4wMSwgMC4wMDEsIDAuMDAwMSwgMC4wMDAwMSwgMC4wMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDEsIDAuMDAwMDAwMDEsIDAuMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAwMDAwMSwgMC4wMDAwMDAwMDAwMDAwMDAxDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQorc3RhdGljIEZYX0JPT0wgSXNBbHBoYShGWF9XQ0hBUiBjKQ0KK3sNCisgICAgcmV0dXJuIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKTsNCit9DQorQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSgpDQorew0KKyAgICBtX2R3VHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICBtX2JWYWxpZCA9IFRSVUU7DQorICAgIG1fcExvY2FsZU1nciA9IE5VTEw7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoY29uc3QgQ1hGQV9Mb2NhbGVWYWx1ZSYgdmFsdWUpDQorew0KKyAgICBtX2R3VHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICBtX2JWYWxpZCA9IFRSVUU7DQorICAgIG1fcExvY2FsZU1nciA9IE5VTEw7DQorICAgICp0aGlzID0gdmFsdWU7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncikNCit7DQorICAgIG1fZHdUeXBlID0gZHdUeXBlOw0KKyAgICBtX2JWYWxpZCA9IChtX2R3VHlwZSAhPSBYRkFfVlRfTlVMTCk7DQorICAgIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpDQorew0KKyAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICBtX2R3VHlwZSA9IGR3VHlwZTsNCisgICAgbV9wTG9jYWxlTWdyID0gcExvY2FsZU1ncjsNCisgICAgbV9iVmFsaWQgPSBWYWxpZGF0ZUNhbm9uaWNhbFZhbHVlKHdzVmFsdWUsIGR3VHlwZSk7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncikNCit7DQorICAgIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7DQorICAgIG1fYlZhbGlkID0gVFJVRTsNCisgICAgbV9kd1R5cGUgPSBkd1R5cGU7DQorICAgIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitDWEZBX0xvY2FsZVZhbHVlJiBDWEZBX0xvY2FsZVZhbHVlOjpvcGVyYXRvciA9IChjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSkNCit7DQorICAgIG1fd3NWYWx1ZSA9IHZhbHVlLm1fd3NWYWx1ZTsNCisgICAgbV9kd1R5cGUgPSB2YWx1ZS5tX2R3VHlwZTsNCisgICAgbV9iVmFsaWQgPSB2YWx1ZS5tX2JWYWxpZDsNCisgICAgbV9wTG9jYWxlTWdyID0gdmFsdWUubV9wTG9jYWxlTWdyOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6On5DWEZBX0xvY2FsZVZhbHVlKCkNCit7DQorfQ0KK3N0YXRpYyBGWF9MT0NBTEVDQVRFR09SWSBYRkFfVmFsdWdlQ2F0ZWdvcnkoRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5LCBGWF9EV09SRCBkd1ZhbHVlVHlwZSkNCit7DQorICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93bikgew0KKyAgICAgICAgc3dpdGNoIChkd1ZhbHVlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0JPT0xFQU46DQorICAgICAgICAgICAgY2FzZSBYRkFfVlRfSU5URUdFUjoNCisgICAgICAgICAgICBjYXNlIFhGQV9WVF9ERUNJTUFMOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfTnVtOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZUX1RFWFQ6DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Ow0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGVDYXRlZ29yeTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyogcE1hdGNoRm9ybWF0ICkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgICBJRlhfTG9jYWxlKiBsb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KKyAgICBpZiAocExvY2FsZSkgew0KKyAgICAgICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUocExvY2FsZSk7DQorICAgIH0NCisgICAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1BhdHRlcm5zOw0KKyAgICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c1BhdHRlcm4sIHdzUGF0dGVybnMpOw0KKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gd3NQYXR0ZXJucy5HZXRTaXplKCk7DQorICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICBmb3IgKDsgaSA8IGlDb3VudCAmJiAhYlJldDsgaSsrKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdCA9IHdzUGF0dGVybnNbaV07DQorICAgICAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7DQorICAgICAgICBlQ2F0ZWdvcnkgPSBYRkFfVmFsdWdlQ2F0ZWdvcnkoZUNhdGVnb3J5LCBtX2R3VHlwZSk7DQorICAgICAgICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVsbDoNCisgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVsbCh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICAgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgYlJldCA9IHdzVmFsdWUuSXNFbXB0eSgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfWmVybzoNCisgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlWmVybyh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICAgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgYlJldCA9IHdzVmFsdWUgPT0gRlhfV1NUUkMoTCIwIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdW06IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGZOdW07DQorICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdW0od3NWYWx1ZSwgd3NGb3JtYXQsIGZOdW0pOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdE51bSh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ6DQorICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZVRleHQod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0KTsNCisgICAgICAgICAgICAgICAgd3NPdXRwdXQuRW1wdHkoKTsNCisgICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0VGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICAgICAgICAgICAgICBiUmV0ID0gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZSwgZHQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KKyAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lLCBkdCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0LCBGWF9EQVRFVElNRVRZUEVfVGltZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KKyAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgZHQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCwgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYlJldCA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYlJldCAmJiBwTWF0Y2hGb3JtYXQpIHsNCisgICAgICAgICpwTWF0Y2hGb3JtYXQgPSB3c1BhdHRlcm5zW2kgLSAxXTsNCisgICAgfQ0KKyAgICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0xvY2FsZVZhbHVlOjpHZXRWYWx1ZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV93c1ZhbHVlOw0KK30NCitGWF9EV09SRCBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUeXBlKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX2R3VHlwZTsNCit9DQordm9pZCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfRFdPUkQgZHdUeXBlKQ0KK3sNCisgICAgbV93c1ZhbHVlID0gd3NWYWx1ZTsNCisgICAgbV9kd1R5cGUgPSBkd1R5cGU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTG9jYWxlVmFsdWU6OkdldFRleHQoKSBjb25zdA0KK3sNCisgICAgaWYgKG1fYlZhbGlkICYmIG1fZHdUeXBlID09IFhGQV9WVF9URVhUKSB7DQorICAgICAgICByZXR1cm4gbV93c1ZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOw0KK30NCitGWF9GTE9BVCBDWEZBX0xvY2FsZVZhbHVlOjpHZXROdW0oKSBjb25zdA0KK3sNCisgICAgaWYgKG1fYlZhbGlkICYmIChtX2R3VHlwZSA9PSBYRkFfVlRfQk9PTEVBTiB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfSU5URUdFUiB8fA0KKyAgICAgICAgICAgICAgICAgICAgIG1fZHdUeXBlID09IFhGQV9WVF9ERUNJTUFMIHx8IG1fZHdUeXBlID09IFhGQV9WVF9GTE9BVCkpIHsNCisgICAgICAgIEZYX0lOVDY0IG5JbnRlZ3JhbCA9IDA7DQorICAgICAgICBGWF9EV09SRCBkd0ZyYWN0aW9uYWwgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgbkV4cG9uZW50ID0gMDsNCisgICAgICAgIGludCBjYyA9IDA7DQorICAgICAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICAgICAgRlhfTFBDV1NUUiBzdHIgPSAoRlhfTFBDV1NUUiltX3dzVmFsdWU7DQorICAgICAgICBpbnQgbGVuID0gbV93c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgICAgICAgd2hpbGUgKFhGQV9Jc1NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChjYyA+PSBsZW4pIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChzdHJbMF0gPT0gJysnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgew0KKyAgICAgICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICAgIGludCBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSB8fCBuSW50ZWdyYWxMZW4gPiAxNykgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbkludGVncmFsID0gbkludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgICAgIG5JbnRlZ3JhbExlbisrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsNCisgICAgICAgIGludCBzY2FsZSA9IDA7DQorICAgICAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7DQorICAgICAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICAgICAgICAgICAgc2NhbGUgKys7DQorICAgICAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPT0gc2l6ZW9mIGZyYWN0aW9uX3NjYWxlcyAvIHNpemVvZihkb3VibGUpDQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkd0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICAgICAgY2MgKys7DQorICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZlZhbHVlID0gKEZYX0ZMT0FUKShkd0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjApOw0KKyAgICAgICAgZlZhbHVlID0gbkludGVncmFsICsgKG5JbnRlZ3JhbCA+PSAwID8gZlZhbHVlIDogLWZWYWx1ZSk7DQorICAgICAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCisgICAgICAgICAgICBmVmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbkV4cG9uZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBmVmFsdWU7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0RPVUJMRSBDWEZBX0xvY2FsZVZhbHVlOjpHZXREb3VibGVOdW0oKSBjb25zdA0KK3sNCisgICAgaWYgKG1fYlZhbGlkICYmIChtX2R3VHlwZSA9PSBYRkFfVlRfQk9PTEVBTiB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfSU5URUdFUiB8fA0KKyAgICAgICAgICAgICAgICAgICAgIG1fZHdUeXBlID09IFhGQV9WVF9ERUNJTUFMIHx8IG1fZHdUeXBlID09IFhGQV9WVF9GTE9BVCkpIHsNCisgICAgICAgIEZYX0lOVDY0IG5JbnRlZ3JhbCA9IDA7DQorICAgICAgICBGWF9EV09SRCBkd0ZyYWN0aW9uYWwgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgbkV4cG9uZW50ID0gMDsNCisgICAgICAgIEZYX0lOVDMyIGNjID0gMDsNCisgICAgICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICBGWF9MUENXU1RSIHN0ciA9IChGWF9MUENXU1RSKW1fd3NWYWx1ZTsNCisgICAgICAgIGludCBsZW4gPSBtX3dzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICAgICAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHN0clswXSA9PSAnKycpIHsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7DQorICAgICAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgbkludGVncmFsTGVuID0gMDsNCisgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkgfHwgbkludGVncmFsTGVuID4gMTcpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICBuSW50ZWdyYWxMZW4rKzsNCisgICAgICAgIH0NCisgICAgICAgIG5JbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC1uSW50ZWdyYWwgOiBuSW50ZWdyYWw7DQorICAgICAgICBGWF9JTlQzMiBzY2FsZSA9IDA7DQorICAgICAgICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7DQorICAgICAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICAgICAgICAgICAgc2NhbGUgKys7DQorICAgICAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPT0gc2l6ZW9mIGZyYWN0aW9uX3NjYWxlcyAvIHNpemVvZihGWF9ET1VCTEUpDQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkd0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICAgICAgY2MgKys7DQorICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IChkd0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjApOw0KKyAgICAgICAgZFZhbHVlID0gbkludGVncmFsICsgKG5JbnRlZ3JhbCA+PSAwID8gZFZhbHVlIDogLWRWYWx1ZSk7DQorICAgICAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCisgICAgICAgICAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbkV4cG9uZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBkVmFsdWU7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0NGWF9Vbml0aW1lIENYRkFfTG9jYWxlVmFsdWU6OkdldERhdGUoKSBjb25zdA0KK3sNCisgICAgaWYgKG1fYlZhbGlkICYmIG1fZHdUeXBlID09IFhGQV9WVF9EQVRFKSB7DQorICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQpOw0KKyAgICAgICAgcmV0dXJuIGR0Ow0KKyAgICB9DQorICAgIHJldHVybiBDRlhfVW5pdGltZSgpOw0KK30NCitDRlhfVW5pdGltZSBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUaW1lKCkgY29uc3QNCit7DQorICAgIGlmIChtX2JWYWxpZCAmJiBtX2R3VHlwZSA9PSBYRkFfVlRfVElNRSkgew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQoMCk7DQorICAgICAgICBGWFNZU19hc3NlcnQobV9wTG9jYWxlTWdyKTsNCisgICAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQsIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KKyAgICAgICAgcmV0dXJuIGR0Ow0KKyAgICB9DQorICAgIHJldHVybiBDRlhfVW5pdGltZSgpOw0KK30NCitDRlhfVW5pdGltZSBDWEZBX0xvY2FsZVZhbHVlOjpHZXREYXRlVGltZSgpIGNvbnN0DQorew0KKyAgICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEVUSU1FKSB7DQorICAgICAgICBGWF9JTlQzMiBpbmRleCA9IG1fd3NWYWx1ZS5GaW5kKCdUJyk7DQorICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZS5MZWZ0KGluZGV4KSwgZHQpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcExvY2FsZU1ncik7DQorICAgICAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbChtX3dzVmFsdWUuUmlnaHQobV93c1ZhbHVlLkdldExlbmd0aCgpIC0gaW5kZXggLSAxKSwgZHQsIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KKyAgICAgICAgcmV0dXJuIGR0Ow0KKyAgICB9DQorICAgIHJldHVybiBDRlhfVW5pdGltZSgpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkNCit7DQorICAgIG1fZHdUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgIG1fd3NWYWx1ZSA9IHdzVGV4dDsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUpDQorew0KKyAgICBtX2R3VHlwZSA9IFhGQV9WVF9URVhUOw0KKyAgICByZXR1cm4gbV9iVmFsaWQgPSBQYXJzZVBhdHRlcm5WYWx1ZSh3c1RleHQsIHdzRm9ybWF0LCBwTG9jYWxlKTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXROdW0oRlhfRkxPQVQgZk51bSkNCit7DQorICAgIG1fZHdUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICBtX3dzVmFsdWUuRm9ybWF0KChGWF9MUENXU1RSKUwiJS44ZyIsIChGWF9ET1VCTEUpZk51bSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KK3sNCisgICAgbV9kd1R5cGUgPSBYRkFfVlRfRkxPQVQ7DQorICAgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzTnVtLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0RGF0ZShjb25zdCBDRlhfVW5pdGltZSYgZCkNCit7DQorICAgIG1fZHdUeXBlID0gWEZBX1ZUX0RBVEU7DQorICAgIG1fd3NWYWx1ZS5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlMDRkLSUwMmQtJTAyZCIsIGQuR2V0WWVhcigpLCBkLkdldE1vbnRoKCksIGQuR2V0RGF5KCkpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSkNCit7DQorICAgIG1fZHdUeXBlID0gWEZBX1ZUX0RBVEU7DQorICAgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzRGF0ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldFRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHQpDQorew0KKyAgICBtX2R3VHlwZSA9IFhGQV9WVF9USU1FOw0KKyAgICBtX3dzVmFsdWUuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZDolMDJkOiUwMmQiLCB0LkdldEhvdXIoKSwgdC5HZXRNaW51dGUoKSwgdC5HZXRTZWNvbmQoKSk7DQorICAgIGlmICh0LkdldE1pbGxpc2Vjb25kKCkgPiAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICB3c1RlbXAuRm9ybWF0KChGWF9MUENXU1RSKUwiJTowM2QiLCB0LkdldE1pbGxpc2Vjb25kKCkpOw0KKyAgICAgICAgbV93c1ZhbHVlICs9IHdzVGVtcDsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSkNCit7DQorICAgIG1fZHdUeXBlID0gWEZBX1ZUX1RJTUU7DQorICAgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGltZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCkNCit7DQorICAgIG1fZHdUeXBlID0gWEZBX1ZUX0RBVEVUSU1FOw0KKyAgICBtX3dzVmFsdWUuRm9ybWF0KChGWF9MUENXU1RSKUwiJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQiLCBkdC5HZXRZZWFyKCksIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpLA0KKyAgICAgICAgICAgICAgICAgICAgIGR0LkdldEhvdXIoKSwgZHQuR2V0TWludXRlKCksIGR0LkdldFNlY29uZCgpKTsNCisgICAgaWYgKGR0LkdldE1pbGxpc2Vjb25kKCkgPiAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICB3c1RlbXAuRm9ybWF0KChGWF9MUENXU1RSKUwiJTowM2QiLCBkdC5HZXRNaWxsaXNlY29uZCgpKTsNCisgICAgICAgIG1fd3NWYWx1ZSArPSB3c1RlbXA7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUpDQorew0KKyAgICBtX2R3VHlwZSA9IFhGQV9WVF9EQVRFVElNRTsNCisgICAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NEYXRlVGltZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OkZvcm1hdFBhdHRlcm5zKENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdA0KK3sNCisgICAgd3NSZXN1bHQuRW1wdHkoKTsNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NQYXR0ZXJuczsNCisgICAgcEZvcm1hdC0+U3BsaXRGb3JtYXRTdHJpbmcod3NGb3JtYXQsIHdzUGF0dGVybnMpOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSB3c1BhdHRlcm5zLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBiUmV0ID0gRm9ybWF0U2luZ2xlUGF0dGVybih3c1Jlc3VsdCwgd3NQYXR0ZXJuc1tpXSwgcExvY2FsZSwgZVZhbHVlVHlwZSk7DQorICAgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3QNCit7DQorICAgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCisgICAgfQ0KKyAgICB3c1Jlc3VsdC5FbXB0eSgpOw0KKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgICAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCisgICAgRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5ID0gcEZvcm1hdC0+R2V0Q2F0ZWdvcnkod3NGb3JtYXQpOw0KKyAgICBlQ2F0ZWdvcnkgPSBYRkFfVmFsdWdlQ2F0ZWdvcnkoZUNhdGVnb3J5LCBtX2R3VHlwZSk7DQorICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQorICAgICAgICAgICAgaWYgKG1fd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdE51bGwod3NGb3JtYXQsIHdzUmVzdWx0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm86DQorICAgICAgICAgICAgaWYgKG1fd3NWYWx1ZSA9PSBGWF9XU1RSQyhMIjAiKSkgew0KKyAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0WmVybyh3c0Zvcm1hdCwgd3NSZXN1bHQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOg0KKyAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdW0obV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Og0KKyAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXRUZXh0KG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZToNCisgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZToNCisgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU6DQorICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICB3c1Jlc3VsdCA9IG1fd3NWYWx1ZTsNCisgICAgICAgICAgICBiUmV0ID0gVFJVRTsNCisgICAgfQ0KKyAgICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICAgIGlmICghYlJldCAmJiAoZUNhdGVnb3J5ICE9IEZYX0xPQ0FMRUNBVEVHT1JZX051bSB8fCBlVmFsdWVUeXBlICE9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkpIHsNCisgICAgICAgIHdzUmVzdWx0ID0gbV93c1ZhbHVlOw0KKyAgICB9DQorICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmV0Ow0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfVmFsdWVTcGxpdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKQ0KK3sNCisgICAgd3NEYXRlID0gTCIiOw0KKyAgICB3c1RpbWUgPSBMIiI7DQorICAgIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGludCBuU3BsaXRJbmRleCA9IC0xOw0KKyAgICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnVCcpOw0KKyAgICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgICAgICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnICcpOw0KKyAgICB9DQorICAgIGlmIChuU3BsaXRJbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3c0RhdGUgPSB3c0RhdGVUaW1lLkxlZnQoblNwbGl0SW5kZXgpOw0KKyAgICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9EV09SRCBkd1ZUeXBlKQ0KK3sNCisgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgc3dpdGNoIChkd1ZUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQorICAgICAgICAgICAgICAgIGlmIChWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgZHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgICAgICAgICAgaWYgKFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmIFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c0RhdGUsIGR0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCisgICAgICAgICAgICAgICAgaWYgKFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1ZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICAgICAgICAgICAgICAgIGlmIChYRkFfVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJiBWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NUaW1lKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgICAgICAgICAgICBpZiAoWEZBX1ZhbHVlU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkgJiYgVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgZHQpICYmIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX1VuaXRpbWUmIHVuRGF0ZSkNCit7DQorICAgIGNvbnN0IEZYX1dPUkQgTGFzdERheVsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07DQorICAgIGNvbnN0IEZYX1dPUkQgd0NvdW50WSA9IDQsIHdDb3VudE0gPSAyLCB3Q291bnREID0gMjsNCisgICAgaW50IG5MZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChuTGVuIDwgd0NvdW50WSB8fCBuTGVuID4gd0NvdW50WSArIHdDb3VudE0gKyB3Q291bnREICsgMikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlN5bWJvbCA9ICh3c0RhdGUuRmluZCgweDJEKSA9PSAtMSkgPyBGQUxTRSA6IFRSVUU7DQorICAgIEZYX1dPUkQgd1llYXIgPSAwLCB3TW9udGggPSAwLCB3RGF5ID0gMDsNCisgICAgRlhfTFBDV1NUUiBwRGF0ZSA9IChGWF9MUENXU1RSKXdzRGF0ZTsNCisgICAgaW50IG5JbmRleCA9IDAsIG5TdGFydCA9IDA7DQorICAgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IDwgd0NvdW50WSkgew0KKyAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdZZWFyID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd1llYXIgKiAxMDsNCisgICAgICAgIG5JbmRleCsrOw0KKyAgICB9DQorICAgIGlmIChiU3ltYm9sKSB7DQorICAgICAgICBpZiAocERhdGVbbkluZGV4XSAhPSAweDJEKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkluZGV4Kys7DQorICAgIH0NCisgICAgblN0YXJ0ID0gbkluZGV4Ow0KKyAgICB3aGlsZSAocERhdGVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudE0gJiYgbkluZGV4IDwgbkxlbikgew0KKyAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdNb250aCA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdNb250aCAqIDEwOw0KKyAgICAgICAgbkluZGV4Kys7DQorICAgIH0NCisgICAgaWYgKGJTeW1ib2wpIHsNCisgICAgICAgIGlmIChwRGF0ZVtuSW5kZXhdICE9IDB4MkQpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBuSW5kZXgrKzsNCisgICAgfQ0KKyAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50RCAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBEYXRlW25JbmRleF0pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd0RheSA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdEYXkgKiAxMDsNCisgICAgICAgIG5JbmRleCsrOw0KKyAgICB9DQorICAgIGlmIChuSW5kZXggIT0gbkxlbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICh3WWVhciA8IDE5MDAgfHwgd1llYXIgPiAyMDI5KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHdNb250aCA8IDEgfHwgd01vbnRoID4gMTIpIHsNCisgICAgICAgIGlmICh3TW9udGggPT0gMCAmJiBuTGVuID09IHdDb3VudFkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAod0RheSA8IDEpIHsNCisgICAgICAgIGlmICh3RGF5ID09IDAgJiYgKG5MZW4gPT0gd0NvdW50WSArIHdDb3VudE0pKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHdNb250aCA9PSAyKSB7DQorICAgICAgICBpZiAod1llYXIgJSA0MDAgPT0gMCB8fCAod1llYXIgJSAxMDAgIT0gMCAmJiB3WWVhciAlIDQgPT0gMCkpIHsNCisgICAgICAgICAgICBpZiAod0RheSA+IDI5KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICh3RGF5ID4gMjgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmICh3RGF5ID4gTGFzdERheVt3TW9udGggLSAxXSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9Vbml0aW1lIHV0Ow0KKyAgICB1dC5TZXQod1llYXIsIHdNb250aCwgd0RheSk7DQorICAgIHVuRGF0ZSA9IHVuRGF0ZSArIHV0Ow0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSkNCit7DQorICAgIGludCBuTGVuID0gd3NUaW1lLkdldExlbmd0aCgpOw0KKyAgICBpZiAobkxlbiA8IDIpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBjb25zdCBGWF9XT1JEIHdDb3VudEggPSAyLCB3Q291bnRNID0gMiwgd0NvdW50UyA9IDIsIHdDb3VudEYgPSAzOw0KKyAgICBGWF9CT09MIGJTeW1ib2wgPSAod3NUaW1lLkZpbmQoJzonKSA9PSAtMSkgPyBGQUxTRSA6IFRSVUU7DQorICAgIEZYX1dPUkQgd0hvdXIgPSAwLCB3TWludXRlID0gMCwgd1NlY29uZCA9IDAsIHdGcmFjdGlvbiA9IDA7DQorICAgIEZYX0xQQ1dTVFIgcFRpbWUgPSAoRlhfTFBDV1NUUil3c1RpbWU7DQorICAgIGludCBuSW5kZXggPSAwLCBuU3RhcnQgPSAwOw0KKyAgICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudEgpIHsNCisgICAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3SG91ciA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIHdIb3VyICogMTA7DQorICAgICAgICBuSW5kZXgrKzsNCisgICAgfQ0KKyAgICBpZiAoYlN5bWJvbCkgew0KKyAgICAgICAgaWYgKG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSAhPSAnOicpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBuSW5kZXgrKzsNCisgICAgfQ0KKyAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgIHdoaWxlIChwVGltZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50TSAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBUaW1lW25JbmRleF0pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd01pbnV0ZSA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIHdNaW51dGUgKiAxMDsNCisgICAgICAgIG5JbmRleCsrOw0KKyAgICB9DQorICAgIGlmIChiU3ltYm9sKSB7DQorICAgICAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6Jykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG5JbmRleCsrOw0KKyAgICB9DQorICAgIG5TdGFydCA9IG5JbmRleDsNCisgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRTICYmIG5JbmRleCA8IG5MZW4pIHsNCisgICAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3U2Vjb25kID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgd1NlY29uZCAqIDEwOw0KKyAgICAgICAgbkluZGV4Kys7DQorICAgIH0NCisgICAgaWYgKHdzVGltZS5GaW5kKCcuJykgPiAwKSB7DQorICAgICAgICBpZiAocFRpbWVbbkluZGV4XSAhPSAnLicpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBuSW5kZXgrKzsNCisgICAgICAgIG5TdGFydCA9IG5JbmRleDsNCisgICAgICAgIHdoaWxlIChwVGltZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50RiAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgICAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdGcmFjdGlvbiA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIHdGcmFjdGlvbiAqIDEwOw0KKyAgICAgICAgICAgIG5JbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChuSW5kZXggPCBuTGVuKSB7DQorICAgICAgICBpZiAocFRpbWVbbkluZGV4XSA9PSAnWicpIHsNCisgICAgICAgICAgICBuSW5kZXgrKzsNCisgICAgICAgIH0gZWxzZSBpZiAocFRpbWVbbkluZGV4XSA9PSAnLScgfHwgcFRpbWVbbkluZGV4XSA9PSAnKycpIHsNCisgICAgICAgICAgICBGWF9TSE9SVCBuT2Zmc2V0SCA9IDAsIG5PZmZzZXRNID0gMDsNCisgICAgICAgICAgICBuSW5kZXgrKzsNCisgICAgICAgICAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgICAgICAgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRIICYmIG5JbmRleCA8IG5MZW4pIHsNCisgICAgICAgICAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5PZmZzZXRIID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgbk9mZnNldEggKiAxMDsNCisgICAgICAgICAgICAgICAgbkluZGV4Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiU3ltYm9sKSB7DQorICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0gIT0gJzonKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbkluZGV4Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG5TdGFydCA9IG5JbmRleDsNCisgICAgICAgICAgICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudE0gJiYgbkluZGV4IDwgbkxlbikgew0KKyAgICAgICAgICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBUaW1lW25JbmRleF0pKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbk9mZnNldE0gPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyBuT2Zmc2V0TSAqIDEwOw0KKyAgICAgICAgICAgICAgICBuSW5kZXgrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG5PZmZzZXRIID4gMTIpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobk9mZnNldE0gPj0gNjApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobkluZGV4ICE9IG5MZW4pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAod0hvdXIgPj0gMjQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAod01pbnV0ZSA+PSA2MCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICh3U2Vjb25kID49IDYwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHdGcmFjdGlvbiA+IDk5OSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsRGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgaWYgKHdzRGF0ZVRpbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaW50IG5TcGxpdEluZGV4ID0gLTE7DQorICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQorICAgIGlmIChuU3BsaXRJbmRleCA8IDApIHsNCisgICAgICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICAgIH0NCisgICAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQorICAgIHdzVGltZSA9IHdzRGF0ZVRpbWUuUmlnaHQod3NEYXRlVGltZS5HZXRMZW5ndGgoKSAtIG5TcGxpdEluZGV4IC0gMSk7DQorICAgIENGWF9Vbml0aW1lIGR0Ow0KKyAgICByZXR1cm4gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgZHQpICYmIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlBhcnNlUGF0dGVyblZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KK3sNCisgICAgSUZYX0xvY2FsZSogbG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgaWYgKHBMb2NhbGUpIHsNCisgICAgICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKHBMb2NhbGUpOw0KKyAgICB9DQorICAgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NQYXR0ZXJuczsNCisgICAgcEZvcm1hdC0+U3BsaXRGb3JtYXRTdHJpbmcod3NQYXR0ZXJuLCB3c1BhdHRlcm5zKTsNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHdzUGF0dGVybnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ID0gd3NQYXR0ZXJuc1tpXTsNCisgICAgICAgIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9IHBGb3JtYXQtPkdldENhdGVnb3J5KHdzRm9ybWF0KTsNCisgICAgICAgIGVDYXRlZ29yeSA9IFhGQV9WYWx1Z2VDYXRlZ29yeShlQ2F0ZWdvcnksIG1fZHdUeXBlKTsNCisgICAgICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7DQorICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOg0KKyAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdWxsKHdzVmFsdWUsIHdzRm9ybWF0KTsNCisgICAgICAgICAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fd3NWYWx1ZS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfWmVybzoNCisgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlWmVybyh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICAgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICBtX3dzVmFsdWUgPSBGWF9XU1RSQyhMIjAiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bTogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZk51bTsNCisgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZU51bSh3c1ZhbHVlLCB3c0Zvcm1hdCwgZk51bSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd3NWYWx1ZSA9IGZOdW07DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGV4dDoNCisgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlVGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgbV93c1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgZHQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlLCBkdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNldERhdGUoZHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KKyAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lLCBkdCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFRpbWUoZHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUsIGR0KTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgU2V0RGF0ZVRpbWUoZHQpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICAgICAgICAgICAgICBiUmV0ID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICB9DQorICAgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCisgICAgaWYgKHBMb2NhbGUpIHsNCisgICAgICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKGxvY2FsZSk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0TnVtYmVyaWNGb3JtYXQoQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0LCBGWF9JTlQzMiBuSW50TGVuLCBGWF9JTlQzMiBuRGVjTGVuLCBGWF9CT09MIGJTaWduICkNCit7DQorICAgIEZYU1lTX2Fzc2VydCh3c0Zvcm1hdC5Jc0VtcHR5KCkpOw0KKyAgICBGWFNZU19hc3NlcnQobkludExlbiA+PSAtMSAmJiBuRGVjTGVuID49IC0xKTsNCisgICAgRlhfSU5UMzIgblRvdGFsTGVuIFwNCisgICAgICAgID0gKG5JbnRMZW4gPj0gMCA/IG5JbnRMZW4gOiAyKSBcDQorICAgICAgICAgICsgKGJTaWduID8gMSA6IDApIFwNCisgICAgICAgICAgKyAobkRlY0xlbiA+PSAwID8gbkRlY0xlbiA6IDIpIFwNCisgICAgICAgICAgKyAobkRlY0xlbiA9PSAwID8gMCA6IDEpOw0KKyAgICBGWF9MUFdTVFIgbHBCdWYgPSB3c0Zvcm1hdC5HZXRCdWZmZXIoblRvdGFsTGVuKTsNCisgICAgRlhfSU5UMzIgblBvcyA9IDA7DQorICAgIGlmIChiU2lnbikgew0KKyAgICAgICAgbHBCdWZbblBvcysrXSA9IEwncyc7DQorICAgIH0NCisgICAgaWYgKG5JbnRMZW4gPT0gLTEpIHsNCisgICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICAgICAgbHBCdWZbblBvcysrXSA9IEwnKic7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAobkludExlbikgew0KKyAgICAgICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICAgICAgICAgIG5JbnRMZW4gLS07DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKG5EZWNMZW4gIT0gMCkgew0KKyAgICAgICAgbHBCdWZbblBvcysrXSA9IEwnLic7DQorICAgIH0NCisgICAgaWYgKG5EZWNMZW4gPT0gLTEpIHsNCisgICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICAgICAgbHBCdWZbblBvcysrXSA9IEwnKic7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAobkRlY0xlbikgew0KKyAgICAgICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICAgICAgICAgIG5EZWNMZW4gLS07DQorICAgICAgICB9DQorICAgIH0NCisgICAgd3NGb3JtYXQuUmVsZWFzZUJ1ZmZlcihuVG90YWxMZW4pOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlTnVtZXJpY1RlbXAoQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtZXJpYywgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlICwgRlhfSU5UMzIqIHBvcyApDQorew0KKyAgICBpZiAod3NGb3JtYXQuSXNFbXB0eSgpIHx8IHdzTnVtZXJpYy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIEZYX0xQQ1dTVFIgcE51bSA9IEZYX0xQQ1dTVFIod3NOdW1lcmljKTsNCisgICAgRlhfTFBDV1NUUiBwRm10ID0gRlhfTFBDV1NUUih3c0Zvcm1hdCk7DQorICAgIEZYX0lOVDMyIG4gPSAwLCBuZiA9IDA7DQorICAgIEZYX1dDSEFSIGMJPSBwTnVtW25dOw0KKyAgICBGWF9XQ0hBUiBjZgk9IHBGbXRbbmZdOw0KKyAgICBpZiAoY2YgPT0gTCdzJykgew0KKyAgICAgICAgaWYgKGMgPT0gTCctJyB8fCBjID09IEwnKycpIHsNCisgICAgICAgICAgICArK247DQorICAgICAgICB9DQorICAgICAgICArK25mOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkxpbWl0ID0gVFJVRTsNCisgICAgRlhfSU5UMzIgbkNvdW50CQk9IHdzTnVtZXJpYy5HZXRMZW5ndGgoKTsNCisgICAgRlhfSU5UMzIgbkNvdW50Rm10CT0gd3NGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChuIDwgbkNvdW50ICYmIChiTGltaXQgPyBuZiA8IG5Db3VudEZtdCA6IFRSVUUpICYmIFhGQV9Jc0RpZ2l0KGMgPSBwTnVtW25dKSkgew0KKyAgICAgICAgaWYgKGJMaW1pdCA9PSBUUlVFKSB7DQorICAgICAgICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKSB7DQorICAgICAgICAgICAgICAgIGJMaW1pdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2YgPT0gTCd6Jykgew0KKyAgICAgICAgICAgICAgICBuZiArKzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbiArKzsNCisgICAgfQ0KKyAgICBpZiAobiA9PSBuQ291bnQpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChuZiA9PSBuQ291bnRGbXQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3aGlsZSAobmYgPCBuQ291bnRGbXQgJiYgKGNmID0gcEZtdFtuZl0pICE9IEwnLicpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChjZiA9PSBMJ3onIHx8IGNmID09IEwnKicpOw0KKyAgICAgICAgKytuZjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RlY2ltYWxTeW1ib2w7DQorICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEZWNpbWFsU3ltYm9sKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdzRGVjaW1hbFN5bWJvbCA9IENGWF9XaWRlU3RyaW5nKEwnLicpOw0KKyAgICB9DQorICAgIGlmIChwRm10W25mXSAhPSBMJy4nKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHdzRGVjaW1hbFN5bWJvbCAhPSBDRlhfV2lkZVN0cmluZ0MoYykgJiYgYyAhPSBMJy4nKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgKysgbmY7DQorICAgICsrIG47DQorICAgIGJMaW1pdCA9IFRSVUU7DQorICAgIHdoaWxlIChuIDwgbkNvdW50ICYmIChiTGltaXQgPyBuZiA8IG5Db3VudEZtdCA6IFRSVUUpICYmIFhGQV9Jc0RpZ2l0KGMgPSBwTnVtW25dKSkgew0KKyAgICAgICAgaWYgKGJMaW1pdCA9PSBUUlVFKSB7DQorICAgICAgICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKSB7DQorICAgICAgICAgICAgICAgIGJMaW1pdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2YgPT0gTCd6Jykgew0KKyAgICAgICAgICAgICAgICBuZiArKzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbiArKzsNCisgICAgfQ0KKyAgICByZXR1cm4gbiA9PSBuQ291bnQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGYyOWE1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX29iamVjdF9pbXAuY3BwCkBAIC0wLDAgKzEsNTEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfYmFzaWNfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQorQ1hGQV9PYmplY3Q6OkNYRkFfT2JqZWN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfRFdPUkQgdUZsYWdzKQ0KKyAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkNCisgICAgLCBtX3VGbGFncyh1RmxhZ3MpDQorew0KK30NCit2b2lkIENYRkFfT2JqZWN0OjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmdDICZ3c05hbWUpIGNvbnN0DQorew0KKyAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5SUQoR2V0Q2xhc3NJRCgpKTsNCisgICAgQVNTRVJUKHBFbGVtZW50ICE9IE5VTEwpOw0KKyAgICB3c05hbWUgPSBwRWxlbWVudC0+cE5hbWU7DQorfQ0KK0ZYX1VJTlQzMiBDWEZBX09iamVjdDo6R2V0Q2xhc3NIYXNoQ29kZSgpIGNvbnN0DQorew0KKyAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5SUQoR2V0Q2xhc3NJRCgpKTsNCisgICAgQVNTRVJUKHBFbGVtZW50ICE9IE5VTEwpOw0KKyAgICByZXR1cm4gcEVsZW1lbnQtPnVIYXNoOw0KK30NCitYRkFfRUxFTUVOVCBDWEZBX09iamVjdDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQorew0KKyAgICBpZiAoSXNOb2RlKCkpIHsNCisgICAgICAgIHJldHVybiAoKGNvbnN0IENYRkFfTm9kZSopdGhpcyktPkdldENsYXNzSUQoKTsNCisgICAgfSBlbHNlIGlmKElzT3JkaW5hcnlPYmplY3QoKSkgew0KKyAgICAgICAgcmV0dXJuICgoY29uc3QgQ1hGQV9PcmRpbmFyeU9iamVjdCopdGhpcyktPkdldENsYXNzSUQoKTsNCisgICAgfSBlbHNlIGlmKElzTm9kZUxpc3QoKSkgew0KKyAgICAgICAgcmV0dXJuICgoY29uc3QgQ1hGQV9Ob2RlTGlzdCopdGhpcyktPkdldENsYXNzSUQoKTsNCisgICAgfSBlbHNlIGlmKElzT3JkaW5hcnlMaXN0KCkpCXsNCisgICAgICAgIHJldHVybiBYRkFfRUxFTUVOVF9MaXN0Ow0KKyAgICB9DQorICAgIEFTU0VSVChGQUxTRSk7DQorICAgIHJldHVybiAoWEZBX0VMRU1FTlQpMDsNCit9DQordm9pZCBDWEZBX09iamVjdDo6U2NyaXB0X09iamVjdENsYXNzX0NsYXNzTmFtZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoIWJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0MgY2xhc3NOYW1lOw0KKyAgICAgICAgR2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShjbGFzc05hbWUuR2V0UHRyKCksIGNsYXNzTmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfT2JqZWN0OjpUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShGWF9JTlQzMiBpU3RyaW5nSUQsIC4uLikNCit7DQorICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBBcHBQcm92aWRlcik7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoaVN0cmluZ0lELCB3c0Zvcm1hdCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgICAgdmFfbGlzdCBhcmdfcHRyOw0KKyAgICB2YV9zdGFydChhcmdfcHRyLCBpU3RyaW5nSUQpOw0KKyAgICB3c01lc3NhZ2UuRm9ybWF0VigoRlhfTFBDV1NUUil3c0Zvcm1hdCwgYXJnX3B0cik7DQorICAgIHZhX2VuZChhcmdfcHRyKTsNCisgICAgRlhKU0VfVGhyb3dNZXNzYWdlKEZYX0JTVFJDKCIiKSwgRlhfVVRGOEVuY29kZSh3c01lc3NhZ2UsIHdzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGVsZXRlV2lkZVN0cmluZyhGWF9MUFZPSUQgcERhdGEpDQorew0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZYX1dpZGVTdHJpbmcqKXBEYXRhOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9Db3B5V2lkZVN0cmluZyhGWF9MUFZPSUQmIHBEYXRhKQ0KK3sNCisgICAgaWYgKHBEYXRhKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyogcE5ld0RhdGEgPSBGWF9ORVcgQ0ZYX1dpZGVTdHJpbmcoKihDRlhfV2lkZVN0cmluZyopcERhdGEpOw0KKyAgICAgICAgcERhdGEgPSBwTmV3RGF0YTsNCisgICAgfQ0KK30NCitzdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2sgPSB7WEZBX0RlbGV0ZVdpZGVTdHJpbmcsIFhGQV9Db3B5V2lkZVN0cmluZ307DQorc3RhdGljIFhGQV9PQkpFQ1RUWVBFIFhGQV9HZXRFbGVtZW50T2JqZWN0VHlwZShYRkFfRUxFTUVOVCBlRWxlbWVudCkNCit7DQorICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlJRChlRWxlbWVudCk7DQorICAgIEFTU0VSVChwRWxlbWVudCAhPSBOVUxMKTsNCisgICAgcmV0dXJuIChYRkFfT0JKRUNUVFlQRSlwRWxlbWVudC0+ZU9iamVjdFR5cGU7DQorfQ0KK0NYRkFfTm9kZTo6Q1hGQV9Ob2RlKENYRkFfRG9jdW1lbnQgKnBEb2MsIEZYX1dPUkQgZVBhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpDQorICAgIDogQ1hGQV9PYmplY3QocERvYywgWEZBX0dldEVsZW1lbnRPYmplY3RUeXBlKGVFbGVtZW50KSkNCisgICAgLCBtX3BQYXJlbnQoTlVMTCkNCisgICAgLCBtX3BOZXh0KE5VTEwpDQorICAgICwgbV9wQ2hpbGQoTlVMTCkNCisgICAgLCBtX3BMYXN0Q2hpbGQoTlVMTCkNCisgICAgLCBtX3BYTUxOb2RlKE5VTEwpDQorICAgICwgbV9lUGFja2V0KGVQYWNrZXQpDQorICAgICwgbV9lTm9kZUNsYXNzKGVFbGVtZW50KQ0KKyAgICAsIG1fZHdOYW1lSGFzaCgwKQ0KKyAgICAsIG1fcEF1eE5vZGUoTlVMTCkNCisgICAgLCBtX3BNYXBNb2R1bGVEYXRhKE5VTEwpDQorew0KKyAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQorfQ0KK0NYRkFfTm9kZTo6fkNYRkFfTm9kZSgpDQorew0KKyAgICBGWFNZU19hc3NlcnQobV9wUGFyZW50ID09IE5VTEwpOw0KKyAgICBSZW1vdmVNYXBNb2R1bGVLZXkoKTsNCisgICAgQ1hGQV9Ob2RlICpwTmV4dCwgKnBOb2RlID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwTm9kZSkgew0KKyAgICAgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICAgICAgZGVsZXRlIHBOb2RlOw0KKyAgICAgICAgcE5vZGUgPSBwTmV4dDsNCisgICAgfQ0KKyAgICBpZiAobV9wWE1MTm9kZSAmJiBIYXNGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlKSkgew0KKyAgICAgICAgbV9wWE1MTm9kZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQorew0KKyAgICBJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQorICAgIENYRkFfTm9kZSAqcENsb25lID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUobV9lUGFja2V0LCBtX2VOb2RlQ2xhc3MpOw0KKyAgICBpZighcENsb25lKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBNZXJnZUFsbERhdGEocENsb25lKTsNCisgICAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOw0KKyAgICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpKSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBDbG9uZVhNTCA9IE5VTEw7DQorICAgICAgICBpZiAoSXNBdHRyaWJ1dGVJblhNTCgpKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICAgICAgICAgIHRoaXMtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSwgRkFMU0UpOw0KKyAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcENsb25lWE1MRWxlbWVudCA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKHdzTmFtZSk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCisgICAgICAgICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIHBDbG9uZVhNTEVsZW1lbnQtPlNldFRleHREYXRhKHdzVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQ2xvbmVYTUwgPSBwQ2xvbmVYTUxFbGVtZW50Ow0KKyAgICAgICAgICAgIHBDbG9uZVhNTEVsZW1lbnQgPSBOVUxMOw0KKyAgICAgICAgICAgIHBDbG9uZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENsb25lWE1MID0gbV9wWE1MTm9kZS0+Q2xvbmUoRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcENsb25lLT5TZXRYTUxNYXBwaW5nTm9kZShwQ2xvbmVYTUwpOw0KKyAgICAgICAgcENsb25lLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKGJSZWN1cnNpdmUpIHsNCisgICAgICAgIGZvcihDWEZBX05vZGUqIHBDaGlsZCA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBwQ2xvbmUtPkluc2VydENoaWxkKHBDaGlsZC0+Q2xvbmUoYlJlY3Vyc2l2ZSkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBDbG9uZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICBwQ2xvbmUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBOVUxMKTsNCisgICAgcmV0dXJuIHBDbG9uZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTSBlSXRlbSkgY29uc3QNCit7DQorICAgIHN3aXRjaCAoZUl0ZW0pIHsNCisgICAgICAgIGNhc2UgWEZBX05PREVJVEVNX05leHRTaWJsaW5nOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BOZXh0Ow0KKyAgICAgICAgY2FzZSBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZDoNCisgICAgICAgICAgICByZXR1cm4gbV9wQ2hpbGQ7DQorICAgICAgICBjYXNlIFhGQV9OT0RFSVRFTV9QYXJlbnQ6DQorICAgICAgICAgICAgcmV0dXJuIG1fcFBhcmVudDsNCisgICAgICAgIGNhc2UgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nOg0KKyAgICAgICAgICAgIGlmIChtX3BQYXJlbnQpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwU2libGluZyA9IG1fcFBhcmVudC0+bV9wQ2hpbGQ7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFByZXYgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAocFNpYmxpbmcgJiYgcFNpYmxpbmcgIT0gdGhpcykgew0KKyAgICAgICAgICAgICAgICAgICAgcFByZXYgPSBwU2libGluZzsNCisgICAgICAgICAgICAgICAgICAgIHBTaWJsaW5nID0gcFNpYmxpbmctPm1fcE5leHQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHBQcmV2Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROb2RlSXRlbShYRkFfTk9ERUlURU0gZUl0ZW0sIFhGQV9PQkpFQ1RUWVBFIGVUeXBlKSBjb25zdA0KK3sNCisgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IE5VTEw7DQorICAgIHN3aXRjaCAoZUl0ZW0pIHsNCisgICAgICAgIGNhc2UgWEZBX05PREVJVEVNX05leHRTaWJsaW5nOg0KKyAgICAgICAgICAgIHBOb2RlID0gbV9wTmV4dDsNCisgICAgICAgICAgICBpZiAoZVR5cGUgIT0gWEZBX09CSkVDVFRZUEVNQVNLKQ0KKyAgICAgICAgICAgICAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBlVHlwZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZDoNCisgICAgICAgICAgICBwTm9kZSA9IG1fcENoaWxkOw0KKyAgICAgICAgICAgIGlmIChlVHlwZSAhPSBYRkFfT0JKRUNUVFlQRU1BU0spDQorICAgICAgICAgICAgICAgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IGVUeXBlKSB7DQorICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9OT0RFSVRFTV9QYXJlbnQ6DQorICAgICAgICAgICAgcE5vZGUgPSBtX3BQYXJlbnQ7DQorICAgICAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9PQkpFQ1RUWVBFTUFTSykNCisgICAgICAgICAgICAgICAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFBhcmVudDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfTk9ERUlURU1fUHJldlNpYmxpbmc6DQorICAgICAgICAgICAgaWYgKG1fcFBhcmVudCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsNCisgICAgICAgICAgICAgICAgd2hpbGUgKHBTaWJsaW5nICYmIHBTaWJsaW5nICE9IHRoaXMpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfT0JKRUNUVFlQRU1BU0sgfHwgZVR5cGUgPT0gcFNpYmxpbmctPkdldE9iamVjdFR5cGUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcFNpYmxpbmc7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwU2libGluZyA9IHBTaWJsaW5nLT5tX3BOZXh0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gcE5vZGU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfTm9kZTo6R2V0Tm9kZUxpc3QoQ1hGQV9Ob2RlQXJyYXkgJm5vZGVzLCBGWF9EV09SRCBkd1R5cGVGaWx0ZXIgLCBYRkFfRUxFTUVOVCBlRWxlbWVudEZpbHRlciAsIEZYX0lOVDMyIGlMZXZlbCApDQorew0KKyAgICBpZiAoLS1pTGV2ZWwgPCAwKSB7DQorICAgICAgICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIGlmIChlRWxlbWVudEZpbHRlciAhPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgICAgICBDWEZBX05vZGUgKnBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICAgICAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICAgICAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudEZpbHRlcikgew0KKyAgICAgICAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgICAgICAgICAgaWYgKGlMZXZlbCA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIEdldE5vZGVMaXN0KG5vZGVzLCBkd1R5cGVGaWx0ZXIsIGVFbGVtZW50RmlsdGVyLCBpTGV2ZWwpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1R5cGVGaWx0ZXIgPT0gKFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwgWEZBX05PREVGSUxURVJfUHJvcGVydGllcykpIHsNCisgICAgICAgIENYRkFfTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgICAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQorICAgICAgICAgICAgaWYgKGlMZXZlbCA+IDApIHsNCisgICAgICAgICAgICAgICAgR2V0Tm9kZUxpc3Qobm9kZXMsIGR3VHlwZUZpbHRlciwgZUVsZW1lbnRGaWx0ZXIsIGlMZXZlbCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1R5cGVGaWx0ZXIgIT0gMCkgew0KKyAgICAgICAgRlhfQk9PTCBiRmlsdGVyQ2hpbGRyZW4gPSAoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pICE9IDA7DQorICAgICAgICBGWF9CT09MIGJGaWx0ZXJQcm9wZXJ0aWVzID0gKGR3VHlwZUZpbHRlciAmIFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpICE9IDA7DQorICAgICAgICBGWF9CT09MIGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgPSAoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfT25lT2ZQcm9wZXJ0eSkgIT0gMDsNCisgICAgICAgIENYRkFfTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgICAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KEdldENsYXNzSUQoKSwgcENoaWxkLT5HZXRDbGFzc0lEKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7DQorICAgICAgICAgICAgaWYgKHBQcm9wZXJ0KSB7DQorICAgICAgICAgICAgICAgIGlmIChiRmlsdGVyUHJvcGVydGllcykgew0KKyAgICAgICAgICAgICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkZpbHRlck9uZU9mUHJvcGVydGllcyAmJiAocFByb3BlcnQtPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7DQorICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGJGaWx0ZXJDaGlsZHJlbiAmJiAocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzIHx8IHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChiRmlsdGVyQ2hpbGRyZW4pIHsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChwQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzICYmIG5vZGVzLkdldFNpemUoKSA8IDEpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUHJvcGVydGllcyA9IDA7DQorICAgICAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0eSA9IFhGQV9HZXRFbGVtZW50UHJvcGVydGllcyhHZXRDbGFzc0lEKCksIGlQcm9wZXJ0aWVzKTsNCisgICAgICAgICAgICBpZiAocFByb3BlcnR5ID09IE5VTEwgfHwgaVByb3BlcnRpZXMgPCAxKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVByb3BlcnRpZXM7IGkrKykgew0KKyAgICAgICAgICAgICAgICBpZiAocFByb3BlcnR5W2ldLnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mKSB7DQorICAgICAgICAgICAgICAgICAgICBJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQorICAgICAgICAgICAgICAgICAgICBYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0ID0gWEZBX0dldFBhY2tldEJ5SUQoR2V0UGFja2V0SUQoKSk7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUocFBhY2tldCwgKFhGQV9FTEVNRU5UKXBQcm9wZXJ0eVtpXS5lTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICBpZighcE5ld05vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEluc2VydENoaWxkKHBOZXdOb2RlLCBOVUxMKTsNCisgICAgICAgICAgICAgICAgICAgIHBOZXdOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQocE5ld05vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG5vZGVzLkdldFNpemUoKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9EV09SRCBkd0ZsYWdzKQ0KK3sNCisgICAgSVhGQV9PYmpGYWN0b3J5ICpwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUobV9lUGFja2V0LCBlRWxlbWVudCk7DQorICAgIHBOb2RlLT5TZXRGbGFnKGR3RmxhZ3MpOw0KKyAgICByZXR1cm4gcE5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpDbG9uZVRlbXBsYXRlVG9Gb3JtKEZYX0JPT0wgYlJlY3Vyc2l2ZSkNCit7DQorICAgIEZYU1lTX2Fzc2VydChtX2VQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSk7DQorICAgIElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKTsNCisgICAgQ1hGQV9Ob2RlICpwQ2xvbmUgPSBwRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Zvcm0sIG1fZU5vZGVDbGFzcyk7DQorICAgIGlmKCFwQ2xvbmUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBDbG9uZS0+U2V0VGVtcGxhdGVOb2RlKHRoaXMpOw0KKyAgICBwQ2xvbmUtPlVwZGF0ZU5hbWVIYXNoKCk7DQorICAgIHBDbG9uZS0+U2V0WE1MTWFwcGluZ05vZGUoR2V0WE1MTWFwcGluZ05vZGUoKSk7DQorICAgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgcENsb25lLT5JbnNlcnRDaGlsZChwQ2hpbGQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oYlJlY3Vyc2l2ZSkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBDbG9uZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICByZXR1cm4gcENsb25lOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0VGVtcGxhdGVOb2RlKCkNCit7DQorICAgIHJldHVybiBtX3BBdXhOb2RlOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkNCit7DQorICAgIG1fcEF1eE5vZGUgPSBwVGVtcGxhdGVOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0QmluZERhdGEoKQ0KK3sNCisgICAgQVNTRVJUKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgICAgcmV0dXJuIChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9Ob2RlOjpHZXRCaW5kSXRlbXMoQ1hGQV9Ob2RlQXJyYXkmIGZvcm1JdGVtcykNCit7DQorICAgIGlmIChtX3VGbGFncyAmIFhGQV9OT0RFRkxBR19CaW5kRm9ybUl0ZW1zKSB7DQorICAgICAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gTlVMTDsNCisgICAgICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAoRlhfTFBWT0lEJilwSXRlbXMpOw0KKyAgICAgICAgZm9ybUl0ZW1zLkNvcHkoKnBJdGVtcyk7DQorICAgICAgICByZXR1cm4gZm9ybUl0ZW1zLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCisgICAgaWYgKHBGb3JtTm9kZSkgew0KKyAgICAgICAgZm9ybUl0ZW1zLkFkZChwRm9ybU5vZGUpOw0KKyAgICB9DQorICAgIHJldHVybiBmb3JtSXRlbXMuR2V0U2l6ZSgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU5vZGVEZWxldGVCaW5kSXRlbShGWF9MUFZPSUQgcERhdGEpDQorew0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICAgIGRlbGV0ZSAoKENYRkFfTm9kZUFycmF5KilwRGF0YSk7DQorICAgIH0NCit9DQorc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZGVsZXRlQmluZEl0ZW1DYWxsQmFjayA9IHtYRkFfRGF0YU5vZGVEZWxldGVCaW5kSXRlbSwgTlVMTH07DQorRlhfSU5UMzIgQ1hGQV9Ob2RlOjpBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkNCit7DQorICAgIEFTU0VSVChwRm9ybU5vZGUpOw0KKyAgICBpZiAobV91RmxhZ3MgJiBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtcykgew0KKyAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBJdGVtcyA9IE5VTEw7DQorICAgICAgICBUcnlPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgKEZYX0xQVk9JRCYpcEl0ZW1zKTsNCisgICAgICAgIEFTU0VSVChwSXRlbXMpOw0KKyAgICAgICAgaWYgKHBJdGVtcy0+RmluZChwRm9ybU5vZGUpIDwgMCkgew0KKyAgICAgICAgICAgIHBJdGVtcy0+QWRkKHBGb3JtTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcEl0ZW1zLT5HZXRTaXplKCk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwT2xkRm9ybUl0ZW0gPSAoQ1hGQV9Ob2RlKilHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSk7DQorICAgIGlmICghcE9sZEZvcm1JdGVtKSB7DQorICAgICAgICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcEZvcm1Ob2RlKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9IGVsc2UgaWYgKHBPbGRGb3JtSXRlbSA9PSBwRm9ybU5vZGUpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIENYRkFfTm9kZUFycmF5KiBwSXRlbXMgPSBGWF9ORVcgQ1hGQV9Ob2RlQXJyYXk7DQorICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwSXRlbXMsICZkZWxldGVCaW5kSXRlbUNhbGxCYWNrKTsNCisgICAgcEl0ZW1zLT5BZGQocE9sZEZvcm1JdGVtKTsNCisgICAgcEl0ZW1zLT5BZGQocEZvcm1Ob2RlKTsNCisgICAgbV91RmxhZ3MgfD0gWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXM7DQorICAgIHJldHVybiAyOw0KK30NCitGWF9JTlQzMiBDWEZBX05vZGU6OlJlbW92ZUJpbmRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKQ0KK3sNCisgICAgaWYgKG1fdUZsYWdzICYgWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXMpIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5KiBwSXRlbXMgPSBOVUxMOw0KKyAgICAgICAgVHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIChGWF9MUFZPSUQmKXBJdGVtcyk7DQorICAgICAgICBBU1NFUlQocEl0ZW1zKTsNCisgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IHBJdGVtcy0+RmluZChwRm9ybU5vZGUpOw0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gcEl0ZW1zLT5HZXRTaXplKCk7DQorICAgICAgICBpZiAoaUluZGV4ID49IDApIHsNCisgICAgICAgICAgICBpZiAoaUluZGV4ICE9IGlDb3VudCAtIDEpIHsNCisgICAgICAgICAgICAgICAgcEl0ZW1zLT5TZXRBdChpSW5kZXgsIHBJdGVtcy0+R2V0QXQoaUNvdW50IC0gMSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwSXRlbXMtPlJlbW92ZUF0KGlDb3VudCAtIDEpOw0KKyAgICAgICAgICAgIGlmIChpQ291bnQgPT0gMikgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBMYXN0Rm9ybU5vZGUgPSBwSXRlbXMtPkdldEF0KDApOw0KKyAgICAgICAgICAgICAgICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcExhc3RGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgIG1fdUZsYWdzICY9IH5YRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtczsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUNvdW50LS07DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaUNvdW50Ow0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE9sZEZvcm1JdGVtID0gKENYRkFfTm9kZSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpOw0KKyAgICBpZihwT2xkRm9ybUl0ZW0gPT0gcEZvcm1Ob2RlKSB7DQorICAgICAgICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICAgICAgICBwT2xkRm9ybUl0ZW0gPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwT2xkRm9ybUl0ZW0gPT0gTlVMTCA/IDAgOiAxOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6SGFzQmluZEl0ZW0oKQ0KK3sNCisgICAgcmV0dXJuIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpICYmIEdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKSAhPSBOVUxMOw0KK30NCitDWEZBX1dpZGdldERhdGEqIENYRkFfTm9kZTo6R2V0V2lkZ2V0RGF0YSgpDQorew0KKyAgICByZXR1cm4gKENYRkFfV2lkZ2V0RGF0YSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfV2lkZ2V0RGF0YSk7DQorfQ0KK0NYRkFfV2lkZ2V0RGF0YSogQ1hGQV9Ob2RlOjpHZXRDb250YWluZXJXaWRnZXREYXRhKCkNCit7DQorICAgIGlmIChHZXRQYWNrZXRJRCgpICE9IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgWEZBX0VMRU1FTlQgY2xhc3NJRCA9IEdldENsYXNzSUQoKTsNCisgICAgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSogcEZpZWxkV2lkZ2V0RGF0YSA9IHRoaXMtPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwRmllbGRXaWRnZXREYXRhICYmIHBGaWVsZFdpZGdldERhdGEtPkdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICAgICAgICAgIGlmIChwRmllbGRXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgICAgIHBGaWVsZFdpZGdldERhdGEtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcEZpZWxkV2lkZ2V0RGF0YTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSB0aGlzLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwRmllbGRXaWRnZXREYXRhID0gTlVMTDsNCisgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQorICAgICAgICAgICAgcERhdGFOb2RlLT5HZXRCaW5kSXRlbXMoZm9ybU5vZGVzKTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZm9ybU5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gZm9ybU5vZGVzLkdldEF0KGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwRmllbGRXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICAgICAgICAgIGlmIChwRmllbGRXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBwRmllbGRXaWRnZXREYXRhOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEdyYW5kTm9kZSA9IHBQYXJlbnROb2RlID8gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpIDogTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0gKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpID8gcFBhcmVudE5vZGUgOiBOVUxMOw0KKyAgICBpZiAoIXBWYWx1ZU5vZGUpIHsNCisgICAgICAgIHBWYWx1ZU5vZGUgPSAocEdyYW5kTm9kZSAmJiBwR3JhbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpID8gcEdyYW5kTm9kZSA6IE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50T2ZWYWx1ZU5vZGUgPSBwVmFsdWVOb2RlID8gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgOiBOVUxMOw0KKyAgICByZXR1cm4gcFBhcmVudE9mVmFsdWVOb2RlID8gcFBhcmVudE9mVmFsdWVOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCkgOiBOVUxMOw0KK30NCitGWF9CT09MCUNYRkFfTm9kZTo6R2V0TG9jYWxlTmFtZShDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybSA9IChDWEZBX05vZGUqKUdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICBDWEZBX05vZGUqIHBUb3BTdWJmb3JtID0gcEZvcm0tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgICBGWFNZU19hc3NlcnQocFRvcFN1YmZvcm0pOw0KKyAgICBDWEZBX05vZGUqIHBMb2NhbGVOb2RlID0gdGhpczsNCisgICAgRlhfQk9PTCBiTG9jYWxlID0gRkFMU0U7DQorICAgIGRvIHsNCisgICAgICAgIGJMb2NhbGUgPSBwTG9jYWxlTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIHdzTG9jYWxlTmFtZSwgRkFMU0UpOw0KKyAgICAgICAgaWYgKCFiTG9jYWxlKSB7DQorICAgICAgICAgICAgcExvY2FsZU5vZGUgPSBwTG9jYWxlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICB9DQorICAgIH0gd2hpbGUgKHBMb2NhbGVOb2RlICYmIHBMb2NhbGVOb2RlICE9IHBUb3BTdWJmb3JtICYmICFiTG9jYWxlKTsNCisgICAgaWYgKGJMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBiTG9jYWxlOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKUdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQorICAgIHdzTG9jYWxlTmFtZSA9IEdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCktPkdldENvbmZpZ0xvY2FsZU5hbWUocENvbmZpZyk7DQorICAgIGlmICghd3NMb2NhbGVOYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgYkxvY2FsZSA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGJMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBiTG9jYWxlOw0KKyAgICB9DQorICAgIGlmIChwVG9wU3ViZm9ybSkgew0KKyAgICAgICAgYkxvY2FsZSA9IHBUb3BTdWJmb3JtLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xvY2FsZSwgd3NMb2NhbGVOYW1lLCBGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKGJMb2NhbGUpIHsNCisgICAgICAgIHJldHVybiBiTG9jYWxlOw0KKyAgICB9DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXREZWZMb2NhbGUoKTsNCisgICAgaWYgKHBMb2NhbGUpIHsNCisgICAgICAgIHdzTG9jYWxlTmFtZSA9IHBMb2NhbGUtPkdldE5hbWUoKTsNCisgICAgICAgIGJMb2NhbGUgPSBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBiTG9jYWxlOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX05vZGU6OkdldEludGFjdCgpDQorew0KKyAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IEdldENsYXNzSUQoKTsNCisgICAgQ1hGQV9Ob2RlKiBwS2VlcCA9IEdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0tlZXApOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0VHlwZSA9IEdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICBpZiAocEtlZXApIHsNCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVJbnRhY3Q7DQorICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9JbnRhY3QsIGVJbnRhY3QsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIGlmKGVJbnRhY3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSAmJiBlTGF5b3V0VHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgJiYgIG1fcERvY3VtZW50LT5HZXRDdXJWZXJzaW9uTW9kZSgpIDwgWEZBX1ZFUlNJT05fMjA4KSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFByZXZpZXdSb3cgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgICAgICAgICAgICBpZihwUHJldmlld1JvdyAmJiBwUHJldmlld1Jvdy0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93KSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBpZihwS2VlcC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXZpb3VzLCBlVmFsdWUsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fCBlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEtlZXAgPSBwUHJldmlld1Jvdy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocEtlZXApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9OZXh0LCBlVmFsdWUsIEZBTFNFKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwgZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGVJbnRhY3Q7DQorICAgICAgICB9DQorICAgIH0NCisgICAgc3dpdGNoIChlRWxlbWVudCkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICAgICAgICAgIHN3aXRjaCAoZUxheW91dFR5cGUpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjoNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Sb3c6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGI6DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGFibGU6DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAocFBhcmVudE5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQYXJMYXlvdXQgPSBwUGFyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbiB8fCBlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fCBlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gbV9wRG9jdW1lbnQtPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiAmJiB2ZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA4KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtZWFzdXJlSDsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIG1lYXN1cmVILCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldERhdGFEZXNjcmlwdGlvbk5vZGUoKQ0KK3sNCisgICAgaWYobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgICAgIHJldHVybiBtX3BBdXhOb2RlOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsNCisgICAgbV9wQXV4Tm9kZSA9IHBEYXRhRGVzY3JpcHRpb25Ob2RlOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJyZXNvbHZlTm9kZSIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gdGhpczsNCisgICAgaWYocmVmTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSkgew0KKyAgICAgICAgcmVmTm9kZSA9IChDWEZBX05vZGUqKXBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICAgIEZYX0lOVDMyIGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgd3NFeHByZXNzaW9uLCByZXNvdmVOb2RlUlMsIGR3RmxhZyk7DQorICAgIGlmIChpUmV0IDwgMSkgew0KKyAgICAgICAgcmV0dXJuIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IE5VTEw7DQorICAgIGlmIChyZXNvdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsNCisgICAgICAgIENYRkFfT2JqZWN0KiBwTm9kZSA9IHJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgICAgIGhWYWx1ZSA9IHBTY3JpcHRDb250ZXh0LT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgaFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIGxwQXR0cmlidXRlSW5mbyA9IHJlc292ZU5vZGVSUy5wU2NyaXB0QXR0cmlidXRlOw0KKyAgICAgICAgaWYgKGxwQXR0cmlidXRlSW5mbyAmJiBscEF0dHJpYnV0ZUluZm8tPmVWYWx1ZVR5cGUgPT0gWEZBX1NDUklQVF9PYmplY3QpIHsNCisgICAgICAgICAgICBoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUocFNjcmlwdENvbnRleHQtPkdldFJ1bnRpbWUoKSk7DQorICAgICAgICAgICAgKHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+KihscEF0dHJpYnV0ZUluZm8tPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgRkFMU0UsIChYRkFfQVRUUklCVVRFKWxwQXR0cmlidXRlSW5mby0+ZUF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGhWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJyZXNvbHZlTm9kZXMiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmICghaFZhbHVlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgIENYRkFfTm9kZSogcmVmTm9kZSA9IHRoaXM7DQorICAgIGlmKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9YZmEpIHsNCisgICAgICAgIHJlZk5vZGUgPSAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIH0NCisgICAgU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QoaFZhbHVlLCB3c0V4cHJlc3Npb24sIGR3RmxhZywgcmVmTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sIEZYX0RXT1JEIGR3RmxhZywgQ1hGQV9Ob2RlKiByZWZOb2RlKQ0KK3sNCisgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICBpZihyZWZOb2RlID09IE5VTEwpIHsNCisgICAgICAgIHJlZk5vZGUgPSB0aGlzOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgd3NFeHByZXNzaW9uLCByZXNvdmVOb2RlUlMsIGR3RmxhZyk7DQorICAgIENYRkFfQXJyYXlOb2RlTGlzdCogcE5vZGVMaXN0ID0gRlhfTkVXIENYRkFfQXJyYXlOb2RlTGlzdChtX3BEb2N1bWVudCk7DQorICAgIGlmIChyZXNvdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCByZXNvdmVOb2RlUlMubm9kZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpZiAocmVzb3ZlTm9kZVJTLm5vZGVzW2ldLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPkFwcGVuZCgoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfSFZBTFVFQXJyYXkgaFZhbHVlQXJyYXkocFNjcmlwdENvbnRleHQtPkdldFJ1bnRpbWUoKSk7DQorICAgICAgICBpZiAocmVzb3ZlTm9kZVJTLkdldEF0dHJpYnV0ZVJlc3VsdChoVmFsdWVBcnJheSkgPiAwKSB7DQorICAgICAgICAgICAgQ1hGQV9PYmpBcnJheSBvYmplY3RBcnJheTsNCisgICAgICAgICAgICBoVmFsdWVBcnJheS5HZXRBdHRyaWJ1dGVPYmplY3Qob2JqZWN0QXJyYXkpOw0KKyAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0QXJyYXlbaV0tPklzTm9kZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPkFwcGVuZCgoQ1hGQV9Ob2RlKilvYmplY3RBcnJheVtpXSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KGhWYWx1ZSwgKENYRkFfT2JqZWN0KilwTm9kZUxpc3QsIHBTY3JpcHRDb250ZXh0LT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgICAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gd3NOYW1lICsgRlhfV1NUUkMoTCJbKl0iKTsNCisgICAgICAgIFNjcmlwdF9Tb21fUmVzb2x2ZU5vZGVMaXN0KGhWYWx1ZSwgd3NFeHByZXNzaW9uLCBkd0ZsYWcpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX05vZGVzKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocEFwcFByb3ZpZGVyKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1VuYWJsZV9UT19TRVQsIHdzTWVzc2FnZSk7DQorICAgICAgICBGWEpTRV9UaHJvd01lc3NhZ2UoRlhfQlNUUkMoIiIpLCBGWF9VVEY4RW5jb2RlKHdzTWVzc2FnZSwgd3NNZXNzYWdlLkdldExlbmd0aCgpKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0F0dGFjaE5vZGVMaXN0KiBwTm9kZUxpc3QgPSBGWF9ORVcgQ1hGQV9BdHRhY2hOb2RlTGlzdChtX3BEb2N1bWVudCwgdGhpcyk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoaFZhbHVlLCAoQ1hGQV9PYmplY3QqKXBOb2RlTGlzdCwgcFNjcmlwdENvbnRleHQtPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOw0KKyAgICAgICAgdGhpcy0+R2V0Q2xhc3NOYW1lKHdzTmFtZSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBGWF9XU1RSQyhMIiMiKSArIHdzTmFtZSArIEZYX1dTVFJDKEwiWypdIik7DQorICAgICAgICBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChoVmFsdWUsIHdzRXhwcmVzc2lvbiwgZHdGbGFnKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19QYXJlbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBpZiAocFBhcmVudCkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBQYXJlbnQpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0luZGV4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZU5hbWVJbmRleCgpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19DbGFzc0luZGV4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NPTUV4cHJlc3Npb247DQorICAgICAgICBHZXRTT01FeHByZXNzaW9uKHdzU09NRXhwcmVzc2lvbik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1NPTUV4cHJlc3Npb24pKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19BcHBseVhTTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJhcHBseVhTTCIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0Fzc2lnbk5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJhc3NpZ25Ob2RlIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgRlhfSU5UMzIgaUFjdGlvbiA9IDA7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA+PSAzKSB7DQorICAgICAgICBpQWN0aW9uID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMik7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQ2xvbmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiY2xvbmUiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiQ2xvbmUgPSBUUlVFOw0KKyAgICBiQ2xvbmUgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICBDWEZBX05vZGUqIHBDbG9uZU5vZGUgPSB0aGlzLT5DbG9uZShiQ2xvbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocENsb25lTm9kZSkpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZ2V0QXR0cmlidXRlIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgd3NFeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgdGhpcy0+R2V0QXR0cmlidXRlKHdzRXhwcmVzc2lvbiwgd3NWYWx1ZSk7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZhbHVlKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDIpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImdldEVsZW1lbnQiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICBGWF9JTlQzMiBpVmFsdWUgPSAwOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgd3NFeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgICAgICBpVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKTsNCisgICAgfQ0KKyAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnRJbmZvID0gWEZBX0dldEVsZW1lbnRCeU5hbWUod3NFeHByZXNzaW9uKTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXMtPkdldFByb3BlcnR5KGlWYWx1ZSwgcEVsZW1lbnRJbmZvLT5lTmFtZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSkpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc1Byb3BlcnR5U3BlY2lmaWVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiaXNQcm9wZXJ0eVNwZWNpZmllZCIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICAgIEZYX0JPT0wgYlBhcmVudCA9IFRSVUU7DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgICAgIGJQYXJlbnQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkhhcyA9IEZBTFNFOw0KKyAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NFeHByZXNzaW9uKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYocEF0dHJpYnV0ZUluZm8pIHsNCisgICAgICAgIGJIYXMgPSB0aGlzLT5IYXNBdHRyaWJ1dGUocEF0dHJpYnV0ZUluZm8tPmVOYW1lKTsNCisgICAgfQ0KKyAgICBpZiAoIWJIYXMpIHsNCisgICAgICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudEluZm8gPSBYRkFfR2V0RWxlbWVudEJ5TmFtZSh3c0V4cHJlc3Npb24pOw0KKyAgICAgICAgYkhhcyA9ICh0aGlzLT5HZXRQcm9wZXJ0eShpSW5kZXgsIHBFbGVtZW50SW5mby0+ZU5hbWUpICE9IE5VTEwpOw0KKyAgICB9DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYkhhcyk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTG9hZFhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImxvYWRYTUwiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICBGWF9CT09MIGJJZ25vcmVSb290ID0gVFJVRTsNCisgICAgRlhfQk9PTCBiT3ZlcndyaXRlID0gMDsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICAgICAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgICAgICBiSWdub3JlUm9vdCA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPj0gMykgew0KKyAgICAgICAgYk92ZXJ3cml0ZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICAgIH0NCisgICAgSVhGQV9QYXJzZXIqIHBQYXJzZXIgPSBJWEZBX1BhcnNlcjo6Q3JlYXRlKG1fcERvY3VtZW50KTsNCisgICAgaWYgKCFwUGFyc2VyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IE5VTEw7DQorICAgIEZYX0lOVDMyIGlQYXJzZXJTdGF0dXMgPSBwUGFyc2VyLT5QYXJzZVhNTERhdGEod3NFeHByZXNzaW9uLCBwWE1MTm9kZSwgTlVMTCk7DQorICAgIGlmIChpUGFyc2VyU3RhdHVzICE9IFhGQV9QQVJTRVNUQVRVU19Eb25lIHx8ICFwWE1MTm9kZSkgew0KKyAgICAgICAgcFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICAgICAgcFBhcnNlciA9IE5VTEw7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJJZ25vcmVSb290ICYmIChwWE1MTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQgfHwgWEZBX1JlY29nbml6ZVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKSkpIHsNCisgICAgICAgIGJJZ25vcmVSb290ID0gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwRmFrZVJvb3QgPSB0aGlzLT5DbG9uZShGQUxTRSk7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbnRlbnRUeXBlID0gdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSk7DQorICAgIGlmICghd3NDb250ZW50VHlwZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBGYWtlUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICAgIH0NCisgICAgSUZERV9YTUxOb2RlKiBwRmFrZVhNTFJvb3QgPSBwRmFrZVJvb3QtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIGlmICghcEZha2VYTUxSb290KSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBUaGlzWE1MUm9vdCA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBwRmFrZVhNTFJvb3QgPSBwVGhpc1hNTFJvb3QgPyBwVGhpc1hNTFJvb3QtPkNsb25lKEZBTFNFKSA6IE5VTEw7DQorICAgIH0NCisgICAgaWYgKCFwRmFrZVhNTFJvb3QpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0NsYXNzTmFtZTsNCisgICAgICAgIHRoaXMtPkdldENsYXNzTmFtZSh3c0NsYXNzTmFtZSk7DQorICAgICAgICBwRmFrZVhNTFJvb3QgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c0NsYXNzTmFtZSk7DQorICAgIH0NCisgICAgaWYgKGJJZ25vcmVSb290KSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgd2hpbGUgKHBYTUxDaGlsZCkgew0KKyAgICAgICAgICAgIElGREVfWE1MTm9kZSAqIHBYTUxTaWJsaW5nID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgICAgICAgICAgICBwWE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxDaGlsZCk7DQorICAgICAgICAgICAgcEZha2VYTUxSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTENoaWxkKTsNCisgICAgICAgICAgICBwWE1MQ2hpbGQgPSBwWE1MU2libGluZzsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIElGREVfWE1MTm9kZSAqcFhNTFBhcmVudCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgICAgICBpZiAocFhNTFBhcmVudCkgew0KKyAgICAgICAgICAgIHBYTUxQYXJlbnQtPlJlbW92ZUNoaWxkTm9kZShwWE1MTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBwRmFrZVhNTFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MTm9kZSk7DQorICAgIH0NCisgICAgcFBhcnNlci0+Q29uc3RydWN0WEZBTm9kZShwRmFrZVJvb3QsIHBGYWtlWE1MUm9vdCk7DQorICAgIHBGYWtlUm9vdCA9IHBQYXJzZXItPkdldFJvb3ROb2RlKCk7DQorICAgIGlmIChwRmFrZVJvb3QpIHsNCisgICAgICAgIGlmIChiT3ZlcndyaXRlKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQ2hpbGQgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV3Q2hpbGQgPSBwRmFrZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICBGWF9JTlQzMiBpbmRleCA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKHBOZXdDaGlsZCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcE5ld0NoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICAgICBwRmFrZVJvb3QtPlJlbW92ZUNoaWxkKHBOZXdDaGlsZCk7DQorICAgICAgICAgICAgICAgIHRoaXMtPkluc2VydENoaWxkKGluZGV4KyssIHBOZXdDaGlsZCk7DQorICAgICAgICAgICAgICAgIHBOZXdDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICAgICAgICBwTmV3Q2hpbGQgPSBwSXRlbTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBJdGVtID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICAgICB0aGlzLT5SZW1vdmVDaGlsZChwQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICBwRmFrZVJvb3QtPkluc2VydENoaWxkKHBDaGlsZCk7DQorICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBJdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0gJiYgR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBUZW1wWE1MTm9kZSA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICAgICAgICAgIHRoaXMtPlNldFhNTE1hcHBpbmdOb2RlKHBGYWtlWE1MUm9vdCk7DQorICAgICAgICAgICAgICAgIHRoaXMtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgaWYgKHBUZW1wWE1MTm9kZSAmJiBwVGVtcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBwVGVtcFhNTE5vZGU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIE1vdmVCdWZmZXJNYXBEYXRhKHBGYWtlUm9vdCwgdGhpcywgWEZBX0NhbGNEYXRhLCBUUlVFKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRmFrZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcEl0ZW0gPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgIHBGYWtlUm9vdC0+UmVtb3ZlQ2hpbGQocENoaWxkKTsNCisgICAgICAgICAgICAgICAgdGhpcy0+SW5zZXJ0Q2hpbGQocENoaWxkKTsNCisgICAgICAgICAgICAgICAgcENoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBJdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRmFrZVhNTFJvb3QpIHsNCisgICAgICAgICAgICBwRmFrZVJvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBGYWtlWE1MUm9vdCk7DQorICAgICAgICAgICAgcEZha2VSb290LT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChwRmFrZVhNTFJvb3QpIHsNCisgICAgICAgICAgICBwRmFrZVhNTFJvb3QtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgcFBhcnNlciA9IE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVGaWx0ZXJlZFhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInNhdmVYTUwiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiUHJldHR5TW9kZSA9IEZBTFNFOw0KKyAgICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ByZXR0eSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICBpZiAoYnNQcmV0dHkuRXF1YWwoRlhfQlNUUkMoInByZXR0eSIpKSkgew0KKyAgICAgICAgICAgIGJQcmV0dHlNb2RlID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nQyBic1hNTEhlYWRlciA9IEZYX0JTVFJDKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOw0KKyAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICAgIElGWF9NZW1vcnlTdHJlYW0qIHBNZW1vcnlTdHJlYW0gPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oVFJVRSk7DQorICAgICAgICBpZiAoIXBNZW1vcnlTdHJlYW0pIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBJRlhfU3RyZWFtICpwU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKChJRlhfRmlsZVdyaXRlKilwTWVtb3J5U3RyZWFtLCBGWF9TVFJFQU1BQ0NFU1NfVGV4dCB8IEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpOw0KKyAgICAgICAgaWYgKCFwU3RyZWFtKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBic1hNTEhlYWRlcik7DQorICAgICAgICAgICAgcE1lbW9yeVN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgIHBNZW1vcnlTdHJlYW0gPSBOVUxMOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOw0KKyAgICAgICAgcFN0cmVhbS0+V3JpdGVEYXRhKGJzWE1MSGVhZGVyLCBic1hNTEhlYWRlci5HZXRMZW5ndGgoKSk7DQorICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZSh0aGlzLCBwU3RyZWFtLCBOVUxMLCBUUlVFKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgQ0ZYX0J5dGVTdHJpbmdDKHBNZW1vcnlTdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtb3J5U3RyZWFtLT5HZXRTaXplKCkpKTsNCisgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgICAgIHBTdHJlYW0gPSBOVUxMOw0KKyAgICAgICAgaWYgKHBNZW1vcnlTdHJlYW0pIHsNCisgICAgICAgICAgICBwTWVtb3J5U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgcE1lbW9yeVN0cmVhbSA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0gZWxzZSBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBFbGVtZW50ID0gdGhpcy0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIGlmKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZSh0aGlzKTsNCisgICAgICAgIElGWF9NZW1vcnlTdHJlYW0qIHBNZW1vcnlTdHJlYW0gPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oVFJVRSk7DQorICAgICAgICBpZiAoIXBNZW1vcnlTdHJlYW0pIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAocE1lbW9yeVN0cmVhbSkgew0KKyAgICAgICAgICAgIElGWF9TdHJlYW0gKnBTdHJlYW0gPSBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oKElGWF9GaWxlV3JpdGUqKXBNZW1vcnlTdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19UZXh0IHwgRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCk7DQorICAgICAgICAgICAgaWYgKHBTdHJlYW0pIHsNCisgICAgICAgICAgICAgICAgcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQorICAgICAgICAgICAgICAgIHBTdHJlYW0tPldyaXRlRGF0YShic1hNTEhlYWRlciwgYnNYTUxIZWFkZXIuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBwRWxlbWVudC0+U2F2ZVhNTE5vZGUocFN0cmVhbSk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgQ0ZYX0J5dGVTdHJpbmdDKHBNZW1vcnlTdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtb3J5U3RyZWFtLT5HZXRTaXplKCkpKTsNCisgICAgICAgICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgICBwU3RyZWFtID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBNZW1vcnlTdHJlYW0pIHsNCisgICAgICAgICAgICAgICAgcE1lbW9yeVN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgICBwTWVtb3J5U3RyZWFtID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAyKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJzZXRBdHRyaWJ1dGUiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlidXRlVmFsdWU7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzQXR0cmlidXRlVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0F0dHJpYnV0ZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgIHdzQXR0cmlidXRlVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNBdHRyaWJ1dGVWYWx1ZSwgYnNBdHRyaWJ1dGVWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHdzQXR0cmlidXRlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQXR0cmlidXRlLCBic0F0dHJpYnV0ZS5HZXRMZW5ndGgoKSk7DQorICAgIHRoaXMtPlNldEF0dHJpYnV0ZSh3c0F0dHJpYnV0ZSwgd3NBdHRyaWJ1dGVWYWx1ZSwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSAmJiBpTGVuZ3RoICE9IDIpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInNldEVsZW1lbnQiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTnMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lU3BhY2U7DQorICAgICAgICB0aGlzLT5UcnlOYW1lc3BhY2Uod3NOYW1lU3BhY2UpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NOYW1lU3BhY2UpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Nb2RlbChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcCh0aGlzLT5HZXRNb2RlbE5vZGUoKSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCB0aGlzLT5Jc0NvbnRhaW5lck5vZGUoKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBGQUxTRSk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgIVRyeUNvbnRlbnQoc3RyVmFsdWUpIHx8IHN0clZhbHVlLklzRW1wdHkoKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfT25lT2ZDaGlsZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0czsNCisgICAgICAgIEZYX0lOVDMyIGlTaXplID0gdGhpcy0+R2V0Tm9kZUxpc3QocHJvcGVydHMsIFhGQV9OT0RFRklMVEVSX09uZU9mUHJvcGVydHkpOw0KKyAgICAgICAgaWYgKGlTaXplID4gMCkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHByb3BlcnRzWzBdKSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIENYRkFfQXJyYXlOb2RlTGlzdCogcEZvcm1Ob2RlcyA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKENYRkFfT2JqZWN0KilwRm9ybU5vZGVzLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NsZWFyRXJyb3JMaXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ3JlYXRlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgU2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUocEFyZ3VtZW50cyk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Jc0NvbXBhdGlibGVOUyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImlzQ29tcGF0aWJsZU5TIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZVNwYWNlOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWVTcGFjZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICB3c05hbWVTcGFjZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWVTcGFjZSwgYnNOYW1lU3BhY2UuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWVTcGFjZTsNCisgICAgdGhpcy0+VHJ5TmFtZXNwYWNlKHdzTm9kZU5hbWVTcGFjZSk7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgd3NOb2RlTmFtZVNwYWNlLkVxdWFsKHdzTmFtZVNwYWNlKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0FsaWFzTm9kZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgU2V0SW50ZWdlcihlQXR0cmlidXRlLCBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgR2V0SW50ZWdlcihlQXR0cmlidXRlKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfSW50ZWdlclJlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKCFiU2V0dGluZykgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIEdldEludGVnZXIoZUF0dHJpYnV0ZSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgU2V0Qm9vbGVhbihlQXR0cmlidXRlLCBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oaFZhbHVlKSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgR2V0Qm9vbGVhbihlQXR0cmlidXRlKSA/IEZYX0JTVFJDKCIxIikgOiBGWF9CU1RSQygiMCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoIWJTZXR0aW5nKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgR2V0Qm9vbGVhbihlQXR0cmlidXRlKSA/IEZYX0JTVFJDKCIxIikgOiBGWF9CU1RSQygiMCIpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2UoRlhfTFBWT0lEIGVBdHRyaWJ1dGUsIEZYX0xQVk9JRCBlVmFsdWUsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSkNCit7DQorICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgICBpZiAoIXBMYXlvdXRQcm8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3UGFja2V0ID0gdGhpcy0+R2V0UGFja2V0SUQoKTsNCisgICAgaWYgKGR3UGFja2V0ICYgWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgICAgICBGWF9CT09MIGJOZWVkRmluZENvbnRhaW5lciA9IEZBTFNFOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSB0aGlzLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DYXB0aW9uOg0KKyAgICAgICAgICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCB0aGlzLCB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRm9udDoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhcmE6IHsNCisgICAgICAgICAgICAgICAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9DYXB0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgcFBhcmVudE5vZGUsIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHRoaXMsIHBQYXJlbnROb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX01hcmdpbjogew0KKyAgICAgICAgICAgICAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVQYXJlbnRUeXBlID0gcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUGFyZW50Tm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCB0aGlzLCBwUGFyZW50Tm9kZSk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVQYXJlbnRUeXBlID09IFhGQV9FTEVNRU5UX0NhcHRpb24pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwUGFyZW50Tm9kZSwgcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9VaSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwTm9kZSwgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Db21iOiB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBFZGl0Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IHBFZGl0Tm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFZGl0Tm9kZSAmJiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQgfHwgZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCB8fCBlVUlUeXBlID09IFhGQV9FTEVNRU5UX1RleHRFZGl0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHBFZGl0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBVSU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgcFVJTm9kZSwgcFVJTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQ6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDogew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVUlOb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFVJTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHBVSU5vZGUsIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uOiB7DQorICAgICAgICAgICAgICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVUlOb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFVJTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHBVSU5vZGUsIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0tlZXA6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29rZW5kOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWs6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0FmdGVyOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmU6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9PdmVyZmxvdzoNCisgICAgICAgICAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmVhOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQ6DQorICAgICAgICAgICAgICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIodGhpcyk7DQorICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHRoaXMsIHRoaXMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NoYXJwdGV4dDoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NoYXJweG1sOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDogew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dE5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghcFRleHROb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0gcFRleHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghcFZhbHVlTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1ZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlNjcmlwdE1vZGlmeSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlTm9kZSA9IHBOb2RlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHBWYWx1ZU5vZGUsIHBOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwTm9kZSwgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHBWYWx1ZU5vZGUsIHBOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiTmVlZEZpbmRDb250YWluZXIpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSB0aGlzOw0KKyAgICAgICAgICAgIHdoaWxlIChwUGFyZW50KSB7DQorICAgICAgICAgICAgICAgIGlmIChwUGFyZW50LT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocFBhcmVudCkgew0KKyAgICAgICAgICAgICAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHBQYXJlbnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHRoaXMsIHRoaXMpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBzelZhbHVlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pWYWx1ZSwgc3pWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBTZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSwgVFJVRSk7DQorICAgICAgICBpZihlQXR0cmlidXRlID09IFhGQV9BVFRSSUJVVEVfVXNlICYmIHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EZXNjKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NVc2VWYWwgPSB3c1ZhbHVlLCB3c0lELCB3c1NPTTsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfVGVtcGxhdGUpOw0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcFByb3RvUm9vdCA9IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Qcm90byk7DQorICAgICAgICAgICAgaWYoIXdzVXNlVmFsLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBpZih3c1VzZVZhbFswXSA9PSAnIycpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzSUQgPSBDRlhfV2lkZVN0cmluZygoRlhfTFBDV1NUUil3c1VzZVZhbCArIDEsIHdzVXNlVmFsLkdldExlbmd0aCgpIC0gMSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB3c1NPTSA9IENGWF9XaWRlU3RyaW5nKChGWF9MUENXU1RSKXdzVXNlVmFsLCB3c1VzZVZhbC5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Ob2RlID0gTlVMTDsNCisgICAgICAgICAgICBpZighd3NTT00uSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMocFByb3RvUm9vdCwgd3NTT00sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICAgICAgICAgICAgaWYoaVJldCA+IDAgJiYgcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcFByb3RvTm9kZSA9IChDWEZBX05vZGUqKXJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZighd3NJRC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgcFByb3RvTm9kZSA9IG1fcERvY3VtZW50LT5HZXROb2RlQnlJRChwUHJvdG9Sb290LCB3c0lEKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocFByb3RvTm9kZSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBIZWFkQ2hpbGQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSGVhZENoaWxkKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gcEhlYWRDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgIFJlbW92ZUNoaWxkKHBIZWFkQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgcEhlYWRDaGlsZCA9IHBTaWJsaW5nOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFByb3RvRm9ybSA9IHBQcm90b05vZGUtPkNsb25lVGVtcGxhdGVUb0Zvcm0oVFJVRSk7DQorICAgICAgICAgICAgICAgIHBIZWFkQ2hpbGQgPSBwUHJvdG9Gb3JtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwSGVhZENoaWxkKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gcEhlYWRDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgICAgIHBQcm90b0Zvcm0tPlJlbW92ZUNoaWxkKHBIZWFkQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgSW5zZXJ0Q2hpbGQocEhlYWRDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBwSGVhZENoaWxkID0gcFNpYmxpbmc7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPlJlbW92ZVB1cmdlTm9kZShwUHJvdG9Gb3JtKTsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm90b0Zvcm07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgICAgIEdldEF0dHJpYnV0ZShlQXR0cmlidXRlLCB3c1ZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUsIHdzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmdSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmICghYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgICAgICBHZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZhbHVlLCB3c1ZhbHVlLkdldExlbmd0aCgpKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPT0gMSkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY3V0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1Jlc3RvcmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwicmVzdG9yZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfU09NX01FU1NBR0VUWVBFIGlNZXNzYWdlVHlwZSkNCit7DQorICAgIENYRkFfV2lkZ2V0RGF0YSAqcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJOZXcgPSBGQUxTRTsNCisgICAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZSgpOw0KKyAgICBpZiAoIXZhbGlkYXRlKSB7DQorICAgICAgICB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZShUUlVFKTsNCisgICAgICAgIGJOZXcgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNNZXNzYWdlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNNZXNzYWdlKTsNCisgICAgICAgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlOg0KKyAgICAgICAgICAgICAgICB2YWxpZGF0ZS5TZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNNZXNzYWdlLCBic01lc3NhZ2UuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfU09NX0Zvcm1hdE1lc3NhZ2U6DQorICAgICAgICAgICAgICAgIHZhbGlkYXRlLlNldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic01lc3NhZ2UsIGJzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZToNCisgICAgICAgICAgICAgICAgdmFsaWRhdGUuU2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic01lc3NhZ2UsIGJzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghYk5ldykgew0KKyAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwTm90aWZ5LT5BZGRDYWxjVmFsaWRhdGUodGhpcyk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICAgICAgICBzd2l0Y2ggKGlNZXNzYWdlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZToNCisgICAgICAgICAgICAgICAgdmFsaWRhdGUuR2V0U2NyaXB0TWVzc2FnZVRleHQod3NNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfU09NX0Zvcm1hdE1lc3NhZ2U6DQorICAgICAgICAgICAgICAgIHZhbGlkYXRlLkdldEZvcm1hdE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX1NPTV9NYW5kYXRvcnlNZXNzYWdlOg0KKyAgICAgICAgICAgICAgICB2YWxpZGF0ZS5HZXROdWxsTWVzc2FnZVRleHQod3NNZXNzYWdlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c01lc3NhZ2UpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfU29tX01lc3NhZ2UoaFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfTGVuZ3RoKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSAqcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIDApOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBwV2lkZ2V0RGF0YS0+Q291bnRDaG9pY2VMaXN0SXRlbXMoVFJVRSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBYRkFfRUxFTUVOVCBjbGFzc0lEID0gR2V0Q2xhc3NJRCgpOw0KKyAgICBpZihjbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICBTY3JpcHRfRmllbGRfRGVmYXVsdFZhbHVlKGhWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2UgaWYoY2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICBTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoaFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0gZWxzZSBpZiAoY2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9Cb29sZWFuKSB7DQorICAgICAgICBTY3JpcHRfQm9vbGVhbl9WYWx1ZShoVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIG5ld1ZhbHVlOw0KKyAgICAgICAgaWYgKCEoRlhKU0VfVmFsdWVfSXNOdWxsKGhWYWx1ZSkgfHwgRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoaFZhbHVlKSkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBuZXdWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KG5ld1ZhbHVlLCBuZXdWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IE5VTEw7DQorICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOw0KKyAgICAgICAgICAgIHRoaXMtPkdldEJpbmRJdGVtcyhmb3JtTm9kZXMpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZm9ybU5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gZm9ybU5vZGVzLkdldEF0KGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IHBGb3JtTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgICAgICAgICAgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IEdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQorICAgICAgICBpZihjb250ZW50LklzRW1wdHkoKSAmJiBjbGFzc0lEICE9IFhGQV9FTEVNRU5UX1RleHQgJiYgY2xhc3NJRCAhPSBYRkFfRUxFTUVOVF9TdWJtaXRVcmwpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgICB9IGVsc2UgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfSW50ZWdlcikgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBGWFNZU193dG9pKGNvbnRlbnQpKQk7DQorICAgICAgICB9IGVsc2UgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmxvYXQgfHwgY2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9EZWNpbWFsKSB7DQorICAgICAgICAgICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbChjb250ZW50KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChoVmFsdWUsIChGWF9GTE9BVCkoZG91YmxlKWRlY2ltYWwpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShjb250ZW50LCBjb250ZW50LkdldExlbmd0aCgpKSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICBpZiAoY29udGVudC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKGNvbnRlbnQsIGNvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Jvb2xlYW5fVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXdWYWx1ZTsNCisgICAgICAgIGlmICghKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaVZhbHVlID0gRlhTWVNfYXRvaShuZXdWYWx1ZSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlID0gKGlWYWx1ZSA9PSAwKSA/IEZYX1dTVFJDKEwiMCIpIDogRlhfV1NUUkMoTCIxIik7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IEdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgd3NWYWx1ZS5FcXVhbChGWF9XU1RSQyhMIjEiKSkgPyBUUlVFIDogRkFMU0UpOw0KKyAgICB9DQorfQ0KK3N0cnVjdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8gew0KK3B1YmxpYzoNCisgICAgRlhfVUlOVDMyIG1fdUhhc2g7DQorICAgIEZYX0xQQ1dTVFIgbV9scGNFdmVudE5hbWU7DQorICAgIFhGQV9FVkVOVFRZUEUgbV9ldmVudFR5cGU7DQorICAgIEZYX1VJTlQzMiBtX3ZhbGlkRmxhZ3M7DQorfTsNCitzdGF0aWMgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvIGdzX2V2ZW50UGFyYUluZm9zW10gPSB7DQorICAgIHsweDAyYTZjNTVhLCAoRlhfTFBDV1NUUilMInBvc3RTdWJtaXQiLAlYRkFfRVZFTlRfUG9zdFN1Ym1pdCwJMH0sDQorICAgIHsweDBhYjQ2NmJiLCAoRlhfTFBDV1NUUilMInByZVN1Ym1pdCIsCVhGQV9FVkVOVF9QcmVTdWJtaXQsCTB9LA0KKyAgICB7MHgxMDlkN2NlNywgKEZYX0xQQ1dTVFIpTCJtb3VzZUVudGVyIiwJWEZBX0VWRU5UX01vdXNlRW50ZXIsCTV9LA0KKyAgICB7MHgxN2ZhZDM3MywgKEZYX0xQQ1dTVFIpTCJwb3N0UHJpbnQiLAlYRkFfRVZFTlRfUG9zdFByaW50LAkwfSwNCisgICAgezB4MWJmYzcyZDksIChGWF9MUENXU1RSKUwicHJlT3BlbiIsCVhGQV9FVkVOVF9QcmVPcGVuLAkJN30sDQorICAgIHsweDIxOTZhNDUyLCAoRlhfTFBDV1NUUilMImluaXRpYWxpemUiLAlYRkFfRVZFTlRfSW5pdGlhbGl6ZSwJMX0sDQorICAgIHsweDI3NDEwZjAzLCAoRlhfTFBDV1NUUilMIm1vdXNlRXhpdCIsCVhGQV9FVkVOVF9Nb3VzZUV4aXQsCTV9LA0KKyAgICB7MHgzM2M0M2RlYywgKEZYX0xQQ1dTVFIpTCJkb2NDbG9zZSIsCVhGQV9FVkVOVF9Eb2NDbG9zZSwJCTB9LA0KKyAgICB7MHgzNjFmYTFiNiwgKEZYX0xQQ1dTVFIpTCJwcmVTYXZlIiwJWEZBX0VWRU5UX1ByZVNhdmUsCQkwfSwNCisgICAgezB4MzZmMWM2ZDgsIChGWF9MUENXU1RSKUwicHJlU2lnbiIsCVhGQV9FVkVOVF9QcmVTaWduLAkJNn0sDQorICAgIHsweDQ3MzFkNmJhLCAoRlhfTFBDV1NUUilMImV4aXQiLAkJWEZBX0VWRU5UX0V4aXQsCQkJMn0sDQorICAgIHsweDU2YmY0NTZiLCAoRlhfTFBDV1NUUilMImRvY1JlYWR5IiwJWEZBX0VWRU5UX0RvY1JlYWR5LAkJMH0sDQorICAgIHsweDcyMzMwMThhLCAoRlhfTFBDV1NUUilMInZhbGlkYXRlIiwJWEZBX0VWRU5UX1ZhbGlkYXRlLAkJMX0sDQorICAgIHsweDg4MDgzODVlLCAoRlhfTFBDV1NUUilMImluZGV4Q2hhbmdlIiwgWEZBX0VWRU5UX0luZGV4Q2hhbmdlLAkzfSwNCisgICAgezB4ODkxZjQ2MDYsIChGWF9MUENXU1RSKUwiY2hhbmdlIiwJCVhGQV9FVkVOVF9DaGFuZ2UsCQk0fSwNCisgICAgezB4OTUyOGE3YjQsIChGWF9MUENXU1RSKUwicHJlUHJpbnQiLAlYRkFfRVZFTlRfUHJlUHJpbnQsCQkwfSwNCisgICAgezB4OWY2OTNiMjEsIChGWF9MUENXU1RSKUwibW91c2VEb3duIiwJWEZBX0VWRU5UX01vdXNlRG93biwJNX0sDQorICAgIHsweGNkY2U1NmIzLCAoRlhfTFBDV1NUUilMImZ1bGwiLAkJWEZBX0VWRU5UX0Z1bGwsCQkJNH0sDQorICAgIHsweGQ1NzZkMDhlLCAoRlhfTFBDV1NUUilMIm1vdXNlVXAiLAlYRkFfRVZFTlRfTW91c2VVcCwJCTV9LA0KKyAgICB7MHhkOTU2NTdhNiwgKEZYX0xQQ1dTVFIpTCJjbGljayIsCQlYRkFfRVZFTlRfQ2xpY2ssCQk0fSwNCisgICAgezB4ZGJmYmUwMmUsIChGWF9MUENXU1RSKUwiY2FsY3VsYXRlIiwJWEZBX0VWRU5UX0NhbGN1bGF0ZSwJMX0sDQorICAgIHsweGUyNWZhN2I4LCAoRlhfTFBDV1NUUilMInBvc3RPcGVuIiwJWEZBX0VWRU5UX1Bvc3RPcGVuLAkJN30sDQorICAgIHsweGUyOGRjZTdlLCAoRlhfTFBDV1NUUilMImVudGVyIiwJCVhGQV9FVkVOVF9FbnRlciwJCTJ9LA0KKyAgICB7MHhmYzgyZDY5NSwgKEZYX0xQQ1dTVFIpTCJwb3N0U2F2ZSIsCVhGQV9FVkVOVF9Qb3N0U2F2ZSwJCTB9LA0KKyAgICB7MHhmZDU0ZmJiNywgKEZYX0xQQ1dTVFIpTCJwb3N0U2lnbiIsCVhGQV9FVkVOVF9Qb3N0U2lnbiwJCTZ9LA0KK307DQorY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBHZXRFdmVudFBhcmFJbmZvQnlOYW1lKEZYX1dTVFIgd3NFdmVudE5hbWUpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gd3NFdmVudE5hbWUuR2V0TGVuZ3RoKCk7DQorICAgIEZYX1VJTlQzMiB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRXZlbnROYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCisgICAgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBldmVudFBhcmFJbmZvID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaUVuZCA9IChzaXplb2YoZ3NfZXZlbnRQYXJhSW5mb3MpIC8gc2l6ZW9mKGdzX2V2ZW50UGFyYUluZm9zWzBdKSkgLSAxOw0KKyAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgZG8gew0KKyAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICBldmVudFBhcmFJbmZvID0gJmdzX2V2ZW50UGFyYUluZm9zW2lNaWRdOw0KKyAgICAgICAgaWYgKHVIYXNoID09IGV2ZW50UGFyYUluZm8tPm1fdUhhc2gpIHsNCisgICAgICAgICAgICByZXR1cm4gZXZlbnRQYXJhSW5mbzsNCisgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBldmVudFBhcmFJbmZvLT5tX3VIYXNoKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBYRkFfU1RSSU5HX1RPX1JHQihDRlhfV2lkZVN0cmluZyAmc3RyUkdCLCBGWF9JTlQzMiAmciwgRlhfSU5UMzIgJmcsIEZYX0lOVDMyICZiKQ0KK3sNCisgICAgciA9IDA7DQorICAgIGcgPSAwOw0KKyAgICBiID0gMDsNCisgICAgRlhfV0NIQVIgemVybyA9ICcwJzsNCisgICAgRlhfSU5UMzIgaUluZGV4ID0gMDsNCisgICAgRlhfSU5UMzIgaUxlbiA9IHN0clJHQi5HZXRMZW5ndGgoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlMZW47ICsraSkgew0KKyAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJSR0IuR2V0QXQoaSk7DQorICAgICAgICBpZiAoY2ggPT0gTCcsJykgew0KKyAgICAgICAgICAgICsraUluZGV4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlJbmRleCA+IDIpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlWYWx1ZSA9IGNoIC0gemVybzsNCisgICAgICAgIGlmIChpVmFsdWUgPj0gMCAmJiBpVmFsdWUgPD0gOSkgew0KKyAgICAgICAgICAgIHN3aXRjaCAoaUluZGV4KSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICAgICAgICAgIHIgPSByICogMTAgKyBpVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgICAgICAgZyA9IGcgKiAxMCArIGlWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYiA9IGIgKiAxMCArIGlWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgICAgRlhfSU5UMzIgaVNpemUgPSBib3JkZXIuQ291bnRFZGdlcygpOw0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJDb2xvcjsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgICAgICBzdHJDb2xvciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgICAgIEZYX0lOVDMyIHIgPSAwLCBnID0gMCwgYiA9IDA7DQorICAgICAgICBYRkFfU1RSSU5HX1RPX1JHQihzdHJDb2xvciwgciwgZywgYik7DQorICAgICAgICBGWF9BUkdCIHJnYiA9IEFyZ2JFbmNvZGUoMTAwLCByLCBnLCBiKTsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgICAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsNCisgICAgICAgICAgICBlZGdlLlNldENvbG9yKHJnYik7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKDApOw0KKyAgICAgICAgRlhfQVJHQgljb2xvciA9IGVkZ2UuR2V0Q29sb3IoKTsNCisgICAgICAgIEZYX0lOVDMyIGEsIHIsIGcsIGI7DQorICAgICAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgICAgIHN0ckNvbG9yLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShzdHJDb2xvcikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlcldpZHRoKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0JvcmRlciBib3JkZXIgPSBwV2lkZ2V0RGF0YS0+R2V0Qm9yZGVyKFRSVUUpOw0KKyAgICBGWF9JTlQzMiBpU2l6ZSA9IGJvcmRlci5Db3VudEVkZ2VzKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGhpY2tuZXNzOw0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgICAgIHdzVGhpY2tuZXNzID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKGkpOw0KKyAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgdGhpY2tuZXNzKHdzVGhpY2tuZXNzKTsNCisgICAgICAgICAgICBlZGdlLlNldE1TVGhpY2tuZXNzKHRoaWNrbmVzcyk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKDApOw0KKyAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCB0aGlja25lc3MgPSBlZGdlLkdldE1TVGhpY2tuZXNzKCk7DQorICAgICAgICB0aGlja25lc3MuVG9TdHJpbmcod3NUaGlja25lc3MpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NUaGlja25lc3MpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9GaWxsQ29sb3IoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfQm9yZGVyIGJvcmRlciA9IHBXaWRnZXREYXRhLT5HZXRCb3JkZXIoVFJVRSk7DQorICAgIENYRkFfRmlsbCBib3JkZXJmaWxsID0gYm9yZGVyLkdldEZpbGwoVFJVRSk7DQorICAgIENYRkFfTm9kZSAqcE5vZGUgPSAoQ1hGQV9Ob2RlKilib3JkZXJmaWxsOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgICAgICB3c0NvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgRlhfSU5UMzIgciwgZywgYjsNCisgICAgICAgIFhGQV9TVFJJTkdfVE9fUkdCKHdzQ29sb3IsIHIsIGcsIGIpOw0KKyAgICAgICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7DQorICAgICAgICBib3JkZXJmaWxsLlNldENvbG9yKGNvbG9yKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0FSR0IgY29sb3IgPSBib3JkZXJmaWxsLkdldENvbG9yKCk7DQorICAgICAgICBGWF9JTlQzMiBhLCByLCBnLCBiOw0KKyAgICAgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7DQorICAgICAgICB3c0NvbG9yLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0NvbG9yKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGF0YU5vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKCFiU2V0dGluZykgew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBHZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBEYXRhTm9kZSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCisgICAgICAgICAgICBDWEZBX1dpZGdldERhdGEgKnBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwV2lkZ2V0RGF0YSk7DQorICAgICAgICAgICAgWEZBX0VMRU1FTlQgdWlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KKyAgICAgICAgICAgIGlmICh1aVR5cGUgPT0gWEZBX0VMRU1FTlRfVGV4dCkgew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXdWYWx1ZTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KG5ld1ZhbHVlLCBuZXdWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NOZXdWYWx1ZSk7DQorICAgICAgICAgICAgICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSwgVFJVRSwgVFJVRSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmKHVpVHlwZSAhPSBYRkFfRUxFTUVOVF9JbWFnZSkgew0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICAgICAgaWYoY29udGVudC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKGNvbnRlbnQsIGNvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGhWYWx1ZSkpIHsNCisgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+bV9iUHJlTnVsbCA9IHBXaWRnZXREYXRhLT5tX2JJc051bGw7DQorICAgICAgICAgICAgcFdpZGdldERhdGEtPm1fYklzTnVsbCA9IFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBXaWRnZXREYXRhLT5tX2JQcmVOdWxsID0gcFdpZGdldERhdGEtPm1fYklzTnVsbDsNCisgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsID0gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXdWYWx1ZTsNCisgICAgICAgIGlmICghKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdUZXh0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KG5ld1ZhbHVlLCBuZXdWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDWEZBX05vZGUgKnBVSUNoaWxkID0gcFdpZGdldERhdGEtPkdldFVJQ2hpbGQoKTsNCisgICAgICAgIGlmIChwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0KSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlYWREaWdpdHMgPSAwOw0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlGcmFjRGlnaXRzID0gMDsNCisgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7DQorICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgICAgIHdzTmV3VGV4dCA9IFhGQV9OdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IEdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VGV4dCh3c05ld1RleHQpOw0KKyAgICAgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1RleHQsIHdzRm9ybWF0VGV4dCk7DQorICAgICAgICB9DQorICAgICAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VGV4dCwgd3NGb3JtYXRUZXh0LCBUUlVFLCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICAgICAgaWYoY29udGVudC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENYRkFfTm9kZSAqcFVJQ2hpbGQgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOw0KKyAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVVSSA9IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgQ1hGQV9WYWx1ZSBkZWZWYWwgPSBwV2lkZ2V0RGF0YS0+R2V0Rm9ybVZhbHVlKCk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGRlZlZhbC5HZXROb2RlKCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EZWNpbWFsKSB7DQorICAgICAgICAgICAgICAgIGlmKGVVSSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCAgJiYgKHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cykgPT0gLTEpKSB7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShjb250ZW50LCBjb250ZW50LkdldExlbmd0aCgpKSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAoRlhfRkxPQVQpKGRvdWJsZSlkZWNpbWFsKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JbnRlZ2VyKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBGWFNZU193dG9pKGNvbnRlbnQpKQk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Jvb2xlYW4pIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIEZYU1lTX3d0b2koY29udGVudCkgPT0gMCA/IEZBTFNFIDogVFJVRSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zsb2F0KSB7DQorICAgICAgICAgICAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwoY29udGVudCk7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGhWYWx1ZSwgKEZYX0ZMT0FUKShkb3VibGUpZGVjaW1hbCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0VkaXRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgcFdpZGdldERhdGEtPlNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9Gb250Q29sb3IoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfRm9udCBmb250ID0gcFdpZGdldERhdGEtPkdldEZvbnQoVFJVRSk7DQorICAgIENYRkFfTm9kZSAqcE5vZGUgPSAoQ1hGQV9Ob2RlKilmb250Ow0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgICAgICB3c0NvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgRlhfSU5UMzIgciwgZywgYjsNCisgICAgICAgIFhGQV9TVFJJTkdfVE9fUkdCKHdzQ29sb3IsIHIsIGcsIGIpOw0KKyAgICAgICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7DQorICAgICAgICBmb250LlNldENvbG9yKGNvbG9yKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0FSR0IgY29sb3IgPSBmb250LkdldENvbG9yKCk7DQorICAgICAgICBGWF9JTlQzMiBhLCByLCBnLCBiOw0KKyAgICAgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7DQorICAgICAgICB3c0NvbG9yLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0NvbG9yKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9Tb21fTWVzc2FnZShoVmFsdWUsIGJTZXR0aW5nLCBYRkFfU09NX0Zvcm1hdE1lc3NhZ2UpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0Zvcm1hdHRlZFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBwV2lkZ2V0RGF0YS0+U2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHBXaWRnZXREYXRhLT5HZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWYWx1ZSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZShUUlVFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgdmFsaWRhdGUuU2V0TnVsbFRlc3Qod3NWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9JTlQzMiBpVmFsdWUgPSB2YWxpZGF0ZS5HZXROdWxsVGVzdCgpOw0KKyAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKChYRkFfQVRUUklCVVRFRU5VTSlpVmFsdWUpOw0KKyAgICAgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICAgICAgd3NWYWx1ZSA9IHBJbmZvLT5wTmFtZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9Tb21fTWVzc2FnZShoVmFsdWUsIGJTZXR0aW5nLCBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2UpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1BhcmVudFN1YmZvcm0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgICAgIGlmIChpSW5kZXggPT0gLTEpIHsNCisgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+Q2xlYXJBbGxTZWxlY3Rpb25zKCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIFRSVUUsIFRSVUUsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZEl0ZW0oKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9DbGVhckl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcFdpZGdldERhdGEtPkRlbGV0ZUl0ZW0oLTEsIFRSVUUpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBldmVudFN0cmluZyA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICBGWF9JTlQzMiBpUmV0ID0gZXhlY1NpbmdsZUV2ZW50QnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChldmVudFN0cmluZywgZXZlbnRTdHJpbmcuR2V0TGVuZ3RoKCkpLCBYRkFfRUxFTUVOVF9GaWVsZCk7DQorICAgICAgICBpZiAoZXZlbnRTdHJpbmcgPT0gRlhfQlNUUkMoInZhbGlkYXRlIikpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNFdmVudCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplLCBGQUxTRSwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY0luaXRpYWxpemUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9EZWxldGVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImRlbGV0ZUl0ZW0iKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgICBGWF9CT09MIGJWYWx1ZSA9IHBXaWRnZXREYXRhLT5EZWxldGVJdGVtKGlJbmRleCwgVFJVRSwgVFJVRSk7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYlZhbHVlKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImdldFNhdmVJdGVtIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgICBpZiAoaUluZGV4IDwgMCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIEZYX0JPT0wgYkhhc0l0ZW0gPSBwV2lkZ2V0RGF0YS0+R2V0Q2hvaWNlTGlzdEl0ZW0od3NWYWx1ZSwgaUluZGV4LCBUUlVFKTsNCisgICAgaWYgKGJIYXNJdGVtKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUod3NWYWx1ZSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0JvdW5kSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJib3VuZEl0ZW0iKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0JvdW5kVmFsdWU7DQorICAgIHBXaWRnZXREYXRhLT5HZXRJdGVtVmFsdWUod3NWYWx1ZSwgd3NCb3VuZFZhbHVlKTsNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQm91bmRWYWx1ZSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0SXRlbVN0YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImdldEl0ZW1TdGF0ZSIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICAgIEZYX0JPT0wgYlZhbHVlID0gcFdpZGdldERhdGEtPkdldEl0ZW1TdGF0ZShpSW5kZXgpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJWYWx1ZSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUsIEZBTFNFLCBGQUxTRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJleGVjQ2FsY3VsYXRlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0RGlzcGxheUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZ2V0RGlzcGxheUl0ZW0iKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICAgIGlmIChpSW5kZXggPCAwKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgRlhfQk9PTCBiSGFzSXRlbSA9IHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpSW5kZXgsIEZBTFNFKTsNCisgICAgaWYgKGJIYXNJdGVtKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUod3NWYWx1ZSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NldEl0ZW1TdGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAyKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJzZXRJdGVtU3RhdGUiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgICBGWF9CT09MIGJBZGQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICBpZiAoYkFkZCkgew0KKyAgICAgICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIFRSVUUsIFRSVUUsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRJdGVtU3RhdGUoaUluZGV4KSkgew0KKyAgICAgICAgICAgIHBXaWRnZXREYXRhLT5TZXRJdGVtU3RhdGUoaUluZGV4LCBGQUxTRSwgVFJVRSwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9BZGRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMikgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiYWRkSXRlbSIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMYWJlbDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNMYWJsZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICB3c0xhYmVsID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTGFibGUsIGJzTGFibGUuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0RGF0YS0+SW5zZXJ0SXRlbSh3c0xhYmVsLCB3c1ZhbHVlLCAtMSwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlLCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY1ZhbGlkYXRlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoIWJTZXR0aW5nKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZighcFdpZGdldERhdGEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgICAgIHBXaWRnZXREYXRhLT5TZXRTZWxlY3RlZE1lbWJlckJ5VmFsdWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpLCBUUlVFLCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICAgICAgWEZBX1ZFUlNJT04gY3VyVmVyc2lvbiA9IEdldERvY3VtZW50KCktPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkgJiYgY3VyVmVyc2lvbiA+PSBYRkFfVkVSU0lPTl8zMDApIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9UcmFuc2llbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDEpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGV2ZW50U3RyaW5nID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIGV4ZWNTaW5nbGVFdmVudEJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZXZlbnRTdHJpbmcsIGV2ZW50U3RyaW5nLkdldExlbmd0aCgpKSwgWEZBX0VMRU1FTlRfRXhjbEdyb3VwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNFdmVudCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9TZWxlY3RlZE1lbWJlcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPT0gMSkpIHsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlICogcFJldHVybk5vZGUgPSBOVUxMOw0KKyAgICAgICAgICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgICAgICAgICAgcFJldHVybk5vZGUgPSBwV2lkZ2V0RGF0YS0+R2V0U2VsZWN0ZWRNZW1iZXIoKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzek5hbWU7DQorICAgICAgICAgICAgICAgIHN6TmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICAgICAgICAgIHBSZXR1cm5Ob2RlID0gcFdpZGdldERhdGEtPlNldFNlbGVjdGVkTWVtYmVyKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocFJldHVybk5vZGUpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBSZXR1cm5Ob2RlKSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJzZWxlY3RlZE1lbWJlciIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJleGVjSW5pdGlhbGl6ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY0NhbGN1bGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY1ZhbGlkYXRlIikpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbShDWEZBX05vZGUgKnBJbnN0TWdyTm9kZSwgRlhfSU5UMzIgaUluZGV4KQ0KK3sNCisgICAgQVNTRVJUKHBJbnN0TWdyTm9kZSk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSAwOw0KKyAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVDdXJUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgJiYgKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwSW5zdE1nck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPCAxIHx8IHdzSW5zdE5hbWUuR2V0QXQoMCkgIT0gJ18nIHx8IHdzSW5zdE5hbWUuTWlkKDEpICE9IHdzTmFtZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZHdOYW1lSGFzaCA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3TmFtZUhhc2ggIT0gcE5vZGUtPkdldE5hbWVIYXNoKCkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlDb3VudCArKzsNCisgICAgICAgIGlmIChpQ291bnQgPiBpSW5kZXgpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBGWF9JTlQzMiBpVG8gPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgICAgIEZYX0lOVDMyIGlGcm9tID0gU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7DQorICAgICAgICBDWEZBX05vZGUgKnBNYW5hZ2VyTm9kZSA9IE5VTEw7DQorICAgICAgICBmb3IgKENYRkFfTm9kZSAqcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQorICAgICAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICAgICAgICAgIHBNYW5hZ2VyTm9kZSA9IHBOb2RlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocE1hbmFnZXJOb2RlKSB7DQorICAgICAgICAgICAgcE1hbmFnZXJOb2RlLT5JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKGlUbywgaUZyb20pOw0KKyAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX05vZGUqIHBUb0luc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBNYW5hZ2VyTm9kZSwgaVRvKTsNCisgICAgICAgICAgICBpZiAocFRvSW5zdGFuY2UgJiYgcFRvSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICAgICAgICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwVG9JbnN0YW5jZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcEZyb21JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbShwTWFuYWdlck5vZGUsIGlGcm9tKTsNCisgICAgICAgICAgICBpZiAocEZyb21JbnN0YW5jZSAmJiBwRnJvbUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocEZyb21JbnN0YW5jZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIFN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmICghYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2VNZ3IgPSBOVUxMOw0KKyAgICAgICAgZm9yIChDWEZBX05vZGUgKnBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgew0KKyAgICAgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TWdyTmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgICAgICAgICBpZiAod3NJbnN0TWdyTmFtZS5HZXRMZW5ndGgoKSA+PSAxICYmIHdzSW5zdE1nck5hbWUuR2V0QXQoMCkgPT0gJ18nICYmIHdzSW5zdE1nck5hbWUuTWlkKDEpID09IHdzTmFtZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlTWdyID0gcE5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJbnN0YW5jZU1ncikgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBJbnN0YW5jZU1ncikpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9Mb2NhbGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0xvY2FsZU5hbWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic0xvY2FsZU5hbWUpOw0KKyAgICAgICAgdGhpcy0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0xvY2FsZU5hbWUsIGJzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKSksIFRSVUUsIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMb2NhbGVOYW1lOw0KKyAgICAgICAgR2V0TG9jYWxlTmFtZSh3c0xvY2FsZU5hbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NMb2NhbGVOYW1lLCB3c0xvY2FsZU5hbWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDEpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGV2ZW50U3RyaW5nID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIGV4ZWNTaW5nbGVFdmVudEJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZXZlbnRTdHJpbmcsIGV2ZW50U3RyaW5nLkdldExlbmd0aCgpKSwgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJleGVjRXZlbnQiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNJbml0aWFsaXplIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY0NhbGN1bGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNWYWxpZGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fR2V0SW52YWxpZE9iamVjdHMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZ2V0SW52YWxpZE9iamVjdHMiKSk7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ1hGQV9Ob2RlOjpTdWJmb3JtX2FuZF9TdWJmb3JtU2V0X0luc3RhbmNlSW5kZXgoKQ0KK3sNCisgICAgRlhfSU5UMzIgaW5kZXggPSAwOw0KKyAgICBmb3IgKENYRkFfTm9kZSAqcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQorICAgICAgICBpZiAoKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgfHwgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gaW5kZXg7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDEpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJmb3JtTm9kZXMiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIG1fcERvY3VtZW50LT5Eb0RhdGFSZW1lcmdlKFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwicmVtZXJnZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJleGVjSW5pdGlhbGl6ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVGFnTmFtZTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ck5hbWU7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJOYW1lU3BhY2U7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1RhZ05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgc3RyVGFnTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1RhZ05hbWUsIGJzVGFnTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICAgICAgICAgIHN0ck5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLCBic05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lU3BhY2UgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICAgICAgICAgICAgICBzdHJOYW1lU3BhY2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lU3BhY2UsIGJzTmFtZVNwYWNlLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5TmFtZShzdHJUYWdOYW1lKTsNCisgICAgICAgIENYRkFfTm9kZSAqcE5ld05vZGUgPSBDcmVhdGVTYW1lUGFja2V0Tm9kZShwRWxlbWVudC0+ZU5hbWUpOw0KKyAgICAgICAgaWYgKCFwTmV3Tm9kZSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICghc3RyTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgaWYgKCBYRkFfR2V0QXR0cmlidXRlT2ZFbGVtZW50KHBFbGVtZW50LT5lTmFtZSwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfWERQUEFDS0VUX1VOS05PV04pKSB7DQorICAgICAgICAgICAgICAgICAgICBwTmV3Tm9kZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgc3RyTmFtZSwgVFJVRSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocE5ld05vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdOb2RlKSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX05PVF9IQVZFX1BST1BFUlRZLCAoRlhfTFBDV1NUUilzdHJUYWdOYW1lLCAoRlhfTFBDV1NUUikoTCJuYW1lIikpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdOb2RlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiY3JlYXRlTm9kZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX1JlY2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDEpIHsNCisgICAgICAgIEZYX0JPT0wJYlNjcmlwdEZsYWdzID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJyZWNhbGN1bGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNDYWxjdWxhdGUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNWYWxpZGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X01hbmlmZXN0X0V2YWx1YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJldmFsdWF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBub2RlT2NjdXIuR2V0TWF4KCkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIG5vZGVPY2N1ci5HZXRNaW4oKSk7DQorICAgIH0NCit9DQorc3RhdGljIEZYX0lOVDMyIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQoQ1hGQV9Ob2RlICpwSW5zdE1nck5vZGUpDQorew0KKyAgICBBU1NFUlQocEluc3RNZ3JOb2RlKTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IDA7DQorICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgWEZBX0VMRU1FTlQgZUN1clR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKGVDdXJUeXBlID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChlQ3VyVHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSAmJiAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TmFtZSA9IHBJbnN0TWdyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgICAgICBpZiAod3NJbnN0TmFtZS5HZXRMZW5ndGgoKSA8IDEgfHwgd3NJbnN0TmFtZS5HZXRBdCgwKSAhPSAnXycgfHwgd3NJbnN0TmFtZS5NaWQoMSkgIT0gd3NOYW1lKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpQ291bnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpQ291bnQgKys7DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCit9DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzX1NvcnROb2RlQXJyYXlCeURvY3VtZW50SWR4KGNvbnN0IENYRkFfTm9kZVNldCYgcmdOb2RlU2V0LCBDWEZBX05vZGVBcnJheSYgcmdOb2RlQXJyYXksIENGWF9BcnJheVRlbXBsYXRlPEZYX0lOVDMyPiYgcmdJZHhBcnJheSkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IHJnTm9kZVNldC5HZXRDb3VudCgpOw0KKyAgICByZ05vZGVBcnJheS5TZXRTaXplKGlDb3VudCk7DQorICAgIHJnSWR4QXJyYXkuU2V0U2l6ZShpQ291bnQpOw0KKyAgICBpZihpQ291bnQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IC0xLCBpVG90YWxJbmRleCA9IC0xOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgRlhfUE9TSVRJT04gcG9zID0gcmdOb2RlU2V0LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgcmdOb2RlU2V0LkdldE5leHRBc3NvYyhwb3MsIHBOb2RlKTsNCisgICAgZm9yKHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgcE5vZGUgJiYgaUluZGV4IDwgaUNvdW50Ow0KKyAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlUb3RhbEluZGV4Kys7DQorICAgICAgICBpZihyZ05vZGVTZXQuTG9va3VwKHBOb2RlKSkgew0KKyAgICAgICAgICAgIGlJbmRleCArKzsNCisgICAgICAgICAgICByZ05vZGVBcnJheVtpSW5kZXhdID0gcE5vZGU7DQorICAgICAgICAgICAgcmdJZHhBcnJheVtpSW5kZXhdID0gaVRvdGFsSW5kZXg7DQorICAgICAgICB9DQorICAgIH0NCit9DQorc3RydWN0IENYRkFfRHVhbE5vZGVBcnJheSA6IENGWF9PYmplY3Qgew0KKyAgICBDWEZBX05vZGVTZXQgZmlyc3ROb2RlTGlzdDsNCisgICAgQ1hGQV9Ob2RlU2V0IHNlY29uZE5vZGVMaXN0Ow0KK307DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzKENYRkFfTm9kZVNldCYgc1NldDEsIENYRkFfTm9kZVNldCYgc1NldDIsIEZYX0JPT0wgYkluc2VydEJlZm9yZSkNCit7DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+Kj4gcmdOb2RlTGlzdE1hcDsNCisgICAgRlhfUE9TSVRJT04gcG9zOw0KKyAgICBwb3MgPSBzU2V0MS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlKHBvcykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgICAgICBzU2V0MS5HZXROZXh0QXNzb2MocG9zLCBwTm9kZSk7DQorICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgaWYoIXBQYXJlbnROb2RlIHx8ICFkd05hbWVIYXNoKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+KiBwTm9kZUxpc3RDaGlsZE1hcCA9IHJnTm9kZUxpc3RNYXBbcFBhcmVudE5vZGVdOw0KKyAgICAgICAgaWYoIXBOb2RlTGlzdENoaWxkTWFwKSB7DQorICAgICAgICAgICAgcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV0gPSBwTm9kZUxpc3RDaGlsZE1hcCA9IEZYX05FVyBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9EdWFsTm9kZUFycmF5KiBwRHVhbE5vZGVBcnJheSA9ICgqcE5vZGVMaXN0Q2hpbGRNYXApW2R3TmFtZUhhc2hdOw0KKyAgICAgICAgaWYoIXBEdWFsTm9kZUFycmF5KSB7DQorICAgICAgICAgICAgKCpwTm9kZUxpc3RDaGlsZE1hcClbZHdOYW1lSGFzaF0gPSBwRHVhbE5vZGVBcnJheSA9IEZYX05FVyBDWEZBX0R1YWxOb2RlQXJyYXk7DQorICAgICAgICB9DQorICAgICAgICBwRHVhbE5vZGVBcnJheS0+Zmlyc3ROb2RlTGlzdC5BZGQocE5vZGUpOw0KKyAgICB9DQorICAgIHBvcyA9IHNTZXQyLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUocG9zKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgICAgIHNTZXQyLkdldE5leHRBc3NvYyhwb3MsIHBOb2RlKTsNCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICBpZighcFBhcmVudE5vZGUgfHwgIWR3TmFtZUhhc2gpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qIHBOb2RlTGlzdENoaWxkTWFwID0gcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV07DQorICAgICAgICBpZighcE5vZGVMaXN0Q2hpbGRNYXApIHsNCisgICAgICAgICAgICByZ05vZGVMaXN0TWFwW3BQYXJlbnROb2RlXSA9IHBOb2RlTGlzdENoaWxkTWFwID0gRlhfTkVXIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj47DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0R1YWxOb2RlQXJyYXkqIHBEdWFsTm9kZUFycmF5ID0gKCpwTm9kZUxpc3RDaGlsZE1hcClbZHdOYW1lSGFzaF07DQorICAgICAgICBpZighcER1YWxOb2RlQXJyYXkpIHsNCisgICAgICAgICAgICAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXSA9IHBEdWFsTm9kZUFycmF5ID0gRlhfTkVXIENYRkFfRHVhbE5vZGVBcnJheTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0Lkxvb2t1cChwTm9kZSkpIHsNCisgICAgICAgICAgICBwRHVhbE5vZGVBcnJheS0+Zmlyc3ROb2RlTGlzdC5SZW1vdmVLZXkocE5vZGUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QuQWRkKHBOb2RlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwb3MgPSByZ05vZGVMaXN0TWFwLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvcykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IE5VTEw7DQorICAgICAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+KiBwTm9kZUxpc3RDaGlsZE1hcCA9IE5VTEw7DQorICAgICAgICByZ05vZGVMaXN0TWFwLkdldE5leHRBc3NvYyhwb3MsIHBQYXJlbnROb2RlLCBwTm9kZUxpc3RDaGlsZE1hcCk7DQorICAgICAgICBpZighcE5vZGVMaXN0Q2hpbGRNYXApIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX1BPU0lUSU9OIGNoaWxkcG9zID0gcE5vZGVMaXN0Q2hpbGRNYXAtPkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgICAgIHdoaWxlKGNoaWxkcG9zKSB7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IDA7DQorICAgICAgICAgICAgQ1hGQV9EdWFsTm9kZUFycmF5KiBwRHVhbE5vZGVBcnJheSA9IE5VTEw7DQorICAgICAgICAgICAgcE5vZGVMaXN0Q2hpbGRNYXAtPkdldE5leHRBc3NvYyhjaGlsZHBvcywgZHdOYW1lSGFzaCwgcER1YWxOb2RlQXJyYXkpOw0KKyAgICAgICAgICAgIGlmKCFwRHVhbE5vZGVBcnJheSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYocER1YWxOb2RlQXJyYXktPmZpcnN0Tm9kZUxpc3QuR2V0Q291bnQoKSAhPSAwICYmIHBEdWFsTm9kZUFycmF5LT5zZWNvbmROb2RlTGlzdC5HZXRDb3VudCgpICE9IDApIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgcmdOb2RlQXJyYXkxLCByZ05vZGVBcnJheTI7DQorICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0lOVDMyPiByZ0lkeEFycmF5MSwgcmdJZHhBcnJheTI7DQorICAgICAgICAgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeChwRHVhbE5vZGVBcnJheS0+Zmlyc3ROb2RlTGlzdCwgcmdOb2RlQXJyYXkxLCByZ0lkeEFycmF5MSk7DQorICAgICAgICAgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeChwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QsIHJnTm9kZUFycmF5MiwgcmdJZHhBcnJheTIpOw0KKyAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGltaXQ7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFBhcmVudE5vZGUgPSBOVUxMLCAqcEJlZm9yZU5vZGUgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBpZihiSW5zZXJ0QmVmb3JlKSB7DQorICAgICAgICAgICAgICAgICAgICBpTGltaXQgPSByZ0lkeEFycmF5MlswXTsNCisgICAgICAgICAgICAgICAgICAgIHBCZWZvcmVOb2RlID0gcmdOb2RlQXJyYXkyWzBdOw0KKyAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUgPSBwQmVmb3JlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpTGltaXQgPSByZ0lkeEFycmF5MltyZ0lkeEFycmF5Mi5HZXRTaXplKCkgLSAxXTsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcExhc3ROb2RlID0gcmdOb2RlQXJyYXkyW3JnSWR4QXJyYXkyLkdldFNpemUoKSAtIDFdOw0KKyAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUgPSBwTGFzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgICAgICAgICAgcEJlZm9yZU5vZGUgPSBwTGFzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGlJZHggPSAwLCBpQ291bnQgPSByZ0lkeEFycmF5MS5HZXRTaXplKCk7IGlJZHggPCBpQ291bnQ7IGlJZHgrKykgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ3VyTm9kZSA9IHJnTm9kZUFycmF5MVtpSWR4XTsNCisgICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5SZW1vdmVDaGlsZChwQ3VyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+SW5zZXJ0Q2hpbGQocEN1ck5vZGUsIHBCZWZvcmVOb2RlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWxldGUgcER1YWxOb2RlQXJyYXk7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZUxpc3RDaGlsZE1hcC0+UmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgcmdOb2RlTGlzdE1hcC5SZW1vdmVBbGwoKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKENYRkFfTm9kZSAqcEluc3RNZ3JOb2RlLCBDWEZBX05vZGUgKnBOZXdJbnN0YW5jZSwgRlhfSU5UMzIgaVBvcywgRlhfSU5UMzIgaUNvdW50ID0gLTEsIEZYX0JPT0wgYk1vdmVEYXRhQmluZGluZ05vZGVzID0gVFJVRSkNCit7DQorICAgIGlmKGlDb3VudCA8IDApIHsNCisgICAgICAgIGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQocEluc3RNZ3JOb2RlKTsNCisgICAgfQ0KKyAgICBpZihpUG9zIDwgMCkgew0KKyAgICAgICAgaVBvcyA9IGlDb3VudDsNCisgICAgfQ0KKyAgICBpZihpUG9zID09IGlDb3VudCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dFNpYmxpbmcgPSBpQ291bnQgPiAwID8gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBJbnN0TWdyTm9kZSwgaUNvdW50IC0gMSktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5JbnNlcnRDaGlsZChwTmV3SW5zdGFuY2UsIHBOZXh0U2libGluZyk7DQorICAgICAgICBpZihiTW92ZURhdGFCaW5kaW5nTm9kZXMpIHsNCisgICAgICAgICAgICBDWEZBX05vZGVTZXQgc05ldywgc0FmdGVyOw0KKyAgICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4gc0l0ZXJhdG9yTmV3KHBOZXdJbnN0YW5jZSk7DQorICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3JOZXcuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3JOZXcuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICAgICAgICAgIGlmKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHNOZXcuQWRkKHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4gc0l0ZXJhdG9yQWZ0ZXIocE5leHRTaWJsaW5nKTsNCisgICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvckFmdGVyLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yQWZ0ZXIuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICAgICAgICAgIGlmKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHNBZnRlci5BZGQocERhdGFOb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzKHNOZXcsIHNBZnRlciwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlICogcEJlZm9yZUluc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBJbnN0TWdyTm9kZSwgaVBvcyk7DQorICAgICAgICBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5JbnNlcnRDaGlsZChwTmV3SW5zdGFuY2UsIHBCZWZvcmVJbnN0YW5jZSk7DQorICAgICAgICBpZihiTW92ZURhdGFCaW5kaW5nTm9kZXMpIHsNCisgICAgICAgICAgICBDWEZBX05vZGVTZXQgc05ldywgc0JlZm9yZTsNCisgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+IHNJdGVyYXRvck5ldyhwTmV3SW5zdGFuY2UpOw0KKyAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yTmV3Lk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZighcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzTmV3LkFkZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+IHNJdGVyYXRvckJlZm9yZShwQmVmb3JlSW5zdGFuY2UpOw0KKyAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBOb2RlID0gc0l0ZXJhdG9yQmVmb3JlLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yQmVmb3JlLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZighcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzQmVmb3JlLkFkZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1Jlb3JkZXJEYXRhTm9kZXMoc05ldywgc0JlZm9yZSwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKENYRkFfTm9kZSAqcEluc3RNZ3JOb2RlLCBDWEZBX05vZGUgKnBSZW1vdmVJbnN0YW5jZSwgRlhfQk9PTCBiUmVtb3ZlRGF0YUJpbmRpbmcgPSBUUlVFKQ0KK3sNCisgICAgcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocFJlbW92ZUluc3RhbmNlKTsNCisgICAgaWYoIWJSZW1vdmVEYXRhQmluZGluZykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4gc0l0ZXJhdG9yKHBSZW1vdmVJbnN0YW5jZSk7DQorICAgIGZvcihDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBGb3JtTm9kZTsgcEZvcm1Ob2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwRm9ybU5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZighcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihwRGF0YU5vZGUtPlJlbW92ZUJpbmRJdGVtKHBGb3JtTm9kZSkgPT0gMCkgew0KKyAgICAgICAgICAgIGlmKENYRkFfTm9kZSogcERhdGFQYXJlbnQgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgICAgICAgICAgICAgIHBEYXRhUGFyZW50LT5SZW1vdmVDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBGb3JtTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UoQ1hGQV9Ob2RlICpwSW5zdE1nck5vZGUsIEZYX0JPT0wgYkRhdGFNZXJnZSkNCit7DQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBJbnN0TWdyTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IE5VTEw7DQorICAgIGZvcihDWEZBX05vZGUqIHBSb290Qm91bmROb2RlID0gcEZvcm1QYXJlbnQ7IHBSb290Qm91bmROb2RlICYmIHBSb290Qm91bmROb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTsgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgICAgIHBEYXRhU2NvcGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgICAgIGlmKHBEYXRhU2NvcGUpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZighcERhdGFTY29wZSkgew0KKyAgICAgICAgcERhdGFTY29wZSA9IChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCisgICAgICAgIEFTU0VSVChwRGF0YVNjb3BlKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUgKnBJbnN0YW5jZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlTm9kZSwgcEZvcm1QYXJlbnQsIHBEYXRhU2NvcGUsIFRSVUUsIGJEYXRhTWVyZ2UpOw0KKyAgICBpZihwSW5zdGFuY2UpIHsNCisgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEluc3RhbmNlKTsNCisgICAgICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwSW5zdGFuY2UpOw0KKyAgICB9DQorICAgIHJldHVybiBwSW5zdGFuY2U7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0NvdW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgRlhfSU5UMzIgaURlc2lyZWQgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgICAgIEluc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoaURlc2lyZWQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcykpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyAhPSAyKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUZyb20gPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgICAgRlhfSU5UMzIgaVRvID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7DQorICAgIEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaVRvLCBpRnJvbSk7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwVG9JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpVG8pOw0KKyAgICBpZiAocFRvSW5zdGFuY2UgJiYgcFRvSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFRvSW5zdGFuY2UpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEZyb21JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpRnJvbSk7DQorICAgIGlmIChwRnJvbUluc3RhbmNlICYmIHBGcm9tSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocEZyb21JbnN0YW5jZSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgIT0gMSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgICBGWF9JTlQzMiAgaUNvdW50ICA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQorICAgIGlmIChpSW5kZXggPCAwIHx8IGlJbmRleCA+PSBpQ291bnQpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCisgICAgRlhfSU5UMzIgIGlNaW4gPSBub2RlT2NjdXIuR2V0TWluKCk7DQorICAgIGlmIChpQ291bnQgLSAxIDwgaU1pbikgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCAoRlhfTFBDV1NUUikoTCJtaW4iKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlICpwUmVtb3ZlSW5zdGFuY2UgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0odGhpcywgaUluZGV4KTsNCisgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKHRoaXMsIHBSZW1vdmVJbnN0YW5jZSk7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKHBOb3RpZnkpIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IGlJbmRleDsgaSA8IGlDb3VudCAtIDE7IGkrKykgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSAqcFN1YmZvcm1JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpKTsNCisgICAgICAgICAgICBpZiAocFN1YmZvcm1JbnN0YW5jZSAmJiBwU3ViZm9ybUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFN1YmZvcm1JbnN0YW5jZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgICBpZiAoIXBMYXlvdXRQcm8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyAhPSAxKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaURlc2lyZWQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgICAgSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpRGVzaXJlZCk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0FkZEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjICA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGFyZ2MgIT0gMCkgJiYgKGFyZ2MgIT0gMSkpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImFkZEluc3RhbmNlIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgZkZsYWdzID0gVFJVRTsNCisgICAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgZkZsYWdzID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KKyAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgICBGWF9JTlQzMiBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOw0KKyAgICBpZiAoaU1heCA+PSAwICYmIGlDb3VudCA+PSBpTWF4KSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlksIChGWF9MUENXU1RSKShMIm1heCIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgZkZsYWdzKTsNCisgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIEZBTFNFKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdJbnN0YW5jZSkpOw0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPlJ1bk5vZGVJbml0aWFsaXplKHBOZXdJbnN0YW5jZSk7DQorICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgICBpZiAoIXBMYXlvdXRQcm8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0luc2VydEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmICgoYXJnYyAhPSAxKSAmJiAoYXJnYyAhPSAyKSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiaW5zZXJ0SW5zdGFuY2UiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICAgIEZYX0JPT0wgYkJpbmQgPSBGQUxTRTsNCisgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgYkJpbmQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQorICAgIGlmIChpSW5kZXggPCAwIHx8IGlJbmRleCA+IGlDb3VudCkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkRFWF9PVVRfT0ZfQk9VTkRTKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOw0KKyAgICBpZiAoaU1heCA+PSAwICYmIGlDb3VudCA+PSBpTWF4KSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlksIChGWF9MUENXU1RSKShMIm1heCIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgYkJpbmQpOw0KKyAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0luc2VydEl0ZW0odGhpcywgcE5ld0luc3RhbmNlLCBpSW5kZXgsIGlDb3VudCwgVFJVRSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTmV3SW5zdGFuY2UpKTsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5SdW5Ob2RlSW5pdGlhbGl6ZShwTmV3SW5zdGFuY2UpOw0KKyAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpOw0KK30NCitGWF9JTlQzMiBDWEZBX05vZGU6Okluc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoRlhfSU5UMzIgaURlc2lyZWQpDQorew0KKyAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgICBGWF9JTlQzMiBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOw0KKyAgICBGWF9JTlQzMiBpTWluID0gbm9kZU9jY3VyLkdldE1pbigpOw0KKyAgICBpZiAoaURlc2lyZWQgPCBpTWluKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlksIChGWF9MUENXU1RSKShMIm1pbiIpKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmICgoaU1heCA+PSAwKSAmJiAoaURlc2lyZWQgPiBpTWF4KSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCAoRlhfTFBDV1NUUikoTCJtYXgiKSk7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KKyAgICBpZiAoaURlc2lyZWQgPT0gaUNvdW50KSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZihpRGVzaXJlZCA8IGlDb3VudCkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE1hbmFnZXJOYW1lID0gdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSW5zdGFuY2VOYW1lID0gd3NJbnN0TWFuYWdlck5hbWUuSXNFbXB0eSgpID8gd3NJbnN0TWFuYWdlck5hbWUgOiB3c0luc3RNYW5hZ2VyTmFtZS5NaWQoMSk7DQorICAgICAgICBGWF9EV09SRCBkSW5zdGFuY2VOYW1lSGFzaCA9IHdzSW5zdGFuY2VOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0luc3RhbmNlTmFtZSwgd3NJbnN0YW5jZU5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUHJldlNpYmxpbmcgPSAoaURlc2lyZWQgPT0gMCkgPyB0aGlzIDogWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlEZXNpcmVkIC0gMSk7DQorICAgICAgICB3aGlsZShpQ291bnQgPiBpRGVzaXJlZCkgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcFJlbW92ZUluc3RhbmNlID0gcFByZXZTaWJsaW5nLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmIHBSZW1vdmVJbnN0YW5jZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldE5hbWVIYXNoKCkgPT0gZEluc3RhbmNlTmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKHRoaXMsIHBSZW1vdmVJbnN0YW5jZSk7DQorICAgICAgICAgICAgICAgIGlDb3VudC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChpRGVzaXJlZCA+IGlDb3VudCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gR2V0VGVtcGxhdGVOb2RlKCk7DQorICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB3aGlsZSAoaUNvdW50IDwgaURlc2lyZWQpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgVFJVRSk7DQorICAgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIEZBTFNFKTsNCisgICAgICAgICAgICBpQ291bnQgKys7DQorICAgICAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorICAgIHJldHVybiAwOw0KK30NCitGWF9JTlQzMiBDWEZBX05vZGU6Okluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoRlhfSU5UMzIgaVRvLCBGWF9JTlQzMiBpRnJvbSkNCit7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQorICAgIGlmIChpRnJvbSA+IGlDb3VudCB8fCBpVG8gPiBpQ291bnQgLSAxKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgaWYgKGlGcm9tIDwgMCB8fCBpVG8gPCAwIHx8IGlGcm9tID09IGlUbykgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlICogcE1vdmVJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpRnJvbSk7DQorICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSXRlbSh0aGlzLCBwTW92ZUluc3RhbmNlLCBGQUxTRSk7DQorICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SXRlbSh0aGlzLCBwTW92ZUluc3RhbmNlLCBpVG8sIGlDb3VudCAtIDEsIFRSVUUpOw0KKyAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorICAgIHJldHVybiAwOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X09jY3VyX01heChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBDWEZBX09jY3VyIG9jY3VyKHRoaXMpOw0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIEZYX0lOVDMyIGlNYXggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgICAgIG9jY3VyLlNldE1heChpTWF4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBvY2N1ci5HZXRNYXgoKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NaW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgQ1hGQV9PY2N1ciBvY2N1cih0aGlzKTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBGWF9JTlQzMiBpTWluID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICAgICAgICBvY2N1ci5TZXRNaW4oaU1pbik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgb2NjdXIuR2V0TWluKCkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVzY19NZXRhZGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPT0gMSkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIm1ldGFkYXRhIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlICogcERhdGFOb2RlID0gKENYRkFfTm9kZSAqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtSXRlbXM7DQorICAgICAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBwRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtSXRlbXMpOw0KKyAgICAgICAgICAgIENYRkFfQXJyYXlOb2RlTGlzdCAqcEZvcm1Ob2RlcyA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgICAgICAgICAgIHBGb3JtTm9kZXMtPlNldEFycmF5Tm9kZUxpc3QoZm9ybUl0ZW1zKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKENYRkFfT2JqZWN0KilwRm9ybU5vZGVzLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJmb3JtTm9kZXMiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICAgICAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJyZW1lcmdlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJleGVjSW5pdGlhbGl6ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVjYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRFdmVudFBhcmFtKCk7DQorICAgIGlmIChwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfQ2FsY3VsYXRlIHx8IHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAxKSB7DQorICAgICAgICBGWF9CT09MCWJTY3JpcHRGbGFncyA9IHBBcmd1bWVudHMtPkdldEludDMyKDApID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAoYlNjcmlwdEZsYWdzKSB7DQorICAgICAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7DQorICAgICAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgICAgICAgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInJlY2FsY3VsYXRlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZXhlY0NhbGN1bGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImV4ZWNWYWxpZGF0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrc3VtOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNDaGVja3N1bSk7DQorICAgICAgICBTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ2hlY2tzdW0sIGJzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hlY2tzdW07DQorICAgICAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgd3NDaGVja3N1bSwgRkFMU0UpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NDaGVja3N1bSwgd3NDaGVja3N1bS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0F0dHJpYnV0ZU5hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGVWYWx1ZTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPQlHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGUpLT5HZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQXR0cmlidXRlTmFtZSwgYnNBdHRyaWJ1dGVOYW1lLkdldExlbmd0aCgpKSwgd3NBdHRyaWJ1dGVWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUod3NBdHRyaWJ1dGVWYWx1ZSwgd3NBdHRyaWJ1dGVWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiZ2V0QXR0cmlidXRlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlKS0+U2V0U3RyaW5nKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSksIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwic2V0QXR0cmlidXRlIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTmFtZSwgYnNOYW1lLkdldExlbmd0aCgpKTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQorICAgICAgICAgICAgaWYgKHBYTUxFbGVtZW50LT5IYXNBdHRyaWJ1dGUod3NOYW1lKSkgew0KKyAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKHdzTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInJlbW92ZUF0dHJpYnV0ZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9Db250ZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOZXdDb250ZW50Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNOZXdDb250ZW50KTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQorICAgICAgICAgICAgcFhNTEVsZW1lbnQtPlNldFRleHREYXRhKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05ld0NvbnRlbnQsIGJzTmV3Q29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0RGF0YTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQorICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldFRleHREYXRhKHdzVGV4dERhdGEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NUZXh0RGF0YSwgd3NUZXh0RGF0YS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwibmV4dCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWxCYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJjYW5jZWxCYXRjaCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9GaXJzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJmaXJzdCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9VcGRhdGVCYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJ1cGRhdGVCYXRjaCIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9QcmV2aW91cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJwcmV2aW91cyIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9Jc0JPRihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJpc0JPRiIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9Jc0VPRihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJpc0VPRiIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiY2FuY2VsIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJ1cGRhdGUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfT3BlbihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJvcGVuIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RlbGV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJkZWxldGUiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQWRkTmV3KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImFkZE5ldyIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXF1ZXJ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInJlcXVlcnkiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUmVzeW5jKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInJlc3luYyIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DbG9zZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJjbG9zZSIpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9MYXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChhcmdjID09IDApIHsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImxhc3QiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSGFzRGF0YUNoYW5nZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiaGFzRGF0YUNoYW5nZWQiKSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9YZmFfVGhpcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoIWJTZXR0aW5nKSB7DQorICAgICAgICBDWEZBX09iamVjdCogcFRoaXMgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFRoaXMpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocFRoaXMpKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0hhbmRsZXJfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1Ym1pdEZvcm1hdF9Nb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXh0cmFzX1R5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TY3JpcHRfU3RhdGVsZXNzKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShGWF9XU1RSQyhMIjAiKSkpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0VuY3J5cHRfRm9ybWF0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorfQ0KK2VudW0gWEZBX0tFWVRZUEUgew0KKyAgICBYRkFfS0VZVFlQRV9DdXN0b20sDQorICAgIFhGQV9LRVlUWVBFX0VsZW1lbnQsDQorfTsNCitGWF9MUFZPSUQgWEZBX0dldE1hcEtleV9DdXN0b20oRlhfV1NUUiB3c0tleSkNCit7DQorICAgIEZYX0RXT1JEIGR3S2V5ID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NLZXkuR2V0UHRyKCksIHdzS2V5LkdldExlbmd0aCgpKTsNCisgICAgcmV0dXJuIChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpKChkd0tleSA8PCAxKSB8IFhGQV9LRVlUWVBFX0N1c3RvbSk7DQorfQ0KK0ZYX0xQVk9JRCBYRkFfR2V0TWFwS2V5X0VsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIHJldHVybiAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKSgoZUVsZW1lbnQgPDwgMTYpIHwgKGVBdHRyaWJ1dGUgPDwgOCkgfCBYRkFfS0VZVFlQRV9FbGVtZW50KTsNCit9DQorc3RhdGljIGlubGluZSBGWF9CT09MIFhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KFhGQV9FTEVNRU5UIGVFbGVtLCBYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9MUFZPSUQgJnBLZXkpDQorew0KKyAgICBwS2V5ID0gWEZBX0dldE1hcEtleV9FbGVtZW50KGVFbGVtLCBlQXR0cik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MCUNYRkFfTm9kZTo6SGFzQXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0JPT0wgYkNhbkluaGVyaXQgKQ0KK3sNCisgICAgRlhfTFBWT0lEIHBLZXkgPSBOVUxMOw0KKyAgICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIEhhc01hcE1vZHVsZUtleShwS2V5LCBiQ2FuSW5oZXJpdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfV1NUUiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkgICkNCit7DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KKyAgICBpZiAocEF0dHIgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gcEF0dHItPmVUeXBlOw0KKyAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSkgew0KKyAgICAgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcE5vdHN1cmUgPSBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShHZXRDbGFzc0lEKCksIHBBdHRyLT5lTmFtZSk7DQorICAgICAgICBlVHlwZSA9IHBOb3RzdXJlID8gcE5vdHN1cmUtPmVUeXBlIDogWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE7DQorICAgIH0NCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOiB7DQorICAgICAgICAgICAgICAgIFhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBwRW51bSA9IFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlOYW1lKHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0RW51bShwQXR0ci0+ZU5hbWUsIHBFbnVtID8gcEVudW0tPmVOYW1lIDogKFhGQV9BVFRSSUJVVEVFTlVNKShGWF9JTlRQVFIpKHBBdHRyLT5wRGVmVmFsdWUpLCBiTm90aWZ5KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhOg0KKyAgICAgICAgICAgIHJldHVybiBTZXRDRGF0YShwQXR0ci0+ZU5hbWUsIHdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOg0KKyAgICAgICAgICAgIHJldHVybiBTZXRCb29sZWFuKHBBdHRyLT5lTmFtZSwgd3NWYWx1ZSAhPSBGWF9XU1RSQyhMIjAiKSwgYk5vdGlmeSk7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXI6DQorICAgICAgICAgICAgcmV0dXJuIFNldEludGVnZXIocEF0dHItPmVOYW1lLCBGWFNZU19yb3VuZChGWF93Y3N0b2Yod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpLCBiTm90aWZ5KTsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZToNCisgICAgICAgICAgICByZXR1cm4gU2V0TWVhc3VyZShwQXR0ci0+ZU5hbWUsIENYRkFfTWVhc3VyZW1lbnQod3NWYWx1ZSksIGJOb3RpZnkpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgKQ0KK3sNCisgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cik7DQorICAgIGlmIChwQXR0ciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUgPSBwQXR0ci0+ZVR5cGU7DQorICAgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFKSB7DQorICAgICAgICBYRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBwTm90c3VyZSA9IFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKEdldENsYXNzSUQoKSwgcEF0dHItPmVOYW1lKTsNCisgICAgICAgIGVUeXBlID0gcE5vdHN1cmUgPyBwTm90c3VyZS0+ZVR5cGUgOiBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0VudW06IHsNCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZhbHVlOw0KKyAgICAgICAgICAgICAgICBpZiAoIVRyeUVudW0ocEF0dHItPmVOYW1lLCBlVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoZVZhbHVlKS0+cE5hbWU7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KKyAgICAgICAgICAgICAgICBpZiAoIVRyeUNEYXRhKHBBdHRyLT5lTmFtZSwgd3NWYWx1ZUMsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOiB7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZhbHVlOw0KKyAgICAgICAgICAgICAgICBpZiAoIVRyeUJvb2xlYW4ocEF0dHItPmVOYW1lLCBiVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBiVmFsdWUgPyBGWF9XU1RSQyhMIjEiKSA6IEZYX1dTVFJDKEwiMCIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXI6IHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVZhbHVlOw0KKyAgICAgICAgICAgICAgICBpZiAoIVRyeUludGVnZXIocEF0dHItPmVOYW1lLCBpVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHdzVmFsdWUuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQiLCBpVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmU6IHsNCisgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtVmFsdWU7DQorICAgICAgICAgICAgICAgIGlmICghVHJ5TWVhc3VyZShwQXR0ci0+ZU5hbWUsIG1WYWx1ZSwgYlVzZURlZmF1bHQpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbVZhbHVlLlRvU3RyaW5nKHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldEF0dHJpYnV0ZShGWF9XU1RSIHdzQXR0ciwgRlhfV1NUUiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpDQorew0KKyAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NWYWx1ZSk7DQorICAgIGlmIChwQXR0cmlidXRlSW5mbykgew0KKyAgICAgICAgcmV0dXJuIFNldEF0dHJpYnV0ZShwQXR0cmlidXRlSW5mby0+ZU5hbWUsIHdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgICB9DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gWEZBX0dldE1hcEtleV9DdXN0b20od3NBdHRyKTsNCisgICAgU2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OkdldEF0dHJpYnV0ZShGWF9XU1RSIHdzQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQpDQorew0KKyAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NBdHRyKTsNCisgICAgaWYgKHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICByZXR1cm4gR2V0QXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSwgd3NWYWx1ZSwgYlVzZURlZmF1bHQpOw0KKyAgICB9DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gWEZBX0dldE1hcEtleV9DdXN0b20od3NBdHRyKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KKyAgICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWVDKSkgew0KKyAgICAgICAgd3NWYWx1ZSA9IHdzVmFsdWVDOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6UmVtb3ZlQXR0cmlidXRlKEZYX1dTVFIgd3NBdHRyKQ0KK3sNCisgICAgRlhfTFBWT0lEIHBLZXkgPSBYRkFfR2V0TWFwS2V5X0N1c3RvbSh3c0F0dHIpOw0KKyAgICBSZW1vdmVNYXBNb2R1bGVLZXkocEtleSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MICZiVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgICkNCit7DQorICAgIEZYX0xQVk9JRCBwVmFsdWUgPSBOVUxMOw0KKyAgICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGJWYWx1ZSA9IChGWF9CT09MKShGWF9VSU5UUFRSKXBWYWx1ZTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0lOVDMyICZpVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQpDQorew0KKyAgICBGWF9MUFZPSUQgcFZhbHVlID0gTlVMTDsNCisgICAgaWYgKCFHZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgYlVzZURlZmF1bHQsIHBWYWx1ZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpVmFsdWUgPSAoRlhfSU5UMzIpKEZYX1VJTlRQVFIpcFZhbHVlOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeUVudW0oWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURUVOVU0gJmVWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCkNCit7DQorICAgIEZYX0xQVk9JRCBwVmFsdWUgPSBOVUxMOw0KKyAgICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGVWYWx1ZSA9IChYRkFfQVRUUklCVVRFRU5VTSkoRlhfVUlOVFBUUilwVmFsdWU7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ICkNCit7DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gTlVMTDsNCisgICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIE9uQ2hhbmdpbmcoZUF0dHIsICZtVmFsdWUsIGJOb3RpZnkpOw0KKyAgICBTZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgJm1WYWx1ZSwgc2l6ZW9mKENYRkFfTWVhc3VyZW1lbnQpKTsNCisgICAgT25DaGFuZ2VkKGVBdHRyLCAmbVZhbHVlLCBiTm90aWZ5KTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIENYRkFfTWVhc3VyZW1lbnQgJm1WYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCkNCit7DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gTlVMTDsNCisgICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQVk9JRCBwVmFsdWU7DQorICAgIEZYX0lOVDMyIGlCeXRlczsNCisgICAgaWYoR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBWYWx1ZSwgaUJ5dGVzKSAmJiBpQnl0ZXMgPT0gc2l6ZW9mKG1WYWx1ZSkpIHsNCisgICAgICAgIEZYX21lbWNweSgmbVZhbHVlLCBwVmFsdWUsIHNpemVvZihtVmFsdWUpKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmKGJVc2VEZWZhdWx0ICYmIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBHZXRDbGFzc0lEKCksIGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBtX2VQYWNrZXQpKSB7DQorICAgICAgICBGWF9tZW1jcHkoJm1WYWx1ZSwgcFZhbHVlLCBzaXplb2YobVZhbHVlKSk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5LCBGWF9CT09MIGJTY3JpcHRNb2RpZnkpDQorew0KKyAgICBGWF9MUFZPSUQgcEtleSA9IE5VTEw7DQorICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBPbkNoYW5naW5nKGVBdHRyLCAoRlhfTFBWT0lEKShGWF9MUENXU1RSKXdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgKnBDbG9uZSA9IEZYX05FVyBDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKTsNCisgICAgICAgIGlmIChwQ2xvbmUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIFNldFVzZXJEYXRhKHBLZXksIHBDbG9uZSwgJmRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBTZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZSk7DQorICAgICAgICBpZihlQXR0ciA9PSBYRkFfQVRUUklCVVRFX05hbWUpIHsNCisgICAgICAgICAgICBVcGRhdGVOYW1lSGFzaCgpOw0KKyAgICAgICAgICAgIGlmIChYRkFfTFBDSlNCVUlMVElOSU5GTyBwQnVpbHRpbiA9IFhGQV9HZXRKU0J1aWx0aW5CeUhhc2gobV9kd05hbWVIYXNoKSkgew0KKyAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5BZGRKU0J1aWx0aW5PYmplY3QocEJ1aWx0aW4pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBPbkNoYW5nZWQoZUF0dHIsIChGWF9MUFZPSUQpKEZYX0xQQ1dTVFIpd3NWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSk7DQorICAgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgZUF0dHIgIT0gWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lICYmIGVBdHRyICE9IFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpIHsNCisgICAgICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX05hbWUgJiYgKG1fZU5vZGVDbGFzcyA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUgfHwgbV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgICAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gbV9wWE1MTm9kZS0+R2V0VHlwZSgpOw0KKyAgICAgICAgICAgIHN3aXRjaCAoZVhNTFR5cGUpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50Og0KKyAgICAgICAgICAgICAgICAgICAgaWYgKElzQXR0cmlidXRlSW5YTUwoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0U3RyaW5nKEdldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSksIHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWxldGVDaGlsZHJlbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkRGF0YU5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZERhdGFOb2RlOyBwQ2hpbGREYXRhTm9kZSA9IHBDaGlsZERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENoaWxkRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtTm9kZXMpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWxldGVDaGlsZHJlbiA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRGVsZXRlQ2hpbGRyZW4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5EZWxldGVDaGlsZHJlbigpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPlNldFRleHREYXRhKHdzVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDoNCisgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxUZXh0KiltX3BYTUxOb2RlKS0+U2V0VGV4dCh3c1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KKyAgICAgICAgaWYgKHBJbmZvKSB7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lID0gcEluZm8tPnBOYW1lOw0KKyAgICAgICAgICAgIGlmKHBJbmZvLT5lTmFtZSA9PSBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlKSB7DQorICAgICAgICAgICAgICAgIHdzQXR0ck5hbWUgPSBGWF9XU1RSQyhMInhmYToiKSArIHdzQXR0ck5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0U3RyaW5nKHdzQXR0ck5hbWUsIHdzVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0QXR0cmlidXRlVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLCBGWF9CT09MIGJOb3RpZnksIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSkNCit7DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gTlVMTDsNCisgICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIFhGQV9BVFRSSUJVVEVfVmFsdWUsIHBLZXkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgT25DaGFuZ2luZyhYRkFfQVRUUklCVVRFX1ZhbHVlLCAoRlhfTFBWT0lEKShGWF9MUENXU1RSKXdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyAqcENsb25lID0gRlhfTkVXIENGWF9XaWRlU3RyaW5nKHdzVmFsdWUpOw0KKyAgICBpZiAocENsb25lID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBTZXRVc2VyRGF0YShwS2V5LCBwQ2xvbmUsICZkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2spOw0KKyAgICBPbkNoYW5nZWQoWEZBX0FUVFJJQlVURV9WYWx1ZSwgKEZYX0xQVk9JRCkoRlhfTFBDV1NUUil3c1ZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5KTsNCisgICAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSkgew0KKyAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gbV9wWE1MTm9kZS0+R2V0VHlwZSgpOw0KKyAgICAgICAgc3dpdGNoIChlWE1MVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDoNCisgICAgICAgICAgICAgICAgaWYgKElzQXR0cmlidXRlSW5YTUwoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRTdHJpbmcoR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSwgd3NYTUxWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWxldGVDaGlsZHJlbiA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGREYXRhTm9kZTsgcENoaWxkRGF0YU5vZGUgPSBwQ2hpbGREYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ2hpbGREYXRhTm9kZS0+R2V0QmluZEl0ZW1zKGZvcm1Ob2RlcykgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsZXRlQ2hpbGRyZW4gPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJEZWxldGVDaGlsZHJlbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+RGVsZXRlQ2hpbGRyZW4oKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0VGV4dERhdGEod3NYTUxWYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0Og0KKyAgICAgICAgICAgICAgICAoKElGREVfWE1MVGV4dCopbV9wWE1MTm9kZSktPlNldFRleHQod3NYTUxWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTAlDWEZBX05vZGU6OlRyeUNEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0LCBGWF9CT09MIGJQcm90bykNCit7DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gTlVMTDsNCisgICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyAqcFN0ciA9IChDRlhfV2lkZVN0cmluZyopR2V0VXNlckRhdGEocEtleSwgYlByb3RvKTsNCisgICAgICAgIGlmIChwU3RyKSB7DQorICAgICAgICAgICAgd3NWYWx1ZSA9ICpwU3RyOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KKyAgICAgICAgaWYgKEdldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlQykpIHsNCisgICAgICAgICAgICB3c1ZhbHVlID0gd3NWYWx1ZUM7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiVXNlRGVmYXVsdCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0xQVk9JRCBwVmFsdWUgPSBOVUxMOw0KKyAgICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldENsYXNzSUQoKSwgZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBtX2VQYWNrZXQpKSB7DQorICAgICAgICB3c1ZhbHVlID0gKEZYX0xQQ1dTVFIpcFZhbHVlOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0LCBGWF9CT09MIGJQcm90bykNCit7DQorICAgIEZYX0xQVk9JRCBwS2V5ID0gTlVMTDsNCisgICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyAqcFN0ciA9IChDRlhfV2lkZVN0cmluZyopR2V0VXNlckRhdGEocEtleSwgYlByb3RvKTsNCisgICAgICAgIGlmIChwU3RyKSB7DQorICAgICAgICAgICAgd3NWYWx1ZSA9ICpwU3RyOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKEdldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYlVzZURlZmF1bHQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9MUFZPSUQgcFZhbHVlID0gTlVMTDsNCisgICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBHZXRDbGFzc0lEKCksIGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgbV9lUGFja2V0KSkgew0KKyAgICAgICAgd3NWYWx1ZSA9IChDRlhfV2lkZVN0cmluZ0MpKEZYX0xQQ1dTVFIpcFZhbHVlOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0xQVk9JRCBwRGF0YSwgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyApDQorew0KKyAgICBGWF9MUFZPSUQgcEtleSA9IE5VTEw7DQorICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gU2V0VXNlckRhdGEocEtleSwgcERhdGEsIHBDYWxsYmFja0luZm8pOw0KK30NCitGWF9CT09MCUNYRkFfTm9kZTo6VHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0xQVk9JRCAmcERhdGEpDQorew0KKyAgICBGWF9MUFZPSUQgcEtleSA9IE5VTEw7DQorICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBwRGF0YSA9IEdldFVzZXJEYXRhKHBLZXkpOw0KKyAgICByZXR1cm4gcERhdGEgIT0gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLCBGWF9MUFZPSUQgcFZhbHVlLCBGWF9CT09MIGJOb3RpZnkpDQorew0KKyAgICBGWF9MUFZPSUQgcEtleSA9IE5VTEw7DQorICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBPbkNoYW5naW5nKGVBdHRyLCBwVmFsdWUsIGJOb3RpZnkpOw0KKyAgICBTZXRNYXBNb2R1bGVWYWx1ZShwS2V5LCBwVmFsdWUpOw0KKyAgICBPbkNoYW5nZWQoZUF0dHIsIHBWYWx1ZSwgYk5vdGlmeSk7DQorICAgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgICAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyKTsNCisgICAgICAgIGlmIChwSW5mbykgew0KKyAgICAgICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOg0KKyAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRTdHJpbmcocEluZm8tPnBOYW1lLCBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoKFhGQV9BVFRSSUJVVEVFTlVNKShGWF9VSU5UUFRSKXBWYWx1ZSktPnBOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW46DQorICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPlNldFN0cmluZyhwSW5mby0+cE5hbWUsIHBWYWx1ZSA/IEZYX1dTVFJDKEwiMSIpIDogRlhfV1NUUkMoTCIwIikpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjoNCisgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0SW50ZWdlcihwSW5mby0+cE5hbWUsIChGWF9JTlQzMikoRlhfVUlOVFBUUilwVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIEZYX0JPT0wgYlVzZURlZmF1bHQsIEZYX0xQVk9JRCAmcFZhbHVlKQ0KK3sNCisgICAgRlhfTFBWT0lEIHBLZXkgPSBOVUxMOw0KKyAgICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYoR2V0TWFwTW9kdWxlVmFsdWUocEtleSwgcFZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKCFiVXNlRGVmYXVsdCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgR2V0Q2xhc3NJRCgpLCBlQXR0ciwgZVR5cGUsIG1fZVBhY2tldCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EZWZhdWx0RnJlZURhdGEoRlhfTFBWT0lEIHBEYXRhKQ0KK3sNCit9DQorc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZ3NfWEZBRGVmYXVsdEZyZWVEYXRhID0ge1hGQV9EZWZhdWx0RnJlZURhdGEsIE5VTEx9Ow0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRVc2VyRGF0YShGWF9MUFZPSUQgcEtleSwgRlhfTFBWT0lEIHBEYXRhLCBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvICkNCit7DQorICAgIFNldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCAmcERhdGEsIHNpemVvZihGWF9MUFZPSUQpLCBwQ2FsbGJhY2tJbmZvID8gcENhbGxiYWNrSW5mbyA6ICZnc19YRkFEZWZhdWx0RnJlZURhdGEpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeVVzZXJEYXRhKEZYX0xQVk9JRCBwS2V5LCBGWF9MUFZPSUQgJnBEYXRhLCBGWF9CT09MIGJQcm90b0Fsc28pDQorew0KKyAgICBGWF9JTlQzMiBpQnl0ZXMgPSAwOw0KKyAgICBpZiAoIUdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwRGF0YSwgaUJ5dGVzLCBiUHJvdG9BbHNvKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBpQnl0ZXMgPT0gc2l6ZW9mKEZYX0xQVk9JRCkgJiYgRlhTWVNfbWVtY3B5KCZwRGF0YSwgcERhdGEsIGlCeXRlcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRTY3JpcHRDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLCBGWF9CT09MIGJOb3RpZnksIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSwgRlhfQk9PTCBiU3luY0RhdGEpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiBwQmluZE5vZGUgPSBOVUxMOw0KKyAgICBzd2l0Y2ggKEdldE9iamVjdFR5cGUoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlOiB7DQorICAgICAgICAgICAgICAgIGlmIChYRkFfRmllbGRJc011bHRpTGlzdEJveCh0aGlzKSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocENoaWxkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcENoaWxkVmFsdWUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIEZYX1dTVFJDKEwidGV4dC94bWwiKSk7DQorICAgICAgICAgICAgICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQmluZCA9IEdldEJpbmREYXRhKCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoYlN5bmNEYXRhICYmIHBCaW5kKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVNpemUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3NDb250ZW50LklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpU3RhcnQgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpTGVuZ3RoID0gd3NDb250ZW50LkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpRW5kID0gd3NDb250ZW50LkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmQgPSAoaUVuZCA9PSAtMSkgPyBpTGVuZ3RoIDogaUVuZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1NhdmVUZXh0QXJyYXkuQWRkKHdzQ29udGVudC5NaWQoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZCA9IHdzQ29udGVudC5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlFbmQgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5LkFkZCh3c0NvbnRlbnQuTWlkKGlTdGFydCwgaUxlbmd0aCAtIGlTdGFydCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTaXplID0gd3NTYXZlVGV4dEFycmF5LkdldFNpemUoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoaVNpemUgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgdmFsdWVOb2RlczsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaURhdGFzID0gcEJpbmQtPkdldE5vZGVMaXN0KHZhbHVlTm9kZXMsIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaURhdGFzIDwgaVNpemUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlBZGROb2RlcyA9IGlTaXplIC0gaURhdGFzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwVmFsdWVOb2RlcyA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaUFkZE5vZGVzLS0gPiAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlTm9kZXMgPSBwQmluZC0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVOb2Rlcy0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMInZhbHVlIikpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaW5kLT5JbnNlcnRDaGlsZChwVmFsdWVOb2Rlcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVOb2RlcyA9IE5VTEw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaURhdGFzID4gaVNpemUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlEZWxOb2RlcyA9IGlEYXRhcyAtIGlTaXplOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlEZWxOb2Rlcy0tID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUgKnBWYWx1ZU5vZGUgPSBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVmFsdWVOb2RlOyBwVmFsdWVOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NTYXZlVGV4dEFycmF5W2ldLCB3c1NhdmVUZXh0QXJyYXlbaV0sIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBub2RlQXJyYXk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBub2RlQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG5vZGVBcnJheVtpXTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBOb2RlID09IHRoaXMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSB0aGlzOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocENoaWxkVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcENoaWxkVmFsdWUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwQmluZE5vZGUgPSBHZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZiAocEJpbmROb2RlICYmIGJTeW5jRGF0YSkgew0KKyAgICAgICAgICAgICAgICAgICAgcEJpbmROb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5Ow0KKyAgICAgICAgICAgICAgICAgICAgcEJpbmROb2RlLT5HZXRCaW5kSXRlbXMobm9kZUFycmF5KTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBub2RlQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTm9kZSA9PSB0aGlzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBCaW5kTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6IHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICAgICAgICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgICAgICAgICAgICAgIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzQ29udGVudFR5cGUgPSBGWF9XU1RSQyhMIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBDb250ZW50UmF3RGF0YU5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgIGlmICghcENvbnRlbnRSYXdEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZSA9IENyZWF0ZVNhbWVQYWNrZXROb2RlKCh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC94bWwiKSkpID8gWEZBX0VMRU1FTlRfU2hhcnB4bWwgOiBYRkFfRUxFTUVOVF9TaGFycHRleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgSW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQorICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlOg0KKyAgICAgICAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZVY6DQorICAgICAgICAgICAgcE5vZGUgPSB0aGlzOw0KKyAgICAgICAgICAgIGlmIChiU3luY0RhdGEgJiYgR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgIGlmIChwUGFyZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKHBQYXJlbnQgJiYgcFBhcmVudC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmVudCAmJiBwUGFyZW50LT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBCaW5kTm9kZSA9IHBQYXJlbnQtPkdldEJpbmREYXRhKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBCaW5kTm9kZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmluZE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgICAgICAgICAgIHBCaW5kTm9kZSA9IHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwTm9kZSkgew0KKyAgICAgICAgU2V0QXR0cmlidXRlVmFsdWUod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5KTsNCisgICAgICAgIGlmIChwQmluZE5vZGUgJiYgYlN5bmNEYXRhKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5Ow0KKyAgICAgICAgICAgIHBCaW5kTm9kZS0+R2V0QmluZEl0ZW1zKG5vZGVBcnJheSk7DQorICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KKyAgICAgICAgICAgICAgICBwTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSwgRlhfQk9PTCBiU3luY0RhdGEpDQorew0KKyAgICByZXR1cm4gU2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTm9kZTo6R2V0U2NyaXB0Q29udGVudChGWF9CT09MIGJTY3JpcHRNb2RpZnkpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgIHJldHVybiBUcnlDb250ZW50KHdzQ29udGVudCwgYlNjcmlwdE1vZGlmeSkgPyB3c0NvbnRlbnQgOiBDRlhfV2lkZVN0cmluZygpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGU6OkdldENvbnRlbnQoKQ0KK3sNCisgICAgcmV0dXJuICBHZXRTY3JpcHRDb250ZW50KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSwgRlhfQk9PTCBiUHJvdG8pDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgc3dpdGNoIChHZXRPYmplY3RUeXBlKCkpIHsNCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZToNCisgICAgICAgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgICAgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmICghcFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRWYWx1ZSA9IHBWYWx1ZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgICBpZiAocENoaWxkVmFsdWUgJiYgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3godGhpcykpIHsNCisgICAgICAgICAgICAgICAgICAgIHBDaGlsZFZhbHVlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gcENoaWxkVmFsdWUgPyBwQ2hpbGRWYWx1ZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQsIGJTY3JpcHRNb2RpZnksIGJQcm90bykgOiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOiB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcENvbnRlbnRSYXdEYXRhTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB0ZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweEhUTUw7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC94bWwiKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweG1sOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUgPSBDcmVhdGVTYW1lUGFja2V0Tm9kZShlbGVtZW50KTsNCisgICAgICAgICAgICAgICAgICAgIEluc2VydENoaWxkKHBDb250ZW50UmF3RGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBwQ29udGVudFJhd0RhdGFOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCwgYlNjcmlwdE1vZGlmeSwgYlByb3RvKTsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVDOg0KKyAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjoNCisgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgICAgICAgICAgcE5vZGUgPSB0aGlzOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwTm9kZSkgew0KKyAgICAgICAgaWYgKGJTY3JpcHRNb2RpZnkpIHsNCisgICAgICAgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgICAgICAgICBpZiAocFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+QWRkTm9kZXNPZlJ1blNjcmlwdCh0aGlzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb250ZW50LCBGQUxTRSwgYlByb3RvKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRNb2RlbE5vZGUoKQ0KK3sNCisgICAgc3dpdGNoKEdldFBhY2tldElEKCkpIHsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YRFA6DQorICAgICAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50LT5HZXRSb290KCk7DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfQ29uZmlnOg0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29uZmlnKTsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZToNCisgICAgICAgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKTsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOg0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRGF0YXNldHM6DQorICAgICAgICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0Og0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfTG9jYWxlU2V0KTsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0Og0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29ubmVjdGlvblNldCk7DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0Og0KKyAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfU291cmNlU2V0KTsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YZGM6DQorICAgICAgICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9YZGMpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5TmFtZXNwYWNlKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSkNCit7DQorICAgIHdzTmFtZXNwYWNlLkVtcHR5KCk7DQorICAgIGlmKHRoaXMtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGUgfHwgdGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhY2tldCkgew0KKyAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBpZighcFhNTE5vZGUgfHwgcFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2UgaWYodGhpcy0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gdGhpcy0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIGlmKCFwWE1MTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHBYTUxOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSAmJiB0aGlzLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09IFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcigoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSwgdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSwgd3NOYW1lc3BhY2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwTW9kZWxOb2RlID0gR2V0TW9kZWxOb2RlKCk7DQorICAgICAgICByZXR1cm4gcE1vZGVsTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKTsNCisgICAgfQ0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0UHJvcGVydHkoRlhfSU5UMzIgaW5kZXgsIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwgRlhfQk9PTCBiQ3JlYXRlUHJvcGVydHkgICkNCit7DQorICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50ID0gR2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9EV09SRCBkd1BhY2tldCA9IEdldFBhY2tldElEKCk7DQorICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydHkgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoZUVsZW1lbnQsIGVQcm9wZXJ0eSwgZHdQYWNrZXQpOw0KKyAgICBpZiAocFByb3BlcnR5ID09IE5VTEwgfHwgaW5kZXggPj0gcFByb3BlcnR5LT51T2NjdXIpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSAqcE5vZGUgPSBtX3BDaGlsZDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgZm9yKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVQcm9wZXJ0eSkgew0KKyAgICAgICAgICAgIGlDb3VudCArKzsNCisgICAgICAgICAgICBpZiAoaUNvdW50ID4gaW5kZXgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJDcmVhdGVQcm9wZXJ0eSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKHBQcm9wZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikgew0KKyAgICAgICAgcE5vZGUgPSBtX3BDaGlsZDsNCisgICAgICAgIGZvcig7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBFeGlzdFByb3RlcnR5ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KGVFbGVtZW50LCBwTm9kZS0+R2V0Q2xhc3NJRCgpLCBkd1BhY2tldCk7DQorICAgICAgICAgICAgaWYgKHBFeGlzdFByb3RlcnR5ICYmIChwRXhpc3RQcm90ZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKTsNCisgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKGR3UGFja2V0KTsNCisgICAgQ1hGQV9Ob2RlICpwTmV3Tm9kZTsNCisgICAgZm9yICg7IGlDb3VudCA8PSBpbmRleCA7IGlDb3VudCArKykgew0KKyAgICAgICAgcE5ld05vZGUgPSBwRmFjdG9yeS0+Q3JlYXRlTm9kZShwUGFja2V0LCBlUHJvcGVydHkpOw0KKyAgICAgICAgaWYoIXBOZXdOb2RlKSB7DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQorICAgICAgICBwTmV3Tm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICB9DQorICAgIHJldHVybiBwTmV3Tm9kZTsNCit9DQorRlhfSU5UMzIgQ1hGQV9Ob2RlOjpDb3VudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9CT09MIGJPbmx5Q2hpbGQpDQorew0KKyAgICBDWEZBX05vZGUgKnBOb2RlID0gbV9wQ2hpbGQ7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIGZvcig7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudCB8fCBlRWxlbWVudCA9PSAgWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICAgICAgICAgIGlmKGJPbmx5Q2hpbGQpIHsNCisgICAgICAgICAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KEdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgICAgICAgICAgICAgaWYocFByb3BlcnQpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlDb3VudCArKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gaUNvdW50Ow0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Q2hpbGQoRlhfSU5UMzIgaW5kZXgsIFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9CT09MIGJPbmx5Q2hpbGQpDQorew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSk7DQorICAgIENYRkFfTm9kZSAqcE5vZGUgPSBtX3BDaGlsZDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgZm9yKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50IHx8IGVFbGVtZW50ID09ICBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgICAgICAgICAgaWYoYk9ubHlDaGlsZCkgew0KKyAgICAgICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoR2V0Q2xhc3NJRCgpLCBwTm9kZS0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KKyAgICAgICAgICAgICAgICBpZihwUHJvcGVydCkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUNvdW50ICsrOw0KKyAgICAgICAgICAgIGlmIChpQ291bnQgPiBpbmRleCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDWEZBX05vZGU6Okluc2VydENoaWxkKEZYX0lOVDMyIGluZGV4LCBDWEZBX05vZGUgKnBOb2RlKQ0KK3sNCisgICAgQVNTRVJUKHBOb2RlICE9IE5VTEwgJiYgcE5vZGUtPm1fcE5leHQgPT0gTlVMTCk7DQorICAgIHBOb2RlLT5tX3BQYXJlbnQgPSB0aGlzOw0KKyAgICBGWF9CT09MIGJXYXNQdXJnZU5vZGUgPSBtX3BEb2N1bWVudC0+UmVtb3ZlUHVyZ2VOb2RlKHBOb2RlKTsNCisgICAgRlhTWVNfYXNzZXJ0KGJXYXNQdXJnZU5vZGUgPT0gVFJVRSk7DQorICAgIGlmIChtX3BDaGlsZCA9PSBOVUxMIHx8IGluZGV4ID09IDApIHsNCisgICAgICAgIGlmIChpbmRleCA+IDApIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcENoaWxkOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBwTm9kZTsNCisgICAgICAgIGluZGV4ID0gMDsNCisgICAgfSBlbHNlIGlmIChpbmRleCA8IDApIHsNCisgICAgICAgIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwUHJldiA9IG1fcENoaWxkOw0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgICAgIHdoaWxlICgrK2lDb3VudCAhPSBpbmRleCAmJiBwUHJldi0+bV9wTmV4dCkgew0KKyAgICAgICAgICAgIHBQcmV2ID0gcFByZXYtPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4ICE9IGlDb3VudCkgew0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gcFByZXYtPm1fcE5leHQ7DQorICAgICAgICBwUHJldi0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgICAgICAgaW5kZXggPSBpQ291bnQ7DQorICAgIH0NCisgICAgaWYgKHBOb2RlLT5tX3BOZXh0ID09IE5VTEwpIHsNCisgICAgICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlOw0KKyAgICB9DQorICAgIEFTU0VSVChtX3BMYXN0Q2hpbGQgIT0gTlVMTCAmJiBtX3BMYXN0Q2hpbGQtPm1fcE5leHQgPT0gTlVMTCk7DQorICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkLCBGQUxTRSk7DQorICAgIElYRkFfTm90aWZ5ICpwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKHBOb3RpZnkpIHsNCisgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfQ2hpbGRBZGRlZCwgcE5vZGUpOw0KKyAgICB9DQorICAgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgcE5vZGUtPm1fcFhNTE5vZGUpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+bV9wWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpID09IE5VTEwpOw0KKyAgICAgICAgbV9wWE1MTm9kZS0+SW5zZXJ0Q2hpbGROb2RlKHBOb2RlLT5tX3BYTUxOb2RlLCBpbmRleCk7DQorICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gaW5kZXg7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpJbnNlcnRDaGlsZChDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBCZWZvcmVOb2RlKQ0KK3sNCisgICAgaWYgKCFwTm9kZSB8fCBwTm9kZS0+bV9wUGFyZW50ICE9IE5VTEwgfHwgKHBCZWZvcmVOb2RlICYmIHBCZWZvcmVOb2RlLT5tX3BQYXJlbnQgIT0gdGhpcykpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiV2FzUHVyZ2VOb2RlID0gbV9wRG9jdW1lbnQtPlJlbW92ZVB1cmdlTm9kZShwTm9kZSk7DQorICAgIEZYU1lTX2Fzc2VydChiV2FzUHVyZ2VOb2RlID09IFRSVUUpOw0KKyAgICBGWF9JTlQzMiBuSW5kZXggPSAtMTsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IHRoaXM7DQorICAgIGlmIChtX3BDaGlsZCA9PSBOVUxMIHx8IHBCZWZvcmVOb2RlID09IG1fcENoaWxkKSB7DQorICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcENoaWxkOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBwTm9kZTsNCisgICAgICAgIG5JbmRleCA9IDA7DQorICAgIH0gZWxzZSBpZiAoIXBCZWZvcmVOb2RlKSB7DQorICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcExhc3RDaGlsZC0+bV9wTmV4dDsNCisgICAgICAgIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbkluZGV4ID0gMTsNCisgICAgICAgIENYRkFfTm9kZSAqcFByZXYgPSBtX3BDaGlsZDsNCisgICAgICAgIHdoaWxlIChwUHJldi0+bV9wTmV4dCAhPSBwQmVmb3JlTm9kZSkgew0KKyAgICAgICAgICAgIHBQcmV2ID0gcFByZXYtPm1fcE5leHQ7DQorICAgICAgICAgICAgbkluZGV4Kys7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IHBQcmV2LT5tX3BOZXh0Ow0KKyAgICAgICAgcFByZXYtPm1fcE5leHQgPSBwTm9kZTsNCisgICAgfQ0KKyAgICBpZiAocE5vZGUtPm1fcE5leHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wTGFzdENoaWxkID0gcE5vZGU7DQorICAgIH0NCisgICAgQVNTRVJUKG1fcExhc3RDaGlsZCAhPSBOVUxMICYmIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9PSBOVUxMKTsNCisgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQsIEZBTFNFKTsNCisgICAgSVhGQV9Ob3RpZnkgKnBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9DaGlsZEFkZGVkLCBwTm9kZSk7DQorICAgIH0NCisgICAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSAmJiBwTm9kZS0+bV9wWE1MTm9kZSkgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBOb2RlLT5tX3BYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCkgPT0gTlVMTCk7DQorICAgICAgICBtX3BYTUxOb2RlLT5JbnNlcnRDaGlsZE5vZGUocE5vZGUtPm1fcFhNTE5vZGUsIG5JbmRleCk7DQorICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkRlcHJlY2F0ZWRfR2V0UHJldlNpYmxpbmcoKQ0KK3sNCisgICAgaWYoIW1fcFBhcmVudCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZm9yIChDWEZBX05vZGUgKnBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsgcFNpYmxpbmc7IHBTaWJsaW5nID0gcFNpYmxpbmctPm1fcE5leHQpIHsNCisgICAgICAgIGlmKHBTaWJsaW5nLT5tX3BOZXh0ID09IHRoaXMpIHsNCisgICAgICAgICAgICByZXR1cm4gcFNpYmxpbmc7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpSZW1vdmVDaGlsZChDWEZBX05vZGUgKnBOb2RlLCBGWF9CT09MIGJOb3RpZnkpDQorew0KKyAgICBpZiAocE5vZGUgPT0gTlVMTCB8fCBwTm9kZS0+bV9wUGFyZW50ICE9IHRoaXMpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fcENoaWxkID09IHBOb2RlKSB7DQorICAgICAgICBtX3BDaGlsZCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgaWYgKG1fcExhc3RDaGlsZCA9PSBwTm9kZSkgew0KKyAgICAgICAgICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KKyAgICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX05vZGUgKnBQcmV2ID0gcE5vZGUtPkRlcHJlY2F0ZWRfR2V0UHJldlNpYmxpbmcoKTsNCisgICAgICAgIHBQcmV2LT5tX3BOZXh0ID0gcE5vZGUtPm1fcE5leHQ7DQorICAgICAgICBpZiAobV9wTGFzdENoaWxkID09IHBOb2RlKSB7DQorICAgICAgICAgICAgbV9wTGFzdENoaWxkID0gcE5vZGUtPm1fcE5leHQgPyBwTm9kZS0+bV9wTmV4dCA6IHBQcmV2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KKyAgICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIH0NCisgICAgQVNTRVJUKG1fcExhc3RDaGlsZCA9PSBOVUxMIHx8IG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9PSBOVUxMKTsNCisgICAgT25SZW1vdmVkKHRoaXMsIHBOb2RlLCBiTm90aWZ5KTsNCisgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpOw0KKyAgICBtX3BEb2N1bWVudC0+QWRkUHVyZ2VOb2RlKHBOb2RlKTsNCisgICAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSAmJiBwTm9kZS0+bV9wWE1MTm9kZSkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5Jc0F0dHJpYnV0ZUluWE1MKCkpIHsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQocE5vZGUtPm1fcFhNTE5vZGUgPT0gbV9wWE1MTm9kZSAmJiBtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgICAgICAgICAgaWYgKHBOb2RlLT5tX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopKHBOb2RlLT5tX3BYTUxOb2RlKTsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQXR0cmlidXRlTmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUpOw0KKyAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKHdzQXR0cmlidXRlTmFtZS5HZXRQdHIoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgICAgICAgICBwTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBGQUxTRSk7DQorICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwTmV3WE1MRWxlbWVudCA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKHdzTmFtZSk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCisgICAgICAgICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIHBOZXdYTUxFbGVtZW50LT5TZXRUZXh0RGF0YSh3c1ZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vZGUtPm1fcFhNTE5vZGUgPSBwTmV3WE1MRWxlbWVudDsNCisgICAgICAgICAgICBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9wWE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBOb2RlLT5tX3BYTUxOb2RlKTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlOYW1lKEZYX1dTVFIgd3NOYW1lKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEdldEZpcnN0Q2hpbGRCeU5hbWUod3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSkpOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Rmlyc3RDaGlsZEJ5TmFtZShGWF9EV09SRCBkd05hbWVIYXNoKSBjb25zdA0KK3sNCisgICAgZm9yKENYRkFfTm9kZSogcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZihwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBkd05hbWVIYXNoKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlQgZUVsZW1lbnQpIGNvbnN0DQorew0KKyAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gZUVsZW1lbnQpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROZXh0U2FtZU5hbWVTaWJsaW5nKEZYX0RXT1JEIGR3TmFtZUhhc2gpIGNvbnN0DQorew0KKyAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZihwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBkd05hbWVIYXNoKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TmV4dFNhbWVOYW1lU2libGluZyhGWF9XU1RSIHdzTm9kZU5hbWUpIGNvbnN0DQorew0KKyAgICByZXR1cm4gR2V0TmV4dFNhbWVOYW1lU2libGluZyh3c05vZGVOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05vZGVOYW1lLkdldFB0cigpLCB3c05vZGVOYW1lLkdldExlbmd0aCgpKSk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVCBlRWxlbWVudCkgY29uc3QNCit7DQorICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gZUVsZW1lbnQpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0lOVDMyIENYRkFfTm9kZTo6R2V0Tm9kZVNhbWVOYW1lSW5kZXgoKSBjb25zdA0KK3sNCisgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldEluZGV4QnlOYW1lKChDWEZBX05vZGUqKXRoaXMpOw0KK30NCitGWF9JTlQzMiBDWEZBX05vZGU6OkdldE5vZGVTYW1lQ2xhc3NJbmRleCgpIGNvbnN0DQorew0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIHJldHVybiBwU2NyaXB0Q29udGV4dC0+R2V0SW5kZXhCeUNsYXNzTmFtZSgoQ1hGQV9Ob2RlKil0aGlzKTsNCit9DQordm9pZCBDWEZBX05vZGU6OkdldFNPTUV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcmIHdzU09NRXhwcmVzc2lvbikNCit7DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcFNjcmlwdENvbnRleHQtPkdldFNvbUV4cHJlc3Npb24odGhpcywgd3NTT01FeHByZXNzaW9uKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCkNCit7DQorICAgIENYRkFfTm9kZSogcEluc3RhbmNlTWdyID0gTlVMTDsNCisgICAgaWYgKG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmICghcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9BcmVhKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBJbnN0YW5jZU1ncjsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlICpwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZyk7IHBOb2RlICE9IE5VTEw7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZykpIHsNCisgICAgICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgaWYgKChlVHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpICYmIHBOb2RlLT5tX2R3TmFtZUhhc2ggIT0gbV9kd05hbWVIYXNoKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgICAgICAgICBpZiAod3NJbnN0TmFtZS5HZXRMZW5ndGgoKSA+IDAgJiYgd3NJbnN0TmFtZS5HZXRBdCgwKSA9PSAnXycgJiYgd3NJbnN0TmFtZS5NaWQoMSkgPT0gd3NOYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VNZ3IgPSBwTm9kZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBJbnN0YW5jZU1ncjsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE9jY3VyTm9kZSgpDQorew0KKyAgICByZXR1cm4gR2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6SGFzRmxhZyhGWF9EV09SRCBkd0ZsYWcpIGNvbnN0DQorew0KKyAgICBpZiAobV91RmxhZ3MgJiBkd0ZsYWcpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHN3aXRjaCAoZHdGbGFnKSB7DQorICAgICAgICBjYXNlIFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkOg0KKyAgICAgICAgICAgIHJldHVybiBtX3BQYXJlbnQgJiYgbV9wUGFyZW50LT5IYXNGbGFnKGR3RmxhZyk7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiAsIEZYX0JPT0wgYk5vdGlmeSApDQorew0KKyAgICBpZiAoYk9uKSB7DQorICAgICAgICBzd2l0Y2ggKGR3RmxhZykgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX05PREVGTEFHX0luaXRpYWxpemVkOg0KKyAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiAhSGFzRmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpKSB7DQorICAgICAgICAgICAgICAgICAgICBJWEZBX05vdGlmeSAqcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfUmVhZHkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV91RmxhZ3MgfD0gZHdGbGFnOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbV91RmxhZ3MgJj0gfmR3RmxhZzsNCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6SXNBdHRyaWJ1dGVJblhNTCgpDQorew0KKyAgICByZXR1cm4gR2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YTsNCit9DQordm9pZCBDWEZBX05vZGU6Ok9uUmVtb3ZlZChDWEZBX05vZGUgKnBQYXJlbnQsIENYRkFfTm9kZSAqcFJlbW92ZWQsIEZYX0JPT0wgYk5vdGlmeSkNCit7DQorICAgIGlmIChiTm90aWZ5ICYmIChwUGFyZW50ICE9IE5VTEwpKSB7DQorICAgICAgICBJWEZBX05vdGlmeSAqcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHBQYXJlbnQsIFhGQV9OT0RFRVZFTlRfQ2hpbGRSZW1vdmVkLCBwUmVtb3ZlZCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX05vZGU6Ok9uQ2hhbmdpbmcoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfTFBWT0lEIHBOZXdWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQ0KK3sNCisgICAgaWYgKGJOb3RpZnkgJiYgSGFzRmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpKSB7DQorICAgICAgICBJWEZBX05vdGlmeSAqcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2luZywgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUillQXR0ciwgcE5ld1ZhbHVlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6T25DaGFuZ2VkKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0xQVk9JRCBwTmV3VmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KQ0KK3sNCisgICAgaWYgKGJOb3RpZnkgJiYgSGFzRmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpKSB7DQorICAgICAgICBTY3JpcHRfQXR0cmlidXRlX1NlbmRBdHRyaWJ1dGVDaGFuZ2VNZXNzYWdlKChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpZUF0dHIsIHBOZXdWYWx1ZSwgYlNjcmlwdE1vZGlmeSk7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ1hGQV9Ob2RlOjpleGVjU2luZ2xlRXZlbnRCeU5hbWUoRlhfV1NUUiB3c0V2ZW50TmFtZSwgWEZBX0VMRU1FTlQgZUVsZW1lbnRUeXBlKQ0KK3sNCisgICAgRlhfSU5UMzIgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICBjb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8qIGV2ZW50UGFyYUluZm8gPSBHZXRFdmVudFBhcmFJbmZvQnlOYW1lKHdzRXZlbnROYW1lKTsNCisgICAgaWYgKGV2ZW50UGFyYUluZm8pIHsNCisgICAgICAgIEZYX1VJTlQzMiB2YWxpZEZsYWdzID0gZXZlbnRQYXJhSW5mby0+bV92YWxpZEZsYWdzOw0KKyAgICAgICAgSVhGQV9Ob3RpZnkgKiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHZhbGlkRmxhZ3MgPT0gMSkgew0KKyAgICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSk7DQorICAgICAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gMikgew0KKyAgICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSAzKSB7DQorICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gNCkgew0KKyAgICAgICAgICAgIGlmIChlRWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwIHx8IGVFbGVtZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBQYXJlbnROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgICAgICAgIGlmIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gNSkgew0KKyAgICAgICAgICAgIGlmIChlRWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA2KSB7DQorICAgICAgICAgICAgQ1hGQV9XaWRnZXREYXRhICogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgICAgICAgaWYgKHBXaWRnZXREYXRhKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqIHBVSU5vZGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOw0KKyAgICAgICAgICAgICAgICBpZiAocFVJTm9kZS0+bV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX1NpZ25hdHVyZSkgew0KKyAgICAgICAgICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDcpIHsNCisgICAgICAgICAgICBDWEZBX1dpZGdldERhdGEgKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgICAgICAgICBpZiAocFdpZGdldERhdGEpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICogcFVJTm9kZSA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7DQorICAgICAgICAgICAgICAgIGlmICgocFVJTm9kZS0+bV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpICYmICghcFdpZGdldERhdGEtPklzTGlzdEJveCgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUmV0Ow0KK30NCit2b2lkIENYRkFfTm9kZTo6VXBkYXRlTmFtZUhhc2goKQ0KK3sNCisgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcE5vdHN1cmUgPSBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShHZXRDbGFzc0lEKCksIFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgIGlmKCFwTm90c3VyZSB8fCBwTm90c3VyZS0+ZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgbV9kd05hbWVIYXNoID0gd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIH0gZWxzZSBpZiAocE5vdHN1cmUtPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX0VudW0pIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoR2V0RW51bShYRkFfQVRUUklCVVRFX05hbWUpKS0+cE5hbWU7DQorICAgICAgICBtX2R3TmFtZUhhc2ggPSB3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgICAgfQ0KK30NCitJRkRFX1hNTE5vZGUqIENYRkFfTm9kZTo6Q3JlYXRlWE1MTWFwcGluZ05vZGUoKQ0KK3sNCisgICAgaWYgKCFtX3BYTUxOb2RlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYWcgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgbV9wWE1MTm9kZSA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKHdzVGFnKTsNCisgICAgICAgIFNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wWE1MTm9kZTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OklzTmVlZFNhdmluZ1hNTE5vZGUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcFhNTE5vZGUgJiYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8fCBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfWGZhICk7DQorfQ0KK1hGQV9MUE1BUE1PRFVMRURBVEEJQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVEYXRhKEZYX0JPT0wgYkNyZWF0ZU5ldykNCit7DQorICAgIGlmICghbV9wTWFwTW9kdWxlRGF0YSAmJiBiQ3JlYXRlTmV3KSB7DQorICAgICAgICBtX3BNYXBNb2R1bGVEYXRhID0gRlhfTkVXIFhGQV9NQVBNT0RVTEVEQVRBOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BNYXBNb2R1bGVEYXRhOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlVmFsdWUoRlhfTFBWT0lEIHBLZXksIEZYX0xQVk9JRCBwVmFsdWUpDQorew0KKyAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgICBpZiAoIXBNb3VkbGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTW91ZGxlLT5tX1ZhbHVlTWFwLlNldEF0KHBLZXksIHBWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVWYWx1ZShGWF9MUFZPSUQgcEtleSwgRlhfTFBWT0lEICZwVmFsdWUpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gdGhpczsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQorICAgICAgICBpZiAocE1vdWRsZSAmJiBwTW91ZGxlLT5tX1ZhbHVlTWFwLkxvb2t1cChwS2V5LCBwVmFsdWUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXRQYWNrZXRJRCgpICE9IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgPyBwTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNldE1hcE1vZHVsZVN0cmluZyhGWF9MUFZPSUQgcEtleSwgRlhfV1NUUiB3c1ZhbHVlKQ0KK3sNCisgICAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIChGWF9MUFZPSUQpd3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0TWFwTW9kdWxlU3RyaW5nKEZYX0xQVk9JRCBwS2V5LCBDRlhfV2lkZVN0cmluZ0MgJndzVmFsdWUpDQorew0KKyAgICBGWF9MUFZPSUQgcFZhbHVlOw0KKyAgICBGWF9JTlQzMiBpQnl0ZXM7DQorICAgIGlmICghR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBWYWx1ZSwgaUJ5dGVzKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0MoKEZYX0xQQ1dTVFIpcFZhbHVlLCBpQnl0ZXMgLyBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTZXRNYXBNb2R1bGVCdWZmZXIoRlhfTFBWT0lEIHBLZXksIEZYX0xQVk9JRCBwVmFsdWUsIEZYX0lOVDMyIGlCeXRlcywgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyApDQorew0KKyAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgICBpZiAoIXBNb3VkbGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfTFBNQVBEQVRBQkxPQ0sgJnBCdWZmZXIgPSBwTW91ZGxlLT5tX0J1ZmZlck1hcFtwS2V5XTsNCisgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgew0KKyAgICAgICAgcEJ1ZmZlciA9IChYRkFfTFBNQVBEQVRBQkxPQ0spRlhfQWxsb2MoRlhfQllURSwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgaUJ5dGVzKTsNCisgICAgfSBlbHNlIGlmIChwQnVmZmVyLT5pQnl0ZXMgIT0gaUJ5dGVzKSB7DQorICAgICAgICBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgICB9DQorICAgICAgICBwQnVmZmVyID0gKFhGQV9MUE1BUERBVEFCTE9DSylGWF9SZWFsbG9jKEZYX0JZVEUsIHBCdWZmZXIsIHNpemVvZihYRkFfTUFQREFUQUJMT0NLKSArIGlCeXRlcyk7DQorICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgfQ0KKyAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mbyA9IHBDYWxsYmFja0luZm87DQorICAgIHBCdWZmZXItPmlCeXRlcyA9IGlCeXRlczsNCisgICAgRlhTWVNfbWVtY3B5KHBCdWZmZXItPkdldERhdGEoKSwgcFZhbHVlLCBpQnl0ZXMpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0TWFwTW9kdWxlQnVmZmVyKEZYX0xQVk9JRCBwS2V5LCBGWF9MUFZPSUQgJnBWYWx1ZSwgRlhfSU5UMzIgJmlCeXRlcywgRlhfQk9PTCBiUHJvdG9BbHNvKQ0KK3sNCisgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBCdWZmZXIgPSBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gdGhpczsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQorICAgICAgICBpZiAocE1vdWRsZSAmJiBwTW91ZGxlLT5tX0J1ZmZlck1hcC5Mb29rdXAocEtleSwgcEJ1ZmZlcikpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlID0gKGJQcm90b0Fsc28gJiYgcE5vZGUtPkdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgPyBwTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBwVmFsdWUgPSBwQnVmZmVyLT5HZXREYXRhKCk7DQorICAgIGlCeXRlcyA9IHBCdWZmZXItPmlCeXRlczsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNNYXBNb2R1bGVLZXkoRlhfTFBWT0lEIHBLZXksIEZYX0JPT0wgYlByb3RvQWxzbykNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSB0aGlzOw0KKyAgICB3aGlsZSAocE5vZGUpIHsNCisgICAgICAgIEZYX0xQVk9JRCBwVmFsOw0KKyAgICAgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gcE5vZGUtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgICAgICAgaWYgKHBNb3VkbGUgJiYgKHBNb3VkbGUtPm1fVmFsdWVNYXAuTG9va3VwKHBLZXksIHBWYWwpIHx8IHBNb3VkbGUtPm1fQnVmZmVyTWFwLkxvb2t1cChwS2V5LCAoWEZBX0xQTUFQREFUQUJMT0NLJilwVmFsKSkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlID0gKGJQcm90b0Fsc28gJiYgcE5vZGUtPkdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgPyBwTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX05vZGU6OlJlbW92ZU1hcE1vZHVsZUtleShGWF9MUFZPSUQgcEtleSApDQorew0KKyAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKEZBTFNFKTsNCisgICAgaWYgKCFwTW91ZGxlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBLZXkpIHsNCisgICAgICAgIFhGQV9MUE1BUERBVEFCTE9DSyBwQnVmZmVyID0gTlVMTDsNCisgICAgICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLkxvb2t1cChwS2V5LCBwQnVmZmVyKTsNCisgICAgICAgIGlmIChwQnVmZmVyKSB7DQorICAgICAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsNCisgICAgICAgIH0NCisgICAgICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgICAgIHBNb3VkbGUtPm1fVmFsdWVNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBCdWZmZXI7DQorICAgICAgICBGWF9QT1NJVElPTiBwb3NCdWZmZXIgPSBwTW91ZGxlLT5tX0J1ZmZlck1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgICB3aGlsZSAocG9zQnVmZmVyKSB7DQorICAgICAgICAgICAgcE1vdWRsZS0+bV9CdWZmZXJNYXAuR2V0TmV4dEFzc29jKHBvc0J1ZmZlciwgcEtleSwgcEJ1ZmZlcik7DQorICAgICAgICAgICAgaWYgKHBCdWZmZXIpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgICAgICAgICAgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5SZW1vdmVBbGwoKTsNCisgICAgICAgIHBNb3VkbGUtPm1fVmFsdWVNYXAuUmVtb3ZlQWxsKCk7DQorICAgICAgICBpZiAocE1vdWRsZSkgew0KKyAgICAgICAgICAgIGRlbGV0ZSBwTW91ZGxlOw0KKyAgICAgICAgICAgIHBNb3VkbGUgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpNZXJnZUFsbERhdGEoRlhfTFBWT0lEIHBEc3RNb2R1bGUsIEZYX0JPT0wgYlVzZVNyY0F0dHIgKQ0KK3sNCisgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwRHN0TW9kdWxlRGF0YSA9ICgoQ1hGQV9Ob2RlKilwRHN0TW9kdWxlKS0+R2V0TWFwTW9kdWxlRGF0YShUUlVFKTsNCisgICAgaWYgKCFwRHN0TW9kdWxlRGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9MUE1BUE1PRFVMRURBVEEgcFNyY01vZHVsZURhdGEgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKEZBTFNFKTsNCisgICAgaWYgKCFwU3JjTW9kdWxlRGF0YSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX1BPU0lUSU9OIHBzVmFsdWUgPSBwU3JjTW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwc1ZhbHVlKSB7DQorICAgICAgICBGWF9MUFZPSUQgcEtleTsNCisgICAgICAgIEZYX0xQVk9JRCBwVmFsdWU7DQorICAgICAgICBwU3JjTW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5HZXROZXh0QXNzb2MocHNWYWx1ZSwgcEtleSwgcFZhbHVlKTsNCisgICAgICAgIGlmIChiVXNlU3JjQXR0ciB8fCAhcERzdE1vZHVsZURhdGEtPm1fVmFsdWVNYXAuR2V0VmFsdWVBdChwS2V5KSkgew0KKyAgICAgICAgICAgIHBEc3RNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwLlNldEF0KHBLZXksIHBWYWx1ZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgRlhfUE9TSVRJT04gcHNCdWZmZXIgPSBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHNCdWZmZXIpIHsNCisgICAgICAgIEZYX0xQVk9JRCBwS2V5Ow0KKyAgICAgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBTcmNCdWZmZXI7DQorICAgICAgICBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuR2V0TmV4dEFzc29jKHBzQnVmZmVyLCBwS2V5LCBwU3JjQnVmZmVyKTsNCisgICAgICAgIFhGQV9MUE1BUERBVEFCTE9DSyAmcEJ1ZmZlciA9IHBEc3RNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcFtwS2V5XTsNCisgICAgICAgIGlmIChwQnVmZmVyICYmICFiVXNlU3JjQXR0cikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBTcmNCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUgJiYgIXBTcmNCdWZmZXItPnBDYWxsYmFja0luZm8tPnBDb3B5KSB7DQorICAgICAgICAgICAgaWYgKHBCdWZmZXIpIHsNCisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgICAgICAgICAgICAgcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcEJ1ZmZlciA9IChYRkFfTFBNQVBEQVRBQkxPQ0spRlhfQWxsb2MoRlhfQllURSwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgcFNyY0J1ZmZlci0+aUJ5dGVzKTsNCisgICAgICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+aUJ5dGVzICE9IHBTcmNCdWZmZXItPmlCeXRlcykgew0KKyAgICAgICAgICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKSB7DQorICAgICAgICAgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBCdWZmZXIgPSAoWEZBX0xQTUFQREFUQUJMT0NLKUZYX1JlYWxsb2MoRlhfQllURSwgcEJ1ZmZlciwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgcFNyY0J1ZmZlci0+aUJ5dGVzKTsNCisgICAgICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvID0gcFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mbzsNCisgICAgICAgIHBCdWZmZXItPmlCeXRlcyA9IHBTcmNCdWZmZXItPmlCeXRlczsNCisgICAgICAgIEZYU1lTX21lbWNweShwQnVmZmVyLT5HZXREYXRhKCksIHBTcmNCdWZmZXItPkdldERhdGEoKSwgcFNyY0J1ZmZlci0+aUJ5dGVzKTsNCisgICAgICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBDb3B5KSB7DQorICAgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6TW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9Ob2RlKiBwRHN0TW9kdWxlLCBGWF9MUFZPSUQgcEtleSkNCit7DQorICAgIGlmICghcERzdE1vZHVsZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYk5lZWRNb3ZlID0gVFJVRTsNCisgICAgaWYgKCFwS2V5KSB7DQorICAgICAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocERzdE1vZHVsZS0+R2V0Q2xhc3NJRCgpICE9IHRoaXMtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgYk5lZWRNb3ZlID0gRkFMU0U7DQorICAgIH0NCisgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwU3JjTW9kdWxlRGF0YSA9IE5VTEw7DQorICAgIFhGQV9MUE1BUE1PRFVMRURBVEEgcERzdE1vZHVsZURhdGEgPSBOVUxMOw0KKyAgICBpZiAoYk5lZWRNb3ZlKSB7DQorICAgICAgICBwU3JjTW9kdWxlRGF0YSA9IHRoaXMtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgICAgICAgaWYgKCFwU3JjTW9kdWxlRGF0YSkgew0KKyAgICAgICAgICAgIGJOZWVkTW92ZSA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcERzdE1vZHVsZURhdGEgPSBwRHN0TW9kdWxlLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgICAgICAgaWYgKCFwRHN0TW9kdWxlRGF0YSkgew0KKyAgICAgICAgICAgIGJOZWVkTW92ZSA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiTmVlZE1vdmUpIHsNCisgICAgICAgIEZYX0xQVk9JRCBwQnVmZmVyQmxvY2tEYXRhID0gcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwLkdldFZhbHVlQXQocEtleSk7DQorICAgICAgICBpZiAocEJ1ZmZlckJsb2NrRGF0YSkgew0KKyAgICAgICAgICAgIHBTcmNNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5SZW1vdmVLZXkocEtleSk7DQorICAgICAgICAgICAgcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgICAgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuU2V0QXQocEtleSwgKFhGQV9MUE1BUERBVEFCTE9DSylwQnVmZmVyQmxvY2tEYXRhKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocERzdE1vZHVsZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX05vZGVWKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gcERzdE1vZHVsZS0+R2V0U2NyaXB0Q29udGVudChGQUxTRSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVmFsdWUpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IHBEc3RNb2R1bGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBwRHN0TW9kdWxlLT5TZXRTY3JpcHRDb250ZW50KHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBTcmNNb2R1bGUsIENYRkFfTm9kZSogcERzdE1vZHVsZSwgRlhfTFBWT0lEIHBLZXksIEZYX0JPT0wgYlJlY3Vyc2l2ZSApDQorew0KKyAgICBpZiAoIXBTcmNNb2R1bGUgfHwgIXBEc3RNb2R1bGUgfHwgIXBLZXkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU3JjQ2hpbGQgPSBwU3JjTW9kdWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBDWEZBX05vZGUqIHBEc3RDaGlsZCA9IHBEc3RNb2R1bGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGZvciAoIDsgcFNyY0NoaWxkICYmIHBEc3RDaGlsZDsgcFNyY0NoaWxkID0gcFNyY0NoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpLCBwRHN0Q2hpbGQgPSBwRHN0Q2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBNb3ZlQnVmZmVyTWFwRGF0YShwU3JjQ2hpbGQsIHBEc3RDaGlsZCwgcEtleSwgVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcFNyY01vZHVsZS0+TW92ZUJ1ZmZlck1hcERhdGEocERzdE1vZHVsZSwgcEtleSk7DQorfQ0KK0NYRkFfTm9kZUxpc3Q6OkNYRkFfTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IENYRkFfT2JqZWN0KHBEb2N1bWVudCwgWEZBX09CSkVDVFRZUEVfTm9kZUxpc3QpDQorew0KKyAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5DYWNoZUxpc3QodGhpcyk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlTGlzdDo6TmFtZWRJdGVtKEZYX1dTVFIgd3NOYW1lKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gR2V0TGVuZ3RoKCk7DQorICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiByZXQgPSBJdGVtKGkpOw0KKyAgICAgICAgaWYgKGR3SGFzaENvZGUgPT0gcmV0LT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIHJldDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQordm9pZAlDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0FwcGVuZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZihhcmdjID09IDEpIHsNCisgICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSAoQ1hGQV9Ob2RlICopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICAgICAgaWYocE5vZGUpIHsNCisgICAgICAgICAgICBBcHBlbmQocE5vZGUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImFwcGVuZCIpKTsNCisgICAgfQ0KK30NCit2b2lkCUNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmKGFyZ2MgPT0gMikgew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwTmV3Tm9kZSA9IChDWEZBX05vZGUgKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICAgICAgICBDWEZBX05vZGUgKnBCZWZvcmVOb2RlID0gKENYRkFfTm9kZSAqKXBBcmd1bWVudHMtPkdldE9iamVjdCgxKTsNCisgICAgICAgIGlmKHBOZXdOb2RlKSB7DQorICAgICAgICAgICAgSW5zZXJ0KHBOZXdOb2RlLCBwQmVmb3JlTm9kZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiaW5zZXJ0IikpOw0KKyAgICB9DQorfQ0KK3ZvaWQJQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19SZW1vdmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYoYXJnYyA9PSAxKSB7DQorICAgICAgICBDWEZBX05vZGUgKnBOb2RlID0gKENYRkFfTm9kZSAqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgICAgICAgIGlmKHBOb2RlKSB7DQorICAgICAgICAgICAgUmVtb3ZlKHBOb2RlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJyZW1vdmUiKSk7DQorICAgIH0NCit9DQordm9pZAlDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0l0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYoYXJnYyA9PSAxKSB7DQorICAgICAgICBGWF9JTlQzMiBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgICAgICAgIGlmKChpSW5kZXggPj0gMCkgJiYgKGlJbmRleCArIDEgPD0gR2V0TGVuZ3RoKCkpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKEl0ZW0oaUluZGV4KSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiaXRlbSIpKTsNCisgICAgfQ0KK30NCit2b2lkCUNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZihhcmdjID09IDEpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gTmFtZWRJdGVtKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwibmFtZWRJdGVtIikpOw0KKyAgICB9DQorfQ0KK3ZvaWQJQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYoIWJTZXR0aW5nKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgR2V0TGVuZ3RoKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgfQ0KK30NCitDWEZBX0FycmF5Tm9kZUxpc3Q6OkNYRkFfQXJyYXlOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogQ1hGQV9Ob2RlTGlzdChwRG9jdW1lbnQpDQorew0KK30NCit2b2lkIENYRkFfQXJyYXlOb2RlTGlzdDo6U2V0QXJyYXlOb2RlTGlzdChjb25zdCBDWEZBX05vZGVBcnJheSAmc3JjQXJyYXkpDQorew0KKyAgICBpZiAoc3JjQXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgbV9hcnJheS5Db3B5KHNyY0FycmF5KTsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDWEZBX0FycmF5Tm9kZUxpc3Q6OkdldExlbmd0aCgpDQorew0KKyAgICByZXR1cm4gbV9hcnJheS5HZXRTaXplKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BcnJheU5vZGVMaXN0OjpBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkNCit7DQorICAgIG1fYXJyYXkuQWRkKHBOb2RlKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BcnJheU5vZGVMaXN0OjpJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkNCit7DQorICAgIGlmIChwQmVmb3JlTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICBtX2FycmF5LkFkZChwTmV3Tm9kZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IG1fYXJyYXkuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgICAgICAgICBpZiAobV9hcnJheVtpXSA9PSBwQmVmb3JlTm9kZSkgew0KKyAgICAgICAgICAgICAgICBtX2FycmF5Lkluc2VydEF0KGksIHBOZXdOb2RlKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfQXJyYXlOb2RlTGlzdDo6UmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBGWF9JTlQzMiBpU2l6ZSA9IG1fYXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7ICsraSkgew0KKyAgICAgICAgaWYgKG1fYXJyYXlbaV0gPT0gcE5vZGUpIHsNCisgICAgICAgICAgICBtX2FycmF5LlJlbW92ZUF0KGkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIENYRkFfQXJyYXlOb2RlTGlzdDo6SXRlbShGWF9JTlQzMiBpSW5kZXgpDQorew0KKyAgICBGWF9JTlQzMiBpU2l6ZSA9IG1fYXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaUluZGV4ID49IDAgJiYgaUluZGV4IDwgaVNpemUpIHsNCisgICAgICAgIHJldHVybiBtX2FycmF5W2lJbmRleF07DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfQXR0YWNoTm9kZUxpc3Q6OkNYRkFfQXR0YWNoTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBBdHRhY2hOb2RlKQ0KKyAgICA6IENYRkFfTm9kZUxpc3QocERvY3VtZW50KQ0KK3sNCisgICAgbV9wQXR0YWNoTm9kZSA9IHBBdHRhY2hOb2RlOw0KK30NCitGWF9JTlQzMiBDWEZBX0F0dGFjaE5vZGVMaXN0OjpHZXRMZW5ndGgoKQ0KK3sNCisgICAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTiwgbV9wQXR0YWNoTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBUUlVFIDogRkFMU0UpOw0KK30NCitGWF9CT09MIENYRkFfQXR0YWNoTm9kZUxpc3Q6OkFwcGVuZChDWEZBX05vZGUqIHBOb2RlKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBpZiAocFBhcmVudCkgew0KKyAgICAgICAgcFBhcmVudC0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5JbnNlcnRDaGlsZChwTm9kZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6SW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpDQorew0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwTmV3Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmIChwUGFyZW50KSB7DQorICAgICAgICBwUGFyZW50LT5SZW1vdmVDaGlsZChwTmV3Tm9kZSk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlTm9kZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6UmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KK30NCitDWEZBX05vZGUqIENYRkFfQXR0YWNoTm9kZUxpc3Q6Okl0ZW0oRlhfSU5UMzIgaUluZGV4KQ0KK3sNCisgICAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkdldENoaWxkKGlJbmRleCwgWEZBX0VMRU1FTlRfVU5LTk9XTiwgbV9wQXR0YWNoTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBUUlVFIDogRkFMU0UpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0YWNjX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0YWNjX2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5MGQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RhY2NfaW1wLmNwcApAQCAtMCwwICsxLDQxNjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCitzdGF0aWMgRlhfQVJHQglYRkFfV1N0cmluZ1RvQ29sb3IoRlhfV1NUUiB3c1ZhbHVlKQ0KK3sNCisgICAgRlhfQllURSByID0gMCwgZyA9IDAsIGIgPSAwOw0KKyAgICBpZiAod3NWYWx1ZS5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gMHhmZjAwMDAwMDsNCisgICAgfQ0KKyAgICBpbnQgY2MgPSAwOw0KKyAgICBGWF9MUENXU1RSIHN0ciA9IHdzVmFsdWUuR2V0UHRyKCk7DQorICAgIGludCBsZW4gPSB3c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgICAgIGNjKys7DQorICAgIH0NCisgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgcmV0dXJuIDB4ZmYwMDAwMDA7DQorICAgIH0NCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLCcgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByID0gciAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgIGNjICsrOw0KKyAgICB9DQorICAgIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcsJykgew0KKyAgICAgICAgY2MgKys7DQorICAgICAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZyA9IGcgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgICAgICAgY2MgKys7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLCcpIHsNCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcsJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGIgPSBiICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgICAgICBjYyArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuICgweGZmIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsNCit9DQorWEZBX0VMRU1FTlQgQ1hGQV9EYXRhOjpHZXRDbGFzc0lEKCkgY29uc3QNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2xhc3NJRCgpIDogWEZBX0VMRU1FTlRfVU5LTk9XTjsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGE6OlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfRkxPQVQgJmZWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCApIGNvbnN0DQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBpZiAobV9wTm9kZS0+VHJ5TWVhc3VyZShlQXR0ciwgbXMsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgZlZhbHVlID0gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGE6OlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfRkxPQVQgZlZhbHVlKQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmVmFsdWUsIFhGQV9VTklUX1B0KTsNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoZUF0dHIsIG1zKTsNCit9DQorQ1hGQV9GaWxsOjpDWEZBX0ZpbGwoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCitDWEZBX0ZpbGw6On5DWEZBX0ZpbGwoKQ0KK3sNCit9DQorRlhfSU5UMzIgQ1hGQV9GaWxsOjpHZXRQcmVzZW5jZSgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCit9DQordm9pZCBDWEZBX0ZpbGw6OlNldENvbG9yKEZYX0FSR0IgY29sb3IpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgICBpbnQgYSwgciwgZywgYjsNCisgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7DQorICAgIHdzQ29sb3IuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KK30NCitGWF9BUkdCCUNYRkFfRmlsbDo6R2V0Q29sb3IoRlhfQk9PTCBiVGV4dCkNCit7DQorICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsNCisgICAgICAgIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYlRleHQpIHsNCisgICAgICAgIHJldHVybiAweEZGMDAwMDAwOw0KKyAgICB9DQorICAgIHJldHVybiAweEZGRkZGRkZGOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZpbGw6OkdldEZpbGxUeXBlKCkNCit7DQorICAgIENYRkFfTm9kZSogcENoaWxkID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBGWF9JTlQzMiBlVHlwZSA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9FTEVNRU5UX0NvbG9yICYmIGVUeXBlICE9IFhGQV9FTEVNRU5UX0V4dHJhcykgew0KKyAgICAgICAgICAgIHJldHVybiBlVHlwZTsNCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0VMRU1FTlRfU29saWQ7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRmlsbDo6R2V0UGF0dGVybihGWF9BUkdCJiBmb3JlQ29sb3IpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGF0dGVybik7DQorICAgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgICAgICAgcENvbG9yLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yLCBGQUxTRSk7DQorICAgICAgICBmb3JlQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBmb3JlQ29sb3IgPSAweEZGMDAwMDAwOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1R5cGUpOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZpbGw6OkdldFN0aXBwbGUoRlhfQVJHQiYgc3RpcHBsZUNvbG9yKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1N0aXBwbGUpOw0KKyAgICBGWF9JTlQzMiBlQXR0ciA9IDUwOw0KKyAgICBwTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1JhdGUsIGVBdHRyKTsNCisgICAgaWYgKENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbG9yKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgICAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIEZBTFNFKTsNCisgICAgICAgIHN0aXBwbGVDb2xvciA9IFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHN0aXBwbGVDb2xvciA9IDB4RkYwMDAwMDA7DQorICAgIH0NCisgICAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZpbGw6OkdldExpbmVhcihGWF9BUkdCJiBlbmRDb2xvcikNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9MaW5lYXIpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQ7DQorICAgIHBOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgZUF0dHIpOw0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsNCisgICAgICAgIHBDb2xvci0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpOw0KKyAgICAgICAgZW5kQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBlbmRDb2xvciA9IDB4RkYwMDAwMDA7DQorICAgIH0NCisgICAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZpbGw6OkdldFJhZGlhbChGWF9BUkdCJiBlbmRDb2xvcikNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SYWRpYWwpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZTsNCisgICAgcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCBlQXR0cik7DQorICAgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgICAgICAgcENvbG9yLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yLCBGQUxTRSk7DQorICAgICAgICBlbmRDb2xvciA9IFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGVuZENvbG9yID0gMHhGRjAwMDAwMDsNCisgICAgfQ0KKyAgICByZXR1cm4gZUF0dHI7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRQcmVzZW5jZShGWF9JTlQzMiBpUHJlc2VuY2UpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCAoWEZBX0FUVFJJQlVURUVOVU0paVByZXNlbmNlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldEZpbGxUeXBlKEZYX0lOVDMyIGlUeXBlKQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRmlsbDo6U2V0UGF0dGVybihGWF9JTlQzMiBpUGF0dGVybiwgRlhfQVJHQiBmb3JlQ29sb3IpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGF0dGVybik7DQorICAgIENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgICAgaW50IGEsIHIsIGcsIGI7DQorICAgIEFyZ2JEZWNvZGUoZm9yZUNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgd3NDb2xvci5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KKyAgICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paVBhdHRlcm4pOw0KK30NCitGWF9CT09MIENYRkFfRmlsbDo6U2V0U3RpcHBsZShGWF9JTlQzMiBpU3RpcHBsZSwgRlhfQVJHQiBzdGlwcGxlQ29sb3IpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU3RpcHBsZSk7DQorICAgIENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgICAgaW50IGEsIHIsIGcsIGI7DQorICAgIEFyZ2JEZWNvZGUoc3RpcHBsZUNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgd3NDb2xvci5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KKyAgICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9SYXRlLCAoWEZBX0FUVFJJQlVURUVOVU0paVN0aXBwbGUpOw0KK30NCitGWF9CT09MIENYRkFfRmlsbDo6U2V0TGluZWFyKEZYX0lOVDMyIGlMaW5lYXIsIEZYX0FSR0IgZW5kQ29sb3IpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTGluZWFyKTsNCisgICAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgICBpbnQgYSwgciwgZywgYjsNCisgICAgQXJnYkRlY29kZShlbmRDb2xvciwgYSwgciwgZywgYik7DQorICAgIHdzQ29sb3IuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgICAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgICAgcmV0dXJuIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlMaW5lYXIpOw0KK30NCitGWF9CT09MIENYRkFfRmlsbDo6U2V0UmFkaWFsKEZYX0lOVDMyIGlSYWRpYWwsIEZYX0FSR0IgZW5kQ29sb3IpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUmFkaWFsKTsNCisgICAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgICBpbnQgYSwgciwgZywgYjsNCisgICAgQXJnYkRlY29kZShlbmRDb2xvciwgYSwgciwgZywgYik7DQorICAgIHdzQ29sb3IuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgICAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgICAgcmV0dXJuIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlSYWRpYWwpOw0KK30NCitDWEZBX01hcmdpbjo6Q1hGQV9NYXJnaW4oQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCitGWF9CT09MIENYRkFfTWFyZ2luOjpHZXRMZWZ0SW5zZXQoRlhfRkxPQVQgJmZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ICkgY29uc3QNCit7DQorICAgIGZJbnNldCA9IGZEZWZJbnNldDsNCisgICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OkdldFRvcEluc2V0KEZYX0ZMT0FUICZmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCApIGNvbnN0DQorew0KKyAgICBmSW5zZXQgPSBmRGVmSW5zZXQ7DQorICAgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OkdldFJpZ2h0SW5zZXQoRlhfRkxPQVQgJmZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ICkgY29uc3QNCit7DQorICAgIGZJbnNldCA9IGZEZWZJbnNldDsNCisgICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBmSW5zZXQpOw0KK30NCitGWF9CT09MIENYRkFfTWFyZ2luOjpHZXRCb3R0b21JbnNldChGWF9GTE9BVCAmZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgKSBjb25zdA0KK3sNCisgICAgZkluc2V0ID0gZkRlZkluc2V0Ow0KKyAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBmSW5zZXQpOw0KK30NCitGWF9CT09MIENYRkFfTWFyZ2luOjpTZXRMZWZ0SW5zZXQoRlhfRkxPQVQgZkluc2V0KQ0KK3sNCisgICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldFRvcEluc2V0KEZYX0ZMT0FUIGZJbnNldCkNCit7DQorICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldFJpZ2h0SW5zZXQoRlhfRkxPQVQgZkluc2V0KQ0KK3sNCisgICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBmSW5zZXQpOw0KK30NCitGWF9CT09MIENYRkFfTWFyZ2luOjpTZXRCb3R0b21JbnNldChGWF9GTE9BVCBmSW5zZXQpDQorew0KKyAgICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBmSW5zZXQpOw0KK30NCitDWEZBX0ZvbnQ6OkNYRkFfRm9udChDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCit7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRm9udDo6R2V0QmFzZWxpbmVTaGlmdCgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRm9udDo6R2V0SG9yaXpvbnRhbFNjYWxlKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgd3NWYWx1ZSk7DQorICAgIEZYX0lOVDMyIGlTY2FsZSA9IEZYU1lTX3d0b2koKEZYX0xQQ1dTVFIpd3NWYWx1ZSk7DQorICAgIHJldHVybiBpU2NhbGUgPiAwID8gKEZYX0ZMT0FUKWlTY2FsZSA6IDEwMC4wZjsNCit9DQorRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRWZXJ0aWNhbFNjYWxlKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsIHdzVmFsdWUpOw0KKyAgICBGWF9JTlQzMiBpU2NhbGUgPSBGWFNZU193dG9pKChGWF9MUENXU1RSKXdzVmFsdWUpOw0KKyAgICByZXR1cm4gaVNjYWxlID4gMCA/IChGWF9GTE9BVClpU2NhbGUgOiAxMDAuMGY7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRm9udDo6R2V0TGV0dGVyU3BhY2luZygpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZTsNCisgICAgaWYgKCFtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xldHRlclNwYWNpbmcsIHdzVmFsdWUpKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zKHdzVmFsdWUpOw0KKyAgICBpZiAobXMuR2V0VW5pdCgpID09IFhGQV9VTklUX0VtKSB7DQorICAgICAgICByZXR1cm4gbXMuR2V0VmFsdWUoKSAqIEdldEZvbnRTaXplKCk7DQorICAgIH0NCisgICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRm9udDo6R2V0TGluZVRocm91Z2goKQ0KK3sNCisgICAgRlhfSU5UMzIgaVZhbHVlID0gMDsNCisgICAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLCBpVmFsdWUpOw0KKyAgICByZXR1cm4gaVZhbHVlOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZvbnQ6OkdldExpbmVUaHJvdWdoUGVyaW9kKCkNCit7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fQWxsOw0KKyAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsIGVBdHRyKTsNCisgICAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9JTlQzMiBDWEZBX0ZvbnQ6OkdldE92ZXJsaW5lKCkNCit7DQorICAgIEZYX0lOVDMyIGlWYWx1ZSA9IDA7DQorICAgIG1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9PdmVybGluZSwgaVZhbHVlKTsNCisgICAgcmV0dXJuIGlWYWx1ZTsNCit9DQorRlhfSU5UMzIgQ1hGQV9Gb250OjpHZXRPdmVybGluZVBlcmlvZCgpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgICAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX092ZXJsaW5lUGVyaW9kLCBlQXR0cik7DQorICAgIHJldHVybiBlQXR0cjsNCit9DQorRlhfSU5UMzIgQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmUoKQ0KK3sNCisgICAgRlhfSU5UMzIgaVZhbHVlID0gMDsNCisgICAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVZhbHVlKTsNCisgICAgcmV0dXJuIGlWYWx1ZTsNCit9DQorRlhfSU5UMzIgQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmVQZXJpb2QoKQ0KK3sNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9BbGw7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIGVBdHRyKTsNCisgICAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldEZvbnRTaXplKCkNCit7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICAgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9TaXplLCBtcyk7DQorICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCit2b2lkIENYRkFfRm9udDo6R2V0VHlwZWZhY2UoQ0ZYX1dpZGVTdHJpbmdDICZ3c1R5cGVGYWNlKQ0KK3sNCisgICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgd3NUeXBlRmFjZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpJc0JvbGQoKQ0KK3sNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWw7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9XZWlnaHQsIGVBdHRyKTsNCisgICAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvbGQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpJc0l0YWxpYygpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbDsNCisgICAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1Bvc3R1cmUsIGVBdHRyKTsNCisgICAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYzsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OklzVXNlS2VybmluZygpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwgZUF0dHIpOw0KKyAgICByZXR1cm4gZUF0dHIgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFpcjsNCit9DQordm9pZCBDWEZBX0ZvbnQ6OlNldENvbG9yKEZYX0FSR0IgY29sb3IpDQorew0KKyAgICBDWEZBX0ZpbGwgZmlsbCA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZpbGwpOw0KKyAgICBmaWxsLlNldENvbG9yKGNvbG9yKTsNCit9DQorRlhfQVJHQiBDWEZBX0ZvbnQ6OkdldENvbG9yKCkNCit7DQorICAgIGlmIChDWEZBX0ZpbGwgZmlsbCA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ZpbGwpKSB7DQorICAgICAgICByZXR1cm4gZmlsbC5HZXRDb2xvcihUUlVFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gMHhGRjAwMDAwMDsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldEJhc2VsaW5lU2hpZnQoRlhfRkxPQVQgZkJhc2VsaW5lU2hpZnQpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zKGZCYXNlbGluZVNoaWZ0LCBYRkFfVU5JVF9QdCk7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfRm9udDo6U2V0SG9yaXpvbnRhbFNjYWxlKEZYX0ZMT0FUIGZIb3Jpem9udGFsU2NhbGUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICB3c1ZhbHVlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgKEZYX0lOVDMyKWZIb3Jpem9udGFsU2NhbGUpOw0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLCB3c1ZhbHVlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldFZlcnRpY2FsU2NhbGUoRlhfRkxPQVQgZlZlcnRpY2FsU2NhbGUpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICB3c1ZhbHVlLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIiwgKEZYX0lOVDMyKWZWZXJ0aWNhbFNjYWxlKTsNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsIHdzVmFsdWUpOw0KK30NCitGWF9CT09MIENYRkFfRm9udDo6U2V0TGV0dGVyU3BhY2luZyhGWF9GTE9BVCBmTGV0dGVyU3BhY2luZywgWEZBX1VOSVQgZVVuaXQpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRMaW5lVGhyb3VnaChGWF9JTlQzMiBpTGluZVRocm91Z2gpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLCBpTGluZVRocm91Z2gpOw0KK30NCitGWF9CT09MIENYRkFfRm9udDo6U2V0TGluZVRocm91Z2hQZXJpb2QoRlhfSU5UMzIgaUxpbmVUaHJvdWdoUGVyaW9kKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlMaW5lVGhyb3VnaFBlcmlvZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRPdmVybGluZShGWF9JTlQzMiBpT3ZlcmxpbmUpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX092ZXJsaW5lLCBpT3ZlcmxpbmUpOw0KK30NCitGWF9CT09MIENYRkFfRm9udDo6U2V0T3ZlcmxpbmVQZXJpb2QoRlhfSU5UMzIgaU92ZXJsaW5lUGVyaW9kKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlPdmVybGluZVBlcmlvZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRVbmRlcmxpbmUoRlhfSU5UMzIgaVVuZGVybGluZSkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLCBpVW5kZXJsaW5lKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldFVuZGVybGluZVBlcmlvZChGWF9JTlQzMiBpVW5kZXJsaW5lUGVyaW9kKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIChYRkFfQVRUUklCVVRFRU5VTSlpVW5kZXJsaW5lUGVyaW9kKTsNCit9DQorQ1hGQV9DYXB0aW9uOjpDWEZBX0NhcHRpb24oQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCitGWF9JTlQzMiBDWEZBX0NhcHRpb246OkdldFByZXNlbmNlKCkNCit7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZTsNCisgICAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBlQXR0cik7DQorICAgIHJldHVybiBlQXR0cjsNCit9DQorRlhfSU5UMzIgQ1hGQV9DYXB0aW9uOjpHZXRQbGFjZW1lbnRUeXBlKCkNCit7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgICAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgZUF0dHIpOw0KKyAgICByZXR1cm4gZUF0dHI7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfQ2FwdGlvbjo6R2V0UmVzZXJ2ZSgpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwgbXMpOw0KKyAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorQ1hGQV9NYXJnaW4gQ1hGQV9DYXB0aW9uOjpHZXRNYXJnaW4oKQ0KK3sNCisgICAgcmV0dXJuIENYRkFfTWFyZ2luKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9NYXJnaW4pIDogTlVMTCk7DQorfQ0KK0NYRkFfRm9udCBDWEZBX0NhcHRpb246OkdldEZvbnQoKQ0KK3sNCisgICAgcmV0dXJuIENYRkFfRm9udChtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRm9udCkgOiBOVUxMKTsNCit9DQorQ1hGQV9WYWx1ZSBDWEZBX0NhcHRpb246OkdldFZhbHVlKCkNCit7DQorICAgIHJldHVybiBDWEZBX1ZhbHVlKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSkgOiBOVUxMKTsNCit9DQorQ1hGQV9QYXJhIENYRkFfQ2FwdGlvbjo6R2V0UGFyYSgpDQorew0KKyAgICByZXR1cm4gQ1hGQV9QYXJhKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QYXJhKSA6IE5VTEwpOw0KK30NCitGWF9CT09MIENYRkFfQ2FwdGlvbjo6U2V0UHJlc2VuY2UoRlhfSU5UMzIgaVByZXNlbmNlKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmVzZW5jZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DYXB0aW9uOjpTZXRQbGFjZW1lbnRUeXBlKEZYX0lOVDMyIGlUeXBlKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIChYRkFfQVRUUklCVVRFRU5VTSlpVHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DYXB0aW9uOjpTZXRSZXNlcnZlKEZYX0ZMT0FUIGZSZXNlcnZlKQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmUmVzZXJ2ZSwgWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1Jlc2VydmUsIG1zKTsNCit9DQorQ1hGQV9QYXJhOjpDWEZBX1BhcmEoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCitGWF9JTlQzMiBDWEZBX1BhcmE6OkdldEhvcml6b250YWxBbGlnbigpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24sIGVBdHRyKTsNCisgICAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9JTlQzMiBDWEZBX1BhcmE6OkdldFZlcnRpY2FsQWxpZ24oKQ0KK3sNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIGVBdHRyKTsNCisgICAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldExpbmVIZWlnaHQoKQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgICAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIG1zKTsNCisgICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0TWFyZ2luTGVmdCgpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luTGVmdCwgbXMpOw0KKyAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5SaWdodCgpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsIG1zKTsNCisgICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUGFyYTo6R2V0T3JwaGFucygpDQorew0KKyAgICBGWF9JTlQzMiBpVmFsdWUgPSAwOw0KKyAgICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfT3JwaGFucywgaVZhbHVlKTsNCisgICAgcmV0dXJuIGlWYWx1ZTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRSYWRpeE9mZnNldCgpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIG1zKTsNCisgICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0U3BhY2VBYm92ZSgpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwgbXMpOw0KKyAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRTcGFjZUJlbG93KCkNCit7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICAgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9TcGFjZUJlbG93LCBtcyk7DQorICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFRleHRJbmRlbnQoKQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgICAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsIG1zKTsNCisgICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUGFyYTo6R2V0V2lkb3dzKCkNCit7DQorICAgIEZYX0lOVDMyIGlWYWx1ZSA9IDA7DQorICAgIG1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9XaWRvd3MsIGlWYWx1ZSk7DQorICAgIHJldHVybiBpVmFsdWU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRIb3Jpem9udGFsQWxpZ24oRlhfSU5UMzIgaUhvcml6b250YWxBbGlnbikNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduLCAoWEZBX0FUVFJJQlVURUVOVU0paUhvcml6b250YWxBbGlnbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRWZXJ0aWNhbEFsaWduKEZYX0lOVDMyIGlWZXJ0aWNhbEFsaWduKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIChYRkFfQVRUUklCVVRFRU5VTSlpVmVydGljYWxBbGlnbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRNYXJnaW5MZWZ0KEZYX0ZMT0FUIGZNYXJnaW5MZWZ0KQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmTWFyZ2luTGVmdCwgWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldE1hcmdpblJpZ2h0KEZYX0ZMT0FUIGZNYXJnaW5SaWdodCkNCit7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZk1hcmdpblJpZ2h0LCBYRkFfVU5JVF9QdCk7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldE9ycGhhbnMoRlhfSU5UMzIgaU9ycGhhbnMpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX09ycGhhbnMsIGlPcnBoYW5zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFJhZGl4T2Zmc2V0KEZYX0ZMT0FUIGZSYWRpeE9mZnNldCkNCit7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlJhZGl4T2Zmc2V0LCBYRkFfVU5JVF9QdCk7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFNwYWNlQWJvdmUoRlhfRkxPQVQgZlNwYWNlQWJvdmUpDQorew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zKGZTcGFjZUFib3ZlLCBYRkFfVU5JVF9QdCk7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0U3BhY2VCZWxvdyhGWF9GTE9BVCBmU3BhY2VCZWxvdykNCit7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlNwYWNlQmVsb3csIFhGQV9VTklUX1B0KTsNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TcGFjZUJlbG93LCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRUZXh0SW5kZW50KEZYX0ZMT0FUIGZUZXh0SW5kZW50KQ0KK3sNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmVGV4dEluZGVudCwgWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFdpZG93cyhGWF9JTlQzMiBpV2lkb3dzKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9XaWRvd3MsIGlXaWRvd3MpOw0KK30NCitDWEZBX0tlZXA6OkNYRkFfS2VlcChDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBQYXJlbnQpDQorICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KKyAgICAsIG1fcFBhcmVudChwUGFyZW50KQ0KK3sNCit9DQorRlhfSU5UMzIgQ1hGQV9LZWVwOjpHZXRJbnRhY3QoKQ0KK3sNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgICBzd2l0Y2ggKG1fcFBhcmVudC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06IHsNCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHJTdWJGb3JtOw0KKyAgICAgICAgICAgICAgICBtX3BQYXJlbnQtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQsIGVBdHRyU3ViRm9ybSk7DQorICAgICAgICAgICAgICAgIGlmIChlQXR0clN1YkZvcm0gPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24gfHwgZUF0dHJTdWJGb3JtID09IFhGQV9BVFRSSUJVVEVFTlVNX1Jvdykgew0KKyAgICAgICAgICAgICAgICAgICAgZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICAgICAgICBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfSW50YWN0LCBlQXR0ciwgRkFMU0UpOw0KKyAgICByZXR1cm4gZUF0dHI7DQorfQ0KK0ZYX0lOVDMyIENYRkFfS2VlcDo6R2V0TmV4dCgpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9OZXh0LCBlQXR0cik7DQorICAgIHJldHVybiBlQXR0cjsNCit9DQorRlhfSU5UMzIgQ1hGQV9LZWVwOjpHZXRQcmV2aW91cygpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgZUF0dHIpOw0KKyAgICByZXR1cm4gZUF0dHI7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9LZWVwOjpTZXRJbnRhY3QoRlhfSU5UMzIgaUludGFjdCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSW50YWN0LCAoWEZBX0FUVFJJQlVURUVOVU0paUludGFjdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9LZWVwOjpTZXROZXh0KEZYX0lOVDMyIGlOZXh0KQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9OZXh0LCAoWEZBX0FUVFJJQlVURUVOVU0paU5leHQpOw0KK30NCitGWF9CT09MIENYRkFfS2VlcDo6U2V0UHJldmlvdXMoRlhfSU5UMzIgaVByZXZpb3VzKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmV2aW91cyk7DQorfQ0KK0NYRkFfRXZlbnQ6OkNYRkFfRXZlbnQoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCitGWF9JTlQzMiBDWEZBX0V2ZW50OjpHZXRBY3Rpdml0eSgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FjdGl2aXR5KTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FdmVudDo6R2V0RXZlbnRUeXBlKCkNCit7DQorICAgIENYRkFfTm9kZSogcENoaWxkID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBGWF9JTlQzMiBlVHlwZSA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9FTEVNRU5UX0V4dHJhcykgew0KKyAgICAgICAgICAgIHJldHVybiBlVHlwZTsNCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCit9DQordm9pZCBDWEZBX0V2ZW50OjpHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlZikNCit7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVSdW5BdCgpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0KTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FdmVudDo6R2V0RXhlY3V0ZVR5cGUoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0V4ZWN1dGUpOw0KKyAgICByZXR1cm4gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSk7DQorfQ0KK3ZvaWQgQ1hGQV9FdmVudDo6R2V0RXhlY3V0ZUNvbm5lY3Rpb24oQ0ZYX1dpZGVTdHJpbmcgJndzQ29ubmVjdGlvbikNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FeGVjdXRlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOw0KKyAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBjRGF0YSk7DQorICAgIHdzQ29ubmVjdGlvbiA9IGNEYXRhOw0KK30NCitDWEZBX1NjcmlwdCBDWEZBX0V2ZW50OjpHZXRTY3JpcHQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK0NYRkFfU3VibWl0IENYRkFfRXZlbnQ6OkdldFN1Ym1pdCgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3VibWl0KTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FdmVudDo6R2V0U2lnbkRhdGFPcGVyYXRpb24oKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1NpZ25EYXRhKTsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uKTsNCit9DQordm9pZCBDWEZBX0V2ZW50OjpHZXRTaWduRGF0YVRhcmdldChDRlhfV2lkZVN0cmluZyAmd3NUYXJnZXQpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1NpZ25EYXRhKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ0RhdGE7DQorICAgICAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzQ0RhdGEpOw0KKyAgICAgICAgd3NUYXJnZXQgPSB3c0NEYXRhOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0QWN0aXZpdHkoRlhfSU5UMzIgaUFjdGl2aXR5KQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlBY3Rpdml0eSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0RXZlbnRUeXBlKEZYX0lOVDMyIGlFdmVudFR5cGUpDQorew0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0RXhlY3V0ZVJ1bkF0KEZYX0lOVDMyIGlFeGVjdXRlUnVuQXQpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICAgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0LCAoWEZBX0FUVFJJQlVURUVOVU0paUV4ZWN1dGVSdW5BdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0RXhlY3V0ZVR5cGUoRlhfSU5UMzIgaUV4ZWN1dGVUeXBlKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0V4ZWN1dGUpOw0KKyAgICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlFeGVjdXRlVHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0RXhlY3V0ZUNvbm5lY3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29ubmVjdGlvbikNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FeGVjdXRlKTsNCisgICAgcmV0dXJuIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIHdzQ29ubmVjdGlvbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0U2lnbkRhdGFPcGVyYXRpb24oRlhfSU5UMzIgaU9wZXJhdGlvbikNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9TaWduRGF0YSk7DQorICAgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgKFhGQV9BVFRSSUJVVEVFTlVNKWlPcGVyYXRpb24pOw0KK30NCitGWF9CT09MIENYRkFfRXZlbnQ6OlNldFNpZ25EYXRhVGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkNCit7DQorICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpKSB7DQorICAgICAgICByZXR1cm4gcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCB3c1RhcmdldCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX1NjcmlwdDo6Q1hGQV9TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCit2b2lkIENYRkFfU2NyaXB0OjpHZXRCaW5kaW5nKENGWF9XaWRlU3RyaW5nICZ3c0JpbmRpbmcpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZ0MgY0RhdGE7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQmluZGluZywgY0RhdGEpOw0KKyAgICB3c0JpbmRpbmcgPSBjRGF0YTsNCit9DQorWEZBX1NDUklQVFRZUEUgQ1hGQV9TY3JpcHQ6OkdldENvbnRlbnRUeXBlKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nQyBjRGF0YTsNCisgICAgaWYgKG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIGNEYXRhLCBGQUxTRSkpIHsNCisgICAgICAgIGlmIChjRGF0YSA9PSBGWF9XU1RSQyhMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9TQ1JJUFRUWVBFX0phdmFzY3JpcHQ7DQorICAgICAgICB9IGVsc2UgaWYgKGNEYXRhID09IEZYX1dTVFJDKEwiYXBwbGljYXRpb24veC1mb3JtY2FsYyIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9TQ1JJUFRUWVBFX0Zvcm1jYWxjOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfVW5rb3duOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzsNCit9DQorRlhfSU5UMzIgQ1hGQV9TY3JpcHQ6OkdldFJ1bkF0KCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUnVuQXQpOw0KK30NCit2b2lkIENYRkFfU2NyaXB0OjpHZXRFeHByZXNzaW9uKENGWF9XaWRlU3RyaW5nICZ3c0V4cHJlc3Npb24pDQorew0KKyAgICBtX3BOb2RlLT5UcnlDb250ZW50KHdzRXhwcmVzc2lvbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldEJpbmRpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmluZGluZykNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0JpbmRpbmcsIHdzQmluZGluZyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldENvbnRlbnRUeXBlKFhGQV9TQ1JJUFRUWVBFIGVUeXBlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlOw0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9TQ1JJUFRUWVBFX0phdmFzY3JpcHQ6DQorICAgICAgICAgICAgd3NUeXBlID0gTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzoNCisgICAgICAgICAgICB3c1R5cGUgPSBMImFwcGxpY2F0aW9uL3gtZm9ybWNhbGMiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NUeXBlKTsNCit9DQorRlhfQk9PTCBDWEZBX1NjcmlwdDo6U2V0UnVuQXQoRlhfSU5UMzIgaVJ1bkF0KQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlSdW5BdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldEV4cHJlc3Npb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDb250ZW50KHdzRXhwcmVzc2lvbiwgd3NFeHByZXNzaW9uKTsNCit9DQorQ1hGQV9TdWJtaXQ6OkNYRkFfU3VibWl0KENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogQ1hGQV9EYXRhIChwTm9kZSkNCit7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TdWJtaXQ6OklzU3VibWl0RW1iZWRQREYoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9FbWJlZFBERik7DQorfQ0KK0ZYX0lOVDMyIENYRkFfU3VibWl0OjpHZXRTdWJtaXRGb3JtYXQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Gb3JtYXQpOw0KK30NCit2b2lkIENYRkFfU3VibWl0OjpHZXRTdWJtaXRUYXJnZXQoQ0ZYX1dpZGVTdHJpbmdDICZ3c1RhcmdldCkNCit7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCB3c1RhcmdldCk7DQorfQ0KK1hGQV9URVhURU5DT0RJTkcgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFRleHRFbmNvZGluZygpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDRGF0YTsNCisgICAgaWYgKCFtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgd3NDRGF0YSkpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX05vbmU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSh3c0NEYXRhKTsNCisgICAgaWYgKHdzVmFsdWUgPT0gTCJCaWctRml2ZSIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0JpZzU7DQorICAgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMImZvbnRTcGVjaWZpYyIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0ZvbnRTcGVjaWZpYzsNCisgICAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiR0JLIikgew0KKyAgICAgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfR0JLOw0KKyAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJHQi0xODAzMCIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0dCMTgwMzA7DQorICAgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIkdCLTIzMTIiKSB7DQorICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19HQjIzMTI7DQorICAgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIklTTy04ODU5LU5OIikgew0KKyAgICAgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfSVNPODg1OU5OOw0KKyAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJLU0MtNTYwMSIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0tTQzU2MDE7DQorICAgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIlNoaWZ0LUpJUyIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX1NoaWZ0SklTOw0KKyAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVQ1MtMiIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX1VDUzI7DQorICAgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIlVURi0xNiIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX1VURjE2Ow0KKyAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVVEYtOCIpIHsNCisgICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX1VURjg7DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfTm9uZTsNCit9DQordm9pZCBDWEZBX1N1Ym1pdDo6R2V0U3VibWl0WERQQ29udGVudChDRlhfV2lkZVN0cmluZ0MgJndzQ29udGVudCkNCit7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfWGRwQ29udGVudCwgd3NDb250ZW50KTsNCit9DQorRlhfQk9PTCBDWEZBX1N1Ym1pdDo6U2V0U3VibWl0Rm9ybWF0KEZYX0lOVDMyIGlTdWJtaXRGb3JtYXQpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlTdWJtaXRGb3JtYXQpOw0KK30NCitGWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRUYXJnZXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCB3c1RhcmdldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TdWJtaXQ6OlNldFN1Ym1pdFRleHRFbmNvZGluZyhYRkFfVEVYVEVOQ09ESU5HIGVUZXh0RW5jb2RpbmcpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBzd2l0Y2ggKGVUZXh0RW5jb2RpbmcpIHsNCisgICAgICAgIGNhc2UgIFhGQV9URVhURU5DT0RJTkdfQmlnNToNCisgICAgICAgICAgICB3c1ZhbHVlID0gTCJCaWctRml2ZSI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfRm9udFNwZWNpZmljOg0KKyAgICAgICAgICAgIHdzVmFsdWUgPSBMImZvbnRTcGVjaWZpYyI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfR0JLOg0KKyAgICAgICAgICAgIHdzVmFsdWUgPSBMIkdCSyI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfR0IxODAzMDoNCisgICAgICAgICAgICB3c1ZhbHVlID0gTCJHQi0xODAzMCI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfR0IyMzEyOg0KKyAgICAgICAgICAgIHdzVmFsdWUgPSBMIkdCLTIzMTIiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0lTTzg4NTlOTjoNCisgICAgICAgICAgICB3c1ZhbHVlID0gTCJJU08tODg1OS1OTiI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfS1NDNTYwMToNCisgICAgICAgICAgICB3c1ZhbHVlID0gTCJLU0MtNTYwMSI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfU2hpZnRKSVM6DQorICAgICAgICAgICAgd3NWYWx1ZSA9IEwiU2hpZnQtSklTIjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VQ1MyOg0KKyAgICAgICAgICAgIHdzVmFsdWUgPSBMIlVDUy0yIjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VVEYxNjoNCisgICAgICAgICAgICB3c1ZhbHVlID0gTCJVVEYtMTYiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX1VURjg6DQorICAgICAgICAgICAgd3NWYWx1ZSA9IEwiVVRGLTgiOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIHdzVmFsdWUpOw0KK30NCitGWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRYRFBDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCB3c0NvbnRlbnQpOw0KK30NCitYRkFfRUxFTUVOVCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ2xhc3NJRCgpDQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgICB9DQorICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQorICAgICAgICByZXR1cm4gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCit9DQorRlhfQk9PTCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ29udGVudChDRlhfV2lkZVN0cmluZyAmd3NDb250ZW50KQ0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICAgIHJldHVybiBwTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9BcmMgQ1hGQV9WYWx1ZTo6R2V0QXJjKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9BcmMobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSA6IE5VTEw7DQorfQ0KK0NYRkFfTGluZSBDWEZBX1ZhbHVlOjpHZXRMaW5lKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9MaW5lKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgOiBOVUxMOw0KK30NCitDWEZBX1JlY3RhbmdsZSBDWEZBX1ZhbHVlOjpHZXRSZWN0YW5nbGUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX1JlY3RhbmdsZShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIDogTlVMTDsNCit9DQorQ1hGQV9UZXh0IENYRkFfVmFsdWU6OkdldFRleHQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX1RleHQobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSA6IE5VTEw7DQorfQ0KK0NYRkFfRXhEYXRhIENYRkFfVmFsdWU6OkdldEV4RGF0YSgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZSA/IENYRkFfRXhEYXRhKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgOiBOVUxMOw0KK30NCitDWEZBX0ltYWdlIENYRkFfVmFsdWU6OkdldEltYWdlKCkNCit7DQorICAgIHJldHVybiBDWEZBX0ltYWdlKG1fcE5vZGUgPyAobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSA6IE5VTEwsIFRSVUUpOw0KK30NCitGWF9CT09MIENYRkFfVmFsdWU6OlNldENoaWxkVmFsdWVDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsIEZYX0JPT0wgYk5vdGlmeSAsIFhGQV9FTEVNRU5UIGlUeXBlICkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIGlmIChpVHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBpVHlwZSk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRDb250ZW50KHdzQ29udGVudCk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBwTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NDb250ZW50LCB3c0Zvcm1hdENvbnRlbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZS0+U2V0Q29udGVudCh3c0NvbnRlbnQsIHdzRm9ybWF0Q29udGVudCwgYk5vdGlmeSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfTGluZTo6R2V0SGFuZCgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQpOw0KK30NCitGWF9CT09MIENYRkFfTGluZTo6R2V0U2xvcCgpDQorew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlU2xvcCA9IG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TbG9wZSk7DQorICAgIHJldHVybiAoZVNsb3AgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2xhc2gpID8gVFJVRSA6IEZBTFNFOw0KK30NCitDWEZBX0VkZ2UgQ1hGQV9MaW5lOjpHZXRFZGdlKCkNCit7DQorICAgIHJldHVybiBDWEZBX0VkZ2UobV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRWRnZSkpOw0KK30NCitGWF9CT09MIENYRkFfTGluZTo6U2V0SGFuZChGWF9JTlQzMiBpSGFuZCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSGFuZCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlIYW5kKTsNCit9DQorRlhfQk9PTCBDWEZBX0xpbmU6OlNldFNsb3AoRlhfSU5UMzIgaVNsb3ApDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1Nsb3BlLCAoWEZBX0FUVFJJQlVURUVOVU0paVNsb3ApOw0KK30NCitDWEZBX1RleHQ6OkNYRkFfVGV4dChDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0OjpHZXROYW1lKENGWF9XaWRlU3RyaW5nQyAmd3NOYW1lKQ0KK3sNCisgICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KK30NCitGWF9JTlQzMiBDWEZBX1RleHQ6OkdldE1heENoYXJzKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMpOw0KK30NCit2b2lkIENYRkFfVGV4dDo6R2V0UmlkKENGWF9XaWRlU3RyaW5nQyAmd3NSaWQpDQorew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JpZCwgd3NSaWQpOw0KK30NCit2b2lkIENYRkFfVGV4dDo6R2V0Q29udGVudChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RleHQpOw0KK30NCit2b2lkIENYRkFfVGV4dDo6U2V0Q29udGVudChDRlhfV2lkZVN0cmluZyB3c1RleHQsIEZYX0JPT0wgYk5vdGlmeSApDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVGV4dCk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KKyAgICB9DQorICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NUZXh0LCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5KTsNCit9DQorRlhfQk9PTCBDWEZBX1RleHQ6OlNldE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0OjpTZXRNYXhDaGFycyhGWF9JTlQzMiBpTWF4Q2hhcnMpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heENoYXJzLCBpTWF4Q2hhcnMpOw0KK30NCitGWF9CT09MIENYRkFfVGV4dDo6U2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JpZCwgd3NSaWQpOw0KK30NCitDWEZBX0V4RGF0YTo6Q1hGQV9FeERhdGEoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCit2b2lkIENYRkFfRXhEYXRhOjpHZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZ0MgJndzQ29udGVudFR5cGUpDQorew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCit9DQordm9pZCBDWEZBX0V4RGF0YTo6R2V0SHJlZihDRlhfV2lkZVN0cmluZ0MgJndzSHJlZikNCit7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FeERhdGE6OkdldE1heExlbmd0aCgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heExlbmd0aCk7DQorfQ0KK3ZvaWQgQ1hGQV9FeERhdGE6OkdldFJpZChDRlhfV2lkZVN0cmluZ0MgJndzUmlkKQ0KK3sNCisgICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SaWQsIHdzUmlkKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FeERhdGE6OkdldFRyYW5zZmVyRW5jb2RpbmcoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nKTsNCit9DQordm9pZCBDWEZBX0V4RGF0YTo6R2V0Q29udGVudChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RleHQpOw0KK30NCitGWF9CT09MIENYRkFfRXhEYXRhOjpTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCit9DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0TWF4TGVuZ3RoKEZYX0lOVDMyIGlNYXhMZW5ndGgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heExlbmd0aCwgaU1heExlbmd0aCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FeERhdGE6OlNldFJpZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSaWQpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SaWQsIHdzUmlkKTsNCit9DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0VHJhbnNmZXJFbmNvZGluZyhGWF9JTlQzMiBpVHJhbnNmZXJFbmNvZGluZykNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsNCit9DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkgLCAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSApDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVGV4dCk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDb250ZW50KHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsNCit9DQorQ1hGQV9JbWFnZTo6Q1hGQV9JbWFnZShDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJEZWZWYWx1ZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorICAgICwgbV9iRGVmVmFsdWUoYkRlZlZhbHVlKQ0KK3sNCit9DQorRlhfSU5UMzIgQ1hGQV9JbWFnZTo6R2V0QXNwZWN0KCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQXNwZWN0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ltYWdlOjpHZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZyAmd3NDb250ZW50VHlwZSkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ltYWdlOjpHZXRIcmVmKENGWF9XaWRlU3RyaW5nICZ3c0hyZWYpDQorew0KKyAgICBpZiAobV9iRGVmVmFsdWUpIHsNCisgICAgICAgIHJldHVybiAJbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRBdHRyaWJ1dGUoRlhfV1NUUkMoTCJocmVmIiksIHdzSHJlZik7DQorfQ0KK0ZYX0lOVDMyIENYRkFfSW1hZ2U6OkdldFRyYW5zZmVyRW5jb2RpbmcoKQ0KK3sNCisgICAgaWYgKG1fYkRlZlZhbHVlKSB7DQorICAgICAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6R2V0Q29udGVudChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KK3sNCisgICAgcmV0dXJuIAltX3BOb2RlLT5UcnlDb250ZW50KHdzVGV4dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6U2V0QXNwZWN0KEZYX0lOVDMyIGlBc3BlY3QpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FzcGVjdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlBc3BlY3QpOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldEhyZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZikNCit7DQorICAgIGlmIChtX2JEZWZWYWx1ZSkgew0KKyAgICAgICAgcmV0dXJuIAltX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6U2V0VHJhbnNmZXJFbmNvZGluZyhGWF9JTlQzMiBpVHJhbnNmZXJFbmNvZGluZykNCit7DQorICAgIGlmIChtX2JEZWZWYWx1ZSkgew0KKyAgICAgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCAoWEZBX0FUVFJJQlVURUVOVU0paVRyYW5zZmVyRW5jb2RpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NUZXh0KTsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NUZXh0LCB3c0Zvcm1hdFZhbHVlKTsNCit9DQorQ1hGQV9DYWxjdWxhdGU6OkNYRkFfQ2FsY3VsYXRlKENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KK3sNCit9DQorRlhfSU5UMzIgQ1hGQV9DYWxjdWxhdGU6OkdldE92ZXJyaWRlKCkNCit7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHQgPSBYRkFfQVRUUklCVVRFRU5VTV9FcnJvcjsNCisgICAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBlQXR0LCBGQUxTRSk7DQorICAgIHJldHVybiBlQXR0Ow0KK30NCitDWEZBX1NjcmlwdCBDWEZBX0NhbGN1bGF0ZTo6R2V0U2NyaXB0KCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9TY3JpcHQpOw0KK30NCit2b2lkIENYRkFfQ2FsY3VsYXRlOjpHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKQ0KK3sNCisgICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9NZXNzYWdlKSkgew0KKyAgICAgICAgQ1hGQV9UZXh0IHRleHQocE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RleHQpKTsNCisgICAgICAgIGlmICh0ZXh0KSB7DQorICAgICAgICAgICAgdGV4dC5HZXRDb250ZW50KHdzTWVzc2FnZSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX0NhbGN1bGF0ZTo6U2V0T3ZlcnJpZGUoRlhfSU5UMzIgaU92ZXJyaWRlKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlPdmVycmlkZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DYWxjdWxhdGU6OlNldE1lc3NhZ2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVGV4dCk7DQorICAgICAgICByZXR1cm4gcENoaWxkTm9kZS0+U2V0Q29udGVudCh3c01lc3NhZ2UsIHdzTWVzc2FnZSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX1ZhbGlkYXRlOjpDWEZBX1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KK3sNCit9DQorRlhfSU5UMzIgQ1hGQV9WYWxpZGF0ZTo6R2V0Rm9ybWF0VGVzdCgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QpOw0KK30NCitGWF9CT09MIENYRkFfVmFsaWRhdGU6OlNldFRlc3RWYWx1ZShGWF9JTlQzMiBpVHlwZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKQ0KK3sNCisgICAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUod3NWYWx1ZSk7DQorICAgIGlmIChwSW5mbykgew0KKyAgICAgICAgZU5hbWUgPSBwSW5mby0+ZU5hbWU7DQorICAgIH0NCisgICAgbV9wTm9kZS0+U2V0RW51bSgoWEZBX0FUVFJJQlVURSlpVHlwZSwgZU5hbWUsIEZBTFNFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9WYWxpZGF0ZTo6U2V0Rm9ybWF0VGVzdChDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKQ0KK3sNCisgICAgcmV0dXJuIFNldFRlc3RWYWx1ZShYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QsIHdzVmFsdWUsIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmcpOw0KK30NCitGWF9CT09MIENYRkFfVmFsaWRhdGU6OlNldE51bGxUZXN0KENGWF9XaWRlU3RyaW5nIHdzVmFsdWUpDQorew0KKyAgICByZXR1cm4gU2V0VGVzdFZhbHVlKFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIHdzVmFsdWUsIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9WYWxpZGF0ZTo6R2V0TnVsbFRlc3QoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9OdWxsVGVzdCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfVmFsaWRhdGU6OkdldFNjcmlwdFRlc3QoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0KTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlLCBGWF9XU1RSIHdzTWVzc2FnZVR5cGUpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UsIEZBTFNFKSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwSXRlbU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgZm9yICg7IHBJdGVtTm9kZTsgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgaWYgKHBJdGVtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1RleHQpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQorICAgICAgICAgICAgcEl0ZW1Ob2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgICAgICAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkgfHwgd3NOYW1lID09IHdzTWVzc2FnZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgcEl0ZW1Ob2RlLT5UcnlDb250ZW50KHdzTWVzc2FnZSk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpDQorew0KKyAgICBTZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEZYX1dTVFJDKEwiZm9ybWF0VGVzdCIpKTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKQ0KK3sNCisgICAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMImZvcm1hdFRlc3QiKSk7DQorfQ0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSkNCit7DQorICAgIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJudWxsVGVzdCIpKTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSkNCit7DQorICAgIEdldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJudWxsVGVzdCIpKTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlLCBGWF9XU1RSIHdzTWVzc2FnZVR5cGUpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UsIFRSVUUpKSB7DQorICAgICAgICBDWEZBX05vZGUgKnBJdGVtTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBmb3IgKDsgcEl0ZW1Ob2RlOyBwSXRlbU5vZGUgPSBwSXRlbU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocEl0ZW1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfVGV4dCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICAgICAgICBwSXRlbU5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgICAgICAgICAgICBpZiAod3NOYW1lLklzRW1wdHkoKSB8fCB3c05hbWUgPT0gd3NNZXNzYWdlVHlwZSkgew0KKyAgICAgICAgICAgICAgICBwSXRlbU5vZGUtPlNldENvbnRlbnQod3NNZXNzYWdlLCB3c01lc3NhZ2UsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICAgICAgcE5vZGUtPkluc2VydENoaWxkKHBUZXh0Tm9kZSk7DQorICAgICAgICBwVGV4dE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NNZXNzYWdlVHlwZSwgRkFMU0UpOw0KKyAgICAgICAgcFRleHROb2RlLT5TZXRDb250ZW50KHdzTWVzc2FnZSwgd3NNZXNzYWdlLCBGQUxTRSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKQ0KK3sNCisgICAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMInNjcmlwdFRlc3QiKSk7DQorfQ0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0U2NyaXB0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlKQ0KK3sNCisgICAgU2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMInNjcmlwdFRlc3QiKSk7DQorfQ0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6R2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyAmd3NQaWN0dXJlKQ0KK3sNCisgICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QaWN0dXJlKSkgew0KKyAgICAgICAgcE5vZGUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsNCisgICAgfQ0KK30NCitDWEZBX1NjcmlwdCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK0NYRkFfVmFyaWFibGVzOjpDWEZBX1ZhcmlhYmxlcyhDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCit7DQorfQ0KK0ZYX0lOVDMyIENYRkFfVmFyaWFibGVzOjpDb3VudFNjcmlwdHMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfU2NyaXB0KTsNCit9DQorQ1hGQV9TY3JpcHQgQ1hGQV9WYXJpYWJsZXM6OkdldFNjcmlwdChGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9TY3JpcHQpOw0KK30NCitDWEZBX0JpbmQ6OkNYRkFfQmluZChDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCit7DQorfQ0KK0ZYX0lOVDMyIENYRkFfQmluZDo6R2V0TWF0Y2goKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCk7DQorfQ0KK3ZvaWQgQ1hGQV9CaW5kOjpHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlZikNCit7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQorfQ0KK3ZvaWQgQ1hGQV9CaW5kOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nICZ3c1BpY3R1cmUpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQorICAgICAgICBwUGljdHVyZS0+VHJ5Q29udGVudCh3c1BpY3R1cmUpOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9CaW5kOjpTZXRNYXRjaChGWF9JTlQzMiBpTWF0Y2gpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoLCAoWEZBX0FUVFJJQlVURUVOVU0paU1hdGNoKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmQ6OlNldFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWYpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmQ6OlNldFBpY3R1cmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSkNCit7DQorICAgIGlmIChDWEZBX05vZGUqIHBQaWN0dXJlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGljdHVyZSkpIHsNCisgICAgICAgIHJldHVybiBwUGljdHVyZS0+U2V0Q29udGVudCh3c1BpY3R1cmUsIHdzUGljdHVyZSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX0Fzc2lzdDo6Q1hGQV9Bc3Npc3QoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpDQorew0KK30NCitDWEZBX1Rvb2xUaXAgQ1hGQV9Bc3Npc3Q6OkdldFRvb2xUaXAoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1Rvb2xUaXApOw0KK30NCitDWEZBX1Rvb2xUaXA6OkNYRkFfVG9vbFRpcChDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCit7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ub29sVGlwOjpHZXRUaXAoQ0ZYX1dpZGVTdHJpbmcgJndzVGlwKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NUaXApOw0KK30NCitGWF9CT09MIENYRkFfVG9vbFRpcDo6U2V0VGlwKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpcCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDb250ZW50KHdzVGlwLCB3c1RpcCk7DQorfQ0KK0NYRkFfQmluZEl0ZW1zOjpDWEZBX0JpbmRJdGVtcyhDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCit7DQorfQ0KK3ZvaWQgQ1hGQV9CaW5kSXRlbXM6OkdldENvbm5lY3Rpb24oQ0ZYX1dpZGVTdHJpbmdDICZ3c0Nvbm5lY3Rpb24pDQorew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIHdzQ29ubmVjdGlvbik7DQorfQ0KK3ZvaWQgQ1hGQV9CaW5kSXRlbXM6OkdldExhYmVsUmVmKENGWF9XaWRlU3RyaW5nQyAmd3NMYWJlbFJlZikNCit7DQorICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIHdzTGFiZWxSZWYpOw0KK30NCit2b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRWYWx1ZVJlZihDRlhfV2lkZVN0cmluZ0MgJndzVmFsdWVSZWYpDQorew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCB3c1ZhbHVlUmVmKTsNCit9DQordm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0UmVmKENGWF9XaWRlU3RyaW5nQyAmd3NSZWYpDQorew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOw0KK30NCitGWF9CT09MIENYRkFfQmluZEl0ZW1zOjpTZXRDb25uZWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCB3c0Nvbm5lY3Rpb24pOw0KK30NCitGWF9CT09MIENYRkFfQmluZEl0ZW1zOjpTZXRMYWJlbFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMYWJlbFJlZikNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0xhYmVsUmVmLCB3c0xhYmVsUmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmRJdGVtczo6U2V0VmFsdWVSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWVSZWYpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwgd3NWYWx1ZVJlZik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9CaW5kSXRlbXM6OlNldFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWYpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9Cb3g6OkdldEJyZWFrKCkgY29uc3QNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0Nsb3NlOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQnJlYWspOw0KK30NCitGWF9JTlQzMiBDWEZBX0JveDo6R2V0SGFuZCgpIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9FdmVuOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSGFuZCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfQm94OjpHZXRQcmVzZW5jZSgpIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW47DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfQm94OjpDb3VudENvcm5lcnMoKSBjb25zdA0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9Db3JuZXIpOw0KK30NCitDWEZBX0Nvcm5lciBDWEZBX0JveDo6R2V0Q29ybmVyKEZYX0lOVDMyIG5JbmRleCkgY29uc3QNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIENYRkFfQ29ybmVyKG1fcE5vZGUtPkdldFByb3BlcnR5KG5JbmRleCwgWEZBX0VMRU1FTlRfQ29ybmVyLCBuSW5kZXggPT0gMCkpOw0KK30NCitGWF9JTlQzMiBDWEZBX0JveDo6Q291bnRFZGdlcygpIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX0VkZ2UpOw0KK30NCitDWEZBX0VkZ2UgQ1hGQV9Cb3g6OkdldEVkZ2UoRlhfSU5UMzIgbkluZGV4KSBjb25zdA0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ1hGQV9FZGdlKG1fcE5vZGUtPkdldFByb3BlcnR5KG5JbmRleCwgWEZBX0VMRU1FTlRfRWRnZSwgbkluZGV4ID09IDApKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRTdHJva2VzKENYRkFfTm9kZSAqcE5vZGUsIENYRkFfU3Ryb2tlQXJyYXkgJnN0cm9rZXMsIEZYX0JPT0wgYk5VTEwpDQorew0KKyAgICBzdHJva2VzLlJlbW92ZUFsbCgpOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgc3Ryb2tlcy5TZXRTaXplKDgpOw0KKyAgICBGWF9JTlQzMiBpLCBqOw0KKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkgKyspIHsNCisgICAgICAgIENYRkFfQ29ybmVyIGNvcm5lciA9IENYRkFfQ29ybmVyKHBOb2RlLT5HZXRQcm9wZXJ0eShpLCBYRkFfRUxFTUVOVF9Db3JuZXIsIGkgPT0gMCkpOw0KKyAgICAgICAgaWYgKGNvcm5lci5Jc0V4aXN0SW5YTUwoKSB8fCBpID09IDApIHsNCisgICAgICAgICAgICBzdHJva2VzLlNldEF0KGosIGNvcm5lcik7DQorICAgICAgICB9IGVsc2UgaWYgKGJOVUxMKSB7DQorICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBOVUxMKTsNCisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7DQorICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzBdKTsNCisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7DQorICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzBdKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzJdKTsNCisgICAgICAgIH0NCisgICAgICAgIGogKys7DQorICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IENYRkFfRWRnZShwTm9kZS0+R2V0UHJvcGVydHkoaSwgWEZBX0VMRU1FTlRfRWRnZSwgaSA9PSAwKSk7DQorICAgICAgICBpZiAoZWRnZS5Jc0V4aXN0SW5YTUwoKSB8fCBpID09IDApIHsNCisgICAgICAgICAgICBzdHJva2VzLlNldEF0KGosIGVkZ2UpOw0KKyAgICAgICAgfSBlbHNlIGlmIChiTlVMTCkgew0KKyAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMSkgew0KKyAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1sxXSk7DQorICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMikgew0KKyAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1sxXSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1szXSk7DQorICAgICAgICB9DQorICAgICAgICBqICsrOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9Cb3g6OkdldFN0cm9rZXMoQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcykgY29uc3QNCit7DQorICAgIFhGQV9CT1hfR2V0U3Ryb2tlcyhtX3BOb2RlLCBzdHJva2VzLCBGQUxTRSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Cb3g6OklzQ2lyY3VsYXIoKSBjb25zdA0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9DaXJjdWxhcik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Cb3g6OkdldFN0YXJ0QW5nbGUoRlhfRkxPQVQgJmZTdGFydEFuZ2xlKSBjb25zdA0KK3sNCisgICAgZlN0YXJ0QW5nbGUgPSAwOw0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgICBGWF9CT09MIGJSZXQgPSBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwgbXMsIEZBTFNFKTsNCisgICAgaWYgKGJSZXQpIHsNCisgICAgICAgIGZTdGFydEFuZ2xlID0gbXMuR2V0VmFsdWUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDWEZBX0JveDo6R2V0U3dlZXBBbmdsZShGWF9GTE9BVCAmZlN3ZWVwQW5nbGUpIGNvbnN0DQorew0KKyAgICBmU3dlZXBBbmdsZSA9IDM2MDsNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgICAgRlhfQk9PTCBiUmV0ID0gbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsIG1zLCBGQUxTRSk7DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgICBmU3dlZXBBbmdsZSA9IG1zLkdldFZhbHVlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0NYRkFfRmlsbCBDWEZBX0JveDo6R2V0RmlsbChGWF9CT09MIGJNb2RpZmllZCkgY29uc3QNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlICpwRmlsbE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9GaWxsLCBiTW9kaWZpZWQpOw0KKyAgICByZXR1cm4gQ1hGQV9GaWxsKHBGaWxsTm9kZSk7DQorfQ0KK0NYRkFfTWFyZ2luIENYRkFfQm94OjpHZXRNYXJnaW4oKSBjb25zdA0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWFyZ2luKSk7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9CT1hfU2FtZVN0eWxlcyhjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gc3Ryb2tlcy5HZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDWEZBX1N0cm9rZSBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQorICAgICAgICBpZiAoIXN0cm9rZTIuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghc3Ryb2tlMS5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgIHN0cm9rZTEgPSBzdHJva2UyOw0KKyAgICAgICAgfSBlbHNlIGlmICghc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfQm94OjpTYW1lU3R5bGVzKCkgY29uc3QNCit7DQorICAgIGlmIChJc0FyYygpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDWEZBX1N0cm9rZUFycmF5IHN0cm9rZXM7DQorICAgIFhGQV9CT1hfR2V0U3Ryb2tlcyhtX3BOb2RlLCBzdHJva2VzLCBUUlVFKTsNCisgICAgcmV0dXJuIFhGQV9CT1hfU2FtZVN0eWxlcyhzdHJva2VzKTsNCit9DQorc3RhdGljIEZYX0lOVDMyIFhGQV9CT1hfM0RTdHlsZShjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBDWEZBX1N0cm9rZSAmc3Ryb2tlKQ0KK3sNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gc3Ryb2tlcy5HZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBzdHJva2UgPSBzdHJva2VzWzBdOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAxOyBpIDwgaUNvdW50OyBpICsrKSB7DQorICAgICAgICBDWEZBX1N0cm9rZSBmaW5kID0gc3Ryb2tlc1tpXTsNCisgICAgICAgIGlmICghZmluZC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFzdHJva2UuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgICAgICBzdHJva2UgPSBmaW5kOw0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJva2UuR2V0U3Ryb2tlVHlwZSgpICE9IGZpbmQuR2V0U3Ryb2tlVHlwZSgpKSB7DQorICAgICAgICAgICAgc3Ryb2tlID0gZmluZDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpVHlwZSA9IHN0cm9rZS5HZXRTdHJva2VUeXBlKCk7DQorICAgIGlmIChpVHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkIHx8IGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZCB8fA0KKyAgICAgICAgICAgIGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZCB8fCBpVHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9FbWJvc3NlZCkgew0KKyAgICAgICAgcmV0dXJuIGlUeXBlOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitGWF9JTlQzMiBDWEZBX0JveDo6R2V0M0RTdHlsZShGWF9CT09MICZiVmlzaWJsZSwgRlhfRkxPQVQgJmZUaGlja25lc3MpIGNvbnN0DQorew0KKyAgICBpZiAoSXNBcmMoKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ1hGQV9TdHJva2VBcnJheSBzdHJva2VzOw0KKyAgICBYRkFfQk9YX0dldFN0cm9rZXMobV9wTm9kZSwgc3Ryb2tlcywgVFJVRSk7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZShOVUxMKTsNCisgICAgRlhfSU5UMzIgaVR5cGUgPSBYRkFfQk9YXzNEU3R5bGUoc3Ryb2tlcywgc3Ryb2tlKTsNCisgICAgaWYgKGlUeXBlKSB7DQorICAgICAgICBiVmlzaWJsZSA9IHN0cm9rZS5Jc1Zpc2libGUoKTsNCisgICAgICAgIGZUaGlja25lc3MgPSBzdHJva2UuR2V0VGhpY2tuZXNzKCk7DQorICAgIH0NCisgICAgcmV0dXJuIGlUeXBlOw0KK30NCitGWF9JTlQzMiBDWEZBX1N0cm9rZTo6R2V0UHJlc2VuY2UoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpIDogWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOw0KK30NCitGWF9JTlQzMiBDWEZBX1N0cm9rZTo6R2V0Q2FwVHlwZSgpIGNvbnN0DQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmU7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9DYXApOw0KK30NCitGWF9JTlQzMiBDWEZBX1N0cm9rZTo6R2V0U3Ryb2tlVHlwZSgpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TdHJva2UpIDogWEZBX0FUVFJJQlVURUVOVU1fU29saWQ7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfU3Ryb2tlOjpHZXRUaGlja25lc3MoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIEdldE1TVGhpY2tuZXNzKCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorQ1hGQV9NZWFzdXJlbWVudCBDWEZBX1N0cm9rZTo6R2V0TVNUaGlja25lc3MoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzKSA6IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfTWVhc3VyZShYRkFfRUxFTUVOVF9FZGdlLCBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQordm9pZCBDWEZBX1N0cm9rZTo6U2V0VGhpY2tuZXNzKEZYX0ZMT0FUIGZUaGlja25lc3MpDQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyhmVGhpY2tuZXNzLCBYRkFfVU5JVF9QdCk7DQorICAgIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIHRoaWNrbmVzcyk7DQorfQ0KK3ZvaWQgQ1hGQV9TdHJva2U6OlNldE1TVGhpY2tuZXNzKENYRkFfTWVhc3VyZW1lbnQgbXNUaGlua25lc3MpDQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBtc1RoaW5rbmVzcyk7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9TdHJva2U6OkdldENvbG9yKCkgY29uc3QNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIDB4RkYwMDAwMDA7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIDB4RkYwMDAwMDA7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgICAgcmV0dXJuIFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCit9DQordm9pZCBDWEZBX1N0cm9rZTo6U2V0Q29sb3IoRlhfQVJHQiBhcmdiKQ0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgICAgaW50IGEsIHIsIGcsIGI7DQorICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7DQorICAgIHdzQ29sb3IuRm9ybWF0KChGWF9MUENXU1RSKUwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KK30NCitGWF9JTlQzMiBDWEZBX1N0cm9rZTo6R2V0Sm9pblR5cGUoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSm9pbikgOiBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TdHJva2U6OklzSW52ZXJ0ZWQoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfSW52ZXJ0ZWQpIDogRkFMU0U7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfU3Ryb2tlOjpHZXRSYWRpdXMoKSBjb25zdA0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXVzKS5Ub1VuaXQoWEZBX1VOSVRfUHQpIDogMDsNCit9DQorRlhfQk9PTCBDWEZBX1N0cm9rZTo6U2FtZVN0eWxlcyhDWEZBX1N0cm9rZSBzdHJva2UsIEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0DQorew0KKyAgICBpZiAobV9wTm9kZSA9PSAoQ1hGQV9Ob2RlKilzdHJva2UpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChGWFNZU19mYWJzKEdldFRoaWNrbmVzcygpIC0gc3Ryb2tlLkdldFRoaWNrbmVzcygpKSA+PSAwLjAxZikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICgoZHdGbGFncyAmIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UpID09IDAgJiYgSXNWaXNpYmxlKCkgIT0gc3Ryb2tlLklzVmlzaWJsZSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKEdldFN0cm9rZVR5cGUoKSAhPSBzdHJva2UuR2V0U3Ryb2tlVHlwZSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKEdldENvbG9yKCkgIT0gc3Ryb2tlLkdldENvbG9yKCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoKGR3RmxhZ3MgJiBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIpICE9IDAgJiYgRlhTWVNfZmFicyhHZXRSYWRpdXMoKSAtIHN0cm9rZS5HZXRSYWRpdXMoKSkgPj0gMC4wMWYpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfRkxPQVQgWEZBX0dldEVkZ2VUaGlja25lc3MoY29uc3QgQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcywgRlhfQk9PTCBiM0RTdHlsZSwgRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICAgIHsNCisgICAgICAgIGlmIChzdHJva2VzW25JbmRleCAqIDIgKyAxXS5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICAgICAgICBpZiAobkluZGV4ID09IDApIHsNCisgICAgICAgICAgICAgICAgZlRoaWNrbmVzcyArPSAyLjVmOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmVGhpY2tuZXNzICs9IHN0cm9rZXNbbkluZGV4ICogMiArIDFdLkdldFRoaWNrbmVzcygpICogKGIzRFN0eWxlID8gNCA6IDIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBmVGhpY2tuZXNzOw0KK30NCitDWEZBX1dpZGdldERhdGE6OkNYRkFfV2lkZ2V0RGF0YShDWEZBX05vZGUgKnBOb2RlKQ0KKyAgICA6IENYRkFfRGF0YShwTm9kZSkNCisgICAgLCBtX2JJc051bGwoVFJVRSkNCisgICAgLCBtX2JQcmVOdWxsKFRSVUUpDQorICAgICwgbV9wVWlDaGlsZE5vZGUoTlVMTCkNCisgICAgLCBtX2VVSVR5cGUoWEZBX0VMRU1FTlRfVU5LTk9XTikNCit7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRVSUNoaWxkKCkNCit7DQorICAgIGlmIChtX2VVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICAgICAgbV9wVWlDaGlsZE5vZGUgPSBYRkFfQ3JlYXRlVUlDaGlsZChtX3BOb2RlLCBtX2VVSVR5cGUpOw0KKyAgICB9DQorICAgIHJldHVybiBtX3BVaUNoaWxkTm9kZTsNCit9DQorWEZBX0VMRU1FTlQgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSVR5cGUoKQ0KK3sNCisgICAgR2V0VUlDaGlsZCgpOw0KKyAgICByZXR1cm4gbV9lVUlUeXBlOw0KK30NCitDRlhfV2lkZVN0cmluZyAgQ1hGQV9XaWRnZXREYXRhOjpHZXRSYXdWYWx1ZSgpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0Q29udGVudCgpOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkdldEFjY2VzcyhGWF9CT09MIGJUZW1wbGF0ZSkNCit7DQorICAgIGlmIChiVGVtcGxhdGUpIHsNCisgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgICAgIGlmIChwTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FjY2Vzcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3BlbjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZTsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgICBGWF9JTlQzMiBpQWNjID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MpOw0KKyAgICAgICAgaWYgKGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICAgICAgICAgIHJldHVybiBpQWNjOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wZW47DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3NLZXkoQ0ZYX1dpZGVTdHJpbmdDICZ3c0FjY2Vzc0tleSkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgd3NBY2Nlc3NLZXkpOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkdldEFuY2hvclR5cGUoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpHZXRDb2xTcGFuKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfQ29sU3Bhbik7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0RGF0YTo6R2V0UHJlc2VuY2UoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlOw0KKyAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgICBGWF9JTlQzMiBpQWNjID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorICAgICAgICBpZiAoIGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgICAgICAgIHJldHVybiBpQWNjOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0RGF0YTo6R2V0Um90YXRlKCkNCit7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICAgIGlmICghbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1JvdGF0ZSwgbXMsIEZBTFNFKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVJvdGF0ZSA9ICBGWFNZU19yb3VuZChtcy5HZXRWYWx1ZSgpKTsNCisgICAgaVJvdGF0ZSA9IChpUm90YXRlIDwgMCA/IChpUm90YXRlICUgMzYwKSArIDM2MCA6IGlSb3RhdGUgJSAzNjApOw0KKyAgICByZXR1cm4gaVJvdGF0ZSAvIDkwICogOTA7DQorfQ0KK0NYRkFfQm9yZGVyIENYRkFfV2lkZ2V0RGF0YTo6R2V0Qm9yZGVyKEZYX0JPT0wgYk1vZGlmaWVkKQ0KK3sNCisgICAgcmV0dXJuIENYRkFfQm9yZGVyKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JvcmRlciwgYk1vZGlmaWVkKSk7DQorfQ0KK0NYRkFfQ2FwdGlvbiBDWEZBX1dpZGdldERhdGE6OkdldENhcHRpb24oRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgcmV0dXJuIENYRkFfQ2FwdGlvbihtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uLCBiTW9kaWZpZWQpKTsNCit9DQorQ1hGQV9Gb250IENYRkFfV2lkZ2V0RGF0YTo6R2V0Rm9udChGWF9CT09MIGJNb2RpZmllZCApDQorew0KKyAgICByZXR1cm4gQ1hGQV9Gb250KG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZvbnQsIGJNb2RpZmllZCkpOw0KK30NCitDWEZBX01hcmdpbiBDWEZBX1dpZGdldERhdGE6OkdldE1hcmdpbihGWF9CT09MIGJNb2RpZmllZCApDQorew0KKyAgICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWFyZ2luLCBiTW9kaWZpZWQpKTsNCit9DQorQ1hGQV9QYXJhIENYRkFfV2lkZ2V0RGF0YTo6R2V0UGFyYShGWF9CT09MIGJNb2RpZmllZCApDQorew0KKyAgICByZXR1cm4gQ1hGQV9QYXJhKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1BhcmEsIGJNb2RpZmllZCkpOw0KK30NCitDWEZBX0tlZXAgQ1hGQV9XaWRnZXREYXRhOjpHZXRLZWVwKEZYX0JPT0wgYk1vZGlmaWVkICkNCit7DQorICAgIHJldHVybiBDWEZBX0tlZXAobV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfS2VlcCwgYk1vZGlmaWVkKSwgbV9wTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRFdmVudExpc3QoQ1hGQV9Ob2RlQXJyYXkgJmV2ZW50cykNCit7DQorICAgIG1fcE5vZGUtPkdldE5vZGVMaXN0KGV2ZW50cywgMCwgWEZBX0VMRU1FTlRfRXZlbnQpOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkdldEV2ZW50QnlBY3Rpdml0eShGWF9JTlQzMiBpQWN0aXZpdHksIENYRkFfTm9kZUFycmF5ICZldmVudHMsIEZYX0JPT0wgYklzRm9ybVJlYWR5KQ0KK3sNCisgICAgQ1hGQV9Ob2RlQXJyYXkgYWxsRXZlbnRzOw0KKyAgICBHZXRFdmVudExpc3QoYWxsRXZlbnRzKTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gYWxsRXZlbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBDWEZBX0V2ZW50IGV2ZW50KGFsbEV2ZW50c1tpXSk7DQorICAgICAgICBpZiAoZXZlbnQuR2V0QWN0aXZpdHkoKSA9PSBpQWN0aXZpdHkpIHsNCisgICAgICAgICAgICBpZiAoaUFjdGl2aXR5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5KSB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZjsNCisgICAgICAgICAgICAgICAgZXZlbnQuR2V0UmVmKHdzUmVmKTsNCisgICAgICAgICAgICAgICAgaWYgKGJJc0Zvcm1SZWFkeSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdzUmVmID09IENGWF9XaWRlU3RyaW5nQyhMIiRmb3JtIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuQWRkKGFsbEV2ZW50c1tpXSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAod3NSZWYgPT0gQ0ZYX1dpZGVTdHJpbmdDKEwiJGxheW91dCIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLkFkZChhbGxFdmVudHNbaV0pOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZXZlbnRzLkFkZChhbGxFdmVudHNbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZXZlbnRzLkdldFNpemUoKTsNCit9DQorQ1hGQV9WYWx1ZSBDWEZBX1dpZGdldERhdGE6OkdldERlZmF1bHRWYWx1ZShGWF9CT09MIGJNb2RpZmllZCApDQorew0KKyAgICBDWEZBX05vZGUqIHBUZW1Ob2RlID0gbV9wTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICAgIHJldHVybiBwVGVtTm9kZSA/IHBUZW1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSwgYk1vZGlmaWVkKSA6IE5VTEw7DQorfQ0KK0NYRkFfVmFsdWUgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb3JtVmFsdWUoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlLCBiTW9kaWZpZWQpOw0KK30NCitDWEZBX0NhbGN1bGF0ZSBDWEZBX1dpZGdldERhdGE6OkdldENhbGN1bGF0ZShGWF9CT09MIGJNb2RpZmllZCApDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCBiTW9kaWZpZWQpOw0KK30NCitDWEZBX1ZhbGlkYXRlIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFsaWRhdGUoRlhfQk9PTCBiTW9kaWZpZWQpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsaWRhdGUsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfVmFyaWFibGVzIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFyaWFibGVzKEZYX0JPT0wgYk1vZGlmaWVkICkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYXJpYWJsZXMsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfQmluZCBDWEZBX1dpZGdldERhdGE6OkdldEJpbmQoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JpbmQsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfQXNzaXN0IENYRkFfV2lkZ2V0RGF0YTo6R2V0QXNzaXN0KEZYX0JPT0wgYk1vZGlmaWVkICkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Bc3Npc3QsIGJNb2RpZmllZCk7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRSZWxldmFudChDRlhfV2lkZVN0cmluZ0MgJndzUmVsZXZhbnQpDQorew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlbGV2YW50LCB3c1JlbGV2YW50KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldFdpZHRoKEZYX0ZMT0FUICZmV2lkdGgpDQorew0KKyAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1csIGZXaWR0aCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRIZWlnaHQoRlhfRkxPQVQgJmZIZWlnaHQpDQorew0KKyAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIGZIZWlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWluV2lkdGgoRlhfRkxPQVQgJmZNaW5XaWR0aCkNCit7DQorICAgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluVywgZk1pbldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE1pbkhlaWdodChGWF9GTE9BVCAmZk1pbkhlaWdodCkNCit7DQorICAgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluSCwgZk1pbkhlaWdodCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhXaWR0aChGWF9GTE9BVCAmZk1heFdpZHRoKQ0KK3sNCisgICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhXLCBmTWF4V2lkdGgpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWF4SGVpZ2h0KEZYX0ZMT0FUICZmTWF4SGVpZ2h0KQ0KK3sNCisgICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBmTWF4SGVpZ2h0KTsNCit9DQorQ1hGQV9CaW5kSXRlbXMgQ1hGQV9XaWRnZXREYXRhOjpHZXRCaW5kSXRlbXMoKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0JpbmRJdGVtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRBY2Nlc3MoRlhfSU5UMzIgaUFjY2VzcywgRlhfQk9PTCBiTm90aWZ5KQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MsIChYRkFfQVRUUklCVVRFRU5VTSlpQWNjZXNzLCBiTm90aWZ5KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEFjY2Vzc0tleShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBY2Nlc3NLZXkpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksIHdzQWNjZXNzS2V5KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEFuY2hvclR5cGUoRlhfSU5UMzIgaVR5cGUpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsIChYRkFfQVRUUklCVVRFRU5VTSlpVHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRDb2xTcGFuKEZYX0lOVDMyIGlDb2xTcGFuKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuLCAoWEZBX0FUVFJJQlVURUVOVU0paUNvbFNwYW4pOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0UHJlc2VuY2UoRlhfSU5UMzIgaVByZXNlbmNlKQ0KK3sNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmVzZW5jZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRSb3RhdGUoRlhfSU5UMzIgaVJvdGF0ZSkNCit7DQorICAgIHdoaWxlIChpUm90YXRlIDwgMCkgew0KKyAgICAgICAgaVJvdGF0ZSArPSAzNjA7DQorICAgIH0NCisgICAgd2hpbGUgKGlSb3RhdGUgPj0gMzYwKSB7DQorICAgICAgICBpUm90YXRlIC09IDM2MDsNCisgICAgfQ0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zKChGWF9GTE9BVClpUm90YXRlLCBYRkFfVU5JVF9BbmdsZSk7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlLCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRSZWxldmFudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWxldmFudCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlbGV2YW50LCB3c1JlbGV2YW50KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFN0YXR1cyhGWF9EV09SRCBkd1N0YXR1cykNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFdpZHRoKEZYX0ZMT0FUIGZXaWR0aCkNCit7DQorICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgZldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEhlaWdodChGWF9GTE9BVCBmSGVpZ2h0KQ0KK3sNCisgICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBmSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1pbldpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCkNCit7DQorICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluVywgZk1pbldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1pbkhlaWdodChGWF9GTE9BVCBmTWluSGVpZ2h0KQ0KK3sNCisgICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NaW5ILCBmTWluSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1heFdpZHRoKEZYX0ZMT0FUIGZNYXhXaWR0aCkNCit7DQorICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4VywgZk1heFdpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1heEhlaWdodChGWF9GTE9BVCBmTWF4SGVpZ2h0KQ0KK3sNCisgICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBmTWF4SGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQ0KK3sNCisgICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YLCB4KSAmJiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSwgeSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QnV0dG9uSGlnaGxpZ2h0KEZYX0lOVDMyIGlCdXR0b25IaWdobGlnaHQpDQorew0KKyAgICBDWEZBX05vZGUqIHBVaUNoaWxkTm9kZSA9IEdldFVJQ2hpbGQoKTsNCisgICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlCdXR0b25IaWdobGlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QnV0dG9uUm9sbG92ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUm9sbG92ZXIsIEZYX0JPT0wgYlJpY2hUZXh0KQ0KK3sNCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QnV0dG9uRG93bihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEb3duLCBGWF9CT09MIGJSaWNoVGV4dCkNCit7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrQnV0dG9uU2hhcGUoRlhfSU5UMzIgaUNoZWNrQnV0dG9uU2hhcGUpDQorew0KKyAgICBDWEZBX05vZGUqIHBVaUNoaWxkTm9kZSA9IEdldFVJQ2hpbGQoKTsNCisgICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1NoYXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paUNoZWNrQnV0dG9uU2hhcGUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q2hlY2tCdXR0b25NYXJrKEZYX0lOVDMyIGlDaGVja0J1dHRvbk1hcmspDQorew0KKyAgICBDWEZBX05vZGUqIHBVaUNoaWxkTm9kZSA9IEdldFVJQ2hpbGQoKTsNCisgICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hcmssIChYRkFfQVRUUklCVVRFRU5VTSlpQ2hlY2tCdXR0b25NYXJrKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrQnV0dG9uU2l6ZShGWF9GTE9BVCBmQ2hlY2tCdXR0b25NYXJrKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVWlDaGlsZE5vZGUgPSBHZXRVSUNoaWxkKCk7DQorICAgIGlmIChwVWlDaGlsZE5vZGUpIHsNCisgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZkNoZWNrQnV0dG9uTWFyaywgWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1NpemUsIG1zKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfQm9yZGVyIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgcmV0dXJuIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JvcmRlciwgYk1vZGlmaWVkKSA6IE5VTEw7DQorfQ0KK0NYRkFfTWFyZ2luIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlNYXJnaW4oRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgcmV0dXJuIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01hcmdpbiwgYk1vZGlmaWVkKSA6IE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSU1hcmdpbihDRlhfUmVjdEYgJnJ0VUlNYXJnaW4pDQorew0KKyAgICBydFVJTWFyZ2luLlJlc2V0KCk7DQorICAgIENYRkFfTWFyZ2luIG1nVUkgPSBHZXRVSU1hcmdpbigpOw0KKyAgICBpZiAoIW1nVUkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0JvcmRlciBib3JkZXIgPSBHZXRVSUJvcmRlcigpOw0KKyAgICBpZiAoYm9yZGVyICYmIGJvcmRlci5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgIEZYX0JPT0wgYkxlZnQgPSBtZ1VJLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgRlhfQk9PTCBiVG9wID0gbWdVSS5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICBGWF9CT09MIGJSaWdodCA9IG1nVUkuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIEZYX0JPT0wgYkJvdHRvbSA9IG1nVUkuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgICAgaWYgKGJvcmRlcikgew0KKyAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSA9IEZBTFNFOw0KKyAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICAgICAgICBib3JkZXIuR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQorICAgICAgICBpZiAoIWJMZWZ0IHx8ICFiVG9wIHx8ICFiUmlnaHQgfHwgIWJCb3R0b20pIHsNCisgICAgICAgICAgICBDWEZBX1N0cm9rZUFycmF5IHN0cm9rZXM7DQorICAgICAgICAgICAgYm9yZGVyLkdldFN0cm9rZXMoc3Ryb2tlcyk7DQorICAgICAgICAgICAgaWYgKCFiVG9wKSB7DQorICAgICAgICAgICAgICAgIGZUb3BJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFiUmlnaHQpIHsNCisgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkJvdHRvbSkgew0KKyAgICAgICAgICAgICAgICBmQm90dG9tSW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkxlZnQpIHsNCisgICAgICAgICAgICAgICAgZkxlZnRJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcnRVSU1hcmdpbi5TZXQoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpHZXRCdXR0b25IaWdobGlnaHQoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgaWYgKHBVSUNoaWxkKSB7DQorICAgICAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IaWdobGlnaHQpOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfQnV0dG9uLCBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJ1dHRvblJvbGxvdmVyKENGWF9XaWRlU3RyaW5nICZ3c1JvbGxvdmVyLCBGWF9CT09MICZiUmljaFRleHQpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcykpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIHdoaWxlIChwVGV4dCkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQorICAgICAgICAgICAgcFRleHQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgICAgICAgICAgICBpZiAod3NOYW1lID09IEZYX1dTVFJDKEwicm9sbG92ZXIiKSkgew0KKyAgICAgICAgICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c1JvbGxvdmVyKTsNCisgICAgICAgICAgICAgICAgYlJpY2hUZXh0ID0gcFRleHQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGE7DQorICAgICAgICAgICAgICAgIHJldHVybiAhd3NSb2xsb3Zlci5Jc0VtcHR5KCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBUZXh0ID0gcFRleHQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uRG93bihDRlhfV2lkZVN0cmluZyAmd3NEb3duLCBGWF9CT09MICZiUmljaFRleHQpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcykpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIHdoaWxlKHBUZXh0KSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICAgICAgICBwVGV4dC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgICAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJkb3duIikpIHsNCisgICAgICAgICAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NEb3duKTsNCisgICAgICAgICAgICAgICAgYlJpY2hUZXh0ID0gcFRleHQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGE7DQorICAgICAgICAgICAgICAgIHJldHVybiAhd3NEb3duLklzRW1wdHkoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaGFwZSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1NoYXBlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX1NoYXBlLCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uTWFyaygpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hcmspOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIFhGQV9BVFRSSUJVVEVfTWFyaywgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzUmFkaW9CdXR0b24oKQ0KK3sNCisgICAgaWYgKENYRkFfTm9kZSogcFBhcmVudCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgICAgICByZXR1cm4gcFBhcmVudC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaXplKCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIGlmIChwVUlDaGlsZCkgew0KKyAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9YRFBQQUNLRVRfRm9ybSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dOZXV0cmFsKCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIGlmIChwVUlDaGlsZCkgew0KKyAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfQWxsb3dOZXV0cmFsKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQorWEZBX0NIRUNLU1RBVEUgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaGVja1N0YXRlKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7DQorICAgIH0NCisgICAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgICAgIHdoaWxlKHBUZXh0KSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICAgICAgICAgIGlmIChwVGV4dC0+VHJ5Q29udGVudCh3c0NvbnRlbnQpICYmICh3c0NvbnRlbnQgPT0gd3NWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIChYRkFfQ0hFQ0tTVEFURSlpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpKys7DQorICAgICAgICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0NIRUNLU1RBVEVfT2ZmOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSwgRlhfQk9PTCBiTm90aWZ5KQ0KK3sNCisgICAgaWYgKENYRkFfV2lkZ2V0RGF0YSBleGNsR3JvdXAgPSBHZXRFeGNsR3JvdXBOb2RlKCkpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgICAgICBpZiAoZUNoZWNrU3RhdGUgIT0gWEZBX0NIRUNLU1RBVEVfT2ZmKSB7DQorICAgICAgICAgICAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgaWYgKHBUZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcENoaWxkID0gKChDWEZBX05vZGUqKWV4Y2xHcm91cCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGZvciAoOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICAgICAgICAgIGlmICghcEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgaWYgKCFwSXRlbWNoaWxkKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZXh0ID0gcEl0ZW1jaGlsZC0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZSA9IHRleHQ7DQorICAgICAgICAgICAgaWYgKHdzVmFsdWUgIT0gdGV4dCkgew0KKyAgICAgICAgICAgICAgICBwSXRlbWNoaWxkID0gcEl0ZW1jaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgaWYgKHBJdGVtY2hpbGQpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzQ2hpbGRWYWx1ZSA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHdzQ2hpbGRWYWx1ZS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfV2lkZ2V0RGF0YSBjaChwQ2hpbGQpOw0KKyAgICAgICAgICAgIGNoLlN5bmNWYWx1ZSh3c0NoaWxkVmFsdWUsIGJOb3RpZnkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZXhjbEdyb3VwLlN5bmNWYWx1ZSh3c1ZhbHVlLCBiTm90aWZ5KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICAgICAgaWYgKCFwSXRlbXMpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9JTlQzMiBpID0gLTE7DQorICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgICB3aGlsZSAocFRleHQpIHsNCisgICAgICAgICAgICBpKys7DQorICAgICAgICAgICAgaWYgKGkgPT0gZUNoZWNrU3RhdGUpIHsNCisgICAgICAgICAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBUZXh0ID0gcFRleHQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB9DQorICAgICAgICBTeW5jVmFsdWUod3NDb250ZW50LCBiTm90aWZ5KTsNCisgICAgfQ0KK30NCitDWEZBX05vZGUqCUNYRkFfV2lkZ2V0RGF0YTo6R2V0RXhjbEdyb3VwTm9kZSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBFeGNsID0gKENYRkFfTm9kZSopbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwRXhjbDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkTWVtYmVyKCkNCit7DQorICAgIENYRkFfTm9kZSAqcFNlbGVjdGVkTWVtYmVyID0gTlVMTDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdGF0ZSA9IEdldFJhd1ZhbHVlKCk7DQorICAgIGlmICh3c1N0YXRlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIHBTZWxlY3RlZE1lbWJlcjsNCisgICAgfQ0KKyAgICBmb3IgKENYRkFfTm9kZSAqcE5vZGUgPSAoQ1hGQV9Ob2RlKiltX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBOb2RlICE9IE5VTEw7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBOb2RlKTsNCisgICAgICAgIGlmICh3aWRnZXREYXRhLkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9Pbikgew0KKyAgICAgICAgICAgIHBTZWxlY3RlZE1lbWJlciA9IHBOb2RlOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwU2VsZWN0ZWRNZW1iZXI7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpTZXRTZWxlY3RlZE1lbWJlcihGWF9XU1RSIHdzTmFtZSwgRlhfQk9PTCBiTm90aWZ5KQ0KK3sNCisgICAgQ1hGQV9Ob2RlICpwU2VsZWN0ZWRNZW1iZXIgPSBOVUxMOw0KKyAgICBGWF9EV09SRCBuYW1lSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgICAgZm9yIChDWEZBX05vZGUgKnBOb2RlID0gKENYRkFfTm9kZSopbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZiAocE5vZGUtPkdldE5hbWVIYXNoKCkgPT0gbmFtZUhhc2gpIHsNCisgICAgICAgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwTm9kZSk7DQorICAgICAgICAgICAgd2lkZ2V0RGF0YS5TZXRDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFX09uLCBiTm90aWZ5KTsNCisgICAgICAgICAgICBwU2VsZWN0ZWRNZW1iZXIgPSBwTm9kZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcFNlbGVjdGVkTWVtYmVyOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKEZYX1dTVFIgd3NWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5LCBGWF9CT09MIGJTY3JpcHRNb2RpZnksIEZYX0JPT0wgYlN5bmNEYXRhKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeGNsR3JvdXA7DQorICAgIGZvciAoQ1hGQV9Ob2RlICpwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICAgIGlmICghcEl0ZW0pIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBpZiAoIXBJdGVtY2hpbGQpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZSA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsNCisgICAgICAgIGlmICh3c1ZhbHVlICE9IHdzQ2hpbGRWYWx1ZSkgew0KKyAgICAgICAgICAgIHBJdGVtY2hpbGQgPSBwSXRlbWNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgIGlmIChwSXRlbWNoaWxkKSB7DQorICAgICAgICAgICAgICAgIHdzQ2hpbGRWYWx1ZSA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3c0NoaWxkVmFsdWUuRW1wdHkoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzRXhjbEdyb3VwID0gd3NWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5TZXRDb250ZW50KHdzQ2hpbGRWYWx1ZSwgd3NDaGlsZFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKG1fcE5vZGUpIHsNCisgICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeGNsR3JvdXAsIHdzRXhjbEdyb3VwLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICB9DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRFeGNsR3JvdXBGaXJzdE1lbWJlcigpDQorew0KKyAgICBDWEZBX05vZGUqIHBFeGNsID0gR2V0Tm9kZSgpOw0KKyAgICBpZiAoIXBFeGNsKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gcEV4Y2wtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRFeGNsR3JvdXBOZXh0TWVtYmVyKENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOb2RlRmllbGQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgd2hpbGUgKHBOb2RlRmllbGQpIHsNCisgICAgICAgIGlmIChwTm9kZUZpZWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGVGaWVsZDsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlRmllbGQgPSBwTm9kZUZpZWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkdldENob2ljZUxpc3RDb21taXRPbigpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0NvbW1pdE9uKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1RleHRFbnRyeSk7DQorICAgIH0NCisgICAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbihYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBYRkFfQVRUUklCVVRFX1RleHRFbnRyeSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0T3BlbigpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwgWEZBX0FUVFJJQlVURV9PcGVuLCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCitGWF9CT09MCUNYRkFfV2lkZ2V0RGF0YTo6SXNMaXN0Qm94KCkNCit7DQorICAgIEZYX0lOVDMyIGlPcGVuTW9kZSA9IEdldENob2ljZUxpc3RPcGVuKCk7DQorICAgIHJldHVybiAoaU9wZW5Nb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX0Fsd2F5cyB8fCBpT3Blbk1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkNvdW50Q2hvaWNlTGlzdEl0ZW1zKEZYX0JPT0wgYlNhdmVWYWx1ZSkNCit7DQorICAgIENYRkFfTm9kZUFycmF5IHBJdGVtczsNCisgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IE5VTEw7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgcEl0ZW1zLkFkZChwTm9kZSk7DQorICAgICAgICBpZiAoaUNvdW50ID09IDIpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihpQ291bnQgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgcEl0ZW0gPSBwSXRlbXNbMF07DQorICAgIGlmIChpQ291bnQgPiAxKSB7DQorICAgICAgICBGWF9CT09MIGJJdGVtT25lSGFzU2F2ZSA9IHBJdGVtc1swXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICAgICAgRlhfQk9PTCBiSXRlbVR3b0hhc1NhdmUgPSBwSXRlbXNbMV0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgICAgIGlmIChiSXRlbU9uZUhhc1NhdmUgIT0gYkl0ZW1Ud29IYXNTYXZlICYmIGJTYXZlVmFsdWUgPT0gYkl0ZW1Ud29IYXNTYXZlKSB7DQorICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbXNbMV07DQorICAgICAgICB9DQorICAgIH0NCisgICAgcEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm4gcEl0ZW0tPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYlNhdmVWYWx1ZSApDQorew0KKyAgICB3c1RleHQuRW1wdHkoKTsNCisgICAgQ1hGQV9Ob2RlQXJyYXkgcEl0ZW1zQXJyYXk7DQorICAgIENYRkFfTm9kZSogcEl0ZW1zID0gTlVMTDsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gMDsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNvdW50Kys7DQorICAgICAgICBwSXRlbXNBcnJheS5BZGQocE5vZGUpOw0KKyAgICAgICAgaWYgKGlDb3VudCA9PSAyKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcEl0ZW1zID0gcEl0ZW1zQXJyYXlbMF07DQorICAgIGlmIChpQ291bnQgPiAxKSB7DQorICAgICAgICBGWF9CT09MIGJJdGVtT25lSGFzU2F2ZSA9IHBJdGVtc0FycmF5WzBdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgICAgICBGWF9CT09MIGJJdGVtVHdvSGFzU2F2ZSA9IHBJdGVtc0FycmF5WzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgICAgICBpZiAoYkl0ZW1PbmVIYXNTYXZlICE9IGJJdGVtVHdvSGFzU2F2ZSAmJiBiU2F2ZVZhbHVlID09IGJJdGVtVHdvSGFzU2F2ZSkgew0KKyAgICAgICAgICAgIHBJdGVtcyA9IHBJdGVtc0FycmF5WzFdOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwSXRlbXMpIHsNCisgICAgICAgIENYRkFfTm9kZSAqcEl0ZW0gPSBwSXRlbXMtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfVU5LTk9XTik7DQorICAgICAgICBpZihwSXRlbSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcEl0ZW0tPlRyeUNvbnRlbnQod3NUZXh0KTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSAmd3NUZXh0QXJyYXksIEZYX0JPT0wgYlNhdmVWYWx1ZSApDQorew0KKyAgICBDWEZBX05vZGVBcnJheSBwSXRlbXM7DQorICAgIENYRkFfTm9kZSogcEl0ZW0gPSBOVUxMOw0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpQ291bnQrKzsNCisgICAgICAgIHBJdGVtcy5BZGQocE5vZGUpOw0KKyAgICAgICAgaWYgKGlDb3VudCA9PSAyKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYoaUNvdW50ID09IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwSXRlbSA9IHBJdGVtc1swXTsNCisgICAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgICAgIEZYX0JPT0wgYkl0ZW1PbmVIYXNTYXZlID0gcEl0ZW1zWzBdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgICAgICBGWF9CT09MIGJJdGVtVHdvSGFzU2F2ZSA9IHBJdGVtc1sxXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICAgICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpIHsNCisgICAgICAgICAgICBwSXRlbSA9IHBJdGVtc1sxXTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwSXRlbXMuUmVtb3ZlQWxsKCk7DQorICAgIHBOb2RlID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBwTm9kZS0+VHJ5Q29udGVudCh3c1RleHRBcnJheS5BZGQoKSk7DQorICAgIH0NCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpDb3VudFNlbGVjdGVkSXRlbXMoKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1ZhbHVlQXJyYXk7DQorICAgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgICBpZiAoSXNMaXN0Qm94KCkgfHwgIUlzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkpIHsNCisgICAgICAgIHJldHVybiB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlTZWxlY3RlZCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgICAgRlhfSU5UMzIgaVZhbHVlcyA9IHdzVmFsdWVBcnJheS5HZXRTaXplKCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpVmFsdWVzOyBpKyspIHsNCisgICAgICAgIEZYX0lOVDMyIGlTYXZlcyA9IHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVNhdmVzOyBqKyspIHsNCisgICAgICAgICAgICBpZiAod3NWYWx1ZUFycmF5W2ldID09IHdzU2F2ZVRleHRBcnJheVtqXSkgew0KKyAgICAgICAgICAgICAgICBpU2VsZWN0ZWQrKzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpU2VsZWN0ZWQ7DQorfQ0KK0ZYX0lOVDMyIENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRJdGVtKEZYX0lOVDMyIG5JbmRleCApDQorew0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCisgICAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQorICAgIEZYX0lOVDMyIGlTZWxlY3RlZCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgICAgRlhfSU5UMzIgaVNhdmVzID0gd3NTYXZlVGV4dEFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlTYXZlczsgaisrKSB7DQorICAgICAgICBpZiAod3NWYWx1ZUFycmF5W25JbmRleF0gPT0gd3NTYXZlVGV4dEFycmF5W2pdKSB7DQorICAgICAgICAgICAgcmV0dXJuIGo7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRJdGVtcyhDRlhfSW50MzJBcnJheSAmaVNlbEFycmF5KQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1ZhbHVlQXJyYXk7DQorICAgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgICBGWF9JTlQzMiBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgICAgaWYgKGlWYWx1ZXMgPCAxKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICAgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIFRSVUUpOw0KKyAgICBGWF9JTlQzMiBpU2F2ZXMgPSB3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVZhbHVlczsgaSsrKSB7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVNhdmVzOyBqKyspIHsNCisgICAgICAgICAgICBpZiAod3NWYWx1ZUFycmF5W2ldID09IHdzU2F2ZVRleHRBcnJheVtqXSkgew0KKyAgICAgICAgICAgICAgICBpU2VsQXJyYXkuQWRkKGopOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkSXRlbXNWYWx1ZShDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1NlbFRleHRBcnJheSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgICBpZiAoR2V0Q2hvaWNlTGlzdE9wZW4oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KKyAgICAgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIEZYX0lOVDMyIGlTdGFydCA9IDA7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICAgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gaUxlbmd0aCA6IGlFbmQ7DQorICAgICAgICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7DQorICAgICAgICAgICAgICAgIHdzU2VsVGV4dEFycmF5LkFkZCh3c1ZhbHVlLk1pZChpU3RhcnQsIGlFbmQgLSBpU3RhcnQpKTsNCisgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7DQorICAgICAgICAgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICAgICAgICAgICAgaWYgKGlFbmQgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICB3c1NlbFRleHRBcnJheS5BZGQod3NWYWx1ZS5NaWQoaVN0YXJ0LCBpTGVuZ3RoIC0gaVN0YXJ0KSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c1NlbFRleHRBcnJheS5BZGQod3NWYWx1ZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEl0ZW1TdGF0ZShGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgICAgaWYgKHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1ZhbHVlQXJyYXk7DQorICAgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgICBGWF9JTlQzMiBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8IGlWYWx1ZXM7IGorKykgew0KKyAgICAgICAgaWYgKHdzVmFsdWVBcnJheVtqXSA9PSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldEl0ZW1TdGF0ZShGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnksIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSwgRlhfQk9PTCBiU3luY0RhdGEpDQorew0KKyAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgICAgaWYgKHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVNlbCA9IC0xOw0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCisgICAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQorICAgIEZYX0lOVDMyIGlWYWx1ZXMgPSB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVZhbHVlczsgaisrKSB7DQorICAgICAgICBpZiAod3NWYWx1ZUFycmF5W2pdID09IHdzU2F2ZVRleHRBcnJheVtuSW5kZXhdKSB7DQorICAgICAgICAgICAgaVNlbCA9IGo7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgIGlmIChiU2VsZWN0ZWQpIHsNCisgICAgICAgICAgICBpZiAoaVNlbCA8IDApIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7DQorICAgICAgICAgICAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gTCJcbiI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XTsNCisgICAgICAgICAgICAgICAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c1ZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoaVNlbCA+PSAwKSB7DQorICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgICAgICAgICAgIEdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNlbEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGlmIChpU2VsQXJyYXlbaV0gPT0gbkluZGV4KSB7DQorICAgICAgICAgICAgICAgICAgICBpU2VsQXJyYXkuUmVtb3ZlQXQoaSk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBTZXRTZWxlY3RkSXRlbXMoaVNlbEFycmF5LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGJTZWxlY3RlZCkgew0KKyAgICAgICAgICAgIGlmIChpU2VsIDwgMCkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVUZXh0ID0gd3NTYXZlVGV4dEFycmF5W25JbmRleF07DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VGV4dCh3c1NhdmVUZXh0KTsNCisgICAgICAgICAgICAgICAgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzU2F2ZVRleHQsIHdzRm9ybWF0VGV4dCk7DQorICAgICAgICAgICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NTYXZlVGV4dCwgd3NGb3JtYXRUZXh0LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoaVNlbCA+PSAwKSB7DQorICAgICAgICAgICAgbV9wTm9kZS0+U2V0Q29udGVudChDRlhfV2lkZVN0cmluZygpLCBDRlhfV2lkZVN0cmluZygpLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpTZXRTZWxlY3RkSXRlbXMoQ0ZYX0ludDMyQXJyYXkgJmlTZWxBcnJheSwgRlhfQk9PTCBiTm90aWZ5LCBGWF9CT09MIGJTY3JpcHRNb2RpZnksIEZYX0JPT0wgYlN5bmNEYXRhKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgRlhfSU5UMzIgaVNpemUgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBpZiAoaVNpemUgPj0gMSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICAgICAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSXRlbVZhbHVlOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAgICAgICB3c0l0ZW1WYWx1ZSA9IChpU2l6ZSA9PSAxKSA/IHdzU2F2ZVRleHRBcnJheVtpU2VsQXJyYXlbaV1dIDogd3NTYXZlVGV4dEFycmF5W2lTZWxBcnJheVtpXV0gKyBGWF9XU1RSQyhMIlxuIik7DQorICAgICAgICAgICAgd3NWYWx1ZSArPSB3c0l0ZW1WYWx1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdCh3c1ZhbHVlKTsNCisgICAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgIEdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgIH0NCisgICAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkNsZWFyQWxsU2VsZWN0aW9ucygpDQorew0KKyAgICBDWEZBX05vZGUqIHBCaW5kID0gbV9wTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgaWYgKHBCaW5kICYmIEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgIHdoaWxlIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQorICAgICAgICAgICAgcEJpbmQtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgU3luY1ZhbHVlKENGWF9XaWRlU3RyaW5nKCksIEZBTFNFKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6SW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NMYWJlbCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0lOVDMyIG5JbmRleCAsICBGWF9CT09MIGJOb3RpZnkgKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdWYWx1ZSh3c1ZhbHVlKTsNCisgICAgaWYgKHdzTmV3VmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICB3c05ld1ZhbHVlID0gd3NMYWJlbDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIENYRkFfTm9kZSAqcEl0ZW1Ob2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcEl0ZW1Ob2RlOyBwSXRlbU5vZGUgPSBwSXRlbU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwSXRlbU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbGlzdGl0ZW1zLkFkZChwSXRlbU5vZGUpOw0KKyAgICAgICAgaUNvdW50ICsrOw0KKyAgICB9DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwSXRlbXMpOw0KKyAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBJdGVtcywgd3NMYWJlbCwgbkluZGV4KTsNCisgICAgICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwU2F2ZUl0ZW1zKTsNCisgICAgICAgIHBTYXZlSXRlbXMtPlNldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlLCBUUlVFKTsNCisgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KKyAgICB9IGVsc2UgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCAyOyBpKyspIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbGlzdGl0ZW1zW2ldOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYkhhc1NhdmUgPSBwTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICAgICAgICAgIGlmIChiSGFzU2F2ZSkgew0KKyAgICAgICAgICAgICAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocE5vZGUsIHdzTmV3VmFsdWUsIG5JbmRleCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBOb2RlLCB3c0xhYmVsLCBuSW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBsaXN0aXRlbXNbMF07DQorICAgICAgICBwTm9kZS0+U2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUsIEZBTFNFKTsNCisgICAgICAgIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU2F2ZUl0ZW1zID0gbV9wTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICAgICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBTYXZlSXRlbXMpOw0KKyAgICAgICAgcFNhdmVJdGVtcy0+U2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUsIFRSVUUpOw0KKyAgICAgICAgcFNhdmVJdGVtcy0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW4pOw0KKyAgICAgICAgbGlzdGl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgQ1hGQV9Ob2RlICpwTGlzdE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICB3aGlsZShwTGlzdE5vZGUpIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c09sZFZhbHVlOw0KKyAgICAgICAgICAgIHBMaXN0Tm9kZS0+VHJ5Q29udGVudCh3c09sZFZhbHVlKTsNCisgICAgICAgICAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocFNhdmVJdGVtcywgd3NPbGRWYWx1ZSwgaSk7DQorICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgIHBMaXN0Tm9kZSA9IHBMaXN0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgIH0NCisgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NMYWJlbCwgbkluZGV4KTsNCisgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KKyAgICB9DQorICAgIGlmKCFiTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPk9uV2lkZ2V0RGF0YUV2ZW50KHRoaXMsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkLCAoRlhfTFBWT0lEKShGWF9MUENXU1RSKXdzTGFiZWwsIChGWF9MUFZPSUQpKEZYX0xQQ1dTVFIpd3NWYWx1ZSwgKEZYX0xQVk9JRCkoRlhfVUlOVFBUUiluSW5kZXgpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbUxhYmVsKEZYX1dTVFIgd3NWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJndzTGFiZWwpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7DQorICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcEl0ZW1zOyBwSXRlbXMgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwSXRlbXMtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNvdW50Kys7DQorICAgICAgICBsaXN0aXRlbXMuQWRkKHBJdGVtcyk7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA8PSAxKSB7DQorICAgICAgICB3c0xhYmVsID0gd3NWYWx1ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMF07DQorICAgICAgICBGWF9CT09MIGJTYXZlID0gcExhYmVsSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQorICAgICAgICBpZiAoYlNhdmUpIHsNCisgICAgICAgICAgICBwU2F2ZUl0ZW1zID0gcExhYmVsSXRlbXM7DQorICAgICAgICAgICAgcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMV07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQorICAgICAgICB9DQorICAgICAgICBpQ291bnQgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaVNlYXJjaCA9IC0xOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRJdGVtID0gcFNhdmVJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgZm9yICg7IHBDaGlsZEl0ZW07IHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgcENoaWxkSXRlbS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICAgICAgICAgIGlmICh3c0NvbnRlbnQgPT0gd3NWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICBpU2VhcmNoID0gaUNvdW50Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUNvdW50ICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlTZWFyY2ggPCAwKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKENYRkFfTm9kZSogcFRleHQgPSBwTGFiZWxJdGVtcy0+R2V0Q2hpbGQoaVNlYXJjaCwgWEZBX0VMRU1FTlRfVU5LTk9XTikpIHsNCisgICAgICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c0xhYmVsKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbVZhbHVlKEZYX1dTVFIgd3NMYWJlbCwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpDQorew0KKyAgICBGWF9JTlQzMiBpQ291bnQgPSAwOw0KKyAgICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7DQorICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcEl0ZW1zOyBwSXRlbXMgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwSXRlbXMtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNvdW50Kys7DQorICAgICAgICBsaXN0aXRlbXMuQWRkKHBJdGVtcyk7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA8PSAxKSB7DQorICAgICAgICB3c1ZhbHVlID0gd3NMYWJlbDsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMF07DQorICAgICAgICBGWF9CT09MIGJTYXZlID0gcExhYmVsSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQorICAgICAgICBpZiAoYlNhdmUpIHsNCisgICAgICAgICAgICBwU2F2ZUl0ZW1zID0gcExhYmVsSXRlbXM7DQorICAgICAgICAgICAgcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMV07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQorICAgICAgICB9DQorICAgICAgICBpQ291bnQgPSAwOw0KKyAgICAgICAgRlhfSU5UMzIgaVNlYXJjaCA9IC0xOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRJdGVtID0gcExhYmVsSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGZvciAoOyBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgIHBDaGlsZEl0ZW0tPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgICAgICAgICBpZiAod3NDb250ZW50ID09IHdzTGFiZWwpIHsNCisgICAgICAgICAgICAgICAgaVNlYXJjaCA9IGlDb3VudDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlDb3VudCArKzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpU2VhcmNoIDwgMCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBUZXh0ID0gcFNhdmVJdGVtcy0+R2V0Q2hpbGQoaVNlYXJjaCwgWEZBX0VMRU1FTlRfVU5LTk9XTikpIHsNCisgICAgICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6RGVsZXRlSXRlbShGWF9JTlQzMiBuSW5kZXgsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCit7DQorICAgIEZYX0JPT0wgYlNldFZhbHVlID0gRkFMU0U7DQorICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcEl0ZW1zOyBwSXRlbXMgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIGlmIChwSXRlbXMtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICAgICAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQorICAgICAgICAgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKCFiU2V0VmFsdWUgJiYgcEl0ZW1zLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSkpIHsNCisgICAgICAgICAgICAgICAgU2V0SXRlbVN0YXRlKG5JbmRleCwgRkFMU0UsIFRSVUUsIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICB3aGlsZSAocE5vZGUpIHsNCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbkluZGV4KSB7DQorICAgICAgICAgICAgICAgICAgICBwSXRlbXMtPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYoIWJOb3RpZnkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5PbldpZGdldERhdGFFdmVudCh0aGlzLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkLCAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW5JbmRleCk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9JTlQzMiBDWEZBX1dpZGdldERhdGE6OkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgaWYgKHBVSUNoaWxkKSB7DQorICAgICAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5KTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQXV0bzsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpHZXROdW1iZXJPZkNlbGxzKCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIGlmICghcFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBVSUNoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db21iKSkgew0KKyAgICAgICAgcmV0dXJuIHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscyk7DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6SXNEYXRlVGltZUVkaXRVc2VQaWNrZXIoKQ0KK3sNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZVR5cGUoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgcmV0dXJuIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZSkgOiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGFyRW5jb2RpbmcoRlhfSU5UMzImIHZhbCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckVuY29kaW5nOw0KKyAgICBpZihwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsIHdzQ2hhckVuY29kaW5nKSkgew0KKyAgICAgICAgaWYgKHdzQ2hhckVuY29kaW5nLkNvbXBhcmVOb0Nhc2UoKEZYX0xQQ1dTVFIpKEwiVVRGLTE2IikpKSB7DQorICAgICAgICAgICAgdmFsID0gQ0hBUl9FTkNPRElOR19VTklDT0RFOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmICh3c0NoYXJFbmNvZGluZy5Db21wYXJlTm9DYXNlKChGWF9MUENXU1RSKShMIlVURi04IikpKSB7DQorICAgICAgICAgICAgdmFsID0gQ0hBUl9FTkNPRElOR19VVEY4Ow0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oRlhfSU5UMzImIHZhbCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDaGVja3N1bTsNCisgICAgaWYgKHBVSUNoaWxkLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIGVDaGVja3N1bSkpIHsNCisgICAgICAgIHN3aXRjaCAoZUNoZWNrc3VtKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgICAgICAgICAgICB2YWwgPSAwOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG86DQorICAgICAgICAgICAgICAgIHZhbCA9IDE7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwOg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMF8xbW9kMTE6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMm1vZDEwOg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoRlhfSU5UMzImIHZhbCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YUxlbmd0aDsNCisgICAgaWYocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwgd3NEYXRhTGVuZ3RoKSkgew0KKyAgICAgICAgdmFsID0gRlhTWVNfd3RvaSh3c0RhdGFMZW5ndGgpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9TdGFydENoYXIoRlhfQ0hBUiYgdmFsKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3RhcnRFbmRDaGFyOw0KKyAgICBpZihwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9TdGFydENoYXIsIHdzU3RhcnRFbmRDaGFyKSkgew0KKyAgICAgICAgaWYod3NTdGFydEVuZENoYXIuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgICB2YWwgPSAoRlhfQ0hBUil3c1N0YXJ0RW5kQ2hhci5HZXRBdCgwKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoRlhfQ0hBUiYgdmFsKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3RhcnRFbmRDaGFyOw0KKyAgICBpZihwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9FbmRDaGFyLCB3c1N0YXJ0RW5kQ2hhcikpIHsNCisgICAgICAgIGlmKHdzU3RhcnRFbmRDaGFyLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgdmFsID0gKEZYX0NIQVIpd3NTdGFydEVuZENoYXIuR2V0QXQoMCk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKEZYX0lOVDMyJiB2YWwpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0VDTGV2ZWw7DQorICAgIGlmKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLCB3c0VDTGV2ZWwpKSB7DQorICAgICAgICB2YWwgPSBGWFNZU193dG9pKHdzRUNMZXZlbCk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZVdpZHRoKEZYX0lOVDMyJiB2YWwpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1Nb2R1bGVXaWR0aEhlaWdodDsNCisgICAgaWYgKHBVSUNoaWxkLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsIG1Nb2R1bGVXaWR0aEhlaWdodCkpIHsNCisgICAgICAgIHZhbCA9IChGWF9JTlQzMiltTW9kdWxlV2lkdGhIZWlnaHQuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlSGVpZ2h0KEZYX0lOVDMyJiB2YWwpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1Nb2R1bGVXaWR0aEhlaWdodDsNCisgICAgaWYgKHBVSUNoaWxkLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBtTW9kdWxlV2lkdGhIZWlnaHQpKSB7DQorICAgICAgICB2YWwgPSAoRlhfSU5UMzIpbU1vZHVsZVdpZHRoSGVpZ2h0LlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oRlhfQk9PTCYgdmFsKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgRlhfQk9PTCBiUHJpbnRDaGVja0RpZ2l0Ow0KKyAgICBpZihwVUlDaGlsZC0+VHJ5Qm9vbGVhbihYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwgYlByaW50Q2hlY2tEaWdpdCkpIHsNCisgICAgICAgIHZhbCA9IGJQcmludENoZWNrRGlnaXQ7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1RleHRMb2NhdGlvbihGWF9JTlQzMiYgdmFsKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZVRleHRMb2NhdGlvbjsNCisgICAgaWYgKHBVSUNoaWxkLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfVGV4dExvY2F0aW9uLCBlVGV4dExvY2F0aW9uKSkgew0KKyAgICAgICAgc3dpdGNoKGVUZXh0TG9jYXRpb24pIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgICAgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX05PTkU7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmU6DQorICAgICAgICAgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0FCT1ZFOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93Og0KKyAgICAgICAgICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19CRUxPVzsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZUVtYmVkZGVkOg0KKyAgICAgICAgICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93RW1iZWRkZWQ6DQorICAgICAgICAgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQ7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoRlhfQk9PTCYgdmFsKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgRlhfQk9PTCBiVHJ1bmNhdGU7DQorICAgIGlmKHBVSUNoaWxkLT5UcnlCb29sZWFuKFhGQV9BVFRSSUJVVEVfVHJ1bmNhdGUsIGJUcnVuY2F0ZSkpIHsNCisgICAgICAgIHZhbCA9IGJUcnVuY2F0ZTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKEZYX0ZMT0FUJiB2YWwpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1dpZGVOYXJyb3dSYXRpbzsNCisgICAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywgd3NXaWRlTmFycm93UmF0aW8pKSB7DQorICAgICAgICBGWF9TVFJTSVpFIHB0UG9zID0gd3NXaWRlTmFycm93UmF0aW8uRmluZCgnOicpOw0KKyAgICAgICAgRlhfRkxPQVQgICBmUmF0aW8gPSAwOw0KKyAgICAgICAgaWYocHRQb3MgPj0gMCkgew0KKyAgICAgICAgICAgIGZSYXRpbyA9IChGWF9GTE9BVClGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfSU5UMzIgZkEsIGZCOw0KKyAgICAgICAgICAgIGZBID0gRlhTWVNfd3RvaSh3c1dpZGVOYXJyb3dSYXRpby5MZWZ0KHB0UG9zKSk7DQorICAgICAgICAgICAgZkIgPSBGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvLk1pZChwdFBvcyArIDEpKTsNCisgICAgICAgICAgICBpZihmQikgew0KKyAgICAgICAgICAgICAgICBmUmF0aW8gPSAoRlhfRkxPQVQpZkEgLyBmQjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB2YWwgPSBmUmF0aW87DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRQYXNzd29yZENoYXIoQ0ZYX1dpZGVTdHJpbmcgJndzUGFzc1dvcmQpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1Bhc3N3b3JkQ2hhciwgd3NQYXNzV29yZCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB3c1Bhc3NXb3JkID0gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsIFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc0FsbG93UmljaFRleHQoKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgICAgRlhfQk9PTCBiVmFsdWUgPSBGQUxTRTsNCisgICAgaWYgKHBVSUNoaWxkICYmIHBVSUNoaWxkLT5UcnlCb29sZWFuKFhGQV9BVFRSSUJVVEVfQWxsb3dSaWNoVGV4dCwgYlZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgIHJldHVybiBiVmFsdWU7DQorICAgIH0NCisgICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSkpIHsNCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICAgICAgICByZXR1cm4gcENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzTXVsdGlMaW5lKCkNCit7DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICAgIGlmIChwVUlDaGlsZCkgew0KKyAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lKTsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FTEVNRU5UX1RleHRFZGl0LCBYRkFfQVRUUklCVVRFX011bHRpTGluZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpDQorew0KKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAocFVJQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3kpOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfVGV4dEVkaXQsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhDaGFycyhYRkFfRUxFTUVOVCYgZVR5cGUpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKSkgew0KKyAgICAgICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgICAgICAgIHN3aXRjaChwQ2hpbGQtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgICAgICAgICAgICAgICBlVHlwZSA9IFhGQV9FTEVNRU5UX1RleHQ7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcENoaWxkLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMpOw0KKyAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4RGF0YTogew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfRXhEYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlNYXggPSBwQ2hpbGQtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpTWF4IDwgMCA/IDAgOiBpTWF4Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0RnJhY0RpZ2l0cyhGWF9JTlQzMiAmaUZyYWNEaWdpdHMpDQorew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKSkgew0KKyAgICAgICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0RlY2ltYWwpKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIGlGcmFjRGlnaXRzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpRnJhY0RpZ2l0cyA9IC0xOw0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRMZWFkRGlnaXRzKEZYX0lOVDMyICZpTGVhZERpZ2l0cykNCit7DQorICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQorICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRGVjaW1hbCkpIHsNCisgICAgICAgICAgICByZXR1cm4gcENoaWxkLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywgaUxlYWREaWdpdHMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlMZWFkRGlnaXRzID0gLTE7DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorc3RhdGljIENGWF9XaWRlU3RyaW5nIFhGQV9OdW1lcmljTm9ybWFsaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlLCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWNpbWFsU3ltYm9sOw0KKyAgICBpZiAocExvY2FsZSkgew0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRGVjaW1hbFN5bWJvbCk7DQorICAgIH0NCisgICAgaWYgKHdzRGVjaW1hbFN5bWJvbC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHdzRGVjaW1hbFN5bWJvbCA9ICcuJzsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlKHdzVmFsdWUpOw0KKyAgICB3c05ld1ZhbHVlLlRyaW1MZWZ0KEwiICIpOw0KKyAgICB3c05ld1ZhbHVlLlRyaW1MZWZ0KEwiMCIpOw0KKyAgICB3c05ld1ZhbHVlLlRyaW1SaWdodChMIiAiKTsNCisgICAgRlhfSU5UMzIgaUNvdW50CT0gd3NOZXdWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIwIik7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUluZGV4ID0gMDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQorICAgIEZYX0xQV1NUUiBwUmV0QnVmZmVyID0gd3NSZXQuR2V0QnVmZmVyKGlDb3VudCk7DQorICAgIEZYX0lOVDMyIGlEZXN0Q291bnQgPSAwOw0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgaWYgKHdzTmV3VmFsdWVbaV0gPT0gTCctJykgew0KKyAgICAgICAgcFJldEJ1ZmZlcltpSW5kZXgrK10gPSAnLSc7DQorICAgIH0gZWxzZSBpZiAod3NOZXdWYWx1ZVtpXSA9PSBMJysnKSB7DQorICAgICAgICBpKys7DQorICAgIH0NCisgICAgRlhfQk9PTAliSGFzUG9pbnQgPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgbkNoYXJTdGFydCA9IC0xOw0KKyAgICBmb3IgKCA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCisgICAgICAgIEZYX1dDSEFSIHdjID0gd3NOZXdWYWx1ZVtpXTsNCisgICAgICAgIGlmIChYRkFfSXNEaWdpdCh3YykpIHsNCisgICAgICAgICAgICBpZiAobkNoYXJTdGFydCAhPSAtMSkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDaGFyKChGWF9MUENXU1RSKXdzTmV3VmFsdWUgKyBuQ2hhclN0YXJ0LCBpIC0gbkNoYXJTdGFydCk7DQorICAgICAgICAgICAgICAgIGlmICh3c0NoYXIgPT0gJy4nIHx8IHdzQ2hhciA9PSB3c0RlY2ltYWxTeW1ib2wpIHsNCisgICAgICAgICAgICAgICAgICAgIGJIYXNQb2ludCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICBuQ2hhclN0YXJ0ID0gLTE7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwUmV0QnVmZmVyWzBdID0gJzAnOw0KKyAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gMTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBSZXRCdWZmZXJbaUluZGV4KytdID0gd2M7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYkhhc1BvaW50KSB7DQorICAgICAgICAgICAgcFJldEJ1ZmZlclswXSA9ICcwJzsNCisgICAgICAgICAgICBpQ291bnQgPSAxOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5DaGFyU3RhcnQgPT0gLTEpIHsNCisgICAgICAgICAgICBuQ2hhclN0YXJ0ID0gaTsNCisgICAgICAgICAgICBwUmV0QnVmZmVyW2lJbmRleCsrXSA9IHdjOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHdzUmV0LlJlbGVhc2VCdWZmZXIoaUNvdW50KTsNCisgICAgcmV0dXJuIHdzUmV0Ow0KK30NCitDRlhfV2lkZVN0cmluZyBYRkFfTnVtZXJpY0xpbWl0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlLCBGWF9JTlQzMiBpTGVhZCwgRlhfSU5UMzIgaVRyZWFkKQ0KK3sNCisgICAgaWYgKChpTGVhZCA9PSAtIDEpICAmJiAoaVRyZWFkID09IC0xKSkgew0KKyAgICAgICAgcmV0dXJuIHdzVmFsdWU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQorICAgIEZYX0lOVDMyIGlMZWFkXyA9IDAsIGlUcmVhZF8gPSAtMTsNCisgICAgRlhfSU5UMzIgaUNvdW50ID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICByZXR1cm4gd3NWYWx1ZTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpID0gMDsNCisgICAgaWYgKHdzVmFsdWVbaV0gPT0gTCctJykgew0KKyAgICAgICAgd3NSZXQgKz0gTCctJzsNCisgICAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBmb3IgKDsgaSA8IGlDb3VudDsgaSArKykgew0KKyAgICAgICAgRlhfV0NIQVIgd2MgPSB3c1ZhbHVlW2ldOw0KKyAgICAgICAgaWYgKFhGQV9Jc0RpZ2l0KHdjKSkgew0KKyAgICAgICAgICAgIGlmIChpTGVhZCA+PSAwKSB7DQorICAgICAgICAgICAgICAgIGlMZWFkXyArKzsNCisgICAgICAgICAgICAgICAgaWYgKGlMZWFkXyA+IGlMZWFkKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTCIwIjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaVRyZWFkXyA+PSAwKSB7DQorICAgICAgICAgICAgICAgIGlUcmVhZF8gKys7DQorICAgICAgICAgICAgICAgIGlmIChpVHJlYWRfID4gaVRyZWFkKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoaVRyZWFkICE9IC0xKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RlY2ltYWwgd3NEZWNpID0gQ0ZYX0RlY2ltYWwod3NWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NEZWNpLlNldFNjYWxlKGlUcmVhZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NSZXQgPSB3c0RlY2k7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3NSZXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHdjID09IEwnLicpIHsNCisgICAgICAgICAgICBpVHJlYWRfID0gMDsNCisgICAgICAgICAgICBpTGVhZCA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NSZXQgKz0gd2M7DQorICAgIH0NCisgICAgcmV0dXJuIHdzUmV0Ow0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkNCit7DQorICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgU3luY1ZhbHVlKHdzVmFsdWUsIFRSVUUpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdUZXh0KHdzVmFsdWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICAgIEdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgZVZhbHVlVHlwZSk7DQorICAgIEZYX0JPT0wgYk5vcm1hbGl6ZU51bSA9IFRSVUU7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBHZXRVSUNoaWxkKCk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIFhGQV9FTEVNRU5UIHVpVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQorICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCisgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7DQorICAgICAgICBpZiAoIXdpZGdldFZhbHVlLlZhbGlkYXRlVmFsdWUod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCAmd3NQaWN0dXJlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdpZGdldFZhbHVlID0gQ1hGQV9Mb2NhbGVWYWx1ZSh3aWRnZXRWYWx1ZS5HZXRUeXBlKCksIHdzTmV3VGV4dCwgd3NQaWN0dXJlLCBwTG9jYWxlLCBwTG9jYWxNZ3IpOw0KKyAgICAgICAgd3NOZXdUZXh0ID0gd2lkZ2V0VmFsdWUuR2V0VmFsdWUoKTsNCisgICAgICAgIGlmICh1aVR5cGUgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVhZERpZ2l0cyA9IDA7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUZyYWNEaWdpdHMgPSAwOw0KKyAgICAgICAgICAgIEdldExlYWREaWdpdHMoaUxlYWREaWdpdHMpOw0KKyAgICAgICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgICAgIHdzTmV3VGV4dCA9IFhGQV9OdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgICAgIGJOb3JtYWxpemVOdW0gPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAodWlUeXBlID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0ICYmIGJOb3JtYWxpemVOdW0pIHsNCisgICAgICAgIGlmICh3c05ld1RleHQgIT0gRlhfV1NUUkMoTCIwIikpIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTGVhZERpZ2l0cyA9IDA7DQorICAgICAgICAgICAgRlhfSU5UMzIgaUZyYWNEaWdpdHMgPSAwOw0KKyAgICAgICAgICAgIEdldExlYWREaWdpdHMoaUxlYWREaWdpdHMpOw0KKyAgICAgICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgICAgIHdzTmV3VGV4dCA9IFhGQV9OdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIFN5bmNWYWx1ZSh3c05ld1RleHQsIFRSVUUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldFBpY3R1cmVDb250ZW50KENGWF9XaWRlU3RyaW5nICZ3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkUgZVBpY3R1cmUpDQorew0KKyAgICBpZiAoZVBpY3R1cmUgPT0gWEZBX1ZBTFVFUElDVFVSRV9SYXcpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOw0KKyAgICBzd2l0Y2goZVBpY3R1cmUpIHsNCisgICAgICAgIGNhc2UgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5OiB7DQorICAgICAgICAgICAgICAgIGlmIChDWEZBX05vZGUqIHBGb3JtYXQgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Gb3JtYXQpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IHBGb3JtYXQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQorICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1R5cGUgPSB3aWRnZXRWYWx1ZS5HZXRUeXBlKCk7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdUeXBlKSB7DQorICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLCB3c1BpY3R1cmUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCisgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwgd3NQaWN0dXJlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLCB3c0RhdGFQaWN0dXJlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwgd3NUaW1lUGljdHVyZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlID0gd3NEYXRhUGljdHVyZSArIEZYX1dTVFJDKEwiVCIpICsgd3NUaW1lUGljdHVyZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RFQ0lNQUw6DQorICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9GTE9BVDoNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDogew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBVSSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VpKTsNCisgICAgICAgICAgICAgICAgaWYgKHBVSSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBwVUktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQorICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VHlwZSA9IHdpZGdldFZhbHVlLkdldFR5cGUoKTsNCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdUeXBlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwgd3NQaWN0dXJlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwgd3NQaWN0dXJlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsIHdzRGF0YVBpY3R1cmUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LCB3c1RpbWVQaWN0dXJlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlID0gd3NEYXRhUGljdHVyZSArIEwiVCIgKyB3c1RpbWVQaWN0dXJlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZDogew0KKyAgICAgICAgICAgICAgICBpZiAoQ1hGQV9CaW5kIGJpbmQgPSBHZXRCaW5kKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGJpbmQuR2V0UGljdHVyZSh3c1BpY3R1cmUpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorSUZYX0xvY2FsZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRMb2NhbCgpDQorew0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gcExvY2FsZTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJMb2NhbGUgPSBGQUxTRTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMb2NhbGVOYW1lOw0KKyAgICBiTG9jYWxlID0gbV9wTm9kZS0+R2V0TG9jYWxlTmFtZSh3c0xvY2FsZU5hbWUpOw0KKyAgICBpZiAoYkxvY2FsZSkgew0KKyAgICAgICAgaWYgKHdzTG9jYWxlTmFtZS5FcXVhbChGWF9XU1RSQyhMImFtYmllbnQiKSkpIHsNCisgICAgICAgICAgICBwTG9jYWxlID0gbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0RGVmTG9jYWxlKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBMb2NhbGUgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXRMb2NhbGVCeU5hbWUod3NMb2NhbGVOYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcExvY2FsZTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX1NwbGl0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsIENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpDQorew0KKyAgICB3c0RhdGUgPSBMIiI7DQorICAgIHdzVGltZSA9IEwiIjsNCisgICAgaWYgKHdzRGF0ZVRpbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaW50IG5TcGxpdEluZGV4ID0gLTE7DQorICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQorICAgIGlmIChuU3BsaXRJbmRleCA8IDApIHsNCisgICAgICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICAgIH0NCisgICAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQorICAgIGlmICghd3NEYXRlLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gd3NEYXRlLkdldExlbmd0aCgpOw0KKyAgICAgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgICBpZiAod3NEYXRlW2ldID49ICcwJyAmJiB3c0RhdGVbaV0gPD0gJzknKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpID09IGlDb3VudCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOw0KKyAgICBpZiAoIXdzVGltZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHdzVGltZS5HZXRMZW5ndGgoKTsNCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKHdzVGltZVtpXSA+PSAnMCcgJiYgd3NUaW1lW2ldIDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaSA9PSBpQ291bnQpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KKyNpZm5kZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KK0ZYX0JPT0wgQ1hGQV9GaWVsZE5vZGVfSXNSaWNoVGV4dEVkaXQoQ1hGQV9Ob2RlICpwRmllbGROb2RlLCBJRkRFX1hNTE5vZGUgKiZwWE1MTm9kZSkNCit7DQorICAgIEZYX0JPT0wgYlJpY2hUZXh0RWRpdCA9IEZBTFNFOw0KKyAgICBwWE1MTm9kZSA9IE5VTEw7DQorICAgIGlmIChwRmllbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcEZpZWxkTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICAgICAgaWYgKCFwVmFsdWUpIHsNCisgICAgICAgICAgICByZXR1cm4gYlJpY2hUZXh0RWRpdDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGlmICghcENoaWxkVmFsdWUpIHsNCisgICAgICAgICAgICByZXR1cm4gYlJpY2hUZXh0RWRpdDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ2hpbGRWYWx1ZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgICAgcENoaWxkVmFsdWUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgICAgYlJpY2hUZXh0RWRpdCA9IHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSk7DQorICAgICAgICAgICAgaWYoYlJpY2hUZXh0RWRpdCkgew0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJYTUxJbkRhdGEgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwRmllbGROb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUgKnBCaW5kWE1MID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBCaW5kWE1MKTsNCisgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSAqcFZhbHVlWE1MID0gcEJpbmRYTUwtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlWE1MICYmIHBWYWx1ZVhNTC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwWE1MTm9kZSA9IHBWYWx1ZVhNTDsNCisgICAgICAgICAgICAgICAgICAgICAgICBiWE1MSW5EYXRhID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoIWJYTUxJbkRhdGEpIHsNCisgICAgICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gcENoaWxkVmFsdWUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJSaWNoVGV4dEVkaXQ7DQorfQ0KKyNlbmRpZg0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRWYWx1ZShDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKQ0KK3sNCisjaWZkZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KKyAgICB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0Q29udGVudCgpOw0KKyNlbHNlDQorICAgIElGREVfWE1MTm9kZSAqcFhNTE5vZGUgPSBOVUxMOw0KKyAgICBGWF9CT09MIGJSaWNoVGV4dEVkaXQgPSBDWEZBX0ZpZWxkTm9kZV9Jc1JpY2hUZXh0RWRpdChtX3BOb2RlLCBwWE1MTm9kZSk7DQorICAgIGlmIChiUmljaFRleHRFZGl0KSB7DQorICAgICAgICBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KHBYTUxOb2RlLCB3c1ZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHdzVmFsdWUgPSBtX3BOb2RlLT5HZXRDb250ZW50KCk7DQorICAgIH0NCisjZW5kaWYNCisgICAgaWYgKGVWYWx1ZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSB7DQorICAgICAgICBHZXRJdGVtTGFiZWwod3NWYWx1ZSwgd3NWYWx1ZSk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIGVWYWx1ZVR5cGUpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gR2V0VUlDaGlsZCgpOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBYRkFfRUxFTUVOVCB1aVR5cGUgPSBHZXRVSUNoaWxkKCktPkdldENsYXNzSUQoKTsNCisgICAgc3dpdGNoKHVpVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0OiB7DQorICAgICAgICAgICAgICAgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkgew0KKyAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaVNlbEl0ZW1JbmRleCA9IEdldFNlbGVjdGVkSXRlbSgwKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpU2VsSXRlbUluZGV4ID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpU2VsSXRlbUluZGV4KTsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUuRW1wdHkoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6DQorICAgICAgICAgICAgaWYoZVZhbHVlVHlwZSAhPSBYRkFfVkFMVUVQSUNUVVJFX1JhdyAmJiB3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOw0KKyAgICAgICAgICAgICAgICBpZiAoZVZhbHVlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkgJiYgcExvY2FsZSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVOdW1TdHIod3NWYWx1ZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICAgICAgRm9ybWF0TnVtU3RyKHdzT3V0cHV0LCBwTG9jYWxlLCB3c091dHB1dCk7DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gd3NPdXRwdXQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKSkgew0KKyAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCisgICAgICAgIENYRkFfTG9jYWxlTWdyICpwTG9jYWxNZ3IgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOw0KKyAgICAgICAgc3dpdGNoICh3aWRnZXRWYWx1ZS5HZXRUeXBlKCkpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGRhdGUoWEZBX1ZUX0RBVEUsIHdzRGF0ZSwgcExvY2FsTWdyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIGVWYWx1ZVR5cGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRTogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX1NwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE5vcm1hbGl6ZURhdGFWYWx1ZShGWF9XU1RSIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nICZ3c05vcm1hbGl6ZVZhbHVlKQ0KK3sNCisgICAgd3NOb3JtYWxpemVWYWx1ZSA9IHdzVmFsdWU7DQorICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KKyAgICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KEdldE5vZGUoKSk7DQorICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBHZXROb2RlKCktPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOw0KKyAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOw0KKyAgICBpZiAod2lkZ2V0VmFsdWUuVmFsaWRhdGVWYWx1ZSh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsICZ3c1BpY3R1cmUpKSB7DQorICAgICAgICB3aWRnZXRWYWx1ZSA9IENYRkFfTG9jYWxlVmFsdWUod2lkZ2V0VmFsdWUuR2V0VHlwZSgpLCB3c05vcm1hbGl6ZVZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIHBMb2NhbE1ncik7DQorICAgICAgICB3c05vcm1hbGl6ZVZhbHVlID0gd2lkZ2V0VmFsdWUuR2V0VmFsdWUoKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEZvcm1hdERhdGFWYWx1ZShGWF9XU1RSIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdGVkVmFsdWUpDQorew0KKyAgICB3c0Zvcm1hdGVkVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgICAgR2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgICAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKSkgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEdldE5vZGUoKSk7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlVmFsdWUgPSBHZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgIGlmICghcE5vZGVWYWx1ZSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBpZiAoIXBWYWx1ZUNoaWxkKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfSU5UMzIgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwVmFsdWVDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGVjaW1hbDoNCisgICAgICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9ERUNJTUFMOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Zsb2F0Og0KKyAgICAgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGU6DQorICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UaW1lOg0KKyAgICAgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RJTUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWU6DQorICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9vbGVhbjoNCisgICAgICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9CT09MRUFOOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ludGVnZXI6DQorICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfSU5URUdFUjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0xvY2FsZU1nciAqcExvY2FsTWdyID0gR2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOw0KKyAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShpVlRUeXBlLCB3c1ZhbHVlLCBwTG9jYWxNZ3IpOw0KKyAgICAgICAgc3dpdGNoICh3aWRnZXRWYWx1ZS5HZXRUeXBlKCkpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGRhdGUoWEZBX1ZUX0RBVEUsIHdzRGF0ZSwgcExvY2FsTWdyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c0Zvcm1hdGVkVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRpbWUoWEZBX1ZUX1RJTUUsIHdzVGltZSwgcExvY2FsTWdyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZS5Gb3JtYXRQYXR0ZXJucyh3c0Zvcm1hdGVkVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpOb3JtYWxpemVOdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHdzT3V0cHV0ID0gd3NWYWx1ZTsNCisgICAgd3NPdXRwdXQuVHJpbUxlZnQoJzAnKTsNCisgICAgRlhfSU5UMzIgZG90X2luZGV4ID0gd3NPdXRwdXQuRmluZCgnLicpOw0KKyAgICBGWF9JTlQzMiBpRnJhY0RpZ2l0cyA9IDA7DQorICAgIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpICYmIGRvdF9pbmRleCA+PSAwICYmICghR2V0RnJhY0RpZ2l0cyhpRnJhY0RpZ2l0cykgfHwgaUZyYWNEaWdpdHMgIT0gLTEpKSB7DQorICAgICAgICB3c091dHB1dC5UcmltUmlnaHQoKEZYX0xQQ1dTVFIpTCIwIik7DQorICAgICAgICB3c091dHB1dC5UcmltUmlnaHQoKEZYX0xQQ1dTVFIpTCIuIik7DQorICAgIH0NCisgICAgaWYgKHdzT3V0cHV0LklzRW1wdHkoKSB8fCB3c091dHB1dFswXSA9PSAnLicpIHsNCisgICAgICAgIHdzT3V0cHV0Lkluc2VydCgwLCAnMCcpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpGb3JtYXROdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIElGWF9Mb2NhbGUqIHBMb2NhbGUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCit7DQorICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NWYWx1ZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQorICAgIGlmICh3c1NyY051bVswXSA9PSAnLScpIHsNCisgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGxlbiA9IHdzU3JjTnVtLkdldExlbmd0aCgpOw0KKyAgICBGWF9JTlQzMiBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7DQorICAgIGlmIChkb3RfaW5kZXggPT0gLTEpIHsNCisgICAgICAgIGRvdF9pbmRleCA9IGxlbjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBjYyA9IGRvdF9pbmRleCAtIDE7DQorICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICBpbnQgblBvcyA9IGRvdF9pbmRleCAlIDM7DQorICAgICAgICB3c091dHB1dC5FbXB0eSgpOw0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGRvdF9pbmRleDsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGkgJSAzID09IG5Qb3MgJiYgaSAhPSAwKSB7DQorICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtW2ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NTcmNOdW0uUmlnaHQobGVuIC0gZG90X2luZGV4IC0gMSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6U3luY1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpDQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVmFsdWUpOw0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gbV9wTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7DQorICAgIH0NCisgICAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5KTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6Okluc2VydExpc3RUZXh0SXRlbShDWEZBX05vZGUqIHBJdGVtcywgRlhfV1NUUiB3c1RleHQsIEZYX0lOVDMyIG5JbmRleCApDQorew0KKyAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9UZXh0KTsNCisgICAgcEl0ZW1zLT5JbnNlcnRDaGlsZChuSW5kZXgsIHBUZXh0KTsNCisgICAgcFRleHQtPlNldENvbnRlbnQod3NUZXh0LCB3c1RleHQsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOw0KK30NCitDWEZBX0ZpbHRlciBDWEZBX1dpZGdldERhdGE6OkdldEZpbHRlcihGWF9CT09MIGJNb2RpZmllZCkNCit7DQorICAgIGlmICghbV9wVWlDaGlsZE5vZGUpIHsNCisgICAgICAgIHJldHVybiBDWEZBX0ZpbHRlcihOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbV9wVWlDaGlsZE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZpbHRlciwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9NYW5pZmVzdCBDWEZBX1dpZGdldERhdGE6OkdldE1hbmlmZXN0KEZYX0JPT0wgYk1vZGlmaWVkKQ0KK3sNCisgICAgaWYgKCFtX3BVaUNoaWxkTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIENYRkFfTWFuaWZlc3QoTlVMTCk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFVpQ2hpbGROb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NYW5pZmVzdCwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9PY2N1cjo6Q1hGQV9PY2N1cihDWEZBX05vZGUgKnBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkNCit7IH0NCitGWF9JTlQzMiBDWEZBX09jY3VyOjpHZXRNYXgoKQ0KK3sNCisgICAgRlhfSU5UMzIgaU1heCA9IDE7DQorICAgIGlmIChtX3BOb2RlKSB7DQorICAgICAgICBpZighbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgVFJVRSkpIHsNCisgICAgICAgICAgICBpTWF4ID0gIEdldE1pbigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpTWF4Ow0KK30NCitGWF9JTlQzMiBDWEZBX09jY3VyOjpHZXRNaW4oKQ0KK3sNCisgICAgRlhfSU5UMzIgaU1pbiA9IDE7DQorICAgIGlmIChtX3BOb2RlKSB7DQorICAgICAgICBpZighbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgVFJVRSkgfHwgaU1pbiA8IDApIHsNCisgICAgICAgICAgICBpTWluID0gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gaU1pbjsNCit9DQorRlhfSU5UMzIgQ1hGQV9PY2N1cjo6R2V0SW5pdGlhbCgpDQorew0KKyAgICBGWF9JTlQzMiBpSW5pdCA9IDE7DQorICAgIGlmIChtX3BOb2RlKSB7DQorICAgICAgICBGWF9JTlQzMiBpTWluID0gR2V0TWluKCk7DQorICAgICAgICBpZighbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0luaXRpYWwsIGlJbml0LCBUUlVFKSB8fCBpSW5pdCA8IGlNaW4pIHsNCisgICAgICAgICAgICBpSW5pdCA9IGlNaW47DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGlJbml0Ow0KK30NCitGWF9CT09MIENYRkFfT2NjdXI6OkdldE9jY3VySW5mbyhGWF9JTlQzMiYgaU1pbiwgRlhfSU5UMzImIGlNYXgsIEZYX0lOVDMyJiBpSW5pdCkNCit7DQorICAgIGlmKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKSB8fCBpTWluIDwgMCkgew0KKyAgICAgICAgaU1pbiA9IDE7DQorICAgIH0NCisgICAgaWYoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKSkgew0KKyAgICAgICAgaWYoaU1pbiA9PSAwKSB7DQorICAgICAgICAgICAgaU1heCA9IDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlNYXggPSBpTWluOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgaUluaXQsIEZBTFNFKSB8fCBpSW5pdCA8IGlNaW4pIHsNCisgICAgICAgIGlJbml0ID0gaU1pbjsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX09jY3VyOjpTZXRNYXgoRlhfSU5UMzIgaU1heCkNCit7DQorICAgIGlNYXggPSAoaU1heCAhPSAtMSAmJiBpTWF4IDwgMSkgPyAxIDogaU1heDsNCisgICAgbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgRkFMU0UpOw0KKyAgICBGWF9JTlQzMiBpTWluID0gR2V0TWluKCk7DQorICAgIGlmIChpTWF4ICE9IC0xICYmIGlNYXggPCBpTWluKSB7DQorICAgICAgICBpTWluID0gaU1heDsNCisgICAgICAgIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfT2NjdXI6OlNldE1pbihGWF9JTlQzMiBpTWluKQ0KK3sNCisgICAgaU1pbiA9IChpTWluIDwgMCkgPyAxIDogaU1pbjsNCisgICAgbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgRkFMU0UpOw0KKyAgICBGWF9JTlQzMiBpTWF4ID0gR2V0TWF4KCk7DQorICAgIGlmIChpTWF4ID4gMCAmJiBpTWF4IDwgaU1pbikgew0KKyAgICAgICAgaU1heCA9IGlNaW47DQorICAgICAgICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQorICAgIH0NCit9DQorWEZBX0FUVFJJQlVURUVOVU0gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKENYRkFfTm9kZSogcE5vZGUsIFhGQV9BVFRSSUJVVEUgYXR0cmlidXRlVmFsdWUgPSBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVFTlVNIGVEZWZhdWx0VmFsdWUgPSBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbCkNCit7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVUeXBlID0gZURlZmF1bHRWYWx1ZTsNCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgICBpZiAoIXBOb2RlLT5UcnlFbnVtKGF0dHJpYnV0ZVZhbHVlLCBlVHlwZSwgVFJVRSkpIHsNCisgICAgICAgICAgICBlVHlwZSA9IGVEZWZhdWx0VmFsdWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGVUeXBlOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0RmlsdGVyU3RyaW5nKFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzU3RyaW5nVmFsdWU7DQorICAgIGlmIChtX3BOb2RlKSB7DQorICAgICAgICBtX3BOb2RlLT5HZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NTdHJpbmdWYWx1ZSwgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiB3c1N0cmluZ1ZhbHVlOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0QXBwZWFyYW5jZUZpbHRlclR5cGUoKQ0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQXBwZWFyYW5jZUZpbHRlck5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyKTsNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwQXBwZWFyYW5jZUZpbHRlck5vZGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0QXBwZWFyYW5jZUZpbHRlckNvbnRlbnQoKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICBpZiAobV9wTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQXBwZWFyYW5jZUZpbHRlck5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyKTsNCisgICAgICAgIHBBcHBlYXJhbmNlRmlsdGVyTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICB9DQorICAgIHJldHVybiB3c0NvbnRlbnQ7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNDcmVkZW50aWFsU2VydmVyUG9saWN5KCkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocENlcnRzTm9kZSwgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5KTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc1VSTCgpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1VSTDsNCisgICAgaWYgKG1fcE5vZGUpIHsNCisgICAgICAgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICAgICAgICBwQ2VydHNOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9VcmwsIHdzVVJMLCBGQUxTRSk7DQorICAgIH0NCisgICAgcmV0dXJuIHdzVVJMOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzVVJMUG9saWN5KCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMUG9saWN5Ow0KKyAgICBpZiAobV9wTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzKTsNCisgICAgICAgIHBDZXJ0c05vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1VybFBvbGljeSwgd3NVUkxQb2xpY3ksIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gd3NVUkxQb2xpY3k7DQorfQ0KK0NYRkFfV3JhcENlcnRpZmljYXRlIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNFbmNyeXB0aW9uKEZYX0JPT0wgYk1vZGlmaWVkKQ0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoTlVMTCk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLCBiTW9kaWZpZWQpOw0KKyAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUocENlcnRzTm9kZSA/IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb24sIGJNb2RpZmllZCkgOiBOVUxMKTsNCit9DQorQ1hGQV9XcmFwQ2VydGlmaWNhdGUgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0lzc3VlcnMoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoTlVMTCk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLCBiTW9kaWZpZWQpOw0KKyAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUocENlcnRzTm9kZSA/IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0lzc3VlcnMsIGJNb2RpZmllZCkgOiBOVUxMKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0tleVVzYWdlU3RyaW5nKFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzKTsNCisgICAgQ1hGQV9Ob2RlKiBwS2V5VXNhZ2VOb2RlID0gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfS2V5VXNhZ2UpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZVZhbHVlOw0KKyAgICBwS2V5VXNhZ2VOb2RlLT5HZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NBdHRyaWJ1dGVWYWx1ZSwgRkFMU0UpOw0KKyAgICByZXR1cm4gd3NBdHRyaWJ1dGVWYWx1ZTsNCit9DQorQ1hGQV9PaWRzIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNPaWRzKCkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIENYRkFfT2lkcyhOVUxMKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMpOw0KKyAgICByZXR1cm4gQ1hGQV9PaWRzKHBDZXJ0c05vZGUgPyBwQ2VydHNOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9PaWRzKSA6IE5VTEwpOw0KK30NCitDWEZBX1dyYXBDZXJ0aWZpY2F0ZSBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzU2lnbmluZyhGWF9CT09MIGJNb2RpZmllZCApDQorew0KKyAgICBpZiAoIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShOVUxMKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIGJNb2RpZmllZCk7DQorICAgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShwQ2VydHNOb2RlID8gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbmluZywgYk1vZGlmaWVkKSA6IE5VTEwpOw0KK30NCitDWEZBX0RpZ2VzdE1ldGhvZHMgQ1hGQV9GaWx0ZXI6OkdldERpZ2VzdE1ldGhvZHMoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgcmV0dXJuIENYRkFfRGlnZXN0TWV0aG9kcyhtX3BOb2RlID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgYk1vZGlmaWVkKSA6IE5VTEwpOw0KK30NCitDWEZBX0VuY29kaW5ncyBDWEZBX0ZpbHRlcjo6R2V0RW5jb2RpbmdzKEZYX0JPT0wgYk1vZGlmaWVkICkNCit7DQorICAgIHJldHVybiBDWEZBX0VuY29kaW5ncyhtX3BOb2RlID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRW5jb2RpbmdzLCBiTW9kaWZpZWQpIDogTlVMTCk7DQorfQ0KK0NYRkFfRW5jcnlwdGlvbk1ldGhvZHMgQ1hGQV9GaWx0ZXI6OkdldEVuY3J5cHRpb25NZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkICkNCit7DQorICAgIHJldHVybiBDWEZBX0VuY3J5cHRpb25NZXRob2RzKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kcywgYk1vZGlmaWVkKSA6IE5VTEwpOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0SGFuZGxlclR5cGUoKQ0KK3sNCisgICAgaWYgKCFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwSGFuZGxlck5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9IYW5kbGVyKTsNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwSGFuZGxlck5vZGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0SGFuZGxlckNvbnRlbnQoKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICBpZiAobV9wTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwSGFuZGxlck5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9IYW5kbGVyKTsNCisgICAgICAgIHBIYW5kbGVyTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICB9DQorICAgIHJldHVybiB3c0NvbnRlbnQ7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRsb2NrRG9jdW1lbnRUeXBlKCkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcExvY2tEb2NOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50KTsNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwTG9ja0RvY05vZGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0bG9ja0RvY3VtZW50Q29udGVudCgpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQgPSBGWF9XU1RSQyhMImF1dG8iKTsNCisgICAgaWYgKG1fcE5vZGUpIHsNCisgICAgICAgIENYRkFfTm9kZSogcExvY2tEb2NOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50KTsNCisgICAgICAgIHBMb2NrRG9jTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICB9DQorICAgIHJldHVybiB3c0NvbnRlbnQ7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRmlsdGVyOjpHZXRNRFBQZXJtaXNzaW9ucygpDQorew0KKyAgICBGWF9JTlQzMiBpUGVybWlzc2lvbnMgPSAyOw0KKyAgICBpZiAobV9wTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTURQTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01kcCk7DQorICAgICAgICBpZiAoIXBNRFBOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsIGlQZXJtaXNzaW9ucywgVFJVRSkpIHsNCisgICAgICAgICAgICBpUGVybWlzc2lvbnMgPSAyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpUGVybWlzc2lvbnM7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRNRFBTaWduYXR1cmVUeXBlKCkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlcjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBNRFBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWRwKTsNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwTURQTm9kZSwgWEZBX0FUVFJJQlVURV9TaWduYXR1cmVUeXBlLCBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXIpOw0KK30NCitDWEZBX1JlYXNvbnMgQ1hGQV9GaWx0ZXI6OkdldFJlYXNvbnMoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KK3sNCisgICAgcmV0dXJuIENYRkFfUmVhc29ucyhtX3BOb2RlID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUmVhc29ucykgOiBOVUxMKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GaWx0ZXI6OkdldFRpbWVTdGFtcFNlcnZlcigpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1NlcnZlclVSSTsNCisgICAgaWYgKG1fcE5vZGUpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFRpbWVTdGFtcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9UaW1lU3RhbXApOw0KKyAgICAgICAgcFRpbWVTdGFtcE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1NlcnZlciwgd3NTZXJ2ZXJVUkksIEZBTFNFKTsNCisgICAgfQ0KKyAgICByZXR1cm4gd3NTZXJ2ZXJVUkk7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRUaW1lU3RhbXBUeXBlKCkNCit7DQorICAgIGlmICghbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFRpbWVTdGFtcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9UaW1lU3RhbXApOw0KKyAgICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKHBUaW1lU3RhbXBOb2RlKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9DZXJ0aWZpY2F0ZTo6R2V0Q2VydGlmaWNhdGVOYW1lKCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgaWYgKG1fcE5vZGUpIHsNCisgICAgICAgIG1fcE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSwgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiB3c05hbWU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfQ2VydGlmaWNhdGU6OkdldENlcnRpZmljYXRlQ29udGVudCgpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgIGlmIChtX3BOb2RlKSB7DQorICAgICAgICBtX3BOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICAgIH0NCisgICAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9XcmFwQ2VydGlmaWNhdGU6OkdldFR5cGUoKQ0KK3sNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9XcmFwQ2VydGlmaWNhdGU6OkNvdW50Q2VydGlmaWNhdGVzKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSkgOiAwOw0KK30NCitDWEZBX0NlcnRpZmljYXRlIENYRkFfV3JhcENlcnRpZmljYXRlOjpHZXRDZXJ0aWZpY2F0ZShGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICByZXR1cm4gQ1hGQV9DZXJ0aWZpY2F0ZSgobkluZGV4ID4gLTEgJiYgbV9wTm9kZSkgPyBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlKSA6IE5VTEwpOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX09pZHM6OkdldE9pZHNUeXBlKCkNCit7DQorICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfT2lkczo6Q291bnRPaWRzKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9PaWQpIDogMDsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9PaWRzOjpHZXRPaWRDb250ZW50KEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE9pZE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX09pZCk7DQorICAgIGlmICghcE9pZE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgcE9pZE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9TdWJqZWN0RE5zOjpHZXRTdWJqZWN0RE5zVHlwZSgpDQorew0KKyAgICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KK30NCitGWF9JTlQzMiBDWEZBX1N1YmplY3RETnM6OkNvdW50U3ViamVjdEROcygpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfU3ViamVjdEROKSA6IDA7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfU3ViamVjdEROczo6R2V0U3ViamVjdEROU3RyaW5nKEZYX0lOVDMyIG5JbmRleCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwU3ViamVjdEROTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfU3ViamVjdEROKTsNCisgICAgaWYgKCFwU3ViamVjdEROTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGVWYWx1ZTsNCisgICAgcFN1YmplY3RETk5vZGUtPkdldEF0dHJpYnV0ZShlQXR0cmlidXRlLCB3c0F0dHJpYnV0ZVZhbHVlLCBGQUxTRSk7DQorICAgIHJldHVybiB3c0F0dHJpYnV0ZVZhbHVlOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX1N1YmplY3RETnM6OkdldFN1YmplY3RETkNvbnRlbnQoRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwU3ViamVjdEROTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfU3ViamVjdEROKTsNCisgICAgaWYgKCFwU3ViamVjdEROTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICBwU3ViamVjdEROTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0RpZ2VzdE1ldGhvZHM6OkdldERpZ2VzdE1ldGhvZHNUeXBlKCkNCit7DQorICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfRGlnZXN0TWV0aG9kczo6Q291bnREaWdlc3RNZXRob2RzKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2QpIDogMDsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9EaWdlc3RNZXRob2RzOjpHZXREaWdlc3RNZXRob2RDb250ZW50KEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcERpZ2VzdE1ldGhvZE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCk7DQorICAgIGlmICghcERpZ2VzdE1ldGhvZE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgcERpZ2VzdE1ldGhvZE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9FbmNvZGluZ3M6OkdldEVuY29kaW5nc1R5cGUoKQ0KK3sNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FbmNvZGluZ3M6OkNvdW50RW5jb2RpbmdzKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9FbmNvZGluZykgOiAwOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0VuY29kaW5nczo6R2V0RW5jb2RpbmdDb250ZW50KEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEVuY29kaW5nTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfRW5jb2RpbmcpOw0KKyAgICBpZiAoIXBFbmNvZGluZ05vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgcEVuY29kaW5nTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kc1R5cGUoKQ0KK3sNCisgICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kczo6Q291bnRFbmNyeXB0aW9uTWV0aG9kcygpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZCkgOiAwOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kQ29udGVudChGWF9JTlQzMiBuSW5kZXgpDQorew0KKyAgICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBFbmNyeU1ldGhvZE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QpOw0KKyAgICBpZiAoIXBFbmNyeU1ldGhvZE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgcEVuY3J5TWV0aG9kTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX1JlYXNvbnM6OkdldFJlYXNvbnNUeXBlKCkNCit7DQorICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUmVhc29uczo6Q291bnRSZWFzb25zKCkNCit7DQorICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9SZWFzb24pIDogMDsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9SZWFzb25zOjpHZXRSZWFzb25Db250ZW50KEZYX0lOVDMyIG5JbmRleCkNCit7DQorICAgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFJlYXNvbk5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX1JlYXNvbik7DQorICAgIGlmICghcFJlYXNvbk5vZGUpIHsNCisgICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgcFJlYXNvbk5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9NYW5pZmVzdDo6R2V0QWN0aW9uKCkNCit7DQorICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSwgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGUpOw0KK30NCitGWF9JTlQzMiBDWEZBX01hbmlmZXN0OjpDb3VudFJlaXZlcygpDQorew0KKyAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfUmVmKSA6IDA7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTWFuaWZlc3Q6OkdldFJlZkNvbnRlbnQoRlhfSU5UMzIgbkluZGV4KQ0KK3sNCisgICAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfUmVmKTsNCisgICAgaWYgKCFwUmVmTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICBwUmVmTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICByZXR1cm4gd3NDb250ZW50Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjM2U2NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmNwcApAQCAtMCwwICsxLDE0MjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX2Jhc2ljX2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfcGFyc2VyX2ltcC5oIg0KK0lYRkFfUGFyc2VyKiBJWEZBX1BhcnNlcjo6Q3JlYXRlKElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnksIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyKQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX1NpbXBsZVBhcnNlcihwRmFjdG9yeSwgYkRvY3VtZW50UGFyc2VyKTsNCit9DQorQ1hGQV9TaW1wbGVQYXJzZXI6OkNYRkFfU2ltcGxlUGFyc2VyKElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnksIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyICkNCisgICAgOiBtX3BYTUxQYXJzZXIoTlVMTCkNCisgICAgLCBtX3BYTUxEb2MoTlVMTCkNCisgICAgLCBtX3BTdHJlYW0oTlVMTCkNCisgICAgLCBtX3BGYWN0b3J5KHBGYWN0b3J5KQ0KKyAgICAsIG1fZVBhY2tldElEKFhGQV9YRFBQQUNLRVRfVU5LTk9XTikNCisgICAgLCBtX3BSb290Tm9kZShOVUxMKQ0KKyAgICAsIG1fYkRvY3VtZW50UGFyc2VyKGJEb2N1bWVudFBhcnNlcikNCit7DQorfQ0KK0NYRkFfU2ltcGxlUGFyc2VyOjp+Q1hGQV9TaW1wbGVQYXJzZXIoKQ0KK3sNCisgICAgQ2xvc2VQYXJzZXIoKTsNCit9DQordm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6U2V0RmFjdG9yeShJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5KQ0KK3sNCisgICAgbV9wRmFjdG9yeSA9IHBGYWN0b3J5Ow0KK30NCitzdGF0aWMgSUZERV9YTUxOb2RlKiBYRkFfRkRFRXh0ZW5zaW9uX0dldERvY3VtZW50Tm9kZShJRkRFX1hNTERvYyAqcFhNTERvYywgRlhfQk9PTCBiVmVyaWZ5V2VsbEZvcm1uZXNzID0gRkFMU0UpDQorew0KKyAgICBpZighcFhNTERvYykgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRmFrZVJvb3QgPSBwWE1MRG9jLT5HZXRSb290KCk7DQorICAgIGZvcihJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcFhNTEZha2VSb290LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgIGlmKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIGlmKGJWZXJpZnlXZWxsRm9ybW5lc3MpIHsNCisgICAgICAgICAgICAgICAgZm9yKElGREVfWE1MTm9kZSogcE5leHROb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOyBwTmV4dE5vZGU7IHBOZXh0Tm9kZSA9IHBOZXh0Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmKHBOZXh0Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHBYTUxOb2RlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCitGWF9JTlQzMiBDWEZBX1NpbXBsZVBhcnNlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQgKnBTdHJlYW0sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgQ2xvc2VQYXJzZXIoKTsNCisgICAgbV9wRmlsZVJlYWQgPSBwU3RyZWFtOw0KKyAgICBtX3BTdHJlYW0gPSBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0ocFN0cmVhbSwgRlhfU1RSRUFNQUNDRVNTX1JlYWQgfCBGWF9TVFJFQU1BQ0NFU1NfVGV4dCk7DQorICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdHJlYW1FcnI7DQorICAgIH0NCisgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBtX3BTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICAgIGlmICh3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZMRSAmJiB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZCRSAmJiB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICAgICAgbV9wU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCisgICAgfQ0KKyAgICBtX3BYTUxEb2MgPSBJRkRFX1hNTERvYzo6Q3JlYXRlKCk7DQorICAgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICAgIH0NCisgICAgbV9wWE1MUGFyc2VyID0gRlhfTkVXIENYRkFfWE1MUGFyc2VyKG1fcFhNTERvYy0+R2V0Um9vdCgpLCBtX3BTdHJlYW0pOw0KKyAgICBpZiAobV9wWE1MUGFyc2VyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgICB9DQorICAgIGlmICghbV9wWE1MRG9jLT5Mb2FkWE1MKG1fcFhNTFBhcnNlcikpIHsNCisgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgICB9DQorICAgIG1fZVBhY2tldElEID0gZVBhY2tldElEOw0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1JlYWR5Ow0KK30NCitGWF9JTlQzMiBDWEZBX1NpbXBsZVBhcnNlcjo6RG9QYXJzZShJRlhfUGF1c2UgKnBQYXVzZSkNCit7DQorICAgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCB8fCBtX2VQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlSZXQgPSBtX3BYTUxEb2MtPkRvTG9hZChwUGF1c2UpOw0KKyAgICBpZiAoaVJldCA8IDApIHsNCisgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgICB9DQorICAgIGlmIChpUmV0IDwgMTAwKSB7DQorICAgICAgICByZXR1cm4gaVJldCAvIDI7DQorICAgIH0NCisgICAgbV9wUm9vdE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KFhGQV9GREVFeHRlbnNpb25fR2V0RG9jdW1lbnROb2RlKG1fcFhNTERvYyksIG1fZVBhY2tldElEKTsNCisgICAgbV9wWE1MRG9jLT5DbG9zZVhNTCgpOw0KKyAgICBpZiAobV9wU3RyZWFtKSB7DQorICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcFN0cmVhbSA9IE5VTEw7DQorICAgIH0NCisgICAgaWYoIW1fcFJvb3ROb2RlKSB7DQorICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCisgICAgfQ0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX0RvbmU7DQorfQ0KK0ZYX0lOVDMyIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZVhNTERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzWE1MLCBJRkRFX1hNTE5vZGUqICZwWE1MTm9kZSwgSUZYX1BhdXNlICpwUGF1c2UpDQorew0KKyAgICBDbG9zZVBhcnNlcigpOw0KKyAgICBwWE1MTm9kZSA9IE5VTEw7DQorICAgIElGWF9TdHJlYW0qIHBTdHJlYW0gPSBYRkFfQ3JlYXRlV2lkZVRleHRSZWFkKHdzWE1MKTsNCisgICAgaWYgKCFwU3RyZWFtKSB7DQorICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0cmVhbUVycjsNCisgICAgfQ0KKyAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KKyAgICBtX3BYTUxEb2MgPSBJRkRFX1hNTERvYzo6Q3JlYXRlKCk7DQorICAgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICAgIH0NCisgICAgQ1hGQV9YTUxQYXJzZXIgKnBQYXJzZXIgPSBGWF9ORVcgQ1hGQV9YTUxQYXJzZXIobV9wWE1MRG9jLT5HZXRSb290KCksIG1fcFN0cmVhbSk7DQorICAgIGlmIChwUGFyc2VyID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgICB9DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICBwUGFyc2VyLT5tX2R3Q2hlY2tTdGF0dXMgPSAweDAzOw0KKyNlbmRpZg0KKyAgICBpZiAoIW1fcFhNTERvYy0+TG9hZFhNTChwUGFyc2VyKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVJldCA9IG1fcFhNTERvYy0+RG9Mb2FkKHBQYXVzZSk7DQorICAgIGlmIChpUmV0IDwgMCB8fCBpUmV0ID49IDEwMCkgew0KKyAgICAgICAgbV9wWE1MRG9jLT5DbG9zZVhNTCgpOw0KKyAgICB9DQorICAgIGlmIChpUmV0IDwgMCkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgaWYgKGlSZXQgPCAxMDApIHsNCisgICAgICAgIHJldHVybiBpUmV0IC8gMjsNCisgICAgfQ0KKyAgICBpZiAobV9wU3RyZWFtKSB7DQorICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcFN0cmVhbSA9IE5VTEw7DQorICAgIH0NCisgICAgcFhNTE5vZGUgPSBYRkFfRkRFRXh0ZW5zaW9uX0dldERvY3VtZW50Tm9kZShtX3BYTUxEb2MpOw0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX0RvbmU7DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OkNvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkNCit7DQorICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gKFhGQV9YRFBQQUNLRVQpcFhGQU5vZGUtPkdldFBhY2tldElEKCk7DQorICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgaWYgKHBYRkFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQorICAgICAgICAgICAgZm9yIChJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KKyAgICAgICAgICAgICAgICBpZihlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05vZGVTdHI7DQorICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZVN0cik7DQorICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOb2RlU3RyKTsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZTsNCisjaWZkZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzQ2hpbGRWYWx1ZSk7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgICAgIFhGQV9Db252ZXJ0UmljaFRleHRUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzQ2hpbGRWYWx1ZSk7DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICBpZiAoIXdzQ2hpbGRWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ2hpbGRWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcFJvb3ROb2RlID0gcFhGQU5vZGU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcFJvb3ROb2RlID0gRGF0YUxvYWRlcihwWEZBTm9kZSwgcFhNTE5vZGUsIFRSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBYRkFOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpIHsNCisgICAgICAgICAgICBQYXJzZUNvbnRlbnROb2RlKHBYRkFOb2RlLCBwWE1MTm9kZSwgZVBhY2tldElEKTsNCisgICAgICAgICAgICBtX3BSb290Tm9kZSA9IHBYRkFOb2RlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3BSb290Tm9kZSA9IE5vcm1hbExvYWRlcihwWEZBTm9kZSwgcFhNTE5vZGUsIGVQYWNrZXRJRCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoSUZERV9YTUxFbGVtZW50KiBwTm9kZSwgRlhfV1NUUiB3c1F1YWxpZmllciwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKQ0KK3sNCisgICAgaWYoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgSUZERV9YTUxOb2RlKiBwRmFrZVJvb3QgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpSb290KTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOU0F0dHJpYnV0ZTsNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIGlmKHdzUXVhbGlmaWVyLklzRW1wdHkoKSkgew0KKyAgICAgICAgd3NOU0F0dHJpYnV0ZSA9IEZYX1dTVFJDKEwieG1sbnMiKTsNCisgICAgICAgIGJSZXQgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NOU0F0dHJpYnV0ZSA9IEZYX1dTVFJDKEwieG1sbnM6IikgKyB3c1F1YWxpZmllcjsNCisgICAgfQ0KKyAgICBmb3IoOyBwTm9kZSAhPSBwRmFrZVJvb3Q7IHBOb2RlID0gKElGREVfWE1MRWxlbWVudCopcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSkgew0KKyAgICAgICAgaWYocE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihwTm9kZS0+SGFzQXR0cmlidXRlKHdzTlNBdHRyaWJ1dGUpKSB7DQorICAgICAgICAgICAgcE5vZGUtPkdldFN0cmluZyh3c05TQXR0cmlidXRlLCB3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgd3NOYW1lc3BhY2VVUkkuRW1wdHkoKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkoSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOw0KKyAgICBwRWxlbWVudC0+R2V0TmFtZXNwYWNlUHJlZml4KHdzTm9kZVN0cik7DQorICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIocEVsZW1lbnQsIHdzTm9kZVN0ciwgd3NOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICB3c05hbWVzcGFjZVVSSS5FbXB0eSgpOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShJRkRFX1hNTE5vZGUqIHBOb2RlLCBGWF9XU1RSIHdzTG9jYWxUYWdOYW1lLCBGWF9XU1RSIHdzTmFtZXNwYWNlVVJJUHJlZml4LCBGWF9EV09SRCBlTWF0Y2hGbGFncyA9IFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCkNCit7DQorICAgIGlmKCFwTm9kZSB8fCBwTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gcmVpbnRlcnByZXRfY2FzdDxJRkRFX1hNTEVsZW1lbnQqPihwTm9kZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZVN0cjsNCisgICAgcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c05vZGVTdHIpOw0KKyAgICBpZih3c05vZGVTdHIgIT0gd3NMb2NhbFRhZ05hbWUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkocEVsZW1lbnQsIHdzTm9kZVN0cik7DQorICAgIGlmIChlTWF0Y2hGbGFncyAmIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYoZU1hdGNoRmxhZ3MgJiBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENIKSB7DQorICAgICAgICByZXR1cm4gd3NOb2RlU3RyLkxlZnQod3NOYW1lc3BhY2VVUklQcmVmaXguR2V0TGVuZ3RoKCkpID09IHdzTmFtZXNwYWNlVVJJUHJlZml4Ow0KKyAgICB9DQorICAgIHJldHVybiB3c05vZGVTdHIgPT0gd3NOYW1lc3BhY2VVUklQcmVmaXg7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fR2V0QXR0cmlidXRlTG9jYWxOYW1lKEZYX1dTVFIgd3NBdHRyaWJ1dGVOYW1lLCBDRlhfV2lkZVN0cmluZyYgd3NMb2NhbEF0dHJOYW1lKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSh3c0F0dHJpYnV0ZU5hbWUpOw0KKyAgICBGWF9TVFJTSVpFIGlGaW5kID0gd3NBdHRyTmFtZS5GaW5kKEwnOicsIDApOw0KKyAgICBpZiAoaUZpbmQgPCAwKSB7DQorICAgICAgICB3c0xvY2FsQXR0ck5hbWUgPSB3c0F0dHJOYW1lOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NMb2NhbEF0dHJOYW1lID0gd3NBdHRyTmFtZS5SaWdodCh3c0F0dHJOYW1lLkdldExlbmd0aCgpIC0gaUZpbmQgLSAxKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZUF0dHJpYnV0ZShJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50LCBGWF9XU1RSIHdzQXR0cmlidXRlTmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxBdHRyTmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKQ0KK3sNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSh3c0F0dHJpYnV0ZU5hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05TUHJlZml4Ow0KKyAgICBpZihYRkFfRkRFRXh0ZW5zaW9uX0dldEF0dHJpYnV0ZUxvY2FsTmFtZSh3c0F0dHJpYnV0ZU5hbWUsIHdzTG9jYWxBdHRyTmFtZSkpIHsNCisgICAgICAgIHdzTlNQcmVmaXggPSB3c0F0dHJOYW1lLkxlZnQod3NBdHRyaWJ1dGVOYW1lLkdldExlbmd0aCgpIC0gd3NMb2NhbEF0dHJOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICAgIH0NCisgICAgaWYod3NMb2NhbEF0dHJOYW1lID09IEZYX1dTVFJDKEwieG1sbnMiKSB8fCB3c05TUHJlZml4ID09IEZYX1dTVFJDKEwieG1sbnMiKSB8fCB3c05TUHJlZml4ID09IEZYX1dTVFJDKEwieG1sIikpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZighWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKHBFbGVtZW50LCB3c05TUHJlZml4LCB3c05hbWVzcGFjZVVSSSkpIHsNCisgICAgICAgIHdzTmFtZXNwYWNlVVJJLkVtcHR5KCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUyhJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50LCBGWF9XU1RSIHdzTG9jYWxBdHRyaWJ1dGVOYW1lLCBGWF9XU1RSIHdzTmFtZXNwYWNlVVJJUHJlZml4LCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfQk9PTCBiTWF0Y2hOU0FzUHJlZml4ID0gRkFMU0UpDQorew0KKyAgICBpZighcEVsZW1lbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJWYWx1ZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTlM7DQorICAgIGZvcihGWF9JTlQzMiBpQXR0ckNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpLCBpID0gMDsgaSA8IGlBdHRyQ291bnQ7IGkgKyspIHsNCisgICAgICAgIHBFbGVtZW50LT5HZXRBdHRyaWJ1dGUoaSwgd3NBdHRyTmFtZSwgd3NBdHRyVmFsdWUpOw0KKyAgICAgICAgRlhfU1RSU0laRSBpRmluZCA9IHdzQXR0ck5hbWUuRmluZChMJzonLCAwKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTlNQcmVmaXg7DQorICAgICAgICBpZiAoaUZpbmQgPCAwKSB7DQorICAgICAgICAgICAgaWYod3NMb2NhbEF0dHJpYnV0ZU5hbWUgIT0gd3NBdHRyTmFtZSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmKHdzTG9jYWxBdHRyaWJ1dGVOYW1lICE9IHdzQXR0ck5hbWUuUmlnaHQod3NBdHRyTmFtZS5HZXRMZW5ndGgoKSAtIGlGaW5kIC0gMSkpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdzTlNQcmVmaXggPSB3c0F0dHJOYW1lLkxlZnQoaUZpbmQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcihwRWxlbWVudCwgd3NOU1ByZWZpeCwgd3NBdHRyTlMpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihiTWF0Y2hOU0FzUHJlZml4KSB7DQorICAgICAgICAgICAgaWYod3NBdHRyTlMuTGVmdCh3c05hbWVzcGFjZVVSSVByZWZpeC5HZXRMZW5ndGgoKSkgIT0gd3NOYW1lc3BhY2VVUklQcmVmaXgpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZih3c0F0dHJOUyAhPSB3c05hbWVzcGFjZVVSSVByZWZpeCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB3c1ZhbHVlID0gd3NBdHRyVmFsdWU7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXQoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCit7DQorICAgIHN3aXRjaChlUGFja2V0SUQpIHsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9VTktOT1dOOg0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hEUDoNCisgICAgICAgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9YRFAocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25maWc6DQorICAgICAgICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGU6DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRm9ybToNCisgICAgICAgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0ocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czoNCisgICAgICAgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9EYXRhKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfWGRjOg0KKyAgICAgICAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X1hkYyhwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOw0KKyAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldDoNCisgICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0Og0KKyAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1NvdXJjZVNldDoNCisgICAgICAgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9Mb2NhbGVDb25uZWN0aW9uU291cmNlU2V0KHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X1VzZXIocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9YRFAoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCit7DQorICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wVVJJLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPmVGbGFncykpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFhGQVJvb3ROb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1hEUCwgWEZBX0VMRU1FTlRfWGZhKTsNCisgICAgaWYoIXBYRkFSb290Tm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgbV9wUm9vdE5vZGUgPSBwWEZBUm9vdE5vZGU7DQorICAgIHBYRkFSb290Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMInhmYSIpKTsNCisgICAgew0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQorICAgICAgICBGWF9JTlQzMiBpQXR0cmlidXRlQ291bnQgPSBwRWxlbWVudC0+Q291bnRBdHRyaWJ1dGVzKCk7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQXR0cmlidXRlQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlOYW1lLCB3c0F0dHJpVmFsdWU7DQorICAgICAgICAgICAgcEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJpTmFtZSwgd3NBdHRyaVZhbHVlKTsNCisgICAgICAgICAgICBpZih3c0F0dHJpTmFtZSA9PSBGWF9XU1RSQyhMInV1aWQiKSkgew0KKyAgICAgICAgICAgICAgICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVXVpZCwgd3NBdHRyaVZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYod3NBdHRyaU5hbWUgPT0gRlhfV1NUUkMoTCJ0aW1lU3RhbXAiKSkgew0KKyAgICAgICAgICAgICAgICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLCB3c0F0dHJpVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxDb25maWdET01Sb290ID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiBwWEZBQ29uZmlnRE9NUm9vdCA9IE5VTEw7DQorICAgIHsNCisgICAgICAgIGZvciAoSUZERV9YTUxOb2RlKiBwQ2hpbGRJdGVtID0gcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldEluZm8gPSBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyk7DQorICAgICAgICAgICAgaWYoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwQ2hpbGRJdGVtLCBwUGFja2V0SW5mby0+cE5hbWUsIHBQYWNrZXRJbmZvLT5wVVJJLCBwUGFja2V0SW5mby0+ZUZsYWdzKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKENYRkFfTm9kZSAqIHBDaGlsZE5vZGUgPSBwWEZBUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUocFBhY2tldEluZm8tPnVIYXNoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcFhNTENvbmZpZ0RPTVJvb3QgPSBwQ2hpbGRJdGVtOw0KKyAgICAgICAgICAgIHBYRkFDb25maWdET01Sb290ID0gUGFyc2VBc1hEUFBhY2tldF9Db25maWcocFhNTENvbmZpZ0RPTVJvb3QsIFhGQV9YRFBQQUNLRVRfQ29uZmlnKTsNCisgICAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBYRkFDb25maWdET01Sb290LCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBOVUxMOw0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxGb3JtRE9NUm9vdCA9IE5VTEw7DQorICAgIHsNCisgICAgICAgIGZvciAoSUZERV9YTUxOb2RlKiBwQ2hpbGRJdGVtID0gcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgaWYoIXBDaGlsZEl0ZW0gfHwgcENoaWxkSXRlbS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKHBDaGlsZEl0ZW0gPT0gcFhNTENvbmZpZ0RPTVJvb3QpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSByZWludGVycHJldF9jYXN0PElGREVfWE1MRWxlbWVudCo+KHBDaGlsZEl0ZW0pOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGFja2V0TmFtZTsNCisgICAgICAgICAgICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzUGFja2V0TmFtZSk7DQorICAgICAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldEluZm8gPSBYRkFfR2V0UGFja2V0QnlOYW1lKHdzUGFja2V0TmFtZSk7DQorICAgICAgICAgICAgaWYgKHBQYWNrZXRJbmZvICYmIHBQYWNrZXRJbmZvLT5wVVJJKSB7DQorICAgICAgICAgICAgICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocEVsZW1lbnQsIHBQYWNrZXRJbmZvLT5wTmFtZSwgcFBhY2tldEluZm8tPnBVUkksIHBQYWNrZXRJbmZvLT5lRmxhZ3MpKSB7DQorICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mbyA9IE5VTEw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0ID0gcFBhY2tldEluZm8gPyBwUGFja2V0SW5mby0+ZU5hbWUgOiBYRkFfWERQUEFDS0VUX1VTRVI7DQorICAgICAgICAgICAgaWYoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1hEUCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgICAgICAgICAgICAgIGlmIChwWE1MRGF0YXNldHNET01Sb290KSB7DQorICAgICAgICAgICAgICAgICAgICBwWE1MRGF0YXNldHNET01Sb290ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBwRWxlbWVudDsNCisgICAgICAgICAgICB9IGVsc2UgaWYoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICAgICAgICAgICAgaWYgKHBYTUxGb3JtRE9NUm9vdCkgew0KKyAgICAgICAgICAgICAgICAgICAgcFhNTEZvcm1ET01Sb290ID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBYTUxGb3JtRE9NUm9vdCA9IHBFbGVtZW50Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KHBFbGVtZW50LCBlUGFja2V0KTsNCisgICAgICAgICAgICAgICAgaWYocFBhY2tldE5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwUGFja2V0SW5mbyAmJiAocFBhY2tldEluZm8tPmVGbGFncyAmIFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORSkgJiYgcFhGQVJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHBQYWNrZXRJbmZvLT51SGFzaCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBYRkFSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocFBhY2tldE5vZGUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKHBYTUxEYXRhc2V0c0RPTVJvb3QpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KHBYTUxEYXRhc2V0c0RPTVJvb3QsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpOw0KKyAgICAgICAgaWYgKHBQYWNrZXROb2RlKSB7DQorICAgICAgICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYocFhNTEZvcm1ET01Sb290KSB7DQorICAgICAgICBDWEZBX05vZGUqIHBQYWNrZXROb2RlID0gUGFyc2VBc1hEUFBhY2tldChwWE1MRm9ybURPTVJvb3QsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICAgICAgICBpZiAocFBhY2tldE5vZGUpIHsNCisgICAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwWEZBUm9vdE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgICByZXR1cm4gcFhGQVJvb3ROb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X0NvbmZpZyhJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgaWYoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBOYW1lLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKS0+ZUZsYWdzKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9FTEVNRU5UX0NvbmZpZyk7DQorICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25maWcpLT5wTmFtZSk7DQorICAgIGlmKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCisgICAgcmV0dXJuIHBOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1RlbXBsYXRlRm9ybShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KKyAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9UZW1wbGF0ZSktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5lRmxhZ3MpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUsIFhGQV9FTEVNRU5UX1RlbXBsYXRlKTsNCisgICAgICAgICAgICBpZighcE5vZGUpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSk7DQorICAgICAgICAgICAgaWYobV9iRG9jdW1lbnRQYXJzZXIpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQorICAgICAgICAgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldE5hbWVzcGFjZVVSSSh3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICAgICAgICAgIGlmICh3c05hbWVzcGFjZVVSSS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldFN0cmluZygoRlhfTFBDV1NUUikoTCJ4bWxuczp4ZmEiKSwgd3NOYW1lc3BhY2VVUkkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHBOb2RlLT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzTmFtZXNwYWNlVVJJKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBOYW1lLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5wVVJJLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5lRmxhZ3MpKSB7DQorICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRG9jdW1lbnRFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoZWNrc3VtOw0KKyAgICAgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldFN0cmluZygoRlhfTFBDV1NUUilMImNoZWNrc3VtIiwgd3NDaGVja3N1bSk7DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICAgICAgICAgIGlmICh3c0NoZWNrc3VtLkdldExlbmd0aCgpICE9IDI4IHx8IG1fcFhNTFBhcnNlci0+bV9kd0NoZWNrU3RhdHVzICE9IDB4MDMpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIElYRkFfQ2hlY2tzdW1Db250ZXh0ICpwQ2hlY2tzdW0gPSBYRkFfQ2hlY2tzdW1fQ3JlYXRlKCk7DQorICAgICAgICAgICAgcENoZWNrc3VtLT5TdGFydENoZWNrc3VtKCk7DQorICAgICAgICAgICAgcENoZWNrc3VtLT5VcGRhdGVDaGVja3N1bShtX3BGaWxlUmVhZCwgbV9wWE1MUGFyc2VyLT5tX25TdGFydFswXSwgbV9wWE1MUGFyc2VyLT5tX25TaXplWzBdKTsNCisgICAgICAgICAgICBwQ2hlY2tzdW0tPlVwZGF0ZUNoZWNrc3VtKG1fcEZpbGVSZWFkLCBtX3BYTUxQYXJzZXItPm1fblN0YXJ0WzFdLCBtX3BYTUxQYXJzZXItPm1fblNpemVbMV0pOw0KKyAgICAgICAgICAgIHBDaGVja3N1bS0+RmluaXNoQ2hlY2tzdW0oKTsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrOw0KKyAgICAgICAgICAgIHBDaGVja3N1bS0+R2V0Q2hlY2tzdW0oYnNDaGVjayk7DQorICAgICAgICAgICAgcENoZWNrc3VtLT5SZWxlYXNlKCk7DQorICAgICAgICAgICAgaWYgKGJzQ2hlY2sgIT0gd3NDaGVja3N1bS5VVEY4RW5jb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgICAgIHBOb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9FTEVNRU5UX0Zvcm0pOw0KKyAgICAgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cE5hbWUpOw0KKyAgICAgICAgICAgIHBOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgd3NDaGVja3N1bSk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVSb290ID0gbV9wUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1RlbXBsYXRlKTsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZUNob3NlbiA9IHBUZW1wbGF0ZVJvb3QgPyBwVGVtcGxhdGVSb290LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKSA6IE5VTEw7DQorICAgICAgICAgICAgRlhfQk9PTCBiVXNlQXR0cmlidXRlID0gVFJVRTsNCisgICAgICAgICAgICBpZiAocFRlbXBsYXRlQ2hvc2VuICYmIHBUZW1wbGF0ZUNob3Nlbi0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSkgIT0gWEZBX0FUVFJJQlVURUVOVU1fQXV0bykgew0KKyAgICAgICAgICAgICAgICBiVXNlQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCwgYlVzZUF0dHJpYnV0ZSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwTm9kZSkgew0KKyAgICAgICAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZTsNCit9DQorc3RhdGljIElGREVfWE1MTm9kZSogWEZBX0dldERhdGFTZXRzRnJvbVhEUChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpDQorew0KKyAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5lRmxhZ3MpKSB7DQorICAgICAgICByZXR1cm4gcFhNTERvY3VtZW50Tm9kZTsNCisgICAgfQ0KKyAgICBpZiAoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBOYW1lLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWERQKS0+ZUZsYWdzKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZm9yKElGREVfWE1MTm9kZSogcERhdGFzZXRzTm9kZSA9IHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBEYXRhc2V0c05vZGU7IHBEYXRhc2V0c05vZGUgPSBwRGF0YXNldHNOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwRGF0YXNldHNOb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wVVJJLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+ZUZsYWdzKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBEYXRhc2V0c05vZGU7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfRGF0YShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgSUZERV9YTUxOb2RlKiBwRGF0YXNldHNYTUxOb2RlID0gWEZBX0dldERhdGFTZXRzRnJvbVhEUChwWE1MRG9jdW1lbnROb2RlKTsNCisgICAgaWYocERhdGFzZXRzWE1MTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YU1vZGVsKTsNCisgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBOYW1lKTsNCisgICAgICAgIGlmKCFEYXRhTG9hZGVyKHBOb2RlLCBwRGF0YXNldHNYTUxOb2RlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YXNldHNYTUxOb2RlKTsNCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUqIHBEYXRhWE1MTm9kZSA9IE5VTEw7DQorICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgRlhfV1NUUkMoTCJkYXRhIiksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wVVJJLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+ZUZsYWdzKSkgew0KKyAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGUpLT5SZW1vdmVBdHRyaWJ1dGUoKEZYX0xQQ1dTVFIpKEwieG1sbnM6eGZhIikpOw0KKyAgICAgICAgcERhdGFYTUxOb2RlID0gcFhNTERvY3VtZW50Tm9kZTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcERhdGFFbGVtZW50ID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoRlhfV1NUUkMoTCJ4ZmE6ZGF0YSIpKTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFBhcmVudFhNTE5vZGUgPSBwWE1MRG9jdW1lbnROb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgICAgICBpZiAocFBhcmVudFhNTE5vZGUpIHsNCisgICAgICAgICAgICBwUGFyZW50WE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEb2N1bWVudE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICAgIGlmIChwWE1MRG9jdW1lbnROb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MRG9jdW1lbnROb2RlKS0+UmVtb3ZlQXR0cmlidXRlKChGWF9MUENXU1RSKShMInhtbG5zOnhmYSIpKTsNCisgICAgICAgIH0NCisgICAgICAgIHBEYXRhRWxlbWVudC0+SW5zZXJ0Q2hpbGROb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgICAgICAgcERhdGFYTUxOb2RlID0gcERhdGFFbGVtZW50Ow0KKyAgICB9DQorICAgIGlmKHBEYXRhWE1MTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgIGlmIChwRGF0YVhNTE5vZGUgIT0gcFhNTERvY3VtZW50Tm9kZSkgew0KKyAgICAgICAgICAgICAgICBwRGF0YVhNTE5vZGUtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsTmFtZTsNCisgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwRGF0YVhNTE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUod3NMb2NhbE5hbWUpOw0KKyAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NMb2NhbE5hbWUpOw0KKyAgICAgICAgaWYoIURhdGFMb2FkZXIocE5vZGUsIHBEYXRhWE1MTm9kZSwgVFJVRSkpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVhNTE5vZGUpOw0KKyAgICAgICAgaWYgKHBEYXRhWE1MTm9kZSAhPSBwWE1MRG9jdW1lbnROb2RlKSB7DQorICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9Mb2NhbGVDb25uZWN0aW9uU291cmNlU2V0KElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpDQorew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCkgew0KKyAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5lRmxhZ3MpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfRUxFTUVOVF9Mb2NhbGVTZXQpOw0KKyAgICAgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wTmFtZSk7DQorICAgICAgICAgICAgaWYoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZihlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0KSB7DQorICAgICAgICBpZihYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0KS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPmVGbGFncykpIHsNCisgICAgICAgICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfRUxFTUVOVF9Db25uZWN0aW9uU2V0KTsNCisgICAgICAgICAgICBpZighcE5vZGUpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBOYW1lKTsNCisgICAgICAgICAgICBpZighTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCkgew0KKyAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfU291cmNlU2V0KS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfU291cmNlU2V0KS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5lRmxhZ3MpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQpOw0KKyAgICAgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5wTmFtZSk7DQorICAgICAgICAgICAgaWYoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICAgIH0NCisgICAgcmV0dXJuIHBOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1hkYyhJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5lRmxhZ3MpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1hkYywgWEZBX0VMRU1FTlRfWGRjKTsNCisgICAgICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5wTmFtZSk7DQorICAgICAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfVXNlcihJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9FTEVNRU5UX1BhY2tldCk7DQorICAgIGlmKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZSktPkdldExvY2FsVGFnTmFtZSh3c05hbWUpOw0KKyAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICBpZighVXNlclBhY2tldExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCisgICAgcmV0dXJuIHBOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpVc2VyUGFja2V0TG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYykNCit7DQorICAgIHJldHVybiBwWEZBTm9kZTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2UoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0KQ0KK3sNCisgICAgd3NUZXh0LlRyaW1SaWdodChMIlx4MjBceDlceERceEEiKTsNCisgICAgcmV0dXJuIHdzVGV4dC5Jc0VtcHR5KCk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OkRhdGFMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MRG9jLCBGWF9CT09MIGJEb1RyYW5zZm9ybSApDQorew0KKyAgICBQYXJzZURhdGFHcm91cChwWEZBTm9kZSwgcFhNTERvYywgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICAgIHJldHVybiBwWEZBTm9kZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6Tm9ybWFsTG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYywgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQsIEZYX0JPT0wgYlVzZUF0dHJpYnV0ZSkNCit7DQorICAgIEZYX0JPT0wgYk9uZU9mUHJvcGVydHlGb3VuZCA9IEZBTFNFOw0KKyAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFhNTERvYy0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcFhNTENoaWxkOyBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBzd2l0Y2ggKHBYTUxDaGlsZC0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOw0KKyAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c1RhZ05hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtSW5mbyA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICBpZighcEVsZW1JbmZvKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnR5SW5mbyA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChwWEZBTm9kZS0+R2V0Q2xhc3NJRCgpLCBwRWxlbUluZm8tPmVOYW1lLCBlUGFja2V0SUQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBQcm9wZXJ0eUluZm8gJiYgKChwUHJvcGVydHlJbmZvLT51RmxhZ3MgJiAoWEZBX1BST1BFUlRZRkxBR19PbmVPZiB8IFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mKSkgIT0gMCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk9uZU9mUHJvcGVydHlGb3VuZCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYk9uZU9mUHJvcGVydHlGb3VuZCA9IFRSVUU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoZVBhY2tldElELCBwRWxlbUluZm8tPmVOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0NvbmZpZykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NUYWdOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgSXNOZWVkVmFsdWUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwLCBjb3VudCA9IHBYTUxFbGVtZW50LT5Db3VudEF0dHJpYnV0ZXMoKTsgaSA8IGNvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJRdWFsaWZpZWROYW1lOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJRdWFsaWZpZWROYW1lLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZERUV4dGVuc2lvbl9HZXRBdHRyaWJ1dGVMb2NhbE5hbWUod3NBdHRyUXVhbGlmaWVkTmFtZSwgd3NBdHRyTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYod3NBdHRyTmFtZSA9PSBGWF9XU1RSQyhMIm5pbCIpICYmIHdzQXR0clZhbHVlID09IEZYX1dTVFJDKEwidHJ1ZSIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTmVlZFZhbHVlID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIGxwQXR0ckluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlOYW1lKHdzQXR0ck5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFscEF0dHJJbmZvKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJVc2VBdHRyaWJ1dGUgJiYgbHBBdHRySW5mby0+ZU5hbWUgIT0gWEZBX0FUVFJJQlVURV9OYW1lICYmIGxwQXR0ckluZm8tPmVOYW1lICE9IFhGQV9BVFRSSUJVVEVfU2F2ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRBdHRyaWJ1dGUobHBBdHRySW5mby0+ZU5hbWUsIHdzQXR0clZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFbGVtSW5mby0+ZU5hbWUgPT0gWEZBX0VMRU1FTlRfVmFsaWRhdGUgfHwgcEVsZW1JbmZvLT5lTmFtZSA9PSBYRkFfRUxFTUVOVF9Mb2NhbGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfQ29uZmlnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlQ29udGVudE5vZGUocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElEKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxMb2FkZXIocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElELCBiVXNlQXR0cmlidXRlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFhGQUNoaWxkLT5HZXRPYmplY3RUeXBlKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihJc05lZWRWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZW50Tm9kZShwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbExvYWRlcihwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQsIGJVc2VBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOg0KKyAgICAgICAgICAgICAgICBQYXJzZUluc3RydWN0aW9uKHBYRkFOb2RlLCAoSUZERV9YTUxJbnN0cnVjdGlvbiopcFhNTENoaWxkLCBlUGFja2V0SUQpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcFhGQU5vZGU7DQorfQ0KK0ZYX0JPT0wgWEZBX1JlY29nbml6ZVJpY2hUZXh0KElGREVfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSkNCit7DQorICAgIGlmIChwUmljaFRleHRYTUxOb2RlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsNCisgICAgICAgIFhGQV9GREVFeHRlbnNpb25fR2V0RWxlbWVudFRhZ05hbWVzcGFjZVVSSShwUmljaFRleHRYTUxOb2RlLCB3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICBpZiAod3NOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIikpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK2NsYXNzIFJpY2hUZXh0Tm9kZVZpc2l0b3INCit7DQorcHVibGljOg0KKyAgICBzdGF0aWMgaW5saW5lIElGREVfWE1MTm9kZSogR2V0Rmlyc3RDaGlsZChJRkRFX1hNTE5vZGUqIHBOb2RlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBJRkRFX1hNTE5vZGUqIEdldE5leHRTaWJsaW5nKElGREVfWE1MTm9kZSogcE5vZGUpDQorICAgIHsNCisgICAgICAgIHJldHVybiBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZyk7DQorICAgIH0NCisgICAgc3RhdGljIGlubGluZSBJRkRFX1hNTE5vZGUqIEdldFBhcmVudChJRkRFX1hNTE5vZGUqIHBOb2RlKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgICAgfQ0KK307DQorI2lmbmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQordm9pZCBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoSUZERV9YTUxFbGVtZW50KiBwUmljaFRleHRYTUxOb2RlLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpDQorew0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPElGREVfWE1MTm9kZSwgUmljaFRleHROb2RlVmlzaXRvcj4gc0l0ZXJhdG9yKHBSaWNoVGV4dFhNTE5vZGUpOw0KKyAgICBDRlhfV2lkZVRleHRCdWYgd3NQbGFpblRleHRCdWY7DQorICAgIGZvcihJRkRFX1hNTE5vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgc3dpdGNoKHBOb2RlLT5HZXRUeXBlKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxUZXh0KilwTm9kZSktPkdldFRleHQod3NUZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIHdzUGxhaW5UZXh0QnVmIDw8IHdzVGV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBOb2RlKS0+R2V0Q2hhckRhdGEod3NUZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIHdzUGxhaW5UZXh0QnVmIDw8IHdzVGV4dDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICB3c091dHB1dCA9IHdzUGxhaW5UZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsNCit9DQorI2VuZGlmDQordm9pZCBYRkFfQ29udmVydFhNTFRvUGxhaW5UZXh0KElGREVfWE1MRWxlbWVudCogcFJvb3RYTUxOb2RlLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpDQorew0KKyAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFJvb3RYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisjaWZkZWYgX0RFQlVHDQorICAgICAgICBGREVfWE1MTk9ERVRZUEUgbm9kZVR5cGUgPSBwWE1MQ2hpbGQtPkdldFR5cGUoKTsNCisjZW5kaWYNCisgICAgICAgIHN3aXRjaChwWE1MQ2hpbGQtPkdldFR5cGUoKSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0RGF0YTsNCisgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpLT5HZXRUZXh0RGF0YSh3c1RleHREYXRhKTsNCisgICAgICAgICAgICAgICAgICAgIHdzVGV4dERhdGEgKz0gRlhfV1NUUkMoTCJcbiIpOw0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NUZXh0RGF0YTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxUZXh0KilwWE1MQ2hpbGQpLT5HZXRUZXh0KHdzVGV4dCk7DQorICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NUZXh0KSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzVGV4dDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOw0KKyAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwWE1MQ2hpbGQpLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c0NoYXJEYXRhKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzQ2hhckRhdGE7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCit9DQordm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VDb250ZW50Tm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCit7DQorICAgIFhGQV9FTEVNRU5UIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHRleHQ7DQorICAgIGlmIChwWEZBTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29udGVudFR5cGUgPSBwWEZBTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSk7DQorICAgICAgICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMInRleHQvaHRtbCIpKSB7DQorICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweEhUTUw7DQorICAgICAgICB9IGVsc2UgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSB7DQorICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweG1sOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChlbGVtZW50ID09IFhGQV9FTEVNRU5UX1NoYXJweEhUTUwpIHsNCisgICAgICAgIHBYRkFOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MTm9kZSk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgZm9yIChJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgIEZERV9YTUxOT0RFVFlQRSBlTm9kZVR5cGUgPSBwWE1MQ2hpbGQtPkdldFR5cGUoKTsNCisgICAgICAgIGlmKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoZWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MKSB7DQorICAgICAgICAgICAgaWYoZU5vZGVUeXBlICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChYRkFfUmVjb2duaXplUmljaFRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKSkgew0KKyNpZmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQorICAgICAgICAgICAgICAgIFhGQV9HZXRQbGFpblRleHRGcm9tUmljaFRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1ZhbHVlKTsNCisjZWxzZQ0KKyAgICAgICAgICAgICAgICBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1ZhbHVlKTsNCisjZW5kaWYNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwpIHsNCisgICAgICAgICAgICBpZihlTm9kZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgWEZBX0NvbnZlcnRYTUxUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZihlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZCktPkdldFRleHQod3NWYWx1ZSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9DaGFyRGF0YSkgew0KKyAgICAgICAgICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBYTUxDaGlsZCktPkdldENoYXJEYXRhKHdzVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgaWYgKHBYRkFOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUgKnBDb250ZW50UmF3RGF0YU5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgZWxlbWVudCk7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBDb250ZW50UmF3RGF0YU5vZGUpOw0KKyAgICAgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOw0KKyAgICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcFhGQU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlRGF0YUdyb3VwKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KK3sNCisgICAgZm9yIChJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgIHN3aXRjaCAocFhNTENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCisgICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQ7DQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZERUV4dGVuc2lvbl9HZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBYTUxFbGVtZW50LCB3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYod3NOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5jb20vc2NoZW1hL3hmYS1wYWNrYWdlLyIpIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWVzcGFjZVVSSSA9PSBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXBhY2thZ2UvIikgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhTW9kZWw7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YU5vZGVBdHRyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUyhwWE1MRWxlbWVudCwgRlhfV1NUUkMoTCJkYXRhTm9kZSIpLCBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpLCB3c0RhdGFOb2RlQXR0cikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzRGF0YU5vZGVBdHRyID09IEZYX1dTVFJDKEwiZGF0YUdyb3VwIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c0RhdGFOb2RlQXR0ciA9PSBGWF9XU1RSQyhMImRhdGFWYWx1ZSIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZihYRkFfRkRFRXh0ZW5zaW9uX0ZpbmRBdHRyaWJ1dGVXaXRoTlMocFhNTEVsZW1lbnQsIEZYX1dTVFJDKEwiY29udGVudFR5cGUiKSwgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iKSwgd3NDb250ZW50VHlwZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0NvbnRlbnRUeXBlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTERhdGFDaGlsZCA9IHBYTUxFbGVtZW50LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MRGF0YUNoaWxkOyBwWE1MRGF0YUNoaWxkID0gcFhNTERhdGFDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFhNTERhdGFDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghWEZBX1JlY29nbml6ZVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEYXRhQ2hpbGQpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgZU5vZGVUeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWU7DQorICAgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTm9kZU5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmVlZFZhbHVlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgICAgIGlmICgxKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwLCBjb3VudCA9IHBYTUxFbGVtZW50LT5Db3VudEF0dHJpYnV0ZXMoKTsgaSA8IGNvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyUXVhbGlmaWVkTmFtZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyVmFsdWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWVzcGFjZVVSSTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJRdWFsaWZpZWROYW1lLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVBdHRyaWJ1dGUocFhNTEVsZW1lbnQsIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0ck5hbWUsIHdzQXR0ck5hbWVzcGFjZVVSSSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdzQXR0ck5hbWUgPT0gRlhfV1NUUkMoTCJuaWwiKSAmJiB3c0F0dHJWYWx1ZSA9PSBGWF9XU1RSQyhMInRydWUiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZWRWYWx1ZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod3NBdHRyTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEuY29tL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQXR0ck5hbWVzcGFjZVVSSSA9PSBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXBhY2thZ2UvIikgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFhGQU1ldGFEYXRhID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFhGQU1ldGFEYXRhID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWEZBTWV0YURhdGEtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NBdHRyTmFtZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLCB3c0F0dHJRdWFsaWZpZWROYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+SW5zZXJ0Q2hpbGQocFhGQU1ldGFEYXRhKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJOZWVkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOaWxOYW1lID0gRlhfV1NUUkMoTCJ4c2k6bmlsIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NOaWxOYW1lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VEYXRhR3JvdXAocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElEKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoYk5lZWRWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZURhdGFWYWx1ZShwWEZBQ2hpbGQsIHBYTUxDaGlsZCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRWxlbWVudCk7DQorICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxDaGFyRGF0YSAqcFhNTENoYXJEYXRhID0gKElGREVfWE1MQ2hhckRhdGEqKXBYTUxDaGlsZDsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckRhdGE7DQorICAgICAgICAgICAgICAgICAgICBwWE1MQ2hhckRhdGEtPkdldENoYXJEYXRhKHdzQ2hhckRhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fSXNTdHJpbmdBbGxXaGl0ZXNwYWNlKHdzQ2hhckRhdGEpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDaGFyRGF0YSk7DQorICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTENoYXJEYXRhKTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCisgICAgICAgICAgICAgICAgICAgIElGREVfWE1MVGV4dCAqcFhNTFRleHQgPSAoSUZERV9YTUxUZXh0KilwWE1MQ2hpbGQ7DQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICAgICAgICAgICAgICBwWE1MVGV4dC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fSXNTdHJpbmdBbGxXaGl0ZXNwYWNlKHdzVGV4dCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1RleHQpOw0KKyAgICAgICAgICAgICAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxUZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOg0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZURhdGFWYWx1ZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCit7DQorICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1ZhbHVlVGV4dEJ1ZjsNCisgICAgQ0ZYX1dpZGVUZXh0QnVmIHdzQ3VyVmFsdWVUZXh0QnVmOw0KKyAgICBGWF9CT09MIGJNYXJrQXNDb21wb3VuZCA9IEZBTFNFOw0KKyAgICBJRkRFX1hNTE5vZGUgKnBYTUxDdXJWYWx1ZU5vZGUgPSBOVUxMOw0KKyAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxDaGlsZDsgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KKyAgICAgICAgaWYoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICBGWF9CT09MIGJCcmVhayA9IEZBTFNFOw0KKyAgICAgICAgaWYoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAgICAgICAoKElGREVfWE1MVGV4dCopcFhNTENoaWxkKS0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgICAgIGlmKCFwWE1MQ3VyVmFsdWVOb2RlKSB7DQorICAgICAgICAgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsNCisgICAgICAgIH0gZWxzZSBpZihlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfQ2hhckRhdGEpIHsNCisgICAgICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBYTUxDaGlsZCktPkdldENoYXJEYXRhKHdzVGV4dCk7DQorICAgICAgICAgICAgaWYoIXBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgICAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3NDdXJWYWx1ZVRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICAgICAgfSBlbHNlIGlmKFhGQV9SZWNvZ25pemVSaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpKSB7DQorI2lmZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCisgICAgICAgICAgICBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCwgd3NUZXh0KTsNCisjZWxzZQ0KKyAgICAgICAgICAgIFhGQV9Db252ZXJ0UmljaFRleHRUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVGV4dCk7DQorI2VuZGlmDQorICAgICAgICAgICAgaWYoIXBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgICAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd3NDdXJWYWx1ZVRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBiTWFya0FzQ29tcG91bmQgPSBUUlVFOw0KKyAgICAgICAgICAgIGlmKHBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ3VyVmFsdWUgPSB3c0N1clZhbHVlVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgIGlmKCF3c0N1clZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDdXJWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEN1clZhbHVlTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlVGV4dEJ1ZiA8PCB3c0N1clZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgd3NDdXJWYWx1ZVRleHRCdWYuQ2xlYXIoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwWE1MQ3VyVmFsdWVOb2RlID0gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05vZGVTdHI7DQorICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCktPkdldExvY2FsVGFnTmFtZSh3c05vZGVTdHIpOw0KKyAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05vZGVTdHIpOw0KKyAgICAgICAgICAgIFBhcnNlRGF0YVZhbHVlKHBYRkFDaGlsZCwgcFhNTENoaWxkLCBlUGFja2V0SUQpOw0KKyAgICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTENoaWxkKTsNCisgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ3VyVmFsdWUgPSBwWEZBQ2hpbGQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgICAgICAgIHdzVmFsdWVUZXh0QnVmIDw8IHdzQ3VyVmFsdWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYocFhNTEN1clZhbHVlTm9kZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ3VyVmFsdWUgPSB3c0N1clZhbHVlVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICBpZighd3NDdXJWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBpZihiTWFya0FzQ29tcG91bmQpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwiIikpOw0KKyAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ3VyVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ3VyVmFsdWVOb2RlKTsNCisgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3c1ZhbHVlVGV4dEJ1ZiA8PCB3c0N1clZhbHVlOw0KKyAgICAgICAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmLkNsZWFyKCk7DQorICAgICAgICB9DQorICAgICAgICBwWE1MQ3VyVmFsdWVOb2RlID0gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOb2RlVmFsdWUgPSB3c1ZhbHVlVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgIHBYRkFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c05vZGVWYWx1ZSk7DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlSW5zdHJ1Y3Rpb24oQ1hGQV9Ob2RlICpwWEZBTm9kZSwgSUZERV9YTUxJbnN0cnVjdGlvbiAqcFhNTEluc3RydWN0aW9uLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCit7DQorICAgIGlmKCFtX2JEb2N1bWVudFBhcnNlcikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0TmFtZTsNCisgICAgcFhNTEluc3RydWN0aW9uLT5HZXRUYXJnZXROYW1lKHdzVGFyZ2V0TmFtZSk7DQorICAgIEZYX0lOVDMyIGlEYXRhQ291bnQgPSBwWE1MSW5zdHJ1Y3Rpb24tPkNvdW50RGF0YSgpOw0KKyAgICBpZiAod3NUYXJnZXROYW1lID09IEZYX1dTVFJDKEwib3JpZ2luYWxYRkFWZXJzaW9uIikpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsNCisgICAgICAgIGlmKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgwLCB3c0RhdGEpICYmIChwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcih3c0RhdGEpICE9IFhGQV9WRVJTSU9OX1VOS05PV04pKSB7DQorICAgICAgICAgICAgd3NEYXRhLkVtcHR5KCk7DQorICAgICAgICAgICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgxLCB3c0RhdGEpICYmIHdzRGF0YSA9PSBGWF9XU1RSQyhMInYyLjctc2NyaXB0aW5nOjEiKSkgew0KKyAgICAgICAgICAgICAgICBwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+U2V0RmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcsIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmICh3c1RhcmdldE5hbWUgPT0gRlhfV1NUUkMoTCJhY3JvYmF0IikpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsNCisgICAgICAgIGlmIChwWE1MSW5zdHJ1Y3Rpb24tPkdldERhdGEoMCwgd3NEYXRhKSAmJiB3c0RhdGEgPT0gRlhfV1NUUkMoTCJKYXZhU2NyaXB0IikpIHsNCisgICAgICAgICAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDEsIHdzRGF0YSkgJiYgd3NEYXRhID09IEZYX1dTVFJDKEwic3RyaWN0U2NvcGluZyIpKSB7DQorICAgICAgICAgICAgICAgIHBYRkFOb2RlLT5HZXREb2N1bWVudCgpLT5TZXRGbGFnKFhGQV9ET0NGTEFHX1N0cmljdFNjb3BpbmcsIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCit2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpDbG9zZVBhcnNlcigpDQorew0KKyAgICBpZiAobV9wWE1MRG9jKSB7DQorICAgICAgICBtX3BYTUxEb2MtPlJlbGVhc2UoKTsNCisgICAgICAgIG1fcFhNTERvYyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgICB9DQorfQ0KK0lYRkFfRG9jUGFyc2VyKiBJWEZBX0RvY1BhcnNlcjo6Q3JlYXRlKElYRkFfTm90aWZ5ICpwTm90aWZ5KQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX0RvY3VtZW50UGFyc2VyKHBOb3RpZnkpOw0KK30NCitDWEZBX0RvY3VtZW50UGFyc2VyOjpDWEZBX0RvY3VtZW50UGFyc2VyKElYRkFfTm90aWZ5ICpwTm90aWZ5KQ0KKyAgICA6IG1fcE5vdGlmeShwTm90aWZ5KQ0KKyAgICAsIG1fbm9kZVBhcnNlcihOVUxMLCBUUlVFKQ0KKyAgICAsIG1fcERvY3VtZW50KE5VTEwpDQorew0KK30NCitDWEZBX0RvY3VtZW50UGFyc2VyOjp+Q1hGQV9Eb2N1bWVudFBhcnNlcigpDQorew0KKyAgICBDbG9zZVBhcnNlcigpOw0KK30NCitGWF9JTlQzMiBDWEZBX0RvY3VtZW50UGFyc2VyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCAqcFN0cmVhbSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQgKQ0KK3sNCisgICAgQ2xvc2VQYXJzZXIoKTsNCisgICAgRlhfSU5UMzIgblJldFN0YXR1cyA9IG1fbm9kZVBhcnNlci5TdGFydFBhcnNlKHBTdHJlYW0sIGVQYWNrZXRJRCk7DQorICAgIGlmKG5SZXRTdGF0dXMgPT0gWEZBX1BBUlNFU1RBVFVTX1JlYWR5KSB7DQorICAgICAgICBtX3BEb2N1bWVudCA9IEZYX05FVyBDWEZBX0RvY3VtZW50KHRoaXMpOw0KKyAgICAgICAgbV9ub2RlUGFyc2VyLlNldEZhY3RvcnkobV9wRG9jdW1lbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBuUmV0U3RhdHVzOw0KK30NCitGWF9JTlQzMiBDWEZBX0RvY3VtZW50UGFyc2VyOjpEb1BhcnNlKElGWF9QYXVzZSAqcFBhdXNlICkNCit7DQorICAgIEZYX0lOVDMyIG5SZXRTdGF0dXMgPSBtX25vZGVQYXJzZXIuRG9QYXJzZShwUGF1c2UpOw0KKyAgICBpZiAoblJldFN0YXR1cyA+PSBYRkFfUEFSU0VTVEFUVVNfRG9uZSkgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcERvY3VtZW50KTsNCisgICAgICAgIG1fcERvY3VtZW50LT5TZXRSb290KG1fbm9kZVBhcnNlci5HZXRSb290Tm9kZSgpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gblJldFN0YXR1czsNCit9DQorRlhfSU5UMzIgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6UGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1hNTCwgSUZERV9YTUxOb2RlKiAmcFhNTE5vZGUsIElGWF9QYXVzZSAqcFBhdXNlKQ0KK3sNCisgICAgQ2xvc2VQYXJzZXIoKTsNCisgICAgRlhfSU5UMzIgblJldFN0YXR1cyA9IG1fbm9kZVBhcnNlci5QYXJzZVhNTERhdGEod3NYTUwsIHBYTUxOb2RlLCBOVUxMKTsNCisgICAgaWYoblJldFN0YXR1cyA9PSBYRkFfUEFSU0VTVEFUVVNfRG9uZSAmJiBwWE1MTm9kZSkgew0KKyAgICAgICAgbV9wRG9jdW1lbnQgPSBGWF9ORVcgQ1hGQV9Eb2N1bWVudCh0aGlzKTsNCisgICAgICAgIG1fbm9kZVBhcnNlci5TZXRGYWN0b3J5KG1fcERvY3VtZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gblJldFN0YXR1czsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50UGFyc2VyOjpDb25zdHJ1Y3RYRkFOb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUpDQorew0KKyAgICBpZiAoIXBYRkFOb2RlIHx8ICFwWE1MTm9kZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIG1fbm9kZVBhcnNlci5Db25zdHJ1Y3RYRkFOb2RlKHBYRkFOb2RlLCBwWE1MTm9kZSk7DQorICAgIENYRkFfTm9kZSogcFJvb3ROb2RlID0gbV9ub2RlUGFyc2VyLkdldFJvb3ROb2RlKCk7DQorICAgIGlmIChtX3BEb2N1bWVudCAmJiBwUm9vdE5vZGUpIHsNCisgICAgICAgIG1fcERvY3VtZW50LT5TZXRSb290KHBSb290Tm9kZSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX0RvY3VtZW50UGFyc2VyOjpDbG9zZVBhcnNlcigpDQorew0KKyAgICBpZiAobV9wRG9jdW1lbnQpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BEb2N1bWVudDsNCisgICAgICAgIG1fcERvY3VtZW50ID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX25vZGVQYXJzZXIuQ2xvc2VQYXJzZXIoKTsNCit9DQorQ1hGQV9YTUxQYXJzZXI6OkNYRkFfWE1MUGFyc2VyKElGREVfWE1MTm9kZSAqcFJvb3QsIElGWF9TdHJlYW0gKnBTdHJlYW0pDQorICAgIDogbV9wUm9vdChwUm9vdCkNCisgICAgLCBtX3BTdHJlYW0ocFN0cmVhbSkNCisgICAgLCBtX3BQYXJzZXIoTlVMTCkNCisgICAgLCBtX2R3U3RhdHVzKEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZSkNCisgICAgLCBtX3BQYXJlbnQocFJvb3QpDQorICAgICwgbV9wQ2hpbGQoTlVMTCkNCisgICAgLCBtX05vZGVTdGFjaygxNikNCisgICAgLCBtX3dzMSgpDQorICAgICwgbV93czIoKQ0KKyNpZmRlZiBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCisgICAgLCBtX25FbGVtZW50U3RhcnQoMCkNCisgICAgLCBtX2R3Q2hlY2tTdGF0dXMoMCkNCisgICAgLCBtX2R3Q3VycmVudENoZWNrU3RhdHVzKDApDQorI2VuZGlmDQorew0KKyAgICBBU1NFUlQobV9wUGFyZW50ICYmIG1fcFN0cmVhbSk7DQorICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wUGFyZW50KTsNCisgICAgbV9wUGFyc2VyID0gSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgICBtX3BQYXJzZXItPkluaXQobV9wU3RyZWFtLCAzMiAqIDEwMjQsIDEwMjQgKiAxMDI0KTsNCit9DQorQ1hGQV9YTUxQYXJzZXI6On5DWEZBX1hNTFBhcnNlcigpDQorew0KKyAgICBpZiAobV9wUGFyc2VyKSB7DQorICAgICAgICBtX3BQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCisgICAgbV93czEuRW1wdHkoKTsNCisgICAgbV93czIuRW1wdHkoKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9YTUxQYXJzZXI6OkRvUGFyc2VyKElGWF9QYXVzZSAqcFBhdXNlKQ0KK3sNCisgICAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcikgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgICAgICByZXR1cm4gMTAwOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlDb3VudCA9IDA7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBtX2R3U3RhdHVzID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgICAgICBzd2l0Y2ggKG1fZHdTdGF0dXMpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZToNCisgICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW46DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICAgICAgICAgICAgICBpZiAobV9kd0NoZWNrU3RhdHVzICE9IDB4MDMgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fbkVsZW1lbnRTdGFydCA9IG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gMTsNCisgICAgICAgICAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudEJyZWFrOg0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOg0KKyAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFnTmFtZShtX3dzMSk7DQorICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPkdldFRhZ05hbWUobV93czIpOw0KKyAgICAgICAgICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmICFtX3dzMS5FcXVhbChtX3dzMikpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV9Ob2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2R3Q3VycmVudENoZWNrU3RhdHVzICE9IDAgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDIpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fblNpemVbbV9kd0N1cnJlbnRDaGVja1N0YXR1cyAtIDFdID0gbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLSBtX25TdGFydFttX2R3Q3VycmVudENoZWNrU3RhdHVzIC0gMV07DQorICAgICAgICAgICAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICBtX3BQYXJlbnQgPSAoSUZERV9YTUxOb2RlKikqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgICAgICAgICAgaUNvdW50Kys7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lOg0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgICAgICAgICBpZiAobV93czEgPT0gRlhfV1NUUkMoTCJvcmlnaW5hbFhGQVZlcnNpb24iKSB8fCBtX3dzMSA9PSBGWF9XU1RSQyhMImFjcm9iYXQiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBJRkRFX1hNTEluc3RydWN0aW9uOjpDcmVhdGUobV93czEpOw0KKyAgICAgICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOg0KKyAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcENoaWxkKTsNCisgICAgICAgICAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICAgICAgICAgICAgICBpZiAobV9kd0NoZWNrU3RhdHVzICE9IDB4MDMgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDMpIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KKyAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICh3c1RhZyA9PSBGWF9XU1RSQyhMInRlbXBsYXRlIikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Q2hlY2tTdGF0dXMgfD0gMHgwMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMHgwMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX25TdGFydFswXSA9IG1fcFBhcnNlci0+R2V0Q3VycmVudEJpbmFyeVBvcygpIC0gKG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gbV9uRWxlbWVudFN0YXJ0KTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod3NUYWcgPT0gRlhfV1NUUkMoTCJkYXRhc2V0cyIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0NoZWNrU3RhdHVzIHw9IDB4MDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDB4MDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9uU3RhcnRbMV0gPSBtX3BQYXJzZXItPkdldEN1cnJlbnRCaW5hcnlQb3MoKSAtIChtX3BQYXJzZXItPkdldEN1cnJlbnRQb3MoKSAtIG1fbkVsZW1lbnRTdGFydCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZToNCisgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU6DQorICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MyKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wQ2hpbGQpLT5TZXRTdHJpbmcobV93czEsIG1fd3MyKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCisgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICAgICAgICAgIG1fcENoaWxkID0gSUZERV9YTUxUZXh0OjpDcmVhdGUobV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQorICAgICAgICAgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQ0RhdGE6DQorICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MQ2hhckRhdGE6OkNyZWF0ZShtX3dzMSk7DQorICAgICAgICAgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOg0KKyAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpZiAoIW1fd3MxLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQorICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MSW5zdHJ1Y3Rpb24qKW1fcENoaWxkKS0+QXBwZW5kRGF0YShtX3dzMSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBpQ291bnQgPiA1MDAgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IgfHwgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpICE9IDEpID8gLTEgOiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWIxNDYyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuaApAQCAtMCwwICsxLDEzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfUEFSU0VSX0lNUA0KKyNkZWZpbmUgX1hGQV9QQVJTRVJfSU1QDQorI2RlZmluZSBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCitjbGFzcyBDWEZBX1hNTFBhcnNlcjsNCitjbGFzcyBDWEZBX1NpbXBsZVBhcnNlciA6IHB1YmxpYyBJWEZBX1BhcnNlciwgcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDWEZBX1NpbXBsZVBhcnNlcihJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5LCBGWF9CT09MIGJEb2N1bWVudFBhcnNlciA9IEZBTFNFKTsNCisgICAgfkNYRkFfU2ltcGxlUGFyc2VyKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkICpwU3RyZWFtLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCA9IFhGQV9YRFBQQUNLRVRfWERQKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCURvUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NYTUwsIElGREVfWE1MTm9kZSogJnBYTUxOb2RlLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsNCisgICAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqCUdldEZhY3RvcnkoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wRmFjdG9yeTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlHZXRSb290Tm9kZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BSb290Tm9kZTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElGREVfWE1MRG9jKgkJR2V0WE1MRG9jKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFhNTERvYzsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xvc2VQYXJzZXIoKTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldAkJCQkJCQkoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldF9YRFAJCQkJCQkoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldF9Db25maWcJCQkJCQkoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0JCQkJKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgICBDWEZBX05vZGUqCQkJCVBhcnNlQXNYRFBQYWNrZXRfRGF0YQkJCQkJCShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgICAgQ1hGQV9Ob2RlKgkJCQlQYXJzZUFzWERQUGFja2V0X0xvY2FsZUNvbm5lY3Rpb25Tb3VyY2VTZXQJKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgICBDWEZBX05vZGUqCQkJCVBhcnNlQXNYRFBQYWNrZXRfWGRjCQkJCQkJKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgICBDWEZBX05vZGUqCQkJCVBhcnNlQXNYRFBQYWNrZXRfVXNlcgkJCQkJCShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgICAgQ1hGQV9Ob2RlKgkJCQlOb3JtYWxMb2FkZXIJCQkJCQkJCShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxEb2MsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElELCBGWF9CT09MIGJVc2VBdHRyaWJ1dGUgPSBUUlVFKTsNCisgICAgQ1hGQV9Ob2RlKgkJCQlEYXRhTG9hZGVyCQkJCQkJCQkJKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYywgRlhfQk9PTCBiRG9UcmFuc2Zvcm0pOw0KKyAgICBDWEZBX05vZGUqCQkJCVVzZXJQYWNrZXRMb2FkZXIJCQkJCQkJKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYyk7DQorICAgIHZvaWQJCQkJCVBhcnNlQ29udGVudE5vZGUJCQkJCQkJKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgICAgdm9pZAkJCQkJUGFyc2VEYXRhVmFsdWUJCQkJCQkJCShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICAgIHZvaWQJCQkJCVBhcnNlRGF0YUdyb3VwCQkJCQkJCQkoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgICB2b2lkCQkJCQlQYXJzZUluc3RydWN0aW9uCQkJCQkJCShDWEZBX05vZGUgKnBYRkFOb2RlLCBJRkRFX1hNTEluc3RydWN0aW9uICpwWE1MSW5zdHJ1Y3Rpb24sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJCQkJCVNldEZhY3RvcnkJCQkJCQkJCQkoSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSk7DQorICAgIENYRkFfWE1MUGFyc2VyKgkJCQltX3BYTUxQYXJzZXI7DQorICAgIElGREVfWE1MRG9jKgkJCQltX3BYTUxEb2M7DQorICAgIElGWF9TdHJlYW0qCQkJCQltX3BTdHJlYW07DQorICAgIElGWF9GaWxlUmVhZCoJCQkJbV9wRmlsZVJlYWQ7DQorICAgIElYRkFfT2JqRmFjdG9yeSoJCQltX3BGYWN0b3J5Ow0KKyAgICBDWEZBX05vZGUqCQkJCQltX3BSb290Tm9kZTsNCisgICAgWEZBX1hEUFBBQ0tFVAkJCQltX2VQYWNrZXRJRDsNCisgICAgRlhfQk9PTAkJCQkJCW1fYkRvY3VtZW50UGFyc2VyOw0KKyAgICBmcmllbmQgY2xhc3MgQ1hGQV9Eb2N1bWVudFBhcnNlcjsNCit9Ow0KK2NsYXNzIENYRkFfRG9jdW1lbnRQYXJzZXIgOiBwdWJsaWMgSVhGQV9Eb2NQYXJzZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Eb2N1bWVudFBhcnNlcihJWEZBX05vdGlmeSAqcE5vdGlmeSk7DQorICAgIH5DWEZBX0RvY3VtZW50UGFyc2VyKCk7DQorICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkICpwU3RyZWFtLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCA9IFhGQV9YRFBQQUNLRVRfWERQKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCURvUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWF9JTlQzMgkJCVBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NYTUwsIElGREVfWE1MTm9kZSogJnBYTUxOb2RlLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsNCisgICAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqCUdldEZhY3RvcnkoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9ub2RlUGFyc2VyLkdldEZhY3RvcnkoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlHZXRSb290Tm9kZSgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX25vZGVQYXJzZXIuR2V0Um9vdE5vZGUoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElGREVfWE1MRG9jKgkJR2V0WE1MRG9jKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fbm9kZVBhcnNlci5HZXRYTUxEb2MoKTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIElYRkFfTm90aWZ5KgkJR2V0Tm90aWZ5KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcE5vdGlmeTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0DQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xvc2VQYXJzZXIoKTsNCitwcm90ZWN0ZWQ6DQorICAgIENYRkFfU2ltcGxlUGFyc2VyCQkJbV9ub2RlUGFyc2VyOw0KKyAgICBJWEZBX05vdGlmeSoJCQkJbV9wTm90aWZ5Ow0KKyAgICBDWEZBX0RvY3VtZW50KgkJCQltX3BEb2N1bWVudDsNCit9Ow0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8SUZERV9YTUxOb2RlKj4gQ1hGQV9YTUxOb2RlU3RhY2s7DQorY2xhc3MgQ1hGQV9YTUxQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxQYXJzZXIsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9YTUxQYXJzZXIoSUZERV9YTUxOb2RlICpwUm9vdCwgSUZYX1N0cmVhbSAqcFN0cmVhbSk7DQorICAgIH5DWEZBX1hNTFBhcnNlcigpOw0KKw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCisgICAgew0KKyAgICAgICAgZGVsZXRlIHRoaXM7DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9JTlQzMgkJRG9QYXJzZXIoSUZYX1BhdXNlICpwUGF1c2UpOw0KK3Byb3RlY3RlZDoNCisgICAgSUZERV9YTUxOb2RlCQkJKm1fcFJvb3Q7DQorICAgIElGWF9TdHJlYW0JCQkJKm1fcFN0cmVhbTsNCisgICAgSUZERV9YTUxTeW50YXhQYXJzZXIJKm1fcFBhcnNlcjsNCisNCisgICAgSUZERV9YTUxOb2RlCQkJKm1fcFBhcmVudDsNCisgICAgSUZERV9YTUxOb2RlCQkJKm1fcENoaWxkOw0KKyAgICBDWEZBX1hNTE5vZGVTdGFjawkJbV9Ob2RlU3RhY2s7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJbV93czE7DQorICAgIENGWF9XaWRlU3RyaW5nCQkJbV93czI7DQorICAgIEZYX0RXT1JECQkJCW1fZHdTdGF0dXM7DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KK3B1YmxpYzoNCisgICAgRlhfRklMRVNJWkUJCQkJbV9uU3RhcnRbMl07DQorICAgIHNpemVfdAkJCQkJbV9uU2l6ZVsyXTsNCisgICAgRlhfRklMRVNJWkUJCQkJbV9uRWxlbWVudFN0YXJ0Ow0KKyAgICBGWF9XT1JECQkJCQltX2R3Q2hlY2tTdGF0dXM7DQorICAgIEZYX1dPUkQJCQkJCW1fZHdDdXJyZW50Q2hlY2tTdGF0dXM7DQorI2VuZGlmDQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM5M2Q3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmNwcApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIg0KK0NTY3JpcHRfRGF0YVdpbmRvdzo6Q1NjcmlwdF9EYXRhV2luZG93KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdykNCit7DQorICAgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdzsNCit9DQorQ1NjcmlwdF9EYXRhV2luZG93Ojp+Q1NjcmlwdF9EYXRhV2luZG93KCkNCit7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Nb3ZlQ3VycmVudFJlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X1JlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0dvdG9SZWNvcmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc1JlY29yZEdyb3VwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KK30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3Jkc0JlZm9yZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KK30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfQ3VycmVudFJlY29yZE51bWJlcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KK30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3Jkc0FmdGVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc0RlZmluZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGZkNDE2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9TQ1JJUFRfREFUQVdJTkRPV19IXw0KKyNkZWZpbmUgX1NDUklQVF9EQVRBV0lORE9XX0hfDQorY2xhc3MgQ1NjcmlwdF9EYXRhV2luZG93IDogcHVibGljIENYRkFfT3JkaW5hcnlPYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDU2NyaXB0X0RhdGFXaW5kb3coQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgICAgdmlydHVhbCB+Q1NjcmlwdF9EYXRhV2luZG93KCk7DQorICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfTW92ZUN1cnJlbnRSZWNvcmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfUmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9EYXRhV2luZG93X0dvdG9SZWNvcmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfSXNSZWNvcmRHcm91cChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQmVmb3JlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfQ3VycmVudFJlY29yZE51bWJlcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNBZnRlcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9EYXRhV2luZG93X0lzRGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4MzM0OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSwyMTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiDQorQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9FdmVudFBzZXVkb01vZGVsKQ0KK3sNCisgICAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9FdmVudDsNCit9DQorQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKCkNCit7DQorfQ0KK3ZvaWQgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZhbHVlKSk7DQorICAgIH0NCit9DQordm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9JbnRlclByb3BlcnR5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0lOVDMyJiBpVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcpDQorew0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIGlWYWx1ZSA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlWYWx1ZSk7DQorICAgIH0NCit9DQordm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCYgYlZhbHVlLCBGWF9CT09MIGJTZXR0aW5nKQ0KK3sNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBiVmFsdWUgPSBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oaFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiVmFsdWUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9EV09SRCBkd0ZsYWcsIEZYX0JPT0wgYlNldHRpbmcpDQorew0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBwU2NyaXB0Q29udGV4dC0+R2V0RXZlbnRQYXJhbSgpOw0KKyAgICBpZiAoIXBFdmVudFBhcmFtKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgc3dpdGNoIChkd0ZsYWcpIHsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX0NBTkNFTEFDVElPTjoNCisgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iQ2FuY2VsQWN0aW9uLCBiU2V0dGluZyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9DSEFOR0U6DQorICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c0NoYW5nZSwgYlNldHRpbmcpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ09NTUlUS0VZOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0ludGVyUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9pQ29tbWl0S2V5LCBiU2V0dGluZyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9GVUxMVEVYVDoNCisgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzRnVsbFRleHQsIGJTZXR0aW5nKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX0tFWURPV046DQorICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYktleURvd24sIGJTZXR0aW5nKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX01PRElGSUVSOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Jvb2xlYW5Qcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2JNb2RpZmllciwgYlNldHRpbmcpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfTkVXQ09OVEVOVFRZUEU6DQorICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c05ld0NvbnRlbnRUeXBlLCBiU2V0dGluZyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9ORVdURVhUOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NOZXdUZXh0LCBiU2V0dGluZyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9QUkVWQ09OVEVOVFRZUEU6DQorICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1ByZXZDb250ZW50VHlwZSwgYlNldHRpbmcpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfUFJFVlRFWFQ6DQorICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1ByZXZUZXh0LCBiU2V0dGluZyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9SRUVOVEVSOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Jvb2xlYW5Qcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2JSZWVudGVyLCBiU2V0dGluZyk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FVkVOVF9TRUxFTkQ6DQorICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfSW50ZXJQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2lTZWxFbmQsIGJTZXR0aW5nKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX1NFTFNUQVJUOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0ludGVyUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9pU2VsU3RhcnQsIGJTZXR0aW5nKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX1NISUZUOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Jvb2xlYW5Qcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2JTaGlmdCwgYlNldHRpbmcpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfU09BUEZBVUxUQ09ERToNCisgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzU29hcEZhdWx0Q29kZSwgYlNldHRpbmcpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRVZFTlRfU09BUEZBVUxUU1RSSU5HOg0KKyAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NTb2FwRmF1bHRTdHJpbmcsIGJTZXR0aW5nKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VWRU5UX1RBUkdFVDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NhbmNlbEFjdGlvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DQU5DRUxBQ1RJT04sIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NoYW5nZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DSEFOR0UsIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NvbW1pdEtleShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DT01NSVRLRVksIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Z1bGxUZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0ZVTExURVhULCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0tFWURPV04sIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX01vZGlmaWVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX01PRElGSUVSLCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9ORVdDT05URU5UVFlQRSwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTmV3VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9ORVdURVhULCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFLCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9QUkVWVEVYVCwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVlbnRlcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9SRUVOVEVSLCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0VMRU5ELCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9TRUxTVEFSVCwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2hpZnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0hJRlQsIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NvYXBGYXVsdENvZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU09BUEZBVUxUQ09ERSwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0U3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1NPQVBGQVVMVFNUUklORywgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfVGFyZ2V0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1RBUkdFVCwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRW1pdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtID0gcFNjcmlwdENvbnRleHQtPkdldEV2ZW50UGFyYW0oKTsNCisgICAgaWYgKCFwRXZlbnRQYXJhbSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBOb3RpZnktPkdldFdpZGdldEhhbmRsZXIoKTsNCisgICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocEV2ZW50UGFyYW0tPm1fcFRhcmdldCwgcEV2ZW50UGFyYW0pOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVzZXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7DQorICAgIGlmICghcEV2ZW50UGFyYW0pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwRXZlbnRQYXJhbS0+UmVzZXQoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M1OWUwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9TQ1JJUFRfRVZFTlRQU0VVRE9NT0RFTF9IXw0KKyNkZWZpbmUgX1NDUklQVF9FVkVOVFBTRVVET01PREVMX0hfDQorI2RlZmluZSBYRkFfRVZFTlRfQ0hBTkdFCQkJMA0KKyNkZWZpbmUgWEZBX0VWRU5UX0NPTU1JVEtFWQkJCTENCisjZGVmaW5lIFhGQV9FVkVOVF9GVUxMVEVYVAkJCTINCisjZGVmaW5lIFhGQV9FVkVOVF9LRVlET1dOCQkJMw0KKyNkZWZpbmUgWEZBX0VWRU5UX01PRElGSUVSCQkJNA0KKyNkZWZpbmUgWEZBX0VWRU5UX05FV0NPTlRFTlRUWVBFCTUNCisjZGVmaW5lIFhGQV9FVkVOVF9ORVdURVhUCQkJNg0KKyNkZWZpbmUgWEZBX0VWRU5UX1BSRVZDT05URU5UVFlQRQk3DQorI2RlZmluZSBYRkFfRVZFTlRfUFJFVlRFWFQJCQk4DQorI2RlZmluZSBYRkFfRVZFTlRfUkVFTlRFUgkJCTkNCisjZGVmaW5lIFhGQV9FVkVOVF9TRUxFTkQJCQkxMA0KKyNkZWZpbmUgWEZBX0VWRU5UX1NFTFNUQVJUCQkJMTENCisjZGVmaW5lIFhGQV9FVkVOVF9TSElGVAkJCQkxMg0KKyNkZWZpbmUgWEZBX0VWRU5UX1NPQVBGQVVMVENPREUJCTEzDQorI2RlZmluZSBYRkFfRVZFTlRfU09BUEZBVUxUU1RSSU5HCTE0DQorI2RlZmluZSBYRkFfRVZFTlRfVEFSR0VUCQkJMTUNCisjZGVmaW5lIFhGQV9FVkVOVF9DQU5DRUxBQ1RJT04JCTE2DQorY2xhc3MgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsIDogcHVibGljIENYRkFfT3JkaW5hcnlPYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgICAgdmlydHVhbCB+Q1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKCk7DQorDQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ2FuY2VsQWN0aW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ2hhbmdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRnVsbFRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTW9kaWZpZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX05ld1RleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1JlZW50ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NoaWZ0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0Q29kZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NvYXBGYXVsdFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1RhcmdldChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKw0KKw0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0VtaXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVzZXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiU2V0dGluZyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkN2JhYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmNwcApAQCAtMCwwICsxLDc1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oIg0KK0NTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogQ1hGQV9PcmRpbmFyeU9iamVjdChwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX0hvc3RQc2V1ZG9Nb2RlbCkNCit7DQorICAgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfSG9zdDsNCit9DQorQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6On5DU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCgpDQorew0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0xvYWRTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgSVhGQV9Ob3RpZnkqIHBOb3RpZnksIEZYX0RXT1JEIGR3RmxhZykNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkxvYWRTdHJpbmcoZHdGbGFnLCB3c1ZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWYWx1ZSkpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0FwcFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBcHBUeXBlOw0KKyAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRBcHBUeXBlKHdzQXBwVHlwZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQXBwVHlwZSkpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0QXBwVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0FwcFR5cGU7DQorICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEZveGl0QXBwVHlwZSh3c0FwcFR5cGUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcFR5cGUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DYWxjdWxhdGlvbnNFbmFibGVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDYWxjdWxhdGlvbnNFbmFibGVkKGhEb2MsIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihoVmFsdWUpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJFbmFibGVkID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+SXNDYWxjdWxhdGlvbnNFbmFibGVkKGhEb2MpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYkVuYWJsZWQpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnRQYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUN1cnJlbnRQYWdlID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0Q3VycmVudFBhZ2UoaERvYyk7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpQ3VycmVudFBhZ2UpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0xhbmd1YWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1VOQUJMRV9TRVRfTEFOR1VBR0UpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTGFuZ3VhZ2U7DQorICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldExhbmd1YWdlKHdzTGFuZ3VhZ2UpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0xhbmd1YWdlKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTnVtUGFnZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9OVU1QQUdFUyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaU51bVBhZ2VzID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q291bnRQYWdlcyhoRG9jKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlOdW1QYWdlcyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGxhdGZvcm0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9QTEFURk9STSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQbGF0Zm9ybTsNCisgICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0UGxhdGZvcm0od3NQbGF0Zm9ybSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzUGxhdGZvcm0pKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9UaXRsZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgICAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRUaXRsZShoRG9jLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkdldFRpdGxlKGhEb2MsIHdzVGl0bGUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1RpdGxlKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRWYWxpZGF0aW9uc0VuYWJsZWQoaERvYywgRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGhWYWx1ZSkpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkVuYWJsZWQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChoRG9jKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJFbmFibGVkKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYXJpYXRpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1ZBUklBVElPTik7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYXJpYXRpb247DQorICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldFZhcmlhdGlvbih3c1ZhcmlhdGlvbik7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFyaWF0aW9uKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQorew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChiU2V0dGluZykgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1ZFUlNJT04pOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmVyc2lvbjsNCisgICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0VmVyc2lvbih3c1ZlcnNpb24pOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZlcnNpb24pKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdFZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZlcnNpb247DQorICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEZveGl0VmVyc2lvbih3c1ZlcnNpb24pOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZlcnNpb24pKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9OYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGJTZXR0aW5nKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXBwTmFtZTsNCisgICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0QXBwTmFtZSh3c0FwcE5hbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcE5hbWUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdE5hbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3hpdEFwcE5hbWU7DQorICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEZveGl0QXBwTmFtZSh3c0ZveGl0QXBwTmFtZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzRm94aXRBcHBOYW1lKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR290b1VSTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImdvdG9VUkwiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1VSTDsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgd3NVUkwgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwsIGJzVVJMLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5Hb3RvVVJMKGhEb2MsIHdzVVJMKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9PcGVuTGlzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMIm9wZW5MaXN0IikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZSgwKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChoVmFsdWUpKSB7DQorICAgICAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVmFsdWUsIE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlKSkgew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzU3RyaW5nOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzU3RyaW5nKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNTdHJpbmcsIGJzU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICAgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgICAgICAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgICAgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICAgICAgICAgICAgRlhfSU5UMzIgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c0V4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICAgICAgICBpZiAoaVJldCA8IDEgfHwgIXJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICB9DQorICAgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgICBpZiAoIXBEb2NMYXlvdXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSFdJREdFVCBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQorICAgIGlmICghaFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KHBOb3RpZnktPkdldEhET0MoKSwgaFdpZGdldCk7DQorICAgIHBOb3RpZnktPk9wZW5Ecm9wRG93bkxpc3QoaFdpZGdldCk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzcG9uc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiA0KSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJyZXNwb25zZSIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUXVlc3Rpb247DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGVmYXVsdEFuc3dlcjsNCisgICAgRlhfQk9PTCBiTWFyayA9IEZBTFNFOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1F1ZXN0aW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIHdzUXVlc3Rpb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNRdWVzdGlvbiwgYnNRdWVzdGlvbi5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUaXRsZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgICAgICB3c1RpdGxlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVGl0bGUsIGJzVGl0bGUuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGVmYXVsdEFuc3dlciA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7DQorICAgICAgICB3c0RlZmF1bHRBbnN3ZXIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNEZWZhdWx0QW5zd2VyLCBic0RlZmF1bHRBbnN3ZXIuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDQpIHsNCisgICAgICAgIGJNYXJrID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMykgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Fuc3dlcjsNCisgICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+UmVzcG9uc2Uod3NBbnN3ZXIsIHdzUXVlc3Rpb24sIHdzVGl0bGUsIHdzRGVmYXVsdEFuc3dlciwgYk1hcmspOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQW5zd2VyKSk7DQorICAgIH0NCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUN1ciA9IHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEN1ckRvY3VtZW50SW5CYXRjaCgpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpQ3VyKTsNCisgICAgfQ0KK30NCitzdGF0aWMgRlhfSU5UMzIgWEZBX0ZpbHRlck5hbWUoRlhfV1NUUiB3c0V4cHJlc3Npb24sIEZYX0lOVDMyIG5TdGFydCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmlsdGVyKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xKTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsNCisgICAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gaUxlbmd0aDsNCisgICAgfQ0KKyAgICBGWF9MUFdTVFIgcEJ1ZiA9IHdzRmlsdGVyLkdldEJ1ZmZlcihpTGVuZ3RoIC0gblN0YXJ0KTsNCisgICAgRlhfSU5UMzIgbkNvdW50ID0gMDsNCisgICAgRlhfTFBDV1NUUiBwU3JjID0gd3NFeHByZXNzaW9uLkdldFB0cigpOw0KKyAgICBGWF9XQ0hBUiB3Q3VyOw0KKyAgICB3aGlsZSAoblN0YXJ0IDwgaUxlbmd0aCkgew0KKyAgICAgICAgd0N1ciA9IHBTcmNbblN0YXJ0ICsrXTsNCisgICAgICAgIGlmICh3Q3VyID09ICcsJykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEJ1ZltuQ291bnQgKytdID0gd0N1cjsNCisgICAgfQ0KKyAgICB3c0ZpbHRlci5SZWxlYXNlQnVmZmVyKG5Db3VudCk7DQorICAgIHdzRmlsdGVyLlRyaW1MZWZ0KCk7DQorICAgIHdzRmlsdGVyLlRyaW1SaWdodCgpOw0KKyAgICByZXR1cm4gblN0YXJ0Ow0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc2V0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInJlc2V0RGF0YSIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgICAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlTdGFydCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIEZYX0lOVDMyIGlFeHBMZW5ndGggPSB3c0V4cHJlc3Npb24uR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChpU3RhcnQgPCBpRXhwTGVuZ3RoKSB7DQorICAgICAgICBpU3RhcnQgPSBYRkFfRmlsdGVyTmFtZSh3c0V4cHJlc3Npb24sIGlTdGFydCwgd3NOYW1lKTsNCisgICAgICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCisgICAgICAgIGlmICghcE9iamVjdCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgRlhfSU5UMzIgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c05hbWUsIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgICAgICBwTm90aWZ5LT5SZXNldERhdGEocE5vZGUtPkdldFdpZGdldERhdGEoKSk7DQorICAgIH0NCisgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcE5vdGlmeS0+UmVzZXREYXRhKCk7DQorICAgIH0NCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9CZWVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAwIHx8IGlMZW5ndGggPiAxKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJiZWVwIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdUeXBlID0gNDsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgZHdUeXBlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICAgIH0NCisgICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+QmVlcChkd1R5cGUpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1NldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwic2V0Rm9jdXMiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFZhbHVlKDApOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGhWYWx1ZSkpIHsNCisgICAgICAgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhWYWx1ZSwgTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhoVmFsdWUpKSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNTdHJpbmc7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNTdHJpbmcpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1N0cmluZywgYnNTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICAgICAgICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCisgICAgICAgICAgICBpZiAoIXBPYmplY3QpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICAgICAgICBGWF9JTlQzMiBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBPYmplY3QsIHdzRXhwcmVzc2lvbiwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgICAgICAgICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgIH0NCisgICAgcE5vdGlmeS0+U2V0Rm9jdXNXaWRnZXROb2RlKHBOb2RlKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9HZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gcE5vdGlmeS0+R2V0Rm9jdXNXaWRnZXROb2RlKCk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9NZXNzYWdlQm94KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiA0KSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJtZXNzYWdlQm94IikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KKyAgICBDRlhfV2lkZVN0cmluZyBic1RpdGxlOw0KKyAgICBGWF9EV09SRCBkd01lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsNCisgICAgRlhfRFdPUkQgZHdCdXR0b25UeXBlID0gWEZBX01CX09LOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgICAgICBpZighU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMCwgd3NNZXNzYWdlKSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgICAgICBpZighU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMSwgYnNUaXRsZSkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPj0gMykgew0KKyAgICAgICAgZHdNZXNzYWdlVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgICAgICAgaWYgKGR3TWVzc2FnZVR5cGUgPiBYRkFfTUJJQ09OX1N0YXR1cykgew0KKyAgICAgICAgICAgIGR3TWVzc2FnZVR5cGUgPSBYRkFfTUJJQ09OX0Vycm9yOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDQpIHsNCisgICAgICAgIGR3QnV0dG9uVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDMpOw0KKyAgICAgICAgaWYgKGR3QnV0dG9uVHlwZSA+IFhGQV9NQl9ZZXNOb0NhbmNlbCkgew0KKyAgICAgICAgICAgIGR3QnV0dG9uVHlwZSA9IFhGQV9NQl9PSzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpVmFsdWUgPSBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5Nc2dCb3god3NNZXNzYWdlLCBic1RpdGxlLCBkd01lc3NhZ2VUeXBlLCBkd0J1dHRvblR5cGUpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlWYWx1ZSk7DQorICAgIH0NCit9DQorRlhfQk9PTCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2coQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfSU5UMzIgaUFyZ0luZGV4LCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkNCit7DQorICAgIGlmKHBBcmd1bWVudHMgPT0gTlVMTCB8fCBpQXJnSW5kZXggPCAwKQl7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiSXNKc1R5cGUgPSBGQUxTRTsNCisgICAgaWYobV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VHlwZSgpID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0KSB7DQorICAgICAgICBiSXNKc1R5cGUgPSBUUlVFOw0KKyAgICB9DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWVBcmcgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZShpQXJnSW5kZXgpOw0KKyAgICBpZighRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZUFyZykgJiYgYklzSnNUeXBlKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlQXJnKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoaFZhbHVlQXJnKSkgew0KKyAgICAgICAgd3NWYWx1ZSA9IEZYX1dTVFJDKEwiIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBieU1lc3NhZ2U7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlQXJnLCBieU1lc3NhZ2UpOw0KKyAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChieU1lc3NhZ2UsIGJ5TWVzc2FnZS5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWVBcmcpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudENvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpVmFsdWUgPSBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXREb2N1bWVudENvdW50SW5CYXRjaCgpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlWYWx1ZSk7DQorICAgIH0NCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QcmludChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDgpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInByaW50IikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgRlhfRFdPUkQgZHdPcHRpb25zID0gMDsNCisgICAgRlhfQk9PTCBiU2hvd0RpYWxvZyA9IFRSVUU7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIGJTaG93RGlhbG9nID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgICAgfQ0KKyAgICBpZihiU2hvd0RpYWxvZykgew0KKyAgICAgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9TaG93RGlhbG9nOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5TdGFydFBhZ2UgPSAwOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgICAgICBuU3RhcnRQYWdlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkVuZFBhZ2UgPSAwOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAzKSB7DQorICAgICAgICBuRW5kUGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkNhbkNhbmNlbCA9IFRSVUU7DQorICAgIGlmIChpTGVuZ3RoID49IDQpIHsNCisgICAgICAgIGJDYW5DYW5jZWwgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigzKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIGlmKGJDYW5DYW5jZWwpIHsNCisgICAgICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlNocmlua1BhZ2UgPSBUUlVFOw0KKyAgICBpZiAoaUxlbmd0aCA+PSA1KSB7DQorICAgICAgICBiU2hyaW5rUGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDQpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICAgIH0NCisgICAgaWYoYlNocmlua1BhZ2UpIHsNCisgICAgICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfU2hyaW5rUGFnZTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJBc0ltYWdlID0gVFJVRTsNCisgICAgaWYgKGlMZW5ndGggPj0gNikgew0KKyAgICAgICAgYkFzSW1hZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig1KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIGlmKGJBc0ltYWdlKSB7DQorICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX0FzSW1hZ2U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUmV2ZXJzZU9yZGVyID0gVFJVRTsNCisgICAgaWYgKGlMZW5ndGggPj0gNykgew0KKyAgICAgICAgYkFzSW1hZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig1KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIGJSZXZlcnNlT3JkZXIgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig2KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICBpZihiUmV2ZXJzZU9yZGVyKSB7DQorICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1JldmVyc2VPcmRlcjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJQcmludEFubm90CT0gVFJVRTsNCisgICAgaWYgKGlMZW5ndGggPj0gOCkgew0KKyAgICAgICAgYlByaW50QW5ub3QgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig3KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIGlmKGJQcmludEFubm90KSB7DQorICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1ByaW50QW5ub3Q7DQorICAgIH0NCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+UHJpbnQoaERvYywgblN0YXJ0UGFnZSwgbkVuZFBhZ2UsIGR3T3B0aW9ucyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfSW1wb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImltcG9ydERhdGEiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoOw0KKyAgICBpZiAoaUxlbmd0aCA+IDApIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRmlsZVBhdGggPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgd3NGaWxlUGF0aCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0ZpbGVQYXRoLCBic0ZpbGVQYXRoLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5JbXBvcnREYXRhKGhEb2MsIHdzRmlsZVBhdGgpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0V4cG9ydERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAwIHx8IGlMZW5ndGggPiAyKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJleHBvcnREYXRhIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aDsNCisgICAgRlhfQk9PTCBiWERQID0gVFJVRTsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNGaWxlUGF0aCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgICAgICB3c0ZpbGVQYXRoID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRmlsZVBhdGgsIGJzRmlsZVBhdGguR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgICAgIGJYRFAgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkV4cG9ydERhdGEoaERvYywgd3NGaWxlUGF0aCwgYlhEUCk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGFnZVVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9IRE9DIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICAgIEZYX0lOVDMyIG5DdXJQYWdlID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0Q3VycmVudFBhZ2UoaERvYyk7DQorICAgIEZYX0lOVDMyIG5OZXdQYWdlID0gMDsNCisgICAgaWYgKG5DdXJQYWdlIDw9IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBuTmV3UGFnZSA9IG5DdXJQYWdlIC0gMTsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q3VycmVudFBhZ2UoaERvYywgbk5ld1BhZ2UpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VEb3duKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9IRE9DIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICAgIEZYX0lOVDMyIG5DdXJQYWdlID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0Q3VycmVudFBhZ2UoaERvYyk7DQorICAgIEZYX0lOVDMyIG5QYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5Db3VudFBhZ2VzKGhEb2MpOw0KKyAgICBpZiAoIW5QYWdlQ291bnQgfHwgbkN1clBhZ2UgPT0gblBhZ2VDb3VudCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIG5OZXdQYWdlID0gMDsNCisgICAgaWYgKG5DdXJQYWdlID49IG5QYWdlQ291bnQpIHsNCisgICAgICAgIG5OZXdQYWdlID0gblBhZ2VDb3VudCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBuTmV3UGFnZSA9IG5DdXJQYWdlICsgMTsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudERhdGVUaW1lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVRpbWUgPSBwTm90aWZ5LT5HZXRDdXJyZW50RGF0ZVRpbWUoKTsNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzRGF0YVRpbWUpKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg2ODBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9IT1NUUFNFVURPTU9ERUxfSF8NCisjZGVmaW5lIF9TQ1JJUFRfSE9TVFBTRVVET01PREVMX0hfDQorY2xhc3MgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICAgIHZpcnR1YWwJfkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsKCk7DQorDQorICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9BcHBUeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdEFwcFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0NhbGN1bGF0aW9uc0VuYWJsZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnRQYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9MYW5ndWFnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTnVtUGFnZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BsYXRmb3JtKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9UaXRsZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYXJpYXRpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0VmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTmFtZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXROYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorDQorICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Hb3RvVVJMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfT3Blbkxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNwb25zZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc2V0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0JlZXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9TZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTWVzc2FnZUJveChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50Q291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUHJpbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9JbXBvcnREYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRXhwb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VVcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VEb3duKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudERhdGVUaW1lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0xvYWRTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgSVhGQV9Ob3RpZnkqIHBOb3RpZnksIEZYX0RXT1JEIGR3RmxhZyk7DQorICAgIEZYX0JPT0wgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2coQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfSU5UMzIgaUFyZ0luZGV4LCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNTljYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmNwcApAQCAtMCwwICsxLDc1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ub2RlaGVscGVyLmgiDQorQ1hGQV9TY3JpcHRDb250ZXh0OjpDWEZBX1NjcmlwdENvbnRleHQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCksIG1faEpzUnVudGltZShOVUxMKSwgbV9oSnNDb250ZXh0KE5VTEwpLCBtX2hKc0NsYXNzKE5VTEwpDQorICAgICwgbV9wRXZlbnRQYXJhbShOVUxMKSwgbV9wUmVzb2x2ZVByb2Nlc3NvcihOVUxMKSwgbV9lU2NyaXB0VHlwZShYRkFfU0NSSVBUTEFOR1RZUEVfVW5rb3duKQ0KKyAgICAsIG1faEZNMkpTQ29udGV4dChOVUxMKSwgbV9wVGhpc09iamVjdChOVUxMKSwgbV9wU2NyaXB0Tm9kZUFycmF5KE5VTEwpDQorICAgICwgbV9kd0J1aWx0SW5JbkZsYWdzKDApDQorICAgICwgbV9lUnVuQXRUeXBlKFhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudCkNCit7DQorICAgIEZYX21lbXNldCgmbV9Kc0dsb2JhbENsYXNzLCAwLCBzaXplb2YoRlhKU0VfQ0xBU1MpKTsNCisgICAgRlhfbWVtc2V0KCZtX0pzTm9ybWFsQ2xhc3MsIDAsIHNpemVvZihGWEpTRV9DTEFTUykpOw0KK30NCitDWEZBX1NjcmlwdENvbnRleHQ6On5DWEZBX1NjcmlwdENvbnRleHQoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFhGQVRvSFZhbHVlLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICBDWEZBX09iamVjdCogcFhGQU9iajsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBwVmFsdWU7DQorICAgICAgICBtX21hcFhGQVRvSFZhbHVlLkdldE5leHRBc3NvYyhwcywgcFhGQU9iaiwgcFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocFZhbHVlKTsNCisgICAgfQ0KKyAgICBtX21hcFhGQVRvSFZhbHVlLlJlbW92ZUFsbCgpOw0KKyAgICBSZWxlYXNlVmFyaWFibGVzTWFwKCk7DQorICAgIGlmKG1faEZNMkpTQ29udGV4dCkgew0KKyAgICAgICAgWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKG1faEZNMkpTQ29udGV4dCk7DQorICAgICAgICBtX2hGTTJKU0NvbnRleHQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1faEpzQ29udGV4dCkgew0KKyAgICAgICAgRlhKU0VfQ29udGV4dF9SZWxlYXNlKG1faEpzQ29udGV4dCk7DQorICAgICAgICBtX2hKc0NvbnRleHQgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmKG1fcFJlc29sdmVQcm9jZXNzb3IpIHsNCisgICAgICAgIGRlbGV0ZSBtX3BSZXNvbHZlUHJvY2Vzc29yOw0KKyAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3NvciA9IE5VTEw7DQorICAgIH0NCisgICAgbV91cE9iamVjdEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9DYWNoZUxpc3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlICgoQ1hGQV9Ob2RlTGlzdCopbV9DYWNoZUxpc3RBcnJheVtpXSk7DQorICAgIH0NCisgICAgbV9DYWNoZUxpc3RBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSGFzQ291bnQpIHsNCisgICAgICAgIEZYX1BPU0lUSU9OIHBzID0gbV9KU0J1aWx0SW5PYmplY3RzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgICAgIHdoaWxlIChwcykgew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KKyAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQorICAgICAgICAgICAgbV9KU0J1aWx0SW5PYmplY3RzLkdldE5leHRBc3NvYyhwcywgYnNLZXksIHBWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKHBWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKChGWEpTRV9IVkFMVUUpcFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuUmVtb3ZlQWxsKCk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpDQorew0KKyAgICBtX2hKc1J1bnRpbWUgPSBoUnVudGltZTsNCisgICAgRGVmaW5lSnNDb250ZXh0KCk7DQorICAgIERlZmluZUpzQ2xhc3MoKTsNCisgICAgbV9wUmVzb2x2ZVByb2Nlc3NvciA9IEZYX05FVyBDWEZBX1Jlc29sdmVQcm9jZXNzb3I7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpSZWxlYXNlKCkNCit7DQorICAgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UnVuU2NyaXB0KFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2NyaXB0VHlwZSwgRlhfV1NUUiB3c1NjcmlwdCwgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0ICkNCit7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ0U2NyaXB0Ow0KKyAgICBYRkFfU0NSSVBUTEFOR1RZUEUgZVNhdmVUeXBlID0gbV9lU2NyaXB0VHlwZTsNCisgICAgbV9lU2NyaXB0VHlwZSA9IGVTY3JpcHRUeXBlOw0KKyAgICBpZihlU2NyaXB0VHlwZSA9PSBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMpIHsNCisgICAgICAgIGlmKCFtX2hGTTJKU0NvbnRleHQpIHsNCisgICAgICAgICAgICBtX2hGTTJKU0NvbnRleHQgPSBYRkFfRk0ySlNfQ29udGV4dENyZWF0ZSgpOw0KKyAgICAgICAgICAgIFhGQV9GTTJKU19Db250ZXh0SW5pdGlhbGl6ZShtX2hGTTJKU0NvbnRleHQsIG1faEpzUnVudGltZSwgbV9oSnNDb250ZXh0LCBtX3BEb2N1bWVudCk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0Ow0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFcnJvckluZm87DQorICAgICAgICBGWF9JTlQzMiBpRmxhZ3MgPSBYRkFfRk0ySlNfVHJhbnNsYXRlKHdzU2NyaXB0LCB3c0phdmFTY3JpcHQsIHdzRXJyb3JJbmZvKTsNCisgICAgICAgIGlmKGlGbGFncykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoUmV0VmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGJ0U2NyaXB0ID0gRlhfVVRGOEVuY29kZSh3c0phdmFTY3JpcHQuR2V0QnVmZmVyKCksIHdzSmF2YVNjcmlwdC5HZXRMZW5ndGgoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQpID09IDApIHsNCisgICAgICAgICAgICBtX2R3QnVpbHRJbkluRmxhZ3MgPSBYRkFfSlNCVUlMVElOX0luaXRpYWxpemVkOw0KKyAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBzID0gbV9KU0J1aWx0SW5PYmplY3RzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgICAgICAgICBpZiAocHMpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhPYmplY3QgPSBGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChtX2hKc0NvbnRleHQpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAocHMpIHsNCisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgbV9KU0J1aWx0SW5PYmplY3RzLkdldE5leHRBc3NvYyhwcywgYnNLZXksIHBWYWx1ZSk7DQorICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3AgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGhPYmplY3QsIGJzS2V5LCBoUHJvcCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuU2V0QXQoYnNLZXksIGhQcm9wKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9EZWxldGVPYmplY3RQcm9wKGhPYmplY3QsIGJzS2V5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2R3QnVpbHRJbkluRmxhZ3MgfD0gWEZBX0pTQlVJTFRJTl9IYXNDb3VudDsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9KU0J1aWx0SW5PYmplY3RzLlJlbW92ZUtleShic0tleSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUHJvcCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoT2JqZWN0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBidFNjcmlwdCA9IEZYX1VURjhFbmNvZGUod3NTY3JpcHQuR2V0UHRyKCksIHdzU2NyaXB0LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBDWEZBX09iamVjdCAqcE9yaWdpbmFsT2JqZWN0ID0gbV9wVGhpc09iamVjdDsNCisgICAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0Ow0KKyAgICBGWEpTRV9IVkFMVUUgcFZhbHVlID0gcFRoaXNPYmplY3QgPyBHZXRKU1ZhbHVlRnJvbU1hcChwVGhpc09iamVjdCkgOiBOVUxMOw0KKyAgICBGWF9CT09MCWJSZXQgPSBGWEpTRV9FeGVjdXRlU2NyaXB0KG1faEpzQ29udGV4dCwgYnRTY3JpcHQsIGhSZXRWYWx1ZSwgcFZhbHVlKTsNCisgICAgbV9wVGhpc09iamVjdCA9IHBPcmlnaW5hbE9iamVjdDsNCisgICAgbV9lU2NyaXB0VHlwZSA9IGVTYXZlVHlwZTsNCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENYRkFfT2JqZWN0KiBscE9yZ2luYWxOb2RlID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IGxwT3JnaW5hbE5vZGUtPkdldERvY3VtZW50KCk7DQorICAgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0gKENYRkFfU2NyaXB0Q29udGV4dCopcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBDWEZBX09iamVjdCogbHBDdXJOb2RlID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKGxwT3JnaW5hbE5vZGUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChGWF9MUENTVFIpc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgICBDWEZBX05vZGUqIHBSZWZOb2RlID0gKENYRkFfTm9kZSopbHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIGlmKGxwT3JnaW5hbE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9WYXJpYWJsZXNUaGlzKSB7DQorICAgICAgICBwUmVmTm9kZSA9IChDWEZBX05vZGUqKWxwQ3VyTm9kZTsNCisgICAgfQ0KKyAgICBpZihscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZyhwUmVmTm9kZSwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsIFRSVUUpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYobHBPcmdpbmFsTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoVmFsdWUpKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0T3duUHJvcChoT2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2MtPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRHbG9iYWxQcm9wZXJ0eShwTm90aWZ5LT5HZXRIRE9DKCksIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wJQ1hGQV9TY3JpcHRDb250ZXh0OjpRdWVyeU5vZGVCeUZsYWcoQ1hGQV9Ob2RlKiByZWZOb2RlLCBGWF9XU1RSIHByb3BuYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9EV09SRCBkd0ZsYWcsICBGWF9CT09MIGJTZXR0aW5nKQ0KK3sNCisgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVSczsNCisgICAgRlhfSU5UMzIgaVJldCA9IFJlc29sdmVPYmplY3RzKHJlZk5vZGUsIHByb3BuYW1lLCByZXNvbHZlUnMsIGR3RmxhZyk7DQorICAgIEZYX0JPT0wgYlJlc3VsdCA9IEZBTFNFOw0KKyAgICBpZiAoaVJldCA+IDApIHsNCisgICAgICAgIGJSZXN1bHQgPSBUUlVFOw0KKyAgICAgICAgaWYocmVzb2x2ZVJzLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHBWYWx1ZSA9IEdldEpTVmFsdWVGcm9tTWFwKHJlc29sdmVScy5ub2Rlc1swXSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgcFZhbHVlKTsNCisgICAgICAgIH0gZWxzZSBpZihyZXNvbHZlUnMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlKSB7DQorICAgICAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0gcmVzb2x2ZVJzLnBTY3JpcHRBdHRyaWJ1dGU7DQorICAgICAgICAgICAgaWYobHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICAgICAgICAgIChyZXNvbHZlUnMubm9kZXNbMF0tPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKShoVmFsdWUsIGJTZXR0aW5nLCAoWEZBX0FUVFJJQlVURSlscEF0dHJpYnV0ZUluZm8tPmVBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gYlJlc3VsdDsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ1hGQV9PYmplY3QqIHBPcmdpbmFsT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBPcmdpbmFsT2JqZWN0LT5HZXREb2N1bWVudCgpOw0KKyAgICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9IChDWEZBX1NjcmlwdENvbnRleHQqKXBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgQ1hGQV9PYmplY3QqIGxwQ3VyTm9kZSA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKEZYX0xQQ1NUUilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgICAgaWYgKGxwU2NyaXB0Q29udGV4dC0+R2V0VHlwZSgpID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYykgew0KKyAgICAgICAgaWYoc3pQcm9wTmFtZSA9PSBGWF9CU1RSQyhGT1hJVF9YRkFfRk0ySlNfRk9STUNBTENfUlVOVElNRSkpIHsNCisgICAgICAgICAgICBYRkFfRk0ySlNfR2xvYmFsUHJvcGVydHlHZXR0ZXIobHBTY3JpcHRDb250ZXh0LT5tX2hGTTJKU0NvbnRleHQsIGhWYWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfVUlOVDMyIHVIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzUHJvcE5hbWUsIHdzUHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgaWYodUhhc2hDb2RlICE9IFhGQV9IQVNIQ09ERV9MYXlvdXQpIHsNCisgICAgICAgICAgICBDWEZBX09iamVjdCAqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUodUhhc2hDb2RlKTsNCisgICAgICAgICAgICBpZiAocE9iamVjdCkgew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBscFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBPYmplY3QpKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgICBDWEZBX05vZGUqIHBSZWZOb2RlID0gKENYRkFfTm9kZSopbHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIGlmKHBPcmdpbmFsT2JqZWN0LT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcykgew0KKyAgICAgICAgcFJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilscEN1ck5vZGU7DQorICAgIH0NCisgICAgaWYobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUsIGhWYWx1ZSwgZHdGbGFnLCBGQUxTRSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICBpZihscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZyhwUmVmTm9kZSwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsIEZBTFNFKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0LCBUUlVFKTsNCisgICAgaWYgKHBTY3JpcHRPYmplY3QgJiYgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlSFZhbHVlKChDWEZBX05vZGUgKilwU2NyaXB0T2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUsIFRSVUUpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlCdWlsdGluSFZhbHVlKHN6UHJvcE5hbWUsIGhWYWx1ZSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2MtPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRHbG9iYWxQcm9wZXJ0eShwTm90aWZ5LT5HZXRIRE9DKCksIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQorICAgIGlmKHBPcmdpbmFsT2JqZWN0ID09IE5VTEwpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKEZYX0xQQ1NUUilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCk7DQorICAgIGlmKHdzUHJvcE5hbWUgPT0gRlhfV1NUUkMoTCJ4ZmEiKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHBWYWx1ZSA9IGxwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAobHBTY3JpcHRDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRSb290KCkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgcFZhbHVlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgICBGWF9CT09MIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZygoQ1hGQV9Ob2RlICopcE9iamVjdCwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsIEZBTFNFKTsNCisgICAgaWYoYlJldCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwT2JqZWN0ID09IGxwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpIHx8IChscFNjcmlwdENvbnRleHQtPkdldFR5cGUoKSA9PSBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdCAmJiAhbHBTY3JpcHRDb250ZXh0LT5Jc1N0cmljdFNjb3BlSW5KYXZhU2NyaXB0KCkpKSB7DQorICAgICAgICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICAgICAgYlJldCA9IGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKChDWEZBX05vZGUgKilwT2JqZWN0LCB3c1Byb3BOYW1lLCBoVmFsdWUsIGR3RmxhZywgRkFMU0UpOw0KKyAgICB9DQorICAgIGlmKGJSZXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCwgVFJVRSk7DQorICAgIGlmIChwU2NyaXB0T2JqZWN0KSB7DQorICAgICAgICBiUmV0ID0gbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlSFZhbHVlKChDWEZBX05vZGUgKilwU2NyaXB0T2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUsIFRSVUUpOw0KKyAgICB9DQorICAgIGlmICghYlJldCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKGhWYWx1ZSk7DQorICAgIH0NCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BlcnR5U2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ1hGQV9PYmplY3QqIHBPcmdpbmFsT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgICAgaWYocE9yZ2luYWxPYmplY3QgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0gKENYRkFfU2NyaXB0Q29udGV4dCopcE9yZ2luYWxPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChGWF9MUENTVFIpc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIGxwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUocE9iamVjdC0+R2V0Q2xhc3NJRCgpLCB3c1Byb3BOYW1lKTsNCisgICAgaWYobHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICAocE9iamVjdC0+KihscEF0dHJpYnV0ZUluZm8tPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmKHBPYmplY3QtPklzTm9kZSgpKSB7DQorICAgICAgICAgICAgaWYod3NQcm9wTmFtZS5HZXRBdCgwKSA9PSAnIycpIHsNCisgICAgICAgICAgICAgICAgd3NQcm9wTmFtZSA9IHdzUHJvcE5hbWUuUmlnaHQod3NQcm9wTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopcE9iamVjdDsNCisgICAgICAgICAgICBDWEZBX05vZGUgKnBQcm9wT3JDaGlsZCA9IE5VTEw7DQorICAgICAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIGxwRWxlbWVudEluZm8gPSAgWEZBX0dldEVsZW1lbnRCeU5hbWUod3NQcm9wTmFtZSk7DQorICAgICAgICAgICAgaWYgKGxwRWxlbWVudEluZm8pIHsNCisgICAgICAgICAgICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIGxwRWxlbWVudEluZm8tPmVOYW1lKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwUHJvcE9yQ2hpbGQgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c1Byb3BOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBQcm9wT3JDaGlsZCkgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlZmF1bHROYW1lID0gRlhfV1NUUkMoTCJ7ZGVmYXVsdH0iKTsNCisgICAgICAgICAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShwUHJvcE9yQ2hpbGQtPkdldENsYXNzSUQoKSwgd3NEZWZhdWx0TmFtZSk7DQorICAgICAgICAgICAgICAgIGlmKGxwQXR0cmlidXRlSW5mbykgew0KKyAgICAgICAgICAgICAgICAgICAgKHBQcm9wT3JDaGlsZC0+KihscEF0dHJpYnV0ZUluZm8tPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0LCBUUlVFKTsNCisgICAgICAgIGlmIChwU2NyaXB0T2JqZWN0KSB7DQorICAgICAgICAgICAgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlSFZhbHVlKChDWEZBX05vZGUgKilwU2NyaXB0T2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9JTlQzMiBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BUeXBlR2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWF9CT09MIGJRdWVyeUluKQ0KK3sNCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3QsIE5VTEwpOw0KKyAgICBpZihwT2JqZWN0ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX05vbmU7DQorICAgIH0NCisgICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9iamVjdCk7DQorICAgIFhGQV9FTEVNRU5UIG9iakVsZW1lbnQgPSBwT2JqZWN0LT5HZXRDbGFzc0lEKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKEZYX0xQQ1NUUilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgICAgaWYoWEZBX0dldE1ldGhvZEJ5TmFtZShvYmpFbGVtZW50LCB3c1Byb3BOYW1lKSkgew0KKyAgICAgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kOw0KKyAgICB9DQorICAgIGlmIChiUXVlcnlJbiAmJiAhWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShvYmpFbGVtZW50LCB3c1Byb3BOYW1lKSkgew0KKyAgICAgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTm9uZTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eTsNCit9DQorRlhfSU5UMzIJQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wVHlwZUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhfQk9PTCBiUXVlcnlJbikNCit7DQorICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgICAgaWYocE9iamVjdCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KKyAgICB9DQorICAgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0gKENYRkFfU2NyaXB0Q29udGV4dCopcE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KKyAgICBYRkFfRUxFTUVOVCBvYmpFbGVtZW50ID0gcE9iamVjdC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChGWF9MUENTVFIpc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIGlmKFhGQV9HZXRNZXRob2RCeU5hbWUob2JqRWxlbWVudCwgd3NQcm9wTmFtZSkpIHsNCisgICAgICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZDsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eTsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGwoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KK3sNCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgaWYocE9iamVjdCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9iamVjdCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRnVuTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgoRlhfTFBDU1RSKXN6RnVuY05hbWUuR2V0UHRyKCksIHN6RnVuY05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBYRkFfTFBDTUVUSE9ESU5GTyBscE1ldGhvZEluZm8gPSBYRkFfR2V0TWV0aG9kQnlOYW1lKHBPYmplY3QtPkdldENsYXNzSUQoKSwgd3NGdW5OYW1lKTsNCisgICAgaWYoTlVMTCA9PSBscE1ldGhvZEluZm8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICAocE9iamVjdC0+KihscE1ldGhvZEluZm8tPmxwZm5DYWxsYmFjaykpKCZhcmdzKTsNCit9DQorRlhfQk9PTCBDWEZBX1NjcmlwdENvbnRleHQ6OklzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKQ0KK3sNCisgICAgcmV0dXJuIG1fcERvY3VtZW50LT5IYXNGbGFnKFhGQV9ET0NGTEFHX1N0cmljdFNjb3BpbmcpOw0KK30NCitYRkFfU0NSSVBUTEFOR1RZUEUgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRUeXBlKCkNCit7DQorICAgIHJldHVybiBtX2VTY3JpcHRUeXBlOw0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6RGVmaW5lSnNDb250ZXh0KCkNCit7DQorICAgIG1fSnNHbG9iYWxDbGFzcy5jb25zdHJ1Y3RvciA9IE5VTEw7DQorICAgIG1fSnNHbG9iYWxDbGFzcy5uYW1lID0gIlJvb3QiOw0KKyAgICBtX0pzR2xvYmFsQ2xhc3MucHJvcE51bSA9IDA7DQorICAgIG1fSnNHbG9iYWxDbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgICAgbV9Kc0dsb2JhbENsYXNzLm1ldGhOdW0gPSAwOw0KKyAgICBtX0pzR2xvYmFsQ2xhc3MubWV0aG9kcyA9IE5VTEw7DQorICAgIG1fSnNHbG9iYWxDbGFzcy5keW5Qcm9wR2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcjsNCisgICAgbV9Kc0dsb2JhbENsYXNzLmR5blByb3BTZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5U2V0dGVyOw0KKyAgICBtX0pzR2xvYmFsQ2xhc3MuZHluUHJvcFR5cGVHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BUeXBlR2V0dGVyOw0KKyAgICBtX0pzR2xvYmFsQ2xhc3MuZHluUHJvcERlbGV0ZXIgPSBOVUxMOw0KKyAgICBtX0pzR2xvYmFsQ2xhc3MuZHluTWV0aG9kQ2FsbCA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsTWV0aG9kQ2FsbDsNCisgICAgbV9oSnNDb250ZXh0ID0gRlhKU0VfQ29udGV4dF9DcmVhdGUobV9oSnNSdW50aW1lLCAmbV9Kc0dsb2JhbENsYXNzLCBtX3BEb2N1bWVudC0+R2V0Um9vdCgpKTsNCisgICAgRlhKU0VfQ29udGV4dF9FbmFibGVDb21wYXRpYmxlTW9kZShtX2hKc0NvbnRleHQsIEZYSlNFX0NPTVBBVElCTEVNT0RFRkxBR19DT05TVFJVQ1RPUkVYVFJBTUVUSE9EUyk7DQorfQ0KK0ZYSlNFX0hDT05URVhUIENYRkFfU2NyaXB0Q29udGV4dDo6Q3JlYXRlVmFyaWFibGVzQ29udGV4dChDWEZBX05vZGUqIHBTY3JpcHROb2RlLCBDWEZBX05vZGUqIHBTdWJmb3JtKQ0KK3sNCisgICAgaWYocFNjcmlwdE5vZGUgPT0gTlVMTCB8fCBwU3ViZm9ybSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZihtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0Q291bnQoKSA9PSAwKSB7DQorICAgICAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuY29uc3RydWN0b3IgPSBOVUxMOw0KKyAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLm5hbWUgPSAiWEZBU2NyaXB0T2JqZWN0IjsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5wcm9wTnVtID0gMDsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5tZXRoTnVtID0gMDsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5tZXRob2RzID0gTlVMTDsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wR2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcjsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wU2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eVNldHRlcjsNCisgICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wVHlwZUdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXI7DQorICAgICAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluUHJvcERlbGV0ZXIgPSBOVUxMOw0KKyAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmR5bk1ldGhvZENhbGwgPSBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGw7DQorICAgIH0NCisgICAgQ1hGQV9UaGlzUHJveHkqIGxwVmFyaWFibGVOb2RlID0gRlhfTkVXIENYRkFfVGhpc1Byb3h5KHBTdWJmb3JtLCBwU2NyaXB0Tm9kZSk7DQorICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZXNDb250ZXh0ID0gRlhKU0VfQ29udGV4dF9DcmVhdGUobV9oSnNSdW50aW1lLCAmbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLCAoQ1hGQV9PYmplY3QqKWxwVmFyaWFibGVOb2RlKTsNCisgICAgRlhKU0VfQ29udGV4dF9FbmFibGVDb21wYXRpYmxlTW9kZShoVmFyaWFibGVzQ29udGV4dCwgRlhKU0VfQ09NUEFUSUJMRU1PREVGTEFHX0NPTlNUUlVDVE9SRVhUUkFNRVRIT0RTKTsNCisgICAgbV9tYXBWYXJpYWJsZVRvSFZhbHVlLlNldEF0KHBTY3JpcHROb2RlLCBoVmFyaWFibGVzQ29udGV4dCk7DQorICAgIHJldHVybiBoVmFyaWFibGVzQ29udGV4dDsNCit9DQorQ1hGQV9PYmplY3QqIENYRkFfU2NyaXB0Q29udGV4dDo6R2V0VmFyaWFibGVzVGhpcyhDWEZBX09iamVjdCogcE9iamVjdCwgIEZYX0JPT0wgYlNjcmlwdE5vZGUpDQorew0KKyAgICBpZihwT2JqZWN0LT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcykgew0KKyAgICAgICAgcmV0dXJuIGJTY3JpcHROb2RlID8gKChDWEZBX1RoaXNQcm94eSopcE9iamVjdCktPkdldFNjcmlwdE5vZGUoKSA6ICgoQ1hGQV9UaGlzUHJveHkqKXBPYmplY3QpLT5HZXRUaGlzTm9kZSgpOw0KKyAgICB9DQorICAgIHJldHVybiBwT2JqZWN0Ow0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UnVuVmFyaWFibGVzU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUpDQorew0KKyAgICBpZihwU2NyaXB0Tm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYocFNjcmlwdE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TY3JpcHQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHBTY3JpcHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmKCFwUGFyZW50IHx8IHBQYXJlbnQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZihtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0VmFsdWVBdChwU2NyaXB0Tm9kZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSAqcFRleHROb2RlID0gcFNjcmlwdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGlmICghcFRleHROb2RlKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU2NyaXB0Ow0KKyAgICAgICAgaWYoIXBUZXh0Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NTY3JpcHQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnRTY3JpcHQgPSBGWF9VVEY4RW5jb2RlKHdzU2NyaXB0LkdldFB0cigpLCB3c1NjcmlwdC5HZXRMZW5ndGgoKSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKG1faEpzUnVudGltZSk7DQorICAgICAgICBDWEZBX05vZGUqIHBUaGlzT2JqZWN0ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBGWEpTRV9IQ09OVEVYVCBoVmFyaWFibGVzQ29udGV4dCA9IENyZWF0ZVZhcmlhYmxlc0NvbnRleHQocFNjcmlwdE5vZGUsIHBUaGlzT2JqZWN0KTsNCisgICAgICAgIENYRkFfT2JqZWN0ICpwT3JpZ2luYWxPYmplY3QgPSBtX3BUaGlzT2JqZWN0Ow0KKyAgICAgICAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0Ow0KKyAgICAgICAgRlhfQk9PTAliUmV0ID0gRlhKU0VfRXhlY3V0ZVNjcmlwdChoVmFyaWFibGVzQ29udGV4dCwgYnRTY3JpcHQsIGhSZXRWYWx1ZSk7DQorICAgICAgICBtX3BUaGlzT2JqZWN0ID0gcE9yaWdpbmFsT2JqZWN0Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUmV0VmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIGJSZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpRdWVyeVZhcmlhYmxlSFZhbHVlKENYRkFfTm9kZSogcFNjcmlwdE5vZGUsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiR2V0dGVyKQ0KK3sNCisgICAgaWYocFNjcmlwdE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TY3JpcHQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHZhcmlhYmxlc05vZGUgPSBwU2NyaXB0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmKCF2YXJpYWJsZXNOb2RlIHx8IHZhcmlhYmxlc05vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSZXMgPSBGQUxTRTsNCisgICAgRlhfTFBWT0lEIGxwVmFyaWFibGVzID0gbV9tYXBWYXJpYWJsZVRvSFZhbHVlLkdldFZhbHVlQXQocFNjcmlwdE5vZGUpOw0KKyAgICBpZihscFZhcmlhYmxlcykgew0KKyAgICAgICAgRlhKU0VfSENPTlRFWFQgaFZhcmlhYmxlQ29udGV4dCA9IChGWEpTRV9IQ09OVEVYVClscFZhcmlhYmxlczsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBoT2JqZWN0ID0gRlhKU0VfQ29udGV4dF9HZXRHbG9iYWxPYmplY3QoaFZhcmlhYmxlQ29udGV4dCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgaFZhcmlhYmxlVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgICAgIGlmICghYkdldHRlcikgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AoaE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhbHVlKTsNCisgICAgICAgICAgICBiUmVzID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9PYmplY3RIYXNPd25Qcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoaE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhcmlhYmxlVmFsdWUpOw0KKyAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzRnVuY3Rpb24oaFZhcmlhYmxlVmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZ1bmN0aW9uQmluZChoVmFsdWUsIGhWYXJpYWJsZVZhbHVlLCBoT2JqZWN0KTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGJHZXR0ZXIpIHsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgaFZhcmlhYmxlVmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFyaWFibGVWYWx1ZSwgaFZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYlJlcyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYXJpYWJsZVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaE9iamVjdCk7DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXM7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpRdWVyeUJ1aWx0aW5IVmFsdWUoRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgdm9pZCogcEJ1aWx0aW4gPSBOVUxMOw0KKyAgICBpZiAoKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSGFzQ291bnQpICYmIG1fSlNCdWlsdEluT2JqZWN0cy5Mb29rdXAoc3pQcm9wTmFtZSwgcEJ1aWx0aW4pKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCAoRlhKU0VfSFZBTFVFKXBCdWlsdGluKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OlJlbGVhc2VWYXJpYWJsZXNNYXAoKQ0KK3sNCisgICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAocHMpIHsNCisgICAgICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0Tm9kZTsNCisgICAgICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZUNvbnRleHQ7DQorICAgICAgICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0TmV4dEFzc29jKHBzLCBwU2NyaXB0Tm9kZSwgaFZhcmlhYmxlQ29udGV4dCk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgaE9iamVjdCA9IEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KGhWYXJpYWJsZUNvbnRleHQpOw0KKyAgICAgICAgQ1hGQV9PYmplY3QqIGxwQ3VyTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQorICAgICAgICBpZihscEN1ck5vZGUpIHsNCisgICAgICAgICAgICBkZWxldGUgKENYRkFfVGhpc1Byb3h5KilscEN1ck5vZGU7DQorICAgICAgICAgICAgbHBDdXJOb2RlID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaE9iamVjdCk7DQorICAgICAgICBGWEpTRV9Db250ZXh0X1JlbGVhc2UoaFZhcmlhYmxlQ29udGV4dCk7DQorICAgICAgICBoVmFyaWFibGVDb250ZXh0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpEZWZpbmVKc0NsYXNzKCkNCit7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5jb25zdHJ1Y3RvciA9IE5VTEw7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5uYW1lID0gIlhGQU9iamVjdCI7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5wcm9wTnVtID0gMDsNCisgICAgbV9Kc05vcm1hbENsYXNzLnByb3BlcnRpZXMgPSBOVUxMOw0KKyAgICBtX0pzTm9ybWFsQ2xhc3MubWV0aE51bSA9IDA7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5tZXRob2RzID0gTlVMTDsNCisgICAgbV9Kc05vcm1hbENsYXNzLmR5blByb3BHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BlcnR5R2V0dGVyOw0KKyAgICBtX0pzTm9ybWFsQ2xhc3MuZHluUHJvcFNldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlTZXR0ZXI7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5keW5Qcm9wVHlwZUdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXI7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5keW5Qcm9wRGVsZXRlciA9IE5VTEw7DQorICAgIG1fSnNOb3JtYWxDbGFzcy5keW5NZXRob2RDYWxsID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsOw0KKyAgICBtX2hKc0NsYXNzID0gRlhKU0VfRGVmaW5lQ2xhc3MobV9oSnNDb250ZXh0LCAmbV9Kc05vcm1hbENsYXNzKTsNCit9DQorRlhKU0VfSENMQVNTIENYRkFfU2NyaXB0Q29udGV4dDo6R2V0SnNlTm9ybWFsQ2xhc3MoKQ0KK3sNCisgICAgcmV0dXJuIG1faEpzQ2xhc3M7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpBZGRKU0J1aWx0aW5PYmplY3QoWEZBX0xQQ0pTQlVJTFRJTklORk8gcEJ1aXRpbk9iamVjdCkNCit7DQorICAgIGlmIChtX2R3QnVpbHRJbkluRmxhZ3MgJiBYRkFfSlNCVUlMVElOX0luaXRpYWxpemVkKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9KU0J1aWx0SW5PYmplY3RzLlNldEF0KHBCdWl0aW5PYmplY3QtPnBOYW1lLCAodm9pZCopcEJ1aXRpbk9iamVjdCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfU2NyaXB0Q29udGV4dDo6UmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk5vZGUsIEZYX1dTVFIgd3NFeHByZXNzaW9uLCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsICBGWF9EV09SRCBkd1N0eWxlcywgQ1hGQV9Ob2RlKiBiaW5kTm9kZSkNCit7DQorICAgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAobV9lU2NyaXB0VHlwZSAhPSBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMgfHwgKGR3U3R5bGVzICYgKFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpKSkgew0KKyAgICAgICAgbV91cE9iamVjdEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgICB9DQorICAgIGlmKHJlZk5vZGUgJiYgKGR3U3R5bGVzICYgKFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpKSAmJiByZWZOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgICAgbV91cE9iamVjdEFycmF5LkFkZCgoQ1hGQV9Ob2RlKilyZWZOb2RlKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJOZXh0Q3JlYXRlID0gRkFMU0U7DQorICAgIGlmKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+WEZBX1NldENyZWF0ZU5vZGVUeXBlKGJpbmROb2RlKTsNCisgICAgfQ0KKyAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1fcENyZWF0ZVBhcmVudCA9IE5VTEw7DQorICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3VyQWxsU3RhcnQgPSAtMTsNCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQorICAgIEZYX0lOVDMyIG5TdGFydCA9IDA7DQorICAgIEZYX0lOVDMyIG5MZXZlbCA9IDA7DQorICAgIEZYX0lOVDMyIG5SZXQgPSAtMTsNCisgICAgcm5kRmluZC5tX3BTQyA9IHRoaXM7DQorICAgIENYRkFfT2JqQXJyYXkgZmluZE5vZGVzOw0KKyAgICBpZiAocmVmTm9kZSAhPSBOVUxMKSB7DQorICAgICAgICBmaW5kTm9kZXMuQWRkKHJlZk5vZGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgZmluZE5vZGVzLkFkZChtX3BEb2N1bWVudC0+R2V0Um9vdCgpKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuTm9kZXMgPSAwOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgbk5vZGVzID0gZmluZE5vZGVzLkdldFNpemUoKTsNCisgICAgICAgIEZYX0lOVDMyIGkgPSAwOw0KKyAgICAgICAgcm5kRmluZC5tX2R3U3R5bGVzID0gZHdTdHlsZXM7DQorICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5tX2lDdXJTdGFydCA9IG5TdGFydDsNCisgICAgICAgIG5TdGFydCA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPlhGQV9SZXNvbHZlTm9kZXNfR2V0RmlsdGVyKHdzRXhwcmVzc2lvbiwgblN0YXJ0LCBybmRGaW5kKTsNCisgICAgICAgIGlmIChuU3RhcnQgPCAxKSB7DQorICAgICAgICAgICAgaWYoKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpICYmICFiTmV4dENyZWF0ZSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgICAgIG5TdGFydCA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3VyQWxsU3RhcnQ7DQorICAgICAgICAgICAgICAgIGlmKG5TdGFydCAhPSAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gbV9wRG9jdW1lbnQtPkdldE5vdEJpbmROb2RlKGZpbmROb2Rlcyk7DQorICAgICAgICAgICAgICAgICAgICBpZihwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZmluZE5vZGVzLkFkZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gKENYRkFfTm9kZSopZmluZE5vZGVzWzBdOw0KKyAgICAgICAgICAgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICAgICAgZmluZE5vZGVzLkFkZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZHdTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX0JpbmQ7DQorICAgICAgICAgICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICAgICAgZmluZE5vZGVzLkFkZChtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1fcEFsbFN0YXJ0UGFyZW50KTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYk5leHRDcmVhdGUpIHsNCisgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGUgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPlhGQV9SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZShybmRGaW5kLm1fd3NOYW1lLCBybmRGaW5kLm1fd3NDb25kaXRpb24sIG5TdGFydCA9PSB3c0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkgPyBUUlVFIDogRkFMU0UsIHRoaXMpOw0KKyAgICAgICAgICAgIGlmKGJDcmVhdGUpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9PYmpBcnJheSByZXROb2RlczsNCisgICAgICAgIHdoaWxlIChpIDwgbk5vZGVzKSB7DQorCQkJRlhfQk9PTCBiRGF0YUJpbmQgPSBGQUxTRTsNCisgICAgICAgICAgICBpZigoKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0JpbmQpIHx8IChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSkgJiYgbk5vZGVzID4gMSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kQmluZDsNCisgICAgICAgICAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRGaWx0ZXIod3NFeHByZXNzaW9uLCBuU3RhcnQsIHJuZEJpbmQpOw0KKyAgICAgICAgICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5YRkFfUmVzb2x2ZU5vZGVfU2V0SW5kZXhEYXRhQmluZChybmRCaW5kLm1fd3NDb25kaXRpb24sIGksIG5Ob2Rlcyk7DQorCQkJCWJEYXRhQmluZCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gZmluZE5vZGVzW2kgKytdOw0KKyAgICAgICAgICAgIHJuZEZpbmQubV9uTGV2ZWwgPSBuTGV2ZWw7DQorICAgICAgICAgICAgcm5kRmluZC5tX2R3RmxhZyA9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlczsNCisgICAgICAgICAgICBuUmV0ID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2RlcyhybmRGaW5kKTsNCisgICAgICAgICAgICBpZiAoblJldCA8IDEpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChybmRGaW5kLm1fZHdGbGFnID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGUgJiYgcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGUgJiYgblN0YXJ0IDwgd3NFeHByZXNzaW9uLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgICAgICAgICAgICAgKHJuZEZpbmQubV9Ob2Rlc1swXS0+KihybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZS0+bHBmbkNhbGxiYWNrKSkoaFZhbHVlLCBGQUxTRSwgKFhGQV9BVFRSSUJVVEUpcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGUtPmVBdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgICAgICBybmRGaW5kLm1fTm9kZXMuU2V0QXQoMCwgKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVmFsdWUsIE5VTEwpKTsNCisgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IG1fdXBPYmplY3RBcnJheS5HZXRTaXplKCk7DQorICAgICAgICAgICAgaWYgKGlTaXplKSB7DQorICAgICAgICAgICAgICAgIG1fdXBPYmplY3RBcnJheS5SZW1vdmVBdChpU2l6ZSAtIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXROb2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorCQkJaWYoYkRhdGFCaW5kKXsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgbk5vZGVzID0gcmV0Tm9kZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgaWYgKG5Ob2RlcyA8IDEpIHsNCisgICAgICAgICAgICBpZihkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQorICAgICAgICAgICAgICAgIGJOZXh0Q3JlYXRlID0gVFJVRTsNCisgICAgICAgICAgICAgICAgaWYobV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmRGaW5kLm1fQ3VyTm9kZTsNCisgICAgICAgICAgICAgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3JlYXRlQ291bnQgPSAxOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZSA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+WEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c0NvbmRpdGlvbiwgblN0YXJ0ID09IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSA/IFRSVUUgOiBGQUxTRSwgdGhpcyk7DQorICAgICAgICAgICAgICAgIGlmKGJDcmVhdGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBmaW5kTm9kZXMuQ29weShyZXROb2Rlcyk7DQorICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICBpZiAobkxldmVsID09IDApIHsNCisgICAgICAgICAgICBkd1N0eWxlcyAmPSB+KFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkxldmVsICsrOw0KKyAgICB9DQorICAgIGlmKCFiTmV4dENyZWF0ZSkgew0KKyAgICAgICAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gcm5kRmluZC5tX2R3RmxhZzsNCisgICAgICAgIGlmIChuTm9kZXMgPiAwKSB7DQorICAgICAgICAgICAgcmVzb2x2ZU5vZGVSUy5ub2Rlcy5BcHBlbmQoZmluZE5vZGVzKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKHJuZEZpbmQubV9kd0ZsYWcgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0F0dHJpYnV0ZSkgew0KKyAgICAgICAgICAgIHJlc29sdmVOb2RlUlMucFNjcmlwdEF0dHJpYnV0ZSA9IHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGR3U3R5bGVzICYgKFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlIHwgWEZBX1JFU09MVkVOT0RFX0JpbmQgfCBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykpIHsNCisgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPlhGQV9SZXNvbHZlTm9kZV9TZXRSZXN1bHRDcmVhdGVOb2RlKHJlc29sdmVOb2RlUlMsIHJuZEZpbmQubV93c0NvbmRpdGlvbik7DQorICAgICAgICBpZiAoIWJOZXh0Q3JlYXRlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSkgew0KKyAgICAgICAgICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9FeGlzdE5vZGVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlUlMubm9kZXMuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIHJldHVybiBuTm9kZXM7DQorfQ0KK0ZYSlNFX0hWQUxVRSBDWEZBX1NjcmlwdENvbnRleHQ6OkdldEpTVmFsdWVGcm9tTWFwKENYRkFfT2JqZWN0KiBwT2JqZWN0KQ0KK3sNCisgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZihwT2JqZWN0LT5Jc05vZGUoKSkgew0KKyAgICAgICAgUnVuVmFyaWFibGVzU2NyaXB0KChDWEZBX05vZGUqKXBPYmplY3QpOw0KKyAgICB9DQorICAgIEZYX0xQVk9JRCBwVmFsdWUgPSBtX21hcFhGQVRvSFZhbHVlLkdldFZhbHVlQXQocE9iamVjdCk7DQorICAgIGlmKHBWYWx1ZSA9PSBOVUxMKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNIdmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdChqc0h2YWx1ZSwgcE9iamVjdCwgbV9oSnNDbGFzcyk7DQorICAgICAgICBtX21hcFhGQVRvSFZhbHVlLlNldEF0KHBPYmplY3QsIGpzSHZhbHVlKTsNCisgICAgICAgIHBWYWx1ZSA9IGpzSHZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiAoRlhKU0VfSFZBTFVFKXBWYWx1ZTsNCit9DQorRlhfSU5UMzIJQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRJbmRleEJ5TmFtZShDWEZBX05vZGUqIHJlZk5vZGUpDQorew0KKyAgICBDWEZBX05vZGVIZWxwZXIqIGxwTm9kZUhlbHBlciA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKTsNCisgICAgcmV0dXJuIGxwTm9kZUhlbHBlci0+WEZBX0dldEluZGV4KHJlZk5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwgbHBOb2RlSGVscGVyLT5YRkFfTm9kZUlzUHJvcGVydHkocmVmTm9kZSksIEZBTFNFKTsNCit9DQorRlhfSU5UMzIJQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRJbmRleEJ5Q2xhc3NOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkNCit7DQorICAgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOw0KKyAgICByZXR1cm4gbHBOb2RlSGVscGVyLT5YRkFfR2V0SW5kZXgocmVmTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCBscE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKSwgVFJVRSk7DQorfQ0KK3ZvaWQJCUNYRkFfU2NyaXB0Q29udGV4dDo6R2V0U29tRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUsIENGWF9XaWRlU3RyaW5nICZ3c0V4cHJlc3Npb24pDQorew0KKyAgICBDWEZBX05vZGVIZWxwZXIqIGxwTm9kZUhlbHBlciA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKTsNCisgICAgbHBOb2RlSGVscGVyLT5YRkFfR2V0TmFtZUV4cHJlc3Npb24ocmVmTm9kZSwgd3NFeHByZXNzaW9uLCBUUlVFLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpOw0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6U2V0Tm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGVBcnJheSAqcEFycmF5KQ0KK3sNCisgICAgbV9wU2NyaXB0Tm9kZUFycmF5ID0gcEFycmF5Ow0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6QWRkTm9kZXNPZlJ1blNjcmlwdChjb25zdCBDWEZBX05vZGVBcnJheSYgbm9kZXMpDQorew0KKyAgICBpZiAoIW1fcFNjcmlwdE5vZGVBcnJheSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICBtX3BTY3JpcHROb2RlQXJyYXktPkNvcHkobm9kZXMpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpBZGROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpDQorew0KKyAgICBpZiAoIW1fcFNjcmlwdE5vZGVBcnJheSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChtX3BTY3JpcHROb2RlQXJyYXktPkZpbmQocE5vZGUpID09IC0xKSB7DQorICAgICAgICBtX3BTY3JpcHROb2RlQXJyYXktPkFkZChwTm9kZSk7DQorICAgIH0NCit9DQorSVhGQV9TY3JpcHRDb250ZXh0KiBYRkFfU2NyaXB0Q29udGV4dF9DcmVhdGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KK3sNCisgICAgcmV0dXJuIEZYX05FVyBDWEZBX1NjcmlwdENvbnRleHQocERvY3VtZW50KTsNCit9DQorc3RhdGljIGNvbnN0IFhGQV9KU0JVSUxUSU5JTkZPIGdzX0pTQlVJTFRJTkRhdGFbXSA9IHsNCisgICAgezB4ODEwOGI5YTksIChGWF9MUENTVFIpIk51bWJlciJ9LA0KKyAgICB7MHhlMDdlM2ZiZSwgKEZYX0xQQ1NUUikiRGF0ZSJ9LA0KK307DQorY29uc3QgRlhfSU5UMzIgZ19pSlNCdWlsdGluQ291bnQgPSBzaXplb2YoWEZBX0pTQlVJTFRJTklORk8pIC8gc2l6ZW9mKFhGQV9KU0JVSUxUSU5JTkZPKTsNCitYRkFfTFBDSlNCVUlMVElOSU5GTyBYRkFfR2V0SlNCdWlsdGluQnlIYXNoKEZYX1VJTlQzMiB1SGFzaENvZGUpDQorew0KKyAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpRW5kID0gZ19pSlNCdWlsdGluQ291bnQgLSAxLCBpTWlkOw0KKyAgICBkbyB7DQorICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICAgIFhGQV9MUENKU0JVSUxUSU5JTkZPIHBJbmZvID0gZ3NfSlNCVUlMVElORGF0YSArIGlNaWQ7DQorICAgICAgICBpZiAodUhhc2hDb2RlID09IHBJbmZvLT51VW5pY29kZUhhc2gpIHsNCisgICAgICAgICAgICByZXR1cm4gcEluZm87DQorICAgICAgICB9IGVsc2UgaWYgKHVIYXNoQ29kZSA8IHBJbmZvLT51VW5pY29kZUhhc2gpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFlYzFhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuaApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX1NDUklQVF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfU0NSSVBUX0lNUF9IDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZQkJCQkweDAwMDINCisjZGVmaW5lIFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQJCQkweDAwMDENCisjZGVmaW5lIFhGQV9KU0JVSUxUSU5fSGFzQ291bnQJCQkJMHgwMDAyDQorY2xhc3MgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOw0KK2NsYXNzIENYRkFfU2NyaXB0Q29udGV4dCA6IHB1YmxpYyBJWEZBX1NjcmlwdENvbnRleHQsIHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9TY3JpcHRDb250ZXh0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICAgIH5DWEZBX1NjcmlwdENvbnRleHQoKTsNCisgICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKTsNCisgICAgdmlydHVhbCB2b2lkCQkJCVNldEV2ZW50UGFyYW0oQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkNCisgICAgew0KKyAgICAgICAgbV9wRXZlbnRQYXJhbSA9IHBFdmVudFBhcmFtOw0KKyAgICB9DQorICAgIHZpcnR1YWwgQ1hGQV9FdmVudFBhcmFtKglHZXRFdmVudFBhcmFtKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcEV2ZW50UGFyYW07DQorICAgIH0NCisgICAgdmlydHVhbCBGWF9CT09MCQkJUnVuU2NyaXB0KFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2NyaXB0VHlwZSwgRlhfV1NUUiB3c1NjcmlwdCwgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0ID0gTlVMTCk7DQorDQorICAgIHZpcnR1YWwgRlhfSU5UMzIJCVJlc29sdmVPYmplY3RzKENYRkFfT2JqZWN0KiByZWZOb2RlLCBGWF9XU1RSIHdzRXhwcmVzc2lvbiwgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvbHZlTm9kZVJTLCAgRlhfRFdPUkQgZHdTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4sIENYRkFfTm9kZSogYmluZE5vZGUgPSBOVUxMKTsNCisgICAgdmlydHVhbCBGWEpTRV9IVkFMVUUJR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlDYWNoZUxpc3QoQ1hGQV9Ob2RlTGlzdCogcExpc3QpDQorICAgIHsNCisgICAgICAgIG1fQ2FjaGVMaXN0QXJyYXkuQWRkKHBMaXN0KTsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIENYRkFfT2JqZWN0KglHZXRUaGlzT2JqZWN0KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcFRoaXNPYmplY3Q7DQorICAgIH0NCisgICAgdmlydHVhbCBGWEpTRV9IUlVOVElNRQlHZXRSdW50aW1lKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faEpzUnVudGltZTsNCisgICAgfQ0KKw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRJbmRleEJ5TmFtZShDWEZBX05vZGUqIHJlZk5vZGUpOw0KKyAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRJbmRleEJ5Q2xhc3NOYW1lKENYRkFfTm9kZSogcmVmTm9kZSk7DQorICAgIHZpcnR1YWwgdm9pZAkJCUdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NFeHByZXNzaW9uKTsNCisNCisgICAgdmlydHVhbCB2b2lkCQkJU2V0Tm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGVBcnJheSAqcEFycmF5KTsNCisgICAgdmlydHVhbCB2b2lkCQkJQWRkTm9kZXNPZlJ1blNjcmlwdChjb25zdCBDWEZBX05vZGVBcnJheSYgbm9kZXMpOw0KKyAgICB2aXJ0dWFsIHZvaWQJCQlBZGROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpOw0KKyAgICB2aXJ0dWFsIEZYSlNFX0hDTEFTUwlHZXRKc2VOb3JtYWxDbGFzcygpOw0KKw0KKyAgICB2aXJ0dWFsCXZvaWQJCQlBZGRKU0J1aWx0aW5PYmplY3QoWEZBX0xQQ0pTQlVJTFRJTklORk8gcEJ1aXRpbk9iamVjdCk7DQorICAgIHZpcnR1YWwJdm9pZAkJCVNldFJ1bkF0VHlwZShYRkFfQVRUUklCVVRFRU5VTSBlUnVuQXQpDQorICAgIHsNCisgICAgICAgIG1fZVJ1bkF0VHlwZSA9IGVSdW5BdDsNCisgICAgfQ0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1J1bkF0Q2xpZW50KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fZVJ1bkF0VHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXI7DQorICAgIH0NCisgICAgRlhfQk9PTAkJCQkJUXVlcnlOb2RlQnlGbGFnKENYRkFfTm9kZSogcmVmTm9kZSwgRlhfV1NUUiBwcm9wbmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJTZXR0aW5nKTsNCisgICAgRlhfQk9PTAkJCQkJUXVlcnlWYXJpYWJsZUhWYWx1ZShDWEZBX05vZGUqIHBTY3JpcHROb2RlLCBGWF9CU1RSIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYkdldHRlcik7DQorICAgIEZYX0JPT0wJCQkJCVF1ZXJ5QnVpbHRpbkhWYWx1ZShGWF9CU1RSIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgICBzdGF0aWMgdm9pZAkJCQlHbG9iYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICAgIHN0YXRpYyB2b2lkCQkJCUdsb2JhbFByb3BlcnR5U2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgICAgc3RhdGljIHZvaWQJCQkJTm9ybWFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBGWF9CU1RSIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgICBzdGF0aWMgdm9pZAkJCQlOb3JtYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICAgIHN0YXRpYyB2b2lkCQkJCU5vcm1hbE1ldGhvZENhbGwoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhfQlNUUiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgICAgc3RhdGljIEZYX0lOVDMyCQkJTm9ybWFsUHJvcFR5cGVHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBGWF9CU1RSIHN6UHJvcE5hbWUsIEZYX0JPT0wgYlF1ZXJ5SW4pOw0KKyAgICBzdGF0aWMgRlhfSU5UMzIJCQlHbG9iYWxQcm9wVHlwZUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhfQk9PTCBiUXVlcnlJbik7DQorICAgIEZYX0JPT0wJCQkJCVJ1blZhcmlhYmxlc1NjcmlwdChDWEZBX05vZGUqIHBTY3JpcHROb2RlKTsNCisgICAgQ1hGQV9PYmplY3QqCQkJR2V0VmFyaWFibGVzVGhpcyhDWEZBX09iamVjdCogcE9iamVjdCwgRlhfQk9PTCBiU2NyaXB0Tm9kZSA9IEZBTFNFKTsNCisgICAgdm9pZAkJCQkJUmVsZWFzZVZhcmlhYmxlc01hcCgpOw0KKyAgICBGWF9CT09MCQkJCQlJc1N0cmljdFNjb3BlSW5KYXZhU2NyaXB0KCk7DQorICAgIFhGQV9TQ1JJUFRMQU5HVFlQRQkJR2V0VHlwZSgpOw0KKyAgICBDWEZBX05vZGVBcnJheSYJCQlHZXRVcE9iamVjdEFycmF5KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fdXBPYmplY3RBcnJheTsNCisgICAgfQ0KKyAgICBDWEZBX0RvY3VtZW50KgkJCUdldERvY3VtZW50KCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50Ow0KKyAgICB9DQorcHJvdGVjdGVkOg0KKyAgICB2b2lkCQkJCQlEZWZpbmVKc0NvbnRleHQoKTsNCisgICAgRlhKU0VfSENPTlRFWFQJCQlDcmVhdGVWYXJpYWJsZXNDb250ZXh0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUsIENYRkFfTm9kZSogcFN1YmZvcm0pOw0KKw0KKyAgICB2b2lkCQkJCQlEZWZpbmVKc0NsYXNzKCk7DQorICAgIENYRkFfRG9jdW1lbnQqCQkJCQkJCQkJbV9wRG9jdW1lbnQ7DQorICAgIEZYSlNFX0hDT05URVhUCQkJCQkJCQkJbV9oSnNDb250ZXh0Ow0KKyAgICBGWEpTRV9IUlVOVElNRQkJCQkJCQkJCW1faEpzUnVudGltZTsNCisgICAgRlhKU0VfSENMQVNTCQkJCQkJCQkJbV9oSnNDbGFzczsNCisgICAgWEZBX1NDUklQVExBTkdUWVBFCQkJCQkJCQltX2VTY3JpcHRUeXBlOw0KKyAgICBGWEpTRV9DTEFTUwkJCQkJCQkJCQltX0pzR2xvYmFsQ2xhc3M7DQorICAgIEZYSlNFX0NMQVNTCQkJCQkJCQkJCW1fSnNOb3JtYWxDbGFzczsNCisgICAgQ0ZYX01hcFB0clRlbXBsYXRlPENYRkFfT2JqZWN0KiwgRlhKU0VfSFZBTFVFPiAgbV9tYXBYRkFUb0hWYWx1ZTsNCisNCisgICAgRlhKU0VfQ0xBU1MJCQkJCQkJCQkJbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzOw0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IQ09OVEVYVD4gbV9tYXBWYXJpYWJsZVRvSFZhbHVlOw0KKyAgICBDWEZBX0V2ZW50UGFyYW0qCQkJCQkJCQltX3BFdmVudFBhcmFtOw0KKyAgICBDWEZBX05vZGVBcnJheQkJCQkJCQkJCW1fdXBPYmplY3RBcnJheTsNCisgICAgQ0ZYX1B0ckFycmF5CQkJCQkJCQkJbV9DYWNoZUxpc3RBcnJheTsNCisgICAgQ1hGQV9Ob2RlQXJyYXkqCQkJCQkJCQkJbV9wU2NyaXB0Tm9kZUFycmF5Ow0KKyAgICBDWEZBX1Jlc29sdmVQcm9jZXNzb3IqCQkJCQkJCW1fcFJlc29sdmVQcm9jZXNzb3I7DQorICAgIFhGQV9IRk0ySlNDT05URVhUCQkJCQkJCQltX2hGTTJKU0NvbnRleHQ7DQorICAgIENYRkFfT2JqZWN0KgkJCQkJCQkJCW1fcFRoaXNPYmplY3Q7DQorICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyCQkJCQkJCW1fSlNCdWlsdEluT2JqZWN0czsNCisgICAgRlhfRFdPUkQJCQkJCQkJCQkJbV9kd0J1aWx0SW5JbkZsYWdzOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTQkJCQkJCQkJbV9lUnVuQXRUeXBlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRhNWJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSw1MjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaCINCitDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfTGF5b3V0UHNldWRvTW9kZWwpDQorew0KKyAgICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX0xheW91dDsNCit9DQorQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoKQ0KK3sNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVhZHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBpZiAoYlNldHRpbmcpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9SRUFEWSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVN0YXR1cyA9IHBOb3RpZnktPkdldExheW91dFN0YXR1cygpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgaVN0YXR1cyA+PSAyKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSFdYWShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLCBYRkFfTEFZT1VUTU9ERUxfSFdYWSBsYXlvdXRNb2RlbCkNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKCBpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgew0KKyAgICAgICAgRlhfTFBDV1NUUiBtZXRob2ROYW1lID0gTlVMTDsNCisgICAgICAgIHN3aXRjaCAobGF5b3V0TW9kZWwpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9IOg0KKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gKEZYX0xQQ1dTVFIpKEwiaCIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9XOg0KKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gKEZYX0xQQ1dTVFIpKEwidyIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9YOg0KKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gKEZYX0xQQ1dTVFIpKEwieCIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9ZOg0KKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gKEZYX0xQQ1dTVFIpKEwieSIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIG1ldGhvZE5hbWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1VuaXQgPSBGWF9XU1RSQyhMInB0Iik7DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVW5pdCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgICAgICBpZiAoIWJzVW5pdC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICB3c1VuaXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVbml0LCBic1VuaXQuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgICB9DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgICAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0UmVjdDsNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtZWFzdXJlOw0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSk7DQorICAgIGlmICghcExheW91dEl0ZW0pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB3aGlsZSAoaUluZGV4ID4gMCAmJiBwTGF5b3V0SXRlbSkgew0KKyAgICAgICAgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+R2V0TmV4dCgpOw0KKyAgICAgICAgaUluZGV4IC0tOw0KKyAgICB9DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKCFwTGF5b3V0SXRlbSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAwKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTGF5b3V0SXRlbS0+R2V0UmVjdChydFJlY3QsIFRSVUUpOw0KKyAgICBzd2l0Y2ggKGxheW91dE1vZGVsKSB7DQorICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9IOg0KKyAgICAgICAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5oZWlnaHQsIFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1c6DQorICAgICAgICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LndpZHRoLCBYRkFfVU5JVF9QdCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9YOg0KKyAgICAgICAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5sZWZ0LCBYRkFfVU5JVF9QdCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9ZOg0KKyAgICAgICAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC50b3AsIFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBYRkFfVU5JVCB1bml0ID0JbWVhc3VyZS5HZXRVbml0KHdzVW5pdCk7DQorICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IG1lYXN1cmUuVG9Vbml0KHVuaXQpOw0KKyAgICBmVmFsdWUgPSBGWFNZU19yb3VuZChmVmFsdWUgKiAxMDAwKSAvIDEwMDAuMGY7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGhWYWx1ZSwgZlZhbHVlKTsNCisgICAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSFdYWShwQXJndW1lbnRzLCBYRkFfTEFZT1VUTU9ERUxfSCk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1coQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9XKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX1gpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9ZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSFdYWShwQXJndW1lbnRzLCBYRkFfTEFZT1VUTU9ERUxfWSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX051bWJlcmVkUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIEZYX0JPT0wgYk51bWJlcmVkKQ0KK3sNCisgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICAgIGlmICghcERvY0xheW91dCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlQYWdlQ291bnQgPSAwOw0KKyAgICBGWF9JTlQzMiBpUGFnZU51bSA9IHBEb2NMYXlvdXQtPkNvdW50UGFnZXMoKTsNCisgICAgaWYgKGJOdW1iZXJlZCkgew0KKyAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlQYWdlTnVtOyBpKyspIHsNCisgICAgICAgICAgICBJWEZBX0xheW91dFBhZ2UqIHBMYXlvdXRQYWdlID0gcERvY0xheW91dC0+R2V0UGFnZShpKTsNCisgICAgICAgICAgICBpZiAoIXBMYXlvdXRQYWdlKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPkdldE1hc3RlclBhZ2UoKTsNCisgICAgICAgICAgICBpZiAocE1hc3RlclBhZ2UtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9OdW1iZXJlZCkpIHsNCisgICAgICAgICAgICAgICAgaVBhZ2VDb3VudCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlQYWdlQ291bnQgPSBpUGFnZU51bTsNCisgICAgfQ0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpUGFnZUNvdW50KTsNCisgICAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChwQXJndW1lbnRzLCBUUlVFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwicGFnZVNwYW4iKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICB9DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgICAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSk7DQorICAgIGlmICghcExheW91dEl0ZW0pIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCAtMSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfSU5UMzIgaUxhc3QgPSBwTGF5b3V0SXRlbS0+R2V0TGFzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KKyAgICBGWF9JTlQzMiBpRmlyc3QgPSBwTGF5b3V0SXRlbS0+R2V0Rmlyc3QoKS0+R2V0UGFnZSgpLT5HZXRQYWdlSW5kZXgoKTsNCisgICAgRlhfSU5UMzIgaVBhZ2VTcGFuID0gaUxhc3QgLSBpRmlyc3QgKyAxOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VTcGFuKTsNCisgICAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUltcChwQXJndW1lbnRzLCBGQUxTRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0dldE9iakFycmF5KElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0LCBGWF9JTlQzMiBpUGFnZU5vLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUeXBlLCBGWF9CT09MIGJPblBhZ2VBcmVhLCBDWEZBX05vZGVBcnJheSAmcmV0QXJyYXkpDQorew0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0UGFnZSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwRG9jTGF5b3V0LT5HZXRQYWdlKGlQYWdlTm8pOw0KKyAgICBpZiAoIXBMYXlvdXRQYWdlKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMInBhZ2VBcmVhIikpIHsNCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKSB7DQorICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBNYXN0ZXJQYWdlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwiY29udGVudEFyZWEiKSkgew0KKyAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOyBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIGlmKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfTWFwUHRyVG9QdHIgZm9ybUl0ZW1zOw0KKyAgICBmb3JtSXRlbXMuSW5pdEhhc2hUYWJsZSgyNTYsIFRSVUUpOw0KKyAgICBpZiAod3NUeXBlLklzRW1wdHkoKSkgew0KKyAgICAgICAgaWYgKENYRkFfTm9kZSogcE1hc3RlclBhZ2UgPSBwTGF5b3V0UGFnZS0+bV9wRm9ybU5vZGUpIHsNCisgICAgICAgICAgICByZXRBcnJheS5BZGQocE1hc3RlclBhZ2UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOyBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIGlmKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgICAgICAgICBpZighYk9uUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbT4gaXRlcmF0b3IoKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwSXRlbS0+bV9wRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7IHBJdGVtQ2hpbGQ7IHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZighcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudFR5cGUgPSBwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9BcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUl0ZW1zLkdldFZhbHVlQXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtSXRlbXMuU2V0QXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUsIHRoaXMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZihiT25QYWdlQXJlYSkgew0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPiBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBJdGVtKTsNCisgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSA9IHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0gJiYgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0FyZWEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIGlmICh3c1R5cGUgPT0gRlhfV1NUUkMoTCJmaWVsZCIpKSB7DQorICAgICAgICBlVHlwZSA9IFhGQV9FTEVNRU5UX0ZpZWxkOw0KKyAgICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImRyYXciKSkgew0KKyAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9EcmF3Ow0KKyAgICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMInN1YmZvcm0iKSkgew0KKyAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9TdWJmb3JtOw0KKyAgICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImFyZWEiKSkgew0KKyAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9BcmVhOw0KKyAgICB9DQorICAgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEl0ZW0gPSBwTGF5b3V0UGFnZS0+bV9wRmlyc3RDaGlsZDsgcEl0ZW07IHBJdGVtID0gcEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgICAgaWYocEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgICAgICAgaWYoIWJPblBhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEl0ZW0tPm1fcEZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmKGJPblBhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEl0ZW0pOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ29udGVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInBhZ2VDb250ZW50IikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlJbmRleCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVHlwZTsNCisgICAgRlhfQk9PTCBiT25QYWdlQXJlYSA9IEZBTFNFOw0KKyAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgICAgICBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1R5cGUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICAgICAgd3NUeXBlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVHlwZSwgYnNUeXBlLkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBpZiAoaUxlbmd0aCA+PSAzKSB7DQorICAgICAgICBiT25QYWdlQXJlYSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICAgIH0NCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgICAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlQXJyYXkgcmV0QXJyYXk7DQorICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9HZXRPYmpBcnJheShwRG9jTGF5b3V0LCBpSW5kZXgsIHdzVHlwZSwgYk9uUGFnZUFyZWEsIHJldEFycmF5KTsNCisgICAgQ1hGQV9BcnJheU5vZGVMaXN0KiBwQXJyYXlOb2RlTGlzdCA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgICBwQXJyYXlOb2RlTGlzdC0+U2V0QXJyYXlOb2RlTGlzdChyZXRBcnJheSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCAoQ1hGQV9PYmplY3QqKXBBcnJheU5vZGVMaXN0LCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQocEFyZ3VtZW50cywgRkFMU0UpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9IRE9DIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICAgIEZYX0lOVDMyIGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5BYnNQYWdlQ291bnRJbkJhdGNoKGhEb2MpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpUGFnZUNvdW50KTsNCisgICAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBGWF9JTlQzMiBpUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2hlZXRDb3VudEluQmF0Y2goaERvYyk7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBDWEZBX05vZGUqIHBSb290Tm9kZSA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7DQorICAgIENYRkFfTm9kZSogcEZvcm1Sb290ID0gcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Gb3JtKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBGb3JtUm9vdCk7DQorICAgIENYRkFfTm9kZSogcENvbnRlbnRSb290Tm9kZSA9IHBGb3JtUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFByb2Nlc3NvciA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgICAgaWYgKHBDb250ZW50Um9vdE5vZGUpIHsNCisgICAgICAgIHBMYXlvdXRQcm9jZXNzb3ItPkFkZENoYW5nZWRDb250YWluZXIocENvbnRlbnRSb290Tm9kZSk7DQorICAgIH0NCisgICAgcExheW91dFByb2Nlc3Nvci0+U2V0Rm9yY2VSZUxheW91dChUUlVFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlU3BhbihwQXJndW1lbnRzKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwiYWJzUGFnZUluQmF0Y2giKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICB9DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgICBpZiAoIXBEb2NMYXlvdXQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSFdJREdFVCBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQorICAgIGlmICghaFdpZGdldCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9IRE9DIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICAgIEZYX0lOVDMyIGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5BYnNQYWdlSW5CYXRjaChoRG9jLCBoV2lkZ2V0KTsNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQorICAgIH0NCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMInNoZWV0SW5CYXRjaCIpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICAgIH0NCisgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICAgIGlmICghcERvY0xheW91dCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9IV0lER0VUIGhXaWRnZXQgPSBwTm90aWZ5LT5HZXRIV2lkZ2V0KHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpKTsNCisgICAgaWYgKCFoV2lkZ2V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgRlhfSU5UMzIgaVBhZ2VDb3VudCA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNoZWV0SW5CYXRjaChoRG9jLCBoV2lkZ2V0KTsNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQorICAgIH0NCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKHBBcmd1bWVudHMsIFRSVUUpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dFBhZ2VBcmVhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQocEFyZ3VtZW50cywgRkFMU0UpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUltcChwQXJndW1lbnRzLCBUUlVFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUltcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLCBGWF9CT09MIGJBYnNQYWdlKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgICAgICBGWF9MUENXU1RSIG1ldGhvZE5hbWU7DQorICAgICAgICBpZiAoYkFic1BhZ2UpIHsNCisgICAgICAgICAgICBtZXRob2ROYW1lID0gKEZYX0xQQ1dTVFIpKEwiYWJzUGFnZSIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtZXRob2ROYW1lID0gKEZYX0xQQ1dTVFIpKEwicGFnZSIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgbWV0aG9kTmFtZSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlQYWdlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoIXBOb2RlICYmIGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlKTsNCisgICAgfQ0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgICAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOw0KKyAgICBpZiAoIXBMYXlvdXRJdGVtKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgLTEpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlQYWdlID0gcExheW91dEl0ZW0tPkdldEZpcnN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7DQorICAgIGlmIChoVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBiQWJzUGFnZSA/IGlQYWdlIDogaVBhZ2UgKyAxKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NzQyYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXw0KKyNkZWZpbmUgX1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXw0KK2VudW0gWEZBX0xBWU9VVE1PREVMX0hXWFkgew0KKyAgICBYRkFfTEFZT1VUTU9ERUxfSCwNCisgICAgWEZBX0xBWU9VVE1PREVMX1csDQorICAgIFhGQV9MQVlPVVRNT0RFTF9YLA0KKyAgICBYRkFfTEFZT1VUTU9ERUxfWQ0KK307DQorY2xhc3MgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCA6IHB1YmxpYyBDWEZBX09yZGluYXJ5T2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgICB+Q1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCgpOw0KKw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWFkeShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfVyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfQk9PTCBiTnVtYmVyZWQpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ29udGVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlSW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXRQYWdlQXJlYShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCitwcm90ZWN0ZWQ6DQorICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0dldE9iakFycmF5KElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0LCBGWF9JTlQzMiBpUGFnZU5vLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUeXBlLCBGWF9CT09MIGJPblBhZ2VBcmVhLCBDWEZBX05vZGVBcnJheSAmcmV0QXJyYXkpOw0KKyAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIEZYX0JPT0wgYkFic1BhZ2UpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ0MDZmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiDQorQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6Q1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogQ1hGQV9PcmRpbmFyeU9iamVjdChwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX0xvZ1BzZXVkb01vZGVsKQ0KK3sNCisgICAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9Mb2c7DQorfQ0KK0NTY3JpcHRfTG9nUHNldWRvTW9kZWw6On5DU2NyaXB0X0xvZ1BzZXVkb01vZGVsKCkNCit7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xvZ1BzZXVkb01vZGVsX01lc3NhZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlRW5hYmxlZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQordm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VBY3RpdmF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQordm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VEZWFjdGl2YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KK30NCit2b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTZmMTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9TQ1JJUFRfTE9HUFNFVURPTU9ERUxfSF8NCisjZGVmaW5lIF9TQ1JJUFRfTE9HUFNFVURPTU9ERUxfSF8NCitjbGFzcyBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsIDogcHVibGljIENYRkFfT3JkaW5hcnlPYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICAgIHZpcnR1YWwJfkNTY3JpcHRfTG9nUHNldWRvTW9kZWwoKTsNCisNCisgICAgdm9pZAlTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgICAgdm9pZAlTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VFbmFibGVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZURlYWN0aXZhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjYWRjOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5jcHAKQEAgLTAsMCArMSwzOTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ub2RlaGVscGVyLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfaW1wLmgiDQorQ1hGQV9Ob2RlSGVscGVyOjpDWEZBX05vZGVIZWxwZXIodm9pZCkNCisgICAgOiBtX2VMYXN0Q3JlYXRlVHlwZShYRkFfRUxFTUVOVF9EYXRhVmFsdWUpLCBtX3BDcmVhdGVQYXJlbnQoTlVMTCkNCisgICAgLCBtX2lDcmVhdGVDb3VudCgwKSwgbV9pQ3JlYXRlRmxhZyhYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmUpDQorICAgICwgbV9pQ3VyQWxsU3RhcnQoLTEpLCBtX3BBbGxTdGFydFBhcmVudChOVUxMKQ0KK3sNCit9DQorQ1hGQV9Ob2RlSGVscGVyOjp+Q1hGQV9Ob2RlSGVscGVyKHZvaWQpDQorew0KK30NCitDWEZBX05vZGUqICBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoQ1hGQV9Ob2RlKiBwYXJlbnQsIEZYX0xQQ1dTVFIgcHdzTmFtZSwgRlhfQk9PTCBiSXNDbGFzc05hbWUpDQorew0KKyAgICBpZihwYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlQXJyYXkgc2libGluZ3M7DQorICAgIEZYX1VJTlQzMiB1TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwd3NOYW1lLCBGWFNZU193Y3NsZW4ocHdzTmFtZSkpOw0KKyAgICBYRkFfTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKHBhcmVudCwgdU5hbWVIYXNoLCAmc2libGluZ3MsIGJJc0NsYXNzTmFtZSk7DQorICAgIGlmIChzaWJsaW5ncy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHNpYmxpbmdzWzBdOw0KK30NCitGWF9JTlQzMiAgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfQ291bnRTaWJsaW5ncyhDWEZBX05vZGUqIHBOb2RlLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLCBDWEZBX05vZGVBcnJheSAqcFNpYmxpbmdzLCBGWF9CT09MIGJJc0NsYXNzTmFtZSkNCit7DQorICAgIENYRkFfTm9kZSogcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgICAgaWYocGFyZW50ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChwYXJlbnQtPkdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgaWYoIXBQcm9wZXJ0ICYmIGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX1RyYW5zcGFyZW50KSB7DQorICAgICAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50KTsNCisgICAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBwTm9kZS0+R2V0Q2xhc3NIYXNoQ29kZSgpLCBwU2libGluZ3MsIGVMb2dpY1R5cGUsIGJJc0NsYXNzTmFtZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4gIFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBwTm9kZS0+R2V0TmFtZUhhc2goKSwgcFNpYmxpbmdzLCBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUpOw0KKyAgICB9DQorfQ0KK0ZYX0lOVDMyIENYRkFfTm9kZUhlbHBlcjo6WEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwgRlhfRFdPUkQgZE5hbWVIYXNoLCBDWEZBX05vZGVBcnJheSogcFNpYmxpbmdzLCBGWF9CT09MIGJJc0NsYXNzTmFtZSApDQorew0KKyAgICBpZihwYXJlbnQgPT0gTlVMTCB8fCBwU2libGluZ3MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkNvdW50ID0gMDsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIENYRkFfTm9kZUFycmF5IHByb3BlcnRpZXM7DQorICAgIHBhcmVudC0+R2V0Tm9kZUxpc3QocHJvcGVydGllcywgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7DQorICAgIEZYX0lOVDMyIG5Qcm9wZXJ0aWVzID0gcHJvcGVydGllcy5HZXRTaXplKCk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuUHJvcGVydGllczsgKytpKSB7DQorICAgICAgICBDWEZBX05vZGUqIGNoaWxkID0gcHJvcGVydGllc1tpXTsNCisgICAgICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KKyAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgICAgICBuQ291bnQgKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYobkNvdW50ID4gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBuQ291bnQ7DQorICAgICAgICB9DQorICAgICAgICBuQ291bnQgKz0gWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhjaGlsZCwgZE5hbWVIYXNoLCBwU2libGluZ3MsIGJJc0NsYXNzTmFtZSk7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlQXJyYXkgY2hpbGRyZW47DQorICAgIHBhcmVudC0+R2V0Tm9kZUxpc3QoY2hpbGRyZW4sIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuKTsNCisgICAgRlhfSU5UMzIgbkNoaWxkcmVuID0gY2hpbGRyZW4uR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpICsrKSB7DQorICAgICAgICBDWEZBX05vZGUqIGNoaWxkID0gY2hpbGRyZW5baV07DQorICAgICAgICBpZihiSXNDbGFzc05hbWUpIHsNCisgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZihuQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIG5Db3VudDsNCisgICAgICAgIH0NCisgICAgICAgIG5Db3VudCArPSBYRkFfTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywgYklzQ2xhc3NOYW1lKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbkNvdW50Ow0KK30NCitGWF9JTlQzMiAgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKENYRkFfTm9kZSogcGFyZW50LCBGWF9EV09SRCBkTmFtZUhhc2gsIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsIEZYX0JPT0wgYklzQ2xhc3NOYW1lLCBGWF9CT09MIGJJc0ZpbmRQcm9wZXJ0eSkNCit7DQorICAgIGlmIChwYXJlbnQgPT0gTlVMTCB8fCBwU2libGluZ3MgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkNvdW50ID0gMDsNCisgICAgRlhfSU5UMzIgaSA9IDA7DQorICAgIGlmKGJJc0ZpbmRQcm9wZXJ0eSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgcHJvcGVydGllczsNCisgICAgICAgIHBhcmVudC0+R2V0Tm9kZUxpc3QocHJvcGVydGllcywgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7DQorICAgICAgICBGWF9JTlQzMiBuUHJvcGVydGllcyA9IHByb3BlcnRpZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyArK2kpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIGNoaWxkID0gcHJvcGVydGllc1tpXTsNCisgICAgICAgICAgICBpZihiSXNDbGFzc05hbWUpIHsNCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5HZXRDbGFzc0hhc2hDb2RlKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICAgICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICAgICAgICAgICAgICBuQ291bnQgKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICAgICAgICAgICAgICBpZihjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQgJiYgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeHRyYXMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBuQ291bnQgKys7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGNoaWxkLT5Jc1VubmFtZWQoKSAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgICAgICAgICAgbkNvdW50ICs9IFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MoY2hpbGQsIGROYW1lSGFzaCwgcFNpYmxpbmdzLCBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZihuQ291bnQgPiAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIG5Db3VudDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsNCisgICAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOw0KKyAgICBGWF9JTlQzMiBuQ2hpbGRyZW4gPSBjaGlsZHJlbi5HZXRTaXplKCk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkgKyspIHsNCisgICAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBjaGlsZHJlbltpXTsNCisgICAgICAgIGlmKGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZihiSXNDbGFzc05hbWUpIHsNCisgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZUxvZ2ljVHlwZSA9PSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKFhGQV9Ob2RlSXNUcmFuc3BhcmVudChjaGlsZCkgJiYgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgbkNvdW50ICs9IFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MoY2hpbGQsIGROYW1lSGFzaCwgcFNpYmxpbmdzLCBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbkNvdW50Ow0KK30NCitDWEZBX05vZGUqICBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KENYRkFfTm9kZSogcE5vZGUsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUpDQorew0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoZUxvZ2ljVHlwZSA9PSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCkgew0KKyAgICAgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBhcmVudDsNCisgICAgQ1hGQV9Ob2RlKiBub2RlID0gcE5vZGU7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChub2RlKTsNCisgICAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0VMRU1FTlQgcGFyZW50RWxlbWVudCA9IHBhcmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKCghcGFyZW50LT5Jc1VubmFtZWQoKSAmJiBwYXJlbnRFbGVtZW50ICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpIHx8IHBhcmVudEVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBub2RlID0gcGFyZW50Ow0KKyAgICB9DQorICAgIHJldHVybiBwYXJlbnQ7DQorfQ0KK0ZYX0lOVDMyICBDWEZBX05vZGVIZWxwZXI6OlhGQV9HZXRJbmRleChDWEZBX05vZGUqIHBOb2RlLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLCBGWF9CT09MIGJJc1Byb3BlcnR5ICwgRlhfQk9PTCBiSXNDbGFzc0luZGV4ICkNCit7DQorICAgIENYRkFfTm9kZSogcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgICAgaWYocGFyZW50ID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmKCFiSXNQcm9wZXJ0eSAmJiBlTG9naWNUeXBlID09IFhGQV9MT0dJQ19UcmFuc3BhcmVudCkgew0KKyAgICAgICAgcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCk7DQorICAgICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd0hhc2hOYW1lID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQorICAgIGlmKGJJc0NsYXNzSW5kZXgpIHsNCisgICAgICAgIGR3SGFzaE5hbWUgPSBwTm9kZS0+R2V0Q2xhc3NIYXNoQ29kZSgpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZUFycmF5IHNpYmxpbmdzOw0KKyAgICBGWF9JTlQzMiBpU2l6ZSA9IFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBkd0hhc2hOYW1lLCAmc2libGluZ3MsIGVMb2dpY1R5cGUsIGJJc0NsYXNzSW5kZXgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNpemU7ICsraSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IHNpYmxpbmdzW2ldOw0KKyAgICAgICAgaWYgKGNoaWxkID09IHBOb2RlKSB7DQorICAgICAgICAgICAgcmV0dXJuIGk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfR2V0TmFtZUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBGWF9CT09MIGJJc0FsbFBhdGgsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUpDQorew0KKyAgICB3c05hbWUuRW1wdHkoKTsNCisgICAgaWYgKGJJc0FsbFBhdGgpIHsNCisgICAgICAgIFhGQV9HZXROYW1lRXhwcmVzc2lvbihyZWZOb2RlLCB3c05hbWUsIEZBTFNFLCBlTG9naWNUeXBlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGFyZW50Ow0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChyZWZOb2RlLCBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7DQorICAgICAgICB3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBYRkFfR2V0TmFtZUV4cHJlc3Npb24ocGFyZW50LCB3c1BhcmVudCwgRkFMU0UsIGVMb2dpY1R5cGUpOw0KKyAgICAgICAgICAgIHdzUGFyZW50ICs9IEwiLiI7DQorICAgICAgICAgICAgd3NQYXJlbnQgKz0gd3NOYW1lOw0KKyAgICAgICAgICAgIHdzTmFtZSA9IHdzUGFyZW50Ow0KKyAgICAgICAgICAgIHBhcmVudCA9IFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHBhcmVudCwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGFnTmFtZTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgRlhfQk9PTCBiSXNQcm9wZXJ0eSA9IFhGQV9Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKTsNCisgICAgICAgIGlmIChyZWZOb2RlLT5Jc1VubmFtZWQoKSB8fCAoYklzUHJvcGVydHkgJiYgcmVmTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgICAgICAgICAgcmVmTm9kZS0+R2V0Q2xhc3NOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgICAgICAgd3MgPSB3c1RhZ05hbWU7DQorICAgICAgICAgICAgd3NOYW1lLkZvcm1hdCgoRlhfTFBDV1NUUilMIiMlc1slZF0iLCAoRlhfTFBDV1NUUil3cywgWEZBX0dldEluZGV4KHJlZk5vZGUsIGVMb2dpY1R5cGUsIGJJc1Byb3BlcnR5LCBUUlVFKSk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3MgPSByZWZOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgd3MuUmVwbGFjZSgoRlhfTFBDV1NUUilMIi4iLCAoRlhfTFBDV1NUUilMIlxcLiIpOw0KKyAgICAgICAgd3NOYW1lLkZvcm1hdCgoRlhfTFBDV1NUUilMIiVzWyVkXSIsIChGWF9MUENXU1RSKXdzLCBYRkFfR2V0SW5kZXgocmVmTm9kZSwgZUxvZ2ljVHlwZSwgYklzUHJvcGVydHksIEZBTFNFKSk7DQorICAgIH0NCit9DQorRlhfQk9PTAlDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlSXNUcmFuc3BhcmVudChDWEZBX05vZGUqIHJlZk5vZGUpDQorew0KKyAgICBpZihyZWZOb2RlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfRUxFTUVOVCBlUmVmTm9kZSA9IHJlZk5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgaWYoKHJlZk5vZGUtPklzVW5uYW1lZCgpICYmIHJlZk5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB8fCBlUmVmTm9kZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0DQorICAgICAgICAgICAgfHwgZVJlZk5vZGUgPT0gWEZBX0VMRU1FTlRfQXJlYSB8fCBlUmVmTm9kZSA9PSBYRkFfRUxFTUVOVF9Qcm90bykgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZUhlbHBlcjo6WEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKENGWF9XaWRlU3RyaW5nICYgd3NDb25kaXRpb24pDQorew0KKyAgICBGWF9JTlQzMiBpTGVuID0gd3NDb25kaXRpb24uR2V0TGVuZ3RoKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzSW5kZXggPSBGWF9XU1RSQyhMIjAiKTs7DQorICAgIEZYX0JPT0wgYkFsbCA9IEZBTFNFOw0KKyAgICBpZihpTGVuID09IDApIHsNCisgICAgICAgIG1faUNyZWF0ZUZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmU7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYod3NDb25kaXRpb24uR2V0QXQoMCkgPT0gJ1snKSB7DQorICAgICAgICBGWF9JTlQzMiBpID0gMTsNCisgICAgICAgIGZvciAoOyBpIDwgaUxlbjsgKytpKSB7DQorICAgICAgICAgICAgRlhfV0NIQVIgY2ggPSB3c0NvbmRpdGlvbltpXTsNCisgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgew0KKyAgICAgICAgICAgICAgICBiQWxsID0gVFJVRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYkFsbCkgew0KKyAgICAgICAgICAgIHdzSW5kZXggPSBGWF9XU1RSQyhMIjEiKTsNCisgICAgICAgICAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lOw0KKyAgICAgICAgICAgIHdzSW5kZXggPSB3c0NvbmRpdGlvbi5NaWQoaSwgaUxlbiAtIDEgLSBpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0lOVDMyIGlJbmRleCA9IHdzSW5kZXguR2V0SW50ZWdlcigpOw0KKyAgICAgICAgbV9pQ3JlYXRlQ291bnQgPSBpSW5kZXg7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfUmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLCBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiwgRlhfQk9PTCBiTGFzdE5vZGUsIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQpDQorew0KKyAgICBpZihtX3BDcmVhdGVQYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYlJlc3VsdCA9IEZBTFNFOw0KKyAgICBpZih3c05hbWUuR2V0QXQoMCkgPT0gJyEnKSB7DQorICAgICAgICB3c05hbWUgPSB3c05hbWUuUmlnaHQod3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICAgICAgICBtX3BDcmVhdGVQYXJlbnQgPSAgKENYRkFfTm9kZSopcFNjcmlwdENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgICAgfQ0KKyAgICBpZih3c05hbWUuR2V0QXQoMCkgPT0gJyMnKSB7DQorICAgICAgICBiSXNDbGFzc05hbWUgPSBUUlVFOw0KKyAgICAgICAgd3NOYW1lID0gd3NOYW1lLlJpZ2h0KHdzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICB9DQorICAgIGlmKG1faUNyZWF0ZUNvdW50ID09IDApIHsNCisgICAgICAgIFhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c0NvbmRpdGlvbik7DQorICAgIH0NCisgICAgaWYoYklzQ2xhc3NOYW1lKSB7DQorICAgICAgICBYRkFfTFBDRUxFTUVOVElORk8gbHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeU5hbWUod3NOYW1lKTsNCisgICAgICAgIGlmKGxwRWxlbWVudCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGlJbmRleCA9IDA7IGlJbmRleCA8IG1faUNyZWF0ZUNvdW50OyBpSW5kZXggKyspIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gbV9wQ3JlYXRlUGFyZW50LT5DcmVhdGVTYW1lUGFja2V0Tm9kZShscEVsZW1lbnQtPmVOYW1lKTsNCisgICAgICAgICAgICBpZihwTmV3Tm9kZSkgew0KKyAgICAgICAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlKTsNCisgICAgICAgICAgICAgICAgaWYoaUluZGV4ID09IG1faUNyZWF0ZUNvdW50IC0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wQ3JlYXRlUGFyZW50ID0gcE5ld05vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYlJlc3VsdCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgWEZBX0VMRU1FTlQgZUNsYXNzVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgICAgIGlmKGJMYXN0Tm9kZSkgew0KKyAgICAgICAgICAgIGVDbGFzc1R5cGUgPSBtX2VMYXN0Q3JlYXRlVHlwZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvcihGWF9JTlQzMiBpSW5kZXggPSAwOyBpSW5kZXggPCBtX2lDcmVhdGVDb3VudDsgaUluZGV4ICsrKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IG1fcENyZWF0ZVBhcmVudC0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoZUNsYXNzVHlwZSk7DQorICAgICAgICAgICAgaWYocE5ld05vZGUpIHsNCisgICAgICAgICAgICAgICAgcE5ld05vZGUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgICAgICAgICAgIHBOZXdOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlKTsNCisgICAgICAgICAgICAgICAgaWYoaUluZGV4ID09IG1faUNyZWF0ZUNvdW50IC0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgbV9wQ3JlYXRlUGFyZW50ID0gcE5ld05vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYlJlc3VsdCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKCFiUmVzdWx0KSB7DQorICAgICAgICBtX3BDcmVhdGVQYXJlbnQgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBiUmVzdWx0Ow0KK30NCit2b2lkIENYRkFfTm9kZUhlbHBlcjo6WEZBX1NldENyZWF0ZU5vZGVUeXBlKENYRkFfTm9kZSogcmVmTm9kZSkNCit7DQorICAgIGlmKHJlZk5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBtX2VMYXN0Q3JlYXRlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgfSBlbHNlIGlmKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgbV9lTGFzdENyZWF0ZVR5cGUgPSBYRkFfRmllbGRJc011bHRpTGlzdEJveChyZWZOb2RlKSA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cCA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgICAgfSBlbHNlIGlmKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIG1fZUxhc3RDcmVhdGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJQ1hGQV9Ob2RlSGVscGVyOjpYRkFfTm9kZUlzUHJvcGVydHkoQ1hGQV9Ob2RlKiByZWZOb2RlKQ0KK3sNCisgICAgRlhfQk9PTCBiUmVzID0gRkFMU0U7DQorICAgIENYRkFfTm9kZSogcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocmVmTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgICBpZihwYXJlbnQgIT0gTlVMTCAmJiByZWZOb2RlICE9IE5VTEwpIHsNCisgICAgICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChwYXJlbnQtPkdldENsYXNzSUQoKSwgcmVmTm9kZS0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KKyAgICAgICAgaWYocFByb3BlcnQpIHsNCisgICAgICAgICAgICBiUmVzID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gYlJlczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNiZTc2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfTk9ERUhFTFBFUl9IXw0KKyNkZWZpbmUgX1hGQV9OT0RFSEVMUEVSX0hfDQorY2xhc3MgQ1hGQV9TY3JpcHRDb250ZXh0Ow0KK2VudW0gIFhGQV9MT0dJQ19UWVBFIHsNCisgICAgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQsDQorICAgIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCit9Ow0KK2NsYXNzIENYRkFfTm9kZUhlbHBlciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9Ob2RlSGVscGVyKHZvaWQpOw0KKyAgICB+Q1hGQV9Ob2RlSGVscGVyKHZvaWQpOw0KKyAgICBDWEZBX05vZGUqICBYRkFfUmVzb2x2ZU5vZGVzX0dldE9uZUNoaWxkKENYRkFfTm9kZSogcGFyZW50LCBGWF9MUENXU1RSIHB3c05hbWUsIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0UpOw0KKyAgICBDWEZBX05vZGUqICBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChDWEZBX05vZGUqIHBOb2RlLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlID0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKw0KKyAgICBGWF9JTlQzMglYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKENYRkFfTm9kZSogcGFyZW50LCBGWF9EV09SRCBkTmFtZUhhc2gsIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0UsIEZYX0JPT0wgYklzRmluZFByb3BlcnR5ID0gVFJVRSk7DQorICAgIEZYX0lOVDMyCVhGQV9Ob2RlQWNjX1RyYXZlcnNlQW55U2libGluZ3MoQ1hGQV9Ob2RlKiBwYXJlbnQsIEZYX0RXT1JEIGROYW1lSGFzaCwgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywgRlhfQk9PTCBiSXNDbGFzc05hbWUgPSBGQUxTRSk7DQorICAgIEZYX0lOVDMyCVhGQV9Db3VudFNpYmxpbmdzKENYRkFfTm9kZSogcE5vZGUsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsIENYRkFfTm9kZUFycmF5ICpwU2libGluZ3MsIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0UpOw0KKyAgICBGWF9JTlQzMiAgICBYRkFfR2V0SW5kZXgoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50LCBGWF9CT09MIGJJc1Byb3BlcnR5ID0gRkFMU0UsIEZYX0JPT0wgYklzQ2xhc3NJbmRleCA9IEZBTFNFKTsNCisgICAgdm9pZAkJWEZBX0dldE5hbWVFeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSwgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgRlhfQk9PTCBiSXNBbGxQYXRoLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlID0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgICBGWF9CT09MCQlYRkFfTm9kZUlzVHJhbnNwYXJlbnQoQ1hGQV9Ob2RlKiByZWZOb2RlKTsNCisgICAgRlhfQk9PTAkJWEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKENGWF9XaWRlU3RyaW5nIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIEZYX0JPT0wgYkxhc3ROb2RlLCBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0KTsNCisgICAgRlhfQk9PTAkJWEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKENGWF9XaWRlU3RyaW5nICYgd3NDb25kaXRpb24pOw0KKyAgICB2b2lkCQlYRkFfU2V0Q3JlYXRlTm9kZVR5cGUoQ1hGQV9Ob2RlKiByZWZOb2RlKTsNCisgICAgRlhfQk9PTAkJWEZBX05vZGVJc1Byb3BlcnR5KENYRkFfTm9kZSogcmVmTm9kZSk7DQorcHVibGljOg0KKyAgICBYRkFfRUxFTUVOVAkJCQkJbV9lTGFzdENyZWF0ZVR5cGU7DQorICAgIENYRkFfTm9kZSoJCQkJCW1fcENyZWF0ZVBhcmVudDsNCisgICAgRlhfSU5UMzIJCQkJCW1faUNyZWF0ZUNvdW50Ow0KKyAgICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUJCW1faUNyZWF0ZUZsYWc7DQorICAgIEZYX0lOVDMyCQkJCQltX2lDdXJBbGxTdGFydDsNCisgICAgQ1hGQV9Ob2RlKgkJCQkJbV9wQWxsU3RhcnRQYXJlbnQ7DQorDQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTMzZjZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDc4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RlYnVnLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ub2RlaGVscGVyLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfaW1wLmgiDQorQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpDWEZBX1Jlc29sdmVQcm9jZXNzb3Iodm9pZCkNCisgICAgOiBtX3BOb2RlSGVscGVyKE5VTEwpLCBtX2lDdXJTdGFydCgwKQ0KK3sNCisgICAgbV9wTm9kZUhlbHBlciA9IEZYX05FVyBDWEZBX05vZGVIZWxwZXI7DQorfQ0KK0NYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6fkNYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKQ0KK3sNCisgICAgaWYobV9wTm9kZUhlbHBlcikgew0KKyAgICAgICAgZGVsZXRlIG1fcE5vZGVIZWxwZXI7DQorICAgICAgICBtX3BOb2RlSGVscGVyID0gTlVMTDsNCisgICAgfQ0KK30NCitGWF9JTlQzMiBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXMoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQorew0KKyAgICBpZiAocm5kLm1fQ3VyTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgaWYoIXJuZC5tX0N1ck5vZGUtPklzTm9kZSgpKSB7DQorICAgICAgICBpZihybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfRm9yQXR0cmlidXRlUnMocm5kLm1fQ3VyTm9kZSwgcm5kLCBybmQubV93c05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkKSB7DQorICAgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChybmQpOw0KKyAgICB9DQorICAgIEZYX1dDSEFSIHdjaCA9IHJuZC5tX3dzTmFtZS5HZXRBdCgwKTsNCisgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICAgIGNhc2UgJyQnOg0KKyAgICAgICAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0RvbGxhcihybmQpOw0KKyAgICAgICAgY2FzZSAnISc6DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkocm5kKTsNCisgICAgICAgIGNhc2UgJyMnOg0KKyAgICAgICAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX051bWJlclNpZ24ocm5kKTsNCisgICAgICAgIGNhc2UgJyonOg0KKyAgICAgICAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0FzdGVyaXNrKHJuZCk7DQorICAgICAgICBjYXNlICcuJzoNCisgICAgICAgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChybmQpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9UaGlzICYmIHJuZC5tX25MZXZlbCA9PSAwKSB7DQorICAgICAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fcFNDLT5HZXRUaGlzT2JqZWN0KCkpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0gZWxzZSBpZihybmQubV9DdXJOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfWGZhKSB7DQorICAgICAgICBDWEZBX09iamVjdCogcE9iak5vZGUgPSBybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUocm5kLm1fdUhhc2hOYW1lKTsNCisgICAgICAgIGlmKHBPYmpOb2RlKSB7DQorICAgICAgICAgICAgcm5kLm1fTm9kZXMuQWRkKHBPYmpOb2RlKTsNCisgICAgICAgIH0gZWxzZSBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCisgICAgICAgICAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fQ3VyTm9kZSk7DQorICAgICAgICB9IGVsc2UgaWYgKChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSAmJiBYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKHJuZC5tX0N1ck5vZGUsIHJuZCwgcm5kLm1fd3NOYW1lKSkgew0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJuZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgcm5kLm1fd3NDb25kaXRpb24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBGWF9JTlQzMiBuUmV0ID0gWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kKTsNCisgICAgaWYgKG5SZXQgPCAxICYmIHJuZC5tX3VIYXNoTmFtZSA9PSBYRkFfSEFTSENPREVfWGZhKSB7DQorICAgICAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRSb290KCkpOw0KKyAgICB9DQorICAgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCkNCit7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IHJuZC5tX3dzTmFtZS5SaWdodChybmQubV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgICAgQ1hGQV9Ob2RlKiBmaW5kTm9kZSA9IE5VTEw7DQorICAgIENYRkFfTm9kZUFycmF5IHNpYmxpbmdzOw0KKyAgICBGWF9CT09MIGJDbGFzc05hbWUgPSBGQUxTRTsNCisgICAgaWYod3NOYW1lLkdldEF0KDApID09ICcjJykgew0KKyAgICAgICAgYkNsYXNzTmFtZSA9IFRSVUU7DQorICAgICAgICB3c05hbWUgPSB3c05hbWUuUmlnaHQod3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICAgIH0NCisgICAgZmluZE5vZGUgPSBtX3BOb2RlSGVscGVyLT5YRkFfUmVzb2x2ZU5vZGVzX0dldE9uZUNoaWxkKChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGUsIHdzTmFtZSwgYkNsYXNzTmFtZSk7DQorICAgIGlmIChmaW5kTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAod3NDb25kaXRpb24uSXNFbXB0eSgpKSB7DQorICAgICAgICBybmQubV9Ob2Rlcy5BZGQoZmluZE5vZGUpOw0KKyAgICAgICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBtX3BOb2RlSGVscGVyLT5YRkFfQ291bnRTaWJsaW5ncyhmaW5kTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCAoQ1hGQV9Ob2RlQXJyYXkqKSZybmQubV9Ob2RlcywgYkNsYXNzTmFtZSk7DQorICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQorICAgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Eb2xsYXIoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQorew0KKyAgICBDWEZBX09iakFycmF5ICZub2RlcyA9IHJuZC5tX05vZGVzOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQorICAgIEZYX0lOVDMyIGlOYW1lTGVuID0gd3NOYW1lLkdldExlbmd0aCgpOw0KKyAgICBpZiAoaU5hbWVMZW4gPT0gMSkgew0KKyAgICAgICAgbm9kZXMuQWRkKHJuZC5tX0N1ck5vZGUpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgaWYgKHJuZC5tX25MZXZlbCA+IDApIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKEZYX0xQQ1dTVFIpd3NOYW1lICsgMSwgaU5hbWVMZW4gLSAxKTsNCisgICAgaWYgKGR3TmFtZUhhc2ggPT0gWEZBX0hBU0hDT0RFX1hmYSkgew0KKyAgICAgICAgbm9kZXMuQWRkKHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqTm9kZSA9IHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShkd05hbWVIYXNoKTsNCisgICAgICAgIGlmKHBPYmpOb2RlKSB7DQorICAgICAgICAgICAgcm5kLm1fTm9kZXMuQWRkKHBPYmpOb2RlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocm5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOw0KK30NCitGWF9JTlQzMiBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQorew0KKyAgICBpZiAocm5kLm1fbkxldmVsID4gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBkYXRhc2V0cyA9IChDWEZBX05vZGUqKXJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KKyAgICBpZiAoZGF0YXNldHMgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQorICAgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQorICAgIHJuZEZpbmQubV9DdXJOb2RlID0gZGF0YXNldHM7DQorICAgIHJuZEZpbmQubV93c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICAgIHJuZEZpbmQubV91SGFzaE5hbWUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhybmRGaW5kLm1fd3NOYW1lLCBybmRGaW5kLm1fd3NOYW1lLkdldExlbmd0aCgpKTsNCisgICAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQorICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbjsNCisgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQorICAgIFhGQV9SZXNvbHZlTm9kZXMocm5kRmluZCk7DQorICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcm5kLm1fTm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX051bWJlclNpZ24oQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQorew0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQorICAgIENYRkFfTm9kZSogY3VyTm9kZSA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICAgIGlmKFhGQV9SZXNvbHZlTm9kZXNfRm9yQXR0cmlidXRlUnMoY3VyTm9kZSwgcm5kLCB3c05hbWUpKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsNCisgICAgcm5kRmluZC5tX3BTQyA9IHJuZC5tX3BTQzsNCisgICAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQorICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOw0KKyAgICBybmRGaW5kLm1fZHdTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7DQorICAgIHJuZEZpbmQubV9kd1N0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7DQorICAgIHJuZEZpbmQubV93c05hbWUgPSB3c05hbWU7DQorICAgIHJuZEZpbmQubV91SGFzaE5hbWUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhybmRGaW5kLm1fd3NOYW1lLCBybmRGaW5kLm1fd3NOYW1lLkdldExlbmd0aCgpKTsNCisgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NDb25kaXRpb247DQorICAgIHJuZEZpbmQubV9DdXJOb2RlID0gY3VyTm9kZTsNCisgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgaWYod3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgPT0gMCAmJiBybmRGaW5kLm1fTm9kZXMuRmluZChjdXJOb2RlKSA+PSAwKSB7DQorICAgICAgICAgICAgcm5kLm1fTm9kZXMuQWRkKGN1ck5vZGUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBybmQubV9Ob2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCit9DQorRlhfSU5UMzIgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKENYRkFfT2JqZWN0KiBjdXJOb2RlLCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCwgRlhfV1NUUiBzdHJBdHRyKQ0KK3sNCisgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBTY3JpcHRBdHRyaWJ1dGUgPSBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKGN1ck5vZGUtPkdldENsYXNzSUQoKSwgc3RyQXR0cik7DQorICAgIGlmKGxwU2NyaXB0QXR0cmlidXRlKSB7DQorICAgICAgICBybmQubV9wU2NyaXB0QXR0cmlidXRlID0gbHBTY3JpcHRBdHRyaWJ1dGU7DQorICAgICAgICBybmQubV9Ob2Rlcy5BZGQoY3VyTm9kZSk7DQorICAgICAgICBybmQubV9kd0ZsYWcgPSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQorew0KKyAgICBpZiAocm5kLm1fbkxldmVsID4gMzIpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmKCFybmQubV9DdXJOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCisgICAgQ1hGQV9PYmpBcnJheSAmbm9kZXMgPSBybmQubV9Ob2RlczsNCisgICAgRlhfSU5UMzIgbk51bSA9IG5vZGVzLkdldFNpemUoKTsNCisgICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBybmQubV9kd1N0eWxlczsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSA9IHJuZC5tX3dzTmFtZTsNCisgICAgRlhfVUlOVDMyIHVOYW1lSGFzaCA9IHJuZC5tX3VIYXNoTmFtZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgJndzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRGaW5kOw0KKyAgICBybmRGaW5kLm1fd3NOYW1lID0gcm5kLm1fd3NOYW1lOw0KKyAgICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgICAgcm5kRmluZC5tX3BTQyA9IHJuZC5tX3BTQzsNCisgICAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQorICAgIHJuZEZpbmQubV91SGFzaE5hbWUgPSB1TmFtZUhhc2g7DQorICAgIENYRkFfTm9kZUFycmF5IGNoaWxkcmVuOw0KKyAgICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0aWVzOw0KKyAgICBDWEZBX05vZGUqCXBWYXJpYWJsZXNOb2RlID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiAgcFBhZ2VTZXROb2RlID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlICpwQ2hpbGQgPSBjdXJOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgICAgIGlmKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgICAgICAgIHBWYXJpYWJsZXNOb2RlID0gcENoaWxkOw0KKyAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZihwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgcFBhZ2VTZXROb2RlID0gcENoaWxkOw0KKyAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KGN1ck5vZGUtPkdldENsYXNzSUQoKSwgcENoaWxkLT5HZXRDbGFzc0lEKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7DQorICAgICAgICAgICAgaWYocFByb3BlcnQpIHsNCisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5BZGQocENoaWxkKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5BZGQocENoaWxkKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgIH0NCisgICAgaWYoKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpICYmIHBWYXJpYWJsZXNOb2RlKSB7DQorICAgICAgICBGWF9VSU5UMzIgdVByb3BIYXNoID0gcFZhcmlhYmxlc05vZGUtPkdldENsYXNzSGFzaENvZGUoKTsNCisgICAgICAgIGlmICh1UHJvcEhhc2ggPT0gdU5hbWVIYXNoKSB7DQorICAgICAgICAgICAgbm9kZXMuQWRkKHBWYXJpYWJsZXNOb2RlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBwVmFyaWFibGVzTm9kZTsNCisgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKGR3U3R5bGVzLCBybmRGaW5kKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVDb25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247DQorICAgICAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLkVtcHR5KCk7DQorICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgICAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NTYXZlQ29uZGl0aW9uOw0KKyAgICAgICAgICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICAgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQorICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICAgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKSB7DQorICAgICAgICBGWF9CT09MIGJTZXRGbGFnID0gRkFMU0U7DQorICAgICAgICBpZihwUGFnZVNldE5vZGUgJiYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpKSB7DQorICAgICAgICAgICAgY2hpbGRyZW4uQWRkKHBQYWdlU2V0Tm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBjaGlsZHJlbi5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBjaGlsZHJlbltpXTsNCisgICAgICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjaGlsZCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9wTm9kZUhlbHBlci0+WEZBX05vZGVJc1RyYW5zcGFyZW50KGNoaWxkKSAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgICAgICAgICAgaWYoIWJTZXRGbGFnKSB7DQorICAgICAgICAgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKGR3U3R5bGVzLCBybmRGaW5kKTsNCisgICAgICAgICAgICAgICAgICAgIGJTZXRGbGFnID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IGNoaWxkOw0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVDb25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247DQorICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCisgICAgICAgICAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NTYXZlQ29uZGl0aW9uOw0KKyAgICAgICAgICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsNCisgICAgICAgICAgICBpZighKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgdXBBcnJheU5vZGVzOw0KKyAgICAgICAgICAgICAgICBpZihtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoKENYRkFfTm9kZSopY3VyTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9Db3VudFNpYmxpbmdzKChDWEZBX05vZGUqKW5vZGVzWzBdLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsICZ1cEFycmF5Tm9kZXMsIGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUgPyBUUlVFIDogRkFMU0UpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKHVwQXJyYXlOb2Rlcy5HZXRTaXplKCkgPiBub2Rlcy5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHVwQXJyYXlOb2Rlc1swXSA9IChDWEZBX05vZGUqKW5vZGVzWzBdOw0KKyAgICAgICAgICAgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgICAgICAgICBub2Rlcy5BcHBlbmQoKENYRkFfT2JqQXJyYXkgJil1cEFycmF5Tm9kZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgdXBBcnJheU5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQorICAgICAgICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7DQorICAgICAgICBpZihYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKGN1ck5vZGUsIHJuZCwgd3NOYW1lKSkgew0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSB7DQorICAgICAgICBGWF9CT09MIGJTZXRGbGFnID0gRkFMU0U7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBjaGlsZFByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsNCisgICAgICAgICAgICBpZihjaGlsZFByb3BlcnR5LT5Jc1VubmFtZWQoKSkgew0KKyAgICAgICAgICAgICAgICBGWF9VSU5UMzIgdVByb3BIYXNoID0gY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NIYXNoQ29kZSgpOw0KKyAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlTmFtZSA9IGNoaWxkUHJvcGVydHktPkdldENsYXNzSUQoKTsNCisgICAgICAgICAgICAgICAgaWYgKHVQcm9wSGFzaCA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjaGlsZFByb3BlcnR5KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZihjaGlsZFByb3BlcnR5LT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCAmJiBjaGlsZFByb3BlcnR5LT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRXh0cmFzDQorICAgICAgICAgICAgICAgICAgICAgICYmIGNoaWxkUHJvcGVydHktPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY2hpbGRQcm9wZXJ0eSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsNCisgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgICAgICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFByb3AgPSBOVUxMOw0KKyAgICAgICAgaWYoWEZBX0VMRU1FTlRfU3ViZm9ybSA9PSBjdXJOb2RlLT5HZXRDbGFzc0lEKCkgJiYgWEZBX0hBU0hDT0RFX09jY3VyID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcEluc3RhbmNlTWFuYWdlciA9ICgoQ1hGQV9Ob2RlKiljdXJOb2RlKS0+R2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKTsNCisgICAgICAgICAgICBpZihwSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICAgICAgICAgIHBQcm9wID0gcEluc3RhbmNlTWFuYWdlci0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfT2NjdXIsIFRSVUUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeU5hbWUod3NOYW1lKTsNCisgICAgICAgICAgICBpZiAocEVsZW1lbnQpIHsNCisgICAgICAgICAgICAgICAgcFByb3AgPSAoKENYRkFfTm9kZSopY3VyTm9kZSktPkdldFByb3BlcnR5KDAsIHBFbGVtZW50LT5lTmFtZSwgcEVsZW1lbnQtPmVOYW1lICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUHJvcCkgew0KKyAgICAgICAgICAgIG5vZGVzLkFkZChwUHJvcCk7DQorICAgICAgICAgICAgcmV0dXJuIG5vZGVzLkdldFNpemUoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBhcmVudE5vZGUgPSBtX3BOb2RlSGVscGVyLT5YRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudCgoQ1hGQV9Ob2RlICopY3VyTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgICBGWF9VSU5UMzIgdUN1ckNsYXNzSGFzaCA9IGN1ck5vZGUtPkdldENsYXNzSGFzaENvZGUoKTsNCisgICAgaWYgKHBhcmVudE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgaWYodUN1ckNsYXNzSGFzaCA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgICBub2Rlcy5BZGQoKENYRkFfTm9kZSopY3VyTm9kZSk7DQorICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICAgICAgICBpZihub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IHBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIEZYX0RXT1JEIGR3U3ViU3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7DQorICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KKyAgICAgICAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkgew0KKyAgICAgICAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgICAgICB9DQorICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsNCisgICAgICAgIHdoaWxlIChjaGlsZCkgew0KKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBjdXJOb2RlKSB7DQorICAgICAgICAgICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodUN1ckNsYXNzSGFzaCA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY3VyTm9kZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gdU5hbWVIYXNoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuQWRkKGN1ck5vZGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJuZC5tX25MZXZlbCA9PSAwICYmIHdzQ29uZGl0aW9uLkdldExlbmd0aCgpID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjaGlsZCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQocGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpLCBjaGlsZC0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYklubmVyU2VhcmNoID0gRkFMU0U7DQorICAgICAgICAgICAgaWYocFByb3BlcnQpIHsNCisgICAgICAgICAgICAgICAgaWYoKGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzIHx8IGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGJJbm5lclNlYXJjaCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZihtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoY2hpbGQpKSB7DQorICAgICAgICAgICAgICAgICAgICBiSW5uZXJTZWFyY2ggPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiSW5uZXJTZWFyY2gpIHsNCisgICAgICAgICAgICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBjaGlsZDsNCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPcmlnaW5Db25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247DQorICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBkd09yaWdpblN0eWxlID0gcm5kRmluZC5tX2R3U3R5bGVzOw0KKyAgICAgICAgICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd09yaWdpblN0eWxlIHwgWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgICAgICAgICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3T3JpZ2luU3R5bGU7DQorICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzT3JpZ2luQ29uZGl0aW9uOw0KKyAgICAgICAgICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB9DQorICAgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KKyAgICAgICAgICAgIGlmKG1fcE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNUcmFuc3BhcmVudChwYXJlbnROb2RlKSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSB1cEFycmF5Tm9kZXM7DQorICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9Db3VudFNpYmxpbmdzKChDWEZBX05vZGUqKW5vZGVzWzBdLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsICZ1cEFycmF5Tm9kZXMsIGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUgPyBUUlVFIDogRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBpZih1cEFycmF5Tm9kZXMuR2V0U2l6ZSgpID4gbm9kZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICB1cEFycmF5Tm9kZXNbMF0gPSAoQ1hGQV9Ob2RlKilub2Rlc1swXTsNCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICAgICAgbm9kZXMuQXBwZW5kKChDWEZBX09iakFycmF5ICYpdXBBcnJheU5vZGVzKTsNCisgICAgICAgICAgICAgICAgICAgIHVwQXJyYXlOb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgICAgICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUGFyZW50KSB7DQorICAgICAgICBGWF9EV09SRCBkd1N1YlN0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllczsNCisgICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQorICAgICAgICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3U3ViU3R5bGVzOw0KKyAgICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBwYXJlbnROb2RlOw0KKyAgICAgICAgQ1hGQV9Ob2RlQXJyYXkmIGFycmF5ID0gcm5kLm1fcFNDLT5HZXRVcE9iamVjdEFycmF5KCk7DQorICAgICAgICBhcnJheS5BZGQocGFyZW50Tm9kZSk7DQorICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCisgICAgICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KKyAgICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KK0ZYX0lOVDMyIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Bc3RlcmlzayhDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCkNCit7DQorICAgIENYRkFfTm9kZSogY3VyTm9kZSA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICAgIENYRkFfT2JqQXJyYXkgJm5vZGVzID0gcm5kLm1fTm9kZXM7DQorICAgIENYRkFfTm9kZUFycmF5IGFycmF5Ow0KKyAgICBjdXJOb2RlLT5HZXROb2RlTGlzdChhcnJheSwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gfCBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKTsNCisgICAgbm9kZXMuQXBwZW5kKChDWEZBX09iakFycmF5ICYpYXJyYXkpOw0KKyAgICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOw0KK30NCitGWF9JTlQzMiBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfUG9wU3RhY2soQ0ZYX0ludDMyQXJyYXkgJnN0YWNrKQ0KK3sNCisgICAgRlhfSU5UMzIgblR5cGUgPSAtMTsNCisgICAgRlhfSU5UMzIgaVNpemUgPSBzdGFjay5HZXRTaXplKCkgLSAxOw0KKyAgICBpZiAoaVNpemUgPiAtMSkgew0KKyAgICAgICAgblR5cGUgPSBzdGFja1tpU2l6ZV07DQorICAgICAgICBzdGFjay5SZW1vdmVBdChpU2l6ZSwgMSk7DQorICAgIH0NCisgICAgcmV0dXJuIG5UeXBlOw0KK30NCitGWF9JTlQzMiBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfR2V0RmlsdGVyKEZYX1dTVFIgd3NFeHByZXNzaW9uLCBGWF9JTlQzMiBuU3RhcnQsIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KK3sNCisgICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xKTsNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsNCisgICAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lID0gcm5kLm1fd3NOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgICAgRlhfTFBXU1RSIHBOYW1lQnVmID0gd3NOYW1lLkdldEJ1ZmZlcihpTGVuZ3RoIC0gblN0YXJ0KTsNCisgICAgRlhfTFBXU1RSIHBDb25kaXRpb25CdWYgPSB3c0NvbmRpdGlvbi5HZXRCdWZmZXIoaUxlbmd0aCAtIG5TdGFydCk7DQorICAgIEZYX0lOVDMyIG5Db3VudCA9IDA7DQorICAgIEZYX0lOVDMyIG5OYW1lQ291bnQgPSAwOw0KKyAgICBGWF9JTlQzMiBuQ29uZGl0aW9uQ291bnQgPSAwOw0KKyAgICBDRlhfSW50MzJBcnJheSBzdGFjazsNCisgICAgRlhfSU5UMzIgblR5cGUgPSAtMTsNCisgICAgRlhfTFBDV1NUUiBwU3JjID0gd3NFeHByZXNzaW9uLkdldFB0cigpOw0KKyAgICBGWF9XQ0hBUiB3UHJldiA9IDAsIHdDdXI7DQorICAgIEZYX0JPT0wgYklzQ29uZGl0aW9uID0gRkFMU0U7DQorICAgIHdoaWxlIChuU3RhcnQgPCBpTGVuZ3RoKSB7DQorICAgICAgICB3Q3VyID0gcFNyY1tuU3RhcnQgKytdOw0KKyAgICAgICAgaWYgKHdDdXIgPT0gJy4nKSB7DQorICAgICAgICAgICAgaWYgKHdQcmV2ID09ICdcXCcpIHsNCisgICAgICAgICAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCAtIDFdID0gd1ByZXYgPSAnLic7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZihuTmFtZUNvdW50ID09IDApIHsNCisgICAgICAgICAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCArK10gPSB3Q3VyOw0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfV0NIQVIgd0xvb2thaGVhZCA9IG5TdGFydCA8IGlMZW5ndGggPyBwU3JjIFtuU3RhcnRdIDogMDsNCisgICAgICAgICAgICBpZih3TG9va2FoZWFkICE9ICdbJyAmJiB3TG9va2FoZWFkICE9ICcoJykgew0KKyAgICAgICAgICAgICAgICBpZiAoblR5cGUgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh3Q3VyID09ICdbJyB8fCB3Q3VyID09ICcoJykgew0KKyAgICAgICAgICAgIGJJc0NvbmRpdGlvbiA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHdDdXIgPT0gJy4nICYmIG5TdGFydCA8IGlMZW5ndGggJiYgKHBTcmNbblN0YXJ0XSA9PSAnWycgfHwgcFNyY1tuU3RhcnRdID09ICcoJykpIHsNCisgICAgICAgICAgICBiSXNDb25kaXRpb24gPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYklzQ29uZGl0aW9uKSB7DQorICAgICAgICAgICAgcENvbmRpdGlvbkJ1ZltuQ29uZGl0aW9uQ291bnQgKytdID0gd0N1cjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCArK10gPSB3Q3VyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlID0gVFJVRTsNCisgICAgICAgIHN3aXRjaCAoblR5cGUpIHsNCisgICAgICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgICAgIGlmICh3Q3VyID09ICddJykgew0KKyAgICAgICAgICAgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCisgICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgICAgIGlmICh3Q3VyID09ICcpJykgew0KKyAgICAgICAgICAgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCisgICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICAgIGlmICh3Q3VyID09ICciJykgew0KKyAgICAgICAgICAgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCisgICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgICAgICAgICAgc3dpdGNoICh3Q3VyKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgJ1snOg0KKyAgICAgICAgICAgICAgICAgICAgc3RhY2suQWRkKG5UeXBlKTsNCisgICAgICAgICAgICAgICAgICAgIG5UeXBlID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgICAgICAgICAgIHN0YWNrLkFkZChuVHlwZSk7DQorICAgICAgICAgICAgICAgICAgICBuVHlwZSA9IDE7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSAnIic6DQorICAgICAgICAgICAgICAgICAgICBzdGFjay5BZGQoblR5cGUpOw0KKyAgICAgICAgICAgICAgICAgICAgblR5cGUgPSAyOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgd1ByZXYgPSB3Q3VyOw0KKyAgICB9DQorICAgIGlmIChzdGFjay5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgd3NOYW1lLlJlbGVhc2VCdWZmZXIobk5hbWVDb3VudCk7DQorICAgIHdzTmFtZS5UcmltTGVmdCgpOw0KKyAgICB3c05hbWUuVHJpbVJpZ2h0KCk7DQorICAgIHdzQ29uZGl0aW9uLlJlbGVhc2VCdWZmZXIobkNvbmRpdGlvbkNvdW50KTsNCisgICAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsNCisgICAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7DQorICAgIHJuZC5tX3VIYXNoTmFtZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgICAgcmV0dXJuIG5TdGFydDsNCit9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheShGWF9JTlQzMiBpQ3VySW5kZXgsIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLCBGWF9JTlQzMiBpRm91bmRDb3VudCwgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQorew0KKyAgICBDWEZBX05vZGVBcnJheSAmZmluZE5vZGVzID0gKENYRkFfTm9kZUFycmF5JilybmQubV9Ob2RlczsNCisgICAgRlhfSU5UMzIgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOw0KKyAgICBGWF9CT09MIGJSZWxhdGl2ZSA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGJBbGwgPSBGQUxTRTsNCisgICAgRlhfSU5UMzIgaSA9IDE7DQorICAgIGZvciAoOyBpIDwgaUxlbjsgKytpKSB7DQorICAgICAgICBGWF9XQ0hBUiBjaCA9IHdzQ29uZGl0aW9uW2ldOw0KKyAgICAgICAgaWYgKGNoID09ICcgJykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoID09ICcrJyB8fCBjaCA9PSAnLScpIHsNCisgICAgICAgICAgICBiUmVsYXRpdmUgPSBUUlVFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKicpIHsNCisgICAgICAgICAgICBiQWxsID0gVFJVRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJBbGwpIHsNCisgICAgICAgIGlmKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgICAgICAgICBpZihybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kKSB7DQorICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcENyZWF0ZVBhcmVudCA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gMTsNCisgICAgICAgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCA9IC0xOw0KKyAgICAgICAgICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BBbGxTdGFydFBhcmVudCA9IE5VTEw7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYobV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPT0gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7DQorICAgICAgICAgICAgICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BBbGxTdGFydFBhcmVudCA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykgew0KKyAgICAgICAgICAgIGlmKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID09IC0xKSB7DQorICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChpRm91bmRDb3VudCA9PSAxICYmICFpTGVuKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJbmRleDsNCisgICAgd3NJbmRleCA9IHdzQ29uZGl0aW9uLk1pZChpLCBpTGVuIC0gMSAtIGkpOw0KKyAgICBGWF9JTlQzMiBpSW5kZXggPSB3c0luZGV4LkdldEludGVnZXIoKTsNCisgICAgaWYgKGJSZWxhdGl2ZSkgew0KKyAgICAgICAgaUluZGV4ICs9IGlDdXJJbmRleDsNCisgICAgfQ0KKyAgICBpZiAoaUZvdW5kQ291bnQgPD0gaUluZGV4IHx8IGlJbmRleCA8IDApIHsNCisgICAgICAgIGlmKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gaUluZGV4IC0gaUZvdW5kQ291bnQgKyAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiByZXQgPSBmaW5kTm9kZXNbaUluZGV4XTsNCisgICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIGZpbmROb2Rlcy5BZGQocmV0KTsNCisgICAgfQ0KK30NCit2b2lkIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2RlX0RvUHJlZGljYXRlRmlsdGVyKEZYX0lOVDMyIGlDdXJJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIEZYX0lOVDMyIGlGb3VuZENvdW50LCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCkNCit7DQorICAgIENYRkFfTm9kZUFycmF5ICZmaW5kTm9kZXMgPSAoQ1hGQV9Ob2RlQXJyYXkmKXJuZC5tX05vZGVzOw0KKyAgICBGWFNZU19hc3NlcnQoaUZvdW5kQ291bnQgPT0gZmluZE5vZGVzLkdldFNpemUoKSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEw7DQorICAgIFhGQV9TQ1JJUFRMQU5HVFlQRSBlTGFuZ1R5cGUgPSBYRkFfU0NSSVBUTEFOR1RZUEVfVW5rb3duOw0KKyAgICBpZiAod3NDb25kaXRpb24uTGVmdCgyKSA9PSBGWF9XU1RSQyhMIi5bIikgJiYgd3NDb25kaXRpb24uUmlnaHQoMSkgPT0gRlhfV1NUUkMoTCJdIikpIHsNCisgICAgICAgIGVMYW5nVHlwZSA9IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYzsNCisgICAgfSBlbHNlIGlmICh3c0NvbmRpdGlvbi5MZWZ0KDIpID09IEZYX1dTVFJDKEwiLigiKSAmJiB3c0NvbmRpdGlvbi5SaWdodCgxKSA9PSBGWF9XU1RSQyhMIikiKSkgew0KKyAgICAgICAgZUxhbmdUeXBlID0gWEZBX1NDUklQVExBTkdUWVBFX0phdmFzY3JpcHQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcENvbnRleHQgPSBybmQubV9wU0M7DQorICAgIHdzRXhwcmVzc2lvbiA9IHdzQ29uZGl0aW9uLk1pZCgyLCB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKSAtIDMpOw0KKyAgICBmb3IoRlhfSU5UMzIgaSA9IGlGb3VuZENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgIENYRkFfT2JqZWN0KiBub2RlID0gZmluZE5vZGVzW2ldOw0KKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcFJldFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKHJuZC5tX3BTQy0+R2V0UnVudGltZSgpKTsNCisgICAgICAgIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KGVMYW5nVHlwZSwgd3NFeHByZXNzaW9uLCBwUmV0VmFsdWUsIG5vZGUpOw0KKyAgICAgICAgaWYoIWJSZXQgfHwgIUZYSlNFX1ZhbHVlX1RvQm9vbGVhbihwUmV0VmFsdWUpKSB7DQorICAgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUF0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwUmV0VmFsdWUpOw0KKyAgICB9DQorICAgIHJldHVybjsNCit9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24oQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQsIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uKQ0KK3sNCisgICAgQ1hGQV9Ob2RlQXJyYXkgJmZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7DQorICAgIEZYX0lOVDMyIGlDdXJySW5kZXggPSAwOw0KKyAgICBjb25zdCBDWEZBX05vZGVBcnJheSAmYXJyYXkgPSBybmQubV9wU0MtPkdldFVwT2JqZWN0QXJyYXkoKTsNCisgICAgRlhfSU5UMzIgaVNpemUgPSBhcnJheS5HZXRTaXplKCk7DQorICAgIGlmIChpU2l6ZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gYXJyYXlbaVNpemUgLSAxXTsNCisgICAgICAgIEZYX0JPT0wgYklzUHJvcGVydHkgPSAgbV9wTm9kZUhlbHBlci0+WEZBX05vZGVJc1Byb3BlcnR5KGN1ck5vZGUpOw0KKyAgICAgICAgaWYoY3VyTm9kZS0+SXNVbm5hbWVkKCkgfHwgKGJJc1Byb3BlcnR5ICYmIGN1ck5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSkgew0KKyAgICAgICAgICAgIGlDdXJySW5kZXggPSBtX3BOb2RlSGVscGVyLT5YRkFfR2V0SW5kZXgoY3VyTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCBiSXNQcm9wZXJ0eSwgVFJVRSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlDdXJySW5kZXggPSBtX3BOb2RlSGVscGVyLT5YRkFfR2V0SW5kZXgoY3VyTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCBiSXNQcm9wZXJ0eSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0lOVDMyIGlGb3VuZENvdW50ID0gZmluZE5vZGVzLkdldFNpemUoKTsNCisgICAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsNCisgICAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7DQorICAgIEZYX0lOVDMyIGlMZW4gPSB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKTsNCisgICAgaWYgKCFpTGVuKSB7DQorICAgICAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlGb3VuZENvdW50ID09IDEpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUZvdW5kQ291bnQgPD0gaUN1cnJJbmRleCkgew0KKyAgICAgICAgICAgIGlmKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCisgICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlQ291bnQgPSBpQ3VyckluZGV4IC0gaUZvdW5kQ291bnQgKyAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHJldCA9IGZpbmROb2Rlc1tpQ3VyckluZGV4XTsNCisgICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgZmluZE5vZGVzLkFkZChyZXQpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9XQ0hBUiB3VHlwZUNoYXIgPSB3c0NvbmRpdGlvblswXTsNCisgICAgc3dpdGNoICh3VHlwZUNoYXIpIHsNCisgICAgICAgIGNhc2UgJ1snOg0KKyAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheShpQ3VyckluZGV4LCB3c0NvbmRpdGlvbiwgaUZvdW5kQ291bnQsIHJuZCk7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSAnKCc6DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSAnIic6DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSAnLic6DQorICAgICAgICAgICAgaWYoaUxlbiA+IDEgJiYgKHdzQ29uZGl0aW9uWzFdID09ICdbJyB8fCB3c0NvbmRpdGlvblsxXSA9PSAnKCcpKSB7DQorICAgICAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9Eb1ByZWRpY2F0ZUZpbHRlcihpQ3VyckluZGV4LCB3c0NvbmRpdGlvbiwgaUZvdW5kQ291bnQsIHJuZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICByZXR1cm47DQorICAgIH0NCit9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfU2V0U3R5bGVzRm9yQ2hpbGQoRlhfRFdPUkQgZHdQYXJlbnRTdHlsZXMsIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KK3sNCisgICAgRlhfRFdPUkQgZHdTdWJTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW47DQorICAgIGlmIChkd1BhcmVudFN0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsNCisgICAgfQ0KKyAgICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1BhcmVudDsNCisgICAgZHdTdWJTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgZHdTdWJTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzOw0KKyAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQUxMOw0KKyAgICBybmQubV9kd1N0eWxlcyA9IGR3U3ViU3R5bGVzOw0KK30NCitGWF9JTlQzMiBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9TZXRSZXN1bHRDcmVhdGVOb2RlKFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywgQ0ZYX1dpZGVTdHJpbmcgJndzTGFzdENvbmRpdGlvbikNCit7DQorICAgIGlmKG1fcE5vZGVIZWxwZXItPm1fcENyZWF0ZVBhcmVudCkgew0KKyAgICAgICAgcmVzb2x2ZU5vZGVSUy5ub2Rlcy5BZGQobV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50KTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c0xhc3RDb25kaXRpb24pOw0KKyAgICB9DQorICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUZsYWc7DQorICAgIGlmKHJlc29sdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmUpIHsNCisgICAgICAgIGlmKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ICE9IC0xKSB7DQorICAgICAgICAgICAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByZXNvbHZlTm9kZVJTLm5vZGVzLkdldFNpemUoKTsNCit9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9TZXRJbmRleERhdGFCaW5kKENGWF9XaWRlU3RyaW5nICZ3c05leHRDb25kaXRpb24sIEZYX0lOVDMyICZpSW5kZXgsIEZYX0lOVDMyIGlDb3VudCkNCit7DQorICAgIGlmKG1fcE5vZGVIZWxwZXItPlhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c05leHRDb25kaXRpb24pKSB7DQorICAgICAgICBpZihtX3BOb2RlSGVscGVyLT5tX2VMYXN0Q3JlYXRlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCisgICAgICAgICAgICBpSW5kZXggPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpSW5kZXggPSBpQ291bnQgLSAxOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaUluZGV4ID0gaUNvdW50IC0gMTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZmU1MmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuaApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9SRVNPTFZFUFJPQ0VTU09SX0hfDQorI2RlZmluZSBfWEZBX1JFU09MVkVQUk9DRVNTT1JfSF8NCitjbGFzcyBDWEZBX05vZGVIZWxwZXI7DQorY2xhc3MgQ1hGQV9TY3JpcHRDb250ZXh0Ow0KK2NsYXNzIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhKENYRkFfU2NyaXB0Q29udGV4dCAqcFNDID0gTlVMTCkNCisgICAgICAgIDogbV9wU0MocFNDKQ0KKyAgICAgICAgLCBtX0N1ck5vZGUoTlVMTCkNCisgICAgICAgICwgbV93c05hbWUoKQ0KKyAgICAgICAgLCBtX3VIYXNoTmFtZSgwKQ0KKyAgICAgICAgLCBtX3dzQ29uZGl0aW9uKCkNCisgICAgICAgICwgbV9uTGV2ZWwoMCkNCisgICAgICAgICwgbV9Ob2RlcygpDQorICAgICAgICAsIG1fZHdTdHlsZXMoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKQ0KKyAgICAgICAgLCBtX3BTY3JpcHRBdHRyaWJ1dGUoTlVMTCkNCisgICAgICAgICwgbV9kd0ZsYWcoWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKQ0KKyAgICB7DQorICAgIH0NCisgICAgfkNYRkFfUmVzb2x2ZU5vZGVzRGF0YSgpDQorICAgIHsNCisgICAgICAgIG1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgQ1hGQV9TY3JpcHRDb250ZXh0KgkJCW1fcFNDOw0KKyAgICBDWEZBX09iamVjdCoJCQkJbV9DdXJOb2RlOw0KKyAgICBDRlhfV2lkZVN0cmluZwkJCQltX3dzTmFtZTsNCisgICAgRlhfVUlOVDMyCQkJCQltX3VIYXNoTmFtZTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcJCQkJbV93c0NvbmRpdGlvbjsNCisgICAgRlhfSU5UMzIJCQkJCW1fbkxldmVsOw0KKyAgICBDWEZBX09iakFycmF5CQkJCW1fTm9kZXM7DQorICAgIEZYX0RXT1JECQkJCQltX2R3U3R5bGVzOw0KKyAgICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTwltX3BTY3JpcHRBdHRyaWJ1dGU7DQorICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRQkJbV9kd0ZsYWc7DQorfTsNCitjbGFzcyBDWEZBX1Jlc29sdmVQcm9jZXNzb3IgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKTsNCisgICAgfkNYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKTsNCisgICAgRlhfSU5UMzIJWEZBX1Jlc29sdmVOb2RlcyhDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQorICAgIEZYX0lOVDMyCVhGQV9SZXNvbHZlTm9kZXNfQW55Q2hpbGQoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KKyAgICBGWF9JTlQzMglYRkFfUmVzb2x2ZU5vZGVzX0RvbGxhcihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQorICAgIEZYX0lOVDMyCVhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KKyAgICBGWF9JTlQzMglYRkFfUmVzb2x2ZU5vZGVzX051bWJlclNpZ24oQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KKyAgICBGWF9JTlQzMglYRkFfUmVzb2x2ZU5vZGVzX0FzdGVyaXNrKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKTsNCisgICAgRlhfSU5UMzIJWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KKyAgICBGWF9JTlQzMglYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKENYRkFfT2JqZWN0KiBjdXJOb2RlLCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCwgRlhfV1NUUiBzdHJBdHRyKTsNCisgICAgdm9pZAkJWEZBX1Jlc29sdmVOb2RlX0NvbmRpdGlvbkFycmF5KEZYX0lOVDMyIGlDdXJJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIEZYX0lOVDMyIGlGb3VuZENvdW50LCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQorICAgIHZvaWQJCVhGQV9SZXNvbHZlTm9kZV9Eb1ByZWRpY2F0ZUZpbHRlcihGWF9JTlQzMiBpQ3VySW5kZXgsIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLCBGWF9JTlQzMiBpRm91bmRDb3VudCwgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KKyAgICBGWF9JTlQzMglYRkFfUmVzb2x2ZU5vZGVzX0dldEZpbHRlcihGWF9XU1RSIHdzRXhwcmVzc2lvbiwgRlhfSU5UMzIgblN0YXJ0LCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQorICAgIHZvaWQJCVhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24oQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQsIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uKTsNCisgICAgRlhfSU5UMzIJWEZBX1Jlc29sdmVOb2Rlc19Qb3BTdGFjayhDRlhfSW50MzJBcnJheSAmc3RhY2spOw0KKyAgICB2b2lkCQlYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKEZYX0RXT1JEIGR3UGFyZW50U3R5bGVzLCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQorICAgIEZYX0lOVDMyCVhGQV9SZXNvbHZlTm9kZV9TZXRSZXN1bHRDcmVhdGVOb2RlKFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywgQ0ZYX1dpZGVTdHJpbmcgJndzTGFzdENvbmRpdGlvbik7DQorICAgIHZvaWQJICAgIFhGQV9SZXNvbHZlTm9kZV9TZXRJbmRleERhdGFCaW5kKENGWF9XaWRlU3RyaW5nICZ3c05leHRDb25kaXRpb24sIEZYX0lOVDMyICZpSW5kZXgsIEZYX0lOVDMyIGlDb3VudCk7DQorICAgIENYRkFfTm9kZUhlbHBlciogR2V0Tm9kZUhlbHBlcigpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX3BOb2RlSGVscGVyOw0KKyAgICB9DQorcHJpdmF0ZToNCisgICAgQ1hGQV9Ob2RlSGVscGVyKiBtX3BOb2RlSGVscGVyOw0KK3B1YmxpYzoNCisgICAgRlhfSU5UMzIJCSBtX2lDdXJTdGFydDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliOWRlMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZGVidWcuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCINCitDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHNldWRvTW9kZWwpDQorew0KKyAgICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX1NpZ25hdHVyZTsNCit9DQorQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoKQ0KK3sNCit9DQordm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQorew0KKyAgICBGWF9JTlQzMiBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gNCkgew0KKyAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgKEZYX0xQQ1dTVFIpKEwidmVyaWZ5IikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICB9DQorICAgIEZYX0lOVDMyIGJWZXJpZnkgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5WZXJpZnkoaERvYywgcE5vZGUpOw0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGJWZXJpZnkpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6U2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX1NpZ24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCit7DQorICAgIEZYX0lOVDMyIGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW5ndGggPCAzIHx8IGlMZW5ndGggPiA3KSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJzaWduIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgQ1hGQV9Ob2RlTGlzdCogcE5vZGVMaXN0ID0gTlVMTDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1hNTElkZW50Ow0KKyAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgICAgICBwTm9kZUxpc3QgPSAoQ1hGQV9Ob2RlTGlzdCopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgICAgICB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzWE1MSWRlbnQgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICAgICAgd3NYTUxJZGVudCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1hNTElkZW50LCBic1hNTElkZW50LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJTaWduID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2lnbihoRG9jLCBwTm9kZUxpc3QsIHdzRXhwcmVzc2lvbiwgd3NYTUxJZGVudCk7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgICBpZiAoaFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYlNpZ24pOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6U2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0VudW1lcmF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCAhPSAwKSB7DQorICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCAoRlhfTFBDV1NUUikoTCJlbnVtZXJhdGUiKSk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfSERPQyBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgICBDWEZBX05vZGVMaXN0ICpwTGlzdCA9ICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5FbnVtZXJhdGUoaERvYyk7DQorICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTGlzdCkpOw0KK30NCit2b2lkIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9DbGVhcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KK3sNCisgICAgRlhfSU5UMzIgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDIpIHsNCisgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIChGWF9MUENXU1RSKShMImNsZWFyIikpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0hET0MgaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIEZYX0JPT0wgYkNsZWFyID0gVFJVRTsNCisgICAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICAgIH0NCisgICAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICAgICAgYkNsZWFyID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJGbGFnID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q2xlYXIoaERvYywgcE5vZGUsIGJDbGVhcik7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgICAgaWYgKGhWYWx1ZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJGbGFnKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4OTgyMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXw0KKyNkZWZpbmUgX1NDUklQVF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXw0KK2NsYXNzIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgICAgfkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoKTsNCisgICAgdm9pZAlTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9TaWduKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgICB2b2lkCVNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9FbnVtZXJhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICAgIHZvaWQJU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0NsZWFyKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3V0aWxzX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfdXRpbHNfaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdjYTljCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3V0aWxzX2ltcC5jcHAKQEAgLTAsMCArMSwzODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCitDWEZBX05vZGUqIFhGQV9DcmVhdGVVSUNoaWxkKENYRkFfTm9kZSogcE5vZGUsIFhGQV9FTEVNRU5UJiBlV2lkZ2V0VHlwZSkNCit7DQorICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgZVdpZGdldFR5cGUgPSBlVHlwZTsNCisgICAgaWYgKGVUeXBlICE9IFhGQV9FTEVNRU5UX0ZpZWxkICYmIGVUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCisgICAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIENYRkFfVmFsdWUgZGVmVmFsdWUgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsdWUsIFRSVUUpOw0KKyAgICBYRkFfRUxFTUVOVCBlVmFsdWVUeXBlID0gKFhGQV9FTEVNRU5UKWRlZlZhbHVlLkdldENoaWxkVmFsdWVDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZVZhbHVlVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29sZWFuOg0KKyAgICAgICAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW50ZWdlcjoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGVjaW1hbDoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmxvYXQ6DQorICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeERhdGE6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX1RleHRFZGl0Ow0KKyAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZToNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGltZToNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWU6DQorICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2U6DQorICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlRWRpdDsNCisgICAgICAgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlOw0KKyAgICAgICAgICAgIGJyZWFrOzsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJjOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9MaW5lOg0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9SZWN0YW5nbGU6DQorICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX0RlZmF1bHRVaTsNCisgICAgICAgICAgICBlV2lkZ2V0VHlwZSA9IGVWYWx1ZVR5cGU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBVSSA9IHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9VaSwgVFJVRSk7DQorICAgIENYRkFfTm9kZSAqcENoaWxkID0gcFVJLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoIDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVDaGlsZCA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKGVDaGlsZCA9PSBYRkFfRUxFTUVOVF9FeHRyYXMgfHwgZUNoaWxkID09IFhGQV9FTEVNRU5UX1BpY3R1cmUpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvdGVydHkgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoWEZBX0VMRU1FTlRfVWksIGVDaGlsZCwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgICAgICAgIGlmIChwUHJvdGVydHkgJiYgKHBQcm90ZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsNCisgICAgICAgICAgICBwVUlDaGlsZCA9IHBDaGlsZDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihlVHlwZSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICBYRkFfRUxFTUVOVCBlRHJhdyA9IHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldENsYXNzSUQoKSA6IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgICAgICBzd2l0Y2ggKGVEcmF3KSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICAgICAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCisgICAgICAgICAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9JbWFnZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgZVdpZGdldFR5cGUgPSBlV2lkZ2V0VHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOID8gWEZBX0VMRU1FTlRfVGV4dCA6IGVXaWRnZXRUeXBlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChwVUlDaGlsZCAmJiBwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RlZmF1bHRVaSkgew0KKyAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfVGV4dEVkaXQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpIDogKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTiA/IFhGQV9FTEVNRU5UX1RleHRFZGl0IDogZVVJVHlwZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFwVUlDaGlsZCkgew0KKyAgICAgICAgaWYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICAgICAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0RWRpdDsNCisgICAgICAgICAgICAoKENYRkFfTm9kZSopZGVmVmFsdWUpLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9UZXh0LCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgICAgIHBVSUNoaWxkID0gcFVJLT5HZXRQcm9wZXJ0eSgwLCBlVUlUeXBlLCBUUlVFKTsNCisgICAgfSBlbHNlIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICAgIHN3aXRjaCAocFVJQ2hpbGQtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246IHsNCisgICAgICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDWEZBX05vZGUqIHBJdGVtID0gcEl0ZW1zLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWVUeXBlID0gcEl0ZW0tPkdldENsYXNzSUQoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQ6DQorICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRlVGltZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQorICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9JbWFnZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCisgICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX0Zsb2F0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6IHsNCisgICAgICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSAocFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PcGVuKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgPyBYRkFfRUxFTUVOVF9FeERhdGEgOiBYRkFfRUxFTUVOVF9UZXh0Ow0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQmFyY29kZToNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NpZ25hdHVyZToNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgICgoQ1hGQV9Ob2RlKilkZWZWYWx1ZSktPkdldFByb3BlcnR5KDAsIGVWYWx1ZVR5cGUsIFRSVUUpOw0KKyAgICB9DQorICAgIHJldHVybiBwVUlDaGlsZDsNCit9DQorQ1hGQV9Mb2NhbGVWYWx1ZSBYRkFfR2V0TG9jYWxlVmFsdWUoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSkNCit7DQorICAgIENYRkFfTm9kZSogcE5vZGVWYWx1ZSA9IHBXaWRnZXREYXRhLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgaWYgKCFwTm9kZVZhbHVlKSB7DQorICAgICAgICByZXR1cm4gQ1hGQV9Mb2NhbGVWYWx1ZSgpOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmICghcFZhbHVlQ2hpbGQpIHsNCisgICAgICAgIHJldHVybiBDWEZBX0xvY2FsZVZhbHVlKCk7DQorICAgIH0NCisgICAgRlhfSU5UMzIgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBWYWx1ZUNoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGVjaW1hbDoNCisgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0RFQ0lNQUw7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Zsb2F0Og0KKyAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfRkxPQVQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGU6DQorICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UaW1lOg0KKyAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVElNRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWU6DQorICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFVElNRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9vbGVhbjoNCisgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0JPT0xFQU47DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ludGVnZXI6DQorICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9JTlRFR0VSOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVEVYVDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBDWEZBX0xvY2FsZVZhbHVlKGlWVFR5cGUsIHBXaWRnZXREYXRhLT5HZXRSYXdWYWx1ZSgpLCBwV2lkZ2V0RGF0YS0+R2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpKTsNCit9DQordm9pZAlYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIENGWF9XaWRlU3RyaW5nICZ3c1BsYWluVGV4dCkNCit7DQorICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgc3dpdGNoKHBYTUxOb2RlLT5HZXRUeXBlKCkpIHsNCisgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KKyAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGU7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KKyAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICAgICAgICAgICAgRlhfVUlOVDMyIHVUYWcgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1RhZywgd3NUYWcuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgICAgICAgICAgICBpZiAodVRhZyA9PSAweDAwMDFmNzE0KSB7DQorICAgICAgICAgICAgICAgICAgICB3c1BsYWluVGV4dCArPSBMIlxuIjsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1VGFnID09IDB4MDAwMDAwNzApIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghd3NQbGFpblRleHQuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgd3NQbGFpblRleHQgKz0gTCJcbiI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodVRhZyA9PSAweGE0OGFjNjMpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghd3NQbGFpblRleHQuSXNFbXB0eSgpICYmIHdzUGxhaW5UZXh0W3dzUGxhaW5UZXh0LkdldExlbmd0aCgpIC0gMV0gIT0gJ1xuJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzUGxhaW5UZXh0ICs9IEwiXG4iOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7DQorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgICAgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxOb2RlKS0+R2V0VGV4dCh3c0NvbnRlbnQpOw0KKyAgICAgICAgICAgICAgICB3c1BsYWluVGV4dCArPSB3c0NvbnRlbnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOw0KKyAgICAgICAgICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBYTUxOb2RlKS0+R2V0Q2hhckRhdGEod3NDaGFyRGF0YSk7DQorICAgICAgICAgICAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ2hhckRhdGE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBmb3IgKElGREVfWE1MTm9kZSAqcENoaWxkWE1MID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBDaGlsZFhNTDsgcENoaWxkWE1MID0gcENoaWxkWE1MLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChwQ2hpbGRYTUwsIHdzUGxhaW5UZXh0KTsNCisgICAgfQ0KK30NCitGWF9CT09MIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KENYRkFfTm9kZSogcEZpZWxkTm9kZSkNCit7DQorICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgICBpZiAoIXBGaWVsZE5vZGUpIHsNCisgICAgICAgIHJldHVybiBiUmV0Ow0KKyAgICB9DQorICAgIENYRkFfTm9kZSAqcFVJQ2hpbGQgPSBwRmllbGROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9VaSk7DQorICAgIGlmIChwVUlDaGlsZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlICpwRmlyc3RDaGlsZCA9IHBVSUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBpZiAocEZpcnN0Q2hpbGQgJiYgcEZpcnN0Q2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0KSB7DQorICAgICAgICAgICAgYlJldCA9IHBGaXJzdENoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlbikgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3Q7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgWEZBX0lzTGF5b3V0RWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfQk9PTCBiTGF5b3V0Q29udGFpbmVyICkNCit7DQorICAgIHN3aXRjaCAoZUVsZW1lbnQpIHsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcjoNCisgICAgICAgICAgICByZXR1cm4gIWJMYXlvdXRDb250YWluZXI7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDoNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Zvcm06DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgWEZBX0lzVGFraW5ndXBTcGFjZShYRkFfQVRUUklCVVRFRU5VTSBlUHJlc2VuY2UpDQorew0KKyAgICBzd2l0Y2ggKGVQcmVzZW5jZSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JbnZpc2libGU6DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgWEZBX0lzRmxvd2luZ0xheW91dChYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KQ0KK3sNCisgICAgc3dpdGNoIChlTGF5b3V0KSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RiOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YjoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgWEZBX0lzSG9yaXpvbnRhbEZsb3coWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCkNCit7DQorICAgIHN3aXRjaCAoZUxheW91dCkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YjoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK3N0YXRpYyBjb25zdCBGWF9ET1VCTEUgZnJhY3Rpb25fc2NhbGVzW10gPSB7MC4xLCAwLjAxLCAwLjAwMSwgMC4wMDAxLCAwLjAwMDAxLCAwLjAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMSwgMC4wMDAwMDAwMSwgMC4wMDAwMDAwMDEsIDAuMDAwMDAwMDAwMSwgMC4wMDAwMDAwMDAwMSwgMC4wMDAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAwMDAwMDENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCitGWF9ET1VCTEUgWEZBX1dpZGVTdHJpbmdUb0RvdWJsZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NTdHJpbmdWYWwpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gd3NTdHJpbmdWYWw7DQorICAgIHdzVmFsdWUuVHJpbUxlZnQoKTsNCisgICAgd3NWYWx1ZS5UcmltUmlnaHQoKTsNCisgICAgRlhfQk9PTCBiVmFsaWQgPSBUUlVFOw0KKyAgICBGWF9JTlQ2NCBuSW50ZWdyYWwgPSAwOw0KKyAgICBGWF9EV09SRCBkd0ZyYWN0aW9uYWwgPSAwOw0KKyAgICBGWF9JTlQzMiBuRXhwb25lbnQgPSAwOw0KKyAgICBGWF9JTlQzMiBjYyA9IDA7DQorICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQorICAgIEZYX0xQQ1dTVFIgc3RyID0gKEZYX0xQQ1dTVFIpd3NWYWx1ZTsNCisgICAgRlhfSU5UMzIgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKHN0clswXSA9PSAnKycpIHsNCisgICAgICAgIGNjKys7DQorICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgew0KKyAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgICAgIGNjKys7DQorICAgIH0NCisgICAgRlhfSU5UMzIgbkludGVncmFsTGVuID0gMDsNCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScgfHwgbkludGVncmFsTGVuID4gMTcpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgIGNjICsrOw0KKyAgICAgICAgbkludGVncmFsTGVuKys7DQorICAgIH0NCisgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsNCisgICAgRlhfSU5UMzIgc2NhbGUgPSAwOw0KKyAgICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7DQorICAgIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcuJykgew0KKyAgICAgICAgY2MgKys7DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICBmcmFjdGlvbiArPSBmcmFjdGlvbl9zY2FsZXNbc2NhbGVdICogKHN0cltjY10gLSAnMCcpOw0KKyAgICAgICAgICAgIHNjYWxlICsrOw0KKyAgICAgICAgICAgIGNjICsrOw0KKyAgICAgICAgICAgIGlmIChjYyA9PSBsZW4pIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgKGZyYWN0aW9uX3NjYWxlcykgLyBzaXplb2YoRlhfRE9VQkxFKQ0KKyAgICAgICAgICAgICAgICAgICAgfHwgc3RyW2NjXSA9PSAnRScNCisgICAgICAgICAgICAgICAgICAgIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGR3RnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KKyAgICB9DQorICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICBjYyArKzsNCisgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG5FeHBvbmVudCA9IG5FeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICBjYyArKzsNCisgICAgICAgIH0NCisgICAgICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsNCisgICAgfQ0KKyAgICBGWF9ET1VCTEUgZFZhbHVlID0gKGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMCk7DQorICAgIGRWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGRWYWx1ZSA6IC1kVmFsdWUpOw0KKyAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCisgICAgICAgIGRWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCluRXhwb25lbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBkVmFsdWU7DQorfQ0KK0ZYX0RPVUJMRSBYRkFfQnl0ZVN0cmluZ1RvRG91YmxlKEZYX0JTVFIgc3pTdHJpbmdWYWwpDQorew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U3RyaW5nVmFsLkdldENTdHIoKSwgc3pTdHJpbmdWYWwuR2V0TGVuZ3RoKCkpOw0KKyAgICByZXR1cm4gWEZBX1dpZGVTdHJpbmdUb0RvdWJsZSh3c1ZhbHVlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9ncmFwaGljcy5jcHAgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X2dyYXBoaWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBkNDZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9ncmFwaGljcy5jcHAKQEAgLTAsMCArMSwxNjcwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJwcmUuaCINCisjaW5jbHVkZSAiZnhfcGF0aF9nZW5lcmF0b3IuaCINCitjbGFzcyBDQUdHX0dyYXBoaWNzIDogcHVibGljIENGWF9PYmplY3QNCit7DQorcHVibGljOg0KKyAgICBDQUdHX0dyYXBoaWNzKCk7DQorICAgIEZYX0VSUiBDcmVhdGUoQ0ZYX0dyYXBoaWNzICogb3duZXIsDQorICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgICAgICAgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgICAgICAgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCAgIGZvcm1hdCk7DQorICAgIHZpcnR1YWwgfkNBR0dfR3JhcGhpY3MoKTsNCitwcml2YXRlOg0KKyAgICBDRlhfR3JhcGhpY3MgKiAgX293bmVyOw0KK307DQorQ0ZYX0dyYXBoaWNzOjpDRlhfR3JhcGhpY3MoKQ0KK3sNCisgICAgX3R5cGUJPSBGWF9DT05URVhUX05vbmU7DQorICAgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudCgwKTsNCisgICAgX2luZm8uX2lzQW50aWFsaWFzaW5nCT0gVFJVRTsNCisgICAgX2luZm8uX3N0cm9rZUFsaWdubWVudAk9IEZYX1NUUk9LRUFMSUdOTUVOVF9DZW50ZXI7DQorICAgIF9pbmZvLl9DVE0uUmVzZXQoKTsNCisgICAgX2luZm8uX2lzQWN0T25EYXNoCQk9IEZBTFNFOw0KKyAgICBfaW5mby5fc3Ryb2tlQ29sb3IJCT0gTlVMTDsNCisgICAgX2luZm8uX2ZpbGxDb2xvcgkJPSBOVUxMOw0KKyAgICBfaW5mby5fZm9udAkJCQk9IE5VTEw7DQorICAgIF9pbmZvLl9mb250U2l6ZQkJCT0gNDAuMDsNCisgICAgX2luZm8uX2ZvbnRIU2NhbGUJCT0gMS4wOw0KKyAgICBfaW5mby5fZm9udFNwYWNpbmcJCT0gMC4wOw0KKyAgICBfcmVuZGVyRGV2aWNlCQkJPSBOVUxMOw0KKyAgICBfYWdnR3JhcGhpY3MgICAgICAgICAgICA9IE5VTEw7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNyZWF0ZShDRlhfUmVuZGVyRGV2aWNlICogcmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJICAgaXNBbnRpYWxpYXNpbmcgKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlbmRlckRldmljZSwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgaWYgKF90eXBlICE9IEZYX0NPTlRFWFRfTm9uZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICB9DQorICAgIF90eXBlCQkJCQk9IEZYX0NPTlRFWFRfRGV2aWNlOw0KKyAgICBfaW5mby5faXNBbnRpYWxpYXNpbmcJPSBpc0FudGlhbGlhc2luZzsNCisgICAgX3JlbmRlckRldmljZQkJCT0gcmVuZGVyRGV2aWNlOw0KKyAgICBpZiAoX3JlbmRlckRldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSB7DQorICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNyZWF0ZShGWF9JTlQzMgkgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyCSBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgICAgICBpc05hdGl2ZSAgICAgICAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJCSBpc0FudGlhbGlhc2luZyApDQorew0KKyAgICBpZiAoX3R5cGUgIT0gRlhfQ09OVEVYVF9Ob25lKSB7DQorICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgIH0NCisgICAgX3R5cGUJCQkJCT0gRlhfQ09OVEVYVF9EZXZpY2U7DQorICAgIF9pbmZvLl9pc0FudGlhbGlhc2luZwk9IGlzQW50aWFsaWFzaW5nOw0KKyAgICB7DQorICAgICAgICBfYWdnR3JhcGhpY3MgPSBGWF9ORVcgQ0FHR19HcmFwaGljczsNCisgICAgICAgIHJldHVybiBfYWdnR3JhcGhpY3MtPkNyZWF0ZSh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOw0KKyAgICB9DQorfQ0KK0NGWF9HcmFwaGljczo6fkNGWF9HcmFwaGljcygpDQorew0KKyAgICBpZiAoX2FnZ0dyYXBoaWNzKSB7DQorICAgICAgICBkZWxldGUgX2FnZ0dyYXBoaWNzOw0KKyAgICAgICAgX2FnZ0dyYXBoaWNzID0gTlVMTDsNCisgICAgfQ0KKyAgICBfcmVuZGVyRGV2aWNlID0gTlVMTDsNCisgICAgX2luZm8uX2dyYXBoU3RhdGUuU2V0RGFzaENvdW50KDApOw0KKyAgICBfdHlwZQk9IEZYX0NPTlRFWFRfTm9uZTsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0RGV2aWNlQ2FwKGNvbnN0IEZYX0lOVDMyIGNhcElELCBGWF9EZXZpY2VDYXAgJiBjYXBWYWwpDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIGNhcFZhbCA9IF9yZW5kZXJEZXZpY2UtPkdldERldmljZUNhcHMoY2FwSUQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6SXNQcmludGVyRGV2aWNlKEZYX0JPT0wgJiBpc1ByaW50ZXIpDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIGRldmljZUNsYXNzID0gX3JlbmRlckRldmljZS0+R2V0RGV2aWNlQ2xhc3MoKTsNCisgICAgICAgICAgICAgICAgaWYgKGRldmljZUNsYXNzID09IEZYRENfUFJJTlRFUikgew0KKyAgICAgICAgICAgICAgICAgICAgaXNQcmludGVyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlzUHJpbnRlciA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpFbmFibGVBbnRpYWxpYXNpbmcoRlhfQk9PTCBpc0FudGlhbGlhc2luZykNCit7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgX2luZm8uX2lzQW50aWFsaWFzaW5nID0gaXNBbnRpYWxpYXNpbmc7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTYXZlR3JhcGhTdGF0ZSgpDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9yZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgICAgICAgICAgICAgICBUSW5mbyAqIGluZm8gPSBGWF9ORVcgVEluZm87DQorICAgICAgICAgICAgICAgIGluZm8tPl9ncmFwaFN0YXRlLkNvcHkoX2luZm8uX2dyYXBoU3RhdGUpOw0KKyAgICAgICAgICAgICAgICBpbmZvLT5faXNBbnRpYWxpYXNpbmcJPSBfaW5mby5faXNBbnRpYWxpYXNpbmc7DQorICAgICAgICAgICAgICAgIGluZm8tPl9zdHJva2VBbGlnbm1lbnQJPSBfaW5mby5fc3Ryb2tlQWxpZ25tZW50Ow0KKyAgICAgICAgICAgICAgICBpbmZvLT5fQ1RNCQkJCT0gX2luZm8uX0NUTTsNCisgICAgICAgICAgICAgICAgaW5mby0+X2lzQWN0T25EYXNoCQk9IF9pbmZvLl9pc0FjdE9uRGFzaDsNCisgICAgICAgICAgICAgICAgaW5mby0+X3N0cm9rZUNvbG9yCQk9IF9pbmZvLl9zdHJva2VDb2xvcjsNCisgICAgICAgICAgICAgICAgaW5mby0+X2ZpbGxDb2xvcgkJPSBfaW5mby5fZmlsbENvbG9yOw0KKyAgICAgICAgICAgICAgICBpbmZvLT5fZm9udAkJCQk9IF9pbmZvLl9mb250Ow0KKyAgICAgICAgICAgICAgICBpbmZvLT5fZm9udFNpemUJCQk9IF9pbmZvLl9mb250U2l6ZTsNCisgICAgICAgICAgICAgICAgaW5mby0+X2ZvbnRIU2NhbGUJCT0gX2luZm8uX2ZvbnRIU2NhbGU7DQorICAgICAgICAgICAgICAgIGluZm8tPl9mb250U3BhY2luZwkJPSBfaW5mby5fZm9udFNwYWNpbmc7DQorICAgICAgICAgICAgICAgIF9pbmZvU3RhY2suQWRkKGluZm8pOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVzdG9yZUdyYXBoU3RhdGUoKQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBfcmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgc2l6ZSA9IF9pbmZvU3RhY2suR2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIHRvcEluZGV4ID0gc2l6ZSAtIDE7DQorICAgICAgICAgICAgICAgIFRJbmZvICogaW5mbyA9IChUSW5mbyAqKSBfaW5mb1N0YWNrLkdldEF0KHRvcEluZGV4KTsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGluZm8sIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLkNvcHkoaW5mby0+X2dyYXBoU3RhdGUpOw0KKyAgICAgICAgICAgICAgICBfaW5mby5faXNBbnRpYWxpYXNpbmcJPSBpbmZvLT5faXNBbnRpYWxpYXNpbmc7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9zdHJva2VBbGlnbm1lbnQJPSBpbmZvLT5fc3Ryb2tlQWxpZ25tZW50Ow0KKyAgICAgICAgICAgICAgICBfaW5mby5fQ1RNCQkJCT0gaW5mby0+X0NUTTsNCisgICAgICAgICAgICAgICAgX2luZm8uX2lzQWN0T25EYXNoCQk9IGluZm8tPl9pc0FjdE9uRGFzaDsNCisgICAgICAgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yCQk9IGluZm8tPl9zdHJva2VDb2xvcjsNCisgICAgICAgICAgICAgICAgX2luZm8uX2ZpbGxDb2xvcgkJPSBpbmZvLT5fZmlsbENvbG9yOw0KKyAgICAgICAgICAgICAgICBfaW5mby5fZm9udAkJCQk9IGluZm8tPl9mb250Ow0KKyAgICAgICAgICAgICAgICBfaW5mby5fZm9udFNpemUJCQk9IGluZm8tPl9mb250U2l6ZTsNCisgICAgICAgICAgICAgICAgX2luZm8uX2ZvbnRIU2NhbGUJCT0gaW5mby0+X2ZvbnRIU2NhbGU7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9mb250U3BhY2luZwkJPSBpbmZvLT5fZm9udFNwYWNpbmc7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOw0KKyAgICAgICAgICAgICAgICBpbmZvID0gTlVMTDsNCisgICAgICAgICAgICAgICAgX2luZm9TdGFjay5SZW1vdmVBdCh0b3BJbmRleCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCAmIGxpbmVDYXApDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIGxpbmVDYXAgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVDYXA7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBsaW5lQ2FwKQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVDYXAgPSBsaW5lQ2FwOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0RGFzaENvdW50KEZYX0lOVDMyICYgZGFzaENvdW50KQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBkYXNoQ291bnQgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hDb3VudDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldExpbmVEYXNoKEZYX0ZMT0FUICYgZGFzaFBoYXNlLCBGWF9GTE9BVCAqIGRhc2hBcnJheSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkYXNoQXJyYXksIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgZGFzaFBoYXNlID0gX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoUGhhc2U7DQorICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShkYXNoQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaENvdW50ICogc2l6ZW9mIChGWF9GTE9BVCkpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TGluZURhc2goRlhfRkxPQVQJZGFzaFBoYXNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICoJZGFzaEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyCWRhc2hDb3VudCkNCit7DQorICAgIGlmIChkYXNoQ291bnQgPiAwICYmICFkYXNoQXJyYXkpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICAgIH0NCisgICAgZGFzaENvdW50ID0gZGFzaENvdW50IDwgMCA/IDAgOiBkYXNoQ291bnQ7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgc2NhbGUgPSAxLjA7DQorICAgICAgICAgICAgICAgIGlmIChfaW5mby5faXNBY3RPbkRhc2gpIHsNCisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lV2lkdGg7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSBkYXNoUGhhc2U7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudChkYXNoQ291bnQpOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgZGFzaENvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaEFycmF5W2ldID0gZGFzaEFycmF5W2ldICogc2NhbGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBSZW5kZXJEZXZpY2VTZXRMaW5lRGFzaChkYXNoU3R5bGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lSm9pbihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luICYgbGluZUpvaW4pDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIGxpbmVKb2luID0gX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lSm9pbjsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVKb2luKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gbGluZUpvaW4pDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZUpvaW4gPSBsaW5lSm9pbjsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldE1pdGVyTGltaXQoRlhfRkxPQVQgJiBtaXRlckxpbWl0KQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBtaXRlckxpbWl0ID0gX2luZm8uX2dyYXBoU3RhdGUubV9NaXRlckxpbWl0Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TWl0ZXJMaW1pdChGWF9GTE9BVCBtaXRlckxpbWl0KQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQgPSBtaXRlckxpbWl0Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0TGluZVdpZHRoKEZYX0ZMT0FUICYgbGluZVdpZHRoKQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBsaW5lV2lkdGggPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVXaWR0aChGWF9GTE9BVCBsaW5lV2lkdGgsIEZYX0JPT0wgaXNBY3RPbkRhc2ggKQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aAk9IGxpbmVXaWR0aDsNCisgICAgICAgICAgICAgICAgX2luZm8uX2lzQWN0T25EYXNoCQkJCT0gaXNBY3RPbkRhc2g7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRTdHJva2VBbGlnbm1lbnQoRlhfU3Ryb2tlQWxpZ25tZW50ICYgc3Ryb2tlQWxpZ25tZW50KQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBzdHJva2VBbGlnbm1lbnQgPSBfaW5mby5fc3Ryb2tlQWxpZ25tZW50Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0U3Ryb2tlQWxpZ25tZW50KEZYX1N0cm9rZUFsaWdubWVudCBzdHJva2VBbGlnbm1lbnQpDQorew0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9zdHJva2VBbGlnbm1lbnQgPSBzdHJva2VBbGlnbm1lbnQ7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRTdHJva2VDb2xvcihDRlhfQ29sb3IgKiBjb2xvcikNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChjb2xvciwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBfaW5mby5fc3Ryb2tlQ29sb3IgPSBjb2xvcjsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZpbGxDb2xvcihDRlhfQ29sb3IgKiBjb2xvcikNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChjb2xvciwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBfaW5mby5fZmlsbENvbG9yID0gY29sb3I7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJva2VQYXRoKENGWF9QYXRoICogcGF0aCwgQ0ZYX01hdHJpeCAqIG1hdHJpeCApDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlU3Ryb2tlUGF0aChwYXRoLCBtYXRyaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aChDRlhfUGF0aCAqICAgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSAgZmlsbE1vZGUJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgJKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGgsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbmRlckRldmljZUZpbGxQYXRoKHBhdGgsIGZpbGxNb2RlLCBtYXRyaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDbGlwUGF0aChDRlhfUGF0aCAqICAgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSAgZmlsbE1vZGUJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgJKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGgsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBhdGgtPkdldFBhdGhEYXRhKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlKTsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6RHJhd0ltYWdlKENGWF9ESUJTb3VyY2UgKgkgIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiAmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCSAgbWF0cml4ICkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzb3VyY2UsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbmRlckRldmljZURyYXdJbWFnZShzb3VyY2UsIHBvaW50LCBtYXRyaXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqCXNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGICYJcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCQltYXRyaXggKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZSwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKHNvdXJjZSwgcmVjdCwgbWF0cml4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6Q29uY2F0TWF0cml4KENGWF9NYXRyaXggKiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4LCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9DVE0uQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorQ0ZYX01hdHJpeCAqIENGWF9HcmFwaGljczo6R2V0TWF0cml4KCkNCit7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIE5VTEwpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gJl9pbmZvLl9DVE07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0Q2xpcFJlY3QoQ0ZYX1JlY3RGICYgcmVjdCkNCit7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgRlhfUkVDVCByID0gX3JlbmRlckRldmljZS0+R2V0Q2xpcEJveCgpOw0KKyAgICAgICAgICAgICAgICByZWN0LmxlZnQJPSAoRlhfRkxPQVQpIHIubGVmdDsNCisgICAgICAgICAgICAgICAgcmVjdC50b3AJPSAoRlhfRkxPQVQpIHIudG9wOw0KKyAgICAgICAgICAgICAgICByZWN0LndpZHRoCT0gKEZYX0ZMT0FUKSByLldpZHRoKCk7DQorICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0CT0gKEZYX0ZMT0FUKSByLkhlaWdodCgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCkNCit7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgRlhfUkVDVCByKEZYU1lTX3JvdW5kKHJlY3QubGVmdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0LnRvcCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0LnJpZ2h0KCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdC5ib3R0b20oKSkpOw0KKyAgICAgICAgICAgICAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPlNldENsaXBfUmVjdCgmcik7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDbGVhckNsaXAoKQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICBGWF9CT09MIHJlc3VsdCA9IEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRGb250KENGWF9Gb250ICogZm9udCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb250LCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9mb250ID0gZm9udDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZvbnRTaXplKGNvbnN0IEZYX0ZMT0FUIHNpemUpDQorew0KKyAgICBGWF9GTE9BVCBmb250U2l6ZSA9IHNpemUgPD0gMCA/IDEuMGYgOiBzaXplOw0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9mb250U2l6ZSA9IGZvbnRTaXplOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Rm9udEhTY2FsZShjb25zdCBGWF9GTE9BVCBzY2FsZSkNCit7DQorICAgIEZYX0ZMT0FUIGZvbnRIU2NhbGUgPSBzY2FsZSA8PSAwID8gMS4wZiA6IHNjYWxlOw0KKyAgICBzd2l0Y2ggKF90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9mb250SFNjYWxlID0gZm9udEhTY2FsZTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldENoYXJTcGFjaW5nKGNvbnN0IEZYX0ZMT0FUIHNwYWNpbmcpDQorew0KKyAgICBGWF9GTE9BVCBmb250U3BhY2luZyA9IHNwYWNpbmcgPCAwID8gMCA6IHNwYWNpbmc7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgX2luZm8uX2ZvbnRTcGFjaW5nID0gZm9udFNwYWNpbmc7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRUZXh0RHJhd2luZ01vZGUoY29uc3QgRlhfSU5UMzIgbW9kZSkNCit7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYgJgkgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJCSBtYXRyaXggKQ0KK3sNCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlU2hvd1RleHQocG9pbnQsIHRleHQsIG1hdHJpeCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNhbGNUZXh0UmVjdChDRlhfUmVjdEYgJgkJCSByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJCQkJIGlzTXVsdGlsaW5lICwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCQkJIG1hdHJpeAkJICkNCit7DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgKiBjaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbGVuZ3RoKTsNCisgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MgKiBjaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAqIHNpemVvZiAoRlhURVhUX0NIQVJQT1MpKTsNCisgICAgICAgICAgICAgICAgQ2FsY1RleHRJbmZvKHRleHQsIGNoYXJDb2RlcywgY2hhclBvcywgcmVjdCk7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUoY2hhclBvcyk7DQorICAgICAgICAgICAgICAgIEZYX0ZyZWUoY2hhckNvZGVzKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlRyYW5zZmVyKENGWF9HcmFwaGljcyAqIGdyYXBoaWNzLCBDRlhfTWF0cml4ICogbWF0cml4ICkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljcywgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgQ0ZYX01hdHJpeCBtOw0KKyAgICBtLlNldChfaW5mby5fQ1RNLmEsIF9pbmZvLl9DVE0uYiwgX2luZm8uX0NUTS5jLCBfaW5mby5fQ1RNLmQsIF9pbmZvLl9DVE0uZSwgX2luZm8uX0NUTS5mKTsNCisgICAgaWYgKG1hdHJpeCkgew0KKyAgICAgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgc3dpdGNoIChfdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZ3JhcGhpY3MtPl9yZW5kZXJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqIGJpdG1hcCA9IGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+U2V0RElCaXRzKGJpdG1hcCwgMCwgMCk7DQorICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlRyYW5zZmVyKENGWF9HcmFwaGljcyAqCWdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUCQkJc3JjTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVAkJCXNyY1RvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJglkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJbWF0cml4ICApDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZ3JhcGhpY3MsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIENGWF9NYXRyaXggbTsNCisgICAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsIF9pbmZvLl9DVE0uZik7DQorICAgIGlmIChtYXRyaXgpIHsNCisgICAgICAgIG0uQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKiBiaXRtYXAgPSBncmFwaGljcy0+X3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHJlc3VsdCA9IEZYX0VSUl9JbmRlZmluaXRlOw0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwIGJtcDsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJtcC5DcmVhdGUoKEZYX0lOVDMyKSBkc3RSZWN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfSU5UMzIpIGRzdFJlY3QuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPkdldEZvcm1hdCgpKTsNCisgICAgICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZCk7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBncmFwaGljcy0+X3JlbmRlckRldmljZS0+R2V0RElCaXRzKCZibXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfSU5UMzIpIHNyY0xlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfSU5UMzIpIHNyY1RvcCk7DQorICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+U2V0RElCaXRzKCZibXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSBkc3RSZWN0LmxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSBkc3RSZWN0LnRvcCk7DQorICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgICAgICAgICB9DQorICAgIH0NCit9DQorQ0ZYX1JlbmRlckRldmljZSAqIENGWF9HcmFwaGljczo6R2V0UmVuZGVyRGV2aWNlKCkNCit7DQorICAgIHJldHVybiBfcmVuZGVyRGV2aWNlOw0KK30NCitGWF9FUlIJQ0ZYX0dyYXBoaWNzOjpJbnZlcnNlUmVjdChjb25zdCBDRlhfUmVjdEYgJiByZWN0KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgQ0ZYX0RJQml0bWFwICogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChiaXRtYXAsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgQ0ZYX1JlY3RGIHRlbXAocmVjdCk7DQorICAgIF9pbmZvLl9DVE0uVHJhbnNmb3JtUmVjdCh0ZW1wKTsNCisgICAgQ0ZYX1JlY3RGIHI7DQorICAgIHIuU2V0KDAsIDAsIChGWF9GTE9BVCliaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVCliaXRtYXAtPkdldFdpZHRoKCkpOw0KKyAgICByLkludGVyc2VjdCh0ZW1wKTsNCisgICAgaWYgKHIuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KKyAgICB9DQorICAgIEZYX0FSR0IqIHBCdWYgPSAoRlhfQVJHQiopKGJpdG1hcC0+R2V0QnVmZmVyKCkgKyBGWF9JTlQzMihyLnRvcCkgKiBiaXRtYXAtPkdldFBpdGNoKCkpOw0KKyAgICBGWF9JTlQzMiBib3R0b20gPSAoRlhfSU5UMzIpci5ib3R0b20oKTsNCisgICAgRlhfSU5UMzIgcmlnaHQgPSAoRlhfSU5UMzIpci5yaWdodCgpOw0KKyAgICBmb3IgKEZYX0lOVDMyIGkgPSAoRlhfSU5UMzIpci50b3A7IGkgPCBib3R0b207IGkgKyspIHsNCisgICAgICAgIEZYX0FSR0IqIHBMaW5lID0gcEJ1ZiArIChGWF9JTlQzMilyLmxlZnQ7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAoRlhfSU5UMzIpci5sZWZ0OyBqIDwgcmlnaHQ7IGogKyspIHsNCisgICAgICAgICAgICBGWF9BUkdCIGMgPSAqcExpbmU7DQorICAgICAgICAgICAgKnBMaW5lICsrID0gKGMgJiAweEZGMDAwMDAwKSB8ICgweEZGRkZGRiAtIChjICYgMHgwMEZGRkZGRikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEJ1ZiA9IChGWF9BUkdCKikoKEZYX0xQQllURSlwQnVmICsgYml0bWFwLT5HZXRQaXRjaCgpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6WG9yRElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwICogc3JjQml0bWFwLCBjb25zdCBDRlhfUmVjdEYgJiByZWN0KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgQ0ZYX0RJQml0bWFwICogZHN0ID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkc3QsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgQ0ZYX1JlY3RGIHRlbXAocmVjdCk7DQorICAgIF9pbmZvLl9DVE0uVHJhbnNmb3JtUmVjdCh0ZW1wKTsNCisgICAgQ0ZYX1JlY3RGIHI7DQorICAgIHIuU2V0KDAsIDAsIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCksIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCkpOw0KKyAgICByLkludGVyc2VjdCh0ZW1wKTsNCisgICAgaWYgKHIuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KKyAgICB9DQorICAgIEZYX0FSR0IqIHBTcmNCdWYgPSAoRlhfQVJHQiopKHNyY0JpdG1hcC0+R2V0QnVmZmVyKCkgKyBGWF9JTlQzMihyLnRvcCkgKiBzcmNCaXRtYXAtPkdldFBpdGNoKCkpOw0KKyAgICBGWF9BUkdCKiBwRHN0QnVmID0gKEZYX0FSR0IqKShkc3QtPkdldEJ1ZmZlcigpICsgRlhfSU5UMzIoci50b3ApICogZHN0LT5HZXRQaXRjaCgpKTsNCisgICAgRlhfSU5UMzIgYm90dG9tID0gKEZYX0lOVDMyKXIuYm90dG9tKCk7DQorICAgIEZYX0lOVDMyIHJpZ2h0ID0gKEZYX0lOVDMyKXIucmlnaHQoKTsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gKEZYX0lOVDMyKXIudG9wOyBpIDwgYm90dG9tOyBpICsrKSB7DQorICAgICAgICBGWF9BUkdCKiBwU3JjTGluZSA9IHBTcmNCdWYgKyAoRlhfSU5UMzIpci5sZWZ0Ow0KKyAgICAgICAgRlhfQVJHQiogcERzdExpbmUgPSBwRHN0QnVmICsgKEZYX0lOVDMyKXIubGVmdDsNCisgICAgICAgIGZvciAoRlhfSU5UMzIgaiA9IChGWF9JTlQzMilyLmxlZnQ7IGogPCByaWdodDsgaiArKykgew0KKyAgICAgICAgICAgIEZYX0FSR0IgYyA9ICpwRHN0TGluZTsNCisgICAgICAgICAgICAqcERzdExpbmUgKysgPSBBcmdiRW5jb2RlKEZYQVJHQl9BKGMpLCAoYyAmIDB4RkZGRkZGKSBeICgqcFNyY0xpbmUgJiAweEZGRkZGRikpOw0KKyAgICAgICAgICAgIHBTcmNMaW5lICsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFNyY0J1ZiA9IChGWF9BUkdCKikoKEZYX0xQQllURSlwU3JjQnVmICsgc3JjQml0bWFwLT5HZXRQaXRjaCgpKTsNCisgICAgICAgIHBEc3RCdWYgPSAoRlhfQVJHQiopKChGWF9MUEJZVEUpcERzdEJ1ZiArIGRzdC0+R2V0UGl0Y2goKSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkVxdkRJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCAqIHNyY0JpdG1hcCwgY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIENGWF9ESUJpdG1hcCAqIGRzdCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZHN0LCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIENGWF9SZWN0RiB0ZW1wKHJlY3QpOw0KKyAgICBfaW5mby5fQ1RNLlRyYW5zZm9ybVJlY3QodGVtcCk7DQorICAgIENGWF9SZWN0RiByOw0KKyAgICByLlNldCgwLCAwLCAoRlhfRkxPQVQpZHN0LT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpZHN0LT5HZXRXaWR0aCgpKTsNCisgICAgci5JbnRlcnNlY3QodGVtcCk7DQorICAgIGlmIChyLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgICAgfQ0KKyAgICBGWF9BUkdCKiBwU3JjQnVmID0gKEZYX0FSR0IqKShzcmNCaXRtYXAtPkdldEJ1ZmZlcigpICsgRlhfSU5UMzIoci50b3ApICogc3JjQml0bWFwLT5HZXRQaXRjaCgpKTsNCisgICAgRlhfQVJHQiogcERzdEJ1ZiA9IChGWF9BUkdCKikoZHN0LT5HZXRCdWZmZXIoKSArIEZYX0lOVDMyKHIudG9wKSAqIGRzdC0+R2V0UGl0Y2goKSk7DQorICAgIEZYX0lOVDMyIGJvdHRvbSA9IChGWF9JTlQzMilyLmJvdHRvbSgpOw0KKyAgICBGWF9JTlQzMiByaWdodCA9IChGWF9JTlQzMilyLnJpZ2h0KCk7DQorICAgIGZvciAoRlhfSU5UMzIgaSA9IChGWF9JTlQzMilyLnRvcDsgaSA8IGJvdHRvbTsgaSArKykgew0KKyAgICAgICAgRlhfQVJHQiogcFNyY0xpbmUgPSBwU3JjQnVmICsgKEZYX0lOVDMyKXIubGVmdDsNCisgICAgICAgIEZYX0FSR0IqIHBEc3RMaW5lID0gcERzdEJ1ZiArIChGWF9JTlQzMilyLmxlZnQ7DQorICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAoRlhfSU5UMzIpci5sZWZ0OyBqIDwgcmlnaHQ7IGogKyspIHsNCisgICAgICAgICAgICBGWF9BUkdCIGMgPSAqcERzdExpbmU7DQorICAgICAgICAgICAgKnBEc3RMaW5lICsrID0gQXJnYkVuY29kZShGWEFSR0JfQShjKSwgfigoYyAmIDB4RkZGRkZGKSBeICgqcFNyY0xpbmUgJiAweEZGRkZGRikpKTsNCisgICAgICAgICAgICBwU3JjTGluZSArKzsNCisgICAgICAgIH0NCisgICAgICAgIHBTcmNCdWYgPSAoRlhfQVJHQiopKChGWF9MUEJZVEUpcFNyY0J1ZiArIHNyY0JpdG1hcC0+R2V0UGl0Y2goKSk7DQorICAgICAgICBwRHN0QnVmID0gKEZYX0FSR0IqKSgoRlhfTFBCWVRFKXBEc3RCdWYgKyBkc3QtPkdldFBpdGNoKCkpOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VTZXRMaW5lRGFzaChGWF9EYXNoU3R5bGUgZGFzaFN0eWxlKQ0KK3sNCisgICAgc3dpdGNoIChkYXNoU3R5bGUpIHsNCisgICAgICAgIGNhc2UgRlhfREFTSFNUWUxFX1NvbGlkOiB7DQorICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudCgwKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGWF9EQVNIU1RZTEVfRGFzaDogew0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHszLCAxfTsNCisgICAgICAgICAgICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCAyKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGWF9EQVNIU1RZTEVfRG90OiB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezEsIDF9Ow0KKyAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90OiB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezMsIDEsIDEsIDF9Ow0KKyAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90OiB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDEsIDIsIDF9Ow0KKyAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDYpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZVN0cm9rZVBhdGgoQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9pbmZvLl9zdHJva2VDb2xvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICBDRlhfTWF0cml4IG07DQorICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KKyAgICBpZiAobWF0cml4KSB7DQorICAgICAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKF9pbmZvLl9zdHJva2VDb2xvci0+X3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfQ09MT1JfU29saWQ6IHsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5EcmF3UGF0aChwYXRoLT5HZXRQYXRoRGF0YSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW5mby5fZ3JhcGhTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yLT5fYXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZYX0NPTE9SX1BhdHRlcm46IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cm9rZVBhdGhXaXRoUGF0dGVybihwYXRoLCAmbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGWF9DT0xPUl9TaGFkaW5nOiB7DQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJva2VQYXRoV2l0aFNoYWRpbmcocGF0aCwgJm0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VGaWxsUGF0aChDRlhfUGF0aCAqICAgcGF0aCwNCisgICAgICAgIEZYX0ZpbGxNb2RlICBmaWxsTW9kZSwNCisgICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2luZm8uX2ZpbGxDb2xvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICBDRlhfTWF0cml4IG07DQorICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KKyAgICBpZiAobWF0cml4KSB7DQorICAgICAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl90eXBlKSB7DQorICAgICAgICBjYXNlIEZYX0NPTE9SX1NvbGlkOiB7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+RHJhd1BhdGgocGF0aC0+R2V0UGF0aERhdGEoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2luZm8uX2dyYXBoU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm8uX2ZpbGxDb2xvci0+X2FyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlKTsNCisgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZYX0NPTE9SX1BhdHRlcm46IHsNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxQYXRoV2l0aFBhdHRlcm4ocGF0aCwgZmlsbE1vZGUsICZtKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRlhfQ09MT1JfU2hhZGluZzogew0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFBhdGhXaXRoU2hhZGluZyhwYXRoLCBmaWxsTW9kZSwgJm0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZURyYXdJbWFnZShDRlhfRElCU291cmNlICoJICBzb3VyY2UsDQorICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYgcG9pbnQsDQorICAgICAgICBDRlhfTWF0cml4ICoJCSAgbWF0cml4KQ0KK3sNCisgICAgQ0ZYX01hdHJpeCBtMTsNCisgICAgbTEuU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KKyAgICBpZiAobWF0cml4KSB7DQorICAgICAgICBtMS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtMjsNCisgICAgbTIuU2V0KChGWF9GTE9BVCkgc291cmNlLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgMC4wLA0KKyAgICAgICAgICAgMC4wLA0KKyAgICAgICAgICAgKEZYX0ZMT0FUKSBzb3VyY2UtPkdldEhlaWdodCgpLA0KKyAgICAgICAgICAgcG9pbnQueCwNCisgICAgICAgICAgIHBvaW50LnkpOw0KKyAgICBtMi5Db25jYXQobTEpOw0KKyAgICBGWF9JTlQzMiBsZWZ0LCB0b3A7DQorICAgIENGWF9ESUJpdG1hcCAqIGJtcDEgPSBzb3VyY2UtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7DQorICAgIENGWF9ESUJpdG1hcCAqIGJtcDIgPSBibXAxLT5UcmFuc2Zvcm1UbygoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmbTIsIGxlZnQsIHRvcCk7DQorICAgIENGWF9SZWN0RiByOw0KKyAgICBHZXRDbGlwUmVjdChyKTsNCisgICAgRlhfRVJSIHJlc3VsdCA9IEZYX0VSUl9JbmRlZmluaXRlOw0KKyAgICB7DQorICAgICAgICBDRlhfRElCaXRtYXAgKiBiaXRtYXAgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgICAgIENGWF9ESUJpdG1hcCBibXA7DQorICAgICAgICBibXAuQ3JlYXRlKGJpdG1hcC0+R2V0V2lkdGgoKSwgYml0bWFwLT5HZXRIZWlnaHQoKSwgRlhESUJfQXJnYik7DQorICAgICAgICBfcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoJmJtcCwgMCwgMCk7DQorICAgICAgICBibXAuVHJhbnNmZXJCaXRtYXAoRlhTWVNfcm91bmQoci5sZWZ0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLnRvcCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5XaWR0aCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLkhlaWdodCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBibXAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIubGVmdCAtIGxlZnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIudG9wIC0gdG9wKSk7DQorICAgICAgICBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoJmJtcCwgMCwgMCk7DQorICAgICAgICByZXN1bHQgPSBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGlmIChibXAyKSB7DQorICAgICAgICBkZWxldGUgYm1wMjsNCisgICAgICAgIGJtcDIgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChibXAxKSB7DQorICAgICAgICBkZWxldGUgYm1wMTsNCisgICAgICAgIGJtcDEgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZVN0cmV0Y2hJbWFnZShDRlhfRElCU291cmNlICoJc291cmNlLA0KKyAgICAgICAgY29uc3QgQ0ZYX1JlY3RGICYJcmVjdCwNCisgICAgICAgIENGWF9NYXRyaXggKgkJbWF0cml4KQ0KK3sNCisgICAgQ0ZYX01hdHJpeCBtMTsNCisgICAgbTEuU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KKyAgICBpZiAobWF0cml4KSB7DQorICAgICAgICBtMS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgQ0ZYX0RJQml0bWFwICogYm1wMSA9IHNvdXJjZS0+U3RyZXRjaFRvKChGWF9JTlQzMikgcmVjdC5XaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0lOVDMyKSByZWN0LkhlaWdodCgpKTsNCisgICAgQ0ZYX01hdHJpeCBtMjsNCisgICAgbTIuU2V0KHJlY3QuV2lkdGgoKSwgMC4wLCAwLjAsIHJlY3QuSGVpZ2h0KCksIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICBtMi5Db25jYXQobTEpOw0KKyAgICBGWF9JTlQzMiBsZWZ0LCB0b3A7DQorICAgIENGWF9ESUJpdG1hcCAqIGJtcDIgPSBibXAxLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOw0KKyAgICBDRlhfRElCaXRtYXAgKiBibXAzID0gYm1wMi0+VHJhbnNmb3JtVG8oKENGWF9BZmZpbmVNYXRyaXggKikgJm0yLCBsZWZ0LCB0b3ApOw0KKyAgICBDRlhfUmVjdEYgcjsNCisgICAgR2V0Q2xpcFJlY3Qocik7DQorICAgIEZYX0VSUiByZXN1bHQgPSBGWF9FUlJfSW5kZWZpbml0ZTsNCisgICAgew0KKyAgICAgICAgQ0ZYX0RJQml0bWFwICogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgICAgICBiaXRtYXAtPkNvbXBvc2l0ZUJpdG1hcChGWFNZU19yb3VuZChyLmxlZnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci50b3ApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5XaWR0aCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIuSGVpZ2h0KCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIubGVmdCAtIGxlZnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci50b3AgLSB0b3ApKTsNCisgICAgICAgIHJlc3VsdCA9IEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgaWYgKGJtcDMpIHsNCisgICAgICAgIGRlbGV0ZSBibXAzOw0KKyAgICAgICAgYm1wMyA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKGJtcDIpIHsNCisgICAgICAgIGRlbGV0ZSBibXAyOw0KKyAgICAgICAgYm1wMiA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKGJtcDEpIHsNCisgICAgICAgIGRlbGV0ZSBibXAxOw0KKyAgICAgICAgYm1wMSA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU2hvd1RleHQoY29uc3QgQ0ZYX1BvaW50RiAmCSBwb2ludCwNCisgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdGV4dCwNCisgICAgICAgIENGWF9NYXRyaXggKgkJCSBtYXRyaXgpDQorew0KKyAgICBGWF9JTlQzMiBsZW5ndGggPSB0ZXh0LkdldExlbmd0aCgpOw0KKyAgICBGWF9EV09SRCAqIGNoYXJDb2RlcyA9IEZYX0FsbG9jKEZYX0RXT1JELCBsZW5ndGgpOw0KKyAgICBGWFRFWFRfQ0hBUlBPUyAqIGNoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICogc2l6ZW9mIChGWFRFWFRfQ0hBUlBPUykpOw0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgcmVjdC5TZXQocG9pbnQueCwgcG9pbnQueSwgMCwgMCk7DQorICAgIENhbGNUZXh0SW5mbyh0ZXh0LCBjaGFyQ29kZXMsIGNoYXJQb3MsIHJlY3QpOw0KKyAgICBDRlhfTWF0cml4IG07DQorICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KKyAgICBtLlRyYW5zbGF0ZSgwLCBfaW5mby5fZm9udFNpemUgKiBfaW5mby5fZm9udEhTY2FsZSk7DQorICAgIGlmIChtYXRyaXgpIHsNCisgICAgICAgIG0uQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+RHJhd05vcm1hbFRleHQobGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgIGNoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgX2luZm8uX2ZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgLV9pbmZvLl9mb250U2l6ZSAqIF9pbmZvLl9mb250SFNjYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZtLA0KKyAgICAgICAgICAgICAgICAgICAgIF9pbmZvLl9maWxsQ29sb3ItPl9hcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIEZYX0ZyZWUoY2hhclBvcyk7DQorICAgIEZYX0ZyZWUoY2hhckNvZGVzKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlN0cm9rZVBhdGhXaXRoUGF0dGVybihDRlhfUGF0aCAqIHBhdGgsIENGWF9NYXRyaXggKiBtYXRyaXgpDQorew0KKyAgICByZXR1cm4gRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkOw0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJva2VQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4KQ0KK3sNCisgICAgcmV0dXJuIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6RmlsbFBhdGhXaXRoUGF0dGVybihDRlhfUGF0aCAqICAgcGF0aCwNCisgICAgICAgIEZYX0ZpbGxNb2RlICBmaWxsTW9kZSwNCisgICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgpDQorew0KKyAgICBDRlhfUGF0dGVybiAqIHBhdHRlcm4gPSBfaW5mby5fZmlsbENvbG9yLT5fcGF0dGVybjsNCisgICAgQ0ZYX0RJQml0bWFwICogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgIEZYX0lOVDMyIHdpZHRoCT0gYml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgICBGWF9JTlQzMiBoZWlnaHQJPSBiaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgICBDRlhfRElCaXRtYXAgYm1wOw0KKyAgICBibXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgICBfcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoJmJtcCwgMCwgMCk7DQorICAgIHN3aXRjaCAocGF0dGVybi0+X3R5cGUpIHsNCisgICAgICAgIGNhc2UgRlhfUEFUVEVSTl9CaXRtYXA6IHsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgeFN0ZXAgPSBGWFNZU19yb3VuZChwYXR0ZXJuLT5feDFTdGVwKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgeVN0ZXAgPSBGWFNZU19yb3VuZChwYXR0ZXJuLT5feTFTdGVwKTsNCisgICAgICAgICAgICAgICAgRlhfSU5UMzIgeENvdW50CT0gd2lkdGggLyB4U3RlcCArIDE7DQorICAgICAgICAgICAgICAgIEZYX0lOVDMyIHlDb3VudAk9IGhlaWdodCAvIHlTdGVwICsgMTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8PSB5Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gMDsgaiA8PSB4Q291bnQ7IGorKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJtcC5UcmFuc2ZlckJpdG1hcChqICogeFN0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiB5U3RlcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFN0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTdGVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5fYml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZYX1BBVFRFUk5fSGF0Y2g6IHsNCisgICAgICAgICAgICAgICAgRlhfSGF0Y2hTdHlsZSBoYXRjaFN0eWxlID0gX2luZm8uX2ZpbGxDb2xvci0+X3BhdHRlcm4tPl9oYXRjaFN0eWxlOw0KKyAgICAgICAgICAgICAgICBpZiAoaGF0Y2hTdHlsZSA8IEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbCB8fCBoYXRjaFN0eWxlID4gRlhfSEFUQ0hTVFlMRV9Tb2xpZERpYW1vbmQpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfSW50ZXJtZWRpYXRlX1ZhbHVlX0ludmFsaWQ7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29uc3QgRlhfSEFUQ0hEQVRBICYgZGF0YSA9IGhhdGNoQml0bWFwRGF0YVtoYXRjaFN0eWxlXTsNCisgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwIG1hc2s7DQorICAgICAgICAgICAgICAgIG1hc2suQ3JlYXRlKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBGWERJQl8xYnBwTWFzayk7DQorICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShtYXNrLkdldEJ1ZmZlcigpLCBkYXRhLm1hc2tCaXRzLCBtYXNrLkdldFBpdGNoKCkgKiBkYXRhLmhlaWdodCk7DQorICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdGYgPSBwYXRoLT5HZXRQYXRoRGF0YSgpLT5HZXRCb3VuZGluZ0JveCgpOw0KKyAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB7DQorICAgICAgICAgICAgICAgICAgICByZWN0Zi5UcmFuc2Zvcm0oKGNvbnN0IENGWF9BZmZpbmVNYXRyaXggKikgbWF0cml4KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3QoRlhTWVNfcm91bmQocmVjdGYubGVmdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi50b3ApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYucmlnaHQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYuYm90dG9tKSk7DQorICAgICAgICAgICAgICAgIENGWF9GeGdlRGV2aWNlIGRldmljZTsNCisgICAgICAgICAgICAgICAgZGV2aWNlLkF0dGFjaCgmYm1wKTsNCisgICAgICAgICAgICAgICAgZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCBfaW5mby5fZmlsbENvbG9yLT5fcGF0dGVybi0+X2JhY2tBcmdiKTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBqID0gcmVjdC5ib3R0b207IGogPCByZWN0LnRvcDsgaiArPSBtYXNrLkdldEhlaWdodCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSByZWN0LmxlZnQ7IGkgPCByZWN0LnJpZ2h0OyBpICs9IG1hc2suR2V0V2lkdGgoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5TZXRCaXRNYXNrKCZtYXNrLCBpLCBqLCBfaW5mby5fZmlsbENvbG9yLT5fcGF0dGVybi0+X2ZvcmVBcmdiKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgIH0NCisgICAgX3JlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7DQorICAgIF9yZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocGF0aC0+R2V0UGF0aERhdGEoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUpOw0KKyAgICBTZXRESUJpdHNXaXRoTWF0cml4KCZibXAsICZwYXR0ZXJuLT5fbWF0cml4KTsNCisgICAgX3JlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoICogICBwYXRoLA0KKyAgICAgICAgRlhfRmlsbE1vZGUgIGZpbGxNb2RlLA0KKyAgICAgICAgQ0ZYX01hdHJpeCAqIG1hdHJpeCkNCit7DQorICAgIENGWF9ESUJpdG1hcCAqIGJpdG1hcCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgICBGWF9JTlQzMiB3aWR0aAk9IGJpdG1hcC0+R2V0V2lkdGgoKTsNCisgICAgRlhfSU5UMzIgaGVpZ2h0CT0gYml0bWFwLT5HZXRIZWlnaHQoKTsNCisgICAgRlhfRkxPQVQgc3RhcnRfeCA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYmVnaW5Qb2ludC54Ow0KKyAgICBGWF9GTE9BVCBzdGFydF95ID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9iZWdpblBvaW50Lnk7DQorICAgIEZYX0ZMT0FUIGVuZF94ID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9lbmRQb2ludC54Ow0KKyAgICBGWF9GTE9BVCBlbmRfeSA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fZW5kUG9pbnQueTsNCisgICAgQ0ZYX0RJQml0bWFwIGJtcDsNCisgICAgYm1wLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgX3JlbmRlckRldmljZS0+R2V0RElCaXRzKCZibXAsIDAsIDApOw0KKyAgICBGWF9JTlQzMiBwaXRjaAk9IGJtcC5HZXRQaXRjaCgpOw0KKyAgICBGWF9CT09MIHJlc3VsdCA9IEZBTFNFOw0KKyAgICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fdHlwZSkgew0KKyAgICAgICAgY2FzZSBGWF9TSEFESU5HX0F4aWFsOiB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfc3BhbiA9IGVuZF94IC0gc3RhcnRfeDsNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgeV9zcGFuID0gZW5kX3kgLSBzdGFydF95Ow0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBheGlzX2xlbl9zcXVhcmUgPSBGWFNZU19NdWwoeF9zcGFuLCB4X3NwYW4pICsgRlhTWVNfTXVsKHlfc3BhbiwgeV9zcGFuKTsNCisgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCAqIGRpYl9idWYgPSAoRlhfRFdPUkQgKikgKGJtcC5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCkoY29sdW1uKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5ID0gKEZYX0ZMT0FUKShyb3cpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNjYWxlID0gRlhTWVNfRGl2KEZYU1lTX011bCh4IC0gc3RhcnRfeCwgeF9zcGFuKSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgeV9zcGFuKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzX2xlbl9zcXVhcmUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZSA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRCZWdpbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiAxLjBmKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9pc0V4dGVuZGVkRW5kKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IDEuMGY7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gKEZYX0lOVDMyKShzY2FsZSAqIChGWF9TSEFESU5HX1N0ZXBzIC0gMSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYl9idWZbY29sdW1uXSA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYXJnYkFycmF5W2luZGV4XTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBjYXNlIEZYX1NIQURJTkdfUmFkaWFsOiB7DQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2JlZ2luUmFkaXVzOw0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfciA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fZW5kUmFkaXVzOw0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBhID0gRlhTWVNfTXVsKHN0YXJ0X3ggLSBlbmRfeCwgc3RhcnRfeCAtIGVuZF94KSArIEZYU1lTX011bChzdGFydF95IC0gZW5kX3ksIHN0YXJ0X3kgLSBlbmRfeSkgLSBGWFNZU19NdWwoc3RhcnRfciAtIGVuZF9yLCBzdGFydF9yIC0gZW5kX3IpOw0KKyAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEICogZGliX2J1ZiA9IChGWF9EV09SRCAqKSAoYm1wLkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKShjb2x1bW4pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkgPSAoRlhfRkxPQVQpKHJvdyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgZW5kX3kgLSBzdGFydF95KSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBlbmRfciAtIHN0YXJ0X3IpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjID0gRlhTWVNfTXVsKHggLSBzdGFydF94LCB4IC0gc3RhcnRfeCkgKyBGWFNZU19NdWwoeSAtIHN0YXJ0X3ksIHkgLSBzdGFydF95KSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBzdGFydF9yKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IChGWFNZU19EaXYoLWMsIGIpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiMl80YWMgPSBGWFNZU19NdWwoYiwgYikgLSA0ICogRlhTWVNfTXVsKGEsIGMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYjJfNGFjIDwgMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcm9vdCA9IChGWFNZU19zcXJ0KGIyXzRhYykpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzMSwgczI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBGWFNZU19EaXYoLWIgLSByb290LCAyICogYSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMiA9IEZYU1lTX0RpdigtYiArIHJvb3QsIDIgKiBhKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBGWFNZU19EaXYoLWIgKyByb290LCAyICogYSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyIDw9IDEuMGYgfHwgX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9pc0V4dGVuZGVkRW5kKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gKHMyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAoczEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnRfcikgKyBzICogKGVuZF9yIC0gc3RhcnRfcikgPCAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA8IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRCZWdpbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID4gMS4wZikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEVuZCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDEuMGY7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IChGWF9JTlQzMikocyAqIChGWF9TSEFESU5HX1N0ZXBzIC0gMSkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYl9idWZbY29sdW1uXSA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYXJnYkFycmF5W2luZGV4XTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocmVzdWx0KSB7DQorICAgICAgICBfcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgICAgICAgIF9yZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocGF0aC0+R2V0UGF0aERhdGEoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsTW9kZSk7DQorICAgICAgICBTZXRESUJpdHNXaXRoTWF0cml4KCZibXAsIG1hdHJpeCk7DQorICAgICAgICBfcmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRESUJpdHNXaXRoTWF0cml4KENGWF9ESUJTb3VyY2UgKiBzb3VyY2UsIENGWF9NYXRyaXggKiBtYXRyaXgpDQorew0KKyAgICBpZiAobWF0cml4LT5Jc0lkZW50aXR5KCkpIHsNCisgICAgICAgIF9yZW5kZXJEZXZpY2UtPlNldERJQml0cyhzb3VyY2UsIDAsIDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX01hdHJpeCBtOw0KKyAgICAgICAgbS5TZXQoKEZYX0ZMT0FUKXNvdXJjZS0+R2V0V2lkdGgoKSwgMCwgMCwgKEZYX0ZMT0FUKXNvdXJjZS0+R2V0SGVpZ2h0KCksIDAsIDApOw0KKyAgICAgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgICBGWF9JTlQzMiBsZWZ0LCB0b3A7DQorICAgICAgICBDRlhfRElCaXRtYXAgKiBibXAxID0gc291cmNlLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwICogYm1wMiA9IGJtcDEtPlRyYW5zZm9ybVRvKChDRlhfQWZmaW5lTWF0cml4ICopICZtLCBsZWZ0LCB0b3ApOw0KKyAgICAgICAgX3JlbmRlckRldmljZS0+U2V0RElCaXRzKGJtcDIsIGxlZnQsIHRvcCk7DQorICAgICAgICBpZiAoYm1wMikgew0KKyAgICAgICAgICAgIGRlbGV0ZSBibXAyOw0KKyAgICAgICAgICAgIGJtcDIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJtcDEpIHsNCisgICAgICAgICAgICBkZWxldGUgYm1wMTsNCisgICAgICAgICAgICBibXAxID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6Q2FsY1RleHRJbmZvKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdGV4dCwgRlhfRFdPUkQgKiBjaGFyQ29kZXMsIEZYVEVYVF9DSEFSUE9TICogY2hhclBvcywgQ0ZYX1JlY3RGICYgcmVjdCkNCit7DQorICAgIElGWF9Gb250RW5jb2RpbmcgKiBlbmNvZGluZyA9IEZYR0VfQ3JlYXRlVW5pY29kZUVuY29kaW5nKF9pbmZvLl9mb250KTsNCisgICAgRlhfSU5UMzIgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgICAgRlhfRkxPQVQgcGVuWCA9IChGWF9GTE9BVCkgcmVjdC5sZWZ0Ow0KKyAgICBGWF9GTE9BVCBwZW5ZID0gKEZYX0ZMT0FUKSByZWN0LnRvcDsNCisgICAgRlhfRkxPQVQgbGVmdCA9IChGWF9GTE9BVCkoMCk7DQorICAgIEZYX0ZMT0FUIHRvcAkgPSAoRlhfRkxPQVQpKDApOw0KKyAgICBjaGFyQ29kZXNbMF0gPSB0ZXh0LkdldEF0KDApOw0KKyAgICBjaGFyUG9zWzBdLm1fT3JpZ2luWCA9IHBlblggKyBsZWZ0Ow0KKyAgICBjaGFyUG9zWzBdLm1fT3JpZ2luWSA9IHBlblkgKyB0b3A7DQorICAgIGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1swXSk7DQorICAgIGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoID0gRlhTWVNfcm91bmQoX2luZm8uX2ZvbnQtPkdldEdseXBoV2lkdGgoY2hhclBvc1swXS5tX0dseXBoSW5kZXgpICogX2luZm8uX2ZvbnRIU2NhbGUpOw0KKyAgICBjaGFyUG9zWzBdLm1fYkdseXBoQWRqdXN0ID0gVFJVRTsNCisgICAgY2hhclBvc1swXS5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICBjaGFyUG9zWzBdLm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgY2hhclBvc1swXS5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgIGNoYXJQb3NbMF0ubV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICBwZW5YICs9IChGWF9GTE9BVCkoY2hhclBvc1swXS5tX0ZvbnRDaGFyV2lkdGgpICogX2luZm8uX2ZvbnRTaXplIC8gMTAwMCArIF9pbmZvLl9mb250U3BhY2luZzsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7DQorICAgICAgICBjaGFyQ29kZXNbaV0gPSB0ZXh0LkdldEF0KGkpOw0KKyAgICAgICAgY2hhclBvc1tpXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCisgICAgICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCisgICAgICAgIGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1tpXSk7DQorICAgICAgICBjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCA9IEZYU1lTX3JvdW5kKF9pbmZvLl9mb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4KSAqIF9pbmZvLl9mb250SFNjYWxlKTsNCisgICAgICAgIGNoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KKyAgICAgICAgY2hhclBvc1tpXS5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICAgICAgY2hhclBvc1tpXS5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICBjaGFyUG9zW2ldLm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgIGNoYXJQb3NbaV0ubV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICAgICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoKSAqIF9pbmZvLl9mb250U2l6ZSAvIDEwMDAgKyBfaW5mby5fZm9udFNwYWNpbmc7DQorICAgIH0NCisgICAgcmVjdC53aWR0aAk9IChGWF9GTE9BVCkgcGVuWCAtIHJlY3QubGVmdDsNCisgICAgcmVjdC5oZWlnaHQJPSByZWN0LnRvcCArIF9pbmZvLl9mb250U2l6ZSAqIF9pbmZvLl9mb250SFNjYWxlIC0gcmVjdC50b3A7DQorICAgIGRlbGV0ZSBlbmNvZGluZzsNCisgICAgZW5jb2RpbmcgPSBOVUxMOw0KKyAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0FHR19HcmFwaGljczo6Q0FHR19HcmFwaGljcygpDQorew0KKyAgICBfb3duZXIgPSBOVUxMOw0KK30NCitGWF9FUlIgQ0FHR19HcmFwaGljczo6Q3JlYXRlKENGWF9HcmFwaGljcyAqIG93bmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgICAgICAgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiAgICAgICBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgICBmb3JtYXQpDQorew0KKyAgICBpZiAob3duZXItPl9yZW5kZXJEZXZpY2UpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICAgIH0NCisgICAgaWYgKF9vd25lcikgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICB9DQorICAgIENGWF9GeGdlRGV2aWNlICogZGV2aWNlID0gRlhfTkVXIENGWF9GeGdlRGV2aWNlOw0KKyAgICBkZXZpY2UtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOw0KKyAgICBfb3duZXIgPSBvd25lcjsNCisgICAgX293bmVyLT5fcmVuZGVyRGV2aWNlID0gZGV2aWNlOw0KKyAgICBfb3duZXItPl9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpLT5DbGVhcigweEZGRkZGRkZGKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NBR0dfR3JhcGhpY3M6On5DQUdHX0dyYXBoaWNzKCkNCit7DQorICAgIGlmIChfb3duZXItPl9yZW5kZXJEZXZpY2UpIHsNCisgICAgICAgIGRlbGV0ZSAoQ0ZYX0Z4Z2VEZXZpY2UgKikgX293bmVyLT5fcmVuZGVyRGV2aWNlOw0KKyAgICB9DQorICAgIF9vd25lciA9IE5VTEw7DQorfQ0KK0NGWF9QYXRoOjpDRlhfUGF0aCgpDQorew0KKyAgICBfZ2VuZXJhdG9yID0gTlVMTDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpDcmVhdGUoKQ0KK3sNCisgICAgaWYgKF9nZW5lcmF0b3IpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgfQ0KKyAgICBfZ2VuZXJhdG9yID0gRlhfTkVXIENGWF9QYXRoR2VuZXJhdG9yOw0KKyAgICBfZ2VuZXJhdG9yLT5DcmVhdGUoKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGWF9QYXRoOjp+Q0ZYX1BhdGgoKQ0KK3sNCisgICAgaWYgKF9nZW5lcmF0b3IpIHsNCisgICAgICAgIGRlbGV0ZSBfZ2VuZXJhdG9yOw0KKyAgICAgICAgX2dlbmVyYXRvciA9IE5VTEw7DQorICAgIH0NCit9DQorRlhfRVJSIENGWF9QYXRoOjpNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPk1vdmVUbyh4LCB5KTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6TGluZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICBfZ2VuZXJhdG9yLT5MaW5lVG8oeCwgeSk7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkJlemllclRvKEZYX0ZMT0FUIGN0cmxYMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxYMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvWSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkJlemllclRvKGN0cmxYMSwgY3RybFkxLCBjdHJsWDIsIGN0cmxZMiwgdG9YLCB0b1kpOw0KKyAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBcmNUbyhGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkFyY1RvKGxlZnQgKyB3aWR0aCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgIHRvcCArIGhlaWdodCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC8gMiwNCisgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC8gMiwNCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgc3dlZXBBbmdsZSk7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkNsb3NlKCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkNsb3NlKCk7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZExpbmUoRlhfRkxPQVQgeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICBfZ2VuZXJhdG9yLT5BZGRMaW5lKHgxLCB5MSwgeDIsIHkyKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6QWRkQmV6aWVyKEZYX0ZMT0FUIHN0YXJ0WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydFksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZFgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kWSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkFkZEJlemllcihzdGFydFgsIHN0YXJ0WSwgY3RybFgxLCBjdHJsWTEsIGN0cmxYMiwgY3RybFkyLCBlbmRYLCBlbmRZKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6QWRkUmVjdGFuZ2xlKEZYX0ZMT0FUIGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkFkZFJlY3RhbmdsZShsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6QWRkRWxsaXBzZShGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICBfZ2VuZXJhdG9yLT5BZGRFbGxpcHNlKGxlZnQgKyB3aWR0aCAvIDIsIHRvcCArIGhlaWdodCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkFkZEVsbGlwc2UocmVjdC5sZWZ0ICsgcmVjdC5XaWR0aCgpIC8gMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCArIHJlY3QuSGVpZ2h0KCkgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuV2lkdGgoKSAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5IZWlnaHQoKSAvIDIpOw0KKyAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBZGRBcmMoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgIF9nZW5lcmF0b3ItPkFkZEFyYyhsZWZ0ICsgd2lkdGggLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgaGVpZ2h0IC8gMiwNCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC8gMiwNCisgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgc3dlZXBBbmdsZSk7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZFBpZShGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgX2dlbmVyYXRvci0+QWRkUGllKGxlZnQgKyB3aWR0aCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBoZWlnaHQgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC8gMiwNCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICBzd2VlcEFuZ2xlKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6QWRkU3VicGF0aChDRlhfUGF0aCAqIHBhdGgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICBfZ2VuZXJhdG9yLT5BZGRQYXRoRGF0YShwYXRoLT5HZXRQYXRoRGF0YSgpKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6Q2xlYXIoKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgX2dlbmVyYXRvci0+R2V0UGF0aERhdGEoKS0+U2V0UG9pbnRDb3VudCgwKTsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1BhdGg6OklzRW1wdHkoKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgaWYgKF9nZW5lcmF0b3ItPkdldFBhdGhEYXRhKCktPkdldFBvaW50Q291bnQoKSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorfQ0KK0NGWF9QYXRoRGF0YSAqIENGWF9QYXRoOjpHZXRQYXRoRGF0YSgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgTlVMTCk7DQorICAgIHJldHVybiBfZ2VuZXJhdG9yLT5HZXRQYXRoRGF0YSgpOw0KK30NCitDRlhfQ29sb3I6OkNGWF9Db2xvcigpDQorew0KKyAgICBfdHlwZSA9IEZYX0NPTE9SX05vbmU7DQorfQ0KK0NGWF9Db2xvcjo6Q0ZYX0NvbG9yKGNvbnN0IEZYX0FSR0IgYXJnYikNCit7DQorICAgIF90eXBlID0gRlhfQ09MT1JfTm9uZTsNCisgICAgU2V0KGFyZ2IpOw0KK30NCitDRlhfQ29sb3I6OkNGWF9Db2xvcihDRlhfUGF0dGVybiAqIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYiApDQorew0KKyAgICBfdHlwZSA9IEZYX0NPTE9SX05vbmU7DQorICAgIFNldChwYXR0ZXJuLCBhcmdiKTsNCit9DQorQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoQ0ZYX1NoYWRpbmcgKiBzaGFkaW5nKQ0KK3sNCisgICAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KKyAgICBTZXQoc2hhZGluZyk7DQorfQ0KK0NGWF9Db2xvcjo6fkNGWF9Db2xvcigpDQorew0KKyAgICBfdHlwZSA9IEZYX0NPTE9SX05vbmU7DQorfQ0KK0ZYX0VSUiBDRlhfQ29sb3I6OlNldChjb25zdCBGWF9BUkdCIGFyZ2IpDQorew0KKyAgICBfdHlwZQkJPSBGWF9DT0xPUl9Tb2xpZDsNCisgICAgX2FyZ2IJCT0gYXJnYjsNCisgICAgX3BhdHRlcm4JPSBOVUxMOw0KKyAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9Db2xvcjo6U2V0KENGWF9QYXR0ZXJuICogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiICkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXR0ZXJuLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgICBfdHlwZQkJPSBGWF9DT0xPUl9QYXR0ZXJuOw0KKyAgICBfYXJnYgkJPSBhcmdiOw0KKyAgICBfcGF0dGVybgk9IHBhdHRlcm47DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX0NvbG9yOjpTZXQoQ0ZYX1NoYWRpbmcgKiBzaGFkaW5nKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNoYWRpbmcsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIF90eXBlCQk9IEZYX0NPTE9SX1NoYWRpbmc7DQorICAgIF9zaGFkaW5nCT0gc2hhZGluZzsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGWF9QYXR0ZXJuOjpDRlhfUGF0dGVybigpDQorew0KKyAgICBfdHlwZSA9IEZYX1BBVFRFUk5fTm9uZTsNCisgICAgX21hdHJpeC5SZXNldCgpOw0KK30NCitGWF9FUlIgQ0ZYX1BhdHRlcm46OkNyZWF0ZShDRlhfRElCaXRtYXAgKiBiaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgeFN0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgeVN0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSAgbWF0cml4ICkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChiaXRtYXAsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgIGlmIChfdHlwZSAhPSBGWF9QQVRURVJOX05vbmUpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgfQ0KKyAgICBfdHlwZSA9IEZYX1BBVFRFUk5fQml0bWFwOw0KKyAgICBfYml0bWFwCT0gYml0bWFwOw0KKyAgICBfeDFTdGVwCT0geFN0ZXA7DQorICAgIF95MVN0ZXAJPSB5U3RlcDsNCisgICAgaWYgKG1hdHJpeCkgew0KKyAgICAgICAgX21hdHJpeC5TZXQobWF0cml4LT5hLCBtYXRyaXgtPmIsIG1hdHJpeC0+YywgbWF0cml4LT5kLCBtYXRyaXgtPmUsIG1hdHJpeC0+Zik7DQorICAgIH0NCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0dGVybjo6Q3JlYXRlKEZYX0hhdGNoU3R5bGUgaGF0Y2hTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGZvcmVBcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmFja0FyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSBtYXRyaXggKQ0KK3sNCisgICAgaWYgKGhhdGNoU3R5bGUgPCBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwNCisgICAgICAgICAgICB8fCBoYXRjaFN0eWxlID4gRlhfSEFUQ0hTVFlMRV9Tb2xpZERpYW1vbmQpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICAgIH0NCisgICAgaWYgKF90eXBlICE9IEZYX1BBVFRFUk5fTm9uZSkgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgICB9DQorICAgIF90eXBlID0gRlhfUEFUVEVSTl9IYXRjaDsNCisgICAgX2hhdGNoU3R5bGUJPSBoYXRjaFN0eWxlOw0KKyAgICBfZm9yZUFyZ2IJPSBmb3JlQXJnYjsNCisgICAgX2JhY2tBcmdiCT0gYmFja0FyZ2I7DQorICAgIGlmIChtYXRyaXgpIHsNCisgICAgICAgIF9tYXRyaXguU2V0KG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOw0KKyAgICB9DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRlhfUGF0dGVybjo6fkNGWF9QYXR0ZXJuKCkNCit7DQorICAgIF90eXBlID0gRlhfUEFUVEVSTl9Ob25lOw0KK30NCitDRlhfU2hhZGluZzo6Q0ZYX1NoYWRpbmcoKQ0KK3sNCisgICAgX3R5cGUgPSBGWF9TSEFESU5HX05vbmU7DQorfQ0KK0ZYX0VSUiBDRlhfU2hhZGluZzo6Q3JlYXRlQXhpYWwoY29uc3QgQ0ZYX1BvaW50RiAmIGJlZ2luUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJICAgaXNFeHRlbmRlZEJlZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCSAgIGlzRXh0ZW5kZWRFbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCSAgIGJlZ2luQXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IJICAgZW5kQXJnYikNCit7DQorICAgIGlmIChfdHlwZSAhPSBGWF9TSEFESU5HX05vbmUpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgfQ0KKyAgICBfdHlwZSA9IEZYX1NIQURJTkdfQXhpYWw7DQorICAgIF9iZWdpblBvaW50CQkJPSBiZWdpblBvaW50Ow0KKyAgICBfZW5kUG9pbnQJCQk9IGVuZFBvaW50Ow0KKyAgICBfaXNFeHRlbmRlZEJlZ2luCT0gaXNFeHRlbmRlZEJlZ2luOw0KKyAgICBfaXNFeHRlbmRlZEVuZAkJPSBpc0V4dGVuZGVkRW5kOw0KKyAgICBfYmVnaW5BcmdiCQkJPSBiZWdpbkFyZ2I7DQorICAgIF9lbmRBcmdiCQkJPSBlbmRBcmdiOw0KKyAgICByZXR1cm4gSW5pdEFyZ2JBcnJheSgpOw0KK30NCitGWF9FUlIgQ0ZYX1NoYWRpbmc6OkNyZWF0ZVJhZGlhbChjb25zdCBDRlhfUG9pbnRGICYJYmVnaW5Qb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYJZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQJCWJlZ2luUmFkaXVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUCQllbmRSYWRpdXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCWlzRXh0ZW5kZWRCZWdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJaXNFeHRlbmRlZEVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCQliZWdpbkFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQgkJZW5kQXJnYikNCit7DQorICAgIGlmIChfdHlwZSAhPSBGWF9TSEFESU5HX05vbmUpIHsNCisgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgICAgfQ0KKyAgICBfdHlwZSA9IEZYX1NIQURJTkdfUmFkaWFsOw0KKyAgICBfYmVnaW5Qb2ludAkJCT0gYmVnaW5Qb2ludDsNCisgICAgX2VuZFBvaW50CQkJPSBlbmRQb2ludDsNCisgICAgX2JlZ2luUmFkaXVzCQk9IGJlZ2luUmFkaXVzOw0KKyAgICBfZW5kUmFkaXVzCQkJPSBlbmRSYWRpdXM7DQorICAgIF9pc0V4dGVuZGVkQmVnaW4JPSBpc0V4dGVuZGVkQmVnaW47DQorICAgIF9pc0V4dGVuZGVkRW5kCQk9IGlzRXh0ZW5kZWRFbmQ7DQorICAgIF9iZWdpbkFyZ2IJCQk9IGJlZ2luQXJnYjsNCisgICAgX2VuZEFyZ2IJCQk9IGVuZEFyZ2I7DQorICAgIHJldHVybiBJbml0QXJnYkFycmF5KCk7DQorfQ0KK0NGWF9TaGFkaW5nOjp+Q0ZYX1NoYWRpbmcoKQ0KK3sNCisgICAgX3R5cGUgPSBGWF9TSEFESU5HX05vbmU7DQorfQ0KK0ZYX0VSUiBDRlhfU2hhZGluZzo6SW5pdEFyZ2JBcnJheSgpDQorew0KKyAgICBGWF9JTlQzMiBhMSwgcjEsIGcxLCBiMTsNCisgICAgQXJnYkRlY29kZShfYmVnaW5BcmdiLCBhMSwgcjEsIGcxLCBiMSk7DQorICAgIEZYX0lOVDMyIGEyLCByMiwgZzIsIGIyOw0KKyAgICBBcmdiRGVjb2RlKF9lbmRBcmdiLCBhMiwgcjIsIGcyLCBiMik7DQorICAgIEZYX0ZMT0FUIGYgPSAoRlhfRkxPQVQpIChGWF9TSEFESU5HX1N0ZXBzIC0gMSk7DQorICAgIEZYX0ZMT0FUIGFTY2FsZSA9IChGWF9GTE9BVCkgKDEuMCAqIChhMiAtIGExKSAvIGYpOw0KKyAgICBGWF9GTE9BVCByU2NhbGUgPSAoRlhfRkxPQVQpICgxLjAgKiAocjIgLSByMSkgLyBmKTsNCisgICAgRlhfRkxPQVQgZ1NjYWxlID0gKEZYX0ZMT0FUKSAoMS4wICogKGcyIC0gZzEpIC8gZik7DQorICAgIEZYX0ZMT0FUIGJTY2FsZSA9IChGWF9GTE9BVCkgKDEuMCAqIChiMiAtIGIxKSAvIGYpOw0KKyAgICBGWF9JTlQzMiBhMywgcjMsIGczLCBiMzsNCisgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IEZYX1NIQURJTkdfU3RlcHM7IGkrKykgew0KKyAgICAgICAgYTMgPSAoRlhfSU5UMzIpIChpICogYVNjYWxlKTsNCisgICAgICAgIHIzID0gKEZYX0lOVDMyKSAoaSAqIHJTY2FsZSk7DQorICAgICAgICBnMyA9IChGWF9JTlQzMikgKGkgKiBnU2NhbGUpOw0KKyAgICAgICAgYjMgPSAoRlhfSU5UMzIpIChpICogYlNjYWxlKTsNCisgICAgICAgIF9hcmdiQXJyYXlbaV0gPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoKGExICsgYTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjEgKyByMyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnMSArIGczKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIxICsgYjMpKSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2NsYXNzIENGWF9QYXVzZSA6IHB1YmxpYyBJRlhfUGF1c2UNCit7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIEZYX0JPT0wJTmVlZFRvUGF1c2VOb3coKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KK307DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9tZXRhZmlsZV9pbnRlcnByZXRlci5jcHAgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X21ldGFmaWxlX2ludGVycHJldGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODhmYmM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9tZXRhZmlsZV9pbnRlcnByZXRlci5jcHAKQEAgLTAsMCArMSwyODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInByZS5oIg0KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2Z4X2dyYXBoaWNzLmgiDQorI2luY2x1ZGUgImZ4X21ldGFmaWxlX2ludGVycHJldGVyLmgiDQorQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OkNGWF9NZXRhZmlsZUludGVycHJldGVyKCkNCit7DQorICAgIF9lbGVtZW50ID0gTlVMTDsNCit9DQorQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6On5DRlhfTWV0YWZpbGVJbnRlcnByZXRlcigpDQorew0KKyAgICBfZWxlbWVudCA9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlNldEN1cnJlbnRFbGVtZW50KENYTUxfRWxlbWVudCAqIGVsZW1lbnQpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZWxlbWVudCwgRkFMU0UpOw0KKyAgICBfZWxlbWVudCA9IGVsZW1lbnQ7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVDYXAoRlhfSU5UMzIgJiBsaW5lQ2FwKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIGxpbmVDYXBFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChsaW5lQ2FwRWxlbWVudCwgRkFMU0UpOw0KKyAgICBsaW5lQ2FwID0gbGluZUNhcEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0TGluZURhc2goRlhfRkxPQVQgJglkYXNoUGhhc2UsDQorICAgICAgICBGWF9JTlQzMiAmCWRhc2hBcnJheSwNCisgICAgICAgIEZYX0lOVDMyICYJZGFzaENvdW50KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIGRhc2hQaGFzZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRhc2hQaGFzZUVsZW1lbnQsIEZBTFNFKTsNCisgICAgZGFzaFBoYXNlID0gZGFzaFBoYXNlRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBkYXNoQXJyYXlFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkYXNoQXJyYXlFbGVtZW50LCBGQUxTRSk7DQorICAgIGRhc2hBcnJheSA9IGRhc2hBcnJheUVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJGWF9GTE9BVCAqIik7DQorICAgIENYTUxfRWxlbWVudCAqIGRhc2hDb3VudEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRhc2hDb3VudEVsZW1lbnQsIEZBTFNFKTsNCisgICAgZGFzaENvdW50ID0gZGFzaENvdW50RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0lOVDMyIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVEYXNoKEZYX0lOVDMyICYgZGFzaFN0eWxlKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIGRhc2hTdHlsZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRhc2hTdHlsZUVsZW1lbnQsIEZBTFNFKTsNCisgICAgZGFzaFN0eWxlID0gZGFzaFN0eWxlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0Rhc2hTdHlsZSIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRMaW5lSm9pbihGWF9JTlQzMiAmIGxpbmVKb2luKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIGxpbmVKb2luRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobGluZUpvaW5FbGVtZW50LCBGQUxTRSk7DQorICAgIGxpbmVKb2luID0gbGluZUpvaW5FbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRNaXRlckxpbWl0KEZYX0ZMT0FUICYgbWl0ZXJMaW1pdCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBtaXRlckxpbWl0RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWl0ZXJMaW1pdEVsZW1lbnQsIEZBTFNFKTsNCisgICAgbWl0ZXJMaW1pdCA9IG1pdGVyTGltaXRFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVXaWR0aChGWF9GTE9BVCAmIGxpbmVXaWR0aCwNCisgICAgICAgIEZYX0lOVDMyICYgaXNBY3RPbkRhc2gpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogbGluZVdpZHRoRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobGluZVdpZHRoRWxlbWVudCwgRkFMU0UpOw0KKyAgICBsaW5lV2lkdGggPSBsaW5lV2lkdGhFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQorICAgIENYTUxfRWxlbWVudCAqIGlzQWN0T25EYXNoRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaXNBY3RPbkRhc2hFbGVtZW50LCBGQUxTRSk7DQorICAgIGlzQWN0T25EYXNoID0gaXNBY3RPbkRhc2hFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiRlhfQk9PTCIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRTdHJva2VDb2xvcihGWF9JTlQzMiAmIGNvbG9yKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIGNvbG9yRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoY29sb3JFbGVtZW50LCBGQUxTRSk7DQorICAgIGNvbG9yID0gY29sb3JFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0NvbG9yICoiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0RmlsbENvbG9yKEZYX0lOVDMyICYgY29sb3IpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogY29sb3JFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChjb2xvckVsZW1lbnQsIEZBTFNFKTsNCisgICAgY29sb3IgPSBjb2xvckVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfQ29sb3IgKiIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TdHJva2VQYXRoKEZYX0lOVDMyICYgcGF0aCwgRlhfSU5UMzIgJiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogcGF0aEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGhFbGVtZW50LCBGQUxTRSk7DQorICAgIHBhdGggPSBwYXRoRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9QYXRoICoiKTsNCisgICAgQ1hNTF9FbGVtZW50ICogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KKyAgICBtYXRyaXggPSBtYXRyaXhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX01hdHJpeCAqIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX0ZpbGxQYXRoKEZYX0lOVDMyICYgcGF0aCwNCisgICAgICAgIEZYX0lOVDMyICYgZmlsbE1vZGUsDQorICAgICAgICBGWF9JTlQzMiAmIG1hdHJpeCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBwYXRoRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aEVsZW1lbnQsIEZBTFNFKTsNCisgICAgcGF0aCA9IHBhdGhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1BhdGggKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBmaWxsTW9kZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGZpbGxNb2RlRWxlbWVudCwgRkFMU0UpOw0KKyAgICBmaWxsTW9kZSA9IGZpbGxNb2RlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0ZpbGxNb2RlIik7DQorICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCisgICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9DbGlwUGF0aChGWF9JTlQzMiAmIHBhdGgsDQorICAgICAgICBGWF9JTlQzMiAmIGZpbGxNb2RlLA0KKyAgICAgICAgRlhfSU5UMzIgJiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogcGF0aEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGhFbGVtZW50LCBGQUxTRSk7DQorICAgIHBhdGggPSBwYXRoRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9QYXRoICoiKTsNCisgICAgQ1hNTF9FbGVtZW50ICogZmlsbE1vZGVFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmaWxsTW9kZUVsZW1lbnQsIEZBTFNFKTsNCisgICAgZmlsbE1vZGUgPSBmaWxsTW9kZUVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJGWF9GaWxsTW9kZSIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQorICAgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfRHJhd0ltYWdlKEZYX0lOVDMyICYgc291cmNlLA0KKyAgICAgICAgRlhfSU5UMzIgJiBwb2ludCwNCisgICAgICAgIEZYX0lOVDMyICYgbWF0cml4KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIHNvdXJjZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZUVsZW1lbnQsIEZBTFNFKTsNCisgICAgc291cmNlID0gc291cmNlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9ESUJTb3VyY2UgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBwb2ludEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBvaW50RWxlbWVudCwgRkFMU0UpOw0KKyAgICBwb2ludCA9IHBvaW50RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9Qb2ludEYgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQorICAgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU3RyZXRjaEltYWdlKEZYX0lOVDMyICYgc291cmNlLA0KKyAgICAgICAgRlhfSU5UMzIgJiByZWN0LA0KKyAgICAgICAgRlhfSU5UMzIgJiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogc291cmNlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc291cmNlRWxlbWVudCwgRkFMU0UpOw0KKyAgICBzb3VyY2UgPSBzb3VyY2VFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0RJQlNvdXJjZSAqIik7DQorICAgIENYTUxfRWxlbWVudCAqIHJlY3RFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZWN0RWxlbWVudCwgRkFMU0UpOw0KKyAgICByZWN0ID0gcmVjdEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfUmVjdEYgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQorICAgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfQ29uY2F0TWF0cml4KEZYX0lOVDMyICYgbWF0cml4KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCisgICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRDbGlwUmVjdChGWF9JTlQzMiAmIHJlY3QpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogcmVjdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlY3RFbGVtZW50LCBGQUxTRSk7DQorICAgIHJlY3QgPSByZWN0RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9SZWN0RiAqIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldEZvbnQoRlhfSU5UMzIgJiBmb250KQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIGZvbnRFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb250RWxlbWVudCwgRkFMU0UpOw0KKyAgICBmb250ID0gZm9udEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfRm9udCAqIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldEZvbnRTaXplKEZYX0ZMT0FUICYgc2l6ZSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBzaXplRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc2l6ZUVsZW1lbnQsIEZBTFNFKTsNCisgICAgc2l6ZSA9IHNpemVFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldEZvbnRIU2NhbGUoRlhfRkxPQVQgJiBzY2FsZSkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBzY2FsZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNjYWxlRWxlbWVudCwgRkFMU0UpOw0KKyAgICBzY2FsZSA9IHNjYWxlRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRDaGFyU3BhY2luZyhGWF9GTE9BVCAmIHNwYWNpbmcpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogc3BhY2luZ0VsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNwYWNpbmdFbGVtZW50LCBGQUxTRSk7DQorICAgIHNwYWNpbmcgPSBzcGFjaW5nRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRUZXh0RHJhd2luZ01vZGUoRlhfSU5UMzIgJiBtb2RlKQ0KK3sNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICAgIENYTUxfRWxlbWVudCAqIG1vZGVFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtb2RlRWxlbWVudCwgRkFMU0UpOw0KKyAgICBtb2RlID0gbW9kZUVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJGWF9JTlQzMiIpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRUZXh0KEZYX0lOVDMyICYJcG9pbnQsDQorICAgICAgICBGWF9JTlQzMiAmCXRleHQsDQorICAgICAgICBGWF9JTlQzMiAmCW1hdHJpeCkNCit7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBwb2ludEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBvaW50RWxlbWVudCwgRkFMU0UpOw0KKyAgICBwb2ludCA9IHBvaW50RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9Qb2ludEYgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiB0ZXh0RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwodGV4dEVsZW1lbnQsIEZBTFNFKTsNCisgICAgdGV4dCA9IHRleHRFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1dpZGVTdHJpbmcgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQorICAgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfVHJhbnNmZXIoRlhfSU5UMzIgJiBncmFwaGljcywgRlhfSU5UMzIgJiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogZ3JhcGhpY3NFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljc0VsZW1lbnQsIEZBTFNFKTsNCisgICAgZ3JhcGhpY3MgPSBncmFwaGljc0VsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhpY3MgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQorICAgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfVHJhbnNmZXIoRlhfSU5UMzIgJiBncmFwaGljcywNCisgICAgICAgIEZYX0ZMT0FUICYgc3JjTGVmdCwNCisgICAgICAgIEZYX0ZMT0FUICYgc3JjVG9wLA0KKyAgICAgICAgRlhfSU5UMzIgJiBkc3RSZWN0LA0KKyAgICAgICAgRlhfSU5UMzIgJiBtYXRyaXgpDQorew0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgICAgQ1hNTF9FbGVtZW50ICogZ3JhcGhpY3NFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljc0VsZW1lbnQsIEZBTFNFKTsNCisgICAgZ3JhcGhpY3MgPSBncmFwaGljc0VsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhpY3MgKiIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBzcmNMZWZ0RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc3JjTGVmdEVsZW1lbnQsIEZBTFNFKTsNCisgICAgc3JjTGVmdCA9IHNyY0xlZnRFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQorICAgIENYTUxfRWxlbWVudCAqIHNyY1RvcEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgzKTsNCisgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNyY1RvcEVsZW1lbnQsIEZBTFNFKTsNCisgICAgc3JjVG9wID0gc3JjVG9wRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgICBDWE1MX0VsZW1lbnQgKiBkc3RSZWN0RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZHN0UmVjdEVsZW1lbnQsIEZBTFNFKTsNCisgICAgZHN0UmVjdCA9IGRzdFJlY3RFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1JlY3RGICoiKTsNCisgICAgQ1hNTF9FbGVtZW50ICogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDQpOw0KKyAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KKyAgICBtYXRyaXggPSBtYXRyaXhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX01hdHJpeCAqIik7DQorICAgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X21ldGFmaWxlX2ludGVycHJldGVyLmggYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X21ldGFmaWxlX2ludGVycHJldGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4MjdiNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfbWV0YWZpbGVfaW50ZXJwcmV0ZXIuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX19IX0ZYX01FVEFGSUxFX0lOVEVSUFJFVEVSX18NCisjZGVmaW5lIF9fSF9GWF9NRVRBRklMRV9JTlRFUlBSRVRFUl9fDQorY2xhc3MgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXIgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIENGWF9NZXRhZmlsZUludGVycHJldGVyKCk7DQorICAgIHZpcnR1YWwgfkNGWF9NZXRhZmlsZUludGVycHJldGVyKCk7DQorDQorICAgIEZYX0JPT0wgU2V0Q3VycmVudEVsZW1lbnQoQ1hNTF9FbGVtZW50ICogZWxlbWVudCk7DQorDQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRMaW5lQ2FwKEZYX0lOVDMyICYgbGluZUNhcCk7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRMaW5lRGFzaChGWF9GTE9BVCAmIGRhc2hQaGFzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyICYgZGFzaEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgJiBkYXNoQ291bnQpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU2V0TGluZURhc2goRlhfSU5UMzIgJiBkYXNoU3R5bGUpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU2V0TGluZUpvaW4oRlhfSU5UMzIgJiBsaW5lSm9pbik7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRNaXRlckxpbWl0KEZYX0ZMT0FUICYgbWl0ZXJMaW1pdCk7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRMaW5lV2lkdGgoRlhfRkxPQVQgJiBsaW5lV2lkdGgsIEZYX0lOVDMyICYgaXNBY3RPbkRhc2gpOw0KKw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU2V0U3Ryb2tlQ29sb3IoRlhfSU5UMzIgJiBjb2xvcik7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRGaWxsQ29sb3IoRlhfSU5UMzIgJiBjb2xvcik7DQorDQorICAgIEZYX0JPT0wgUGFyYW1PZl9TdHJva2VQYXRoKEZYX0lOVDMyICYgcGF0aCwgRlhfSU5UMzIgJiBtYXRyaXgpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfRmlsbFBhdGgoRlhfSU5UMzIgJiBwYXRoLCBGWF9JTlQzMiAmIGZpbGxNb2RlLCBGWF9JTlQzMiAmIG1hdHJpeCk7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9DbGlwUGF0aChGWF9JTlQzMiAmIHBhdGgsIEZYX0lOVDMyICYgZmlsbE1vZGUsIEZYX0lOVDMyICYgbWF0cml4KTsNCisNCisgICAgRlhfQk9PTCBQYXJhbU9mX0RyYXdJbWFnZShGWF9JTlQzMiAmIHNvdXJjZSwgRlhfSU5UMzIgJiBwb2ludCwgRlhfSU5UMzIgJiBtYXRyaXgpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU3RyZXRjaEltYWdlKEZYX0lOVDMyICYgc291cmNlLCBGWF9JTlQzMiAmIHJlY3QsIEZYX0lOVDMyICYgbWF0cml4KTsNCisNCisgICAgRlhfQk9PTCBQYXJhbU9mX0NvbmNhdE1hdHJpeChGWF9JTlQzMiAmIG1hdHJpeCk7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRDbGlwUmVjdChGWF9JTlQzMiAmIHJlY3QpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU2V0Rm9udChGWF9JTlQzMiAmIGZvbnQpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU2V0Rm9udFNpemUoRlhfRkxPQVQgJiBzaXplKTsNCisgICAgRlhfQk9PTCBQYXJhbU9mX1NldEZvbnRIU2NhbGUoRlhfRkxPQVQgJiBzY2FsZSk7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRDaGFyU3BhY2luZyhGWF9GTE9BVCAmIHNwYWNpbmcpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfU2V0VGV4dERyYXdpbmdNb2RlKEZYX0lOVDMyICYgbW9kZSk7DQorICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRUZXh0KEZYX0lOVDMyICYgcG9pbnQsIEZYX0lOVDMyICYgdGV4dCwgRlhfSU5UMzIgJiBtYXRyaXgpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfVHJhbnNmZXIoRlhfSU5UMzIgJiBncmFwaGljcywgRlhfSU5UMzIgJiBtYXRyaXgpOw0KKyAgICBGWF9CT09MIFBhcmFtT2ZfVHJhbnNmZXIoRlhfSU5UMzIgJglncmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICYJc3JjTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICYJc3JjVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgJglkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgJgltYXRyaXgpOw0KKw0KK3ByaXZhdGU6DQorICAgIENYTUxfRWxlbWVudCAqCV9lbGVtZW50Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5jcHAgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X3BhdGhfZ2VuZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTlkM2RmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5jcHAKQEAgLTAsMCArMSwyMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInByZS5oIg0KKyNpbmNsdWRlICJmeF9wYXRoX2dlbmVyYXRvci5oIg0KK0NGWF9QYXRoR2VuZXJhdG9yOjpDRlhfUGF0aEdlbmVyYXRvcigpDQorew0KKyAgICBtX3BQYXRoRGF0YSA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkNyZWF0ZSgpDQorew0KKyAgICBtX3BQYXRoRGF0YSA9IEZYX05FVyBDRlhfUGF0aERhdGE7DQorfQ0KK0NGWF9QYXRoR2VuZXJhdG9yOjp+Q0ZYX1BhdGhHZW5lcmF0b3IoKQ0KK3sNCisgICAgaWYgKCBtX3BQYXRoRGF0YSkgew0KKyAgICAgICAgZGVsZXRlIG1fcFBhdGhEYXRhOw0KKyAgICAgICAgbV9wUGF0aERhdGEgPSBOVUxMOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZFBhdGhEYXRhKENGWF9QYXRoRGF0YSAqcFBhdGhEYXRhKQ0KK3sNCisgICAgaWYgKHBQYXRoRGF0YSAmJiBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA+IDApIHsNCisgICAgICAgIGludCBuQ291bnQgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgICAgIEZYX1BBVEhQT0lOVCAqcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7DQorICAgICAgICBBZGRQYXRoRGF0YShwUG9pbnRzLCBuQ291bnQpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZFBhdGhEYXRhKEZYX1BBVEhQT0lOVCAqcFBvaW50cywgaW50IG5Db3VudCkNCit7DQorICAgIGlmIChwUG9pbnRzICYmIG5Db3VudCA+IDApIHsNCisgICAgICAgIGludCBuT2xkQ291bnQgPSBtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOw0KKyAgICAgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQobkNvdW50KTsNCisgICAgICAgIEZYX1BBVEhQT0lOVCAqcERzdFBvaW50cyA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsNCisgICAgICAgIEZYU1lTX21lbWNweShwRHN0UG9pbnRzICsgbk9sZENvdW50LCBwUG9pbnRzLCBzaXplb2YoRlhfUEFUSFBPSU5UKSAqIG5Db3VudCk7DQorICAgIH0NCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6TW92ZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQorew0KKyAgICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgxKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgLSAxLCB4LCB5LCBGWFBUX01PVkVUTyk7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkxpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQ0KK3sNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMSk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMSwgeCwgeSwgRlhQVF9MSU5FVE8pOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpCZXppZXJUbyhGWF9GTE9BVCBjdHJsX3gxLCBGWF9GTE9BVCBjdHJsX3kxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxfeDIsIEZYX0ZMT0FUIGN0cmxfeTIsIEZYX0ZMT0FUIHRvX3gsIEZYX0ZMT0FUIHRvX3kpDQorew0KKyAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMSwgY3RybF94MiwgY3RybF95MiwgRlhQVF9CRVpJRVJUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAyLCB0b194LCB0b195LCBGWFBUX0JFWklFUlRPKTsNCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6Q2xvc2UoKQ0KK3sNCisgICAgaWYgKG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPiAwKSB7DQorICAgICAgICBpbnQgaW5kZXggPSBtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMTsNCisgICAgICAgIEZYX1BBVEhQT0lOVCAqcFBvaW50cyA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsNCisgICAgICAgIHBQb2ludHNbaW5kZXhdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpDQorew0KKyAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMik7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHgxLCB5MSwgRlhQVF9NT1ZFVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMSwgeDIsIHkyLCBGWFBUX0xJTkVUTyk7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZEJlemllcihGWF9GTE9BVCBzdGFydF94LCBGWF9GTE9BVCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gxLCBGWF9GTE9BVCBjdHJsX3kxLCBGWF9GTE9BVCBjdHJsX3gyLCBGWF9GTE9BVCBjdHJsX3kyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeCwgRlhfRkxPQVQgZW5kX3kpDQorew0KKyAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoNCk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHN0YXJ0X3gsIHN0YXJ0X3ksIEZYUFRfTU9WRVRPKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMiwgY3RybF94MiwgY3RybF95MiwgRlhQVF9CRVpJRVJUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAzLCBlbmRfeCwgZW5kX3ksIEZYUFRfQkVaSUVSVE8pOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRSZWN0YW5nbGUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpDQorew0KKyAgICBtX3BQYXRoRGF0YS0+QXBwZW5kUmVjdCh4MSwgeTEsIHgyLCB5Mik7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZEVsbGlwc2UoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCkNCit7DQorI2lmIDANCisgICAgRlhfRklYRkxPQVQxNiBrOw0KKyAgICBrID0gZml4MTZfdG9fOChmaXhzcXJ0XzMyX3RvXzE2KGZpeG11bF84XzhfdG9fMzIod2lkdGgsIHdpZHRoKSArIGZpeG11bF84XzhfdG9fMzIoaGVpZ2h0LCBoZWlnaHQpKSAvIDIpOw0KKyAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoNyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHgsIHkgLSBoZWlnaHQgLyAyLCBGWFBUX01PVkVUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAxLCB4ICsgaywgeSAtIGhlaWdodCAvIDIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMiwgeCArIGssIHkgKyBoZWlnaHQgLyAyLCBGWFBUX0JFWklFUlRPKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDMsIHgsIHkgKyBoZWlnaHQgLyAyLCBGWFBUX0JFWklFUlRPKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDQsIHggLSBrLCB5ICsgaGVpZ2h0IC8gMiwgRlhQVF9CRVpJRVJUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyA1LCB4IC0gaywgeSAtIGhlaWdodCAvIDIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgNiwgeCwgeSAtIGhlaWdodCAvIDIsIEZYUFRfQkVaSUVSVE8pOw0KKyNlbHNlDQorICAgIEFkZEFyYyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCAwLCBGWF9QSSAqIDIpOw0KKyNlbmRpZg0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBcmNUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB3aWR0aCwgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLCBGWF9GTE9BVCBzd2VlcF9hbmdsZSkNCit7DQorICAgIEZYX0ZMT0FUIHgwID0gRlhTWVNfY29zKHN3ZWVwX2FuZ2xlIC8gMik7DQorICAgIEZYX0ZMT0FUIHkwID0gRlhTWVNfc2luKHN3ZWVwX2FuZ2xlIC8gMik7DQorICAgIEZYX0ZMT0FUIHR4ID0gRlhTWVNfRGl2KCgxLjBmIC0geDApICogNCwgMyAqIDEuMGYpOw0KKyAgICBGWF9GTE9BVCB0eSA9IHkwIC0gRlhTWVNfRGl2KEZYU1lTX011bCh0eCwgeDApLCB5MCk7DQorICAgIEZYX0ZMT0FUIHB4WzNdLCBweVszXTsNCisgICAgcHhbMF0gPSB4MCArIHR4Ow0KKyAgICBweVswXSA9IC10eTsNCisgICAgcHhbMV0gPSB4MCArIHR4Ow0KKyAgICBweVsxXSA9IHR5Ow0KKyAgICBGWF9GTE9BVCBzbiA9IEZYU1lTX3NpbihzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlIC8gMik7DQorICAgIEZYX0ZMT0FUIGNzID0gRlhTWVNfY29zKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUgLyAyKTsNCisgICAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDMpOw0KKyAgICBGWF9GTE9BVCBiZXppZXJfeCwgYmV6aWVyX3k7DQorICAgIGJlemllcl94ID0geCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfTXVsKHB4WzBdLCBjcykgLSBGWFNZU19NdWwocHlbMF0sIHNuKSk7DQorICAgIGJlemllcl95ID0geSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX011bChweFswXSwgc24pICsgRlhTWVNfTXVsKHB5WzBdLCBjcykpOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50LCBiZXppZXJfeCwgYmV6aWVyX3ksIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBiZXppZXJfeCA9IHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX011bChweFsxXSwgY3MpIC0gRlhTWVNfTXVsKHB5WzFdLCBzbikpOw0KKyAgICBiZXppZXJfeSA9IHkgKyBGWFNZU19NdWwoaGVpZ2h0LCBGWFNZU19NdWwocHhbMV0sIHNuKSArIEZYU1lTX011bChweVsxXSwgY3MpKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGJlemllcl94LCBiZXppZXJfeSwgRlhQVF9CRVpJRVJUTyk7DQorICAgIGJlemllcl94ID0geCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfY29zKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUpKSwNCisgICAgYmV6aWVyX3kgPSB5ICsgRlhTWVNfTXVsKGhlaWdodCwgRlhTWVNfc2luKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUpKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDIsIGJlemllcl94LCBiZXppZXJfeSwgRlhQVF9CRVpJRVJUTyk7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZEFyYyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB3aWR0aCwgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydF9hbmdsZSwgRlhfRkxPQVQgc3dlZXBfYW5nbGUpDQorew0KKyNpZiAwDQorICAgIEZYX0ZJWEZMT0FUMzIgc3dlZXAgPSBzd2VlcF9hbmdsZTsNCisgICAgd2hpbGUgKHN3ZWVwID4gRklYRkxPQVQzMl9QSSAqIDIpIHsNCisgICAgICAgIHN3ZWVwIC09IEZJWEZMT0FUMzJfUEkgKiAyOw0KKyAgICB9DQorICAgIGlmIChzd2VlcCA9PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMSk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBmaXhtdWxfOF8zMl90b184KHdpZHRoLCBmaXhjb3Moc3RhcnRfYW5nbGUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKyBmaXhtdWxfOF8zMl90b184KGhlaWdodCwgZml4c2luKHN0YXJ0X2FuZ2xlKSksIEZYUFRfTU9WRVRPKTsNCisgICAgRlhfRklYRkxPQVQzMiBhbmdsZTEgPSAwLCBhbmdsZTI7DQorICAgIEZYX0JPT0wgYkRvbmUgPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgYW5nbGUyID0gYW5nbGUxICsgRklYRkxPQVQzMl9QSSAvIDI7DQorICAgICAgICBpZiAoYW5nbGUyID49IHN3ZWVwKSB7DQorICAgICAgICAgICAgYW5nbGUyID0gc3dlZXA7DQorICAgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQXJjVG8oeCwgeSwgd2lkdGgsIGhlaWdodCwgc3RhcnRfYW5nbGUgKyBhbmdsZTEsIGFuZ2xlMiAtIGFuZ2xlMSk7DQorICAgICAgICBhbmdsZTEgPSBhbmdsZTI7DQorICAgIH0gd2hpbGUgKCFiRG9uZSk7DQorI2Vsc2UNCisgICAgaWYgKHN3ZWVwX2FuZ2xlID09IDApIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBzdGF0aWMgY29uc3QgRlhfRkxPQVQgYmV6aWVyX2FyY19hbmdsZV9lcHNpbG9uID0gKEZYX0ZMT0FUKSgwLjAxZik7DQorICAgIHdoaWxlIChzdGFydF9hbmdsZSA+IEZYX1BJICogMikgew0KKyAgICAgICAgc3RhcnRfYW5nbGUgLT0gRlhfUEkgKiAyOw0KKyAgICB9DQorICAgIHdoaWxlIChzdGFydF9hbmdsZSA8IDApIHsNCisgICAgICAgIHN0YXJ0X2FuZ2xlICs9IEZYX1BJICogMjsNCisgICAgfQ0KKyAgICBpZihzd2VlcF9hbmdsZSA+PSBGWF9QSSAqIDIpIHsNCisgICAgICAgIHN3ZWVwX2FuZ2xlID0gRlhfUEkgKiAyOw0KKyAgICB9DQorICAgIGlmKHN3ZWVwX2FuZ2xlIDw9IC1GWF9QSSAqIDIpIHsNCisgICAgICAgIHN3ZWVwX2FuZ2xlID0gLUZYX1BJICogMjsNCisgICAgfQ0KKyAgICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgxKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfY29zKHN0YXJ0X2FuZ2xlKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgRlhTWVNfTXVsKGhlaWdodCwgRlhTWVNfc2luKHN0YXJ0X2FuZ2xlKSksIEZYUFRfTU9WRVRPKTsNCisgICAgRlhfRkxPQVQgdG90YWxfc3dlZXAgPSAwLCBsb2NhbF9zd2VlcCA9IDAsIHByZXZfc3dlZXAgPSAwOw0KKyAgICBGWF9CT09MIGRvbmUgPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgaWYgKHN3ZWVwX2FuZ2xlIDwgMCkgew0KKyAgICAgICAgICAgIHByZXZfc3dlZXAgID0gdG90YWxfc3dlZXA7DQorICAgICAgICAgICAgbG9jYWxfc3dlZXAgPSAtRlhfUEkgLyAyOw0KKyAgICAgICAgICAgIHRvdGFsX3N3ZWVwIC09IEZYX1BJIC8gMjsNCisgICAgICAgICAgICBpZiAodG90YWxfc3dlZXAgPD0gc3dlZXBfYW5nbGUgKyBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24pIHsNCisgICAgICAgICAgICAgICAgbG9jYWxfc3dlZXAgPSBzd2VlcF9hbmdsZSAtIHByZXZfc3dlZXA7DQorICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcHJldl9zd2VlcCAgPSB0b3RhbF9zd2VlcDsNCisgICAgICAgICAgICBsb2NhbF9zd2VlcCA9IEZYX1BJIC8gMjsNCisgICAgICAgICAgICB0b3RhbF9zd2VlcCArPSBGWF9QSSAvIDI7DQorICAgICAgICAgICAgaWYgKHRvdGFsX3N3ZWVwID49IHN3ZWVwX2FuZ2xlIC0gYmV6aWVyX2FyY19hbmdsZV9lcHNpbG9uKSB7DQorICAgICAgICAgICAgICAgIGxvY2FsX3N3ZWVwID0gc3dlZXBfYW5nbGUgLSBwcmV2X3N3ZWVwOw0KKyAgICAgICAgICAgICAgICBkb25lID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBBcmNUbyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdGFydF9hbmdsZSwgbG9jYWxfc3dlZXApOw0KKyAgICAgICAgc3RhcnRfYW5nbGUgKz0gbG9jYWxfc3dlZXA7DQorICAgIH0gd2hpbGUgKCFkb25lKTsNCisjZW5kaWYNCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUGllKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHdpZHRoLCBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLCBGWF9GTE9BVCBzd2VlcF9hbmdsZSkNCit7DQorICAgIGlmIChzd2VlcF9hbmdsZSA9PSAwKSB7DQorICAgICAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDIpOw0KKyAgICAgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgeCwgeSwgRlhQVF9NT1ZFVE8pOw0KKyAgICAgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfY29zKHN0YXJ0X2FuZ2xlKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX3NpbihzdGFydF9hbmdsZSkpLCBGWFBUX0xJTkVUTyk7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQWRkQXJjKHgsIHksIHdpZHRoLCBoZWlnaHQsIHN0YXJ0X2FuZ2xlLCBzd2VlcF9hbmdsZSk7DQorICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuaCBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ0N2Y2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfX0hfRlhfUEFUSF9HRU5FUkFUT1JfXw0KKyNkZWZpbmUgX19IX0ZYX1BBVEhfR0VORVJBVE9SX18NCitjbGFzcyBDRlhfUGF0aEdlbmVyYXRvciA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYX1BhdGhHZW5lcmF0b3IoKTsNCisgICAgdm9pZCBDcmVhdGUoKTsNCisgICAgfkNGWF9QYXRoR2VuZXJhdG9yKCk7DQorICAgIENGWF9QYXRoRGF0YSAqR2V0UGF0aERhdGEoKSBjb25zdA0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wUGF0aERhdGE7DQorICAgIH0NCisgICAgdm9pZCBBZGRQYXRoRGF0YShDRlhfUGF0aERhdGEgKnBhdGhfZGF0YSk7DQorICAgIHZvaWQgQWRkUGF0aERhdGEoRlhfUEFUSFBPSU5UICpwb2ludHMsIGludCBjb3VudCk7DQorICAgIHZvaWQgTW92ZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKyAgICB2b2lkIExpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgICAgdm9pZCBCZXppZXJUbyhGWF9GTE9BVCBjdHJsX3gxLCBGWF9GTE9BVCBjdHJsX3kxLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxfeDIsIEZYX0ZMT0FUIGN0cmxfeTIsIEZYX0ZMT0FUIHRvX3gsIEZYX0ZMT0FUIHRvX3kpOw0KKyAgICB2b2lkIENsb3NlKCk7DQorICAgIHZvaWQgQXJjVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydF9hbmdsZSwgRlhfRkxPQVQgc3dlZXBfYW5nbGUpOw0KKw0KKyAgICB2b2lkIEFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOw0KKyAgICB2b2lkIEFkZEJlemllcihGWF9GTE9BVCBzdGFydF94LCBGWF9GTE9BVCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gxLCBGWF9GTE9BVCBjdHJsX3kxLCBGWF9GTE9BVCBjdHJsX3gyLCBGWF9GTE9BVCBjdHJsX3kyLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeCwgRlhfRkxPQVQgZW5kX3kpOw0KKyAgICB2b2lkIEFkZFJlY3RhbmdsZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7DQorICAgIHZvaWQgQWRkRWxsaXBzZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB3aWR0aCwgRlhfRkxPQVQgaGVpZ2h0KTsNCisgICAgdm9pZCBBZGRBcmMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKTsNCisgICAgdm9pZCBBZGRQaWUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9QYXRoRGF0YSAqbV9wUGF0aERhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL3ByZS5oIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzgyYjM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vZm94aXRsaWIuaCINCisjaWZuZGVmIEZYU1lTX011bA0KKyNkZWZpbmUJCUZYU1lTX011bChhLCBiKSAoKGEpICogKGIpKQ0KKyNkZWZpbmUJCUZYU1lTX0RpdihhLCBiKSAoKGEpIC8gKGIpKQ0KKyNkZWZpbmUJCUZYU1lTX011bERpdihhLCBiLCBjKSAoKGEpICogKGIpIC8gKGMpKQ0KKyNkZWZpbmUJCUZYU1lTX3NxcnQyKGEsIGIpIChGWF9GTE9BVClGWFNZU19zcXJ0KChhKSooYSkgKyAoYikqKGIpKQ0KKyNlbmRpZg0KK2VudW0gew0KKyAgICBGWF9DT05URVhUX05vbmUJCT0gMCwNCisgICAgRlhfQ09OVEVYVF9EZXZpY2UsDQorfTsNCitlbnVtIHsNCisgICAgRlhfQ09MT1JfTm9uZQkJPSAwLA0KKyAgICBGWF9DT0xPUl9Tb2xpZCwNCisgICAgRlhfQ09MT1JfUGF0dGVybiwNCisgICAgRlhfQ09MT1JfU2hhZGluZw0KK307DQorZW51bSB7DQorICAgIEZYX1BBVFRFUk5fTm9uZQkJPSAwLA0KKyAgICBGWF9QQVRURVJOX0JpdG1hcCwNCisgICAgRlhfUEFUVEVSTl9IYXRjaA0KK307DQorZW51bSB7DQorICAgIEZYX1NIQURJTkdfTm9uZQkJPSAwLA0KKyAgICBGWF9TSEFESU5HX0F4aWFsLA0KKyAgICBGWF9TSEFESU5HX1JhZGlhbA0KK307DQorI2RlZmluZQlGWF9IQVRDSFNUWUxFX1RvdGFsCTUzDQorc3RydWN0IEZYX0hBVENIREFUQSB7DQorICAgIEZYX0lOVDMyCXdpZHRoOw0KKyAgICBGWF9JTlQzMgloZWlnaHQ7DQorICAgIEZYX0JZVEUJCW1hc2tCaXRzWzY0XTsNCit9Ow0KK3R5cGVkZWYgRlhfSEFUQ0hEQVRBIGNvbnN0ICogRlhfTFBDSEFUQ0hEQVRBOw0KK3N0YXRpYyBjb25zdCBGWF9IQVRDSERBVEEgaGF0Y2hCaXRtYXBEYXRhW0ZYX0hBVENIU1RZTEVfVG90YWxdID0gew0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLCAweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwgMTYsIHsweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLH19LA0KKyAgICB7MTYsIDE2LCB7MHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCx9fSwNCisgICAgezE2LCAxNiwgezB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorfTsNCisjaWYgZGVmaW5lZCAoX19XSU4zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpDQorI2RlZmluZSBGWF9TVEFSVF9USU1FUglTWVNURU1USU1FIHN0YXJ0LCBzdG9wOyBcDQorICAgIDo6R2V0TG9jYWxUaW1lKCZzdGFydCk7DQorI2RlZmluZSBGWF9TVE9QX1RJTUVSCTo6R2V0TG9jYWxUaW1lKCZzdG9wKTsgXA0KKyAgICBXT1JEIHdTZWNvbmQgPSBzdG9wLndTZWNvbmQgLSBzdGFydC53U2Vjb25kOyBcDQorICAgIFdPUkQgd01pbGxpc2Vjb25kcyA9IHN0b3Aud01pbGxpc2Vjb25kcyAtIHN0YXJ0LndNaWxsaXNlY29uZHM7IFwNCisgICAgY2hhciBidWZbMjU2XTsgXA0KKyAgICBzcHJpbnRmKGJ1ZiwgImR1cmF0aW9uIGlzICVkIG1pbGxpc2Vjb25kXG4iLCB3U2Vjb25kICogMTAwMCArIHdNaWxsaXNlY29uZHMpOyBcDQorICAgIDo6T3V0cHV0RGVidWdTdHJpbmcoYnVmKTsNCisjZWxpZiBkZWZpbmVkIChfX2xpbnV4KSB8fCBkZWZpbmVkIChsaW51eCkNCisjZGVmaW5lIEZYX1NUQVJUX1RJTUVSDQorI2RlZmluZSBGWF9TVE9QX1RJTUVSDQorI2VsaWYgZGVmaW5lZCAoX19BUFBMRV9fKSB8fCBkZWZpbmVkIChfX01BQ09TWF9fKQ0KKyNkZWZpbmUgRlhfU1RBUlRfVElNRVIJTlNUaW1lSW50ZXJ2YWwgc3RhcnQsIHN0b3A7IFwNCisgICAgc3RhcnQgPSBbTlNEYXRlIHRpbWVJbnRlcnZhbFNpbmNlUmVmZXJlbmNlRGF0ZV07DQorI2RlZmluZSBGWF9TVE9QX1RJTUVSCXN0b3AgPSBbTlNEYXRlIHRpbWVJbnRlcnZhbFNpbmNlUmVmZXJlbmNlRGF0ZV07IFwNCisgICAgTlNUaW1lSW50ZXJ2YWwgZHVyYXRpb24gPSBzdG9wIC0gc3RhcnQ7IFwNCisgICAgcHJpbnRmKCJkdXJhdGlvbiBpcyAlZiBtaWxsaXNlY29uZFxuIiwgZHVyYXRpb24gKiAxMDAwKTsNCisjZWxzZQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmNwcCBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjZlOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuY3BwCkBAIC0wLDAgKzEsMjY4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmeHY4LmgiDQorI2luY2x1ZGUgImNvbnRleHQuaCINCisjaW5jbHVkZSAiY2xhc3MuaCINCisjaW5jbHVkZSAidmFsdWUuaCINCisjaW5jbHVkZSAic2NvcGVfaW5saW5lLmgiDQorI2luY2x1ZGUgInV0aWxfaW5saW5lLmgiDQorc3RhdGljIHZvaWQgRlhKU0VfVjhDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4RnVuY3Rpb25DYWxsYmFja19XcmFwcGVyKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsNCitzdGF0aWMgdm9pZCBGWEpTRV9WOEdldHRlckNhbGxiYWNrX1dyYXBwZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7DQorc3RhdGljIHZvaWQgRlhKU0VfVjhTZXR0ZXJDYWxsYmFja19XcmFwcGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2b2lkPiYgaW5mbyk7DQordm9pZCBGWEpTRV9EZWZpbmVGdW5jdGlvbnMoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIGNvbnN0IEZYSlNFX0ZVTkNUSU9OKiBscEZ1bmN0aW9ucywgaW50IG5OdW0pDQorew0KKyAgICBDRlhKU0VfQ29udGV4dCogbHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgICAgQVNTRVJUKGxwQ29udGV4dCk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUobHBDb250ZXh0KTsNCisgICAgdjg6Oklzb2xhdGUgKnBJc29sYXRlID0gbHBDb250ZXh0LT5HZXRSdW50aW1lKCk7DQorICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gIGhHbG9iYWxPYmplY3QgPSBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChzY29wZS5HZXRMb2NhbENvbnRleHQoKSk7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMDsgaSA8IG5OdW07IGkrKykgew0KKyAgICAgICAgaEdsb2JhbE9iamVjdC0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwRnVuY3Rpb25zW2ldLm5hbWUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4RnVuY3Rpb25DYWxsYmFja19XcmFwcGVyLCB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9GVU5DVElPTio+KGxwRnVuY3Rpb25zICsgaSkpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsNCisgICAgfQ0KK30NCitGWEpTRV9IQ0xBU1MgRlhKU0VfRGVmaW5lQ2xhc3MoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzKQ0KK3sNCisgICAgQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQorICAgIEFTU0VSVChscENvbnRleHQpOw0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IQ0xBU1M+KENGWEpTRV9DbGFzczo6Q3JlYXRlKGxwQ29udGV4dCwgbHBDbGFzcywgRkFMU0UpKTsNCit9DQorRlhKU0VfSENMQVNTIEZYSlNFX0dldENsYXNzKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LCBGWF9CU1RSIHN6TmFtZSkNCit7DQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hDTEFTUz4oQ0ZYSlNFX0NsYXNzOjpHZXRDbGFzc0Zyb21Db250ZXh0KHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCksIHN6TmFtZSkpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlcihjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCit7DQorICAgIGNvbnN0IEZYSlNFX0ZVTkNUSU9OKiBscEZ1bmN0aW9uSW5mbyA9IHN0YXRpY19jYXN0PEZYSlNFX0ZVTkNUSU9OKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgICAgaWYgKCFscEZ1bmN0aW9uSW5mbykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nQyBzekZ1bmN0aW9uTmFtZShscEZ1bmN0aW9uSW5mby0+bmFtZSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgICBDRlhKU0VfQXJndW1lbnRzSW1wbCBpbXBsID0geyZpbmZvLCBscFJldFZhbHVlfTsNCisgICAgbHBGdW5jdGlvbkluZm8tPmNhbGxiYWNrUHJvYyhyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGdW5jdGlvbk5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0FyZ3VtZW50cyY+KGltcGwpKTsNCisgICAgaWYoIWxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuSXNFbXB0eSgpKSB7DQorICAgICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBscFJldFZhbHVlOw0KKyAgICBscFJldFZhbHVlID0gTlVMTDsNCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4Q2xhc3NHbG9iYWxDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24gPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICAgIGlmICghbHBDbGFzc0RlZmluaXRpb24pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZ0Mgc3pGdW5jdGlvbk5hbWUobHBDbGFzc0RlZmluaXRpb24tPm5hbWUpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwgaW1wbCA9IHsmaW5mbywgbHBSZXRWYWx1ZX07DQorICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5jb25zdHJ1Y3RvcihyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGdW5jdGlvbk5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0FyZ3VtZW50cyY+KGltcGwpKTsNCisgICAgaWYoIWxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuSXNFbXB0eSgpKSB7DQorICAgICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBscFJldFZhbHVlOw0KKyAgICBscFJldFZhbHVlID0gTlVMTDsNCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4R2V0dGVyQ2FsbGJhY2tfV3JhcHBlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKQ0KK3sNCisgICAgY29uc3QgRlhKU0VfUFJPUEVSVFkqIGxwUHJvcGVydHlJbmZvID0gc3RhdGljX2Nhc3Q8RlhKU0VfUFJPUEVSVFkqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgICBpZiAoIWxwUHJvcGVydHlJbmZvKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmdDIHN6UHJvcGVydHlOYW1lKGxwUHJvcGVydHlJbmZvLT5uYW1lKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgICBscFByb3BlcnR5SW5mby0+Z2V0UHJvYyhyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pQcm9wZXJ0eU5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscFByb3BWYWx1ZSkpOw0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUHJvcFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICAgIGRlbGV0ZSBscFByb3BWYWx1ZTsNCisgICAgbHBQcm9wVmFsdWUgPSBOVUxMOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFNldHRlckNhbGxiYWNrX1dyYXBwZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHZvaWQ+JiBpbmZvKQ0KK3sNCisgICAgY29uc3QgRlhKU0VfUFJPUEVSVFkqIGxwUHJvcGVydHlJbmZvID0gc3RhdGljX2Nhc3Q8RlhKU0VfUFJPUEVSVFkqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgICBpZiAoIWxwUHJvcGVydHlJbmZvKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmdDIHN6UHJvcGVydHlOYW1lKGxwUHJvcGVydHlJbmZvLT5uYW1lKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgICBscFByb3BWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh2YWx1ZSk7DQorICAgIGxwUHJvcGVydHlJbmZvLT5zZXRQcm9jKHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzelByb3BlcnR5TmFtZSwgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwUHJvcFZhbHVlKSk7DQorICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KKyAgICBkZWxldGUgbHBQcm9wVmFsdWU7DQorICAgIGxwUHJvcFZhbHVlID0gTlVMTDsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24gPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICAgIGlmICghbHBDbGFzc0RlZmluaXRpb24pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQoaW5mby5UaGlzKCktPkludGVybmFsRmllbGRDb3VudCgpKTsNCisgICAgaW5mby5UaGlzKCktPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsIE5VTEwpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICAgIGlmKGxwQ2xhc3NEZWZpbml0aW9uLT5keW5NZXRob2RDYWxsIHx8IGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wR2V0dGVyIHx8IGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wU2V0dGVyIHx8IGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wVHlwZUdldHRlcikgew0KKyAgICAgICAgQ0ZYSlNFX0NsYXNzOjpTZXRVcER5blByb3BIYW5kbGVyKE5VTEwsIGxwVGhpc1ZhbHVlLCBscENsYXNzRGVmaW5pdGlvbik7DQorICAgIH0NCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK0ZYSlNFX0hSVU5USU1FIENGWEpTRV9Bcmd1bWVudHM6OkdldFJ1bnRpbWUoKSBjb25zdA0KK3sNCisgICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4obHBBcmd1bWVudHMtPm1fcFJldFZhbHVlLT5HZXRJc29sYXRlKCkpOw0KK30NCitGWF9JTlQzMgkJQ0ZYSlNFX0FyZ3VtZW50czo6R2V0TGVuZ3RoKCkgY29uc3QNCit7DQorICAgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgICAgcmV0dXJuIGxwQXJndW1lbnRzLT5tX3BJbmZvLT5MZW5ndGgoKTsNCit9DQorRlhKU0VfSFZBTFVFCUNGWEpTRV9Bcmd1bWVudHM6OkdldFZhbHVlKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KK3sNCisgICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwQXJnVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZSh2ODo6SXNvbGF0ZTo6R2V0Q3VycmVudCgpKTsNCisgICAgQVNTRVJUKGxwQXJnVmFsdWUpOw0KKyAgICBscEFyZ1ZhbHVlLT5Gb3JjZVNldFZhbHVlKCgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XSk7DQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBBcmdWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wJCQlDRlhKU0VfQXJndW1lbnRzOjpHZXRCb29sZWFuKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KK3sNCisgICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgICByZXR1cm4gKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdLT5Cb29sZWFuVmFsdWUoKSA/IFRSVUUgOiBGQUxTRTsNCit9DQorRlhfSU5UMzIJCUNGWEpTRV9Bcmd1bWVudHM6OkdldEludDMyKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KK3sNCisgICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfSU5UMzI+KCgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XS0+TnVtYmVyVmFsdWUoKSk7DQorfQ0KK0ZYX0ZMT0FUCQlDRlhKU0VfQXJndW1lbnRzOjpHZXRGbG9hdChGWF9JTlQzMiBpbmRleCkgY29uc3QNCit7DQorICAgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZMT0FUPigoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF0tPk51bWJlclZhbHVlKCkpOw0KK30NCitDRlhfQnl0ZVN0cmluZwlDRlhKU0VfQXJndW1lbnRzOjpHZXRVVEY4U3RyaW5nKEZYX0lOVDMyIGluZGV4KSBjb25zdA0KK3sNCisgICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGhTdHJpbmcgPSAoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF0tPlRvU3RyaW5nKCk7DQorICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSAgc3pTdHJpbmdWYWwoaFN0cmluZyk7DQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygqc3pTdHJpbmdWYWwpOw0KK30NCitGWF9MUFZPSUQJCUNGWEpTRV9Bcmd1bWVudHM6OkdldE9iamVjdChGWF9JTlQzMiBpbmRleCwgRlhKU0VfSENMQVNTIGhDbGFzcyApIGNvbnN0DQorew0KKyAgICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBoVmFsdWUgPSAoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF07DQorICAgIEFTU0VSVCghaFZhbHVlLklzRW1wdHkoKSk7DQorICAgIGlmKCFoVmFsdWUtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCisgICAgcmV0dXJuIEZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZyhoVmFsdWUuQXM8djg6Ok9iamVjdD4oKSwgbHBDbGFzcyk7DQorfQ0KK0ZYSlNFX0hWQUxVRQlDRlhKU0VfQXJndW1lbnRzOjpHZXRSZXR1cm5WYWx1ZSgpDQorew0KKyAgICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBBcmd1bWVudHMtPm1fcFJldFZhbHVlKTsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfQ29udGV4dF9HbG9iYWxPYmpUb1N0cmluZyhjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCit7DQorICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgICBpZiAoIWxwQ2xhc3MpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZihpbmZvLlRoaXMoKSA9PSBpbmZvLkhvbGRlcigpICYmIGxwQ2xhc3MtPm5hbWUpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6U3RyaW5nVmFsOw0KKyAgICAgICAgc3pTdHJpbmdWYWwuRm9ybWF0KCJbb2JqZWN0ICVzXSIsIGxwQ2xhc3MtPm5hbWUpOw0KKyAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpbmZvLkdldElzb2xhdGUoKSwgKEZYX0xQQ1NUUilzelN0cmluZ1ZhbCwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pTdHJpbmdWYWwuR2V0TGVuZ3RoKCkpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoaW5mby5UaGlzKCktPk9iamVjdFByb3RvVG9TdHJpbmcoKSk7DQorICAgIH0NCit9DQorQ0ZYSlNFX0NsYXNzKiBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShDRlhKU0VfQ29udGV4dCogbHBDb250ZXh0LCBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24sIEZYX0JPT0wgYklzSlNHbG9iYWwgKQ0KK3sNCisgICAgaWYoIWxwQ29udGV4dCB8fCAhbHBDbGFzc0RlZmluaXRpb24pIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENGWEpTRV9DbGFzcyogcENsYXNzID0gR2V0Q2xhc3NGcm9tQ29udGV4dChscENvbnRleHQsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKTsNCisgICAgaWYocENsYXNzKSB7DQorICAgICAgICByZXR1cm4gcENsYXNzOw0KKyAgICB9DQorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwQ29udGV4dC0+bV9wSXNvbGF0ZTsNCisgICAgcENsYXNzID0gRlhfTkVXIENGWEpTRV9DbGFzcyhscENvbnRleHQpOw0KKyAgICBBU1NFUlQocENsYXNzKTsNCisgICAgcENsYXNzLT5tX3N6Q2xhc3NOYW1lID0gbHBDbGFzc0RlZmluaXRpb24tPm5hbWU7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoRnVuY3Rpb25UZW1wbGF0ZSA9IHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcocElzb2xhdGUsIGJJc0pTR2xvYmFsID8gMCA6IEZYSlNFX1Y4Q29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyLCB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpOw0KKyAgICBoRnVuY3Rpb25UZW1wbGF0ZS0+U2V0Q2xhc3NOYW1lKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bmFtZSkpOw0KKyAgICBoRnVuY3Rpb25UZW1wbGF0ZS0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMSk7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhPYmplY3RUZW1wbGF0ZSA9IGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCk7DQorICAgIGlmIChscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcERlbGV0ZXIgfHwgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BUeXBlR2V0dGVyKSB7DQorICAgICAgICBTZXRVcE5hbWVkUHJvcEhhbmRsZXIocElzb2xhdGUsIGhPYmplY3RUZW1wbGF0ZSwgbHBDbGFzc0RlZmluaXRpb24pOw0KKyAgICB9DQorICAgIGlmKGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wTnVtKSB7DQorICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBscENsYXNzRGVmaW5pdGlvbi0+cHJvcE51bTsgaSsrKSB7DQorICAgICAgICAgICAgaE9iamVjdFRlbXBsYXRlLT5TZXROYXRpdmVEYXRhUHJvcGVydHkodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzW2ldLm5hbWUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzW2ldLmdldFByb2MgPyBGWEpTRV9WOEdldHRlckNhbGxiYWNrX1dyYXBwZXIgOiBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzW2ldLnNldFByb2MgPyBGWEpTRV9WOFNldHRlckNhbGxiYWNrX1dyYXBwZXIgOiBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCAgY29uc3RfY2FzdDxGWEpTRV9QUk9QRVJUWSo+KGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzICsgaSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihscENsYXNzRGVmaW5pdGlvbi0+bWV0aE51bSkgew0KKyAgICAgICAgZm9yKEZYX0lOVDMyIGkgPSAwOyBpIDwgbHBDbGFzc0RlZmluaXRpb24tPm1ldGhOdW07IGkrKykgew0KKyAgICAgICAgICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bWV0aG9kc1tpXS5uYW1lKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0ZVTkNUSU9OKj4obHBDbGFzc0RlZmluaXRpb24tPm1ldGhvZHMgKyBpKSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihscENsYXNzRGVmaW5pdGlvbi0+Y29uc3RydWN0b3IpIHsNCisgICAgICAgIGlmKGJJc0pTR2xvYmFsKSB7DQorICAgICAgICAgICAgaE9iamVjdFRlbXBsYXRlLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpSZWFkT25seSB8IHY4OjpEb250RGVsZXRlKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaExvY2FsQ29udGV4dCA9IHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgbHBDb250ZXh0LT5tX2hDb250ZXh0KTsNCisgICAgICAgICAgICBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTG9jYWxDb250ZXh0KS0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bmFtZSksDQorICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhDbGFzc0dsb2JhbENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKGJJc0pTR2xvYmFsKSB7DQorICAgICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInRvU3RyaW5nIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcocElzb2xhdGUsIEZYSlNFX0NvbnRleHRfR2xvYmFsT2JqVG9TdHJpbmcsIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgICB9DQorICAgIHBDbGFzcy0+bV9oVGVtcGxhdGUuUmVzZXQobHBDb250ZXh0LT5tX3BJc29sYXRlLCBoRnVuY3Rpb25UZW1wbGF0ZSk7DQorICAgIGxwQ29udGV4dC0+bV9yZ0NsYXNzZXMuQWRkKHBDbGFzcyk7DQorICAgIHJldHVybiBwQ2xhc3M7DQorfQ0KK0NGWEpTRV9DbGFzcyogQ0ZYSlNFX0NsYXNzOjpHZXRDbGFzc0Zyb21Db250ZXh0KENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwgRlhfQlNUUiBzek5hbWUpDQorew0KKyAgICBmb3IoaW50IGNvdW50ID0gcENvbnRleHQtPm1fcmdDbGFzc2VzLkdldFNpemUoKSwgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgICAgICBDRlhKU0VfQ2xhc3MqIHBDbGFzcyA9IHBDb250ZXh0LT5tX3JnQ2xhc3Nlc1tpXTsNCisgICAgICAgIGlmKHBDbGFzcy0+bV9zekNsYXNzTmFtZSA9PSBzek5hbWUpIHsNCisgICAgICAgICAgICByZXR1cm4gcENsYXNzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oIGIveGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTBmODlmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhKU0VfQ0xBU1NfSF8NCisjZGVmaW5lIEZYSlNFX0NMQVNTX0hfDQorY2xhc3MgQ0ZYSlNFX0NvbnRleHQ7DQorY2xhc3MgQ0ZYSlNFX1ZhbHVlOw0KK2NsYXNzIENGWEpTRV9DbGFzcyA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYSlNFX0NsYXNzKENGWEpTRV9Db250ZXh0KiBscENvbnRleHQpIDogbV9wQ29udGV4dChscENvbnRleHQpIHt9DQorcHVibGljOg0KKyAgICBpbmxpbmUgQ0ZYSlNFX0NvbnRleHQqIEdldENvbnRleHQoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wQ29udGV4dDsNCisgICAgfQ0KKyAgICBpbmxpbmUgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+JiBHZXRUZW1wbGF0ZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtX2hUZW1wbGF0ZTsNCisgICAgfQ0KK3B1YmxpYzoNCisgICAgc3RhdGljIENGWEpTRV9DbGFzcyogQ3JlYXRlKENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbnRpb24sIEZYX0JPT0wgYklzSlNHbG9iYWwgPSBGQUxTRSk7DQorICAgIHN0YXRpYyBDRlhKU0VfQ2xhc3MqIEdldENsYXNzRnJvbUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LCBGWF9CU1RSIHN6TmFtZSk7DQorICAgIHN0YXRpYyB2b2lkIFNldFVwRHluUHJvcEhhbmRsZXIoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LCBDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uKTsNCisgICAgc3RhdGljIHZvaWQgU2V0VXBOYW1lZFByb3BIYW5kbGVyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4mIGhPYmplY3RUZW1wbGF0ZSwgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uKTsNCitwcm90ZWN0ZWQ6DQorICAgIENGWF9CeXRlU3RyaW5nCQkJCQkJCW1fc3pDbGFzc05hbWU7DQorICAgIENGWEpTRV9Db250ZXh0KgkJCQkJCQltX3BDb250ZXh0Ow0KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4JbV9oVGVtcGxhdGU7DQorICAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ29udGV4dDsNCisgICAgZnJpZW5kIGNsYXNzIENGWEpTRV9WYWx1ZTsNCit9Ow0KK3N0cnVjdCBDRlhKU0VfQXJndW1lbnRzSW1wbCB7DQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+KgltX3BJbmZvOw0KKyAgICBDRlhKU0VfVmFsdWUqCQkJCQkJCQltX3BSZXRWYWx1ZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuY3BwIGIveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkOTc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICIuLi8uLi9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmeHY4LmgiDQorI2luY2x1ZGUgImNvbnRleHQuaCINCisjaW5jbHVkZSAiY2xhc3MuaCINCisjaW5jbHVkZSAidmFsdWUuaCINCisjaW5jbHVkZSAic2NvcGVfaW5saW5lLmgiDQorI2luY2x1ZGUgInV0aWxfaW5saW5lLmgiDQorRlhKU0VfSENPTlRFWFQJRlhKU0VfQ29udGV4dF9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUsIGNvbnN0IEZYSlNFX0NMQVNTKiBscEdsb2JhbENsYXNzICwgRlhfTFBWT0lEIGxwR2xvYmFsT2JqZWN0ICkNCit7DQorICAgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IENGWEpTRV9Db250ZXh0OjpDcmVhdGUocmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGhSdW50aW1lKSwgbHBHbG9iYWxDbGFzcywgbHBHbG9iYWxPYmplY3QpOw0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IQ09OVEVYVD4ocENvbnRleHQpOw0KK30NCit2b2lkIEZYSlNFX0NvbnRleHRfUmVsZWFzZShGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCkNCit7DQorICAgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQorICAgIGlmKHBDb250ZXh0KSB7DQorICAgICAgICBkZWxldGUgcENvbnRleHQ7DQorICAgIH0NCit9DQorRlhKU0VfSFZBTFVFIEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KEZYSlNFX0hDT05URVhUIGhDb250ZXh0KQ0KK3sNCisgICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgICAgaWYoIXBDb250ZXh0KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShwQ29udGV4dC0+R2V0UnVudGltZSgpKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICBwQ29udGV4dC0+R2V0R2xvYmFsT2JqZWN0KGxwVmFsdWUpOw0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwVmFsdWUpOw0KK30NCitGWEpTRV9IUlVOVElNRSAgRlhKU0VfQ29udGV4dF9HZXRSdW50aW1lKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KQ0KK3sNCisgICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgICAgcmV0dXJuIHBDb250ZXh0ID8gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4ocENvbnRleHQtPkdldFJ1bnRpbWUoKSkgOiBOVUxMOw0KK30NCitzdGF0aWMgRlhfTFBDU1RSIHN6Q29tcGF0aWJsZU1vZGVTY3JpcHRzW10gPSB7DQorICAgICIoZnVuY3Rpb24gKGdsb2JhbCwgbGlzdCkgeyAndXNlIHN0cmljdCc7IHZhciBvYmpuYW1lOyBmb3IgKG9iam5hbWUgaW4gbGlzdCkgeyB2YXIgZ2xvYmFsb2JqID0gZ2xvYmFsW29iam5hbWVdO1xuXA0KKwkJCWlmIChnbG9iYWxvYmopIHsgbGlzdFtvYmpuYW1lXS5mb3JFYWNoKCBmdW5jdGlvbiAobmFtZSkgeyBpZiAoIWdsb2JhbG9ialtuYW1lXSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsb2JqLCBuYW1lLCB7d3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogXG5cDQorCQkJKGZ1bmN0aW9uIChvYmopIHtcblwNCisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcblwNCisJCXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgYXJndW1lbnQgMCB3aGVuIGNhbGxpbmcgZnVuY3Rpb24gJyArIG9iam5hbWUgKyAnLicgKyBuYW1lKTtcblwNCisJfVxuXA0KKwlyZXR1cm4gZ2xvYmFsb2JqLnByb3RvdHlwZVtuYW1lXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuXA0KK30pfSk7fX0pO319fSh0aGlzLCB7U3RyaW5nOiBbJ3N1YnN0cicsICd0b1VwcGVyQ2FzZSddfSkpOyIsDQorfTsNCit2b2lkIEZYSlNFX0NvbnRleHRfRW5hYmxlQ29tcGF0aWJsZU1vZGUoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIEZYX0RXT1JEIGR3Q29tcGF0aWJsZUZsYWdzKQ0KK3sNCisgICAgZm9yIChGWF9VSU5UMzIgaSA9IDA7IGkgPCAoRlhfVUlOVDMyKUZYSlNFX0NPTVBBVElCTEVNT0RFRkxBR0NPVU5UOyBpKyspIHsNCisgICAgICAgIGlmIChkd0NvbXBhdGlibGVGbGFncyAmICgxIDw8IGkpKSB7DQorICAgICAgICAgICAgRlhKU0VfRXhlY3V0ZVNjcmlwdChoQ29udGV4dCwgc3pDb21wYXRpYmxlTW9kZVNjcmlwdHNbaV0sIE5VTEwsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KK0ZYX0JPT0wJRlhKU0VfRXhlY3V0ZVNjcmlwdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgRlhfTFBDU1RSIHN6U2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWEpTRV9IVkFMVUUgaE5ld1RoaXNPYmplY3QgKQ0KK3sNCisgICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgICAgQVNTRVJUKHBDb250ZXh0KTsNCisgICAgcmV0dXJuIHBDb250ZXh0LT5FeGVjdXRlU2NyaXB0KHN6U2NyaXB0LCByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhSZXRWYWx1ZSksIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaE5ld1RoaXNPYmplY3QpKTsNCit9DQordjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsIHY4OjpUcnlDYXRjaCYgdHJ5Y2F0Y2gpDQorew0KKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhSZXR1cm5WYWx1ZSA9IHY4OjpPYmplY3Q6Ok5ldyhwSXNvbGF0ZSk7DQorICAgIGlmICh0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhFeGNlcHRpb24gPSB0cnljYXRjaC5FeGNlcHRpb24oKTsNCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok1lc3NhZ2U+IGhNZXNzYWdlID0gdHJ5Y2F0Y2guTWVzc2FnZSgpOw0KKyAgICAgICAgaWYgKGhFeGNlcHRpb24tPklzT2JqZWN0KCkpIHsNCisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWU7DQorICAgICAgICAgICAgaFZhbHVlID0gaEV4Y2VwdGlvbi5Bczx2ODo6T2JqZWN0PigpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJuYW1lIikpOw0KKyAgICAgICAgICAgIGlmKGhWYWx1ZS0+SXNTdHJpbmcoKSB8fCBoVmFsdWUtPklzU3RyaW5nT2JqZWN0KCkpIHsNCisgICAgICAgICAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMCwgaFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgwLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIkVycm9yIikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBoVmFsdWUgPSBoRXhjZXB0aW9uLkFzPHY4OjpPYmplY3Q+KCktPkdldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIm1lc3NhZ2UiKSk7DQorICAgICAgICAgICAgaWYoaFZhbHVlLT5Jc1N0cmluZygpIHx8IGhWYWx1ZS0+SXNTdHJpbmdPYmplY3QoKSkgew0KKyAgICAgICAgICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgxLCBoVmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDEsIGhNZXNzYWdlLT5HZXQoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgwLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIkVycm9yIikpOw0KKyAgICAgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDEsIGhNZXNzYWdlLT5HZXQoKSk7DQorICAgICAgICB9DQorICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgyLCBoRXhjZXB0aW9uKTsNCisgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDMsIHY4OjpJbnRlZ2VyOjpOZXcocElzb2xhdGUsIGhNZXNzYWdlLT5HZXRMaW5lTnVtYmVyKCkpKTsNCisgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDQsIGhNZXNzYWdlLT5HZXRTb3VyY2VMaW5lKCkpOw0KKyAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoNSwgdjg6OkludGVnZXI6Ok5ldyhwSXNvbGF0ZSwgaE1lc3NhZ2UtPkdldFN0YXJ0Q29sdW1uKCkpKTsNCisgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDYsIHY4OjpJbnRlZ2VyOjpOZXcocElzb2xhdGUsIGhNZXNzYWdlLT5HZXRFbmRDb2x1bW4oKSkpOw0KKyAgICB9DQorICAgIHJldHVybiBoUmV0dXJuVmFsdWU7DQorfQ0KK0ZYX0JPT0wJRlhKU0VfUmV0dXJuVmFsdWVfR2V0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBDRlhfQnl0ZVN0cmluZyYgdXRmOE5hbWUsIENGWF9CeXRlU3RyaW5nJiB1dGY4TWVzc2FnZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFJldFZhbHVlKTsNCisgICAgaWYoIWxwVmFsdWUpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBscFZhbHVlLT5HZXRJc29sYXRlKCk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhwSXNvbGF0ZSwgbHBWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICAgIGlmKCFoVmFsdWUtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgaFN0cmluZ1ZhbDAoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCgwKS0+VG9TdHJpbmcoKSk7DQorICAgIHV0ZjhOYW1lID0gKmhTdHJpbmdWYWwwOw0KKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgaFN0cmluZ1ZhbDEoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCgxKS0+VG9TdHJpbmcoKSk7DQorICAgIHV0ZjhNZXNzYWdlID0gKmhTdHJpbmdWYWwxOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBGWEpTRV9SZXR1cm5WYWx1ZV9HZXRMaW5lSW5mbyhGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWF9JTlQzMiYgbkxpbmUsIEZYX0lOVDMyJiBuQ29sKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpOw0KKyAgICBpZighbHBWYWx1ZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwVmFsdWUtPkdldElzb2xhdGUoKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBscFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgaWYoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG5MaW5lID0gaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCgzKS0+VG9JbnQzMigpLT5WYWx1ZSgpOw0KKyAgICBuQ29sID0gaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCg1KS0+VG9JbnQzMigpLT5WYWx1ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYSlNFX0NvbnRleHQqIENGWEpTRV9Db250ZXh0OjpDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBjb25zdCBGWEpTRV9DTEFTUyogbHBHbG9iYWxDbGFzcyAsIEZYX0xQVk9JRCBscEdsb2JhbE9iamVjdCApDQorew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUocElzb2xhdGUpOw0KKyAgICBDRlhKU0VfQ29udGV4dCogcENvbnRleHQgPSBGWF9ORVcgQ0ZYSlNFX0NvbnRleHQocElzb2xhdGUpOw0KKyAgICBDRlhKU0VfQ2xhc3MqIGxwR2xvYmFsQ2xhc3NPYmogPSBOVUxMOw0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBoT2JqZWN0VGVtcGxhdGU7DQorICAgIGlmKGxwR2xvYmFsQ2xhc3MpIHsNCisgICAgICAgIGxwR2xvYmFsQ2xhc3NPYmogPSBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShwQ29udGV4dCwgbHBHbG9iYWxDbGFzcywgVFJVRSk7DQorICAgICAgICBBU1NFUlQobHBHbG9iYWxDbGFzc09iaik7DQorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhGdW5jdGlvblRlbXBsYXRlID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHBJc29sYXRlLCBscEdsb2JhbENsYXNzT2JqLT5tX2hUZW1wbGF0ZSk7DQorICAgICAgICBoT2JqZWN0VGVtcGxhdGUgPSBoRnVuY3Rpb25UZW1wbGF0ZS0+SW5zdGFuY2VUZW1wbGF0ZSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgaE9iamVjdFRlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsNCisgICAgICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDEpOw0KKyAgICB9DQorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaE5ld0NvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KHBJc29sYXRlLCBOVUxMLCBoT2JqZWN0VGVtcGxhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGhSb290Q29udGV4dCA9IHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCk7DQorICAgIGhOZXdDb250ZXh0LT5TZXRTZWN1cml0eVRva2VuKGhSb290Q29udGV4dC0+R2V0U2VjdXJpdHlUb2tlbigpKTsNCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhHbG9iYWxPYmplY3QgPSBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTmV3Q29udGV4dCk7DQorICAgIEZYSlNFX1VwZGF0ZU9iamVjdEJpbmRpbmcoaEdsb2JhbE9iamVjdCwgbHBHbG9iYWxPYmplY3QpOw0KKyAgICBwQ29udGV4dC0+bV9oQ29udGV4dC5SZXNldChwSXNvbGF0ZSwgaE5ld0NvbnRleHQpOw0KKyAgICBpZiAobHBHbG9iYWxDbGFzcykgew0KKyAgICAgICAgaWYobHBHbG9iYWxDbGFzcy0+ZHluTWV0aG9kQ2FsbCB8fCBscEdsb2JhbENsYXNzLT5keW5Qcm9wR2V0dGVyIHx8IGxwR2xvYmFsQ2xhc3MtPmR5blByb3BTZXR0ZXIgfHwgbHBHbG9iYWxDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIpIHsNCisgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUocElzb2xhdGUpOw0KKyAgICAgICAgICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGhHbG9iYWxPYmplY3QpOw0KKyAgICAgICAgICAgIENGWEpTRV9DbGFzczo6U2V0VXBEeW5Qcm9wSGFuZGxlcihwQ29udGV4dCwgbHBUaGlzVmFsdWUsIGxwR2xvYmFsQ2xhc3MpOw0KKyAgICAgICAgICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgICAgICAgICAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIHBDb250ZXh0Ow0KK30NCitDRlhKU0VfQ29udGV4dDo6fkNGWEpTRV9Db250ZXh0KCkNCit7DQorICAgIGZvcihGWF9JTlQzMiBpID0gMCwgY291bnQgPSBtX3JnQ2xhc3Nlcy5HZXRTaXplKCk7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgICAgICBDRlhKU0VfQ2xhc3MqIHBDbGFzcyA9IG1fcmdDbGFzc2VzW2ldOw0KKyAgICAgICAgaWYocENsYXNzKSB7DQorICAgICAgICAgICAgZGVsZXRlIHBDbGFzczsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBtX3JnQ2xhc3Nlcy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRlhKU0VfQ29udGV4dDo6R2V0R2xvYmFsT2JqZWN0KENGWEpTRV9WYWx1ZSogcFZhbHVlKQ0KK3sNCisgICAgQVNTRVJUKHBWYWx1ZSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUodGhpcyk7DQorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9wSXNvbGF0ZSwgbV9oQ29udGV4dCk7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0gaENvbnRleHQtPkdsb2JhbCgpOw0KKyAgICBwVmFsdWUtPkZvcmNlU2V0VmFsdWUoaEdsb2JhbE9iamVjdCk7DQorfQ0KK0ZYX0JPT0wJQ0ZYSlNFX0NvbnRleHQ6OkV4ZWN1dGVTY3JpcHQoRlhfTFBDU1RSIHN6U2NyaXB0LCBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0ICkNCit7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUodGhpcyk7DQorICAgIHY4OjpUcnlDYXRjaAkJCXRyeWNhdGNoOw0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4JaFNjcmlwdFN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6U2NyaXB0KTsNCisgICAgaWYobHBOZXdUaGlzT2JqZWN0ID09IE5VTEwpIHsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBoU2NyaXB0ID0gdjg6OlNjcmlwdDo6Q29tcGlsZShoU2NyaXB0U3RyaW5nKTsNCisgICAgICAgIGlmKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IGhTY3JpcHQtPlJ1bigpOw0KKyAgICAgICAgICAgIGlmKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgICAgICAgICBpZihscFJldFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKGxwUmV0VmFsdWUpIHsNCisgICAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4JaE5ld1RoaXMgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwTmV3VGhpc09iamVjdC0+bV9oVmFsdWUpOw0KKyAgICAgICAgQVNTRVJUKCFoTmV3VGhpcy5Jc0VtcHR5KCkpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+CWhXcmFwcGVyID0gdjg6OlNjcmlwdDo6Q29tcGlsZSh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCAiKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2YWwoYXJndW1lbnRzWzBdKTsgfSkiKSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPgloV3JhcHBlclZhbHVlID0gaFdyYXBwZXItPlJ1bigpOw0KKyAgICAgICAgQVNTRVJUKGhXcmFwcGVyVmFsdWUtPklzRnVuY3Rpb24oKSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPgloV3JhcHBlckZuICAgID0gaFdyYXBwZXJWYWx1ZS5Bczx2ODo6RnVuY3Rpb24+KCk7DQorICAgICAgICBpZighdHJ5Y2F0Y2guSGFzQ2F1Z2h0KCkpIHsNCisgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmdBcmdzW10gPSB7aFNjcmlwdFN0cmluZ307DQorICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gaFdyYXBwZXJGbi0+Q2FsbChoTmV3VGhpcy5Bczx2ODo6T2JqZWN0PigpLCAxLCByZ0FyZ3MpOw0KKyAgICAgICAgICAgIGlmKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgICAgICAgICBpZihscFJldFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmKGxwUmV0VmFsdWUpIHsNCisgICAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuaCBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc5Y2Q5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEpTRV9DT05URVhUX0hfDQorI2RlZmluZSBGWEpTRV9DT05URVhUX0hfDQorY2xhc3MgQ0ZYSlNFX0NsYXNzOw0KK2NsYXNzIENGWEpTRV9WYWx1ZTsNCitjbGFzcyBDRlhKU0VfQ29udGV4dCA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYSlNFX0NvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKSA6IG1fcElzb2xhdGUocElzb2xhdGUpIHt9DQorcHVibGljOg0KKyAgICBzdGF0aWMgQ0ZYSlNFX0NvbnRleHQqIENyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsIGNvbnN0IEZYSlNFX0NMQVNTKiBscEdsb2JhbENsYXNzID0gTlVMTCwgRlhfTFBWT0lEIGxwR2xvYmFsT2JqZWN0ID0gTlVMTCk7DQorICAgIH5DRlhKU0VfQ29udGV4dCgpOw0KKyAgICBWOF9JTkxJTkUgdjg6Oklzb2xhdGUqIEdldFJ1bnRpbWUodm9pZCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcElzb2xhdGU7DQorICAgIH0NCisgICAgdm9pZCBHZXRHbG9iYWxPYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOw0KKyAgICBGWF9CT09MCUV4ZWN1dGVTY3JpcHQoRlhfTFBDU1RSIHN6U2NyaXB0LCBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0ID0gTlVMTCk7DQorcHJvdGVjdGVkOg0KKyAgICBDRlhKU0VfQ29udGV4dCgpOw0KKyAgICBDRlhKU0VfQ29udGV4dChjb25zdCBDRlhKU0VfQ29udGV4dCYpOw0KKyAgICBDRlhKU0VfQ29udGV4dCYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYSlNFX0NvbnRleHQmKTsNCitwcm90ZWN0ZWQ6DQorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PgkJCW1faENvbnRleHQ7DQorICAgIHY4OjpJc29sYXRlKgkJCQkJCW1fcElzb2xhdGU7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPENGWEpTRV9DbGFzcyo+CW1fcmdDbGFzc2VzOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZYSlNFX0NsYXNzOw0KKyAgICBmcmllbmQgY2xhc3MgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dDsNCisgICAgZnJpZW5kIGNsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQ7DQorfTsNCit2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OlRyeUNhdGNoJiB0cnljYXRjaCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy9keW5wcm9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAzZGNmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAKQEAgLTAsMCArMSwyODQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZ4djguaCINCisjaW5jbHVkZSAiY2xhc3MuaCINCisjaW5jbHVkZSAidmFsdWUuaCINCitzdGF0aWMgdm9pZCBGWEpTRV9EeW5Qcm9wR2V0dGVyQWRhcHRlcl9NZXRob2RDYWxsYmFjawkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGluZm8uRGF0YSgpLkFzPHY4OjpPYmplY3Q+KCk7DQorICAgIEZYSlNFX0NMQVNTKiAgICAgICAgICBscENsYXNzCQk9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaENhbGxCYWNrSW5mby0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUJCT0gaENhbGxCYWNrSW5mby0+R2V0SW50ZXJuYWxGaWVsZCgxKS5Bczx2ODo6U3RyaW5nPigpOw0KKyAgICBBU1NFUlQobHBDbGFzcyAmJiAhaFByb3BOYW1lLklzRW1wdHkoKSk7DQorICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICAgIENGWF9CeXRlU3RyaW5nQwkgICAgICBzekZ4UHJvcE5hbWUJPSAqc3pQcm9wTmFtZTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIENGWEpTRV9Bcmd1bWVudHNJbXBsIGltcGwgPSB7JmluZm8sIGxwUmV0VmFsdWV9Ow0KKyAgICBscENsYXNzLT5keW5NZXRob2RDYWxsKHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0FyZ3VtZW50cyY+KGltcGwpKTsNCisgICAgaWYoIWxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuSXNFbXB0eSgpKSB7DQorICAgICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBscFJldFZhbHVlOw0KKyAgICBscFJldFZhbHVlID0gTlVMTDsNCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyCQkJCQkoY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MsIEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgRlhfQlNUUiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQVNTRVJUKGxwQ2xhc3MpOw0KKyAgICBGWF9JTlQzMiBuUHJvcFR5cGUgPSBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlciA9PSBOVUxMID8gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eSA6IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIEZBTFNFKTsNCisgICAgaWYoblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkpIHsNCisgICAgICAgIGlmKGxwQ2xhc3MtPmR5blByb3BHZXR0ZXIpIHsNCisgICAgICAgICAgICBscENsYXNzLT5keW5Qcm9wR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZihuUHJvcFR5cGUgPT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2QpIHsNCisgICAgICAgIGlmKGxwQ2xhc3MtPmR5bk1ldGhvZENhbGwgJiYgaFZhbHVlKSB7DQorICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICAgICAgICAgIHY4OjpJc29sYXRlKglwSXNvbGF0ZSA9IGxwVmFsdWUtPkdldElzb2xhdGUoKTsNCisgICAgICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaHNjb3BlKHBJc29sYXRlKTsNCisgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBoQ2FsbEJhY2tJbmZvVGVtcGxhdGUgPSB2ODo6T2JqZWN0VGVtcGxhdGU6Ok5ldygpOw0KKyAgICAgICAgICAgIGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDIpOw0KKyAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2FsbEJhY2tJbmZvID0gaENhbGxCYWNrSW5mb1RlbXBsYXRlLT5OZXdJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIGhDYWxsQmFja0luZm8tPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzKSk7DQorICAgICAgICAgICAgaENhbGxCYWNrSW5mby0+U2V0SW50ZXJuYWxGaWVsZCgxLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3pQcm9wTmFtZS5HZXRQdHIoKSksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgICAgICBscFZhbHVlLT5Gb3JjZVNldFZhbHVlKHY4OjpGdW5jdGlvbjo6TmV3KGxwVmFsdWUtPkdldElzb2xhdGUoKSwgRlhKU0VfRHluUHJvcEdldHRlckFkYXB0ZXJfTWV0aG9kQ2FsbGJhY2ssIGhDYWxsQmFja0luZm8pKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9EeW5Qcm9wU2V0dGVyQWRhcHRlcgkJCQkJKGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzLCBGWEpTRV9IT0JKRUNUIGhPYmplY3QsIEZYX0JTVFIgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIEFTU0VSVChscENsYXNzKTsNCisgICAgRlhfSU5UMzIgblByb3BUeXBlID0gbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gTlVMTCA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSk7DQorICAgIGlmKG5Qcm9wVHlwZSAhPSBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZCkgew0KKyAgICAgICAgaWYobHBDbGFzcy0+ZHluUHJvcFNldHRlcikgew0KKyAgICAgICAgICAgIGxwQ2xhc3MtPmR5blByb3BTZXR0ZXIoaE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhbHVlKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCitzdGF0aWMgRlhfQk9PTCBGWEpTRV9EeW5Qcm9wUXVlcnlBZGFwdGVyCQkJCShjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcywgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBGWF9CU1RSIHN6UHJvcE5hbWUpDQorew0KKyAgICBBU1NFUlQobHBDbGFzcyk7DQorICAgIEZYX0lOVDMyIG5Qcm9wVHlwZSA9IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyID09IE5VTEwgPyBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5IDogbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIoaE9iamVjdCwgc3pQcm9wTmFtZSwgVFJVRSk7DQorICAgIHJldHVybiBuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWEpTRV9EeW5Qcm9wRGVsZXRlckFkYXB0ZXIJCQkJCShjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcywgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBGWF9CU1RSIHN6UHJvcE5hbWUpDQorew0KKyAgICBBU1NFUlQobHBDbGFzcyk7DQorICAgIEZYX0lOVDMyIG5Qcm9wVHlwZSA9IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyID09IE5VTEwgPyBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5IDogbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIoaE9iamVjdCwgc3pQcm9wTmFtZSwgRkFMU0UpOw0KKyAgICBpZihuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2QpIHsNCisgICAgICAgIGlmKGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKSB7DQorICAgICAgICAgICAgcmV0dXJuIGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKGhPYmplY3QsIHN6UHJvcE5hbWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkgPyBGQUxTRSA6IFRSVUU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX2dldHRlcihjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCit7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2FsbEJhY2tJbmZvID0gaW5mby5EYXRhKCkuQXM8djg6Ok9iamVjdD4oKTsNCisgICAgRlhKU0VfQ0xBU1MqICAgICAgICAgIGxwQ2xhc3MJCT0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihoQ2FsbEJhY2tJbmZvLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsNCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZQkJPSBoQ2FsbEJhY2tJbmZvLT5HZXRJbnRlcm5hbEZpZWxkKDEpLkFzPHY4OjpTdHJpbmc+KCk7DQorICAgIEFTU0VSVChscENsYXNzICYmICFoUHJvcE5hbWUuSXNFbXB0eSgpKTsNCisgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDCSAgICAgIHN6RnhQcm9wTmFtZQk9ICpzelByb3BOYW1lOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCisgICAgRlhKU0VfRHluUHJvcEdldHRlckFkYXB0ZXIobHBDbGFzcywgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnhQcm9wTmFtZSwgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwTmV3VmFsdWUpKTsNCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscE5ld1ZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICAgIGRlbGV0ZSBscE5ld1ZhbHVlOw0KKyAgICBscE5ld1ZhbHVlID0gTlVMTDsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcl9zZXR0ZXIoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGluZm8uRGF0YSgpLkFzPHY4OjpPYmplY3Q+KCk7DQorICAgIEZYSlNFX0NMQVNTKiAgICAgICAgICBscENsYXNzCQk9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaENhbGxCYWNrSW5mby0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUJCT0gaENhbGxCYWNrSW5mby0+R2V0SW50ZXJuYWxGaWVsZCgxKS5Bczx2ODo6U3RyaW5nPigpOw0KKyAgICBBU1NFUlQobHBDbGFzcyAmJiAhaFByb3BOYW1lLklzRW1wdHkoKSk7DQorICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICAgIENGWF9CeXRlU3RyaW5nQwkgICAgICBzekZ4UHJvcE5hbWUJPSAqc3pQcm9wTmFtZTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscE5ld1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICAgIGxwTmV3VmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mb1swXSk7DQorICAgIEZYSlNFX0R5blByb3BTZXR0ZXJBZGFwdGVyKGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscE5ld1ZhbHVlKSk7DQorICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KKyAgICBkZWxldGUgbHBOZXdWYWx1ZTsNCisgICAgbHBOZXdWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IJKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKQ0KK3sNCisgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICAgIGlmICghbHBDbGFzcykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHY4OjpJc29sYXRlKglwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0gaW5mb1swXS0+VG9TdHJpbmcoKTsNCisgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDCQkgIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhDYWxsQmFja0luZm9UZW1wbGF0ZSA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KCk7DQorICAgIGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDIpOw0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+TmV3SW5zdGFuY2UoKTsNCisgICAgaENhbGxCYWNrSW5mby0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3MpKTsNCisgICAgaENhbGxCYWNrSW5mby0+U2V0SW50ZXJuYWxGaWVsZCgxLCBoUHJvcE5hbWUpOw0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFByb3BEZXNjcmlwdG9yID0gdjg6Ok9iamVjdDo6TmV3KHBJc29sYXRlKTsNCisgICAgaFByb3BEZXNjcmlwdG9yLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdldCIpLCB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcl9nZXR0ZXIsIGhDYWxsQmFja0luZm8pKTsNCisgICAgaFByb3BEZXNjcmlwdG9yLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInNldCIpLCB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcl9zZXR0ZXIsIGhDYWxsQmFja0luZm8pKTsNCisgICAgaFByb3BEZXNjcmlwdG9yLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImVudW1lcmFibGUiKSwgdjg6OkJvb2xlYW46Ok5ldyhwSXNvbGF0ZSwgZmFsc2UpKTsNCisgICAgaFByb3BEZXNjcmlwdG9yLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImNvbmZpZ3VyYWJsZSIpLCB2ODo6Qm9vbGVhbjo6TmV3KHBJc29sYXRlLCB0cnVlKSk7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoaFByb3BEZXNjcmlwdG9yKTsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldFByb3BlcnR5RGVzY3JpcHRvcgkJKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKQ0KK3sNCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2hhaW5PYmogPSBpbmZvLlRoaXMoKS0+R2V0UHJvdG90eXBlKCkuQXM8djg6Ok9iamVjdD4oKTsNCisgICAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGZuU291cmNlID0gdjg6OlNjcmlwdDo6Q29tcGlsZSh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihmdW5jdGlvbiAobywgbmFtZSkgeyB2YXIgZm4sIHgsIGQ7IGZuID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgeCA9IG87IHdoaWxlKHggJiYgIShkID0gZm4oeCwgbmFtZSkpKXt4ID0geC5fX3Byb3RvX187fSByZXR1cm4gZDsgfSkiKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGZuID0gZm5Tb3VyY2UtPlJ1bigpLkFzPHY4OjpGdW5jdGlvbj4oKTsNCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJnQXJnc1tdID0ge2hDaGFpbk9iaiwgaW5mb1swXX07DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhDaGFpbkRlc2NyaXB0b3IgPSBmbi0+Q2FsbChpbmZvLlRoaXMoKSwgMiwgcmdBcmdzKTsNCisgICAgaWYoIWhDaGFpbkRlc2NyaXB0b3IuSXNFbXB0eSgpICYmIGhDaGFpbkRlc2NyaXB0b3ItPklzT2JqZWN0KCkpIHsNCisgICAgICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoaENoYWluRGVzY3JpcHRvcik7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluZm8pOw0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eU5hbWVzCQkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICB2ODo6SXNvbGF0ZSoJcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlKHBJc29sYXRlKTsNCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6QXJyYXk6Ok5ldyhwSXNvbGF0ZSkpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0UHJvcGVydHlOYW1lcwkJCShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCit7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2hhaW5PYmogPSBpbmZvLlRoaXMoKS0+R2V0UHJvdG90eXBlKCkuQXM8djg6Ok9iamVjdD4oKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaENoYWluUHJvcGVydHlOYW1lcyA9IGhDaGFpbk9iai0+R2V0UHJvcGVydHlOYW1lcygpOw0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGhDaGFpblByb3BlcnR5TmFtZXMpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVmaW5lUHJvcGVydHkJCQkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgICAgaWYgKCFscENsYXNzKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgdjg6Oklzb2xhdGUqCXBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUgPSBpbmZvWzBdLT5Ub1N0cmluZygpOw0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFByb3BEZXNjcmlwdG9yID0gaW5mb1sxXS0+VG9PYmplY3QoKTsNCisgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgICAgaWYoIWhQcm9wRGVzY3JpcHRvci0+SGFzKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAidmFsdWUiKSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gaFByb3BEZXNjcmlwdG9yLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJ2YWx1ZSIpKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDCQkgIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCisgICAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUoaFByb3BWYWx1ZSk7DQorICAgIEZYSlNFX0R5blByb3BTZXR0ZXJBZGFwdGVyKGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscFByb3BWYWx1ZSkpOw0KKyAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCisgICAgZGVsZXRlIGxwUHJvcFZhbHVlOw0KKyAgICBscFByb3BWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19kZWxldGUJCQkJCShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCit7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodHJ1ZSk7DQorICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgICBpZiAoIWxwQ2xhc3MpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB2ODo6SXNvbGF0ZSoJcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlKHBJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZSA9IGluZm9bMF0tPlRvU3RyaW5nKCk7DQorICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICAgIENGWF9CeXRlU3RyaW5nQwkJICBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoRlhKU0VfRHluUHJvcERlbGV0ZXJBZGFwdGVyKGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUpID8gdHJ1ZSA6IGZhbHNlKTsNCisgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19maXgJCQkJCQkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQorew0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0VW5kZWZpbmVkKCk7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4X05hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpJbnRlZ2VyPiYgaW5mbykNCit7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQorICAgIGlmICh0aGlzT2JqZWN0LT5IYXNSZWFsTmFtZWRQcm9wZXJ0eShwcm9wZXJ0eSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgICAgdjg6Oklzb2xhdGUqCXBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKHByb3BlcnR5KTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDCQkgIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHRoaXNPYmplY3QpOw0KKyAgICBpZihGWEpTRV9EeW5Qcm9wUXVlcnlBZGFwdGVyKGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUpKSB7DQorICAgICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHY4OjpEb250RGVsZXRlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIGNvbnN0IEZYX0lOVDMyIGlWOEFic2VudCA9IDY0Ow0KKyAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChpVjhBYnNlbnQpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOF9OYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbykNCit7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQorICAgIGlmICh0aGlzT2JqZWN0LT5IYXNSZWFsTmFtZWRQcm9wZXJ0eShwcm9wZXJ0eSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgICAgdjg6Oklzb2xhdGUqCXBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKHByb3BlcnR5KTsNCisgICAgQ0ZYX0J5dGVTdHJpbmdDCQkgIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHRoaXNPYmplY3QpOw0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KEZYSlNFX0R5blByb3BEZWxldGVyQWRhcHRlcihscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lKSA/IHRydWUgOiBmYWxzZSk7DQorICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK30NCit2b2lkIENGWEpTRV9DbGFzczo6U2V0VXBEeW5Qcm9wSGFuZGxlcihDRlhKU0VfQ29udGV4dCogcENvbnRleHQsIENGWEpTRV9WYWx1ZSogcFZhbHVlLCBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24pDQorew0KKyAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwVmFsdWUtPkdldElzb2xhdGUoKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCBzY29wZShwSXNvbGF0ZSwgcENvbnRleHQpOw0KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGhDb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBJc29sYXRlLCBwQ29udGV4dCA/IHBDb250ZXh0LT5tX2hDb250ZXh0IDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCk7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoT2JqZWN0ID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcocElzb2xhdGUsIHBWYWx1ZS0+bV9oVmFsdWUuQXM8djg6Ok9iamVjdD4oKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoSGFybW9ueVByb3h5T2JqID0gIGhDb250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiUHJveHkiKSkuQXM8djg6Ok9iamVjdD4oKTsNCisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gaEhhcm1vbnlQcm94eUNyZWF0ZUZuID0gaEhhcm1vbnlQcm94eU9iai0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiY3JlYXRlIikpLkFzPHY4OjpGdW5jdGlvbj4oKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9sZFByb3RvdHlwZSA9IGhPYmplY3QtPkdldFByb3RvdHlwZSgpOw0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFRyYXBwZXIgPSB2ODo6T2JqZWN0OjpOZXcocElzb2xhdGUpOw0KKyAgICBoVHJhcHBlci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiKSwJdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgICBoVHJhcHBlci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXRQcm9wZXJ0eURlc2NyaXB0b3IiKSwJCXY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0UHJvcGVydHlEZXNjcmlwdG9yLAl2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgICAgaFRyYXBwZXItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIpLAkJdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eU5hbWVzLAkJdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICAgIGhUcmFwcGVyLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdldFByb3BlcnR5TmFtZXMiKSwJCQl2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldFByb3BlcnR5TmFtZXMsCQkJdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICAgIGhUcmFwcGVyLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImRlbGV0ZSIpLAkJCQkJCXY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVsZXRlLAkJCQkJdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICAgIGhUcmFwcGVyLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImRlZmluZVByb3BlcnR5IiksCQkJCXY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVmaW5lUHJvcGVydHksCQkJdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICAgIGhUcmFwcGVyLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImZpeCIpLAkJCQkJCXY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZml4LAkJCQkJCXY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmdBcmdzW10gPSB7aFRyYXBwZXIsIGhPbGRQcm90b3R5cGV9Ow0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3UHJvdG90eXBlID0gaEhhcm1vbnlQcm94eUNyZWF0ZUZuLT5DYWxsKGhIYXJtb255UHJveHlPYmosIDIsIHJnQXJncyk7DQorICAgIGhPYmplY3QtPlNldFByb3RvdHlwZShoTmV3UHJvdG90eXBlKTsNCit9DQordm9pZCBDRlhKU0VfQ2xhc3M6OlNldFVwTmFtZWRQcm9wSGFuZGxlcih2ODo6SXNvbGF0ZSogcElzb2xhdGUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBoT2JqZWN0VGVtcGxhdGUsIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbikNCit7DQorICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoMCwgMCwNCisgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcFR5cGVHZXR0ZXIgPyBGWEpTRV9WOF9OYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjayA6IDAsDQorICAgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BEZWxldGVyID8gRlhKU0VfVjhfTmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjayA6IDAsDQorICAgICAgICAgICAgMCwNCisgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9meHY4LmggYi94ZmEvc3JjL2Z4anNlL3NyYy9meHY4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjN2IzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL2Z4djguaApAQCAtMCwwICsxLDExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgX0ZYX1Y4X0hfCisjZGVmaW5lIF9GWF9WOF9IXworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8bGlicGxhdGZvcm0vbGlicGxhdGZvcm0uaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA2ZjZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgIi4uLy4uL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZ4djguaCINCisjaW5jbHVkZSAicnVudGltZS5oIg0KKyNpbmNsdWRlICJzY29wZV9pbmxpbmUuaCINCitzdGF0aWMgdm9pZCBGWEpTRV9LaWxsVjgoKQ0KK3sNCisgICAgdjg6OlY4OjpEaXNwb3NlKCk7DQorfQ0KK3ZvaWQgRlhKU0VfSW5pdGlhbGl6ZSgpDQorew0KKyAgICBzdGF0aWMgRlhfQk9PTCBiVjhJbml0aWFsaXplZCA9IEZBTFNFOw0KKyAgICBpZiAoYlY4SW5pdGlhbGl6ZWQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBiVjhJbml0aWFsaXplZCA9IFRSVUU7DQorICAgIGF0ZXhpdChGWEpTRV9LaWxsVjgpOw0KKyAgICBGWF9MUENTVFIgc3pDbWRGbGFncyA9DQorICAgICAgICAiLS1oYXJtb255X3Byb3hpZXMgIg0KKyAgICAgICAgIi0tYmxvY2tfY29uY3VycmVudF9yZWNvbXBpbGF0aW9uICINCisgICAgICAgIDsNCisgICAgdjg6OlY4OjpTZXRGbGFnc0Zyb21TdHJpbmcoc3pDbWRGbGFncywgRlhTWVNfc3RybGVuKHN6Q21kRmxhZ3MpKTsNCisgICAgdjg6OlY4OjpJbml0aWFsaXplSUNVKCk7DQorCXY4OjpQbGF0Zm9ybSogcGxhdGZvcm0gPSB2ODo6cGxhdGZvcm06OkNyZWF0ZURlZmF1bHRQbGF0Zm9ybSgpOw0KKwl2ODo6Vjg6OkluaXRpYWxpemVQbGF0Zm9ybShwbGF0Zm9ybSk7DQorICAgIHY4OjpWODo6SW5pdGlhbGl6ZSgpOw0KKyAgICBpZighQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KSB7DQorICAgICAgICBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QgPSBGWF9ORVcgQ0ZYSlNFX1J1bnRpbWVMaXN0Ow0KKyAgICB9DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCit7DQorICAgIHsNCisgICAgICAgIHY4OjpMb2NrZXIgbG9ja2VyKHBJc29sYXRlKTsNCisgICAgICAgIENGWEpTRV9SdW50aW1lRGF0YSAqcFJ1bnRpbWVEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfUnVudGltZURhdGEqPihwSXNvbGF0ZS0+R2V0RGF0YSgwKSk7DQorICAgICAgICBpZihwUnVudGltZURhdGEpIHsNCisgICAgICAgICAgICBwSXNvbGF0ZS0+U2V0RGF0YSgwLCBOVUxMKTsNCisgICAgICAgICAgICBkZWxldGUgcFJ1bnRpbWVEYXRhOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBJc29sYXRlLT5EaXNwb3NlKCk7DQorfQ0KK3ZvaWQgRlhKU0VfRmluYWxpemUoKQ0KK3sNCisgICAgaWYoQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KSB7DQorICAgICAgICBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QtPlJlbW92ZUFsbFJ1bnRpbWVzKEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKTsNCisgICAgICAgIGRlbGV0ZSBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3Q7DQorICAgICAgICBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QgPSBOVUxMOw0KKyAgICB9DQorfQ0KK0ZYSlNFX0hSVU5USU1FCUZYSlNFX1J1bnRpbWVfQ3JlYXRlKCkNCit7DQorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpOZXcoKTsNCisgICAgQVNTRVJUKHBJc29sYXRlICYmIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdCk7DQorICAgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdC0+QXBwZW5kUnVudGltZShwSXNvbGF0ZSk7DQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hSVU5USU1FPihwSXNvbGF0ZSk7DQorfQ0KK3ZvaWQgRlhKU0VfUnVudGltZV9SZWxlYXNlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKQ0KK3sNCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGhSdW50aW1lKTsNCisgICAgaWYocElzb2xhdGUpIHsNCisgICAgICAgIEFTU0VSVChDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QpOw0KKyAgICAgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0LT5SZW1vdmVSdW50aW1lKHBJc29sYXRlLCBGWEpTRV9SdW50aW1lX0Rpc3Bvc2VDYWxsYmFjayk7DQorICAgIH0NCit9DQorQ0ZYSlNFX1J1bnRpbWVEYXRhKiBDRlhKU0VfUnVudGltZURhdGE6OkNyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpDQorew0KKyAgICBDRlhKU0VfUnVudGltZURhdGEqIHBSdW50aW1lRGF0YSA9IEZYX05FVyBDRlhKU0VfUnVudGltZURhdGEocElzb2xhdGUpOw0KKyAgICBBU1NFUlQocFJ1bnRpbWVEYXRhKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKHBJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoRnVuY1RlbXBsYXRlID0gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhwSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KHBJc29sYXRlLCAwLCBoRnVuY1RlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCkpOw0KKyAgICBoQ29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgcElzb2xhdGUpKTsNCisgICAgcFJ1bnRpbWVEYXRhLT5tX2hSb290Q29udGV4dEdsb2JhbFRlbXBsYXRlLlJlc2V0KHBJc29sYXRlLCBoRnVuY1RlbXBsYXRlKTsNCisgICAgcFJ1bnRpbWVEYXRhLT5tX2hSb290Q29udGV4dC5SZXNldChwSXNvbGF0ZSwgaENvbnRleHQpOw0KKyAgICByZXR1cm4gcFJ1bnRpbWVEYXRhOw0KK30NCitDRlhKU0VfUnVudGltZURhdGEqIENGWEpTRV9SdW50aW1lRGF0YTo6R2V0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCit7DQorICAgIEFTU0VSVChwSXNvbGF0ZSk7DQorICAgIENGWEpTRV9SdW50aW1lRGF0YSogcFJ1bnRpbWVEYXRhID0gc3RhdGljX2Nhc3Q8Q0ZYSlNFX1J1bnRpbWVEYXRhKj4ocElzb2xhdGUtPkdldERhdGEoMCkpOw0KKyAgICBpZighcFJ1bnRpbWVEYXRhKSB7DQorICAgICAgICBwUnVudGltZURhdGEgPSBDRlhKU0VfUnVudGltZURhdGE6OkNyZWF0ZShwSXNvbGF0ZSk7DQorICAgICAgICBBU1NFUlQocFJ1bnRpbWVEYXRhKTsNCisgICAgICAgIHBJc29sYXRlLT5TZXREYXRhKDAsIHBSdW50aW1lRGF0YSk7DQorICAgIH0NCisgICAgcmV0dXJuIHBSdW50aW1lRGF0YTsNCit9DQorQ0ZYSlNFX1J1bnRpbWVMaXN0ICogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0ID0gTlVMTDsNCit2b2lkIENGWEpTRV9SdW50aW1lTGlzdDo6QXBwZW5kUnVudGltZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpDQorew0KKyAgICBtX1J1bnRpbWVMaXN0LkFkZChwSXNvbGF0ZSk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSZW1vdmVSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spDQorew0KKyAgICBGWF9JTlQzMiBpSWR4ID0gbV9SdW50aW1lTGlzdC5GaW5kKHBJc29sYXRlLCAwKTsNCisgICAgaWYoaUlkeCA+PSAwKSB7DQorICAgICAgICBtX1J1bnRpbWVMaXN0LlJlbW92ZUF0KGlJZHgsIDEpOw0KKyAgICB9DQorICAgIGlmKGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsNCisgICAgICAgIGxwZm5EaXNwb3NlQ2FsbGJhY2socElzb2xhdGUpOw0KKyAgICB9DQorfQ0KK3ZvaWQgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSZW1vdmVBbGxSdW50aW1lcyhDRlhKU0VfUnVudGltZUxpc3Q6OlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2sgbHBmbkRpc3Bvc2VDYWxsYmFjaykNCit7DQorICAgIEZYX0lOVDMyIGlTaXplID0gbV9SdW50aW1lTGlzdC5HZXRTaXplKCk7DQorICAgIGlmKGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsNCisgICAgICAgIGZvcihGWF9JTlQzMiBpSWR4ID0gMDsgaUlkeCA8IGlTaXplOyBpSWR4KyspIHsNCisgICAgICAgICAgICBscGZuRGlzcG9zZUNhbGxiYWNrKG1fUnVudGltZUxpc3RbaUlkeF0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1fUnVudGltZUxpc3QuUmVtb3ZlQWxsKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaCBiL3hmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU4OTFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEpTRV9SVU5USU1FX0hfDQorI2RlZmluZSBGWEpTRV9SVU5USU1FX0hfDQorY2xhc3MgQ0ZYSlNFX1J1bnRpbWVMaXN0Ow0KK2NsYXNzIENGWEpTRV9SdW50aW1lRGF0YSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgOiBtX3BJc29sYXRlKHBJc29sYXRlKSB7fTsNCitwdWJsaWM6DQorICAgIHN0YXRpYyBDRlhKU0VfUnVudGltZURhdGEqIENyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOw0KKyAgICBzdGF0aWMgQ0ZYSlNFX1J1bnRpbWVEYXRhKiBHZXQodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCitwdWJsaWM6DQorICAgIHY4OjpJc29sYXRlKgkJCQkJCQltX3BJc29sYXRlOw0KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4JbV9oUm9vdENvbnRleHRHbG9iYWxUZW1wbGF0ZTsNCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+CQkJCW1faFJvb3RDb250ZXh0Ow0KK3B1YmxpYzoNCisgICAgc3RhdGljIENGWEpTRV9SdW50aW1lTGlzdCoJZ19SdW50aW1lTGlzdDsNCitwcm90ZWN0ZWQ6DQorICAgIENGWEpTRV9SdW50aW1lRGF0YSgpOw0KKyAgICBDRlhKU0VfUnVudGltZURhdGEoY29uc3QgQ0ZYSlNFX1J1bnRpbWVEYXRhJik7DQorICAgIENGWEpTRV9SdW50aW1lRGF0YSYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYSlNFX1J1bnRpbWVEYXRhJik7DQorfTsNCitjbGFzcyBDRlhKU0VfUnVudGltZUxpc3QgOiBwdWJsaWMgQ0ZYX09iamVjdA0KK3sNCitwdWJsaWM6DQorICAgIHR5cGVkZWYgdm9pZCAoKlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2spKHY4OjpJc29sYXRlKik7DQorcHVibGljOg0KKyAgICB2b2lkIEFwcGVuZFJ1bnRpbWUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCisgICAgdm9pZCBSZW1vdmVSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgUnVudGltZURpc3Bvc2VDYWxsYmFjayBscGZuRGlzcG9zZUNhbGxiYWNrKTsNCisgICAgdm9pZCBSZW1vdmVBbGxSdW50aW1lcyhSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spOw0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8djg6Oklzb2xhdGUqPiBtX1J1bnRpbWVMaXN0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvc2NvcGVfaW5saW5lLmggYi94ZmEvc3JjL2Z4anNlL3NyYy9zY29wZV9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU5MGYzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvc2NvcGVfaW5saW5lLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIEZYSlNFX1NDT1BFX0lOTElORV9IXw0KKyNkZWZpbmUgRlhKU0VfU0NPUEVfSU5MSU5FX0hfDQorI2luY2x1ZGUgInJ1bnRpbWUuaCINCisjaW5jbHVkZSAiY29udGV4dC5oIg0KK2NsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZQ0KK3sNCitwcm90ZWN0ZWQ6DQorICAgIHY4OjpJc29sYXRlKgkJbV9pc29sYXRlOw0KKyAgICB2ODo6TG9ja2VyCQkJbV9sb2NrZXI7DQorICAgIHY4OjpJc29sYXRlOjpTY29wZQltX2lzY29wZTsNCisgICAgdjg6OkhhbmRsZVNjb3BlCQltX2hzY29wZTsNCitwdWJsaWM6DQorICAgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIDogbV9pc29sYXRlKHBJc29sYXRlKSwgbV9sb2NrZXIocElzb2xhdGUpLCBtX2lzY29wZShwSXNvbGF0ZSksIG1faHNjb3BlKHBJc29sYXRlKSB7fQ0KKyAgICB2ODo6SXNvbGF0ZSoJCQlHZXRJc29sYXRlKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faXNvbGF0ZTsNCisgICAgfQ0KK3ByaXZhdGU6DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZShjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUmKTsNCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlJik7DQorICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSk7DQorICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOw0KK307DQorY2xhc3MgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQNCit7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBtX3BhcmVudDsNCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlCW1fY3Njb3BlOw0KK3B1YmxpYzoNCisgICAgZXhwbGljaXQgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKSA6IG1fcGFyZW50KHBJc29sYXRlKSwgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBJc29sYXRlLAlDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KSkge30NCitwcml2YXRlOg0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dChjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCYpOw0KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCYpOw0KKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCit9Ow0KK2NsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQNCit7DQorICAgIENGWEpTRV9Db250ZXh0KgkJCQkJbV9jb250ZXh0Ow0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUJbV9wYXJlbnQ7DQorICAgIHY4OjpDb250ZXh0OjpTY29wZQkJCQltX2NzY29wZTsNCitwdWJsaWM6DQorICAgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KSA6IG1fY29udGV4dChwQ29udGV4dCksIG1fcGFyZW50KHBDb250ZXh0LT5tX3BJc29sYXRlKSwgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBDb250ZXh0LT5tX3BJc29sYXRlLCBwQ29udGV4dC0+bV9oQ29udGV4dCkpIHt9DQorICAgIHY4OjpJc29sYXRlKgkJCUdldElzb2xhdGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9jb250ZXh0LT5tX3BJc29sYXRlOw0KKyAgICB9DQorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4JR2V0TG9jYWxDb250ZXh0KCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2NvbnRleHQtPm1fcElzb2xhdGUsIG1fY29udGV4dC0+bV9oQ29udGV4dCk7DQorICAgIH0NCitwcml2YXRlOg0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKTsNCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dCYpOw0KKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCit9Ow0KK2NsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQNCit7DQorICAgIENGWEpTRV9Db250ZXh0KgkJCQkJbV9jb250ZXh0Ow0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUJbV9wYXJlbnQ7DQorICAgIHY4OjpDb250ZXh0OjpTY29wZQkJCQltX2NzY29wZTsNCitwdWJsaWM6DQorICAgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBDRlhKU0VfQ29udGV4dCogcENvbnRleHQpDQorICAgICAgICA6IG1fY29udGV4dChwQ29udGV4dCksIG1fcGFyZW50KHBJc29sYXRlKSwgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBJc29sYXRlLCBwQ29udGV4dCA/IHBDb250ZXh0LT5tX2hDb250ZXh0IDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCkpIHt9DQorICAgIHY4OjpJc29sYXRlKgkJCUdldElzb2xhdGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbV9wYXJlbnQuR2V0SXNvbGF0ZSgpOw0KKyAgICB9DQorICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4JR2V0TG9jYWxDb250ZXh0KCkNCisgICAgew0KKyAgICAgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbV9wYXJlbnQuR2V0SXNvbGF0ZSgpOw0KKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgbV9jb250ZXh0ID8gbV9jb250ZXh0LT5tX2hDb250ZXh0IDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCk7DQorICAgIH0NCitwcml2YXRlOg0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQmKTsNCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCYpOw0KKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL3V0aWxfaW5saW5lLmggYi94ZmEvc3JjL2Z4anNlL3NyYy91dGlsX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGNhYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy91dGlsX2lubGluZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEpTRV9VVElMX0lOTElORV9IXw0KKyNkZWZpbmUgRlhKU0VfVVRJTF9JTkxJTkVfSF8NCitzdGF0aWMgVjhfSU5MSU5FIHY4OjpMb2NhbDx2ODo6T2JqZWN0PglGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChjb25zdCB2ODo6TG9jYWw8djg6OkNvbnRleHQ+JiBoQ29udGV4dCkNCit7DQorICAgIHJldHVybiBoQ29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLkFzPHY4OjpPYmplY3Q+KCk7DQorfQ0KK3N0YXRpYyBWOF9JTkxJTkUgdm9pZAkJCQkJRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhPYmplY3QsIEZYX0xQVk9JRCBscE5ld0JpbmRpbmcpDQorew0KKyAgICBBU1NFUlQoIWhPYmplY3QuSXNFbXB0eSgpKTsNCisgICAgQVNTRVJUKGhPYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID4gMCk7DQorICAgIGhPYmplY3QtPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsIGxwTmV3QmluZGluZyk7DQorfQ0KK3N0YXRpYyBWOF9JTkxJTkUgRlhfTFBWT0lECQkJCUZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZyhjb25zdCB2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhKU09iamVjdCwgQ0ZYSlNFX0NsYXNzKiBscENsYXNzID0gTlVMTCkNCit7DQorICAgIEFTU0VSVCghaEpTT2JqZWN0LklzRW1wdHkoKSk7DQorICAgIGlmKCFoSlNPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoT2JqZWN0ID0gaEpTT2JqZWN0Ow0KKyAgICBpZihoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSAwKSB7DQorICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaFByb3RvT2JqZWN0ID0gaE9iamVjdC0+R2V0UHJvdG90eXBlKCk7DQorICAgICAgICBpZihoUHJvdG9PYmplY3QuSXNFbXB0eSgpIHx8ICFoUHJvdG9PYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIGhPYmplY3QgPSBoUHJvdG9PYmplY3QuQXM8djg6Ok9iamVjdD4oKTsNCisgICAgICAgIGlmKGhPYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihscENsYXNzKSB7DQorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhDbGFzcyA9IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyhscENsYXNzLT5HZXRDb250ZXh0KCktPkdldFJ1bnRpbWUoKSwgbHBDbGFzcy0+R2V0VGVtcGxhdGUoKSk7DQorICAgICAgICBpZighaENsYXNzLT5IYXNJbnN0YW5jZShoT2JqZWN0KSkgew0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBoT2JqZWN0LT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyZmZmMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmNwcApAQCAtMCwwICsxLDUyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiLi4vLi4vZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZnh2OC5oIg0KKyNpbmNsdWRlICJ2YWx1ZS5oIg0KKyNpbmNsdWRlICJjbGFzcy5oIg0KKyNpbmNsdWRlIDxtYXRoLmg+DQorI2luY2x1ZGUgInV0aWxfaW5saW5lLmgiDQorI2lmICFkZWZpbmVkKF9fUExBQ0VNRU5UX05FV19JTkxJTkUpICYmICFkZWZpbmVkKF9NRkNfVkVSKSAmJiAhZGVmaW5lZChfTkVXKQ0KKyNkZWZpbmUgX19QTEFDRU1FTlRfTkVXX0lOTElORQ0KK2lubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHZvaWQqIHBvcykNCit7DQorICAgIHJldHVybiBwb3M7DQorfQ0KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIsIHZvaWQqIHBvcykNCit7DQorfQ0KKyNlbmRpZg0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzVW5kZWZpbmVkKCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNOdWxsCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNOdWxsKCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNCb29sZWFuCShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0Jvb2xlYW4oKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNTdHJpbmcoKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc051bWJlcgkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNOdW1iZXIoKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0ludGVnZXIJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzSW50ZWdlcigpOw0KK30NCitGWF9CT09MCUZYSlNFX1ZhbHVlX0lzT2JqZWN0CShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc09iamVjdCgpOw0KK30NCitGWF9CT09MCUZYSlNFX1ZhbHVlX0lzQXJyYXkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzQXJyYXkoKTsNCit9DQorRlhfQk9PTAlGWEpTRV9WYWx1ZV9Jc0Z1bmN0aW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzRnVuY3Rpb24oKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0RhdGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNEYXRlKCk7DQorfQ0KK0ZYX0JPT0wJCUZYSlNFX1ZhbHVlX1RvQm9vbGVhbgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlRvQm9vbGVhbigpOw0KK30NCitGWF9GTE9BVAlGWEpTRV9WYWx1ZV9Ub0Zsb2F0CQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlRvRmxvYXQoKTsNCit9DQorRlhKU0VfRE9VQkxFIEZYSlNFX1ZhbHVlX1RvRG91YmxlCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+VG9Eb3VibGUoKTsNCit9DQordm9pZAkJRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfQnl0ZVN0cmluZyYgc3pTdHJPdXRwdXQpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlRvU3RyaW5nKHN6U3RyT3V0cHV0KTsNCit9DQorRlhfSU5UMzIJRlhKU0VfVmFsdWVfVG9JbnRlZ2VyCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+VG9JbnRlZ2VyKCk7DQorfQ0KK0ZYX0xQVk9JRAlGWEpTRV9WYWx1ZV9Ub09iamVjdAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+VG9PYmplY3QobHBDbGFzcyk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+U2V0VW5kZWZpbmVkKCk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldE51bGwJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+U2V0TnVsbCgpOw0KK30NCit2b2lkCQlGWEpTRV9WYWx1ZV9TZXRCb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTAliQm9vbGVhbikNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+U2V0Qm9vbGVhbihiQm9vbGVhbik7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JTVFIJc3pTdHJpbmcpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlNldFN0cmluZyhzelN0cmluZyk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldEludGVnZXIJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9JTlQzMiAgbkludGVnZXIpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlNldEludGVnZXIobkludGVnZXIpOw0KK30NCit2b2lkCQlGWEpTRV9WYWx1ZV9TZXRGbG9hdAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0ZMT0FUICBmRmxvYXQpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlNldEZsb2F0KGZGbG9hdCk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldERvdWJsZQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0RPVUJMRSBkRG91YmxlKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICBBU1NFUlQobHBWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlLT5TZXREb3VibGUoZERvdWJsZSk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldE9iamVjdAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0xQVk9JRCBscE9iamVjdCwgRlhKU0VfSENMQVNTIGhDbGFzcykNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQ0ZYSlNFX0NsYXNzKiBscENsYXNzID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ2xhc3MqPihoQ2xhc3MpOw0KKyAgICBpZihscENsYXNzID09IE5VTEwpIHsNCisgICAgICAgIEFTU0VSVChscE9iamVjdCA9PSBOVUxMKTsNCisgICAgICAgIGxwVmFsdWUtPlNldEpTT2JqZWN0KCk7DQorICAgIH0gZWxzZSBpZihscENsYXNzICE9IE5VTEwpIHsNCisgICAgICAgIGxwVmFsdWUtPlNldEhvc3RPYmplY3QobHBPYmplY3QsIGxwQ2xhc3MpOw0KKyAgICB9DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldEFycmF5CQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfVUlOVDMyIHVWYWx1ZUNvdW50LCBGWEpTRV9IVkFMVUUqIHJnVmFsdWVzKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+U2V0QXJyYXkodVZhbHVlQ291bnQsIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKio+KHJnVmFsdWVzKSk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1NldERhdGUJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlLT5TZXREYXRlKGREb3VibGUpOw0KK30NCit2b2lkCQlGWEpTRV9WYWx1ZV9TZXQJCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hWQUxVRSBoT3JpZ2luYWxWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscE9yaWdpbmFsVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhPcmlnaW5hbFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUgJiYgbHBPcmlnaW5hbFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPkFzc2lnbihscE9yaWdpbmFsVmFsdWUpOw0KK30NCitGWF9CT09MCQlGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQlNUUglzelByb3BOYW1lLAlGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHN6UHJvcE5hbWUsIGxwUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTAkJRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JTVFIJc3pQcm9wTmFtZSwJRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgICBBU1NFUlQobHBWYWx1ZSAmJiBscFByb3BWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlLT5TZXRPYmplY3RQcm9wZXJ0eShzelByb3BOYW1lLCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wJCUZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfVUlOVDMyCXVQcm9wSWR4LAlGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHVQcm9wSWR4LCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wJCUZYSlNFX1ZhbHVlX1NldE9iamVjdFByb3BCeUlkeAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfVUlOVDMyCXVQcm9wSWR4LAlGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlNldE9iamVjdFByb3BlcnR5KHVQcm9wSWR4LCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wJCUZYSlNFX1ZhbHVlX0RlbGV0ZU9iamVjdFByb3AJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JTVFIgc3pQcm9wTmFtZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgICByZXR1cm4gbHBWYWx1ZS0+RGVsZXRlT2JqZWN0UHJvcGVydHkoc3pQcm9wTmFtZSk7DQorfQ0KK0ZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9PYmplY3RIYXNPd25Qcm9wCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CU1RSCXN6UHJvcE5hbWUsIEZYX0JPT0wJYlVzZVR5cGVHZXR0ZXIpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIEFTU0VSVChscFZhbHVlKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPkhhc09iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIGJVc2VUeXBlR2V0dGVyKTsNCit9DQorRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JTVFIJc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpDQorew0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgICBBU1NFUlQobHBWYWx1ZSAmJiBscFByb3BWYWx1ZSk7DQorICAgIHJldHVybiBscFZhbHVlLT5TZXRPYmplY3RPd25Qcm9wZXJ0eShzelByb3BOYW1lLCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wJCUZYSlNFX1ZhbHVlX1NldEZ1bmN0aW9uQmluZAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfSFZBTFVFIGhPbGRGdW5jdGlvbiwgRlhKU0VfSFZBTFVFIGhOZXdUaGlzKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24gPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhPbGRGdW5jdGlvbik7DQorICAgIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoTmV3VGhpcyk7DQorICAgIEFTU0VSVChscFZhbHVlICYmIGxwT2xkRnVuY3Rpb24gJiYgbHBOZXdUaGlzKTsNCisgICAgcmV0dXJuIGxwVmFsdWUtPlNldEZ1bmN0aW9uQmluZChscE9sZEZ1bmN0aW9uLCBscE5ld1RoaXMpOw0KK30NCitGWF9CT09MCUZYSlNFX1ZhbHVlX0NhbGxGdW5jdGlvbihGWEpTRV9IVkFMVUUgaEZ1bmN0aW9uLCBGWEpTRV9IVkFMVUUgaFRoaXMsIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIEZYX1VJTlQzMiBuQXJnQ291bnQsIEZYSlNFX0hWQUxVRSogbHBBcmdzKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscEZ1bmN0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoRnVuY3Rpb24pOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwVGhpcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFRoaXMpOw0KKyAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhSZXRWYWx1ZSk7DQorICAgIEFTU0VSVChscEZ1bmN0aW9uKTsNCisgICAgcmV0dXJuIGxwRnVuY3Rpb24tPkNhbGwobHBUaGlzLCBscFJldFZhbHVlLCBuQXJnQ291bnQsIGxwQXJncyk7DQorfQ0KK0ZYSlNFX0hWQUxVRQlGWEpTRV9WYWx1ZV9DcmVhdGUJCShGWEpTRV9IUlVOVElNRSBoUnVudGltZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8djg6Oklzb2xhdGUqPihoUnVudGltZSkpOw0KKyAgICBBU1NFUlQobHBWYWx1ZSk7DQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBWYWx1ZSk7DQorfQ0KK3ZvaWQJCUZYSlNFX1ZhbHVlX1JlbGVhc2UJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCit7DQorICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgaWYobHBWYWx1ZSkgew0KKyAgICAgICAgZGVsZXRlIGxwVmFsdWU7DQorICAgIH0NCit9DQorRlhKU0VfSFJVTlRJTUUJRlhKU0VfVmFsdWVfR2V0UnVudGltZShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgICBBU1NFUlQobHBWYWx1ZSk7DQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hSVU5USU1FPihscFZhbHVlLT5HZXRJc29sYXRlKCkpOw0KK30NCit2b2lkIEZYSlNFX1Rocm93TWVzc2FnZShGWF9CU1RSIHV0ZjhOYW1lLCBGWF9CU1RSIHV0ZjhNZXNzYWdlKQ0KK3sNCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKTsNCisgICAgQVNTRVJUKHBJc29sYXRlKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGhNZXNzYWdlID0gdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIHV0ZjhNZXNzYWdlLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE1lc3NhZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaEVycm9yOw0KKyAgICBpZih1dGY4TmFtZSA9PSAiUmFuZ2VFcnJvciIpIHsNCisgICAgICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlJhbmdlRXJyb3IoaE1lc3NhZ2UpOw0KKyAgICB9IGVsc2UgaWYodXRmOE5hbWUgPT0gIlJlZmVyZW5jZUVycm9yIikgew0KKyAgICAgICAgaEVycm9yID0gdjg6OkV4Y2VwdGlvbjo6UmVmZXJlbmNlRXJyb3IoaE1lc3NhZ2UpOw0KKyAgICB9IGVsc2UgaWYodXRmOE5hbWUgPT0gIlN5bnRheEVycm9yIikgew0KKyAgICAgICAgaEVycm9yID0gdjg6OkV4Y2VwdGlvbjo6U3ludGF4RXJyb3IoaE1lc3NhZ2UpOw0KKyAgICB9IGVsc2UgaWYodXRmOE5hbWUgPT0gIlR5cGVFcnJvciIpIHsNCisgICAgICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlR5cGVFcnJvcihoTWVzc2FnZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpFcnJvcihoTWVzc2FnZSk7DQorICAgICAgICBpZih1dGY4TmFtZSAhPSAiRXJyb3IiICYmICF1dGY4TmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBoRXJyb3IuQXM8djg6Ok9iamVjdD4oKS0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAibmFtZSIpLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgdXRmOE5hbWUuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCB1dGY4TmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHBJc29sYXRlLT5UaHJvd0V4Y2VwdGlvbihoRXJyb3IpOw0KK30NCitDRlhKU0VfVmFsdWUqIENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCit7DQorICAgIHJldHVybiBGWF9ORVcgQ0ZYSlNFX1ZhbHVlKHBJc29sYXRlKTsNCit9DQorRlhfTFBWT0lECUNGWEpTRV9WYWx1ZTo6VG9PYmplY3QoQ0ZYSlNFX0NsYXNzKiBscENsYXNzKSBjb25zdA0KK3sNCisgICAgQVNTRVJUKCFtX2hWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIEFTU0VSVCghaFZhbHVlLklzRW1wdHkoKSk7DQorICAgIGlmKCFoVmFsdWUtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCksIGxwQ2xhc3MpOw0KK30NCitWOF9JTkxJTkUgc3RhdGljIGRvdWJsZSBGWEpTRV9mdG9kKEZYX0ZMT0FUIGZOdW1iZXIpDQorew0KKyAgICBpZihzaXplb2YoRlhfRkxPQVQpICE9IDQpIHsNCisgICAgICAgIEFTU0VSVChGQUxTRSk7DQorICAgICAgICByZXR1cm4gZk51bWJlcjsNCisgICAgfQ0KKyAgICBGWF9VSU5UMzIgbkZsb2F0Qml0cyA9IChGWF9VSU5UMzImKWZOdW1iZXI7DQorICAgIEZYX1VJTlQ4ICBuRXhwb25lbnQgID0gKEZYX1VJTlQ4KShuRmxvYXRCaXRzID4+IDE2ID4+IDcgKTsNCisgICAgaWYobkV4cG9uZW50ID09IDAgfHwgbkV4cG9uZW50ID09IDI1NSkgew0KKyAgICAgICAgcmV0dXJuIGZOdW1iZXI7DQorICAgIH0NCisgICAgRlhfSU5UOCBuRXJyRXhwID0gbkV4cG9uZW50IC0gMTI3IC0gMjM7DQorICAgIGlmKG5FcnJFeHAgPj0gMCkgew0KKyAgICAgICAgcmV0dXJuIGZOdW1iZXI7DQorICAgIH0NCisgICAgZG91YmxlIGR3RXJyb3IgPSBwb3coMi4wLCBuRXJyRXhwKSwgZHdFcnJvckhhbGYgPSBkd0Vycm9yIC8gMjsNCisgICAgZG91YmxlIGROdW1iZXIgPSBmTnVtYmVyLCAgZE51bWJlckFicyA9IGZhYnMoZk51bWJlcik7DQorICAgIGRvdWJsZSBkTnVtYmVyQWJzTWluID0gZE51bWJlckFicyAtIGR3RXJyb3JIYWxmLCBkTnVtYmVyQWJzTWF4ID0gZE51bWJlckFicyArIGR3RXJyb3JIYWxmOw0KKyAgICBGWF9JTlQzMiBpRXJyUG9zID0gMDsNCisgICAgaWYoZmxvb3IoZE51bWJlckFic01pbikgPT0gZmxvb3IoZE51bWJlckFic01heCkpIHsNCisgICAgICAgIGROdW1iZXJBYnNNaW4gPSBmbW9kKGROdW1iZXJBYnNNaW4sIDEuMCk7DQorICAgICAgICBkTnVtYmVyQWJzTWF4ID0gZm1vZChkTnVtYmVyQWJzTWF4LCAxLjApOw0KKyAgICAgICAgRlhfSU5UMzIgaUVyclBvc01pbiA9IDEsIGlFcnJQb3NNYXggPSAzODsNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlFcnJQb3NNaW4gKyBpRXJyUG9zTWF4KSAvIDI7DQorICAgICAgICAgICAgZG91YmxlIGRQb3cgPSBwb3coMTAuMCwgaU1pZCk7DQorICAgICAgICAgICAgaWYoZmxvb3IoZE51bWJlckFic01pbiAqIGRQb3cpID09IGZsb29yKGROdW1iZXJBYnNNYXggKiBkUG93KSkgew0KKyAgICAgICAgICAgICAgICBpRXJyUG9zTWluID0gaU1pZCArIDE7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaUVyclBvc01heCA9IGlNaWQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSB3aGlsZSAoaUVyclBvc01pbiA8IGlFcnJQb3NNYXgpOw0KKyAgICAgICAgaUVyclBvcyA9IGlFcnJQb3NNYXg7DQorICAgIH0NCisgICAgZG91YmxlIGRQb3cgPSBwb3coMTAuMCwgaUVyclBvcyk7DQorICAgIHJldHVybiBmTnVtYmVyIDwgMCA/IGNlaWwoZE51bWJlciAqIGRQb3cgLSAwLjUpIC8gZFBvdyA6IGZsb29yKGROdW1iZXIgKiBkUG93ICsgMC41KSAvIGRQb3c7DQorfQ0KK3ZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXRGbG9hdChGWF9GTE9BVCBmRmxvYXQpDQorew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpOdW1iZXI6Ok5ldyhtX3BJc29sYXRlLCBGWEpTRV9mdG9kKGZGbG9hdCkpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KK30NCit2b2lkIENGWEpTRV9WYWx1ZTo6U2V0SG9zdE9iamVjdChGWF9MUFZPSUQgbHBPYmplY3QsIENGWEpTRV9DbGFzcyogbHBDbGFzcykNCit7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICBBU1NFUlQobHBDbGFzcyk7DQorICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaENsYXNzID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KG1fcElzb2xhdGUsIGxwQ2xhc3MtPm1faFRlbXBsYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhPYmplY3QgPSBoQ2xhc3MtPkluc3RhbmNlVGVtcGxhdGUoKS0+TmV3SW5zdGFuY2UoKTsNCisgICAgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyhoT2JqZWN0LCBscE9iamVjdCk7DQorICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhPYmplY3QpOw0KK30NCit2b2lkIENGWEpTRV9WYWx1ZTo6U2V0QXJyYXkoRlhfVUlOVDMyIHVWYWx1ZUNvdW50LCBDRlhKU0VfVmFsdWUqKiByZ1ZhbHVlcykNCit7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBoQXJyYXlPYmplY3QgPSB2ODo6QXJyYXk6Ok5ldyhtX3BJc29sYXRlLCB1VmFsdWVDb3VudCk7DQorICAgIGlmIChyZ1ZhbHVlcykgew0KKyAgICAgICAgZm9yKEZYX1VJTlQzMiBpID0gMDsgaSA8IHVWYWx1ZUNvdW50OyBpKyspIHsNCisgICAgICAgICAgICBpZihyZ1ZhbHVlc1tpXSkgew0KKyAgICAgICAgICAgICAgICBoQXJyYXlPYmplY3QtPlNldChpLCB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIHJnVmFsdWVzW2ldLT5EaXJlY3RHZXRWYWx1ZSgpKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhBcnJheU9iamVjdCk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXREYXRlKEZYSlNFX0RPVUJMRSBkRG91YmxlKQ0KK3sNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhEYXRlID0gdjg6OkRhdGU6Ok5ldyhtX3BJc29sYXRlLCBkRG91YmxlKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaERhdGUpOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkoRlhfQlNUUiBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFByb3BWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICAgIHJldHVybiAoRlhfQk9PTCloT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSksIGhQcm9wVmFsdWUpOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6R2V0T2JqZWN0UHJvcGVydHkoRlhfQlNUUiBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9wSXNvbGF0ZSwgc3pQcm9wTmFtZS5HZXRDU3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUoaFByb3BWYWx1ZSk7DQorICAgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkoRlhfVUlOVDMyIHVQcm9wSWR4LCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFByb3BWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICAgIHJldHVybiAoRlhfQk9PTCloT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPlNldCh1UHJvcElkeCwgaFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpHZXRPYmplY3RQcm9wZXJ0eShGWF9VSU5UMzIgdVByb3BJZHgsIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpDQorew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICBpZighaE9iamVjdC0+SXNPYmplY3QoKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPSBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkdldCh1UHJvcElkeCk7DQorICAgIGxwUHJvcFZhbHVlLT5Gb3JjZVNldFZhbHVlKGhQcm9wVmFsdWUpOw0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OkRlbGV0ZU9iamVjdFByb3BlcnR5KEZYX0JTVFIgc3pQcm9wTmFtZSkNCit7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIGlmKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5EZWxldGUodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9wSXNvbGF0ZSwgc3pQcm9wTmFtZS5HZXRDU3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpIYXNPYmplY3RPd25Qcm9wZXJ0eShGWF9CU1RSICAgc3pQcm9wTmFtZSwgRlhfQk9PTAliVXNlVHlwZUdldHRlcikNCit7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIGlmKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhLZXkgICA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgICAgcmV0dXJuIGhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+SGFzUmVhbE5hbWVkUHJvcGVydHkoaEtleSkgfHwgKGJVc2VUeXBlR2V0dGVyICYmIGhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+SGFzT3duUHJvcGVydHkoaEtleSkpOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0T3duUHJvcGVydHkoRlhfQlNUUiBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KK3sNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwUHJvcFZhbHVlLT5tX2hWYWx1ZSk7DQorICAgIHJldHVybiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCBzelByb3BOYW1lLkdldExlbmd0aCgpKSwgaFZhbHVlKTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldEZ1bmN0aW9uQmluZChDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24sIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzKQ0KK3sNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiByZ0FyZ3NbMl07DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPbGRGdW5jdGlvbiA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBPbGRGdW5jdGlvbi0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICAgIGlmKGhPbGRGdW5jdGlvbi5Jc0VtcHR5KCkgfHwgIWhPbGRGdW5jdGlvbi0+SXNGdW5jdGlvbigpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmdBcmdzWzBdID0gaE9sZEZ1bmN0aW9uOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3VGhpcyA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBOZXdUaGlzLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgaWYoaE5ld1RoaXMuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmdBcmdzWzFdID0gaE5ld1RoaXM7DQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoQmluZGVyRnVuY1NvdXJjZSA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsICIoZnVuY3Rpb24gKG9sZGZ1bmN0aW9uLCBuZXd0aGlzKSB7IHJldHVybiBvbGRmdW5jdGlvbi5iaW5kKG5ld3RoaXMpOyB9KSIpOw0KKyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBoQmluZGVyRnVuYyA9IHY4OjpTY3JpcHQ6OkNvbXBpbGUoaEJpbmRlckZ1bmNTb3VyY2UpLT5SdW4oKS5Bczx2ODo6RnVuY3Rpb24+KCk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhCb3VuZEZ1bmN0aW9uID0gaEJpbmRlckZ1bmMtPkNhbGwobV9wSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKS0+R2xvYmFsKCksIDIsIHJnQXJncyk7DQorICAgIGlmKGhCb3VuZEZ1bmN0aW9uLklzRW1wdHkoKSB8fCAhaEJvdW5kRnVuY3Rpb24tPklzRnVuY3Rpb24oKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhCb3VuZEZ1bmN0aW9uKTsNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KKyNkZWZpbmUgRlhKU0VfSU5WQUxJRF9QVFIgKChGWF9MUFZPSUQpKEZYX0lOVFBUUiktMSkNCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6Q2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSwgRlhfVUlOVDMyIG5BcmdDb3VudCwgRlhKU0VfSFZBTFVFKiBscEFyZ3MpDQorew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaEZ1bmN0aW9uVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIERpcmVjdEdldFZhbHVlKCkpOw0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaEZ1bmN0aW9uT2JqZWN0ID0gIWhGdW5jdGlvblZhbHVlLklzRW1wdHkoKSAmJiBoRnVuY3Rpb25WYWx1ZS0+SXNPYmplY3QoKSA/IGhGdW5jdGlvblZhbHVlLkFzPHY4OjpPYmplY3Q+KCkgOiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsNCisgICAgdjg6OlRyeUNhdGNoIHRyeWNhdGNoOw0KKyAgICBpZiAoaEZ1bmN0aW9uT2JqZWN0LklzRW1wdHkoKSB8fCAhaEZ1bmN0aW9uT2JqZWN0LT5Jc0NhbGxhYmxlKCkpIHsNCisgICAgICAgIGlmKGxwUmV0VmFsdWUpIHsNCisgICAgICAgICAgICBscFJldFZhbHVlLT5Gb3JjZVNldFZhbHVlKEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFJldHVyblZhbHVlOw0KKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIGxwTG9jYWxBcmdzID0gTlVMTDsNCisgICAgaWYobkFyZ0NvdW50KSB7DQorICAgICAgICBscExvY2FsQXJncyA9IEZYX0FsbG9jKHY4OjpIYW5kbGU8djg6OlZhbHVlPiwgbkFyZ0NvdW50KTsNCisgICAgICAgIGlmICghbHBMb2NhbEFyZ3MpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKEZYX1VJTlQzMiBpID0gMDsgaSA8IG5BcmdDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgbmV3IChscExvY2FsQXJncyArIGkpIHY4OjpIYW5kbGU8djg6OlZhbHVlPjsNCisgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwQXJnID0gKENGWEpTRV9WYWx1ZSopbHBBcmdzW2ldOw0KKyAgICAgICAgICAgIGlmKGxwQXJnKSB7DQorICAgICAgICAgICAgICAgIGxwTG9jYWxBcmdzW2ldID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscEFyZy0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChscExvY2FsQXJnc1tpXS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgbHBMb2NhbEFyZ3NbaV0gPSB2ODo6VW5kZWZpbmVkKG1fcElzb2xhdGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CT09MIGJSZXRWYWx1ZSA9IFRSVUU7DQorICAgIGlmKGxwUmVjZWl2ZXIgPT0gRlhKU0VfSU5WQUxJRF9QVFIpIHsNCisgICAgICAgIGhSZXR1cm5WYWx1ZSA9IGhGdW5jdGlvbk9iamVjdC0+Q2FsbEFzQ29uc3RydWN0b3IobkFyZ0NvdW50LCBscExvY2FsQXJncyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUmVjZWl2ZXI7DQorICAgICAgICBpZihscFJlY2VpdmVyKSB7DQorICAgICAgICAgICAgaFJlY2VpdmVyID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFJlY2VpdmVyLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKGhSZWNlaXZlci5Jc0VtcHR5KCkgfHwgIWhSZWNlaXZlci0+SXNPYmplY3QoKSkgew0KKyAgICAgICAgICAgIGhSZWNlaXZlciA9IHY4OjpPYmplY3Q6Ok5ldyhtX3BJc29sYXRlKTsNCisgICAgICAgIH0NCisgICAgICAgIGhSZXR1cm5WYWx1ZSA9IGhGdW5jdGlvbk9iamVjdC0+Q2FsbEFzRnVuY3Rpb24oaFJlY2VpdmVyLCBuQXJnQ291bnQsIGxwTG9jYWxBcmdzKTsNCisgICAgfQ0KKyAgICBpZih0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgaFJldHVyblZhbHVlID0gIEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKTsNCisgICAgICAgIGJSZXRWYWx1ZSA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmKGxwUmV0VmFsdWUpIHsNCisgICAgICAgIGxwUmV0VmFsdWUtPkZvcmNlU2V0VmFsdWUoaFJldHVyblZhbHVlKTsNCisgICAgfQ0KKyAgICBpZihscExvY2FsQXJncykgew0KKyAgICAgICAgZm9yIChGWF9VSU5UMzIgaSA9IDA7IGkgPCBuQXJnQ291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGxwTG9jYWxBcmdzW2ldLn5IYW5kbGUoKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUobHBMb2NhbEFyZ3MpOw0KKyAgICB9DQorICAgIHJldHVybiBiUmV0VmFsdWU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmggYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTIzYmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oCkBAIC0wLDAgKzEsMjM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhKU0VfVkFMVUVfSF8NCisjZGVmaW5lIEZYSlNFX1ZBTFVFX0hfDQorI2luY2x1ZGUgInNjb3BlX2lubGluZS5oIg0KK2NsYXNzIENGWEpTRV9WYWx1ZSA6IHB1YmxpYyBDRlhfT2JqZWN0DQorew0KK3B1YmxpYzoNCisgICAgQ0ZYSlNFX1ZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgOiBtX3BJc29sYXRlKHBJc29sYXRlKSB7fQ0KK3Byb3RlY3RlZDoNCisgICAgQ0ZYSlNFX1ZhbHVlKCk7DQorICAgIENGWEpTRV9WYWx1ZShjb25zdCBDRlhKU0VfVmFsdWUmKTsNCisgICAgQ0ZYSlNFX1ZhbHVlJiBvcGVyYXRvciA9IChjb25zdCBDRlhKU0VfVmFsdWUmKTsNCitwdWJsaWM6DQorICAgIFY4X0lOTElORSBGWF9CT09MIElzVW5kZWZpbmVkKCkJY29uc3QNCisgICAgew0KKyAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNVbmRlZmluZWQoKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc051bGwoKQkJY29uc3QNCisgICAgew0KKyAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNOdWxsKCk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIEZYX0JPT0wgSXNCb29sZWFuKCkJY29uc3QNCisgICAgew0KKyAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNCb29sZWFuKCk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIEZYX0JPT0wgSXNTdHJpbmcoKQljb25zdA0KKyAgICB7DQorICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc1N0cmluZygpOw0KKyAgICB9DQorICAgIFY4X0lOTElORSBGWF9CT09MIElzTnVtYmVyKCkJY29uc3QNCisgICAgew0KKyAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNOdW1iZXIoKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc0ludGVnZXIoKQljb25zdA0KKyAgICB7DQorICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc0ludDMyKCk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIEZYX0JPT0wgSXNPYmplY3QoKQljb25zdA0KKyAgICB7DQorICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc09iamVjdCgpOw0KKyAgICB9DQorICAgIFY4X0lOTElORSBGWF9CT09MIElzQXJyYXkoKQkJY29uc3QNCisgICAgew0KKyAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNBcnJheSgpOw0KKyAgICB9DQorICAgIFY4X0lOTElORSBGWF9CT09MIElzRnVuY3Rpb24oKQljb25zdA0KKyAgICB7DQorICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc0Z1bmN0aW9uKCk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIEZYX0JPT0wgSXNEYXRlKCkJCWNvbnN0DQorICAgIHsNCisgICAgICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgICAgIHJldHVybiBoVmFsdWUtPklzRGF0ZSgpOw0KKyAgICB9DQorcHVibGljOg0KKyAgICBWOF9JTkxJTkUgRlhfQk9PTAkJVG9Cb29sZWFuKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgQVNTRVJUKCFtX2hWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9CT09MPihoVmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgRlhfRkxPQVQJCVRvRmxvYXQoKQljb25zdA0KKyAgICB7DQorICAgICAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihoVmFsdWUtPk51bWJlclZhbHVlKCkpOw0KKyAgICB9DQorICAgIFY4X0lOTElORSBGWEpTRV9ET1VCTEUJVG9Eb3VibGUoKQljb25zdA0KKyAgICB7DQorICAgICAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYSlNFX0RPVUJMRT4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgRlhfSU5UMzIJCVRvSW50ZWdlcigpCWNvbnN0DQorICAgIHsNCisgICAgICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfSU5UMzI+KGhWYWx1ZS0+TnVtYmVyVmFsdWUoKSk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIHZvaWQJCQlUb1N0cmluZyhDRlhfQnl0ZVN0cmluZyYgc3pTdHJPdXRwdXQpIGNvbnN0DQorICAgIHsNCisgICAgICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFN0cmluZyA9IGhWYWx1ZS0+VG9TdHJpbmcoKTsNCisgICAgICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsKGhTdHJpbmcpOw0KKyAgICAgICAgc3pTdHJPdXRwdXQgPSAqaFN0cmluZ1ZhbDsNCisgICAgfQ0KKyAgICBGWF9MUFZPSUQJCQkJVG9PYmplY3QoQ0ZYSlNFX0NsYXNzKiAgIGxwQ2xhc3MpIGNvbnN0Ow0KK3B1YmxpYzoNCisgICAgVjhfSU5MSU5FIHZvaWQgU2V0VW5kZWZpbmVkKCkNCisgICAgew0KKyAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OlVuZGVmaW5lZChtX3BJc29sYXRlKTsNCisgICAgICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIHZvaWQgU2V0TnVsbCgpDQorICAgIHsNCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpOdWxsKG1fcElzb2xhdGUpOw0KKyAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgdm9pZCBTZXRCb29sZWFuKEZYX0JPT0wgYkJvb2xlYW4pDQorICAgIHsNCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpCb29sZWFuOjpOZXcobV9wSXNvbGF0ZSwgYkJvb2xlYW4gIT0gRkFMU0UpOw0KKyAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgdm9pZCBTZXRJbnRlZ2VyKEZYX0lOVDMyIG5JbnRlZ2VyKQ0KKyAgICB7DQorICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6SW50ZWdlcjo6TmV3KG1fcElzb2xhdGUsIG5JbnRlZ2VyKTsNCisgICAgICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIHZvaWQgU2V0RG91YmxlKEZYSlNFX0RPVUJMRSBkRG91YmxlKQ0KKyAgICB7DQorICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TnVtYmVyOjpOZXcobV9wSXNvbGF0ZSwgZERvdWJsZSk7DQorICAgICAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgICB9DQorICAgIFY4X0lOTElORSB2b2lkIFNldFN0cmluZyhGWF9CU1RSIHN6U3RyaW5nKQ0KKyAgICB7DQorICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3pTdHJpbmcuR2V0UHRyKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgICAgfQ0KKyAgICBWOF9JTkxJTkUgdm9pZCBTZXRGbG9hdChGWF9GTE9BVCBmRmxvYXQpOw0KKyAgICBWOF9JTkxJTkUgdm9pZCBTZXRKU09iamVjdCgpDQorICAgIHsNCisgICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6Ok9iamVjdDo6TmV3KG1fcElzb2xhdGUpOw0KKyAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgICAgfQ0KKyAgICB2b2lkIFNldEhvc3RPYmplY3QoRlhfTFBWT0lEIGxwT2JqZWN0LCBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MpOw0KKyAgICB2b2lkIFNldEFycmF5KEZYX1VJTlQzMiB1VmFsdWVDb3VudCwgQ0ZYSlNFX1ZhbHVlKiogcmdWYWx1ZXMpOw0KKyAgICB2b2lkIFNldERhdGUoRlhKU0VfRE9VQkxFIGREb3VibGUpOw0KK3B1YmxpYzoNCisgICAgRlhfQk9PTCBHZXRPYmplY3RQcm9wZXJ0eShGWF9CU1RSCXN6UHJvcE5hbWUsCUNGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpOw0KKyAgICBGWF9CT09MIFNldE9iamVjdFByb3BlcnR5KEZYX0JTVFIJc3pQcm9wTmFtZSwJQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQorICAgIEZYX0JPT0wgR2V0T2JqZWN0UHJvcGVydHkoRlhfVUlOVDMyCXVQcm9wSWR4LAlDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCisgICAgRlhfQk9PTCBTZXRPYmplY3RQcm9wZXJ0eShGWF9VSU5UMzIJdVByb3BJZHgsCUNGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpOw0KKyAgICBGWF9CT09MIERlbGV0ZU9iamVjdFByb3BlcnR5KEZYX0JTVFIgc3pQcm9wTmFtZSk7DQorICAgIEZYX0JPT0wgSGFzT2JqZWN0T3duUHJvcGVydHkoRlhfQlNUUiAgIHN6UHJvcE5hbWUsIEZYX0JPT0wJYlVzZVR5cGVHZXR0ZXIpOw0KKyAgICBGWF9CT09MIFNldE9iamVjdE93blByb3BlcnR5KEZYX0JTVFIgICBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCisgICAgRlhfQk9PTAlTZXRGdW5jdGlvbkJpbmQoQ0ZYSlNFX1ZhbHVlKiBscE9sZEZ1bmN0aW9uLCBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcyk7DQorICAgIEZYX0JPT0wgQ2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSwgRlhfVUlOVDMyIG5BcmdDb3VudCwgRlhKU0VfSFZBTFVFKiBscEFyZ3MpOw0KK3B1YmxpYzoNCisgICAgVjhfSU5MSU5FIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkJY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1fcElzb2xhdGU7DQorICAgIH0NCisgICAgVjhfSU5MSU5FIGNvbnN0IHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4mIERpcmVjdEdldFZhbHVlKCkgY29uc3QNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG1faFZhbHVlOw0KKyAgICB9DQorICAgIFY4X0lOTElORSB2b2lkIEZvcmNlU2V0VmFsdWUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlKQ0KKyAgICB7DQorICAgICAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgICB9DQorICAgIFY4X0lOTElORSB2b2lkIEFzc2lnbihjb25zdCBDRlhKU0VfVmFsdWUqIGxwVmFsdWUpDQorICAgIHsNCisgICAgICAgIGlmKGxwVmFsdWUpIHsNCisgICAgICAgICAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBscFZhbHVlLT5tX2hWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1faFZhbHVlLlJlc2V0KCk7DQorICAgICAgICB9DQorICAgIH0NCitwdWJsaWM6DQorICAgIHN0YXRpYyBDRlhKU0VfVmFsdWUqIENyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOw0KK3Byb3RlY3RlZDoNCisgICAgdjg6Oklzb2xhdGUqCQkJCW1fcElzb2xhdGU7DQorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4JbV9oVmFsdWU7DQorICAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ29udGV4dDsNCisgICAgZnJpZW5kIGNsYXNzIENGWEpTRV9DbGFzczsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Cb29rTWFya1ZpZXcuY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0Jvb2tNYXJrVmlldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzYzlhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Cb29rTWFya1ZpZXcuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvLyBCb29rTWFya1ZpZXcuY3BwIDogaW1wbGVtZW50YXRpb24gZmlsZQ0KKy8vDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQy5oIg0KKyNpbmNsdWRlICJDaGlsZEZybS5oIg0KKyNpbmNsdWRlICJCb29rTWFya1ZpZXcuaCINCisjaW5jbHVkZSAiUmVhZGVyVkNEb2MuaCINCisjaW5jbHVkZSAiUmVhZGVyVkNWaWV3LmgiDQorDQorI2lmZGVmIF9ERUJVRw0KKyNkZWZpbmUgbmV3IERFQlVHX05FVw0KKyN1bmRlZiBUSElTX0ZJTEUNCitzdGF0aWMgY2hhciBUSElTX0ZJTEVbXSA9IF9fRklMRV9fOw0KKyNlbmRpZg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0Jvb2tNYXJrVmlldw0KKw0KK0lNUExFTUVOVF9EWU5DUkVBVEUoQ0Jvb2tNYXJrVmlldywgQ1RyZWVWaWV3KQ0KKw0KK0NCb29rTWFya1ZpZXc6OkNCb29rTWFya1ZpZXcoKQ0KK3sNCisJbV9wRnJhbSA9IE5VTEw7DQorCW1fcERvYyA9IE5VTEw7DQorfQ0KKw0KK0NCb29rTWFya1ZpZXc6On5DQm9va01hcmtWaWV3KCkNCit7DQorfQ0KKw0KKw0KK0JFR0lOX01FU1NBR0VfTUFQKENCb29rTWFya1ZpZXcsIENUcmVlVmlldykNCisJLy97e0FGWF9NU0dfTUFQKENCb29rTWFya1ZpZXcpDQorCU9OX05PVElGWV9SRUZMRUNUKFRWTl9TRUxDSEFOR0VELCBPblNlbGNoYW5nZWQpDQorCS8vfX1BRlhfTVNHX01BUA0KK0VORF9NRVNTQUdFX01BUCgpDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDQm9va01hcmtWaWV3IGRyYXdpbmcNCisNCit2b2lkIENCb29rTWFya1ZpZXc6Ok9uRHJhdyhDREMqIHBEQykNCit7DQorCUNSZWFkZXJWQ0RvYyogcERvYyA9IEdldERvY3VtZW50KCk7DQorCS8vIFRPRE86IGFkZCBkcmF3IGNvZGUgaGVyZQ0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENCb29rTWFya1ZpZXcgZGlhZ25vc3RpY3MNCisNCisjaWZkZWYgX0RFQlVHDQordm9pZCBDQm9va01hcmtWaWV3OjpBc3NlcnRWYWxpZCgpIGNvbnN0DQorew0KKwlDVHJlZVZpZXc6OkFzc2VydFZhbGlkKCk7DQorfQ0KKw0KK3ZvaWQgQ0Jvb2tNYXJrVmlldzo6RHVtcChDRHVtcENvbnRleHQmIGRjKSBjb25zdA0KK3sNCisJQ1RyZWVWaWV3OjpEdW1wKGRjKTsNCit9DQorDQorQ1JlYWRlclZDRG9jKiBDQm9va01hcmtWaWV3OjpHZXREb2N1bWVudCgpIC8vIG5vbi1kZWJ1ZyB2ZXJzaW9uIGlzIGlubGluZQ0KK3sNCisJQVNTRVJUKG1fcERvY3VtZW50LT5Jc0tpbmRPZihSVU5USU1FX0NMQVNTKENSZWFkZXJWQ0RvYykpKTsNCisJcmV0dXJuIChDUmVhZGVyVkNEb2MqKW1fcERvY3VtZW50Ow0KK30NCisjZW5kaWYgLy9fREVCVUcNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENCb29rTWFya1ZpZXcgbWVzc2FnZSBoYW5kbGVycw0KKw0KK3ZvaWQgQ0Jvb2tNYXJrVmlldzo6T25Jbml0aWFsVXBkYXRlKCkgDQorew0KKwlDVHJlZVZpZXc6Ok9uSW5pdGlhbFVwZGF0ZSgpOw0KKwlDUmVhZGVyVkNEb2MqIHBEb2MgPSBHZXREb2N1bWVudCgpOw0KKwlpZiAoISBtX3BGcmFtIHx8ICFtX3BGcmFtLT5tX3BWaWV3KQ0KKwlyZXR1cm47DQorCW1fcERvYyA9IG1fcEZyYW0tPm1fcFZpZXctPkdldFBERkRvYygpOw0KKwlpZihtX3BEb2MgPT0gTlVMTCkgcmV0dXJuOw0KKwlpbnQgbnVtID0gbV9wRnJhbS0+bV9wVmlldy0+R2V0VG90YWxQYWdlcygpOw0KKyAgICBDU3RyaW5nIHN0ck5hbWUgPSBwRG9jLT5HZXRUaXRsZSgpOw0KKwlGUERGX0JPT0tNQVJLIGJvb2ttYXJrMSA9IE5VTEw7DQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vaW5zZXJ0IGl0ZW1zDQorCQ0KKy8vIAlDVHJlZUN0cmwgJnRyZWVDdHJsID0gdGhpcy0+R2V0VHJlZUN0cmwoKTsNCisvLyAJbV9oSXRlbVJvb3QgPSB0cmVlQ3RybC5JbnNlcnRJdGVtKHN0ck5hbWUsMCwwLFRWSV9ST09ULFRWSV9GSVJTVCk7DQorLy8gCXRyZWVDdHJsLlNldEl0ZW1EYXRhKG1faEl0ZW1Sb290LDApOw0KKy8vIAlib29rbWFyazEgPSBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChtX3BEb2MsIE5VTEwpOw0KKy8vIAlpZiAoYm9va21hcmsxID09IE5VTEwpLy9pbnNlcnQgdGhlIHBhZ2UgaW5kZXggdG8gdHJlZSAgDQorLy8gCXsNCisvLyAJCWZvciAoaW50IGk9MDsgaTxudW07IGkrKykNCisvLyAJCXsNCisvLyAJCQlDU3RyaW5nIHN0cjsNCisvLyAJCQlzdHIuRm9ybWF0KF9UKCJQYWdlJWQiKSwgaSsxKTsNCisvLyAJCQlIVFJFRUlURU0gaEl0ZW0gPSB0cmVlQ3RybC5JbnNlcnRJdGVtKHN0cik7DQorLy8gCQkJdHJlZUN0cmwuU2V0SXRlbURhdGEoaEl0ZW0sIGkpOw0KKy8vIAkJfQ0KKy8vIAl9ZWxzZXsNCisvLyAJCXdoaWxlKGJvb2ttYXJrMSAhPSBOVUxMKSB7DQorLy8gCQkJdGhpcy0+SW5zZXJ0Q2hpbGRJdGVtKGJvb2ttYXJrMSwgbV9oSXRlbVJvb3QsIHRyZWVDdHJsKTsNCisvLyAJCQlib29rbWFyazEgPSBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcobV9wRG9jLGJvb2ttYXJrMSk7DQorLy8gCQl9IA0KKy8vIAl9DQorLy8gCXRyZWVDdHJsLkV4cGFuZChtX2hJdGVtUm9vdCxUVkVfRVhQQU5EKTsNCisvLyAJDQorLy8gCUxPTkcgblN0eWxlID0gOjpHZXRXaW5kb3dMb25nKHRoaXMtPm1faFduZCwgR1dMX1NUWUxFKTsNCisvLyAJblN0eWxlIHw9IFRWU19MSU5FU0FUUk9PVDsNCisvLyAJblN0eWxlIHw9IFRWU19IQVNMSU5FUzsNCisvLyAJblN0eWxlIHw9IFRWU19IQVNCVVRUT05TOw0KKy8vIAk6OlNldFdpbmRvd0xvbmcodGhpcy0+bV9oV25kLCBHV0xfU1RZTEUsIG5TdHlsZSk7DQorCQ0KK30NCisNCit2b2lkIENCb29rTWFya1ZpZXc6Okluc2VydENoaWxkSXRlbShGUERGX0JPT0tNQVJLIGJvb2ttYXJrLCBIVFJFRUlURU0gaEl0ZW0sIENUcmVlQ3RybCAmdHJlZWN0cmwpDQorew0KKw0KKy8vIAlDU3RyaW5nIHN0clRpdGxlOw0KKy8vIAlEV09SRCBkd0l0ZW1EYXRhID0gMDsNCisvLyAJV0NIQVIgYnVmZmVyWzEwMjRdOw0KKy8vIAlDU3RyaW5nIHN0cjsNCisvLyAJaW50IHN0cmxlbnRoID0gMDsNCisvLyAJdW5zaWduZWQgbG9uZyBwZGZfYWN0VHlwZSA9IDA7DQorLy8gCS8vRlBERl9CT09LTUFSSyANCisvLyAJRlBERl9ERVNUIGRlc3QgPSBOVUxMOw0KKy8vIAlGUERGX0FDVElPTiBhY3Rpb24gPSBOVUxMOw0KKy8vIAkNCisvLyAJbWVtc2V0KGJ1ZmZlciwwLDEwMjQqc2l6ZW9mKFdDSEFSKSk7DQorLy8gCXN0cmxlbnRoID0gRlBERkJvb2ttYXJrX0dldFRpdGxlKGJvb2ttYXJrLCBidWZmZXIsIDApOw0KKy8vIAlpbnQgbmxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLDAsYnVmZmVyLC0xLE5VTEwsTlVMTCxOVUxMLE5VTEwpOw0KKy8vIAljaGFyICpidWZmZXIxID0gbmV3IGNoYXJbbmxlbl07DQorLy8gCW1lbXNldChidWZmZXIxLDAsbmxlbik7DQorLy8gCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLDAsYnVmZmVyLHN0cmxlbnRoLGJ1ZmZlcjEsbmxlbixOVUxMLE5VTEwpOw0KKy8vIAlidWZmZXIxW25sZW4gLTFdID0gJ1wwJzsNCisvLyAvKglpbnQgc3RybCA9IHN0cmxlbihidWZmZXIxKTsNCisvLyAJc3RyVGl0bGUgPSBidWZmZXI7Ly8NCisvLyAJc3RyVGl0bGUgPSBzdHJUaXRsZS5MZWZ0KHN0cmwtMSk7Ki8NCisvLyAJaEl0ZW0gPSB0cmVlY3RybC5JbnNlcnRJdGVtKGJ1ZmZlcjEsIDAsIDAsIGhJdGVtLCBUVklfTEFTVCk7DQorLy8gCWFjdGlvbiA9IEZQREZCb29rbWFya19HZXRBY3Rpb24oYm9va21hcmspOw0KKy8vIAlpZiAoYWN0aW9uICE9IE5VTEwpDQorLy8gCXsNCisvLyAJCXBkZl9hY3RUeXBlID0gRlBERkFjdGlvbl9HZXRUeXBlKGFjdGlvbik7DQorLy8gCQlpZiAocGRmX2FjdFR5cGUgPT0gMSkNCisvLyAJCXsNCisvLyAJCQlkZXN0ID0gRlBERkFjdGlvbl9HZXREZXN0KG1fcERvYywgYWN0aW9uKTsNCisvLyAJCQlkd0l0ZW1EYXRhID0gRlBERkRlc3RfR2V0UGFnZUluZGV4KG1fcERvYywgZGVzdCk7DQorLy8gCQkJaW50IG5ab29tTW9kZSA9IEZQREZEZXN0X0dldFpvb21Nb2RlKGRlc3QpOw0KKy8vIAkJCWlmKG5ab29tTW9kZSA9PSAxKQ0KKy8vIAkJCXsNCisvLyAJCQkJZG91YmxlIG5TdGFydFggPSBGUERGRGVzdF9HZXRab29tUGFyYW0oZGVzdCwgMCk7DQorLy8gCQkJCWRvdWJsZSBuU3RhcnRZID0gRlBERkRlc3RfR2V0Wm9vbVBhcmFtKGRlc3QsIDEpOw0KKy8vIAkJCQlDUG9pbnQgcG9zKChpbnQpblN0YXJ0WCwgKGludCluU3RhcnRZKTsNCisvLyAJCQkJbV9Qb3NNYXAuU2V0QXQoaEl0ZW0sIHBvcyk7DQorLy8gCQkJfQ0KKy8vIAkJCXRyZWVjdHJsLlNldEl0ZW1EYXRhKGhJdGVtLCBkd0l0ZW1EYXRhKTsNCisvLyAJCQkNCisvLyAJCX1lbHNlew0KKy8vIAkJCWR3SXRlbURhdGEgPSAwOw0KKy8vIAkJCXRyZWVjdHJsLlNldEl0ZW1EYXRhKGhJdGVtLCBkd0l0ZW1EYXRhKTsNCisvLyAJCX0NCisvLyAJCQ0KKy8vIAl9ZWxzZXsNCisvLyAJCWRlc3QgPSBGUERGQm9va21hcmtfR2V0RGVzdChtX3BEb2MsIGJvb2ttYXJrKTsNCisvLyAJCWR3SXRlbURhdGEgPSBGUERGRGVzdF9HZXRQYWdlSW5kZXgobV9wRG9jLCBkZXN0KTsNCisvLyAJCXRyZWVjdHJsLlNldEl0ZW1EYXRhKGhJdGVtLCBkd0l0ZW1EYXRhKTsNCisvLyAJfQ0KKy8vIAkNCisvLyAJYm9va21hcmsgPSBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChtX3BEb2MsIGJvb2ttYXJrKTsNCisvLyAJd2hpbGUoYm9va21hcmsgIT0gTlVMTCkNCisvLyAJew0KKy8vIAkJdGhpcy0+SW5zZXJ0Q2hpbGRJdGVtKGJvb2ttYXJrLCBoSXRlbSwgdHJlZWN0cmwpOw0KKy8vIAkJYm9va21hcmsgPSBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcobV9wRG9jLCBib29rbWFyayk7DQorLy8gCX0gDQorLy8gCWRlbGV0ZSBidWZmZXIxOw0KK30NCisNCit2b2lkIENCb29rTWFya1ZpZXc6Ok9uU2VsY2hhbmdlZChOTUhEUiogcE5NSERSLCBMUkVTVUxUKiBwUmVzdWx0KSANCit7DQorCU5NX1RSRUVWSUVXKiBwTk1UcmVlVmlldyA9IChOTV9UUkVFVklFVyopcE5NSERSOw0KKwkvLyBUT0RPOiBBZGQgeW91ciBjb250cm9sIG5vdGlmaWNhdGlvbiBoYW5kbGVyIGNvZGUgaGVyZQ0KKwlIVFJFRUlURU0gaEl0ZW07DQorCURXT1JEIGR3UGFnZUlkZXg9IDA7DQorCWlmKG1fcERvYyA9PSBOVUxMKSByZXR1cm47DQorCWhJdGVtID0gR2V0VHJlZUN0cmwoKS5HZXRTZWxlY3RlZEl0ZW0oKTsNCisJZHdQYWdlSWRleCA9IEdldFRyZWVDdHJsKCkuR2V0SXRlbURhdGEoaEl0ZW0pOw0KKwlDUG9pbnQgcDsNCisJaWYoMCA9PSBtX1Bvc01hcC5Mb29rdXAoaEl0ZW0sIHApKQ0KKwl7DQorCQlwLnggPSAwOyANCisJCXAueSA9IDA7DQorCX0NCisJbV9wRnJhbS0+bV9wVmlldy0+TG9hZFBERlBhZ2UobV9wRG9jLCBkd1BhZ2VJZGV4LCBwKTsNCisJbV9wRnJhbS0+bV9wVmlldy0+SW52YWxpZGF0ZSgpOw0KKwkqcFJlc3VsdCA9IDA7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Cb29rTWFya1ZpZXcuaCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Cb29rTWFya1ZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA5NjRjCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0Jvb2tNYXJrVmlldy5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZiAhZGVmaW5lZChBRlhfQk9PS01BUktWSUVXX0hfX0IxRUIyODAzX0JFMjFfNDc2OF9BNTRCXzJERTFFMEZDOTY4QV9fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX0JPT0tNQVJLVklFV19IX19CMUVCMjgwM19CRTIxXzQ3NjhfQTU0Ql8yREUxRTBGQzk2OEFfX0lOQ0xVREVEXw0KKw0KKyNpZiBfTVNDX1ZFUiA+IDEwMDANCisjcHJhZ21hIG9uY2UNCisjZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwDQorLy8gQm9va01hcmtWaWV3LmggOiBoZWFkZXIgZmlsZQ0KKy8vDQorDQorY2xhc3MgQ0NoaWxkRnJhbWU7DQorY2xhc3MgQ1JlYWRlclZDRG9jOw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0Jvb2tNYXJrVmlldyB2aWV3DQorDQorY2xhc3MgQ0Jvb2tNYXJrVmlldyA6IHB1YmxpYyBDVHJlZVZpZXcNCit7DQorcHJvdGVjdGVkOg0KKwlDQm9va01hcmtWaWV3KCk7ICAgICAgICAgICAvLyBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdXNlZCBieSBkeW5hbWljIGNyZWF0aW9uDQorCURFQ0xBUkVfRFlOQ1JFQVRFKENCb29rTWFya1ZpZXcpDQorDQorLy8gQXR0cmlidXRlcw0KK3B1YmxpYzoNCisJQ0NoaWxkRnJhbWUgKm1fcEZyYW07DQorCUZQREZfRE9DVU1FTlQgbV9wRG9jOw0KKwlIVFJFRUlURU0gbV9oSXRlbVJvb3Q7DQorCUNSZWFkZXJWQ0RvYyogR2V0RG9jdW1lbnQoKTsNCisvLyBPcGVyYXRpb25zDQorcHVibGljOg0KKwl2b2lkIEluc2VydENoaWxkSXRlbShGUERGX0JPT0tNQVJLIGJvb2ttYXJrLCBIVFJFRUlURU0gaEl0ZW0sIENUcmVlQ3RybCAmdHJlZWN0cmwpOw0KKw0KKy8vIE92ZXJyaWRlcw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENCb29rTWFya1ZpZXcpDQorCXB1YmxpYzoNCisJdmlydHVhbCB2b2lkIE9uSW5pdGlhbFVwZGF0ZSgpOw0KKwlwcm90ZWN0ZWQ6DQorCXZpcnR1YWwgdm9pZCBPbkRyYXcoQ0RDKiBwREMpOyAgICAgIC8vIG92ZXJyaWRkZW4gdG8gZHJhdyB0aGlzIHZpZXcNCisJLy99fUFGWF9WSVJUVUFMDQorDQorLy8gSW1wbGVtZW50YXRpb24NCitwcm90ZWN0ZWQ6DQorCXZpcnR1YWwgfkNCb29rTWFya1ZpZXcoKTsNCisjaWZkZWYgX0RFQlVHDQorCXZpcnR1YWwgdm9pZCBBc3NlcnRWYWxpZCgpIGNvbnN0Ow0KKwl2aXJ0dWFsIHZvaWQgRHVtcChDRHVtcENvbnRleHQmIGRjKSBjb25zdDsNCisjZW5kaWYNCisNCisJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KK3Byb3RlY3RlZDoNCisJLy97e0FGWF9NU0coQ0Jvb2tNYXJrVmlldykNCisJYWZ4X21zZyB2b2lkIE9uU2VsY2hhbmdlZChOTUhEUiogcE5NSERSLCBMUkVTVUxUKiBwUmVzdWx0KTsNCisJLy99fUFGWF9NU0cNCisJREVDTEFSRV9NRVNTQUdFX01BUCgpDQorcHJpdmF0ZToNCisJQ01hcDxIVFJFRUlURU0sIEhUUkVFSVRFTSYsIENQb2ludCwgQ1BvaW50Jj4gbV9Qb3NNYXA7IA0KK307DQorDQorI2lmbmRlZiBfREVCVUcgIC8vIGRlYnVnIHZlcnNpb24gaW4gUERGUmVhZGVyVkNWaWV3LmNwcA0KK2lubGluZSBDUmVhZGVyVkNEb2MqIENCb29rTWFya1ZpZXc6OkdldERvY3VtZW50KCkNCit7IHJldHVybiAoQ1JlYWRlclZDRG9jKiltX3BEb2N1bWVudDsgfQ0KKyNlbmRpZg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLy97e0FGWF9JTlNFUlRfTE9DQVRJT059fQ0KKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIHdpbGwgaW5zZXJ0IGFkZGl0aW9uYWwgZGVjbGFyYXRpb25zIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcHJldmlvdXMgbGluZS4NCisNCisjZW5kaWYgLy8gIWRlZmluZWQoQUZYX0JPT0tNQVJLVklFV19IX19CMUVCMjgwM19CRTIxXzQ3NjhfQTU0Ql8yREUxRTBGQzk2OEFfX0lOQ0xVREVEXykNCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvQ2hpbGRGcm0uY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NoaWxkRnJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDMyYTcyCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NoaWxkRnJtLmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gQ2hpbGRGcm0uY3BwIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIENDaGlsZEZyYW1lIGNsYXNzDQorLy8NCisNCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorI2luY2x1ZGUgIlJlYWRlclZDLmgiDQorDQorI2luY2x1ZGUgIkNoaWxkRnJtLmgiDQorI2luY2x1ZGUgIkZYX1NwbGl0dGVyV25kLmgiDQorI2luY2x1ZGUgIkJvb2ttYXJrVmlldy5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQ1ZpZXcuaCINCisjaWZkZWYgX0RFQlVHDQorI2RlZmluZSBuZXcgREVCVUdfTkVXDQorI3VuZGVmIFRISVNfRklMRQ0KK3N0YXRpYyBjaGFyIFRISVNfRklMRVtdID0gX19GSUxFX187DQorI2VuZGlmDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDQ2hpbGRGcmFtZQ0KKw0KK0lNUExFTUVOVF9EWU5DUkVBVEUoQ0NoaWxkRnJhbWUsIENNRElDaGlsZFduZCkNCisNCitCRUdJTl9NRVNTQUdFX01BUChDQ2hpbGRGcmFtZSwgQ01ESUNoaWxkV25kKQ0KKwkvL3t7QUZYX01TR19NQVAoQ0NoaWxkRnJhbWUpDQorCU9OX1dNX1NJWkUoKQ0KKwkvL319QUZYX01TR19NQVANCitFTkRfTUVTU0FHRV9NQVAoKQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0NoaWxkRnJhbWUgY29uc3RydWN0aW9uL2Rlc3RydWN0aW9uDQorDQorQ0NoaWxkRnJhbWU6OkNDaGlsZEZyYW1lKCkNCit7DQorCS8vIFRPRE86IGFkZCBtZW1iZXIgaW5pdGlhbGl6YXRpb24gY29kZSBoZXJlDQorCS8vbV9uUG9zSCA9IG1fblBvc1YgPSAwOw0KKy8vCW1fcEJrVmlldyA9IE5VTEw7DQorCW1fcFZpZXcgPSBOVUxMOw0KKy8vCW1fYkJvb2ttYXJrID0gRkFMU0U7DQorfQ0KKw0KK0NDaGlsZEZyYW1lOjp+Q0NoaWxkRnJhbWUoKQ0KK3sNCisvKglpZiAobV9wQmtWaWV3ICE9IE5VTEwpDQorCXsNCisJCWRlbGV0ZSBtX3BCa1ZpZXc7DQorCQltX3BCa1ZpZXcgPSBOVUxMOw0KKwl9DQorCWlmIChtX3BWaWV3ICE9IE5VTEwpDQorCXsNCisJCWRlbGV0ZSBtX3BWaWV3Ow0KKwkJbV9wVmlldyA9IE5VTEw7DQorCX0qLw0KK30NCisNCitCT09MIENDaGlsZEZyYW1lOjpQcmVDcmVhdGVXaW5kb3coQ1JFQVRFU1RSVUNUJiBjcykNCit7DQorDQorCWlmKCAhQ01ESUNoaWxkV25kOjpQcmVDcmVhdGVXaW5kb3coY3MpICkNCisJCXJldHVybiBGQUxTRTsNCisJY3Muc3R5bGUgfD0gV1NfTUFYSU1JWkUgfCBXU19WSVNJQkxFOw0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDQ2hpbGRGcmFtZSBkaWFnbm9zdGljcw0KKw0KKyNpZmRlZiBfREVCVUcNCit2b2lkIENDaGlsZEZyYW1lOjpBc3NlcnRWYWxpZCgpIGNvbnN0DQorew0KKwlDTURJQ2hpbGRXbmQ6OkFzc2VydFZhbGlkKCk7DQorfQ0KKw0KK3ZvaWQgQ0NoaWxkRnJhbWU6OkR1bXAoQ0R1bXBDb250ZXh0JiBkYykgY29uc3QNCit7DQorCUNNRElDaGlsZFduZDo6RHVtcChkYyk7DQorfQ0KKw0KKyNlbmRpZiAvL19ERUJVRw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0NoaWxkRnJhbWUgbWVzc2FnZSBoYW5kbGVycw0KKw0KKw0KKw0KKw0KKw0KK3ZvaWQgQ0NoaWxkRnJhbWU6Ok9uU2l6ZShVSU5UIG5UeXBlLCBpbnQgY3gsIGludCBjeSkgDQorew0KKwlDTURJQ2hpbGRXbmQ6Ok9uU2l6ZShuVHlwZSwgY3gsIGN5KTsNCisNCisJDQorfQ0KKw0KK0JPT0wgQ0NoaWxkRnJhbWU6Ok9uQ3JlYXRlQ2xpZW50KExQQ1JFQVRFU1RSVUNUIGxwY3MsIENDcmVhdGVDb250ZXh0KiBwQ29udGV4dCkgDQorew0KKwlpZiAoICFtX3duZFNwbGl0dGVyLkNyZWF0ZVN0YXRpYyggdGhpcywgMSwgMiApIHx8DQorCQkhbV93bmRTcGxpdHRlci5DcmVhdGVWaWV3KCAwLDAsUlVOVElNRV9DTEFTUyhDQm9va01hcmtWaWV3KSxDU2l6ZSgxODAsMCkscENvbnRleHQgKXx8IA0KKwkJICFtX3duZFNwbGl0dGVyLkNyZWF0ZVZpZXcoIDAsMSxwQ29udGV4dC0+bV9wTmV3Vmlld0NsYXNzLENTaXplKDAsMCkscENvbnRleHQgKSkgDQorCQl7DQorCQkJcmV0dXJuIEZBTFNFOw0KKwkJfQ0KKwltX3BCa1ZpZXcgPSAoQ0Jvb2tNYXJrVmlldyAqKShtX3duZFNwbGl0dGVyLkdldFBhbmUoMCwwKSk7DQorCW1fcEJrVmlldy0+bV9wRnJhbSA9IHRoaXM7DQorCW1fcFZpZXcgPSAoQ1JlYWRlclZDVmlldyopKG1fd25kU3BsaXR0ZXIuR2V0UGFuZSgwLDEpKTsNCisJbV9wVmlldy0+bV9wRnJhbSA9IHRoaXM7DQorCXRoaXMtPlNldEFjdGl2ZVZpZXcoIChDVmlldyopbV93bmRTcGxpdHRlci5HZXRQYW5lKDAsMSkgKTsNCisJDQorCXJldHVybiBUUlVFOw0KKwkNCisJLy9yZXR1cm4gQ01ESUNoaWxkV25kOjpPbkNyZWF0ZUNsaWVudChscGNzLCBwQ29udGV4dCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9DaGlsZEZybS5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NoaWxkRnJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmYzdiZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvQ2hpbGRGcm0uaApAQCAtMCwwICsxLDY0IEBACisvLyBDaGlsZEZybS5oIDogaW50ZXJmYWNlIG9mIHRoZSBDQ2hpbGRGcmFtZSBjbGFzcw0KKy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisjaWYgIWRlZmluZWQoQUZYX0NISUxERlJNX0hfXzQ1MkY4MzhFX0EzRjdfNEJCRl9CNEJCXzQ3NjVGNEQzOTRFN19fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX0NISUxERlJNX0hfXzQ1MkY4MzhFX0EzRjdfNEJCRl9CNEJCXzQ3NjVGNEQzOTRFN19fSU5DTFVERURfDQorDQorI2lmIF9NU0NfVkVSID4gMTAwMA0KKyNwcmFnbWEgb25jZQ0KKyNlbmRpZiAvLyBfTVNDX1ZFUiA+IDEwMDANCisNCisvL2NsYXNzIENGWF9TcGxpdHRlclduZDsNCisjaW5jbHVkZSAiRlhfU3BsaXR0ZXJXbmQuaCINCitjbGFzcyBDUmVhZGVyVkNWaWV3Ow0KK2NsYXNzIENCb29rTWFya1ZpZXc7DQorLy9jbGFzcyBDRlhfU3BsaXR0ZXJXbmQ7DQorY2xhc3MgQ0NoaWxkRnJhbWUgOiBwdWJsaWMgQ01ESUNoaWxkV25kDQorew0KKwlERUNMQVJFX0RZTkNSRUFURShDQ2hpbGRGcmFtZSkNCitwdWJsaWM6DQorCUNDaGlsZEZyYW1lKCk7DQorDQorLy8gQXR0cmlidXRlcw0KK3B1YmxpYzoNCisJQ0ZYX1NwbGl0dGVyV25kIG1fd25kU3BsaXR0ZXI7DQorCUNSZWFkZXJWQ1ZpZXcqIG1fcFZpZXc7DQorCUNCb29rTWFya1ZpZXcqIG1fcEJrVmlldzsNCisvLwlCT09MIG1fYkJvb2ttYXJrOw0KKy8vIE9wZXJhdGlvbnMNCitwdWJsaWM6DQorDQorLy8gT3ZlcnJpZGVzDQorCS8vIENsYXNzV2l6YXJkIGdlbmVyYXRlZCB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcw0KKwkvL3t7QUZYX1ZJUlRVQUwoQ0NoaWxkRnJhbWUpDQorCXB1YmxpYzoNCisJdmlydHVhbCBCT09MIFByZUNyZWF0ZVdpbmRvdyhDUkVBVEVTVFJVQ1QmIGNzKTsNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIEJPT0wgT25DcmVhdGVDbGllbnQoTFBDUkVBVEVTVFJVQ1QgbHBjcywgQ0NyZWF0ZUNvbnRleHQqIHBDb250ZXh0KTsNCisJLy99fUFGWF9WSVJUVUFMDQorDQorLy8gSW1wbGVtZW50YXRpb24NCitwdWJsaWM6DQorCXZpcnR1YWwgfkNDaGlsZEZyYW1lKCk7DQorI2lmZGVmIF9ERUJVRw0KKwl2aXJ0dWFsIHZvaWQgQXNzZXJ0VmFsaWQoKSBjb25zdDsNCisJdmlydHVhbCB2b2lkIER1bXAoQ0R1bXBDb250ZXh0JiBkYykgY29uc3Q7DQorI2VuZGlmDQorDQorLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KK3Byb3RlY3RlZDoNCisJLy97e0FGWF9NU0coQ0NoaWxkRnJhbWUpDQorCWFmeF9tc2cgdm9pZCBPblNpemUoVUlOVCBuVHlwZSwgaW50IGN4LCBpbnQgY3kpOw0KKwkvL319QUZYX01TRw0KKwlERUNMQVJFX01FU1NBR0VfTUFQKCkNCitwcml2YXRlOg0KKwkvL2ludCBtX25Qb3NILCBtX25Qb3NWOw0KK307DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfQ0hJTERGUk1fSF9fNDUyRjgzOEVfQTNGN180QkJGX0I0QkJfNDc2NUY0RDM5NEU3X19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NvbnZlcnREbGcuY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NvbnZlcnREbGcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzE5NDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvQ29udmVydERsZy5jcHAKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29udmVydERsZy5jcHAgOiBpbXBsZW1lbnRhdGlvbiBmaWxlDQorLy8NCisNCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorI2luY2x1ZGUgIlJlYWRlclZDLmgiDQorI2luY2x1ZGUgIkNvbnZlcnREbGcuaCINCisNCisjaW5jbHVkZSAiTWFpbkZybS5oIg0KKyNpbmNsdWRlICJDaGlsZEZybS5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQ1ZpZXcuaCINCisNCisjaWZkZWYgX0RFQlVHDQorI2RlZmluZSBuZXcgREVCVUdfTkVXDQorI3VuZGVmIFRISVNfRklMRQ0KK3N0YXRpYyBjaGFyIFRISVNfRklMRVtdID0gX19GSUxFX187DQorI2VuZGlmDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDQ29udmVydERsZyBkaWFsb2cNCisNCisNCitDQ29udmVydERsZzo6Q0NvbnZlcnREbGcoQ1duZCogcFBhcmVudCAvKj1OVUxMKi8pDQorCTogQ0RpYWxvZyhDQ29udmVydERsZzo6SURELCBwUGFyZW50KQ0KK3sNCisJLy97e0FGWF9EQVRBX0lOSVQoQ0NvbnZlcnREbGcpDQorCW1fbkZsYWcgPSAtMTsNCisJLy99fUFGWF9EQVRBX0lOSVQNCit9DQorDQorDQordm9pZCBDQ29udmVydERsZzo6RG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKQ0KK3sNCisJQ0RpYWxvZzo6RG9EYXRhRXhjaGFuZ2UocERYKTsNCisJLy97e0FGWF9EQVRBX01BUChDQ29udmVydERsZykNCisJRERYX1JhZGlvKHBEWCwgSURDX1JBRElPX1N0cmVhbSwgbV9uRmxhZyk7DQorCS8vfX1BRlhfREFUQV9NQVANCit9DQorDQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ0NvbnZlcnREbGcsIENEaWFsb2cpDQorCS8ve3tBRlhfTVNHX01BUChDQ29udmVydERsZykNCisJLy99fUFGWF9NU0dfTUFQDQorRU5EX01FU1NBR0VfTUFQKCkNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENDb252ZXJ0RGxnIG1lc3NhZ2UgaGFuZGxlcnMNCisNCitCT09MIENDb252ZXJ0RGxnOjpPbkluaXREaWFsb2coKSANCit7DQorCUNEaWFsb2c6Ok9uSW5pdERpYWxvZygpOw0KKwkNCisJLy8gVE9ETzogQWRkIGV4dHJhIGluaXRpYWxpemF0aW9uIGhlcmUNCisJbV9wVmlldyA9IChDUmVhZGVyVkNWaWV3ICopKCgoQ0NoaWxkRnJhbWUgKikoKENNYWluRnJhbWUgKilBZnhHZXRNYWluV25kKCkpLT5HZXRBY3RpdmVGcmFtZSgpKS0+R2V0QWN0aXZlVmlldygpKTsNCisJQVNTRVJUKG1fcFZpZXcpOw0KKwkoKENCdXR0b24gKilHZXREbGdJdGVtKElEQ19SQURJT19BcHBlYXJhbmNlKSktPlNldENoZWNrKDEpOw0KKwlyZXR1cm4gVFJVRTsgIC8vIHJldHVybiBUUlVFIHVubGVzcyB5b3Ugc2V0IHRoZSBmb2N1cyB0byBhIGNvbnRyb2wNCisJICAgICAgICAgICAgICAvLyBFWENFUFRJT046IE9DWCBQcm9wZXJ0eSBQYWdlcyBzaG91bGQgcmV0dXJuIEZBTFNFDQorfQ0KKw0KK3ZvaWQgQ0NvbnZlcnREbGc6Ok9uT0soKSANCit7DQorCS8vIFRPRE86IEFkZCBleHRyYSB2YWxpZGF0aW9uIGhlcmUNCisJVXBkYXRlRGF0YShUUlVFKTsNCisJQ0RpYWxvZzo6T25PSygpOw0KK30NCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvQ29udmVydERsZy5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NvbnZlcnREbGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWY5OTMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0NvbnZlcnREbGcuaApAQCAtMCwwICsxLDQ3IEBACisjaWYgIWRlZmluZWQoQUZYX0NPTlZFUlRETEdfSF9fOUJCOEVBRERfQ0NERF80QzY4X0E4QTBfQzE2NTY2NTNBOTQ3X19JTkNMVURFRF8pDQorI2RlZmluZSBBRlhfQ09OVkVSVERMR19IX185QkI4RUFERF9DQ0REXzRDNjhfQThBMF9DMTY1NjY1M0E5NDdfX0lOQ0xVREVEXw0KKw0KKyNpZiBfTVNDX1ZFUiA+IDEwMDANCisjcHJhZ21hIG9uY2UNCisjZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwDQorLy8gQ29udmVydERsZy5oIDogaGVhZGVyIGZpbGUNCisvLw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0NvbnZlcnREbGcgZGlhbG9nDQorY2xhc3MgQ1JlYWRlclZDVmlldzsNCitjbGFzcyBDQ29udmVydERsZyA6IHB1YmxpYyBDRGlhbG9nDQorew0KKy8vIENvbnN0cnVjdGlvbg0KK3B1YmxpYzoNCisJQ0NvbnZlcnREbGcoQ1duZCogcFBhcmVudCA9IE5VTEwpOyAgIC8vIHN0YW5kYXJkIGNvbnN0cnVjdG9yDQorDQorLy8gRGlhbG9nIERhdGENCisJLy97e0FGWF9EQVRBKENDb252ZXJ0RGxnKQ0KKwllbnVtIHsgSUREID0gSUREX0RMR19DT05WRVJUIH07DQorCWludAkJbV9uRmxhZzsNCisJLy99fUFGWF9EQVRBDQorDQorDQorLy8gT3ZlcnJpZGVzDQorCS8vIENsYXNzV2l6YXJkIGdlbmVyYXRlZCB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcw0KKwkvL3t7QUZYX1ZJUlRVQUwoQ0NvbnZlcnREbGcpDQorCXByb3RlY3RlZDoNCisJdmlydHVhbCB2b2lkIERvRGF0YUV4Y2hhbmdlKENEYXRhRXhjaGFuZ2UqIHBEWCk7ICAgIC8vIEREWC9ERFYgc3VwcG9ydA0KKwkvL319QUZYX1ZJUlRVQUwNCisNCisvLyBJbXBsZW1lbnRhdGlvbg0KK3Byb3RlY3RlZDoNCisJQ1JlYWRlclZDVmlldyAqbV9wVmlldzsNCisJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KKwkvL3t7QUZYX01TRyhDQ29udmVydERsZykNCisJdmlydHVhbCBCT09MIE9uSW5pdERpYWxvZygpOw0KKwl2aXJ0dWFsIHZvaWQgT25PSygpOw0KKwkvL319QUZYX01TRw0KKwlERUNMQVJFX01FU1NBR0VfTUFQKCkNCit9Ow0KKw0KKy8ve3tBRlhfSU5TRVJUX0xPQ0FUSU9OfX0NCisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB3aWxsIGluc2VydCBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZXZpb3VzIGxpbmUuDQorDQorI2VuZGlmIC8vICFkZWZpbmVkKEFGWF9DT05WRVJURExHX0hfXzlCQjhFQUREX0NDRERfNEM2OF9BOEEwX0MxNjU2NjUzQTk0N19fSU5DTFVERURfKQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9FeHBvcnRQYWdlLmNwcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9FeHBvcnRQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI4N2E3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0V4cG9ydFBhZ2UuY3BwCkBAIC0wLDAgKzEsMTg5IEBACisvLyBFeHBvcnRQYWdlLmNwcCA6IGltcGxlbWVudGF0aW9uIGZpbGUNCisvLw0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiUmVhZGVyVkMuaCINCisjaW5jbHVkZSAiRXhwb3J0UGFnZS5oIg0KKw0KKyNpbmNsdWRlICJNYWluRnJtLmgiDQorI2luY2x1ZGUgIkNoaWxkRnJtLmgiDQorI2luY2x1ZGUgIlJlYWRlclZDVmlldy5oIg0KKw0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENFeHBvcnRQYWdlIGRpYWxvZw0KKw0KKw0KK0NFeHBvcnRQYWdlOjpDRXhwb3J0UGFnZShDV25kKiBwUGFyZW50IC8qPU5VTEwqLykNCisJOiBDRGlhbG9nKENFeHBvcnRQYWdlOjpJREQsIHBQYXJlbnQpDQorew0KKwkvL3t7QUZYX0RBVEFfSU5JVChDRXhwb3J0UGFnZSkNCisJbV9uSGVpZ2h0ID0gMDsNCisJbV9uUGFnZUhlaWdodCA9IDA7DQorCW1fblJvdGF0ZSA9IDA7DQorCW1fbldpZHRoID0gMDsNCisJbV9uUGFnZVdpZHRoID0gMDsNCisJLy99fUFGWF9EQVRBX0lOSVQNCisJbV9iaXRtYXAgPSBOVUxMOw0KK30NCisNCisNCit2b2lkIENFeHBvcnRQYWdlOjpEb0RhdGFFeGNoYW5nZShDRGF0YUV4Y2hhbmdlKiBwRFgpDQorew0KKwlDRGlhbG9nOjpEb0RhdGFFeGNoYW5nZShwRFgpOw0KKwkvL3t7QUZYX0RBVEFfTUFQKENFeHBvcnRQYWdlKQ0KKwlERFhfVGV4dChwRFgsIElEQ19FRElUX0hFSUdIVCwgbV9uSGVpZ2h0KTsNCisJRERYX1RleHQocERYLCBJRENfRURJVF9QQUdFX0hFSUdIVCwgbV9uUGFnZUhlaWdodCk7DQorCUREWF9UZXh0KHBEWCwgSURDX0VESVRfUk9UQVRFLCBtX25Sb3RhdGUpOw0KKwlERFhfVGV4dChwRFgsIElEQ19FRElUX1dJRFRILCBtX25XaWR0aCk7DQorCUREWF9UZXh0KHBEWCwgSURDX0VESVRfUEFHRV9XSURUSCwgbV9uUGFnZVdpZHRoKTsNCisJLy99fUFGWF9EQVRBX01BUA0KK30NCisNCisNCitCRUdJTl9NRVNTQUdFX01BUChDRXhwb3J0UGFnZSwgQ0RpYWxvZykNCisJLy97e0FGWF9NU0dfTUFQKENFeHBvcnRQYWdlKQ0KKwlPTl9CTl9DTElDS0VEKElEQ19SYW5kZXJfUGFnZSwgT25SYW5kZXJQYWdlKQ0KKwlPTl9CTl9DTElDS0VEKElEQ19TYXZlLCBPblNhdmUpDQorCU9OX1dNX1BBSU5UKCkNCisJLy99fUFGWF9NU0dfTUFQDQorRU5EX01FU1NBR0VfTUFQKCkNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENFeHBvcnRQYWdlIG1lc3NhZ2UgaGFuZGxlcnMNCisNCit2b2lkIENFeHBvcnRQYWdlOjpPblJhbmRlclBhZ2UoKSANCit7DQorCWlmIChtX3BWaWV3KQ0KKwl7DQorCQlVcGRhdGVEYXRhKFRSVUUpOw0KKwkJbV9wYWdlPW1fcFZpZXctPkdldFBhZ2UoKTsNCisJCWlmICghbV9wYWdlKSByZXR1cm47DQorCQlpZiAobV9uUm90YXRlPT0xIHx8IG1fblJvdGF0ZT09MykNCisJCXsNCisJCQlpbnQgdGVtcDsNCisJCQl0ZW1wPW1fbkhlaWdodDsNCisJCQltX25IZWlnaHQ9bV9uV2lkdGg7DQorCQkJbV9uV2lkdGg9dGVtcDsNCisJCX0NCisJCW1fYml0bWFwPUZQREZCaXRtYXBfQ3JlYXRlKG1fbldpZHRoLG1fbkhlaWdodCxGUERGQml0bWFwX0JHUngpOw0KKwkJRlBERkJpdG1hcF9GaWxsUmVjdChtX2JpdG1hcCwwLDAsbV9uV2lkdGgsbV9uSGVpZ2h0LDB4ZmYsMHhmZiwweGZmLDB4ZmYpOw0KKwkJRlBERl9SZW5kZXJQYWdlQml0bWFwKG1fYml0bWFwLG1fcGFnZSwwLDAsMjAwLDIwMCxtX25Sb3RhdGUsRlBERl9BTk5PVCk7DQorCQlJbnZhbGlkYXRlKCk7DQorCQlpZiAobV9uUm90YXRlPT0xIHx8IG1fblJvdGF0ZT09MykNCisJCXsNCisJCQlpbnQgdGVtcDsNCisJCQl0ZW1wPW1fbkhlaWdodDsNCisJCQltX25IZWlnaHQ9bV9uV2lkdGg7DQorCQkJbV9uV2lkdGg9dGVtcDsNCisJCX0NCisJCS8vRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7DQorCQlVcGRhdGVEYXRhKEZBTFNFKTsNCisJfQ0KKwkNCit9DQorDQordm9pZCBDRXhwb3J0UGFnZTo6SW5pdERpYWxvZ0luZm8oQ1JlYWRlclZDVmlldyAqcFZpZXcpDQorew0KKwltX3BWaWV3PXBWaWV3Ow0KKwlpZiAocFZpZXcpCW1fcGFnZT1wVmlldy0+R2V0UGFnZSgpOw0KKwlTZXREbGdJbmZvKCk7DQorfQ0KKw0KK3ZvaWQgQ0V4cG9ydFBhZ2U6OlNldERsZ0luZm8oKQ0KK3sNCisJaWYgKCFtX3BhZ2UpIHJldHVybjsNCisJZG91YmxlIGhlaWdodCx3aWR0aDsNCisJd2lkdGg9RlBERl9HZXRQYWdlV2lkdGgobV9wYWdlKTsNCisJaGVpZ2h0PUZQREZfR2V0UGFnZUhlaWdodChtX3BhZ2UpOw0KKwkNCisJVXBkYXRlRGF0YShUUlVFKTsJDQorCW1fblBhZ2VIZWlnaHQgPSAoaW50KWhlaWdodDsNCisJbV9uUGFnZVdpZHRoID0gKGludCl3aWR0aDsNCisJbV9uV2lkdGg9KGludCl3aWR0aC8zOw0KKwltX25IZWlnaHQ9KGludCloZWlnaHQvMzsNCisJVXBkYXRlRGF0YShGQUxTRSk7DQorfQ0KKw0KK3ZvaWQgQ0V4cG9ydFBhZ2U6Ok9uU2F2ZSgpIA0KK3sNCisJQ0ZpbGVEaWFsb2cgU2F2RGxnKEZBTFNFLCIiLCIiLE9GTl9GSUxFTVVTVEVYSVNUIHxPRk5fSElERVJFQURPTkxZLCJibXAoKi5ibXApfCouYm1wfHxBbGwgRmlsZXMoKi4qKXwqLioiKTsNCisJaWYgKFNhdkRsZy5Eb01vZGFsKCk9PUlET0spDQorCXsNCisJCUNTdHJpbmcgc3RyRmlsZU5hbWUgPSBTYXZEbGcuR2V0UGF0aE5hbWUoKTsNCisJCUJJVE1BUEZJTEVIRUFERVIgYml0bWFwRmlsZUhlYWRlcjsNCisJCUJJVE1BUElORk9IRUFERVIgYml0bWFwSW5mb0hlYWRlcjsNCisJCUJJVE1BUCBzdHJCaXRtYXA7DQorCQlpbnQgd0JpdENvdW50ID0gMzI7DQorCQl3aW5ibXAuR2V0Qml0bWFwKCZzdHJCaXRtYXApOw0KKwkJRFdPUkQgZHdCbUJpdHNTaXplID0gKChzdHJCaXRtYXAuYm1XaWR0aCAqIHdCaXRDb3VudCszMSkvMzIpICogNCAqIHN0ckJpdG1hcC5ibUhlaWdodDsNCisJCQ0KKwkJYml0bWFwRmlsZUhlYWRlci5iZlR5cGUgPSAweDRENDI7DQorCQliaXRtYXBGaWxlSGVhZGVyLmJmU2l6ZSA9IHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIGR3Qm1CaXRzU2l6ZTsNCisJCWJpdG1hcEZpbGVIZWFkZXIuYmZSZXNlcnZlZDEgPSBiaXRtYXBGaWxlSGVhZGVyLmJmUmVzZXJ2ZWQyID0gMDsNCisJCWJpdG1hcEZpbGVIZWFkZXIuYmZPZmZCaXRzID0gc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOw0KKwkJDQorCQliaXRtYXBJbmZvSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsNCisJCWJpdG1hcEluZm9IZWFkZXIuYmlXaWR0aCA9IHN0ckJpdG1hcC5ibVdpZHRoOw0KKwkJYml0bWFwSW5mb0hlYWRlci5iaUhlaWdodCA9IHN0ckJpdG1hcC5ibUhlaWdodDsNCisJCWJpdG1hcEluZm9IZWFkZXIuYmlQbGFuZXMgPSAxOw0KKwkJYml0bWFwSW5mb0hlYWRlci5iaUJpdENvdW50ID0gd0JpdENvdW50Ow0KKwkJYml0bWFwSW5mb0hlYWRlci5iaUNsckltcG9ydGFudCA9IEJJX1JHQjsNCisJCWJpdG1hcEluZm9IZWFkZXIuYmlTaXplSW1hZ2UgPSAwOyAvL3N0ckJpdG1hcC5ibVdpZHRoICogc3RyQml0bWFwLmJtSGVpZ2h0Ow0KKwkJYml0bWFwSW5mb0hlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOw0KKwkJYml0bWFwSW5mb0hlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOw0KKwkJYml0bWFwSW5mb0hlYWRlci5iaUNsclVzZWQgPSAwOw0KKwkJYml0bWFwSW5mb0hlYWRlci5iaUNvbXByZXNzaW9uID0gMDsNCisJCQ0KKwkJY2hhciogY29udGV4dCA9IG5ldyBjaGFyW2R3Qm1CaXRzU2l6ZV07DQorCQlDV2luZG93REMgZGMoTlVMTCk7DQorCQlHZXRESUJpdHMoZGMuR2V0U2FmZUhkYygpLCAoSEJJVE1BUCl3aW5ibXAubV9oT2JqZWN0LCAwLCBiaXRtYXBJbmZvSGVhZGVyLmJpSGVpZ2h0LCAoTFBWT0lEKWNvbnRleHQsKEJJVE1BUElORk8qKSZiaXRtYXBJbmZvSGVhZGVyLCBESUJfUkdCX0NPTE9SUyk7DQorCQkNCisJCUNGaWxlIGZpbGU7DQorCQlmaWxlLk9wZW4oc3RyRmlsZU5hbWUsIENGaWxlOjptb2RlQ3JlYXRlfENGaWxlOjptb2RlV3JpdGUpOw0KKwkJZmlsZS5Xcml0ZSgmYml0bWFwRmlsZUhlYWRlciwgc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpKTsNCisJCWZpbGUuV3JpdGUoJmJpdG1hcEluZm9IZWFkZXIsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7DQorCQlmaWxlLldyaXRlKGNvbnRleHQsIGR3Qm1CaXRzU2l6ZSk7DQorCQkNCisJCWZpbGUuQ2xvc2UoKTsNCisJCWRlbGV0ZSBjb250ZXh0Ow0KKwl9DQorfQ0KKw0KK3ZvaWQgQ0V4cG9ydFBhZ2U6Ok9uUGFpbnQoKSANCit7DQorCUNQYWludERDIGRjKHRoaXMpOyAvLyBkZXZpY2UgY29udGV4dCBmb3IgcGFpbnRpbmcNCisJDQorCS8vIFRPRE86IEFkZCB5b3VyIG1lc3NhZ2UgaGFuZGxlciBjb2RlIGhlcmUNCisJaWYobV9iaXRtYXApDQorCXsNCisJCS8vCUNEQyogcERjPUdldERDKCk7DQorCQlpbnQgYnVmc2l6ZT1GUERGQml0bWFwX0dldFN0cmlkZShtX2JpdG1hcCkqbV9uSGVpZ2h0Ow0KKwkJdm9pZCogYm1wYnVmPUZQREZCaXRtYXBfR2V0QnVmZmVyKG1fYml0bWFwKTsNCisJCUNEQyBNZW1EQzsNCisJCUNEQyAgICpwRGMgICA9ICAgR2V0RGxnSXRlbShJRENfU1RBVElDX0JJVE1BUCktPkdldERDKCk7ICAgICAvL0lEOiAgIHBpY3R1cmUgDQorCQlDUmVjdCAgIHJlY3Q7DQorCQkoKENXbmQgKilHZXREbGdJdGVtKElEQ19TVEFUSUNfQklUTUFQKSktPkdldFdpbmRvd1JlY3QocmVjdCk7DQorCQkNCisJCU1lbURDLkNyZWF0ZUNvbXBhdGlibGVEQyhwRGMpOw0KKwkJaWYoKEhCSVRNQVApd2luYm1wICE9IE5VTEwpDQorCQkJd2luYm1wLkRlbGV0ZU9iamVjdCgpOw0KKwkJaWYoSEJJVE1BUCh3aW5ibXApID09IE5VTEwpDQorCQl7DQorCQkJd2luYm1wLkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAocERjLG1fbldpZHRoLG1fbkhlaWdodCk7DQorCQkJd2luYm1wLlNldEJpdG1hcEJpdHMoYnVmc2l6ZSxibXBidWYpOw0KKwkJfQ0KKw0KKwkJTWVtREMuU2VsZWN0T2JqZWN0KCZ3aW5ibXApOyANCisJCQ0KKwkJcERjLT5CaXRCbHQoMCAsIDAgLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksICZNZW1EQywwLDAsU1JDQ09QWSk7DQorCQkvL3BEYy0+U3RyZXRjaEJsdCgwLDAscmVjdC5yaWdodC1yZWN0LmxlZnQscmVjdC5ib3R0b20tcmVjdC50b3AsJk1lbURDLDAsMCxtX25XaWR0aCxtX25IZWlnaHQsU1JDQ09QWSk7ICAgDQorCQlNZW1EQy5EZWxldGVEQygpOyAgICAgDQorCX0NCisJLy8gRG8gbm90IGNhbGwgQ0RpYWxvZzo6T25QYWludCgpIGZvciBwYWludGluZyBtZXNzYWdlcw0KK30NCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvRXhwb3J0UGFnZS5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0V4cG9ydFBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQyOTkxCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0V4cG9ydFBhZ2UuaApAQCAtMCwwICsxLDU5IEBACisjaWYgIWRlZmluZWQoQUZYX0VYUE9SVFBBR0VfSF9fRDlCMDY1NDdfOTZDQV80NzQ5Xzg4Q0JfMjUwNkQ4QUY2MUQ2X19JTkNMVURFRF8pDQorI2RlZmluZSBBRlhfRVhQT1JUUEFHRV9IX19EOUIwNjU0N185NkNBXzQ3NDlfODhDQl8yNTA2RDhBRjYxRDZfX0lOQ0xVREVEXw0KKw0KKyNpZiBfTVNDX1ZFUiA+IDEwMDANCisjcHJhZ21hIG9uY2UNCisjZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwDQorLy8gRXhwb3J0UGFnZS5oIDogaGVhZGVyIGZpbGUNCisvLw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0V4cG9ydFBhZ2UgZGlhbG9nDQorY2xhc3MgQ1JlYWRlclZDVmlldzsNCisNCitjbGFzcyBDRXhwb3J0UGFnZSA6IHB1YmxpYyBDRGlhbG9nDQorew0KKy8vIENvbnN0cnVjdGlvbg0KK3B1YmxpYzoNCisJQ0JpdG1hcCB3aW5ibXA7DQorCUZQREZfQklUTUFQIG1fYml0bWFwOw0KKwlGUERGX1BBR0UgbV9wYWdlOw0KKwlDUmVhZGVyVkNWaWV3ICptX3BWaWV3Ow0KKwl2b2lkIFNldERsZ0luZm8oKTsNCisJdm9pZCBJbml0RGlhbG9nSW5mbyhDUmVhZGVyVkNWaWV3ICpwVmlldyk7DQorCUNFeHBvcnRQYWdlKENXbmQqIHBQYXJlbnQgPSBOVUxMKTsgICAvLyBzdGFuZGFyZCBjb25zdHJ1Y3Rvcg0KKw0KKy8vIERpYWxvZyBEYXRhDQorCS8ve3tBRlhfREFUQShDRXhwb3J0UGFnZSkNCisJZW51bSB7IElERCA9IElERF9FWFBPUlRfUEFHRSB9Ow0KKwlpbnQJCW1fbkhlaWdodDsNCisJaW50CQltX25QYWdlSGVpZ2h0Ow0KKwlpbnQJCW1fblJvdGF0ZTsNCisJaW50CQltX25XaWR0aDsNCisJaW50CQltX25QYWdlV2lkdGg7DQorCS8vfX1BRlhfREFUQQ0KKw0KKw0KKy8vIE92ZXJyaWRlcw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENFeHBvcnRQYWdlKQ0KKwlwcm90ZWN0ZWQ6DQorCXZpcnR1YWwgdm9pZCBEb0RhdGFFeGNoYW5nZShDRGF0YUV4Y2hhbmdlKiBwRFgpOyAgICAvLyBERFgvRERWIHN1cHBvcnQNCisJLy99fUFGWF9WSVJUVUFMDQorDQorLy8gSW1wbGVtZW50YXRpb24NCitwcm90ZWN0ZWQ6DQorDQorCS8vIEdlbmVyYXRlZCBtZXNzYWdlIG1hcCBmdW5jdGlvbnMNCisJLy97e0FGWF9NU0coQ0V4cG9ydFBhZ2UpDQorCWFmeF9tc2cgdm9pZCBPblJhbmRlclBhZ2UoKTsNCisJYWZ4X21zZyB2b2lkIE9uU2F2ZSgpOw0KKwlhZnhfbXNnIHZvaWQgT25QYWludCgpOw0KKwkvL319QUZYX01TRw0KKwlERUNMQVJFX01FU1NBR0VfTUFQKCkNCit9Ow0KKw0KKy8ve3tBRlhfSU5TRVJUX0xPQ0FUSU9OfX0NCisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB3aWxsIGluc2VydCBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZXZpb3VzIGxpbmUuDQorDQorI2VuZGlmIC8vICFkZWZpbmVkKEFGWF9FWFBPUlRQQUdFX0hfX0Q5QjA2NTQ3Xzk2Q0FfNDc0OV84OENCXzI1MDZEOEFGNjFENl9fSU5DTFVERURfKQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9GWF9TcGxpdHRlclduZC5jcHAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvRlhfU3BsaXR0ZXJXbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjRiYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvRlhfU3BsaXR0ZXJXbmQuY3BwCkBAIC0wLDAgKzEsMzczIEBACisvLyBGWF9TcGxpdHRlclduZC5jcHA6IGltcGxlbWVudGF0aW9uIG9mIHRoZSBDRlhfU3BsaXR0ZXJXbmQgY2xhc3MuDQorLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKy8vI2luY2x1ZGUgInRlc3RzdGF0dXNiYXIuaCINCisjaW5jbHVkZSAiRlhfU3BsaXR0ZXJXbmQuaCINCisNCisjaW5jbHVkZSA8YWZ4cHJpdi5oPg0KKw0KKyNpZmRlZiBfREVCVUcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW109X19GSUxFX187DQorI2RlZmluZSBuZXcgREVCVUdfTkVXDQorI2VuZGlmDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENvbnN0cnVjdGlvbi9EZXN0cnVjdGlvbg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitDRlhfU3BsaXR0ZXJXbmQ6OkNGWF9TcGxpdHRlclduZCgpDQorew0KKwltX2N4U3BsaXR0ZXIJPSBtX2N5U3BsaXR0ZXIgPSA0ICsgMSArIDE7DQorCW1fY3hCb3JkZXJTaGFyZSA9IG1fY3lCb3JkZXJTaGFyZSA9IDA7DQorCW1fY3hTcGxpdHRlckdhcCA9IG1fY3lTcGxpdHRlckdhcCA9IDQgKyAxICsgMTsNCisJbV9jeEJvcmRlcgkJPSBtX2N5Qm9yZGVyID0gMTsNCisJbV9uSGlkZWRDb2wJCT0gLTE7DQorCW1fYkJhckxvY2tlZAk9IEZBTFNFOw0KK30NCisNCitDRlhfU3BsaXR0ZXJXbmQ6On5DRlhfU3BsaXR0ZXJXbmQoKQ0KK3sNCisNCit9DQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ0ZYX1NwbGl0dGVyV25kLCBDU3BsaXR0ZXJXbmQpDQorCS8ve3tBRlhfTVNHX01BUChDRlhfU3BsaXR0ZXJXbmQpDQorCU9OX1dNX0xCVVRUT05ET1dOKCkNCisJT05fV01fTU9VU0VNT1ZFKCkNCisJLy99fUFGWF9NU0dfTUFQDQorRU5EX01FU1NBR0VfTUFQKCkNCisNCit2b2lkIENGWF9TcGxpdHRlclduZDo6T25EcmF3U3BsaXR0ZXIoQ0RDICpwREMsRVNwbGl0VHlwZSBuVHlwZSxjb25zdCBDUmVjdCAmcmVjdEFyZykNCit7DQorCWlmKChuVHlwZSAhPSBzcGxpdEJvcmRlcikgfHwgKHBEQyA9PSBOVUxMKSkNCisJew0KKwkJQ1NwbGl0dGVyV25kOjpPbkRyYXdTcGxpdHRlcihwREMsIG5UeXBlLCByZWN0QXJnKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwlwREMtPkRyYXczZFJlY3QocmVjdEFyZywgR2V0U3lzQ29sb3IoQ09MT1JfQlROU0hBRE9XKSwgR2V0U3lzQ29sb3IoQ09MT1JfQlROSElHSExJR0hUKSk7DQorfQ0KK3ZvaWQgQ0ZYX1NwbGl0dGVyV25kOjpSZWNhbGNMYXlvdXQoKQ0KK3sNCisJQVNTRVJUX1ZBTElEKHRoaXMpOw0KKwlBU1NFUlQobV9uUm93cyA+IDAgJiYgbV9uQ29scyA+IDApOyAvLyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBhbmUNCisNCisJQ1JlY3QgcmVjdENsaWVudDsNCisJR2V0Q2xpZW50UmVjdChyZWN0Q2xpZW50KTsNCisJcmVjdENsaWVudC5JbmZsYXRlUmVjdCgtbV9jeEJvcmRlciwgLW1fY3lCb3JkZXIpOw0KKw0KKwlDUmVjdCByZWN0SW5zaWRlOw0KKwlHZXRJbnNpZGVSZWN0KHJlY3RJbnNpZGUpOw0KKw0KKwkvLyBsYXlvdXQgY29sdW1ucyAocmVzdHJpY3QgdG8gcG9zc2libGUgc2l6ZXMpDQorCUxheW91dFJvd0NvbChtX3BDb2xJbmZvLCBtX25Db2xzLCByZWN0SW5zaWRlLldpZHRoKCksIG1fY3hTcGxpdHRlckdhcCk7DQorCUxheW91dFJvd0NvbChtX3BSb3dJbmZvLCBtX25Sb3dzLCByZWN0SW5zaWRlLkhlaWdodCgpLCBtX2N5U3BsaXR0ZXJHYXApOw0KKw0KKwkvLyBhZGp1c3QgdGhlIHBhbmVzIChhbmQgb3B0aW9uYWxseSBzY3JvbGwgYmFycykNCisNCisJLy8gZ2l2ZSB0aGUgaGludCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIEhXTkRzDQorCUFGWF9TSVpFUEFSRU5UUEFSQU1TIGxheW91dDsNCisJbGF5b3V0LmhEV1AgPSA6OkJlZ2luRGVmZXJXaW5kb3dQb3MoKG1fbkNvbHMgKyAxKSAqIChtX25Sb3dzICsgMSkgKyAxKTsNCisNCisJLy8gc2l6ZSBvZiBzY3JvbGxiYXJzDQorCWludCBjeCA9IHJlY3RDbGllbnQucmlnaHQgLSByZWN0SW5zaWRlLnJpZ2h0Ow0KKwlpbnQgY3kgPSByZWN0Q2xpZW50LmJvdHRvbSAtIHJlY3RJbnNpZGUuYm90dG9tOw0KKw0KKwkvLyByZXBvc2l0aW9uIHNpemUgYm94DQorCWlmIChtX2JIYXNIU2Nyb2xsICYmIG1fYkhhc1ZTY3JvbGwpDQorCXsNCisJCUNXbmQqIHBTY3JvbGxCYXIgPSBHZXREbGdJdGVtKEFGWF9JRFdfU0laRV9CT1gpOw0KKwkJQVNTRVJUKHBTY3JvbGxCYXIgIT0gTlVMTCk7DQorDQorCQkvLyBmaXggc3R5bGUgaWYgbmVjZXNzYXJ5DQorCQlCT09MIGJTaXppbmdQYXJlbnQgPSAoR2V0U2l6aW5nUGFyZW50KCkgIT0gTlVMTCk7DQorCQkvLyBtb2RpZnlTdHlsZSByZXR1cm5zIFRSVUUgaWYgc3R5bGUgY2hhbmdlcw0KKwkJaWYgKHBTY3JvbGxCYXItPk1vZGlmeVN0eWxlKFNCU19TSVpFR1JJUHxTQlNfU0laRUJPWCwNCisJCQkJYlNpemluZ1BhcmVudCA/IFNCU19TSVpFR1JJUCA6IFNCU19TSVpFQk9YKSkNCisJCQlwU2Nyb2xsQmFyLT5JbnZhbGlkYXRlKCk7DQorCQlwU2Nyb2xsQmFyLT5FbmFibGVXaW5kb3coYlNpemluZ1BhcmVudCk7DQorDQorCQkvLyByZXBvc2l0aW9uIHRoZSBzaXplIGJveA0KKwkJRGVmZXJDbGllbnRQb3MoJmxheW91dCwgcFNjcm9sbEJhciwNCisJCQlyZWN0SW5zaWRlLnJpZ2h0LA0KKwkJCXJlY3RJbnNpZGUuYm90dG9tLCBjeCwgY3ksIFRSVUUpOw0KKwl9DQorDQorCS8vIHJlcG9zaXRpb24gc2Nyb2xsIGJhcnMNCisJaWYgKG1fYkhhc0hTY3JvbGwpDQorCXsNCisJCWludCBjeFNwbGl0dGVyQm94ID0gbV9jeFNwbGl0dGVyOy8vIHNwbGl0IGJveCBiaWdnZXINCisJCWludCB4ID0gcmVjdENsaWVudC5sZWZ0Ow0KKwkJaW50IHkgPSByZWN0SW5zaWRlLmJvdHRvbTsNCisJCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fbkNvbHM7IGNvbCsrKQ0KKwkJew0KKwkJCUNXbmQqIHBTY3JvbGxCYXIgPSBHZXREbGdJdGVtKEFGWF9JRFdfSFNDUk9MTF9GSVJTVCArIGNvbCk7DQorCQkJQVNTRVJUKHBTY3JvbGxCYXIgIT0gTlVMTCk7DQorCQkJaW50IGN4ID0gbV9wQ29sSW5mb1tjb2xdLm5DdXJTaXplOw0KKwkJCWlmIChjb2wgPT0gMCAmJiBtX25Db2xzIDwgbV9uTWF4Q29scykNCisJCQkJeCArPSBjeFNwbGl0dGVyQm94LCBjeCAtPSBjeFNwbGl0dGVyQm94Ow0KKwkJCURlZmVyQ2xpZW50UG9zKCZsYXlvdXQsIHBTY3JvbGxCYXIsIHgsIHksIGN4LCBjeSwgVFJVRSk7DQorCQkJeCArPSBjeCArIG1fY3hTcGxpdHRlckdhcDsNCisJCX0NCisJfQ0KKw0KKwlpZiAobV9iSGFzVlNjcm9sbCkNCisJew0KKwkJaW50IGN5U3BsaXR0ZXJCb3ggPSBtX2N5U3BsaXR0ZXI7Ly8gc3BsaXQgYm94IGJpZ2dlcg0KKwkJaW50IHggPSByZWN0SW5zaWRlLnJpZ2h0Ow0KKwkJaW50IHkgPSByZWN0Q2xpZW50LnRvcDsNCisJCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fblJvd3M7IHJvdysrKQ0KKwkJew0KKwkJCUNXbmQqIHBTY3JvbGxCYXIgPSBHZXREbGdJdGVtKEFGWF9JRFdfVlNDUk9MTF9GSVJTVCArIHJvdyk7DQorCQkJQVNTRVJUKHBTY3JvbGxCYXIgIT0gTlVMTCk7DQorCQkJaW50IGN5ID0gbV9wUm93SW5mb1tyb3ddLm5DdXJTaXplOw0KKwkJCWlmIChyb3cgPT0gMCAmJiBtX25Sb3dzIDwgbV9uTWF4Um93cykNCisJCQkJeSArPSBjeVNwbGl0dGVyQm94LCBjeSAtPSBjeVNwbGl0dGVyQm94Ow0KKwkJCURlZmVyQ2xpZW50UG9zKCZsYXlvdXQsIHBTY3JvbGxCYXIsIHgsIHksIGN4LCBjeSwgVFJVRSk7DQorCQkJeSArPSBjeSArIG1fY3lTcGxpdHRlckdhcDsNCisJCX0NCisJfQ0KKw0KKwkvL0JMT0NLOiBSZXBvc2l0aW9uIGFsbCB0aGUgcGFuZXMNCisJew0KKwkJaW50IHggPSByZWN0Q2xpZW50LmxlZnQ7DQorCQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX25Db2xzOyBjb2wrKykNCisJCXsNCisJCQlpbnQgY3ggPSBtX3BDb2xJbmZvW2NvbF0ubkN1clNpemU7DQorCQkJaW50IHkgPSByZWN0Q2xpZW50LnRvcDsNCisJCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX25Sb3dzOyByb3crKykNCisJCQl7DQorCQkJCWludCBjeSA9IG1fcFJvd0luZm9bcm93XS5uQ3VyU2l6ZTsNCisJCQkJQ1duZCogcFduZCA9IEdldFBhbmUocm93LCBjb2wpOw0KKwkJCQlEZWZlckNsaWVudFBvcygmbGF5b3V0LCBwV25kLCB4LCB5LCBjeCwgY3ksIEZBTFNFKTsNCisJCQkJeSArPSBjeSArIG1fY3lTcGxpdHRlckdhcDsNCisJCQl9DQorCQkJeCArPSBjeCArIG1fY3hTcGxpdHRlckdhcDsNCisJCX0NCisJfQ0KKw0KKwkvLyBtb3ZlIGFuZCByZXNpemUgYWxsIHRoZSB3aW5kb3dzIGF0IG9uY2UhDQorCWlmIChsYXlvdXQuaERXUCA9PSBOVUxMIHx8ICE6OkVuZERlZmVyV2luZG93UG9zKGxheW91dC5oRFdQKSkNCisJCVRSQUNFMCgiV2FybmluZzogRGVmZXJXaW5kb3dQb3MgZmFpbGVkIC0gbG93IHN5c3RlbSByZXNvdXJjZXMuXG4iKTsNCisNCisJLy8gaW52YWxpZGF0ZSBhbGwgdGhlIHNwbGl0dGVyIGJhcnMgKHdpdGggTlVMTCBwREMpDQorCURyYXdBbGxTcGxpdEJhcnMoTlVMTCwgcmVjdEluc2lkZS5yaWdodCwgcmVjdEluc2lkZS5ib3R0b20pOw0KK30NCisNCit2b2lkIENGWF9TcGxpdHRlclduZDo6RGVmZXJDbGllbnRQb3MoQUZYX1NJWkVQQVJFTlRQQVJBTVMgKmxwTGF5b3V0LENXbmQgKnBXbmQsaW50IHgsaW50IHksaW50IGN4LGludCBjeSxCT09MIGJTY3JvbGxCYXIpDQorew0KKwlBU1NFUlQocFduZCAhPSBOVUxMKTsNCisJQVNTRVJUKHBXbmQtPm1faFduZCAhPSBOVUxMKTsNCisNCisJaWYgKGJTY3JvbGxCYXIpDQorCXsNCisJCS8vIGlmIHRoZXJlIGlzIGVub3VnaCByb29tLCBkcmF3IHNjcm9sbCBiYXIgd2l0aG91dCBib3JkZXINCisJCS8vIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSwgc2V0IHRoZSBXU19CT1JERVIgYml0IHNvIHRoYXQNCisJCS8vICAgd2Ugd2lsbCBhdCBsZWFzdCBnZXQgYSBwcm9wZXIgYm9yZGVyIGRyYXduDQorCQlCT09MIGJOZWVkQm9yZGVyID0gKGN4IDw9IDEgfHwgY3kgPD0gMSk7DQorCQlwV25kLT5Nb2RpZnlTdHlsZShiTmVlZEJvcmRlciA/IDAgOiAxLCBiTmVlZEJvcmRlciA/IDEgOiAwKTsNCisJfQ0KKwlDUmVjdCByZWN0KHgsIHksIHgrY3gsIHkrY3kpOw0KKw0KKwkvLyBhZGp1c3QgZm9yIDNkIGJvcmRlciAoc3BsaXR0ZXIgd2luZG93cyBoYXZlIGltcGxpZWQgYm9yZGVyKQ0KKwlpZiAoKHBXbmQtPkdldEV4U3R5bGUoKSAmIFdTX0VYX0NMSUVOVEVER0UpIHx8IHBXbmQtPklzS2luZE9mKFJVTlRJTUVfQ0xBU1MoQ1NwbGl0dGVyV25kKSkpDQorCXsNCisJCXJlY3QuSW5mbGF0ZVJlY3QoMSwgMSk7IC8vIGZvciBwcm9wZXIgZHJhdyBDRmxhdFNwbGl0dGVyV25kIGluIHZpZXcNCisvLwkJcmVjdC5JbmZsYXRlUmVjdChhZnhEYXRhLmN4Qm9yZGVyMiwgYWZ4RGF0YS5jeUJvcmRlcjIpOw0KKwl9DQorDQorCS8vIGZpcnN0IGNoZWNrIGlmIHRoZSBuZXcgcmVjdGFuZ2xlIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50DQorCUNSZWN0IHJlY3RPbGQ7DQorCXBXbmQtPkdldFdpbmRvd1JlY3QocmVjdE9sZCk7DQorCXBXbmQtPkdldFBhcmVudCgpLT5TY3JlZW5Ub0NsaWVudCgmcmVjdE9sZCk7DQorCWlmIChyZWN0ICE9IHJlY3RPbGQpDQorCQlBZnhSZXBvc2l0aW9uV2luZG93KGxwTGF5b3V0LCBwV25kLT5tX2hXbmQsIHJlY3QpOw0KK30NCisNCit2b2lkIENGWF9TcGxpdHRlclduZDo6TGF5b3V0Um93Q29sKENTcGxpdHRlclduZDo6Q1Jvd0NvbEluZm8gKnBJbmZvQXJyYXksaW50IG5NYXgsaW50IG5TaXplLGludCBuU2l6ZVNwbGl0dGVyKQ0KK3sNCisJQVNTRVJUKHBJbmZvQXJyYXkgIT0gTlVMTCk7DQorCUFTU0VSVChuTWF4ID4gMCk7DQorCUFTU0VSVChuU2l6ZVNwbGl0dGVyID4gMCk7DQorDQorCUNTcGxpdHRlclduZDo6Q1Jvd0NvbEluZm8qIHBJbmZvOw0KKwlpbnQgaTsNCisNCisJaWYgKG5TaXplIDwgMCkNCisJCW5TaXplID0gMDsgIC8vIGlmIHJlYWxseSB0b28gc21hbGwsIGxheW91dCBhcyB6ZXJvIHNpemUNCisNCisJLy8gc3RhcnQgd2l0aCBpZGVhbCBzaXplcw0KKwlmb3IgKGkgPSAwLCBwSW5mbyA9IHBJbmZvQXJyYXk7IGkgPCBuTWF4LTE7IGkrKywgcEluZm8rKykNCisJew0KKwkJaWYgKHBJbmZvLT5uSWRlYWxTaXplIDwgcEluZm8tPm5NaW5TaXplKQ0KKwkJCXBJbmZvLT5uSWRlYWxTaXplID0gMDsgICAgICAvLyB0b28gc21hbGwgdG8gc2VlDQorCQlwSW5mby0+bkN1clNpemUgPSBwSW5mby0+bklkZWFsU2l6ZTsNCisJfQ0KKwlwSW5mby0+bkN1clNpemUgPSBJTlRfTUFYOyAgLy8gbGFzdCByb3cvY29sdW1uIHRha2VzIHRoZSByZXN0DQorDQorCWZvciAoaSA9IDAsIHBJbmZvID0gcEluZm9BcnJheTsgaSA8IG5NYXg7IGkrKywgcEluZm8rKykNCisJew0KKwkJQVNTRVJUKG5TaXplID49IDApOw0KKwkJaWYgKG5TaXplID09IDApDQorCQl7DQorCQkJLy8gbm8gbW9yZSByb29tIChzZXQgcGFuZSB0byBiZSBpbnZpc2libGUpDQorCQkJcEluZm8tPm5DdXJTaXplID0gMDsNCisJCQljb250aW51ZTsgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgc3BsaXR0ZXJzDQorCQl9DQorCQllbHNlIGlmIChuU2l6ZSA8IHBJbmZvLT5uTWluU2l6ZSAmJiBpICE9IDApDQorCQl7DQorCQkJLy8gYWRkaXRpb25hbCBwYW5lcyBiZWxvdyB0aGUgcmVjb21tZW5kZWQgbWluaW11bSBzaXplDQorCQkJLy8gICBhcmVuJ3Qgc2hvd24gYW5kIHRoZSBzaXplIGdvZXMgdG8gdGhlIHByZXZpb3VzIHBhbmUNCisJCQlwSW5mby0+bkN1clNpemUgPSAwOw0KKw0KKwkJCS8vIHByZXZpb3VzIHBhbmUgYWxyZWFkeSBoYXMgcm9vbSBmb3Igc3BsaXR0ZXIgKyBib3JkZXINCisJCQkvLyAgIGFkZCByZW1haW5pbmcgc2l6ZSBhbmQgcmVtb3ZlIHRoZSBleHRyYSBib3JkZXINCisJCQkocEluZm8tMSktPm5DdXJTaXplICs9IG5TaXplICsgMjsNCisJCQluU2l6ZSA9IDA7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJLy8gb3RoZXJ3aXNlIHdlIGNhbiBhZGQgdGhlIHNlY29uZCBwYW5lDQorCQkJQVNTRVJUKG5TaXplID4gMCk7DQorCQkJaWYgKHBJbmZvLT5uQ3VyU2l6ZSA9PSAwKQ0KKwkJCXsNCisJCQkJLy8gdG9vIHNtYWxsIHRvIHNlZQ0KKwkJCQlpZiAoaSAhPSAwKQ0KKwkJCQkJcEluZm8tPm5DdXJTaXplID0gMDsNCisJCQl9DQorCQkJZWxzZSBpZiAoblNpemUgPCBwSW5mby0+bkN1clNpemUpDQorCQkJew0KKwkJCQkvLyB0aGlzIHJvdy9jb2wgd29uJ3QgZml0IGNvbXBsZXRlbHkgLSBtYWtlIGFzIHNtYWxsIGFzIHBvc3NpYmxlDQorCQkJCXBJbmZvLT5uQ3VyU2l6ZSA9IG5TaXplOw0KKwkJCQluU2l6ZSA9IDA7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCS8vIGNhbiBmaXQgZXZlcnl0aGluZw0KKwkJCQluU2l6ZSAtPSBwSW5mby0+bkN1clNpemU7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLy8gc2VlIGlmIHdlIHNob3VsZCBhZGQgYSBzcGxpdHRlcg0KKwkJQVNTRVJUKG5TaXplID49IDApOw0KKwkJaWYgKGkgIT0gbk1heCAtIDEpDQorCQl7DQorCQkJLy8gc2hvdWxkIGhhdmUgYSBzcGxpdHRlcg0KKwkJCWlmIChuU2l6ZSA+IG5TaXplU3BsaXR0ZXIpDQorCQkJew0KKwkJCQluU2l6ZSAtPSBuU2l6ZVNwbGl0dGVyOyAvLyBsZWF2ZSByb29tIGZvciBzcGxpdHRlciArIGJvcmRlcg0KKwkJCQlBU1NFUlQoblNpemUgPiAwKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJLy8gbm90IGVub3VnaCByb29tIC0gYWRkIGxlZnQgb3ZlciBsZXNzIHNwbGl0dGVyIHNpemUNCisJCQkJcEluZm8tPm5DdXJTaXplICs9IG5TaXplOw0KKwkJCQlpZiAocEluZm8tPm5DdXJTaXplID4gKG5TaXplU3BsaXR0ZXIgLSAyKSkNCisJCQkJCXBJbmZvLT5uQ3VyU2l6ZSAtPSAoblNpemVTcGxpdHRlciAtIDIpOw0KKwkJCQluU2l6ZSA9IDA7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCUFTU0VSVChuU2l6ZSA9PSAwKTsgLy8gYWxsIHNwYWNlIHNob3VsZCBiZSBhbGxvY2F0ZWQNCit9DQorDQordm9pZCBDRlhfU3BsaXR0ZXJXbmQ6OkhpZGVDb2x1bW4oaW50IG5Db2wpDQorew0KKwlpZiAoIG1fbkhpZGVkQ29sICE9IC0xICkNCisJCXJldHVybjsNCisNCisJQVNTRVJUX1ZBTElEKHRoaXMpOw0KKwlBU1NFUlQobV9uQ29scyA+IDEpOw0KKwlBU1NFUlQobkNvbCA8IG1fbkNvbHMpOw0KKwlBU1NFUlQobV9uSGlkZWRDb2wgPT0gLTEpOw0KKwltX25IaWRlZENvbCA9IG5Db2w7DQorCQ0KKyAgICAvLyBpZiB0aGUgY29sdW1uIGhhcyBhbiBhY3RpdmUgd2luZG93IC0tIGNoYW5nZSBpdA0KKwlpbnQgcm93QWN0aXZlLCBjb2xBY3RpdmU7DQorCWlmIChHZXRBY3RpdmVQYW5lKCZyb3dBY3RpdmUsICZjb2xBY3RpdmUpICE9IE5VTEwgJiYNCisJCWNvbEFjdGl2ZSA9PSBuQ29sKQ0KKwl7DQorCQlpZiAoKytjb2xBY3RpdmUgPj0gbV9uQ29scykNCisJCQljb2xBY3RpdmUgPSAwOw0KKwkJU2V0QWN0aXZlUGFuZShyb3dBY3RpdmUsIGNvbEFjdGl2ZSk7DQorCX0NCisJDQorICAgIC8vIGhpZGUgYWxsIGNvbHVtbiBwYW5lcw0KKwlmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX25Sb3dzOyByb3crKykNCisJew0KKwkJQ1duZCogcFBhbmVIaWRlID0gR2V0UGFuZShyb3csIG5Db2wpOw0KKwkJQVNTRVJUKHBQYW5lSGlkZSAhPSBOVUxMKTsNCisJCXBQYW5lSGlkZS0+U2hvd1dpbmRvdyhTV19ISURFKTsNCisJCXBQYW5lSGlkZS0+U2V0RGxnQ3RybElEKA0KKwkJCUFGWF9JRFdfUEFORV9GSVJTVCArIHJvdyAqIDE2ICsgbV9uQ29scyk7DQorCQkNCisJCWZvciAoaW50IGNvbCA9IG5Db2wgKyAxOyBjb2wgPCBtX25Db2xzOyBjb2wrKykNCisJCXsNCisJCQlDV25kKiBwUGFuZSA9IEdldFBhbmUocm93LCBjb2wpOw0KKwkJCUFTU0VSVChwUGFuZSAhPSBOVUxMKTsNCisJCQlwUGFuZS0+U2V0RGxnQ3RybElEKElkRnJvbVJvd0NvbChyb3csIGNvbCAtIDEpKTsNCisJCX0NCisJfQ0KKwltX25Db2xzLS07DQorCW1fcENvbEluZm9bbV9uQ29sc10ubkN1clNpemUgPSBtX3BDb2xJbmZvW25Db2xdLm5DdXJTaXplOw0KKwlSZWNhbGNMYXlvdXQoKTsNCit9DQorDQordm9pZCBDRlhfU3BsaXR0ZXJXbmQ6OlNob3dDb2x1bW4oKQ0KK3sNCisJaWYgKCBtX25IaWRlZENvbCA9PSAtMSApDQorCQlyZXR1cm47DQorDQorCUFTU0VSVF9WQUxJRCh0aGlzKTsNCisJQVNTRVJUKG1fbkNvbHMgPCBtX25NYXhDb2xzKTsNCisJQVNTRVJUKG1fbkhpZGVkQ29sICE9IC0xKTsNCisJDQorCWludCBjb2xOZXcgPSBtX25IaWRlZENvbDsNCisJbV9uSGlkZWRDb2wgPSAtMTsNCisJaW50IGN4TmV3ID0gbV9wQ29sSW5mb1ttX25Db2xzXS5uQ3VyU2l6ZTsNCisJbV9uQ29scysrOyAgLy8gYWRkIGEgY29sdW1uDQorCUFTU0VSVChtX25Db2xzID09IG1fbk1heENvbHMpOw0KKwkNCisgICAgLy8gZmlsbCB0aGUgaGlkZWQgY29sdW1uDQorCWludCBjb2w7DQorCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fblJvd3M7IHJvdysrKQ0KKwl7DQorCQlDV25kKiBwUGFuZVNob3cgPSBHZXREbGdJdGVtKA0KKwkJCUFGWF9JRFdfUEFORV9GSVJTVCArIHJvdyAqIDE2ICsgbV9uQ29scyk7DQorCQlBU1NFUlQocFBhbmVTaG93ICE9IE5VTEwpOw0KKwkJcFBhbmVTaG93LT5TaG93V2luZG93KFNXX1NIT1dOQSk7DQorCQkNCisJCWZvciAoY29sID0gbV9uQ29scyAtIDI7IGNvbCA+PSBjb2xOZXc7IGNvbC0tKQ0KKwkJew0KKwkJCUNXbmQqIHBQYW5lID0gR2V0UGFuZShyb3csIGNvbCk7DQorCQkJQVNTRVJUKHBQYW5lICE9IE5VTEwpOw0KKwkJCXBQYW5lLT5TZXREbGdDdHJsSUQoSWRGcm9tUm93Q29sKHJvdywgY29sICsgMSkpOw0KKwkJfQ0KKwkJDQorCQlwUGFuZVNob3ctPlNldERsZ0N0cmxJRChJZEZyb21Sb3dDb2wocm93LCBjb2xOZXcpKTsNCisJfQ0KKwkNCisgICAgLy8gbmV3IHBhbmVzIGhhdmUgYmVlbiBjcmVhdGVkIC0tIHJlY2FsY3VsYXRlIGxheW91dA0KKwlmb3IgKGNvbCA9IGNvbE5ldyArIDE7IGNvbCA8IG1fbkNvbHM7IGNvbCsrKQ0KKwkJbV9wQ29sSW5mb1tjb2xdLm5JZGVhbFNpemUgPSBtX3BDb2xJbmZvW2NvbCAtIDFdLm5DdXJTaXplOw0KKwltX3BDb2xJbmZvW2NvbE5ld10ubklkZWFsU2l6ZSA9IGN4TmV3Ow0KKw0KKwlSZWNhbGNMYXlvdXQoKTsNCit9DQorDQordm9pZCBDRlhfU3BsaXR0ZXJXbmQ6Ok9uTEJ1dHRvbkRvd24oVUlOVCBuRmxhZ3MsIENQb2ludCBwb2ludCkgDQorew0KKwlpZiAoIW1fYkJhckxvY2tlZCkNCisJCUNTcGxpdHRlclduZDo6T25MQnV0dG9uRG93bihuRmxhZ3MsIHBvaW50KTsNCit9DQorDQordm9pZCBDRlhfU3BsaXR0ZXJXbmQ6Ok9uTW91c2VNb3ZlKFVJTlQgbkZsYWdzLCBDUG9pbnQgcG9pbnQpIA0KK3sNCisJaWYgKCFtX2JCYXJMb2NrZWQpDQorCQlDU3BsaXR0ZXJXbmQ6Ok9uTW91c2VNb3ZlKG5GbGFncywgcG9pbnQpOw0KKwllbHNlDQorCQlDV25kOjpPbk1vdXNlTW92ZShuRmxhZ3MsIHBvaW50KTsJDQorfQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9GWF9TcGxpdHRlclduZC5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0ZYX1NwbGl0dGVyV25kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4OTNjOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9GWF9TcGxpdHRlclduZC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vIEZYX1NwbGl0dGVyV25kLmg6IGludGVyZmFjZSBmb3IgdGhlIENGWF9TcGxpdHRlclduZCBjbGFzcy4NCisvLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisjaWYgIWRlZmluZWQoQUZYX0ZYX1NQTElUVEVSV05EX0hfXzRCRjQ1Q0Q5XzBDOURfNDIyM185RDBFXzlFQ0ExNDhGNDlGQl9fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX0ZYX1NQTElUVEVSV05EX0hfXzRCRjQ1Q0Q5XzBDOURfNDIyM185RDBFXzlFQ0ExNDhGNDlGQl9fSU5DTFVERURfDQorDQorI2lmIF9NU0NfVkVSID4gMTAwMA0KKyNwcmFnbWEgb25jZQ0KKyNlbmRpZiAvLyBfTVNDX1ZFUiA+IDEwMDANCisNCitjbGFzcyBDRlhfU3BsaXR0ZXJXbmQgOiBwdWJsaWMgQ1NwbGl0dGVyV25kDQorew0KK3B1YmxpYzoNCisJQ0ZYX1NwbGl0dGVyV25kKCk7DQorCXZpcnR1YWwgfkNGWF9TcGxpdHRlclduZCgpOw0KKw0KK3B1YmxpYzoNCisJdmlydHVhbAl2b2lkCU9uRHJhd1NwbGl0dGVyKENEQyAqcERDLEVTcGxpdFR5cGUgblR5cGUsY29uc3QgQ1JlY3QgJnJlY3RBcmcpOw0KKwl2aXJ0dWFsCXZvaWQJUmVjYWxjTGF5b3V0KCk7DQorCXN0YXRpYwl2b2lkCURlZmVyQ2xpZW50UG9zKEFGWF9TSVpFUEFSRU5UUEFSQU1TICpscExheW91dCxDV25kICpwV25kLGludCB4LGludCB5LGludCBjeCxpbnQgY3ksQk9PTCBiU2Nyb2xsQmFyKTsNCisJc3RhdGljCXZvaWQJTGF5b3V0Um93Q29sKENTcGxpdHRlclduZDo6Q1Jvd0NvbEluZm8gKnBJbmZvQXJyYXksaW50IG5NYXgsaW50IG5TaXplLGludCBuU2l6ZVNwbGl0dGVyKTsNCisJdm9pZAkJCUxvY2tCYXIoQk9PTCBiU3RhdGU9VFJVRSl7bV9iQmFyTG9ja2VkPWJTdGF0ZTt9DQorCXZvaWQJCQlIaWRlQ29sdW1uKGludCBuQ29sKTsNCisJdm9pZAkJCVNob3dDb2x1bW4oKTsNCisNCisJLy8gQ2xhc3NXaXphcmQgZ2VuZXJhdGVkIHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGVzDQorCS8ve3tBRlhfVklSVFVBTChDRlhfU3BsaXR0ZXJXbmQpDQorCS8vfX1BRlhfVklSVFVBTA0KKw0KKwkvLyBHZW5lcmF0ZWQgbWVzc2FnZSBtYXAgZnVuY3Rpb25zDQorcHJvdGVjdGVkOg0KKwkvL3t7QUZYX01TRyhDRlhfU3BsaXR0ZXJXbmQpDQorCWFmeF9tc2cgdm9pZCBPbkxCdXR0b25Eb3duKFVJTlQgbkZsYWdzLCBDUG9pbnQgcG9pbnQpOw0KKwlhZnhfbXNnIHZvaWQgT25Nb3VzZU1vdmUoVUlOVCBuRmxhZ3MsIENQb2ludCBwb2ludCk7DQorCS8vfX1BRlhfTVNHDQorCURFQ0xBUkVfTUVTU0FHRV9NQVAoKQ0KK3Byb3RlY3RlZDoNCisJQk9PTAltX2JCYXJMb2NrZWQ7DQorCWludAkJbV9uSGlkZWRDb2w7DQorDQorfTsNCisNCisjZW5kaWYgLy8gIWRlZmluZWQoQUZYX0ZYX1NQTElUVEVSV05EX0hfXzRCRjQ1Q0Q5XzBDOURfNDIyM185RDBFXzlFQ0ExNDhGNDlGQl9fSU5DTFVERURfKQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9GaW5kRGxnLmNwcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9GaW5kRGxnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU0OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0ZpbmREbGcuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8vIEZpbmREbGcuY3BwIDogaW1wbGVtZW50YXRpb24gZmlsZQ0KKy8vDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQy5oIg0KKyNpbmNsdWRlICJGaW5kRGxnLmgiDQorDQorI2luY2x1ZGUgIk1haW5Gcm0uaCINCisjaW5jbHVkZSAiQ2hpbGRGcm0uaCINCisjaW5jbHVkZSAiUmVhZGVyVkNWaWV3LmgiDQorDQorI2lmZGVmIF9ERUJVRw0KKyNkZWZpbmUgbmV3IERFQlVHX05FVw0KKyN1bmRlZiBUSElTX0ZJTEUNCitzdGF0aWMgY2hhciBUSElTX0ZJTEVbXSA9IF9fRklMRV9fOw0KKyNlbmRpZg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0ZpbmREbGcgZGlhbG9nDQorDQorDQorQ0ZpbmREbGc6OkNGaW5kRGxnKENXbmQqIHBQYXJlbnQgLyo9TlVMTCovKQ0KKwk6IENEaWFsb2coQ0ZpbmREbGc6OklERCwgcFBhcmVudCkNCit7DQorCS8ve3tBRlhfREFUQV9JTklUKENGaW5kRGxnKQ0KKwltX2JNYXRjaENhc2UgPSBGQUxTRTsNCisJbV9iV2hvbGVXb3JkID0gRkFMU0U7DQorCW1fc3RyRmluZFdoYXQgPSBfVCgiIik7DQorCW1fbkRpcmVjdGlvbiA9IC0xOw0KKwkvL319QUZYX0RBVEFfSU5JVA0KK30NCisNCisNCit2b2lkIENGaW5kRGxnOjpEb0RhdGFFeGNoYW5nZShDRGF0YUV4Y2hhbmdlKiBwRFgpDQorew0KKwlDRGlhbG9nOjpEb0RhdGFFeGNoYW5nZShwRFgpOw0KKwkvL3t7QUZYX0RBVEFfTUFQKENGaW5kRGxnKQ0KKwlERFhfQ2hlY2socERYLCBJRENfQ0hFQ0tfTUFUQ0hDQVNFLCBtX2JNYXRjaENhc2UpOw0KKwlERFhfQ2hlY2socERYLCBJRENfQ0hFQ0tfTUFUQ0hXSE9MRSwgbV9iV2hvbGVXb3JkKTsNCisJRERYX1RleHQocERYLCBJRENfRURJVDEsIG1fc3RyRmluZFdoYXQpOw0KKwlERFhfUmFkaW8ocERYLCBJRENfUkFESU9fRG93biwgbV9uRGlyZWN0aW9uKTsNCisJLy99fUFGWF9EQVRBX01BUA0KK30NCisNCisNCitCRUdJTl9NRVNTQUdFX01BUChDRmluZERsZywgQ0RpYWxvZykNCisJLy97e0FGWF9NU0dfTUFQKENGaW5kRGxnKQ0KKwkvL319QUZYX01TR19NQVANCitFTkRfTUVTU0FHRV9NQVAoKQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0ZpbmREbGcgbWVzc2FnZSBoYW5kbGVycw0KKw0KK3ZvaWQgQ0ZpbmREbGc6Ok9uT0soKSANCit7DQorCS8vIFRPRE86IEFkZCBleHRyYSB2YWxpZGF0aW9uIGhlcmUNCisJVXBkYXRlRGF0YShUUlVFKTsNCisJbV9wVmlldy0+RmluZFRleHQobV9zdHJGaW5kV2hhdCwgbV9iTWF0Y2hDYXNlLCBtX2JXaG9sZVdvcmQsIG1fbkRpcmVjdGlvbik7DQorCS8vQ0RpYWxvZzo6T25PSygpOw0KK30NCisNCitCT09MIENGaW5kRGxnOjpPbkluaXREaWFsb2coKSANCit7DQorCUNEaWFsb2c6Ok9uSW5pdERpYWxvZygpOw0KKwkNCisJLy8gVE9ETzogQWRkIGV4dHJhIGluaXRpYWxpemF0aW9uIGhlcmUNCisJbV9wVmlldyA9IChDUmVhZGVyVkNWaWV3ICopKCgoQ0NoaWxkRnJhbWUgKikoKENNYWluRnJhbWUgKilBZnhHZXRNYWluV25kKCkpLT5HZXRBY3RpdmVGcmFtZSgpKS0+R2V0QWN0aXZlVmlldygpKTsNCisJQVNTRVJUKG1fcFZpZXcpOw0KKwkoKENCdXR0b24gKilHZXREbGdJdGVtKElEQ19SQURJT19Eb3duKSktPlNldENoZWNrKDEpOw0KKwkoKENCdXR0b24gKilHZXREbGdJdGVtKElEQ19DSEVDS19NQVRDSFdIT0xFKSktPlNldENoZWNrKDEpOw0KKwlyZXR1cm4gVFJVRTsgIC8vIHJldHVybiBUUlVFIHVubGVzcyB5b3Ugc2V0IHRoZSBmb2N1cyB0byBhIGNvbnRyb2wNCisJICAgICAgICAgICAgICAvLyBFWENFUFRJT046IE9DWCBQcm9wZXJ0eSBQYWdlcyBzaG91bGQgcmV0dXJuIEZBTFNFDQorfQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9GaW5kRGxnLmggYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvRmluZERsZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZWY4OGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvRmluZERsZy5oCkBAIC0wLDAgKzEsNTAgQEAKKyNpZiAhZGVmaW5lZChBRlhfRklORERMR19IX18zNTVBRjk2Ql9CNDg3XzQ1MDNfODY1OF83RjM3QjM5N0QzOEFfX0lOQ0xVREVEXykNCisjZGVmaW5lIEFGWF9GSU5ERExHX0hfXzM1NUFGOTZCX0I0ODdfNDUwM184NjU4XzdGMzdCMzk3RDM4QV9fSU5DTFVERURfDQorDQorI2lmIF9NU0NfVkVSID4gMTAwMA0KKyNwcmFnbWEgb25jZQ0KKyNlbmRpZiAvLyBfTVNDX1ZFUiA+IDEwMDANCisvLyBGaW5kRGxnLmggOiBoZWFkZXIgZmlsZQ0KKy8vDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDRmluZERsZyBkaWFsb2cNCitjbGFzcyBDUmVhZGVyVkNWaWV3Ow0KK2NsYXNzIENGaW5kRGxnIDogcHVibGljIENEaWFsb2cNCit7DQorLy8gQ29uc3RydWN0aW9uDQorcHVibGljOg0KKwlDRmluZERsZyhDV25kKiBwUGFyZW50ID0gTlVMTCk7ICAgLy8gc3RhbmRhcmQgY29uc3RydWN0b3INCisNCisvLyBEaWFsb2cgRGF0YQ0KKwkvL3t7QUZYX0RBVEEoQ0ZpbmREbGcpDQorCWVudW0geyBJREQgPSBJRERfRExHX0ZJTkQgfTsNCisJQk9PTAltX2JNYXRjaENhc2U7DQorCUJPT0wJbV9iV2hvbGVXb3JkOw0KKwlDU3RyaW5nCW1fc3RyRmluZFdoYXQ7DQorCWludAkJbV9uRGlyZWN0aW9uOw0KKwkvL319QUZYX0RBVEENCisNCisNCisvLyBPdmVycmlkZXMNCisJLy8gQ2xhc3NXaXphcmQgZ2VuZXJhdGVkIHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGVzDQorCS8ve3tBRlhfVklSVFVBTChDRmluZERsZykNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIHZvaWQgRG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKTsgICAgLy8gRERYL0REViBzdXBwb3J0DQorCS8vfX1BRlhfVklSVFVBTA0KKw0KKy8vIEltcGxlbWVudGF0aW9uDQorcHJvdGVjdGVkOg0KKwlDUmVhZGVyVkNWaWV3ICptX3BWaWV3Ow0KKwkvLyBHZW5lcmF0ZWQgbWVzc2FnZSBtYXAgZnVuY3Rpb25zDQorCS8ve3tBRlhfTVNHKENGaW5kRGxnKQ0KKwl2aXJ0dWFsIHZvaWQgT25PSygpOw0KKwl2aXJ0dWFsIEJPT0wgT25Jbml0RGlhbG9nKCk7DQorCS8vfX1BRlhfTVNHDQorCURFQ0xBUkVfTUVTU0FHRV9NQVAoKQ0KK307DQorDQorLy97e0FGWF9JTlNFUlRfTE9DQVRJT059fQ0KKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIHdpbGwgaW5zZXJ0IGFkZGl0aW9uYWwgZGVjbGFyYXRpb25zIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcHJldmlvdXMgbGluZS4NCisNCisjZW5kaWYgLy8gIWRlZmluZWQoQUZYX0ZJTkRETEdfSF9fMzU1QUY5NkJfQjQ4N180NTAzXzg2NThfN0YzN0IzOTdEMzhBX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0dvdG9QYWdlRGxnLmNwcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Hb3RvUGFnZURsZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxODljOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Hb3RvUGFnZURsZy5jcHAKQEAgLTAsMCArMSw2NSBAQAorLy8gR290b1BhZ2VEbGcuY3BwIDogaW1wbGVtZW50YXRpb24gZmlsZQ0KKy8vDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQy5oIg0KKyNpbmNsdWRlICJHb3RvUGFnZURsZy5oIg0KKw0KKyNpbmNsdWRlICJNYWluRnJtLmgiDQorI2luY2x1ZGUgIkNoaWxkRnJtLmgiDQorI2luY2x1ZGUgIlJlYWRlclZDVmlldy5oIg0KKw0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENHb3RvUGFnZURsZyBkaWFsb2cNCisNCisNCitDR290b1BhZ2VEbGc6OkNHb3RvUGFnZURsZyhDV25kKiBwUGFyZW50IC8qPU5VTEwqLykNCisJOiBDRGlhbG9nKENHb3RvUGFnZURsZzo6SURELCBwUGFyZW50KQ0KK3sNCisJLy97e0FGWF9EQVRBX0lOSVQoQ0dvdG9QYWdlRGxnKQ0KKwltX25QYWdlSW5kZXggPSAwOw0KKwkvL319QUZYX0RBVEFfSU5JVA0KK30NCisNCisNCit2b2lkIENHb3RvUGFnZURsZzo6RG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKQ0KK3sNCisJQ0RpYWxvZzo6RG9EYXRhRXhjaGFuZ2UocERYKTsNCisJLy97e0FGWF9EQVRBX01BUChDR290b1BhZ2VEbGcpDQorCUREWF9UZXh0KHBEWCwgSURDX0VESVQxLCBtX25QYWdlSW5kZXgpOw0KKwkvL319QUZYX0RBVEFfTUFQDQorfQ0KKw0KKw0KK0JFR0lOX01FU1NBR0VfTUFQKENHb3RvUGFnZURsZywgQ0RpYWxvZykNCisJLy97e0FGWF9NU0dfTUFQKENHb3RvUGFnZURsZykNCisJLy99fUFGWF9NU0dfTUFQDQorRU5EX01FU1NBR0VfTUFQKCkNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENHb3RvUGFnZURsZyBtZXNzYWdlIGhhbmRsZXJzDQorDQordm9pZCBDR290b1BhZ2VEbGc6Ok9uT0soKSANCit7DQorCS8vIFRPRE86IEFkZCBleHRyYSB2YWxpZGF0aW9uIGhlcmUNCisJaWYgKE5VTEwgPT0gbV9wVmlldykgcmV0dXJuOw0KKwlVcGRhdGVEYXRhKFRSVUUpOw0KKwltX3BWaWV3LT5Hb3RvUGFnZShtX25QYWdlSW5kZXgpOw0KKwlDRGlhbG9nOjpPbk9LKCk7DQorfQ0KKw0KK0JPT0wgQ0dvdG9QYWdlRGxnOjpPbkluaXREaWFsb2coKSANCit7DQorCUNEaWFsb2c6Ok9uSW5pdERpYWxvZygpOw0KKwkNCisJLy8gVE9ETzogQWRkIGV4dHJhIGluaXRpYWxpemF0aW9uIGhlcmUNCisJbV9wVmlldyA9IChDUmVhZGVyVkNWaWV3ICopKCgoQ0NoaWxkRnJhbWUgKikoKENNYWluRnJhbWUgKilBZnhHZXRNYWluV25kKCkpLT5HZXRBY3RpdmVGcmFtZSgpKS0+R2V0QWN0aXZlVmlldygpKTsNCisJcmV0dXJuIFRSVUU7ICAvLyByZXR1cm4gVFJVRSB1bmxlc3MgeW91IHNldCB0aGUgZm9jdXMgdG8gYSBjb250cm9sDQorCSAgICAgICAgICAgICAgLy8gRVhDRVBUSU9OOiBPQ1ggUHJvcGVydHkgUGFnZXMgc2hvdWxkIHJldHVybiBGQUxTRQ0KK30NCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvR290b1BhZ2VEbGcuaCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9Hb3RvUGFnZURsZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjZiZWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvR290b1BhZ2VEbGcuaApAQCAtMCwwICsxLDQ4IEBACisjaWYgIWRlZmluZWQoQUZYX0dPVE9QQUdFRExHX0hfXzY3NEMwNzA4XzRCMjVfNDQ2NV9BNzNGXzMxMDYxMEY5Qjk5MV9fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX0dPVE9QQUdFRExHX0hfXzY3NEMwNzA4XzRCMjVfNDQ2NV9BNzNGXzMxMDYxMEY5Qjk5MV9fSU5DTFVERURfDQorDQorI2lmIF9NU0NfVkVSID4gMTAwMA0KKyNwcmFnbWEgb25jZQ0KKyNlbmRpZiAvLyBfTVNDX1ZFUiA+IDEwMDANCisvLyBHb3RvUGFnZURsZy5oIDogaGVhZGVyIGZpbGUNCisvLw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0dvdG9QYWdlRGxnIGRpYWxvZw0KK2NsYXNzIENSZWFkZXJWQ1ZpZXc7DQorY2xhc3MgQ0dvdG9QYWdlRGxnIDogcHVibGljIENEaWFsb2cNCit7DQorLy8gQ29uc3RydWN0aW9uDQorcHVibGljOg0KKwlDR290b1BhZ2VEbGcoQ1duZCogcFBhcmVudCA9IE5VTEwpOyAgIC8vIHN0YW5kYXJkIGNvbnN0cnVjdG9yDQorDQorLy8gRGlhbG9nIERhdGENCisJLy97e0FGWF9EQVRBKENHb3RvUGFnZURsZykNCisJZW51bSB7IElERCA9IElERF9ETEdfR09UT1BBR0UgfTsNCisJaW50CQltX25QYWdlSW5kZXg7DQorCS8vfX1BRlhfREFUQQ0KKw0KKw0KKy8vIE92ZXJyaWRlcw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENHb3RvUGFnZURsZykNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIHZvaWQgRG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKTsgICAgLy8gRERYL0REViBzdXBwb3J0DQorCS8vfX1BRlhfVklSVFVBTA0KK3ByaXZhdGU6DQorCQlDUmVhZGVyVkNWaWV3ICptX3BWaWV3Ow0KKy8vIEltcGxlbWVudGF0aW9uDQorcHJvdGVjdGVkOg0KKwkNCisJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KKwkvL3t7QUZYX01TRyhDR290b1BhZ2VEbGcpDQorCXZpcnR1YWwgdm9pZCBPbk9LKCk7DQorCXZpcnR1YWwgQk9PTCBPbkluaXREaWFsb2coKTsNCisJLy99fUFGWF9NU0cNCisJREVDTEFSRV9NRVNTQUdFX01BUCgpDQorfTsNCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfR09UT1BBR0VETEdfSF9fNjc0QzA3MDhfNEIyNV80NDY1X0E3M0ZfMzEwNjEwRjlCOTkxX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0pTX1Jlc3BvbnNlRGxnLmNwcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9KU19SZXNwb25zZURsZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzZWZjMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9KU19SZXNwb25zZURsZy5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIEpTX1Jlc3BvbnNlRGxnLmNwcCA6IGltcGxlbWVudGF0aW9uIGZpbGUNCisvLw0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAicmVhZGVydmMuaCINCisjaW5jbHVkZSAiSlNfUmVzcG9uc2VEbGcuaCINCisNCisjaWZkZWYgX0RFQlVHDQorI2RlZmluZSBuZXcgREVCVUdfTkVXDQorI3VuZGVmIFRISVNfRklMRQ0KK3N0YXRpYyBjaGFyIFRISVNfRklMRVtdID0gX19GSUxFX187DQorI2VuZGlmDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDSlNfUmVzcG9uc2VEbGcgZGlhbG9nDQorDQorDQorQ0pTX1Jlc3BvbnNlRGxnOjpDSlNfUmVzcG9uc2VEbGcoQ1duZCogcFBhcmVudCAvKj1OVUxMKi8pDQorCTogQ0RpYWxvZyhDSlNfUmVzcG9uc2VEbGc6OklERCwgcFBhcmVudCkNCit7DQorCS8ve3tBRlhfREFUQV9JTklUKENKU19SZXNwb25zZURsZykNCisJCS8vIE5PVEU6IHRoZSBDbGFzc1dpemFyZCB3aWxsIGFkZCBtZW1iZXIgaW5pdGlhbGl6YXRpb24gaGVyZQ0KKwkvL319QUZYX0RBVEFfSU5JVA0KKwltX3N3VGl0bGUgPShGUERGX1dJREVTVFJJTkcpIEwiIjsNCisJbV9zd1F1ZXN0aW9uID0oRlBERl9XSURFU1RSSU5HKSBMIiI7DQorCW1fc3dMYWJlbCA9KEZQREZfV0lERVNUUklORykgTCIiOw0KKwltX3N3RGVmYXVsdCA9KEZQREZfV0lERVNUUklORykgTCIiOw0KKwltX3N3UmVzcG9uc2UgPUwiIjsNCisJbV9iSXNWaXNpYmxlID0gZmFsc2U7DQorCW1fcFJlc3BvbnNlRWRpdCA9IE5VTEw7DQorfQ0KKw0KKw0KK3ZvaWQgQ0pTX1Jlc3BvbnNlRGxnOjpEb0RhdGFFeGNoYW5nZShDRGF0YUV4Y2hhbmdlKiBwRFgpDQorew0KKwlDRGlhbG9nOjpEb0RhdGFFeGNoYW5nZShwRFgpOw0KKwkvL3t7QUZYX0RBVEFfTUFQKENKU19SZXNwb25zZURsZykNCisJCS8vIE5PVEU6IHRoZSBDbGFzc1dpemFyZCB3aWxsIGFkZCBERFggYW5kIEREViBjYWxscyBoZXJlDQorCS8vfX1BRlhfREFUQV9NQVANCit9DQorDQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ0pTX1Jlc3BvbnNlRGxnLCBDRGlhbG9nKQ0KKwkvL3t7QUZYX01TR19NQVAoQ0pTX1Jlc3BvbnNlRGxnKQ0KKwkJLy8gTk9URTogdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIG1lc3NhZ2UgbWFwIG1hY3JvcyBoZXJlDQorCQlPTl9CTl9DTElDS0VEKElEX0pTX09LLCBPblJlc09rKQ0KKwkJT05fQk5fQ0xJQ0tFRChJRF9KU19DQU5DRUwsIE9uUmVzQ2FuY2VsKQ0KKwkvL319QUZYX01TR19NQVANCitFTkRfTUVTU0FHRV9NQVAoKQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0pTX1Jlc3BvbnNlRGxnIG1lc3NhZ2UgaGFuZGxlcnMNCitCT09MIENKU19SZXNwb25zZURsZzo6T25Jbml0RGlhbG9nKCkNCit7DQorCUNEaWFsb2c6Ok9uSW5pdERpYWxvZygpOw0KKw0KKwk6OlNldFdpbmRvd1RleHRXKHRoaXMtPkdldFNhZmVId25kKCksIChMUENXU1RSKW1fc3dUaXRsZSk7DQorDQorCUNTdGF0aWMqIHBRdWVzdGlvbiA9IChDU3RhdGljKilHZXREbGdJdGVtKElEQ19KU19RVUVTVElPTik7DQorCTo6U2V0V2luZG93VGV4dFcocFF1ZXN0aW9uLT5HZXRTYWZlSHduZCgpLCAoTFBDV1NUUiltX3N3UXVlc3Rpb24pOw0KKw0KKwlDU3RhdGljKiBwTGFiZWwgPSAoQ1N0YXRpYyopR2V0RGxnSXRlbShJRENfSlNfQU5TV0VSKTsNCisNCisJQ1JlY3QgRGlhbG9nUmVjdDsNCisJQ1JlY3QgTGFiZWxSZWN0Ow0KKwlSRUNUIHJlY3Q7DQorCUdldFdpbmRvd1JlY3QoJkRpYWxvZ1JlY3QpOw0KKwlwTGFiZWwtPkdldFdpbmRvd1JlY3QoJkxhYmVsUmVjdCk7CQ0KKw0KKwlpZihtX3N3TGFiZWwgPT0gKEZQREZfV0lERVNUUklORylMIiIpDQorCXsJDQorCQlyZWN0LmxlZnQgPSBEaWFsb2dSZWN0LmxlZnQgKyAyMDsNCisJCXBMYWJlbC0+U2hvd1dpbmRvdyhTV19ISURFKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJlY3QubGVmdCA9IExhYmVsUmVjdC5yaWdodCArIDE7DQorCQk6OlNldFdpbmRvd1RleHRXKHBMYWJlbC0+R2V0U2FmZUh3bmQoKSwgKExQQ1dTVFIpbV9zd0xhYmVsKTsNCisJfQ0KKw0KKwlyZWN0LnRvcCA9IExhYmVsUmVjdC50b3AgLSAzOw0KKwlyZWN0LnJpZ2h0ID0gRGlhbG9nUmVjdC5yaWdodCAtIDIwOw0KKwlyZWN0LmJvdHRvbSA9IExhYmVsUmVjdC5ib3R0b20gKyAyOw0KKwlTY3JlZW5Ub0NsaWVudCgmcmVjdCk7DQorCW1fcFJlc3BvbnNlRWRpdCA9IG5ldyBDRWRpdCgpOw0KKw0KKwlpZihtX2JJc1Zpc2libGUpDQorCQltX3BSZXNwb25zZUVkaXQtPkNyZWF0ZShFU19BVVRPVlNDUk9MTCB8IEVTX05PSElERVNFTCB8IEVTX1BBU1NXT1JEIHwgV1NfQk9SREVSLCByZWN0LCB0aGlzLCBJRENfSlNfRURJVCk7DQorCWVsc2UNCisJCW1fcFJlc3BvbnNlRWRpdC0+Q3JlYXRlKEVTX0FVVE9WU0NST0xMIHwgRVNfTk9ISURFU0VMIHwgV1NfQk9SREVSLCByZWN0LCB0aGlzLCBJRENfSlNfRURJVCk7DQorCQ0KKwk6OlNldFdpbmRvd1RleHRXKG1fcFJlc3BvbnNlRWRpdC0+R2V0U2FmZUh3bmQoKSwgKExQQ1dTVFIpbV9zd0RlZmF1bHQpOw0KKwltX3BSZXNwb25zZUVkaXQtPlNob3dXaW5kb3coU1dfU0hPVyk7DQorDQorCXJldHVybiBUUlVFOw0KK30NCisNCit2b2lkIENKU19SZXNwb25zZURsZzo6T25SZXNPaygpDQorew0KKwltX3N3UmVzcG9uc2UgPSAod2NoYXJfdCopbWFsbG9jKHNpemVvZih3Y2hhcl90KSAqIDI1MCk7DQorCTo6R2V0V2luZG93VGV4dFcobV9wUmVzcG9uc2VFZGl0LT5HZXRTYWZlSHduZCgpLCBtX3N3UmVzcG9uc2UsIDI1MCk7DQorDQorCWlmKG1fcFJlc3BvbnNlRWRpdCkNCisJew0KKwkJbV9wUmVzcG9uc2VFZGl0LT5EZXN0cm95V2luZG93KCk7DQorCQlkZWxldGUgbV9wUmVzcG9uc2VFZGl0Ow0KKwkJbV9wUmVzcG9uc2VFZGl0ID0gTlVMTDsNCisJfQ0KKwlDRGlhbG9nOjpPbk9LKCk7DQorfQ0KKw0KK3ZvaWQgQ0pTX1Jlc3BvbnNlRGxnOjpPblJlc0NhbmNlbCgpDQorew0KKwlpZihtX3BSZXNwb25zZUVkaXQpDQorCXsNCisJCW1fcFJlc3BvbnNlRWRpdC0+RGVzdHJveVdpbmRvdygpOw0KKwkJZGVsZXRlIG1fcFJlc3BvbnNlRWRpdDsNCisJCW1fcFJlc3BvbnNlRWRpdCA9IE5VTEw7DQorCX0NCisJDQorCUNEaWFsb2c6Ok9uQ2FuY2VsKCk7DQorfQ0KKw0KK3ZvaWQgQ0pTX1Jlc3BvbnNlRGxnOjpTZXRUaXRsZShGUERGX1dJREVTVFJJTkcgc3dUaXRsZSkNCit7DQorCW1fc3dUaXRsZSA9IHN3VGl0bGU7DQorfQ0KKw0KK3ZvaWQgQ0pTX1Jlc3BvbnNlRGxnOjpTZXRRdWVzdGlvbihGUERGX1dJREVTVFJJTkcgc3dRdWVzdGlvbikNCit7DQorCW1fc3dRdWVzdGlvbiA9IHN3UXVlc3Rpb247DQorfQ0KKw0KK3ZvaWQgQ0pTX1Jlc3BvbnNlRGxnOjpTZXRMYWJlbChGUERGX1dJREVTVFJJTkcgc3dMYWJlbCkNCit7DQorCW1fc3dMYWJlbCA9IHN3TGFiZWw7DQorfQ0KKw0KK3ZvaWQgQ0pTX1Jlc3BvbnNlRGxnOjpTZXREZWZhdWx0KEZQREZfV0lERVNUUklORyBzd0RlZmF1bHQpDQorew0KKwltX3N3RGVmYXVsdCA9IHN3RGVmYXVsdDsNCit9DQorDQorRlBERl9XSURFU1RSSU5HIENKU19SZXNwb25zZURsZzo6R2V0UmVzcG9uc2UoKQ0KK3sNCisJcmV0dXJuIChGUERGX1dJREVTVFJJTkcpbV9zd1Jlc3BvbnNlOw0KK30NCisNCit2b2lkIENKU19SZXNwb25zZURsZzo6U2V0SXNWaXNpYmxlKEZQREZfQk9PTCBiUGFzc3dvcmQpDQorew0KKwltX2JJc1Zpc2libGUgPSBiUGFzc3dvcmQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9KU19SZXNwb25zZURsZy5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L0pTX1Jlc3BvbnNlRGxnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0MTBjNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9KU19SZXNwb25zZURsZy5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZiAhZGVmaW5lZChBRlhfSlNfUkVTUE9OU0VETEdfSF9fQUUxNTc1RUJfM0YwQV80NkU3X0IyNzhfMDg5Qzc0RjJCMzRDX19JTkNMVURFRF8pDQorI2RlZmluZSBBRlhfSlNfUkVTUE9OU0VETEdfSF9fQUUxNTc1RUJfM0YwQV80NkU3X0IyNzhfMDg5Qzc0RjJCMzRDX19JTkNMVURFRF8NCisNCisjaWYgX01TQ19WRVIgPiAxMDAwDQorI3ByYWdtYSBvbmNlDQorI2VuZGlmIC8vIF9NU0NfVkVSID4gMTAwMA0KKy8vIEpTX1Jlc3BvbnNlRGxnLmggOiBoZWFkZXIgZmlsZQ0KKy8vDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDSlNfUmVzcG9uc2VEbGcgZGlhbG9nDQorDQorY2xhc3MgQ0pTX1Jlc3BvbnNlRGxnIDogcHVibGljIENEaWFsb2cNCit7DQorLy8gQ29uc3RydWN0aW9uDQorcHVibGljOg0KKwlDSlNfUmVzcG9uc2VEbGcoQ1duZCogcFBhcmVudCA9IE5VTEwpOyAgIC8vIHN0YW5kYXJkIGNvbnN0cnVjdG9yDQorCX5DSlNfUmVzcG9uc2VEbGcoKXsgaWYobV9zd1Jlc3BvbnNlKSBmcmVlKG1fc3dSZXNwb25zZSk7IH0NCisNCisvLyBEaWFsb2cgRGF0YQ0KKwkvL3t7QUZYX0RBVEEoQ0pTX1Jlc3BvbnNlRGxnKQ0KKwllbnVtIHsgSUREID0gSUREX0RMR19SRVNQT05TRSB9Ow0KKwkJLy8gTk9URTogdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIGRhdGEgbWVtYmVycyBoZXJlDQorCS8vfX1BRlhfREFUQQ0KK3B1YmxpYzoNCisJdm9pZAkJCQlTZXRUaXRsZShGUERGX1dJREVTVFJJTkcgc3dUaXRsZSk7DQorCXZvaWQJCQkJU2V0UXVlc3Rpb24oRlBERl9XSURFU1RSSU5HIHN3UXVlc3Rpb24pOw0KKwl2b2lkCQkJCVNldERlZmF1bHQoRlBERl9XSURFU1RSSU5HIHN3RGVmYXVsdCk7DQorCXZvaWQJCQkJU2V0TGFiZWwoRlBERl9XSURFU1RSSU5HIHN3TGFiZWwpOw0KKwl2b2lkCQkJCVNldElzVmlzaWJsZShGUERGX0JPT0wgYlBhc3N3b3JkKTsNCisJRlBERl9XSURFU1RSSU5HCQlHZXRSZXNwb25zZSgpOw0KKw0KK3ByaXZhdGU6DQorCUZQREZfV0lERVNUUklORwkJbV9zd1RpdGxlOw0KKwlGUERGX1dJREVTVFJJTkcJCW1fc3dRdWVzdGlvbjsNCisJRlBERl9XSURFU1RSSU5HCQltX3N3RGVmYXVsdDsNCisJRlBERl9XSURFU1RSSU5HCQltX3N3TGFiZWw7DQorCXdjaGFyX3QqCQkgCW1fc3dSZXNwb25zZTsNCisJRlBERl9CT09MCQkJbV9iSXNWaXNpYmxlOw0KKwlDRWRpdCoJCQkJbV9wUmVzcG9uc2VFZGl0Ow0KKy8vIE92ZXJyaWRlcw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENKU19SZXNwb25zZURsZykNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIHZvaWQgRG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKTsgICAgLy8gRERYL0REViBzdXBwb3J0DQorCS8vfX1BRlhfVklSVFVBTA0KKw0KKy8vIEltcGxlbWVudGF0aW9uDQorcHJvdGVjdGVkOg0KKw0KKwkvLyBHZW5lcmF0ZWQgbWVzc2FnZSBtYXAgZnVuY3Rpb25zDQorCS8ve3tBRlhfTVNHKENKU19SZXNwb25zZURsZykNCisJCS8vIE5PVEU6IHRoZSBDbGFzc1dpemFyZCB3aWxsIGFkZCBtZW1iZXIgZnVuY3Rpb25zIGhlcmUNCisJdmlydHVhbCBCT09MIE9uSW5pdERpYWxvZygpOw0KKwlhZnhfbXNnIHZvaWQgT25SZXNPaygpOw0KKwlhZnhfbXNnIHZvaWQgT25SZXNDYW5jZWwoKTsNCisJLy99fUFGWF9NU0cNCisJREVDTEFSRV9NRVNTQUdFX01BUCgpDQorfTsNCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfSlNfUkVTUE9OU0VETEdfSF9fQUUxNTc1RUJfM0YwQV80NkU3X0IyNzhfMDg5Qzc0RjJCMzRDX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L01haW5Gcm0uY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L01haW5Gcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTU5NDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvTWFpbkZybS5jcHAKQEAgLTAsMCArMSwyMzggQEAKKy8vIE1haW5Gcm0uY3BwIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIENNYWluRnJhbWUgY2xhc3MNCisvLw0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiUmVhZGVyVkMuaCINCisNCisjaW5jbHVkZSAiTWFpbkZybS5oIg0KKw0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENNYWluRnJhbWUNCisNCitJTVBMRU1FTlRfRFlOQU1JQyhDTWFpbkZyYW1lLCBDTURJRnJhbWVXbmQpDQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ01haW5GcmFtZSwgQ01ESUZyYW1lV25kKQ0KKwkvL3t7QUZYX01TR19NQVAoQ01haW5GcmFtZSkNCisJCS8vIE5PVEUgLSB0aGUgQ2xhc3NXaXphcmQgd2lsbCBhZGQgYW5kIHJlbW92ZSBtYXBwaW5nIG1hY3JvcyBoZXJlLg0KKwkJLy8gICAgRE8gTk9UIEVESVQgd2hhdCB5b3Ugc2VlIGluIHRoZXNlIGJsb2NrcyBvZiBnZW5lcmF0ZWQgY29kZSAhDQorCU9OX1dNX0NSRUFURSgpDQorCS8vfX1BRlhfTVNHX01BUA0KK0VORF9NRVNTQUdFX01BUCgpDQorDQorc3RhdGljIFVJTlQgaW5kaWNhdG9yc1tdID0NCit7DQorCUlEX1NFUEFSQVRPUiwgICAgICAgICAgIC8vIHN0YXR1cyBsaW5lIGluZGljYXRvcg0KKwlJRF9JTkRJQ0FUT1JfQ0FQUywNCisJSURfSU5ESUNBVE9SX05VTSwNCisJSURfSU5ESUNBVE9SX1NDUkwsDQorfTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENNYWluRnJhbWUgY29uc3RydWN0aW9uL2Rlc3RydWN0aW9uDQorDQorQ01haW5GcmFtZTo6Q01haW5GcmFtZSgpDQorew0KKwkvLyBUT0RPOiBhZGQgbWVtYmVyIGluaXRpYWxpemF0aW9uIGNvZGUgaGVyZQ0KKwkNCit9DQorDQorQ01haW5GcmFtZTo6fkNNYWluRnJhbWUoKQ0KK3sNCit9DQorDQoraW50IENNYWluRnJhbWU6Ok9uQ3JlYXRlKExQQ1JFQVRFU1RSVUNUIGxwQ3JlYXRlU3RydWN0KQ0KK3sNCisJaWYgKENNRElGcmFtZVduZDo6T25DcmVhdGUobHBDcmVhdGVTdHJ1Y3QpID09IC0xKQ0KKwkJcmV0dXJuIC0xOw0KKwkNCisJaWYgKCFtX3duZFRvb2xCYXIuQ3JlYXRlRXgodGhpcywgVEJTVFlMRV9GTEFULCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBDQlJTX1RPUA0KKwkJfCBDQlJTX0dSSVBQRVIgfCBDQlJTX1RPT0xUSVBTIHwgQ0JSU19GTFlCWSB8IENCUlNfU0laRV9EWU5BTUlDKSB8fA0KKwkJIW1fd25kVG9vbEJhci5Mb2FkVG9vbEJhcihJRFJfTUFJTkZSQU1FKSkNCisJew0KKwkJVFJBQ0UwKCJGYWlsZWQgdG8gY3JlYXRlIHRvb2xiYXJcbiIpOw0KKwkJcmV0dXJuIC0xOyAgICAgIC8vIGZhaWwgdG8gY3JlYXRlDQorCX0NCisNCisJaWYgKCFtX3duZFN0YXR1c0Jhci5DcmVhdGUodGhpcykgfHwNCisJCSFtX3duZFN0YXR1c0Jhci5TZXRJbmRpY2F0b3JzKGluZGljYXRvcnMsDQorCQkgIHNpemVvZihpbmRpY2F0b3JzKS9zaXplb2YoVUlOVCkpKQ0KKwl7DQorCQlUUkFDRTAoIkZhaWxlZCB0byBjcmVhdGUgc3RhdHVzIGJhclxuIik7DQorCQlyZXR1cm4gLTE7ICAgICAgLy8gZmFpbCB0byBjcmVhdGUNCisJfQ0KKw0KKwkvLyBUT0RPOiBEZWxldGUgdGhlc2UgdGhyZWUgbGluZXMgaWYgeW91IGRvbid0IHdhbnQgdGhlIHRvb2xiYXIgdG8NCisJLy8gIGJlIGRvY2thYmxlDQorDQorCW1fd25kVG9vbEJhci5Nb2RpZnlTdHlsZSgwLFRCU1RZTEVfRkxBVCB8IENCUlNfVE9PTFRJUFMgfCBUQlNUWUxFX1RSQU5TUEFSRU5UIHwgVEJCU19DSEVDS0JPWCk7DQorCW1fd25kVG9vbEJhci5HZXRUb29sQmFyQ3RybCgpLlNldEJ1dHRvbldpZHRoKDQwLDQwKTsNCisNCisJQ0ltYWdlTGlzdCBJbWdMaXN0LEltZ0xpc3QxOw0KKwlDQml0bWFwIGJtOw0KKwlJbWdMaXN0LkNyZWF0ZSgyMiwyMixJTENfQ09MT1I4fElMQ19NQVNLLCAxNiwgMTYpOw0KKwlJbWdMaXN0LlNldEJrQ29sb3IoOjpHZXRTeXNDb2xvcigxNSkpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAyMyk7Ly9PUEVODQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMzUpOy8vUHJpbnQNCisJSW1nTGlzdC5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAxNyk7Ly9maXJzdCBwYWdlDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMjQpOy8vcHJldiBwYWdlDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMjIpOy8vbmV4dCBwYWdlDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMjEpOy8vbGFzdCBwYWdlDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMTYpOy8vY291bnQgY2xvY2t3aXNlDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMTUpOy8vY2xvY2t3aXNlDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMTQpOy8vem9vbSBpbg0KKwlJbWdMaXN0LkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDI2KTsvL3pvb20gb3V0DQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMTMpOy8vYWN0dWFsIHNpemUNCisJSW1nTGlzdC5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAxOCk7Ly9maXQgcGFnZQ0KKwlJbWdMaXN0LkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDE5KTsvL2ZpdCB3aWR0aA0KKwlJbWdMaXN0LkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDM2KTsvL3NlYXJjaA0KKwlJbWdMaXN0LkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDcpOy8vQm9va21hcmsNCisJSW1nTGlzdC5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAyNSk7Ly9zbmFwIHNob3QNCisJSW1nTGlzdC5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAyKTsvL3NlbGVjdCB0ZXh0DQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMjApOy8vaGFuZCB0b29sDQorCUltZ0xpc3QuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMTIpOy8vYWJvdXQNCisJSW1nTGlzdC5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwltX3duZFRvb2xCYXIuR2V0VG9vbEJhckN0cmwoKS5TZXRJbWFnZUxpc3QoJkltZ0xpc3QpOw0KKwkvL21fd25kVG9vbEJhci5HZXRUb29sQmFyQ3RybCgpLlNldEhvdEltYWdlTGlzdCgmSW1nTGlzdCk7DQorCUltZ0xpc3QuRGV0YWNoKCk7DQorDQorCUltZ0xpc3QxLkNyZWF0ZSgyMiwyMixJTENfQ09MT1I4fElMQ19NQVNLLCAxNiwgMTYpOw0KKwlJbWdMaXN0MS5TZXRCa0NvbG9yKDo6R2V0U3lzQ29sb3IoMTUpKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMjMpOy8vb3Blbg0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAzMCk7Ly9wcmludGVyDQorCUltZ0xpc3QxLkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDgpOy8vZmlyc3QgcGFnZQ0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAyOSk7Ly9wcmV2IHBhZ2UNCisJSW1nTGlzdDEuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMjgpOy8vbmV4dCBwYWdlDQorCUltZ0xpc3QxLkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDI3KTsvL2xhc3QgcGFnZQ0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAxKTsvL2NvdW50IGNsb2Nrd2lzZQ0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVA2KTsvL2Nsb2Nrd2lzZQ0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAzMyk7Ly96b29tIGluDQorCUltZ0xpc3QxLkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDM0KTsvL3pvb20gb3V0DQorCUltZ0xpc3QxLkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDQpOy8vYWN0dWFsIHNpemUNCisJSW1nTGlzdDEuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQOSk7Ly9maXQgcGFnZQ0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAxMCk7Ly9maXQgd2lkdGgNCisJSW1nTGlzdDEuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMzEpOy8vc2VhcmNoDQorCUltZ0xpc3QxLkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDUpOy8vYm9va21hcmsNCisJSW1nTGlzdDEuQWRkKCZibSxSR0IoMCwyNTUsMCkpOw0KKwlibS5EZXRhY2goKTsNCisJYm0uTG9hZEJpdG1hcChJREJfQklUTUFQMzIpOy8vc25hcA0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAzKTsvL3NlbGVjdCB0ZXh0DQorCUltZ0xpc3QxLkFkZCgmYm0sUkdCKDAsMjU1LDApKTsNCisJYm0uRGV0YWNoKCk7DQorCWJtLkxvYWRCaXRtYXAoSURCX0JJVE1BUDExKTsvL2hhbmQgdG9vbA0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwlibS5Mb2FkQml0bWFwKElEQl9CSVRNQVAxMik7Ly9hYm91dA0KKwlJbWdMaXN0MS5BZGQoJmJtLFJHQigwLDI1NSwwKSk7DQorCWJtLkRldGFjaCgpOw0KKwltX3duZFRvb2xCYXIuR2V0VG9vbEJhckN0cmwoKS5TZXREaXNhYmxlZEltYWdlTGlzdCgmSW1nTGlzdDEpOw0KKwlJbWdMaXN0MS5EZXRhY2goKTsNCisgICAgDQorCW1fd25kVG9vbEJhci5FbmFibGVEb2NraW5nKENCUlNfQUxJR05fQU5ZKTsNCisJRW5hYmxlRG9ja2luZyhDQlJTX0FMSUdOX0FOWSk7DQorCURvY2tDb250cm9sQmFyKCZtX3duZFRvb2xCYXIpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorQk9PTCBDTWFpbkZyYW1lOjpQcmVDcmVhdGVXaW5kb3coQ1JFQVRFU1RSVUNUJiBjcykNCit7DQorCWlmKCAhQ01ESUZyYW1lV25kOjpQcmVDcmVhdGVXaW5kb3coY3MpICkNCisJCXJldHVybiBGQUxTRTsNCisJLy8gVE9ETzogTW9kaWZ5IHRoZSBXaW5kb3cgY2xhc3Mgb3Igc3R5bGVzIGhlcmUgYnkgbW9kaWZ5aW5nDQorCS8vICB0aGUgQ1JFQVRFU1RSVUNUIGNzDQorDQorCXJldHVybiBUUlVFOw0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENNYWluRnJhbWUgZGlhZ25vc3RpY3MNCisNCisjaWZkZWYgX0RFQlVHDQordm9pZCBDTWFpbkZyYW1lOjpBc3NlcnRWYWxpZCgpIGNvbnN0DQorew0KKwlDTURJRnJhbWVXbmQ6OkFzc2VydFZhbGlkKCk7DQorfQ0KKw0KK3ZvaWQgQ01haW5GcmFtZTo6RHVtcChDRHVtcENvbnRleHQmIGRjKSBjb25zdA0KK3sNCisJQ01ESUZyYW1lV25kOjpEdW1wKGRjKTsNCit9DQorDQorI2VuZGlmIC8vX0RFQlVHDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDTWFpbkZyYW1lIG1lc3NhZ2UgaGFuZGxlcnMNCisNCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvTWFpbkZybS5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L01haW5Gcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjlmMTI4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L01haW5Gcm0uaApAQCAtMCwwICsxLDU2IEBACisvLyBNYWluRnJtLmggOiBpbnRlcmZhY2Ugb2YgdGhlIENNYWluRnJhbWUgY2xhc3MNCisvLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorI2lmICFkZWZpbmVkKEFGWF9NQUlORlJNX0hfX0IwNTI4NEY5X0ZEOTZfNDlBOV9COEIyX0Y3NzcwNkE5QTAyQl9fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX01BSU5GUk1fSF9fQjA1Mjg0RjlfRkQ5Nl80OUE5X0I4QjJfRjc3NzA2QTlBMDJCX19JTkNMVURFRF8NCisNCisjaWYgX01TQ19WRVIgPiAxMDAwDQorI3ByYWdtYSBvbmNlDQorI2VuZGlmIC8vIF9NU0NfVkVSID4gMTAwMA0KKw0KK2NsYXNzIENNYWluRnJhbWUgOiBwdWJsaWMgQ01ESUZyYW1lV25kDQorew0KKwlERUNMQVJFX0RZTkFNSUMoQ01haW5GcmFtZSkNCitwdWJsaWM6DQorCUNNYWluRnJhbWUoKTsNCisNCisvLyBBdHRyaWJ1dGVzDQorcHVibGljOg0KKwlDU3RhdHVzQmFyICBtX3duZFN0YXR1c0JhcjsNCisJQ1Rvb2xCYXIgICAgbV93bmRUb29sQmFyOw0KKy8vIE9wZXJhdGlvbnMNCitwdWJsaWM6DQorDQorLy8gT3ZlcnJpZGVzDQorCS8vIENsYXNzV2l6YXJkIGdlbmVyYXRlZCB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcw0KKwkvL3t7QUZYX1ZJUlRVQUwoQ01haW5GcmFtZSkNCisJdmlydHVhbCBCT09MIFByZUNyZWF0ZVdpbmRvdyhDUkVBVEVTVFJVQ1QmIGNzKTsNCisJLy99fUFGWF9WSVJUVUFMDQorDQorLy8gSW1wbGVtZW50YXRpb24NCitwdWJsaWM6DQorCXZpcnR1YWwgfkNNYWluRnJhbWUoKTsNCisjaWZkZWYgX0RFQlVHDQorCXZpcnR1YWwgdm9pZCBBc3NlcnRWYWxpZCgpIGNvbnN0Ow0KKwl2aXJ0dWFsIHZvaWQgRHVtcChDRHVtcENvbnRleHQmIGRjKSBjb25zdDsNCisjZW5kaWYNCisNCitwcm90ZWN0ZWQ6ICAvLyBjb250cm9sIGJhciBlbWJlZGRlZCBtZW1iZXJzDQorDQorLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KK3Byb3RlY3RlZDoNCisJLy97e0FGWF9NU0coQ01haW5GcmFtZSkNCisJYWZ4X21zZyBpbnQgT25DcmVhdGUoTFBDUkVBVEVTVFJVQ1QgbHBDcmVhdGVTdHJ1Y3QpOw0KKwkJLy8gTk9URSAtIHRoZSBDbGFzc1dpemFyZCB3aWxsIGFkZCBhbmQgcmVtb3ZlIG1lbWJlciBmdW5jdGlvbnMgaGVyZS4NCisJCS8vICAgIERPIE5PVCBFRElUIHdoYXQgeW91IHNlZSBpbiB0aGVzZSBibG9ja3Mgb2YgZ2VuZXJhdGVkIGNvZGUhDQorCS8vfX1BRlhfTVNHDQorCURFQ0xBUkVfTUVTU0FHRV9NQVAoKQ0KK307DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfTUFJTkZSTV9IX19CMDUyODRGOV9GRDk2XzQ5QTlfQjhCMl9GNzc3MDZBOUEwMkJfX0lOQ0xVREVEXykNCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvUmVhZGVyVkMuY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDU4YzI1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLy8gUmVhZGVyVkMuY3BwIDogRGVmaW5lcyB0aGUgY2xhc3MgYmVoYXZpb3JzIGZvciB0aGUgYXBwbGljYXRpb24uDQorLy8NCisNCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorI2luY2x1ZGUgIlJlYWRlclZDLmgiDQorDQorI2luY2x1ZGUgIk1haW5Gcm0uaCINCisjaW5jbHVkZSAiQ2hpbGRGcm0uaCINCisjaW5jbHVkZSAiUmVhZGVyVkNEb2MuaCINCisjaW5jbHVkZSAiUmVhZGVyVkNWaWV3LmgiDQorI2luY2x1ZGUgIkJvb2ttYXJrVmlldy5oIg0KKw0KKw0KKw0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENSZWFkZXJWQ0FwcA0KKw0KK0JFR0lOX01FU1NBR0VfTUFQKENSZWFkZXJWQ0FwcCwgQ1dpbkFwcCkNCisJLy97e0FGWF9NU0dfTUFQKENSZWFkZXJWQ0FwcCkNCisJT05fQ09NTUFORChJRF9BUFBfQUJPVVQsIE9uQXBwQWJvdXQpDQorCQkvLyBOT1RFIC0gdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIGFuZCByZW1vdmUgbWFwcGluZyBtYWNyb3MgaGVyZS4NCisJCS8vICAgIERPIE5PVCBFRElUIHdoYXQgeW91IHNlZSBpbiB0aGVzZSBibG9ja3Mgb2YgZ2VuZXJhdGVkIGNvZGUhDQorCS8vfX1BRlhfTVNHX01BUA0KKwkvLyBTdGFuZGFyZCBmaWxlIGJhc2VkIGRvY3VtZW50IGNvbW1hbmRzDQorCU9OX0NPTU1BTkQoSURfRklMRV9ORVcsIENXaW5BcHA6Ok9uRmlsZU5ldykNCisJT05fQ09NTUFORChJRF9GSUxFX09QRU4sIENXaW5BcHA6Ok9uRmlsZU9wZW4pDQorCS8vIFN0YW5kYXJkIHByaW50IHNldHVwIGNvbW1hbmQNCisJT05fQ09NTUFORChJRF9GSUxFX1BSSU5UX1NFVFVQLCBDV2luQXBwOjpPbkZpbGVQcmludFNldHVwKQ0KK0VORF9NRVNTQUdFX01BUCgpDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDUmVhZGVyVkNBcHAgY29uc3RydWN0aW9uDQorDQorDQorQ1JlYWRlclZDQXBwOjpDUmVhZGVyVkNBcHAoKQ0KK3sNCisJLy8gVE9ETzogYWRkIGNvbnN0cnVjdGlvbiBjb2RlIGhlcmUsDQorCS8vIFBsYWNlIGFsbCBzaWduaWZpY2FudCBpbml0aWFsaXphdGlvbiBpbiBJbml0SW5zdGFuY2UNCisNCisNCisNCisJbV9wQWN0aXZlVmlldyA9IE5VTEw7DQorDQorDQorDQorLy8JRlBERl9Jbml0Rm9ybUZpbGxFbnZpcm91bWVudCh0aGlzKTsNCit9DQorDQorQ1JlYWRlclZDQXBwOjp+Q1JlYWRlclZDQXBwKCkNCit7DQorDQorDQorDQorfQ0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVGhlIG9uZSBhbmQgb25seSBDUmVhZGVyVkNBcHAgb2JqZWN0DQorDQorQ1JlYWRlclZDQXBwIHRoZUFwcDsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENSZWFkZXJWQ0FwcCBpbml0aWFsaXphdGlvbg0KK2V4dGVybiB2b2lkIFNldFNhbXBsZUZvbnRJbmZvKCk7DQorQk9PTCBDUmVhZGVyVkNBcHA6OkluaXRJbnN0YW5jZSgpDQorew0KKwlBZnhFbmFibGVDb250cm9sQ29udGFpbmVyKCk7DQorCUZQREZfSW5pdExpYnJhcnkodGhpcy0+bV9oSW5zdGFuY2UpOw0KKy8vCUZQREZfVW5sb2NrRExMKCJTREtSRFlYMDQwOCIsIjVFNTg4NUE4QUQ2MUE4NTU0ODVEOUY2Qzg1QkU4MkVGN0MxRjYzQUMiKTsNCisNCisJU2V0U2FtcGxlRm9udEluZm8oKTsNCisJLy8gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb24NCisJLy8gSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlc2UgZmVhdHVyZXMgYW5kIHdpc2ggdG8gcmVkdWNlIHRoZSBzaXplDQorCS8vICBvZiB5b3VyIGZpbmFsIGV4ZWN1dGFibGUsIHlvdSBzaG91bGQgcmVtb3ZlIGZyb20gdGhlIGZvbGxvd2luZw0KKwkvLyAgdGhlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIHlvdSBkbyBub3QgbmVlZC4NCisNCisjaWZkZWYgX0FGWERMTA0KKwlFbmFibGUzZENvbnRyb2xzKCk7CQkJLy8gQ2FsbCB0aGlzIHdoZW4gdXNpbmcgTUZDIGluIGEgc2hhcmVkIERMTA0KKyNlbHNlDQorCUVuYWJsZTNkQ29udHJvbHNTdGF0aWMoKTsJLy8gQ2FsbCB0aGlzIHdoZW4gbGlua2luZyB0byBNRkMgc3RhdGljYWxseQ0KKyNlbmRpZg0KKw0KKwkvLyBDaGFuZ2UgdGhlIHJlZ2lzdHJ5IGtleSB1bmRlciB3aGljaCBvdXIgc2V0dGluZ3MgYXJlIHN0b3JlZC4NCisJLy8gVE9ETzogWW91IHNob3VsZCBtb2RpZnkgdGhpcyBzdHJpbmcgdG8gYmUgc29tZXRoaW5nIGFwcHJvcHJpYXRlDQorCS8vIHN1Y2ggYXMgdGhlIG5hbWUgb2YgeW91ciBjb21wYW55IG9yIG9yZ2FuaXphdGlvbi4NCisJU2V0UmVnaXN0cnlLZXkoX1QoIkxvY2FsIEFwcFdpemFyZC1HZW5lcmF0ZWQgQXBwbGljYXRpb25zIikpOw0KKw0KKwlMb2FkU3RkUHJvZmlsZVNldHRpbmdzKCk7ICAvLyBMb2FkIHN0YW5kYXJkIElOSSBmaWxlIG9wdGlvbnMgKGluY2x1ZGluZyBNUlUpDQorDQorCS8vIFJlZ2lzdGVyIHRoZSBhcHBsaWNhdGlvbidzIGRvY3VtZW50IHRlbXBsYXRlcy4gIERvY3VtZW50IHRlbXBsYXRlcw0KKwkvLyAgc2VydmUgYXMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBkb2N1bWVudHMsIGZyYW1lIHdpbmRvd3MgYW5kIHZpZXdzLg0KKw0KKwlDTXVsdGlEb2NUZW1wbGF0ZSogcERvY1RlbXBsYXRlOw0KKwlwRG9jVGVtcGxhdGUgPSBuZXcgQ011bHRpRG9jVGVtcGxhdGUoDQorCQlJRFJfUkVBREVSVFlQRSwNCisJCVJVTlRJTUVfQ0xBU1MoQ1JlYWRlclZDRG9jKSwNCisJCVJVTlRJTUVfQ0xBU1MoQ0NoaWxkRnJhbWUpLCAvLyBjdXN0b20gTURJIGNoaWxkIGZyYW1lDQorCQlSVU5USU1FX0NMQVNTKENSZWFkZXJWQ1ZpZXcpKTsNCisJQWRkRG9jVGVtcGxhdGUocERvY1RlbXBsYXRlKTsNCisNCisJQ011bHRpRG9jVGVtcGxhdGUqIHBEb2NUZW1wbGF0ZTE7DQorCXBEb2NUZW1wbGF0ZTEgPSBuZXcgQ011bHRpRG9jVGVtcGxhdGUoDQorCQlJRFJfUkVBREVSVFlQRSwNCisJCVJVTlRJTUVfQ0xBU1MoQ1JlYWRlclZDRG9jKSwNCisJCVJVTlRJTUVfQ0xBU1MoQ0NoaWxkRnJhbWUpLCAvLyBjdXN0b20gTURJIGNoaWxkIGZyYW1lDQorCQlSVU5USU1FX0NMQVNTKENCb29rTWFya1ZpZXcpKTsNCisJQWRkRG9jVGVtcGxhdGUocERvY1RlbXBsYXRlMSk7DQorCS8vIGNyZWF0ZSBtYWluIE1ESSBGcmFtZSB3aW5kb3cNCisJQ01haW5GcmFtZSogcE1haW5GcmFtZSA9IG5ldyBDTWFpbkZyYW1lOw0KKwlpZiAoIXBNYWluRnJhbWUtPkxvYWRGcmFtZShJRFJfTUFJTkZSQU1FKSkNCisJCXJldHVybiBGQUxTRTsNCisJbV9wTWFpblduZCA9IHBNYWluRnJhbWU7DQorCS8vIFBhcnNlIGNvbW1hbmQgbGluZSBmb3Igc3RhbmRhcmQgc2hlbGwgY29tbWFuZHMsIERERSwgZmlsZSBvcGVuDQorCUNDb21tYW5kTGluZUluZm8gY21kSW5mbzsNCisJY21kSW5mby5tX25TaGVsbENvbW1hbmQgPSBDQ29tbWFuZExpbmVJbmZvOjpGaWxlTm90aGluZzsNCisJUGFyc2VDb21tYW5kTGluZShjbWRJbmZvKTsNCisNCisJLy8gRGlzcGF0Y2ggY29tbWFuZHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUNCisJaWYgKCFQcm9jZXNzU2hlbGxDb21tYW5kKGNtZEluZm8pKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKw0KKwkvLyBUaGUgbWFpbiB3aW5kb3cgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIHNvIHNob3cgYW5kIHVwZGF0ZSBpdC4NCisJcE1haW5GcmFtZS0+U2hvd1dpbmRvdyhTV19TSE9XTUFYSU1JWkVEKTsNCisJcE1haW5GcmFtZS0+VXBkYXRlV2luZG93KCk7DQorCXJldHVybiBUUlVFOw0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENBYm91dERsZyBkaWFsb2cgdXNlZCBmb3IgQXBwIEFib3V0DQorDQorY2xhc3MgQ0Fib3V0RGxnIDogcHVibGljIENEaWFsb2cNCit7DQorcHVibGljOg0KKwlDQWJvdXREbGcoKTsNCisNCisvLyBEaWFsb2cgRGF0YQ0KKwkvL3t7QUZYX0RBVEEoQ0Fib3V0RGxnKQ0KKwllbnVtIHsgSUREID0gSUREX0FCT1VUQk9YIH07DQorCS8vfX1BRlhfREFUQQ0KKw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENBYm91dERsZykNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIHZvaWQgRG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKTsgICAgLy8gRERYL0REViBzdXBwb3J0DQorCS8vfX1BRlhfVklSVFVBTA0KKw0KKy8vIEltcGxlbWVudGF0aW9uDQorcHJvdGVjdGVkOg0KKwkvL3t7QUZYX01TRyhDQWJvdXREbGcpDQorCWFmeF9tc2cgdm9pZCBPbk1ldGFsZmlsZSgpOw0KKwkvL319QUZYX01TRw0KKwlERUNMQVJFX01FU1NBR0VfTUFQKCkNCit9Ow0KKw0KK0NBYm91dERsZzo6Q0Fib3V0RGxnKCkgOiBDRGlhbG9nKENBYm91dERsZzo6SUREKQ0KK3sNCisJLy97e0FGWF9EQVRBX0lOSVQoQ0Fib3V0RGxnKQ0KKwkvL319QUZYX0RBVEFfSU5JVA0KK30NCisNCit2b2lkIENBYm91dERsZzo6RG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKQ0KK3sNCisJQ0RpYWxvZzo6RG9EYXRhRXhjaGFuZ2UocERYKTsNCisJLy97e0FGWF9EQVRBX01BUChDQWJvdXREbGcpDQorCS8vfX1BRlhfREFUQV9NQVANCit9DQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ0Fib3V0RGxnLCBDRGlhbG9nKQ0KKwkvL3t7QUZYX01TR19NQVAoQ0Fib3V0RGxnKQ0KKwkvL319QUZYX01TR19NQVANCitFTkRfTUVTU0FHRV9NQVAoKQ0KKw0KKy8vIEFwcCBjb21tYW5kIHRvIHJ1biB0aGUgZGlhbG9nDQordm9pZCBDUmVhZGVyVkNBcHA6Ok9uQXBwQWJvdXQoKQ0KK3sNCisJQ0Fib3V0RGxnIGFib3V0RGxnOw0KKwlhYm91dERsZy5Eb01vZGFsKCk7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ1JlYWRlclZDQXBwIG1lc3NhZ2UgaGFuZGxlcnMNCisNCisNCitpbnQgQ1JlYWRlclZDQXBwOjpFeGl0SW5zdGFuY2UoKSANCit7DQorCS8vIFRPRE86IEFkZCB5b3VyIHNwZWNpYWxpemVkIGNvZGUgaGVyZSBhbmQvb3IgY2FsbCB0aGUgYmFzZSBjbGFzcw0KKwlGUERGX0Rlc3Ryb3lMaWJyYXJ5KCk7DQorDQorCXJldHVybiBDV2luQXBwOjpFeGl0SW5zdGFuY2UoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDLmRzcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQy5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5NWUwNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQy5kc3AKQEAgLTAsMCArMSw0NjAgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iUmVhZGVyVkMiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDENCisNCitDRkc9UmVhZGVyVkMgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiUmVhZGVyVkMubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIlJlYWRlclZDLm1hayIgQ0ZHPSJSZWFkZXJWQyAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJSZWFkZXJWQyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJSZWFkZXJWQyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitNVEw9bWlkbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiUmVhZGVyVkMgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgNg0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgNg0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfQUZYRExMIiAvWXUic3RkYWZ4LmgiIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9BRlhETEwiIC9EICJfTUJDUyIgL0QgIkZQREZTREtfRVhQT1JUUyIgL0ZSIC9ZdSJzdGRhZnguaCIgL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA0IC9kICJOREVCVUciIC9kICJfQUZYRExMIg0KKyMgQUREIFJTQyAvbCAweDgwNCAvZCAiTkRFQlVHIiAvZCAiX0FGWERMTCINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYgL291dDoiLi4vLi4vbGliL3JlbF93MzJfdmM2L1JlYWRlclZDLmV4ZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiUmVhZGVyVkMgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDYNCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgNg0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9BRlhETEwiIC9ZdSJzdGRhZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9BRlhETEwiIC9EICJfTUJDUyIgL0QgIkZQREZTREtfRVhQT1JUUyIgL0ZSIC9ZdSJzdGRhZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDgwNCAvZCAiX0RFQlVHIiAvZCAiX0FGWERMTCINCisjIEFERCBSU0MgL2wgMHg4MDQgL2QgIl9ERUJVRyIgL2QgIl9BRlhETEwiDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBNc2ltZzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uLy4uL2xpYi9kYmdfdzMyX3ZjNi9SZWFkZXJWQy5leGUiIC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIlJlYWRlclZDIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIlJlYWRlclZDIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQm9va01hcmtWaWV3LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENoaWxkRnJtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENvbnZlcnREbGcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRXhwb3J0UGFnZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxGaW5kRGxnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZYX1NwbGl0dGVyV25kLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEdvdG9QYWdlRGxnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEpTX1Jlc3BvbnNlRGxnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXE1haW5Gcm0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmVhZGVyVkMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmVhZGVyVkMucmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSZWFkZXJWQ0RvYy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSZWFkZXJWQ1ZpZXcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU3RkQWZ4LmNwcA0KKyMgQUREIENQUCAvWWMic3RkYWZ4LmgiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVGVzdEpzRGxnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFpvb21EbGcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEJvb2tNYXJrVmlldy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQ2hpbGRGcm0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENvbnZlcnREbGcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEV4cG9ydFBhZ2UuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZpbmREbGcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEZYX1NwbGl0dGVyV25kLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxHb3RvUGFnZURsZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSlNfUmVzcG9uc2VEbGcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXE1haW5Gcm0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFJlYWRlclZDLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSZWFkZXJWQ0RvYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmVhZGVyVkNWaWV3LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxSZXNvdXJjZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU3RkQWZ4LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxUZXN0SnNEbGcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFpvb21EbGcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXEJpZ0hhbmRDdXJzb3IuY3VyDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXGJpdG1hcDEuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXGJpdG1hcDEyLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xiaXRtYXAxOS5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcYml0bWFwMi5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcYml0bWFwMjAuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXGJpdG1hcDIxLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xiaXRtYXAyMi5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcYml0bWFwMjMuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXGJpdG1hcDI2LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xib29rbWFyay5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcYm91bmQuY3VyDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXGZvcm1PcHRpb25zLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xwb2ludC5jdXINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcUmRfU2VsVGV4dF9JY29uLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xSZF9TZWxUZXh0X0ljb25fRGlzLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xSZWFkZXJWQy5pY28NCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcUmVhZGVyVkMucmMyDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXFJlYWRlclZDRG9jLmljbw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1xTbWFsbEhhbmRDdXJzb3IuY3VyDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfYWN0dWFsX3NpemUuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfYm9va21hcmsxLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2Nsb2Nrd2lzZS5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9jb3VudGVyY2xvY2t3aXNlLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2ZpcnN0LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2ZpdF9wYWdlLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2ZpdF93aWR0aC5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9oYW5kMS5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3RfYWJvdXQyLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2hvdF9hY3R1YWxfc2l6ZS5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3RfYm9va21hcmsxLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2hvdF9jbG9ja3dpc2UuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfaG90X2NvdW50ZXJjbG9ja3dpc2UuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfaG90X2ZpcnN0LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2hvdF9maXRfcGFnZS5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3RfZml0X3dpZHRoLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2hvdF9oYW5kMS5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3RfbGFzdC5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3RfbmV4dC5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3Rfb3BlbjEuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfaG90X3ByZXYuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfaG90X3ByaW50LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2hvdF9zZWFyY2guYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfaG90X3NuYXBfc2hvdC5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9ob3Rfem9vbWluLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2hvdF96b29tb3V0LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX2xhc3QuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfbmV4dC5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9wcmV2LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX3ByaW50LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX3NlYXJjaC5ibXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNcdG9vbF9zbmFwX3Nob3QuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHRvb2xfem9vbWluLmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc1x0b29sX3pvb21vdXQuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXFRvb2xiYXIuYm1wDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzXHVua25vd25jb2xvcl9ncmF5LmJtcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUmVhZE1lLnR4dA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQy5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiY2M0MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIFJlYWRlclZDLmggOiBtYWluIGhlYWRlciBmaWxlIGZvciB0aGUgUkVBREVSVkMgYXBwbGljYXRpb24NCisvLw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfUkVBREVSVkNfSF9fNzg3M0ExNUZfQTYwRl80QzA1XzlEQzZfQzM5MTRDMjI0RUFBX19JTkNMVURFRF8pDQorI2RlZmluZSBBRlhfUkVBREVSVkNfSF9fNzg3M0ExNUZfQTYwRl80QzA1XzlEQzZfQzM5MTRDMjI0RUFBX19JTkNMVURFRF8NCisNCisjaWYgX01TQ19WRVIgPiAxMDAwDQorI3ByYWdtYSBvbmNlDQorI2VuZGlmIC8vIF9NU0NfVkVSID4gMTAwMA0KKw0KKyNpZm5kZWYgX19BRlhXSU5fSF9fDQorCSNlcnJvciBpbmNsdWRlICdzdGRhZnguaCcgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgZm9yIFBDSA0KKyNlbmRpZg0KKw0KK2NsYXNzIENSZWFkZXJWQ1ZpZXc7DQorDQorI2luY2x1ZGUgInJlc291cmNlLmgiICAgICAgIC8vIG1haW4gc3ltYm9scw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ1JlYWRlclZDQXBwOg0KKy8vIFNlZSBSZWFkZXJWQy5jcHAgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzDQorLy8NCisNCitjbGFzcyBDUmVhZGVyVkNBcHAgOiBwdWJsaWMgQ1dpbkFwcA0KK3sNCitwdWJsaWM6DQorCUNSZWFkZXJWQ0FwcCgpOw0KKwl+Q1JlYWRlclZDQXBwKCk7DQorCUNSZWFkZXJWQ1ZpZXcgKiBtX3BBY3RpdmVWaWV3Ow0KKw0KKy8vIE92ZXJyaWRlcw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENSZWFkZXJWQ0FwcCkNCisJcHVibGljOg0KKwl2aXJ0dWFsIEJPT0wgSW5pdEluc3RhbmNlKCk7DQorCXZpcnR1YWwgaW50IEV4aXRJbnN0YW5jZSgpOw0KKwkvL319QUZYX1ZJUlRVQUwNCisNCisvLyBJbXBsZW1lbnRhdGlvbg0KKwkvL3t7QUZYX01TRyhDUmVhZGVyVkNBcHApDQorCWFmeF9tc2cgdm9pZCBPbkFwcEFib3V0KCk7DQorCQkvLyBOT1RFIC0gdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIGFuZCByZW1vdmUgbWVtYmVyIGZ1bmN0aW9ucyBoZXJlLg0KKwkJLy8gICAgRE8gTk9UIEVESVQgd2hhdCB5b3Ugc2VlIGluIHRoZXNlIGJsb2NrcyBvZiBnZW5lcmF0ZWQgY29kZSAhDQorCS8vfX1BRlhfTVNHDQorCURFQ0xBUkVfTUVTU0FHRV9NQVAoKQ0KK307DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfUkVBREVSVkNfSF9fNzg3M0ExNUZfQTYwRl80QzA1XzlEQzZfQzM5MTRDMjI0RUFBX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDLnJjIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjQ3YWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvUmVhZGVyVkMucmMKQEAgLTAsMCArMSw3NDEgQEAKKy8vTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIHJlc291cmNlIHNjcmlwdC4NCisvLw0KKyNpbmNsdWRlICJyZXNvdXJjZS5oIg0KKw0KKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMiByZXNvdXJjZS4NCisvLw0KKyNpbmNsdWRlICJhZnhyZXMuaCINCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDaGluZXNlIChQLlIuQy4pIHJlc291cmNlcw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0NIUykNCisjaWZkZWYgX1dJTjMyDQorTEFOR1VBR0UgTEFOR19DSElORVNFLCBTVUJMQU5HX0NISU5FU0VfU0lNUExJRklFRA0KKyNwcmFnbWEgY29kZV9wYWdlKDkzNikNCisjZW5kaWYgLy9fV0lOMzINCisNCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBURVhUSU5DTFVERQ0KKy8vDQorDQorMSBURVhUSU5DTFVERSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICAicmVzb3VyY2UuaFwwIg0KK0VORA0KKw0KKzIgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgIiNpbmNsdWRlICIiYWZ4cmVzLmgiIlxyXG4iDQorICAgICJcMCINCitFTkQNCisNCiszIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgICIjZGVmaW5lIF9BRlhfTk9fU1BMSVRURVJfUkVTT1VSQ0VTXHJcbiINCisgICAgIiNkZWZpbmUgX0FGWF9OT19PTEVfUkVTT1VSQ0VTXHJcbiINCisgICAgIiNkZWZpbmUgX0FGWF9OT19UUkFDS0VSX1JFU09VUkNFU1xyXG4iDQorICAgICIjZGVmaW5lIF9BRlhfTk9fUFJPUEVSVFlfUkVTT1VSQ0VTXHJcbiINCisgICAgIlxyXG4iDQorICAgICIjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19DSFMpXHJcbiINCisgICAgIiNpZmRlZiBfV0lOMzJcclxuIg0KKyAgICAiTEFOR1VBR0UgNCwgMlxyXG4iDQorICAgICIjcHJhZ21hIGNvZGVfcGFnZSg5MzYpXHJcbiINCisgICAgIiNlbmRpZiAvL19XSU4zMlxyXG4iDQorICAgICIjaW5jbHVkZSAiInJlc1xcUmVhZGVyVkMucmMyIiIgIC8vIG5vbi1NaWNyb3NvZnQgVmlzdWFsIEMrKyBlZGl0ZWQgcmVzb3VyY2VzXHJcbiINCisgICAgIiNpbmNsdWRlICIibC5jaHNcXGFmeHJlcy5yYyIiICAgICAgICAgIC8vIFN0YW5kYXJkIGNvbXBvbmVudHNcclxuIg0KKyAgICAiI2luY2x1ZGUgIiJsLmNoc1xcYWZ4cHJpbnQucmMiIiAgICAgICAgLy8gcHJpbnRpbmcvcHJpbnQgcHJldmlldyByZXNvdXJjZXNcclxuIg0KKyAgICAiI2VuZGlmXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VEDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEljb24NCisvLw0KKw0KKy8vIEljb24gd2l0aCBsb3dlc3QgSUQgdmFsdWUgcGxhY2VkIGZpcnN0IHRvIGVuc3VyZSBhcHBsaWNhdGlvbiBpY29uDQorLy8gcmVtYWlucyBjb25zaXN0ZW50IG9uIGFsbCBzeXN0ZW1zLg0KK0lEUl9NQUlORlJBTUUgICAgICAgICAgIElDT04gICAgRElTQ0FSREFCTEUgICAgICJyZXNcXFJlYWRlclZDLmljbyINCitJRFJfUkVBREVSVFlQRSAgICAgICAgICBJQ09OICAgIERJU0NBUkRBQkxFICAgICAicmVzXFxSZWFkZXJWQ0RvYy5pY28iDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEJpdG1hcA0KKy8vDQorDQorSURSX01BSU5GUkFNRSAgICAgICAgICAgQklUTUFQICBNT1ZFQUJMRSBQVVJFICAgInJlc1xcVG9vbGJhci5ibXAiDQorSURCX0JJVE1BUDEgICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9jb3VudGVyY2xvY2t3aXNlLmJtcCINCitJREJfQklUTUFQMiAgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFxSZF9TZWxUZXh0X0ljb24uYm1wIg0KK0lEQl9CSVRNQVAzICAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXFJkX1NlbFRleHRfSWNvbl9EaXMuYm1wIg0KK0lEQl9CSVRNQVA0ICAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfYWN0dWFsX3NpemUuYm1wIg0KK0lEQl9CSVRNQVA1ICAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfYm9va21hcmsxLmJtcCINCitJREJfQklUTUFQNiAgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2Nsb2Nrd2lzZS5ibXAiDQorSURCX0JJVE1BUDcgICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3RfYm9va21hcmsxLmJtcCINCitJREJfQklUTUFQOCAgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2ZpcnN0LmJtcCINCitJREJfQklUTUFQOSAgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2ZpdF9wYWdlLmJtcCINCitJREJfQklUTUFQMTAgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2ZpdF93aWR0aC5ibXAiDQorSURCX0JJVE1BUDExICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9oYW5kMS5ibXAiDQorSURCX0JJVE1BUDEyICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3RfYWJvdXQyLmJtcCINCitJREJfQklUTUFQMTMgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2hvdF9hY3R1YWxfc2l6ZS5ibXAiDQorSURCX0JJVE1BUDE0ICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3Rfem9vbWluLmJtcCINCitJREJfQklUTUFQMTUgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2hvdF9jbG9ja3dpc2UuYm1wIg0KK0lEQl9CSVRNQVAxNiAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfaG90X2NvdW50ZXJjbG9ja3dpc2UuYm1wIg0KK0lEQl9CSVRNQVAxNyAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfaG90X2ZpcnN0LmJtcCINCitJREJfQklUTUFQMTggICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2hvdF9maXRfcGFnZS5ibXAiDQorSURCX0JJVE1BUDE5ICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3RfZml0X3dpZHRoLmJtcCINCitJREJfQklUTUFQMjAgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2hvdF9oYW5kMS5ibXAiDQorSURCX0JJVE1BUDIxICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3RfbGFzdC5ibXAiDQorSURCX0JJVE1BUDIyICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3RfbmV4dC5ibXAiDQorSURCX0JJVE1BUDIzICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3Rfb3BlbjEuYm1wIg0KK0lEQl9CSVRNQVAyNCAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfaG90X3ByZXYuYm1wIg0KK0lEQl9CSVRNQVAyNiAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfaG90X3pvb21vdXQuYm1wIg0KK0lEQl9CSVRNQVAyNyAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfbGFzdC5ibXAiDQorSURCX0JJVE1BUDI4ICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9uZXh0LmJtcCINCitJREJfQklUTUFQMjkgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX3ByZXYuYm1wIg0KK0lEQl9CSVRNQVAzMCAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfcHJpbnQuYm1wIg0KK0lEQl9CSVRNQVAzMSAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfc2VhcmNoLmJtcCINCitJREJfQklUTUFQMzIgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX3NuYXBfc2hvdC5ibXAiDQorSURCX0JJVE1BUDMzICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF96b29taW4uYm1wIg0KK0lEQl9CSVRNQVAzNCAgICAgICAgICAgIEJJVE1BUCAgRElTQ0FSREFCTEUgICAgICJyZXNcXHRvb2xfem9vbW91dC5ibXAiDQorSURCX0JJVE1BUDI1ICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3Rfc25hcF9zaG90LmJtcCINCitJREJfQklUTUFQMzUgICAgICAgICAgICBCSVRNQVAgIERJU0NBUkRBQkxFICAgICAicmVzXFx0b29sX2hvdF9wcmludC5ibXAiDQorSURCX0JJVE1BUDM2ICAgICAgICAgICAgQklUTUFQICBESVNDQVJEQUJMRSAgICAgInJlc1xcdG9vbF9ob3Rfc2VhcmNoLmJtcCINCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gVG9vbGJhcg0KKy8vDQorDQorSURSX01BSU5GUkFNRSBUT09MQkFSIERJU0NBUkRBQkxFICAyNCwgMjQNCitCRUdJTg0KKyAgICBCVVRUT04gICAgICBJRF9GSUxFX09QRU4NCisgICAgU0VQQVJBVE9SDQorICAgIEJVVFRPTiAgICAgIElEX0ZJTEVfUFJJTlQNCisgICAgU0VQQVJBVE9SDQorICAgIEJVVFRPTiAgICAgIElEX0RPQ19GSVJTVFBBR0UNCisgICAgQlVUVE9OICAgICAgSURfRE9DX1BSRVBBR0UNCisgICAgQlVUVE9OICAgICAgSURfRE9DX05FWFRQQUdFDQorICAgIEJVVFRPTiAgICAgIElEX0RPQ19MQVNUUEFHRQ0KKyAgICBTRVBBUkFUT1INCisgICAgQlVUVE9OICAgICAgSURfVklFV19DT1VOVEVSQ0xPQ0tXSVNFDQorICAgIEJVVFRPTiAgICAgIElEX1ZJRVdfQ0xPQ0tXSVNFDQorICAgIFNFUEFSQVRPUg0KKyAgICBCVVRUT04gICAgICBJRF9WSUVXX1pPT01JTg0KKyAgICBCVVRUT04gICAgICBJRF9WSUVXX1pPT01PVVQNCisgICAgU0VQQVJBVE9SDQorICAgIEJVVFRPTiAgICAgIElEX1ZJRVdfQUNUVUFMU0laRQ0KKyAgICBCVVRUT04gICAgICBJRF9WSUVXX0ZJVFBBR0UNCisgICAgQlVUVE9OICAgICAgSURfVklFV19GSVRXSURUSA0KKyAgICBTRVBBUkFUT1INCisgICAgQlVUVE9OICAgICAgSURfRURJVF9GSU5EDQorICAgIFNFUEFSQVRPUg0KKyAgICBCVVRUT04gICAgICBJRF9WSUVXX0JPT0tNQVJLDQorICAgIFNFUEFSQVRPUg0KKyAgICBCVVRUT04gICAgICBJRF9UT09MX1NOQVBTSE9UDQorICAgIEJVVFRPTiAgICAgIElEX1RPT0xfU0VMRUNUDQorICAgIEJVVFRPTiAgICAgIElEX1RPT0xfSEFORA0KKyAgICBCVVRUT04gICAgICBJRF9BUFBfQUJPVVQNCitFTkQNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gQWNjZWxlcmF0b3INCisvLw0KKw0KK0lEUl9NQUlORlJBTUUgQUNDRUxFUkFUT1JTIFBSRUxPQUQgTU9WRUFCTEUgUFVSRSANCitCRUdJTg0KKyAgICAiKyIsICAgICAgICAgICAgSURfVklFV19aT09NSU4sICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIi0iLCAgICAgICAgICAgIElEX1ZJRVdfWk9PTU9VVCwgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQorICAgICIxIiwgICAgICAgICAgICBJRF9WSUVXX0FDVFVBTFNJWkUsICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KKyAgICAiMiIsICAgICAgICAgICAgSURfVklFV19GSVRQQUdFLCAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIjMiLCAgICAgICAgICAgIElEX1ZJRVdfRklUV0lEVEgsICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQorICAgICJDIiwgICAgICAgICAgICBJRF9FRElUX0NPUFksICAgICAgICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KKyAgICAiRiIsICAgICAgICAgICAgSURfRURJVF9GSU5ELCAgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIk0iLCAgICAgICAgICAgIElEX1ZJRVdfWk9PTVRPLCAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQorICAgICJOIiwgICAgICAgICAgICBJRF9GSUxFX05FVywgICAgICAgICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KKyAgICAiTiIsICAgICAgICAgICAgSURfRE9DX0dPVE9QQUdFLCAgICAgICAgVklSVEtFWSwgU0hJRlQsIENPTlRST0wsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT0lOVkVSVA0KKyAgICAiTyIsICAgICAgICAgICAgSURfRklMRV9PUEVOLCAgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIlAiLCAgICAgICAgICAgIElEX0ZJTEVfUFJJTlQsICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQorICAgICJTIiwgICAgICAgICAgICBJRF9GSUxFX1NBVkUsICAgICAgICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KKyAgICAiViIsICAgICAgICAgICAgSURfRURJVF9QQVNURSwgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgVktfQkFDSywgICAgICAgIElEX0VESVRfVU5ETywgICAgICAgICAgIFZJUlRLRVksIEFMVCwgTk9JTlZFUlQNCisgICAgVktfREVMRVRFLCAgICAgIElEX0VESVRfQ1VULCAgICAgICAgICAgIFZJUlRLRVksIFNISUZULCBOT0lOVkVSVA0KKyAgICBWS19GNiwgICAgICAgICAgSURfTkVYVF9QQU5FLCAgICAgICAgICAgVklSVEtFWSwgTk9JTlZFUlQNCisgICAgVktfRjYsICAgICAgICAgIElEX1BSRVZfUEFORSwgICAgICAgICAgIFZJUlRLRVksIFNISUZULCBOT0lOVkVSVA0KKyAgICBWS19JTlNFUlQsICAgICAgSURfRURJVF9DT1BZLCAgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgVktfSU5TRVJULCAgICAgIElEX0VESVRfUEFTVEUsICAgICAgICAgIFZJUlRLRVksIFNISUZULCBOT0lOVkVSVA0KKyAgICAiWCIsICAgICAgICAgICAgSURfRURJVF9DVVQsICAgICAgICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCisgICAgIloiLCAgICAgICAgICAgIElEX0VESVRfVU5ETywgICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQorRU5EDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIERpYWxvZw0KKy8vDQorDQorSUREX0FCT1VUQk9YIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjM1LCA1NQ0KK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VDQorQ0FQVElPTiAiQWJvdXQgUmVhZGVyVkMiDQorRk9OVCA5LCAiy87M5SINCitCRUdJTg0KKyAgICBJQ09OICAgICAgICAgICAgSURSX01BSU5GUkFNRSxJRENfU1RBVElDLDExLDE3LDIwLDIwDQorICAgIExURVhUICAgICAgICAgICAiRm94aXQgU0RLIERlbW8gMS4wIHZlcnNpb24iLElEQ19TVEFUSUMsNDAsMTAsMTI2LDgsDQorICAgICAgICAgICAgICAgICAgICBTU19OT1BSRUZJWA0KKyAgICBMVEVYVCAgICAgICAgICAgIkFsbCByaWdodHMgUmVzZXJ2ZWQiLElEQ19TVEFUSUMsNDAsMjUsMTE5LDgNCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywxNzgsNyw1MCwxNCxXU19HUk9VUA0KK0VORA0KKw0KK0lERF9ETEdfR09UT1BBR0UgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxMzMsIDI5DQorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUNCitDQVBUSU9OICJHb3RvIFBhZ2UiDQorRk9OVCAxMCwgIk1TIFNhbnMgU2VyaWYiDQorQkVHSU4NCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSyw5MSw3LDM1LDE0DQorICAgIExURVhUICAgICAgICAgICAiR290byIsSURDX1NUQVRJQyw4LDksMTYsOQ0KKyAgICBFRElUVEVYVCAgICAgICAgSURDX0VESVQxLDI1LDcsNjQsMTQsRVNfQVVUT0hTQ1JPTEwNCitFTkQNCisNCitJRERfRExHX1pPT01UTyBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDE0MSwgNDUNCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQ0KK0NBUFRJT04gIlpvb20gVG8iDQorRk9OVCAxMCwgIk1TIFNhbnMgU2VyaWYiDQorQkVHSU4NCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywzOCwyNCwyOSwxNA0KKyAgICBMVEVYVCAgICAgICAgICAgIlpvb20gdG8iLElEQ19TVEFUSUMsNyw5LDMwLDgNCisgICAgREVGUFVTSEJVVFRPTiAgICJDYW5jZWwiLElEQ0FOQ0VMLDc1LDI0LDI5LDE0DQorICAgIENPTUJPQk9YICAgICAgICBJRENfQ09NQk8xLDM3LDcsNzgsMTMyLENCU19EUk9QRE9XTiB8IFdTX1ZTQ1JPTEwgfCANCisgICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1ANCitFTkQNCisNCitJRERfRExHX0ZJTkQgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAyMjIsIDcwDQorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUNCitDQVBUSU9OICJGaW5kIFRleHQiDQorRk9OVCAxMCwgIk1TIFNhbnMgU2VyaWYiDQorQkVHSU4NCisgICAgREVGUFVTSEJVVFRPTiAgICImRmluZCBOZXh0IixJRE9LLDE3NCw3LDQxLDEzDQorICAgIFBVU0hCVVRUT04gICAgICAiJkNhbmNlbCIsSURDQU5DRUwsMTc1LDI0LDQwLDEzDQorICAgIExURVhUICAgICAgICAgICAiJkZpbmQgV2hhdCIsSURDX1NUQVRJQyw3LDEwLDM4LDEwDQorICAgIEVESVRURVhUICAgICAgICBJRENfRURJVDEsNDYsNywxMjQsMTYsRVNfQVVUT0hTQ1JPTEwNCisgICAgQ09OVFJPTCAgICAgICAgICJNYXRjaCAmQ2FzZSIsSURDX0NIRUNLX01BVENIQ0FTRSwiQnV0dG9uIiwNCisgICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AsNywzMCw5MCwxMQ0KKyAgICBDT05UUk9MICAgICAgICAgIk1hdGNoICZXaG9sZSB3b3JkIG9ubHkiLElEQ19DSEVDS19NQVRDSFdIT0xFLCJCdXR0b24iLA0KKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUCw3LDQ4LDk3LDEwDQorICAgIEdST1VQQk9YICAgICAgICAiRGlyZWN0aW9uIixJRENfU1RBVElDLDEwNCwyOCw2OCwzMg0KKyAgICBDT05UUk9MICAgICAgICAgIkRvd24iLElEQ19SQURJT19Eb3duLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8IA0KKyAgICAgICAgICAgICAgICAgICAgV1NfR1JPVVAsMTA5LDQyLDI5LDEwDQorICAgIENPTlRST0wgICAgICAgICAiVXAiLElEQ19SQURJT19VUCwiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04sMTQ2LDQyLDE5LA0KKyAgICAgICAgICAgICAgICAgICAgMTANCitFTkQNCisNCitJRERfRExHX0NPTlZFUlQgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxMjgsIDc0DQorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUNCitDQVBUSU9OICJDb252ZXJ0IG1vZGUiDQorRk9OVCAxMCwgIlN5c3RlbSINCitCRUdJTg0KKyAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDE3LDU1LDQyLDEyDQorICAgIFBVU0hCVVRUT04gICAgICAiQ2FuY2VsIixJRENBTkNFTCw2OSw1NSw0MiwxMg0KKyAgICBHUk9VUEJPWCAgICAgICAgIkZsYWdzIGZvciBDb252ZXJ0VGV4dCIsSURDX1NUQVRJQywxNiw3LDk1LDQ2DQorICAgIENPTlRST0wgICAgICAgICAiU3RyZWFtIG9yZGVyIixJRENfUkFESU9fU3RyZWFtLCJCdXR0b24iLA0KKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfR1JPVVAsMzAsMjAsNjksOA0KKyAgICBDT05UUk9MICAgICAgICAgIkFwcGVhcmFuY2Ugb3JkZXIiLElEQ19SQURJT19BcHBlYXJhbmNlLCJCdXR0b24iLA0KKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OLDMwLDMxLDY5LDgNCitFTkQNCisNCitJRERfRVhQT1JUX1BBR0UgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAyMzAsIDIyOQ0KK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VDQorQ0FQVElPTiAiRXhwb3J0IFBhZ2UiDQorRk9OVCAxMCwgIlN5c3RlbSINCitCRUdJTg0KKyAgICBMVEVYVCAgICAgICAgICAgIldpZHRoIixJRENfU1RBVElDLDIyLDE2LDIwLDgNCisgICAgTFRFWFQgICAgICAgICAgICJIZWlnaHQiLElEQ19TVEFUSUMsMjEsMzcsMjIsOA0KKyAgICBMVEVYVCAgICAgICAgICAgIlJvdGF0ZSIsSURDX1NUQVRJQywyMSw2MSwyMiw4DQorICAgIExURVhUICAgICAgICAgICAiQml0bWFwIFdpZHRoIixJRENfU1RBVElDLDEwMiwxNCw0NSw4DQorICAgIExURVhUICAgICAgICAgICAiQml0bWFwIEhlaWdodCIsSURDX1NUQVRJQyw5OSwzNSw0Nyw4DQorICAgIFBVU0hCVVRUT04gICAgICAiUmFuZGVyIFBhZ2UgIixJRENfUmFuZGVyX1BhZ2UsMTAyLDU4LDUwLDE0DQorICAgIFBVU0hCVVRUT04gICAgICAiU2F2ZSBBcy4uLiIsSURDX1NhdmUsMTU4LDU4LDUwLDE0DQorICAgIEVESVRURVhUICAgICAgICBJRENfRURJVF9QQUdFX1dJRFRILDQ1LDE0LDQwLDE0LEVTX0FVVE9IU0NST0xMDQorICAgIEVESVRURVhUICAgICAgICBJRENfRURJVF9QQUdFX0hFSUdIVCw0NSwzNSw0MCwxNCxFU19BVVRPSFNDUk9MTA0KKyAgICBFRElUVEVYVCAgICAgICAgSURDX0VESVRfUk9UQVRFLDQ1LDU5LDQwLDE0LEVTX0FVVE9IU0NST0xMDQorICAgIEVESVRURVhUICAgICAgICBJRENfRURJVF9XSURUSCwxNDksMTMsNDAsMTQsRVNfQVVUT0hTQ1JPTEwNCisgICAgRURJVFRFWFQgICAgICAgIElEQ19FRElUX0hFSUdIVCwxNDgsMzMsNDAsMTQsRVNfQVVUT0hTQ1JPTEwNCisgICAgQ09OVFJPTCAgICAgICAgICIiLElEQ19TVEFUSUNfQklUTUFQLCJTdGF0aWMiLFNTX0JMQUNLRlJBTUUsMTgsODcsMTk2LA0KKyAgICAgICAgICAgICAgICAgICAgMTI3DQorRU5EDQorDQorSUREX0RMR19SRVNQT05TRSBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI0MSwgNjYNCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQ0KK0NBUFRJT04gIkRpYWxvZyINCitGT05UIDgsICJTeXN0ZW0iDQorQkVHSU4NCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURfSlNfT0ssMTE2LDQ1LDUwLDE0DQorICAgIFBVU0hCVVRUT04gICAgICAiQ2FuY2VsIixJRF9KU19DQU5DRUwsMTg0LDQ1LDUwLDE0DQorICAgIExURVhUICAgICAgICAgICAiIixJRENfSlNfUVVFU1RJT04sNyw3LDIyNywxMg0KKyAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX0pTX0FOU1dFUiw3LDI2LDI3LDEyDQorRU5EDQorDQorSUREX1RFU1RfSlMgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxODcsIDk2DQorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUNCitDQVBUSU9OICJEaWFsb2ciDQorRk9OVCAxMCwgIlN5c3RlbSINCitCRUdJTg0KKyAgICBFRElUVEVYVCAgICAgICAgSURDX0VESVQxLDcsMTgsMTczLDMzLEVTX01VTFRJTElORSB8IEVTX0FVVE9IU0NST0xMDQorICAgIFBVU0hCVVRUT04gICAgICAiUnVuIEpTIixJRENfQlVUVE9OMSwxMzAsNjgsNTAsMTQNCitFTkQNCisNCisNCisjaWZuZGVmIF9NQUMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gVmVyc2lvbg0KKy8vDQorDQorVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPDQorIEZJTEVWRVJTSU9OIDEsMCwwLDENCisgUFJPRFVDVFZFUlNJT04gMSwwLDAsMQ0KKyBGSUxFRkxBR1NNQVNLIDB4M2ZMDQorI2lmZGVmIF9ERUJVRw0KKyBGSUxFRkxBR1MgMHgxTA0KKyNlbHNlDQorIEZJTEVGTEFHUyAweDBMDQorI2VuZGlmDQorIEZJTEVPUyAweDRMDQorIEZJTEVUWVBFIDB4MUwNCisgRklMRVNVQlRZUEUgMHgwTA0KK0JFR0lODQorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIEJMT0NLICIwODA0MDRiMCINCisgICAgICAgIEJFR0lODQorICAgICAgICAgICAgVkFMVUUgIkNvbW1lbnRzIiwgIlwwIg0KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJcMCINCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIlJlYWRlclZDIE1pY3Jvc29mdCC7+bShwODTptPDs8zQ8lwwIg0KKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLCAwLCAwLCAxXDAiDQorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJSZWFkZXJWQ1wwIg0KKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICKw5sioy/nT0CAoQykgMjAwN1wwIg0KKyAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiDQorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiUmVhZGVyVkMuRVhFXDAiDQorICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsICJcMCINCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiUmVhZGVyVkMg06bTw7PM0PJcMCINCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMSwgMCwgMCwgMVwwIg0KKyAgICAgICAgICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCAiXDAiDQorICAgICAgICBFTkQNCisgICAgRU5EDQorICAgIEJMT0NLICJWYXJGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4ODA0LCAxMjAwDQorICAgIEVORA0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyAhX01BQw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBERVNJR05JTkZPDQorLy8NCisNCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KK0dVSURFTElORVMgREVTSUdOSU5GTyBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBJRERfQUJPVVRCT1gsIERJQUxPRw0KKyAgICBCRUdJTg0KKyAgICAgICAgTEVGVE1BUkdJTiwgNw0KKyAgICAgICAgUklHSFRNQVJHSU4sIDIyOA0KKyAgICAgICAgVE9QTUFSR0lOLCA3DQorICAgICAgICBCT1RUT01NQVJHSU4sIDQ4DQorICAgIEVORA0KKw0KKyAgICBJRERfRExHX0dPVE9QQUdFLCBESUFMT0cNCisgICAgQkVHSU4NCisgICAgICAgIExFRlRNQVJHSU4sIDcNCisgICAgICAgIFJJR0hUTUFSR0lOLCAxMjYNCisgICAgICAgIFRPUE1BUkdJTiwgNw0KKyAgICAgICAgQk9UVE9NTUFSR0lOLCAyMg0KKyAgICBFTkQNCisNCisgICAgSUREX0RMR19aT09NVE8sIERJQUxPRw0KKyAgICBCRUdJTg0KKyAgICAgICAgTEVGVE1BUkdJTiwgNw0KKyAgICAgICAgUklHSFRNQVJHSU4sIDEzNA0KKyAgICAgICAgVE9QTUFSR0lOLCA3DQorICAgICAgICBCT1RUT01NQVJHSU4sIDM4DQorICAgIEVORA0KKw0KKyAgICBJRERfRExHX0ZJTkQsIERJQUxPRw0KKyAgICBCRUdJTg0KKyAgICAgICAgTEVGVE1BUkdJTiwgNw0KKyAgICAgICAgUklHSFRNQVJHSU4sIDIxNQ0KKyAgICAgICAgVE9QTUFSR0lOLCA3DQorICAgICAgICBCT1RUT01NQVJHSU4sIDYzDQorICAgIEVORA0KKw0KKyAgICBJRERfRExHX0NPTlZFUlQsIERJQUxPRw0KKyAgICBCRUdJTg0KKyAgICAgICAgTEVGVE1BUkdJTiwgNw0KKyAgICAgICAgUklHSFRNQVJHSU4sIDEyMQ0KKyAgICAgICAgVE9QTUFSR0lOLCA3DQorICAgICAgICBCT1RUT01NQVJHSU4sIDY3DQorICAgIEVORA0KKw0KKyAgICBJRERfRVhQT1JUX1BBR0UsIERJQUxPRw0KKyAgICBCRUdJTg0KKyAgICAgICAgTEVGVE1BUkdJTiwgNw0KKyAgICAgICAgUklHSFRNQVJHSU4sIDIyMw0KKyAgICAgICAgVE9QTUFSR0lOLCA3DQorICAgICAgICBCT1RUT01NQVJHSU4sIDIyMg0KKyAgICBFTkQNCisNCisgICAgSUREX0RMR19SRVNQT05TRSwgRElBTE9HDQorICAgIEJFR0lODQorICAgICAgICBMRUZUTUFSR0lOLCA3DQorICAgICAgICBSSUdIVE1BUkdJTiwgMjM0DQorICAgICAgICBUT1BNQVJHSU4sIDcNCisgICAgICAgIEJPVFRPTU1BUkdJTiwgNTkNCisgICAgRU5EDQorDQorICAgIElERF9URVNUX0pTLCBESUFMT0cNCisgICAgQkVHSU4NCisgICAgICAgIExFRlRNQVJHSU4sIDcNCisgICAgICAgIFJJR0hUTUFSR0lOLCAxODANCisgICAgICAgIFRPUE1BUkdJTiwgNw0KKyAgICAgICAgQk9UVE9NTUFSR0lOLCA4OQ0KKyAgICBFTkQNCitFTkQNCisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBDdXJzb3INCisvLw0KKw0KK0lEQ19DVVJTT1IxICAgICAgICAgICAgIENVUlNPUiAgRElTQ0FSREFCTEUgICAgICJyZXNcXFNtYWxsSGFuZEN1cnNvci5jdXIiDQorSURDX0NVUlNPUjIgICAgICAgICAgICAgQ1VSU09SICBESVNDQVJEQUJMRSAgICAgInJlc1xcQmlnSGFuZEN1cnNvci5jdXIiDQorSURDX0NVUlNPUjMgICAgICAgICAgICAgQ1VSU09SICBESVNDQVJEQUJMRSAgICAgInJlc1xcYm91bmQuY3VyIg0KK0lEQ19DVVJTT1I0ICAgICAgICAgICAgIENVUlNPUiAgRElTQ0FSREFCTEUgICAgICJyZXNcXHBvaW50LmN1ciINCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gU3RyaW5nIFRhYmxlDQorLy8NCisNCitTVFJJTkdUQUJMRSBQUkVMT0FEIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgIElEUl9NQUlORlJBTUUgICAgICAgICAgICJSZWFkZXJWQyINCisgICAgSURSX1JFQURFUlRZUEUgICAgICAgICAgIlxuUmVhZGVyXG5SZWFkZXJcblxuXG5SZWFkZXJWQy5Eb2N1bWVudFxuUmVhZGVyIERvY3VtZW50Ig0KK0VORA0KKw0KK1NUUklOR1RBQkxFIFBSRUxPQUQgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgQUZYX0lEU19BUFBfVElUTEUgICAgICAgIlJlYWRlclZDIg0KKyAgICBBRlhfSURTX0lETEVNRVNTQUdFICAgICAivs3Q9yINCitFTkQNCisNCitTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBJRF9JTkRJQ0FUT1JfRVhUICAgICAgICAiwKnVucP7Ig0KKyAgICBJRF9JTkRJQ0FUT1JfQ0FQUyAgICAgICAitPPQtCINCisgICAgSURfSU5ESUNBVE9SX05VTSAgICAgICAgIsr919YiDQorICAgIElEX0lORElDQVRPUl9TQ1JMICAgICAgICK59ravIg0KKyAgICBJRF9JTkRJQ0FUT1JfT1ZSICAgICAgICAiuMTQtCINCisgICAgSURfSU5ESUNBVE9SX1JFQyAgICAgICAgIrzHwrwiDQorRU5EDQorDQorU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgSURfRklMRV9ORVcgICAgICAgICAgICAgIr2owaLQws7EtbVcbtDCvagiDQorICAgIElEX0ZJTEVfT1BFTiAgICAgICAgICAgICK08r+q0ru49s/W09DOxLW1XG608r+qIg0KKyAgICBJRF9GSUxFX0NMT1NFICAgICAgICAgICAiudix1bvutq/OxLW1XG652LHVIg0KKyAgICBJRF9GSUxFX1NBVkUgICAgICAgICAgICAisaO05rvutq/OxLW1XG6xo7TmIg0KKyAgICBJRF9GSUxFX1NBVkVfQVMgICAgICAgICAivau77ravzsS1tdLU0ru49tDCzsS8/sP7saO05lxuwe205s6qIg0KKyAgICBJRF9GSUxFX1BBR0VfU0VUVVAgICAgICAiuMSx5LTy06HRoc/uXG7Ss8PmyejWwyINCisgICAgSURfRklMRV9QUklOVF9TRVRVUCAgICAgIrjEseS08tOhu/q8sLTy06HRoc/uXG608tOhyejWwyINCisgICAgSURfRklMRV9QUklOVCAgICAgICAgICAgIrTy06G77ravzsS1tVxutPLToSINCisgICAgSURfRklMRV9QUklOVF9QUkVWSUVXICAgIs/Uyr7V+9KzXG608tOh1KTAwCINCitFTkQNCisNCitTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBJRF9BUFBfQUJPVVQgICAgICAgICAgICAiz9TKvrPM0PLQxc+io6yw5rG+usW6zbDmyKhcbrnY09oiDQorICAgIElEX0FQUF9FWElUICAgICAgICAgICAgICLNy7P206bTw7PM0PKju8zhyr6xo7TmzsS1tVxuzcuz9iINCitFTkQNCisNCitTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBJRF9GSUxFX01SVV9GSUxFMSAgICAgICAitPK/qrjDzsS1tSINCisgICAgSURfRklMRV9NUlVfRklMRTIgICAgICAgIrTyv6q4w87EtbUiDQorICAgIElEX0ZJTEVfTVJVX0ZJTEUzICAgICAgICK08r+quMPOxLW1Ig0KKyAgICBJRF9GSUxFX01SVV9GSUxFNCAgICAgICAitPK/qrjDzsS1tSINCisgICAgSURfRklMRV9NUlVfRklMRTUgICAgICAgIrTyv6q4w87EtbUiDQorICAgIElEX0ZJTEVfTVJVX0ZJTEU2ICAgICAgICK08r+quMPOxLW1Ig0KKyAgICBJRF9GSUxFX01SVV9GSUxFNyAgICAgICAitPK/qrjDzsS1tSINCisgICAgSURfRklMRV9NUlVfRklMRTggICAgICAgIrTyv6q4w87EtbUiDQorICAgIElEX0ZJTEVfTVJVX0ZJTEU5ICAgICAgICK08r+quMPOxLW1Ig0KKyAgICBJRF9GSUxFX01SVV9GSUxFMTAgICAgICAitPK/qrjDzsS1tSINCisgICAgSURfRklMRV9NUlVfRklMRTExICAgICAgIrTyv6q4w87EtbUiDQorICAgIElEX0ZJTEVfTVJVX0ZJTEUxMiAgICAgICK08r+quMPOxLW1Ig0KKyAgICBJRF9GSUxFX01SVV9GSUxFMTMgICAgICAitPK/qrjDzsS1tSINCisgICAgSURfRklMRV9NUlVfRklMRTE0ICAgICAgIrTyv6q4w87EtbUiDQorICAgIElEX0ZJTEVfTVJVX0ZJTEUxNSAgICAgICK08r+quMPOxLW1Ig0KKyAgICBJRF9GSUxFX01SVV9GSUxFMTYgICAgICAitPK/qrjDzsS1tSINCitFTkQNCisNCitTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBJRF9ORVhUX1BBTkUgICAgICAgICAgICAix9C7u7W9z8LSu7j2tLC48Vxuz8LSu7SwuPEiDQorICAgIElEX1BSRVZfUEFORSAgICAgICAgICAgICLH0Lu7u9jHsNK7uPa0sLjxXG7HsNK7tLC48SINCitFTkQNCisNCitTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBJRF9XSU5ET1dfTkVXICAgICAgICAgICAizqq77ravzsS1tbTyv6rB7dK7uPa0sL/aXG7Qwr2otLC/2iINCisgICAgSURfV0lORE9XX0FSUkFOR0UgICAgICAgIr2rzbyx6sXFwdDU2rSwv9q117K/XG7FxcHQzbyx6iINCisgICAgSURfV0lORE9XX0NBU0NBREUgICAgICAgIsXFwdC0sL/as8nP4Lul1ti1/lxusuO1/rSwv9oiDQorICAgIElEX1dJTkRPV19USUxFX0hPUlogICAgICLFxcHQtLC/2rPJu6Wyu9bYtf5cbsa9xsy0sL/aIg0KKyAgICBJRF9XSU5ET1dfVElMRV9WRVJUICAgICAixcXB0LSwv9qzybulsrvW2LX+XG7GvcbMtLC/2iINCisgICAgSURfV0lORE9XX1NQTElUICAgICAgICAgIr2ru+62r7XEtLC/2rfWuPSzybSwuPFcbrfWuPQiDQorRU5EDQorDQorU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgSURfRURJVF9DTEVBUiAgICAgICAgICAgIsm+s/2xu9GhttTP81xuyb6z/SINCisgICAgSURfRURJVF9DTEVBUl9BTEwgICAgICAgIsirsr/JvrP9XG7Iq7K/yb6z/SINCisgICAgSURfRURJVF9DT1BZICAgICAgICAgICAgIri01saxu9GhttTP87KivavG5NbD09q89Mz5sOXJz1xuuLTWxiINCisgICAgSURfRURJVF9DVVQgICAgICAgICAgICAgIrz0x9Cxu9GhttTP87KivavG5NbD09q89Mz5sOXJz1xuvPTH0CINCisgICAgSURfRURJVF9GSU5EICAgICAgICAgICAgIrLp1dLWuLaotcTV/c7EXG6y6dXSIg0KKyAgICBJRF9FRElUX1BBU1RFICAgICAgICAgICAisuXI67z0zPmw5cTayN1cbtWzzPkiDQorICAgIElEX0VESVRfUkVQRUFUICAgICAgICAgICLW2Li0yc/Su7K9stnX91xu1ti4tCINCisgICAgSURfRURJVF9SRVBMQUNFICAgICAgICAgItPDsrvNrLXE1f3OxMzmu7vWuLaotcTV/c7EXG7M5ru7Ig0KKyAgICBJRF9FRElUX1NFTEVDVF9BTEwgICAgICAi0aHU8dX7uPbOxLW1XG7RodTxyKuyvyINCisgICAgSURfRURJVF9VTkRPICAgICAgICAgICAgIrO3z/vX7rrz0ruyvbLZ1/dcbrO3z/siDQorICAgIElEX0VESVRfUkVETyAgICAgICAgICAgICLW2NDC1rTQ0M/Ix7DS0bO3z/u1xLLZ1/dcbtbY0MLWtNDQIg0KK0VORA0KKw0KK1NUUklOR1RBQkxFIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgIElEX1ZJRVdfVE9PTEJBUiAgICAgICAgICJTaG93IG9yIGhpZGUgdGhlIFRvb2xCYXJcblNob3cgb3IgaGlkZSB0aGUgVG9vbEJhciINCisgICAgSURfVklFV19TVEFUVVNfQkFSICAgICAgIlNob3cgb3IgaGlkZVxuU2hvdyBvciBoaWRlIg0KK0VORA0KKw0KK1NUUklOR1RBQkxFIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgIEFGWF9JRFNfU0NTSVpFICAgICAgICAgICK4xLHktLC/2rTz0KEiDQorICAgIEFGWF9JRFNfU0NNT1ZFICAgICAgICAgICK4xLHktLC/2s671sMiDQorICAgIEFGWF9JRFNfU0NNSU5JTUlaRSAgICAgICK9q7Swv9rL9dChs8nNvLHqIg0KKyAgICBBRlhfSURTX1NDTUFYSU1JWkUgICAgICAisNG0sL/at8W087W91+6087PftOciDQorICAgIEFGWF9JRFNfU0NORVhUV0lORE9XICAgICLH0Lu7tb3PwtK7uPbOxLW1tLC/2iINCisgICAgQUZYX0lEU19TQ1BSRVZXSU5ET1cgICAgIsfQu7u1vc/Ix7C1xM7EtbW0sL/aIg0KKyAgICBBRlhfSURTX1NDQ0xPU0UgICAgICAgICAiudix1bvutq+1xLSwv9qyoszhyr6xo7Tmy/nT0M7EtbUiDQorRU5EDQorDQorU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgQUZYX0lEU19TQ1JFU1RPUkUgICAgICAgIrDRtLC/2rvWuLS1vdX9s6O089ChIg0KKyAgICBBRlhfSURTX1NDVEFTS0xJU1QgICAgICAivKS77sjOzvGx7SINCisgICAgQUZYX0lEU19NRElDSElMRCAgICAgICAgIryku+64w7Swv9oiDQorRU5EDQorDQorU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgQUZYX0lEU19QUkVWSUVXX0NMT1NFICAgIrnYsdW08tOh1KTAwMSjyr1cbsihz/vUpNTEIg0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBDaGluZXNlIChQLlIuQy4pIHJlc291cmNlcw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMNCisNCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpDQorI2lmZGVmIF9XSU4zMg0KK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTDQorI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikNCisjZW5kaWYgLy9fV0lOMzINCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gTWVudQ0KKy8vDQorDQorSURSX1JFQURFUlRZUEUgTUVOVSBQUkVMT0FEIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgIFBPUFVQICImRmlsZSINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImT3Blbi4uLlx0Q3RybCtPIiwgICAgICAgICAgICBJRF9GSUxFX09QRU4NCisgICAgICAgIE1FTlVJVEVNICImQ2xvc2UiLCAgICAgICAgICAgICAgICAgICAgICBJRF9GSUxFX0NMT1NFDQorICAgICAgICBNRU5VSVRFTSAiJlNhdmUgQXMuLi4iLCAgICAgICAgICAgICAgICAgSURfRklMRV9TQVZFDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICImUHJpbnQuLi5cdEN0cmwrUCIsICAgICAgICAgICBJRF9GSUxFX1BSSU5UDQorICAgICAgICBNRU5VSVRFTSAiUCZyaW50ZXIgU2V0dXAuLi4iLCAgICAgICAgICAgSURfRklMRV9QUklOVF9TRVRVUA0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiUmVjZW50bHkgRmlsZSIsICAgICAgICAgICAgICAgSURfRklMRV9NUlVfRklMRTEsIEdSQVlFRA0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiRSZ4aXQuLi5cdEN0cmwrUSIsICAgICAgICAgICAgSURfQVBQX0VYSVQNCisgICAgRU5EDQorICAgIFBPUFVQICImRWRpdCINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImQ29weSBTZWxlY3QgVGV4dCIsICAgICAgICAgICBJRF9FRElUX0NPUFkNCisgICAgICAgIE1FTlVJVEVNICImRmluZCBUZXh0Li4uXHRDdHJsK0YiLCAgICAgICBJRF9FRElUX0ZJTkQNCisgICAgRU5EDQorICAgIFBPUFVQICImVmlldyINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICJab29tICZJblx0XHROdW0rIiwgICAgICAgICAgICBJRF9WSUVXX1pPT01JTg0KKyAgICAgICAgTUVOVUlURU0gIlpvb20gJk91dFx0XHROdW0tIiwgICAgICAgICAgIElEX1ZJRVdfWk9PTU9VVA0KKyAgICAgICAgTUVOVUlURU0gIlpvb20gJlRvLi4uXHRDdHJsK00iLCAgICAgICAgIElEX1ZJRVdfWk9PTVRPDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICImQWN0dWFsIFNpemVcdEN0cmwrMSIsICAgICAgICBJRF9WSUVXX0FDVFVBTFNJWkUNCisgICAgICAgIE1FTlVJVEVNICJGaXQgJlBhZ2VcdEN0cmwrMiIsICAgICAgICAgICBJRF9WSUVXX0ZJVFBBR0UNCisgICAgICAgIE1FTlVJVEVNICJGaXQgJldpZHRoXHRDdHJsKzMiLCAgICAgICAgICBJRF9WSUVXX0ZJVFdJRFRIDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIFBPUFVQICImUm90YXRlIFZpZXciDQorICAgICAgICBCRUdJTg0KKyAgICAgICAgICAgIE1FTlVJVEVNICImQ2xvY2t3aXNlXHRTaGlmdCtDdHJsK1BsdXMiLCBJRF9WSUVXX0NMT0NLV0lTRSwgSEVMUA0KKyAgICAgICAgICAgIE1FTlVJVEVNICJDb3VudGVyY2xvY2smd2lzZVx0U2hpZnQrQ3RybCtNaW51cyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9WSUVXX0NPVU5URVJDTE9DS1dJU0UNCisgICAgICAgIEVORA0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJlRvb2xCYXIiLCAgICAgICAgICAgICAgICAgICAgSURfVklFV19UT09MQkFSDQorICAgICAgICBNRU5VSVRFTSAiJlN0YXR1c0JhciIsICAgICAgICAgICAgICAgICAgSURfVklFV19TVEFUVVNfQkFSDQorICAgIEVORA0KKyAgICBQT1BVUCAiJkRvY3VtZW50Ig0KKyAgICBCRUdJTg0KKyAgICAgICAgTUVOVUlURU0gIiZGaXJzdCBQYWdlICAgIFx0XHRIb21lIiwgICAgIElEX0RPQ19GSVJTVFBBR0UNCisgICAgICAgIE1FTlVJVEVNICJQJnJldmlvdXMgUGFnZVx0TGVmdCAgQXJyb3ciLCBJRF9ET0NfUFJFUEFHRQ0KKyAgICAgICAgTUVOVUlURU0gIiZOZXh0IFBhZ2VcdFJpZ2h0IEFycm93IiwgICAgIElEX0RPQ19ORVhUUEFHRQ0KKyAgICAgICAgTUVOVUlURU0gIiZMYXN0IFBhZ2VcdEVuZCIsICAgICAgICAgICAgIElEX0RPQ19MQVNUUEFHRQ0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJkdvdG8gUGFnZS4uLlx0U2hpZnQrQ3RybCtOIiwgSURfRE9DX0dPVE9QQUdFDQorICAgICAgICBNRU5VSVRFTSAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9QUklOVF9NRVRBTEZJTEUNCisgICAgRU5EDQorICAgIFBPUFVQICImVG9vbCINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImSGFuZCBUb29sIiwgICAgICAgICAgICAgICAgICBJRF9UT09MX0hBTkQNCisgICAgICAgIE1FTlVJVEVNICJTZSZsZWN0IFRleHQiLCAgICAgICAgICAgICAgICBJRF9UT09MX1NFTEVDVA0KKyAgICAgICAgTUVOVUlURU0gIiZTbmFwc2hvdCIsICAgICAgICAgICAgICAgICAgIElEX1RPT0xfU05BUFNIT1QNCisgICAgICAgIE1FTlVJVEVNICJQZGYydHh0IiwgICAgICAgICAgICAgICAgICAgICBJRF9UT09MX1BERjJUWFQNCisgICAgICAgIE1FTlVJVEVNICJFeHRyYWN0IGxpbmtzIiwgICAgICAgICAgICAgICBJRF9UT09MX0VYVFJBQ1RMSU5LUw0KKyAgICAgICAgTUVOVUlURU0gIlRlc3QgSmF2YVNjcmlwdCIsICAgICAgICAgICAgIElETV9UZXN0X0pTDQorICAgIEVORA0KKyAgICBQT1BVUCAiJkJpdG1hcCINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImRXhwb3J0IFBERiB0byBiaXRtYXAiLCAgICAgICBJRF9FWFBPUlRfUERGX1RPX0JJVE1BUA0KKyAgICBFTkQNCisgICAgUE9QVVAgIiZIZWxwIg0KKyAgICBCRUdJTg0KKyAgICAgICAgTUVOVUlURU0gIkFib3V0IFJlYWRlclZDKCZBKS4uLiIsICAgICAgIElEX0FQUF9BQk9VVA0KKyAgICBFTkQNCitFTkQNCisNCitJRFJfTUFJTkZSQU1FIE1FTlUgUFJFTE9BRCBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICBQT1BVUCAiJkZpbGUiDQorICAgIEJFR0lODQorICAgICAgICBNRU5VSVRFTSAiJk9wZW4uLi5cdEN0cmwrTyIsICAgICAgICAgICAgSURfRklMRV9PUEVODQorICAgICAgICBNRU5VSVRFTSAiJkNsb3NlIiwgICAgICAgICAgICAgICAgICAgICAgSURfRklMRV9DTE9TRQ0KKyAgICAgICAgTUVOVUlURU0gIiZTYXZlIEFzLi4uIiwgICAgICAgICAgICAgICAgIElEX0ZJTEVfU0FWRQ0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJlByaW50Li4uXHRDdHJsK1AiLCAgICAgICAgICAgSURfRklMRV9QUklOVA0KKyAgICAgICAgTUVOVUlURU0gIlAmcmludGVyIFNldHVwLi4uIiwgICAgICAgICAgIElEX0ZJTEVfUFJJTlRfU0VUVVANCisgICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUg0KKyAgICAgICAgTUVOVUlURU0gIlJlY2VudGx5IEZpbGUiLCAgICAgICAgICAgICAgIElEX0ZJTEVfTVJVX0ZJTEUxLCBHUkFZRUQNCisgICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUg0KKyAgICAgICAgTUVOVUlURU0gIkUmeGl0Li4uXHRDdHJsK1EiLCAgICAgICAgICAgIElEX0FQUF9FWElUDQorICAgIEVORA0KKyAgICBQT1BVUCAiJkVkaXQiDQorICAgIEJFR0lODQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICImQ29weSBTZWxlY3QgVGV4dCIsICAgICAgICAgICBJRF9FRElUX0NPUFkNCisgICAgICAgIE1FTlVJVEVNICImRmluZCBUZXh0Li4uXHRDdHJsK0YiLCAgICAgICBJRF9FRElUX0ZJTkQNCisgICAgRU5EDQorICAgIFBPUFVQICImVmlldyINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICJab29tICZJblx0XHROdW0rIiwgICAgICAgICAgICBJRF9WSUVXX1pPT01JTg0KKyAgICAgICAgTUVOVUlURU0gIlpvb20gJk91dFx0XHROdW0tIiwgICAgICAgICAgIElEX1ZJRVdfWk9PTU9VVA0KKyAgICAgICAgTUVOVUlURU0gIlpvb20gJlRvLi4uXHRDdHJsK00iLCAgICAgICAgIElEX1ZJRVdfWk9PTVRPDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIE1FTlVJVEVNICImQWN0dWFsIFNpemVcdEN0cmwrMSIsICAgICAgICBJRF9WSUVXX0FDVFVBTFNJWkUNCisgICAgICAgIE1FTlVJVEVNICJGaXQgJlBhZ2VcdEN0cmwrMiIsICAgICAgICAgICBJRF9WSUVXX0ZJVFBBR0UNCisgICAgICAgIE1FTlVJVEVNICJGaXQgJldpZHRoXHRDdHJsKzMiLCAgICAgICAgICBJRF9WSUVXX0ZJVFdJRFRIDQorICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1INCisgICAgICAgIFBPUFVQICImUm90YXRlIFZpZXciDQorICAgICAgICBCRUdJTg0KKyAgICAgICAgICAgIE1FTlVJVEVNICImQ2xvY2t3aXNlXHRTaGlmdCtDdHJsK1BsdXMiLCBJRF9WSUVXX0NMT0NLV0lTRSwgSEVMUA0KKyAgICAgICAgICAgIE1FTlVJVEVNICJDb3VudGVyY2xvY2smd2lzZVx0U2hpZnQrQ3RybCtNaW51cyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9WSUVXX0NPVU5URVJDTE9DS1dJU0UNCisgICAgICAgIEVORA0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJlRvb2xCYXIiLCAgICAgICAgICAgICAgICAgICAgSURfVklFV19UT09MQkFSDQorICAgICAgICBNRU5VSVRFTSAiJlN0YXR1c0JhciIsICAgICAgICAgICAgICAgICAgSURfVklFV19TVEFUVVNfQkFSDQorICAgIEVORA0KKyAgICBQT1BVUCAiJkRvY3VtZW50Ig0KKyAgICBCRUdJTg0KKyAgICAgICAgTUVOVUlURU0gIiZGaXJzdCBQYWdlICAgIFx0XHRIb21lIiwgICAgIElEX0RPQ19GSVJTVFBBR0UNCisgICAgICAgIE1FTlVJVEVNICJQJnJldmlvdXMgUGFnZVx0TGVmdCAgQXJyb3ciLCBJRF9ET0NfUFJFUEFHRQ0KKyAgICAgICAgTUVOVUlURU0gIiZOZXh0IFBhZ2VcdFJpZ2h0IEFycm93IiwgICAgIElEX0RPQ19ORVhUUEFHRQ0KKyAgICAgICAgTUVOVUlURU0gIiZMYXN0IFBhZ2VcdEVuZCIsICAgICAgICAgICAgIElEX0RPQ19MQVNUUEFHRQ0KKyAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICBNRU5VSVRFTSAiJkdvdG8gUGFnZS4uLlx0U2hpZnQrQ3RybCtOIiwgSURfRE9DX0dPVE9QQUdFDQorICAgICAgICBNRU5VSVRFTSAiUHJpbnQgTWV0YWxGaWxlIiwgICAgICAgICAgICAgVEVTVF9QUklOVF9NRVRBTEZJTEUNCisgICAgRU5EDQorICAgIFBPUFVQICImVG9vbCINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICImSGFuZCBUb29sIiwgICAgICAgICAgICAgICAgICBJRF9UT09MX0hBTkQNCisgICAgICAgIE1FTlVJVEVNICJTZSZsZWN0IFRleHQiLCAgICAgICAgICAgICAgICBJRF9UT09MX1NFTEVDVA0KKyAgICAgICAgTUVOVUlURU0gIiZTbmFwc2hvdCIsICAgICAgICAgICAgICAgICAgIElEX1RPT0xfU05BUFNIT1QNCisgICAgICAgIE1FTlVJVEVNICJQZGYydHh0IiwgICAgICAgICAgICAgICAgICAgICBJRF9UT09MX1BERjJUWFQNCisgICAgICAgIE1FTlVJVEVNICJFeHRyYWN0IGxpbmtzIiwgICAgICAgICAgICAgICBJRF9UT09MX0VYVFJBQ1RMSU5LUw0KKyAgICBFTkQNCisgICAgUE9QVVAgIiZCaXRtYXAiDQorICAgIEJFR0lODQorICAgICAgICBNRU5VSVRFTSAiJkV4cG9ydCBQREYgdG8gYml0bWFwIiwgICAgICAgSURfRVhQT1JUX1BERl9UT19CSVRNQVANCisgICAgRU5EDQorICAgIFBPUFVQICImSGVscCINCisgICAgQkVHSU4NCisgICAgICAgIE1FTlVJVEVNICJBYm91dCBSZWFkZXJWQygmQSkuLi4iLCAgICAgICBJRF9BUFBfQUJPVVQNCisgICAgRU5EDQorRU5EDQorDQorI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorDQorDQorI2lmbmRlZiBBUFNUVURJT19JTlZPS0VEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAzIHJlc291cmNlLg0KKy8vDQorI2RlZmluZSBfQUZYX05PX1NQTElUVEVSX1JFU09VUkNFUw0KKyNkZWZpbmUgX0FGWF9OT19PTEVfUkVTT1VSQ0VTDQorI2RlZmluZSBfQUZYX05PX1RSQUNLRVJfUkVTT1VSQ0VTDQorI2RlZmluZSBfQUZYX05PX1BST1BFUlRZX1JFU09VUkNFUw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0NIUykNCisjaWZkZWYgX1dJTjMyDQorTEFOR1VBR0UgNCwgMg0KKyNwcmFnbWEgY29kZV9wYWdlKDkzNikNCisjZW5kaWYgLy9fV0lOMzINCisjaW5jbHVkZSAicmVzXFJlYWRlclZDLnJjMiIgIC8vIG5vbi1NaWNyb3NvZnQgVmlzdWFsIEMrKyBlZGl0ZWQgcmVzb3VyY2VzDQorI2luY2x1ZGUgImwuY2hzXGFmeHJlcy5yYyIgICAgICAgICAgLy8gU3RhbmRhcmQgY29tcG9uZW50cw0KKyNpbmNsdWRlICJsLmNoc1xhZnhwcmludC5yYyIgICAgICAgIC8vIHByaW50aW5nL3ByaW50IHByZXZpZXcgcmVzb3VyY2VzDQorI2VuZGlmDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQNCisNCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvUmVhZGVyVkNEb2MuY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDRG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDY1MTVkCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDRG9jLmNwcApAQCAtMCwwICsxLDExMyBAQAorLy8gUmVhZGVyVkNEb2MuY3BwIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIENSZWFkZXJWQ0RvYyBjbGFzcw0KKy8vDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQy5oIg0KKw0KKyNpbmNsdWRlICJNYWluRnJtLmgiDQorI2luY2x1ZGUgIkNoaWxkRnJtLmgiDQorI2luY2x1ZGUgIlJlYWRlclZDRG9jLmgiDQorI2luY2x1ZGUgIlJlYWRlclZDVmlldy5oIg0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENSZWFkZXJWQ0RvYw0KKw0KK0lNUExFTUVOVF9EWU5DUkVBVEUoQ1JlYWRlclZDRG9jLCBDRG9jdW1lbnQpDQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ1JlYWRlclZDRG9jLCBDRG9jdW1lbnQpDQorCS8ve3tBRlhfTVNHX01BUChDUmVhZGVyVkNEb2MpDQorCQkvLyBOT1RFIC0gdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIGFuZCByZW1vdmUgbWFwcGluZyBtYWNyb3MgaGVyZS4NCisJCS8vICAgIERPIE5PVCBFRElUIHdoYXQgeW91IHNlZSBpbiB0aGVzZSBibG9ja3Mgb2YgZ2VuZXJhdGVkIGNvZGUhDQorCS8vfX1BRlhfTVNHX01BUA0KK0VORF9NRVNTQUdFX01BUCgpDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDUmVhZGVyVkNEb2MgY29uc3RydWN0aW9uL2Rlc3RydWN0aW9uDQorDQorQ1JlYWRlclZDRG9jOjpDUmVhZGVyVkNEb2MoKQ0KK3sNCisJLy8gVE9ETzogYWRkIG9uZS10aW1lIGNvbnN0cnVjdGlvbiBjb2RlIGhlcmUNCisNCit9DQorDQorQ1JlYWRlclZDRG9jOjp+Q1JlYWRlclZDRG9jKCkNCit7DQorfQ0KKw0KK0JPT0wgQ1JlYWRlclZDRG9jOjpPbk5ld0RvY3VtZW50KCkNCit7DQorCWlmICghQ0RvY3VtZW50OjpPbk5ld0RvY3VtZW50KCkpDQorCQlyZXR1cm4gRkFMU0U7DQorDQorCS8vIFRPRE86IGFkZCByZWluaXRpYWxpemF0aW9uIGNvZGUgaGVyZQ0KKwkvLyAoU0RJIGRvY3VtZW50cyB3aWxsIHJldXNlIHRoaXMgZG9jdW1lbnQpDQorDQorCXJldHVybiBUUlVFOw0KK30NCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENSZWFkZXJWQ0RvYyBzZXJpYWxpemF0aW9uDQorDQordm9pZCBDUmVhZGVyVkNEb2M6OlNlcmlhbGl6ZShDQXJjaGl2ZSYgYXIpDQorew0KKwlpZiAoYXIuSXNTdG9yaW5nKCkpDQorCXsNCisJCS8vIFRPRE86IGFkZCBzdG9yaW5nIGNvZGUgaGVyZQ0KKwl9DQorCWVsc2UNCisJew0KKwkJLy8gVE9ETzogYWRkIGxvYWRpbmcgY29kZSBoZXJlDQorCX0NCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDUmVhZGVyVkNEb2MgZGlhZ25vc3RpY3MNCisNCisjaWZkZWYgX0RFQlVHDQordm9pZCBDUmVhZGVyVkNEb2M6OkFzc2VydFZhbGlkKCkgY29uc3QNCit7DQorCUNEb2N1bWVudDo6QXNzZXJ0VmFsaWQoKTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNEb2M6OkR1bXAoQ0R1bXBDb250ZXh0JiBkYykgY29uc3QNCit7DQorCUNEb2N1bWVudDo6RHVtcChkYyk7DQorfQ0KKyNlbmRpZiAvL19ERUJVRw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ1JlYWRlclZDRG9jIGNvbW1hbmRzDQorDQorQk9PTCBDUmVhZGVyVkNEb2M6Ok9uT3BlbkRvY3VtZW50KExQQ1RTVFIgbHBzelBhdGhOYW1lKSANCit7DQorCWlmICghQ0RvY3VtZW50OjpPbk9wZW5Eb2N1bWVudChscHN6UGF0aE5hbWUpKQ0KKwkJcmV0dXJuIEZBTFNFOw0KKwkNCisJLy8gVE9ETzogQWRkIHlvdXIgc3BlY2lhbGl6ZWQgY3JlYXRpb24gY29kZSBoZXJlDQorCXZvaWQqIHBEb2MgPSBGUERGX0xvYWREb2N1bWVudChscHN6UGF0aE5hbWUsIE5VTEwpOw0KKw0KKwltX3N0clBERk5hbWU9bHBzelBhdGhOYW1lOw0KKwlpZihOVUxMID09IHBEb2MpIHJldHVybiBGQUxTRTsJDQorCVBPU0lUSU9OIHBvcyA9IEdldEZpcnN0Vmlld1Bvc2l0aW9uKCk7DQorCWludCBuQ291bnQgPSBGUERGX0dldFBhZ2VDb3VudChwRG9jKTsNCisJd2hpbGUgKHBvcyAhPSBOVUxMKQ0KKwl7DQorCQlDVmlldyogcFZpZXcgPSBHZXROZXh0Vmlldyhwb3MpOw0KKwkJaWYocFZpZXctPklzS2luZE9mKFJVTlRJTUVfQ0xBU1MoQ1JlYWRlclZDVmlldykpKQ0KKwkJew0KKwkJCUNNYWluRnJhbWUqIHBNRnJtID0gKENNYWluRnJhbWUqKUFmeEdldE1haW5XbmQoKTsNCisJCQlDQ2hpbGRGcmFtZSogcENoaWxkRnJtID0oQ0NoaWxkRnJhbWUqKSBwTUZybS0+R2V0QWN0aXZlRnJhbWUoKTsNCisJCQlwQ2hpbGRGcm0tPlNldEFjdGl2ZVZpZXcocFZpZXcsIFRSVUUpOw0KKy8vCQkJRlBERkFwcF9TZXREb2N1bWVudCgoKENSZWFkZXJWQ1ZpZXcqKXBWaWV3KS0+R2V0RlBERkFwcCgpLCAoRlBERl9ET0NVTUVOVClwRG9jKTsNCisJCQkoKENSZWFkZXJWQ1ZpZXcqKXBWaWV3KS0+U2V0UERGRG9jdW1lbnQocERvYywgbkNvdW50KTsNCisJCX0JDQorCX0NCisJcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQ0RvYy5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDRG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmYzdlMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQ0RvYy5oCkBAIC0wLDAgKzEsNTkgQEAKKwkvLyBSZWFkZXJWQ0RvYy5oIDogaW50ZXJmYWNlIG9mIHRoZSBDUmVhZGVyVkNEb2MgY2xhc3MNCisvLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorI2lmICFkZWZpbmVkKEFGWF9SRUFERVJWQ0RPQ19IX182RTBCOTc5OV8wNjYxXzREQjNfOUU0MF9GQjJEMTdGMEQ1RUJfX0lOQ0xVREVEXykNCisjZGVmaW5lIEFGWF9SRUFERVJWQ0RPQ19IX182RTBCOTc5OV8wNjYxXzREQjNfOUU0MF9GQjJEMTdGMEQ1RUJfX0lOQ0xVREVEXw0KKw0KKyNpZiBfTVNDX1ZFUiA+IDEwMDANCisjcHJhZ21hIG9uY2UNCisjZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwDQorDQorDQorY2xhc3MgQ1JlYWRlclZDRG9jIDogcHVibGljIENEb2N1bWVudA0KK3sNCitwcm90ZWN0ZWQ6IC8vIGNyZWF0ZSBmcm9tIHNlcmlhbGl6YXRpb24gb25seQ0KKwlDUmVhZGVyVkNEb2MoKTsNCisJREVDTEFSRV9EWU5DUkVBVEUoQ1JlYWRlclZDRG9jKQ0KKw0KKy8vIEF0dHJpYnV0ZXMNCitwdWJsaWM6DQorDQorLy8gT3BlcmF0aW9ucw0KK3B1YmxpYzoNCisNCisvLyBPdmVycmlkZXMNCisJLy8gQ2xhc3NXaXphcmQgZ2VuZXJhdGVkIHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGVzDQorCS8ve3tBRlhfVklSVFVBTChDUmVhZGVyVkNEb2MpDQorCXB1YmxpYzoNCisJdmlydHVhbCBCT09MIE9uTmV3RG9jdW1lbnQoKTsNCisJdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShDQXJjaGl2ZSYgYXIpOw0KKwl2aXJ0dWFsIEJPT0wgT25PcGVuRG9jdW1lbnQoTFBDVFNUUiBscHN6UGF0aE5hbWUpOw0KKwkvL319QUZYX1ZJUlRVQUwNCisNCisvLyBJbXBsZW1lbnRhdGlvbg0KK3B1YmxpYzoNCisJQ1N0cmluZyBtX3N0clBERk5hbWU7DQorCXZpcnR1YWwgfkNSZWFkZXJWQ0RvYygpOw0KKyNpZmRlZiBfREVCVUcNCisJdmlydHVhbCB2b2lkIEFzc2VydFZhbGlkKCkgY29uc3Q7DQorCXZpcnR1YWwgdm9pZCBEdW1wKENEdW1wQ29udGV4dCYgZGMpIGNvbnN0Ow0KKyNlbmRpZg0KKw0KK3Byb3RlY3RlZDoNCisNCisvLyBHZW5lcmF0ZWQgbWVzc2FnZSBtYXAgZnVuY3Rpb25zDQorcHJvdGVjdGVkOg0KKwkvL3t7QUZYX01TRyhDUmVhZGVyVkNEb2MpDQorCQkvLyBOT1RFIC0gdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIGFuZCByZW1vdmUgbWVtYmVyIGZ1bmN0aW9ucyBoZXJlLg0KKwkJLy8gICAgRE8gTk9UIEVESVQgd2hhdCB5b3Ugc2VlIGluIHRoZXNlIGJsb2NrcyBvZiBnZW5lcmF0ZWQgY29kZSAhDQorCS8vfX1BRlhfTVNHDQorCURFQ0xBUkVfTUVTU0FHRV9NQVAoKQ0KK307DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfUkVBREVSVkNET0NfSF9fNkUwQjk3OTlfMDY2MV80REIzXzlFNDBfRkIyRDE3RjBENUVCX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDVmlldy5jcHAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvUmVhZGVyVkNWaWV3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBiNThiCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDVmlldy5jcHAKQEAgLTAsMCArMSwzNzUwIEBACisvLyBSZWFkZXJWQ1ZpZXcuY3BwIDogaW1wbGVtZW50YXRpb24gb2YgdGhlIENSZWFkZXJWQ1ZpZXcgY2xhc3MNCisvLw0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiUmVhZGVyVkMuaCINCisjaW5jbHVkZSAiTWFpbkZybS5oIg0KKyNpbmNsdWRlICJDaGlsZEZybS5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQ0RvYy5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQ1ZpZXcuaCINCisNCisjaW5jbHVkZSAiR290b1BhZ2VEbGcuaCINCisjaW5jbHVkZSAiWm9vbURsZy5oIg0KKyNpbmNsdWRlICJGaW5kRGxnLmgiDQorI2luY2x1ZGUgIkNvbnZlcnREbGcuaCINCisjaW5jbHVkZSAiSlNfUmVzcG9uc2VEbGcuaCINCisjaW5jbHVkZSAiVGVzdEpzRGxnLmgiDQorLy8jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wcF9ldmVudC5oIg0KKw0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENSZWFkZXJWQ1ZpZXcNCisNCitJTVBMRU1FTlRfRFlOQ1JFQVRFKENSZWFkZXJWQ1ZpZXcsIENWaWV3KQ0KKw0KK0JFR0lOX01FU1NBR0VfTUFQKENSZWFkZXJWQ1ZpZXcsIENWaWV3KQ0KKwkvL3t7QUZYX01TR19NQVAoQ1JlYWRlclZDVmlldykNCisJT05fQ09NTUFORChJRF9ET0NfRklSU1RQQUdFLCBPbkRvY0ZpcnN0cGFnZSkNCisJT05fQ09NTUFORChJRF9ET0NfR09UT1BBR0UsIE9uRG9jR290b3BhZ2UpDQorCU9OX0NPTU1BTkQoSURfRE9DX0xBU1RQQUdFLCBPbkRvY0xhc3RwYWdlKQ0KKwlPTl9DT01NQU5EKElEX0RPQ19ORVhUUEFHRSwgT25Eb2NOZXh0cGFnZSkNCisJT05fQ09NTUFORChJRF9ET0NfUFJFUEFHRSwgT25Eb2NQcmVwYWdlKQ0KKwlPTl9DT01NQU5EKElEX1ZJRVdfQ0xPQ0tXSVNFLCBPbkNsb2Nrd2lzZSkNCisJT05fQ09NTUFORChJRF9WSUVXX0NPVU5URVJDTE9DS1dJU0UsIE9uQ291bnRlcmNsb2Nrd2lzZSkNCisJT05fQ09NTUFORChJRF9WSUVXX0FDVFVBTFNJWkUsIE9uVmlld0FjdHVhbFNpemUpDQorCU9OX0NPTU1BTkQoSURfVklFV19GSVRQQUdFLCBPblZpZXdGaXRQYWdlKQ0KKwlPTl9DT01NQU5EKElEX1ZJRVdfRklUV0lEVEgsIE9uVmlld0ZpdFdpZHRoKQ0KKwlPTl9DT01NQU5EKElEX1ZJRVdfWk9PTUlOLCBPblZpZXdab29tSW4pDQorCU9OX0NPTU1BTkQoSURfVklFV19aT09NT1VULCBPblZpZXdab29tT3V0KQ0KKwlPTl9DT01NQU5EKElEX1ZJRVdfWk9PTVRPLCBPblZpZXdab29tVG8pDQorCU9OX0NPTU1BTkQoSURfRURJVF9GSU5ELCBPbkVkaXRGaW5kKQ0KKwlPTl9DT01NQU5EKElEX0ZJTEVfUFJJTlQsIE9uRmlsZVByaW50KQ0KKwlPTl9XTV9MQlVUVE9ORE9XTigpDQorCU9OX1dNX0xCVVRUT05VUCgpDQorCU9OX1dNX01PVVNFTU9WRSgpDQorCU9OX1dNX0tFWURPV04oKQ0KKwlPTl9DT01NQU5EKElEX1RPT0xfU05BUFNIT1QsIE9uVG9vbFNuYXBzaG90KQ0KKwlPTl9DT01NQU5EKElEX1RPT0xfU0VMRUNULCBPblRvb2xTZWxlY3QpDQorCU9OX0NPTU1BTkQoSURfVE9PTF9IQU5ELCBPblRvb2xIYW5kKQ0KKwlPTl9DT01NQU5EKElEX1RPT0xfUERGMlRYVCwgT25Ub29sUGRmMnR4dCkNCisJT05fV01fU0laRSgpDQorCU9OX1dNX0hTQ1JPTEwoKQ0KKwlPTl9XTV9WU0NST0xMKCkNCisJT05fQ09NTUFORChJRF9UT09MX0VYVFJBQ1RMSU5LUywgT25Ub29sRXh0cmFjdGxpbmtzKQ0KKwlPTl9XTV9ERVNUUk9ZKCkNCisJT05fVVBEQVRFX0NPTU1BTkRfVUkoSURfRE9DX0ZJUlNUUEFHRSwgT25VcGRhdGVEb2NGaXJzdHBhZ2UpDQorCU9OX1VQREFURV9DT01NQU5EX1VJKElEX0RPQ19MQVNUUEFHRSwgT25VcGRhdGVEb2NMYXN0cGFnZSkNCisJT05fVVBEQVRFX0NPTU1BTkRfVUkoSURfRE9DX05FWFRQQUdFLCBPblVwZGF0ZURvY05leHRwYWdlKQ0KKwlPTl9VUERBVEVfQ09NTUFORF9VSShJRF9ET0NfUFJFUEFHRSwgT25VcGRhdGVEb2NQcmVwYWdlKQ0KKwlPTl9VUERBVEVfQ09NTUFORF9VSShJRF9UT09MX0hBTkQsIE9uVXBkYXRlVG9vbEhhbmQpDQorCU9OX1VQREFURV9DT01NQU5EX1VJKElEX1RPT0xfU05BUFNIT1QsIE9uVXBkYXRlVG9vbFNuYXBzaG90KQ0KKwlPTl9VUERBVEVfQ09NTUFORF9VSShJRF9UT09MX1NFTEVDVCwgT25VcGRhdGVUb29sU2VsZWN0KQ0KKwlPTl9DT01NQU5EKElEX1ZJRVdfQk9PS01BUkssIE9uVmlld0Jvb2ttYXJrKQ0KKwlPTl9XTV9NT1VTRVdIRUVMKCkNCisJT05fV01fQ09OVEVYVE1FTlUoKQ0KKwlPTl9DT01NQU5EKElEX0VESVRfQ09QWSwgT25FZGl0Q29weSkNCisJT05fQ09NTUFORChJRF9SRU5ERVJCSVRNQVAsIE9uUmVuZGVyYml0bWFwKQ0KKwlPTl9DT01NQU5EKElEX0VYUE9SVF9QREZfVE9fQklUTUFQLCBPbkV4cG9ydFBkZlRvQml0bWFwKQ0KKwlPTl9XTV9DSEFSKCkNCisJT05fV01fS0VZVVAoKQ0KKwlPTl9DT01NQU5EKElEX0ZJTEVfU0FWRSwgT25GaWxlU2F2ZSkNCisJT05fQ09NTUFORChJRE1fVGVzdF9KUywgT25UZXN0SlMpDQorCU9OX0NPTU1BTkQoVEVTVF9QUklOVF9NRVRBTEZJTEUsIE9uUHJpbnRNZXRhbGZpbGUpDQorCS8vfX1BRlhfTVNHX01BUA0KKwkvLyBTdGFuZGFyZCBwcmludGluZyBjb21tYW5kcw0KKwlPTl9DT01NQU5EKElEX0ZJTEVfUFJJTlQsIENWaWV3OjpPbkZpbGVQcmludCkNCisJT05fQ09NTUFORChJRF9GSUxFX1BSSU5UX0RJUkVDVCwgQ1ZpZXc6Ok9uRmlsZVByaW50KQ0KKwlPTl9DT01NQU5EKElEX0ZJTEVfUFJJTlRfUFJFVklFVywgQ1ZpZXc6Ok9uRmlsZVByaW50UHJldmlldykNCitFTkRfTUVTU0FHRV9NQVAoKQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ1JlYWRlclZDVmlldyBjb25zdHJ1Y3Rpb24vZGVzdHJ1Y3Rpb24NCit2b2lkIFNhbXBsZV9QYWdlVG9EZXZpY2Uoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsRlBERl9QQUdFIHBhZ2UsZG91YmxlIHBhZ2VfeCxkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KQ0KK3sNCisJQ1JlYWRlclZDVmlldyogcFZpZXcgPShDUmVhZGVyVkNWaWV3KilwVGhpczsNCisJaWYgKCBwVmlldyApDQorCXsNCisJCXBWaWV3LT5QYWdlVG9EZXZpY2VJbXBsKHBhZ2UsIHBhZ2VfeCwgcGFnZV95LCBkZXZpY2VfeCwgZGV2aWNlX3kpOw0KKwl9DQorCS8vKChDUmVhZGVyVkNWaWV3KilwVGhpcyktPlBhZ2VUb0RldmljZUltcGwocGFnZSwgcGFnZV94LCBwYWdlX3ksIGRldmljZV94LCBkZXZpY2VfeSk7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlX0ludmFsaWRhdGUoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcFZpZXctPkludmFsaWRhdGVJbXBsKHBhZ2UsbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsNCisJfQ0KKwkvLygoQ1JlYWRlclZDVmlldyopcFRoaXMpLT5JbnZhbGlkYXRlSW1wbChwYWdlLGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlX091dHB1dFNlbGVjdGVkUmVjdChzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICggcFZpZXcgKQ0KKwl7DQorCQlwVmlldy0+T3V0cHV0U2VsZWN0ZWRSZWN0SW1wbChwYWdlLGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7DQorCX0NCit9DQorDQordm9pZCBTYW1wbGVfRGV2aWNlVG9QYWdlKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLEZQREZfUEFHRSBwYWdlLGludCBkZXZpY2VfeCwgaW50IGRldmljZV95LCBkb3VibGUqIHBhZ2VfeCwgZG91YmxlKiBwYWdlX3kpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcFZpZXctPkRldmljZVRvUGFnZUltcGwocGFnZSwgZGV2aWNlX3gsIGRldmljZV95LCBwYWdlX3gsIHBhZ2VfeSk7DQorCX0NCisJLy8oKENSZWFkZXJWQ1ZpZXcqKXBUaGlzKS0+RGV2aWNlVG9QYWdlSW1wbChwYWdlLCBkZXZpY2VfeCwgZGV2aWNlX3ksIHBhZ2VfeCwgcGFnZV95KTsNCit9DQorLyogLyogUmVtb3ZlIGJ5IEFteSBMaW4gMjAxMDA5MTMsIFNpbmNlIHdlIGRvbid0IHRoaXMgdGhlIEZGSV9TZXRDYXJldCBhbnkgbW9yZS4NCit2b2lkIFNhbXBsZV9TZXRDYXJldChzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxGUERGX1BBR0UgcGFnZSxkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQgbldpZHRoLCBpbnQgbkhlaWdodCkNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICggcFZpZXcgKQ0KKwl7DQorCQlwVmlldy0+U2V0Q2FyZXRJbXBsKHBhZ2UsIHBhZ2VfeCwgcGFnZV95LCBuV2lkdGgsICBuSGVpZ2h0KTsNCisJfQ0KKwkvLygoQ1JlYWRlclZDVmlldyopcFRoaXMpLT5TZXRDYXJldEltcGwocGFnZSwgcGFnZV94LCBwYWdlX3ksIG5XaWR0aCwgIG5IZWlnaHQpOw0KK30NCisqLw0KK3ZvaWQgU2FtcGxlX1JlbGVhc2Uoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcFZpZXctPlJlbGVhc2VJbXBsKCk7DQorCX0NCisJLy8oKENSZWFkZXJWQ1ZpZXcqKXBUaGlzKS0+UmVsZWFzZUltcGwoKTsNCit9DQorDQorDQoraW50IFNhbXBsZV9TZXRUaW1lcihzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcmV0dXJuIHBWaWV3LT5TZXRUaW1lckltcGwodUVsYXBzZSwgbHBUaW1lckZ1bmMpOw0KKwl9ZWxzZXsNCisJCXJldHVybiAtMTsNCisJfQ0KKwkvL3JldHVybiAoKENSZWFkZXJWQ1ZpZXcqKXBUaGlzKS0+U2V0VGltZXJJbXBsKHVFbGFwc2UsIGxwVGltZXJGdW5jKTsNCit9DQorDQordm9pZCBTYW1wbGVfS2lsbFRpbWVyKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLGludCBuSUQpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcFZpZXctPktpbGxUaW1lckltcGwobklEKTsNCisJfQ0KKwkvLygoQ1JlYWRlclZDVmlldyopcFRoaXMpLT5LaWxsVGltZXJJbXBsKG5JRCk7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlX1NldEN1cnNvcihzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxpbnQgbkN1cnNvclR5cGUpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcFZpZXctPlNldEN1cm9ySW1wbChuQ3Vyc29yVHlwZSk7DQorCX0NCisJLy8oKENSZWFkZXJWQ1ZpZXcqKXBUaGlzKS0+U2V0Q3Vyb3JJbXBsKG5DdXJzb3JUeXBlKTsNCit9DQorDQordm9pZCBTYW1wbGVfT25DaGFuZ2Uoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcFZpZXctPk9uQ2hhbmdlSW1wbCgpOw0KKwl9DQorfQ0KK0ZQREZfQk9PTAlTYW1wbGVfSXNTSElGVEtleURvd24oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcmV0dXJuIHBWaWV3LT5Jc1NISUZUS2V5RG93bkltcGwoKTsNCisJfQ0KKwlyZXR1cm4gRkFMU0U7DQorfQ0KK0ZQREZfQk9PTAlTYW1wbGVfSXNDVFJMS2V5RG93bihzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcykNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICggcFZpZXcgKQ0KKwl7DQorCQlyZXR1cm4gcFZpZXctPklzQ1RSTEtleURvd25JbXBsKCk7DQorCX0NCisJcmV0dXJuIEZBTFNFOw0KK30NCitGUERGX0JPT0wJU2FtcGxlX0lzQUxUS2V5RG93bihzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcykgDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcmV0dXJuIHBWaWV3LT5Jc0FMVEtleURvd25JbXBsKCk7DQorCX0NCisJcmV0dXJuIEZBTFNFOw0KK30NCitGUERGX0JPT0wJU2FtcGxlX0lzSU5TRVJUS2V5RG93bihzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcykgDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcmV0dXJuIHBWaWV3LT5Jc0lOU0VSVEtleURvd25JbXBsKCk7DQorCX0NCisJcmV0dXJuIEZBTFNFOw0KK30NCisNCitGUERGX1BBR0UgU2FtcGxlX0dldFBhZ2Uoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IG5QYWdlSW5kZXgpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIHBWaWV3ICkNCisJew0KKwkJcmV0dXJuIHBWaWV3LT5HZXRQYWdlSW1wbChkb2N1bWVudCxuUGFnZUluZGV4KTsNCisJfQ0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorRlBERl9QQUdFIFNhbXBsZV9HZXRDdXJyZW50UGFnZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCkNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICggcFZpZXcgKQ0KKwl7DQorCQlyZXR1cm4gcFZpZXctPkdldEN1cnJlbnRQYWdlSW1wbChkb2N1bWVudCk7DQorCX0NCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KK2ludCBTYW1wbGVfR2V0Um90YXRpb24oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlKQ0KK3sNCisJQ1JlYWRlclZDVmlldyogcFZpZXcgPShDUmVhZGVyVkNWaWV3KilwVGhpczsNCisJaWYgKCBwVmlldyApDQorCXsNCisJCXJldHVybiBwVmlldy0+R2V0Um90YXRpb25JbXBsKHBhZ2UpOw0KKwl9DQorCXJldHVybiBOVUxMOw0KK30NCitGUERGX1NZU1RFTVRJTUUgU2FtcGxlX0dldExvY2FsVGltZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcykNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICggcFZpZXcgKQ0KKwl7DQorCQlyZXR1cm4gcFZpZXctPkdldExvY2FsVGltZUltcGwoKTsNCisJfQ0KKwlyZXR1cm4gRlBERl9TWVNURU1USU1FKCk7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlUmVsZWFzZShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzKQ0KK3sNCisJKChDU2FtcGxlRm9udEluZm8qKXBUaGlzKS0+UmVsZWFzZUltcGwoKTsNCit9DQorDQordm9pZCBTYW1wbGVFbnVtRm9udHMoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogcE1hcHBlcikNCit7DQorCSgoQ1NhbXBsZUZvbnRJbmZvKilwVGhpcyktPkVudW1Gb250c0ltcGwocE1hcHBlcik7DQorfQ0KKw0KK3ZvaWQqIFNhbXBsZU1hcEZvbnQoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgaW50IHdlaWdodCwgaW50IGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCANCisJCQkJCQljb25zdCBjaGFyKiBmYWNlLCBpbnQqIGJFeGFjdCkNCit7DQorCXJldHVybiAoKENTYW1wbGVGb250SW5mbyopcFRoaXMpLT5NYXBGb250SW1wbCh3ZWlnaHQsIGJJdGFsaWMsIGNoYXJzZXQsIHBpdGNoX2ZhbWlseSwgZmFjZSwgYkV4YWN0KTsNCit9DQorDQordW5zaWduZWQgbG9uZyBTYW1wbGVHZXRGb250RGF0YShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCwNCisJCQkJCQkJCXVuc2lnbmVkIGludCB0YWJsZSwgdW5zaWduZWQgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKQ0KK3sNCisJcmV0dXJuICgoQ1NhbXBsZUZvbnRJbmZvKilwVGhpcyktPkdldEZvbnREYXRhSW1wbChoRm9udCwgdGFibGUsIGJ1ZmZlciwgYnVmX3NpemUpOw0KK30NCisNCit1bnNpZ25lZCBsb25nIFNhbXBsZUdldEZhY2VOYW1lKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250LCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpDQorew0KKwlyZXR1cm4gKChDU2FtcGxlRm9udEluZm8qKXBUaGlzKS0+R2V0RmFjZU5hbWVJbXBsKGhGb250LCBidWZmZXIsIGJ1Zl9zaXplKTsNCit9DQorDQoraW50IFNhbXBsZUdldEZvbnRDaGFyc2V0KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KQ0KK3sNCisJcmV0dXJuICgoQ1NhbXBsZUZvbnRJbmZvKilwVGhpcyktPkdldEZvbnRDaGFyc2V0SW1wbChoRm9udCk7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlRGVsZXRlRm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCkNCit7DQorCSgoQ1NhbXBsZUZvbnRJbmZvKilwVGhpcyktPkRlbGV0ZUZvbnRJbXBsKGhGb250KTsNCit9DQorDQordm9pZCBTZXRTYW1wbGVGb250SW5mbygpDQorew0KKwlDU2FtcGxlRm9udEluZm8qIHBGb250SW5mbyA9IG5ldyBDU2FtcGxlRm9udEluZm87DQorCXBGb250SW5mby0+dmVyc2lvbiA9IDE7DQorCXBGb250SW5mby0+RGVsZXRlRm9udCA9IFNhbXBsZURlbGV0ZUZvbnQ7DQorCXBGb250SW5mby0+RW51bUZvbnRzID0gU2FtcGxlRW51bUZvbnRzOw0KKwlwRm9udEluZm8tPkdldEZhY2VOYW1lID0gU2FtcGxlR2V0RmFjZU5hbWU7DQorCXBGb250SW5mby0+R2V0Rm9udCA9IE5VTEw7DQorCXBGb250SW5mby0+R2V0Rm9udENoYXJzZXQgPSBTYW1wbGVHZXRGb250Q2hhcnNldDsNCisJcEZvbnRJbmZvLT5HZXRGb250RGF0YSA9IFNhbXBsZUdldEZvbnREYXRhOw0KKwlwRm9udEluZm8tPk1hcEZvbnQgPSBTYW1wbGVNYXBGb250Ow0KKwlwRm9udEluZm8tPlJlbGVhc2UgPSBTYW1wbGVSZWxlYXNlOw0KKwlGUERGX1NldFN5c3RlbUZvbnRJbmZvKHBGb250SW5mbyk7DQorfQ0KKw0KK3ZvaWQgCVNhbXBsZV9FeGVjdXRlTmFtZWRBY3Rpb24oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfQllURVNUUklORyBuYW1lZEFjdGlvbikNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICggcFZpZXcgKQ0KKwl7DQorCQkgcFZpZXctPkV4ZWN1dGVOYW1lZEFjdGlvbkltcGwobmFtZWRBY3Rpb24pOw0KKwl9DQorDQorfQ0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6RXhlY3V0ZU5hbWVkQWN0aW9uSW1wbChGUERGX0JZVEVTVFJJTkcgbmFtZWRhY3Rpb24pDQorew0KKwlpZihzdHJjbXAoIlByaW50IiwgKExQQ1NUUiluYW1lZGFjdGlvbikgPT0gMCkNCisJCU9uRmlsZVByaW50KCk7DQorfQ0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T3V0cHV0U2VsZWN0ZWRSZWN0SW1wbChGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkNCit7DQorDQorCWlmKHBhZ2UgPT0gbV9wUGFnZSkNCisJew0KKw0KKyAJCWludCBkZXZpY2VfbGVmdCwgZGV2aWNlX3RvcCwgZGV2aWNlX3JpZ2h0LCBkZXZpY2VfYm90dG9tOw0KKwkJDQorCQlpbnQgbkFjdHVhbFJhbmdlWCA9IDA7DQorCQlpbnQgbkFjdHVhbFJhbmdlWSA9IDA7DQorCQlpZiAoIG1fblJvdGF0ZUZsYWcgJSAyID09IDAgKQ0KKwkJew0KKwkJCW5BY3R1YWxSYW5nZVggPSBtX25BY3R1YWxTaXplWDsNCisJCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVk7DQorCQl9ZWxzZXsNCisJCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVk7DQorCQkJbkFjdHVhbFJhbmdlWSA9IG1fbkFjdHVhbFNpemVYOw0KKwkJfQ0KKwkJDQorCQlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgKGludCkobkFjdHVhbFJhbmdlWCAqIG1fZGJTY2FsZUZhY3RvciksDQorCQkJKGludCkobkFjdHVhbFJhbmdlWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIGxlZnQsIHRvcCwgJmRldmljZV9sZWZ0LCAmZGV2aWNlX3RvcCk7DQorCQkNCisJCUZQREZfUGFnZVRvRGV2aWNlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCAoaW50KShuQWN0dWFsUmFuZ2VYICogbV9kYlNjYWxlRmFjdG9yKSwNCisJCQkoaW50KShuQWN0dWFsUmFuZ2VZICogbV9kYlNjYWxlRmFjdG9yKSwgbV9uUm90YXRlRmxhZywgcmlnaHQsIGJvdHRvbSwgJmRldmljZV9yaWdodCwgJmRldmljZV9ib3R0b20pOw0KKwkJDQorCQlDUmVjdCByYyhkZXZpY2VfbGVmdCxkZXZpY2VfdG9wLCBkZXZpY2VfcmlnaHQsIGRldmljZV9ib3R0b20pOw0KKw0KKw0KKw0KKwkJbV9TZWxlY3RBcnJheS5BZGQocmMpOw0KKw0KKw0KKwl9DQorfQ0KKw0KK3ZvaWQJCVNhbXBsZV9SZWxlYXNlKEZQREZfTFBWT0lEIGNsaWVudERhdGEpDQorew0KKwlpZiAoIWNsaWVudERhdGEpIHJldHVybjsNCisNCisJZmNsb3NlKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSk7DQorCWRlbGV0ZSAoKEZQREZfRklMRSopY2xpZW50RGF0YSk7DQorfQ0KKw0KK0ZQREZfRFdPUkQJU2FtcGxlX0dldFNpemUoRlBERl9MUFZPSUQgY2xpZW50RGF0YSkNCit7DQorCWlmICghY2xpZW50RGF0YSkgcmV0dXJuIDA7DQorDQorCWxvbmcgY3VyUG9zID0gZnRlbGwoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlKTsNCisJZnNlZWsoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlLCAwLCBTRUVLX0VORCk7DQorCWxvbmcgc2l6ZSA9IGZ0ZWxsKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSk7DQorCWZzZWVrKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSwgY3VyUG9zLCBTRUVLX1NFVCk7DQorDQorCXJldHVybiAoRlBERl9EV09SRClzaXplOw0KK30NCisNCitGUERGX1JFU1VMVAlTYW1wbGVfUmVhZEJsb2NrKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgb2Zmc2V0LCBGUERGX0xQVk9JRCBidWZmZXIsIEZQREZfRFdPUkQgc2l6ZSkNCit7DQorCWlmICghY2xpZW50RGF0YSkgcmV0dXJuIC0xOw0KKw0KKwlmc2VlaygoKEZQREZfRklMRSopY2xpZW50RGF0YSktPmZpbGUsIChsb25nKW9mZnNldCwgU0VFS19TRVQpOw0KKwlzaXplX3QgcmVhZFNpemUgPSBmcmVhZChidWZmZXIsIDEsIHNpemUsICgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSk7DQorCXJldHVybiByZWFkU2l6ZSA9PSBzaXplID8gMCA6IC0xOw0KK30NCisNCitGUERGX1JFU1VMVAlTYW1wbGVfV3JpdGVCbG9jayhGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUENWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKQ0KK3sNCisJaWYgKCFjbGllbnREYXRhKSByZXR1cm4gLTE7DQorDQorCWZzZWVrKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSwgKGxvbmcpb2Zmc2V0LCBTRUVLX1NFVCk7DQorCS8vV3JpdGUgZGF0YQ0KKwlzaXplX3Qgd3JpdGVTaXplID0gZndyaXRlKGJ1ZmZlciwgMSwgc2l6ZSwgKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlKTsNCisJcmV0dXJuIHdyaXRlU2l6ZSA9PSBzaXplID8gMCA6IC0xOw0KK30NCisNCitGUERGX1JFU1VMVAlTYW1wbGVfRmx1c2goRlBERl9MUFZPSUQgY2xpZW50RGF0YSkNCit7DQorCWlmICghY2xpZW50RGF0YSkgcmV0dXJuIC0xOw0KKw0KKwkvL0ZsdXNoIGZpbGUNCisJZmZsdXNoKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitGUERGX1JFU1VMVAlTYW1wbGVfVHJ1bmNhdGUoRlBERl9MUFZPSUQgY2xpZW50RGF0YSwgRlBERl9EV09SRCBzaXplKQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3ZvaWQJU2FtcGxlX0Rpc3BsYXlDYXJldChzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UsIEZQREZfQk9PTCBiVmlzaWJsZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0oQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICghcFZpZXcpIHJldHVybjsNCisNCisJSFdORCBoV25kID0gcFZpZXctPm1faFduZDsNCisNCisJaWYgKGJWaXNpYmxlKQ0KKwl7DQorCQlDUG9pbnQgbHRQdDsNCisJCXBWaWV3LT5QYWdlVG9EZXZpY2UobGVmdCwgdG9wLCBsdFB0KTsNCisJCUNQb2ludCByYlB0Ow0KKwkJcFZpZXctPlBhZ2VUb0RldmljZShyaWdodCwgYm90dG9tLCByYlB0KTsNCisJCUNSZWN0IHJjQ2FyZXQobHRQdCwgcmJQdCk7DQorCQkNCisJCTo6RGVzdHJveUNhcmV0KCk7DQorCQk6OkNyZWF0ZUNhcmV0KGhXbmQsIChIQklUTUFQKTAsIHJjQ2FyZXQuV2lkdGgoKSwgcmNDYXJldC5IZWlnaHQoKSk7DQorCQk6OlNldENhcmV0UG9zIChyY0NhcmV0LmxlZnQsIHJjQ2FyZXQudG9wKTsNCisJCTo6U2hvd0NhcmV0KGhXbmQpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJOjpEZXN0cm95Q2FyZXQoKTsNCisJCTo6SGlkZUNhcmV0KGhXbmQpOw0KKwl9DQorfQ0KKw0KK2ludAkJU2FtcGxlX0dldEN1cnJlbnRQYWdlSW5kZXgoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9KENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIXBWaWV3KSByZXR1cm4gLTE7DQorDQorCXJldHVybiBwVmlldy0+R2V0Q3VycmVudFBhZ2VJbmRleCgpOw0KK30NCisNCit2b2lkCVNhbXBsZV9TZXRDdXJyZW50UGFnZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGlDdXJQYWdlKQ0KK3sNCisJQ1JlYWRlclZDVmlldyogcFZpZXcgPSAoQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICghcFZpZXcpIHJldHVybjsNCisNCisJRlBERl9ET0NVTUVOVCBjdXJEb2MgPSBwVmlldy0+R2V0UERGRG9jKCk7DQorCWlmIChjdXJEb2MgIT0gZG9jdW1lbnQpDQorCQlyZXR1cm47DQorDQorCWludCBuUGFnZUNvdW50ID0gRlBERl9HZXRQYWdlQ291bnQoY3VyRG9jKTsNCisJaWYgKG5QYWdlQ291bnQgPiBpQ3VyUGFnZSkNCisJew0KKwkJaW50IG5DdXJQYWdlSW54ID0gcFZpZXctPkdldEN1cnJlbnRQYWdlSW5kZXgoKTsNCisJCWlmIChuQ3VyUGFnZUlueCAhPSBpQ3VyUGFnZSkNCisJCXsNCisJCQlwVmlldy0+R290b1BhZ2UobkN1clBhZ2VJbngpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK3ZvaWQJU2FtcGxlX0dvdG9VUkwoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lERVNUUklORyB3c1VSTCkNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0gKENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIXBWaWV3KSByZXR1cm47DQorDQorCXdjaGFyX3QqIHBVUkwgPSAod2NoYXJfdCopd3NVUkw7DQorCU1lc3NhZ2VCb3hXKE5VTEwsIHBVUkwsIE5VTEwsIE1CX09LKTsNCit9DQorDQorRlBERl9XSURFU1RSSU5HCVNhbXBsZV9HZXRVUkwoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9IChDUmVhZGVyVkNWaWV3KilwVGhpczsNCisJaWYgKCFwVmlldykgcmV0dXJuIE5VTEw7DQorDQorCWlmIChwVmlldy0+R2V0UERGRG9jKCkgIT0gZG9jdW1lbnQpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJLy9ub3Qgc3VwcG9ydCBpbiB0aGlzIGRlbW8NCisNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlX0FkZERvUmVjb3JkKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KQ0KK3sNCisJLy9ub3Qgc3VwcG9ydA0KK30NCisNCit2b2lkCVNhbXBsZV9QYWdlRXZlbnQoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlLCBGUERGX0RXT1JEIGV2ZW50RmxhZykNCit7DQorCS8vDQorfQ0KKw0KK3ZvaWQJU2FtcGxlX0dldFBhZ2VWaWV3UmVjdChzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSogbGVmdCwgZG91YmxlKiB0b3AsIGRvdWJsZSogcmlnaHQsIGRvdWJsZSogYm90dG9tKQ0KK3sNCisJQ1JlYWRlclZDVmlldyogcFZpZXcgPSAoQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICghcFZpZXcpIHJldHVybjsNCisNCisJaWYgKHBWaWV3LT5HZXRQYWdlKCkgIT0gcGFnZSkNCisJCXJldHVybjsNCisNCisJQ1JlY3QgY2xpZW50UmVjdDsNCisJcFZpZXctPkdldENsaWVudFJlY3QoJmNsaWVudFJlY3QpOw0KKw0KKwkqbGVmdCA9IChkb3VibGUpY2xpZW50UmVjdC5sZWZ0Ow0KKwkqcmlnaHQgPSAoZG91YmxlKWNsaWVudFJlY3QucmlnaHQ7DQorCSp0b3AgPSAoZG91YmxlKWNsaWVudFJlY3QudG9wOw0KKwkqYm90dG9tID0gKGRvdWJsZSljbGllbnRSZWN0LmJvdHRvbTsNCit9DQorDQorI2RlZmluZQkgV01fWEZBTUVOVV9DT1BZCSAgMTAwMDANCisNCitGUERGX0JPT0wgU2FtcGxlX1BvcHVwTWVudShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UsIEZQREZfV0lER0VUIGhXaWRnZXQsIGludCBtZW51RmxhZywgZmxvYXQgeCwgZmxvYXQgeSkNCit7DQorCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0gKENSZWFkZXJWQ1ZpZXcqKXBUaGlzOw0KKwlpZiAoIXBWaWV3KQ0KKwkJcmV0dXJuIEZBTFNFOw0KKw0KKwlDTWVudSBtZW51Ow0KKwltZW51LkNyZWF0ZVBvcHVwTWVudSgpOw0KKw0KKwlpbnQgbk1lbnVJbmRleCA9IDA7DQorDQorCWlmIChtZW51RmxhZyAmIEZYRkFfTUVNVV9DT1BZKQ0KKwkJbWVudS5JbnNlcnRNZW51KG5NZW51SW5kZXgrKywgTUZfQllQT1NJVElPTiwgV01fWEZBTUVOVV9DT1BZLCAiQ29weSIpOw0KKwkvLy4uLg0KKw0KKwlDUG9pbnQgcHQ7DQorCXBWaWV3LT5QYWdlVG9EZXZpY2UoeCwgeSwgcHQpOw0KKw0KKwlVSU5UIG5JRCA9IG1lbnUuVHJhY2tQb3B1cE1lbnUoVFBNX1JJR0hUQlVUVE9OLCBwdC54LCBwdC55LCBwVmlldyk7DQorCXN3aXRjaChuSUQpDQorCXsNCisJY2FzZSBXTV9YRkFNRU5VX0NPUFk6DQorCQl7DQorCQkJRlBERl9EV09SRCBsZW5ndGggPSAwOw0KKwkJCUZQREZfV2lkZ2V0X0NvcHkocFZpZXctPkdldFBERkRvYygpLCBoV2lkZ2V0LCBOVUxMLCAmbGVuZ3RoKTsNCisJCQlpZiAobGVuZ3RoID4gMCkNCisJCQl7DQorCQkJCXVuc2lnbmVkIHNob3J0KiBidWZmZXIgPSAodW5zaWduZWQgc2hvcnQqKW1hbGxvYygobGVuZ3RoKzEpKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKwkJCQltZW1zZXQoYnVmZmVyLCAwLCAobGVuZ3RoKzEpKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKwkJCQlGUERGX1dpZGdldF9Db3B5KHBWaWV3LT5HZXRQREZEb2MoKSwgaFdpZGdldCwgYnVmZmVyLCAmbGVuZ3RoKTsNCisJCQkJZnJlZShidWZmZXIpOw0KKwkJCX0NCisJCX0NCisJCWJyZWFrOw0KKwl9DQorDQorCW1lbnUuRGVzdHJveU1lbnUoKTsNCisNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZQREZfRklMRUhBTkRMRVIqIFNhbXBsZV9PcGVuRmlsZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IGZpbGVGbGFnLCBGUERGX1dJREVTVFJJTkcgd3NVUkwpDQorew0KKwljaGFyKiBwc3pVUkw7DQorCUNTdHJpbmcgc3RyVVJMOw0KKwlpZiAod3NVUkwgPT0gTlVMTCkgew0KKwkJaWYgKGZpbGVGbGFnID09IEZYRkFfRklMRV9YRFApDQorCQkJc3RyVVJMID0gIkM6Ly90ZW1wLnhkcCI7DQorCQllbHNlIGlmKGZpbGVGbGFnID09IEZYRkFfRklMRV9YTUwpDQorCQkJc3RyVVJMID0gIkM6Ly90ZW1wLnhtbCI7DQorCX0NCisJZWxzZSB7DQorCQlpbnQgaVNpemU7DQorCQlpU2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAoTFBDV1NUUil3c1VSTCwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOw0KKwkJcHN6VVJMID0gKGNoYXIqKW1hbGxvYygoaVNpemUrMSkpOw0KKwkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzVVJMLCAtMSwgcHN6VVJMLCBpU2l6ZSwgTlVMTCwgTlVMTCk7DQorCQlDU3RyaW5nIHN0cihwc3pVUkwpOw0KKwkJc3RyVVJMID0gc3RyOw0KKwl9DQorCQ0KKw0KKwlGSUxFKiBmaWxlID0gZm9wZW4oc3RyVVJMLCAiciIpOw0KKwlGUERGX0ZJTEUqIHBGaWxlSGFuZGVyID0gbmV3IEZQREZfRklMRTsNCisJcEZpbGVIYW5kZXItPmZpbGUgPSBmaWxlOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuY2xpZW50RGF0YSA9IHBGaWxlSGFuZGVyOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuRmx1c2ggPSBTYW1wbGVfRmx1c2g7DQorCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5HZXRTaXplID0gU2FtcGxlX0dldFNpemU7DQorCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5SZWFkQmxvY2sgPSBTYW1wbGVfUmVhZEJsb2NrOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuUmVsZWFzZSA9IFNhbXBsZV9SZWxlYXNlOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuVHJ1bmNhdGUgPSBTYW1wbGVfVHJ1bmNhdGU7DQorCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5Xcml0ZUJsb2NrID0gU2FtcGxlX1dyaXRlQmxvY2s7DQorDQorCWZyZWUocHN6VVJMKTsNCisJcmV0dXJuICZwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXI7DQorfQ0KKw0KK0ZQREZfQk9PTCBTYW1wbGVfR2V0RmlsZVBhdGgoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciwgRlBERl9CU1RSKiBwYXRoKQ0KK3sNCisJQ1JlYWRlclZDVmlldyogcFZpZXcgPSAoQ1JlYWRlclZDVmlldyopcFRoaXM7DQorCWlmICghcFZpZXcpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJQ1N0cmluZyBmaWxlUGF0aCA9IHBWaWV3LT5HZXRGaWxlUGF0aCgpOw0KKwlGUERGX0JTdHJfU2V0KHBhdGgsIGZpbGVQYXRoLkdldEJ1ZmZlcihmaWxlUGF0aC5HZXRMZW5ndGgoKSksIGZpbGVQYXRoLkdldExlbmd0aCgpKTsNCisNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK3ZvaWQJU2FtcGxlX0VtYWlsVG8oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLCBGUERGX1dJREVTVFJJTkcgZW1haWxUbykNCit7DQorCU1lc3NhZ2VCb3hXKE5VTEwsICh3Y2hhcl90KillbWFpbFRvLCBMIlNhbXBsZV9lbWFpbCIsIE1CX09LKTsNCit9DQorDQordm9pZAlTYW1wbGVfVXBsb2FkVG8oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLCBGUERGX1dJREVTVFJJTkcgdXBsb2FkVG8pDQorew0KKwlpbnQgaVNpemU7DQorCWNoYXIqIHBzelVSTDsNCisJaVNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpdXBsb2FkVG8sIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsNCisJcHN6VVJMID0gKGNoYXIqKW1hbGxvYygoaVNpemUrMSkpOw0KKwlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpdXBsb2FkVG8sIC0xLCBwc3pVUkwsIGlTaXplLCBOVUxMLCBOVUxMKTsNCisJQ1N0cmluZyBzdHJQYXRoKHBzelVSTCk7DQorDQorCUNTdHJpbmcgc3RyVXBsb2FkUGF0aCA9ICJDOi8vdGVzdCI7DQorCWludCBwb3MgPSBzdHJQYXRoLlJldmVyc2VGaW5kKCcuJyk7DQorCWlmIChwb3MgIT0gLTEpew0KKwkJQ1N0cmluZyBzdWZmaXggPSBzdHJQYXRoLlJpZ2h0KHN0clBhdGguR2V0TGVuZ3RoKCktcG9zKTsNCisJCXN0clVwbG9hZFBhdGggKz0gc3VmZml4Ow0KKwl9DQorDQorCUZJTEUqIGZpbGUgPSBmb3BlbihzdHJVcGxvYWRQYXRoLCAiciIpOw0KKwlpZiAoZmlsZSkgew0KKwkJaW50IHNpemUgPSBmaWxlSGFuZGxlci0+R2V0U2l6ZShmaWxlSGFuZGxlci0+Y2xpZW50RGF0YSk7DQorCQlCWVRFKiBidWZmZXIgPSAoQllURSopbWFsbG9jKHNpemUpOw0KKwkJZmlsZUhhbmRsZXItPlJlYWRCbG9jayhmaWxlSGFuZGxlci0+Y2xpZW50RGF0YSwgMCwgYnVmZmVyLCBzaXplKTsNCisJCWZ3cml0ZShidWZmZXIsIHNpemUsIDEsIGZpbGUpOw0KKwkJZmZsdXNoKGZpbGUpOw0KKwkJZmNsb3NlKGZpbGUpOw0KKwkJZnJlZShidWZmZXIpOw0KKwl9DQorDQorCWZyZWUocHN6VVJMKTsNCit9DQorDQoraW50CQlTYW1wbGVfR2V0QXBwTmFtZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgdm9pZCogYXBwTmFtZSwgaW50IGxlbmd0aCkNCit7DQorCWlmKGFwcE5hbWUgPT0gTlVMTCB8fCBsZW5ndGggPD0gMCkNCisJew0KKwkJQ1N0cmluZyBuYW1lID0gQWZ4R2V0QXBwTmFtZSgpOw0KKwkJcmV0dXJuIG5hbWUuR2V0TGVuZ3RoKCk7DQorCX0JDQorCWVsc2UNCisJew0KKwkJQ1N0cmluZyBuYW1lID0gQWZ4R2V0QXBwTmFtZSgpOw0KKwkJaW50IGxlbiA9IG5hbWUuR2V0TGVuZ3RoKCk7DQorCQlpZihsZW5ndGggPiBsZW4pDQorCQkJbGVuZ3RoID0gbGVuOw0KKwkJbWVtY3B5KGFwcE5hbWUsIG5hbWUuR2V0QnVmZmVyKG5hbWUuR2V0TGVuZ3RoKCkpLCBsZW5ndGgpOw0KKwkJcmV0dXJuIGxlbmd0aDsNCisJfQ0KK30NCisNCitpbnQJCVNhbXBsZV9HZXRQbGF0Zm9ybShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgdm9pZCogcGxhdGZvcm0sIGludCBsZW5ndGgpDQorew0KKwlpZihwbGF0Zm9ybSA9PSBOVUxMIHx8IGxlbmd0aCA8PSAwKQ0KKwl7DQorCQlyZXR1cm4gMzsNCisJfQkNCisJZWxzZQ0KKwl7DQorCQlpZihsZW5ndGggPiAzKQ0KKwkJCWxlbmd0aCA9IDM7DQorCQltZW1jcHkocGxhdGZvcm0sICJ3aW4iLCBsZW5ndGgpOw0KKwkJcmV0dXJuIGxlbmd0aDsNCisJfQ0KK30NCisNCitpbnQJCVNhbXBsZV9HZXREb2N1bWVudENvdW50KHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKQ0KK3sNCisJcmV0dXJuIDE7DQorfQ0KKw0KK2ludAkJU2FtcGxlX0dldEN1ckRvY3VtZW50SW5kZXgoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpDQorew0KKwlyZXR1cm4gMDsNCit9DQorDQorRlBERl9MUEZJTEVIQU5ETEVSCVNhbXBsZV9Eb3dubG9hZEZyb21VUkwoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyBVUkwpDQorew0KKwlpbnQgaVNpemU7DQorCWNoYXIqIHBzelVSTDsNCisJaVNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpVVJMLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorCXBzelVSTCA9IChjaGFyKiltYWxsb2MoKGlTaXplKzEpKTsNCisJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKVVSTCwgLTEsIHBzelVSTCwgaVNpemUsIE5VTEwsIE5VTEwpOw0KKwlDU3RyaW5nIHN0clVSTChwc3pVUkwpOw0KKw0KKwlDU3RyaW5nIGJzTG9jYWwgPSBzdHJVUkw7DQorCUNSZWFkZXJWQ1ZpZXc6OkNyZWF0ZUxvY2FsUGF0aChic0xvY2FsKTsNCisNCisJaWYgKHN0clVSTC5MZWZ0KDcpID09ICJodHRwOi8vIikNCisJew0KKwkJQ0ludGVybmV0U2Vzc2lvbiBzZXNzOw0KKwkJQ0h0dHBGaWxlICpwRmlsZSA9IChDSHR0cEZpbGUqKXNlc3MuT3BlblVSTChzdHJVUkwpOw0KKwkJaW50IGlMZW5ndGggPSBwRmlsZS0+R2V0TGVuZ3RoKCk7DQorCQlpZiAocEZpbGUgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgcmV0dXJuIE5VTEw7DQorDQorCQlGSUxFICpwSW1hZ2VGaWxlID0gZm9wZW4oYnNMb2NhbCwgIndiIik7DQorDQorCQlCWVRFKiBwQ29udGVudCA9IG5ldyBCWVRFW2lMZW5ndGhdOw0KKwkJbWVtc2V0KHBDb250ZW50LCAwLCBpTGVuZ3RoKTsNCisJCWludCBpUmVhZCA9IHBGaWxlLT5SZWFkKHBDb250ZW50LCBpTGVuZ3RoKTsNCisNCisJCWZ3cml0ZShwQ29udGVudCwgMSwgaUxlbmd0aCwgcEltYWdlRmlsZSk7DQorCQlmcmVlKHBDb250ZW50KTsNCisJCWZmbHVzaChwSW1hZ2VGaWxlKTsNCisJCWZjbG9zZShwSW1hZ2VGaWxlKTsNCisNCisJCXBGaWxlLT5DbG9zZSgpOw0KKwkJZGVsZXRlIHBGaWxlOw0KKwkJc2Vzcy5DbG9zZSgpOw0KKwl9DQorCWVsc2UgaWYgKHN0clVSTC5MZWZ0KDYpID09ICJmdHA6Ly8iKQ0KKwl7DQorCQlDSW50ZXJuZXRTZXNzaW9uIHNlc3M7DQorCQlDRnRwQ29ubmVjdGlvbiogcENvbm5lY3QgPSBzZXNzLkdldEZ0cENvbm5lY3Rpb24oYnNMb2NhbCwgIk5VTEwiLCAiTlVMTCIpOyANCisJCUNJbnRlcm5ldEZpbGUqIHBGaWxlID0gcENvbm5lY3QtPk9wZW5GaWxlKGJzTG9jYWwpOw0KKw0KKwkJaW50IGlMZW5ndGggPSBwRmlsZS0+R2V0TGVuZ3RoKCk7DQorCQlpZiAocEZpbGUgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgcmV0dXJuIE5VTEw7DQorCQlGSUxFICpwSW1hZ2VGaWxlID0gZm9wZW4oYnNMb2NhbCwgIndiIik7DQorDQorCQlCWVRFKiBwQ29udGVudCA9IG5ldyBCWVRFW2lMZW5ndGhdOw0KKwkJbWVtc2V0KHBDb250ZW50LCAwLCBpTGVuZ3RoKTsNCisJCWludCBpUmVhZCA9IHBGaWxlLT5SZWFkKHBDb250ZW50LCBpTGVuZ3RoKTsNCisNCisJCWZ3cml0ZShwQ29udGVudCwgMSwgaUxlbmd0aCwgcEltYWdlRmlsZSk7DQorCQlmcmVlKHBDb250ZW50KTsNCisJCWZmbHVzaChwSW1hZ2VGaWxlKTsNCisJCWZjbG9zZShwSW1hZ2VGaWxlKTsNCisNCisJCXBGaWxlLT5DbG9zZSgpOw0KKwkJZGVsZXRlIHBGaWxlOw0KKwkJc2Vzcy5DbG9zZSgpOw0KKwl9CQ0KKwkNCisJZnJlZShwc3pVUkwpOw0KKwkNCisJRlBERl9GSUxFKiBmaWxlV3JhcCA9IG5ldyBGUERGX0ZJTEU7DQorCUZJTEUqIGZpbGUgPSBmb3Blbihic0xvY2FsLCAiciIpOw0KKwlmaWxlV3JhcC0+ZmlsZSA9IGZpbGU7DQorCWZpbGVXcmFwLT5maWxlSGFuZGxlci5jbGllbnREYXRhID0gZmlsZVdyYXA7DQorCWZpbGVXcmFwLT5maWxlSGFuZGxlci5SZWFkQmxvY2sgPSBTYW1wbGVfUmVhZEJsb2NrOw0KKwlmaWxlV3JhcC0+ZmlsZUhhbmRsZXIuR2V0U2l6ZSA9IFNhbXBsZV9HZXRTaXplOw0KKwlmaWxlV3JhcC0+ZmlsZUhhbmRsZXIuRmx1c2ggPSBTYW1wbGVfRmx1c2g7DQorCWZpbGVXcmFwLT5maWxlSGFuZGxlci5SZWxlYXNlID0gU2FtcGxlX1JlbGVhc2U7DQorCWZpbGVXcmFwLT5maWxlSGFuZGxlci5UcnVuY2F0ZSA9IFNhbXBsZV9UcnVuY2F0ZTsNCisJZmlsZVdyYXAtPmZpbGVIYW5kbGVyLldyaXRlQmxvY2sgPSBTYW1wbGVfV3JpdGVCbG9jazsNCisNCisJcmV0dXJuICZmaWxlV3JhcC0+ZmlsZUhhbmRsZXI7DQorfQ0KKw0KK0ZQREZfQk9PTAlTYW1wbGVfUG9zdFJlcXVlc3RVUkwoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzQ29udGVudFR5cGUsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSwgRlBERl9XSURFU1RSSU5HIHdzSGVhZGVyLCBGUERGX0JTVFIqIHJlc3BvbmUpDQorew0KKwlpbnQgaVNpemU7DQorCWNoYXIqIHBzelVSTDsNCisJaVNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpd3NVUkwsIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsNCisJcHN6VVJMID0gKGNoYXIqKW1hbGxvYygoaVNpemUrMSkpOw0KKwlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpd3NVUkwsIC0xLCBwc3pVUkwsIGlTaXplLCBOVUxMLCBOVUxMKTsNCisJQ1N0cmluZyBjc1VSTChwc3pVUkwpOw0KKw0KKwljaGFyKiBwc3pEYXRhOw0KKwlpU2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAoTFBDV1NUUil3c0RhdGEsIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsNCisJcHN6RGF0YSA9IChjaGFyKiltYWxsb2MoaVNpemUrMSk7DQorCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAoTFBDV1NUUil3c0RhdGEsIC0xLCBwc3pEYXRhLCBpU2l6ZSwgTlVMTCwgTlVMTCk7DQorCUNTdHJpbmcgY3NEYXRhKHBzekRhdGEpOw0KKwkNCisJY2hhciogcHN6Q29udGVudFR5cGU7DQorCWlTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzQ29udGVudFR5cGUsIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsNCisJcHN6Q29udGVudFR5cGUgPSAoY2hhciopbWFsbG9jKGlTaXplKzEpOw0KKwlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpd3NDb250ZW50VHlwZSwgLTEsIHBzekNvbnRlbnRUeXBlLCBpU2l6ZSwgTlVMTCwgTlVMTCk7DQorCUNTdHJpbmcgY3NDb250ZW50VHlwZShwc3pDb250ZW50VHlwZSk7DQorCQ0KKwljaGFyKiBwc3pIZWFkZXI7DQorCWlTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzSGVhZGVyLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorCXBzekhlYWRlciA9IChjaGFyKiltYWxsb2MoaVNpemUrMSk7DQorCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAoTFBDV1NUUil3c0hlYWRlciwgLTEsIHBzekhlYWRlciwgaVNpemUsIE5VTEwsIE5VTEwpOw0KKwlDU3RyaW5nIGNzSGVhZGVyKHBzekhlYWRlcik7DQorDQorCUNTdHJpbmcgY3NBcHAgPSBBZnhHZXRBcHBOYW1lKCk7DQorCWNzQXBwICs9IEwiLzEuMCI7DQorCUJPT0wgYlJldCA9IEZBTFNFOw0KKwlEV09SRCBkd1NlcnZpY2VUeXBlID0gMCwgZHdGbGFncyA9IElDVV9OT19NRVRBOw0KKwlDU3RyaW5nIGNzU2VydmVyLCBzT2JqZWN0LCBjc1VzZXJOYW1lLCBjc1Bhc3N3b3JkOw0KKwlJTlRFUk5FVF9QT1JUIG5Qb3J0ID0gMDsNCisNCisJYlJldCA9IEFmeFBhcnNlVVJMRXgoY3NVUkwsIGR3U2VydmljZVR5cGUsIGNzU2VydmVyLCBzT2JqZWN0LCBuUG9ydCwgY3NVc2VyTmFtZSwgY3NQYXNzd29yZCwgZHdGbGFncyk7DQorCWlmICghYlJldCkNCisJCXJldHVybiBiUmV0Ow0KKw0KKwlpZiAoZHdTZXJ2aWNlVHlwZSAhPSBBRlhfSU5FVF9TRVJWSUNFX0hUVFAgJiYgZHdTZXJ2aWNlVHlwZSAhPSBBRlhfSU5FVF9TRVJWSUNFX0hUVFBTKQ0KKwkJcmV0dXJuIGJSZXQ7DQorDQorCUNTdHJpbmcgY3NPYmplY3QgPSBzT2JqZWN0Ow0KKwlDU3RyaW5nIGNzUmVzcG9uc2U7DQorCWJSZXQgPSBDUmVhZGVyVkNWaWV3OjpIdHRwRGF0YVBvc3QoY3NEYXRhLCBjc0FwcCwgY3NPYmplY3QsIGNzU2VydmVyLCBjc1VzZXJOYW1lLCBjc1Bhc3N3b3JkLCBuUG9ydCwNCisJCWR3U2VydmljZVR5cGUgPT0gQUZYX0lORVRfU0VSVklDRV9IVFRQUywgY3NDb250ZW50VHlwZSwgY3NIZWFkZXIsIGNzUmVzcG9uc2UpOw0KKw0KKwlGUERGX0JTdHJfSW5pdChyZXNwb25lKTsNCisJRlBERl9CU3RyX1NldChyZXNwb25lLCAoRlBERl9MUENTVFIpY3NSZXNwb25zZS5HZXRCdWZmZXIoY3NSZXNwb25zZS5HZXRMZW5ndGgoKSksIGNzUmVzcG9uc2UuR2V0TGVuZ3RoKCkpOw0KKw0KKwlmcmVlKHBzelVSTCk7DQorCWZyZWUocHN6RGF0YSk7DQorCWZyZWUocHN6Q29udGVudFR5cGUpOw0KKwlmcmVlKHBzekhlYWRlcik7DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitGUERGX0JPT0wJU2FtcGxlX1B1dFJlcXVlc3RVUkwoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzRW5jb2RlKQ0KK3sNCisJaW50IGlTaXplOw0KKwljaGFyKiBwc3pVUkw7DQorCWlTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzVVJMLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorCXBzelVSTCA9IChjaGFyKiltYWxsb2MoKGlTaXplKzEpKTsNCisJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzVVJMLCAtMSwgcHN6VVJMLCBpU2l6ZSwgTlVMTCwgTlVMTCk7DQorCUNTdHJpbmcgY3NVUkwocHN6VVJMKTsNCisNCisJY2hhciogcHN6RGF0YTsNCisJaVNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQQ1dTVFIpd3NEYXRhLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorCXBzekRhdGEgPSAoY2hhciopbWFsbG9jKChpU2l6ZSsxKSk7DQorCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAoTFBDV1NUUil3c0RhdGEsIC0xLCBwc3pEYXRhLCBpU2l6ZSwgTlVMTCwgTlVMTCk7DQorCUNTdHJpbmcgY3NEYXRhKHBzekRhdGEpOw0KKw0KKwlDU3RyaW5nIGNzQXBwID0gQWZ4R2V0QXBwTmFtZSgpOw0KKwljc0FwcCArPSBMIi8xLjAiOw0KKwlCT09MIGJSZXQgPSBGQUxTRTsNCisJRFdPUkQgZHdTZXJ2aWNlVHlwZSA9IDAsIGR3RmxhZ3MgPSBJQ1VfTk9fTUVUQTsNCisJQ1N0cmluZyBjc1NlcnZlciwgc09iamVjdCwgY3NVc2VyTmFtZSwgY3NQYXNzd29yZDsNCisJSU5URVJORVRfUE9SVCBuUG9ydCA9IDA7DQorDQorCWJSZXQgPSBBZnhQYXJzZVVSTEV4KGNzVVJMLCBkd1NlcnZpY2VUeXBlLCBjc1NlcnZlciwgc09iamVjdCwgblBvcnQsIGNzVXNlck5hbWUsIGNzUGFzc3dvcmQsIGR3RmxhZ3MpOw0KKwlpZiAoIWJSZXQpDQorCQlyZXR1cm4gYlJldDsNCisNCisJaWYgKGR3U2VydmljZVR5cGUgIT0gQUZYX0lORVRfU0VSVklDRV9IVFRQICYmIGR3U2VydmljZVR5cGUgIT0gQUZYX0lORVRfU0VSVklDRV9IVFRQUykNCisJCXJldHVybiBiUmV0Ow0KKw0KKwlDU3RyaW5nIGNzT2JqZWN0ID0gc09iamVjdDsNCisNCisJYlJldCA9IENSZWFkZXJWQ1ZpZXc6Okh0dHBEYXRhUHV0KGNzRGF0YSwgY3NBcHAsIGNzT2JqZWN0LCBjc1NlcnZlciwgY3NVc2VyTmFtZSwgY3NQYXNzd29yZCwgblBvcnQsIGR3U2VydmljZVR5cGUgPT0gQUZYX0lORVRfU0VSVklDRV9IVFRQUyk7DQorCQ0KKwlmcmVlKHBzekRhdGEpOw0KKwlmcmVlKHBzelVSTCk7DQorCXJldHVybiBUUlVFOw0KK30NCisNCitGUERGX0JPT0wJU2FtcGxlX1Nob3dGaWxlRGlhbG9nKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NUaXRsZSwgRlBERl9XSURFU1RSSU5HIHdzRmlsdGVyLCBGUERGX0JPT0wgaXNPcGVuLCBGUERGX1NUUklOR0hBTkRMRSBwYXRoQXJyKQ0KK3sNCisJaW50IGlTaXplOw0KKwljaGFyKiBwc3pGaWx0ZXI7DQorCWlTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzRmlsdGVyLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorCXBzekZpbHRlciA9IChjaGFyKiltYWxsb2MoKGlTaXplKzEpKTsNCisJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIChMUENXU1RSKXdzRmlsdGVyLCAtMSwgcHN6RmlsdGVyLCBpU2l6ZSwgTlVMTCwgTlVMTCk7DQorDQorCUNGaWxlRGlhbG9nIGZpbGVPcGVuKGlzT3BlbiwgTlVMTCxOVUxMLCBPRk5fSElERVJFQURPTkxZfE9GTl9PVkVSV1JJVEVQUk9NUFR8T0ZOX1BBVEhNVVNURVhJU1R8T0ZOX0ZJTEVNVVNURVhJU1QsIHBzekZpbHRlcik7DQorCS8vCWZpbGVPcGVuLm1fb2ZuLkZsYWdzfD1PRk5fRU5BQkxFSE9PS3xPRk5fQUxMT1dNVUxUSVNFTEVDVDsNCisJaWYoZmlsZU9wZW4uRG9Nb2RhbCgpPT1JRENBTkNFTCkgDQorCXsgDQorCQlyZXR1cm4gRkFMU0U7CQ0KKwl9DQorCQ0KKwlQT1NJVElPTiBwb3M7CQ0KKwlwb3M9ZmlsZU9wZW4uR2V0U3RhcnRQb3NpdGlvbigpOyANCisJQ1N0cmluZyBjc0ZpbGU7DQorCXdoaWxlKHBvcyE9TlVMTCkgDQorCXsgDQorCQljc0ZpbGU9ZmlsZU9wZW4uR2V0TmV4dFBhdGhOYW1lKHBvcyk7IA0KKwkJRlBERl9TdHJpbmdIYW5kbGVBZGRTdHJpbmcocGF0aEFyciwgY3NGaWxlLkdldEJ1ZmZlcihjc0ZpbGUuR2V0TGVuZ3RoKCkpLCBjc0ZpbGUuR2V0TGVuZ3RoKCkpOwkJDQorCX0NCisNCisJZnJlZShwc3pGaWx0ZXIpOw0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorRlBERl9TWVNURU1USU1FIENSZWFkZXJWQ1ZpZXc6OkdldExvY2FsVGltZUltcGwoKQ0KK3sNCisJRlBERl9TWVNURU1USU1FIHN5czsNCisJdGltZV90IGN1clRpbWU7DQorCXRpbWUoJmN1clRpbWUpOw0KKwl0bSogcFRtID0gbG9jYWx0aW1lKCZjdXJUaW1lKTsNCisJaWYocFRtKQ0KKwl7DQorCQlzeXMud0RheSA9IHBUbS0+dG1fbWRheTsNCisJCXN5cy53RGF5T2ZXZWVrPSBwVG0tPnRtX3dkYXk7DQorCQlzeXMud0hvdXIgPSBwVG0tPnRtX2hvdXI7DQorCQlzeXMud01pbGxpc2Vjb25kcyA9IDA7DQorCQlzeXMud01pbnV0ZSA9IHBUbS0+dG1fbWluOw0KKwkJc3lzLndNb250aCA9IHBUbS0+dG1fbW9uOw0KKwkJc3lzLndTZWNvbmQgPSBwVG0tPnRtX3NlYzsNCisJCXN5cy53WWVhciA9IHBUbS0+dG1feWVhciArIDE5MDA7DQorCX0NCisJDQorCXJldHVybiBzeXM7DQorfQ0KKw0KK2ludCBDUmVhZGVyVkNWaWV3OjpHZXRSb3RhdGlvbkltcGwoRlBERl9QQUdFIHBhZ2UpDQorew0KKwlyZXR1cm4gbV9uUm90YXRlRmxhZzsNCit9DQorDQorRlBERl9QQUdFIENSZWFkZXJWQ1ZpZXc6OkdldFBhZ2VJbXBsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsaW50IG5QYWdlSW5kZXgpDQorew0KKwlGUERGX1BBR0UgcGFnZSA9IE5VTEw7DQorCW1fcGFnZU1hcC5Mb29rdXAoblBhZ2VJbmRleCwgcGFnZSk7DQorCWlmKHBhZ2UpDQorCQlyZXR1cm4gcGFnZTsNCisJcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQsIG5QYWdlSW5kZXgpOw0KKwlGT1JNX09uQWZ0ZXJMb2FkUGFnZShwYWdlLCBtX3BBcHApOw0KKwltX3BhZ2VNYXAuU2V0QXQoblBhZ2VJbmRleCwgcGFnZSk7DQorCXJldHVybiBwYWdlOw0KK30NCisNCitGUERGX1BBR0UgQ1JlYWRlclZDVmlldzo6R2V0Q3VycmVudFBhZ2VJbXBsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpDQorew0KKwlyZXR1cm4gbV9wUGFnZTsNCit9DQorDQorYm9vbCBDUmVhZGVyVkNWaWV3OjpJc0FMVEtleURvd25JbXBsKCkNCit7DQorCXJldHVybiBHZXRLZXlTdGF0ZShWS19NRU5VKSA8IDA7DQorfQ0KK2Jvb2wgQ1JlYWRlclZDVmlldzo6SXNJTlNFUlRLZXlEb3duSW1wbCgpDQorew0KKwlyZXR1cm4gR2V0S2V5U3RhdGUoVktfSU5TRVJUKSAmIDB4MDE7DQorfQ0KK2Jvb2wgQ1JlYWRlclZDVmlldzo6SXNTSElGVEtleURvd25JbXBsKCkNCit7DQorCXJldHVybiAhKChHZXRLZXlTdGF0ZShWS19TSElGVCkmMHg4MDAwKSA9PSAwKTsNCit9DQorYm9vbCBDUmVhZGVyVkNWaWV3OjpJc0NUUkxLZXlEb3duSW1wbCgpDQorew0KKwlyZXR1cm4gR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgPCAwOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uQ2hhbmdlSW1wbCgpDQorew0KKw0KK30NCisNCitDU3RyaW5nIENSZWFkZXJWQ1ZpZXc6OkdldEZpbGVQYXRoKCkNCit7DQorCUNSZWFkZXJWQ0RvYyogcERvYyA9IEdldERvY3VtZW50KCk7DQorCWlmKHBEb2MpDQorCXsNCisJCXJldHVybiBwRG9jLT5tX3N0clBERk5hbWU7DQorCX0NCisJcmV0dXJuICIiOw0KK30NCisNCitCT09MIENSZWFkZXJWQ1ZpZXc6OlN1Ym1pdEZvcm1JbXBsKHZvaWQqIHBCdWZmZXIsIGludCBuTGVuZ3RoLCBDU3RyaW5nIHN0clVSTCkNCit7DQorCUNTdHJpbmcgdGVtcEZERkZpbGUgPSAiRDovLzEuZmRmIjsNCisNCisJaWYgKHBCdWZmZXIgPT0gTlVMTCB8fCBuTGVuZ3RoIDw9IDApDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKw0KKwlDRmlsZSBmaWxlOw0KKwlpZiAoZmlsZS5PcGVuKHRlbXBGREZGaWxlLCBDRmlsZTo6bW9kZUNyZWF0ZSB8IENGaWxlOjptb2RlV3JpdGUgfCBDRmlsZTo6dHlwZUJpbmFyeSkpDQorCXsNCisJCWZpbGUuV3JpdGUocEJ1ZmZlciwgbkxlbmd0aCk7DQorCQlmaWxlLkNsb3NlKCk7DQorCX0NCisNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK2ludCBTYW1wbGVfYXBwUmVzcG9uc2Uoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgUXVlc3Rpb24sIEZQREZfV0lERVNUUklORyBUaXRsZSwgDQorCQkJCQkgICBGUERGX1dJREVTVFJJTkcgRGVmYXVsdCwgRlBERl9XSURFU1RSSU5HIGNMYWJlbCwgRlBERl9CT09MIGJQYXNzd29yZCwgdm9pZCogcmVzcG9uc2UsIGludCBsZW5ndGgpDQorew0KKwlDUmVhZGVyVkNWaWV3KiBwVmlldyA9IChDUmVhZGVyVkNWaWV3KilwVGhpcy0+bV9wRm9ybWZpbGxpbmZvOw0KKwlGUERGX1dJREVTVFJJTkcgd3NSZXNwb25zZTsNCisNCisJaWYgKHBWaWV3LT5tX3B3c1Jlc3BvbnNlICYmIHJlc3BvbnNlICE9IE5VTEwpDQorCXsNCisJCXdzUmVzcG9uc2UgPSAoRlBERl9XSURFU1RSSU5HKXBWaWV3LT5tX3B3c1Jlc3BvbnNlOw0KKwkJbGVuZ3RoID0gd2NzbGVuKChjb25zdCB3Y2hhcl90Kil3c1Jlc3BvbnNlKTsNCisJCW1lbWNweShyZXNwb25zZSwgd3NSZXNwb25zZSwgbGVuZ3RoKnNpemVvZih3Y2hhcl90KSk7DQorCQlwVmlldy0+bV9wd3NSZXNwb25zZSA9IE5VTEw7DQorCX0JDQorCWVsc2UNCisJew0KKwkJQ0pTX1Jlc3BvbnNlRGxnIGRsZzsNCisJCWRsZy5TZXRUaXRsZShUaXRsZSk7DQorCQlkbGcuU2V0RGVmYXVsdChEZWZhdWx0KTsNCisJCWRsZy5TZXRMYWJlbChjTGFiZWwpOw0KKwkJZGxnLlNldFF1ZXN0aW9uKFF1ZXN0aW9uKTsNCisJCWRsZy5TZXRJc1Zpc2libGUoYlBhc3N3b3JkKTsNCisJCWludCBpUmV0ID0gZGxnLkRvTW9kYWwoKTsJCQ0KKwkJDQorCQlpZiAoaVJldCA9PSAxKQ0KKwkJew0KKwkJCXdzUmVzcG9uc2UgPSBkbGcuR2V0UmVzcG9uc2UoKTsNCisJCQlsZW5ndGggPSB3Y3NsZW4oKGNvbnN0IHdjaGFyX3QqKXdzUmVzcG9uc2UpOw0KKwkJCXBWaWV3LT5tX3B3c1Jlc3BvbnNlID0gbmV3IHdjaGFyX3RbbGVuZ3RoKzFdOw0KKwkJCW1lbXNldChwVmlldy0+bV9wd3NSZXNwb25zZSwgMCwgbGVuZ3RoKnNpemVvZih3Y2hhcl90KSk7DQorCQkJbWVtY3B5KHBWaWV3LT5tX3B3c1Jlc3BvbnNlLCB3c1Jlc3BvbnNlLCBsZW5ndGgqc2l6ZW9mKHdjaGFyX3QpKTsNCisJCQlwVmlldy0+bV9wd3NSZXNwb25zZVtsZW5ndGhdID0gTCdcMCc7DQorCQl9DQorCX0NCisJDQorCXJldHVybiBsZW5ndGgqc2l6ZW9mKHdjaGFyX3QpOw0KK30NCisNCitpbnQgU2FtcGxlX2FwcGFsZXJ0KHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIE1zZywgRlBERl9XSURFU1RSSU5HIFRpdGxlLCBpbnQgVHlwZSwgaW50IEljb24pDQorew0KKwlpbnQgblJldCA9IDA7DQorCWlmKHBUaGlzICYmIHBUaGlzLT5tX3BGb3JtZmlsbGluZm8pDQorCXsNCisJCUNSZWFkZXJWQ1ZpZXcqIHBWaWV3ID0gKENSZWFkZXJWQ1ZpZXcqKXBUaGlzLT5tX3BGb3JtZmlsbGluZm87DQorCQlpbnQgbXNnVHlwZSA9IE1CX09LOw0KKwkJc3dpdGNoKFR5cGUpDQorCQl7DQorCQ0KKwkJY2FzZSAxOg0KKwkJCW1zZ1R5cGUgPSBNQl9PS0NBTkNFTDsNCisJCQlicmVhazsNCisJCWNhc2UgMjoNCisJCQltc2dUeXBlID0gTUJfWUVTTk87DQorCQkJYnJlYWs7DQorCQljYXNlIDM6DQorCQkJbXNnVHlwZSA9IE1CX1lFU05PQ0FOQ0VMOw0KKwkJCWJyZWFrOwkNCisJCWNhc2UgMDoNCisJCWRlZmF1bHQ6DQorCQkJYnJlYWs7DQorCQl9DQorCQluUmV0ID0gTWVzc2FnZUJveFcocFZpZXctPm1faFduZCwgKGNvbnN0IHdjaGFyX3QqKU1zZywgKGNvbnN0IHdjaGFyX3QqKVRpdGxlLCBtc2dUeXBlKTsNCisJCXN3aXRjaChuUmV0KQ0KKwkJew0KKwkJY2FzZSBJRE9LOg0KKwkJCXJldHVybiAxOw0KKwkJY2FzZSBJRENBTkNFTDoNCisJCQlyZXR1cm4gMjsNCisJCWNhc2UgSUROTzoNCisJCQlyZXR1cm4gMzsNCisJCWNhc2UgSURZRVM6DQorCQkJcmV0dXJuIDQ7DQorCQl9DQorCQlyZXR1cm4gblJldDsNCisJfQ0KKwlyZXR1cm4gblJldDsNCit9DQorDQordm9pZCBTYW1wbGVfYXBwYmVlcChzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsIGludCBuVHlwZSkNCit7DQorCU1lc3NhZ2VCZWVwKG5UeXBlKTsNCisJLy9BZnhNZXNzYWdlQm94KCJhYWFhIik7DQorfQ0KKw0KKw0KK0NTdHJpbmcgdXNlclNlbEZpbGVQYXRoOw0KK2ludCAgU2FtcGxlX2ZpZWxkQnJvd3NlKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcyx2b2lkKiBmaWxlUGF0aCwgaW50IGxlbmd0aCkNCit7DQorCWlmKHVzZXJTZWxGaWxlUGF0aC5Jc0VtcHR5KCkpDQorCXsNCisJCUNGaWxlRGlhbG9nIGZkKEZBTFNFLCAiZmRmIik7DQorCQlpZihmZC5Eb01vZGFsKCkgPT0gSURPSykNCisJCXsNCisJCQl1c2VyU2VsRmlsZVBhdGggPSBmZC5HZXRQYXRoTmFtZSgpOw0KKwkJCQ0KKwkJCWlmKGZpbGVQYXRoID09IE5VTEwgfHwgbGVuZ3RoID09IDApDQorCQkJCXJldHVybiB1c2VyU2VsRmlsZVBhdGguR2V0TGVuZ3RoKCkgKyAxOw0KKwkJCWVsc2UNCisJCQkJcmV0dXJuIDA7DQorCQl9DQorCQllbHNlDQorCQkJcmV0dXJuIDA7DQorCX0JDQorCWVsc2UNCisJew0KKwkJaW50IG5MZW4gPSB1c2VyU2VsRmlsZVBhdGguR2V0TGVuZ3RoKCkrMTsNCisJCWlmKGxlbmd0aCA+IG5MZW4pDQorCQkJbGVuZ3RoID0gbkxlbjsNCisJCW1lbWNweShmaWxlUGF0aCwgdXNlclNlbEZpbGVQYXRoLkdldEJ1ZmZlcihsZW5ndGgpLCBsZW5ndGgpOw0KKwkJdXNlclNlbEZpbGVQYXRoLlJlbGVhc2VCdWZmZXIoKTsNCisJCXVzZXJTZWxGaWxlUGF0aCA9ICIiOw0KKwkJcmV0dXJuIGxlbmd0aDsNCisJfQ0KK30NCitpbnQgU2FtcGxlX2RvY0dldEZpbGVQYXRoKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgdm9pZCogZmlsZVBhdGgsIGludCBsZW5ndGgpDQorew0KKwlpZihwVGhpcyAmJiBwVGhpcy0+bV9wRm9ybWZpbGxpbmZvKQ0KKwl7DQorCQlDUmVhZGVyVkNWaWV3KiBwVmlldyA9IChDUmVhZGVyVkNWaWV3KilwVGhpcy0+bV9wRm9ybWZpbGxpbmZvOw0KKwkJQ1N0cmluZyBjc0ZpbGVQYXRoID0gcFZpZXctPkdldEZpbGVQYXRoKCk7DQorDQorCQlpbnQgbmJ1ZmZsZW4gPSBjc0ZpbGVQYXRoLkdldExlbmd0aCgpICsgMTsNCisJCWlmKGZpbGVQYXRoID09IE5VTEwgfHwgbGVuZ3RoID09IDApDQorCQkJcmV0dXJuIG5idWZmbGVuOw0KKw0KKwkJaWYobGVuZ3RoID4gbmJ1ZmZsZW4pDQorCQkJbGVuZ3RoID0gbmJ1ZmZsZW47DQorCQltZW1jcHkoZmlsZVBhdGgsIGNzRmlsZVBhdGguR2V0QnVmZmVyKGxlbmd0aCksIGxlbmd0aCk7DQorCQljc0ZpbGVQYXRoLlJlbGVhc2VCdWZmZXIoKTsNCisNCisJCXJldHVybiBsZW5ndGg7DQorDQorCX0NCisJcmV0dXJuIDA7DQorfQ0KKw0KK3ZvaWQgU2FtcGxlX2RvY1N1Ym1pdEZvcm0oc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLHZvaWQqIGZvcm1EYXRhLCBpbnQgbGVuZ3RoLCBGUERGX1dJREVTVFJJTkcgVVJMKQ0KK3sNCisJaWYocFRoaXMgJiYgcFRoaXMtPm1fcEZvcm1maWxsaW5mbykNCisJew0KKwkJQ1JlYWRlclZDVmlldyAqcFZpZXcgPSAoQ1JlYWRlclZDVmlldyopcFRoaXMtPm1fcEZvcm1maWxsaW5mbzsNCisJCWlmIChwVmlldykNCisJCXsNCisJCQlwVmlldy0+U3VibWl0Rm9ybUltcGwoZm9ybURhdGEsIGxlbmd0aCwgIiIpOw0KKwkJfQ0KKwl9CQ0KK30NCisNCit2b2lkIFNhbXBsZV9nb3RvUGFnZShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsIGludCBuUGFnZU51bSkNCit7DQorCWlmKHBUaGlzICYmIHBUaGlzLT5tX3BGb3JtZmlsbGluZm8pDQorCXsNCisJCUNSZWFkZXJWQ1ZpZXcgKnBWaWV3ID0gKENSZWFkZXJWQ1ZpZXcqKXBUaGlzLT5tX3BGb3JtZmlsbGluZm87DQorCQlpZiAocFZpZXcpDQorCQl7DQorCQkJcFZpZXctPkdvdG9QYWdlKG5QYWdlTnVtKTsNCisJCX0NCisJfQkNCit9DQorDQorQ1JlYWRlclZDVmlldzo6Q1JlYWRlclZDVmlldygpDQorew0KKwkvLyBUT0RPOiBhZGQgY29uc3RydWN0aW9uIGNvZGUgaGVyZQ0KKwltX3BGcmFtID0gTlVMTDsNCisJbV9wRXhwb3J0UGFnZURsZyA9IE5VTEw7DQorCW1fcERvYyA9IE5VTEw7DQorCW1fcFBhZ2UgPSBOVUxMOw0KKwltX25Ub3RhbFBhZ2UgPSAwOw0KKwltX25Sb3RhdGVGbGFnID0gMDsNCisJbV9kYlNjYWxlRmFjdG9yID0gMS4wZjsNCisJbV9uUGFnZUluZGV4ID0gLTE7DQorCW1fZGJQYWdlV2lkdGggPSAwLjBmOw0KKwltX2RiUGFnZUhlaWdodCA9IDAuMGY7DQorCW1fblN0YXJ0WCA9IDA7DQorCW1fblN0YXJ0WSA9IDA7DQorCW1fbkFjdHVhbFNpemVYID0gMDsNCisJbV9uQWN0dWFsU2l6ZVkgPSAwOw0KKw0KKwkvL2ZvciBzZWFyY2ggdGV4dA0KKwltX3BUZXh0UGFnZSA9IE5VTEw7DQorCW1fRmluZEluZm8ubV9zdHJGaW5kID0gX1QoIiIpOw0KKwltX0ZpbmRJbmZvLm1fbkZsYWcgPSAtMTsNCisJbV9GaW5kSW5mby5tX25EaXJlY3Rpb24gPSAtMTsNCisJbV9GaW5kSW5mby5tX25TdGFydFBhZ2VJbmRleCA9IC0xOw0KKwltX0ZpbmRJbmZvLm1fblN0YXJ0Q2hhckluZGV4ID0gLTE7DQorCW1fRmluZEluZm8ubV9iRmlyc3QgPSBUUlVFOw0KKwltX0ZpbmRJbmZvLm1fcEN1ckZpbmRCdWYgPSBOVUxMOw0KKwltX3BTQ0hIYW5kbGUgPSBOVUxMOw0KKw0KKwltX3J0RmluZCA9IE5VTEw7DQorCW1fblJlY3ROdW0gPSAwOw0KKwkNCisJLy9mb3Igc2VsZWN0IHRleHQNCisJbV9iU2VsZWN0ID0gRkFMU0U7DQorCW1fYkhhbmQgPSBUUlVFOw0KKwltX2JTbmFwID0gRkFMU0U7DQorCW1fYkhhc0NoYXIgPSBGQUxTRTsNCisJDQorCW1fcHRMQkRvd24ueCA9IG1fcHRMQkRvd24ueSA9IDA7DQorCW1fcHRMQlVwLnggPSBtX3B0TEJVcC55ID0gMDsNCisJbV9wdE9sZC54ID0gbV9wdE9sZC55ID0gMDsNCisNCisJbV9uU3RhcnRJbmRleCA9IG1fbkVuZEluZGV4ID0gbV9uT2xkSW5kZXggPSAtMTsNCisJbV9ydEFycmF5LlJlbW92ZUFsbCgpOw0KKwltX3J0T2xkLmxlZnQgPSBtX3J0T2xkLnJpZ2h0ID0gbV9ydE9sZC5ib3R0b20gPSBtX3J0T2xkLnRvcCA9IDA7DQorDQorCW1fblBvc0ggPSBtX25Qb3NWID0gLTE7DQorDQorCS8vIGZvciBsaW5rcw0KKwltX3BMaW5rID0gTlVMTDsNCisJbV9iQm9va21hcmsgPSBGQUxTRTsNCisNCisJbV9ibXAgPSBOVUxMOw0KKwltX3B3c1Jlc3BvbnNlID0gTlVMTDsNCisNCisJdGhpcy0+RkZJX0ludmFsaWRhdGUgPSBTYW1wbGVfSW52YWxpZGF0ZTsNCisJdGhpcy0+UmVsZWFzZT0gU2FtcGxlX1JlbGVhc2U7DQorCXRoaXMtPkZGSV9TZXRUaW1lciA9IFNhbXBsZV9TZXRUaW1lcjsNCisJdGhpcy0+RkZJX0tpbGxUaW1lciA9IFNhbXBsZV9LaWxsVGltZXI7DQorCXRoaXMtPkZGSV9HZXRMb2NhbFRpbWUgPSBTYW1wbGVfR2V0TG9jYWxUaW1lOw0KKwl0aGlzLT5GRklfU2V0Q3Vyc29yID0gU2FtcGxlX1NldEN1cnNvcjsNCisJdGhpcy0+RkZJX09uQ2hhbmdlID0gU2FtcGxlX09uQ2hhbmdlOw0KKwl0aGlzLT5GRklfR2V0UGFnZSA9IFNhbXBsZV9HZXRQYWdlOw0KKwl0aGlzLT5GRklfR2V0Q3VycmVudFBhZ2UgPSBTYW1wbGVfR2V0Q3VycmVudFBhZ2U7DQorCXRoaXMtPkZGSV9HZXRSb3RhdGlvbiA9IFNhbXBsZV9HZXRSb3RhdGlvbjsNCisJdGhpcy0+RkZJX091dHB1dFNlbGVjdGVkUmVjdCA9IFNhbXBsZV9PdXRwdXRTZWxlY3RlZFJlY3Q7DQorCXRoaXMtPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24gPSBTYW1wbGVfRXhlY3V0ZU5hbWVkQWN0aW9uOw0KKwl0aGlzLT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0ICA9IE5VTEw7DQorCXRoaXMtPkZGSV9TZXRUZXh0RmllbGRGb2N1cyA9IE5VTEw7DQorCXRoaXMtPkZGSV9Eb0dvVG9BY3Rpb24gPSBOVUxMOw0KKwl0aGlzLT5GRklfRG9VUklBY3Rpb24gPSBOVUxMOw0KKwl0aGlzLT5GRklfRGlzcGxheUNhcmV0ID0gU2FtcGxlX0Rpc3BsYXlDYXJldDsNCisJdGhpcy0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXggPSBTYW1wbGVfR2V0Q3VycmVudFBhZ2VJbmRleDsNCisJdGhpcy0+RkZJX1NldEN1cnJlbnRQYWdlID0gU2FtcGxlX1NldEN1cnJlbnRQYWdlOw0KKwl0aGlzLT5GRklfR290b1VSTCA9IFNhbXBsZV9Hb3RvVVJMOw0KKwl0aGlzLT5GRklfR2V0UGFnZVZpZXdSZWN0ID0gU2FtcGxlX0dldFBhZ2VWaWV3UmVjdDsNCisJdGhpcy0+RkZJX1BvcHVwTWVudSA9IFNhbXBsZV9Qb3B1cE1lbnU7DQorCXRoaXMtPkZGSV9PcGVuRmlsZSA9IFNhbXBsZV9PcGVuRmlsZTsNCisJdGhpcy0+RkZJX0dldEZpbGVQYXRoID0gU2FtcGxlX0dldEZpbGVQYXRoOw0KKwl0aGlzLT5GRklfRW1haWxUbyA9IFNhbXBsZV9FbWFpbFRvOw0KKwl0aGlzLT5GRklfVXBsb2FkVG8gPSBTYW1wbGVfVXBsb2FkVG87DQorCXRoaXMtPkZGSV9HZXRQbGF0Zm9ybSA9IFNhbXBsZV9HZXRQbGF0Zm9ybTsNCisJdGhpcy0+RkZJX0dldERvY3VtZW50Q291bnQgPSBTYW1wbGVfR2V0RG9jdW1lbnRDb3VudDsNCisJdGhpcy0+RkZJX0dldEN1ckRvY3VtZW50SW5kZXggPSBTYW1wbGVfR2V0Q3VyRG9jdW1lbnRJbmRleDsNCisJdGhpcy0+RkZJX0Rvd25sb2FkRnJvbVVSTCA9IFNhbXBsZV9Eb3dubG9hZEZyb21VUkw7DQorCXRoaXMtPkZGSV9Qb3N0UmVxdWVzdFVSTCA9IFNhbXBsZV9Qb3N0UmVxdWVzdFVSTDsNCisJdGhpcy0+RkZJX1B1dFJlcXVlc3RVUkwgPSBTYW1wbGVfUHV0UmVxdWVzdFVSTDsNCisJdGhpcy0+RkZJX1Nob3dGaWxlRGlhbG9nID0gU2FtcGxlX1Nob3dGaWxlRGlhbG9nOwkNCisJdGhpcy0+dmVyc2lvbiA9IDE7DQorCQ0KKwl0aGlzLT5tX3BKc1BsYXRmb3JtID0gTlVMTDsNCisgIAl0aGlzLT5tX3BKc1BsYXRmb3JtID0gbmV3IElQREZfSlNQTEFURk9STTsNCisJbWVtc2V0KG1fcEpzUGxhdGZvcm0sIDAsIHNpemVvZihJUERGX0pTUExBVEZPUk0pKTsNCisgIAl0aGlzLT5tX3BKc1BsYXRmb3JtLT5hcHBfYWxlcnQgPSBTYW1wbGVfYXBwYWxlcnQ7DQorCXRoaXMtPm1fcEpzUGxhdGZvcm0tPmFwcF9yZXNwb25zZSA9IFNhbXBsZV9hcHBSZXNwb25zZTsNCisgCXRoaXMtPm1fcEpzUGxhdGZvcm0tPmFwcF9iZWVwID0gU2FtcGxlX2FwcGJlZXA7DQorICAJdGhpcy0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlID1TYW1wbGVfZmllbGRCcm93c2U7DQorICAJdGhpcy0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dldEZpbGVQYXRoID0gU2FtcGxlX2RvY0dldEZpbGVQYXRoOw0KKwl0aGlzLT5tX3BKc1BsYXRmb3JtLT5Eb2Nfc3VibWl0Rm9ybSA9IFNhbXBsZV9kb2NTdWJtaXRGb3JtOw0KKwl0aGlzLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ290b1BhZ2UgPSBTYW1wbGVfZ290b1BhZ2U7DQorICAJdGhpcy0+bV9wSnNQbGF0Zm9ybS0+bV9wRm9ybWZpbGxpbmZvID0gdGhpczsNCisNCisJbV9wQXBwID0gTlVMTDsNCit9DQorDQorDQorQ1JlYWRlclZDVmlldzo6fkNSZWFkZXJWQ1ZpZXcoKQ0KK3sNCisNCisvLwlGUERGX0Rlc3Ryb3lBcHAobV9BcHApOw0KKw0KKwlpZihtX3BUZXh0UGFnZSAhPSBOVUxMKQ0KKwl7DQorCQlGUERGVGV4dF9DbG9zZVBhZ2UobV9wVGV4dFBhZ2UpOw0KKwkJbV9wVGV4dFBhZ2UgPSBOVUxMOw0KKwl9DQorCWlmIChtX3BMaW5rICE9IE5VTEwpDQorCXsNCisJCUZQREZMaW5rX0Nsb3NlV2ViTGlua3MobV9wTGluayk7DQorCQltX3BMaW5rID0gTlVMTDsNCisJfQ0KKw0KKwlQT1NJVElPTiBwb3MgPSBtX3BhZ2VNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKwl3aGlsZShwb3MpDQorCXsNCisJCWludCBuSW5kZXggPSAwOw0KKwkJRlBERl9QQUdFIHBhZ2UgPSBOVUxMOw0KKwkJbV9wYWdlTWFwLkdldE5leHRBc3NvYyhwb3MsIG5JbmRleCwgcGFnZSk7DQorDQorCQlpZiAocGFnZSkNCisJCXsNCisJCQlGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKHBhZ2UsIG1fcEFwcCk7DQorCQkJRlBERl9DbG9zZVBhZ2UocGFnZSk7DQorCQl9DQorCX0NCisJbV9wUGFnZSA9IE5VTEw7DQorDQorCWlmIChtX3BEb2MgIT0gTlVMTCkNCisJew0KKwkJLy9TaG91bGQgc3RyaWN0bHkgZm9sbG93IHRoZSByZXZlcnNlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIC4NCisJCUZPUk1fRG9Eb2N1bWVudEFBY3Rpb24obV9wQXBwLCBGUERGRE9DX0FBQ1RJT05fV0MpOw0KKwkJaWYobV9wQXBwKQ0KKwkJCUZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvdW1lbnQobV9wQXBwKTsNCisJCUZQREZfQ2xvc2VEb2N1bWVudChtX3BEb2MpOw0KKwkJbV9wRG9jID0gTlVMTDsNCisJfQ0KKwlpZiAobV9GaW5kSW5mby5tX3BDdXJGaW5kQnVmICE9IE5VTEwpDQorCXsNCisJCWRlbGV0ZSBbXW1fRmluZEluZm8ubV9wQ3VyRmluZEJ1ZjsNCisJCW1fRmluZEluZm8ubV9wQ3VyRmluZEJ1ZiA9IE5VTEw7DQorCX0NCisJaWYgKG1fcnRGaW5kICE9IE5VTEwpDQorCXsNCisJCWRlbGV0ZSBtX3J0RmluZDsNCisJCW1fcnRGaW5kID0gTlVMTDsNCisJfQ0KKwlpZihtX2JtcCAhPSBOVUxMKQ0KKwl7DQorCQlGUERGQml0bWFwX0Rlc3Ryb3kobV9ibXApOw0KKwl9DQorDQorCWlmIChtX3B3c1Jlc3BvbnNlKQ0KKwl7DQorCQlkZWxldGUgbV9wd3NSZXNwb25zZTsNCisJCW1fcHdzUmVzcG9uc2UgPSBOVUxMOw0KKwl9DQorDQorCWlmKHRoaXMtPm1fcEpzUGxhdGZvcm0pDQorCQlkZWxldGUgbV9wSnNQbGF0Zm9ybTsNCisNCisJbV9tYXBUaW1lckZ1bnMuUmVtb3ZlQWxsKCk7DQorLy8JbV9mb3JtRmlsZWRJbmZvLlJlbGVhc2UoKTsNCisvLwl9DQorLy8JbV9ydEFycmF5LlJlbW92ZUFsbCgpOw0KK30NCisNCitCT09MIENSZWFkZXJWQ1ZpZXc6OlByZUNyZWF0ZVdpbmRvdyhDUkVBVEVTVFJVQ1QmIGNzKQ0KK3sNCisJLy8gVE9ETzogTW9kaWZ5IHRoZSBXaW5kb3cgY2xhc3Mgb3Igc3R5bGVzIGhlcmUgYnkgbW9kaWZ5aW5nDQorCS8vICB0aGUgQ1JFQVRFU1RSVUNUIGNzDQorCWNzLnN0eWxlIHw9IFdTX01BWElNSVpFIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfFdTX0hTQ1JPTEw7DQorCXJldHVybiBDVmlldzo6UHJlQ3JlYXRlV2luZG93KGNzKTsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDUmVhZGVyVkNWaWV3IGRyYXdpbmcNCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uRHJhdyhDREMqIHBEQykNCit7DQorCUNSZWFkZXJWQ0RvYyogcERvYyA9IEdldERvY3VtZW50KCk7DQorCUFTU0VSVF9WQUxJRChwRG9jKTsNCisJLy8gVE9ETzogYWRkIGRyYXcgY29kZSBmb3IgbmF0aXZlIGRhdGEgaGVyZQ0KKwlEcmF3UGFnZShtX25Sb3RhdGVGbGFnLCBwREMpOw0KKwlEcmF3QWxsUmVjdChwREMpOw0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENSZWFkZXJWQ1ZpZXcgcHJpbnRpbmcNCisNCitCT09MIENSZWFkZXJWQ1ZpZXc6Ok9uUHJlcGFyZVByaW50aW5nKENQcmludEluZm8qIHBJbmZvKQ0KK3sNCisJLy8gZGVmYXVsdCBwcmVwYXJhdGlvbg0KKwlyZXR1cm4gRG9QcmVwYXJlUHJpbnRpbmcocEluZm8pOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uQmVnaW5QcmludGluZyhDREMqIC8qcERDKi8sIENQcmludEluZm8qIC8qcEluZm8qLykNCit7DQorCS8vIFRPRE86IGFkZCBleHRyYSBpbml0aWFsaXphdGlvbiBiZWZvcmUgcHJpbnRpbmcNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPbkVuZFByaW50aW5nKENEQyogLypwREMqLywgQ1ByaW50SW5mbyogLypwSW5mbyovKQ0KK3sNCisJLy8gVE9ETzogYWRkIGNsZWFudXAgYWZ0ZXIgcHJpbnRpbmcNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDUmVhZGVyVkNWaWV3IGRpYWdub3N0aWNzDQorDQorI2lmZGVmIF9ERUJVRw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6QXNzZXJ0VmFsaWQoKSBjb25zdA0KK3sNCisJQ1ZpZXc6OkFzc2VydFZhbGlkKCk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6RHVtcChDRHVtcENvbnRleHQmIGRjKSBjb25zdA0KK3sNCisJQ1ZpZXc6OkR1bXAoZGMpOw0KK30NCisNCitDUmVhZGVyVkNEb2MqIENSZWFkZXJWQ1ZpZXc6OkdldERvY3VtZW50KCkgLy8gbm9uLWRlYnVnIHZlcnNpb24gaXMgaW5saW5lDQorew0KKwlBU1NFUlQobV9wRG9jdW1lbnQtPklzS2luZE9mKFJVTlRJTUVfQ0xBU1MoQ1JlYWRlclZDRG9jKSkpOw0KKwlyZXR1cm4gKENSZWFkZXJWQ0RvYyopbV9wRG9jdW1lbnQ7DQorfQ0KKyNlbmRpZiAvL19ERUJVRw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ1JlYWRlclZDVmlldyBtZXNzYWdlIGhhbmRsZXJzDQorDQorQk9PTCBDUmVhZGVyVkNWaWV3OjpMb2FkUERGUGFnZShGUERGX0RPQ1VNRU5UIGRvYywgaW50IG5JbmRleCwgQ1BvaW50IHBvcykNCit7DQorCWlmKE5VTEwgPT0gZG9jKSByZXR1cm4gRkFMU0U7DQorCWlmKG5JbmRleCA8IDApIG5JbmRleCA9IDA7DQorCWlmKG5JbmRleCA+IG1fblRvdGFsUGFnZSkgbkluZGV4ID0gbV9uVG90YWxQYWdlOw0KKw0KKwlGT1JNX0RvUGFnZUFBY3Rpb24obV9wUGFnZSwgbV9wQXBwLCBGUERGUEFHRV9BQUNUSU9OX0NMT1NFKTsNCisNCisJbV9wUGFnZSA9IE5VTEw7DQorCW1fcGFnZU1hcC5Mb29rdXAobkluZGV4LCBtX3BQYWdlKTsNCisJaWYoIW1fcFBhZ2UpDQorCXsNCisJCW1fcFBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvYywgbkluZGV4KTsNCisJCUZPUk1fT25BZnRlckxvYWRQYWdlKG1fcFBhZ2UsIG1fcEFwcCk7DQorCQltX3BhZ2VNYXAuU2V0QXQobkluZGV4LCBtX3BQYWdlKTsJDQorCX0NCisJaWYoTlVMTCA9PSBtX3BQYWdlKSByZXR1cm4gRkFMU0U7DQorDQorCUZPUk1fRG9QYWdlQUFjdGlvbihtX3BQYWdlLCBtX3BBcHAsIEZQREZQQUdFX0FBQ1RJT05fT1BFTik7DQorDQorCW1fblBhZ2VJbmRleCA9IG5JbmRleDsNCisgICAgU2V0UGFnZU1ldHJpY3MobV9wUGFnZSk7DQorDQorCWlmIChtX3BUZXh0UGFnZSAhPSBOVUxMKQ0KKwl7DQorCQlGUERGVGV4dF9DbG9zZVBhZ2UobV9wVGV4dFBhZ2UpOw0KKwkJbV9wVGV4dFBhZ2UgPSBOVUxMOwkNCisJfQ0KKwltX3BUZXh0UGFnZSA9IEZQREZUZXh0X0xvYWRQYWdlKG1fcFBhZ2UpOw0KKw0KKw0KKwlDQ2hpbGRGcmFtZSAqcFBhcmVudCA9IChDQ2hpbGRGcmFtZSAqKXRoaXMtPkdldFBhcmVudEZyYW1lKCk7DQorCWlmIChwUGFyZW50ICE9IE5VTEwpDQorCXsNCisJCXBQYXJlbnQtPlNldEFjdGl2ZVZpZXcodGhpcyk7DQorCQlTeW5jU2Nyb2xsKCk7CQ0KKwl9DQorCQ0KKwlpZihwb3MueCAhPTAgJiYgcG9zLnkgIT0gMCkNCisJew0KKwkJRlBERl9QYWdlVG9EZXZpY2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG1fbkFjdHVhbFNpemVYICogbV9kYlNjYWxlRmFjdG9yKSwNCisJCQkoaW50KShtX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIHBvcy54LCBwb3MueSwgJm1fblN0YXJ0WCwgJm1fblN0YXJ0WSk7CQkJDQorCQltX25TdGFydFggPSAtbV9uU3RhcnRYICsgMjA7DQorCQltX25TdGFydFkgPSAtbV9uU3RhcnRZICsgMjA7DQorCQkNCisJCWludCBuU2l6ZVggPSAwOyANCisJCWludCBuU2l6ZVkgPSAwOw0KKwkJaWYgKDEgPT0gbV9uUm90YXRlRmxhZyB8fCAzID09IG1fblJvdGF0ZUZsYWcpDQorCQl7DQorCQkJblNpemVYID0gbV9uQWN0dWFsU2l6ZVk7DQorCQkJblNpemVZID0gbV9uQWN0dWFsU2l6ZVg7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJblNpemVYID0gbV9uQWN0dWFsU2l6ZVg7DQorCQkJblNpemVZID0gbV9uQWN0dWFsU2l6ZVk7DQorCQl9DQorCQlTQ1JPTExJTkZPIHNjcmluZm87DQorCQlHZXRTY3JvbGxJbmZvKFNCX1ZFUlQsICZzY3JpbmZvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJc2NyaW5mby5uTWluID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCXNjcmluZm8ubk1heCA9KGludCkgKG5TaXplWSAqIG1fZGJTY2FsZUZhY3RvciArIGFicyhtX25TdGFydFkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCVNldFNjcm9sbEluZm8oU0JfVkVSVCwgJnNjcmluZm8pOyAgDQorCQlTZXRTY3JvbGxQb3MoU0JfVkVSVCwgYWJzKG1fblN0YXJ0WSksIFRSVUUpOw0KKw0KKwkJR2V0U2Nyb2xsSW5mbyhTQl9IT1JaLCAmc2NyaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCXNjcmluZm8ubk1pbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlzY3JpbmZvLm5NYXggPSAoaW50KShuU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IgKyBhYnMobV9uU3RhcnRYKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlTZXRTY3JvbGxJbmZvKFNCX0hPUlosICZzY3JpbmZvKTsgIA0KKwkJU2V0U2Nyb2xsUG9zKFNCX0hPUlosIGFicyhtX25TdGFydFgpLCBUUlVFKTsNCisJfQ0KKwl0aGlzLT5JbnZhbGlkYXRlKFRSVUUpOw0KKy8vCUZQREZBcHBfU2V0UGFnZShtX0FwcCwgbV9wUGFnZSk7DQorCXJldHVybiBUUlVFOw0KKw0KK30NCisNCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OkludmFsaWRhdGVJbXBsKEZQREZfUEFHRSBwYWdlLCBkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKQ0KK3sNCisJaW50IGRldmljZV9sZWZ0LCBkZXZpY2VfdG9wLCBkZXZpY2VfcmlnaHQsIGRldmljZV9ib3R0b207DQorDQorCWludCBuQWN0dWFsUmFuZ2VYID0gMDsNCisJaW50IG5BY3R1YWxSYW5nZVkgPSAwOw0KKwlpZiAoIG1fblJvdGF0ZUZsYWcgJSAyID09IDAgKQ0KKwl7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVg7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVk7DQorCX1lbHNlew0KKwkJbkFjdHVhbFJhbmdlWCA9IG1fbkFjdHVhbFNpemVZOw0KKwkJbkFjdHVhbFJhbmdlWSA9IG1fbkFjdHVhbFNpemVYOw0KKwl9DQorDQorCUZQREZfUGFnZVRvRGV2aWNlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCAoaW50KShuQWN0dWFsUmFuZ2VYICogbV9kYlNjYWxlRmFjdG9yKSwNCisJCShpbnQpKG5BY3R1YWxSYW5nZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCBsZWZ0LCB0b3AsICZkZXZpY2VfbGVmdCwgJmRldmljZV90b3ApOw0KKw0KKwlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgKGludCkobkFjdHVhbFJhbmdlWCAqIG1fZGJTY2FsZUZhY3RvciksDQorCQkoaW50KShuQWN0dWFsUmFuZ2VZICogbV9kYlNjYWxlRmFjdG9yKSwgbV9uUm90YXRlRmxhZywgcmlnaHQsIGJvdHRvbSwgJmRldmljZV9yaWdodCwgJmRldmljZV9ib3R0b20pOw0KKw0KKwlDUmVjdCByYyhkZXZpY2VfbGVmdCxkZXZpY2VfdG9wLCBkZXZpY2VfcmlnaHQsIGRldmljZV9ib3R0b20pOw0KKy8vIAlUUkFDRSgibGVmdCA9ICVkXHJcbiIsIGRldmljZV9sZWZ0KTsNCisvLyAJCVRSQUNFKCJ0b3AgPSAlZFxyXG4iLCBkZXZpY2VfdG9wKTsNCisvLyAJCQlUUkFDRSgicmlnaHQgPSAlZFxyXG4iLCBkZXZpY2VfcmlnaHQpOw0KKy8vIAkJCQlUUkFDRSgiYm90dG9tID0gJWRcclxuIiwgZGV2aWNlX2JvdHRvbSk7DQorCWlmKGRldmljZV9yaWdodC1kZXZpY2VfbGVmdD41KQ0KKwlUUkFDRSgibGVmdD0lZCx0b3A9JWQscmlnaHQ9JWQsYm90dG9tPSVkXHJcbiIsZGV2aWNlX2xlZnQsZGV2aWNlX3RvcCxkZXZpY2VfcmlnaHQsZGV2aWNlX2JvdHRvbSk7DQorCTo6SW52YWxpZGF0ZVJlY3QobV9oV25kLCByYywgRkFMU0UpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OlNldENhcmV0SW1wbChGUERGX1BBR0UgcGFnZSxkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQgbldpZHRoLCBpbnQgbkhlaWdodCkNCit7DQorDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6UmVsZWFzZUltcGwoKQ0KK3sNCisNCit9DQorQ01hcDxpbnQsIGludCxUaW1lckNhbGxiYWNrLCBUaW1lckNhbGxiYWNrPiBDUmVhZGVyVkNWaWV3OjptX21hcFRpbWVyRnVuczsNCitpbnQgQ1JlYWRlclZDVmlldzo6U2V0VGltZXJJbXBsKGludCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKQ0KK3sNCisJaW50IG5UaW1lSUQgPSAgOjpTZXRUaW1lcihOVUxMLCAwLCB1RWxhcHNlLCBUaW1lclByb2MpOwkNCisJbV9tYXBUaW1lckZ1bnMuU2V0QXQoblRpbWVJRCwgbHBUaW1lckZ1bmMpOw0KKwlyZXR1cm4gblRpbWVJRDsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpLaWxsVGltZXJJbXBsKGludCBuSUQpDQorew0KKwk6OktpbGxUaW1lcihOVUxMLCBuSUQpOw0KKwltX21hcFRpbWVyRnVucy5SZW1vdmVLZXkobklEKTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpTZXRDdXJvckltcGwoaW50IG5DdXJzb3JUeXBlKQ0KK3sNCisJSENVUlNPUiBoY3VyID0gTG9hZEN1cnNvcihOVUxMLCBJRENfVVBBUlJPVyk7DQorCXN3aXRjaChuQ3Vyc29yVHlwZSkNCisJew0KKwkgCWNhc2UJRlhDVF9BUlJPVzoNCisJIAljYXNlCUZYQ1RfTkVTVzoJCQ0KKwkgCWNhc2UJRlhDVF9OV1NFOgkJDQorCSAJY2FzZQlGWENUX1ZCRUFNOgkJDQorCSAJY2FzZQlGWENUX0hCRUFNOgkJDQorCSAJY2FzZSAgICBGWENUX0hBTkQ6DQorCSAJLy8JOjpTZXRDdXJzb3IoaGN1cik7DQorCSAJYnJlYWs7DQorCX0NCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpQYWdlVG9EZXZpY2VJbXBsKEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsZG91YmxlIHBhZ2VfeSwgaW50KiBkZXZpY2VfeCwgaW50KiBkZXZpY2VfeSkNCit7DQorCWludCBuQWN0dWFsUmFuZ2VYID0gMDsNCisJaW50IG5BY3R1YWxSYW5nZVkgPSAwOw0KKwlpZiAoIG1fblJvdGF0ZUZsYWcgJSAyID09IDAgKQ0KKwl7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVg7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVk7DQorCX1lbHNlew0KKwkJbkFjdHVhbFJhbmdlWCA9IG1fbkFjdHVhbFNpemVZOw0KKwkJbkFjdHVhbFJhbmdlWSA9IG1fbkFjdHVhbFNpemVYOw0KKwl9DQorIAlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgKGludCkobkFjdHVhbFJhbmdlWCAqIG1fZGJTY2FsZUZhY3RvciksDQorCQkJCShpbnQpKG5BY3R1YWxSYW5nZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCBwYWdlX3gsIHBhZ2VfeSxkZXZpY2VfeCwgZGV2aWNlX3kpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OkRldmljZVRvUGFnZUltcGwoRlBERl9QQUdFIHBhZ2UsaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSkNCit7DQorCWludCBuQWN0dWFsUmFuZ2VYID0gMDsNCisJaW50IG5BY3R1YWxSYW5nZVkgPSAwOw0KKwlpZiAoIG1fblJvdGF0ZUZsYWcgJSAyID09IDAgKQ0KKwl7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVg7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVk7DQorCX1lbHNlew0KKwkJbkFjdHVhbFJhbmdlWCA9IG1fbkFjdHVhbFNpemVZOw0KKwkJbkFjdHVhbFJhbmdlWSA9IG1fbkFjdHVhbFNpemVYOw0KKwl9DQorCUZQREZfRGV2aWNlVG9QYWdlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCAoaW50KShuQWN0dWFsUmFuZ2VYICogbV9kYlNjYWxlRmFjdG9yKSwNCisJCShpbnQpKG5BY3R1YWxSYW5nZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCBkZXZpY2VfeCwgZGV2aWNlX3ksIHBhZ2VfeCwgcGFnZV95KTsNCisNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpTZXRQYWdlTWV0cmljcyhGUERGX1BBR0UgcFBhZ2UpDQorew0KKwltX25TdGFydFggPSAxMDsNCisJbV9uU3RhcnRZID0gMTA7DQorCWlmKE5VTEw9PXBQYWdlKSByZXR1cm47DQorCS8vZ2V0IHBkZiBwYWdlIHdpZHRoIGFuIGhlaWdodDsNCisJbV9kYlBhZ2VXaWR0aCA9IEZQREZfR2V0UGFnZVdpZHRoKHBQYWdlKTsNCisJbV9kYlBhZ2VIZWlnaHQgPSBGUERGX0dldFBhZ2VIZWlnaHQocFBhZ2UpOw0KKw0KKwlDREMgKnBEQyA9IEdldERDKCk7DQorCWludCBpeCwgaXk7DQorCWl4ID0gcERDLT5HZXREZXZpY2VDYXBzKExPR1BJWEVMU1gpOw0KKwlpeSA9IHBEQy0+R2V0RGV2aWNlQ2FwcyhMT0dQSVhFTFNZKTsNCisJbV9uQWN0dWFsU2l6ZVggPSAoaW50KShtX2RiUGFnZVdpZHRoIC8gNzIgKiBpeCArIDAuNWYpOy8vY29udmVydCBwZGYgY29vcmRpbmF0ZXMgdG8gZGV2aWNlDQorCW1fbkFjdHVhbFNpemVZID0gKGludCkobV9kYlBhZ2VIZWlnaHQgLyA3MiAqIGl5ICsgMC41Zik7Ly9jb252ZXJ0IHBkZiBjb29yZGluYXRlcyB0byBkZXZpY2UNCisJUmVsZWFzZURDKHBEQyk7DQorDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6U2V0U2NhbEZhY3Rvcihkb3VibGUgZGJTY2FsKQ0KK3sNCisJaWYoZGJTY2FsID4gNjQgKSBtX2RiU2NhbGVGYWN0b3IgPSA2NDsNCisJaWYoIGRiU2NhbCA8IDApIG1fZGJTY2FsZUZhY3RvciA9IDAuMDhmOw0KKwltX2RiU2NhbGVGYWN0b3IgPSBkYlNjYWw7DQorfQ0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6RHJhd1BhZ2UoaW50IG5Sb3RhdGUsIENEQyAqcERDKQ0KK3sNCisJaW50IG5TaXplWCA9IG1fbkFjdHVhbFNpemVYOw0KKwlpbnQgblNpemVZID0gbV9uQWN0dWFsU2l6ZVk7DQorDQorCWlmICgxID09IG5Sb3RhdGUgfHwgMyA9PSBuUm90YXRlKQ0KKwl7DQorCQlpbnQgdGVtcCA9IG5TaXplWDsNCisJCW5TaXplWCA9IG5TaXplWTsNCisJCW5TaXplWSA9IHRlbXA7DQorCX0NCisJDQorCWludCBuU2hvd1NpemVYID0gKGludCkoblNpemVYICogbV9kYlNjYWxlRmFjdG9yICsgbV9uU3RhcnRYKTsNCisJaW50IG5TaG93U2l6ZVkgPSAoaW50KShuU2l6ZVkgKiBtX2RiU2NhbGVGYWN0b3IgKyBtX25TdGFydFkpOw0KKwkNCisNCisJQ1JlY3QgcmM7IA0KKwlwREMtPkdldENsaXBCb3goJnJjKTsNCisJCUZQREZfQklUTUFQIGJtcHRlbXAgPSBGUERGQml0bWFwX0NyZWF0ZShyYy5XaWR0aCgpLCByYy5IZWlnaHQoKSwgMCk7DQorCQlpbnQgbkNsaWVudFdpZHRoID0gRlBERkJpdG1hcF9HZXRXaWR0aChibXB0ZW1wKTsNCisJCWludCBuQ2xpZW50SGVpZ2h0ID0gRlBERkJpdG1hcF9HZXRIZWlnaHQoYm1wdGVtcCk7DQorCQkNCisJCQ0KKwkJRlBERkJpdG1hcF9GaWxsUmVjdChibXB0ZW1wLCAwLCAwLCBuQ2xpZW50V2lkdGgsIG5DbGllbnRIZWlnaHQsIDI1NSwyNTUsMjU1LCAwKTsNCisJCUZQREZfUmVuZGVyUGFnZUJpdG1hcChibXB0ZW1wLCBtX3BQYWdlLCBtX25TdGFydFgtcmMubGVmdCwgbV9uU3RhcnRZLXJjLnRvcCwgKGludCkoblNpemVYICogbV9kYlNjYWxlRmFjdG9yKSwgKGludCkoblNpemVZICogbV9kYlNjYWxlRmFjdG9yKSwgblJvdGF0ZSwgDQorCQkJRlBERl9MQ0RfVEVYVCB8IEZQREZfTk9fTkFUSVZFVEVYVCk7DQorCQlGUERGX0ZGTERyYXcobV9wQXBwLCBibXB0ZW1wLCBtX3BQYWdlLCBtX25TdGFydFgtcmMubGVmdCwgbV9uU3RhcnRZLXJjLnRvcCwgKGludCkoblNpemVYICogbV9kYlNjYWxlRmFjdG9yKSwgKGludCkoblNpemVZICogbV9kYlNjYWxlRmFjdG9yKSwgblJvdGF0ZSwgDQorCQkJRlBERl9BTk5PVCB8IEZQREZfTENEX1RFWFQgfCBGUERGX05PX05BVElWRVRFWFQpOw0KKwkJDQorCQkvLyAJbV9wUGFnZTIgPSBGUERGX0xvYWRQYWdlKG1fcERvYywgMik7DQorCQkvLyAJRlBERl9SZW5kZXJQYWdlQml0bWFwKG1fYm1wLCBtX3BQYWdlMiwgbV9uU3RhcnRYKzUwMCwgbV9uU3RhcnRZLCAoaW50KShuU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IpLCAoaW50KShuU2l6ZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBuUm90YXRlLCANCisJCS8vIAkJRlBERl9MQ0RfVEVYVCB8IEZQREZfTk9fTkFUSVZFVEVYVCk7DQorCQkvLyAJRlBERl9GRkxEcmF3KG1fcEFwcCwgbV9ibXAsIG1fcFBhZ2UyLCBtX25TdGFydFgrNTAwLCBtX25TdGFydFksIChpbnQpKG5TaXplWCAqIG1fZGJTY2FsZUZhY3RvciksIChpbnQpKG5TaXplWSAqIG1fZGJTY2FsZUZhY3RvciksIG5Sb3RhdGUsIA0KKwkJLy8gIAkJRlBERl9BTk5PVCB8IEZQREZfTENEX1RFWFQgfCBGUERGX05PX05BVElWRVRFWFQpOw0KKwkJDQorCQlpbnQgdCA9IEZQREZCaXRtYXBfR2V0U3RyaWRlKGJtcHRlbXApOw0KKwkJaW50IGJ1ZnNpemU9RlBERkJpdG1hcF9HZXRTdHJpZGUoYm1wdGVtcCkqbkNsaWVudEhlaWdodDsNCisJCXZvaWQqIGJtcGJ1Zj1GUERGQml0bWFwX0dldEJ1ZmZlcihibXB0ZW1wKTsNCisJCUNEQyBNZW1EQzsNCisJCQ0KKwkJQ0JpdG1hcCB3aW5ibXA7DQorCQlNZW1EQy5DcmVhdGVDb21wYXRpYmxlREMocERDKTsNCisJCWlmKChIQklUTUFQKXdpbmJtcCAhPSBOVUxMKQ0KKwkJCXdpbmJtcC5EZWxldGVPYmplY3QoKTsNCisJCWlmKEhCSVRNQVAod2luYm1wKSA9PSBOVUxMKQ0KKwkJew0KKwkJCXdpbmJtcC5DcmVhdGVDb21wYXRpYmxlQml0bWFwKHBEQyxuQ2xpZW50V2lkdGgsbkNsaWVudEhlaWdodCk7DQorCQkJd2luYm1wLlNldEJpdG1hcEJpdHMoYnVmc2l6ZSxibXBidWYpOw0KKwkJfQ0KKwkJDQorCQlNZW1EQy5TZWxlY3RPYmplY3QoJndpbmJtcCk7IA0KKwkJDQorCQlwREMtPkJpdEJsdChyYy5sZWZ0ICwgcmMudG9wICwgbkNsaWVudFdpZHRoLCBuQ2xpZW50SGVpZ2h0LCAmTWVtREMsMCwwLFNSQ0NPUFkpOw0KKwkJTWVtREMuRGVsZXRlREMoKTsgICAgDQorCQkNCisJCUZQREZCaXRtYXBfRGVzdHJveShibXB0ZW1wKTsNCisJDQorCQ0KKwlpbnQgc2l6ZSA9IG1fU2VsZWN0QXJyYXkuR2V0U2l6ZSgpOw0KKwlmb3IoaW50IGk9MDsgaTxzaXplOyBpKyspDQorCXsNCisJCQ0KKwkJDQorCQlDUmVjdCByYyA9IG1fU2VsZWN0QXJyYXkuR2V0QXQoaSk7DQorCQkNCisJCUNEQyBtZW1kYzsNCisJCUNCaXRtYXAgYm1wLCpwT2xkQml0bWFwOyANCisJCW1lbWRjLkNyZWF0ZUNvbXBhdGlibGVEQyhwREMpOyANCisJCQ0KKwkJYm1wLkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAocERDLHJjLldpZHRoKCkscmMuSGVpZ2h0KCkpOw0KKwkJDQorCQlwT2xkQml0bWFwID0gbWVtZGMuU2VsZWN0T2JqZWN0KCZibXApOw0KKwkJDQorCQltZW1kYy5GaWxsU29saWRSZWN0KDAsMCxyYy5XaWR0aCgpLHJjLkhlaWdodCgpLFJHQigwLDEwMCwxNjApKTsNCisJCQ0KKwkJQkxFTkRGVU5DVElPTiBiZjsgDQorCQkNCisJCWJmLkJsZW5kT3AgPSBBQ19TUkNfT1ZFUjsgDQorCQkNCisJCWJmLkJsZW5kRmxhZ3MgPSAwOyANCisJCQ0KKwkJYmYuU291cmNlQ29uc3RhbnRBbHBoYSA9IDB4NGY7IA0KKwkJDQorCQliZi5BbHBoYUZvcm1hdCA9IDA7DQorCQkNCisNCisJCQ0KKwkJQk9PTCByZXQ9QWxwaGFCbGVuZChwREMtPkdldFNhZmVIZGMoKSxyYy5sZWZ0LHJjLnRvcCxyYy5XaWR0aCgpLHJjLkhlaWdodCgpLG1lbWRjLkdldFNhZmVIZGMoKSwwLDAscmMuV2lkdGgoKSxyYy5IZWlnaHQoKSxiZik7DQorCQkNCisJCW1lbWRjLlNlbGVjdE9iamVjdChwT2xkQml0bWFwKTsNCisJCW1lbWRjLkRlbGV0ZURDKCk7DQorCQlibXAuRGVsZXRlT2JqZWN0KCk7DQorCQkNCisJfQ0KKwltX1NlbGVjdEFycmF5LlJlbW92ZUFsbCgpOw0KKw0KKw0KKw0KKw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OkdldE5ld1BhZ2VTaXplKGludCAmbnNpemVYLCBpbnQgJm5zaXplWSkNCit7DQorCWludCBuU2l6ZVggPSBtX25BY3R1YWxTaXplWDsNCisJaW50IG5TaXplWSA9IG1fbkFjdHVhbFNpemVZOw0KKwlpZiAoMSA9PSBtX25Sb3RhdGVGbGFnIHx8IDMgPT0gbV9uUm90YXRlRmxhZykNCisJew0KKwkJaW50IHRlbXAgPSBuU2l6ZVg7DQorCQluU2l6ZVggPSBuU2l6ZVk7DQorCQluU2l6ZVkgPSB0ZW1wOw0KKwl9DQorCSBuc2l6ZVggPSAoaW50KShuU2l6ZVgqbV9kYlNjYWxlRmFjdG9yKTsNCisJIG5zaXplWSA9IChpbnQpKG5TaXplWSptX2RiU2NhbGVGYWN0b3IpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uRG9jRmlyc3RwYWdlKCkgDQorew0KKw0KKwlpZihtX25QYWdlSW5kZXggPT0gMCkgcmV0dXJuOw0KKwl0aGlzLT5tX25QYWdlSW5kZXggPSAwOw0KKwl0aGlzLT5Mb2FkUERGUGFnZShtX3BEb2MsIDApOw0KKwlEZWxldGVBbGxSZWN0KCk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25Eb2NHb3RvcGFnZSgpIA0KK3sNCisJQ0dvdG9QYWdlRGxnIGRsZzsNCisJZGxnLkRvTW9kYWwoKTsJDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25Eb2NMYXN0cGFnZSgpIA0KK3sNCisvLyAJRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0xvYWREb2N1bWVudCgiZDpcXGExLnBkZiIsICIiKTsNCisvLyAgICAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvYywgMCk7DQorLy8gCUZQREZfSU1BR0VPQkpFQ1QgaW1nT2JqZWN0ID0gRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihkb2MpOw0KKy8vIAkgbG9uZyByZXQgPSBGUERGSW1hZ2VPYmpfTG9hZEZyb21GaWxlRXgoJnBhZ2UsIDEgLA0KKy8vIAkJCQkJCQkJIGltZ09iamVjdCwgIkU6XFx0ZW1wXFx0ZW1wXFxrLmdpZiIsVFJVRQ0KKy8vIAkJCQkJCQkJICk7DQorLy8gCSBGUERGSW1hZ2VPYmpfU2V0TWF0cml4KGltZ09iamVjdCwgMjQwLCAwLCAwLCAxNjAsIDEqNTAsIDAgKTsNCisvLyAJIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBpbWdPYmplY3QpOw0KKy8vIAkgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpOw0KKy8vIAkgRlBERl9TYXZlQXNGaWxlKGRvYywgIkQ6XFxvdXQucGRmIiwgMCwgTlVMTCwgMCwgTlVMTCwgMCk7DQorLy8gIAkgRlBERl9DbG9zZVBhZ2UocGFnZSk7DQorLy8gIAkgRlBERl9DbG9zZURvY3VtZW50KGRvYyk7DQorLy8gCXJldHVybjsNCisNCisNCisJaWYobV9uUGFnZUluZGV4ID09IG1fblRvdGFsUGFnZSAtMSkgcmV0dXJuOw0KKwl0aGlzLT5tX25QYWdlSW5kZXggPSBtX25Ub3RhbFBhZ2UgLTE7DQorCUxvYWRQREZQYWdlKG1fcERvYywgbV9uUGFnZUluZGV4KTsNCisJRGVsZXRlQWxsUmVjdCgpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uRG9jTmV4dHBhZ2UoKSANCit7DQorCW1fblBhZ2VJbmRleCArKyA7DQorCW1fblBhZ2VJbmRleCAlPSBtX25Ub3RhbFBhZ2U7DQorCUxvYWRQREZQYWdlKG1fcERvYywgbV9uUGFnZUluZGV4KTsNCisJRGVsZXRlQWxsUmVjdCgpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uRG9jUHJlcGFnZSgpIA0KK3sNCisJbV9uUGFnZUluZGV4IC0tOw0KKwlpZihtX25QYWdlSW5kZXggPCAwKSBtX25QYWdlSW5kZXggPSBtX25Ub3RhbFBhZ2UtMTsNCisJTG9hZFBERlBhZ2UobV9wRG9jLCBtX25QYWdlSW5kZXgpOw0KKwlEZWxldGVBbGxSZWN0KCk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25DbG9ja3dpc2UoKSANCit7DQorCW1fblJvdGF0ZUZsYWcgKys7DQorCW1fblJvdGF0ZUZsYWcgJT0gNDsNCisJTG9hZFBERlBhZ2UobV9wRG9jLCBtX25QYWdlSW5kZXgpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uQ291bnRlcmNsb2Nrd2lzZSgpIA0KK3sNCisJbV9uUm90YXRlRmxhZyAtLTsNCisJaWYgKG1fblJvdGF0ZUZsYWcgPCAwKSBtX25Sb3RhdGVGbGFnID0gMzsNCisJTG9hZFBERlBhZ2UobV9wRG9jLCBtX25QYWdlSW5kZXgpOw0KK30NCisNCitCT09MIENSZWFkZXJWQ1ZpZXc6OlNldFBERkRvY3VtZW50KEZQREZfRE9DVU1FTlQgcERvYywgaW50IG5QYWdlTnVtKQ0KK3sNCisJaWYocERvYyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7DQorDQorCW1fcEFwcCA9IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvdW1lbnQocERvYyx0aGlzKTsNCisJRlBERl9Mb2FkWEZBKHBEb2MpOw0KKw0KKwlGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbihtX3BBcHApOw0KKwlGT1JNX0RvRG9jdW1lbnRPcGVuQWN0aW9uKG1fcEFwcCk7DQorLy8JRk9STV9PbkFmdGVyTG9hZERvY3VtZW50KG1fcEFwcCk7DQorCUZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IobV9wQXBwLCAwLCBSR0IoMCwyNTUsIDApKTsNCisJRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShtX3BBcHAsIDEyOCk7DQorDQorCQ0KKwltX3BEb2MgPSBwRG9jOw0KKwltX25Ub3RhbFBhZ2UgPSBuUGFnZU51bTsNCisJaWYoIUxvYWRQREZQYWdlKG1fcERvYywgMCkpIHJldHVybiBGQUxTRTsNCisNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6R290b1BhZ2UoaW50IGluZGV4KQ0KK3sNCisJaWYoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fblRvdGFsUGFnZSl7TWVzc2FnZUJveEEoIkludmFsaWRhdGUgaW5kZXgiKTt9DQorCWlmKGluZGV4ID09IG1fblBhZ2VJbmRleCkgcmV0dXJuOw0KKwlpZighTG9hZFBERlBhZ2UobV9wRG9jLCBpbmRleCkpIHJldHVybjsNCisJRGVsZXRlQWxsUmVjdCgpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uVmlld0FjdHVhbFNpemUoKSANCit7DQorCW1fblN0YXJ0WCA9IG1fblN0YXJ0WSA9IDEwOw0KKwlTY2FsUGFnZSgxLjBmKTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblZpZXdGaXRQYWdlKCkgDQorew0KKwltX25TdGFydFggPSBtX25TdGFydFkgPSAxMDsNCisJQ1JlY3QgcmVjdDsNCisJR2V0Q2xpZW50UmVjdChyZWN0KTsNCisJZG91YmxlIGRiSGVpZ2h0ID0gcmVjdC5IZWlnaHQoKTsJDQorCWRvdWJsZSBkYlNjYWwgPSBkYkhlaWdodCAvIG1fbkFjdHVhbFNpemVZOw0KKwlTY2FsUGFnZShkYlNjYWwpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uVmlld0ZpdFdpZHRoKCkgDQorew0KKwltX25TdGFydFggPSBtX25TdGFydFkgPSAxMDsNCisJQ1JlY3QgcmVjdDsNCisJR2V0Q2xpZW50UmVjdChyZWN0KTsNCisJZG91YmxlIGRiV2lkdGg9IHJlY3QuV2lkdGgoKTsNCisJZG91YmxlIGRiU2NhbCA9IGRiV2lkdGggLyBtX25BY3R1YWxTaXplWDsNCisJU2NhbFBhZ2UoZGJTY2FsKTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblZpZXdab29tSW4oKSANCit7DQorCWRvdWJsZSBkYlNjYWwgPSBtX2RiU2NhbGVGYWN0b3I7DQorCWRiU2NhbCArPSAwLjI1ZjsNCisJaWYoZGJTY2FsID4gNjQwMC4wZikgcmV0dXJuOw0KKwlTY2FsUGFnZShkYlNjYWwpOw0KKwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblZpZXdab29tT3V0KCkgDQorew0KKwlkb3VibGUgZGJTY2FsID0gbV9kYlNjYWxlRmFjdG9yOw0KKwlkYlNjYWwgLT0gMC4yNWY7DQorCWlmKGRiU2NhbCA8IDAuMjVmKSByZXR1cm47DQorCVNjYWxQYWdlKGRiU2NhbCk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25WaWV3Wm9vbVRvKCkgDQorew0KKwlDWm9vbURsZyBkbGc7DQorCWRsZy5Eb01vZGFsKCk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6U2NhbFBhZ2UoZG91YmxlIGRiU2NhbCkNCit7DQorCVNldFNjYWxGYWN0b3IoZGJTY2FsKTsNCisJQ0NoaWxkRnJhbWUgKnBQYXJlbnQgPSAoQ0NoaWxkRnJhbWUgKil0aGlzLT5HZXRQYXJlbnRGcmFtZSgpOw0KKwlpZiAocFBhcmVudCAhPSBOVUxMKQ0KKwl7DQorCQlwUGFyZW50LT5TZXRBY3RpdmVWaWV3KHRoaXMpOw0KKwkJU3luY1Njcm9sbCgpOwkNCisJfQ0KKwlJbnZhbGlkYXRlKFRSVUUpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uRWRpdEZpbmQoKSANCit7DQorCWlmKG1fcFRleHRQYWdlID09IE5VTEwpDQorCXsNCisJCUFmeE1lc3NhZ2VCb3goIlNvcnJ5LCB0aGUgZnBkZnRleHQuZGxsIG1heSBoYXMgZXhwaXJlZC4gRm9yIGtlZXBpbmcgb24gdXNpbmcgdGhlIGRsbCwgcGxlYXNlIGNvbnRhY3Qgc2FsZXNAZm94aXRzb2Z0d2FyZS5jb20uIik7DQorCQlyZXR1cm47DQorCX0NCisJQ0ZpbmREbGcgZGxnOw0KKwlkbGcuRG9Nb2RhbCgpOwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpGaW5kVGV4dChDU3RyaW5nIHN0ckZpbmQsIEJPT0wgYkNhc2UsIEJPT0wgYldob2xld29yZCwgaW50IERpcmVjdGlvbikNCit7DQorCUNTdHJpbmcgc3RyOw0KKwlzdHIgPSBtX0ZpbmRJbmZvLm1fc3RyRmluZDsNCisJaW50IG5GbGFnID0gMDsNCisJaWYoYkNhc2UpIHsgbkZsYWcgfD0gRlBERl9NQVRDSENBU0U7IH0NCisJaWYoYldob2xld29yZCkgeyBuRmxhZyB8PSBGUERGX01BVENIV0hPTEVXT1JEOyB9DQorDQorCWlmKE5VTEwgPT0gbV9wVGV4dFBhZ2UpIHJldHVybjsNCisNCisJaWYgKHN0ckZpbmQuQ29tcGFyZShzdHIpICE9IDAgfHwgbkZsYWcgIT0gbV9GaW5kSW5mby5tX25GbGFnKS8vbmV3IHNlYXJjaA0KKwl7DQorCQlpZiAoTlVMTCA9PSBtX3BUZXh0UGFnZSkgcmV0dXJuOw0KKwkJaWYgKE5VTEwgIT0gbV9wU0NISGFuZGxlKQ0KKwkJew0KKwkJCUZQREZUZXh0X0ZpbmRDbG9zZShtX3BTQ0hIYW5kbGUpOw0KKwkJCW1fcFNDSEhhbmRsZSAgPSBOVUxMOw0KKwkJfQ0KKw0KKwkJaW50IGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzdHJGaW5kLkdldEJ1ZmZlcigwKSwgLTEsIE5VTEwsIE5VTEwpOw0KKwkJd2NoYXJfdCAqcEJ1ZiA9IG5ldyB3Y2hhcl90W2xlbl07DQorCQltZW1zZXQocEJ1ZiwgMCwgbGVuKnNpemVvZih3Y2hhcl90KSk7DQorCQlNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgc3RyRmluZC5HZXRCdWZmZXIoMCksIHN0ckZpbmQuR2V0TGVuZ3RoKCksIHBCdWYsIGxlbik7DQorCQlwQnVmW2xlbi0xXSA9IEwnXDAnOw0KKwkJbV9wU0NISGFuZGxlID0gRlBERlRleHRfRmluZFN0YXJ0KG1fcFRleHRQYWdlLCAoRlBERl9XSURFU1RSSU5HKXBCdWYsIG5GbGFnLCAwKTsNCisJCWlmKE5VTEwgPT0gbV9wU0NISGFuZGxlKSByZXR1cm47DQorCQkNCisgICAgICAgIGlmIChtX0ZpbmRJbmZvLm1fcEN1ckZpbmRCdWYgIT0gTlVMTCkNCisJCXsNCisJCQlkZWxldGUgW11tX0ZpbmRJbmZvLm1fcEN1ckZpbmRCdWY7DQorCQkJbV9GaW5kSW5mby5tX3BDdXJGaW5kQnVmID0gTlVMTDsNCisJCX0NCisJCW1fRmluZEluZm8ubV9wQ3VyRmluZEJ1ZiA9IG5ldyB3Y2hhcl90W2xlbl07DQorCQltZW1zZXQobV9GaW5kSW5mby5tX3BDdXJGaW5kQnVmLCAwLCBsZW4qc2l6ZW9mKHdjaGFyX3QpKTsNCisJCW1lbWNweShtX0ZpbmRJbmZvLm1fcEN1ckZpbmRCdWYsIHBCdWYsIGxlbipzaXplb2Yod2NoYXJfdCkpOw0KKw0KKwkJZGVsZXRlIFtdcEJ1ZjsNCisJCQ0KKw0KKwkJLy9zYXZlIHRoZSBmaW5kIGluZm8NCisJCW1fRmluZEluZm8ubV9zdHJGaW5kID0gc3RyRmluZDsNCisJCW1fRmluZEluZm8ubV9uRmxhZyA9IG5GbGFnOw0KKwkJbV9GaW5kSW5mby5tX25EaXJlY3Rpb24gPSBEaXJlY3Rpb247DQorCQltX0ZpbmRJbmZvLm1fblN0YXJ0UGFnZUluZGV4ID0gbV9uUGFnZUluZGV4Ow0KKwkJbV9GaW5kSW5mby5tX2JGaXJzdCA9IFRSVUU7DQorCQkNCisJCQ0KKwl9DQorCUZpbmROZXh0KERpcmVjdGlvbik7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6RmluZE5leHQoaW50IG5EaXJlY3Rpb24pDQorew0KKwlpZihOVUxMID09IG1fcFNDSEhhbmRsZSkgcmV0dXJuOw0KKwlCT09MIGJSZXN1bHQgPSBGQUxTRTsNCisJDQorCWlmIChuRGlyZWN0aW9uICE9IG1fRmluZEluZm8ubV9uRGlyZWN0aW9uKQ0KKwl7DQorCQltX0ZpbmRJbmZvLm1fbkRpcmVjdGlvbiA9IG5EaXJlY3Rpb247DQorCQltX0ZpbmRJbmZvLm1fYkZpcnN0ID0gVFJVRTsNCisJfQ0KKw0KKwlpZiAoMCA9PSBuRGlyZWN0aW9uKS8vIGZpbmQgZG93bg0KKwl7DQorCQliUmVzdWx0ID0gRlBERlRleHRfRmluZE5leHQobV9wU0NISGFuZGxlKTsNCisJfQ0KKwlpZiAoMSA9PSBuRGlyZWN0aW9uKQ0KKwl7DQorCQliUmVzdWx0ID0gRlBERlRleHRfRmluZFByZXYobV9wU0NISGFuZGxlKTsNCisJfQ0KKwkNCisJd2hpbGUoIWJSZXN1bHQpew0KKw0KKwkJCWlmIChtX3J0RmluZCAhPSBOVUxMKQ0KKwkJCXsNCisJCQkJZGVsZXRlIFtdIG1fcnRGaW5kOw0KKwkJCQltX3J0RmluZCA9IE5VTEw7DQorCQkJfQ0KKw0KKwkJCWlmICgwID09IG5EaXJlY3Rpb24pDQorCQkJew0KKwkJCQltX25QYWdlSW5kZXggKys7DQorCQkJCW1fblBhZ2VJbmRleCAlPSBtX25Ub3RhbFBhZ2U7DQorCQkJCWlmKCFMb2FkUERGUGFnZShtX3BEb2MsIG1fblBhZ2VJbmRleCkpIHJldHVybjsNCisJCQkJaWYgKE5VTEwgPT0gbV9wVGV4dFBhZ2UpIHJldHVybjsNCisJCQkJaWYgKE5VTEwgIT0gbV9wU0NISGFuZGxlKQ0KKwkJCQl7DQorCQkJCQlGUERGVGV4dF9GaW5kQ2xvc2UobV9wU0NISGFuZGxlKTsNCisJCQkJCW1fcFNDSEhhbmRsZSAgPSBOVUxMOw0KKwkJCQl9DQorCQkJCW1fcFNDSEhhbmRsZSA9IEZQREZUZXh0X0ZpbmRTdGFydChtX3BUZXh0UGFnZSwgKEZQREZfV0lERVNUUklORyltX0ZpbmRJbmZvLm1fcEN1ckZpbmRCdWYsIG1fRmluZEluZm8ubV9uRmxhZywgMCk7DQorCQkJCWlmKE5VTEwgPT0gbV9wU0NISGFuZGxlKSBicmVhazsNCisJCQkJYlJlc3VsdCA9IEZQREZUZXh0X0ZpbmROZXh0KG1fcFNDSEhhbmRsZSk7DQorCQkJCWlmKCFiUmVzdWx0ICYmIG1fblBhZ2VJbmRleCA9PSBtX0ZpbmRJbmZvLm1fblN0YXJ0UGFnZUluZGV4KSBicmVhazsNCisJCQl9IA0KKwkJCWVsc2UNCisJCQl7DQorCQkJCW1fblBhZ2VJbmRleCAtLTsNCisJCQkJaWYgKG1fblBhZ2VJbmRleCA8IDApIHttX25QYWdlSW5kZXggPSBtX25Ub3RhbFBhZ2UgLSAxO30NCisJCQkJaWYoIUxvYWRQREZQYWdlKG1fcERvYywgbV9uUGFnZUluZGV4KSkgcmV0dXJuOw0KKwkJCQlpZiAoTlVMTCA9PSBtX3BUZXh0UGFnZSkgcmV0dXJuOw0KKwkJCQlpZiAoTlVMTCAhPSBtX3BTQ0hIYW5kbGUpDQorCQkJCXsNCisJCQkJCUZQREZUZXh0X0ZpbmRDbG9zZShtX3BTQ0hIYW5kbGUpOw0KKwkJCQkJbV9wU0NISGFuZGxlICA9IE5VTEw7DQorCQkJCX0NCisJCQkJbV9wU0NISGFuZGxlID0gRlBERlRleHRfRmluZFN0YXJ0KG1fcFRleHRQYWdlLCAoRlBERl9XSURFU1RSSU5HKW1fRmluZEluZm8ubV9wQ3VyRmluZEJ1ZiwgbV9GaW5kSW5mby5tX25GbGFnLCAwKTsNCisJCQkJaWYoTlVMTCA9PSBtX3BTQ0hIYW5kbGUpIGJyZWFrOw0KKwkJCQliUmVzdWx0ID0gRlBERlRleHRfRmluZFByZXYobV9wU0NISGFuZGxlKTsNCisJCQkJaWYoIWJSZXN1bHQgJiYgbV9uUGFnZUluZGV4ID09IG1fRmluZEluZm8ubV9uU3RhcnRQYWdlSW5kZXgpIGJyZWFrOw0KKwkJCX0NCisJfS8vZW5kIHdoaWxlDQorCQ0KKwlpZighYlJlc3VsdCkvL2ZpbmQgb3Zlcg0KKwl7DQorCQlGUERGVGV4dF9GaW5kQ2xvc2UobV9wU0NISGFuZGxlKTsNCisJCW1fcFNDSEhhbmRsZSA9IE5VTEw7DQorDQorCQlpZiAobV9ydEZpbmQgIT0gTlVMTCkNCisJCXsNCisJCQlkZWxldGUgW10gbV9ydEZpbmQ7DQorCQkJbV9ydEZpbmQgPSBOVUxMOw0KKwkJfQ0KKwkJDQorCQltX0ZpbmRJbmZvLm1fYkZpcnN0ID0gVFJVRTsNCisJCW1fRmluZEluZm8ubV9uRGlyZWN0aW9uID0gLTE7DQorCQltX0ZpbmRJbmZvLm1fbkZsYWcgPSAtMTsNCisJCW1fRmluZEluZm8ubV9uU3RhcnRDaGFySW5kZXggPSAtMTsNCisJCW1fRmluZEluZm8ubV9uU3RhcnRQYWdlSW5kZXggPSAtMTsNCisJCW1fRmluZEluZm8ubV9wQ3VyRmluZEJ1ZiA9IE5VTEw7DQorCQltX0ZpbmRJbmZvLm1fc3RyRmluZCA9IF9UKCIiKTsNCisNCisJCU1lc3NhZ2VCb3goIkZpbmQgY29tcGxldGUhIiwgIkZpbmQgSW5mb21hdGlvbiIsIE1CX09LIHwgTUJfSUNPTklORk9STUFUSU9OKTsNCisJCXJldHVybjsNCisJfQ0KKwkNCisJDQorCQ0KKwlpbnQgaW5kZXggPSBGUERGVGV4dF9HZXRTY2hSZXN1bHRJbmRleChtX3BTQ0hIYW5kbGUpOw0KKwlpZiAobV9uUGFnZUluZGV4ID09IG1fRmluZEluZm8ubV9uU3RhcnRQYWdlSW5kZXggJiYgaW5kZXggPT0gbV9GaW5kSW5mby5tX25TdGFydENoYXJJbmRleCAmJiAhbV9GaW5kSW5mby5tX2JGaXJzdCApDQorCXsNCisJCWlmIChOVUxMICE9IG1fcFNDSEhhbmRsZSkNCisJCXsNCisJCQlGUERGVGV4dF9GaW5kQ2xvc2UobV9wU0NISGFuZGxlKTsNCisJCQltX3BTQ0hIYW5kbGUgID0gTlVMTDsNCisJCX0NCisJCU1lc3NhZ2VCb3goIkZpbmQgY29tcGxldGUhIiwgIkZpbmQgSW5mb21hdGlvbiIsIE1CX09LIHwgTUJfSUNPTklORk9STUFUSU9OKTsNCisJCXJldHVybjsNCisJfWVsc2V7DQorCQlDREMgKnBEQyA9IEdldERDKCk7DQorCQlEcmF3QWxsUmVjdChwREMpOy8vdXBkYXRlDQorDQorCQlpbnQgbkNvdW50ID0gRlBERlRleHRfR2V0U2NoQ291bnQobV9wU0NISGFuZGxlKTsNCisJCWludCBuUmVjdHMgPSBGUERGVGV4dF9Db3VudFJlY3RzKG1fcFRleHRQYWdlLCBpbmRleCwgbkNvdW50KTsNCisJCWlmIChtX3J0RmluZCAhPSBOVUxMKQ0KKwkJew0KKwkJCWRlbGV0ZSBbXSBtX3J0RmluZDsNCisJCQltX3J0RmluZCA9IE5VTEw7DQorCQl9DQorCQltX3J0RmluZCA9IG5ldyBQREZSZWN0W25SZWN0c107DQorCQltX25SZWN0TnVtID0gblJlY3RzOw0KKwkJZm9yIChpbnQgaT0wOyBpPG5SZWN0czsgaSsrKQ0KKwkJewkNCisJCQlkb3VibGUgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOwkNCisJCQlGUERGVGV4dF9HZXRSZWN0KG1fcFRleHRQYWdlLCBpLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsNCisJCQltX3J0RmluZFtpXS5tX2RiTGVmdCA9IGxlZnQ7DQorCQkJbV9ydEZpbmRbaV0ubV9kYlRvcCA9IHRvcDsNCisJCQltX3J0RmluZFtpXS5tX2RiUmlnaHQgPSByaWdodDsNCisJCQltX3J0RmluZFtpXS5tX2RiQm90dG9tID0gYm90dG9tOw0KKwkJfQ0KKwkJRHJhd0FsbFJlY3QocERDKTsvL2RyYXcgbmV3IHJlY3QNCisJCVJlbGVhc2VEQyhwREMpOw0KKwl9DQorDQorCWlmIChtX0ZpbmRJbmZvLm1fYkZpcnN0KQ0KKwl7Ly9maW5kIGZpcnN0IHN0cmluZywgc3RvcmUgaW5mbzsNCisJCW1fRmluZEluZm8ubV9iRmlyc3QgPSBGQUxTRTsNCisJCW1fRmluZEluZm8ubV9uU3RhcnRDaGFySW5kZXggPSBpbmRleDsNCisJCW1fRmluZEluZm8ubV9uU3RhcnRQYWdlSW5kZXggPSBtX25QYWdlSW5kZXg7IA0KKwl9DQorCQ0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OkRyYXdSZXZlcnNlKENEQyAqcERDLCBDUmVjdCByZWN0KQ0KK3sNCisJQ1JlY3QgcnQgPSByZWN0Ow0KKwlyZWN0LmxlZnQgPSBfX21pbihydC5sZWZ0LCBydC5yaWdodCk7DQorCXJlY3QucmlnaHQgPSBfX21heChydC5sZWZ0LCBydC5yaWdodCk7DQorCXJlY3QudG9wID0gX19taW4ocnQudG9wLCBydC5ib3R0b20pOw0KKwlyZWN0LmJvdHRvbSA9IF9fbWF4KHJ0LnRvcCwgcnQuYm90dG9tKTsNCisNCisJQVNTRVJUKHBEQyk7DQorCWludCBibXBfd2lkdGg9YWJzKHJlY3QuV2lkdGgoKSk7DQorCWludCBibXBfaGVpZ2h0PWFicyhyZWN0LkhlaWdodCgpKTsJDQorCUhCSVRNQVAgaGJtcCA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAocERDLT5tX2hEQywgYm1wX3dpZHRoLCBibXBfaGVpZ2h0KTsNCisJQ0RDIE1lbURDOw0KKwlNZW1EQy5DcmVhdGVDb21wYXRpYmxlREMocERDKTsNCisJSEJJVE1BUCBob2xkYm1wICA9IChIQklUTUFQKU1lbURDLlNlbGVjdE9iamVjdChoYm1wKTsNCisJLy8gY29weSBzY3JlZW4gREMgdG8gbWVtb3J5IERDDQorCUJpdEJsdChNZW1EQywgMCwgMCwgYm1wX3dpZHRoLCBibXBfaGVpZ2h0LAlwREMtPm1faERDLCByZWN0LmxlZnQscmVjdC50b3AsIFNSQ0NPUFkpOw0KKwlNZW1EQy5TZWxlY3RPYmplY3QoaG9sZGJtcCk7DQorCQ0KKwlCSVRNQVBJTkZPIGJtaTsNCisJbWVtc2V0KCZibWksIDAsIHNpemVvZiBibWkpOw0KKwlibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZiBibWkuYm1pSGVhZGVyOw0KKwlibWkuYm1pSGVhZGVyLmJpQml0Q291bnQgPSAyNDsNCisJYm1pLmJtaUhlYWRlci5iaUNsckltcG9ydGFudCA9IDA7DQorCWJtaS5ibWlIZWFkZXIuYmlDbHJVc2VkID0gMDsNCisJYm1pLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOw0KKwlibWkuYm1pSGVhZGVyLmJpSGVpZ2h0ID0gYm1wX2hlaWdodDsNCisJYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7DQorCWJtaS5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSAwOw0KKwlibWkuYm1pSGVhZGVyLmJpV2lkdGggPSBibXBfd2lkdGg7DQorCWJtaS5ibWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0gMDsNCisJYm1pLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOw0KKwkNCisJLy8gZ2V0IGJpdG1hcCBzdHJlYW0NCisJaW50IHJldCA9IEdldERJQml0cyhNZW1EQywgaGJtcCwgMCxibXBfaGVpZ2h0LCBOVUxMLCAmYm1pLCBESUJfUkdCX0NPTE9SUyk7DQorCQ0KKwlpbnQgc2l6ZSA9IGJtaS5ibWlIZWFkZXIuYmlTaXplSW1hZ2U7DQorCQ0KKwlCWVRFKiBwQml0cyA9IG5ldyBCWVRFW3NpemVdOw0KKwltZW1zZXQocEJpdHMsIDAsIHNpemUpOw0KKwlyZXQgPSBHZXRESUJpdHMoTWVtREMsIGhibXAsIDAsYm1wX2hlaWdodCwgcEJpdHMsICZibWksIERJQl9SR0JfQ09MT1JTKTsNCisJcmV0ID0gR2V0TGFzdEVycm9yKCk7DQorCURlbGV0ZU9iamVjdChoYm1wKTsNCisJTWVtREMuRGVsZXRlREMoKTsNCisJZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1wX2hlaWdodDsgcm93ICsrKSB7DQorCQlpbnQgcGl0Y2ggPSAoYm1wX3dpZHRoICogMyArIDMpIC8gNCAqIDQ7DQorCQlpbnQgcm93cG9zID0gcm93ICogcGl0Y2g7DQorCQlmb3IoaW50IGNvbCA9IDA7IGNvbCA8IGJtcF93aWR0aDsgY29sICsrKXsNCisJCQlpbnQgaSA9IHJvd3BvcyArIGNvbCAqIDM7CQ0KKwkJCXBCaXRzW2ldCQk9IDI1NS1wQml0c1tpXSA7CQkNCisJCQlwQml0c1tpICsgMV0JPSAyNTUtcEJpdHNbaSArIDFdOw0KKwkJCXBCaXRzW2kgKyAyXQk9IDI1NS1wQml0c1tpICsgMl07CQ0KKwkJfQ0KKwl9DQorCXJldCA9IFNldERJQml0c1RvRGV2aWNlKHBEQy0+bV9oREMscmVjdC5sZWZ0LHJlY3QudG9wLGJtcF93aWR0aCwgYm1wX2hlaWdodCwwLCAwLCAwLCBibXBfaGVpZ2h0LCBwQml0cywgJmJtaSwgRElCX1JHQl9DT0xPUlMpOw0KKwlkZWxldGUgW11wQml0czsJDQorDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6RHJhd0FsbFJlY3QoQ0RDICpwREMpDQorew0KKwlpbnQgaTsNCisJaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsNCisNCisJaW50IG5TaXplWCA9IDA7IA0KKwlpbnQgblNpemVZID0gMDsNCisvLwlpbnQgdGVtcCA9IDA7CQ0KKwlpZiAoMSA9PSBtX25Sb3RhdGVGbGFnIHx8IDMgPT0gbV9uUm90YXRlRmxhZykNCisJew0KKwkJblNpemVYID0gbV9uQWN0dWFsU2l6ZVk7DQorCQluU2l6ZVkgPSBtX25BY3R1YWxTaXplWDsNCisJfQ0KKwllbHNlDQorCXsNCisJCW5TaXplWCA9IG1fbkFjdHVhbFNpemVYOw0KKwkJblNpemVZID0gbV9uQWN0dWFsU2l6ZVk7DQorCX0NCisJQVNTRVJUKHBEQyk7DQorCWlmIChtX3J0RmluZCAhPSBOVUxMKQ0KKwl7DQorCQlmb3IgKGk9MDsgaTxtX25SZWN0TnVtOyBpKyspDQorCQl7DQorCQkJDQorCQkJUERGUmVjdCByZWN0ID0gbV9ydEZpbmRbaV07DQorCQkJRlBERl9QYWdlVG9EZXZpY2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5TaXplWCAqIG1fZGJTY2FsZUZhY3RvciksDQorCQkJCShpbnQpKG5TaXplWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIHJlY3QubV9kYkxlZnQsIHJlY3QubV9kYlRvcCwgJmxlZnQsICZ0b3ApOw0KKwkJCUZQREZfUGFnZVRvRGV2aWNlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCAoaW50KShuU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKwkJCQkoaW50KShuU2l6ZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCByZWN0Lm1fZGJSaWdodCwgcmVjdC5tX2RiQm90dG9tLCAmcmlnaHQsICZib3R0b20pOw0KKwkJCUNSZWN0IHJ0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7DQorCQkJRHJhd1JldmVyc2UocERDLCBydCk7DQorDQorCQl9DQorCX0NCisNCisJaWYgKG1fcnRBcnJheS5HZXRTaXplKCkgIT0gMCkNCisJew0KKwkJZm9yIChpPTA7IGk8bV9ydEFycmF5LkdldFNpemUoKTsgaSsrKQ0KKwkJew0KKwkJCVBERlJlY3QgcmVjdCA9IG1fcnRBcnJheS5HZXRBdChpKTsNCisJCQlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgKGludCkoblNpemVYICogbV9kYlNjYWxlRmFjdG9yKSwNCisJCQkJKGludCkoblNpemVZICogbV9kYlNjYWxlRmFjdG9yKSwgbV9uUm90YXRlRmxhZywgcmVjdC5tX2RiTGVmdCwgcmVjdC5tX2RiVG9wLCAmbGVmdCwgJnRvcCk7DQorCQkJRlBERl9QYWdlVG9EZXZpY2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5TaXplWCAqIG1fZGJTY2FsZUZhY3RvciksDQorCQkJCShpbnQpKG5TaXplWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIHJlY3QubV9kYlJpZ2h0LCByZWN0Lm1fZGJCb3R0b20sICZyaWdodCwgJmJvdHRvbSk7DQorCQkJQ1JlY3QgcnQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsNCisJCQlEcmF3UmV2ZXJzZShwREMsIHJ0KTsNCisJCX0NCisJfQ0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OkRlbGV0ZUFsbFJlY3QoKQ0KK3sNCisJQ0RDICpwREMgPSBHZXREQygpOw0KKwlEcmF3QWxsUmVjdChwREMpOw0KKwlSZWxlYXNlREMocERDKTsNCisNCisJaWYgKG1fcnRGaW5kICE9IE5VTEwpDQorCXsNCisJCWRlbGV0ZSBbXW1fcnRGaW5kOw0KKwkJbV9ydEZpbmQgPSBOVUxMOw0KKwl9DQorCQ0KKwlpZiAobV9ydEFycmF5LkdldFNpemUoKSAhPSAwKQ0KKwl7DQorCQltX3J0QXJyYXkuUmVtb3ZlQWxsKCk7DQorCX0NCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPbkZpbGVQcmludCgpIA0KK3sNCisJQ1N0cmluZyBzdHJEb2MgPSBHZXREb2N1bWVudCgpLT5HZXRUaXRsZSgpOyANCisJQ1ByaW50RGlhbG9nIGRsZyhGQUxTRSwgUERfUEFHRU5VTVMgfCBQRF9VU0VERVZNT0RFQ09QSUVTKTsNCisJZGxnLm1fcGQubk1pblBhZ2UgPSBkbGcubV9wZC5uRnJvbVBhZ2UgPTE7DQorCWRsZy5tX3BkLm5NYXhQYWdlID0gZGxnLm1fcGQublRvUGFnZSA9IG1fblRvdGFsUGFnZTsNCisJaWYgKGRsZy5Eb01vZGFsKCkgPT0gSURPSykNCisJew0KKwkJaW50IGZyb21fcGFnZSwgdG9fcGFnZTsNCisJCWlmIChkbGcuUHJpbnRBbGwoKSkgICAgICAgICAgICAgIA0KKwkJew0KKwkJCWZyb21fcGFnZSA9IGRsZy5tX3BkLm5NaW5QYWdlOw0KKwkJCXRvX3BhZ2UgPSBkbGcubV9wZC5uTWF4UGFnZTsNCisJCX0NCisJCWVsc2UgaWYgKGRsZy5QcmludFJhbmdlKCkpICAgICAgIA0KKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJZnJvbV9wYWdlID0gZGxnLkdldEZyb21QYWdlKCk7DQorCQkJdG9fcGFnZSA9IGRsZy5HZXRUb1BhZ2UoKTsNCisJCX0NCisJCWVsc2UgaWYgKGRsZy5QcmludFNlbGVjdGlvbigpKSAgIA0KKwkJew0KKwkJCWZyb21fcGFnZSA9IHRvX3BhZ2UgPSBtX25QYWdlSW5kZXggKyAxOyAgICAgDQorCQl9DQorCQkNCisJCUhEQyBwcmludERDOw0KKwkJRE9DSU5GTyBkb2NJbmZvOw0KKw0KKwkJcHJpbnREQyA9IGRsZy5DcmVhdGVQcmludGVyREMoKTsNCisJCWlmKE5VTEwgPT0gcHJpbnREQykgcmV0dXJuOw0KKwkJZG9jSW5mby5jYlNpemUgPSBzaXplb2YoRE9DSU5GTyk7DQorCQlkb2NJbmZvLmZ3VHlwZSA9IDA7DQorCQlkb2NJbmZvLmxwc3pEYXRhdHlwZSA9IE5VTEw7DQorCQlkb2NJbmZvLmxwc3pPdXRwdXQgPSBOVUxMOw0KKwkJZG9jSW5mby5scHN6RG9jTmFtZSA9IHN0ckRvYzsNCisNCisgICAgCWlmKFN0YXJ0RG9jKHByaW50REMsICZkb2NJbmZvKSA8PSAwKSByZXR1cm47DQorCQkvL0ZQREZfRE9DVU1FTlQgcERvYyA9IE5VTEw7DQorCQlGUERGX1BBR0UgcFBhZ2UgPSBOVUxMOw0KKwkJQ1N0cmluZyBzdHI7DQorCQlmb3IgKGludCBpPWZyb21fcGFnZS0xOyBpPHRvX3BhZ2U7IGkrKykNCisJCXsNCisJCQlpZihwUGFnZSAhPSBOVUxMKQ0KKwkJCXsNCisJCQkJRlBERl9DbG9zZVBhZ2UocFBhZ2UpOw0KKwkJCQlwUGFnZSA9IE5VTEw7DQorCQkJfQ0KKwkJCXBQYWdlID0gRlBERl9Mb2FkUGFnZShtX3BEb2MsIGkpOw0KKwkJCWRvdWJsZSBucGFnZXdpZHRoID0gRlBERl9HZXRQYWdlV2lkdGgobV9wUGFnZSk7DQorCQkJZG91YmxlIG5wYWdlaGVpZ2h0ID0gRlBERl9HZXRQYWdlSGVpZ2h0KG1fcFBhZ2UpOw0KKwkJCQ0KKwkJCWludCBsb2dwaXhlbHN4LGxvZ3BpeGVsc3k7DQorCQkJLy9jYWxjdWxhdGUgdGhlIHBhZ2Ugc2l6ZQ0KKwkJCWxvZ3BpeGVsc3ggPSBHZXREZXZpY2VDYXBzKHByaW50REMsTE9HUElYRUxTWCk7DQorCQkJbG9ncGl4ZWxzeSA9IEdldERldmljZUNhcHMocHJpbnREQyxMT0dQSVhFTFNZKTsNCisJCQlpbnQgbnNpemVYID0gKGludCkobnBhZ2V3aWR0aCAvIDcyICpsb2dwaXhlbHN4ICsgMC41Zik7DQorCQkJaW50IG5zaXplWSA9IChpbnQpKG5wYWdlaGVpZ2h0IC8gNzIgKmxvZ3BpeGVsc3kgKyAwLjVmKTsNCisJCQkNCisJCQlpZihTdGFydFBhZ2UocHJpbnREQykgPD0gMCkNCisJCQl7CQ0KKwkJCQlzdHIuRm9ybWF0KCJvbmUgZXJyb3Igb2NjdXJlZCB3aGVuIHN0YXJ0IHRoZSBwYWdlICVkIiwgaSk7DQorCQkJCU1lc3NhZ2VCb3goc3RyKTsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisNCisJCQkvL3JlbmRlciB0byBwcmludCBkZXZpY2UNCisJCQlGUERGX1JlbmRlclBhZ2UocHJpbnREQywgcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCBuc2l6ZVgsIG5zaXplWSwgbV9uUm90YXRlRmxhZywgMCk7DQorCQkJDQorCQkJaWYoRW5kUGFnZShwcmludERDKSA8PSAwKQ0KKwkJCXsNCisJCQkJc3RyLkZvcm1hdCgib25lIGVycm9yIG9jY3VyZWQgd2hlbiBjbG9zZSB0aGUgcGFnZSAlZCIsIGkpOw0KKwkJCQlNZXNzYWdlQm94KHN0cik7DQorCQkJCXJldHVybjsNCisJCQl9DQorDQorCQl9Ly9lbmQgZm9yDQorCQlFbmREb2MocHJpbnREQyk7DQorCQlpZighRGVsZXRlREMocHJpbnREQykpLy8gZGVsZXRlIHByaW50REMNCisJCQlNZXNzYWdlQm94KCJjYW4gbm90IGRlbGV0ZSB0aGUgcHJpbnRlciIpOw0KKwl9CQ0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uTEJ1dHRvbkRvd24oVUlOVCBuRmxhZ3MsIENQb2ludCBwb2ludCkgDQorew0KKwkvLyBUT0RPOiBBZGQgeW91ciBtZXNzYWdlIGhhbmRsZXIgY29kZSBoZXJlIGFuZC9vciBjYWxsIGRlZmF1bHQNCisNCisJZG91YmxlIHBhZ2VfeCA9IDA7DQorCWRvdWJsZSBwYWdlX3kgPSAwOw0KKwlEZXZpY2VUb1BhZ2UocG9pbnQsIHBhZ2VfeCwgcGFnZV95KTsNCisNCisJaWYobV9wQXBwKQ0KKwl7DQorCQlGUERGX0JPT0wgYj0gIEZPUk1fT25MQnV0dG9uRG93bihtX3BBcHAsIG1fcFBhZ2UsQ29tcG9zZUZsYWcoKSxwYWdlX3gsIHBhZ2VfeSk7DQorCQlpZihiKQ0KKwkJCXJldHVybjsNCisJfQ0KKwlEZWxldGVBbGxSZWN0KCk7DQorCUxvYWRNeUN1cnNvcigxKTsNCisJbV9wdExCRG93biA9IHBvaW50Ow0KKw0KKw0KKwlpZiAobV9iU2VsZWN0KQ0KKwl7DQorCQltX2JIYXNDaGFyID0gR2V0Q2hhckluZGV4QnlQb2ludChwb2ludCwgbV9uU3RhcnRJbmRleCk7DQorCQlDcmVhdGVDYXJldChwb2ludCk7DQorCX0NCisJaWYgKG1fYkhhbmQpDQorCXsJDQorCQltX25Qb3NIID0gR2V0U2Nyb2xsUG9zKFNCX0hPUlopOy8vU2V0U2Nyb2xsUG9zKFNCX1ZFUlQsIHBvaW50LnksIFRSVUUpOw0KKwkJbV9uUG9zViA9IEdldFNjcm9sbFBvcyhTQl9WRVJUKTsNCisJfQ0KKwlDVmlldzo6T25MQnV0dG9uRG93bihuRmxhZ3MsIHBvaW50KTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPbkxCdXR0b25VcChVSU5UIG5GbGFncywgQ1BvaW50IHBvaW50KSANCit7DQorDQorCS8vIFRPRE86IEFkZCB5b3VyIG1lc3NhZ2UgaGFuZGxlciBjb2RlIGhlcmUgYW5kL29yIGNhbGwgZGVmYXVsdA0KKwlkb3VibGUgcGFnZV94ID0gMDsNCisJZG91YmxlIHBhZ2VfeSA9IDA7DQorCURldmljZVRvUGFnZShwb2ludCwgcGFnZV94LCBwYWdlX3kpOw0KKw0KKwlpZihtX3BBcHApDQorCXsNCisJCWlmKEZPUk1fT25MQnV0dG9uVXAobV9wQXBwLCBtX3BQYWdlLENvbXBvc2VGbGFnKCksIHBhZ2VfeCwgcGFnZV95KSkNCisJCQlyZXR1cm47DQorCX0NCisJTG9hZE15Q3Vyc29yKCk7DQorCW1fcHRMQlVwID0gcG9pbnQ7DQorCWlmIChtX2JTZWxlY3QgfHwgbV9iU25hcCkNCisJew0KKwkJQ0RDICpwREMgID0gR2V0REMoKTsNCisJCUNQZW4gKnBPbGRQZW47DQorCQlDUGVuIHBlbjsNCisJCUNCcnVzaCAqcE9sZEJyOw0KKwkJQ1JlY3QgcmVjdDsNCisJCXBlbi5DcmVhdGVQZW4oUFNfREFTSCwgMiwgUkdCKDI1NSwwLDApKTsNCisJCXBPbGRQZW4gPSBwREMtPlNlbGVjdE9iamVjdCgmcGVuKTsNCisJCXBPbGRCciA9IChDQnJ1c2gqKSAocERDLT5TZWxlY3RTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7DQorCQlpbnQgbk9sZFJvcCA9IHBEQy0+U2V0Uk9QMihSMl9YT1JQRU4pOw0KKwkJcERDLT5SZWN0YW5nbGUobV9ydE9sZCk7DQorCQlwREMtPlNldFJPUDIobk9sZFJvcCk7DQorCQltX3J0T2xkLmxlZnQgPSBtX3J0T2xkLnRvcCA9IG1fcnRPbGQucmlnaHQgPSBtX3J0T2xkLmJvdHRvbSA9IDA7DQorCQlSZWxlYXNlREMocERDKTsNCisJfQ0KKwkNCisJaWYgKG1fYlNuYXApDQorCXsJDQorCQlCT09MIG9wZW4gPSBPcGVuQ2xpcGJvYXJkKCk7DQorCQlpZiAob3BlbikNCisJCXsNCisJCQk6OkVtcHR5Q2xpcGJvYXJkKCk7DQorCQkJaW50IGJtcFdpZHRoID0gYWJzKHBvaW50LnggLSBtX3B0TEJEb3duLngpOw0KKwkJCWludCBibXBIZWlnaHQgPSBhYnMocG9pbnQueSAtIG1fcHRMQkRvd24ueSk7DQorCQkJaWYgKGJtcEhlaWdodCA9PSAwIHx8IGJtcFdpZHRoID09IDApcmV0dXJuOw0KKwkJCUNSZWN0IGJtcFJlY3QobV9wdExCRG93biwgcG9pbnQpOw0KKwkJCUNDbGllbnREQyBkYyh0aGlzKTsNCisJCQlDQml0bWFwICpwQml0bWFwID0gbmV3IENCaXRtYXAoKTsNCisJCQlwQml0bWFwLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKCZkYyxibXBXaWR0aCxibXBIZWlnaHQpOw0KKwkJCUNEQyBtZW1EQzsNCisJCQltZW1EQy5DcmVhdGVDb21wYXRpYmxlREMoJmRjKTsNCisJCQltZW1EQy5TZWxlY3RPYmplY3QocEJpdG1hcCk7DQorCQkJQ0JydXNoIHdoaXRlQnJ1c2goUkdCKDI1NSwyNTUsMjU1KSk7DQorCQkJLy9tZW1EQy5GaWxsUmVjdChibXBSZWN0LCZ3aGl0ZUJydXNoKTsNCisJCQltZW1EQy5CaXRCbHQoMCwgMCwgYm1wUmVjdC5XaWR0aCgpLCBibXBSZWN0LkhlaWdodCgpLCZkYywgYm1wUmVjdC5sZWZ0LCBibXBSZWN0LnRvcCxTUkNDT1BZKTsNCisJCQlIQklUTUFQIGhCaXRtYXAgPSAoSEJJVE1BUCkgKnBCaXRtYXA7DQorCQkJOjogU2V0Q2xpcGJvYXJkRGF0YShDRl9CSVRNQVAsIGhCaXRtYXApOw0KKwkJCTo6Q2xvc2VDbGlwYm9hcmQoKTsNCisJCQlNZXNzYWdlQm94KCJUaGUgc2VsZWN0ZWQgYXJlYSBoYXMgYmVlbiBjb3BpZWQgdG8gY2xpcGJvYXJkISIpOw0KKwkJCWRlbGV0ZSBwQml0bWFwOw0KKwkJfQ0KKwl9DQorCQ0KKwlGUERGX0xJTksgaGxpbms9TlVMTDsNCisJZG91YmxlIHBkZngscGRmeTsNCisNCisJaW50IG5BY3R1YWxSYW5nZVggPSAwOw0KKwlpbnQgbkFjdHVhbFJhbmdlWSA9IDA7DQorCWlmICggbV9uUm90YXRlRmxhZyAlIDIgPT0gMCApDQorCXsNCisJCW5BY3R1YWxSYW5nZVggPSBtX25BY3R1YWxTaXplWDsNCisJCW5BY3R1YWxSYW5nZVkgPSBtX25BY3R1YWxTaXplWTsNCisJfWVsc2V7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVk7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVg7DQorCX0NCisNCisJRlBERl9EZXZpY2VUb1BhZ2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5BY3R1YWxSYW5nZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKwkJKGludCkobkFjdHVhbFJhbmdlWSAqIG1fZGJTY2FsZUZhY3RvciksbV9uUm90YXRlRmxhZyxwb2ludC54LHBvaW50LnksJnBkZngsJnBkZnkpOw0KKwlobGluaz1GUERGTGlua19HZXRMaW5rQXRQb2ludChtX3BQYWdlLHBkZngscGRmeSk7DQorCWlmIChobGluaykNCisJew0KKwkJRlBERl9BQ1RJT04gaGFjdGlvbj1OVUxMOw0KKwkJRlBERl9ERVNUIGhMaW5rRGVzdD1OVUxMOw0KKwkJaGFjdGlvbj1GUERGTGlua19HZXRBY3Rpb24oaGxpbmspOw0KKwkJaExpbmtEZXN0PUZQREZMaW5rX0dldERlc3QobV9wRG9jLGhsaW5rKTsNCisJCWlmIChoYWN0aW9uKQ0KKwkJew0KKwkJCWludCBuQWN0aW9uVHlwZT1GUERGQWN0aW9uX0dldFR5cGUoaGFjdGlvbik7DQorCQkJc3dpdGNoKG5BY3Rpb25UeXBlKQ0KKwkJCXsNCisJCQljYXNlIFBERkFDVElPTl9VTlNVUFBPUlRFRDogLy8gVW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBQREZBQ1RJT05fR09UTzoJCS8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGN1cnJlbnQgZG9jdW1lbnQJDQorCQkJCXsNCisJCQkJCUZQREZfTElOSyBoQWN0TGlua0Rlc3QgPSAgRlBERkFjdGlvbl9HZXREZXN0KG1fcERvYyxoYWN0aW9uKTsNCisJCQkJCWlmIChoQWN0TGlua0Rlc3QpDQorCQkJCQl7DQorCQkJCQkJaW50IG5QYWdlSW5kZXg9RlBERkRlc3RfR2V0UGFnZUluZGV4KG1fcERvYyxoQWN0TGlua0Rlc3QpOw0KKwkJCQkJCUdvdG9QYWdlKG5QYWdlSW5kZXgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUERGQUNUSU9OX1JFTU9URUdPVE86CS8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQNCisJCQkJDQorCQkJCS8vCUZQREZBY3Rpb25fR2V0RmlsZVBhdGgoLi4uKTsNCisJCQkJLy8JLi4uLi4JDQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUERGQUNUSU9OX1VSSToJCS8vIFVuaXZlcnNhbCBSZXNvdXJjZSBJZGVudGlmaWVyLCBpbmNsdWRpbmcgd2ViIHBhZ2VzIGFuZCANCisJCQkJLy8gb3RoZXIgSW50ZXJuZXQgYmFzZWQgcmVzb3VyY2VzDQorCQkJCS8vCWludCBuc2l6ZT0gRlBERkFjdGlvbl9HZXRVUklQYXRoKG1fcERvYyxoYWN0aW9uKTsNCisJCQkJLy8JLi4uDQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUERGQUNUSU9OX0xBVU5DSDoJCQkvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUNCisJCQkJLy8JRlBERkFjdGlvbl9HZXRGaWxlUGF0aCguLi4pDQorCQkJCWJyZWFrOw0KKwkJCWRlZmF1bHQgOg0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQllbHNlIGlmIChoTGlua0Rlc3QpDQorCQl7DQorCQkJaW50IG5QYWdlSW5kZXg9RlBERkRlc3RfR2V0UGFnZUluZGV4KG1fcERvYyxoTGlua0Rlc3QpOw0KKwkJCUdvdG9QYWdlKG5QYWdlSW5kZXgpOw0KKwkJfQ0KKwl9DQorCUNWaWV3OjpPbkxCdXR0b25VcChuRmxhZ3MsIHBvaW50KTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPbk1vdXNlTW92ZShVSU5UIG5GbGFncywgQ1BvaW50IHBvaW50KSANCit7DQorCS8vIFRPRE86IEFkZCB5b3VyIG1lc3NhZ2UgaGFuZGxlciBjb2RlIGhlcmUgYW5kL29yIGNhbGwgZGVmYXVsdA0KKwlkb3VibGUgcGFnZV94ID0gMDsNCisJZG91YmxlIHBhZ2VfeSA9IDA7DQorCURldmljZVRvUGFnZShwb2ludCwgcGFnZV94LCBwYWdlX3kpOw0KKw0KKwlpZihtX3BBcHApDQorCXsNCisJCWlmKEZPUk1fT25Nb3VzZU1vdmUobV9wQXBwLCBtX3BQYWdlLENvbXBvc2VGbGFnKCksIHBhZ2VfeCwgcGFnZV95KSkNCisJCQlyZXR1cm47DQorCX0NCisJaWYgKG5GbGFncyA9PSBNS19MQlVUVE9OKQ0KKwl7DQorCQlMb2FkTXlDdXJzb3IoMSk7DQorCX1lbHNle0xvYWRNeUN1cnNvcigpO30NCisJDQorCUNEQyAqcERDID0gR2V0REMoKTsNCisNCisJaWYgKG1fYlNlbGVjdCAmJiBuRmxhZ3MgPT0gTUtfTEJVVFRPTikNCisJew0KKwkJaWYgKG1fYkhhc0NoYXIpDQorCQl7DQorCQkJaWYgKG1fcHRPbGQueCA9PSAwICYmIG1fcHRPbGQueSA9PSAwKXttX3B0T2xkID0gbV9wdExCRG93bjt9DQorCQ0KKwkJCWludCBuSW5kZXggPSAwOw0KKwkJCWlmICghR2V0Q2hhckluZGV4QnlQb2ludChwb2ludCwgbkluZGV4KSkgcmV0dXJuOw0KKwkJCWlmKG5JbmRleCA9PSBtX25FbmRJbmRleCkgcmV0dXJuOw0KKwkJCQ0KKwkJCURyYXdBbGxSZWN0KHBEQyk7Ly91cGRhdGUgYWxsIHJlY3QNCisJCQkNCisJCQltX25FbmRJbmRleCA9IG5JbmRleDsNCisJCQlHZXRSZWN0cyhtX25TdGFydEluZGV4LCBtX25FbmRJbmRleCk7CS8vZ2V0IHRoZSByZWN0IGFuZCBzdG9yZSBpbnRvIG1fcnRBcnJheQ0KKwkJCURyYXdBbGxSZWN0KHBEQyk7Ly9kcmF3IG5ldyByZWN0CQ0KKwkJfQ0KKwkJZWxzZSANCisJCXsNCisJCQlDUGVuICpwT2xkUGVuOw0KKwkJCUNQZW4gcGVuOw0KKwkJCUNCcnVzaCAqcE9sZEJyOw0KKwkJCUNSZWN0IHJlY3Q7DQorCQkJcGVuLkNyZWF0ZVBlbihQU19EQVNILCAyLCBSR0IoMjU1LDAsMCkpOw0KKwkJCXBPbGRQZW4gPSBwREMtPlNlbGVjdE9iamVjdCgmcGVuKTsNCisJCQlwT2xkQnIgPSAoQ0JydXNoKikgKHBEQy0+U2VsZWN0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpOw0KKwkJCWludCBuT2xkUm9wID0gcERDLT5TZXRST1AyKFIyX1hPUlBFTik7DQorCQkJaW50IG5Nb2RsZSA9IHBEQy0+UmVjdGFuZ2xlKG1fcnRPbGQpOw0KKwkJDQorCQkJDQorCQkJRHJhd0FsbFJlY3QocERDKTsvL3VwZGF0ZSBhbGwgcmVjdA0KKwkJCXJlY3QgPSBTZWxlY3RTZWdtZW50KG1fcHRMQkRvd24sIHBvaW50KTsNCisJCQlEcmF3QWxsUmVjdChwREMpOw0KKw0KKwkJCXBEQy0+UmVjdGFuZ2xlKHJlY3QpOw0KKwkJCXBEQy0+U2VsZWN0T2JqZWN0KHBPbGRCcik7DQorCQkJcERDLT5TZWxlY3RPYmplY3QocE9sZFBlbik7DQorCQkJcERDLT5TZXRST1AyKG5Nb2RsZSk7DQorCQkJbV9ydE9sZCA9IHJlY3Q7CQ0KKwkJfQ0KKwl9DQorDQorCWlmIChtX2JIYW5kICYmIG5GbGFncyA9PSBNS19MQlVUVE9OKQ0KKwl7DQorCQlpbnQgY3VyUG9zLCBwcmV2UG9zOw0KKwkJLy9DQ2hpbGRGcmFtZSAqcEZyYW1lID0gKENDaGlsZEZyYW1lICopIEdldFBhcmVudEZyYW1lKCk7DQorCQkNCisJCWludCBkeSA9IG1fcHRMQkRvd24ueSAtIHBvaW50Lnk7DQorCQlwcmV2UG9zID0gbV9uUG9zVjsNCisJCWN1clBvcyA9IHByZXZQb3MgKyBkeTsNCisJCXByZXZQb3MgPSBTZXRTY3JvbGxQb3MoU0JfVkVSVCwgY3VyUG9zLCBUUlVFKTsNCisJCWN1clBvcyA9IEdldFNjcm9sbFBvcyhTQl9WRVJUKTsNCisJCWludCBkaXN0YW5jZTsNCisJCWRpc3RhbmNlID0gcHJldlBvcyAtIGN1clBvczsNCisJCW1fblN0YXJ0WSArPSBkaXN0YW5jZTsNCisJCVNjcm9sbFdpbmRvdygwLCBkaXN0YW5jZSk7DQorCQ0KKwkJZHkgPSBtX3B0TEJEb3duLnggLSBwb2ludC54Ow0KKwkJcHJldlBvcyA9IG1fblBvc0g7DQorCQljdXJQb3MgPSBwcmV2UG9zICsgZHk7DQorCQlwcmV2UG9zID0gU2V0U2Nyb2xsUG9zKFNCX0hPUlosIGN1clBvcywgVFJVRSk7DQorCQljdXJQb3MgPSBHZXRTY3JvbGxQb3MoU0JfSE9SWik7DQorCQlkaXN0YW5jZSA9IHByZXZQb3MgLSBjdXJQb3M7DQorCQltX25TdGFydFggKz0gZGlzdGFuY2U7DQorCQlTY3JvbGxXaW5kb3coZGlzdGFuY2UsIDApOw0KKw0KKwl9DQorCWlmIChtX2JTbmFwICYmIG5GbGFncyA9PSBNS19MQlVUVE9OKQ0KKwl7DQorCQlDUGVuICpwT2xkUGVuOw0KKwkJQ1BlbiBwZW47DQorCQlDQnJ1c2ggKnBPbGRCcjsNCisJCUNSZWN0IHJlY3QobV9wdExCRG93biwgcG9pbnQpOw0KKwkJcGVuLkNyZWF0ZVBlbihQU19EQVNILCAyLCBSR0IoMjU1LDAsMCkpOw0KKwkJcE9sZFBlbiA9IHBEQy0+U2VsZWN0T2JqZWN0KCZwZW4pOw0KKwkJcE9sZEJyID0gKENCcnVzaCopIChwREMtPlNlbGVjdFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsNCisJCWludCBuT2xkUm9wID0gcERDLT5TZXRST1AyKFIyX1hPUlBFTik7DQorCQlpbnQgbk1vZGxlID0gcERDLT5SZWN0YW5nbGUobV9ydE9sZCk7DQorCQkNCisJCXBEQy0+UmVjdGFuZ2xlKHJlY3QpOw0KKwkJcERDLT5TZWxlY3RPYmplY3QocE9sZEJyKTsNCisJCXBEQy0+U2VsZWN0T2JqZWN0KHBPbGRQZW4pOw0KKwkJcERDLT5TZXRST1AyKG5Nb2RsZSk7DQorCQltX3J0T2xkID0gcmVjdDsNCisJCQ0KKwl9DQorCQ0KKwlGUERGX0xJTksgaGxpbms9TlVMTDsNCisJZG91YmxlIHBkZngscGRmeTsNCisNCisJaW50IG5BY3R1YWxSYW5nZVggPSAwOw0KKwlpbnQgbkFjdHVhbFJhbmdlWSA9IDA7DQorCWlmICggbV9uUm90YXRlRmxhZyAlIDIgPT0gMCApDQorCXsNCisJCW5BY3R1YWxSYW5nZVggPSBtX25BY3R1YWxTaXplWDsNCisJCW5BY3R1YWxSYW5nZVkgPSBtX25BY3R1YWxTaXplWTsNCisJfWVsc2V7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVk7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVg7DQorCX0NCisNCisJRlBERl9EZXZpY2VUb1BhZ2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5BY3R1YWxSYW5nZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKwkJKGludCkobkFjdHVhbFJhbmdlWSAqIG1fZGJTY2FsZUZhY3RvciksbV9uUm90YXRlRmxhZyxwb2ludC54LHBvaW50LnksJnBkZngsJnBkZnkpOw0KKwlobGluaz1GUERGTGlua19HZXRMaW5rQXRQb2ludChtX3BQYWdlLHBkZngscGRmeSk7DQorCWlmIChobGluaykNCisJew0KKwkJSENVUlNPUiBoQ3VyID0gQWZ4R2V0QXBwKCktPkxvYWRDdXJzb3IoSURDX0NVUlNPUjQpOw0KKwkgICAgOjpTZXRDdXJzb3IoaEN1cik7DQorCX0NCisJUmVsZWFzZURDKHBEQyk7DQorLy8gCQkNCisgCUNWaWV3OjpPbk1vdXNlTW92ZShuRmxhZ3MsIHBvaW50KTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPbktleURvd24oVUlOVCBuQ2hhciwgVUlOVCBuUmVwQ250LCBVSU5UIG5GbGFncykgDQorew0KKwkvLyBUT0RPOiBBZGQgeW91ciBtZXNzYWdlIGhhbmRsZXIgY29kZSBoZXJlIGFuZC9vciBjYWxsIGRlZmF1bHQNCisvLyAJZG91YmxlIHBhZ2VfeCA9IDA7DQorLy8gCWRvdWJsZSBwYWdlX3kgPSAwOw0KKy8vIAlEZXZpY2VUb1BhZ2UocG9pbnQsIHBhZ2VfeCwgcGFnZV95KTsNCisNCisJaWYobV9wQXBwKQ0KKwl7DQorCQlpZihGT1JNX09uS2V5RG93bihtX3BBcHAsIG1fcFBhZ2UsIG5DaGFyLCBDb21wb3NlRmxhZygpKSkNCisJCQlyZXR1cm47DQorCX0NCisJc3dpdGNoKG5DaGFyKQ0KKwl7DQorCWNhc2UgMzU6DQorCQlPbkRvY0xhc3RwYWdlKCk7CQ0KKwkJYnJlYWs7DQorCWNhc2UgMzY6DQorCQlPbkRvY0ZpcnN0cGFnZSgpOw0KKwkJYnJlYWs7DQorCWNhc2UgMzc6DQorCQl0aGlzLT5PbkRvY1ByZXBhZ2UoKTsNCisJCWJyZWFrOw0KKwljYXNlIDM5Og0KKwkJdGhpcy0+T25Eb2NOZXh0cGFnZSgpOw0KKwkJYnJlYWs7DQorCWNhc2UgMzg6DQorCQkNCisJCWJyZWFrOw0KKwljYXNlIDQwOg0KKwkJDQorCQlicmVhazsNCisJZGVmYXVsdDoNCisJCWJyZWFrOw0KKwl9DQorCUNWaWV3OjpPbktleURvd24obkNoYXIsIG5SZXBDbnQsIG5GbGFncyk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25Ub29sU25hcHNob3QoKSANCit7DQorCW1fYlNuYXAgPSBUUlVFOw0KKwltX2JIYW5kID0gRkFMU0U7DQorCW1fYlNlbGVjdCA9IEZBTFNFOw0KKwl0aGlzLT5IaWRlQ2FyZXQoKTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblRvb2xTZWxlY3QoKSANCit7DQorCWlmKG1fcFRleHRQYWdlID09IE5VTEwpDQorCXsNCisJCUFmeE1lc3NhZ2VCb3goIlNvcnJ5LCB0aGUgZnBkZnRleHQuZGxsIG1heSBoYXMgZXhwaXJlZC4gRm9yIGtlZXBpbmcgb24gdXNpbmcgdGhlIGRsbCwgcGxlYXNlIGNvbnRhY3Qgc2FsZXNAZm94aXRzb2Z0d2FyZS5jb20uIik7DQorCQlyZXR1cm47DQorCX0NCisJbV9iU25hcCA9IEZBTFNFOw0KKwltX2JIYW5kID0gRkFMU0U7DQorCW1fYlNlbGVjdCA9IFRSVUU7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25Ub29sSGFuZCgpIA0KK3sNCisJbV9iU25hcCA9IEZBTFNFOw0KKwltX2JIYW5kID0gVFJVRTsNCisJbV9iU2VsZWN0ID0gRkFMU0U7DQorCXRoaXMtPkhpZGVDYXJldCgpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6OkxvYWRNeUN1cnNvcihpbnQgbmZsYWcpDQorew0KKwlIQ1VSU09SIGhDdXI7DQorCWlmIChuZmxhZyA9PSAxKQ0KKwl7DQorCQlpZiAobV9iU2VsZWN0KQ0KKwkJew0KKwkJCWhDdXIgPSBBZnhHZXRBcHAoKS0+TG9hZEN1cnNvcihJRENfQ1VSU09SMyk7DQorCQl9DQorCQllbHNlIGlmIChtX2JTbmFwKQ0KKwkJew0KKwkJCWhDdXIgPSBBZnhHZXRBcHAoKS0+TG9hZFN0YW5kYXJkQ3Vyc29yKElEQ19DUk9TUyk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJaEN1ciA9IEFmeEdldEFwcCgpLT5Mb2FkQ3Vyc29yKElEQ19DVVJTT1IxKTsNCisJCX0NCisJfQ0KKwllbHNlIGlmIChtX2JIYW5kKQ0KKwl7DQorCQloQ3VyID0gQWZ4R2V0QXBwKCktPkxvYWRDdXJzb3IoSURDX0NVUlNPUjIpOw0KKwl9DQorCWVsc2UgaWYgKG1fYlNlbGVjdCkNCisJew0KKwkJaEN1ciA9IEFmeEdldEFwcCgpLT5Mb2FkQ3Vyc29yKElEQ19DVVJTT1IzKTsNCisJfQ0KKwllbHNlIGlmIChtX2JTbmFwKQ0KKwl7DQorCQloQ3VyID0gQWZ4R2V0QXBwKCktPkxvYWRTdGFuZGFyZEN1cnNvcihJRENfQ1JPU1MpOw0KKwl9ZWxzZSANCisJew0KKwkJaEN1ciA9IEFmeEdldEFwcCgpLT5Mb2FkU3RhbmRhcmRDdXJzb3IoSURDX0FSUk9XKTsNCisJfQ0KKwk6OlNldEN1cnNvcihoQ3VyKTsNCit9DQorDQorQk9PTCBDUmVhZGVyVkNWaWV3OjpEZXZpY2VUb1BhZ2UoQ1BvaW50IHB0LCBkb3VibGUmIHBhZ2VfeCwgZG91YmxlJiBwYWdlX3kpDQorew0KKy8vCWlmKE5VTEwgPT0gbV9wVGV4dFBhZ2UpIHJldHVybiBGQUxTRTsNCisJaW50IG5BY3R1YWxSYW5nZVggPSAwOw0KKwlpbnQgbkFjdHVhbFJhbmdlWSA9IDA7DQorCWlmICggbV9uUm90YXRlRmxhZyAlIDIgPT0gMCApDQorCXsNCisJCW5BY3R1YWxSYW5nZVggPSBtX25BY3R1YWxTaXplWDsNCisJCW5BY3R1YWxSYW5nZVkgPSBtX25BY3R1YWxTaXplWTsNCisJfWVsc2V7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVk7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVg7DQorCX0NCisvLyAJc3dpdGNoICggbV9uUm90YXRlRmxhZyAlIDQgKQ0KKy8vIAl7DQorLy8gCWNhc2UgMDoNCisvLyAJY2FzZSAyOg0KKy8vIAkJew0KKy8vIAkJCUZQREZfRGV2aWNlVG9QYWdlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCBtX25BY3R1YWxTaXplWCAqIG1fZGJTY2FsZUZhY3RvciwNCisvLyAJCQltX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwgbV9uUm90YXRlRmxhZywgcHQueCwgcHQueSwgJnBhZ2VfeCwgJnBhZ2VfeSk7DQorLy8gCQkJYnJlYWs7DQorLy8gCQl9DQorLy8gCWNhc2UgMToNCisvLyAJY2FzZSAzOg0KKy8vIAkJew0KKy8vIAkJCUZQREZfRGV2aWNlVG9QYWdlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCBtX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwNCisvLyAJCQkJbV9uQWN0dWFsU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IsIG1fblJvdGF0ZUZsYWcsIHB0LngsIHB0LnksICZwYWdlX3gsICZwYWdlX3kpOw0KKy8vIAkJCWJyZWFrOw0KKy8vIAkJfQ0KKy8vIAl9DQorDQorIAlGUERGX0RldmljZVRvUGFnZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgKGludCkobkFjdHVhbFJhbmdlWCAqIG1fZGJTY2FsZUZhY3RvciksDQorIAkJKGludCkobkFjdHVhbFJhbmdlWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIHB0LngsIHB0LnksICZwYWdlX3gsICZwYWdlX3kpOw0KKwlyZXR1cm4gVFJVRTsNCit9DQorDQorQk9PTCBDUmVhZGVyVkNWaWV3OjpQYWdlVG9EZXZpY2UoZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSwgQ1BvaW50JiBwdCkNCit7DQorCWludCBuQWN0dWFsUmFuZ2VYID0gMDsNCisJaW50IG5BY3R1YWxSYW5nZVkgPSAwOw0KKwlpZiAoIG1fblJvdGF0ZUZsYWcgJSAyID09IDAgKQ0KKwl7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVg7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVk7DQorCX1lbHNlew0KKwkJbkFjdHVhbFJhbmdlWCA9IG1fbkFjdHVhbFNpemVZOw0KKwkJbkFjdHVhbFJhbmdlWSA9IG1fbkFjdHVhbFNpemVYOw0KKwl9DQorDQorCUZQREZfUGFnZVRvRGV2aWNlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCAoaW50KShuQWN0dWFsUmFuZ2VYICogbV9kYlNjYWxlRmFjdG9yKSwNCisJCShpbnQpKG5BY3R1YWxSYW5nZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCBwYWdlX3gsIHBhZ2VfeSwgKGludCopJnB0LngsIChpbnQqKSZwdC55KTsNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0JPT0wgQ1JlYWRlclZDVmlldzo6R2V0Q2hhckluZGV4QnlQb2ludChDUG9pbnQgcHQsIGludCAmbkluZGV4KQ0KK3sNCisJZG91YmxlIHBhZ2VfeCA9IDAuMGY7DQorCWRvdWJsZSBwYWdlX3kgPSAwLjBmOw0KKw0KKwlpZihOVUxMID09IG1fcFRleHRQYWdlKSByZXR1cm4gRkFMU0U7DQorCWludCBuQWN0dWFsUmFuZ2VYID0gMDsNCisJaW50IG5BY3R1YWxSYW5nZVkgPSAwOw0KKwlpZiAoIG1fblJvdGF0ZUZsYWcgJSAyID09IDAgKQ0KKwl7DQorCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVg7DQorCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVk7DQorCX1lbHNlew0KKwkJbkFjdHVhbFJhbmdlWCA9IG1fbkFjdHVhbFNpemVZOw0KKwkJbkFjdHVhbFJhbmdlWSA9IG1fbkFjdHVhbFNpemVYOw0KKwl9DQorCUZQREZfRGV2aWNlVG9QYWdlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCAoaW50KShuQWN0dWFsUmFuZ2VYICogbV9kYlNjYWxlRmFjdG9yKSwNCisgCQkoaW50KShuQWN0dWFsUmFuZ2VZICogbV9kYlNjYWxlRmFjdG9yKSwgbV9uUm90YXRlRmxhZywgcHQueCwgcHQueSwgJnBhZ2VfeCwgJnBhZ2VfeSk7DQorLy8gCUZQREZfRGV2aWNlVG9QYWdlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCBtX25BY3R1YWxTaXplWCAqIG1fZGJTY2FsZUZhY3RvciwNCisvLyAJCW1fbkFjdHVhbFNpemVZICogbV9kYlNjYWxlRmFjdG9yLCBtX25Sb3RhdGVGbGFnLCBwdC54LCBwdC55LCAmcGFnZV94LCAmcGFnZV95KTsNCisJDQorCW5JbmRleCA9IEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKG1fcFRleHRQYWdlLCBwYWdlX3gsIHBhZ2VfeSwgMTAsIDEwKTsNCisJaWYgKC0zID09IG5JbmRleCB8fCAtMSA9PSBuSW5kZXgpIHJldHVybiBGQUxTRTsNCisJcmV0dXJuIFRSVUU7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6Q3JlYXRlQ2FyZXQoQ1BvaW50IHB0KQ0KK3sNCisJZG91YmxlIGEsIGIsIGMsIGQ7DQorCWludCBuSW5kZXggPSAwOw0KKwlpbnQgbkFjZW50ID0gMCwgbkRlY2VudCA9IDA7DQorCWRvdWJsZSBvcmd4ID0gMC4wZiwgb3JneSA9IDAuMGY7DQorCWRvdWJsZSBmb250c2l6ZSA9IDAuMGY7DQorCWludCBsZWZ0ID0gMCwgcmlnaHQgPSAwOw0KKwlpbnQgdG9wID0gMCwgYm90dG9tID0gMDsNCisJLy9kb3VibGUgbGVmdF9jaGFyLCByaWdodF9jaGFyLCB0b3BfY2hhciwgYm90dG9tX2NoYXI7Ly9jaGFyIGJvdW5kaW5nIGJveAkNCisJRlBERl9GT05UIHBmb250ID0gTlVMTDsNCisNCisJaWYoIUdldENoYXJJbmRleEJ5UG9pbnQocHQsIG5JbmRleCkpIHJldHVybjsNCisJZm9udHNpemUgPSBGUERGVGV4dF9HZXRGb250U2l6ZShtX3BUZXh0UGFnZSwgbkluZGV4KTsNCisvLyAJRlBERlRleHRfR2V0T3JpZ2luKG1fcFRleHRQYWdlLCBuSW5kZXgsICZvcmd4LCAmb3JneSk7DQorLy8gCXBmb250ID0gRlBERlRleHRfR2V0Rm9udChtX3BUZXh0UGFnZSwgbkluZGV4KTsNCisvLyAJaWYoTlVMTCA9PSBwZm9udCkgcmV0dXJuOw0KKy8vIAluQWNlbnQgPSBGUERGRm9udF9HZXRBc2NlbnQocGZvbnQpOw0KKy8vIAluRGVjZW50ID0gRlBERkZvbnRfR2V0RGVzY2VudChwZm9udCk7DQorLy8gCUZQREZUZXh0X0dldE1hdHJpeChtX3BUZXh0UGFnZSwgbkluZGV4LCAmYSwgJmIsICZjLCAmZCk7DQorLy8gCW5BY2VudCA9KGludCkoKG5BY2VudCAqIGZvbnRzaXplIC8gMTAwMC4wZikgKiBkICsgb3JneSArIDAuNWYpOw0KKy8vIAluRGVjZW50ID0gKGludCkoKG5EZWNlbnQgKiBmb250c2l6ZSAvIDEwMDAuMGYpICogZCArIG9yZ3kgKyAwLjVmKTsNCisvLyANCisvLyAJaW50IG5BY3R1YWxSYW5nZVggPSAwOw0KKy8vIAlpbnQgbkFjdHVhbFJhbmdlWSA9IDA7DQorLy8gCWlmICggbV9uUm90YXRlRmxhZyAlIDIgPT0gMCApDQorLy8gCXsNCisvLyAJCW5BY3R1YWxSYW5nZVggPSBtX25BY3R1YWxTaXplWDsNCisvLyAJCW5BY3R1YWxSYW5nZVkgPSBtX25BY3R1YWxTaXplWTsNCisvLyAJfWVsc2V7DQorLy8gCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVk7DQorLy8gCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVg7DQorLy8gCX0NCisvLyAJRlBERl9QYWdlVG9EZXZpY2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5BY3R1YWxSYW5nZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKy8vICAJCShpbnQpKG5BY3R1YWxSYW5nZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCBvcmd4LCBuQWNlbnQsICZsZWZ0LCAmdG9wKTsNCisvLyANCisvLyAJRlBERl9QYWdlVG9EZXZpY2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5BY3R1YWxSYW5nZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKy8vICAJCShpbnQpKG5BY3R1YWxSYW5nZVkgKiBtX2RiU2NhbGVGYWN0b3IpLCBtX25Sb3RhdGVGbGFnLCBvcmd4LCBuRGVjZW50LCAmcmlnaHQsICZib3R0b20pOw0KKy8vIA0KKy8vIC8vIAlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgbV9uQWN0dWFsU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IsDQorLy8gLy8gCQltX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwgbV9uUm90YXRlRmxhZywgb3JneCwgbkFjZW50LCAmbGVmdCwgJnRvcCk7DQorLy8gLy8gDQorLy8gLy8gCUZQREZfUGFnZVRvRGV2aWNlKG1fcFBhZ2UsIG1fblN0YXJ0WCwgbV9uU3RhcnRZLCBtX25BY3R1YWxTaXplWCAqIG1fZGJTY2FsZUZhY3RvciwNCisvLyAvLyAJCW1fbkFjdHVhbFNpemVZICogbV9kYlNjYWxlRmFjdG9yLCBtX25Sb3RhdGVGbGFnLCBvcmd4LCBuRGVjZW50LCAmcmlnaHQsICZib3R0b20pOw0KKy8vIA0KKy8vIAl0aGlzLT5DcmVhdGVTb2xpZENhcmV0KDIsIGFicyh0b3AgLSBib3R0b20pKTsNCisvLyAJDQorLy8gLyoJRlBERlRleHRfR2V0Q2hhckJveChtX3BUZXh0UGFnZSwgbkluZGV4LCAmbGVmdF9jaGFyLCAmcmlnaHRfY2hhciwgJmJvdHRvbV9jaGFyLCAmdG9wX2NoYXIpOw0KKy8vIA0KKy8vIAlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgbV9uQWN0dWFsU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IsDQorLy8gCQltX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwgbV9uUm90YXRlRmxhZywgbGVmdF9jaGFyLCB0b3BfY2hhciwgJmxlZnQsICZ0b3ApOw0KKy8vIAlGUERGX1BhZ2VUb0RldmljZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgbV9uQWN0dWFsU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IsDQorLy8gCQltX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwgbV9uUm90YXRlRmxhZywgcmlnaHRfY2hhciwgYm90dG9tX2NoYXIsICZyaWdodCwgJmJvdHRvbSk7Ki8NCisvLyAJdGhpcy0+U2V0Q2FyZXRQb3MoQ1BvaW50KGxlZnQsIHRvcC0yKSk7DQorLy8gCXRoaXMtPlNob3dDYXJldCgpOw0KKwkNCisNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpHZXRSZWN0cyhpbnQgblN0YXJ0LCBpbnQgbkVuZCkNCit7DQorCWludCB0ZW1wLCBuQ291bnQ7DQorCW5Db3VudCA9IG5FbmQgLSBuU3RhcnQ7DQorCWlmIChuQ291bnQgPCAwKQ0KKwl7DQorCQl0ZW1wID0gbkVuZDsNCisJCW5FbmQgPSBuU3RhcnQ7DQorCQluU3RhcnQgPSB0ZW1wOw0KKw0KKwkJbkNvdW50ID0gYWJzKG5Db3VudCk7DQorCX0NCisJIG5Db3VudCArKzsNCisNCisJIGludCBudW0gPSBGUERGVGV4dF9Db3VudFJlY3RzKG1fcFRleHRQYWdlLCBuU3RhcnQsIG5Db3VudCk7DQorCSBpZihudW0gPT0gMCkgcmV0dXJuOw0KKwkgDQorCSBpZiAobV9ydEFycmF5LkdldFNpemUoKSA+IDApDQorCSB7DQorCQkgbV9ydEFycmF5LlJlbW92ZUFsbCgpOw0KKwkgfQ0KKwkgUERGUmVjdCByZWN0Ow0KKwkgZm9yIChpbnQgaT0wOyBpPG51bTsgaSsrKQ0KKwkgew0KKwkJIEZQREZUZXh0X0dldFJlY3QobV9wVGV4dFBhZ2UsIGksICZyZWN0Lm1fZGJMZWZ0LCAmcmVjdC5tX2RiVG9wLCAmcmVjdC5tX2RiUmlnaHQsICZyZWN0Lm1fZGJCb3R0b20pOw0KKwkJIG1fcnRBcnJheS5BZGQocmVjdCk7DQorCSB9DQorCXJldHVybjsNCit9DQorDQorQ1JlY3QgQ1JlYWRlclZDVmlldzo6U2VsZWN0U2VnbWVudChDUG9pbnQgcHRfbHQsIENQb2ludCBwdF9yYikNCit7DQorCUNSZWN0IHJlY3QocHRfbHQsIHB0X3JiKTsNCisvLyAJZG91YmxlIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsNCisvLyAJaW50IHN0YXJ0X2luZGV4ID0gMCwgbkNvdW50ID0gMDsNCisvLyAJaW50IG5SZWN0ID0gMDsNCisvLyANCisvLyAJaW50IG5BY3R1YWxSYW5nZVggPSAwOw0KKy8vIAlpbnQgbkFjdHVhbFJhbmdlWSA9IDA7DQorLy8gCWlmICggbV9uUm90YXRlRmxhZyAlIDIgPT0gMCApDQorLy8gCXsNCisvLyAJCW5BY3R1YWxSYW5nZVggPSBtX25BY3R1YWxTaXplWDsNCisvLyAJCW5BY3R1YWxSYW5nZVkgPSBtX25BY3R1YWxTaXplWTsNCisvLyAJfWVsc2V7DQorLy8gCQluQWN0dWFsUmFuZ2VYID0gbV9uQWN0dWFsU2l6ZVk7DQorLy8gCQluQWN0dWFsUmFuZ2VZID0gbV9uQWN0dWFsU2l6ZVg7DQorLy8gCX0NCisvLyAJRlBERl9EZXZpY2VUb1BhZ2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5BY3R1YWxSYW5nZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKy8vIAkJKGludCkobkFjdHVhbFJhbmdlWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIHJlY3QubGVmdCwgcmVjdC50b3AsICZsZWZ0LCAmdG9wKTsNCisvLyAJRlBERl9EZXZpY2VUb1BhZ2UobV9wUGFnZSwgbV9uU3RhcnRYLCBtX25TdGFydFksIChpbnQpKG5BY3R1YWxSYW5nZVggKiBtX2RiU2NhbGVGYWN0b3IpLA0KKy8vIAkJKGludCkobkFjdHVhbFJhbmdlWSAqIG1fZGJTY2FsZUZhY3RvciksIG1fblJvdGF0ZUZsYWcsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCAmcmlnaHQsICZib3R0b20pOw0KKy8vIA0KKy8vIC8vIAlGUERGX0RldmljZVRvUGFnZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgbV9uQWN0dWFsU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IsDQorLy8gLy8gCQltX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwgbV9uUm90YXRlRmxhZywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgJmxlZnQsICZ0b3ApOw0KKy8vIC8vIAlGUERGX0RldmljZVRvUGFnZShtX3BQYWdlLCBtX25TdGFydFgsIG1fblN0YXJ0WSwgbV9uQWN0dWFsU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IsDQorLy8gLy8gCQltX25BY3R1YWxTaXplWSAqIG1fZGJTY2FsZUZhY3RvciwgbV9uUm90YXRlRmxhZywgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sICZyaWdodCwgJmJvdHRvbSk7DQorLy8gDQorLy8gCWludCBudW0gPSBGUERGVGV4dF9Db3VudEJvdW5kZWRTZWdtZW50cyhtX3BUZXh0UGFnZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsNCisvLyANCisvLyAJaWYgKG1fcnRBcnJheS5HZXRTaXplKCkgPiAwKQ0KKy8vIAl7DQorLy8gCQltX3J0QXJyYXkuUmVtb3ZlQWxsKCk7DQorLy8gCX0NCisvLyANCisvLyAJQ0RDICpwREMgPSBHZXREQygpOw0KKy8vIAlmb3IgKGludCBpPTA7IGk8bnVtOyBpKyspDQorLy8gCXsNCisvLyAJCUZQREZUZXh0X0dldEJvdW5kZWRTZWdtZW50KG1fcFRleHRQYWdlLCBpLCAmc3RhcnRfaW5kZXgsICZuQ291bnQpOw0KKy8vIAkJblJlY3QgPSBGUERGVGV4dF9Db3VudFJlY3RzKG1fcFRleHRQYWdlLCBzdGFydF9pbmRleCwgbkNvdW50KTsNCisvLyANCisvLyAJCVBERlJlY3QgcmVjdF9zZWxlY3Q7DQorLy8gCQlmb3IgKGludCBqPTA7IGo8bnVtOyBqKyspDQorLy8gCQl7DQorLy8gCQkJRlBERlRleHRfR2V0UmVjdChtX3BUZXh0UGFnZSwgaiwgJnJlY3Rfc2VsZWN0Lm1fZGJMZWZ0LCAmcmVjdF9zZWxlY3QubV9kYlRvcCwgJnJlY3Rfc2VsZWN0Lm1fZGJSaWdodCwgJnJlY3Rfc2VsZWN0Lm1fZGJCb3R0b20pOw0KKy8vIAkJCW1fcnRBcnJheS5BZGQocmVjdF9zZWxlY3QpOw0KKy8vIAkJfQ0KKy8vIAl9DQorLy8gCVJlbGVhc2VEQyhwREMpOw0KKwlyZXR1cm4gcmVjdDsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblRvb2xQZGYydHh0KCkgDQorew0KKwkvLyBUT0RPOiBBZGQgeW91ciBjb21tYW5kIGhhbmRsZXIgY29kZSBoZXJlDQorCWlmKG1fcFRleHRQYWdlID09IE5VTEwpDQorCXsNCisJCUFmeE1lc3NhZ2VCb3goIlNvcnJ5LCB0aGUgZnBkZnRleHQuZGxsIG1heSBoYXMgZXhwaXJlZC4gRm9yIGtlZXBpbmcgb24gdXNpbmcgdGhlIGRsbCwgcGxlYXNlIGNvbnRhY3Qgc2FsZXNAZm94aXRzb2Z0d2FyZS5jb20uIik7DQorCQlyZXR1cm47DQorCX0NCisJQ0NvbnZlcnREbGcgY29uZGxnOw0KKwlpZihjb25kbGcuRG9Nb2RhbCgpID09IElET0spDQorCXsNCisJCWludCBuRmxhZz1jb25kbGcubV9uRmxhZzsNCisJCUNSZWFkZXJWQ0RvYyAqcERvYyA9IHRoaXMtPkdldERvY3VtZW50KCk7DQorCQlDU3RyaW5nIHBkZm5hbWU9cERvYy0+bV9zdHJQREZOYW1lOw0KKwkJQ1N0cmluZyBzdHJuYW1lPXBkZm5hbWUsc3RlbTsNCisJCWlmIChzdHJuYW1lLkZpbmQoIi5wZGYiKSAhPSAtMSB8fCBzdHJuYW1lLkZpbmQoIi5QREYiKSAhPSAtMSkNCisJCXsNCisJCQlpbnQgc3RhcnRhdHI9c3RybmFtZS5SZXZlcnNlRmluZCgnXFwnKTsNCisJCQlzdGVtPXN0cm5hbWUuTWlkKHN0YXJ0YXRyKzEsc3RybmFtZS5HZXRMZW5ndGgoKS1zdGFydGF0ci01KTsNCisJCX0NCisJCUNTdHJpbmcgZGVmYXVsdG5hbWU9c3RlbSsiLnR4dCI7DQorDQorCQljaGFyIHN6RmlsdGVyW10gPSAiVGV4dCBGaWxlKCoudHh0KXwqLnR4dCI7DQorCQlDRmlsZURpYWxvZyBkbGcoRkFMU0UsICIudHh0IiwgZGVmYXVsdG5hbWUsIE9GTl9ISURFUkVBRE9OTFkgfCBPRk5fT1ZFUldSSVRFUFJPTVBULCBzekZpbHRlciwgTlVMTCk7DQorDQorCQlpZiAoZGxnLkRvTW9kYWwoKSA9PSBJRE9LKQ0KKwkJew0KKy8vIAkJCUNTdHJpbmcgdHh0bmFtZT1kbGcuR2V0UGF0aE5hbWUoKTsNCisvLyAJCQlCT09MIGJGbGFnPUZQREZUZXh0X1BERlRvVGV4dChwZGZuYW1lLHR4dG5hbWUsbkZsYWcsTlVMTCk7DQorLy8gCQkJaWYoISBiRmxhZykgDQorLy8gCQkJCU1lc3NhZ2VCb3goIkNvbnZlcnQgRmFpbHVyZSEiKTsNCisJCX0NCisJfQkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpTeW5jU2Nyb2xsKCkNCit7DQorCUNSZWN0IHJlY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCUdldENsaWVudFJlY3QocmVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQ0KKwlpbnQgblNpemVYID0gMDsgDQorCWludCBuU2l6ZVkgPSAwOw0KKwkvL2ludCB0ZW1wID0gMDsNCisNCisJaWYgKDEgPT0gbV9uUm90YXRlRmxhZyB8fCAzID09IG1fblJvdGF0ZUZsYWcpDQorCXsNCisJCW5TaXplWCA9IG1fbkFjdHVhbFNpemVZOw0KKwkJblNpemVZID0gbV9uQWN0dWFsU2l6ZVg7DQorCX0NCisJZWxzZQ0KKwl7DQorCQluU2l6ZVggPSBtX25BY3R1YWxTaXplWDsNCisJCW5TaXplWSA9IG1fbkFjdHVhbFNpemVZOw0KKwl9DQorCQ0KKwlTQ1JPTExJTkZPIHNjcmluZm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlzY3JpbmZvLmNiU2l6ZSA9IHNpemVvZihTQ1JPTExJTkZPKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlHZXRTY3JvbGxJbmZvKFNCX0hPUlosICZzY3JpbmZvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlzY3JpbmZvLm5NaW4gPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlzY3JpbmZvLm5NYXggPSAoaW50KShuU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJc2NyaW5mby5uUGFnZSA9ICh1bnNpZ25lZCBpbnQpKF9fbWluKG5TaXplWCAqIG1fZGJTY2FsZUZhY3RvciwgcmVjdC5XaWR0aCgpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWlmIChuU2l6ZVggKiBtX2RiU2NhbGVGYWN0b3IgPCByZWN0LldpZHRoKCkpe3NjcmluZm8uZk1hc2sgfD0gU0lGX0RJU0FCTEVOT1NDUk9MTDt9ICAgICAgICAgDQorCVNldFNjcm9sbEluZm8oU0JfSE9SWiwgJnNjcmluZm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVNldFNjcm9sbFBvcyhTQl9IT1JaLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCS8vbV9uUG9zSCA9IG5Qb3NIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJDQorCUdldFNjcm9sbEluZm8oU0JfVkVSVCwgJnNjcmluZm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXNjcmluZm8ubk1pbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXNjcmluZm8ubk1heCA9IChpbnQpKG5TaXplWSAqIG1fZGJTY2FsZUZhY3Rvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXNjcmluZm8ublBhZ2UgPSh1bnNpZ25lZCBpbnQpKCBfX21pbihuU2l6ZVkgKiBtX2RiU2NhbGVGYWN0b3IsIHJlY3QuSGVpZ2h0KCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpZiAoblNpemVZICogbV9kYlNjYWxlRmFjdG9yIDwgcmVjdC5IZWlnaHQoKSl7c2NyaW5mby5mTWFzayB8PSBTSUZfRElTQUJMRU5PU0NST0xMO30gICAgICAgIA0KKwlTZXRTY3JvbGxJbmZvKFNCX1ZFUlQsICZzY3JpbmZvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlTZXRTY3JvbGxQb3MoU0JfVkVSVCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25TaXplKFVJTlQgblR5cGUsIGludCBjeCwgaW50IGN5KSANCit7DQorCUNWaWV3OjpPblNpemUoblR5cGUsIGN4LCBjeSk7DQorCVN5bmNTY3JvbGwoKTsNCisJaWYobV9ibXApDQorCXsNCisJCUZQREZCaXRtYXBfRGVzdHJveShtX2JtcCk7DQorCQltX2JtcCA9IE5VTEw7DQorCX0NCisNCisJbV9ibXAgPSBGUERGQml0bWFwX0NyZWF0ZShjeCwgY3ksIDApOw0KKw0KKwkvLyBUT0RPOiBBZGQgeW91ciBtZXNzYWdlIGhhbmRsZXIgY29kZSBoZXJlCQ0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uSFNjcm9sbChVSU5UIG5TQkNvZGUsIFVJTlQgblBvcywgQ1Njcm9sbEJhciogcFNjcm9sbEJhcikgDQorew0KKwkvLyBUT0RPOiBBZGQgeW91ciBtZXNzYWdlIGhhbmRsZXIgY29kZSBoZXJlIGFuZC9vciBjYWxsIGRlZmF1bHQNCisJaW50IHByZXZQb3MgPSBHZXRTY3JvbGxQb3MoU0JfSE9SWik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpbnQgY3VyUG9zID0gcHJldlBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWludCBuTWluLCBuTWF4LCBuUGFnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJR2V0U2Nyb2xsUmFuZ2UoU0JfSE9SWiwgJm5NaW4sICZuTWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlTQ1JPTExJTkZPIHNpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCUdldFNjcm9sbEluZm8oU0JfSE9SWiwgJnNpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJblBhZ2UgPSBzaS5uUGFnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkNCisJc3dpdGNoKG5TQkNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNhc2UgU0JfVE9QOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWN1clBvcyA9IG5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX0JPVFRPTTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQljdXJQb3MgPSBuTWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY2FzZSBTQl9MSU5FVVA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJY3VyUG9zIC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX0xJTkVET1dOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQljdXJQb3MgKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNhc2UgU0JfRU5EU0NST0xMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCXJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNhc2UgU0JfUEFHRURPV046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWN1clBvcyArPSBuUGFnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX1BBR0VVUDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQljdXJQb3MgLT0gblBhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNhc2UgU0JfVEhVTUJQT1NJVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWN1clBvcyA9IHNpLm5UcmFja1BvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY2FzZSBTQl9USFVNQlRSQUNLOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJY3VyUG9zID0gc2kublRyYWNrUG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQ0KKwlpZiAoY3VyUG9zIDwgbk1pbikgeyBjdXJQb3MgPSBuTWluO30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWlmKGN1clBvcyA+IG5NYXgpeyBjdXJQb3MgPSBuTWF4O30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJU2V0U2Nyb2xsUG9zKFNCX0hPUlosIGN1clBvcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlpbnQgZGlzdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWRpc3RhbmNlID0gcHJldlBvcyAtIGN1clBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJbV9uU3RhcnRYICs9IGRpc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVNjcm9sbFdpbmRvdyhkaXN0YW5jZSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlDUmVjdCByZWN0Ow0KKwlHZXRDbGllbnRSZWN0KHJlY3QpOw0KKwlDUmVjdCBydG5ldyhyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LmxlZnQrZGlzdGFuY2UsIHJlY3QuYm90dG9tKTsNCisJSW52YWxpZGF0ZVJlY3QoJnJ0bmV3KTsNCisJDQorCUNWaWV3OjpPbkhTY3JvbGwoblNCQ29kZSwgblBvcywgcFNjcm9sbEJhcik7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25WU2Nyb2xsKFVJTlQgblNCQ29kZSwgVUlOVCBuUG9zLCBDU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyKSANCit7DQorCS8vIFRPRE86IEFkZCB5b3VyIG1lc3NhZ2UgaGFuZGxlciBjb2RlIGhlcmUgYW5kL29yIGNhbGwgZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWludCBwcmV2UG9zID0gR2V0U2Nyb2xsUG9zKFNCX1ZFUlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaW50IGN1clBvcyA9IHByZXZQb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpbnQgbk1pbiwgbk1heCwgblBhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCUdldFNjcm9sbFJhbmdlKFNCX1ZFUlQsICZuTWluLCAmbk1heCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJU0NST0xMSU5GTyBzaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlHZXRTY3JvbGxJbmZvKFNCX1ZFUlQsICZzaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCW5QYWdlID0gc2kublBhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXN3aXRjaChuU0JDb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX1RPUDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQljdXJQb3MgPSBuTWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY2FzZSBTQl9CT1RUT006ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJY3VyUG9zID0gbk1heDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNhc2UgU0JfTElORVVQOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWN1clBvcyAtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY2FzZSBTQl9MSU5FRE9XTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJY3VyUG9zICsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX0VORFNDUk9MTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlyZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX1BBR0VET1dOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQljdXJQb3MgKz0gblBhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY2FzZSBTQl9QQUdFVVA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJY3VyUG9zIC09IG5QYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljYXNlIFNCX1RIVU1CUE9TSVRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQljdXJQb3MgPSBzaS5uVHJhY2tQb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNhc2UgU0JfVEhVTUJUUkFDSzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWN1clBvcyA9IHNpLm5UcmFja1BvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaWYgKGN1clBvcyA8IG5NaW4pIHsgY3VyUG9zID0gbk1pbjt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpZihjdXJQb3MgPiBuTWF4KXsgY3VyUG9zID0gbk1heDt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVNldFNjcm9sbFBvcyhTQl9WRVJULCBjdXJQb3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaW50IGRpc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWRpc3RhbmNlID0gcHJldlBvcyAtIGN1clBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJbV9uU3RhcnRZICs9IGRpc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVNjcm9sbFdpbmRvdygwLCBkaXN0YW5jZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlDUmVjdCByZWN0Ow0KKwlHZXRDbGllbnRSZWN0KHJlY3QpOw0KKwlDUmVjdCBydG5ldyhyZWN0LmxlZnQsIHJlY3QuYm90dG9tICsgZGlzdGFuY2UsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsNCisJQ1JlY3QgcnRuZXcyKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QudG9wICsgZGlzdGFuY2UpOw0KKwlJbnZhbGlkYXRlUmVjdCgmcnRuZXcpOw0KKwlJbnZhbGlkYXRlUmVjdCgmcnRuZXcyKTsNCisNCisJQ1ZpZXc6Ok9uVlNjcm9sbChuU0JDb2RlLCBuUG9zLCBwU2Nyb2xsQmFyKTsNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblRvb2xFeHRyYWN0bGlua3MoKSANCit7DQorCWlmKG1fcFRleHRQYWdlID09IE5VTEwpDQorCXsNCisJCUFmeE1lc3NhZ2VCb3goIlNvcnJ5LCB0aGUgZnBkZnRleHQuZGxsIG1heSBoYXMgZXhwaXJlZC4gRm9yIGtlZXBpbmcgb24gdXNpbmcgdGhlIGRsbCwgcGxlYXNlIGNvbnRhY3Qgc2FsZXNAZm94aXRzb2Z0d2FyZS5jb20uIik7DQorCQlyZXR1cm47DQorCX0NCisJQ1N0cmluZyBzdHJMaW5rID0gX1QoIiIpOw0KKwl3Y2hhcl90ICpwQnVmID0gTlVMTDsNCisJaWYobV9wTGluayAhPSBOVUxMKQ0KKwl7DQorCQlGUERGTGlua19DbG9zZVdlYkxpbmtzKG1fcExpbmspOw0KKwkJbV9wTGluayA9IE5VTEw7DQorCX0NCisJbV9wTGluayA9IEZQREZMaW5rX0xvYWRXZWJMaW5rcyhtX3BUZXh0UGFnZSk7DQorCWlmKG1fcExpbmsgPT0gTlVMTCkgcmV0dXJuOw0KKw0KKwlpbnQgbkNvdW50ID0gRlBERkxpbmtfQ291bnRXZWJMaW5rcyhtX3BMaW5rKTsNCisJaWYgKG5Db3VudCA9PSAwKSByZXR1cm47DQorCWlmIChtX3J0QXJyYXkuR2V0U2l6ZSgpIT0wKQ0KKwl7DQorCQltX3J0QXJyYXkuUmVtb3ZlQWxsKCk7DQorCX0NCisJZm9yIChpbnQgaT0wOyBpPG5Db3VudDsgaSsrKQ0KKwl7DQorCQlpbnQgbmxlbiA9IEZQREZMaW5rX0dldFVSTChtX3BMaW5rLCBpLCBOVUxMLCAwKSsxOw0KKwkJcEJ1ZiA9IG5ldyB3Y2hhcl90W25sZW5dOw0KKwkJbWVtc2V0KHBCdWYsIDAsIG5sZW4qc2l6ZW9mKHdjaGFyX3QpKTsNCisJCUZQREZMaW5rX0dldFVSTChtX3BMaW5rLCBpLCAodW5zaWduZWQgc2hvcnQqKXBCdWYsIG5sZW4pOw0KKwkJcEJ1ZltubGVuLTFdID0gTCdcMCc7DQorCQlpbnQgbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBwQnVmLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorCQljaGFyICpwID0gbmV3IGNoYXJbbl07DQorCQltZW1zZXQocCwgMCwgbik7DQorCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgcEJ1ZiwgbmxlbiwgcCwgbiwgTlVMTCwgTlVMTCk7DQorCQlwW24tMV0gPSAnXDAnOw0KKwkJc3RyTGluayArPSBwOw0KKwkJc3RyTGluayArPSAiXHJcbiI7DQorCQlkZWxldGUgW11wQnVmOw0KKwkJZGVsZXRlIFtdcDsNCisJCWludCBuUmVjdHMgPSBGUERGTGlua19Db3VudFJlY3RzKG1fcExpbmssIGkpOw0KKwkJZm9yIChpbnQgaj0wOyBqPG5SZWN0czsgaisrKQ0KKwkJew0KKwkJCVBERlJlY3QgcmVjdDsNCisJCQlGUERGTGlua19HZXRSZWN0KG1fcExpbmssIGksIGosIA0KKwkJCQkmcmVjdC5tX2RiTGVmdCwgJnJlY3QubV9kYlRvcCwgJnJlY3QubV9kYlJpZ2h0LCAmcmVjdC5tX2RiQm90dG9tKTsNCisJCQltX3J0QXJyYXkuQWRkKHJlY3QpOw0KKwkJfQ0KKwl9DQorCUNEQyAqcERDID0gR2V0REMoKTsNCisJRHJhd0FsbFJlY3QocERDKTsNCisJUmVsZWFzZURDKHBEQyk7DQorDQorCU1lc3NhZ2VCb3goc3RyTGluaywgIldlYiBMaW5rcyBpbiB0aGlzIHBhZ2UiKTsNCisJDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25Jbml0aWFsVXBkYXRlKCkgDQorew0KKwlDVmlldzo6T25Jbml0aWFsVXBkYXRlKCk7DQorDQorCS8vIFRPRE86IEFkZCB5b3VyIHNwZWNpYWxpemVkIGNvZGUgaGVyZSBhbmQvb3IgY2FsbCB0aGUgYmFzZSBjbGFzcw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uRGVzdHJveSgpIA0KK3sNCisJQ1ZpZXc6Ok9uRGVzdHJveSgpOw0KKwkvLyBUT0RPOiBBZGQgeW91ciBtZXNzYWdlIGhhbmRsZXIgY29kZSBoZXJlDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25VcGRhdGVEb2NGaXJzdHBhZ2UoQ0NtZFVJKiBwQ21kVUkpIA0KK3sNCisJaWYgKDAgPT0gbV9uUGFnZUluZGV4KQ0KKwl7DQorCQlwQ21kVUktPkVuYWJsZShGQUxTRSk7DQorCX0gDQorCWVsc2UNCisJew0KKwkJcENtZFVJLT5FbmFibGUoVFJVRSk7DQorCX0NCisJDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25VcGRhdGVEb2NMYXN0cGFnZShDQ21kVUkqIHBDbWRVSSkgDQorew0KKwlpZiAobV9uUGFnZUluZGV4ID09IG1fblRvdGFsUGFnZSAtIDEpDQorCXsNCisJCXBDbWRVSS0+RW5hYmxlKEZBTFNFKTsNCisJfSANCisJZWxzZQ0KKwl7DQorCQlwQ21kVUktPkVuYWJsZShUUlVFKTsNCisJfQ0KKwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblVwZGF0ZURvY05leHRwYWdlKENDbWRVSSogcENtZFVJKSANCit7DQorCWlmIChtX25QYWdlSW5kZXggPT0gbV9uVG90YWxQYWdlIC0gMSkNCisJew0KKwkJcENtZFVJLT5FbmFibGUoRkFMU0UpOw0KKwl9IA0KKwllbHNlDQorCXsNCisJCXBDbWRVSS0+RW5hYmxlKFRSVUUpOw0KKwl9DQorCQ0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uVXBkYXRlRG9jUHJlcGFnZShDQ21kVUkqIHBDbWRVSSkgDQorew0KKwlpZiAoMCA9PSBtX25QYWdlSW5kZXgpDQorCXsNCisJCXBDbWRVSS0+RW5hYmxlKEZBTFNFKTsNCisJfSANCisJZWxzZQ0KKwl7DQorCQlwQ21kVUktPkVuYWJsZShUUlVFKTsNCisJfQ0KKwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblVwZGF0ZVRvb2xIYW5kKENDbWRVSSogcENtZFVJKSANCit7DQorCS8vIFRPRE86IEFkZCB5b3VyIGNvbW1hbmQgdXBkYXRlIFVJIGhhbmRsZXIgY29kZSBoZXJlDQorCWlmIChtX2JIYW5kKQ0KKwl7DQorCQlwQ21kVUktPlNldENoZWNrKDEpOw0KKwl9IA0KKwllbHNlDQorCXsNCisJCXBDbWRVSS0+U2V0Q2hlY2soMCk7DQorCX0NCisJDQorCQ0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uVXBkYXRlVG9vbFNuYXBzaG90KENDbWRVSSogcENtZFVJKSANCit7DQorCWlmIChtX2JTbmFwKQ0KKwl7DQorCQlwQ21kVUktPlNldENoZWNrKDEpOw0KKwl9IA0KKwllbHNlDQorCXsNCisJCXBDbWRVSS0+U2V0Q2hlY2soMCk7DQorCX0NCisJDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25VcGRhdGVUb29sU2VsZWN0KENDbWRVSSogcENtZFVJKSANCit7DQorCWlmIChtX2JTZWxlY3QpDQorCXsNCisJCXBDbWRVSS0+U2V0Q2hlY2soMSk7DQorCX0gDQorCWVsc2UNCisJew0KKwkJcENtZFVJLT5TZXRDaGVjaygwKTsNCisJfQ0KKwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblZpZXdCb29rbWFyaygpIA0KK3sNCisJLy8gVE9ETzogQWRkIHlvdXIgY29tbWFuZCBoYW5kbGVyIGNvZGUgaGVyZQ0KKwlDQ2hpbGRGcmFtZSogcFBhcmVudCA9IChDQ2hpbGRGcmFtZSopR2V0UGFyZW50RnJhbWUoKTsNCisJaWYocFBhcmVudCA9PSBOVUxMKSByZXR1cm47DQorCWlmIChtX2JCb29rbWFyaykgew0KKwkJcFBhcmVudC0+bV93bmRTcGxpdHRlci5TaG93Q29sdW1uKCk7DQorCQkNCisJfWVsc2V7DQorCQlwUGFyZW50LT5tX3duZFNwbGl0dGVyLkhpZGVDb2x1bW4oMCk7DQorCX0NCisJbV9iQm9va21hcmsgPSAhbV9iQm9va21hcms7DQorfQ0KKw0KKw0KKw0KK0JPT0wgQ1JlYWRlclZDVmlldzo6T25Nb3VzZVdoZWVsKFVJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIENQb2ludCBwdCkgDQorew0KKwlTY3JlZW5Ub0NsaWVudCgmcHQpOw0KKwkvLyBUT0RPOiBBZGQgeW91ciBtZXNzYWdlIGhhbmRsZXIgY29kZSBoZXJlIGFuZC9vciBjYWxsIGRlZmF1bHQNCisJZG91YmxlIHBhZ2VfeCA9IDA7DQorCWRvdWJsZSBwYWdlX3kgPSAwOw0KKwlEZXZpY2VUb1BhZ2UocHQsIHBhZ2VfeCwgcGFnZV95KTsNCisJDQorCWlmKG1fcEFwcCkNCisJew0KKy8vIAkJRlBERl9CT09MIGI9IEZPUk1fT25Nb3VzZVdoZWVsKG1fcEFwcCwgbV9wUGFnZSxDb21wb3NlRmxhZygpLDAsekRlbHRhLHBhZ2VfeCwgcGFnZV95KTsNCisvLyAJCWlmKGIpDQorLy8gCQkJcmV0dXJuIFRSVUU7DQorCX0NCisJDQorCWludCBjdXJQb3NZID0gMDsNCisJaW50IHByZXZQb3NZID0gMDsNCisJaW50IGRpc3RhbmNlWSA9IDI1Ow0KKwlpZih6RGVsdGEgPiAwKQ0KKwl7DQorCQljdXJQb3NZID0gR2V0U2Nyb2xsUG9zKFNCX1ZFUlQpOw0KKwkJcHJldlBvc1kgPSBTZXRTY3JvbGxQb3MoU0JfVkVSVCwgY3VyUG9zWSAtIGRpc3RhbmNlWSwgVFJVRSk7DQorCQljdXJQb3NZID0gR2V0U2Nyb2xsUG9zKFNCX1ZFUlQpOw0KKwkJZGlzdGFuY2VZID0gcHJldlBvc1kgLSBjdXJQb3NZOw0KKwkJbV9uU3RhcnRZID0gbV9uU3RhcnRZICsgZGlzdGFuY2VZOw0KKwkJU2Nyb2xsV2luZG93KDAsIGRpc3RhbmNlWSk7CQkNCisJfQ0KKwllbHNlDQorCXsNCisJCWN1clBvc1kgPSBHZXRTY3JvbGxQb3MoU0JfVkVSVCk7DQorCQlwcmV2UG9zWSA9IFNldFNjcm9sbFBvcyhTQl9WRVJULCBjdXJQb3NZICsgZGlzdGFuY2VZLCBUUlVFKTsNCisJCWN1clBvc1kgPSBHZXRTY3JvbGxQb3MoU0JfVkVSVCk7DQorCQlkaXN0YW5jZVkgPSBjdXJQb3NZIC0gcHJldlBvc1k7DQorCQltX25TdGFydFkgPSBtX25TdGFydFkgLSBkaXN0YW5jZVk7DQorCQlTY3JvbGxXaW5kb3coMCwgLWRpc3RhbmNlWSk7DQorCX0JDQorCXJldHVybiBDVmlldzo6T25Nb3VzZVdoZWVsKG5GbGFncywgekRlbHRhLCBwdCk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25Db250ZXh0TWVudShDV25kKiBwV25kLCBDUG9pbnQgcG9pbnQpIA0KK3sNCisJDQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25FZGl0Q29weSgpIA0KK3sNCisNCisJaWYobV9wVGV4dFBhZ2UgPT0gTlVMTCkNCisJew0KKwkJQWZ4TWVzc2FnZUJveCgiU29ycnksIHRoZSBmcGRmdGV4dC5kbGwgbWF5IGhhcyBleHBpcmVkLiBGb3Iga2VlcGluZyBvbiB1c2luZyB0aGUgZGxsLCBwbGVhc2UgY29udGFjdCBzYWxlc0Bmb3hpdHNvZnR3YXJlLmNvbS4iKTsNCisJCXJldHVybjsNCisJfQ0KKwlsb25nIGxlZnQgPSAwOw0KKwlsb25nIHRvcCA9IDA7DQorCWxvbmcgcmlnaHQgPSAwOw0KKwlsb25nIGJvdHRvbSA9IDA7DQorCUxQV1NUUiBwQnVmZiA9IE5VTEw7DQorCWludCBidWZsZW4gPSAwOw0KKwlDU3RyaW5nIGNzQ29weVRleHQ7DQorDQorCWlmKG1fcnRBcnJheS5HZXRTaXplKCkgIT0gMCkNCisJew0KKwkJZm9yIChpbnQgaT0wOyBpPG1fcnRBcnJheS5HZXRTaXplKCk7IGkrKykNCisJCXsNCisJCQlQREZSZWN0IHJlY3QgPSBtX3J0QXJyYXkuR2V0QXQoaSk7DQorCQkJYnVmbGVuID0gRlBERlRleHRfR2V0Qm91bmRlZFRleHQobV9wVGV4dFBhZ2UsIHJlY3QubV9kYkxlZnQsIHJlY3QubV9kYlRvcCwgcmVjdC5tX2RiUmlnaHQsDQorCQkJCXJlY3QubV9kYkJvdHRvbSwgKHVuc2lnbmVkIHNob3J0KilwQnVmZiwgMCkgKyAxOw0KKwkJCWlmKGJ1ZmxlbiA9PSAwKQ0KKwkJCQlyZXR1cm47DQorCQkJcEJ1ZmYgPSBuZXcgd2NoYXJfdFsyKmJ1Zmxlbl07DQorCQkJbWVtc2V0KHBCdWZmLCAwLCAyKmJ1Zmxlbik7DQorDQorCQkJRlBERlRleHRfR2V0Qm91bmRlZFRleHQobV9wVGV4dFBhZ2UsIHJlY3QubV9kYkxlZnQsIHJlY3QubV9kYlRvcCwgcmVjdC5tX2RiUmlnaHQsIA0KKwkJCQlyZWN0Lm1fZGJCb3R0b20sICh1bnNpZ25lZCBzaG9ydCopcEJ1ZmYsIGJ1Zmxlbik7DQorDQorCQkJaW50IG4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgcEJ1ZmYsIC0xLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisJCQljaGFyICpwID0gbmV3IGNoYXJbbl07DQorCQkJbWVtc2V0KHAsIDAsIG4pOw0KKwkJCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBwQnVmZiwgYnVmbGVuLCBwLCBuLCBOVUxMLCBOVUxMKTsNCisJCQljc0NvcHlUZXh0ID0gY3NDb3B5VGV4dCArIENTdHJpbmcocCk7DQorCQkJZGVsZXRlW10gcDsNCisJCX0NCisJCQ0KKwkJOjpPcGVuQ2xpcGJvYXJkKE5VTEwpOw0KKwkJOjpFbXB0eUNsaXBib2FyZCgpOw0KKwkJSEFORExFIGhDbGlwPUdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsY3NDb3B5VGV4dC5HZXRMZW5ndGgoKSsxKTsNCisJCWNoYXIqIHBCdWY9KGNoYXIqKUdsb2JhbExvY2soaENsaXApOyANCisJCXN0cmNweShwQnVmLGNzQ29weVRleHQpOw0KKwkJR2xvYmFsVW5sb2NrKGhDbGlwKTsNCisJCUhBTkRMRSBoU3VjY2VzcyA9IFNldENsaXBib2FyZERhdGEoQ0ZfVEVYVCwgaENsaXApOw0KKwkJaWYoTlVMTCAhPSBoU3VjY2VzcykNCisJCQlBZnhNZXNzYWdlQm94KCJjb3B5IHN1Y2Nlc3MhIik7DQorCQk6OkNsb3NlQ2xpcGJvYXJkKCk7DQorCQkNCisNCisJfQ0KKwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPblJlbmRlcmJpdG1hcCgpIA0KK3sNCisNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpPbkV4cG9ydFBkZlRvQml0bWFwKCkgDQorew0KKwlpZiAoIW1fcEV4cG9ydFBhZ2VEbGcpDQorCXsNCisJCW1fcEV4cG9ydFBhZ2VEbGc9bmV3IENFeHBvcnRQYWdlOw0KKwkJbV9wRXhwb3J0UGFnZURsZy0+Q3JlYXRlKElERF9FWFBPUlRfUEFHRSx0aGlzKTsNCisJCW1fcEV4cG9ydFBhZ2VEbGctPkluaXREaWFsb2dJbmZvKHRoaXMpOw0KKwkJbV9wRXhwb3J0UGFnZURsZy0+U2hvd1dpbmRvdyhTV19TSE9XKTsNCisJfQ0KKwllbHNlDQorCQltX3BFeHBvcnRQYWdlRGxnLT5TaG93V2luZG93KFNXX1NIT1cpOw0KK30NCisNCitCT09MIENSZWFkZXJWQ1ZpZXc6OlByZVRyYW5zbGF0ZU1lc3NhZ2UoTVNHKiBwTXNnKSANCit7DQorCS8vIFRPRE86IEFkZCB5b3VyIHNwZWNpYWxpemVkIGNvZGUgaGVyZSBhbmQvb3IgY2FsbCB0aGUgYmFzZSBjbGFzcw0KKy8vIAlQUF9FdmVudCBldmVudDsNCisvLyAJaWYocE1zZy0+bWVzc2FnZSA9PSBXTV9MQlVUVE9ORE9XTikNCisvLyAJew0KKy8vIAkJZXZlbnQudHlwZSA9IFBQX0V2ZW50X1R5cGVfTW91c2VEb3duOw0KKy8vIAkJDQorLy8gCQlpbnQgeFBvcyA9IChpbnQpKFdPUkQpKHBNc2ctPmxQYXJhbSk7IA0KKy8vIAkJaW50IHlQb3MgPSAoaW50KShXT1JEKSgocE1zZy0+bFBhcmFtID4+IDE2KSAmIDB4RkZGRik7IA0KKy8vIAkJDQorLy8gCQlldmVudC51Lm1vdXNlLnggPSB4UG9zOw0KKy8vIAkJZXZlbnQudS5tb3VzZS55ID0geVBvczsNCisvLyAJCUZQREZfRm9ybUZpbGxFdmVudE1zZyhtX3BQYWdlLCBldmVudCk7DQorLy8gCX0NCisvLyAJaWYocE1zZy0+bWVzc2FnZSA9PSBXTV9MQlVUVE9OVVApDQorLy8gCXsNCisvLyAJCWV2ZW50LnR5cGUgPSBQUF9FdmVudF9UeXBlX01vdXNlVXA7DQorLy8gCQkNCisvLyAJCWludCB4UG9zID0gKGludCkoV09SRCkocE1zZy0+bFBhcmFtKTsgDQorLy8gCQlpbnQgeVBvcyA9IChpbnQpKFdPUkQpKChwTXNnLT5sUGFyYW0gPj4gMTYpICYgMHhGRkZGKTsgDQorLy8gCQkNCisvLyAJCWV2ZW50LnUubW91c2UueCA9IHhQb3M7DQorLy8gCQlldmVudC51Lm1vdXNlLnkgPSB5UG9zOw0KKy8vIAkJRlBERl9Gb3JtRmlsbEV2ZW50TXNnKG1fcFBhZ2UsIGV2ZW50KTsNCisvLyAJfQ0KKwlyZXR1cm4gQ1ZpZXc6OlByZVRyYW5zbGF0ZU1lc3NhZ2UocE1zZyk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25DaGFyKFVJTlQgbkNoYXIsIFVJTlQgblJlcENudCwgVUlOVCBuRmxhZ3MpIA0KK3sNCisJLy8gVE9ETzogQWRkIHlvdXIgbWVzc2FnZSBoYW5kbGVyIGNvZGUgaGVyZSBhbmQvb3IgY2FsbCBkZWZhdWx0DQorCWlmKG1fcEFwcCkNCisJew0KKwkJaWYoRk9STV9PbkNoYXIobV9wQXBwLCBtX3BQYWdlLCBuQ2hhciwgQ29tcG9zZUZsYWcoKSkpDQorCQkJcmV0dXJuIDsNCisJfQ0KKwlDVmlldzo6T25DaGFyKG5DaGFyLCBuUmVwQ250LCBuRmxhZ3MpOw0KK30NCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uQWN0aXZhdGVWaWV3KEJPT0wgYkFjdGl2YXRlLCBDVmlldyogcEFjdGl2YXRlVmlldywgQ1ZpZXcqIHBEZWFjdGl2ZVZpZXcpIA0KK3sNCisJLy8gVE9ETzogQWRkIHlvdXIgc3BlY2lhbGl6ZWQgY29kZSBoZXJlIGFuZC9vciBjYWxsIHRoZSBiYXNlIGNsYXNzDQorCSgoQ1JlYWRlclZDQXBwKilBZnhHZXRBcHAoKSktPm1fcEFjdGl2ZVZpZXcgPSAoQ1JlYWRlclZDVmlldyopcEFjdGl2YXRlVmlldzsNCisJQ1ZpZXc6Ok9uQWN0aXZhdGVWaWV3KGJBY3RpdmF0ZSwgcEFjdGl2YXRlVmlldywgcERlYWN0aXZlVmlldyk7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25LZXlVcChVSU5UIG5DaGFyLCBVSU5UIG5SZXBDbnQsIFVJTlQgbkZsYWdzKSANCit7DQorCS8vIFRPRE86IEFkZCB5b3VyIG1lc3NhZ2UgaGFuZGxlciBjb2RlIGhlcmUgYW5kL29yIGNhbGwgZGVmYXVsdA0KKwlpZihtX3BBcHApDQorCQlGT1JNX09uS2V5VXAobV9wQXBwLCBtX3BQYWdlLCBuQ2hhciwgQ29tcG9zZUZsYWcoKSk7DQorCUNWaWV3OjpPbktleVVwKG5DaGFyLCBuUmVwQ250LCBuRmxhZ3MpOw0KK30NCisNCisNCitpbnQJCUdfV3JpdGVCbG9jayggRlBERl9GSUxFV1JJVEUqIHBUaGlzLCBjb25zdCB2b2lkKiBwRGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKTsNCitjbGFzcyBDU0RLX0ZpbGVXcml0ZTpwdWJsaWMgRlBERl9GSUxFV1JJVEUNCit7DQorcHVibGljOg0KKwlDU0RLX0ZpbGVXcml0ZSgpDQorCXsNCisJCW1fZnAgPSBOVUxMOw0KKwkJdmVyc2lvbiA9IDA7DQorCQlXcml0ZUJsb2NrID0gR19Xcml0ZUJsb2NrOw0KKwl9DQorcHVibGljOg0KKwlGSUxFKiBtX2ZwOw0KK307DQoraW50CQlHX1dyaXRlQmxvY2soIEZQREZfRklMRVdSSVRFKiBwVGhpcywgY29uc3Qgdm9pZCogcERhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCUNTREtfRmlsZVdyaXRlKiBwRlcgPSAoQ1NES19GaWxlV3JpdGUqKXBUaGlzOw0KKwlyZXR1cm4gZndyaXRlKHBEYXRhLCBzaXplb2YoY2hhciksIHNpemUsIHBGVy0+bV9mcCk7DQorfQ0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25GaWxlU2F2ZSgpIA0KK3sNCisJLy8gVE9ETzogQWRkIHlvdXIgY29tbWFuZCBoYW5kbGVyIGNvZGUgaGVyZQ0KKwlpZihtX3BEb2MgIT0gTlVMTCkNCisJew0KKwkJQ0ZpbGVEaWFsb2cgZGxnKEZBTFNFLCIiLE5VTEwsTlVMTCwiUERGKCouUERGKXwqLlBERnx8QWxsIEZpbGVzKCouKil8Ki4qIik7DQorCQlpZiAoZGxnLkRvTW9kYWwoKSA9PSBJRE9LKQ0KKwkJew0KKwkJCUNTdHJpbmcgc3RyUERGTmFtZSA9IGRsZy5HZXRQYXRoTmFtZSgpOw0KKw0KKwkJCUNTREtfRmlsZVdyaXRlIGZ3Ow0KKwkJCWZ3Lm1fZnAgPSBmb3BlbihkbGcuR2V0UGF0aE5hbWUoKSwgIndiIik7DQorDQorCQkJRlBERl9TYXZlQXNDb3B5KG1fcERvYywgJmZ3LCAwKTsNCisJCQlmY2xvc2UoZncubV9mcCk7DQorLy8JCQlGUERGX1NhdmVBc0ZpbGUobV9wRG9jLCBzdHJQREZOYW1lLkdldEJ1ZmZlcihzdHJQREZOYW1lLkdldExlbmd0aCgpKSwgMCwgTlVMTCwgMCwgTlVMTCwgMCk7DQorCQl9CQkNCisJfQ0KK30NCisNCisNCisNCit2b2lkIENSZWFkZXJWQ1ZpZXc6Ok9uVGVzdEpTKCkgDQorew0KKwkvLyBUT0RPOiBBZGQgeW91ciBjb21tYW5kIGhhbmRsZXIgY29kZSBoZXJlDQorCS8vRlBERl9XSURFU1RSSU5HIGpzID0gTCJydW49YXBwLnNldEludGVydmFsKFwiYXBwLmFsZXJ0KFxcXCJva1xcXCIpXCIpO2FwcC5zZXRUaW1lT3V0KFwiYXBwLmNsZWFySW50ZXJ2YWwocnVuKVwiLCA2MDAwKTsiOw0KKy8vCUZQREZfV0lERVNUUklORyBqcyA9IEwiYXBwLmFsZXJ0KEFGTnVtYmVyX0tleXN0cm9rZShcJ2FhYWFhYWFhYVwnKSkiOw0KKy8vCUZQREZfV0lERVNUUklORyBqcyA9IEwiYXBwLm1haWxNc2coMSkiOw0KKwkvL0ZQREZfV0lERVNUUklORyBqcyA9IEwiYXBwLnNldFRpbWVPdXQoXCJhcHAuY2xlYXJJbnRlcnZhbCgxKVwiLCA2MDAwKTsiOw0KKwkvL0ZQREZfV0lERVNUUklORyBqcyA9IEwidC4xIjsNCisvLwlSdW5KUyhtX3BBcHAsIGpzKTsNCisJQ1Rlc3RKc0RsZyBkbGc7DQorCWRsZy5pbml0KG1fcEFwcCk7DQorCWRsZy5Eb01vZGFsKCk7DQorfQ0KKw0KKy8vVGhpcyBmdW5jdGlvbiBpcyB0byBzaW11bGF0ZSB0aGUgcHAgZXZlbnQuDQorI2RlZmluZSBQUF9FVkVOVF9NT0RJRklFUl9TSElGVEtFWSAgICAgICAxPDwwDQorI2RlZmluZSBQUF9FVkVOVF9NT0RJRklFUl9DT05UUk9MS0VZICAgICAgIDE8PDENCisjZGVmaW5lIFBQX0VWRU5UX01PRElGSUVSX0FMVEtFWSAgICAgICAgICAgMTw8Mg0KK3Vuc2lnbmVkIGludCBDUmVhZGVyVkNWaWV3OjpDb21wb3NlRmxhZygpDQorew0KKwl1bnNpZ25lZCBpbnQgbkZsYWcgPSAwOw0KKwlpZihJc0FMVHByZXNzZWQoKSkNCisJCW5GbGFnID0gbkZsYWd8UFBfRVZFTlRfTU9ESUZJRVJfQUxUS0VZOw0KKwlpZihJc0NUUkxwcmVzc2VkKCkpDQorCQluRmxhZyA9IG5GbGFnfFBQX0VWRU5UX01PRElGSUVSX0NPTlRST0xLRVk7DQorCWlmKElzU0hJRlRwcmVzc2VkKCkpDQorCQluRmxhZyA9IG5GbGFnfFBQX0VWRU5UX01PRElGSUVSX1NISUZUS0VZOw0KKwlyZXR1cm4gbkZsYWc7DQorfQ0KKw0KK3ZvaWQgQ1JlYWRlclZDVmlldzo6T25QcmludE1ldGFsZmlsZSgpIA0KK3sNCisJRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKG1fcERvYywgMCk7DQorCWlmICghcGFnZSkgew0KKwkJcmV0dXJuOw0KKwl9DQorCQ0KKwlIREMgcHJpbnRlcl9kYyA9IENyZWF0ZURDKCJXSU5TUE9PTCIsICJNaWNyb3NvZnQgWFBTIERvY3VtZW50IFdyaXRlciIsIE5VTEwsDQorCQlOVUxMKTsNCisJaWYgKCFwcmludGVyX2RjKSB7DQorCQlwcmludGYoIkNvdWxkIG5vdCBjcmVhdGUgcHJpbnRlciBEQ1xuIik7DQorCQlyZXR1cm47DQorCX0NCisJRE9DSU5GTyBkaSA9IHswfTsNCisJZGkuY2JTaXplID0gc2l6ZW9mKERPQ0lORk8pOw0KKwlkaS5scHN6RG9jTmFtZSA9ICJGb3hpdCBwcmludCB0ZXN0IjsNCisJaW50IGpvYl9pZCA9IFN0YXJ0RG9jKHByaW50ZXJfZGMsICZkaSk7DQorCQ0KKwlTdGFydFBhZ2UocHJpbnRlcl9kYyk7DQorCQ0KKwlTZXRHcmFwaGljc01vZGUocHJpbnRlcl9kYywgR01fQURWQU5DRUQpOw0KKwlYRk9STSB4Zm9ybSA9IHswLCAwLCAwLCAwLCAwLCAwfTsNCisJeGZvcm0uZU0xMSA9IHhmb3JtLmVNMjIgPSAyOw0KKwlNb2RpZnlXb3JsZFRyYW5zZm9ybShwcmludGVyX2RjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOw0KKwkNCisJaW50IGRjX3dpZHRoID0gR2V0RGV2aWNlQ2FwcyhwcmludGVyX2RjLCBQSFlTSUNBTFdJRFRIKTsNCisJaW50IGRjX2hlaWdodCA9IEdldERldmljZUNhcHMocHJpbnRlcl9kYywgUEhZU0lDQUxIRUlHSFQpOw0KKwlIREMgbWV0YWZpbGVfZGMgPSBDcmVhdGVFbmhNZXRhRmlsZShwcmludGVyX2RjLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisJWEZPUk0geGZvcm0xID0gezAsIDAsIDAsIDAsIDAsIDB9Ow0KKwl4Zm9ybTEuZU0xMSA9IHhmb3JtMS5lTTIyID0gMC41Ow0KKwlNb2RpZnlXb3JsZFRyYW5zZm9ybShtZXRhZmlsZV9kYywgJnhmb3JtMSwgTVdUX0xFRlRNVUxUSVBMWSk7DQorCUZQREZfUmVuZGVyUGFnZShtZXRhZmlsZV9kYywgcGFnZSwgMCwgMCwgZGNfd2lkdGgsIGRjX2hlaWdodCwgMCwgMCk7DQorCQ0KKwlIRU5ITUVUQUZJTEUgZW1mID0gQ2xvc2VFbmhNZXRhRmlsZShtZXRhZmlsZV9kYyk7DQorCQ0KKwlFTkhNRVRBSEVBREVSIGhlYWRlciA9IHswfTsNCisJR2V0RW5oTWV0YUZpbGVIZWFkZXIoZW1mLCBzaXplb2YoaGVhZGVyKSwgJmhlYWRlcik7DQorCQ0KKwlQbGF5RW5oTWV0YUZpbGUocHJpbnRlcl9kYywgZW1mLCAoUkVDVCAqKSZoZWFkZXIucmNsQm91bmRzKTsNCisJDQorCUVuZFBhZ2UocHJpbnRlcl9kYyk7DQorCUVuZERvYyhwcmludGVyX2RjKTsNCisJDQorCURlbGV0ZUVuaE1ldGFGaWxlKGVtZik7DQorCURlbGV0ZURDKHByaW50ZXJfZGMpOw0KKwkNCit9DQorDQordm9pZCBDUmVhZGVyVkNWaWV3OjpDcmVhdGVMb2NhbFBhdGgoQ1N0cmluZyAmY3NQYXRoKQ0KK3sNCisJY3NQYXRoID0gImM6Ly90ZXN0LnBkZiI7DQorfQ0KKw0KK0JPT0wgQ1JlYWRlclZDVmlldzo6SHR0cERhdGFQb3N0KENTdHJpbmcgY3NEYXRhLCBDU3RyaW5nIGNzQXBwTmFtZSwgQ1N0cmluZyBjc09iamVjdCwgQ1N0cmluZyBjc1NlcnZlciwgQ1N0cmluZyBjc1VzZXJOYW1lLCBDU3RyaW5nIGNzUGFzc3dvcmQsIElOVEVSTkVUX1BPUlQgblBvcnQgLCBCT09MIElzSFRUUFMsIENTdHJpbmcgY3NDb250ZW50VHlwZSwgQ1N0cmluZyBjc0FkZEhlYWRlciwgQ1N0cmluZyAmY3NSZXNwb25zZSkNCit7DQorCURXT1JEIHJldENvZGUgPSAwOw0KKwlCT09MIGJSZXQgPSBGQUxTRTsNCisJVFJZDQorCXsNCisJCUNJbnRlcm5ldFNlc3Npb24gc2Vzcyhjc0FwcE5hbWUpOw0KKwkJQ0h0dHBDb25uZWN0aW9uKiBwQ29ubmVjdCA9IHNlc3MuR2V0SHR0cENvbm5lY3Rpb24oY3NTZXJ2ZXIsIG5Qb3J0LCBjc1VzZXJOYW1lLCBjc1Bhc3N3b3JkKTsNCisJCWlmIChwQ29ubmVjdCA9PSBOVUxMKQ0KKwkJCXJldHVybiBGQUxTRTsNCisNCisJCURXT1JEIGR3UmVxdWVzdEZsYWdzID0gSU5URVJORVRfRkxBR19FWElTVElOR19DT05ORUNUOw0KKwkJaWYgKCBJc0hUVFBTID09IFRSVUUpIA0KKwkJCWR3UmVxdWVzdEZsYWdzIHw9IElOVEVSTkVUX0ZMQUdfU0VDVVJFOw0KKwkJQ0h0dHBGaWxlKiBwSHR0cEZpbGUgPSBwQ29ubmVjdC0+T3BlblJlcXVlc3QoQ0h0dHBDb25uZWN0aW9uOjpIVFRQX1ZFUkJfUE9TVCwgY3NPYmplY3QsIE5VTEwsIDEsIE5VTEwsIE5VTEwsIGR3UmVxdWVzdEZsYWdzKTsNCisJCWlmIChwSHR0cEZpbGUgIT0gTlVMTCkNCisJCXsNCisJCQlDU3RyaW5nIHN0ckRhdGEgPSBjc0RhdGE7DQorCQkJRFdPUkQgZHdMZW5ndGggPSBzdHJEYXRhLkdldExlbmd0aCgpOw0KKw0KKwkJCUNTdHJpbmcgc3RySGVhZGVyczsNCisJCQlzdHJIZWFkZXJzLkZvcm1hdCgiQ29udGVudC1UeXBlOiAlc1xyXG5Db250ZW50LUxlbmd0aDogJWRcclxuIiwgY3NDb250ZW50VHlwZSwgZHdMZW5ndGgpOw0KKwkJCXN0ckhlYWRlcnMgKz0gY3NBZGRIZWFkZXI7DQorCQkJcEh0dHBGaWxlLT5BZGRSZXF1ZXN0SGVhZGVycyhzdHJIZWFkZXJzKTsNCisJCQlEV09SRCBkd1RvdGFsTGVuZ3RoID0gZHdMZW5ndGggKyBzdHJIZWFkZXJzLkdldExlbmd0aCgpOw0KKw0KK3Jlc2VuZDoNCisJCQliUmV0ID0gcEh0dHBGaWxlLT5TZW5kUmVxdWVzdEV4KGR3VG90YWxMZW5ndGgpOw0KKwkJCXBIdHRwRmlsZS0+V3JpdGUoY3NEYXRhLCBkd0xlbmd0aCk7DQorDQorCQkJcEh0dHBGaWxlLT5RdWVyeUluZm9TdGF0dXNDb2RlKCByZXRDb2RlICk7DQorCQkJaWYgKEhUVFBfU1RBVFVTX09LID09IHJldENvZGUpIC8vc3VjYw0KKwkJCXsNCisJCQkJY2hhciBidWZbNDA5Nl0gPSB7MH07DQorCQkJCVVJTlQgYnl0ZXNSZWFkID0gMDsNCisJCQkJd2hpbGUoICggYnl0ZXNSZWFkID0gcEh0dHBGaWxlLT5SZWFkKCBidWYsIDQwOTUgKSApID4gMCApDQorCQkJCXsNCisJCQkJCWJ1ZltieXRlc1JlYWRdID0gJ1wwJzsNCisJCQkJCXNpemVfdCBhTGVuID0gc3RybGVuKCBidWYgKSArIDE7IA0KKwkJCQkJaW50IHdMZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCA5MzYsIDAsIGJ1ZiwgYUxlbiwgTlVMTCwgMCApOw0KKw0KKwkJCQkJTFBPTEVTVFIgbHB3ID0gbmV3IFdDSEFSIFt3TGVuXTsgDQorCQkJCQlNdWx0aUJ5dGVUb1dpZGVDaGFyKCA5MzYsIDAsIGJ1ZiwgYUxlbiwgbHB3LCB3TGVuICk7IA0KKwkJCQkJY3NSZXNwb25zZSArPSBscHc7DQorCQkJCQlkZWxldGUgW10gbHB3OyANCisNCisJCQkJCW1lbXNldCggYnVmLCAwLCA0MDk2ICk7DQorCQkJCX0gDQorCQkJfQ0KKwkJCWJSZXQgPSBwSHR0cEZpbGUtPkVuZFJlcXVlc3QoKTsNCisJCQlpZiAoYlJldCkNCisJCQl7DQorCQkJCS8vIEhhbmRsZSBhbnkgYXV0aGVudGljYXRpb24gZGlhbG9ncy4NCisJCQkJaWYgKE5lZWRBdXRoKHBIdHRwRmlsZSkpDQorCQkJCXsNCisJCQkJCURXT1JEIGR3RXJyOw0KKwkJCQkJZHdFcnIgPSBwSHR0cEZpbGUtPkVycm9yRGxnKEdldERlc2t0b3BXaW5kb3coKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCQkJCWJSZXQgPyBFUlJPUl9TVUNDRVNTIDogR2V0TGFzdEVycm9yKCksICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCQkJCUZMQUdTX0VSUk9SX1VJX0ZJTFRFUl9GT1JfRVJST1JTICB8ICAgICANCisJCQkJCQlGTEFHU19FUlJPUl9VSV9GTEFHU19DSEFOR0VfT1BUSU9OUyB8DQorCQkJCQkJRkxBR1NfRVJST1JfVUlfRkxBR1NfR0VORVJBVEVfREFUQSwgDQorCQkJCQkJTlVMTCk7DQorCQkJCQlpZiAoZHdFcnIgPT0gRVJST1JfSU5URVJORVRfRk9SQ0VfUkVUUlkpDQorCQkJCQl7DQorCQkJCQkJZ290byByZXNlbmQ7DQorCQkJCQl9DQorCQkJCQllbHNlIGlmKGR3RXJyID09IDApDQorCQkJCQl7DQorCQkJCQkJYlJldCA9IEZBTFNFOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCXBIdHRwRmlsZS0+Q2xvc2UoKTsNCisJCQlkZWxldGUgcEh0dHBGaWxlOw0KKwkJfQ0KKwkJcENvbm5lY3QtPkNsb3NlKCk7DQorCQlkZWxldGUgcENvbm5lY3Q7DQorCQlzZXNzLkNsb3NlKCk7DQorCX0NCisJQ0FUQ0hfQUxMKGUpDQorCXsNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwlFTkRfQ0FUQ0hfQUxMDQorCQlyZXR1cm4gYlJldDsNCit9DQorDQorQk9PTCBDUmVhZGVyVkNWaWV3OjpIdHRwRGF0YVB1dChDU3RyaW5nIGNzRGF0YSwgQ1N0cmluZyBjc0FwcE5hbWUsIENTdHJpbmcgY3NPYmplY3QsIENTdHJpbmcgY3NTZXJ2ZXIsIENTdHJpbmcgY3NVc2VyTmFtZSwgQ1N0cmluZyBjc1Bhc3N3b3JkLCBJTlRFUk5FVF9QT1JUIG5Qb3J0LCBCT09MIElzSFRUUFMpDQorew0KKwlEV09SRCByZXRDb2RlID0gMDsNCisJQk9PTCBiUmV0ID0gRkFMU0U7DQorCVRSWQ0KKwl7DQorCQlDSW50ZXJuZXRTZXNzaW9uIHNlc3MoY3NBcHBOYW1lKTsNCisJCUNIdHRwQ29ubmVjdGlvbiogcENvbm5lY3QgPSBzZXNzLkdldEh0dHBDb25uZWN0aW9uKGNzU2VydmVyLCBuUG9ydCwgY3NVc2VyTmFtZSwgY3NQYXNzd29yZCk7DQorCQlpZiAocENvbm5lY3QgPT0gTlVMTCkNCisJCQlyZXR1cm4gRkFMU0U7DQorDQorCQlEV09SRCBkd1JlcXVlc3RGbGFncz1JTlRFUk5FVF9GTEFHX0VYSVNUSU5HX0NPTk5FQ1Q7DQorCQlpZiAoIElzSFRUUFM9PSBUUlVFKSANCisJCQlkd1JlcXVlc3RGbGFncyB8PSBJTlRFUk5FVF9GTEFHX1NFQ1VSRTsNCisJCUNIdHRwRmlsZSogcEh0dHBGaWxlID0gcENvbm5lY3QtPk9wZW5SZXF1ZXN0KENIdHRwQ29ubmVjdGlvbjo6SFRUUF9WRVJCX1BVVCwgY3NPYmplY3QsTlVMTCwxLE5VTEwsTlVMTCxkd1JlcXVlc3RGbGFncyk7DQorCQlpZiAocEh0dHBGaWxlICE9IE5VTEwpDQorCQl7DQorcmVzZW5kOg0KKwkJCUNTdHJpbmcgc3RyRGF0YSA9IGNzRGF0YTsNCisJCQlEV09SRCBkd1RvdGFsTGVuZ3RoID0gc3RyRGF0YS5HZXRMZW5ndGgoKTsNCisNCisJCQliUmV0ID0gcEh0dHBGaWxlLT5TZW5kUmVxdWVzdEV4KGR3VG90YWxMZW5ndGgpOw0KKwkJCXBIdHRwRmlsZS0+V3JpdGUoY3NEYXRhLCBkd1RvdGFsTGVuZ3RoKTsNCisJCQliUmV0ID0gcEh0dHBGaWxlLT5FbmRSZXF1ZXN0KCk7DQorCQkJaWYgKGJSZXQpDQorCQkJew0KKwkJCQkvLyBIYW5kbGUgYW55IGF1dGhlbnRpY2F0aW9uIGRpYWxvZ3MuDQorCQkJCWlmIChOZWVkQXV0aChwSHR0cEZpbGUpKQ0KKwkJCQl7DQorCQkJCQlEV09SRCBkd0VycjsNCisJCQkJCWR3RXJyID0gcEh0dHBGaWxlLT5FcnJvckRsZyhHZXREZXNrdG9wV2luZG93KCksDQorCQkJCQkJYlJldCA/IEVSUk9SX1NVQ0NFU1MgOiBHZXRMYXN0RXJyb3IoKSwgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJCQkJRkxBR1NfRVJST1JfVUlfRklMVEVSX0ZPUl9FUlJPUlMgIHwgICAgIA0KKwkJCQkJCUZMQUdTX0VSUk9SX1VJX0ZMQUdTX0NIQU5HRV9PUFRJT05TIHwNCisJCQkJCQlGTEFHU19FUlJPUl9VSV9GTEFHU19HRU5FUkFURV9EQVRBLCANCisJCQkJCQlOVUxMDQorCQkJCQkJKTsNCisJCQkJCWlmIChkd0VyciA9PSBFUlJPUl9JTlRFUk5FVF9GT1JDRV9SRVRSWSkNCisJCQkJCXsNCisJCQkJCQlnb3RvIHJlc2VuZDsNCisJCQkJCX0NCisJCQkJCWVsc2UgaWYoZHdFcnIgPT0gMCkNCisJCQkJCXsNCisJCQkJCQliUmV0ID0gRkFMU0U7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJcEh0dHBGaWxlLT5RdWVyeUluZm9TdGF0dXNDb2RlKCByZXRDb2RlICk7DQorCQkJaWYgKHJldENvZGUgIT0gSFRUUF9TVEFUVVNfT0spDQorCQkJew0KKwkJCQliUmV0ID0gRkFMU0U7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJYlJldCA9IFRSVUU7DQorDQorCQkJcEh0dHBGaWxlLT5DbG9zZSgpOw0KKwkJCWRlbGV0ZSBwSHR0cEZpbGU7DQorCQl9DQorCQlwQ29ubmVjdC0+Q2xvc2UoKTsNCisJCWRlbGV0ZSBwQ29ubmVjdDsNCisJCXNlc3MuQ2xvc2UoKTsNCisJfQ0KKwlDQVRDSF9BTEwoZSkNCisJew0KKwkJcmV0dXJuIEZBTFNFOw0KKwl9DQorCUVORF9DQVRDSF9BTEwNCisJCXJldHVybiBiUmV0Ow0KK30NCisNCitCT09MIENSZWFkZXJWQ1ZpZXc6Ok5lZWRBdXRoKENIdHRwRmlsZSAqcEh0dHBGaWxlKQ0KK3sNCisJLy8gR2V0IHN0YXR1cyBjb2RlLg0KKwlEV09SRCBkd1N0YXR1czsNCisJRFdPUkQgY2JTdGF0dXMgPSBzaXplb2YoZHdTdGF0dXMpOw0KKwlwSHR0cEZpbGUtPlF1ZXJ5SW5mbw0KKwkJKA0KKwkJSFRUUF9RVUVSWV9GTEFHX05VTUJFUiB8IEhUVFBfUVVFUllfU1RBVFVTX0NPREUsDQorCQkmZHdTdGF0dXMsDQorCQkmY2JTdGF0dXMsDQorCQlOVUxMDQorCQkpOw0KKwkvLyAgICBmcHJpbnRmIChzdGRlcnIsICJTdGF0dXM6ICVkXG4iLCBkd1N0YXR1cyk7DQorCS8vIExvb2sgZm9yIDQwMSBvciA0MDcuDQorCURXT1JEIGR3RmxhZ3M7DQorCXN3aXRjaCAoZHdTdGF0dXMpDQorCXsNCisJY2FzZSBIVFRQX1NUQVRVU19ERU5JRUQ6DQorCQlkd0ZsYWdzID0gSFRUUF9RVUVSWV9XV1dfQVVUSEVOVElDQVRFOw0KKwkJYnJlYWs7DQorCWNhc2UgSFRUUF9TVEFUVVNfUFJPWFlfQVVUSF9SRVE6DQorCQlkd0ZsYWdzID0gSFRUUF9RVUVSWV9QUk9YWV9BVVRIRU5USUNBVEU7DQorCQlicmVhazsgICAgICAgICAgICANCisJZGVmYXVsdDoNCisJCXJldHVybiBGQUxTRTsNCisJfQ0KKwkvLyBFbnVtZXJhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGVzLg0KKwlCT09MIGZSZXQ7DQorCWNoYXIgc3pTY2hlbWVbNjRdOw0KKwlEV09SRCBkd0luZGV4ID0gMDsNCisJZG8NCisJew0KKwkJRFdPUkQgY2JTY2hlbWUgPSBzaXplb2Yoc3pTY2hlbWUpOw0KKwkJZlJldCA9IHBIdHRwRmlsZS0+UXVlcnlJbmZvDQorCQkJKGR3RmxhZ3MsIHN6U2NoZW1lLCAmY2JTY2hlbWUsICZkd0luZGV4KTsNCisNCisJCS8vaWYgKGZSZXQpDQorCQkvL2ZwcmludGYgKHN0ZGVyciwgIkZvdW5kIGF1dGggc2NoZW1lOiAlc1xuIiwgc3pTY2hlbWUpOw0KKwl9DQorCXdoaWxlIChmUmV0KTsNCisJcmV0dXJuIFRSVUU7DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQ1ZpZXcuaCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9SZWFkZXJWQ1ZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRlNzFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1JlYWRlclZDVmlldy5oCkBAIC0wLDAgKzEsMzc1IEBACisvLyBSZWFkZXJWQ1ZpZXcuaCA6IGludGVyZmFjZSBvZiB0aGUgQ1JlYWRlclZDVmlldyBjbGFzcw0KKy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisjaWYgIWRlZmluZWQoQUZYX1JFQURFUlZDVklFV19IX185QUZDNDQ5Q18yNkQwXzQ5MDZfQUJBRV8xMjk4ODcxODYyRTJfX0lOQ0xVREVEXykNCisjZGVmaW5lIEFGWF9SRUFERVJWQ1ZJRVdfSF9fOUFGQzQ0OUNfMjZEMF80OTA2X0FCQUVfMTI5ODg3MTg2MkUyX19JTkNMVURFRF8NCisNCisjaWYgX01TQ19WRVIgPiAxMDAwDQorI3ByYWdtYSBvbmNlDQorI2VuZGlmIC8vIF9NU0NfVkVSID4gMTAwMA0KKw0KKyNpbmNsdWRlICJFeHBvcnRQYWdlLmgiDQorI2luY2x1ZGUgImFmeHRlbXBsLmgiDQorI2luY2x1ZGUgPHdpbmluZXQuaD4NCisjaW5jbHVkZSA8YWZ4aW5ldC5oPg0KKyNpbmNsdWRlIDxhZnhjdGwuaD4NCisNCit0eXBlZGVmIHN0cnVjdCAgDQorew0KKwlDU3RyaW5nIG1fc3RyRmluZDsNCisJaW50IG1fbkZsYWc7DQorCWludCBtX25EaXJlY3Rpb247DQorCUJPT0wgbV9iRmlyc3Q7DQorCXdjaGFyX3QgKm1fcEN1ckZpbmRCdWY7IC8vdW5pY29kZSBjb2RlDQorCWludCBtX25TdGFydFBhZ2VJbmRleDsgLy8gdGhlIHBhZ2UgaW5kZXggZm9yIHN0YXJ0aW5nIGZpbmQNCisJaW50IG1fblN0YXJ0Q2hhckluZGV4OyAvL3N0YXJ0IGluZGV4DQorfUZpbmRJbmZvOw0KKw0KK3R5cGVkZWYgc3RydWN0ICANCit7DQorCWRvdWJsZSBtX2RiTGVmdDsNCisJZG91YmxlIG1fZGJUb3A7DQorCWRvdWJsZSBtX2RiUmlnaHQ7DQorCWRvdWJsZSBtX2RiQm90dG9tOw0KK31QREZSZWN0Ow0KKw0KKyNkZWZpbmUgSXNBTFRwcmVzc2VkKCkJCQkoR2V0S2V5U3RhdGUoVktfTUVOVSkgPCAwKQ0KKyNkZWZpbmUgSXNDVFJMcHJlc3NlZCgpCQkJKEdldEtleVN0YXRlKFZLX0NPTlRST0wpIDwgMCkNCisjZGVmaW5lIElzU0hJRlRwcmVzc2VkKCkJCShHZXRLZXlTdGF0ZShWS19TSElGVCkmMHg4MDAwKQ0KKyNkZWZpbmUgSXNJTlNFUlRwcmVzc2VkKCkJCShHZXRLZXlTdGF0ZShWS19JTlNFUlQpICYgMHgwMSkJDQorLy8gdm9pZCBTYW1wbGVfUGFnZVRvRGV2aWNlKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsZG91YmxlIHBhZ2VfeSwgaW50KiBkZXZpY2VfeCwgaW50KiBkZXZpY2VfeSk7DQorLy8gDQorLy8gdm9pZCBTYW1wbGVfSW52YWxpZGF0ZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSk7DQorLy8gDQorLy8gdm9pZCBTYW1wbGVfRGV2aWNlVG9QYWdlKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLEZQREZfUEFHRSBwYWdlLGludCBkZXZpY2VfeCwgaW50IGRldmljZV95LCBkb3VibGUqIHBhZ2VfeCwgZG91YmxlKiBwYWdlX3kpOw0KKy8vIA0KKy8vIHZvaWQgU2FtcGxlX1NldENhcmV0KHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3ksIGludCBuV2lkdGgsIGludCBuSGVpZ2h0KTsNCisvLyANCisvLyB2b2lkIFNhbXBsZV9SZWxlYXNlKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsNCisvLyANCisvLyANCisvLyBpbnQgU2FtcGxlX1NldFRpbWVyKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7DQorLy8gDQorLy8gdm9pZCBTYW1wbGVfS2lsbFRpbWVyKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLGludCBuSUQpOw0KKy8vIA0KKy8vIHZvaWQgU2FtcGxlX1NldEN1cnNvcihzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxpbnQgbkN1cnNvclR5cGUpOw0KKy8vIA0KKy8vIHZvaWQgU2FtcGxlX09uQ2hhbmdlKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsNCisvLyANCisvLyBGUERGX0JPT0wJU2FtcGxlX0lzU0hJRlRLZXlEb3duKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsNCisvLyANCisvLyBGUERGX0JPT0wJU2FtcGxlX0lzQ1RSTEtleURvd24oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOw0KKy8vIA0KKy8vIEZQREZfQk9PTAlTYW1wbGVfSXNBTFRLZXlEb3duKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKSA7DQorLy8gDQorLy8gRlBERl9CT09MCVNhbXBsZV9Jc0lOU0VSVEtleURvd24oc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpIDsNCitjbGFzcyBDUmVhZGVyVkNEb2M7DQorDQordHlwZWRlZiB1bnNpZ25lZCBsb25nCQkJRlhfRFdPUkQ7DQorc3RhdGljIGludCBDQUxMQkFDSyBGb250RW51bVByb2MoY29uc3QgTE9HRk9OVEEgKnBsZiwgY29uc3QgVEVYVE1FVFJJQ0EgKmxwbnRtZSwgRlhfRFdPUkQgRm9udFR5cGUsIExQQVJBTSBsUGFyYW0pIA0KK3sNCisJRlBERl9BZGRJbnN0YWxsZWRGb250KCh2b2lkKilsUGFyYW0sIHBsZi0+bGZGYWNlTmFtZSwgcGxmLT5sZkNoYXJTZXQpOw0KKwlyZXR1cm4gMTsNCit9DQorI2RlZmluZSBGWERXT1JEX0ZST01fTVNCRklSU1QyKGkpICgoKHVuc2lnbmVkIGNoYXIpKGkpIDw8IDI0KSB8ICgodW5zaWduZWQgY2hhcikoKGkpID4+IDgpIDw8IDE2KSB8ICgodW5zaWduZWQgY2hhcikoKGkpID4+IDE2KSA8PCA4KSB8ICh1bnNpZ25lZCBjaGFyKSgoaSkgPj4gMjQpKQ0KK2NsYXNzIENTYW1wbGVGb250SW5mbyA6IHB1YmxpYyBGUERGX1NZU0ZPTlRJTkZPDQorew0KK3B1YmxpYzoNCisJQ1NhbXBsZUZvbnRJbmZvKCkNCisJew0KKwkJbV9oREMgPSBDcmVhdGVEQ0EoIkRJU1BMQVkiLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisJfQ0KKwkNCisJSERDCQltX2hEQzsNCisJDQorCXZvaWQgUmVsZWFzZUltcGwoKQ0KKwl7DQorCQlEZWxldGVEQyhtX2hEQyk7DQorCQlkZWxldGUgdGhpczsNCisJfQ0KKwkNCisJdm9pZCBFbnVtRm9udHNJbXBsKHZvaWQqIHBNYXBwZXIpIA0KKwl7DQorCQlMT0dGT05UQSBsZjsNCisJCWxmLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsNCisJCWxmLmxmRmFjZU5hbWVbMF0gPSAwOw0KKwkJbGYubGZQaXRjaEFuZEZhbWlseSA9IDA7DQorCQk6OkVudW1Gb250RmFtaWxpZXNFeEEobV9oREMsICZsZiwgRm9udEVudW1Qcm9jLCAoTFBBUkFNKXBNYXBwZXIsIDApOw0KKwl9DQorCQ0KKwl2b2lkKiBNYXBGb250SW1wbChpbnQgd2VpZ2h0LCBpbnQgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IGNoYXIqIGZhY2UsIGludCogYkV4YWN0KQ0KKwl7DQorCQlyZXR1cm4gOjpDcmVhdGVGb250QSgtMTAsIDAsIDAsIDAsIHdlaWdodCwgYkl0YWxpYywgMCwgMCwgDQorCQkJY2hhcnNldCwgT1VUX1RUX09OTFlfUFJFQ0lTLCAwLCAwLCBwaXRjaF9mYW1pbHksIGZhY2UpOw0KKwl9DQorCQ0KKwl1bnNpZ25lZCBsb25nIEdldEZvbnREYXRhSW1wbCh2b2lkKiBoRm9udCwgdW5zaWduZWQgaW50IHRhYmxlLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpDQorCXsNCisJCUhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOw0KKwkJYnVmX3NpemUgPSA6OkdldEZvbnREYXRhKG1faERDLCBGWERXT1JEX0ZST01fTVNCRklSU1QyKHRhYmxlKSwgMCwgYnVmZmVyLCBidWZfc2l6ZSk7DQorCQk6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOw0KKwkJaWYgKGJ1Zl9zaXplID09IEdESV9FUlJPUikgcmV0dXJuIDA7DQorCQlyZXR1cm4gYnVmX3NpemU7DQorCX0NCisJDQorCXVuc2lnbmVkIGxvbmcgR2V0RmFjZU5hbWVJbXBsKHZvaWQqIGhGb250LCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpDQorCXsNCisJCUhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOw0KKwkJdW5zaWduZWQgbG9uZyByZXQgPSA6OkdldFRleHRGYWNlQShtX2hEQywgYnVmX3NpemUsIGJ1ZmZlcik7DQorCQk6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOw0KKwkJaWYgKGJ1Zl9zaXplID09IEdESV9FUlJPUikgcmV0dXJuIDA7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorCQ0KKwlpbnQgR2V0Rm9udENoYXJzZXRJbXBsKHZvaWQqIGhGb250KQ0KKwl7DQorCQlURVhUTUVUUklDIHRtOw0KKwkJSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7DQorCQk6OkdldFRleHRNZXRyaWNzKG1faERDLCAmdG0pOw0KKwkJOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsNCisJCXJldHVybiB0bS50bUNoYXJTZXQ7DQorCX0NCisJDQorCXZvaWQgRGVsZXRlRm9udEltcGwodm9pZCogaEZvbnQpDQorCXsNCisJCTo6RGVsZXRlT2JqZWN0KGhGb250KTsNCisJfQ0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfRklMRQ0KK3sNCisJRlBERl9GSUxFSEFORExFUiBmaWxlSGFuZGxlcjsNCisJRklMRSogZmlsZTsNCit9RlBERl9GSUxFOw0KKw0KK2NsYXNzIENSZWFkZXJWQ1ZpZXcgOiBwdWJsaWMgQ1ZpZXcsIHB1YmxpYyBGUERGX0ZPUk1GSUxMSU5GTw0KK3sNCitwcm90ZWN0ZWQ6IC8vIGNyZWF0ZSBmcm9tIHNlcmlhbGl6YXRpb24gb25seQ0KKwlDUmVhZGVyVkNWaWV3KCk7DQorCURFQ0xBUkVfRFlOQ1JFQVRFKENSZWFkZXJWQ1ZpZXcpDQorDQorLy8gQXR0cmlidXRlcw0KK3B1YmxpYzoNCisJQ1JlYWRlclZDRG9jKiBHZXREb2N1bWVudCgpOw0KKwlDQ2hpbGRGcmFtZSAqbV9wRnJhbTsNCisvLyBPcGVyYXRpb25zDQorcHVibGljOg0KKw0KKy8vIE92ZXJyaWRlcw0KKwkvLyBDbGFzc1dpemFyZCBnZW5lcmF0ZWQgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZXMNCisJLy97e0FGWF9WSVJUVUFMKENSZWFkZXJWQ1ZpZXcpDQorCXB1YmxpYzoNCisJdmlydHVhbCB2b2lkIE9uRHJhdyhDREMqIHBEQyk7ICAvLyBvdmVycmlkZGVuIHRvIGRyYXcgdGhpcyB2aWV3DQorCXZpcnR1YWwgQk9PTCBQcmVDcmVhdGVXaW5kb3coQ1JFQVRFU1RSVUNUJiBjcyk7DQorCXZpcnR1YWwgdm9pZCBPbkluaXRpYWxVcGRhdGUoKTsNCisJdmlydHVhbCBCT09MIFByZVRyYW5zbGF0ZU1lc3NhZ2UoTVNHKiBwTXNnKTsNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIEJPT0wgT25QcmVwYXJlUHJpbnRpbmcoQ1ByaW50SW5mbyogcEluZm8pOw0KKwl2aXJ0dWFsIHZvaWQgT25CZWdpblByaW50aW5nKENEQyogcERDLCBDUHJpbnRJbmZvKiBwSW5mbyk7DQorCXZpcnR1YWwgdm9pZCBPbkVuZFByaW50aW5nKENEQyogcERDLCBDUHJpbnRJbmZvKiBwSW5mbyk7DQorCXZpcnR1YWwgdm9pZCBPbkFjdGl2YXRlVmlldyhCT09MIGJBY3RpdmF0ZSwgQ1ZpZXcqIHBBY3RpdmF0ZVZpZXcsIENWaWV3KiBwRGVhY3RpdmVWaWV3KTsNCisJLy99fUFGWF9WSVJUVUFMDQorDQorLy8gSW1wbGVtZW50YXRpb24NCitwdWJsaWM6DQorCUNFeHBvcnRQYWdlKiBtX3BFeHBvcnRQYWdlRGxnOyANCisJRlBERl9QQUdFIEdldFBhZ2UoKXsgcmV0dXJuIG1fcFBhZ2U7fQ0KKwl2b2lkIFN5bmNTY3JvbGwoKTsNCisJQ1JlY3QgU2VsZWN0U2VnbWVudChDUG9pbnQgcHRfbHQsIENQb2ludCBwdF9yYik7DQorCXZvaWQgR2V0UmVjdHMoaW50IG5TdGFydCwgaW50IG5FbmQpOw0KKwl2b2lkIENyZWF0ZUNhcmV0KENQb2ludCBwdCk7DQorCUJPT0wgR2V0Q2hhckluZGV4QnlQb2ludChDUG9pbnQgcHQsIGludCAmbkluZGV4KTsNCisJdm9pZCBMb2FkTXlDdXJzb3IoaW50IG5mbGFnID0gMCk7DQorCXZvaWQgRGVsZXRlQWxsUmVjdCgpOw0KKwl2b2lkIERyYXdBbGxSZWN0KENEQyAqcERDKTsNCisJdm9pZCBEcmF3UmV2ZXJzZShDREMgKnBEQywgQ1JlY3QgcmVjdCk7DQorCXZvaWQgRmluZE5leHQoaW50IG5EaXJlY3Rpb24pOw0KKwl2b2lkIEZpbmRUZXh0KENTdHJpbmcgc3RyRmluZCwgQk9PTCBiQ2FzZSwgQk9PTCBiV2hvbGV3b3JkLCAgaW50ICBEaXJlY3Rpb24pOw0KKwl2b2lkIFNjYWxQYWdlKGRvdWJsZSBkYlNjYWwpOw0KKwl2b2lkIEdvdG9QYWdlKGludCBpbmRleCk7DQorCUJPT0wgU2V0UERGRG9jdW1lbnQoRlBERl9ET0NVTUVOVCBwRG9jLCBpbnQgblBhZ2VOdW0pOw0KKwl2b2lkIERyYXdQYWdlKGludCBuUm90YXRlLCBDREMgKnBEQyk7DQorCXZvaWQgU2V0UGFnZU1ldHJpY3MoRlBERl9QQUdFIHBQYWdlKTsNCisNCisJdm9pZCBTZXRTY2FsRmFjdG9yKGRvdWJsZSBkYlNjYWwpOw0KKwl2b2lkIEdldE5ld1BhZ2VTaXplKGludCAmbnNpemVYLCBpbnQgJm5zaXplWSk7DQorCUJPT0wgTG9hZFBERlBhZ2UoRlBERl9ET0NVTUVOVCBkb2MsIGludCBuSW5kZXgsIENQb2ludCBwb3MgPSBDUG9pbnQoMCwwKSk7DQorDQorCUZQREZfRE9DVU1FTlQgR2V0UERGRG9jKCl7IHJldHVybiBtX3BEb2M7fQ0KKwlpbnQgR2V0VG90YWxQYWdlcygpeyByZXR1cm4gbV9uVG90YWxQYWdlO30NCisJQk9PTCAgRGV2aWNlVG9QYWdlKENQb2ludCBwdCwgZG91YmxlJiBwYWdlX3gsIGRvdWJsZSYgcGFnZV95KTsNCisJQk9PTCAgUGFnZVRvRGV2aWNlKGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3ksIENQb2ludCYgcHQpOw0KKwlpbnQgIEdldEN1cnJlbnRQYWdlSW5kZXgoKSB7IHJldHVybiBtX25QYWdlSW5kZXg7IH0NCisJc3RhdGljIEJPT0wgSHR0cERhdGFQdXQoQ1N0cmluZyBjc0RhdGEsIENTdHJpbmcgY3NBcHBOYW1lLCBDU3RyaW5nIGNzT2JqZWN0LCBDU3RyaW5nIGNzU2VydmVyLCANCisJCUNTdHJpbmcgY3NVc2VyTmFtZSwgQ1N0cmluZyBjc1Bhc3N3b3JkLCBJTlRFUk5FVF9QT1JUIG5Qb3J0LCBCT09MIElzSFRUUFMpOw0KKwlzdGF0aWMgQk9PTCBOZWVkQXV0aChDSHR0cEZpbGUgKnBIdHRwRmlsZSk7DQorCXN0YXRpYyBCT09MIEh0dHBEYXRhUG9zdChDU3RyaW5nIGNzRGF0YSwgQ1N0cmluZyBjc0FwcE5hbWUsIENTdHJpbmcgY3NPYmplY3QsIENTdHJpbmcgY3NTZXJ2ZXIsIENTdHJpbmcgY3NVc2VyTmFtZSwgDQorCQlDU3RyaW5nIGNzUGFzc3dvcmQsIElOVEVSTkVUX1BPUlQgblBvcnQgLCBCT09MIElzSFRUUFMsIENTdHJpbmcgY3NDb250ZW50VHlwZSwgQ1N0cmluZyBjc0FkZEhlYWRlciwgQ1N0cmluZyAmY3NSZXNwb25zZSk7DQorCXN0YXRpYyB2b2lkCUNyZWF0ZUxvY2FsUGF0aChDU3RyaW5nICZjc1BhdGgpOw0KKw0KKwl2aXJ0dWFsIH5DUmVhZGVyVkNWaWV3KCk7DQorI2lmZGVmIF9ERUJVRw0KKwl2aXJ0dWFsIHZvaWQgQXNzZXJ0VmFsaWQoKSBjb25zdDsNCisJdmlydHVhbCB2b2lkIER1bXAoQ0R1bXBDb250ZXh0JiBkYykgY29uc3Q7DQorI2VuZGlmDQorDQorcHJvdGVjdGVkOg0KK3B1YmxpYzoNCisJdm9pZAlQYWdlVG9EZXZpY2VJbXBsKEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsZG91YmxlIHBhZ2VfeSwgaW50KiBkZXZpY2VfeCwgaW50KiBkZXZpY2VfeSk7DQorCXZvaWQJRGV2aWNlVG9QYWdlSW1wbChGUERGX1BBR0UgcGFnZSxpbnQgZGV2aWNlX3gsIGludCBkZXZpY2VfeSwgZG91YmxlKiBwYWdlX3gsIGRvdWJsZSogcGFnZV95KTsNCisJdm9pZAlJbnZhbGlkYXRlSW1wbChGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSk7DQorCXZvaWQJT3V0cHV0U2VsZWN0ZWRSZWN0SW1wbChGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSk7DQorCXZvaWQJU2V0Q2FyZXRJbXBsKEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3ksIGludCBuV2lkdGgsIGludCBuSGVpZ2h0KTsNCisJdm9pZAlSZWxlYXNlSW1wbCgpOw0KKwlpbnQgICAgIFNldFRpbWVySW1wbChpbnQgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7DQorCXZvaWQJS2lsbFRpbWVySW1wbChpbnQgbklEKTsNCisJRlBERl9TWVNURU1USU1FIEdldExvY2FsVGltZUltcGwoKTsNCisJdm9pZCAgICBTZXRDdXJvckltcGwoaW50IG5DdXJzb3JUeXBlKTsJDQorCXZvaWQgICAgRXhlY3V0ZU5hbWVkQWN0aW9uSW1wbChGUERGX0JZVEVTVFJJTkcgbmFtZWRhY3Rpb24pOw0KKwl2b2lkICAgIE9uQ2hhbmdlSW1wbCgpOw0KKwlib29sICAgIElzU0hJRlRLZXlEb3duSW1wbCgpOw0KKwlib29sICAgIElzQ1RSTEtleURvd25JbXBsKCk7DQorCWJvb2wgICAgSXNBTFRLZXlEb3duSW1wbCgpOw0KKwlib29sICAgIElzSU5TRVJUS2V5RG93bkltcGwoKTsNCisJQk9PTAlTdWJtaXRGb3JtSW1wbCh2b2lkKiBwQnVmZmVyLCBpbnQgbkxlbmd0aCwgQ1N0cmluZyBzdHJVUkwpOw0KKwlGUERGX1BBR0UgR2V0UGFnZUltcGwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCxpbnQgblBhZ2VJbmRleCk7DQorCWludAkJR2V0Um90YXRpb25JbXBsKEZQREZfUEFHRSBwYWdlKTsNCisJQ1N0cmluZyBHZXRGaWxlUGF0aCgpOw0KKwlGUERGX1BBR0UJR2V0Q3VycmVudFBhZ2VJbXBsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOw0KKy8vIAlmcmllbmQgRlBERl9ET0NVTUVOVCBfRlBERl9HZXRDdXJEb2N1bWVudChzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7DQorLy8gCWZyaWVuZCBGUERGX1BBR0UgX0ZQREZfR2V0Q3VyUGFnZShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7DQorcHJpdmF0ZToNCisvLwlGUERGX0FQUAltX0FwcDsNCisvLwlGUERGX0ZPUk1GSUxMSU5GTyBtX2Zvcm1GaWxlZEluZm87DQorcHJpdmF0ZToNCisvLwlGUERGX0FQUCBHZXRGUERGQXBwKCkge3JldHVybiBtX0FwcDt9DQorCXVuc2lnbmVkIGludCBDb21wb3NlRmxhZygpOw0KK3ByaXZhdGU6DQorCUNNYXA8aW50LCBpbnQsIEZQREZfUEFHRSwgRlBERl9QQUdFPiBtX3BhZ2VNYXA7DQorCUZQREZfRk9STUhBTkRMRQltX3BBcHA7DQorCUZQREZfQklUTUFQCQkJbV9ibXA7DQorCS8vZm9yIHJlbmRlciBwZGYNCisJRlBERl9ET0NVTUVOVAkJbV9wRG9jOw0KKwlGUERGX1BBR0UJCQltX3BQYWdlOw0KKwlpbnQJCQkJCW1fblRvdGFsUGFnZTsNCisJaW50CQkJCQltX25Sb3RhdGVGbGFnOw0KKwlkb3VibGUJCQkJbV9kYlNjYWxlRmFjdG9yOw0KKwlpbnQJCQkJCW1fblBhZ2VJbmRleDsNCisJZG91YmxlCQkJCW1fZGJQYWdlV2lkdGg7DQorCWRvdWJsZQkJCQltX2RiUGFnZUhlaWdodDsNCisJaW50CQkJCQltX25TdGFydFg7DQorCWludAkJCQkJbV9uU3RhcnRZOw0KKwlpbnQJCQkJCW1fbkFjdHVhbFNpemVYOw0KKwlpbnQJCQkJCW1fbkFjdHVhbFNpemVZOw0KKw0KKwkvL2ZvciBzZWFyY2ggdGV4dA0KKwlGUERGX1RFWFRQQUdFCQltX3BUZXh0UGFnZTsNCisJRmluZEluZm8JCQltX0ZpbmRJbmZvOw0KKwlGUERGX1NDSEhBTkRMRQkJbV9wU0NISGFuZGxlOw0KKwlQREZSZWN0ICoJCQltX3J0RmluZDsNCisJaW50CQkJCQltX25SZWN0TnVtOw0KKwkNCisJLy9mb3Igc2VsZWN0IHRleHQNCisJQk9PTCBtX2JTZWxlY3Q7DQorCUJPT0wgbV9iSGFuZDsNCisJQk9PTCBtX2JTbmFwOw0KKwlCT09MIG1fYkhhc0NoYXI7IC8vd2hldGhlciBjYW4gZ2V0IGEgY2hhciB3aGVuIGxlZnQgYnV0dG9uIGJlIGNsaWNrZWQNCisJQ1BvaW50IG1fcHRMQkRvd247DQorCUNQb2ludCBtX3B0TEJVcDsNCisJQ1BvaW50IG1fcHRPbGQ7DQorDQorCWludCBtX25TdGFydEluZGV4OyAvL2NoYXIgaW5kZXgNCisJaW50IG1fbk9sZEluZGV4Ow0KKwlpbnQgbV9uRW5kSW5kZXg7DQorCUNBcnJheSA8UERGUmVjdCwgUERGUmVjdD4gbV9ydEFycmF5Ow0KKwlDUmVjdCBtX3J0T2xkOw0KKwkNCisJLy8NCisJaW50IG1fblBvc0g7DQorCWludCBtX25Qb3NWOw0KKw0KKwkvLyBmb3IgbGlua3MNCisJRlBERl9QQUdFTElOSyBtX3BMaW5rOw0KKw0KKwlCT09MIG1fYkJvb2ttYXJrOw0KKw0KK3B1YmxpYzoNCisJd2NoYXJfdCogbV9wd3NSZXNwb25zZTsNCisNCitwcml2YXRlOg0KKw0KKwlDQXJyYXk8Q1JlY3QsIENSZWN0Jj4gbV9TZWxlY3RBcnJheTsNCisJc3RhdGljIENNYXA8aW50LCBpbnQsVGltZXJDYWxsYmFjaywgVGltZXJDYWxsYmFjaz4gbV9tYXBUaW1lckZ1bnM7DQorcHVibGljOg0KKwlzdGF0aWMgdm9pZCBDQUxMQkFDSyBUaW1lclByb2MoSFdORCBod25kLCBVSU5UIHVNc2csIFVJTlQgaWRFdmVudCwgRFdPUkQgZHdUaW1lICkNCisJew0KKwkJVGltZXJDYWxsYmFjayBjYWxsYmFjayA9ICBOVUxMOw0KKwkJbV9tYXBUaW1lckZ1bnMuTG9va3VwKGlkRXZlbnQsIGNhbGxiYWNrKTsNCisJCWlmKGNhbGxiYWNrKQ0KKwkJCSgqY2FsbGJhY2spKGlkRXZlbnQpOw0KKwl9DQorLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KK3Byb3RlY3RlZDoNCisJLy97e0FGWF9NU0coQ1JlYWRlclZDVmlldykNCisJYWZ4X21zZyB2b2lkIE9uRG9jRmlyc3RwYWdlKCk7DQorCWFmeF9tc2cgdm9pZCBPbkRvY0dvdG9wYWdlKCk7DQorCWFmeF9tc2cgdm9pZCBPbkRvY0xhc3RwYWdlKCk7DQorCWFmeF9tc2cgdm9pZCBPbkRvY05leHRwYWdlKCk7DQorCWFmeF9tc2cgdm9pZCBPbkRvY1ByZXBhZ2UoKTsNCisJYWZ4X21zZyB2b2lkIE9uQ2xvY2t3aXNlKCk7DQorCWFmeF9tc2cgdm9pZCBPbkNvdW50ZXJjbG9ja3dpc2UoKTsNCisJYWZ4X21zZyB2b2lkIE9uVmlld0FjdHVhbFNpemUoKTsNCisJYWZ4X21zZyB2b2lkIE9uVmlld0ZpdFBhZ2UoKTsNCisJYWZ4X21zZyB2b2lkIE9uVmlld0ZpdFdpZHRoKCk7DQorCWFmeF9tc2cgdm9pZCBPblZpZXdab29tSW4oKTsNCisJYWZ4X21zZyB2b2lkIE9uVmlld1pvb21PdXQoKTsNCisJYWZ4X21zZyB2b2lkIE9uVmlld1pvb21UbygpOw0KKwlhZnhfbXNnIHZvaWQgT25FZGl0RmluZCgpOw0KKwlhZnhfbXNnIHZvaWQgT25GaWxlUHJpbnQoKTsNCisJYWZ4X21zZyB2b2lkIE9uTEJ1dHRvbkRvd24oVUlOVCBuRmxhZ3MsIENQb2ludCBwb2ludCk7DQorCWFmeF9tc2cgdm9pZCBPbkxCdXR0b25VcChVSU5UIG5GbGFncywgQ1BvaW50IHBvaW50KTsNCisJYWZ4X21zZyB2b2lkIE9uTW91c2VNb3ZlKFVJTlQgbkZsYWdzLCBDUG9pbnQgcG9pbnQpOw0KKwlhZnhfbXNnIHZvaWQgT25LZXlEb3duKFVJTlQgbkNoYXIsIFVJTlQgblJlcENudCwgVUlOVCBuRmxhZ3MpOw0KKwlhZnhfbXNnIHZvaWQgT25Ub29sU25hcHNob3QoKTsNCisJYWZ4X21zZyB2b2lkIE9uVG9vbFNlbGVjdCgpOw0KKwlhZnhfbXNnIHZvaWQgT25Ub29sSGFuZCgpOw0KKwlhZnhfbXNnIHZvaWQgT25Ub29sUGRmMnR4dCgpOw0KKwlhZnhfbXNnIHZvaWQgT25TaXplKFVJTlQgblR5cGUsIGludCBjeCwgaW50IGN5KTsNCisJYWZ4X21zZyB2b2lkIE9uSFNjcm9sbChVSU5UIG5TQkNvZGUsIFVJTlQgblBvcywgQ1Njcm9sbEJhciogcFNjcm9sbEJhcik7DQorCWFmeF9tc2cgdm9pZCBPblZTY3JvbGwoVUlOVCBuU0JDb2RlLCBVSU5UIG5Qb3MsIENTY3JvbGxCYXIqIHBTY3JvbGxCYXIpOw0KKwlhZnhfbXNnIHZvaWQgT25Ub29sRXh0cmFjdGxpbmtzKCk7DQorCWFmeF9tc2cgdm9pZCBPbkRlc3Ryb3koKTsNCisJYWZ4X21zZyB2b2lkIE9uVXBkYXRlRG9jRmlyc3RwYWdlKENDbWRVSSogcENtZFVJKTsNCisJYWZ4X21zZyB2b2lkIE9uVXBkYXRlRG9jTGFzdHBhZ2UoQ0NtZFVJKiBwQ21kVUkpOw0KKwlhZnhfbXNnIHZvaWQgT25VcGRhdGVEb2NOZXh0cGFnZShDQ21kVUkqIHBDbWRVSSk7DQorCWFmeF9tc2cgdm9pZCBPblVwZGF0ZURvY1ByZXBhZ2UoQ0NtZFVJKiBwQ21kVUkpOw0KKwlhZnhfbXNnIHZvaWQgT25VcGRhdGVUb29sSGFuZChDQ21kVUkqIHBDbWRVSSk7DQorCWFmeF9tc2cgdm9pZCBPblVwZGF0ZVRvb2xTbmFwc2hvdChDQ21kVUkqIHBDbWRVSSk7DQorCWFmeF9tc2cgdm9pZCBPblVwZGF0ZVRvb2xTZWxlY3QoQ0NtZFVJKiBwQ21kVUkpOw0KKwlhZnhfbXNnIHZvaWQgT25WaWV3Qm9va21hcmsoKTsNCisJYWZ4X21zZyBCT09MIE9uTW91c2VXaGVlbChVSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBDUG9pbnQgcHQpOw0KKwlhZnhfbXNnIHZvaWQgT25Db250ZXh0TWVudShDV25kKiBwV25kLCBDUG9pbnQgcG9pbnQpOw0KKwlhZnhfbXNnIHZvaWQgT25FZGl0Q29weSgpOw0KKwlhZnhfbXNnIHZvaWQgT25SZW5kZXJiaXRtYXAoKTsNCisJYWZ4X21zZyB2b2lkIE9uRXhwb3J0UGRmVG9CaXRtYXAoKTsNCisJYWZ4X21zZyB2b2lkIE9uQ2hhcihVSU5UIG5DaGFyLCBVSU5UIG5SZXBDbnQsIFVJTlQgbkZsYWdzKTsNCisJYWZ4X21zZyB2b2lkIE9uS2V5VXAoVUlOVCBuQ2hhciwgVUlOVCBuUmVwQ250LCBVSU5UIG5GbGFncyk7DQorCWFmeF9tc2cgdm9pZCBPbkZpbGVTYXZlKCk7DQorCWFmeF9tc2cgdm9pZCBPblRlc3RKUygpOw0KKwlhZnhfbXNnIHZvaWQgT25QcmludE1ldGFsZmlsZSgpOw0KKwkvL319QUZYX01TRw0KKwlERUNMQVJFX01FU1NBR0VfTUFQKCkNCit9Ow0KKw0KKyNpZm5kZWYgX0RFQlVHICAvLyBkZWJ1ZyB2ZXJzaW9uIGluIFJlYWRlclZDVmlldy5jcHANCitpbmxpbmUgQ1JlYWRlclZDRG9jKiBDUmVhZGVyVkNWaWV3OjpHZXREb2N1bWVudCgpDQorICAgeyByZXR1cm4gKENSZWFkZXJWQ0RvYyopbV9wRG9jdW1lbnQ7IH0NCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8ve3tBRlhfSU5TRVJUX0xPQ0FUSU9OfX0NCisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB3aWxsIGluc2VydCBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZXZpb3VzIGxpbmUuDQorDQorI2VuZGlmIC8vICFkZWZpbmVkKEFGWF9SRUFERVJWQ1ZJRVdfSF9fOUFGQzQ0OUNfMjZEMF80OTA2X0FCQUVfMTI5ODg3MTg2MkUyX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1N0ZEFmeC5jcHAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvU3RkQWZ4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU4Y2MwCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1N0ZEFmeC5jcHAKQEAgLTAsMCArMSw4IEBACisvLyBzdGRhZnguY3BwIDogc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBqdXN0IHRoZSBzdGFuZGFyZCBpbmNsdWRlcw0KKy8vCVJlYWRlclZDLnBjaCB3aWxsIGJlIHRoZSBwcmUtY29tcGlsZWQgaGVhZGVyDQorLy8Jc3RkYWZ4Lm9iaiB3aWxsIGNvbnRhaW4gdGhlIHByZS1jb21waWxlZCB0eXBlIGluZm9ybWF0aW9uDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9TdGRBZnguaCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYxNjA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1N0ZEFmeC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vIHN0ZGFmeC5oIDogaW5jbHVkZSBmaWxlIGZvciBzdGFuZGFyZCBzeXN0ZW0gaW5jbHVkZSBmaWxlcywNCisvLyAgb3IgcHJvamVjdCBzcGVjaWZpYyBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIHVzZWQgZnJlcXVlbnRseSwgYnV0DQorLy8gICAgICBhcmUgY2hhbmdlZCBpbmZyZXF1ZW50bHkNCisvLw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfU1REQUZYX0hfXzJCQzRDMURFXzQxNjVfNDk2N19BQzNFX0FFMkVBMkE0RDJGRF9fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX1NUREFGWF9IX18yQkM0QzFERV80MTY1XzQ5NjdfQUMzRV9BRTJFQTJBNEQyRkRfX0lOQ0xVREVEXw0KKw0KKyNpZiBfTVNDX1ZFUiA+IDEwMDANCisjcHJhZ21hIG9uY2UNCisjZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwDQorDQorI2RlZmluZSBWQ19FWFRSQUxFQU4JCS8vIEV4Y2x1ZGUgcmFyZWx5LXVzZWQgc3R1ZmYgZnJvbSBXaW5kb3dzIGhlYWRlcnMNCisNCisjaW5jbHVkZSA8YWZ4d2luLmg+ICAgICAgICAgLy8gTUZDIGNvcmUgYW5kIHN0YW5kYXJkIGNvbXBvbmVudHMNCisjaW5jbHVkZSA8YWZ4ZXh0Lmg+ICAgICAgICAgLy8gTUZDIGV4dGVuc2lvbnMNCisjaW5jbHVkZSA8YWZ4ZGlzcC5oPiAgICAgICAgLy8gTUZDIEF1dG9tYXRpb24gY2xhc3Nlcw0KKyNpbmNsdWRlIDxhZnhkdGN0bC5oPgkJLy8gTUZDIHN1cHBvcnQgZm9yIEludGVybmV0IEV4cGxvcmVyIDQgQ29tbW9uIENvbnRyb2xzDQorI2luY2x1ZGUgPGFmeGluZXQuaD4NCisjaWZuZGVmIF9BRlhfTk9fQUZYQ01OX1NVUFBPUlQNCisjaW5jbHVkZSA8YWZ4Y21uLmg+CQkJLy8gTUZDIHN1cHBvcnQgZm9yIFdpbmRvd3MgQ29tbW9uIENvbnRyb2xzDQorI2VuZGlmIC8vIF9BRlhfTk9fQUZYQ01OX1NVUFBPUlQNCisNCisNCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmdmlldy5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MuaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmdGV4dC5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZmb3JtZmlsbC5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZfc3lzZm9udGluZm8uaCINCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmc2F2ZS5oIg0KKyNpbmNsdWRlIDxhZnhjdmlldy5oPg0KKyNpbmNsdWRlICJhZnh0ZW1wbC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZlZGl0LmgiDQorDQorI2lmZGVmIF9ERUJVRw0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vbGliL2RiZ193MzJfdmMxMC9mb3JtZmlsbGVyW2RiZyx3MzIsdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uL2xpYi9kYmdfdzMyX3ZjMTAvZnBkZnNka1tkYmcsdzMyLHZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi9saWIvZGJnX3czMl92YzEwL2Z4ZWRpdFtkYmcsdzMyLHZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi9saWIvZGJnX3czMl92YzEwL2phdmFzY3JpcHRbZGJnLHczMix2YzEwXS5saWIiKQ0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vbGliL2RiZ193MzJfdmMxMC9qc2FwaVtkYmcsdzMyLHZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi9saWIvZGJnX3czMl92YzEwL3BkZndpbmRvd1tkYmcsdzMyLHZjMTBdLmxpYiIpDQorLy8JI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uL2xpYi9kYmdfdzMyX3ZjMTAvZm94aXRvcGVucGRmLmxpYiIpDQorDQorLy8gCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi8uLi8uLi8uLi92OC9idWlsZC9EZWJ1Zy9saWIvaWN1aTE4bi5saWIiKQ0KKy8vIAkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vLi4vLi4vLi4vdjgvYnVpbGQvRGVidWcvbGliL2ljdXVjLmxpYiIpDQorLy8gCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi8uLi8uLi8uLi92OC9idWlsZC9EZWJ1Zy9saWIvdjhfYmFzZS5pYTMyLmxpYiIpDQorLy8gCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi8uLi8uLi8uLi92OC9idWlsZC9EZWJ1Zy9saWIvdjhfbm9zbmFwc2hvdC5pYTMyLmxpYiIpDQorLy8gCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi8uLi8uLi8uLi92OC9idWlsZC9EZWJ1Zy9saWIvdjhfc25hcHNob3QubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL3Y4L2J1aWxkL0RlYnVnL2xpYi9pY3VpMThuLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi92OC9idWlsZC9EZWJ1Zy9saWIvaWN1dWMubGliIikNCisgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL3Y4L2J1aWxkL0RlYnVnL2xpYi92OF9iYXNlLmlhMzIubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL3Y4L2J1aWxkL0RlYnVnL2xpYi92OF9ub3NuYXBzaG90LmlhMzIubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL3Y4L2J1aWxkL0RlYnVnL2xpYi92OF9zbmFwc2hvdC5saWIiKQ0KKw0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZnhjb3JlL2xpYi9kYmcveDg2X3ZjMTAvZnhjcnRbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZnhjb3JlL2xpYi9kYmcveDg2X3ZjMTAvZnhnZVtkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9meGNvcmUvbGliL2RiZy94ODZfdmMxMC9mcGRmZG9jW2RiZ194ODZfdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z4Y29yZS9saWIvZGJnL3g4Nl92YzEwL2ZwZGZhcGlbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZnhjb3JlL2xpYi9kYmcveDg2X3ZjMTAvZnhjb2RlY1tkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9meGNvcmUvbGliL2RiZy94ODZfdmMxMC9mcGRmdGV4dFtkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9meGNvcmUvbGliL2RiZy94ODZfdmMxMC9mZHJtW2RiZ194ODZfdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z4Y29yZS9saWIvZGJnL3g4Nl92YzEwL2Z4bWF0aFtkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9meGNvcmUvbGliL2RiZy94ODZfdmMxMC9meGJhcmNvZGVbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZnhjb3JlL2xpYi9kYmcveDg2X3ZjMTAvZnhoYWxbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKwkNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z4anNlL2xpYi9kYmcveDg2X3ZjMTAvZnhqc2VfYmFyZVtkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCQ0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZndsL2xpYi9kYmcveDg2X3ZjMTAvZndsYmFzZXdpZGdldFtkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9md2wvbGliL2RiZy94ODZfdmMxMC9md2xjb3JlW2RiZ194ODZfdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z3bC9saWIvZGJnL3g4Nl92YzEwL2Z3bHRoZW1lW2RiZ194ODZfdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z3bC9saWIvZGJnL3g4Nl92YzEwL2Z3bGxpZ2h0d2lkZ2V0W2RiZ194ODZfdmMxMF0ubGliIikNCisNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z4Z3JhcGhpY3MvbGliL2RiZy94ODZfdmMxMC9meGdyYXBoaWNzW2RiZ194ODZfdmMxMF0ubGliIikNCisJDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9mZ2FzL2xpYi9kYmcveDg2X3ZjMTAvZmdhc1tkYmdfeDg2X3ZjMTBdLmxpYiIpDQorDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9mZWUvbGliL2RiZy94ODZfdmMxMC9mZWVzW2RiZ194ODZfdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2ZlZS9saWIvZGJnL3g4Nl92YzEwL2Z4X3dvcmRicmVha3NbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKw0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZmRwL2xpYi9kYmcveDg2X3ZjMTAvZmRlW2RiZ194ODZfdmMxMF0ubGliIikNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2ZkcC9saWIvZGJnL3g4Nl92YzEwL2ZkZXR0b1tkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9mZHAvbGliL2RiZy94ODZfdmMxMC9mZGV4bWxbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKwkjcHJhZ21hIGNvbW1lbnQobGliLCAiLi4vLi4vLi4vZnhsaWIvZmRwL2xpYi9kYmcveDg2X3ZjMTAvZmRlY3NzW2RiZ194ODZfdmMxMF0ubGliIikNCisNCisJI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uLy4uL2Z4bGliL2Z4ZmEvbGliL2RiZy94ODZfdmMxMC9meGZhX2FwcFtkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9meGZhL2xpYi9kYmcveDg2X3ZjMTAvZnhmYV9mbTJqc1tkYmdfeDg2X3ZjMTBdLmxpYiIpDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi8uLi9meGxpYi9meGZhL2xpYi9kYmcveDg2X3ZjMTAvZnhmYV9wYXJzZXJbZGJnX3g4Nl92YzEwXS5saWIiKQ0KKw0KKyNlbHNlDQorCSNwcmFnbWEgY29tbWVudChsaWIsICIuLi8uLi9saWIvcmVsX3czMl92YzYvZnBkZnNkay5saWIiKQ0KKyNlbmRpZg0KKy8vI3ByYWdtYSBjb21tZW50KGxpYiwgIi4uLy4uL2xpYi9mcGRmc2RrLmRsbCIpDQorDQorLy8jaW5jbHVkZSAiZnBkZnNka19leHRfd2guaCINCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfU1REQUZYX0hfXzJCQzRDMURFXzQxNjVfNDk2N19BQzNFX0FFMkVBMkE0RDJGRF9fSU5DTFVERURfKQ0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9UZXN0SnNEbGcuY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1Rlc3RKc0RsZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmYjNhMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9UZXN0SnNEbGcuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8vIFRlc3RKc0RsZy5jcHAgOiBpbXBsZW1lbnRhdGlvbiBmaWxlDQorLy8NCisNCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorI2luY2x1ZGUgInJlYWRlcnZjLmgiDQorI2luY2x1ZGUgIlRlc3RKc0RsZy5oIg0KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZmb3JtZmlsbC5oIg0KKw0KKyNpZmRlZiBfREVCVUcNCisjZGVmaW5lIG5ldyBERUJVR19ORVcNCisjdW5kZWYgVEhJU19GSUxFDQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENUZXN0SnNEbGcgZGlhbG9nDQorDQorDQorQ1Rlc3RKc0RsZzo6Q1Rlc3RKc0RsZyhDV25kKiBwUGFyZW50IC8qPU5VTEwqLykNCisJOiBDRGlhbG9nKENUZXN0SnNEbGc6OklERCwgcFBhcmVudCkNCit7DQorCS8ve3tBRlhfREFUQV9JTklUKENUZXN0SnNEbGcpDQorCW1fanMgPSBfVCgiIik7DQorCS8vfX1BRlhfREFUQV9JTklUDQorfQ0KKw0KKw0KK3ZvaWQgQ1Rlc3RKc0RsZzo6RG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKQ0KK3sNCisJQ0RpYWxvZzo6RG9EYXRhRXhjaGFuZ2UocERYKTsNCisJLy97e0FGWF9EQVRBX01BUChDVGVzdEpzRGxnKQ0KKwlERFhfVGV4dChwRFgsIElEQ19FRElUMSwgbV9qcyk7DQorCS8vfX1BRlhfREFUQV9NQVANCit9DQorDQorDQorQkVHSU5fTUVTU0FHRV9NQVAoQ1Rlc3RKc0RsZywgQ0RpYWxvZykNCisJLy97e0FGWF9NU0dfTUFQKENUZXN0SnNEbGcpDQorCU9OX0JOX0NMSUNLRUQoSURDX0JVVFRPTjEsIE9uQnV0dG9uMSkNCisJLy99fUFGWF9NU0dfTUFQDQorRU5EX01FU1NBR0VfTUFQKCkNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENUZXN0SnNEbGcgbWVzc2FnZSBoYW5kbGVycw0KKw0KK3ZvaWQgQ1Rlc3RKc0RsZzo6T25CdXR0b24xKCkgDQorew0KKwkvLyBUT0RPOiBBZGQgeW91ciBjb250cm9sIG5vdGlmaWNhdGlvbiBoYW5kbGVyIGNvZGUgaGVyZQ0KKwlVcGRhdGVEYXRhKFRSVUUpOw0KKwlMUENUU1RSIGxwU3RyID0gbV9qcy5HZXRCdWZmZXIobV9qcy5HZXRMZW5ndGgoKSk7DQorCWludCBuTGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGxwU3RyLCBtX2pzLkdldExlbmd0aCgpLCBOVUxMLCAwKTsNCisJd2NoYXJfdCogcGJ1ZiA9IG5ldyB3Y2hhcl90W25MZW4rMV07DQorCU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBscFN0ciwgbV9qcy5HZXRMZW5ndGgoKSwgcGJ1Ziwgbkxlbik7DQorCXBidWZbbkxlbl0gPSAwOw0KKwltX2pzLlJlbGVhc2VCdWZmZXIoKTsNCisvLwlSdW5KUyhtX2hhbmRsZSxwYnVmKTsNCisJZGVsZXRlW10gcGJ1ZjsNCit9DQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1Rlc3RKc0RsZy5oIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1Rlc3RKc0RsZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDI5MzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvVGVzdEpzRGxnLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmICFkZWZpbmVkKEFGWF9URVNUSlNETEdfSF9fMDg0ODk3RjBfQTAzQV80RDU1X0JEQTJfOThENDBGQjk4QTRGX19JTkNMVURFRF8pDQorI2RlZmluZSBBRlhfVEVTVEpTRExHX0hfXzA4NDg5N0YwX0EwM0FfNEQ1NV9CREEyXzk4RDQwRkI5OEE0Rl9fSU5DTFVERURfDQorDQorI2lmIF9NU0NfVkVSID4gMTAwMA0KKyNwcmFnbWEgb25jZQ0KKyNlbmRpZiAvLyBfTVNDX1ZFUiA+IDEwMDANCisvLyBUZXN0SnNEbGcuaCA6IGhlYWRlciBmaWxlDQorLy8NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENUZXN0SnNEbGcgZGlhbG9nDQorDQorY2xhc3MgQ1Rlc3RKc0RsZyA6IHB1YmxpYyBDRGlhbG9nDQorew0KKy8vIENvbnN0cnVjdGlvbg0KK3B1YmxpYzoNCisJQ1Rlc3RKc0RsZyhDV25kKiBwUGFyZW50ID0gTlVMTCk7ICAgLy8gc3RhbmRhcmQgY29uc3RydWN0b3INCisJdm9pZCBpbml0KHZvaWQqIGhhbmRsZSkge21faGFuZGxlID0gaGFuZGxlO30NCisvLyBEaWFsb2cgRGF0YQ0KKwkvL3t7QUZYX0RBVEEoQ1Rlc3RKc0RsZykNCisJZW51bSB7IElERCA9IElERF9URVNUX0pTIH07DQorCUNTdHJpbmcJbV9qczsNCisJLy99fUFGWF9EQVRBDQorDQorDQorLy8gT3ZlcnJpZGVzDQorCS8vIENsYXNzV2l6YXJkIGdlbmVyYXRlZCB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcw0KKwkvL3t7QUZYX1ZJUlRVQUwoQ1Rlc3RKc0RsZykNCisJcHJvdGVjdGVkOg0KKwl2aXJ0dWFsIHZvaWQgRG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKTsgICAgLy8gRERYL0REViBzdXBwb3J0DQorCS8vfX1BRlhfVklSVFVBTA0KKw0KKy8vIEltcGxlbWVudGF0aW9uDQorcHJvdGVjdGVkOg0KKwl2b2lkICogbV9oYW5kbGU7DQorCS8vIEdlbmVyYXRlZCBtZXNzYWdlIG1hcCBmdW5jdGlvbnMNCisJLy97e0FGWF9NU0coQ1Rlc3RKc0RsZykNCisJYWZ4X21zZyB2b2lkIE9uQnV0dG9uMSgpOw0KKwkvL319QUZYX01TRw0KKwlERUNMQVJFX01FU1NBR0VfTUFQKCkNCit9Ow0KKw0KKy8ve3tBRlhfSU5TRVJUX0xPQ0FUSU9OfX0NCisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB3aWxsIGluc2VydCBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZXZpb3VzIGxpbmUuDQorDQorI2VuZGlmIC8vICFkZWZpbmVkKEFGWF9URVNUSlNETEdfSF9fMDg0ODk3RjBfQTAzQV80RDU1X0JEQTJfOThENDBGQjk4QTRGX19JTkNMVURFRF8pDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1pvb21EbGcuY3BwIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1pvb21EbGcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTE5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvWm9vbURsZy5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8vIFpvb21EbGcuY3BwIDogaW1wbGVtZW50YXRpb24gZmlsZQ0KKy8vDQorDQorI2luY2x1ZGUgInN0ZGFmeC5oIg0KKyNpbmNsdWRlICJSZWFkZXJWQy5oIg0KKyNpbmNsdWRlICJab29tRGxnLmgiDQorDQorI2luY2x1ZGUgIk1haW5Gcm0uaCINCisjaW5jbHVkZSAiQ2hpbGRGcm0uaCINCisjaW5jbHVkZSAiUmVhZGVyVkNWaWV3LmgiDQorDQorI2lmZGVmIF9ERUJVRw0KKyNkZWZpbmUgbmV3IERFQlVHX05FVw0KKyN1bmRlZiBUSElTX0ZJTEUNCitzdGF0aWMgY2hhciBUSElTX0ZJTEVbXSA9IF9fRklMRV9fOw0KKyNlbmRpZg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ1pvb21EbGcgZGlhbG9nDQorDQorDQorQ1pvb21EbGc6OkNab29tRGxnKENXbmQqIHBQYXJlbnQgLyo9TlVMTCovKQ0KKwk6IENEaWFsb2coQ1pvb21EbGc6OklERCwgcFBhcmVudCkNCit7DQorCS8ve3tBRlhfREFUQV9JTklUKENab29tRGxnKQ0KKwkJLy8gTk9URTogdGhlIENsYXNzV2l6YXJkIHdpbGwgYWRkIG1lbWJlciBpbml0aWFsaXphdGlvbiBoZXJlDQorCS8vfX1BRlhfREFUQV9JTklUDQorfQ0KKw0KKw0KK3ZvaWQgQ1pvb21EbGc6OkRvRGF0YUV4Y2hhbmdlKENEYXRhRXhjaGFuZ2UqIHBEWCkNCit7DQorCUNEaWFsb2c6OkRvRGF0YUV4Y2hhbmdlKHBEWCk7DQorCS8ve3tBRlhfREFUQV9NQVAoQ1pvb21EbGcpDQorCQkvLyBOT1RFOiB0aGUgQ2xhc3NXaXphcmQgd2lsbCBhZGQgRERYIGFuZCBERFYgY2FsbHMgaGVyZQ0KKwkvL319QUZYX0RBVEFfTUFQDQorfQ0KKw0KKw0KK0JFR0lOX01FU1NBR0VfTUFQKENab29tRGxnLCBDRGlhbG9nKQ0KKwkvL3t7QUZYX01TR19NQVAoQ1pvb21EbGcpDQorCS8vfX1BRlhfTVNHX01BUA0KK0VORF9NRVNTQUdFX01BUCgpDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDWm9vbURsZyBtZXNzYWdlIGhhbmRsZXJzDQorDQordm9pZCBDWm9vbURsZzo6T25DYW5jZWwoKSANCit7DQorCS8vIFRPRE86IEFkZCBleHRyYSBjbGVhbnVwIGhlcmUNCisJDQorCUNEaWFsb2c6Ok9uQ2FuY2VsKCk7DQorfQ0KKw0KK3ZvaWQgQ1pvb21EbGc6Ok9uT0soKSANCit7DQorCS8vIFRPRE86IEFkZCBleHRyYSB2YWxpZGF0aW9uIGhlcmUNCisJQ0NvbWJvQm94ICpwQ21iID0gKENDb21ib0JveCAqKUdldERsZ0l0ZW0oSURDX0NPTUJPMSk7DQorCWludCBpID0gcENtYi0+R2V0Q3VyU2VsKCk7DQorCWludCBuU2NhbCA9IHBDbWItPkdldEl0ZW1EYXRhKGkpOw0KKwlkb3VibGUgZGJTY2FsID0gblNjYWwgLyAxMDAuMGY7DQorCW1fcFZpZXctPlNjYWxQYWdlKGRiU2NhbCk7DQorCUNEaWFsb2c6Ok9uT0soKTsNCit9DQorDQorQk9PTCBDWm9vbURsZzo6T25Jbml0RGlhbG9nKCkgDQorew0KKwlDRGlhbG9nOjpPbkluaXREaWFsb2coKTsNCisJDQorCS8vIFRPRE86IEFkZCBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlDQorCW1fcFZpZXcgPSAoQ1JlYWRlclZDVmlldyAqKSgoKENDaGlsZEZyYW1lICopKChDTWFpbkZyYW1lICopQWZ4R2V0TWFpblduZCgpKS0+R2V0QWN0aXZlRnJhbWUoKSktPkdldEFjdGl2ZVZpZXcoKSk7DQorCUNDb21ib0JveCAqcENtYiA9IChDQ29tYm9Cb3ggKilHZXREbGdJdGVtKElEQ19DT01CTzEpOw0KKwlwQ21iLT5BZGRTdHJpbmcoIi0tLS0tMjUlLS0tLS0iKTsNCisJcENtYi0+U2V0SXRlbURhdGEoMCwgMjUpOw0KKwlwQ21iLT5BZGRTdHJpbmcoIi0tLS0tNTAlLS0tLS0iKTsNCisJcENtYi0+U2V0SXRlbURhdGEoMSwgNTApOw0KKwlwQ21iLT5BZGRTdHJpbmcoIi0tLS0tNzUlLS0tLS0iKTsNCisJcENtYi0+U2V0SXRlbURhdGEoMywgNzUpOw0KKwlwQ21iLT5BZGRTdHJpbmcoIi0tLS0tMTAwJS0tLS0iKTsNCisJcENtYi0+U2V0SXRlbURhdGEoMywgMTAwKTsNCisJcENtYi0+QWRkU3RyaW5nKCItLS0tLTEyNSUtLS0tIik7DQorCXBDbWItPlNldEl0ZW1EYXRhKDQsIDEyNSk7DQorCXBDbWItPkFkZFN0cmluZygiLS0tLS0yMDAlLS0tLSIpOw0KKwlwQ21iLT5TZXRJdGVtRGF0YSg1LCAyMDApOw0KKwlwQ21iLT5BZGRTdHJpbmcoIi0tLS0tMzAwJS0tLS0iKTsNCisJcENtYi0+U2V0SXRlbURhdGEoNiwgMzAwKTsNCisJcENtYi0+QWRkU3RyaW5nKCItLS0tLTQwMCUtLS0tIik7DQorCXBDbWItPlNldEl0ZW1EYXRhKDcsIDQwMCk7DQorCXBDbWItPkFkZFN0cmluZygiLS0tLS02MDAlLS0tLSIpOw0KKwlwQ21iLT5TZXRJdGVtRGF0YSg4LCA2MDApOw0KKwlwQ21iLT5BZGRTdHJpbmcoIi0tLS0tODAwJS0tLS0iKTsNCisJcENtYi0+U2V0SXRlbURhdGEoOSwgODAwKTsNCisJcENtYi0+QWRkU3RyaW5nKCItLS0tLTEyMDAlLS0tLSIpOw0KKwlwQ21iLT5TZXRJdGVtRGF0YSgxMCwgMTIwMCk7DQorCXBDbWItPkFkZFN0cmluZygiLS0tLS0xNjAwJS0tLSIpOw0KKwlwQ21iLT5TZXRJdGVtRGF0YSgxMSwgMTYwKTsNCisJcENtYi0+QWRkU3RyaW5nKCItLS0tLTMyMDAlLS0tIik7DQorCXBDbWItPlNldEl0ZW1EYXRhKDEyLCAzMjAwKTsNCisJcENtYi0+QWRkU3RyaW5nKCItLS0tLTY0MDAlLS0tLSIpOw0KKwlwQ21iLT5TZXRJdGVtRGF0YSgxMywgNjQwMCk7DQorCXRoaXMtPlNldERsZ0l0ZW1UZXh0QShJRENfQ09NQk8xLCAiU2VsZWN0IFpvb20gRmFjdG9yIik7DQorCXJldHVybiBUUlVFOyAgLy8gcmV0dXJuIFRSVUUgdW5sZXNzIHlvdSBzZXQgdGhlIGZvY3VzIHRvIGEgY29udHJvbA0KKwkgICAgICAgICAgICAgIC8vIEVYQ0VQVElPTjogT0NYIFByb3BlcnR5IFBhZ2VzIHNob3VsZCByZXR1cm4gRkFMU0UNCit9DQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L1pvb21EbGcuaCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9ab29tRGxnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MjFjNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9ab29tRGxnLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmICFkZWZpbmVkKEFGWF9aT09NRExHX0hfX0IyNDRFOUUxXzUyNzhfNDI0NF85RDE5XzczMDdFMUI3NkMxNV9fSU5DTFVERURfKQ0KKyNkZWZpbmUgQUZYX1pPT01ETEdfSF9fQjI0NEU5RTFfNTI3OF80MjQ0XzlEMTlfNzMwN0UxQjc2QzE1X19JTkNMVURFRF8NCisNCisjaWYgX01TQ19WRVIgPiAxMDAwDQorI3ByYWdtYSBvbmNlDQorI2VuZGlmIC8vIF9NU0NfVkVSID4gMTAwMA0KKy8vIFpvb21EbGcuaCA6IGhlYWRlciBmaWxlDQorLy8NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENab29tRGxnIGRpYWxvZw0KK2NsYXNzIENSZWFkZXJWQ1ZpZXc7DQorY2xhc3MgQ1pvb21EbGcgOiBwdWJsaWMgQ0RpYWxvZw0KK3sNCisvLyBDb25zdHJ1Y3Rpb24NCitwdWJsaWM6DQorCUNab29tRGxnKENXbmQqIHBQYXJlbnQgPSBOVUxMKTsgICAvLyBzdGFuZGFyZCBjb25zdHJ1Y3Rvcg0KKw0KKy8vIERpYWxvZyBEYXRhDQorCS8ve3tBRlhfREFUQShDWm9vbURsZykNCisJZW51bSB7IElERCA9IElERF9ETEdfWk9PTVRPIH07DQorCQkvLyBOT1RFOiB0aGUgQ2xhc3NXaXphcmQgd2lsbCBhZGQgZGF0YSBtZW1iZXJzIGhlcmUNCisJLy99fUFGWF9EQVRBDQorDQorDQorLy8gT3ZlcnJpZGVzDQorCS8vIENsYXNzV2l6YXJkIGdlbmVyYXRlZCB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcw0KKwkvL3t7QUZYX1ZJUlRVQUwoQ1pvb21EbGcpDQorCXByb3RlY3RlZDoNCisJdmlydHVhbCB2b2lkIERvRGF0YUV4Y2hhbmdlKENEYXRhRXhjaGFuZ2UqIHBEWCk7ICAgIC8vIEREWC9ERFYgc3VwcG9ydA0KKwkvL319QUZYX1ZJUlRVQUwNCisNCisvLyBJbXBsZW1lbnRhdGlvbg0KK3Byb3RlY3RlZDoNCisJQ1JlYWRlclZDVmlldyAqbV9wVmlldzsNCisJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KKwkvL3t7QUZYX01TRyhDWm9vbURsZykNCisJdmlydHVhbCB2b2lkIE9uQ2FuY2VsKCk7DQorCXZpcnR1YWwgdm9pZCBPbk9LKCk7DQorCXZpcnR1YWwgQk9PTCBPbkluaXREaWFsb2coKTsNCisJLy99fUFGWF9NU0cNCisJREVDTEFSRV9NRVNTQUdFX01BUCgpDQorfTsNCisNCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19DQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLg0KKw0KKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfWk9PTURMR19IX19CMjQ0RTlFMV81Mjc4XzQyNDRfOUQxOV83MzA3RTFCNzZDMTVfX0lOQ0xVREVEXykNCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL0JpZ0hhbmRDdXJzb3IuY3VyIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9CaWdIYW5kQ3Vyc29yLmN1cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNiZmYwCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9CaWdIYW5kQ3Vyc29yLmN1cgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JkX1NlbFRleHRfSWNvbi5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JkX1NlbFRleHRfSWNvbi5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyYjJmNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvUmRfU2VsVGV4dF9JY29uLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JkX1NlbFRleHRfSWNvbl9EaXMuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9SZF9TZWxUZXh0X0ljb25fRGlzLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBlNjc0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9SZF9TZWxUZXh0X0ljb25fRGlzLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JlYWRlclZDLmljbyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvUmVhZGVyVkMuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZWYwYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JlYWRlclZDLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JlYWRlclZDLnJjMiBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvUmVhZGVyVkMucmMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTgzMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1JlYWRlclZDLnJjMgpAQCAtMCwwICsxLDEzIEBACisvLw0KKy8vIFJFQURFUlZDLlJDMiAtIHJlc291cmNlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBkb2VzIG5vdCBlZGl0IGRpcmVjdGx5DQorLy8NCisNCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KKwkjZXJyb3IgdGhpcyBmaWxlIGlzIG5vdCBlZGl0YWJsZSBieSBNaWNyb3NvZnQgVmlzdWFsIEMrKw0KKyNlbmRpZiAvL0FQU1RVRElPX0lOVk9LRUQNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEFkZCBtYW51YWxseSBlZGl0ZWQgcmVzb3VyY2VzIGhlcmUuLi4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvUmVhZGVyVkNEb2MuaWNvIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9SZWFkZXJWQ0RvYy5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZjFhZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvUmVhZGVyVkNEb2MuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvU21hbGxIYW5kQ3Vyc29yLmN1ciBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvU21hbGxIYW5kQ3Vyc29yLmN1cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmRmZjczCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9TbWFsbEhhbmRDdXJzb3IuY3VyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvVG9vbGJhci5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1Rvb2xiYXIuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTgwMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL1Rvb2xiYXIuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvYm9va21hcmsuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9ib29rbWFyay5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhMTA5YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvYm9va21hcmsuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvYm91bmQuY3VyIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9ib3VuZC5jdXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiN2Y3YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvYm91bmQuY3VyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvcG9pbnQuY3VyIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy9wb2ludC5jdXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlZDQyYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvcG9pbnQuY3VyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9hY3R1YWxfc2l6ZS5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfYWN0dWFsX3NpemUuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjZlZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfYWN0dWFsX3NpemUuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ib29rbWFyazEuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2Jvb2ttYXJrMS5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwOTc1NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ib29rbWFyazEuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9jbG9ja3dpc2UuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2Nsb2Nrd2lzZS5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjNzBiZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9jbG9ja3dpc2UuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9jb3VudGVyY2xvY2t3aXNlLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9jb3VudGVyY2xvY2t3aXNlLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM1NjYxCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2NvdW50ZXJjbG9ja3dpc2UuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9maXJzdC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfZmlyc3QuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjAxYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfZmlyc3QuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9maXRfcGFnZS5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfZml0X3BhZ2UuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZWFlYjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfZml0X3BhZ2UuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9maXRfd2lkdGguYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2ZpdF93aWR0aC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyMTQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9maXRfd2lkdGguYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9oYW5kMS5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaGFuZDEuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTUyOTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaGFuZDEuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfYWJvdXQyLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfYWJvdXQyLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjI3NGQ0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9hYm91dDIuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfYWN0dWFsX3NpemUuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9hY3R1YWxfc2l6ZS5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2NWUyMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfYWN0dWFsX3NpemUuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfYm9va21hcmsxLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfYm9va21hcmsxLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNkZDM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9ib29rbWFyazEuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfY2xvY2t3aXNlLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfY2xvY2t3aXNlLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhmM2FhCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9jbG9ja3dpc2UuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfY291bnRlcmNsb2Nrd2lzZS5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2NvdW50ZXJjbG9ja3dpc2UuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzkzNjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2NvdW50ZXJjbG9ja3dpc2UuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfZmlyc3QuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9maXJzdC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2MDE4YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfZmlyc3QuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfZmlyc3QueHBtIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9maXJzdC54cG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5YWMyOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfZmlyc3QueHBtCkBAIC0wLDAgKzEsMTA5IEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICp0b29sX2hvdF9maXJzdFtdID0geworLyogY29sdW1ucyByb3dzIGNvbG9ycyBjaGFycy1wZXItcGl4ZWwgKi8KKyIyNCAyNCA3OSAxIiwKKyIgIGMgIzNjNjU5ZSIsCisiLiBjICMzZTY4OWUiLAorIlggYyAjM2I2NWEwIiwKKyJvIGMgIzNlNjlhMyIsCisiTyBjICM0MjY3OWQiLAorIisgYyAjNDY2YjllIiwKKyJAIGMgIzRjNmM5YyIsCisiIyBjICM0NjZlYTMiLAorIiQgYyAjNDg2ZGEyIiwKKyIlIGMgIzQ0NzNhYSIsCisiJiBjICM0Yzc0YTYiLAorIiogYyAjNDg3NGFiIiwKKyI9IGMgIzRiN2FhZiIsCisiLSBjICM0ZjdjYjEiLAorIjsgYyAjNTA3MmEzIiwKKyI6IGMgIzU2NzhhNyIsCisiPiBjICM1MjdjYWYiLAorIiwgYyAjNWM3ZGE4IiwKKyI8IGMgZ3JlZW4iLAorIjEgYyAjNWQ4MGFiIiwKKyIyIGMgIzU3ODViNCIsCisiMyBjICM1ZDg4YjYiLAorIjQgYyAjNjQ4N2IwIiwKKyI1IGMgIzY0OGRiNiIsCisiNiBjICM2NzhmYmEiLAorIjcgYyAjNmM4ZWI1IiwKKyI4IGMgIzY1OTNiZSIsCisiOSBjICM2ZTkwYjUiLAorIjAgYyAjNmU5NmJjIiwKKyJxIGMgIzczOGFhYiIsCisidyBjICM3YjhkYTkiLAorImUgYyAjNzM4Y2IwIiwKKyJyIGMgIzcyOTRiNyIsCisidCBjICM3MjlhYmQiLAorInkgYyAjN2E5M2I2IiwKKyJ1IGMgIzdlOThiYSIsCisiaSBjICM2Njk0YzAiLAorInAgYyAjNzU5Y2MxIiwKKyJhIGMgIzdjOWZjMyIsCisicyBjICM3NGExYzYiLAorImQgYyAjNzZhNGNhIiwKKyJmIGMgIzdhYTFjMyIsCisiZyBjICM3YmE3YzkiLAorImggYyAjN2ZhOWNiIiwKKyJqIGMgIzdmYWVkMCIsCisiayBjICM4Njk0YWMiLAorImwgYyAjODc5ZGI2IiwKKyJ6IGMgIzhhOWRiNiIsCisieCBjICM5MzlkYWYiLAorImMgYyAjOTU5ZmIxIiwKKyJ2IGMgIzhhYTFiOSIsCisiYiBjICM5Y2E0YjMiLAorIm4gYyAjYTZhY2I2IiwKKyJtIGMgI2IyYjViYSIsCisiTSBjICNiOGJhYmQiLAorIk4gYyAjODdhZmNkIiwKKyJCIGMgIzg5YjJjZiIsCisiViBjICM4NGI0ZDMiLAorIkMgYyAjODhiNmQ1IiwKKyJaIGMgIzkxYWJjNyIsCisiQSBjICM5N2IxY2QiLAorIlMgYyAjOTBiZGRhIiwKKyJEIGMgI2E4YjZjYiIsCisiRiBjICM5MmMyZGQiLAorIkcgYyAjOWNjOGUwIiwKKyJIIGMgI2EwYzBkNyIsCisiSiBjICNhNmNmZTYiLAorIksgYyAjYTZkM2U4IiwKKyJMIGMgI2FhZDVlYSIsCisiUCBjICNiMGNmZTIiLAorIkkgYyAjYjlkYmViIiwKKyJVIGMgI2NhYzhjNCIsCisiWSBjICNjM2RmZWQiLAorIlQgYyAjYzVlMWVmIiwKKyJSIGMgI2NiZTJlZiIsCisiRSBjICNkNWU0ZWYiLAorIlcgYyAjZDJlN2YyIiwKKyJRIGMgI2U4ZjZmYSIsCisiISBjICNmZWZmZmYiLAorLyogcGl4ZWxzICovCisiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IiwKKyI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwiLAorIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCIsCisiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IiwKKyI8PDw8emx2ejw8PDw8PDw8PDxEPDw8PDwiLAorIjw8PDw3TktwPDw8PDw8PDw8ayw8PDw8PCIsCisiPDw8PHJDTGE8PDw8PDw8PHdOTjw8PDw8IiwKKyI8PDw8OWhHdDw8PDw8PE1xQktmPDw8PDwiLAorIjw8PDw3Z0YwPDw8PDxuZVBKUzA8PDw8PCIsCisiPDw8PDdzVjU8PDw8eHVXSUNWNTw8PDw8IiwKKyI8PDw8NDBkPjw8VWtaUVlWamQxPDw8PDwiLAorIjw8PDwxMzg+PDxrQSFSVlZkOD48PDw8PCIsCisiPDw8PDo+MyY8PG55RVRWZDgzJjw8PDw8IiwKKyI8PDw8OyotJDw8PG1xSFNpMj4jPDw8PDwiLAorIjw8PDwmIyorPDw8PDxxNjgtKiM8PDw8PCIsCisiPDw8PEBvJSs8PDw8PFV3Jj0lIzw8PDw8IiwKKyI8PDw8K1glKzw8PDw8PDxrIyUjPDw8PDwiLAorIjw8PDxPWCUuPDw8PDw8PDxjKyA8PDw8PCIsCisiPDw8PEAgK0A8PDw8PDw8PDxiQDw8PDw8IiwKKyI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwiLAorIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCIsCisiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IiwKKyI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwiLAorIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCIKK307CmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2ZpdF9wYWdlLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfZml0X3BhZ2UuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmNmY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2ZpdF9wYWdlLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2ZpdF93aWR0aC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2ZpdF93aWR0aC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwMjhlZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfZml0X3dpZHRoLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2hhbmQxLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfaGFuZDEuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDRhMTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2hhbmQxLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X2xhc3QuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9sYXN0LmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTYzZjcyCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9sYXN0LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X25leHQuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9uZXh0LmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQwNTg0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9uZXh0LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X29wZW4xLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3Rfb3BlbjEuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2ZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X29wZW4xLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3ByZXYuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9wcmV2LmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNmMjllCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF9wcmV2LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3ByaW50LmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3RfcHJpbnQuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVmODAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3ByaW50LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3NlYXJjaC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3NlYXJjaC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2YjhkNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3Rfc2VhcmNoLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3NuYXBfc2hvdC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3NuYXBfc2hvdC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MjI3MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3Rfc25hcF9zaG90LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3pvb21pbi5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3pvb21pbi5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYjNjOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9ob3Rfem9vbWluLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfaG90X3pvb21vdXQuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF96b29tb3V0LmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmMzN2U0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX2hvdF96b29tb3V0LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfbGFzdC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfbGFzdC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjNWJlOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9sYXN0LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfbmV4dC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfbmV4dC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3Y2M3MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9uZXh0LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfcHJldi5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfcHJldi5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiMmUzNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9wcmV2LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfcHJpbnQuYm1wIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX3ByaW50LmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdmNjUwCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvRm9ybUZpbGxlcl9UZXN0L3Jlcy90b29sX3ByaW50LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfc2VhcmNoLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9zZWFyY2guYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDhiOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfc2VhcmNoLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfc25hcF9zaG90LmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF9zbmFwX3Nob3QuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWVmZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfc25hcF9zaG90LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfem9vbWluLmJtcCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF96b29taW4uYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2Y0YzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfem9vbWluLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfem9vbW91dC5ibXAgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzL3Rvb2xfem9vbW91dC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZDFkZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXMvdG9vbF96b29tb3V0LmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzb3VyY2UuaCBiL3hmYV90ZXN0L0Zvcm1GaWxsZXJfVGVzdC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjFlNmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9Gb3JtRmlsbGVyX1Rlc3QvcmVzb3VyY2UuaApAQCAtMCwwICsxLDExMyBAQAorLy97e05PX0RFUEVOREVOQ0lFU319DQorLy8gTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4NCisvLyBVc2VkIGJ5IFJlYWRlclZDLnJjDQorLy8NCisjZGVmaW5lIElERF9BQk9VVEJPWCAgICAgICAgICAgICAgICAgICAgMTAwDQorI2RlZmluZSBJRFJfTUFJTkZSQU1FICAgICAgICAgICAgICAgICAgIDEyOA0KKyNkZWZpbmUgSURSX1JFQURFUlRZUEUgICAgICAgICAgICAgICAgICAxMjkNCisjZGVmaW5lIElERF9ETEdfR09UT1BBR0UgICAgICAgICAgICAgICAgMTMwDQorI2RlZmluZSBJRERfRExHX1pPT01UTyAgICAgICAgICAgICAgICAgIDEzMQ0KKyNkZWZpbmUgSUREX0RMR19GSU5EICAgICAgICAgICAgICAgICAgICAxMzINCisjZGVmaW5lIElEQ19DVVJTT1IxICAgICAgICAgICAgICAgICAgICAgMTMzDQorI2RlZmluZSBJRENfQ1VSU09SMiAgICAgICAgICAgICAgICAgICAgIDEzNA0KKyNkZWZpbmUgSURDX0NVUlNPUjMgICAgICAgICAgICAgICAgICAgICAxMzUNCisjZGVmaW5lIElEQ19DVVJTT1I0ICAgICAgICAgICAgICAgICAgICAgMTM2DQorI2RlZmluZSBJREJfQklUTUFQMSAgICAgICAgICAgICAgICAgICAgIDIxNQ0KKyNkZWZpbmUgSURCX0JJVE1BUDIgICAgICAgICAgICAgICAgICAgICAyMTYNCisjZGVmaW5lIElEQl9CSVRNQVAzICAgICAgICAgICAgICAgICAgICAgMjE3DQorI2RlZmluZSBJREJfQklUTUFQNCAgICAgICAgICAgICAgICAgICAgIDIxOA0KKyNkZWZpbmUgSURCX0JJVE1BUDUgICAgICAgICAgICAgICAgICAgICAyMTkNCisjZGVmaW5lIElEQl9CSVRNQVA2ICAgICAgICAgICAgICAgICAgICAgMjIwDQorI2RlZmluZSBJREJfQklUTUFQNyAgICAgICAgICAgICAgICAgICAgIDIyMQ0KKyNkZWZpbmUgSURCX0JJVE1BUDggICAgICAgICAgICAgICAgICAgICAyMjINCisjZGVmaW5lIElEQl9CSVRNQVA5ICAgICAgICAgICAgICAgICAgICAgMjIzDQorI2RlZmluZSBJREJfQklUTUFQMTAgICAgICAgICAgICAgICAgICAgIDIyNA0KKyNkZWZpbmUgSURCX0JJVE1BUDExICAgICAgICAgICAgICAgICAgICAyMjUNCisjZGVmaW5lIElEQl9CSVRNQVAxMiAgICAgICAgICAgICAgICAgICAgMjI2DQorI2RlZmluZSBJREJfQklUTUFQMTMgICAgICAgICAgICAgICAgICAgIDIyNw0KKyNkZWZpbmUgSURCX0JJVE1BUDE0ICAgICAgICAgICAgICAgICAgICAyMjgNCisjZGVmaW5lIElEQl9CSVRNQVAxNSAgICAgICAgICAgICAgICAgICAgMjI5DQorI2RlZmluZSBJREJfQklUTUFQMTYgICAgICAgICAgICAgICAgICAgIDIzMA0KKyNkZWZpbmUgSURCX0JJVE1BUDE3ICAgICAgICAgICAgICAgICAgICAyMzENCisjZGVmaW5lIElEQl9CSVRNQVAxOCAgICAgICAgICAgICAgICAgICAgMjMyDQorI2RlZmluZSBJREJfQklUTUFQMTkgICAgICAgICAgICAgICAgICAgIDIzMw0KKyNkZWZpbmUgSURCX0JJVE1BUDIwICAgICAgICAgICAgICAgICAgICAyMzQNCisjZGVmaW5lIElEQl9CSVRNQVAyMSAgICAgICAgICAgICAgICAgICAgMjM1DQorI2RlZmluZSBJREJfQklUTUFQMjIgICAgICAgICAgICAgICAgICAgIDIzNg0KKyNkZWZpbmUgSURCX0JJVE1BUDIzICAgICAgICAgICAgICAgICAgICAyMzcNCisjZGVmaW5lIElEQl9CSVRNQVAyNCAgICAgICAgICAgICAgICAgICAgMjM4DQorI2RlZmluZSBJREJfQklUTUFQMjYgICAgICAgICAgICAgICAgICAgIDI0MA0KKyNkZWZpbmUgSURCX0JJVE1BUDI3ICAgICAgICAgICAgICAgICAgICAyNDENCisjZGVmaW5lIElEQl9CSVRNQVAyOCAgICAgICAgICAgICAgICAgICAgMjQyDQorI2RlZmluZSBJREJfQklUTUFQMjkgICAgICAgICAgICAgICAgICAgIDI0Mw0KKyNkZWZpbmUgSURCX0JJVE1BUDMwICAgICAgICAgICAgICAgICAgICAyNDQNCisjZGVmaW5lIElEQl9CSVRNQVAzMSAgICAgICAgICAgICAgICAgICAgMjQ1DQorI2RlZmluZSBJREJfQklUTUFQMzIgICAgICAgICAgICAgICAgICAgIDI0Ng0KKyNkZWZpbmUgSURCX0JJVE1BUDMzICAgICAgICAgICAgICAgICAgICAyNDcNCisjZGVmaW5lIElEQl9CSVRNQVAzNCAgICAgICAgICAgICAgICAgICAgMjQ4DQorI2RlZmluZSBJREJfQklUTUFQMjUgICAgICAgICAgICAgICAgICAgIDI0OQ0KKyNkZWZpbmUgSURCX0JJVE1BUDM1ICAgICAgICAgICAgICAgICAgICAyNTANCisjZGVmaW5lIElEQl9CSVRNQVAzNiAgICAgICAgICAgICAgICAgICAgMjUxDQorI2RlZmluZSBJRERfRExHX0NPTlZFUlQgICAgICAgICAgICAgICAgIDI1Mg0KKyNkZWZpbmUgSUREX0VYUE9SVF9QQUdFICAgICAgICAgICAgICAgICAyNTMNCisjZGVmaW5lIElERF9ETEdfUkVTUE9OU0UgICAgICAgICAgICAgICAgMjU1DQorI2RlZmluZSBJRERfVEVTVF9KUyAgICAgICAgICAgICAgICAgICAgIDI1Ng0KKyNkZWZpbmUgSURDX0VESVQxICAgICAgICAgICAgICAgICAgICAgICAxMDAwDQorI2RlZmluZSBJRENfQ09NQk8xICAgICAgICAgICAgICAgICAgICAgIDEwMDINCisjZGVmaW5lIElEQ19DSEVDS19NQVRDSENBU0UgICAgICAgICAgICAgMTAwMw0KKyNkZWZpbmUgSURDX0NIRUNLX01BVENIV0hPTEUgICAgICAgICAgICAxMDA0DQorI2RlZmluZSBJRENfUkFESU9fRG93biAgICAgICAgICAgICAgICAgIDEwMDUNCisjZGVmaW5lIElEQ19SQURJT19VUCAgICAgICAgICAgICAgICAgICAgMTAwNg0KKyNkZWZpbmUgSURDX1JBRElPX1N0cmVhbSAgICAgICAgICAgICAgICAxMDA3DQorI2RlZmluZSBJRENfUkFESU9fQXBwZWFyYW5jZSAgICAgICAgICAgIDEwMDgNCisjZGVmaW5lIElEQ19SYW5kZXJfUGFnZSAgICAgICAgICAgICAgICAgMTAwOQ0KKyNkZWZpbmUgSURDX1NhdmUgICAgICAgICAgICAgICAgICAgICAgICAxMDEwDQorI2RlZmluZSBJRENfRURJVF9QQUdFX0hFSUdIVCAgICAgICAgICAgIDEwMTENCisjZGVmaW5lIElEQ19FRElUX1JPVEFURSAgICAgICAgICAgICAgICAgMTAxMg0KKyNkZWZpbmUgSURDX0VESVRfV0lEVEggICAgICAgICAgICAgICAgICAxMDEzDQorI2RlZmluZSBJRENfRURJVF9IRUlHSFQgICAgICAgICAgICAgICAgIDEwMTQNCisjZGVmaW5lIElEQ19FRElUX1BBR0VfV0lEVEggICAgICAgICAgICAgMTAxNQ0KKyNkZWZpbmUgSURDX1NUQVRJQ19CSVRNQVAgICAgICAgICAgICAgICAxMDE2DQorI2RlZmluZSBJRF9KU19PSyAgICAgICAgICAgICAgICAgICAgICAgIDEwMTcNCisjZGVmaW5lIElEX0pTX0NBTkNFTCAgICAgICAgICAgICAgICAgICAgMTAxOA0KKyNkZWZpbmUgSURDX0pTX1FVRVNUSU9OICAgICAgICAgICAgICAgICAxMDE5DQorI2RlZmluZSBJRENfSlNfQU5TV0VSICAgICAgICAgICAgICAgICAgIDEwMjANCisjZGVmaW5lIElEQ19CVVRUT04xICAgICAgICAgICAgICAgICAgICAgMTAyMQ0KKyNkZWZpbmUgSURfVklFV19aT09NSU4gICAgICAgICAgICAgICAgICAzMjc3Mg0KKyNkZWZpbmUgSURfVklFV19aT09NT1VUICAgICAgICAgICAgICAgICAzMjc3Mw0KKyNkZWZpbmUgSURfVklFV19aT09NVE8gICAgICAgICAgICAgICAgICAzMjc3NA0KKyNkZWZpbmUgSURfVklFV19BQ1RVQUxTSVpFICAgICAgICAgICAgICAzMjc3NQ0KKyNkZWZpbmUgSURfVklFV19GSVRQQUdFICAgICAgICAgICAgICAgICAzMjc3Ng0KKyNkZWZpbmUgSURfVklFV19GSVRXSURUSCAgICAgICAgICAgICAgICAzMjc3Nw0KKyNkZWZpbmUgSURfRE9DX0ZJUlNUUEFHRSAgICAgICAgICAgICAgICAzMjc3OA0KKyNkZWZpbmUgSURfRE9DX1BSRVBBR0UgICAgICAgICAgICAgICAgICAzMjc3OQ0KKyNkZWZpbmUgSURfRE9DX05FWFRQQUdFICAgICAgICAgICAgICAgICAzMjc4MA0KKyNkZWZpbmUgSURfRE9DX0xBU1RQQUdFICAgICAgICAgICAgICAgICAzMjc4MQ0KKyNkZWZpbmUgSURfRE9DX0dPVE9QQUdFICAgICAgICAgICAgICAgICAzMjc4Mg0KKyNkZWZpbmUgSURfVklFV19DTE9DS1dJU0UgICAgICAgICAgICAgICAzMjc4NA0KKyNkZWZpbmUgSURfVklFV19DT1VOVEVSQ0xPQ0tXSVNFICAgICAgICAzMjc4NQ0KKyNkZWZpbmUgSURfVE9PTF9IQU5EICAgICAgICAgICAgICAgICAgICAzMjc4OA0KKyNkZWZpbmUgSURfVE9PTF9TRUxFQ1QgICAgICAgICAgICAgICAgICAzMjc4OQ0KKyNkZWZpbmUgSURfVE9PTF9TTkFQU0hPVCAgICAgICAgICAgICAgICAzMjc5MA0KKyNkZWZpbmUgSURfVE9PTF9QREYyVFhUICAgICAgICAgICAgICAgICAzMjc5MQ0KKyNkZWZpbmUgSURfVE9PTF9FWFRSQUNUTElOS1MgICAgICAgICAgICAzMjc5Mg0KKyNkZWZpbmUgSURfRE9DX0VESVRHT1RPICAgICAgICAgICAgICAgICAzMjc5Mw0KKyNkZWZpbmUgSURfVklFV19CT09LTUFSSyAgICAgICAgICAgICAgICAzMjc5NA0KKyNkZWZpbmUgSURfVE9PTF9QQUdFVE9URVhUICAgICAgICAgICAgICAzMjc5NQ0KKyNkZWZpbmUgSURfUkVOREVSQklUTUFQICAgICAgICAgICAgICAgICAzMjc5OQ0KKyNkZWZpbmUgSURfRVhQT1JUX1BERl9UT19CSVRNQVAgICAgICAgICAzMjgwMA0KKyNkZWZpbmUgSURNX1Rlc3RfSlMgICAgICAgICAgICAgICAgICAgICAzMjgwMQ0KKyNkZWZpbmUgSURDX0pTX0VESVQgICAgICAgICAgICAgICAgICAgICAzMjgwMg0KKyNkZWZpbmUgVEVTVF9QUklOVF9NRVRBTEZJTEUgICAgICAgICAgICAzMjgwMw0KKw0KKy8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzDQorLy8gDQorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQNCisjaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCisjZGVmaW5lIF9BUFNfM0RfQ09OVFJPTFMgICAgICAgICAgICAgICAgICAgICAxDQorI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDI1Nw0KKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICAzMjgwMw0KKyNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDIyDQorI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQ0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9CVUlMRC5nbiBiL3hmYV90ZXN0L3BkZi9CVUlMRC5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTFmMTY1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL0JVSUxELmduCkBAIC0wLDAgKzEsOTkgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworcGRmX2VuZ2luZSA9IDAgICMgMCBQREZpdW0KKworIyBUT0RPKEdZUCkgbmVlZCBzdXBwb3J0IGZvciBsb2FkYWJsZSBtb2R1bGVzCitzaGFyZWRfbGlicmFyeSgicGRmIikgeworICBzb3VyY2VzID0gWworICAgICJidXR0b24uaCIsCisgICAgImJ1dHRvbi5jYyIsCisgICAgImNodW5rX3N0cmVhbS5oIiwKKyAgICAiY2h1bmtfc3RyZWFtLmNjIiwKKyAgICAiY29udHJvbC5oIiwKKyAgICAiY29udHJvbC5jYyIsCisgICAgImRvY3VtZW50X2xvYWRlci5oIiwKKyAgICAiZG9jdW1lbnRfbG9hZGVyLmNjIiwKKyAgICAiZHJhd191dGlscy5jYyIsCisgICAgImRyYXdfdXRpbHMuaCIsCisgICAgImZhZGluZ19jb250cm9sLmNjIiwKKyAgICAiZmFkaW5nX2NvbnRyb2wuaCIsCisgICAgImZhZGluZ19jb250cm9scy5jYyIsCisgICAgImZhZGluZ19jb250cm9scy5oIiwKKyAgICAiaW5zdGFuY2UuY2MiLAorICAgICJpbnN0YW5jZS5oIiwKKyAgICAibnVtYmVyX2ltYWdlX2dlbmVyYXRvci5jYyIsCisgICAgIm51bWJlcl9pbWFnZV9nZW5lcmF0b3IuaCIsCisgICAgIm91dF9vZl9wcm9jZXNzX2luc3RhbmNlLmNjIiwKKyAgICAib3V0X29mX3Byb2Nlc3NfaW5zdGFuY2UuaCIsCisgICAgInBhZ2VfaW5kaWNhdG9yLmNjIiwKKyAgICAicGFnZV9pbmRpY2F0b3IuaCIsCisgICAgInBhaW50X2FnZ3JlZ2F0b3IuY2MiLAorICAgICJwYWludF9hZ2dyZWdhdG9yLmgiLAorICAgICJwYWludF9tYW5hZ2VyLmNjIiwKKyAgICAicGFpbnRfbWFuYWdlci5oIiwKKyAgICAicGRmLmNjIiwKKyAgICAicGRmLmgiLAorICAgICJwZGYucmMiLAorICAgICJwcm9ncmVzc19jb250cm9sLmNjIiwKKyAgICAicHJvZ3Jlc3NfY29udHJvbC5oIiwKKyAgICAicGRmX2VuZ2luZS5oIiwKKyAgICAicHJldmlld19tb2RlX2NsaWVudC5jYyIsCisgICAgInByZXZpZXdfbW9kZV9jbGllbnQuaCIsCisgICAgInJlc291cmNlLmgiLAorICAgICJyZXNvdXJjZV9jb25zdHMuaCIsCisgICAgInRodW1ibmFpbF9jb250cm9sLmNjIiwKKyAgICAidGh1bWJuYWlsX2NvbnRyb2wuaCIsCisgICAgIi4uL2Nocm9tZS9icm93c2VyL2Nocm9tZV9wYWdlX3pvb21fY29uc3RhbnRzLmNjIiwKKyAgICAiLi4vY29udGVudC9jb21tb24vcGFnZV96b29tLmNjIiwKKyAgXQorCisgIGlmIChwZGZfZW5naW5lID09IDApIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICJwZGZpdW0vcGRmaXVtX2Fzc2VydF9tYXRjaGluZ19lbnVtcy5jYyIsCisgICAgICAicGRmaXVtL3BkZml1bV9lbmdpbmUuY2MiLAorICAgICAgInBkZml1bS9wZGZpdW1fZW5naW5lLmgiLAorICAgICAgInBkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3JlYWQuY2MiLAorICAgICAgInBkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3JlYWQuaCIsCisgICAgICAicGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfd3JpdGUuY2MiLAorICAgICAgInBkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3dyaXRlLmgiLAorICAgICAgInBkZml1bS9wZGZpdW1fcGFnZS5jYyIsCisgICAgICAicGRmaXVtL3BkZml1bV9wYWdlLmgiLAorICAgICAgInBkZml1bS9wZGZpdW1fcmFuZ2UuY2MiLAorICAgICAgInBkZml1bS9wZGZpdW1fcmFuZ2UuaCIsCisgICAgXQorICB9CisKKyAgaWYgKGlzX3dpbikgeworICAgIGRlZmluZXMgPSBbICJDT01QSUxFX0NPTlRFTlRfU1RBVElDQUxMWSIgXQorICAgIGNmbGFncyA9IFsgIi93ZDQyNjciIF0gICMgVE9ETyhqc2NodWgpIHNpemVfdCB0byBpbnQgdHJ1bmNhdGlvbnMuCisgIH0KKworICBpZiAoaXNfbWFjKSB7CisgICAgIyBUT0RPKEdZUCkKKyAgICAjJ21hY19idW5kbGUnOiAxLAorICAgICMncHJvZHVjdF9uYW1lJzogJ1BERicsCisgICAgIydwcm9kdWN0X2V4dGVuc2lvbic6ICdwbHVnaW4nLAorICAgICMjIFN0cmlwIHRoZSBzaGlwcGluZyBiaW5hcnkgb2Ygc3ltYm9scyBzbyAiRm94aXQiIGRvZXNuJ3QgYXBwZWFyIGluCisgICAgIyMgdGhlIGJpbmFyeS4gIFN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIC5kU1lNLgorICAgICMndmFyaWFibGVzJzogeworICAgICMgICdtYWNfcmVhbF9kc3ltJzogMSwKKyAgICAjfSwKKyAgICAjJ3NvdXJjZXMrJzogWworICAgICMgICdJbmZvLnBsaXN0JworICAgICNdCisgICAgIyd4Y29kZV9zZXR0aW5ncyc6IHsKKyAgICAjICAnSU5GT1BMSVNUX0ZJTEUnOiAnSW5mby5wbGlzdCcsCisgICAgI30sCisgIH0KKworICBkZXBzID0gWworICAgICIvL2Jhc2UiLAorICAgICIvL25ldCIsCisgICAgIi8vcHBhcGk6cHBhcGlfY3BwIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW0iLAorICBdCit9CisKKyMgVE9ETyhHWVApIHBkZl9saW51eF9zeW1ib2xzIHRhcmdldC4KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9ERVBTIGIveGZhX3Rlc3QvcGRmL0RFUFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMmY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9ERVBTCkBAIC0wLDAgKzEsOSBAQAoraW5jbHVkZV9ydWxlcyA9IFsKKyAgIiFjaHJvbWUvYnJvd3Nlci9jaHJvbWVfcGFnZV96b29tX2NvbnN0YW50cy5oIiwKKyAgIiFjaHJvbWUvY29tbW9uL2NvbnRlbnRfcmVzdHJpY3Rpb24uaCIsCisgICIhY29udGVudC9wdWJsaWMvY29tbW9uL3BhZ2Vfem9vbS5oIiwKKyAgIituZXQiLAorICAiK3BwYXBpIiwKKyAgIit0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlIiwKKyAgIit1aS9ldmVudHMva2V5Y29kZXMva2V5Ym9hcmRfY29kZXMuaCIsCitdCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvSW5mby5wbGlzdCBiL3hmYV90ZXN0L3BkZi9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmM2RmZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvSW5mby5wbGlzdApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+b3JnLmNocm9taXVtLnBkZl9wbHVnaW48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5CUlBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGUGx1Z0luRHluYW1pY1JlZ2lzdGVyRnVuY3Rpb248L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZQbHVnSW5EeW5hbWljUmVnaXN0cmF0aW9uPC9rZXk+CisJPHN0cmluZz5OTzwvc3RyaW5nPgorCTxrZXk+V2ViUGx1Z2luRGVzY3JpcHRpb248L2tleT4KKwk8c3RyaW5nPkNocm9tZSBQREYgVmlld2VyPC9zdHJpbmc+CisJPGtleT5XZWJQbHVnaW5NSU1FVHlwZXM8L2tleT4KKwk8ZGljdD4KKwkJPGtleT5hcHBsaWNhdGlvbi9wZGY8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PldlYlBsdWdpbkV4dGVuc2lvbnM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPnBkZjwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+V2ViUGx1Z2luVHlwZURlc2NyaXB0aW9uPC9rZXk+CisJCQk8c3RyaW5nPkFjcm9iYXQgUG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0PC9zdHJpbmc+CisJCTwvZGljdD4KKwk8L2RpY3Q+CisJPGtleT5XZWJQbHVnaW5OYW1lPC9rZXk+CisJPHN0cmluZz5DaHJvbWUgUERGIFZpZXdlcjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9PV05FUlMgYi94ZmFfdGVzdC9wZGYvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDA4YmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvT1dORVJTCkBAIC0wLDAgKzEsNCBAQAorZ2VuZUBjaHJvbWl1bS5vcmcKK2phbUBjaHJvbWl1bS5vcmcKK3JheW1lc0BjaHJvbWl1bS5vcmcKK3RoZXN0aWdAY2hyb21pdW0ub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2J1dHRvbi5jYyBiL3hmYV90ZXN0L3BkZi9idXR0b24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzMDE2NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9idXR0b24uY2MKQEAgLTAsMCArMSwxNzkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwZGYvYnV0dG9uLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJwZGYvZHJhd191dGlscy5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9pbnB1dF9ldmVudC5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK0J1dHRvbjo6QnV0dG9uKCkKKyAgICA6IHN0eWxlXyhCVVRUT05fQ0xJQ0tBQkxFKSwgc3RhdGVfKEJVVFRPTl9OT1JNQUwpLCBpc19wcmVzc2VkXyhmYWxzZSkgeworfQorCitCdXR0b246On5CdXR0b24oKSB7Cit9CisKK2Jvb2wgQnV0dG9uOjpDcmVhdGVCdXR0b24odWludDMyIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UG9pbnQmIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sOjpPd25lciogb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvblN0eWxlIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6SW1hZ2VEYXRhJiBmYWNlX25vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OkltYWdlRGF0YSYgZmFjZV9oaWdobGlnaHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OkltYWdlRGF0YSYgZmFjZV9wcmVzc2VkKSB7CisgIERDSEVDSyhmYWNlX25vcm1hbC5zaXplKCkuR2V0QXJlYSgpKTsKKyAgRENIRUNLKGZhY2Vfbm9ybWFsLnNpemUoKSA9PSBmYWNlX2hpZ2hsaWdodGVkLnNpemUoKSk7CisgIERDSEVDSyhmYWNlX25vcm1hbC5zaXplKCkgPT0gZmFjZV9wcmVzc2VkLnNpemUoKSk7CisKKyAgcHA6OlJlY3QgcmMob3JpZ2luLCBmYWNlX25vcm1hbC5zaXplKCkpOworICBpZiAoIUNvbnRyb2w6OkNyZWF0ZShpZCwgcmMsIHZpc2libGUsIG93bmVyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3R5bGVfID0gc3R5bGU7CisKKyAgbm9ybWFsXyA9IGZhY2Vfbm9ybWFsOworICBoaWdobGlnaHRlZF8gPSBmYWNlX2hpZ2hsaWdodGVkOworICBwcmVzc2VkXyA9IGZhY2VfcHJlc3NlZDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCit2b2lkIEJ1dHRvbjo6UGFpbnQocHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwgY29uc3QgcHA6OlJlY3QmIHJjKSB7CisgIGlmICghdmlzaWJsZSgpKQorICAgIHJldHVybjsKKworICBwcDo6UmVjdCBkcmF3X3JjID0gcmMuSW50ZXJzZWN0KHJlY3QoKSk7CisgIGlmIChkcmF3X3JjLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgcHA6OlBvaW50IG9yaWdpbiA9IGRyYXdfcmMucG9pbnQoKTsKKyAgZHJhd19yYy5PZmZzZXQoLXJlY3QoKS54KCksIC1yZWN0KCkueSgpKTsKKworICBBbHBoYUJsZW5kKEdldEN1cnJlbnRJbWFnZSgpLCBkcmF3X3JjLCBpbWFnZV9kYXRhLCBvcmlnaW4sIHRyYW5zcGFyZW5jeSgpKTsKK30KKworYm9vbCBCdXR0b246OkhhbmRsZUV2ZW50KGNvbnN0IHBwOjpJbnB1dEV2ZW50JiBldmVudCkgeworICBpZiAoIXZpc2libGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQnV0dG9uIGhhbmRsZXMgbW91c2UgZXZlbnRzIG9ubHkuCisgIHBwOjpNb3VzZUlucHV0RXZlbnQgbW91c2VfZXZlbnQoZXZlbnQpOworICAgaWYgKG1vdXNlX2V2ZW50LmlzX251bGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcHA6OlBvaW50IHB0ID0gbW91c2VfZXZlbnQuR2V0UG9zaXRpb24oKTsKKyAgaWYgKCFyZWN0KCkuQ29udGFpbnMocHQpIHx8CisgICAgICBldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFTEVBVkUpIHsKKyAgICBDaGFuZ2VTdGF0ZShCVVRUT05fTk9STUFMLCBmYWxzZSk7CisgICAgb3duZXIoKS0+U2V0RXZlbnRDYXB0dXJlKGlkKCksIGZhbHNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvd25lcigpLT5TZXRDdXJzb3IoaWQoKSwgUFBfQ1VSU09SVFlQRV9QT0lOVEVSKTsKKyAgb3duZXIoKS0+U2V0RXZlbnRDYXB0dXJlKGlkKCksIHRydWUpOworCisgIGJvb2wgaGFuZGxlZCA9IHRydWU7CisgIHN3aXRjaCAoZXZlbnQuR2V0VHlwZSgpKSB7CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VNT1ZFOgorICAgICAgaWYgKHN0YXRlXyA9PSBCVVRUT05fTk9STUFMKQorICAgICAgICBDaGFuZ2VTdGF0ZShCVVRUT05fSElHSExJR0hURUQsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFRE9XTjoKKyAgICAgIGlmIChtb3VzZV9ldmVudC5HZXRCdXR0b24oKSA9PSBQUF9JTlBVVEVWRU5UX01PVVNFQlVUVE9OX0xFRlQpIHsKKyAgICAgICAgQ2hhbmdlU3RhdGUoQlVUVE9OX1BSRVNTRUQsIGZhbHNlKTsKKyAgICAgICAgaXNfcHJlc3NlZF8gPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VVUDoKKyAgICAgIGlmIChtb3VzZV9ldmVudC5HZXRCdXR0b24oKSA9PSBQUF9JTlBVVEVWRU5UX01PVVNFQlVUVE9OX0xFRlQgJiYKKyAgICAgICAgICBpc19wcmVzc2VkXykgeworICAgICAgICBPbkJ1dHRvbkNsaWNrZWQoKTsKKyAgICAgICAgaXNfcHJlc3NlZF8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNpbmNlIGJ1dHRvbiBoYXMgbm90IGJlZW4gcHJlc3NlZCwgcmV0dXJuIGZhbHNlIHRvIGFsbG93IG90aGVyCisgICAgICAgIC8vIGNvbnRyb2xzIChzY3JvbGxiYXIpIHRvIHByb2Nlc3MgbW91c2UgYnV0dG9uIHVwLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaGFuZGxlZCA9IGZhbHNlOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gaGFuZGxlZDsKK30KKwordm9pZCBCdXR0b246Ok9uRXZlbnRDYXB0dXJlUmVsZWFzZWQoKSB7CisgIENoYW5nZVN0YXRlKEJVVFRPTl9OT1JNQUwsIGZhbHNlKTsKK30KKwordm9pZCBCdXR0b246OlNob3coYm9vbCB2aXNpYmxlLCBib29sIGludmFsaWRhdGUpIHsKKyAgLy8gSWYgYnV0dG9uIGJlY29tZSBpbnZpc2libGUsIHJlbW92ZSBwcmVzc2VkIGZsYWcuCisgIGlmICghdmlzaWJsZSkKKyAgICBpc19wcmVzc2VkXyA9IGZhbHNlOworICBDb250cm9sOjpTaG93KHZpc2libGUsIGludmFsaWRhdGUpOworfQorCit2b2lkIEJ1dHRvbjo6QWRqdXN0VHJhbnNwYXJlbmN5KHVpbnQ4IHRyYW5zcGFyZW5jeSwgYm9vbCBpbnZhbGlkYXRlKSB7CisgIC8vIElmIGJ1dHRvbiBiZWNvbWUgaW52aXNpYmxlLCByZW1vdmUgcHJlc3NlZCBmbGFnLgorICBpZiAodHJhbnNwYXJlbmN5ID09IGtUcmFuc3BhcmVudEFscGhhKQorICAgIGlzX3ByZXNzZWRfID0gZmFsc2U7CisgIENvbnRyb2w6OkFkanVzdFRyYW5zcGFyZW5jeSh0cmFuc3BhcmVuY3ksIGludmFsaWRhdGUpOworfQorCit2b2lkIEJ1dHRvbjo6U2V0UHJlc3NlZFN0YXRlKGJvb2wgcHJlc3NlZCkgeworICBpZiAoc3R5bGVfID09IEJVVFRPTl9TVEFURSkgeworICAgIGlmIChJc1ByZXNzZWQoKSAhPSBwcmVzc2VkKQorICAgICAgQ2hhbmdlU3RhdGUocHJlc3NlZCA/IEJVVFRPTl9QUkVTU0VEX1NUSUNLWSA6IEJVVFRPTl9OT1JNQUwsIHRydWUpOworICB9Cit9CisKK2NvbnN0IHBwOjpJbWFnZURhdGEmIEJ1dHRvbjo6R2V0Q3VycmVudEltYWdlKCkgeworICBzd2l0Y2ggKHN0YXRlXykgeworICAgIGNhc2UgQlVUVE9OX05PUk1BTDogcmV0dXJuIG5vcm1hbF87CisgICAgY2FzZSBCVVRUT05fSElHSExJR0hURUQ6IHJldHVybiBoaWdobGlnaHRlZF87CisgICAgY2FzZSBCVVRUT05fUFJFU1NFRDoKKyAgICBjYXNlIEJVVFRPTl9QUkVTU0VEX1NUSUNLWTogcmV0dXJuIHByZXNzZWRfOworICB9CisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIG5vcm1hbF87Cit9CisKK3ZvaWQgQnV0dG9uOjpDaGFuZ2VTdGF0ZShCdXR0b25TdGF0ZSBuZXdfc3RhdGUsIGJvb2wgZm9yY2UpIHsKKyAgaWYgKHN0eWxlXyA9PSBCVVRUT05fU1RBVEUgJiYgIWZvcmNlKSB7CisgICAgLy8gSWYgYnV0dG9uIGlzIGEgc3RhdGUgYnV0dG9uIGFuZCBwcmVzc2VkIHN0YXRlIGlzIHN0aWNreSwKKyAgICAvLyB1c2VyIGhhdmUgdG8gY2xpY2sgb24gdGhpcyBidXR0b24gYWdhaW4gdG8gdW5wcmVzcyBpdC4KKyAgICBpZiAoKHN0YXRlXyA9PSBCVVRUT05fUFJFU1NFRF9TVElDS1kgJiYgbmV3X3N0YXRlICE9IEJVVFRPTl9QUkVTU0VEX1NUSUNLWSkKKyAgICAgICAgfHwKKyAgICAgICAgKHN0YXRlXyAhPSBCVVRUT05fUFJFU1NFRF9TVElDS1kgJiYgbmV3X3N0YXRlID09IEJVVFRPTl9QUkVTU0VEX1NUSUNLWSkpCisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RhdGVfICE9IG5ld19zdGF0ZSkgeworICAgIHN0YXRlXyA9IG5ld19zdGF0ZTsKKyAgICBvd25lcigpLT5JbnZhbGlkYXRlKGlkKCksIHJlY3QoKSk7CisgIH0KK30KKwordm9pZCBCdXR0b246Ok9uQnV0dG9uQ2xpY2tlZCgpIHsKKyAgc3dpdGNoIChzdHlsZV8pIHsKKyAgICBjYXNlIEJVVFRPTl9DTElDS0FCTEU6CisgICAgICBDaGFuZ2VTdGF0ZShCVVRUT05fSElHSExJR0hURUQsIHRydWUpOworICAgICAgb3duZXIoKS0+T25FdmVudChpZCgpLCBFVkVOVF9JRF9CVVRUT05fQ0xJQ0tFRCwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVVFRPTl9TVEFURToKKyAgICAgIFNldFByZXNzZWRTdGF0ZSghSXNQcmVzc2VkKCkpOworICAgICAgb3duZXIoKS0+T25FdmVudChpZCgpLCBFVkVOVF9JRF9CVVRUT05fU1RBVEVfQ0hBTkdFRCwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9idXR0b24uaCBiL3hmYV90ZXN0L3BkZi9idXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI1MTdkCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL2J1dHRvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX0JVVFRPTl9IXworI2RlZmluZSBQREZfQlVUVE9OX0hfCisKKyNpbmNsdWRlICJwZGYvY29udHJvbC5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9pbWFnZV9kYXRhLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3JlY3QuaCIKKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCitjbGFzcyBCdXR0b24gOiBwdWJsaWMgQ29udHJvbCB7CisgcHVibGljOgorICBlbnVtIEJ1dHRvbkV2ZW50SWRzIHsKKyAgICBFVkVOVF9JRF9CVVRUT05fQ0xJQ0tFRCwKKyAgICBFVkVOVF9JRF9CVVRUT05fU1RBVEVfQ0hBTkdFRCwKKyAgfTsKKworICBlbnVtIEJ1dHRvblN0eWxlIHsKKyAgICBCVVRUT05fQ0xJQ0tBQkxFLAorICAgIEJVVFRPTl9TVEFURQorICB9OworCisgIGVudW0gQnV0dG9uU3RhdGUgeworICAgIEJVVFRPTl9OT1JNQUwsCisgICAgQlVUVE9OX0hJR0hMSUdIVEVELAorICAgIEJVVFRPTl9QUkVTU0VELAorICAgIEJVVFRPTl9QUkVTU0VEX1NUSUNLWSwKKyAgfTsKKworICBCdXR0b24oKTsKKyAgdmlydHVhbCB+QnV0dG9uKCk7CisgIHZpcnR1YWwgYm9vbCBDcmVhdGVCdXR0b24odWludDMyIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpQb2ludCYgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sOjpPd25lciogZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uU3R5bGUgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OkltYWdlRGF0YSYgZmFjZV9ub3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OkltYWdlRGF0YSYgZmFjZV9oaWdobGlnaHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6SW1hZ2VEYXRhJiBmYWNlX3ByZXNzZWQpOworCisgIHZpcnR1YWwgdm9pZCBQYWludChwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhLCBjb25zdCBwcDo6UmVjdCYgcmMpOworICB2aXJ0dWFsIGJvb2wgSGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KTsKKyAgdmlydHVhbCB2b2lkIE9uRXZlbnRDYXB0dXJlUmVsZWFzZWQoKTsKKyAgdmlydHVhbCB2b2lkIFNob3coYm9vbCB2aXNpYmxlLCBib29sIGludmFsaWRhdGUpOworICB2aXJ0dWFsIHZvaWQgQWRqdXN0VHJhbnNwYXJlbmN5KHVpbnQ4IHRyYW5zcGFyZW5jeSwgYm9vbCBpbnZhbGlkYXRlKTsKKworICBCdXR0b25TdGF0ZSBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQorICBib29sIElzUHJlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlKCkgPT0gQlVUVE9OX1BSRVNTRURfU1RJQ0tZOyB9CisgIHZvaWQgU2V0UHJlc3NlZFN0YXRlKGJvb2wgcHJlc3NlZCk7CisKKyBwcml2YXRlOgorICB2b2lkIE9uQnV0dG9uQ2xpY2tlZCgpOworCisgIGNvbnN0IHBwOjpJbWFnZURhdGEmIEdldEN1cnJlbnRJbWFnZSgpOworICB2b2lkIENoYW5nZVN0YXRlKEJ1dHRvblN0YXRlIG5ld19zdGF0ZSwgYm9vbCBmb3JjZSk7CisKKyAgQnV0dG9uU3R5bGUgc3R5bGVfOworICBCdXR0b25TdGF0ZSBzdGF0ZV87CisgIGJvb2wgaXNfcHJlc3NlZF87CisKKyAgcHA6OkltYWdlRGF0YSBub3JtYWxfOworICBwcDo6SW1hZ2VEYXRhIGhpZ2hsaWdodGVkXzsKKyAgcHA6OkltYWdlRGF0YSBwcmVzc2VkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKKyNlbmRpZiAgLy8gUERGX0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2NodW5rX3N0cmVhbS5jYyBiL3hmYV90ZXN0L3BkZi9jaHVua19zdHJlYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjOGY5NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9jaHVua19zdHJlYW0uY2MKQEAgLTAsMCArMSwxNzIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwZGYvY2h1bmtfc3RyZWFtLmgiCisKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworQ2h1bmtTdHJlYW06OkNodW5rU3RyZWFtKCkgeworfQorCitDaHVua1N0cmVhbTo6fkNodW5rU3RyZWFtKCkgeworfQorCit2b2lkIENodW5rU3RyZWFtOjpDbGVhcigpIHsKKyAgY2h1bmtzXy5jbGVhcigpOworICBkYXRhXy5jbGVhcigpOworfQorCit2b2lkIENodW5rU3RyZWFtOjpQcmVhbGxvY2F0ZShzaXplX3Qgc3RyZWFtX3NpemUpIHsKKyAgZGF0YV8ucmVzZXJ2ZShzdHJlYW1fc2l6ZSk7Cit9CisKK3NpemVfdCBDaHVua1N0cmVhbTo6R2V0U2l6ZSgpIHsKKyAgcmV0dXJuIGRhdGFfLnNpemUoKTsKK30KKworYm9vbCBDaHVua1N0cmVhbTo6V3JpdGVEYXRhKHNpemVfdCBvZmZzZXQsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKFNJWkVfTUFYIC0gc2l6ZSA8IG9mZnNldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGRhdGFfLnNpemUoKSA8IG9mZnNldCArIHNpemUpCisgICAgZGF0YV8ucmVzaXplKG9mZnNldCArIHNpemUpOworCisgIG1lbWNweSgmZGF0YV9bb2Zmc2V0XSwgYnVmZmVyLCBzaXplKTsKKworICBpZiAoY2h1bmtzXy5lbXB0eSgpKSB7CisgICAgY2h1bmtzX1tvZmZzZXRdID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0ZDo6bWFwPHNpemVfdCwgc2l6ZV90Pjo6aXRlcmF0b3Igc3RhcnQgPSBjaHVua3NfLnVwcGVyX2JvdW5kKG9mZnNldCk7CisgIGlmIChzdGFydCAhPSBjaHVua3NfLmJlZ2luKCkpCisgICAgLS1zdGFydDsgIC8vIHN0YXJ0IG5vdyBwb2ludHMgdG8gdGhlIGtleSBlcXVhbCBvciBsb3dlciB0aGFuIG9mZnNldC4KKyAgaWYgKHN0YXJ0LT5maXJzdCArIHN0YXJ0LT5zZWNvbmQgPCBvZmZzZXQpCisgICAgKytzdGFydDsgIC8vIHN0YXJ0IGVsZW1lbnQgaXMgZW50aXJlbHkgYmVmb3JlIGN1cnJlbnQgY2h1bmssIHNraXAgaXQuCisKKyAgc3RkOjptYXA8c2l6ZV90LCBzaXplX3Q+OjppdGVyYXRvciBlbmQgPSBjaHVua3NfLnVwcGVyX2JvdW5kKG9mZnNldCArIHNpemUpOworICBpZiAoc3RhcnQgPT0gZW5kKSB7ICAvLyBObyBjaHVua3MgdG8gbWVyZ2UuCisgICAgY2h1bmtzX1tvZmZzZXRdID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC0tZW5kOworCisgIHNpemVfdCBuZXdfb2Zmc2V0ID0gc3RkOjptaW48c2l6ZV90PihzdGFydC0+Zmlyc3QsIG9mZnNldCk7CisgIHNpemVfdCBuZXdfc2l6ZSA9CisgICAgICBzdGQ6Om1heDxzaXplX3Q+KGVuZC0+Zmlyc3QgKyBlbmQtPnNlY29uZCwgb2Zmc2V0ICsgc2l6ZSkgLSBuZXdfb2Zmc2V0OworCisgIGNodW5rc18uZXJhc2Uoc3RhcnQsICsrZW5kKTsKKworICBjaHVua3NfW25ld19vZmZzZXRdID0gbmV3X3NpemU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2h1bmtTdHJlYW06OlJlYWREYXRhKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB2b2lkKiBidWZmZXIpIGNvbnN0IHsKKyAgaWYgKCFJc1JhbmdlQXZhaWxhYmxlKG9mZnNldCwgc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1lbWNweShidWZmZXIsICZkYXRhX1tvZmZzZXRdLCBzaXplKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2h1bmtTdHJlYW06OkdldE1pc3NlZFJhbmdlcygKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+ID4qIHJhbmdlcykgY29uc3QgeworICBpZiAoSXNSYW5nZUF2YWlsYWJsZShvZmZzZXQsIHNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICByYW5nZXMtPmNsZWFyKCk7CisgIGlmIChjaHVua3NfLmVtcHR5KCkpIHsKKyAgICByYW5nZXMtPnB1c2hfYmFjayhzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+KG9mZnNldCwgc2l6ZSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RkOjptYXA8c2l6ZV90LCBzaXplX3Q+Ojpjb25zdF9pdGVyYXRvciBzdGFydCA9IGNodW5rc18udXBwZXJfYm91bmQob2Zmc2V0KTsKKyAgaWYgKHN0YXJ0ICE9IGNodW5rc18uYmVnaW4oKSkKKyAgICAtLXN0YXJ0OyAgLy8gc3RhcnQgbm93IHBvaW50cyB0byB0aGUga2V5IGVxdWFsIG9yIGxvd2VyIHRoYW4gb2Zmc2V0LgorICBpZiAoc3RhcnQtPmZpcnN0ICsgc3RhcnQtPnNlY29uZCA8IG9mZnNldCkKKyAgICArK3N0YXJ0OyAgLy8gc3RhcnQgZWxlbWVudCBpcyBlbnRpcmVseSBiZWZvcmUgY3VycmVudCBjaHVuaywgc2tpcCBpdC4KKworICBzdGQ6Om1hcDxzaXplX3QsIHNpemVfdD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9CisgICAgICBjaHVua3NfLnVwcGVyX2JvdW5kKG9mZnNldCArIHNpemUpOworICBpZiAoc3RhcnQgPT0gZW5kKSB7ICAvLyBObyBkYXRhIGluIHRoZSBjdXJyZW50IHJhbmdlIGF2YWlsYWJsZS4KKyAgICByYW5nZXMtPnB1c2hfYmFjayhzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+KG9mZnNldCwgc2l6ZSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc2l6ZV90IGN1cl9vZmZzZXQgPSBvZmZzZXQ7CisgIHN0ZDo6bWFwPHNpemVfdCwgc2l6ZV90Pjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBzdGFydDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgaWYgKGN1cl9vZmZzZXQgPCBpdC0+Zmlyc3QpIHsKKyAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IGl0LT5maXJzdCAtIGN1cl9vZmZzZXQ7CisgICAgICByYW5nZXMtPnB1c2hfYmFjayhzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+KGN1cl9vZmZzZXQsIG5ld19zaXplKSk7CisgICAgICBjdXJfb2Zmc2V0ID0gaXQtPmZpcnN0ICsgaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKGN1cl9vZmZzZXQgPCBpdC0+Zmlyc3QgKyBpdC0+c2Vjb25kKSB7CisgICAgICBjdXJfb2Zmc2V0ID0gaXQtPmZpcnN0ICsgaXQtPnNlY29uZDsKKyAgICB9CisgIH0KKworICAvLyBBZGQgbGFzdCBjaHVuay4KKyAgaWYgKGN1cl9vZmZzZXQgPCBvZmZzZXQgKyBzaXplKQorICAgIHJhbmdlcy0+cHVzaF9iYWNrKHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4oY3VyX29mZnNldCwKKyAgICAgICAgb2Zmc2V0ICsgc2l6ZSAtIGN1cl9vZmZzZXQpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDaHVua1N0cmVhbTo6SXNSYW5nZUF2YWlsYWJsZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICBpZiAoY2h1bmtzXy5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoU0laRV9NQVggLSBzaXplIDwgb2Zmc2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICBzdGQ6Om1hcDxzaXplX3QsIHNpemVfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2h1bmtzXy51cHBlcl9ib3VuZChvZmZzZXQpOworICBpZiAoaXQgPT0gY2h1bmtzXy5iZWdpbigpKQorICAgIHJldHVybiBmYWxzZTsgIC8vIE5vIGNodW5rcyBpbmNsdWRlcyBvZmZzZXQgYnl0ZS4KKworICAtLWl0OyAgLy8gTm93IGl0IHN0YXJ0cyBlcXVhbCBvciBiZWZvcmUgb2Zmc2V0LgorICByZXR1cm4gKGl0LT5maXJzdCArIGl0LT5zZWNvbmQpID49IChvZmZzZXQgKyBzaXplKTsKK30KKworc2l6ZV90IENodW5rU3RyZWFtOjpHZXRGaXJzdE1pc3NpbmdCeXRlKCkgY29uc3QgeworICBpZiAoY2h1bmtzXy5lbXB0eSgpKQorICAgIHJldHVybiAwOworICBzdGQ6Om1hcDxzaXplX3QsIHNpemVfdD46OmNvbnN0X2l0ZXJhdG9yIGJlZ2luID0gY2h1bmtzXy5iZWdpbigpOworICByZXR1cm4gYmVnaW4tPmZpcnN0ID4gMCA/IDAgOiBiZWdpbi0+c2Vjb25kOworfQorCitzaXplX3QgQ2h1bmtTdHJlYW06OkdldExhc3RCeXRlQmVmb3JlKHNpemVfdCBvZmZzZXQpIGNvbnN0IHsKKyAgaWYgKGNodW5rc18uZW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgc3RkOjptYXA8c2l6ZV90LCBzaXplX3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNodW5rc18udXBwZXJfYm91bmQob2Zmc2V0KTsKKyAgaWYgKGl0ID09IGNodW5rc18uYmVnaW4oKSkKKyAgICByZXR1cm4gMDsKKyAgLS1pdDsKKyAgcmV0dXJuIGl0LT5maXJzdCArIGl0LT5zZWNvbmQ7Cit9CisKK3NpemVfdCBDaHVua1N0cmVhbTo6R2V0Rmlyc3RCeXRlQWZ0ZXIoc2l6ZV90IG9mZnNldCkgY29uc3QgeworICBpZiAoY2h1bmtzXy5lbXB0eSgpKQorICAgIHJldHVybiAwOworICBzdGQ6Om1hcDxzaXplX3QsIHNpemVfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2h1bmtzXy51cHBlcl9ib3VuZChvZmZzZXQpOworICBpZiAoaXQgPT0gY2h1bmtzXy5lbmQoKSkKKyAgICByZXR1cm4gZGF0YV8uc2l6ZSgpOworICByZXR1cm4gaXQtPmZpcnN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2NodW5rX3N0cmVhbS5oIGIveGZhX3Rlc3QvcGRmL2NodW5rX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzFlYzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvY2h1bmtfc3RyZWFtLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQREZfQ0hVTktfU1RSRUFNX0hfCisjZGVmaW5lIFBERl9DSFVOS19TVFJFQU1fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCisvLyBUaGlzIGNsYXNzIGNvbGxlY3RzIGEgY2h1bmtzIG9mIGRhdGEgaW50byBvbmUgZGF0YSBzdHJlYW0uIENsaWVudCBjYW4gY2hlY2sKKy8vIGlmIGRhdGEgaW4gY2VydGFpbiByYW5nZSBpcyBhdmFpbGFibGUsIGFuZCBnZXQgbWlzc2luZyBjaHVua3Mgb2YgZGF0YS4KK2NsYXNzIENodW5rU3RyZWFtIHsKKyBwdWJsaWM6CisgIENodW5rU3RyZWFtKCk7CisgIH5DaHVua1N0cmVhbSgpOworCisgIHZvaWQgQ2xlYXIoKTsKKworICB2b2lkIFByZWFsbG9jYXRlKHNpemVfdCBzdHJlYW1fc2l6ZSk7CisgIHNpemVfdCBHZXRTaXplKCk7CisKKyAgYm9vbCBXcml0ZURhdGEoc2l6ZV90IG9mZnNldCwgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgIGJvb2wgUmVhZERhdGEoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIHZvaWQqIGJ1ZmZlcikgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB2ZWN0b3Igb2YgcGFpcnMgd2hlcmUgZmlyc3QgaXMgYW4gb2Zmc2V0LCBzZWNvbmQgaXMgYSBzaXplLgorICBib29sIEdldE1pc3NlZFJhbmdlcyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPiogcmFuZ2VzKSBjb25zdDsKKyAgYm9vbCBJc1JhbmdlQXZhaWxhYmxlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKKyAgc2l6ZV90IEdldEZpcnN0TWlzc2luZ0J5dGUoKSBjb25zdDsKKworICBzaXplX3QgR2V0TGFzdEJ5dGVCZWZvcmUoc2l6ZV90IG9mZnNldCkgY29uc3Q7CisgIHNpemVfdCBHZXRGaXJzdEJ5dGVBZnRlcihzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGRhdGFfOworCisgIC8vIFBhaXIsIGZpcnN0IC0gYmVnaW5pbmcgb2YgdGhlIGNodW5rLCBzZWNvbmQgLSBzaXplIG9mIHRoZSBjaHVuay4KKyAgc3RkOjptYXA8c2l6ZV90LCBzaXplX3Q+IGNodW5rc187Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvY29udHJvbC5jYyBiL3hmYV90ZXN0L3BkZi9jb250cm9sLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTExYjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvY29udHJvbC5jYwpAQCAtMCwwICsxLDExNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9jb250cm9sLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJwZGYvZHJhd191dGlscy5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK0NvbnRyb2w6OkNvbnRyb2woKQorICAgIDogaWRfKGtJbnZhbGlkQ29udHJvbElkKSwKKyAgICAgIHZpc2libGVfKGZhbHNlKSwKKyAgICAgIG93bmVyXyhOVUxMKSwKKyAgICAgIHRyYW5zcGFyZW5jeV8oa09wYXF1ZUFscGhhKSB7Cit9CisKK0NvbnRyb2w6On5Db250cm9sKCkgeworfQorCitib29sIENvbnRyb2w6OkNyZWF0ZSh1aW50MzIgaWQsIGNvbnN0IHBwOjpSZWN0JiByYywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmlzaWJsZSwgT3duZXIqIG93bmVyKSB7CisgIERDSEVDSyhvd25lcik7CisgIGlmIChvd25lcl8gfHwgaWQgPT0ga0ludmFsaWRDb250cm9sSWQpCisgICAgcmV0dXJuIGZhbHNlOyAgLy8gQWxyZWFkeSBjcmVhdGVkIG9yIGlkIGlzIGludmFsaWQuCisgIGlkXyA9IGlkOworICByY18gPSByYzsKKyAgdmlzaWJsZV8gPSB2aXNpYmxlOworICBvd25lcl8gPSBvd25lcjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29udHJvbDo6SGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDb250cm9sOjpQYWludE11bHRpcGxlUmVjdHMocHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxwcDo6UmVjdD4mIHJlY3RzKSB7CisgIERDSEVDSyhyZWN0cy5zaXplKCkgPiAwKTsKKyAgaWYgKHJlY3RzLnNpemUoKSA9PSAxKSB7CisgICAgUGFpbnQoaW1hZ2VfZGF0YSwgcmVjdHMuZnJvbnQoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gU29tZSByZWN0cyBpbiB0aGUgaW5wdXQgbGlzdCBtYXkgb3ZlcmxhcC4gVG8gcHJldmVudCBkb3VibGUKKyAgLy8gcGFpbnRpbmcgKGNhdXNlcyBwcm9ibGVtcyB3aXRoIHNlbWktdHJhbnNwYXJlbnQgY29udHJvbHMpIHdlJ2xsCisgIC8vIHBhaW50IGNvbnRyb2wgaW50byBidWZmZXIgaW1hZ2UgZGF0YSBvbmx5IG9uY2UgYW5kIGNvcHkgcmVxdWVzdGVkCisgIC8vIHJlY3RhbmdsZXMuCisgIHBwOjpJbWFnZURhdGEgYnVmZmVyKG93bmVyKCktPkdldEluc3RhbmNlKCksIGltYWdlX2RhdGEtPmZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICByZWN0KCkuc2l6ZSgpLCBmYWxzZSk7CisgIGlmIChidWZmZXIuaXNfbnVsbCgpKQorICAgIHJldHVybjsKKworICBwcDo6UmVjdCBkcmF3X3JjID0gcHA6OlJlY3QoaW1hZ2VfZGF0YS0+c2l6ZSgpKS5JbnRlcnNlY3QocmVjdCgpKTsKKyAgcHA6OlJlY3QgY3RybF9yYyA9IHBwOjpSZWN0KGRyYXdfcmMucG9pbnQoKSAtIHJlY3QoKS5wb2ludCgpLCBkcmF3X3JjLnNpemUoKSk7CisgIENvcHlJbWFnZSgqaW1hZ2VfZGF0YSwgZHJhd19yYywgJmJ1ZmZlciwgY3RybF9yYywgZmFsc2UpOworCisgIC8vIFRlbXBvcmFyeSBtb3ZlIGNvbnRyb2wgdG8gb3JpZ2luICgwLDApIGFuZCBkcmF3IGl0IGludG8gdGVtcCBidWZmZXIuCisgIC8vIE1vdmUgdG8gdGhlIG9yaWdpbmFsIHBvc2l0aW9uIGFmdGVyd2FyZC4gU2luY2UgdGhpcyBpcyBnb2luZyBvbiB0ZW1wCisgIC8vIGJ1ZmZlciwgd2UgZG9uJ3QgbmVlZCB0byBpbnZhbGlkYXRlIGhlcmUuCisgIHBwOjpSZWN0IHRlbXAgPSByZWN0KCk7CisgIE1vdmVUbyhwcDo6UG9pbnQoMCwgMCksIGZhbHNlKTsKKyAgUGFpbnQoJmJ1ZmZlciwgY3RybF9yYyk7CisgIE1vdmVUbyh0ZW1wLnBvaW50KCksIGZhbHNlKTsKKworICBzdGQ6Omxpc3Q8cHA6OlJlY3Q+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSByZWN0cy5iZWdpbigpOyBpdGVyICE9IHJlY3RzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBwcDo6UmVjdCBkcmF3X3JjID0gcmVjdCgpLkludGVyc2VjdCgqaXRlcik7CisgICAgaWYgKCFkcmF3X3JjLklzRW1wdHkoKSkgeworICAgICAgLy8gQ29weSByZXF1ZXN0ZWQgcmVjdCBmcm9tIHRoZSBidWZmZXIgaW1hZ2UuCisgICAgICBwcDo6UmVjdCBzcmNfcmMgPSBkcmF3X3JjOworICAgICAgc3JjX3JjLk9mZnNldCgtcmVjdCgpLngoKSwgLXJlY3QoKS55KCkpOworICAgICAgQ29weUltYWdlKGJ1ZmZlciwgc3JjX3JjLCBpbWFnZV9kYXRhLCBkcmF3X3JjLCBmYWxzZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29udHJvbDo6U2hvdyhib29sIHZpc2libGUsIGJvb2wgaW52YWxpZGF0ZSkgeworICBpZiAodmlzaWJsZV8gIT0gdmlzaWJsZSkgeworICAgIHZpc2libGVfID0gdmlzaWJsZTsKKyAgICBpZiAoaW52YWxpZGF0ZSkKKyAgICAgIG93bmVyXy0+SW52YWxpZGF0ZShpZF8sIHJjXyk7CisgIH0KK30KKwordm9pZCBDb250cm9sOjpBZGp1c3RUcmFuc3BhcmVuY3kodWludDggdHJhbnNwYXJlbmN5LCBib29sIGludmFsaWRhdGUpIHsKKyAgaWYgKHRyYW5zcGFyZW5jeV8gIT0gdHJhbnNwYXJlbmN5KSB7CisgICAgdHJhbnNwYXJlbmN5XyA9IHRyYW5zcGFyZW5jeTsKKyAgICBpZiAoaW52YWxpZGF0ZSAmJiB2aXNpYmxlXykKKyAgICAgIG93bmVyXy0+SW52YWxpZGF0ZShpZF8sIHJjXyk7CisgIH0KK30KKwordm9pZCBDb250cm9sOjpNb3ZlQnkoY29uc3QgcHA6OlBvaW50JiBvZmZzZXQsIGJvb2wgaW52YWxpZGF0ZSkgeworICBwcDo6UmVjdCBvbGRfcmMgPSByY187CisgIHJjXy5PZmZzZXQob2Zmc2V0KTsKKyAgaWYgKGludmFsaWRhdGUgJiYgdmlzaWJsZV8pIHsKKyAgICBvd25lcigpLT5JbnZhbGlkYXRlKGlkKCksIG9sZF9yYyk7CisgICAgb3duZXIoKS0+SW52YWxpZGF0ZShpZCgpLCByZWN0KCkpOworICB9Cit9CisKK3ZvaWQgQ29udHJvbDo6U2V0UmVjdChjb25zdCBwcDo6UmVjdCYgcmMsIGJvb2wgaW52YWxpZGF0ZSkgeworICBwcDo6UmVjdCBvbGRfcmMgPSByY187CisgIHJjXyA9IHJjOworICBpZiAoaW52YWxpZGF0ZSAmJiB2aXNpYmxlXykgeworICAgIG93bmVyKCktPkludmFsaWRhdGUoaWQoKSwgb2xkX3JjKTsKKyAgICBvd25lcigpLT5JbnZhbGlkYXRlKGlkKCksIHJlY3QoKSk7CisgIH0KK30KKwordm9pZCBDb250cm9sOjpNb3ZlVG8oY29uc3QgcHA6OlBvaW50JiBvcmlnaW4sIGJvb2wgaW52YWxpZGF0ZSkgeworICBNb3ZlQnkob3JpZ2luIC0gcmNfLnBvaW50KCksIGludmFsaWRhdGUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2NvbnRyb2wuaCBiL3hmYV90ZXN0L3BkZi9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiYjM3YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9jb250cm9sLmgKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQREZfQ09OVFJPTF9IXworI2RlZmluZSBQREZfQ09OVFJPTF9IXworCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorI2luY2x1ZGUgInBwYXBpL2MvZGV2L3BwX2N1cnNvcl90eXBlX2Rldi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9yZWN0LmgiCisKK25hbWVzcGFjZSBwcCB7CitjbGFzcyBJbWFnZURhdGE7CitjbGFzcyBJbnB1dEV2ZW50OworY2xhc3MgSW5zdGFuY2U7Cit9CisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY29uc3QgdWludDMyIGtJbnZhbGlkQ29udHJvbElkID0gMDsKKworY2xhc3MgQ29udHJvbCB7CisgcHVibGljOgorICBjbGFzcyBPd25lciB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+T3duZXIoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBPbkV2ZW50KHVpbnQzMiBjb250cm9sX2lkLCB1aW50MzIgZXZlbnRfaWQsIHZvaWQqIGRhdGEpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZSh1aW50MzIgY29udHJvbF9pZCwgY29uc3QgcHA6OlJlY3QmIHJjKSA9IDA7CisgICAgdmlydHVhbCB1aW50MzIgU2NoZWR1bGVUaW1lcih1aW50MzIgY29udHJvbF9pZCwgdWludDMyIHRpbWVvdXRfbXMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgU2V0RXZlbnRDYXB0dXJlKHVpbnQzMiBjb250cm9sX2lkLCBib29sIHNldF9jYXB0dXJlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFNldEN1cnNvcih1aW50MzIgY29udHJvbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQX0N1cnNvclR5cGVfRGV2IGN1cnNvcl90eXBlKSA9IDA7CisgICAgdmlydHVhbCBwcDo6SW5zdGFuY2UqIEdldEluc3RhbmNlKCkgPSAwOworICB9OworCisgIENvbnRyb2woKTsKKyAgdmlydHVhbCB+Q29udHJvbCgpOworICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKHVpbnQzMiBpZCwgY29uc3QgcHA6OlJlY3QmIHJjLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmlzaWJsZSwgT3duZXIqIG93bmVyKTsKKworICB2aXJ0dWFsIHZvaWQgUGFpbnQocHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwgY29uc3QgcHA6OlJlY3QmIHJjKSB7fQorICB2aXJ0dWFsIGJvb2wgSGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KTsKKyAgdmlydHVhbCB2b2lkIE9uVGltZXJGaXJlZCh1aW50MzIgdGltZXJfaWQpIHt9CisgIHZpcnR1YWwgdm9pZCBFdmVudENhcHR1cmVSZWxlYXNlZCgpIHt9CisKKyAgLy8gUGFpbnQgY29udHJvbCBpbnRvIG11bHRpcGxlIGRlc3RpbmF0aW9uIHJlY3RzLgorICB2aXJ0dWFsIHZvaWQgUGFpbnRNdWx0aXBsZVJlY3RzKHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHBwOjpSZWN0PiYgcmVjdHMpOworCisgIHZpcnR1YWwgdm9pZCBTaG93KGJvb2wgdmlzaWJsZSwgYm9vbCBpbnZhbGlkYXRlKTsKKyAgdmlydHVhbCB2b2lkIEFkanVzdFRyYW5zcGFyZW5jeSh1aW50OCB0cmFuc3BhcmVuY3ksIGJvb2wgaW52YWxpZGF0ZSk7CisgIHZpcnR1YWwgdm9pZCBNb3ZlQnkoY29uc3QgcHA6OlBvaW50JiBvZmZzZXQsIGJvb2wgaW52YWxpZGF0ZSk7CisgIHZpcnR1YWwgdm9pZCBTZXRSZWN0KGNvbnN0IHBwOjpSZWN0JiByYywgYm9vbCBpbnZhbGlkYXRlKTsKKworICB2b2lkIE1vdmVUbyhjb25zdCBwcDo6UG9pbnQmIG9yaWdpbiwgYm9vbCBpbnZhbGlkYXRlKTsKKworICB1aW50MzIgaWQoKSBjb25zdCB7IHJldHVybiBpZF87IH0KKyAgY29uc3QgcHA6OlJlY3QmIHJlY3QoKSBjb25zdCB7IHJldHVybiByY187IH0KKyAgYm9vbCB2aXNpYmxlKCkgY29uc3QgeyByZXR1cm4gdmlzaWJsZV87IH0KKyAgT3duZXIqIG93bmVyKCkgeyByZXR1cm4gb3duZXJfOyB9CisgIHVpbnQ4IHRyYW5zcGFyZW5jeSgpIGNvbnN0IHsgcmV0dXJuIHRyYW5zcGFyZW5jeV87IH0KKworIHByaXZhdGU6CisgIHVpbnQzMiBpZF87CisgIHBwOjpSZWN0IHJjXzsKKyAgYm9vbCB2aXNpYmxlXzsKKyAgT3duZXIqIG93bmVyXzsKKyAgdWludDggdHJhbnNwYXJlbmN5XzsKK307CisKK3R5cGVkZWYgQ29udHJvbDo6T3duZXIgQ29udHJvbE93bmVyOworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9DT05UUk9MX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvZG9jdW1lbnRfbG9hZGVyLmNjIGIveGZhX3Rlc3QvcGRmL2RvY3VtZW50X2xvYWRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYyOGE2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL2RvY3VtZW50X2xvYWRlci5jYwpAQCAtMCwwICsxLDUxMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9kb2N1bWVudF9sb2FkZXIuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfdXRpbC5oIgorI2luY2x1ZGUgInBwYXBpL2MvcHBfZXJyb3JzLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3VybF9sb2FkZXIuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvdXJsX3JlcXVlc3RfaW5mby5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC91cmxfcmVzcG9uc2VfaW5mby5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKKy8vIERvY3VtZW50IGJlbG93IHNpemUgd2lsbCBiZSBkb3dubG9hZGVkIGluIG9uZSBjaHVuay4KK2NvbnN0IHVpbnQzMiBrTWluRmlsZVNpemUgPSA2NCoxMDI0OworCitEb2N1bWVudExvYWRlcjo6RG9jdW1lbnRMb2FkZXIoQ2xpZW50KiBjbGllbnQpCisgICAgOiBjbGllbnRfKGNsaWVudCksIHBhcnRpYWxfZG9jdW1lbnRfKGZhbHNlKSwgcmVxdWVzdF9wZW5kaW5nXyhmYWxzZSksCisgICAgICBjdXJyZW50X3Bvc18oMCksIGN1cnJlbnRfY2h1bmtfc2l6ZV8oMCksIGN1cnJlbnRfY2h1bmtfcmVhZF8oMCksCisgICAgICBkb2N1bWVudF9zaXplXygwKSwgaGVhZGVyX3JlcXVlc3RfKHRydWUpLCBpc19tdWx0aXBhcnRfKGZhbHNlKSB7CisgIGxvYWRlcl9mYWN0b3J5Xy5Jbml0aWFsaXplKHRoaXMpOworfQorCitEb2N1bWVudExvYWRlcjo6fkRvY3VtZW50TG9hZGVyKCkgeworfQorCitib29sIERvY3VtZW50TG9hZGVyOjpJbml0KGNvbnN0IHBwOjpVUkxMb2FkZXImIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhlYWRlcnMpIHsKKyAgRENIRUNLKHVybF8uZW1wdHkoKSk7CisgIHVybF8gPSB1cmw7CisgIGxvYWRlcl8gPSBsb2FkZXI7CisKKyAgc3RkOjpzdHJpbmcgcmVzcG9uc2VfaGVhZGVyczsKKyAgaWYgKCFoZWFkZXJzLmVtcHR5KCkpIHsKKyAgICByZXNwb25zZV9oZWFkZXJzID0gaGVhZGVyczsKKyAgfSBlbHNlIHsKKyAgICBwcDo6VVJMUmVzcG9uc2VJbmZvIHJlc3BvbnNlID0gbG9hZGVyXy5HZXRSZXNwb25zZUluZm8oKTsKKyAgICBwcDo6VmFyIGhlYWRlcnNfdmFyID0gcmVzcG9uc2UuR2V0SGVhZGVycygpOworCisgICAgaWYgKGhlYWRlcnNfdmFyLmlzX3N0cmluZygpKSB7CisgICAgICByZXNwb25zZV9oZWFkZXJzID0gaGVhZGVyc192YXIuQXNTdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBib29sIGFjY2VwdF9yYW5nZXNfYnl0ZXMgPSBmYWxzZTsKKyAgYm9vbCBjb250ZW50X2VuY29kZWQgPSBmYWxzZTsKKyAgdWludDMyIGNvbnRlbnRfbGVuZ3RoID0gMDsKKyAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgc3RkOjpzdHJpbmcgZGlzcG9zaXRpb247CisgIGlmICghcmVzcG9uc2VfaGVhZGVycy5lbXB0eSgpKSB7CisgICAgbmV0OjpIdHRwVXRpbDo6SGVhZGVyc0l0ZXJhdG9yIGl0KHJlc3BvbnNlX2hlYWRlcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfaGVhZGVycy5lbmQoKSwgIlxuIik7CisgICAgd2hpbGUgKGl0LkdldE5leHQoKSkgeworICAgICAgaWYgKExvd2VyQ2FzZUVxdWFsc0FTQ0lJKGl0Lm5hbWUoKSwgImNvbnRlbnQtbGVuZ3RoIikpIHsKKyAgICAgICAgY29udGVudF9sZW5ndGggPSBhdG9pKGl0LnZhbHVlcygpLmNfc3RyKCkpOworICAgICAgfSBlbHNlIGlmIChMb3dlckNhc2VFcXVhbHNBU0NJSShpdC5uYW1lKCksICJhY2NlcHQtcmFuZ2VzIikpIHsKKyAgICAgICAgYWNjZXB0X3Jhbmdlc19ieXRlcyA9IExvd2VyQ2FzZUVxdWFsc0FTQ0lJKGl0LnZhbHVlcygpLCAiYnl0ZXMiKTsKKyAgICAgIH0gZWxzZSBpZiAoTG93ZXJDYXNlRXF1YWxzQVNDSUkoaXQubmFtZSgpLCAiY29udGVudC1lbmNvZGluZyIpKSB7CisgICAgICAgIGNvbnRlbnRfZW5jb2RlZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKExvd2VyQ2FzZUVxdWFsc0FTQ0lJKGl0Lm5hbWUoKSwgImNvbnRlbnQtdHlwZSIpKSB7CisgICAgICAgIHR5cGUgPSBpdC52YWx1ZXMoKTsKKyAgICAgICAgc2l6ZV90IHNlbWlfY29sb25fcG9zID0gdHlwZS5maW5kKCc7Jyk7CisgICAgICAgIGlmIChzZW1pX2NvbG9uX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgIHR5cGUgPSB0eXBlLnN1YnN0cigwLCBzZW1pX2NvbG9uX3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgVHJpbVdoaXRlc3BhY2UodHlwZSwgYmFzZTo6VFJJTV9BTEwsICZ0eXBlKTsKKyAgICAgIH0gZWxzZSBpZiAoTG93ZXJDYXNlRXF1YWxzQVNDSUkoaXQubmFtZSgpLCAiY29udGVudC1kaXNwb3NpdGlvbiIpKSB7CisgICAgICAgIGRpc3Bvc2l0aW9uID0gaXQudmFsdWVzKCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghdHlwZS5lbXB0eSgpICYmCisgICAgICAhRW5kc1dpdGgodHlwZSwgIi9wZGYiLCBmYWxzZSkgJiYKKyAgICAgICFFbmRzV2l0aCh0eXBlLCAiLnBkZiIsIGZhbHNlKSAmJgorICAgICAgIUVuZHNXaXRoKHR5cGUsICIveC1wZGYiLCBmYWxzZSkgJiYKKyAgICAgICFFbmRzV2l0aCh0eXBlLCAiLyoiLCBmYWxzZSkgJiYKKyAgICAgICFFbmRzV2l0aCh0eXBlLCAiL2Fjcm9iYXQiLCBmYWxzZSkgJiYKKyAgICAgICFFbmRzV2l0aCh0eXBlLCAiL3Vua25vd24iLCBmYWxzZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKFN0YXJ0c1dpdGhBU0NJSShkaXNwb3NpdGlvbiwgImF0dGFjaG1lbnQiLCBmYWxzZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoY29udGVudF9sZW5ndGggPiAwKQorICAgIGNodW5rX3N0cmVhbV8uUHJlYWxsb2NhdGUoY29udGVudF9sZW5ndGgpOworCisgIGRvY3VtZW50X3NpemVfID0gY29udGVudF9sZW5ndGg7CisgIHJlcXVlc3RzX2NvdW50XyA9IDA7CisKKyAgLy8gRW5hYmxlIHBhcnRpYWwgbG9hZGluZyBvbmx5IGlmIGZpbGUgc2l6ZSBpcyBhYm92ZSB0aGUgdGhyZXNob2xkLgorICAvLyBJdCB3aWxsIGFsbG93IGF2b2lkaW5nIGxhdGVuY3kgZm9yIG11bHRpcGxlIHJlcXVlc3RzLgorICBpZiAoY29udGVudF9sZW5ndGggPiBrTWluRmlsZVNpemUgJiYKKyAgICAgIGFjY2VwdF9yYW5nZXNfYnl0ZXMgJiYKKyAgICAgICFjb250ZW50X2VuY29kZWQpIHsKKyAgICBMb2FkUGFydGlhbERvY3VtZW50KCk7CisgIH0gZWxzZSB7CisgICAgTG9hZEZ1bGxEb2N1bWVudCgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpMb2FkUGFydGlhbERvY3VtZW50KCkgeworICBwYXJ0aWFsX2RvY3VtZW50XyA9IHRydWU7CisgIC8vIEZvcmNlIHRoZSBtYWluIHJlcXVlc3QgdG8gYmUgY2FuY2VsbGVkLCBzaW5jZSBpZiB3ZSdyZSBhIGZ1bGwtZnJhbWUgcGx1Z2luCisgIC8vIHRoZXJlIGNvdWxkIGJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlIGxvYWRlci4KKyAgbG9hZGVyXy5DbG9zZSgpOworICBsb2FkZXJfID0gcHA6OlVSTExvYWRlcigpOworICAvLyBEb3dubG9hZCBmaWxlIGhlYWRlci4KKyAgaGVhZGVyX3JlcXVlc3RfID0gdHJ1ZTsKKyAgUmVxdWVzdERhdGEoMCwgc3RkOjptaW4oR2V0UmVxdWVzdFNpemUoKSwgZG9jdW1lbnRfc2l6ZV8pKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6TG9hZEZ1bGxEb2N1bWVudCgpIHsKKyAgcGFydGlhbF9kb2N1bWVudF8gPSBmYWxzZTsKKyAgY2h1bmtfYnVmZmVyXy5jbGVhcigpOworICBSZWFkTW9yZSgpOworfQorCitib29sIERvY3VtZW50TG9hZGVyOjpJc0RvY3VtZW50Q29tcGxldGUoKSBjb25zdCB7CisgIGlmIChkb2N1bWVudF9zaXplXyA9PSAwKSAgLy8gRG9jdW1lbnQgc2l6ZSB1bmtub3duLgorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIElzRGF0YUF2YWlsYWJsZSgwLCBkb2N1bWVudF9zaXplXyk7Cit9CisKK3VpbnQzMiBEb2N1bWVudExvYWRlcjo6R2V0QXZhaWxhYmxlRGF0YSgpIGNvbnN0IHsKKyAgaWYgKGRvY3VtZW50X3NpemVfID09IDApIHsgIC8vIElmIGRvY3VtZW50IHNpemUgaXMgdW5rbm93bi4KKyAgICByZXR1cm4gY3VycmVudF9wb3NfOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiA+IHJhbmdlczsKKyAgY2h1bmtfc3RyZWFtXy5HZXRNaXNzZWRSYW5nZXMoMCwgZG9jdW1lbnRfc2l6ZV8sICZyYW5nZXMpOworICB1aW50MzIgYXZhaWxhYmxlID0gZG9jdW1lbnRfc2l6ZV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPjo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSByYW5nZXMuYmVnaW4oKTsgaXQgIT0gcmFuZ2VzLmVuZCgpOyArK2l0KSB7CisgICAgYXZhaWxhYmxlIC09IGl0LT5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6Q2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7CisgIC8vIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBxdWV1ZSBpcyBwZW5kaW5nIChuZWVkIHRvIGtlZXAgaXQgaW4gdGhlIHF1ZXVlKS4KKyAgaWYgKHBlbmRpbmdfcmVxdWVzdHNfLnNpemUoKSA+IDEpIHsKKyAgICAvLyBSZW1vdmUgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLgorICAgIHBlbmRpbmdfcmVxdWVzdHNfLmVyYXNlKCsrcGVuZGluZ19yZXF1ZXN0c18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3JlcXVlc3RzXy5lbmQoKSk7CisgIH0KK30KKworYm9vbCBEb2N1bWVudExvYWRlcjo6R2V0QmxvY2sodWludDMyIHBvc2l0aW9uLCB1aW50MzIgc2l6ZSwgdm9pZCogYnVmKSBjb25zdCB7CisgIHJldHVybiBjaHVua19zdHJlYW1fLlJlYWREYXRhKHBvc2l0aW9uLCBzaXplLCBidWYpOworfQorCitib29sIERvY3VtZW50TG9hZGVyOjpJc0RhdGFBdmFpbGFibGUodWludDMyIHBvc2l0aW9uLCB1aW50MzIgc2l6ZSkgY29uc3QgeworICByZXR1cm4gY2h1bmtfc3RyZWFtXy5Jc1JhbmdlQXZhaWxhYmxlKHBvc2l0aW9uLCBzaXplKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6UmVxdWVzdERhdGEodWludDMyIHBvc2l0aW9uLCB1aW50MzIgc2l6ZSkgeworICBEQ0hFQ0socGFydGlhbF9kb2N1bWVudF8pOworCisgIC8vIFdlIGhhdmUgc29tZSBhcnRlZmFjdCByZXF1ZXN0IGZyb20KKyAgLy8gUERGaXVtRW5naW5lOjpPbkRvY3VtZW50Q29tcGxldGUoKSAtPiBGUERGQXZhaWxfSXNQYWdlQXZhaWwgYWZ0ZXIKKyAgLy8gZG9jdW1lbnQgaXMgY29tcGxldGUuCisgIC8vIFdlIG5lZWQgdGhpcyBmaXggaW4gUERGSXVtLiBBZGRpbmcgdGhpcyBhcyBhIHdvcmsgYXJvdW5kLgorICAvLyBCdWc6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTc5OTk2CisgIC8vIFRlc3QgdXJsOgorICAvLyBodHRwOi8vd3d3LmljYW5uLm9yZy9lbi9jb3JyZXNwb25kZW5jZS9ob2x0em1hbi10by1qZWZmcmV5LTAybWFyMTEtZW4ucGRmCisgIGlmIChJc0RvY3VtZW50Q29tcGxldGUoKSkKKyAgICByZXR1cm47CisKKyAgcGVuZGluZ19yZXF1ZXN0c18ucHVzaF9iYWNrKHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4ocG9zaXRpb24sIHNpemUpKTsKKyAgRG93bmxvYWRQZW5kaW5nUmVxdWVzdHMoKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6RG93bmxvYWRQZW5kaW5nUmVxdWVzdHMoKSB7CisgIGlmIChyZXF1ZXN0X3BlbmRpbmdfIHx8IHBlbmRpbmdfcmVxdWVzdHNfLmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIC8vIFJlbW92ZSBhbHJlYWR5IGNvbXBsZXRlZCByZXF1ZXN0cy4KKyAgLy8gQnkgZGVzaWduIERvd25sb2FkUGVuZGluZ1JlcXVlc3RzKCkgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSByZXF1ZXN0IGluIHRoZQorICAvLyBxdWV1ZS4gUmVhZENvbXBsZXRlKCkgd2lsbCByZW1vdmUgdGhlIGxhc3QgcGVuZGluZyBjb21tZW50IGZyb20gdGhlIHF1ZXVlLgorICB3aGlsZSAocGVuZGluZ19yZXF1ZXN0c18uc2l6ZSgpID4gMSkgeworICAgIGlmIChJc0RhdGFBdmFpbGFibGUocGVuZGluZ19yZXF1ZXN0c18uZnJvbnQoKS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfcmVxdWVzdHNfLmZyb250KCkuc2Vjb25kKSkgeworICAgICAgcGVuZGluZ19yZXF1ZXN0c18ucG9wX2Zyb250KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHVpbnQzMiBwb3MgPSBwZW5kaW5nX3JlcXVlc3RzXy5mcm9udCgpLmZpcnN0OworICB1aW50MzIgc2l6ZSA9IHBlbmRpbmdfcmVxdWVzdHNfLmZyb250KCkuc2Vjb25kOworICBpZiAoSXNEYXRhQXZhaWxhYmxlKHBvcywgc2l6ZSkpIHsKKyAgICBSZWFkQ29tcGxldGUoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiBjdXJyZW50IHJlcXVlc3QgaGFzIGJlZW4gcGFydGlhbGx5IGRvd25sb2FkZWQgYWxyZWFkeSwgc3BsaXQgaXQgaW50bworICAvLyBhIGZldyBzbWFsbGVyIHJlcXVlc3RzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+ID4gcmFuZ2VzOworICBjaHVua19zdHJlYW1fLkdldE1pc3NlZFJhbmdlcyhwb3MsIHNpemUsICZyYW5nZXMpOworICBpZiAocmFuZ2VzLnNpemUoKSA+IDApIHsKKyAgICBwZW5kaW5nX3JlcXVlc3RzXy5wb3BfZnJvbnQoKTsKKyAgICBwZW5kaW5nX3JlcXVlc3RzXy5pbnNlcnQocGVuZGluZ19yZXF1ZXN0c18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLmJlZ2luKCksIHJhbmdlcy5lbmQoKSk7CisgICAgcG9zID0gcGVuZGluZ19yZXF1ZXN0c18uZnJvbnQoKS5maXJzdDsKKyAgICBzaXplID0gcGVuZGluZ19yZXF1ZXN0c18uZnJvbnQoKS5zZWNvbmQ7CisgIH0KKworICB1aW50MzIgY3VyX3JlcXVlc3Rfc2l6ZSA9IEdldFJlcXVlc3RTaXplKCk7CisgIC8vIElmIHNpemUgaXMgbGVzcyB0aGFuIGRlZmF1bHQgcmVxdWVzdCwgdHJ5IHRvIGV4cGFuZCBkb3dubG9hZCByYW5nZSBmb3IKKyAgLy8gbW9yZSBvcHRpbWFsIGRvd25sb2FkLgorICBpZiAoc2l6ZSA8IGN1cl9yZXF1ZXN0X3NpemUgJiYgcGFydGlhbF9kb2N1bWVudF8pIHsKKyAgICAvLyBGaXJzdCwgdHJ5IHRvIGV4cGFuZCBibG9jayB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgdWludDMyIG5ld19wb3MgPSBwb3M7CisgICAgdWludDMyIG5ld19zaXplID0gY3VyX3JlcXVlc3Rfc2l6ZTsKKyAgICBpZiAocG9zICsgbmV3X3NpemUgPiBkb2N1bWVudF9zaXplXykKKyAgICAgIG5ld19zaXplID0gZG9jdW1lbnRfc2l6ZV8gLSBwb3M7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+ID4gcmFuZ2VzOworICAgIGlmIChjaHVua19zdHJlYW1fLkdldE1pc3NlZFJhbmdlcyhuZXdfcG9zLCBuZXdfc2l6ZSwgJnJhbmdlcykpIHsKKyAgICAgIG5ld19wb3MgPSByYW5nZXNbMF0uZmlyc3Q7CisgICAgICBuZXdfc2l6ZSA9IHJhbmdlc1swXS5zZWNvbmQ7CisgICAgfQorCisgICAgLy8gU2Vjb25kLCB0cnkgdG8gZXhwYW5kIGJsb2NrIHRvd2FyZHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICBpZiAobmV3X3NpemUgPCBjdXJfcmVxdWVzdF9zaXplKSB7CisgICAgICB1aW50MzIgYmxvY2tfZW5kID0gbmV3X3BvcyArIG5ld19zaXplOworICAgICAgaWYgKGJsb2NrX2VuZCA+IGN1cl9yZXF1ZXN0X3NpemUpIHsKKyAgICAgICAgbmV3X3BvcyA9IGJsb2NrX2VuZCAtIGN1cl9yZXF1ZXN0X3NpemU7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXdfcG9zID0gMDsKKyAgICAgIH0KKyAgICAgIG5ld19zaXplID0gYmxvY2tfZW5kIC0gbmV3X3BvczsKKworICAgICAgaWYgKGNodW5rX3N0cmVhbV8uR2V0TWlzc2VkUmFuZ2VzKG5ld19wb3MsIG5ld19zaXplLCAmcmFuZ2VzKSkgeworICAgICAgICBuZXdfcG9zID0gcmFuZ2VzLmJhY2soKS5maXJzdDsKKyAgICAgICAgbmV3X3NpemUgPSByYW5nZXMuYmFjaygpLnNlY29uZDsKKyAgICAgIH0KKyAgICB9CisgICAgcG9zID0gbmV3X3BvczsKKyAgICBzaXplID0gbmV3X3NpemU7CisgIH0KKworICBzaXplX3QgbGFzdF9ieXRlX2JlZm9yZSA9IGNodW5rX3N0cmVhbV8uR2V0TGFzdEJ5dGVCZWZvcmUocG9zKTsKKyAgc2l6ZV90IGZpcnN0X2J5dGVfYWZ0ZXIgPSBjaHVua19zdHJlYW1fLkdldEZpcnN0Qnl0ZUFmdGVyKHBvcyArIHNpemUgLSAxKTsKKyAgaWYgKHBvcyAtIGxhc3RfYnl0ZV9iZWZvcmUgPCBjdXJfcmVxdWVzdF9zaXplKSB7CisgICAgc2l6ZSA9IHBvcyArIHNpemUgLSBsYXN0X2J5dGVfYmVmb3JlOworICAgIHBvcyA9IGxhc3RfYnl0ZV9iZWZvcmU7CisgIH0KKworICBpZiAoKHBvcyArIHNpemUgPCBmaXJzdF9ieXRlX2FmdGVyKSAmJgorICAgICAgKHBvcyArIHNpemUgKyBjdXJfcmVxdWVzdF9zaXplID49IGZpcnN0X2J5dGVfYWZ0ZXIpKQorICAgIHNpemUgPSBmaXJzdF9ieXRlX2FmdGVyIC0gcG9zOworCisgIHJlcXVlc3RfcGVuZGluZ18gPSB0cnVlOworCisgIC8vIFN0YXJ0IGRvd25sb2FkaW5nIGZpcnN0IHBlbmRpbmcgcmVxdWVzdC4KKyAgbG9hZGVyXy5DbG9zZSgpOworICBsb2FkZXJfID0gY2xpZW50Xy0+Q3JlYXRlVVJMTG9hZGVyKCk7CisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgbG9hZGVyX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZEb2N1bWVudExvYWRlcjo6RGlkT3Blbik7CisgIHBwOjpVUkxSZXF1ZXN0SW5mbyByZXF1ZXN0ID0gR2V0UmVxdWVzdChwb3MsIHNpemUpOworICByZXF1ZXN0c19jb3VudF8rKzsKKyAgaW50IHJ2ID0gbG9hZGVyXy5PcGVuKHJlcXVlc3QsIGNhbGxiYWNrKTsKKyAgaWYgKHJ2ICE9IFBQX09LX0NPTVBMRVRJT05QRU5ESU5HKQorICAgIGNhbGxiYWNrLlJ1bihydik7Cit9CisKK3BwOjpVUkxSZXF1ZXN0SW5mbyBEb2N1bWVudExvYWRlcjo6R2V0UmVxdWVzdCh1aW50MzIgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHNpemUpIGNvbnN0IHsKKyAgcHA6OlVSTFJlcXVlc3RJbmZvIHJlcXVlc3QoY2xpZW50Xy0+R2V0UGx1Z2luSW5zdGFuY2UoKSk7CisgIHJlcXVlc3QuU2V0VVJMKHVybF8uY19zdHIoKSk7CisgIHJlcXVlc3QuU2V0TWV0aG9kKCJHRVQiKTsKKyAgcmVxdWVzdC5TZXRGb2xsb3dSZWRpcmVjdHModHJ1ZSk7CisKKyAgY29uc3Qgc2l6ZV90IGtCdWZTaXplID0gMTAwOworICBjaGFyIGJ1ZltrQnVmU2l6ZV07CisgIC8vIEFjY29yZGluZyB0byByZmMyNjE2LCBieXRlIHJhbmdlIHNwZWNpZmllcyBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYW5kIGxhc3QKKyAgLy8gYnl0ZXMgaW4gdGhlIHJlcXVlc3RlZCByYW5nZSBpbmNsdXNpdmVseS4gVGhlcmVmb3JlIHdlIHNob3VsZCBzdWJ0cmFjdCAxCisgIC8vIGZyb20gdGhlIHBvc2l0aW9uICsgc2l6ZSwgdG8gZ2V0IGluZGV4IG9mIHRoZSBsYXN0IGJ5dGUgdGhhdCBuZWVkcyB0byBiZQorICAvLyBkb3dubG9hZGVkLgorICBiYXNlOjpzbnByaW50ZihidWYsIGtCdWZTaXplLCAiUmFuZ2U6IGJ5dGVzPSVkLSVkIiwgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgIHBvc2l0aW9uICsgc2l6ZSAtIDEpOworICBwcDo6VmFyIGhlYWRlcihidWYpOworICByZXF1ZXN0LlNldEhlYWRlcnMoaGVhZGVyKTsKKworICByZXR1cm4gcmVxdWVzdDsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6RGlkT3BlbihpbnQzMl90IHJlc3VsdCkgeworICBpZiAocmVzdWx0ICE9IFBQX09LKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgaHR0cF9jb2RlID0gbG9hZGVyXy5HZXRSZXNwb25zZUluZm8oKS5HZXRTdGF0dXNDb2RlKCk7CisgIGlmIChodHRwX2NvZGUgPj0gNDAwICYmIGh0dHBfY29kZSA8IDUwMCkgeworICAgIC8vIEVycm9yIGFjY2Vzc2luZyByZXNvdXJjZS4gNHh4IGVycm9yIGluZGljYXRlIHN1YnNlcXVlbnQgcmVxdWVzdHMKKyAgICAvLyB3aWxsIGZhaWwgdG9vLgorICAgIC8vIEUuZy4gcmVzb3VyY2UgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIgd2hpbGUgbG9hZGluZyBpdC4KKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDE0ODI3CisgICAgcmV0dXJuOworICB9CisKKyAgaXNfbXVsdGlwYXJ0XyA9IGZhbHNlOworICBjdXJyZW50X2NodW5rX3NpemVfID0gMDsKKyAgY3VycmVudF9jaHVua19yZWFkXyA9IDA7CisKKyAgcHA6OlZhciBoZWFkZXJzX3ZhciA9IGxvYWRlcl8uR2V0UmVzcG9uc2VJbmZvKCkuR2V0SGVhZGVycygpOworICBzdGQ6OnN0cmluZyBoZWFkZXJzOworICBpZiAoaGVhZGVyc192YXIuaXNfc3RyaW5nKCkpCisgICAgaGVhZGVycyA9IGhlYWRlcnNfdmFyLkFzU3RyaW5nKCk7CisKKyAgc3RkOjpzdHJpbmcgYm91bmRhcnkgPSBHZXRNdWx0aVBhcnRCb3VuZGFyeShoZWFkZXJzKTsKKyAgaWYgKGJvdW5kYXJ5LnNpemUoKSkgeworICAgIC8vIExlYXZlIHBvc2l0aW9uIHVudG91Y2hlZCBmb3Igbm93LCB3aGVuIHdlIHJlYWQgdGhlIGRhdGEgd2UnbGwgZ2V0IGl0LgorICAgIGlzX211bHRpcGFydF8gPSB0cnVlOworICAgIG11bHRpcGFydF9ib3VuZGFyeV8gPSBib3VuZGFyeTsKKyAgfSBlbHNlIHsKKyAgICAvLyBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgcmV0dXJuZWQgYSBieXRlLXJhbmdlLCBzaW5jZSBpdCdzCisgICAgLy8gcG9zc2libGUgZm9yIGEgc2VydmVyIHRvIGp1c3QgaWdub3JlIG91ciBieWUtcmFuZ2UgcmVxdWVzdCBhbmQganVzdAorICAgIC8vIHJldHVybiB0aGUgZW50aXJlIGRvY3VtZW50IGV2ZW4gaWYgaXQgc3VwcG9ydHMgYnl0ZS1yYW5nZSByZXF1ZXN0cy4KKyAgICAvLyBpLmUuIHNuaWZmIHJlc3BvbnNlIHRvCisgICAgLy8gaHR0cDovL3d3dy5hY3Qub3JnL2NvbXBhc3Mvc2FtcGxlL3BkZi9nZW9tZXRyeS5wZGYKKyAgICBjdXJyZW50X3Bvc18gPSAwOworICAgIHVpbnQzMiBzdGFydF9wb3MsIGVuZF9wb3M7CisgICAgaWYgKEdldEJ5dGVSYW5nZShoZWFkZXJzLCAmc3RhcnRfcG9zLCAmZW5kX3BvcykpIHsKKyAgICAgIGN1cnJlbnRfcG9zXyA9IHN0YXJ0X3BvczsKKyAgICAgIGlmIChlbmRfcG9zICYmIGVuZF9wb3MgPiBzdGFydF9wb3MpCisgICAgICAgIGN1cnJlbnRfY2h1bmtfc2l6ZV8gPSBlbmRfcG9zIC0gc3RhcnRfcG9zICsgMTsKKyAgICB9CisgIH0KKworICBSZWFkTW9yZSgpOworfQorCitib29sIERvY3VtZW50TG9hZGVyOjpHZXRCeXRlUmFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGhlYWRlcnMsIHVpbnQzMiogc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyKiBlbmQpIHsKKyAgbmV0OjpIdHRwVXRpbDo6SGVhZGVyc0l0ZXJhdG9yIGl0KGhlYWRlcnMuYmVnaW4oKSwgaGVhZGVycy5lbmQoKSwgIlxuIik7CisgIHdoaWxlIChpdC5HZXROZXh0KCkpIHsKKyAgICBpZiAoTG93ZXJDYXNlRXF1YWxzQVNDSUkoaXQubmFtZSgpLCAiY29udGVudC1yYW5nZSIpKSB7CisgICAgICBzdGQ6OnN0cmluZyByYW5nZSA9IGl0LnZhbHVlcygpLmNfc3RyKCk7CisgICAgICBpZiAoU3RhcnRzV2l0aEFTQ0lJKHJhbmdlLCAiYnl0ZXMiLCBmYWxzZSkpIHsKKyAgICAgICAgcmFuZ2UgPSByYW5nZS5zdWJzdHIoc3RybGVuKCJieXRlcyIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSByYW5nZS5maW5kKCctJyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJhbmdlX2VuZDsKKyAgICAgICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICByYW5nZV9lbmQgPSByYW5nZS5zdWJzdHIocG9zICsgMSk7CisgICAgICAgIFRyaW1XaGl0ZXNwYWNlQVNDSUkocmFuZ2UsIGJhc2U6OlRSSU1fTEVBRElORywgJnJhbmdlKTsKKyAgICAgICAgVHJpbVdoaXRlc3BhY2VBU0NJSShyYW5nZV9lbmQsIGJhc2U6OlRSSU1fTEVBRElORywgJnJhbmdlX2VuZCk7CisgICAgICAgICpzdGFydCA9IGF0b2kocmFuZ2UuY19zdHIoKSk7CisgICAgICAgICplbmQgPSBhdG9pKHJhbmdlX2VuZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzdHJpbmcgRG9jdW1lbnRMb2FkZXI6OkdldE11bHRpUGFydEJvdW5kYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBoZWFkZXJzKSB7CisgIG5ldDo6SHR0cFV0aWw6OkhlYWRlcnNJdGVyYXRvciBpdChoZWFkZXJzLmJlZ2luKCksIGhlYWRlcnMuZW5kKCksICJcbiIpOworICB3aGlsZSAoaXQuR2V0TmV4dCgpKSB7CisgICAgaWYgKExvd2VyQ2FzZUVxdWFsc0FTQ0lJKGl0Lm5hbWUoKSwgImNvbnRlbnQtdHlwZSIpKSB7CisgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gYmFzZTo6U3RyaW5nVG9Mb3dlckFTQ0lJKGl0LnZhbHVlcygpKTsKKyAgICAgIGlmIChTdGFydHNXaXRoQVNDSUkodHlwZSwgIm11bHRpcGFydC8iLCB0cnVlKSkgeworICAgICAgICBjb25zdCBjaGFyKiBib3VuZGFyeSA9IHN0cnN0cih0eXBlLmNfc3RyKCksICJib3VuZGFyeT0iKTsKKyAgICAgICAgaWYgKCFib3VuZGFyeSkgeworICAgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhib3VuZGFyeSArIDkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6UmVhZE1vcmUoKSB7CisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgICBsb2FkZXJfZmFjdG9yeV8uTmV3Q2FsbGJhY2soJkRvY3VtZW50TG9hZGVyOjpEaWRSZWFkKTsKKyAgaW50IHJ2ID0gbG9hZGVyXy5SZWFkUmVzcG9uc2VCb2R5KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgY2FsbGJhY2spOworICBpZiAocnYgIT0gUFBfT0tfQ09NUExFVElPTlBFTkRJTkcpCisgICAgY2FsbGJhY2suUnVuKHJ2KTsKK30KKwordm9pZCBEb2N1bWVudExvYWRlcjo6RGlkUmVhZChpbnQzMl90IHJlc3VsdCkgeworICBpZiAocmVzdWx0ID4gMCkgeworICAgIGNoYXIqIHN0YXJ0ID0gYnVmZmVyXzsKKyAgICBzaXplX3QgbGVuZ3RoID0gcmVzdWx0OworICAgIGlmIChpc19tdWx0aXBhcnRfICYmIHJlc3VsdCA+IDIpIHsKKyAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgcmVzdWx0OyArK2kpIHsKKyAgICAgICAgaWYgKChidWZmZXJfW2kgLSAxXSA9PSAnXG4nICYmIGJ1ZmZlcl9baSAtIDJdID09ICdcbicpIHx8CisgICAgICAgICAgICAoaSA+PSA0ICYmCisgICAgICAgICAgICAgYnVmZmVyX1tpIC0gMV0gPT0gJ1xuJyAmJiBidWZmZXJfW2kgLSAyXSA9PSAnXHInICYmCisgICAgICAgICAgICAgYnVmZmVyX1tpIC0gM10gPT0gJ1xuJyAmJiBidWZmZXJfW2kgLSA0XSA9PSAnXHInKSkgeworICAgICAgICAgIHVpbnQzMiBzdGFydF9wb3MsIGVuZF9wb3M7CisgICAgICAgICAgaWYgKEdldEJ5dGVSYW5nZShzdGQ6OnN0cmluZyhidWZmZXJfLCBpKSwgJnN0YXJ0X3BvcywgJmVuZF9wb3MpKSB7CisgICAgICAgICAgICBjdXJyZW50X3Bvc18gPSBzdGFydF9wb3M7CisgICAgICAgICAgICBzdGFydCArPSBpOworICAgICAgICAgICAgbGVuZ3RoIC09IGk7CisgICAgICAgICAgICBpZiAoZW5kX3BvcyAmJiBlbmRfcG9zID4gc3RhcnRfcG9zKQorICAgICAgICAgICAgICBjdXJyZW50X2NodW5rX3NpemVfID0gZW5kX3BvcyAtIHN0YXJ0X3BvcyArIDE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFJlc2V0IHRoaXMgZmxhZyBzbyB3ZSBkb24ndCBsb29rIGluc2lkZSB0aGUgYnVmZmVyIGluIGZ1dHVyZSBjYWxscyBvZgorICAgICAgLy8gRGlkUmVhZCBmb3IgdGhpcyByZXNwb25zZS4gIE5vdGUgdGhhdCB0aGlzIGNvZGUgRE9FUyBOT1QgaGFuZGxlIG11bHRpLQorICAgICAgLy8gcGFydCByZXNwb25zZXMgd2l0aCBtb3JlIHRoYW4gb25lIHBhcnQgKHdlIGRvbid0IGlzc3VlIHRoZW0gYXQgdGhlCisgICAgICAvLyBtb21lbnQsIHNvIHRoZXkgc2hvdWxkbid0IGFycml2ZSkuCisgICAgICBpc19tdWx0aXBhcnRfID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfY2h1bmtfc2l6ZV8gJiYKKyAgICAgICAgY3VycmVudF9jaHVua19yZWFkXyArIGxlbmd0aCA+IGN1cnJlbnRfY2h1bmtfc2l6ZV8pCisgICAgICBsZW5ndGggPSBjdXJyZW50X2NodW5rX3NpemVfIC0gY3VycmVudF9jaHVua19yZWFkXzsKKworICAgIGlmIChsZW5ndGgpIHsKKyAgICAgIGlmIChkb2N1bWVudF9zaXplXyA+IDApIHsKKyAgICAgICAgY2h1bmtfc3RyZWFtXy5Xcml0ZURhdGEoY3VycmVudF9wb3NfLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHdlIGRpZCBub3QgZ2V0IGNvbnRlbnQtbGVuZ3RoIGluIHRoZSByZXNwb25zZSwgd2UgY2FuJ3QKKyAgICAgICAgLy8gcHJlYWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgZW50aXJlIGRvY3VtZW50LiBSZXNpemluZyBhcnJheSBjYXVzaW5nCisgICAgICAgIC8vIG1lbW9yeSBmcmFnbWVudGF0aW9uIGlzc3VlcyBvbiB0aGUgbGFyZ2UgZmlsZXMgYW5kIE9PTSBleGNlcHRpb25zLgorICAgICAgICAvLyBUbyBmaXggdGhpcywgd2UgY29sbGVjdCBhbGwgY2h1bmtzIG9mIHRoZSBmaWxlIHRvIHRoZSBsaXN0IGFuZAorICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyIGFmdGVyIHJlcXVlc3QgaXMgY29tcGxldGUuCisgICAgICAgIGNodW5rX2J1ZmZlcl8ucHVzaF9iYWNrKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KCkpOworICAgICAgICBjaHVua19idWZmZXJfLmJhY2soKS5yZXNpemUobGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KCYoY2h1bmtfYnVmZmVyXy5iYWNrKClbMF0pLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRfcG9zXyArPSBsZW5ndGg7CisgICAgICBjdXJyZW50X2NodW5rX3JlYWRfICs9IGxlbmd0aDsKKyAgICAgIGNsaWVudF8tPk9uTmV3RGF0YUF2YWlsYWJsZSgpOworICAgIH0KKyAgICBSZWFkTW9yZSgpOworICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQUF9PSykgeworICAgIFJlYWRDb21wbGV0ZSgpOworICB9IGVsc2UgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorfQorCit2b2lkIERvY3VtZW50TG9hZGVyOjpSZWFkQ29tcGxldGUoKSB7CisgIGlmICghcGFydGlhbF9kb2N1bWVudF8pIHsKKyAgICBpZiAoZG9jdW1lbnRfc2l6ZV8gPT0gMCkgeworICAgICAgLy8gRm9yIHRoZSBkb2N1bWVudCB3aXRoIG5vICdjb250ZW50LWxlbmd0aCIgc3BlY2lmaWVkIHdlJ3ZlIGNvbGxlY3RlZCBhbGwKKyAgICAgIC8vIHRoZSBjaHVua3MgYWxyZWFkeS4gTGV0J3MgYWxsb2NhdGUgZmluYWwgZG9jdW1lbnQgYnVmZmVyIGFuZCBjb3B5IHRoZW0KKyAgICAgIC8vIG92ZXIuCisgICAgICBjaHVua19zdHJlYW1fLlByZWFsbG9jYXRlKGN1cnJlbnRfcG9zXyk7CisgICAgICB1aW50MzIgcG9zID0gMDsKKyAgICAgIHN0ZDo6bGlzdDxzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiA+OjppdGVyYXRvciBpdDsKKyAgICAgIGZvciAoaXQgPSBjaHVua19idWZmZXJfLmJlZ2luKCk7IGl0ICE9IGNodW5rX2J1ZmZlcl8uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY2h1bmtfc3RyZWFtXy5Xcml0ZURhdGEocG9zLCAmKCgqaXQpWzBdKSwgaXQtPnNpemUoKSk7CisgICAgICAgIHBvcyArPSBpdC0+c2l6ZSgpOworICAgICAgfQorICAgICAgY2h1bmtfYnVmZmVyXy5jbGVhcigpOworICAgIH0KKyAgICBkb2N1bWVudF9zaXplXyA9IGN1cnJlbnRfcG9zXzsKKyAgICBjbGllbnRfLT5PbkRvY3VtZW50Q29tcGxldGUoKTsKKyAgICByZXR1cm47CisgIH0KKworICByZXF1ZXN0X3BlbmRpbmdfID0gZmFsc2U7CisgIHBlbmRpbmdfcmVxdWVzdHNfLnBvcF9mcm9udCgpOworCisgIC8vIElmIHRoZXJlIGFyZSBtb3JlIHBlbmRpbmcgcmVxdWVzdCAtIGNvbnRpbnVlIGRvd25sb2FkaW5nLgorICBpZiAoIXBlbmRpbmdfcmVxdWVzdHNfLmVtcHR5KCkpIHsKKyAgICBEb3dubG9hZFBlbmRpbmdSZXF1ZXN0cygpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChJc0RvY3VtZW50Q29tcGxldGUoKSkgeworICAgIGNsaWVudF8tPk9uRG9jdW1lbnRDb21wbGV0ZSgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChoZWFkZXJfcmVxdWVzdF8pCisgICAgY2xpZW50Xy0+T25QYXJ0aWFsRG9jdW1lbnRMb2FkZWQoKTsKKyAgZWxzZQorICAgIGNsaWVudF8tPk9uUGVuZGluZ1JlcXVlc3RDb21wbGV0ZSgpOworICBoZWFkZXJfcmVxdWVzdF8gPSBmYWxzZTsKKworICAvLyBUaGUgT25QZW5kaW5nUmVxdWVzdENvbXBsZXRlIGNvdWxkIGhhdmUgYWRkZWQgbW9yZSByZXF1ZXN0cy4KKyAgaWYgKCFwZW5kaW5nX3JlcXVlc3RzXy5lbXB0eSgpKSB7CisgICAgRG93bmxvYWRQZW5kaW5nUmVxdWVzdHMoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBEb2N1bWVudCBpcyBub3QgY29tcGxldGUgYW5kIHdlIGhhdmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMuCisgICAgLy8gTGV0J3Mga2VlcCBkb3dubG9hZGluZyBQREYgZmlsZSBpbiBzbWFsbCBjaHVua3MuCisgICAgdWludDMyIHBvcyA9IGNodW5rX3N0cmVhbV8uR2V0Rmlyc3RNaXNzaW5nQnl0ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gPiByYW5nZXM7CisgICAgY2h1bmtfc3RyZWFtXy5HZXRNaXNzZWRSYW5nZXMocG9zLCBHZXRSZXF1ZXN0U2l6ZSgpLCAmcmFuZ2VzKTsKKyAgICBEQ0hFQ0socmFuZ2VzLnNpemUoKSA+IDApOworICAgIFJlcXVlc3REYXRhKHJhbmdlc1swXS5maXJzdCwgcmFuZ2VzWzBdLnNlY29uZCk7CisgIH0KK30KKwordWludDMyIERvY3VtZW50TG9hZGVyOjpHZXRSZXF1ZXN0U2l6ZSgpIGNvbnN0IHsKKyAgLy8gRG9jdW1lbnQgbG9hZGluZyBzdHJhdGVneToKKyAgLy8gRm9yIGZpcnN0IDEwIHJlcXVlc3RzLCB3ZSB1c2UgMzJrIGNodW5rIHNpemVzLCBmb3IgdGhlIG5leHQgMTAgcmVxdWVzdHMgd2UKKyAgLy8gZG91YmxlIHRoZSBzaXplICg2NGspLCBhbmQgc28gb24sIHVudGlsIHdlIGNhcCBtYXggcmVxdWVzdCBzaXplIGF0IDJNIGZvcgorICAvLyA3MSBvciBtb3JlIHJlcXVlc3RzLgorICB1aW50MzIgbGltaXRlZF9jb3VudCA9IHN0ZDo6bWluKHN0ZDo6bWF4KHJlcXVlc3RzX2NvdW50XywgMTB1KSwgNzB1KTsKKyAgcmV0dXJuIDMyKjEwMjQgKiAoMSA8PCAoKGxpbWl0ZWRfY291bnQgLSAxKSAvIDEwdSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2RvY3VtZW50X2xvYWRlci5oIGIveGZhX3Rlc3QvcGRmL2RvY3VtZW50X2xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWRiYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvZG9jdW1lbnRfbG9hZGVyLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX0RPQ1VNRU5UX0xPQURFUl9IXworI2RlZmluZSBQREZfRE9DVU1FTlRfTE9BREVSX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJwZGYvY2h1bmtfc3RyZWFtLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3VybF9sb2FkZXIuaCIKKyNpbmNsdWRlICJwcGFwaS91dGlsaXR5L2NvbXBsZXRpb25fY2FsbGJhY2tfZmFjdG9yeS5oIgorCisjZGVmaW5lIGtEZWZhdWx0UmVxdWVzdFNpemUgMzI3Njh1CisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgRG9jdW1lbnRMb2FkZXIgeworIHB1YmxpYzoKKyAgY2xhc3MgQ2xpZW50IHsKKyAgcHVibGljOgorICAgIC8vIEdldHMgdGhlIHBwOjpJbnN0YW5jZSBvYmplY3QuCisgICAgdmlydHVhbCBwcDo6SW5zdGFuY2UqIEdldFBsdWdpbkluc3RhbmNlKCkgPSAwOworICAgIC8vIENyZWF0ZXMgbmV3IFVSTExvYWRlciBiYXNlZCBvbiBjbGllbnQgc2V0dGluZ3MuCisgICAgdmlydHVhbCBwcDo6VVJMTG9hZGVyIENyZWF0ZVVSTExvYWRlcigpID0gMDsKKyAgICAvLyBOb3RpZmljYXRpb24gY2FsbGVkIHdoZW4gcGFydGlhbCBpbmZvcm1hdGlvbiBhYm91dCBkb2N1bWVudCBpcyBhdmFpbGFibGUuCisgICAgLy8gT25seSBjYWxsZWQgZm9yIHVybHMgdGhhdCByZXR1cm5zIGZ1bGwgY29udGVudCBzaXplIGFuZCBzdXBwb3J0cyBieXRlCisgICAgLy8gcmFuZ2UgcmVxdWVzdHMuCisgICAgdmlydHVhbCB2b2lkIE9uUGFydGlhbERvY3VtZW50TG9hZGVkKCkgPSAwOworICAgIC8vIE5vdGlmaWNhdGlvbiBjYWxsZWQgd2hlbiBhbGwgb3V0c3RhbmRpbmcgcGVuZGluZyByZXF1ZXN0cyBhcmUgY29tcGxldGUuCisgICAgdmlydHVhbCB2b2lkIE9uUGVuZGluZ1JlcXVlc3RDb21wbGV0ZSgpID0gMDsKKyAgICAvLyBOb3RpZmljYXRpb24gY2FsbGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLgorICAgIHZpcnR1YWwgdm9pZCBPbk5ld0RhdGFBdmFpbGFibGUoKSA9IDA7CisgICAgLy8gTm90aWZpY2F0aW9uIGNhbGxlZCB3aGVuIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgT25Eb2N1bWVudENvbXBsZXRlKCkgPSAwOworICB9OworCisgIGV4cGxpY2l0IERvY3VtZW50TG9hZGVyKENsaWVudCogY2xpZW50KTsKKyAgdmlydHVhbCB+RG9jdW1lbnRMb2FkZXIoKTsKKworICBib29sIEluaXQoY29uc3QgcHA6OlVSTExvYWRlciYgbG9hZGVyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoZWFkZXJzKTsKKworICAvLyBEYXRhIGFjY2VzcyBpbnRlcmZhY2UuIFJldHVybiB0cnVlIGlzIHN1Y2Vzc2Z1bC4KKyAgYm9vbCBHZXRCbG9jayh1aW50MzIgcG9zaXRpb24sIHVpbnQzMiBzaXplLCB2b2lkKiBidWYpIGNvbnN0OworCisgIC8vIERhdGEgYXZhaWxhYmlsaXR5IGludGVyZmFjZS4gUmV0dXJuIHRydWUgZGF0YSBhdmFpYWxibGUuCisgIGJvb2wgSXNEYXRhQXZhaWxhYmxlKHVpbnQzMiBwb3NpdGlvbiwgdWludDMyIHNpemUpIGNvbnN0OworCisgIC8vIERhdGEgYXZhaWxhYmlsaXR5IGludGVyZmFjZS4gUmV0dXJuIHRydWUgZGF0YSBhdmFpYWxibGUuCisgIHZvaWQgUmVxdWVzdERhdGEodWludDMyIHBvc2l0aW9uLCB1aW50MzIgc2l6ZSk7CisKKyAgYm9vbCBJc0RvY3VtZW50Q29tcGxldGUoKSBjb25zdDsKKyAgdWludDMyIGRvY3VtZW50X3NpemUoKSBjb25zdCB7IHJldHVybiBkb2N1bWVudF9zaXplXzsgfQorCisgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLgorICB1aW50MzIgR2V0QXZhaWxhYmxlRGF0YSgpIGNvbnN0OworCisgIC8vIENsZWFyIHBlbmRpbmcgcmVxdWVzdHMgZnJvbSB0aGUgcXVldWUuCisgIHZvaWQgQ2xlYXJQZW5kaW5nUmVxdWVzdHMoKTsKKworICBib29sIGlzX3BhcnRpYWxfZG9jdW1lbnQoKSB7IHJldHVybiBwYXJ0aWFsX2RvY3VtZW50XzsgfQorCisgcHJpdmF0ZToKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIG9mIHRoZSBkb2N1bWVudCdzIFVSTExvYWRlci4KKyAgdm9pZCBEaWRPcGVuKGludDMyX3QgcmVzdWx0KTsKKyAgLy8gQ2FsbCB0byByZWFkIGRhdGEgZnJvbSB0aGUgZG9jdW1lbnQncyBVUkxMb2FkZXIuCisgIHZvaWQgUmVhZE1vcmUoKTsKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIG9mIHRoZSBkb2N1bWVudCdzIFVSTExvYWRlci4KKyAgdm9pZCBEaWRSZWFkKGludDMyX3QgcmVzdWx0KTsKKworICAvLyBJZiB0aGUgaGVhZGVycyBoYXZlIGEgYnl0ZS1yYW5nZSByZXNwb25zZSwgd3JpdGVzIHRoZSBzdGFydCBhbmQgZW5kCisgIC8vIHBvc2l0aW9ucyBhbmQgcmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IHRoZSBzdGFydCBwb3NpdGlvbiB3YXMgcGFyc2VkLgorICAvLyBUaGUgZW5kIHBvc2l0aW9uIHdpbGwgYmUgc2V0IHRvIDAgaWYgaXQgd2FzIG5vdCBmb3VuZCBvciBwYXJzZWQgZnJvbSB0aGUKKyAgLy8gcmVzcG9uc2UuCisgIC8vIFJldHVybnMgZmFsc2UgaWYgbm90IGV2ZW4gYSBzdGFydCBwb3NpdGlvbiBjb3VsZCBiZSBwYXJzZWQuCisgIHN0YXRpYyBib29sIEdldEJ5dGVSYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgaGVhZGVycywgdWludDMyKiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiogZW5kKTsKKworICAvLyBJZiB0aGUgaGVhZGVycyBoYXZlIGEgbXVsdGktcGFydCByZXNwb25zZSwgcmV0dXJucyB0aGUgYm91bmRhcnkgbmFtZS4KKyAgLy8gT3RoZXJ3aXNlIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0TXVsdGlQYXJ0Qm91bmRhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGhlYWRlcnMpOworCisgIC8vIENhbGxlZCB3aGVuIHdlIGRldGVjdCB0aGF0IHBhcnRpYWwgZG9jdW1lbnQgbG9hZCBpcyBwb3NzaWJsZS4KKyAgdm9pZCBMb2FkUGFydGlhbERvY3VtZW50KCk7CisgIC8vIENhbGxlZCB3aGVuIHdlIGhhdmUgdG8gbG9hZCBmdWxsIGRvY3VtZW50LgorICB2b2lkIExvYWRGdWxsRG9jdW1lbnQoKTsKKyAgLy8gRG93bmxvYWQgcGVuZGluZyByZXF1ZXN0cy4KKyAgdm9pZCBEb3dubG9hZFBlbmRpbmdSZXF1ZXN0cygpOworICAvLyBDYWxsZWQgd2hlbiB3ZSBjb21wbGV0ZSBzZXJ2ZXIgcmVxdWVzdCBhbmQgcmVhZCBhbGwgZGF0YSBmcm9tIGl0LgorICB2b2lkIFJlYWRDb21wbGV0ZSgpOworICAvLyBDcmVhdGVzIHJlcXVlc3QgdG8gZG93bmxvYWQgc2l6ZSBieXRlIG9mIGRhdGEgZGF0YSBzdGFydGluZyBmcm9tIHBvc2l0aW9uLgorICBwcDo6VVJMUmVxdWVzdEluZm8gR2V0UmVxdWVzdCh1aW50MzIgcG9zaXRpb24sIHVpbnQzMiBzaXplKSBjb25zdDsKKyAgLy8gUmV0dXJucyBjdXJyZW50IHJlcXVlc3Qgc2l6ZSBpbiBieXRlcy4KKyAgdWludDMyIEdldFJlcXVlc3RTaXplKCkgY29uc3Q7CisKKyAgQ2xpZW50KiBjbGllbnRfOworICBzdGQ6OnN0cmluZyB1cmxfOworICBwcDo6VVJMTG9hZGVyIGxvYWRlcl87CisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tGYWN0b3J5PERvY3VtZW50TG9hZGVyPiBsb2FkZXJfZmFjdG9yeV87CisgIENodW5rU3RyZWFtIGNodW5rX3N0cmVhbV87CisgIGJvb2wgcGFydGlhbF9kb2N1bWVudF87CisgIGJvb2wgcmVxdWVzdF9wZW5kaW5nXzsKKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiA+IFBlbmRpbmdSZXF1ZXN0czsKKyAgUGVuZGluZ1JlcXVlc3RzIHBlbmRpbmdfcmVxdWVzdHNfOworICBjaGFyIGJ1ZmZlcl9ba0RlZmF1bHRSZXF1ZXN0U2l6ZV07CisgIHVpbnQzMiBjdXJyZW50X3Bvc187CisgIHVpbnQzMiBjdXJyZW50X2NodW5rX3NpemVfOworICB1aW50MzIgY3VycmVudF9jaHVua19yZWFkXzsKKyAgdWludDMyIGRvY3VtZW50X3NpemVfOworICBib29sIGhlYWRlcl9yZXF1ZXN0XzsKKyAgYm9vbCBpc19tdWx0aXBhcnRfOworICBzdGQ6OnN0cmluZyBtdWx0aXBhcnRfYm91bmRhcnlfOworICB1aW50MzIgcmVxdWVzdHNfY291bnRfOworICBzdGQ6Omxpc3Q8c3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gPiBjaHVua19idWZmZXJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmICAvLyBQREZfRE9DVU1FTlRfTE9BREVSX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvZHJhd191dGlscy5jYyBiL3hmYV90ZXN0L3BkZi9kcmF3X3V0aWxzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGJlNTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvZHJhd191dGlscy5jYwpAQCAtMCwwICsxLDM0MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9kcmF3X3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworaW5saW5lIHVpbnQ4IEdldEJsdWUoY29uc3QgdWludDMyJiBwaXhlbCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDg+KHBpeGVsICYgMHhGRik7Cit9CisKK2lubGluZSB1aW50OCBHZXRHcmVlbihjb25zdCB1aW50MzImIHBpeGVsKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OD4oKHBpeGVsID4+IDgpICYgMHhGRik7Cit9CisKK2lubGluZSB1aW50OCBHZXRSZWQoY29uc3QgdWludDMyJiBwaXhlbCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDg+KChwaXhlbCA+PiAxNikgJiAweEZGKTsKK30KKworaW5saW5lIHVpbnQ4IEdldEFscGhhKGNvbnN0IHVpbnQzMiYgcGl4ZWwpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4PigocGl4ZWwgPj4gMjQpICYgMHhGRik7Cit9CisKK2lubGluZSB1aW50MzJfdCBNYWtlUGl4ZWwodWludDggcmVkLCB1aW50OCBncmVlbiwgdWludDggYmx1ZSwgdWludDggYWxwaGEpIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWxwaGEpIDw8IDI0KSB8CisgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlZCkgPDwgMTYpIHwKKyAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ3JlZW4pIDw8IDgpIHwKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihibHVlKTsKK30KKworaW5saW5lIHVpbnQ4IEdyYWRpZW50Q2hhbm5lbCh1aW50OCBzdGFydCwgdWludDggZW5kLCBkb3VibGUgcmF0aW8pIHsKKyAgZG91YmxlIG5ld19jaGFubmVsID0gc3RhcnQgLSAoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGFydCkgLSBlbmQpICogcmF0aW87CisgIGlmIChuZXdfY2hhbm5lbCA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChuZXdfY2hhbm5lbCA+IDI1NSkKKyAgICByZXR1cm4gMjU1OworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDg+KG5ld19jaGFubmVsICsgMC41KTsKK30KKworaW5saW5lIHVpbnQ4IFByb2Nlc3NDb2xvcih1aW50OCBzcmNfY29sb3IsIHVpbnQ4IGRlc3RfY29sb3IsIHVpbnQ4IGFscGhhKSB7CisgIHVpbnQzMiBwcm9jZXNzZWQgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHNyY19jb2xvcikgKiBhbHBoYSArCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KGRlc3RfY29sb3IpICogKDB4RkYgLSBhbHBoYSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OD4oKHByb2Nlc3NlZCAvIDB4RkYpICYgMHhGRik7Cit9CisKK2lubGluZSBib29sIEltYWdlRGF0YUNvbnRhaW5zUmVjdChjb25zdCBwcDo6SW1hZ2VEYXRhJiBpbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiByZWN0KSB7CisgIHJldHVybiByZWN0LndpZHRoKCkgPj0gMCAmJiByZWN0LmhlaWdodCgpID49IDAgJiYKKyAgICAgIHBwOjpSZWN0KGltYWdlX2RhdGEuc2l6ZSgpKS5Db250YWlucyhyZWN0KTsKK30KKwordm9pZCBBbHBoYUJsZW5kKGNvbnN0IHBwOjpJbWFnZURhdGEmIHNyYywgY29uc3QgcHA6OlJlY3QmIHNyY19yYywKKyAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBkZXN0LCBjb25zdCBwcDo6UG9pbnQmIGRlc3Rfb3JpZ2luLAorICAgICAgICAgICAgICAgIHVpbnQ4IGFscGhhX2FkanVzdG1lbnQpIHsKKyAgaWYgKHNyY19yYy5Jc0VtcHR5KCkgfHwgIUltYWdlRGF0YUNvbnRhaW5zUmVjdChzcmMsIHNyY19yYykpCisgICAgcmV0dXJuOworCisgIHBwOjpSZWN0IGRlc3RfcmMoZGVzdF9vcmlnaW4sIHNyY19yYy5zaXplKCkpOworICBpZiAoZGVzdF9yYy5Jc0VtcHR5KCkgfHwgIUltYWdlRGF0YUNvbnRhaW5zUmVjdCgqZGVzdCwgZGVzdF9yYykpCisgICAgcmV0dXJuOworCisgIGNvbnN0IHVpbnQzMl90KiBzcmNfb3JpZ2luX3BpeGVsID0gc3JjLkdldEFkZHIzMihzcmNfcmMucG9pbnQoKSk7CisgIHVpbnQzMl90KiBkZXN0X29yaWdpbl9waXhlbCA9IGRlc3QtPkdldEFkZHIzMihkZXN0X29yaWdpbik7CisKKyAgaW50IGhlaWdodCA9IHNyY19yYy5oZWlnaHQoKTsKKyAgaW50IHdpZHRoID0gc3JjX3JjLndpZHRoKCk7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICBjb25zdCB1aW50MzJfdCogc3JjX3BpeGVsID0gc3JjX29yaWdpbl9waXhlbDsKKyAgICB1aW50MzJfdCogZGVzdF9waXhlbCA9IGRlc3Rfb3JpZ2luX3BpeGVsOworICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgdWludDggYWxwaGEgPSBzdGF0aWNfY2FzdDx1aW50OD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFscGhhX2FkanVzdG1lbnQpICoKKyAgICAgICAgICBHZXRBbHBoYSgqc3JjX3BpeGVsKSAvIDB4RkYpOworICAgICAgdWludDggcmVkID0gUHJvY2Vzc0NvbG9yKEdldFJlZCgqc3JjX3BpeGVsKSwgR2V0UmVkKCpkZXN0X3BpeGVsKSwgYWxwaGEpOworICAgICAgdWludDggZ3JlZW4gPSBQcm9jZXNzQ29sb3IoR2V0R3JlZW4oKnNyY19waXhlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRHcmVlbigqZGVzdF9waXhlbCksIGFscGhhKTsKKyAgICAgIHVpbnQ4IGJsdWUgPSBQcm9jZXNzQ29sb3IoR2V0Qmx1ZSgqc3JjX3BpeGVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qmx1ZSgqZGVzdF9waXhlbCksIGFscGhhKTsKKyAgICAgICpkZXN0X3BpeGVsID0gTWFrZVBpeGVsKHJlZCwgZ3JlZW4sIGJsdWUsIEdldEFscGhhKCpkZXN0X3BpeGVsKSk7CisKKyAgICAgIHNyY19waXhlbCsrOworICAgICAgZGVzdF9waXhlbCsrOworICAgIH0KKyAgICBzcmNfb3JpZ2luX3BpeGVsID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzcmNfb3JpZ2luX3BpeGVsKSArIHNyYy5zdHJpZGUoKSk7CisgICAgZGVzdF9vcmlnaW5fcGl4ZWwgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGRlc3Rfb3JpZ2luX3BpeGVsKSArIGRlc3QtPnN0cmlkZSgpKTsKKyAgfQorfQorCit2b2lkIEdyYWRpZW50RmlsbChwcDo6SW1hZ2VEYXRhKiBpbWFnZSwgY29uc3QgcHA6OlJlY3QmIHJjLAorICAgICAgICAgICAgICAgICAgdWludDMyIHN0YXJ0X2NvbG9yLCB1aW50MzIgZW5kX2NvbG9yLCBib29sIGhvcml6b250YWwpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDMyPiBjb2xvcnM7CisgIGNvbG9ycy5yZXNpemUoaG9yaXpvbnRhbCA/IHJjLndpZHRoKCkgOiByYy5oZWlnaHQoKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29sb3JzLnNpemUoKTsgKytpKSB7CisgICAgZG91YmxlIHJhdGlvID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpKSAvIGNvbG9ycy5zaXplKCk7CisgICAgY29sb3JzW2ldID0gTWFrZVBpeGVsKAorICAgICAgICBHcmFkaWVudENoYW5uZWwoR2V0UmVkKHN0YXJ0X2NvbG9yKSwgR2V0UmVkKGVuZF9jb2xvciksIHJhdGlvKSwKKyAgICAgICAgR3JhZGllbnRDaGFubmVsKEdldEdyZWVuKHN0YXJ0X2NvbG9yKSwgR2V0R3JlZW4oZW5kX2NvbG9yKSwgcmF0aW8pLAorICAgICAgICBHcmFkaWVudENoYW5uZWwoR2V0Qmx1ZShzdGFydF9jb2xvciksIEdldEJsdWUoZW5kX2NvbG9yKSwgcmF0aW8pLAorICAgICAgICBHcmFkaWVudENoYW5uZWwoR2V0QWxwaGEoc3RhcnRfY29sb3IpLCBHZXRBbHBoYShlbmRfY29sb3IpLCByYXRpbykpOworICB9CisKKyAgaWYgKGhvcml6b250YWwpIHsKKyAgICBjb25zdCB2b2lkKiBkYXRhID0gJihjb2xvcnNbMF0pOworICAgIHNpemVfdCBzaXplID0gY29sb3JzLnNpemUoKSAqIDQ7CisgICAgdWludDMyX3QqIG9yaWdpbl9waXhlbCA9IGltYWdlLT5HZXRBZGRyMzIocmMucG9pbnQoKSk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCByYy5oZWlnaHQoKTsgeSsrKSB7CisgICAgICBtZW1jcHkob3JpZ2luX3BpeGVsLCBkYXRhLCBzaXplKTsKKyAgICAgIG9yaWdpbl9waXhlbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihvcmlnaW5fcGl4ZWwpICsgaW1hZ2UtPnN0cmlkZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDMyX3QqIG9yaWdpbl9waXhlbCA9IGltYWdlLT5HZXRBZGRyMzIocmMucG9pbnQoKSk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCByYy5oZWlnaHQoKTsgeSsrKSB7CisgICAgICB1aW50MzJfdCogcGl4ZWwgPSBvcmlnaW5fcGl4ZWw7CisgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHJjLndpZHRoKCk7IHgrKykgeworICAgICAgICAqcGl4ZWwgPSBjb2xvcnNbeV07CisgICAgICAgIHBpeGVsKys7CisgICAgICB9CisgICAgICBvcmlnaW5fcGl4ZWwgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3JpZ2luX3BpeGVsKSArIGltYWdlLT5zdHJpZGUoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgR3JhZGllbnRGaWxsKHBwOjpJbnN0YW5jZSogaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBkaXJ0eV9yYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBncmFkaWVudF9yYywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMiBzdGFydF9jb2xvciwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMiBlbmRfY29sb3IsCisgICAgICAgICAgICAgICAgICBib29sIGhvcml6b250YWwsCisgICAgICAgICAgICAgICAgICB1aW50OCB0cmFuc3BhcmVuY3kpIHsKKyAgcHA6OlJlY3QgZHJhd19yYyA9IGdyYWRpZW50X3JjLkludGVyc2VjdChkaXJ0eV9yYyk7CisgIGlmIChkcmF3X3JjLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgcHA6OkltYWdlRGF0YSBncmFkaWVudChpbnN0YW5jZSwgUFBfSU1BR0VEQVRBRk9STUFUX0JHUkFfUFJFTVVMLAorICAgICAgZ3JhZGllbnRfcmMuc2l6ZSgpLCBmYWxzZSk7CisKKyAgR3JhZGllbnRGaWxsKCZncmFkaWVudCwgcHA6OlJlY3QocHA6OlBvaW50KCksIGdyYWRpZW50X3JjLnNpemUoKSksCisgICAgICAgICAgICAgICBzdGFydF9jb2xvciwgZW5kX2NvbG9yLCBob3Jpem9udGFsKTsKKworICBwcDo6UmVjdCBjb3B5X3JjKGRyYXdfcmMpOworICBjb3B5X3JjLk9mZnNldCgtZ3JhZGllbnRfcmMueCgpLCAtZ3JhZGllbnRfcmMueSgpKTsKKyAgQWxwaGFCbGVuZChncmFkaWVudCwgY29weV9yYywgaW1hZ2UsIGRyYXdfcmMucG9pbnQoKSwgdHJhbnNwYXJlbmN5KTsKK30KKwordm9pZCBDb3B5SW1hZ2UoY29uc3QgcHA6OkltYWdlRGF0YSYgc3JjLCBjb25zdCBwcDo6UmVjdCYgc3JjX3JjLAorICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogZGVzdCwgY29uc3QgcHA6OlJlY3QmIGRlc3RfcmMsCisgICAgICAgICAgICAgICBib29sIHN0cmV0Y2gpIHsKKyAgaWYgKHNyY19yYy5Jc0VtcHR5KCkgfHwgIUltYWdlRGF0YUNvbnRhaW5zUmVjdChzcmMsIHNyY19yYykpCisgICAgcmV0dXJuOworCisgIHBwOjpSZWN0IHN0cmV0Y2hlZF9yYyhkZXN0X3JjLnBvaW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoID8gZGVzdF9yYy5zaXplKCkgOiBzcmNfcmMuc2l6ZSgpKTsKKyAgaWYgKHN0cmV0Y2hlZF9yYy5Jc0VtcHR5KCkgfHwgIUltYWdlRGF0YUNvbnRhaW5zUmVjdCgqZGVzdCwgc3RyZXRjaGVkX3JjKSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgdWludDMyX3QqIHNyY19vcmlnaW5fcGl4ZWwgPSBzcmMuR2V0QWRkcjMyKHNyY19yYy5wb2ludCgpKTsKKyAgdWludDMyX3QqIGRlc3Rfb3JpZ2luX3BpeGVsID0gZGVzdC0+R2V0QWRkcjMyKGRlc3RfcmMucG9pbnQoKSk7CisgIGlmIChzdHJldGNoKSB7CisgICAgZG91YmxlIHhfcmF0aW8gPSBzdGF0aWNfY2FzdDxkb3VibGU+KHNyY19yYy53aWR0aCgpKSAvIGRlc3RfcmMud2lkdGgoKTsKKyAgICBkb3VibGUgeV9yYXRpbyA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3JjX3JjLmhlaWdodCgpKSAvIGRlc3RfcmMuaGVpZ2h0KCk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBkZXN0X3JjLmhlaWdodCgpOworICAgIGludDMyX3Qgd2lkdGggPSBkZXN0X3JjLndpZHRoKCk7CisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIHVpbnQzMl90KiBkZXN0X3BpeGVsID0gZGVzdF9vcmlnaW5fcGl4ZWw7CisgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgIHVpbnQzMiBzcmNfeCA9IHN0YXRpY19jYXN0PHVpbnQzMj4oeCAqIHhfcmF0aW8pOworICAgICAgICB1aW50MzIgc3JjX3kgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHkgKiB5X3JhdGlvKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QqIHNyY19waXhlbCA9IHNyYy5HZXRBZGRyMzIoCisgICAgICAgICAgICBwcDo6UG9pbnQoc3JjX3JjLngoKSArIHNyY194LCBzcmNfcmMueSgpICsgc3JjX3kpKTsKKyAgICAgICAgKmRlc3RfcGl4ZWwgPSAqc3JjX3BpeGVsOworICAgICAgICBkZXN0X3BpeGVsKys7CisgICAgICB9CisgICAgICBkZXN0X29yaWdpbl9waXhlbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihkZXN0X29yaWdpbl9waXhlbCkgKyBkZXN0LT5zdHJpZGUoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGludDMyX3QgaGVpZ2h0ID0gc3JjX3JjLmhlaWdodCgpOworICAgIGJhc2U6OkNoZWNrZWROdW1lcmljPGludDMyX3Q+IHdpZHRoX2J5dGVzID0gc3JjX3JjLndpZHRoKCk7CisgICAgd2lkdGhfYnl0ZXMgKj0gNDsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgbWVtY3B5KGRlc3Rfb3JpZ2luX3BpeGVsLCBzcmNfb3JpZ2luX3BpeGVsLCB3aWR0aF9ieXRlcy5WYWx1ZU9yRGllKCkpOworICAgICAgc3JjX29yaWdpbl9waXhlbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzcmNfb3JpZ2luX3BpeGVsKSArIHNyYy5zdHJpZGUoKSk7CisgICAgICBkZXN0X29yaWdpbl9waXhlbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihkZXN0X29yaWdpbl9waXhlbCkgKyBkZXN0LT5zdHJpZGUoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRmlsbFJlY3QocHA6OkltYWdlRGF0YSogaW1hZ2UsIGNvbnN0IHBwOjpSZWN0JiByYywgdWludDMyIGNvbG9yKSB7CisgIGludCBoZWlnaHQgPSByYy5oZWlnaHQoKTsKKyAgaWYgKGhlaWdodCA9PSAwKQorICAgIHJldHVybjsKKworICAvLyBGaWxsIGluIGZpcnN0IHJvdy4KKyAgdWludDMyX3QqIHRvcF9saW5lID0gaW1hZ2UtPkdldEFkZHIzMihyYy5wb2ludCgpKTsKKyAgaW50IHdpZHRoID0gcmMud2lkdGgoKTsKKyAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgIHRvcF9saW5lW3hdID0gY29sb3I7CisKKyAgLy8gRmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUgcmVjdGFuZ2xlLgorICBpbnQgYnl0ZV93aWR0aCA9IHdpZHRoICogNDsKKyAgdWludDMyX3QqIGN1cl9saW5lID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRvcF9saW5lKSArIGltYWdlLT5zdHJpZGUoKSk7CisgIGZvciAoaW50IHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICBtZW1jcHkoY3VyX2xpbmUsIHRvcF9saW5lLCBieXRlX3dpZHRoKTsKKyAgICBjdXJfbGluZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGN1cl9saW5lKSArIGltYWdlLT5zdHJpZGUoKSk7CisgIH0KK30KKworU2hhZG93TWF0cml4OjpTaGFkb3dNYXRyaXgodWludDMyIGRlcHRoLCBkb3VibGUgZmFjdG9yLCB1aW50MzIgYmFja2dyb3VuZCkKKyAgICA6IGRlcHRoXyhkZXB0aCksIGZhY3Rvcl8oZmFjdG9yKSwgYmFja2dyb3VuZF8oYmFja2dyb3VuZCkgeworICBEQ0hFQ0soZGVwdGhfID4gMCk7CisgIG1hdHJpeF8ucmVzaXplKGRlcHRoXyAqIGRlcHRoXyk7CisKKyAgLy8gcHYgLSBpcyBhIHJvdW5kaW5nIHBvd2VyIGZhY3RvciBmb3Igc21vb3RoaW5nIGNvcm5lcnMuCisgIC8vIHB2ID0gMi4wIHdpbGwgbWFrZSBjb3JuZXJzIGNvbXBsZXRlbHkgcm91bmQuCisgIGNvbnN0IGRvdWJsZSBwdiA9IDQuMDsKKyAgLy8gcG93X3B2IC0gY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBwb3coeCwgcHYpIGV2ZXJ5IHRpbWUuCisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcG93X3B2KGRlcHRoXywgMC4wKTsKKworICBkb3VibGUgciA9IHN0YXRpY19jYXN0PGRvdWJsZT4oZGVwdGhfKTsKKyAgZG91YmxlIGNvZWYgPSAyNTYuMCAvIHBvdyhyLCBmYWN0b3IpOworCisgIGZvciAodWludDMyIHkgPSAwOyB5IDwgZGVwdGhfOyB5KyspIHsKKyAgICAvLyBTaW5jZSBtYXRyaXggaXMgc3ltbWV0cmljYWwsIHdlIGNhbiByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxjdWxhdGlvbnMKKyAgICAvLyBieSBtaXJyb3JpbmcgcmVzdWx0cy4KKyAgICBmb3IgKHVpbnQzMiB4ID0gMDsgeCA8PSB5OyB4KyspIHsKKyAgICAgIC8vIEZpbGwgY2FjaGUgaWYgbmVlZGVkLgorICAgICAgaWYgKHBvd19wdlt4XSA9PSAwLjApCisgICAgICAgIHBvd19wdlt4XSA9ICBwb3coeCwgcHYpOworICAgICAgaWYgKHBvd19wdlt5XSA9PSAwLjApCisgICAgICAgIHBvd19wdlt5XSA9ICBwb3coeSwgcHYpOworCisgICAgICAvLyB2IC0gaXMgYSB2YWx1ZSBmb3IgdGhlIHNtb290aGluZyBmdW5jdGlvbi4KKyAgICAgIC8vIElmIHggPT0gMCBzaW1wbGlmeSBjYWxjdWxhdGlvbnMuCisgICAgICBkb3VibGUgdiA9ICh4ID09IDApID8geSA6IHBvdyhwb3dfcHZbeF0gKyBwb3dfcHZbeV0sIDEgLyBwdik7CisKKyAgICAgIC8vIFNtb290aGluZyBmdW5jdGlvbi4KKyAgICAgIC8vIElmIGZhY3RvciA9PSAxLCBzbW9vdGhpbmcgd2lsbCBiZSBsaW5lYXIgZnJvbSAwIHRvIHRoZSBlbmQsCisgICAgICAvLyBpZiAwIDwgZmFjdG9yIDwgMSwgc21vb3RoaW5nIHdpbGwgZHJvcCBmYXN0ZXIgbmVhciAwLgorICAgICAgLy8gaWYgZmFjdG9yID4gMSwgc21vb3RoaW5nIHdpbGwgZHJvcCBmYXN0ZXIgbmVhciB0aGUgZW5kIChkZXB0aCkuCisgICAgICBkb3VibGUgZiA9IDI1Ni4wIC0gY29lZiAqIHBvdyh2LCBmYWN0b3IpOworCisgICAgICB1aW50OCBhbHBoYSA9IDA7CisgICAgICBpZiAoZiA+IGtPcGFxdWVBbHBoYSkKKyAgICAgICAgYWxwaGEgPSBrT3BhcXVlQWxwaGE7CisgICAgICBlbHNlIGlmIChmIDwga1RyYW5zcGFyZW50QWxwaGEpCisgICAgICAgIGFscGhhID0ga1RyYW5zcGFyZW50QWxwaGE7CisgICAgICBlbHNlCisgICAgICAgIGFscGhhID0gc3RhdGljX2Nhc3Q8dWludDg+KGYpOworCisgICAgICB1aW50OCByZWQgPSBQcm9jZXNzQ29sb3IoMCwgR2V0UmVkKGJhY2tncm91bmQpLCBhbHBoYSk7CisgICAgICB1aW50OCBncmVlbiA9IFByb2Nlc3NDb2xvcigwLCBHZXRHcmVlbihiYWNrZ3JvdW5kKSwgYWxwaGEpOworICAgICAgdWludDggYmx1ZSA9IFByb2Nlc3NDb2xvcigwLCBHZXRCbHVlKGJhY2tncm91bmQpLCBhbHBoYSk7CisgICAgICB1aW50MzIgcGl4ZWwgPSBNYWtlUGl4ZWwocmVkLCBncmVlbiwgYmx1ZSwgR2V0QWxwaGEoYmFja2dyb3VuZCkpOworCisgICAgICAvLyBNaXJyb3IgbWF0cml4LgorICAgICAgbWF0cml4X1t5ICogZGVwdGhfICsgeF0gPSBwaXhlbDsKKyAgICAgIG1hdHJpeF9beCAqIGRlcHRoXyArIHldID0gcGl4ZWw7CisgICAgfQorICB9Cit9CisKK1NoYWRvd01hdHJpeDo6flNoYWRvd01hdHJpeCgpIHsKK30KKwordm9pZCBQYWludFNoYWRvdyhwcDo6SW1hZ2VEYXRhKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIGNsaXBfcmMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBzaGFkb3dfcmMsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNoYWRvd01hdHJpeCYgbWF0cml4KSB7CisgIHBwOjpSZWN0IGRyYXdfcmMgPSBzaGFkb3dfcmMuSW50ZXJzZWN0KGNsaXBfcmMpOworICBpZiAoZHJhd19yYy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGludDMyIGRlcHRoID0gc3RhdGljX2Nhc3Q8aW50MzI+KG1hdHJpeC5kZXB0aCgpKTsKKyAgZm9yIChpbnQzMl90IHkgPSBkcmF3X3JjLnkoKTsgeSA8IGRyYXdfcmMuYm90dG9tKCk7IHkrKykgeworICAgIGZvciAoaW50MzJfdCB4ID0gZHJhd19yYy54KCk7IHggPCBkcmF3X3JjLnJpZ2h0KCk7IHgrKykgeworICAgICAgaW50MzJfdCBtYXRyaXhfeCA9IHN0ZDo6bWF4KGRlcHRoICsgc2hhZG93X3JjLngoKSAtIHggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIC0gc2hhZG93X3JjLnJpZ2h0KCkgKyB4KTsKKyAgICAgIGludDMyX3QgbWF0cml4X3kgPSBzdGQ6Om1heChkZXB0aCArIHNoYWRvd19yYy55KCkgLSB5IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAtIHNoYWRvd19yYy5ib3R0b20oKSArIHkpOworICAgICAgdWludDMyX3QqIHBpeGVsID0gaW1hZ2UtPkdldEFkZHIzMihwcDo6UG9pbnQoeCwgeSkpOworCisgICAgICBpZiAobWF0cml4X3ggPCAwKQorICAgICAgICBtYXRyaXhfeCA9IDA7CisgICAgICBlbHNlIGlmIChtYXRyaXhfeCA+PSBzdGF0aWNfY2FzdDxpbnQzMj4oZGVwdGgpKQorICAgICAgICBtYXRyaXhfeCA9IGRlcHRoIC0gMTsKKworICAgICAgaWYgKG1hdHJpeF95IDwgMCkKKyAgICAgICAgbWF0cml4X3kgPSAwOworICAgICAgZWxzZSBpZiAobWF0cml4X3kgPj0gc3RhdGljX2Nhc3Q8aW50MzI+KGRlcHRoKSkKKyAgICAgICAgbWF0cml4X3kgPSBkZXB0aCAtIDE7CisKKyAgICAgICpwaXhlbCA9IG1hdHJpeC5HZXRWYWx1ZShtYXRyaXhfeCwgbWF0cml4X3kpOworICAgIH0KKyAgfQorfQorCit2b2lkIERyYXdTaGFkb3cocHA6OkltYWdlRGF0YSogaW1hZ2UsCisgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIHNoYWRvd19yYywKKyAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgb2JqZWN0X3JjLAorICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBjbGlwX3JjLAorICAgICAgICAgICAgICAgIGNvbnN0IFNoYWRvd01hdHJpeCYgbWF0cml4KSB7CisgIGlmIChzaGFkb3dfcmMgPT0gb2JqZWN0X3JjKQorICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gcGFpbnQuCisKKyAgLy8gRmlsbCB0b3AgcGFydC4KKyAgcHA6OlJlY3QgcmMoc2hhZG93X3JjLnBvaW50KCksCisgICAgICAgICAgICAgIHBwOjpTaXplKHNoYWRvd19yYy53aWR0aCgpLCBvYmplY3RfcmMueSgpIC0gc2hhZG93X3JjLnkoKSkpOworICBQYWludFNoYWRvdyhpbWFnZSwgcmMuSW50ZXJzZWN0KGNsaXBfcmMpLCBzaGFkb3dfcmMsIG1hdHJpeCk7CisKKyAgLy8gRmlsbCBib3R0b20gcGFydC4KKyAgcmMgPSBwcDo6UmVjdChzaGFkb3dfcmMueCgpLCBvYmplY3RfcmMuYm90dG9tKCksCisgICAgICAgICAgICAgICAgc2hhZG93X3JjLndpZHRoKCksIHNoYWRvd19yYy5ib3R0b20oKSAtIG9iamVjdF9yYy5ib3R0b20oKSk7CisgIFBhaW50U2hhZG93KGltYWdlLCByYy5JbnRlcnNlY3QoY2xpcF9yYyksIHNoYWRvd19yYywgbWF0cml4KTsKKworICAvLyBGaWxsIGxlZnQgcGFydC4KKyAgcmMgPSBwcDo6UmVjdChzaGFkb3dfcmMueCgpLCBvYmplY3RfcmMueSgpLAorICAgICAgICAgICAgICAgIG9iamVjdF9yYy54KCkgLSBzaGFkb3dfcmMueCgpLCBvYmplY3RfcmMuaGVpZ2h0KCkpOworICBQYWludFNoYWRvdyhpbWFnZSwgcmMuSW50ZXJzZWN0KGNsaXBfcmMpLCBzaGFkb3dfcmMsIG1hdHJpeCk7CisKKyAgLy8gRmlsbCByaWdodCBwYXJ0LgorICByYyA9IHBwOjpSZWN0KG9iamVjdF9yYy5yaWdodCgpLCBvYmplY3RfcmMueSgpLAorICAgICAgICAgICAgICAgIHNoYWRvd19yYy5yaWdodCgpIC0gb2JqZWN0X3JjLnJpZ2h0KCksIG9iamVjdF9yYy5oZWlnaHQoKSk7CisgIFBhaW50U2hhZG93KGltYWdlLCByYy5JbnRlcnNlY3QoY2xpcF9yYyksIHNoYWRvd19yYywgbWF0cml4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2RyYXdfdXRpbHMuaCBiL3hmYV90ZXN0L3BkZi9kcmF3X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkZjI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9kcmF3X3V0aWxzLmgKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQREZfRFJBV19VVElMU19IXworI2RlZmluZSBQREZfRFJBV19VVElMU19IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2ltYWdlX2RhdGEuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcmVjdC5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NvbnN0IHVpbnQ4IGtPcGFxdWVBbHBoYSA9IDB4RkY7Citjb25zdCB1aW50OCBrVHJhbnNwYXJlbnRBbHBoYSA9IDB4MDA7CisKK3ZvaWQgQWxwaGFCbGVuZChjb25zdCBwcDo6SW1hZ2VEYXRhJiBzcmMsIGNvbnN0IHBwOjpSZWN0JiBzcmNfcmMsCisgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogZGVzdCwgY29uc3QgcHA6OlBvaW50JiBkZXN0X29yaWdpbiwKKyAgICAgICAgICAgICAgICB1aW50OCBhbHBoYV9hZGp1c3RtZW50KTsKKworLy8gRmlsbCByZWN0YW5nbGUgd2l0aCBncmFkaWVudCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseS4gU3RhcnQgaXMgYSBjb2xvciBvZgorLy8gdG9wLWxlZnQgcG9pbnQgb2YgdGhlIHJlY3RhbmdsZSwgZW5kIGNvbG9yIGlzIGEgY29sb3Igb2YKKy8vIHRvcC1yaWdodCAoaG9yaXpvbnRhbD09dHJ1ZSkgb3IgYm90dG9tLWxlZnQgKGhvcml6b250YWw9PWZhbHNlKSBwb2ludC4KK3ZvaWQgR3JhZGllbnRGaWxsKHBwOjpJbWFnZURhdGEqIGltYWdlLAorICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIHJjLAorICAgICAgICAgICAgICAgICAgdWludDMyIHN0YXJ0X2NvbG9yLAorICAgICAgICAgICAgICAgICAgdWludDMyIGVuZF9jb2xvciwKKyAgICAgICAgICAgICAgICAgIGJvb2wgaG9yaXpvbnRhbCk7CisKKy8vIEZpbGwgZGlydHkgcmVjdGFuZ2xlIHdpdGggZ3JhZGllbnQsIHdoZXJlIGdyYWRpZW50IGNvbG9yIHNldCBmb3IgY29ybmVycyBvZgorLy8gZ3JhZGllbnQgcmVjdGFuZ2xlLiBQYXJ0cyBvZiB0aGUgZGlydHkgcmVjdCBvdXRzaWRlIG9mIGdyYWRpZW50IHJlY3Qgd2lsbAorLy8gYmUgdW5jaGFuZ2VkLgordm9pZCBHcmFkaWVudEZpbGwocHA6Okluc3RhbmNlKiBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIHBwOjpJbWFnZURhdGEqIGltYWdlLAorICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIGRpcnR5X3JjLAorICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIGdyYWRpZW50X3JjLAorICAgICAgICAgICAgICAgICAgdWludDMyIHN0YXJ0X2NvbG9yLAorICAgICAgICAgICAgICAgICAgdWludDMyIGVuZF9jb2xvciwKKyAgICAgICAgICAgICAgICAgIGJvb2wgaG9yaXpvbnRhbCwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4IHRyYW5zcGFyZW5jeSk7CisKKy8vIENvcHkgb25lIGltYWdlIGludG8gYW5vdGhlci4gSWYgc3RyZXRjaCBpcyB0cnVlLCB0aGUgcmVzdWx0IG9jY3VweSB0aGUgZW50aXJlCisvLyBkZXN0X3JjLiBJZiBzdHJldGNoIGlzIGZhbHNlLCBkZXN0X3JjLnBvaW50IHdpbGwgYmUgdXNlZCBhcyBhbiBvcmlnaW4gb2YgdGhlCisvLyByZXN1bHQgaW1hZ2UuIENvcHkgd2lsbCBpZ25vcmUgYWxsIHBpeGVscyB3aXRoIHRyYW5zcGFyZW50IGFscGhhIGZyb20gdGhlCisvLyBzb3VyY2UgaW1hZ2UuCit2b2lkIENvcHlJbWFnZShjb25zdCBwcDo6SW1hZ2VEYXRhJiBzcmMsIGNvbnN0IHBwOjpSZWN0JiBzcmNfcmMsCisgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBkZXN0LCBjb25zdCBwcDo6UmVjdCYgZGVzdF9yYywKKyAgICAgICAgICAgICAgIGJvb2wgc3RyZXRjaCk7CisKKy8vIEZpbGwgaW4gcmVjdGFuZ2xlIHdpdGggc3BlY2lmaWVkIGNvbG9yLgordm9pZCBGaWxsUmVjdChwcDo6SW1hZ2VEYXRhKiBpbWFnZSwgY29uc3QgcHA6OlJlY3QmIHJjLCB1aW50MzIgY29sb3IpOworCisvLyBTaGFkb3cgTWF0cml4IGNvbnRhaW5zIG1hdHJpeCBmb3Igc2hhZG93IHJlbmRlcmluZy4gVG8gcmVkdWNlIGFtb3VudCBvZgorLy8gY2FsY3VsYXRpb25zIHVzZXIgbWF5IGNob29zZSB0byBjYWNoZSBtYXRyaXggYW5kIHJldXNlIGl0IGlmIG5vdGhpbmcgY2hhbmdlZC4KK2NsYXNzIFNoYWRvd01hdHJpeCB7CisgcHVibGljOgorICAvLyBNYXRyaXggcGFyYW1ldGVycy4KKyAgLy8gZGVwdGggLSBob3cgYmlnIG1hdHJpeCBzaG91bGQgYmUuIFNoYWRvdyB3aWxsIGdvIHNtb290aGx5IGFjcm9zcyB0aGUKKyAgLy8gZW50aXJlIG1hdHJpeCBmcm9tIGJsYWNrIHRvIGJhY2tncm91bmQgY29sb3IuCisgIC8vIElmIGZhY3RvciA9PSAxLCBzbW9vdGhpbmcgd2lsbCBiZSBsaW5lYXIgZnJvbSAwIHRvIHRoZSBlbmQgKGRlcHRoKSwKKyAgLy8gaWYgMCA8IGZhY3RvciA8IDEsIHNtb290aGluZyB3aWxsIGRyb3AgZmFzdGVyIG5lYXIgMC4KKyAgLy8gaWYgZmFjdG9yID4gMSwgc21vb3RoaW5nIHdpbGwgZHJvcCBmYXN0ZXIgbmVhciB0aGUgZW5kIChkZXB0aCkuCisgIFNoYWRvd01hdHJpeCh1aW50MzIgZGVwdGgsIGRvdWJsZSBmYWN0b3IsIHVpbnQzMiBiYWNrZ3JvdW5kKTsKKworICB+U2hhZG93TWF0cml4KCk7CisKKyAgdWludDMyIEdldFZhbHVlKGludDMyIHgsIGludDMyIHkpIGNvbnN0IHsgcmV0dXJuIG1hdHJpeF9beSAqIGRlcHRoXyArIHhdOyB9CisKKyAgdWludDMyIGRlcHRoKCkgY29uc3QgeyByZXR1cm4gZGVwdGhfOyB9CisgIGRvdWJsZSBmYWN0b3IoKSBjb25zdCB7IHJldHVybiBmYWN0b3JfOyB9CisgIHVpbnQzMiBiYWNrZ3JvdW5kKCkgY29uc3QgeyByZXR1cm4gYmFja2dyb3VuZF87IH0KKworIHByaXZhdGU6CisgIHVpbnQzMiBkZXB0aF87CisgIGRvdWJsZSBmYWN0b3JfOworICB1aW50MzIgYmFja2dyb3VuZF87CisgIHN0ZDo6dmVjdG9yPHVpbnQzMj4gbWF0cml4XzsKK307CisKKy8vIERyYXcgc2hhZG93IG9uIHRoZSBpbWFnZSB1c2luZyBwcm92aWRlZCBTaGFkb3dNYXRyaXguCisvLyBzaGFkb3dfcmMgLSByZWN0YW5nbGUgb2NjdXBpZWQgYnkgc2hhZG93CisvLyBvYmplY3RfcmMgLSByZWN0YW5nbGUgdGhhdCBkcm9wcyB0aGUgc2hhZG93CisvLyBjbGlwX3JjIC0gY2xpcHBpbmcgcmVnaW9uCit2b2lkIERyYXdTaGFkb3cocHA6OkltYWdlRGF0YSogaW1hZ2UsCisgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIHNoYWRvd19yYywKKyAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgb2JqZWN0X3JjLAorICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBjbGlwX3JjLAorICAgICAgICAgICAgICAgIGNvbnN0IFNoYWRvd01hdHJpeCYgbWF0cml4KTsKKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmICAvLyBQREZfRFJBV19VVElMU19IXwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL2ZhZGluZ19jb250cm9sLmNjIGIveGZhX3Rlc3QvcGRmL2ZhZGluZ19jb250cm9sLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGQ4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvZmFkaW5nX2NvbnRyb2wuY2MKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9mYWRpbmdfY29udHJvbC5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAicGRmL2RyYXdfdXRpbHMuaCIKKyNpbmNsdWRlICJwZGYvcmVzb3VyY2VfY29uc3RzLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworRmFkaW5nQ29udHJvbDo6RmFkaW5nQ29udHJvbCgpCisgICAgOiBhbHBoYV9zaGlmdF8oMCksIHRpbWVyX2lkXygwKSB7Cit9CisKK0ZhZGluZ0NvbnRyb2w6On5GYWRpbmdDb250cm9sKCkgeworfQorCit2b2lkIEZhZGluZ0NvbnRyb2w6Ok9uVGltZXJGaXJlZCh1aW50MzIgdGltZXJfaWQpIHsKKyAgaWYgKHRpbWVyX2lkID09IHRpbWVyX2lkXykgeworICAgIGludDMyIG5ld19hbHBoYSA9IHRyYW5zcGFyZW5jeSgpICsgYWxwaGFfc2hpZnRfOworICAgIGlmIChuZXdfYWxwaGEgPD0ga1RyYW5zcGFyZW50QWxwaGEpIHsKKyAgICAgIFNob3coZmFsc2UsIHRydWUpOworICAgICAgT25GYWRlT3V0Q29tcGxldGUoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG5ld19hbHBoYSA+PSBrT3BhcXVlQWxwaGEpIHsKKyAgICAgIEFkanVzdFRyYW5zcGFyZW5jeShrT3BhcXVlQWxwaGEsIHRydWUpOworICAgICAgT25GYWRlSW5Db21wbGV0ZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFkanVzdFRyYW5zcGFyZW5jeShzdGF0aWNfY2FzdDx1aW50OD4obmV3X2FscGhhKSwgdHJ1ZSk7CisgICAgdGltZXJfaWRfID0gb3duZXIoKS0+U2NoZWR1bGVUaW1lcihpZCgpLCBrRmFkaW5nVGltZW91dE1zKTsKKyAgfQorfQorCisvLyBGYWRlIEluL091dCBjb250cm9sIGRlcGVuZGluZyBvbiB2aXNpYmxlIGZsYWcgb3ZlciB0aGUgdGltZSBvZiB0aW1lX21zLgordm9pZCBGYWRpbmdDb250cm9sOjpGYWRlKGJvb2wgc2hvdywgdWludDMyIHRpbWVfbXMpIHsKKyAgRENIRUNLKHRpbWVfbXMgIT0gMCk7CisgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaW4gdGhlIHNhbWUgc3RhdGUuCisgIGlmICghdmlzaWJsZSgpICYmICFzaG93KQorICAgIHJldHVybjsKKyAgaWYgKCF2aXNpYmxlKCkgJiYgc2hvdykgeworICAgIFNob3coc2hvdywgZmFsc2UpOworICAgIEFkanVzdFRyYW5zcGFyZW5jeShrVHJhbnNwYXJlbnRBbHBoYSwgZmFsc2UpOworICAgIE9uRmFkZU91dENvbXBsZXRlKCk7CisgIH0KKyAgaWYgKHRyYW5zcGFyZW5jeSgpID09IGtPcGFxdWVBbHBoYSAmJiBzaG93KSB7CisgICAgT25GYWRlSW5Db21wbGV0ZSgpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCBkZWx0YSA9IHNob3cgPyBrT3BhcXVlQWxwaGEgLSB0cmFuc3BhcmVuY3koKSA6IHRyYW5zcGFyZW5jeSgpOworICBkb3VibGUgc2hpZnQgPQorICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihkZWx0YSkgKiBrRmFkaW5nVGltZW91dE1zIC8gdGltZV9tczsKKyAgaWYgKHNoaWZ0ID4gZGVsdGEpCisgICAgYWxwaGFfc2hpZnRfID0gZGVsdGE7CisgIGVsc2UKKyAgICBhbHBoYV9zaGlmdF8gPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwoc2hpZnQpKTsKKworICBpZiAoYWxwaGFfc2hpZnRfID09IDApCisgICAgYWxwaGFfc2hpZnRfID0gMTsKKworICAvLyBJZiBkaXNhYmxpbmcsIG1ha2UgYWxwaGEgc2hpZnQgbmVnYXRpdmUuCisgIGlmICghc2hvdykKKyAgICBhbHBoYV9zaGlmdF8gPSAtYWxwaGFfc2hpZnRfOworCisgIHRpbWVyX2lkXyA9IG93bmVyKCktPlNjaGVkdWxlVGltZXIoaWQoKSwga0ZhZGluZ1RpbWVvdXRNcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvZmFkaW5nX2NvbnRyb2wuaCBiL3hmYV90ZXN0L3BkZi9mYWRpbmdfY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYWMxMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvZmFkaW5nX2NvbnRyb2wuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBERl9GQURJTkdfQ09OVFJPTF9IXworI2RlZmluZSBQREZfRkFESU5HX0NPTlRST0xfSF8KKworI2luY2x1ZGUgInBkZi9jb250cm9sLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgRmFkaW5nQ29udHJvbCA6IHB1YmxpYyBDb250cm9sIHsKKyBwdWJsaWM6CisgIEZhZGluZ0NvbnRyb2woKTsKKyAgdmlydHVhbCB+RmFkaW5nQ29udHJvbCgpOworCisgIHZpcnR1YWwgdm9pZCBPblRpbWVyRmlyZWQodWludDMyIHRpbWVyX2lkKTsKKworICAvLyBGYWRlIEluL091dCBjb250cm9sIGRlcGVuZGluZyBvbiB2aXNpYmxlIGZsYWcgb3ZlciB0aGUgdGltZSBvZiB0aW1lX21zLgorICB2aXJ0dWFsIHZvaWQgRmFkZShib29sIHZpc2libGUsIHVpbnQzMiB0aW1lX21zKTsKKworICB2aXJ0dWFsIHZvaWQgT25GYWRlSW5Db21wbGV0ZSgpIHt9CisgIHZpcnR1YWwgdm9pZCBPbkZhZGVPdXRDb21wbGV0ZSgpIHt9CisKKyBwcml2YXRlOgorICBpbnQgYWxwaGFfc2hpZnRfOworICB1aW50MzIgdGltZXJfaWRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmICAvLyBQREZfRkFESU5HX0NPTlRST0xfSF8KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9mYWRpbmdfY29udHJvbHMuY2MgYi94ZmFfdGVzdC9wZGYvZmFkaW5nX2NvbnRyb2xzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWZkODkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvZmFkaW5nX2NvbnRyb2xzLmNjCkBAIC0wLDAgKzEsMzE2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicGRmL2ZhZGluZ19jb250cm9scy5oIgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdGxfdXRpbC5oIgorI2luY2x1ZGUgInBkZi9kcmF3X3V0aWxzLmgiCisjaW5jbHVkZSAicGRmL3Jlc291cmNlX2NvbnN0cy5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9pbnB1dF9ldmVudC5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NvbnN0IHVpbnQzMiBrRmFkaW5nQWxwaGFTaGlmdCA9IDY0OworY29uc3QgdWludDMyIGtTcGxhc2hGYWRpbmdBbHBoYVNoaWZ0ID0gMTY7CisKK0ZhZGluZ0NvbnRyb2xzOjpGYWRpbmdDb250cm9scygpCisgICAgOiBzdGF0ZV8oTk9ORSksIGN1cnJlbnRfdHJhbnNwYXJlbmN5XyhrT3BhcXVlQWxwaGEpLCBmYWRpbmdfdGltZXJfaWRfKDApLAorICAgICAgY3VycmVudF9jYXB0dXJlX2NvbnRyb2xfKGtJbnZhbGlkQ29udHJvbElkKSwKKyAgICAgIGZhZGluZ190aW1lb3V0XyhrRmFkaW5nVGltZW91dE1zKSwgYWxwaGFfc2hpZnRfKGtGYWRpbmdBbHBoYVNoaWZ0KSwKKyAgICAgIHNwbGFzaF8oZmFsc2UpLCBzcGxhc2hfdGltZW91dF8oMCkgeworfQorCitGYWRpbmdDb250cm9sczo6fkZhZGluZ0NvbnRyb2xzKCkgeworICBTVExEZWxldGVFbGVtZW50cygmY29udHJvbHNfKTsKK30KKworYm9vbCBGYWRpbmdDb250cm9sczo6Q3JlYXRlRmFkaW5nQ29udHJvbHMoCisgICAgdWludDMyIGlkLCBjb25zdCBwcDo6UmVjdCYgcmMsIGJvb2wgdmlzaWJsZSwKKyAgICBDb250cm9sOjpPd25lciogb3duZXIsIHVpbnQ4IHRyYW5zcGFyZW5jeSkgeworICBjdXJyZW50X3RyYW5zcGFyZW5jeV8gPSB0cmFuc3BhcmVuY3k7CisgIHJldHVybiBDb250cm9sOjpDcmVhdGUoaWQsIHJjLCB2aXNpYmxlLCBvd25lcik7Cit9CisKK3ZvaWQgRmFkaW5nQ29udHJvbHM6OlBhaW50KHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsIGNvbnN0IHBwOjpSZWN0JiByYykgeworICAvLyBXaGVuIHRoaXMgY29udHJvbCBpcyBzZXQgdG8gaW52aXNpYmxlIHRoZSBpbmRpdmlkdWFsIGNvbnRyb2xzIGFyZSBub3QuCisgIC8vIFNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHZpc2libGUoKSBoZXJlLgorICBpZiAoIXZpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgc3RkOjpsaXN0PENvbnRyb2wqPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gY29udHJvbHNfLmJlZ2luKCk7IGl0ZXIgIT0gY29udHJvbHNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAoKml0ZXIpLT5QYWludChpbWFnZV9kYXRhLCByYyk7CisgIH0KK30KKworYm9vbCBGYWRpbmdDb250cm9sczo6SGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KSB7CisgIGlmICghdmlzaWJsZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBwcDo6TW91c2VJbnB1dEV2ZW50IG1vdXNlX2V2ZW50KGV2ZW50KTsKKyAgaWYgKG1vdXNlX2V2ZW50LmlzX251bGwoKSkKKyAgICByZXR1cm4gTm90aWZ5Q29udHJvbHMoZXZlbnQpOworCisgIHBwOjpQb2ludCBwdCA9IG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCk7CisKKyAgYm9vbCBpc19tb3VzZV9jbGljayA9CisgICAgICBtb3VzZV9ldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFRE9XTiB8fAorICAgICAgbW91c2VfZXZlbnQuR2V0VHlwZSgpID09IFBQX0lOUFVURVZFTlRfVFlQRV9NT1VTRVVQOworCisgIGlmIChyZWN0KCkuQ29udGFpbnMocHQpKSB7CisgICAgQ2FuY2VsU3BsYXNoTW9kZSgpOworICAgIEZhZGVJbigpOworCisgICAgLy8gRWF0IG1vdXNlIGNsaWNrIGlmIGFyZSBpbnZpc2libGUgb3IganVzdCBmYWRpbmcgaW4uCisgICAgLy8gVGhhdCBwcmV2ZW50cyBhY2NpZGVudGFsIGNsaWNrcyBvbiB0aGUgY29udHJvbHMgZm9yIHRvdWNoIGRldmljZXMuCisgICAgYm9vbCBlYXRfbW91c2VfY2xpY2sgPQorICAgICAgICAoc3RhdGVfID09IEZBRElOR19JTiB8fCBjdXJyZW50X3RyYW5zcGFyZW5jeV8gPT0ga1RyYW5zcGFyZW50QWxwaGEpOworICAgIGlmIChlYXRfbW91c2VfY2xpY2sgJiYgaXNfbW91c2VfY2xpY2sgJiYKKyAgICAgICAgbW91c2VfZXZlbnQuR2V0QnV0dG9uKCkgPT0gUFBfSU5QVVRFVkVOVF9NT1VTRUJVVFRPTl9MRUZUKQorICAgICAgcmV0dXJuIHRydWU7ICAvLyBFYXQgdGhpcyBldmVudCBoZXJlLgorICB9CisKKyAgaWYgKCghcmVjdCgpLkNvbnRhaW5zKHB0KSkgfHwKKyAgICAgIGV2ZW50LkdldFR5cGUoKSA9PSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VMRUFWRSkgeworICAgIGlmICghc3BsYXNoXykKKyAgICAgIEZhZGVPdXQoKTsKKyAgICBwcDo6TW91c2VJbnB1dEV2ZW50IGV2ZW50X2xlYXZlKHBwOjpNb3VzZUlucHV0RXZlbnQoCisgICAgICAgIG93bmVyKCktPkdldEluc3RhbmNlKCksCisgICAgICAgIFBQX0lOUFVURVZFTlRfVFlQRV9NT1VTRUxFQVZFLAorICAgICAgICBldmVudC5HZXRUaW1lU3RhbXAoKSwKKyAgICAgICAgZXZlbnQuR2V0TW9kaWZpZXJzKCksCisgICAgICAgIG1vdXNlX2V2ZW50LkdldEJ1dHRvbigpLAorICAgICAgICBtb3VzZV9ldmVudC5HZXRQb3NpdGlvbigpLAorICAgICAgICBtb3VzZV9ldmVudC5HZXRDbGlja0NvdW50KCksCisgICAgICAgIG1vdXNlX2V2ZW50LkdldE1vdmVtZW50KCkpKTsKKyAgICByZXR1cm4gTm90aWZ5Q29udHJvbHMoZXZlbnRfbGVhdmUpOworICB9CisKKyAgcmV0dXJuIE5vdGlmeUNvbnRyb2xzKGV2ZW50KTsKK30KKwordm9pZCBGYWRpbmdDb250cm9sczo6T25UaW1lckZpcmVkKHVpbnQzMiB0aW1lcl9pZCkgeworICBpZiAodGltZXJfaWQgPT0gZmFkaW5nX3RpbWVyX2lkXykgeworICAgIGludDMyIGN1cnJlbnRfYWxwaGEgPSBzdGF0aWNfY2FzdDxpbnQzMj4oY3VycmVudF90cmFuc3BhcmVuY3lfKTsKKyAgICBpZiAoc3RhdGVfID09IEZBRElOR19JTikKKyAgICAgIGN1cnJlbnRfYWxwaGEgKz0gYWxwaGFfc2hpZnRfOworICAgIGVsc2UgaWYgKHN0YXRlXyA9PSBGQURJTkdfT1VUKQorICAgICAgY3VycmVudF9hbHBoYSAtPSBhbHBoYV9zaGlmdF87CisKKyAgICBpZiAoY3VycmVudF9hbHBoYSA+PSBrT3BhcXVlQWxwaGEpIHsKKyAgICAgIHN0YXRlXyA9IE5PTkU7CisgICAgICBjdXJyZW50X2FscGhhID0ga09wYXF1ZUFscGhhOworICAgIH0gZWxzZSBpZiAoY3VycmVudF9hbHBoYSA8PSBrVHJhbnNwYXJlbnRBbHBoYSkgeworICAgICAgc3RhdGVfID0gTk9ORTsKKyAgICAgIGN1cnJlbnRfYWxwaGEgPSBrVHJhbnNwYXJlbnRBbHBoYTsKKyAgICB9CisgICAgY3VycmVudF90cmFuc3BhcmVuY3lfID0gc3RhdGljX2Nhc3Q8dWludDg+KGN1cnJlbnRfYWxwaGEpOworCisgICAgLy8gSW52YWxpZGF0ZSBjb250cm9scyB3aXRoIG5ldyBhbHBoYSB0cmFuc3BhcmVuY3kuCisgICAgc3RkOjpsaXN0PENvbnRyb2wqPjo6aXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBjb250cm9sc18uYmVnaW4oKTsgaXRlciAhPSBjb250cm9sc18uZW5kKCk7ICsraXRlcikgeworICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIGludmFsaWRhdGUgdGhlIHdob2xlIEZhZGluZ0NvbnRyb2xzIGFyZWEsIHRvCisgICAgICAvLyBhbGxvdyBzaW11bHRhbmVvdXMgZHJhd2luZy4KKyAgICAgICgqaXRlciktPkFkanVzdFRyYW5zcGFyZW5jeShjdXJyZW50X3RyYW5zcGFyZW5jeV8sIGZhbHNlKTsKKyAgICB9CisgICAgb3duZXIoKS0+SW52YWxpZGF0ZShpZCgpLCBHZXRDb250cm9sc1JlY3QoKSk7CisKKyAgICBpZiAoc3RhdGVfICE9IE5PTkUpICAvLyBGYWRpbmcgc3RpbGwgaW4gcHJvZ3Jlc3MuCisgICAgICBmYWRpbmdfdGltZXJfaWRfID0gb3duZXIoKS0+U2NoZWR1bGVUaW1lcihpZCgpLCBmYWRpbmdfdGltZW91dF8pOworICAgIGVsc2UKKyAgICAgIE9uRmFkaW5nQ29tcGxldGUoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBEaXNwYXRjaCB0aW1lciB0byBjb250cm9scy4KKyAgICBzdGQ6Omxpc3Q8Q29udHJvbCo+OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGNvbnRyb2xzXy5iZWdpbigpOyBpdGVyICE9IGNvbnRyb2xzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAoKml0ZXIpLT5PblRpbWVyRmlyZWQodGltZXJfaWQpOworICAgIH0KKyAgfQorfQorCit2b2lkIEZhZGluZ0NvbnRyb2xzOjpFdmVudENhcHR1cmVSZWxlYXNlZCgpIHsKKyAgaWYgKGN1cnJlbnRfY2FwdHVyZV9jb250cm9sXyAhPSBrSW52YWxpZENvbnRyb2xJZCkgeworICAgIC8vIFJlbW92ZSBwcmV2aW91cyBjYXRwdXJlLgorICAgIENvbnRyb2wqIGN0cmwgPSBHZXRDb250cm9sKGN1cnJlbnRfY2FwdHVyZV9jb250cm9sXyk7CisgICAgaWYgKGN0cmwpCisgICAgICBjdHJsLT5FdmVudENhcHR1cmVSZWxlYXNlZCgpOworICB9Cit9CisKK3ZvaWQgRmFkaW5nQ29udHJvbHM6Ok1vdmVCeShjb25zdCBwcDo6UG9pbnQmIG9mZnNldCwgYm9vbCBpbnZhbGlkYXRlKSB7CisgIHN0ZDo6bGlzdDxDb250cm9sKj46Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGNvbnRyb2xzXy5iZWdpbigpOyBpdGVyICE9IGNvbnRyb2xzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgLy8gV2UgaW52YWxpZGF0ZSBlbnRpcmUgRmFkaW5nQ29udHJvbCBsYXRlciBpZiBuZWVkZWQuCisgICAgKCppdGVyKS0+TW92ZUJ5KG9mZnNldCwgZmFsc2UpOworICB9CisgIENvbnRyb2w6Ok1vdmVCeShvZmZzZXQsIGludmFsaWRhdGUpOworfQorCit2b2lkIEZhZGluZ0NvbnRyb2xzOjpPbkV2ZW50KHVpbnQzMiBjb250cm9sX2lkLCB1aW50MzIgZXZlbnRfaWQsIHZvaWQqIGRhdGEpIHsKKyAgb3duZXIoKS0+T25FdmVudChjb250cm9sX2lkLCBldmVudF9pZCwgZGF0YSk7Cit9CisKK3ZvaWQgRmFkaW5nQ29udHJvbHM6OkludmFsaWRhdGUodWludDMyIGNvbnRyb2xfaWQsIGNvbnN0IHBwOjpSZWN0JiByYykgeworICBvd25lcigpLT5JbnZhbGlkYXRlKGNvbnRyb2xfaWQsIHJjKTsKK30KKwordWludDMyIEZhZGluZ0NvbnRyb2xzOjpTY2hlZHVsZVRpbWVyKHVpbnQzMiBjb250cm9sX2lkLCB1aW50MzIgdGltZW91dF9tcykgeworICAvLyBUT0RPKGdlbmUpOiBpbXBsZW1lbnQgdGltZXIgcm91dGluZSBwcm9wZXJseS4KKyAgTk9USU1QTEVNRU5URUQoKTsKKyAgLy9vd25lcigpLT5TY2hlZHVsZVRpbWVyKGNvbnRyb2xfaWQpOworICByZXR1cm4gMDsKK30KKwordm9pZCBGYWRpbmdDb250cm9sczo6U2V0RXZlbnRDYXB0dXJlKHVpbnQzMiBjb250cm9sX2lkLCBib29sIHNldF9jYXB0dXJlKSB7CisgIGlmIChjb250cm9sX2lkID09IGN1cnJlbnRfY2FwdHVyZV9jb250cm9sXykgeworICAgIGlmICghc2V0X2NhcHR1cmUpICAvLyBSZW1vdmUgZXZlbnQgY2FwdHVyZS4KKyAgICAgIGN1cnJlbnRfY2FwdHVyZV9jb250cm9sXyA9IGtJbnZhbGlkQ29udHJvbElkOworICB9IGVsc2UgeworICAgIEV2ZW50Q2FwdHVyZVJlbGVhc2VkKCk7CisgICAgY3VycmVudF9jYXB0dXJlX2NvbnRyb2xfID0gY29udHJvbF9pZDsKKyAgfQorfQorCit2b2lkIEZhZGluZ0NvbnRyb2xzOjpTZXRDdXJzb3IodWludDMyIGNvbnRyb2xfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBfQ3Vyc29yVHlwZV9EZXYgY3Vyc29yX3R5cGUpIHsKKyAgb3duZXIoKS0+U2V0Q3Vyc29yKGNvbnRyb2xfaWQsIGN1cnNvcl90eXBlKTsKK30KKworcHA6Okluc3RhbmNlKiBGYWRpbmdDb250cm9sczo6R2V0SW5zdGFuY2UoKSB7CisgIHJldHVybiBvd25lcigpLT5HZXRJbnN0YW5jZSgpOworfQorCitib29sIEZhZGluZ0NvbnRyb2xzOjpBZGRDb250cm9sKENvbnRyb2wqIGNvbnRyb2wpIHsKKyAgRENIRUNLKGNvbnRyb2wpOworICBpZiAoY29udHJvbC0+b3duZXIoKSAhPSB0aGlzKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFyZWN0KCkuQ29udGFpbnMoY29udHJvbC0+cmVjdCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29udHJvbC0+QWRqdXN0VHJhbnNwYXJlbmN5KGN1cnJlbnRfdHJhbnNwYXJlbmN5XywgZmFsc2UpOworICBjb250cm9sc18ucHVzaF9iYWNrKGNvbnRyb2wpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGYWRpbmdDb250cm9sczo6UmVtb3ZlQ29udHJvbCh1aW50MzIgY29udHJvbF9pZCkgeworICBpZiAoY3VycmVudF9jYXB0dXJlX2NvbnRyb2xfID09IGNvbnRyb2xfaWQpIHsKKyAgICBjdXJyZW50X2NhcHR1cmVfY29udHJvbF8gPSBrSW52YWxpZENvbnRyb2xJZDsKKyAgfQorICBzdGQ6Omxpc3Q8Q29udHJvbCo+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBjb250cm9sc18uYmVnaW4oKTsgaXRlciAhPSBjb250cm9sc18uZW5kKCk7ICsraXRlcikgeworICAgIGlmICgoKml0ZXIpLT5pZCgpID09IGNvbnRyb2xfaWQpIHsKKyAgICAgIGRlbGV0ZSAoKml0ZXIpOworICAgICAgY29udHJvbHNfLmVyYXNlKGl0ZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK0NvbnRyb2wqIEZhZGluZ0NvbnRyb2xzOjpHZXRDb250cm9sKHVpbnQzMiBpZCkgeworICBzdGQ6Omxpc3Q8Q29udHJvbCo+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBjb250cm9sc18uYmVnaW4oKTsgaXRlciAhPSBjb250cm9sc18uZW5kKCk7ICsraXRlcikgeworICAgIGlmICgoKml0ZXIpLT5pZCgpID09IGlkKQorICAgICAgcmV0dXJuICppdGVyOworICB9CisgIHJldHVybiBOVUxMOworfQorCitwcDo6UmVjdCBGYWRpbmdDb250cm9sczo6R2V0Q29udHJvbHNSZWN0KCkgeworICBwcDo6UmVjdCByYzsKKyAgc3RkOjpsaXN0PENvbnRyb2wqPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gY29udHJvbHNfLmJlZ2luKCk7IGl0ZXIgIT0gY29udHJvbHNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICByYyA9IHJjLlVuaW9uKCgqaXRlciktPnJlY3QoKSk7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCitib29sIEZhZGluZ0NvbnRyb2xzOjpFeHBhbmRMZWZ0KGludCBvZmZzZXQpIHsKKyAgcHA6OlJlY3QgcmMgPSByZWN0KCk7CisgIHJjLnNldF93aWR0aChyYy53aWR0aCgpICsgb2Zmc2V0KTsKKyAgcmMuc2V0X3gocmMueCgpIC0gb2Zmc2V0KTsKKyAgaWYgKCFyYy5Db250YWlucyhHZXRDb250cm9sc1JlY3QoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBObyBuZWVkIHRvIGludmFsaWRhdGUgc2luY2Ugd2UgYXJlIGV4cGFuZGluZyB0cmlnZ2VyaW5nIGFyZWEgb25seS4KKyAgU2V0UmVjdChyYywgZmFsc2UpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGYWRpbmdDb250cm9sczo6U3BsYXNoKHVpbnQzMiB0aW1lX21zKSB7CisgIHNwbGFzaF8gPSB0cnVlOworICBzcGxhc2hfdGltZW91dF8gPSB0aW1lX21zOworICBhbHBoYV9zaGlmdF8gPSBrU3BsYXNoRmFkaW5nQWxwaGFTaGlmdDsKKyAgRmFkZUluKCk7Cit9CisKK2Jvb2wgRmFkaW5nQ29udHJvbHM6Ok5vdGlmeUNvbnRyb2xzKGNvbnN0IHBwOjpJbnB1dEV2ZW50JiBldmVudCkgeworICAvLyBGaXJzdCBwYXNzIGV2ZW50IHRvIGEgY29udHJvbCB0aGF0IGN1cnJlbnQgY2FwdHVyZSBpcyBzZXQgdG8uCisgIENvbnRyb2wqIGN0cmwgPSBHZXRDb250cm9sKGN1cnJlbnRfY2FwdHVyZV9jb250cm9sXyk7CisgIGlmIChjdHJsKSB7CisgICAgaWYgKGN0cmwtPkhhbmRsZUV2ZW50KGV2ZW50KSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RkOjpsaXN0PENvbnRyb2wqPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gY29udHJvbHNfLmJlZ2luKCk7IGl0ZXIgIT0gY29udHJvbHNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAvLyBOb3cgcGFzcyBldmVudCB0byBhbGwgY29udHJvbCBleGNlcHQgY29udHJvbCB3aXRoIGNhcHR1cmUsCisgICAgLy8gc2luY2Ugd2UgYWxyZWFkeSBwYXNzZWQgdG8gaXQgYWJvdmUuCisgICAgaWYgKCgqaXRlcikgIT0gY3RybCAmJiAoKml0ZXIpLT5IYW5kbGVFdmVudChldmVudCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRmFkaW5nQ29udHJvbHM6OkZhZGVJbigpIHsKKyAgYm9vbCBhbHJlYWR5X3Zpc2libGUgPQorICAgICAgKHN0YXRlXyA9PSBOT05FICYmIGN1cnJlbnRfdHJhbnNwYXJlbmN5XyA9PSBrT3BhcXVlQWxwaGEpOworICBpZiAoc3RhdGVfICE9IEZBRElOR19JTiAmJiAhYWxyZWFkeV92aXNpYmxlKSB7CisgICAgc3RhdGVfID0gRkFESU5HX0lOOworICAgIGZhZGluZ190aW1lcl9pZF8gPSBvd25lcigpLT5TY2hlZHVsZVRpbWVyKGlkKCksIGZhZGluZ190aW1lb3V0Xyk7CisgIH0KKyAgaWYgKGFscmVhZHlfdmlzaWJsZSkKKyAgICBPbkZhZGluZ0NvbXBsZXRlKCk7Cit9CisKK3ZvaWQgRmFkaW5nQ29udHJvbHM6OkZhZGVPdXQoKSB7CisgIGJvb2wgYWxyZWFkeV9pbnZpc2libGUgPQorICAgICAgKHN0YXRlXyA9PSBOT05FICYmIGN1cnJlbnRfdHJhbnNwYXJlbmN5XyA9PSBrVHJhbnNwYXJlbnRBbHBoYSk7CisgIGlmIChzdGF0ZV8gIT0gRkFESU5HX09VVCAmJiAhYWxyZWFkeV9pbnZpc2libGUpIHsKKyAgICBzdGF0ZV8gPSBGQURJTkdfT1VUOworICAgIGZhZGluZ190aW1lcl9pZF8gPSBvd25lcigpLT5TY2hlZHVsZVRpbWVyKGlkKCksIGZhZGluZ190aW1lb3V0Xyk7CisgIH0KKyAgaWYgKGFscmVhZHlfaW52aXNpYmxlKQorICAgIE9uRmFkaW5nQ29tcGxldGUoKTsKK30KKwordm9pZCBGYWRpbmdDb250cm9sczo6T25GYWRpbmdDb21wbGV0ZSgpIHsKKyAgRENIRUNLKGN1cnJlbnRfdHJhbnNwYXJlbmN5XyA9PSBrT3BhcXVlQWxwaGEgfHwKKyAgICAgIGN1cnJlbnRfdHJhbnNwYXJlbmN5XyA9PSBrVHJhbnNwYXJlbnRBbHBoYSk7CisgIC8vIEluIHRoZSBzcGxhc2ggbW9kZSBmb2xsb3dpbmcgc3RhdGVzIGFyZSBwb3NzaWJsZToKKyAgLy8gRmFkZS1pbiBjb21wbGV0ZTogc3BsYXNoXz09dHJ1ZSwgc3BsYXNoX3RpbWVvdXRfICE9IDAKKyAgLy8gICBXZSBuZWVkIHRvIHNjaGVkdWxlIHRpbWVyIGZvciBzcGxhc2hfdGltZW91dF8uCisgIC8vIFNwbGFzaCB0aW1lb3V0IGNvbXBsZXRlOiBzcGxhc2hfPT10cnVlLCBzcGxhc2hfdGltZW91dF8gPT0gMAorICAvLyAgIFdlIG5lZWQgdG8gZmFkZSBvdXQgc3RpbGwgdXNpbmcgc3BsYXNoIHNldHRpbmdzLgorICAvLyBGYWRlLW91dCBjb21wbGV0ZTogY3VycmVudF90cmFuc3BhcmVuY3lfID09IGtUcmFuc3BhcmVudEFscGhhCisgIC8vICAgV2UgbmVlZCB0byBjYW5jZWwgc3BsYXNoIG1vZGUgYW5kIGdvIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdzLgorICBpZiAoc3BsYXNoXykgeworICAgIGlmIChjdXJyZW50X3RyYW5zcGFyZW5jeV8gPT0ga09wYXF1ZUFscGhhKSB7CisgICAgICBpZiAoc3BsYXNoX3RpbWVvdXRfKSB7CisgICAgICAgIGZhZGluZ190aW1lcl9pZF8gPSBvd25lcigpLT5TY2hlZHVsZVRpbWVyKGlkKCksIHNwbGFzaF90aW1lb3V0Xyk7CisgICAgICAgIHNwbGFzaF90aW1lb3V0XyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBGYWRlT3V0KCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENhbmNlbFNwbGFzaE1vZGUoKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBGYWRpbmdDb250cm9sczo6Q2FuY2VsU3BsYXNoTW9kZSgpIHsKKyAgc3BsYXNoXyA9IGZhbHNlOworICBhbHBoYV9zaGlmdF8gPSBrRmFkaW5nQWxwaGFTaGlmdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9mYWRpbmdfY29udHJvbHMuaCBiL3hmYV90ZXN0L3BkZi9mYWRpbmdfY29udHJvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI0NjRiCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL2ZhZGluZ19jb250cm9scy5oCkBAIC0wLDAgKzEsODQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX0ZBRElOR19DT05UUk9MU19IXworI2RlZmluZSBQREZfRkFESU5HX0NPTlRST0xTX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSAicGRmL2NvbnRyb2wuaCIKKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCitjbGFzcyBGYWRpbmdDb250cm9scyA6IHB1YmxpYyBDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29udHJvbE93bmVyIHsKKyBwdWJsaWM6CisgIGVudW0gRmFkaW5nU3RhdGUgeworICAgIE5PTkUsCisgICAgRkFESU5HX0lOLAorICAgIEZBRElOR19PVVQKKyAgfTsKKworICBGYWRpbmdDb250cm9scygpOworICB2aXJ0dWFsIH5GYWRpbmdDb250cm9scygpOworICB2aXJ0dWFsIGJvb2wgQ3JlYXRlRmFkaW5nQ29udHJvbHMoCisgICAgICB1aW50MzIgaWQsIGNvbnN0IHBwOjpSZWN0JiByYywgYm9vbCB2aXNpYmxlLAorICAgICAgQ29udHJvbDo6T3duZXIqIGRlbGVnYXRlLCB1aW50OCB0cmFuc3BhcmVuY3kpOworCisgIC8vIENvbnRyb2wgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgUGFpbnQocHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwgY29uc3QgcHA6OlJlY3QmIHJjKTsKKyAgdmlydHVhbCBib29sIEhhbmRsZUV2ZW50KGNvbnN0IHBwOjpJbnB1dEV2ZW50JiBldmVudCk7CisgIHZpcnR1YWwgdm9pZCBPblRpbWVyRmlyZWQodWludDMyIHRpbWVyX2lkKTsKKyAgdmlydHVhbCB2b2lkIEV2ZW50Q2FwdHVyZVJlbGVhc2VkKCk7CisgIHZpcnR1YWwgdm9pZCBNb3ZlQnkoY29uc3QgcHA6OlBvaW50JiBvZmZzZXQsIGJvb2wgaW52YWxpZGF0ZSk7CisKKyAgLy8gQ29udHJvbE93bmVyIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIE9uRXZlbnQodWludDMyIGNvbnRyb2xfaWQsIHVpbnQzMiBldmVudF9pZCwgdm9pZCogZGF0YSk7CisgIHZpcnR1YWwgdm9pZCBJbnZhbGlkYXRlKHVpbnQzMiBjb250cm9sX2lkLCBjb25zdCBwcDo6UmVjdCYgcmMpOworICB2aXJ0dWFsIHVpbnQzMiBTY2hlZHVsZVRpbWVyKHVpbnQzMiBjb250cm9sX2lkLCB1aW50MzIgdGltZW91dF9tcyk7CisgIHZpcnR1YWwgdm9pZCBTZXRFdmVudENhcHR1cmUodWludDMyIGNvbnRyb2xfaWQsIGJvb2wgc2V0X2NhcHR1cmUpOworICB2aXJ0dWFsIHZvaWQgU2V0Q3Vyc29yKHVpbnQzMiBjb250cm9sX2lkLCBQUF9DdXJzb3JUeXBlX0RldiBjdXJzb3JfdHlwZSk7CisgIHZpcnR1YWwgcHA6Okluc3RhbmNlKiBHZXRJbnN0YW5jZSgpOworCisgIC8vIEZhZGluZ0NvbnRyb2xzIGludGVyZmFjZQorICAvLyBUaGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgY29udHJvbCwgYW5kIHdpbGwgZGVzdG95IGl0CisgIC8vIHdoZW4gY29udHJvbCBpcyBkZXN0cm95ZWQuCisgIC8vIElucHV0IGNvbnRyb2wgTVVTVCBiZSBsb2NhdGVkIGluc2lkZSBGYWRpbmdDb250cm9scyBib3VuZGFyaWVzLCBhbmQgaGFzCisgIC8vIHRoaXMgaW5zdGFuY2Ugb2YgRmFkaW5nQ29udHJvbHMgYXMgYSBkZWxlZ2F0ZS4KKyAgdmlydHVhbCBib29sIEFkZENvbnRyb2woQ29udHJvbCogY29udHJvbCk7CisgIHZpcnR1YWwgdm9pZCBSZW1vdmVDb250cm9sKHVpbnQzMiBjb250cm9sX2lkKTsKKyAgdmlydHVhbCBDb250cm9sKiBHZXRDb250cm9sKHVpbnQzMiBpZCk7CisgIHZpcnR1YWwgcHA6OlJlY3QgR2V0Q29udHJvbHNSZWN0KCk7CisKKyAgLy8gRXhwYW5kL1NocmluayBhcmVhIHdoaWNoIHRyaWdnZXJzIGlubmVyIGNvbnRyb2wgYXBwZWFyYW5jZSB0byB0aGUgbGVmdC4KKyAgdmlydHVhbCBib29sIEV4cGFuZExlZnQoaW50IG9mZnNldCk7CisKKyAgLy8gRmFkZS1pbiwgdGhlbiBzaG93IGNvbnRyb2xzIGZvciB0aW1lX21zLCBhbmQgdGhlbiBmYWRlLW91dC4gQW55IG1vdXNlCisgIC8vIGV2ZW50IGluIHRoaXMgY29udHJvbCBhcmVhIHdpbGwgaW50ZXJydXB0IHNwbGFzaCBtb2RlLgorICB2aXJ0dWFsIHZvaWQgU3BsYXNoKHVpbnQzMiB0aW1lX21zKTsKKworICB1aW50OCBjdXJyZW50X3RyYW5zcGFyZW5jeSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdHJhbnNwYXJlbmN5XzsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBOb3RpZnlDb250cm9scyhjb25zdCBwcDo6SW5wdXRFdmVudCYgZXZlbnQpOworICB2b2lkIEZhZGVJbigpOworICB2b2lkIEZhZGVPdXQoKTsKKyAgdm9pZCBPbkZhZGluZ0NvbXBsZXRlKCk7CisgIHZvaWQgQ2FuY2VsU3BsYXNoTW9kZSgpOworCisgIHN0ZDo6bGlzdDxDb250cm9sKj4gY29udHJvbHNfOworICBGYWRpbmdTdGF0ZSBzdGF0ZV87CisgIHVpbnQ4IGN1cnJlbnRfdHJhbnNwYXJlbmN5XzsKKyAgdWludDMyIGZhZGluZ190aW1lcl9pZF87CisgIHVpbnQzMiBjdXJyZW50X2NhcHR1cmVfY29udHJvbF87CisgIHVpbnQzMiBmYWRpbmdfdGltZW91dF87CisgIHVpbnQzMiBhbHBoYV9zaGlmdF87CisgIGJvb2wgc3BsYXNoXzsKKyAgdWludDMyIHNwbGFzaF90aW1lb3V0XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKKyNlbmRpZiAgLy8gUERGX0ZBRElOR19DT05UUk9MU19IXworCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvaW5zdGFuY2UuY2MgYi94ZmFfdGVzdC9wZGYvaW5zdGFuY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMmY3OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9pbnN0YW5jZS5jYwpAQCAtMCwwICsxLDI3NzggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwZGYvaW5zdGFuY2UuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIGZvciBtaW4oKQorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUyAgLy8gZm9yIE1fUEkKKyNpbmNsdWRlIDxjbWF0aD4gICAgICAvLyBmb3IgbG9nKCkgYW5kIHBvdygpCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlICJiYXNlL2pzb24vanNvbl9yZWFkZXIuaCIKKyNpbmNsdWRlICJiYXNlL2pzb24vanNvbl93cml0ZXIuaCIKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfc3BsaXQuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL3ZhbHVlcy5oIgorI2luY2x1ZGUgImNocm9tZS9icm93c2VyL2Nocm9tZV9wYWdlX3pvb21fY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi9jb250ZW50X3Jlc3RyaWN0aW9uLmgiCisjaW5jbHVkZSAiY29udGVudC9wdWJsaWMvY29tbW9uL3BhZ2Vfem9vbS5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL2VzY2FwZS5oIgorI2luY2x1ZGUgInBkZi9kcmF3X3V0aWxzLmgiCisjaW5jbHVkZSAicGRmL251bWJlcl9pbWFnZV9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJwZGYvcGRmLmgiCisjaW5jbHVkZSAicGRmL3Jlc291cmNlX2NvbnN0cy5oIgorI2luY2x1ZGUgInBwYXBpL2MvZGV2L3BwYl9jdXJzb3JfY29udHJvbF9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jL3BwX2Vycm9ycy5oIgorI2luY2x1ZGUgInBwYXBpL2MvcHBfcmVjdC5oIgorI2luY2x1ZGUgInBwYXBpL2MvcHJpdmF0ZS9wcHBfcGRmLmgiCisjaW5jbHVkZSAicHBhcGkvYy90cnVzdGVkL3BwYl91cmxfbG9hZGVyX3RydXN0ZWQuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvY29yZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvZm9udF9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvZGV2L21lbW9yeV9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvZGV2L3RleHRfaW5wdXRfZGV2LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL21vZHVsZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9wb2ludC5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9wcml2YXRlL3BkZi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9yZWN0LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3Jlc291cmNlLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3VybF9yZXF1ZXN0X2luZm8uaCIKKyNpbmNsdWRlICJ1aS9ldmVudHMva2V5Y29kZXMva2V5Ym9hcmRfY29kZXMuaCIKKworI2lmIGRlZmluZWQoT1NfTUFDT1NYKQorI2luY2x1ZGUgImJhc2UvbWFjL21hY191dGlsLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCitzdHJ1Y3QgVG9vbGJhckJ1dHRvbkluZm8geworICB1aW50MzIgaWQ7CisgIEJ1dHRvbjo6QnV0dG9uU3R5bGUgc3R5bGU7CisgIFBQX1Jlc291cmNlSW1hZ2Ugbm9ybWFsOworICBQUF9SZXNvdXJjZUltYWdlIGhpZ2hsaWdodGVkOworICBQUF9SZXNvdXJjZUltYWdlIHByZXNzZWQ7Cit9OworCituYW1lc3BhY2UgeworCisvLyBVbmNvbW1lbnQgZm9sbG93aW5nICNkZWZpbmUgdG8gZW5hYmxlIHRodW1ibmFpbHMuCisvLyAjZGVmaW5lIEVOQUJMRV9USFVNQk5BSUxTCisKK2NvbnN0IHVpbnQzMiBrVG9vbGJhclNwbGFzaFRpbWVvdXRNcyA9IDYwMDA7Citjb25zdCB1aW50MzIga01lc3NhZ2VUZXh0Q29sb3IgPSAweEZGNTc1NzU3OworY29uc3QgdWludDMyIGtNZXNzYWdlVGV4dFNpemUgPSAyMjsKK2NvbnN0IHVpbnQzMiBrUHJvZ3Jlc3NGYWRlVGltZW91dE1zID0gMjUwOworY29uc3QgdWludDMyIGtQcm9ncmVzc0RlbGF5VGltZW91dE1zID0gMTAwMDsKK2NvbnN0IHVpbnQzMiBrQXV0b1Njcm9sbFRpbWVvdXRNcyA9IDUwOworY29uc3QgZG91YmxlIGtBdXRvU2Nyb2xsRmFjdG9yID0gMC4yOworCisvLyBKYXZhc2NyaXB0IG1ldGhvZHMuCitjb25zdCBjaGFyIGtKU0FjY2Vzc2liaWxpdHlbXSA9ICJhY2Nlc3NpYmlsaXR5IjsKK2NvbnN0IGNoYXIga0pTRG9jdW1lbnRMb2FkQ29tcGxldGVbXSA9ICJkb2N1bWVudExvYWRDb21wbGV0ZSI7Citjb25zdCBjaGFyIGtKU0dldEhlaWdodFtdID0gImdldEhlaWdodCI7Citjb25zdCBjaGFyIGtKU0dldEhvcml6b250YWxTY3JvbGxiYXJUaGlja25lc3NbXSA9CisgICAgImdldEhvcml6b250YWxTY3JvbGxiYXJUaGlja25lc3MiOworY29uc3QgY2hhciBrSlNHZXRQYWdlTG9jYXRpb25Ob3JtYWxpemVkW10gPSAiZ2V0UGFnZUxvY2F0aW9uTm9ybWFsaXplZCI7Citjb25zdCBjaGFyIGtKU0dldFNlbGVjdGVkVGV4dFtdID0gImdldFNlbGVjdGVkVGV4dCI7Citjb25zdCBjaGFyIGtKU0dldFZlcnRpY2FsU2Nyb2xsYmFyVGhpY2tuZXNzW10gPSAiZ2V0VmVydGljYWxTY3JvbGxiYXJUaGlja25lc3MiOworY29uc3QgY2hhciBrSlNHZXRXaWR0aFtdID0gImdldFdpZHRoIjsKK2NvbnN0IGNoYXIga0pTR2V0Wm9vbUxldmVsW10gPSAiZ2V0Wm9vbUxldmVsIjsKK2NvbnN0IGNoYXIga0pTR29Ub1BhZ2VbXSA9ICJnb1RvUGFnZSI7Citjb25zdCBjaGFyIGtKU0dyYXlzY2FsZVtdID0gImdyYXlzY2FsZSI7Citjb25zdCBjaGFyIGtKU0xvYWRQcmV2aWV3UGFnZVtdID0gImxvYWRQcmV2aWV3UGFnZSI7Citjb25zdCBjaGFyIGtKU09uTG9hZFtdID0gIm9ubG9hZCI7Citjb25zdCBjaGFyIGtKU09uUGx1Z2luU2l6ZUNoYW5nZWRbXSA9ICJvblBsdWdpblNpemVDaGFuZ2VkIjsKK2NvbnN0IGNoYXIga0pTT25TY3JvbGxbXSA9ICJvblNjcm9sbCI7Citjb25zdCBjaGFyIGtKU1BhZ2VYT2Zmc2V0W10gPSAicGFnZVhPZmZzZXQiOworY29uc3QgY2hhciBrSlNQYWdlWU9mZnNldFtdID0gInBhZ2VZT2Zmc2V0IjsKK2NvbnN0IGNoYXIga0pTUHJpbnRQcmV2aWV3UGFnZUNvdW50W10gPSAicHJpbnRQcmV2aWV3UGFnZUNvdW50IjsKK2NvbnN0IGNoYXIga0pTUmVsb2FkW10gPSAicmVsb2FkIjsKK2NvbnN0IGNoYXIga0pTUmVtb3ZlUHJpbnRCdXR0b25bXSA9ICJyZW1vdmVQcmludEJ1dHRvbiI7Citjb25zdCBjaGFyIGtKU1Jlc2V0UHJpbnRQcmV2aWV3VXJsW10gPSAicmVzZXRQcmludFByZXZpZXdVcmwiOworY29uc3QgY2hhciBrSlNTZW5kS2V5RXZlbnRbXSA9ICJzZW5kS2V5RXZlbnQiOworY29uc3QgY2hhciBrSlNTZXRQYWdlTnVtYmVyc1tdID0gInNldFBhZ2VOdW1iZXJzIjsKK2NvbnN0IGNoYXIga0pTU2V0UGFnZVhPZmZzZXRbXSA9ICJzZXRQYWdlWE9mZnNldCI7Citjb25zdCBjaGFyIGtKU1NldFBhZ2VZT2Zmc2V0W10gPSAic2V0UGFnZVlPZmZzZXQiOworY29uc3QgY2hhciBrSlNTZXRab29tTGV2ZWxbXSA9ICJzZXRab29tTGV2ZWwiOworY29uc3QgY2hhciBrSlNab29tRml0VG9IZWlnaHRbXSA9ICJmaXRUb0hlaWdodCI7Citjb25zdCBjaGFyIGtKU1pvb21GaXRUb1dpZHRoW10gPSAiZml0VG9XaWR0aCI7Citjb25zdCBjaGFyIGtKU1pvb21JbltdID0gInpvb21JbiI7Citjb25zdCBjaGFyIGtKU1pvb21PdXRbXSA9ICJ6b29tT3V0IjsKKworLy8gVVJMIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgorLy8gRm9yIG1vcmUgcG9zc2libGUgcGFyYW1ldGVycywgc2VlIFJGQyAzNzc4IGFuZCB0aGUgIlBERiBPcGVuIFBhcmFtZXRlcnMiCisvLyBkb2N1bWVudCBmcm9tIEFkb2JlLgorY29uc3QgY2hhciBrRGVsaW1pdGVyc1tdID0gIiMmIjsKK2NvbnN0IGNoYXIga05hbWVkRGVzdFtdID0gIm5hbWVkZGVzdCI7Citjb25zdCBjaGFyIGtQYWdlW10gPSAicGFnZSI7CisKK2NvbnN0IGNoYXIga0Nocm9tZVByaW50W10gPSAiY2hyb21lOi8vcHJpbnQvIjsKKworLy8gRGljdGlvbmFyeSBWYWx1ZSBrZXkgbmFtZXMgZm9yIHRoZSBkb2N1bWVudCBhY2Nlc3NpYmlsaXR5IGluZm8KK2NvbnN0IGNoYXIga0FjY2Vzc2libGVOdW1iZXJPZlBhZ2VzW10gPSAibnVtYmVyT2ZQYWdlcyI7Citjb25zdCBjaGFyIGtBY2Nlc3NpYmxlTG9hZGVkW10gPSAibG9hZGVkIjsKK2NvbnN0IGNoYXIga0FjY2Vzc2libGVDb3B5YWJsZVtdID0gImNvcHlhYmxlIjsKKworY29uc3QgVG9vbGJhckJ1dHRvbkluZm8ga1BERlRvb2xiYXJCdXR0b25zW10gPSB7CisgIHsga0ZpdFRvUGFnZUJ1dHRvbklkLCBCdXR0b246OkJVVFRPTl9TVEFURSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9GVFAsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fRlRQX0hPVkVSLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX0ZUUF9QUkVTU0VEIH0sCisgIHsga0ZpdFRvV2lkdGhCdXR0b25JZCwgQnV0dG9uOjpCVVRUT05fU1RBVEUsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fRlRXLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX0ZUV19IT1ZFUiwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9GVFdfUFJFU1NFRCB9LAorICB7IGtab29tT3V0QnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9aT09NT1VULAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1pPT01PVVRfSE9WRVIsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fWk9PTU9VVF9QUkVTU0VEIH0sCisgIHsga1pvb21JbkJ1dHRvbklkLCBCdXR0b246OkJVVFRPTl9DTElDS0FCTEUsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fWk9PTUlOLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1pPT01JTl9IT1ZFUiwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9aT09NSU5fUFJFU1NFRCB9LAorICB7IGtTYXZlQnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9TQVZFLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1NBVkVfSE9WRVIsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fU0FWRV9QUkVTU0VEIH0sCisgIHsga1ByaW50QnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9QUklOVCwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9QUklOVF9IT1ZFUiwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9QUklOVF9QUkVTU0VEIH0sCit9OworCitjb25zdCBUb29sYmFyQnV0dG9uSW5mbyBrUERGTm9QcmludFRvb2xiYXJCdXR0b25zW10gPSB7CisgIHsga0ZpdFRvUGFnZUJ1dHRvbklkLCBCdXR0b246OkJVVFRPTl9TVEFURSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9GVFAsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fRlRQX0hPVkVSLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX0ZUUF9QUkVTU0VEIH0sCisgIHsga0ZpdFRvV2lkdGhCdXR0b25JZCwgQnV0dG9uOjpCVVRUT05fU1RBVEUsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fRlRXLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX0ZUV19IT1ZFUiwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9GVFdfUFJFU1NFRCB9LAorICB7IGtab29tT3V0QnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9aT09NT1VULAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1pPT01PVVRfSE9WRVIsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fWk9PTU9VVF9QUkVTU0VEIH0sCisgIHsga1pvb21JbkJ1dHRvbklkLCBCdXR0b246OkJVVFRPTl9DTElDS0FCTEUsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fWk9PTUlOLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1pPT01JTl9IT1ZFUiwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9aT09NSU5fUFJFU1NFRCB9LAorICB7IGtTYXZlQnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9TQVZFLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1NBVkVfSE9WRVIsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fU0FWRV9QUkVTU0VEIH0sCisgIHsga1ByaW50QnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9QUklOVF9ESVNBQkxFRCwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9QUklOVF9ESVNBQkxFRCwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9QUklOVF9ESVNBQkxFRCB9Cit9OworCitjb25zdCBUb29sYmFyQnV0dG9uSW5mbyBrUHJpbnRQcmV2aWV3VG9vbGJhckJ1dHRvbnNbXSA9IHsKKyAgeyBrRml0VG9QYWdlQnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX1NUQVRFLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX0ZUUCwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9GVFBfSE9WRVIsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fRlRQX1BSRVNTRUQgfSwKKyAgeyBrRml0VG9XaWR0aEJ1dHRvbklkLCBCdXR0b246OkJVVFRPTl9TVEFURSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9GVFcsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fRlRXX0hPVkVSLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX0ZUV19QUkVTU0VEIH0sCisgIHsga1pvb21PdXRCdXR0b25JZCwgQnV0dG9uOjpCVVRUT05fQ0xJQ0tBQkxFLAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1pPT01PVVQsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fWk9PTU9VVF9IT1ZFUiwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9aT09NT1VUX1BSRVNTRUQgfSwKKyAgeyBrWm9vbUluQnV0dG9uSWQsIEJ1dHRvbjo6QlVUVE9OX0NMSUNLQUJMRSwKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9aT09NSU5fRU5ELAorICAgICAgUFBfUkVTT1VSQ0VJTUFHRV9QREZfQlVUVE9OX1pPT01JTl9FTkRfSE9WRVIsCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fWk9PTUlOX0VORF9QUkVTU0VEIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciBrUFBQUGRmSW50ZXJmYWNlW10gPSBQUFBfUERGX0lOVEVSRkFDRV8xOworCitQUF9WYXIgR2V0TGlua0F0UG9zaXRpb24oUFBfSW5zdGFuY2UgaW5zdGFuY2UsIFBQX1BvaW50IHBvaW50KSB7CisgIHBwOjpWYXIgdmFyOworICB2b2lkKiBvYmplY3QgPQorICAgICAgcHA6Okluc3RhbmNlOjpHZXRQZXJJbnN0YW5jZU9iamVjdChpbnN0YW5jZSwga1BQUFBkZkludGVyZmFjZSk7CisgIGlmIChvYmplY3QpCisgICAgdmFyID0gc3RhdGljX2Nhc3Q8SW5zdGFuY2UqPihvYmplY3QpLT5HZXRMaW5rQXRQb3NpdGlvbihwcDo6UG9pbnQocG9pbnQpKTsKKyAgcmV0dXJuIHZhci5EZXRhY2goKTsKK30KKwordm9pZCBUcmFuc2Zvcm0oUFBfSW5zdGFuY2UgaW5zdGFuY2UsIFBQX1ByaXZhdGVQYWdlVHJhbnNmb3JtVHlwZSB0eXBlKSB7CisgIHZvaWQqIG9iamVjdCA9CisgICAgICBwcDo6SW5zdGFuY2U6OkdldFBlckluc3RhbmNlT2JqZWN0KGluc3RhbmNlLCBrUFBQUGRmSW50ZXJmYWNlKTsKKyAgaWYgKG9iamVjdCkgeworICAgIEluc3RhbmNlKiBvYmpfaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxJbnN0YW5jZSo+KG9iamVjdCk7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFBQX1BSSVZBVEVQQUdFVFJBTlNGT1JNVFlQRV9ST1RBVEVfOTBfQ1c6CisgICAgICAgIG9ial9pbnN0YW5jZS0+Um90YXRlQ2xvY2t3aXNlKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUF9QUklWQVRFUEFHRVRSQU5TRk9STVRZUEVfUk9UQVRFXzkwX0NDVzoKKyAgICAgICAgb2JqX2luc3RhbmNlLT5Sb3RhdGVDb3VudGVyY2xvY2t3aXNlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitjb25zdCBQUFBfUGRmIHBwcF9wcml2YXRlID0geworICAmR2V0TGlua0F0UG9zaXRpb24sCisgICZUcmFuc2Zvcm0KK307CisKK2ludCBFeHRyYWN0UHJpbnRQcmV2aWV3UGFnZUluZGV4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmNfdXJsKSB7CisgIC8vIFNhbXBsZSB8c3JjX3VybHwgZm9ybWF0OiBjaHJvbWU6Ly9wcmludC9pZC9wYWdlX2luZGV4L3ByaW50LnBkZgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdXJsX3N1YnN0cjsKKyAgYmFzZTo6U3BsaXRTdHJpbmcoc3JjX3VybC5zdWJzdHIoc3RybGVuKGtDaHJvbWVQcmludCkpLCAnLycsICZ1cmxfc3Vic3RyKTsKKyAgaWYgKHVybF9zdWJzdHIuc2l6ZSgpICE9IDMpCisgICAgcmV0dXJuIC0xOworCisgIGlmICh1cmxfc3Vic3RyWzJdICE9ICJwcmludC5wZGYiKQorICAgIHJldHVybiAtMTsKKworICBpbnQgcGFnZV9pbmRleCA9IDA7CisgIGlmICghYmFzZTo6U3RyaW5nVG9JbnQodXJsX3N1YnN0clsxXSwgJnBhZ2VfaW5kZXgpKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIHBhZ2VfaW5kZXg7Cit9CisKK2Jvb2wgSXNQcmludFByZXZpZXdVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCkgeworICByZXR1cm4gdXJsLnN1YnN0cigwLCBzdHJsZW4oa0Nocm9tZVByaW50KSkgPT0ga0Nocm9tZVByaW50OworfQorCit2b2lkIFNjYWxlUG9pbnQoZmxvYXQgc2NhbGUsIHBwOjpQb2ludCogcG9pbnQpIHsKKyAgcG9pbnQtPnNldF94KHN0YXRpY19jYXN0PGludD4ocG9pbnQtPngoKSAqIHNjYWxlKSk7CisgIHBvaW50LT5zZXRfeShzdGF0aWNfY2FzdDxpbnQ+KHBvaW50LT55KCkgKiBzY2FsZSkpOworfQorCit2b2lkIFNjYWxlUmVjdChmbG9hdCBzY2FsZSwgcHA6OlJlY3QqIHJlY3QpIHsKKyAgaW50IGxlZnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihyZWN0LT54KCkgKiBzY2FsZSkpOworICBpbnQgdG9wID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYocmVjdC0+eSgpICogc2NhbGUpKTsKKyAgaW50IHJpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsZigocmVjdC0+eCgpICsgcmVjdC0+d2lkdGgoKSkgKiBzY2FsZSkpOworICBpbnQgYm90dG9tID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsZigocmVjdC0+eSgpICsgcmVjdC0+aGVpZ2h0KCkpICogc2NhbGUpKTsKKyAgcmVjdC0+U2V0UmVjdChsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK1QgQ2xpcFRvUmFuZ2UoVCB2YWx1ZSwgVCBsb3dlcl9ib3VuZGFyeSwgVCB1cHBlcl9ib3VuZGFyeSkgeworICBEQ0hFQ0sobG93ZXJfYm91bmRhcnkgPD0gdXBwZXJfYm91bmRhcnkpOworICByZXR1cm4gc3RkOjptYXg8VD4obG93ZXJfYm91bmRhcnksIHN0ZDo6bWluPFQ+KHZhbHVlLCB1cHBlcl9ib3VuZGFyeSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworSW5zdGFuY2U6Okluc3RhbmNlKFBQX0luc3RhbmNlIGluc3RhbmNlKQorICAgIDogcHA6Okluc3RhbmNlUHJpdmF0ZShpbnN0YW5jZSksCisgICAgICBwcDo6RmluZF9Qcml2YXRlKHRoaXMpLAorICAgICAgcHA6OlByaW50aW5nX0Rldih0aGlzKSwKKyAgICAgIHBwOjpTZWxlY3Rpb25fRGV2KHRoaXMpLAorICAgICAgcHA6OldpZGdldENsaWVudF9EZXYodGhpcyksCisgICAgICBwcDo6Wm9vbV9EZXYodGhpcyksCisgICAgICBjdXJzb3JfKFBQX0NVUlNPUlRZUEVfUE9JTlRFUiksCisgICAgICB0aW1lcl9wZW5kaW5nXyhmYWxzZSksCisgICAgICBjdXJyZW50X3RpbWVyX2lkXygwKSwKKyAgICAgIHpvb21fKDEuMCksCisgICAgICBkZXZpY2Vfc2NhbGVfKDEuMCksCisgICAgICBwcmludGluZ19lbmFibGVkXyh0cnVlKSwKKyAgICAgIGhpZHBpX2VuYWJsZWRfKGZhbHNlKSwKKyAgICAgIGZ1bGxfKElzRnVsbEZyYW1lKCkpLAorICAgICAgem9vbV9tb2RlXyhmdWxsXyA/IFpPT01fQVVUTyA6IFpPT01fU0NBTEUpLAorICAgICAgZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18oZmFsc2UpLAorICAgICAgaXNfYXV0b3Njcm9sbF8oZmFsc2UpLAorICAgICAgc2Nyb2xsYmFyX3RoaWNrbmVzc18oLTEpLAorICAgICAgc2Nyb2xsYmFyX3Jlc2VydmVkX3RoaWNrbmVzc18oLTEpLAorICAgICAgY3VycmVudF90Yl9pbmZvXyhOVUxMKSwKKyAgICAgIGN1cnJlbnRfdGJfaW5mb19zaXplXygwKSwKKyAgICAgIHBhaW50X21hbmFnZXJfKHRoaXMsIHRoaXMsIHRydWUpLAorICAgICAgZGVsYXllZF9wcm9ncmVzc190aW1lcl9pZF8oMCksCisgICAgICBmaXJzdF9wYWludF8odHJ1ZSksCisgICAgICBwYWludGVkX2ZpcnN0X3BhZ2VfKGZhbHNlKSwKKyAgICAgIHNob3dfcGFnZV9pbmRpY2F0b3JfKGZhbHNlKSwKKyAgICAgIGRvY3VtZW50X2xvYWRfc3RhdGVfKExPQURfU1RBVEVfTE9BRElORyksCisgICAgICBwcmV2aWV3X2RvY3VtZW50X2xvYWRfc3RhdGVfKExPQURfU1RBVEVfQ09NUExFVEUpLAorICAgICAgdG9sZF9icm93c2VyX2Fib3V0X3Vuc3VwcG9ydGVkX2ZlYXR1cmVfKGZhbHNlKSwKKyAgICAgIHByaW50X3ByZXZpZXdfcGFnZV9jb3VudF8oMCkgeworICBsb2FkZXJfZmFjdG9yeV8uSW5pdGlhbGl6ZSh0aGlzKTsKKyAgdGltZXJfZmFjdG9yeV8uSW5pdGlhbGl6ZSh0aGlzKTsKKyAgZm9ybV9mYWN0b3J5Xy5Jbml0aWFsaXplKHRoaXMpOworICBjYWxsYmFja19mYWN0b3J5Xy5Jbml0aWFsaXplKHRoaXMpOworICBlbmdpbmVfLnJlc2V0KFBERkVuZ2luZTo6Q3JlYXRlKHRoaXMpKTsKKyAgcHA6Ok1vZHVsZTo6R2V0KCktPkFkZFBsdWdpbkludGVyZmFjZShrUFBQUGRmSW50ZXJmYWNlLCAmcHBwX3ByaXZhdGUpOworICBBZGRQZXJJbnN0YW5jZU9iamVjdChrUFBQUGRmSW50ZXJmYWNlLCB0aGlzKTsKKworICBSZXF1ZXN0RmlsdGVyaW5nSW5wdXRFdmVudHMoUFBfSU5QVVRFVkVOVF9DTEFTU19NT1VTRSk7CisgIFJlcXVlc3RGaWx0ZXJpbmdJbnB1dEV2ZW50cyhQUF9JTlBVVEVWRU5UX0NMQVNTX1dIRUVMKTsKKyAgUmVxdWVzdEZpbHRlcmluZ0lucHV0RXZlbnRzKFBQX0lOUFVURVZFTlRfQ0xBU1NfS0VZQk9BUkQpOworICBSZXF1ZXN0RmlsdGVyaW5nSW5wdXRFdmVudHMoUFBfSU5QVVRFVkVOVF9DTEFTU19UT1VDSCk7Cit9CisKK0luc3RhbmNlOjp+SW5zdGFuY2UoKSB7CisgIGlmICh0aW1lcl9wZW5kaW5nXykgeworICAgIHRpbWVyX2ZhY3RvcnlfLkNhbmNlbEFsbCgpOworICAgIHRpbWVyX3BlbmRpbmdfID0gZmFsc2U7CisgIH0KKyAgLy8gVGhlIGVuZ2luZSBtYXkgdHJ5IHRvIGFjY2VzcyB0aGlzIGluc3RhbmNlIGR1cmluZyBpdHMgZGVzdHJ1Y3Rpb24uCisgIC8vIE1ha2Ugc3VyZSB0aGlzIGhhcHBlbnMgZWFybHkgd2hpbGUgdGhlIGluc3RhbmNlIGlzIHN0aWxsIGludGFjdC4KKyAgZW5naW5lXy5yZXNldCgpOworICBSZW1vdmVQZXJJbnN0YW5jZU9iamVjdChrUFBQUGRmSW50ZXJmYWNlLCB0aGlzKTsKK30KKworYm9vbCBJbnN0YW5jZTo6SW5pdCh1aW50MzJfdCBhcmdjLCBjb25zdCBjaGFyKiBhcmduW10sIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICAvLyBGb3Igbm93LCB3ZSBoaWRlIEhpRFBJIHN1cHBvcnQgYmVoaW5kIGEgZmxhZy4KKyAgaWYgKHBwOjpQREY6OklzRmVhdHVyZUVuYWJsZWQodGhpcywgUFBfUERGRkVBVFVSRV9ISURQSSkpCisgICAgaGlkcGlfZW5hYmxlZF8gPSB0cnVlOworCisgIHByaW50aW5nX2VuYWJsZWRfID0gcHA6OlBERjo6SXNGZWF0dXJlRW5hYmxlZCh0aGlzLCBQUF9QREZGRUFUVVJFX1BSSU5USU5HKTsKKyAgaWYgKHByaW50aW5nX2VuYWJsZWRfKSB7CisgICAgQ3JlYXRlVG9vbGJhcihrUERGVG9vbGJhckJ1dHRvbnMsIGFycmF5c2l6ZShrUERGVG9vbGJhckJ1dHRvbnMpKTsKKyAgfSBlbHNlIHsKKyAgICBDcmVhdGVUb29sYmFyKGtQREZOb1ByaW50VG9vbGJhckJ1dHRvbnMsCisgICAgICAgICAgICAgICAgICBhcnJheXNpemUoa1BERk5vUHJpbnRUb29sYmFyQnV0dG9ucykpOworICB9CisKKyAgQ3JlYXRlUHJvZ3Jlc3NCYXIoKTsKKworICAvLyBMb2FkIGF1dG9zY3JvbGwgYW5jaG9yIGltYWdlLgorICBhdXRvc2Nyb2xsX2FuY2hvcl8gPQorICAgICAgQ3JlYXRlUmVzb3VyY2VJbWFnZShQUF9SRVNPVVJDRUlNQUdFX1BERl9QQU5fU0NST0xMX0lDT04pOworCisjaWZkZWYgRU5BQkxFX1RIVU1CTkFJTFMKKyAgQ3JlYXRlVGh1bWJuYWlscygpOworI2VuZGlmCisgIGNvbnN0IGNoYXIqIHVybCA9IE5VTEw7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKKyAgICBpZiAoc3RyY21wKGFyZ25baV0sICJzcmMiKSA9PSAwKSB7CisgICAgICB1cmwgPSBhcmd2W2ldOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCF1cmwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENyZWF0ZVBhZ2VJbmRpY2F0b3IoSXNQcmludFByZXZpZXdVcmwodXJsKSk7CisKKyAgaWYgKCFmdWxsXykgeworICAgIC8vIEZvciBQREZzIGVtYmVkZGVkIGluIGEgZnJhbWUsIHdlIGRvbid0IGdldCB0aGUgZGF0YSBhdXRvbWF0aWNhbGx5IGxpa2Ugd2UKKyAgICAvLyBkbyBmb3IgZnVsbC1mcmFtZSBsb2Fkcy4gIFN0YXJ0IGxvYWRpbmcgdGhlIGRhdGEgbWFudWFsbHkuCisgICAgTG9hZFVybCh1cmwpOworICB9IGVsc2UgeworICAgIERDSEVDSyghZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18pOworICAgIHBwOjpQREY6OkRpZFN0YXJ0TG9hZGluZyh0aGlzKTsKKyAgICBkaWRfY2FsbF9zdGFydF9sb2FkaW5nXyA9IHRydWU7CisgIH0KKworICBab29tTGltaXRzQ2hhbmdlZChrTWluWm9vbSwga01heFpvb20pOworCisgIHRleHRfaW5wdXRfLnJlc2V0KG5ldyBwcDo6VGV4dElucHV0X0Rldih0aGlzKSk7CisKKyAgdXJsXyA9IHVybDsKKyAgcmV0dXJuIGVuZ2luZV8tPk5ldyh1cmwpOworfQorCitib29sIEluc3RhbmNlOjpIYW5kbGVEb2N1bWVudExvYWQoY29uc3QgcHA6OlVSTExvYWRlciYgbG9hZGVyKSB7CisgIGRlbGF5ZWRfcHJvZ3Jlc3NfdGltZXJfaWRfID0gU2NoZWR1bGVUaW1lcihrUHJvZ3Jlc3NCYXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQcm9ncmVzc0RlbGF5VGltZW91dE1zKTsKKyAgcmV0dXJuIGVuZ2luZV8tPkhhbmRsZURvY3VtZW50TG9hZChsb2FkZXIpOworfQorCitib29sIEluc3RhbmNlOjpIYW5kbGVJbnB1dEV2ZW50KGNvbnN0IHBwOjpJbnB1dEV2ZW50JiBldmVudCkgeworICAvLyBUbyBzaW1wbGlmeSB0aGluZ3MsIGNvbnZlcnQgdGhlIGV2ZW50IGludG8gZGV2aWNlIGNvb3JkaW5hdGVzIGlmIGl0IGlzCisgIC8vIGEgbW91c2UgZXZlbnQuCisgIHBwOjpJbnB1dEV2ZW50IGV2ZW50X2RldmljZV9yZXMoZXZlbnQpOworICB7CisgICAgcHA6Ok1vdXNlSW5wdXRFdmVudCBtb3VzZV9ldmVudChldmVudCk7CisgICAgaWYgKCFtb3VzZV9ldmVudC5pc19udWxsKCkpIHsKKyAgICAgIHBwOjpQb2ludCBwb2ludCA9IG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCk7CisgICAgICBwcDo6UG9pbnQgbW92ZW1lbnQgPSBtb3VzZV9ldmVudC5HZXRNb3ZlbWVudCgpOworICAgICAgU2NhbGVQb2ludChkZXZpY2Vfc2NhbGVfLCAmcG9pbnQpOworICAgICAgU2NhbGVQb2ludChkZXZpY2Vfc2NhbGVfLCAmbW92ZW1lbnQpOworICAgICAgbW91c2VfZXZlbnQgPSBwcDo6TW91c2VJbnB1dEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgZXZlbnQuR2V0VHlwZSgpLAorICAgICAgICAgIGV2ZW50LkdldFRpbWVTdGFtcCgpLAorICAgICAgICAgIGV2ZW50LkdldE1vZGlmaWVycygpLAorICAgICAgICAgIG1vdXNlX2V2ZW50LkdldEJ1dHRvbigpLAorICAgICAgICAgIHBvaW50LAorICAgICAgICAgIG1vdXNlX2V2ZW50LkdldENsaWNrQ291bnQoKSwKKyAgICAgICAgICBtb3ZlbWVudCk7CisgICAgICBldmVudF9kZXZpY2VfcmVzID0gbW91c2VfZXZlbnQ7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBnbyB0byBhdXRvc2Nyb2xsIG1vZGUuCisgIGlmIChldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFTU9WRSAmJgorICAgICAoZXZlbnQuR2V0TW9kaWZpZXJzKCkgJiBQUF9JTlBVVEVWRU5UX01PRElGSUVSX01JRERMRUJVVFRPTkRPV04pKSB7CisgICAgcHA6Ok1vdXNlSW5wdXRFdmVudCBtb3VzZV9ldmVudChldmVudF9kZXZpY2VfcmVzKTsKKyAgICBwcDo6UG9pbnQgcG9zID0gbW91c2VfZXZlbnQuR2V0UG9zaXRpb24oKTsKKyAgICBFbmFibGVBdXRvc2Nyb2xsKHBvcyk7CisgICAgVXBkYXRlQ3Vyc29yKENhbGN1bGF0ZUF1dG9zY3JvbGwocG9zKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gUXVpdCBhdXRvc2Nyb2xsaW5nIG9uIGFueSBvdGhlciBldmVudC4KKyAgICBEaXNhYmxlQXV0b3Njcm9sbCgpOworICB9CisKKyNpZmRlZiBFTkFCTEVfVEhVTUJOQUlMUworICBpZiAoZXZlbnQuR2V0VHlwZSgpID09IFBQX0lOUFVURVZFTlRfVFlQRV9NT1VTRUxFQVZFKQorICAgIHRodW1ibmFpbHNfLlNsaWRlT3V0KCk7CisKKyAgaWYgKHRodW1ibmFpbHNfLkhhbmRsZUV2ZW50KGV2ZW50X2RldmljZV9yZXMpKQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCisKKyAgaWYgKHRvb2xiYXJfLT5IYW5kbGVFdmVudChldmVudF9kZXZpY2VfcmVzKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworI2lmZGVmIEVOQUJMRV9USFVNQk5BSUxTCisgIGlmICh2X3Njcm9sbGJhcl8uZ2V0KCkgJiYgZXZlbnQuR2V0VHlwZSgpID09IFBQX0lOUFVURVZFTlRfVFlQRV9NT1VTRU1PVkUpIHsKKyAgICBwcDo6TW91c2VJbnB1dEV2ZW50IG1vdXNlX2V2ZW50KGV2ZW50KTsKKyAgICBwcDo6UG9pbnQgcHQgPSBtb3VzZV9ldmVudC5HZXRQb3NpdGlvbigpOworICAgIHBwOjpSZWN0IHZfc2Nyb2xsYmFyX3JjOworICAgIHZfc2Nyb2xsYmFyXy0+R2V0TG9jYXRpb24oJnZfc2Nyb2xsYmFyX3JjKTsKKyAgICAvLyBUaGVyZSBpcyBhIGJ1ZyAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ1MjA4KQorICAgIC8vIGluIHRoZSB3ZWJraXQgdGhhdCBtYWtlcyBldmVudC51Lm1vdXNlLmJ1dHRvbgorICAgIC8vIGVxdWFsIHRvIFBQX0lOUFVURVZFTlRfTU9VU0VCVVRUT05fTEVGVCwgZXZlbiB3aGVuIG5vIGJ1dHRvbiBpcyBwcmVzc2VkLgorICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgd2UgdXNlIG1vZGlmaWVyIGZvciBub3csIGFuZCB3aWxsIHN3aXRjaAorICAgIC8vIHRvIGJ1dHRvbiBvbmNlIHRoZSBidWcgaXMgZml4ZWQgYW5kIHdlYmtpdCBnb3QgbWVyZ2VkIGJhY2sgdG8gb3VyIHRyZWUuCisgICAgaWYgKHZfc2Nyb2xsYmFyX3JjLkNvbnRhaW5zKHB0KSAmJgorICAgICAgICAoZXZlbnQuR2V0TW9kaWZpZXJzKCkgJiBQUF9JTlBVVEVWRU5UX01PRElGSUVSX0xFRlRCVVRUT05ET1dOKSkgeworICAgICAgdGh1bWJuYWlsc18uU2xpZGVJbigpOworICAgIH0KKworICAgIC8vIFdoZW4gc2Nyb2xsYmFyIGlzIGluIHRoZSBzY3JvbGxpbmcgbW9kZSB3ZSBzaG91bGQgZGlzcGxheSB0aHVtYm5haWxzCisgICAgLy8gZXZlbiB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgdGh1bWJuYWlsIGFuZCBzY3JvbGxiYXIgYXJlYXMuCisgICAgLy8gSWYgbW91c2UgaXMgb3V0c2lkZSBwbHVnaW4gYXJlYSwgd2UgYXJlIHN0aWxsIGdldHRpbmcgbW91c2UgbW92ZSBldmVudHMKKyAgICAvLyB3aGlsZSBzY3JvbGxpbmcuIFNlZSBidWcgZGVzY3JpcHRpb24gZm9yIGRldGFpbHM6CisgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTY0NDQKKyAgICBpZiAoIXZfc2Nyb2xsYmFyX3JjLkNvbnRhaW5zKHB0KSAmJiB0aHVtYm5haWxzXy52aXNpYmxlKCkgJiYKKyAgICAgICAgIShldmVudC5HZXRNb2RpZmllcnMoKSAmIFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfTEVGVEJVVFRPTkRPV04pICYmCisgICAgICAgICF0aHVtYm5haWxzXy5yZWN0KCkuQ29udGFpbnMocHQpKSB7CisgICAgICB0aHVtYm5haWxzXy5TbGlkZU91dCgpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gTmVlZCB0byBwYXNzIHRoZSBldmVudCB0byB0aGUgZW5naW5lIGZpcnN0LCBzaW5jZSBpZiB3ZSdyZSBvdmVyIGFuIGVkaXQKKyAgLy8gY29udHJvbCB3ZSB3YW50IGl0IHRvIGdldCBrZXlib2FyZCBldmVudHMgKGxpa2Ugc3BhY2UpIGluc3RlYWQgb2YgdGhlCisgIC8vIHNjcm9sbGJhci4KKyAgLy8gVE9ETzogd2lsbCBoYXZlIHRvIG9mZnNldCB0aGUgbW91c2UgY29vcmRpbmF0ZXMgb25jZSB3ZSBzdXBwb3J0IGJpZGkgYW5kCisgIC8vIHRoZXJlIGNvdWxkIGJlIHNjcm9sbGJhcnMgb24gdGhlIGxlZnQuCisgIHBwOjpJbnB1dEV2ZW50IG9mZnNldF9ldmVudChldmVudF9kZXZpY2VfcmVzKTsKKyAgYm9vbCB0cnlfZW5naW5lX2ZpcnN0ID0gdHJ1ZTsKKyAgc3dpdGNoIChvZmZzZXRfZXZlbnQuR2V0VHlwZSgpKSB7CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VET1dOOgorICAgIGNhc2UgUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFVVA6CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VNT1ZFOgorICAgIGNhc2UgUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFRU5URVI6CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VMRUFWRTogeworICAgICAgcHA6Ok1vdXNlSW5wdXRFdmVudCBtb3VzZV9ldmVudChldmVudF9kZXZpY2VfcmVzKTsKKyAgICAgIHBwOjpNb3VzZUlucHV0RXZlbnQgbW91c2VfZXZlbnRfZGlwKGV2ZW50KTsKKyAgICAgIHBwOjpQb2ludCBwb2ludCA9IG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCk7CisgICAgICBwb2ludC5zZXRfeChwb2ludC54KCkgLSBhdmFpbGFibGVfYXJlYV8ueCgpKTsKKyAgICAgIG9mZnNldF9ldmVudCA9IHBwOjpNb3VzZUlucHV0RXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBldmVudC5HZXRUeXBlKCksCisgICAgICAgICAgZXZlbnQuR2V0VGltZVN0YW1wKCksCisgICAgICAgICAgZXZlbnQuR2V0TW9kaWZpZXJzKCksCisgICAgICAgICAgbW91c2VfZXZlbnQuR2V0QnV0dG9uKCksCisgICAgICAgICAgcG9pbnQsCisgICAgICAgICAgbW91c2VfZXZlbnQuR2V0Q2xpY2tDb3VudCgpLAorICAgICAgICAgIG1vdXNlX2V2ZW50LkdldE1vdmVtZW50KCkpOworICAgICAgaWYgKCFlbmdpbmVfLT5Jc1NlbGVjdGluZygpKSB7CisgICAgICAgIGlmICghSXNPdmVybGF5U2Nyb2xsYmFyKCkgJiYKKyAgICAgICAgICAgICFhdmFpbGFibGVfYXJlYV8uQ29udGFpbnMobW91c2VfZXZlbnQuR2V0UG9zaXRpb24oKSkpIHsKKyAgICAgICAgICB0cnlfZW5naW5lX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoSXNPdmVybGF5U2Nyb2xsYmFyKCkpIHsKKyAgICAgICAgICBwcDo6UmVjdCB0ZW1wOworICAgICAgICAgIGlmICgodl9zY3JvbGxiYXJfLmdldCgpICYmIHZfc2Nyb2xsYmFyXy0+R2V0TG9jYXRpb24oJnRlbXApICYmCisgICAgICAgICAgICAgIHRlbXAuQ29udGFpbnMobW91c2VfZXZlbnRfZGlwLkdldFBvc2l0aW9uKCkpKSB8fAorICAgICAgICAgICAgICAoaF9zY3JvbGxiYXJfLmdldCgpICYmIGhfc2Nyb2xsYmFyXy0+R2V0TG9jYXRpb24oJnRlbXApICYmCisgICAgICAgICAgICAgIHRlbXAuQ29udGFpbnMobW91c2VfZXZlbnRfZGlwLkdldFBvc2l0aW9uKCkpKSkgeworICAgICAgICAgICAgdHJ5X2VuZ2luZV9maXJzdCA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAodHJ5X2VuZ2luZV9maXJzdCAmJiBlbmdpbmVfLT5IYW5kbGVFdmVudChvZmZzZXRfZXZlbnQpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIExlZnQvUmlnaHQgYXJyb3dzIHNob3VsZCBzY3JvbGwgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgUHJldi9OZXh0IHBhZ2UgaWYKKyAgLy8gdGhlcmUgaXMgbm8gaG9yaXpvbnRhbCBzY3JvbGwgYmFyLgorICAvLyBJZiBmaXQtdG8taGVpZ2h0LCBQZ0Rvd24vUGdVcCBzaG91bGQgc2Nyb2xsIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vIFByZXYvTmV4dCBwYWdlLiBTcGFjZWJhciAvIHNoaWZ0K3NwYWNlYmFyIHNob3VsZCBkbyB0aGUgc2FtZS4KKyAgaWYgKHZfc2Nyb2xsYmFyXy5nZXQoKSAmJiBldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX0tFWURPV04pIHsKKyAgICBwcDo6S2V5Ym9hcmRJbnB1dEV2ZW50IGtleWJvYXJkX2V2ZW50KGV2ZW50KTsKKyAgICBib29sIG5vX2hfc2Nyb2xsYmFyID0gIWhfc2Nyb2xsYmFyXy5nZXQoKTsKKyAgICB1aW50MzJfdCBrZXlfY29kZSA9IGtleWJvYXJkX2V2ZW50LkdldEtleUNvZGUoKTsKKyAgICBib29sIHBhZ2VfZG93biA9IG5vX2hfc2Nyb2xsYmFyICYmIGtleV9jb2RlID09IHVpOjpWS0VZX1JJR0hUOworICAgIGJvb2wgcGFnZV91cCA9IG5vX2hfc2Nyb2xsYmFyICYmIGtleV9jb2RlID09IHVpOjpWS0VZX0xFRlQ7CisgICAgaWYgKHpvb21fbW9kZV8gPT0gWk9PTV9GSVRfVE9fUEFHRSkgeworICAgICAgYm9vbCBoYXNfc2hpZnQgPQorICAgICAgICAgIGtleWJvYXJkX2V2ZW50LkdldE1vZGlmaWVycygpICYgUFBfSU5QVVRFVkVOVF9NT0RJRklFUl9TSElGVEtFWTsKKyAgICAgIGJvb2wga2V5X2lzX3NwYWNlID0ga2V5X2NvZGUgPT0gdWk6OlZLRVlfU1BBQ0U7CisgICAgICBwYWdlX2Rvd24gfD0ga2V5X2lzX3NwYWNlIHx8IGtleV9jb2RlID09IHVpOjpWS0VZX05FWFQ7CisgICAgICBwYWdlX3VwIHw9IChrZXlfaXNfc3BhY2UgJiYgaGFzX3NoaWZ0KSB8fCAoa2V5X2NvZGUgPT0gdWk6OlZLRVlfUFJJT1IpOworICAgIH0KKyAgICBpZiAocGFnZV9kb3duKSB7CisgICAgICBpbnQgcGFnZSA9IGVuZ2luZV8tPkdldEZpcnN0VmlzaWJsZVBhZ2UoKTsKKyAgICAgIGlmIChwYWdlID09IC0xKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIC8vIEVuZ2luZSBjYWxjdWxhdGVzIHZpc2libGUgcGFnZSBpbmNsdWRpbmcgZGVsaW1pdGVyIHRvIHRoZSBwYWdlIHNpemUuCisgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGhlcmUgaWYgdGhlIHBhZ2UgaXRzZWxmIGlzIGNvbXBsZXRlbHkgb3V0IG9mIHZpZXcgYW5kCisgICAgICAvLyBzY3JvbGwgdG8gdGhlIG5leHQgb25lIGluIHRoYXQgY2FzZS4KKyAgICAgIGlmIChlbmdpbmVfLT5HZXRQYWdlUmVjdChwYWdlKS5ib3R0b20oKSAqIHpvb21fIDw9CisgICAgICAgICAgdl9zY3JvbGxiYXJfLT5HZXRWYWx1ZSgpKQorICAgICAgICBwYWdlKys7CisgICAgICBTY3JvbGxUb1BhZ2UocGFnZSArIDEpOworICAgICAgVXBkYXRlQ3Vyc29yKFBQX0NVUlNPUlRZUEVfUE9JTlRFUik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHBhZ2VfdXApIHsKKyAgICAgIGludCBwYWdlID0gZW5naW5lXy0+R2V0Rmlyc3RWaXNpYmxlUGFnZSgpOworICAgICAgaWYgKHBhZ2UgPT0gLTEpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKGVuZ2luZV8tPkdldFBhZ2VSZWN0KHBhZ2UpLnkoKSAqIHpvb21fID49IHZfc2Nyb2xsYmFyXy0+R2V0VmFsdWUoKSkKKyAgICAgICAgcGFnZS0tOworICAgICAgU2Nyb2xsVG9QYWdlKHBhZ2UpOworICAgICAgVXBkYXRlQ3Vyc29yKFBQX0NVUlNPUlRZUEVfUE9JTlRFUik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAodl9zY3JvbGxiYXJfLmdldCgpICYmIHZfc2Nyb2xsYmFyXy0+SGFuZGxlRXZlbnQoZXZlbnQpKSB7CisgICAgVXBkYXRlQ3Vyc29yKFBQX0NVUlNPUlRZUEVfUE9JTlRFUik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoaF9zY3JvbGxiYXJfLmdldCgpICYmIGhfc2Nyb2xsYmFyXy0+SGFuZGxlRXZlbnQoZXZlbnQpKSB7CisgICAgVXBkYXRlQ3Vyc29yKFBQX0NVUlNPUlRZUEVfUE9JTlRFUik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAodGltZXJfcGVuZGluZ18gJiYKKyAgICAgIChldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFVVAgfHwKKyAgICAgICBldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFTU9WRSkpIHsKKyAgICB0aW1lcl9mYWN0b3J5Xy5DYW5jZWxBbGwoKTsKKyAgICB0aW1lcl9wZW5kaW5nXyA9IGZhbHNlOworICB9IGVsc2UgaWYgKGV2ZW50LkdldFR5cGUoKSA9PSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VNT1ZFICYmCisgICAgICAgICAgICAgZW5naW5lXy0+SXNTZWxlY3RpbmcoKSkgeworICAgIGJvb2wgc2V0X3RpbWVyID0gZmFsc2U7CisgICAgcHA6Ok1vdXNlSW5wdXRFdmVudCBtb3VzZV9ldmVudChldmVudCk7CisgICAgaWYgKHZfc2Nyb2xsYmFyXy5nZXQoKSAmJgorICAgICAgICAobW91c2VfZXZlbnQuR2V0UG9zaXRpb24oKS55KCkgPD0gMCB8fAorICAgICAgICAgbW91c2VfZXZlbnQuR2V0UG9zaXRpb24oKS55KCkgPj0gKHBsdWdpbl9kaXBfc2l6ZV8uaGVpZ2h0KCkgLSAxKSkpIHsKKyAgICAgIHZfc2Nyb2xsYmFyXy0+U2Nyb2xsQnkoCisgICAgICAgICAgUFBfU0NST0xMQllfTElORSwgbW91c2VfZXZlbnQuR2V0UG9zaXRpb24oKS55KCkgPj0gMCA/IDE6IC0xKTsKKyAgICAgIHNldF90aW1lciA9IHRydWU7CisgICAgfQorICAgIGlmIChoX3Njcm9sbGJhcl8uZ2V0KCkgJiYKKyAgICAgICAgKG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCkueCgpIDw9IDAgfHwKKyAgICAgICAgIG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCkueCgpID49IChwbHVnaW5fZGlwX3NpemVfLndpZHRoKCkgLSAxKSkpIHsKKyAgICAgIGhfc2Nyb2xsYmFyXy0+U2Nyb2xsQnkoUFBfU0NST0xMQllfTElORSwKKyAgICAgICAgICBtb3VzZV9ldmVudC5HZXRQb3NpdGlvbigpLngoKSA+PSAwID8gMTogLTEpOworICAgICAgc2V0X3RpbWVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoc2V0X3RpbWVyKSB7CisgICAgICBsYXN0X21vdXNlX2V2ZW50XyA9IHBwOjpNb3VzZUlucHV0RXZlbnQoZXZlbnQpOworCisgICAgICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICB0aW1lcl9mYWN0b3J5Xy5OZXdDYWxsYmFjaygmSW5zdGFuY2U6Ok9uVGltZXJGaXJlZCk7CisgICAgICBwcDo6TW9kdWxlOjpHZXQoKS0+Y29yZSgpLT5DYWxsT25NYWluVGhyZWFkKGtEcmFnVGltZXJNcywgY2FsbGJhY2spOworICAgICAgdGltZXJfcGVuZGluZ18gPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX0tFWURPV04pIHsKKyAgICBwcDo6S2V5Ym9hcmRJbnB1dEV2ZW50IGtleWJvYXJkX2V2ZW50KGV2ZW50KTsKKyAgICBjb25zdCB1aW50MzIgbW9kaWZpZXIgPSBldmVudC5HZXRNb2RpZmllcnMoKTsKKyAgICBpZiAobW9kaWZpZXIgJiBrRGVmYXVsdEtleU1vZGlmaWVyKSB7CisgICAgICBzd2l0Y2ggKGtleWJvYXJkX2V2ZW50LkdldEtleUNvZGUoKSkgeworICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICBlbmdpbmVfLT5TZWxlY3RBbGwoKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1vZGlmaWVyICYgUFBfSU5QVVRFVkVOVF9NT0RJRklFUl9DT05UUk9MS0VZKSB7CisgICAgICBzd2l0Y2ggKGtleWJvYXJkX2V2ZW50LkdldEtleUNvZGUoKSkgeworICAgICAgICBjYXNlIHVpOjpWS0VZX09FTV80OgorICAgICAgICAgIC8vIExlZnQgYnJhY2tldC4KKyAgICAgICAgICBlbmdpbmVfLT5Sb3RhdGVDb3VudGVyY2xvY2t3aXNlKCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgdWk6OlZLRVlfT0VNXzY6CisgICAgICAgICAgLy8gUmlnaHQgYnJhY2tldC4KKyAgICAgICAgICBlbmdpbmVfLT5Sb3RhdGVDbG9ja3dpc2UoKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBmb3IgdW5oYW5kbGVkIGNsaWNrcyBzbyB0aGUgcGx1Z2luIHRha2VzIGZvY3VzLgorICByZXR1cm4gKGV2ZW50LkdldFR5cGUoKSA9PSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VET1dOKTsKK30KKwordm9pZCBJbnN0YW5jZTo6RGlkQ2hhbmdlVmlldyhjb25zdCBwcDo6VmlldyYgdmlldykgeworICBwcDo6UmVjdCB2aWV3X3JlY3Qodmlldy5HZXRSZWN0KCkpOworICBmbG9hdCBkZXZpY2Vfc2NhbGUgPSAxLjBmOworICBmbG9hdCBvbGRfZGV2aWNlX3NjYWxlID0gZGV2aWNlX3NjYWxlXzsKKyAgaWYgKGhpZHBpX2VuYWJsZWRfKQorICAgIGRldmljZV9zY2FsZSA9IHZpZXcuR2V0RGV2aWNlU2NhbGUoKTsKKyAgcHA6OlNpemUgdmlld19kZXZpY2Vfc2l6ZSh2aWV3X3JlY3Qud2lkdGgoKSAqIGRldmljZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3X3JlY3QuaGVpZ2h0KCkgKiBkZXZpY2Vfc2NhbGUpOworICBpZiAodmlld19kZXZpY2Vfc2l6ZSA9PSBwbHVnaW5fc2l6ZV8gJiYgZGV2aWNlX3NjYWxlID09IGRldmljZV9zY2FsZV8pCisgICAgcmV0dXJuOyAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcG9zaXRpb24sIG9ubHkgdGhlIHNpemUuCisKKyAgaW1hZ2VfZGF0YV8gPSBwcDo6SW1hZ2VEYXRhKCk7CisgIGRldmljZV9zY2FsZV8gPSBkZXZpY2Vfc2NhbGU7CisgIHBsdWdpbl9kaXBfc2l6ZV8gPSB2aWV3X3JlY3Quc2l6ZSgpOworICBwbHVnaW5fc2l6ZV8gPSB2aWV3X2RldmljZV9zaXplOworCisgIHBhaW50X21hbmFnZXJfLlNldFNpemUodmlld19kZXZpY2Vfc2l6ZSwgZGV2aWNlX3NjYWxlXyk7CisKKyAgaW1hZ2VfZGF0YV8gPSBwcDo6SW1hZ2VEYXRhKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUF9JTUFHRURBVEFGT1JNQVRfQkdSQV9QUkVNVUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5fc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGlmIChpbWFnZV9kYXRhXy5pc19udWxsKCkpIHsKKyAgICBEQ0hFQ0socGx1Z2luX3NpemVfLklzRW1wdHkoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVmlldyBkaW1lbnNpb25zIGNoYW5nZWQsIGRpc2FibGUgYXV0b3Njcm9sbCAoaWYgaXQgd2FzIGVuYWJsZWQpLgorICBEaXNhYmxlQXV0b3Njcm9sbCgpOworCisgIE9uR2VvbWV0cnlDaGFuZ2VkKHpvb21fLCBvbGRfZGV2aWNlX3NjYWxlKTsKK30KKworcHA6OlZhciBJbnN0YW5jZTo6R2V0SW5zdGFuY2VPYmplY3QoKSB7CisgIGlmIChpbnN0YW5jZV9vYmplY3RfLmlzX3VuZGVmaW5lZCgpKSB7CisgICAgUERGU2NyaXB0YWJsZU9iamVjdCogb2JqZWN0ID0gbmV3IFBERlNjcmlwdGFibGVPYmplY3QodGhpcyk7CisgICAgLy8gVGhlIHBwOjpWYXIgdGFrZXMgb3duZXJzaGlwIG9mIG9iamVjdCBoZXJlLgorICAgIGluc3RhbmNlX29iamVjdF8gPSBwcDo6VmFyUHJpdmF0ZSh0aGlzLCBvYmplY3QpOworICB9CisKKyAgcmV0dXJuIGluc3RhbmNlX29iamVjdF87Cit9CisKK3BwOjpWYXIgSW5zdGFuY2U6OkdldExpbmtBdFBvc2l0aW9uKGNvbnN0IHBwOjpQb2ludCYgcG9pbnQpIHsKKyAgcHA6OlBvaW50IG9mZnNldF9wb2ludChwb2ludCk7CisgIFNjYWxlUG9pbnQoZGV2aWNlX3NjYWxlXywgJm9mZnNldF9wb2ludCk7CisgIG9mZnNldF9wb2ludC5zZXRfeChvZmZzZXRfcG9pbnQueCgpIC0gYXZhaWxhYmxlX2FyZWFfLngoKSk7CisgIHJldHVybiBlbmdpbmVfLT5HZXRMaW5rQXRQb3NpdGlvbihvZmZzZXRfcG9pbnQpOworfQorCitwcDo6VmFyIEluc3RhbmNlOjpHZXRTZWxlY3RlZFRleHQoYm9vbCBodG1sKSB7CisgIGlmIChodG1sIHx8ICFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9DT1BZKSkKKyAgICByZXR1cm4gcHA6OlZhcigpOworICByZXR1cm4gZW5naW5lXy0+R2V0U2VsZWN0ZWRUZXh0KCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkludmFsaWRhdGVXaWRnZXQocHA6OldpZGdldF9EZXYgd2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgZGlydHlfcmVjdCkgeworICBpZiAodl9zY3JvbGxiYXJfLmdldCgpICYmICp2X3Njcm9sbGJhcl8gPT0gd2lkZ2V0KSB7CisgICAgaWYgKCFpbWFnZV9kYXRhXy5pc19udWxsKCkpCisgICAgICB2X3Njcm9sbGJhcl8tPlBhaW50KGRpcnR5X3JlY3QucHBfcmVjdCgpLCAmaW1hZ2VfZGF0YV8pOworICB9IGVsc2UgaWYgKGhfc2Nyb2xsYmFyXy5nZXQoKSAmJiAqaF9zY3JvbGxiYXJfID09IHdpZGdldCkgeworICAgIGlmICghaW1hZ2VfZGF0YV8uaXNfbnVsbCgpKQorICAgICAgaF9zY3JvbGxiYXJfLT5QYWludChkaXJ0eV9yZWN0LnBwX3JlY3QoKSwgJmltYWdlX2RhdGFfKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBQb3NzaWJsZSB0byBoaXQgdGhpcyBjb25kaXRpb24gc2luY2Ugc29tZXRpbWVzIHRoZSBzY3JvbGxiYXIgY29kZXMgcG9zdHMKKyAgICAvLyBhIHRhc2sgdG8gZG8gc29tZXRoaW5nIGxhdGVyLCBhbmQgd2UgY291bGQgaGF2ZSBkZWxldGVkIG91ciByZWZlcmVuY2UgaW4KKyAgICAvLyB0aGUgbWVhbnRpbWUuCisgICAgcmV0dXJuOworICB9CisKKyAgcHA6OlJlY3QgZGlydHlfcmVjdF9zY2FsZWQgPSBkaXJ0eV9yZWN0OworICBTY2FsZVJlY3QoZGV2aWNlX3NjYWxlXywgJmRpcnR5X3JlY3Rfc2NhbGVkKTsKKyAgcGFpbnRfbWFuYWdlcl8uSW52YWxpZGF0ZVJlY3QoZGlydHlfcmVjdF9zY2FsZWQpOworfQorCit2b2lkIEluc3RhbmNlOjpTY3JvbGxiYXJWYWx1ZUNoYW5nZWQocHA6OlNjcm9sbGJhcl9EZXYgc2Nyb2xsYmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKSB7CisgIHZhbHVlID0gR2V0U2NhbGVkKHZhbHVlKTsKKyAgaWYgKHZfc2Nyb2xsYmFyXy5nZXQoKSAmJiAqdl9zY3JvbGxiYXJfID09IHNjcm9sbGJhcikgeworICAgIGVuZ2luZV8tPlNjcm9sbGVkVG9ZUG9zaXRpb24odmFsdWUpOworICAgIHBwOjpSZWN0IHJjOworICAgIHZfc2Nyb2xsYmFyXy0+R2V0TG9jYXRpb24oJnJjKTsKKyAgICBpbnQzMiBkb2NfaGVpZ2h0ID0gR2V0RG9jdW1lbnRQaXhlbEhlaWdodCgpOworICAgIGRvY19oZWlnaHQgLT0gR2V0U2NhbGVkKHJjLmhlaWdodCgpKTsKKyNpZmRlZiBFTkFCTEVfVEhVTUJOQUlMUworICAgIGlmICh0aHVtYm5haWxzXy52aXNpYmxlKCkpIHsKKyAgICAgIHRodW1ibmFpbHNfLlNldFBvc2l0aW9uKHZhbHVlLCBkb2NfaGVpZ2h0LCB0cnVlKTsKKyAgICB9CisjZW5kaWYKKyAgICBwcDo6UG9pbnQgb3JpZ2luKAorICAgICAgICBwbHVnaW5fc2l6ZV8ud2lkdGgoKSAtIHBhZ2VfaW5kaWNhdG9yXy5yZWN0KCkud2lkdGgoKSAtCisgICAgICAgICAgICBHZXRTY2FsZWQoR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSksCisgICAgICAgIHBhZ2VfaW5kaWNhdG9yXy5HZXRZUG9zaXRpb24odmFsdWUsIGRvY19oZWlnaHQsIHBsdWdpbl9zaXplXy5oZWlnaHQoKSkpOworICAgIHBhZ2VfaW5kaWNhdG9yXy5Nb3ZlVG8ob3JpZ2luLCBwYWdlX2luZGljYXRvcl8udmlzaWJsZSgpKTsKKyAgfSBlbHNlIGlmIChoX3Njcm9sbGJhcl8uZ2V0KCkgJiYgKmhfc2Nyb2xsYmFyXyA9PSBzY3JvbGxiYXIpIHsKKyAgICBlbmdpbmVfLT5TY3JvbGxlZFRvWFBvc2l0aW9uKHZhbHVlKTsKKyAgfQorfQorCit2b2lkIEluc3RhbmNlOjpTY3JvbGxiYXJPdmVybGF5Q2hhbmdlZChwcDo6U2Nyb2xsYmFyX0RldiBzY3JvbGxiYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG92ZXJsYXkpIHsKKyAgc2Nyb2xsYmFyX3Jlc2VydmVkX3RoaWNrbmVzc18gPSBvdmVybGF5ID8gMCA6IHNjcm9sbGJhcl90aGlja25lc3NfOworICBPbkdlb21ldHJ5Q2hhbmdlZCh6b29tXywgZGV2aWNlX3NjYWxlXyk7Cit9CisKK3VpbnQzMl90IEluc3RhbmNlOjpRdWVyeVN1cHBvcnRlZFByaW50T3V0cHV0Rm9ybWF0cygpIHsKKyAgcmV0dXJuIGVuZ2luZV8tPlF1ZXJ5U3VwcG9ydGVkUHJpbnRPdXRwdXRGb3JtYXRzKCk7Cit9CisKK2ludDMyX3QgSW5zdGFuY2U6OlByaW50QmVnaW4oY29uc3QgUFBfUHJpbnRTZXR0aW5nc19EZXYmIHByaW50X3NldHRpbmdzKSB7CisgIC8vIEZvciB1cyBudW1fcGFnZXMgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIFBERgorICAvLyBkb2N1bWVudCBpcnJlc3BlY3RpdmUgb2YgdGhlIHByaW50YWJsZSBhcmVhLgorICBpbnQzMl90IHJldCA9IGVuZ2luZV8tPkdldE51bWJlck9mUGFnZXMoKTsKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIDA7CisKKyAgdWludDMyX3Qgc3VwcG9ydGVkX2Zvcm1hdHMgPSBlbmdpbmVfLT5RdWVyeVN1cHBvcnRlZFByaW50T3V0cHV0Rm9ybWF0cygpOworICBpZiAoKHByaW50X3NldHRpbmdzLmZvcm1hdCAmIHN1cHBvcnRlZF9mb3JtYXRzKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIHByaW50X3NldHRpbmdzXy5pc19wcmludGluZyA9IHRydWU7CisgIHByaW50X3NldHRpbmdzXy5wZXBwZXJfcHJpbnRfc2V0dGluZ3MgPSBwcmludF9zZXR0aW5nczsKKyAgZW5naW5lXy0+UHJpbnRCZWdpbigpOworICByZXR1cm4gcmV0OworfQorCitwcDo6UmVzb3VyY2UgSW5zdGFuY2U6OlByaW50UGFnZXMoCisgICAgY29uc3QgUFBfUHJpbnRQYWdlTnVtYmVyUmFuZ2VfRGV2KiBwYWdlX3JhbmdlcywKKyAgICB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50KSB7CisgIGlmICghcHJpbnRfc2V0dGluZ3NfLmlzX3ByaW50aW5nKQorICAgIHJldHVybiBwcDo6UmVzb3VyY2UoKTsKKworICBwcmludF9zZXR0aW5nc18ucHJpbnRfcGFnZXNfY2FsbGVkXyA9IHRydWU7CisgIHJldHVybiBlbmdpbmVfLT5QcmludFBhZ2VzKHBhZ2VfcmFuZ2VzLCBwYWdlX3JhbmdlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zZXR0aW5nc18ucGVwcGVyX3ByaW50X3NldHRpbmdzKTsKK30KKwordm9pZCBJbnN0YW5jZTo6UHJpbnRFbmQoKSB7CisgIGlmIChwcmludF9zZXR0aW5nc18ucHJpbnRfcGFnZXNfY2FsbGVkXykKKyAgICBVc2VyTWV0cmljc1JlY29yZEFjdGlvbigiUERGLlByaW50UGFnZSIpOworICBwcmludF9zZXR0aW5nc18uQ2xlYXIoKTsKKyAgZW5naW5lXy0+UHJpbnRFbmQoKTsKK30KKworYm9vbCBJbnN0YW5jZTo6SXNQcmludFNjYWxpbmdEaXNhYmxlZCgpIHsKKyAgcmV0dXJuICFlbmdpbmVfLT5HZXRQcmludFNjYWxpbmcoKTsKK30KKworYm9vbCBJbnN0YW5jZTo6U3RhcnRGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCBib29sIGNhc2Vfc2Vuc2l0aXZlKSB7CisgIGVuZ2luZV8tPlN0YXJ0RmluZCh0ZXh0LmNfc3RyKCksIGNhc2Vfc2Vuc2l0aXZlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNlbGVjdEZpbmRSZXN1bHQoYm9vbCBmb3J3YXJkKSB7CisgIGVuZ2luZV8tPlNlbGVjdEZpbmRSZXN1bHQoZm9yd2FyZCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlN0b3BGaW5kKCkgeworICBlbmdpbmVfLT5TdG9wRmluZCgpOworfQorCit2b2lkIEluc3RhbmNlOjpab29tKGRvdWJsZSBzY2FsZSwgYm9vbCB0ZXh0X29ubHkpIHsKKyAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5ab29tRnJvbUJyb3dzZXIiKTsKKworICAvLyBJZiB0aGUgem9vbSBsZXZlbCBkb2Vzbid0IGNoYW5nZSBpdCBtZWFucyB0aGF0IHRoaXMgem9vbSBjaGFuZ2UgbWlnaHQgaGF2ZQorICAvLyBiZWVuIGluaXRpYXRlZCBieSB0aGUgcGx1Z2luLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZQorICAvLyB6b29tIG1vZGUgdG8gWk9PTV9TQ0FMRSBhcyBpdCBtYXkgaGF2ZSBiZWVuIGludGVudGlvbmFsbHkgc2V0IHRvCisgIC8vIFpPT01fRklUX1RPX1BBR0Ugb3Igc29tZSBvdGhlciB2YWx1ZSB3aGVuIHRoZSB6b29tIHdhcyBsYXN0IGNoYW5nZWQuCisgIGlmIChzY2FsZSA9PSB6b29tXykKKyAgICByZXR1cm47CisKKyAgU2V0Wm9vbShaT09NX1NDQUxFLCBzY2FsZSk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6Olpvb21DaGFuZ2VkKGRvdWJsZSBmYWN0b3IpIHsKKyAgaWYgKGZ1bGxfKQorICAgIFpvb21fRGV2Ojpab29tQ2hhbmdlZChmYWN0b3IpOworfQorCit2b2lkIEluc3RhbmNlOjpPblBhaW50KGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgcGFpbnRfcmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhaW50TWFuYWdlcjo6UmVhZHlSZWN0PiogcmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiogcGVuZGluZykgeworICBpZiAoaW1hZ2VfZGF0YV8uaXNfbnVsbCgpKSB7CisgICAgRENIRUNLKHBsdWdpbl9zaXplXy5Jc0VtcHR5KCkpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZmlyc3RfcGFpbnRfKSB7CisgICAgZmlyc3RfcGFpbnRfID0gZmFsc2U7CisgICAgcHA6OlJlY3QgcmVjdCA9IHBwOjpSZWN0KHBwOjpQb2ludCgpLCBwbHVnaW5fc2l6ZV8pOworICAgIEZpbGxSZWN0KHJlY3QsIGtCYWNrZ3JvdW5kQ29sb3IpOworICAgIHJlYWR5LT5wdXNoX2JhY2soUGFpbnRNYW5hZ2VyOjpSZWFkeVJlY3QocmVjdCwgaW1hZ2VfZGF0YV8sIHRydWUpKTsKKyAgICAqcGVuZGluZyA9IHBhaW50X3JlY3RzOworICAgIHJldHVybjsKKyAgfQorCisgIGVuZ2luZV8tPlByZVBhaW50KCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWludF9yZWN0cy5zaXplKCk7IGkrKykgeworICAgIC8vIEludGVyc2VjdCB3aXRoIHBsdWdpbiBhcmVhIHNpbmNlIHRoZXJlIGNvdWxkIGJlIHBlbmRpbmcgaW52YWxpZGF0ZXMgZnJvbQorICAgIC8vIHdoZW4gdGhlIHBsdWdpbiBhcmVhIHdhcyBsYXJnZXIuCisgICAgcHA6OlJlY3QgcmVjdCA9CisgICAgICAgIHBhaW50X3JlY3RzW2ldLkludGVyc2VjdChwcDo6UmVjdChwcDo6UG9pbnQoKSwgcGx1Z2luX3NpemVfKSk7CisgICAgaWYgKHJlY3QuSXNFbXB0eSgpKQorICAgICAgY29udGludWU7CisKKyAgICBwcDo6UmVjdCBwZGZfcmVjdCA9IGF2YWlsYWJsZV9hcmVhXy5JbnRlcnNlY3QocmVjdCk7CisgICAgaWYgKCFwZGZfcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgIHBkZl9yZWN0Lk9mZnNldChhdmFpbGFibGVfYXJlYV8ueCgpICogLTEsIDApOworCisgICAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gcGRmX3JlYWR5OworICAgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHBkZl9wZW5kaW5nOworICAgICAgZW5naW5lXy0+UGFpbnQocGRmX3JlY3QsICZpbWFnZV9kYXRhXywgJnBkZl9yZWFkeSwgJnBkZl9wZW5kaW5nKTsKKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGRmX3JlYWR5LnNpemUoKTsgKytqKSB7CisgICAgICAgIHBkZl9yZWFkeVtqXS5PZmZzZXQoYXZhaWxhYmxlX2FyZWFfLnBvaW50KCkpOworICAgICAgICByZWFkeS0+cHVzaF9iYWNrKAorICAgICAgICAgICAgUGFpbnRNYW5hZ2VyOjpSZWFkeVJlY3QocGRmX3JlYWR5W2pdLCBpbWFnZV9kYXRhXywgZmFsc2UpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGRmX3BlbmRpbmcuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgcGRmX3BlbmRpbmdbal0uT2Zmc2V0KGF2YWlsYWJsZV9hcmVhXy5wb2ludCgpKTsKKyAgICAgICAgcGVuZGluZy0+cHVzaF9iYWNrKHBkZl9wZW5kaW5nW2pdKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGJhY2tncm91bmRfcGFydHNfLnNpemUoKTsgKytqKSB7CisgICAgICBwcDo6UmVjdCBpbnRlcnNlY3Rpb24gPSBiYWNrZ3JvdW5kX3BhcnRzX1tqXS5sb2NhdGlvbi5JbnRlcnNlY3QocmVjdCk7CisgICAgICBpZiAoIWludGVyc2VjdGlvbi5Jc0VtcHR5KCkpIHsKKyAgICAgICAgRmlsbFJlY3QoaW50ZXJzZWN0aW9uLCBiYWNrZ3JvdW5kX3BhcnRzX1tqXS5jb2xvcik7CisgICAgICAgIHJlYWR5LT5wdXNoX2JhY2soCisgICAgICAgICAgICBQYWludE1hbmFnZXI6OlJlYWR5UmVjdChpbnRlcnNlY3Rpb24sIGltYWdlX2RhdGFfLCBmYWxzZSkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkb2N1bWVudF9sb2FkX3N0YXRlXyA9PSBMT0FEX1NUQVRFX0ZBSUxFRCkgeworICAgICAgcHA6OlBvaW50IHRvcF9jZW50ZXI7CisgICAgICB0b3BfY2VudGVyLnNldF94KHBsdWdpbl9zaXplXy53aWR0aCgpIC8gMik7CisgICAgICB0b3BfY2VudGVyLnNldF95KHBsdWdpbl9zaXplXy5oZWlnaHQoKSAvIDIpOworICAgICAgRHJhd1RleHQodG9wX2NlbnRlciwgUFBfUkVTT1VSQ0VTVFJJTkdfUERGTE9BRF9GQUlMRUQpOworICAgIH0KKworI2lmZGVmIEVOQUJMRV9USFVNQk5BSUxTCisgICAgdGh1bWJuYWlsc18uUGFpbnQoJmltYWdlX2RhdGFfLCByZWN0KTsKKyNlbmRpZgorICB9CisKKyAgZW5naW5lXy0+UG9zdFBhaW50KCk7CisKKyAgLy8gTXVzdCBwYWludCBzY3JvbGxiYXJzIGFmdGVyIHRoZSBiYWNrZ3JvdW5kIHBhcnRzLCBpbiBjYXNlIHdlIGhhdmUgYW4KKyAgLy8gb3ZlcmxheSBzY3JvbGxiYXIgdGhhdCdzIG92ZXIgdGhlIGJhY2tncm91bmQuIFdlIGFsc28gZG8gdGhpcyBpbiBhIHNlcGFyYXRlCisgIC8vIGxvb3AgYmVjYXVzZSB0aGUgc2Nyb2xsYmFyIHBhaW50aW5nIGxvZ2ljIHVzZXMgdGhlIHNpZ25hbCBvZiB3aGV0aGVyIHRoZXJlCisgIC8vIGFyZSBwZW5kaW5nIHBhaW50cyBvciBub3QgdG8gZmlndXJlIG91dCBpZiBpdCBzaG91bGQgZHJhdyByaWdodCBhd2F5IG9yCisgIC8vIG5vdC4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWludF9yZWN0cy5zaXplKCk7IGkrKykgeworICAgIFBhaW50SWZXaWRnZXRJbnRlcnNlY3RzKGhfc2Nyb2xsYmFyXy5nZXQoKSwgcGFpbnRfcmVjdHNbaV0sIHJlYWR5LCBwZW5kaW5nKTsKKyAgICBQYWludElmV2lkZ2V0SW50ZXJzZWN0cyh2X3Njcm9sbGJhcl8uZ2V0KCksIHBhaW50X3JlY3RzW2ldLCByZWFkeSwgcGVuZGluZyk7CisgIH0KKworICBpZiAocHJvZ3Jlc3NfYmFyXy52aXNpYmxlKCkpCisgICAgUGFpbnRPdmVybGF5Q29udHJvbCgmcHJvZ3Jlc3NfYmFyXywgJmltYWdlX2RhdGFfLCByZWFkeSk7CisKKyAgaWYgKHBhZ2VfaW5kaWNhdG9yXy52aXNpYmxlKCkpCisgICAgUGFpbnRPdmVybGF5Q29udHJvbCgmcGFnZV9pbmRpY2F0b3JfLCAmaW1hZ2VfZGF0YV8sIHJlYWR5KTsKKworICBpZiAodG9vbGJhcl8tPmN1cnJlbnRfdHJhbnNwYXJlbmN5KCkgIT0ga1RyYW5zcGFyZW50QWxwaGEpCisgICAgUGFpbnRPdmVybGF5Q29udHJvbCh0b29sYmFyXy5nZXQoKSwgJmltYWdlX2RhdGFfLCByZWFkeSk7CisKKyAgLy8gUGFpbnQgYXV0b3Njcm9sbCBhbmNob3IgaWYgbmVlZGVkLgorICBpZiAoaXNfYXV0b3Njcm9sbF8pIHsKKyAgICBzaXplX3QgbGltaXQgPSByZWFkeS0+c2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgeworICAgICAgcHA6OlJlY3QgYW5jaG9yX3JlY3QgPSBhdXRvc2Nyb2xsX3JlY3RfLkludGVyc2VjdCgoKnJlYWR5KVtpXS5yZWN0KTsKKyAgICAgIGlmICghYW5jaG9yX3JlY3QuSXNFbXB0eSgpKSB7CisgICAgICAgIHBwOjpSZWN0IGRyYXdfcmMgPSBwcDo6UmVjdCgKKyAgICAgICAgICAgIHBwOjpQb2ludChhbmNob3JfcmVjdC54KCkgLSBhdXRvc2Nyb2xsX3JlY3RfLngoKSwKKyAgICAgICAgICAgICAgICAgICAgICBhbmNob3JfcmVjdC55KCkgLSBhdXRvc2Nyb2xsX3JlY3RfLnkoKSksCisgICAgICAgICAgICBhbmNob3JfcmVjdC5zaXplKCkpOworICAgICAgICAvLyBQYWludCBhdXRvc2Nyb2xsIGFuY2hvci4KKyAgICAgICAgQWxwaGFCbGVuZChhdXRvc2Nyb2xsX2FuY2hvcl8sIGRyYXdfcmMsCisgICAgICAgICAgICAgICAgICAgJmltYWdlX2RhdGFfLCBhbmNob3JfcmVjdC5wb2ludCgpLCBrT3BhcXVlQWxwaGEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEluc3RhbmNlOjpQYWludE92ZXJsYXlDb250cm9sKAorICAgIENvbnRyb2wqIGN0cmwsCisgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwKKyAgICBzdGQ6OnZlY3RvcjxQYWludE1hbmFnZXI6OlJlYWR5UmVjdD4qIHJlYWR5KSB7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkgcGFpbnQgb3ZlcmxheSBjb250cm9scyBvdmVyIGFuIGFyZWEgdGhhdCdzIHJlYWR5LAorICAvLyBpLmUuIG5vdCBwZW5kaW5nLiAgT3RoZXJ3aXNlIHdlJ2xsIG1hcmsgdGhlIGNvbnRyb2wgcmVjdCBhcyByZWFkeSBhbmQKKyAgLy8gaXQnbGwgb3ZlcndyaXRlIHRoZSBwZGYgcmVnaW9uLgorICBzdGQ6Omxpc3Q8cHA6OlJlY3Q+IGN0cmxfcmVjdHM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZHktPnNpemUoKTsgaSsrKSB7CisgICAgcHA6OlJlY3QgcmMgPSBjdHJsLT5yZWN0KCkuSW50ZXJzZWN0KCgqcmVhZHkpW2ldLnJlY3QpOworICAgIGlmICghcmMuSXNFbXB0eSgpKQorICAgICAgY3RybF9yZWN0cy5wdXNoX2JhY2socmMpOworICB9CisKKyAgaWYgKCFjdHJsX3JlY3RzLmVtcHR5KCkpIHsKKyAgICBjdHJsLT5QYWludE11bHRpcGxlUmVjdHMoaW1hZ2VfZGF0YSwgY3RybF9yZWN0cyk7CisKKyAgICBzdGQ6Omxpc3Q8cHA6OlJlY3Q+OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGN0cmxfcmVjdHMuYmVnaW4oKTsgaXRlciAhPSBjdHJsX3JlY3RzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHJlYWR5LT5wdXNoX2JhY2soUGFpbnRNYW5hZ2VyOjpSZWFkeVJlY3QoKml0ZXIsICppbWFnZV9kYXRhLCBmYWxzZSkpOworICAgIH0KKyAgfQorfQorCit2b2lkIEluc3RhbmNlOjpEaWRPcGVuKGludDMyX3QgcmVzdWx0KSB7CisgIGlmIChyZXN1bHQgPT0gUFBfT0spIHsKKyAgICBlbmdpbmVfLT5IYW5kbGVEb2N1bWVudExvYWQoZW1iZWRfbG9hZGVyXyk7CisgIH0gZWxzZSBpZiAocmVzdWx0ICE9IFBQX0VSUk9SX0FCT1JURUQpIHsgIC8vIENhbiBoYXBwZW4gaW4gdGVzdHMuCisgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkRpZE9wZW5QcmV2aWV3KGludDMyX3QgcmVzdWx0KSB7CisgIGlmIChyZXN1bHQgPT0gUFBfT0spIHsKKyAgICBwcmV2aWV3X2VuZ2luZV8ucmVzZXQoUERGRW5naW5lOjpDcmVhdGUobmV3IFByZXZpZXdNb2RlQ2xpZW50KHRoaXMpKSk7CisgICAgcHJldmlld19lbmdpbmVfLT5IYW5kbGVEb2N1bWVudExvYWQoZW1iZWRfcHJldmlld19sb2FkZXJfKTsKKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgIH0KK30KKwordm9pZCBJbnN0YW5jZTo6UGFpbnRJZldpZGdldEludGVyc2VjdHMoCisgICAgcHA6OldpZGdldF9EZXYqIHdpZGdldCwKKyAgICBjb25zdCBwcDo6UmVjdCYgcmVjdCwKKyAgICBzdGQ6OnZlY3RvcjxQYWludE1hbmFnZXI6OlJlYWR5UmVjdD4qIHJlYWR5LAorICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiogcGVuZGluZykgeworICBpZiAoIXdpZGdldCkKKyAgICByZXR1cm47CisKKyAgcHA6OlJlY3QgbG9jYXRpb247CisgIGlmICghd2lkZ2V0LT5HZXRMb2NhdGlvbigmbG9jYXRpb24pKQorICAgIHJldHVybjsKKworICBTY2FsZVJlY3QoZGV2aWNlX3NjYWxlXywgJmxvY2F0aW9uKTsKKyAgbG9jYXRpb24gPSBsb2NhdGlvbi5JbnRlcnNlY3QocmVjdCk7CisgIGlmIChsb2NhdGlvbi5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGlmIChJc092ZXJsYXlTY3JvbGxiYXIoKSkgeworICAgIC8vIElmIHdlJ3JlIHVzaW5nIG92ZXJsYXkgc2Nyb2xsYmFycywgYW5kIHRoZXJlIGFyZSBwZW5kaW5nIHBhaW50cyB1bmRlciB0aGUKKyAgICAvLyBzY3JvbGxiYXIsIGRvbid0IHVwZGF0ZSB0aGUgc2Nyb2xsYmFyIGluc3RhbnRseS4gV2hpbGUgaXQgd291bGQgYmUgbmljZSwKKyAgICAvLyB3ZSB3b3VsZCBuZWVkIHRvIGRvdWJsZSBidWZmZXIgdGhlIHBsdWdpbiBhcmVhIGluIG9yZGVyIHRvIG1ha2UgdGhpcworICAgIC8vIHdvcmsuIFRoaXMgaXMgYmVjYXVzZSB3ZSdkIG5lZWQgdG8gYWx3YXlzIGhhdmUgYSBjb3B5IG9mIHdoYXQgdGhlIHBkZgorICAgIC8vIHVuZGVyIHRoZSBzY3JvbGxiYXIgbG9va3MgbGlrZSwgYW5kIGFkZGl0aW9uYWxseSB3ZSBjb3VsZG4ndCBwYWludCB0aGUKKyAgICAvLyBwZGYgdW5kZXIgdGhlIHNjcm9sbGJhciBpZiBpdCdzIHJlYWR5IHVudGlsIHdlIGdvdCB0aGUgcHJlY2VkaW5nIGZsdXNoLgorICAgIC8vIFNvIGluIHByYWN0aWNlLCBpdCB3b3VsZCBtYWtlIHBhaW50aW5nIHNsb3dlciBhbmQgaW50cm9kdWNlIGV4dHJhIGJ1ZmZlcgorICAgIC8vIGNvcGllcyBmb3IgdGhlIGdlbmVyYWwgY2FzZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBlbmRpbmctPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoKCpwZW5kaW5nKVtpXS5JbnRlcnNlY3RzKGxvY2F0aW9uKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEV2ZW4gaWYgbm9uZSBvZiB0aGUgcGVuZGluZyBwYWludHMgYXJlIHVuZGVyIHRoZSBzY3JvbGxiYXIsIHdlIG5ldmVyIHdhbnQKKyAgICAvLyB0byBwYWludCBpdCBpZiBpdCdzIG92ZXIgdGhlIHBkZiBpZiB0aGVyZSBhcmUgb3RoZXIgcGVuZGluZyBwYWludHMuCisgICAgLy8gT3RoZXJ3aXNlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgcGRmIHBsdWdpbiB3b3VsZCBkaXNwbGF5IGF0IGRpZmZlcmVudAorICAgIC8vIHNjcm9sbCBvZmZzZXRzLgorICAgIGlmICghcGVuZGluZy0+ZW1wdHkoKSAmJiBhdmFpbGFibGVfYXJlYV8uSW50ZXJzZWN0cyhyZWN0KSkgeworICAgICAgcGVuZGluZy0+cHVzaF9iYWNrKGxvY2F0aW9uKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBwcDo6UmVjdCBsb2NhdGlvbl9kaXAgPSBsb2NhdGlvbjsKKyAgU2NhbGVSZWN0KDEuMGYgLyBkZXZpY2Vfc2NhbGVfLCAmbG9jYXRpb25fZGlwKTsKKworICBEQ0hFQ0soIWltYWdlX2RhdGFfLmlzX251bGwoKSk7CisgIHdpZGdldC0+UGFpbnQobG9jYXRpb25fZGlwLCAmaW1hZ2VfZGF0YV8pOworCisgIHJlYWR5LT5wdXNoX2JhY2soUGFpbnRNYW5hZ2VyOjpSZWFkeVJlY3QobG9jYXRpb24sIGltYWdlX2RhdGFfLCB0cnVlKSk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6Ok9uVGltZXJGaXJlZChpbnQzMl90KSB7CisgIEhhbmRsZUlucHV0RXZlbnQobGFzdF9tb3VzZV9ldmVudF8pOworfQorCit2b2lkIEluc3RhbmNlOjpPbkNsaWVudFRpbWVyRmlyZWQoaW50MzJfdCBpZCkgeworICBlbmdpbmVfLT5PbkNhbGxiYWNrKGlkKTsKK30KKwordm9pZCBJbnN0YW5jZTo6T25Db250cm9sVGltZXJGaXJlZChpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzImIGNvbnRyb2xfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMiYgdGltZXJfaWQpIHsKKyAgaWYgKGNvbnRyb2xfaWQgPT0gdG9vbGJhcl8tPmlkKCkpIHsKKyAgICB0b29sYmFyXy0+T25UaW1lckZpcmVkKHRpbWVyX2lkKTsKKyAgfSBlbHNlIGlmIChjb250cm9sX2lkID09IHByb2dyZXNzX2Jhcl8uaWQoKSkgeworICAgIGlmICh0aW1lcl9pZCA9PSBkZWxheWVkX3Byb2dyZXNzX3RpbWVyX2lkXykgeworICAgICAgaWYgKGRvY3VtZW50X2xvYWRfc3RhdGVfID09IExPQURfU1RBVEVfTE9BRElORyAmJgorICAgICAgICAgICFwcm9ncmVzc19iYXJfLnZpc2libGUoKSkgeworICAgICAgICBwcm9ncmVzc19iYXJfLkZhZGUodHJ1ZSwga1Byb2dyZXNzRmFkZVRpbWVvdXRNcyk7CisgICAgICB9CisgICAgICBkZWxheWVkX3Byb2dyZXNzX3RpbWVyX2lkXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb2dyZXNzX2Jhcl8uT25UaW1lckZpcmVkKHRpbWVyX2lkKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29udHJvbF9pZCA9PSBrQXV0b1Njcm9sbElkKSB7CisgICAgaWYgKGlzX2F1dG9zY3JvbGxfKSB7CisgICAgICBpZiAoYXV0b3Njcm9sbF94XyAhPSAwICYmIGhfc2Nyb2xsYmFyXy5nZXQoKSkgeworICAgICAgICBoX3Njcm9sbGJhcl8tPlNjcm9sbEJ5KFBQX1NDUk9MTEJZX1BJWEVMLCBhdXRvc2Nyb2xsX3hfKTsKKyAgICAgIH0KKyAgICAgIGlmIChhdXRvc2Nyb2xsX3lfICE9IDAgJiYgdl9zY3JvbGxiYXJfLmdldCgpKSB7CisgICAgICAgIHZfc2Nyb2xsYmFyXy0+U2Nyb2xsQnkoUFBfU0NST0xMQllfUElYRUwsIGF1dG9zY3JvbGxfeV8pOworICAgICAgfQorCisgICAgICAvLyBSZXNjaGVkdWxlIHRpbWVyLgorICAgICAgU2NoZWR1bGVUaW1lcihrQXV0b1Njcm9sbElkLCBrQXV0b1Njcm9sbFRpbWVvdXRNcyk7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnRyb2xfaWQgPT0ga1BhZ2VJbmRpY2F0b3JJZCkgeworICAgIHBhZ2VfaW5kaWNhdG9yXy5PblRpbWVyRmlyZWQodGltZXJfaWQpOworICB9CisjaWZkZWYgRU5BQkxFX1RIVU1CTkFJTFMKKyAgZWxzZSBpZiAoY29udHJvbF9pZCA9PSB0aHVtYm5haWxzXy5pZCgpKSB7CisgICAgdGh1bWJuYWlsc18uT25UaW1lckZpcmVkKHRpbWVyX2lkKTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgSW5zdGFuY2U6OkNhbGN1bGF0ZUJhY2tncm91bmRQYXJ0cygpIHsKKyAgYmFja2dyb3VuZF9wYXJ0c18uY2xlYXIoKTsKKyAgaW50IHZfc2Nyb2xsYmFyX3RoaWNrbmVzcyA9CisgICAgICBHZXRTY2FsZWQodl9zY3JvbGxiYXJfLmdldCgpID8gR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSA6IDApOworICBpbnQgaF9zY3JvbGxiYXJfdGhpY2tuZXNzID0KKyAgICAgIEdldFNjYWxlZChoX3Njcm9sbGJhcl8uZ2V0KCkgPyBHZXRTY3JvbGxiYXJSZXNlcnZlZFRoaWNrbmVzcygpIDogMCk7CisgIGludCB3aWR0aF93aXRob3V0X3Njcm9sbGJhciA9IHN0ZDo6bWF4KAorICAgICAgcGx1Z2luX3NpemVfLndpZHRoKCkgLSB2X3Njcm9sbGJhcl90aGlja25lc3MsIDApOworICBpbnQgaGVpZ2h0X3dpdGhvdXRfc2Nyb2xsYmFyID0gc3RkOjptYXgoCisgICAgICBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLSBoX3Njcm9sbGJhcl90aGlja25lc3MsIDApOworICBpbnQgbGVmdF93aWR0aCA9IGF2YWlsYWJsZV9hcmVhXy54KCk7CisgIGludCByaWdodF9zdGFydCA9IGF2YWlsYWJsZV9hcmVhXy5yaWdodCgpOworICBpbnQgcmlnaHRfd2lkdGggPSBhYnMod2lkdGhfd2l0aG91dF9zY3JvbGxiYXIgLSBhdmFpbGFibGVfYXJlYV8ucmlnaHQoKSk7CisgIGludCBib3R0b20gPSBzdGQ6Om1pbihhdmFpbGFibGVfYXJlYV8uYm90dG9tKCksIGhlaWdodF93aXRob3V0X3Njcm9sbGJhcik7CisKKyAgLy8gQWRkIHRoZSBsZWZ0LCByaWdodCwgYW5kIGJvdHRvbSByZWN0YW5nbGVzLiAgTm90ZTogd2UgYXNzdW1lIG9ubHkKKyAgLy8gaG9yaXpvbnRhbCBjZW50ZXJpbmcuCisgIEJhY2tncm91bmRQYXJ0IHBhcnQgPSB7CisgICAgcHA6OlJlY3QoMCwgMCwgbGVmdF93aWR0aCwgYm90dG9tKSwKKyAgICBrQmFja2dyb3VuZENvbG9yCisgIH07CisgIGlmICghcGFydC5sb2NhdGlvbi5Jc0VtcHR5KCkpCisgICAgYmFja2dyb3VuZF9wYXJ0c18ucHVzaF9iYWNrKHBhcnQpOworICBwYXJ0LmxvY2F0aW9uID0gcHA6OlJlY3QocmlnaHRfc3RhcnQsIDAsIHJpZ2h0X3dpZHRoLCBib3R0b20pOworICBpZiAoIXBhcnQubG9jYXRpb24uSXNFbXB0eSgpKQorICAgIGJhY2tncm91bmRfcGFydHNfLnB1c2hfYmFjayhwYXJ0KTsKKyAgcGFydC5sb2NhdGlvbiA9IHBwOjpSZWN0KAorICAgICAgMCwgYm90dG9tLCB3aWR0aF93aXRob3V0X3Njcm9sbGJhciwgaGVpZ2h0X3dpdGhvdXRfc2Nyb2xsYmFyIC0gYm90dG9tKTsKKyAgaWYgKCFwYXJ0LmxvY2F0aW9uLklzRW1wdHkoKSkKKyAgICBiYWNrZ3JvdW5kX3BhcnRzXy5wdXNoX2JhY2socGFydCk7CisKKyAgaWYgKGhfc2Nyb2xsYmFyX3RoaWNrbmVzcworI2lmIGRlZmluZWQoT1NfTUFDT1NYKQorICAgICAgfHwKKyNlbHNlCisgICAgICAmJgorI2VuZGlmCisgICAgICB2X3Njcm9sbGJhcl90aGlja25lc3MpIHsKKyAgICBwYXJ0LmNvbG9yID0gMHhGRkZGRkZGRjsKKyAgICBwYXJ0LmxvY2F0aW9uID0gcHA6OlJlY3QocGx1Z2luX3NpemVfLndpZHRoKCkgLSB2X3Njcm9sbGJhcl90aGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbl9zaXplXy5oZWlnaHQoKSAtIGhfc2Nyb2xsYmFyX3RoaWNrbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zY3JvbGxiYXJfdGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3Njcm9sbGJhcl90aGlja25lc3MpOworICAgIGJhY2tncm91bmRfcGFydHNfLnB1c2hfYmFjayhwYXJ0KTsKKyAgfQorfQorCitpbnQgSW5zdGFuY2U6OkdldERvY3VtZW50UGl4ZWxXaWR0aCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbChkb2N1bWVudF9zaXplXy53aWR0aCgpICogem9vbV8gKiBkZXZpY2Vfc2NhbGVfKSk7Cit9CisKK2ludCBJbnN0YW5jZTo6R2V0RG9jdW1lbnRQaXhlbEhlaWdodCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbChkb2N1bWVudF9zaXplXy5oZWlnaHQoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbV8gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9zY2FsZV8pKTsKK30KKwordm9pZCBJbnN0YW5jZTo6RmlsbFJlY3QoY29uc3QgcHA6OlJlY3QmIHJlY3QsIHVpbnQzMiBjb2xvcikgeworICBEQ0hFQ0soIWltYWdlX2RhdGFfLmlzX251bGwoKSB8fCByZWN0LklzRW1wdHkoKSk7CisgIHVpbnQzMiogYnVmZmVyX3N0YXJ0ID0gc3RhdGljX2Nhc3Q8dWludDMyKj4oaW1hZ2VfZGF0YV8uZGF0YSgpKTsKKyAgaW50IHN0cmlkZSA9IGltYWdlX2RhdGFfLnN0cmlkZSgpOworICB1aW50MzIqIHB0ciA9IGJ1ZmZlcl9zdGFydCArIHJlY3QueSgpICogc3RyaWRlIC8gNCArIHJlY3QueCgpOworICBpbnQgaGVpZ2h0ID0gcmVjdC5oZWlnaHQoKTsKKyAgaW50IHdpZHRoID0gcmVjdC53aWR0aCgpOworICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgKyt4KQorICAgICAgKihwdHIgKyB4KSA9IGNvbG9yOworICAgIHB0ciArPSBzdHJpZGUgLyA0OworICB9Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkRvY3VtZW50U2l6ZVVwZGF0ZWQoY29uc3QgcHA6OlNpemUmIHNpemUpIHsKKyAgZG9jdW1lbnRfc2l6ZV8gPSBzaXplOworCisgIE9uR2VvbWV0cnlDaGFuZ2VkKHpvb21fLCBkZXZpY2Vfc2NhbGVfKTsKK30KKwordm9pZCBJbnN0YW5jZTo6SW52YWxpZGF0ZShjb25zdCBwcDo6UmVjdCYgcmVjdCkgeworICBwcDo6UmVjdCBvZmZzZXRfcmVjdChyZWN0KTsKKyAgb2Zmc2V0X3JlY3QuT2Zmc2V0KGF2YWlsYWJsZV9hcmVhXy5wb2ludCgpKTsKKyAgcGFpbnRfbWFuYWdlcl8uSW52YWxpZGF0ZVJlY3Qob2Zmc2V0X3JlY3QpOworfQorCit2b2lkIEluc3RhbmNlOjpTY3JvbGwoY29uc3QgcHA6OlBvaW50JiBwb2ludCkgeworICBwcDo6UmVjdCBzY3JvbGxfYXJlYSA9IGF2YWlsYWJsZV9hcmVhXzsKKyAgaWYgKElzT3ZlcmxheVNjcm9sbGJhcigpKSB7CisgICAgcHA6OlJlY3QgcmM7CisgICAgaWYgKGhfc2Nyb2xsYmFyXy5nZXQoKSkgeworICAgICAgaF9zY3JvbGxiYXJfLT5HZXRMb2NhdGlvbigmcmMpOworICAgICAgU2NhbGVSZWN0KGRldmljZV9zY2FsZV8sICZyYyk7CisgICAgICBpZiAoc2Nyb2xsX2FyZWEuYm90dG9tKCkgPiByYy55KCkpIHsKKyAgICAgICAgc2Nyb2xsX2FyZWEuc2V0X2hlaWdodChyYy55KCkgLSBzY3JvbGxfYXJlYS55KCkpOworICAgICAgICBwYWludF9tYW5hZ2VyXy5JbnZhbGlkYXRlUmVjdChyYyk7CisgICAgICB9CisgICAgfQorICAgIGlmICh2X3Njcm9sbGJhcl8uZ2V0KCkpIHsKKyAgICAgIHZfc2Nyb2xsYmFyXy0+R2V0TG9jYXRpb24oJnJjKTsKKyAgICAgIFNjYWxlUmVjdChkZXZpY2Vfc2NhbGVfLCAmcmMpOworICAgICAgaWYgKHNjcm9sbF9hcmVhLnJpZ2h0KCkgPiByYy54KCkpIHsKKyAgICAgICAgc2Nyb2xsX2FyZWEuc2V0X3dpZHRoKHJjLngoKSAtIHNjcm9sbF9hcmVhLngoKSk7CisgICAgICAgIHBhaW50X21hbmFnZXJfLkludmFsaWRhdGVSZWN0KHJjKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcGFpbnRfbWFuYWdlcl8uU2Nyb2xsUmVjdChzY3JvbGxfYXJlYSwgcG9pbnQpOworCisgIGlmICh0b29sYmFyXy0+Y3VycmVudF90cmFuc3BhcmVuY3koKSAhPSBrVHJhbnNwYXJlbnRBbHBoYSkKKyAgICBwYWludF9tYW5hZ2VyXy5JbnZhbGlkYXRlUmVjdCh0b29sYmFyXy0+R2V0Q29udHJvbHNSZWN0KCkpOworCisgIGlmIChwcm9ncmVzc19iYXJfLnZpc2libGUoKSkKKyAgICBwYWludF9tYW5hZ2VyXy5JbnZhbGlkYXRlUmVjdChwcm9ncmVzc19iYXJfLnJlY3QoKSk7CisKKyAgaWYgKGlzX2F1dG9zY3JvbGxfKQorICAgIHBhaW50X21hbmFnZXJfLkludmFsaWRhdGVSZWN0KGF1dG9zY3JvbGxfcmVjdF8pOworCisgIGlmIChzaG93X3BhZ2VfaW5kaWNhdG9yXykgeworICAgIHBhZ2VfaW5kaWNhdG9yXy5zZXRfY3VycmVudF9wYWdlKEdldFBhZ2VOdW1iZXJUb0Rpc3BsYXkoKSk7CisgICAgcGFnZV9pbmRpY2F0b3JfLlNwbGFzaCgpOworICB9CisKKyAgaWYgKHBhZ2VfaW5kaWNhdG9yXy52aXNpYmxlKCkpCisgICAgcGFpbnRfbWFuYWdlcl8uSW52YWxpZGF0ZVJlY3QocGFnZV9pbmRpY2F0b3JfLnJlY3QoKSk7CisKKyAgLy8gUnVuIHRoZSBzY3JvbGwgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHkuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgYnkgYQorICAvLyBsYXlvdXQgY2hhbmdlIHdoaWNoIHNob3VsZCBub3QgcmUtZW50ZXIgaW50byBKUyBzeW5jaHJvbm91c2x5LgorICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgIGNhbGxiYWNrX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZJbnN0YW5jZTo6UnVuQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9zY3JvbGxfY2FsbGJhY2tfKTsKKyAgcHA6Ok1vZHVsZTo6R2V0KCktPmNvcmUoKS0+Q2FsbE9uTWFpblRocmVhZCgwLCBjYWxsYmFjayk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNjcm9sbFRvWChpbnQgcG9zaXRpb24pIHsKKyAgaWYgKCFoX3Njcm9sbGJhcl8uZ2V0KCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuOworICB9CisgIGludCBwb3NpdGlvbl9kaXAgPSBzdGF0aWNfY2FzdDxpbnQ+KHBvc2l0aW9uIC8gZGV2aWNlX3NjYWxlXyk7CisgIGhfc2Nyb2xsYmFyXy0+U2V0VmFsdWUocG9zaXRpb25fZGlwKTsKK30KKwordm9pZCBJbnN0YW5jZTo6U2Nyb2xsVG9ZKGludCBwb3NpdGlvbikgeworICBpZiAoIXZfc2Nyb2xsYmFyXy5nZXQoKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHBvc2l0aW9uX2RpcCA9IHN0YXRpY19jYXN0PGludD4ocG9zaXRpb24gLyBkZXZpY2Vfc2NhbGVfKTsKKyAgdl9zY3JvbGxiYXJfLT5TZXRWYWx1ZShDbGlwVG9SYW5nZShwb3NpdGlvbl9kaXAsIDAsIHZhbGlkX3ZfcmFuZ2VfKSk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNjcm9sbFRvUGFnZShpbnQgcGFnZSkgeworICBpZiAoIXZfc2Nyb2xsYmFyXy5nZXQoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKGVuZ2luZV8tPkdldE51bWJlck9mUGFnZXMoKSA9PSAwKQorICAgIHJldHVybjsKKworICBpbnQgaW5kZXggPSBDbGlwVG9SYW5nZShwYWdlLCAwLCBlbmdpbmVfLT5HZXROdW1iZXJPZlBhZ2VzKCkgLSAxKTsKKyAgcHA6OlJlY3QgcmVjdCA9IGVuZ2luZV8tPkdldFBhZ2VSZWN0KGluZGV4KTsKKyAgLy8gSWYgd2UgYXJlIHRyeWluZyB0byBzY3JvbGwgcGFzcyB0aGUgbGFzdCBwYWdlLAorICAvLyBzY3JvbGwgdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBwYWdlLgorICBpbnQgcG9zaXRpb24gPSBpbmRleCA8IHBhZ2UgPyByZWN0LmJvdHRvbSgpIDogcmVjdC55KCk7CisgIFNjcm9sbFRvWShwb3NpdGlvbiAqIHpvb21fICogZGV2aWNlX3NjYWxlXyk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6Ok5hdmlnYXRlVG8oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwgYm9vbCBvcGVuX2luX25ld190YWIpIHsKKyAgc3RkOjpzdHJpbmcgdXJsX2NvcHkodXJsKTsKKworICAvLyBFbXB0eSB8dXJsX2NvcHl8IGlzIG9rLCBhbmQgd2lsbCBlZmZlY3RpdmVseSBiZSBhIHJlbG9hZC4KKyAgLy8gU2tpcCB0aGUgY29kZSBiZWxvdyBzbyBhbiBlbXB0eSBVUkwgZG9lcyBub3QgdHVybiBpbnRvICJodHRwOi8vIiwgd2hpY2gKKyAgLy8gd2lsbCBjYXVzZSBHVVJMIHRvIGZhaWwgYSBEQ0hFQ0suCisgIGlmICghdXJsX2NvcHkuZW1wdHkoKSkgeworICAgIC8vIElmIHx1cmxfY29weXwgc3RhcnRzIHdpdGggJyMnLCB0aGVuIGl0J3MgZm9yIHRoZSBzYW1lIFVSTCB3aXRoIGEKKyAgICAvLyBkaWZmZXJlbnQgVVJMIGZyYWdtZW50LgorICAgIGlmICh1cmxfY29weVswXSA9PSAnIycpIHsKKyAgICAgIHVybF9jb3B5ID0gdXJsXyArIHVybF9jb3B5OworICAgICAgLy8gQ2hhbmdpbmcgdGhlIGhyZWYgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgd2hlbiBuYXZpZ2F0aW5nIGluIHRoZQorICAgICAgLy8gc2FtZSB0YWIsIHNvIGRvIHRoZSBhY3R1YWwgcGFnZSBzY3JvbGwgaGVyZS4gVGhlbiBmYWxsIHRocm91Z2ggc28gdGhlCisgICAgICAvLyBocmVmIGdldHMgdXBkYXRlZC4KKyAgICAgIGlmICghb3Blbl9pbl9uZXdfdGFiKSB7CisgICAgICAgIGludCBwYWdlX251bWJlciA9IEdldEluaXRpYWxQYWdlKHVybF9jb3B5KTsKKyAgICAgICAgaWYgKHBhZ2VfbnVtYmVyID49IDApCisgICAgICAgICAgU2Nyb2xsVG9QYWdlKHBhZ2VfbnVtYmVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgdGhlcmUncyBubyBzY2hlbWUsIGFkZCBodHRwLgorICAgIGlmICh1cmxfY29weS5maW5kKCI6Ly8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICB1cmxfY29weS5maW5kKCJtYWlsdG86IikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHVybF9jb3B5ID0gImh0dHA6Ly8iICsgdXJsX2NvcHk7CisgICAgfQorICAgIC8vIE1ha2Ugc3VyZSB8dXJsX2NvcHl8IHN0YXJ0cyB3aXRoIGEgdmFsaWQgc2NoZW1lLgorICAgIGlmICh1cmxfY29weS5maW5kKCJodHRwOi8vIikgIT0gMCAmJgorICAgICAgICB1cmxfY29weS5maW5kKCJodHRwczovLyIpICE9IDAgJiYKKyAgICAgICAgdXJsX2NvcHkuZmluZCgiZnRwOi8vIikgIT0gMCAmJgorICAgICAgICB1cmxfY29weS5maW5kKCJmaWxlOi8vIikgIT0gMCAmJgorICAgICAgICB1cmxfY29weS5maW5kKCJtYWlsdG86IikgIT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBNYWtlIHN1cmUgfHVybF9jb3B5fCBpcyBub3Qgb25seSBhIHNjaGVtZS4KKyAgICBpZiAodXJsX2NvcHkgPT0gImh0dHA6Ly8iIHx8CisgICAgICAgIHVybF9jb3B5ID09ICJodHRwczovLyIgfHwKKyAgICAgICAgdXJsX2NvcHkgPT0gImZ0cDovLyIgfHwKKyAgICAgICAgdXJsX2NvcHkgPT0gImZpbGU6Ly8iIHx8CisgICAgICAgIHVybF9jb3B5ID09ICJtYWlsdG86IikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAob3Blbl9pbl9uZXdfdGFiKSB7CisgICAgR2V0V2luZG93T2JqZWN0KCkuQ2FsbCgib3BlbiIsIHVybF9jb3B5KTsKKyAgfSBlbHNlIHsKKyAgICBHZXRXaW5kb3dPYmplY3QoKS5HZXRQcm9wZXJ0eSgidG9wIikuR2V0UHJvcGVydHkoImxvY2F0aW9uIikuCisgICAgICAgIFNldFByb3BlcnR5KCJocmVmIiwgdXJsX2NvcHkpOworICB9Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlVwZGF0ZUN1cnNvcihQUF9DdXJzb3JUeXBlX0RldiBjdXJzb3IpIHsKKyAgaWYgKGN1cnNvciA9PSBjdXJzb3JfKQorICAgIHJldHVybjsKKyAgY3Vyc29yXyA9IGN1cnNvcjsKKworICBjb25zdCBQUEJfQ3Vyc29yQ29udHJvbF9EZXYqIGN1cnNvcl9pbnRlcmZhY2UgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQUEJfQ3Vyc29yQ29udHJvbF9EZXYqPigKKyAgICAgIHBwOjpNb2R1bGU6OkdldCgpLT5HZXRCcm93c2VySW50ZXJmYWNlKFBQQl9DVVJTT1JfQ09OVFJPTF9ERVZfSU5URVJGQUNFKSk7CisgIGlmICghY3Vyc29yX2ludGVyZmFjZSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm47CisgIH0KKworICBjdXJzb3JfaW50ZXJmYWNlLT5TZXRDdXJzb3IoCisgICAgICBwcF9pbnN0YW5jZSgpLCBjdXJzb3JfLCBwcDo6SW1hZ2VEYXRhKCkucHBfcmVzb3VyY2UoKSwgTlVMTCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlVwZGF0ZVRpY2tNYXJrcyhjb25zdCBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4mIHRpY2ttYXJrcykgeworICBpZiAoIXZfc2Nyb2xsYmFyXy5nZXQoKSkKKyAgICByZXR1cm47CisKKyAgZmxvYXQgaW52ZXJzZV9zY2FsZSA9IDEuMGYgLyBkZXZpY2Vfc2NhbGVfOworICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gc2NhbGVkX3RpY2ttYXJrcyA9IHRpY2ttYXJrczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY2FsZWRfdGlja21hcmtzLnNpemUoKTsgaSsrKSB7CisgICAgU2NhbGVSZWN0KGludmVyc2Vfc2NhbGUsICZzY2FsZWRfdGlja21hcmtzW2ldKTsKKyAgfQorCisgIHZfc2Nyb2xsYmFyXy0+U2V0VGlja01hcmtzKAorICAgICAgc2NhbGVkX3RpY2ttYXJrcy5lbXB0eSgpID8gTlVMTCA6ICZzY2FsZWRfdGlja21hcmtzWzBdLCB0aWNrbWFya3Muc2l6ZSgpKTsKK30KKwordm9pZCBJbnN0YW5jZTo6Tm90aWZ5TnVtYmVyT2ZGaW5kUmVzdWx0c0NoYW5nZWQoaW50IHRvdGFsLCBib29sIGZpbmFsX3Jlc3VsdCkgeworICBOdW1iZXJPZkZpbmRSZXN1bHRzQ2hhbmdlZCh0b3RhbCwgZmluYWxfcmVzdWx0KTsKK30KKwordm9pZCBJbnN0YW5jZTo6Tm90aWZ5U2VsZWN0ZWRGaW5kUmVzdWx0Q2hhbmdlZChpbnQgY3VycmVudF9maW5kX2luZGV4KSB7CisgIFNlbGVjdGVkRmluZFJlc3VsdENoYW5nZWQoY3VycmVudF9maW5kX2luZGV4KTsKK30KKwordm9pZCBJbnN0YW5jZTo6T25FdmVudCh1aW50MzIgY29udHJvbF9pZCwgdWludDMyIGV2ZW50X2lkLCB2b2lkKiBkYXRhKSB7CisgIGlmIChldmVudF9pZCA9PSBCdXR0b246OkVWRU5UX0lEX0JVVFRPTl9DTElDS0VEIHx8CisgICAgICBldmVudF9pZCA9PSBCdXR0b246OkVWRU5UX0lEX0JVVFRPTl9TVEFURV9DSEFOR0VEKSB7CisgICAgc3dpdGNoIChjb250cm9sX2lkKSB7CisgICAgICBjYXNlIGtGaXRUb1BhZ2VCdXR0b25JZDoKKyAgICAgICAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5GaXRUb1BhZ2VCdXR0b24iKTsKKyAgICAgICAgU2V0Wm9vbShaT09NX0ZJVF9UT19QQUdFLCAwKTsKKyAgICAgICAgWm9vbUNoYW5nZWQoem9vbV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0ZpdFRvV2lkdGhCdXR0b25JZDoKKyAgICAgICAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5GaXRUb1dpZHRoQnV0dG9uIik7CisgICAgICAgIFNldFpvb20oWk9PTV9GSVRfVE9fV0lEVEgsIDApOworICAgICAgICBab29tQ2hhbmdlZCh6b29tXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrWm9vbU91dEJ1dHRvbklkOgorICAgICAgY2FzZSBrWm9vbUluQnV0dG9uSWQ6CisgICAgICAgIFVzZXJNZXRyaWNzUmVjb3JkQWN0aW9uKGNvbnRyb2xfaWQgPT0ga1pvb21PdXRCdXR0b25JZCA/CisgICAgICAgICAgICAiUERGLlpvb21PdXRCdXR0b24iIDogIlBERi5ab29tSW5CdXR0b24iKTsKKyAgICAgICAgU2V0Wm9vbShaT09NX1NDQUxFLCBDYWxjdWxhdGVab29tKGNvbnRyb2xfaWQpKTsKKyAgICAgICAgWm9vbUNoYW5nZWQoem9vbV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga1NhdmVCdXR0b25JZDoKKyAgICAgICAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5TYXZlQnV0dG9uIik7CisgICAgICAgIFNhdmVBcygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga1ByaW50QnV0dG9uSWQ6CisgICAgICAgIFVzZXJNZXRyaWNzUmVjb3JkQWN0aW9uKCJQREYuUHJpbnRCdXR0b24iKTsKKyAgICAgICAgUHJpbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChjb250cm9sX2lkID09IGtUaHVtYm5haWxzSWQgJiYKKyAgICAgIGV2ZW50X2lkID09IFRodW1ibmFpbENvbnRyb2w6OkVWRU5UX0lEX1RIVU1CTkFJTF9TRUxFQ1RFRCkgeworICAgIGludCBwYWdlID0gKnN0YXRpY19jYXN0PGludCo+KGRhdGEpOworICAgIHBwOjpSZWN0IHBhZ2VfcmMoZW5naW5lXy0+R2V0UGFnZVJlY3QocGFnZSkpOworICAgIFNjcm9sbFRvWShzdGF0aWNfY2FzdDxpbnQ+KHBhZ2VfcmMueSgpICogem9vbV8gKiBkZXZpY2Vfc2NhbGVfKSk7CisgIH0KK30KKwordm9pZCBJbnN0YW5jZTo6SW52YWxpZGF0ZSh1aW50MzIgY29udHJvbF9pZCwgY29uc3QgcHA6OlJlY3QmIHJjKSB7CisgIHBhaW50X21hbmFnZXJfLkludmFsaWRhdGVSZWN0KHJjKTsKK30KKwordWludDMyIEluc3RhbmNlOjpTY2hlZHVsZVRpbWVyKHVpbnQzMiBjb250cm9sX2lkLCB1aW50MzIgdGltZW91dF9tcykgeworICBjdXJyZW50X3RpbWVyX2lkXysrOworICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgIHRpbWVyX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZJbnN0YW5jZTo6T25Db250cm9sVGltZXJGaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWVyX2lkXyk7CisgIHBwOjpNb2R1bGU6OkdldCgpLT5jb3JlKCktPkNhbGxPbk1haW5UaHJlYWQodGltZW91dF9tcywgY2FsbGJhY2spOworICByZXR1cm4gY3VycmVudF90aW1lcl9pZF87Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNldEV2ZW50Q2FwdHVyZSh1aW50MzIgY29udHJvbF9pZCwgYm9vbCBzZXRfY2FwdHVyZSkgeworICAvLyBUT0RPKGdlbmUpOiBzZXQgZXZlbnQgY2FwdHVyZSBoZXJlLgorfQorCit2b2lkIEluc3RhbmNlOjpTZXRDdXJzb3IodWludDMyIGNvbnRyb2xfaWQsIFBQX0N1cnNvclR5cGVfRGV2IGN1cnNvcl90eXBlKSB7CisgIFVwZGF0ZUN1cnNvcihjdXJzb3JfdHlwZSk7Cit9CisKK3BwOjpJbnN0YW5jZSogSW5zdGFuY2U6OkdldEluc3RhbmNlKCkgeworICByZXR1cm4gdGhpczsKK30KKwordm9pZCBJbnN0YW5jZTo6R2V0RG9jdW1lbnRQYXNzd29yZCgKKyAgICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrV2l0aE91dHB1dDxwcDo6VmFyPiBjYWxsYmFjaykgeworICBzdGQ6OnN0cmluZyBtZXNzYWdlKEdldExvY2FsaXplZFN0cmluZyhQUF9SRVNPVVJDRVNUUklOR19QREZHRVRQQVNTV09SRCkpOworICBwcDo6VmFyIHJlc3VsdCA9IHBwOjpQREY6Ok1vZGFsUHJvbXB0Rm9yUGFzc3dvcmQodGhpcywgbWVzc2FnZSk7CisgICpjYWxsYmFjay5vdXRwdXQoKSA9IHJlc3VsdC5wcF92YXIoKTsKKyAgY2FsbGJhY2suUnVuKFBQX09LKTsKK30KKwordm9pZCBJbnN0YW5jZTo6QWxlcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgR2V0V2luZG93T2JqZWN0KCkuQ2FsbCgiYWxlcnQiLCBtZXNzYWdlKTsKK30KKworYm9vbCBJbnN0YW5jZTo6Q29uZmlybShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBwcDo6VmFyIHJlc3VsdCA9IEdldFdpbmRvd09iamVjdCgpLkNhbGwoImNvbmZpcm0iLCBtZXNzYWdlKTsKKyAgcmV0dXJuIHJlc3VsdC5pc19ib29sKCkgPyByZXN1bHQuQXNCb29sKCkgOiBmYWxzZTsKK30KKworc3RkOjpzdHJpbmcgSW5zdGFuY2U6OlByb21wdChjb25zdCBzdGQ6OnN0cmluZyYgcXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X2Fuc3dlcikgeworICBwcDo6VmFyIHJlc3VsdCA9IEdldFdpbmRvd09iamVjdCgpLkNhbGwoInByb21wdCIsIHF1ZXN0aW9uLCBkZWZhdWx0X2Fuc3dlcik7CisgIHJldHVybiByZXN1bHQuaXNfc3RyaW5nKCkgPyByZXN1bHQuQXNTdHJpbmcoKSA6IHN0ZDo6c3RyaW5nKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEluc3RhbmNlOjpHZXRVUkwoKSB7CisgIHJldHVybiB1cmxfOworfQorCit2b2lkIEluc3RhbmNlOjpFbWFpbChjb25zdCBzdGQ6OnN0cmluZyYgdG8sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYm9keSkgeworICBzdGQ6OnN0cmluZyBqYXZhc2NyaXB0ID0KKyAgICAgICJ2YXIgaHJlZiA9ICdtYWlsdG86IiArIG5ldDo6RXNjYXBlVXJsRW5jb2RlZERhdGEodG8sIGZhbHNlKSArCisgICAgICAiP2NjPSIgKyBuZXQ6OkVzY2FwZVVybEVuY29kZWREYXRhKGNjLCBmYWxzZSkgKworICAgICAgIiZiY2M9IiArIG5ldDo6RXNjYXBlVXJsRW5jb2RlZERhdGEoYmNjLCBmYWxzZSkgKworICAgICAgIiZzdWJqZWN0PSIgKyBuZXQ6OkVzY2FwZVVybEVuY29kZWREYXRhKHN1YmplY3QsIGZhbHNlKSArCisgICAgICAiJmJvZHk9IiArIG5ldDo6RXNjYXBlVXJsRW5jb2RlZERhdGEoYm9keSwgZmFsc2UpICsKKyAgICAgICInO3ZhciB0ZW1wID0gd2luZG93Lm9wZW4oaHJlZiwgJ19ibGFuaycsICIgKworICAgICAgIid3aWR0aD0xLGhlaWdodD0xJyk7aWYodGVtcCkgdGVtcC5jbG9zZSgpOyI7CisgIEV4ZWN1dGVTY3JpcHQoamF2YXNjcmlwdCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlByaW50KCkgeworICBpZiAoIXByaW50aW5nX2VuYWJsZWRfIHx8CisgICAgICAoIWVuZ2luZV8tPkhhc1Blcm1pc3Npb24oUERGRW5naW5lOjpQRVJNSVNTSU9OX1BSSU5UX0xPV19RVUFMSVRZKSAmJgorICAgICAgICFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9ISUdIX1FVQUxJVFkpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgY2FsbGJhY2tfZmFjdG9yeV8uTmV3Q2FsbGJhY2soJkluc3RhbmNlOjpPblByaW50KTsKKyAgcHA6Ok1vZHVsZTo6R2V0KCktPmNvcmUoKS0+Q2FsbE9uTWFpblRocmVhZCgwLCBjYWxsYmFjayk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6Ok9uUHJpbnQoaW50MzJfdCkgeworICBwcDo6UERGOjpQcmludCh0aGlzKTsKK30KKwordm9pZCBJbnN0YW5jZTo6U2F2ZUFzKCkgeworICBwcDo6UERGOjpTYXZlQXModGhpcyk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlN1Ym1pdEZvcm0oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworICBwcDo6VVJMUmVxdWVzdEluZm8gcmVxdWVzdCh0aGlzKTsKKyAgcmVxdWVzdC5TZXRVUkwodXJsKTsKKyAgcmVxdWVzdC5TZXRNZXRob2QoIlBPU1QiKTsKKyAgcmVxdWVzdC5BcHBlbmREYXRhVG9Cb2R5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpLCBsZW5ndGgpOworCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgZm9ybV9mYWN0b3J5Xy5OZXdDYWxsYmFjaygmSW5zdGFuY2U6OkZvcm1EaWRPcGVuKTsKKyAgZm9ybV9sb2FkZXJfID0gQ3JlYXRlVVJMTG9hZGVySW50ZXJuYWwoKTsKKyAgaW50IHJ2ID0gZm9ybV9sb2FkZXJfLk9wZW4ocmVxdWVzdCwgY2FsbGJhY2spOworICBpZiAocnYgIT0gUFBfT0tfQ09NUExFVElPTlBFTkRJTkcpCisgICAgY2FsbGJhY2suUnVuKHJ2KTsKK30KKwordm9pZCBJbnN0YW5jZTo6Rm9ybURpZE9wZW4oaW50MzJfdCByZXN1bHQpIHsKKyAgLy8gVE9ETzogaW5mb3JtIHRoZSB1c2VyIG9mIHN1Y2Nlc3MvZmFpbHVyZS4KKyAgaWYgKHJlc3VsdCAhPSBQUF9PSykgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBJbnN0YW5jZTo6U2hvd0ZpbGVTZWxlY3Rpb25EaWFsb2coKSB7CisgIC8vIFNlZW1zIGxpa2UgdmVyeSBsb3cgcHJpb3JpdHkgdG8gaW1wbGVtZW50LCBzaW5jZSB0aGUgcGRmIGhhcyBubyB3YXkgdG8gZ2V0CisgIC8vIHRoZSBmaWxlIGRhdGEgYW55d2F5cy4gIEphdmFzY3JpcHQgZG9lc24ndCBsZXQgeW91IGRvIHRoaXMgc3luY2hyb25vdXNseS4KKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKK30KKworcHA6OlVSTExvYWRlciBJbnN0YW5jZTo6Q3JlYXRlVVJMTG9hZGVyKCkgeworICBpZiAoZnVsbF8pIHsKKyAgICBpZiAoIWRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfKSB7CisgICAgICBkaWRfY2FsbF9zdGFydF9sb2FkaW5nXyA9IHRydWU7CisgICAgICBwcDo6UERGOjpEaWRTdGFydExvYWRpbmcodGhpcyk7CisgICAgfQorCisgICAgLy8gRGlzYWJsZSBzYXZlIGFuZCBwcmludCB1bnRpbCB0aGUgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkLCBzaW5jZSB0aGV5CisgICAgLy8gd291bGQgZ2VuZXJhdGUgYW4gaW5jb21wbGV0ZSBkb2N1bWVudC4gIE5lZWQgdG8gZG8gdGhpcyBlYWNoIHRpbWUgd2UKKyAgICAvLyBjYWxsIERpZFN0YXJ0TG9hZGluZyBzaW5jZSB0aGF0IHJlc2V0cyB0aGUgY29udGVudCByZXN0cmljdGlvbnMuCisgICAgcHA6OlBERjo6U2V0Q29udGVudFJlc3RyaWN0aW9uKHRoaXMsIENPTlRFTlRfUkVTVFJJQ1RJT05fU0FWRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfUkVTVFJJQ1RJT05fUFJJTlQpOworICB9CisKKyAgcmV0dXJuIENyZWF0ZVVSTExvYWRlckludGVybmFsKCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNjaGVkdWxlQ2FsbGJhY2soaW50IGlkLCBpbnQgZGVsYXlfaW5fbXMpIHsKKyAgcHA6OkNvbXBsZXRpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICB0aW1lcl9mYWN0b3J5Xy5OZXdDYWxsYmFjaygmSW5zdGFuY2U6Ok9uQ2xpZW50VGltZXJGaXJlZCk7CisgIHBwOjpNb2R1bGU6OkdldCgpLT5jb3JlKCktPkNhbGxPbk1haW5UaHJlYWQoZGVsYXlfaW5fbXMsIGNhbGxiYWNrLCBpZCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNlYXJjaFN0cmluZyhjb25zdCBiYXNlOjpjaGFyMTYqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpjaGFyMTYqIHRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTZWFyY2hTdHJpbmdSZXN1bHQ+KiByZXN1bHRzKSB7CisgIGlmICghcHA6OlBERjo6SXNBdmFpbGFibGUoKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm47CisgIH0KKworICBQUF9Qcml2YXRlRmluZFJlc3VsdCogcHBfcmVzdWx0czsKKyAgaW50IGNvdW50ID0gMDsKKyAgcHA6OlBERjo6U2VhcmNoU3RyaW5nKAorICAgICAgdGhpcywKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihzdHJpbmcpLAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBzaG9ydCo+KHRlcm0pLAorICAgICAgY2FzZV9zZW5zaXRpdmUsCisgICAgICAmcHBfcmVzdWx0cywKKyAgICAgICZjb3VudCk7CisKKyAgcmVzdWx0cy0+cmVzaXplKGNvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgKCpyZXN1bHRzKVtpXS5zdGFydF9pbmRleCA9IHBwX3Jlc3VsdHNbaV0uc3RhcnRfaW5kZXg7CisgICAgKCpyZXN1bHRzKVtpXS5sZW5ndGggPSBwcF9yZXN1bHRzW2ldLmxlbmd0aDsKKyAgfQorCisgIHBwOjpNZW1vcnlfRGV2IG1lbW9yeTsKKyAgbWVtb3J5Lk1lbUZyZWUocHBfcmVzdWx0cyk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkRvY3VtZW50UGFpbnRPY2N1cnJlZCgpIHsKKyAgaWYgKHBhaW50ZWRfZmlyc3RfcGFnZV8pCisgICAgcmV0dXJuOworCisgIHBhaW50ZWRfZmlyc3RfcGFnZV8gPSB0cnVlOworICBVcGRhdGVUb29sYmFyUG9zaXRpb24oZmFsc2UpOworICB0b29sYmFyXy0+U3BsYXNoKGtUb29sYmFyU3BsYXNoVGltZW91dE1zKTsKKworICBpZiAoZW5naW5lXy0+R2V0TnVtYmVyT2ZQYWdlcygpID4gMSkKKyAgICBzaG93X3BhZ2VfaW5kaWNhdG9yXyA9IHRydWU7CisgIGVsc2UKKyAgICBzaG93X3BhZ2VfaW5kaWNhdG9yXyA9IGZhbHNlOworCisgIGlmICh2X3Njcm9sbGJhcl8uZ2V0KCkgJiYgc2hvd19wYWdlX2luZGljYXRvcl8pIHsKKyAgICBwYWdlX2luZGljYXRvcl8uc2V0X2N1cnJlbnRfcGFnZShHZXRQYWdlTnVtYmVyVG9EaXNwbGF5KCkpOworICAgIHBhZ2VfaW5kaWNhdG9yXy5TcGxhc2goa1Rvb2xiYXJTcGxhc2hUaW1lb3V0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrUGFnZUluZGljYXRvckluaXRpYWxGYWRlVGltZW91dE1zKTsKKyAgfQorfQorCit2b2lkIEluc3RhbmNlOjpEb2N1bWVudExvYWRDb21wbGV0ZShpbnQgcGFnZV9jb3VudCkgeworICAvLyBDbGVhciBmb2N1cyBzdGF0ZSBmb3IgT1NLLgorICBGb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoZmFsc2UpOworCisgIC8vIFVwZGF0ZSBwcm9ncmVzcyBjb250cm9sLgorICBpZiAocHJvZ3Jlc3NfYmFyXy52aXNpYmxlKCkpCisgICAgcHJvZ3Jlc3NfYmFyXy5GYWRlKGZhbHNlLCBrUHJvZ3Jlc3NGYWRlVGltZW91dE1zKTsKKworICBEQ0hFQ0soZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPT0gTE9BRF9TVEFURV9MT0FESU5HKTsKKyAgZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPSBMT0FEX1NUQVRFX0NPTVBMRVRFOworICBVc2VyTWV0cmljc1JlY29yZEFjdGlvbigiUERGLkxvYWRTdWNjZXNzIik7CisKKyAgaWYgKGRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfKSB7CisgICAgcHA6OlBERjo6RGlkU3RvcExvYWRpbmcodGhpcyk7CisgICAgZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18gPSBmYWxzZTsKKyAgfQorCisgIGlmIChvbl9sb2FkX2NhbGxiYWNrXy5pc19zdHJpbmcoKSkKKyAgICBFeGVjdXRlU2NyaXB0KG9uX2xvYWRfY2FsbGJhY2tfKTsKKyAgLy8gTm90ZTogSWYgd2UgYXJlIGluIHByaW50IHByZXZpZXcgbW9kZSBvbl9sb2FkX2NhbGxiYWNrXyBtaWdodCBjYWxsCisgIC8vIFNjcm9sbFRve1h8WX0oKSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzY3JvbGwgYWdhaW4gYW5kIG92ZXJyaWRlIGl0LgorICAvLyAjcGFnZT1OIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHJpbnQgUHJldmlldy4KKyAgaWYgKCFJc1ByaW50UHJldmlldygpKSB7CisgICAgaW50IGluaXRpYWxfcGFnZSA9IEdldEluaXRpYWxQYWdlKHVybF8pOworICAgIGlmIChpbml0aWFsX3BhZ2UgPj0gMCkKKyAgICAgIFNjcm9sbFRvUGFnZShpbml0aWFsX3BhZ2UpOworICB9CisKKyAgaWYgKCFmdWxsXykKKyAgICByZXR1cm47CisgIGlmICghcHA6OlBERjo6SXNBdmFpbGFibGUoKSkKKyAgICByZXR1cm47CisKKyAgaW50IGNvbnRlbnRfcmVzdHJpY3Rpb25zID0KKyAgICAgIENPTlRFTlRfUkVTVFJJQ1RJT05fQ1VUIHwgQ09OVEVOVF9SRVNUUklDVElPTl9QQVNURTsKKyAgaWYgKCFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9DT1BZKSkKKyAgICBjb250ZW50X3Jlc3RyaWN0aW9ucyB8PSBDT05URU5UX1JFU1RSSUNUSU9OX0NPUFk7CisKKyAgaWYgKCFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9MT1dfUVVBTElUWSkgJiYKKyAgICAgICFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9ISUdIX1FVQUxJVFkpKSB7CisgICAgcHJpbnRpbmdfZW5hYmxlZF8gPSBmYWxzZTsKKyAgICBpZiAoY3VycmVudF90Yl9pbmZvXyA9PSBrUERGVG9vbGJhckJ1dHRvbnMpIHsKKyAgICAgIC8vIFJlbW92ZSBQcmludCBidXR0b24uCisgICAgICBDcmVhdGVUb29sYmFyKGtQREZOb1ByaW50VG9vbGJhckJ1dHRvbnMsCisgICAgICAgICAgICAgICAgICAgIGFycmF5c2l6ZShrUERGTm9QcmludFRvb2xiYXJCdXR0b25zKSk7CisgICAgICBVcGRhdGVUb29sYmFyUG9zaXRpb24oZmFsc2UpOworICAgICAgSW52YWxpZGF0ZShwcDo6UmVjdChwbHVnaW5fc2l6ZV8pKTsKKyAgICB9CisgIH0KKworICBwcDo6UERGOjpTZXRDb250ZW50UmVzdHJpY3Rpb24odGhpcywgY29udGVudF9yZXN0cmljdGlvbnMpOworCisgIHBwOjpQREY6Okhpc3RvZ3JhbVBERlBhZ2VDb3VudCh0aGlzLCBwYWdlX2NvdW50KTsKK30KKwordm9pZCBJbnN0YW5jZTo6Um90YXRlQ2xvY2t3aXNlKCkgeworICBlbmdpbmVfLT5Sb3RhdGVDbG9ja3dpc2UoKTsKK30KKwordm9pZCBJbnN0YW5jZTo6Um90YXRlQ291bnRlcmNsb2Nrd2lzZSgpIHsKKyAgZW5naW5lXy0+Um90YXRlQ291bnRlcmNsb2Nrd2lzZSgpOworfQorCit2b2lkIEluc3RhbmNlOjpQcmV2aWV3RG9jdW1lbnRMb2FkQ29tcGxldGUoKSB7CisgIGlmIChwcmV2aWV3X2RvY3VtZW50X2xvYWRfc3RhdGVfICE9IExPQURfU1RBVEVfTE9BRElORyB8fAorICAgICAgcHJldmlld19wYWdlc19pbmZvXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXyA9IExPQURfU1RBVEVfQ09NUExFVEU7CisKKyAgaW50IGRlc3RfcGFnZV9pbmRleCA9IHByZXZpZXdfcGFnZXNfaW5mb18uZnJvbnQoKS5zZWNvbmQ7CisgIGludCBzcmNfcGFnZV9pbmRleCA9CisgICAgICBFeHRyYWN0UHJpbnRQcmV2aWV3UGFnZUluZGV4KHByZXZpZXdfcGFnZXNfaW5mb18uZnJvbnQoKS5maXJzdCk7CisgIGlmIChzcmNfcGFnZV9pbmRleCA+IDAgJiYgIGRlc3RfcGFnZV9pbmRleCA+IC0xICYmIHByZXZpZXdfZW5naW5lXy5nZXQoKSkKKyAgICBlbmdpbmVfLT5BcHBlbmRQYWdlKHByZXZpZXdfZW5naW5lXy5nZXQoKSwgZGVzdF9wYWdlX2luZGV4KTsKKworICBwcmV2aWV3X3BhZ2VzX2luZm9fLnBvcCgpOworICAvLyB8cHJpbnRfcHJldmlld19wYWdlX2NvdW50X3wgaXMgbm90IHVwZGF0ZWQgeWV0LiBEbyBub3QgbG9hZCBhbnkKKyAgLy8gb3RoZXIgcHJldmlldyBwYWdlcyB0aWxsIHdlIGdldCB0aGlzIGluZm9ybWF0aW9uLgorICBpZiAocHJpbnRfcHJldmlld19wYWdlX2NvdW50XyA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAocHJldmlld19wYWdlc19pbmZvXy5zaXplKCkpCisgICAgTG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkRvY3VtZW50TG9hZEZhaWxlZCgpIHsKKyAgRENIRUNLKGRvY3VtZW50X2xvYWRfc3RhdGVfID09IExPQURfU1RBVEVfTE9BRElORyk7CisgIFVzZXJNZXRyaWNzUmVjb3JkQWN0aW9uKCJQREYuTG9hZEZhaWx1cmUiKTsKKworICAvLyBIaWRlIHByb2dyZXNzIGNvbnRyb2wuCisgIHByb2dyZXNzX2Jhcl8uRmFkZShmYWxzZSwga1Byb2dyZXNzRmFkZVRpbWVvdXRNcyk7CisKKyAgaWYgKGRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfKSB7CisgICAgcHA6OlBERjo6RGlkU3RvcExvYWRpbmcodGhpcyk7CisgICAgZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18gPSBmYWxzZTsKKyAgfQorCisgIGRvY3VtZW50X2xvYWRfc3RhdGVfID0gTE9BRF9TVEFURV9GQUlMRUQ7CisgIHBhaW50X21hbmFnZXJfLkludmFsaWRhdGVSZWN0KHBwOjpSZWN0KHBwOjpQb2ludCgpLCBwbHVnaW5fc2l6ZV8pKTsKK30KKwordm9pZCBJbnN0YW5jZTo6UHJldmlld0RvY3VtZW50TG9hZEZhaWxlZCgpIHsKKyAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5QcmV2aWV3RG9jdW1lbnRMb2FkRmFpbHVyZSIpOworICBpZiAocHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXyAhPSBMT0FEX1NUQVRFX0xPQURJTkcgfHwKKyAgICAgIHByZXZpZXdfcGFnZXNfaW5mb18uZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHByZXZpZXdfZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPSBMT0FEX1NUQVRFX0ZBSUxFRDsKKyAgcHJldmlld19wYWdlc19pbmZvXy5wb3AoKTsKKworICBpZiAocHJldmlld19wYWdlc19pbmZvXy5zaXplKCkpCisgICAgTG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCk7Cit9CisKK3BwOjpJbnN0YW5jZSogSW5zdGFuY2U6OkdldFBsdWdpbkluc3RhbmNlKCkgeworICByZXR1cm4gR2V0SW5zdGFuY2UoKTsKK30KKwordm9pZCBJbnN0YW5jZTo6RG9jdW1lbnRIYXNVbnN1cHBvcnRlZEZlYXR1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGZlYXR1cmUpIHsKKyAgc3RkOjpzdHJpbmcgbWV0cmljKCJQREZfVW5zdXBwb3J0ZWRfIik7CisgIG1ldHJpYyArPSBmZWF0dXJlOworICBpZiAoIXVuc3VwcG9ydGVkX2ZlYXR1cmVzX3JlcG9ydGVkXy5jb3VudChtZXRyaWMpKSB7CisgICAgdW5zdXBwb3J0ZWRfZmVhdHVyZXNfcmVwb3J0ZWRfLmluc2VydChtZXRyaWMpOworICAgIFVzZXJNZXRyaWNzUmVjb3JkQWN0aW9uKG1ldHJpYyk7CisgIH0KKworICAvLyBTaW5jZSB3ZSB1c2UgYW4gaW5mbyBiYXIsIG9ubHkgZG8gdGhpcyBmb3IgZnVsbCBmcmFtZSBwbHVnaW5zLi4KKyAgaWYgKCFmdWxsXykKKyAgICByZXR1cm47CisKKyAgaWYgKHRvbGRfYnJvd3Nlcl9hYm91dF91bnN1cHBvcnRlZF9mZWF0dXJlXykKKyAgICByZXR1cm47CisgIHRvbGRfYnJvd3Nlcl9hYm91dF91bnN1cHBvcnRlZF9mZWF0dXJlXyA9IHRydWU7CisKKyAgcHA6OlBERjo6SGFzVW5zdXBwb3J0ZWRGZWF0dXJlKHRoaXMpOworfQorCit2b2lkIEluc3RhbmNlOjpEb2N1bWVudExvYWRQcm9ncmVzcyh1aW50MzIgYXZhaWxhYmxlLCB1aW50MzIgZG9jX3NpemUpIHsKKyAgZG91YmxlIHByb2dyZXNzID0gMC4wOworICBpZiAoZG9jX3NpemUgPT0gMCkgeworICAgIC8vIERvY3VtZW50IHNpemUgaXMgdW5rbm93bi4gVXNlIGhldXJpc3RpY3MuCisgICAgLy8gV2UnbGwgbWFrZSBwcm9ncmVzcyBsb2dhcml0aG1pYyBmcm9tIDAgdG8gMTAwTS4KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtGYWN0b3IgPSBsb2coMTAwMDAwMDAwLjApIC8gMTAwLjA7CisgICAgaWYgKGF2YWlsYWJsZSA+IDApIHsKKyAgICAgIHByb2dyZXNzID0gbG9nKHN0YXRpY19jYXN0PGRvdWJsZT4oYXZhaWxhYmxlKSkgLyBrRmFjdG9yOworICAgICAgaWYgKHByb2dyZXNzID4gMTAwLjApCisgICAgICAgIHByb2dyZXNzID0gMTAwLjA7CisgICAgfQorICB9IGVsc2UgeworICAgIHByb2dyZXNzID0gMTAwLjAgKiBzdGF0aWNfY2FzdDxkb3VibGU+KGF2YWlsYWJsZSkgLyBkb2Nfc2l6ZTsKKyAgfQorICBwcm9ncmVzc19iYXJfLlNldFByb2dyZXNzKHByb2dyZXNzKTsKK30KKwordm9pZCBJbnN0YW5jZTo6Rm9ybVRleHRGaWVsZEZvY3VzQ2hhbmdlKGJvb2wgaW5fZm9jdXMpIHsKKyAgaWYgKCF0ZXh0X2lucHV0Xy5nZXQoKSkKKyAgICByZXR1cm47CisgIGlmIChpbl9mb2N1cykKKyAgICB0ZXh0X2lucHV0Xy0+U2V0VGV4dElucHV0VHlwZShQUF9URVhUSU5QVVRfVFlQRV9ERVZfVEVYVCk7CisgIGVsc2UKKyAgICB0ZXh0X2lucHV0Xy0+U2V0VGV4dElucHV0VHlwZShQUF9URVhUSU5QVVRfVFlQRV9ERVZfTk9ORSk7Cit9CisKKy8vIENhbGxlZCBieSBQREZTY3JpcHRhYmxlT2JqZWN0LgorYm9vbCBJbnN0YW5jZTo6SGFzU2NyaXB0YWJsZU1ldGhvZChjb25zdCBwcDo6VmFyJiBtZXRob2QsIHBwOjpWYXIqIGV4Y2VwdGlvbikgeworICBzdGQ6OnN0cmluZyBtZXRob2Rfc3RyID0gbWV0aG9kLkFzU3RyaW5nKCk7CisgIHJldHVybiAobWV0aG9kX3N0ciA9PSBrSlNBY2Nlc3NpYmlsaXR5IHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNEb2N1bWVudExvYWRDb21wbGV0ZSB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTR2V0SGVpZ2h0IHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNHZXRIb3Jpem9udGFsU2Nyb2xsYmFyVGhpY2tuZXNzIHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNHZXRQYWdlTG9jYXRpb25Ob3JtYWxpemVkIHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNHZXRTZWxlY3RlZFRleHQgfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU0dldFZlcnRpY2FsU2Nyb2xsYmFyVGhpY2tuZXNzIHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNHZXRXaWR0aCB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTR2V0Wm9vbUxldmVsIHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNHb1RvUGFnZSB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTR3JheXNjYWxlIHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNMb2FkUHJldmlld1BhZ2UgfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU09uTG9hZCB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTT25QbHVnaW5TaXplQ2hhbmdlZCB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTT25TY3JvbGwgfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU1BhZ2VYT2Zmc2V0IHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNQYWdlWU9mZnNldCB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTUHJpbnRQcmV2aWV3UGFnZUNvdW50IHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNSZWxvYWQgfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU1JlbW92ZVByaW50QnV0dG9uIHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNSZXNldFByaW50UHJldmlld1VybCB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTU2VuZEtleUV2ZW50IHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNTZXRQYWdlTnVtYmVycyB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTU2V0UGFnZVhPZmZzZXQgfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU1NldFBhZ2VZT2Zmc2V0IHx8CisgICAgICAgICAgbWV0aG9kX3N0ciA9PSBrSlNTZXRab29tTGV2ZWwgfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU1pvb21GaXRUb0hlaWdodCB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTWm9vbUZpdFRvV2lkdGggfHwKKyAgICAgICAgICBtZXRob2Rfc3RyID09IGtKU1pvb21JbiB8fAorICAgICAgICAgIG1ldGhvZF9zdHIgPT0ga0pTWm9vbU91dCk7Cit9CisKK3BwOjpWYXIgSW5zdGFuY2U6OkNhbGxTY3JpcHRhYmxlTWV0aG9kKGNvbnN0IHBwOjpWYXImIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpWYXI+JiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OlZhciogZXhjZXB0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIG1ldGhvZF9zdHIgPSBtZXRob2QuQXNTdHJpbmcoKTsKKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTR3JheXNjYWxlKSB7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXS5pc19ib29sKCkpIHsKKyAgICAgIGVuZ2luZV8tPlNldEdyYXlzY2FsZShhcmdzWzBdLkFzQm9vbCgpKTsKKyAgICAgIC8vIFJlZHJhdworICAgICAgcGFpbnRfbWFuYWdlcl8uSW52YWxpZGF0ZVJlY3QocHA6OlJlY3QocHA6OlBvaW50KCksIHBsdWdpbl9zaXplXykpOworI2lmZGVmIEVOQUJMRV9USFVNQk5BSUxTCisgICAgICBpZiAodGh1bWJuYWlsc18udmlzaWJsZSgpKQorICAgICAgICB0aHVtYm5haWxzXy5TaG93KHRydWUsIHRydWUpOworI2VuZGlmCisgICAgICByZXR1cm4gcHA6OlZhcih0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHBwOjpWYXIoZmFsc2UpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU09uTG9hZCkgeworICAgIGlmIChhcmdzLnNpemUoKSA9PSAxICYmIGFyZ3NbMF0uaXNfc3RyaW5nKCkpIHsKKyAgICAgIG9uX2xvYWRfY2FsbGJhY2tfID0gYXJnc1swXTsKKyAgICAgIHJldHVybiBwcDo6VmFyKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gcHA6OlZhcihmYWxzZSk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTT25TY3JvbGwpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdLmlzX3N0cmluZygpKSB7CisgICAgICBvbl9zY3JvbGxfY2FsbGJhY2tfID0gYXJnc1swXTsKKyAgICAgIHJldHVybiBwcDo6VmFyKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gcHA6OlZhcihmYWxzZSk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTT25QbHVnaW5TaXplQ2hhbmdlZCkgeworICAgIGlmIChhcmdzLnNpemUoKSA9PSAxICYmIGFyZ3NbMF0uaXNfc3RyaW5nKCkpIHsKKyAgICAgIG9uX3BsdWdpbl9zaXplX2NoYW5nZWRfY2FsbGJhY2tfID0gYXJnc1swXTsKKyAgICAgIHJldHVybiBwcDo6VmFyKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gcHA6OlZhcihmYWxzZSk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTUmVsb2FkKSB7CisgICAgZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPSBMT0FEX1NUQVRFX0xPQURJTkc7CisgICAgaWYgKCFmdWxsXykKKyAgICAgIExvYWRVcmwodXJsXyk7CisgICAgcHJldmlld19lbmdpbmVfLnJlc2V0KCk7CisgICAgcHJpbnRfcHJldmlld19wYWdlX2NvdW50XyA9IDA7CisgICAgZW5naW5lXy5yZXNldChQREZFbmdpbmU6OkNyZWF0ZSh0aGlzKSk7CisgICAgZW5naW5lXy0+TmV3KHVybF8uY19zdHIoKSk7CisjaWZkZWYgRU5BQkxFX1RIVU1CTkFJTFMKKyAgICB0aHVtYm5haWxzXy5SZXNldEVuZ2luZShlbmdpbmVfLmdldCgpKTsKKyNlbmRpZgorICAgIHJldHVybiBwcDo6VmFyKCk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTUmVzZXRQcmludFByZXZpZXdVcmwpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdLmlzX3N0cmluZygpKSB7CisgICAgICB1cmxfID0gYXJnc1swXS5Bc1N0cmluZygpOworICAgICAgcHJldmlld19wYWdlc19pbmZvXyA9IHN0ZDo6cXVldWU8UHJldmlld1BhZ2VJbmZvPigpOworICAgICAgcHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXyA9IExPQURfU1RBVEVfQ09NUExFVEU7CisgICAgfQorICAgIHJldHVybiBwcDo6VmFyKCk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTWm9vbUZpdFRvSGVpZ2h0KSB7CisgICAgU2V0Wm9vbShaT09NX0ZJVF9UT19QQUdFLCAwKTsKKyAgICByZXR1cm4gcHA6OlZhcigpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU1pvb21GaXRUb1dpZHRoKSB7CisgICAgU2V0Wm9vbShaT09NX0ZJVF9UT19XSURUSCwgMCk7CisgICAgcmV0dXJuIHBwOjpWYXIoKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNab29tSW4pIHsKKyAgICBTZXRab29tKFpPT01fU0NBTEUsIENhbGN1bGF0ZVpvb20oa1pvb21JbkJ1dHRvbklkKSk7CisgICAgcmV0dXJuIHBwOjpWYXIoKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNab29tT3V0KSB7CisgICAgU2V0Wm9vbShaT09NX1NDQUxFLCBDYWxjdWxhdGVab29tKGtab29tT3V0QnV0dG9uSWQpKTsKKyAgICByZXR1cm4gcHA6OlZhcigpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU1NldFpvb21MZXZlbCkgeworICAgIGlmIChhcmdzLnNpemUoKSA9PSAxICYmIGFyZ3NbMF0uaXNfbnVtYmVyKCkpCisgICAgICBTZXRab29tKFpPT01fU0NBTEUsIGFyZ3NbMF0uQXNEb3VibGUoKSk7CisgICAgcmV0dXJuIHBwOjpWYXIoKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNHZXRab29tTGV2ZWwpIHsKKyAgICByZXR1cm4gcHA6OlZhcih6b29tXyk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTR2V0SGVpZ2h0KSB7CisgICAgcmV0dXJuIHBwOjpWYXIocGx1Z2luX3NpemVfLmhlaWdodCgpKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNHZXRXaWR0aCkgeworICAgIHJldHVybiBwcDo6VmFyKHBsdWdpbl9zaXplXy53aWR0aCgpKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNHZXRIb3Jpem9udGFsU2Nyb2xsYmFyVGhpY2tuZXNzKSB7CisgICAgcmV0dXJuIHBwOjpWYXIoCisgICAgICAgICAgaF9zY3JvbGxiYXJfLmdldCgpID8gR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSA6IDApOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU0dldFZlcnRpY2FsU2Nyb2xsYmFyVGhpY2tuZXNzKSB7CisgICAgcmV0dXJuIHBwOjpWYXIoCisgICAgICAgICAgdl9zY3JvbGxiYXJfLmdldCgpID8gR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSA6IDApOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU0dldFNlbGVjdGVkVGV4dCkgeworICAgIHJldHVybiBHZXRTZWxlY3RlZFRleHQoZmFsc2UpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU0RvY3VtZW50TG9hZENvbXBsZXRlKSB7CisgICAgcmV0dXJuIHBwOjpWYXIoKGRvY3VtZW50X2xvYWRfc3RhdGVfICE9IExPQURfU1RBVEVfTE9BRElORykpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU1BhZ2VZT2Zmc2V0KSB7CisgICAgcmV0dXJuIHBwOjpWYXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oCisgICAgICAgIHZfc2Nyb2xsYmFyXy5nZXQoKSA/IHZfc2Nyb2xsYmFyXy0+R2V0VmFsdWUoKSA6IDApKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNTZXRQYWdlWU9mZnNldCkgeworICAgIGlmIChhcmdzLnNpemUoKSA9PSAxICYmIGFyZ3NbMF0uaXNfbnVtYmVyKCkgJiYgdl9zY3JvbGxiYXJfLmdldCgpKQorICAgICAgU2Nyb2xsVG9ZKEdldFNjYWxlZChhcmdzWzBdLkFzSW50KCkpKTsKKyAgICByZXR1cm4gcHA6OlZhcigpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU1BhZ2VYT2Zmc2V0KSB7CisgICAgcmV0dXJuIHBwOjpWYXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oCisgICAgICAgIGhfc2Nyb2xsYmFyXy5nZXQoKSA/IGhfc2Nyb2xsYmFyXy0+R2V0VmFsdWUoKSA6IDApKTsKKyAgfQorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNTZXRQYWdlWE9mZnNldCkgeworICAgIGlmIChhcmdzLnNpemUoKSA9PSAxICYmIGFyZ3NbMF0uaXNfbnVtYmVyKCkgJiYgaF9zY3JvbGxiYXJfLmdldCgpKQorICAgICAgU2Nyb2xsVG9YKEdldFNjYWxlZChhcmdzWzBdLkFzSW50KCkpKTsKKyAgICByZXR1cm4gcHA6OlZhcigpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU1JlbW92ZVByaW50QnV0dG9uKSB7CisgICAgQ3JlYXRlVG9vbGJhcihrUHJpbnRQcmV2aWV3VG9vbGJhckJ1dHRvbnMsCisgICAgICAgICAgICAgICAgICBhcnJheXNpemUoa1ByaW50UHJldmlld1Rvb2xiYXJCdXR0b25zKSk7CisgICAgVXBkYXRlVG9vbGJhclBvc2l0aW9uKGZhbHNlKTsKKyAgICBJbnZhbGlkYXRlKHBwOjpSZWN0KHBsdWdpbl9zaXplXykpOworICAgIHJldHVybiBwcDo6VmFyKCk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTR29Ub1BhZ2UpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdLmlzX3N0cmluZygpKSB7CisgICAgICBTY3JvbGxUb1BhZ2UoYXRvaShhcmdzWzBdLkFzU3RyaW5nKCkuY19zdHIoKSkpOworICAgIH0KKyAgICByZXR1cm4gcHA6OlZhcigpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU0FjY2Vzc2liaWxpdHkpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMCkgeworICAgICAgYmFzZTo6RGljdGlvbmFyeVZhbHVlIG5vZGU7CisgICAgICBub2RlLlNldEludGVnZXIoa0FjY2Vzc2libGVOdW1iZXJPZlBhZ2VzLCBlbmdpbmVfLT5HZXROdW1iZXJPZlBhZ2VzKCkpOworICAgICAgbm9kZS5TZXRCb29sZWFuKGtBY2Nlc3NpYmxlTG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50X2xvYWRfc3RhdGVfICE9IExPQURfU1RBVEVfTE9BRElORyk7CisgICAgICBib29sIGhhc19wZXJtaXNzaW9ucyA9CisgICAgICAgICAgZW5naW5lXy0+SGFzUGVybWlzc2lvbihQREZFbmdpbmU6OlBFUk1JU1NJT05fQ09QWSkgfHwKKyAgICAgICAgICBlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9DT1BZX0FDQ0VTU0lCTEUpOworICAgICAgbm9kZS5TZXRCb29sZWFuKGtBY2Nlc3NpYmxlQ29weWFibGUsIGhhc19wZXJtaXNzaW9ucyk7CisgICAgICBzdGQ6OnN0cmluZyBqc29uOworICAgICAgYmFzZTo6SlNPTldyaXRlcjo6V3JpdGUoJm5vZGUsICZqc29uKTsKKyAgICAgIHJldHVybiBwcDo6VmFyKGpzb24pOworICAgIH0gZWxzZSBpZiAoYXJnc1swXS5pc19udW1iZXIoKSkgeworICAgICAgcmV0dXJuIHBwOjpWYXIoZW5naW5lXy0+R2V0UGFnZUFzSlNPTihhcmdzWzBdLkFzSW50KCkpKTsKKyAgICB9CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTUHJpbnRQcmV2aWV3UGFnZUNvdW50KSB7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXS5pc19udW1iZXIoKSkKKyAgICAgIFNldFByaW50UHJldmlld01vZGUoYXJnc1swXS5Bc0ludCgpKTsKKyAgICByZXR1cm4gcHA6OlZhcigpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU0xvYWRQcmV2aWV3UGFnZSkgeworICAgIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0uaXNfc3RyaW5nKCkgJiYgYXJnc1sxXS5pc19udW1iZXIoKSkKKyAgICAgIFByb2Nlc3NQcmV2aWV3UGFnZUluZm8oYXJnc1swXS5Bc1N0cmluZygpLCBhcmdzWzFdLkFzSW50KCkpOworICAgIHJldHVybiBwcDo6VmFyKCk7CisgIH0KKyAgaWYgKG1ldGhvZF9zdHIgPT0ga0pTR2V0UGFnZUxvY2F0aW9uTm9ybWFsaXplZCkgeworICAgIGNvbnN0IHNpemVfdCBrTWF4TGVuZ3RoID0gMzA7CisgICAgY2hhciBsb2NhdGlvbl9pbmZvW2tNYXhMZW5ndGhdOworICAgIGludCBwYWdlX2lkeCA9IGVuZ2luZV8tPkdldE1vc3RWaXNpYmxlUGFnZSgpOworICAgIGlmIChwYWdlX2lkeCA8IDApCisgICAgICByZXR1cm4gcHA6OlZhcihzdGQ6OnN0cmluZygpKTsKKyAgICBwcDo6UmVjdCByZWN0ID0gZW5naW5lXy0+R2V0UGFnZUNvbnRlbnRzUmVjdChwYWdlX2lkeCk7CisgICAgaW50IHZfc2Nyb2xsYmFyX3Jlc2VydmVkX3RoaWNrbmVzcyA9CisgICAgICAgIHZfc2Nyb2xsYmFyXy5nZXQoKSA/IEdldFNjYWxlZChHZXRTY3JvbGxiYXJSZXNlcnZlZFRoaWNrbmVzcygpKSA6IDA7CisKKyAgICByZWN0LnNldF94KHJlY3QueCgpICsgKChwbHVnaW5fc2l6ZV8ud2lkdGgoKSAtCisgICAgICAgIHZfc2Nyb2xsYmFyX3Jlc2VydmVkX3RoaWNrbmVzcyAtIGF2YWlsYWJsZV9hcmVhXy53aWR0aCgpKSAvIDIpKTsKKyAgICBiYXNlOjpzbnByaW50Zihsb2NhdGlvbl9pbmZvLAorICAgICAgICAgICAgICAgICAgIGtNYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIiUwLjRmOyUwLjRmOyUwLjRmOyUwLjRmOyIsCisgICAgICAgICAgICAgICAgICAgcmVjdC54KCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4ocGx1Z2luX3NpemVfLndpZHRoKCkpLAorICAgICAgICAgICAgICAgICAgIHJlY3QueSgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBsdWdpbl9zaXplXy5oZWlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgcmVjdC53aWR0aCgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBsdWdpbl9zaXplXy53aWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCgpLyBzdGF0aWNfY2FzdDxmbG9hdD4ocGx1Z2luX3NpemVfLmhlaWdodCgpKSk7CisgICAgcmV0dXJuIHBwOjpWYXIoc3RkOjpzdHJpbmcobG9jYXRpb25faW5mbykpOworICB9CisgIGlmIChtZXRob2Rfc3RyID09IGtKU1NldFBhZ2VOdW1iZXJzKSB7CisgICAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEgfHwgIWFyZ3NbMF0uaXNfc3RyaW5nKCkpCisgICAgICByZXR1cm4gcHA6OlZhcigpOworICAgIGNvbnN0IGludCBudW1fcGFnZXNfc2lnbmVkID0gZW5naW5lXy0+R2V0TnVtYmVyT2ZQYWdlcygpOworICAgIGlmIChudW1fcGFnZXNfc2lnbmVkIDw9IDApCisgICAgICByZXR1cm4gcHA6OlZhcigpOworICAgIHNjb3BlZF9wdHI8YmFzZTo6TGlzdFZhbHVlPiBwYWdlX3JhbmdlcyhzdGF0aWNfY2FzdDxiYXNlOjpMaXN0VmFsdWUqPigKKyAgICAgICAgYmFzZTo6SlNPTlJlYWRlcjo6UmVhZChhcmdzWzBdLkFzU3RyaW5nKCksIGZhbHNlKSkpOworICAgIGNvbnN0IHNpemVfdCBudW1fcGFnZXMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG51bV9wYWdlc19zaWduZWQpOworICAgIGlmICghcGFnZV9yYW5nZXMuZ2V0KCkgfHwgcGFnZV9yYW5nZXMtPkdldFNpemUoKSAhPSBudW1fcGFnZXMpCisgICAgICByZXR1cm4gcHA6OlZhcigpOworCisgICAgc3RkOjp2ZWN0b3I8aW50PiBwcmludF9wcmV2aWV3X3BhZ2VfbnVtYmVyczsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbnVtX3BhZ2VzOyArK2luZGV4KSB7CisgICAgICBpbnQgcGFnZV9udW1iZXIgPSAwOyAgLy8gfHBhZ2VfbnVtYmVyfCBpcyAxLWJhc2VkLgorICAgICAgaWYgKCFwYWdlX3Jhbmdlcy0+R2V0SW50ZWdlcihpbmRleCwgJnBhZ2VfbnVtYmVyKSB8fCBwYWdlX251bWJlciA8IDEpCisgICAgICAgIHJldHVybiBwcDo6VmFyKCk7CisgICAgICBwcmludF9wcmV2aWV3X3BhZ2VfbnVtYmVycy5wdXNoX2JhY2socGFnZV9udW1iZXIpOworICAgIH0KKyAgICBwcmludF9wcmV2aWV3X3BhZ2VfbnVtYmVyc18gPSBwcmludF9wcmV2aWV3X3BhZ2VfbnVtYmVyczsKKyAgICBwYWdlX2luZGljYXRvcl8uc2V0X2N1cnJlbnRfcGFnZShHZXRQYWdlTnVtYmVyVG9EaXNwbGF5KCkpOworICAgIHJldHVybiBwcDo6VmFyKCk7CisgIH0KKyAgLy8gVGhpcyBpcyBoZXJlIHRvIHdvcmsgYXJvdW5kIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjczNS4KKyAgLy8gSW4gSlMsIGNyZWF0aW5nIGEgc3ludGhldGljIGtleWJvYXJkIGV2ZW50IGFuZCBkaXNwYXRjaGluZyBpdCBhbHdheXMKKyAgLy8gcmVzdWx0IGluIGEga2V5Y29kZSBvZiAwLgorICBpZiAobWV0aG9kX3N0ciA9PSBrSlNTZW5kS2V5RXZlbnQpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdLmlzX251bWJlcigpKSB7CisgICAgICBwcDo6S2V5Ym9hcmRJbnB1dEV2ZW50IGV2ZW50KAorICAgICAgICAgIHRoaXMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGFuY2UKKyAgICAgICAgICBQUF9JTlBVVEVWRU5UX1RZUEVfS0VZRE9XTiwgIC8vIEhhbmRsZUlucHV0RXZlbnQgb25seSBjYXJlIGFib3V0IHRoaXMuCisgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lc3RhbXAsIG5vdCB1c2VkIGZvciBrYmQgZXZlbnRzLgorICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbW9kaWZpZXJzLgorICAgICAgICAgIGFyZ3NbMF0uQXNJbnQoKSwgICAgICAgICAgICAgLy8ga2V5Y29kZS4KKyAgICAgICAgICBwcDo6VmFyKCkpOyAgICAgICAgICAgICAgICAgIC8vIG5vIGNoYXIgdGV4dCBuZWVkZWQuCisgICAgICBIYW5kbGVJbnB1dEV2ZW50KGV2ZW50KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBwOjpWYXIoKTsKK30KKwordm9pZCBJbnN0YW5jZTo6T25HZW9tZXRyeUNoYW5nZWQoZG91YmxlIG9sZF96b29tLCBmbG9hdCBvbGRfZGV2aWNlX3NjYWxlKSB7CisgIGJvb2wgZm9yY2Vfbm9faG9yaXpvbnRhbF9zY3JvbGxiYXIgPSBmYWxzZTsKKyAgaW50IHNjcm9sbGJhcl90aGlja25lc3MgPSBHZXRTY3JvbGxiYXJUaGlja25lc3MoKTsKKworICBpZiAob2xkX2RldmljZV9zY2FsZSAhPSBkZXZpY2Vfc2NhbGVfKSB7CisgICAgLy8gQ2hhbmdlIGluIGRldmljZSBzY2FsZSBmb3JjZXMgdXMgdG8gcmVjcmVhdGUgcmVzb3VyY2VzCisgICAgQ29uZmlndXJlTnVtYmVySW1hZ2VHZW5lcmF0b3IoKTsKKworICAgIENyZWF0ZVRvb2xiYXIoY3VycmVudF90Yl9pbmZvXywgY3VycmVudF90Yl9pbmZvX3NpemVfKTsKKyAgICAvLyBMb2FkIGF1dG9zY3JvbGwgYW5jaG9yIGltYWdlLgorICAgIGF1dG9zY3JvbGxfYW5jaG9yXyA9CisgICAgICAgIENyZWF0ZVJlc291cmNlSW1hZ2UoUFBfUkVTT1VSQ0VJTUFHRV9QREZfUEFOX1NDUk9MTF9JQ09OKTsKKworICAgIENvbmZpZ3VyZVBhZ2VJbmRpY2F0b3IoKTsKKyAgICBDb25maWd1cmVQcm9ncmVzc0JhcigpOworCisgICAgcHA6OlBvaW50IHNjcm9sbF9wb3NpdGlvbiA9IGVuZ2luZV8tPkdldFNjcm9sbFBvc2l0aW9uKCk7CisgICAgU2NhbGVQb2ludChkZXZpY2Vfc2NhbGVfIC8gb2xkX2RldmljZV9zY2FsZSwgJnNjcm9sbF9wb3NpdGlvbik7CisgICAgZW5naW5lXy0+U2V0U2Nyb2xsUG9zaXRpb24oc2Nyb2xsX3Bvc2l0aW9uKTsKKyAgfQorCisgIFVwZGF0ZVpvb21TY2FsZSgpOworICBpZiAoem9vbV8gIT0gb2xkX3pvb20gfHwgZGV2aWNlX3NjYWxlXyAhPSBvbGRfZGV2aWNlX3NjYWxlKQorICAgIGVuZ2luZV8tPlpvb21VcGRhdGVkKHpvb21fICogZGV2aWNlX3NjYWxlXyk7CisgIGlmICh6b29tXyAhPSBvbGRfem9vbSkKKyAgICBab29tQ2hhbmdlZCh6b29tXyk7CisKKyAgYXZhaWxhYmxlX2FyZWFfID0gcHA6OlJlY3QocGx1Z2luX3NpemVfKTsKKyAgaWYgKEdldERvY3VtZW50UGl4ZWxIZWlnaHQoKSA+IHBsdWdpbl9zaXplXy5oZWlnaHQoKSkgeworICAgIENyZWF0ZVZlcnRpY2FsU2Nyb2xsYmFyKCk7CisgIH0gZWxzZSB7CisgICAgRGVzdHJveVZlcnRpY2FsU2Nyb2xsYmFyKCk7CisgIH0KKworICBpbnQgdl9zY3JvbGxiYXJfcmVzZXJ2ZWRfdGhpY2tuZXNzID0KKyAgICAgIHZfc2Nyb2xsYmFyXy5nZXQoKSA/IEdldFNjYWxlZChHZXRTY3JvbGxiYXJSZXNlcnZlZFRoaWNrbmVzcygpKSA6IDA7CisKKyAgaWYgKCFmb3JjZV9ub19ob3Jpem9udGFsX3Njcm9sbGJhciAmJgorICAgICAgR2V0RG9jdW1lbnRQaXhlbFdpZHRoKCkgPgorICAgICAgKHBsdWdpbl9zaXplXy53aWR0aCgpIC0gdl9zY3JvbGxiYXJfcmVzZXJ2ZWRfdGhpY2tuZXNzKSkgeworICAgIENyZWF0ZUhvcml6b250YWxTY3JvbGxiYXIoKTsKKworICAgIC8vIEFkZGluZyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgbm93IG1pZ2h0IGNhdXNlIHVzIHRvIG5lZWQgdmVydGljYWwKKyAgICAvLyBzY3JvbGxiYXJzLgorICAgIGlmIChHZXREb2N1bWVudFBpeGVsSGVpZ2h0KCkgPgorICAgICAgICBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLSBHZXRTY2FsZWQoR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSkpIHsKKyAgICAgIENyZWF0ZVZlcnRpY2FsU2Nyb2xsYmFyKCk7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgRGVzdHJveUhvcml6b250YWxTY3JvbGxiYXIoKTsKKyAgfQorCisjaWZkZWYgRU5BQkxFX1RIVU1CTkFJTFMKKyAgaW50IHRodW1ibmFpbHNfcG9zID0gMCwgdGh1bWJuYWlsc190b3RhbCA9IDA7CisjZW5kaWYKKyAgaWYgKHZfc2Nyb2xsYmFyXy5nZXQoKSkgeworICAgIHZfc2Nyb2xsYmFyXy0+U2V0U2NhbGUoZGV2aWNlX3NjYWxlXyk7CisgICAgYXZhaWxhYmxlX2FyZWFfLnNldF93aWR0aCgKKyAgICAgIHN0ZDo6bWF4KDAsIHBsdWdpbl9zaXplXy53aWR0aCgpIC0gdl9zY3JvbGxiYXJfcmVzZXJ2ZWRfdGhpY2tuZXNzKSk7CisKKyNpZmRlZiBFTkFCTEVfVEhVTUJOQUlMUworICAgIGludCBoZWlnaHQgPSBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCk7CisjZW5kaWYKKyAgICBpbnQgaGVpZ2h0X2RpcCA9IHBsdWdpbl9kaXBfc2l6ZV8uaGVpZ2h0KCk7CisKKyNpZiBkZWZpbmVkKE9TX01BQ09TWCkKKyAgICAvLyBCZWZvcmUgTGlvbiwgTWFjIGFsd2F5cyBoYWQgdGhlIHJlc2l6ZSBhdCB0aGUgYm90dG9tLiBBZnRlciB0aGF0LCBpdAorICAgIC8vIG5ldmVyIGRpZC4KKyAgICBpZiAoKGJhc2U6Om1hYzo6SXNPU1Nub3dMZW9wYXJkKCkgJiYgZnVsbF8pIHx8CisgICAgICAgIChiYXNlOjptYWM6OklzT1NMaW9uT3JMYXRlcigpICYmIGhfc2Nyb2xsYmFyXy5nZXQoKSkpIHsKKyNlbHNlCisgICAgaWYgKGhfc2Nyb2xsYmFyXy5nZXQoKSkgeworI2VuZGlmICAvLyBkZWZpbmVkKE9TX01BQ09TWCkKKyNpZmRlZiBFTkFCTEVfVEhVTUJOQUlMUworICAgICAgaGVpZ2h0IC09IEdldFNjYWxlZChHZXRTY3JvbGxiYXJUaGlja25lc3MoKSk7CisjZW5kaWYKKyAgICAgIGhlaWdodF9kaXAgLT0gR2V0U2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisgICAgfQorI2lmZGVmIEVOQUJMRV9USFVNQk5BSUxTCisgICAgaW50MzIgZG9jX2hlaWdodCA9IEdldERvY3VtZW50UGl4ZWxIZWlnaHQoKTsKKyNlbmRpZgorICAgIGludDMyIGRvY19oZWlnaHRfZGlwID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KEdldERvY3VtZW50UGl4ZWxIZWlnaHQoKSAvIGRldmljZV9zY2FsZV8pOworI2lmIGRlZmluZWQoT1NfTUFDT1NYKQorICAgIC8vIE9uIHRoZSBNYWMgd2UgYWx3YXlzIGFsbG93IHJvb20gZm9yIHRoZSByZXNpemUgYnV0dG9uICh3aG9zZSB3aWR0aCBpcworICAgIC8vIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHNjcm9sbGJhcikgaW4gZnVsbCBtb2RlLiBIb3dldmVyLCBpZiB0aGVyZSBpcyBubworICAgIC8vIG5vIGhvcml6b250YWwgc2Nyb2xsYmFyLCB0aGUgZW5kIG9mIHRoZSBzY3JvbGxiYXIgd2lsbCBzY3JvbGwgcGFzdCB0aGUKKyAgICAvLyBlbmQgb2YgdGhlIGRvY3VtZW50LiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNjcm9sbGJhciBhc3N1bWVzIHRoYXQgaXRzIG93bgorICAgIC8vIGhlaWdodCAoaW4gdGhlIGNhc2Ugb2YgYSB2c2Nyb2xsIGJhcikgaXMgdGhlIHNhbWUgYXMgdGhlIGhlaWdodCBvZiB0aGUKKyAgICAvLyB2aWV3cG9ydC4gU2luY2UgdGhlIHZpZXdwb3J0IGlzIGFjdHVhbGx5IGxhcmdlciwgd2UgY29tcGVuc2F0ZSBieQorICAgIC8vIGFkanVzdGluZyB0aGUgZG9jdW1lbnQgaGVpZ2h0LiBTaW1pbGFyIGxvZ2ljIGFwcGxpZXMgYmVsb3cgZm9yIHRoZQorICAgIC8vIGhvcml6b250YWwgc2Nyb2xsYmFyLgorICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgZG9jdW1lbnQgc2l6ZSBpcyAxMDAwLCBhbmQgdGhlIHZpZXdwb3J0IHNpemUgaXMgMjAwLAorICAgIC8vIHRoZW4gdGhlIHNjcm9sbGJhciBwb3NpdGlvbiBhdCB0aGUgZW5kIHdpbGwgYmUgODAwLiBJbiB0aGlzIGNhc2UgdGhlCisgICAgLy8gdmlld3BvcnQgaXMgYWN0YWxseSAyMTUgKGFzc3VtaW5nIDE1IGFzIHRoZSBzY3JvbGxiYXIgd2lkdGgpIGJ1dCB0aGUKKyAgICAvLyBzY3JvbGxiYXIgdGhpbmtzIGl0IGlzIDIwMC4gV2Ugd2FudCB0aGUgc2Nyb2xsYmFyIHBvc2l0aW9uIGF0IHRoZSBlbmQgdG8KKyAgICAvLyBiZSA3ODUuIE1ha2luZyB0aGUgZG9jdW1lbnQgc2l6ZSA5ODUgYWNoaWV2ZXMgdGhpcy4KKyAgICBpZiAoZnVsbF8gJiYgIWhfc2Nyb2xsYmFyXy5nZXQoKSkgeworI2lmZGVmIEVOQUJMRV9USFVNQk5BSUxTCisgICAgICBkb2NfaGVpZ2h0IC09IEdldFNjYWxlZChHZXRTY3JvbGxiYXJUaGlja25lc3MoKSk7CisjZW5kaWYKKyAgICAgIGRvY19oZWlnaHRfZGlwIC09IEdldFNjcm9sbGJhclRoaWNrbmVzcygpOworICAgIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChPU19NQUNPU1gpCisKKyAgICBpbnQzMiBwb3NpdGlvbjsKKyAgICBwb3NpdGlvbiA9IHZfc2Nyb2xsYmFyXy0+R2V0VmFsdWUoKTsKKyAgICBwb3NpdGlvbiA9IHN0YXRpY19jYXN0PGludD4ocG9zaXRpb24gKiB6b29tXyAvIG9sZF96b29tKTsKKyAgICB2YWxpZF92X3JhbmdlXyA9IGRvY19oZWlnaHRfZGlwIC0gaGVpZ2h0X2RpcDsKKyAgICBpZiAocG9zaXRpb24gPiB2YWxpZF92X3JhbmdlXykKKyAgICAgIHBvc2l0aW9uID0gdmFsaWRfdl9yYW5nZV87CisKKyAgICB2X3Njcm9sbGJhcl8tPlNldFZhbHVlKHBvc2l0aW9uKTsKKworICAgIFBQX1JlY3QgbG9jOworICAgIGxvYy5wb2ludC54ID0gc3RhdGljX2Nhc3Q8aW50PihhdmFpbGFibGVfYXJlYV8ucmlnaHQoKSAvIGRldmljZV9zY2FsZV8pOworICAgIGlmIChJc092ZXJsYXlTY3JvbGxiYXIoKSkKKyAgICAgIGxvYy5wb2ludC54IC09IHNjcm9sbGJhcl90aGlja25lc3M7CisgICAgbG9jLnBvaW50LnkgPSAwOworICAgIGxvYy5zaXplLndpZHRoID0gc2Nyb2xsYmFyX3RoaWNrbmVzczsKKyAgICBsb2Muc2l6ZS5oZWlnaHQgPSBoZWlnaHRfZGlwOworICAgIHZfc2Nyb2xsYmFyXy0+U2V0TG9jYXRpb24obG9jKTsKKyAgICB2X3Njcm9sbGJhcl8tPlNldERvY3VtZW50U2l6ZShkb2NfaGVpZ2h0X2RpcCk7CisKKyNpZmRlZiBFTkFCTEVfVEhVTUJOQUlMUworICAgIHRodW1ibmFpbHNfcG9zID0gcG9zaXRpb247CisgICAgdGh1bWJuYWlsc190b3RhbCA9IGRvY19oZWlnaHQgLSBoZWlnaHQ7CisjZW5kaWYKKyAgfQorCisgIGlmIChoX3Njcm9sbGJhcl8uZ2V0KCkpIHsKKyAgICBoX3Njcm9sbGJhcl8tPlNldFNjYWxlKGRldmljZV9zY2FsZV8pOworICAgIGF2YWlsYWJsZV9hcmVhXy5zZXRfaGVpZ2h0KAorICAgICAgICBzdGQ6Om1heCgwLCBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLQorICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZWQoR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSkpKTsKKworICAgIGludCB3aWR0aF9kaXAgPSBwbHVnaW5fZGlwX3NpemVfLndpZHRoKCk7CisKKyAgICAvLyBTZWUgbm90ZSBhYm92ZS4KKyNpZiBkZWZpbmVkKE9TX01BQ09TWCkKKyAgICBpZiAoKGJhc2U6Om1hYzo6SXNPU1Nub3dMZW9wYXJkKCkgJiYgZnVsbF8pIHx8CisgICAgICAgIChiYXNlOjptYWM6OklzT1NMaW9uT3JMYXRlcigpICYmIHZfc2Nyb2xsYmFyXy5nZXQoKSkpIHsKKyNlbHNlCisgICAgaWYgKHZfc2Nyb2xsYmFyXy5nZXQoKSkgeworI2VuZGlmCisgICAgICB3aWR0aF9kaXAgLT0gR2V0U2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisgICAgfQorICAgIGludDMyIGRvY193aWR0aF9kaXAgPQorICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMj4oR2V0RG9jdW1lbnRQaXhlbFdpZHRoKCkgLyBkZXZpY2Vfc2NhbGVfKTsKKyNpZiBkZWZpbmVkKE9TX01BQ09TWCkKKyAgICAvLyBTZWUgY29tbWVudCBpbiB0aGUgYWJvdmUgaWYgKHZfc2Nyb2xsYmFyXy5nZXQoKSkgYmxvY2suCisgICAgaWYgKGZ1bGxfICYmICF2X3Njcm9sbGJhcl8uZ2V0KCkpCisgICAgICBkb2Nfd2lkdGhfZGlwIC09IEdldFNjcm9sbGJhclRoaWNrbmVzcygpOworI2VuZGlmICAvLyBkZWZpbmVkKE9TX01BQ09TWCkKKworICAgIGludDMyIHBvc2l0aW9uOworICAgIHBvc2l0aW9uID0gaF9zY3JvbGxiYXJfLT5HZXRWYWx1ZSgpOworICAgIHBvc2l0aW9uID0gc3RhdGljX2Nhc3Q8aW50Pihwb3NpdGlvbiAqIHpvb21fIC8gb2xkX3pvb20pOworICAgIHBvc2l0aW9uID0gc3RkOjptaW4ocG9zaXRpb24sIGRvY193aWR0aF9kaXAgLSB3aWR0aF9kaXApOworCisgICAgaF9zY3JvbGxiYXJfLT5TZXRWYWx1ZShwb3NpdGlvbik7CisKKyAgICBQUF9SZWN0IGxvYzsKKyAgICBsb2MucG9pbnQueCA9IDA7CisgICAgbG9jLnBvaW50LnkgPSBzdGF0aWNfY2FzdDxpbnQ+KGF2YWlsYWJsZV9hcmVhXy5ib3R0b20oKSAvIGRldmljZV9zY2FsZV8pOworICAgIGlmIChJc092ZXJsYXlTY3JvbGxiYXIoKSkKKyAgICAgIGxvYy5wb2ludC55IC09IHNjcm9sbGJhcl90aGlja25lc3M7CisgICAgbG9jLnNpemUud2lkdGggPSB3aWR0aF9kaXA7CisgICAgbG9jLnNpemUuaGVpZ2h0ID0gc2Nyb2xsYmFyX3RoaWNrbmVzczsKKyAgICBoX3Njcm9sbGJhcl8tPlNldExvY2F0aW9uKGxvYyk7CisgICAgaF9zY3JvbGxiYXJfLT5TZXREb2N1bWVudFNpemUoZG9jX3dpZHRoX2RpcCk7CisgIH0KKworICBpbnQgZG9jX3dpZHRoID0gR2V0RG9jdW1lbnRQaXhlbFdpZHRoKCk7CisgIGlmIChkb2Nfd2lkdGggPCBhdmFpbGFibGVfYXJlYV8ud2lkdGgoKSkgeworICAgIGF2YWlsYWJsZV9hcmVhXy5PZmZzZXQoKGF2YWlsYWJsZV9hcmVhXy53aWR0aCgpIC0gZG9jX3dpZHRoKSAvIDIsIDApOworICAgIGF2YWlsYWJsZV9hcmVhXy5zZXRfd2lkdGgoZG9jX3dpZHRoKTsKKyAgfQorICBpbnQgZG9jX2hlaWdodCA9IEdldERvY3VtZW50UGl4ZWxIZWlnaHQoKTsKKyAgaWYgKGRvY19oZWlnaHQgPCBhdmFpbGFibGVfYXJlYV8uaGVpZ2h0KCkpIHsKKyAgICBhdmFpbGFibGVfYXJlYV8uc2V0X2hlaWdodChkb2NfaGVpZ2h0KTsKKyAgfQorCisgIC8vIFdlJ2xsIGludmFsaWRhdGUgdGhlIGVudGlyZSBwbHVnaW4gYW55d2F5cy4KKyAgVXBkYXRlVG9vbGJhclBvc2l0aW9uKGZhbHNlKTsKKyAgVXBkYXRlUHJvZ3Jlc3NCYXJQb3NpdGlvbihmYWxzZSk7CisgIFVwZGF0ZVBhZ2VJbmRpY2F0b3JQb3NpdGlvbihmYWxzZSk7CisKKyNpZmRlZiBFTkFCTEVfVEhVTUJOQUlMUworICAvLyBVcGRhdGUgdGh1bWJuYWlsIGNvbnRyb2wgcG9zaXRpb24uCisgIHRodW1ibmFpbHNfLlNldFBvc2l0aW9uKHRodW1ibmFpbHNfcG9zLCB0aHVtYm5haWxzX3RvdGFsLCBmYWxzZSk7CisgIHBwOjpSZWN0IHRodW1ibmFpbHNfcmMocGx1Z2luX3NpemVfLndpZHRoKCkgLSBHZXRTY2FsZWQoa1RodW1ibmFpbHNXaWR0aCksIDAsCisgICAgR2V0U2NhbGVkKGtUaHVtYm5haWxzV2lkdGgpLCBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkpOworICBpZiAodl9zY3JvbGxiYXJfLmdldCgpKQorICAgIHRodW1ibmFpbHNfcmMuT2Zmc2V0KC12X3Njcm9sbGJhcl9yZXNlcnZlZF90aGlja25lc3MsIDApOworICBpZiAoaF9zY3JvbGxiYXJfLmdldCgpKQorICAgIHRodW1ibmFpbHNfcmMuSW5zZXQoMCwgMCwgMCwgdl9zY3JvbGxiYXJfcmVzZXJ2ZWRfdGhpY2tuZXNzKTsKKyAgdGh1bWJuYWlsc18uU2V0UmVjdCh0aHVtYm5haWxzX3JjLCBmYWxzZSk7CisjZW5kaWYKKworICBDYWxjdWxhdGVCYWNrZ3JvdW5kUGFydHMoKTsKKyAgZW5naW5lXy0+UGFnZU9mZnNldFVwZGF0ZWQoYXZhaWxhYmxlX2FyZWFfLnBvaW50KCkpOworICBlbmdpbmVfLT5QbHVnaW5TaXplVXBkYXRlZChhdmFpbGFibGVfYXJlYV8uc2l6ZSgpKTsKKworICBpZiAoIWRvY3VtZW50X3NpemVfLkdldEFyZWEoKSkKKyAgICByZXR1cm47CisgIHBhaW50X21hbmFnZXJfLkludmFsaWRhdGVSZWN0KHBwOjpSZWN0KHBwOjpQb2ludCgpLCBwbHVnaW5fc2l6ZV8pKTsKKworICAvLyBSdW4gdGhlIHBsdWdpbiBzaXplIGNoYW5nZSBjYWxsYmFjayBhc3luY2hyb25vdXNseS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgLy8gaW52b2tlZCBieSBhIGxheW91dCBjaGFuZ2Ugd2hpY2ggc2hvdWxkIG5vdCByZS1lbnRlciBpbnRvIEpTIHN5bmNocm9ub3VzbHkuCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgY2FsbGJhY2tfZmFjdG9yeV8uTmV3Q2FsbGJhY2soJkluc3RhbmNlOjpSdW5DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3BsdWdpbl9zaXplX2NoYW5nZWRfY2FsbGJhY2tfKTsKKyAgcHA6Ok1vZHVsZTo6R2V0KCktPmNvcmUoKS0+Q2FsbE9uTWFpblRocmVhZCgwLCBjYWxsYmFjayk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlJ1bkNhbGxiYWNrKGludDMyX3QsIHBwOjpWYXIgY2FsbGJhY2spIHsKKyAgaWYgKGNhbGxiYWNrLmlzX3N0cmluZygpKQorICAgIEV4ZWN1dGVTY3JpcHQoY2FsbGJhY2spOworfQorCit2b2lkIEluc3RhbmNlOjpDcmVhdGVIb3Jpem9udGFsU2Nyb2xsYmFyKCkgeworICBpZiAoaF9zY3JvbGxiYXJfLmdldCgpKQorICAgIHJldHVybjsKKworICBoX3Njcm9sbGJhcl8ucmVzZXQobmV3IHBwOjpTY3JvbGxiYXJfRGV2KHRoaXMsIGZhbHNlKSk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkNyZWF0ZVZlcnRpY2FsU2Nyb2xsYmFyKCkgeworICBpZiAodl9zY3JvbGxiYXJfLmdldCgpKQorICAgIHJldHVybjsKKworICB2X3Njcm9sbGJhcl8ucmVzZXQobmV3IHBwOjpTY3JvbGxiYXJfRGV2KHRoaXMsIHRydWUpKTsKK30KKwordm9pZCBJbnN0YW5jZTo6RGVzdHJveUhvcml6b250YWxTY3JvbGxiYXIoKSB7CisgIGlmICghaF9zY3JvbGxiYXJfLmdldCgpKQorICAgIHJldHVybjsKKyAgaWYgKGhfc2Nyb2xsYmFyXy0+R2V0VmFsdWUoKSkKKyAgICBlbmdpbmVfLT5TY3JvbGxlZFRvWFBvc2l0aW9uKDApOworICBoX3Njcm9sbGJhcl8ucmVzZXQoKTsKK30KKwordm9pZCBJbnN0YW5jZTo6RGVzdHJveVZlcnRpY2FsU2Nyb2xsYmFyKCkgeworICBpZiAoIXZfc2Nyb2xsYmFyXy5nZXQoKSkKKyAgICByZXR1cm47CisgIGlmICh2X3Njcm9sbGJhcl8tPkdldFZhbHVlKCkpCisgICAgZW5naW5lXy0+U2Nyb2xsZWRUb1lQb3NpdGlvbigwKTsKKyAgdl9zY3JvbGxiYXJfLnJlc2V0KCk7CisgIHBhZ2VfaW5kaWNhdG9yXy5TaG93KGZhbHNlLCB0cnVlKTsKK30KKworaW50IEluc3RhbmNlOjpHZXRTY3JvbGxiYXJUaGlja25lc3MoKSB7CisgIGlmIChzY3JvbGxiYXJfdGhpY2tuZXNzXyA9PSAtMSkgeworICAgIHBwOjpTY3JvbGxiYXJfRGV2IHRlbXBfc2Nyb2xsYmFyKHRoaXMsIGZhbHNlKTsKKyAgICBzY3JvbGxiYXJfdGhpY2tuZXNzXyA9IHRlbXBfc2Nyb2xsYmFyLkdldFRoaWNrbmVzcygpOworICAgIHNjcm9sbGJhcl9yZXNlcnZlZF90aGlja25lc3NfID0KKyAgICAgIHRlbXBfc2Nyb2xsYmFyLklzT3ZlcmxheSgpID8gMCA6IHNjcm9sbGJhcl90aGlja25lc3NfOworICB9CisKKyAgcmV0dXJuIHNjcm9sbGJhcl90aGlja25lc3NfOworfQorCitpbnQgSW5zdGFuY2U6OkdldFNjcm9sbGJhclJlc2VydmVkVGhpY2tuZXNzKCkgeworICBHZXRTY3JvbGxiYXJUaGlja25lc3MoKTsKKyAgcmV0dXJuIHNjcm9sbGJhcl9yZXNlcnZlZF90aGlja25lc3NfOworfQorCitib29sIEluc3RhbmNlOjpJc092ZXJsYXlTY3JvbGxiYXIoKSB7CisgIHJldHVybiBHZXRTY3JvbGxiYXJSZXNlcnZlZFRoaWNrbmVzcygpID09IDA7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkNyZWF0ZVRvb2xiYXIoY29uc3QgVG9vbGJhckJ1dHRvbkluZm8qIHRiX2luZm8sIHNpemVfdCBzaXplKSB7CisgIHRvb2xiYXJfLnJlc2V0KG5ldyBGYWRpbmdDb250cm9scygpKTsKKworICBEQ0hFQ0sodGJfaW5mbyk7CisgIERDSEVDSyhzaXplID49IDApOworCisgIC8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IHRvb2xiYXIgaW5mb3JtYXRpb24gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlY3JlYXRlIHRoZQorICAvLyBpbWFnZXMgbGF0ZXIuCisgIGN1cnJlbnRfdGJfaW5mb18gPSB0Yl9pbmZvOworICBjdXJyZW50X3RiX2luZm9fc2l6ZV8gPSBzaXplOworCisgIGludCBtYXhfaGVpZ2h0ID0gMDsKKyAgcHA6OlBvaW50IG9yaWdpbihrVG9vbGJhckZhZGluZ09mZnNldExlZnQsIGtUb29sYmFyRmFkaW5nT2Zmc2V0VG9wKTsKKyAgU2NhbGVQb2ludChkZXZpY2Vfc2NhbGVfLCAmb3JpZ2luKTsKKworICBzdGQ6Omxpc3Q8QnV0dG9uKj4gYnV0dG9uczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBCdXR0b24qIGJ0biA9IG5ldyBCdXR0b247CisgICAgcHA6OkltYWdlRGF0YSBub3JtYWxfZmFjZSA9CisgICAgICAgIENyZWF0ZVJlc291cmNlSW1hZ2UodGJfaW5mb1tpXS5ub3JtYWwpOworICAgIGJ0bi0+Q3JlYXRlQnV0dG9uKHRiX2luZm9baV0uaWQsCisgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhcl8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgdGJfaW5mb1tpXS5zdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBub3JtYWxfZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZXNvdXJjZUltYWdlKHRiX2luZm9baV0uaGlnaGxpZ2h0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlc291cmNlSW1hZ2UodGJfaW5mb1tpXS5wcmVzc2VkKSk7CisgICAgYnV0dG9ucy5wdXNoX2JhY2soYnRuKTsKKworICAgIG9yaWdpbiArPSBwcDo6UG9pbnQobm9ybWFsX2ZhY2Uuc2l6ZSgpLndpZHRoKCksIDApOworICAgIG1heF9oZWlnaHQgPSBzdGQ6Om1heChtYXhfaGVpZ2h0LCBub3JtYWxfZmFjZS5zaXplKCkuaGVpZ2h0KCkpOworICB9CisKKyAgcHA6OlJlY3QgcmNfdG9vbGJhcigwLCAwLAorICAgICAgb3JpZ2luLngoKSArIEdldFRvb2xiYXJSaWdodE9mZnNldCgpLAorICAgICAgb3JpZ2luLnkoKSArIG1heF9oZWlnaHQgKyBHZXRUb29sYmFyQm90dG9tT2Zmc2V0KCkpOworICB0b29sYmFyXy0+Q3JlYXRlRmFkaW5nQ29udHJvbHMoCisgICAgICBrVG9vbGJhcklkLCByY190b29sYmFyLCBmYWxzZSwgdGhpcywga1RyYW5zcGFyZW50QWxwaGEpOworCisgIHN0ZDo6bGlzdDxCdXR0b24qPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gYnV0dG9ucy5iZWdpbigpOyBpdGVyICE9IGJ1dHRvbnMuZW5kKCk7ICsraXRlcikgeworICAgIHRvb2xiYXJfLT5BZGRDb250cm9sKCppdGVyKTsKKyAgfQorfQorCitpbnQgSW5zdGFuY2U6OkdldFRvb2xiYXJSaWdodE9mZnNldCgpIHsKKyAgaW50IHNjcm9sbGJhcl90aGlja25lc3MgPSBHZXRTY3JvbGxiYXJUaGlja25lc3MoKTsKKyAgcmV0dXJuIEdldFNjYWxlZChrVG9vbGJhckZhZGluZ09mZnNldFJpZ2h0KSArIDIgKiBzY3JvbGxiYXJfdGhpY2tuZXNzOworfQorCitpbnQgSW5zdGFuY2U6OkdldFRvb2xiYXJCb3R0b21PZmZzZXQoKSB7CisgIGludCBzY3JvbGxiYXJfdGhpY2tuZXNzID0gR2V0U2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisgIHJldHVybiBHZXRTY2FsZWQoa1Rvb2xiYXJGYWRpbmdPZmZzZXRCb3R0b20pICsgc2Nyb2xsYmFyX3RoaWNrbmVzczsKK30KKworc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4gSW5zdGFuY2U6OkdldFRodW1ibmFpbFJlc291cmNlcygpIHsKKyAgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4gbnVtX2ltYWdlcygxMCk7CisgIG51bV9pbWFnZXNbMF0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfMCk7CisgIG51bV9pbWFnZXNbMV0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfMSk7CisgIG51bV9pbWFnZXNbMl0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfMik7CisgIG51bV9pbWFnZXNbM10gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfMyk7CisgIG51bV9pbWFnZXNbNF0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfNCk7CisgIG51bV9pbWFnZXNbNV0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfNSk7CisgIG51bV9pbWFnZXNbNl0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfNik7CisgIG51bV9pbWFnZXNbN10gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfNyk7CisgIG51bV9pbWFnZXNbOF0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfOCk7CisgIG51bV9pbWFnZXNbOV0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX0JVVFRPTl9USFVNQk5BSUxfOSk7CisgIHJldHVybiBudW1faW1hZ2VzOworfQorCitzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiBJbnN0YW5jZTo6R2V0UHJvZ3Jlc3NCYXJSZXNvdXJjZXMoCisgICAgcHA6OkltYWdlRGF0YSogYmFja2dyb3VuZCkgeworICBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiByZXN1bHQoOSk7CisgIHJlc3VsdFswXSA9IENyZWF0ZVJlc291cmNlSW1hZ2UoUFBfUkVTT1VSQ0VJTUFHRV9QREZfUFJPR1JFU1NfQkFSXzApOworICByZXN1bHRbMV0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX1BST0dSRVNTX0JBUl8xKTsKKyAgcmVzdWx0WzJdID0gQ3JlYXRlUmVzb3VyY2VJbWFnZShQUF9SRVNPVVJDRUlNQUdFX1BERl9QUk9HUkVTU19CQVJfMik7CisgIHJlc3VsdFszXSA9IENyZWF0ZVJlc291cmNlSW1hZ2UoUFBfUkVTT1VSQ0VJTUFHRV9QREZfUFJPR1JFU1NfQkFSXzMpOworICByZXN1bHRbNF0gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX1BST0dSRVNTX0JBUl80KTsKKyAgcmVzdWx0WzVdID0gQ3JlYXRlUmVzb3VyY2VJbWFnZShQUF9SRVNPVVJDRUlNQUdFX1BERl9QUk9HUkVTU19CQVJfNSk7CisgIHJlc3VsdFs2XSA9IENyZWF0ZVJlc291cmNlSW1hZ2UoUFBfUkVTT1VSQ0VJTUFHRV9QREZfUFJPR1JFU1NfQkFSXzYpOworICByZXN1bHRbN10gPSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1JFU09VUkNFSU1BR0VfUERGX1BST0dSRVNTX0JBUl83KTsKKyAgcmVzdWx0WzhdID0gQ3JlYXRlUmVzb3VyY2VJbWFnZShQUF9SRVNPVVJDRUlNQUdFX1BERl9QUk9HUkVTU19CQVJfOCk7CisgICpiYWNrZ3JvdW5kID0gQ3JlYXRlUmVzb3VyY2VJbWFnZSgKKyAgICAgIFBQX1JFU09VUkNFSU1BR0VfUERGX1BST0dSRVNTX0JBUl9CQUNLR1JPVU5EKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBJbnN0YW5jZTo6Q3JlYXRlUGFnZUluZGljYXRvcihib29sIGFsd2F5c192aXNpYmxlKSB7CisgIHBhZ2VfaW5kaWNhdG9yXy5DcmVhdGVQYWdlSW5kaWNhdG9yKGtQYWdlSW5kaWNhdG9ySWQsIGZhbHNlLCB0aGlzLAorICAgICAgbnVtYmVyX2ltYWdlX2dlbmVyYXRvcigpLCBhbHdheXNfdmlzaWJsZSk7CisgIENvbmZpZ3VyZVBhZ2VJbmRpY2F0b3IoKTsKK30KKwordm9pZCBJbnN0YW5jZTo6Q29uZmlndXJlUGFnZUluZGljYXRvcigpIHsKKyAgcHA6OkltYWdlRGF0YSBiYWNrZ3JvdW5kID0KKyAgICAgIENyZWF0ZVJlc291cmNlSW1hZ2UoUFBfUkVTT1VSQ0VJTUFHRV9QREZfUEFHRV9JTkRJQ0FUT1JfQkFDS0dST1VORCk7CisgIHBhZ2VfaW5kaWNhdG9yXy5Db25maWd1cmUocHA6OlBvaW50KCksIGJhY2tncm91bmQpOworfQorCit2b2lkIEluc3RhbmNlOjpDcmVhdGVQcm9ncmVzc0JhcigpIHsKKyAgcHA6OkltYWdlRGF0YSBiYWNrZ3JvdW5kOworICBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiBpbWFnZXMgPSBHZXRQcm9ncmVzc0JhclJlc291cmNlcygmYmFja2dyb3VuZCk7CisgIHN0ZDo6c3RyaW5nIHRleHQgPSBHZXRMb2NhbGl6ZWRTdHJpbmcoUFBfUkVTT1VSQ0VTVFJJTkdfUERGUFJPR1JFU1NMT0FESU5HKTsKKyAgcHJvZ3Jlc3NfYmFyXy5DcmVhdGVQcm9ncmVzc0NvbnRyb2woa1Byb2dyZXNzQmFySWQsIGZhbHNlLCB0aGlzLCAwLjAsCisgICAgICBkZXZpY2Vfc2NhbGVfLCBpbWFnZXMsIGJhY2tncm91bmQsIHRleHQpOworfQorCit2b2lkIEluc3RhbmNlOjpDb25maWd1cmVQcm9ncmVzc0JhcigpIHsKKyAgcHA6OkltYWdlRGF0YSBiYWNrZ3JvdW5kOworICBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiBpbWFnZXMgPSBHZXRQcm9ncmVzc0JhclJlc291cmNlcygmYmFja2dyb3VuZCk7CisgIHByb2dyZXNzX2Jhcl8uUmVjb25maWd1cmUoYmFja2dyb3VuZCwgaW1hZ2VzLCBkZXZpY2Vfc2NhbGVfKTsKK30KKwordm9pZCBJbnN0YW5jZTo6Q3JlYXRlVGh1bWJuYWlscygpIHsKKyAgdGh1bWJuYWlsc18uQ3JlYXRlVGh1bWJuYWlsQ29udHJvbCgKKyAgICAgIGtUaHVtYm5haWxzSWQsIHBwOjpSZWN0KCksIGZhbHNlLCB0aGlzLCBlbmdpbmVfLmdldCgpLAorICAgICAgbnVtYmVyX2ltYWdlX2dlbmVyYXRvcigpKTsKK30KKwordm9pZCBJbnN0YW5jZTo6TG9hZFVybChjb25zdCBzdGQ6OnN0cmluZyYgdXJsKSB7CisgIExvYWRVcmxJbnRlcm5hbCh1cmwsICZlbWJlZF9sb2FkZXJfLCAmSW5zdGFuY2U6OkRpZE9wZW4pOworfQorCit2b2lkIEluc3RhbmNlOjpMb2FkUHJldmlld1VybChjb25zdCBzdGQ6OnN0cmluZyYgdXJsKSB7CisgIExvYWRVcmxJbnRlcm5hbCh1cmwsICZlbWJlZF9wcmV2aWV3X2xvYWRlcl8sICZJbnN0YW5jZTo6RGlkT3BlblByZXZpZXcpOworfQorCit2b2lkIEluc3RhbmNlOjpMb2FkVXJsSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwgcHA6OlVSTExvYWRlciogbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKEluc3RhbmNlOjoqIG1ldGhvZCkoaW50MzJfdCkpIHsKKyAgcHA6OlVSTFJlcXVlc3RJbmZvIHJlcXVlc3QodGhpcyk7CisgIHJlcXVlc3QuU2V0VVJMKHVybCk7CisgIHJlcXVlc3QuU2V0TWV0aG9kKCJHRVQiKTsKKworICAqbG9hZGVyID0gQ3JlYXRlVVJMTG9hZGVySW50ZXJuYWwoKTsKKyAgcHA6OkNvbXBsZXRpb25DYWxsYmFjayBjYWxsYmFjayA9IGxvYWRlcl9mYWN0b3J5Xy5OZXdDYWxsYmFjayhtZXRob2QpOworICBpbnQgcnYgPSBsb2FkZXItPk9wZW4ocmVxdWVzdCwgY2FsbGJhY2spOworICBpZiAocnYgIT0gUFBfT0tfQ09NUExFVElPTlBFTkRJTkcpCisgICAgY2FsbGJhY2suUnVuKHJ2KTsKK30KKworcHA6OlVSTExvYWRlciBJbnN0YW5jZTo6Q3JlYXRlVVJMTG9hZGVySW50ZXJuYWwoKSB7CisgIHBwOjpVUkxMb2FkZXIgbG9hZGVyKHRoaXMpOworCisgIGNvbnN0IFBQQl9VUkxMb2FkZXJUcnVzdGVkKiB0cnVzdGVkX2ludGVyZmFjZSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFBQQl9VUkxMb2FkZXJUcnVzdGVkKj4oCisgICAgICAgICAgcHA6Ok1vZHVsZTo6R2V0KCktPkdldEJyb3dzZXJJbnRlcmZhY2UoCisgICAgICAgICAgICAgIFBQQl9VUkxMT0FERVJUUlVTVEVEX0lOVEVSRkFDRSkpOworICBpZiAodHJ1c3RlZF9pbnRlcmZhY2UpCisgICAgdHJ1c3RlZF9pbnRlcmZhY2UtPkdyYW50VW5pdmVyc2FsQWNjZXNzKGxvYWRlci5wcF9yZXNvdXJjZSgpKTsKKyAgcmV0dXJuIGxvYWRlcjsKK30KKworaW50IEluc3RhbmNlOjpHZXRJbml0aWFsUGFnZShjb25zdCBzdGQ6OnN0cmluZyYgdXJsKSB7CisgIHNpemVfdCBmb3VuZF9pZHggPSB1cmwuZmluZCgnIycpOworICBpZiAoZm91bmRfaWR4ID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHJldHVybiAtMTsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgcmVmID0gdXJsLnN1YnN0cihmb3VuZF9pZHggKyAxKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZyYWdtZW50czsKKyAgVG9rZW5pemUocmVmLCBrRGVsaW1pdGVycywgJmZyYWdtZW50cyk7CisKKyAgLy8gUGFnZSBudW1iZXIgdG8gcmV0dXJuLCB6ZXJvLWJhc2VkLgorICBpbnQgcGFnZSA9IC0xOworCisgIC8vIEhhbmRsZSB0aGUgY2FzZSBvZiBodHRwOi8vZm9vLmNvbS9iYXIjTkFNRURERVNULiBUaGlzIGlzIG5vdCBleHBsaWNpdGx5CisgIC8vIG1lbnRpb25lZCBleGNlcHQgYnkgZXhhbXBsZSBpbiB0aGUgQWRvYmUgIlBERiBPcGVuIFBhcmFtZXRlcnMiIGRvY3VtZW50LgorICBpZiAoKGZyYWdtZW50cy5zaXplKCkgPT0gMSkgJiYgKGZyYWdtZW50c1swXS5maW5kKCc9JykgPT0gc3RkOjpzdHJpbmc6Om5wb3MpKQorICAgIHJldHVybiBlbmdpbmVfLT5HZXROYW1lZERlc3RpbmF0aW9uUGFnZShmcmFnbWVudHNbMF0pOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhZ21lbnRzLnNpemUoKTsgKytpKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGtleV92YWx1ZTsKKyAgICBiYXNlOjpTcGxpdFN0cmluZyhmcmFnbWVudHNbaV0sICc9JywgJmtleV92YWx1ZSk7CisgICAgaWYgKGtleV92YWx1ZS5zaXplKCkgIT0gMikKKyAgICAgIGNvbnRpbnVlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkgPSBrZXlfdmFsdWVbMF07CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlID0ga2V5X3ZhbHVlWzFdOworCisgICAgaWYgKGJhc2U6OnN0cmNhc2VjbXAoa1BhZ2UsIGtleS5jX3N0cigpKSA9PSAwKSB7CisgICAgICAvLyB8cGFnZV92YWx1ZXwgaXMgMS1iYXNlZC4KKyAgICAgIGludCBwYWdlX3ZhbHVlID0gLTE7CisgICAgICBpZiAoYmFzZTo6U3RyaW5nVG9JbnQodmFsdWUsICZwYWdlX3ZhbHVlKSAmJiBwYWdlX3ZhbHVlID4gMCkKKyAgICAgICAgcGFnZSA9IHBhZ2VfdmFsdWUgLSAxOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChiYXNlOjpzdHJjYXNlY21wKGtOYW1lZERlc3QsIGtleS5jX3N0cigpKSA9PSAwKSB7CisgICAgICAvLyB8cGFnZV92YWx1ZXwgaXMgMC1iYXNlZC4KKyAgICAgIGludCBwYWdlX3ZhbHVlID0gZW5naW5lXy0+R2V0TmFtZWREZXN0aW5hdGlvblBhZ2UodmFsdWUpOworICAgICAgaWYgKHBhZ2VfdmFsdWUgPj0gMCkKKyAgICAgICAgcGFnZSA9IHBhZ2VfdmFsdWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBhZ2U7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlVwZGF0ZVRvb2xiYXJQb3NpdGlvbihib29sIGludmFsaWRhdGUpIHsKKyAgcHA6OlJlY3QgY3RybF9yYyA9IHRvb2xiYXJfLT5HZXRDb250cm9sc1JlY3QoKTsKKyAgaW50IG1pbl90b29sYmFyX3dpZHRoID0gY3RybF9yYy53aWR0aCgpICsgR2V0VG9vbGJhclJpZ2h0T2Zmc2V0KCkgKworICAgICAgR2V0U2NhbGVkKGtUb29sYmFyRmFkaW5nT2Zmc2V0TGVmdCk7CisgIGludCBtaW5fdG9vbGJhcl9oZWlnaHQgPSBjdHJsX3JjLndpZHRoKCkgKyBHZXRUb29sYmFyQm90dG9tT2Zmc2V0KCkgKworICAgICAgR2V0U2NhbGVkKGtUb29sYmFyRmFkaW5nT2Zmc2V0Qm90dG9tKTsKKworICAvLyBVcGRhdGUgdG9vbGJhciBwb3NpdGlvbgorICBpZiAocGx1Z2luX3NpemVfLndpZHRoKCkgPCBtaW5fdG9vbGJhcl93aWR0aCB8fAorICAgICAgcGx1Z2luX3NpemVfLmhlaWdodCgpIDwgbWluX3Rvb2xiYXJfaGVpZ2h0KSB7CisgICAgLy8gRGlzYWJsZSB0b29sYmFyIGlmIGl0IGRvZXMgbm90IGZpdCBvbiB0aGUgc2NyZWVuLgorICAgIHRvb2xiYXJfLT5TaG93KGZhbHNlLCBpbnZhbGlkYXRlKTsKKyAgfSBlbHNlIHsKKyAgICBwcDo6UG9pbnQgb2Zmc2V0KAorICAgICAgICBwbHVnaW5fc2l6ZV8ud2lkdGgoKSAtIEdldFRvb2xiYXJSaWdodE9mZnNldCgpIC0gY3RybF9yYy5yaWdodCgpLAorICAgICAgICBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLSBHZXRUb29sYmFyQm90dG9tT2Zmc2V0KCkgLSBjdHJsX3JjLmJvdHRvbSgpKTsKKyAgICB0b29sYmFyXy0+TW92ZUJ5KG9mZnNldCwgaW52YWxpZGF0ZSk7CisKKyAgICBpbnQgdG9vbGJhcl93aWR0aCA9IHN0ZDo6bWF4KHBsdWdpbl9zaXplXy53aWR0aCgpIC8gMiwgbWluX3Rvb2xiYXJfd2lkdGgpOworICAgIHRvb2xiYXJfLT5FeHBhbmRMZWZ0KHRvb2xiYXJfd2lkdGggLSB0b29sYmFyXy0+cmVjdCgpLndpZHRoKCkpOworICAgIHRvb2xiYXJfLT5TaG93KHBhaW50ZWRfZmlyc3RfcGFnZV8sIGludmFsaWRhdGUpOworICB9Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlVwZGF0ZVByb2dyZXNzQmFyUG9zaXRpb24oYm9vbCBpbnZhbGlkYXRlKSB7CisgIC8vIFRPRE8oZ2VuZSk6IHZlcmlmeSB3ZSBkb24ndCBvdmVybGFwIHdpdGggdG9vbGJhci4KKyAgaW50IHNjcm9sbGJhcl90aGlja25lc3MgPSBHZXRTY3JvbGxiYXJUaGlja25lc3MoKTsKKyAgcHA6OlBvaW50IHByb2dyZXNzX29yaWdpbigKKyAgICAgIHNjcm9sbGJhcl90aGlja25lc3MgKyBHZXRTY2FsZWQoa1Byb2dyZXNzT2Zmc2V0TGVmdCksCisgICAgICBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLSBwcm9ncmVzc19iYXJfLnJlY3QoKS5oZWlnaHQoKSAtCisgICAgICAgICAgc2Nyb2xsYmFyX3RoaWNrbmVzcyAtIEdldFNjYWxlZChrUHJvZ3Jlc3NPZmZzZXRCb3R0b20pKTsKKyAgcHJvZ3Jlc3NfYmFyXy5Nb3ZlVG8ocHJvZ3Jlc3Nfb3JpZ2luLCBpbnZhbGlkYXRlKTsKK30KKwordm9pZCBJbnN0YW5jZTo6VXBkYXRlUGFnZUluZGljYXRvclBvc2l0aW9uKGJvb2wgaW52YWxpZGF0ZSkgeworICBpbnQzMiBkb2NfaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50Pihkb2N1bWVudF9zaXplXy5oZWlnaHQoKSAqIHpvb21fKTsKKyAgcHA6OlBvaW50IG9yaWdpbigKKyAgICAgIHBsdWdpbl9zaXplXy53aWR0aCgpIC0gcGFnZV9pbmRpY2F0b3JfLnJlY3QoKS53aWR0aCgpIC0KKyAgICAgICAgICBHZXRTY2FsZWQoR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSksCisgICAgICBwYWdlX2luZGljYXRvcl8uR2V0WVBvc2l0aW9uKGVuZ2luZV8tPkdldFZlcnRpY2FsU2Nyb2xsYmFyWVBvc2l0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY19oZWlnaHQsIHBsdWdpbl9zaXplXy5oZWlnaHQoKSkpOworICBwYWdlX2luZGljYXRvcl8uTW92ZVRvKG9yaWdpbiwgaW52YWxpZGF0ZSk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlNldFpvb20oWm9vbU1vZGUgem9vbV9tb2RlLCBkb3VibGUgc2NhbGUpIHsKKyAgZG91YmxlIG9sZF96b29tID0gem9vbV87CisKKyAgem9vbV9tb2RlXyA9IHpvb21fbW9kZTsKKyAgaWYgKHpvb21fbW9kZV8gPT0gWk9PTV9TQ0FMRSkKKyAgICB6b29tXyA9IHNjYWxlOworICBVcGRhdGVab29tU2NhbGUoKTsKKworICBlbmdpbmVfLT5ab29tVXBkYXRlZCh6b29tXyAqIGRldmljZV9zY2FsZV8pOworICBPbkdlb21ldHJ5Q2hhbmdlZChvbGRfem9vbSwgZGV2aWNlX3NjYWxlXyk7CisKKyAgLy8gSWYgZml0LXRvLWhlaWdodCwgc25hcCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb3N0IHZpc2libGUgcGFnZS4KKyAgaWYgKHpvb21fbW9kZV8gPT0gWk9PTV9GSVRfVE9fUEFHRSkgeworICAgIFNjcm9sbFRvUGFnZShlbmdpbmVfLT5HZXRNb3N0VmlzaWJsZVBhZ2UoKSk7CisgIH0KKworICAvLyBVcGRhdGUgc3RpY2t5IGJ1dHRvbnMgdG8gdGhlIGN1cnJlbnQgem9vbSBzdHlsZS4KKyAgQnV0dG9uKiBmdHBfYnRuID0gc3RhdGljX2Nhc3Q8QnV0dG9uKj4oCisgICAgICB0b29sYmFyXy0+R2V0Q29udHJvbChrRml0VG9QYWdlQnV0dG9uSWQpKTsKKyAgQnV0dG9uKiBmdHdfYnRuID0gc3RhdGljX2Nhc3Q8QnV0dG9uKj4oCisgICAgICB0b29sYmFyXy0+R2V0Q29udHJvbChrRml0VG9XaWR0aEJ1dHRvbklkKSk7CisgIHN3aXRjaCAoem9vbV9tb2RlXykgeworICAgIGNhc2UgWk9PTV9GSVRfVE9fUEFHRToKKyAgICAgIGZ0cF9idG4tPlNldFByZXNzZWRTdGF0ZSh0cnVlKTsKKyAgICAgIGZ0d19idG4tPlNldFByZXNzZWRTdGF0ZShmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFpPT01fRklUX1RPX1dJRFRIOgorICAgICAgZnR3X2J0bi0+U2V0UHJlc3NlZFN0YXRlKHRydWUpOworICAgICAgZnRwX2J0bi0+U2V0UHJlc3NlZFN0YXRlKGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmdHdfYnRuLT5TZXRQcmVzc2VkU3RhdGUoZmFsc2UpOworICAgICAgZnRwX2J0bi0+U2V0UHJlc3NlZFN0YXRlKGZhbHNlKTsKKyAgfQorfQorCit2b2lkIEluc3RhbmNlOjpVcGRhdGVab29tU2NhbGUoKSB7CisgIHN3aXRjaCAoem9vbV9tb2RlXykgeworICAgIGNhc2UgWk9PTV9TQ0FMRToKKyAgICAgIGJyZWFrOyAgLy8gS2VlcCBjdXJyZW50IHNjYWxlLgorICAgIGNhc2UgWk9PTV9GSVRfVE9fUEFHRTogeworICAgICAgaW50IHBhZ2VfbnVtID0gZW5naW5lXy0+R2V0Rmlyc3RWaXNpYmxlUGFnZSgpOworICAgICAgaWYgKHBhZ2VfbnVtID09IC0xKQorICAgICAgICBicmVhazsKKyAgICAgIHBwOjpSZWN0IHJjID0gZW5naW5lXy0+R2V0UGFnZVJlY3QocGFnZV9udW0pOworICAgICAgaWYgKCFyYy5oZWlnaHQoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBDYWxjdWxhdGUgZml0IHRvIHdpZHRoIHpvb20gbGV2ZWwuCisgICAgICBkb3VibGUgZnR3X3pvb20gPSBzdGF0aWNfY2FzdDxkb3VibGU+KHBsdWdpbl9kaXBfc2l6ZV8ud2lkdGgoKSAtCisgICAgICAgICAgR2V0U2Nyb2xsYmFyUmVzZXJ2ZWRUaGlja25lc3MoKSkgLyBkb2N1bWVudF9zaXplXy53aWR0aCgpOworICAgICAgLy8gQ2FsY3VsYXRlIGZpdCB0byBoZWlnaHQgem9vbSBsZXZlbC4gSWYgZG9jdW1lbnQgd2lsbCBub3QgZml0CisgICAgICAvLyBob3Jpem9udGFsbHksIGFkanVzdCB6b29tIGxldmVsIHRvIGFsbG93IHNwYWNlIGZvciBob3Jpem9udGFsCisgICAgICAvLyBzY3JvbGxiYXIuCisgICAgICBkb3VibGUgZnRoX3pvb20gPQorICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ocGx1Z2luX2RpcF9zaXplXy5oZWlnaHQoKSkgLyByYy5oZWlnaHQoKTsKKyAgICAgIGlmIChmdGhfem9vbSAqIGRvY3VtZW50X3NpemVfLndpZHRoKCkgPgorICAgICAgICAgIHBsdWdpbl9kaXBfc2l6ZV8ud2lkdGgoKSAtIEdldFNjcm9sbGJhclJlc2VydmVkVGhpY2tuZXNzKCkpCisgICAgICAgIGZ0aF96b29tID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihwbHVnaW5fZGlwX3NpemVfLmhlaWdodCgpCisgICAgICAgICAgICAtIEdldFNjcm9sbGJhclJlc2VydmVkVGhpY2tuZXNzKCkpIC8gcmMuaGVpZ2h0KCk7CisgICAgICB6b29tXyA9IHN0ZDo6bWluKGZ0d196b29tLCBmdGhfem9vbSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIFpPT01fRklUX1RPX1dJRFRIOgorICAgIGNhc2UgWk9PTV9BVVRPOgorICAgICAgaWYgKCFkb2N1bWVudF9zaXplXy53aWR0aCgpKQorICAgICAgICBicmVhazsKKyAgICAgIHpvb21fID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihwbHVnaW5fZGlwX3NpemVfLndpZHRoKCkgLQorICAgICAgICAgIEdldFNjcm9sbGJhclJlc2VydmVkVGhpY2tuZXNzKCkpIC8gZG9jdW1lbnRfc2l6ZV8ud2lkdGgoKTsKKyAgICAgIGlmICh6b29tX21vZGVfID09IFpPT01fQVVUTyAmJiB6b29tXyA+IDEuMCkKKyAgICAgICAgem9vbV8gPSAxLjA7CisgICAgICBicmVhazsKKyAgfQorICB6b29tXyA9IENsaXBUb1JhbmdlKHpvb21fLCBrTWluWm9vbSwga01heFpvb20pOworfQorCitkb3VibGUgSW5zdGFuY2U6OkNhbGN1bGF0ZVpvb20odWludDMyIGNvbnRyb2xfaWQpIGNvbnN0IHsKKyAgaWYgKGNvbnRyb2xfaWQgPT0ga1pvb21JbkJ1dHRvbklkKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaHJvbWVfcGFnZV96b29tOjprUHJlc2V0Wm9vbUZhY3RvcnNTaXplOyArK2kpIHsKKyAgICAgIGRvdWJsZSBjdXJyZW50X3pvb20gPSBjaHJvbWVfcGFnZV96b29tOjprUHJlc2V0Wm9vbUZhY3RvcnNbaV07CisgICAgICBpZiAoY3VycmVudF96b29tIC0gY29udGVudDo6a0Vwc2lsb24gPiB6b29tXykKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRfem9vbTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChzaXplX3QgaSA9IGNocm9tZV9wYWdlX3pvb206OmtQcmVzZXRab29tRmFjdG9yc1NpemU7IGkgPiAwOyAtLWkpIHsKKyAgICAgIGRvdWJsZSBjdXJyZW50X3pvb20gPSBjaHJvbWVfcGFnZV96b29tOjprUHJlc2V0Wm9vbUZhY3RvcnNbaSAtIDFdOworICAgICAgaWYgKGN1cnJlbnRfem9vbSArIGNvbnRlbnQ6OmtFcHNpbG9uIDwgem9vbV8pCisgICAgICAgIHJldHVybiBjdXJyZW50X3pvb207CisgICAgfQorICB9CisgIHJldHVybiB6b29tXzsKK30KKworcHA6OkltYWdlRGF0YSBJbnN0YW5jZTo6Q3JlYXRlUmVzb3VyY2VJbWFnZShQUF9SZXNvdXJjZUltYWdlIGltYWdlX2lkKSB7CisgIHBwOjpJbWFnZURhdGEgcmVzb3VyY2VfZGF0YTsKKyAgaWYgKGhpZHBpX2VuYWJsZWRfKSB7CisgICAgcmVzb3VyY2VfZGF0YSA9CisgICAgICAgIHBwOjpQREY6OkdldFJlc291cmNlSW1hZ2VGb3JTY2FsZSh0aGlzLCBpbWFnZV9pZCwgZGV2aWNlX3NjYWxlXyk7CisgIH0KKworICByZXR1cm4gcmVzb3VyY2VfZGF0YS5kYXRhKCkgPyByZXNvdXJjZV9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBwOjpQREY6OkdldFJlc291cmNlSW1hZ2UodGhpcywgaW1hZ2VfaWQpOworfQorCitzdGQ6OnN0cmluZyBJbnN0YW5jZTo6R2V0TG9jYWxpemVkU3RyaW5nKFBQX1Jlc291cmNlU3RyaW5nIGlkKSB7CisgIHBwOjpWYXIgcnYocHA6OlBERjo6R2V0TG9jYWxpemVkU3RyaW5nKHRoaXMsIGlkKSk7CisgIGlmICghcnYuaXNfc3RyaW5nKCkpCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAgcmV0dXJuIHJ2LkFzU3RyaW5nKCk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkRyYXdUZXh0KGNvbnN0IHBwOjpQb2ludCYgdG9wX2NlbnRlciwgUFBfUmVzb3VyY2VTdHJpbmcgaWQpIHsKKyAgc3RkOjpzdHJpbmcgc3RyKEdldExvY2FsaXplZFN0cmluZyhpZCkpOworCisgIHBwOjpGb250RGVzY3JpcHRpb25fRGV2IGRlc2NyaXB0aW9uOworICBkZXNjcmlwdGlvbi5zZXRfZmFtaWx5KFBQX0ZPTlRGQU1JTFlfU0FOU1NFUklGKTsKKyAgZGVzY3JpcHRpb24uc2V0X3NpemUoa01lc3NhZ2VUZXh0U2l6ZSAqIGRldmljZV9zY2FsZV8pOworICBwcDo6Rm9udF9EZXYgZm9udCh0aGlzLCBkZXNjcmlwdGlvbik7CisgIGludCBsZW5ndGggPSBmb250Lk1lYXN1cmVTaW1wbGVUZXh0KHN0cik7CisgIHBwOjpQb2ludCBwb2ludCh0b3BfY2VudGVyKTsKKyAgcG9pbnQuc2V0X3gocG9pbnQueCgpIC0gbGVuZ3RoIC8gMik7CisgIERDSEVDSyghaW1hZ2VfZGF0YV8uaXNfbnVsbCgpKTsKKyAgZm9udC5EcmF3U2ltcGxlVGV4dCgmaW1hZ2VfZGF0YV8sIHN0ciwgcG9pbnQsIGtNZXNzYWdlVGV4dENvbG9yKTsKK30KKwordm9pZCBJbnN0YW5jZTo6U2V0UHJpbnRQcmV2aWV3TW9kZShpbnQgcGFnZV9jb3VudCkgeworICBpZiAoIUlzUHJpbnRQcmV2aWV3KCkgfHwgcGFnZV9jb3VudCA8PSAwKSB7CisgICAgcHJpbnRfcHJldmlld19wYWdlX2NvdW50XyA9IDA7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpbnRfcHJldmlld19wYWdlX2NvdW50XyA9IHBhZ2VfY291bnQ7CisgIFNjcm9sbFRvUGFnZSgwKTsKKyAgZW5naW5lXy0+QXBwZW5kQmxhbmtQYWdlcyhwcmludF9wcmV2aWV3X3BhZ2VfY291bnRfKTsKKyAgaWYgKHByZXZpZXdfcGFnZXNfaW5mb18uc2l6ZSgpID4gMCkKKyAgICBMb2FkQXZhaWxhYmxlUHJldmlld1BhZ2UoKTsKK30KKworYm9vbCBJbnN0YW5jZTo6SXNQcmludFByZXZpZXcoKSB7CisgIHJldHVybiBJc1ByaW50UHJldmlld1VybCh1cmxfKTsKK30KKworaW50IEluc3RhbmNlOjpHZXRQYWdlTnVtYmVyVG9EaXNwbGF5KCkgeworICBpbnQgcGFnZSA9IGVuZ2luZV8tPkdldE1vc3RWaXNpYmxlUGFnZSgpOworICBpZiAoSXNQcmludFByZXZpZXcoKSAmJiAhcHJpbnRfcHJldmlld19wYWdlX251bWJlcnNfLmVtcHR5KCkpIHsKKyAgICBwYWdlID0gQ2xpcFRvUmFuZ2U8aW50PihwYWdlLCAwLCBwcmludF9wcmV2aWV3X3BhZ2VfbnVtYmVyc18uc2l6ZSgpIC0gMSk7CisgICAgcmV0dXJuIHByaW50X3ByZXZpZXdfcGFnZV9udW1iZXJzX1twYWdlXTsKKyAgfQorICByZXR1cm4gcGFnZSArIDE7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlByb2Nlc3NQcmV2aWV3UGFnZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wYWdlX2luZGV4KSB7CisgIGlmICghSXNQcmludFByZXZpZXcoKSB8fCBwcmludF9wcmV2aWV3X3BhZ2VfY291bnRfIDwgMCkKKyAgICByZXR1cm47CisKKyAgaW50IHNyY19wYWdlX2luZGV4ID0gRXh0cmFjdFByaW50UHJldmlld1BhZ2VJbmRleCh1cmwpOworICBpZiAoc3JjX3BhZ2VfaW5kZXggPCAxKQorICAgIHJldHVybjsKKworICBwcmV2aWV3X3BhZ2VzX2luZm9fLnB1c2goc3RkOjptYWtlX3BhaXIodXJsLCBkc3RfcGFnZV9pbmRleCkpOworICBMb2FkQXZhaWxhYmxlUHJldmlld1BhZ2UoKTsKK30KKwordm9pZCBJbnN0YW5jZTo6TG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCkgeworICBpZiAocHJldmlld19wYWdlc19pbmZvXy5zaXplKCkgPD0gMCkKKyAgICByZXR1cm47CisKKyAgc3RkOjpzdHJpbmcgdXJsID0gcHJldmlld19wYWdlc19pbmZvXy5mcm9udCgpLmZpcnN0OworICBpbnQgZHN0X3BhZ2VfaW5kZXggPSBwcmV2aWV3X3BhZ2VzX2luZm9fLmZyb250KCkuc2Vjb25kOworICBpbnQgc3JjX3BhZ2VfaW5kZXggPSBFeHRyYWN0UHJpbnRQcmV2aWV3UGFnZUluZGV4KHVybCk7CisgIGlmIChzcmNfcGFnZV9pbmRleCA8IDEgfHwKKyAgICAgIGRzdF9wYWdlX2luZGV4ID49IHByaW50X3ByZXZpZXdfcGFnZV9jb3VudF8gfHwKKyAgICAgIHByZXZpZXdfZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPT0gTE9BRF9TVEFURV9MT0FESU5HKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXyA9IExPQURfU1RBVEVfTE9BRElORzsKKyAgTG9hZFByZXZpZXdVcmwodXJsKTsKK30KKwordm9pZCBJbnN0YW5jZTo6RW5hYmxlQXV0b3Njcm9sbChjb25zdCBwcDo6UG9pbnQmIG9yaWdpbikgeworICBpZiAoaXNfYXV0b3Njcm9sbF8pCisgICAgcmV0dXJuOworCisgIHBwOjpTaXplIGNsaWVudF9zaXplID0gcGx1Z2luX3NpemVfOworICBpZiAodl9zY3JvbGxiYXJfLmdldCgpKQorICAgIGNsaWVudF9zaXplLkVubGFyZ2UoLUdldFNjcm9sbGJhclRoaWNrbmVzcygpLCAwKTsKKyAgaWYgKGhfc2Nyb2xsYmFyXy5nZXQoKSkKKyAgICBjbGllbnRfc2l6ZS5FbmxhcmdlKDAsIC1HZXRTY3JvbGxiYXJUaGlja25lc3MoKSk7CisKKyAgLy8gRG8gbm90IGFsbG93IGF1dG9zY3JvbGwgaWYgY2xpZW50IGFyZWEgaXMgdG9vIHNtYWxsLgorICBpZiAoYXV0b3Njcm9sbF9hbmNob3JfLnNpemUoKS53aWR0aCgpID4gY2xpZW50X3NpemUud2lkdGgoKSB8fAorICAgICAgYXV0b3Njcm9sbF9hbmNob3JfLnNpemUoKS5oZWlnaHQoKSA+IGNsaWVudF9zaXplLmhlaWdodCgpKQorICAgIHJldHVybjsKKworICBhdXRvc2Nyb2xsX3JlY3RfID0gcHA6OlJlY3QoCisgICAgICBwcDo6UG9pbnQob3JpZ2luLngoKSAtIGF1dG9zY3JvbGxfYW5jaG9yXy5zaXplKCkud2lkdGgoKSAvIDIsCisgICAgICAgICAgICAgICAgb3JpZ2luLnkoKSAtIGF1dG9zY3JvbGxfYW5jaG9yXy5zaXplKCkuaGVpZ2h0KCkgLyAyKSwKKyAgICAgIGF1dG9zY3JvbGxfYW5jaG9yXy5zaXplKCkpOworCisgIC8vIE1ha2Ugc3VyZSBhdXRvc2Nyb2xsIGFuY2hvciBpcyBpbiB0aGUgY2xpZW50IGFyZWEuCisgIGlmIChhdXRvc2Nyb2xsX3JlY3RfLnJpZ2h0KCkgPiBjbGllbnRfc2l6ZS53aWR0aCgpKSB7CisgICAgYXV0b3Njcm9sbF9yZWN0Xy5zZXRfeCgKKyAgICAgICAgY2xpZW50X3NpemUud2lkdGgoKSAtIGF1dG9zY3JvbGxfYW5jaG9yXy5zaXplKCkud2lkdGgoKSk7CisgIH0KKyAgaWYgKGF1dG9zY3JvbGxfcmVjdF8uYm90dG9tKCkgPiBjbGllbnRfc2l6ZS5oZWlnaHQoKSkgeworICAgIGF1dG9zY3JvbGxfcmVjdF8uc2V0X3koCisgICAgICAgIGNsaWVudF9zaXplLmhlaWdodCgpIC0gYXV0b3Njcm9sbF9hbmNob3JfLnNpemUoKS5oZWlnaHQoKSk7CisgIH0KKworICBpZiAoYXV0b3Njcm9sbF9yZWN0Xy54KCkgPCAwKQorICAgIGF1dG9zY3JvbGxfcmVjdF8uc2V0X3goMCk7CisgIGlmIChhdXRvc2Nyb2xsX3JlY3RfLnkoKSA8IDApCisgICAgYXV0b3Njcm9sbF9yZWN0Xy5zZXRfeSgwKTsKKworICBpc19hdXRvc2Nyb2xsXyA9IHRydWU7CisgIEludmFsaWRhdGUoa0F1dG9TY3JvbGxJZCwgYXV0b3Njcm9sbF9yZWN0Xyk7CisKKyAgU2NoZWR1bGVUaW1lcihrQXV0b1Njcm9sbElkLCBrQXV0b1Njcm9sbFRpbWVvdXRNcyk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OkRpc2FibGVBdXRvc2Nyb2xsKCkgeworICBpZiAoaXNfYXV0b3Njcm9sbF8pIHsKKyAgICBpc19hdXRvc2Nyb2xsXyA9IGZhbHNlOworICAgIEludmFsaWRhdGUoa0F1dG9TY3JvbGxJZCwgYXV0b3Njcm9sbF9yZWN0Xyk7CisgIH0KK30KKworUFBfQ3Vyc29yVHlwZV9EZXYgSW5zdGFuY2U6OkNhbGN1bGF0ZUF1dG9zY3JvbGwoY29uc3QgcHA6OlBvaW50JiBtb3VzZV9wb3MpIHsKKyAgLy8gU2Nyb2xsIG9ubHkgaWYgbW91c2UgcG9pbnRlciBpcyBvdXRzaWRlIG9mIHRoZSBhbmNob3IgYXJlYS4KKyAgaWYgKGF1dG9zY3JvbGxfcmVjdF8uQ29udGFpbnMobW91c2VfcG9zKSkgeworICAgIGF1dG9zY3JvbGxfeF8gPSAwOworICAgIGF1dG9zY3JvbGxfeV8gPSAwOworICAgIHJldHVybiBQUF9DVVJTT1JUWVBFX01JRERMRVBBTk5JTkc7CisgIH0KKworICAvLyBSZWxhdGl2ZSBwb3NpdGlvbiB0byB0aGUgY2VudGVyIG9mIGFuY2hvciBhcmVhLgorICBwcDo6UG9pbnQgcmVsX3BvcyA9IG1vdXNlX3BvcyAtIGF1dG9zY3JvbGxfcmVjdF8uQ2VudGVyUG9pbnQoKTsKKworICAvLyBDYWxjdWxhdGUgYW5nbGUgZnJvbSB0aGUgWCBheGlzLiBBbmdsZSBpcyBpbiByYW5nZSBmcm9tIC1waSB0byBwaS4KKyAgZG91YmxlIGFuZ2xlID0gYXRhbjIoc3RhdGljX2Nhc3Q8ZG91YmxlPihyZWxfcG9zLnkoKSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ocmVsX3Bvcy54KCkpKTsKKworICBhdXRvc2Nyb2xsX3hfID0gcmVsX3Bvcy54KCkgKiBrQXV0b1Njcm9sbEZhY3RvcjsKKyAgYXV0b3Njcm9sbF95XyA9IHJlbF9wb3MueSgpICoga0F1dG9TY3JvbGxGYWN0b3I7CisKKyAgLy8gQW5nbGUgaXMgZnJvbSAtcGkgdG8gcGkuIFNjcmVlbiBZIGlzIGluY3JlYXNpbmcgdG93YXJkIGJvdHRvbSwKKyAgLy8gc28gbmVnYXRpdmUgYW5nbGUgcmVwcmVzZW50IG5vcnRoIGRpcmVjdGlvbi4KKyAgaWYgKGFuZ2xlIDwgLSAoTV9QSSAqIDcuMCAvIDguMCkpIHsKKyAgICAvLyBnb2luZyB3ZXN0CisgICAgcmV0dXJuIFBQX0NVUlNPUlRZUEVfV0VTVFBBTk5JTkc7CisgIH0gZWxzZSBpZiAoYW5nbGUgPCAtIChNX1BJICogNS4wIC8gOC4wKSkgeworICAgIC8vIGdvaW5nIG5vcnRoLXdlc3QKKyAgICByZXR1cm4gUFBfQ1VSU09SVFlQRV9OT1JUSFdFU1RQQU5OSU5HOworICB9IGVsc2UgaWYgKGFuZ2xlIDwgLSAoTV9QSSAqIDMuMCAvIDguMCkpIHsKKyAgICAvLyBnb2luZyBub3J0aC4KKyAgICByZXR1cm4gUFBfQ1VSU09SVFlQRV9OT1JUSFBBTk5JTkc7CisgIH0gZWxzZSBpZiAoYW5nbGUgPCAtIChNX1BJICogMS4wIC8gOC4wKSkgeworICAgIC8vIGdvaW5nIG5vcnRoLWVhc3QKKyAgICByZXR1cm4gUFBfQ1VSU09SVFlQRV9OT1JUSEVBU1RQQU5OSU5HOworICB9IGVsc2UgaWYgKGFuZ2xlIDwgTV9QSSAqIDEuMCAvIDguMCkgeworICAgIC8vIGdvaW5nIGVhc3QuCisgICAgcmV0dXJuIFBQX0NVUlNPUlRZUEVfRUFTVFBBTk5JTkc7CisgIH0gZWxzZSBpZiAoYW5nbGUgPCBNX1BJICogMy4wIC8gOC4wKSB7CisgICAgLy8gZ29pbmcgc291dGgtZWFzdAorICAgIHJldHVybiBQUF9DVVJTT1JUWVBFX1NPVVRIRUFTVFBBTk5JTkc7CisgIH0gZWxzZSBpZiAoYW5nbGUgPCBNX1BJICogNS4wIC8gOC4wKSB7CisgICAgLy8gZ29pbmcgc291dGguCisgICAgcmV0dXJuIFBQX0NVUlNPUlRZUEVfU09VVEhQQU5OSU5HOworICB9IGVsc2UgaWYgKGFuZ2xlIDwgTV9QSSAqIDcuMCAvIDguMCkgeworICAgIC8vIGdvaW5nIHNvdXRoLXdlc3QKKyAgICByZXR1cm4gUFBfQ1VSU09SVFlQRV9TT1VUSFdFU1RQQU5OSU5HOworICB9CisKKyAgLy8gd2VudCBhcm91bmQgdGhlIGNpcmNsZSwgZ29pbmcgd2VzdCBhZ2FpbgorICByZXR1cm4gUFBfQ1VSU09SVFlQRV9XRVNUUEFOTklORzsKK30KKwordm9pZCBJbnN0YW5jZTo6Q29uZmlndXJlTnVtYmVySW1hZ2VHZW5lcmF0b3IoKSB7CisgIHN0ZDo6dmVjdG9yPHBwOjpJbWFnZURhdGE+IG51bV9pbWFnZXMgPSBHZXRUaHVtYm5haWxSZXNvdXJjZXMoKTsKKyAgcHA6OkltYWdlRGF0YSBudW1iZXJfYmFja2dyb3VuZCA9IENyZWF0ZVJlc291cmNlSW1hZ2UoCisgICAgICBQUF9SRVNPVVJDRUlNQUdFX1BERl9CVVRUT05fVEhVTUJOQUlMX05VTV9CQUNLR1JPVU5EKTsKKyAgbnVtYmVyX2ltYWdlX2dlbmVyYXRvcl8tPkNvbmZpZ3VyZShudW1iZXJfYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1faW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9zY2FsZV8pOworfQorCitOdW1iZXJJbWFnZUdlbmVyYXRvciogSW5zdGFuY2U6Om51bWJlcl9pbWFnZV9nZW5lcmF0b3IoKSB7CisgIGlmICghbnVtYmVyX2ltYWdlX2dlbmVyYXRvcl8uZ2V0KCkpIHsKKyAgICBudW1iZXJfaW1hZ2VfZ2VuZXJhdG9yXy5yZXNldChuZXcgTnVtYmVySW1hZ2VHZW5lcmF0b3IodGhpcykpOworICAgIENvbmZpZ3VyZU51bWJlckltYWdlR2VuZXJhdG9yKCk7CisgIH0KKyAgcmV0dXJuIG51bWJlcl9pbWFnZV9nZW5lcmF0b3JfLmdldCgpOworfQorCitpbnQgSW5zdGFuY2U6OkdldFNjYWxlZChpbnQgeCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih4ICogZGV2aWNlX3NjYWxlXyk7Cit9CisKK3ZvaWQgSW5zdGFuY2U6OlVzZXJNZXRyaWNzUmVjb3JkQWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3Rpb24pIHsKKyAgcHA6OlBERjo6VXNlck1ldHJpY3NSZWNvcmRBY3Rpb24odGhpcywgcHA6OlZhcihhY3Rpb24pKTsKK30KKworUERGU2NyaXB0YWJsZU9iamVjdDo6UERGU2NyaXB0YWJsZU9iamVjdChJbnN0YW5jZSogaW5zdGFuY2UpCisgICAgOiBpbnN0YW5jZV8oaW5zdGFuY2UpIHsKK30KKworUERGU2NyaXB0YWJsZU9iamVjdDo6flBERlNjcmlwdGFibGVPYmplY3QoKSB7Cit9CisKK2Jvb2wgUERGU2NyaXB0YWJsZU9iamVjdDo6SGFzTWV0aG9kKGNvbnN0IHBwOjpWYXImIG5hbWUsIHBwOjpWYXIqIGV4Y2VwdGlvbikgeworICByZXR1cm4gaW5zdGFuY2VfLT5IYXNTY3JpcHRhYmxlTWV0aG9kKG5hbWUsIGV4Y2VwdGlvbik7Cit9CisKK3BwOjpWYXIgUERGU2NyaXB0YWJsZU9iamVjdDo6Q2FsbChjb25zdCBwcDo6VmFyJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OlZhcj4mIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OlZhciogZXhjZXB0aW9uKSB7CisgIHJldHVybiBpbnN0YW5jZV8tPkNhbGxTY3JpcHRhYmxlTWV0aG9kKG1ldGhvZCwgYXJncywgZXhjZXB0aW9uKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9pbnN0YW5jZS5oIGIveGZhX3Rlc3QvcGRmL2luc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5YmE0MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9pbnN0YW5jZS5oCkBAIC0wLDAgKzEsNTMxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBERl9JTlNUQU5DRV9IXworI2RlZmluZSBQREZfSU5TVEFOQ0VfSF8KKworI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAicGRmL2J1dHRvbi5oIgorI2luY2x1ZGUgInBkZi9mYWRpbmdfY29udHJvbHMuaCIKKyNpbmNsdWRlICJwZGYvcGFnZV9pbmRpY2F0b3IuaCIKKyNpbmNsdWRlICJwZGYvcGFpbnRfbWFuYWdlci5oIgorI2luY2x1ZGUgInBkZi9wZGZfZW5naW5lLmgiCisjaW5jbHVkZSAicGRmL3ByZXZpZXdfbW9kZV9jbGllbnQuaCIKKyNpbmNsdWRlICJwZGYvcHJvZ3Jlc3NfY29udHJvbC5oIgorI2luY2x1ZGUgInBkZi90aHVtYm5haWxfY29udHJvbC5oIgorCisjaW5jbHVkZSAicHBhcGkvYy9wcml2YXRlL3BwYl9wZGYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvZGV2L3ByaW50aW5nX2Rldi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvc2NyaXB0YWJsZV9vYmplY3RfZGVwcmVjYXRlZC5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvc2Nyb2xsYmFyX2Rldi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvc2VsZWN0aW9uX2Rldi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvd2lkZ2V0X2NsaWVudF9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvZGV2L3pvb21fZGV2LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2dyYXBoaWNzXzJkLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2ltYWdlX2RhdGEuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvaW5wdXRfZXZlbnQuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS9maW5kX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS9pbnN0YW5jZV9wcml2YXRlLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3ByaXZhdGUvdmFyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvdXJsX2xvYWRlci5oIgorI2luY2x1ZGUgInBwYXBpL3V0aWxpdHkvY29tcGxldGlvbl9jYWxsYmFja19mYWN0b3J5LmgiCisKK25hbWVzcGFjZSBwcCB7CitjbGFzcyBUZXh0SW5wdXRfRGV2OworfQorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK3N0cnVjdCBUb29sYmFyQnV0dG9uSW5mbzsKKworY2xhc3MgSW5zdGFuY2UgOiBwdWJsaWMgcHA6Okluc3RhbmNlUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgcHVibGljIHBwOjpGaW5kX1ByaXZhdGUsCisgICAgICAgICAgICAgICAgIHB1YmxpYyBwcDo6UHJpbnRpbmdfRGV2LAorICAgICAgICAgICAgICAgICBwdWJsaWMgcHA6OlNlbGVjdGlvbl9EZXYsCisgICAgICAgICAgICAgICAgIHB1YmxpYyBwcDo6V2lkZ2V0Q2xpZW50X0RldiwKKyAgICAgICAgICAgICAgICAgcHVibGljIHBwOjpab29tX0RldiwKKyAgICAgICAgICAgICAgICAgcHVibGljIFBhaW50TWFuYWdlcjo6Q2xpZW50LAorICAgICAgICAgICAgICAgICBwdWJsaWMgUERGRW5naW5lOjpDbGllbnQsCisgICAgICAgICAgICAgICAgIHB1YmxpYyBQcmV2aWV3TW9kZUNsaWVudDo6Q2xpZW50LAorICAgICAgICAgICAgICAgICBwdWJsaWMgQ29udHJvbE93bmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEluc3RhbmNlKFBQX0luc3RhbmNlIGluc3RhbmNlKTsKKyAgdmlydHVhbCB+SW5zdGFuY2UoKTsKKworICAvLyBwcDo6SW5zdGFuY2UgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBJbml0KHVpbnQzMl90IGFyZ2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ25bXSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJndltdKSBvdmVycmlkZTsKKyAgdmlydHVhbCBib29sIEhhbmRsZURvY3VtZW50TG9hZChjb25zdCBwcDo6VVJMTG9hZGVyJiBsb2FkZXIpIG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgSGFuZGxlSW5wdXRFdmVudChjb25zdCBwcDo6SW5wdXRFdmVudCYgZXZlbnQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGlkQ2hhbmdlVmlldyhjb25zdCBwcDo6VmlldyYgdmlldykgb3ZlcnJpZGU7CisgIHZpcnR1YWwgcHA6OlZhciBHZXRJbnN0YW5jZU9iamVjdCgpIG92ZXJyaWRlOworCisgIC8vIHBwOjpGaW5kX1ByaXZhdGUgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBTdGFydEZpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsIGJvb2wgY2FzZV9zZW5zaXRpdmUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2VsZWN0RmluZFJlc3VsdChib29sIGZvcndhcmQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU3RvcEZpbmQoKSBvdmVycmlkZTsKKworICAvLyBwcDo6UGFpbnRNYW5hZ2VyOjpDbGllbnQgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgdm9pZCBPblBhaW50KGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgcGFpbnRfcmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhaW50TWFuYWdlcjo6UmVhZHlSZWN0PiogcmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiogcGVuZGluZykgb3ZlcnJpZGU7CisKKyAgLy8gcHA6OlByaW50aW5nX0RldiBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCB1aW50MzJfdCBRdWVyeVN1cHBvcnRlZFByaW50T3V0cHV0Rm9ybWF0cygpIG92ZXJyaWRlOworICB2aXJ0dWFsIGludDMyX3QgUHJpbnRCZWdpbigKKyAgICAgIGNvbnN0IFBQX1ByaW50U2V0dGluZ3NfRGV2JiBwcmludF9zZXR0aW5ncykgb3ZlcnJpZGU7CisgIHZpcnR1YWwgcHA6OlJlc291cmNlIFByaW50UGFnZXMoCisgICAgICBjb25zdCBQUF9QcmludFBhZ2VOdW1iZXJSYW5nZV9EZXYqIHBhZ2VfcmFuZ2VzLAorICAgICAgdWludDMyX3QgcGFnZV9yYW5nZV9jb3VudCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBQcmludEVuZCgpIG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgSXNQcmludFNjYWxpbmdEaXNhYmxlZCgpIG92ZXJyaWRlOworCisgIC8vIHBwOjpQcml2YXRlIGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIHBwOjpWYXIgR2V0TGlua0F0UG9zaXRpb24oY29uc3QgcHA6OlBvaW50JiBwb2ludCk7CisKKyAgLy8gUFBQX1NlbGVjdGlvbl9EZXYgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgcHA6OlZhciBHZXRTZWxlY3RlZFRleHQoYm9vbCBodG1sKSBvdmVycmlkZTsKKworICAvLyBXaWRnZXRDbGllbnRfRGV2IGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVdpZGdldChwcDo6V2lkZ2V0X0RldiB3aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBkaXJ0eV9yZWN0KSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNjcm9sbGJhclZhbHVlQ2hhbmdlZChwcDo6U2Nyb2xsYmFyX0RldiBzY3JvbGxiYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsYmFyT3ZlcmxheUNoYW5nZWQocHA6OlNjcm9sbGJhcl9EZXYgc2Nyb2xsYmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdmVybGF5KSBvdmVycmlkZTsKKworICAvLyBwcDo6Wm9vbV9EZXYgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgdm9pZCBab29tKGRvdWJsZSBzY2FsZSwgYm9vbCB0ZXh0X29ubHkpIG92ZXJyaWRlOworICB2b2lkIFpvb21DaGFuZ2VkKGRvdWJsZSBmYWN0b3IpOyAgLy8gT3ZlcnJpZGUuCisKKyAgdm9pZCBGbHVzaENhbGxiYWNrKGludDMyX3QgcmVzdWx0KTsKKyAgdm9pZCBEaWRPcGVuKGludDMyX3QgcmVzdWx0KTsKKyAgdm9pZCBEaWRPcGVuUHJldmlldyhpbnQzMl90IHJlc3VsdCk7CisgIC8vIElmIHRoZSBnaXZlbiB3aWRnZXQgaW50ZXJzZWN0cyB0aGUgcmVjdGFuZ2xlLCBwYWludHMgaXQgYW5kIGFkZHMgdGhlCisgIC8vIHJlY3QgdG8gcmVhZHkuCisgIHZvaWQgUGFpbnRJZldpZGdldEludGVyc2VjdHMocHA6OldpZGdldF9EZXYqIHdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYWludE1hbmFnZXI6OlJlYWR5UmVjdD4qIHJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiogcGVuZGluZyk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIHRpbWVyIGlzIGZpcmVkLgorICB2b2lkIE9uVGltZXJGaXJlZChpbnQzMl90KTsKKyAgdm9pZCBPbkNsaWVudFRpbWVyRmlyZWQoaW50MzJfdCBpZCk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgdGltZXIgaXMgZmlyZWQuCisgIHZvaWQgT25Db250cm9sVGltZXJGaXJlZChpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyJiBjb250cm9sX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyJiB0aW1lcl9pZCk7CisKKyAgLy8gQ2FsbGVkIHRvIHByaW50IHdpdGhvdXQgcmUtZW50cmFuY3kgaXNzdWVzLgorICB2b2lkIE9uUHJpbnQoaW50MzJfdCk7CisKKyAgLy8gUERGRW5naW5lOjpDbGllbnQgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgdm9pZCBEb2N1bWVudFNpemVVcGRhdGVkKGNvbnN0IHBwOjpTaXplJiBzaXplKTsKKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGUoY29uc3QgcHA6OlJlY3QmIHJlY3QpOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsKGNvbnN0IHBwOjpQb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsVG9YKGludCBwb3NpdGlvbik7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxUb1koaW50IHBvc2l0aW9uKTsKKyAgdmlydHVhbCB2b2lkIFNjcm9sbFRvUGFnZShpbnQgcGFnZSk7CisgIHZpcnR1YWwgdm9pZCBOYXZpZ2F0ZVRvKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsIGJvb2wgb3Blbl9pbl9uZXdfdGFiKTsKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZUN1cnNvcihQUF9DdXJzb3JUeXBlX0RldiBjdXJzb3IpOworICB2aXJ0dWFsIHZvaWQgVXBkYXRlVGlja01hcmtzKGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgdGlja21hcmtzKTsKKyAgdmlydHVhbCB2b2lkIE5vdGlmeU51bWJlck9mRmluZFJlc3VsdHNDaGFuZ2VkKGludCB0b3RhbCwgYm9vbCBmaW5hbF9yZXN1bHQpOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5U2VsZWN0ZWRGaW5kUmVzdWx0Q2hhbmdlZChpbnQgY3VycmVudF9maW5kX2luZGV4KTsKKyAgdmlydHVhbCB2b2lkIEdldERvY3VtZW50UGFzc3dvcmQoCisgICAgICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrV2l0aE91dHB1dDxwcDo6VmFyPiBjYWxsYmFjayk7CisgIHZpcnR1YWwgdm9pZCBBbGVydChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisgIHZpcnR1YWwgYm9vbCBDb25maXJtKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBQcm9tcHQoY29uc3Qgc3RkOjpzdHJpbmcmIHF1ZXN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF9hbnN3ZXIpOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFVSTCgpOworICB2aXJ0dWFsIHZvaWQgRW1haWwoY29uc3Qgc3RkOjpzdHJpbmcmIHRvLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJvZHkpOworICB2aXJ0dWFsIHZvaWQgUHJpbnQoKTsKKyAgdmlydHVhbCB2b2lkIFN1Ym1pdEZvcm0oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgU2hvd0ZpbGVTZWxlY3Rpb25EaWFsb2coKTsKKyAgdmlydHVhbCBwcDo6VVJMTG9hZGVyIENyZWF0ZVVSTExvYWRlcigpOworICB2aXJ0dWFsIHZvaWQgU2NoZWR1bGVDYWxsYmFjayhpbnQgaWQsIGludCBkZWxheV9pbl9tcyk7CisgIHZpcnR1YWwgdm9pZCBTZWFyY2hTdHJpbmcoY29uc3QgYmFzZTo6Y2hhcjE2KiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Y2hhcjE2KiB0ZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2VhcmNoU3RyaW5nUmVzdWx0PiogcmVzdWx0cyk7CisgIHZpcnR1YWwgdm9pZCBEb2N1bWVudFBhaW50T2NjdXJyZWQoKTsKKyAgdmlydHVhbCB2b2lkIERvY3VtZW50TG9hZENvbXBsZXRlKGludCBwYWdlX2NvdW50KTsKKyAgdmlydHVhbCB2b2lkIERvY3VtZW50TG9hZEZhaWxlZCgpOworICB2aXJ0dWFsIHBwOjpJbnN0YW5jZSogR2V0UGx1Z2luSW5zdGFuY2UoKTsKKyAgdmlydHVhbCB2b2lkIERvY3VtZW50SGFzVW5zdXBwb3J0ZWRGZWF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmZWF0dXJlKTsKKyAgdmlydHVhbCB2b2lkIERvY3VtZW50TG9hZFByb2dyZXNzKHVpbnQzMiBhdmFpbGFibGUsIHVpbnQzMiBkb2Nfc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCBGb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoYm9vbCBpbl9mb2N1cyk7CisgIHZpcnR1YWwgYm9vbCBJc1ByaW50UHJldmlldygpOworCisgIC8vIENvbnRyb2xPd25lciBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCB2b2lkIE9uRXZlbnQodWludDMyIGNvbnRyb2xfaWQsIHVpbnQzMiBldmVudF9pZCwgdm9pZCogZGF0YSk7CisgIHZpcnR1YWwgdm9pZCBJbnZhbGlkYXRlKHVpbnQzMiBjb250cm9sX2lkLCBjb25zdCBwcDo6UmVjdCYgcmMpOworICB2aXJ0dWFsIHVpbnQzMiBTY2hlZHVsZVRpbWVyKHVpbnQzMiBjb250cm9sX2lkLCB1aW50MzIgdGltZW91dF9tcyk7CisgIHZpcnR1YWwgdm9pZCBTZXRFdmVudENhcHR1cmUodWludDMyIGNvbnRyb2xfaWQsIGJvb2wgc2V0X2NhcHR1cmUpOworICB2aXJ0dWFsIHZvaWQgU2V0Q3Vyc29yKHVpbnQzMiBjb250cm9sX2lkLCBQUF9DdXJzb3JUeXBlX0RldiBjdXJzb3JfdHlwZSk7CisgIHZpcnR1YWwgcHA6Okluc3RhbmNlKiBHZXRJbnN0YW5jZSgpOworCisgIGJvb2wgZG9udF9wYWludCgpIGNvbnN0IHsgcmV0dXJuIGRvbnRfcGFpbnRfOyB9CisgIHZvaWQgc2V0X2RvbnRfcGFpbnQoYm9vbCBkb250X3BhaW50KSB7IGRvbnRfcGFpbnRfID0gZG9udF9wYWludDsgfQorCisgIC8vIENhbGxlZCBieSBQREZTY3JpcHRhYmxlT2JqZWN0LgorICBib29sIEhhc1NjcmlwdGFibGVNZXRob2QoY29uc3QgcHA6OlZhciYgbWV0aG9kLCBwcDo6VmFyKiBleGNlcHRpb24pOworICBwcDo6VmFyIENhbGxTY3JpcHRhYmxlTWV0aG9kKGNvbnN0IHBwOjpWYXImIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6VmFyPiYgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6VmFyKiBleGNlcHRpb24pOworCisgIC8vIFByZXZpZXdNb2RlQ2xpZW50OjpDbGllbnQgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgdm9pZCBQcmV2aWV3RG9jdW1lbnRMb2FkQ29tcGxldGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFByZXZpZXdEb2N1bWVudExvYWRGYWlsZWQoKSBvdmVycmlkZTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgUFBQX1BERi4KKyAgdm9pZCBSb3RhdGVDbG9ja3dpc2UoKTsKKyAgdm9pZCBSb3RhdGVDb3VudGVyY2xvY2t3aXNlKCk7CisKKyBwcml2YXRlOgorICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHBsdWdpbiBnZW9tZXRyeSBjaGFuZ2VzIHRvIHVwZGF0ZSB0aGUgbG9jYXRpb24gb2YgdGhlCisgIC8vIHNjcm9sbGJhcnMsIGJhY2tncm91bmQgcGFydHMsIGFuZCBub3RpZmllcyB0aGUgcGRmIGVuZ2luZS4KKyAgdm9pZCBPbkdlb21ldHJ5Q2hhbmdlZChkb3VibGUgb2xkX3pvb20sIGZsb2F0IG9sZF9kZXZpY2Vfc2NhbGUpOworCisgIC8vIFJ1bnMgdGhlIGdpdmVuIEpTIGNhbGxiYWNrIGdpdmVuIGluIHxjYWxsYmFja3wuCisgIHZvaWQgUnVuQ2FsbGJhY2soaW50MzJfdCwgcHA6OlZhciBjYWxsYmFjayk7CisKKyAgdm9pZCBDcmVhdGVIb3Jpem9udGFsU2Nyb2xsYmFyKCk7CisgIHZvaWQgQ3JlYXRlVmVydGljYWxTY3JvbGxiYXIoKTsKKyAgdm9pZCBEZXN0cm95SG9yaXpvbnRhbFNjcm9sbGJhcigpOworICB2b2lkIERlc3Ryb3lWZXJ0aWNhbFNjcm9sbGJhcigpOworCisgIC8vIFJldHVybnMgdGhlIHRoaWNrbmVzcyBvZiBhIHNjcm9sbGJhci4gVGhpcyByZXR1cm5zIHRoZSB0aGlja25lc3Mgd2hlbiBpdCdzCisgIC8vIHNob3duLCBzbyBmb3Igb3ZlcmxheSBzY3JvbGxiYXJzIGl0J2xsIHN0aWxsIGJlIG5vbi16ZXJvLgorICBpbnQgR2V0U2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc3BhY2Ugd2UgbmVlZCB0byByZXNlcnZlIGZvciB0aGUgc2Nyb2xsYmFyIGluIHRoZSBwbHVnaW4gYXJlYS4KKyAgLy8gSWYgb3ZlcmxheSBzY3JvbGxiYXJzIGFyZSB1c2VkLCB0aGlzIHdpbGwgYmUgMC4KKyAgaW50IEdldFNjcm9sbGJhclJlc2VydmVkVGhpY2tuZXNzKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIG92ZXJsYXkgc2Nyb2xsYmFycyBhcmUgaW4gdXNlLgorICBib29sIElzT3ZlcmxheVNjcm9sbGJhcigpOworCisgIC8vIEZpZ3VyZXMgb3V0IHRoZSBsb2NhdGlvbiBvZiBhbnkgYmFja2dyb3VuZCByZWN0YW5nbGVzIChpLmUuIHRob3NlIHRoYXQKKyAgLy8gYXJlbid0IHBhaW50ZWQgYnkgdGhlIFBERiBlbmdpbmUpLgorICB2b2lkIENhbGN1bGF0ZUJhY2tncm91bmRQYXJ0cygpOworCisgIC8vIENvbXB1dGVzIGRvY3VtZW50IHdpZHRoL2hlaWdodCBpbiBkZXZpY2UgcGl4ZWxzLCBiYXNlZCBvbiBjdXJyZW50IHpvb20gYW5kCisgIC8vIGRldmljZSBzY2FsZQorICBpbnQgR2V0RG9jdW1lbnRQaXhlbFdpZHRoKCkgY29uc3Q7CisgIGludCBHZXREb2N1bWVudFBpeGVsSGVpZ2h0KCkgY29uc3Q7CisKKyAgLy8gRHJhd3MgYSByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMgYW5kIGNvbG9yIGluIG91ciBidWZmZXIuCisgIHZvaWQgRmlsbFJlY3QoY29uc3QgcHA6OlJlY3QmIHJlY3QsIHVpbnQzMiBjb2xvcik7CisKKyAgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4gR2V0VGh1bWJuYWlsUmVzb3VyY2VzKCk7CisgIHN0ZDo6dmVjdG9yPHBwOjpJbWFnZURhdGE+IEdldFByb2dyZXNzQmFyUmVzb3VyY2VzKHBwOjpJbWFnZURhdGEqIGJhY2tncm91bmQpOworCisgIHZvaWQgQ3JlYXRlVG9vbGJhcihjb25zdCBUb29sYmFyQnV0dG9uSW5mbyogdGJfaW5mbywgc2l6ZV90IHNpemUpOworICBpbnQgR2V0VG9vbGJhclJpZ2h0T2Zmc2V0KCk7CisgIGludCBHZXRUb29sYmFyQm90dG9tT2Zmc2V0KCk7CisgIHZvaWQgQ3JlYXRlUHJvZ3Jlc3NCYXIoKTsKKyAgdm9pZCBDb25maWd1cmVQcm9ncmVzc0JhcigpOworICB2b2lkIENyZWF0ZVRodW1ibmFpbHMoKTsKKyAgdm9pZCBDcmVhdGVQYWdlSW5kaWNhdG9yKGJvb2wgYWx3YXlzX3Zpc2libGUpOworICB2b2lkIENvbmZpZ3VyZVBhZ2VJbmRpY2F0b3IoKTsKKworICB2b2lkIFBhaW50T3ZlcmxheUNvbnRyb2woQ29udHJvbCogY3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYWludE1hbmFnZXI6OlJlYWR5UmVjdD4qIHJlYWR5KTsKKworICB2b2lkIExvYWRVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCk7CisgIHZvaWQgTG9hZFByZXZpZXdVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCk7CisgIHZvaWQgTG9hZFVybEludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsIHBwOjpVUkxMb2FkZXIqIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoSW5zdGFuY2U6OiogbWV0aG9kKShpbnQzMl90KSk7CisKKyAgLy8gQ3JlYXRlcyBhIFVSTCBsb2FkZXIgYW5kIGFsbG93cyBpdCB0byBhY2Nlc3MgYWxsIHVybHMsIGkuZS4gbm90IGp1c3QgdGhlCisgIC8vIGZyYW1lJ3Mgb3JpZ2luLgorICBwcDo6VVJMTG9hZGVyIENyZWF0ZVVSTExvYWRlckludGVybmFsKCk7CisKKyAgLy8gRmlndXJlIG91dCB0aGUgaW5pdGlhbCBwYWdlIHRvIGRpc3BsYXkgYmFzZWQgb24gI3BhZ2U9TiBhbmQgI25hbWVkZGVzdD1mb28KKyAgLy8gaW4gdGhlIHx1cmxffC4KKyAgLy8gUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyB2YWxpZCBmcmFnbWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIDAtYmFzZWQsCisgIC8vIHdoZXJlYXMgcGFnZT1OIGlzIDEtYmFzZWQuCisgIGludCBHZXRJbml0aWFsUGFnZShjb25zdCBzdGQ6OnN0cmluZyYgdXJsKTsKKworICB2b2lkIFVwZGF0ZVRvb2xiYXJQb3NpdGlvbihib29sIGludmFsaWRhdGUpOworICB2b2lkIFVwZGF0ZVByb2dyZXNzQmFyUG9zaXRpb24oYm9vbCBpbnZhbGlkYXRlKTsKKyAgdm9pZCBVcGRhdGVQYWdlSW5kaWNhdG9yUG9zaXRpb24oYm9vbCBpbnZhbGlkYXRlKTsKKworICB2b2lkIEZvcm1EaWRPcGVuKGludDMyX3QgcmVzdWx0KTsKKworICBzdGQ6OnN0cmluZyBHZXRMb2NhbGl6ZWRTdHJpbmcoUFBfUmVzb3VyY2VTdHJpbmcgaWQpOworCisgIHZvaWQgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFjdGlvbik7CisKKyAgdm9pZCBTYXZlQXMoKTsKKworICBlbnVtIFpvb21Nb2RlIHsKKyAgICBaT09NX1NDQUxFLCAgLy8gU3RhbmRhcmQgem9vbWluZyBtb2RlLCByZXNpemUgd2lsbCBub3QgYWZmZWN0IGl0LgorICAgIFpPT01fRklUX1RPX1dJRFRILCAgLy8gTWFpbnRhaW4gZml0IHRvIHdpZHRoIG9uIHJlc2l6ZS4KKyAgICBaT09NX0ZJVF9UT19QQUdFLCAgLy8gTWFpbnRhaW4gZml0IHRvIHBhZ2Ugb24gcmVzaXplLgorICAgIFpPT01fQVVUTyAgLy8gTWFpbnRhaW4gdGhlIGRlZmF1bHQgYXV0byBmaXR0aW5nIG1vZGUgb24gcmVzaXplLgorICB9OworCisgIGVudW0gRG9jdW1lbnRMb2FkU3RhdGUgeworICAgIExPQURfU1RBVEVfTE9BRElORywKKyAgICBMT0FEX1NUQVRFX0NPTVBMRVRFLAorICAgIExPQURfU1RBVEVfRkFJTEVELAorICB9OworCisgIC8vIFNldCBuZXcgem9vbSBtb2RlIGFuZCBzY2FsZS4gU2NhbGUgd2lsbCBiZSBpZ25vcmVkIGlmIG1vZGUgIT0gWk9PTV9TQ0FMRS4KKyAgdm9pZCBTZXRab29tKFpvb21Nb2RlIHpvb21fbW9kZSwgZG91YmxlIHNjYWxlKTsKKworICAvLyBVcGRhdGVzIGludGVybmFsIHpvb20gc2NhbGUgYmFzZWQgb24gdGhlIHBsdWdpbi9kb2N1bWVudCBnZW9tZXRyeSBhbmQKKyAgLy8gY3VycmVudCBtb2RlLgorICB2b2lkIFVwZGF0ZVpvb21TY2FsZSgpOworCisgIC8vIFNpbXVsYXRlcyBob3cgQ2hyb21lICJzbmFwcyIgem9vbWluZyB1cC9kb3duIHRvIHRoZSBuZXh0IG5lYXJlc3Qgem9vbSBsZXZlbAorICAvLyB3aGVuIHRoZSBwcmV2aW91cyB6b29tIGxldmVsIHdhc24ndCBhbiBpbnRlZ2VyLiAgV2UgZG8gdGhpcyBzbyB0aGF0CisgIC8vIHByZXNzaW5nIHRoZSB6b29tIGJ1dHRvbnMgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgbWVudSBidXR0b25zLCBldmVuIGlmCisgIC8vIHdlIHN0YXJ0IGZyb20gYSBub24tc3RhbmRhcmQgem9vbSBsZXZlbCBiZWNhdXNlIG9mIGZpdC13aWR0aCBvciBmaXQtaGVpZ2h0LgorICBkb3VibGUgQ2FsY3VsYXRlWm9vbSh1aW50MzIgY29udHJvbF9pZCkgY29uc3Q7CisKKyAgcHA6OkltYWdlRGF0YSBDcmVhdGVSZXNvdXJjZUltYWdlKFBQX1Jlc291cmNlSW1hZ2UgaW1hZ2VfaWQpOworCisgIHZvaWQgRHJhd1RleHQoY29uc3QgcHA6OlBvaW50JiB0b3BfY2VudGVyLCBQUF9SZXNvdXJjZVN0cmluZyBpZCk7CisKKyAgLy8gU2V0IHByaW50IHByZXZpZXcgbW9kZSwgd2hlcmUgdGhlIGN1cnJlbnQgUERGIGRvY3VtZW50IGlzIHJlZHVjZWQgdG8KKyAgLy8gb25seSBvbmUgcGFnZSwgYW5kIHRoZW4gZXh0ZW5kZWQgdG8gfHBhZ2VfY291bnR8IHBhZ2VzIHdpdGgKKyAgLy8gfHBhZ2VfY291bnR8IC0gMSBibGFuayBwYWdlcy4KKyAgdm9pZCBTZXRQcmludFByZXZpZXdNb2RlKGludCBwYWdlX2NvdW50KTsKKworICAvLyBSZXR1cm5zIHRoZSBwYWdlIG51bWJlciB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBhZ2UgaW5kaWNhdG9yLiBJZiB0aGUKKyAgLy8gcGx1Z2luIGlzIHJ1bm5pbmcgd2l0aGluIHByaW50IHByZXZpZXcsIHRoZSBkaXNwbGF5ZWQgbnVtYmVyIG1pZ2h0IGJlCisgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBpbmRleCBvZiB0aGUgZGlzcGxheWVkIHBhZ2UuCisgIGludCBHZXRQYWdlTnVtYmVyVG9EaXNwbGF5KCk7CisKKyAgLy8gUHJvY2VzcyB0aGUgcHJldmlldyBwYWdlIGRhdGEgaW5mb3JtYXRpb24uIHxzcmNfdXJsfCBzcGVjaWZpZXMgdGhlIHByZXZpZXcKKyAgLy8gcGFnZSBkYXRhIGxvY2F0aW9uLiBUaGUgfHNyY191cmx8IGlzIGluIHRoZSBmb3JtYXQ6CisgIC8vIGNocm9tZTovL3ByaW50L2lkL3BhZ2VfbnVtYmVyL3ByaW50LnBkZgorICAvLyB8ZHN0X3BhZ2VfaW5kZXh8IHNwZWNpZmllcyB0aGUgYmxhbmsgcGFnZSBpbmRleCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkCisgIC8vIHdpdGggdGhlIG5ldyBwYWdlIGRhdGEuCisgIHZvaWQgUHJvY2Vzc1ByZXZpZXdQYWdlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjX3VybCwgaW50IGRzdF9wYWdlX2luZGV4KTsKKyAgLy8gTG9hZCB0aGUgbmV4dCBhdmFpbGFibGUgcHJldmlldyBwYWdlIGludG8gdGhlIGJsYW5rIHBhZ2UuCisgIHZvaWQgTG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCk7CisKKyAgLy8gRW5hYmxlcyBhdXRvc2Nyb2xsIHVzaW5nIG9yaWdpbiBhcyBhIG5ldXRyYWwgKGNlbnRlcikgcG9pbnQuCisgIHZvaWQgRW5hYmxlQXV0b3Njcm9sbChjb25zdCBwcDo6UG9pbnQmIG9yaWdpbik7CisgIC8vIERpc2FibGVzIGF1dG9zY3JvbGwgYW5kIHJldHVybnMgdG8gbm9ybWFsIGZ1bmN0aW9uYWxpdHkuCisgIHZvaWQgRGlzYWJsZUF1dG9zY3JvbGwoKTsKKyAgLy8gQ2FsY3VsYXRlIGF1dG9zY3JvbGwgaW5mbyBhbmQgcmV0dXJuIHByb3BlciBtb3VzZSBwb2ludGVyIGFuZCBzY3JvbGwKKyAgLy8gYW5kanVzdG1lbnRzLgorICBQUF9DdXJzb3JUeXBlX0RldiBDYWxjdWxhdGVBdXRvc2Nyb2xsKGNvbnN0IHBwOjpQb2ludCYgbW91c2VfcG9zKTsKKworICB2b2lkIENvbmZpZ3VyZU51bWJlckltYWdlR2VuZXJhdG9yKCk7CisKKyAgTnVtYmVySW1hZ2VHZW5lcmF0b3IqIG51bWJlcl9pbWFnZV9nZW5lcmF0b3IoKTsKKworICBpbnQgR2V0U2NhbGVkKGludCB4KSBjb25zdDsKKworICBwcDo6SW1hZ2VEYXRhIGltYWdlX2RhdGFfOworICAvLyBVc2VkIHdoZW4gdGhlIHBsdWdpbiBpcyBlbWJlZGRlZCBpbiBhIHBhZ2UgYW5kIHdlIGhhdmUgdG8gY3JlYXRlIHRoZSBsb2FkZXIKKyAgLy8gb3Vyc2VsZi4KKyAgcHA6OkNvbXBsZXRpb25DYWxsYmFja0ZhY3Rvcnk8SW5zdGFuY2U+IGxvYWRlcl9mYWN0b3J5XzsKKyAgcHA6OlVSTExvYWRlciBlbWJlZF9sb2FkZXJfOworICBwcDo6VVJMTG9hZGVyIGVtYmVkX3ByZXZpZXdfbG9hZGVyXzsKKworICBzY29wZWRfcHRyPHBwOjpTY3JvbGxiYXJfRGV2PiBoX3Njcm9sbGJhcl87CisgIHNjb3BlZF9wdHI8cHA6OlNjcm9sbGJhcl9EZXY+IHZfc2Nyb2xsYmFyXzsKKyAgaW50MzIgdmFsaWRfdl9yYW5nZV87CisKKyAgUFBfQ3Vyc29yVHlwZV9EZXYgY3Vyc29yXzsgIC8vIFRoZSBjdXJyZW50IGN1cnNvci4KKworICAvLyBVc2VkIHdoZW4gc2VsZWN0aW5nIGFuZCBkcmFnZ2luZyBiZXlvbmQgdGhlIHZpc2libGUgcG9ydGlvbiwgaW4gd2hpY2ggY2FzZQorICAvLyB3ZSB3YW50IHRvIHNjcm9sbCB0aGUgZG9jdW1lbnQuCisgIGJvb2wgdGltZXJfcGVuZGluZ187CisgIHBwOjpNb3VzZUlucHV0RXZlbnQgbGFzdF9tb3VzZV9ldmVudF87CisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tGYWN0b3J5PEluc3RhbmNlPiB0aW1lcl9mYWN0b3J5XzsKKyAgdWludDMyIGN1cnJlbnRfdGltZXJfaWRfOworCisgIC8vIFNpemUsIGluIHBpeGVscywgb2YgcGx1Z2luIHJlY3RhbmdsZS4KKyAgcHA6OlNpemUgcGx1Z2luX3NpemVfOworICAvLyBTaXplLCBpbiBESVBzLCBvZiBwbHVnaW4gcmVjdGFuZ2xlLgorICBwcDo6U2l6ZSBwbHVnaW5fZGlwX3NpemVfOworICAvLyBSZW1haW5pbmcgYXJlYSwgaW4gcGl4ZWxzLCB0byByZW5kZXIgdGhlIHBkZiBpbiBhZnRlciBhY2NvdW50aW5nIGZvcgorICAvLyBzY3JvbGxiYXJzL3Rvb2xiYXJzIGFuZCBob3Jpem9udGFsIGNlbnRlcmluZy4KKyAgcHA6OlJlY3QgYXZhaWxhYmxlX2FyZWFfOworICAvLyBTaXplIG9mIGVudGlyZSBkb2N1bWVudCBpbiBwaXhlbHMgKGkuZS4gaWYgZWFjaCBwYWdlIGlzIDgwMCBwaXhlbHMgaGlnaCBhbmQKKyAgLy8gdGhlcmUgYXJlIDEwIHBhZ2VzLCB0aGUgaGVpZ2h0IHdpbGwgYmUgODAwMCkuCisgIHBwOjpTaXplIGRvY3VtZW50X3NpemVfOworCisgIGRvdWJsZSB6b29tXzsgIC8vIEN1cnJlbnQgem9vbSBmYWN0b3IuCisKKyAgZmxvYXQgZGV2aWNlX3NjYWxlXzsgIC8vIEN1cnJlbnQgZGV2aWNlIHNjYWxlIGZhY3Rvci4KKyAgYm9vbCBwcmludGluZ19lbmFibGVkXzsKKyAgYm9vbCBoaWRwaV9lbmFibGVkXzsKKyAgLy8gVHJ1ZSBpZiB0aGUgcGx1Z2luIGlzIGZ1bGwtcGFnZS4KKyAgYm9vbCBmdWxsXzsKKyAgLy8gWm9vbWluZyBtb2RlIChub25lLCBmaXQgdG8gd2lkdGgsIGZpdCB0byBoZWlnaHQpCisgIFpvb21Nb2RlIHpvb21fbW9kZV87CisKKyAgLy8gSWYgdHJ1ZSwgdGhpcyBtZWFucyB3ZSB0b2xkIHRoZSBSZW5kZXJWaWV3IHRoYXQgd2UncmUgc3RhcnRpbmcgYSBuZXR3b3JrCisgIC8vIHJlcXVlc3Qgc28gdGhhdCBpdCBjYW4gc3RhcnQgdGhlIHRocm9iYmVyLiBXZSB3aWxsIHRlbGwgaXQgYWdhaW4gb25jZSB0aGUKKyAgLy8gZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZy4KKyAgYm9vbCBkaWRfY2FsbF9zdGFydF9sb2FkaW5nXzsKKworICAvLyBIb2xkIG9mZiBvbiBwYWludGluZyBpbnZhbGlkYXRlZCByZXF1ZXN0cyB3aGlsZSB0aGlzIGZsYWcgaXMgdHJ1ZS4KKyAgYm9vbCBkb250X3BhaW50XzsKKworICAvLyBJbmRpY2F0ZXMgaWYgcGx1Z2luIGlzIGluIGF1dG9zY3JvbGwgbW9kZS4KKyAgYm9vbCBpc19hdXRvc2Nyb2xsXzsKKyAgLy8gUmVjdCBmb3IgYXV0b3Njcm9sbCBhbmNob3IuCisgIHBwOjpSZWN0IGF1dG9zY3JvbGxfcmVjdF87CisgIC8vIEltYWdlIG9mIHRoZSBhdXRvc2Nyb2xsIGFuY2hvciBhbmQgaXRzIGJhY2tncm91bmQuCisgIHBwOjpJbWFnZURhdGEgYXV0b3Njcm9sbF9hbmNob3JfOworICAvLyBBdXRvc2Nyb2xsaW5nIGRlbHRhcyBpbiBwaXhlbHMuCisgIGludCBhdXRvc2Nyb2xsX3hfOworICBpbnQgYXV0b3Njcm9sbF95XzsKKworICAvLyBUaGlja25lc3Mgb2YgYSBzY3JvbGxiYXIuCisgIGludCBzY3JvbGxiYXJfdGhpY2tuZXNzXzsKKworICAvLyBSZXNlcnZlZCB0aGlja25lc3Mgb2YgYSBzY3JvbGxiYXIuIFRoaXMgaXMgaG93IG11Y2ggc3BhY2UgdGhlIHNjcm9sbGJhcgorICAvLyB0YWtlcyBmcm9tIHRoZSBhdmFpbGFibGUgYXJlYS4gMCBmb3Igb3ZlcmxheS4KKyAgaW50IHNjcm9sbGJhcl9yZXNlcnZlZF90aGlja25lc3NfOworCisgIC8vIFVzZWQgdG8gcmVtZW1iZXIgd2hpY2ggdG9vbGJhciBpcyBpbiB1c2UKKyAgY29uc3QgVG9vbGJhckJ1dHRvbkluZm8qIGN1cnJlbnRfdGJfaW5mb187CisgIHNpemVfdCBjdXJyZW50X3RiX2luZm9fc2l6ZV87CisKKyAgUGFpbnRNYW5hZ2VyIHBhaW50X21hbmFnZXJfOworCisgIHN0cnVjdCBCYWNrZ3JvdW5kUGFydCB7CisgICAgcHA6OlJlY3QgbG9jYXRpb247CisgICAgdWludDMyIGNvbG9yOworICB9OworICBzdGQ6OnZlY3RvcjxCYWNrZ3JvdW5kUGFydD4gYmFja2dyb3VuZF9wYXJ0c187CisKKyAgc3RydWN0IFByaW50U2V0dGluZ3MgeworICAgIFByaW50U2V0dGluZ3MoKSB7CisgICAgICBDbGVhcigpOworICAgIH0KKyAgICB2b2lkIENsZWFyKCkgeworICAgICAgaXNfcHJpbnRpbmcgPSBmYWxzZTsKKyAgICAgIHByaW50X3BhZ2VzX2NhbGxlZF8gPSBmYWxzZTsKKyAgICAgIG1lbXNldCgmcGVwcGVyX3ByaW50X3NldHRpbmdzLCAwLCBzaXplb2YocGVwcGVyX3ByaW50X3NldHRpbmdzKSk7CisgICAgfQorICAgIC8vIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiBQcmludEJlZ2luIGlzIGNhbGxlZCBhbmQgZmFsc2Ugd2hlbiBQcmludEVuZCBpcworICAgIC8vIGNhbGxlZC4KKyAgICBib29sIGlzX3ByaW50aW5nOworICAgIC8vIFRvIGtub3cgd2hldGhlciB0aGlzIHdhcyBhbiBhY3R1YWwgcHJpbnQgb3BlcmF0aW9uLCBzbyB3ZSBkb24ndCBkb3VibGUKKyAgICAvLyBjb3VudCBVTUEgbG9nZ2luZy4KKyAgICBib29sIHByaW50X3BhZ2VzX2NhbGxlZF87CisgICAgUFBfUHJpbnRTZXR0aW5nc19EZXYgcGVwcGVyX3ByaW50X3NldHRpbmdzOworICB9OworCisgIFByaW50U2V0dGluZ3MgcHJpbnRfc2V0dGluZ3NfOworCisgIHNjb3BlZF9wdHI8UERGRW5naW5lPiBlbmdpbmVfOworCisgIC8vIFRoaXMgZW5naW5lIGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBpbmRpdmlkdWFsIHByZXZpZXcgcGFnZSBkYXRhLiBUaGlzIGlzCisgIC8vIHVzZWQgb25seSBpbiBwcmludCBwcmV2aWV3IG1vZGUuIFRoaXMgd2lsbCB1c2UgfFByZXZpZXdNb2RlQ2xpZW50fAorICAvLyBpbnRlcmZhY2Ugd2hpY2ggaGFzIHZlcnkgbGltaXRlZCBhY2Nlc3MgdG8gdGhlIHBwOjpJbnN0YW5jZS4KKyAgc2NvcGVkX3B0cjxQREZFbmdpbmU+IHByZXZpZXdfZW5naW5lXzsKKworICBzdGQ6OnN0cmluZyB1cmxfOworCisgIHNjb3BlZF9wdHI8RmFkaW5nQ29udHJvbHM+IHRvb2xiYXJfOworICBUaHVtYm5haWxDb250cm9sIHRodW1ibmFpbHNfOworICBQcm9ncmVzc0NvbnRyb2wgcHJvZ3Jlc3NfYmFyXzsKKyAgdWludDMyIGRlbGF5ZWRfcHJvZ3Jlc3NfdGltZXJfaWRfOworICBQYWdlSW5kaWNhdG9yIHBhZ2VfaW5kaWNhdG9yXzsKKworICAvLyBVc2VkIGZvciBjcmVhdGluZyBpbWFnZXMgZnJvbSBudW1iZXJzLgorICBzY29wZWRfcHRyPE51bWJlckltYWdlR2VuZXJhdG9yPiBudW1iZXJfaW1hZ2VfZ2VuZXJhdG9yXzsKKworICAvLyBVc2VkIGZvciBzdWJtaXR0aW5nIGZvcm1zLgorICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrRmFjdG9yeTxJbnN0YW5jZT4gZm9ybV9mYWN0b3J5XzsKKyAgcHA6OlVSTExvYWRlciBmb3JtX2xvYWRlcl87CisKKyAgLy8gVXNlZCBmb3IgZ2VuZXJhdGluZyBjYWxsYmFja3MuCisgIC8vIFRPRE8ocmF5bWVzKTogV2UgZG9uJ3QgcmVhbGx5IG5lZWQgb3RoZXIgY2FsbGJhY2sgZmFjdG9yaWVzIHdlIGNhbiBqdXN0CisgIC8vIGZvbGQgdGhlbSBpbnRvIHRoaXMgb25lLgorICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrRmFjdG9yeTxJbnN0YW5jZT4gY2FsbGJhY2tfZmFjdG9yeV87CisKKyAgLy8gVHJ1ZSBpZiB3ZSBoYXZlbid0IHBhaW50ZWQgdGhlIHBsdWdpbiB2aWV3cG9ydCB5ZXQuCisgIGJvb2wgZmlyc3RfcGFpbnRfOworCisgIC8vIFRydWUgd2hlbiB3ZSd2ZSBwYWludGVkIGF0IGxlYXN0IG9uZSBwYWdlIGZyb20gdGhlIGRvY3VtZW50LgorICBib29sIHBhaW50ZWRfZmlyc3RfcGFnZV87CisKKyAgLy8gVHJ1ZSBpZiB3ZSBzaG91bGQgZGlzcGxheSBwYWdlIGluZGljYXRvciwgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgc2hvd19wYWdlX2luZGljYXRvcl87CisKKyAgLy8gQ2FsbGJhY2sgd2hlbiB0aGUgZG9jdW1lbnQgbG9hZCBjb21wbGV0ZXMuCisgIHBwOjpWYXIgb25fbG9hZF9jYWxsYmFja187CisgIHBwOjpWYXIgb25fc2Nyb2xsX2NhbGxiYWNrXzsKKyAgcHA6OlZhciBvbl9wbHVnaW5fc2l6ZV9jaGFuZ2VkX2NhbGxiYWNrXzsKKworICBEb2N1bWVudExvYWRTdGF0ZSBkb2N1bWVudF9sb2FkX3N0YXRlXzsKKyAgRG9jdW1lbnRMb2FkU3RhdGUgcHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXzsKKworICAvLyBKYXZhU2NyaXB0IGludGVyZmFjZSB0byBjb250cm9sIHRoaXMgaW5zdGFuY2UuCisgIC8vIFRoaXMgd3JhcHMgYSBQREZTY3JpcHRhYmxlT2JqZWN0IGluIGEgcHA6OlZhci4KKyAgcHA6OlZhclByaXZhdGUgaW5zdGFuY2Vfb2JqZWN0XzsKKworICAvLyBVc2VkIHNvIHRoYXQgd2Ugb25seSB0ZWxsIHRoZSBicm93c2VyIG9uY2UgYWJvdXQgYW4gdW5zdXBwb3J0ZWQgZmVhdHVyZSwgdG8KKyAgLy8gYXZvaWQgdGhlIGluZm9iYXIgZ29pbmcgdXAgbW9yZSB0aGFuIG9uY2UuCisgIGJvb2wgdG9sZF9icm93c2VyX2Fib3V0X3Vuc3VwcG9ydGVkX2ZlYXR1cmVfOworCisgIC8vIEtlZXBzIHRyYWNrIG9mIHdoaWNoIHVuc3VwcG9ydGVkIGZlYXR1cmVzIHdlIHJlcG9ydGVkLCBzbyB3ZSBhdm9pZCBzcGFtbWluZworICAvLyB0aGUgc3RhdHMgaWYgYSBmZWF0dXJlIHNob3dzIHVwIG1hbnkgdGltZXMgcGVyIGRvY3VtZW50LgorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdW5zdXBwb3J0ZWRfZmVhdHVyZXNfcmVwb3J0ZWRfOworCisgIC8vIE51bWJlciBvZiBwYWdlcyBpbiBwcmludCBwcmV2aWV3IG1vZGUsIDAgaWYgbm90IGluIHByaW50IHByZXZpZXcgbW9kZS4KKyAgaW50IHByaW50X3ByZXZpZXdfcGFnZV9jb3VudF87CisgIHN0ZDo6dmVjdG9yPGludD4gcHJpbnRfcHJldmlld19wYWdlX251bWJlcnNfOworCisgIC8vIFVzZWQgdG8gbWFuYWdlIGxvYWRlZCBwcmludCBwcmV2aWV3IHBhZ2UgaW5mb3JtYXRpb24uIEEgfFByZXZpZXdQYWdlSW5mb3wKKyAgLy8gY29uc2lzdHMgb2YgZGF0YSBzb3VyY2UgdXJsIHN0cmluZyBhbmQgdGhlIHBhZ2UgaW5kZXggaW4gdGhlIGRlc3RpbmF0aW9uCisgIC8vIGRvY3VtZW50LgorICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiBQcmV2aWV3UGFnZUluZm87CisgIHN0ZDo6cXVldWU8UHJldmlld1BhZ2VJbmZvPiBwcmV2aWV3X3BhZ2VzX2luZm9fOworCisgIC8vIFVzZWQgdG8gc2lnbmFsIHRoZSBicm93c2VyIGFib3V0IGZvY3VzIGNoYW5nZXMgdG8gdHJpZ2dlciB0aGUgT1NLLgorICAvLyBUT0RPKGFib2RlbmhhQGNocm9taXVtLm9yZykgSW1wbGVtZW50IGZ1bGwgSU1FIHN1cHBvcnQgaW4gdGhlIHBsdWdpbi4KKyAgLy8gaHR0cDovL2NyYnVnLmNvbS8xMzI1NjUKKyAgc2NvcGVkX3B0cjxwcDo6VGV4dElucHV0X0Rldj4gdGV4dF9pbnB1dF87Cit9OworCisvLyBUaGlzIGltcGxlbWVudHMgdGhlIEphdmFTY3JpcHQgY2xhc3MgZW50cnlwb2ludCBmb3IgdGhlIHBsdWdpbiBpbnN0YW5jZS4KKy8vIFRoaXMgY2xhc3MgaXMganVzdCBhIHRoaW4gd3JhcHBlci4gSXQgZGVsZWdhdGVzIHJlbGV2YW50IG1ldGhvZHMgdG8gSW5zdGFuY2UuCitjbGFzcyBQREZTY3JpcHRhYmxlT2JqZWN0IDogcHVibGljIHBwOjpkZXByZWNhdGVkOjpTY3JpcHRhYmxlT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBERlNjcmlwdGFibGVPYmplY3QoSW5zdGFuY2UqIGluc3RhbmNlKTsKKyAgdmlydHVhbCB+UERGU2NyaXB0YWJsZU9iamVjdCgpOworCisgIC8vIHBwOjpkZXByZWNhdGVkOjpTY3JpcHRhYmxlT2JqZWN0IGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIGJvb2wgSGFzTWV0aG9kKGNvbnN0IHBwOjpWYXImIG1ldGhvZCwgcHA6OlZhciogZXhjZXB0aW9uKTsKKyAgdmlydHVhbCBwcDo6VmFyIENhbGwoY29uc3QgcHA6OlZhciYgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6VmFyPiYgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgcHA6OlZhciogZXhjZXB0aW9uKTsKKworIHByaXZhdGU6CisgIEluc3RhbmNlKiBpbnN0YW5jZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9JTlNUQU5DRV9IXwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL251bWJlcl9pbWFnZV9nZW5lcmF0b3IuY2MgYi94ZmFfdGVzdC9wZGYvbnVtYmVyX2ltYWdlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk2OTE1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL251bWJlcl9pbWFnZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw4MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9udW1iZXJfaW1hZ2VfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJwZGYvZHJhd191dGlscy5oIgorI2luY2x1ZGUgInBkZi9pbnN0YW5jZS5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NvbnN0IGludCBrUGFnZU51bWJlclNlcGFyYXRvciA9IDA7Citjb25zdCBpbnQga1BhZ2VOdW1iZXJPcmlnaW5YID0gODsKK2NvbnN0IGludCBrUGFnZU51bWJlck9yaWdpblkgPSA0OworCitOdW1iZXJJbWFnZUdlbmVyYXRvcjo6TnVtYmVySW1hZ2VHZW5lcmF0b3IoSW5zdGFuY2UqIGluc3RhbmNlKQorICAgIDogaW5zdGFuY2VfKGluc3RhbmNlKSwKKyAgICAgIGRldmljZV9zY2FsZV8oMS4wZikgeworfQorCitOdW1iZXJJbWFnZUdlbmVyYXRvcjo6fk51bWJlckltYWdlR2VuZXJhdG9yKCkgeworfQorCit2b2lkIE51bWJlckltYWdlR2VuZXJhdG9yOjpDb25maWd1cmUoY29uc3QgcHA6OkltYWdlRGF0YSYgbnVtYmVyX2JhY2tncm91bmQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4mIG51bWJlcl9pbWFnZXMsIGZsb2F0IGRldmljZV9zY2FsZSkgeworICBudW1iZXJfYmFja2dyb3VuZF8gPSBudW1iZXJfYmFja2dyb3VuZDsKKyAgbnVtYmVyX2ltYWdlc18gPSBudW1iZXJfaW1hZ2VzOworICBkZXZpY2Vfc2NhbGVfID0gZGV2aWNlX3NjYWxlOworfQorCit2b2lkIE51bWJlckltYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUltYWdlKAorICAgIGludCBwYWdlX251bWJlciwgcHA6OkltYWdlRGF0YSogaW1hZ2UpIHsKKyAgY2hhciBidWZmZXJbMTJdOworICBiYXNlOjpzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXUiLCBwYWdlX251bWJlcik7CisgIGludCBleHRyYV93aWR0aCA9IDA7CisgIERDSEVDSyhudW1iZXJfaW1hZ2VzXy5zaXplKCkgPj0gMTApOworICBEQ0hFQ0soIW51bWJlcl9iYWNrZ3JvdW5kXy5pc19udWxsKCkpOworICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHN0cmxlbihidWZmZXIpOyArK2kpIHsKKyAgICBpbnQgaW5kZXggPSBidWZmZXJbaV0gLSAnMCc7CisgICAgZXh0cmFfd2lkdGggKz0gbnVtYmVyX2ltYWdlc19baW5kZXhdLnNpemUoKS53aWR0aCgpOworICAgIGV4dHJhX3dpZHRoICs9IHN0YXRpY19jYXN0PGludD4oa1BhZ2VOdW1iZXJTZXBhcmF0b3IgKiBkZXZpY2Vfc2NhbGVfKTsKKyAgfQorCisgICppbWFnZSA9IHBwOjpJbWFnZURhdGEoCisgICAgICBpbnN0YW5jZV8sCisgICAgICBQUF9JTUFHRURBVEFGT1JNQVRfQkdSQV9QUkVNVUwsCisgICAgICBwcDo6U2l6ZShudW1iZXJfYmFja2dyb3VuZF8uc2l6ZSgpLndpZHRoKCkgKyBleHRyYV93aWR0aCwKKyAgICAgICAgICAgICAgIG51bWJlcl9iYWNrZ3JvdW5kXy5zaXplKCkuaGVpZ2h0KCkpLAorICAgICAgZmFsc2UpOworCisgIGludCBzdHJldGNoX3BvaW50ID0gbnVtYmVyX2JhY2tncm91bmRfLnNpemUoKS53aWR0aCgpIC8gMjsKKworICBwcDo6UmVjdCBzcmNfcmMoMCwgMCwgc3RyZXRjaF9wb2ludCwgbnVtYmVyX2JhY2tncm91bmRfLnNpemUoKS5oZWlnaHQoKSk7CisgIHBwOjpSZWN0IGRlc3RfcmMoc3JjX3JjKTsKKyAgQ29weUltYWdlKG51bWJlcl9iYWNrZ3JvdW5kXywgc3JjX3JjLCBpbWFnZSwgZGVzdF9yYywgZmFsc2UpOworICBzcmNfcmMuT2Zmc2V0KG51bWJlcl9iYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAtIHN0cmV0Y2hfcG9pbnQsIDApOworICBkZXN0X3JjLk9mZnNldChpbWFnZS0+c2l6ZSgpLndpZHRoKCkgLSBzdHJldGNoX3BvaW50LCAwKTsKKyAgQ29weUltYWdlKG51bWJlcl9iYWNrZ3JvdW5kXywgc3JjX3JjLCBpbWFnZSwgZGVzdF9yYywgZmFsc2UpOworICBzcmNfcmMgPSBwcDo6UmVjdChzdHJldGNoX3BvaW50LCAwLCAxLCBudW1iZXJfYmFja2dyb3VuZF8uc2l6ZSgpLmhlaWdodCgpKTsKKyAgZGVzdF9yYyA9IHNyY19yYzsKKyAgZGVzdF9yYy5zZXRfd2lkdGgoZXh0cmFfd2lkdGggKyAxKTsKKyAgQ29weUltYWdlKG51bWJlcl9iYWNrZ3JvdW5kXywgc3JjX3JjLCBpbWFnZSwgZGVzdF9yYywgdHJ1ZSk7CisKKyAgcHA6OlBvaW50IG9yaWdpbihzdGF0aWNfY2FzdDxpbnQ+KGtQYWdlTnVtYmVyT3JpZ2luWCAqIGRldmljZV9zY2FsZV8pLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oa1BhZ2VOdW1iZXJPcmlnaW5ZICogZGV2aWNlX3NjYWxlXykpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihidWZmZXIpOyArK2kpIHsKKyAgICBpbnQgaW5kZXggPSBidWZmZXJbaV0gLSAnMCc7CisgICAgQ29weUltYWdlKAorICAgICAgICBudW1iZXJfaW1hZ2VzX1tpbmRleF0sCisgICAgICAgIHBwOjpSZWN0KHBwOjpQb2ludCgpLCBudW1iZXJfaW1hZ2VzX1tpbmRleF0uc2l6ZSgpKSwKKyAgICAgICAgaW1hZ2UsIHBwOjpSZWN0KG9yaWdpbiwgbnVtYmVyX2ltYWdlc19baW5kZXhdLnNpemUoKSksIGZhbHNlKTsKKyAgICBvcmlnaW4gKz0gcHA6OlBvaW50KAorICAgICAgICBudW1iZXJfaW1hZ2VzX1tpbmRleF0uc2l6ZSgpLndpZHRoKCkgKworICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGtQYWdlTnVtYmVyU2VwYXJhdG9yICogZGV2aWNlX3NjYWxlXyksIDApOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9udW1iZXJfaW1hZ2VfZ2VuZXJhdG9yLmggYi94ZmFfdGVzdC9wZGYvbnVtYmVyX2ltYWdlX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmZkM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvbnVtYmVyX2ltYWdlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX05VTUJFUl9JTUFHRV9HRU5FUkFUT1JfSAorI2RlZmluZSBQREZfTlVNQkVSX0lNQUdFX0dFTkVSQVRPUl9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcGFwaS9jcHAvaW1hZ2VfZGF0YS5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NsYXNzIEluc3RhbmNlOworCitjbGFzcyBOdW1iZXJJbWFnZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBOdW1iZXJJbWFnZUdlbmVyYXRvcihJbnN0YW5jZSogaW5zdGFuY2UpOworICB2aXJ0dWFsIH5OdW1iZXJJbWFnZUdlbmVyYXRvcigpOworCisgIHZvaWQgQ29uZmlndXJlKGNvbnN0IHBwOjpJbWFnZURhdGEmIG51bWJlcl9iYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiYgbnVtYmVyX2ltYWdlcywKKyAgICAgICAgICAgICAgICAgZmxvYXQgZGV2aWNlX3NjYWxlKTsKKworICB2b2lkIEdlbmVyYXRlSW1hZ2UoaW50IHBhZ2VfbnVtYmVyLCBwcDo6SW1hZ2VEYXRhKiBpbWFnZSk7CisKKyBwcml2YXRlOgorICBJbnN0YW5jZSogaW5zdGFuY2VfOworICBwcDo6SW1hZ2VEYXRhIG51bWJlcl9iYWNrZ3JvdW5kXzsKKyAgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4gbnVtYmVyX2ltYWdlc187CisgIGZsb2F0IGRldmljZV9zY2FsZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9OVU1CRVJfSU1BR0VfR0VORVJBVE9SX0gKKwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL291dF9vZl9wcm9jZXNzX2luc3RhbmNlLmNjIGIveGZhX3Rlc3QvcGRmL291dF9vZl9wcm9jZXNzX2luc3RhbmNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjdkYzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvb3V0X29mX3Byb2Nlc3NfaW5zdGFuY2UuY2MKQEAgLTAsMCArMSwxMzY5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicGRmL291dF9vZl9wcm9jZXNzX2luc3RhbmNlLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+ICAvLyBmb3IgbWluL21heCgpCisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTICAvLyBmb3IgTV9QSQorI2luY2x1ZGUgPGNtYXRoPiAgICAgIC8vIGZvciBsb2coKSBhbmQgcG93KCkKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgImJhc2UvanNvbi9qc29uX3JlYWRlci5oIgorI2luY2x1ZGUgImJhc2UvanNvbi9qc29uX3dyaXRlci5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ19zcGxpdC5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCisjaW5jbHVkZSAiY2hyb21lL2NvbW1vbi9jb250ZW50X3Jlc3RyaWN0aW9uLmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvZXNjYXBlLmgiCisjaW5jbHVkZSAicGRmL3BkZi5oIgorI2luY2x1ZGUgInBwYXBpL2MvZGV2L3BwYl9jdXJzb3JfY29udHJvbF9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jL3BwX2Vycm9ycy5oIgorI2luY2x1ZGUgInBwYXBpL2MvcHBfcmVjdC5oIgorI2luY2x1ZGUgInBwYXBpL2MvcHJpdmF0ZS9wcGJfaW5zdGFuY2VfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInBwYXBpL2MvcHJpdmF0ZS9wcHBfcGRmLmgiCisjaW5jbHVkZSAicHBhcGkvYy90cnVzdGVkL3BwYl91cmxfbG9hZGVyX3RydXN0ZWQuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvY29yZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvbWVtb3J5X2Rldi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvdGV4dF9pbnB1dF9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvZGV2L3VybF91dGlsX2Rldi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9tb2R1bGUuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcG9pbnQuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS9wZGYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS92YXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9yZWN0LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3Jlc291cmNlLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3VybF9yZXF1ZXN0X2luZm8uaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvdmFyX2FycmF5LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3Zhcl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAidWkvZXZlbnRzL2tleWNvZGVzL2tleWJvYXJkX2NvZGVzLmgiCisKKyNpZiBkZWZpbmVkKE9TX01BQ09TWCkKKyNpbmNsdWRlICJiYXNlL21hYy9tYWNfdXRpbC5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY29uc3QgY2hhciBrQ2hyb21lUHJpbnRbXSA9ICJjaHJvbWU6Ly9wcmludC8iOworY29uc3QgY2hhciBrQ2hyb21lRXh0ZW5zaW9uW10gPQorICAgICJjaHJvbWUtZXh0ZW5zaW9uOi8vbWhqZmJtZGdjZmpiYnBhZW9qb2ZvaG9lZmdpZWhqYWkiOworCisvLyBEaWN0aW9uYXJ5IFZhbHVlIGtleSBuYW1lcyBmb3IgdGhlIGRvY3VtZW50IGFjY2Vzc2liaWxpdHkgaW5mbworY29uc3QgY2hhciBrQWNjZXNzaWJsZU51bWJlck9mUGFnZXNbXSA9ICJudW1iZXJPZlBhZ2VzIjsKK2NvbnN0IGNoYXIga0FjY2Vzc2libGVMb2FkZWRbXSA9ICJsb2FkZWQiOworY29uc3QgY2hhciBrQWNjZXNzaWJsZUNvcHlhYmxlW10gPSAiY29weWFibGUiOworCisvLyBDb25zdGFudHMgdXNlZCBpbiBoYW5kbGluZyBwb3N0TWVzc2FnZSgpIG1lc3NhZ2VzLgorY29uc3QgY2hhciBrVHlwZVtdID0gInR5cGUiOworLy8gVmlld3BvcnQgbWVzc2FnZSBhcmd1bWVudHMuIChQYWdlIC0+IFBsdWdpbikuCitjb25zdCBjaGFyIGtKU1ZpZXdwb3J0VHlwZVtdID0gInZpZXdwb3J0IjsKK2NvbnN0IGNoYXIga0pTWE9mZnNldFtdID0gInhPZmZzZXQiOworY29uc3QgY2hhciBrSlNZT2Zmc2V0W10gPSAieU9mZnNldCI7Citjb25zdCBjaGFyIGtKU1pvb21bXSA9ICJ6b29tIjsKKy8vIFN0b3Agc2Nyb2xsaW5nIG1lc3NhZ2UgKFBhZ2UgLT4gUGx1Z2luKQorY29uc3QgY2hhciBrSlNTdG9wU2Nyb2xsaW5nVHlwZVtdID0gInN0b3BTY3JvbGxpbmciOworLy8gRG9jdW1lbnQgZGltZW5zaW9uIGFyZ3VtZW50cyAoUGx1Z2luIC0+IFBhZ2UpLgorY29uc3QgY2hhciBrSlNEb2N1bWVudERpbWVuc2lvbnNUeXBlW10gPSAiZG9jdW1lbnREaW1lbnNpb25zIjsKK2NvbnN0IGNoYXIga0pTRG9jdW1lbnRXaWR0aFtdID0gIndpZHRoIjsKK2NvbnN0IGNoYXIga0pTRG9jdW1lbnRIZWlnaHRbXSA9ICJoZWlnaHQiOworY29uc3QgY2hhciBrSlNQYWdlRGltZW5zaW9uc1tdID0gInBhZ2VEaW1lbnNpb25zIjsKK2NvbnN0IGNoYXIga0pTUGFnZVhbXSA9ICJ4IjsKK2NvbnN0IGNoYXIga0pTUGFnZVlbXSA9ICJ5IjsKK2NvbnN0IGNoYXIga0pTUGFnZVdpZHRoW10gPSAid2lkdGgiOworY29uc3QgY2hhciBrSlNQYWdlSGVpZ2h0W10gPSAiaGVpZ2h0IjsKKy8vIERvY3VtZW50IGxvYWQgcHJvZ3Jlc3MgYXJndW1lbnRzIChQbHVnaW4gLT4gUGFnZSkKK2NvbnN0IGNoYXIga0pTTG9hZFByb2dyZXNzVHlwZVtdID0gImxvYWRQcm9ncmVzcyI7Citjb25zdCBjaGFyIGtKU1Byb2dyZXNzUGVyY2VudGFnZVtdID0gInByb2dyZXNzIjsKKy8vIEdldCBwYXNzd29yZCBhcmd1bWVudHMgKFBsdWdpbiAtPiBQYWdlKQorY29uc3QgY2hhciBrSlNHZXRQYXNzd29yZFR5cGVbXSA9ICJnZXRQYXNzd29yZCI7CisvLyBHZXQgcGFzc3dvcmQgY29tcGxldGUgYXJndW1lbnRzIChQYWdlIC0+IFBsdWdpbikKK2NvbnN0IGNoYXIga0pTR2V0UGFzc3dvcmRDb21wbGV0ZVR5cGVbXSA9ICJnZXRQYXNzd29yZENvbXBsZXRlIjsKK2NvbnN0IGNoYXIga0pTUGFzc3dvcmRbXSA9ICJwYXNzd29yZCI7CisvLyBQcmludCAoUGFnZSAtPiBQbHVnaW4pCitjb25zdCBjaGFyIGtKU1ByaW50VHlwZVtdID0gInByaW50IjsKKy8vIEdvIHRvIHBhZ2UgKFBsdWdpbiAtPiBQYWdlKQorY29uc3QgY2hhciBrSlNHb1RvUGFnZVR5cGVbXSA9ICJnb1RvUGFnZSI7Citjb25zdCBjaGFyIGtKU1BhZ2VOdW1iZXJbXSA9ICJwYWdlIjsKKy8vIFJlc2V0IHByaW50IHByZXZpZXcgbW9kZSAoUGFnZSAtPiBQbHVnaW4pCitjb25zdCBjaGFyIGtKU1Jlc2V0UHJpbnRQcmV2aWV3TW9kZVR5cGVbXSA9ICJyZXNldFByaW50UHJldmlld01vZGUiOworY29uc3QgY2hhciBrSlNQcmludFByZXZpZXdVcmxbXSA9ICJ1cmwiOworY29uc3QgY2hhciBrSlNQcmludFByZXZpZXdHcmF5c2NhbGVbXSA9ICJncmF5c2NhbGUiOworY29uc3QgY2hhciBrSlNQcmludFByZXZpZXdQYWdlQ291bnRbXSA9ICJwYWdlQ291bnQiOworLy8gTG9hZCBwcmV2aWV3IHBhZ2UgKFBhZ2UgLT4gUGx1Z2luKQorY29uc3QgY2hhciBrSlNMb2FkUHJldmlld1BhZ2VUeXBlW10gPSAibG9hZFByZXZpZXdQYWdlIjsKK2NvbnN0IGNoYXIga0pTUHJldmlld1BhZ2VVcmxbXSA9ICJ1cmwiOworY29uc3QgY2hhciBrSlNQcmV2aWV3UGFnZUluZGV4W10gPSAiaW5kZXgiOworLy8gU2V0IHNjcm9sbCBwb3NpdGlvbiAoUGx1Z2luIC0+IFBhZ2UpCitjb25zdCBjaGFyIGtKU1NldFNjcm9sbFBvc2l0aW9uVHlwZVtdID0gInNldFNjcm9sbFBvc2l0aW9uIjsKK2NvbnN0IGNoYXIga0pTUG9zaXRpb25YW10gPSAieCI7Citjb25zdCBjaGFyIGtKU1Bvc2l0aW9uWVtdID0gInkiOworLy8gU2V0IHRyYW5zbGF0ZWQgc3RyaW5ncyAoUGx1Z2luIC0+IFBhZ2UpCitjb25zdCBjaGFyIGtKU1NldFRyYW5zbGF0ZWRTdHJpbmdzVHlwZVtdID0gInNldFRyYW5zbGF0ZWRTdHJpbmdzIjsKK2NvbnN0IGNoYXIga0pTR2V0UGFzc3dvcmRTdHJpbmdbXSA9ICJnZXRQYXNzd29yZFN0cmluZyI7Citjb25zdCBjaGFyIGtKU0xvYWRpbmdTdHJpbmdbXSA9ICJsb2FkaW5nU3RyaW5nIjsKK2NvbnN0IGNoYXIga0pTTG9hZEZhaWxlZFN0cmluZ1tdID0gImxvYWRGYWlsZWRTdHJpbmciOworLy8gUmVxdWVzdCBhY2Nlc3NpYmlsaXR5IEpTT04gZGF0YSAoUGFnZSAtPiBQbHVnaW4pCitjb25zdCBjaGFyIGtKU0dldEFjY2Vzc2liaWxpdHlKU09OVHlwZVtdID0gImdldEFjY2Vzc2liaWxpdHlKU09OIjsKK2NvbnN0IGNoYXIga0pTQWNjZXNzaWJpbGl0eVBhZ2VOdW1iZXJbXSA9ICJwYWdlIjsKKy8vIFJlcGx5IHdpdGggYWNjZXNzaWJpbGl0eSBKU09OIGRhdGEgKFBsdWdpbiAtPiBQYWdlKQorY29uc3QgY2hhciBrSlNHZXRBY2Nlc3NpYmlsaXR5SlNPTlJlcGx5VHlwZVtdID0gImdldEFjY2Vzc2liaWxpdHlKU09OUmVwbHkiOworY29uc3QgY2hhciBrSlNBY2Nlc3NpYmlsaXR5SlNPTltdID0gImpzb24iOworLy8gQ2FuY2VsIHRoZSBzdHJlYW0gVVJMIHJlcXVlc3QgKFBsdWdpbiAtPiBQYWdlKQorY29uc3QgY2hhciBrSlNDYW5jZWxTdHJlYW1VcmxUeXBlW10gPSAiY2FuY2VsU3RyZWFtVXJsIjsKKy8vIE5hdmlnYXRlIHRvIHRoZSBnaXZlbiBVUkwgKFBsdWdpbiAtPiBQYWdlKQorY29uc3QgY2hhciBrSlNOYXZpZ2F0ZVR5cGVbXSA9ICJuYXZpZ2F0ZSI7Citjb25zdCBjaGFyIGtKU05hdmlnYXRlVXJsW10gPSAidXJsIjsKK2NvbnN0IGNoYXIga0pTTmF2aWdhdGVOZXdUYWJbXSA9ICJuZXdUYWIiOworLy8gT3BlbiB0aGUgZW1haWwgZWRpdG9yIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMgKFBsdWdpbiAtPiBQYWdlKQorY29uc3QgY2hhciBrSlNFbWFpbFR5cGVbXSA9ICJlbWFpbCI7Citjb25zdCBjaGFyIGtKU0VtYWlsVG9bXSA9ICJ0byI7Citjb25zdCBjaGFyIGtKU0VtYWlsQ2NbXSA9ICJjYyI7Citjb25zdCBjaGFyIGtKU0VtYWlsQmNjW10gPSAiYmNjIjsKK2NvbnN0IGNoYXIga0pTRW1haWxTdWJqZWN0W10gPSAic3ViamVjdCI7Citjb25zdCBjaGFyIGtKU0VtYWlsQm9keVtdID0gImJvZHkiOworLy8gUm90YXRpb24gKFBhZ2UgLT4gUGx1Z2luKQorY29uc3QgY2hhciBrSlNSb3RhdGVDbG9ja3dpc2VUeXBlW10gPSAicm90YXRlQ2xvY2t3aXNlIjsKK2NvbnN0IGNoYXIga0pTUm90YXRlQ291bnRlcmNsb2Nrd2lzZVR5cGVbXSA9ICJyb3RhdGVDb3VudGVyY2xvY2t3aXNlIjsKKy8vIFNlbGVjdCBhbGwgdGV4dCBpbiB0aGUgZG9jdW1lbnQgKFBhZ2UgLT4gUGx1Z2luKQorY29uc3QgY2hhciBrSlNTZWxlY3RBbGxUeXBlW10gPSAic2VsZWN0QWxsIjsKKworY29uc3QgaW50IGtGaW5kUmVzdWx0Q29vbGRvd25NcyA9IDEwMDsKKworY29uc3QgZG91YmxlIGtNaW5ab29tID0gMC4wMTsKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0IGNoYXIga1BQUFBkZkludGVyZmFjZVtdID0gUFBQX1BERl9JTlRFUkZBQ0VfMTsKKworUFBfVmFyIEdldExpbmtBdFBvc2l0aW9uKFBQX0luc3RhbmNlIGluc3RhbmNlLCBQUF9Qb2ludCBwb2ludCkgeworICBwcDo6VmFyIHZhcjsKKyAgdm9pZCogb2JqZWN0ID0gcHA6Okluc3RhbmNlOjpHZXRQZXJJbnN0YW5jZU9iamVjdChpbnN0YW5jZSwga1BQUFBkZkludGVyZmFjZSk7CisgIGlmIChvYmplY3QpIHsKKyAgICB2YXIgPSBzdGF0aWNfY2FzdDxPdXRPZlByb2Nlc3NJbnN0YW5jZSo+KG9iamVjdCktPkdldExpbmtBdFBvc2l0aW9uKAorICAgICAgICBwcDo6UG9pbnQocG9pbnQpKTsKKyAgfQorICByZXR1cm4gdmFyLkRldGFjaCgpOworfQorCit2b2lkIFRyYW5zZm9ybShQUF9JbnN0YW5jZSBpbnN0YW5jZSwgUFBfUHJpdmF0ZVBhZ2VUcmFuc2Zvcm1UeXBlIHR5cGUpIHsKKyAgdm9pZCogb2JqZWN0ID0KKyAgICAgIHBwOjpJbnN0YW5jZTo6R2V0UGVySW5zdGFuY2VPYmplY3QoaW5zdGFuY2UsIGtQUFBQZGZJbnRlcmZhY2UpOworICBpZiAob2JqZWN0KSB7CisgICAgT3V0T2ZQcm9jZXNzSW5zdGFuY2UqIG9ial9pbnN0YW5jZSA9CisgICAgICAgIHN0YXRpY19jYXN0PE91dE9mUHJvY2Vzc0luc3RhbmNlKj4ob2JqZWN0KTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgUFBfUFJJVkFURVBBR0VUUkFOU0ZPUk1UWVBFX1JPVEFURV85MF9DVzoKKyAgICAgICAgb2JqX2luc3RhbmNlLT5Sb3RhdGVDbG9ja3dpc2UoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQX1BSSVZBVEVQQUdFVFJBTlNGT1JNVFlQRV9ST1RBVEVfOTBfQ0NXOgorICAgICAgICBvYmpfaW5zdGFuY2UtPlJvdGF0ZUNvdW50ZXJjbG9ja3dpc2UoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK2NvbnN0IFBQUF9QZGYgcHBwX3ByaXZhdGUgPSB7CisgICZHZXRMaW5rQXRQb3NpdGlvbiwKKyAgJlRyYW5zZm9ybQorfTsKKworaW50IEV4dHJhY3RQcmludFByZXZpZXdQYWdlSW5kZXgoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY191cmwpIHsKKyAgLy8gU2FtcGxlIHxzcmNfdXJsfCBmb3JtYXQ6IGNocm9tZTovL3ByaW50L2lkL3BhZ2VfaW5kZXgvcHJpbnQucGRmCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1cmxfc3Vic3RyOworICBiYXNlOjpTcGxpdFN0cmluZyhzcmNfdXJsLnN1YnN0cihzdHJsZW4oa0Nocm9tZVByaW50KSksICcvJywgJnVybF9zdWJzdHIpOworICBpZiAodXJsX3N1YnN0ci5zaXplKCkgIT0gMykKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHVybF9zdWJzdHJbMl0gIT0gInByaW50LnBkZiIpCisgICAgcmV0dXJuIC0xOworCisgIGludCBwYWdlX2luZGV4ID0gMDsKKyAgaWYgKCFiYXNlOjpTdHJpbmdUb0ludCh1cmxfc3Vic3RyWzFdLCAmcGFnZV9pbmRleCkpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gcGFnZV9pbmRleDsKK30KKworYm9vbCBJc1ByaW50UHJldmlld1VybChjb25zdCBzdGQ6OnN0cmluZyYgdXJsKSB7CisgIHJldHVybiB1cmwuc3Vic3RyKDAsIHN0cmxlbihrQ2hyb21lUHJpbnQpKSA9PSBrQ2hyb21lUHJpbnQ7Cit9CisKK3ZvaWQgU2NhbGVQb2ludChmbG9hdCBzY2FsZSwgcHA6OlBvaW50KiBwb2ludCkgeworICBwb2ludC0+c2V0X3goc3RhdGljX2Nhc3Q8aW50Pihwb2ludC0+eCgpICogc2NhbGUpKTsKKyAgcG9pbnQtPnNldF95KHN0YXRpY19jYXN0PGludD4ocG9pbnQtPnkoKSAqIHNjYWxlKSk7Cit9CisKK3ZvaWQgU2NhbGVSZWN0KGZsb2F0IHNjYWxlLCBwcDo6UmVjdCogcmVjdCkgeworICBpbnQgbGVmdCA9IHN0YXRpY19jYXN0PGludD4oZmxvb3JmKHJlY3QtPngoKSAqIHNjYWxlKSk7CisgIGludCB0b3AgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihyZWN0LT55KCkgKiBzY2FsZSkpOworICBpbnQgcmlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKChyZWN0LT54KCkgKyByZWN0LT53aWR0aCgpKSAqIHNjYWxlKSk7CisgIGludCBib3R0b20gPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKChyZWN0LT55KCkgKyByZWN0LT5oZWlnaHQoKSkgKiBzY2FsZSkpOworICByZWN0LT5TZXRSZWN0KGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworfQorCisvLyBUT0RPKHJheW1lcyk6IFJlbW92ZSB0aGlzIGRlcGVuZGVuY3kgb24gVmFyUHJpdmF0ZS9JbnN0YW5jZVByaXZhdGUuIEl0J3MKKy8vIG5lZWRlZCByaWdodCBub3cgdG8gZG8gYSBzeW5jaHJvbm91cyBjYWxsIHRvIEphdmFTY3JpcHQsIGJ1dCB3ZSBjb3VsZCBlYXNpbHkKKy8vIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIFBQQl9QREYgZnVuY3Rpb24uCitwcDo6VmFyIE1vZGFsRGlhbG9nKGNvbnN0IHBwOjpJbnN0YW5jZSogaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfYW5zd2VyKSB7CisgIGNvbnN0IFBQQl9JbnN0YW5jZV9Qcml2YXRlKiBpbnRlcmZhY2UgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQUEJfSW5zdGFuY2VfUHJpdmF0ZSo+KAorICAgICAgICAgIHBwOjpNb2R1bGU6OkdldCgpLT5HZXRCcm93c2VySW50ZXJmYWNlKAorICAgICAgICAgICAgICBQUEJfSU5TVEFOQ0VfUFJJVkFURV9JTlRFUkZBQ0UpKTsKKyAgcHA6OlZhclByaXZhdGUgd2luZG93KHBwOjpQQVNTX1JFRiwKKyAgICAgIGludGVyZmFjZS0+R2V0V2luZG93T2JqZWN0KGluc3RhbmNlLT5wcF9pbnN0YW5jZSgpKSk7CisgIGlmIChkZWZhdWx0X2Fuc3dlci5lbXB0eSgpKQorICAgIHJldHVybiB3aW5kb3cuQ2FsbCh0eXBlLCBtZXNzYWdlKTsKKyAgZWxzZQorICAgIHJldHVybiB3aW5kb3cuQ2FsbCh0eXBlLCBtZXNzYWdlLCBkZWZhdWx0X2Fuc3dlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitPdXRPZlByb2Nlc3NJbnN0YW5jZTo6T3V0T2ZQcm9jZXNzSW5zdGFuY2UoUFBfSW5zdGFuY2UgaW5zdGFuY2UpCisgICAgOiBwcDo6SW5zdGFuY2UoaW5zdGFuY2UpLAorICAgICAgcHA6OkZpbmRfUHJpdmF0ZSh0aGlzKSwKKyAgICAgIHBwOjpQcmludGluZ19EZXYodGhpcyksCisgICAgICBwcDo6U2VsZWN0aW9uX0Rldih0aGlzKSwKKyAgICAgIGN1cnNvcl8oUFBfQ1VSU09SVFlQRV9QT0lOVEVSKSwKKyAgICAgIHpvb21fKDEuMCksCisgICAgICBkZXZpY2Vfc2NhbGVfKDEuMCksCisgICAgICBwcmludGluZ19lbmFibGVkXyh0cnVlKSwKKyAgICAgIGZ1bGxfKGZhbHNlKSwKKyAgICAgIHBhaW50X21hbmFnZXJfKHRoaXMsIHRoaXMsIHRydWUpLAorICAgICAgZmlyc3RfcGFpbnRfKHRydWUpLAorICAgICAgZG9jdW1lbnRfbG9hZF9zdGF0ZV8oTE9BRF9TVEFURV9MT0FESU5HKSwKKyAgICAgIHByZXZpZXdfZG9jdW1lbnRfbG9hZF9zdGF0ZV8oTE9BRF9TVEFURV9DT01QTEVURSksCisgICAgICB1bWFfKHRoaXMpLAorICAgICAgdG9sZF9icm93c2VyX2Fib3V0X3Vuc3VwcG9ydGVkX2ZlYXR1cmVfKGZhbHNlKSwKKyAgICAgIHByaW50X3ByZXZpZXdfcGFnZV9jb3VudF8oMCksCisgICAgICBsYXN0X3Byb2dyZXNzX3NlbnRfKDApLAorICAgICAgcmVjZW50bHlfc2VudF9maW5kX3VwZGF0ZV8oZmFsc2UpLAorICAgICAgcmVjZWl2ZWRfdmlld3BvcnRfbWVzc2FnZV8oZmFsc2UpLAorICAgICAgZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18oZmFsc2UpLAorICAgICAgc3RvcF9zY3JvbGxpbmdfKGZhbHNlKSB7CisgIGxvYWRlcl9mYWN0b3J5Xy5Jbml0aWFsaXplKHRoaXMpOworICB0aW1lcl9mYWN0b3J5Xy5Jbml0aWFsaXplKHRoaXMpOworICBmb3JtX2ZhY3RvcnlfLkluaXRpYWxpemUodGhpcyk7CisgIHByaW50X2NhbGxiYWNrX2ZhY3RvcnlfLkluaXRpYWxpemUodGhpcyk7CisgIGVuZ2luZV8ucmVzZXQoUERGRW5naW5lOjpDcmVhdGUodGhpcykpOworICBwcDo6TW9kdWxlOjpHZXQoKS0+QWRkUGx1Z2luSW50ZXJmYWNlKGtQUFBQZGZJbnRlcmZhY2UsICZwcHBfcHJpdmF0ZSk7CisgIEFkZFBlckluc3RhbmNlT2JqZWN0KGtQUFBQZGZJbnRlcmZhY2UsIHRoaXMpOworCisgIFJlcXVlc3RGaWx0ZXJpbmdJbnB1dEV2ZW50cyhQUF9JTlBVVEVWRU5UX0NMQVNTX01PVVNFKTsKKyAgUmVxdWVzdEZpbHRlcmluZ0lucHV0RXZlbnRzKFBQX0lOUFVURVZFTlRfQ0xBU1NfS0VZQk9BUkQpOworICBSZXF1ZXN0RmlsdGVyaW5nSW5wdXRFdmVudHMoUFBfSU5QVVRFVkVOVF9DTEFTU19UT1VDSCk7Cit9CisKK091dE9mUHJvY2Vzc0luc3RhbmNlOjp+T3V0T2ZQcm9jZXNzSW5zdGFuY2UoKSB7CisgIFJlbW92ZVBlckluc3RhbmNlT2JqZWN0KGtQUFBQZGZJbnRlcmZhY2UsIHRoaXMpOworfQorCitib29sIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpJbml0KHVpbnQzMl90IGFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ25bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJndltdKSB7CisgIC8vIENoZWNrIGlmIHRoZSBQREYgaXMgYmVpbmcgbG9hZGVkIGluIHRoZSBQREYgY2hyb21lIGV4dGVuc2lvbi4gV2Ugb25seSBhbGxvdworICAvLyB0aGUgcGx1Z2luIHRvIGJlIHB1dCBpbnRvICJmdWxsIGZyYW1lIiBtb2RlIHdoZW4gaXQgaXMgYmVpbmcgbG9hZGVkIGluIHRoZQorICAvLyBleHRlbnNpb24gYmVjYXVzZSB0aGlzIGVuYWJsZXMgc29tZSBmZWF0dXJlcyB0aGF0IHdlIGRvbid0IHdhbnQgcGFnZXMKKyAgLy8gYWJ1c2luZyBvdXRzaWRlIG9mIHRoZSBleHRlbnNpb24uCisgIHBwOjpWYXIgZG9jdW1lbnRfdXJsX3ZhciA9IHBwOjpVUkxVdGlsX0Rldjo6R2V0KCktPkdldERvY3VtZW50VVJMKHRoaXMpOworICBzdGQ6OnN0cmluZyBkb2N1bWVudF91cmwgPSBkb2N1bWVudF91cmxfdmFyLmlzX3N0cmluZygpID8KKyAgICAgIGRvY3VtZW50X3VybF92YXIuQXNTdHJpbmcoKSA6IHN0ZDo6c3RyaW5nKCk7CisgIHN0ZDo6c3RyaW5nIGV4dGVuc2lvbl91cmwgPSBzdGQ6OnN0cmluZyhrQ2hyb21lRXh0ZW5zaW9uKTsKKyAgYm9vbCBpbl9leHRlbnNpb24gPQorICAgICAgIWRvY3VtZW50X3VybC5jb21wYXJlKDAsIGV4dGVuc2lvbl91cmwuc2l6ZSgpLCBleHRlbnNpb25fdXJsKTsKKworICBpZiAoaW5fZXh0ZW5zaW9uKSB7CisgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBmdWxsIGZyYW1lLiBUaGlzIGlzIHBhc3NlZCBpbiBmcm9tIEpTLgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgIGlmIChzdHJjbXAoYXJnbltpXSwgImZ1bGwtZnJhbWUiKSA9PSAwKSB7CisgICAgICAgIGZ1bGxfID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gT25seSBhbGxvdyB0aGUgcGx1Z2luIHRvIGhhbmRsZSBmaW5kIHJlcXVlc3RzIGlmIGl0IGlzIGZ1bGwgZnJhbWUuCisgIGlmIChmdWxsXykKKyAgICBTZXRQbHVnaW5Ub0hhbmRsZUZpbmRSZXF1ZXN0cygpOworCisgIC8vIFNlbmQgdHJhbnNsYXRlZCBzdHJpbmdzIHRvIHRoZSBleHRlbnNpb24gd2hlcmUgdGhleSB3aWxsIGJlIGRpc3BsYXllZC4KKyAgLy8gVE9ETyhyYXltZXMpOiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZ2V0IHRoZXNlIGluIHRoZSBleHRlbnNpb24gZGlyZWN0bHkKKyAgLy8gdGhyb3VnaCBhbiBBUEkgYnV0IG5vIHN1Y2ggQVBJIGN1cnJlbnRseSBleGlzdHMuCisgIHBwOjpWYXJEaWN0aW9uYXJ5IHRyYW5zbGF0ZWRfc3RyaW5nczsKKyAgdHJhbnNsYXRlZF9zdHJpbmdzLlNldChrVHlwZSwga0pTU2V0VHJhbnNsYXRlZFN0cmluZ3NUeXBlKTsKKyAgdHJhbnNsYXRlZF9zdHJpbmdzLlNldChrSlNHZXRQYXNzd29yZFN0cmluZywKKyAgICAgIEdldExvY2FsaXplZFN0cmluZyhQUF9SRVNPVVJDRVNUUklOR19QREZHRVRQQVNTV09SRCkpOworICB0cmFuc2xhdGVkX3N0cmluZ3MuU2V0KGtKU0xvYWRpbmdTdHJpbmcsCisgICAgICBHZXRMb2NhbGl6ZWRTdHJpbmcoUFBfUkVTT1VSQ0VTVFJJTkdfUERGTE9BRElORykpOworICB0cmFuc2xhdGVkX3N0cmluZ3MuU2V0KGtKU0xvYWRGYWlsZWRTdHJpbmcsCisgICAgICBHZXRMb2NhbGl6ZWRTdHJpbmcoUFBfUkVTT1VSQ0VTVFJJTkdfUERGTE9BRF9GQUlMRUQpKTsKKyAgUG9zdE1lc3NhZ2UodHJhbnNsYXRlZF9zdHJpbmdzKTsKKworICB0ZXh0X2lucHV0Xy5yZXNldChuZXcgcHA6OlRleHRJbnB1dF9EZXYodGhpcykpOworCisgIGNvbnN0IGNoYXIqIHN0cmVhbV91cmwgPSBOVUxMOworICBjb25zdCBjaGFyKiBvcmlnaW5hbF91cmwgPSBOVUxMOworICBjb25zdCBjaGFyKiBoZWFkZXJzID0gTlVMTDsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7ICsraSkgeworICAgIGlmIChzdHJjbXAoYXJnbltpXSwgInNyYyIpID09IDApCisgICAgICBvcmlnaW5hbF91cmwgPSBhcmd2W2ldOworICAgIGVsc2UgaWYgKHN0cmNtcChhcmduW2ldLCAic3RyZWFtLXVybCIpID09IDApCisgICAgICBzdHJlYW1fdXJsID0gYXJndltpXTsKKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnbltpXSwgImhlYWRlcnMiKSA9PSAwKQorICAgICAgaGVhZGVycyA9IGFyZ3ZbaV07CisgIH0KKworICAvLyBUT0RPKHJheW1lcyk6IFRoaXMgaXMgYSBoYWNrIHRvIGVuc3VyZSB0aGF0IGlmIG5vIGhlYWRlcnMgYXJlIHBhc3NlZCBpbgorICAvLyB0aGVuIHdlIGdldCB0aGUgcmlnaHQgTUlNRSB0eXBlLiBXaGVuIHRoZSBpbiBwcm9jZXNzIHBsdWdpbiBpcyByZW1vdmVkIHdlCisgIC8vIGNhbiBmaXggdGhlIGRvY3VtZW50IGxvYWRlciBwcm9wZXJseSBhbmQgcmVtb3ZlIHRoaXMgaGFjay4KKyAgaWYgKCFoZWFkZXJzIHx8IHN0cmNtcChoZWFkZXJzLCAiIikgPT0gMCkKKyAgICBoZWFkZXJzID0gImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vcGRmIjsKKworICBpZiAoIW9yaWdpbmFsX3VybCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFzdHJlYW1fdXJsKQorICAgIHN0cmVhbV91cmwgPSBvcmlnaW5hbF91cmw7CisKKyAgLy8gSWYgd2UncmUgaW4gcHJpbnQgcHJldmlldyBtb2RlIHdlIGRvbid0IG5lZWQgdG8gbG9hZCB0aGUgZG9jdW1lbnQgeWV0LgorICAvLyBBIHxrSlNSZXNldFByaW50UHJldmlld01vZGVUeXBlfCBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcGx1Z2luIGxldHRpbmcKKyAgLy8gaXQga25vdyB0aGUgdXJsIHRvIGxvYWQuIEJ5IG5vdCBsb2FkaW5nIGhlcmUgd2UgYXZvaWQgbG9hZGluZyB0aGUgc2FtZQorICAvLyBkb2N1bWVudCB0d2ljZS4KKyAgaWYgKElzUHJpbnRQcmV2aWV3VXJsKG9yaWdpbmFsX3VybCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgTG9hZFVybChzdHJlYW1fdXJsKTsKKyAgdXJsXyA9IG9yaWdpbmFsX3VybDsKKyAgcmV0dXJuIGVuZ2luZV8tPk5ldyhvcmlnaW5hbF91cmwsIGhlYWRlcnMpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpIYW5kbGVNZXNzYWdlKGNvbnN0IHBwOjpWYXImIG1lc3NhZ2UpIHsKKyAgcHA6OlZhckRpY3Rpb25hcnkgZGljdChtZXNzYWdlKTsKKyAgaWYgKCFkaWN0LkdldChrVHlwZSkuaXNfc3RyaW5nKCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpzdHJpbmcgdHlwZSA9IGRpY3QuR2V0KGtUeXBlKS5Bc1N0cmluZygpOworCisgIGlmICh0eXBlID09IGtKU1ZpZXdwb3J0VHlwZSAmJgorICAgICAgZGljdC5HZXQocHA6OlZhcihrSlNYT2Zmc2V0KSkuaXNfaW50KCkgJiYKKyAgICAgIGRpY3QuR2V0KHBwOjpWYXIoa0pTWU9mZnNldCkpLmlzX2ludCgpICYmCisgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1pvb20pKS5pc19udW1iZXIoKSkgeworICAgIHJlY2VpdmVkX3ZpZXdwb3J0X21lc3NhZ2VfID0gdHJ1ZTsKKyAgICBzdG9wX3Njcm9sbGluZ18gPSBmYWxzZTsKKyAgICBkb3VibGUgem9vbSA9IGRpY3QuR2V0KHBwOjpWYXIoa0pTWm9vbSkpLkFzRG91YmxlKCk7CisgICAgcHA6OlBvaW50IHNjcm9sbF9vZmZzZXQoZGljdC5HZXQocHA6OlZhcihrSlNYT2Zmc2V0KSkuQXNJbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1lPZmZzZXQpKS5Bc0ludCgpKTsKKworICAgIC8vIEJvdW5kIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIHpvb20gPSBzdGQ6Om1heChrTWluWm9vbSwgem9vbSk7CisgICAgU2V0Wm9vbSh6b29tKTsKKyAgICBzY3JvbGxfb2Zmc2V0ID0gQm91bmRTY3JvbGxPZmZzZXRUb0RvY3VtZW50KHNjcm9sbF9vZmZzZXQpOworICAgIGVuZ2luZV8tPlNjcm9sbGVkVG9YUG9zaXRpb24oc2Nyb2xsX29mZnNldC54KCkgKiBkZXZpY2Vfc2NhbGVfKTsKKyAgICBlbmdpbmVfLT5TY3JvbGxlZFRvWVBvc2l0aW9uKHNjcm9sbF9vZmZzZXQueSgpICogZGV2aWNlX3NjYWxlXyk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBrSlNHZXRQYXNzd29yZENvbXBsZXRlVHlwZSAmJgorICAgICAgICAgICAgIGRpY3QuR2V0KHBwOjpWYXIoa0pTUGFzc3dvcmQpKS5pc19zdHJpbmcoKSkgeworICAgIGlmIChwYXNzd29yZF9jYWxsYmFja18pIHsKKyAgICAgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tXaXRoT3V0cHV0PHBwOjpWYXI+IGNhbGxiYWNrID0gKnBhc3N3b3JkX2NhbGxiYWNrXzsKKyAgICAgIHBhc3N3b3JkX2NhbGxiYWNrXy5yZXNldCgpOworICAgICAgKmNhbGxiYWNrLm91dHB1dCgpID0gZGljdC5HZXQocHA6OlZhcihrSlNQYXNzd29yZCkpLnBwX3ZhcigpOworICAgICAgY2FsbGJhY2suUnVuKFBQX09LKTsKKyAgICB9IGVsc2UgeworICAgICAgTk9UUkVBQ0hFRCgpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlID09IGtKU1ByaW50VHlwZSkgeworICAgIFByaW50KCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBrSlNSb3RhdGVDbG9ja3dpc2VUeXBlKSB7CisgICAgUm90YXRlQ2xvY2t3aXNlKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBrSlNSb3RhdGVDb3VudGVyY2xvY2t3aXNlVHlwZSkgeworICAgIFJvdGF0ZUNvdW50ZXJjbG9ja3dpc2UoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IGtKU1NlbGVjdEFsbFR5cGUpIHsKKyAgICBlbmdpbmVfLT5TZWxlY3RBbGwoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IGtKU1Jlc2V0UHJpbnRQcmV2aWV3TW9kZVR5cGUgJiYKKyAgICAgICAgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1ByaW50UHJldmlld1VybCkpLmlzX3N0cmluZygpICYmCisgICAgICAgICAgICAgZGljdC5HZXQocHA6OlZhcihrSlNQcmludFByZXZpZXdHcmF5c2NhbGUpKS5pc19ib29sKCkgJiYKKyAgICAgICAgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1ByaW50UHJldmlld1BhZ2VDb3VudCkpLmlzX2ludCgpKSB7CisgICAgdXJsXyA9IGRpY3QuR2V0KHBwOjpWYXIoa0pTUHJpbnRQcmV2aWV3VXJsKSkuQXNTdHJpbmcoKTsKKyAgICBwcmV2aWV3X3BhZ2VzX2luZm9fID0gc3RkOjpxdWV1ZTxQcmV2aWV3UGFnZUluZm8+KCk7CisgICAgcHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXyA9IExPQURfU1RBVEVfQ09NUExFVEU7CisgICAgZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPSBMT0FEX1NUQVRFX0xPQURJTkc7CisgICAgTG9hZFVybCh1cmxfKTsKKyAgICBwcmV2aWV3X2VuZ2luZV8ucmVzZXQoKTsKKyAgICBlbmdpbmVfLnJlc2V0KFBERkVuZ2luZTo6Q3JlYXRlKHRoaXMpKTsKKyAgICBlbmdpbmVfLT5TZXRHcmF5c2NhbGUoZGljdC5HZXQocHA6OlZhcihrSlNQcmludFByZXZpZXdHcmF5c2NhbGUpKS5Bc0Jvb2woKSk7CisgICAgZW5naW5lXy0+TmV3KHVybF8uY19zdHIoKSk7CisKKyAgICBwcmludF9wcmV2aWV3X3BhZ2VfY291bnRfID0KKyAgICAgICAgc3RkOjptYXgoZGljdC5HZXQocHA6OlZhcihrSlNQcmludFByZXZpZXdQYWdlQ291bnQpKS5Bc0ludCgpLCAwKTsKKworICAgIHBhaW50X21hbmFnZXJfLkludmFsaWRhdGVSZWN0KHBwOjpSZWN0KHBwOjpQb2ludCgpLCBwbHVnaW5fc2l6ZV8pKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IGtKU0xvYWRQcmV2aWV3UGFnZVR5cGUgJiYKKyAgICAgICAgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1ByZXZpZXdQYWdlVXJsKSkuaXNfc3RyaW5nKCkgJiYKKyAgICAgICAgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1ByZXZpZXdQYWdlSW5kZXgpKS5pc19pbnQoKSkgeworICAgIFByb2Nlc3NQcmV2aWV3UGFnZUluZm8oZGljdC5HZXQocHA6OlZhcihrSlNQcmV2aWV3UGFnZVVybCkpLkFzU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LkdldChwcDo6VmFyKGtKU1ByZXZpZXdQYWdlSW5kZXgpKS5Bc0ludCgpKTsKKyAgfSBlbHNlIGlmICh0eXBlID09IGtKU0dldEFjY2Vzc2liaWxpdHlKU09OVHlwZSkgeworICAgIHBwOjpWYXJEaWN0aW9uYXJ5IHJlcGx5OworICAgIHJlcGx5LlNldChwcDo6VmFyKGtUeXBlKSwgcHA6OlZhcihrSlNHZXRBY2Nlc3NpYmlsaXR5SlNPTlJlcGx5VHlwZSkpOworICAgIGlmIChkaWN0LkdldChwcDo6VmFyKGtKU0FjY2Vzc2liaWxpdHlQYWdlTnVtYmVyKSkuaXNfaW50KCkpIHsKKyAgICAgIGludCBwYWdlID0gZGljdC5HZXQocHA6OlZhcihrSlNBY2Nlc3NpYmlsaXR5UGFnZU51bWJlcikpLkFzSW50KCk7CisgICAgICByZXBseS5TZXQocHA6OlZhcihrSlNBY2Nlc3NpYmlsaXR5SlNPTiksCisgICAgICAgICAgICAgICAgICAgICAgICBwcDo6VmFyKGVuZ2luZV8tPkdldFBhZ2VBc0pTT04ocGFnZSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYmFzZTo6RGljdGlvbmFyeVZhbHVlIG5vZGU7CisgICAgICBub2RlLlNldEludGVnZXIoa0FjY2Vzc2libGVOdW1iZXJPZlBhZ2VzLCBlbmdpbmVfLT5HZXROdW1iZXJPZlBhZ2VzKCkpOworICAgICAgbm9kZS5TZXRCb29sZWFuKGtBY2Nlc3NpYmxlTG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50X2xvYWRfc3RhdGVfICE9IExPQURfU1RBVEVfTE9BRElORyk7CisgICAgICBib29sIGhhc19wZXJtaXNzaW9ucyA9CisgICAgICAgICAgZW5naW5lXy0+SGFzUGVybWlzc2lvbihQREZFbmdpbmU6OlBFUk1JU1NJT05fQ09QWSkgfHwKKyAgICAgICAgICBlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9DT1BZX0FDQ0VTU0lCTEUpOworICAgICAgbm9kZS5TZXRCb29sZWFuKGtBY2Nlc3NpYmxlQ29weWFibGUsIGhhc19wZXJtaXNzaW9ucyk7CisgICAgICBzdGQ6OnN0cmluZyBqc29uOworICAgICAgYmFzZTo6SlNPTldyaXRlcjo6V3JpdGUoJm5vZGUsICZqc29uKTsKKyAgICAgIHJlcGx5LlNldChwcDo6VmFyKGtKU0FjY2Vzc2liaWxpdHlKU09OKSwgcHA6OlZhcihqc29uKSk7CisgICAgfQorICAgIFBvc3RNZXNzYWdlKHJlcGx5KTsKKyAgfSBlbHNlIGlmICh0eXBlID09IGtKU1N0b3BTY3JvbGxpbmdUeXBlKSB7CisgICAgc3RvcF9zY3JvbGxpbmdfID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgIH0KK30KKworYm9vbCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6SGFuZGxlSW5wdXRFdmVudCgKKyAgICBjb25zdCBwcDo6SW5wdXRFdmVudCYgZXZlbnQpIHsKKyAgLy8gVG8gc2ltcGxpZnkgdGhpbmdzLCBjb252ZXJ0IHRoZSBldmVudCBpbnRvIGRldmljZSBjb29yZGluYXRlcyBpZiBpdCBpcworICAvLyBhIG1vdXNlIGV2ZW50LgorICBwcDo6SW5wdXRFdmVudCBldmVudF9kZXZpY2VfcmVzKGV2ZW50KTsKKyAgeworICAgIHBwOjpNb3VzZUlucHV0RXZlbnQgbW91c2VfZXZlbnQoZXZlbnQpOworICAgIGlmICghbW91c2VfZXZlbnQuaXNfbnVsbCgpKSB7CisgICAgICBwcDo6UG9pbnQgcG9pbnQgPSBtb3VzZV9ldmVudC5HZXRQb3NpdGlvbigpOworICAgICAgcHA6OlBvaW50IG1vdmVtZW50ID0gbW91c2VfZXZlbnQuR2V0TW92ZW1lbnQoKTsKKyAgICAgIFNjYWxlUG9pbnQoZGV2aWNlX3NjYWxlXywgJnBvaW50KTsKKyAgICAgIFNjYWxlUG9pbnQoZGV2aWNlX3NjYWxlXywgJm1vdmVtZW50KTsKKyAgICAgIG1vdXNlX2V2ZW50ID0gcHA6Ok1vdXNlSW5wdXRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIGV2ZW50LkdldFR5cGUoKSwKKyAgICAgICAgICBldmVudC5HZXRUaW1lU3RhbXAoKSwKKyAgICAgICAgICBldmVudC5HZXRNb2RpZmllcnMoKSwKKyAgICAgICAgICBtb3VzZV9ldmVudC5HZXRCdXR0b24oKSwKKyAgICAgICAgICBwb2ludCwKKyAgICAgICAgICBtb3VzZV9ldmVudC5HZXRDbGlja0NvdW50KCksCisgICAgICAgICAgbW92ZW1lbnQpOworICAgICAgZXZlbnRfZGV2aWNlX3JlcyA9IG1vdXNlX2V2ZW50OworICAgIH0KKyAgfQorCisgIHBwOjpJbnB1dEV2ZW50IG9mZnNldF9ldmVudChldmVudF9kZXZpY2VfcmVzKTsKKyAgc3dpdGNoIChvZmZzZXRfZXZlbnQuR2V0VHlwZSgpKSB7CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VET1dOOgorICAgIGNhc2UgUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFVVA6CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VNT1ZFOgorICAgIGNhc2UgUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFRU5URVI6CisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VMRUFWRTogeworICAgICAgcHA6Ok1vdXNlSW5wdXRFdmVudCBtb3VzZV9ldmVudChldmVudF9kZXZpY2VfcmVzKTsKKyAgICAgIHBwOjpNb3VzZUlucHV0RXZlbnQgbW91c2VfZXZlbnRfZGlwKGV2ZW50KTsKKyAgICAgIHBwOjpQb2ludCBwb2ludCA9IG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCk7CisgICAgICBwb2ludC5zZXRfeChwb2ludC54KCkgLSBhdmFpbGFibGVfYXJlYV8ueCgpKTsKKyAgICAgIG9mZnNldF9ldmVudCA9IHBwOjpNb3VzZUlucHV0RXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBldmVudC5HZXRUeXBlKCksCisgICAgICAgICAgZXZlbnQuR2V0VGltZVN0YW1wKCksCisgICAgICAgICAgZXZlbnQuR2V0TW9kaWZpZXJzKCksCisgICAgICAgICAgbW91c2VfZXZlbnQuR2V0QnV0dG9uKCksCisgICAgICAgICAgcG9pbnQsCisgICAgICAgICAgbW91c2VfZXZlbnQuR2V0Q2xpY2tDb3VudCgpLAorICAgICAgICAgIG1vdXNlX2V2ZW50LkdldE1vdmVtZW50KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAoZW5naW5lXy0+SGFuZGxlRXZlbnQob2Zmc2V0X2V2ZW50KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBUT0RPKHJheW1lcyk6IEltcGxlbWVudCB0aGlzIHNjcm9sbCBiZWhhdmlvciBpbiBKUzoKKyAgLy8gV2hlbiBjbGljaytkcmFnZ2luZywgc2Nyb2xsIHRoZSBkb2N1bWVudCBjb3JyZWN0bHkuCisKKyAgLy8gUmV0dXJuIHRydWUgZm9yIHVuaGFuZGxlZCBjbGlja3Mgc28gdGhlIHBsdWdpbiB0YWtlcyBmb2N1cy4KKyAgcmV0dXJuIChldmVudC5HZXRUeXBlKCkgPT0gUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFRE9XTik7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkRpZENoYW5nZVZpZXcoY29uc3QgcHA6OlZpZXcmIHZpZXcpIHsKKyAgcHA6OlJlY3Qgdmlld19yZWN0KHZpZXcuR2V0UmVjdCgpKTsKKyAgZmxvYXQgb2xkX2RldmljZV9zY2FsZSA9IGRldmljZV9zY2FsZV87CisgIGZsb2F0IGRldmljZV9zY2FsZSA9IHZpZXcuR2V0RGV2aWNlU2NhbGUoKTsKKyAgcHA6OlNpemUgdmlld19kZXZpY2Vfc2l6ZSh2aWV3X3JlY3Qud2lkdGgoKSAqIGRldmljZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3X3JlY3QuaGVpZ2h0KCkgKiBkZXZpY2Vfc2NhbGUpOworCisgIGlmICh2aWV3X2RldmljZV9zaXplICE9IHBsdWdpbl9zaXplXyB8fCBkZXZpY2Vfc2NhbGUgIT0gZGV2aWNlX3NjYWxlXykgeworICAgIGRldmljZV9zY2FsZV8gPSBkZXZpY2Vfc2NhbGU7CisgICAgcGx1Z2luX2RpcF9zaXplXyA9IHZpZXdfcmVjdC5zaXplKCk7CisgICAgcGx1Z2luX3NpemVfID0gdmlld19kZXZpY2Vfc2l6ZTsKKworICAgIHBhaW50X21hbmFnZXJfLlNldFNpemUodmlld19kZXZpY2Vfc2l6ZSwgZGV2aWNlX3NjYWxlXyk7CisKKyAgICBwcDo6U2l6ZSBuZXdfaW1hZ2VfZGF0YV9zaXplID0gUGFpbnRNYW5hZ2VyOjpHZXROZXdDb250ZXh0U2l6ZSgKKyAgICAgICAgaW1hZ2VfZGF0YV8uc2l6ZSgpLAorICAgICAgICBwbHVnaW5fc2l6ZV8pOworICAgIGlmIChuZXdfaW1hZ2VfZGF0YV9zaXplICE9IGltYWdlX2RhdGFfLnNpemUoKSkgeworICAgICAgaW1hZ2VfZGF0YV8gPSBwcDo6SW1hZ2VEYXRhKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBfSU1BR0VEQVRBRk9STUFUX0JHUkFfUFJFTVVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pbWFnZV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgZmlyc3RfcGFpbnRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaW1hZ2VfZGF0YV8uaXNfbnVsbCgpKSB7CisgICAgICBEQ0hFQ0socGx1Z2luX3NpemVfLklzRW1wdHkoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgT25HZW9tZXRyeUNoYW5nZWQoem9vbV8sIG9sZF9kZXZpY2Vfc2NhbGUpOworICB9CisKKyAgaWYgKCFzdG9wX3Njcm9sbGluZ18pIHsKKyAgICBwcDo6UG9pbnQgc2Nyb2xsX29mZnNldCgKKyAgICAgICAgQm91bmRTY3JvbGxPZmZzZXRUb0RvY3VtZW50KHZpZXcuR2V0U2Nyb2xsT2Zmc2V0KCkpKTsKKyAgICBlbmdpbmVfLT5TY3JvbGxlZFRvWFBvc2l0aW9uKHNjcm9sbF9vZmZzZXQueCgpICogZGV2aWNlX3NjYWxlXyk7CisgICAgZW5naW5lXy0+U2Nyb2xsZWRUb1lQb3NpdGlvbihzY3JvbGxfb2Zmc2V0LnkoKSAqIGRldmljZV9zY2FsZV8pOworICB9Cit9CisKK3BwOjpWYXIgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkdldExpbmtBdFBvc2l0aW9uKAorICAgIGNvbnN0IHBwOjpQb2ludCYgcG9pbnQpIHsKKyAgcHA6OlBvaW50IG9mZnNldF9wb2ludChwb2ludCk7CisgIFNjYWxlUG9pbnQoZGV2aWNlX3NjYWxlXywgJm9mZnNldF9wb2ludCk7CisgIG9mZnNldF9wb2ludC5zZXRfeChvZmZzZXRfcG9pbnQueCgpIC0gYXZhaWxhYmxlX2FyZWFfLngoKSk7CisgIHJldHVybiBlbmdpbmVfLT5HZXRMaW5rQXRQb3NpdGlvbihvZmZzZXRfcG9pbnQpOworfQorCitwcDo6VmFyIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpHZXRTZWxlY3RlZFRleHQoYm9vbCBodG1sKSB7CisgIGlmIChodG1sIHx8ICFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9DT1BZKSkKKyAgICByZXR1cm4gcHA6OlZhcigpOworICByZXR1cm4gZW5naW5lXy0+R2V0U2VsZWN0ZWRUZXh0KCk7Cit9CisKK3VpbnQzMl90IE91dE9mUHJvY2Vzc0luc3RhbmNlOjpRdWVyeVN1cHBvcnRlZFByaW50T3V0cHV0Rm9ybWF0cygpIHsKKyAgcmV0dXJuIGVuZ2luZV8tPlF1ZXJ5U3VwcG9ydGVkUHJpbnRPdXRwdXRGb3JtYXRzKCk7Cit9CisKK2ludDMyX3QgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlByaW50QmVnaW4oCisgICAgY29uc3QgUFBfUHJpbnRTZXR0aW5nc19EZXYmIHByaW50X3NldHRpbmdzKSB7CisgIC8vIEZvciB1cyBudW1fcGFnZXMgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIFBERgorICAvLyBkb2N1bWVudCBpcnJlc3BlY3RpdmUgb2YgdGhlIHByaW50YWJsZSBhcmVhLgorICBpbnQzMl90IHJldCA9IGVuZ2luZV8tPkdldE51bWJlck9mUGFnZXMoKTsKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIDA7CisKKyAgdWludDMyX3Qgc3VwcG9ydGVkX2Zvcm1hdHMgPSBlbmdpbmVfLT5RdWVyeVN1cHBvcnRlZFByaW50T3V0cHV0Rm9ybWF0cygpOworICBpZiAoKHByaW50X3NldHRpbmdzLmZvcm1hdCAmIHN1cHBvcnRlZF9mb3JtYXRzKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIHByaW50X3NldHRpbmdzXy5pc19wcmludGluZyA9IHRydWU7CisgIHByaW50X3NldHRpbmdzXy5wZXBwZXJfcHJpbnRfc2V0dGluZ3MgPSBwcmludF9zZXR0aW5nczsKKyAgZW5naW5lXy0+UHJpbnRCZWdpbigpOworICByZXR1cm4gcmV0OworfQorCitwcDo6UmVzb3VyY2UgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlByaW50UGFnZXMoCisgICAgY29uc3QgUFBfUHJpbnRQYWdlTnVtYmVyUmFuZ2VfRGV2KiBwYWdlX3JhbmdlcywKKyAgICB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50KSB7CisgIGlmICghcHJpbnRfc2V0dGluZ3NfLmlzX3ByaW50aW5nKQorICAgIHJldHVybiBwcDo6UmVzb3VyY2UoKTsKKworICBwcmludF9zZXR0aW5nc18ucHJpbnRfcGFnZXNfY2FsbGVkXyA9IHRydWU7CisgIHJldHVybiBlbmdpbmVfLT5QcmludFBhZ2VzKHBhZ2VfcmFuZ2VzLCBwYWdlX3JhbmdlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zZXR0aW5nc18ucGVwcGVyX3ByaW50X3NldHRpbmdzKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6UHJpbnRFbmQoKSB7CisgIGlmIChwcmludF9zZXR0aW5nc18ucHJpbnRfcGFnZXNfY2FsbGVkXykKKyAgICBVc2VyTWV0cmljc1JlY29yZEFjdGlvbigiUERGLlByaW50UGFnZSIpOworICBwcmludF9zZXR0aW5nc18uQ2xlYXIoKTsKKyAgZW5naW5lXy0+UHJpbnRFbmQoKTsKK30KKworYm9vbCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6SXNQcmludFNjYWxpbmdEaXNhYmxlZCgpIHsKKyAgcmV0dXJuICFlbmdpbmVfLT5HZXRQcmludFNjYWxpbmcoKTsKK30KKworYm9vbCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U3RhcnRGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUpIHsKKyAgZW5naW5lXy0+U3RhcnRGaW5kKHRleHQuY19zdHIoKSwgY2FzZV9zZW5zaXRpdmUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U2VsZWN0RmluZFJlc3VsdChib29sIGZvcndhcmQpIHsKKyAgZW5naW5lXy0+U2VsZWN0RmluZFJlc3VsdChmb3J3YXJkKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U3RvcEZpbmQoKSB7CisgIGVuZ2luZV8tPlN0b3BGaW5kKCk7CisgIHRpY2ttYXJrc18uY2xlYXIoKTsKKyAgU2V0VGlja21hcmtzKHRpY2ttYXJrc18pOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpPblBhaW50KAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgcGFpbnRfcmVjdHMsCisgICAgc3RkOjp2ZWN0b3I8UGFpbnRNYW5hZ2VyOjpSZWFkeVJlY3Q+KiByZWFkeSwKKyAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIHBlbmRpbmcpIHsKKyAgaWYgKGltYWdlX2RhdGFfLmlzX251bGwoKSkgeworICAgIERDSEVDSyhwbHVnaW5fc2l6ZV8uSXNFbXB0eSgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGZpcnN0X3BhaW50XykgeworICAgIGZpcnN0X3BhaW50XyA9IGZhbHNlOworICAgIHBwOjpSZWN0IHJlY3QgPSBwcDo6UmVjdChwcDo6UG9pbnQoKSwgaW1hZ2VfZGF0YV8uc2l6ZSgpKTsKKyAgICBGaWxsUmVjdChyZWN0LCBrQmFja2dyb3VuZENvbG9yKTsKKyAgICByZWFkeS0+cHVzaF9iYWNrKFBhaW50TWFuYWdlcjo6UmVhZHlSZWN0KHJlY3QsIGltYWdlX2RhdGFfLCB0cnVlKSk7CisgIH0KKworICBpZiAoIXJlY2VpdmVkX3ZpZXdwb3J0X21lc3NhZ2VfKQorICAgIHJldHVybjsKKworICBlbmdpbmVfLT5QcmVQYWludCgpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFpbnRfcmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBJbnRlcnNlY3Qgd2l0aCBwbHVnaW4gYXJlYSBzaW5jZSB0aGVyZSBjb3VsZCBiZSBwZW5kaW5nIGludmFsaWRhdGVzIGZyb20KKyAgICAvLyB3aGVuIHRoZSBwbHVnaW4gYXJlYSB3YXMgbGFyZ2VyLgorICAgIHBwOjpSZWN0IHJlY3QgPQorICAgICAgICBwYWludF9yZWN0c1tpXS5JbnRlcnNlY3QocHA6OlJlY3QocHA6OlBvaW50KCksIHBsdWdpbl9zaXplXykpOworICAgIGlmIChyZWN0LklzRW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgcHA6OlJlY3QgcGRmX3JlY3QgPSBhdmFpbGFibGVfYXJlYV8uSW50ZXJzZWN0KHJlY3QpOworICAgIGlmICghcGRmX3JlY3QuSXNFbXB0eSgpKSB7CisgICAgICBwZGZfcmVjdC5PZmZzZXQoYXZhaWxhYmxlX2FyZWFfLngoKSAqIC0xLCAwKTsKKworICAgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHBkZl9yZWFkeTsKKyAgICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiBwZGZfcGVuZGluZzsKKyAgICAgIGVuZ2luZV8tPlBhaW50KHBkZl9yZWN0LCAmaW1hZ2VfZGF0YV8sICZwZGZfcmVhZHksICZwZGZfcGVuZGluZyk7CisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBkZl9yZWFkeS5zaXplKCk7ICsraikgeworICAgICAgICBwZGZfcmVhZHlbal0uT2Zmc2V0KGF2YWlsYWJsZV9hcmVhXy5wb2ludCgpKTsKKyAgICAgICAgcmVhZHktPnB1c2hfYmFjaygKKyAgICAgICAgICAgIFBhaW50TWFuYWdlcjo6UmVhZHlSZWN0KHBkZl9yZWFkeVtqXSwgaW1hZ2VfZGF0YV8sIGZhbHNlKSk7CisgICAgICB9CisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBkZl9wZW5kaW5nLnNpemUoKTsgKytqKSB7CisgICAgICAgIHBkZl9wZW5kaW5nW2pdLk9mZnNldChhdmFpbGFibGVfYXJlYV8ucG9pbnQoKSk7CisgICAgICAgIHBlbmRpbmctPnB1c2hfYmFjayhwZGZfcGVuZGluZ1tqXSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBiYWNrZ3JvdW5kX3BhcnRzXy5zaXplKCk7ICsraikgeworICAgICAgcHA6OlJlY3QgaW50ZXJzZWN0aW9uID0gYmFja2dyb3VuZF9wYXJ0c19bal0ubG9jYXRpb24uSW50ZXJzZWN0KHJlY3QpOworICAgICAgaWYgKCFpbnRlcnNlY3Rpb24uSXNFbXB0eSgpKSB7CisgICAgICAgIEZpbGxSZWN0KGludGVyc2VjdGlvbiwgYmFja2dyb3VuZF9wYXJ0c19bal0uY29sb3IpOworICAgICAgICByZWFkeS0+cHVzaF9iYWNrKAorICAgICAgICAgICAgUGFpbnRNYW5hZ2VyOjpSZWFkeVJlY3QoaW50ZXJzZWN0aW9uLCBpbWFnZV9kYXRhXywgZmFsc2UpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBlbmdpbmVfLT5Qb3N0UGFpbnQoKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6RGlkT3BlbihpbnQzMl90IHJlc3VsdCkgeworICBpZiAocmVzdWx0ID09IFBQX09LKSB7CisgICAgaWYgKCFlbmdpbmVfLT5IYW5kbGVEb2N1bWVudExvYWQoZW1iZWRfbG9hZGVyXykpIHsKKyAgICAgIGRvY3VtZW50X2xvYWRfc3RhdGVfID0gTE9BRF9TVEFURV9MT0FESU5HOworICAgICAgRG9jdW1lbnRMb2FkRmFpbGVkKCk7CisgICAgfQorICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBQUF9FUlJPUl9BQk9SVEVEKSB7ICAvLyBDYW4gaGFwcGVuIGluIHRlc3RzLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICBEb2N1bWVudExvYWRGYWlsZWQoKTsKKyAgfQorCisgIC8vIElmIGl0J3MgYSBwcm9ncmVzc2l2ZSBsb2FkLCBjYW5jZWwgdGhlIHN0cmVhbSBVUkwgcmVxdWVzdCBzbyB0aGF0IHJlcXVlc3RzCisgIC8vIGNhbiBiZSBtYWRlIG9uIHRoZSBvcmlnaW5hbCBVUkwuCisgIC8vIFRPRE8ocmF5bWVzKTogTWFrZSB0aGlzIGNsZWFyZXIgb25jZSB0aGUgaW4tcHJvY2VzcyBwbHVnaW4gaXMgZGVsZXRlZC4KKyAgaWYgKGVuZ2luZV8tPklzUHJvZ3Jlc3NpdmVMb2FkKCkpIHsKKyAgICBwcDo6VmFyRGljdGlvbmFyeSBtZXNzYWdlOworICAgIG1lc3NhZ2UuU2V0KGtUeXBlLCBrSlNDYW5jZWxTdHJlYW1VcmxUeXBlKTsKKyAgICBQb3N0TWVzc2FnZShtZXNzYWdlKTsKKyAgfQorfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpEaWRPcGVuUHJldmlldyhpbnQzMl90IHJlc3VsdCkgeworICBpZiAocmVzdWx0ID09IFBQX09LKSB7CisgICAgcHJldmlld19lbmdpbmVfLnJlc2V0KFBERkVuZ2luZTo6Q3JlYXRlKG5ldyBQcmV2aWV3TW9kZUNsaWVudCh0aGlzKSkpOworICAgIHByZXZpZXdfZW5naW5lXy0+SGFuZGxlRG9jdW1lbnRMb2FkKGVtYmVkX3ByZXZpZXdfbG9hZGVyXyk7CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6Ok9uQ2xpZW50VGltZXJGaXJlZChpbnQzMl90IGlkKSB7CisgIGVuZ2luZV8tPk9uQ2FsbGJhY2soaWQpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpDYWxjdWxhdGVCYWNrZ3JvdW5kUGFydHMoKSB7CisgIGJhY2tncm91bmRfcGFydHNfLmNsZWFyKCk7CisgIGludCBsZWZ0X3dpZHRoID0gYXZhaWxhYmxlX2FyZWFfLngoKTsKKyAgaW50IHJpZ2h0X3N0YXJ0ID0gYXZhaWxhYmxlX2FyZWFfLnJpZ2h0KCk7CisgIGludCByaWdodF93aWR0aCA9IGFicyhwbHVnaW5fc2l6ZV8ud2lkdGgoKSAtIGF2YWlsYWJsZV9hcmVhXy5yaWdodCgpKTsKKyAgaW50IGJvdHRvbSA9IHN0ZDo6bWluKGF2YWlsYWJsZV9hcmVhXy5ib3R0b20oKSwgcGx1Z2luX3NpemVfLmhlaWdodCgpKTsKKworICAvLyBBZGQgdGhlIGxlZnQsIHJpZ2h0LCBhbmQgYm90dG9tIHJlY3RhbmdsZXMuICBOb3RlOiB3ZSBhc3N1bWUgb25seQorICAvLyBob3Jpem9udGFsIGNlbnRlcmluZy4KKyAgQmFja2dyb3VuZFBhcnQgcGFydCA9IHsKKyAgICBwcDo6UmVjdCgwLCAwLCBsZWZ0X3dpZHRoLCBib3R0b20pLAorICAgIGtCYWNrZ3JvdW5kQ29sb3IKKyAgfTsKKyAgaWYgKCFwYXJ0LmxvY2F0aW9uLklzRW1wdHkoKSkKKyAgICBiYWNrZ3JvdW5kX3BhcnRzXy5wdXNoX2JhY2socGFydCk7CisgIHBhcnQubG9jYXRpb24gPSBwcDo6UmVjdChyaWdodF9zdGFydCwgMCwgcmlnaHRfd2lkdGgsIGJvdHRvbSk7CisgIGlmICghcGFydC5sb2NhdGlvbi5Jc0VtcHR5KCkpCisgICAgYmFja2dyb3VuZF9wYXJ0c18ucHVzaF9iYWNrKHBhcnQpOworICBwYXJ0LmxvY2F0aW9uID0gcHA6OlJlY3QoCisgICAgICAwLCBib3R0b20sIHBsdWdpbl9zaXplXy53aWR0aCgpLCBwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLSBib3R0b20pOworICBpZiAoIXBhcnQubG9jYXRpb24uSXNFbXB0eSgpKQorICAgIGJhY2tncm91bmRfcGFydHNfLnB1c2hfYmFjayhwYXJ0KTsKK30KKworaW50IE91dE9mUHJvY2Vzc0luc3RhbmNlOjpHZXREb2N1bWVudFBpeGVsV2lkdGgoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwoZG9jdW1lbnRfc2l6ZV8ud2lkdGgoKSAqIHpvb21fICogZGV2aWNlX3NjYWxlXykpOworfQorCitpbnQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkdldERvY3VtZW50UGl4ZWxIZWlnaHQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KAorICAgICAgY2VpbChkb2N1bWVudF9zaXplXy5oZWlnaHQoKSAqIHpvb21fICogZGV2aWNlX3NjYWxlXykpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpGaWxsUmVjdChjb25zdCBwcDo6UmVjdCYgcmVjdCwgdWludDMyIGNvbG9yKSB7CisgIERDSEVDSyghaW1hZ2VfZGF0YV8uaXNfbnVsbCgpIHx8IHJlY3QuSXNFbXB0eSgpKTsKKyAgdWludDMyKiBidWZmZXJfc3RhcnQgPSBzdGF0aWNfY2FzdDx1aW50MzIqPihpbWFnZV9kYXRhXy5kYXRhKCkpOworICBpbnQgc3RyaWRlID0gaW1hZ2VfZGF0YV8uc3RyaWRlKCk7CisgIHVpbnQzMiogcHRyID0gYnVmZmVyX3N0YXJ0ICsgcmVjdC55KCkgKiBzdHJpZGUgLyA0ICsgcmVjdC54KCk7CisgIGludCBoZWlnaHQgPSByZWN0LmhlaWdodCgpOworICBpbnQgd2lkdGggPSByZWN0LndpZHRoKCk7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpCisgICAgICAqKHB0ciArIHgpID0gY29sb3I7CisgICAgcHRyICs9IHN0cmlkZSAvNDsKKyAgfQorfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpEb2N1bWVudFNpemVVcGRhdGVkKGNvbnN0IHBwOjpTaXplJiBzaXplKSB7CisgIGRvY3VtZW50X3NpemVfID0gc2l6ZTsKKworICBwcDo6VmFyRGljdGlvbmFyeSBkaW1lbnNpb25zOworICBkaW1lbnNpb25zLlNldChrVHlwZSwga0pTRG9jdW1lbnREaW1lbnNpb25zVHlwZSk7CisgIGRpbWVuc2lvbnMuU2V0KGtKU0RvY3VtZW50V2lkdGgsIHBwOjpWYXIoZG9jdW1lbnRfc2l6ZV8ud2lkdGgoKSkpOworICBkaW1lbnNpb25zLlNldChrSlNEb2N1bWVudEhlaWdodCwgcHA6OlZhcihkb2N1bWVudF9zaXplXy5oZWlnaHQoKSkpOworICBwcDo6VmFyQXJyYXkgcGFnZV9kaW1lbnNpb25zX2FycmF5OworICBpbnQgbnVtX3BhZ2VzID0gZW5naW5lXy0+R2V0TnVtYmVyT2ZQYWdlcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wYWdlczsgKytpKSB7CisgICAgcHA6OlJlY3QgcGFnZV9yZWN0ID0gZW5naW5lXy0+R2V0UGFnZVJlY3QoaSk7CisgICAgcHA6OlZhckRpY3Rpb25hcnkgcGFnZV9kaW1lbnNpb25zOworICAgIHBhZ2VfZGltZW5zaW9ucy5TZXQoa0pTUGFnZVgsIHBwOjpWYXIocGFnZV9yZWN0LngoKSkpOworICAgIHBhZ2VfZGltZW5zaW9ucy5TZXQoa0pTUGFnZVksIHBwOjpWYXIocGFnZV9yZWN0LnkoKSkpOworICAgIHBhZ2VfZGltZW5zaW9ucy5TZXQoa0pTUGFnZVdpZHRoLCBwcDo6VmFyKHBhZ2VfcmVjdC53aWR0aCgpKSk7CisgICAgcGFnZV9kaW1lbnNpb25zLlNldChrSlNQYWdlSGVpZ2h0LCBwcDo6VmFyKHBhZ2VfcmVjdC5oZWlnaHQoKSkpOworICAgIHBhZ2VfZGltZW5zaW9uc19hcnJheS5TZXQoaSwgcGFnZV9kaW1lbnNpb25zKTsKKyAgfQorICBkaW1lbnNpb25zLlNldChrSlNQYWdlRGltZW5zaW9ucywgcGFnZV9kaW1lbnNpb25zX2FycmF5KTsKKyAgUG9zdE1lc3NhZ2UoZGltZW5zaW9ucyk7CisKKyAgT25HZW9tZXRyeUNoYW5nZWQoem9vbV8sIGRldmljZV9zY2FsZV8pOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpJbnZhbGlkYXRlKGNvbnN0IHBwOjpSZWN0JiByZWN0KSB7CisgIHBwOjpSZWN0IG9mZnNldF9yZWN0KHJlY3QpOworICBvZmZzZXRfcmVjdC5PZmZzZXQoYXZhaWxhYmxlX2FyZWFfLnBvaW50KCkpOworICBwYWludF9tYW5hZ2VyXy5JbnZhbGlkYXRlUmVjdChvZmZzZXRfcmVjdCk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlNjcm9sbChjb25zdCBwcDo6UG9pbnQmIHBvaW50KSB7CisgIGlmICghaW1hZ2VfZGF0YV8uaXNfbnVsbCgpKQorICAgIHBhaW50X21hbmFnZXJfLlNjcm9sbFJlY3QoYXZhaWxhYmxlX2FyZWFfLCBwb2ludCk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlNjcm9sbFRvWChpbnQgeCkgeworICBwcDo6VmFyRGljdGlvbmFyeSBwb3NpdGlvbjsKKyAgcG9zaXRpb24uU2V0KGtUeXBlLCBrSlNTZXRTY3JvbGxQb3NpdGlvblR5cGUpOworICBwb3NpdGlvbi5TZXQoa0pTUG9zaXRpb25YLCBwcDo6VmFyKHggLyBkZXZpY2Vfc2NhbGVfKSk7CisgIFBvc3RNZXNzYWdlKHBvc2l0aW9uKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U2Nyb2xsVG9ZKGludCB5KSB7CisgIHBwOjpWYXJEaWN0aW9uYXJ5IHBvc2l0aW9uOworICBwb3NpdGlvbi5TZXQoa1R5cGUsIGtKU1NldFNjcm9sbFBvc2l0aW9uVHlwZSk7CisgIHBvc2l0aW9uLlNldChrSlNQb3NpdGlvblksIHBwOjpWYXIoeSAvIGRldmljZV9zY2FsZV8pKTsKKyAgUG9zdE1lc3NhZ2UocG9zaXRpb24pOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpTY3JvbGxUb1BhZ2UoaW50IHBhZ2UpIHsKKyAgaWYgKGVuZ2luZV8tPkdldE51bWJlck9mUGFnZXMoKSA9PSAwKQorICAgIHJldHVybjsKKworICBwcDo6VmFyRGljdGlvbmFyeSBtZXNzYWdlOworICBtZXNzYWdlLlNldChrVHlwZSwga0pTR29Ub1BhZ2VUeXBlKTsKKyAgbWVzc2FnZS5TZXQoa0pTUGFnZU51bWJlciwgcHA6OlZhcihwYWdlKSk7CisgIFBvc3RNZXNzYWdlKG1lc3NhZ2UpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpOYXZpZ2F0ZVRvKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3Blbl9pbl9uZXdfdGFiKSB7CisgIHN0ZDo6c3RyaW5nIHVybF9jb3B5KHVybCk7CisKKyAgLy8gRW1wdHkgfHVybF9jb3B5fCBpcyBvaywgYW5kIHdpbGwgZWZmZWN0aXZlbHkgYmUgYSByZWxvYWQuCisgIC8vIFNraXAgdGhlIGNvZGUgYmVsb3cgc28gYW4gZW1wdHkgVVJMIGRvZXMgbm90IHR1cm4gaW50byAiaHR0cDovLyIsIHdoaWNoCisgIC8vIHdpbGwgY2F1c2UgR1VSTCB0byBmYWlsIGEgRENIRUNLLgorICBpZiAoIXVybF9jb3B5LmVtcHR5KCkpIHsKKyAgICAvLyBJZiB8dXJsX2NvcHl8IHN0YXJ0cyB3aXRoICcjJywgdGhlbiBpdCdzIGZvciB0aGUgc2FtZSBVUkwgd2l0aCBhCisgICAgLy8gZGlmZmVyZW50IFVSTCBmcmFnbWVudC4KKyAgICBpZiAodXJsX2NvcHlbMF0gPT0gJyMnKSB7CisgICAgICB1cmxfY29weSA9IHVybF8gKyB1cmxfY29weTsKKyAgICB9CisgICAgLy8gSWYgdGhlcmUncyBubyBzY2hlbWUsIGFkZCBodHRwLgorICAgIGlmICh1cmxfY29weS5maW5kKCI6Ly8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICB1cmxfY29weS5maW5kKCJtYWlsdG86IikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHVybF9jb3B5ID0gc3RkOjpzdHJpbmcoImh0dHA6Ly8iKSArIHVybF9jb3B5OworICAgIH0KKyAgICAvLyBNYWtlIHN1cmUgfHVybF9jb3B5fCBzdGFydHMgd2l0aCBhIHZhbGlkIHNjaGVtZS4KKyAgICBpZiAodXJsX2NvcHkuZmluZCgiaHR0cDovLyIpICE9IDAgJiYKKyAgICAgICAgdXJsX2NvcHkuZmluZCgiaHR0cHM6Ly8iKSAhPSAwICYmCisgICAgICAgIHVybF9jb3B5LmZpbmQoImZ0cDovLyIpICE9IDAgJiYKKyAgICAgICAgdXJsX2NvcHkuZmluZCgiZmlsZTovLyIpICE9IDAgJiYKKyAgICAgICAgdXJsX2NvcHkuZmluZCgibWFpbHRvOiIpICE9IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTWFrZSBzdXJlIHx1cmxfY29weXwgaXMgbm90IG9ubHkgYSBzY2hlbWUuCisgICAgaWYgKHVybF9jb3B5ID09ICJodHRwOi8vIiB8fAorICAgICAgICB1cmxfY29weSA9PSAiaHR0cHM6Ly8iIHx8CisgICAgICAgIHVybF9jb3B5ID09ICJmdHA6Ly8iIHx8CisgICAgICAgIHVybF9jb3B5ID09ICJmaWxlOi8vIiB8fAorICAgICAgICB1cmxfY29weSA9PSAibWFpbHRvOiIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgcHA6OlZhckRpY3Rpb25hcnkgbWVzc2FnZTsKKyAgbWVzc2FnZS5TZXQoa1R5cGUsIGtKU05hdmlnYXRlVHlwZSk7CisgIG1lc3NhZ2UuU2V0KGtKU05hdmlnYXRlVXJsLCB1cmxfY29weSk7CisgIG1lc3NhZ2UuU2V0KGtKU05hdmlnYXRlTmV3VGFiLCBvcGVuX2luX25ld190YWIpOworICBQb3N0TWVzc2FnZShtZXNzYWdlKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6VXBkYXRlQ3Vyc29yKFBQX0N1cnNvclR5cGVfRGV2IGN1cnNvcikgeworICBpZiAoY3Vyc29yID09IGN1cnNvcl8pCisgICAgcmV0dXJuOworICBjdXJzb3JfID0gY3Vyc29yOworCisgIGNvbnN0IFBQQl9DdXJzb3JDb250cm9sX0RldiogY3Vyc29yX2ludGVyZmFjZSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFBQQl9DdXJzb3JDb250cm9sX0Rldio+KAorICAgICAgcHA6Ok1vZHVsZTo6R2V0KCktPkdldEJyb3dzZXJJbnRlcmZhY2UoUFBCX0NVUlNPUl9DT05UUk9MX0RFVl9JTlRFUkZBQ0UpKTsKKyAgaWYgKCFjdXJzb3JfaW50ZXJmYWNlKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGN1cnNvcl9pbnRlcmZhY2UtPlNldEN1cnNvcigKKyAgICAgIHBwX2luc3RhbmNlKCksIGN1cnNvcl8sIHBwOjpJbWFnZURhdGEoKS5wcF9yZXNvdXJjZSgpLCBOVUxMKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6VXBkYXRlVGlja01hcmtzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgdGlja21hcmtzKSB7CisgIGZsb2F0IGludmVyc2Vfc2NhbGUgPSAxLjBmIC8gZGV2aWNlX3NjYWxlXzsKKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHNjYWxlZF90aWNrbWFya3MgPSB0aWNrbWFya3M7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2NhbGVkX3RpY2ttYXJrcy5zaXplKCk7IGkrKykKKyAgICBTY2FsZVJlY3QoaW52ZXJzZV9zY2FsZSwgJnNjYWxlZF90aWNrbWFya3NbaV0pOworICB0aWNrbWFya3NfID0gc2NhbGVkX3RpY2ttYXJrczsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6Tm90aWZ5TnVtYmVyT2ZGaW5kUmVzdWx0c0NoYW5nZWQoaW50IHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmaW5hbF9yZXN1bHQpIHsKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBzcGFtIHRoZSByZW5kZXJlciB3aXRoIHRvbyBtYW55IHVwZGF0ZXMgdG8gdGhlIG51bWJlciBvZgorICAvLyBmaW5kIHJlc3VsdHMuIERvbid0IHNlbmQgYW4gdXBkYXRlIGlmIHdlIHNlbnQgb25lIHRvbyByZWNlbnRseS4gSWYgaXQncyB0aGUKKyAgLy8gZmluYWwgdXBkYXRlLCB3ZSBhbHdheXMgc2VuZCBpdCB0aG91Z2guCisgIGlmIChmaW5hbF9yZXN1bHQpIHsKKyAgICBOdW1iZXJPZkZpbmRSZXN1bHRzQ2hhbmdlZCh0b3RhbCwgZmluYWxfcmVzdWx0KTsKKyAgICBTZXRUaWNrbWFya3ModGlja21hcmtzXyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHJlY2VudGx5X3NlbnRfZmluZF91cGRhdGVfKQorICAgIHJldHVybjsKKworICBOdW1iZXJPZkZpbmRSZXN1bHRzQ2hhbmdlZCh0b3RhbCwgZmluYWxfcmVzdWx0KTsKKyAgU2V0VGlja21hcmtzKHRpY2ttYXJrc18pOworICByZWNlbnRseV9zZW50X2ZpbmRfdXBkYXRlXyA9IHRydWU7CisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgdGltZXJfZmFjdG9yeV8uTmV3Q2FsbGJhY2soCisgICAgICAgICAgJk91dE9mUHJvY2Vzc0luc3RhbmNlOjpSZXNldFJlY2VudGx5U2VudEZpbmRVcGRhdGUpOworICBwcDo6TW9kdWxlOjpHZXQoKS0+Y29yZSgpLT5DYWxsT25NYWluVGhyZWFkKGtGaW5kUmVzdWx0Q29vbGRvd25NcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgMCk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6Ok5vdGlmeVNlbGVjdGVkRmluZFJlc3VsdENoYW5nZWQoCisgICAgaW50IGN1cnJlbnRfZmluZF9pbmRleCkgeworICBTZWxlY3RlZEZpbmRSZXN1bHRDaGFuZ2VkKGN1cnJlbnRfZmluZF9pbmRleCk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkdldERvY3VtZW50UGFzc3dvcmQoCisgICAgcHA6OkNvbXBsZXRpb25DYWxsYmFja1dpdGhPdXRwdXQ8cHA6OlZhcj4gY2FsbGJhY2spIHsKKyAgaWYgKHBhc3N3b3JkX2NhbGxiYWNrXykgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm47CisgIH0KKworICBwYXNzd29yZF9jYWxsYmFja18ucmVzZXQoCisgICAgICBuZXcgcHA6OkNvbXBsZXRpb25DYWxsYmFja1dpdGhPdXRwdXQ8cHA6OlZhcj4oY2FsbGJhY2spKTsKKyAgcHA6OlZhckRpY3Rpb25hcnkgbWVzc2FnZTsKKyAgbWVzc2FnZS5TZXQocHA6OlZhcihrVHlwZSksIHBwOjpWYXIoa0pTR2V0UGFzc3dvcmRUeXBlKSk7CisgIFBvc3RNZXNzYWdlKG1lc3NhZ2UpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpBbGVydChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBNb2RhbERpYWxvZyh0aGlzLCAiYWxlcnQiLCBtZXNzYWdlLCBzdGQ6OnN0cmluZygpKTsKK30KKworYm9vbCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6Q29uZmlybShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBwcDo6VmFyIHJlc3VsdCA9IE1vZGFsRGlhbG9nKHRoaXMsICJjb25maXJtIiwgbWVzc2FnZSwgc3RkOjpzdHJpbmcoKSk7CisgIHJldHVybiByZXN1bHQuaXNfYm9vbCgpID8gcmVzdWx0LkFzQm9vbCgpIDogZmFsc2U7Cit9CisKK3N0ZDo6c3RyaW5nIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpQcm9tcHQoY29uc3Qgc3RkOjpzdHJpbmcmIHF1ZXN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF9hbnN3ZXIpIHsKKyAgcHA6OlZhciByZXN1bHQgPSBNb2RhbERpYWxvZyh0aGlzLCAicHJvbXB0IiwgcXVlc3Rpb24sIGRlZmF1bHRfYW5zd2VyKTsKKyAgcmV0dXJuIHJlc3VsdC5pc19zdHJpbmcoKSA/IHJlc3VsdC5Bc1N0cmluZygpIDogc3RkOjpzdHJpbmcoKTsKK30KKworc3RkOjpzdHJpbmcgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkdldFVSTCgpIHsKKyAgcmV0dXJuIHVybF87Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkVtYWlsKGNvbnN0IHN0ZDo6c3RyaW5nJiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib2R5KSB7CisgIHBwOjpWYXJEaWN0aW9uYXJ5IG1lc3NhZ2U7CisgIG1lc3NhZ2UuU2V0KHBwOjpWYXIoa1R5cGUpLCBwcDo6VmFyKGtKU0VtYWlsVHlwZSkpOworICBtZXNzYWdlLlNldChwcDo6VmFyKGtKU0VtYWlsVG8pLAorICAgICAgICAgICAgICBwcDo6VmFyKG5ldDo6RXNjYXBlVXJsRW5jb2RlZERhdGEodG8sIGZhbHNlKSkpOworICBtZXNzYWdlLlNldChwcDo6VmFyKGtKU0VtYWlsQ2MpLAorICAgICAgICAgICAgICBwcDo6VmFyKG5ldDo6RXNjYXBlVXJsRW5jb2RlZERhdGEoY2MsIGZhbHNlKSkpOworICBtZXNzYWdlLlNldChwcDo6VmFyKGtKU0VtYWlsQmNjKSwKKyAgICAgICAgICAgICAgcHA6OlZhcihuZXQ6OkVzY2FwZVVybEVuY29kZWREYXRhKGJjYywgZmFsc2UpKSk7CisgIG1lc3NhZ2UuU2V0KHBwOjpWYXIoa0pTRW1haWxTdWJqZWN0KSwKKyAgICAgICAgICAgICAgcHA6OlZhcihuZXQ6OkVzY2FwZVVybEVuY29kZWREYXRhKHN1YmplY3QsIGZhbHNlKSkpOworICBtZXNzYWdlLlNldChwcDo6VmFyKGtKU0VtYWlsQm9keSksCisgICAgICAgICAgICAgIHBwOjpWYXIobmV0OjpFc2NhcGVVcmxFbmNvZGVkRGF0YShib2R5LCBmYWxzZSkpKTsKKyAgUG9zdE1lc3NhZ2UobWVzc2FnZSk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlByaW50KCkgeworICBpZiAoIXByaW50aW5nX2VuYWJsZWRfIHx8CisgICAgICAoIWVuZ2luZV8tPkhhc1Blcm1pc3Npb24oUERGRW5naW5lOjpQRVJNSVNTSU9OX1BSSU5UX0xPV19RVUFMSVRZKSAmJgorICAgICAgICFlbmdpbmVfLT5IYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9ISUdIX1FVQUxJVFkpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgcHJpbnRfY2FsbGJhY2tfZmFjdG9yeV8uTmV3Q2FsbGJhY2soJk91dE9mUHJvY2Vzc0luc3RhbmNlOjpPblByaW50KTsKKyAgcHA6Ok1vZHVsZTo6R2V0KCktPmNvcmUoKS0+Q2FsbE9uTWFpblRocmVhZCgwLCBjYWxsYmFjayk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6Ok9uUHJpbnQoaW50MzJfdCkgeworICBwcDo6UERGOjpQcmludCh0aGlzKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U3VibWl0Rm9ybShjb25zdCBzdGQ6OnN0cmluZyYgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIHBwOjpVUkxSZXF1ZXN0SW5mbyByZXF1ZXN0KHRoaXMpOworICByZXF1ZXN0LlNldFVSTCh1cmwpOworICByZXF1ZXN0LlNldE1ldGhvZCgiUE9TVCIpOworICByZXF1ZXN0LkFwcGVuZERhdGFUb0JvZHkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIGxlbmd0aCk7CisKKyAgcHA6OkNvbXBsZXRpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICBmb3JtX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZPdXRPZlByb2Nlc3NJbnN0YW5jZTo6Rm9ybURpZE9wZW4pOworICBmb3JtX2xvYWRlcl8gPSBDcmVhdGVVUkxMb2FkZXJJbnRlcm5hbCgpOworICBpbnQgcnYgPSBmb3JtX2xvYWRlcl8uT3BlbihyZXF1ZXN0LCBjYWxsYmFjayk7CisgIGlmIChydiAhPSBQUF9PS19DT01QTEVUSU9OUEVORElORykKKyAgICBjYWxsYmFjay5SdW4ocnYpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpGb3JtRGlkT3BlbihpbnQzMl90IHJlc3VsdCkgeworICAvLyBUT0RPOiBpbmZvcm0gdGhlIHVzZXIgb2Ygc3VjY2Vzcy9mYWlsdXJlLgorICBpZiAocmVzdWx0ICE9IFBQX09LKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpTaG93RmlsZVNlbGVjdGlvbkRpYWxvZygpIHsKKyAgLy8gU2VlbXMgbGlrZSB2ZXJ5IGxvdyBwcmlvcml0eSB0byBpbXBsZW1lbnQsIHNpbmNlIHRoZSBwZGYgaGFzIG5vIHdheSB0byBnZXQKKyAgLy8gdGhlIGZpbGUgZGF0YSBhbnl3YXlzLiAgSmF2YXNjcmlwdCBkb2Vzbid0IGxldCB5b3UgZG8gdGhpcyBzeW5jaHJvbm91c2x5LgorICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCitwcDo6VVJMTG9hZGVyIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpDcmVhdGVVUkxMb2FkZXIoKSB7CisgIGlmIChmdWxsXykgeworICAgIGlmICghZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18pIHsKKyAgICAgIGRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfID0gdHJ1ZTsKKyAgICAgIHBwOjpQREY6OkRpZFN0YXJ0TG9hZGluZyh0aGlzKTsKKyAgICB9CisKKyAgICAvLyBEaXNhYmxlIHNhdmUgYW5kIHByaW50IHVudGlsIHRoZSBkb2N1bWVudCBpcyBmdWxseSBsb2FkZWQsIHNpbmNlIHRoZXkKKyAgICAvLyB3b3VsZCBnZW5lcmF0ZSBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LiAgTmVlZCB0byBkbyB0aGlzIGVhY2ggdGltZSB3ZQorICAgIC8vIGNhbGwgRGlkU3RhcnRMb2FkaW5nIHNpbmNlIHRoYXQgcmVzZXRzIHRoZSBjb250ZW50IHJlc3RyaWN0aW9ucy4KKyAgICBwcDo6UERGOjpTZXRDb250ZW50UmVzdHJpY3Rpb24odGhpcywgQ09OVEVOVF9SRVNUUklDVElPTl9TQVZFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVOVF9SRVNUUklDVElPTl9QUklOVCk7CisgIH0KKworICByZXR1cm4gQ3JlYXRlVVJMTG9hZGVySW50ZXJuYWwoKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U2NoZWR1bGVDYWxsYmFjayhpbnQgaWQsIGludCBkZWxheV9pbl9tcykgeworICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgIHRpbWVyX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZPdXRPZlByb2Nlc3NJbnN0YW5jZTo6T25DbGllbnRUaW1lckZpcmVkKTsKKyAgcHA6Ok1vZHVsZTo6R2V0KCktPmNvcmUoKS0+Q2FsbE9uTWFpblRocmVhZChkZWxheV9pbl9tcywgY2FsbGJhY2ssIGlkKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6U2VhcmNoU3RyaW5nKGNvbnN0IGJhc2U6OmNoYXIxNiogc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OmNoYXIxNiogdGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhc2Vfc2Vuc2l0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNlYXJjaFN0cmluZ1Jlc3VsdD4qIHJlc3VsdHMpIHsKKyAgUFBfUHJpdmF0ZUZpbmRSZXN1bHQqIHBwX3Jlc3VsdHM7CisgIGludCBjb3VudCA9IDA7CisgIHBwOjpQREY6OlNlYXJjaFN0cmluZygKKyAgICAgIHRoaXMsCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oc3RyaW5nKSwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPih0ZXJtKSwKKyAgICAgIGNhc2Vfc2Vuc2l0aXZlLAorICAgICAgJnBwX3Jlc3VsdHMsCisgICAgICAmY291bnQpOworCisgIHJlc3VsdHMtPnJlc2l6ZShjb3VudCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICgqcmVzdWx0cylbaV0uc3RhcnRfaW5kZXggPSBwcF9yZXN1bHRzW2ldLnN0YXJ0X2luZGV4OworICAgICgqcmVzdWx0cylbaV0ubGVuZ3RoID0gcHBfcmVzdWx0c1tpXS5sZW5ndGg7CisgIH0KKworICBwcDo6TWVtb3J5X0RldiBtZW1vcnk7CisgIG1lbW9yeS5NZW1GcmVlKHBwX3Jlc3VsdHMpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpEb2N1bWVudFBhaW50T2NjdXJyZWQoKSB7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkRvY3VtZW50TG9hZENvbXBsZXRlKGludCBwYWdlX2NvdW50KSB7CisgIC8vIENsZWFyIGZvY3VzIHN0YXRlIGZvciBPU0suCisgIEZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShmYWxzZSk7CisKKyAgRENIRUNLKGRvY3VtZW50X2xvYWRfc3RhdGVfID09IExPQURfU1RBVEVfTE9BRElORyk7CisgIGRvY3VtZW50X2xvYWRfc3RhdGVfID0gTE9BRF9TVEFURV9DT01QTEVURTsKKyAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5Mb2FkU3VjY2VzcyIpOworCisgIC8vIE5vdGU6IElmIHdlIGFyZSBpbiBwcmludCBwcmV2aWV3IG1vZGUgdGhlIHNjcm9sbCBsb2NhdGlvbiBpcyByZXRhaW5lZAorICAvLyBhY3Jvc3MgZG9jdW1lbnQgbG9hZHMgc28gd2UgZG9uJ3Qgd2FudCB0byBzY3JvbGwgYWdhaW4gYW5kIG92ZXJyaWRlIGl0LgorICBpZiAoSXNQcmludFByZXZpZXcoKSkgeworICAgIEFwcGVuZEJsYW5rUHJpbnRQcmV2aWV3UGFnZXMoKTsKKyAgICBPbkdlb21ldHJ5Q2hhbmdlZCgwLCAwKTsKKyAgfQorCisgIHBwOjpWYXJEaWN0aW9uYXJ5IG1lc3NhZ2U7CisgIG1lc3NhZ2UuU2V0KHBwOjpWYXIoa1R5cGUpLCBwcDo6VmFyKGtKU0xvYWRQcm9ncmVzc1R5cGUpKTsKKyAgbWVzc2FnZS5TZXQocHA6OlZhcihrSlNQcm9ncmVzc1BlcmNlbnRhZ2UpLCBwcDo6VmFyKDEwMCkpIDsKKyAgUG9zdE1lc3NhZ2UobWVzc2FnZSk7CisKKyAgaWYgKCFmdWxsXykKKyAgICByZXR1cm47CisKKyAgaWYgKGRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfKSB7CisgICAgcHA6OlBERjo6RGlkU3RvcExvYWRpbmcodGhpcyk7CisgICAgZGlkX2NhbGxfc3RhcnRfbG9hZGluZ18gPSBmYWxzZTsKKyAgfQorCisgIGludCBjb250ZW50X3Jlc3RyaWN0aW9ucyA9CisgICAgICBDT05URU5UX1JFU1RSSUNUSU9OX0NVVCB8IENPTlRFTlRfUkVTVFJJQ1RJT05fUEFTVEU7CisgIGlmICghZW5naW5lXy0+SGFzUGVybWlzc2lvbihQREZFbmdpbmU6OlBFUk1JU1NJT05fQ09QWSkpCisgICAgY29udGVudF9yZXN0cmljdGlvbnMgfD0gQ09OVEVOVF9SRVNUUklDVElPTl9DT1BZOworCisgIGlmICghZW5naW5lXy0+SGFzUGVybWlzc2lvbihQREZFbmdpbmU6OlBFUk1JU1NJT05fUFJJTlRfTE9XX1FVQUxJVFkpICYmCisgICAgICAhZW5naW5lXy0+SGFzUGVybWlzc2lvbihQREZFbmdpbmU6OlBFUk1JU1NJT05fUFJJTlRfSElHSF9RVUFMSVRZKSkgeworICAgIHByaW50aW5nX2VuYWJsZWRfID0gZmFsc2U7CisgIH0KKworICBwcDo6UERGOjpTZXRDb250ZW50UmVzdHJpY3Rpb24odGhpcywgY29udGVudF9yZXN0cmljdGlvbnMpOworCisgIHVtYV8uSGlzdG9ncmFtQ3VzdG9tQ291bnRzKCJQREYuUGFnZUNvdW50IiwgcGFnZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMTAwMDAwMCwgNTApOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpSb3RhdGVDbG9ja3dpc2UoKSB7CisgIGVuZ2luZV8tPlJvdGF0ZUNsb2Nrd2lzZSgpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpSb3RhdGVDb3VudGVyY2xvY2t3aXNlKCkgeworICBlbmdpbmVfLT5Sb3RhdGVDb3VudGVyY2xvY2t3aXNlKCk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlByZXZpZXdEb2N1bWVudExvYWRDb21wbGV0ZSgpIHsKKyAgaWYgKHByZXZpZXdfZG9jdW1lbnRfbG9hZF9zdGF0ZV8gIT0gTE9BRF9TVEFURV9MT0FESU5HIHx8CisgICAgICBwcmV2aWV3X3BhZ2VzX2luZm9fLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwcmV2aWV3X2RvY3VtZW50X2xvYWRfc3RhdGVfID0gTE9BRF9TVEFURV9DT01QTEVURTsKKworICBpbnQgZGVzdF9wYWdlX2luZGV4ID0gcHJldmlld19wYWdlc19pbmZvXy5mcm9udCgpLnNlY29uZDsKKyAgaW50IHNyY19wYWdlX2luZGV4ID0KKyAgICAgIEV4dHJhY3RQcmludFByZXZpZXdQYWdlSW5kZXgocHJldmlld19wYWdlc19pbmZvXy5mcm9udCgpLmZpcnN0KTsKKyAgaWYgKHNyY19wYWdlX2luZGV4ID4gMCAmJiAgZGVzdF9wYWdlX2luZGV4ID4gLTEgJiYgcHJldmlld19lbmdpbmVfLmdldCgpKQorICAgIGVuZ2luZV8tPkFwcGVuZFBhZ2UocHJldmlld19lbmdpbmVfLmdldCgpLCBkZXN0X3BhZ2VfaW5kZXgpOworCisgIHByZXZpZXdfcGFnZXNfaW5mb18ucG9wKCk7CisgIC8vIHxwcmludF9wcmV2aWV3X3BhZ2VfY291bnRffCBpcyBub3QgdXBkYXRlZCB5ZXQuIERvIG5vdCBsb2FkIGFueQorICAvLyBvdGhlciBwcmV2aWV3IHBhZ2VzIHRpbGwgd2UgZ2V0IHRoaXMgaW5mb3JtYXRpb24uCisgIGlmIChwcmludF9wcmV2aWV3X3BhZ2VfY291bnRfID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChwcmV2aWV3X3BhZ2VzX2luZm9fLnNpemUoKSkKKyAgICBMb2FkQXZhaWxhYmxlUHJldmlld1BhZ2UoKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6RG9jdW1lbnRMb2FkRmFpbGVkKCkgeworICBEQ0hFQ0soZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPT0gTE9BRF9TVEFURV9MT0FESU5HKTsKKyAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oIlBERi5Mb2FkRmFpbHVyZSIpOworCisgIGlmIChkaWRfY2FsbF9zdGFydF9sb2FkaW5nXykgeworICAgIHBwOjpQREY6OkRpZFN0b3BMb2FkaW5nKHRoaXMpOworICAgIGRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfID0gZmFsc2U7CisgIH0KKworICBkb2N1bWVudF9sb2FkX3N0YXRlXyA9IExPQURfU1RBVEVfRkFJTEVEOworICBwYWludF9tYW5hZ2VyXy5JbnZhbGlkYXRlUmVjdChwcDo6UmVjdChwcDo6UG9pbnQoKSwgcGx1Z2luX3NpemVfKSk7CisKKyAgLy8gU2VuZCBhIHByb2dyZXNzIHZhbHVlIG9mIC0xIHRvIGluZGljYXRlIGEgZmFpbHVyZS4KKyAgcHA6OlZhckRpY3Rpb25hcnkgbWVzc2FnZTsKKyAgbWVzc2FnZS5TZXQocHA6OlZhcihrVHlwZSksIHBwOjpWYXIoa0pTTG9hZFByb2dyZXNzVHlwZSkpOworICBtZXNzYWdlLlNldChwcDo6VmFyKGtKU1Byb2dyZXNzUGVyY2VudGFnZSksIHBwOjpWYXIoLTEpKSA7CisgIFBvc3RNZXNzYWdlKG1lc3NhZ2UpOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpQcmV2aWV3RG9jdW1lbnRMb2FkRmFpbGVkKCkgeworICBVc2VyTWV0cmljc1JlY29yZEFjdGlvbigiUERGLlByZXZpZXdEb2N1bWVudExvYWRGYWlsdXJlIik7CisgIGlmIChwcmV2aWV3X2RvY3VtZW50X2xvYWRfc3RhdGVfICE9IExPQURfU1RBVEVfTE9BRElORyB8fAorICAgICAgcHJldmlld19wYWdlc19pbmZvXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJldmlld19kb2N1bWVudF9sb2FkX3N0YXRlXyA9IExPQURfU1RBVEVfRkFJTEVEOworICBwcmV2aWV3X3BhZ2VzX2luZm9fLnBvcCgpOworCisgIGlmIChwcmV2aWV3X3BhZ2VzX2luZm9fLnNpemUoKSkKKyAgICBMb2FkQXZhaWxhYmxlUHJldmlld1BhZ2UoKTsKK30KKworcHA6Okluc3RhbmNlKiBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6R2V0UGx1Z2luSW5zdGFuY2UoKSB7CisgIHJldHVybiB0aGlzOworfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpEb2N1bWVudEhhc1Vuc3VwcG9ydGVkRmVhdHVyZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmVhdHVyZSkgeworICBzdGQ6OnN0cmluZyBtZXRyaWMoIlBERl9VbnN1cHBvcnRlZF8iKTsKKyAgbWV0cmljICs9IGZlYXR1cmU7CisgIGlmICghdW5zdXBwb3J0ZWRfZmVhdHVyZXNfcmVwb3J0ZWRfLmNvdW50KG1ldHJpYykpIHsKKyAgICB1bnN1cHBvcnRlZF9mZWF0dXJlc19yZXBvcnRlZF8uaW5zZXJ0KG1ldHJpYyk7CisgICAgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24obWV0cmljKTsKKyAgfQorCisgIC8vIFNpbmNlIHdlIHVzZSBhbiBpbmZvIGJhciwgb25seSBkbyB0aGlzIGZvciBmdWxsIGZyYW1lIHBsdWdpbnMuLgorICBpZiAoIWZ1bGxfKQorICAgIHJldHVybjsKKworICBpZiAodG9sZF9icm93c2VyX2Fib3V0X3Vuc3VwcG9ydGVkX2ZlYXR1cmVfKQorICAgIHJldHVybjsKKyAgdG9sZF9icm93c2VyX2Fib3V0X3Vuc3VwcG9ydGVkX2ZlYXR1cmVfID0gdHJ1ZTsKKworICBwcDo6UERGOjpIYXNVbnN1cHBvcnRlZEZlYXR1cmUodGhpcyk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkRvY3VtZW50TG9hZFByb2dyZXNzKHVpbnQzMiBhdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgZG9jX3NpemUpIHsKKyAgZG91YmxlIHByb2dyZXNzID0gMC4wOworICBpZiAoZG9jX3NpemUgPT0gMCkgeworICAgIC8vIERvY3VtZW50IHNpemUgaXMgdW5rbm93bi4gVXNlIGhldXJpc3RpY3MuCisgICAgLy8gV2UnbGwgbWFrZSBwcm9ncmVzcyBsb2dhcml0aG1pYyBmcm9tIDAgdG8gMTAwTS4KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtGYWN0b3IgPSBsb2coMTAwMDAwMDAwLjApIC8gMTAwLjA7CisgICAgaWYgKGF2YWlsYWJsZSA+IDApIHsKKyAgICAgIHByb2dyZXNzID0gbG9nKHN0YXRpY19jYXN0PGRvdWJsZT4oYXZhaWxhYmxlKSkgLyBrRmFjdG9yOworICAgICAgaWYgKHByb2dyZXNzID4gMTAwLjApCisgICAgICAgIHByb2dyZXNzID0gMTAwLjA7CisgICAgfQorICB9IGVsc2UgeworICAgIHByb2dyZXNzID0gMTAwLjAgKiBzdGF0aWNfY2FzdDxkb3VibGU+KGF2YWlsYWJsZSkgLyBkb2Nfc2l6ZTsKKyAgfQorCisgIC8vIFdlIHNlbmQgMTAwJSBsb2FkIHByb2dyZXNzIGluIERvY3VtZW50TG9hZENvbXBsZXRlLgorICBpZiAocHJvZ3Jlc3MgPj0gMTAwKQorICAgIHJldHVybjsKKworICAvLyBBdm9pZCBzZW5kaW5nIHRvbyBtYW55IHByb2dyZXNzIG1lc3NhZ2VzIG92ZXIgUG9zdE1lc3NhZ2UuCisgIGlmIChwcm9ncmVzcyA+IGxhc3RfcHJvZ3Jlc3Nfc2VudF8gKyAxKSB7CisgICAgbGFzdF9wcm9ncmVzc19zZW50XyA9IHByb2dyZXNzOworICAgIHBwOjpWYXJEaWN0aW9uYXJ5IG1lc3NhZ2U7CisgICAgbWVzc2FnZS5TZXQocHA6OlZhcihrVHlwZSksIHBwOjpWYXIoa0pTTG9hZFByb2dyZXNzVHlwZSkpOworICAgIG1lc3NhZ2UuU2V0KHBwOjpWYXIoa0pTUHJvZ3Jlc3NQZXJjZW50YWdlKSwgcHA6OlZhcihwcm9ncmVzcykpIDsKKyAgICBQb3N0TWVzc2FnZShtZXNzYWdlKTsKKyAgfQorfQorCit2b2lkIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpGb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoYm9vbCBpbl9mb2N1cykgeworICBpZiAoIXRleHRfaW5wdXRfLmdldCgpKQorICAgIHJldHVybjsKKyAgaWYgKGluX2ZvY3VzKQorICAgIHRleHRfaW5wdXRfLT5TZXRUZXh0SW5wdXRUeXBlKFBQX1RFWFRJTlBVVF9UWVBFX0RFVl9URVhUKTsKKyAgZWxzZQorICAgIHRleHRfaW5wdXRfLT5TZXRUZXh0SW5wdXRUeXBlKFBQX1RFWFRJTlBVVF9UWVBFX0RFVl9OT05FKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6UmVzZXRSZWNlbnRseVNlbnRGaW5kVXBkYXRlKGludDMyX3QgLyogdW51c2VkICovKSB7CisgIHJlY2VudGx5X3NlbnRfZmluZF91cGRhdGVfID0gZmFsc2U7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6Ok9uR2VvbWV0cnlDaGFuZ2VkKGRvdWJsZSBvbGRfem9vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZF9kZXZpY2Vfc2NhbGUpIHsKKyAgaWYgKHpvb21fICE9IG9sZF96b29tIHx8IGRldmljZV9zY2FsZV8gIT0gb2xkX2RldmljZV9zY2FsZSkKKyAgICBlbmdpbmVfLT5ab29tVXBkYXRlZCh6b29tXyAqIGRldmljZV9zY2FsZV8pOworCisgIGF2YWlsYWJsZV9hcmVhXyA9IHBwOjpSZWN0KHBsdWdpbl9zaXplXyk7CisgIGludCBkb2Nfd2lkdGggPSBHZXREb2N1bWVudFBpeGVsV2lkdGgoKTsKKyAgaWYgKGRvY193aWR0aCA8IGF2YWlsYWJsZV9hcmVhXy53aWR0aCgpKSB7CisgICAgYXZhaWxhYmxlX2FyZWFfLk9mZnNldCgoYXZhaWxhYmxlX2FyZWFfLndpZHRoKCkgLSBkb2Nfd2lkdGgpIC8gMiwgMCk7CisgICAgYXZhaWxhYmxlX2FyZWFfLnNldF93aWR0aChkb2Nfd2lkdGgpOworICB9CisgIGludCBkb2NfaGVpZ2h0ID0gR2V0RG9jdW1lbnRQaXhlbEhlaWdodCgpOworICBpZiAoZG9jX2hlaWdodCA8IGF2YWlsYWJsZV9hcmVhXy5oZWlnaHQoKSkgeworICAgIGF2YWlsYWJsZV9hcmVhXy5zZXRfaGVpZ2h0KGRvY19oZWlnaHQpOworICB9CisKKyAgQ2FsY3VsYXRlQmFja2dyb3VuZFBhcnRzKCk7CisgIGVuZ2luZV8tPlBhZ2VPZmZzZXRVcGRhdGVkKGF2YWlsYWJsZV9hcmVhXy5wb2ludCgpKTsKKyAgZW5naW5lXy0+UGx1Z2luU2l6ZVVwZGF0ZWQoYXZhaWxhYmxlX2FyZWFfLnNpemUoKSk7CisKKyAgaWYgKCFkb2N1bWVudF9zaXplXy5HZXRBcmVhKCkpCisgICAgcmV0dXJuOworICBwYWludF9tYW5hZ2VyXy5JbnZhbGlkYXRlUmVjdChwcDo6UmVjdChwcDo6UG9pbnQoKSwgcGx1Z2luX3NpemVfKSk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkxvYWRVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCkgeworICBMb2FkVXJsSW50ZXJuYWwodXJsLCAmZW1iZWRfbG9hZGVyXywgJk91dE9mUHJvY2Vzc0luc3RhbmNlOjpEaWRPcGVuKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6TG9hZFByZXZpZXdVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCkgeworICBMb2FkVXJsSW50ZXJuYWwodXJsLCAmZW1iZWRfcHJldmlld19sb2FkZXJfLAorICAgICAgICAgICAgICAgICAgJk91dE9mUHJvY2Vzc0luc3RhbmNlOjpEaWRPcGVuUHJldmlldyk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkxvYWRVcmxJbnRlcm5hbCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXJsLAorICAgIHBwOjpVUkxMb2FkZXIqIGxvYWRlciwKKyAgICB2b2lkIChPdXRPZlByb2Nlc3NJbnN0YW5jZTo6KiBtZXRob2QpKGludDMyX3QpKSB7CisgIHBwOjpVUkxSZXF1ZXN0SW5mbyByZXF1ZXN0KHRoaXMpOworICByZXF1ZXN0LlNldFVSTCh1cmwpOworICByZXF1ZXN0LlNldE1ldGhvZCgiR0VUIik7CisKKyAgKmxvYWRlciA9IENyZWF0ZVVSTExvYWRlckludGVybmFsKCk7CisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBsb2FkZXJfZmFjdG9yeV8uTmV3Q2FsbGJhY2sobWV0aG9kKTsKKyAgaW50IHJ2ID0gbG9hZGVyLT5PcGVuKHJlcXVlc3QsIGNhbGxiYWNrKTsKKyAgaWYgKHJ2ICE9IFBQX09LX0NPTVBMRVRJT05QRU5ESU5HKQorICAgIGNhbGxiYWNrLlJ1bihydik7Cit9CisKK3BwOjpVUkxMb2FkZXIgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkNyZWF0ZVVSTExvYWRlckludGVybmFsKCkgeworICBwcDo6VVJMTG9hZGVyIGxvYWRlcih0aGlzKTsKKworICBjb25zdCBQUEJfVVJMTG9hZGVyVHJ1c3RlZCogdHJ1c3RlZF9pbnRlcmZhY2UgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQUEJfVVJMTG9hZGVyVHJ1c3RlZCo+KAorICAgICAgICAgIHBwOjpNb2R1bGU6OkdldCgpLT5HZXRCcm93c2VySW50ZXJmYWNlKAorICAgICAgICAgICAgICBQUEJfVVJMTE9BREVSVFJVU1RFRF9JTlRFUkZBQ0UpKTsKKyAgaWYgKHRydXN0ZWRfaW50ZXJmYWNlKQorICAgIHRydXN0ZWRfaW50ZXJmYWNlLT5HcmFudFVuaXZlcnNhbEFjY2Vzcyhsb2FkZXIucHBfcmVzb3VyY2UoKSk7CisgIHJldHVybiBsb2FkZXI7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlNldFpvb20oZG91YmxlIHNjYWxlKSB7CisgIGRvdWJsZSBvbGRfem9vbSA9IHpvb21fOworICB6b29tXyA9IHNjYWxlOworICBPbkdlb21ldHJ5Q2hhbmdlZChvbGRfem9vbSwgZGV2aWNlX3NjYWxlXyk7Cit9CisKK3N0ZDo6c3RyaW5nIE91dE9mUHJvY2Vzc0luc3RhbmNlOjpHZXRMb2NhbGl6ZWRTdHJpbmcoUFBfUmVzb3VyY2VTdHJpbmcgaWQpIHsKKyAgcHA6OlZhciBydihwcDo6UERGOjpHZXRMb2NhbGl6ZWRTdHJpbmcodGhpcywgaWQpKTsKKyAgaWYgKCFydi5pc19zdHJpbmcoKSkKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKworICByZXR1cm4gcnYuQXNTdHJpbmcoKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6QXBwZW5kQmxhbmtQcmludFByZXZpZXdQYWdlcygpIHsKKyAgaWYgKHByaW50X3ByZXZpZXdfcGFnZV9jb3VudF8gPT0gMCkKKyAgICByZXR1cm47CisgIGVuZ2luZV8tPkFwcGVuZEJsYW5rUGFnZXMocHJpbnRfcHJldmlld19wYWdlX2NvdW50Xyk7CisgIGlmIChwcmV2aWV3X3BhZ2VzX2luZm9fLnNpemUoKSA+IDApCisgICAgTG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCk7Cit9CisKK2Jvb2wgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OklzUHJpbnRQcmV2aWV3KCkgeworICByZXR1cm4gSXNQcmludFByZXZpZXdVcmwodXJsXyk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlByb2Nlc3NQcmV2aWV3UGFnZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wYWdlX2luZGV4KSB7CisgIGlmICghSXNQcmludFByZXZpZXcoKSkKKyAgICByZXR1cm47CisKKyAgaW50IHNyY19wYWdlX2luZGV4ID0gRXh0cmFjdFByaW50UHJldmlld1BhZ2VJbmRleCh1cmwpOworICBpZiAoc3JjX3BhZ2VfaW5kZXggPCAxKQorICAgIHJldHVybjsKKworICBwcmV2aWV3X3BhZ2VzX2luZm9fLnB1c2goc3RkOjptYWtlX3BhaXIodXJsLCBkc3RfcGFnZV9pbmRleCkpOworICBMb2FkQXZhaWxhYmxlUHJldmlld1BhZ2UoKTsKK30KKwordm9pZCBPdXRPZlByb2Nlc3NJbnN0YW5jZTo6TG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCkgeworICBpZiAocHJldmlld19wYWdlc19pbmZvXy5zaXplKCkgPD0gMCB8fAorICAgICAgZG9jdW1lbnRfbG9hZF9zdGF0ZV8gIT0gTE9BRF9TVEFURV9DT01QTEVURSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHVybCA9IHByZXZpZXdfcGFnZXNfaW5mb18uZnJvbnQoKS5maXJzdDsKKyAgaW50IGRzdF9wYWdlX2luZGV4ID0gcHJldmlld19wYWdlc19pbmZvXy5mcm9udCgpLnNlY29uZDsKKyAgaW50IHNyY19wYWdlX2luZGV4ID0gRXh0cmFjdFByaW50UHJldmlld1BhZ2VJbmRleCh1cmwpOworICBpZiAoc3JjX3BhZ2VfaW5kZXggPCAxIHx8CisgICAgICBkc3RfcGFnZV9pbmRleCA+PSBwcmludF9wcmV2aWV3X3BhZ2VfY291bnRfIHx8CisgICAgICBwcmV2aWV3X2RvY3VtZW50X2xvYWRfc3RhdGVfID09IExPQURfU1RBVEVfTE9BRElORykgeworICAgIHJldHVybjsKKyAgfQorCisgIHByZXZpZXdfZG9jdW1lbnRfbG9hZF9zdGF0ZV8gPSBMT0FEX1NUQVRFX0xPQURJTkc7CisgIExvYWRQcmV2aWV3VXJsKHVybCk7Cit9CisKK3ZvaWQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OlVzZXJNZXRyaWNzUmVjb3JkQWN0aW9uKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3Rpb24pIHsKKyAgLy8gVE9ETyhyYXltZXMpOiBNb3ZlIHRoaXMgZnVuY3Rpb24gdG8gUFBCX1VNQV9Qcml2YXRlLgorICBwcDo6UERGOjpVc2VyTWV0cmljc1JlY29yZEFjdGlvbih0aGlzLCBwcDo6VmFyKGFjdGlvbikpOworfQorCitwcDo6UG9pbnQgT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OkJvdW5kU2Nyb2xsT2Zmc2V0VG9Eb2N1bWVudCgKKyAgICBjb25zdCBwcDo6UG9pbnQmIHNjcm9sbF9vZmZzZXQpIHsKKyAgaW50IG1heF94ID0gZG9jdW1lbnRfc2l6ZV8ud2lkdGgoKSAqIHpvb21fIC0gcGx1Z2luX2RpcF9zaXplXy53aWR0aCgpOworICBpbnQgeCA9IHN0ZDo6bWF4KHN0ZDo6bWluKHNjcm9sbF9vZmZzZXQueCgpLCBtYXhfeCksIDApOworICBpbnQgbWF4X3kgPSBkb2N1bWVudF9zaXplXy5oZWlnaHQoKSAqIHpvb21fIC0gcGx1Z2luX2RpcF9zaXplXy5oZWlnaHQoKTsKKyAgaW50IHkgPSBzdGQ6Om1heChzdGQ6Om1pbihzY3JvbGxfb2Zmc2V0LnkoKSwgbWF4X3kpLCAwKTsKKyAgcmV0dXJuIHBwOjpQb2ludCh4LCB5KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9vdXRfb2ZfcHJvY2Vzc19pbnN0YW5jZS5oIGIveGZhX3Rlc3QvcGRmL291dF9vZl9wcm9jZXNzX2luc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1ZjA1MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9vdXRfb2ZfcHJvY2Vzc19pbnN0YW5jZS5oCkBAIC0wLDAgKzEsMzQ1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBERl9PVVRfT0ZfUFJPQ0VTU19JTlNUQU5DRV9IXworI2RlZmluZSBQREZfT1VUX09GX1BST0NFU1NfSU5TVEFOQ0VfSF8KKworI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAicGRmL3BhaW50X21hbmFnZXIuaCIKKyNpbmNsdWRlICJwZGYvcGRmX2VuZ2luZS5oIgorI2luY2x1ZGUgInBkZi9wcmV2aWV3X21vZGVfY2xpZW50LmgiCisKKyNpbmNsdWRlICJwcGFwaS9jL3ByaXZhdGUvcHBiX3BkZi5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9kZXYvcHJpbnRpbmdfZGV2LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2Rldi9zY3JpcHRhYmxlX29iamVjdF9kZXByZWNhdGVkLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2Rldi9zZWxlY3Rpb25fZGV2LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2dyYXBoaWNzXzJkLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2ltYWdlX2RhdGEuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvaW5wdXRfZXZlbnQuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS9maW5kX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS91bWFfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC91cmxfbG9hZGVyLmgiCisjaW5jbHVkZSAicHBhcGkvdXRpbGl0eS9jb21wbGV0aW9uX2NhbGxiYWNrX2ZhY3RvcnkuaCIKKworbmFtZXNwYWNlIHBwIHsKK2NsYXNzIFRleHRJbnB1dF9EZXY7Cit9CisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgT3V0T2ZQcm9jZXNzSW5zdGFuY2UgOiBwdWJsaWMgcHA6Okluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgcHA6OkZpbmRfUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHBwOjpQcmludGluZ19EZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBwcDo6U2VsZWN0aW9uX0RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBhaW50TWFuYWdlcjo6Q2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUERGRW5naW5lOjpDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQcmV2aWV3TW9kZUNsaWVudDo6Q2xpZW50IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE91dE9mUHJvY2Vzc0luc3RhbmNlKFBQX0luc3RhbmNlIGluc3RhbmNlKTsKKyAgdmlydHVhbCB+T3V0T2ZQcm9jZXNzSW5zdGFuY2UoKTsKKworICAvLyBwcDo6SW5zdGFuY2UgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBJbml0KHVpbnQzMl90IGFyZ2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ25bXSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJndltdKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEhhbmRsZU1lc3NhZ2UoY29uc3QgcHA6OlZhciYgbWVzc2FnZSkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBIYW5kbGVJbnB1dEV2ZW50KGNvbnN0IHBwOjpJbnB1dEV2ZW50JiBldmVudCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBEaWRDaGFuZ2VWaWV3KGNvbnN0IHBwOjpWaWV3JiB2aWV3KSBvdmVycmlkZTsKKworICAvLyBwcDo6RmluZF9Qcml2YXRlIGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIGJvb2wgU3RhcnRGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCBib29sIGNhc2Vfc2Vuc2l0aXZlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNlbGVjdEZpbmRSZXN1bHQoYm9vbCBmb3J3YXJkKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFN0b3BGaW5kKCkgb3ZlcnJpZGU7CisKKyAgLy8gcHA6OlBhaW50TWFuYWdlcjo6Q2xpZW50IGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIHZvaWQgT25QYWludChjb25zdCBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4mIHBhaW50X3JlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYWludE1hbmFnZXI6OlJlYWR5UmVjdD4qIHJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIHBlbmRpbmcpIG92ZXJyaWRlOworCisgIC8vIHBwOjpQcmludGluZ19EZXYgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgdWludDMyX3QgUXVlcnlTdXBwb3J0ZWRQcmludE91dHB1dEZvcm1hdHMoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBpbnQzMl90IFByaW50QmVnaW4oCisgICAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpIG92ZXJyaWRlOworICB2aXJ0dWFsIHBwOjpSZXNvdXJjZSBQcmludFBhZ2VzKAorICAgICAgY29uc3QgUFBfUHJpbnRQYWdlTnVtYmVyUmFuZ2VfRGV2KiBwYWdlX3JhbmdlcywKKyAgICAgIHVpbnQzMl90IHBhZ2VfcmFuZ2VfY291bnQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgUHJpbnRFbmQoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBib29sIElzUHJpbnRTY2FsaW5nRGlzYWJsZWQoKSBvdmVycmlkZTsKKworICAvLyBwcDo6UHJpdmF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCBwcDo6VmFyIEdldExpbmtBdFBvc2l0aW9uKGNvbnN0IHBwOjpQb2ludCYgcG9pbnQpOworCisgIC8vIFBQUF9TZWxlY3Rpb25fRGV2IGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIHBwOjpWYXIgR2V0U2VsZWN0ZWRUZXh0KGJvb2wgaHRtbCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBGbHVzaENhbGxiYWNrKGludDMyX3QgcmVzdWx0KTsKKyAgdm9pZCBEaWRPcGVuKGludDMyX3QgcmVzdWx0KTsKKyAgdm9pZCBEaWRPcGVuUHJldmlldyhpbnQzMl90IHJlc3VsdCk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIHRpbWVyIGlzIGZpcmVkLgorICB2b2lkIE9uQ2xpZW50VGltZXJGaXJlZChpbnQzMl90IGlkKTsKKworICAvLyBDYWxsZWQgdG8gcHJpbnQgd2l0aG91dCByZS1lbnRyYW5jeSBpc3N1ZXMuCisgIHZvaWQgT25QcmludChpbnQzMl90KTsKKworICAvLyBQREZFbmdpbmU6OkNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCB2b2lkIERvY3VtZW50U2l6ZVVwZGF0ZWQoY29uc3QgcHA6OlNpemUmIHNpemUpOworICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZShjb25zdCBwcDo6UmVjdCYgcmVjdCk7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGwoY29uc3QgcHA6OlBvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxUb1goaW50IHBvc2l0aW9uKTsKKyAgdmlydHVhbCB2b2lkIFNjcm9sbFRvWShpbnQgcG9zaXRpb24pOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsVG9QYWdlKGludCBwYWdlKTsKKyAgdmlydHVhbCB2b2lkIE5hdmlnYXRlVG8oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwgYm9vbCBvcGVuX2luX25ld190YWIpOworICB2aXJ0dWFsIHZvaWQgVXBkYXRlQ3Vyc29yKFBQX0N1cnNvclR5cGVfRGV2IGN1cnNvcik7CisgIHZpcnR1YWwgdm9pZCBVcGRhdGVUaWNrTWFya3MoY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+JiB0aWNrbWFya3MpOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5TnVtYmVyT2ZGaW5kUmVzdWx0c0NoYW5nZWQoaW50IHRvdGFsLCBib29sIGZpbmFsX3Jlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBOb3RpZnlTZWxlY3RlZEZpbmRSZXN1bHRDaGFuZ2VkKGludCBjdXJyZW50X2ZpbmRfaW5kZXgpOworICB2aXJ0dWFsIHZvaWQgR2V0RG9jdW1lbnRQYXNzd29yZCgKKyAgICAgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tXaXRoT3V0cHV0PHBwOjpWYXI+IGNhbGxiYWNrKTsKKyAgdmlydHVhbCB2b2lkIEFsZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKyAgdmlydHVhbCBib29sIENvbmZpcm0oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByb21wdChjb25zdCBzdGQ6OnN0cmluZyYgcXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X2Fuc3dlcik7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VVJMKCk7CisgIHZpcnR1YWwgdm9pZCBFbWFpbChjb25zdCBzdGQ6OnN0cmluZyYgdG8sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYm9keSk7CisgIHZpcnR1YWwgdm9pZCBQcmludCgpOworICB2aXJ0dWFsIHZvaWQgU3VibWl0Rm9ybShjb25zdCBzdGQ6OnN0cmluZyYgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBTaG93RmlsZVNlbGVjdGlvbkRpYWxvZygpOworICB2aXJ0dWFsIHBwOjpVUkxMb2FkZXIgQ3JlYXRlVVJMTG9hZGVyKCk7CisgIHZpcnR1YWwgdm9pZCBTY2hlZHVsZUNhbGxiYWNrKGludCBpZCwgaW50IGRlbGF5X2luX21zKTsKKyAgdmlydHVhbCB2b2lkIFNlYXJjaFN0cmluZyhjb25zdCBiYXNlOjpjaGFyMTYqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpjaGFyMTYqIHRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTZWFyY2hTdHJpbmdSZXN1bHQ+KiByZXN1bHRzKTsKKyAgdmlydHVhbCB2b2lkIERvY3VtZW50UGFpbnRPY2N1cnJlZCgpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkQ29tcGxldGUoaW50IHBhZ2VfY291bnQpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkRmFpbGVkKCk7CisgIHZpcnR1YWwgcHA6Okluc3RhbmNlKiBHZXRQbHVnaW5JbnN0YW5jZSgpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRIYXNVbnN1cHBvcnRlZEZlYXR1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGZlYXR1cmUpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkUHJvZ3Jlc3ModWludDMyIGF2YWlsYWJsZSwgdWludDMyIGRvY19zaXplKTsKKyAgdmlydHVhbCB2b2lkIEZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShib29sIGluX2ZvY3VzKTsKKyAgdmlydHVhbCBib29sIElzUHJpbnRQcmV2aWV3KCk7CisKKyAgLy8gUHJldmlld01vZGVDbGllbnQ6OkNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCB2b2lkIFByZXZpZXdEb2N1bWVudExvYWRDb21wbGV0ZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgUHJldmlld0RvY3VtZW50TG9hZEZhaWxlZCgpIG92ZXJyaWRlOworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBQUFBfUERGLgorICB2b2lkIFJvdGF0ZUNsb2Nrd2lzZSgpOworICB2b2lkIFJvdGF0ZUNvdW50ZXJjbG9ja3dpc2UoKTsKKworIHByaXZhdGU6CisgIHZvaWQgUmVzZXRSZWNlbnRseVNlbnRGaW5kVXBkYXRlKGludDMyX3QpOworCisgIC8vIENhbGxlZCB3aGVuZXZlciB0aGUgcGx1Z2luIGdlb21ldHJ5IGNoYW5nZXMgdG8gdXBkYXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgLy8gYmFja2dyb3VuZCBwYXJ0cywgYW5kIG5vdGlmaWVzIHRoZSBwZGYgZW5naW5lLgorICB2b2lkIE9uR2VvbWV0cnlDaGFuZ2VkKGRvdWJsZSBvbGRfem9vbSwgZmxvYXQgb2xkX2RldmljZV9zY2FsZSk7CisKKyAgLy8gRmlndXJlcyBvdXQgdGhlIGxvY2F0aW9uIG9mIGFueSBiYWNrZ3JvdW5kIHJlY3RhbmdsZXMgKGkuZS4gdGhvc2UgdGhhdAorICAvLyBhcmVuJ3QgcGFpbnRlZCBieSB0aGUgUERGIGVuZ2luZSkuCisgIHZvaWQgQ2FsY3VsYXRlQmFja2dyb3VuZFBhcnRzKCk7CisKKyAgLy8gQ29tcHV0ZXMgZG9jdW1lbnQgd2lkdGgvaGVpZ2h0IGluIGRldmljZSBwaXhlbHMsIGJhc2VkIG9uIGN1cnJlbnQgem9vbSBhbmQKKyAgLy8gZGV2aWNlIHNjYWxlCisgIGludCBHZXREb2N1bWVudFBpeGVsV2lkdGgoKSBjb25zdDsKKyAgaW50IEdldERvY3VtZW50UGl4ZWxIZWlnaHQoKSBjb25zdDsKKworICAvLyBEcmF3cyBhIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9ucyBhbmQgY29sb3IgaW4gb3VyIGJ1ZmZlci4KKyAgdm9pZCBGaWxsUmVjdChjb25zdCBwcDo6UmVjdCYgcmVjdCwgdWludDMyIGNvbG9yKTsKKworICB2b2lkIExvYWRVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCk7CisgIHZvaWQgTG9hZFByZXZpZXdVcmwoY29uc3Qgc3RkOjpzdHJpbmcmIHVybCk7CisgIHZvaWQgTG9hZFVybEludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsIHBwOjpVUkxMb2FkZXIqIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoT3V0T2ZQcm9jZXNzSW5zdGFuY2U6OiogbWV0aG9kKShpbnQzMl90KSk7CisKKyAgLy8gQ3JlYXRlcyBhIFVSTCBsb2FkZXIgYW5kIGFsbG93cyBpdCB0byBhY2Nlc3MgYWxsIHVybHMsIGkuZS4gbm90IGp1c3QgdGhlCisgIC8vIGZyYW1lJ3Mgb3JpZ2luLgorICBwcDo6VVJMTG9hZGVyIENyZWF0ZVVSTExvYWRlckludGVybmFsKCk7CisKKyAgLy8gRmlndXJlIG91dCB0aGUgaW5pdGlhbCBwYWdlIHRvIGRpc3BsYXkgYmFzZWQgb24gI3BhZ2U9TiBhbmQgI25hbWVkZGVzdD1mb28KKyAgLy8gaW4gdGhlIHx1cmxffC4KKyAgLy8gUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyB2YWxpZCBmcmFnbWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIDAtYmFzZWQsCisgIC8vIHdoZXJlYXMgcGFnZT1OIGlzIDEtYmFzZWQuCisgIGludCBHZXRJbml0aWFsUGFnZShjb25zdCBzdGQ6OnN0cmluZyYgdXJsKTsKKworICB2b2lkIEZvcm1EaWRPcGVuKGludDMyX3QgcmVzdWx0KTsKKworICBzdGQ6OnN0cmluZyBHZXRMb2NhbGl6ZWRTdHJpbmcoUFBfUmVzb3VyY2VTdHJpbmcgaWQpOworCisgIHZvaWQgVXNlck1ldHJpY3NSZWNvcmRBY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFjdGlvbik7CisKKyAgZW51bSBEb2N1bWVudExvYWRTdGF0ZSB7CisgICAgTE9BRF9TVEFURV9MT0FESU5HLAorICAgIExPQURfU1RBVEVfQ09NUExFVEUsCisgICAgTE9BRF9TVEFURV9GQUlMRUQsCisgIH07CisKKyAgLy8gU2V0IG5ldyB6b29tIHNjYWxlLgorICB2b2lkIFNldFpvb20oZG91YmxlIHNjYWxlKTsKKworICAvLyBSZWR1Y2VzIHRoZSBkb2N1bWVudCB0byAxIHBhZ2UgYW5kIGFwcGVuZHMgfHByaW50X3ByZXZpZXdfcGFnZV9jb3VudF98CisgIC8vIGJsYW5rIHBhZ2VzIHRvIHRoZSBkb2N1bWVudCBmb3IgcHJpbnQgcHJldmlldy4KKyAgdm9pZCBBcHBlbmRCbGFua1ByaW50UHJldmlld1BhZ2VzKCk7CisKKyAgLy8gUHJvY2VzcyB0aGUgcHJldmlldyBwYWdlIGRhdGEgaW5mb3JtYXRpb24uIHxzcmNfdXJsfCBzcGVjaWZpZXMgdGhlIHByZXZpZXcKKyAgLy8gcGFnZSBkYXRhIGxvY2F0aW9uLiBUaGUgfHNyY191cmx8IGlzIGluIHRoZSBmb3JtYXQ6CisgIC8vIGNocm9tZTovL3ByaW50L2lkL3BhZ2VfbnVtYmVyL3ByaW50LnBkZgorICAvLyB8ZHN0X3BhZ2VfaW5kZXh8IHNwZWNpZmllcyB0aGUgYmxhbmsgcGFnZSBpbmRleCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkCisgIC8vIHdpdGggdGhlIG5ldyBwYWdlIGRhdGEuCisgIHZvaWQgUHJvY2Vzc1ByZXZpZXdQYWdlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjX3VybCwgaW50IGRzdF9wYWdlX2luZGV4KTsKKyAgLy8gTG9hZCB0aGUgbmV4dCBhdmFpbGFibGUgcHJldmlldyBwYWdlIGludG8gdGhlIGJsYW5rIHBhZ2UuCisgIHZvaWQgTG9hZEF2YWlsYWJsZVByZXZpZXdQYWdlKCk7CisKKyAgLy8gQm91bmQgdGhlIGdpdmVuIHNjcm9sbCBvZmZzZXQgdG8gdGhlIGRvY3VtZW50LgorICBwcDo6UG9pbnQgQm91bmRTY3JvbGxPZmZzZXRUb0RvY3VtZW50KGNvbnN0IHBwOjpQb2ludCYgc2Nyb2xsX29mZnNldCk7CisKKyAgcHA6OkltYWdlRGF0YSBpbWFnZV9kYXRhXzsKKyAgLy8gVXNlZCB3aGVuIHRoZSBwbHVnaW4gaXMgZW1iZWRkZWQgaW4gYSBwYWdlIGFuZCB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgbG9hZGVyCisgIC8vIG91cnNlbGYuCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tGYWN0b3J5PE91dE9mUHJvY2Vzc0luc3RhbmNlPiBsb2FkZXJfZmFjdG9yeV87CisgIHBwOjpVUkxMb2FkZXIgZW1iZWRfbG9hZGVyXzsKKyAgcHA6OlVSTExvYWRlciBlbWJlZF9wcmV2aWV3X2xvYWRlcl87CisKKyAgUFBfQ3Vyc29yVHlwZV9EZXYgY3Vyc29yXzsgIC8vIFRoZSBjdXJyZW50IGN1cnNvci4KKworICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrRmFjdG9yeTxPdXRPZlByb2Nlc3NJbnN0YW5jZT4gdGltZXJfZmFjdG9yeV87CisKKyAgLy8gU2l6ZSwgaW4gcGl4ZWxzLCBvZiBwbHVnaW4gcmVjdGFuZ2xlLgorICBwcDo6U2l6ZSBwbHVnaW5fc2l6ZV87CisgIC8vIFNpemUsIGluIERJUHMsIG9mIHBsdWdpbiByZWN0YW5nbGUuCisgIHBwOjpTaXplIHBsdWdpbl9kaXBfc2l6ZV87CisgIC8vIFJlbWFpbmluZyBhcmVhLCBpbiBwaXhlbHMsIHRvIHJlbmRlciB0aGUgcGRmIGluIGFmdGVyIGFjY291bnRpbmcgZm9yCisgIC8vIGhvcml6b250YWwgY2VudGVyaW5nLgorICBwcDo6UmVjdCBhdmFpbGFibGVfYXJlYV87CisgIC8vIFNpemUgb2YgZW50aXJlIGRvY3VtZW50IGluIHBpeGVscyAoaS5lLiBpZiBlYWNoIHBhZ2UgaXMgODAwIHBpeGVscyBoaWdoIGFuZAorICAvLyB0aGVyZSBhcmUgMTAgcGFnZXMsIHRoZSBoZWlnaHQgd2lsbCBiZSA4MDAwKS4KKyAgcHA6OlNpemUgZG9jdW1lbnRfc2l6ZV87CisKKyAgZG91YmxlIHpvb21fOyAgLy8gQ3VycmVudCB6b29tIGZhY3Rvci4KKworICBmbG9hdCBkZXZpY2Vfc2NhbGVfOyAgLy8gQ3VycmVudCBkZXZpY2Ugc2NhbGUgZmFjdG9yLgorICBib29sIHByaW50aW5nX2VuYWJsZWRfOworICAvLyBUcnVlIGlmIHRoZSBwbHVnaW4gaXMgZnVsbC1wYWdlLgorICBib29sIGZ1bGxfOworCisgIFBhaW50TWFuYWdlciBwYWludF9tYW5hZ2VyXzsKKworICBzdHJ1Y3QgQmFja2dyb3VuZFBhcnQgeworICAgIHBwOjpSZWN0IGxvY2F0aW9uOworICAgIHVpbnQzMiBjb2xvcjsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8QmFja2dyb3VuZFBhcnQ+IGJhY2tncm91bmRfcGFydHNfOworCisgIHN0cnVjdCBQcmludFNldHRpbmdzIHsKKyAgICBQcmludFNldHRpbmdzKCkgeworICAgICAgQ2xlYXIoKTsKKyAgICB9CisgICAgdm9pZCBDbGVhcigpIHsKKyAgICAgIGlzX3ByaW50aW5nID0gZmFsc2U7CisgICAgICBwcmludF9wYWdlc19jYWxsZWRfID0gZmFsc2U7CisgICAgICBtZW1zZXQoJnBlcHBlcl9wcmludF9zZXR0aW5ncywgMCwgc2l6ZW9mKHBlcHBlcl9wcmludF9zZXR0aW5ncykpOworICAgIH0KKyAgICAvLyBUaGlzIGlzIHNldCB0byB0cnVlIHdoZW4gUHJpbnRCZWdpbiBpcyBjYWxsZWQgYW5kIGZhbHNlIHdoZW4gUHJpbnRFbmQgaXMKKyAgICAvLyBjYWxsZWQuCisgICAgYm9vbCBpc19wcmludGluZzsKKyAgICAvLyBUbyBrbm93IHdoZXRoZXIgdGhpcyB3YXMgYW4gYWN0dWFsIHByaW50IG9wZXJhdGlvbiwgc28gd2UgZG9uJ3QgZG91YmxlCisgICAgLy8gY291bnQgVU1BIGxvZ2dpbmcuCisgICAgYm9vbCBwcmludF9wYWdlc19jYWxsZWRfOworICAgIFBQX1ByaW50U2V0dGluZ3NfRGV2IHBlcHBlcl9wcmludF9zZXR0aW5nczsKKyAgfTsKKworICBQcmludFNldHRpbmdzIHByaW50X3NldHRpbmdzXzsKKworICBzY29wZWRfcHRyPFBERkVuZ2luZT4gZW5naW5lXzsKKworICAvLyBUaGlzIGVuZ2luZSBpcyB1c2VkIHRvIHJlbmRlciB0aGUgaW5kaXZpZHVhbCBwcmV2aWV3IHBhZ2UgZGF0YS4gVGhpcyBpcworICAvLyB1c2VkIG9ubHkgaW4gcHJpbnQgcHJldmlldyBtb2RlLiBUaGlzIHdpbGwgdXNlIHxQcmV2aWV3TW9kZUNsaWVudHwKKyAgLy8gaW50ZXJmYWNlIHdoaWNoIGhhcyB2ZXJ5IGxpbWl0ZWQgYWNjZXNzIHRvIHRoZSBwcDo6SW5zdGFuY2UuCisgIHNjb3BlZF9wdHI8UERGRW5naW5lPiBwcmV2aWV3X2VuZ2luZV87CisKKyAgc3RkOjpzdHJpbmcgdXJsXzsKKworICAvLyBVc2VkIGZvciBzdWJtaXR0aW5nIGZvcm1zLgorICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrRmFjdG9yeTxPdXRPZlByb2Nlc3NJbnN0YW5jZT4gZm9ybV9mYWN0b3J5XzsKKyAgcHA6OlVSTExvYWRlciBmb3JtX2xvYWRlcl87CisKKyAgLy8gVXNlZCBmb3IgcHJpbnRpbmcgd2l0aG91dCByZS1lbnRyYW5jeSBpc3N1ZXMuCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tGYWN0b3J5PE91dE9mUHJvY2Vzc0luc3RhbmNlPiBwcmludF9jYWxsYmFja19mYWN0b3J5XzsKKworICAvLyBUcnVlIGlmIHdlIGhhdmVuJ3QgcGFpbnRlZCB0aGUgcGx1Z2luIHZpZXdwb3J0IHlldC4KKyAgYm9vbCBmaXJzdF9wYWludF87CisKKyAgRG9jdW1lbnRMb2FkU3RhdGUgZG9jdW1lbnRfbG9hZF9zdGF0ZV87CisgIERvY3VtZW50TG9hZFN0YXRlIHByZXZpZXdfZG9jdW1lbnRfbG9hZF9zdGF0ZV87CisKKyAgLy8gQSBVTUEgcmVzb3VyY2UgZm9yIGhpc3RvZ3JhbSByZXBvcnRpbmcuCisgIHBwOjpVTUFQcml2YXRlIHVtYV87CisKKyAgLy8gVXNlZCBzbyB0aGF0IHdlIG9ubHkgdGVsbCB0aGUgYnJvd3NlciBvbmNlIGFib3V0IGFuIHVuc3VwcG9ydGVkIGZlYXR1cmUsIHRvCisgIC8vIGF2b2lkIHRoZSBpbmZvYmFyIGdvaW5nIHVwIG1vcmUgdGhhbiBvbmNlLgorICBib29sIHRvbGRfYnJvd3Nlcl9hYm91dF91bnN1cHBvcnRlZF9mZWF0dXJlXzsKKworICAvLyBLZWVwcyB0cmFjayBvZiB3aGljaCB1bnN1cHBvcnRlZCBmZWF0dXJlcyB3ZSByZXBvcnRlZCwgc28gd2UgYXZvaWQgc3BhbW1pbmcKKyAgLy8gdGhlIHN0YXRzIGlmIGEgZmVhdHVyZSBzaG93cyB1cCBtYW55IHRpbWVzIHBlciBkb2N1bWVudC4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVuc3VwcG9ydGVkX2ZlYXR1cmVzX3JlcG9ydGVkXzsKKworICAvLyBOdW1iZXIgb2YgcGFnZXMgaW4gcHJpbnQgcHJldmlldyBtb2RlLCAwIGlmIG5vdCBpbiBwcmludCBwcmV2aWV3IG1vZGUuCisgIGludCBwcmludF9wcmV2aWV3X3BhZ2VfY291bnRfOworICBzdGQ6OnZlY3RvcjxpbnQ+IHByaW50X3ByZXZpZXdfcGFnZV9udW1iZXJzXzsKKworICAvLyBVc2VkIHRvIG1hbmFnZSBsb2FkZWQgcHJpbnQgcHJldmlldyBwYWdlIGluZm9ybWF0aW9uLiBBIHxQcmV2aWV3UGFnZUluZm98CisgIC8vIGNvbnNpc3RzIG9mIGRhdGEgc291cmNlIHVybCBzdHJpbmcgYW5kIHRoZSBwYWdlIGluZGV4IGluIHRoZSBkZXN0aW5hdGlvbgorICAvLyBkb2N1bWVudC4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gUHJldmlld1BhZ2VJbmZvOworICBzdGQ6OnF1ZXVlPFByZXZpZXdQYWdlSW5mbz4gcHJldmlld19wYWdlc19pbmZvXzsKKworICAvLyBVc2VkIHRvIHNpZ25hbCB0aGUgYnJvd3NlciBhYm91dCBmb2N1cyBjaGFuZ2VzIHRvIHRyaWdnZXIgdGhlIE9TSy4KKyAgLy8gVE9ETyhhYm9kZW5oYUBjaHJvbWl1bS5vcmcpIEltcGxlbWVudCBmdWxsIElNRSBzdXBwb3J0IGluIHRoZSBwbHVnaW4uCisgIC8vIGh0dHA6Ly9jcmJ1Zy5jb20vMTMyNTY1CisgIHNjb3BlZF9wdHI8cHA6OlRleHRJbnB1dF9EZXY+IHRleHRfaW5wdXRfOworCisgIC8vIFRoZSBsYXN0IGRvY3VtZW50IGxvYWQgcHJvZ3Jlc3MgdmFsdWUgc2VudCB0byB0aGUgd2ViIHBhZ2UuCisgIGRvdWJsZSBsYXN0X3Byb2dyZXNzX3NlbnRfOworCisgIC8vIFdoZXRoZXIgYW4gdXBkYXRlIHRvIHRoZSBudW1iZXIgb2YgZmluZCByZXN1bHRzIGZvdW5kIHdhcyBzZW50IGxlc3MgdGhhbgorICAvLyB8a0ZpbmRSZXN1bHRDb29sZG93bk1zfCBtaWxsaXNlY29uZHMgYWdvLgorICBib29sIHJlY2VudGx5X3NlbnRfZmluZF91cGRhdGVfOworCisgIC8vIFRoZSB0aWNrbWFya3MuCisgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiB0aWNrbWFya3NfOworCisgIC8vIFdoZXRoZXIgdGhlIHBsdWdpbiBoYXMgcmVjZWl2ZWQgYSB2aWV3cG9ydCBjaGFuZ2VkIG1lc3NhZ2UuIE5vdGhpbmcgc2hvdWxkCisgIC8vIGJlIHBhaW50ZWQgdW50aWwgdGhpcyBpcyByZWNlaXZlZC4KKyAgYm9vbCByZWNlaXZlZF92aWV3cG9ydF9tZXNzYWdlXzsKKworICAvLyBJZiB0cnVlLCB0aGlzIG1lYW5zIHdlIHRvbGQgdGhlIFJlbmRlclZpZXcgdGhhdCB3ZSdyZSBzdGFydGluZyBhIG5ldHdvcmsKKyAgLy8gcmVxdWVzdCBzbyB0aGF0IGl0IGNhbiBzdGFydCB0aGUgdGhyb2JiZXIuIFdlIHdpbGwgdGVsbCBpdCBhZ2FpbiBvbmNlIHRoZQorICAvLyBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nLgorICBib29sIGRpZF9jYWxsX3N0YXJ0X2xvYWRpbmdfOworCisgIC8vIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiBkb24ndCBzY3JvbGwgdGhlIHBsdWdpbiBpbiByZXNwb25zZSB0byBEaWRDaGFuZ2VWaWV3CisgIC8vIG1lc3NhZ2VzLiBUaGlzIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBleHRlbnNpb24gcGFnZSBpcyBpbiB0aGUgcHJvY2VzcyBvZgorICAvLyB6b29taW5nIHRoZSBwbHVnaW4gc28gdGhhdCBmbGlja2VyaW5nIGRvZXNuJ3Qgb2NjdXIgd2hpbGUgem9vbWluZy4KKyAgYm9vbCBzdG9wX3Njcm9sbGluZ187CisKKyAgLy8gVGhlIGNhbGxiYWNrIGZvciByZWNlaXZpbmcgdGhlIHBhc3N3b3JkIGZyb20gdGhlIHBhZ2UuCisgIHNjb3BlZF9wdHI8cHA6OkNvbXBsZXRpb25DYWxsYmFja1dpdGhPdXRwdXQ8cHA6OlZhcj4gPiBwYXNzd29yZF9jYWxsYmFja187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9PVVRfT0ZfUFJPQ0VTU19JTlNUQU5DRV9IXwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BhZ2VfaW5kaWNhdG9yLmNjIGIveGZhX3Rlc3QvcGRmL3BhZ2VfaW5kaWNhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWYxZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGFnZV9pbmRpY2F0b3IuY2MKQEAgLTAsMCArMSwxMjcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwZGYvcGFnZV9pbmRpY2F0b3IuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgInBkZi9kcmF3X3V0aWxzLmgiCisjaW5jbHVkZSAicGRmL251bWJlcl9pbWFnZV9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJwZGYvcmVzb3VyY2VfY29uc3RzLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworCitQYWdlSW5kaWNhdG9yOjpQYWdlSW5kaWNhdG9yKCkKKyAgICA6IGN1cnJlbnRfcGFnZV8oMCksCisgICAgICBmYWRlX291dF90aW1lcl9pZF8oMCksCisgICAgICBzcGxhc2hfdGltZW91dF8oa1BhZ2VJbmRpY2F0b3JTcGxhc2hUaW1lb3V0TXMpLAorICAgICAgZmFkZV90aW1lb3V0XyhrUGFnZUluZGljYXRvclNjcm9sbEZhZGVUaW1lb3V0TXMpLAorICAgICAgYWx3YXlzX3Zpc2libGVfKGZhbHNlKSB7Cit9CisKK1BhZ2VJbmRpY2F0b3I6On5QYWdlSW5kaWNhdG9yKCkgeworfQorCitib29sIFBhZ2VJbmRpY2F0b3I6OkNyZWF0ZVBhZ2VJbmRpY2F0b3IoCisgICAgdWludDMyIGlkLAorICAgIGJvb2wgdmlzaWJsZSwKKyAgICBDb250cm9sOjpPd25lciogZGVsZWdhdGUsCisgICAgTnVtYmVySW1hZ2VHZW5lcmF0b3IqIG51bWJlcl9pbWFnZV9nZW5lcmF0b3IsCisgICAgYm9vbCBhbHdheXNfdmlzaWJsZSkgeworICBudW1iZXJfaW1hZ2VfZ2VuZXJhdG9yXyA9IG51bWJlcl9pbWFnZV9nZW5lcmF0b3I7CisgIGFsd2F5c192aXNpYmxlXyA9IGFsd2F5c192aXNpYmxlOworCisgIHBwOjpSZWN0IHJjOworICBib29sIHJlcyA9IENvbnRyb2w6OkNyZWF0ZShpZCwgcmMsIHZpc2libGUsIGRlbGVnYXRlKTsKKyAgcmV0dXJuIHJlczsKK30KKwordm9pZCBQYWdlSW5kaWNhdG9yOjpDb25maWd1cmUoY29uc3QgcHA6OlBvaW50JiBvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6SW1hZ2VEYXRhJiBiYWNrZ3JvdW5kKSB7CisgIGJhY2tncm91bmRfID0gYmFja2dyb3VuZDsKKyAgcHA6OlJlY3QgcmMob3JpZ2luLCBiYWNrZ3JvdW5kXy5zaXplKCkpOworICBDb250cm9sOjpTZXRSZWN0KHJjLCBmYWxzZSk7Cit9CisKK3ZvaWQgUGFnZUluZGljYXRvcjo6c2V0X2N1cnJlbnRfcGFnZShpbnQgY3VycmVudF9wYWdlKSB7CisgIGlmIChjdXJyZW50X3BhZ2VfIDwgMCkKKyAgICByZXR1cm47CisKKyAgY3VycmVudF9wYWdlXyA9IGN1cnJlbnRfcGFnZTsKK30KKwordm9pZCBQYWdlSW5kaWNhdG9yOjpQYWludChwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhLCBjb25zdCBwcDo6UmVjdCYgcmMpIHsKKyAgaWYgKCF2aXNpYmxlKCkpCisgICAgcmV0dXJuOworCisgIHBwOjpSZWN0IGRyYXdfcmMgPSByYy5JbnRlcnNlY3QocmVjdCgpKTsKKyAgaWYgKGRyYXdfcmMuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICAvLyBDb3B5aW5nIHRoZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4KKyAgcHA6OkltYWdlRGF0YSBidWZmZXIob3duZXIoKS0+R2V0SW5zdGFuY2UoKSwgYmFja2dyb3VuZF8uZm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRfLnNpemUoKSwgZmFsc2UpOworICBDb3B5SW1hZ2UoYmFja2dyb3VuZF8sIHBwOjpSZWN0KGJhY2tncm91bmRfLnNpemUoKSksCisgICAgICAgICAgICAmYnVmZmVyLCBwcDo6UmVjdChiYWNrZ3JvdW5kXy5zaXplKCkpLCBmYWxzZSk7CisKKyAgLy8gQ3JlYXRpbmcgdGhlIHBhZ2UgbnVtYmVyIGltYWdlLgorICBwcDo6SW1hZ2VEYXRhIHBhZ2VfbnVtYmVyX2ltYWdlOworICBudW1iZXJfaW1hZ2VfZ2VuZXJhdG9yXy0+R2VuZXJhdGVJbWFnZShjdXJyZW50X3BhZ2VfLCAmcGFnZV9udW1iZXJfaW1hZ2UpOworCisgIHBwOjpQb2ludCBvcmlnaW4yKAorICAgICAgKGJ1ZmZlci5zaXplKCkud2lkdGgoKSAtIHBhZ2VfbnVtYmVyX2ltYWdlLnNpemUoKS53aWR0aCgpKSAvIDIuNSwKKyAgICAgIChidWZmZXIuc2l6ZSgpLmhlaWdodCgpIC0gcGFnZV9udW1iZXJfaW1hZ2Uuc2l6ZSgpLmhlaWdodCgpKSAvIDIpOworCisgIC8vIERyYXdpbmcgcGFnZSBudW1iZXIgaW1hZ2Ugb24gdGhlIGJ1ZmZlci4KKyAgaWYgKG9yaWdpbjIueCgpID4gMCAmJiBvcmlnaW4yLnkoKSA+IDApIHsKKyAgICBDb3B5SW1hZ2UocGFnZV9udW1iZXJfaW1hZ2UsCisgICAgICAgICAgICAgIHBwOjpSZWN0KHBwOjpQb2ludCgpLCBwYWdlX251bWJlcl9pbWFnZS5zaXplKCkpLAorICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICBwcDo6UmVjdChvcmlnaW4yLCBwYWdlX251bWJlcl9pbWFnZS5zaXplKCkpLAorICAgICAgICAgICAgICBmYWxzZSk7CisgIH0KKworICAvLyBEcmF3aW5nIHRoZSBidWZmZXIuCisgIHBwOjpQb2ludCBvcmlnaW4gPSBkcmF3X3JjLnBvaW50KCk7CisgIGRyYXdfcmMuT2Zmc2V0KC1yZWN0KCkueCgpLCAtcmVjdCgpLnkoKSk7CisgIEFscGhhQmxlbmQoYnVmZmVyLCBkcmF3X3JjLCBpbWFnZV9kYXRhLCBvcmlnaW4sIHRyYW5zcGFyZW5jeSgpKTsKK30KKwordm9pZCBQYWdlSW5kaWNhdG9yOjpPblRpbWVyRmlyZWQodWludDMyIHRpbWVyX2lkKSB7CisgIEZhZGluZ0NvbnRyb2w6Ok9uVGltZXJGaXJlZCh0aW1lcl9pZCk7CisgIGlmICh0aW1lcl9pZCA9PSBmYWRlX291dF90aW1lcl9pZF8pIHsKKyAgICBGYWRlKGZhbHNlLCBmYWRlX3RpbWVvdXRfKTsKKyAgfQorfQorCit2b2lkIFBhZ2VJbmRpY2F0b3I6OlJlc2V0RmFkZU91dFRpbWVyKCkgeworICBmYWRlX291dF90aW1lcl9pZF8gPQorICAgICAgb3duZXIoKS0+U2NoZWR1bGVUaW1lcihpZCgpLCBzcGxhc2hfdGltZW91dF8pOworfQorCit2b2lkIFBhZ2VJbmRpY2F0b3I6Ok9uRmFkZUluQ29tcGxldGUoKSB7CisgIGlmICghYWx3YXlzX3Zpc2libGVfKQorICAgIFJlc2V0RmFkZU91dFRpbWVyKCk7Cit9CisKK3ZvaWQgUGFnZUluZGljYXRvcjo6U3BsYXNoKCkgeworICBTcGxhc2goa1BhZ2VJbmRpY2F0b3JTcGxhc2hUaW1lb3V0TXMsIGtQYWdlSW5kaWNhdG9yU2Nyb2xsRmFkZVRpbWVvdXRNcyk7Cit9CisKK3ZvaWQgUGFnZUluZGljYXRvcjo6U3BsYXNoKHVpbnQzMiBzcGxhc2hfdGltZW91dCwgdWludDMyIGZhZGVfdGltZW91dCkgeworICBzcGxhc2hfdGltZW91dF8gPSBzcGxhc2hfdGltZW91dDsKKyAgZmFkZV90aW1lb3V0XyA9IGZhZGVfdGltZW91dDsKKyAgaWYgKCFhbHdheXNfdmlzaWJsZV8pCisgICAgZmFkZV9vdXRfdGltZXJfaWRfID0gMDsKKyAgRmFkZSh0cnVlLCBmYWRlX3RpbWVvdXRfKTsKK30KKworaW50IFBhZ2VJbmRpY2F0b3I6OkdldFlQb3NpdGlvbigKKyAgICBpbnQgdmVydGljYWxfc2Nyb2xsYmFyX3ksIGludCBkb2N1bWVudF9oZWlnaHQsIGludCBwbHVnaW5faGVpZ2h0KSB7CisgIGRvdWJsZSBwZXJjZW50ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPih2ZXJ0aWNhbF9zY3JvbGxiYXJfeSkgLyBkb2N1bWVudF9oZWlnaHQ7CisgIHJldHVybiAocGx1Z2luX2hlaWdodCAtIHJlY3QoKS5oZWlnaHQoKSkgKiBwZXJjZW50OworfQorCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BhZ2VfaW5kaWNhdG9yLmggYi94ZmFfdGVzdC9wZGYvcGFnZV9pbmRpY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA2ZWUxCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3BhZ2VfaW5kaWNhdG9yLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQREZfUEFHRV9JTkRJQ0FUT1JfSF8KKyNkZWZpbmUgUERGX1BBR0VfSU5ESUNBVE9SX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAicGRmL2NvbnRyb2wuaCIKKyNpbmNsdWRlICJwZGYvZmFkaW5nX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvaW1hZ2VfZGF0YS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9wb2ludC5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9yZWN0LmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgTnVtYmVySW1hZ2VHZW5lcmF0b3I7CisKK2NvbnN0IHVpbnQzMiBrUGFnZUluZGljYXRvclNjcm9sbEZhZGVUaW1lb3V0TXMgPSAyNDA7Citjb25zdCB1aW50MzIga1BhZ2VJbmRpY2F0b3JJbml0aWFsRmFkZVRpbWVvdXRNcyA9IDk2MDsKK2NvbnN0IHVpbnQzMiBrUGFnZUluZGljYXRvclNwbGFzaFRpbWVvdXRNcyA9IDIwMDA7CisKK2NsYXNzIFBhZ2VJbmRpY2F0b3IgOiBwdWJsaWMgRmFkaW5nQ29udHJvbCB7CisgcHVibGljOgorICBQYWdlSW5kaWNhdG9yKCk7CisgIHZpcnR1YWwgflBhZ2VJbmRpY2F0b3IoKTsKKyAgdmlydHVhbCBib29sIENyZWF0ZVBhZ2VJbmRpY2F0b3IoCisgICAgICB1aW50MzIgaWQsCisgICAgICBib29sIHZpc2libGUsCisgICAgICBDb250cm9sOjpPd25lciogZGVsZWdhdGUsCisgICAgICBOdW1iZXJJbWFnZUdlbmVyYXRvciogbnVtYmVyX2ltYWdlX2dlbmVyYXRvciwKKyAgICAgIGJvb2wgYWx3YXlzX3Zpc2libGUpOworCisgIHZvaWQgQ29uZmlndXJlKGNvbnN0IHBwOjpQb2ludCYgb3JpZ2luLCBjb25zdCBwcDo6SW1hZ2VEYXRhJiBiYWNrZ3JvdW5kKTsKKworICBpbnQgY3VycmVudF9wYWdlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF9wYWdlXzsgfQorICB2b2lkIHNldF9jdXJyZW50X3BhZ2UoaW50IGN1cnJlbnRfcGFnZSk7CisKKyAgdmlydHVhbCB2b2lkIFNwbGFzaCgpOworICB2b2lkIFNwbGFzaCh1aW50MzIgc3BsYXNoX3RpbWVvdXQsIHVpbnQzMiBwYWdlX3RpbWVvdXQpOworCisgIC8vIFJldHVybnMgdGhlIHkgcG9zaXRpb24gd2hlcmUgdGhlIHBhZ2UgaW5kaWNhdG9yIHNob3VsZCBiZSBkcmF3biBnaXZlbiB0aGUKKyAgLy8gcG9zaXRpb24gb2YgdGhlIHNjcm9sbGJhciBhbmQgdGhlIHRvdGFsIGRvY3VtZW50IGhlaWdodCBhbmQgdGhlIHBsdWdpbgorICAvLyBoZWlnaHQuCisgIGludCBHZXRZUG9zaXRpb24oCisgICAgICBpbnQgdmVydGljYWxfc2Nyb2xsYmFyX3ksIGludCBkb2N1bWVudF9oZWlnaHQsIGludCBwbHVnaW5faGVpZ2h0KTsKKworICAvLyBDb250cm9sIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIFBhaW50KHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsIGNvbnN0IHBwOjpSZWN0JiByYyk7CisgIHZpcnR1YWwgdm9pZCBPblRpbWVyRmlyZWQodWludDMyIHRpbWVyX2lkKTsKKworICAvLyBGYWRpbmdDb250cm9sIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIE9uRmFkZUluQ29tcGxldGUoKTsKKworIHByaXZhdGU6CisgIHZvaWQgUmVzZXRGYWRlT3V0VGltZXIoKTsKKworICBpbnQgY3VycmVudF9wYWdlXzsKKyAgcHA6OkltYWdlRGF0YSBiYWNrZ3JvdW5kXzsKKyAgTnVtYmVySW1hZ2VHZW5lcmF0b3IqIG51bWJlcl9pbWFnZV9nZW5lcmF0b3JfOworICB1aW50MzIgZmFkZV9vdXRfdGltZXJfaWRfOworICB1aW50MzIgc3BsYXNoX3RpbWVvdXRfOworICB1aW50MzIgZmFkZV90aW1lb3V0XzsKKworICBib29sIGFsd2F5c192aXNpYmxlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKKyNlbmRpZiAgLy8gUERGX1BBR0VfSU5ESUNBVE9SX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGFpbnRfYWdncmVnYXRvci5jYyBiL3hmYV90ZXN0L3BkZi9wYWludF9hZ2dyZWdhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OWNhYjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGFpbnRfYWdncmVnYXRvci5jYwpAQCAtMCwwICsxLDI2MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9wYWludF9hZ2dyZWdhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQUxHT1JJVEhNIE5PVEVTCisvLworLy8gV2UgYXR0ZW1wdCB0byBtYWludGFpbiBhIHNjcm9sbCByZWN0IGluIHRoZSBwcmVzZW5jZSBvZiBpbnZhbGlkYXRpb25zIHRoYXQKKy8vIGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBzY3JvbGwgcmVjdC4gIElmIGFuIGludmFsaWRhdGlvbiBjcm9zc2VzIGEgc2Nyb2xsCisvLyByZWN0LCB0aGVuIHdlIGp1c3QgdHJlYXQgdGhlIHNjcm9sbCByZWN0IGFzIGFuIGludmFsaWRhdGlvbiByZWN0LgorLy8KKy8vIEZvciBpbnZhbGlkYXRpb25zIHBlcmZvcm1lZCBwcmlvciB0byBzY3JvbGxpbmcgYW5kIGNvbnRhaW5lZCB3aXRoaW4gdGhlCisvLyBzY3JvbGwgcmVjdCwgd2Ugb2Zmc2V0IHRoZSBpbnZhbGlkYXRpb24gcmVjdHMgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdAorLy8gdGhlIGNvbnN1bWVyIHdpbGwgcGVyZm9ybSBzY3JvbGxpbmcgYmVmb3JlIHBhaW50aW5nLgorLy8KKy8vIFdlIG9ubHkgc3VwcG9ydCBzY3JvbGxpbmcgYWxvbmcgb25lIGF4aXMgYXQgYSB0aW1lLiAgQSBkaWFnb25hbCBzY3JvbGwgd2lsbAorLy8gdGhlcmVmb3JlIGJlIHRyZWF0ZWQgYXMgYW4gaW52YWxpZGF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQYWludEFnZ3JlZ2F0b3I6OlBhaW50VXBkYXRlOjpQYWludFVwZGF0ZSgpIHsKK30KKworUGFpbnRBZ2dyZWdhdG9yOjpQYWludFVwZGF0ZTo6flBhaW50VXBkYXRlKCkgeworfQorCitQYWludEFnZ3JlZ2F0b3I6OkludGVybmFsUGFpbnRVcGRhdGU6OkludGVybmFsUGFpbnRVcGRhdGUoKSA6CisgICAgc3ludGhlc2l6ZWRfc2Nyb2xsX2RhbWFnZV9yZWN0XyhmYWxzZSkgeworfQorCitQYWludEFnZ3JlZ2F0b3I6OkludGVybmFsUGFpbnRVcGRhdGU6On5JbnRlcm5hbFBhaW50VXBkYXRlKCkgeworfQorCitwcDo6UmVjdCBQYWludEFnZ3JlZ2F0b3I6OkludGVybmFsUGFpbnRVcGRhdGU6OkdldFNjcm9sbERhbWFnZSgpIGNvbnN0IHsKKyAgLy8gU2hvdWxkIG9ubHkgYmUgc2Nyb2xsaW5nIGluIG9uZSBkaXJlY3Rpb24gYXQgYSB0aW1lLgorICBEQ0hFQ0soIShzY3JvbGxfZGVsdGEueCgpICYmIHNjcm9sbF9kZWx0YS55KCkpKTsKKworICBwcDo6UmVjdCBkYW1hZ2VkX3JlY3Q7CisKKyAgLy8gQ29tcHV0ZSB0aGUgcmVnaW9uIHdlIHdpbGwgZXhwb3NlIGJ5IHNjcm9sbGluZywgYW5kIHBhaW50IHRoYXQgaW50byBhCisgIC8vIHNoYXJlZCBtZW1vcnkgc2VjdGlvbi4KKyAgaWYgKHNjcm9sbF9kZWx0YS54KCkpIHsKKyAgICBpbnQzMl90IGR4ID0gc2Nyb2xsX2RlbHRhLngoKTsKKyAgICBkYW1hZ2VkX3JlY3Quc2V0X3koc2Nyb2xsX3JlY3QueSgpKTsKKyAgICBkYW1hZ2VkX3JlY3Quc2V0X2hlaWdodChzY3JvbGxfcmVjdC5oZWlnaHQoKSk7CisgICAgaWYgKGR4ID4gMCkgeworICAgICAgZGFtYWdlZF9yZWN0LnNldF94KHNjcm9sbF9yZWN0LngoKSk7CisgICAgICBkYW1hZ2VkX3JlY3Quc2V0X3dpZHRoKGR4KTsKKyAgICB9IGVsc2UgeworICAgICAgZGFtYWdlZF9yZWN0LnNldF94KHNjcm9sbF9yZWN0LnJpZ2h0KCkgKyBkeCk7CisgICAgICBkYW1hZ2VkX3JlY3Quc2V0X3dpZHRoKC1keCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGludDMyX3QgZHkgPSBzY3JvbGxfZGVsdGEueSgpOworICAgIGRhbWFnZWRfcmVjdC5zZXRfeChzY3JvbGxfcmVjdC54KCkpOworICAgIGRhbWFnZWRfcmVjdC5zZXRfd2lkdGgoc2Nyb2xsX3JlY3Qud2lkdGgoKSk7CisgICAgaWYgKGR5ID4gMCkgeworICAgICAgZGFtYWdlZF9yZWN0LnNldF95KHNjcm9sbF9yZWN0LnkoKSk7CisgICAgICBkYW1hZ2VkX3JlY3Quc2V0X2hlaWdodChkeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhbWFnZWRfcmVjdC5zZXRfeShzY3JvbGxfcmVjdC5ib3R0b20oKSArIGR5KTsKKyAgICAgIGRhbWFnZWRfcmVjdC5zZXRfaGVpZ2h0KC1keSk7CisgICAgfQorICB9CisKKyAgLy8gSW4gY2FzZSB0aGUgc2Nyb2xsIG9mZnNldCBleGNlZWRzIHRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIHNjcm9sbCByZWN0CisgIHJldHVybiBzY3JvbGxfcmVjdC5JbnRlcnNlY3QoZGFtYWdlZF9yZWN0KTsKK30KKworUGFpbnRBZ2dyZWdhdG9yOjpQYWludEFnZ3JlZ2F0b3IoKSB7Cit9CisKK2Jvb2wgUGFpbnRBZ2dyZWdhdG9yOjpIYXNQZW5kaW5nVXBkYXRlKCkgY29uc3QgeworICByZXR1cm4gIXVwZGF0ZV8uc2Nyb2xsX3JlY3QuSXNFbXB0eSgpIHx8ICF1cGRhdGVfLnBhaW50X3JlY3RzLmVtcHR5KCk7Cit9CisKK3ZvaWQgUGFpbnRBZ2dyZWdhdG9yOjpDbGVhclBlbmRpbmdVcGRhdGUoKSB7CisgIHVwZGF0ZV8gPSBJbnRlcm5hbFBhaW50VXBkYXRlKCk7Cit9CisKK1BhaW50QWdncmVnYXRvcjo6UGFpbnRVcGRhdGUgUGFpbnRBZ2dyZWdhdG9yOjpHZXRQZW5kaW5nVXBkYXRlKCkgeworICAvLyBDb252ZXJ0IHRoZSBpbnRlcm5hbCBwYWludCB1cGRhdGUgdG8gdGhlIGV4dGVybmFsIG9uZSwgd2hpY2ggaW5jbHVkZXMgYQorICAvLyBiaXQgbW9yZSBwcmVjb21wdXRlZCBpbmZvIGZvciB0aGUgY2FsbGVyLgorICBQYWludFVwZGF0ZSByZXQ7CisgIHJldC5zY3JvbGxfZGVsdGEgPSB1cGRhdGVfLnNjcm9sbF9kZWx0YTsKKyAgcmV0LnNjcm9sbF9yZWN0ID0gdXBkYXRlXy5zY3JvbGxfcmVjdDsKKyAgcmV0Lmhhc19zY3JvbGwgPSByZXQuc2Nyb2xsX2RlbHRhLngoKSAhPSAwIHx8IHJldC5zY3JvbGxfZGVsdGEueSgpICE9IDA7CisKKyAgLy8gSW5jbHVkZSB0aGUgc2Nyb2xsIGRhbWFnZSAoaWYgYW55KSBpbiB0aGUgcGFpbnQgcmVjdHMuCisgIC8vIENvZGUgaW52YWxpZGF0ZXMgZGFtYWdlZCByZWN0IGhlcmUsIGl0IHBpY2sgaXQgdXAgZnJvbSB0aGUgbGlzdCBvZiBwYWludAorICAvLyByZWN0cyBpbiB0aGUgbmV4dCBibG9jay4KKyAgaWYgKHJldC5oYXNfc2Nyb2xsICAmJiAhdXBkYXRlXy5zeW50aGVzaXplZF9zY3JvbGxfZGFtYWdlX3JlY3RfKSB7CisgICAgdXBkYXRlXy5zeW50aGVzaXplZF9zY3JvbGxfZGFtYWdlX3JlY3RfID0gdHJ1ZTsKKyAgICBwcDo6UmVjdCBzY3JvbGxfZGFtYWdlID0gdXBkYXRlXy5HZXRTY3JvbGxEYW1hZ2UoKTsKKyAgICBJbnZhbGlkYXRlUmVjdEludGVybmFsKHNjcm9sbF9kYW1hZ2UsIGZhbHNlKTsKKyAgfQorCisgIHJldC5wYWludF9yZWN0cy5yZXNlcnZlKHVwZGF0ZV8ucGFpbnRfcmVjdHMuc2l6ZSgpICsgMSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXBkYXRlXy5wYWludF9yZWN0cy5zaXplKCk7IGkrKykKKyAgICByZXQucGFpbnRfcmVjdHMucHVzaF9iYWNrKHVwZGF0ZV8ucGFpbnRfcmVjdHNbaV0pOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgUGFpbnRBZ2dyZWdhdG9yOjpTZXRJbnRlcm1lZGlhdGVSZXN1bHRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlYWR5UmVjdD4mIHJlYWR5LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgcGVuZGluZykgeworICB1cGRhdGVfLnJlYWR5X3JlY3RzLmluc2VydCgKKyAgICAgIHVwZGF0ZV8ucmVhZHlfcmVjdHMuZW5kKCksIHJlYWR5LmJlZ2luKCksIHJlYWR5LmVuZCgpKTsKKyAgdXBkYXRlXy5wYWludF9yZWN0cyA9IHBlbmRpbmc7Cit9CisKK3N0ZDo6dmVjdG9yPFBhaW50QWdncmVnYXRvcjo6UmVhZHlSZWN0PiBQYWludEFnZ3JlZ2F0b3I6OkdldFJlYWR5UmVjdHMoKSBjb25zdCB7CisgIHJldHVybiB1cGRhdGVfLnJlYWR5X3JlY3RzOworfQorCit2b2lkIFBhaW50QWdncmVnYXRvcjo6SW52YWxpZGF0ZVJlY3QoY29uc3QgcHA6OlJlY3QmIHJlY3QpIHsKKyAgSW52YWxpZGF0ZVJlY3RJbnRlcm5hbChyZWN0LCB0cnVlKTsKK30KKwordm9pZCBQYWludEFnZ3JlZ2F0b3I6OlNjcm9sbFJlY3QoY29uc3QgcHA6OlJlY3QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpQb2ludCYgYW1vdW50KSB7CisgIC8vIFdlIG9ubHkgc3VwcG9ydCBzY3JvbGxpbmcgYWxvbmcgb25lIGF4aXMgYXQgYSB0aW1lLgorICBpZiAoYW1vdW50LngoKSAhPSAwICYmIGFtb3VudC55KCkgIT0gMCkgeworICAgIEludmFsaWRhdGVSZWN0KGNsaXBfcmVjdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gV2UgY2FuIG9ubHkgc2Nyb2xsIG9uZSByZWN0IGF0IGEgdGltZS4KKyAgaWYgKCF1cGRhdGVfLnNjcm9sbF9yZWN0LklzRW1wdHkoKSAmJiB1cGRhdGVfLnNjcm9sbF9yZWN0ICE9IGNsaXBfcmVjdCkgeworICAgIEludmFsaWRhdGVSZWN0KGNsaXBfcmVjdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQWdhaW4sIHdlIG9ubHkgc3VwcG9ydCBzY3JvbGxpbmcgYWxvbmcgb25lIGF4aXMgYXQgYSB0aW1lLiAgTWFrZSBzdXJlIHRoaXMKKyAgLy8gdXBkYXRlIGRvZXNuJ3Qgc2Nyb2xsIG9uIGEgZGlmZmVyZW50IGF4aXMgdGhhbiBhbnkgZXhpc3Rpbmcgb25lLgorICBpZiAoKGFtb3VudC54KCkgJiYgdXBkYXRlXy5zY3JvbGxfZGVsdGEueSgpKSB8fAorICAgICAgKGFtb3VudC55KCkgJiYgdXBkYXRlXy5zY3JvbGxfZGVsdGEueCgpKSkgeworICAgIEludmFsaWRhdGVSZWN0KGNsaXBfcmVjdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVGhlIHNjcm9sbCByZWN0IGlzIG5ldyBvciBpc24ndCBjaGFuZ2luZyAodGhvdWdoIHRoZSBzY3JvbGwgYW1vdW50IG1heQorICAvLyBiZSBjaGFuZ2luZykuCisgIHVwZGF0ZV8uc2Nyb2xsX3JlY3QgPSBjbGlwX3JlY3Q7CisgIHVwZGF0ZV8uc2Nyb2xsX2RlbHRhICs9IGFtb3VudDsKKworICAvLyBXZSBtaWdodCBoYXZlIGp1c3Qgd2lwZWQgb3V0IGEgcHJlLWV4aXN0aW5nIHNjcm9sbC4KKyAgaWYgKHVwZGF0ZV8uc2Nyb2xsX2RlbHRhID09IHBwOjpQb2ludCgpKSB7CisgICAgdXBkYXRlXy5zY3JvbGxfcmVjdCA9IHBwOjpSZWN0KCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQWRqdXN0IGFueSBwYWludCByZWN0cyB0aGF0IGludGVyc2VjdCB0aGUgc2Nyb2xsLiBGb3IgdGhlIHBvcnRpb24gb2YgdGhlCisgIC8vIHBhaW50IHRoYXQgaXMgaW5zaWRlIHRoZSBzY3JvbGwgYXJlYSwgbW92ZSBpdCBieSB0aGUgc2Nyb2xsIGFtb3VudCBhbmQKKyAgLy8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgcGFpbnQgd2l0aCBpdC4gRm9yIHRoZSBwb3J0aW9uIChpZiBhbnkpIHRoYXQgaXMKKyAgLy8gb3V0c2lkZSB0aGUgc2Nyb2xsLCBqdXN0IGludmFsaWRhdGUgaXQuCisgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiBsZWZ0b3Zlcl9yZWN0czsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cGRhdGVfLnBhaW50X3JlY3RzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKCF1cGRhdGVfLnNjcm9sbF9yZWN0LkludGVyc2VjdHModXBkYXRlXy5wYWludF9yZWN0c1tpXSkpCisgICAgICBjb250aW51ZTsKKworICAgIHBwOjpSZWN0IGludGVyc2VjdGlvbiA9CisgICAgICAgIHVwZGF0ZV8ucGFpbnRfcmVjdHNbaV0uSW50ZXJzZWN0KHVwZGF0ZV8uc2Nyb2xsX3JlY3QpOworICAgIHBwOjpSZWN0IHJlY3QgPSB1cGRhdGVfLnBhaW50X3JlY3RzW2ldOworICAgIHdoaWxlICghcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgIHBwOjpSZWN0IGxlZnRvdmVyID0gcmVjdC5TdWJ0cmFjdChpbnRlcnNlY3Rpb24pOworICAgICAgaWYgKGxlZnRvdmVyLklzRW1wdHkoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBEb24ndCB3YW50IHRvIGNhbGwgSW52YWxpZGF0ZVJlY3RJbnRlcm5hbCBub3cgc2luY2UgaXQnbGwgbW9kaWZ5CisgICAgICAvLyB1cGRhdGVfLnBhaW50X3JlY3RzLCBzbyBrZWVwIHRyYWNrIG9mIHRoaXMgYW5kIGRvIGl0IGJlbG93LgorICAgICAgbGVmdG92ZXJfcmVjdHMucHVzaF9iYWNrKGxlZnRvdmVyKTsKKyAgICAgIHJlY3QgPSByZWN0LlN1YnRyYWN0KGxlZnRvdmVyKTsKKyAgICB9CisKKyAgICB1cGRhdGVfLnBhaW50X3JlY3RzW2ldID0gU2Nyb2xsUGFpbnRSZWN0KGludGVyc2VjdGlvbiwgYW1vdW50KTsKKworICAgIC8vIFRoZSByZWN0IG1heSBoYXZlIGJlZW4gc2Nyb2xsZWQgb3V0IG9mIHZpZXcuCisgICAgaWYgKHVwZGF0ZV8ucGFpbnRfcmVjdHNbaV0uSXNFbXB0eSgpKSB7CisgICAgICB1cGRhdGVfLnBhaW50X3JlY3RzLmVyYXNlKHVwZGF0ZV8ucGFpbnRfcmVjdHMuYmVnaW4oKSArIGkpOworICAgICAgaS0tOworICAgIH0KKyAgfQorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVmdG92ZXJfcmVjdHMuc2l6ZSgpOyArK2kpCisgICAgSW52YWxpZGF0ZVJlY3RJbnRlcm5hbChsZWZ0b3Zlcl9yZWN0c1tpXSwgZmFsc2UpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXBkYXRlXy5yZWFkeV9yZWN0cy5zaXplKCk7ICsraSkgeworICAgIGlmICh1cGRhdGVfLnNjcm9sbF9yZWN0LkNvbnRhaW5zKHVwZGF0ZV8ucmVhZHlfcmVjdHNbaV0ucmVjdCkpIHsKKyAgICAgIHVwZGF0ZV8ucmVhZHlfcmVjdHNbaV0ucmVjdCA9CisgICAgICAgICAgU2Nyb2xsUGFpbnRSZWN0KHVwZGF0ZV8ucmVhZHlfcmVjdHNbaV0ucmVjdCwgYW1vdW50KTsKKyAgICB9CisgIH0KKworICBpZiAodXBkYXRlXy5zeW50aGVzaXplZF9zY3JvbGxfZGFtYWdlX3JlY3RfKSB7CisgICAgcHA6OlJlY3QgZGFtYWdlID0gdXBkYXRlXy5HZXRTY3JvbGxEYW1hZ2UoKTsKKyAgICBJbnZhbGlkYXRlUmVjdChkYW1hZ2UpOworICB9Cit9CisKK3BwOjpSZWN0IFBhaW50QWdncmVnYXRvcjo6U2Nyb2xsUGFpbnRSZWN0KGNvbnN0IHBwOjpSZWN0JiBwYWludF9yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlBvaW50JiBhbW91bnQpIGNvbnN0IHsKKyAgcHA6OlJlY3QgcmVzdWx0ID0gcGFpbnRfcmVjdDsKKyAgcmVzdWx0Lk9mZnNldChhbW91bnQpOworICByZXN1bHQgPSB1cGRhdGVfLnNjcm9sbF9yZWN0LkludGVyc2VjdChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFBhaW50QWdncmVnYXRvcjo6SW52YWxpZGF0ZVNjcm9sbFJlY3QoKSB7CisgIHBwOjpSZWN0IHNjcm9sbF9yZWN0ID0gdXBkYXRlXy5zY3JvbGxfcmVjdDsKKyAgdXBkYXRlXy5zY3JvbGxfcmVjdCA9IHBwOjpSZWN0KCk7CisgIHVwZGF0ZV8uc2Nyb2xsX2RlbHRhID0gcHA6OlBvaW50KCk7CisgIEludmFsaWRhdGVSZWN0KHNjcm9sbF9yZWN0KTsKK30KKwordm9pZCBQYWludEFnZ3JlZ2F0b3I6OkludmFsaWRhdGVSZWN0SW50ZXJuYWwoY29uc3QgcHA6OlJlY3QmIHJlY3Rfb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjaGVja19zY3JvbGwpIHsKKyAgcHA6OlJlY3QgcmVjdCA9IHJlY3Rfb2xkOworICAvLyBDaGVjayBpZiBhbnkgcmVjdHMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgcGFpbnRlZCBvdmVybGFwLgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZV8ucmVhZHlfcmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBwcDo6UmVjdCYgZXhpc3RpbmdfcmVjdCA9IHVwZGF0ZV8ucmVhZHlfcmVjdHNbaV0ucmVjdDsKKyAgICBpZiAocmVjdC5JbnRlcnNlY3RzKGV4aXN0aW5nX3JlY3QpKSB7CisgICAgICAvLyBSZS1pbnZhbGlkYXRlIGluIGNhc2UgdGhlIHVuaW9uIGludGVyc2VjdHMgb3RoZXIgcGFpbnQgcmVjdHMuCisgICAgICByZWN0ID0gZXhpc3RpbmdfcmVjdC5VbmlvbihyZWN0KTsKKyAgICAgIHVwZGF0ZV8ucmVhZHlfcmVjdHMuZXJhc2UodXBkYXRlXy5yZWFkeV9yZWN0cy5iZWdpbigpICsgaSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBib29sIGFkZF9wYWludCA9IHRydWU7CisKKyAgLy8gQ29tYmluZSBvdmVybGFwcGluZyBwYWludHMgdXNpbmcgc21hbGxlc3QgYm91bmRpbmcgYm94LgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZV8ucGFpbnRfcmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBwcDo6UmVjdCYgZXhpc3RpbmdfcmVjdCA9IHVwZGF0ZV8ucGFpbnRfcmVjdHNbaV07CisgICAgaWYgKGV4aXN0aW5nX3JlY3QuQ29udGFpbnMocmVjdCkpICAvLyBPcHRpbWl6ZSBvdXQgcmVkdW5kYW5jeS4KKyAgICAgIGFkZF9wYWludCA9IGZhbHNlOworICAgIGlmIChyZWN0LkludGVyc2VjdHMoZXhpc3RpbmdfcmVjdCkgfHwgcmVjdC5TaGFyZXNFZGdlV2l0aChleGlzdGluZ19yZWN0KSkgeworICAgICAgLy8gUmUtaW52YWxpZGF0ZSBpbiBjYXNlIHRoZSB1bmlvbiBpbnRlcnNlY3RzIG90aGVyIHBhaW50IHJlY3RzLgorICAgICAgcHA6OlJlY3QgY29tYmluZWRfcmVjdCA9IGV4aXN0aW5nX3JlY3QuVW5pb24ocmVjdCk7CisgICAgICB1cGRhdGVfLnBhaW50X3JlY3RzLmVyYXNlKHVwZGF0ZV8ucGFpbnRfcmVjdHMuYmVnaW4oKSArIGkpOworICAgICAgSW52YWxpZGF0ZVJlY3RJbnRlcm5hbChjb21iaW5lZF9yZWN0LCBjaGVja19zY3JvbGwpOworICAgICAgYWRkX3BhaW50ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKGFkZF9wYWludCkgeworICAgIC8vIEFkZCBhIG5vbi1vdmVybGFwcGluZyBwYWludC4KKyAgICB1cGRhdGVfLnBhaW50X3JlY3RzLnB1c2hfYmFjayhyZWN0KTsKKyAgfQorCisgIC8vIElmIHRoZSBuZXcgcGFpbnQgb3ZlcmxhcHMgd2l0aCBhIHNjcm9sbCwgdGhlbiBhbHNvIGludmFsaWRhdGUgdGhlIHJlY3QgaW4KKyAgLy8gaXRzIG5ldyBwb3NpdGlvbi4KKyAgaWYgKGNoZWNrX3Njcm9sbCAmJgorICAgICAgIXVwZGF0ZV8uc2Nyb2xsX3JlY3QuSXNFbXB0eSgpICYmCisgICAgICB1cGRhdGVfLnNjcm9sbF9yZWN0LkludGVyc2VjdHMocmVjdCkpIHsKKyAgICBJbnZhbGlkYXRlUmVjdEludGVybmFsKFNjcm9sbFBhaW50UmVjdChyZWN0LCB1cGRhdGVfLnNjcm9sbF9kZWx0YSksIGZhbHNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BhaW50X2FnZ3JlZ2F0b3IuaCBiL3hmYV90ZXN0L3BkZi9wYWludF9hZ2dyZWdhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmNjFlMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wYWludF9hZ2dyZWdhdG9yLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BBSU5UX0FHR1JFR0FUT1JfSF8KKyNkZWZpbmUgUERGX1BBSU5UX0FHR1JFR0FUT1JfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInBwYXBpL2NwcC9pbWFnZV9kYXRhLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3JlY3QuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcmVjdC5oIgorCisvLyBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBhZ2dyZWdhdGluZyBtdWx0aXBsZSBpbnZhbGlkYXRpb24gYW5kIHNjcm9sbAorLy8gY29tbWFuZHMgdG8gcHJvZHVjZSBhIHNjcm9sbCBhbmQgcmVwYWludCBzZXF1ZW5jZS4gWW91IGNhbiB1c2UgdGhpcyBtYW51YWxseQorLy8gdG8gdHJhY2sgeW91ciB1cGRhdGVzLCBidXQgbW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgdGhlIFBhaW50TWFuYWdlciB0bworLy8gYWRkaXRpb25hbGx5IGhhbmRsZSB0aGUgbmVjZXNzYXJ5IGNhbGxiYWNrcyBvbiB0b3Agb2YgdGhlIFBhaW50QWdncmVnYXRvcgorLy8gZnVuY3Rpb25hbGl0eS4KKy8vCisvLyBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3BwYXBpL3dpa2kvMkRQYWludGluZ01vZGVsCitjbGFzcyBQYWludEFnZ3JlZ2F0b3IgeworIHB1YmxpYzoKKyAgLy8gU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgcmVjdGFuZ2xlIHRoYXQgaGFzIGZpbmlzaGVkIHBhaW50aW5nLiAgVGhlCisgIC8vIFBhaW50TWFuYWdlciB3aWxsIHBhaW50IGl0IG9ubHkgd2hlbiBldmVyeXRoaW5nIGVsc2Ugb24gdGhlIHNjcmVlbiBpcyBhbHNvCisgIC8vIHJlYWR5LgorICBzdHJ1Y3QgUmVhZHlSZWN0IHsKKyAgICBwcDo6UG9pbnQgb2Zmc2V0OworICAgIHBwOjpSZWN0IHJlY3Q7CisgICAgcHA6OkltYWdlRGF0YSBpbWFnZV9kYXRhOworICB9OworCisgIHN0cnVjdCBQYWludFVwZGF0ZSB7CisgICAgUGFpbnRVcGRhdGUoKTsKKyAgICB+UGFpbnRVcGRhdGUoKTsKKworICAgIC8vIFRydWUgaWYgdGhlcmUgaXMgYSBzY3JvbGwgYXBwbGllZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Nyb2xsIGRlbHRhCisgICAgLy8gYW5kIHNjcm9sbF9yZWN0IGFyZSBub256ZXJvIChqdXN0IGFzIGEgY29udmVuaWVuY2UpLgorICAgIGJvb2wgaGFzX3Njcm9sbDsKKworICAgIC8vIFRoZSBhbW91bnQgdG8gc2Nyb2xsIGJ5LiBFaXRoZXIgdGhlIFggb3IgWSBtYXkgYmUgbm9uemVybyB0byBpbmRpY2F0ZSBhCisgICAgLy8gc2Nyb2xsIGluIHRoYXQgZGlyZWN0aW9uLCBidXQgdGhlcmUgd2lsbCBuZXZlciBiZSBhIHNjcm9sbCBpbiBib3RoCisgICAgLy8gZGlyZWN0aW9ucyBhdCB0aGUgc2FtZSB0aW1lICh0aGlzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgcGFpbnQgb2YgdGhlCisgICAgLy8gcmVnaW9uIGluc3RlYWQpLgorICAgIC8vCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2Nyb2xsLCB0aGlzIHdpbGwgYmUgKDAsIDApLgorICAgIHBwOjpQb2ludCBzY3JvbGxfZGVsdGE7CisKKyAgICAvLyBUaGUgcmVjdGFuZ2xlIHRoYXQgc2hvdWxkIGJlIHNjcm9sbGVkIGJ5IHRoZSBzY3JvbGxfZGVsdGEuIElmIHRoZXJlIGlzIG5vCisgICAgLy8gc2Nyb2xsLCB0aGlzIHdpbGwgYmUgKDAsIDAsIDAsIDApLiBXZSBvbmx5IHRyYWNrIG9uZSBzY3JvbGwgY29tbWFuZCBhdAorICAgIC8vIG9uY2UuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBvbmVzLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIGludmFsaWRhdGVzLgorICAgIHBwOjpSZWN0IHNjcm9sbF9yZWN0OworCisgICAgLy8gQSBsaXN0IG9mIGFsbCB0aGUgaW5kaXZpZHVhbCBkaXJ0eSByZWN0YW5nbGVzLiBUaGlzIGlzIGFuIGFnZ3JlZ2F0ZWQgbGlzdAorICAgIC8vIG9mIGFsbCBpbnZhbGlkYXRlIGNhbGxzLiBEaWZmZXJlbnQgcmVjdGFuZ2xlcyBtYXkgYmUgdW5pZmllZCB0byBwcm9kdWNlIGEKKyAgICAvLyBtaW5pbWFsIGxpc3Qgd2l0aCBubyBvdmVybGFwIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gcGFpbnQuIFRoaXMgbGlzdAorICAgIC8vIGFsc28gY29udGFpbnMgdGhlIHJlZ2lvbiBleHBvc2VkIGJ5IGFueSBzY3JvbGwgY29tbWFuZC4KKyAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gcGFpbnRfcmVjdHM7CisgIH07CisKKyAgUGFpbnRBZ2dyZWdhdG9yKCk7CisKKyAgLy8gVGhlcmUgaXMgYSBQZW5kaW5nVXBkYXRlIGlmIEludmFsaWRhdGVSZWN0IG9yIFNjcm9sbFJlY3Qgd2VyZSBjYWxsZWQgYW5kCisgIC8vIENsZWFyUGVuZGluZ1VwZGF0ZSB3YXMgbm90IGNhbGxlZC4KKyAgYm9vbCBIYXNQZW5kaW5nVXBkYXRlKCkgY29uc3Q7CisgIHZvaWQgQ2xlYXJQZW5kaW5nVXBkYXRlKCk7CisKKyAgUGFpbnRVcGRhdGUgR2V0UGVuZGluZ1VwZGF0ZSgpOworCisgIC8vIFNldHMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gdGhlIHBsdWdpbiB0byBwYWludC4gIFRoaXMgaW5jbHVkZXMgcmVjdHMgdGhhdAorICAvLyBhcmUgZmluaXNoZWQgcGFpbnRpbmcgKHJlYWR5KSwgYW5kIG9uZXMgdGhhdCBhcmUgc3RpbGwgaW4tcHJvZ3Jlc3MKKyAgLy8gKHBlbmRpbmcpLgorICB2b2lkIFNldEludGVybWVkaWF0ZVJlc3VsdHMoY29uc3Qgc3RkOjp2ZWN0b3I8UmVhZHlSZWN0PiYgcmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4mIHBlbmRpbmcpOworCisgIC8vIFJldHVybnMgdGhlIHJlY3RhbmdsZXMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgcGFpbnRlZC4KKyAgc3RkOjp2ZWN0b3I8UmVhZHlSZWN0PiBHZXRSZWFkeVJlY3RzKCkgY29uc3Q7CisKKyAgLy8gVGhlIGdpdmVuIHJlY3Qgc2hvdWxkIGJlIHJlcGFpbnRlZC4KKyAgdm9pZCBJbnZhbGlkYXRlUmVjdChjb25zdCBwcDo6UmVjdCYgcmVjdCk7CisKKyAgLy8gVGhlIGdpdmVuIHJlY3Qgc2hvdWxkIGJlIHNjcm9sbGVkIGJ5IHRoZSBnaXZlbiBhbW91bnRzLgorICB2b2lkIFNjcm9sbFJlY3QoY29uc3QgcHA6OlJlY3QmIGNsaXBfcmVjdCwgY29uc3QgcHA6OlBvaW50JiBhbW91bnQpOworCisgcHJpdmF0ZToKKyAgLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgYW4gaW50ZXJuYWwgdmVyc2lvbiBvZiBQYWludFVwZGF0ZS4gSXQncyBkaWZmZXJlbnQgaW4KKyAgLy8gdHdvIHJlc3BlY3RzOgorICAvLworICAvLyAgLSBUaGUgc2Nyb2xsIGRhbWFuZ2UgKGFyZWEgZXhwb3NlZCBieSB0aGUgc2Nyb2xsIG9wZXJhdGlvbiwgaWYgYW55KSBpcworICAvLyAgICBtYWludGFpbmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgZGlydHkgcmVjdHMgZ2VuZXJhdGVkIGJ5IGNhbGxpbmcKKyAgLy8gICAgSW52YWxpZGF0ZVJlY3QuIFdlIG5lZWQgdG8ga25vdyB0aGlzIGRpc3RpbmN0aW9uIGZvciBzb21lIG9wZXJhdGlvbnMuCisgIC8vCisgIC8vICAtIFRoZSBwYWludCBib3VuZHMgdW5pb24gaXMgY29tcHV0ZWQgb24gdGhlIGZseSBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAKKyAgLy8gICAgYSByZWN0YW5nbGUgdXAtdG8tZGF0ZSBhcyB3ZSBkbyBkaWZmZXJlbnQgb3BlcmF0aW9ucy4KKyAgY2xhc3MgSW50ZXJuYWxQYWludFVwZGF0ZSB7CisgICBwdWJsaWM6CisgICAgSW50ZXJuYWxQYWludFVwZGF0ZSgpOworICAgIH5JbnRlcm5hbFBhaW50VXBkYXRlKCk7CisKKyAgICAvLyBDb21wdXRlcyB0aGUgcmVjdCBkYW1hZ2VkIGJ5IHNjcm9sbGluZyB3aXRoaW4gfHNjcm9sbF9yZWN0fCBieQorICAgIC8vIHxzY3JvbGxfZGVsdGF8LiBUaGlzIHJlY3QgbXVzdCBiZSByZXBhaW50ZWQuIEl0IGlzIG5vdCBpbmNsdWRlZCBpbgorICAgIC8vIHBhaW50X3JlY3RzLgorICAgIHBwOjpSZWN0IEdldFNjcm9sbERhbWFnZSgpIGNvbnN0OworCisgICAgcHA6OlBvaW50IHNjcm9sbF9kZWx0YTsKKyAgICBwcDo6UmVjdCBzY3JvbGxfcmVjdDsKKworICAgIC8vIERvZXMgbm90IGluY2x1ZGUgdGhlIHNjcm9sbCBkYW1hZ2UgcmVjdCB1bmxlc3MKKyAgICAvLyBzeW50aGVzaXplZF9zY3JvbGxfZGFtYWdlX3JlY3RfIGlzIHNldC4KKyAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gcGFpbnRfcmVjdHM7CisKKyAgICAvLyBSZWN0YW5nbGVzIHRoYXQgYXJlIGZpbmlzaGVkIHBhaW50aW5nLgorICAgIHN0ZDo6dmVjdG9yPFJlYWR5UmVjdD4gcmVhZHlfcmVjdHM7CisKKyAgICAvLyBXaGV0aGVyIHdlIGhhdmUgYWRkZWQgdGhlIHNjcm9sbCBkYW1hZ2UgcmVjdCB0byBwYWludF9yZWN0cyB5ZXQgb3Igbm90LgorICAgIGJvb2wgc3ludGhlc2l6ZWRfc2Nyb2xsX2RhbWFnZV9yZWN0XzsKKyAgfTsKKworICBwcDo6UmVjdCBTY3JvbGxQYWludFJlY3QoY29uc3QgcHA6OlJlY3QmIHBhaW50X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UG9pbnQmIGFtb3VudCkgY29uc3Q7CisgIHZvaWQgSW52YWxpZGF0ZVNjcm9sbFJlY3QoKTsKKworICAvLyBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBJbnZhbGlkYXRlUmVjdC4gSWYgfGNoZWNrX3Njcm9sbHwgaXMgdHJ1ZSwgdGhlbiB0aGUKKyAgLy8gbWV0aG9kIGNoZWNrcyBpZiB0aGVyZSdzIGEgcGVuZGluZyBzY3JvbGwgYW5kIGlmIHNvIGFsc28gaW52YWxpZGF0ZXMgfHJlY3R8CisgIC8vIGluIHRoZSBuZXcgc2Nyb2xsIHBvc2l0aW9uLgorICB2b2lkIEludmFsaWRhdGVSZWN0SW50ZXJuYWwoY29uc3QgcHA6OlJlY3QmIHJlY3QsIGJvb2wgY2hlY2tfc2Nyb2xsKTsKKworICBJbnRlcm5hbFBhaW50VXBkYXRlIHVwZGF0ZV87Cit9OworCisjZW5kaWYgIC8vIFBERl9QQUlOVF9BR0dSRUdBVE9SX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGFpbnRfbWFuYWdlci5jYyBiL3hmYV90ZXN0L3BkZi9wYWludF9tYW5hZ2VyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGFpbnRfbWFuYWdlci5jYwpAQCAtMCwwICsxLDMwMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9wYWludF9tYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJwcGFwaS9jL3BwX2Vycm9ycy5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9pbnN0YW5jZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9tb2R1bGUuaCIKKworUGFpbnRNYW5hZ2VyOjpQYWludE1hbmFnZXIocHA6Okluc3RhbmNlKiBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCogY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hbHdheXNfb3BhcXVlKQorICAgIDogaW5zdGFuY2VfKGluc3RhbmNlKSwKKyAgICAgIGNsaWVudF8oY2xpZW50KSwKKyAgICAgIGlzX2Fsd2F5c19vcGFxdWVfKGlzX2Fsd2F5c19vcGFxdWUpLAorICAgICAgY2FsbGJhY2tfZmFjdG9yeV8oTlVMTCksCisgICAgICBtYW51YWxfY2FsbGJhY2tfcGVuZGluZ18oZmFsc2UpLAorICAgICAgZmx1c2hfcGVuZGluZ18oZmFsc2UpLAorICAgICAgaGFzX3BlbmRpbmdfcmVzaXplXyhmYWxzZSksCisgICAgICBncmFwaGljc19uZWVkX3RvX2JlX2JvdW5kXyhmYWxzZSksCisgICAgICBwZW5kaW5nX2RldmljZV9zY2FsZV8oMS4wKSwKKyAgICAgIGRldmljZV9zY2FsZV8oMS4wKSwKKyAgICAgIGluX3BhaW50XyhmYWxzZSksCisgICAgICBmaXJzdF9wYWludF8odHJ1ZSksCisgICAgICB2aWV3X3NpemVfY2hhbmdlZF93YWl0aW5nX2Zvcl9wYWludF8oZmFsc2UpIHsKKyAgLy8gU2V0IHRoZSBjYWxsYmFjayBvYmplY3Qgb3V0c2lkZSBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCB0byBhdm9pZCBhCisgIC8vIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdXNpbmcgInRoaXMiIGluIGFuIGluaXRpYWxpemVyIGxpc3QuCisgIGNhbGxiYWNrX2ZhY3RvcnlfLkluaXRpYWxpemUodGhpcyk7CisKKyAgLy8gWW91IGNhbiBub3QgdXNlIGEgTlVMTCBjbGllbnQgcG9pbnRlci4KKyAgRENIRUNLKGNsaWVudCk7Cit9CisKK1BhaW50TWFuYWdlcjo6flBhaW50TWFuYWdlcigpIHsKK30KKworLy8gc3RhdGljCitwcDo6U2l6ZSBQYWludE1hbmFnZXI6OkdldE5ld0NvbnRleHRTaXplKGNvbnN0IHBwOjpTaXplJiBjdXJyZW50X2NvbnRleHRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlNpemUmIHBsdWdpbl9zaXplKSB7CisgIC8vIFRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBzcGFjZSBpbiBwaXhlbHMgdG8gYWxsb2NhdGUgdG8gdGhlIHJpZ2h0L2JvdHRvbSBvZgorICAvLyB0aGUgY29udGV4dC4KKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gNTA7CisKKyAgLy8gRGVmYXVsdCB0byByZXR1cm5pbmcgdGhlIHNhbWUgc2l6ZS4KKyAgcHA6OlNpemUgcmVzdWx0ID0gY3VycmVudF9jb250ZXh0X3NpemU7CisKKyAgLy8gVGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgcGx1Z2luIGJlZm9yZSByZXNpemluZyB0aGUgY29udGV4dCB0byBlbnN1cmUgd2UKKyAgLy8gYXJlbid0IHdhc3RpbmcgdG9vIG11Y2ggbWVtb3J5LiBXZSBkZWR1Y3QgdHdpY2UgdGhlIGtCdWZmZXJTaXplIGZyb20gdGhlCisgIC8vIGN1cnJlbnQgY29udGV4dCBzaXplIHdoaWNoIGdpdmVzIGEgdGhyZXNoaG9sZCB0aGF0IGlzIGtCdWZmZXJTaXplIGJlbG93CisgIC8vIHRoZSBwbHVnaW4gc2l6ZSB3aGVuIHRoZSBjb250ZXh0IHNpemUgd2FzIGxhc3QgY29tcHV0ZWQuCisgIHBwOjpTaXplIG1pbl9zaXplKAorICAgICAgc3RkOjptYXgoY3VycmVudF9jb250ZXh0X3NpemUud2lkdGgoKSAtIDIgKiBrQnVmZmVyU2l6ZSwgMCksCisgICAgICBzdGQ6Om1heChjdXJyZW50X2NvbnRleHRfc2l6ZS5oZWlnaHQoKSAtIDIgKiBrQnVmZmVyU2l6ZSwgMCkpOworCisgIC8vIElmIHRoZSBwbHVnaW4gc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGUgY3VycmVudCBjb250ZXh0IHNpemUsIHdlIG5lZWQgdG8KKyAgLy8gcmVzaXplIHRoZSBjb250ZXh0LiBJZiB0aGUgcGx1Z2luIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50CisgIC8vIGNvbnRleHQgc2l6ZSBieSBhIGdpdmVuIHRocmVzaGhvbGQgdGhlbiByZXNpemUgdGhlIGNvbnRleHQgc28gdGhhdCB3ZQorICAvLyBhcmVuJ3Qgd2FzdGluZyB0b28gbXVjaCBtZW1vcnkuCisgIGlmIChwbHVnaW5fc2l6ZS53aWR0aCgpID4gY3VycmVudF9jb250ZXh0X3NpemUud2lkdGgoKSB8fAorICAgICAgcGx1Z2luX3NpemUuaGVpZ2h0KCkgPiBjdXJyZW50X2NvbnRleHRfc2l6ZS5oZWlnaHQoKSB8fAorICAgICAgcGx1Z2luX3NpemUud2lkdGgoKSA8IG1pbl9zaXplLndpZHRoKCkgfHwKKyAgICAgIHBsdWdpbl9zaXplLmhlaWdodCgpIDwgbWluX3NpemUuaGVpZ2h0KCkpIHsKKyAgICAgIC8vIENyZWF0ZSBhIGxhcmdlciBjb250ZXh0IHRoYW4gbmVlZGVkIHNvIHRoYXQgaWYgd2Ugb25seSByZXNpemUgYnkgYQorICAgICAgLy8gc21hbGwgbWFyZ2luLCB3ZSBkb24ndCBuZWVkIGEgbmV3IGNvbnRleHQuCisgICAgICByZXN1bHQgPSBwcDo6U2l6ZShwbHVnaW5fc2l6ZS53aWR0aCgpICsga0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5fc2l6ZS5oZWlnaHQoKSArIGtCdWZmZXJTaXplKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUGFpbnRNYW5hZ2VyOjpJbml0aWFsaXplKHBwOjpJbnN0YW5jZSogaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQqIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYWx3YXlzX29wYXF1ZSkgeworICBEQ0hFQ0soIWluc3RhbmNlXyAmJiAhY2xpZW50Xyk7ICAvLyBDYW4ndCBpbml0aWFsaXplIHR3aWNlLgorICBpbnN0YW5jZV8gPSBpbnN0YW5jZTsKKyAgY2xpZW50XyA9IGNsaWVudDsKKyAgaXNfYWx3YXlzX29wYXF1ZV8gPSBpc19hbHdheXNfb3BhcXVlOworfQorCit2b2lkIFBhaW50TWFuYWdlcjo6U2V0U2l6ZShjb25zdCBwcDo6U2l6ZSYgbmV3X3NpemUsIGZsb2F0IGRldmljZV9zY2FsZSkgeworICBpZiAoR2V0RWZmZWN0aXZlU2l6ZSgpID09IG5ld19zaXplICYmCisgICAgICBHZXRFZmZlY3RpdmVEZXZpY2VTY2FsZSgpID09IGRldmljZV9zY2FsZSkKKyAgICByZXR1cm47CisKKyAgaGFzX3BlbmRpbmdfcmVzaXplXyA9IHRydWU7CisgIHBlbmRpbmdfc2l6ZV8gPSBuZXdfc2l6ZTsKKyAgcGVuZGluZ19kZXZpY2Vfc2NhbGVfID0gZGV2aWNlX3NjYWxlOworCisgIHZpZXdfc2l6ZV9jaGFuZ2VkX3dhaXRpbmdfZm9yX3BhaW50XyA9IHRydWU7CisKKyAgSW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBhaW50TWFuYWdlcjo6SW52YWxpZGF0ZSgpIHsKKyAgLy8gWW91IG11c3QgY2FsbCBTZXRTaXplIGJlZm9yZSB1c2luZy4KKyAgRENIRUNLKCFncmFwaGljc18uaXNfbnVsbCgpIHx8IGhhc19wZW5kaW5nX3Jlc2l6ZV8pOworCisgIEVuc3VyZUNhbGxiYWNrUGVuZGluZygpOworICBhZ2dyZWdhdG9yXy5JbnZhbGlkYXRlUmVjdChwcDo6UmVjdChHZXRFZmZlY3RpdmVTaXplKCkpKTsKK30KKwordm9pZCBQYWludE1hbmFnZXI6OkludmFsaWRhdGVSZWN0KGNvbnN0IHBwOjpSZWN0JiByZWN0KSB7CisgIERDSEVDSyghaW5fcGFpbnRfKTsKKworICAvLyBZb3UgbXVzdCBjYWxsIFNldFNpemUgYmVmb3JlIHVzaW5nLgorICBEQ0hFQ0soIWdyYXBoaWNzXy5pc19udWxsKCkgfHwgaGFzX3BlbmRpbmdfcmVzaXplXyk7CisKKyAgLy8gQ2xpcCB0aGUgcmVjdCB0byB0aGUgZGV2aWNlIGFyZWEuCisgIHBwOjpSZWN0IGNsaXBwZWRfcmVjdCA9IHJlY3QuSW50ZXJzZWN0KHBwOjpSZWN0KEdldEVmZmVjdGl2ZVNpemUoKSkpOworICBpZiAoY2xpcHBlZF9yZWN0LklzRW1wdHkoKSkKKyAgICByZXR1cm47ICAvLyBOb3RoaW5nIHRvIGRvLgorCisgIEVuc3VyZUNhbGxiYWNrUGVuZGluZygpOworICBhZ2dyZWdhdG9yXy5JbnZhbGlkYXRlUmVjdChjbGlwcGVkX3JlY3QpOworfQorCit2b2lkIFBhaW50TWFuYWdlcjo6U2Nyb2xsUmVjdChjb25zdCBwcDo6UmVjdCYgY2xpcF9yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlBvaW50JiBhbW91bnQpIHsKKyAgRENIRUNLKCFpbl9wYWludF8pOworCisgIC8vIFlvdSBtdXN0IGNhbGwgU2V0U2l6ZSBiZWZvcmUgdXNpbmcuCisgIERDSEVDSyghZ3JhcGhpY3NfLmlzX251bGwoKSB8fCBoYXNfcGVuZGluZ19yZXNpemVfKTsKKworICBFbnN1cmVDYWxsYmFja1BlbmRpbmcoKTsKKworICBhZ2dyZWdhdG9yXy5TY3JvbGxSZWN0KGNsaXBfcmVjdCwgYW1vdW50KTsKK30KKworcHA6OlNpemUgUGFpbnRNYW5hZ2VyOjpHZXRFZmZlY3RpdmVTaXplKCkgY29uc3QgeworICByZXR1cm4gaGFzX3BlbmRpbmdfcmVzaXplXyA/IHBlbmRpbmdfc2l6ZV8gOiBwbHVnaW5fc2l6ZV87Cit9CisKK2Zsb2F0IFBhaW50TWFuYWdlcjo6R2V0RWZmZWN0aXZlRGV2aWNlU2NhbGUoKSBjb25zdCB7CisgIHJldHVybiBoYXNfcGVuZGluZ19yZXNpemVfID8gcGVuZGluZ19kZXZpY2Vfc2NhbGVfIDogZGV2aWNlX3NjYWxlXzsKK30KKwordm9pZCBQYWludE1hbmFnZXI6OkVuc3VyZUNhbGxiYWNrUGVuZGluZygpIHsKKyAgLy8gVGhlIGJlc3Qgd2F5IGZvciB1cyB0byBkbyB0aGUgbmV4dCB1cGRhdGUgaXMgdG8gZ2V0IGEgbm90aWZpY2F0aW9uIHRoYXQKKyAgLy8gYSBwcmV2aW91cyBvbmUgaGFzIGNvbXBsZXRlZC4gU28gaWYgd2UncmUgYWxyZWFkeSB3YWl0aW5nIGZvciBvbmUsIHdlCisgIC8vIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZGlmZmVyZW50bHkgbm93LgorICBpZiAoZmx1c2hfcGVuZGluZ18pCisgICAgcmV0dXJuOworCisgIC8vIElmIG5vIGZsdXNoIGlzIHBlbmRpbmcsIHdlIG5lZWQgdG8gZG8gYSBtYW51YWwgY2FsbCB0byBnZXQgYmFjayB0byB0aGUKKyAgLy8gbWFpbiB0aHJlYWQuIFdlIG1heSBoYXZlIG9uZSBhbHJlYWR5IHBlbmRpbmcsIG9yIHdlIG1heSBuZWVkIHRvIHNjaGVkdWxlLgorICBpZiAobWFudWFsX2NhbGxiYWNrX3BlbmRpbmdfKQorICAgIHJldHVybjsKKworICBwcDo6TW9kdWxlOjpHZXQoKS0+Y29yZSgpLT5DYWxsT25NYWluVGhyZWFkKAorICAgICAgMCwKKyAgICAgIGNhbGxiYWNrX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZQYWludE1hbmFnZXI6Ok9uTWFudWFsQ2FsbGJhY2tDb21wbGV0ZSksCisgICAgICAwKTsKKyAgbWFudWFsX2NhbGxiYWNrX3BlbmRpbmdfID0gdHJ1ZTsKK30KKwordm9pZCBQYWludE1hbmFnZXI6OkRvUGFpbnQoKSB7CisgIGluX3BhaW50XyA9IHRydWU7CisKKyAgc3RkOjp2ZWN0b3I8UmVhZHlSZWN0PiByZWFkeTsKKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHBlbmRpbmc7CisKKyAgRENIRUNLKGFnZ3JlZ2F0b3JfLkhhc1BlbmRpbmdVcGRhdGUoKSk7CisKKyAgLy8gQXBwbHkgYW55IHBlbmRpbmcgcmVzaXplLiBTZXR0aW5nIHRoZSBncmFwaGljcyB0byB0aGlzIGNsYXNzIG11c3QgaGFwcGVuCisgIC8vIGJlZm9yZSBhc2tpbmcgdGhlIHBsdWdpbiB0byBwYWludCBpbiBjYXNlIGl0IHJlcXVlc3RzIGludmFsaWRlcyBvciByZXNpemVzLgorICAvLyBIb3dldmVyLCB0aGUgYmluZCBtdXN0IG5vdCBoYXBwZW4gdW50aWwgYWZ0ZXJ3YXJkIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KKyAgLy8gaGF2ZSBhbiB1bnBhaW50ZWQgZGV2aWNlIGJvdW5kLiBUaGUgbmVlZHNfYmluZGluZyBmbGFnIHRlbGxzIHVzIHdoZXRoZXIgdG8KKyAgLy8gZG8gdGhpcyBsYXRlci4KKyAgaWYgKGhhc19wZW5kaW5nX3Jlc2l6ZV8pIHsKKyAgICBwbHVnaW5fc2l6ZV8gPSBwZW5kaW5nX3NpemVfOworICAgIC8vIE9ubHkgY3JlYXRlIGEgbmV3IGdyYXBoaWNzIGNvbnRleHQgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpc24ndCBiaWcKKyAgICAvLyBlbm91Z2ggb3IgaWYgaXQgaXMgZmFyIHRvbyBiaWcuIFRoaXMgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGNvbnRleHQgaWYKKyAgICAvLyB3ZSBvbmx5IHJlc2l6ZSBieSBhIHNtYWxsIGFtb3VudC4KKyAgICBwcDo6U2l6ZSBuZXdfc2l6ZSA9IEdldE5ld0NvbnRleHRTaXplKGdyYXBoaWNzXy5zaXplKCksIHBlbmRpbmdfc2l6ZV8pOworICAgIGlmIChncmFwaGljc18uc2l6ZSgpICE9IG5ld19zaXplKSB7CisgICAgICBncmFwaGljc18gPSBwcDo6R3JhcGhpY3MyRChpbnN0YW5jZV8sIG5ld19zaXplLCBpc19hbHdheXNfb3BhcXVlXyk7CisgICAgICBncmFwaGljc19uZWVkX3RvX2JlX2JvdW5kXyA9IHRydWU7CisKKyAgICAgIC8vIFNpbmNlIHdlJ3JlIGJpbmRpbmcgYSBuZXcgb25lLCBhbGwgb2YgdGhlIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2FuY2VsZWQuCisgICAgICBtYW51YWxfY2FsbGJhY2tfcGVuZGluZ18gPSBmYWxzZTsKKyAgICAgIGZsdXNoX3BlbmRpbmdfID0gZmFsc2U7CisgICAgICBjYWxsYmFja19mYWN0b3J5Xy5DYW5jZWxBbGwoKTsKKyAgICB9CisKKyAgICBpZiAocGVuZGluZ19kZXZpY2Vfc2NhbGVfICE9IDEuMCkKKyAgICAgIGdyYXBoaWNzXy5TZXRTY2FsZSgxLjAgLyBwZW5kaW5nX2RldmljZV9zY2FsZV8pOworICAgIGRldmljZV9zY2FsZV8gPSBwZW5kaW5nX2RldmljZV9zY2FsZV87CisKKyAgICAvLyBUaGlzIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgY2FsbGluZyBpbnRvIHRoZSBwbHVnaW4gc2luY2UgaXQgbWF5IGRvCisgICAgLy8gYWRkaXRpb25hbCBpbnZhbGlkYXRpb24gb3Igc2l6aW5nIG9wZXJhdGlvbnMuCisgICAgaGFzX3BlbmRpbmdfcmVzaXplXyA9IGZhbHNlOworICAgIHBlbmRpbmdfc2l6ZV8gPSBwcDo6U2l6ZSgpOworICB9CisKKyAgUGFpbnRBZ2dyZWdhdG9yOjpQYWludFVwZGF0ZSB1cGRhdGUgPSBhZ2dyZWdhdG9yXy5HZXRQZW5kaW5nVXBkYXRlKCk7CisgIGNsaWVudF8tPk9uUGFpbnQodXBkYXRlLnBhaW50X3JlY3RzLCAmcmVhZHksICZwZW5kaW5nKTsKKworICBpZiAocmVhZHkuZW1wdHkoKSAmJiBwZW5kaW5nLmVtcHR5KCkpIHsKKyAgICBpbl9wYWludF8gPSBmYWxzZTsKKyAgICByZXR1cm47ICAvLyBOb3RoaW5nIHdhcyBwYWludGVkLCBkb24ndCBzY2hlZHVsZSBhIGZsdXNoLgorICB9CisKKyAgc3RkOjp2ZWN0b3I8UGFpbnRBZ2dyZWdhdG9yOjpSZWFkeVJlY3Q+IHJlYWR5X25vdzsKKyAgaWYgKHBlbmRpbmcuZW1wdHkoKSkgeworICAgIHN0ZDo6dmVjdG9yPFBhaW50QWdncmVnYXRvcjo6UmVhZHlSZWN0PiB0ZW1wX3JlYWR5OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZHkuc2l6ZSgpOyArK2kpCisgICAgICB0ZW1wX3JlYWR5LnB1c2hfYmFjayhyZWFkeVtpXSk7CisgICAgYWdncmVnYXRvcl8uU2V0SW50ZXJtZWRpYXRlUmVzdWx0cyh0ZW1wX3JlYWR5LCBwZW5kaW5nKTsKKyAgICByZWFkeV9ub3cgPSBhZ2dyZWdhdG9yXy5HZXRSZWFkeVJlY3RzKCk7CisgICAgYWdncmVnYXRvcl8uQ2xlYXJQZW5kaW5nVXBkYXRlKCk7CisKKyAgICAvLyBBcHBseSBhbnkgc2Nyb2xsIGZpcnN0LgorICAgIGlmICh1cGRhdGUuaGFzX3Njcm9sbCkKKyAgICAgIGdyYXBoaWNzXy5TY3JvbGwodXBkYXRlLnNjcm9sbF9yZWN0LCB1cGRhdGUuc2Nyb2xsX2RlbHRhKTsKKworICAgIHZpZXdfc2l6ZV9jaGFuZ2VkX3dhaXRpbmdfZm9yX3BhaW50XyA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPFBhaW50QWdncmVnYXRvcjo6UmVhZHlSZWN0PiByZWFkeV9sYXRlcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWR5LnNpemUoKTsgKytpKSB7CisgICAgICAvLyBEb24ndCBmbHVzaCBhbnkgcGFydCAoaS5lLiBzY3JvbGxiYXJzKSBpZiB3ZSdyZSByZXNpemluZyB0aGUgYnJvd3NlciwKKyAgICAgIC8vIGFzIHRoYXQnbGwgbGVhZCB0byBmbGFzaGVzLiAgVW50aWwgd2UgZmx1c2gsIHRoZSBicm93c2VyIHdpbGwgdXNlIHRoZQorICAgICAgLy8gcHJldmlvdXMgaW1hZ2UsIGJ1dCBpZiB3ZSBmbHVzaCwgaXQnbGwgcmV2ZXJ0IHRvIHVzaW5nIHRoZSBibGFuayBpbWFnZS4KKyAgICAgIC8vIFdlIG1ha2UgYW4gZXhjZXB0aW9uIGZvciB0aGUgZmlyc3QgcGFpbnQgc2luY2Ugd2Ugd2FudCB0byBzaG93IHRoZQorICAgICAgLy8gZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIGluc3RlYWQgb2YgdGhlIHBlcHBlciBkZWZhdWx0IG9mIGJsYWNrLgorICAgICAgaWYgKHJlYWR5W2ldLmZsdXNoX25vdyAmJgorICAgICAgICAgICghdmlld19zaXplX2NoYW5nZWRfd2FpdGluZ19mb3JfcGFpbnRfIHx8IGZpcnN0X3BhaW50XykpIHsKKyAgICAgICAgcmVhZHlfbm93LnB1c2hfYmFjayhyZWFkeVtpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWFkeV9sYXRlci5wdXNoX2JhY2socmVhZHlbaV0pOworICAgICAgfQorICAgIH0KKyAgICAvLyBUYWtlIHRoZSByZWN0YW5nbGVzLCBleGNlcHQgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIGZsdXNoZWQgcmlnaHQgYXdheSwKKyAgICAvLyBhbmQgc2F2ZSB0aGVtIHNvIHRoYXQgZXZlcnl0aGluZyBpcyBmbHVzaGVkIGF0IG9uY2UuCisgICAgYWdncmVnYXRvcl8uU2V0SW50ZXJtZWRpYXRlUmVzdWx0cyhyZWFkeV9sYXRlciwgcGVuZGluZyk7CisKKyAgICBpZiAocmVhZHlfbm93LmVtcHR5KCkpIHsKKyAgICAgIGluX3BhaW50XyA9IGZhbHNlOworICAgICAgRW5zdXJlQ2FsbGJhY2tQZW5kaW5nKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkeV9ub3cuc2l6ZSgpOyArK2kpIHsKKyAgICBncmFwaGljc18uUGFpbnRJbWFnZURhdGEoCisgICAgICAgIHJlYWR5X25vd1tpXS5pbWFnZV9kYXRhLCByZWFkeV9ub3dbaV0ub2Zmc2V0LCByZWFkeV9ub3dbaV0ucmVjdCk7CisgIH0KKworICBpbnQzMl90IHJlc3VsdCA9IGdyYXBoaWNzXy5GbHVzaCgKKyAgICAgIGNhbGxiYWNrX2ZhY3RvcnlfLk5ld0NhbGxiYWNrKCZQYWludE1hbmFnZXI6Ok9uRmx1c2hDb21wbGV0ZSkpOworCisgIC8vIElmIHlvdSB0cmlnZ2VyIHRoaXMgYXNzZXJ0aW9uLCB0aGVuIHlvdXIgcGx1Z2luIGhhcyBjYWxsZWQgRmx1c2goKQorICAvLyBtYW51YWxseS4gV2hlbiB1c2luZyB0aGUgUGFpbnRNYW5hZ2VyLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIEZsdXNoLCBpdCB3aWxsCisgIC8vIGhhbmRsZSB0aGF0IGZvciB5b3UgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IHdoZW4gaXQgY2FuIGRvIHRoZSBuZXh0IHBhaW50CisgIC8vIGJ5IGltcGxlbWVudGluZyB0aGUgZmx1c2ggY2FsbGJhY2suCisgIC8vCisgIC8vIEFub3RoZXIgcG9zc2libGUgY2F1c2Ugb2YgdGhpcyBhc3NlcnRpb24gaXMgcmUtdXNpbmcgZGV2aWNlcy4gSWYgeW91CisgIC8vIHVzZSBvbmUgZGV2aWNlLCBzd2FwIGl0IHdpdGggYW5vdGhlciwgdGhlbiBzd2FwIGl0IGJhY2ssIHdlIHdvbid0IGtub3cKKyAgLy8gdGhhdCB3ZSd2ZSBhbHJlYWR5IHNjaGVkdWxlZCBhIEZsdXNoIG9uIHRoZSBmaXJzdCBkZXZpY2UuIEl0J3MgYmVzdCB0byBub3QKKyAgLy8gcmUtdXNlIGRldmljZXMgaW4gdGhpcyB3YXkuCisgIERDSEVDSyhyZXN1bHQgIT0gUFBfRVJST1JfSU5QUk9HUkVTUyk7CisKKyAgaWYgKHJlc3VsdCA9PSBQUF9PS19DT01QTEVUSU9OUEVORElORykgeworICAgIGZsdXNoX3BlbmRpbmdfID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBEQ0hFQ0socmVzdWx0ID09IFBQX09LKTsgIC8vIENhdGNoIGFsbCBvdGhlciBlcnJvcnMgaW4gZGVidWcgbW9kZS4KKyAgfQorCisgIGluX3BhaW50XyA9IGZhbHNlOworICBmaXJzdF9wYWludF8gPSBmYWxzZTsKKworICBpZiAoZ3JhcGhpY3NfbmVlZF90b19iZV9ib3VuZF8pIHsKKyAgICBpbnN0YW5jZV8tPkJpbmRHcmFwaGljcyhncmFwaGljc18pOworICAgIGdyYXBoaWNzX25lZWRfdG9fYmVfYm91bmRfID0gZmFsc2U7CisgIH0KK30KKwordm9pZCBQYWludE1hbmFnZXI6Ok9uRmx1c2hDb21wbGV0ZShpbnQzMl90KSB7CisgIERDSEVDSyhmbHVzaF9wZW5kaW5nXyk7CisgIGZsdXNoX3BlbmRpbmdfID0gZmFsc2U7CisKKyAgLy8gSWYgbW9yZSBwYWludHMgd2VyZSBlbnF1ZXVlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBmbHVzaCB0bworICAvLyBjb21wbGV0ZSwgZXhlY3V0ZSB0aGVtIG5vdy4KKyAgaWYgKGFnZ3JlZ2F0b3JfLkhhc1BlbmRpbmdVcGRhdGUoKSkKKyAgICBEb1BhaW50KCk7Cit9CisKK3ZvaWQgUGFpbnRNYW5hZ2VyOjpPbk1hbnVhbENhbGxiYWNrQ29tcGxldGUoaW50MzJfdCkgeworICBEQ0hFQ0sobWFudWFsX2NhbGxiYWNrX3BlbmRpbmdfKTsKKyAgbWFudWFsX2NhbGxiYWNrX3BlbmRpbmdfID0gZmFsc2U7CisKKyAgLy8gSnVzdCBiZWNhdXNlIHdlIGhhdmUgYSBtYW51YWwgY2FsbGJhY2sgZG9lc24ndCBtZWFuIHRoZXJlIGFyZSBhY3R1YWxseSBhbnkKKyAgLy8gaW52YWxpZCByZWdpb25zLiBFdmVuIHRob3VnaCB3ZSBvbmx5IHNjaGVkdWxlIHRoaXMgY2FsbGJhY2sgd2hlbiBzb21ldGhpbmcKKyAgLy8gaXMgcGVuZGluZywgYSBGbHVzaCBjYWxsYmFjayBjb3VsZCBoYXZlIGNvbWUgaW4gYmVmb3JlIHRoaXMgY2FsbGJhY2sgd2FzCisgIC8vIGV4ZWN1dGVkIGFuZCB0aGF0IGNvdWxkIGhhdmUgY2xlYXJlZCB0aGUgcXVldWUuCisgIGlmIChhZ2dyZWdhdG9yXy5IYXNQZW5kaW5nVXBkYXRlKCkpCisgICAgRG9QYWludCgpOworfQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BhaW50X21hbmFnZXIuaCBiL3hmYV90ZXN0L3BkZi9wYWludF9tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1NWViNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wYWludF9tYW5hZ2VyLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BBSU5UX01BTkFHRVJfSF8KKyNkZWZpbmUgUERGX1BBSU5UX01BTkFHRVJfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInBkZi9wYWludF9hZ2dyZWdhdG9yLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2dyYXBoaWNzXzJkLmgiCisjaW5jbHVkZSAicHBhcGkvdXRpbGl0eS9jb21wbGV0aW9uX2NhbGxiYWNrX2ZhY3RvcnkuaCIKKworbmFtZXNwYWNlIHBwIHsKK2NsYXNzIEdyYXBoaWNzMkQ7CitjbGFzcyBJbnN0YW5jZTsKK2NsYXNzIFBvaW50OworY2xhc3MgUmVjdDsKK307CisKKy8vIEN1c3RvbSBQYWludE1hbmFnZXIgZm9yIHRoZSBQREYgcGx1Z2luLiAgVGhpcyBpcyBicmFuY2hlZCBmcm9tIHRoZSBQZXBwZXIKKy8vIHZlcnNpb24uICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgc3VwcG9ydHMgcHJvZ3Jlc3NpdmUgcmVuZGVyaW5nIG9mIGRpcnR5CisvLyByZWN0cywgd2hlcmUgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIHJlbmRlcmluZyBlbmdpbmUgYXJlIG5lZWRlZC4gIEl0IGFsc28KKy8vIHN1cHBvcnRzIGhhdmluZyBoaWdoZXItcHJpb3JpdHkgcmVjdHMgZmx1c2hpbmcgcmlnaHQgYXdheSwgaS5lLiB0aGUKKy8vIHNjcm9sbGJhcnMuCisvLworLy8gVGhlIGNsaWVudCdzIE9uUGFpbnQKK2NsYXNzIFBhaW50TWFuYWdlciB7CisgcHVibGljOgorICAvLyBMaWtlIFBhaW50QWdncmVnYXRvcidzIHZlcnNpb24sIGJ1dCBhbGxvd3MgdGhlIHBsdWdpbiB0byB0ZWxsIHVzIHdoZXRoZXIKKyAgLy8gaXQgc2hvdWxkIGJlIGZsdXNoZWQgdG8gdGhlIHNjcmVlbiBpbW1lZGlhdGVseSBvciB3aGVuIHRoZSByZXN0IG9mIHRoZQorICAvLyBwbHVnaW4gdmlld3BvcnQgaXMgcmVhZHkuCisgIHN0cnVjdCBSZWFkeVJlY3QgeworICAgIHBwOjpQb2ludCBvZmZzZXQ7CisgICAgcHA6OlJlY3QgcmVjdDsKKyAgICBwcDo6SW1hZ2VEYXRhIGltYWdlX2RhdGE7CisgICAgYm9vbCBmbHVzaF9ub3c7CisKKyAgICBSZWFkeVJlY3QoY29uc3QgcHA6OlJlY3QmIHIsIGNvbnN0IHBwOjpJbWFnZURhdGEmIGksIGJvb2wgZikKKyAgICAgICAgOiByZWN0KHIpLCBpbWFnZV9kYXRhKGkpLCBmbHVzaF9ub3coZikge30KKworICAgIG9wZXJhdG9yIFBhaW50QWdncmVnYXRvcjo6UmVhZHlSZWN0KCkgY29uc3QgeworICAgICAgUGFpbnRBZ2dyZWdhdG9yOjpSZWFkeVJlY3QgcnY7CisgICAgICBydi5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICBydi5yZWN0ID0gcmVjdDsKKyAgICAgIHJ2LmltYWdlX2RhdGEgPSBpbWFnZV9kYXRhOworICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgfTsKKyAgY2xhc3MgQ2xpZW50IHsKKyAgIHB1YmxpYzoKKyAgICAvLyBQYWludHMgdGhlIGdpdmVuIGludmFsaWQgYXJlYSBvZiB0aGUgcGx1Z2luIHRvIHRoZSBnaXZlbiBncmFwaGljcworICAgIC8vIGRldmljZS4gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyBwYWludGVkLgorICAgIC8vCisgICAgLy8gWW91IGFyZSBnaXZlbiB0aGUgbGlzdCBvZiByZWN0cyB0byBwYWludCBpbiB8cGFpbnRfcmVjdHN8LiAgWW91IGNhbgorICAgIC8vIGNvbWJpbmUgcGFpbnRpbmcgaW50byBsZXNzIHJlY3RhbmdsZXMgaWYgaXQncyBtb3JlIGVmZmljaWVudC4gIFdoZW4gYQorICAgIC8vIHJlY3QgaXMgcGFpbnRlZCwgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBwYWludCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vIHxyZWFkeXwuICBPdGhlcndpc2UgaWYgYSBwYWludCBuZWVkcyBtb3JlIHdvcmssIGFkZCB0aGUgcmVjdCB0bworICAgIC8vIHxwZW5kaW5nfC4gIElmIHxwZW5kaW5nfCBpcyBub3QgZW1wdHksIHlvdXIgT25QYWludCBmdW5jdGlvbiB3aWxsIGdldAorICAgIC8vIGNhbGxlZCBhZ2Fpbi4gIE9uY2UgT25QYWludCBpcyBjYWxsZWQgYW5kIGl0IHJldHVybnMgbm8gcGVuZGluZyByZWN0cywKKyAgICAvLyBhbGwgdGhlIHByZXZpb3VzbHkgcmVhZHkgcmVjdHMgd2lsbCBiZSBmbHVzaGVkIG9uIHNjcmVlbi4gIFRoZSBleGNlcHRpb24KKyAgICAvLyBpcyBmb3IgcmVhZHkgcmVjdHMgdGhhdCBoYXZlIHxmbHVzaF9ub3d8IHNldCB0byB0cnVlLiAgVGhlc2Ugd2lsbCBiZQorICAgIC8vIGZsdXNoZWQgcmlnaHQgYXdheS4KKyAgICAvLworICAgIC8vIERvIG5vdCBjYWxsIEZsdXNoKCkgb24gdGhlIGdyYXBoaWNzIGRldmljZSwgdGhpcyB3aWxsIGJlIGRvbmUKKyAgICAvLyBhdXRvbWF0aWNhbGx5IGlmIHlvdSByZXR1cm4gdHJ1ZSBmcm9tIHRoaXMgZnVuY3Rpb24gc2luY2UgdGhlCisgICAgLy8gUGFpbnRNYW5hZ2VyIG5lZWRzIHRvIGhhbmRsZSB0aGUgY2FsbGJhY2suCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIEludmFsaWRhdGUvU2Nyb2xsIGlzIG5vdCBhbGxvd2VkIHdoaWxlIGluc2lkZSBhbiBPblBhaW50CisgICAgdmlydHVhbCB2b2lkIE9uUGFpbnQoY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+JiBwYWludF9yZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSZWFkeVJlY3Q+KiByZWFkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIHBlbmRpbmcpID0gMDsKKyAgIHByb3RlY3RlZDoKKyAgICAvLyBZb3Ugc2hvdWxkbid0IGJlIGRvaW5nIGRlbGV0aW5nIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCisgICAgdmlydHVhbCB+Q2xpZW50KCkge30KKyAgfTsKKworICAvLyBUaGUgaW5zdGFuY2UgaXMgdGhlIHBsdWdpbiBpbnN0YW5jZSB1c2luZyB0aGlzIHBhaW50IG1hbmFnZXIgdG8gZG8gaXRzCisgIC8vIHBhaW50aW5nLiBQYWludGluZyB3aWxsIGF1dG9tYXRpY2FsbHkgZ28gdG8gdGhpcyBpbnN0YW5jZSBhbmQgeW91IGRvbid0CisgIC8vIGhhdmUgdG8gbWFudWFsbHkgYmluZCBhbnkgZGV2aWNlIGNvbnRleHQgKHRoaXMgaXMgYWxsIGhhbmRsZWQgYnkgdGhlCisgIC8vIHBhaW50IG1hbmFnZXIpLgorICAvLworICAvLyBUaGUgQ2xpZW50IGlzIGEgbm9uLW93bmluZyBwb2ludGVyIGFuZCBtdXN0IHJlbWFpbiB2YWxpZCAobm9ybWFsbHkgdGhlCisgIC8vIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIENsaWVudCBpbnRlcmZhY2Ugd2lsbCBvd24gdGhlIHBhaW50IG1hbmFnZXIpLgorICAvLworICAvLyBUaGUgaXNfYWx3YXlzX29wYXF1ZSBmbGFnIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBkZXZpY2UgY29udGV4dHMgdGhhdCB0aGlzCisgIC8vIGNsYXNzIGNyZWF0ZXMuIFNldCB0aGlzIHRvIHRydWUgaWYgeW91ciBwbHVnaW4gYWx3YXlzIGRyYXdzIGFuIG9wYXF1ZQorICAvLyBpbWFnZSB0byB0aGUgZGV2aWNlLiBUaGlzIGlzIHVzZWQgYXMgYSBoaW50IHRvIHRoZSBicm93c2VyIHRoYXQgaXQgZG9lcworICAvLyBub3QgbmVlZCB0byBkbyBhbHBoYSBibGVuZGluZywgd2hpY2ggc3BlZWRzIHVwIHBhaW50aW5nLiBJZiB5b3UgZ2VuZXJhdGUKKyAgLy8gbm9uLW9wcWF1ZSBwaXhlbHMgb3IgYXJlbid0IHN1cmUsIHNldCB0aGlzIHRvIGZhbHNlIGZvciBtb3JlIGdlbmVyYWwKKyAgLy8gYmxlbmRpbmcuCisgIC8vCisgIC8vIElmIHlvdSBzZXQgaXNfYWx3YXlzX29wYXF1ZSwgeW91ciBhbHBoYSBjaGFubmVsIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvCisgIC8vIDB4RkYgb3IgdGhlcmUgbWF5IGJlIHBhaW50aW5nIGFydGlmYWN0cy4gQmVpbmcgb3BhcXVlIHdpbGwgYWxsb3cgdGhlCisgIC8vIGJyb3dzZXIgdG8gZG8gYSBtZW1jcHkgcmF0aGVyIHRoYW4gYSBibGVuZCB0byBwYWludCB0aGUgcGx1Z2luLCBhbmQgdGhpcworICAvLyBtZWFucyB5b3VyIGFscGhhIHZhbHVlcyB3aWxsIGdldCBzZXQgb24gdGhlIHBhZ2UgYmFja2luZyBzdG9yZS4gSWYgdGhlc2UKKyAgLy8gdmFsdWVzIGFyZSBpbmNvcnJlY3QsIGl0IGNvdWxkIG1lc3MgdXAgZnV0dXJlIGJsZW5kaW5nLiBJZiB5b3UgYXJlbid0CisgIC8vIHN1cmUsIGl0IGlzIGFsd2F5cyBjb3JyZWN0IHRvIHNwZWNpZnkgdGhhdCBpdCBpdCBub3Qgb3BhcXVlLgorICAvLworICAvLyBZb3Ugd2lsbCBuZWVkIHRvIGNhbGwgU2V0U2l6ZSBiZWZvcmUgdGhpcyBjbGFzcyB3aWxsIGRvIGFueXRoaW5nLiBOb3JtYWxseQorICAvLyB5b3UgZG8gdGhpcyBmcm9tIHRoZSBWaWV3Q2hhbmdlZCBtZXRob2Qgb2YgeW91ciBwbHVnaW4gaW5zdGFuY2UuCisgIFBhaW50TWFuYWdlcihwcDo6SW5zdGFuY2UqIGluc3RhbmNlLCBDbGllbnQqIGNsaWVudCwgYm9vbCBpc19hbHdheXNfb3BhcXVlKTsKKworICB+UGFpbnRNYW5hZ2VyKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZ3JhcGhpY3MgY29udGV4dCB0byBhbGxvY2F0ZSBmb3IgYSBnaXZlbiBwbHVnaW4KKyAgLy8gc2l6ZS4gV2UgbWF5IGFsbG9jYXRlZCBhIHNsaWdodGx5IGxhcmdlciBidWZmZXIgdGhhbiByZXF1aXJlZCBzbyB0aGF0IHdlCisgIC8vIGRvbid0IGhhdmUgdG8gcmVzaXplIHRoZSBjb250ZXh0IHdoZW4gc2Nyb2xsYmFycyBhcHBlYXIvZGlzc2FwZWFyIGR1ZSB0bworICAvLyB6b29taW5nICh3aGljaCBjYW4gcmVzdWx0IGluIGZsaWNrZXJpbmcpLgorICBzdGF0aWMgcHA6OlNpemUgR2V0TmV3Q29udGV4dFNpemUoY29uc3QgcHA6OlNpemUmIGN1cnJlbnRfY29udGV4dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlNpemUmIHBsdWdpbl9zaXplKTsKKworICAvLyBZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHVzaW5nIGlmIHlvdSB1c2UgdGhlIDAtYXJnIGNvbnN0cnVjdG9yLgorICAvLyBTZWUgdGhlIGNvbnN0cnVjdG9yIGZvciB3aGF0IHRoZXNlIGFyZ3VtZW50cyBtZWFuLgorICB2b2lkIEluaXRpYWxpemUocHA6Okluc3RhbmNlKiBpbnN0YW5jZSwgQ2xpZW50KiBjbGllbnQsCisgICAgICAgICAgICAgICAgICBib29sIGlzX2Fsd2F5c19vcGFxdWUpOworCisgIC8vIFNldHMgdGhlIHNpemUgb2YgdGhlIHBsdWdpbi4gSWYgdGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGNhbGwsCisgIC8vIHRoaXMgd2lsbCBiZSBhIE5PUC4gSWYgdGhlIHNpemUgaGFzIGNoYW5nZWQsIGEgbmV3IGRldmljZSB3aWxsIGJlCisgIC8vIGFsbG9jYXRlZCB0byB0aGUgZ2l2ZW4gc2l6ZSBhbmQgYSBwYWludCB0byB0aGF0IGRldmljZSB3aWxsIGJlIHNjaGVkdWxlZC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBWaWV3Q2hhbmdlZCB3aXRoIHRoZSBzaXplIG9mIHRoZQorICAvLyBwbHVnaW4uIFNpbmNlIGl0IHRyYWNrcyB0aGUgb2xkIHNpemUgYW5kIG9ubHkgYWxsb2NhdGVzIHdoZW4gdGhlIHNpemUKKyAgLy8gY2hhbmdlcywgeW91IGNhbiBhbHdheXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgd2hldGhlcgorICAvLyB0aGUgc2l6ZSBjaGFuZ2VkIG9yIFZpZXdDaGFuZ2VkIGlzIGNhbGxlZCBmb3IgYW5vdGhlciByZWFzb24gKGxpa2UgdGhlCisgIC8vIHBvc2l0aW9uIGNoYW5nZWQpLgorICB2b2lkIFNldFNpemUoY29uc3QgcHA6OlNpemUmIG5ld19zaXplLCBmbG9hdCBuZXdfZGV2aWNlX3NjYWxlKTsKKworICAvLyBJbnZhbGlkYXRlIHRoZSBlbnRpcmUgcGx1Z2luLgorICB2b2lkIEludmFsaWRhdGUoKTsKKworICAvLyBJbnZhbGlkYXRlIHRoZSBnaXZlbiByZWN0LgorICB2b2lkIEludmFsaWRhdGVSZWN0KGNvbnN0IHBwOjpSZWN0JiByZWN0KTsKKworICAvLyBUaGUgZ2l2ZW4gcmVjdCBzaG91bGQgYmUgc2Nyb2xsZWQgYnkgdGhlIGdpdmVuIGFtb3VudHMuCisgIHZvaWQgU2Nyb2xsUmVjdChjb25zdCBwcDo6UmVjdCYgY2xpcF9yZWN0LCBjb25zdCBwcDo6UG9pbnQmIGFtb3VudCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZ3JhcGhpY3MgY29udGV4dCBmb3IgdGhlIG5leHQgcGFpbnQgb3BlcmF0aW9uLgorICAvLyBUaGlzIGlzIHRoZSBwZW5kaW5nIHNpemUgaWYgYSByZXNpemUgaXMgcGVuZGluZyAodGhlIHBsdWdpbiBoYXMgY2FsbGVkCisgIC8vIFNldFNpemUgYnV0IHdlIGhhdmVuJ3QgYWN0dWFsbHkgcGFpbnRlZCBpdCB5ZXQpLCBvciB0aGUgY3VycmVudCBzaXplIG9mCisgIC8vIG5vIHJlc2l6ZSBpcyBwZW5kaW5nLgorICBwcDo6U2l6ZSBHZXRFZmZlY3RpdmVTaXplKCkgY29uc3Q7CisgIGZsb2F0IEdldEVmZmVjdGl2ZURldmljZVNjYWxlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ24gKHRoZXNlIGFyZSB1bmltcGxlbWVudGVkKS4KKyAgUGFpbnRNYW5hZ2VyKGNvbnN0IFBhaW50TWFuYWdlciYpOworICBQYWludE1hbmFnZXImIG9wZXJhdG9yPShjb25zdCBQYWludE1hbmFnZXImKTsKKworICAvLyBNYWtlcyBzdXJlIHRoZXJlIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIHRyaWdnZXIgYSBwYWludCBhdCBhIGxhdGVyIHRpbWUuCisgIC8vIFRoaXMgd2lsbCBiZSBlaXRoZXIgYSBGbHVzaCBjYWxsYmFjayB0ZWxsaW5nIHVzIHdlJ3JlIGFsbG93ZWQgdG8gZ2VuZXJhdGUKKyAgLy8gbW9yZSBkYXRhLCBvciwgaWYgdGhlcmUncyBubyBmbHVzaCBjYWxsYmFjayBwZW5kaW5nLCBhIG1hbnVhbCBjYWxsIGJhY2sKKyAgLy8gdG8gdGhlIG1lc3NhZ2UgbG9vcCB2aWEgRXhlY3V0ZU9uTWFpblRocmVhZC4KKyAgdm9pZCBFbnN1cmVDYWxsYmFja1BlbmRpbmcoKTsKKworICAvLyBEb2VzIHRoZSBjbGllbnQgcGFpbnQgYW5kIGV4ZWN1dGVzIGEgRmx1c2ggaWYgbmVjZXNzYXJ5LgorICB2b2lkIERvUGFpbnQoKTsKKworICAvLyBDYWxsYmFjayBmb3IgYXN5bmNocm9ub3VzIGNvbXBsZXRpb24gb2YgRmx1c2guCisgIHZvaWQgT25GbHVzaENvbXBsZXRlKGludDMyX3QpOworCisgIC8vIENhbGxiYWNrIGZvciBtYW51YWwgc2NoZWR1bGluZyBvZiBwYWludHMgd2hlbiB0aGVyZSBpcyBubyBmbHVzaCBjYWxsYmFjaworICAvLyBwZW5kaW5nLgorICB2b2lkIE9uTWFudWFsQ2FsbGJhY2tDb21wbGV0ZShpbnQzMl90KTsKKworICBwcDo6SW5zdGFuY2UqIGluc3RhbmNlXzsKKworICAvLyBOb24tb3duaW5nIHBvaW50ZXIuIFNlZSB0aGUgY29uc3RydWN0b3IuCisgIENsaWVudCogY2xpZW50XzsKKworICBib29sIGlzX2Fsd2F5c19vcGFxdWVfOworCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tGYWN0b3J5PFBhaW50TWFuYWdlcj4gY2FsbGJhY2tfZmFjdG9yeV87CisKKyAgLy8gVGhpcyBncmFwaGljcyBkZXZpY2Ugd2lsbCBiZSBpc19udWxsKCkgaWYgbm8gZ3JhcGhpY3MgaGFzIGJlZW4gbWFudWFsbHkKKyAgLy8gc2V0IHlldC4KKyAgcHA6OkdyYXBoaWNzMkQgZ3JhcGhpY3NfOworCisgIFBhaW50QWdncmVnYXRvciBhZ2dyZWdhdG9yXzsKKworICAvLyBTZWUgY29tbWVudCBmb3IgRW5zdXJlQ2FsbGJhY2tQZW5kaW5nIGZvciBtb3JlIG9uIGhvdyB0aGVzZSB3b3JrLgorICBib29sIG1hbnVhbF9jYWxsYmFja19wZW5kaW5nXzsKKyAgYm9vbCBmbHVzaF9wZW5kaW5nXzsKKworICAvLyBXaGVuIHdlIGdldCBhIHJlc2l6ZSwgd2UgZG9uJ3QgYmluZCByaWdodCBhd2F5IChzZWUgU2V0U2l6ZSkuIFRoZQorICAvLyBoYXNfcGVuZGluZ19yZXNpemVfIHRlbGxzIHVzIHRoYXQgd2UgbmVlZCB0byBkbyBhIHJlc2l6ZSBmb3IgdGhlIG5leHQKKyAgLy8gcGFpbnQgb3BlcmF0aW9uLiBXaGVuIHRydWUsIHRoZSBuZXcgc2l6ZSBpcyBpbiBwZW5kaW5nX3NpemVfLgorICBib29sIGhhc19wZW5kaW5nX3Jlc2l6ZV87CisgIGJvb2wgZ3JhcGhpY3NfbmVlZF90b19iZV9ib3VuZF87CisgIHBwOjpTaXplIHBlbmRpbmdfc2l6ZV87CisgIHBwOjpTaXplIHBsdWdpbl9zaXplXzsKKyAgZmxvYXQgcGVuZGluZ19kZXZpY2Vfc2NhbGVfOworICBmbG9hdCBkZXZpY2Vfc2NhbGVfOworCisgIC8vIFRydWUgaWZmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBwYWludC4KKyAgYm9vbCBpbl9wYWludF87CisKKyAgLy8gVHJ1ZSBpZiB3ZSBoYXZlbid0IHBhaW50ZWQgdGhlIHBsdWdpbiB2aWV3cG9ydCB5ZXQuCisgIGJvb2wgZmlyc3RfcGFpbnRfOworCisgIC8vIFRydWUgd2hlbiB0aGUgdmlldyBzaXplIGp1c3QgY2hhbmdlZCBhbmQgd2UncmUgd2FpdGluZyBmb3IgYSBwYWludC4KKyAgYm9vbCB2aWV3X3NpemVfY2hhbmdlZF93YWl0aW5nX2Zvcl9wYWludF87Cit9OworCisjZW5kaWYgIC8vIFBERl9QQUlOVF9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGRmLmNjIGIveGZhX3Rlc3QvcGRmL3BkZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ1MDdmCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3BkZi5jYwpAQCAtMCwwICsxLDI3NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9wZGYuaCIKKworI2lmIGRlZmluZWQoT1NfV0lOKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJwZGYvaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJwZGYvb3V0X29mX3Byb2Nlc3NfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJwcGFwaS9jL3BwcC5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9wcml2YXRlL3BkZi5oIgorCitib29sIGdfc2RrX2luaXRpYWxpemVkX3ZpYV9wZXBwZXIgPSBmYWxzZTsKKworLy8gVGhlIE1hYyByZWxlYXNlIGJ1aWxkcyBkaXNjYXJkIENyZWF0ZU1vZHVsZSBhbmQgdGhlIGVudGlyZSBQREZNb2R1bGUKKy8vIGRlZmluaXRpb24gYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVmZXJlbmNlZCBoZXJlLiBUaGlzIGNhdXNlcyB0aGUgUGVwcGVyCisvLyBleHBvcnRzIChQUFBfR2V0SW50ZXJmYWNlIGV0YykgdG8gbm90IGJlIGV4cG9ydGVkLiBTbyB3ZSBmb3JjZSB0aGUgbGlua2VyCisvLyB0byBpbmNsdWRlIHRoaXMgY29kZSBieSB1c2luZyBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkuCisjaWYgX19HTlVDX18gPj0gNAorI2RlZmluZSBQREZfVVNFRCBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkKKyNlbHNlCisjZGVmaW5lIFBERl9VU0VECisjZW5kaWYKKworI2lmIGRlZmluZWQoT1NfV0lOKQorSE1PRFVMRSBnX2htb2R1bGU7CisKK3ZvaWQgSGFuZGxlSW52YWxpZFBhcmFtZXRlcihjb25zdCB3Y2hhcl90KiBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IHJlc2VydmVkKSB7CisgIC8vIERvIHRoZSBzYW1lIGFzIENocm9tZSdzIENIRUNLKGZhbHNlKSB3aGljaCBpcyB1bmRlZmluZWQuCisgIDo6YmFzZTo6ZGVidWc6OkJyZWFrRGVidWdnZXIoKTsKKyAgcmV0dXJuOworfQorCit2b2lkIEhhbmRsZVB1cmVWaXJ0dWFsQ2FsbCgpIHsKKyAgLy8gRG8gdGhlIHNhbWUgYXMgQ2hyb21lJ3MgQ0hFQ0soZmFsc2UpIHdoaWNoIGlzIHVuZGVmaW5lZC4KKyAgOjpiYXNlOjpkZWJ1Zzo6QnJlYWtEZWJ1Z2dlcigpOworICByZXR1cm47Cit9CisKKworQk9PTCBBUElFTlRSWSBEbGxNYWluKEhNT0RVTEUgbW9kdWxlLCBEV09SRCByZWFzb25fZm9yX2NhbGwsIExQVk9JRCByZXNlcnZlZCkgeworICBnX2htb2R1bGUgPSBtb2R1bGU7CisgIGlmIChyZWFzb25fZm9yX2NhbGwgPT0gRExMX1BST0NFU1NfQVRUQUNIKSB7CisgICAgLy8gT24gd2luZG93cyBmb2xsb3dpbmcgaGFuZGxlcnMgd29yayBvbmx5IGluc2lkZSBtb2R1bGUuIFNvIGJyZWFrcGFkIGluCisgICAgLy8gY2hyb21lLmRsbCBkb2VzIG5vdCBjYXRjaCB0aGF0LiBUbyBhdm9pZCBsaW5raW5nIHJlbGF0ZWQgY29kZSBvcgorICAgIC8vIGR1cGxpY2F0aW9uIGJyZWFrcGFkX3dpbi5jYzo6SW5pdENyYXNoUmVwb3J0ZXIoKSBqdXN0IGNhdGNoIGVycm9ycyBoZXJlCisgICAgLy8gYW5kIGNyYXNoIGluIGEgd2F5IGludGVyY2VwdGFibGUgYnkgYnJlYWtwYWQgb2YgcGFyZW50IG1vZHVsZS4KKyAgICBfc2V0X2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIoSGFuZGxlSW52YWxpZFBhcmFtZXRlcik7CisgICAgX3NldF9wdXJlY2FsbF9oYW5kbGVyKEhhbmRsZVB1cmVWaXJ0dWFsQ2FsbCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZgorCituYW1lc3BhY2UgcHAgeworCitQREZfVVNFRCBNb2R1bGUqIENyZWF0ZU1vZHVsZSgpIHsKKyAgcmV0dXJuIG5ldyBjaHJvbWVfcGRmOjpQREZNb2R1bGUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBwCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworUERGTW9kdWxlOjpQREZNb2R1bGUoKSB7Cit9CisKK1BERk1vZHVsZTo6flBERk1vZHVsZSgpIHsKKyAgaWYgKGdfc2RrX2luaXRpYWxpemVkX3ZpYV9wZXBwZXIpIHsKKyAgICBjaHJvbWVfcGRmOjpTaHV0ZG93blNESygpOworICAgIGdfc2RrX2luaXRpYWxpemVkX3ZpYV9wZXBwZXIgPSBmYWxzZTsKKyAgfQorfQorCitib29sIFBERk1vZHVsZTo6SW5pdCgpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3BwOjpJbnN0YW5jZSogUERGTW9kdWxlOjpDcmVhdGVJbnN0YW5jZShQUF9JbnN0YW5jZSBpbnN0YW5jZSkgeworICBpZiAoIWdfc2RrX2luaXRpYWxpemVkX3ZpYV9wZXBwZXIpIHsKKyAgICB2b2lkKiBkYXRhID0gTlVMTDsKKyNpZiBkZWZpbmVkKE9TX1dJTikKKyAgICBkYXRhID0gZ19obW9kdWxlOworI2VuZGlmCisgICAgaWYgKCFjaHJvbWVfcGRmOjpJbml0aWFsaXplU0RLKGRhdGEpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ19zZGtfaW5pdGlhbGl6ZWRfdmlhX3BlcHBlciA9IHRydWU7CisgIH0KKworICBpZiAocHA6OlBERjo6SXNPdXRPZlByb2Nlc3MocHA6Okluc3RhbmNlSGFuZGxlKGluc3RhbmNlKSkpCisgICAgcmV0dXJuIG5ldyBPdXRPZlByb2Nlc3NJbnN0YW5jZShpbnN0YW5jZSk7CisgIHJldHVybiBuZXcgSW5zdGFuY2UoaW5zdGFuY2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCitleHRlcm4gIkMiIHsKKworLy8gVE9ETyhzYW5qZWV2cik6IEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gcHJvdmlkZSBtb3JlIHN0YXRlZnVsIHdyYXBwZXJzIG92ZXIKKy8vIHRoZSBpbnRlcm5hbCBQREYgU0RLIChzdWNoIGFzIExvYWREb2N1bWVudCwgTG9hZFBhZ2UgZXRjKS4gRGV0ZXJtaW5lIGlmIHdlCisvLyBuZWVkIHRvIHByb3ZpZGUgdGhpcy4KKy8vIFdyYXBwZXIgZXhwb3J0cyBvdmVyIHRoZSBQREYgZW5naW5lIHRoYXQgY2FuIGJlIHVzZWQgYnkgYW4gZXh0ZXJuYWwgbW9kdWxlCisvLyBzdWNoIGFzIENocm9tZSAoc2luY2UgQ2hyb21lIGNhbm5vdCBkaXJlY3RseSBwdWxsIGluIFBERml1bSBzb3VyY2VzKS4KKyNpZiBkZWZpbmVkKE9TX1dJTikKKy8vIHxwZGZfYnVmZmVyfCBpcyB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBQREYgZG9jdW1lbnQgdG8gYmUKKy8vICAgICByZW5kZXJlZC4KKy8vIHxidWZmZXJfc2l6ZXwgaXMgdGhlIHNpemUgb2YgfHBkZl9idWZmZXJ8IGluIGJ5dGVzLgorLy8gfHBhZ2VfbnVtYmVyfCBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgcGFnZSB0byBiZSByZW5kZXJlZC4KKy8vIHxkY3wgaXMgdGhlIGRldmljZSBjb250ZXh0IHRvIHJlbmRlciBpbnRvLgorLy8gfGRwaV94fCBhbmQgfGRwaV95fCBhcmUgdGhlIHggYW5kIHkgcmVzb2x1dGlvbnMgcmVzcGVjdGl2ZWx5LiBJZiBlaXRoZXIKKy8vICAgICB2YWx1ZSBpcyAtMSwgdGhlIGRwaSBmcm9tIHRoZSBEQyB3aWxsIGJlIHVzZWQuCisvLyB8Ym91bmRzX29yaWdpbl94fCwgfGJvdW5kc19vcmlnaW5feXwsIHxib3VuZHNfd2lkdGh8IGFuZCB8Ym91bmRzX2hlaWdodHwKKy8vICAgICBzcGVjaWZ5IGEgYm91bmRzIHJlY3RhbmdsZSB3aXRoaW4gdGhlIERDIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgUERGCisvLyAgICAgcGFnZS4KKy8vIHxmaXRfdG9fYm91bmRzfCBzcGVjaWZpZXMgd2hldGhlciB0aGUgb3V0cHV0IHNob3VsZCBiZSBzaHJ1bmsgdG8gZml0IHRoZQorLy8gICAgIHN1cHBsaWVkIGJvdW5kcyBpZiB0aGUgcGFnZSBzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBib3VuZHMgaW4gYW55CisvLyAgICAgZGltZW5zaW9uLiBJZiB0aGlzIGlzIGZhbHNlLCBwYXJ0cyBvZiB0aGUgUERGIHBhZ2UgdGhhdCBsaWUgb3V0c2lkZQorLy8gICAgIHRoZSBib3VuZHMgd2lsbCBiZSBjbGlwcGVkLgorLy8gfHN0cmV0Y2hfdG9fYm91bmRzfCBzcGVjaWZpZXMgd2hldGhlciB0aGUgb3V0cHV0IHNob3VsZCBiZSBzdHJldGNoZWQgdG8gZml0CisvLyAgICAgdGhlIHN1cHBsaWVkIGJvdW5kcyBpZiB0aGUgcGFnZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgYm91bmRzIGluIGFueQorLy8gICAgIGRpbWVuc2lvbi4KKy8vIElmIGJvdGggfGZpdF90b19ib3VuZHN8IGFuZCB8c3RyZXRjaF90b19ib3VuZHN8IGFyZSB0cnVlLCB0aGVuCisvLyAgICAgfGZpdF90b19ib3VuZHN8IGlzIGhvbm9yZWQgZmlyc3QuCisvLyB8a2VlcF9hc3BlY3RfcmF0aW98IElmIGFueSBzY2FsaW5nIGlzIHRvIGJlIGRvbmUgaXMgdHJ1ZSwgdGhpcyBmbGFnCisvLyAgICAgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBvZiB0aGUgcGFnZSBzaG91bGQgYmUKKy8vICAgICBwcmVzZXJ2ZWQgd2hpbGUgc2NhbGluZy4KKy8vIHxjZW50ZXJfaW5fYm91bmRzfCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZmluYWwgaW1hZ2UgKGFmdGVyIGFueSBzY2FsaW5nIGlzCisvLyAgICAgZG9uZSkgc2hvdWxkIGJlIGNlbnRlcmVkIHdpdGhpbiB0aGUgZ2l2ZW4gYm91bmRzLgorLy8gfGF1dG9yb3RhdGV8IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBmaW5hbCBpbWFnZSBzaG91bGQgYmUgcm90YXRlZCB0byBtYXRjaAorLy8gICAgIHRoZSBvdXRwdXQgYm91bmQuCisvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb2N1bWVudCBvciB0aGUgcGFnZSBudW1iZXIgYXJlIG5vdCB2YWxpZC4KK1BQX0VYUE9SVCBib29sIFJlbmRlclBERlBhZ2VUb0RDKGNvbnN0IHZvaWQqIHBkZl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIREMgZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHBpX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHBpX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm91bmRzX29yaWdpbl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdW5kc19vcmlnaW5feSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3VuZHNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm91bmRzX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZml0X3RvX2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZXRjaF90b19ib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGtlZXBfYXNwZWN0X3JhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjZW50ZXJfaW5fYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvcm90YXRlKSB7CisgIGlmICghZ19zZGtfaW5pdGlhbGl6ZWRfdmlhX3BlcHBlcikgeworICAgIGlmICghY2hyb21lX3BkZjo6SW5pdGlhbGl6ZVNESyhnX2htb2R1bGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHNjb3BlZF9wdHI8Y2hyb21lX3BkZjo6UERGRW5naW5lRXhwb3J0cz4gZW5naW5lX2V4cG9ydHMoCisgICAgICBjaHJvbWVfcGRmOjpQREZFbmdpbmVFeHBvcnRzOjpDcmVhdGUoKSk7CisgIGNocm9tZV9wZGY6OlBERkVuZ2luZUV4cG9ydHM6OlJlbmRlcmluZ1NldHRpbmdzIHNldHRpbmdzKAorICAgICAgZHBpX3gsIGRwaV95LCBwcDo6UmVjdChib3VuZHNfb3JpZ2luX3gsIGJvdW5kc19vcmlnaW5feSwgYm91bmRzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNfaGVpZ2h0KSwKKyAgICAgIGZpdF90b19ib3VuZHMsIHN0cmV0Y2hfdG9fYm91bmRzLCBrZWVwX2FzcGVjdF9yYXRpbywgY2VudGVyX2luX2JvdW5kcywKKyAgICAgIGF1dG9yb3RhdGUpOworICBib29sIHJldCA9IGVuZ2luZV9leHBvcnRzLT5SZW5kZXJQREZQYWdlVG9EQyhwZGZfYnVmZmVyLCBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9udW1iZXIsIHNldHRpbmdzLCBkYyk7CisgIGlmICghZ19zZGtfaW5pdGlhbGl6ZWRfdmlhX3BlcHBlcikgeworICAgIGNocm9tZV9wZGY6OlNodXRkb3duU0RLKCk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmICAvLyBPU19XSU4KKworLy8gfHBhZ2VfY291bnR8IGFuZCB8bWF4X3BhZ2Vfd2lkdGh8IGFyZSBvcHRpb25hbCBhbmQgY2FuIGJlIE5VTEwuCisvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgdmFsaWQuCitQREZfVVNFRCBQUF9FWFBPUlQKK2Jvb2wgR2V0UERGRG9jSW5mbyhjb25zdCB2b2lkKiBwZGZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfc2l6ZSwgaW50KiBwYWdlX2NvdW50LAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWF4X3BhZ2Vfd2lkdGgpIHsKKyAgaWYgKCFnX3Nka19pbml0aWFsaXplZF92aWFfcGVwcGVyKSB7CisgICAgdm9pZCogZGF0YSA9IE5VTEw7CisjaWYgZGVmaW5lZChPU19XSU4pCisgICAgZGF0YSA9IGdfaG1vZHVsZTsKKyNlbmRpZgorICAgIGlmICghY2hyb21lX3BkZjo6SW5pdGlhbGl6ZVNESyhkYXRhKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzY29wZWRfcHRyPGNocm9tZV9wZGY6OlBERkVuZ2luZUV4cG9ydHM+IGVuZ2luZV9leHBvcnRzKAorICAgICAgY2hyb21lX3BkZjo6UERGRW5naW5lRXhwb3J0czo6Q3JlYXRlKCkpOworICBib29sIHJldCA9IGVuZ2luZV9leHBvcnRzLT5HZXRQREZEb2NJbmZvKAorICAgICAgcGRmX2J1ZmZlciwgYnVmZmVyX3NpemUsIHBhZ2VfY291bnQsIG1heF9wYWdlX3dpZHRoKTsKKyAgaWYgKCFnX3Nka19pbml0aWFsaXplZF92aWFfcGVwcGVyKSB7CisgICAgY2hyb21lX3BkZjo6U2h1dGRvd25TREsoKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBHZXRzIHRoZSBkaW1lbnNpb25zIG9mIGEgc3BlY2lmaWMgcGFnZSBpbiBhIGRvY3VtZW50LgorLy8gfHBkZl9idWZmZXJ8IGlzIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgZW50aXJlIFBERiBkb2N1bWVudCB0byBiZQorLy8gICAgIHJlbmRlcmVkLgorLy8gfHBkZl9idWZmZXJfc2l6ZXwgaXMgdGhlIHNpemUgb2YgfHBkZl9idWZmZXJ8IGluIGJ5dGVzLgorLy8gfHBhZ2VfbnVtYmVyfCBpcyB0aGUgcGFnZSBudW1iZXIgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIGRpbWVuc2lvbnMKKy8vICAgICBvZi4KKy8vIHx3aWR0aHwgaXMgdGhlIG91dHB1dCBmb3IgdGhlIHdpZHRoIG9mIHRoZSBwYWdlIGluIHBvaW50cy4KKy8vIHxoZWlnaHR8IGlzIHRoZSBvdXRwdXQgZm9yIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgaW4gcG9pbnRzLgorLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgZG9jdW1lbnQgb3IgdGhlIHBhZ2UgbnVtYmVyIGFyZSBub3QgdmFsaWQuCitQREZfVVNFRCBQUF9FWFBPUlQKK2Jvb2wgR2V0UERGUGFnZVNpemVCeUluZGV4KGNvbnN0IHZvaWQqIHBkZl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGRmX2J1ZmZlcl9zaXplLCBpbnQgcGFnZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpZHRoLCBkb3VibGUqIGhlaWdodCkgeworICBpZiAoIWdfc2RrX2luaXRpYWxpemVkX3ZpYV9wZXBwZXIpIHsKKyAgICB2b2lkKiBkYXRhID0gTlVMTDsKKyNpZiBkZWZpbmVkKE9TX1dJTikKKyAgICBkYXRhID0gZ19obW9kdWxlOworI2VuZGlmCisgICAgaWYgKCFjaHJvbWVfcGRmOjpJbml0aWFsaXplU0RLKGRhdGEpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNjb3BlZF9wdHI8Y2hyb21lX3BkZjo6UERGRW5naW5lRXhwb3J0cz4gZW5naW5lX2V4cG9ydHMoCisgICAgICBjaHJvbWVfcGRmOjpQREZFbmdpbmVFeHBvcnRzOjpDcmVhdGUoKSk7CisgIGJvb2wgcmV0ID0gZW5naW5lX2V4cG9ydHMtPkdldFBERlBhZ2VTaXplQnlJbmRleCgKKyAgICAgIHBkZl9idWZmZXIsIHBkZl9idWZmZXJfc2l6ZSwgcGFnZV9udW1iZXIsIHdpZHRoLCBoZWlnaHQpOworICBpZiAoIWdfc2RrX2luaXRpYWxpemVkX3ZpYV9wZXBwZXIpCisgICAgY2hyb21lX3BkZjo6U2h1dGRvd25TREsoKTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gUmVuZGVycyBQREYgcGFnZSBpbnRvIDQtYnl0ZSBwZXIgcGl4ZWwgQkdSQSBjb2xvciBiaXRtYXAuCisvLyB8cGRmX2J1ZmZlcnwgaXMgdGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgUERGIGRvY3VtZW50IHRvIGJlCisvLyAgICAgcmVuZGVyZWQuCisvLyB8cGRmX2J1ZmZlcl9zaXplfCBpcyB0aGUgc2l6ZSBvZiB8cGRmX2J1ZmZlcnwgaW4gYnl0ZXMuCisvLyB8cGFnZV9udW1iZXJ8IGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBwYWdlIHRvIGJlIHJlbmRlcmVkLgorLy8gfGJpdG1hcF9idWZmZXJ8IGlzIHRoZSBvdXRwdXQgYnVmZmVyIGZvciBiaXRtYXAuCisvLyB8Yml0bWFwX3dpZHRofCBpcyB0aGUgd2lkdGggb2YgdGhlIG91dHB1dCBiaXRtYXAuCisvLyB8Yml0bWFwX2hlaWdodHwgaXMgdGhlIGhlaWdodCBvZiB0aGUgb3V0cHV0IGJpdG1hcC4KKy8vIHxkcGl8IGlzIHRoZSByZXNvbHV0aW9ucy4KKy8vIHxhdXRvcm90YXRlfCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZmluYWwgaW1hZ2Ugc2hvdWxkIGJlIHJvdGF0ZWQgdG8gbWF0Y2gKKy8vICAgICB0aGUgb3V0cHV0IGJvdW5kLgorLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgZG9jdW1lbnQgb3IgdGhlIHBhZ2UgbnVtYmVyIGFyZSBub3QgdmFsaWQuCitQREZfVVNFRCBQUF9FWFBPUlQKK2Jvb2wgUmVuZGVyUERGUGFnZVRvQml0bWFwKGNvbnN0IHZvaWQqIHBkZl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGRmX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYml0bWFwX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9yb3RhdGUpIHsKKyAgaWYgKCFnX3Nka19pbml0aWFsaXplZF92aWFfcGVwcGVyKSB7CisgICAgdm9pZCogZGF0YSA9IE5VTEw7CisjaWYgZGVmaW5lZChPU19XSU4pCisgICAgZGF0YSA9IGdfaG1vZHVsZTsKKyNlbmRpZgorICAgIGlmICghY2hyb21lX3BkZjo6SW5pdGlhbGl6ZVNESyhkYXRhKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzY29wZWRfcHRyPGNocm9tZV9wZGY6OlBERkVuZ2luZUV4cG9ydHM+IGVuZ2luZV9leHBvcnRzKAorICAgICAgY2hyb21lX3BkZjo6UERGRW5naW5lRXhwb3J0czo6Q3JlYXRlKCkpOworICBjaHJvbWVfcGRmOjpQREZFbmdpbmVFeHBvcnRzOjpSZW5kZXJpbmdTZXR0aW5ncyBzZXR0aW5ncygKKyAgICAgIGRwaSwgZHBpLCBwcDo6UmVjdChiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQpLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwKKyAgICAgIGF1dG9yb3RhdGUpOworICBib29sIHJldCA9IGVuZ2luZV9leHBvcnRzLT5SZW5kZXJQREZQYWdlVG9CaXRtYXAoCisgICAgICBwZGZfYnVmZmVyLCBwZGZfYnVmZmVyX3NpemUsIHBhZ2VfbnVtYmVyLCBzZXR0aW5ncywgYml0bWFwX2J1ZmZlcik7CisgIGlmICghZ19zZGtfaW5pdGlhbGl6ZWRfdmlhX3BlcHBlcikgeworICAgIGNocm9tZV9wZGY6OlNodXRkb3duU0RLKCk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BkZi5kZWYgYi94ZmFfdGVzdC9wZGYvcGRmLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY5MThiCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3BkZi5kZWYKQEAgLTAsMCArMSw3IEBACitMSUJSQVJZIHBkZgorCitFWFBPUlRTCisgIE5QX0dldEVudHJ5UG9pbnRzICAgQDEKKyAgTlBfSW5pdGlhbGl6ZSAgICAgICBAMgorICBOUF9TaHV0ZG93biAgICAgICAgIEAzCisKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wZGYuZ3lwIGIveGZhX3Rlc3QvcGRmL3BkZi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlOGUzZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGYuZ3lwCkBAIC0wLDAgKzEsMjAwIEBACit7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ2Nocm9taXVtX2NvZGUnOiAxLAorICAgICdwZGZfZW5naW5lJSc6IDAsICAjIDAgUERGaXVtCisgIH0sCisgICd0YXJnZXRfZGVmYXVsdHMnOiB7CisgICAgJ2NmbGFncyc6IFsKKyAgICAgICctZlBJQycsCisgICAgXSwKKyAgfSwKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3BkZicsCisgICAgICAndHlwZSc6ICdsb2FkYWJsZV9tb2R1bGUnLAorICAgICAgJ21zdnNfZ3VpZCc6ICc2NDc4NjNDMC1DN0EzLTQ2OUEtQjFFRC1BRDcyODNDMzRCRUQnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJy4uL2Jhc2UvYmFzZS5neXA6YmFzZScsCisgICAgICAgICcuLi9uZXQvbmV0Lmd5cDpuZXQnLAorICAgICAgICAnLi4vcHBhcGkvcHBhcGkuZ3lwOnBwYXBpX2NwcCcsCisgICAgICAgICcuLi90aGlyZF9wYXJ0eS9wZGZpdW0vcGRmaXVtLmd5cDpwZGZpdW0nLAorICAgICAgXSwKKyAgICAgICd4Y29kZV9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ0lORk9QTElTVF9GSUxFJzogJ0luZm8ucGxpc3QnLAorICAgICAgfSwKKyAgICAgICdtYWNfZnJhbWV3b3JrX2RpcnMnOiBbCisgICAgICAgICckKFNES1JPT1QpL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3JrcycsCisgICAgICBdLAorICAgICAgJ2xkZmxhZ3MnOiBbICctTDwoUFJPRFVDVF9ESVIpJyxdLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdidXR0b24uaCcsCisgICAgICAgICdidXR0b24uY2MnLAorICAgICAgICAnY2h1bmtfc3RyZWFtLmgnLAorICAgICAgICAnY2h1bmtfc3RyZWFtLmNjJywKKyAgICAgICAgJ2NvbnRyb2wuaCcsCisgICAgICAgICdjb250cm9sLmNjJywKKyAgICAgICAgJ2RvY3VtZW50X2xvYWRlci5oJywKKyAgICAgICAgJ2RvY3VtZW50X2xvYWRlci5jYycsCisgICAgICAgICdkcmF3X3V0aWxzLmNjJywKKyAgICAgICAgJ2RyYXdfdXRpbHMuaCcsCisgICAgICAgICdmYWRpbmdfY29udHJvbC5jYycsCisgICAgICAgICdmYWRpbmdfY29udHJvbC5oJywKKyAgICAgICAgJ2ZhZGluZ19jb250cm9scy5jYycsCisgICAgICAgICdmYWRpbmdfY29udHJvbHMuaCcsCisgICAgICAgICdpbnN0YW5jZS5jYycsCisgICAgICAgICdpbnN0YW5jZS5oJywKKyAgICAgICAgJ251bWJlcl9pbWFnZV9nZW5lcmF0b3IuY2MnLAorICAgICAgICAnbnVtYmVyX2ltYWdlX2dlbmVyYXRvci5oJywKKyAgICAgICAgJ291dF9vZl9wcm9jZXNzX2luc3RhbmNlLmNjJywKKyAgICAgICAgJ291dF9vZl9wcm9jZXNzX2luc3RhbmNlLmgnLAorICAgICAgICAncGFnZV9pbmRpY2F0b3IuY2MnLAorICAgICAgICAncGFnZV9pbmRpY2F0b3IuaCcsCisgICAgICAgICdwYWludF9hZ2dyZWdhdG9yLmNjJywKKyAgICAgICAgJ3BhaW50X2FnZ3JlZ2F0b3IuaCcsCisgICAgICAgICdwYWludF9tYW5hZ2VyLmNjJywKKyAgICAgICAgJ3BhaW50X21hbmFnZXIuaCcsCisgICAgICAgICdwZGYuY2MnLAorICAgICAgICAncGRmLmgnLAorICAgICAgICAncGRmLnJjJywKKyAgICAgICAgJ3Byb2dyZXNzX2NvbnRyb2wuY2MnLAorICAgICAgICAncHJvZ3Jlc3NfY29udHJvbC5oJywKKyAgICAgICAgJ3BkZl9lbmdpbmUuaCcsCisgICAgICAgICdwcmV2aWV3X21vZGVfY2xpZW50LmNjJywKKyAgICAgICAgJ3ByZXZpZXdfbW9kZV9jbGllbnQuaCcsCisgICAgICAgICdyZXNvdXJjZS5oJywKKyAgICAgICAgJ3Jlc291cmNlX2NvbnN0cy5oJywKKyAgICAgICAgJ3RodW1ibmFpbF9jb250cm9sLmNjJywKKyAgICAgICAgJ3RodW1ibmFpbF9jb250cm9sLmgnLAorICAgICAgICAnLi4vY2hyb21lL2Jyb3dzZXIvY2hyb21lX3BhZ2Vfem9vbV9jb25zdGFudHMuY2MnLAorICAgICAgICAnLi4vY29udGVudC9jb21tb24vcGFnZV96b29tLmNjJywKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydwZGZfZW5naW5lPT0wJywgeworICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ3BkZml1bS9wZGZpdW1fYXNzZXJ0X21hdGNoaW5nX2VudW1zLmNjJywKKyAgICAgICAgICAgICdwZGZpdW0vcGRmaXVtX2VuZ2luZS5jYycsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9lbmdpbmUuaCcsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfcmVhZC5jYycsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfcmVhZC5oJywKKyAgICAgICAgICAgICdwZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV93cml0ZS5jYycsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfd3JpdGUuaCcsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9wYWdlLmNjJywKKyAgICAgICAgICAgICdwZGZpdW0vcGRmaXVtX3BhZ2UuaCcsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9yYW5nZS5jYycsCisgICAgICAgICAgICAncGRmaXVtL3BkZml1bV9yYW5nZS5oJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgICAgWydPUyE9IndpbiInLCB7CisgICAgICAgICAgJ3NvdXJjZXMhJzogWworICAgICAgICAgICAgJ3BkZi5yYycsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICAgIFsnT1M9PSJtYWMiJywgeworICAgICAgICAgICdtYWNfYnVuZGxlJzogMSwKKyAgICAgICAgICAncHJvZHVjdF9uYW1lJzogJ1BERicsCisgICAgICAgICAgJ3Byb2R1Y3RfZXh0ZW5zaW9uJzogJ3BsdWdpbicsCisgICAgICAgICAgIyBTdHJpcCB0aGUgc2hpcHBpbmcgYmluYXJ5IG9mIHN5bWJvbHMgc28gIkZveGl0IiBkb2Vzbid0IGFwcGVhciBpbgorICAgICAgICAgICMgdGhlIGJpbmFyeS4gIFN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIC5kU1lNLgorICAgICAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICAgICAnbWFjX3JlYWxfZHN5bSc6IDEsCisgICAgICAgICAgfSwKKyAgICAgICAgICAnc291cmNlcysnOiBbCisgICAgICAgICAgICAnSW5mby5wbGlzdCcKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgICAgWydPUz09IndpbiInLCB7CisgICAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgICAnQ09NUElMRV9DT05URU5UX1NUQVRJQ0FMTFknLAorICAgICAgICAgIF0sCisgICAgICAgICAgIyBUT0RPKGpzY2h1aCk6IGNyYnVnLmNvbS8xNjcxODcgZml4IHNpemVfdCB0byBpbnQgdHJ1bmNhdGlvbnMuCisgICAgICAgICAgJ21zdnNfZGlzYWJsZWRfd2FybmluZ3MnOiBbIDQyNjcsIF0sCisgICAgICAgIH1dLAorICAgICAgICBbJ09TPT0ibGludXgiJywgeworICAgICAgICAgICdjb25maWd1cmF0aW9ucyc6IHsKKyAgICAgICAgICAgICdSZWxlYXNlX0Jhc2UnOiB7CisgICAgICAgICAgICAgICMnY2ZsYWdzJzogWyAnLWZuby13ZWFrJyxdLCAgIyBnZXQgcmlkIG9mIHN5bWJvbHMgdGhhdCBzdHJpcCBkb2Vzbid0IHJlbW92ZS4KKyAgICAgICAgICAgICAgIyBEb24ndCBkbyB0aGlzIGZvciBub3cgc2luY2Ugb2ZmaWNpYWwgYnVpbGRlciB3aWxsIHRha2UgY2FyZSBvZiBpdC4gIFRoYXQKKyAgICAgICAgICAgICAgIyB3YXkgc3ltYm9scyBjYW4gc3RpbGwgYmUgdXBsb2FkZWQgdG8gdGhlIGNyYXNoIHNlcnZlci4KKyAgICAgICAgICAgICAgIydsZGZsYWdzJzogWyAnLXMnLF0sICAjIHN0cmlwIGxvY2FsIHN5bWJvbHMgZnJvbSBiaW5hcnkuCisgICAgICAgICAgICB9LAorICAgICAgICAgIH0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICB9LAorICBdLAorICAnY29uZGl0aW9ucyc6IFsKKyAgICAjIENyT1MgaGFzIGEgc2VwYXJhdGUgc3RlcCB0byBkbyB0aGlzLgorICAgIFsnT1M9PSJsaW51eCIgYW5kIGNocm9tZW9zPT0wJywKKyAgICAgIHsgJ3RhcmdldHMnOiBbCisgICAgICAgIHsKKyAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncGRmX2xpbnV4X3N5bWJvbHMnLAorICAgICAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICAgICAgWydsaW51eF9kdW1wX3N5bWJvbHM9PTEnLCB7CisgICAgICAgICAgICAgICdhY3Rpb25zJzogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdkdW1wX3N5bWJvbHMnLAorICAgICAgICAgICAgICAgICAgJ2lucHV0cyc6IFsKKyAgICAgICAgICAgICAgICAgICAgJzwoREVQVEgpL2J1aWxkL2xpbnV4L2R1bXBfYXBwX3N5bXMnLAorICAgICAgICAgICAgICAgICAgICAnPChQUk9EVUNUX0RJUikvZHVtcF9zeW1zJywKKyAgICAgICAgICAgICAgICAgICAgJzwoUFJPRFVDVF9ESVIpL2xpYnBkZi5zbycsCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgJ291dHB1dHMnOiBbCisgICAgICAgICAgICAgICAgICAgICc8KFBST0RVQ1RfRElSKS9saWJwZGYuc28uYnJlYWtwYWQuPCh0YXJnZXRfYXJjaCknLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICdhY3Rpb24nOiBbJzwoREVQVEgpL2J1aWxkL2xpbnV4L2R1bXBfYXBwX3N5bXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPChQUk9EVUNUX0RJUikvZHVtcF9zeW1zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwobGludXhfc3RyaXBfYmluYXJ5KScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8KFBST0RVQ1RfRElSKS9saWJwZGYuc28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPEAoX291dHB1dHMpJ10sCisgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6ICdEdW1waW5nIGJyZWFrcGFkIHN5bWJvbHMgdG8gPChfb3V0cHV0cyknLAorICAgICAgICAgICAgICAgICAgJ3Byb2Nlc3Nfb3V0cHV0c19hc19zb3VyY2VzJzogMSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgICAgICdwZGYnLAorICAgICAgICAgICAgICAgICcuLi9icmVha3BhZC9icmVha3BhZC5neXA6ZHVtcF9zeW1zJywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICBdLAorICAgIH0sXSwgICMgT1M9PSJsaW51eCIgYW5kIGNocm9tZW9zPT0wCisgICAgWydPUz09IndpbiIgYW5kIGZhc3RidWlsZD09MCBhbmQgdGFyZ2V0X2FyY2g9PSJpYTMyIiBhbmQgc3l6eWFzYW49PTEnLCB7CisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnZGVzdF9kaXInOiAnPChQUk9EVUNUX0RJUikvc3l6eWd5JywKKyAgICAgIH0sCisgICAgICAndGFyZ2V0cyc6IFsKKyAgICAgICAgeworICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdwZGZfc3l6eWFzYW4nLAorICAgICAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgICAgICdzb3VyY2VzJyA6IFtdLAorICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAncGRmJywKKyAgICAgICAgICBdLAorICAgICAgICAgICMgSW5zdHJ1bWVudCBQREZpdW0gd2l0aCBTeXp5QXNhbi4KKyAgICAgICAgICAnYWN0aW9ucyc6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ0luc3RydW1lbnQgUERGaXVtIHdpdGggU3l6eUFzYW4nLAorICAgICAgICAgICAgICAnaW5wdXRzJzogWworICAgICAgICAgICAgICAgICc8KFBST0RVQ1RfRElSKS9wZGYuZGxsJywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgJ291dHB1dHMnOiBbCisgICAgICAgICAgICAgICAgJzwoZGVzdF9kaXIpL3BkZi5kbGwnLAorICAgICAgICAgICAgICAgICc8KGRlc3RfZGlyKS9wZGYuZGxsLnBkYicsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICdhY3Rpb24nOiBbCisgICAgICAgICAgICAgICAgJ3B5dGhvbicsCisgICAgICAgICAgICAgICAgJzwoREVQVEgpL2Nocm9tZS90b29scy9idWlsZC93aW4vc3l6eWd5X2luc3RydW1lbnQucHknLAorICAgICAgICAgICAgICAgICctLW1vZGUnLCAnYXNhbicsCisgICAgICAgICAgICAgICAgJy0taW5wdXRfZXhlY3V0YWJsZScsICc8KFBST0RVQ1RfRElSKS9wZGYuZGxsJywKKyAgICAgICAgICAgICAgICAnLS1pbnB1dF9zeW1ib2wnLCAnPChQUk9EVUNUX0RJUikvcGRmLmRsbC5wZGInLAorICAgICAgICAgICAgICAgICctLWRlc3RpbmF0aW9uX2RpcicsICc8KGRlc3RfZGlyKScsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICBdLAorICAgIH1dLCAgIyBPUz09IndpbiIgYW5kIGZhc3RidWlsZD09MCBhbmQgdGFyZ2V0X2FyY2g9PSJpYTMyIiBhbmQgc3l6eWFzYW49PTEKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wZGYuaCBiL3hmYV90ZXN0L3BkZi9wZGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzk3YmJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3BkZi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BERl9IXworI2RlZmluZSBQREZfUERGX0hfCisKKyNpbmNsdWRlICJwcGFwaS9jcHAvbW9kdWxlLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgUERGTW9kdWxlIDogcHVibGljIHBwOjpNb2R1bGUgeworIHB1YmxpYzoKKyAgUERGTW9kdWxlKCk7CisgIHZpcnR1YWwgflBERk1vZHVsZSgpOworCisgIC8vIHBwOjpNb2R1bGUgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBJbml0KCk7CisgIHZpcnR1YWwgcHA6Okluc3RhbmNlKiBDcmVhdGVJbnN0YW5jZShQUF9JbnN0YW5jZSBpbnN0YW5jZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9QREZfSF8KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wZGYucmMgYi94ZmFfdGVzdC9wZGYvcGRmLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzk4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGRmLnJjCkBAIC0wLDAgKzEsMTA0IEBACisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0Lg0KKy8vDQorI2luY2x1ZGUgInJlc291cmNlLmgiDQorDQorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLg0KKy8vDQorI2luY2x1ZGUgImFmeHJlcy5oIg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkNCisjaWZkZWYgX1dJTjMyDQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMNCisjcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQ0KKyNlbmRpZiAvL19XSU4zMg0KKw0KKyNpZmRlZiBBUFNUVURJT19JTlZPS0VEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIFRFWFRJTkNMVURFDQorLy8NCisNCisxIFRFWFRJTkNMVURFIA0KK0JFR0lODQorICAgICJyZXNvdXJjZS5oXDAiDQorRU5EDQorDQorMiBURVhUSU5DTFVERSANCitCRUdJTg0KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKzMgVEVYVElOQ0xVREUgDQorQkVHSU4NCisgICAgIlxyXG4iDQorICAgICJcMCINCitFTkQNCisNCisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBWZXJzaW9uDQorLy8NCisNCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8NCisgRklMRVZFUlNJT04gMSwwLDAsMQ0KKyBQUk9EVUNUVkVSU0lPTiAxLDAsMCwxDQorIEZJTEVGTEFHU01BU0sgMHgxN0wNCisjaWZkZWYgX0RFQlVHDQorIEZJTEVGTEFHUyAweDFMDQorI2Vsc2UNCisgRklMRUZMQUdTIDB4MEwNCisjZW5kaWYNCisgRklMRU9TIDB4NEwNCisgRklMRVRZUEUgMHgyTA0KKyBGSUxFU1VCVFlQRSAweDBMDQorQkVHSU4NCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgICBCRUdJTg0KKyAgICAgICAgQkxPQ0sgIjA0MDkwNGU0Ig0KKyAgICAgICAgQkVHSU4NCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIkNocm9tZSBQREYgVmlld2VyIg0KKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLCAwLCAwLCAxIg0KKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAicGRmIg0KKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDIwMTAiDQorICAgICAgICAgICAgVkFMVUUgIk1JTUVUeXBlIiwgImFwcGxpY2F0aW9uL3BkZiINCisgICAgICAgICAgICBWQUxVRSAiRmlsZUV4dGVudHMiLCAicGRmIg0KKyAgICAgICAgICAgIFZBTFVFICJGaWxlT3Blbk5hbWUiLCAiQWNyb2JhdCBQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQiDQorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAicGRmLmRsbCINCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiQ2hyb21lIFBERiBWaWV3ZXIiDQorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjEsIDAsIDAsIDEiDQorICAgICAgICBFTkQNCisgICAgRU5EDQorICAgIEJMT0NLICJWYXJGaWxlSW5mbyINCisgICAgQkVHSU4NCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjUyDQorICAgIEVORA0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKw0KKw0KKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4NCisvLw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI2VuZGlmICAgIC8vIG5vdCBBUFNUVURJT19JTlZPS0VEDQorDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BkZl9lbmdpbmUuaCBiL3hmYV90ZXN0L3BkZi9wZGZfZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyNWEyOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGZfZW5naW5lLmgKQEAgLTAsMCArMSwzMjEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BERl9FTkdJTkVfSF8KKyNkZWZpbmUgUERGX1BERl9FTkdJTkVfSF8KKworI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChPU19XSU4pCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZzE2LmgiCisKKyNpbmNsdWRlICJwcGFwaS9jL2Rldi9wcF9jdXJzb3JfdHlwZV9kZXYuaCIKKyNpbmNsdWRlICJwcGFwaS9jL2Rldi9wcHBfcHJpbnRpbmdfZGV2LmgiCisjaW5jbHVkZSAicHBhcGkvYy9wcGJfaW5wdXRfZXZlbnQuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvY29tcGxldGlvbl9jYWxsYmFjay5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9pbWFnZV9kYXRhLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3JlY3QuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvc2l6ZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC91cmxfbG9hZGVyLmgiCisKK25hbWVzcGFjZSBwcCB7CitjbGFzcyBJbnB1dEV2ZW50OworfQorCitjb25zdCB1aW50MzIga0JhY2tncm91bmRDb2xvciA9IDB4RkZDQ0NDQ0M7CisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgU3RyZWFtOworCisjaWYgZGVmaW5lZChPU19NQUNPU1gpCitjb25zdCB1aW50MzIga0RlZmF1bHRLZXlNb2RpZmllciA9IFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfTUVUQUtFWTsKKyNlbHNlICAvLyAhT1NfTUFDT1NYCitjb25zdCB1aW50MzIga0RlZmF1bHRLZXlNb2RpZmllciA9IFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfQ09OVFJPTEtFWTsKKyNlbmRpZiAgLy8gT1NfTUFDT1NYCisKKy8vIERvIG9uZSB0aW1lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBTREsuICBkYXRhIGlzIHBsYXRmb3JtIHNwZWNpZmljLCBvbiBXaW5kb3dzCisvLyBpdCdzIHRoZSBpbnN0YW5jZSBvZiB0aGUgRExMIGFuZCBpdCdzIHVudXNlZCBvbiBvdGhlciBwbGF0Zm9ybXMuCitib29sIEluaXRpYWxpemVTREsodm9pZCogZGF0YSk7CisvLyBUZWxscyB0aGUgU0RLIHRoYXQgd2UncmUgc2h1dHRpbmcgZG93bi4KK3ZvaWQgU2h1dGRvd25TREsoKTsKKworLy8gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBQREYgcmVuZGVyaW5nIGVuZ2luZS4KK2NsYXNzIFBERkVuZ2luZSB7CisgcHVibGljOgorCisgIGVudW0gRG9jdW1lbnRQZXJtaXNzaW9uIHsKKyAgICBQRVJNSVNTSU9OX0NPUFksCisgICAgUEVSTUlTU0lPTl9DT1BZX0FDQ0VTU0lCTEUsCisgICAgUEVSTUlTU0lPTl9QUklOVF9MT1dfUVVBTElUWSwKKyAgICBQRVJNSVNTSU9OX1BSSU5UX0hJR0hfUVVBTElUWSwKKyAgfTsKKworICAvLyBUaGUgaW50ZXJmYWNlIHRoYXQncyBwcm92aWRlZCB0byB0aGUgcmVuZGVyaW5nIGVuZ2luZS4KKyAgY2xhc3MgQ2xpZW50IHsKKyAgIHB1YmxpYzoKKyAgICAvLyBJbmZvcm1zIHRoZSBjbGllbnQgYWJvdXQgdGhlIGRvY3VtZW50J3Mgc2l6ZSBpbiBwaXhlbHMuCisgICAgdmlydHVhbCB2b2lkIERvY3VtZW50U2l6ZVVwZGF0ZWQoY29uc3QgcHA6OlNpemUmIHNpemUpID0gMDsKKworICAgIC8vIEluZm9ybXMgdGhlIGNsaWVudCB0aGF0IHRoZSBnaXZlbiByZWN0IG5lZWRzIHRvIGJlIHJlcGFpbnRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZShjb25zdCBwcDo6UmVjdCYgcmVjdCkgPSAwOworCisgICAgLy8gSW5mb3JtcyB0aGUgY2xpZW50IHRvIHNjcm9sbCB0aGUgcGx1Z2luIGFyZWEgYnkgdGhlIGdpdmVuIG9mZnNldC4KKyAgICB2aXJ0dWFsIHZvaWQgU2Nyb2xsKGNvbnN0IHBwOjpQb2ludCYgcG9pbnQpID0gMDsKKworICAgIC8vIFNjcm9sbCB0aGUgaG9yaXpvbnRhbC92ZXJ0aWNhbCBzY3JvbGxiYXJzIHRvIGEgZ2l2ZW4gcG9zaXRpb24uCisgICAgdmlydHVhbCB2b2lkIFNjcm9sbFRvWChpbnQgcG9zaXRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgU2Nyb2xsVG9ZKGludCBwb3NpdGlvbikgPSAwOworCisgICAgLy8gU2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgcGFnZS4KKyAgICB2aXJ0dWFsIHZvaWQgU2Nyb2xsVG9QYWdlKGludCBwYWdlKSA9IDA7CisKKyAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgZ2l2ZW4gdXJsLgorICAgIHZpcnR1YWwgdm9pZCBOYXZpZ2F0ZVRvKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsIGJvb2wgb3Blbl9pbl9uZXdfdGFiKSA9IDA7CisKKyAgICAvLyBVcGRhdGVzIHRoZSBjdXJzb3IuCisgICAgdmlydHVhbCB2b2lkIFVwZGF0ZUN1cnNvcihQUF9DdXJzb3JUeXBlX0RldiBjdXJzb3IpID0gMDsKKworICAgIC8vIFVwZGF0ZXMgdGhlIHRpY2sgbWFya3MgaW4gdGhlIHZlcnRpY2FsIHNjcm9sbGJhci4KKyAgICB2aXJ0dWFsIHZvaWQgVXBkYXRlVGlja01hcmtzKGNvbnN0IHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiYgdGlja21hcmtzKSA9IDA7CisKKyAgICAvLyBVcGRhdGVzIHRoZSBudW1iZXIgb2YgZmluZCByZXN1bHRzIGZvciB0aGUgY3VycmVudCBzZWFyY2ggdGVybS4gIElmCisgICAgLy8gdGhlcmUgYXJlIG5vIG1hdGNoZXMgMCBzaG91bGQgYmUgcGFzc2VkIGluLiAgT25seSB3aGVuIHRoZSBwbHVnaW4gaGFzCisgICAgLy8gZmluaXNoZWQgc2VhcmNoaW5nIHNob3VsZCBpdCBwYXNzIGluIHRoZSBmaW5hbCBjb3VudCB3aXRoIGZpbmFsX3Jlc3VsdAorICAgIC8vIHNldCB0byB0cnVlLgorICAgIHZpcnR1YWwgdm9pZCBOb3RpZnlOdW1iZXJPZkZpbmRSZXN1bHRzQ2hhbmdlZChpbnQgdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmluYWxfcmVzdWx0KSA9IDA7CisKKyAgICAvLyBVcGRhdGVzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNlYXJjaCBpdGVtLgorICAgIHZpcnR1YWwgdm9pZCBOb3RpZnlTZWxlY3RlZEZpbmRSZXN1bHRDaGFuZ2VkKGludCBjdXJyZW50X2ZpbmRfaW5kZXgpID0gMDsKKworICAgIC8vIFByb21wdHMgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQgdG8gb3BlbiB0aGlzIGRvY3VtZW50LiBUaGUgY2FsbGJhY2sgaXMKKyAgICAvLyBjYWxsZWQgd2hlbiB0aGUgcGFzc3dvcmQgaXMgcmV0cmlldmVkLgorICAgIHZpcnR1YWwgdm9pZCBHZXREb2N1bWVudFBhc3N3b3JkKAorICAgICAgICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrV2l0aE91dHB1dDxwcDo6VmFyPiBjYWxsYmFjaykgPSAwOworCisgICAgLy8gUHV0cyB1cCBhbiBhbGVydCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgIHZpcnR1YWwgdm9pZCBBbGVydChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgPSAwOworCisgICAgLy8gUHV0cyB1cCBhIGNvbmZpcm0gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlcgorICAgIC8vIHByZXNzZXMgT0ssIG9yIGZhbHNlIGlmIHRoZXkgcHJlc3MgY2FuY2VsLgorICAgIHZpcnR1YWwgYm9vbCBDb25maXJtKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA9IDA7CisKKyAgICAvLyBQdXRzIHVwIGEgcHJvbXB0IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGRlZmF1bHQgYW5zd2VyIGFuZCByZXR1cm5zCisgICAgLy8gdGhlIGFuc3dlci4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByb21wdChjb25zdCBzdGQ6OnN0cmluZyYgcXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfYW5zd2VyKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSB1cmwgb2YgdGhlIHBkZi4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFVSTCgpID0gMDsKKworICAgIC8vIFNlbmQgYW4gZW1haWwuCisgICAgdmlydHVhbCB2b2lkIEVtYWlsKGNvbnN0IHN0ZDo6c3RyaW5nJiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJvZHkpID0gMDsKKyAgICAvLyBQdXQgdXAgdGhlIHByaW50IGRpYWxvZy4KKyAgICB2aXJ0dWFsIHZvaWQgUHJpbnQoKSA9IDA7CisKKyAgICAvLyBTdWJtaXQgdGhlIGRhdGEgdXNpbmcgSFRUUCBQT1NULgorICAgIHZpcnR1YWwgdm9pZCBTdWJtaXRGb3JtKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSA9IDA7CisKKyAgICAvLyBQb3BzIHVwIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBTaG93RmlsZVNlbGVjdGlvbkRpYWxvZygpID0gMDsKKworICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgbmV3IFVSTCBsb2FkZXIgZm9yIHBhcnRpYWwgZG9jdW1lbnQgcmVxdWVzdHMuCisgICAgdmlydHVhbCBwcDo6VVJMTG9hZGVyIENyZWF0ZVVSTExvYWRlcigpID0gMDsKKworICAgIC8vIENhbGxzIHRoZSBjbGllbnQncyBPbkNhbGxiYWNrKCkgZnVuY3Rpb24gaW4gZGVsYXlfaW5fbXMgd2l0aCB0aGUgZ2l2ZW4KKyAgICAvLyBpZC4KKyAgICB2aXJ0dWFsIHZvaWQgU2NoZWR1bGVDYWxsYmFjayhpbnQgaWQsIGludCBkZWxheV9pbl9tcykgPSAwOworCisgICAgLy8gU2VhcmNoZXMgdGhlIGdpdmVuIHN0cmluZyBmb3IgInRlcm0iIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLiAgVW5pY29kZS0KKyAgICAvLyBhd2FyZS4KKyAgICBzdHJ1Y3QgU2VhcmNoU3RyaW5nUmVzdWx0IHsKKyAgICAgIGludCBzdGFydF9pbmRleDsKKyAgICAgIGludCBsZW5ndGg7CisgICAgfTsKKyAgICB2aXJ0dWFsIHZvaWQgU2VhcmNoU3RyaW5nKGNvbnN0IGJhc2U6OmNoYXIxNiogc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Y2hhcjE2KiB0ZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNlYXJjaFN0cmluZ1Jlc3VsdD4qIHJlc3VsdHMpID0gMDsKKworICAgIC8vIE5vdGlmaWVzIHRoZSBjbGllbnQgdGhhdCB0aGUgZW5naW5lIGhhcyBwYWludGVkIGEgcGFnZSBmcm9tIHRoZSBkb2N1bWVudC4KKyAgICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRQYWludE9jY3VycmVkKCkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIGNsaWVudCB0aGF0IHRoZSBkb2N1bWVudCBoYXMgZmluaXNoZWQgbG9hZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkQ29tcGxldGUoaW50IHBhZ2VfY291bnQpID0gMDsKKworICAgIC8vIE5vdGlmaWVzIHRoZSBjbGllbnQgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGZhaWxlZCB0byBsb2FkLgorICAgIHZpcnR1YWwgdm9pZCBEb2N1bWVudExvYWRGYWlsZWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHBwOjpJbnN0YW5jZSogR2V0UGx1Z2luSW5zdGFuY2UoKSA9IDA7CisKKyAgICAvLyBOb3RpZmllcyB0aGF0IGFuIHVuc3VwcG9ydGVkIGZlYXR1cmUgaW4gdGhlIFBERiB3YXMgZW5jb3VudGVyZWQuCisgICAgdmlydHVhbCB2b2lkIERvY3VtZW50SGFzVW5zdXBwb3J0ZWRGZWF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmZWF0dXJlKSA9IDA7CisKKyAgICAvLyBOb3RpZmllcyB0aGUgY2xpZW50IGFib3V0IGRvY3VtZW50IGxvYWQgcHJvZ3Jlc3MuCisgICAgdmlydHVhbCB2b2lkIERvY3VtZW50TG9hZFByb2dyZXNzKHVpbnQzMiBhdmFpbGFibGUsIHVpbnQzMiBkb2Nfc2l6ZSkgPSAwOworCisgICAgLy8gTm90aWZpZXMgdGhlIGNsaWVudCBhYm91dCBmb2N1cyBjaGFuZ2VzIGZvciBmb3JtIHRleHQgZmllbGRzLgorICAgIHZpcnR1YWwgdm9pZCBGb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoYm9vbCBpbl9mb2N1cykgPSAwOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwbHVnaW4gaGFzIGJlZW4gb3BlbmVkIHdpdGhpbiBwcmludCBwcmV2aWV3LgorICAgIHZpcnR1YWwgYm9vbCBJc1ByaW50UHJldmlldygpID0gMDsKKyAgfTsKKworICAvLyBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBERiBFbmdpbmUuCisgIHN0YXRpYyBQREZFbmdpbmUqIENyZWF0ZShDbGllbnQqIGNsaWVudCk7CisKKyAgdmlydHVhbCB+UERGRW5naW5lKCkge30KKyAgLy8gTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIFBlcHBlciBmdW5jdGlvbnMgb2YgdGhlIHNhbWUKKyAgLy8gbmFtZSwgc28gbm90IHJlcGVhdGluZyB0aGUgZGVzY3JpcHRpb24gaGVyZSB1bmxlc3MgaXQncyBkaWZmZXJlbnQuCisgIHZpcnR1YWwgYm9vbCBOZXcoY29uc3QgY2hhciogdXJsKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBOZXcoY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGhlYWRlcnMpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBhZ2VPZmZzZXRVcGRhdGVkKGNvbnN0IHBwOjpQb2ludCYgcGFnZV9vZmZzZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBsdWdpblNpemVVcGRhdGVkKGNvbnN0IHBwOjpTaXplJiBzaXplKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxlZFRvWFBvc2l0aW9uKGludCBwb3NpdGlvbikgPSAwOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsZWRUb1lQb3NpdGlvbihpbnQgcG9zaXRpb24pID0gMDsKKyAgLy8gUGFpbnQgaXMgY2FsbGVkIGEgc2VyaWVzIG9mIHRpbWVzLiBCZWZvcmUgdGhlc2UgbiBjYWxscyBhcmUgbWFkZSwgUHJlUGFpbnQKKyAgLy8gaXMgY2FsbGVkIG9uY2UuIEFmdGVyIFBhaW50IGlzIGNhbGxlZCBuIHRpbWVzLCBQb3N0UGFpbnQgaXMgY2FsbGVkIG9uY2UuCisgIHZpcnR1YWwgdm9pZCBQcmVQYWludCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBhaW50KGNvbnN0IHBwOjpSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiogcmVhZHksCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIHBlbmRpbmcpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBvc3RQYWludCgpID0gMDsKKyAgdmlydHVhbCBib29sIEhhbmRsZURvY3VtZW50TG9hZChjb25zdCBwcDo6VVJMTG9hZGVyJiBsb2FkZXIpID0gMDsKKyAgdmlydHVhbCBib29sIEhhbmRsZUV2ZW50KGNvbnN0IHBwOjpJbnB1dEV2ZW50JiBldmVudCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IFF1ZXJ5U3VwcG9ydGVkUHJpbnRPdXRwdXRGb3JtYXRzKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUHJpbnRCZWdpbigpID0gMDsKKyAgdmlydHVhbCBwcDo6UmVzb3VyY2UgUHJpbnRQYWdlcygKKyAgICAgIGNvbnN0IFBQX1ByaW50UGFnZU51bWJlclJhbmdlX0RldiogcGFnZV9yYW5nZXMsCisgICAgICB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50LAorICAgICAgY29uc3QgUFBfUHJpbnRTZXR0aW5nc19EZXYmIHByaW50X3NldHRpbmdzKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBQcmludEVuZCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFN0YXJ0RmluZChjb25zdCBjaGFyKiB0ZXh0LCBib29sIGNhc2Vfc2Vuc2l0aXZlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBTZWxlY3RGaW5kUmVzdWx0KGJvb2wgZm9yd2FyZCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU3RvcEZpbmQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBab29tVXBkYXRlZChkb3VibGUgbmV3X3pvb21fbGV2ZWwpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJvdGF0ZUNsb2Nrd2lzZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJvdGF0ZUNvdW50ZXJjbG9ja3dpc2UoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U2VsZWN0ZWRUZXh0KCkgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldExpbmtBdFBvc2l0aW9uKGNvbnN0IHBwOjpQb2ludCYgcG9pbnQpID0gMDsKKyAgdmlydHVhbCBib29sIElzU2VsZWN0aW5nKCkgPSAwOworICAvLyBDaGVja3MgdGhlIHBlcm1pc3Npb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LgorICB2aXJ0dWFsIGJvb2wgSGFzUGVybWlzc2lvbihEb2N1bWVudFBlcm1pc3Npb24gcGVybWlzc2lvbikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2VsZWN0QWxsKCkgPSAwOworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LgorICB2aXJ0dWFsIGludCBHZXROdW1iZXJPZlBhZ2VzKCkgPSAwOworICAvLyBHZXRzIHRoZSAwLWJhc2VkIHBhZ2UgbnVtYmVyIG9mIHxkZXN0aW5hdGlvbnwsIG9yIC0xIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICB2aXJ0dWFsIGludCBHZXROYW1lZERlc3RpbmF0aW9uUGFnZShjb25zdCBzdGQ6OnN0cmluZyYgZGVzdGluYXRpb24pID0gMDsKKyAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHZpc2libGUgcGFnZSwgb3IgLTEgaWYgbm9uZSBhcmUgdmlzaWJsZS4KKyAgdmlydHVhbCBpbnQgR2V0Rmlyc3RWaXNpYmxlUGFnZSgpID0gMDsKKyAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIG1vc3QgdmlzaWJsZSBwYWdlLCBvciAtMSBpZiBub25lIGFyZSB2aXNpYmxlLgorICB2aXJ0dWFsIGludCBHZXRNb3N0VmlzaWJsZVBhZ2UoKSA9IDA7CisgIC8vIEdldHMgdGhlIHJlY3RhbmdsZSBvZiB0aGUgcGFnZSBpbmNsdWRpbmcgc2hhZG93LgorICB2aXJ0dWFsIHBwOjpSZWN0IEdldFBhZ2VSZWN0KGludCBpbmRleCkgPSAwOworICAvLyBHZXRzIHRoZSByZWN0YW5nbGUgb2YgdGhlIHBhZ2UgZXhjbHVkaW5nIGFueSBhZGRpdGlvbmFsIGFyZWFzLgorICB2aXJ0dWFsIHBwOjpSZWN0IEdldFBhZ2VDb250ZW50c1JlY3QoaW50IGluZGV4KSA9IDA7CisgIC8vIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIGZyb20gdGhlIHRvcCBpbiBkb2N1bWVudAorICAvLyBjb29yZGluYXRlcy4KKyAgdmlydHVhbCBpbnQgR2V0VmVydGljYWxTY3JvbGxiYXJZUG9zaXRpb24oKSA9IDA7CisgIC8vIFBhaW50cyBwYWdlIHRodW1ibmFpbCB0byB0aGUgSW1hZ2VEYXRhLgorICB2aXJ0dWFsIHZvaWQgUGFpbnRUaHVtYm5haWwocHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwgaW50IGluZGV4KSA9IDA7CisgIC8vIFNldCBjb2xvciAvIGdyYXlzY2FsZSByZW5kZXJpbmcgbW9kZXMuCisgIHZpcnR1YWwgdm9pZCBTZXRHcmF5c2NhbGUoYm9vbCBncmF5c2NhbGUpID0gMDsKKyAgLy8gQ2FsbGJhY2sgZm9yIHRpbWVyIHRoYXQncyBzZXQgd2l0aCBTY2hlZHVsZUNhbGxiYWNrKCkuCisgIHZpcnR1YWwgdm9pZCBPbkNhbGxiYWNrKGludCBpZCkgPSAwOworICAvLyBHZXRzIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQREYgZmlsZQorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFBhZ2VBc0pTT04oaW50IGluZGV4KSA9IDA7CisgIC8vIEdldHMgdGhlIFBERiBkb2N1bWVudCdzIHByaW50IHNjYWxpbmcgcHJlZmVyZW5jZS4gVHJ1ZSBpZiB0aGUgZG9jdW1lbnQgY2FuCisgIC8vIGJlIHNjYWxlZCB0byBmaXQuCisgIHZpcnR1YWwgYm9vbCBHZXRQcmludFNjYWxpbmcoKSA9IDA7CisKKyAgLy8gQXBwZW5kIGJsYW5rIHBhZ2VzIHRvIG1ha2UgYSAxLXBhZ2UgZG9jdW1lbnQgdG8gYSB8bnVtX3BhZ2VzfCBkb2N1bWVudC4KKyAgLy8gQWx3YXlzIHJldGFpbiB0aGUgZmlyc3QgcGFnZSBkYXRhLgorICB2aXJ0dWFsIHZvaWQgQXBwZW5kQmxhbmtQYWdlcyhpbnQgbnVtX3BhZ2VzKSA9IDA7CisgIC8vIEFwcGVuZCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnQgbG9hZGVkIHdpdGggdGhlIHxlbmdpbmV8IHRvIHRoaXMKKyAgLy8gZG9jdW1lbnQgYXQgcGFnZSB8aW5kZXh8LgorICB2aXJ0dWFsIHZvaWQgQXBwZW5kUGFnZShQREZFbmdpbmUqIGVuZ2luZSwgaW50IGluZGV4KSA9IDA7CisKKyAgLy8gQWxsb3cgY2xpZW50IHRvIHF1ZXJ5IGFuZCByZXNldCBzY3JvbGwgcG9zaXRpb25zIGluIGRvY3VtZW50IGNvb3JkaW5hdGVzLgorICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBtZWFudCBmb3IgY2FzZXMgd2hlcmUgdGhlIGRldmljZSBzY2FsZSBmYWN0b3IgY2hhbmdlcywKKyAgLy8gYW5kIG5vdCBmb3IgZ2VuZXJhbCBzY3JvbGxpbmcgLSB0aGUgZW5naW5lIHdpbGwgbm90IHJlcGFpbnQgZHVlIHRvIHRoaXMuCisgIHZpcnR1YWwgcHA6OlBvaW50IEdldFNjcm9sbFBvc2l0aW9uKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0U2Nyb2xsUG9zaXRpb24oY29uc3QgcHA6OlBvaW50JiBwb3NpdGlvbikgPSAwOworCisgIHZpcnR1YWwgYm9vbCBJc1Byb2dyZXNzaXZlTG9hZCgpID0gMDsKK307CisKKy8vIEludGVyZmFjZSBmb3IgZXhwb3J0cyB0aGF0IHdyYXAgdGhlIFBERiBlbmdpbmUuCitjbGFzcyBQREZFbmdpbmVFeHBvcnRzIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBSZW5kZXJpbmdTZXR0aW5ncyB7CisgICBSZW5kZXJpbmdTZXR0aW5ncyhpbnQgZHBpX3gsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZHBpX3ksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBmaXRfdG9fYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJldGNoX3RvX2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wga2VlcF9hc3BlY3RfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICBib29sIGNlbnRlcl9pbl9ib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9yb3RhdGUpCisgICAgICA6IGRwaV94KGRwaV94KSwgZHBpX3koZHBpX3kpLCBib3VuZHMoYm91bmRzKSwKKyAgICAgICAgZml0X3RvX2JvdW5kcyhmaXRfdG9fYm91bmRzKSwgc3RyZXRjaF90b19ib3VuZHMoc3RyZXRjaF90b19ib3VuZHMpLAorICAgICAgICBrZWVwX2FzcGVjdF9yYXRpbyhrZWVwX2FzcGVjdF9yYXRpbyksCisgICAgICAgIGNlbnRlcl9pbl9ib3VuZHMoY2VudGVyX2luX2JvdW5kcyksIGF1dG9yb3RhdGUoYXV0b3JvdGF0ZSkgeworICAgIH0KKyAgICBpbnQgZHBpX3g7CisgICAgaW50IGRwaV95OworICAgIHBwOjpSZWN0IGJvdW5kczsKKyAgICBib29sIGZpdF90b19ib3VuZHM7CisgICAgYm9vbCBzdHJldGNoX3RvX2JvdW5kczsKKyAgICBib29sIGtlZXBfYXNwZWN0X3JhdGlvOworICAgIGJvb2wgY2VudGVyX2luX2JvdW5kczsKKyAgICBib29sIGF1dG9yb3RhdGU7CisgIH07CisKKyAgUERGRW5naW5lRXhwb3J0cygpIHt9CisgIHZpcnR1YWwgflBERkVuZ2luZUV4cG9ydHMoKSB7fQorICBzdGF0aWMgUERGRW5naW5lRXhwb3J0cyogQ3JlYXRlKCk7CisjaWYgZGVmaW5lZChPU19XSU4pCisgIC8vIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBSZW5kZXJQREZQYWdlVG9EQyBpbiBwZGYuY2MgZm9yIGRldGFpbHMuCisgIHZpcnR1YWwgYm9vbCBSZW5kZXJQREZQYWdlVG9EQyhjb25zdCB2b2lkKiBwZGZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyaW5nU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDIGRjKSA9IDA7CisjZW5kaWYgIC8vIE9TX1dJTgorICAvLyBTZWUgdGhlIGRlZmluaXRpb24gb2YgUmVuZGVyUERGUGFnZVRvQml0bWFwIGluIHBkZi5jYyBmb3IgZGV0YWlscy4KKyAgdmlydHVhbCBib29sIFJlbmRlclBERlBhZ2VUb0JpdG1hcChjb25zdCB2b2lkKiBwZGZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZGZfYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlcmluZ1NldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBiaXRtYXBfYnVmZmVyKSA9IDA7CisKKyAgdmlydHVhbCBib29sIEdldFBERkRvY0luZm8oY29uc3Qgdm9pZCogcGRmX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhZ2VfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWF4X3BhZ2Vfd2lkdGgpID0gMDsKKworICAvLyBTZWUgdGhlIGRlZmluaXRpb24gb2YgR2V0UERGUGFnZVNpemVCeUluZGV4IGluIHBkZi5jYyBmb3IgZGV0YWlscy4KKyAgdmlydHVhbCBib29sIEdldFBERlBhZ2VTaXplQnlJbmRleChjb25zdCB2b2lkKiBwZGZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZGZfYnVmZmVyX3NpemUsIGludCBwYWdlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpZHRoLCBkb3VibGUqIGhlaWdodCkgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmICAvLyBQREZfUERGX0VOR0lORV9IXwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fYXNzZXJ0X21hdGNoaW5nX2VudW1zLmNjIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fYXNzZXJ0X21hdGNoaW5nX2VudW1zLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTQwY2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9hc3NlcnRfbWF0Y2hpbmdfZW51bXMuY2MKQEAgLTAsMCArMSwyMDcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJwcGFwaS9jL3BwX2lucHV0X2V2ZW50LmgiCisjaW5jbHVkZSAicHBhcGkvYy9wcml2YXRlL3BwYl9wZGYuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZfZndsZXZlbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZfc3lzZm9udGluZm8uaCIKKyNpbmNsdWRlICJ1aS9ldmVudHMva2V5Y29kZXMva2V5Ym9hcmRfY29kZXMuaCIKKworI2RlZmluZSBDT01QSUxFX0FTU0VSVF9NQVRDSChucF9uYW1lLCBwZGZpdW1fbmFtZSkgXAorICAgIENPTVBJTEVfQVNTRVJUKGludChucF9uYW1lKSA9PSBpbnQocGRmaXVtX25hbWUpLCBtaXNtYXRjaGluZ19lbnVtcykKKworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfSU5QVVRFVkVOVF9NT0RJRklFUl9TSElGVEtFWSwgRldMX0VWRU5URkxBR19TaGlmdEtleSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSChQUF9JTlBVVEVWRU5UX01PRElGSUVSX0NPTlRST0xLRVksCisgICAgICAgICAgICAgICAgICAgICBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpOworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfSU5QVVRFVkVOVF9NT0RJRklFUl9BTFRLRVksIEZXTF9FVkVOVEZMQUdfQWx0S2V5KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfTUVUQUtFWSwgRldMX0VWRU5URkxBR19NZXRhS2V5KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfSVNLRVlQQUQsIEZXTF9FVkVOVEZMQUdfS2V5UGFkKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfSVNBVVRPUkVQRUFULAorICAgICAgICAgICAgICAgICAgICAgRldMX0VWRU5URkxBR19BdXRvUmVwZWF0KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfTEVGVEJVVFRPTkRPV04sCisgICAgICAgICAgICAgICAgICAgICBGV0xfRVZFTlRGTEFHX0xlZnRCdXR0b25Eb3duKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKFBQX0lOUFVURVZFTlRfTU9ESUZJRVJfTUlERExFQlVUVE9ORE9XTiwKKyAgICAgICAgICAgICAgICAgICAgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93bik7CitDT01QSUxFX0FTU0VSVF9NQVRDSChQUF9JTlBVVEVWRU5UX01PRElGSUVSX1JJR0hUQlVUVE9ORE9XTiwKKyAgICAgICAgICAgICAgICAgICAgIEZXTF9FVkVOVEZMQUdfUmlnaHRCdXR0b25Eb3duKTsKKworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfQkFDSywgRldMX1ZLRVlfQmFjayk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9UQUIsIEZXTF9WS0VZX1RhYik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9DTEVBUiwgRldMX1ZLRVlfQ2xlYXIpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfUkVUVVJOLCBGV0xfVktFWV9SZXR1cm4pOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfU0hJRlQsIEZXTF9WS0VZX1NoaWZ0KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0NPTlRST0wsIEZXTF9WS0VZX0NvbnRyb2wpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTUVOVSwgRldMX1ZLRVlfTWVudSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9QQVVTRSwgRldMX1ZLRVlfUGF1c2UpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfQ0FQSVRBTCwgRldMX1ZLRVlfQ2FwaXRhbCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9LQU5BLCBGV0xfVktFWV9LYW5hKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0hBTkdVTCwgRldMX1ZLRVlfSGFuZ3VsKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0pVTkpBLCBGV0xfVktFWV9KdW5qYSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GSU5BTCwgRldMX1ZLRVlfRmluYWwpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfSEFOSkEsIEZXTF9WS0VZX0hhbmphKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0tBTkpJLCBGV0xfVktFWV9LYW5qaSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9FU0NBUEUsIEZXTF9WS0VZX0VzY2FwZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9DT05WRVJULCBGV0xfVktFWV9Db252ZXJ0KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX05PTkNPTlZFUlQsIEZXTF9WS0VZX05vbkNvbnZlcnQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfQUNDRVBULCBGV0xfVktFWV9BY2NlcHQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTU9ERUNIQU5HRSwgRldMX1ZLRVlfTW9kZUNoYW5nZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9TUEFDRSwgRldMX1ZLRVlfU3BhY2UpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfUFJJT1IsIEZXTF9WS0VZX1ByaW9yKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX05FWFQsIEZXTF9WS0VZX05leHQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRU5ELCBGV0xfVktFWV9FbmQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfSE9NRSwgRldMX1ZLRVlfSG9tZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9MRUZULCBGV0xfVktFWV9MZWZ0KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1VQLCBGV0xfVktFWV9VcCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9SSUdIVCwgRldMX1ZLRVlfUmlnaHQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRE9XTiwgRldMX1ZLRVlfRG93bik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9TRUxFQ1QsIEZXTF9WS0VZX1NlbGVjdCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9QUklOVCwgRldMX1ZLRVlfUHJpbnQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRVhFQ1VURSwgRldMX1ZLRVlfRXhlY3V0ZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9TTkFQU0hPVCwgRldMX1ZLRVlfU25hcHNob3QpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfSU5TRVJULCBGV0xfVktFWV9JbnNlcnQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfREVMRVRFLCBGV0xfVktFWV9EZWxldGUpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfSEVMUCwgRldMX1ZLRVlfSGVscCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV8wLCBGV0xfVktFWV8wKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZXzEsIEZXTF9WS0VZXzEpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfMiwgRldMX1ZLRVlfMik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV8zLCBGV0xfVktFWV8zKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZXzQsIEZXTF9WS0VZXzQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfNSwgRldMX1ZLRVlfNSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV82LCBGV0xfVktFWV82KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZXzcsIEZXTF9WS0VZXzcpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfOCwgRldMX1ZLRVlfOCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV85LCBGV0xfVktFWV85KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0EsIEZXTF9WS0VZX0EpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfQiwgRldMX1ZLRVlfQik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9DLCBGV0xfVktFWV9DKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0QsIEZXTF9WS0VZX0QpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRSwgRldMX1ZLRVlfRSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GLCBGV0xfVktFWV9GKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0csIEZXTF9WS0VZX0cpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfSCwgRldMX1ZLRVlfSCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9JLCBGV0xfVktFWV9JKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0osIEZXTF9WS0VZX0opOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfSywgRldMX1ZLRVlfSyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9MLCBGV0xfVktFWV9MKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX00sIEZXTF9WS0VZX00pOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTiwgRldMX1ZLRVlfTik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9PLCBGV0xfVktFWV9PKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1AsIEZXTF9WS0VZX1ApOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfUSwgRldMX1ZLRVlfUSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9SLCBGV0xfVktFWV9SKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1MsIEZXTF9WS0VZX1MpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfVCwgRldMX1ZLRVlfVCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9VLCBGV0xfVktFWV9VKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1YsIEZXTF9WS0VZX1YpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfVywgRldMX1ZLRVlfVyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9YLCBGV0xfVktFWV9YKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1ksIEZXTF9WS0VZX1kpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfWiwgRldMX1ZLRVlfWik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9MV0lOLCBGV0xfVktFWV9MV2luKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0NPTU1BTkQsIEZXTF9WS0VZX0NvbW1hbmQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfUldJTiwgRldMX1ZLRVlfUldpbik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9BUFBTLCBGV0xfVktFWV9BcHBzKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1NMRUVQLCBGV0xfVktFWV9TbGVlcCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9OVU1QQUQwLCBGV0xfVktFWV9OdW1QYWQwKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX05VTVBBRDEsIEZXTF9WS0VZX051bVBhZDEpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTlVNUEFEMiwgRldMX1ZLRVlfTnVtUGFkMik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9OVU1QQUQzLCBGV0xfVktFWV9OdW1QYWQzKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX05VTVBBRDQsIEZXTF9WS0VZX051bVBhZDQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTlVNUEFENSwgRldMX1ZLRVlfTnVtUGFkNSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9OVU1QQUQ2LCBGV0xfVktFWV9OdW1QYWQ2KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX05VTVBBRDcsIEZXTF9WS0VZX051bVBhZDcpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTlVNUEFEOCwgRldMX1ZLRVlfTnVtUGFkOCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9OVU1QQUQ5LCBGV0xfVktFWV9OdW1QYWQ5KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX01VTFRJUExZLCBGV0xfVktFWV9NdWx0aXBseSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9BREQsIEZXTF9WS0VZX0FkZCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9TRVBBUkFUT1IsIEZXTF9WS0VZX1NlcGFyYXRvcik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9TVUJUUkFDVCwgRldMX1ZLRVlfU3VidHJhY3QpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfREVDSU1BTCwgRldMX1ZLRVlfRGVjaW1hbCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9ESVZJREUsIEZXTF9WS0VZX0RpdmlkZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMSwgRldMX1ZLRVlfRjEpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRjIsIEZXTF9WS0VZX0YyKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0YzLCBGV0xfVktFWV9GMyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GNCwgRldMX1ZLRVlfRjQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRjUsIEZXTF9WS0VZX0Y1KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0Y2LCBGV0xfVktFWV9GNik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GNywgRldMX1ZLRVlfRjcpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRjgsIEZXTF9WS0VZX0Y4KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0Y5LCBGV0xfVktFWV9GOSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTAsIEZXTF9WS0VZX0YxMCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTEsIEZXTF9WS0VZX0YxMSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTIsIEZXTF9WS0VZX0YxMik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTMsIEZXTF9WS0VZX0YxMyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTQsIEZXTF9WS0VZX0YxNCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTUsIEZXTF9WS0VZX0YxNSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTYsIEZXTF9WS0VZX0YxNik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTcsIEZXTF9WS0VZX0YxNyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTgsIEZXTF9WS0VZX0YxOCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMTksIEZXTF9WS0VZX0YxOSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMjAsIEZXTF9WS0VZX0YyMCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMjEsIEZXTF9WS0VZX0YyMSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMjIsIEZXTF9WS0VZX0YyMik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMjMsIEZXTF9WS0VZX0YyMyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9GMjQsIEZXTF9WS0VZX0YyNCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9OVU1MT0NLLCBGV0xfVktFWV9OdW5Mb2NrKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1NDUk9MTCwgRldMX1ZLRVlfU2Nyb2xsKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0xTSElGVCwgRldMX1ZLRVlfTFNoaWZ0KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1JTSElGVCwgRldMX1ZLRVlfUlNoaWZ0KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0xDT05UUk9MLCBGV0xfVktFWV9MQ29udHJvbCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9SQ09OVFJPTCwgRldMX1ZLRVlfUkNvbnRyb2wpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTE1FTlUsIEZXTF9WS0VZX0xNZW51KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1JNRU5VLCBGV0xfVktFWV9STWVudSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9CUk9XU0VSX0JBQ0ssIEZXTF9WS0VZX0JST1dTRVJfQmFjayk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9CUk9XU0VSX0ZPUldBUkQsIEZXTF9WS0VZX0JST1dTRVJfRm9yd2FyZCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9CUk9XU0VSX1JFRlJFU0gsIEZXTF9WS0VZX0JST1dTRVJfUmVmcmVzaCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9CUk9XU0VSX1NUT1AsIEZXTF9WS0VZX0JST1dTRVJfU3RvcCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9CUk9XU0VSX1NFQVJDSCwgRldMX1ZLRVlfQlJPV1NFUl9TZWFyY2gpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfQlJPV1NFUl9GQVZPUklURVMsIEZXTF9WS0VZX0JST1dTRVJfRmF2b3JpdGVzKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0JST1dTRVJfSE9NRSwgRldMX1ZLRVlfQlJPV1NFUl9Ib21lKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1ZPTFVNRV9NVVRFLCBGV0xfVktFWV9WT0xVTUVfTXV0ZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9WT0xVTUVfRE9XTiwgRldMX1ZLRVlfVk9MVU1FX0Rvd24pOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfVk9MVU1FX1VQLCBGV0xfVktFWV9WT0xVTUVfVXApOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTUVESUFfTkVYVF9UUkFDSywgRldMX1ZLRVlfTUVESUFfTkVYVF9UcmFjayk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9NRURJQV9QUkVWX1RSQUNLLCBGV0xfVktFWV9NRURJQV9QUkVWX1RyYWNrKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX01FRElBX1NUT1AsIEZXTF9WS0VZX01FRElBX1N0b3ApOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTUVESUFfUExBWV9QQVVTRSwgRldMX1ZLRVlfTUVESUFfUExBWV9QYXVzZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9NRURJQV9MQVVOQ0hfTUFJTCwgRldMX1ZLRVlfTUVESUFfTEFVTkNIX01haWwpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCwKKyAgICAgICAgICAgICAgICAgICAgIEZXTF9WS0VZX01FRElBX0xBVU5DSF9NRURJQV9TZWxlY3QpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfTUVESUFfTEFVTkNIX0FQUDEsIEZXTF9WS0VZX01FRElBX0xBVU5DSF9BUFAxKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX01FRElBX0xBVU5DSF9BUFAyLCBGV0xfVktFWV9NRURJQV9MQVVOQ0hfQVBQMik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9PRU1fMSwgRldMX1ZLRVlfT0VNXzEpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfT0VNX1BMVVMsIEZXTF9WS0VZX09FTV9QbHVzKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX09FTV9DT01NQSwgRldMX1ZLRVlfT0VNX0NvbW1hKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX09FTV9NSU5VUywgRldMX1ZLRVlfT0VNX01pbnVzKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX09FTV9QRVJJT0QsIEZXTF9WS0VZX09FTV9QZXJpb2QpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfT0VNXzIsIEZXTF9WS0VZX09FTV8yKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX09FTV8zLCBGV0xfVktFWV9PRU1fMyk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9PRU1fNCwgRldMX1ZLRVlfT0VNXzQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfT0VNXzUsIEZXTF9WS0VZX09FTV81KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX09FTV82LCBGV0xfVktFWV9PRU1fNik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9PRU1fNywgRldMX1ZLRVlfT0VNXzcpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfT0VNXzgsIEZXTF9WS0VZX09FTV84KTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX09FTV8xMDIsIEZXTF9WS0VZX09FTV8xMDIpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfUFJPQ0VTU0tFWSwgRldMX1ZLRVlfUHJvY2Vzc0tleSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9QQUNLRVQsIEZXTF9WS0VZX1BhY2tldCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9BVFROLCBGV0xfVktFWV9BdHRuKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX0NSU0VMLCBGV0xfVktFWV9DcnNlbCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9FWFNFTCwgRldMX1ZLRVlfRXhzZWwpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfRVJFT0YsIEZXTF9WS0VZX0VyZW9mKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKHVpOjpWS0VZX1BMQVksIEZXTF9WS0VZX1BsYXkpOworQ09NUElMRV9BU1NFUlRfTUFUQ0godWk6OlZLRVlfWk9PTSwgRldMX1ZLRVlfWm9vbSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9OT05BTUUsIEZXTF9WS0VZX05vTmFtZSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9QQTEsIEZXTF9WS0VZX1BBMSk7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9PRU1fQ0xFQVIsIEZXTF9WS0VZX09FTV9DbGVhcik7CitDT01QSUxFX0FTU0VSVF9NQVRDSCh1aTo6VktFWV9VTktOT1dOLCBGV0xfVktFWV9Vbmtub3duKTsKKworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfUFJJVkFURUZPTlRDSEFSU0VUX0FOU0ksIEZYRk9OVF9BTlNJX0NIQVJTRVQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfUFJJVkFURUZPTlRDSEFSU0VUX0RFRkFVTFQsIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfUFJJVkFURUZPTlRDSEFSU0VUX1NZTUJPTCwgRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKK0NPTVBJTEVfQVNTRVJUX01BVENIKFBQX1BSSVZBVEVGT05UQ0hBUlNFVF9TSElGVEpJUywgRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfUFJJVkFURUZPTlRDSEFSU0VUX0hBTkdVTCwgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7CitDT01QSUxFX0FTU0VSVF9NQVRDSChQUF9QUklWQVRFRk9OVENIQVJTRVRfR0IyMzEyLCBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpOworQ09NUElMRV9BU1NFUlRfTUFUQ0goUFBfUFJJVkFURUZPTlRDSEFSU0VUX0NISU5FU0VCSUc1LAorICAgICAgICAgICAgICAgICAgICAgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fZW5naW5lLmNjIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fZW5naW5lLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTcwNTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9lbmdpbmUuY2MKQEAgLTAsMCArMSwzODg0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorI2luY2x1ZGUgInBkZi9wZGZpdW0vcGRmaXVtX2VuZ2luZS5oIg0KKw0KKyNpbmNsdWRlIDxtYXRoLmg+DQorDQorI2luY2x1ZGUgImJhc2UvanNvbi9qc29uX3dyaXRlci5oIg0KKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCINCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIg0KKyNpbmNsdWRlICJiYXNlL3N0bF91dGlsLmgiDQorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiDQorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfcGllY2UuaCINCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmgiDQorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy91dGZfc3RyaW5nX2NvbnZlcnNpb25zLmgiDQorI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiDQorI2luY2x1ZGUgInBkZi9kcmF3X3V0aWxzLmgiDQorI2luY2x1ZGUgInBkZi9wZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV9yZWFkLmgiDQorI2luY2x1ZGUgInBkZi9wZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV93cml0ZS5oIg0KKyNpbmNsdWRlICJwcGFwaS9jL3BwX2Vycm9ycy5oIg0KKyNpbmNsdWRlICJwcGFwaS9jL3BwX2lucHV0X2V2ZW50LmgiDQorI2luY2x1ZGUgInBwYXBpL2MvcHBiX2NvcmUuaCINCisjaW5jbHVkZSAicHBhcGkvYy9wcml2YXRlL3BwYl9wZGYuaCINCisjaW5jbHVkZSAicHBhcGkvY3BwL2Rldi9tZW1vcnlfZGV2LmgiDQorI2luY2x1ZGUgInBwYXBpL2NwcC9pbnB1dF9ldmVudC5oIg0KKyNpbmNsdWRlICJwcGFwaS9jcHAvaW5zdGFuY2UuaCINCisjaW5jbHVkZSAicHBhcGkvY3BwL21vZHVsZS5oIg0KKyNpbmNsdWRlICJwcGFwaS9jcHAvcHJpdmF0ZS9wZGYuaCINCisjaW5jbHVkZSAicHBhcGkvY3BwL3RydXN0ZWQvYnJvd3Nlcl9mb250X3RydXN0ZWQuaCINCisjaW5jbHVkZSAicHBhcGkvY3BwL3VybF9yZXNwb25zZV9pbmZvLmgiDQorI2luY2x1ZGUgInBwYXBpL2NwcC92YXIuaCINCisjaW5jbHVkZSAidGhpcmRfcGFydHkvcGRmaXVtL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX2V4dC5oIg0KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZfZmxhdHRlbi5oIg0KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZfc2VhcmNoZXguaCINCisjaW5jbHVkZSAidGhpcmRfcGFydHkvcGRmaXVtL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX3N5c2ZvbnRpbmZvLmgiDQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvZnBkZl90cmFuc2Zvcm1wYWdlLmgiDQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvZnBkZmVkaXQuaCINCisjaW5jbHVkZSAidGhpcmRfcGFydHkvcGRmaXVtL2ZwZGZzZGsvaW5jbHVkZS9mcGRmb29tLmgiDQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvZnBkZnBwby5oIg0KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZzYXZlLmgiDQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIg0KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIg0KKyNpbmNsdWRlICJ1aS9ldmVudHMva2V5Y29kZXMva2V5Ym9hcmRfY29kZXMuaCINCisNCituYW1lc3BhY2UgY2hyb21lX3BkZiB7DQorDQorbmFtZXNwYWNlIHsNCisNCisjZGVmaW5lIGtQYWdlU2hhZG93VG9wICAgIDMNCisjZGVmaW5lIGtQYWdlU2hhZG93Qm90dG9tIDcNCisjZGVmaW5lIGtQYWdlU2hhZG93TGVmdCAgIDUNCisjZGVmaW5lIGtQYWdlU2hhZG93UmlnaHQgIDUNCisNCisjZGVmaW5lIGtQYWdlU2VwYXJhdG9yVGhpY2tuZXNzIDQNCisjZGVmaW5lIGtIaWdobGlnaHRDb2xvclIgMTUzDQorI2RlZmluZSBrSGlnaGxpZ2h0Q29sb3JHIDE5Mw0KKyNkZWZpbmUga0hpZ2hsaWdodENvbG9yQiAyMTgNCisNCitjb25zdCB1aW50MzIga1BlbmRpbmdQYWdlQ29sb3IgPSAweEZGRUVFRUVFOw0KKw0KKyNkZWZpbmUga0Zvcm1IaWdobGlnaHRDb2xvciAweEZGRTRERA0KKyNkZWZpbmUga0Zvcm1IaWdobGlnaHRBbHBoYSAxMDANCisNCisjZGVmaW5lIGtNYXhQYXNzd29yZFRyaWVzIDMNCisNCisvLyBTZWUgVGFibGUgMy4yMCBpbg0KKy8vIGh0dHA6Ly93d3cuYWRvYmUuY29tL2Rldm5ldC9hY3JvYmF0L3BkZnMvcGRmX3JlZmVyZW5jZV8xLTcucGRmDQorI2RlZmluZSBrUERGUGVybWlzc2lvblByaW50TG93UXVhbGl0eU1hc2sgIDEgPDwgMg0KKyNkZWZpbmUga1BERlBlcm1pc3Npb25QcmludEhpZ2hRdWFsaXR5TWFzayAxIDw8IDExDQorI2RlZmluZSBrUERGUGVybWlzc2lvbkNvcHlNYXNrICAgICAgICAgICAgIDEgPDwgNA0KKyNkZWZpbmUga1BERlBlcm1pc3Npb25Db3B5QWNjZXNzaWJsZU1hc2sgICAxIDw8IDkNCisNCisjZGVmaW5lIGtMb2FkaW5nVGV4dFZlcnRpY2FsT2Zmc2V0IDUwDQorDQorLy8gVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgd2UnbGwgc3BlbmQgZG9pbmcgYSBwYWludCBiZWZvcmUgd2UgZ2l2ZSBiYWNrDQorLy8gY29udHJvbCBvZiB0aGUgdGhyZWFkLg0KKyNkZWZpbmUga01heFByb2dyZXNzaXZlUGFpbnRUaW1lTXMgNTANCisNCisvLyBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB3ZSdsbCBzcGVuZCBkb2luZyB0aGUgZmlyc3QgcGFpbnQuIFRoaXMgaXMgbGVzcw0KKy8vIHRoYW4gdGhlIGFib3ZlIHRvIGtlZXAgdGhpbmdzIHNtb290aCBpZiB0aGUgdXNlciBpcyBzY3JvbGxpbmcgcXVpY2tseS4gV2UNCisvLyB0cnkgcGFpbnRpbmcgYSBsaXR0bGUgYmVjYXVzZSB3aXRoIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nLCB3ZSBnZXQgZmx1c2hlcw0KKy8vIG9ubHkgZXZlcnkgMTYgbXMuIElmIHdlIHdlcmUgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCBmbHVzaCB0byBwYWludCB0aGUgcmVzdA0KKy8vIG9mIHRoZSBwZGYsIHdlIHdvdWxkIG5ldmVyIGdldCB0byBkcmF3IHRoZSBwZGYgYW5kIHdvdWxkIG9ubHkgZHJhdyB0aGUNCisvLyBzY3JvbGxiYXJzLiBUaGlzIHZhbHVlIGlzIHBpY2tlZCB0byBnaXZlIGVub3VnaCB0aW1lIGZvciBncHUgcmVsYXRlZCBjb2RlIHRvDQorLy8gZG8gaXRzIHRoaW5nIGFuZCBzdGlsbCBmaXQgd2l0aGluIHRoZSB0aW1lbGltaXQgZm9yIDYwSHouIEZvciB0aGUNCisvLyBub24tY29tcG9zaXRlZCBjYXNlLCB0aGlzIGRvZXNuJ3QgbWFrZSB0aGluZ3Mgd29yc2Ugc2luY2Ugd2UncmUgc3RpbGwNCisvLyBwYWludGluZyB0aGUgc2Nyb2xsYmFycyA+IDYwIEh6Lg0KKyNkZWZpbmUga01heEluaXRpYWxQcm9ncmVzc2l2ZVBhaW50VGltZU1zIDEwDQorDQorLy8gQ29waWVkIGZyb20gcHJpbnRpbmcvdW5pdHMuY2MgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlcGVuZCBvbiBwcmludGluZw0KKy8vIHNpbmNlIGl0IGJyaW5ncyBpbiBsaWJwbmcgd2hpY2ggY2F1c2VzIGR1cGxpY2F0ZSBzeW1ib2xzIHdpdGggUERGaXVtLg0KK2NvbnN0IGludCBrUG9pbnRzUGVySW5jaCA9IDcyOw0KK2NvbnN0IGludCBrUGl4ZWxzUGVySW5jaCA9IDk2Ow0KKw0KK3N0cnVjdCBDbGlwQm94IHsNCisgIGZsb2F0IGxlZnQ7DQorICBmbG9hdCByaWdodDsNCisgIGZsb2F0IHRvcDsNCisgIGZsb2F0IGJvdHRvbTsNCit9Ow0KKw0KK2ludCBDb252ZXJ0VW5pdChpbnQgdmFsdWUsIGludCBvbGRfdW5pdCwgaW50IG5ld191bml0KSB7DQorICAvLyBXaXRoIGludGVnZXIgYXJpdGhtZXRpYywgdG8gZGl2aWRlIGEgdmFsdWUgd2l0aCBjb3JyZWN0IHJvdW5kaW5nLCB5b3UgbmVlZA0KKyAgLy8gdG8gYWRkIGhhbGYgb2YgdGhlIGRpdmlzb3IgdmFsdWUgdG8gdGhlIGRpdmlkZW5kIHZhbHVlLiBZb3UgbmVlZCB0byBkbyB0aGUNCisgIC8vIHJldmVyc2Ugd2l0aCBuZWdhdGl2ZSBudW1iZXIuDQorICBpZiAodmFsdWUgPj0gMCkgew0KKyAgICByZXR1cm4gKCh2YWx1ZSAqIG5ld191bml0KSArIChvbGRfdW5pdCAvIDIpKSAvIG9sZF91bml0Ow0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuICgodmFsdWUgKiBuZXdfdW5pdCkgLSAob2xkX3VuaXQgLyAyKSkgLyBvbGRfdW5pdDsNCisgIH0NCit9DQorDQorc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEdldFBhZ2VOdW1iZXJzRnJvbVByaW50UGFnZU51bWJlclJhbmdlKA0KKyAgICBjb25zdCBQUF9QcmludFBhZ2VOdW1iZXJSYW5nZV9EZXYqIHBhZ2VfcmFuZ2VzLA0KKyAgICB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50KSB7DQorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGFnZV9udW1iZXJzOw0KKyAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgcGFnZV9yYW5nZV9jb3VudDsgKytpbmRleCkgew0KKyAgICBmb3IgKHVpbnQzMl90IHBhZ2VfbnVtYmVyID0gcGFnZV9yYW5nZXNbaW5kZXhdLmZpcnN0X3BhZ2VfbnVtYmVyOw0KKyAgICAgICAgIHBhZ2VfbnVtYmVyIDw9IHBhZ2VfcmFuZ2VzW2luZGV4XS5sYXN0X3BhZ2VfbnVtYmVyOyArK3BhZ2VfbnVtYmVyKSB7DQorICAgICAgcGFnZV9udW1iZXJzLnB1c2hfYmFjayhwYWdlX251bWJlcik7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwYWdlX251bWJlcnM7DQorfQ0KKw0KKyNpZiBkZWZpbmVkKE9TX0xJTlVYKQ0KKw0KK1BQX0luc3RhbmNlIGdfbGFzdF9pbnN0YW5jZV9pZDsNCisNCitzdHJ1Y3QgUERGRm9udFN1YnN0aXR1dGlvbiB7DQorICBjb25zdCBjaGFyKiBwZGZfbmFtZTsNCisgIGNvbnN0IGNoYXIqIGZhY2U7DQorICBib29sIGJvbGQ7DQorICBib29sIGl0YWxpYzsNCit9Ow0KKw0KK1BQX0Jyb3dzZXJGb250X1RydXN0ZWRfV2VpZ2h0IFdlaWdodFRvQnJvd3NlckZvbnRUcnVzdGVkV2VpZ2h0KGludCB3ZWlnaHQpIHsNCisgIENPTVBJTEVfQVNTRVJUKFBQX0JST1dTRVJGT05UX1RSVVNURURfV0VJR0hUXzEwMCA9PSAwLA0KKyAgICAgICAgICAgICAgICAgUFBfQnJvd3NlckZvbnRfVHJ1c3RlZF9XZWlnaHRfTWluKTsNCisgIENPTVBJTEVfQVNTRVJUKFBQX0JST1dTRVJGT05UX1RSVVNURURfV0VJR0hUXzkwMCA9PSA4LA0KKyAgICAgICAgICAgICAgICAgUFBfQnJvd3NlckZvbnRfVHJ1c3RlZF9XZWlnaHRfTWF4KTsNCisgIGNvbnN0IGludCBrTWluaW11bVdlaWdodCA9IDEwMDsNCisgIGNvbnN0IGludCBrTWF4aW11bVdlaWdodCA9IDkwMDsNCisgIGludCBub3JtYWxpemVkX3dlaWdodCA9DQorICAgICAgc3RkOjptaW4oc3RkOjptYXgod2VpZ2h0LCBrTWluaW11bVdlaWdodCksIGtNYXhpbXVtV2VpZ2h0KTsNCisgIG5vcm1hbGl6ZWRfd2VpZ2h0ID0gKG5vcm1hbGl6ZWRfd2VpZ2h0IC8gMTAwKSAtIDE7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8UFBfQnJvd3NlckZvbnRfVHJ1c3RlZF9XZWlnaHQ+KG5vcm1hbGl6ZWRfd2VpZ2h0KTsNCit9DQorDQorLy8gVGhpcyBsaXN0IGlzIGZvciBDUFdMX0ZvbnRNYXA6OkdldERlZmF1bHRGb250QnlDaGFyc2V0KCkuDQorLy8gV2UgcHJldGVuZCB0byBoYXZlIHRoZXNlIGZvbnQgbmF0aXZlbHkgYW5kIGxldCB0aGUgYnJvd3NlciAob3IgdW5kZXJseWluZw0KKy8vIGZvbnRjb25maWcpIHRvIHBpY2sgdGhlIHByb3BlciBmb250IG9uIHRoZSBzeXN0ZW0uDQordm9pZCBFbnVtRm9udHMoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBzeXNmb250aW5mbywgdm9pZCogbWFwcGVyKSB7DQorICBGUERGX0FkZEluc3RhbGxlZEZvbnQobWFwcGVyLCAiQXJpYWwiLCBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKTsNCisNCisgIGludCBpID0gMDsNCisgIHdoaWxlIChDUFdMX0ZvbnRNYXA6OmRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgew0KKyAgICBGUERGX0FkZEluc3RhbGxlZEZvbnQobWFwcGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwW2ldLmZvbnRuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwW2ldLmNoYXJzZXQpOw0KKyAgICArK2k7DQorICB9DQorfQ0KKw0KK2NvbnN0IFBERkZvbnRTdWJzdGl0dXRpb24gUERGRm9udFN1YnN0aXR1dGlvbnNbXSA9IHsNCisgICAgeyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgZmFsc2UsIGZhbHNlfSwNCisgICAgeyJDb3VyaWVyLUJvbGQiLCAiQ291cmllciBOZXciLCB0cnVlLCBmYWxzZX0sDQorICAgIHsiQ291cmllci1Cb2xkT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIHRydWUsIHRydWV9LA0KKyAgICB7IkNvdXJpZXItT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIGZhbHNlLCB0cnVlfSwNCisgICAgeyJIZWx2ZXRpY2EiLCAiQXJpYWwiLCBmYWxzZSwgZmFsc2V9LA0KKyAgICB7IkhlbHZldGljYS1Cb2xkIiwgIkFyaWFsIiwgdHJ1ZSwgZmFsc2V9LA0KKyAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJBcmlhbCIsIHRydWUsIHRydWV9LA0KKyAgICB7IkhlbHZldGljYS1PYmxpcXVlIiwgIkFyaWFsIiwgZmFsc2UsIHRydWV9LA0KKyAgICB7IlRpbWVzLVJvbWFuIiwgIlRpbWVzIE5ldyBSb21hbiIsIGZhbHNlLCBmYWxzZX0sDQorICAgIHsiVGltZXMtQm9sZCIsICJUaW1lcyBOZXcgUm9tYW4iLCB0cnVlLCBmYWxzZX0sDQorICAgIHsiVGltZXMtQm9sZEl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCB0cnVlLCB0cnVlfSwNCisgICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIiwgZmFsc2UsIHRydWV9LA0KKw0KKyAgICAvLyBNUyBQPyhNaW5jaG98R290aGljKSBhcmUgdGhlIG1vc3Qgbm90YWJsZSBmb250cyBpbiBKYXBhbmVzZSBQREYgZmlsZXMNCisgICAgLy8gd2l0aG91dCBlbWJlZGRpbmcgdGhlIGdseXBocy4gU29tZXRpbWVzIHRoZSBmb250IG5hbWVzIGFyZSBlbmNvZGVkDQorICAgIC8vIGluIEphcGFuZXNlIFdpbmRvd3MncyBsb2NhbGUgKENQOTMyL1NoaWZ0X0pJUykgd2l0aG91dCBzcGFjZS4NCisgICAgLy8gTW9zdCBMaW51eCBzeXN0ZW1zIGRvbid0IGhhdmUgdGhlIGV4YWN0IGZvbnQsIGJ1dCBmb3Igb3V0c291cmNpbmcNCisgICAgLy8gZm9udGNvbmZpZyB0byBmaW5kIHN1YnN0aXR1dGFibGUgZm9udCBpbiB0aGUgc3lzdGVtLCB3ZSBwYXNzIEFTQ0lJDQorICAgIC8vIGZvbnQgbmFtZXMgdG8gaXQuDQorICAgIHsiTVMtUEdvdGhpYyIsICJNUyBQR290aGljIiwgZmFsc2UsIGZhbHNlfSwNCisgICAgeyJNUy1Hb3RoaWMiLCAiTVMgR290aGljIiwgZmFsc2UsIGZhbHNlfSwNCisgICAgeyJNUy1QTWluY2hvIiwgIk1TIFBNaW5jaG8iLCBmYWxzZSwgZmFsc2V9LA0KKyAgICB7Ik1TLU1pbmNobyIsICJNUyBNaW5jaG8iLCBmYWxzZSwgZmFsc2V9LA0KKyAgICAvLyBNUyBQR290aGljIGluIFNoaWZ0X0pJUyBlbmNvZGluZy4NCisgICAgeyJceDgyXHg2Q1x4ODJceDcyXHg4Mlx4NkZceDgzXHg1M1x4ODNceDU2XHg4M1x4NjJceDgzXHg0RSIsDQorICAgICAiTVMgUEdvdGhpYyIsIGZhbHNlLCBmYWxzZX0sDQorICAgIC8vIE1TIEdvdGhpYyBpbiBTaGlmdF9KSVMgZW5jb2RpbmcuDQorICAgIHsiXHg4Mlx4NkNceDgyXHg3Mlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRFIiwNCisgICAgICJNUyBHb3RoaWMiLCBmYWxzZSwgZmFsc2V9LA0KKyAgICAvLyBNUyBQTWluY2hvIGluIFNoaWZ0X0pJUyBlbmNvZGluZy4NCisgICAgeyJceDgyXHg2Q1x4ODJceDcyXHg4Mlx4NkZceDk2XHhCRVx4OTJceEE5IiwNCisgICAgICJNUyBQTWluY2hvIiwgZmFsc2UsIGZhbHNlfSwNCisgICAgLy8gTVMgTWluY2hvIGluIFNoaWZ0X0pJUyBlbmNvZGluZy4NCisgICAgeyJceDgyXHg2Q1x4ODJceDcyXHg5Nlx4QkVceDkyXHhBOSIsDQorICAgICAiTVMgTWluY2hvIiwgZmFsc2UsIGZhbHNlfSwNCit9Ow0KKw0KK3ZvaWQqIE1hcEZvbnQoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiwgaW50IHdlaWdodCwgaW50IGl0YWxpYywNCisgICAgICAgICAgICAgIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBjaGFyKiBmYWNlLCBpbnQqIGV4YWN0KSB7DQorICAvLyBEbyBub3QgYXR0ZW1wdCB0byBtYXAgZm9udHMgaWYgcGVwcGVyIGlzIG5vdCBpbml0aWFsaXplZCAoZm9yIHByaXZldCBsb2NhbA0KKyAgLy8gcHJpbnRpbmcpLg0KKyAgLy8gVE9ETyhub2Ftc21sKTogUmVhbCBmb250IHN1YnN0aXR1dGlvbiAoaHR0cDovL2NyYnVnLmNvbS8zOTE5NzgpDQorICBpZiAoIXBwOjpNb2R1bGU6OkdldCgpKQ0KKyAgICByZXR1cm4gTlVMTDsNCisNCisgIHBwOjpCcm93c2VyRm9udERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOw0KKw0KKyAgLy8gUHJldGVuZCB0aGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIFN5bWJvbCBmb250IHRvIGZvcmNlIGEgZmFsbGJhY2sgdG8NCisgIC8vIHRoZSBidWlsdCBpbiBTeW1ib2wgZm9udCBpbiBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udCgpLg0KKyAgaWYgKHN0cmNtcChmYWNlLCAiU3ltYm9sIikgPT0gMCkNCisgICAgcmV0dXJuIE5VTEw7DQorDQorICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpIHsNCisgICAgZGVzY3JpcHRpb24uc2V0X2ZhbWlseShQUF9CUk9XU0VSRk9OVF9UUlVTVEVEX0ZBTUlMWV9NT05PU1BBQ0UpOw0KKyAgfSBlbHNlIGlmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsNCisgICAgZGVzY3JpcHRpb24uc2V0X2ZhbWlseShQUF9CUk9XU0VSRk9OVF9UUlVTVEVEX0ZBTUlMWV9TRVJJRik7DQorICB9DQorDQorICAvLyBNYXAgZnJvbSB0aGUgc3RhbmRhcmQgUERGIGZvbnRzIHRvIFRydWVUeXBlIGZvbnQgbmFtZXMuDQorICBzaXplX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBhcnJheXNpemUoUERGRm9udFN1YnN0aXR1dGlvbnMpOyArK2kpIHsNCisgICAgaWYgKHN0cmNtcChmYWNlLCBQREZGb250U3Vic3RpdHV0aW9uc1tpXS5wZGZfbmFtZSkgPT0gMCkgew0KKyAgICAgIGRlc2NyaXB0aW9uLnNldF9mYWNlKFBERkZvbnRTdWJzdGl0dXRpb25zW2ldLmZhY2UpOw0KKyAgICAgIGlmIChQREZGb250U3Vic3RpdHV0aW9uc1tpXS5ib2xkKQ0KKyAgICAgICAgZGVzY3JpcHRpb24uc2V0X3dlaWdodChQUF9CUk9XU0VSRk9OVF9UUlVTVEVEX1dFSUdIVF9CT0xEKTsNCisgICAgICBpZiAoUERGRm9udFN1YnN0aXR1dGlvbnNbaV0uaXRhbGljKQ0KKyAgICAgICAgZGVzY3JpcHRpb24uc2V0X2l0YWxpYyh0cnVlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKGkgPT0gYXJyYXlzaXplKFBERkZvbnRTdWJzdGl0dXRpb25zKSkgew0KKyAgICAvLyBUT0RPKGtvY2hpKTogUGFzcyB0aGUgZmFjZSBpbiBVVEYtOC4gSWYgZmFjZSBpcyBub3QgZW5jb2RlZCBpbiBVVEYtOCwNCisgICAgLy8gY29udmVydCB0byBVVEYtOCBiZWZvcmUgcGFzc2luZy4NCisgICAgZGVzY3JpcHRpb24uc2V0X2ZhY2UoZmFjZSk7DQorDQorICAgIGRlc2NyaXB0aW9uLnNldF93ZWlnaHQoV2VpZ2h0VG9Ccm93c2VyRm9udFRydXN0ZWRXZWlnaHQod2VpZ2h0KSk7DQorICAgIGRlc2NyaXB0aW9uLnNldF9pdGFsaWMoaXRhbGljID4gMCk7DQorICB9DQorDQorICBpZiAoIXBwOjpQREY6OklzQXZhaWxhYmxlKCkpIHsNCisgICAgTk9UUkVBQ0hFRCgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisNCisgIFBQX1Jlc291cmNlIGZvbnRfcmVzb3VyY2UgPSBwcDo6UERGOjpHZXRGb250RmlsZVdpdGhGYWxsYmFjaygNCisgICAgICBwcDo6SW5zdGFuY2VIYW5kbGUoZ19sYXN0X2luc3RhbmNlX2lkKSwNCisgICAgICAmZGVzY3JpcHRpb24ucHBfZm9udF9kZXNjcmlwdGlvbigpLA0KKyAgICAgIHN0YXRpY19jYXN0PFBQX1ByaXZhdGVGb250Q2hhcnNldD4oY2hhcnNldCkpOw0KKyAgbG9uZyByZXNfaWQgPSBmb250X3Jlc291cmNlOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlc19pZCk7DQorfQ0KKw0KK3Vuc2lnbmVkIGxvbmcgR2V0Rm9udERhdGEoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiwgdm9pZCogZm9udF9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YWJsZSwgdW5zaWduZWQgY2hhciogYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSkgew0KKyAgaWYgKCFwcDo6UERGOjpJc0F2YWlsYWJsZSgpKSB7DQorICAgIE5PVFJFQUNIRUQoKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorDQorICB1aW50MzJfdCBzaXplID0gYnVmX3NpemU7DQorICBsb25nIHJlc19pZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4oZm9udF9pZCk7DQorICBpZiAoIXBwOjpQREY6OkdldEZvbnRUYWJsZUZvclByaXZhdGVGb250RmlsZShyZXNfaWQsIHRhYmxlLCBidWZmZXIsICZzaXplKSkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gc2l6ZTsNCit9DQorDQordm9pZCBEZWxldGVGb250KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyosIHZvaWQqIGZvbnRfaWQpIHsNCisgIGxvbmcgcmVzX2lkID0gcmVpbnRlcnByZXRfY2FzdDxsb25nPihmb250X2lkKTsNCisgIHBwOjpNb2R1bGU6OkdldCgpLT5jb3JlKCktPlJlbGVhc2VSZXNvdXJjZShyZXNfaWQpOw0KK30NCisNCitGUERGX1NZU0ZPTlRJTkZPIGdfZm9udF9pbmZvID0gew0KKyAgMSwNCisgIDAsDQorICBFbnVtRm9udHMsDQorICBNYXBGb250LA0KKyAgMCwNCisgIEdldEZvbnREYXRhLA0KKyAgMCwNCisgIDAsDQorICBEZWxldGVGb250DQorfTsNCisjZW5kaWYgIC8vIGRlZmluZWQoT1NfTElOVVgpDQorDQordm9pZCBPT01fSGFuZGxlcihfT09NX0lORk8qKSB7DQorICAvLyBLaWxsIHRoZSBwcm9jZXNzLiAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNlY3VyaXR5LCBzaW5jZSB0aGUgY29kZSBkb2Vzbid0DQorICAvLyBOVUxMLWNoZWNrIG1hbnkgbWVtb3J5IGFsbG9jYXRpb25zLiAgSWYgYSBtYWxsb2MgZmFpbHMsIHJldHVybnMgTlVMTCwgYW5kDQorICAvLyB0aGUgYnVmZmVyIGlzIHRoZW4gdXNlZCwgaXQgcHJvdmlkZXMgYSBoYW5keSBtYXBwaW5nIG9mIG1lbW9yeSBzdGFydGluZyBhdA0KKyAgLy8gYWRkcmVzcyAwIGZvciBhbiBhdHRhY2tlciB0byB1dGlsaXplLg0KKyAgYWJvcnQoKTsNCit9DQorDQorT09NX0lORk8gZ19vb21faW5mbyA9IHsNCisgIDEsDQorICBPT01fSGFuZGxlcg0KK307DQorDQorUERGaXVtRW5naW5lKiBnX2VuZ2luZV9mb3JfdW5zdXBwb3J0ZWQ7DQorDQordm9pZCBVbnN1cHBvcnRlZF9IYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiwgaW50IHR5cGUpIHsNCisgIGlmICghZ19lbmdpbmVfZm9yX3Vuc3VwcG9ydGVkKSB7DQorICAgIE5PVFJFQUNIRUQoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgZ19lbmdpbmVfZm9yX3Vuc3VwcG9ydGVkLT5VbnN1cHBvcnRlZEZlYXR1cmUodHlwZSk7DQorfQ0KKw0KK1VOU1VQUE9SVF9JTkZPIGdfdW5zdXBwb3JlZF9pbmZvID0gew0KKyAgMSwNCisgIFVuc3VwcG9ydGVkX0hhbmRsZXINCit9Ow0KKw0KKy8vIFNldCB0aGUgZGVzdGluYXRpb24gcGFnZSBzaXplIGFuZCBjb250ZW50IGFyZWEgaW4gcG9pbnRzIGJhc2VkIG9uIHNvdXJjZQ0KKy8vIHBhZ2Ugcm90YXRpb24gYW5kIG9yaWVudGF0aW9uLg0KKy8vDQorLy8gfHJvdGF0ZWR8IFRydWUgaWYgc291cmNlIHBhZ2UgaXMgcm90YXRlZCA5MCBkZWdyZWUgb3IgMjcwIGRlZ3JlZS4NCisvLyB8aXNfc3JjX3BhZ2VfbGFuZHNjYXBlfCBpcyB0cnVlIGlmIHRoZSBzb3VyY2UgcGFnZSBvcmllbnRhdGlvbiBpcyBsYW5kc2NhcGUuDQorLy8gfHBhZ2Vfc2l6ZXwgaGFzIHRoZSBhY3R1YWwgZGVzdGluYXRpb24gcGFnZSBzaXplIGluIHBvaW50cy4NCisvLyB8Y29udGVudF9yZWN0fCBoYXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYWdlIHByaW50YWJsZSBhcmVhIHZhbHVlcyBpbg0KKy8vIHBvaW50cy4NCit2b2lkIFNldFBhZ2VTaXplQW5kQ29udGVudFJlY3QoYm9vbCByb3RhdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3NyY19wYWdlX2xhbmRzY2FwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OlNpemUqIHBhZ2Vfc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OlJlY3QqIGNvbnRlbnRfcmVjdCkgew0KKyAgYm9vbCBpc19kc3RfcGFnZV9sYW5kc2NhcGUgPSBwYWdlX3NpemUtPndpZHRoKCkgPiBwYWdlX3NpemUtPmhlaWdodCgpOw0KKyAgYm9vbCBwYWdlX29yaWVudGF0aW9uX21pc21hdGNoZWQgPSBpc19zcmNfcGFnZV9sYW5kc2NhcGUgIT0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZHN0X3BhZ2VfbGFuZHNjYXBlOw0KKyAgYm9vbCByb3RhdGVfZHN0X3BhZ2UgPSByb3RhdGVkIF4gcGFnZV9vcmllbnRhdGlvbl9taXNtYXRjaGVkOw0KKyAgaWYgKHJvdGF0ZV9kc3RfcGFnZSkgew0KKyAgICBwYWdlX3NpemUtPlNldFNpemUocGFnZV9zaXplLT5oZWlnaHQoKSwgcGFnZV9zaXplLT53aWR0aCgpKTsNCisgICAgY29udGVudF9yZWN0LT5TZXRSZWN0KGNvbnRlbnRfcmVjdC0+eSgpLCBjb250ZW50X3JlY3QtPngoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfcmVjdC0+aGVpZ2h0KCksIGNvbnRlbnRfcmVjdC0+d2lkdGgoKSk7DQorICB9DQorfQ0KKw0KKy8vIENhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGJldHdlZW4gfGNvbnRlbnRfcmVjdHwgYW5kIGEgcGFnZSBvZiBzaXplDQorLy8gfHNyY193aWR0aHwgeCB8c3JjX2hlaWdodHwuDQorLy8NCisvLyB8c2NhbGVfdG9fZml0fCBpcyB0cnVlLCBpZiB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yLg0KKy8vIHxjb250ZW50X3JlY3R8IHNwZWNpZmllcyB0aGUgcHJpbnRhYmxlIGFyZWEgb2YgdGhlIGRlc3RpbmF0aW9uIHBhZ2UsIHdpdGgNCisvLyBvcmlnaW4gYXQgbGVmdC1ib3R0b20uIFZhbHVlcyBhcmUgaW4gcG9pbnRzLg0KKy8vIHxzcmNfd2lkdGh8IHNwZWNpZmllcyB0aGUgc291cmNlIHBhZ2Ugd2lkdGggaW4gcG9pbnRzLg0KKy8vIHxzcmNfaGVpZ2h0fCBzcGVjaWZpZXMgdGhlIHNvdXJjZSBwYWdlIGhlaWdodCBpbiBwb2ludHMuDQorLy8gfHJvdGF0ZWR8IFRydWUgaWYgc291cmNlIHBhZ2UgaXMgcm90YXRlZCA5MCBkZWdyZWUgb3IgMjcwIGRlZ3JlZS4NCitkb3VibGUgQ2FsY3VsYXRlU2NhbGVGYWN0b3IoYm9vbCBzY2FsZV90b19maXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiBjb250ZW50X3JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzcmNfd2lkdGgsIGRvdWJsZSBzcmNfaGVpZ2h0LCBib29sIHJvdGF0ZWQpIHsNCisgIGlmICghc2NhbGVfdG9fZml0IHx8IHNyY193aWR0aCA9PSAwIHx8IHNyY19oZWlnaHQgPT0gMCkNCisgICAgcmV0dXJuIDEuMDsNCisNCisgIGRvdWJsZSBhY3R1YWxfc291cmNlX3BhZ2Vfd2lkdGggPSByb3RhdGVkID8gc3JjX2hlaWdodCA6IHNyY193aWR0aDsNCisgIGRvdWJsZSBhY3R1YWxfc291cmNlX3BhZ2VfaGVpZ2h0ID0gcm90YXRlZCA/IHNyY193aWR0aCA6IHNyY19oZWlnaHQ7DQorICBkb3VibGUgcmF0aW9feCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oY29udGVudF9yZWN0LndpZHRoKCkpIC8NCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX3NvdXJjZV9wYWdlX3dpZHRoOw0KKyAgZG91YmxlIHJhdGlvX3kgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGNvbnRlbnRfcmVjdC5oZWlnaHQoKSkgLw0KKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfc291cmNlX3BhZ2VfaGVpZ2h0Ow0KKyAgcmV0dXJuIHN0ZDo6bWluKHJhdGlvX3gsIHJhdGlvX3kpOw0KK30NCisNCisvLyBDb21wdXRlIHNvdXJjZSBjbGlwIGJveCBib3VuZGFyaWVzIGJhc2VkIG9uIHRoZSBjcm9wIGJveCAvIG1lZGlhIGJveCBvZg0KKy8vIHNvdXJjZSBwYWdlIGFuZCBzY2FsZSBmYWN0b3IuDQorLy8NCisvLyB8cGFnZXwgSGFuZGxlIHRvIHRoZSBzb3VyY2UgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4NCisvLyB8c2NhbGVfZmFjdG9yfCBzcGVjaWZpZXMgdGhlIHNjYWxlIGZhY3RvciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHNvdXJjZQ0KKy8vIGNsaXAgYm94IGJvdW5kYXJpZXMuDQorLy8gfHJvdGF0ZWR8IFRydWUgaWYgc291cmNlIHBhZ2UgaXMgcm90YXRlZCA5MCBkZWdyZWUgb3IgMjcwIGRlZ3JlZS4NCisvLyB8Y2xpcF9ib3h8IG91dCBwYXJhbSB0byBob2xkIHRoZSBjb21wdXRlZCBzb3VyY2UgY2xpcCBib3ggdmFsdWVzLg0KK3ZvaWQgQ2FsY3VsYXRlQ2xpcEJveEJvdW5kYXJ5KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgc2NhbGVfZmFjdG9yLCBib29sIHJvdGF0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcEJveCogY2xpcF9ib3gpIHsNCisgIGlmICghRlBERlBhZ2VfR2V0Q3JvcEJveChwYWdlLCAmY2xpcF9ib3gtPmxlZnQsICZjbGlwX2JveC0+Ym90dG9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwX2JveC0+cmlnaHQsICZjbGlwX2JveC0+dG9wKSkgew0KKyAgICBpZiAoIUZQREZQYWdlX0dldE1lZGlhQm94KHBhZ2UsICZjbGlwX2JveC0+bGVmdCwgJmNsaXBfYm94LT5ib3R0b20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBfYm94LT5yaWdodCwgJmNsaXBfYm94LT50b3ApKSB7DQorICAgICAgLy8gTWFrZSB0aGUgZGVmYXVsdCBzaXplIHRvIGJlIGxldHRlciBzaXplICg4LjUiIFggMTEiKS4gV2UgYXJlIGp1c3QNCisgICAgICAvLyBmb2xsb3dpbmcgdGhlIFBERml1bSB3YXkgb2YgaGFuZGxpbmcgdGhlc2UgY29ybmVyIGNhc2VzLiBQREZpdW0gYWx3YXlzDQorICAgICAgLy8gY29uc2lkZXIgVVMtTGV0dGVyIGFzIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZS4NCisgICAgICBmbG9hdCBwYXBlcl93aWR0aCA9IDYxMjsNCisgICAgICBmbG9hdCBwYXBlcl9oZWlnaHQgPSA3OTI7DQorICAgICAgY2xpcF9ib3gtPmxlZnQgPSAwOw0KKyAgICAgIGNsaXBfYm94LT5ib3R0b20gPSAwOw0KKyAgICAgIGNsaXBfYm94LT5yaWdodCA9IHJvdGF0ZWQgPyBwYXBlcl9oZWlnaHQgOiBwYXBlcl93aWR0aDsNCisgICAgICBjbGlwX2JveC0+dG9wID0gcm90YXRlZCA/IHBhcGVyX3dpZHRoIDogcGFwZXJfaGVpZ2h0Ow0KKyAgICB9DQorICB9DQorICBjbGlwX2JveC0+bGVmdCAqPSBzY2FsZV9mYWN0b3I7DQorICBjbGlwX2JveC0+cmlnaHQgKj0gc2NhbGVfZmFjdG9yOw0KKyAgY2xpcF9ib3gtPmJvdHRvbSAqPSBzY2FsZV9mYWN0b3I7DQorICBjbGlwX2JveC0+dG9wICo9IHNjYWxlX2ZhY3RvcjsNCit9DQorDQorLy8gQ2FsY3VsYXRlIHRoZSBjbGlwIGJveCB0cmFuc2xhdGlvbiBvZmZzZXQgZm9yIGEgcGFnZSB0aGF0IGRvZXMgbmVlZCB0byBiZQ0KKy8vIHNjYWxlZC4gQWxsIHBhcmFtZXRlcnMgYXJlIGluIHBvaW50cy4NCisvLw0KKy8vIHxjb250ZW50X3JlY3R8IHNwZWNpZmllcyB0aGUgcHJpbnRhYmxlIGFyZWEgb2YgdGhlIGRlc3RpbmF0aW9uIHBhZ2UsIHdpdGgNCisvLyBvcmlnaW4gYXQgbGVmdC1ib3R0b20uDQorLy8gfHNvdXJjZV9jbGlwX2JveHwgc3BlY2lmaWVzIHRoZSBzb3VyY2UgY2xpcCBib3ggcG9zaXRpb25zLCByZWxhdGl2ZSB0bw0KKy8vIG9yaWdpbiBhdCBsZWZ0LWJvdHRvbS4NCisvLyB8b2Zmc2V0X3h8IGFuZCB8b2Zmc2V0X3l8IHdpbGwgY29udGFpbiB0aGUgZmluYWwgdHJhbnNsYXRpb24gb2Zmc2V0cyBmb3IgdGhlDQorLy8gc291cmNlIGNsaXAgYm94LCByZWxhdGl2ZSB0byBvcmlnaW4gYXQgbGVmdC1ib3R0b20uDQordm9pZCBDYWxjdWxhdGVTY2FsZWRDbGlwQm94T2Zmc2V0KGNvbnN0IHBwOjpSZWN0JiBjb250ZW50X3JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENsaXBCb3gmIHNvdXJjZV9jbGlwX2JveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBvZmZzZXRfeCwgZG91YmxlKiBvZmZzZXRfeSkgew0KKyAgY29uc3QgZmxvYXQgY2xpcF9ib3hfd2lkdGggPSBzb3VyY2VfY2xpcF9ib3gucmlnaHQgLSBzb3VyY2VfY2xpcF9ib3gubGVmdDsNCisgIGNvbnN0IGZsb2F0IGNsaXBfYm94X2hlaWdodCA9IHNvdXJjZV9jbGlwX2JveC50b3AgLSBzb3VyY2VfY2xpcF9ib3guYm90dG9tOw0KKw0KKyAgLy8gQ2VudGVyIHRoZSBpbnRlbmRlZCBjbGlwIHJlZ2lvbiB0byByZWFsIGNsaXAgcmVnaW9uLg0KKyAgKm9mZnNldF94ID0gKGNvbnRlbnRfcmVjdC53aWR0aCgpIC0gY2xpcF9ib3hfd2lkdGgpIC8gMiArIGNvbnRlbnRfcmVjdC54KCkgLQ0KKyAgICAgICAgICAgICAgc291cmNlX2NsaXBfYm94LmxlZnQ7DQorICAqb2Zmc2V0X3kgPSAoY29udGVudF9yZWN0LmhlaWdodCgpIC0gY2xpcF9ib3hfaGVpZ2h0KSAvIDIgKyBjb250ZW50X3JlY3QueSgpIC0NCisgICAgICAgICAgICAgIHNvdXJjZV9jbGlwX2JveC5ib3R0b207DQorfQ0KKw0KKy8vIENhbGN1bGF0ZSB0aGUgY2xpcCBib3ggb2Zmc2V0IGZvciBhIHBhZ2UgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNjYWxlZC4NCisvLyBBbGwgcGFyYW1ldGVycyBhcmUgaW4gcG9pbnRzLg0KKy8vDQorLy8gfGNvbnRlbnRfcmVjdHwgc3BlY2lmaWVzIHRoZSBwcmludGFibGUgYXJlYSBvZiB0aGUgZGVzdGluYXRpb24gcGFnZSwgd2l0aA0KKy8vIG9yaWdpbiBhdCBsZWZ0LWJvdHRvbS4NCisvLyB8cm90YXRpb258IHNwZWNpZmllcyB0aGUgc291cmNlIHBhZ2Ugcm90YXRpb24gdmFsdWVzIHdoaWNoIGFyZSBOIC8gOTANCisvLyBkZWdyZWVzLg0KKy8vIHxwYWdlX3dpZHRofCBzcGVjaWZpZXMgdGhlIHNjcmVlbiBkZXN0aW5hdGlvbiBwYWdlIHdpZHRoLg0KKy8vIHxwYWdlX2hlaWdodHwgc3BlY2lmaWVzIHRoZSBzY3JlZW4gZGVzdGluYXRpb24gcGFnZSBoZWlnaHQuDQorLy8gfHNvdXJjZV9jbGlwX2JveHwgc3BlY2lmaWVzIHRoZSBzb3VyY2UgY2xpcCBib3ggcG9zaXRpb25zLCByZWxhdGl2ZSB0byBvcmlnaW4NCisvLyBhdCBsZWZ0LWJvdHRvbS4NCisvLyB8b2Zmc2V0X3h8IGFuZCB8b2Zmc2V0X3l8IHdpbGwgY29udGFpbiB0aGUgZmluYWwgdHJhbnNsYXRpb24gb2Zmc2V0cyBmb3IgdGhlDQorLy8gc291cmNlIGNsaXAgYm94LCByZWxhdGl2ZSB0byBvcmlnaW4gYXQgbGVmdC1ib3R0b20uDQordm9pZCBDYWxjdWxhdGVOb25TY2FsZWRDbGlwQm94T2Zmc2V0KGNvbnN0IHBwOjpSZWN0JiBjb250ZW50X3JlY3QsIGludCByb3RhdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2Vfd2lkdGgsIGludCBwYWdlX2hlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2xpcEJveCYgc291cmNlX2NsaXBfYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG9mZnNldF94LCBkb3VibGUqIG9mZnNldF95KSB7DQorICAvLyBBbGlnbiB0aGUgaW50ZW5kZWQgY2xpcCByZWdpb24gdG8gbGVmdC10b3AgY29ybmVyIG9mIHJlYWwgY2xpcCByZWdpb24uDQorICBzd2l0Y2ggKHJvdGF0aW9uKSB7DQorICAgIGNhc2UgMDoNCisgICAgICAqb2Zmc2V0X3ggPSAtMSAqIHNvdXJjZV9jbGlwX2JveC5sZWZ0Ow0KKyAgICAgICpvZmZzZXRfeSA9IHBhZ2VfaGVpZ2h0IC0gc291cmNlX2NsaXBfYm94LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgICpvZmZzZXRfeCA9IDA7DQorICAgICAgKm9mZnNldF95ID0gLTEgKiBzb3VyY2VfY2xpcF9ib3guYm90dG9tOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI6DQorICAgICAgKm9mZnNldF94ID0gcGFnZV93aWR0aCAtIHNvdXJjZV9jbGlwX2JveC5yaWdodDsNCisgICAgICAqb2Zmc2V0X3kgPSAwOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM6DQorICAgICAgKm9mZnNldF94ID0gcGFnZV9oZWlnaHQgLSBzb3VyY2VfY2xpcF9ib3gucmlnaHQ7DQorICAgICAgKm9mZnNldF95ID0gcGFnZV93aWR0aCAtIHNvdXJjZV9jbGlwX2JveC50b3A7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgTk9UUkVBQ0hFRCgpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCisNCisvLyBUaGlzIGZvcm1hdHMgYSBzdHJpbmcgd2l0aCBzcGVjaWFsIDB4ZmZmZSBlbmQtb2YtbGluZSBoeXBoZW5zIHRoZSBzYW1lIHdheQ0KKy8vIGFzIEFkb2JlIFJlYWRlci4gV2hlbiBhIGh5cGhlbiBpcyBlbmNvdW50ZXJlZCwgdGhlIG5leHQgbm9uLUNSL0xGIHdoaXRlc3BhY2UNCisvLyBiZWNvbWVzIENSK0xGIGFuZCB0aGUgaHlwaGVuIGlzIGVyYXNlZC4gSWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBiZXR3ZWVuDQorLy8gdHdvIGh5cGhlbnMsIHRoZSBsYXR0ZXIgaHlwaGVuIGlzIGVyYXNlZCBhbmQgaWdub3JlZC4NCit2b2lkIEZvcm1hdFN0cmluZ1dpdGhIeXBoZW5zKGJhc2U6OnN0cmluZzE2KiB0ZXh0KSB7DQorICAvLyBGaXJzdCBwYXNzIG1hcmtzIGFsbCB0aGUgaHlwaGVuIHBvc2l0aW9ucy4NCisgIHN0cnVjdCBIeXBoZW5Qb3NpdGlvbiB7DQorICAgIEh5cGhlblBvc2l0aW9uKCkgOiBwb3NpdGlvbigwKSwgbmV4dF93aGl0ZXNwYWNlX3Bvc2l0aW9uKDApIHt9DQorICAgIHNpemVfdCBwb3NpdGlvbjsNCisgICAgc2l6ZV90IG5leHRfd2hpdGVzcGFjZV9wb3NpdGlvbjsgIC8vIDAgZm9yIG5vbmUNCisgIH07DQorICBzdGQ6OnZlY3RvcjxIeXBoZW5Qb3NpdGlvbj4gaHlwaGVuX3Bvc2l0aW9uczsNCisgIEh5cGhlblBvc2l0aW9uIGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uOw0KKyAgYm9vbCBjdXJyZW50X2h5cGhlbl9wb3NpdGlvbl9pc192YWxpZCA9IGZhbHNlOw0KKyAgY29uc3QgYmFzZTo6Y2hhcjE2IGtQZGZpdW1IeXBoZW5FT0wgPSAweGZmZmU7DQorDQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRleHQtPnNpemUoKTsgKytpKSB7DQorICAgIGNvbnN0IGJhc2U6OmNoYXIxNiYgY3VycmVudF9jaGFyID0gKCp0ZXh0KVtpXTsNCisgICAgaWYgKGN1cnJlbnRfY2hhciA9PSBrUGRmaXVtSHlwaGVuRU9MKSB7DQorICAgICAgaWYgKGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uX2lzX3ZhbGlkKQ0KKyAgICAgICAgaHlwaGVuX3Bvc2l0aW9ucy5wdXNoX2JhY2soY3VycmVudF9oeXBoZW5fcG9zaXRpb24pOw0KKyAgICAgIGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uID0gSHlwaGVuUG9zaXRpb24oKTsNCisgICAgICBjdXJyZW50X2h5cGhlbl9wb3NpdGlvbi5wb3NpdGlvbiA9IGk7DQorICAgICAgY3VycmVudF9oeXBoZW5fcG9zaXRpb25faXNfdmFsaWQgPSB0cnVlOw0KKyAgICB9IGVsc2UgaWYgKElzV2hpdGVzcGFjZShjdXJyZW50X2NoYXIpKSB7DQorICAgICAgaWYgKGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uX2lzX3ZhbGlkKSB7DQorICAgICAgICBpZiAoY3VycmVudF9jaGFyICE9IEwnXHInICYmIGN1cnJlbnRfY2hhciAhPSBMJ1xuJykNCisgICAgICAgICAgY3VycmVudF9oeXBoZW5fcG9zaXRpb24ubmV4dF93aGl0ZXNwYWNlX3Bvc2l0aW9uID0gaTsNCisgICAgICAgIGh5cGhlbl9wb3NpdGlvbnMucHVzaF9iYWNrKGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uKTsNCisgICAgICAgIGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uX2lzX3ZhbGlkID0gZmFsc2U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoY3VycmVudF9oeXBoZW5fcG9zaXRpb25faXNfdmFsaWQpDQorICAgIGh5cGhlbl9wb3NpdGlvbnMucHVzaF9iYWNrKGN1cnJlbnRfaHlwaGVuX3Bvc2l0aW9uKTsNCisNCisgIC8vIFdpdGggYWxsIHRoZSBoeXBoZW4gcG9zaXRpb25zLCBkbyB0aGUgc2VhcmNoIGFuZCByZXBsYWNlLg0KKyAgd2hpbGUgKCFoeXBoZW5fcG9zaXRpb25zLmVtcHR5KCkpIHsNCisgICAgc3RhdGljIGNvbnN0IGJhc2U6OmNoYXIxNiBrQ3JbXSA9IHtMJ1xyJywgTCdcMCd9Ow0KKyAgICBjb25zdCBIeXBoZW5Qb3NpdGlvbiYgcG9zaXRpb24gPSBoeXBoZW5fcG9zaXRpb25zLmJhY2soKTsNCisgICAgaWYgKHBvc2l0aW9uLm5leHRfd2hpdGVzcGFjZV9wb3NpdGlvbiAhPSAwKSB7DQorICAgICAgKCp0ZXh0KVtwb3NpdGlvbi5uZXh0X3doaXRlc3BhY2VfcG9zaXRpb25dID0gTCdcbic7DQorICAgICAgdGV4dC0+aW5zZXJ0KHBvc2l0aW9uLm5leHRfd2hpdGVzcGFjZV9wb3NpdGlvbiwga0NyKTsNCisgICAgfQ0KKyAgICB0ZXh0LT5lcmFzZShwb3NpdGlvbi5wb3NpdGlvbiwgMSk7DQorICAgIGh5cGhlbl9wb3NpdGlvbnMucG9wX2JhY2soKTsNCisgIH0NCisNCisgIC8vIEFkb2JlIFJlYWRlciBhbHNvIGdldCByaWQgb2YgdHJhaWxpbmcgc3BhY2VzIHJpZ2h0IGJlZm9yZSBhIENSTEYuDQorICBzdGF0aWMgY29uc3QgYmFzZTo6Y2hhcjE2IGtTcGFjZUNyQ25bXSA9IHtMJyAnLCBMJ1xyJywgTCdcbicsIEwnXDAnfTsNCisgIHN0YXRpYyBjb25zdCBiYXNlOjpjaGFyMTYga0NyQ25bXSA9IHtMJ1xyJywgTCdcbicsIEwnXDAnfTsNCisgIFJlcGxhY2VTdWJzdHJpbmdzQWZ0ZXJPZmZzZXQodGV4dCwgMCwga1NwYWNlQ3JDbiwga0NyQ24pOw0KK30NCisNCisvLyBSZXBsYWNlIENSL0xGIHdpdGgganVzdCBMRiBvbiBQT1NJWC4NCit2b2lkIEZvcm1hdFN0cmluZ0Zvck9TKGJhc2U6OnN0cmluZzE2KiB0ZXh0KSB7DQorI2lmIGRlZmluZWQoT1NfUE9TSVgpDQorICBzdGF0aWMgY29uc3QgYmFzZTo6Y2hhcjE2IGtDcltdID0ge0wnXHInLCBMJ1wwJ307DQorICBzdGF0aWMgY29uc3QgYmFzZTo6Y2hhcjE2IGtCbGFua1tdID0ge0wnXDAnfTsNCisgIGJhc2U6OlJlcGxhY2VDaGFycygqdGV4dCwga0NyLCBrQmxhbmssIHRleHQpOw0KKyNlbGlmIGRlZmluZWQoT1NfV0lOKQ0KKyAgLy8gRG8gbm90aGluZw0KKyNlbHNlDQorICBOT1RJTVBMRU1FTlRFRCgpOw0KKyNlbmRpZg0KK30NCisNCit9ICAvLyBuYW1lc3BhY2UNCisNCitib29sIEluaXRpYWxpemVTREsodm9pZCogZGF0YSkgew0KKyAgRlBERl9Jbml0TGlicmFyeShkYXRhKTsNCisNCisjaWYgZGVmaW5lZChPU19MSU5VWCkNCisgIC8vIEZvbnQgbG9hZGluZyBkb2Vzbid0IHdvcmsgaW4gdGhlIHJlbmRlcmVyIHNhbmRib3ggaW4gTGludXguDQorICBGUERGX1NldFN5c3RlbUZvbnRJbmZvKCZnX2ZvbnRfaW5mbyk7DQorI2VuZGlmDQorDQorICBGU0RLX1NldE9PTUhhbmRsZXIoJmdfb29tX2luZm8pOw0KKyAgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoJmdfdW5zdXBwb3JlZF9pbmZvKTsNCisNCisgIHJldHVybiB0cnVlOw0KK30NCisNCit2b2lkIFNodXRkb3duU0RLKCkgew0KKyAgRlBERl9EZXN0cm95TGlicmFyeSgpOw0KK30NCisNCitQREZFbmdpbmUqIFBERkVuZ2luZTo6Q3JlYXRlKFBERkVuZ2luZTo6Q2xpZW50KiBjbGllbnQpIHsNCisgIHJldHVybiBuZXcgUERGaXVtRW5naW5lKGNsaWVudCk7DQorfQ0KKw0KK1BERml1bUVuZ2luZTo6UERGaXVtRW5naW5lKFBERkVuZ2luZTo6Q2xpZW50KiBjbGllbnQpDQorICAgIDogY2xpZW50XyhjbGllbnQpLA0KKyAgICAgIGN1cnJlbnRfem9vbV8oMS4wKSwNCisgICAgICBjdXJyZW50X3JvdGF0aW9uXygwKSwNCisgICAgICBkb2NfbG9hZGVyXyh0aGlzKSwNCisgICAgICBwYXNzd29yZF90cmllc19yZW1haW5pbmdfKDApLA0KKyAgICAgIGRvY18oTlVMTCksDQorICAgICAgZm9ybV8oTlVMTCksDQorICAgICAgZGVmZXJfcGFnZV91bmxvYWRfKGZhbHNlKSwNCisgICAgICBzZWxlY3RpbmdfKGZhbHNlKSwNCisgICAgICBtb3VzZV9kb3duX3N0YXRlXyhQREZpdW1QYWdlOjpOT05TRUxFQ1RBQkxFX0FSRUEsDQorICAgICAgICAgICAgICAgICAgICAgICAgUERGaXVtUGFnZTo6TGlua1RhcmdldCgpKSwNCisgICAgICBuZXh0X3BhZ2VfdG9fc2VhcmNoXygtMSksDQorICAgICAgbGFzdF9wYWdlX3RvX3NlYXJjaF8oLTEpLA0KKyAgICAgIGxhc3RfY2hhcmFjdGVyX2luZGV4X3RvX3NlYXJjaF8oLTEpLA0KKyAgICAgIGN1cnJlbnRfZmluZF9pbmRleF8oLTEpLA0KKyAgICAgIHJlc3VtZV9maW5kX2luZGV4XygtMSksDQorICAgICAgcGVybWlzc2lvbnNfKDApLA0KKyAgICAgIGZwZGZfYXZhaWxhYmlsaXR5XyhOVUxMKSwNCisgICAgICBuZXh0X3RpbWVyX2lkXygwKSwNCisgICAgICBsYXN0X3BhZ2VfbW91c2VfZG93bl8oLTEpLA0KKyAgICAgIGZpcnN0X3Zpc2libGVfcGFnZV8oLTEpLA0KKyAgICAgIG1vc3RfdmlzaWJsZV9wYWdlXygtMSksDQorICAgICAgY2FsbGVkX2RvX2RvY3VtZW50X2FjdGlvbl8oZmFsc2UpLA0KKyAgICAgIHJlbmRlcl9ncmF5c2NhbGVfKGZhbHNlKSwNCisgICAgICBwcm9ncmVzc2l2ZV9wYWludF90aW1lb3V0XygwKSwNCisgICAgICBnZXR0aW5nX3Bhc3N3b3JkXyhmYWxzZSkgew0KKyAgZmluZF9mYWN0b3J5Xy5Jbml0aWFsaXplKHRoaXMpOw0KKyAgcGFzc3dvcmRfZmFjdG9yeV8uSW5pdGlhbGl6ZSh0aGlzKTsNCisNCisgIGZpbGVfYWNjZXNzXy5tX0ZpbGVMZW4gPSAwOw0KKyAgZmlsZV9hY2Nlc3NfLm1fR2V0QmxvY2sgPSAmR2V0QmxvY2s7DQorICBmaWxlX2FjY2Vzc18ubV9QYXJhbSA9ICZkb2NfbG9hZGVyXzsNCisNCisgIGZpbGVfYXZhaWxhYmlsaXR5Xy52ZXJzaW9uID0gMTsNCisgIGZpbGVfYXZhaWxhYmlsaXR5Xy5Jc0RhdGFBdmFpbCA9ICZJc0RhdGFBdmFpbDsNCisgIGZpbGVfYXZhaWxhYmlsaXR5Xy5sb2FkZXIgPSAmZG9jX2xvYWRlcl87DQorDQorICBkb3dubG9hZF9oaW50c18udmVyc2lvbiA9IDE7DQorICBkb3dubG9hZF9oaW50c18uQWRkU2VnbWVudCA9ICZBZGRTZWdtZW50Ow0KKyAgZG93bmxvYWRfaGludHNfLmxvYWRlciA9ICZkb2NfbG9hZGVyXzsNCisNCisgIC8vIEluaXRpYWxpemUgRlBERl9GT1JNRklMTElORk8gbWVtYmVyIHZhcmlhYmxlcy4gIERlcml2aW5nIGZyb20gdGhpcyBzdHJ1Y3QNCisgIC8vIGFsbG93cyB0aGUgc3RhdGljIGNhbGxiYWNrcyB0byBiZSBhYmxlIHRvIGNhc3QgdGhlIEZQREZfRk9STUZJTExJTkZPIGluDQorICAvLyBjYWxsYmFja3MgdG8gb3Vyc2VsZiBpbnN0ZWFkIG9mIG1haW50YWluaW5nIGEgbWFwIG9mIHRoZW0gdG8NCisgIC8vIFBERml1bUVuZ2luZS4NCisgIEZQREZfRk9STUZJTExJTkZPOjp2ZXJzaW9uID0gMTsNCisgIEZQREZfRk9STUZJTExJTkZPOjptX3BKc1BsYXRmb3JtID0gdGhpczsNCisgIEZQREZfRk9STUZJTExJTkZPOjpSZWxlYXNlID0gTlVMTDsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfSW52YWxpZGF0ZSA9IEZvcm1fSW52YWxpZGF0ZTsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfT3V0cHV0U2VsZWN0ZWRSZWN0ID0gRm9ybV9PdXRwdXRTZWxlY3RlZFJlY3Q7DQorICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX1NldEN1cnNvciA9IEZvcm1fU2V0Q3Vyc29yOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9TZXRUaW1lciA9IEZvcm1fU2V0VGltZXI7DQorICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX0tpbGxUaW1lciA9IEZvcm1fS2lsbFRpbWVyOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRMb2NhbFRpbWUgPSBGb3JtX0dldExvY2FsVGltZTsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfT25DaGFuZ2UgPSBGb3JtX09uQ2hhbmdlOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRQYWdlID0gRm9ybV9HZXRQYWdlOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRDdXJyZW50UGFnZSA9IEZvcm1fR2V0Q3VycmVudFBhZ2U7DQorICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX0dldFJvdGF0aW9uID0gRm9ybV9HZXRSb3RhdGlvbjsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfRXhlY3V0ZU5hbWVkQWN0aW9uID0gRm9ybV9FeGVjdXRlTmFtZWRBY3Rpb247DQorICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX1NldFRleHRGaWVsZEZvY3VzID0gRm9ybV9TZXRUZXh0RmllbGRGb2N1czsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfRG9VUklBY3Rpb24gPSBGb3JtX0RvVVJJQWN0aW9uOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9Eb0dvVG9BY3Rpb24gPSBGb3JtX0RvR29Ub0FjdGlvbjsNCisjaWZkZWYgX1RFU1RfWEZBDQorICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX0VtYWlsVG8gPSBGb3JtX0VtYWlsVG87DQorICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX0Rpc3BsYXlDYXJldCA9IEZvcm1fRGlzcGxheUNhcmV0Ow0KKyAgLy9GUERGX0ZPUk1GSUxMSU5GTzo6RkZJX0dldEN1ckRvY3VtZW50SW5kZXggPSBGb3JtX0dldEN1ckRvY3VtZW50SW5kZXg7DQorICAvL0ZQREZfRk9STUZJTExJTkZPOjpGRklfR2V0RG9jdW1lbnRDb3VudCA9IEZvcm1fR2V0RG9jdW1lbnRDb3VudDsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfU2V0Q3VycmVudFBhZ2UgPSBGb3JtX1NldEN1cnJlbnRQYWdlOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRDdXJyZW50UGFnZUluZGV4ID0gRm9ybV9HZXRDdXJyZW50UGFnZUluZGV4Ow0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRQYWdlVmlld1JlY3QgPSBGb3JtX0dldFBhZ2VWaWV3UmVjdDsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfR2V0UGxhdGZvcm0gPSBGb3JtX0dldFBsYXRmb3JtOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9Qb3B1cE1lbnUgPSBGb3JtX1BvcHVwTWVudTsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfUG9zdFJlcXVlc3RVUkwgPSBGb3JtX1Bvc3RSZXF1ZXN0VVJMOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9QdXRSZXF1ZXN0VVJMID0gRm9ybV9QdXRSZXF1ZXN0VVJMOw0KKy8vICBGUERGX0ZPUk1GSUxMSU5GTzo6RkZJX1Nob3dGaWxlRGlhbG9nID0gRm9ybV9TaG93RmlsZURpYWxvZzsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfVXBsb2FkVG8gPSBGb3JtX1VwbG9hZFRvOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9Eb3dubG9hZEZyb21VUkwgPSBGb3JtX0Rvd25sb2FkRnJvbVVSTDsNCisgLy8gRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRGaWxlUGF0aCA9IE15Rm9ybV9HZXRGaWxlUGF0aDsNCisgIEZQREZfRk9STUZJTExJTkZPOjpGRklfT3BlbkZpbGUgPSBGb3JtX09wZW5GaWxlOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9Hb3RvVVJMID0gRm9ybV9Hb3RvVVJMOw0KKyAgRlBERl9GT1JNRklMTElORk86OkZGSV9HZXRMYW5ndWFnZSA9IEZvcm1fR2V0TGFuZ3VhZ2U7DQorI2VuZGlmIC8vIF9URVNUX1hGQQ0KKyAgSVBERl9KU1BMQVRGT1JNOjp2ZXJzaW9uID0gMTsNCisgIElQREZfSlNQTEFURk9STTo6YXBwX2FsZXJ0ID0gRm9ybV9BbGVydDsNCisgIElQREZfSlNQTEFURk9STTo6YXBwX2JlZXAgPSBGb3JtX0JlZXA7DQorICBJUERGX0pTUExBVEZPUk06OmFwcF9yZXNwb25zZSA9IEZvcm1fUmVzcG9uc2U7DQorICBJUERGX0pTUExBVEZPUk06OkRvY19nZXRGaWxlUGF0aCA9IEZvcm1fR2V0RmlsZVBhdGg7DQorICBJUERGX0pTUExBVEZPUk06OkRvY19tYWlsID0gRm9ybV9NYWlsOw0KKyAgSVBERl9KU1BMQVRGT1JNOjpEb2NfcHJpbnQgPSBGb3JtX1ByaW50Ow0KKyAgSVBERl9KU1BMQVRGT1JNOjpEb2Nfc3VibWl0Rm9ybSA9IEZvcm1fU3VibWl0Rm9ybTsNCisgIElQREZfSlNQTEFURk9STTo6RG9jX2dvdG9QYWdlID0gRm9ybV9Hb3RvUGFnZTsNCisgIElQREZfSlNQTEFURk9STTo6RmllbGRfYnJvd3NlID0gRm9ybV9Ccm93c2U7DQorDQorICBJRlNES19QQVVTRTo6dmVyc2lvbiA9IDE7DQorICBJRlNES19QQVVTRTo6dXNlciA9IE5VTEw7DQorICBJRlNES19QQVVTRTo6TmVlZFRvUGF1c2VOb3cgPSBQYXVzZV9OZWVkVG9QYXVzZU5vdzsNCit9DQorDQorUERGaXVtRW5naW5lOjp+UERGaXVtRW5naW5lKCkgew0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWdlc18uc2l6ZSgpOyArK2kpDQorICAgIHBhZ2VzX1tpXS0+VW5sb2FkKCk7DQorDQorICBpZiAoZG9jXykgew0KKyAgICBpZiAoZm9ybV8pIHsNCisgICAgICBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKGZvcm1fLCBGUERGRE9DX0FBQ1RJT05fV0MpOw0KKyAgICB9DQorICAgIEZQREZfQ2xvc2VEb2N1bWVudChkb2NfKTsNCisJaWYgKGZvcm1fKSB7DQorCQlGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb3VtZW50KGZvcm1fKTsNCisJfQ0KKyAgfQ0KKw0KKyAgaWYgKGZwZGZfYXZhaWxhYmlsaXR5XykNCisgICAgRlBERkF2YWlsX0Rlc3Ryb3koZnBkZl9hdmFpbGFiaWxpdHlfKTsNCisNCisgIFNUTERlbGV0ZUVsZW1lbnRzKCZwYWdlc18pOw0KK30NCisNCisjaWZkZWYgX1RFU1RfWEZBDQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfRklMRSB7DQorCUZQREZfRklMRUhBTkRMRVIgZmlsZUhhbmRsZXI7DQorCUZJTEUqIGZpbGU7DQorfUZQREZfRklMRTsNCisNCisNCit2b2lkCQlTYW1wbGVfUmVsZWFzZShGUERGX0xQVk9JRCBjbGllbnREYXRhKSB7DQorCWlmICghY2xpZW50RGF0YSkgcmV0dXJuOw0KKw0KKwlmY2xvc2UoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlKTsNCisJZGVsZXRlICgoRlBERl9GSUxFKiljbGllbnREYXRhKTsNCit9DQorDQorRlBERl9EV09SRAlTYW1wbGVfR2V0U2l6ZShGUERGX0xQVk9JRCBjbGllbnREYXRhKSB7DQorCWlmICghY2xpZW50RGF0YSkgcmV0dXJuIDA7DQorDQorCWxvbmcgY3VyUG9zID0gZnRlbGwoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlKTsNCisJZnNlZWsoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlLCAwLCBTRUVLX0VORCk7DQorCWxvbmcgc2l6ZSA9IGZ0ZWxsKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSk7DQorCWZzZWVrKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSwgY3VyUG9zLCBTRUVLX1NFVCk7DQorDQorCXJldHVybiAoRlBERl9EV09SRClzaXplOw0KK30NCisNCitGUERGX1JFU1VMVAlTYW1wbGVfUmVhZEJsb2NrKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgb2Zmc2V0LCBGUERGX0xQVk9JRCBidWZmZXIsIEZQREZfRFdPUkQgc2l6ZSkgew0KKwlpZiAoIWNsaWVudERhdGEpIHJldHVybiAtMTsNCisNCisJZnNlZWsoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlLCAobG9uZylvZmZzZXQsIFNFRUtfU0VUKTsNCisJc2l6ZV90IHJlYWRTaXplID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplLCAoKEZQREZfRklMRSopY2xpZW50RGF0YSktPmZpbGUpOw0KKwlyZXR1cm4gcmVhZFNpemUgPT0gc2l6ZSA/IDAgOiAtMTsNCit9DQorDQorRlBERl9SRVNVTFQJU2FtcGxlX1dyaXRlQmxvY2soRlBERl9MUFZPSUQgY2xpZW50RGF0YSwgRlBERl9EV09SRCBvZmZzZXQsIEZQREZfTFBDVk9JRCBidWZmZXIsIEZQREZfRFdPUkQgc2l6ZSkgew0KKwlpZiAoIWNsaWVudERhdGEpIHJldHVybiAtMTsNCisNCisJZnNlZWsoKChGUERGX0ZJTEUqKWNsaWVudERhdGEpLT5maWxlLCAobG9uZylvZmZzZXQsIFNFRUtfU0VUKTsNCisJLy9Xcml0ZSBkYXRhDQorCXNpemVfdCB3cml0ZVNpemUgPSBmd3JpdGUoYnVmZmVyLCAxLCBzaXplLCAoKEZQREZfRklMRSopY2xpZW50RGF0YSktPmZpbGUpOw0KKwlyZXR1cm4gd3JpdGVTaXplID09IHNpemUgPyAwIDogLTE7DQorfQ0KKw0KK0ZQREZfUkVTVUxUCVNhbXBsZV9GbHVzaChGUERGX0xQVk9JRCBjbGllbnREYXRhKSB7DQorCWlmICghY2xpZW50RGF0YSkgcmV0dXJuIC0xOw0KKw0KKwkvL0ZsdXNoIGZpbGUNCisJZmZsdXNoKCgoRlBERl9GSUxFKiljbGllbnREYXRhKS0+ZmlsZSk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitGUERGX1JFU1VMVAlTYW1wbGVfVHJ1bmNhdGUoRlBERl9MUFZPSUQgY2xpZW50RGF0YSwgRlBERl9EV09SRCBzaXplKSB7DQorCXJldHVybiAwOw0KK30NCisNCisNCit2b2lkIFBERml1bUVuZ2luZTo6Rm9ybV9FbWFpbFRvKEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywNCisJRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsDQorCUZQREZfV0lERVNUUklORyB0bywNCisJRlBERl9XSURFU1RSSU5HIHN1YmplY3QsDQorCUZQREZfV0lERVNUUklORyBjYywNCisJRlBERl9XSURFU1RSSU5HIGJjYywNCisJRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UpIHsNCisJc3RkOjpzdHJpbmcgdG9fc3RyID0NCisJCWJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4odG8pKTsNCisJc3RkOjpzdHJpbmcgc3ViamVjdF9zdHIgPQ0KKwkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPihzdWJqZWN0KSk7DQorCXN0ZDo6c3RyaW5nIGNjX3N0ciA9DQorCQliYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KGNjKSk7DQorCXN0ZDo6c3RyaW5nIGJjY19zdHIgPQ0KKwkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPihiY2MpKTsNCisJc3RkOjpzdHJpbmcgbWVzc2FnZV9zdHIgPQ0KKwkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPihtZXNzYWdlKSk7DQorDQorCVBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocFRoaXMpOw0KKwllbmdpbmUtPmNsaWVudF8tPkVtYWlsKHRvX3N0ciwgY2Nfc3RyLCBiY2Nfc3RyLCBzdWJqZWN0X3N0ciwgbWVzc2FnZV9zdHIpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Rm9ybV9EaXNwbGF5Q2FyZXQoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLA0KKwkJCQkJICAgRlBERl9QQUdFIHBhZ2UsIEZQREZfQk9PTCBiVmlzaWJsZSwgDQorCQkJCQkgICBkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKSB7DQorCVBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocFRoaXMpOw0KKwllbmdpbmUtPmNsaWVudF8tPlVwZGF0ZUN1cnNvcihQUF9DVVJTT1JUWVBFX0lCRUFNKTsNCisJc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHRpY2ttYXJrczsNCisJcHA6OlJlY3QgcmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOw0KKwl0aWNrbWFya3MucHVzaF9iYWNrKHJlY3QpOw0KKwllbmdpbmUtPmNsaWVudF8tPlVwZGF0ZVRpY2tNYXJrcyh0aWNrbWFya3MpOw0KK30NCisNCisvL2ludCBQREZpdW1FbmdpbmU6OkZvcm1fR2V0Q3VyRG9jdW1lbnRJbmRleChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpIHsNCisvLwlQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBUaGlzKTsNCisvLwllbmdpbmUtPmNsaWVudF8tPlJ1bkpTQ21kKCJhbGVydChcIkdldEN1ckRvY3VtZW50SW5kZXhcIikiKTsNCisvLwlyZXR1cm4gMDsNCisvL30NCisvLw0KKy8vaW50IFBERml1bUVuZ2luZTo6Rm9ybV9HZXREb2N1bWVudENvdW50KEZQREZfRk9STUZJTExJTkZPKiBwVGhpcykgew0KKy8vCVBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocFRoaXMpOw0KKy8vCWVuZ2luZS0+Y2xpZW50Xy0+UnVuSlNDbWQoImFsZXJ0KFwiR2V0Q3VyRG9jdW1lbnRDb3VudFwiKSIpOw0KKy8vCXJldHVybiAwOw0KKy8vfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX1NldEN1cnJlbnRQYWdlKEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGlDdXJQYWdlKSB7DQorCVBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocFRoaXMpOw0KKwlwcDo6UmVjdCBwYWdlVmlld1JlY3QgPSBlbmdpbmUtPkdldFBhZ2VDb250ZW50c1JlY3QoaUN1clBhZ2UpOw0KKwllbmdpbmUtPlNjcm9sbGVkVG9ZUG9zaXRpb24ocGFnZVZpZXdSZWN0LmhlaWdodCgpKTsNCisJcHA6OlBvaW50IHBvcygxLCBwYWdlVmlld1JlY3QuaGVpZ2h0KCkpOw0KKwllbmdpbmUtPlNldFNjcm9sbFBvc2l0aW9uKHBvcyk7DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkZvcm1fR2V0Q3VycmVudFBhZ2VJbmRleChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsNCisJLy9pbnQgcGFnZUNvdW50ID0gRlBERl9HZXRQYWdlQ291bnQoZG9jdW1lbnQpOw0KKwlpbnQgcGFnZUluZGV4ID0gLTE7DQorCVBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocFRoaXMpOw0KKwlwYWdlSW5kZXggPSBlbmdpbmUtPkdldE1vc3RWaXNpYmxlUGFnZSgpOw0KKwlyZXR1cm4gcGFnZUluZGV4Ow0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Rm9ybV9HZXRQYWdlVmlld1JlY3QoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLA0KKwkJCQkJCSAgRlBERl9QQUdFIHBhZ2UsIA0KKwkJCQkJCSAgZG91YmxlKiBsZWZ0LCBkb3VibGUqIHRvcCwgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pIHsNCisJUERGaXVtRW5naW5lKiBlbmdpbmUgPSBzdGF0aWNfY2FzdDxQREZpdW1FbmdpbmUqPihwVGhpcyk7DQorCWludCBwYWdlX2luZGV4ID0gZW5naW5lLT5HZXRNb3N0VmlzaWJsZVBhZ2UoKTsNCisJcHA6OlJlY3QgcGFnZVZpZXdSZWN0ID0gZW5naW5lLT5HZXRQYWdlQ29udGVudHNSZWN0KHBhZ2VfaW5kZXgpOw0KKwkNCisJKmxlZnQgPSBwYWdlVmlld1JlY3QueCgpOw0KKwkqcmlnaHQgPSBwYWdlVmlld1JlY3Qud2lkdGgoKSArIHBhZ2VWaWV3UmVjdC54KCk7DQorCSp0b3AgPSBwYWdlVmlld1JlY3QueSgpOw0KKwkqYm90dG9tID0gcGFnZVZpZXdSZWN0LmhlaWdodCgpOw0KKw0KKwlzdGQ6OnN0cmluZyBqYXZhc2NyaXB0ID0gImFsZXJ0KFwiUGFnZVZpZXdSZWN0OiIgDQorCQkrIGJhc2U6OkRvdWJsZVRvU3RyaW5nKCpsZWZ0KSArICIsIg0KKwkJKyBiYXNlOjpEb3VibGVUb1N0cmluZygqcmlnaHQpICsgIiwiDQorCQkrIGJhc2U6OkRvdWJsZVRvU3RyaW5nKCp0b3ApICsgIiwiDQorCQkrIGJhc2U6OkRvdWJsZVRvU3RyaW5nKCpib3R0b20pICsgIiwiDQorCQkrICJcIikiOw0KKyANCit9DQorDQoraW50IFBERml1bUVuZ2luZTo6Rm9ybV9HZXRQbGF0Zm9ybShGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsDQorCQkJCQkgIHZvaWQqIHBsYXRmb3JtLA0KKwkJCQkJICBpbnQgbGVuZ3RoKSB7DQorCWludCBwbGF0Zm9ybV9mbGFnID0gLTE7DQorI2lmIGRlZmluZWQoV0lOMzIpDQorCXBsYXRmb3JtX2ZsYWcgPSAwOw0KKyNlbGlmIGRlZmluZWQoX19saW51eF9fKQ0KKwlwbGF0Zm9ybV9mbGFnID0gMTsNCisjZWxzZQ0KKwlwbGF0Zm9ybV9mbGFnID0gMjsNCisjZW5kaWYNCisJc3RkOjpzdHJpbmcgamF2YXNjcmlwdCA9ICJhbGVydChcIlBsYXRmb3JtOiIgDQorCQkrIGJhc2U6OkRvdWJsZVRvU3RyaW5nKHBsYXRmb3JtX2ZsYWcpDQorCQkrICJcIikiOw0KKwkvL3BsYXRmb3JtID0gbmV3IGNoYXJbM107DQorCS8vY2hhciB0ZW1bMTBdID0gIldJTiI7DQorCS8vc3RybmNweSgoY2hhciopcGxhdGZvcm0sIHRlbSwgMyk7DQorDQorCXJldHVybiAzOw0KK30NCisNCitGUERGX0JPT0wgUERGaXVtRW5naW5lOjpGb3JtX1BvcHVwTWVudShGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsDQorCQkJCQlGUERGX1BBR0UgcGFnZSwgDQorCQkJCQlGUERGX1dJREdFVCBoV2lkZ2V0LCANCisJCQkJCWludCBtZW51RmxhZywgZmxvYXQgeCwgZmxvYXQgeSkgew0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KK0ZQREZfQk9PTCBQREZpdW1FbmdpbmU6OkZvcm1fUG9zdFJlcXVlc3RVUkwoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsDQorCQkJCQkJIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0NvbnRlbnRUeXBlLA0KKwkJCQkJCSBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUsIEZQREZfV0lERVNUUklORyB3c0hlYWRlciwgRlBERl9CU1RSKiByZXNwb25lKSB7DQorCXN0ZDo6c3RyaW5nIHVybF9zdHIgPQ0KKwkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPih3c1VSTCkpOw0KKwlzdGQ6OnN0cmluZyBkYXRhX3N0ciA9DQorCQliYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KHdzRGF0YSkpOw0KKwlzdGQ6OnN0cmluZyBjb250ZW50X3R5cGVfc3RyID0NCisJCWJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4od3NDb250ZW50VHlwZSkpOw0KKwlzdGQ6OnN0cmluZyBlbmNvZGVfc3RyID0NCisJCWJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4od3NFbmNvZGUpKTsNCisJc3RkOjpzdHJpbmcgaGVhZGVyX3N0ciA9DQorCQliYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KHdzSGVhZGVyKSk7DQorDQorCXN0ZDo6c3RyaW5nIGphdmFzY3JpcHQgPSAiYWxlcnQoXCJQb3N0OiINCisJCSsgdXJsX3N0ciArICIsIiArIGRhdGFfc3RyICsgIiwiICsgY29udGVudF90eXBlX3N0ciArICIsIg0KKwkJKyBlbmNvZGVfc3RyICsgIiwiICsgaGVhZGVyX3N0ciANCisJCSsgIlwiKSI7DQorCXJldHVybiB0cnVlOw0KK30NCisNCitGUERGX0JPT0wgUERGaXVtRW5naW5lOjpGb3JtX1B1dFJlcXVlc3RVUkwoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLA0KKwkJCQkJCUZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzRW5jb2RlKSB7DQorCXN0ZDo6c3RyaW5nIHVybF9zdHIgPQ0KKwkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPih3c1VSTCkpOw0KKwlzdGQ6OnN0cmluZyBkYXRhX3N0ciA9DQorCQliYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KHdzRGF0YSkpOw0KKwlzdGQ6OnN0cmluZyBlbmNvZGVfc3RyID0NCisJCWJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4od3NFbmNvZGUpKTsNCisNCisJc3RkOjpzdHJpbmcgamF2YXNjcmlwdCA9ICJhbGVydChcIlB1dDoiDQorCQkrIHVybF9zdHIgKyAiLCIgKyBkYXRhX3N0ciArICIsIiArIGVuY29kZV9zdHIgDQorCQkrICJcIikiOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLy9GUERGX0JPT0wgUERGaXVtRW5naW5lOjpGb3JtX1Nob3dGaWxlRGlhbG9nKEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIHdzVGl0bGUsIEZQREZfV0lERVNUUklORyB3c0ZpbHRlciwgRlBERl9CT09MIGlzT3BlbiwgRlBERl9TVFJJTkdIQU5ETEUgcGF0aEFycikgew0KKy8vCWludCB0ZW0gPSAxOw0KKy8vCXRlbSsrOw0KKy8vCXJldHVybiBmYWxzZTsNCisvL30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Rm9ybV9VcGxvYWRUbyhGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLCBpbnQgZmlsZUZsYWcsIEZQREZfV0lERVNUUklORyB1cGxvYWRUbykgew0KKwlzdGQ6OnN0cmluZyB0b19zdHIgPQ0KKwkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPih1cGxvYWRUbykpOw0KKw0KK30NCisNCitGUERGX0xQRklMRUhBTkRMRVIgUERGaXVtRW5naW5lOjpGb3JtX0Rvd25sb2FkRnJvbVVSTChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyBVUkwpIHsNCisJc3RkOjpzdHJpbmcgdXJsX3N0ciA9DQorCQliYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KFVSTCkpOw0KKw0KKw0KKwkvLyBHZXQgVVJMIGRhdGEuLi4NCisJRklMRSogZmlsZSA9IGZvcGVuKEZYUUFfVEVTVEZJTEUoImRvd25sb2FkdGVzdC50ZW0iKSwgInciKTsNCisJRlBERl9GSUxFKiBwRmlsZUhhbmRlciA9IG5ldyBGUERGX0ZJTEU7DQorCXBGaWxlSGFuZGVyLT5maWxlID0gZmlsZTsNCisJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLmNsaWVudERhdGEgPSBwRmlsZUhhbmRlcjsNCisJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLkZsdXNoID0gU2FtcGxlX0ZsdXNoOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuR2V0U2l6ZSA9IFNhbXBsZV9HZXRTaXplOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuUmVhZEJsb2NrID0gU2FtcGxlX1JlYWRCbG9jazsNCisJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLlJlbGVhc2UgPSBTYW1wbGVfUmVsZWFzZTsNCisJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLlRydW5jYXRlID0gU2FtcGxlX1RydW5jYXRlOw0KKwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuV3JpdGVCbG9jayA9IFNhbXBsZV9Xcml0ZUJsb2NrOw0KKw0KKwlyZXR1cm4gJnBGaWxlSGFuZGVyLT5maWxlSGFuZGxlcjsNCit9DQorDQorLy9GUERGX0JPT0wgUERGaXVtRW5naW5lOjpNeUZvcm1fR2V0RmlsZVBhdGgoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIsIHZvaWQqIGZpbGVQYXRoLCBpbnQgbGVuZ3RoKSB7DQorLy8JLy9zdGQ6OnN0cmluZyBmaWxlUGF0aCA9IGVuZ2luZS0+Y2xpZW50Xy0+RmlsZU9wZW4oZmlsZUZsYWcpOw0KKy8vCWlmIChmaWxlUGF0aCA9PSBOVUxMKSB7DQorLy8JCXN0ZDo6c3RyaW5nIGphdmFzY3JpcHQgPSAiYWxlcnQoXCJHZXRGaWxlUGF0aDpOVUxMXCIpIjsNCisvLwkJUERGaXVtRW5naW5lKiBlbmdpbmUgPSBzdGF0aWNfY2FzdDxQREZpdW1FbmdpbmUqPihwVGhpcyk7DQorLy8JCWVuZ2luZS0+Y2xpZW50Xy0+UnVuSlNDbWQoamF2YXNjcmlwdCk7DQorLy8JCXJldHVybiBmYWxzZTsNCisvLwl9DQorLy8Jc3RkOjpzdHJpbmcgZmlsZVBhdGhfc3RyID0gKGNoYXIqKWZpbGVQYXRoOw0KKy8vDQorLy8Jc3RkOjpzdHJpbmcgamF2YXNjcmlwdCA9ICJhbGVydChcIkdldEZpbGVQYXRoOiIgKyBmaWxlUGF0aF9zdHIgKyAiXCIpIjsNCisvLwlQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBUaGlzKTsNCisvLwllbmdpbmUtPmNsaWVudF8tPlJ1bkpTQ21kKGphdmFzY3JpcHQpOw0KKy8vDQorLy8JRklMRSogZmlsZSA9IGZvcGVuKEZYUUFfVEVTVEZJTEUoInRlbS54ZHAiKSwgInciKTsNCisvLwlGUERGX0ZJTEUqIHBGaWxlSGFuZGVyID0gbmV3IEZQREZfRklMRTsNCisvLwlwRmlsZUhhbmRlci0+ZmlsZSA9IGZpbGU7DQorLy8JcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLmNsaWVudERhdGEgPSBwRmlsZUhhbmRlcjsNCisvLwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuRmx1c2ggPSBTYW1wbGVfRmx1c2g7DQorLy8JcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLkdldFNpemUgPSBTYW1wbGVfR2V0U2l6ZTsNCisvLwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuUmVhZEJsb2NrID0gU2FtcGxlX1JlYWRCbG9jazsNCisvLwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuUmVsZWFzZSA9IFNhbXBsZV9SZWxlYXNlOw0KKy8vCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5UcnVuY2F0ZSA9IFNhbXBsZV9UcnVuY2F0ZTsNCisvLwlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuV3JpdGVCbG9jayA9IFNhbXBsZV9Xcml0ZUJsb2NrOw0KKy8vDQorLy8JcEZpbGVIYW5kbGVyID0gJnBGaWxlSGFuZGVyLT5maWxlSGFuZGxlcjsNCisvLw0KKy8vCXJldHVybiB0cnVlOw0KKy8vfQ0KKw0KK0ZQREZfRklMRUhBTkRMRVIqIFBERml1bUVuZ2luZTo6Rm9ybV9PcGVuRmlsZShGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIGludCBmaWxlRmxhZywgRlBERl9XSURFU1RSSU5HIHdzVVJMLCBjb25zdCBjaGFyKiBtb2RlKSB7DQorCXN0ZDo6c3RyaW5nIHVybF9zdHIgPSAiTlVMTCI7DQorCWlmICh3c1VSTCA9PSBOVUxMKSB7DQorCQl1cmxfc3RyID0gIk5VTEwiOw0KKwl9DQorCWVsc2Ugew0KKwkJdXJsX3N0ciA9DQorCQkJYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPih3c1VSTCkpOw0KKwl9DQorCWlmIChzdHJuY21wKG1vZGUsICJ3YiIsIDIpID09IDApIHsNCisNCisJCUZJTEUqIGZpbGUgPSBmb3BlbihGWFFBX1RFU1RGSUxFKCJ0ZW0udHh0IiksIG1vZGUpOw0KKwkJRlBERl9GSUxFKiBwRmlsZUhhbmRlciA9IG5ldyBGUERGX0ZJTEU7DQorCQlwRmlsZUhhbmRlci0+ZmlsZSA9IGZpbGU7DQorCQlwRmlsZUhhbmRlci0+ZmlsZUhhbmRsZXIuY2xpZW50RGF0YSA9IHBGaWxlSGFuZGVyOw0KKwkJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLkZsdXNoID0gU2FtcGxlX0ZsdXNoOw0KKwkJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLkdldFNpemUgPSBTYW1wbGVfR2V0U2l6ZTsNCisJCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5SZWFkQmxvY2sgPSBTYW1wbGVfUmVhZEJsb2NrOw0KKwkJcEZpbGVIYW5kZXItPmZpbGVIYW5kbGVyLlJlbGVhc2UgPSBTYW1wbGVfUmVsZWFzZTsNCisJCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5UcnVuY2F0ZSA9IFNhbXBsZV9UcnVuY2F0ZTsNCisJCXBGaWxlSGFuZGVyLT5maWxlSGFuZGxlci5Xcml0ZUJsb2NrID0gU2FtcGxlX1dyaXRlQmxvY2s7DQorCQlyZXR1cm4gJnBGaWxlSGFuZGVyLT5maWxlSGFuZGxlcjsNCisJfQ0KKwllbHNlIHsNCisJCXVybF9zdHIgPSBiYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KHdzVVJMKSk7DQorCX0NCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX0dvdG9VUkwoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREVTVFJJTkcgd3NVUkwpIHsNCisJc3RkOjpzdHJpbmcgdXJsX3N0ciA9DQorCQliYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KHdzVVJMKSk7DQorCWludCBwYWdlQ291bnQgPSBGUERGX0dldFBhZ2VDb3VudChkb2N1bWVudCk7DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkZvcm1fR2V0TGFuZ3VhZ2UoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCB2b2lkKiBsYW5ndWFnZSwgaW50IGxlbmd0aCkgew0KKwlyZXR1cm4gMDsNCit9DQorDQorI2VuZGlmIC8vIF9URVNUX1hGQQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkdldEJsb2NrKHZvaWQqIHBhcmFtLCB1bnNpZ25lZCBsb25nIHBvc2l0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKSB7DQorICBEb2N1bWVudExvYWRlciogbG9hZGVyID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnRMb2FkZXIqPihwYXJhbSk7DQorICByZXR1cm4gbG9hZGVyLT5HZXRCbG9jayhwb3NpdGlvbiwgc2l6ZSwgYnVmZmVyKTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmU6OklzRGF0YUF2YWlsKEZYX0ZJTEVBVkFJTCogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7DQorICBQREZpdW1FbmdpbmU6OkZpbGVBdmFpbCogZmlsZV9hdmFpbCA9DQorICAgICAgc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lOjpGaWxlQXZhaWwqPihwYXJhbSk7DQorICByZXR1cm4gZmlsZV9hdmFpbC0+bG9hZGVyLT5Jc0RhdGFBdmFpbGFibGUob2Zmc2V0LCBzaXplKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkFkZFNlZ21lbnQoRlhfRE9XTkxPQURISU5UUyogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsNCisgIFBERml1bUVuZ2luZTo6RG93bmxvYWRIaW50cyogZG93bmxvYWRfaGludHMgPQ0KKyAgICAgIHN0YXRpY19jYXN0PFBERml1bUVuZ2luZTo6RG93bmxvYWRIaW50cyo+KHBhcmFtKTsNCisgIHJldHVybiBkb3dubG9hZF9oaW50cy0+bG9hZGVyLT5SZXF1ZXN0RGF0YShvZmZzZXQsIHNpemUpOw0KK30NCisNCitib29sIFBERml1bUVuZ2luZTo6TmV3KGNvbnN0IGNoYXIqIHVybCkgew0KKyAgdXJsXyA9IHVybDsNCisgIGhlYWRlcnNfID0gc3RkOjpzdHJpbmcoKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIFBERml1bUVuZ2luZTo6TmV3KGNvbnN0IGNoYXIqIHVybCwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGhlYWRlcnMpIHsNCisgIHVybF8gPSB1cmw7DQorICBpZiAoIWhlYWRlcnMpDQorICAgIGhlYWRlcnNfID0gc3RkOjpzdHJpbmcoKTsNCisgIGVsc2UNCisgICAgaGVhZGVyc18gPSBoZWFkZXJzOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpQYWdlT2Zmc2V0VXBkYXRlZChjb25zdCBwcDo6UG9pbnQmIHBhZ2Vfb2Zmc2V0KSB7DQorICBwYWdlX29mZnNldF8gPSBwYWdlX29mZnNldDsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlBsdWdpblNpemVVcGRhdGVkKGNvbnN0IHBwOjpTaXplJiBzaXplKSB7DQorICBDYW5jZWxQYWludHMoKTsNCisNCisgIHBsdWdpbl9zaXplXyA9IHNpemU7DQorICBDYWxjdWxhdGVWaXNpYmxlUGFnZXMoKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlNjcm9sbGVkVG9YUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7DQorICBDYW5jZWxQYWludHMoKTsNCisNCisgIGludCBvbGRfeCA9IHBvc2l0aW9uXy54KCk7DQorICBwb3NpdGlvbl8uc2V0X3gocG9zaXRpb24pOw0KKyAgQ2FsY3VsYXRlVmlzaWJsZVBhZ2VzKCk7DQorICBjbGllbnRfLT5TY3JvbGwocHA6OlBvaW50KG9sZF94IC0gcG9zaXRpb24sIDApKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlNjcm9sbGVkVG9ZUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7DQorICBDYW5jZWxQYWludHMoKTsNCisNCisgIGludCBvbGRfeSA9IHBvc2l0aW9uXy55KCk7DQorICBwb3NpdGlvbl8uc2V0X3kocG9zaXRpb24pOw0KKyAgQ2FsY3VsYXRlVmlzaWJsZVBhZ2VzKCk7DQorICBjbGllbnRfLT5TY3JvbGwocHA6OlBvaW50KDAsIG9sZF95IC0gcG9zaXRpb24pKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlByZVBhaW50KCkgew0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm9ncmVzc2l2ZV9wYWludHNfLnNpemUoKTsgKytpKQ0KKyAgICBwcm9ncmVzc2l2ZV9wYWludHNfW2ldLnBhaW50ZWRfID0gZmFsc2U7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpQYWludChjb25zdCBwcDo6UmVjdCYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+KiByZWFkeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+KiBwZW5kaW5nKSB7DQorICBwcDo6UmVjdCBsZWZ0b3ZlciA9IHJlY3Q7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZpc2libGVfcGFnZXNfLnNpemUoKTsgKytpKSB7DQorICAgIGludCBpbmRleCA9IHZpc2libGVfcGFnZXNfW2ldOw0KKyAgICBwcDo6UmVjdCBwYWdlX3JlY3QgPSBwYWdlc19baW5kZXhdLT5yZWN0KCk7DQorICAgIC8vIENvbnZlcnQgdGhlIGN1cnJlbnQgcGFnZSdzIHJlY3RhbmdsZSB0byBzY3JlZW4gcmVjdGFuZ2xlLiAgV2UgZG8gdGhpcw0KKyAgICAvLyBpbnN0ZWFkIG9mIHRoZSByZXZlcnNlIChjb252ZXJ0aW5nIHRoZSBkaXJ0eSByZWN0YW5nbGUgZnJvbSBzY3JlZW4gdG8NCisgICAgLy8gcGFnZSBjb29yZGluYXRlcykgYmVjYXVzZSB0aGVuIHdlJ2QgaGF2ZSB0byBjb252ZXJ0IGJhY2sgdG8gc2NyZWVuDQorICAgIC8vIGNvb3JkaW5hdGVzLCBhbmQgdGhlIHJvdW5kaW5nIGVycm9ycyBzb21ldGltZSBsZWF2ZSBwaXhlbHMgZGlydHkgb3IgZXZlbg0KKyAgICAvLyBtb3ZlIHRoZSB0ZXh0IHVwIG9yIGRvd24gYSBwaXhlbCB3aGVuIHpvb21lZC4NCisgICAgcHA6OlJlY3QgcGFnZV9yZWN0X2luX3NjcmVlbiA9IEdldFBhZ2VTY3JlZW5SZWN0KGluZGV4KTsNCisgICAgcHA6OlJlY3QgZGlydHlfaW5fc2NyZWVuID0gcGFnZV9yZWN0X2luX3NjcmVlbi5JbnRlcnNlY3QobGVmdG92ZXIpOw0KKyAgICBpZiAoZGlydHlfaW5fc2NyZWVuLklzRW1wdHkoKSkNCisgICAgICBjb250aW51ZTsNCisNCisgICAgbGVmdG92ZXIgPSBsZWZ0b3Zlci5TdWJ0cmFjdChkaXJ0eV9pbl9zY3JlZW4pOw0KKw0KKyAgICBpZiAocGFnZXNfW2luZGV4XS0+YXZhaWxhYmxlKCkpIHsNCisgICAgICBpbnQgcHJvZ3Jlc3NpdmUgPSBHZXRQcm9ncmVzc2l2ZUluZGV4KGluZGV4KTsNCisgICAgICBpZiAocHJvZ3Jlc3NpdmUgIT0gLTEgJiYNCisgICAgICAgICAgcHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV0ucmVjdCAhPSBkaXJ0eV9pbl9zY3JlZW4pIHsNCisgICAgICAgIC8vIFRoZSBQREZpdW0gY29kZSBjYW4gb25seSBoYW5kbGUgb25lIHByb2dyZXNzaXZlIHBhaW50IGF0IGEgdGltZSwgc28NCisgICAgICAgIC8vIHF1ZXVlIHRoaXMgdXAuIFByZXZpb3VzbHkgd2UgdXNlZCB0byBtZXJnZSB0aGUgcmVjdHMgd2hlbiB0aGlzDQorICAgICAgICAvLyBoYXBwZW5lZCwgYnV0IGl0IG1hZGUgc2Nyb2xsaW5nIHVwIG9uIGNvbXBsZXggUERGcyB2ZXJ5IHNsb3cgc2luY2UNCisgICAgICAgIC8vIHRoZXJlIHdvdWxkIGJlIGEgZGFtYWdlZCByZWN0IGF0IHRoZSB0b3AgKGZyb20gc2Nyb2xsKSBhbmQgYXQgdGhlDQorICAgICAgICAvLyBib3R0b20gKGZyb20gdG9vbGJhcikuDQorICAgICAgICBwZW5kaW5nLT5wdXNoX2JhY2soZGlydHlfaW5fc2NyZWVuKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAocHJvZ3Jlc3NpdmUgPT0gLTEpIHsNCisgICAgICAgIHByb2dyZXNzaXZlID0gU3RhcnRQYWludChpbmRleCwgZGlydHlfaW5fc2NyZWVuKTsNCisgICAgICAgIHByb2dyZXNzaXZlX3BhaW50X3RpbWVvdXRfID0ga01heEluaXRpYWxQcm9ncmVzc2l2ZVBhaW50VGltZU1zOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwcm9ncmVzc2l2ZV9wYWludF90aW1lb3V0XyA9IGtNYXhQcm9ncmVzc2l2ZVBhaW50VGltZU1zOw0KKyAgICAgIH0NCisNCisgICAgICBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlXS5wYWludGVkXyA9IHRydWU7DQorICAgICAgaWYgKENvbnRpbnVlUGFpbnQocHJvZ3Jlc3NpdmUsIGltYWdlX2RhdGEpKSB7DQorICAgICAgICBGaW5pc2hQYWludChwcm9ncmVzc2l2ZSwgaW1hZ2VfZGF0YSk7DQorICAgICAgICByZWFkeS0+cHVzaF9iYWNrKGRpcnR5X2luX3NjcmVlbik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBlbmRpbmctPnB1c2hfYmFjayhkaXJ0eV9pbl9zY3JlZW4pOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBQYWludFVuYXZhaWxhYmxlUGFnZShpbmRleCwgZGlydHlfaW5fc2NyZWVuLCBpbWFnZV9kYXRhKTsNCisgICAgICByZWFkeS0+cHVzaF9iYWNrKGRpcnR5X2luX3NjcmVlbik7DQorICAgIH0NCisgIH0NCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlBvc3RQYWludCgpIHsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvZ3Jlc3NpdmVfcGFpbnRzXy5zaXplKCk7ICsraSkgew0KKyAgICBpZiAocHJvZ3Jlc3NpdmVfcGFpbnRzX1tpXS5wYWludGVkXykNCisgICAgICBjb250aW51ZTsNCisNCisgICAgLy8gVGhpcyByZWN0YW5nbGUgbXVzdCBoYXZlIGJlZW4gbWVyZ2VkIHdpdGggYW5vdGhlciBvbmUsIHRoYXQncyB3aHkgd2UNCisgICAgLy8gd2VyZW4ndCBhc2tlZCB0byBwYWludCBpdC4gUmVtb3ZlIGl0IG9yIG90aGVyd2lzZSB3ZSdsbCBuZXZlciBmaW5pc2gNCisgICAgLy8gcGFpbnRpbmcuDQorICAgIEZQREZfUmVuZGVyUGFnZV9DbG9zZSgNCisgICAgICAgIHBhZ2VzX1twcm9ncmVzc2l2ZV9wYWludHNfW2ldLnBhZ2VfaW5kZXhdLT5HZXRQYWdlKCkpOw0KKyAgICBGUERGQml0bWFwX0Rlc3Ryb3kocHJvZ3Jlc3NpdmVfcGFpbnRzX1tpXS5iaXRtYXApOw0KKyAgICBwcm9ncmVzc2l2ZV9wYWludHNfLmVyYXNlKHByb2dyZXNzaXZlX3BhaW50c18uYmVnaW4oKSArIGkpOw0KKyAgICAtLWk7DQorICB9DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpIYW5kbGVEb2N1bWVudExvYWQoY29uc3QgcHA6OlVSTExvYWRlciYgbG9hZGVyKSB7DQorICBwYXNzd29yZF90cmllc19yZW1haW5pbmdfID0ga01heFBhc3N3b3JkVHJpZXM7DQorICByZXR1cm4gZG9jX2xvYWRlcl8uSW5pdChsb2FkZXIsIHVybF8sIGhlYWRlcnNfKTsNCit9DQorDQorcHA6Okluc3RhbmNlKiBQREZpdW1FbmdpbmU6OkdldFBsdWdpbkluc3RhbmNlKCkgew0KKyAgcmV0dXJuIGNsaWVudF8tPkdldFBsdWdpbkluc3RhbmNlKCk7DQorfQ0KKw0KK3BwOjpVUkxMb2FkZXIgUERGaXVtRW5naW5lOjpDcmVhdGVVUkxMb2FkZXIoKSB7DQorICByZXR1cm4gY2xpZW50Xy0+Q3JlYXRlVVJMTG9hZGVyKCk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpBcHBlbmRQYWdlKFBERkVuZ2luZSogZW5naW5lLCBpbnQgaW5kZXgpIHsNCisgIC8vIFVubG9hZCBhbmQgZGVsZXRlIHRoZSBibGFuayBwYWdlIGJlZm9yZSBhcHBlbmRpbmcuDQorICBwYWdlc19baW5kZXhdLT5VbmxvYWQoKTsNCisgIHBhZ2VzX1tpbmRleF0tPnNldF9jYWxjdWxhdGVkX2xpbmtzKGZhbHNlKTsNCisgIHBwOjpTaXplIGN1cnJfcGFnZV9zaXplID0gR2V0UGFnZVNpemUoaW5kZXgpOw0KKyAgRlBERlBhZ2VfRGVsZXRlKGRvY18sIGluZGV4KTsNCisgIEZQREZfSW1wb3J0UGFnZXMoZG9jXywNCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4oZW5naW5lKS0+ZG9jKCksDQorICAgICAgICAgICAgICAgICAgICIxIiwNCisgICAgICAgICAgICAgICAgICAgaW5kZXgpOw0KKyAgcHA6OlNpemUgbmV3X3BhZ2Vfc2l6ZSA9IEdldFBhZ2VTaXplKGluZGV4KTsNCisgIGlmIChjdXJyX3BhZ2Vfc2l6ZSAhPSBuZXdfcGFnZV9zaXplKQ0KKyAgICBMb2FkUGFnZUluZm8odHJ1ZSk7DQorICBjbGllbnRfLT5JbnZhbGlkYXRlKEdldFBhZ2VTY3JlZW5SZWN0KGluZGV4KSk7DQorfQ0KKw0KK3BwOjpQb2ludCBQREZpdW1FbmdpbmU6OkdldFNjcm9sbFBvc2l0aW9uKCkgew0KKyAgcmV0dXJuIHBvc2l0aW9uXzsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IHBwOjpQb2ludCYgcG9zaXRpb24pIHsNCisgIHBvc2l0aW9uXyA9IHBvc2l0aW9uOw0KK30NCisNCitib29sIFBERml1bUVuZ2luZTo6SXNQcm9ncmVzc2l2ZUxvYWQoKSB7DQorICByZXR1cm4gZG9jX2xvYWRlcl8uaXNfcGFydGlhbF9kb2N1bWVudCgpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6T25QYXJ0aWFsRG9jdW1lbnRMb2FkZWQoKSB7DQorICBmaWxlX2FjY2Vzc18ubV9GaWxlTGVuID0gZG9jX2xvYWRlcl8uZG9jdW1lbnRfc2l6ZSgpOw0KKyAgZnBkZl9hdmFpbGFiaWxpdHlfID0gRlBERkF2YWlsX0NyZWF0ZSgmZmlsZV9hdmFpbGFiaWxpdHlfLCAmZmlsZV9hY2Nlc3NfKTsNCisgIERDSEVDSyhmcGRmX2F2YWlsYWJpbGl0eV8pOw0KKw0KKyAgLy8gQ3VycmVudGx5IGVuZ2luZSBkb2VzIG5vdCBkZWFsIGVmZmljaWVudGx5IHdpdGggc29tZSBub24tbGluZWFyaXplZCBmaWxlcy4NCisgIC8vIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01OTQwMA0KKyAgLy8gVG8gaW1wcm92ZSB1c2VyIGV4cGVyaWVuY2Ugd2UgZG93bmxvYWQgZW50aXJlIGZpbGUgZm9yIG5vbi1saW5lYXJpemVkIFBERi4NCisgIGlmICghRlBERkF2YWlsX0lzTGluZWFyaXplZChmcGRmX2F2YWlsYWJpbGl0eV8pKSB7DQorICAgIGRvY19sb2FkZXJfLlJlcXVlc3REYXRhKDAsIGRvY19sb2FkZXJfLmRvY3VtZW50X3NpemUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIExvYWREb2N1bWVudCgpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6T25QZW5kaW5nUmVxdWVzdENvbXBsZXRlKCkgew0KKyAgaWYgKCFkb2NfIHx8ICFmb3JtXykgew0KKyAgICBMb2FkRG9jdW1lbnQoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgLy8gTG9hZERvY3VtZW50KCkgd2lsbCByZXN1bHQgaW4gfHBlbmRpbmdfcGFnZXNffCBiZWluZyByZXNldCBzbyB0aGVyZSdzIG5vDQorICAvLyBuZWVkIHRvIHJ1biB0aGUgY29kZSBiZWxvdyBpbiB0aGF0IGNhc2UuDQorICBib29sIHVwZGF0ZV9wYWdlcyA9IGZhbHNlOw0KKyAgc3RkOjp2ZWN0b3I8aW50PiBzdGlsbF9wZW5kaW5nOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwZW5kaW5nX3BhZ2VzXy5zaXplKCk7ICsraSkgew0KKyAgICBpZiAoQ2hlY2tQYWdlQXZhaWxhYmxlKHBlbmRpbmdfcGFnZXNfW2ldLCAmc3RpbGxfcGVuZGluZykpIHsNCisgICAgICB1cGRhdGVfcGFnZXMgPSB0cnVlOw0KKyAgICAgIGlmIChJc1BhZ2VWaXNpYmxlKHBlbmRpbmdfcGFnZXNfW2ldKSkNCisgICAgICAgIGNsaWVudF8tPkludmFsaWRhdGUoR2V0UGFnZVNjcmVlblJlY3QocGVuZGluZ19wYWdlc19baV0pKTsNCisgICAgfQ0KKyAgfQ0KKyAgcGVuZGluZ19wYWdlc18uc3dhcChzdGlsbF9wZW5kaW5nKTsNCisgIGlmICh1cGRhdGVfcGFnZXMpDQorICAgIExvYWRQYWdlSW5mbyh0cnVlKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6Ok9uTmV3RGF0YUF2YWlsYWJsZSgpIHsNCisgIGNsaWVudF8tPkRvY3VtZW50TG9hZFByb2dyZXNzKGRvY19sb2FkZXJfLkdldEF2YWlsYWJsZURhdGEoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY19sb2FkZXJfLmRvY3VtZW50X3NpemUoKSk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpPbkRvY3VtZW50Q29tcGxldGUoKSB7DQorICBpZiAoIWRvY18gfHwgIWZvcm1fKSB7DQorICAgIGZpbGVfYWNjZXNzXy5tX0ZpbGVMZW4gPSBkb2NfbG9hZGVyXy5kb2N1bWVudF9zaXplKCk7DQorICAgIExvYWREb2N1bWVudCgpOw0KKyAgICByZXR1cm47DQorICB9DQorDQorICBib29sIG5lZWRfdXBkYXRlID0gZmFsc2U7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2VzXy5zaXplKCk7ICsraSkgew0KKyAgICBpZiAocGFnZXNfW2ldLT5hdmFpbGFibGUoKSkNCisgICAgICBjb250aW51ZTsNCisNCisgICAgcGFnZXNfW2ldLT5zZXRfYXZhaWxhYmxlKHRydWUpOw0KKyAgICAvLyBXZSBzdGlsbCBuZWVkIHRvIGNhbGwgSXNQYWdlQXZhaWwoKSBldmVuIGlmIHRoZSB3aG9sZSBkb2N1bWVudCBpcw0KKyAgICAvLyBhbHJlYWR5IGRvd25sb2FkZWQuDQorICAgIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChmcGRmX2F2YWlsYWJpbGl0eV8sIGksICZkb3dubG9hZF9oaW50c18pOw0KKyAgICBuZWVkX3VwZGF0ZSA9IHRydWU7DQorICAgIGlmIChJc1BhZ2VWaXNpYmxlKGkpKQ0KKyAgICAgIGNsaWVudF8tPkludmFsaWRhdGUoR2V0UGFnZVNjcmVlblJlY3QoaSkpOw0KKyAgfQ0KKyAgaWYgKG5lZWRfdXBkYXRlKQ0KKyAgICBMb2FkUGFnZUluZm8odHJ1ZSk7DQorDQorICBGaW5pc2hMb2FkaW5nRG9jdW1lbnQoKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZpbmlzaExvYWRpbmdEb2N1bWVudCgpIHsNCisgIERDSEVDSyhkb2NfbG9hZGVyXy5Jc0RvY3VtZW50Q29tcGxldGUoKSAmJiBkb2NfKTsNCisgIGlmIChjYWxsZWRfZG9fZG9jdW1lbnRfYWN0aW9uXykNCisgICAgcmV0dXJuOw0KKyAgY2FsbGVkX2RvX2RvY3VtZW50X2FjdGlvbl8gPSB0cnVlOw0KKw0KKyAgLy8gVGhlc2UgY2FuIG9ubHkgYmUgY2FsbGVkIG5vdywgYXMgdGhlIEpTIG1pZ2h0IGVuZCB1cCBuZWVkaW5nIGEgcGFnZS4NCisgIEZPUk1fRG9Eb2N1bWVudEpTQWN0aW9uKGZvcm1fKTsNCisgIEZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oZm9ybV8pOw0KKyAgaWYgKG1vc3RfdmlzaWJsZV9wYWdlXyAhPSAtMSkgew0KKyAgICBGUERGX1BBR0UgbmV3X3BhZ2UgPSBwYWdlc19bbW9zdF92aXNpYmxlX3BhZ2VfXS0+R2V0UGFnZSgpOw0KKyAgICBGT1JNX0RvUGFnZUFBY3Rpb24obmV3X3BhZ2UsIGZvcm1fLCBGUERGUEFHRV9BQUNUSU9OX09QRU4pOw0KKyAgfQ0KKw0KKyAgaWYgKGRvY18pIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIGxvYWRpbmcgfGRvY198IGZhaWxzLg0KKyAgICBjbGllbnRfLT5Eb2N1bWVudExvYWRDb21wbGV0ZShwYWdlc18uc2l6ZSgpKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlVuc3VwcG9ydGVkRmVhdHVyZShpbnQgdHlwZSkgew0KKyAgc3RkOjpzdHJpbmcgZmVhdHVyZTsNCisgIHN3aXRjaCAodHlwZSkgew0KKyAgICBjYXNlIEZQREZfVU5TUF9ET0NfWEZBRk9STToNCisgICAgICAvL2ZlYXR1cmUgPSAiWEZBIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGUERGX1VOU1BfRE9DX1BPUlRBQkxFQ09MTEVDVElPTjoNCisgICAgICBmZWF0dXJlID0gIlBvcnRmb2xpb3NfUGFja2FnZXMiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZQREZfVU5TUF9ET0NfQVRUQUNITUVOVDoNCisgICAgY2FzZSBGUERGX1VOU1BfQU5OT1RfQVRUQUNITUVOVDoNCisgICAgICBmZWF0dXJlID0gIkF0dGFjaG1lbnQiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZQREZfVU5TUF9ET0NfU0VDVVJJVFk6DQorICAgICAgZmVhdHVyZSA9ICJSaWdodHNfTWFuYWdlbWVudCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlBERl9VTlNQX0RPQ19TSEFSRURSRVZJRVc6DQorICAgICAgZmVhdHVyZSA9ICJTaGFyZWRfUmV2aWV3IjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fQUNST0JBVDoNCisgICAgY2FzZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRklMRVNZU1RFTToNCisgICAgY2FzZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRU1BSUw6DQorICAgICAgZmVhdHVyZSA9ICJTaGFyZWRfRm9ybSI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlBERl9VTlNQX0FOTk9UXzNEQU5OT1Q6DQorICAgICAgZmVhdHVyZSA9ICIzRCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlBERl9VTlNQX0FOTk9UX01PVklFOg0KKyAgICAgIGZlYXR1cmUgPSAiTW92aWUiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZQREZfVU5TUF9BTk5PVF9TT1VORDoNCisgICAgICBmZWF0dXJlID0gIlNvdW5kIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGUERGX1VOU1BfQU5OT1RfU0NSRUVOX01FRElBOg0KKyAgICBjYXNlIEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fUklDSE1FRElBOg0KKyAgICAgIGZlYXR1cmUgPSAiU2NyZWVuIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGUERGX1VOU1BfQU5OT1RfU0lHOg0KKyAgICAgIGZlYXR1cmUgPSAiRGlnaXRhbF9TaWduYXR1cmUiOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgY2xpZW50Xy0+RG9jdW1lbnRIYXNVbnN1cHBvcnRlZEZlYXR1cmUoZmVhdHVyZSk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpDb250aW51ZUZpbmQoaW50MzJfdCByZXN1bHQpIHsNCisgIFN0YXJ0RmluZChjdXJyZW50X2ZpbmRfdGV4dF8uY19zdHIoKSwgISFyZXN1bHQpOw0KK30NCisNCitib29sIFBERml1bUVuZ2luZTo6SGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KSB7DQorICBEQ0hFQ0soIWRlZmVyX3BhZ2VfdW5sb2FkXyk7DQorICBkZWZlcl9wYWdlX3VubG9hZF8gPSB0cnVlOw0KKyAgYm9vbCBydiA9IGZhbHNlOw0KKyAgc3dpdGNoIChldmVudC5HZXRUeXBlKCkpIHsNCisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VET1dOOg0KKyAgICAgIHJ2ID0gT25Nb3VzZURvd24ocHA6Ok1vdXNlSW5wdXRFdmVudChldmVudCkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFBQX0lOUFVURVZFTlRfVFlQRV9NT1VTRVVQOg0KKyAgICAgIHJ2ID0gT25Nb3VzZVVwKHBwOjpNb3VzZUlucHV0RXZlbnQoZXZlbnQpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfTU9VU0VNT1ZFOg0KKyAgICAgIHJ2ID0gT25Nb3VzZU1vdmUocHA6Ok1vdXNlSW5wdXRFdmVudChldmVudCkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFBQX0lOUFVURVZFTlRfVFlQRV9LRVlET1dOOg0KKyAgICAgIHJ2ID0gT25LZXlEb3duKHBwOjpLZXlib2FyZElucHV0RXZlbnQoZXZlbnQpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfS0VZVVA6DQorICAgICAgcnYgPSBPbktleVVwKHBwOjpLZXlib2FyZElucHV0RXZlbnQoZXZlbnQpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBQUF9JTlBVVEVWRU5UX1RZUEVfQ0hBUjoNCisgICAgICBydiA9IE9uQ2hhcihwcDo6S2V5Ym9hcmRJbnB1dEV2ZW50KGV2ZW50KSk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorDQorICBEQ0hFQ0soZGVmZXJfcGFnZV91bmxvYWRfKTsNCisgIGRlZmVyX3BhZ2VfdW5sb2FkXyA9IGZhbHNlOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWZlcnJlZF9wYWdlX3VubG9hZHNfLnNpemUoKTsgKytpKQ0KKyAgICBwYWdlc19bZGVmZXJyZWRfcGFnZV91bmxvYWRzX1tpXV0tPlVubG9hZCgpOw0KKyAgZGVmZXJyZWRfcGFnZV91bmxvYWRzXy5jbGVhcigpOw0KKyAgcmV0dXJuIHJ2Ow0KK30NCisNCit1aW50MzJfdCBQREZpdW1FbmdpbmU6OlF1ZXJ5U3VwcG9ydGVkUHJpbnRPdXRwdXRGb3JtYXRzKCkgew0KKyAgaWYgKCFIYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9MT1dfUVVBTElUWSkpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIFBQX1BSSU5UT1VUUFVURk9STUFUX1BERjsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlByaW50QmVnaW4oKSB7DQorICBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKGZvcm1fLCBGUERGRE9DX0FBQ1RJT05fV1ApOw0KK30NCisNCitwcDo6UmVzb3VyY2UgUERGaXVtRW5naW5lOjpQcmludFBhZ2VzKA0KKyAgICBjb25zdCBQUF9QcmludFBhZ2VOdW1iZXJSYW5nZV9EZXYqIHBhZ2VfcmFuZ2VzLCB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50LA0KKyAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpIHsNCisgIGlmIChIYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9ISUdIX1FVQUxJVFkpKQ0KKyAgICByZXR1cm4gUHJpbnRQYWdlc0FzUERGKHBhZ2VfcmFuZ2VzLCBwYWdlX3JhbmdlX2NvdW50LCBwcmludF9zZXR0aW5ncyk7DQorICBlbHNlIGlmIChIYXNQZXJtaXNzaW9uKFBERkVuZ2luZTo6UEVSTUlTU0lPTl9QUklOVF9MT1dfUVVBTElUWSkpDQorICAgIHJldHVybiBQcmludFBhZ2VzQXNSYXN0ZXJQREYocGFnZV9yYW5nZXMsIHBhZ2VfcmFuZ2VfY291bnQsIHByaW50X3NldHRpbmdzKTsNCisgIHJldHVybiBwcDo6UmVzb3VyY2UoKTsNCit9DQorDQorRlBERl9ET0NVTUVOVCBQREZpdW1FbmdpbmU6OkNyZWF0ZVNpbmdsZVBhZ2VSYXN0ZXJQZGYoDQorICAgIGRvdWJsZSBzb3VyY2VfcGFnZV93aWR0aCwNCisgICAgZG91YmxlIHNvdXJjZV9wYWdlX2hlaWdodCwNCisgICAgY29uc3QgUFBfUHJpbnRTZXR0aW5nc19EZXYmIHByaW50X3NldHRpbmdzLA0KKyAgICBQREZpdW1QYWdlKiBwYWdlX3RvX3ByaW50KSB7DQorICBGUERGX0RPQ1VNRU5UIHRlbXBfZG9jID0gRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpOw0KKyAgaWYgKCF0ZW1wX2RvYykNCisgICAgcmV0dXJuIHRlbXBfZG9jOw0KKw0KKyAgY29uc3QgcHA6OlNpemUmIGJpdG1hcF9zaXplKHBhZ2VfdG9fcHJpbnQtPnJlY3QoKS5zaXplKCkpOw0KKw0KKyAgRlBERl9QQUdFIHRlbXBfcGFnZSA9DQorICAgICAgRlBERlBhZ2VfTmV3KHRlbXBfZG9jLCAwLCBzb3VyY2VfcGFnZV93aWR0aCwgc291cmNlX3BhZ2VfaGVpZ2h0KTsNCisNCisgIHBwOjpJbWFnZURhdGEgaW1hZ2UgPSBwcDo6SW1hZ2VEYXRhKGNsaWVudF8tPkdldFBsdWdpbkluc3RhbmNlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUF9JTUFHRURBVEFGT1JNQVRfQkdSQV9QUkVNVUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsNCisNCisgIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlRXgoYml0bWFwX3NpemUud2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX3NpemUuaGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZCaXRtYXBfQkdSeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZGF0YSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5zdHJpZGUoKSk7DQorDQorICAvLyBDbGVhciB0aGUgYml0bWFwDQorICBGUERGQml0bWFwX0ZpbGxSZWN0KA0KKyAgICAgIGJpdG1hcCwgMCwgMCwgYml0bWFwX3NpemUud2lkdGgoKSwgYml0bWFwX3NpemUuaGVpZ2h0KCksIDB4RkZGRkZGRkYpOw0KKw0KKyAgcHA6OlJlY3QgcGFnZV9yZWN0ID0gcGFnZV90b19wcmludC0+cmVjdCgpOw0KKyAgRlBERl9SZW5kZXJQYWdlQml0bWFwKGJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3RvX3ByaW50LT5HZXRQcmludFBhZ2UoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3JlY3QueCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VfcmVjdC55KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9yZWN0LndpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9yZWN0LmhlaWdodCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3NldHRpbmdzLm9yaWVudGF0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1QgfCBGUERGX1BSSU5USU5HIHwgRlBERl9OT19DQVRDSCk7DQorDQorICBkb3VibGUgcmF0aW9feCA9IChzdGF0aWNfY2FzdDxkb3VibGU+KGJpdG1hcF9zaXplLndpZHRoKCkpICoga1BvaW50c1BlckluY2gpIC8NCisgICAgICAgICAgICAgICAgICAgcHJpbnRfc2V0dGluZ3MuZHBpOw0KKyAgZG91YmxlIHJhdGlvX3kgPQ0KKyAgICAgIChzdGF0aWNfY2FzdDxkb3VibGU+KGJpdG1hcF9zaXplLmhlaWdodCgpKSAqIGtQb2ludHNQZXJJbmNoKSAvDQorICAgICAgcHJpbnRfc2V0dGluZ3MuZHBpOw0KKw0KKyAgLy8gQWRkIHRoZSBiaXRtYXAgdG8gYW4gaW1hZ2Ugb2JqZWN0IGFuZCBhZGQgdGhlIGltYWdlIG9iamVjdCB0byB0aGUgb3V0cHV0DQorICAvLyBwYWdlLg0KKyAgRlBERl9QQUdFT0JKRUNUIHRlbXBfaW1nID0gRlBERlBhZ2VPYmpfTmV3SW1nZU9iaih0ZW1wX2RvYyk7DQorICBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKCZ0ZW1wX3BhZ2UsIDEsIHRlbXBfaW1nLCBiaXRtYXApOw0KKyAgRlBERkltYWdlT2JqX1NldE1hdHJpeCh0ZW1wX2ltZywgcmF0aW9feCwgMCwgMCwgcmF0aW9feSwgMCwgMCk7DQorICBGUERGUGFnZV9JbnNlcnRPYmplY3QodGVtcF9wYWdlLCB0ZW1wX2ltZyk7DQorICBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQodGVtcF9wYWdlKTsNCisgIEZQREZfQ2xvc2VQYWdlKHRlbXBfcGFnZSk7DQorDQorICBwYWdlX3RvX3ByaW50LT5DbG9zZVByaW50UGFnZSgpOw0KKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7DQorDQorICByZXR1cm4gdGVtcF9kb2M7DQorfQ0KKw0KK3BwOjpCdWZmZXJfRGV2IFBERml1bUVuZ2luZTo6UHJpbnRQYWdlc0FzUmFzdGVyUERGKA0KKyAgICBjb25zdCBQUF9QcmludFBhZ2VOdW1iZXJSYW5nZV9EZXYqIHBhZ2VfcmFuZ2VzLCB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50LA0KKyAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpIHsNCisgIGlmICghcGFnZV9yYW5nZV9jb3VudCkNCisgICAgcmV0dXJuIHBwOjpCdWZmZXJfRGV2KCk7DQorDQorICAvLyBJZiBkb2N1bWVudCBpcyBub3QgZG93bmxvYWRlZCB5ZXQsIGRpc2FibGUgcHJpbnRpbmcuDQorICBpZiAoZG9jXyAmJiAhZG9jX2xvYWRlcl8uSXNEb2N1bWVudENvbXBsZXRlKCkpDQorICAgIHJldHVybiBwcDo6QnVmZmVyX0RldigpOw0KKw0KKyAgRlBERl9ET0NVTUVOVCBvdXRwdXRfZG9jID0gRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpOw0KKyAgaWYgKCFvdXRwdXRfZG9jKQ0KKyAgICByZXR1cm4gcHA6OkJ1ZmZlcl9EZXYoKTsNCisNCisgIFNhdmVTZWxlY3RlZEZvcm1Gb3JQcmludCgpOw0KKw0KKyAgc3RkOjp2ZWN0b3I8UERGaXVtUGFnZT4gcGFnZXNfdG9fcHJpbnQ7DQorICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHNvdXJjZSBQREYgcGFnZXMuDQorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ID4gc291cmNlX3BhZ2Vfc2l6ZXM7DQorICAvLyBDb2xsZWN0IHBhZ2VzIHRvIHByaW50IGFuZCBzaXplcyBvZiBzb3VyY2UgcGFnZXMuDQorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGFnZV9udW1iZXJzID0NCisgICAgICBHZXRQYWdlTnVtYmVyc0Zyb21QcmludFBhZ2VOdW1iZXJSYW5nZShwYWdlX3JhbmdlcywgcGFnZV9yYW5nZV9jb3VudCk7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2VfbnVtYmVycy5zaXplKCk7ICsraSkgew0KKyAgICB1aW50MzJfdCBwYWdlX251bWJlciA9IHBhZ2VfbnVtYmVyc1tpXTsNCisgICAgRlBERl9QQUdFIHBkZl9wYWdlID0gRlBERl9Mb2FkUGFnZShkb2NfLCBwYWdlX251bWJlcik7DQorICAgIGRvdWJsZSBzb3VyY2VfcGFnZV93aWR0aCA9IEZQREZfR2V0UGFnZVdpZHRoKHBkZl9wYWdlKTsNCisgICAgZG91YmxlIHNvdXJjZV9wYWdlX2hlaWdodCA9IEZQREZfR2V0UGFnZUhlaWdodChwZGZfcGFnZSk7DQorICAgIHNvdXJjZV9wYWdlX3NpemVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihzb3VyY2VfcGFnZV93aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYWdlX2hlaWdodCkpOw0KKw0KKyAgICBpbnQgd2lkdGhfaW5fcGl4ZWxzID0gQ29udmVydFVuaXQoc291cmNlX3BhZ2Vfd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGtQb2ludHNQZXJJbmNoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3NldHRpbmdzLmRwaSk7DQorICAgIGludCBoZWlnaHRfaW5fcGl4ZWxzID0gQ29udmVydFVuaXQoc291cmNlX3BhZ2VfaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oa1BvaW50c1BlckluY2gpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3NldHRpbmdzLmRwaSk7DQorDQorICAgIHBwOjpSZWN0IHJlY3Qod2lkdGhfaW5fcGl4ZWxzLCBoZWlnaHRfaW5fcGl4ZWxzKTsNCisgICAgcGFnZXNfdG9fcHJpbnQucHVzaF9iYWNrKFBERml1bVBhZ2UodGhpcywgcGFnZV9udW1iZXIsIHJlY3QsIHRydWUpKTsNCisgICAgRlBERl9DbG9zZVBhZ2UocGRmX3BhZ2UpOw0KKyAgfQ0KKw0KKyNpZiBkZWZpbmVkKE9TX0xJTlVYKQ0KKyAgZ19sYXN0X2luc3RhbmNlX2lkID0gY2xpZW50Xy0+R2V0UGx1Z2luSW5zdGFuY2UoKS0+cHBfaW5zdGFuY2UoKTsNCisjZW5kaWYNCisNCisgIHNpemVfdCBpID0gMDsNCisgIGZvciAoOyBpIDwgcGFnZXNfdG9fcHJpbnQuc2l6ZSgpOyArK2kpIHsNCisgICAgZG91YmxlIHNvdXJjZV9wYWdlX3dpZHRoID0gc291cmNlX3BhZ2Vfc2l6ZXNbaV0uZmlyc3Q7DQorICAgIGRvdWJsZSBzb3VyY2VfcGFnZV9oZWlnaHQgPSBzb3VyY2VfcGFnZV9zaXplc1tpXS5zZWNvbmQ7DQorDQorICAgIC8vIFVzZSB0ZW1wX2RvYyB0byBjb21wcmVzcyBpbWFnZSBieSBzYXZpbmcgUERGIHRvIGJ1ZmZlci4NCisgICAgRlBERl9ET0NVTUVOVCB0ZW1wX2RvYyA9IENyZWF0ZVNpbmdsZVBhZ2VSYXN0ZXJQZGYoc291cmNlX3BhZ2Vfd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYWdlX2hlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc2V0dGluZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWdlc190b19wcmludFtpXSk7DQorDQorICAgIGlmICghdGVtcF9kb2MpDQorICAgICAgYnJlYWs7DQorDQorICAgIHBwOjpCdWZmZXJfRGV2IGJ1ZmZlciA9IEdldEZsYXR0ZW5lZFByaW50RGF0YSh0ZW1wX2RvYyk7DQorICAgIEZQREZfQ2xvc2VEb2N1bWVudCh0ZW1wX2RvYyk7DQorDQorICAgIFBERml1bU1lbUJ1ZmZlckZpbGVSZWFkIGZpbGVfcmVhZChidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsNCisgICAgdGVtcF9kb2MgPSBGUERGX0xvYWRDdXN0b21Eb2N1bWVudCgmZmlsZV9yZWFkLCBOVUxMKTsNCisNCisgICAgRlBERl9CT09MIGltcG9ydGVkID0gRlBERl9JbXBvcnRQYWdlcyhvdXRwdXRfZG9jLCB0ZW1wX2RvYywgIjEiLCBpKTsNCisgICAgRlBERl9DbG9zZURvY3VtZW50KHRlbXBfZG9jKTsNCisgICAgaWYgKCFpbXBvcnRlZCkNCisgICAgICBicmVhazsNCisgIH0NCisNCisgIHBwOjpCdWZmZXJfRGV2IGJ1ZmZlcjsNCisgIGlmIChpID09IHBhZ2VzX3RvX3ByaW50LnNpemUoKSkgew0KKyAgICBGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhvdXRwdXRfZG9jLCBkb2NfKTsNCisgICAgRml0Q29udGVudHNUb1ByaW50YWJsZUFyZWFJZlJlcXVpcmVkKG91dHB1dF9kb2MsIHByaW50X3NldHRpbmdzKTsNCisgICAgLy8gTm93IGZsYXR0ZW4gYWxsIHRoZSBvdXRwdXQgcGFnZXMuDQorICAgIGJ1ZmZlciA9IEdldEZsYXR0ZW5lZFByaW50RGF0YShvdXRwdXRfZG9jKTsNCisgIH0NCisgIEZQREZfQ2xvc2VEb2N1bWVudChvdXRwdXRfZG9jKTsNCisgIHJldHVybiBidWZmZXI7DQorfQ0KKw0KK3BwOjpCdWZmZXJfRGV2IFBERml1bUVuZ2luZTo6R2V0RmxhdHRlbmVkUHJpbnREYXRhKGNvbnN0IEZQREZfRE9DVU1FTlQmIGRvYykgew0KKyAgaW50IHBhZ2VfY291bnQgPSBGUERGX0dldFBhZ2VDb3VudChkb2MpOw0KKyAgYm9vbCBmbGF0dGVuX3N1Y2NlZWRlZCA9IHRydWU7DQorICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VfY291bnQ7ICsraSkgew0KKyAgICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jLCBpKTsNCisgICAgRENIRUNLKHBhZ2UpOw0KKyAgICBpZiAocGFnZSkgew0KKyAgICAgIGludCBmbGF0dGVuX3JldCA9IEZQREZQYWdlX0ZsYXR0ZW4ocGFnZSwgRkxBVF9QUklOVCk7DQorICAgICAgRlBERl9DbG9zZVBhZ2UocGFnZSk7DQorICAgICAgaWYgKGZsYXR0ZW5fcmV0ID09IEZMQVRURU5fRkFJTCkgew0KKyAgICAgICAgZmxhdHRlbl9zdWNjZWVkZWQgPSBmYWxzZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBmbGF0dGVuX3N1Y2NlZWRlZCA9IGZhbHNlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoIWZsYXR0ZW5fc3VjY2VlZGVkKSB7DQorICAgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOw0KKyAgICByZXR1cm4gcHA6OkJ1ZmZlcl9EZXYoKTsNCisgIH0NCisNCisgIHBwOjpCdWZmZXJfRGV2IGJ1ZmZlcjsNCisgIFBERml1bU1lbUJ1ZmZlckZpbGVXcml0ZSBvdXRwdXRfZmlsZV93cml0ZTsNCisgIGlmIChGUERGX1NhdmVBc0NvcHkoZG9jLCAmb3V0cHV0X2ZpbGVfd3JpdGUsIDApKSB7DQorICAgIGJ1ZmZlciA9IHBwOjpCdWZmZXJfRGV2KA0KKyAgICAgICAgY2xpZW50Xy0+R2V0UGx1Z2luSW5zdGFuY2UoKSwgb3V0cHV0X2ZpbGVfd3JpdGUuc2l6ZSgpKTsNCisgICAgaWYgKCFidWZmZXIuaXNfbnVsbCgpKSB7DQorICAgICAgbWVtY3B5KGJ1ZmZlci5kYXRhKCksIG91dHB1dF9maWxlX3dyaXRlLmJ1ZmZlcigpLmNfc3RyKCksDQorICAgICAgICAgICAgIG91dHB1dF9maWxlX3dyaXRlLnNpemUoKSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBidWZmZXI7DQorfQ0KKw0KK3BwOjpCdWZmZXJfRGV2IFBERml1bUVuZ2luZTo6UHJpbnRQYWdlc0FzUERGKA0KKyAgICBjb25zdCBQUF9QcmludFBhZ2VOdW1iZXJSYW5nZV9EZXYqIHBhZ2VfcmFuZ2VzLCB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50LA0KKyAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpIHsNCisgIGlmICghcGFnZV9yYW5nZV9jb3VudCkNCisgICAgcmV0dXJuIHBwOjpCdWZmZXJfRGV2KCk7DQorDQorICBEQ0hFQ0soZG9jXyk7DQorICBGUERGX0RPQ1VNRU5UIG91dHB1dF9kb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7DQorICBpZiAoIW91dHB1dF9kb2MpDQorICAgIHJldHVybiBwcDo6QnVmZmVyX0RldigpOw0KKw0KKyAgU2F2ZVNlbGVjdGVkRm9ybUZvclByaW50KCk7DQorDQorICBzdGQ6OnN0cmluZyBwYWdlX251bWJlcl9zdHI7DQorICBmb3IgKHVpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBwYWdlX3JhbmdlX2NvdW50OyArK2luZGV4KSB7DQorICAgIGlmICghcGFnZV9udW1iZXJfc3RyLmVtcHR5KCkpDQorICAgICAgcGFnZV9udW1iZXJfc3RyLmFwcGVuZCgiLCIpOw0KKyAgICBwYWdlX251bWJlcl9zdHIuYXBwZW5kKA0KKyAgICAgICAgYmFzZTo6SW50VG9TdHJpbmcocGFnZV9yYW5nZXNbaW5kZXhdLmZpcnN0X3BhZ2VfbnVtYmVyICsgMSkpOw0KKyAgICBpZiAocGFnZV9yYW5nZXNbaW5kZXhdLmZpcnN0X3BhZ2VfbnVtYmVyICE9DQorICAgICAgICAgICAgcGFnZV9yYW5nZXNbaW5kZXhdLmxhc3RfcGFnZV9udW1iZXIpIHsNCisgICAgICBwYWdlX251bWJlcl9zdHIuYXBwZW5kKCItIik7DQorICAgICAgcGFnZV9udW1iZXJfc3RyLmFwcGVuZCgNCisgICAgICAgICAgYmFzZTo6SW50VG9TdHJpbmcocGFnZV9yYW5nZXNbaW5kZXhdLmxhc3RfcGFnZV9udW1iZXIgKyAxKSk7DQorICAgIH0NCisgIH0NCisNCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBwYWdlX251bWJlcnMgPQ0KKyAgICAgIEdldFBhZ2VOdW1iZXJzRnJvbVByaW50UGFnZU51bWJlclJhbmdlKHBhZ2VfcmFuZ2VzLCBwYWdlX3JhbmdlX2NvdW50KTsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFnZV9udW1iZXJzLnNpemUoKTsgKytpKSB7DQorICAgIHVpbnQzMl90IHBhZ2VfbnVtYmVyID0gcGFnZV9udW1iZXJzW2ldOw0KKyAgICBwYWdlc19bcGFnZV9udW1iZXJdLT5HZXRQYWdlKCk7DQorICAgIGlmICghSXNQYWdlVmlzaWJsZShwYWdlX251bWJlcnNbaV0pKQ0KKyAgICAgIHBhZ2VzX1twYWdlX251bWJlcl0tPlVubG9hZCgpOw0KKyAgfQ0KKw0KKyAgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMob3V0cHV0X2RvYywgZG9jXyk7DQorICBpZiAoIUZQREZfSW1wb3J0UGFnZXMob3V0cHV0X2RvYywgZG9jXywgcGFnZV9udW1iZXJfc3RyLmNfc3RyKCksIDApKSB7DQorICAgIEZQREZfQ2xvc2VEb2N1bWVudChvdXRwdXRfZG9jKTsNCisgICAgcmV0dXJuIHBwOjpCdWZmZXJfRGV2KCk7DQorICB9DQorDQorICBGaXRDb250ZW50c1RvUHJpbnRhYmxlQXJlYUlmUmVxdWlyZWQob3V0cHV0X2RvYywgcHJpbnRfc2V0dGluZ3MpOw0KKw0KKyAgLy8gTm93IGZsYXR0ZW4gYWxsIHRoZSBvdXRwdXQgcGFnZXMuDQorICBwcDo6QnVmZmVyX0RldiBidWZmZXIgPSBHZXRGbGF0dGVuZWRQcmludERhdGEob3V0cHV0X2RvYyk7DQorICBGUERGX0Nsb3NlRG9jdW1lbnQob3V0cHV0X2RvYyk7DQorICByZXR1cm4gYnVmZmVyOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Rml0Q29udGVudHNUb1ByaW50YWJsZUFyZWFJZlJlcXVpcmVkKA0KKyAgICBjb25zdCBGUERGX0RPQ1VNRU5UJiBkb2MsIGNvbnN0IFBQX1ByaW50U2V0dGluZ3NfRGV2JiBwcmludF9zZXR0aW5ncykgew0KKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZml0IHBkZiBjb250ZW50cyB0byBwcmludGVyIHBhcGVyIHNpemUuDQorICBpZiAocHJpbnRfc2V0dGluZ3MucHJpbnRfc2NhbGluZ19vcHRpb24gIT0NCisgICAgICAgICAgUFBfUFJJTlRTQ0FMSU5HT1BUSU9OX1NPVVJDRV9TSVpFKSB7DQorICAgIGludCBudW1fcGFnZXMgPSBGUERGX0dldFBhZ2VDb3VudChkb2MpOw0KKyAgICAvLyBJbi1wbGFjZSB0cmFuc2Zvcm1hdGlvbiBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNyZWF0aW5nIGEgbmV3DQorICAgIC8vIHRyYW5zZm9ybWVkIGRvY3VtZW50IGZyb20gdGhlIHNvdXJjZSBkb2N1bWVudC4gVGhlcmVmb3JlLCB0cmFuc2Zvcm0NCisgICAgLy8gZXZlcnkgcGFnZSB0byBmaXQgdGhlIGNvbnRlbnRzIGluIHRoZSBzZWxlY3RlZCBwcmludGVyIHBhcGVyLg0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wYWdlczsgKytpKSB7DQorICAgICAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvYywgaSk7DQorICAgICAgVHJhbnNmb3JtUERGUGFnZUZvclByaW50aW5nKHBhZ2UsIHByaW50X3NldHRpbmdzKTsNCisgICAgICBGUERGX0Nsb3NlUGFnZShwYWdlKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6U2F2ZVNlbGVjdGVkRm9ybUZvclByaW50KCkgew0KKyAgRk9STV9Gb3JjZVRvS2lsbEZvY3VzKGZvcm1fKTsNCisgIGNsaWVudF8tPkZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShmYWxzZSk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpQcmludEVuZCgpIHsNCisgIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oZm9ybV8sIEZQREZET0NfQUFDVElPTl9EUCk7DQorfQ0KKw0KK1BERml1bVBhZ2U6OkFyZWEgUERGaXVtRW5naW5lOjpHZXRDaGFySW5kZXgoDQorICAgIGNvbnN0IHBwOjpNb3VzZUlucHV0RXZlbnQmIGV2ZW50LCBpbnQqIHBhZ2VfaW5kZXgsDQorICAgIGludCogY2hhcl9pbmRleCwgUERGaXVtUGFnZTo6TGlua1RhcmdldCogdGFyZ2V0KSB7DQorICAvLyBGaXJzdCBmaWd1cmUgb3V0IHdoaWNoIHBhZ2UgdGhpcyBpcyBpbi4NCisgIHBwOjpQb2ludCBtb3VzZV9wb2ludCA9IGV2ZW50LkdldFBvc2l0aW9uKCk7DQorICBwcDo6UG9pbnQgcG9pbnQoDQorICAgICAgc3RhdGljX2Nhc3Q8aW50PigobW91c2VfcG9pbnQueCgpICsgcG9zaXRpb25fLngoKSkgLyBjdXJyZW50X3pvb21fKSwNCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KChtb3VzZV9wb2ludC55KCkgKyBwb3NpdGlvbl8ueSgpKSAvIGN1cnJlbnRfem9vbV8pKTsNCisgIHJldHVybiBHZXRDaGFySW5kZXgocG9pbnQsIHBhZ2VfaW5kZXgsIGNoYXJfaW5kZXgsIHRhcmdldCk7DQorfQ0KKw0KK1BERml1bVBhZ2U6OkFyZWEgUERGaXVtRW5naW5lOjpHZXRDaGFySW5kZXgoDQorICAgIGNvbnN0IHBwOjpQb2ludCYgcG9pbnQsDQorICAgIGludCogcGFnZV9pbmRleCwNCisgICAgaW50KiBjaGFyX2luZGV4LA0KKyAgICBQREZpdW1QYWdlOjpMaW5rVGFyZ2V0KiB0YXJnZXQpIHsNCisgIGludCBwYWdlID0gLTE7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZpc2libGVfcGFnZXNfLnNpemUoKTsgKytpKSB7DQorICAgIGlmIChwYWdlc19bdmlzaWJsZV9wYWdlc19baV1dLT5yZWN0KCkuQ29udGFpbnMocG9pbnQpKSB7DQorICAgICAgcGFnZSA9IHZpc2libGVfcGFnZXNfW2ldOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAocGFnZSA9PSAtMSkNCisgICAgcmV0dXJuIFBERml1bVBhZ2U6Ok5PTlNFTEVDVEFCTEVfQVJFQTsNCisNCisgIC8vIElmIHRoZSBwYWdlIGhhc24ndCBmaW5pc2hlZCByZW5kZXJpbmcsIGNhbGxpbmcgaW50byB0aGUgcGFnZSBzb21ldGltZXMNCisgIC8vIGxlYWRzIHRvIGhhbmdzLg0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm9ncmVzc2l2ZV9wYWludHNfLnNpemUoKTsgKytpKSB7DQorICAgIGlmIChwcm9ncmVzc2l2ZV9wYWludHNfW2ldLnBhZ2VfaW5kZXggPT0gcGFnZSkNCisgICAgICByZXR1cm4gUERGaXVtUGFnZTo6Tk9OU0VMRUNUQUJMRV9BUkVBOw0KKyAgfQ0KKw0KKyAgKnBhZ2VfaW5kZXggPSBwYWdlOw0KKyAgcmV0dXJuIHBhZ2VzX1twYWdlXS0+R2V0Q2hhckluZGV4KHBvaW50LCBjdXJyZW50X3JvdGF0aW9uXywgY2hhcl9pbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOw0KK30NCisNCitib29sIFBERml1bUVuZ2luZTo6T25Nb3VzZURvd24oY29uc3QgcHA6Ok1vdXNlSW5wdXRFdmVudCYgZXZlbnQpIHsNCisgIGlmIChldmVudC5HZXRCdXR0b24oKSAhPSBQUF9JTlBVVEVWRU5UX01PVVNFQlVUVE9OX0xFRlQpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIFNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yIHNlbGVjdGlvbl9pbnZhbGlkYXRvcih0aGlzKTsNCisgIHNlbGVjdGlvbl8uY2xlYXIoKTsNCisNCisgIGludCBwYWdlX2luZGV4ID0gLTE7DQorICBpbnQgY2hhcl9pbmRleCA9IC0xOw0KKyAgUERGaXVtUGFnZTo6TGlua1RhcmdldCB0YXJnZXQ7DQorICBQREZpdW1QYWdlOjpBcmVhIGFyZWEgPSBHZXRDaGFySW5kZXgoZXZlbnQsICZwYWdlX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyX2luZGV4LCAmdGFyZ2V0KTsNCisgIG1vdXNlX2Rvd25fc3RhdGVfLlNldChhcmVhLCB0YXJnZXQpOw0KKw0KKyAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gb3BlbiBsaW5rIG9yIG5vdCBiYXNlZCBvbiB1c2VyIGFjdGlvbiBpbiBtb3VzZSB1cCBhbmQNCisgIC8vIG1vdXNlIG1vdmUgZXZlbnRzLg0KKyAgaWYgKGFyZWEgPT0gUERGaXVtUGFnZTo6V0VCTElOS19BUkVBKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisNCisgIGlmIChhcmVhID09IFBERml1bVBhZ2U6OkRPQ0xJTktfQVJFQSkgew0KKyAgICBjbGllbnRfLT5TY3JvbGxUb1BhZ2UodGFyZ2V0LnBhZ2UpOw0KKyAgICBjbGllbnRfLT5Gb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoZmFsc2UpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisNCisgIGlmIChwYWdlX2luZGV4ICE9IC0xKSB7DQorICAgIGxhc3RfcGFnZV9tb3VzZV9kb3duXyA9IHBhZ2VfaW5kZXg7DQorICAgIGRvdWJsZSBwYWdlX3gsIHBhZ2VfeTsNCisgICAgcHA6OlBvaW50IHBvaW50ID0gZXZlbnQuR2V0UG9zaXRpb24oKTsNCisgICAgRGV2aWNlVG9QYWdlKHBhZ2VfaW5kZXgsIHBvaW50LngoKSwgcG9pbnQueSgpLCAmcGFnZV94LCAmcGFnZV95KTsNCisNCisgICAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1fLCBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgMCwgcGFnZV94LCBwYWdlX3kpOw0KKyAgICBpbnQgY29udHJvbCA9IEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludCgNCisgICAgICAgIGZvcm1fLCBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgcGFnZV94LCBwYWdlX3kpOw0KKyAgICBpZiAoY29udHJvbCA+IEZQREZfRk9STUZJRUxEX1VOS05PV04pIHsgIC8vIHJldHVybnMgLTEgc29tZXRpbWVzLi4uDQorI2lmZGVmIF9URVNUX1hGQQ0KKyAgICAgIGNsaWVudF8tPkZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShjb250cm9sID09IEZQREZfRk9STUZJRUxEX1RFWFRGSUVMRCB8fA0KKyAgICAgICAgICBjb250cm9sID09IEZQREZfRk9STUZJRUxEX0NPTUJPQk9YIHx8DQorCQkgIGNvbnRyb2wgPT0gRlBERl9GT1JNRklFTERfWEZBKTsNCisjZWxzZSANCisJCWNsaWVudF8tPkZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShjb250cm9sID09IEZQREZfRk9STUZJRUxEX1RFWFRGSUVMRCB8fA0KKwkJCWNvbnRyb2wgPT0gRlBERl9GT1JNRklFTERfQ09NQk9CT1gpOw0KKyNlbmRpZg0KKyAgICAgIHJldHVybiB0cnVlOyAgLy8gUmV0dXJuIG5vdyBiZWZvcmUgd2UgZ2V0IGludG8gdGhlIHNlbGVjdGlvbiBjb2RlLg0KKyAgICB9DQorICB9DQorDQorICBjbGllbnRfLT5Gb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoZmFsc2UpOw0KKw0KKyAgaWYgKGFyZWEgIT0gUERGaXVtUGFnZTo6VEVYVF9BUkVBKQ0KKyAgICByZXR1cm4gdHJ1ZTsgIC8vIFJldHVybiB0cnVlIHNvIFdlYktpdCBkb2Vzbid0IGRvIGl0cyBvd24gaGlnaGxpZ2h0aW5nLg0KKw0KKyAgaWYgKGV2ZW50LkdldENsaWNrQ291bnQoKSA9PSAxKSB7DQorICAgIE9uU2luZ2xlQ2xpY2socGFnZV9pbmRleCwgY2hhcl9pbmRleCk7DQorICB9IGVsc2UgaWYgKGV2ZW50LkdldENsaWNrQ291bnQoKSA9PSAyIHx8DQorICAgICAgICAgICAgIGV2ZW50LkdldENsaWNrQ291bnQoKSA9PSAzKSB7DQorICAgIE9uTXVsdGlwbGVDbGljayhldmVudC5HZXRDbGlja0NvdW50KCksIHBhZ2VfaW5kZXgsIGNoYXJfaW5kZXgpOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpPblNpbmdsZUNsaWNrKGludCBwYWdlX2luZGV4LCBpbnQgY2hhcl9pbmRleCkgew0KKyAgc2VsZWN0aW5nXyA9IHRydWU7DQorICBzZWxlY3Rpb25fLnB1c2hfYmFjayhQREZpdW1SYW5nZShwYWdlc19bcGFnZV9pbmRleF0sIGNoYXJfaW5kZXgsIDApKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6Ok9uTXVsdGlwbGVDbGljayhpbnQgY2xpY2tfY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyX2luZGV4KSB7DQorICAvLyBJdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCBpZiB0aGUgU0RLIGNvdWxkIHN1cHBvcnQgZmluZGluZyBhIHNwYWNlLCBidXQNCisgIC8vIG5vdyBpdCBkb2Vzbid0Lg0KKyAgaW50IHN0YXJ0X2luZGV4ID0gY2hhcl9pbmRleDsNCisgIGRvIHsNCisgICAgYmFzZTo6Y2hhcjE2IGN1ciA9IHBhZ2VzX1twYWdlX2luZGV4XS0+R2V0Q2hhckF0SW5kZXgoc3RhcnRfaW5kZXgpOw0KKyAgICAvLyBGb3IgZG91YmxlIGNsaWNrLCB3ZSB3YW50IHRvIHNlbGVjdCBvbmUgd29yZCBzbyB3ZSBsb29rIGZvciB3aGl0ZXNwYWNlDQorICAgIC8vIGJvdW5kYXJpZXMuICBGb3IgdHJpcGxlIGNsaWNrLCB3ZSB3YW50IHRoZSB3aG9sZSBsaW5lLg0KKyAgICBpZiAoY3VyID09ICdcbicgfHwgKGNsaWNrX2NvdW50ID09IDIgJiYgKGN1ciA9PSAnICcgfHwgY3VyID09ICdcdCcpKSkNCisgICAgICBicmVhazsNCisgIH0gd2hpbGUgKC0tc3RhcnRfaW5kZXggPj0gMCk7DQorICBpZiAoc3RhcnRfaW5kZXgpDQorICAgIHN0YXJ0X2luZGV4Kys7DQorDQorICBpbnQgZW5kX2luZGV4ID0gY2hhcl9pbmRleDsNCisgIGludCB0b3RhbCA9IHBhZ2VzX1twYWdlX2luZGV4XS0+R2V0Q2hhckNvdW50KCk7DQorICB3aGlsZSAoZW5kX2luZGV4KysgPD0gdG90YWwpIHsNCisgICAgYmFzZTo6Y2hhcjE2IGN1ciA9IHBhZ2VzX1twYWdlX2luZGV4XS0+R2V0Q2hhckF0SW5kZXgoZW5kX2luZGV4KTsNCisgICAgaWYgKGN1ciA9PSAnXG4nIHx8IChjbGlja19jb3VudCA9PSAyICYmIChjdXIgPT0gJyAnIHx8IGN1ciA9PSAnXHQnKSkpDQorICAgICAgYnJlYWs7DQorICB9DQorDQorICBzZWxlY3Rpb25fLnB1c2hfYmFjayhQREZpdW1SYW5nZSgNCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0sIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXggLSBzdGFydF9pbmRleCkpOw0KK30NCisNCitib29sIFBERml1bUVuZ2luZTo6T25Nb3VzZVVwKGNvbnN0IHBwOjpNb3VzZUlucHV0RXZlbnQmIGV2ZW50KSB7DQorICBpZiAoZXZlbnQuR2V0QnV0dG9uKCkgIT0gUFBfSU5QVVRFVkVOVF9NT1VTRUJVVFRPTl9MRUZUKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBpbnQgcGFnZV9pbmRleCA9IC0xOw0KKyAgaW50IGNoYXJfaW5kZXggPSAtMTsNCisgIFBERml1bVBhZ2U6OkxpbmtUYXJnZXQgdGFyZ2V0Ow0KKyAgUERGaXVtUGFnZTo6QXJlYSBhcmVhID0NCisgICAgICBHZXRDaGFySW5kZXgoZXZlbnQsICZwYWdlX2luZGV4LCAmY2hhcl9pbmRleCwgJnRhcmdldCk7DQorDQorICAvLyBPcGVuIGxpbmsgb24gbW91c2UgdXAgZm9yIHNhbWUgbGluayBmb3Igd2hpY2ggbW91c2UgZG93biBoYXBwZW5lZCBlYXJsaWVyLg0KKyAgaWYgKG1vdXNlX2Rvd25fc3RhdGVfLk1hdGNoZXMoYXJlYSwgdGFyZ2V0KSkgew0KKyAgICBpZiAoYXJlYSA9PSBQREZpdW1QYWdlOjpXRUJMSU5LX0FSRUEpIHsNCisgICAgICBib29sIG9wZW5faW5fbmV3X3RhYiA9ICEhKGV2ZW50LkdldE1vZGlmaWVycygpICYga0RlZmF1bHRLZXlNb2RpZmllcik7DQorICAgICAgY2xpZW50Xy0+TmF2aWdhdGVUbyh0YXJnZXQudXJsLCBvcGVuX2luX25ld190YWIpOw0KKyAgICAgIGNsaWVudF8tPkZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShmYWxzZSk7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChwYWdlX2luZGV4ICE9IC0xKSB7DQorICAgIGRvdWJsZSBwYWdlX3gsIHBhZ2VfeTsNCisgICAgcHA6OlBvaW50IHBvaW50ID0gZXZlbnQuR2V0UG9zaXRpb24oKTsNCisgICAgRGV2aWNlVG9QYWdlKHBhZ2VfaW5kZXgsIHBvaW50LngoKSwgcG9pbnQueSgpLCAmcGFnZV94LCAmcGFnZV95KTsNCisgICAgRk9STV9PbkxCdXR0b25VcCgNCisgICAgICAgIGZvcm1fLCBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgMCwgcGFnZV94LCBwYWdlX3kpOw0KKyAgfQ0KKw0KKyAgaWYgKCFzZWxlY3RpbmdfKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBzZWxlY3RpbmdfID0gZmFsc2U7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmU6Ok9uTW91c2VNb3ZlKGNvbnN0IHBwOjpNb3VzZUlucHV0RXZlbnQmIGV2ZW50KSB7DQorICBpbnQgcGFnZV9pbmRleCA9IC0xOw0KKyAgaW50IGNoYXJfaW5kZXggPSAtMTsNCisgIFBERml1bVBhZ2U6OkxpbmtUYXJnZXQgdGFyZ2V0Ow0KKyAgUERGaXVtUGFnZTo6QXJlYSBhcmVhID0NCisgICAgICBHZXRDaGFySW5kZXgoZXZlbnQsICZwYWdlX2luZGV4LCAmY2hhcl9pbmRleCwgJnRhcmdldCk7DQorDQorICAvLyBDbGVhciB8bW91c2VfZG93bl9zdGF0ZV98IGlmIG1vdXNlIG1vdmVzIGF3YXkgZnJvbSB3aGVyZSB0aGUgbW91c2UgZG93bg0KKyAgLy8gaGFwcGVuZWQuDQorICBpZiAoIW1vdXNlX2Rvd25fc3RhdGVfLk1hdGNoZXMoYXJlYSwgdGFyZ2V0KSkNCisgICAgbW91c2VfZG93bl9zdGF0ZV8uUmVzZXQoKTsNCisNCisgIGlmICghc2VsZWN0aW5nXykgew0KKyAgICBQUF9DdXJzb3JUeXBlX0RldiBjdXJzb3I7DQorICAgIHN3aXRjaCAoYXJlYSkgew0KKyAgICAgIGNhc2UgUERGaXVtUGFnZTo6VEVYVF9BUkVBOg0KKyAgICAgICAgY3Vyc29yID0gUFBfQ1VSU09SVFlQRV9JQkVBTTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgUERGaXVtUGFnZTo6V0VCTElOS19BUkVBOg0KKyAgICAgIGNhc2UgUERGaXVtUGFnZTo6RE9DTElOS19BUkVBOg0KKyAgICAgICAgY3Vyc29yID0gUFBfQ1VSU09SVFlQRV9IQU5EOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBQREZpdW1QYWdlOjpOT05TRUxFQ1RBQkxFX0FSRUE6DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGN1cnNvciA9IFBQX0NVUlNPUlRZUEVfUE9JTlRFUjsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorDQorICAgIGlmIChwYWdlX2luZGV4ICE9IC0xKSB7DQorICAgICAgZG91YmxlIHBhZ2VfeCwgcGFnZV95Ow0KKyAgICAgIHBwOjpQb2ludCBwb2ludCA9IGV2ZW50LkdldFBvc2l0aW9uKCk7DQorICAgICAgRGV2aWNlVG9QYWdlKHBhZ2VfaW5kZXgsIHBvaW50LngoKSwgcG9pbnQueSgpLCAmcGFnZV94LCAmcGFnZV95KTsNCisNCisgICAgICBGT1JNX09uTW91c2VNb3ZlKGZvcm1fLCBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgMCwgcGFnZV94LCBwYWdlX3kpOw0KKyAgICAgIGludCBjb250cm9sID0gRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KA0KKyAgICAgICAgICBmb3JtXywgcGFnZXNfW3BhZ2VfaW5kZXhdLT5HZXRQYWdlKCksIHBhZ2VfeCwgcGFnZV95KTsNCisgICAgICBzd2l0Y2ggKGNvbnRyb2wpIHsNCisgICAgICAgIGNhc2UgRlBERl9GT1JNRklFTERfUFVTSEJVVFRPTjoNCisgICAgICAgIGNhc2UgRlBERl9GT1JNRklFTERfQ0hFQ0tCT1g6DQorICAgICAgICBjYXNlIEZQREZfRk9STUZJRUxEX1JBRElPQlVUVE9OOg0KKyAgICAgICAgY2FzZSBGUERGX0ZPUk1GSUVMRF9DT01CT0JPWDoNCisgICAgICAgIGNhc2UgRlBERl9GT1JNRklFTERfTElTVEJPWDoNCisgICAgICAgICAgY3Vyc29yID0gUFBfQ1VSU09SVFlQRV9IQU5EOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlBERl9GT1JNRklFTERfVEVYVEZJRUxEOg0KKyAgICAgICAgICBjdXJzb3IgPSBQUF9DVVJTT1JUWVBFX0lCRUFNOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBjbGllbnRfLT5VcGRhdGVDdXJzb3IoY3Vyc29yKTsNCisgICAgcHA6OlBvaW50IHBvaW50ID0gZXZlbnQuR2V0UG9zaXRpb24oKTsNCisgICAgc3RkOjpzdHJpbmcgdXJsID0gR2V0TGlua0F0UG9zaXRpb24oZXZlbnQuR2V0UG9zaXRpb24oKSk7DQorICAgIGlmICh1cmwgIT0gbGlua191bmRlcl9jdXJzb3JfKSB7DQorICAgICAgbGlua191bmRlcl9jdXJzb3JfID0gdXJsOw0KKyAgICAgIHBwOjpQREY6OlNldExpbmtVbmRlckN1cnNvcihHZXRQbHVnaW5JbnN0YW5jZSgpLCB1cmwuY19zdHIoKSk7DQorICAgIH0NCisgICAgLy8gTm8gbmVlZCB0byBzd2FsbG93IHRoZSBldmVudCwgc2luY2UgdGhpcyBtaWdodCBpbnRlcmZlcmUgd2l0aCB0aGUNCisgICAgLy8gc2Nyb2xsYmFycyBpZiB0aGUgdXNlciBpcyBkcmFnZ2luZyB0aGVtLg0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvLyBXZSdyZSBzZWxlY3RpbmcgYnV0IHJpZ2h0IG5vdyB3ZSdyZSBub3Qgb3ZlciB0ZXh0LCBzbyBkb24ndCBjaGFuZ2UgdGhlDQorICAvLyBjdXJyZW50IHNlbGVjdGlvbi4NCisgIGlmIChhcmVhICE9IFBERml1bVBhZ2U6OlRFWFRfQVJFQSAmJiBhcmVhICE9IFBERml1bVBhZ2U6OldFQkxJTktfQVJFQSAmJg0KKyAgICAgIGFyZWEgIT0gUERGaXVtUGFnZTo6RE9DTElOS19BUkVBKSB7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIFNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yIHNlbGVjdGlvbl9pbnZhbGlkYXRvcih0aGlzKTsNCisNCisgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBkZXNjcmVhc2VkIHRoZWlyIHNlbGVjdGlvbiBhcmVhIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZQ0KKyAgLy8gcGFnZXMgZnJvbSBzZWxlY3Rpb25fLg0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZWxlY3Rpb25fLnNpemUoKTsgKytpKSB7DQorICAgIGlmIChzZWxlY3Rpb25fW2ldLnBhZ2VfaW5kZXgoKSA9PSBwYWdlX2luZGV4KSB7DQorICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG90aGVyIHBhZ2VzIGFmdGVyIHRoaXMuDQorICAgICAgc2VsZWN0aW9uXy5lcmFzZShzZWxlY3Rpb25fLmJlZ2luKCkgKyBpICsgMSwgc2VsZWN0aW9uXy5lbmQoKSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChzZWxlY3Rpb25fLnNpemUoKSA9PSAwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBpbnQgbGFzdCA9IHNlbGVjdGlvbl8uc2l6ZSgpIC0gMTsNCisgIGlmIChzZWxlY3Rpb25fW2xhc3RdLnBhZ2VfaW5kZXgoKSA9PSBwYWdlX2luZGV4KSB7DQorICAgIC8vIFNlbGVjdGluZyB3aXRoaW4gYSBwYWdlLg0KKyAgICBpbnQgY291bnQ7DQorICAgIGlmIChjaGFyX2luZGV4ID49IHNlbGVjdGlvbl9bbGFzdF0uY2hhcl9pbmRleCgpKSB7DQorICAgICAgLy8gU2VsZWN0aW5nIGZvcndhcmQuDQorICAgICAgY291bnQgPSBjaGFyX2luZGV4IC0gc2VsZWN0aW9uX1tsYXN0XS5jaGFyX2luZGV4KCkgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNvdW50ID0gY2hhcl9pbmRleCAtIHNlbGVjdGlvbl9bbGFzdF0uY2hhcl9pbmRleCgpIC0gMTsNCisgICAgfQ0KKyAgICBzZWxlY3Rpb25fW2xhc3RdLlNldENoYXJDb3VudChjb3VudCk7DQorICB9IGVsc2UgaWYgKHNlbGVjdGlvbl9bbGFzdF0ucGFnZV9pbmRleCgpIDwgcGFnZV9pbmRleCkgew0KKyAgICAvLyBTZWxlY3RpbmcgaW50byB0aGUgbmV4dCBwYWdlLg0KKw0KKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZ2FwcyBpbiBzZWxlY3Rpb24sIGkuZS4gaWYgbW91c2Vkb3duIG9uDQorICAgIC8vIHBhZ2Ugb25lIGJ1dCB3ZSBvbmx5IGdldCBtb3VzZW1vdmUgb3ZlciBwYWdlIHRocmVlLCB3ZSB3YW50IHBhZ2UgdHdvLg0KKyAgICBmb3IgKGludCBpID0gc2VsZWN0aW9uX1tsYXN0XS5wYWdlX2luZGV4KCkgKyAxOyBpIDwgcGFnZV9pbmRleDsgKytpKSB7DQorICAgICAgc2VsZWN0aW9uXy5wdXNoX2JhY2soUERGaXVtUmFuZ2UocGFnZXNfW2ldLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VzX1tpXS0+R2V0Q2hhckNvdW50KCkpKTsNCisgICAgfQ0KKw0KKyAgICBpbnQgY291bnQgPSBwYWdlc19bc2VsZWN0aW9uX1tsYXN0XS5wYWdlX2luZGV4KCldLT5HZXRDaGFyQ291bnQoKTsNCisgICAgc2VsZWN0aW9uX1tsYXN0XS5TZXRDaGFyQ291bnQoY291bnQgLSBzZWxlY3Rpb25fW2xhc3RdLmNoYXJfaW5kZXgoKSk7DQorICAgIHNlbGVjdGlvbl8ucHVzaF9iYWNrKFBERml1bVJhbmdlKHBhZ2VzX1twYWdlX2luZGV4XSwgMCwgY2hhcl9pbmRleCkpOw0KKyAgfSBlbHNlIHsNCisgICAgLy8gU2VsZWN0aW5nIGludG8gdGhlIHByZXZpb3VzIHBhZ2UuDQorICAgIHNlbGVjdGlvbl9bbGFzdF0uU2V0Q2hhckNvdW50KC1zZWxlY3Rpb25fW2xhc3RdLmNoYXJfaW5kZXgoKSk7DQorDQorICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBnYXBzIGluIHNlbGVjdGlvbiwgaS5lLiBpZiBtb3VzZWRvd24gb24NCisgICAgLy8gcGFnZSB0aHJlZSBidXQgd2Ugb25seSBnZXQgbW91c2Vtb3ZlIG92ZXIgcGFnZSBvbmUsIHdlIHdhbnQgcGFnZSB0d28uDQorICAgIGZvciAoaW50IGkgPSBzZWxlY3Rpb25fW2xhc3RdLnBhZ2VfaW5kZXgoKSAtIDE7IGkgPiBwYWdlX2luZGV4OyAtLWkpIHsNCisgICAgICBzZWxlY3Rpb25fLnB1c2hfYmFjayhQREZpdW1SYW5nZShwYWdlc19baV0sIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXNfW2ldLT5HZXRDaGFyQ291bnQoKSkpOw0KKyAgICB9DQorDQorICAgIGludCBjb3VudCA9IHBhZ2VzX1twYWdlX2luZGV4XS0+R2V0Q2hhckNvdW50KCk7DQorICAgIHNlbGVjdGlvbl8ucHVzaF9iYWNrKA0KKyAgICAgICAgUERGaXVtUmFuZ2UocGFnZXNfW3BhZ2VfaW5kZXhdLCBjb3VudCwgY291bnQgLSBjaGFyX2luZGV4KSk7DQorICB9DQorDQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmU6Ok9uS2V5RG93bihjb25zdCBwcDo6S2V5Ym9hcmRJbnB1dEV2ZW50JiBldmVudCkgew0KKyAgaWYgKGxhc3RfcGFnZV9tb3VzZV9kb3duXyA9PSAtMSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgYm9vbCBydiA9ICEhRk9STV9PbktleURvd24oDQorICAgICAgZm9ybV8sIHBhZ2VzX1tsYXN0X3BhZ2VfbW91c2VfZG93bl9dLT5HZXRQYWdlKCksDQorICAgICAgZXZlbnQuR2V0S2V5Q29kZSgpLCBldmVudC5HZXRNb2RpZmllcnMoKSk7DQorDQorICBpZiAoZXZlbnQuR2V0S2V5Q29kZSgpID09IHVpOjpWS0VZX0JBQ0sgfHwNCisgICAgICBldmVudC5HZXRLZXlDb2RlKCkgPT0gdWk6OlZLRVlfRVNDQVBFKSB7DQorICAgIC8vIENocm9tZSBkb2Vzbid0IHNlbmQgY2hhciBldmVudHMgZm9yIGJhY2tzcGFjZSBvciBlc2NhcGUga2V5cywgc2VlDQorICAgIC8vIFBsYXRmb3JtS2V5Ym9hcmRFdmVudEJ1aWxkZXI6OmlzQ2hhcmFjdGVyS2V5KCkgYW5kDQorICAgIC8vIGh0dHA6Ly9jaHJvbWUtY29ycHN2bi5tdHYuY29ycC5nb29nbGUuY29tL3ZpZXd2Yz92aWV3PXJldiZyb290PWNocm9tZSZyZXZpc2lvbj0zMTgwNQ0KKyAgICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFNvIGp1c3QgZmFrZSBvbmUgc2luY2UgUERGaXVtIHVzZXMgaXQuDQorICAgIHN0ZDo6c3RyaW5nIHN0cjsNCisgICAgc3RyLnB1c2hfYmFjayhldmVudC5HZXRLZXlDb2RlKCkpOw0KKyAgICBwcDo6S2V5Ym9hcmRJbnB1dEV2ZW50IHN5bnRoZXNpemVkKHBwOjpLZXlib2FyZElucHV0RXZlbnQoDQorICAgICAgICBjbGllbnRfLT5HZXRQbHVnaW5JbnN0YW5jZSgpLA0KKyAgICAgICAgUFBfSU5QVVRFVkVOVF9UWVBFX0NIQVIsDQorICAgICAgICBldmVudC5HZXRUaW1lU3RhbXAoKSwNCisgICAgICAgIGV2ZW50LkdldE1vZGlmaWVycygpLA0KKyAgICAgICAgZXZlbnQuR2V0S2V5Q29kZSgpLA0KKyAgICAgICAgc3RyKSk7DQorICAgIE9uQ2hhcihzeW50aGVzaXplZCk7DQorICB9DQorDQorICByZXR1cm4gcnY7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpPbktleVVwKGNvbnN0IHBwOjpLZXlib2FyZElucHV0RXZlbnQmIGV2ZW50KSB7DQorICBpZiAobGFzdF9wYWdlX21vdXNlX2Rvd25fID09IC0xKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gISFGT1JNX09uS2V5VXAoDQorICAgICAgZm9ybV8sIHBhZ2VzX1tsYXN0X3BhZ2VfbW91c2VfZG93bl9dLT5HZXRQYWdlKCksDQorICAgICAgZXZlbnQuR2V0S2V5Q29kZSgpLCBldmVudC5HZXRNb2RpZmllcnMoKSk7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpPbkNoYXIoY29uc3QgcHA6OktleWJvYXJkSW5wdXRFdmVudCYgZXZlbnQpIHsNCisgIGlmIChsYXN0X3BhZ2VfbW91c2VfZG93bl8gPT0gLTEpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIGJhc2U6OnN0cmluZzE2IHN0ciA9IGJhc2U6OlVURjhUb1VURjE2KGV2ZW50LkdldENoYXJhY3RlclRleHQoKS5Bc1N0cmluZygpKTsNCisgIHJldHVybiAhIUZPUk1fT25DaGFyKA0KKyAgICAgIGZvcm1fLCBwYWdlc19bbGFzdF9wYWdlX21vdXNlX2Rvd25fXS0+R2V0UGFnZSgpLA0KKyAgICAgIHN0clswXSwNCisgICAgICBldmVudC5HZXRNb2RpZmllcnMoKSk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpTdGFydEZpbmQoY29uc3QgY2hhciogdGV4dCwgYm9vbCBjYXNlX3NlbnNpdGl2ZSkgew0KKyAgLy8gV2UgY2FuIGdldCBhIGNhbGwgdG8gU3RhcnRGaW5kIGJlZm9yZSB3ZSBoYXZlIGFueSBwYWdlIGluZm9ybWF0aW9uIChpLmUuDQorICAvLyBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gTG9hZERvY3VtZW50IGhhcyBoYXBwZW5lZCkuIEhhbmRsZSB0aGlzIGNhc2UuDQorICBpZiAocGFnZXNfLmVtcHR5KCkpDQorICAgIHJldHVybjsNCisNCisgIGJvb2wgZmlyc3Rfc2VhcmNoID0gZmFsc2U7DQorICBpbnQgY2hhcmFjdGVyX3RvX3N0YXJ0X3NlYXJjaGluZ19mcm9tID0gMDsNCisgIGlmIChjdXJyZW50X2ZpbmRfdGV4dF8gIT0gdGV4dCkgeyAgLy8gRmlyc3QgdGltZSB3ZSBzZWFyY2ggZm9yIHRoaXMgdGV4dC4NCisgICAgZmlyc3Rfc2VhcmNoID0gdHJ1ZTsNCisgICAgc3RkOjp2ZWN0b3I8UERGaXVtUmFuZ2U+IG9sZF9zZWxlY3Rpb24gPSBzZWxlY3Rpb25fOw0KKyAgICBTdG9wRmluZCgpOw0KKyAgICBjdXJyZW50X2ZpbmRfdGV4dF8gPSB0ZXh0Ow0KKw0KKyAgICBpZiAob2xkX3NlbGVjdGlvbi5lbXB0eSgpKSB7DQorICAgICAgLy8gU3RhcnQgc2VhcmNoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuDQorICAgICAgbmV4dF9wYWdlX3RvX3NlYXJjaF8gPSAwOw0KKyAgICAgIGxhc3RfcGFnZV90b19zZWFyY2hfID0gcGFnZXNfLnNpemUoKSAtIDE7DQorICAgICAgbGFzdF9jaGFyYWN0ZXJfaW5kZXhfdG9fc2VhcmNoXyA9IC0xOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIC8vIFRoZXJlJ3MgYSBjdXJyZW50IHNlbGVjdGlvbiwgc28gc3RhcnQgZnJvbSBpdC4NCisgICAgICBuZXh0X3BhZ2VfdG9fc2VhcmNoXyA9IG9sZF9zZWxlY3Rpb25bMF0ucGFnZV9pbmRleCgpOw0KKyAgICAgIGxhc3RfY2hhcmFjdGVyX2luZGV4X3RvX3NlYXJjaF8gPSBvbGRfc2VsZWN0aW9uWzBdLmNoYXJfaW5kZXgoKTsNCisgICAgICBjaGFyYWN0ZXJfdG9fc3RhcnRfc2VhcmNoaW5nX2Zyb20gPSBvbGRfc2VsZWN0aW9uWzBdLmNoYXJfaW5kZXgoKTsNCisgICAgICBsYXN0X3BhZ2VfdG9fc2VhcmNoXyA9IG5leHRfcGFnZV90b19zZWFyY2hfOw0KKyAgICB9DQorICB9DQorDQorICBpbnQgY3VycmVudF9wYWdlID0gbmV4dF9wYWdlX3RvX3NlYXJjaF87DQorDQorICBpZiAocGFnZXNfW2N1cnJlbnRfcGFnZV0tPmF2YWlsYWJsZSgpKSB7DQorICAgIGJhc2U6OnN0cmluZzE2IHN0ciA9IGJhc2U6OlVURjhUb1VURjE2KHRleHQpOw0KKyAgICAvLyBEb24ndCB1c2UgUERGaXVtIHRvIHNlYXJjaCBmb3Igbm93LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgdW5pY29kZSB0ZXh0Lg0KKyAgICAvLyBMZWF2ZSB0aGUgY29kZSBmb3Igbm93IHRvIGF2b2lkIGJpdC1yb3QsIGluIGNhc2UgaXQncyBmaXhlZCBsYXRlci4NCisgICAgaWYgKDApIHsNCisgICAgICBTZWFyY2hVc2luZ1BERml1bSgNCisgICAgICAgICAgc3RyLCBjYXNlX3NlbnNpdGl2ZSwgZmlyc3Rfc2VhcmNoLCBjaGFyYWN0ZXJfdG9fc3RhcnRfc2VhcmNoaW5nX2Zyb20sDQorICAgICAgICAgIGN1cnJlbnRfcGFnZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgU2VhcmNoVXNpbmdJQ1UoDQorICAgICAgICAgIHN0ciwgY2FzZV9zZW5zaXRpdmUsIGZpcnN0X3NlYXJjaCwgY2hhcmFjdGVyX3RvX3N0YXJ0X3NlYXJjaGluZ19mcm9tLA0KKyAgICAgICAgICBjdXJyZW50X3BhZ2UpOw0KKyAgICB9DQorDQorICAgIGlmICghSXNQYWdlVmlzaWJsZShjdXJyZW50X3BhZ2UpKQ0KKyAgICAgIHBhZ2VzX1tjdXJyZW50X3BhZ2VdLT5VbmxvYWQoKTsNCisgIH0NCisNCisgIGlmIChuZXh0X3BhZ2VfdG9fc2VhcmNoXyAhPSBsYXN0X3BhZ2VfdG9fc2VhcmNoXyB8fA0KKyAgICAgIChmaXJzdF9zZWFyY2ggJiYgbGFzdF9jaGFyYWN0ZXJfaW5kZXhfdG9fc2VhcmNoXyAhPSAtMSkpIHsNCisgICAgKytuZXh0X3BhZ2VfdG9fc2VhcmNoXzsNCisgIH0NCisNCisgIGlmIChuZXh0X3BhZ2VfdG9fc2VhcmNoXyA9PSBzdGF0aWNfY2FzdDxpbnQ+KHBhZ2VzXy5zaXplKCkpKQ0KKyAgICBuZXh0X3BhZ2VfdG9fc2VhcmNoXyA9IDA7DQorICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHBhZ2UgaW4gdGhlIGRvY3VtZW50IGFuZCB3ZSBzdGFydCBzZWFyY2hpbmcgbWlkd2F5LA0KKyAgLy8gdGhlbiB3ZSdsbCB3YW50IHRvIHNlYXJjaCB0aGUgcGFnZSBvbmUgbW9yZSB0aW1lLg0KKyAgYm9vbCBlbmRfb2Zfc2VhcmNoID0NCisgICAgICBuZXh0X3BhZ2VfdG9fc2VhcmNoXyA9PSBsYXN0X3BhZ2VfdG9fc2VhcmNoXyAmJg0KKyAgICAgIC8vIE9ubHkgb25lIHBhZ2UgYnV0IGRpZG4ndCBzdGFydCBtaWR3YXkuDQorICAgICAgKChwYWdlc18uc2l6ZSgpID09IDEgJiYgbGFzdF9jaGFyYWN0ZXJfaW5kZXhfdG9fc2VhcmNoXyA9PSAtMSkgfHwNCisgICAgICAgLy8gU3RhcnRlZCBtaWR3YXksIGJ1dCBvbmx5IDEgcGFnZSBhbmQgd2UgYWxyZWFkeSBsb29wZWQgYXJvdW5kLg0KKyAgICAgICAocGFnZXNfLnNpemUoKSA9PSAxICYmICFmaXJzdF9zZWFyY2gpIHx8DQorICAgICAgIC8vIFN0YXJ0ZWQgbWlkd2F5LCBhbmQgd2UndmUganVzdCBsb29wZWQgYXJvdW5kLg0KKyAgICAgICAocGFnZXNfLnNpemUoKSA+IDEgJiYgY3VycmVudF9wYWdlID09IG5leHRfcGFnZV90b19zZWFyY2hfKSk7DQorDQorICBpZiAoZW5kX29mX3NlYXJjaCkgew0KKyAgICAvLyBTZW5kIHRoZSBmaW5hbCBub3RpZmljYXRpb24uDQorICAgIGNsaWVudF8tPk5vdGlmeU51bWJlck9mRmluZFJlc3VsdHNDaGFuZ2VkKGZpbmRfcmVzdWx0c18uc2l6ZSgpLCB0cnVlKTsNCisNCisgICAgLy8gV2hlbiBzZWFyY2hpbmcgaXMgY29tcGxldGUsIHJlc3VtZSBmaW5kaW5nIGF0IGEgcGFydGljdWxhciBpbmRleC4NCisgICAgaWYgKHJlc3VtZV9maW5kX2luZGV4XyAhPSAtMSkgew0KKyAgICAgIGN1cnJlbnRfZmluZF9pbmRleF8gPSByZXN1bWVfZmluZF9pbmRleF87DQorICAgICAgcmVzdW1lX2ZpbmRfaW5kZXhfID0gLTE7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPQ0KKyAgICAgICAgZmluZF9mYWN0b3J5Xy5OZXdDYWxsYmFjaygmUERGaXVtRW5naW5lOjpDb250aW51ZUZpbmQpOw0KKyAgICBwcDo6TW9kdWxlOjpHZXQoKS0+Y29yZSgpLT5DYWxsT25NYWluVGhyZWFkKA0KKyAgICAgICAgMCwgY2FsbGJhY2ssIGNhc2Vfc2Vuc2l0aXZlID8gMSA6IDApOw0KKyAgfQ0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6U2VhcmNoVXNpbmdQREZpdW0oY29uc3QgYmFzZTo6c3RyaW5nMTYmIHRlcm0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3Rfc2VhcmNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcmFjdGVyX3RvX3N0YXJ0X3NlYXJjaGluZ19mcm9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudF9wYWdlKSB7DQorICAvLyBGaW5kIGFsbCB0aGUgbWF0Y2hlcyBpbiB0aGUgY3VycmVudCBwYWdlLg0KKyAgdW5zaWduZWQgbG9uZyBmbGFncyA9IGNhc2Vfc2Vuc2l0aXZlID8gRlBERl9NQVRDSENBU0UgOiAwOw0KKyAgRlBERl9TQ0hIQU5ETEUgZmluZCA9IEZQREZUZXh0X0ZpbmRTdGFydCgNCisgICAgICBwYWdlc19bY3VycmVudF9wYWdlXS0+R2V0VGV4dFBhZ2UoKSwNCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4odGVybS5jX3N0cigpKSwNCisgICAgICBmbGFncywgY2hhcmFjdGVyX3RvX3N0YXJ0X3NlYXJjaGluZ19mcm9tKTsNCisNCisgIC8vIE5vdGU6IHNpbmNlIHdlIHNlYXJjaCBvbmUgcGFnZSBhdCBhIHRpbWUsIHdlIGRvbid0IGZpbmQgbWF0Y2hlcyBhY3Jvc3MNCisgIC8vIHBhZ2UgYm91bmRhcmllcy4gIFdlIGNvdWxkIGRvIHRoaXMgbWFudWFsbHkgb3Vyc2VsZiwgYnV0IGl0IHNlZW1zIGxvdw0KKyAgLy8gcHJpb3JpdHkgc2luY2UgUmVhZGVyIGl0c2VsZiBkb2Vzbid0IGRvIGl0Lg0KKyAgd2hpbGUgKEZQREZUZXh0X0ZpbmROZXh0KGZpbmQpKSB7DQorICAgIFBERml1bVJhbmdlIHJlc3VsdChwYWdlc19bY3VycmVudF9wYWdlXSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4KGZpbmQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlBERlRleHRfR2V0U2NoQ291bnQoZmluZCkpOw0KKw0KKyAgICBpZiAoIWZpcnN0X3NlYXJjaCAmJg0KKyAgICAgICAgbGFzdF9jaGFyYWN0ZXJfaW5kZXhfdG9fc2VhcmNoXyAhPSAtMSAmJg0KKyAgICAgICAgcmVzdWx0LnBhZ2VfaW5kZXgoKSA9PSBsYXN0X3BhZ2VfdG9fc2VhcmNoXyAmJg0KKyAgICAgICAgcmVzdWx0LmNoYXJfaW5kZXgoKSA+PSBsYXN0X2NoYXJhY3Rlcl9pbmRleF90b19zZWFyY2hfKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisNCisgICAgQWRkRmluZFJlc3VsdChyZXN1bHQpOw0KKyAgfQ0KKw0KKyAgRlBERlRleHRfRmluZENsb3NlKGZpbmQpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6U2VhcmNoVXNpbmdJQ1UoY29uc3QgYmFzZTo6c3RyaW5nMTYmIHRlcm0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3Rfc2VhcmNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcmFjdGVyX3RvX3N0YXJ0X3NlYXJjaGluZ19mcm9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudF9wYWdlKSB7DQorICBiYXNlOjpzdHJpbmcxNiBwYWdlX3RleHQ7DQorICBpbnQgdGV4dF9sZW5ndGggPSBwYWdlc19bY3VycmVudF9wYWdlXS0+R2V0Q2hhckNvdW50KCk7DQorICBpZiAoY2hhcmFjdGVyX3RvX3N0YXJ0X3NlYXJjaGluZ19mcm9tKSB7DQorICAgIHRleHRfbGVuZ3RoIC09IGNoYXJhY3Rlcl90b19zdGFydF9zZWFyY2hpbmdfZnJvbTsNCisgIH0gZWxzZSBpZiAoIWZpcnN0X3NlYXJjaCAmJg0KKyAgICAgICAgICAgICBsYXN0X2NoYXJhY3Rlcl9pbmRleF90b19zZWFyY2hfICE9IC0xICYmDQorICAgICAgICAgICAgIGN1cnJlbnRfcGFnZSA9PSBsYXN0X3BhZ2VfdG9fc2VhcmNoXykgew0KKyAgICB0ZXh0X2xlbmd0aCA9IGxhc3RfY2hhcmFjdGVyX2luZGV4X3RvX3NlYXJjaF87DQorICB9DQorICBpZiAodGV4dF9sZW5ndGggPD0gMCkNCisgICAgcmV0dXJuOw0KKyAgdW5zaWduZWQgc2hvcnQqIGRhdGEgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihXcml0ZUludG8oJnBhZ2VfdGV4dCwgdGV4dF9sZW5ndGggKyAxKSk7DQorICBGUERGVGV4dF9HZXRUZXh0KHBhZ2VzX1tjdXJyZW50X3BhZ2VdLT5HZXRUZXh0UGFnZSgpLA0KKyAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJfdG9fc3RhcnRfc2VhcmNoaW5nX2Zyb20sDQorICAgICAgICAgICAgICAgICAgIHRleHRfbGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICBkYXRhKTsNCisgIHN0ZDo6dmVjdG9yPFBERkVuZ2luZTo6Q2xpZW50OjpTZWFyY2hTdHJpbmdSZXN1bHQ+IHJlc3VsdHM7DQorICBjbGllbnRfLT5TZWFyY2hTdHJpbmcoDQorICAgICAgcGFnZV90ZXh0LmNfc3RyKCksIHRlcm0uY19zdHIoKSwgY2FzZV9zZW5zaXRpdmUsICZyZXN1bHRzKTsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgew0KKyAgICAvLyBOZWVkIHRvIG1hcCB0aGUgaW5kZXhlcyBmcm9tIHRoZSBwYWdlIHRleHQsIHdoaWNoIG1heSBoYXZlIGdlbmVyYXRlZA0KKyAgICAvLyBjaGFyYWN0ZXJzIGxpa2Ugc3BhY2UgZXRjLCB0byBjaGFyYWN0ZXIgaW5kaWNlcyBmcm9tIHRoZSBwYWdlLg0KKyAgICBpbnQgdGVtcF9zdGFydCA9IHJlc3VsdHNbaV0uc3RhcnRfaW5kZXggKyBjaGFyYWN0ZXJfdG9fc3RhcnRfc2VhcmNoaW5nX2Zyb207DQorICAgIGludCBzdGFydCA9IEZQREZUZXh0X0dldENoYXJJbmRleEZyb21UZXh0SW5kZXgoDQorICAgICAgICBwYWdlc19bY3VycmVudF9wYWdlXS0+R2V0VGV4dFBhZ2UoKSwgdGVtcF9zdGFydCk7DQorICAgIGludCBlbmQgPSBGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4KA0KKyAgICAgICAgcGFnZXNfW2N1cnJlbnRfcGFnZV0tPkdldFRleHRQYWdlKCksDQorICAgICAgICB0ZW1wX3N0YXJ0ICsgcmVzdWx0c1tpXS5sZW5ndGgpOw0KKyAgICBBZGRGaW5kUmVzdWx0KFBERml1bVJhbmdlKHBhZ2VzX1tjdXJyZW50X3BhZ2VdLCBzdGFydCwgZW5kIC0gc3RhcnQpKTsNCisgIH0NCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkFkZEZpbmRSZXN1bHQoY29uc3QgUERGaXVtUmFuZ2UmIHJlc3VsdCkgew0KKyAgLy8gRmlndXJlIG91dCB3aGVyZSB0byBpbnNlcnQgdGhlIG5ldyBsb2NhdGlvbiwgc2luY2Ugd2UgY291bGQgaGF2ZQ0KKyAgLy8gc3RhcnRlZCBzZWFyY2hpbmcgbWlkd2F5IGFuZCBub3cgd2Ugd3JhcHBlZC4NCisgIHNpemVfdCBpOw0KKyAgaW50IHBhZ2VfaW5kZXggPSByZXN1bHQucGFnZV9pbmRleCgpOw0KKyAgaW50IGNoYXJfaW5kZXggPSByZXN1bHQuY2hhcl9pbmRleCgpOw0KKyAgZm9yIChpID0gMDsgaSA8IGZpbmRfcmVzdWx0c18uc2l6ZSgpOyArK2kpIHsNCisgICAgaWYgKGZpbmRfcmVzdWx0c19baV0ucGFnZV9pbmRleCgpID4gcGFnZV9pbmRleCB8fA0KKyAgICAgICAgKGZpbmRfcmVzdWx0c19baV0ucGFnZV9pbmRleCgpID09IHBhZ2VfaW5kZXggJiYNCisgICAgICAgICBmaW5kX3Jlc3VsdHNfW2ldLmNoYXJfaW5kZXgoKSA+IGNoYXJfaW5kZXgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGZpbmRfcmVzdWx0c18uaW5zZXJ0KGZpbmRfcmVzdWx0c18uYmVnaW4oKSArIGksIHJlc3VsdCk7DQorICBVcGRhdGVUaWNrTWFya3MoKTsNCisNCisgIGlmIChjdXJyZW50X2ZpbmRfaW5kZXhfID09IC0xICYmIHJlc3VtZV9maW5kX2luZGV4XyA9PSAtMSkgew0KKyAgICAvLyBTZWxlY3QgdGhlIGZpcnN0IG1hdGNoLg0KKyAgICBTZWxlY3RGaW5kUmVzdWx0KHRydWUpOw0KKyAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ+KGkpIDw9IGN1cnJlbnRfZmluZF9pbmRleF8pIHsNCisgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IG1hdGNoIGluZGV4DQorICAgIGN1cnJlbnRfZmluZF9pbmRleF8rKzsNCisgICAgY2xpZW50Xy0+Tm90aWZ5U2VsZWN0ZWRGaW5kUmVzdWx0Q2hhbmdlZChjdXJyZW50X2ZpbmRfaW5kZXhfKTsNCisgIH0NCisgIGNsaWVudF8tPk5vdGlmeU51bWJlck9mRmluZFJlc3VsdHNDaGFuZ2VkKGZpbmRfcmVzdWx0c18uc2l6ZSgpLCBmYWxzZSk7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpTZWxlY3RGaW5kUmVzdWx0KGJvb2wgZm9yd2FyZCkgew0KKyAgaWYgKGZpbmRfcmVzdWx0c18uZW1wdHkoKSkgew0KKyAgICBOT1RSRUFDSEVEKCk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIFNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yIHNlbGVjdGlvbl9pbnZhbGlkYXRvcih0aGlzKTsNCisNCisgIC8vIE1vdmUgYmFjay9mb3J3YXJkIHRocm91Z2ggdGhlIHNlYXJjaCBsb2NhdGlvbnMgd2UgcHJldmlvdXNseSBmb3VuZC4NCisgIGlmIChmb3J3YXJkKSB7DQorICAgIGlmICgrK2N1cnJlbnRfZmluZF9pbmRleF8gPT0gc3RhdGljX2Nhc3Q8aW50PihmaW5kX3Jlc3VsdHNfLnNpemUoKSkpDQorICAgICAgY3VycmVudF9maW5kX2luZGV4XyA9IDA7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoLS1jdXJyZW50X2ZpbmRfaW5kZXhfIDwgMCkgew0KKyAgICAgIGN1cnJlbnRfZmluZF9pbmRleF8gPSBmaW5kX3Jlc3VsdHNfLnNpemUoKSAtIDE7DQorICAgIH0NCisgIH0NCisNCisgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIGJlZm9yZSB0ZWxsaW5nIHRoZSBjbGllbnQgdG8gc2Nyb2xsLCBzaW5jZSBpdCBjb3VsZA0KKyAgLy8gcGFpbnQgdGhlbi4NCisgIHNlbGVjdGlvbl8uY2xlYXIoKTsNCisgIHNlbGVjdGlvbl8ucHVzaF9iYWNrKGZpbmRfcmVzdWx0c19bY3VycmVudF9maW5kX2luZGV4X10pOw0KKw0KKyAgLy8gSWYgdGhlIHJlc3VsdCBpcyBub3QgaW4gdmlldywgc2Nyb2xsIHRvIGl0Lg0KKyAgc2l6ZV90IGk7DQorICBwcDo6UmVjdCBib3VuZGluZ19yZWN0Ow0KKyAgcHA6OlJlY3QgdmlzaWJsZV9yZWN0ID0gR2V0VmlzaWJsZVJlY3QoKTsNCisgIC8vIFVzZSB6b29tIG9mIDEuMCBzaW5jZSB2aXNpYmxlX3JlY3QgaXMgd2l0aG91dCB6b29tLg0KKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHJlY3RzID0gZmluZF9yZXN1bHRzX1tjdXJyZW50X2ZpbmRfaW5kZXhfXS4NCisgICAgICBHZXRTY3JlZW5SZWN0cyhwcDo6UG9pbnQoKSwgMS4wLCBjdXJyZW50X3JvdGF0aW9uXyk7DQorICBmb3IgKGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyArK2kpDQorICAgIGJvdW5kaW5nX3JlY3QgPSBib3VuZGluZ19yZWN0LlVuaW9uKHJlY3RzW2ldKTsNCisgIGlmICghdmlzaWJsZV9yZWN0LkNvbnRhaW5zKGJvdW5kaW5nX3JlY3QpKSB7DQorICAgIHBwOjpQb2ludCBjZW50ZXIgPSBib3VuZGluZ19yZWN0LkNlbnRlclBvaW50KCk7DQorICAgIC8vIE1ha2UgdGhlIHBhZ2UgY2VudGVyZWQuDQorICAgIGludCBuZXdfeSA9IHN0YXRpY19jYXN0PGludD4oY2VudGVyLnkoKSAqIGN1cnJlbnRfem9vbV8pIC0NCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih2aXNpYmxlX3JlY3QuaGVpZ2h0KCkgKiBjdXJyZW50X3pvb21fIC8gMik7DQorICAgIGlmIChuZXdfeSA8IDApDQorICAgICAgbmV3X3kgPSAwOw0KKyAgICBjbGllbnRfLT5TY3JvbGxUb1kobmV3X3kpOw0KKw0KKyAgICAvLyBPbmx5IG1vdmUgaG9yaXpvbnRhbGx5IGlmIGl0J3Mgbm90IHZpc2libGUuDQorICAgIGlmIChjZW50ZXIueCgpIDwgdmlzaWJsZV9yZWN0LngoKSB8fCBjZW50ZXIueCgpID4gdmlzaWJsZV9yZWN0LnJpZ2h0KCkpIHsNCisgICAgICBpbnQgbmV3X3ggPSBzdGF0aWNfY2FzdDxpbnQ+KGNlbnRlci54KCkgICogY3VycmVudF96b29tXykgLQ0KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odmlzaWJsZV9yZWN0LndpZHRoKCkgKiBjdXJyZW50X3pvb21fIC8gMik7DQorICAgICAgaWYgKG5ld194IDwgMCkNCisgICAgICAgIG5ld194ID0gMDsNCisgICAgICBjbGllbnRfLT5TY3JvbGxUb1gobmV3X3gpOw0KKyAgICB9DQorICB9DQorDQorICBjbGllbnRfLT5Ob3RpZnlTZWxlY3RlZEZpbmRSZXN1bHRDaGFuZ2VkKGN1cnJlbnRfZmluZF9pbmRleF8pOw0KKw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpTdG9wRmluZCgpIHsNCisgIFNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yIHNlbGVjdGlvbl9pbnZhbGlkYXRvcih0aGlzKTsNCisNCisgIHNlbGVjdGlvbl8uY2xlYXIoKTsNCisgIHNlbGVjdGluZ18gPSBmYWxzZTsNCisgIGZpbmRfcmVzdWx0c18uY2xlYXIoKTsNCisgIG5leHRfcGFnZV90b19zZWFyY2hfID0gLTE7DQorICBsYXN0X3BhZ2VfdG9fc2VhcmNoXyA9IC0xOw0KKyAgbGFzdF9jaGFyYWN0ZXJfaW5kZXhfdG9fc2VhcmNoXyA9IC0xOw0KKyAgY3VycmVudF9maW5kX2luZGV4XyA9IC0xOw0KKyAgY3VycmVudF9maW5kX3RleHRfLmNsZWFyKCk7DQorICBVcGRhdGVUaWNrTWFya3MoKTsNCisgIGZpbmRfZmFjdG9yeV8uQ2FuY2VsQWxsKCk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpVcGRhdGVUaWNrTWFya3MoKSB7DQorICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gdGlja21hcmtzOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5kX3Jlc3VsdHNfLnNpemUoKTsgKytpKSB7DQorICAgIHBwOjpSZWN0IHJlY3Q7DQorICAgIC8vIEFsd2F5cyB1c2UgYW4gb3JpZ2luIG9mIDAsMCBzaW5jZSBzY3JvbGwgcG9zaXRpb25zIGRvbid0IGFmZmVjdCB0aWNrbWFyay4NCisgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHJlY3RzID0gZmluZF9yZXN1bHRzX1tpXS5HZXRTY3JlZW5SZWN0cygNCisgICAgICBwcDo6UG9pbnQoMCwgMCksIGN1cnJlbnRfem9vbV8sIGN1cnJlbnRfcm90YXRpb25fKTsNCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZWN0cy5zaXplKCk7ICsraikNCisgICAgICByZWN0ID0gcmVjdC5VbmlvbihyZWN0c1tqXSk7DQorICAgIHRpY2ttYXJrcy5wdXNoX2JhY2socmVjdCk7DQorICB9DQorDQorICBjbGllbnRfLT5VcGRhdGVUaWNrTWFya3ModGlja21hcmtzKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6Olpvb21VcGRhdGVkKGRvdWJsZSBuZXdfem9vbV9sZXZlbCkgew0KKyAgQ2FuY2VsUGFpbnRzKCk7DQorDQorICBjdXJyZW50X3pvb21fID0gbmV3X3pvb21fbGV2ZWw7DQorDQorICBDYWxjdWxhdGVWaXNpYmxlUGFnZXMoKTsNCisgIFVwZGF0ZVRpY2tNYXJrcygpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Um90YXRlQ2xvY2t3aXNlKCkgew0KKyAgY3VycmVudF9yb3RhdGlvbl8gPSAoY3VycmVudF9yb3RhdGlvbl8gKyAxKSAlIDQ7DQorDQorICAvLyBTdG9yZSB0aGUgY3VycmVudCBmaW5kIGluZGV4IHNvIHRoYXQgd2UgY2FuIHJlc3VtZSBmaW5kaW5nIGF0IHRoYXQNCisgIC8vIHBhcnRpY3VsYXIgaW5kZXggYWZ0ZXIgd2UgaGF2ZSByZWNvbXB1dGVkIHRoZSBmaW5kIHJlc3VsdHMuDQorICBzdGQ6OnN0cmluZyBjdXJyZW50X2ZpbmRfdGV4dCA9IGN1cnJlbnRfZmluZF90ZXh0XzsNCisgIHJlc3VtZV9maW5kX2luZGV4XyA9IGN1cnJlbnRfZmluZF9pbmRleF87DQorDQorICBJbnZhbGlkYXRlQWxsUGFnZXMoKTsNCisNCisgIGlmICghY3VycmVudF9maW5kX3RleHQuZW1wdHkoKSkNCisgICAgU3RhcnRGaW5kKGN1cnJlbnRfZmluZF90ZXh0LmNfc3RyKCksIGZhbHNlKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlJvdGF0ZUNvdW50ZXJjbG9ja3dpc2UoKSB7DQorICBjdXJyZW50X3JvdGF0aW9uXyA9IChjdXJyZW50X3JvdGF0aW9uXyAtIDEpICUgNDsNCisNCisgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGZpbmQgaW5kZXggc28gdGhhdCB3ZSBjYW4gcmVzdW1lIGZpbmRpbmcgYXQgdGhhdA0KKyAgLy8gcGFydGljdWxhciBpbmRleCBhZnRlciB3ZSBoYXZlIHJlY29tcHV0ZWQgdGhlIGZpbmQgcmVzdWx0cy4NCisgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfZmluZF90ZXh0ID0gY3VycmVudF9maW5kX3RleHRfOw0KKyAgcmVzdW1lX2ZpbmRfaW5kZXhfID0gY3VycmVudF9maW5kX2luZGV4XzsNCisNCisgIEludmFsaWRhdGVBbGxQYWdlcygpOw0KKw0KKyAgaWYgKCFjdXJyZW50X2ZpbmRfdGV4dC5lbXB0eSgpKQ0KKyAgICBTdGFydEZpbmQoY3VycmVudF9maW5kX3RleHQuY19zdHIoKSwgZmFsc2UpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6SW52YWxpZGF0ZUFsbFBhZ2VzKCkgew0KKyAgQ2FuY2VsUGFpbnRzKCk7DQorICBTdG9wRmluZCgpOw0KKyAgTG9hZFBhZ2VJbmZvKHRydWUpOw0KKyAgY2xpZW50Xy0+SW52YWxpZGF0ZShwcDo6UmVjdChwbHVnaW5fc2l6ZV8pKTsNCit9DQorDQorc3RkOjpzdHJpbmcgUERGaXVtRW5naW5lOjpHZXRTZWxlY3RlZFRleHQoKSB7DQorICBiYXNlOjpzdHJpbmcxNiByZXN1bHQ7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlbGVjdGlvbl8uc2l6ZSgpOyArK2kpIHsNCisgICAgaWYgKGkgPiAwICYmDQorICAgICAgICBzZWxlY3Rpb25fW2kgLSAxXS5wYWdlX2luZGV4KCkgPiBzZWxlY3Rpb25fW2ldLnBhZ2VfaW5kZXgoKSkgew0KKyAgICAgIHJlc3VsdCA9IHNlbGVjdGlvbl9baV0uR2V0VGV4dCgpICsgcmVzdWx0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZWN0aW9uX1tpXS5HZXRUZXh0KCkpOw0KKyAgICB9DQorICB9DQorDQorICBGb3JtYXRTdHJpbmdXaXRoSHlwaGVucygmcmVzdWx0KTsNCisgIEZvcm1hdFN0cmluZ0Zvck9TKCZyZXN1bHQpOw0KKyAgcmV0dXJuIGJhc2U6OlVURjE2VG9VVEY4KHJlc3VsdCk7DQorfQ0KKw0KK3N0ZDo6c3RyaW5nIFBERml1bUVuZ2luZTo6R2V0TGlua0F0UG9zaXRpb24oY29uc3QgcHA6OlBvaW50JiBwb2ludCkgew0KKyAgaW50IHRlbXA7DQorICBQREZpdW1QYWdlOjpMaW5rVGFyZ2V0IHRhcmdldDsNCisgIHBwOjpQb2ludCBwb2ludF9pbl9wYWdlKA0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oKHBvaW50LngoKSArIHBvc2l0aW9uXy54KCkpIC8gY3VycmVudF96b29tXyksDQorICAgICAgc3RhdGljX2Nhc3Q8aW50PigocG9pbnQueSgpICsgcG9zaXRpb25fLnkoKSkgLyBjdXJyZW50X3pvb21fKSk7DQorICBQREZpdW1QYWdlOjpBcmVhIGFyZWEgPSBHZXRDaGFySW5kZXgocG9pbnRfaW5fcGFnZSwgJnRlbXAsICZ0ZW1wLCAmdGFyZ2V0KTsNCisgIGlmIChhcmVhID09IFBERml1bVBhZ2U6OldFQkxJTktfQVJFQSkNCisgICAgcmV0dXJuIHRhcmdldC51cmw7DQorICByZXR1cm4gc3RkOjpzdHJpbmcoKTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmU6OklzU2VsZWN0aW5nKCkgew0KKyAgcmV0dXJuIHNlbGVjdGluZ187DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpIYXNQZXJtaXNzaW9uKERvY3VtZW50UGVybWlzc2lvbiBwZXJtaXNzaW9uKSBjb25zdCB7DQorICBzd2l0Y2ggKHBlcm1pc3Npb24pIHsNCisgICAgY2FzZSBQRVJNSVNTSU9OX0NPUFk6DQorICAgICAgcmV0dXJuIChwZXJtaXNzaW9uc18gJiBrUERGUGVybWlzc2lvbkNvcHlNYXNrKSAhPSAwOw0KKyAgICBjYXNlIFBFUk1JU1NJT05fQ09QWV9BQ0NFU1NJQkxFOg0KKyAgICAgIHJldHVybiAocGVybWlzc2lvbnNfICYga1BERlBlcm1pc3Npb25Db3B5QWNjZXNzaWJsZU1hc2spICE9IDA7DQorICAgIGNhc2UgUEVSTUlTU0lPTl9QUklOVF9MT1dfUVVBTElUWToNCisgICAgICByZXR1cm4gKHBlcm1pc3Npb25zXyAmIGtQREZQZXJtaXNzaW9uUHJpbnRMb3dRdWFsaXR5TWFzaykgIT0gMDsNCisgICAgY2FzZSBQRVJNSVNTSU9OX1BSSU5UX0hJR0hfUVVBTElUWToNCisgICAgICByZXR1cm4gKHBlcm1pc3Npb25zXyAmIGtQREZQZXJtaXNzaW9uUHJpbnRMb3dRdWFsaXR5TWFzaykgIT0gMCAmJg0KKyAgICAgICAgICAgICAocGVybWlzc2lvbnNfICYga1BERlBlcm1pc3Npb25QcmludEhpZ2hRdWFsaXR5TWFzaykgIT0gMDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH07DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpTZWxlY3RBbGwoKSB7DQorICBTZWxlY3Rpb25DaGFuZ2VJbnZhbGlkYXRvciBzZWxlY3Rpb25faW52YWxpZGF0b3IodGhpcyk7DQorDQorICBzZWxlY3Rpb25fLmNsZWFyKCk7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2VzXy5zaXplKCk7ICsraSkNCisgICAgaWYgKHBhZ2VzX1tpXS0+YXZhaWxhYmxlKCkpIHsNCisgICAgICBzZWxlY3Rpb25fLnB1c2hfYmFjayhQREZpdW1SYW5nZShwYWdlc19baV0sIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXNfW2ldLT5HZXRDaGFyQ291bnQoKSkpOw0KKyAgICB9DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkdldE51bWJlck9mUGFnZXMoKSB7DQorICByZXR1cm4gcGFnZXNfLnNpemUoKTsNCit9DQorDQoraW50IFBERml1bUVuZ2luZTo6R2V0TmFtZWREZXN0aW5hdGlvblBhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc3RpbmF0aW9uKSB7DQorICAvLyBMb29rIGZvciB0aGUgZGVzdGluYXRpb24uDQorICBGUERGX0RFU1QgZGVzdCA9IEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKGRvY18sIGRlc3RpbmF0aW9uLmNfc3RyKCkpOw0KKyAgaWYgKCFkZXN0KSB7DQorICAgIC8vIExvb2sgZm9yIGEgYm9va21hcmsgd2l0aCB0aGUgc2FtZSBuYW1lLg0KKyAgICBiYXNlOjpzdHJpbmcxNiBkZXN0aW5hdGlvbl93aWRlID0gYmFzZTo6VVRGOFRvVVRGMTYoZGVzdGluYXRpb24pOw0KKyAgICBGUERGX1dJREVTVFJJTkcgZGVzdGluYXRpb25fcGRmX3dpZGUgPQ0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxGUERGX1dJREVTVFJJTkc+KGRlc3RpbmF0aW9uX3dpZGUuY19zdHIoKSk7DQorICAgIEZQREZfQk9PS01BUksgYm9va21hcmsgPSBGUERGQm9va21hcmtfRmluZChkb2NfLCBkZXN0aW5hdGlvbl9wZGZfd2lkZSk7DQorICAgIGlmICghYm9va21hcmspDQorICAgICAgcmV0dXJuIC0xOw0KKyAgICBkZXN0ID0gRlBERkJvb2ttYXJrX0dldERlc3QoZG9jXywgYm9va21hcmspOw0KKyAgfQ0KKyAgcmV0dXJuIGRlc3QgPyBGUERGRGVzdF9HZXRQYWdlSW5kZXgoZG9jXywgZGVzdCkgOiAtMTsNCit9DQorDQoraW50IFBERml1bUVuZ2luZTo6R2V0Rmlyc3RWaXNpYmxlUGFnZSgpIHsNCisgIENhbGN1bGF0ZVZpc2libGVQYWdlcygpOw0KKyAgcmV0dXJuIGZpcnN0X3Zpc2libGVfcGFnZV87DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkdldE1vc3RWaXNpYmxlUGFnZSgpIHsNCisgIENhbGN1bGF0ZVZpc2libGVQYWdlcygpOw0KKyAgcmV0dXJuIG1vc3RfdmlzaWJsZV9wYWdlXzsNCit9DQorDQorcHA6OlJlY3QgUERGaXVtRW5naW5lOjpHZXRQYWdlUmVjdChpbnQgaW5kZXgpIHsNCisgIHBwOjpSZWN0IHJjKHBhZ2VzX1tpbmRleF0tPnJlY3QoKSk7DQorICByYy5JbnNldCgta1BhZ2VTaGFkb3dMZWZ0LCAta1BhZ2VTaGFkb3dUb3AsDQorICAgICAgICAgICAta1BhZ2VTaGFkb3dSaWdodCwgLWtQYWdlU2hhZG93Qm90dG9tKTsNCisgIHJldHVybiByYzsNCit9DQorDQorcHA6OlJlY3QgUERGaXVtRW5naW5lOjpHZXRQYWdlQ29udGVudHNSZWN0KGludCBpbmRleCkgew0KKyAgcmV0dXJuIEdldFNjcmVlblJlY3QocGFnZXNfW2luZGV4XS0+cmVjdCgpKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlBhaW50VGh1bWJuYWlsKHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsIGludCBpbmRleCkgew0KKyAgRlBERl9CSVRNQVAgYml0bWFwID0gRlBERkJpdG1hcF9DcmVhdGVFeCgNCisgICAgICBpbWFnZV9kYXRhLT5zaXplKCkud2lkdGgoKSwgaW1hZ2VfZGF0YS0+c2l6ZSgpLmhlaWdodCgpLA0KKyAgICAgIEZQREZCaXRtYXBfQkdSeCwgaW1hZ2VfZGF0YS0+ZGF0YSgpLCBpbWFnZV9kYXRhLT5zdHJpZGUoKSk7DQorDQorICBpZiAocGFnZXNfW2luZGV4XS0+YXZhaWxhYmxlKCkpIHsNCisgICAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIDAsIDAsIGltYWdlX2RhdGEtPnNpemUoKS53aWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2RhdGEtPnNpemUoKS5oZWlnaHQoKSwgMHhGRkZGRkZGRik7DQorDQorICAgIEZQREZfUmVuZGVyUGFnZUJpdG1hcCgNCisgICAgICAgIGJpdG1hcCwgcGFnZXNfW2luZGV4XS0+R2V0UGFnZSgpLCAwLCAwLCBpbWFnZV9kYXRhLT5zaXplKCkud2lkdGgoKSwNCisgICAgICAgIGltYWdlX2RhdGEtPnNpemUoKS5oZWlnaHQoKSwgMCwgR2V0UmVuZGVyaW5nRmxhZ3MoKSk7DQorICB9IGVsc2Ugew0KKyAgICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgaW1hZ2VfZGF0YS0+c2l6ZSgpLndpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZGF0YS0+c2l6ZSgpLmhlaWdodCgpLCBrUGVuZGluZ1BhZ2VDb2xvcik7DQorICB9DQorDQorICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlNldEdyYXlzY2FsZShib29sIGdyYXlzY2FsZSkgew0KKyAgcmVuZGVyX2dyYXlzY2FsZV8gPSBncmF5c2NhbGU7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpPbkNhbGxiYWNrKGludCBpZCkgew0KKyAgaWYgKCF0aW1lcnNfLmNvdW50KGlkKSkNCisgICAgcmV0dXJuOw0KKw0KKyAgdGltZXJzX1tpZF0uc2Vjb25kKGlkKTsNCisgIGlmICh0aW1lcnNfLmNvdW50KGlkKSkgIC8vIFRoZSBjYWxsYmFjayBtaWdodCBkZWxldGUgdGhlIHRpbWVyLg0KKyAgICBjbGllbnRfLT5TY2hlZHVsZUNhbGxiYWNrKGlkLCB0aW1lcnNfW2lkXS5maXJzdCk7DQorfQ0KKw0KK3N0ZDo6c3RyaW5nIFBERml1bUVuZ2luZTo6R2V0UGFnZUFzSlNPTihpbnQgaW5kZXgpIHsNCisgIGlmICghKEhhc1Blcm1pc3Npb24oUEVSTUlTU0lPTl9DT1BZKSB8fA0KKyAgICAgICAgSGFzUGVybWlzc2lvbihQRVJNSVNTSU9OX0NPUFlfQUNDRVNTSUJMRSkpKSB7DQorICAgIHJldHVybiAie30iOw0KKyAgfQ0KKw0KKyAgaWYgKGluZGV4IDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4KSA+IHBhZ2VzXy5zaXplKCkgLSAxKQ0KKyAgICByZXR1cm4gInt9IjsNCisNCisgIHNjb3BlZF9wdHI8YmFzZTo6VmFsdWU+IG5vZGUoDQorICAgICAgcGFnZXNfW2luZGV4XS0+R2V0QWNjZXNzaWJsZUNvbnRlbnRBc1ZhbHVlKGN1cnJlbnRfcm90YXRpb25fKSk7DQorICBzdGQ6OnN0cmluZyBwYWdlX2pzb247DQorICBiYXNlOjpKU09OV3JpdGVyOjpXcml0ZShub2RlLmdldCgpLCAmcGFnZV9qc29uKTsNCisgIHJldHVybiBwYWdlX2pzb247DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpHZXRQcmludFNjYWxpbmcoKSB7DQorICByZXR1cm4gISFGUERGX1ZJRVdFUlJFRl9HZXRQcmludFNjYWxpbmcoZG9jXyk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpBcHBlbmRCbGFua1BhZ2VzKGludCBudW1fcGFnZXMpIHsNCisgIERDSEVDSyhudW1fcGFnZXMgIT0gMCk7DQorDQorICBpZiAoIWRvY18pDQorICAgIHJldHVybjsNCisNCisgIHNlbGVjdGlvbl8uY2xlYXIoKTsNCisgIHBlbmRpbmdfcGFnZXNfLmNsZWFyKCk7DQorDQorICAvLyBEZWxldGUgYWxsIHBhZ2VzIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLg0KKyAgd2hpbGUgKHBhZ2VzXy5zaXplKCkgPiAxKSB7DQorICAgIGRlbGV0ZSBwYWdlc18uYmFjaygpOw0KKyAgICBwYWdlc18ucG9wX2JhY2soKTsNCisgICAgRlBERlBhZ2VfRGVsZXRlKGRvY18sIHBhZ2VzXy5zaXplKCkpOw0KKyAgfQ0KKw0KKyAgLy8gQ2FsY3VsYXRlIGRvY3VtZW50IHNpemUgYW5kIGFsbCBwYWdlIHNpemVzLg0KKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IHBhZ2VfcmVjdHM7DQorICBwcDo6U2l6ZSBwYWdlX3NpemUgPSBHZXRQYWdlU2l6ZSgwKTsNCisgIHBhZ2Vfc2l6ZS5FbmxhcmdlKGtQYWdlU2hhZG93TGVmdCArIGtQYWdlU2hhZG93UmlnaHQsDQorICAgICAgICAgICAgICAgICAgICBrUGFnZVNoYWRvd1RvcCArIGtQYWdlU2hhZG93Qm90dG9tKTsNCisgIHBwOjpTaXplIG9sZF9kb2N1bWVudF9zaXplID0gZG9jdW1lbnRfc2l6ZV87DQorICBkb2N1bWVudF9zaXplXyA9IHBwOjpTaXplKHBhZ2Vfc2l6ZS53aWR0aCgpLCAwKTsNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyArK2kpIHsNCisgICAgaWYgKGkgIT0gMCkgew0KKyAgICAgIC8vIEFkZCBzcGFjZSBmb3IgaG9yaXpvbnRhbCBzZXBhcmF0b3IuDQorICAgICAgZG9jdW1lbnRfc2l6ZV8uRW5sYXJnZSgwLCBrUGFnZVNlcGFyYXRvclRoaWNrbmVzcyk7DQorICAgIH0NCisNCisgICAgcHA6OlJlY3QgcmVjdChwcDo6UG9pbnQoMCwgZG9jdW1lbnRfc2l6ZV8uaGVpZ2h0KCkpLCBwYWdlX3NpemUpOw0KKyAgICBwYWdlX3JlY3RzLnB1c2hfYmFjayhyZWN0KTsNCisNCisgICAgZG9jdW1lbnRfc2l6ZV8uRW5sYXJnZSgwLCBwYWdlX3NpemUuaGVpZ2h0KCkpOw0KKyAgfQ0KKw0KKyAgLy8gQ3JlYXRlIGJsYW5rIHBhZ2VzLg0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBudW1fcGFnZXM7ICsraSkgew0KKyAgICBwcDo6UmVjdCBwYWdlX3JlY3QocGFnZV9yZWN0c1tpXSk7DQorICAgIHBhZ2VfcmVjdC5JbnNldChrUGFnZVNoYWRvd0xlZnQsIGtQYWdlU2hhZG93VG9wLA0KKyAgICAgICAgICAgICAgICAgICAga1BhZ2VTaGFkb3dSaWdodCwga1BhZ2VTaGFkb3dCb3R0b20pOw0KKyAgICBkb3VibGUgd2lkdGhfaW5fcG9pbnRzID0NCisgICAgICAgIHBhZ2VfcmVjdC53aWR0aCgpICoga1BvaW50c1BlckluY2ggLyBrUGl4ZWxzUGVySW5jaDsNCisgICAgZG91YmxlIGhlaWdodF9pbl9wb2ludHMgPQ0KKyAgICAgICAgcGFnZV9yZWN0LmhlaWdodCgpICoga1BvaW50c1BlckluY2ggLyBrUGl4ZWxzUGVySW5jaDsNCisgICAgRlBERlBhZ2VfTmV3KGRvY18sIGksIHdpZHRoX2luX3BvaW50cywgaGVpZ2h0X2luX3BvaW50cyk7DQorICAgIHBhZ2VzXy5wdXNoX2JhY2sobmV3IFBERml1bVBhZ2UodGhpcywgaSwgcGFnZV9yZWN0LCB0cnVlKSk7DQorICB9DQorDQorICBDYWxjdWxhdGVWaXNpYmxlUGFnZXMoKTsNCisgIGlmIChkb2N1bWVudF9zaXplXyAhPSBvbGRfZG9jdW1lbnRfc2l6ZSkNCisgICAgY2xpZW50Xy0+RG9jdW1lbnRTaXplVXBkYXRlZChkb2N1bWVudF9zaXplXyk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpMb2FkRG9jdW1lbnQoKSB7DQorICAvLyBDaGVjayBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkgZm9yIGxvYWRpbmcuIElmIGl0IGlzbid0IGp1c3QgYmFpbCBmb3Igbm93LA0KKyAgLy8gd2Ugd2lsbCBjYWxsIExvYWREb2N1bWVudCgpIGFnYWluIGxhdGVyLg0KKyAgaWYgKCFkb2NfICYmICFkb2NfbG9hZGVyXy5Jc0RvY3VtZW50Q29tcGxldGUoKSAmJg0KKyAgICAgICFGUERGQXZhaWxfSXNEb2NBdmFpbChmcGRmX2F2YWlsYWJpbGl0eV8sICZkb3dubG9hZF9oaW50c18pKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgZ2V0dGluZyBhIHBhc3N3b3JkLCBqdXN0IHJldHVybi4gV2Ugd2lsbCByZXRyeQ0KKyAgLy8gbG9hZGluZyB0aGUgZG9jdW1lbnQgYWZ0ZXIgd2UgZ2V0IHRoZSBwYXNzd29yZCBhbnl3YXkuDQorICBpZiAoZ2V0dGluZ19wYXNzd29yZF8pDQorICAgIHJldHVybjsNCisNCisgIFNjb3BlZFVuc3VwcG9ydGVkRmVhdHVyZSBzY29wZWRfdW5zdXBwb3J0ZWRfZmVhdHVyZSh0aGlzKTsNCisgIGJvb2wgbmVlZHNfcGFzc3dvcmQgPSBmYWxzZTsNCisgIGlmIChUcnlMb2FkaW5nRG9jKGZhbHNlLCBzdGQ6OnN0cmluZygpLCAmbmVlZHNfcGFzc3dvcmQpKSB7DQorICAgIENvbnRpbnVlTG9hZGluZ0RvY3VtZW50KGZhbHNlLCBzdGQ6OnN0cmluZygpKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG5lZWRzX3Bhc3N3b3JkKQ0KKyAgICBHZXRQYXNzd29yZEFuZExvYWQoKTsNCisgIGVsc2UNCisgICAgY2xpZW50Xy0+RG9jdW1lbnRMb2FkRmFpbGVkKCk7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpUcnlMb2FkaW5nRG9jKGJvb2wgd2l0aF9wYXNzd29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogbmVlZHNfcGFzc3dvcmQpIHsNCisgICpuZWVkc19wYXNzd29yZCA9IGZhbHNlOw0KKyAgaWYgKGRvY18pDQorICAgIHJldHVybiB0cnVlOw0KKw0KKyAgY29uc3QgY2hhciogcGFzc3dvcmRfY3N0ciA9IE5VTEw7DQorICBpZiAod2l0aF9wYXNzd29yZCkgew0KKyAgICBwYXNzd29yZF9jc3RyID0gcGFzc3dvcmQuY19zdHIoKTsNCisgICAgcGFzc3dvcmRfdHJpZXNfcmVtYWluaW5nXy0tOw0KKyAgfQ0KKyAgaWYgKGRvY19sb2FkZXJfLklzRG9jdW1lbnRDb21wbGV0ZSgpKQ0KKyAgICBkb2NfID0gRlBERl9Mb2FkQ3VzdG9tRG9jdW1lbnQoJmZpbGVfYWNjZXNzXywgcGFzc3dvcmRfY3N0cik7DQorICBlbHNlDQorICAgIGRvY18gPSBGUERGQXZhaWxfR2V0RG9jdW1lbnQoZnBkZl9hdmFpbGFiaWxpdHlfLCBwYXNzd29yZF9jc3RyKTsNCisNCisgIGlmICghZG9jXyAmJiBGUERGX0dldExhc3RFcnJvcigpID09IEZQREZfRVJSX1BBU1NXT1JEKQ0KKyAgICAqbmVlZHNfcGFzc3dvcmQgPSB0cnVlOw0KKw0KKyAgcmV0dXJuIGRvY18gIT0gTlVMTDsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkdldFBhc3N3b3JkQW5kTG9hZCgpIHsNCisgIGdldHRpbmdfcGFzc3dvcmRfID0gdHJ1ZTsNCisgIERDSEVDSyghZG9jXyAmJiBGUERGX0dldExhc3RFcnJvcigpID09IEZQREZfRVJSX1BBU1NXT1JEKTsNCisgIGNsaWVudF8tPkdldERvY3VtZW50UGFzc3dvcmQocGFzc3dvcmRfZmFjdG9yeV8uTmV3Q2FsbGJhY2tXaXRoT3V0cHV0KA0KKyAgICAgICZQREZpdW1FbmdpbmU6Ok9uR2V0UGFzc3dvcmRDb21wbGV0ZSkpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6T25HZXRQYXNzd29yZENvbXBsZXRlKGludDMyX3QgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlZhciYgcGFzc3dvcmQpIHsNCisgIGdldHRpbmdfcGFzc3dvcmRfID0gZmFsc2U7DQorDQorICBib29sIHBhc3N3b3JkX2dpdmVuID0gZmFsc2U7DQorICBzdGQ6OnN0cmluZyBwYXNzd29yZF90ZXh0Ow0KKyAgaWYgKHJlc3VsdCA9PSBQUF9PSyAmJiBwYXNzd29yZC5pc19zdHJpbmcoKSkgew0KKyAgICBwYXNzd29yZF90ZXh0ID0gcGFzc3dvcmQuQXNTdHJpbmcoKTsNCisgICAgaWYgKCFwYXNzd29yZF90ZXh0LmVtcHR5KCkpDQorICAgICAgcGFzc3dvcmRfZ2l2ZW4gPSB0cnVlOw0KKyAgfQ0KKyAgQ29udGludWVMb2FkaW5nRG9jdW1lbnQocGFzc3dvcmRfZ2l2ZW4sIHBhc3N3b3JkX3RleHQpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Q29udGludWVMb2FkaW5nRG9jdW1lbnQoDQorICAgIGJvb2wgaGFzX3Bhc3N3b3JkLA0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpIHsNCisgIFNjb3BlZFVuc3VwcG9ydGVkRmVhdHVyZSBzY29wZWRfdW5zdXBwb3J0ZWRfZmVhdHVyZSh0aGlzKTsNCisNCisgIGJvb2wgbmVlZHNfcGFzc3dvcmQgPSBmYWxzZTsNCisgIGJvb2wgbG9hZGVkID0gVHJ5TG9hZGluZ0RvYyhoYXNfcGFzc3dvcmQsIHBhc3N3b3JkLCAmbmVlZHNfcGFzc3dvcmQpOw0KKyAgYm9vbCBwYXNzd29yZF9pbmNvcnJlY3QgPSAhbG9hZGVkICYmIGhhc19wYXNzd29yZCAmJiBuZWVkc19wYXNzd29yZDsNCisgIGlmIChwYXNzd29yZF9pbmNvcnJlY3QgJiYgcGFzc3dvcmRfdHJpZXNfcmVtYWluaW5nXyA+IDApIHsNCisgICAgR2V0UGFzc3dvcmRBbmRMb2FkKCk7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIGlmICghZG9jXykgew0KKyAgICBjbGllbnRfLT5Eb2N1bWVudExvYWRGYWlsZWQoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgaWYgKEZQREZEb2NfR2V0UGFnZU1vZGUoZG9jXykgPT0gUEFHRU1PREVfVVNFT1VUTElORVMpDQorICAgIGNsaWVudF8tPkRvY3VtZW50SGFzVW5zdXBwb3J0ZWRGZWF0dXJlKCJCb29rbWFya3MiKTsNCisNCisgIHBlcm1pc3Npb25zXyA9IEZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jXyk7DQorDQorICBpZiAoIWZvcm1fKSB7DQorICAgIC8vIE9ubHkgcmV0dXJucyAwIHdoZW4gZGF0YSBpc24ndCBhdmFpbGFibGUuICBJZiBmb3JtIGRhdGEgaXMgZG93bmxvYWRlZCwgb3INCisgICAgLy8gaWYgdGhpcyBpc24ndCBhIGZvcm0sIHJldHVybnMgcG9zaXRpdmUgdmFsdWVzLg0KKyAgICBpZiAoIWRvY19sb2FkZXJfLklzRG9jdW1lbnRDb21wbGV0ZSgpICYmDQorICAgICAgICAhRlBERkF2YWlsX0lzRm9ybUF2YWlsKGZwZGZfYXZhaWxhYmlsaXR5XywgJmRvd25sb2FkX2hpbnRzXykpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgZm9ybV8gPSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb3VtZW50KA0KKyAgICAgICAgZG9jXywgc3RhdGljX2Nhc3Q8RlBERl9GT1JNRklMTElORk8qPih0aGlzKSk7DQorI2lmZGVmIF9URVNUX1hGQQ0KKwlGUERGX0xvYWRYRkEoZG9jXyk7DQorI2VuZGlmDQorDQorICAgIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoZm9ybV8sIDAsIGtGb3JtSGlnaGxpZ2h0Q29sb3IpOw0KKyAgICBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKGZvcm1fLCBrRm9ybUhpZ2hsaWdodEFscGhhKTsNCisgIH0NCisNCisgIGlmICghZG9jX2xvYWRlcl8uSXNEb2N1bWVudENvbXBsZXRlKCkpIHsNCisgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IHBhZ2UgaXMgYXZhaWxhYmxlLiAgSW4gYSBsaW5lYXJpemVkIFBERiwgdGhhdCBpcyBub3QNCisgICAgLy8gYWx3YXlzIHBhZ2UgMC4gIERvaW5nIHRoaXMgZ2l2ZXMgdXMgdGhlIGRlZmF1bHQgcGFnZSBzaXplLCBzaW5jZSB3aGVuIHRoZQ0KKyAgICAvLyBkb2N1bWVudCBpcyBhdmFpbGFibGUsIHRoZSBmaXJzdCBwYWdlIGlzIGF2YWlsYWJsZSBhcyB3ZWxsLg0KKyAgICBDaGVja1BhZ2VBdmFpbGFibGUoRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShkb2NfKSwgJnBlbmRpbmdfcGFnZXNfKTsNCisgIH0NCisNCisgIExvYWRQYWdlSW5mbyhmYWxzZSk7DQorDQorICBpZiAoZG9jX2xvYWRlcl8uSXNEb2N1bWVudENvbXBsZXRlKCkpDQorICAgIEZpbmlzaExvYWRpbmdEb2N1bWVudCgpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6TG9hZFBhZ2VJbmZvKGJvb2wgcmVsb2FkKSB7DQorICBwZW5kaW5nX3BhZ2VzXy5jbGVhcigpOw0KKyAgcHA6OlNpemUgb2xkX2RvY3VtZW50X3NpemUgPSBkb2N1bWVudF9zaXplXzsNCisgIGRvY3VtZW50X3NpemVfID0gcHA6OlNpemUoKTsNCisgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiBwYWdlX3JlY3RzOw0KKyAgaW50IHBhZ2VfY291bnQgPSBGUERGX0dldFBhZ2VDb3VudChkb2NfKTsNCisgIGJvb2wgZG9jX2NvbXBsZXRlID0gZG9jX2xvYWRlcl8uSXNEb2N1bWVudENvbXBsZXRlKCk7DQorICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VfY291bnQ7ICsraSkgew0KKyAgICBpZiAoaSAhPSAwKSB7DQorICAgICAgLy8gQWRkIHNwYWNlIGZvciBob3Jpem9udGFsIHNlcGFyYXRvci4NCisgICAgICBkb2N1bWVudF9zaXplXy5FbmxhcmdlKDAsIGtQYWdlU2VwYXJhdG9yVGhpY2tuZXNzKTsNCisgICAgfQ0KKw0KKyAgICAvLyBHZXQgcGFnZSBhdmFpbGFiaWxpdHkuIElmIHJlbG9hZD09ZmFsc2UsIGFuZCBkb2N1bWVudCBpcyBub3QgbG9hZGVkIHlldA0KKyAgICAvLyAod2UgYXJlIHVzaW5nIGFzeW5jIGxvYWRpbmcpIC0gbWFyayBhbGwgcGFnZXMgYXMgdW5hdmFpbGFibGUuDQorICAgIC8vIElmIHJlbG9hZD09dHJ1ZSAod2UgaGF2ZSBkb2N1bWVudCBjb25zdHJ1Y3RlZCBhbHJlYWR5KSwgZ2V0IHBhZ2UNCisgICAgLy8gYXZhaWxhYmlsaXR5IGZsYWcgZnJvbSBhbHJlYWR5IGV4aXN0aW5nIFBERml1bVBhZ2UgY2xhc3MuDQorICAgIGJvb2wgcGFnZV9hdmFpbGFibGUgPSByZWxvYWQgPyBwYWdlc19baV0tPmF2YWlsYWJsZSgpIDogZG9jX2NvbXBsZXRlOw0KKw0KKyAgICBwcDo6U2l6ZSBzaXplID0gcGFnZV9hdmFpbGFibGUgPyBHZXRQYWdlU2l6ZShpKSA6IGRlZmF1bHRfcGFnZV9zaXplXzsNCisgICAgc2l6ZS5FbmxhcmdlKGtQYWdlU2hhZG93TGVmdCArIGtQYWdlU2hhZG93UmlnaHQsDQorICAgICAgICAgICAgICAgICBrUGFnZVNoYWRvd1RvcCArIGtQYWdlU2hhZG93Qm90dG9tKTsNCisgICAgcHA6OlJlY3QgcmVjdChwcDo6UG9pbnQoMCwgZG9jdW1lbnRfc2l6ZV8uaGVpZ2h0KCkpLCBzaXplKTsNCisgICAgcGFnZV9yZWN0cy5wdXNoX2JhY2socmVjdCk7DQorDQorICAgIGlmIChzaXplLndpZHRoKCkgPiBkb2N1bWVudF9zaXplXy53aWR0aCgpKQ0KKyAgICAgIGRvY3VtZW50X3NpemVfLnNldF93aWR0aChzaXplLndpZHRoKCkpOw0KKw0KKyAgICBkb2N1bWVudF9zaXplXy5FbmxhcmdlKDAsIHNpemUuaGVpZ2h0KCkpOw0KKyAgfQ0KKw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlX2NvdW50OyArK2kpIHsNCisgICAgLy8gQ2VudGVyIHBhZ2VzIHJlbGF0aXZlIHRvIHRoZSBlbnRpcmUgZG9jdW1lbnQuDQorICAgIHBhZ2VfcmVjdHNbaV0uc2V0X3goKGRvY3VtZW50X3NpemVfLndpZHRoKCkgLSBwYWdlX3JlY3RzW2ldLndpZHRoKCkpIC8gMik7DQorICAgIHBwOjpSZWN0IHBhZ2VfcmVjdChwYWdlX3JlY3RzW2ldKTsNCisgICAgcGFnZV9yZWN0Lkluc2V0KGtQYWdlU2hhZG93TGVmdCwga1BhZ2VTaGFkb3dUb3AsDQorICAgICAgICAgICAgICAgICAgICBrUGFnZVNoYWRvd1JpZ2h0LCBrUGFnZVNoYWRvd0JvdHRvbSk7DQorICAgIGlmIChyZWxvYWQpIHsNCisgICAgICBwYWdlc19baV0tPnNldF9yZWN0KHBhZ2VfcmVjdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcGFnZXNfLnB1c2hfYmFjayhuZXcgUERGaXVtUGFnZSh0aGlzLCBpLCBwYWdlX3JlY3QsIGRvY19jb21wbGV0ZSkpOw0KKyAgICB9DQorICB9DQorDQorICBDYWxjdWxhdGVWaXNpYmxlUGFnZXMoKTsNCisgIGlmIChkb2N1bWVudF9zaXplXyAhPSBvbGRfZG9jdW1lbnRfc2l6ZSkNCisgICAgY2xpZW50Xy0+RG9jdW1lbnRTaXplVXBkYXRlZChkb2N1bWVudF9zaXplXyk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpDYWxjdWxhdGVWaXNpYmxlUGFnZXMoKSB7DQorICAvLyBDbGVhciBwZW5kaW5nIHJlcXVlc3RzIHF1ZXVlLCBzaW5jZSBpdCBtYXkgY29udGFpbiByZXF1ZXN0cyB0byB0aGUgcGFnZXMNCisgIC8vIHRoYXQgYXJlIGFscmVhZHkgaW52aXNpYmxlIChhZnRlciBzY3JvbGxpbmcgZm9yIGV4YW1wbGUpLg0KKyAgcGVuZGluZ19wYWdlc18uY2xlYXIoKTsNCisgIGRvY19sb2FkZXJfLkNsZWFyUGVuZGluZ1JlcXVlc3RzKCk7DQorDQorICB2aXNpYmxlX3BhZ2VzXy5jbGVhcigpOw0KKyAgcHA6OlJlY3QgdmlzaWJsZV9yZWN0KHBsdWdpbl9zaXplXyk7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2VzXy5zaXplKCk7ICsraSkgew0KKyAgICAvLyBDaGVjayBhbiBlbnRpcmUgUGFnZVNjcmVlblJlY3QsIHNpbmNlIHdlIG1pZ2h0IG5lZWQgdG8gcmVwYWludCBzaWRlDQorICAgIC8vIGJvcmRlcnMgYW5kIHNoYWRvd3MgZXZlbiBpZiB0aGUgcGFnZSBpdHNlbGYgaXMgbm90IHZpc2libGUuDQorICAgIC8vIEZvciBleGFtcGxlLCB3aGVuIHVzZXIgdXNlIHBkZiB3aXRoIGRpZmZlcmVudCBwYWdlIHNpemVzIGFuZCB6b29tZWQgaW4NCisgICAgLy8gb3V0c2lkZSBwYWdlIGFyZWEuDQorICAgIGlmICh2aXNpYmxlX3JlY3QuSW50ZXJzZWN0cyhHZXRQYWdlU2NyZWVuUmVjdChpKSkpIHsNCisgICAgICB2aXNpYmxlX3BhZ2VzXy5wdXNoX2JhY2soaSk7DQorICAgICAgQ2hlY2tQYWdlQXZhaWxhYmxlKGksICZwZW5kaW5nX3BhZ2VzXyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgLy8gTmVlZCB0byB1bmxvYWQgcGFnZXMgd2hlbiB3ZSdyZSBub3QgdXNpbmcgdGhlbSwgc2luY2Ugc29tZSBQREZzIHVzZSBhDQorICAgICAgLy8gbG90IG9mIG1lbW9yeS4gIFNlZSBodHRwOi8vY3JidWcuY29tLzQ4NzkxDQorICAgICAgaWYgKGRlZmVyX3BhZ2VfdW5sb2FkXykgew0KKyAgICAgICAgZGVmZXJyZWRfcGFnZV91bmxvYWRzXy5wdXNoX2JhY2soaSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBhZ2VzX1tpXS0+VW5sb2FkKCk7DQorICAgICAgfQ0KKw0KKyAgICAgIC8vIElmIHRoZSBsYXN0IG1vdXNlIGRvd24gd2FzIG9uIGEgcGFnZSB0aGF0J3Mgbm8gbG9uZ2VyIHZpc2libGUsIHJlc2V0DQorICAgICAgLy8gdGhhdCB2YXJpYWJsZSBzbyB0aGF0IHdlIGRvbid0IHNlbmQga2V5Ym9hcmQgZXZlbnRzIHRvIGl0ICh0aGUgZm9jdXMNCisgICAgICAvLyB3aWxsIGJlIGxvc3Qgd2hlbiB0aGUgcGFnZSBpcyBmaXJzdCBjbG9zZWQgYW55d2F5cykuDQorICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oaSkgPT0gbGFzdF9wYWdlX21vdXNlX2Rvd25fKQ0KKyAgICAgICAgbGFzdF9wYWdlX21vdXNlX2Rvd25fID0gLTE7DQorICAgIH0NCisgIH0NCisNCisgIC8vIEFueSBwZW5kaW5nIGhpZ2hsaWdodGluZyBvZiBmb3JtIGZpZWxkcyB3aWxsIGJlIGludmFsaWQgc2luY2UgdGhlc2UgYXJlIGluDQorICAvLyBzY3JlZW4gY29vcmRpbmF0ZXMuDQorICBmb3JtX2hpZ2hsaWdodHNfLmNsZWFyKCk7DQorDQorICBpZiAodmlzaWJsZV9wYWdlc18uc2l6ZSgpID09IDApDQorICAgIGZpcnN0X3Zpc2libGVfcGFnZV8gPSAtMTsNCisgIGVsc2UNCisgICAgZmlyc3RfdmlzaWJsZV9wYWdlXyA9IHZpc2libGVfcGFnZXNfLmZyb250KCk7DQorDQorICBpbnQgbW9zdF92aXNpYmxlX3BhZ2UgPSBmaXJzdF92aXNpYmxlX3BhZ2VfOw0KKyAgLy8gQ2hlY2sgaWYgdGhlIG5leHQgcGFnZSBpcyBtb3JlIHZpc2libGUgdGhhbiB0aGUgZmlyc3Qgb25lLg0KKyAgaWYgKG1vc3RfdmlzaWJsZV9wYWdlICE9IC0xICYmDQorICAgICAgcGFnZXNfLnNpemUoKSA+IDAgJiYNCisgICAgICBtb3N0X3Zpc2libGVfcGFnZSA8IHN0YXRpY19jYXN0PGludD4ocGFnZXNfLnNpemUoKSkgLSAxKSB7DQorICAgIHBwOjpSZWN0IHJjX2ZpcnN0ID0NCisgICAgICAgIHZpc2libGVfcmVjdC5JbnRlcnNlY3QoR2V0UGFnZVNjcmVlblJlY3QobW9zdF92aXNpYmxlX3BhZ2UpKTsNCisgICAgcHA6OlJlY3QgcmNfbmV4dCA9DQorICAgICAgICB2aXNpYmxlX3JlY3QuSW50ZXJzZWN0KEdldFBhZ2VTY3JlZW5SZWN0KG1vc3RfdmlzaWJsZV9wYWdlICsgMSkpOw0KKyAgICBpZiAocmNfbmV4dC5oZWlnaHQoKSA+IHJjX2ZpcnN0LmhlaWdodCgpKQ0KKyAgICAgIG1vc3RfdmlzaWJsZV9wYWdlKys7DQorICB9DQorDQorICBTZXRDdXJyZW50UGFnZShtb3N0X3Zpc2libGVfcGFnZSk7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpJc1BhZ2VWaXNpYmxlKGludCBpbmRleCkgY29uc3Qgew0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2aXNpYmxlX3BhZ2VzXy5zaXplKCk7ICsraSkgew0KKyAgICBpZiAodmlzaWJsZV9wYWdlc19baV0gPT0gaW5kZXgpDQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lOjpDaGVja1BhZ2VBdmFpbGFibGUoaW50IGluZGV4LCBzdGQ6OnZlY3RvcjxpbnQ+KiBwZW5kaW5nKSB7DQorICBpZiAoIWRvY18gfHwgIWZvcm1fKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBpZiAoc3RhdGljX2Nhc3Q8aW50PihwYWdlc18uc2l6ZSgpKSA+IGluZGV4ICYmIHBhZ2VzX1tpbmRleF0tPmF2YWlsYWJsZSgpKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisNCisgIGlmICghRlBERkF2YWlsX0lzUGFnZUF2YWlsKGZwZGZfYXZhaWxhYmlsaXR5XywgaW5kZXgsICZkb3dubG9hZF9oaW50c18pKSB7DQorICAgIHNpemVfdCBqOw0KKyAgICBmb3IgKGogPSAwOyBqIDwgcGVuZGluZy0+c2l6ZSgpOyArK2opIHsNCisgICAgICBpZiAoKCpwZW5kaW5nKVtqXSA9PSBpbmRleCkNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorDQorICAgIGlmIChqID09IHBlbmRpbmctPnNpemUoKSkNCisgICAgICBwZW5kaW5nLT5wdXNoX2JhY2soaW5kZXgpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICBpZiAoc3RhdGljX2Nhc3Q8aW50PihwYWdlc18uc2l6ZSgpKSA+IGluZGV4KQ0KKyAgICBwYWdlc19baW5kZXhdLT5zZXRfYXZhaWxhYmxlKHRydWUpOw0KKyAgaWYgKCFkZWZhdWx0X3BhZ2Vfc2l6ZV8uR2V0QXJlYSgpKQ0KKyAgICBkZWZhdWx0X3BhZ2Vfc2l6ZV8gPSBHZXRQYWdlU2l6ZShpbmRleCk7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorcHA6OlNpemUgUERGaXVtRW5naW5lOjpHZXRQYWdlU2l6ZShpbnQgaW5kZXgpIHsNCisgIHBwOjpTaXplIHNpemU7DQorICBkb3VibGUgd2lkdGhfaW5fcG9pbnRzID0gMDsNCisgIGRvdWJsZSBoZWlnaHRfaW5fcG9pbnRzID0gMDsNCisgIGludCBydiA9IEZQREZfR2V0UGFnZVNpemVCeUluZGV4KA0KKyAgICAgIGRvY18sIGluZGV4LCAmd2lkdGhfaW5fcG9pbnRzLCAmaGVpZ2h0X2luX3BvaW50cyk7DQorDQorICBpZiAocnYpIHsNCisgICAgaW50IHdpZHRoX2luX3BpeGVscyA9IHN0YXRpY19jYXN0PGludD4oDQorICAgICAgICB3aWR0aF9pbl9wb2ludHMgKiBrUGl4ZWxzUGVySW5jaCAvIGtQb2ludHNQZXJJbmNoKTsNCisgICAgaW50IGhlaWdodF9pbl9waXhlbHMgPSBzdGF0aWNfY2FzdDxpbnQ+KA0KKyAgICAgICAgaGVpZ2h0X2luX3BvaW50cyAqIGtQaXhlbHNQZXJJbmNoIC8ga1BvaW50c1BlckluY2gpOw0KKyAgICBpZiAoY3VycmVudF9yb3RhdGlvbl8gJSAyID09IDEpDQorICAgICAgc3RkOjpzd2FwKHdpZHRoX2luX3BpeGVscywgaGVpZ2h0X2luX3BpeGVscyk7DQorICAgIHNpemUgPSBwcDo6U2l6ZSh3aWR0aF9pbl9waXhlbHMsIGhlaWdodF9pbl9waXhlbHMpOw0KKyAgfQ0KKyAgcmV0dXJuIHNpemU7DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OlN0YXJ0UGFpbnQoaW50IHBhZ2VfaW5kZXgsIGNvbnN0IHBwOjpSZWN0JiBkaXJ0eSkgew0KKyAgLy8gRm9yIHRoZSBmaXJzdCB0aW1lIHdlIGhpdCBwYWludCwgZG8gbm90aGluZyBhbmQganVzdCByZWNvcmQgdGhlIHBhaW50IGZvcg0KKyAgLy8gdGhlIG5leHQgY2FsbGJhY2suICBUaGlzIGtlZXBzIHRoZSBVSSByZXNwb25zaXZlIGluIGNhc2UgdGhlIHVzZXIgaXMgZG9pbmcNCisgIC8vIGEgbG90IG9mIHNjcm9sbGluZy4NCisgIFByb2dyZXNzaXZlUGFpbnQgcHJvZ3Jlc3NpdmU7DQorICBwcm9ncmVzc2l2ZS5yZWN0ID0gZGlydHk7DQorICBwcm9ncmVzc2l2ZS5wYWdlX2luZGV4ID0gcGFnZV9pbmRleDsNCisgIHByb2dyZXNzaXZlLmJpdG1hcCA9IE5VTEw7DQorICBwcm9ncmVzc2l2ZS5wYWludGVkXyA9IGZhbHNlOw0KKyAgcHJvZ3Jlc3NpdmVfcGFpbnRzXy5wdXNoX2JhY2socHJvZ3Jlc3NpdmUpOw0KKyAgcmV0dXJuIHByb2dyZXNzaXZlX3BhaW50c18uc2l6ZSgpIC0gMTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmU6OkNvbnRpbnVlUGFpbnQoaW50IHByb2dyZXNzaXZlX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEpIHsNCisjaWYgZGVmaW5lZChPU19MSU5VWCkNCisgIGdfbGFzdF9pbnN0YW5jZV9pZCA9IGNsaWVudF8tPkdldFBsdWdpbkluc3RhbmNlKCktPnBwX2luc3RhbmNlKCk7DQorI2VuZGlmDQorDQorICBpbnQgcnY7DQorICBpbnQgcGFnZV9pbmRleCA9IHByb2dyZXNzaXZlX3BhaW50c19bcHJvZ3Jlc3NpdmVfaW5kZXhdLnBhZ2VfaW5kZXg7DQorICBsYXN0X3Byb2dyZXNzaXZlX3N0YXJ0X3RpbWVfID0gYmFzZTo6VGltZTo6Tm93KCk7DQorICBpZiAocHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV9pbmRleF0uYml0bWFwKSB7DQorICAgIHJ2ID0gRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKA0KKyAgICAgICAgcGFnZXNfW3BhZ2VfaW5kZXhdLT5HZXRQYWdlKCksIHN0YXRpY19jYXN0PElGU0RLX1BBVVNFKj4odGhpcykpOw0KKyAgfSBlbHNlIHsNCisgICAgcHA6OlJlY3QgZGlydHkgPSBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5yZWN0Ow0KKyAgICBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5iaXRtYXAgPSBDcmVhdGVCaXRtYXAoZGlydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9kYXRhKTsNCisgICAgaW50IHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95Ow0KKyAgICBHZXRQREZpdW1SZWN0KA0KKyAgICAgICAgcGFnZV9pbmRleCwgZGlydHksICZzdGFydF94LCAmc3RhcnRfeSwgJnNpemVfeCwgJnNpemVfeSk7DQorICAgIEZQREZCaXRtYXBfRmlsbFJlY3QocHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV9pbmRleF0uYml0bWFwLCBzdGFydF94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCAweEZGRkZGRkZGKTsNCisgICAgcnYgPSBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQoDQorICAgICAgICBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5iaXRtYXAsDQorICAgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksDQorICAgICAgICBjdXJyZW50X3JvdGF0aW9uXywNCisgICAgICAgIEdldFJlbmRlcmluZ0ZsYWdzKCksIHN0YXRpY19jYXN0PElGU0RLX1BBVVNFKj4odGhpcykpOw0KKyAgfQ0KKyAgcmV0dXJuIHJ2ICE9IEZQREZfUkVOREVSX1RPQkVDT1VOVElOVUVEOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6RmluaXNoUGFpbnQoaW50IHByb2dyZXNzaXZlX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKSB7DQorICBpbnQgcGFnZV9pbmRleCA9IHByb2dyZXNzaXZlX3BhaW50c19bcHJvZ3Jlc3NpdmVfaW5kZXhdLnBhZ2VfaW5kZXg7DQorICBwcDo6UmVjdCBkaXJ0eV9pbl9zY3JlZW4gPSBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5yZWN0Ow0KKyAgRlBERl9CSVRNQVAgYml0bWFwID0gcHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV9pbmRleF0uYml0bWFwOw0KKyAgaW50IHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95Ow0KKyAgR2V0UERGaXVtUmVjdCgNCisgICAgICBwYWdlX2luZGV4LCBkaXJ0eV9pbl9zY3JlZW4sICZzdGFydF94LCAmc3RhcnRfeSwgJnNpemVfeCwgJnNpemVfeSk7DQorDQorICAvLyBEcmF3IHRoZSBmb3Jtcy4NCisgIEZQREZfRkZMRHJhdygNCisgICAgICBmb3JtXywgYml0bWFwLCBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LA0KKyAgICAgIHNpemVfeSwgY3VycmVudF9yb3RhdGlvbl8sIEdldFJlbmRlcmluZ0ZsYWdzKCkpOw0KKw0KKyAgRmlsbFBhZ2VTaWRlcyhwcm9ncmVzc2l2ZV9pbmRleCk7DQorDQorICAvLyBQYWludCB0aGUgcGFnZSBzaGFkb3dzLg0KKyAgUGFpbnRQYWdlU2hhZG93KHByb2dyZXNzaXZlX2luZGV4LCBpbWFnZV9kYXRhKTsNCisNCisgIERyYXdTZWxlY3Rpb25zKHByb2dyZXNzaXZlX2luZGV4LCBpbWFnZV9kYXRhKTsNCisNCisgIEZQREZfUmVuZGVyUGFnZV9DbG9zZShwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSk7DQorICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsNCisgIHByb2dyZXNzaXZlX3BhaW50c18uZXJhc2UocHJvZ3Jlc3NpdmVfcGFpbnRzXy5iZWdpbigpICsgcHJvZ3Jlc3NpdmVfaW5kZXgpOw0KKw0KKyAgY2xpZW50Xy0+RG9jdW1lbnRQYWludE9jY3VycmVkKCk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpDYW5jZWxQYWludHMoKSB7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb2dyZXNzaXZlX3BhaW50c18uc2l6ZSgpOyArK2kpIHsNCisgICAgRlBERl9SZW5kZXJQYWdlX0Nsb3NlKHBhZ2VzX1twcm9ncmVzc2l2ZV9wYWludHNfW2ldLnBhZ2VfaW5kZXhdLT5HZXRQYWdlKCkpOw0KKyAgICBGUERGQml0bWFwX0Rlc3Ryb3kocHJvZ3Jlc3NpdmVfcGFpbnRzX1tpXS5iaXRtYXApOw0KKyAgfQ0KKyAgcHJvZ3Jlc3NpdmVfcGFpbnRzXy5jbGVhcigpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6RmlsbFBhZ2VTaWRlcyhpbnQgcHJvZ3Jlc3NpdmVfaW5kZXgpIHsNCisgIGludCBwYWdlX2luZGV4ID0gcHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV9pbmRleF0ucGFnZV9pbmRleDsNCisgIHBwOjpSZWN0IGRpcnR5X2luX3NjcmVlbiA9IHByb2dyZXNzaXZlX3BhaW50c19bcHJvZ3Jlc3NpdmVfaW5kZXhdLnJlY3Q7DQorICBGUERGX0JJVE1BUCBiaXRtYXAgPSBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5iaXRtYXA7DQorDQorICBwcDo6UmVjdCBwYWdlX3JlY3QgPSBwYWdlc19bcGFnZV9pbmRleF0tPnJlY3QoKTsNCisgIGlmIChwYWdlX3JlY3QueCgpID4gMCkgew0KKyAgICBwcDo6UmVjdCBsZWZ0KDAsDQorICAgICAgICAgICAgICAgICAgcGFnZV9yZWN0LnkoKSAtIGtQYWdlU2hhZG93VG9wLA0KKyAgICAgICAgICAgICAgICAgIHBhZ2VfcmVjdC54KCkgLSBrUGFnZVNoYWRvd0xlZnQsDQorICAgICAgICAgICAgICAgICAgcGFnZV9yZWN0LmhlaWdodCgpICsga1BhZ2VTaGFkb3dUb3AgKw0KKyAgICAgICAgICAgICAgICAgICAgICBrUGFnZVNoYWRvd0JvdHRvbSArIGtQYWdlU2VwYXJhdG9yVGhpY2tuZXNzKTsNCisgICAgbGVmdCA9IEdldFNjcmVlblJlY3QobGVmdCkuSW50ZXJzZWN0KGRpcnR5X2luX3NjcmVlbik7DQorDQorICAgIEZQREZCaXRtYXBfRmlsbFJlY3QoYml0bWFwLCBsZWZ0LngoKSAtIGRpcnR5X2luX3NjcmVlbi54KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC55KCkgLSBkaXJ0eV9pbl9zY3JlZW4ueSgpLCBsZWZ0LndpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC5oZWlnaHQoKSwga0JhY2tncm91bmRDb2xvcik7DQorICB9DQorDQorICBpZiAocGFnZV9yZWN0LnJpZ2h0KCkgPCBkb2N1bWVudF9zaXplXy53aWR0aCgpKSB7DQorICAgIHBwOjpSZWN0IHJpZ2h0KHBhZ2VfcmVjdC5yaWdodCgpICsga1BhZ2VTaGFkb3dSaWdodCwNCisgICAgICAgICAgICAgICAgICAgcGFnZV9yZWN0LnkoKSAtIGtQYWdlU2hhZG93VG9wLA0KKyAgICAgICAgICAgICAgICAgICBkb2N1bWVudF9zaXplXy53aWR0aCgpIC0gcGFnZV9yZWN0LnJpZ2h0KCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICBrUGFnZVNoYWRvd1JpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICBwYWdlX3JlY3QuaGVpZ2h0KCkgKyBrUGFnZVNoYWRvd1RvcCArDQorICAgICAgICAgICAgICAgICAgICAgICBrUGFnZVNoYWRvd0JvdHRvbSArIGtQYWdlU2VwYXJhdG9yVGhpY2tuZXNzKTsNCisgICAgcmlnaHQgPSBHZXRTY3JlZW5SZWN0KHJpZ2h0KS5JbnRlcnNlY3QoZGlydHlfaW5fc2NyZWVuKTsNCisNCisgICAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIHJpZ2h0LngoKSAtIGRpcnR5X2luX3NjcmVlbi54KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQueSgpIC0gZGlydHlfaW5fc2NyZWVuLnkoKSwgcmlnaHQud2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICByaWdodC5oZWlnaHQoKSwga0JhY2tncm91bmRDb2xvcik7DQorICB9DQorDQorICAvLyBQYWludCBzZXBhcmF0b3IuDQorICBwcDo6UmVjdCBib3R0b20ocGFnZV9yZWN0LngoKSAtIGtQYWdlU2hhZG93TGVmdCwNCisgICAgICAgICAgICAgICAgICBwYWdlX3JlY3QuYm90dG9tKCkgKyBrUGFnZVNoYWRvd0JvdHRvbSwNCisgICAgICAgICAgICAgICAgICBwYWdlX3JlY3Qud2lkdGgoKSArIGtQYWdlU2hhZG93TGVmdCArIGtQYWdlU2hhZG93UmlnaHQsDQorICAgICAgICAgICAgICAgICAga1BhZ2VTZXBhcmF0b3JUaGlja25lc3MpOw0KKyAgYm90dG9tID0gR2V0U2NyZWVuUmVjdChib3R0b20pLkludGVyc2VjdChkaXJ0eV9pbl9zY3JlZW4pOw0KKw0KKyAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIGJvdHRvbS54KCkgLSBkaXJ0eV9pbl9zY3JlZW4ueCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICBib3R0b20ueSgpIC0gZGlydHlfaW5fc2NyZWVuLnkoKSwgYm90dG9tLndpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbS5oZWlnaHQoKSwga0JhY2tncm91bmRDb2xvcik7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpQYWludFBhZ2VTaGFkb3coaW50IHByb2dyZXNzaXZlX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSkgew0KKyAgaW50IHBhZ2VfaW5kZXggPSBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5wYWdlX2luZGV4Ow0KKyAgcHA6OlJlY3QgZGlydHlfaW5fc2NyZWVuID0gcHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV9pbmRleF0ucmVjdDsNCisgIHBwOjpSZWN0IHBhZ2VfcmVjdCA9IHBhZ2VzX1twYWdlX2luZGV4XS0+cmVjdCgpOw0KKyAgcHA6OlJlY3Qgc2hhZG93X3JlY3QocGFnZV9yZWN0KTsNCisgIHNoYWRvd19yZWN0Lkluc2V0KC1rUGFnZVNoYWRvd0xlZnQsIC1rUGFnZVNoYWRvd1RvcCwNCisgICAgICAgICAgICAgICAgICAgIC1rUGFnZVNoYWRvd1JpZ2h0LCAta1BhZ2VTaGFkb3dCb3R0b20pOw0KKw0KKyAgLy8gRHVlIHRvIHRoZSByb3VuZGluZyBlcnJvcnMgb2YgdGhlIEdldFNjcmVlblJlY3QgaXQgaXMgcG9zc2libGUgdG8gZ2V0DQorICAvLyBkaWZmZXJlbnQgc2l6ZSBzaGFkb3dzIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBldmVuIHRoZXkgYXJlIGRlZmluZWQNCisgIC8vIHRoZSBzYW1lLiBUbyBmaXggdGhpcyBpc3N1ZSBsZXQncyBjYWxjdWxhdGUgc2hhZG93IHJlY3QgYW5kIHRoZW4gc2hyaW5rDQorICAvLyBpdCBieSB0aGUgc2l6ZSBvZiB0aGUgc2hhZG93cy4NCisgIHNoYWRvd19yZWN0ID0gR2V0U2NyZWVuUmVjdChzaGFkb3dfcmVjdCk7DQorICBwYWdlX3JlY3QgPSBzaGFkb3dfcmVjdDsNCisNCisgIHBhZ2VfcmVjdC5JbnNldChzdGF0aWNfY2FzdDxpbnQ+KGNlaWwoa1BhZ2VTaGFkb3dMZWZ0ICogY3VycmVudF96b29tXykpLA0KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oY2VpbChrUGFnZVNoYWRvd1RvcCAqIGN1cnJlbnRfem9vbV8pKSwNCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwoa1BhZ2VTaGFkb3dSaWdodCAqIGN1cnJlbnRfem9vbV8pKSwNCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwoa1BhZ2VTaGFkb3dCb3R0b20gKiBjdXJyZW50X3pvb21fKSkpOw0KKw0KKyAgRHJhd1BhZ2VTaGFkb3cocGFnZV9yZWN0LCBzaGFkb3dfcmVjdCwgZGlydHlfaW5fc2NyZWVuLCBpbWFnZV9kYXRhKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkRyYXdTZWxlY3Rpb25zKGludCBwcm9ncmVzc2l2ZV9pbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSkgew0KKyAgaW50IHBhZ2VfaW5kZXggPSBwcm9ncmVzc2l2ZV9wYWludHNfW3Byb2dyZXNzaXZlX2luZGV4XS5wYWdlX2luZGV4Ow0KKyAgcHA6OlJlY3QgZGlydHlfaW5fc2NyZWVuID0gcHJvZ3Jlc3NpdmVfcGFpbnRzX1twcm9ncmVzc2l2ZV9pbmRleF0ucmVjdDsNCisNCisgIHZvaWQqIHJlZ2lvbiA9IE5VTEw7DQorICBpbnQgc3RyaWRlOw0KKyAgR2V0UmVnaW9uKGRpcnR5X2luX3NjcmVlbi5wb2ludCgpLCBpbWFnZV9kYXRhLCAmcmVnaW9uLCAmc3RyaWRlKTsNCisNCisgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiBoaWdobGlnaHRlZF9yZWN0czsNCisgIHBwOjpSZWN0IHZpc2libGVfcmVjdCA9IEdldFZpc2libGVSZWN0KCk7DQorICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHNlbGVjdGlvbl8uc2l6ZSgpOyArK2spIHsNCisgICAgaWYgKHNlbGVjdGlvbl9ba10ucGFnZV9pbmRleCgpICE9IHBhZ2VfaW5kZXgpDQorICAgICAgY29udGludWU7DQorICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiByZWN0cyA9IHNlbGVjdGlvbl9ba10uR2V0U2NyZWVuUmVjdHMoDQorICAgICAgICB2aXNpYmxlX3JlY3QucG9pbnQoKSwgY3VycmVudF96b29tXywgY3VycmVudF9yb3RhdGlvbl8pOw0KKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlY3RzLnNpemUoKTsgKytqKSB7DQorICAgICAgcHA6OlJlY3QgdmlzaWJsZV9zZWxlY3Rpb24gPSByZWN0c1tqXS5JbnRlcnNlY3QoZGlydHlfaW5fc2NyZWVuKTsNCisgICAgICBpZiAodmlzaWJsZV9zZWxlY3Rpb24uSXNFbXB0eSgpKQ0KKyAgICAgICAgY29udGludWU7DQorDQorICAgICAgdmlzaWJsZV9zZWxlY3Rpb24uT2Zmc2V0KA0KKyAgICAgICAgICAtZGlydHlfaW5fc2NyZWVuLnBvaW50KCkueCgpLCAtZGlydHlfaW5fc2NyZWVuLnBvaW50KCkueSgpKTsNCisgICAgICBIaWdobGlnaHQocmVnaW9uLCBzdHJpZGUsIHZpc2libGVfc2VsZWN0aW9uLCAmaGlnaGxpZ2h0ZWRfcmVjdHMpOw0KKyAgICB9DQorICB9DQorDQorICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGZvcm1faGlnaGxpZ2h0c18uc2l6ZSgpOyArK2spIHsNCisgICAgcHA6OlJlY3QgdmlzaWJsZV9zZWxlY3Rpb24gPSBmb3JtX2hpZ2hsaWdodHNfW2tdLkludGVyc2VjdChkaXJ0eV9pbl9zY3JlZW4pOw0KKyAgICAgIGlmICh2aXNpYmxlX3NlbGVjdGlvbi5Jc0VtcHR5KCkpDQorICAgICAgICBjb250aW51ZTsNCisNCisgICAgdmlzaWJsZV9zZWxlY3Rpb24uT2Zmc2V0KA0KKyAgICAgICAgLWRpcnR5X2luX3NjcmVlbi5wb2ludCgpLngoKSwgLWRpcnR5X2luX3NjcmVlbi5wb2ludCgpLnkoKSk7DQorICAgIEhpZ2hsaWdodChyZWdpb24sIHN0cmlkZSwgdmlzaWJsZV9zZWxlY3Rpb24sICZoaWdobGlnaHRlZF9yZWN0cyk7DQorICB9DQorICBmb3JtX2hpZ2hsaWdodHNfLmNsZWFyKCk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpQYWludFVuYXZhaWxhYmxlUGFnZShpbnQgcGFnZV9pbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIGRpcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKSB7DQorICBpbnQgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3k7DQorICBHZXRQREZpdW1SZWN0KHBhZ2VfaW5kZXgsIGRpcnR5LCAmc3RhcnRfeCwgJnN0YXJ0X3ksICZzaXplX3gsICZzaXplX3kpOw0KKyAgRlBERl9CSVRNQVAgYml0bWFwID0gQ3JlYXRlQml0bWFwKGRpcnR5LCBpbWFnZV9kYXRhKTsNCisgIEZQREZCaXRtYXBfRmlsbFJlY3QoYml0bWFwLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgICAga1BlbmRpbmdQYWdlQ29sb3IpOw0KKw0KKyAgcHA6OlJlY3QgbG9hZGluZ190ZXh0X2luX3NjcmVlbigNCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPnJlY3QoKS53aWR0aCgpIC8gMiwNCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPnJlY3QoKS55KCkgKyBrTG9hZGluZ1RleHRWZXJ0aWNhbE9mZnNldCwgMCwgMCk7DQorICBsb2FkaW5nX3RleHRfaW5fc2NyZWVuID0gR2V0U2NyZWVuUmVjdChsb2FkaW5nX3RleHRfaW5fc2NyZWVuKTsNCisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOw0KK30NCisNCitpbnQgUERGaXVtRW5naW5lOjpHZXRQcm9ncmVzc2l2ZUluZGV4KGludCBwYWdlX2luZGV4KSBjb25zdCB7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb2dyZXNzaXZlX3BhaW50c18uc2l6ZSgpOyArK2kpIHsNCisgICAgaWYgKHByb2dyZXNzaXZlX3BhaW50c19baV0ucGFnZV9pbmRleCA9PSBwYWdlX2luZGV4KQ0KKyAgICAgIHJldHVybiBpOw0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitGUERGX0JJVE1BUCBQREZpdW1FbmdpbmU6OkNyZWF0ZUJpdG1hcChjb25zdCBwcDo6UmVjdCYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKSBjb25zdCB7DQorICB2b2lkKiByZWdpb247DQorICBpbnQgc3RyaWRlOw0KKyAgR2V0UmVnaW9uKHJlY3QucG9pbnQoKSwgaW1hZ2VfZGF0YSwgJnJlZ2lvbiwgJnN0cmlkZSk7DQorICBpZiAoIXJlZ2lvbikNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gRlBERkJpdG1hcF9DcmVhdGVFeCgNCisgICAgICByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCksIEZQREZCaXRtYXBfQkdSeCwgcmVnaW9uLCBzdHJpZGUpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6R2V0UERGaXVtUmVjdCgNCisgICAgaW50IHBhZ2VfaW5kZXgsIGNvbnN0IHBwOjpSZWN0JiByZWN0LCBpbnQqIHN0YXJ0X3gsIGludCogc3RhcnRfeSwNCisgICAgaW50KiBzaXplX3gsIGludCogc2l6ZV95KSBjb25zdCB7DQorICBwcDo6UmVjdCBwYWdlX3JlY3QgPSBHZXRTY3JlZW5SZWN0KHBhZ2VzX1twYWdlX2luZGV4XS0+cmVjdCgpKTsNCisgIHBhZ2VfcmVjdC5PZmZzZXQoLXJlY3QueCgpLCAtcmVjdC55KCkpOw0KKw0KKyAgKnN0YXJ0X3ggPSBwYWdlX3JlY3QueCgpOw0KKyAgKnN0YXJ0X3kgPSBwYWdlX3JlY3QueSgpOw0KKyAgKnNpemVfeCA9IHBhZ2VfcmVjdC53aWR0aCgpOw0KKyAgKnNpemVfeSA9IHBhZ2VfcmVjdC5oZWlnaHQoKTsNCit9DQorDQoraW50IFBERml1bUVuZ2luZTo6R2V0UmVuZGVyaW5nRmxhZ3MoKSBjb25zdCB7DQorICBpbnQgZmxhZ3MgPSBGUERGX0xDRF9URVhUIHwgRlBERl9OT19DQVRDSDsNCisgIGlmIChyZW5kZXJfZ3JheXNjYWxlXykNCisgICAgZmxhZ3MgfD0gRlBERl9HUkFZU0NBTEU7DQorICBpZiAoY2xpZW50Xy0+SXNQcmludFByZXZpZXcoKSkNCisgICAgZmxhZ3MgfD0gRlBERl9QUklOVElORzsNCisgIHJldHVybiBmbGFnczsNCit9DQorDQorcHA6OlJlY3QgUERGaXVtRW5naW5lOjpHZXRWaXNpYmxlUmVjdCgpIGNvbnN0IHsNCisgIHBwOjpSZWN0IHJ2Ow0KKyAgcnYuc2V0X3goc3RhdGljX2Nhc3Q8aW50Pihwb3NpdGlvbl8ueCgpIC8gY3VycmVudF96b29tXykpOw0KKyAgcnYuc2V0X3koc3RhdGljX2Nhc3Q8aW50Pihwb3NpdGlvbl8ueSgpIC8gY3VycmVudF96b29tXykpOw0KKyAgcnYuc2V0X3dpZHRoKHN0YXRpY19jYXN0PGludD4oY2VpbChwbHVnaW5fc2l6ZV8ud2lkdGgoKSAvIGN1cnJlbnRfem9vbV8pKSk7DQorICBydi5zZXRfaGVpZ2h0KHN0YXRpY19jYXN0PGludD4oY2VpbChwbHVnaW5fc2l6ZV8uaGVpZ2h0KCkgLyBjdXJyZW50X3pvb21fKSkpOw0KKyAgcmV0dXJuIHJ2Ow0KK30NCisNCitwcDo6UmVjdCBQREZpdW1FbmdpbmU6OkdldFBhZ2VTY3JlZW5SZWN0KGludCBwYWdlX2luZGV4KSBjb25zdCB7DQorICAvLyBTaW5jZSB3ZSB1c2UgdGhpcyByZWN0IGZvciBjcmVhdGluZyB0aGUgUERGaXVtIGJpdG1hcCwgYWxzbyBpbmNsdWRlIG90aGVyDQorICAvLyBhcmVhcyBhcm91bmQgdGhlIHBhZ2UgdGhhdCB3ZSBtaWdodCBuZWVkIHRvIHVwZGF0ZSBzdWNoIGFzIHRoZSBwYWdlDQorICAvLyBzZXBhcmF0b3IgYW5kIHRoZSBzaWRlcyBpZiB0aGUgcGFnZSBpcyBuYXJyb3dlciB0aGFuIHRoZSBkb2N1bWVudC4NCisgIHJldHVybiBHZXRTY3JlZW5SZWN0KHBwOjpSZWN0KA0KKyAgICAgIDAsDQorICAgICAgcGFnZXNfW3BhZ2VfaW5kZXhdLT5yZWN0KCkueSgpIC0ga1BhZ2VTaGFkb3dUb3AsDQorICAgICAgZG9jdW1lbnRfc2l6ZV8ud2lkdGgoKSwNCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPnJlY3QoKS5oZWlnaHQoKSArIGtQYWdlU2hhZG93VG9wICsNCisgICAgICAgICAga1BhZ2VTaGFkb3dCb3R0b20gKyBrUGFnZVNlcGFyYXRvclRoaWNrbmVzcykpOw0KK30NCisNCitwcDo6UmVjdCBQREZpdW1FbmdpbmU6OkdldFNjcmVlblJlY3QoY29uc3QgcHA6OlJlY3QmIHJlY3QpIGNvbnN0IHsNCisgIHBwOjpSZWN0IHJ2Ow0KKyAgaW50IHJpZ2h0ID0NCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwocmVjdC5yaWdodCgpICogY3VycmVudF96b29tXyAtIHBvc2l0aW9uXy54KCkpKTsNCisgIGludCBib3R0b20gPQ0KKyAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwocmVjdC5ib3R0b20oKSAqIGN1cnJlbnRfem9vbV8gLSBwb3NpdGlvbl8ueSgpKSk7DQorDQorICBydi5zZXRfeChzdGF0aWNfY2FzdDxpbnQ+KHJlY3QueCgpICogY3VycmVudF96b29tXyAtIHBvc2l0aW9uXy54KCkpKTsNCisgIHJ2LnNldF95KHN0YXRpY19jYXN0PGludD4ocmVjdC55KCkgKiBjdXJyZW50X3pvb21fIC0gcG9zaXRpb25fLnkoKSkpOw0KKyAgcnYuc2V0X3dpZHRoKHJpZ2h0IC0gcnYueCgpKTsNCisgIHJ2LnNldF9oZWlnaHQoYm90dG9tIC0gcnYueSgpKTsNCisgIHJldHVybiBydjsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkhpZ2hsaWdodCh2b2lkKiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIGhpZ2hsaWdodGVkX3JlY3RzKSB7DQorICBpZiAoIWJ1ZmZlcikNCisgICAgcmV0dXJuOw0KKw0KKyAgcHA6OlJlY3QgbmV3X3JlY3QgPSByZWN0Ow0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoaWdobGlnaHRlZF9yZWN0cy0+c2l6ZSgpOyArK2kpDQorICAgIG5ld19yZWN0ID0gbmV3X3JlY3QuU3VidHJhY3QoKCpoaWdobGlnaHRlZF9yZWN0cylbaV0pOw0KKw0KKyAgaGlnaGxpZ2h0ZWRfcmVjdHMtPnB1c2hfYmFjayhuZXdfcmVjdCk7DQorICBpbnQgbCA9IG5ld19yZWN0LngoKTsNCisgIGludCB0ID0gbmV3X3JlY3QueSgpOw0KKyAgaW50IHcgPSBuZXdfcmVjdC53aWR0aCgpOw0KKyAgaW50IGggPSBuZXdfcmVjdC5oZWlnaHQoKTsNCisNCisgIGZvciAoaW50IHkgPSB0OyB5IDwgdCArIGg7ICsreSkgew0KKyAgICBmb3IgKGludCB4ID0gbDsgeCA8IGwgKyB3OyArK3gpIHsNCisgICAgICB1aW50OCogcGl4ZWwgPSBzdGF0aWNfY2FzdDx1aW50OCo+KGJ1ZmZlcikgKyB5ICogc3RyaWRlICsgeCAqIDQ7DQorICAgICAgLy8gIFRoaXMgaXMgb3VyIGhpZ2hsaWdodCBjb2xvci4NCisgICAgICBwaXhlbFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigNCisgICAgICAgICAgcGl4ZWxbMF0gKiAoa0hpZ2hsaWdodENvbG9yQiAvIDI1NS4wKSk7DQorICAgICAgcGl4ZWxbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oDQorICAgICAgICAgIHBpeGVsWzFdICogKGtIaWdobGlnaHRDb2xvckcgLyAyNTUuMCkpOw0KKyAgICAgIHBpeGVsWzJdID0gc3RhdGljX2Nhc3Q8dWludDg+KA0KKyAgICAgICAgICBwaXhlbFsyXSAqIChrSGlnaGxpZ2h0Q29sb3JSIC8gMjU1LjApKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCitQREZpdW1FbmdpbmU6OlNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yOjpTZWxlY3Rpb25DaGFuZ2VJbnZhbGlkYXRvcigNCisgICAgUERGaXVtRW5naW5lKiBlbmdpbmUpIDogZW5naW5lXyhlbmdpbmUpIHsNCisgIHByZXZpb3VzX29yaWdpbl8gPSBlbmdpbmVfLT5HZXRWaXNpYmxlUmVjdCgpLnBvaW50KCk7DQorICBHZXRWaXNpYmxlU2VsZWN0aW9uc1NjcmVlblJlY3RzKCZvbGRfc2VsZWN0aW9uc18pOw0KK30NCisNCitQREZpdW1FbmdpbmU6OlNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yOjp+U2VsZWN0aW9uQ2hhbmdlSW52YWxpZGF0b3IoKSB7DQorICAvLyBPZmZzZXQgdGhlIG9sZCBzZWxlY3Rpb25zIGlmIHRoZSBkb2N1bWVudCBzY3JvbGxlZCBzaW5jZSB3ZSByZWNvcmRlZCB0aGVtLg0KKyAgcHA6OlBvaW50IG9mZnNldCA9IHByZXZpb3VzX29yaWdpbl8gLSBlbmdpbmVfLT5HZXRWaXNpYmxlUmVjdCgpLnBvaW50KCk7DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9sZF9zZWxlY3Rpb25zXy5zaXplKCk7ICsraSkNCisgICAgb2xkX3NlbGVjdGlvbnNfW2ldLk9mZnNldChvZmZzZXQpOw0KKw0KKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IG5ld19zZWxlY3Rpb25zOw0KKyAgR2V0VmlzaWJsZVNlbGVjdGlvbnNTY3JlZW5SZWN0cygmbmV3X3NlbGVjdGlvbnMpOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdfc2VsZWN0aW9ucy5zaXplKCk7ICsraSkgew0KKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG9sZF9zZWxlY3Rpb25zXy5zaXplKCk7ICsraikgew0KKyAgICAgIGlmICghb2xkX3NlbGVjdGlvbnNfW2pdLklzRW1wdHkoKSAmJg0KKyAgICAgICAgICBuZXdfc2VsZWN0aW9uc1tpXSA9PSBvbGRfc2VsZWN0aW9uc19bal0pIHsNCisgICAgICAgIC8vIFJlY3RhbmdsZSB3YXMgc2VsZWN0ZWQgYmVmb3JlIGFuZCBhZnRlciwgc28gbm8gbmVlZCB0byBpbnZhbGlkYXRlIGl0Lg0KKyAgICAgICAgLy8gTWFyayB0aGUgcmVjdGFuZ2xlcyBieSBzZXR0aW5nIHRoZW0gdG8gZW1wdHkuDQorICAgICAgICBuZXdfc2VsZWN0aW9uc1tpXSA9IG9sZF9zZWxlY3Rpb25zX1tqXSA9IHBwOjpSZWN0KCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2xkX3NlbGVjdGlvbnNfLnNpemUoKTsgKytpKSB7DQorICAgIGlmICghb2xkX3NlbGVjdGlvbnNfW2ldLklzRW1wdHkoKSkNCisgICAgICBlbmdpbmVfLT5jbGllbnRfLT5JbnZhbGlkYXRlKG9sZF9zZWxlY3Rpb25zX1tpXSk7DQorICB9DQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld19zZWxlY3Rpb25zLnNpemUoKTsgKytpKSB7DQorICAgIGlmICghbmV3X3NlbGVjdGlvbnNbaV0uSXNFbXB0eSgpKQ0KKyAgICAgIGVuZ2luZV8tPmNsaWVudF8tPkludmFsaWRhdGUobmV3X3NlbGVjdGlvbnNbaV0pOw0KKyAgfQ0KKyAgZW5naW5lXy0+T25TZWxlY3Rpb25DaGFuZ2VkKCk7DQorfQ0KKw0KK3ZvaWQNCitQREZpdW1FbmdpbmU6OlNlbGVjdGlvbkNoYW5nZUludmFsaWRhdG9yOjpHZXRWaXNpYmxlU2VsZWN0aW9uc1NjcmVlblJlY3RzKA0KKyAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIHJlY3RzKSB7DQorICBwcDo6UmVjdCB2aXNpYmxlX3JlY3QgPSBlbmdpbmVfLT5HZXRWaXNpYmxlUmVjdCgpOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmdpbmVfLT5zZWxlY3Rpb25fLnNpemUoKTsgKytpKSB7DQorICAgIGludCBwYWdlX2luZGV4ID0gZW5naW5lXy0+c2VsZWN0aW9uX1tpXS5wYWdlX2luZGV4KCk7DQorICAgIGlmICghZW5naW5lXy0+SXNQYWdlVmlzaWJsZShwYWdlX2luZGV4KSkNCisgICAgICBjb250aW51ZTsgIC8vIFRoaXMgc2VsZWN0aW9uIGlzIG9uIGEgcGFnZSB0aGF0J3Mgbm90IGN1cnJlbnRseSB2aXNpYmxlLg0KKw0KKyAgICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gc2VsZWN0aW9uX3JlY3RzID0NCisgICAgICAgIGVuZ2luZV8tPnNlbGVjdGlvbl9baV0uR2V0U2NyZWVuUmVjdHMoDQorICAgICAgICAgICAgdmlzaWJsZV9yZWN0LnBvaW50KCksDQorICAgICAgICAgICAgZW5naW5lXy0+Y3VycmVudF96b29tXywNCisgICAgICAgICAgICBlbmdpbmVfLT5jdXJyZW50X3JvdGF0aW9uXyk7DQorICAgIHJlY3RzLT5pbnNlcnQocmVjdHMtPmVuZCgpLCBzZWxlY3Rpb25fcmVjdHMuYmVnaW4oKSwgc2VsZWN0aW9uX3JlY3RzLmVuZCgpKTsNCisgIH0NCit9DQorDQorUERGaXVtRW5naW5lOjpNb3VzZURvd25TdGF0ZTo6TW91c2VEb3duU3RhdGUoDQorICAgIGNvbnN0IFBERml1bVBhZ2U6OkFyZWEmIGFyZWEsDQorICAgIGNvbnN0IFBERml1bVBhZ2U6OkxpbmtUYXJnZXQmIHRhcmdldCkNCisgICAgOiBhcmVhXyhhcmVhKSwgdGFyZ2V0Xyh0YXJnZXQpIHsNCit9DQorDQorUERGaXVtRW5naW5lOjpNb3VzZURvd25TdGF0ZTo6fk1vdXNlRG93blN0YXRlKCkgew0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6TW91c2VEb3duU3RhdGU6OlNldChjb25zdCBQREZpdW1QYWdlOjpBcmVhJiBhcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERml1bVBhZ2U6OkxpbmtUYXJnZXQmIHRhcmdldCkgew0KKyAgYXJlYV8gPSBhcmVhOw0KKyAgdGFyZ2V0XyA9IHRhcmdldDsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6Ok1vdXNlRG93blN0YXRlOjpSZXNldCgpIHsNCisgIGFyZWFfID0gUERGaXVtUGFnZTo6Tk9OU0VMRUNUQUJMRV9BUkVBOw0KKyAgdGFyZ2V0XyA9IFBERml1bVBhZ2U6OkxpbmtUYXJnZXQoKTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmU6Ok1vdXNlRG93blN0YXRlOjpNYXRjaGVzKA0KKyAgICBjb25zdCBQREZpdW1QYWdlOjpBcmVhJiBhcmVhLA0KKyAgICBjb25zdCBQREZpdW1QYWdlOjpMaW5rVGFyZ2V0JiB0YXJnZXQpIGNvbnN0IHsNCisgIGlmIChhcmVhXyA9PSBhcmVhKSB7DQorICAgIGlmIChhcmVhID09IFBERml1bVBhZ2U6OldFQkxJTktfQVJFQSkNCisgICAgICByZXR1cm4gdGFyZ2V0Xy51cmwgPT0gdGFyZ2V0LnVybDsNCisgICAgaWYgKGFyZWEgPT0gUERGaXVtUGFnZTo6RE9DTElOS19BUkVBKQ0KKyAgICAgIHJldHVybiB0YXJnZXRfLnBhZ2UgPT0gdGFyZ2V0LnBhZ2U7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6RGV2aWNlVG9QYWdlKGludCBwYWdlX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGV2aWNlX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXZpY2VfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3kpIHsNCisgICpwYWdlX3ggPSAqcGFnZV95ID0gMDsNCisgIGludCB0ZW1wX3ggPSBzdGF0aWNfY2FzdDxpbnQ+KChkZXZpY2VfeCArIHBvc2l0aW9uXy54KCkpLyBjdXJyZW50X3pvb21fIC0NCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPnJlY3QoKS54KCkpOw0KKyAgaW50IHRlbXBfeSA9IHN0YXRpY19jYXN0PGludD4oKGRldmljZV95ICsgcG9zaXRpb25fLnkoKSkvIGN1cnJlbnRfem9vbV8gLQ0KKyAgICAgIHBhZ2VzX1twYWdlX2luZGV4XS0+cmVjdCgpLnkoKSk7DQorICBGUERGX0RldmljZVRvUGFnZSgNCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPkdldFBhZ2UoKSwgMCwgMCwNCisgICAgICBwYWdlc19bcGFnZV9pbmRleF0tPnJlY3QoKS53aWR0aCgpLCAgcGFnZXNfW3BhZ2VfaW5kZXhdLT5yZWN0KCkuaGVpZ2h0KCksDQorICAgICAgY3VycmVudF9yb3RhdGlvbl8sIHRlbXBfeCwgdGVtcF95LCBwYWdlX3gsIHBhZ2VfeSk7DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkdldFZpc2libGVQYWdlSW5kZXgoRlBERl9QQUdFIHBhZ2UpIHsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmlzaWJsZV9wYWdlc18uc2l6ZSgpOyArK2kpIHsNCisgICAgaWYgKHBhZ2VzX1t2aXNpYmxlX3BhZ2VzX1tpXV0tPkdldFBhZ2UoKSA9PSBwYWdlKQ0KKyAgICAgIHJldHVybiB2aXNpYmxlX3BhZ2VzX1tpXTsNCisgIH0NCisgIHJldHVybiAtMTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlNldEN1cnJlbnRQYWdlKGludCBpbmRleCkgew0KKyAgaWYgKGluZGV4ID09IG1vc3RfdmlzaWJsZV9wYWdlXyB8fCAhZm9ybV8pDQorICAgIHJldHVybjsNCisgIGlmIChtb3N0X3Zpc2libGVfcGFnZV8gIT0gLTEgJiYgY2FsbGVkX2RvX2RvY3VtZW50X2FjdGlvbl8pIHsNCisgICAgRlBERl9QQUdFIG9sZF9wYWdlID0gcGFnZXNfW21vc3RfdmlzaWJsZV9wYWdlX10tPkdldFBhZ2UoKTsNCisgICAgRk9STV9Eb1BhZ2VBQWN0aW9uKG9sZF9wYWdlLCBmb3JtXywgRlBERlBBR0VfQUFDVElPTl9DTE9TRSk7DQorICB9DQorICBtb3N0X3Zpc2libGVfcGFnZV8gPSBpbmRleDsNCisjaWYgZGVmaW5lZChPU19MSU5VWCkNCisgICAgZ19sYXN0X2luc3RhbmNlX2lkID0gY2xpZW50Xy0+R2V0UGx1Z2luSW5zdGFuY2UoKS0+cHBfaW5zdGFuY2UoKTsNCisjZW5kaWYNCisgIGlmIChtb3N0X3Zpc2libGVfcGFnZV8gIT0gLTEgJiYgY2FsbGVkX2RvX2RvY3VtZW50X2FjdGlvbl8pIHsNCisgICAgRlBERl9QQUdFIG5ld19wYWdlID0gcGFnZXNfW21vc3RfdmlzaWJsZV9wYWdlX10tPkdldFBhZ2UoKTsNCisgICAgRk9STV9Eb1BhZ2VBQWN0aW9uKG5ld19wYWdlLCBmb3JtXywgRlBERlBBR0VfQUFDVElPTl9PUEVOKTsNCisgIH0NCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OlRyYW5zZm9ybVBERlBhZ2VGb3JQcmludGluZygNCisgICAgRlBERl9QQUdFIHBhZ2UsDQorICAgIGNvbnN0IFBQX1ByaW50U2V0dGluZ3NfRGV2JiBwcmludF9zZXR0aW5ncykgew0KKyAgLy8gR2V0IHRoZSBzb3VyY2UgcGFnZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBvaW50cy4NCisgIGNvbnN0IGRvdWJsZSBzcmNfcGFnZV93aWR0aCA9IEZQREZfR2V0UGFnZVdpZHRoKHBhZ2UpOw0KKyAgY29uc3QgZG91YmxlIHNyY19wYWdlX2hlaWdodCA9IEZQREZfR2V0UGFnZUhlaWdodChwYWdlKTsNCisNCisgIGNvbnN0IGludCBzcmNfcGFnZV9yb3RhdGlvbiA9IEZQREZQYWdlX0dldFJvdGF0aW9uKHBhZ2UpOw0KKyAgY29uc3QgYm9vbCBmaXRfdG9fcGFnZSA9IHByaW50X3NldHRpbmdzLnByaW50X3NjYWxpbmdfb3B0aW9uID09DQorICAgICAgUFBfUFJJTlRTQ0FMSU5HT1BUSU9OX0ZJVF9UT19QUklOVEFCTEVfQVJFQTsNCisNCisgIHBwOjpTaXplIHBhZ2Vfc2l6ZShwcmludF9zZXR0aW5ncy5wYXBlcl9zaXplKTsNCisgIHBwOjpSZWN0IGNvbnRlbnRfcmVjdChwcmludF9zZXR0aW5ncy5wcmludGFibGVfYXJlYSk7DQorICBjb25zdCBib29sIHJvdGF0ZWQgPSAoc3JjX3BhZ2Vfcm90YXRpb24gJSAyID09IDEpOw0KKyAgU2V0UGFnZVNpemVBbmRDb250ZW50UmVjdChyb3RhdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGFnZV93aWR0aCA+IHNyY19wYWdlX2hlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhZ2Vfc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRfcmVjdCk7DQorDQorICAvLyBDb21wdXRlIHRoZSBzY3JlZW4gcGFnZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBvaW50cy4NCisgIGNvbnN0IGludCBhY3R1YWxfcGFnZV93aWR0aCA9DQorICAgICAgcm90YXRlZCA/IHBhZ2Vfc2l6ZS5oZWlnaHQoKSA6IHBhZ2Vfc2l6ZS53aWR0aCgpOw0KKyAgY29uc3QgaW50IGFjdHVhbF9wYWdlX2hlaWdodCA9DQorICAgICAgcm90YXRlZCA/IHBhZ2Vfc2l6ZS53aWR0aCgpIDogcGFnZV9zaXplLmhlaWdodCgpOw0KKw0KKyAgY29uc3QgZG91YmxlIHNjYWxlX2ZhY3RvciA9IENhbGN1bGF0ZVNjYWxlRmFjdG9yKGZpdF90b19wYWdlLCBjb250ZW50X3JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BhZ2Vfd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BhZ2VfaGVpZ2h0LCByb3RhdGVkKTsNCisNCisgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbnMgZm9yIHRoZSBjbGlwIGJveC4NCisgIENsaXBCb3ggc291cmNlX2NsaXBfYm94Ow0KKyAgQ2FsY3VsYXRlQ2xpcEJveEJvdW5kYXJ5KHBhZ2UsIHNjYWxlX2ZhY3Rvciwgcm90YXRlZCwgJnNvdXJjZV9jbGlwX2JveCk7DQorDQorICAvLyBDYWxjdWxhdGUgdGhlIHRyYW5zbGF0aW9uIG9mZnNldCB2YWx1ZXMuDQorICBkb3VibGUgb2Zmc2V0X3ggPSAwOw0KKyAgZG91YmxlIG9mZnNldF95ID0gMDsNCisgIGlmIChmaXRfdG9fcGFnZSkgew0KKyAgICBDYWxjdWxhdGVTY2FsZWRDbGlwQm94T2Zmc2V0KGNvbnRlbnRfcmVjdCwgc291cmNlX2NsaXBfYm94LCAmb2Zmc2V0X3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF95KTsNCisgIH0gZWxzZSB7DQorICAgIENhbGN1bGF0ZU5vblNjYWxlZENsaXBCb3hPZmZzZXQoY29udGVudF9yZWN0LCBzcmNfcGFnZV9yb3RhdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfcGFnZV93aWR0aCwgYWN0dWFsX3BhZ2VfaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9jbGlwX2JveCwgJm9mZnNldF94LCAmb2Zmc2V0X3kpOw0KKyAgfQ0KKw0KKyAgLy8gUmVzZXQgdGhlIG1lZGlhIGJveCBhbmQgY3JvcCBib3guIFdoZW4gdGhlIHBhZ2UgaGFzIGNyb3AgYm94IGFuZCBtZWRpYSBib3gsDQorICAvLyB0aGUgcGx1Z2luIHdpbGwgZGlzcGxheSB0aGUgY3JvcCBib3ggY29udGVudHMgYW5kIG5vdCB0aGUgZW50aXJlIG1lZGlhIGJveC4NCisgIC8vIElmIHRoZSBwYWdlcyBoYXZlIGRpZmZlcmVudCBjcm9wIGJveCB2YWx1ZXMsIHRoZSBwbHVnaW4gd2lsbCBkaXNwbGF5IGENCisgIC8vIGRvY3VtZW50IG9mIG11bHRpcGxlIHBhZ2Ugc2l6ZXMuIFRvIGdpdmUgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZSwgd2UNCisgIC8vIGRlY2lkZWQgdG8gaGF2ZSBzYW1lIGNyb3AgYm94IGFuZCBtZWRpYSBib3ggdmFsdWVzLiBIZW5jZSwgdGhlIHVzZXIgd2lsbA0KKyAgLy8gc2VlIGEgbGlzdCBvZiB1bmlmb3JtIHBhZ2VzLg0KKyAgRlBERlBhZ2VfU2V0TWVkaWFCb3gocGFnZSwgMCwgMCwgcGFnZV9zaXplLndpZHRoKCksIHBhZ2Vfc2l6ZS5oZWlnaHQoKSk7DQorICBGUERGUGFnZV9TZXRDcm9wQm94KHBhZ2UsIDAsIDAsIHBhZ2Vfc2l6ZS53aWR0aCgpLCBwYWdlX3NpemUuaGVpZ2h0KCkpOw0KKw0KKyAgLy8gVHJhbnNmb3JtYXRpb24gaXMgbm90IHJlcXVpcmVkLCByZXR1cm4uIERvIHRoaXMgY2hlY2sgb25seSBhZnRlciB1cGRhdGluZw0KKyAgLy8gdGhlIG1lZGlhIGJveCBhbmQgY3JvcCBib3guIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8NCisgIC8vIHRoZSBjb21tZW50IGJsb2NrIHJpZ2h0IGJlZm9yZSBGUERGX1NldE1lZGlhQm94IGFuZCBGUERGX0dldE1lZGlhQm94IGNhbGxzLg0KKyAgaWYgKHNjYWxlX2ZhY3RvciA9PSAxLjAgJiYgb2Zmc2V0X3ggPT0gMCAmJiBvZmZzZXRfeSA9PSAwKQ0KKyAgICByZXR1cm47DQorDQorDQorICAvLyBBbGwgdGhlIHBvc2l0aW9ucyBoYXZlIGJlZW4gY2FsY3VsYXRlZCwgbm93IG1hbmlwdWxhdGUgdGhlIFBERi4NCisgIEZTX01BVFJJWCBtYXRyaXggPSB7c3RhdGljX2Nhc3Q8ZmxvYXQ+KHNjYWxlX2ZhY3RvciksDQorICAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzY2FsZV9mYWN0b3IpLA0KKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4ob2Zmc2V0X3gpLA0KKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4ob2Zmc2V0X3kpfTsNCisgIEZTX1JFQ1RGIGNsaXByZWN0ID0ge3N0YXRpY19jYXN0PGZsb2F0Pihzb3VyY2VfY2xpcF9ib3gubGVmdCtvZmZzZXRfeCksDQorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oc291cmNlX2NsaXBfYm94LnRvcCtvZmZzZXRfeSksDQorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oc291cmNlX2NsaXBfYm94LnJpZ2h0K29mZnNldF94KSwNCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pihzb3VyY2VfY2xpcF9ib3guYm90dG9tK29mZnNldF95KX07DQorICBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChwYWdlLCAmbWF0cml4LCAmY2xpcHJlY3QpOw0KKyAgRlBERlBhZ2VfVHJhbnNmb3JtQW5ub3RzKHBhZ2UsIHNjYWxlX2ZhY3RvciwgMCwgMCwgc2NhbGVfZmFjdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF94LCBvZmZzZXRfeSk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpEcmF3UGFnZVNoYWRvdyhjb25zdCBwcDo6UmVjdCYgcGFnZV9yYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIHNoYWRvd19yYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIGNsaXBfcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEpIHsNCisgIHBwOjpSZWN0IHBhZ2VfcmVjdChwYWdlX3JjKTsNCisgIHBhZ2VfcmVjdC5PZmZzZXQocGFnZV9vZmZzZXRfKTsNCisNCisgIHBwOjpSZWN0IHNoYWRvd19yZWN0KHNoYWRvd19yYyk7DQorICBzaGFkb3dfcmVjdC5PZmZzZXQocGFnZV9vZmZzZXRfKTsNCisNCisgIHBwOjpSZWN0IGNsaXBfcmVjdChjbGlwX3JjKTsNCisgIGNsaXBfcmVjdC5PZmZzZXQocGFnZV9vZmZzZXRfKTsNCisNCisgIC8vIFBhZ2UgZHJvcCBzaGFkb3cgcGFyYW1ldGVycy4NCisgIGNvbnN0IGRvdWJsZSBmYWN0b3IgPSAwLjU7DQorICB1aW50MzIgZGVwdGggPSBzdGQ6Om1heCgNCisgICAgICBzdGQ6Om1heChwYWdlX3JlY3QueCgpIC0gc2hhZG93X3JlY3QueCgpLA0KKyAgICAgICAgICAgICAgIHBhZ2VfcmVjdC55KCkgLSBzaGFkb3dfcmVjdC55KCkpLA0KKyAgICAgIHN0ZDo6bWF4KHNoYWRvd19yZWN0LnJpZ2h0KCkgLSBwYWdlX3JlY3QucmlnaHQoKSwNCisgICAgICAgICAgICAgICBzaGFkb3dfcmVjdC5ib3R0b20oKSAtIHBhZ2VfcmVjdC5ib3R0b20oKSkpOw0KKyAgZGVwdGggPSBzdGF0aWNfY2FzdDx1aW50MzI+KGRlcHRoICogMS41KSArIDE7DQorDQorICAvLyBXZSBuZWVkIHRvIGNoZWNrIGRlcHRoIG9ubHkgdG8gdmVyaWZ5IG91ciBjb3B5IG9mIHNoYWRvdyBtYXRyaXggaXMgY29ycmVjdC4NCisgIGlmICghcGFnZV9zaGFkb3dfLmdldCgpIHx8IHBhZ2Vfc2hhZG93Xy0+ZGVwdGgoKSAhPSBkZXB0aCkNCisgICAgcGFnZV9zaGFkb3dfLnJlc2V0KG5ldyBTaGFkb3dNYXRyaXgoZGVwdGgsIGZhY3Rvciwga0JhY2tncm91bmRDb2xvcikpOw0KKw0KKyAgRENIRUNLKCFpbWFnZV9kYXRhLT5pc19udWxsKCkpOw0KKyAgRHJhd1NoYWRvdyhpbWFnZV9kYXRhLCBzaGFkb3dfcmVjdCwgcGFnZV9yZWN0LCBjbGlwX3JlY3QsICpwYWdlX3NoYWRvd18pOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6R2V0UmVnaW9uKGNvbnN0IHBwOjpQb2ludCYgbG9jYXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHJlZ2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyaWRlKSBjb25zdCB7DQorICBpZiAoaW1hZ2VfZGF0YS0+aXNfbnVsbCgpKSB7DQorICAgIERDSEVDSyhwbHVnaW5fc2l6ZV8uSXNFbXB0eSgpKTsNCisgICAgKnN0cmlkZSA9IDA7DQorICAgICpyZWdpb24gPSBOVUxMOw0KKyAgICByZXR1cm47DQorICB9DQorICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oaW1hZ2VfZGF0YS0+ZGF0YSgpKTsNCisgICpzdHJpZGUgPSBpbWFnZV9kYXRhLT5zdHJpZGUoKTsNCisNCisgIHBwOjpQb2ludCBvZmZzZXRfbG9jYXRpb24gPSBsb2NhdGlvbiArIHBhZ2Vfb2Zmc2V0XzsNCisgIC8vIFRPRE86IHVwZGF0ZSB0aGlzIHdoZW4gd2Ugc3VwcG9ydCBCSURJIGFuZCBzY3JvbGxiYXJzIGNhbiBiZSBvbiB0aGUgbGVmdC4NCisgIGlmICghYnVmZmVyIHx8DQorICAgICAgIXBwOjpSZWN0KHBhZ2Vfb2Zmc2V0XywgcGx1Z2luX3NpemVfKS5Db250YWlucyhvZmZzZXRfbG9jYXRpb24pKSB7DQorICAgICpyZWdpb24gPSBOVUxMOw0KKyAgICByZXR1cm47DQorICB9DQorDQorICBidWZmZXIgKz0gbG9jYXRpb24ueSgpICogKCpzdHJpZGUpOw0KKyAgYnVmZmVyICs9IChsb2NhdGlvbi54KCkgKyBwYWdlX29mZnNldF8ueCgpKSAqIDQ7DQorICAqcmVnaW9uID0gYnVmZmVyOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6T25TZWxlY3Rpb25DaGFuZ2VkKCkgew0KKyAgaWYgKEhhc1Blcm1pc3Npb24oUERGRW5naW5lOjpQRVJNSVNTSU9OX0NPUFkpKQ0KKyAgICBwcDo6UERGOjpTZXRTZWxlY3RlZFRleHQoR2V0UGx1Z2luSW5zdGFuY2UoKSwgR2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX0ludmFsaWRhdGUoRlBERl9GT1JNRklMTElORk8qIHBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKSB7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGludCBwYWdlX2luZGV4ID0gZW5naW5lLT5HZXRWaXNpYmxlUGFnZUluZGV4KHBhZ2UpOw0KKyAgaWYgKHBhZ2VfaW5kZXggPT0gLTEpIHsNCisgICAgLy8gVGhpcyBjYW4gc29tZXRpbWUgaGFwcGVuIHdoZW4gdGhlIHBhZ2UgaXMgY2xvc2VkIGJlY2F1c2UgaXQgd2VudCBvZmYNCisgICAgLy8gc2NyZWVuLCBhbmQgUERGaXVtIGludmFsaWRhdGVzIHRoZSBjb250cm9sIGFzIGl0J3MgYmVpbmcgZGVsZXRlZC4NCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgcHA6OlJlY3QgcmVjdCA9IGVuZ2luZS0+cGFnZXNfW3BhZ2VfaW5kZXhdLT5QYWdlVG9TY3JlZW4oDQorICAgICAgZW5naW5lLT5HZXRWaXNpYmxlUmVjdCgpLnBvaW50KCksIGVuZ2luZS0+Y3VycmVudF96b29tXywgbGVmdCwgdG9wLCByaWdodCwNCisgICAgICBib3R0b20sIGVuZ2luZS0+Y3VycmVudF9yb3RhdGlvbl8pOw0KKyAgZW5naW5lLT5jbGllbnRfLT5JbnZhbGlkYXRlKHJlY3QpOw0KK30NCisNCit2b2lkIFBERml1bUVuZ2luZTo6Rm9ybV9PdXRwdXRTZWxlY3RlZFJlY3QoRlBERl9GT1JNRklMTElORk8qIHBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSkgew0KKyAgUERGaXVtRW5naW5lKiBlbmdpbmUgPSBzdGF0aWNfY2FzdDxQREZpdW1FbmdpbmUqPihwYXJhbSk7DQorICBpbnQgcGFnZV9pbmRleCA9IGVuZ2luZS0+R2V0VmlzaWJsZVBhZ2VJbmRleChwYWdlKTsNCisgIGlmIChwYWdlX2luZGV4ID09IC0xKSB7DQorICAgIE5PVFJFQUNIRUQoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcHA6OlJlY3QgcmVjdCA9IGVuZ2luZS0+cGFnZXNfW3BhZ2VfaW5kZXhdLT5QYWdlVG9TY3JlZW4oDQorICAgICAgZW5naW5lLT5HZXRWaXNpYmxlUmVjdCgpLnBvaW50KCksIGVuZ2luZS0+Y3VycmVudF96b29tXywgbGVmdCwgdG9wLCByaWdodCwNCisgICAgICBib3R0b20sIGVuZ2luZS0+Y3VycmVudF9yb3RhdGlvbl8pOw0KKyAgZW5naW5lLT5mb3JtX2hpZ2hsaWdodHNfLnB1c2hfYmFjayhyZWN0KTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fU2V0Q3Vyc29yKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwgaW50IGN1cnNvcl90eXBlKSB7DQorICAvLyBXZSBkb24ndCBuZWVkIHRoaXMgc2luY2UgaXQncyBub3QgZW5vdWdoIHRvIGNoYW5nZSB0aGUgY3Vyc29yIGluIGFsbA0KKyAgLy8gc2NlbmFyaW9zLiAgSW5zdGVhZCwgd2UgY2hlY2sgd2hpY2ggZm9ybSBmaWVsZCB3ZSdyZSB1bmRlciBpbiBPbk1vdXNlTW92ZS4NCit9DQorDQoraW50IFBERml1bUVuZ2luZTo6Rm9ybV9TZXRUaW1lcihGUERGX0ZPUk1GSUxMSU5GTyogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxhcHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayB0aW1lcl9mdW5jKSB7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGVuZ2luZS0+dGltZXJzX1srK2VuZ2luZS0+bmV4dF90aW1lcl9pZF9dID0NCisgICAgICBzdGQ6OnBhaXI8aW50LCBUaW1lckNhbGxiYWNrPihlbGFwc2UsIHRpbWVyX2Z1bmMpOw0KKyAgZW5naW5lLT5jbGllbnRfLT5TY2hlZHVsZUNhbGxiYWNrKGVuZ2luZS0+bmV4dF90aW1lcl9pZF8sIGVsYXBzZSk7DQorICByZXR1cm4gZW5naW5lLT5uZXh0X3RpbWVyX2lkXzsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fS2lsbFRpbWVyKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwgaW50IHRpbWVyX2lkKSB7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGVuZ2luZS0+dGltZXJzXy5lcmFzZSh0aW1lcl9pZCk7DQorfQ0KKw0KK0ZQREZfU1lTVEVNVElNRSBQREZpdW1FbmdpbmU6OkZvcm1fR2V0TG9jYWxUaW1lKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSkgew0KKyAgYmFzZTo6VGltZSB0aW1lID0gYmFzZTo6VGltZTo6Tm93KCk7DQorICBiYXNlOjpUaW1lOjpFeHBsb2RlZCBleHBsb2RlZDsNCisgIHRpbWUuTG9jYWxFeHBsb2RlKCZleHBsb2RlZCk7DQorDQorICBGUERGX1NZU1RFTVRJTUUgcnY7DQorICBydi53WWVhciA9IGV4cGxvZGVkLnllYXI7DQorICBydi53TW9udGggPSBleHBsb2RlZC5tb250aDsNCisgIHJ2LndEYXlPZldlZWsgPSBleHBsb2RlZC5kYXlfb2Zfd2VlazsNCisgIHJ2LndEYXkgPSBleHBsb2RlZC5kYXlfb2ZfbW9udGg7DQorICBydi53SG91ciA9IGV4cGxvZGVkLmhvdXI7DQorICBydi53TWludXRlID0gZXhwbG9kZWQubWludXRlOw0KKyAgcnYud1NlY29uZCA9IGV4cGxvZGVkLnNlY29uZDsNCisgIHJ2LndNaWxsaXNlY29uZHMgPSBleHBsb2RlZC5taWxsaXNlY29uZDsNCisgIHJldHVybiBydjsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fT25DaGFuZ2UoRlBERl9GT1JNRklMTElORk8qIHBhcmFtKSB7DQorICAvLyBEb24ndCBjYXJlIGFib3V0Lg0KK30NCisNCitGUERGX1BBR0UgUERGaXVtRW5naW5lOjpGb3JtX0dldFBhZ2UoRlBERl9GT1JNRklMTElORk8qIHBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCkgew0KKyAgUERGaXVtRW5naW5lKiBlbmdpbmUgPSBzdGF0aWNfY2FzdDxQREZpdW1FbmdpbmUqPihwYXJhbSk7DQorICBpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBzdGF0aWNfY2FzdDxpbnQ+KGVuZ2luZS0+cGFnZXNfLnNpemUoKSkpDQorICAgIHJldHVybiBOVUxMOw0KKyAgcmV0dXJuIGVuZ2luZS0+cGFnZXNfW3BhZ2VfaW5kZXhdLT5HZXRQYWdlKCk7DQorfQ0KKw0KK0ZQREZfUEFHRSBQREZpdW1FbmdpbmU6OkZvcm1fR2V0Q3VycmVudFBhZ2UoRlBERl9GT1JNRklMTElORk8qIHBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgew0KKyAgLy8gVE9ETyhqYW0pOiBmaW5kIG91dCB3aGF0IHRoaXMgaXMgdXNlZCBmb3IuDQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGludCBpbmRleCA9IGVuZ2luZS0+bGFzdF9wYWdlX21vdXNlX2Rvd25fOw0KKyAgaWYgKGluZGV4ID09IC0xKSB7DQorICAgIGluZGV4ID0gZW5naW5lLT5HZXRNb3N0VmlzaWJsZVBhZ2UoKTsNCisgICAgaWYgKGluZGV4ID09IC0xKSB7DQorICAgICAgTk9UUkVBQ0hFRCgpOw0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorDQorICByZXR1cm4gZW5naW5lLT5wYWdlc19baW5kZXhdLT5HZXRQYWdlKCk7DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkZvcm1fR2V0Um90YXRpb24oRlBERl9GT1JNRklMTElORk8qIHBhcmFtLCBGUERGX1BBR0UgcGFnZSkgew0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX0V4ZWN1dGVOYW1lZEFjdGlvbihGUERGX0ZPUk1GSUxMSU5GTyogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lZF9hY3Rpb24pIHsNCisgIFBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocGFyYW0pOw0KKyAgc3RkOjpzdHJpbmcgYWN0aW9uKG5hbWVkX2FjdGlvbik7DQorICBpZiAoYWN0aW9uID09ICJQcmludCIpIHsNCisgICAgZW5naW5lLT5jbGllbnRfLT5QcmludCgpOw0KKyAgICByZXR1cm47DQorICB9DQorDQorICBpbnQgaW5kZXggPSBlbmdpbmUtPmxhc3RfcGFnZV9tb3VzZV9kb3duXzsNCisgIC8qIERvbid0IHRyeSB0byBjYWxjdWxhdGUgdGhlIG1vc3QgdmlzaWJsZSBwYWdlIGlmIHdlIGRvbid0IGhhdmUgYSBsZWZ0IGNsaWNrDQorICAgICBiZWZvcmUgdGhpcyBldmVudCAodGhpcyBjb2RlIG9yaWdpbmFsbHkgY29waWVkIEZvcm1fR2V0Q3VycmVudFBhZ2Ugd2hpY2ggb2YNCisgICAgIGNvdXJzZSBuZWVkcyB0byBkbyB0aGF0IGFuZCB3aGljaCBkb2Vzbid0IGhhdmUgcmVjdXJzaW9uKS4gVGhpcyBjYW4gZW5kIHVwDQorICAgICBjYXVzaW5nIGluZmluaXRlIHJlY3Vyc2lvbi4gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMjQwNDEzIGZvciBtb3JlDQorICAgICBpbmZvcm1hdGlvbi4gRWl0aGVyIHdheSwgaXQncyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgc3BlYydkIGxpc3Qgb2YgbmFtZWQNCisgICAgIGFjdGlvbnMuDQorICBpZiAoaW5kZXggPT0gLTEpDQorICAgIGluZGV4ID0gZW5naW5lLT5HZXRNb3N0VmlzaWJsZVBhZ2UoKTsNCisgICovDQorICBpZiAoaW5kZXggPT0gLTEpDQorICAgIHJldHVybjsNCisNCisgIC8vIFRoaXMgaXMgdGhlIG9ubHkgbGlzdCBvZiBuYW1lZCBhY3Rpb25zIHBlciB0aGUgc3BlYyAoc2VlIDEyLjYuNC4xMSkuIEFkb2JlDQorICAvLyBSZWFkZXIgc3VwcG9ydHMgbW9yZSwgbGlrZSBGaXRXaWR0aCwgYnV0IHNpbmNlIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIHNwZWMNCisgIC8vIGFuZCB3ZSBoYXZlbid0IGdvdCBidWdzIGFib3V0IHRoZW0sIG5vIG5lZWQgdG8gbm93Lg0KKyAgaWYgKGFjdGlvbiA9PSAiTmV4dFBhZ2UiKSB7DQorICAgIGVuZ2luZS0+Y2xpZW50Xy0+U2Nyb2xsVG9QYWdlKGluZGV4ICsgMSk7DQorICB9IGVsc2UgaWYgKGFjdGlvbiA9PSAiUHJldlBhZ2UiKSB7DQorICAgIGVuZ2luZS0+Y2xpZW50Xy0+U2Nyb2xsVG9QYWdlKGluZGV4IC0gMSk7DQorICB9IGVsc2UgaWYgKGFjdGlvbiA9PSAiRmlyc3RQYWdlIikgew0KKyAgICBlbmdpbmUtPmNsaWVudF8tPlNjcm9sbFRvUGFnZSgwKTsNCisgIH0gZWxzZSBpZiAoYWN0aW9uID09ICJMYXN0UGFnZSIpIHsNCisgICAgZW5naW5lLT5jbGllbnRfLT5TY3JvbGxUb1BhZ2UoZW5naW5lLT5wYWdlc18uc2l6ZSgpIC0gMSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX1NldFRleHRGaWVsZEZvY3VzKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCB2YWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgaXNfZm9jdXMpIHsNCisgIC8vIERvIG5vdGhpbmcgZm9yIG5vdy4NCisgIC8vIFRPRE8oZ2VuZSk6IHVzZSB0aGlzIHNpZ25hbCB0byB0cmlnZ2VyIE9TSy4NCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fRG9VUklBY3Rpb24oRlBERl9GT1JNRklMTElORk8qIHBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyB1cmkpIHsNCisgIFBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocGFyYW0pOw0KKyAgZW5naW5lLT5jbGllbnRfLT5OYXZpZ2F0ZVRvKHN0ZDo6c3RyaW5nKHVyaSksIGZhbHNlKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fRG9Hb1RvQWN0aW9uKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB6b29tX21vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbl9hcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfb2ZfYXJyYXkpIHsNCisgIFBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocGFyYW0pOw0KKyAgZW5naW5lLT5jbGllbnRfLT5TY3JvbGxUb1BhZ2UocGFnZV9pbmRleCk7DQorfQ0KKw0KK2ludCBQREZpdW1FbmdpbmU6OkZvcm1fQWxlcnQoSVBERl9KU1BMQVRGT1JNKiBwYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBtZXNzYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWNvbikgew0KKyAgLy8gU2VlIGZwZGZmb3JtZmlsbC5oIGZvciB0aGVzZSB2YWx1ZXMuDQorICBlbnVtIEFsZXJ0VHlwZSB7DQorICAgIEFMRVJUX1RZUEVfT0sgPSAwLA0KKyAgICBBTEVSVF9UWVBFX09LX0NBTkNFTCwNCisgICAgQUxFUlRfVFlQRV9ZRVNfT04sDQorICAgIEFMRVJUX1RZUEVfWUVTX05PX0NBTkNFTA0KKyAgfTsNCisNCisgIGVudW0gQWxlcnRSZXN1bHQgew0KKyAgICBBTEVSVF9SRVNVTFRfT0sgPSAxLA0KKyAgICBBTEVSVF9SRVNVTFRfQ0FOQ0VMLA0KKyAgICBBTEVSVF9SRVNVTFRfTk8sDQorICAgIEFMRVJUX1JFU1VMVF9ZRVMNCisgIH07DQorDQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2Vfc3RyID0NCisgICAgICBiYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KG1lc3NhZ2UpKTsNCisgIGlmICh0eXBlID09IEFMRVJUX1RZUEVfT0spIHsNCisgICAgZW5naW5lLT5jbGllbnRfLT5BbGVydChtZXNzYWdlX3N0cik7DQorICAgIHJldHVybiBBTEVSVF9SRVNVTFRfT0s7DQorICB9DQorDQorICBib29sIHJ2ID0gZW5naW5lLT5jbGllbnRfLT5Db25maXJtKG1lc3NhZ2Vfc3RyKTsNCisgIGlmICh0eXBlID09IEFMRVJUX1RZUEVfT0tfQ0FOQ0VMKQ0KKyAgICByZXR1cm4gcnYgPyBBTEVSVF9SRVNVTFRfT0sgOiBBTEVSVF9SRVNVTFRfQ0FOQ0VMOw0KKyAgcmV0dXJuIHJ2ID8gQUxFUlRfUkVTVUxUX1lFUyA6IEFMRVJUX1JFU1VMVF9OTzsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fQmVlcChJUERGX0pTUExBVEZPUk0qIHBhcmFtLCBpbnQgdHlwZSkgew0KKyAgLy8gQmVlcHMgYXJlIGFubm95aW5nLCBhbmQgbm90IHBvc3NpYmxlIHVzaW5nIGphdmFzY3JpcHQsIHNvIGlnbm9yZSBmb3Igbm93Lg0KK30NCisNCitpbnQgUERGaXVtRW5naW5lOjpGb3JtX1Jlc3BvbnNlKElQREZfSlNQTEFURk9STSogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcXVlc3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZGVmYXVsdF9yZXNwb25zZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBsYWJlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBwYXNzd29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlc3BvbnNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgew0KKyAgc3RkOjpzdHJpbmcgcXVlc3Rpb25fc3RyID0gYmFzZTo6VVRGMTZUb1VURjgoDQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPihxdWVzdGlvbikpOw0KKyAgc3RkOjpzdHJpbmcgZGVmYXVsdF9zdHIgPSBiYXNlOjpVVEYxNlRvVVRGOCgNCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KGRlZmF1bHRfcmVzcG9uc2UpKTsNCisNCisgIFBERml1bUVuZ2luZSogZW5naW5lID0gc3RhdGljX2Nhc3Q8UERGaXVtRW5naW5lKj4ocGFyYW0pOw0KKyAgc3RkOjpzdHJpbmcgcnYgPSBlbmdpbmUtPmNsaWVudF8tPlByb21wdChxdWVzdGlvbl9zdHIsIGRlZmF1bHRfc3RyKTsNCisgIGJhc2U6OnN0cmluZzE2IHJ2XzE2ID0gYmFzZTo6VVRGOFRvVVRGMTYocnYpOw0KKyAgaW50IHJ2X2J5dGVzID0gcnZfMTYuc2l6ZSgpICogc2l6ZW9mKGJhc2U6OmNoYXIxNik7DQorICBpZiAocmVzcG9uc2UpIHsNCisgICAgaW50IGJ5dGVzX3RvX2NvcHkgPSBydl9ieXRlcyA8IGxlbmd0aCA/IHJ2X2J5dGVzIDogbGVuZ3RoOw0KKyAgICBtZW1jcHkocmVzcG9uc2UsIHJ2XzE2LmNfc3RyKCksIGJ5dGVzX3RvX2NvcHkpOw0KKyAgfQ0KKyAgcmV0dXJuIHJ2X2J5dGVzOw0KK30NCisNCitpbnQgUERGaXVtRW5naW5lOjpGb3JtX0dldEZpbGVQYXRoKElQREZfSlNQTEFURk9STSogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmaWxlX3BhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIHN0ZDo6c3RyaW5nIHJ2ID0gZW5naW5lLT5jbGllbnRfLT5HZXRVUkwoKTsNCisgIGlmIChmaWxlX3BhdGggJiYgcnYuc2l6ZSgpIDw9IHN0YXRpY19jYXN0PHNpemVfdD4obGVuZ3RoKSkNCisgICAgbWVtY3B5KGZpbGVfcGF0aCwgcnYuY19zdHIoKSwgcnYuc2l6ZSgpKTsNCisgIHJldHVybiBydi5zaXplKCk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX01haWwoSVBERl9KU1BMQVRGT1JNKiBwYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG1haWxfZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgdWksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgc3ViamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBiY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgbWVzc2FnZSkgew0KKyAgRENIRUNLKGxlbmd0aCA9PSAwKTsgIC8vIERvbid0IGhhbmRsZSBhdHRhY2htZW50czsgbm8gd2F5IHdpdGggbWFpbHRvLg0KKyAgc3RkOjpzdHJpbmcgdG9fc3RyID0NCisgICAgICBiYXNlOjpVVEYxNlRvVVRGOChyZWludGVycHJldF9jYXN0PGNvbnN0IGJhc2U6OmNoYXIxNio+KHRvKSk7DQorICBzdGQ6OnN0cmluZyBjY19zdHIgPQ0KKyAgICAgIGJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4oY2MpKTsNCisgIHN0ZDo6c3RyaW5nIGJjY19zdHIgPQ0KKyAgICAgIGJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4oYmNjKSk7DQorICBzdGQ6OnN0cmluZyBzdWJqZWN0X3N0ciA9DQorICAgICAgYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPihzdWJqZWN0KSk7DQorICBzdGQ6OnN0cmluZyBtZXNzYWdlX3N0ciA9DQorICAgICAgYmFzZTo6VVRGMTZUb1VURjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBiYXNlOjpjaGFyMTYqPihtZXNzYWdlKSk7DQorDQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGVuZ2luZS0+Y2xpZW50Xy0+RW1haWwodG9fc3RyLCBjY19zdHIsIGJjY19zdHIsIHN1YmplY3Rfc3RyLCBtZXNzYWdlX3N0cik7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX1ByaW50KElQREZfSlNQTEFURk9STSogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIHVpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBzaWxlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIHNocmlua190b19maXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIHByaW50X2FzX2ltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCByZXZlcnNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBhbm5vdGF0aW9ucykgew0KKyAgLy8gTm8gd2F5IHRvIHBhc3MgdGhlIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBwcmludCBkaWFsb2cgdXNpbmcgSmF2YVNjcmlwdC4NCisgIC8vIEp1c3Qgb3BlbmluZyBpdCBpcyBmaW5lIGZvciBub3cuDQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGVuZ2luZS0+Y2xpZW50Xy0+UHJpbnQoKTsNCit9DQorDQordm9pZCBQREZpdW1FbmdpbmU6OkZvcm1fU3VibWl0Rm9ybShJUERGX0pTUExBVEZPUk0qIHBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZm9ybV9kYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB1cmwpIHsNCisgIHN0ZDo6c3RyaW5nIHVybF9zdHIgPQ0KKyAgICAgIGJhc2U6OlVURjE2VG9VVEY4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzZTo6Y2hhcjE2Kj4odXJsKSk7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGVuZ2luZS0+Y2xpZW50Xy0+U3VibWl0Rm9ybSh1cmxfc3RyLCBmb3JtX2RhdGEsIGxlbmd0aCk7DQorfQ0KKw0KK3ZvaWQgUERGaXVtRW5naW5lOjpGb3JtX0dvdG9QYWdlKElQREZfSlNQTEFURk9STSogcGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfbnVtYmVyKSB7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIGVuZ2luZS0+Y2xpZW50Xy0+U2Nyb2xsVG9QYWdlKHBhZ2VfbnVtYmVyKTsNCit9DQorDQoraW50IFBERml1bUVuZ2luZTo6Rm9ybV9Ccm93c2UoSVBERl9KU1BMQVRGT1JNKiBwYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmaWxlX3BhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgew0KKyAgUERGaXVtRW5naW5lKiBlbmdpbmUgPSBzdGF0aWNfY2FzdDxQREZpdW1FbmdpbmUqPihwYXJhbSk7DQorICBzdGQ6OnN0cmluZyBwYXRoID0gZW5naW5lLT5jbGllbnRfLT5TaG93RmlsZVNlbGVjdGlvbkRpYWxvZygpOw0KKyAgaWYgKHBhdGguc2l6ZSgpICsgMSA8PSBzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbmd0aCkpDQorICAgIG1lbWNweShmaWxlX3BhdGgsICZwYXRoWzBdLCBwYXRoLnNpemUoKSArIDEpOw0KKyAgcmV0dXJuIHBhdGguc2l6ZSgpICsgMTsNCit9DQorDQorRlBERl9CT09MIFBERml1bUVuZ2luZTo6UGF1c2VfTmVlZFRvUGF1c2VOb3coSUZTREtfUEFVU0UqIHBhcmFtKSB7DQorICBQREZpdW1FbmdpbmUqIGVuZ2luZSA9IHN0YXRpY19jYXN0PFBERml1bUVuZ2luZSo+KHBhcmFtKTsNCisgIHJldHVybiAoYmFzZTo6VGltZTo6Tm93KCkgLSBlbmdpbmUtPmxhc3RfcHJvZ3Jlc3NpdmVfc3RhcnRfdGltZV8pLg0KKyAgICAgIEluTWlsbGlzZWNvbmRzKCkgPiBlbmdpbmUtPnByb2dyZXNzaXZlX3BhaW50X3RpbWVvdXRfOw0KK30NCisNCitTY29wZWRVbnN1cHBvcnRlZEZlYXR1cmU6OlNjb3BlZFVuc3VwcG9ydGVkRmVhdHVyZShQREZpdW1FbmdpbmUqIGVuZ2luZSkNCisgICAgOiBlbmdpbmVfKGVuZ2luZSksIG9sZF9lbmdpbmVfKGdfZW5naW5lX2Zvcl91bnN1cHBvcnRlZCkgew0KKyAgZ19lbmdpbmVfZm9yX3Vuc3VwcG9ydGVkID0gZW5naW5lXzsNCit9DQorDQorU2NvcGVkVW5zdXBwb3J0ZWRGZWF0dXJlOjp+U2NvcGVkVW5zdXBwb3J0ZWRGZWF0dXJlKCkgew0KKyAgZ19lbmdpbmVfZm9yX3Vuc3VwcG9ydGVkID0gb2xkX2VuZ2luZV87DQorfQ0KKw0KK1BERkVuZ2luZUV4cG9ydHMqIFBERkVuZ2luZUV4cG9ydHM6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgUERGaXVtRW5naW5lRXhwb3J0czsNCit9DQorDQorbmFtZXNwYWNlIHsNCisNCitpbnQgQ2FsY3VsYXRlUG9zaXRpb24oRlBERl9QQUdFIHBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERml1bUVuZ2luZUV4cG9ydHM6OlJlbmRlcmluZ1NldHRpbmdzJiBzZXR0aW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgcHA6OlJlY3QqIGRlc3QpIHsNCisgIGludCBwYWdlX3dpZHRoID0gc3RhdGljX2Nhc3Q8aW50PigNCisgICAgICBGUERGX0dldFBhZ2VXaWR0aChwYWdlKSAqIHNldHRpbmdzLmRwaV94IC8ga1BvaW50c1BlckluY2gpOw0KKyAgaW50IHBhZ2VfaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PigNCisgICAgICBGUERGX0dldFBhZ2VIZWlnaHQocGFnZSkgKiBzZXR0aW5ncy5kcGlfeSAvIGtQb2ludHNQZXJJbmNoKTsNCisNCisgIC8vIFN0YXJ0IGJ5IGFzc3VtaW5nIHRoYXQgd2Ugd2lsbCBkcmF3IGV4YWN0bHkgdG8gdGhlIGJvdW5kcyByZWN0DQorICAvLyBzcGVjaWZpZWQuDQorICAqZGVzdCA9IHNldHRpbmdzLmJvdW5kczsNCisNCisgIGludCByb3RhdGUgPSAwOyAgLy8gbm9ybWFsIG9yaWVudGF0aW9uLg0KKw0KKyAgLy8gQXV0by1yb3RhdGUgbGFuZHNjYXBlIHBhZ2VzIHRvIHByaW50IGNvcnJlY3RseS4NCisgIGlmIChzZXR0aW5ncy5hdXRvcm90YXRlICYmDQorICAgICAgKGRlc3QtPndpZHRoKCkgPiBkZXN0LT5oZWlnaHQoKSkgIT0gKHBhZ2Vfd2lkdGggPiBwYWdlX2hlaWdodCkpIHsNCisgICAgcm90YXRlID0gMzsgIC8vIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UuDQorICAgIHN0ZDo6c3dhcChwYWdlX3dpZHRoLCBwYWdlX2hlaWdodCk7DQorICB9DQorDQorICAvLyBTZWUgaWYgd2UgbmVlZCB0byBzY2FsZSB0aGUgb3V0cHV0DQorICBib29sIHNjYWxlX3RvX2JvdW5kcyA9IGZhbHNlOw0KKyAgaWYgKHNldHRpbmdzLmZpdF90b19ib3VuZHMgJiYNCisgICAgICAoKHBhZ2Vfd2lkdGggPiBkZXN0LT53aWR0aCgpKSB8fCAocGFnZV9oZWlnaHQgPiBkZXN0LT5oZWlnaHQoKSkpKSB7DQorICAgIHNjYWxlX3RvX2JvdW5kcyA9IHRydWU7DQorICB9IGVsc2UgaWYgKHNldHRpbmdzLnN0cmV0Y2hfdG9fYm91bmRzICYmDQorICAgICAgICAgICAgICgocGFnZV93aWR0aCA8IGRlc3QtPndpZHRoKCkpIHx8IChwYWdlX2hlaWdodCA8IGRlc3QtPmhlaWdodCgpKSkpIHsNCisgICAgc2NhbGVfdG9fYm91bmRzID0gdHJ1ZTsNCisgIH0NCisNCisgIGlmIChzY2FsZV90b19ib3VuZHMpIHsNCisgICAgLy8gSWYgd2UgbmVlZCB0byBtYWludGFpbiBhc3BlY3QgcmF0aW8sIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIHdpZHRoIGFuZA0KKyAgICAvLyBoZWlnaHQuDQorICAgIGlmIChzZXR0aW5ncy5rZWVwX2FzcGVjdF9yYXRpbykgew0KKyAgICAgIGRvdWJsZSBzY2FsZV9mYWN0b3JfeCA9IHBhZ2Vfd2lkdGg7DQorICAgICAgc2NhbGVfZmFjdG9yX3ggLz0gZGVzdC0+d2lkdGgoKTsNCisgICAgICBkb3VibGUgc2NhbGVfZmFjdG9yX3kgPSBwYWdlX2hlaWdodDsNCisgICAgICBzY2FsZV9mYWN0b3JfeSAvPSBkZXN0LT5oZWlnaHQoKTsNCisgICAgICBpZiAoc2NhbGVfZmFjdG9yX3ggPiBzY2FsZV9mYWN0b3JfeSkgew0KKyAgICAgICAgZGVzdC0+c2V0X2hlaWdodChwYWdlX2hlaWdodCAvIHNjYWxlX2ZhY3Rvcl94KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZGVzdC0+c2V0X3dpZHRoKHBhZ2Vfd2lkdGggLyBzY2FsZV9mYWN0b3JfeSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICAvLyBXZSBhcmUgbm90IHNjYWxpbmcgdG8gYm91bmRzLiBEcmF3IGluIHRoZSBhY3R1YWwgcGFnZSBzaXplLiBJZiB0aGUNCisgICAgLy8gYWN0dWFsIHBhZ2Ugc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgYm91bmRzLCB0aGUgb3V0cHV0IHdpbGwgYmUNCisgICAgLy8gY2xpcHBlZC4NCisgICAgZGVzdC0+c2V0X3dpZHRoKHBhZ2Vfd2lkdGgpOw0KKyAgICBkZXN0LT5zZXRfaGVpZ2h0KHBhZ2VfaGVpZ2h0KTsNCisgIH0NCisNCisgIGlmIChzZXR0aW5ncy5jZW50ZXJfaW5fYm91bmRzKSB7DQorICAgIHBwOjpQb2ludCBvZmZzZXQoKHNldHRpbmdzLmJvdW5kcy53aWR0aCgpIC0gZGVzdC0+d2lkdGgoKSkgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncy5ib3VuZHMuaGVpZ2h0KCkgLSBkZXN0LT5oZWlnaHQoKSkgLyAyKTsNCisgICAgZGVzdC0+T2Zmc2V0KG9mZnNldCk7DQorICB9DQorICByZXR1cm4gcm90YXRlOw0KK30NCisNCit9ICAvLyBuYW1lc3BhY2UNCisNCisjaWYgZGVmaW5lZChPU19XSU4pDQorYm9vbCBQREZpdW1FbmdpbmVFeHBvcnRzOjpSZW5kZXJQREZQYWdlVG9EQyhjb25zdCB2b2lkKiBwZGZfYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfbnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyaW5nU2V0dGluZ3MmIHNldHRpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDIGRjKSB7DQorICBGUERGX0RPQ1VNRU5UIGRvYyA9IEZQREZfTG9hZE1lbURvY3VtZW50KHBkZl9idWZmZXIsIGJ1ZmZlcl9zaXplLCBOVUxMKTsNCisgIGlmICghZG9jKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jLCBwYWdlX251bWJlcik7DQorICBpZiAoIXBhZ2UpIHsNCisgICAgRlBERl9DbG9zZURvY3VtZW50KGRvYyk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIFJlbmRlcmluZ1NldHRpbmdzIG5ld19zZXR0aW5ncyA9IHNldHRpbmdzOw0KKyAgLy8gY2FsY3VsYXRlIHRoZSBwYWdlIHNpemUNCisgIGlmIChuZXdfc2V0dGluZ3MuZHBpX3ggPT0gLTEpDQorICAgIG5ld19zZXR0aW5ncy5kcGlfeCA9IEdldERldmljZUNhcHMoZGMsIExPR1BJWEVMU1gpOw0KKyAgaWYgKG5ld19zZXR0aW5ncy5kcGlfeSA9PSAtMSkNCisgICAgbmV3X3NldHRpbmdzLmRwaV95ID0gR2V0RGV2aWNlQ2FwcyhkYywgTE9HUElYRUxTWSk7DQorDQorICBwcDo6UmVjdCBkZXN0Ow0KKyAgaW50IHJvdGF0ZSA9IENhbGN1bGF0ZVBvc2l0aW9uKHBhZ2UsIG5ld19zZXR0aW5ncywgJmRlc3QpOw0KKw0KKyAgaW50IHNhdmVfc3RhdGUgPSBTYXZlREMoZGMpOw0KKyAgLy8gVGhlIGNhbGxlciB3YW50ZWQgYWxsIGRyYXdpbmcgdG8gaGFwcGVuIHdpdGhpbiB0aGUgYm91bmRzIHNwZWNpZmllZC4NCisgIC8vIEJhc2VkIG9uIHNjYWxlIGNhbGN1bGF0aW9ucywgb3VyIGRlc3RpbmF0aW9uIHJlY3QgbWlnaHQgYmUgbGFyZ2VyDQorICAvLyB0aGFuIHRoZSBib3VuZHMuIFNldCB0aGUgY2xpcCByZWN0IHRvIHRoZSBib3VuZHMuDQorICBJbnRlcnNlY3RDbGlwUmVjdChkYywgc2V0dGluZ3MuYm91bmRzLngoKSwgc2V0dGluZ3MuYm91bmRzLnkoKSwNCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJvdW5kcy54KCkgKyBzZXR0aW5ncy5ib3VuZHMud2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJvdW5kcy55KCkgKyBzZXR0aW5ncy5ib3VuZHMuaGVpZ2h0KCkpOw0KKw0KKyAgLy8gQSB0ZW1wb3JhcnkgaGFjay4gUERGcyBnZW5lcmF0ZWQgYnkgQ2Fpcm8gKHVzZWQgYnkgQ2hyb21lIE9TIHRvIGdlbmVyYXRlDQorICAvLyBhIFBERiBvdXRwdXQgZnJvbSBhIHdlYnBhZ2UpIHJlc3VsdCBpbiB2ZXJ5IGxhcmdlIG1ldGFmaWxlcyBhbmQgdGhlDQorICAvLyByZW5kZXJpbmcgdXNpbmcgRlBERl9SZW5kZXJQYWdlIGlzIGluY29ycmVjdC4gSW4gdGhpcyBjYXNlLCByZW5kZXIgYXMgYQ0KKyAgLy8gYml0bWFwLiBOb3RlIHRoYXQgdGhpcyBjb2RlIGRvZXMgbm90IGtpY2sgaW4gZm9yIFBERnMgcHJpbnRlZCBmcm9tIENocm9tZQ0KKyAgLy8gYmVjYXVzZSBpbiB0aGF0IGNhc2Ugd2UgY3JlYXRlIGEgdGVtcCBQREYgZmlyc3QgYmVmb3JlIHByaW50aW5nIGFuZCB0aGlzDQorICAvLyB0ZW1wIFBERiBkb2VzIG5vdCBoYXZlIGEgY3JlYXRvciBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCAiY2Fpcm8iLg0KKyAgYmFzZTo6c3RyaW5nMTYgY3JlYXRvcjsNCisgIHNpemVfdCBidWZmZXJfYnl0ZXMgPSBGUERGX0dldE1ldGFUZXh0KGRvYywgIkNyZWF0b3IiLCBOVUxMLCAwKTsNCisgIGlmIChidWZmZXJfYnl0ZXMgPiAxKSB7DQorICAgIEZQREZfR2V0TWV0YVRleHQoDQorICAgICAgICBkb2MsICJDcmVhdG9yIiwgV3JpdGVJbnRvKCZjcmVhdG9yLCBidWZmZXJfYnl0ZXMgKyAxKSwgYnVmZmVyX2J5dGVzKTsNCisgIH0NCisgIGJvb2wgdXNlX2JpdG1hcCA9IGZhbHNlOw0KKyAgaWYgKFN0YXJ0c1dpdGgoY3JlYXRvciwgTCJjYWlybyIsIGZhbHNlKSkNCisgICAgdXNlX2JpdG1hcCA9IHRydWU7DQorDQorICAvLyBBbm90aGVyIHRlbXBvcmFyeSBoYWNrLiBTb21lIFBERnMgc2VlbXMgdG8gcmVuZGVyIHZlcnkgc2xvd2x5IGlmDQorICAvLyBGUERGX1JlbmRlclBhZ2UgaXMgZGlyZWN0bHkgdXNlZCBvbiBhIHByaW50ZXIgREMuIEkgc3VzcGVjdCBpdCBpcw0KKyAgLy8gYmVjYXVzZSBvZiB0aGUgY29kZSB0byB0YWxrIFBvc3RzY3JpcHQgZGlyZWN0bHkgdG8gdGhlIHByaW50ZXIgaWYNCisgIC8vIHRoZSBwcmludGVyIHN1cHBvcnRzIHRoaXMuIE5lZWQgdG8gZGlzY3VzcyB0aGlzIHdpdGggUERGaXVtLiBGb3Igbm93LA0KKyAgLy8gcmVuZGVyIHRvIGEgYml0bWFwIGFuZCB0aGVuIGJsaXQgdGhlIGJpdG1hcCB0byB0aGUgREMgaWYgd2UgaGF2ZSBiZWVuDQorICAvLyBzdXBwbGllZCBhIHByaW50ZXIgREMuDQorICBpbnQgZGV2aWNlX3R5cGUgPSBHZXREZXZpY2VDYXBzKGRjLCBURUNITk9MT0dZKTsNCisgIGlmICh1c2VfYml0bWFwIHx8DQorICAgICAgKGRldmljZV90eXBlID09IERUX1JBU1BSSU5URVIpIHx8IChkZXZpY2VfdHlwZSA9PSBEVF9QTE9UVEVSKSkgew0KKyAgICBGUERGX0JJVE1BUCBiaXRtYXAgPSBGUERGQml0bWFwX0NyZWF0ZShkZXN0LndpZHRoKCksIGRlc3QuaGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZCaXRtYXBfQkdSeCk7DQorICAgICAgLy8gQ2xlYXIgdGhlIGJpdG1hcA0KKyAgICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgZGVzdC53aWR0aCgpLCBkZXN0LmhlaWdodCgpLCAweEZGRkZGRkZGKTsNCisgICAgRlBERl9SZW5kZXJQYWdlQml0bWFwKA0KKyAgICAgICAgYml0bWFwLCBwYWdlLCAwLCAwLCBkZXN0LndpZHRoKCksIGRlc3QuaGVpZ2h0KCksIHJvdGF0ZSwNCisgICAgICAgIEZQREZfQU5OT1QgfCBGUERGX1BSSU5USU5HIHwgRlBERl9OT19DQVRDSCk7DQorICAgIGludCBzdHJpZGUgPSBGUERGQml0bWFwX0dldFN0cmlkZShiaXRtYXApOw0KKyAgICBCSVRNQVBJTkZPIGJtaTsNCisgICAgbWVtc2V0KCZibWksIDAsIHNpemVvZihibWkpKTsNCisgICAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IGRlc3Qud2lkdGgoKTsNCisgICAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1kZXN0LmhlaWdodCgpOyAgLy8gdG9wLWRvd24gaW1hZ2UNCisgICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDMyOw0KKyAgICBibWkuYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7DQorICAgIGJtaS5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSBzdHJpZGUgKiBkZXN0LmhlaWdodCgpOw0KKyAgICBTdHJldGNoRElCaXRzKGRjLCBkZXN0LngoKSwgZGVzdC55KCksIGRlc3Qud2lkdGgoKSwgZGVzdC5oZWlnaHQoKSwNCisgICAgICAgICAgICAgICAgICAwLCAwLCBkZXN0LndpZHRoKCksIGRlc3QuaGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwKSwgJmJtaSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOw0KKyAgICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsNCisgIH0gZWxzZSB7DQorICAgIEZQREZfUmVuZGVyUGFnZShkYywgcGFnZSwgZGVzdC54KCksIGRlc3QueSgpLCBkZXN0LndpZHRoKCksIGRlc3QuaGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgICByb3RhdGUsIEZQREZfQU5OT1QgfCBGUERGX1BSSU5USU5HIHwgRlBERl9OT19DQVRDSCk7DQorICB9DQorICBSZXN0b3JlREMoZGMsIHNhdmVfc3RhdGUpOw0KKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7DQorICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisjZW5kaWYgIC8vIE9TX1dJTg0KKw0KK2Jvb2wgUERGaXVtRW5naW5lRXhwb3J0czo6UmVuZGVyUERGUGFnZVRvQml0bWFwKA0KKyAgICBjb25zdCB2b2lkKiBwZGZfYnVmZmVyLA0KKyAgICBpbnQgcGRmX2J1ZmZlcl9zaXplLA0KKyAgICBpbnQgcGFnZV9udW1iZXIsDQorICAgIGNvbnN0IFJlbmRlcmluZ1NldHRpbmdzJiBzZXR0aW5ncywNCisgICAgdm9pZCogYml0bWFwX2J1ZmZlcikgew0KKyAgRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0xvYWRNZW1Eb2N1bWVudChwZGZfYnVmZmVyLCBwZGZfYnVmZmVyX3NpemUsIE5VTEwpOw0KKyAgaWYgKCFkb2MpDQorICAgIHJldHVybiBmYWxzZTsNCisgIEZQREZfUEFHRSBwYWdlID0gRlBERl9Mb2FkUGFnZShkb2MsIHBhZ2VfbnVtYmVyKTsNCisgIGlmICghcGFnZSkgew0KKyAgICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgcHA6OlJlY3QgZGVzdDsNCisgIGludCByb3RhdGUgPSBDYWxjdWxhdGVQb3NpdGlvbihwYWdlLCBzZXR0aW5ncywgJmRlc3QpOw0KKw0KKyAgRlBERl9CSVRNQVAgYml0bWFwID0NCisgICAgICBGUERGQml0bWFwX0NyZWF0ZUV4KHNldHRpbmdzLmJvdW5kcy53aWR0aCgpLCBzZXR0aW5ncy5ib3VuZHMuaGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGQml0bWFwX0JHUkEsIGJpdG1hcF9idWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ib3VuZHMud2lkdGgoKSAqIDQpOw0KKyAgLy8gQ2xlYXIgdGhlIGJpdG1hcA0KKyAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIDAsIDAsIHNldHRpbmdzLmJvdW5kcy53aWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ib3VuZHMuaGVpZ2h0KCksIDB4RkZGRkZGRkYpOw0KKyAgLy8gU2hpZnQgdG9wLWxlZnQgY29ybmVyIG9mIGJvdW5kcyB0byAoMCwgMCkgaWYgaXQncyBub3QgdGhlcmUuDQorICBkZXN0LnNldF9wb2ludChkZXN0LnBvaW50KCkgLSBzZXR0aW5ncy5ib3VuZHMucG9pbnQoKSk7DQorICBGUERGX1JlbmRlclBhZ2VCaXRtYXAoDQorICAgICAgYml0bWFwLCBwYWdlLCBkZXN0LngoKSwgZGVzdC55KCksIGRlc3Qud2lkdGgoKSwgZGVzdC5oZWlnaHQoKSwgcm90YXRlLA0KKyAgICAgIEZQREZfQU5OT1QgfCBGUERGX1BSSU5USU5HIHwgRlBERl9OT19DQVRDSCk7DQorICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsNCisgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOw0KKyAgRlBERl9DbG9zZURvY3VtZW50KGRvYyk7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBQREZpdW1FbmdpbmVFeHBvcnRzOjpHZXRQREZEb2NJbmZvKGNvbnN0IHZvaWQqIHBkZl9idWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwYWdlX2NvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG1heF9wYWdlX3dpZHRoKSB7DQorICBGUERGX0RPQ1VNRU5UIGRvYyA9IEZQREZfTG9hZE1lbURvY3VtZW50KHBkZl9idWZmZXIsIGJ1ZmZlcl9zaXplLCBOVUxMKTsNCisgIGlmICghZG9jKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpbnQgcGFnZV9jb3VudF9sb2NhbCA9IEZQREZfR2V0UGFnZUNvdW50KGRvYyk7DQorICBpZiAocGFnZV9jb3VudCkgew0KKyAgICAqcGFnZV9jb3VudCA9IHBhZ2VfY291bnRfbG9jYWw7DQorICB9DQorICBpZiAobWF4X3BhZ2Vfd2lkdGgpIHsNCisgICAgKm1heF9wYWdlX3dpZHRoID0gMDsNCisgICAgZm9yIChpbnQgcGFnZV9udW1iZXIgPSAwOyBwYWdlX251bWJlciA8IHBhZ2VfY291bnRfbG9jYWw7IHBhZ2VfbnVtYmVyKyspIHsNCisgICAgICBkb3VibGUgcGFnZV93aWR0aCA9IDA7DQorICAgICAgZG91YmxlIHBhZ2VfaGVpZ2h0ID0gMDsNCisgICAgICBGUERGX0dldFBhZ2VTaXplQnlJbmRleChkb2MsIHBhZ2VfbnVtYmVyLCAmcGFnZV93aWR0aCwgJnBhZ2VfaGVpZ2h0KTsNCisgICAgICBpZiAocGFnZV93aWR0aCA+ICptYXhfcGFnZV93aWR0aCkgew0KKyAgICAgICAgKm1heF9wYWdlX3dpZHRoID0gcGFnZV93aWR0aDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgUERGaXVtRW5naW5lRXhwb3J0czo6R2V0UERGUGFnZVNpemVCeUluZGV4KA0KKyAgICBjb25zdCB2b2lkKiBwZGZfYnVmZmVyLA0KKyAgICBpbnQgcGRmX2J1ZmZlcl9zaXplLA0KKyAgICBpbnQgcGFnZV9udW1iZXIsDQorICAgIGRvdWJsZSogd2lkdGgsDQorICAgIGRvdWJsZSogaGVpZ2h0KSB7DQorICBGUERGX0RPQ1VNRU5UIGRvYyA9IEZQREZfTG9hZE1lbURvY3VtZW50KHBkZl9idWZmZXIsIHBkZl9idWZmZXJfc2l6ZSwgTlVMTCk7DQorICBpZiAoIWRvYykNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgYm9vbCBzdWNjZXNzID0gRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoZG9jLCBwYWdlX251bWJlciwgd2lkdGgsIGhlaWdodCkgIT0gMDsNCisgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOw0KKyAgcmV0dXJuIHN1Y2Nlc3M7DQorfQ0KKw0KK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmDQpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fZW5naW5lLmggYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9lbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDJjMzNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fZW5naW5lLmgKQEAgLTAsMCArMSw2ODcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BERklVTV9QREZJVU1fRU5HSU5FX0hfCisjZGVmaW5lIFBERl9QREZJVU1fUERGSVVNX0VOR0lORV9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUvdGltZS5oIgorI2luY2x1ZGUgInBkZi9kb2N1bWVudF9sb2FkZXIuaCIKKyNpbmNsdWRlICJwZGYvcGRmX2VuZ2luZS5oIgorI2luY2x1ZGUgInBkZi9wZGZpdW0vcGRmaXVtX3BhZ2UuaCIKKyNpbmNsdWRlICJwZGYvcGRmaXVtL3BkZml1bV9yYW5nZS5oIgorI2luY2x1ZGUgInBwYXBpL2NwcC9jb21wbGV0aW9uX2NhbGxiYWNrLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2Rldi9idWZmZXJfZGV2LmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2ltYWdlX2RhdGEuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcG9pbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZfZGF0YWF2YWlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvcGRmaXVtL2ZwZGZzZGsvaW5jbHVkZS9mcGRmX3Byb2dyZXNzaXZlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvcGRmaXVtL2ZwZGZzZGsvaW5jbHVkZS9mcGRmZm9ybWZpbGwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZ2aWV3LmgiCisKKyNkZWZpbmUgX1RFU1RfWEZBCisjaWZkZWYgX1RFU1RfWEZBCisjIGlmIGRlZmluZWQoV0lOMzIpCisjCWRlZmluZSBGWFFBX1RFU1RGSUxFKGZpbGVuYW1lKSAiRTovIiNmaWxlbmFtZQorIyBlbHNlCisjCWRlZmluZSBGWFFBX1RFU1RGSUxFKGZpbGVuYW1lKSAiL2hvbWUvIiNmaWxlbmFtZQorIyBlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBwcCB7CitjbGFzcyBLZXlib2FyZElucHV0RXZlbnQ7CitjbGFzcyBNb3VzZUlucHV0RXZlbnQ7Cit9CisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgU2hhZG93TWF0cml4OworCitjbGFzcyBQREZpdW1FbmdpbmUgOiBwdWJsaWMgUERGRW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIERvY3VtZW50TG9hZGVyOjpDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRlBERl9GT1JNRklMTElORk8sCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVBERl9KU1BMQVRGT1JNLAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGU0RLX1BBVVNFIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBERml1bUVuZ2luZShQREZFbmdpbmU6OkNsaWVudCogY2xpZW50KTsKKyAgdmlydHVhbCB+UERGaXVtRW5naW5lKCk7CisKKyAgLy8gUERGRW5naW5lIGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIGJvb2wgTmV3KGNvbnN0IGNoYXIqIHVybCk7CisgIHZpcnR1YWwgYm9vbCBOZXcoY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGhlYWRlcnMpOworICB2aXJ0dWFsIHZvaWQgUGFnZU9mZnNldFVwZGF0ZWQoY29uc3QgcHA6OlBvaW50JiBwYWdlX29mZnNldCk7CisgIHZpcnR1YWwgdm9pZCBQbHVnaW5TaXplVXBkYXRlZChjb25zdCBwcDo6U2l6ZSYgc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxlZFRvWFBvc2l0aW9uKGludCBwb3NpdGlvbik7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxlZFRvWVBvc2l0aW9uKGludCBwb3NpdGlvbik7CisgIHZpcnR1YWwgdm9pZCBQcmVQYWludCgpOworICB2aXJ0dWFsIHZvaWQgUGFpbnQoY29uc3QgcHA6OlJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+KiByZWFkeSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiogcGVuZGluZyk7CisgIHZpcnR1YWwgdm9pZCBQb3N0UGFpbnQoKTsKKyAgdmlydHVhbCBib29sIEhhbmRsZURvY3VtZW50TG9hZChjb25zdCBwcDo6VVJMTG9hZGVyJiBsb2FkZXIpOworICB2aXJ0dWFsIGJvb2wgSGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KTsKKyAgdmlydHVhbCB1aW50MzJfdCBRdWVyeVN1cHBvcnRlZFByaW50T3V0cHV0Rm9ybWF0cygpOworICB2aXJ0dWFsIHZvaWQgUHJpbnRCZWdpbigpOworICB2aXJ0dWFsIHBwOjpSZXNvdXJjZSBQcmludFBhZ2VzKAorICAgICAgY29uc3QgUFBfUHJpbnRQYWdlTnVtYmVyUmFuZ2VfRGV2KiBwYWdlX3JhbmdlcywKKyAgICAgIHVpbnQzMl90IHBhZ2VfcmFuZ2VfY291bnQsCisgICAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpOworICB2aXJ0dWFsIHZvaWQgUHJpbnRFbmQoKTsKKyAgdmlydHVhbCB2b2lkIFN0YXJ0RmluZChjb25zdCBjaGFyKiB0ZXh0LCBib29sIGNhc2Vfc2Vuc2l0aXZlKTsKKyAgdmlydHVhbCBib29sIFNlbGVjdEZpbmRSZXN1bHQoYm9vbCBmb3J3YXJkKTsKKyAgdmlydHVhbCB2b2lkIFN0b3BGaW5kKCk7CisgIHZpcnR1YWwgdm9pZCBab29tVXBkYXRlZChkb3VibGUgbmV3X3pvb21fbGV2ZWwpOworICB2aXJ0dWFsIHZvaWQgUm90YXRlQ2xvY2t3aXNlKCk7CisgIHZpcnR1YWwgdm9pZCBSb3RhdGVDb3VudGVyY2xvY2t3aXNlKCk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U2VsZWN0ZWRUZXh0KCk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0TGlua0F0UG9zaXRpb24oY29uc3QgcHA6OlBvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgYm9vbCBJc1NlbGVjdGluZygpOworICB2aXJ0dWFsIGJvb2wgSGFzUGVybWlzc2lvbihEb2N1bWVudFBlcm1pc3Npb24gcGVybWlzc2lvbikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZWxlY3RBbGwoKTsKKyAgdmlydHVhbCBpbnQgR2V0TnVtYmVyT2ZQYWdlcygpOworICB2aXJ0dWFsIGludCBHZXROYW1lZERlc3RpbmF0aW9uUGFnZShjb25zdCBzdGQ6OnN0cmluZyYgZGVzdGluYXRpb24pOworICB2aXJ0dWFsIGludCBHZXRGaXJzdFZpc2libGVQYWdlKCk7CisgIHZpcnR1YWwgaW50IEdldE1vc3RWaXNpYmxlUGFnZSgpOworICB2aXJ0dWFsIHBwOjpSZWN0IEdldFBhZ2VSZWN0KGludCBpbmRleCk7CisgIHZpcnR1YWwgcHA6OlJlY3QgR2V0UGFnZUNvbnRlbnRzUmVjdChpbnQgaW5kZXgpOworICB2aXJ0dWFsIGludCBHZXRWZXJ0aWNhbFNjcm9sbGJhcllQb3NpdGlvbigpIHsgcmV0dXJuIHBvc2l0aW9uXy55KCk7IH0KKyAgdmlydHVhbCB2b2lkIFBhaW50VGh1bWJuYWlsKHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsIGludCBpbmRleCk7CisgIHZpcnR1YWwgdm9pZCBTZXRHcmF5c2NhbGUoYm9vbCBncmF5c2NhbGUpOworICB2aXJ0dWFsIHZvaWQgT25DYWxsYmFjayhpbnQgaWQpOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFBhZ2VBc0pTT04oaW50IGluZGV4KTsKKyAgdmlydHVhbCBib29sIEdldFByaW50U2NhbGluZygpOworICB2aXJ0dWFsIHZvaWQgQXBwZW5kQmxhbmtQYWdlcyhpbnQgbnVtX3BhZ2VzKTsKKyAgdmlydHVhbCB2b2lkIEFwcGVuZFBhZ2UoUERGRW5naW5lKiBlbmdpbmUsIGludCBpbmRleCk7CisgIHZpcnR1YWwgcHA6OlBvaW50IEdldFNjcm9sbFBvc2l0aW9uKCk7CisgIHZpcnR1YWwgdm9pZCBTZXRTY3JvbGxQb3NpdGlvbihjb25zdCBwcDo6UG9pbnQmIHBvc2l0aW9uKTsKKyAgdmlydHVhbCBib29sIElzUHJvZ3Jlc3NpdmVMb2FkKCk7CisKKyAgLy8gRG9jdW1lbnRMb2FkZXI6OkNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCBwcDo6SW5zdGFuY2UqIEdldFBsdWdpbkluc3RhbmNlKCk7CisgIHZpcnR1YWwgcHA6OlVSTExvYWRlciBDcmVhdGVVUkxMb2FkZXIoKTsKKyAgdmlydHVhbCB2b2lkIE9uUGFydGlhbERvY3VtZW50TG9hZGVkKCk7CisgIHZpcnR1YWwgdm9pZCBPblBlbmRpbmdSZXF1ZXN0Q29tcGxldGUoKTsKKyAgdmlydHVhbCB2b2lkIE9uTmV3RGF0YUF2YWlsYWJsZSgpOworICB2aXJ0dWFsIHZvaWQgT25Eb2N1bWVudENvbXBsZXRlKCk7CisKKyAgdm9pZCBVbnN1cHBvcnRlZEZlYXR1cmUoaW50IHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfZmluZF90ZXh0KCkgY29uc3QgeyByZXR1cm4gY3VycmVudF9maW5kX3RleHRfOyB9CisKKyAgRlBERl9ET0NVTUVOVCBkb2MoKSB7IHJldHVybiBkb2NfOyB9CisgIEZQREZfRk9STUhBTkRMRSBmb3JtKCkgeyByZXR1cm4gZm9ybV87IH0KKworIHByaXZhdGU6CisgIC8vIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBkaWZmZXJlbmNlIGluIHNlbGVjdGlvbiBiZXR3ZWVuCisgIC8vIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24uICBBdCBkZXN0cnVjdGlvbiwgaXQgaW52YWxpZGF0ZXMgYWxsIHRoZQorICAvLyBwYXJ0cyB0aGF0IGFyZSBuZXdseSBzZWxlY3RlZCwgYWxvbmcgd2l0aCBhbGwgdGhlIHBhcnRzIHRoYXQgdXNlZCB0byBiZQorICAvLyBzZWxlY3RlZCBidXQgYXJlIG5vdCBhbnltb3JlLgorICBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VJbnZhbGlkYXRvciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgU2VsZWN0aW9uQ2hhbmdlSW52YWxpZGF0b3IoUERGaXVtRW5naW5lKiBlbmdpbmUpOworICAgIH5TZWxlY3Rpb25DaGFuZ2VJbnZhbGlkYXRvcigpOworICAgcHJpdmF0ZToKKyAgICAvLyBTZXRzIHRoZSBnaXZlbiBjb250YWluZXIgdG8gdGhlIGFsbCB0aGUgY3VycmVudGx5IHZpc2libGUgc2VsZWN0aW9uCisgICAgLy8gcmVjdGFuZ2xlcywgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgorICAgIHZvaWQgR2V0VmlzaWJsZVNlbGVjdGlvbnNTY3JlZW5SZWN0cyhzdGQ6OnZlY3RvcjxwcDo6UmVjdD4qIHJlY3RzKTsKKworICAgIFBERml1bUVuZ2luZSogZW5naW5lXzsKKyAgICAvLyBTY3JlZW4gcmVjdGFuZ2xlcyB0aGF0IHdlcmUgc2VsZWN0ZWQgb24gY29uc3RydWN0aW9uLgorICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiBvbGRfc2VsZWN0aW9uc187CisgICAgLy8gVGhlIG9yaWdpbiBhdCB0aGUgdGltZSB0aGlzIG9iamVjdCB3YXMgY29uc3RydWN0ZWQuCisgICAgcHA6OlBvaW50IHByZXZpb3VzX29yaWdpbl87CisgIH07CisKKyAgLy8gVXNlZCB0byBzdG9yZSBtb3VzZSBkb3duIHN0YXRlIHRvIGhhbmRsZSBpdCBpbiBvdGhlciBtb3VzZSBldmVudCBoYW5kbGVycy4KKyAgY2xhc3MgTW91c2VEb3duU3RhdGUgeworICAgcHVibGljOgorICAgIE1vdXNlRG93blN0YXRlKGNvbnN0IFBERml1bVBhZ2U6OkFyZWEmIGFyZWEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUERGaXVtUGFnZTo6TGlua1RhcmdldCYgdGFyZ2V0KTsKKyAgICB+TW91c2VEb3duU3RhdGUoKTsKKworICAgIHZvaWQgU2V0KGNvbnN0IFBERml1bVBhZ2U6OkFyZWEmIGFyZWEsCisgICAgICAgICAgICAgY29uc3QgUERGaXVtUGFnZTo6TGlua1RhcmdldCYgdGFyZ2V0KTsKKyAgICB2b2lkIFJlc2V0KCk7CisgICAgYm9vbCBNYXRjaGVzKGNvbnN0IFBERml1bVBhZ2U6OkFyZWEmIGFyZWEsCisgICAgICAgICAgICAgICAgIGNvbnN0IFBERml1bVBhZ2U6OkxpbmtUYXJnZXQmIHRhcmdldCkgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgUERGaXVtUGFnZTo6QXJlYSBhcmVhXzsKKyAgICBQREZpdW1QYWdlOjpMaW5rVGFyZ2V0IHRhcmdldF87CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW91c2VEb3duU3RhdGUpOworICB9OworCisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VJbnZhbGlkYXRvcjsKKworICBzdHJ1Y3QgRmlsZUF2YWlsIDogcHVibGljIEZYX0ZJTEVBVkFJTCB7CisgICAgRG9jdW1lbnRMb2FkZXIqIGxvYWRlcjsKKyAgfTsKKworICBzdHJ1Y3QgRG93bmxvYWRIaW50cyA6IHB1YmxpYyBGWF9ET1dOTE9BREhJTlRTIHsKKyAgICBEb2N1bWVudExvYWRlciogbG9hZGVyOworICB9OworCisgIC8vIFBERml1bSBpbnRlcmZhY2UgdG8gZ2V0IGJsb2NrIG9mIGRhdGEuCisgIHN0YXRpYyBpbnQgR2V0QmxvY2sodm9pZCogcGFyYW0sIHVuc2lnbmVkIGxvbmcgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCisgIC8vIFBERml1bSBpbnRlcmZhY2UgdG8gY2hlY2sgaXMgYmxvY2sgb2YgZGF0YSBpcyBhdmFpbGFibGUuCisgIHN0YXRpYyBib29sIElzRGF0YUF2YWlsKEZYX0ZJTEVBVkFJTCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAvLyBQREZpdW0gaW50ZXJmYWNlIHRvIHJlcXVlc3QgZG93bmxvYWQgb2YgdGhlIGJsb2NrIG9mIGRhdGEuCisgIHN0YXRpYyB2b2lkIEFkZFNlZ21lbnQoRlhfRE9XTkxPQURISU5UUyogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgIC8vIFdlIGZpbmlzaGVkIGdldHRpbmcgdGhlIHBkZiBmaWxlLCBzbyBsb2FkIGl0LiBUaGlzIHdpbGwgY29tcGxldGUKKyAgLy8gYXN5bmNocm9ub3VzbHkgKGR1ZSB0byBwYXNzd29yZCBmZXRjaGluZykgYW5kIG1heSBiZSBydW4gbXVsdGlwbGUgdGltZXMuCisgIHZvaWQgTG9hZERvY3VtZW50KCk7CisKKyAgLy8gVHJ5IGxvYWRpbmcgdGhlIGRvY3VtZW50LiBSZXR1cm5zIHRydWUgaWYgdGhlIGRvY3VtZW50IGlzIHN1Y2Nlc3NmdWxseQorICAvLyBsb2FkZWQgb3IgaXMgYWxyZWFkeSBsb2FkZWQgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGZhbHNlLiBJZgorICAvLyB8d2l0aF9wYXNzd29yZHwgaXMgc2V0IHRvIHRydWUsIHRoZSBkb2N1bWVudCB3aWxsIGJlIGxvYWRlZCB3aXRoCisgIC8vIHxwYXNzd29yZHwuIElmIHRoZSBkb2N1bWVudCBjb3VsZCBub3QgYmUgbG9hZGVkIGFuZCBuZWVkcyBhIHBhc3N3b3JkLAorICAvLyB8bmVlZHNfcGFzc3dvcmR8IHdpbGwgYmUgc2V0IHRvIHRydWUuCisgIGJvb2wgVHJ5TG9hZGluZ0RvYyhib29sIHdpdGhfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICBib29sKiBuZWVkc19wYXNzd29yZCk7CisKKyAgLy8gQXNrIHRoZSB1c2VyIGZvciB0aGUgZG9jdW1lbnQgcGFzc3dvcmQgYW5kIHRoZW4gY29udGludWUgbG9hZGluZyB0aGUKKyAgLy8gZG9jdW1lbnQuCisgIHZvaWQgR2V0UGFzc3dvcmRBbmRMb2FkKCk7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIHBhc3N3b3JkIGhhcyBiZWVuIHJldHJpZXZlZC4KKyAgdm9pZCBPbkdldFBhc3N3b3JkQ29tcGxldGUoaW50MzJfdCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpWYXImIHBhc3N3b3JkKTsKKworICAvLyBDb250aW51ZXMgbG9hZGluZyB0aGUgZG9jdW1lbnQgd2hlbiB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gcmV0cmlldmVkLCBvciBpZgorICAvLyB0aGVyZSBpcyBubyBwYXNzd29yZC4KKyAgdm9pZCBDb250aW51ZUxvYWRpbmdEb2N1bWVudChib29sIGhhc19wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOworCisgIC8vIEZpbmlzaCBsb2FkaW5nIHRoZSBkb2N1bWVudCBhbmQgbm90aWZ5IHRoZSBjbGllbnQgdGhhdCB0aGUgZG9jdW1lbnQgaGFzCisgIC8vIGJlZW4gbG9hZGVkLiBUaGlzIHNob3VsZCBvbmx5IGJlIHJ1biBhZnRlciB8ZG9jX3wgaGFzIGJlZW4gbG9hZGVkIGFuZCB0aGUKKyAgLy8gZG9jdW1lbnQgaXMgZnVsbHkgZG93bmxvYWRlZC4gSWYgdGhpcyBoYXMgYmVlbiBydW4gb25jZSwgaXQgd2lsbCByZXN1bHQgaW4KKyAgLy8gYSBuby1vcC4KKyAgdm9pZCBGaW5pc2hMb2FkaW5nRG9jdW1lbnQoKTsKKworICAvLyBMb2FkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFnZXMgaW4gdGhlIGRvY3VtZW50IGFuZCBjYWxjdWxhdGUgdGhlCisgIC8vIGRvY3VtZW50IHNpemUuCisgIHZvaWQgTG9hZFBhZ2VJbmZvKGJvb2wgcmVsb2FkKTsKKworICAvLyBDYWxjdWxhdGUgd2hpY2ggcGFnZXMgc2hvdWxkIGJlIGRpc3BsYXllZCByaWdodCBub3cuCisgIHZvaWQgQ2FsY3VsYXRlVmlzaWJsZVBhZ2VzKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gcGFnZSBpbmRleCBpcyB2aXNpYmxlLiAgQ2FsY3VsYXRlVmlzaWJsZVBhZ2VzCisgIC8vIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBmaXJzdC4KKyAgYm9vbCBJc1BhZ2VWaXNpYmxlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gQ2hlY2tzIGlmIGEgcGFnZSBpcyBub3cgYXZhaWxhYmxlLCBhbmQgaWYgc28gbWFya3MgaXQgYXMgc3VjaCBhbmQgcmV0dXJucworICAvLyB0cnVlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiBmYWxzZSBhbmQgd2lsbCBhZGQgdGhlIGluZGV4IHRvIHRoZSBnaXZlbgorICAvLyBhcnJheSBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgorICBib29sIENoZWNrUGFnZUF2YWlsYWJsZShpbnQgaW5kZXgsIHN0ZDo6dmVjdG9yPGludD4qIHBlbmRpbmcpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYSBnaXZlbiBwYWdlJ3Mgc2l6ZSBpbiBwaXhlbHMuICBUaGlzIGlzIG5vdCBwYXJ0IG9mCisgIC8vIFBERml1bVBhZ2UgYmVjYXVzZSB3ZSBtaWdodCBub3QgaGF2ZSB0aGF0IHN0cnVjdHVyZSB3aGVuIHdlIG5lZWQgdGhpcy4KKyAgcHA6OlNpemUgR2V0UGFnZVNpemUoaW50IGluZGV4KTsKKworICB2b2lkIFVwZGF0ZVRpY2tNYXJrcygpOworCisgIC8vIENhbGxlZCB0byBjb250aW51ZSBzZWFyY2hpbmcgc28gd2UgZG9uJ3QgYmxvY2sgdGhlIG1haW4gdGhyZWFkLgorICB2b2lkIENvbnRpbnVlRmluZChpbnQzMl90IHJlc3VsdCk7CisKKyAgLy8gSW5zZXJ0cyBhIGZpbmQgcmVzdWx0IGludG8gZmluZF9yZXN1bHRzXywgd2hpY2ggaXMgc29ydGVkLgorICB2b2lkIEFkZEZpbmRSZXN1bHQoY29uc3QgUERGaXVtUmFuZ2UmIHJlc3VsdCk7CisKKyAgLy8gU2VhcmNoIGEgcGFnZSB1c2luZyBQREZpdW0ncyBtZXRob2RzLiAgRG9lc24ndCB3b3JrIHdpdGggdW5pY29kZS4gIFRoaXMKKyAgLy8gZnVuY3Rpb24gaXMganVzdCBrZXB0IGFyb3VudCBpbiBjYXNlIFBERml1bSBjb2RlIGlzIGZpeGVkLgorICB2b2lkIFNlYXJjaFVzaW5nUERGaXVtKGNvbnN0IGJhc2U6OnN0cmluZzE2JiB0ZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmaXJzdF9zZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJhY3Rlcl90b19zdGFydF9zZWFyY2hpbmdfZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudF9wYWdlKTsKKworICAvLyBTZWFyY2ggYSBwYWdlIG91cnNlbGYgdXNpbmcgSUNVLgorICB2b2lkIFNlYXJjaFVzaW5nSUNVKGNvbnN0IGJhc2U6OnN0cmluZzE2JiB0ZXJtLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmaXJzdF9zZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJhY3Rlcl90b19zdGFydF9zZWFyY2hpbmdfZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudF9wYWdlKTsKKworICAvLyBJbnB1dCBldmVudCBoYW5kbGVycy4KKyAgYm9vbCBPbk1vdXNlRG93bihjb25zdCBwcDo6TW91c2VJbnB1dEV2ZW50JiBldmVudCk7CisgIGJvb2wgT25Nb3VzZVVwKGNvbnN0IHBwOjpNb3VzZUlucHV0RXZlbnQmIGV2ZW50KTsKKyAgYm9vbCBPbk1vdXNlTW92ZShjb25zdCBwcDo6TW91c2VJbnB1dEV2ZW50JiBldmVudCk7CisgIGJvb2wgT25LZXlEb3duKGNvbnN0IHBwOjpLZXlib2FyZElucHV0RXZlbnQmIGV2ZW50KTsKKyAgYm9vbCBPbktleVVwKGNvbnN0IHBwOjpLZXlib2FyZElucHV0RXZlbnQmIGV2ZW50KTsKKyAgYm9vbCBPbkNoYXIoY29uc3QgcHA6OktleWJvYXJkSW5wdXRFdmVudCYgZXZlbnQpOworCisgIEZQREZfRE9DVU1FTlQgQ3JlYXRlU2luZ2xlUGFnZVJhc3RlclBkZigKKyAgICAgIGRvdWJsZSBzb3VyY2VfcGFnZV93aWR0aCwKKyAgICAgIGRvdWJsZSBzb3VyY2VfcGFnZV9oZWlnaHQsCisgICAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MsCisgICAgICBQREZpdW1QYWdlKiBwYWdlX3RvX3ByaW50KTsKKworICBwcDo6QnVmZmVyX0RldiBQcmludFBhZ2VzQXNSYXN0ZXJQREYoCisgICAgICBjb25zdCBQUF9QcmludFBhZ2VOdW1iZXJSYW5nZV9EZXYqIHBhZ2VfcmFuZ2VzLAorICAgICAgdWludDMyX3QgcGFnZV9yYW5nZV9jb3VudCwKKyAgICAgIGNvbnN0IFBQX1ByaW50U2V0dGluZ3NfRGV2JiBwcmludF9zZXR0aW5ncyk7CisKKyAgcHA6OkJ1ZmZlcl9EZXYgUHJpbnRQYWdlc0FzUERGKGNvbnN0IFBQX1ByaW50UGFnZU51bWJlclJhbmdlX0RldiogcGFnZV9yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYWdlX3JhbmdlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBfUHJpbnRTZXR0aW5nc19EZXYmIHByaW50X3NldHRpbmdzKTsKKworICBwcDo6QnVmZmVyX0RldiBHZXRGbGF0dGVuZWRQcmludERhdGEoY29uc3QgRlBERl9ET0NVTUVOVCYgZG9jKTsKKyAgdm9pZCBGaXRDb250ZW50c1RvUHJpbnRhYmxlQXJlYUlmUmVxdWlyZWQoCisgICAgICBjb25zdCBGUERGX0RPQ1VNRU5UJiBkb2MsCisgICAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpOworICB2b2lkIFNhdmVTZWxlY3RlZEZvcm1Gb3JQcmludCgpOworCisgIC8vIEdpdmVuIGEgbW91c2UgZXZlbnQsIHJldHVybnMgd2hpY2ggcGFnZSBhbmQgY2hhcmFjdGVyIGxvY2F0aW9uIGl0J3MgY2xvc2VzdAorICAvLyB0by4KKyAgUERGaXVtUGFnZTo6QXJlYSBHZXRDaGFySW5kZXgoY29uc3QgcHA6Ok1vdXNlSW5wdXRFdmVudCYgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjaGFyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZpdW1QYWdlOjpMaW5rVGFyZ2V0KiB0YXJnZXQpOworICBQREZpdW1QYWdlOjpBcmVhIEdldENoYXJJbmRleChjb25zdCBwcDo6UG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY2hhcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGaXVtUGFnZTo6TGlua1RhcmdldCogdGFyZ2V0KTsKKworICB2b2lkIE9uU2luZ2xlQ2xpY2soaW50IHBhZ2VfaW5kZXgsIGludCBjaGFyX2luZGV4KTsKKyAgdm9pZCBPbk11bHRpcGxlQ2xpY2soaW50IGNsaWNrX2NvdW50LCBpbnQgcGFnZV9pbmRleCwgaW50IGNoYXJfaW5kZXgpOworCisgIC8vIFN0YXJ0cyBhIHByb2dyZXNzaXZlIHBhaW50IG9wZXJhdGlvbiBnaXZlbiBhIHJlY3RhbmdsZSBpbiBzY3JlZW4KKyAgLy8gY29vcmRpbmF0ZXMuIFJldHVybnMgdGhlIGluZGV4IGluIHByb2dyZXNzaXZlX3JlY3RzXy4KKyAgaW50IFN0YXJ0UGFpbnQoaW50IHBhZ2VfaW5kZXgsIGNvbnN0IHBwOjpSZWN0JiBkaXJ0eSk7CisKKyAgLy8gQ29udGludWVzIGEgcGFpbnQgb3BlcmF0aW9uIHRoYXQgd2FzIHN0YXJ0ZWQgZWFybGllci4gIFJldHVybnMgdHJ1ZSBpZiB0aGUKKyAgLy8gcGFpbnQgaXMgZG9uZSwgb3IgZmFsc2UgaWYgaXQgbmVlZHMgdG8gYmUgY29udGludWVkLgorICBib29sIENvbnRpbnVlUGFpbnQoaW50IHByb2dyZXNzaXZlX2luZGV4LCBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKTsKKworICAvLyBDYWxsZWQgb25jZSBQREZpdW0gaXMgZmluaXNoZWQgcmVuZGVyaW5nIGEgcGFnZSBzbyB0aGF0IHdlIGRyYXcgb3VyCisgIC8vIGJvcmRlcnMsIGhpZ2hsaWdodGluZyBldGMuCisgIHZvaWQgRmluaXNoUGFpbnQoaW50IHByb2dyZXNzaXZlX2luZGV4LCBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKTsKKworICAvLyBTdG9wcyBhbnkgcGFpbnRzIHRoYXQgYXJlIGluIHByb2dyZXNzLgorICB2b2lkIENhbmNlbFBhaW50cygpOworCisgIC8vIEludmFsaWRhdGVzIGFsbCBwYWdlcy4gVXNlIHRoaXMgd2hlbiBzb21lIGdsb2JhbCBwYXJhbWV0ZXIsIHN1Y2ggYXMgcGFnZQorICAvLyBvcmllbnRhdGlvbiwgaGFzIGNoYW5nZWQuCisgIHZvaWQgSW52YWxpZGF0ZUFsbFBhZ2VzKCk7CisKKyAgLy8gSWYgdGhlIHBhZ2UgaXMgbmFycm93ZXIgdGhhbiB0aGUgZG9jdW1lbnQgc2l6ZSwgcGFpbnQgdGhlIGV4dHJhIHNwYWNlCisgIC8vIHdpdGggdGhlIHBhZ2UgYmFja2dyb3VuZC4KKyAgdm9pZCBGaWxsUGFnZVNpZGVzKGludCBwcm9ncmVzc2l2ZV9pbmRleCk7CisKKyAgdm9pZCBQYWludFBhZ2VTaGFkb3coaW50IHByb2dyZXNzaXZlX2luZGV4LCBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKTsKKworICAvLyBIaWdobGlnaHQgdmlzaWJsZSBmaW5kIHJlc3VsdHMgYW5kIHNlbGVjdGlvbnMuCisgIHZvaWQgRHJhd1NlbGVjdGlvbnMoaW50IHByb2dyZXNzaXZlX2luZGV4LCBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKTsKKworICAvLyBQYWludHMgYW4gcGFnZSB0aGF0IGhhc24ndCBmaW5pc2hlZCBkb3dubG9hZGluZy4KKyAgdm9pZCBQYWludFVuYXZhaWxhYmxlUGFnZShpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgZGlydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSk7CisKKyAgLy8gR2l2ZW4gYSBwYWdlIGluZGV4LCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGluIHByb2dyZXNzaXZlX3JlY3RzXywKKyAgLy8gb3IgLTEgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgaW50IEdldFByb2dyZXNzaXZlSW5kZXgoaW50IHBhZ2VfaW5kZXgpIGNvbnN0OworCisgIC8vIENyZWF0ZXMgYSBGUERGX0JJVE1BUCBmcm9tIGEgcmVjdGFuZ2xlIGluIHNjcmVlbiBjb29yZGluYXRlcy4KKyAgRlBERl9CSVRNQVAgQ3JlYXRlQml0bWFwKGNvbnN0IHBwOjpSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSkgY29uc3Q7CisKKyAgLy8gR2l2ZW4gYSByZWN0YW5nbGUgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLCByZXR1cm5zIHRoZSBjb29yZGluYXRlcyBpbiB0aGUKKyAgLy8gdW5pdHMgdGhhdCBQREZpdW0gcmVuZGVyaW5nIGZ1bmN0aW9ucyBleHBlY3QuCisgIHZvaWQgR2V0UERGaXVtUmVjdChpbnQgcGFnZV9pbmRleCwgY29uc3QgcHA6OlJlY3QmIHJlY3QsIGludCogc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgIGludCogc3RhcnRfeSwgaW50KiBzaXplX3gsIGludCogc2l6ZV95KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSByZW5kZXJpbmcgZmxhZ3MgdG8gcGFzcyB0byBQREZpdW0uCisgIGludCBHZXRSZW5kZXJpbmdGbGFncygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHJlY3RhbmdsZSBpbiBkb2N1bWVudCBjb29yZGluYXRlcy4KKyAgcHA6OlJlY3QgR2V0VmlzaWJsZVJlY3QoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgcGFnZSdzIHJlY3QgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLCBhcyB3ZWxsIGFzIGl0cyBzdXJyb3VuZGluZworICAvLyBib3JkZXIgYXJlYXMgYW5kIGJvdHRvbSBzZXBhcmF0b3IuCisgIHBwOjpSZWN0IEdldFBhZ2VTY3JlZW5SZWN0KGludCBwYWdlX2luZGV4KSBjb25zdDsKKworICAvLyBHaXZlbiBhIHJlY3RhbmdsZSBpbiBkb2N1bWVudCBjb29yZGluYXRlcywgcmV0dXJucyB0aGUgcmVjdGFuZ2UgaW50byBzY3JlZW4KKyAgLy8gY29vcmRpbmF0ZXMgKGkuZS4gMCwwIGlzIHRvcCBsZWZ0IGNvcm5lciBvZiBwbHVnaW4gYXJlYSkuICBJZiBpdCdzIG5vdAorICAvLyB2aXNpYmxlLCBhbiBlbXB0eSByZWN0YW5nbGUgaXMgcmV0dXJuZWQuCisgIHBwOjpSZWN0IEdldFNjcmVlblJlY3QoY29uc3QgcHA6OlJlY3QmIHJlY3QpIGNvbnN0OworCisgIC8vIEhpZ2hsaWdodHMgdGhlIGdpdmVuIHJlY3RhbmdsZS4KKyAgdm9pZCBIaWdobGlnaHQodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+KiBoaWdobGlnaHRlZF9yZWN0cyk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBkZXZpY2UgdG8gcGFnZSBjb29yZGluYXRlcy4gIElmIHRoZSBwYWdlIGlzCisgIC8vIG5vdCB5ZXQgbG9hZGVkLCBwYWdlX3ggYW5kIHBhZ2VfeSB3aWxsIGJlIHNldCB0byAwLgorICB2b2lkIERldmljZVRvUGFnZShpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGV2aWNlX3gsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRldmljZV95LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3kpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gRlBERl9QQUdFLiAgUmV0dXJucyAtMSBpZiBub3QKKyAgLy8gZm91bmQuCisgIGludCBHZXRWaXNpYmxlUGFnZUluZGV4KEZQREZfUEFHRSBwYWdlKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjdXJyZW50IHBhZ2UsIHJ1bm5pbmcgcGFnZSBvcGVuL2Nsb3NlCisgIC8vIHRyaWdnZXJzIGFzIG5lY2Vzc2FyeS4KKyAgdm9pZCBTZXRDdXJyZW50UGFnZShpbnQgaW5kZXgpOworCisgIC8vIFRyYW5zZm9ybSB8cGFnZXwgY29udGVudHMgdG8gZml0IGluIHRoZSBzZWxlY3RlZCBwcmludGVyIHBhcGVyIHNpemUuCisgIHZvaWQgVHJhbnNmb3JtUERGUGFnZUZvclByaW50aW5nKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQUF9QcmludFNldHRpbmdzX0RldiYgcHJpbnRfc2V0dGluZ3MpOworCisgIHZvaWQgRHJhd1BhZ2VTaGFkb3coY29uc3QgcHA6OlJlY3QmIHBhZ2VfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgc2hhZG93X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OlJlY3QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhKTsKKworICB2b2lkIEdldFJlZ2lvbihjb25zdCBwcDo6UG9pbnQmIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICBwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgICB2b2lkKiogcmVnaW9uLAorICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSkgY29uc3Q7CisKKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLgorICB2b2lkIE9uU2VsZWN0aW9uQ2hhbmdlZCgpOworCisgIC8vIEZQREZfRk9STUZJTExJTkZPIGNhbGxiYWNrcy4KKyAgc3RhdGljIHZvaWQgRm9ybV9JbnZhbGlkYXRlKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSk7CisgIHN0YXRpYyB2b2lkIEZvcm1fT3V0cHV0U2VsZWN0ZWRSZWN0KEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20pOworICBzdGF0aWMgdm9pZCBGb3JtX1NldEN1cnNvcihGUERGX0ZPUk1GSUxMSU5GTyogcGFyYW0sIGludCBjdXJzb3JfdHlwZSk7CisgIHN0YXRpYyBpbnQgRm9ybV9TZXRUaW1lcihGUERGX0ZPUk1GSUxMSU5GTyogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxhcHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayB0aW1lcl9mdW5jKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9LaWxsVGltZXIoRlBERl9GT1JNRklMTElORk8qIHBhcmFtLCBpbnQgdGltZXJfaWQpOworICBzdGF0aWMgRlBERl9TWVNURU1USU1FIEZvcm1fR2V0TG9jYWxUaW1lKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSk7CisgIHN0YXRpYyB2b2lkIEZvcm1fT25DaGFuZ2UoRlBERl9GT1JNRklMTElORk8qIHBhcmFtKTsKKyAgc3RhdGljIEZQREZfUEFHRSBGb3JtX0dldFBhZ2UoRlBERl9GT1JNRklMTElORk8qIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCk7CisgIHN0YXRpYyBGUERGX1BBR0UgRm9ybV9HZXRDdXJyZW50UGFnZShGUERGX0ZPUk1GSUxMSU5GTyogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKKyAgc3RhdGljIGludCBGb3JtX0dldFJvdGF0aW9uKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwgRlBERl9QQUdFIHBhZ2UpOworICBzdGF0aWMgdm9pZCBGb3JtX0V4ZWN1dGVOYW1lZEFjdGlvbihGUERGX0ZPUk1GSUxMSU5GTyogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lZF9hY3Rpb24pOworICBzdGF0aWMgdm9pZCBGb3JtX1NldFRleHRGaWVsZEZvY3VzKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCB2YWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgaXNfZm9jdXMpOworICBzdGF0aWMgdm9pZCBGb3JtX0RvVVJJQWN0aW9uKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwgRlBERl9CWVRFU1RSSU5HIHVyaSk7CisgIHN0YXRpYyB2b2lkIEZvcm1fRG9Hb1RvQWN0aW9uKEZQREZfRk9STUZJTExJTkZPKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB6b29tX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbl9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfb2ZfYXJyYXkpOworCisgIC8vIElQREZfSlNQTEFURk9STSBjYWxsYmFja3MuCisgIHN0YXRpYyBpbnQgRm9ybV9BbGVydChJUERGX0pTUExBVEZPUk0qIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpY29uKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9CZWVwKElQREZfSlNQTEFURk9STSogcGFyYW0sIGludCB0eXBlKTsKKyAgc3RhdGljIGludCBGb3JtX1Jlc3BvbnNlKElQREZfSlNQTEFURk9STSogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZGVmYXVsdF9yZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisgIHN0YXRpYyBpbnQgRm9ybV9HZXRGaWxlUGF0aChJUERGX0pTUExBVEZPUk0qIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisgIHN0YXRpYyB2b2lkIEZvcm1fTWFpbChJUERGX0pTUExBVEZPUk0qIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbWFpbF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCB1aSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9QcmludChJUERGX0pTUExBVEZPUk0qIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCB1aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgc2lsZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBzaHJpbmtfdG9fZml0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBwcmludF9hc19pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgcmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYW5ub3RhdGlvbnMpOworICBzdGF0aWMgdm9pZCBGb3JtX1N1Ym1pdEZvcm0oSVBERl9KU1BMQVRGT1JNKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZvcm1fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdXJsKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9Hb3RvUGFnZShJUERGX0pTUExBVEZPUk0qIHBhcmFtLCBpbnQgcGFnZV9udW1iZXIpOworICBzdGF0aWMgaW50IEZvcm1fQnJvd3NlKElQREZfSlNQTEFURk9STSogcGFyYW0sIHZvaWQqIGZpbGVfcGF0aCwgaW50IGxlbmd0aCk7CisjaWZkZWYgX1RFU1RfWEZBCisgIHN0YXRpYyB2b2lkIEZvcm1fRW1haWxUbyhGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLCAKKwkgIEZQREZfV0lERVNUUklORyB0bywgRlBERl9XSURFU1RSSU5HIHN1YmplY3QsIEZQREZfV0lERVNUUklORyBjYywgRlBERl9XSURFU1RSSU5HIGJjYywgRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBGb3JtX0Rpc3BsYXlDYXJldChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlLCBGUERGX0JPT0wgYlZpc2libGUsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pOworICAvL3N0YXRpYyBpbnQgRm9ybV9HZXRDdXJEb2N1bWVudEluZGV4KEZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CisgIC8vc3RhdGljIGludCBGb3JtX0dldERvY3VtZW50Q291bnQoRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9TZXRDdXJyZW50UGFnZShGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpQ3VyUGFnZSk7CisgIHN0YXRpYyBpbnQgRm9ybV9HZXRDdXJyZW50UGFnZUluZGV4KEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CisgIHN0YXRpYyB2b2lkIEZvcm1fR2V0UGFnZVZpZXdSZWN0KEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSogbGVmdCwgZG91YmxlKiB0b3AsIGRvdWJsZSogcmlnaHQsIGRvdWJsZSogYm90dG9tKTsKKyAgc3RhdGljIGludCBGb3JtX0dldFBsYXRmb3JtKEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgdm9pZCogcGxhdGZvcm0sIGludCBsZW5ndGgpOworICBzdGF0aWMgRlBERl9CT09MIEZvcm1fUG9wdXBNZW51KEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UsIEZQREZfV0lER0VUIGhXaWRnZXQsIGludCBtZW51RmxhZywgZmxvYXQgeCwgZmxvYXQgeSk7CisgIHN0YXRpYyBGUERGX0JPT0wgRm9ybV9Qb3N0UmVxdWVzdFVSTChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzQ29udGVudFR5cGUsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSwgRlBERl9XSURFU1RSSU5HIHdzSGVhZGVyLCBGUERGX0JTVFIqIHJlc3BvbmUpOworICBzdGF0aWMgRlBERl9CT09MIEZvcm1fUHV0UmVxdWVzdFVSTChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzRW5jb2RlKTsKKyAgLy9zdGF0aWMgRlBERl9CT09MIEZvcm1fU2hvd0ZpbGVEaWFsb2coRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NUaXRsZSwgRlBERl9XSURFU1RSSU5HIHdzRmlsdGVyLCBGUERGX0JPT0wgaXNPcGVuLCBGUERGX1NUUklOR0hBTkRMRSBwYXRoQXJyKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9VcGxvYWRUbyhGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLCBpbnQgZmlsZUZsYWcsIEZQREZfV0lERVNUUklORyB1cGxvYWRUbyk7CisgIHN0YXRpYyBGUERGX0xQRklMRUhBTkRMRVIgRm9ybV9Eb3dubG9hZEZyb21VUkwoRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgVVJMKTsKKyAgLy9zdGF0aWMgRlBERl9CT09MIE15Rm9ybV9HZXRGaWxlUGF0aChGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciwgdm9pZCogZmlsZVBhdGgsIGludCBsZW5ndGgpOworICBzdGF0aWMgRlBERl9GSUxFSEFORExFUiogRm9ybV9PcGVuRmlsZShGUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIGludCBmaWxlRmxhZywgRlBERl9XSURFU1RSSU5HIHdzVVJMLCBjb25zdCBjaGFyKiBtb2RlKTsKKyAgc3RhdGljIHZvaWQgRm9ybV9Hb3RvVVJMKEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHdzVVJMKTsKKyAgc3RhdGljIGludCBGb3JtX0dldExhbmd1YWdlKEZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgdm9pZCogbGFuZ3VhZ2UsIGludCBsZW5ndGgpOworI2VuZGlmIC8vIF9URVNUX1hGQQorICAvLyBJRlNES19QQVVTRSBjYWxsYmFja3MKKyAgc3RhdGljIEZQREZfQk9PTCBQYXVzZV9OZWVkVG9QYXVzZU5vdyhJRlNES19QQVVTRSogcGFyYW0pOworCisgIFBERkVuZ2luZTo6Q2xpZW50KiBjbGllbnRfOworICBwcDo6U2l6ZSBkb2N1bWVudF9zaXplXzsgIC8vIFNpemUgb2YgZG9jdW1lbnQgaW4gcGl4ZWxzLgorCisgIC8vIFRoZSBzY3JvbGwgcG9zaXRpb24gaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgorICBwcDo6UG9pbnQgcG9zaXRpb25fOworICAvLyBUaGUgb2Zmc2V0IG9mIHRoZSBwYWdlIGludG8gdGhlIHZpZXdwb3J0LgorICBwcDo6UG9pbnQgcGFnZV9vZmZzZXRfOworICAvLyBUaGUgcGx1Z2luIHNpemUgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgorICBwcDo6U2l6ZSBwbHVnaW5fc2l6ZV87CisgIGRvdWJsZSBjdXJyZW50X3pvb21fOworICB1bnNpZ25lZCBpbnQgY3VycmVudF9yb3RhdGlvbl87CisKKyAgRG9jdW1lbnRMb2FkZXIgZG9jX2xvYWRlcl87ICAvLyBNYWluIGRvY3VtZW50J3MgbG9hZGVyLgorICBzdGQ6OnN0cmluZyB1cmxfOworICBzdGQ6OnN0cmluZyBoZWFkZXJzXzsKKyAgcHA6OkNvbXBsZXRpb25DYWxsYmFja0ZhY3Rvcnk8UERGaXVtRW5naW5lPiBmaW5kX2ZhY3RvcnlfOworCisgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tGYWN0b3J5PFBERml1bUVuZ2luZT4gcGFzc3dvcmRfZmFjdG9yeV87CisgIGludDMyX3QgcGFzc3dvcmRfdHJpZXNfcmVtYWluaW5nXzsKKworICAvLyBUaGUgY3VycmVudCB0ZXh0IHVzZWQgZm9yIHNlYXJjaGluZy4KKyAgc3RkOjpzdHJpbmcgY3VycmVudF9maW5kX3RleHRfOworCisgIC8vIFRoZSBQREZpdW0gd3JhcHBlciBvYmplY3QgZm9yIHRoZSBkb2N1bWVudC4KKyAgRlBERl9ET0NVTUVOVCBkb2NfOworCisgIC8vIFRoZSBQREZpdW0gd3JhcHBlciBmb3IgZm9ybSBkYXRhLiAgVXNlZCBldmVuIGlmIHRoZXJlIGFyZSBubyBmb3JtIGNvbnRyb2xzCisgIC8vIG9uIHRoZSBwYWdlLgorICBGUERGX0ZPUk1IQU5ETEUgZm9ybV87CisKKyAgLy8gVGhlIHBhZ2Uocykgb2YgdGhlIGRvY3VtZW50LiBTdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycyBzbyB0aGF0IHdoZW4gdGhlCisgIC8vIHZlY3RvciBpcyByZXNpemVkIHdlIGRvbid0IGNsb3NlIHRoZSBwYWdlcyB0aGF0IGFyZSB1c2VkIGluIHBlbmRpbmcKKyAgLy8gcGFpbnRzLgorICBzdGQ6OnZlY3RvcjxQREZpdW1QYWdlKj4gcGFnZXNfOworCisgIC8vIFRoZSBpbmRleGVzIG9mIHRoZSBwYWdlcyBjdXJyZW50bHkgdmlzaWJsZS4KKyAgc3RkOjp2ZWN0b3I8aW50PiB2aXNpYmxlX3BhZ2VzXzsKKworICAvLyBUaGUgaW5kZXhlcyBvZiB0aGUgcGFnZXMgcGVuZGluZyBkb3dubG9hZC4KKyAgc3RkOjp2ZWN0b3I8aW50PiBwZW5kaW5nX3BhZ2VzXzsKKworICAvLyBEdXJpbmcgaGFuZGxpbmcgb2YgaW5wdXQgZXZlbnRzIHdlIGRvbid0IHdhbnQgdG8gdW5sb2FkIGFueSBwYWdlcyBpbgorICAvLyBjYWxsYmFja3MgdG8gdXMgZnJvbSBQREZpdW0sIHNpbmNlIHRoZSBjdXJyZW50IHBhZ2UgY2FuIGNoYW5nZSB3aGlsZSBQREZpdW0KKyAgLy8gY29kZSBzdGlsbCBoYXMgYSBwb2ludGVyIHRvIGl0LgorICBib29sIGRlZmVyX3BhZ2VfdW5sb2FkXzsKKyAgc3RkOjp2ZWN0b3I8aW50PiBkZWZlcnJlZF9wYWdlX3VubG9hZHNfOworCisgIC8vIFVzZWQgZm9yIHNlbGVjdGlvbi4gIFRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgcmFuZ2UgaWYgc2VsZWN0aW9uIHNwYW5zCisgIC8vIG1vcmUgdGhhbiBvbmUgcGFnZS4KKyAgc3RkOjp2ZWN0b3I8UERGaXVtUmFuZ2U+IHNlbGVjdGlvbl87CisgIC8vIFRydWUgaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBzZWxlY3Rpb24uCisgIGJvb2wgc2VsZWN0aW5nXzsKKworICBNb3VzZURvd25TdGF0ZSBtb3VzZV9kb3duX3N0YXRlXzsKKworICAvLyBVc2VkIGZvciBzZWFyY2hpbmcuCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UERGaXVtUmFuZ2U+IEZpbmRSZXN1bHRzOworICBGaW5kUmVzdWx0cyBmaW5kX3Jlc3VsdHNfOworICAvLyBXaGljaCBwYWdlIHRvIHNlYXJjaCBuZXh0LgorICBpbnQgbmV4dF9wYWdlX3RvX3NlYXJjaF87CisgIC8vIFdoZXJlIHRvIHN0b3Agc2VhcmNoaW5nLgorICBpbnQgbGFzdF9wYWdlX3RvX3NlYXJjaF87CisgIGludCBsYXN0X2NoYXJhY3Rlcl9pbmRleF90b19zZWFyY2hfOyAgLy8gLTEgaWYgc2VhcmNoIHVudGlsIGVuZCBvZiBwYWdlLgorICAvLyBXaGljaCByZXN1bHQgdGhlIHVzZXIgaGFzIGN1cnJlbnRseSBzZWxlY3RlZC4KKyAgaW50IGN1cnJlbnRfZmluZF9pbmRleF87CisgIC8vIFdoZXJlIHRvIHJlc3VtZSBzZWFyY2hpbmcuCisgIGludCByZXN1bWVfZmluZF9pbmRleF87CisKKyAgLy8gUGVybWlzc2lvbnMgYml0ZmllbGQuCisgIHVuc2lnbmVkIGxvbmcgcGVybWlzc2lvbnNfOworCisgIC8vIEludGVyZmFjZSBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gZG9jdW1lbnQgc3RyZWFtLgorICBGUERGX0ZJTEVBQ0NFU1MgZmlsZV9hY2Nlc3NfOworICAvLyBJbnRlcmZhY2Ugc3RydWN0dXJlIHRvIGNoZWNrIGRhdGEgYXZhaWxhYmlsaXR5IGluIHRoZSBkb2N1bWVudCBzdHJlYW0uCisgIEZpbGVBdmFpbCBmaWxlX2F2YWlsYWJpbGl0eV87CisgIC8vIEludGVyZmFjZSBzdHJ1Y3R1cmUgdG8gcmVxdWVzdCBkYXRhIGNodW5rcyBmcm9tIHRoZSBkb2N1bWVudCBzdHJlYW0uCisgIERvd25sb2FkSGludHMgZG93bmxvYWRfaGludHNfOworICAvLyBQb2ludGVyIHRvIHRoZSBkb2N1bWVudCBhdmFpbGFiaWxpdHkgaW50ZXJmYWNlLgorICBGUERGX0FWQUlMIGZwZGZfYXZhaWxhYmlsaXR5XzsKKworICBwcDo6U2l6ZSBkZWZhdWx0X3BhZ2Vfc2l6ZV87CisKKyAgLy8gVXNlZCB0byBtYW5hZ2UgdGltZXJzIHRoYXQgZm9ybSBmaWxsIEFQSSBuZWVkcy4gIFRoZSBwYWlyIGhvbGRzIHRoZSB0aW1lcgorICAvLyBwZXJpb2QsIGluIG1zLCBhbmQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorICBzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxpbnQsIFRpbWVyQ2FsbGJhY2s+ID4gdGltZXJzXzsKKyAgaW50IG5leHRfdGltZXJfaWRfOworCisgIC8vIEhvbGRzIHRoZSBwYWdlIGluZGV4IG9mIHRoZSBsYXN0IHBhZ2UgdGhhdCB0aGUgbW91c2UgY2xpY2tlZCBvbi4KKyAgaW50IGxhc3RfcGFnZV9tb3VzZV9kb3duXzsKKworICAvLyBIb2xkcyB0aGUgcGFnZSBpbmRleCBvZiB0aGUgZmlyc3QgdmlzaWJsZSBwYWdlOyByZWZyZXNoZWQgYnkgY2FsbGluZworICAvLyBDYWxjdWxhdGVWaXNpYmxlUGFnZXMoKQorICBpbnQgZmlyc3RfdmlzaWJsZV9wYWdlXzsKKworICAvLyBIb2xkcyB0aGUgcGFnZSBpbmRleCBvZiB0aGUgbW9zdCB2aXNpYmxlIHBhZ2U7IHJlZnJlc2hlZCBieSBjYWxsaW5nCisgIC8vIENhbGN1bGF0ZVZpc2libGVQYWdlcygpCisgIGludCBtb3N0X3Zpc2libGVfcGFnZV87CisKKyAgLy8gU2V0IHRvIHRydWUgYWZ0ZXIgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24vRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbiBoYXZlCisgIC8vIGJlZW4gY2FsbGVkLiBPbmx5IGFmdGVyIHRoYXQgY2FuIHdlIGNhbGwgRk9STV9Eb1BhZ2VBQWN0aW9uLgorICBib29sIGNhbGxlZF9kb19kb2N1bWVudF9hY3Rpb25fOworCisgIC8vIFJlY29yZHMgcGFydHMgb2YgZm9ybSBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGhpZ2hsaWdodGVkIGF0IG5leHQgcGFpbnQsIGluCisgIC8vIHNjcmVlbiBjb29yZGluYXRlcy4KKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IGZvcm1faGlnaGxpZ2h0c187CisKKyAgLy8gV2hldGhlciB0byByZW5kZXIgaW4gZ3JheXNjYWxlIG9yIGluIGNvbG9yLgorICBib29sIHJlbmRlcl9ncmF5c2NhbGVfOworCisgIC8vIFRoZSBsaW5rIGN1cnJlbnRseSB1bmRlciB0aGUgY3Vyc29yLgorICBzdGQ6OnN0cmluZyBsaW5rX3VuZGVyX2N1cnNvcl87CisKKyAgLy8gUGVuZGluZyBwcm9ncmVzc2l2ZSBwYWludHMuCisgIHN0cnVjdCBQcm9ncmVzc2l2ZVBhaW50IHsKKyAgICBwcDo6UmVjdCByZWN0OyAgLy8gSW4gc2NyZWVuIGNvb3JkaW5hdGVzLgorICAgIEZQREZfQklUTUFQIGJpdG1hcDsKKyAgICBpbnQgcGFnZV9pbmRleDsKKyAgICAvLyBUZW1wb3JhcnkgdXNlZCB0byBmaWd1cmUgb3V0IGlmIGluIGEgc2VyaWVzIG9mIFBhaW50KCkgY2FsbHMgd2hldGhlciB0aGlzCisgICAgLy8gcGVuZGluZyBwYWludCB3YXMgdXBkYXRlZCBvciBub3QuCisgICAgaW50IHBhaW50ZWRfOworICB9OworICBzdGQ6OnZlY3RvcjxQcm9ncmVzc2l2ZVBhaW50PiBwcm9ncmVzc2l2ZV9wYWludHNfOworCisgIC8vIEtlZXBzIHRyYWNrIG9mIHdoZW4gd2Ugc3RhcnRlZCB0aGUgbGFzdCBwcm9ncmVzc2l2ZSBwYWludCwgc28gdGhhdCBpbiBvdXIKKyAgLy8gY2FsbGJhY2sgd2UgY2FuIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHBhdXNlLgorICBiYXNlOjpUaW1lIGxhc3RfcHJvZ3Jlc3NpdmVfc3RhcnRfdGltZV87CisKKyAgLy8gVGhlIHRpbWVvdXQgdG8gdXNlIGZvciB0aGUgY3VycmVudCBwcm9ncmVzc2l2ZSBwYWludC4KKyAgaW50IHByb2dyZXNzaXZlX3BhaW50X3RpbWVvdXRfOworCisgIC8vIFNoYWRvdyBtYXRyaXggZm9yIGdlbmVyYXRpbmcgdGhlIHBhZ2Ugc2hhZG93IGJpdG1hcC4KKyAgc2NvcGVkX3B0cjxTaGFkb3dNYXRyaXg+IHBhZ2Vfc2hhZG93XzsKKworICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGUgdXNlciBpcyBiZWluZyBwcm9tcHRlZCBmb3IgdGhlaXIgcGFzc3dvcmQuIFdpbGwgYmUgc2V0CisgIC8vIHRvIGZhbHNlIGFmdGVyIHRoZSB1c2VyIGZpbmlzaGVzIGdldHRpbmcgdGhlaXIgcGFzc3dvcmQuCisgIGJvb2wgZ2V0dGluZ19wYXNzd29yZF87Cit9OworCisvLyBDcmVhdGUgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGlzIHdoZW4gY2FsbGluZyBQREZpdW0gZnVuY3Rpb25zIHdoaWNoIGNhbiBjYWxsCisvLyBvdXIgZ2xvYmFsIGNhbGxiYWNrIHdoZW4gYW4gdW5zdXBwb3J0ZWQgZmVhdHVyZSBpcyByZWFjaGVkLgorY2xhc3MgU2NvcGVkVW5zdXBwb3J0ZWRGZWF0dXJlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNjb3BlZFVuc3VwcG9ydGVkRmVhdHVyZShQREZpdW1FbmdpbmUqIGVuZ2luZSk7CisgIH5TY29wZWRVbnN1cHBvcnRlZEZlYXR1cmUoKTsKKyBwcml2YXRlOgorICBQREZpdW1FbmdpbmUqIGVuZ2luZV87CisgIFBERml1bUVuZ2luZSogb2xkX2VuZ2luZV87Cit9OworCitjbGFzcyBQREZpdW1FbmdpbmVFeHBvcnRzIDogcHVibGljIFBERkVuZ2luZUV4cG9ydHMgeworIHB1YmxpYzoKKyAgUERGaXVtRW5naW5lRXhwb3J0cygpIHt9CisjaWYgZGVmaW5lZChPU19XSU4pCisgIC8vIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBSZW5kZXJQREZQYWdlVG9EQyBpbiBwZGYuY2MgZm9yIGRldGFpbHMuCisgIHZpcnR1YWwgYm9vbCBSZW5kZXJQREZQYWdlVG9EQyhjb25zdCB2b2lkKiBwZGZfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyaW5nU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDIGRjKTsKKyNlbmRpZiAgLy8gT1NfV0lOCisgIHZpcnR1YWwgYm9vbCBSZW5kZXJQREZQYWdlVG9CaXRtYXAoY29uc3Qgdm9pZCogcGRmX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGRmX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJpbmdTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYml0bWFwX2J1ZmZlcik7CisKKyAgdmlydHVhbCBib29sIEdldFBERkRvY0luZm8oY29uc3Qgdm9pZCogcGRmX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhZ2VfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWF4X3BhZ2Vfd2lkdGgpOworCisgIC8vIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBHZXRQREZQYWdlU2l6ZUJ5SW5kZXggaW4gcGRmLmNjIGZvciBkZXRhaWxzLgorICB2aXJ0dWFsIGJvb2wgR2V0UERGUGFnZVNpemVCeUluZGV4KGNvbnN0IHZvaWQqIHBkZl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBkZl9idWZmZXJfc2l6ZSwgaW50IHBhZ2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd2lkdGgsIGRvdWJsZSogaGVpZ2h0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKKyNlbmRpZiAgLy8gUERGX1BERklVTV9QREZJVU1fRU5HSU5FX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfcmVhZC5jYyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV9yZWFkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzcxYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfcmVhZC5jYwpAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicGRmL3BkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3JlYWQuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK1BERml1bU1lbUJ1ZmZlckZpbGVSZWFkOjpQREZpdW1NZW1CdWZmZXJGaWxlUmVhZChjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIG1fRmlsZUxlbiA9IHNpemU7CisgIG1fUGFyYW0gPSB0aGlzOworICBtX0dldEJsb2NrID0gJkdldEJsb2NrOworICBkYXRhXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEpOworfQorCitQREZpdW1NZW1CdWZmZXJGaWxlUmVhZDo6flBERml1bU1lbUJ1ZmZlckZpbGVSZWFkKCkgeworfQorCitpbnQgUERGaXVtTWVtQnVmZmVyRmlsZVJlYWQ6OkdldEJsb2NrKHZvaWQqIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkgeworICBjb25zdCBQREZpdW1NZW1CdWZmZXJGaWxlUmVhZCogZGF0YSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFBERml1bU1lbUJ1ZmZlckZpbGVSZWFkKj4ocGFyYW0pOworICBpZiAoIWRhdGEgfHwgcG9zaXRpb24gKyBzaXplID4gZGF0YS0+bV9GaWxlTGVuKQorICAgIHJldHVybiAwOworICBtZW1jcHkoYnVmLCBkYXRhLT5kYXRhXyArIHBvc2l0aW9uLCBzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfcmVhZC5oIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3JlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGVjNDEwCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3JlYWQuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBERl9QREZJVU1fUERGSVVNX01FTV9CVUZGRVJfRklMRV9SRUFEX0hfCisjZGVmaW5lIFBERl9QREZJVU1fUERGSVVNX01FTV9CVUZGRVJfRklMRV9SRUFEX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvZnBkZnZpZXcuaCIKKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBGUERGX0ZJTEVBQ0NFU1MgZnJvbSBhIG1lbW9yeSBidWZmZXIuCitjbGFzcyBQREZpdW1NZW1CdWZmZXJGaWxlUmVhZCA6IHB1YmxpYyBGUERGX0ZJTEVBQ0NFU1MgeworIHB1YmxpYzoKKyAgUERGaXVtTWVtQnVmZmVyRmlsZVJlYWQoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworICB+UERGaXVtTWVtQnVmZmVyRmlsZVJlYWQoKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgR2V0QmxvY2sodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9QREZJVU1fUERGSVVNX01FTV9CVUZGRVJfRklMRV9SRUFEX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfd3JpdGUuY2MgYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9tZW1fYnVmZmVyX2ZpbGVfd3JpdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlNTY0YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV93cml0ZS5jYwpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicGRmL3BkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3dyaXRlLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworUERGaXVtTWVtQnVmZmVyRmlsZVdyaXRlOjpQREZpdW1NZW1CdWZmZXJGaWxlV3JpdGUoKSB7CisgIHZlcnNpb24gPSAxOworICBXcml0ZUJsb2NrID0gJldyaXRlQmxvY2tJbXBsOworfQorCitQREZpdW1NZW1CdWZmZXJGaWxlV3JpdGU6On5QREZpdW1NZW1CdWZmZXJGaWxlV3JpdGUoKSB7Cit9CisKK2ludCBQREZpdW1NZW1CdWZmZXJGaWxlV3JpdGU6OldyaXRlQmxvY2tJbXBsKEZQREZfRklMRVdSSVRFKiB0aGlzX2ZpbGVfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSB7CisgIFBERml1bU1lbUJ1ZmZlckZpbGVXcml0ZSogbWVtX2J1ZmZlcl9maWxlX3dyaXRlID0KKyAgICAgIHN0YXRpY19jYXN0PFBERml1bU1lbUJ1ZmZlckZpbGVXcml0ZSo+KHRoaXNfZmlsZV93cml0ZSk7CisgIHJldHVybiBtZW1fYnVmZmVyX2ZpbGVfd3JpdGUtPkRvV3JpdGVCbG9jayhkYXRhLCBzaXplKTsKK30KKworaW50IFBERml1bU1lbUJ1ZmZlckZpbGVXcml0ZTo6RG9Xcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSB7CisgIGJ1ZmZlcl8uYXBwZW5kKHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhKSwgc2l6ZSk7CisgIHJldHVybiAxOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV93cml0ZS5oIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fbWVtX2J1ZmZlcl9maWxlX3dyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NWM4MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX21lbV9idWZmZXJfZmlsZV93cml0ZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BERklVTV9QREZJVU1fTUVNX0JVRkZFUl9GSUxFX1dSSVRFXworI2RlZmluZSBQREZfUERGSVVNX1BERklVTV9NRU1fQlVGRkVSX0ZJTEVfV1JJVEVfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9wZGZpdW0vZnBkZnNkay9pbmNsdWRlL2ZwZGZzYXZlLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgRlBERl9GSUxFV1JJVEUgaW50byBhIG1lbW9yeSBidWZmZXIuCitjbGFzcyBQREZpdW1NZW1CdWZmZXJGaWxlV3JpdGUgOiBwdWJsaWMgRlBERl9GSUxFV1JJVEUgeworIHB1YmxpYzoKKyAgUERGaXVtTWVtQnVmZmVyRmlsZVdyaXRlKCk7CisgIH5QREZpdW1NZW1CdWZmZXJGaWxlV3JpdGUoKTsKKworICBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPiYgYnVmZmVyKCkgeyByZXR1cm4gYnVmZmVyXzsgfQorICBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIGJ1ZmZlcl8uc2l6ZSgpOyB9CisKKyBwcml2YXRlOgorICBpbnQgRG9Xcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisgIHN0YXRpYyBpbnQgV3JpdGVCbG9ja0ltcGwoRlBERl9GSUxFV1JJVEUqIHRoaXNfZmlsZV93cml0ZSwgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOworCisgIHN0ZDo6YmFzaWNfc3RyaW5nPHVuc2lnbmVkIGNoYXI+IGJ1ZmZlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9QREZJVU1fUERGSVVNX01FTV9CVUZGRVJfRklMRV9XUklURV8KKwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fcGFnZS5jYyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX3BhZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNWRjZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX3BhZ2UuY2MKQEAgLTAsMCArMSw0NzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwZGYvcGRmaXVtL3BkZml1bV9wYWdlLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5ncy91dGZfc3RyaW5nX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAiYmFzZS92YWx1ZXMuaCIKKyNpbmNsdWRlICJwZGYvcGRmaXVtL3BkZml1bV9lbmdpbmUuaCIKKworLy8gVXNlZCB3aGVuIGRvaW5nIGhpdCBkZXRlY3Rpb24uCisjZGVmaW5lIGtUb2xlcmFuY2UgMjAuMAorCisvLyBEaWN0aW9uYXJ5IFZhbHVlIGtleSBuYW1lcyBmb3IgcmV0dXJuaW5nIHRoZSBhY2Nlc3NpYmxlIHBhZ2UgY29udGVudCBhcyBKU09OLgorY29uc3QgY2hhciBrUGFnZVdpZHRoW10gPSAid2lkdGgiOworY29uc3QgY2hhciBrUGFnZUhlaWdodFtdID0gImhlaWdodCI7Citjb25zdCBjaGFyIGtQYWdlVGV4dEJveFtdID0gInRleHRCb3giOworY29uc3QgY2hhciBrVGV4dEJveExlZnRbXSA9ICJsZWZ0IjsKK2NvbnN0IGNoYXIga1RleHRCb3hUb3BbXSAgPSAidG9wIjsKK2NvbnN0IGNoYXIga1RleHRCb3hXaWR0aFtdID0gIndpZHRoIjsKK2NvbnN0IGNoYXIga1RleHRCb3hIZWlnaHRbXSAgPSAiaGVpZ2h0IjsKK2NvbnN0IGNoYXIga1RleHRCb3hGb250U2l6ZVtdID0gImZvbnRTaXplIjsKK2NvbnN0IGNoYXIga1RleHRCb3hOb2Rlc1tdID0gInRleHROb2RlcyI7Citjb25zdCBjaGFyIGtUZXh0Tm9kZVR5cGVbXSA9ICJ0eXBlIjsKK2NvbnN0IGNoYXIga1RleHROb2RlVGV4dFtdID0gInRleHQiOworY29uc3QgY2hhciBrVGV4dE5vZGVVUkxbXSA9ICJ1cmwiOworY29uc3QgY2hhciBrVGV4dE5vZGVUeXBlVGV4dFtdID0gInRleHQiOworY29uc3QgY2hhciBrVGV4dE5vZGVUeXBlVVJMW10gPSAidXJsIjsKK2NvbnN0IGNoYXIga0RvY0xpbmtVUkxQcmVmaXhbXSA9ICIjcGFnZSI7CisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworUERGaXVtUGFnZTo6UERGaXVtUGFnZShQREZpdW1FbmdpbmUqIGVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpSZWN0JiByLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGF2YWlsYWJsZSkKKyAgICA6IGVuZ2luZV8oZW5naW5lKSwKKyAgICAgIHBhZ2VfKE5VTEwpLAorICAgICAgdGV4dF9wYWdlXyhOVUxMKSwKKyAgICAgIGluZGV4XyhpKSwKKyAgICAgIHJlY3RfKHIpLAorICAgICAgY2FsY3VsYXRlZF9saW5rc18oZmFsc2UpLAorICAgICAgYXZhaWxhYmxlXyhhdmFpbGFibGUpIHsKK30KKworUERGaXVtUGFnZTo6flBERml1bVBhZ2UoKSB7Cit9CisKK3ZvaWQgUERGaXVtUGFnZTo6VW5sb2FkKCkgeworICBpZiAodGV4dF9wYWdlXykgeworICAgIEZQREZUZXh0X0Nsb3NlUGFnZSh0ZXh0X3BhZ2VfKTsKKyAgICB0ZXh0X3BhZ2VfID0gTlVMTDsKKyAgfQorCisgIGlmIChwYWdlXykgeworICAgIGlmIChlbmdpbmVfLT5mb3JtKCkpIHsKKyAgICAgIEZPUk1fT25CZWZvcmVDbG9zZVBhZ2UocGFnZV8sIGVuZ2luZV8tPmZvcm0oKSk7CisgICAgfQorICAgIEZQREZfQ2xvc2VQYWdlKHBhZ2VfKTsKKyAgICBwYWdlXyA9IE5VTEw7CisgIH0KK30KKworRlBERl9QQUdFIFBERml1bVBhZ2U6OkdldFBhZ2UoKSB7CisgIFNjb3BlZFVuc3VwcG9ydGVkRmVhdHVyZSBzY29wZWRfdW5zdXBwb3J0ZWRfZmVhdHVyZShlbmdpbmVfKTsKKyAgaWYgKCFhdmFpbGFibGVfKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIXBhZ2VfKSB7CisgICAgcGFnZV8gPSBGUERGX0xvYWRQYWdlKGVuZ2luZV8tPmRvYygpLCBpbmRleF8pOworICAgIGlmIChwYWdlXyAmJiBlbmdpbmVfLT5mb3JtKCkpIHsKKyAgICAgIEZPUk1fT25BZnRlckxvYWRQYWdlKHBhZ2VfLCBlbmdpbmVfLT5mb3JtKCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcGFnZV87Cit9CisKK0ZQREZfUEFHRSBQREZpdW1QYWdlOjpHZXRQcmludFBhZ2UoKSB7CisgIFNjb3BlZFVuc3VwcG9ydGVkRmVhdHVyZSBzY29wZWRfdW5zdXBwb3J0ZWRfZmVhdHVyZShlbmdpbmVfKTsKKyAgaWYgKCFhdmFpbGFibGVfKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIXBhZ2VfKQorICAgIHBhZ2VfID0gRlBERl9Mb2FkUGFnZShlbmdpbmVfLT5kb2MoKSwgaW5kZXhfKTsKKyAgcmV0dXJuIHBhZ2VfOworfQorCit2b2lkIFBERml1bVBhZ2U6OkNsb3NlUHJpbnRQYWdlKCkgeworICBpZiAocGFnZV8pIHsKKyAgICBGUERGX0Nsb3NlUGFnZShwYWdlXyk7CisgICAgcGFnZV8gPSBOVUxMOworICB9Cit9CisKK0ZQREZfVEVYVFBBR0UgUERGaXVtUGFnZTo6R2V0VGV4dFBhZ2UoKSB7CisgIGlmICghYXZhaWxhYmxlXykKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCF0ZXh0X3BhZ2VfKQorICAgIHRleHRfcGFnZV8gPSBGUERGVGV4dF9Mb2FkUGFnZShHZXRQYWdlKCkpOworICByZXR1cm4gdGV4dF9wYWdlXzsKK30KKworYmFzZTo6VmFsdWUqIFBERml1bVBhZ2U6OkdldEFjY2Vzc2libGVDb250ZW50QXNWYWx1ZShpbnQgcm90YXRpb24pIHsKKyAgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBub2RlID0gbmV3IGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSgpOworCisgIGlmICghYXZhaWxhYmxlXykKKyAgICByZXR1cm4gbm9kZTsKKworICBkb3VibGUgd2lkdGggPSBGUERGX0dldFBhZ2VXaWR0aChHZXRQYWdlKCkpOworICBkb3VibGUgaGVpZ2h0ID0gRlBERl9HZXRQYWdlSGVpZ2h0KEdldFBhZ2UoKSk7CisKKyAgYmFzZTo6TGlzdFZhbHVlKiB0ZXh0ID0gbmV3IGJhc2U6Okxpc3RWYWx1ZSgpOworICBpbnQgYm94X2NvdW50ID0gRlBERlRleHRfQ291bnRSZWN0cyhHZXRUZXh0UGFnZSgpLCAwLCBHZXRDaGFyQ291bnQoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYm94X2NvdW50OyBpKyspIHsKKyAgICBkb3VibGUgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgIEZQREZUZXh0X0dldFJlY3QoR2V0VGV4dFBhZ2UoKSwgaSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgdGV4dC0+QXBwZW5kKAorICAgICAgICBHZXRUZXh0Qm94QXNWYWx1ZShoZWlnaHQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcm90YXRpb24pKTsKKyAgfQorCisgIG5vZGUtPlNldERvdWJsZShrUGFnZVdpZHRoLCB3aWR0aCk7CisgIG5vZGUtPlNldERvdWJsZShrUGFnZUhlaWdodCwgaGVpZ2h0KTsKKyAgbm9kZS0+U2V0KGtQYWdlVGV4dEJveCwgdGV4dCk7ICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfHRleHR8CisKKyAgcmV0dXJuIG5vZGU7Cit9CisKK2Jhc2U6OlZhbHVlKiBQREZpdW1QYWdlOjpHZXRUZXh0Qm94QXNWYWx1ZShkb3VibGUgcGFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGlvbikgeworICBiYXNlOjpzdHJpbmcxNiB0ZXh0X3V0ZjE2OworICBpbnQgY2hhcl9jb3VudCA9CisgICAgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoR2V0VGV4dFBhZ2UoKSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBOVUxMLCAwKTsKKyAgaWYgKGNoYXJfY291bnQgPiAwKSB7CisgICAgdW5zaWduZWQgc2hvcnQqIGRhdGEgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oCisgICAgICAgIFdyaXRlSW50bygmdGV4dF91dGYxNiwgY2hhcl9jb3VudCArIDEpKTsKKyAgICBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dChHZXRUZXh0UGFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBjaGFyX2NvdW50KTsKKyAgfQorICBzdGQ6OnN0cmluZyB0ZXh0X3V0ZjggPSBiYXNlOjpVVEYxNlRvVVRGOCh0ZXh0X3V0ZjE2KTsKKworICBGUERGX0xJTksgbGluayA9IEZQREZMaW5rX0dldExpbmtBdFBvaW50KEdldFBhZ2UoKSwgbGVmdCwgdG9wKTsKKyAgQXJlYSBhcmVhOworICBzdGQ6OnZlY3RvcjxMaW5rVGFyZ2V0PiB0YXJnZXRzOworICBpZiAobGluaykgeworICAgIHRhcmdldHMucHVzaF9iYWNrKExpbmtUYXJnZXQoKSk7CisgICAgYXJlYSA9IEdldExpbmtUYXJnZXQobGluaywgJnRhcmdldHNbMF0pOworICB9IGVsc2UgeworICAgIHBwOjpSZWN0IHJlY3QoCisgICAgICAgIFBhZ2VUb1NjcmVlbihwcDo6UG9pbnQoKSwgMS4wLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHJvdGF0aW9uKSk7CisgICAgR2V0TGlua3MocmVjdCwgJnRhcmdldHMpOworICAgIGFyZWEgPSB0YXJnZXRzLnNpemUoKSA9PSAwID8gVEVYVF9BUkVBIDogV0VCTElOS19BUkVBOworICB9CisKKyAgaW50IGNoYXJfaW5kZXggPSBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyhHZXRUZXh0UGFnZSgpLCBsZWZ0LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RvbGVyYW5jZSwga1RvbGVyYW5jZSk7CisgIGRvdWJsZSBmb250X3NpemUgPSBGUERGVGV4dF9HZXRGb250U2l6ZShHZXRUZXh0UGFnZSgpLCBjaGFyX2luZGV4KTsKKworICBiYXNlOjpEaWN0aW9uYXJ5VmFsdWUqIG5vZGUgPSBuZXcgYmFzZTo6RGljdGlvbmFyeVZhbHVlKCk7CisgIG5vZGUtPlNldERvdWJsZShrVGV4dEJveExlZnQsIGxlZnQpOworICBub2RlLT5TZXREb3VibGUoa1RleHRCb3hUb3AsIHBhZ2VfaGVpZ2h0IC0gdG9wKTsKKyAgbm9kZS0+U2V0RG91YmxlKGtUZXh0Qm94V2lkdGgsIHJpZ2h0IC0gbGVmdCk7CisgIG5vZGUtPlNldERvdWJsZShrVGV4dEJveEhlaWdodCwgdG9wIC0gYm90dG9tKTsKKyAgbm9kZS0+U2V0RG91YmxlKGtUZXh0Qm94Rm9udFNpemUsIGZvbnRfc2l6ZSk7CisKKyAgYmFzZTo6TGlzdFZhbHVlKiB0ZXh0X25vZGVzID0gbmV3IGJhc2U6Okxpc3RWYWx1ZSgpOworCisgIGlmIChhcmVhID09IERPQ0xJTktfQVJFQSkgeworICAgIHN0ZDo6c3RyaW5nIHVybCA9IGtEb2NMaW5rVVJMUHJlZml4ICsgYmFzZTo6SW50VG9TdHJpbmcodGFyZ2V0c1swXS5wYWdlKTsKKyAgICB0ZXh0X25vZGVzLT5BcHBlbmQoQ3JlYXRlVVJMTm9kZSh0ZXh0X3V0ZjgsIHVybCkpOworICB9IGVsc2UgaWYgKGFyZWEgPT0gV0VCTElOS19BUkVBICYmIGxpbmspIHsKKyAgICB0ZXh0X25vZGVzLT5BcHBlbmQoQ3JlYXRlVVJMTm9kZSh0ZXh0X3V0ZjgsIHRhcmdldHNbMF0udXJsKSk7CisgIH0gZWxzZSBpZiAoYXJlYSA9PSBXRUJMSU5LX0FSRUEgJiYgIWxpbmspIHsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0cy5zaXplKCk7ICsraSkgeworICAgICAgLy8gUmVtb3ZlIHRoZSBleHRyYSBOVUxMIGNoYXJhY3RlciBhdCBlbmQuCisgICAgICAvLyBPdGhlcndpc2UsIGZpbmQoKSB3aWxsIG5vdCByZXR1cm4gYW55IG1hdGNoZXMuCisgICAgICBpZiAodGFyZ2V0c1tpXS51cmwuc2l6ZSgpID4gMCAmJgorICAgICAgICAgIHRhcmdldHNbaV0udXJsW3RhcmdldHNbaV0udXJsLnNpemUoKSAtIDFdID09ICdcMCcpIHsKKyAgICAgICAgdGFyZ2V0c1tpXS51cmwucmVzaXplKHRhcmdldHNbaV0udXJsLnNpemUoKSAtIDEpOworICAgICAgfQorICAgICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgTlVMTCBjaGFyYWN0ZXIKKyAgICAgIERDSEVDSyh0YXJnZXRzW2ldLnVybFt0YXJnZXRzW2ldLnVybC5zaXplKCkgLSAxXSAhPSAnXDAnKTsKKworICAgICAgLy8gUERGaXVtIG1heSBjaGFuZ2UgdGhlIGNhc2Ugb2YgZ2VuZXJhdGVkIGxpbmtzLgorICAgICAgc3RkOjpzdHJpbmcgbG93ZXJDYXNlVVJMID0gYmFzZTo6U3RyaW5nVG9Mb3dlckFTQ0lJKHRhcmdldHNbaV0udXJsKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGxvd2VyQ2FzZVRleHQgPSBiYXNlOjpTdHJpbmdUb0xvd2VyQVNDSUkodGV4dF91dGY4KTsKKyAgICAgIHNpemVfdCBwb3MgPSBsb3dlckNhc2VUZXh0LmZpbmQobG93ZXJDYXNlVVJMLCBzdGFydCk7CisgICAgICBzaXplX3QgbGVuZ3RoID0gdGFyZ2V0c1tpXS51cmwuc2l6ZSgpOworICAgICAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgbGluayBpcyBhICJtYWlsdG86IiBVUkwKKyAgICAgICAgaWYgKGxvd2VyQ2FzZVVSTC5jb21wYXJlKDAsIDcsICJtYWlsdG86IikgPT0gMCkgeworICAgICAgICAgIHBvcyA9IGxvd2VyQ2FzZVRleHQuZmluZChsb3dlckNhc2VVUkwuc3Vic3RyKDcpLCBzdGFydCk7CisgICAgICAgICAgbGVuZ3RoIC09IDc7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgLy8gTm8gbWF0Y2ggaGFzIGJlZW4gZm91bmQuICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RkOjpzdHJpbmcgYmVmb3JlX3RleHQgPSB0ZXh0X3V0Zjguc3Vic3RyKHN0YXJ0LCBwb3MgLSBzdGFydCk7CisgICAgICBpZiAoYmVmb3JlX3RleHQuc2l6ZSgpID4gMCkKKyAgICAgICAgdGV4dF9ub2Rlcy0+QXBwZW5kKENyZWF0ZVRleHROb2RlKGJlZm9yZV90ZXh0KSk7CisgICAgICBzdGQ6OnN0cmluZyBsaW5rX3RleHQgPSB0ZXh0X3V0Zjguc3Vic3RyKHBvcywgbGVuZ3RoKTsKKyAgICAgIHRleHRfbm9kZXMtPkFwcGVuZChDcmVhdGVVUkxOb2RlKGxpbmtfdGV4dCwgdGFyZ2V0c1tpXS51cmwpKTsKKworICAgICAgc3RhcnQgPSBwb3MgKyBsZW5ndGg7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGJlZm9yZV90ZXh0ID0gdGV4dF91dGY4LnN1YnN0cihzdGFydCk7CisgICAgaWYgKGJlZm9yZV90ZXh0LnNpemUoKSA+IDApCisgICAgICB0ZXh0X25vZGVzLT5BcHBlbmQoQ3JlYXRlVGV4dE5vZGUoYmVmb3JlX3RleHQpKTsKKyAgfSBlbHNlIHsKKyAgICB0ZXh0X25vZGVzLT5BcHBlbmQoQ3JlYXRlVGV4dE5vZGUodGV4dF91dGY4KSk7CisgIH0KKworICBub2RlLT5TZXQoa1RleHRCb3hOb2RlcywgdGV4dF9ub2Rlcyk7ICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfHRleHRfbm9kZXN8LgorICByZXR1cm4gbm9kZTsKK30KKworYmFzZTo6VmFsdWUqIFBERml1bVBhZ2U6OkNyZWF0ZVRleHROb2RlKHN0ZDo6c3RyaW5nIHRleHQpIHsKKyAgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBub2RlID0gbmV3IGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSgpOworICBub2RlLT5TZXRTdHJpbmcoa1RleHROb2RlVHlwZSwga1RleHROb2RlVHlwZVRleHQpOworICBub2RlLT5TZXRTdHJpbmcoa1RleHROb2RlVGV4dCwgdGV4dCk7CisgIHJldHVybiBub2RlOworfQorCitiYXNlOjpWYWx1ZSogUERGaXVtUGFnZTo6Q3JlYXRlVVJMTm9kZShzdGQ6OnN0cmluZyB0ZXh0LCBzdGQ6OnN0cmluZyB1cmwpIHsKKyAgYmFzZTo6RGljdGlvbmFyeVZhbHVlKiBub2RlID0gbmV3IGJhc2U6OkRpY3Rpb25hcnlWYWx1ZSgpOworICBub2RlLT5TZXRTdHJpbmcoa1RleHROb2RlVHlwZSwga1RleHROb2RlVHlwZVVSTCk7CisgIG5vZGUtPlNldFN0cmluZyhrVGV4dE5vZGVUZXh0LCB0ZXh0KTsKKyAgbm9kZS0+U2V0U3RyaW5nKGtUZXh0Tm9kZVVSTCwgdXJsKTsKKyAgcmV0dXJuIG5vZGU7Cit9CisKK1BERml1bVBhZ2U6OkFyZWEgUERGaXVtUGFnZTo6R2V0Q2hhckluZGV4KGNvbnN0IHBwOjpQb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNoYXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rVGFyZ2V0KiB0YXJnZXQpIHsKKyAgaWYgKCFhdmFpbGFibGVfKQorICAgIHJldHVybiBOT05TRUxFQ1RBQkxFX0FSRUE7CisgIHBwOjpQb2ludCBwb2ludDIgPSBwb2ludCAtIHJlY3RfLnBvaW50KCk7CisgIGRvdWJsZSBuZXdfeCwgbmV3X3k7CisgIEZQREZfRGV2aWNlVG9QYWdlKEdldFBhZ2UoKSwgMCwgMCwgcmVjdF8ud2lkdGgoKSwgcmVjdF8uaGVpZ2h0KCksCisgICAgICAgIHJvdGF0aW9uLCBwb2ludDIueCgpLCBwb2ludDIueSgpLCAmbmV3X3gsICZuZXdfeSk7CisKKyAgaW50IHJ2ID0gRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoCisgICAgICBHZXRUZXh0UGFnZSgpLCBuZXdfeCwgbmV3X3ksIGtUb2xlcmFuY2UsIGtUb2xlcmFuY2UpOworICAqY2hhcl9pbmRleCA9IHJ2OworCisgIEZQREZfTElOSyBsaW5rID0gRlBERkxpbmtfR2V0TGlua0F0UG9pbnQoR2V0UGFnZSgpLCBuZXdfeCwgbmV3X3kpOworICBpZiAobGluaykgeworICAgIC8vIFdlIGRvbid0IGhhbmRsZSBhbGwgcG9zc2libGUgbGluayB0eXBlcyBvZiB0aGUgUERGLiBGb3IgZXhhbXBsZSwKKyAgICAvLyBsYXVuY2ggYWN0aW9ucywgY3Jvc3MtZG9jdW1lbnQgbGlua3MsIGV0Yy4KKyAgICAvLyBJbiB0aGF0IGNhc2UsIEdldExpbmtUYXJnZXQoKSB3aWxsIHJldHVybiBOT05TRUxFQ1RBQkxFX0FSRUEKKyAgICAvLyBhbmQgd2Ugc2hvdWxkIHByb2NlZWQgd2l0aCBhcmVhIGRldGVjdGlvbi4KKyAgICBQREZpdW1QYWdlOjpBcmVhIGFyZWEgPSBHZXRMaW5rVGFyZ2V0KGxpbmssIHRhcmdldCk7CisgICAgaWYgKGFyZWEgIT0gUERGaXVtUGFnZTo6Tk9OU0VMRUNUQUJMRV9BUkVBKQorICAgICAgcmV0dXJuIGFyZWE7CisgIH0KKworICBpZiAocnYgPCAwKQorICAgIHJldHVybiBOT05TRUxFQ1RBQkxFX0FSRUE7CisKKyAgcmV0dXJuIEdldExpbmsoKmNoYXJfaW5kZXgsIHRhcmdldCkgIT0gLTEgPyBXRUJMSU5LX0FSRUEgOiBURVhUX0FSRUE7Cit9CisKK2Jhc2U6OmNoYXIxNiBQREZpdW1QYWdlOjpHZXRDaGFyQXRJbmRleChpbnQgaW5kZXgpIHsKKyAgaWYgKCFhdmFpbGFibGVfKQorICAgIHJldHVybiBMJ1wwJzsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGJhc2U6OmNoYXIxNj4oRlBERlRleHRfR2V0VW5pY29kZShHZXRUZXh0UGFnZSgpLCBpbmRleCkpOworfQorCitpbnQgUERGaXVtUGFnZTo6R2V0Q2hhckNvdW50KCkgeworICBpZiAoIWF2YWlsYWJsZV8pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBGUERGVGV4dF9Db3VudENoYXJzKEdldFRleHRQYWdlKCkpOworfQorCitQREZpdW1QYWdlOjpBcmVhIFBERml1bVBhZ2U6OkdldExpbmtUYXJnZXQoCisgICAgRlBERl9MSU5LIGxpbmssIFBERml1bVBhZ2U6OkxpbmtUYXJnZXQqIHRhcmdldCkgeworICBGUERGX0RFU1QgZGVzdCA9IEZQREZMaW5rX0dldERlc3QoZW5naW5lXy0+ZG9jKCksIGxpbmspOworICBpZiAoZGVzdCAhPSBOVUxMKQorICAgIHJldHVybiBHZXREZXN0aW5hdGlvblRhcmdldChkZXN0LCB0YXJnZXQpOworCisgIEZQREZfQUNUSU9OIGFjdGlvbiA9IEZQREZMaW5rX0dldEFjdGlvbihsaW5rKTsKKyAgaWYgKGFjdGlvbikgeworICAgIHN3aXRjaCAoRlBERkFjdGlvbl9HZXRUeXBlKGFjdGlvbikpIHsKKyAgICAgIGNhc2UgUERGQUNUSU9OX0dPVE86IHsKKyAgICAgICAgICBGUERGX0RFU1QgZGVzdCA9IEZQREZBY3Rpb25fR2V0RGVzdChlbmdpbmVfLT5kb2MoKSwgYWN0aW9uKTsKKyAgICAgICAgICBpZiAoZGVzdCkKKyAgICAgICAgICAgIHJldHVybiBHZXREZXN0aW5hdGlvblRhcmdldChkZXN0LCB0YXJnZXQpOworICAgICAgICAgIC8vIFRPRE8oZ2VuZSk6IFdlIGRvbid0IGZ1bGx5IHN1cHBvcnQgYWxsIHR5cGVzIG9mIHRoZSBpbi1kb2N1bWVudAorICAgICAgICAgIC8vIGxpbmtzLiBOZWVkIHRvIGltcGxlbWVudCB0aGF0LiBUaGVyZSBpcyBhIGJ1ZyB0byB0cmFjayB0aGF0OgorICAgICAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU1Nzc2CisgICAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFBERkFDVElPTl9VUkk6IHsKKyAgICAgICAgICBpZiAodGFyZ2V0KSB7CisgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUgPQorICAgICAgICAgICAgICAgIEZQREZBY3Rpb25fR2V0VVJJUGF0aChlbmdpbmVfLT5kb2MoKSwgYWN0aW9uLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJfc2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgdm9pZCogZGF0YSA9IFdyaXRlSW50bygmdGFyZ2V0LT51cmwsIGJ1ZmZlcl9zaXplICsgMSk7CisgICAgICAgICAgICAgIEZQREZBY3Rpb25fR2V0VVJJUGF0aChlbmdpbmVfLT5kb2MoKSwgYWN0aW9uLCBkYXRhLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBXRUJMSU5LX0FSRUE7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAvLyBUT0RPKGdlbmUpOiBXZSBkb24ndCBzdXBwb3J0IFBERkFDVElPTl9SRU1PVEVHT1RPIGFuZCBQREZBQ1RJT05fTEFVTkNICisgICAgICAvLyBhdCB0aGUgbW9tZW50LgorICAgIH0KKyAgfQorCisgIHJldHVybiBOT05TRUxFQ1RBQkxFX0FSRUE7Cit9CisKK1BERml1bVBhZ2U6OkFyZWEgUERGaXVtUGFnZTo6R2V0RGVzdGluYXRpb25UYXJnZXQoCisgICAgRlBERl9ERVNUIGRlc3RpbmF0aW9uLCBQREZpdW1QYWdlOjpMaW5rVGFyZ2V0KiB0YXJnZXQpIHsKKyAgaW50IHBhZ2VfaW5kZXggPSBGUERGRGVzdF9HZXRQYWdlSW5kZXgoZW5naW5lXy0+ZG9jKCksIGRlc3RpbmF0aW9uKTsKKyAgaWYgKHRhcmdldCkgeworICAgIHRhcmdldC0+cGFnZSA9IHBhZ2VfaW5kZXg7CisgIH0KKyAgcmV0dXJuIERPQ0xJTktfQVJFQTsKK30KKworaW50IFBERml1bVBhZ2U6OkdldExpbmsoaW50IGNoYXJfaW5kZXgsIFBERml1bVBhZ2U6OkxpbmtUYXJnZXQqIHRhcmdldCkgeworICBpZiAoIWF2YWlsYWJsZV8pCisgICAgcmV0dXJuIC0xOworCisgIENhbGN1bGF0ZUxpbmtzKCk7CisKKyAgLy8gR2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHJlY3QgYWdhaW4sIHNpbmNlIGl0IG1pZ2h0IGhhdmUgbW92ZWQgYmVjYXVzZQorICAvLyBvZiB0aGUgdG9sZXJhbmNlIGFib3ZlLgorICBkb3VibGUgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wOworICBGUERGVGV4dF9HZXRDaGFyQm94KEdldFRleHRQYWdlKCksIGNoYXJfaW5kZXgsICZsZWZ0LCAmcmlnaHQsICZib3R0b20sICZ0b3ApOworCisgIHBwOjpQb2ludCBvcmlnaW4oCisgICAgICBQYWdlVG9TY3JlZW4ocHA6OlBvaW50KCksIDEuMCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCAwKS5wb2ludCgpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5rc18uc2l6ZSgpOyArK2kpIHsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGxpbmtzX1tpXS5yZWN0cy5zaXplKCk7ICsraikgeworICAgICAgaWYgKGxpbmtzX1tpXS5yZWN0c1tqXS5Db250YWlucyhvcmlnaW4pKSB7CisgICAgICAgIGlmICh0YXJnZXQpCisgICAgICAgICAgdGFyZ2V0LT51cmwgPSBsaW5rc19baV0udXJsOworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGQ6OnZlY3RvcjxpbnQ+IFBERml1bVBhZ2U6OkdldExpbmtzKHBwOjpSZWN0IHRleHRfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGlua1RhcmdldD4qIHRhcmdldHMpIHsKKyAgaWYgKCFhdmFpbGFibGVfKQorICAgIHJldHVybiBzdGQ6OnZlY3RvcjxpbnQ+KCk7CisKKyAgQ2FsY3VsYXRlTGlua3MoKTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IGxpbmtzOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlua3NfLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBsaW5rc19baV0ucmVjdHMuc2l6ZSgpOyArK2opIHsKKyAgICAgIGlmIChsaW5rc19baV0ucmVjdHNbal0uSW50ZXJzZWN0cyh0ZXh0X2FyZWEpKSB7CisgICAgICAgIGlmICh0YXJnZXRzKSB7CisgICAgICAgICAgTGlua1RhcmdldCB0YXJnZXQ7CisgICAgICAgICAgdGFyZ2V0LnVybCA9IGxpbmtzX1tpXS51cmw7CisgICAgICAgICAgdGFyZ2V0cy0+cHVzaF9iYWNrKHRhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgbGlua3MucHVzaF9iYWNrKGkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbGlua3M7Cit9CisKK3ZvaWQgUERGaXVtUGFnZTo6Q2FsY3VsYXRlTGlua3MoKSB7CisgIGlmIChjYWxjdWxhdGVkX2xpbmtzXykKKyAgICByZXR1cm47CisKKyAgY2FsY3VsYXRlZF9saW5rc18gPSB0cnVlOworICBGUERGX1BBR0VMSU5LIGxpbmtzID0gRlBERkxpbmtfTG9hZFdlYkxpbmtzKEdldFRleHRQYWdlKCkpOworICBpbnQgY291bnQgPSBGUERGTGlua19Db3VudFdlYkxpbmtzKGxpbmtzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgYmFzZTo6c3RyaW5nMTYgdXJsOworICAgIGludCB1cmxfbGVuZ3RoID0gRlBERkxpbmtfR2V0VVJMKGxpbmtzLCBpLCBOVUxMLCAwKTsKKyAgICBpZiAodXJsX2xlbmd0aCA+IDEpIHsgIC8vIFdyaXRlSW50byBuZWVkcyBhdCBsZWFzdCAyIGNoYXJhY3RlcnMuCisgICAgICB1bnNpZ25lZCBzaG9ydCogZGF0YSA9CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBzaG9ydCo+KFdyaXRlSW50bygmdXJsLCB1cmxfbGVuZ3RoICsgMSkpOworICAgICAgRlBERkxpbmtfR2V0VVJMKGxpbmtzLCBpLCBkYXRhLCB1cmxfbGVuZ3RoKTsKKyAgICB9CisgICAgTGluayBsaW5rOworICAgIGxpbmsudXJsID0gYmFzZTo6VVRGMTZUb1VURjgodXJsKTsKKworICAgIC8vIElmIHRoZSBsaW5rIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBwcDo6VmFyLCB0aGVuIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworICAgIC8vIHBhc3MgaXQgdG8gSlMuIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBsaW5rIGxpa2Ugb3RoZXIgUERGIHZpZXdlcnMuCisgICAgLy8gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMzEyODgyIGZvciBhbiBleGFtcGxlLgorICAgIHBwOjpWYXIgbGlua192YXIobGluay51cmwpOworICAgIGlmICghbGlua192YXIuaXNfc3RyaW5nKCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIFVSTCBhcmUgdmFsaWQgcGVyIFJGQyAxNzM4LgorICAgIC8vIGh0dHA6Ly9jcmJ1Zy5jb20vMzQwMzI2IGhhcyBhIHNhbXBsZSBiYWQgUERGLgorICAgIC8vIEdVUkwgZG9lcyBub3Qgd29yayBjb3JyZWN0bHksIGUuZy4gaXQganVzdCBzdHJpcHMgXHQgXHIgXG4uCisgICAgYm9vbCBpc19pbnZhbGlkX3VybCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbGluay51cmwubGVuZ3RoKCk7ICsraikgeworICAgICAgLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgIC8vIDB4N0YgaXMgYWxzbyBhIGNvbnRyb2wgY2hhcmFjdGVyLgorICAgICAgLy8gMHg4MCBhbmQgYWJvdmUgYXJlIG5vdCBpbiBVUy1BU0NJSS4KKyAgICAgIGlmIChsaW5rLnVybFtqXSA8ICcgJyB8fCBsaW5rLnVybFtqXSA+PSAnXHg3RicpIHsKKyAgICAgICAgaXNfaW52YWxpZF91cmwgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGlzX2ludmFsaWRfdXJsKQorICAgICAgY29udGludWU7CisKKyAgICBpbnQgcmVjdF9jb3VudCA9IEZQREZMaW5rX0NvdW50UmVjdHMobGlua3MsIGkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVjdF9jb3VudDsgKytqKSB7CisgICAgICBkb3VibGUgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgICAgRlBERkxpbmtfR2V0UmVjdChsaW5rcywgaSwgaiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgICBsaW5rLnJlY3RzLnB1c2hfYmFjaygKKyAgICAgICAgICBQYWdlVG9TY3JlZW4ocHA6OlBvaW50KCksIDEuMCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCAwKSk7CisgICAgfQorICAgIGxpbmtzXy5wdXNoX2JhY2sobGluayk7CisgIH0KKyAgRlBERkxpbmtfQ2xvc2VXZWJMaW5rcyhsaW5rcyk7Cit9CisKK3BwOjpSZWN0IFBERml1bVBhZ2U6OlBhZ2VUb1NjcmVlbihjb25zdCBwcDo6UG9pbnQmIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgem9vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGlvbikgeworICBpZiAoIWF2YWlsYWJsZV8pCisgICAgcmV0dXJuIHBwOjpSZWN0KCk7CisKKyAgaW50IG5ld19sZWZ0LCBuZXdfdG9wLCBuZXdfcmlnaHQsIG5ld19ib3R0b207CisgIEZQREZfUGFnZVRvRGV2aWNlKAorICAgICAgcGFnZV8sCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KChyZWN0Xy54KCkgLSBvZmZzZXQueCgpKSAqIHpvb20pLAorICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmVjdF8ueSgpIC0gb2Zmc2V0LnkoKSkgKiB6b29tKSwKKyAgICAgIHN0YXRpY19jYXN0PGludD4oY2VpbChyZWN0Xy53aWR0aCgpICogem9vbSkpLAorICAgICAgc3RhdGljX2Nhc3Q8aW50PihjZWlsKHJlY3RfLmhlaWdodCgpICogem9vbSkpLAorICAgICAgcm90YXRpb24sIGxlZnQsIHRvcCwgJm5ld19sZWZ0LCAmbmV3X3RvcCk7CisgIEZQREZfUGFnZVRvRGV2aWNlKAorICAgICAgcGFnZV8sCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KChyZWN0Xy54KCkgLSBvZmZzZXQueCgpKSAqIHpvb20pLAorICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmVjdF8ueSgpIC0gb2Zmc2V0LnkoKSkgKiB6b29tKSwKKyAgICAgIHN0YXRpY19jYXN0PGludD4oY2VpbChyZWN0Xy53aWR0aCgpICogem9vbSkpLAorICAgICAgc3RhdGljX2Nhc3Q8aW50PihjZWlsKHJlY3RfLmhlaWdodCgpICogem9vbSkpLAorICAgICAgcm90YXRpb24sIHJpZ2h0LCBib3R0b20sICZuZXdfcmlnaHQsICZuZXdfYm90dG9tKTsKKworICAvLyBJZiB0aGUgUERGIGlzIHJvdGF0ZWQsIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsIGNvb3JkaW5hdGVzIGNvdWxkIGJlCisgIC8vIGZsaXBwZWQuICBTZWUKKyAgLy8gaHR0cDovL3d3dy5uZXRsLmRvZS5nb3YvcHVibGljYXRpb25zL3Byb2NlZWRpbmdzLzAzL3ViYy9wcmVzZW50YXRpb25zL0dvZWNrbmVyLXByZXMucGRmCisgIGlmIChuZXdfcmlnaHQgPCBuZXdfbGVmdCkKKyAgICBzdGQ6OnN3YXAobmV3X3JpZ2h0LCBuZXdfbGVmdCk7CisgIGlmIChuZXdfYm90dG9tIDwgbmV3X3RvcCkKKyAgICBzdGQ6OnN3YXAobmV3X2JvdHRvbSwgbmV3X3RvcCk7CisKKyAgcmV0dXJuIHBwOjpSZWN0KAorICAgICAgbmV3X2xlZnQsIG5ld190b3AsIG5ld19yaWdodCAtIG5ld19sZWZ0ICsgMSwgbmV3X2JvdHRvbSAtIG5ld190b3AgKyAxKTsKK30KKworUERGaXVtUGFnZTo6TGluazo6TGluaygpIHsKK30KKworUERGaXVtUGFnZTo6TGluazo6fkxpbmsoKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9wYWdlLmggYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlYTE0MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX3BhZ2UuaApAQCAtMCwwICsxLDEzNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQREZfUERGSVVNX1BERklVTV9QQUdFX0hfCisjZGVmaW5lIFBERl9QREZJVU1fUERGSVVNX1BBR0VfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nMTYuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvcmVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvZnBkZmRvYy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3BkZml1bS9mcGRmc2RrL2luY2x1ZGUvZnBkZmZvcm1maWxsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvcGRmaXVtL2ZwZGZzZGsvaW5jbHVkZS9mcGRmdGV4dC5oIgorCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBWYWx1ZTsKK30KKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCitjbGFzcyBQREZpdW1FbmdpbmU7CisKKy8vIFdyYXBwZXIgYXJvdW5kIGEgcGFnZSBmcm9tIHRoZSBkb2N1bWVudC4KK2NsYXNzIFBERml1bVBhZ2UgeworIHB1YmxpYzoKKyAgUERGaXVtUGFnZShQREZpdW1FbmdpbmUqIGVuZ2luZSwKKyAgICAgICAgICAgICBpbnQgaSwKKyAgICAgICAgICAgICBjb25zdCBwcDo6UmVjdCYgciwKKyAgICAgICAgICAgICBib29sIGF2YWlsYWJsZSk7CisgIH5QREZpdW1QYWdlKCk7CisgIC8vIFVubG9hZHMgdGhlIFBERml1bSBkYXRhIGZvciB0aGlzIHBhZ2UgZnJvbSBtZW1vcnkuCisgIHZvaWQgVW5sb2FkKCk7CisgIC8vIEdldHMgdGhlIEZQREZfUEFHRSBmb3IgdGhpcyBwYWdlLCBsb2FkaW5nIGFuZCBwYXJzaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgRlBERl9QQUdFIEdldFBhZ2UoKTsKKyAgLy9HZXQgdGhlIEZQREZfUEFHRSBmb3IgcHJpbnRpbmcuCisgIEZQREZfUEFHRSBHZXRQcmludFBhZ2UoKTsKKyAgLy9DbG9zZSB0aGUgcHJpbnRpbmcgcGFnZS4KKyAgdm9pZCBDbG9zZVByaW50UGFnZSgpOworCisgIC8vIFJldHVybnMgRlBERl9URVhUUEFHRSBmb3IgdGhlIHBhZ2UsIGxvYWRpbmcgYW5kIHBhcnNpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICBGUERGX1RFWFRQQUdFIEdldFRleHRQYWdlKCk7CisKKyAgLy8gUmV0dXJucyBhIERpY3Rpb25hcnlWYWx1ZSB2ZXJzaW9uIG9mIHRoZSBwYWdlLgorICBiYXNlOjpWYWx1ZSogR2V0QWNjZXNzaWJsZUNvbnRlbnRBc1ZhbHVlKGludCByb3RhdGlvbik7CisKKyAgZW51bSBBcmVhIHsKKyAgICBOT05TRUxFQ1RBQkxFX0FSRUEsCisgICAgVEVYVF9BUkVBLAorICAgIFdFQkxJTktfQVJFQSwgIC8vIEFyZWEgaXMgYSBoeXBlcmxpbmsuCisgICAgRE9DTElOS19BUkVBLCAgLy8gQXJlYSBpcyBhIGxpbmsgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgc2FtZSBkb2N1bWVudC4KKyAgfTsKKworICBzdHJ1Y3QgTGlua1RhcmdldCB7CisgICAgLy8gV2UgYXJlIHVzaW5nIHN0ZDo6c3RyaW5nIGhlcmUgd2hpY2ggaGF2ZSBhIGNvcHkgY29udHJ1Y3Rvci4KKyAgICAvLyBUaGF0IHByZXZlbnRzIHVzIGZyb20gdXNpbmcgdW5pb24gaGVyZS4KKyAgICBzdGQ6OnN0cmluZyB1cmw7ICAvLyBWYWxpZCBmb3IgV0VCTElOS19BUkVBIG9ubHkuCisgICAgaW50IHBhZ2U7ICAgICAgICAgLy8gVmFsaWQgZm9yIERPQ0xJTktfQVJFQSBvbmx5LgorICB9OworCisgIC8vIEdpdmVuIGEgcG9pbnQgaW4gdGhlIGRvY3VtZW50IHRoYXQncyBpbiB0aGlzIHBhZ2UsIHJldHVybnMgaXRzIGNoYXJhY3RlcgorICAvLyBpbmRleCBpZiBpdCdzIG5lYXIgYSBjaGFyYWN0ZXIsIGFuZCBhbHNvIHRoZSB0eXBlIG9mIHRleHQuCisgIC8vIFRhcmdldCBpcyBvcHRpb25hbC4gSXQgd2lsbCBiZSBmaWxsZWQgaW4gZm9yIFdFQkxJTktfQVJFQSBvcgorICAvLyBET0NMSU5LX0FSRUEgb25seS4KKyAgQXJlYSBHZXRDaGFySW5kZXgoY29uc3QgcHA6OlBvaW50JiBwb2ludCwgaW50IHJvdGF0aW9uLCBpbnQqIGNoYXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIExpbmtUYXJnZXQqIHRhcmdldCk7CisKKyAgLy8gR2V0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgYmFzZTo6Y2hhcjE2IEdldENoYXJBdEluZGV4KGludCBpbmRleCk7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHBhZ2UuCisgIGludCBHZXRDaGFyQ291bnQoKTsKKworICAvLyBDb252ZXJ0cyBmcm9tIHBhZ2UgY29vcmRpbmF0ZXMgdG8gc2NyZWVuIGNvb3JkaW5hdGVzLgorICBwcDo6UmVjdCBQYWdlVG9TY3JlZW4oY29uc3QgcHA6OlBvaW50JiBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgem9vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24pOworCisgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4XzsgfQorICBwcDo6UmVjdCByZWN0KCkgY29uc3QgeyByZXR1cm4gcmVjdF87IH0KKyAgdm9pZCBzZXRfcmVjdChjb25zdCBwcDo6UmVjdCYgcikgeyByZWN0XyA9IHI7IH0KKyAgYm9vbCBhdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBhdmFpbGFibGVfOyB9CisgIHZvaWQgc2V0X2F2YWlsYWJsZShib29sIGF2YWlsYWJsZSkgeyBhdmFpbGFibGVfID0gYXZhaWxhYmxlOyB9CisgIHZvaWQgc2V0X2NhbGN1bGF0ZWRfbGlua3MoYm9vbCBjYWxjdWxhdGVkX2xpbmtzKSB7CisgICAgIGNhbGN1bGF0ZWRfbGlua3NfID0gY2FsY3VsYXRlZF9saW5rczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gUmV0dXJucyBhIGxpbmsgaW5kZXggaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBpbmRleCBpcyBvdmVyIGEgbGluaywgb3IgLTEKKyAgLy8gb3RoZXJ3aXNlLgorICBpbnQgR2V0TGluayhpbnQgY2hhcl9pbmRleCwgTGlua1RhcmdldCogdGFyZ2V0KTsKKyAgLy8gUmV0dXJucyB0aGUgbGluayBpbmRpY2VzIGlmIHRoZSBnaXZlbiByZWN0IGludGVyc2VjdHMgYSBsaW5rIHJlY3QsIG9yIGFuCisgIC8vIGVtcHR5IHZlY3RvciBvdGhlcndpc2UuCisgIHN0ZDo6dmVjdG9yPGludD4gR2V0TGlua3MocHA6OlJlY3QgdGV4dF9hcmVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPExpbmtUYXJnZXQ+KiB0YXJnZXRzKTsKKyAgLy8gQ2FsY3VsYXRlIHRoZSBsb2NhdGlvbnMgb2YgYW55IGxpbmtzIG9uIHRoZSBwYWdlLgorICB2b2lkIENhbGN1bGF0ZUxpbmtzKCk7CisgIC8vIFJldHVybnMgbGluayB0eXBlIGFuZCB0YXJnZXQgYXNzb2NpYXRlZCB3aXRoIGEgbGluay4gUmV0dXJucworICAvLyBOT05TRUxFQ1RBQkxFX0FSRUEgaWYgbGluayBkZXRlY3Rpb24gZmFpbGVkLgorICBBcmVhIEdldExpbmtUYXJnZXQoRlBERl9MSU5LIGxpbmssIExpbmtUYXJnZXQqIHRhcmdldCk7CisgIC8vIFJldHVybnMgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aCBhIGRlc3RpbmF0aW9uLgorICBBcmVhIEdldERlc3RpbmF0aW9uVGFyZ2V0KEZQREZfREVTVCBkZXN0aW5hdGlvbiwgTGlua1RhcmdldCogdGFyZ2V0KTsKKyAgLy8gUmV0dXJucyB0aGUgdGV4dCBpbiB0aGUgc3VwcGxpZWQgYm94IGFzIGEgVmFsdWUgTm9kZQorICBiYXNlOjpWYWx1ZSogR2V0VGV4dEJveEFzVmFsdWUoZG91YmxlIHBhZ2VfaGVpZ2h0LCBkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSwgaW50IHJvdGF0aW9uKTsKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgSlNPTiBnZW5lcmF0aW9uCisgIGJhc2U6OlZhbHVlKiBDcmVhdGVUZXh0Tm9kZShzdGQ6OnN0cmluZyB0ZXh0KTsKKyAgYmFzZTo6VmFsdWUqIENyZWF0ZVVSTE5vZGUoc3RkOjpzdHJpbmcgdGV4dCwgc3RkOjpzdHJpbmcgdXJsKTsKKworICBzdHJ1Y3QgTGluayB7CisgICAgTGluaygpOworICAgIH5MaW5rKCk7CisKKyAgICBzdGQ6OnN0cmluZyB1cmw7CisgICAgLy8gQm91bmRpbmcgcmVjdGFuZ2xlcyBvZiBjaGFyYWN0ZXJzLgorICAgIHN0ZDo6dmVjdG9yPHBwOjpSZWN0PiByZWN0czsKKyAgfTsKKworICBQREZpdW1FbmdpbmUqIGVuZ2luZV87CisgIEZQREZfUEFHRSBwYWdlXzsKKyAgRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2VfOworICBpbnQgaW5kZXhfOworICBwcDo6UmVjdCByZWN0XzsKKyAgYm9vbCBjYWxjdWxhdGVkX2xpbmtzXzsKKyAgc3RkOjp2ZWN0b3I8TGluaz4gbGlua3NfOworICBib29sIGF2YWlsYWJsZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9QREZJVU1fUERGSVVNX1BBR0VfSF8KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX3JhbmdlLmNjIGIveGZhX3Rlc3QvcGRmL3BkZml1bS9wZGZpdW1fcmFuZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3ZDU5MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX3JhbmdlLmNjCkBAIC0wLDAgKzEsNzkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwZGYvcGRmaXVtL3BkZml1bV9yYW5nZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworUERGaXVtUmFuZ2U6OlBERml1bVJhbmdlKFBERml1bVBhZ2UqIHBhZ2UsIGludCBjaGFyX2luZGV4LCBpbnQgY2hhcl9jb3VudCkKKyAgICA6IHBhZ2VfKHBhZ2UpLAorICAgICAgY2hhcl9pbmRleF8oY2hhcl9pbmRleCksCisgICAgICBjaGFyX2NvdW50XyhjaGFyX2NvdW50KSwKKyAgICAgIGNhY2hlZF9zY3JlZW5fcmVjdHNfem9vbV8oMCkgeworfQorCitQREZpdW1SYW5nZTo6flBERml1bVJhbmdlKCkgeworfQorCit2b2lkIFBERml1bVJhbmdlOjpTZXRDaGFyQ291bnQoaW50IGNoYXJfY291bnQpIHsKKyAgY2hhcl9jb3VudF8gPSBjaGFyX2NvdW50OworCisgIGNhY2hlZF9zY3JlZW5fcmVjdHNfb2Zmc2V0XyA9IHBwOjpQb2ludCgpOworICBjYWNoZWRfc2NyZWVuX3JlY3RzX3pvb21fID0gMDsKK30KKworc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IFBERml1bVJhbmdlOjpHZXRTY3JlZW5SZWN0cyhjb25zdCBwcDo6UG9pbnQmIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHpvb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGlvbikgeworICBpZiAob2Zmc2V0ID09IGNhY2hlZF9zY3JlZW5fcmVjdHNfb2Zmc2V0XyAmJgorICAgICAgem9vbSA9PSBjYWNoZWRfc2NyZWVuX3JlY3RzX3pvb21fKSB7CisgICAgcmV0dXJuIGNhY2hlZF9zY3JlZW5fcmVjdHNfOworICB9CisKKyAgY2FjaGVkX3NjcmVlbl9yZWN0c18uY2xlYXIoKTsKKyAgY2FjaGVkX3NjcmVlbl9yZWN0c19vZmZzZXRfID0gb2Zmc2V0OworICBjYWNoZWRfc2NyZWVuX3JlY3RzX3pvb21fID0gem9vbTsKKworICBpbnQgY2hhcl9pbmRleCA9IGNoYXJfaW5kZXhfOworICBpbnQgY2hhcl9jb3VudCA9IGNoYXJfY291bnRfOworICBpZiAoY2hhcl9jb3VudCA8IDApIHsKKyAgICBjaGFyX2NvdW50ICo9IC0xOworICAgIGNoYXJfaW5kZXggLT0gY2hhcl9jb3VudCAtIDE7CisgIH0KKworICBpbnQgY291bnQgPSBGUERGVGV4dF9Db3VudFJlY3RzKHBhZ2VfLT5HZXRUZXh0UGFnZSgpLCBjaGFyX2luZGV4LCBjaGFyX2NvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgZG91YmxlIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICBGUERGVGV4dF9HZXRSZWN0KHBhZ2VfLT5HZXRUZXh0UGFnZSgpLCBpLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKyAgICBjYWNoZWRfc2NyZWVuX3JlY3RzXy5wdXNoX2JhY2soCisgICAgICAgIHBhZ2VfLT5QYWdlVG9TY3JlZW4ob2Zmc2V0LCB6b29tLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHJvdGF0aW9uKSk7CisgIH0KKworICByZXR1cm4gY2FjaGVkX3NjcmVlbl9yZWN0c187Cit9CisKK2Jhc2U6OnN0cmluZzE2IFBERml1bVJhbmdlOjpHZXRUZXh0KCkgeworICBpbnQgaW5kZXggPSBjaGFyX2luZGV4XzsKKyAgaW50IGNvdW50ID0gY2hhcl9jb3VudF87CisgIGlmICghY291bnQpCisgICAgcmV0dXJuIGJhc2U6OnN0cmluZzE2KCk7CisgIGlmIChjb3VudCA8IDApIHsKKyAgICBjb3VudCAqPSAtMTsKKyAgICBpbmRleCAtPSBjb3VudCAtIDE7CisgIH0KKworICBiYXNlOjpzdHJpbmcxNiBydjsKKyAgdW5zaWduZWQgc2hvcnQqIGRhdGEgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBzaG9ydCo+KFdyaXRlSW50bygmcnYsIGNvdW50ICsgMSkpOworICBpZiAoZGF0YSkgeworICAgIGludCB3cml0dGVuID0gRlBERlRleHRfR2V0VGV4dChwYWdlXy0+R2V0VGV4dFBhZ2UoKSwgaW5kZXgsIGNvdW50LCBkYXRhKTsKKyAgICBydi5yZXNlcnZlKHdyaXR0ZW4pOworICB9CisgIHJldHVybiBydjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wZGZpdW0vcGRmaXVtX3JhbmdlLmggYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9yYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGRhZjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcGRmaXVtL3BkZml1bV9yYW5nZS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BERklVTV9QREZJVU1fUkFOR0VfSF8KKyNkZWZpbmUgUERGX1BERklVTV9QREZJVU1fUkFOR0VfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3Mvc3RyaW5nMTYuaCIKKyNpbmNsdWRlICJwZGYvcGRmaXVtL3BkZml1bV9wYWdlLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL3JlY3QuaCIKKworbmFtZXNwYWNlIGNocm9tZV9wZGYgeworCisvLyBEZXNjcmliZXMgbG9jYXRpb24gb2YgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KK2NsYXNzIFBERml1bVJhbmdlIHsKKyBwdWJsaWM6CisgIFBERml1bVJhbmdlKFBERml1bVBhZ2UqIHBhZ2UsIGludCBjaGFyX2luZGV4LCBpbnQgY2hhcl9jb3VudCk7CisgIH5QREZpdW1SYW5nZSgpOworCisgIC8vIFVwZGF0ZSBob3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBpbiB0aGUgc2VsZWN0aW9uLiAgQ291bGQgYmUgbmVnYXRpdmUgaWYKKyAgLy8gYmFja3dhcmRzLgorICB2b2lkIFNldENoYXJDb3VudChpbnQgY2hhcl9jb3VudCk7CisKKyAgaW50IHBhZ2VfaW5kZXgoKSBjb25zdCB7IHJldHVybiBwYWdlXy0+aW5kZXgoKTsgfQorICBpbnQgY2hhcl9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGNoYXJfaW5kZXhfOyB9CisgIGludCBjaGFyX2NvdW50KCkgY29uc3QgeyByZXR1cm4gY2hhcl9jb3VudF87IH0KKworICAvLyBHZXRzIGJvdW5kaW5nIHJlY3RhbmdsZXMgb2YgcmFuZ2UgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgorICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gR2V0U2NyZWVuUmVjdHMoY29uc3QgcHA6OlBvaW50JiBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgem9vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGlvbik7CisKKyAgLy8gR2V0cyB0aGUgc3RyaW5nIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyByYW5nZS4KKyAgYmFzZTo6c3RyaW5nMTYgR2V0VGV4dCgpOworCisgcHJpdmF0ZToKKyAgUERGaXVtUGFnZSogcGFnZV87CisgIC8vIEluZGV4IG9mIGZpcnN0IGNoYXJhY3Rlci4KKyAgaW50IGNoYXJfaW5kZXhfOworICAvLyBIb3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBwYXJ0IG9mIHRoaXMgcmFuZ2UgKG5lZ2F0aXZlIGlmICBiYWNrd2FyZHMpLgorICBpbnQgY2hhcl9jb3VudF87CisKKyAgLy8gQ2FjaGUgb2YgU2NyZWVuUmVjdCwgYW5kIHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlcyB1c2VkIHdoZW4gY2FjaGluZyBpdC4KKyAgc3RkOjp2ZWN0b3I8cHA6OlJlY3Q+IGNhY2hlZF9zY3JlZW5fcmVjdHNfOworICBwcDo6UG9pbnQgY2FjaGVkX3NjcmVlbl9yZWN0c19vZmZzZXRfOworICBkb3VibGUgY2FjaGVkX3NjcmVlbl9yZWN0c196b29tXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKKyNlbmRpZiAgLy8gUERGX1BERklVTV9QREZJVU1fUkFOR0VfSF8KZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wcmV2aWV3X21vZGVfY2xpZW50LmNjIGIveGZhX3Rlc3QvcGRmL3ByZXZpZXdfbW9kZV9jbGllbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5OTE5YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi9wcmV2aWV3X21vZGVfY2xpZW50LmNjCkBAIC0wLDAgKzEsMTYyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicGRmL3ByZXZpZXdfbW9kZV9jbGllbnQuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInBkZi9pbnN0YW5jZS5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK1ByZXZpZXdNb2RlQ2xpZW50OjpQcmV2aWV3TW9kZUNsaWVudChDbGllbnQqIGNsaWVudCkKKyAgICA6IGNsaWVudF8oY2xpZW50KSB7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OkRvY3VtZW50U2l6ZVVwZGF0ZWQoY29uc3QgcHA6OlNpemUmIHNpemUpIHsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6SW52YWxpZGF0ZShjb25zdCBwcDo6UmVjdCYgcmVjdCkgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OlNjcm9sbChjb25zdCBwcDo6UG9pbnQmIHBvaW50KSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6U2Nyb2xsVG9YKGludCBwb3NpdGlvbikgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OlNjcm9sbFRvWShpbnQgcG9zaXRpb24pIHsKKyAgTk9UUkVBQ0hFRCgpOworfQorCit2b2lkIFByZXZpZXdNb2RlQ2xpZW50OjpTY3JvbGxUb1BhZ2UoaW50IHBhZ2UpIHsKKyAgTk9UUkVBQ0hFRCgpOworfQorCit2b2lkIFByZXZpZXdNb2RlQ2xpZW50OjpOYXZpZ2F0ZVRvKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3Blbl9pbl9uZXdfdGFiKSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6VXBkYXRlQ3Vyc29yKFBQX0N1cnNvclR5cGVfRGV2IGN1cnNvcikgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OlVwZGF0ZVRpY2tNYXJrcygKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4mIHRpY2ttYXJrcykgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6Ok5vdGlmeU51bWJlck9mRmluZFJlc3VsdHNDaGFuZ2VkKGludCB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmluYWxfcmVzdWx0KSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6Tm90aWZ5U2VsZWN0ZWRGaW5kUmVzdWx0Q2hhbmdlZCgKKyAgICBpbnQgY3VycmVudF9maW5kX2luZGV4KSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6R2V0RG9jdW1lbnRQYXNzd29yZCgKKyAgICBwcDo6Q29tcGxldGlvbkNhbGxiYWNrV2l0aE91dHB1dDxwcDo6VmFyPiBjYWxsYmFjaykgeworICBjYWxsYmFjay5SdW4oUFBfRVJST1JfRkFJTEVEKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6QWxlcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgTk9UUkVBQ0hFRCgpOworfQorCitib29sIFByZXZpZXdNb2RlQ2xpZW50OjpDb25maXJtKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnN0cmluZyBQcmV2aWV3TW9kZUNsaWVudDo6UHJvbXB0KGNvbnN0IHN0ZDo6c3RyaW5nJiBxdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfYW5zd2VyKSB7CisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFByZXZpZXdNb2RlQ2xpZW50OjpHZXRVUkwoKSB7CisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OkVtYWlsKGNvbnN0IHN0ZDo6c3RyaW5nJiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBib2R5KSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6UHJpbnQoKSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6U3VibWl0Rm9ybShjb25zdCBzdGQ6OnN0cmluZyYgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKworc3RkOjpzdHJpbmcgUHJldmlld01vZGVDbGllbnQ6OlNob3dGaWxlU2VsZWN0aW9uRGlhbG9nKCkgeworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCitwcDo6VVJMTG9hZGVyIFByZXZpZXdNb2RlQ2xpZW50OjpDcmVhdGVVUkxMb2FkZXIoKSB7CisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIHBwOjpVUkxMb2FkZXIoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6U2NoZWR1bGVDYWxsYmFjayhpbnQgaWQsIGludCBkZWxheV9pbl9tcykgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OlNlYXJjaFN0cmluZyhjb25zdCBiYXNlOjpjaGFyMTYqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpjaGFyMTYqIHRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTZWFyY2hTdHJpbmdSZXN1bHQ+KiByZXN1bHRzKSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6RG9jdW1lbnRQYWludE9jY3VycmVkKCkgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OkRvY3VtZW50TG9hZENvbXBsZXRlKGludCBwYWdlX2NvdW50KSB7CisgIGNsaWVudF8tPlByZXZpZXdEb2N1bWVudExvYWRDb21wbGV0ZSgpOworfQorCit2b2lkIFByZXZpZXdNb2RlQ2xpZW50OjpEb2N1bWVudExvYWRGYWlsZWQoKSB7CisgIGNsaWVudF8tPlByZXZpZXdEb2N1bWVudExvYWRGYWlsZWQoKTsKK30KKworcHA6Okluc3RhbmNlKiBQcmV2aWV3TW9kZUNsaWVudDo6R2V0UGx1Z2luSW5zdGFuY2UoKSB7CisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUHJldmlld01vZGVDbGllbnQ6OkRvY3VtZW50SGFzVW5zdXBwb3J0ZWRGZWF0dXJlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmZWF0dXJlKSB7CisgIE5PVFJFQUNIRUQoKTsKK30KKwordm9pZCBQcmV2aWV3TW9kZUNsaWVudDo6RG9jdW1lbnRMb2FkUHJvZ3Jlc3ModWludDMyIGF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBkb2Nfc2l6ZSkgeworfQorCit2b2lkIFByZXZpZXdNb2RlQ2xpZW50OjpGb3JtVGV4dEZpZWxkRm9jdXNDaGFuZ2UoYm9vbCBpbl9mb2N1cykgeworICBOT1RSRUFDSEVEKCk7Cit9CisKK2Jvb2wgUHJldmlld01vZGVDbGllbnQ6OklzUHJpbnRQcmV2aWV3KCkgeworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKZGlmZiAtLWdpdCBhL3hmYV90ZXN0L3BkZi9wcmV2aWV3X21vZGVfY2xpZW50LmggYi94ZmFfdGVzdC9wZGYvcHJldmlld19tb2RlX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzY2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcHJldmlld19tb2RlX2NsaWVudC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGX1BSRVZJRVdfTU9ERV9DTElFTlRfSF8KKyNkZWZpbmUgUERGX1BSRVZJRVdfTU9ERV9DTElFTlRfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwZGYvcGRmX2VuZ2luZS5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKKy8vIFRoZSBpbnRlcmZhY2UgdGhhdCdzIHByb3ZpZGVkIHRvIHRoZSBwcmludCBwcmV2aWV3IHJlbmRlcmluZyBlbmdpbmUuCitjbGFzcyBQcmV2aWV3TW9kZUNsaWVudCA6IHB1YmxpYyBQREZFbmdpbmU6OkNsaWVudCB7CisgcHVibGljOgorICBjbGFzcyBDbGllbnQgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBQcmV2aWV3RG9jdW1lbnRMb2FkRmFpbGVkKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBQcmV2aWV3RG9jdW1lbnRMb2FkQ29tcGxldGUoKSA9IDA7CisgIH07CisgIGV4cGxpY2l0IFByZXZpZXdNb2RlQ2xpZW50KENsaWVudCogY2xpZW50KTsKKyAgdmlydHVhbCB+UHJldmlld01vZGVDbGllbnQoKSB7fQorCisgIC8vIFBERkVuZ2luZTo6Q2xpZW50IGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRTaXplVXBkYXRlZChjb25zdCBwcDo6U2l6ZSYgc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCBJbnZhbGlkYXRlKGNvbnN0IHBwOjpSZWN0JiByZWN0KTsKKyAgdmlydHVhbCB2b2lkIFNjcm9sbChjb25zdCBwcDo6UG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCB2b2lkIFNjcm9sbFRvWChpbnQgcG9zaXRpb24pOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsVG9ZKGludCBwb3NpdGlvbik7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxUb1BhZ2UoaW50IHBhZ2UpOworICB2aXJ0dWFsIHZvaWQgTmF2aWdhdGVUbyhjb25zdCBzdGQ6OnN0cmluZyYgdXJsLCBib29sIG9wZW5faW5fbmV3X3RhYik7CisgIHZpcnR1YWwgdm9pZCBVcGRhdGVDdXJzb3IoUFBfQ3Vyc29yVHlwZV9EZXYgY3Vyc29yKTsKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVRpY2tNYXJrcyhjb25zdCBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4mIHRpY2ttYXJrcyk7CisgIHZpcnR1YWwgdm9pZCBOb3RpZnlOdW1iZXJPZkZpbmRSZXN1bHRzQ2hhbmdlZChpbnQgdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpbmFsX3Jlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBOb3RpZnlTZWxlY3RlZEZpbmRSZXN1bHRDaGFuZ2VkKGludCBjdXJyZW50X2ZpbmRfaW5kZXgpOworICB2aXJ0dWFsIHZvaWQgR2V0RG9jdW1lbnRQYXNzd29yZCgKKyAgICAgIHBwOjpDb21wbGV0aW9uQ2FsbGJhY2tXaXRoT3V0cHV0PHBwOjpWYXI+IGNhbGxiYWNrKTsKKyAgdmlydHVhbCB2b2lkIEFsZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKyAgdmlydHVhbCBib29sIENvbmZpcm0oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFByb21wdChjb25zdCBzdGQ6OnN0cmluZyYgcXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X2Fuc3dlcik7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VVJMKCk7CisgIHZpcnR1YWwgdm9pZCBFbWFpbChjb25zdCBzdGQ6OnN0cmluZyYgdG8sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYm9keSk7CisgIHZpcnR1YWwgdm9pZCBQcmludCgpOworICB2aXJ0dWFsIHZvaWQgU3VibWl0Rm9ybShjb25zdCBzdGQ6OnN0cmluZyYgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBTaG93RmlsZVNlbGVjdGlvbkRpYWxvZygpOworICB2aXJ0dWFsIHBwOjpVUkxMb2FkZXIgQ3JlYXRlVVJMTG9hZGVyKCk7CisgIHZpcnR1YWwgdm9pZCBTY2hlZHVsZUNhbGxiYWNrKGludCBpZCwgaW50IGRlbGF5X2luX21zKTsKKyAgdmlydHVhbCB2b2lkIFNlYXJjaFN0cmluZyhjb25zdCBiYXNlOjpjaGFyMTYqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpjaGFyMTYqIHRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTZWFyY2hTdHJpbmdSZXN1bHQ+KiByZXN1bHRzKTsKKyAgdmlydHVhbCB2b2lkIERvY3VtZW50UGFpbnRPY2N1cnJlZCgpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkQ29tcGxldGUoaW50IHBhZ2VfY291bnQpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkRmFpbGVkKCk7CisgIHZpcnR1YWwgcHA6Okluc3RhbmNlKiBHZXRQbHVnaW5JbnN0YW5jZSgpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRIYXNVbnN1cHBvcnRlZEZlYXR1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGZlYXR1cmUpOworICB2aXJ0dWFsIHZvaWQgRG9jdW1lbnRMb2FkUHJvZ3Jlc3ModWludDMyIGF2YWlsYWJsZSwgdWludDMyIGRvY19zaXplKTsKKyAgdmlydHVhbCB2b2lkIEZvcm1UZXh0RmllbGRGb2N1c0NoYW5nZShib29sIGluX2ZvY3VzKTsKKyAgdmlydHVhbCBib29sIElzUHJpbnRQcmV2aWV3KCk7CisKKyBwcml2YXRlOgorICBDbGllbnQqIGNsaWVudF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2hyb21lX3BkZgorCisjZW5kaWYgIC8vIFBERl9QUkVWSUVXX01PREVfQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcHJvZ3Jlc3NfY29udHJvbC5jYyBiL3hmYV90ZXN0L3BkZi9wcm9ncmVzc19jb250cm9sLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMmJjYTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcHJvZ3Jlc3NfY29udHJvbC5jYwpAQCAtMCwwICsxLDI4MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi9wcm9ncmVzc19jb250cm9sLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJwZGYvZHJhd191dGlscy5oIgorI2luY2x1ZGUgInBkZi9yZXNvdXJjZV9jb25zdHMuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvZGV2L2ZvbnRfZGV2LmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY29uc3QgZG91YmxlIFByb2dyZXNzQ29udHJvbDo6a0NvbXBsZXRlZCA9IDEwMC4wOworCisvLyBUaGVyZSBpcyBhIGJ1ZyBvdXRwdXR0aW5nIHRleHQgd2l0aCBhbHBoYSAweEZGIChvcGFxdWUpIHRvIGFuIGludGVybWVkaWF0ZQorLy8gaW1hZ2UuIEl0IG91dHB1dHMgYWxwaGEgY2hhbm5nZWwgb2YgdGhlIHRleHQgcGl4ZWxzIHRvIDB4RkYgKHRyYW5zcGFyZW50KS4KKy8vIEFuZCBpdCBicmVha3MgbmV4dCBhbHBoYSBibGVuZGluZy4KKy8vIEZvciBub3csIGxldCdzIHVzZSBhbHBoYSAweEZFIHRvIHdvcmsgYXJvdW5kIHRoaXMgYnVnLgorLy8gVE9ETyhnZW5lKTogaW52ZXN0aWdhdGUgdGhpcyBidWcuCitjb25zdCB1aW50MzIga1Byb2dyZXNzVGV4dENvbG9yID0gMHhGRURERTZGQzsKK2NvbnN0IHVpbnQzMiBrUHJvZ3Jlc3NUZXh0U2l6ZSA9IDE2OworY29uc3QgdWludDMyIGtJbWFnZVRleHRTcGFjaW5nID0gODsKK2NvbnN0IHVpbnQzMiBrVG9wUGFkZGluZyA9IDg7Citjb25zdCB1aW50MzIga0JvdHRvbVBhZGRpbmcgPSAxMjsKK2NvbnN0IHVpbnQzMiBrTGVmdFBhZGRpbmcgPSAxMDsKK2NvbnN0IHVpbnQzMiBrUmlnaHRQYWRkaW5nID0gMTA7CisKK2ludCBTY2FsZUludChpbnQgdmFsLCBmbG9hdCBzY2FsZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih2YWwgKiBzY2FsZSk7Cit9CisKK1Byb2dyZXNzQ29udHJvbDo6UHJvZ3Jlc3NDb250cm9sKCkKKyAgICA6IHByb2dyZXNzXygwLjApLAorICAgICAgZGV2aWNlX3NjYWxlXygxLjApIHsKK30KKworUHJvZ3Jlc3NDb250cm9sOjp+UHJvZ3Jlc3NDb250cm9sKCkgeworfQorCitib29sIFByb2dyZXNzQ29udHJvbDo6Q3JlYXRlUHJvZ3Jlc3NDb250cm9sKAorICAgIHVpbnQzMiBpZCwKKyAgICBib29sIHZpc2libGUsCisgICAgQ29udHJvbDo6T3duZXIqIGRlbGVnYXRlLAorICAgIGRvdWJsZSBwcm9ncmVzcywKKyAgICBmbG9hdCBkZXZpY2Vfc2NhbGUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4mIGltYWdlcywKKyAgICBjb25zdCBwcDo6SW1hZ2VEYXRhJiBiYWNrZ3JvdW5kLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KSB7CisgIHByb2dyZXNzXyA9IHByb2dyZXNzOworICB0ZXh0XyA9IHRleHQ7CisgIGJvb2wgcmVzID0gQ29udHJvbDo6Q3JlYXRlKGlkLCBwcDo6UmVjdCgpLCB2aXNpYmxlLCBkZWxlZ2F0ZSk7CisgIGlmIChyZXMpCisgICAgUmVjb25maWd1cmUoYmFja2dyb3VuZCwgaW1hZ2VzLCBkZXZpY2Vfc2NhbGUpOworICByZXR1cm4gcmVzOworfQorCit2b2lkIFByb2dyZXNzQ29udHJvbDo6UmVjb25maWd1cmUoY29uc3QgcHA6OkltYWdlRGF0YSYgYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiYgaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRldmljZV9zY2FsZSkgeworICBEQ0hFQ0soaW1hZ2VzLnNpemUoKSAhPSAwKTsKKyAgaW1hZ2VzXyA9IGltYWdlczsKKyAgYmFja2dyb3VuZF8gPSBiYWNrZ3JvdW5kOworICBkZXZpY2Vfc2NhbGVfID0gZGV2aWNlX3NjYWxlOworICBwcDo6U2l6ZSBjdHJsX3NpemU7CisgIENhbGN1bGF0ZUxheW91dChvd25lcigpLT5HZXRJbnN0YW5jZSgpLCBpbWFnZXNfLCBiYWNrZ3JvdW5kXywgdGV4dF8sCisgICAgICBkZXZpY2Vfc2NhbGVfLCAmY3RybF9zaXplLCAmaW1hZ2VfcmNfLCAmdGV4dF9yY18pOworICBwcDo6UmVjdCByYyhwcDo6UG9pbnQoKSwgY3RybF9zaXplKTsKKyAgQ29udHJvbDo6U2V0UmVjdChyYywgZmFsc2UpOworICBQcmVwYXJlQmFja2dyb3VuZCgpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgUHJvZ3Jlc3NDb250cm9sOjpDYWxjdWxhdGVMYXlvdXQocHA6Okluc3RhbmNlKiBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4mIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHA6OkltYWdlRGF0YSYgYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRldmljZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OlNpemUqIGN0cmxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6OlJlY3QqIGltYWdlX3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6UmVjdCogdGV4dF9yYykgeworICBEQ0hFQ0soaW1hZ2VzLnNpemUoKSAhPSAwKTsKKyAgaW50IGltYWdlX3dpZHRoID0gMDsKKyAgaW50IGltYWdlX2hlaWdodCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1hZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgaW1hZ2Vfd2lkdGggPSBzdGQ6Om1heChpbWFnZV93aWR0aCwgaW1hZ2VzW2ldLnNpemUoKS53aWR0aCgpKTsKKyAgICBpbWFnZV9oZWlnaHQgPSBzdGQ6Om1heChpbWFnZV9oZWlnaHQsIGltYWdlc1tpXS5zaXplKCkuaGVpZ2h0KCkpOworICB9CisKKyAgcHA6OkZvbnREZXNjcmlwdGlvbl9EZXYgZGVzY3JpcHRpb247CisgIGRlc2NyaXB0aW9uLnNldF9mYW1pbHkoUFBfRk9OVEZBTUlMWV9TQU5TU0VSSUYpOworICBkZXNjcmlwdGlvbi5zZXRfc2l6ZShTY2FsZUludChrUHJvZ3Jlc3NUZXh0U2l6ZSwgZGV2aWNlX3NjYWxlKSk7CisgIGRlc2NyaXB0aW9uLnNldF93ZWlnaHQoUFBfRk9OVFdFSUdIVF9CT0xEKTsKKyAgcHA6OkZvbnRfRGV2IGZvbnQoaW5zdGFuY2UsIGRlc2NyaXB0aW9uKTsKKyAgaW50IHRleHRfbGVuZ3RoID0gZm9udC5NZWFzdXJlU2ltcGxlVGV4dCh0ZXh0KTsKKworICBwcDo6Rm9udERlc2NyaXB0aW9uX0RldiBkZXNjOworICBQUF9Gb250TWV0cmljc19EZXYgbWV0cmljczsKKyAgZm9udC5EZXNjcmliZSgmZGVzYywgJm1ldHJpY3MpOworICBpbnQgdGV4dF9oZWlnaHQgPSBtZXRyaWNzLmhlaWdodDsKKworICAqY3RybF9zaXplID0gcHA6OlNpemUoCisgICAgICBpbWFnZV93aWR0aCArIHRleHRfbGVuZ3RoICsKKyAgICAgIFNjYWxlSW50KGtJbWFnZVRleHRTcGFjaW5nICsga0xlZnRQYWRkaW5nICsga1JpZ2h0UGFkZGluZywgZGV2aWNlX3NjYWxlKSwKKyAgICAgIHN0ZDo6bWF4KGltYWdlX2hlaWdodCwgdGV4dF9oZWlnaHQpICsKKyAgICAgIFNjYWxlSW50KGtUb3BQYWRkaW5nICsga0JvdHRvbVBhZGRpbmcsIGRldmljZV9zY2FsZSkpOworCisgIGludCBvZmZzZXRfeCA9IDA7CisgIGludCBvZmZzZXRfeSA9IDA7CisgIGlmIChjdHJsX3NpemUtPndpZHRoKCkgPCBiYWNrZ3JvdW5kLnNpemUoKS53aWR0aCgpKSB7CisgICAgb2Zmc2V0X3ggKz0gKGJhY2tncm91bmQuc2l6ZSgpLndpZHRoKCkgLSBjdHJsX3NpemUtPndpZHRoKCkpIC8gMjsKKyAgICBjdHJsX3NpemUtPnNldF93aWR0aChiYWNrZ3JvdW5kLnNpemUoKS53aWR0aCgpKTsKKyAgfQorICBpZiAoY3RybF9zaXplLT5oZWlnaHQoKSA8IGJhY2tncm91bmQuc2l6ZSgpLmhlaWdodCgpKSB7CisgICAgb2Zmc2V0X3kgKz0gKGJhY2tncm91bmQuc2l6ZSgpLmhlaWdodCgpIC0gY3RybF9zaXplLT5oZWlnaHQoKSkgLyAyOworICAgIGN0cmxfc2l6ZS0+c2V0X2hlaWdodChiYWNrZ3JvdW5kLnNpemUoKS5oZWlnaHQoKSk7CisgIH0KKworICAqaW1hZ2VfcmMgPSBwcDo6UmVjdChTY2FsZUludChrTGVmdFBhZGRpbmcsIGRldmljZV9zY2FsZSkgKyBvZmZzZXRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVJbnQoa1RvcFBhZGRpbmcsIGRldmljZV9zY2FsZSkgKyBvZmZzZXRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2hlaWdodCk7CisKKyAgKnRleHRfcmMgPSBwcDo6UmVjdCgKKyAgICAgIGN0cmxfc2l6ZS0+d2lkdGgoKSAtIHRleHRfbGVuZ3RoIC0KKyAgICAgIFNjYWxlSW50KGtSaWdodFBhZGRpbmcsIGRldmljZV9zY2FsZSkgLSBvZmZzZXRfeCwKKyAgICAgIChjdHJsX3NpemUtPmhlaWdodCgpIC0gdGV4dF9oZWlnaHQpIC8gMiwKKyAgICAgIHRleHRfbGVuZ3RoLAorICAgICAgdGV4dF9oZWlnaHQpOworfQorCitzaXplX3QgUHJvZ3Jlc3NDb250cm9sOjpHZXRJbWFnZUluZ2V4KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PigocHJvZ3Jlc3NfIC8gMTAwLjApICogaW1hZ2VzXy5zaXplKCkpOworfQorCit2b2lkIFByb2dyZXNzQ29udHJvbDo6UGFpbnQocHA6OkltYWdlRGF0YSogaW1hZ2VfZGF0YSwgY29uc3QgcHA6OlJlY3QmIHJjKSB7CisgIGlmICghdmlzaWJsZSgpKQorICAgIHJldHVybjsKKworICBwcDo6UmVjdCBkcmF3X3JjID0gcmVjdCgpLkludGVyc2VjdChyYyk7CisgIGlmIChkcmF3X3JjLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgcHA6OkltYWdlRGF0YSBidWZmZXIob3duZXIoKS0+R2V0SW5zdGFuY2UoKSwgY3RybF9iYWNrZ3JvdW5kXy5mb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3RybF9iYWNrZ3JvdW5kXy5zaXplKCksIGZhbHNlKTsKKyAgQ29weUltYWdlKGN0cmxfYmFja2dyb3VuZF8sIHBwOjpSZWN0KGN0cmxfYmFja2dyb3VuZF8uc2l6ZSgpKSwKKyAgICAgICAgICAgICZidWZmZXIsIHBwOjpSZWN0KGN0cmxfYmFja2dyb3VuZF8uc2l6ZSgpKSwgZmFsc2UpOworCisgIHNpemVfdCBpbmRleCA9IEdldEltYWdlSW5nZXgoKTsKKyAgaWYgKGluZGV4ID49IGltYWdlc18uc2l6ZSgpKQorICAgIGluZGV4ID0gaW1hZ2VzXy5zaXplKCkgLSAxOworCisgIEFscGhhQmxlbmQoaW1hZ2VzX1tpbmRleF0sCisgICAgICAgICAgICAgcHA6OlJlY3QoaW1hZ2VzX1tpbmRleF0uc2l6ZSgpKSwKKyAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgIGltYWdlX3JjXy5wb2ludCgpLAorICAgICAgICAgICAgIGtPcGFxdWVBbHBoYSk7CisKKyAgcHA6OlJlY3QgaW1hZ2VfZHJhd19yYyhkcmF3X3JjKTsKKyAgaW1hZ2VfZHJhd19yYy5PZmZzZXQoLXJlY3QoKS54KCksIC1yZWN0KCkueSgpKTsKKyAgQWxwaGFCbGVuZChidWZmZXIsCisgICAgICAgICAgICAgaW1hZ2VfZHJhd19yYywKKyAgICAgICAgICAgICBpbWFnZV9kYXRhLAorICAgICAgICAgICAgIGRyYXdfcmMucG9pbnQoKSwKKyAgICAgICAgICAgICB0cmFuc3BhcmVuY3koKSk7Cit9CisKK3ZvaWQgUHJvZ3Jlc3NDb250cm9sOjpTZXRQcm9ncmVzcyhkb3VibGUgcHJvZ3Jlc3MpIHsKKyAgc2l6ZV90IG9sZF9pbmRleCA9IEdldEltYWdlSW5nZXgoKTsKKyAgcHJvZ3Jlc3NfID0gcHJvZ3Jlc3M7CisgIHNpemVfdCBuZXdfaW5kZXggPSBHZXRJbWFnZUluZ2V4KCk7CisgIGlmIChwcm9ncmVzc18gPj0ga0NvbXBsZXRlZCkgeworICAgIHByb2dyZXNzXyA9IGtDb21wbGV0ZWQ7CisgICAgb3duZXIoKS0+T25FdmVudChpZCgpLCBFVkVOVF9JRF9QUk9HUkVTU19DT01QTEVURUQsIE5VTEwpOworICB9CisgIGlmICh2aXNpYmxlKCkgJiYgb2xkX2luZGV4ICE9IG5ld19pbmRleCkKKyAgICBvd25lcigpLT5JbnZhbGlkYXRlKGlkKCksIHJlY3QoKSk7Cit9CisKK3ZvaWQgUHJvZ3Jlc3NDb250cm9sOjpQcmVwYXJlQmFja2dyb3VuZCgpIHsKKyAgQWRqdXN0QmFja2dyb3VuZCgpOworCisgIHBwOjpGb250RGVzY3JpcHRpb25fRGV2IGRlc2NyaXB0aW9uOworICBkZXNjcmlwdGlvbi5zZXRfZmFtaWx5KFBQX0ZPTlRGQU1JTFlfU0FOU1NFUklGKTsKKyAgZGVzY3JpcHRpb24uc2V0X3NpemUoU2NhbGVJbnQoa1Byb2dyZXNzVGV4dFNpemUsICBkZXZpY2Vfc2NhbGVfKSk7CisgIGRlc2NyaXB0aW9uLnNldF93ZWlnaHQoUFBfRk9OVFdFSUdIVF9CT0xEKTsKKyAgcHA6OkZvbnRfRGV2IGZvbnQob3duZXIoKS0+R2V0SW5zdGFuY2UoKSwgZGVzY3JpcHRpb24pOworCisgIHBwOjpGb250RGVzY3JpcHRpb25fRGV2IGRlc2M7CisgIFBQX0ZvbnRNZXRyaWNzX0RldiBtZXRyaWNzOworICBmb250LkRlc2NyaWJlKCZkZXNjLCAmbWV0cmljcyk7CisKKyAgcHA6OlBvaW50IHRleHRfb3JpZ2luID0gcHA6OlBvaW50KHRleHRfcmNfLngoKSwKKyAgICAgICh0ZXh0X3JjXy55KCkgKyB0ZXh0X3JjXy5ib3R0b20oKSArIG1ldHJpY3MueF9oZWlnaHQpIC8gMik7CisgIGZvbnQuRHJhd1RleHRBdCgmY3RybF9iYWNrZ3JvdW5kXywgcHA6OlRleHRSdW5fRGV2KHRleHRfKSwgdGV4dF9vcmlnaW4sCisgICAgICBrUHJvZ3Jlc3NUZXh0Q29sb3IsIHBwOjpSZWN0KGN0cmxfYmFja2dyb3VuZF8uc2l6ZSgpKSwgZmFsc2UpOworfQorCit2b2lkIFByb2dyZXNzQ29udHJvbDo6QWRqdXN0QmFja2dyb3VuZCgpIHsKKyAgY3RybF9iYWNrZ3JvdW5kXyA9IHBwOjpJbWFnZURhdGEob3duZXIoKS0+R2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBfSU1BR0VEQVRBRk9STUFUX0JHUkFfUFJFTVVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0KCkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgaWYgKHJlY3QoKS5zaXplKCkgPT0gYmFja2dyb3VuZF8uc2l6ZSgpKSB7CisgICAgQ29weUltYWdlKGJhY2tncm91bmRfLCBwcDo6UmVjdChiYWNrZ3JvdW5kXy5zaXplKCkpLAorICAgICAgICAmY3RybF9iYWNrZ3JvdW5kXywgcHA6OlJlY3QoY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkpLCBmYWxzZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gV2UgbmVlZCB0byBzdHJldGNoIGJhY2tncm91bmQgdG8gbmV3IGRpbWVudGlvbnMuIFRvIGRvIHNvLCB3ZSBzcGxpdAorICAvLyBiYWNrZ3JvdW5kIGludG8gOSBkaWZmZXJlbnQgcGFydHMuIFdlIGNvcHkgY29ybmVyIHJlY3RzICgxLDMsNyw5KSBhcyBpcywKKyAgLy8gc3RyZXRjaCByZWN0YW5nbGVzIGJldHdlZW4gY29ybmVycyAoMiw0LDYsOCkgaW4gMSBkaW1lbnRpb24sIGFuZAorICAvLyBzdHJldGNoIGNlbnRlciByZWN0ICg1KSBpbiAyIGRpbWVudGlvbnMuCisgIC8vICAgIHwtLS18LS0tfC0tLXwKKyAgLy8gICAgfCAxIHwgMiB8IDMgfAorICAvLyAgICB8LS0tfC0tLXwtLS18CisgIC8vICAgIHwgNCB8IDUgfCA2IHwKKyAgLy8gICAgfC0tLXwtLS18LS0tfAorICAvLyAgICB8IDcgfCA4IHwgOSB8CisgIC8vICAgIHwtLS18LS0tfC0tLXwKKyAgaW50IHNsaWNlX3ggPSBiYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAvIDM7CisgIGludCBzbGljZV95ID0gYmFja2dyb3VuZF8uc2l6ZSgpLmhlaWdodCgpIC8gMzsKKworICAvLyBDb3B5IHJlY3QgMQorICBwcDo6UmVjdCBzcmNfcmMoMCwgMCwgc2xpY2VfeCwgc2xpY2VfeSk7CisgIHBwOjpSZWN0IGRlc3RfcmMoMCwgMCwgc2xpY2VfeCwgc2xpY2VfeSk7CisgIENvcHlJbWFnZShiYWNrZ3JvdW5kXywgc3JjX3JjLCAmY3RybF9iYWNrZ3JvdW5kXywgZGVzdF9yYywgZmFsc2UpOworCisgIC8vIENvcHkgcmVjdCAzCisgIHNyY19yYy5zZXRfeChiYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAtIHNsaWNlX3gpOworICBkZXN0X3JjLnNldF94KGN0cmxfYmFja2dyb3VuZF8uc2l6ZSgpLndpZHRoKCkgLSBzbGljZV94KTsKKyAgQ29weUltYWdlKGJhY2tncm91bmRfLCBzcmNfcmMsICZjdHJsX2JhY2tncm91bmRfLCBkZXN0X3JjLCBmYWxzZSk7CisKKyAgLy8gQ29weSByZWN0IDkKKyAgc3JjX3JjLnNldF95KGJhY2tncm91bmRfLnNpemUoKS5oZWlnaHQoKSAtIHNsaWNlX3kpOworICBkZXN0X3JjLnNldF95KGN0cmxfYmFja2dyb3VuZF8uc2l6ZSgpLmhlaWdodCgpIC0gc2xpY2VfeSk7CisgIENvcHlJbWFnZShiYWNrZ3JvdW5kXywgc3JjX3JjLCAmY3RybF9iYWNrZ3JvdW5kXywgZGVzdF9yYywgZmFsc2UpOworCisgIC8vIENvcHkgcmVjdCA3CisgIHNyY19yYy5zZXRfeCgwKTsKKyAgZGVzdF9yYy5zZXRfeCgwKTsKKyAgQ29weUltYWdlKGJhY2tncm91bmRfLCBzcmNfcmMsICZjdHJsX2JhY2tncm91bmRfLCBkZXN0X3JjLCBmYWxzZSk7CisKKyAgLy8gU3RyZXRjaCByZWN0IDIKKyAgc3JjX3JjID0gcHA6OlJlY3QoCisgICAgICBzbGljZV94LCAwLCBiYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAtIDIgKiBzbGljZV94LCBzbGljZV95KTsKKyAgZGVzdF9yYyA9IHBwOjpSZWN0KAorICAgICAgc2xpY2VfeCwgMCwgY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAtIDIgKiBzbGljZV94LCBzbGljZV95KTsKKyAgQ29weUltYWdlKGJhY2tncm91bmRfLCBzcmNfcmMsICZjdHJsX2JhY2tncm91bmRfLCBkZXN0X3JjLCB0cnVlKTsKKworICAvLyBDb3B5IHJlY3QgOAorICBzcmNfcmMuc2V0X3koYmFja2dyb3VuZF8uc2l6ZSgpLmhlaWdodCgpIC0gc2xpY2VfeSk7CisgIGRlc3RfcmMuc2V0X3koY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkuaGVpZ2h0KCkgLSBzbGljZV95KTsKKyAgQ29weUltYWdlKGJhY2tncm91bmRfLCBzcmNfcmMsICZjdHJsX2JhY2tncm91bmRfLCBkZXN0X3JjLCB0cnVlKTsKKworICAvLyBTdHJldGNoIHJlY3QgNAorICBzcmNfcmMgPSBwcDo6UmVjdCgKKyAgICAgIDAsIHNsaWNlX3ksIHNsaWNlX3gsIGJhY2tncm91bmRfLnNpemUoKS5oZWlnaHQoKSAtIDIgKiBzbGljZV95KTsKKyAgZGVzdF9yYyA9IHBwOjpSZWN0KAorICAgICAgMCwgc2xpY2VfeSwgc2xpY2VfeCwgY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkuaGVpZ2h0KCkgLSAyICogc2xpY2VfeSk7CisgIENvcHlJbWFnZShiYWNrZ3JvdW5kXywgc3JjX3JjLCAmY3RybF9iYWNrZ3JvdW5kXywgZGVzdF9yYywgdHJ1ZSk7CisKKyAgLy8gQ29weSByZWN0IDYKKyAgc3JjX3JjLnNldF94KGJhY2tncm91bmRfLnNpemUoKS53aWR0aCgpIC0gc2xpY2VfeCk7CisgIGRlc3RfcmMuc2V0X3goY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAtIHNsaWNlX3gpOworICBDb3B5SW1hZ2UoYmFja2dyb3VuZF8sIHNyY19yYywgJmN0cmxfYmFja2dyb3VuZF8sIGRlc3RfcmMsIHRydWUpOworCisgIC8vIFN0cmV0Y2ggcmVjdCA1CisgIHNyY19yYyA9IHBwOjpSZWN0KHNsaWNlX3gsCisgICAgICAgICAgICAgICAgICAgIHNsaWNlX3ksCisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRfLnNpemUoKS53aWR0aCgpIC0gMiAqIHNsaWNlX3gsCisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRfLnNpemUoKS5oZWlnaHQoKSAtIDIgKiBzbGljZV95KTsKKyAgZGVzdF9yYyA9IHBwOjpSZWN0KHNsaWNlX3gsCisgICAgICAgICAgICAgICAgICAgICBzbGljZV95LAorICAgICAgICAgICAgICAgICAgICAgY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkud2lkdGgoKSAtIDIgKiBzbGljZV94LAorICAgICAgICAgICAgICAgICAgICAgY3RybF9iYWNrZ3JvdW5kXy5zaXplKCkuaGVpZ2h0KCkgLSAyICogc2xpY2VfeSk7CisgIENvcHlJbWFnZShiYWNrZ3JvdW5kXywgc3JjX3JjLCAmY3RybF9iYWNrZ3JvdW5kXywgZGVzdF9yYywgdHJ1ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvcHJvZ3Jlc3NfY29udHJvbC5oIGIveGZhX3Rlc3QvcGRmL3Byb2dyZXNzX2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ1ZGExCi0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3Byb2dyZXNzX2NvbnRyb2wuaApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBERl9QUk9HUkVTU19DT05UUk9MX0hfCisjZGVmaW5lIFBERl9QUk9HUkVTU19DT05UUk9MX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAicGRmL2NvbnRyb2wuaCIKKyNpbmNsdWRlICJwZGYvZmFkaW5nX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJwcGFwaS9jcHAvaW1hZ2VfZGF0YS5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NsYXNzIFByb2dyZXNzQ29udHJvbCA6IHB1YmxpYyBGYWRpbmdDb250cm9sIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBkb3VibGUga0NvbXBsZXRlZDsKKworICBlbnVtIFByb2dyZXNzRXZlbnRJZHMgeworICAgIEVWRU5UX0lEX1BST0dSRVNTX0NPTVBMRVRFRCwKKyAgfTsKKworICBQcm9ncmVzc0NvbnRyb2woKTsKKyAgdmlydHVhbCB+UHJvZ3Jlc3NDb250cm9sKCk7CisgIHZpcnR1YWwgYm9vbCBDcmVhdGVQcm9ncmVzc0NvbnRyb2wodWludDMyIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sOjpPd25lciogZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRldmljZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiYgaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpJbWFnZURhdGEmIGJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpOworICB2b2lkIFJlY29uZmlndXJlKGNvbnN0IHBwOjpJbWFnZURhdGEmIGJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4mIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICBmbG9hdCBkZXZpY2Vfc2NhbGUpOworCisgIHN0YXRpYyB2b2lkIENhbGN1bGF0ZUxheW91dChwcDo6SW5zdGFuY2UqIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8cHA6OkltYWdlRGF0YT4mIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwOjpJbWFnZURhdGEmIGJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRldmljZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwOjpTaXplKiBjdHJsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6UmVjdCogaW1hZ2VfcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcDo6UmVjdCogdGV4dF9yYyk7CisKKyAgLy8gQ29udHJvbCBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCBQYWludChwcDo6SW1hZ2VEYXRhKiBpbWFnZV9kYXRhLCBjb25zdCBwcDo6UmVjdCYgcmMpOworCisgIC8vIFByb2dyZXNzQ29udHJvbCBpbnRlcmZhY2UKKyAgLy8gU2V0IHByb2dyZXNzIGluZGljYXRvciBpbiBwZXJjZW50cyBmcm9tIDAlIHRvIDEwMCUuCisgIHZpcnR1YWwgdm9pZCBTZXRQcm9ncmVzcyhkb3VibGUgcHJvZ3Jlc3MpOworCisgcHJpdmF0ZToKKyAgdm9pZCBQcmVwYXJlQmFja2dyb3VuZCgpOworICB2b2lkIEFkanVzdEJhY2tncm91bmQoKTsKKyAgc2l6ZV90IEdldEltYWdlSW5nZXgoKSBjb25zdDsKKworICBkb3VibGUgcHJvZ3Jlc3NfOworICBmbG9hdCBkZXZpY2Vfc2NhbGVfOworICBzdGQ6OnZlY3RvcjxwcDo6SW1hZ2VEYXRhPiBpbWFnZXNfOworICBwcDo6SW1hZ2VEYXRhIGJhY2tncm91bmRfOworICBwcDo6SW1hZ2VEYXRhIGN0cmxfYmFja2dyb3VuZF87CisgIHN0ZDo6c3RyaW5nIHRleHRfOworICBwcDo6UmVjdCBpbWFnZV9yY187CisgIHBwOjpSZWN0IHRleHRfcmNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmICAvLyBQREZfUFJPR1JFU1NfQ09OVFJPTF9IXwpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3Jlc291cmNlLmggYi94ZmFfdGVzdC9wZGYvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmRiZWE3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhX3Rlc3QvcGRmL3Jlc291cmNlLmgKQEAgLTAsMCArMSwxNCBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBwZGYucmMKKworLy8gTmV4dCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG9iamVjdHMKKy8vCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAxCisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveGZhX3Rlc3QvcGRmL3Jlc291cmNlX2NvbnN0cy5oIGIveGZhX3Rlc3QvcGRmL3Jlc291cmNlX2NvbnN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmVmZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvcmVzb3VyY2VfY29uc3RzLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQREZfUkVTT1VSQ0VfUkVTT1VSQ0VfQ09OU1RTX0hfCisjZGVmaW5lIFBERl9SRVNPVVJDRV9SRVNPVVJDRV9DT05TVFNfSF8KKworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NvbnN0IGludCBrRHJhZ1RpbWVyTXMgPSA1MDsKK2NvbnN0IGRvdWJsZSBrTWluWm9vbSA9IDAuMTsKK2NvbnN0IGRvdWJsZSBrTWF4Wm9vbSA9IDEwLjA7Citjb25zdCBkb3VibGUga1pvb21TdGVwID0gMS4yOworCitjb25zdCB1aW50MzIga0ZhZGluZ1RpbWVvdXRNcyA9IDUwOworCitjb25zdCB1aW50MzIga1Rvb2xiYXJJZCA9IDEwOworY29uc3QgdWludDMyIGtUaHVtYm5haWxzSWQgPSAxMTsKK2NvbnN0IHVpbnQzMiBrUHJvZ3Jlc3NCYXJJZCA9IDEyOworY29uc3QgdWludDMyIGtQYWdlSW5kaWNhdG9ySWQgPSAxMzsKK2NvbnN0IHVpbnQzMiBrRml0VG9QYWdlQnV0dG9uSWQgPSAxMDA7Citjb25zdCB1aW50MzIga0ZpdFRvV2lkdGhCdXR0b25JZCA9IDEwMTsKK2NvbnN0IHVpbnQzMiBrWm9vbU91dEJ1dHRvbklkID0gMTAyOworY29uc3QgdWludDMyIGtab29tSW5CdXR0b25JZCA9IDEwMzsKK2NvbnN0IHVpbnQzMiBrU2F2ZUJ1dHRvbklkID0gMTA0OworY29uc3QgdWludDMyIGtQcmludEJ1dHRvbklkID0gMTA1OworCitjb25zdCB1aW50MzIga0F1dG9TY3JvbGxJZCA9IDIwMDsKKworLy8gZmFkaW5nX3JlY3QubGVmdCA9IGJ1dHRvbl9yZWN0LmxlZnQgLSBrVG9vbGJhckZhZGluZ09mZnNldExlZnQKK2NvbnN0IGludDMyIGtUb29sYmFyRmFkaW5nT2Zmc2V0TGVmdCA9IDQwOworLy8gZmFkaW5nX3JlY3QudG9wID0gYnV0dG9uX3JlY3QudG9wIC0ga1Rvb2xiYXJGYWRpbmdPZmZzZXRUb3AKK2NvbnN0IGludDMyIGtUb29sYmFyRmFkaW5nT2Zmc2V0VG9wID0gNDA7CisvLyBmYWRpbmdfcmVjdC5yaWdodCA9IGJ1dHRvbl9yZWN0LnJpZ2h0ICsga1Rvb2xiYXJGYWRpbmdPZmZzZXRSaWdodAorY29uc3QgaW50MzIga1Rvb2xiYXJGYWRpbmdPZmZzZXRSaWdodCA9IDEwOworLy8gZmFkaW5nX3JlY3QuYm90dG9tID0gYnV0dG9uX3JlY3QuYm90dG9tICsga1Rvb2xiYXJGYWRpbmdPZmZzZXRCb3R0b20KK2NvbnN0IGludDMyIGtUb29sYmFyRmFkaW5nT2Zmc2V0Qm90dG9tID0gODsKKworY29uc3QgaW50MzIga1Byb2dyZXNzT2Zmc2V0TGVmdCA9IDg7Citjb25zdCBpbnQzMiBrUHJvZ3Jlc3NPZmZzZXRCb3R0b20gPSA4OworCisvLyBXaWR0aCBvZiB0aGUgdGh1bWJuYWlscyBjb250cm9sLgorY29uc3QgaW50MzIga1RodW1ibmFpbHNXaWR0aCA9IDE5NjsKKworfSAgLy8gbmFtZXNwYWNlIGNocm9tZV9wZGYKKworI2VuZGlmICAvLyBQREZfUkVTT1VSQ0VfUkVTT1VSQ0VfQ09OU1RTX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvdGh1bWJuYWlsX2NvbnRyb2wuY2MgYi94ZmFfdGVzdC9wZGYvdGh1bWJuYWlsX2NvbnRyb2wuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3NzliMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3BkZi90aHVtYm5haWxfY29udHJvbC5jYwpAQCAtMCwwICsxLDMwMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInBkZi90aHVtYm5haWxfY29udHJvbC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmgiCisjaW5jbHVkZSAicGRmL2RyYXdfdXRpbHMuaCIKKyNpbmNsdWRlICJwZGYvbnVtYmVyX2ltYWdlX2dlbmVyYXRvci5oIgorCituYW1lc3BhY2UgY2hyb21lX3BkZiB7CisKK2NvbnN0IGludCBrTGVmdEJvcmRlclNpemUgPSA1MjsKK2NvbnN0IGludCBrQm9yZGVyU2l6ZSA9IDEyOworY29uc3QgaW50IGtIaWdobGlnaHRCb3JkZXJTaXplID0gMjsKKworY29uc3QgdWludDMyIGtMZWZ0Q29sb3IgPSAweDAwM0Y1MzdCOworY29uc3QgdWludDMyIGtSaWdodENvbG9yID0gMHg5OTBEMTYyNjsKKworY29uc3QgdWludDMyIGtUb3BIaWdobGlnaHRDb2xvciA9IDB4RkY0MjZEQzk7Citjb25zdCB1aW50MzIga0JvdHRvbUhpZ2hsaWdodENvbG9yID0gMHhGRjYzOTFERTsKK2NvbnN0IHVpbnQzMiBrVGh1bWJuYWlsQmFja2dyb3VuZENvbG9yID0gMHhGRjAwMDAwMDsKKworY29uc3QgdWludDMyIGtTbGlkaW5nVGltZW91dE1zID0gNTA7Citjb25zdCBpbnQzMiBrU2xpZGluZ1NoaWZ0ID0gNTA7CisKK2NvbnN0IGRvdWJsZSBrTm9uU2VsZWN0ZWRUaHVtYm5haWxBbHBoYSA9IDAuOTE7CisKK1RodW1ibmFpbENvbnRyb2w6OlRodW1ibmFpbENvbnRyb2woKQorICAgIDogZW5naW5lXyhOVUxMKSwgc2xpZGluZ193aWR0aF8oMCksIHNsaWRpbmdfc2hpZnRfKGtTbGlkaW5nU2hpZnQpLAorICAgICAgc2xpZGluZ190aW1lb3V0XyhrU2xpZGluZ1RpbWVvdXRNcyksIHNsaWRpbmdfdGltZXJfaWRfKDApIHsKK30KKworVGh1bWJuYWlsQ29udHJvbDo6flRodW1ibmFpbENvbnRyb2woKSB7CisgIENsZWFyQ2FjaGUoKTsKK30KKworYm9vbCBUaHVtYm5haWxDb250cm9sOjpDcmVhdGVUaHVtYm5haWxDb250cm9sKAorICAgIHVpbnQzMiBpZCwgY29uc3QgcHA6OlJlY3QmIHJjLAorICAgIGJvb2wgdmlzaWJsZSwgT3duZXIqIG93bmVyLCBQREZFbmdpbmUqIGVuZ2luZSwKKyAgICBOdW1iZXJJbWFnZUdlbmVyYXRvciogbnVtYmVyX2ltYWdlX2dlbmVyYXRvcikgeworICBlbmdpbmVfID0gZW5naW5lOworICBudW1iZXJfaW1hZ2VfZ2VuZXJhdG9yXyA9IG51bWJlcl9pbWFnZV9nZW5lcmF0b3I7CisgIHNsaWRpbmdfd2lkdGhfID0gcmMud2lkdGgoKTsKKworICByZXR1cm4gQ29udHJvbDo6Q3JlYXRlKGlkLCByYywgdmlzaWJsZSwgb3duZXIpOworfQorCit2b2lkIFRodW1ibmFpbENvbnRyb2w6OlNldFBvc2l0aW9uKGludCBwb3NpdGlvbiwgaW50IHRvdGFsLCBib29sIGludmFsaWRhdGUpIHsKKyAgdmlzaWJsZV9yZWN0XyA9IHBwOjpSZWN0KCk7CisgIHZpc2libGVfcGFnZXNfLmNsZWFyKCk7CisKKyAgaWYgKHJlY3QoKS53aWR0aCgpIDwga0xlZnRCb3JkZXJTaXplICsga0JvcmRlclNpemUpIHsKKyAgICByZXR1cm47ICAvLyBjb250cm9sIGlzIHRvbyBuYXJyb3cgdG8gc2hvdyB0aHVtYm5haWxzLgorICB9CisKKyAgaW50IG51bV9wYWdlcyA9IGVuZ2luZV8tPkdldE51bWJlck9mUGFnZXMoKTsKKworICBpbnQgbWF4X2RvY193aWR0aCA9IDAsIHRvdGFsX2RvY19oZWlnaHQgPSAwOworICBzdGQ6OnZlY3RvcjxwcDo6UmVjdD4gcGFnZV9zaXplcyhudW1fcGFnZXMpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wYWdlczsgKytpKSB7CisgICAgcGFnZV9zaXplc1tpXSA9IGVuZ2luZV8tPkdldFBhZ2VSZWN0KGkpOworICAgIG1heF9kb2Nfd2lkdGggPSBzdGQ6Om1heChtYXhfZG9jX3dpZHRoLCBwYWdlX3NpemVzW2ldLndpZHRoKCkpOworICAgIHRvdGFsX2RvY19oZWlnaHQgKz0gcGFnZV9zaXplc1tpXS5oZWlnaHQoKTsKKyAgfQorCisgIGlmICghbWF4X2RvY193aWR0aCkKKyAgICByZXR1cm47CisKKyAgaW50IG1heF90aHVtYm5haWxfd2lkdGggPSByZWN0KCkud2lkdGgoKSAtIGtMZWZ0Qm9yZGVyU2l6ZSAtIGtCb3JkZXJTaXplOworICBkb3VibGUgdGh1bWJuYWlsX3JhdGlvID0KKyAgICAgIG1heF90aHVtYm5haWxfd2lkdGggLyBzdGF0aWNfY2FzdDxkb3VibGU+KG1heF9kb2Nfd2lkdGgpOworCisgIGludCB0b3RhbF90aHVtYm5haWxfaGVpZ2h0ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcGFnZXM7ICsraSkgeworICAgIHRvdGFsX3RodW1ibmFpbF9oZWlnaHQgKz0ga0JvcmRlclNpemU7CisgICAgaW50IHRodW1ibmFpbF93aWR0aCA9CisgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFnZV9zaXplc1tpXS53aWR0aCgpICogdGh1bWJuYWlsX3JhdGlvKTsKKyAgICBpbnQgdGh1bWJuYWlsX2hlaWdodCA9CisgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFnZV9zaXplc1tpXS5oZWlnaHQoKSAqIHRodW1ibmFpbF9yYXRpbyk7CisgICAgaW50IHggPSAobWF4X3RodW1ibmFpbF93aWR0aCAtIHRodW1ibmFpbF93aWR0aCkgLyAyOworICAgIHBhZ2Vfc2l6ZXNbaV0gPQorICAgICAgICBwcDo6UmVjdCh4LCB0b3RhbF90aHVtYm5haWxfaGVpZ2h0LCB0aHVtYm5haWxfd2lkdGgsIHRodW1ibmFpbF9oZWlnaHQpOworICAgIHRvdGFsX3RodW1ibmFpbF9oZWlnaHQgKz0gdGh1bWJuYWlsX2hlaWdodDsKKyAgfQorICB0b3RhbF90aHVtYm5haWxfaGVpZ2h0ICs9IGtCb3JkZXJTaXplOworCisgIGludCB2aXNpYmxlX3kgPSAwOworICBpZiAodG90YWwgPiAwKSB7CisgICAgZG91YmxlIHJhbmdlID0gdG90YWxfdGh1bWJuYWlsX2hlaWdodCAtIHJlY3QoKS5oZWlnaHQoKTsKKyAgICBpZiAocmFuZ2UgPCAwKQorICAgICAgcmFuZ2UgPSAwOworICAgIHZpc2libGVfeSA9IHN0YXRpY19jYXN0PGludD4ocmFuZ2UgKiBwb3NpdGlvbiAvIHRvdGFsKTsKKyAgfQorICB2aXNpYmxlX3JlY3RfID0gcHA6OlJlY3QoMCwgdmlzaWJsZV95LCBtYXhfdGh1bWJuYWlsX3dpZHRoLCByZWN0KCkuaGVpZ2h0KCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyArK2kpIHsKKyAgICBpZiAocGFnZV9zaXplc1tpXS5JbnRlcnNlY3RzKHZpc2libGVfcmVjdF8pKSB7CisgICAgICBQYWdlSW5mbyBwYWdlX2luZm87CisgICAgICBwYWdlX2luZm8uaW5kZXggPSBpOworICAgICAgcGFnZV9pbmZvLnJlY3QgPSBwYWdlX3NpemVzW2ldOworICAgICAgcGFnZV9pbmZvLnJlY3QuT2Zmc2V0KGtMZWZ0Qm9yZGVyU2l6ZSwgLXZpc2libGVfcmVjdF8ueSgpKTsKKyAgICAgIHZpc2libGVfcGFnZXNfLnB1c2hfYmFjayhwYWdlX2luZm8pOworICAgIH0KKyAgfQorCisgIGlmIChpbnZhbGlkYXRlKQorICAgIG93bmVyKCktPkludmFsaWRhdGUoaWQoKSwgcmVjdCgpKTsKK30KKwordm9pZCBUaHVtYm5haWxDb250cm9sOjpTaG93KGJvb2wgdmlzaWJsZSwgYm9vbCBpbnZhbGlkYXRlKSB7CisgIGlmICghdmlzaWJsZSB8fCBpbnZhbGlkYXRlKQorICAgIENsZWFyQ2FjaGUoKTsKKyAgc2xpZGluZ193aWR0aF8gPSByZWN0KCkud2lkdGgoKTsKKyAgQ29udHJvbDo6U2hvdyh2aXNpYmxlLCBpbnZhbGlkYXRlKTsKK30KKwordm9pZCBUaHVtYm5haWxDb250cm9sOjpTbGlkZUluKCkgeworICBpZiAodmlzaWJsZSgpKQorICAgIHJldHVybjsKKworICBTaG93KHRydWUsIGZhbHNlKTsKKyAgc2xpZGluZ193aWR0aF8gPSAwOworICBzbGlkaW5nX3NoaWZ0XyA9IGtTbGlkaW5nU2hpZnQ7CisKKyAgc2xpZGluZ190aW1lcl9pZF8gPSBvd25lcigpLT5TY2hlZHVsZVRpbWVyKGlkKCksIHNsaWRpbmdfdGltZW91dF8pOworICBvd25lcigpLT5JbnZhbGlkYXRlKGlkKCksIHJlY3QoKSk7Cit9CisKK3ZvaWQgVGh1bWJuYWlsQ29udHJvbDo6U2xpZGVPdXQoKSB7CisgIGlmICghdmlzaWJsZSgpKQorICAgIHJldHVybjsKKyAgc2xpZGluZ19zaGlmdF8gPSAta1NsaWRpbmdTaGlmdDsKKyAgc2xpZGluZ190aW1lcl9pZF8gPSBvd25lcigpLT5TY2hlZHVsZVRpbWVyKGlkKCksIHNsaWRpbmdfdGltZW91dF8pOworfQorCit2b2lkIFRodW1ibmFpbENvbnRyb2w6OlBhaW50KHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsIGNvbnN0IHBwOjpSZWN0JiByYykgeworICBpZiAoIXZpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgcHA6OlJlY3QgY29udHJvbF9yYyhyZWN0KCkpOworICBjb250cm9sX3JjLk9mZnNldChjb250cm9sX3JjLndpZHRoKCkgLSBzbGlkaW5nX3dpZHRoXywgMCk7CisgIGNvbnRyb2xfcmMuc2V0X3dpZHRoKHNsaWRpbmdfd2lkdGhfKTsKKworICBwcDo6UmVjdCBkcmF3X3JjID0gcmMuSW50ZXJzZWN0KGNvbnRyb2xfcmMpOworICBpZiAoZHJhd19yYy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIHBwOjpSZWN0IGdyYWRpZW50X3JjKGNvbnRyb2xfcmMueCgpLCBkcmF3X3JjLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9yYy53aWR0aCgpLCBkcmF3X3JjLmhlaWdodCgpKTsKKyAgR3JhZGllbnRGaWxsKG93bmVyKCktPkdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICBpbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgZHJhd19yYywKKyAgICAgICAgICAgICAgIGdyYWRpZW50X3JjLAorICAgICAgICAgICAgICAga0xlZnRDb2xvciwKKyAgICAgICAgICAgICAgIGtSaWdodENvbG9yLAorICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSgpKTsKKworICBpbnQgc2VsZWN0ZWRfcGFnZSA9IGVuZ2luZV8tPkdldE1vc3RWaXNpYmxlUGFnZSgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZpc2libGVfcGFnZXNfLnNpemUoKTsgKytpKSB7CisgICAgcHA6OlJlY3QgcGFnZV9yYyA9IHZpc2libGVfcGFnZXNfW2ldLnJlY3Q7CisgICAgcGFnZV9yYy5PZmZzZXQoY29udHJvbF9yYy5wb2ludCgpKTsKKworICAgIGlmICh2aXNpYmxlX3BhZ2VzX1tpXS5pbmRleCA9PSBzZWxlY3RlZF9wYWdlKSB7CisgICAgICBwcDo6UmVjdCBoaWdobGlnaHRfcmMgPSBwYWdlX3JjOworICAgICAgaGlnaGxpZ2h0X3JjLkluc2V0KC1rSGlnaGxpZ2h0Qm9yZGVyU2l6ZSwgLWtIaWdobGlnaHRCb3JkZXJTaXplKTsKKyAgICAgIEdyYWRpZW50RmlsbChvd25lcigpLT5HZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgIGltYWdlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgZHJhd19yYywKKyAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRfcmMsCisgICAgICAgICAgICAgICAgICAga1RvcEhpZ2hsaWdodENvbG9yLAorICAgICAgICAgICAgICAgICAgIGtCb3R0b21IaWdobGlnaHRDb2xvciwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3koKSk7CisgICAgfQorCisgICAgcHA6OlJlY3QgZHJhd19wYWdlX3JjID0gcGFnZV9yYy5JbnRlcnNlY3QoZHJhd19yYyk7CisgICAgaWYgKGRyYXdfcGFnZV9yYy5Jc0VtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEZpcnN0IHNlYXJjaCBwYWdlIGltYWdlIGluIHRoZSBjYWNoZS4KKyAgICBwcDo6SW1hZ2VEYXRhKiB0aHVtYm5haWwgPSBOVUxMOworICAgIHN0ZDo6bWFwPGludCwgcHA6OkltYWdlRGF0YSo+OjppdGVyYXRvciBpdCA9CisgICAgICAgIGltYWdlX2NhY2hlXy5maW5kKHZpc2libGVfcGFnZXNfW2ldLmluZGV4KTsKKyAgICBpZiAoaXQgIT0gaW1hZ2VfY2FjaGVfLmVuZCgpKSB7CisgICAgICBpZiAoaXQtPnNlY29uZC0+c2l6ZSgpID09IHBhZ2VfcmMuc2l6ZSgpKQorICAgICAgICB0aHVtYm5haWwgPSBpbWFnZV9jYWNoZV9bdmlzaWJsZV9wYWdlc19baV0uaW5kZXhdOworICAgICAgZWxzZQorICAgICAgICBpbWFnZV9jYWNoZV8uZXJhc2UoaXQpOworICAgIH0KKworICAgIC8vIElmIHBhZ2UgaXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgY3JlYXRlIG5ldyBvbmUuCisgICAgaWYgKHRodW1ibmFpbCA9PSBOVUxMKSB7CisgICAgICB0aHVtYm5haWwgPSBuZXcgcHA6OkltYWdlRGF0YShvd25lcigpLT5HZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBfSU1BR0VEQVRBRk9STUFUX0JHUkFfUFJFTVVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9yYy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICBlbmdpbmVfLT5QYWludFRodW1ibmFpbCh0aHVtYm5haWwsIHZpc2libGVfcGFnZXNfW2ldLmluZGV4KTsKKworICAgICAgcHA6OkltYWdlRGF0YSBwYWdlX251bWJlcjsKKyAgICAgIG51bWJlcl9pbWFnZV9nZW5lcmF0b3JfLT5HZW5lcmF0ZUltYWdlKAorICAgICAgICAgIHZpc2libGVfcGFnZXNfW2ldLmluZGV4ICsgMSwgJnBhZ2VfbnVtYmVyKTsKKyAgICAgIHBwOjpQb2ludCBvcmlnaW4oCisgICAgICAgICAgKHRodW1ibmFpbC0+c2l6ZSgpLndpZHRoKCkgLSBwYWdlX251bWJlci5zaXplKCkud2lkdGgoKSkgLyAyLAorICAgICAgICAgICh0aHVtYm5haWwtPnNpemUoKS5oZWlnaHQoKSAtIHBhZ2VfbnVtYmVyLnNpemUoKS5oZWlnaHQoKSkgLyAyKTsKKworICAgICAgaWYgKG9yaWdpbi54KCkgPiAwICYmIG9yaWdpbi55KCkgPiAwKSB7CisgICAgICAgIEFscGhhQmxlbmQocGFnZV9udW1iZXIsIHBwOjpSZWN0KHBwOjpQb2ludCgpLCBwYWdlX251bWJlci5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbCwgb3JpZ2luLCBrT3BhcXVlQWxwaGEpOworICAgICAgfQorCisgICAgICBpbWFnZV9jYWNoZV9bdmlzaWJsZV9wYWdlc19baV0uaW5kZXhdID0gdGh1bWJuYWlsOworICAgIH0KKworICAgIHVpbnQ4IGFscGhhID0gdHJhbnNwYXJlbmN5KCk7CisgICAgaWYgKHZpc2libGVfcGFnZXNfW2ldLmluZGV4ICE9IHNlbGVjdGVkX3BhZ2UpCisgICAgICBhbHBoYSA9IHN0YXRpY19jYXN0PHVpbnQ4PihhbHBoYSAqIGtOb25TZWxlY3RlZFRodW1ibmFpbEFscGhhKTsKKyAgICBGaWxsUmVjdChpbWFnZV9kYXRhLCBkcmF3X3BhZ2VfcmMsIGtUaHVtYm5haWxCYWNrZ3JvdW5kQ29sb3IpOworICAgIGRyYXdfcGFnZV9yYy5PZmZzZXQoLXBhZ2VfcmMueCgpLCAtcGFnZV9yYy55KCkpOworICAgIEFscGhhQmxlbmQoKnRodW1ibmFpbCwgZHJhd19wYWdlX3JjLCBpbWFnZV9kYXRhLAorICAgICAgICBkcmF3X3BhZ2VfcmMucG9pbnQoKSArIHBhZ2VfcmMucG9pbnQoKSwgYWxwaGEpOworICB9Cit9CisKK2Jvb2wgVGh1bWJuYWlsQ29udHJvbDo6SGFuZGxlRXZlbnQoY29uc3QgcHA6OklucHV0RXZlbnQmIGV2ZW50KSB7CisgIGlmICghdmlzaWJsZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBwcDo6TW91c2VJbnB1dEV2ZW50IG1vdXNlX2V2ZW50KGV2ZW50KTsKKyAgaWYgKG1vdXNlX2V2ZW50LmlzX251bGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHBwOjpQb2ludCBwdCA9IG1vdXNlX2V2ZW50LkdldFBvc2l0aW9uKCk7CisgIGlmICghcmVjdCgpLkNvbnRhaW5zKHB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IG92ZXJfcGFnZSA9IC0xOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZpc2libGVfcGFnZXNfLnNpemUoKTsgKytpKSB7CisgICAgcHA6OlJlY3QgcGFnZV9yYyA9IHZpc2libGVfcGFnZXNfW2ldLnJlY3Q7CisgICAgcGFnZV9yYy5PZmZzZXQocmVjdCgpLnBvaW50KCkpOworICAgIGlmIChwYWdlX3JjLkNvbnRhaW5zKHB0KSkgeworICAgICAgb3Zlcl9wYWdlID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOworICBzd2l0Y2ggKGV2ZW50LkdldFR5cGUoKSkgeworICAgIGNhc2UgUFBfSU5QVVRFVkVOVF9UWVBFX01PVVNFTU9WRToKKyAgICAgIG93bmVyKCktPlNldEN1cnNvcihpZCgpLAorICAgICAgICAgIG92ZXJfcGFnZSA9PSAtMSA/IFBQX0NVUlNPUlRZUEVfUE9JTlRFUiA6IFBQX0NVUlNPUlRZUEVfSEFORCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQX0lOUFVURVZFTlRfVFlQRV9NT1VTRURPV046CisgICAgICBpZiAob3Zlcl9wYWdlICE9IC0xKSB7CisgICAgICAgIG93bmVyKCktPkludmFsaWRhdGUoaWQoKSwgcmVjdCgpKTsKKyAgICAgICAgb3duZXIoKS0+T25FdmVudChpZCgpLCBFVkVOVF9JRF9USFVNQk5BSUxfU0VMRUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGVfcGFnZXNfW292ZXJfcGFnZV0uaW5kZXgpOworICAgICAgfQorICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gaGFuZGxlZDsKK30KKwordm9pZCBUaHVtYm5haWxDb250cm9sOjpPblRpbWVyRmlyZWQodWludDMyIHRpbWVyX2lkKSB7CisgIGlmICh0aW1lcl9pZCA9PSBzbGlkaW5nX3RpbWVyX2lkXykgeworICAgIHNsaWRpbmdfd2lkdGhfICs9IHNsaWRpbmdfc2hpZnRfOworICAgIGlmIChzbGlkaW5nX3dpZHRoXyA8PSAwKSB7CisgICAgICAvLyBXZSBjb21wbGV0ZWx5IHNsaWRlZCBvdXQuIE1ha2UgY29udHJvbCBpbnZpc2libGUgbm93LgorICAgICAgU2hvdyhmYWxzZSwgZmFsc2UpOworICAgIH0gZWxzZSBpZiAoc2xpZGluZ193aWR0aF8gPj0gcmVjdCgpLndpZHRoKCkpIHsKKyAgICAgIC8vIFdlIGNvbXBsZXRlbHkgc2xpZGVkIGluLiBNYWtlIHNsaWRpbmcgd2lkdGggdG8gZnVsbCBjb250cm9sIHdpZHRoLgorICAgICAgc2xpZGluZ193aWR0aF8gPSByZWN0KCkud2lkdGgoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgaGF2ZSBub3QgY29tcGxldGVkIHNsaWRpbmcgeWV0LiBLZWVwIHNsaWRpbmcuCisgICAgICBzbGlkaW5nX3RpbWVyX2lkXyA9IG93bmVyKCktPlNjaGVkdWxlVGltZXIoaWQoKSwgc2xpZGluZ190aW1lb3V0Xyk7CisgICAgfQorICAgIG93bmVyKCktPkludmFsaWRhdGUoaWQoKSwgcmVjdCgpKTsKKyAgfQorfQorCit2b2lkIFRodW1ibmFpbENvbnRyb2w6OlJlc2V0RW5naW5lKFBERkVuZ2luZSogZW5naW5lKSB7CisgIGVuZ2luZV8gPSBlbmdpbmU7CisgIENsZWFyQ2FjaGUoKTsKK30KKwordm9pZCBUaHVtYm5haWxDb250cm9sOjpDbGVhckNhY2hlKCkgeworICBzdGQ6Om1hcDxpbnQsIHBwOjpJbWFnZURhdGEqPjo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBpbWFnZV9jYWNoZV8uYmVnaW4oKTsgaXQgIT0gaW1hZ2VfY2FjaGVfLmVuZCgpOyArK2l0KSB7CisgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgIH0KKyAgaW1hZ2VfY2FjaGVfLmNsZWFyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wZGYvdGh1bWJuYWlsX2NvbnRyb2wuaCBiL3hmYV90ZXN0L3BkZi90aHVtYm5haWxfY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGEzMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmFfdGVzdC9wZGYvdGh1bWJuYWlsX2NvbnRyb2wuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBERl9USFVNQk5BSUxfQ09OVFJPTF9IXworI2RlZmluZSBQREZfVEhVTUJOQUlMX0NPTlRST0xfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwZGYvY29udHJvbC5oIgorI2luY2x1ZGUgInBkZi9wZGZfZW5naW5lLmgiCisjaW5jbHVkZSAicHBhcGkvY3BwL2lucHV0X2V2ZW50LmgiCisKK25hbWVzcGFjZSBjaHJvbWVfcGRmIHsKKworY2xhc3MgTnVtYmVySW1hZ2VHZW5lcmF0b3I7CisKK2NsYXNzIFRodW1ibmFpbENvbnRyb2wgOiBwdWJsaWMgQ29udHJvbCB7CisgcHVibGljOgorICBlbnVtIFRodW1ibmFpbEV2ZW50SWRzIHsKKyAgICBFVkVOVF9JRF9USFVNQk5BSUxfU0VMRUNURUQgPSAxMDAsCisgIH07CisKKyAgZXhwbGljaXQgVGh1bWJuYWlsQ29udHJvbCgpOworICB2aXJ0dWFsIH5UaHVtYm5haWxDb250cm9sKCk7CisKKyAgLy8gU2V0cyBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB0aHVtbmFpbCBjb250cm9sLgorICB2b2lkIFNldFBvc2l0aW9uKGludCBwb3NpdGlvbiwgaW50IHRvdGFsLCBib29sIGludmFsaWRhdGUpOworICB2b2lkIFNsaWRlSW4oKTsKKyAgdm9pZCBTbGlkZU91dCgpOworCisgIHZpcnR1YWwgYm9vbCBDcmVhdGVUaHVtYm5haWxDb250cm9sKAorICAgICAgdWludDMyIGlkLCBjb25zdCBwcDo6UmVjdCYgcmMsCisgICAgICBib29sIHZpc2libGUsIE93bmVyKiBvd25lciwgUERGRW5naW5lKiBlbmdpbmUsCisgICAgICBOdW1iZXJJbWFnZUdlbmVyYXRvciogbnVtYmVyX2ltYWdlX2dlbmVyYXRvcik7CisKKyAgLy8gQ29udHJvbCBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCBTaG93KGJvb2wgdmlzaWJsZSwgYm9vbCBpbnZhbGlkYXRlKTsKKyAgdmlydHVhbCB2b2lkIFBhaW50KHBwOjpJbWFnZURhdGEqIGltYWdlX2RhdGEsIGNvbnN0IHBwOjpSZWN0JiByYyk7CisgIHZpcnR1YWwgYm9vbCBIYW5kbGVFdmVudChjb25zdCBwcDo6SW5wdXRFdmVudCYgZXZlbnQpOworICB2aXJ0dWFsIHZvaWQgT25UaW1lckZpcmVkKHVpbnQzMiB0aW1lcl9pZCk7CisKKyAgdmlydHVhbCB2b2lkIFJlc2V0RW5naW5lKFBERkVuZ2luZSogZW5naW5lKTsKKworIHByaXZhdGU6CisgIHZvaWQgQ2xlYXJDYWNoZSgpOworCisgIHN0cnVjdCBQYWdlSW5mbyB7CisgICAgaW50IGluZGV4OworICAgIHBwOjpSZWN0IHJlY3Q7CisgIH07CisKKyAgUERGRW5naW5lKiBlbmdpbmVfOworICBwcDo6UmVjdCB2aXNpYmxlX3JlY3RfOworICBzdGQ6OnZlY3RvcjxQYWdlSW5mbz4gdmlzaWJsZV9wYWdlc187CisgIHN0ZDo6bWFwPGludCwgcHA6OkltYWdlRGF0YSo+IGltYWdlX2NhY2hlXzsKKyAgaW50IHNsaWRpbmdfd2lkdGhfOworICBpbnQgc2xpZGluZ19zaGlmdF87CisgIGludCBzbGlkaW5nX3RpbWVvdXRfOworICB1aW50MzIgc2xpZGluZ190aW1lcl9pZF87CisgIE51bWJlckltYWdlR2VuZXJhdG9yKiBudW1iZXJfaW1hZ2VfZ2VuZXJhdG9yXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVfcGRmCisKKyNlbmRpZiAgLy8gUERGX1RIVU1CTkFJTF9DT05UUk9MX0hfCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wcm9jZXNzL3Byb2Nlc3MuY2MgYi94ZmFfdGVzdC9wcm9jZXNzL3Byb2Nlc3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmOTZkYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3Byb2Nlc3MvcHJvY2Vzcy5jYwpAQCAtMCwwICsxLDcxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorLy8gbWV0Og0KKy8vDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisvLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKy8vICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nDQorLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkDQorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisvLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQNCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorLy8NCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisNCisjaW5jbHVkZSA8djguaD4NCisNCisjaW5jbHVkZSA8c3RyaW5nPg0KKyNpbmNsdWRlIDxtYXA+DQorDQorI2lmZGVmIENPTVBSRVNTX1NUQVJUVVBfREFUQV9CWjINCisjZXJyb3IgVXNpbmcgY29tcHJlc3NlZCBzdGFydHVwIGRhdGEgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzYW1wbGUNCisjZW5kaWYNCisNCit1c2luZyBuYW1lc3BhY2Ugc3RkOw0KK3VzaW5nIG5hbWVzcGFjZSB2ODsNCisNCisvLyBUaGVzZSBpbnRlcmZhY2VzIHJlcHJlc2VudCBhbiBleGlzdGluZyByZXF1ZXN0IHByb2Nlc3NpbmcgaW50ZXJmYWNlLg0KKy8vIFRoZSBpZGVhIGlzIHRvIGltYWdpbmUgYSByZWFsIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGVzZSBpbnRlcmZhY2VzDQorLy8gYW5kIHRoZW4gYWRkIHNjcmlwdGluZyBjYXBhYmlsaXRpZXMgdGhhdCBhbGxvdyB5b3UgdG8gaW50ZXJhY3Qgd2l0aA0KKy8vIHRoZSBvYmplY3RzIHRocm91Z2ggSmF2YVNjcmlwdC4NCisNCisvKioNCisgKiBBIHNpbXBsaWZpZWQgaHR0cCByZXF1ZXN0Lg0KKyAqLw0KK2NsYXNzIEh0dHBSZXF1ZXN0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SHR0cFJlcXVlc3QoKSB7IH0NCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBQYXRoKCkgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIFJlZmVycmVyKCkgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEhvc3QoKSA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgVXNlckFnZW50KCkgPSAwOw0KK307DQorDQorDQorLyoqDQorICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgaHR0cCByZXF1ZXN0IHByb2Nlc3NvcnMuDQorICovDQorY2xhc3MgSHR0cFJlcXVlc3RQcm9jZXNzb3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5IdHRwUmVxdWVzdFByb2Nlc3NvcigpIHsgfQ0KKw0KKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIHByb2Nlc3Nvci4gIFRoZSBtYXAgY29udGFpbnMgb3B0aW9ucyB0aGF0IGNvbnRyb2wNCisgIC8vIGhvdyByZXF1ZXN0cyBzaG91bGQgYmUgcHJvY2Vzc2VkLg0KKyAgdmlydHVhbCBib29sIEluaXRpYWxpemUobWFwPHN0cmluZywgc3RyaW5nPiogb3B0aW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIG91dHB1dCkgPSAwOw0KKw0KKyAgLy8gUHJvY2VzcyBhIHNpbmdsZSByZXF1ZXN0Lg0KKyAgdmlydHVhbCBib29sIFByb2Nlc3MoSHR0cFJlcXVlc3QqIHJlcSkgPSAwOw0KKw0KKyAgc3RhdGljIHZvaWQgTG9nKGNvbnN0IGNoYXIqIGV2ZW50KTsNCit9Ow0KKw0KKw0KKy8qKg0KKyAqIEFuIGh0dHAgcmVxdWVzdCBwcm9jZXNzb3IgdGhhdCBpcyBzY3JpcHRhYmxlIHVzaW5nIEphdmFTY3JpcHQuDQorICovDQorY2xhc3MgSnNIdHRwUmVxdWVzdFByb2Nlc3NvciA6IHB1YmxpYyBIdHRwUmVxdWVzdFByb2Nlc3NvciB7DQorIHB1YmxpYzoNCisgIC8vIENyZWF0ZXMgYSBuZXcgcHJvY2Vzc29yIHRoYXQgcHJvY2Vzc2VzIHJlcXVlc3RzIGJ5IGludm9raW5nIHRoZQ0KKyAgLy8gUHJvY2VzcyBmdW5jdGlvbiBvZiB0aGUgSmF2YVNjcmlwdCBzY3JpcHQgZ2l2ZW4gYXMgYW4gYXJndW1lbnQuDQorICBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yKElzb2xhdGUqIGlzb2xhdGUsIEhhbmRsZTxTdHJpbmc+IHNjcmlwdCkNCisgICAgICA6IGlzb2xhdGVfKGlzb2xhdGUpLCBzY3JpcHRfKHNjcmlwdCkgeyB9DQorICB2aXJ0dWFsIH5Kc0h0dHBSZXF1ZXN0UHJvY2Vzc29yKCk7DQorDQorICB2aXJ0dWFsIGJvb2wgSW5pdGlhbGl6ZShtYXA8c3RyaW5nLCBzdHJpbmc+KiBvcHRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogb3V0cHV0KTsNCisgIHZpcnR1YWwgYm9vbCBQcm9jZXNzKEh0dHBSZXF1ZXN0KiByZXEpOw0KKw0KKyBwcml2YXRlOg0KKyAgLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2Nlc3NvciBhbmQgZXh0cmFjdCB0aGUNCisgIC8vIFByb2Nlc3MgZnVuY3Rpb24uICBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdWNjZWVkZWQsIG90aGVyd2lzZSBmYWxzZS4NCisgIGJvb2wgRXhlY3V0ZVNjcmlwdChIYW5kbGU8U3RyaW5nPiBzY3JpcHQpOw0KKw0KKyAgLy8gV3JhcCB0aGUgb3B0aW9ucyBhbmQgb3V0cHV0IG1hcCBpbiBhIEphdmFTY3JpcHQgb2JqZWN0cyBhbmQNCisgIC8vIGluc3RhbGwgaXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgYXMgJ29wdGlvbnMnIGFuZCAnb3V0cHV0Jy4NCisgIGJvb2wgSW5zdGFsbE1hcHMobWFwPHN0cmluZywgc3RyaW5nPiogb3B0cywgbWFwPHN0cmluZywgc3RyaW5nPiogb3V0cHV0KTsNCisNCisgIC8vIENvbnN0cnVjdHMgdGhlIHRlbXBsYXRlIHRoYXQgZGVzY3JpYmVzIHRoZSBKYXZhU2NyaXB0IHdyYXBwZXINCisgIC8vIHR5cGUgZm9yIHJlcXVlc3RzLg0KKyAgc3RhdGljIEhhbmRsZTxPYmplY3RUZW1wbGF0ZT4gTWFrZVJlcXVlc3RUZW1wbGF0ZShJc29sYXRlKiBpc29sYXRlKTsNCisgIHN0YXRpYyBIYW5kbGU8T2JqZWN0VGVtcGxhdGU+IE1ha2VNYXBUZW1wbGF0ZShJc29sYXRlKiBpc29sYXRlKTsNCisNCisgIC8vIENhbGxiYWNrcyB0aGF0IGFjY2VzcyB0aGUgaW5kaXZpZHVhbCBmaWVsZHMgb2YgcmVxdWVzdCBvYmplY3RzLg0KKyAgc3RhdGljIHZvaWQgR2V0UGF0aChMb2NhbDxTdHJpbmc+IG5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5Q2FsbGJhY2tJbmZvPFZhbHVlPiYgaW5mbyk7DQorICBzdGF0aWMgdm9pZCBHZXRSZWZlcnJlcihMb2NhbDxTdHJpbmc+IG5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eUNhbGxiYWNrSW5mbzxWYWx1ZT4mIGluZm8pOw0KKyAgc3RhdGljIHZvaWQgR2V0SG9zdChMb2NhbDxTdHJpbmc+IG5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5Q2FsbGJhY2tJbmZvPFZhbHVlPiYgaW5mbyk7DQorICBzdGF0aWMgdm9pZCBHZXRVc2VyQWdlbnQoTG9jYWw8U3RyaW5nPiBuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5Q2FsbGJhY2tJbmZvPFZhbHVlPiYgaW5mbyk7DQorDQorICAvLyBDYWxsYmFja3MgdGhhdCBhY2Nlc3MgbWFwcw0KKyAgc3RhdGljIHZvaWQgTWFwR2V0KExvY2FsPFN0cmluZz4gbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eUNhbGxiYWNrSW5mbzxWYWx1ZT4mIGluZm8pOw0KKyAgc3RhdGljIHZvaWQgTWFwU2V0KExvY2FsPFN0cmluZz4gbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBMb2NhbDxWYWx1ZT4gdmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydHlDYWxsYmFja0luZm88VmFsdWU+JiBpbmZvKTsNCisNCisgIC8vIFV0aWxpdHkgbWV0aG9kcyBmb3Igd3JhcHBpbmcgQysrIG9iamVjdHMgYXMgSmF2YVNjcmlwdCBvYmplY3RzLA0KKyAgLy8gYW5kIGdvaW5nIGJhY2sgYWdhaW4uDQorICBIYW5kbGU8T2JqZWN0PiBXcmFwTWFwKG1hcDxzdHJpbmcsIHN0cmluZz4qIG9iaik7DQorICBzdGF0aWMgbWFwPHN0cmluZywgc3RyaW5nPiogVW53cmFwTWFwKEhhbmRsZTxPYmplY3Q+IG9iaik7DQorICBIYW5kbGU8T2JqZWN0PiBXcmFwUmVxdWVzdChIdHRwUmVxdWVzdCogb2JqKTsNCisgIHN0YXRpYyBIdHRwUmVxdWVzdCogVW53cmFwUmVxdWVzdChIYW5kbGU8T2JqZWN0PiBvYmopOw0KKw0KKyAgSXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIGlzb2xhdGVfOyB9DQorDQorICBJc29sYXRlKiBpc29sYXRlXzsNCisgIEhhbmRsZTxTdHJpbmc+IHNjcmlwdF87DQorICBQZXJzaXN0ZW50PENvbnRleHQ+IGNvbnRleHRfOw0KKyAgUGVyc2lzdGVudDxGdW5jdGlvbj4gcHJvY2Vzc187DQorICBzdGF0aWMgUGVyc2lzdGVudDxPYmplY3RUZW1wbGF0ZT4gcmVxdWVzdF90ZW1wbGF0ZV87DQorICBzdGF0aWMgUGVyc2lzdGVudDxPYmplY3RUZW1wbGF0ZT4gbWFwX3RlbXBsYXRlXzsNCit9Ow0KKw0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyAtLS0gUCByIG8gYyBlIHMgcyBvIHIgLS0tDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKw0KK3N0YXRpYyB2b2lkIExvZ0NhbGxiYWNrKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBhcmdzKSB7DQorICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpIHJldHVybjsNCisgIEhhbmRsZVNjb3BlIHNjb3BlKGFyZ3MuR2V0SXNvbGF0ZSgpKTsNCisgIEhhbmRsZTxWYWx1ZT4gYXJnID0gYXJnc1swXTsNCisgIFN0cmluZzo6VXRmOFZhbHVlIHZhbHVlKGFyZyk7DQorICBIdHRwUmVxdWVzdFByb2Nlc3Nvcjo6TG9nKCp2YWx1ZSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIE1ldGhvZENhbGxiYWNrKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBhcmdzKSB7DQorCWlmIChhcmdzLkxlbmd0aCgpIDwgMSkgcmV0dXJuOw0KKwlIYW5kbGVTY29wZSBzY29wZShhcmdzLkdldElzb2xhdGUoKSk7DQorCUhhbmRsZTxWYWx1ZT4gYXJnID0gYXJnc1swXTsNCisJU3RyaW5nOjpVdGY4VmFsdWUgdmFsdWUoYXJnKTsNCisJSHR0cFJlcXVlc3RQcm9jZXNzb3I6OkxvZygqdmFsdWUpOw0KK30NCisNCitzdGF0aWMgdm9pZCBNeUpTT2JqZWN0Q2FsbGJhY2soY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGFyZ3MpIHsNCisNCisJSGFuZGxlU2NvcGUgc2NvcGUoYXJncy5HZXRJc29sYXRlKCkpOw0KKwlpZihhcmdzLklzQ29uc3RydWN0Q2FsbCgpKQ0KKwl7DQorCQkvL2FyZ3MuR2V0UmV0dXJuVmFsdWUoKS5TZXQoU3RyaW5nOjpOZXdGcm9tVXRmOCgNCisJCS8vCWFyZ3MuR2V0SXNvbGF0ZSgpLCAiSGVsbG9Xb3JsZCIsIFN0cmluZzo6a05vcm1hbFN0cmluZywNCisJCS8vCXN0YXRpY19jYXN0PGludD4oMTApKSk7DQorCQlhcmdzLlRoaXMoKTsNCisJfQ0KK30NCisNCit2b2lkIEdldHRlcigNCisJTG9jYWw8U3RyaW5nPiBwcm9wZXJ0eSwNCisJY29uc3QgUHJvcGVydHlDYWxsYmFja0luZm88VmFsdWU+JiBpbmZvKQ0KK3sNCisvLyAJaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKy8vIAkJaW5mby5HZXRJc29sYXRlKCksICJIZWxsb1dvcmxkIiwgU3RyaW5nOjprTm9ybWFsU3RyaW5nLA0KKy8vIAkJc3RhdGljX2Nhc3Q8aW50PigxMCkpKTsNCit9DQorDQorDQorLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IGFuZCBmZXRjaCB0aGUgUHJvY2VzcyBtZXRob2QuDQorYm9vbCBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpJbml0aWFsaXplKG1hcDxzdHJpbmcsIHN0cmluZz4qIG9wdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIG91dHB1dCkgew0KKyAgLy8gQ3JlYXRlIGEgaGFuZGxlIHNjb3BlIHRvIGhvbGQgdGhlIHRlbXBvcmFyeSByZWZlcmVuY2VzLg0KKyAgSGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKEdldElzb2xhdGUoKSk7DQorDQorICAvLyBDcmVhdGUgYSB0ZW1wbGF0ZSBmb3IgdGhlIGdsb2JhbCBvYmplY3Qgd2hlcmUgd2Ugc2V0IHRoZQ0KKyAgLy8gYnVpbHQtaW4gZ2xvYmFsIGZ1bmN0aW9ucy4NCisgIEhhbmRsZTxPYmplY3RUZW1wbGF0ZT4gZ2xvYmFsID0gT2JqZWN0VGVtcGxhdGU6Ok5ldyhHZXRJc29sYXRlKCkpOw0KKyAgZ2xvYmFsLT5TZXQoU3RyaW5nOjpOZXdGcm9tVXRmOChHZXRJc29sYXRlKCksICJsb2ciKSwNCisgICAgICAgICAgICAgIEZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhHZXRJc29sYXRlKCksIExvZ0NhbGxiYWNrKSk7DQorDQorDQorLy8gICBMb2NhbDxGdW5jdGlvblRlbXBsYXRlPiBmdW5KU09iaiA9IEZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhHZXRJc29sYXRlKCksIE15SlNPYmplY3RDYWxsYmFjayk7DQorLy8gICBmdW5KU09iai0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRBY2Nlc3NvcihTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgImFjdGl2ZURvY3MiKSwgR2V0dGVyLCAwLCBIYW5kbGU8VmFsdWU+KCksIEFMTF9DQU5fUkVBRHxQUk9ISUJJVFNfT1ZFUldSSVRJTkcpOw0KKy8vICAgZnVuSlNPYmotPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0KFN0cmluZzo6TmV3RnJvbVV0ZjgoR2V0SXNvbGF0ZSgpLCAibWV0aG9kMSIpLEZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhHZXRJc29sYXRlKCksIE1ldGhvZENhbGxiYWNrKSk7DQorLy8gDQorLy8gICBnbG9iYWwtPlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgImFwcCIpLCBmdW5KU09iaik7DQorDQorICAvLyBFYWNoIHByb2Nlc3NvciBnZXRzIGl0cyBvd24gY29udGV4dCBzbyBkaWZmZXJlbnQgcHJvY2Vzc29ycyBkb24ndA0KKyAgLy8gYWZmZWN0IGVhY2ggb3RoZXIuIENvbnRleHQ6Ok5ldyByZXR1cm5zIGEgcGVyc2lzdGVudCBoYW5kbGUgd2hpY2gNCisgIC8vIGlzIHdoYXQgd2UgbmVlZCBmb3IgdGhlIHJlZmVyZW5jZSB0byByZW1haW4gYWZ0ZXIgd2UgcmV0dXJuIGZyb20NCisgIC8vIHRoaXMgbWV0aG9kLiBUaGF0IHBlcnNpc3RlbnQgaGFuZGxlIGhhcyB0byBiZSBkaXNwb3NlZCBpbiB0aGUNCisgIC8vIGRlc3RydWN0b3IuDQorICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gQ29udGV4dDo6TmV3KEdldElzb2xhdGUoKSwgTlVMTCwgZ2xvYmFsKTsNCisgIGNvbnRleHRfLlJlc2V0KEdldElzb2xhdGUoKSwgY29udGV4dCk7DQorDQorICAvLyBFbnRlciB0aGUgbmV3IGNvbnRleHQgc28gYWxsIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB0YWtlIHBsYWNlDQorICAvLyB3aXRoaW4gaXQuDQorICBDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOw0KKw0KKyAgTG9jYWw8T2JqZWN0VGVtcGxhdGU+IE9ialRlbXAgPSBPYmplY3RUZW1wbGF0ZTo6TmV3KEdldElzb2xhdGUoKSk7DQorICBPYmpUZW1wLT5TZXRBY2Nlc3NvcihTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgImFjdGl2ZURvY3MiKSwgR2V0dGVyLCAwLCBIYW5kbGU8VmFsdWU+KCksIFBST0hJQklUU19PVkVSV1JJVElORyk7DQorICBMb2NhbDxPYmplY3Q+IGlucyA9ICBPYmpUZW1wLT5OZXdJbnN0YW5jZSgpOw0KKyAgY29udGV4dC0+R2xvYmFsKCktPlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgImFwcCIpLCBpbnMpOw0KKw0KKw0KKyAgLy8gTWFrZSB0aGUgb3B0aW9ucyBtYXBwaW5nIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGNvbnRleHQNCisgIGlmICghSW5zdGFsbE1hcHMob3B0cywgb3V0cHV0KSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgLy8gQ29tcGlsZSBhbmQgcnVuIHRoZSBzY3JpcHQNCisgIGlmICghRXhlY3V0ZVNjcmlwdChzY3JpcHRfKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgLy8gVGhlIHNjcmlwdCBjb21waWxlZCBhbmQgcmFuIGNvcnJlY3RseS4gIE5vdyB3ZSBmZXRjaCBvdXQgdGhlDQorICAvLyBQcm9jZXNzIGZ1bmN0aW9uIGZyb20gdGhlIGdsb2JhbCBvYmplY3QuDQorICBIYW5kbGU8U3RyaW5nPiBwcm9jZXNzX25hbWUgPSBTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgIlByb2Nlc3MiKTsNCisgIEhhbmRsZTxWYWx1ZT4gcHJvY2Vzc192YWwgPSBjb250ZXh0LT5HbG9iYWwoKS0+R2V0KHByb2Nlc3NfbmFtZSk7DQorDQorICAvLyBJZiB0aGVyZSBpcyBubyBQcm9jZXNzIGZ1bmN0aW9uLCBvciBpZiBpdCBpcyBub3QgYSBmdW5jdGlvbiwNCisgIC8vIGJhaWwgb3V0DQorICBpZiAoIXByb2Nlc3NfdmFsLT5Jc0Z1bmN0aW9uKCkpIHJldHVybiBmYWxzZTsNCisNCisgIC8vIEl0IGlzIGEgZnVuY3Rpb247IGNhc3QgaXQgdG8gYSBGdW5jdGlvbg0KKyAgSGFuZGxlPEZ1bmN0aW9uPiBwcm9jZXNzX2Z1biA9IEhhbmRsZTxGdW5jdGlvbj46OkNhc3QocHJvY2Vzc192YWwpOw0KKw0KKyAgLy8gU3RvcmUgdGhlIGZ1bmN0aW9uIGluIGEgUGVyc2lzdGVudCBoYW5kbGUsIHNpbmNlIHdlIGFsc28gd2FudA0KKyAgLy8gdGhhdCB0byByZW1haW4gYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMNCisgIHByb2Nlc3NfLlJlc2V0KEdldElzb2xhdGUoKSwgcHJvY2Vzc19mdW4pOw0KKw0KKyAgLy8gQWxsIGRvbmU7IGFsbCB3ZW50IHdlbGwNCisgIHJldHVybiB0cnVlOw0KK30NCisNCisNCitib29sIEpzSHR0cFJlcXVlc3RQcm9jZXNzb3I6OkV4ZWN1dGVTY3JpcHQoSGFuZGxlPFN0cmluZz4gc2NyaXB0KSB7DQorICBIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsNCisNCisgIC8vIFdlJ3JlIGp1c3QgYWJvdXQgdG8gY29tcGlsZSB0aGUgc2NyaXB0OyBzZXQgdXAgYW4gZXJyb3IgaGFuZGxlciB0bw0KKyAgLy8gY2F0Y2ggYW55IGV4Y2VwdGlvbnMgdGhlIHNjcmlwdCBtaWdodCB0aHJvdy4NCisgIFRyeUNhdGNoIHRyeV9jYXRjaDsNCisNCisgIC8vIENvbXBpbGUgdGhlIHNjcmlwdCBhbmQgY2hlY2sgZm9yIGVycm9ycy4NCisgIEhhbmRsZTxTY3JpcHQ+IGNvbXBpbGVkX3NjcmlwdCA9IFNjcmlwdDo6Q29tcGlsZShzY3JpcHQpOw0KKyAgaWYgKGNvbXBpbGVkX3NjcmlwdC5Jc0VtcHR5KCkpIHsNCisgICAgU3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsNCisgICAgTG9nKCplcnJvcik7DQorICAgIC8vIFRoZSBzY3JpcHQgZmFpbGVkIHRvIGNvbXBpbGU7IGJhaWwgb3V0Lg0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvLyBSdW4gdGhlIHNjcmlwdCENCisgIEhhbmRsZTxWYWx1ZT4gcmVzdWx0ID0gY29tcGlsZWRfc2NyaXB0LT5SdW4oKTsNCisgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7DQorICAgIC8vIFRoZSBUcnlDYXRjaCBhYm92ZSBpcyBzdGlsbCBpbiBlZmZlY3QgYW5kIHdpbGwgaGF2ZSBjYXVnaHQgdGhlIGVycm9yLg0KKyAgICBTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcih0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOw0KKyAgICBMb2coKmVycm9yKTsNCisgICAgLy8gUnVubmluZyB0aGUgc2NyaXB0IGZhaWxlZDsgYmFpbCBvdXQuDQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCisNCitib29sIEpzSHR0cFJlcXVlc3RQcm9jZXNzb3I6Okluc3RhbGxNYXBzKG1hcDxzdHJpbmcsIHN0cmluZz4qIG9wdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiBvdXRwdXQpIHsNCisgIEhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOw0KKw0KKyAgLy8gV3JhcCB0aGUgbWFwIG9iamVjdCBpbiBhIEphdmFTY3JpcHQgd3JhcHBlcg0KKyAgSGFuZGxlPE9iamVjdD4gb3B0c19vYmogPSBXcmFwTWFwKG9wdHMpOw0KKw0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0NCisgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoR2V0SXNvbGF0ZSgpLCBjb250ZXh0Xyk7DQorDQorICAvLyBTZXQgdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGEgcHJvcGVydHkgb24gdGhlIGdsb2JhbCBvYmplY3QuDQorICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0KFN0cmluZzo6TmV3RnJvbVV0ZjgoR2V0SXNvbGF0ZSgpLCAib3B0aW9ucyIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzX29iaik7DQorDQorICBIYW5kbGU8T2JqZWN0PiBvdXRwdXRfb2JqID0gV3JhcE1hcChvdXRwdXQpOw0KKyAgY29udGV4dC0+R2xvYmFsKCktPlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgIm91dHB1dCIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfb2JqKTsNCisNCisgIHJldHVybiB0cnVlOw0KK30NCisNCisNCitib29sIEpzSHR0cFJlcXVlc3RQcm9jZXNzb3I6OlByb2Nlc3MoSHR0cFJlcXVlc3QqIHJlcXVlc3QpIHsNCisgIC8vIENyZWF0ZSBhIGhhbmRsZSBzY29wZSB0byBrZWVwIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0IHJlZmVyZW5jZXMuDQorICBIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsNCisNCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KEdldElzb2xhdGUoKSwgY29udGV4dF8pOw0KKw0KKyAgLy8gRW50ZXIgdGhpcyBwcm9jZXNzb3IncyBjb250ZXh0IHNvIGFsbCB0aGUgcmVtYWluaW5nIG9wZXJhdGlvbnMNCisgIC8vIHRha2UgcGxhY2UgdGhlcmUNCisgIENvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7DQorDQorICAvLyBXcmFwIHRoZSBDKysgcmVxdWVzdCBvYmplY3QgaW4gYSBKYXZhU2NyaXB0IHdyYXBwZXINCisgIEhhbmRsZTxPYmplY3Q+IHJlcXVlc3Rfb2JqID0gV3JhcFJlcXVlc3QocmVxdWVzdCk7DQorDQorICAvLyBTZXQgdXAgYW4gZXhjZXB0aW9uIGhhbmRsZXIgYmVmb3JlIGNhbGxpbmcgdGhlIFByb2Nlc3MgZnVuY3Rpb24NCisgIFRyeUNhdGNoIHRyeV9jYXRjaDsNCisNCisgIC8vIEludm9rZSB0aGUgcHJvY2VzcyBmdW5jdGlvbiwgZ2l2aW5nIHRoZSBnbG9iYWwgb2JqZWN0IGFzICd0aGlzJw0KKyAgLy8gYW5kIG9uZSBhcmd1bWVudCwgdGhlIHJlcXVlc3QuDQorICBjb25zdCBpbnQgYXJnYyA9IDE7DQorICBIYW5kbGU8VmFsdWU+IGFyZ3ZbYXJnY10gPSB7IHJlcXVlc3Rfb2JqIH07DQorICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBwcm9jZXNzID0NCisgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6TmV3KEdldElzb2xhdGUoKSwgcHJvY2Vzc18pOw0KKyAgSGFuZGxlPFZhbHVlPiByZXN1bHQgPSBwcm9jZXNzLT5DYWxsKGNvbnRleHQtPkdsb2JhbCgpLCBhcmdjLCBhcmd2KTsNCisgIGlmIChyZXN1bHQuSXNFbXB0eSgpKSB7DQorICAgIFN0cmluZzo6VXRmOFZhbHVlIGVycm9yKHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7DQorICAgIExvZygqZXJyb3IpOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCit9DQorDQorDQorSnNIdHRwUmVxdWVzdFByb2Nlc3Nvcjo6fkpzSHR0cFJlcXVlc3RQcm9jZXNzb3IoKSB7DQorICAvLyBEaXNwb3NlIHRoZSBwZXJzaXN0ZW50IGhhbmRsZXMuICBXaGVuIG5vb25lIGVsc2UgaGFzIGFueQ0KKyAgLy8gcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyBzdG9yZWQgaW4gdGhlIGhhbmRsZXMgdGhleSB3aWxsIGJlDQorICAvLyBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZC4NCisgIGNvbnRleHRfLlJlc2V0KCk7DQorICBwcm9jZXNzXy5SZXNldCgpOw0KK30NCisNCisNCitQZXJzaXN0ZW50PE9iamVjdFRlbXBsYXRlPiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpyZXF1ZXN0X3RlbXBsYXRlXzsNCitQZXJzaXN0ZW50PE9iamVjdFRlbXBsYXRlPiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjptYXBfdGVtcGxhdGVfOw0KKw0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gLS0tIEEgYyBjIGUgcyBzIGkgbiBnICAgTSBhIHAgcyAtLS0NCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8vIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCB3cmFwcyBhIEMrKyBodHRwIHJlcXVlc3Qgb2JqZWN0IGluIGENCisvLyBKYXZhU2NyaXB0IG9iamVjdC4NCitIYW5kbGU8T2JqZWN0PiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpXcmFwTWFwKG1hcDxzdHJpbmcsIHN0cmluZz4qIG9iaikgew0KKyAgLy8gSGFuZGxlIHNjb3BlIGZvciB0ZW1wb3JhcnkgaGFuZGxlcy4NCisgIEVzY2FwYWJsZUhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOw0KKw0KKyAgLy8gRmV0Y2ggdGhlIHRlbXBsYXRlIGZvciBjcmVhdGluZyBKYXZhU2NyaXB0IG1hcCB3cmFwcGVycy4NCisgIC8vIEl0IG9ubHkgaGFzIHRvIGJlIGNyZWF0ZWQgb25jZSwgd2hpY2ggd2UgZG8gb24gZGVtYW5kLg0KKyAgaWYgKG1hcF90ZW1wbGF0ZV8uSXNFbXB0eSgpKSB7DQorICAgIEhhbmRsZTxPYmplY3RUZW1wbGF0ZT4gcmF3X3RlbXBsYXRlID0gTWFrZU1hcFRlbXBsYXRlKEdldElzb2xhdGUoKSk7DQorICAgIG1hcF90ZW1wbGF0ZV8uUmVzZXQoR2V0SXNvbGF0ZSgpLCByYXdfdGVtcGxhdGUpOw0KKyAgfQ0KKyAgSGFuZGxlPE9iamVjdFRlbXBsYXRlPiB0ZW1wbCA9DQorICAgICAgTG9jYWw8T2JqZWN0VGVtcGxhdGU+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtYXBfdGVtcGxhdGVfKTsNCisNCisgIC8vIENyZWF0ZSBhbiBlbXB0eSBtYXAgd3JhcHBlci4NCisgIExvY2FsPE9iamVjdD4gcmVzdWx0ID0gdGVtcGwtPk5ld0luc3RhbmNlKCk7DQorDQorICAvLyBXcmFwIHRoZSByYXcgQysrIHBvaW50ZXIgaW4gYW4gRXh0ZXJuYWwgc28gaXQgY2FuIGJlIHJlZmVyZW5jZWQNCisgIC8vIGZyb20gd2l0aGluIEphdmFTY3JpcHQuDQorICBIYW5kbGU8RXh0ZXJuYWw+IG1hcF9wdHIgPSBFeHRlcm5hbDo6TmV3KEdldElzb2xhdGUoKSwgb2JqKTsNCisNCisgIC8vIFN0b3JlIHRoZSBtYXAgcG9pbnRlciBpbiB0aGUgSmF2YVNjcmlwdCB3cmFwcGVyLg0KKyAgcmVzdWx0LT5TZXRJbnRlcm5hbEZpZWxkKDAsIG1hcF9wdHIpOw0KKw0KKyAgLy8gUmV0dXJuIHRoZSByZXN1bHQgdGhyb3VnaCB0aGUgY3VycmVudCBoYW5kbGUgc2NvcGUuICBTaW5jZSBlYWNoDQorICAvLyBvZiB0aGVzZSBoYW5kbGVzIHdpbGwgZ28gYXdheSB3aGVuIHRoZSBoYW5kbGUgc2NvcGUgaXMgZGVsZXRlZA0KKyAgLy8gd2UgbmVlZCB0byBjYWxsIENsb3NlIHRvIGxldCBvbmUsIHRoZSByZXN1bHQsIGVzY2FwZSBpbnRvIHRoZQ0KKyAgLy8gb3V0ZXIgaGFuZGxlIHNjb3BlLg0KKyAgcmV0dXJuIGhhbmRsZV9zY29wZS5Fc2NhcGUocmVzdWx0KTsNCit9DQorDQorDQorLy8gVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIHRoZSBDKysgbWFwIHBvaW50ZXIgZnJvbSBhIHdyYXBwZXINCisvLyBvYmplY3QuDQorbWFwPHN0cmluZywgc3RyaW5nPiogSnNIdHRwUmVxdWVzdFByb2Nlc3Nvcjo6VW53cmFwTWFwKEhhbmRsZTxPYmplY3Q+IG9iaikgew0KKyAgSGFuZGxlPEV4dGVybmFsPiBmaWVsZCA9IEhhbmRsZTxFeHRlcm5hbD46OkNhc3Qob2JqLT5HZXRJbnRlcm5hbEZpZWxkKDApKTsNCisgIHZvaWQqIHB0ciA9IGZpZWxkLT5WYWx1ZSgpOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PG1hcDxzdHJpbmcsIHN0cmluZz4qPihwdHIpOw0KK30NCisNCisNCisvLyBDb252ZXJ0IGEgSmF2YVNjcmlwdCBzdHJpbmcgdG8gYSBzdGQ6OnN0cmluZy4gIFRvIG5vdCBib3RoZXIgdG9vDQorLy8gbXVjaCB3aXRoIHN0cmluZyBlbmNvZGluZ3Mgd2UganVzdCB1c2UgYXNjaWkuDQorc3RyaW5nIE9iamVjdFRvU3RyaW5nKExvY2FsPFZhbHVlPiB2YWx1ZSkgew0KKyAgU3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZSh2YWx1ZSk7DQorICByZXR1cm4gc3RyaW5nKCp1dGY4X3ZhbHVlKTsNCit9DQorDQorDQordm9pZCBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpNYXBHZXQoTG9jYWw8U3RyaW5nPiBuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5Q2FsbGJhY2tJbmZvPFZhbHVlPiYgaW5mbykgew0KKyAgLy8gRmV0Y2ggdGhlIG1hcCB3cmFwcGVkIGJ5IHRoaXMgb2JqZWN0Lg0KKyAgbWFwPHN0cmluZywgc3RyaW5nPiogb2JqID0gVW53cmFwTWFwKGluZm8uSG9sZGVyKCkpOw0KKw0KKyAgLy8gQ29udmVydCB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gYSBzdGQ6OnN0cmluZy4NCisgIHN0cmluZyBrZXkgPSBPYmplY3RUb1N0cmluZyhuYW1lKTsNCisNCisgIC8vIExvb2sgdXAgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cyB1c2luZyB0aGUgc3RhbmRhcmQgU1RMIGlkZW9tLg0KKyAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IG9iai0+ZmluZChrZXkpOw0KKw0KKyAgLy8gSWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCByZXR1cm4gYW4gZW1wdHkgaGFuZGxlIGFzIHNpZ25hbA0KKyAgaWYgKGl0ZXIgPT0gb2JqLT5lbmQoKSkgcmV0dXJuOw0KKw0KKyAgLy8gT3RoZXJ3aXNlIGZldGNoIHRoZSB2YWx1ZSBhbmQgd3JhcCBpdCBpbiBhIEphdmFTY3JpcHQgc3RyaW5nDQorICBjb25zdCBzdHJpbmcmIHZhbHVlID0gKCppdGVyKS5zZWNvbmQ7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KFN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgaW5mby5HZXRJc29sYXRlKCksIHZhbHVlLmNfc3RyKCksIFN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlLmxlbmd0aCgpKSkpOw0KK30NCisNCisNCit2b2lkIEpzSHR0cFJlcXVlc3RQcm9jZXNzb3I6Ok1hcFNldChMb2NhbDxTdHJpbmc+IG5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWw8VmFsdWU+IHZhbHVlX29iaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eUNhbGxiYWNrSW5mbzxWYWx1ZT4mIGluZm8pIHsNCisgIC8vIEZldGNoIHRoZSBtYXAgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4NCisgIG1hcDxzdHJpbmcsIHN0cmluZz4qIG9iaiA9IFVud3JhcE1hcChpbmZvLkhvbGRlcigpKTsNCisNCisgIC8vIENvbnZlcnQgdGhlIGtleSBhbmQgdmFsdWUgdG8gc3RkOjpzdHJpbmdzLg0KKyAgc3RyaW5nIGtleSA9IE9iamVjdFRvU3RyaW5nKG5hbWUpOw0KKyAgc3RyaW5nIHZhbHVlID0gT2JqZWN0VG9TdHJpbmcodmFsdWVfb2JqKTsNCisNCisgIC8vIFVwZGF0ZSB0aGUgbWFwLg0KKyAgKCpvYmopW2tleV0gPSB2YWx1ZTsNCisNCisgIC8vIFJldHVybiB0aGUgdmFsdWU7IGFueSBub24tZW1wdHkgaGFuZGxlIHdpbGwgd29yay4NCisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodmFsdWVfb2JqKTsNCit9DQorDQorDQorSGFuZGxlPE9iamVjdFRlbXBsYXRlPiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpNYWtlTWFwVGVtcGxhdGUoDQorICAgIElzb2xhdGUqIGlzb2xhdGUpIHsNCisgIEVzY2FwYWJsZUhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsNCisNCisgIExvY2FsPE9iamVjdFRlbXBsYXRlPiByZXN1bHQgPSBPYmplY3RUZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOw0KKyAgcmVzdWx0LT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMSk7DQorICByZXN1bHQtPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKE1hcEdldCwgTWFwU2V0KTsNCisNCisgIC8vIEFnYWluLCByZXR1cm4gdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjdXJyZW50IGhhbmRsZSBzY29wZS4NCisgIHJldHVybiBoYW5kbGVfc2NvcGUuRXNjYXBlKHJlc3VsdCk7DQorfQ0KKw0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyAtLS0gQSBjIGMgZSBzIHMgaSBuIGcgICBSIGUgcSB1IGUgcyB0IHMgLS0tDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8qKg0KKyAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCB3cmFwcyBhIEMrKyBodHRwIHJlcXVlc3Qgb2JqZWN0IGluIGENCisgKiBKYXZhU2NyaXB0IG9iamVjdC4NCisgKi8NCitIYW5kbGU8T2JqZWN0PiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpXcmFwUmVxdWVzdChIdHRwUmVxdWVzdCogcmVxdWVzdCkgew0KKyAgLy8gSGFuZGxlIHNjb3BlIGZvciB0ZW1wb3JhcnkgaGFuZGxlcy4NCisgIEVzY2FwYWJsZUhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOw0KKw0KKyAgLy8gRmV0Y2ggdGhlIHRlbXBsYXRlIGZvciBjcmVhdGluZyBKYXZhU2NyaXB0IGh0dHAgcmVxdWVzdCB3cmFwcGVycy4NCisgIC8vIEl0IG9ubHkgaGFzIHRvIGJlIGNyZWF0ZWQgb25jZSwgd2hpY2ggd2UgZG8gb24gZGVtYW5kLg0KKyAgaWYgKHJlcXVlc3RfdGVtcGxhdGVfLklzRW1wdHkoKSkgew0KKyAgICBIYW5kbGU8T2JqZWN0VGVtcGxhdGU+IHJhd190ZW1wbGF0ZSA9IE1ha2VSZXF1ZXN0VGVtcGxhdGUoR2V0SXNvbGF0ZSgpKTsNCisgICAgcmVxdWVzdF90ZW1wbGF0ZV8uUmVzZXQoR2V0SXNvbGF0ZSgpLCByYXdfdGVtcGxhdGUpOw0KKyAgfQ0KKyAgSGFuZGxlPE9iamVjdFRlbXBsYXRlPiB0ZW1wbCA9DQorICAgICAgTG9jYWw8T2JqZWN0VGVtcGxhdGU+OjpOZXcoR2V0SXNvbGF0ZSgpLCByZXF1ZXN0X3RlbXBsYXRlXyk7DQorDQorICAvLyBDcmVhdGUgYW4gZW1wdHkgaHR0cCByZXF1ZXN0IHdyYXBwZXIuDQorICBMb2NhbDxPYmplY3Q+IHJlc3VsdCA9IHRlbXBsLT5OZXdJbnN0YW5jZSgpOw0KKw0KKyAgLy8gV3JhcCB0aGUgcmF3IEMrKyBwb2ludGVyIGluIGFuIEV4dGVybmFsIHNvIGl0IGNhbiBiZSByZWZlcmVuY2VkDQorICAvLyBmcm9tIHdpdGhpbiBKYXZhU2NyaXB0Lg0KKyAgSGFuZGxlPEV4dGVybmFsPiByZXF1ZXN0X3B0ciA9IEV4dGVybmFsOjpOZXcoR2V0SXNvbGF0ZSgpLCByZXF1ZXN0KTsNCisNCisgIC8vIFN0b3JlIHRoZSByZXF1ZXN0IHBvaW50ZXIgaW4gdGhlIEphdmFTY3JpcHQgd3JhcHBlci4NCisgIHJlc3VsdC0+U2V0SW50ZXJuYWxGaWVsZCgwLCByZXF1ZXN0X3B0cik7DQorDQorICAvLyBSZXR1cm4gdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjdXJyZW50IGhhbmRsZSBzY29wZS4gIFNpbmNlIGVhY2gNCisgIC8vIG9mIHRoZXNlIGhhbmRsZXMgd2lsbCBnbyBhd2F5IHdoZW4gdGhlIGhhbmRsZSBzY29wZSBpcyBkZWxldGVkDQorICAvLyB3ZSBuZWVkIHRvIGNhbGwgQ2xvc2UgdG8gbGV0IG9uZSwgdGhlIHJlc3VsdCwgZXNjYXBlIGludG8gdGhlDQorICAvLyBvdXRlciBoYW5kbGUgc2NvcGUuDQorICByZXR1cm4gaGFuZGxlX3Njb3BlLkVzY2FwZShyZXN1bHQpOw0KK30NCisNCisNCisvKioNCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgZXh0cmFjdHMgdGhlIEMrKyBodHRwIHJlcXVlc3Qgb2JqZWN0IGZyb20gYQ0KKyAqIHdyYXBwZXIgb2JqZWN0Lg0KKyAqLw0KK0h0dHBSZXF1ZXN0KiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpVbndyYXBSZXF1ZXN0KEhhbmRsZTxPYmplY3Q+IG9iaikgew0KKyAgSGFuZGxlPEV4dGVybmFsPiBmaWVsZCA9IEhhbmRsZTxFeHRlcm5hbD46OkNhc3Qob2JqLT5HZXRJbnRlcm5hbEZpZWxkKDApKTsNCisgIHZvaWQqIHB0ciA9IGZpZWxkLT5WYWx1ZSgpOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PEh0dHBSZXF1ZXN0Kj4ocHRyKTsNCit9DQorDQorDQordm9pZCBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpHZXRQYXRoKExvY2FsPFN0cmluZz4gbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydHlDYWxsYmFja0luZm88VmFsdWU+JiBpbmZvKSB7DQorICAvLyBFeHRyYWN0IHRoZSBDKysgcmVxdWVzdCBvYmplY3QgZnJvbSB0aGUgSmF2YVNjcmlwdCB3cmFwcGVyLg0KKyAgSHR0cFJlcXVlc3QqIHJlcXVlc3QgPSBVbndyYXBSZXF1ZXN0KGluZm8uSG9sZGVyKCkpOw0KKw0KKyAgLy8gRmV0Y2ggdGhlIHBhdGguDQorICBjb25zdCBzdHJpbmcmIHBhdGggPSByZXF1ZXN0LT5QYXRoKCk7DQorDQorICAvLyBXcmFwIHRoZSByZXN1bHQgaW4gYSBKYXZhU2NyaXB0IHN0cmluZyBhbmQgcmV0dXJuIGl0Lg0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgIGluZm8uR2V0SXNvbGF0ZSgpLCBwYXRoLmNfc3RyKCksIFN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHBhdGgubGVuZ3RoKCkpKSk7DQorfQ0KKw0KKw0KK3ZvaWQgSnNIdHRwUmVxdWVzdFByb2Nlc3Nvcjo6R2V0UmVmZXJyZXIoDQorICAgIExvY2FsPFN0cmluZz4gbmFtZSwNCisgICAgY29uc3QgUHJvcGVydHlDYWxsYmFja0luZm88VmFsdWU+JiBpbmZvKSB7DQorICBIdHRwUmVxdWVzdCogcmVxdWVzdCA9IFVud3JhcFJlcXVlc3QoaW5mby5Ib2xkZXIoKSk7DQorICBjb25zdCBzdHJpbmcmIHBhdGggPSByZXF1ZXN0LT5SZWZlcnJlcigpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgIGluZm8uR2V0SXNvbGF0ZSgpLCBwYXRoLmNfc3RyKCksIFN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHBhdGgubGVuZ3RoKCkpKSk7DQorfQ0KKw0KKw0KK3ZvaWQgSnNIdHRwUmVxdWVzdFByb2Nlc3Nvcjo6R2V0SG9zdChMb2NhbDxTdHJpbmc+IG5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5Q2FsbGJhY2tJbmZvPFZhbHVlPiYgaW5mbykgew0KKyAgSHR0cFJlcXVlc3QqIHJlcXVlc3QgPSBVbndyYXBSZXF1ZXN0KGluZm8uSG9sZGVyKCkpOw0KKyAgY29uc3Qgc3RyaW5nJiBwYXRoID0gcmVxdWVzdC0+SG9zdCgpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgIGluZm8uR2V0SXNvbGF0ZSgpLCBwYXRoLmNfc3RyKCksIFN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHBhdGgubGVuZ3RoKCkpKSk7DQorfQ0KKw0KKw0KK3ZvaWQgSnNIdHRwUmVxdWVzdFByb2Nlc3Nvcjo6R2V0VXNlckFnZW50KA0KKyAgICBMb2NhbDxTdHJpbmc+IG5hbWUsDQorICAgIGNvbnN0IFByb3BlcnR5Q2FsbGJhY2tJbmZvPFZhbHVlPiYgaW5mbykgew0KKyAgSHR0cFJlcXVlc3QqIHJlcXVlc3QgPSBVbndyYXBSZXF1ZXN0KGluZm8uSG9sZGVyKCkpOw0KKyAgY29uc3Qgc3RyaW5nJiBwYXRoID0gcmVxdWVzdC0+VXNlckFnZW50KCk7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KFN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgaW5mby5HZXRJc29sYXRlKCksIHBhdGguY19zdHIoKSwgU3RyaW5nOjprTm9ybWFsU3RyaW5nLA0KKyAgICAgIHN0YXRpY19jYXN0PGludD4ocGF0aC5sZW5ndGgoKSkpKTsNCit9DQorDQorDQorSGFuZGxlPE9iamVjdFRlbXBsYXRlPiBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yOjpNYWtlUmVxdWVzdFRlbXBsYXRlKA0KKyAgICBJc29sYXRlKiBpc29sYXRlKSB7DQorICBFc2NhcGFibGVIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7DQorDQorICBMb2NhbDxPYmplY3RUZW1wbGF0ZT4gcmVzdWx0ID0gT2JqZWN0VGVtcGxhdGU6Ok5ldyhpc29sYXRlKTsNCisgIHJlc3VsdC0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDEpOw0KKw0KKyAgLy8gQWRkIGFjY2Vzc29ycyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIG9mIHRoZSByZXF1ZXN0Lg0KKyAgcmVzdWx0LT5TZXRBY2Nlc3NvcigNCisgICAgICBTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsICJwYXRoIiwgU3RyaW5nOjprSW50ZXJuYWxpemVkU3RyaW5nKSwNCisgICAgICBHZXRQYXRoKTsNCisgIHJlc3VsdC0+U2V0QWNjZXNzb3IoDQorICAgICAgU3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCAicmVmZXJyZXIiLCBTdHJpbmc6OmtJbnRlcm5hbGl6ZWRTdHJpbmcpLA0KKyAgICAgIEdldFJlZmVycmVyKTsNCisgIHJlc3VsdC0+U2V0QWNjZXNzb3IoDQorICAgICAgU3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCAiaG9zdCIsIFN0cmluZzo6a0ludGVybmFsaXplZFN0cmluZyksDQorICAgICAgR2V0SG9zdCk7DQorICByZXN1bHQtPlNldEFjY2Vzc29yKA0KKyAgICAgIFN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgInVzZXJBZ2VudCIsIFN0cmluZzo6a0ludGVybmFsaXplZFN0cmluZyksDQorICAgICAgR2V0VXNlckFnZW50KTsNCisNCisgIC8vIEFnYWluLCByZXR1cm4gdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjdXJyZW50IGhhbmRsZSBzY29wZS4NCisgIHJldHVybiBoYW5kbGVfc2NvcGUuRXNjYXBlKHJlc3VsdCk7DQorfQ0KKw0KKw0KKy8vIC0tLSBUZXN0IC0tLQ0KKw0KKw0KK3ZvaWQgSHR0cFJlcXVlc3RQcm9jZXNzb3I6OkxvZyhjb25zdCBjaGFyKiBldmVudCkgew0KKyAgcHJpbnRmKCJMb2dnZWQ6ICVzXG4iLCBldmVudCk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIEEgc2ltcGxpZmllZCBodHRwIHJlcXVlc3QuDQorICovDQorY2xhc3MgU3RyaW5nSHR0cFJlcXVlc3QgOiBwdWJsaWMgSHR0cFJlcXVlc3Qgew0KKyBwdWJsaWM6DQorICBTdHJpbmdIdHRwUmVxdWVzdChjb25zdCBzdHJpbmcmIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHJlZmVycmVyLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBob3N0LA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB1c2VyX2FnZW50KTsNCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBQYXRoKCkgeyByZXR1cm4gcGF0aF87IH0NCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBSZWZlcnJlcigpIHsgcmV0dXJuIHJlZmVycmVyXzsgfQ0KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEhvc3QoKSB7IHJldHVybiBob3N0XzsgfQ0KKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIFVzZXJBZ2VudCgpIHsgcmV0dXJuIHVzZXJfYWdlbnRfOyB9DQorIHByaXZhdGU6DQorICBzdHJpbmcgcGF0aF87DQorICBzdHJpbmcgcmVmZXJyZXJfOw0KKyAgc3RyaW5nIGhvc3RfOw0KKyAgc3RyaW5nIHVzZXJfYWdlbnRfOw0KK307DQorDQorDQorU3RyaW5nSHR0cFJlcXVlc3Q6OlN0cmluZ0h0dHBSZXF1ZXN0KGNvbnN0IHN0cmluZyYgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiByZWZlcnJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBob3N0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHVzZXJfYWdlbnQpDQorICAgIDogcGF0aF8ocGF0aCksDQorICAgICAgcmVmZXJyZXJfKHJlZmVycmVyKSwNCisgICAgICBob3N0Xyhob3N0KSwNCisgICAgICB1c2VyX2FnZW50Xyh1c2VyX2FnZW50KSB7IH0NCisNCisNCit2b2lkIFBhcnNlT3B0aW9ucyhpbnQgYXJnYywNCisgICAgICAgICAgICAgICAgICBjaGFyKiBhcmd2W10sDQorICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiYgb3B0aW9ucywNCisgICAgICAgICAgICAgICAgICBzdHJpbmcqIGZpbGUpIHsNCisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgIHN0cmluZyBhcmcgPSBhcmd2W2ldOw0KKyAgICBzaXplX3QgaW5kZXggPSBhcmcuZmluZCgnPScsIDApOw0KKyAgICBpZiAoaW5kZXggPT0gc3RyaW5nOjpucG9zKSB7DQorICAgICAgKmZpbGUgPSBhcmc7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3RyaW5nIGtleSA9IGFyZy5zdWJzdHIoMCwgaW5kZXgpOw0KKyAgICAgIHN0cmluZyB2YWx1ZSA9IGFyZy5zdWJzdHIoaW5kZXgrMSk7DQorICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7DQorICAgIH0NCisgIH0NCit9DQorDQorDQorLy8gUmVhZHMgYSBmaWxlIGludG8gYSB2OCBzdHJpbmcuDQorSGFuZGxlPFN0cmluZz4gUmVhZEZpbGUoSXNvbGF0ZSogaXNvbGF0ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7DQorICBGSUxFKiBmaWxlID0gZm9wZW4obmFtZS5jX3N0cigpLCAicmIiKTsNCisgIGlmIChmaWxlID09IE5VTEwpIHJldHVybiBIYW5kbGU8U3RyaW5nPigpOw0KKw0KKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOw0KKyAgaW50IHNpemUgPSBmdGVsbChmaWxlKTsNCisgIHJld2luZChmaWxlKTsNCisNCisgIGNoYXIqIGNoYXJzID0gbmV3IGNoYXJbc2l6ZSArIDFdOw0KKyAgY2hhcnNbc2l6ZV0gPSAnXDAnOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOykgew0KKyAgICBpbnQgcmVhZCA9IHN0YXRpY19jYXN0PGludD4oZnJlYWQoJmNoYXJzW2ldLCAxLCBzaXplIC0gaSwgZmlsZSkpOw0KKyAgICBpICs9IHJlYWQ7DQorICB9DQorICBmY2xvc2UoZmlsZSk7DQorICBIYW5kbGU8U3RyaW5nPiByZXN1bHQgPQ0KKyAgICAgIFN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgY2hhcnMsIFN0cmluZzo6a05vcm1hbFN0cmluZywgc2l6ZSk7DQorICBkZWxldGVbXSBjaGFyczsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KKw0KK2NvbnN0IGludCBrU2FtcGxlU2l6ZSA9IDY7DQorU3RyaW5nSHR0cFJlcXVlc3Qga1NhbXBsZVJlcXVlc3RzW2tTYW1wbGVTaXplXSA9IHsNCisgIFN0cmluZ0h0dHBSZXF1ZXN0KCIvcHJvY2Vzcy5jYyIsICJsb2NhbGhvc3QiLCAiZ29vZ2xlLmNvbSIsICJmaXJlZm94IiksDQorICBTdHJpbmdIdHRwUmVxdWVzdCgiLyIsICJsb2NhbGhvc3QiLCAiZ29vZ2xlLm5ldCIsICJmaXJlZm94IiksDQorICBTdHJpbmdIdHRwUmVxdWVzdCgiLyIsICJsb2NhbGhvc3QiLCAiZ29vZ2xlLm9yZyIsICJzYWZhcmkiKSwNCisgIFN0cmluZ0h0dHBSZXF1ZXN0KCIvIiwgImxvY2FsaG9zdCIsICJ5YWhvby5jb20iLCAiaWUiKSwNCisgIFN0cmluZ0h0dHBSZXF1ZXN0KCIvIiwgImxvY2FsaG9zdCIsICJ5YWhvby5jb20iLCAic2FmYXJpIiksDQorICBTdHJpbmdIdHRwUmVxdWVzdCgiLyIsICJsb2NhbGhvc3QiLCAieWFob28uY29tIiwgImZpcmVmb3giKQ0KK307DQorDQorDQorYm9vbCBQcm9jZXNzRW50cmllcyhIdHRwUmVxdWVzdFByb2Nlc3NvciogcHJvY2Vzc29yLCBpbnQgY291bnQsDQorICAgICAgICAgICAgICAgICAgICBTdHJpbmdIdHRwUmVxdWVzdCogcmVxcykgew0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIGlmICghcHJvY2Vzc29yLT5Qcm9jZXNzKCZyZXFzW2ldKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorDQordm9pZCBQcmludE1hcChtYXA8c3RyaW5nLCBzdHJpbmc+KiBtKSB7DQorICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGkgPSBtLT5iZWdpbigpOyBpICE9IG0tPmVuZCgpOyBpKyspIHsNCisgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4gZW50cnkgPSAqaTsNCisgICAgcHJpbnRmKCIlczogJXNcbiIsIGVudHJ5LmZpcnN0LmNfc3RyKCksIGVudHJ5LnNlY29uZC5jX3N0cigpKTsNCisgIH0NCit9DQorDQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgew0KKyAgdjg6OlY4OjpJbml0aWFsaXplSUNVKCk7DQorICBtYXA8c3RyaW5nLCBzdHJpbmc+IG9wdGlvbnM7DQorICBzdHJpbmcgZmlsZTsNCisgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCAmZmlsZSk7DQorICBpZiAoZmlsZS5lbXB0eSgpKSB7DQorICAgIGZwcmludGYoc3RkZXJyLCAiTm8gc2NyaXB0IHdhcyBzcGVjaWZpZWQuXG4iKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBJc29sYXRlKiBpc29sYXRlID0gSXNvbGF0ZTo6R2V0Q3VycmVudCgpOw0KKyAgSGFuZGxlU2NvcGUgc2NvcGUoaXNvbGF0ZSk7DQorICBIYW5kbGU8U3RyaW5nPiBzb3VyY2UgPSBSZWFkRmlsZShpc29sYXRlLCBmaWxlKTsNCisgIGlmIChzb3VyY2UuSXNFbXB0eSgpKSB7DQorICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyAnJXMnLlxuIiwgZmlsZS5jX3N0cigpKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBKc0h0dHBSZXF1ZXN0UHJvY2Vzc29yIHByb2Nlc3Nvcihpc29sYXRlLCBzb3VyY2UpOw0KKyAgbWFwPHN0cmluZywgc3RyaW5nPiBvdXRwdXQ7DQorICBpZiAoIXByb2Nlc3Nvci5Jbml0aWFsaXplKCZvcHRpb25zLCAmb3V0cHV0KSkgew0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluaXRpYWxpemluZyBwcm9jZXNzb3IuXG4iKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoIVByb2Nlc3NFbnRyaWVzKCZwcm9jZXNzb3IsIGtTYW1wbGVTaXplLCBrU2FtcGxlUmVxdWVzdHMpKQ0KKyAgICByZXR1cm4gMTsNCisgIFByaW50TWFwKCZvdXRwdXQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmFfdGVzdC9wcm9jZXNzL3NjcmlwdC50eHQgYi94ZmFfdGVzdC9wcm9jZXNzL3NjcmlwdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlYjQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYV90ZXN0L3Byb2Nlc3Mvc2NyaXB0LnR4dApAQCAtMCwwICsxLDIxIEBACitmdW5jdGlvbiBQcm9jZXNzKHJlcXVlc3QpDQorew0KKw0KKy8vdmFyIGMgPSBuZXcgTXlKU09iamVjdCgpOw0KKw0KKy8vdGhpcy5sb2coYy5wcm9wZXJ0eTEpOw0KKw0KK3ZhciBjID0gYXBwLmFjdGl2ZURvY3M7DQorDQorDQoraWYob3B0aW9uc1sicGFyYW0xIl0gIT0gIngiKQ0KK3sNCisJdGhpcy5vdXRwdXRbImhlbGxvIl0gPSAxOw0KKwlsb2cocmVxdWVzdC5ob3N0KTsNCit9DQorZWxzZQ0KK3sNCisJdGhpcy5vdXRwdXRbImhlbGxvIl0gPSAyOw0KKwlsb2cocmVxdWVzdC5ob3N0KTsNCit9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK